pax_global_header00006660000000000000000000000064127777723610014535gustar00rootroot0000000000000052 comment=3af0ecbf83a2688ef04583c32bbbf7fe8166eb72 opensurgsim-0.7.0/000077500000000000000000000000001277777236100141145ustar00rootroot00000000000000opensurgsim-0.7.0/.gitattributes000066400000000000000000000065761277777236100170250ustar00rootroot00000000000000##### Global default ##### ## Any file not listed below will not have EOL characters normalized. ## (Diffing and merging will depend on whether Git thinks the file is really ## text or binary.) * -text ## Alternatively, we could let Git auto-detect text files and normalize EOL, ## by setting: ## * text=auto ##### Source code ##### ## C++ and C source files *.h text diff=cpp *.cc text diff=cpp *.c text diff=cpp ## (Discouraged C++ extensions) *.cpp text diff=cpp *.cxx text diff=cpp *.hh text diff=cpp ## Python scripts *.py text eol=lf diff=python ## Perl scripts/libraries/modules *.perl text eol=lf diff=perl *.pl text eol=lf diff=perl *.pm text eol=lf diff=perl ## Shell scripts *.sh text eol=lf *.bash text eol=lf ## Windows batch scripts *.bat text eol=crlf ## Shader program source *.frag text diff=cpp *.vert text diff=cpp ##### Other file types ##### ## Text files and documentation *.txt text README* text INSTALL* text LICENSE* text NOTICE* text ## Non-text documentation *.html text diff=html *.pdf binary *.rtf binary ## Doxygen documentation configuration files Doxyfile text Doxyfile.in text *.dox text ## Image files *.png binary *.PNG binary *.jpg binary *.JPG binary *.gif binary *.GIF binary *.bmp binary *.BMP binary *.ico binary *.ICO binary *.ppm binary *.pgm binary *.pbm binary *.xpm -text diff -merge ## Vector graphics *.svg -text diff -merge ## Model files *.obj text diff -merge *.mtl text diff -merge *.osg text diff -merge *.osgt text diff -merge *.ply text diff -merge *.stl text diff -merge *.osgb binary *.oct binary *.phi binary *.rgd binary *.tet binary *.tri binary ## CMake files CMakeLists.txt text *.cmake text ## Makefiles Makefile text makefile text GNUmakefile text *.mk text ## Various IDE project files, etc *.sln -text diff merge *.vcxproj -text diff -merge *.vcxproj.filters -text diff -merge *.props -text diff -merge *.pbxproj -text diff -merge ## Resource files and UI design descriptions *.qrc text *.ui text *.rc text ## Diff/patch files *.diff text diff -merge *.patch text diff -merge ## XML and configuration *.xml text *.cfg text ## Self-reference =) .gitignore text .gitattributes text opensurgsim-0.7.0/.gitignore000066400000000000000000000027771277777236100161210ustar00rootroot00000000000000# This file specifies intentionally untracked files that git should ignore. # For details, see documentation, e.g. by running "git help ignore". # # To list the files in your tree that are being ignored (i.e. files which # are not already under version control and match an ignore pattern), run # git ls-files --others -i ##### generic file types ##### ## object files and other build output *.o *.pdb *.so *.a *.dll *.lib *.exe *.pyc ## editor etc. back-up files *~ .*~ *.bak .#* ## archive file formats *.tar *.gz *.bz2 *.zip *.7z ## CMake build directories CMakeFiles ## files left by CMake CMakeCache.txt Makefile cmake_install.cmake ## Visual Studio build directories Debug Release ReleaseUnoptimized Debug-vs20[01][0-9] Release-vs20[01][0-9] ReleaseUnoptimized-vs20[01][0-9] ## files left by Visual Studio *.sdf *.opensdf *.suo *.ncb *.bsc *.pch *.ilk *.idb *.exp *.vcproj.*.user *.vcxproj.user ## Visual Studio solution and project files # (Currently always generated from CMake, so we just ignore them all. # If that changes in the future, this will have to change as well.) *.sln *.vcxproj *.vcxproj.filters ## files left by other development tools ipch VTune My Amplifier XE Results* *.ampl.cfg ## files left around after manually running 'patch' *.rej *.orig ## other files we don't generally care about *.log ##### specific files/paths to ignore ##### ## build directories build/ build-*/ build_*/ ## binaries # (only if building directly inside the tree) /tests/unit_tests /tests/unit_tests.exe *.smproj opensurgsim-0.7.0/CMake/000077500000000000000000000000001277777236100150745ustar00rootroot00000000000000opensurgsim-0.7.0/CMake/DashboardTemplate.cmake000066400000000000000000000110471277777236100214640ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2012-2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. cmake_minimum_required(VERSION 2.8) ############################################################################## # # Copy this script onto the dashboard machine and then customize the variables # OSS_* below. Run the script using the command # # ctest -VV -O -S $treeview $search $mathjax $extrastylesheet
$projectname  $projectnumber
$projectbrief
$projectbrief
$searchbox
opensurgsim-0.7.0/Examples/000077500000000000000000000000001277777236100156725ustar00rootroot00000000000000opensurgsim-0.7.0/Examples/AddSphereFromInput/000077500000000000000000000000001277777236100213755ustar00rootroot00000000000000opensurgsim-0.7.0/Examples/AddSphereFromInput/AddSphereBehavior.cpp000066400000000000000000000044751277777236100254320ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "Examples/AddSphereFromInput/AddSphereBehavior.h" #include "SurgSim/Blocks/SphereElement.h" #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/Framework/SceneElement.h" #include "SurgSim/Framework/Scene.h" #include using SurgSim::Math::RigidTransform3d; AddSphereFromInputBehavior::AddSphereFromInputBehavior( const std::string& name): SurgSim::Framework::Behavior(name), m_numElements(0), m_buttonPreviouslyPressed(false) { } void AddSphereFromInputBehavior::setInputComponent(std::shared_ptr sender) { m_from = sender; } void AddSphereFromInputBehavior::update(double dt) { // Get the pose information from input device // Then use the pose as the location to add sphere SurgSim::DataStructures::DataGroup dataGroup; m_from->getData(&dataGroup); RigidTransform3d pose; dataGroup.poses().get(SurgSim::DataStructures::Names::POSE, &pose); // Add sphere to the scene from input bool button1 = false; dataGroup.booleans().get(SurgSim::DataStructures::Names::BUTTON_1, &button1); if (button1 && ! m_buttonPreviouslyPressed) { std::stringstream elementCount; elementCount << ++ m_numElements; std::string name = "sphereId_" + elementCount.str(); std::shared_ptr element = std::make_shared(name); element->setPose(pose); getScene()->addSceneElement(element); } m_buttonPreviouslyPressed = button1; } int AddSphereFromInputBehavior::getTargetManagerType() const { return SurgSim::Framework::MANAGER_TYPE_INPUT; } bool AddSphereFromInputBehavior::doInitialize() { return true; } bool AddSphereFromInputBehavior::doWakeUp() { return true; } opensurgsim-0.7.0/Examples/AddSphereFromInput/AddSphereBehavior.h000066400000000000000000000035741277777236100250760ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef EXAMPLES_ADDSPHEREFROMINPUT_ADDSPHEREBEHAVIOR_H #define EXAMPLES_ADDSPHEREFROMINPUT_ADDSPHEREBEHAVIOR_H #include "SurgSim/Framework/Behavior.h" #include "SurgSim/Input/InputComponent.h" class AddSphereFromInputBehavior: public SurgSim::Framework::Behavior { public: /// Constructor /// \param name Name of the behavior explicit AddSphereFromInputBehavior(const std::string& name); /// Set input component to get the pose /// \param sender Input component to get the pose void setInputComponent(std::shared_ptr sender); /// Update the behavior /// \param dt The length of time (seconds) between update calls. void update(double dt) override; /// Return the type of manager that should be responsible for this behavior int getTargetManagerType() const override; protected: /// Initialize the behavior bool doInitialize() override; /// Wakeup the behavior bool doWakeUp() override; private: /// Input component to get the pose std::shared_ptr m_from; /// Used to record the number of spheres added int m_numElements; /// Used to record if button was previously pressed bool m_buttonPreviouslyPressed; }; #endif // EXAMPLES_ADDSPHEREFROMINPUT_ADDSPHEREBEHAVIOR_H opensurgsim-0.7.0/Examples/AddSphereFromInput/AddSphereFromInput.cpp000066400000000000000000000145041277777236100256100ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include "Examples/AddSphereFromInput/AddSphereBehavior.h" #include "SurgSim/Blocks/DriveElementFromInputBehavior.h" #include "SurgSim/Devices/MultiAxis/MultiAxisDevice.h" #include "SurgSim/Framework/Framework.h" #include "SurgSim/Graphics/Graphics.h" #include "SurgSim/Input/InputManager.h" #include "SurgSim/Math/Math.h" #include "SurgSim/Physics/Physics.h" using SurgSim::Blocks::DriveElementFromInputBehavior; using SurgSim::Framework::BasicSceneElement; using SurgSim::Framework::Logger; using SurgSim::Framework::SceneElement; using SurgSim::Graphics::OsgBoxRepresentation; using SurgSim::Graphics::OsgCamera; using SurgSim::Graphics::OsgMaterial; using SurgSim::Graphics::OsgPlaneRepresentation; using SurgSim::Graphics::OsgProgram; using SurgSim::Graphics::OsgUniform; using SurgSim::Graphics::OsgViewElement; using SurgSim::Graphics::ViewElement; using SurgSim::Math::BoxShape; using SurgSim::Math::DoubleSidedPlaneShape; using SurgSim::Math::Quaterniond; using SurgSim::Math::Vector3d; using SurgSim::Math::Vector4f; using SurgSim::Math::makeRigidTransform; using SurgSim::Physics::FixedRepresentation; using SurgSim::Physics::PhysicsManager; using SurgSim::Physics::Representation; std::shared_ptr createPlane(const std::string& name) { std::shared_ptr planeShape = std::make_shared(); std::shared_ptr physicsRepresentation = std::make_shared(name + " Physics"); physicsRepresentation->setShape(planeShape); std::shared_ptr graphicsRepresentation = std::make_shared(name + " Graphics"); std::shared_ptr material = std::make_shared("material"); std::shared_ptr program = std::make_shared(); std::shared_ptr> uniform = std::make_shared>("color"); uniform->set(Vector4f(0.0f, 0.6f, 1.0f, 0.0f)); material->addUniform(uniform); program->setFragmentShaderSource( "uniform vec4 color;\n" "void main(void)\n" "{\n" " gl_FragColor = color;\n" "}"); material->setProgram(program); graphicsRepresentation->setMaterial(material); std::shared_ptr planeElement = std::make_shared(name); planeElement->addComponent(physicsRepresentation); planeElement->addComponent(graphicsRepresentation); planeElement->addComponent(material); auto rigidCollision = std::make_shared("Plane Collision"); physicsRepresentation->setCollisionRepresentation(rigidCollision); planeElement->addComponent(rigidCollision); return planeElement; } std::shared_ptr createBox(const std::string& name) { std::shared_ptr box = std::make_shared(0.2, 0.2, 0.2); // in m std::shared_ptr graphicsRepresentation = std::make_shared(name + "-Graphics"); graphicsRepresentation->setSizeXYZ(box->getSizeX(), box->getSizeY(), box->getSizeZ()); std::shared_ptr inputComponent = std::make_shared("input"); inputComponent->setDeviceName("MultiAxisDevice"); std::shared_ptr boxElement = std::make_shared(name); boxElement->addComponent(graphicsRepresentation); boxElement->addComponent(inputComponent); std::shared_ptr driver; driver = std::make_shared("Driver"); driver->setSource(inputComponent); boxElement->addComponent(driver); auto addSphere = std::make_shared("SphereAdder"); addSphere->setInputComponent(inputComponent); boxElement->addComponent(addSphere); return boxElement; } int main(int argc, char* argv[]) { std::shared_ptr graphicsManager = std::make_shared(); std::shared_ptr physicsManager = std::make_shared(); std::shared_ptr behaviorManager = std::make_shared(); std::shared_ptr inputManager = std::make_shared(); //////////////////////////////////////////////////////////////////////////////////////////////////////////////// std::shared_ptr toolDevice = std::make_shared("MultiAxisDevice"); toolDevice->setPositionScale(toolDevice->getPositionScale() * 10.0); toolDevice->setOrientationScale(toolDevice->getOrientationScale() * 3.0); SURGSIM_ASSERT(toolDevice->initialize() == true) << "Could not initialize device '" << toolDevice->getName() << "' for the tool."; inputManager->addDevice(toolDevice); //////////////////////////////////////////////////////////////////////////////////////////////////////////////// std::shared_ptr runtime(new SurgSim::Framework::Runtime()); runtime->addManager(physicsManager); runtime->addManager(graphicsManager); runtime->addManager(behaviorManager); runtime->addManager(inputManager); std::shared_ptr scene = runtime->getScene(); scene->addSceneElement(createBox("box")); std::shared_ptr plane = createPlane("plane"); plane->setPose(makeRigidTransform(Quaterniond::Identity(), Vector3d(0.0, -1.0, 0.0))); scene->addSceneElement(plane); std::shared_ptr viewElement = std::make_shared("view"); viewElement->setPose(makeRigidTransform(Quaterniond::Identity(), Vector3d(0.0, 0.5, 5.0))); scene->addSceneElement(viewElement); runtime->execute(); return 0; } opensurgsim-0.7.0/Examples/AddSphereFromInput/CMakeLists.txt000066400000000000000000000024641277777236100241430ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. find_package(OpenSceneGraph COMPONENTS osg osgViewer osgText osgUtil osgDB osgGA osgAnimation REQUIRED) find_package(OpenThreads) link_directories( ${Boost_LIBRARY_DIRS} ) include_directories( ${CMAKE_CURRENT_SOURCE_DIR} ${OPENTHREADS_INCLUDE_DIR} ) set(SOURCES AddSphereBehavior.cpp AddSphereFromInput.cpp ) set(HEADERS AddSphereBehavior.h ) surgsim_add_executable(AddSphereFromInput "${SOURCES}" "${HEADERS}") set(LIBS MultiAxisDevice SurgSimBlocks SurgSimGraphics SurgSimMath ${YAML_CPP_LIBRARIES} ) target_link_libraries(AddSphereFromInput ${LIBS}) # Put AddSphereFromInput into folder "Examples" set_target_properties(AddSphereFromInput PROPERTIES FOLDER "Examples") opensurgsim-0.7.0/Examples/CMakeLists.txt000066400000000000000000000021101277777236100204240ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. if(BUILD_DEVICE_MULTIAXIS) add_subdirectory(AddSphereFromInput) add_subdirectory(Stapling) endif(BUILD_DEVICE_MULTIAXIS) add_subdirectory(InputVtc) add_subdirectory(DroppingBalls) # Not Required components find_package(Boost 1.54 COMPONENTS program_options) if(Boost_PROGRAM_OPTIONS_FOUND) add_subdirectory(ShowScenery) add_subdirectory(GraphicsScene) else() message("Can't build example ShowScenery, missing library boost_program_options.") endif() opensurgsim-0.7.0/Examples/DroppingBalls/000077500000000000000000000000001277777236100204325ustar00rootroot00000000000000opensurgsim-0.7.0/Examples/DroppingBalls/AddRandomSphereBehavior.cpp000066400000000000000000000050711277777236100256210ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include #include "Examples/DroppingBalls/AddRandomSphereBehavior.h" #include "SurgSim/Framework/Behavior.h" #include "SurgSim/Framework/Scene.h" #include "SurgSim/Framework/SceneElement.h" #include "SurgSim/Blocks/SphereElement.h" #include "SurgSim/Math/Vector.h" using SurgSim::Blocks::SphereElement; using SurgSim::Framework::Behavior; using SurgSim::Framework::SceneElement; using SurgSim::Math::Vector3d; /// \file /// A Behavior that creates randomly positioned SphereElements at a fixed rate. /// \sa SurgSim::Blocks::SphereElement namespace SurgSim { namespace Blocks { AddRandomSphereBehavior::AddRandomSphereBehavior(const std::string& name): Behavior(name), m_totalTime(0.0), m_numElements(0), m_distribution_xz(0.0, 1.0), m_distribution_y(1.0, 2.0) { } AddRandomSphereBehavior::~AddRandomSphereBehavior() { } bool AddRandomSphereBehavior::doInitialize() { return true; } bool AddRandomSphereBehavior::doWakeUp() { return true; } void AddRandomSphereBehavior::update(double dt) { // Accumulate the time steps since the previous sphere was created. m_totalTime += dt; if (m_totalTime > 3.0) { m_totalTime = 0.0; std::stringstream ss; ss << ++ m_numElements; // Generate a random position. double m_x = m_distribution_xz(m_generator); double m_y = m_distribution_y(m_generator); double m_z = m_distribution_xz(m_generator); std::string name = "sphereId_" + ss.str(); // Create the pose, with no rotation and the previously determined position. SurgSim::Math::RigidTransform3d pose = SurgSim::Math::makeRigidTransform (SurgSim::Math::Quaterniond::Identity(), Vector3d(m_x, m_y, m_z)); // Create the SphereElement. std::shared_ptr element = std::make_shared(name); element->setPose(pose); // Add the SphereElement to the Scene. getScene()->addSceneElement(element); } } }; // namespace Blocks }; // namespace SurgSim opensurgsim-0.7.0/Examples/DroppingBalls/AddRandomSphereBehavior.h000066400000000000000000000041241277777236100252640ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef EXAMPLES_DROPPINGBALLS_ADDRANDOMSPHEREBEHAVIOR_H #define EXAMPLES_DROPPINGBALLS_ADDRANDOMSPHEREBEHAVIOR_H #include #include "SurgSim/Framework/Behavior.h" namespace SurgSim { namespace Blocks { /// A behavior to add sphere elements into scene dynamically. /// AddSphereBehavior will be processed by BehaviorManager in its update() call. class AddRandomSphereBehavior: public SurgSim::Framework::Behavior { public: /// Constructor /// \param name The name of add random sphere behavior. explicit AddRandomSphereBehavior(const std::string& name = "AddRandomSphereBehavior"); /// Destructor ~AddRandomSphereBehavior(); /// Update the behavior /// \param dt The length of time (seconds) between update calls. void update(double dt) override; protected: /// Initialize the behavior bool doInitialize() override; /// Wakeup the behavior bool doWakeUp() override; private: /// Control how often a sphere is added double m_totalTime; /// Record how many sphere have been added int m_numElements; /// Random number generator for randomized positions. std::default_random_engine m_generator; /// Distribution of random numbers for the x and z coordinates. std::uniform_real_distribution m_distribution_xz; /// Distribution of random numbers for the y coordinate. std::uniform_real_distribution m_distribution_y; }; }; // namespace Blocks }; // namespace SurgSim #endif //EXAMPLES_DROPPINGBALLS_ADDRANDOMSPHEREBEHAVIOR_H opensurgsim-0.7.0/Examples/DroppingBalls/CMakeLists.txt000066400000000000000000000026111277777236100231720ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. link_directories( ${Boost_LIBRARY_DIRS} ) include_directories( ${CMAKE_CURRENT_SOURCE_DIR} ${OPENTHREADS_INCLUDE_DIR} ) set(SOURCES AddRandomSphereBehavior.cpp DroppingBalls.cpp ) set(HEADERS AddRandomSphereBehavior.h ) file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/Data DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) # Configure the path for the data files configure_file( "${CMAKE_CURRENT_SOURCE_DIR}/config.txt.in" "${CMAKE_CURRENT_BINARY_DIR}/config.txt" ) surgsim_add_executable(DroppingBalls "${SOURCES}" "${HEADERS}") SET(LIBS SurgSimBlocks SurgSimPhysics SurgSimGraphics SurgSimMath ${YAML_CPP_LIBRARIES} ) target_link_libraries(DroppingBalls ${LIBS}) # Put DroppingBalls into folder "Examples" set_target_properties(DroppingBalls PROPERTIES FOLDER "Examples") opensurgsim-0.7.0/Examples/DroppingBalls/Data/000077500000000000000000000000001277777236100213035ustar00rootroot00000000000000opensurgsim-0.7.0/Examples/DroppingBalls/Data/Earth.png000066400000000000000000027341231277777236100230700ustar00rootroot00000000000000‰PNG  IHDR“¯‰îsRGB®Îé pHYs™Ê™Ê㑤"tIMEÝ/öϺè IDATxÚt½[¶$IŽ$&5ª!gÿ‡á'—Å™®pS? €ªç «ÏéîÊŒ¸×ÝL€@ü¿þïÿ‚èÿW’@@ HAAõï@€) b!™Ì €"2X•E‘ˆ@F€•D&•ðŸ 0üi”€àD*Èþ˜B  Ñÿ½>3@ÂD€‰$ÞDŠQ_…þæX¡þ§„@ $)‘¤¨P2!Q¤"I¤¿V?MEQ~Àõ$JBR„ HIõS­ï-îú´ìIPB*!H°_O=N ëÝ*ë÷‘~gìïF`RÉRÊý‚üIù‡û©KþT"Ézn‚j¤?¨ßŽU¿€útµ´"Bbl ýÝêIÕç xù=תHù ‹õç$¡zˆÁP=[ôÃõ² "‰¨³"Uß̹¾¸ Þý€BA¿PHImB$nQ`€ýEå_¨ZjµrúCôãP/aPß¡~©ÿ…€×9 d}$A)Õ†­7(!Éþ‰³sHopõK­­±q-¡þAþsþ‹ç- }HµY1_*ÉZò¡ÚɵCÙ§Ž)õQ3»ð¬î:Q Yçô’ ˆ¢Ä¬¯F²Î‚”_ P+½ý¤²>OÖSýâ$g1ú"káÍgP½`©N©ì¯µ ‰Œú]©„²—výÝ…@ç ò© ØPÖ·&£ÞuB}ÖõwaÂÛuŽ”ZÄu¬áELHa{±ûQ²ø, Ô/ÃüôZªý'ÕG®MÔm"QÈ:ˆð!Ðߎ ;þýO¯‰^µ„ÔëÛûG’— ú”®÷â{ ³ŸR³AüízÅžŸÏŸO0?±6Ýœ"}ùXó&Ê~ø×f¨\ož@¤w¡æ¥÷Oãõ­¯qíiJõ~¯T;¡<Ö¦ÿÉ98Y§¹ e&yßu>‰Þ¶×“˜ƒ\H"È%·çx?//šszy£ 諼N¸ùŽ$§ è#Л$™"C³û;û\¥8÷û¤V) °0HýlQ³+ê°A&%"ü§%1’!€Jè^8Yweˆ"22±‰\b RH c1‚3áú ³Í@߈ìí—·¦$*@fß_„µˆÙt>QŨ]kÔŸ Š Œºî‘)õ%½C7”õ_Eú©B"…ÐTõ¼]ÿ‘UíùØ­Z& fÖ'é·Çëôî{À—ÜO ªÚgU¨7Wï0új¨ ¢jÎÚuŒøÇ©ò¿=m$QÅ@Ff]±} ÷ ‰¾¢Aï’zµb}j&¡…:!çäq…’ðf o|’23Õ׌¨”—Úã¬úÑ×.¾aëeÔÕÎð{®Ú¨™ëëÖ•Ök‹] "žûÌûçãñK€ P©^’7$eoÃ~¥¤€¬²•§XòŸÃ Y«´ dåTk®Þ«IRu0Èõ×Ù½àù±³s~¯.\Ã]m Ĉ:ªœu×÷¢+ܺ6ü½±ë×ÔwfúβÏàb¶£úpîÒ¢Fá® ë™bTýñêʯ§-ßä],ùÓH×÷%®Íã/ï3My=˜ºÿXçºÃ€¿‰w zŸùïr§ïö¿Êaÿ.AdðÜž>sûÃéœ<7œür}uø³žùãòúÇ%ç•ËYÀu'e·9q]æ?OhV¾û÷:߸‹®¨³Üçë Õz[j–{ />]Ýä9üp1õm_ýÒÏ¿ëeÈß’Àµ6Où3!ú‡ÖWN »õ­:\Ý{ùSÍbÅtý©ªÃÌ.¤j;¯íW'–—D× ¼¾ðϨkÚ«¿ÇïÿêÒþª†~*²~ºóòé+§ºÈÞ2òýŽîzí_ç¬\vvÒoÜ;n^ïó,ûsÈG,ª–¢ß¡8åh}ìj,ç”ýHò´¾[q¯ÔÙBßø’oÇZ³½Ã³{‘.£®ºR˜Öi^w?»s|þÜ:5 «nûýUê$Ç GÓÜ÷ƒê'T•Ô)\ÿþ£yñ}¼ÜË¢?-ÿqeñ|+t qý`û"¸öâÏO©ïÖ›7ºíÐýdæÇ¬)‘“Âõ; ÙꟕóÁÙÇÉéK»Pßk ›ºÝ…[&HNÉU«~ç 4zæŒî¥{#ôú¹;¡ÞW¡®ÙËèàxµTªÞ C Qn~²A œr ì#Å%Cfa®nA\(_ªyZÔ®Ôê¿æ¹ã§«ù¹+§ðrëÚ§T€žW}€i~ëXð\ôü§Òt÷59=åœõ<å(=ì÷A\Ó¼»¹¯/å—wOOA£¼HIôD¨&JºÛ+¤÷B*ÝÅÐ<’õýÕ{DlÄI=¾{º‹ ^%4¯Q¤a37_ì7ƒßëå*lëû&m¼ûú£§Pâ魡ߢß?§Ï:ëƒ×ƒ¿û/ƒPªÓçu´…¥˜Œ?¿W6Ï”cjÞ’¯~¬Ýß!}÷„¯ª:×oרµûé˃Zòjò¼ÕâË^ˆçéô»Žg_h‡8PH±–¬;'&‘4ˆV0¿WR}îÔ áž~PAÜÈΙ:ÌÍÕÇ‹þˆ³·ª£µ±e_Ѭ„A3NŸ­Ù®Œ.Ú5ƒZŒ{0Ópþ]öt\S!‘ XØg ¢Yswµs qÁ1(¬Ÿ¦FÌÛôËþG¯{ÑêE¸½žD-J™3ï;S5¿Ú®$cÊtW+^%§Šm÷è™=ºfN}(ŠºêrC?³æùFý£«:….lâ :˜z#))ã\-””Êþ0î¼\_a @öÈXQÓ˜KÀþ)›UœiIh¿Þ§[ž^+â‰E78È]“‚¤<¢ññÏi7îï5'ÿ¬ &$åV½%¯ÄûéŸÛtàš¬ ‰Ÿ¿;‰S Õª¬—˜=Â8}Ñi+Ý7߇sŸÃçT wAÿ$×YAÔÆ–Z=ÒËim‹™’uyf´u™¥ï6Ï¡»u#ë XeVhïÛ-¥Làüíd è:k¥'¤\Ä 0üv×QODuÏDHa¨l&Ó/‹7vd.]kuW¼ŠoFA)RJžP ˆá•Áé~7wt³­®cDp]T%ô’ƒdúBÉ„2SJŠ‹Qö¾â Þ_uZîϰ3hxõœaý4%OóT|*£ú¸í6€ðÜ/ðü¾Ý»vqéñ8?Ðè?EÀ©¾fªÔÝêÅb¸%X“ Ñ\2\CÏÉÚC9rh7¦UÿÒhfWõ¦0é®Ç  WçzÆ…Ä_³Š¾eUÍdך&nøq¢ÃŇ8õ\5mé¯áYgu¾u¿\ƒ1ߟ¤ÔnÓau A¢Ê„s(MùfèeVxßrÕÆ ÎKlÚ]Ñ·ú¡Š¸ºçc¸gdsIx…¥”‚Ñ5‡YgöuêW¢Èƒ1_Ñ?4"|ì›Õ°N5S‹#ü“35|¹Þ¦3ŒêJz®&y¸àÅËë8ahúÈ^ñ7ˆ/˜ÔÈ™Òtß3þ=g2ߥâlÀ˜îÅL±ÙRÀϤ¾Eô”x u­îÎé*f™:ÝÔàÔ=væô#Í ›iÄ`x³ÊÎYsCæ:ŠnûÙgöSÄRwÕG¯ô©SCÕš[C,ŽÝ ’gú_wŠƒ«âï½(þÖ§œ>¯Ç³”к@]F6ðÞ—@wPùoÀå®&û`6 Ø}ÐáO40KÒt^û½ŽivKjjÓÜ; Ÿª%A0•3¢f®FžÜz7fmÃ^?cÛ{òwážþ™>\˜,,Â[ªçg=þ«ò‰C¢3¡Ä”÷ƒy¦+n°§KpÕjع‡hWe@B@®ión–T/ú„ Æ©T¾DA4o¨jƒî®™IS é°$&.G¢é26”‡FSEhŸE€iz­z˜¢¡†‹BðŒ"1mçnÙ™Øñ ]1Ÿ9ª³­¹oš¦ðn€¯+g®sÕuqÅ}Í«nÕþ•Áæá5„Ñû?Í'žƒvy8)Fë‹iÄß™9Ù¬S€Àöô³®ì*Ûò*ã‘Ræ6ÏT‘I¤Ë‹ÑÝ«o½` õ6çÅÑéÍPEbí©f2܃9¾7àùûf?É:£³ÆÒqS—›˜z3H^‰«ÓsTÖ¼ƒ`¦Šláêå:™‹\$¨¬ÒÚ§²+,ºñÆŒº€ó«6Pwr¦†¯¢C*ÊQ$”u2½iæcA-ëŠuÒ€—†à€E®ˆÅhVL[ ÊåA;¢OC¹œ©ï”5é¬î–f”**žº­ëû[D¸RðÝo Šê'FWÆ"húsà(¥W™RÕ+¸–‹ÚE£è¡;³ðøXh‡”¢ôd‘`Î\ßGgœ5ªªà†¢_¨cõ©O z(õq‡j”Ò°*i#ê ú„Ë‹®/i†Åyèª.¦¥Mо™SÚ6˾^CÏt%OoðéÊÔܶSë”.ð_ÕZö4£Yã5ÌÐÅ•'‘]…6 WXKDaÉŒÓ4ñ†S§FàñégÑg©O¶»ðžÎA缽ᬪƒ»ÉÐÜô‚ü°&æÈ›éÆ›4$xìnÂnžb_3IªÇ’Û•Çs¾´Šcn8GðXŒõ‰Î¸HºfŠ Ü»l«CŸä2õhÏÜiÚ¨ê‘Sï@ þ„ƒƒù½—¢©þž±W˜a&Yû™ŠÔL ;rU¹W÷)È]À±õQ— §žžªÁP¦Õ3Ö§\M¼ò”ëÆÂ¥Ó8µù…ý°J‹\Ò½&ŠÛäf£‡ýÿà,vu±#ps§®Ù¼z6suAMlRvóŽÀMݨþi x®Ø–›ÍÖîï 2¢$U®&Õ]Ü}zä¢_Fgq¹ž#òܰmxÞëOÁSK]ÓK†PÔÿågö<|£ú§«ç—¾³,ŒÃÞuØÔú:csèåå$×¹ 2º(ê÷Þ(]Õ—X ;sÏ4WäÅhž*M¢e8][Š0[ö»+>Í|¦9:neÙB˜^ÞîõZWÈ VÒE8™%IÊÔ [QPNÈÜ4'Hj3áRªÀ»¬!À9´ZíÔ‹§”1Ë#½ "‚~ƒÞ·Ñó|´ô Ëí?ÚKºïžþ!¬![ùfC|Â/Dœáð`8ØMôZ÷aD"·23X±b x<¡‰KѨT¦×zØÆITÕtÕ¼&3k)í¨)¢ªµj æ»~(Y´â›ùª3*ðs¬™­Qú®=]†FQÛÉQ>´  çò5 Ðì«þ}—AE'O`#®$‡«ÞÝ"§³F6'Ç}}«Yoüi™ ú{1ÞׯZµ9=#h í¬ªå’|ªaŸŽŸs-6[¯Êû´Ç…ÙäOßA’*™LWnͬ"ÁØ©VñÖP)ÒƒzÒáŽÂ¸Ît_Í3ÕƒVŸ¸³$Àdyø•‘YMÌ"ùÔ@¤ÙïušæP`ž"žø³"<~ˆEm©îQeÁÌЂ$™®Ó¢Ãd÷éºmX?H(Á}³†A»iU„ qqiõu‹§ͳcë”/BTiUô¤¯NÞdðaµH âA€ë¾Ò®Ça®K ëÊÄW°æ˜½\ 2*JA.ÿT-ÞêØÀîó¸UZ$!°x1L¿Ð˜Ó`&ƒõIRhíf3ž†C ÒPxjæ€æšJ`Ñ\qûˆ¼¨X‰ÃÕÚCu¿1(4C$ÒRÖÎܧî-‘„V_Æ™=9L«ÂH¤”nMÝrTYºLò¸±/áHÁœ¦åSf`¾.–R94BoG3R¬=ݪ”ÓÚ¦ßÅvÇ%É«ã¯'ClÅœa¤&ºÄÙ_"§-ëo”¦]úíÿ¨ÁI¥Èaù3UÒÆ®¹SQÍM ™9‰1Ã8Û±A/).PS[½Bˆk딲Öáò{ô§ Pµ•P„ BL‰Tt¸!zrWÛ"Žú›3WØÚŽÿîÛRÆ#eÙá°{„Nš†ŸM"Sc¥üQ~“døÅó –ŒeºYâfùTó~ôr­?åÚùšÕð¯°Á.W ÚõºKµn°VÇBº Ócx"bÆ.¿þSÙC”*!¹ 40‚™= ä-ýh¥zÀ(~4E&‚õ« !·Õ1_=vÍ%PÚ­ß«>lQƒ‚ù±× /23uúI‹å¡AIÚjÖ^5³õ¶BôøŒýeup”!¯5Ÿa¨Åšb`„iÑ£F†€m>("…$¶H¥QKF„iµ#²ùãè_rÈ C\¬x®º››ui`ãp–ÔÎi™ ‘RÈ¥çt×ô©¤IöðÉû€’2µm"dväû½–|¢y#ìOQçdLÇ^Pg©<¤ÄªšØl[íÔ®R;¹f¦!©§²þ“)hBËQuzãVhÔý:R—GE® X§º†w‘bçv¬ÍVTnÍ©®£ÂžŸ+ëšb6Ô´¬Ý›ÚŠa'\Àc!}_o¿–-Ýo—ÆdËë# §›ù’É™ãŠq]C#¨+ݱ™–Ýßê?sÍ7™c¡gù|Ö`gne6• ×Vº'¨‘Œ(L¾›Îp6ÿ]øþi ff uÔË# _iuåŽåˆÏƒ¨•X N„i¬ŽŽ. ZŒHáûî÷PÖVõNk)VKÄ¥¦¶ZW(¨ïη.á½ATÓ+%” { A­º"!_?:®˜³xäX—ôn°•«nî¬óøš¾õý4#›z¸)ì¬IB}6dî”±†€ÍfûB{g«†ôÜ…gÊS¸¤2²G÷º½ðBÊ­B$ CÕ4£ÅÔE4¸v“4oœeΡ¶S‚/ŽîZÒg_ö«WºùÄaÒA“.9“Ô3Ì#£‘t­n¦´…]^O ¨L)ÜZÜZXï õ=ƒ·Pj8+žÔ¤©£[ åò?Üßéõ/è•ÆYgý’yæÂÒHÏËp‘XάVäÁÒN½é£ì® ÁÍ~,r0ì´ô|ßþyit¦T‡#4?‡£E™v7º¶Ì…Œ23ËNCÙeú>é2¡¾q5®m¡… ˜±Ú¸¡ñ·~ üH dKÙÅ+¢ŒÏÂA¢!§÷{¤ÀmZž-Á˵æH‹Xдs¨„ƒ8þKä)ÆûC7é)Ë5ÄÂù˰™ú£fÌžqey2°Á* "V„üÌ¡ZAÅW6Äj¦.Ó9 áé¾{˜sq¥m´Õ‹n—¼+«Ë›&˜¬!7û¼øý­QéQ:ÙÕm ‡Â¸O³ÑO]}륄œÚsdql0¦‰K›ó£ØV HÊâpª¨_ÔãåÙ/SײoULóî˜ÂVîÄf½`Z‹ÔâÑó¨èÍw9ö…G»S$žXcP‘óg +[û&mÙ)ë&[‘YlÖVÍ /(ªHkÊÌ ¸ ›,ÝTøút零ʶ. Ò_؇=±º¿”ÿ3©ÙGÔã’œ- ÍîDI¬ºùRÉDPZ¹ÈzÌ;õ­¯ÚR›ö!(a(ªß“銻ºXRÝÝ,$(%l€›H0ó|ß1\?Œæx{xº¥»ñ@£Ït¯r(ÉlLÅ¡öÎÂ(äjÁr½Ü]ˆe#ÈEH^4 m ŠU'qÕ¢iwq‰§E´f-13YŒŒª+ÇÏÚXGDœeØ|h_"èh|ŽÙX P– i+u–³äeX#”Ìó×ÉÑ÷ׄY%ÑΆΠ„êÁ’pU°E§îÒ„]JWi:× -<ÀñmŒ™}\Œæ‡»3¯Z%f†Q`Äxk4SdÊæQ Ž{Sxþ<€7“¹ß̬´B6 ºœÈTL#ñØí¦×V F‘U8‘-3š!uñïE"V]^¤ÜaïK·æ ‰LŒ¼ÍÅÀ€ƒ` b,.õ"ÞíÓ$ªêW~+® Ý LÙMì¡åf¿ï«ÄjG¹êbÔû=ÑAšªÞÖ.»Þ¬cB©ÚT1•ñÓO2éÉÓVÛ –{š'šl‡Æ-å«Ì(*S kaÝi”Ûs@Z¥¢‡…cäHiñȸg~”…q+Y½ê§5î›=Õœ“r«)û¦‚H$hkÒmL›Æ,<¿jK[CÓäE î‘­°ÑÆ£“]ä±ôÀ¸Š±4èut¦Rò`§õtîGˆ<þ¡M4òø~^ -ÑþÁjÝa¡î ë69Jݽ]ðUbä‘ÕŽËz‹»‡ Íñ•TóíK7eëéµQÛÝ»¼à³’À”^VA,?&DPÌDÖXIà°e-©"·Í€ëLP{Ò†-àÑÊ®[¨W ÓÈѾ$@"‹ ÑèW¡á–ñØ.uºD2Å€,Ô‚¹VG/7íwOÐn‡Ã'‚s ,ô‹‹@uÏà"«&÷ȹZ¶mÖo;QsÓÌ"ªååŠê…4Ýq¬¶8^›+º8¹ˆƒ—Ž·]À€äZk†‘W¨¤h._—äKÈyBrÚH"óÒcU)ˆ@Š»…ë2å§ÈcG­S©‡§:y;lG»±þº±åáC\hö|Ó9GSt/‰1>n;h7œ14¹þQèìØN¿Wjñ.×¼”"â\:UÎÌ®À9¾FöÄÀ ’V¿$fý¹_gUÓ^ö„mN+\®`ë& ý3ªŽuy¸SÔŽèᓊnÔ…Ý"ã,æƒÙüC‡:­ð‘W½ö eæ w1𛣼96YÃù‹A®D¾[™?Œ;[Ú¥OÖ¥œQ ]ÙQ.5Ã<ºaV4œ IDATé‘coªš…zŽŠ>;eiúgšC-`ç«nf“6ÏCŽÁ„̽Ëpo4&]•§s#F»w&¸“¬r5MEG<36£¥ëÒ¡ûÒ#!Æñ˶Ë ß„’è‘;ÿá «pUiÿ"^1ÅxÁq®ÌVûg+ 4«ö8Þžyú°øT?ÆË6fÊ™ÈÕ©eyžæVp™®Ö°±ñ¶“ñ§Bßwm{ÚjÛª‚AÐäöñÝõlSŠ:÷³J—2I\}mw²*›M;´¥1zI!°.ÞC+§ëYmS"†_háÊåÆÝ¡8Òµš‘ƒnNs×PÝáÓ±©eñãz²­áœÙeþú&$-`©4ëúÛ=½ÇŒcPyKNÕ¾T‡DQ¸÷ŒOu¤²UbÛŽì6BðÝÆ€Guc…€[~òùÿù¯ á¢}ùÕ5§G ^Æh\«þôN¾êÑkÕÇÆ²ªÖ\!ætšcèã)¥7õwçNxÈO¡¿Ò«7ÅÅx€È,Õµ‹VM‘Šõ› >+>k Ø[ßwV ÁRoË Üˆº4ríqùTÁ*fï,¢@<á‘K½íÖÁ,Î1ºº”r’´Â®yØ$’o–$ ¾-U°€M,G‘—1[<öëM‚ÜY<*®§Š‰¹y”²°]"/÷ 99xÙL_½ËÞ)a‘ŸÅö¹4Ræ–„-~÷~3 B‰k×Ç×5ÝžÛ¾Z…ô´ÂÑ3"q«ö,7ÊŽ(¢ «LéE"°V|¾)w ÌÀªÕœ@j¹`škSÆ=Ùªªn1óŠãl`™ð#°mÛRÊv‡ædY8 uJ˵ËJ]åàEhTf¦ÏaÖy?´ô–~öPÔ®$îœx‘BâØÞ"‡c“­?´9L¨K3ínßÇQæqç8Ö°ÃN©>I¾›þ7y!IH»Ž+ÛÀ·ÑÍl¢PÜòª~Öí¾B>ŒˆTëõö÷˜øŽöêÃM,ònk4GlŸžÔÅêð¼’Õ-ŸÑrLÓNªV±"ªYCswâLlÚÙ+8Þ€ãçt™ÛÎ4Ž=ôÙ‰m Q‡™é@ÿíÉ\¸`÷`bg Ÿ¸üCÆâ?’®†#m{GiþH ez”ÖRÎy1n—uÖôeÂz¨qÜZyPÅ£2M‘Ïjê… V²Í߸?s9¬éëH%):Þ/5î >ëÀ &ï©Ýžín%DD¬eæ 5@¾OŒÙ›í§V|Eð‰‹•Ý$­àŠ˜0újåØè¿ïÞû}wî½wòBe1^Êé’)’ê匎ªV¡‡Èj½Zæ“yfê_]Ðåã_ðØ?¢@ÚŒ‹)e=a,,Šj˨O · À,«Ÿ‹ÒØC£°cá}tä›i®ãÝy]ÏQ¬úêQ¢°:CÊ_¨õQ#ü-îŽÿ÷Í2;$1nÙU|Gû­Ú’E1ˆãSV4NkµØýua9Ü“–¥ÖI°=¨™Cí¶jKY¢éˆ…áò ¹kH~¤†ƒ§\öû@f†Õ;üå’êhrêMö»Š°ü‚ÔÃ[Žä(ήҶ•¹ªÂ†ñYüó‰ÕGÅËdz™×|¥Så° C@2—æmÞhâînßÌÊö*–w•îOD¬5qãäUš+æ xÈ'";ñ¦–bs!rçÞH‡p;ˆ[Õ7R©6ŒŸ˜–öI›KÙ3þíVÇ–ld1º¤ò‰å«µ7F»X=žÿ4hpÀÕúX©ÌýÞꈘ¢ Îù¨Sž‡ú䝯>ò©:—¢y)‹<¨D»”ÖÐ3r€ò¿Ý#0ÏŽå3ŠlUÿÍDÇÑ^`èn³ÆZ-yfŽŒ1›ÇØ$ÜÝm``N3¾W â$`Ô–«qJí¯v²­½çÌ›y¡T:¹YºÙK×ttÆôŸÇ8õž7_ŽdÒ‰n(“*ÍœEüӬá\HW?jφÕAo¾û`3ñœÔ‹ìW¡Ž3é¬;›„»CìòÛÌ„·Iµ®£?Bb9¢F”â”ºøVÃ+5R7™‰ããD@ ×À°3ß$í‚\AÙnðœää—lŒ¸M”öØ–ÂÂZ.Æ*h¤M… žhæ™i†uì#›{fÝ#nº³˜muP°ôÃv’þ.ºÙ³Å“MWkªr4ï„F ˆ'mvOâ)BbôÉhÇ—H‰?1–%Ýð„8iÞIt¶bUâ0ÔÉžÍÄóÄ¢Až±Ñ‘°™;ås²;ê$68ìÒé«vJ4ÕÛ:%¨ï™±V<5Nn¥z˜‰…À’דùo…_ötâwª {uÙG¬k tšƒ,^o'ykÎÎi©1‹96y÷ðb¶™ÆôLj‹*_æØ5]$Y¹qzüɨrê¯QM OÏ!J:©v]1ŸL†“ãYäëDÏ{]ccX È‚ŸFÙ©Ëš‡“Ó õî%~|{虘¸A;^,±Á ·éNRï“•“ÙCøybýå[:b<鋦o6^ËHFÌ%ˆåk’^¹£<7ǵ²‡i^žQCFOÜ#ËœAE”©)#⯴ÄÏ·NrU!^<ªh‚v¶VÛ¯Êý^Ñç&,¥ìØ£()!µÝ‹š<£Û½5;õ€1¶Íÿwãv`4þ'r~r¹ŽÕרA—yëØç¦m¦kê0ž#ÙÃÓ íYBZð¬§6*ÚÔ*˜z‘/A?«bO¦ßâ¸ä¥äìá3Ù¼9ŽûY*Aì^êã©ZÿÙ&][Ç9nð=Û©Ÿ> GÙm˜°ÃÞi9±7Nº’´ñÆ–Ì% ‹mÛ*þkÅgÕßDÅœ-·,-H±Ÿ°éÞ³ây…-”® ZñyŠ<Àc’NZ5…ÄBìÌmxgL|Çåªä¨9èD!Nzñ‡«;Ce³ë8œ›ë™ÅÓM»‚ìì¬âýÖ}T+eE|ÖZ«Â25……ˆ½¹=ÄSHdjïÌ1ns!;±\a}jŸT«^RØ)iõòúÌ«¢¹üª"Ú©>±šÜZ£¨éŽ¡YKñ–Æ> ¡8=;szí¾ÜsFe1ù°¨§è§¢„[|6uòœYT–¸¼ìRŽdZ*'))¬XŒQûfiEB¸È¥ö±åã'È"SoæFÙj–Uñ„sÅxiŽqþ(†õÍaÓ>¶Þú‰ÕñŠ bQ«¾ ½4²æðáä9?¥„{ݰJToQ§›Gû´3zt°¢!¥PìâÚj®úµÉ¢š xÌ :~ëJí0$s²{ªi²ÆV)µ†gì…ÔÒþk˜;ß¼Â×Ì:hĶ¥»R›) tq –÷r ížL· àÈÿR3Þéœ<ƒ¥îQr ý)ð“ù„k¿Ot°ÂýK±ä‘Cq¸*õÃÏÏÚ`š0Öáÿ«ØL€)¼':7ÂLmðj¤º„l鋤¾¹SXîvÆ£Çg} ,Û}·º9wü‘Ý[®Ê†<6ÜTÜ”hœ§GîÂÄ&^ ”y55(øÉk?Ð@ð2Õ&"¢„Ý9ÉàÒ2Ö6”ÛÉ(iû ?%ùŽxÄ¡ï¼býXÄ-ªgÔìX eî+uûD•˜¦–G=Yï+)wzUŒ:åøkTžÒÎ:ß#ó Åxßýîm×Âã{çí¸ëƒY¤x}.L 8l±¬a€Ûc×e,‚±¿ÆevZ{µŒëq!Ž ¹ýdàW3ø§Ñc3¬[³´.î%ÊÓ±3·ßmè—yºVggó;â\ c3j+’Ææt~÷áõ5Ã)0 l-kJË£óÄl³Ý݉s^ÓnÚ÷¯þEϟ癲®ç5Jmé­Pžf˜JÛE½)¾ÚÒë6Êán§"¨g¥¸Vûª¦Þ|÷ν3V|âyh¿z‘|ð¬X±¢‡¥X="Œˆ@, Æ-4ÊŽFí@©¼Ð:'ë»"FÄÞ^§[%"Ò©}CJ-m_LmlíÌ’!¡„&VÄ53£4J•Üú±VË…âSæ» ‡ü 7MMpÁã‰@ÖáåˆDÍ>Ú±€°’ÅvŒþ‹mÀD0¬à±æ[¹i>ʱUö¤>š1¨¯ò"›Ùtlsj04‰ñyD£?%·Ýû™^¿µw9ØxÝ,5¶ QI¹hó¿`Ä*$¶Öm ÅBò¢DqA<XæCÕG'ûÍ¿Õ,ñZÒÇG—™àPà©À.º(oÕP…'¬UÖ¸àúXåîçëÖÚŠf´Çá±rØ#jNß—í!èû+ÌÔrxÊ$úLàuô =(yۻ̵=?ÇÖ¯ï"‡;9`‹‡_tR Z*à•™v…24^„«ÅEjg¤^œªb »ï·!í5œ'uÒvUíÖzìÍÎìMã÷.v¼|C¨lŒÙbb’X§Pè¼jñâgv0ûq“rnž²NýöBÑ)c®q™‰ÉtæmRç½aÌÆ :ý n…yæx¢NwN¦2'‹¢W¶M¥Ì±´HÚÕEŒeªã‰‘˜ ¸™+rhp… ÷£ÂC^½9=&«ÄkV¿ÞHàñÈò§›µ‡‹6{j†k÷WÙîð3¡ê~¼rìk”/;GÝna1=X }ãÇkëØ~JkD²æ?7"UMbûÌ|bY’——ü¾Ú¶T¦]ðkÇø$Lý}ßï÷µ+0.!Wg>Ÿ›aÅNy*ŒDîÉtp8 ¦"Ïd^öÄ·›f#ªõeĸºõ‘‘-1ÀNYaó®×xûØû¯èQ:S‡nQxe`7êý 4ŽÉa^¡\`ä(¯pèá+û#©$)m–ªv#øÉ ,Ÿƒ¼_Gªöø¢`D 5u¶~»ús{_°TÕˆtÛJÅüü²ò;.ŽýkªÞ†o;!'5Ÿá¨=Ý*[>FrçáµÏ¦¡´)ª¯iÆ Ã°öò´:®Ù”²„Ü™@®ÅøËÍ ~sš¬¿ÛY`ý0~,®.á/qÇêˆ%Léø2˜i‚V9àøörLP0aPäÄ NÈ:ÈlícE×ññK¾µ´¡ÍKûfR¹FHÝ©H¡Áxù»é¤¹4HÃ!þ 2ۼ鎎…¡üãÊf,˜ÈÑ$À'¸Éñ„èèÁÁÈ«ò0+~ ™ž9yÊà¡Æ"Àù÷«GˆEÇ[o½o¦ò>Ìg­'bkÕÖY•°‡½¥Dd£OaEú@QÛReà×9åO*×½'¹¢ånØö‡±©NöuЏ:´ÅQ··Äȇ[¤²®Ïmÿ–ØíôP®ÎŒ¨Y’øzHÊ·ª¥-}¹«Ü'u×Ð#Ù’Â`ÄŠ3ߪ ÚÐ"þ4G‚½_’¹$tÆ¢ÚÅh¶Qÿ³³Íh„…«3ž¡Ç„„ðw1ëÐÙEl÷‹£”ª%¼Š8¶e…MÉH ügîS ¹H…dÅí$B¹ .þE±Ê»eþK†áû:“; O”8Ó WV# ?D+½LQèEIdÜ9ÅMgþÛ ^¥_:Nh•úx,³˜mÛÔ‘@éð„œ,"b¡ps;3g´î£«$R¦Wb¸tLîaEöšŒ¶©žì!Êt÷¥Í<¸îAÌëÊ ¬æ›Æ=ˆ/&YiÆÓ\é&@‰ä³Ê>\V²ge~òH(/ÚèÆvp¾ùè¡ØÕ÷@—WÚ¸wÔ¯VÑÅB¦¶EŸá b’xD˜­•˜³±«…ÄgÍEÄëõrÏ£‡E>î9ÑsóSÖqUlþ•š)GP1 qõöF^HcEO"Y5ŸÙ¼#’bÈxm¬Þ“ÛÊ „ÃR‚í(àÊ’¬ ØÎ×1îàÕ®«ø¶Ú¨cš—AFÁù.pŸÚ̼™–¤;ò\×[Ë ½÷ŠÝ¦>Ljó–îÂ|T#ôÆ›‚k­5Æ[ ½ér®±×a´WÈC1¹žêέ·yOyËâK©|•;ÓEPb+¿Û£ßú°Û 5¬\:ÓBÜâL·ðØ:Úß3\è pÅ!蘳ÜLî~ÙÎ3UË6¢ µ»Ý]aÏâÊ§× IÔ(I• Ç,¥cŠÜ†”·Röë4¦·êè^׿à ÂSŽËàä4ïèO ¥wÜOã î±Eq``ÙÖ ËÚ£FôŠ úl ªš××q#›5³!–rÙ, *û©ŽwZÀ5ޝ3þ`»TŽb¡Ü|د•ãÖgwK)B{ü¤²ù*>€ÒI;×ãŠ<ÝŒU2b*Xë2q¯ŸnW<µiñljOrPC$Ûz»_EfYoÂ1c3ÊŠ=vÁžx ½óÛfJ‘:¬y»r7akõ R™qÁ8búýzU&ðšååüa×ñ €*£9‘*j ­ºö…ŽéW&,çuÚ*L|³}ĉs”xÅîØÆLmžé°¯#áÙûuï³ÓÊÓãw%½ÅÝÍ‚‹ø˜‹GOÄ’¨­¡¦ra|ž§ ø? ÿ^ñï?íwk'2K*Z Ö fnhV$—¶(þùb·¨Ê2îKHm‡( #¹Ú‡—+|ÑÏ´S»<(êÿjX™ç– ÀNók,×å@PÀm0›[Œµðº‹&«;kêI_»u"¯…ZÌIê–mäñväjF¸MÍO ˜ dŠQ4ŸÄXP5ó¢ÂP\¶'PûíY 6v]Á#â¯k5 ½,ö —ý„¾È/ì,SY˜Mþ «u_8Z¦¡[ó˜™Ø¥ 扛©iò®,Äò•‡1Ñ#çšQ_ãßG9§#œìN¦mOÑ7U1:-½5™RIÕÔÞP ­ZB åvÈF]ªízéðå -†bÄDdŸ*¥ê»>µC$ÁˆÂãAÖ¡4-³óq¬Ðv”‰gòšìlœ^zk]6Ķ[rxV2³oŸU5gî½)ýyÖ'¢„>EêØRª þ´÷kßGP-h£Æå 뻢™åϼ|窾Ԡ‚ÚO£è¡´ñ…³][2/·®š}NŒC”ø“ÔÐ – ±ÂÄÅBqOÙ ÀkïèÀ*^·-Áa^/‰ý¾“’…¦^ÕħÔ{Uå^9˜5"k¾Úø.{ñ!ÝrµxÇ*›‹T5PÊÞŠZ¾†6.›@\ÌŽùq¦?OÍÆÊ7÷ÛFJ.ÍËæÆQP¼k­úþ…õ<nàÁݦ¶·ëHŒZ×k3QÎ'7¡‘£ô…(]¯º;‚ÕƒsÚ ˆ5Û³îB±°M`L Oú¦:{•c+~Åî¶Ñ!±[âØúæ£Q ±@Á‡‡sbÊn7Cãâ›Îà£L$‹;a 6çY”&£Ù…áAu8–}1Ê·àó}wñIÖî*°•[Ùã¯Îe=ú¼‡]?¤Äu=È!ãWb"Þ;¨§þü1Êÿ½è[x›"ôA†ðñŸ½CùaÆŠ?–6TËåK¦ŽÌÚm¤åì›Ìüfnwƒmu …h?ÓÅçá"–‚'÷ºå8lrQ•0á‘èwŽ*«²> ßÜ;µJ˜fËUææL‡‘Õ–v$ä=@- šo.2 '°ü…6… >¾ÿ2»2®H³Òû;—,¥ÝÔQXZW;$¼¯ÈWøe(ìèTêùT®rbé#a·¯Pçå½úPºˆ~¡Wcî\Ž@Ý Ëü—Á«.#;êj‚«ªÕòc/5=ŒtMYEÙYÈ"J9¼›+Ê¿Ù3öIa²³P´¹d™:ÖE] b’8=CÉÑŤ võe#{—oe—!°I ïðN…`q‚ÚmaQBvÀÙècèDk˜¸Âa¡ô&e1 4©X™cˆ`;w–[\ÚF÷²Þu•LNðñ!p.lBNVB+ñÚfnÛ{•uê 2‚+𠨾2t¨ ºmÈ ñÚçÓY²‰çŒ‹Üò›Œ1s‚ob›`ò€±wî½e/6ìÔ~3ÊáÐâlx…7™î4>“äµå\MG”?~Éê¼kt®ˆxÖz ùXþÑrñž¡¨UžsÔ‡q=uÆØÖNâٸꚕ39ÄžCƈÝîÄ[$¹& ê[¶²U»Ý(©@6¤ºm¤Ì”'F³ndh‘Ô>äS¶ï¸ý1ú«Æ71l‚ºRBbiJ#ª$a‹;éÀ™}#-‰<¨ð ·óXV‡IO“Æ"¬¦ýfæûʤR;óû~ßw1÷_ŸO¬BYÊûòEÙ€U«W•ÐØÍ°Ó(«~·­,a«8Ör¦oÓok9¬X«ôÝÑ´Ò)˜B c´‘{"ùðû⾿`¶¥i1X6™žˆ§ÖjM­äB®âLi9/ÛÅÇ&þ XØÉŽõfIŠj­»‹qÒ¯I TGÕgÅSˆCÍž¨!äËÕ¥B:IJËìƒîvd¬zt$PÑ#æF²‘ÁÆK m±{§<é¬ÖìÜТÕt+qL+t*Ã:ÑŠïÕü螊çøjff†Ü:–=Ù¾b€N9‡ÍVnqñ½œvYÕp íÍMmi£F%°©DѳP³ºdbËÊjLÔÓ~ÆmEcåÙ®©ü–€g¨¸¸ÊDÄ>H¶ÌŽjA§:^5’za—ÁÌÌŒˆ§l;3…\Ÿ'b-B{ªcq¯òM!j,VXæ~Û¾Arc½Yõ|¯M¤­–ˆãe5Eô°eg-â땵n™¤ õ >ÄR.ægñÏÃYiM¼ˆU<ô¹œwÅ ÌX¤J@ký¼Õ Ú©¤¡£[hé'•m§JW*w`t/ZL{v©ÉO|‹cð­±0ÞM-/¿ö6âñ:LîK‡'WÔk äÉ›îÜ`/ KxËÍ9Ø"œŸ&ˆ¾¤ÚC¤Siâ[«ÝYžñ@„^ôè0mÇéCøþ<ùé3Nú…:Mø¼Ì†¿rˆXçk´ª®³y¸ ,ùˤ—´ÆuJ":9OH2'•£óìS$5ö©åFÅi—RÃñ–3ã.OÒ Ú¿×eËÀ·ø mH`„ÙÅB-À¦ßî–0ù&ŽÕY¿ž¢ŒWŒîß¼ø‹9OO¶1‡}¸Ä((Ÿ¨kÚi€6t·òWÚ”Ð8áÄkoï›Òß÷OìÏŠgÅb,®´ÕBÙrijø)^î6f”Š€ðÝ™õá¬Õ–dbÁÄŠFBkÏv F·€lû{æœÈ"*#<´³¬•f$´…Jðù¬ØÑ6ÑcT`¬ÏŠÇt"E)ñ€”^{&À‹ÝbU[^uVðEb×ýý¬õ!‘ûýûî ?ë)³?¤ë>\¶gm ƒ~¹ßïö òYë‰çiÉV¬Pㆠñ±³r.×ÊÄbÑê+êp!œ UR»RÁ'V,ÃÊ”…èr8йx|¸œ¶P¹˜å¯ð´øœCç€c_•EÖ¨à'–@¢a]ÞúÄ"5‚±¶˜cLà}­šPFd¸N5Δ2w3KÃ5xú¨Å±È™‘«§vµB¥8Õ»´Ä|Kß|«+T5Ò›Üc/î1®ã³ÖeŒICV†ì|&l«s¢.ùañ6”\ŽçÛ=è¸ÕÚ BDÄër8§æÈ)Ç\dÖÃ\¤7÷;:ÚŽyyGpØ;±\ÒGF¨¾Ç#:Ö÷gá Û‚b±é%ÈMÛö¢©ž)½JnaçÎw¿mºÅˆxžõ¬'…µ/ë³ṀÓJ"øîýÍ×ÄÓÜ08Háï»ßïÞÇmÆrI\gmKHÆ®ºû—Òy­Ô®Pyâu YºÉ¨ °¶£E*sgÕWÍ…áÁ«¡’J¢«Dîj—+ÀqPGS›³»¢ñ¶‰QÒl§Å1°Õäò4Ï)«ÜŽÆðøÑ“cõpWŽ(~ÜÈGÄ•{zÊ5r±b… ì´ckbMRw¼êÏkÛZÞ%®ì¿uº‡Ö4‘ Ee‡e"ÌöÖpZJynj©¦½=Ô[†â,åòɉá9'x §ŠE§ TÂ@î-jóìâЀ©KcûØKö0µ=§P¦P¶ºRDx\ÄÐ RL‘†.tG¢]ƾøG¢ùOœïd÷ŒÃTù5?õ^µŽj~/cŽçÐMïé%t‰Éq,ºz2¡¦ ôHÊzˆ[ȲŸ-«Û°e8ʽwÅÿ*ÿç÷›ß—‰ïwÿ}w¥ŸOðÍ÷?ïËÅ}Ö¿?ëÏ2ÂŒˆ(” î¦6íš) ¹ꯑU{ëZ aù<%ø|V‘2߽߉¨§«s—Œ[„>ŸUòñ®x£¢vÊT½xqîžÔZ±ó}S)O (]gÿ=uW*÷Þ›±µŠz€½³nĦ«ªU)&tÌÖÌ|á`¨’ÞìÚž¶4AãQ.XÇ£ÍlZ]>ÇCíhN"›™45Ï bp·ñ1Êèq •åÍ3‚‹É­ºzn÷^WïYPè “£³ÄGççš±×:‰(«ªÖxg°m¶òd×[ëW’Fûk?Dîšy» ]ÎÈt`CÑXà …ÕõôÄ®§á·ÍÝh™Á+Áoê+þ ±„Å\dbçÞ¥€­ýÁP@!ý!àU‡%=ê …Ž)Ÿ©rqæŸ6íÓ¸ý‡  Ú!.måYî.Ñê–\s-RïlïD"Ð!x«)+°$Þ¨éÇŽqV, e¾lØþ7QÆ‘2#õ´üDWP9*[:kcà»+)K,‘<éâØÚEáXÏÓD°ô‚_­WXà,z ŸX fÌ¡ßÉb¨*u6hïÜß[b((¤ö7µI¬`çÖ£c…&„Yc¢:ùWH~U1yÎö麌zleO;õšë…T ­ùVä ýó0¼6Ê>eXê ĪÆu5Ò-Ùhî½5¶*F â ¢î —hÒ~„H†Y]be£ÅKÂWx…ÿl|“©Vf¼Êu.˜Ñ xÁð¼¬÷¬'mº¤E 꽸šUS1»(:E³àêâINE°ÿ…«Ê:yAGk›NÕ”ŽâŠdu,-» àFìKÈUvo¶kŽÅý^š°«pU‚B»x!Kxø}Æ">*í5Êß\®:sçwc—6sç~wn \ž8â_ýù€Ì7±÷‘ü¦¾)2ÖzLk'Ÿ uŠ(÷vO¾ßýýî]n_kû›ùÍ^§ÜÏz ,$¸¸Þÿãï7Ó‰BÏÚÏó)ÖÍ‚â!>Ë‘m??›0É-íWé$!»ÜUמw̸׉;[»¼$ìö&±žµ&µkȧ@Ióöˆ·ˆœëDÌŠÁ§|¤+5%¯î(´Ó#Üœè_£6 Ô¹ÆNACúÛq.¹mŽ.ÛQÃrèèœúÝ\©·¶X_z–6­–ÿAO©¼|-Æ›Ú߆ªe•cO>d¤ý˜£e ¨p%Zší£^v^­<émA©yä«´qq¸ú4ÛðøÆ\_a7óà¤;~@Ç®®³ç‚“¡¡‹:Ðaê9.µå:½×¨éƒQ¹ÅÍn tFý<¾U“îÖâ& šåm=s wªx­š&ª#ßö(r¿5‡Cêîg¡gŽ7{x"±´ÌĶòØBÚ¢/ïÒ¾{­6³Wc×+"7!`5¤þKøÏ›ùæ~µ…õð_øg­ÿµÿóæß¿©¿›žxV’ŸÏSµ U(YÞ ,IsÙc¸‚d+ŠànwidîÄ–6µK€ø²ø-hLÔh»üù£ì·#{îj¥^9{GóBHìüë៵𔪠ï›ßY#¤(ç;&¸wk“ñðY ÔF¶¡… _?–ü™_IÚF„"vG5E¼¬b¿ÉOe™m¦uCY˨s-ùؾ'‹‹“ÅØ&ÆsâvéÚÑ :W¬K£èúf—d9›ž_Üdèòÿè‘× ø8þªQ«G™½Ô}Z¬9@ÄÇû(j"•oMÚ'Ê '¨‹sšŒj¶y™öòAòp»¡«Të2ˆ§0Ëb9À!ÎN”[Œ•^ÎÐ.Oé$ïô‹‰d¤_Ñ•\ ŠÌøKù—úþÿTâ=bKvÉ)¡`GâG%ʯÈëY©wcï$V¬ˆ½ß½ßz#ï‹íç—‹ø<ÏŠU¹¯'Þ5"êÝûÕæ³Ç0•w‡Ó$´¸É73·…o _•_ÇÄ;Ñݧç¯;3SŒAu¸·Þ÷5·¥ ßoU{ATaÓ}e{q&Æ€ÐF(–À¿ÐßÄjÊP*÷æîãöÔÇ'Rݾ¦ïRñ‰õ¸£å–u¢ŽX÷M9ÙU5Šâ–—‰jU€A*õ׸þåM&ù–D·âZm±ízÝSQ»2†ˆå@€©Ú€¹nµ¶×ízeYÌ,•ì´^«Ô¦EXOx¸ )ÔÜÏjÓ“w¿ µÓVb«‡íßýî¿ßÿ÷þýû7÷†jðåúªL Uʬܙ[”žg­ge[6/$­›uǶq9—8Ö*@†`¬XžõyJ<¾ªÆÔN2×âçŸO®DØ“lVÿ~þü÷ÿë¿ý‰`‘«ú–¯#•oêïÖÞÒvÔ]27ZÔ0Ä Ü:ZbE,†\¤½•{{©:Qd-ÏÁ5nÕ‹ãöV‚³X BÃP‡C•f«ƒò82ðX× ¾ZLªšq¼2Ò`[;õfPq7 ±CÃ.£IÛA]˜³¤Ì·ˆ5~ÉM–‚Þm½rÁ©§k5ã Zv®ýrE#P\hc‘3wï³´ ê;b~w=°ÂÞ™¯.Ô\Ï 'AÝÄ{’ˆÌ¦š¡† .® ô”š1M™©ävwTŒí¢C×O¹·š×¥[¢3VípDè?ä|ñV²ÅÅþ¤W€@tO¤•‰%m䢘© .AÙsvçØâÒý6iLL$Å Ö¸Óª£Ð˜äJi•ë"â픫AÞ£ÖZÿú7BùYñçÿýÑžÿ†Ïþ׿ÿÏï÷›ÿÇóü·ÏŠÀKm"¬„+÷;ã<ñ<þîýæÿGÕ-I’ÜX–€ª™»Gf’Mv̈ìÿÿÚ®¬ÈôÌŒp7Sî<jäK‹°YUYîfªÀ½çII/ºDÜ]E…&\³< Èéó˜SDÓqFxúmK`$¬žã2IzTƒ-öñ»©K¶•“»|‹fLúd¤¦²™mÚDÅ%¼é"øy¸ç9j€ßÃåu´€Ì:g{—D)–O•äÊ·¡²ÖlúÚ eì1d}R¾çÈlµ ’S¥Ô¾k_ bX«eè’Õª¨ä“îºÍ^Gåk6¿ºÔÔX©f XR0Þ‘µw~ŽJ$$Kî¸j‰ -­×Êâm#O•‘ˆJ¹—øo§‹eêFÀkZžÁ®÷\ ¨Ûô½`Ãì;xï…¹ ‡E7É,2øž±âj,\Ð.:tÂ…Ön=BÖ‘’W€I)AÌò×ĦM ÒÕÔÈ’çÖlUê$!2W\ÙôÞT—/×_ˆ¨Â™+N†G7ähùäúz¯]ÌÊ E'TM'´D¾Õ§i**6('Ëú)~c².Çß7ö@¢2kÔ„HÛM¾)=OyLwrÕ=óŬ¢šs¤<%'‘&5‘kIôtÞ“ógådUah.¼V@†udÈã«~CüÔÃAR,ExƒÏëd»òŒ”å<×묚³Q÷X– W‰4¯Þ•kÉl €ë{]¨ÔÜÉ^µ^CE–[-A…q2ÑË J¤û|AK–„®ˆ–*5Ì%®R‘žQ-¼akƒŸMñИ¡1Ãçscafçüúz}¾Ž¯×qžƒçà91‚¢T ‘X–éÊ l½Yk$cNú ¯NõEƒ(°8©yƒšXëP•´g˜´Þµ«±”8$…h@µõíþ°}‹¦9m¢ˆ›®SÜ*)œtzêZ¬V65ƒa}Ó³«ò Ók8<^C¦7ÕÖ­õÖ›µ¼¦dÿ[ÑÔHžsç˜crLqœ¯×k޳H=áá#Î3æ0UݲYLªwiP5(ƒ¢RͨÊIŽéîSEnûͶۀ“î'j^´GJÓŽ ’Îéõ9ŸSÆT…ˆL6âÖØU(2‰¡»ÔT#Üæ'œjîátǘ1}ª>Û¼ùÖ«tŸ‰^Ê;Ég:3bLÏÖ]ÔöYEê05e²lB¶ÆfÑ ÍÄ̤ºÚ¡oü¿@ß}¸xSA®8HýGMLTŠ'FDH„]i‰¸ÔQËKûνɨ¸2·¬é¦¬Uî±—(Ï ¯>9P\2}óøfS”Ø{mŸ-S¿¤Tø]²T“QŸq†‰:ÀÒÖ/âuÍ^êq¦’;šE=F„,Ô¿µëmM„—û“ÿfÍGwþ¹#rŸ:ýÝî¡í€IS­2}dÞhÅè¾ïÞ°ú ûB‘ºJ½wÑx?ed±á™]³\I+f1'dõÎ`J[|½%Iø7÷UÈÍ3-^ΚÏñ[ h )/üT\Ýè Ææ(¹yóYô*'ç-‘ùuø¿~ÖõlxÁ¸”m""Ù`§ÖU¥Qí–*òi¦Õ¸H¢¤‡DVHƒÜ"š"6ó†pˆ™5QñM±)¬÷lL±7ÛM¡2€á^çsîÚÍî¦"øtÿ3|yC,qg°E¶m¨BQ+>!yzŒI†0#d$VQ ŠWIG–Î^Ã'ÙZom‹Àóu¾Æt‚8F|~Éé¹4¡J˜dø°YÛ­”˜“C|:Lj1ÂgÖŽ)º\Ò¬Iµ•Á;³öd¤*´µtç$CLû¶©4ŸAÊq;ÛGl=jÿ¬¾Y´‹3G1H“P Q’1]=¬îKuÑŒÃÊÒ¤‘9̧*A?†½tz˜ÄfÞÕ[ëšä-ªPºêÖU sÊ9Ç9üœ3|bN›¾R 5 ÜLÍnÛf­WJK-5WHw¨ºd6!ܨ¶&Màp9srL×ÖË-TdETÅL·­oÛ®¢>çô)‚fb{ï}‹5§Çtñ¡<Å] [N^¡œ…>ÐæX®ïÚMƒˆ¦Sq†ûøãÜ·¾™(œ1"Ei&ÍšgÆô˜1Ã)j=šVÚ×´›µlä”zÜÁ-ÃÆYqË‹ðm3/·}|yUR¯$#bª6hÓëw)‰¢²Åë¬+ ó}|õ>;áêä¶æF ƒ Õ‘½\-Ç•YZâ¿% ×EêÈÅúE6TÕ˜PTÔ==Áí<)iÇL'õíÍžO^¥® |>©übÏ*éy›2[¾á¬\Ë,¾Ræ-âʘËõwG¥3óèÄ·GŽáœ…qa#“¢WÊLñþK˜—™ ‡Çb,Dý*ò¸ŸßéX+úä›+›ëœ*8d[¤|0]Y§³K:Îåp­ÁÍéjaòz˜Z®H]‚.žâÒ§ÖQì* ‡¤t¦ \›^]2e(0»Â†…üÕo–/åEÿË£l(9–^ëè*T}k TÏ…N„¤ñ2Û±p_(  :tH$¹Ou‰'Qͨ8q:™Ð`D˜HjS“Ö”(a˜ÂBxp®;[1JÑ.GÔ‘9ž2n1sÎymphÆ5¨ÊÉ<”/ biS\yen½>äåÕŠà·Fkô@dwÚLi¡¹qŒd@Wkß››ÿH‘ÂHòâ_Æ7xYÝVÊì ³Sá,HØe‘ÒÌ$šd)'rÈ™7QKä+“;Ÿì`‘ÜâÕ(1±òò„÷垊k ¥uzÌ%…æ˜ò}ÀMwÃå~^Û´d/biÖ bå×íF.MaQðj èM4P EÁ!ÞÌú5ΔoEóËDV#ÌзÕý‚¿Ã±Léç…g°„ ,¡yÉÄŠ²Ä â¥Ñ^)’rldp’¢¦–UÈü„TV=ÿçe©,õR™š5Y $­µÔ•V«>£EºX¥2}ë3“C¸$Áß'8•þŒ«v¥×ŠvÕ­µb¥FdõB׫t]«S­à^_J5Ywî" ÌÔ,_Î"¹î„$¯˜ 3ì¶r)žËL˜ªôüå^þøê9#‡|É€;fá® ç8Ï9œÓ=ÎãÇÌĨh ÿÇ?þüù×'§7¸)Í,D!j­ißÔºˆíˆ‹¹÷»°™i–êôPÃüÖ­IÐã<ψö.û=·™îîîÍZká1‡21ç9g0¤ò$ÏSòE’°ÖÍÄçÓ~¨?±m„jˆ‰hW1#îîN…4mj "sŽ9fõ… { ÒM¬‹Bé rÁd$ÒÇ|á#9²¹4í]·f¶w»mºšRUE›ãã¬|×òFY35¨‰mÛÖšeh¤µÖzg0ªj­7³®}k’ßúA±ffÂðóœ¯/y=9#TæÖ°!Ü<˜ÂéFbúœÎ9ìdP1NlMïÖÍ,W·rBBGØL›Š0ÑïÕ¸õ$âL¦ùÃTßÔ¬ú|2'1•ˆãõz=_+4mj½ÓZˆ‘ƒ>çy}Ó¶éTúô1i†Þ¤™XWË£%Ò ãšò¸ çgJj¶ lµ¦^¼›¨|B“U D²v+%A¶R’­ZÓ&‰¬¦<•ò¯M_öP£˜9xMÜBP<9iÉT­RZý< ÚpÙ¡ïOÒ-¦*Ý´‰Úò<+1£¬3@JFWÕxó*s&ù‚E~si) Jðª($ÀÂsU­ì²Z!Vê6sä Õ….X!É%îq ipËToë ŒÉÒV»iήrÍ·—#{ႲŸM½P\².b”(OnÉ"(>YÙ! -Ø:d!Szj¢f™]aÍEYÿ„X¶ŒöaÄ{~ð¾"f æ‡(Ýœ ñÍÆÊç{%I[׿õ7Í4¿‚‹–åUÙ®Kq–Wq2ôr°T÷]B¸ˆç ¿úW ú[9¢þrE€5;÷ éRËÒ|=Gi§ «1å yˆº o}‡¨³ùw#„Úò"RÄŠÂ[éu® ‰œ̈‘>z ½RFÅ,ϱ€ о¡"q$Rd(÷îÁ°uÅ€njfÙÖM-ÊuTòDƒdüpÙˆhžéÙ¶Ž)šá:‘ç¥ÙAÞ_B=59WsA_Àc+ËØJ{¦·Ä¢«Gjú¾Á¤tÍÂó2»–$×Y6ùTÐK]òfÄÓ3-E‰ÍðÍRµYåa—-ªÔ1Kk›©Ëu¿‘&²™ZÒ(èÈB$"fpq¨ÖÂË®PŸ¦u4O{ ù¸2çõKÈl›—”py HHkK…Îo4²~û6ïÉÀéÉ%#-㑘”hùJË…`½ìVWüXƒ|÷˜¢.×e/ê  š!¼¦  á)l*]ˆÁ,òJtAU`*Mëž»ÚÓc’3 »¾ÌÙʨOã‚7 ¢!;sù‹Ìø&'¥© äå..­ÕϪ téoW:T–Æ"OÚ~W³0ÂSùÁZqåI— ÓÓÜ +еßÇ*¼1À1“h¤bTÝ$ªŠ[ƒ f¼ÍšiCŒ|g›%ñ˜ êt¼Îñ|sœênî~Žççóë8q>5B)Ah‡óu1ÏÎ0 j´Þ·nÝÌÉCmÛE1M)·›ÿÜCĬ‹Xò+ãÂn úqºÒÚöóg{<¶ý_Ÿ|ŽÇã¾oÛ8Žñz6c7Œãx=OóäpñȃSaF Qk%&4quçKç”P÷˜îê¾ðtr,P£Šå05AùÙ–žpǃ‰ŠîA`WÝjDÅÖ$L&cúô‰ðÍÚÞm6ÌÇ­ýúõk¿u‚ÔˆMÛÖ­5Ra‚ûÞ÷}kjׂ(±S,Ä€ˆ&ÓѬÛÖî»}<¶¾Ùpë%‚ 1ܪۜ®‚”ùÅ{ϰ.=µ2_fºâOb!kÌTâ Æ"áÈ—ñ€ïBA¶F³ÍVSphÿ IDAT¸`¸xçž’þo²ô"µwN/nn3s[%ªÒ²–ÍY=Å[³Ì}™]Òud¼$KJF¶üæR2ˆ"·ˆ顲ZLÂJÝ$TÓ0 TÁiX³<À-˜¤‚;]~IŒpÕØ³:¼Ð,i¯7F·Äv1ÈH.š0”A\Ñ-4»† hL³j:iT Çö>SÒÉ0ÓMÅ*ã¥ÓN¥±GœÓÓ¸3ùs&‘œ’:‹ç†uùVSÒ$ QY’%q—áÕa‹  ¶n­5•*.%™®ÌЦÒäM¾ü<«›“ÑúøHÁdMå­¹»:PëªZIýx_".5YNzvÕMë~˜5Çõ·¯üu\a%[—µOM²˜\Ä ï¸(l…†Qå<¢†×:iY¯°F\»­ŸHõN™ w&ìkšCŽ«Y”ÌÆ·c^ÌfWVE®\ÿ½G$ÕƒX“"A~D-„Ž)€‰OŸ‘khø%»¢ÁYÁ樔‹jßz9#"æÎbQh3¨­2ãÚåd~—ßÓWé$7‰àSWÝD+®¶?Õw¨Ç1t=¤3译½ñÜSÿ®U¤<ƒT‚~øôµZʯ.æ’4âû3IsŠ˜ÁTA/R¢/ËI8ß”ywV¤z¼UÂF}ÁßaaÝeóZ,RUT÷‘½H)Ø ð’ú^î˜2¯-Ô¼\[]’4žï–\Ï}úœ£šNùjwMâMù#Îçùüý9Ž3>½™ªŽqœc0àÓç<é#AgÔ´yÎyœ‰ZÊB"DlßÔ´‹é¡>vÝþö—ŸûÏ¿ß>.ÈštÛºYËõ`Sôf½›™Íˆóœ)QóéÇ1Îcl½Ýn€ µ7éÊÞ¡M´mê‘ùPh°ýúy˜ª4áWîœ!gȘ!cÄyÎÓ1(#pºO•¯qŽ1ç ÂÔy’›¨K{:}²GlJÓ)ª¢ÖÌ÷æ·ÝZW@üLD°™æwÐéÃ}†„æC-hû¶²·1gfŒ#Ïn U#M…Yy”ï<"ר“Çsø êªª¢:ÏÉ©‚ž-CÆðáÓ3aÓ+¿p–©¶d³YÐz3S}†ÇõÌŽ`¦@u5@’dfZ÷[‚*Ö›ŠÌáîœyÄK §&12~™QLÈ,š®×=h¦j=Qq«Cé6¯)W&‚sü® 0Zk·Çþx¨`žÃO7‘û£ß>övÛU-½|¦ËÑô+°Öº!©¸P-¿¤´üðM qÚ¤‰^Ž"«€oË1¤j9¿Ul ß(½Û©¿sÄ„˜6sYÔ[¬®½YÓ&º{k”“TöX¦ÖX;+3Õnû’g`U„ÄtÒ¥Êâ&h¦&-ÇŒ24"å’·E/€¤ª ðgAê¯u¹”³˃ä˜\ïÚ…Y6Béx1Î>!±oÖ›••±*ÖÊ…ÒN}átŸ3yQõî.ÄÐJ³i…Ö #D k<ÒDÌuÈW¦V›I±úR<¶ €—¢g}S®pFAõ;nf]}RÛYöâöç·º sP3SÏJìÚÐëúØ3ÜcƵ/‚8…½¨"™}ˆ +ÑET¥©ì†]±ç®™+&•‹»•ÍËx@œ@5#e‚“VäʨT[¾LØܤ9l£XŽt—Ížºj­BS6a^S, ²¦N¾Ân¦õz«#KeY9¬;Ü‚@® sE•–²0£ƒ¶>b̈ÁgÆ(òÌp")?~ò†öG„„\vYÐêÆ£*A†%†|f'ê;º8€ÐdÀÇE$«dÕ¢/x„Ôo¡H\ël¢Í´«!0M<ÕL)È dŽˆ „è…» ߥøø&ð±á¨}éÒó€ÍöMóRX¬¥V*H™WhP3Rz‰*NG–]¯¯_=zc…ö*¹'’:`VÄÛªWž;9¤** ÖO)E¶_´€÷]kpi¹ØM$'™°Û‹)¯ªƒ(%FöbI5ËUïEž¨X.=®Ö®¬5Vc$“ý3µ7ÅtÑx¤Ð¯AHd9,¡ÓYÙÔ"MFéÌòQe+ÀŸ²ÈžPCPóáES-<‹ŒÌMž°ã")/ëF°º­—»¨Þo¢o>y?x;v Ä&kHS¤ízv§¤,—'67 w5 õza+È{¹@ñþ¥^è‡ÒV—¥£þX¹K¨í$è\œ_Ïó|በ€ŠÀÝÏ3 àÇëõùûó8Î9=<º©ªÌyœã¬ðÍœÓÝî¿üõoëOú×' Àvë?÷QAĽ·[³=\»mû>Ï×ó75¼µ-D=ÛÃ~¼@χ¸õvÿø±ßv•à8Þ„¢v Ó¶µü@IÀ¤YÞi#üˆ˜²º)÷‡©†;g<îûÞî__¿?Ÿ_Òûv¿÷öˆ‰—#&­?Âî_غøz~½ž/QÛö[3¥Ï9ŽÌ5*sk¤À2'{¿ßwk ÝzW³ju˜¢zÆfÇëüïÿÿ?ÿõõãןÿñËE>ÿ|ýùócÞ¶þããñ_ÿÇU#|>Ïãyc̳‹ü¸ßï7íÍZ˧Të­·¶6³ò†‘cÖ‰“Áã5Îóì ÝÄ*]Ãc$©mk ªàe¢f­ À˜7n#âÌ,!å8ÇqΘÁÏ×óë5fÄ…ÞwêözޝßO‹P ò ¨I·¨šÙÖºýØvšˆIÓ~ ?qçq¸M{¡iPƒpQém33÷ ©zÌI¥Ô«±fE“ABr~1Ç8ü<Ö{-Iё頻»šŠÍ1^ç1Ý+Šp‰c/t¥åŒLhoe«Ã“,…IíãÍ×](:ÓÖšªÍà˜A‘¾wS Ÿá“ô<îsEjÒòqÍH‰Œ]_8ú(^¤‰tmÚÌê¥ïs¾Ûnq9­ Jô¾=>>>>šÊñ:Ïc(°ïöø¸=~ýÔ¾ŸÃéÜš#Ü}íøA18CÕ ”ðfÛ¾Yk¨Ì´¶m[Oû¢ˆ˜,÷¢"ô9Üzƒ¤ó2†Ÿcxe"’Í’¦—L|©µ¶w‚1Fêe’µ¸oûm»›µ˜3èÖ­™2Âîñz½Î1K"œ±¦nÇýÇǾuK”$$Ÿ¯×ï¯cº¨mŒ˜ãP“mo½í½õü®†TqHP)&–™Êœi€#ídšÀ@檺‰#AõcúðY=["TÂ@!|žÇüzÍפÖeNÝ6€H][]5EÕÔ4©Œc”3‘´ÕrRh&½·Ì£JªUbЖá¨â¸…¡Xñúd›jUدHja€˜®ÌЩNˆGö#B¾‹Tš`ƒ(Õ¹ê¹ÊLÆá¥ö”uf•Ì…¢Mc•$ØbšDob­‘:CXÖÎlÑE lÊ[73ÕM±)ï&›™¼}1T¦Pž¬ëº@4BÂÃjÎa@3-PMúº §ç¤ÆŒÖ¤›-(b¦Év½j'%ÂÎNa„nðM´™ä`8EEšYžT¬ ­n>EÎuML¬QÅs†#bú jðR j­Wá>'5QäK9ÝÁ3àü†ªH{IJˆç/S¡¢ˆ™hx5º×]ŸÁÐPü¹¶n0=`Di¨òi>^‘)tˆM°÷\ Ó‰r:Fõ†s²¨&Zgô¼Í–@°’Þj*i®‰Í:HleC%CµW_ºúWàU®/›ä¥Û{[*oU£ë Ør!âÖ°¿FY9i`¤(…‰`ºô$ÅÏ”c¾òó‘ Å&H]n r#ܰÆ>¹¨¡¶–F“AzrmZŽå/|gQ˜Ë$ úÖ:›ÉáÖãJ}âÍ6]ÚŠÓk¼ÝÑÈÃ+óš™ûHH¼ˆL²ë•‹úËi¹fLMlh1f‹¡¾ê?€h6+šG‚\ꊖ—u*UM–ºa¥k‚¾Ì9""ááOÔk¹´ÒùØXW2oP^ñ­•é‹0"Ÿ¥yóV–ࣲ®µN®Ù²_s!hPrîe¢¤¤BoÃcºsN Ä1ÿŸ~ýó|Z-¡%æàx)@xÌp'<"æ¤g‚9TѺ5³Í¬™nÛ£m¶}|üüùëfö|î<|ÛÍ´›Þo÷m¿9y¾Ž8û¶Ý63œOÁ´8BiíþøØï7?Çç?þq¾¾r,Tõ;Uœ>Çó9i­»¶¾ß·½«*b0&c#'']¤EL?(Tã8ç1Ô,LŸÏ¯ß>OŠõÇýñëãçC¥_tum–!ìM»¸ó‹/Ÿ1•"»çÏÿ×Çý¯¿¶ûFêNŸ{··ýcW3!¶Ö{3¹´±RáNmmŒùÿîüßÿ_üõ¯ÿóÿùÒû?~ÿùçï¯9cjÄx~y×ýq»ß·½ï”ûdÌ™zæI`ky.ÁÞ¤÷l–§i¸´~]tïºL¹Â¶»À¡éÅ!²X¸õ?1£ET²„k†™0ÒÚ« µ25m%qÁkœóO¨ÄŒ˜sºŸæëúõß¿¥oc’‰q[P\QÀ”ŒCÒp.5ˆ„DúÖ[ëy{Édwß¶}Û…1U¥õ&Öò•Ö´1xœ§€{o"tŸÉA?Žñz¥?J@úœÉÕ 9}útµÞEœ«¦÷\µm·m»™´9'cöfÝ"ððçëÈÐõÞÖ¦÷Çí×ÏÇmoMØŒŸ_Ï}fmWc \­íûí¶mIÈ®¥õnÖ³Òݨp Ý2¢ ;'3à¢u&:ÿŽç8'B,«=ÝBA8‡Ÿ¯óuºë¦ÛfÝü­÷ôP£&± À4µ„Š™·¨#F0h°¦ûÖ¹E35¬b›‡†¶ÍÔ„Õ%ä²²üp˜eX_ô\ÐÃ9GÍ+%&}hÕÍU۾ﭙ ü€™6“Fó§Ðƒ2›êÞ 9é‘U@|zL'MaºŠ‰tÑMUšnM­µ3ð€Ý¤J è–. ¨‰6mMÄÄwe¯Ò„,g #P­;ËS&åfÞÍíT"‹ˆù…Êy6T†h¦›¥RFô‚ØæK€“+„W9<òÐ.P3ÑÐÐéY±eÀ±ÿÝäŒÎäs/ Ll¶¡ ‘84–ÍB5=˜G†“C2ÓªpÅE?G@f•W*SQƒËšà2#™y« ³ „ÚÄšJÔJt¦r6U—‹PWª*>/Ä€ÐA0]4h˜›âÞ­«¤¶YEÓ=²!©5è(€qÞèl5¥©!•ªÈòIÉ’tÃZýå,mËrLqcäå²XBQ«Äc€i^è¹ÆsoÈpÇú[âjáp_›ZŸ­6 …3q‘k¶Pè5,!!Ø„›HÉ\rβ,zR½£d•ç„-BZ ëê%­ŸÒål¨á;¼j¥ù­+1Õk/àä¥aλoÔþŽô|HkKòL:Ò=™¦Ý|È俳hÂïêy5÷«xœ‚¨uÌVa:»YºÌ,u»äÐyˆ·XžÎk¿™«¡e϶¼Jâ2¢ð¥« À5¤cíNF¸¼žùc‹d\4ÀºßQ 8òæ\þ fù%’Whô1‘”8ŠNÇ1ücŽsÒcóõûs<_FªJDJ8‡a6Š©éÞ6 Ýç?Éæ7…Â%¬7Û¶íããñøñ±?öÖÔHûØmëGßzrßÒ×ÚÜpov¿mT¸ûmßUçñ:}ÿñóׯÿø >>^ŸD"¥]´MUÚê>Âo!mkœóðq<Ç<ÃGLPšæÇ©™v ˜2N?¾žŸcô¦Û¶|üj“õo µ)vz¸ŸO?þõçk>ÞÄ_Ç󟟯ÓiÒ;tS3‡¼õý??þþ_ÿó??þú£rã<§÷{ïÛæÓh]šŠÍD5 ŒaSüýo·Žûýç£I3k(>ŸgL‡Ÿ>ˆ*=gò›¨Ì·qº]M¤ -æú:ñâÅ×vÑR•¼ëyXl [„¢·Wµ Q®MÇãõšçpÀ¶ÞšˆÆ¦Ñ{aÓïÖî: i{´Ûï“þÏGãök÷Ç>T¡Í‚âN˜™µÖ»m›õ›ÑLÖz >_'œºmAN1%{ïíþcûùнAh"]Uóu¼ž¯9">#¦ƒ! „ã’×,Gà¾ÐDš–ËÖDa9Ñ'TÌ´@3¶±(u•æª÷ú­EwIôo‚î¢iÃ3x¬*&’¥¦ 9¸R ùÊÔ+»±T="ËjÔv¨*Ä" 1Ã.K€ ÏÃ!9!Ôl/xùW¹!:Á ;üâRS]ÞµÅÝ@œÇqr™F|é×SííP‘ýiŠ©’1}2ïˆ4Qæ Ofb•ë ¤ŸÞ•þ?Lµ*þùVQ'Ÿ:‚˜Ó³‰$*-W33"¸Îrpê__ŸŸ&® £¨XPf„‹‰õ9Ø{ëÝæ˜¾¾ˆ¯¶uµ¢DÉaSˆªZ^—Bè]Ð$ý&}S3úä<Ã}ªÉv×í ¶!Îqãp‚pl­·Ö€P‰,ÀÌ ŒC Ú-CSáE­ÇkŽÃ„[ï¦=Ÿé¢\´VFþ7]Ù4š¹ÂQ5‚®Ý~üxÜn›<íSQM<ú˜ã˜#æ$AK†P´vŽáYÎŽðá#g®*ívûøñ±ÅŽ9âõò˜±u»m¢1ޝ¯çs Š«ÉÖo{ßwqºÉyÒÃǪ¨Átì&½L8¦­› g”l `ùHÈá‰eÍ_ef`ÙT[Þ$ ‘ ŽRˆZ¬‚ÊÛ’œ~y¤1û’KÕ7IM8=&EÕšj«Az%Wä»BöÙþsÁÄÕÝW¦ç^N„G~O4”œ¹àMyj˜zWÕ´íMZf(݇s šÚSôBZG"®š‰!1çOˆôk°½ÈúÌOt\àÊYb/Ê—É2æEõ ´~ja‚Ýt3ÓL†Oçéc¸(¬Vj¨Px•Uj®º ¦‚ÀšQ '˜ðe³&iËz¨|³^kÄWògAÈj¨šƒ›Xà54½NÿøÆº]èŸXçmáeY‘•~É®7ê¬*ÿö×ò›TòbüÖŸ§æJIî,Û…?EÐo´¨Õ<½ gð­"É…„&)º]¯§:Ãæ4Ͼªß{" ^ß÷–K-K¦žä¶Êüeâ</9;w" ±Ê7…Ú.l®¸³2¡.¹° ù§ .ð-Mð²ËÕ!9ø&jÇ…GÅeƒee_KÔ„•“@1K¼ë™¤«rÚÌRZb¤xQµãœÕßÈÞ†S‚•”úq-õ7ûú›§Y:­,³çž?qf‘„¼Ñå/o,)õé>fœ>Ž1™×ðsút)Â-|rŸÓó":üœ„OÂDÛ¦[ߺšéÖzoMžä>"žÃ¿žÇëók/á”Ö€¼ÚIÜÎck²uÛ¶½Ù´×§?ù:Æk¸´n[‰M¥·Ý"ÆäS@ƒ™XWimÛDxžPÜî{k2Ž“cªÓxFœG– ·›˜DP›Šêyޝçëù531£©»‡gºZÅÔ Úšªm;Eìx½2V´m7w¯yþúó%œ:h¯1ÿ¼žÏ¯?ñúóPæ$@Q³½·ûÞµéŸs¶Þö{{Üì±+Ù4BŽî¾e­5¸kÚL;T¹}Dþã/ýËG«ÿÚíçn¥)÷9|¸CÙ[)óL’Þ’Ö!lÉwR0sÆÕ‰^£ßzȼõkÌœ§@ËNcYHl¹W.¢~>L¥€ ¶¦Øû¦B¿"–x°]/þ\Û÷üî4…Óï¸ëU¸w6&^g̲5$ýNH=N‡¦Ñ„›AE°ëþˆqŽsªº‡t (¼ ÀhªÚûF¨Œ˜ ¡CÆy¦ï&gáH±W½XóH¶@pzMïWnRUU µU‚¨´–QÃ\ÑW/!³ŸHDNԾʂ+¨ÎYe°²YÑQ¹˜‹<½¼N`0Æœs&F“º–È7À+tmC³ÔË7Ö-%Áÿpƒ~-+A( ‹¾R¦’W0³S©èºPµ]ç€,h2‘ÐbŠe!“÷©”÷¹›ñ±ˆŠ¬˜"D 9 ª]ž¥–Zp;ƒ*9Ž€(¬`kÖ¬[[òËŒÅb‚‘ÍD„^w¹ ¿­K]**MM´œsLø;°aÍö¶oÝÌ"VÈ_T[˗¨¶#-&}–Wr2•î-;n‘0yË9¼x81úÖ>dggë¡:#B;ïÝÔæŒñšõjöB”ˆjK-Þéî#ÜU:û.Âéƒf*„Ÿ‡Ÿ¯üæW²%LÙ›™j¢}¬iÓ)ALS’ˆ@Ætšœ·Ç]ÒÿƒÊ[3ó5^¯cÒz×fÔ 0éæasFäâTmŠœáªH7|~òùzaN¼>}¼FnêŒqœãœA5ë¶m›#úI¿´Çã<Ý'Ah£´¡†§r˜¶Þ÷¾mû¾·ÖÄĬwG0÷GuU² 6á]}L¬"-Y¦(L6¢tÀu‚™Œ*j%M‘xä®0­‡J¥êz|­‹Æ#J˜X1­¥Ô½Z—J˜‰ÃÝ«ó«~ f’¿UìB+”´™Í €D¥[ΣÂ9s¾™Ü¨„GHlêŽé¤ƒžQU1ËÄêD¿1YÎ^^æ Ld„!»µºM±™õMIƒZÐ&G~ª/4Kq“5‡ÍB?²•š"(<ä¬Â½01M‘´ I ˜&š*ÕÀzïa¯¾„ @M%CV@ÛÇÖ‹´²>5ÚX‹w§5Ýœ•Ьc/|kä¨_55¥åúÐe;Ow[CâÊ _IBI..›€$³¨D$Qž…¼l©©ŠeYe‡3KQª˜%8Çù9ZN¼³Ø½–HUYM­,/\V”eUfýŸŒ‘£p°I`Èo C”«^S…¸õë­¼`¬c®†€N)Ò:²œÍè|Ápp±ìIæiIêjd¯ßqÕƒKé&‚Uÿª%¶%žVµ51}·¶CR ΀‡šôÖ•2ÇyMÊ"„ª(‚á±z9 LQ¥©äd(<43ÿÃã˜ãîùI ¶ÌÈ‚ `‚cb†:·)8qÇŒQ°¾9ݧ#œ3ŠIÌRAˆxRbú€âñ¸ÿüy»ÝšJ”u߬­íÛmCßžÁß_ÇïÿóÏñ¯Êù’}"ãœçëPÎýÖnŠ1ŽçëuLXßiÊÝxnÛíöÝ>_¯ç×èM¥µmŸôqüþoR)f„ø˜ÑÈf¥‹È¶ß~üº=Jz ¶¾?6³¶mfMÓÉÌDB…–nÑpªXÛvQÄ×ïßóçËŸŽCo¢­Z@n½ýüÛ¯]6¸BˆæP¨õÞöÍz7"ÝXìÖ>î·ûn=F=ÿ ·Ç^Lz"šDÓæ <•œõ)þûæ° ïªÈÊ ^"‘%2‘bÉ]žÑjGYk)‹›H»m¼íÅ&cÂPœy|«cg¡Ÿ@øÃØöñÑëZb ÂCæ”sÈ9yŽÓgöÇî\•Ázòž”öjÛ9¡Ž©ãwÇlæ§Î™Æd” Z•â3¦O› Ó9ò.ëßT`¦‰ï]å«uï”èc rìe͉²ê†¹‹‰™Pê± Žº0vyU üŽ‹ yi‹*Ð"c°ï)P¾<ŸˆœéòG­#ð›FÍž¿D:9Å©š|ˆ¬fŽ7¤H˜±˜•×XÛZ.Ê P«›Çk$_ù¥Ó52!EŒ3…2oY”õ÷ý†ý¾4kËÿ…·¨ÞkÖÛ:²æâ³‰¼$BùZOrS¾†Ûm3m3(j­5WwSéû¶ßnjˆóœÏ—¿ŽqÎÔÉciÝÍÔzëm·ÖȜڻٔÖÚÖœÂeÎ83Âï÷}»m¹rT1>Žó|*ºí»˜xÕbj1ýõ:Æœ3&ÒòÍ뇇ݚ›†Àú¶m‰Ër•sÄœ˜ƒ>Rþ^÷ΓîöRbDÌÌQª{Ä„XÛZo 3fsëÚ Å&¶˜ ÷eÉ…ðÉ€|q~c¨5Š0&ÆIÑíöè­7u3@í9ÂSÃèûÖïn› ´i/|u$¶Ö§bN9#Žç×ùãð¬‰Á Ç9'ž­õffâæ£%wˬ‘âô õÞí~»·ý.}³­ÛÞ­±zS3-ÛƒŠ©âQIt…˜DKs¥U¡_:J/1 IDAT±@Å“:Å#gÉ“BU´¦[ßLÅ2õ‡|Ê,ÿ7èÎ+­5Yj±Â¡Nçáñòùò ±hK• ³yœÎ1‚Ãé,Áˆ9ÈËÔ`Ùó T­.¡SA±Ö¦¯às攨š¬ÐÆ1¤217Y¢MDKIÏí•dxûªÊ£ÚЬƒ²†+¤ ’ܱ•Ãî¹¼XGa^Ò’4s‰"êa¢¦J©&á×]È“’Ü`"Ú‘%þµd¨—Ö²ZJV‰ d¹8 ÛÏݰÎð\ÚX²ÓwԓÖT*$S¦‡»BT³­u¨.P³Š*ÊÛë¼”lé‡M·…/h.ÿ“"ѲwÏ£x‘ù´«È²ìcNNÏžr-\õi‰@ «1=–1 M’·Àøïõ…Æze]ã~@]ÄQz’ýåFÁ`?Á 8ý.œ§r2UаĀ–ËT/>N²H -å‚;[¾.e)"_ÅEM4eÆ qÒATä)!Ôbyÿ.}’XVØ‚ ÁHž]°YÔ¬Õ/-*üï ²ÃΪ@ÆmcÆùù:ž/Sí­a:Gšá#|¸Ÿsz²ƒ‰0m ö—¼‹h‡(EÍÔtˆ~ÑéH³8Ž8§p´®Á™½wÌ:IÑ›í»Ý7»o¢côfº7ÙoûÇ_~´ÃìoÓŸÿËóŸÿ<¿¾ŽsÎéTŸÇ×ïç9QDï1æëyÌÁÛã¶[‡p#æáA‡m1ó_ÿú}ÏÛÞ?î7l¹wϰ©âÖ”l&Ú­Ùíöøñóq¿›Èœç8Ï`{˜iÛDÔ4.MTC0çˆp$õ?áÏãõz=?¿þÌ1bÂOR¢‡Þ?>~C_3^ÓŸÇäé<+Ñœç9ŽÃjž§çùòeŒK$%½8yX{¢Õ“`Ò…EÖƒš ±€úBÑ+/Ÿàµtyo< &gzU,‰Náâêµx ¹lI ³åÀOóæ¸m*Í8!­÷m“1eÌmï??öÛÆðÙìŸásNR4kØRì×|Èö&›ë›îw/Ž‹‹»€¢ÍZW¡&÷ÛÞ¶MU»Ýç‹ç˜²4 OÎxs‘Áâ·äk´nÔóùòá°g¨Â¬ß²ïé.>ã8Çq`œçâefhufó_8ÅdKjzñêD´YßÌš3!H¡Xð¼Ì茵fy‹Š*¨ù™Ã#Zómk’Lëm»=}³·&%O6'Ñ{üøqûømƒIïºuEøÇœsΓó¿d~žŸá!’ýVXPæ NR0§öÖš4“¶mª Ö‘ùuŸá"Öo·ýñëg¿ßeßtßÚÞU ŽFÀu$HϹZÎûjwGàyLçB/ ˆ|BÊŸÞh’Y”üTOçˆ"¬ëûè=¥ …¶ÎÄFÄéÓ¡ÃqÌx¹3¦9TÍwK=ȃ>œ§ÛÉF… 1‹,`´:p!’§Ö²ù[Ø×fH‡zΑzeü_ªÞnKŽ$·ÖÄŸ™Gd’Õ-éŒÎû¿ÝÌQÉ̈p°ç0ÏÔÒÒMuw1IF¸›{H™TɈ¥ÿLX”Á–  Ψv‹€ÉŽtd==±áê›òÄ,µìr½2È÷ É8”…B†h¹ÊÆDŒ(ÌÀ~4ÖµAÍ*›%”pà鸀ˆ(·¤ò™YT÷mø®¸‹J¹òðíª2*@°!ñÅæ¥Ë0¹/\y­2­ÌˆV¬'Éj¾M½# µ;¤Í¯¡JôÖ¤}ß/ÚÅ Æ8IŪƒ7ú _ùJ»7õ©â–-è¨c5%êîÕÌŸàJÌ´²h;ÜhNO °©*5æ¯BóWë½ìΫöÚ+×þBì–q ªÔÔä’ ·ê£ÎB"J&bÚ Rš=i%.!^çõE¨rŠå¡¨¿`‰~±Ö¼ò—]¥-ÖRí‰)™˜un³F‰î¤ ˆM0Qpm“I˜%™2ýõ<3úîÉ DÃ×{ÿž¹U3I Cœ‰i cò|‡SºðµöÖcÎi*Tv(òÄmŽÃª©$E„0Ýãmü×z?Ë#Ö‰µ^Ÿó8lj¾Ý§êA$ŸÏG±3mÈ4!N­2‘‰Ž7üx<„ùvïoo?Þï÷c𙍑¬vR,:ÔLM‡™ ©{¸úmdéÊlаŸ¢2ˆ).€"ÉÓW È<‡ÇóñÄy–1ÂoªJ·»ýøùãýý}¨˜ð45Óq:¬ *,Ü­˜MõÞܪ¨ÖNA®ê³TBÏMßήÒ¤[ÛM&ßëß]aßû_”4«Œ|õɼÆ "βɷt« wŽ{~ÊßX±—àÿá ßjiê„áëgéâZ£éÖ‡ëZmRâ½rÀ×îõ‚´'+7U¸¦ I V""2NæÃd(7HË…É[nIì©î~šÙqLšƒYd‰¾z¼Bê©e”É…Ñ,­ y4:ò’qp¯z{‰»4õ€Re©.ÞfD÷ )2@ÈÚöm‹¯h•‘Ä "%Ö¢a‹½þn’ûw€×7KNöH£áj6†4´e ©Â•›U¬ªò›ÑP( ª¨#ôÇ1!VÇðx<—1§{ƼÍã¶üõñ±$ü~ÓnH]A'×lŽ$3=ΚJdUZ.C=Õ(×)7ÝFM™x…GÖž Oª}øç+rµ™x¸Ô,¥ åË?Øc0ìD]E›6×^á’¢ôH ®2æT´5¨Њs=Î×ù|ärBÄòf‚ŠŠÚPÕbĆ¿ü3ξ$Zæ¡6áë|ÿ¬³ì©ÃlÚ˜B$óvØ´DÈzˆG®p=M_þñ\¯•ž"aj<¦öw•Û—\ƒÍ¤µ"A$QC½(‘ r|º?Ï¥·1Þn·÷Ûñv;nSM“("x6;È^À&UHÕÀµÿ¼ðX뱜ŬEPeD¨öRüž(zÔ¹bE><ž™)¢:LÔ˜§`HŽmÿ­Ä»2‡–ÏŒ§ç+èLz$Å@ìˆDP  ¦¦£ D ùtùsæË#<Ù“–ó 3¶CRÉÉj¦sÐ,’uV …¤\˜ZT)+³ƒ|J1‡Ê “KyêZL‹:¯(óŽ_'(ˆ£Ð—/›’U”v •Qåèn5oMv’2‚¸¢ÆdÆÆLÊNðN;ÕÓJ¬éBT÷5ÆÂ×8QvVeÓ‚ÈWà…+ZM_aö’ìSv÷š %…S£ôë=Ë_'~’=š£¤5ø× ©5³@+qĶ´íBs|‡·S@Iê^­²aÃ$ˆµ$,dÜŒ˜¬æ®×®¦E¼,‚‡ R©¼0ßÀBÕ©Ol·åò2— …xE~œ˘£La;íž| oúÎti‘»GxMqj/¥ússÕfjÚÔ Ñ:í ¢s%mk /ÇYÑÞÜÃ*W\å먳G–Ëë¢w‚YF üHYŒ”’<™}˜ö|å"¸“ã|ž)ÃH‘y•L„Œp@¡ž°È:8êpïYù©¢«ÔñEB¸X]ÝzGU™Y/oá{MhûÈÏÛÊRž² Òºq ²2ìim⎮îxVj…{¤^Á%J_A"CçP"ÏO|z:¥’eŒÛÛûÛ Lð±žaòþ~L%°Üæ)3ããõ!Âd#eçí˜?~þE¤ˆÇq ›&ÃÆ˜‡L¥!.uxœ¦C™.Tþ×ÌF*¥ˆL%>Ià€G³¹•Ti”K¦ˆ¾Ý§Ú±m뵩Œa|c Or¬“›¿åíÇÝ«¢» QßÑÊsaWßÁÛ‰J[Š‚kÊ´ÁÆ=ìÑÝÀÝ8¶îÈÎm_Cмè,Ù¶Nî‡[žzøÈ¡¯p4:».›jߨŽ1¶Ì|O˜wtßdð5æø2ã‘\ª¯HÈ ¶“w>¡/ ™à$&1VBjÊCŠ•¼  ¹‘)N"‘\Ç:Òs%3^ñøý‡#ùÇýME!ÊffÃLKµxujer)ûDžåÏÀ5¸QUa)Ëi2«•«»FôuçÜvL”Ä @MoÖZÖviµãŽˆ¯—ÍÑu˜v¤¼÷Ôf +“.bˆLCÕÄ3§‰Šú¹Î•Çííýí/#'Dœuþ4èû¼ß߬CÇIòz)kx.ó¸Ý<×Ûc Οo÷cÜÝy-Ï<³Ú›I¾ÎÇã3ã3‘`+¥ž¥è#‘ÊDɵªJb.9tÙ¿>Rt}F:õ‹Ý^àË–#_ð¹ý4ÜÆž‚Ì_*F¦¯ˆRï ªà Dé‘î±ÎÇZ¯ÏÏŒXkQ¦I[ª Ù¬m¦$DÖ‡RžNÇ1CùzI’Z !=>'øi¡z!S´—EPFÉ ºØ¿íÝ£+ &À ¥éSN¡aðÖbfFPº"»dÁº=æ$ÂjjÓÌL®ý$"i9ƒ2Y ÆˆŠ3#’ˆ"(£ž‰éŒLrpv¢ ”uâ¨í™¯µ–{*˜á"ì`¯F&¨r5+ü~;þùÏs(H"óãñÌ\B®t"ý8Ž·¿þAf8ƒÏç‹ÒMôí&‚Ûó!+@? S†ûzeº{~ž«dÓ©haýÉTÚB*6å8ì8ÆÏþõÏÿõÇû;H±Ñíu›/'ï#r‰ÔnT¹Õ]+²Ÿyú.¿ÏS:%]…†¨aZF& †™š™)¥ÊT*&‹)ËZ›(xú¹€õ$¸<¯µ$r¤±ˆ*³1C/­6¸fˆõ†LÀ#™ Hq ÷Þµ¤E€šsL¨?>T$ÅLÌÄT‚)ú¹÷ê O&ån#*‰2@o±óFxnÕƒõ kÿÛ;›H—ÅÕ.ñcsŸiÃkú Ù†Ú@™{[óêÂe*_ç6<3°Â;Ÿ_÷(¹h *¢ªHx°GdÛĸޠIÉä rÕgvü”÷+Šª"xe…I¥|ø ¦‚‹ïU'†^k1Ò=Ý39dçW¶^mO{zYý Þ®\ªœØŽóôV¦âÅeÐæýs•§±÷Ü·JªÕ_ÉP:B»WŒ¯õ™tæ¬ÏIþûÒ )Jƒ•B! „0„#2Üéùx½Oa°jÍ&^ít_A 戨åW¡6ƒåÙ*ãa2LE‘Ž*ºšiS£ªU4DøÒÆqíÖ3±[‰Åû¾:ñ•a&5Vg1FHÔC73¼ŠmÄ"cNÀçé”no“S§¨\€S¾zÜÆmX‚DôÇýv?¤hëùÊL9âuJæíÇq¨H²TK¢fþÖÙÇv¾–M¤•\‰ŒØÔëý|6Áµ‘!/¨$µ¨‡iÿ!e2¥”‹ˆ("²Ø«×œ—ˆÛÄ]Ù@Ú¸‚¯7Oé²H6mL¨N¯ÄÈºÌ ™ò»1o.ö Ï8ãcjdDÄÛý8”ýý÷ý¼½ÿçÿõóm ½~ŸŸ¿ÿ‰?Ÿ'Ñk¤ÎŒ,ÄpNÒCÑÄa:n‡Î9Ž Þ~‚˜ªÂ‹FxÆ*möZë<Ï>ø•77»·B½MÏ$òäD2 Ûl…F]Yèë¼;o¨t̘¯Fò’z~+ï«%®Kfì3Ñ"`‰&³&("Ò=.' 1“d^$&Ff:GRíÀ¬û‹š™ñúøDµYOdÆÉg&E1†‰€–WÌÁD¨ž_£Áå+yB—Œ’Z¾É]”ØäLGœJ‹h1³êÁ ^kx*3„TxNÒú;ž·ùó'‰R$ëóï}þ®º†EÖlv¨%³RLÚ‘ IU6ó ×ç“(þüúó:ýßþó··¹2C8Kå牬õ åa<Œ(=Aª“ +ֹܑžÁB+Ç1Œk-˜0áÃxÖ§üdIU¦ÄgÐc­ç ~±rÆÔ‹¾Z ÈÆ!ƒx%½2_Ef÷X+HTæM†dÊãs­ßONã|QFGR‘ G¦0 t^Âù Uv¡“Ó¸°˜!*¦4‡Þ§ƒ‡äPF¦BBNŒ}!N0E¦îSïC”¥–•Qï-â¯ÑRMb{HJZʈ¯kõºœ™\|ÙÍ3¾›ˆžÄ(Da¦‚µ=vUñ¯YòΚp‡NK›Ä}ŽÜ©©RŽË—@ü"'|[üµÒ&ÈìÀ«5Ь$à;t[C¾}ÞÄ6õÖ „˜E!NÊ0„¡ƒ– LâÖNwð±5 Ïš‰´YOO-•ã¹’#™]³º25UäÍ ²*mì+‰iÕ×’ÀC¾þ£ˆ’_±«*e2³™½½É+’(=ÓTX$“¢Y9­#ÐîC©›ƒ²ï£{ï 1Ù¹…`Ôr;Dµ¢h…`Ø:KéÌmÿÝ †‹ÇÚÌצsÐ.•!*U0žLGI¤®W<ýÎǧqªp€=d½ÜOÉPS2kR$2)!Lq–0 QÎôê î›*zÐÿ0éµjªp ³ {y_Ûqê RÛ‹aYL'ßæ]Çë,¾ìkH6•Ê“0tJPu‰¢"ý¸½UfÞnövc+C#:œ >Hfí躊ªNFu– g¤<ã r&OÖ`OÆ D†™‹(‡XXžÙ>´(.9ò?»“Ô÷=QRÌw’©n`Òóù<ãLÚÁ7¡¬Vz À¤ªQ§+%­µÎtôx\`&sÚ46Iãò²3„ƒÕe¤š §D"Á„Ÿ7ýÇÝk.{ö曡œÖ¯9­“r™‚¿5êÞ|r%Õ~ƒq{ú+_ Wb‘ª{^ÿ5láa?­w—¶§Lv&¾QËe†§V»b×BiW•÷&ý¢©}ƒ*,ŠÚ]ØÊm`ê•zDz+W×·ÎoõàK%UHƒR ‰RXöšTÊ­Ûè n‚Câ« Ð߈ ùtQU‹wÈ"Z²ï%¡@¿RÙ¹*¬+JË$P÷‰H¬sQ"'F1|À:æûaGÆò•ÈvÅ6ÄW6ß•x/ÄûàÂÛÔ]9Ñò_Öÿ÷c ÜçšÒXö}Ë3VUw\øÒÕ ¬Àõ÷^¦‚**3) kÑ´ 3¸úĤ¯¯p3U'üúüüóþ…‹jB˜M â!áÓôþnÇœB”—žMI-[q?+ÕÜq¤ŸN)2@Å%('÷ÊŸ¥°ŒÐ^–0 ›’OÇó̵'ºúÖÝ•¬pT>#Ld¢Aˆ…h²‘°*ºl1cL&â÷4Á4§Îc¾½¿ßn‡)©n•à¦z!‰+|c2LÆooo?Þ߇ŠèÕp‘™ÍI‰×ãññùq>_ùtö&™&s’ 3†§Ÿ‘QÍÎåžáÄ$j6îó8l3eât?ËìSmh÷PÄ¡õHW1S%*&䊵žççŸÏ?Åb,Z ýdN°ˆ‚%wpšk–®‚!jCç<SU‰Äé¾b90ˆS3!äù\uà8’DuLµººP]è©Ë•ý.·DÔé<êžœ[ø×3÷ØÊ¨òxƒ© ,ÕÛ²âEmØnÏ?»ÚÃdìBZQ¼‰ ùŬ+zìß|ÉkÌÁò²+qS8vd¹¨ˆ"yÑÒ#¨×¿û¤S5OiXH Êœ,¨”ÑÆ*µcxÃ[¨ªÕ­‡Fq•YUDÙ–‘ôhè}–vm¤©W¼$é pÀŸÄ=÷Ná`zž¿?þþ¸‘3ªÉš 9^oÇQ(q®çŸÈˆ×Ï“?ÞÈÇÛýíýmŽ‘áçy®ÓÃ]DÔ43ϵªX¼Î…€¨‰ ÎO~üWùHmÌÛÛûíÇq˜©ª¬Á,¢œd¥¾UœHŠ¥5„ð heáµ$8yìè‚#“ÄÆxÓÊ,ÕŽ!¥×hú qd•ÄY¹Èå<‡$‰j²¼<>±ô.7ÜýÌȈLAI”“áÑê«¡$Zï æ4‚žX~zeÛˆ‚™=u=Ï$#8OÍS9˜ÉIiz{£9CfYx-…ÆuƈŒ(t‘QdÑ`’j KJ°z7¨…h ™×Ë IDATBe[,K]Œ5i_+3‚D^+de8¤#z¥=% ÊE]͹úŠí{¶¼{[T1Ö¯çÆ,t–£nëI¯»O¯Âlç–ÈÒ.ïuà³^çü•áMâ,Š$í u?D¸Õ‹ûÉýNo+O£!¾îûwQ©a©¥9÷U„9©ÊÊûxʨ;YY™Ö2¢¤œ4¥BÜׄª`œD¥YqH Ça¤ÄK)Žxýv¤ËñÛâ–€÷Sºƒ°I-á ÿ‹ñÖó8–*3,ÊW3O«%gSÌ9:® ]ÀÕ¶%$EÂk?S.=“&èÓñ\i–ïFóf?ÿý$×Z ‘ ¢H…g!³P¾¬ $Àö²Š˜©šŠXÊZêh"Êúǯ×é±Ò½)ªª*@ÆBºBëêWÆÑXɦÆDD ª]quˆ¾—¥»„!á "b9à¨Åš€Äjác­5Æ8¦Ù°yèœ:»ÝìÇÛœ*%àTÓ ¡º ÖgΓât5¿¿ñ´*ºr)à•O¬ÂÇÛý~;2@œiÆjJª¤CÔ´êôÕå¯CmFTNuؘÕEæ _áõûF¤¯µÖªÝ‘p ñx<çóóÉlàùW@Ä@´Îuž«[}¤´ÁA”‘IµLåB´þ‰y9==#ÖXÇHR#ì½X93X’9‚MÔÁ d¥Ú!ʬRmr«5W­…6X·p%%šHªaY¤ëÕÎõV’Š„÷“+Ë Ç}Í…¿N¨VÕŠf¡ôD£—j•;"T=´Ô•\̬¤Ì”L§1܃•Â+CªÛÔæõ}t¢ÿQfþ¾6åktÚX»ãma(!,$*UÁ* ¯YìgÈÄZëõ<1îã.Ãw,’WÈÇÂçbØ1¤ôŠ&{dzˆwøé«bBD§ÊXqéê{)R ÂÚSÒ‡¶ õ1`îžØÎÂ᪯^éþ/°U¿‹ó˺SçZdËbjS²‹è²OWû_÷­”C\hnnè-•î%÷)=\Û æìïEäÂìkãÅÒK80gÓߺ5ž=ïß dó¾wX¢QÁ¨ÓDA÷ D¤Q–mÛ©iY'…¶(‰ W~§+/íñÙ½—ý¶¡\‘m©1\IèëçÜ0‰Æq×£¶bqWôtÓˆ‰`L©-æÜ Ëí¡à¶F0‹(‘ Q³;S )Óc,œXUਿœ§ús,5ÕLkŽ8…øÇû}üóߎ·ûq?lH¦¯'ŽyOD¢J"´ÜÏåùøxüùõ{­%Õî'AøyúZÏÒ^yžþñ©Ê"d6mÞa#”al¦9Ç­3:«Î[9rˆ$K(ÔàƒØÞ¯VÀÕ.híÍ1e²ð¨øÃ¶Cµbªtp5P0  ë´³¨BITÄ/ÊüÃ,Ì ®hð~«„J¥{fŠØÅÜWøK%MÕ“>?íõ\œ úÓ ö œ+!yj®)©R»*ÓqYyÝD”™)#ˆ€d,#œ½îÑaÍâQdzƳžóáªV:2¬LªPÝÉíÂv׈¼ 85bî3Ö”²×Å2ÚZ[þÚ&ªOÕ*6Ä¢7ÏõØÙËAÙ0ÐodÖÊÆ¥^yÞ¶ÕZÄBX:ð‘±U{¸³³=¿§íHãäkøQ_&ôO²K|ü «ƒË`Uóû}÷¿v{DSÿ~(²÷˜mµé;¼GeˆÉP3Qi ICåvR>ÅÆ5pnÊ}:GˆÐ hs4·²†ˆÛƒRØÞ¿ô]H.Ët7Z“UqŒ$"2‘Mg¢‚b:TzÔÐÓ÷Úu¶n¸L$U¸!_þZžÄÒ«t×[#$XI!*D!L?ÿqûëm•$ÔY"ã<ýõŒsÑZ|Æë|ªÂѬõW%ÓÆ1†©ˆD‚4@ë|­çK™ÛÆDXÈŒŒXG ‹êaì™ë|ú²8«© M,31‹0ì8æ›ÙäÀóù|ú@}h»fÙ qFÄz=9 éþzë\îç~5’šª‰’¨y¿ë6ó'(D H:æ°¡¢l¢²_4Rø"(áñÀí1 —‘DlØ9=”uÎ)sÌ9ädQÒÎUµpTË:™£ª""5E¥NŸÄFÃþHvw÷ØG4RQÉÌ··ûóy¾ç?þòÿ$(³¬s}||~~>ž§¿Î8Wžky8˜Hjûà¢j›P†¿à$t7©ü­©2¥É£ŽÂ}çl‚a¥;’ }€€ÖF\—‰èÕå(ÒþíUYƒ6\eßM÷* £–y§ ‡Ðr$õú+£ˆJ¬¦•ÝÂNä_%aÚ11úúö·vû¤DZ@6¢±JUn¡ý&g¹‚z›ÕØ!~ù6¸Ý­‚ÞoÊU\IJì})yäyæcåßõÿü×ïÏ?ÿö×íÿ焌óu~|<_“ýõüMï?EÜLôç»’@øÕbL?=W÷’•õ˜z¿ßÆ4Â3"$µ° …ˆÒi‚®RE2_VäN`el‡J³Z3(S™“4ÅŨÀ(}eêÀ @AÄ(£÷…¥»ÎšB%ò«ëIý²QjgB&é–K°^§a€‘k-÷Çï_îÇøyÓ7#¸ÿú|þýXAú÷Çú1õnH¡gµ(“sÿF›{Ú9Ù*|F“"Ê¢ÐTGkš Ï•ž“qWúkšŠ™Ålkf.BÎS>“ƒT4•³ð@”<Ǹßo"=–º©¦ Œ9UU9e=e %Ÿ¯Çbv!(ÛЗ)%{Ð á9ïýxûñfSÀA”Â4TM”³ÏŽ]*DȲ€`ŽLJ7)-2;5.™I‚VT´9ûÒ!¸ÒQó Ò9 âàa”ˆX0›r®ð•Ì**‘šije¹‘ç+Ö -S°ª@ì :Wd¤Q¥i<¤9+Rã§LúÒKDTÊ2€r–…\¹8‚@:ì0%â¼RpÂ+üéQm¨ n-{&Sr¦x2AH”£¾E܈“¦JV€ŠÈ4¡Á‡©ˆÔw8ÐSä=@—#êk%mfIÁ×6»s'|¹07lx§¬)éß+Ù‚°Óö \Ó úöœÚc„RYÕßh_ŽÑ—ì~,ÖËXÊ•Æ=ºPÙÚ¦GWY_î¨'^`®òðõm WŨžà4t©HÞõÃh½eмÈPHëƒ{ïZÊB)ÁOr’²ªètYŽvÓh•DöôûêF—Âf ¡©øõ7ƒ¯øg¿yAL&< aY5;KûJ m0´žé æÅ ÐsÅëy²ÈͬFQL°ÕVQ†éT6JŠPÓãÄF`H±Áü=3òåŸÿúóç_ÿŠó´îÅy$JÌÓÆ¡¢”‘±|A`?çãÏaÆS)8<#V"Eåài±Œ1¨Š•¤Ä8Ýió‰j*[„㘷yŒÛv °ÜñäÚüõz „±8}09x€=b½Â}M;nóJ ií,3ÎuªbæëL¿çÛ­éám¹h¿{%áÊÊäîÏGø©ÃX$"‘i¸tg–y;æí˜sªjDÖR¶ÐFZxm5Ñ*cÃD´ž™ýu•B8$Sª°u{^*IO¬*¬"57] VUQÓI‡Ž[ƒD×òû1>îÇãy~<^ç²'¹s"²Œr""lõðÈÌÈ©‰N!›Fdj \ªÿ K‚3àHR¨æ²GŒ‰ pjc­¢J_í…­ûTß2¤þ/‰ˆj×R äEý¿¯™e]?¥ë{U\«i\qÓø: }¥†quEz.ßidé vEWÕ„.¦%óÅeç¯lÆ5 ¤½óã‚ð5îè=v½âòƒÕi²î¾Î|,ÿø\ÿzÄúÿ÷÷Çò¥‡'d-?UAÊÇz|~>~ói‡ªšx`y îk­žÄEmªsØqÌy(€X™¡5œAéÒÉ3j²“éšC?¾+×’_"öj})W3/ġƱ,óôˆ<_Át2Q¢}jV¸ ÏìvNcå{`ܰ¤nc™™úãv ŒÖvEø3qº3#“‘ì €¯åd¼NÌEòzæZ‘ïÇûq¼2¿O»ÏcЏãÏ+N«æÇÁþX+òó¹Ö.'·Bvïírlm³J€²´Í¬ò-R_óçÖ,î»èÖ¥òÞ/¡íëDF#dÁ-è è«×¾ÑW¹þÛ?é V=¢$‹x‡ñ Ùã“®Ÿ']뼦 TÉíÛÜH‘~ æv eFØz"|i öV+èÝí¤Üi©V·¾m£-«Ó(~ÿù³^žki}šê­(®€ÅÂ$$IL*üÃ7Ÿtɲ>úZ¯ÞŒzÒjSþ¥àâÕ(Þ>éÍG)˜¶pa¿…«Xº ‚>]sËLè‹çô«¨°Š~ðA„ŽyÌcªU¢µÖ¹VP2çmØ¿ýãö¿þz5‡f~…{dĹΠæû1æP_N¯×Âj¬d²šéþã‡7D¾!‚1̆͡JPÀ˜E8ç ŽO‚ 6ƒ"ÁN€$Â?åIi‡ŠÒœz¿ÏûJRgÄ.žoEŒ°24Á‰ôÌŒÒâ ÁÓcëõ8×™¨)a˜ˆJR’°™ã ›©RpàØªTSµCR¼Ñäq0‡Óˆ2§¦×mLUYëdÑ›äq¤±QE;(oBAÁ Sµ9Æ1†Š&Á:š‚+€š°R˜yæŠtÐ^N¯… ç\~æÞ˜Æ˜ãÇÛ;‰}¾V°FÊãŒUÈ£LO?#V&÷_Aù TtO)‚_‰H 2g‘$ò€G2²ÜMZ_(îæì–m¾pí¿|*íøú–WâTÉ^U¶$€m0a¬±ßõ¤ŒZ÷S ¿ýÅìLê¥ô³ËZÌu¨H6Ê›w™Õ`Ý/…‚ÅÔƒ&‰)9ü"~º•KQE,Mþi%yTlfÕŽP„MtˆYw2Šâµü š'<"‘"­ÂÍLšåá¾>¬NT±fRFWhï…‰+šVy!‘úiyïIü_÷•ˆº^ì¢ví/¸µÕ8+EN³¶ˆ&ò¦$„(‘j2¥©èî)i¤òYÍšu®×óôpbÎWÁ8¤ž H^¬ æ—{P*"ÝW&rÃÆ`ÀŸ¯ß‹u’³ abGyÃê6’JªÆÌ‘á•+*PU˜rÜÈ&eúùì«Ç[Wz>\MDøéÏgD¬óL$ê†jóþ"9æÛ<(žŠçýfÇý䈤DˆdøéL8Í×û}sˆj]ã*I¾U „&<ÍæqŒc’Jd’‡4Ø¥Nss c.ñŠX.%šc˜ Eeº6àE!œ€Üóuž‘9M'³1̆ŽQ´/e©z«@§…^M€0DaÃ,€ç¹Îð¤TãÛaäöuYˆãî§u§ HŒ„ f¹Oö§¿žΑ‘Ídñ(¾JQPúœŠËù~F¡Sa6iÛV-ê„ì. ÷ZPÁ$ZÍÜM[$álBXí2jÚ„ÌSU‚kJ=ŒÌ/,ïå–åÍÇúB”6¬Mvêã’™÷ˆ[ÝB—›….w .w0®*w©aÂ2”‰)%#p&i'qHØÔû÷Ésè1„×CÿºM;¡‡œK>á‹Åù ø"!Ò#’irã°iÕ*oÞ Áb–‰ñZkyú ÷ÌéáÔ½Ž£p\¼§Êƒ+¹ëœï*Iç*âg._ÇJPÒœCTDE9’h¹¦[*…0i–½ÛHL¢Ûb"a«kB‰jS¶-!¹5c•ʘœ™P6VFúZ‹òêgžËg’E©0®êÈÇ)DX•«“^vˆ¬D&e½aùŠzñî}^}ÙrG O[f~¥A¾ ˆ#ë¼Þ)ú6PŠÑ ­IÃ^àã«uwE†*ŠpU€;ñm›¾¸}h’Àî¤u™…ØÝBa¾*Ç×ô®ƒôßáWµìÖ÷" ¢vÜæ¼B*õ +*¯[âžLNÎä è1çýf7baát:Ï<ðÒKôÅ)’J$ÄÙ ¯=ô¬?k}—’ëú´ÿ@8LïÓX”Dä+¼ÆþT ´J^õ€º¹x× ë“¥]Ó¡B8H¨¯YfAʬjSŒÅXM‡ê1옦ÊÊ|?ì˜F¬šX6íœ(”é>mÜxα"ý\÷©sÞ8WŠÚ1Táñz¾k¬ä` FëSðJž–BáìO¬§¯ÓA¢6ç4V c !©FI¢4­"µÌÂ’ÀJZlË&ÆÐcÌ›Ýnã~Ç0Âá™[[5f6&hEœé+""ÃÃ=âLb}Òó™ŽD1ȸòq™R1µU' î–qÁtì¡1Yˆ‘Š18V~Ÿúó0‘dNQ;sÁIñzàÄ!ã0˜¼޵ÄÏÁ"óðû;¿ÿ”c¤¿Îçoõ5ÕlsŒÌHŠ1ÌæD×Û)“´0žaψ3ɽ¦×‰uNŽŸt*ó»D?™NA7Ñ!ùBˆ©“R’ "SÈj@/\»P%1aNbòL}„|<"°‚è¨Þ̃EÅ*^4-Õ¦#ñnëõ«PDèKWüµ?§ Òf(Øä›ð‡ÒÒšâYçe¡hÑe&o胴–lÈËTÜoæl±A,6gC&%sK÷kº×:4(%77€:³ Q ¤^&I‘@FKb@”9„yTU¿¦ƒì¸÷û¼nÀmd&RÚ,¬ŽçJa°˜¨`CÍ6¬ÎcÙ›­ž%ï)). 9Jä˜e²#»‚X¾¬Ú`·Ÿ¾Íòª³‡kð5Üüfl¥í~é(}…è¯ip׎Dúñ ºŒá5µÁ7SzÜ䯔 áT}$~}>?>S·9þøëÇúç_þë>?üóÏãñyzP RJ›4}»ßïw­µ€¯³ê(8®¼^çï?çË£~‚رçºW×âH”Eµs†’DYª³R 7bfÇ12ÃW˜ÈP95>Ÿyž+<Ìê½¥ZŽÕ4çT!V†gt%¡;""¬•habÝÓ…©UÅ\Ð>Ò̽®Ÿü²>ÀGæ‡Çǹˆ@2ˆÇ $Óû˜Ó4ágxT˜D²¾— rÏØ.žN p\|ƒ¦Ü ýv¸Þ—"D¬œÕ »ºr;S_r ÊZQ‘j’U",¢[¹µ¹‘I¬¯ï#¿;¯ªm#e{±,½ˆßֺ➴|‡¾º=›/ö ’›fǼSXûO‚˜!{:Xcwa)|“˜ÍÛm‹Øæñö~{Ÿcˆª é|œ~ºŠ0!Ö3Ö‰œ [œ‘~ýþõË£"Ü‘š˜‘ž) µQ’d îw!¥jD“Y·KD„ËôU¹¸$ž™ª:†UÞK»’¬ß±$£…3R&:ww_«ŠªjE=PÕÆTÕ™$H‰p!Ƈé4™ÃŽcØøÓÞߎ··9„”R žìPVîõ+"ÂWFxœëçÊÄüóÿþ×fx@ÔXD2háke>Îøóx:y édI[:“Ç©ŽLALvÈœcèTÊÊ 9Æ0"øI@"L­ßÝà“gØMî·ãf¦à Ê Î „T©¿Åxé Ivz<_ë3òE”̇Û]_ZE7W{w¹¯|ž¯×:Ï e<°¹<„%°¨Ýdt—y“iA•ÒI˜Èz¿ËhRùx¬üï__Ÿ¯HW ~~ðŸ÷ÄÏé*âäL ?„}ÜøöCüã8&½~¯_ÿ/Îe·ŸúþïrÜá/Éçûa÷·ûbùyüõöã¯ãÎÂI2eAYà&”ÂA±’3@2=—&ñà4¢7;جx&¤Ì*¢V(&$'z¨O´+by.×¹|‘AªE.cd&!ß&Õ$"ÓÞw÷¯tmÔ¾¼«]SN^ݻϤo´±D‰“"`Ï3DÀbûý\ðOÈ–äÔa:M?ì.rVx-YÀÂzÓÞ”K€ ý®Ì R&Ö«CO¥ê¢K&ÞSþÂaB…‡0ƒ=à ªñ&—z³™Ha23ó¤sEf/$ë$SOùJx±]ïJD,¡Âuï7h?ð!({kF…Plô¸`è$õÃWU=“BË‹B]‹®ÎgÂÑÉHë­@C2iyP˜U¤æ>ƒi^¡9Q&(HE„™Q/)=TU^È“p²Ä˜žx¦>©gª²pÈÌ1R)ƒ"žÿ?[ïÒ$I’lçéQU3÷ˆ¬ªžÁ@°¤ðÿÿ®°Â’ ŠP@€èÛîfúàBÍ#k(˜Õô«*+2ÒÃLõœïËiY•`&Vÿ #Ü&ˆt &ÖÔ=DA)Ha¬vˆ»ó9çlm_Ç® HHHZÓÖ·®LÁ4…¤Øž@ Uˆ¼¡øKcãõ°ãPðívã&‡ÏóñsPfGf„³s’Mò$—}ûcß{SÊæžžäÉ[ó±y} Ûɤå…RÓ&Kçaq:8Y"ÃÏQ0Ÿ,²`î=fLÒºö ƒ}*XX .?š…Œ^Híu ßZ'iLBd/?¯iG¦,’RAoJ×$,+°\qˆLa¥ÈsŽÓff6‘½o·Û® Ï‘^g‚HÊ f «*‘¬ïÉ…8©Ýz-¶E`@*@Ra÷p«‚8G¶²½…[NŸÃ_gNNÊØ$y‡²4¢„{ø 7!¢kö&W3>¨ ¿B‹Õ §¬6{U‘V¬÷"¿)œUPÉE¿ ÊoÐbd&_\ÏoÀñû„vùJ­é=þ¨’ï{Äú­r’Hr1ÀèÍW©Ñõè˪8æ2,%ƒš¢nWÀ;#äOK´pÎ×ËÓFïySŽÏì´ÇëyÎàÈÖ$‹½HØ·vßö¦ÝÜÇnso²uâL3ÿý1þúûœÃÁ•Åt¢ ä23›{ÔÒS¥–s倉d¢hEëã$¼ò¹­áíZØ’…g9‘æÖ‰(2™ð`D‚"àWZ˜ùb³¬µî·Yï[mŽËE_áÙHgJК.DL·1§™—~ AÚ¤·-YײÔ„én‘A\ãxФ¬=<ÂËåt÷KiYá±u¢\\u~§QkoFœù¶š]wÙ2^´£*1]ï˜|Kd*^…<¯³/-Ò]Ôc=ãòå¬bú¥Á»:wô.èÞUš«*„Woáâ¯U„¾7W•K\á-ðûË£bsƒn*[ç½÷_¿öÛ"Nj,’$f˜Î猈yçóž”is¸­(M*,äéq­ï˜Ø‰²:ûõiÎI|Q¼¢I‹xÁhùSêî×3!‹2/Â÷ ŠïžÊéÉ)µ_N€#*¬½"Œ”Wàáx&‘y…eˆ02³IjSfÑ aß;m-Ù„¶Æ²˜Cٳݙÿ±µ¦<Ï9_'‚•›‚µp‚ãœ>Ì#èô|sëõòº¤#K %`FiÄfî£å™6AÒÑ©³rZžI£Ãï»vi¤vÞ÷¶mM›2S˜û‘û¾u&²#Ã’8I©™9 jS·ìÚ„%gŒáÃ9’©4qó}u½†PsÌÁn7ò¤sšFñÁ*×êFç/³çœ_ñÓ”¥Ñ&äž|žÓçD2Œ{vµTå­uÕ ¥tã¡úWà+È<ÜF“¾Fœsnš?@;ýõgüEx9+qçëþ¿Ï® IDATn|£ÿaµgŸÓéhöÚÔåÐùµÏ¿?Ä[Ó/jêíþÏûßþóönq>æóß5Æê„ 6VÚî¼í ›Ñ%´ Cž™AUUŽh¡""­ËðXúéPm\½-%–ýà„Phz’ÝÚé2Ì(SU˜ÙÇù4ò(·6ÅR‹å¼À×ùÞ—Õc( 9”œÔ8·‚dÅûß[ƒ7_“»tõÕH^³ô¥¾áE”L–Í+VZTHú^Ÿ“¼Ñ¿o_fÆ Î1Þq½2Ön³.9o2l¨zî&2Íá´p!Wî0‹À"@cfÊŒb%¡Þ;ÿu\`a&‰p*Ø„s¾wU$™žÄ fQtT>žPáÖÕ†X!ðò;Ä7Îì2{½]$V£œ«Vý‡sÌ9­‰´­‹(êå)”6±GÌ*ŠÖÇ{MJD’R j,¹r”d6mÎ#a9Áhûö!°]ªëΨW^¤L¬PZ±Q‹«ÞœécQ X„Ëñ<±JBÚ¥±HdãcDótãªÈ!’Á fUf’4©U`Pm sõI™U[0N³×qœÇ™ž¢"ÒY…AÚZ³@¤ÍInÒfëÊŒÈ|Mk¯c»ímS@ºƒõã‡T­-ÂÃ|5QcšU®ÛmÑó¼ã¤tQ,CzUÐ E\&WKÇ:•ˆ^–km­õ­ÝﺕzŒ Éáa¾Ž a‘Î`&å˜sœ¯§‘ÓÍ—1KtUÃ{åeçõß+ %M³aÓ=@Ôõ¸ÝÏíÖµKÌúé›Ì®Ü[«fK\6hÕ&Ìù¤If¡²øUÎÀ|ΕÌLâ¨T:yŽ#ø´#Ã4‰0g 6–ou)‡#“ƒ9YCÚ¥—ð¤NE™êýåkç•Už_}³÷ѧ0 ×”2+?ȼt×:‘¾Ùœß§z×ÂñúgëàÿÛ™þ7&òú¿oY^½…Ñ¿®øöš3ERT·2)PÐÔ Pð…Ùuâã®’1Çy>NŸsŒcäqÚpÝvá­kPš'˜·Þ…ÅÍÇÇyRÆ­÷¦À9ýõ²×1¦y\*À\ý»õR=ÆHC¸‡8˜ëaFYHâÚ¸‡‡”G‚9/² "ÂÝÆ™–fá´o°°"ÍóÇqQ]V-.\‹Ä·sy-L®³ý"(Mw"âT$…d’/öc )K#É"å7Hd*Sm"Q WÀ ZèQˆ’ß¿w—úxw=¥ß€ÿ…ÞáµW¢‚ QŸ«õãë­Ká…‹½¦"üQ *0—1mbឬ'òE»B•0Z$ìï¢Ëš“½#@—ˆ¢&gqU–p%U¤Ëû~¦êN \Ý.üZQujYÃ"Û¾í{×­m÷®÷[ÿñ±Ý?lãŒ1æñúú|Øã¤ê¬„ŸÇ8¬0÷W2à (/¨ƒ°#ëØ_ Ñ:?€Wÿ­Ò¾QôËZ”pÛVWj])ë Ï×¾È/’r&üBŽ—€Ìà&ªBfay©GO‚@I¢,¬0E¹àžaÊtk¾7‘Ö’Š´Aî[l‚¸eÛᜇOÉ„‚4™œd:ùsÐПgë_üëE{8·Ð‘rÚÔyž‚S¥I&þûãñ÷ÿüoŸÿýÿÆùìááÎ*û}ûñ³µFáÈÜ÷íç?ÿÃý?>úfîÇó<˜£ÁÔ$Ѥ½Ææd^›(äÅ 5åÆàF,ÂÚÍ<͉Ìcú´°EL§´$Kò€-sgUmñnÌÕf±˜Ÿ^Í~0 ‚ÈõS_ÑtÖÞ5W¾%èòèpþV¡»¤¶Œ|ÅG™’É*â« 42ƒHˆ‹`/TÔCðõ$Î B ÊnYÄÔ¥‹Dâ7r8¤)HÏÈižYü‚2D˜ s•ìÂaÁäu %+s{¯TÌÈ ðŒˆ«šìÄéÊÙ¤†¸T~·Z¸(!À®Â¯G픳ÈäQ´|Šëo¡îCQ|†0 ¥39Ò§¥Ù¦Òt}m"í=ÃÈ ê2C…´df`0‚¹¡íÌJLN8qœtÌ4³ðiç´Ç«JÖV8äúº”Y…=Y<"™93Î9†MЍ*ÿá×T)|Zxmq˜HØ3"ÃÃEô~k¢ J¥w §ŒðÓf ZÕ9w"_óÏ?Ÿã9“dzšEf jÑZG0]µÓZÁ…6’¦Ç4wíÏ×vë}ÛU{cíÊ"  -±9¥f#<#Bµ"!(©¨/öFôÖygñöV2!.j¯“îôÑ´»Ï2??Ïç9¼Iï,‚¶¼ÅVté )qÇjݰ{Uäý²ãÆ/½¯Óï+:ðnÔA /ÑgMêóì·0Ï")]™‘øM0t©kß ”:¨E\èAº4vX-)­ßEp¡ÕQXXÇ7~=ŠHîkî+%¨ß:™™ &&hc¹%EFãasG|~¾žÇ¨Ùw—&÷ÞŠb.ªEfeÝ -%ªDlæc ŸSá{‡{Ñzɼ0å¶×jÄAb,y—+‘•ÃQÑj|G^6 Ý”>¦Ù4{·» ûÑ´«$`”¶Oµ‹^ÄKTóÎ{­Ó.GlXuËûQ Oª6ázé ™AîF”Ú¤©")-’"‘–!™Ä̬B ›~ÎifE^·ÛE”Ó¨r­DâIQãëÝ@•BY·ƒ*Ô^óU·¥ßX±å€&J^ª3ðúæ¯ÒðÅØÊ,"{ѰQ\kb‚sY’‰‰terª2|Y‹'|aIév±ëã7´ßBëˆW$`M³#+/D)\´{4fe‘¦¬ºîa‘>$ÞÚv¿ÿñëããÖZi’¢ö8ǘó8Æëùõõùx]È”(9œÉ/“ «H¤V]<Ì}œB~ÛekœéáCMzZ¦$¥”²»”áE²a¢¦ºõ~Ûš¨Î€;…nrW6÷qL4“™=’E”„’ÁÊÚI‹„× îÚzÉ<2=}ºY‹ÞR7P3Ú3|Ûû¾ÝD•˜˜S•Ó,<’“$œ^;ÿ¦TŽº¨IpR"âNG°èŒÿ?Z^ð5—1ÇjÇsõw²jºù±(¿M7Á>~æ9ÆöïŸþù÷ëõ2æÓÝê‘n)œ0ØK;““ÒD÷NÉfæµd¨8½¨ðÖUÀ™N&8¹ÉùÏmžmN:_gz¶-·›§„9SŽ­å~³í–r»sk øø]ýCùÒ¼ïívo]OŸsïþÇ?í¼žsÇ8OüüSÿúKõi$ÚþóiÿûýÇ?nÊÖD@"B¥oPéÄ›ŠÙŒê_—Ϻ&‡–Q’8¡õyœÕä»,£¼{ÅèÂÞŽËDÁ\ÄàJdF ï׊š€2 ®v\¡.÷¦¶b¾ó¢ˆ‚kè_37R"V·¹©ŸÜ jæ¢Ä’”ÀYa%¾À¼ތkÍZ1Äe ©å?.ªÕŠÊ”öó=Ž«Ùs—ÕÃC=Ö L˜†,t{ÙŒcQ€`PçûÕšò³HbqRzzÄtÏœ¤"Ì™4#GÆ…„BP8iíu=ظBOß$´b ûbÆeÍ1f„)µE­Q3YÒqŽÙ[S%"sc* kFT§‹Š5VNÓ¦»)1Î1ÆkÌéf1̧Y“Ål¾?Õ`Å)D¨µÖE›03wó¤–ÈlƒÇÔÕ%½FŠ—vaQ&jÏa1iÖšž‘Å>à=^m³éóôæ^–zTsÍ !""§Õ£î ƒ(„¢k±’ÎÝ~|ÜY¤Þ2 ««@ÊÕ½DªŸ¥.àò4…Ÿó9&ù%óL0¸ï*]Y¯é`:Åé‘NÍ™•p Wæ#èxsÎqÇóQKµ¿?ŸçvÿÈ`iJKdânžA¯çùùõ²é™°Hw”ƒ—=°¯TÖ|IóJÊP`N^“XÄ×ëOíMû®ÛÞ[S°Rk¬Zs±7;3£5ݶ¡KË ÷ÓÝ/ö Ó²%ÔÞl· ÿ†XÞˆ¤ñLé~fÊM¥wîU3œ£öU¶Â õçHw³"©ùÂ<'ý¦-ÈÕosÎkú_³âw¨ŸòjßþNê›—Öºñ]äÅïnô•´^•›ˆ‹j]³Ž÷o˜ïUÀrà­®1]•$*&ÅâªäðÎK{ë–£'HAÁé][û™HõÃ<ÌÈêqnnÁ¬ÚH̰Ò\ ã$sF„{²ðmßzSs¯"×8‰Ü¢,Vko›ë^¼ÿDõRÏÀõ]|ÍZ ÕWYKv¢$òï/Q„}o Š3}¹êí4-#×÷/bUä2V¹>nb¯ø’[¿_ê«'Ã¥D„ w"ÜœX¬Ì$­Sëè]šB˜jå8ýõ|½ÎóõfŽHŸãùzœcøå?­ä/$‚xeØ2®Db"ϸðßדùÊ*ùº\^9¿Z|Jr,ë"œ ›F”Xeÿj×Á^ÓzÀ¾ë.«®S£s÷ÃDxRÔ#hµ–âzF08{£ñëÆ·MÒÜÜ„Ð99,}2+³P+ 26:-AU!¢óÇ4bÖ^„¡öððB•¤¹îhÆ‘aqšŸCÖ~†‰KöCŽpŠ Ò ,ÉI‘‚ì,ÄébÈl2 T('ÉZ"s=B§{‘ĉ u”H wŸ>í’Wz$´µ:FLdr5y"koUcDÉ$óîf«ÈéQêbÑÕ)¯¼Z„o}ÿA-Ѷçsúœ6¦Ùs 3Ë ! cÆx&$ó•ŸL: #7$AeuØ™a6‹Å÷±}ð0{¼ôñÉñðŒ!·lˆœœž­Åí'îMuÚ•n#ÿ .ºéÎ4=†û#²évÿ·ÿtÿç4Ïj/Ä9âø¢ñ‚ÏeìH$Aö›™Ç„Ð&›.ŒTn”妗ÑfÕ\ù­èC9e¦EÆ{äå`©Þk:¥·b®0‹C‘b^Ö⬶•¦%)‚ݱ¬LLÌÕ³@år]‡) º¯ÅãZoW§N~M¸ ;ÅsÚ˜süQgïëŒ ’„IAö©NýL ák…´¸ã—0±®CX6~×==,„,£`8•`¾+ ò]jTV¢­´VQĆˆv!ÉÜ`´:ž¾º‡`@´˜ÃIN9Ã.h½{ƈp° 1܉HšÔÞY:jGÑ +Ÿ("`‰:åø:8‘eÖ‡åºûT ?ÎQà3“µ&®aUBY{ÝFÖi†}ún×9Ü #éxž¯çsN›…_Ó®Hr‡;2’ÒÃ]X€¾Uã”…w âh ·û¶’¹ª™Vµ‰„D s8–6ݦ ›ÕRyºM °_­§Û5µ ®öGQ£H˜ õí«d›*ï½ CXÕÜ—Í3”!¢5O/F”Ît#æ¶o›ˆ–TwØd@Z#–¨gRD„•=š¥©ª°2Ïaç9^‡¹…ªô.`RÕ}¿7íá>ç3SúNZ9!ªØ 2|¼žcØç×ãëñãd"axT,óñxlÃÍÇä a‰$hF­T@¡Dˆh\mu. ÅŠ ¥[P}xøâ‰’‚œÎAt‚¸±ì}k]µAruóéM/´Ikë'Wµ0æ<Ïá%YcFkmÛ{k"893¦O÷ OyâôÅ›QE»éöÑ{Weîä¢åL(¡^·Õ.ŽZ-…Î  ™\÷~ºþIÉ«2QÝôuÄ_sýZ2½ùÄù†;Ò{w’—ÒWÓ·$}TGªKSuó.àñ7•¸’0þw}äķ߉Ö}‚cRúµŠåˆ¤˜³pŒñõœ$ÔváÎùz>ŽóqÚ4só:e1[›së²umÊÂP<î€5¡4"µÙh¢*êµ~¹þd•§ù}ˆw¹@”6Ãi¡ÊM¡ÂHrbå°é骥]FRšÅœóõz…û¦M»Z…EkÄ¿Áî‰Êzáìë·/N‚¡[kÊZ@žµìbª»X\«o|SEûó*£¶à̘Ó(½j[o¢øÍyKanákºL%ÐDzoÚXµò9sÎ1Yx’Ì Ho…·g³dé+áy¥ˆ‚(—;©nÌXÈéÚ)Õoq‘éj³à\6¤È•­KRþvˆMª…süî¦÷û°Þµ% (ÇÎ¥©CªhÌ Á[*,ª¬ÚÚíN}‚xÆ8_ùŸãñx<Ã3Á"´ 8ç —>/ÝÇêŠføW¹†þ5í'¡UÃM‚¯ÒÕeÛ®yÉêDQÁaÓÈ/ãÖ;àT÷ÇU¥³ÚÔ8êRzp&Â3} –EÐH§tCZ-Žk·ÛD8(ç8G#DKc€Ò=AB­m›t%lB²é³ú&ÌFˆ9í<˳í[ÞvêÂÌ­m˜sšO«8¸¯ %ˆ8„´aÎ3l*ꀑÊ)!4n›Pi‹²0¢‰‚ETM«ˆ¼m7à>ýœvLÑÊIfI¦°œ6Îi³¾¦ ZÓm“Z R°[˜MóK,¬5Nµ03«…G±^ ÂMb ?mL&(y0«*Úmû¥zÿUÜ÷9Ïã|>æy¸…YŽÓÎð¬‹a’O?ó,B¥‚z×Ö Öç¥ófáf´N­% ñæ©E3OÚ¶]èƒSì•sÒqd¸åˆÐ6¤²¡ãuØÎéáÓC[ã{å…siÒÚýcÿñÇ.$L3b©¶½·]Ñc¸QG¯ DâÍß,µ¨ˆ»§ùfÈ%qT-§ŸîV»°ÈLH2lÎ1f‰Hצ*JH&–Ä\ÐT¡(À6q/–ëÅ ^áPª÷=•ÑF*ûâç· 3AÔ¤d‡8gÌsçLÎbÖUœ"Aˆ”$ 4#%šÛ|窤âBÔ{’2Ý//RÒˆø¾Œ$Ø ’å3¿ˆQk…îaN–œËù’Õ™HT8ÇËjëôÆq%Á… å¬.@?´Ê˜Ü€ ´°D›5_®‚2 § )Æ•8òÒœoïq&£}~Á cxx†›¹™SÀJª -1XåD~š½Î|œtØ9íe~žçs O„¨‹.ES¦…ƒ[ùÑÍM¢0u8@D¡œJÂ\h<’ˆ%É ™Änd3%!šÚOž55S2¦YŒkô””A>3+ßpu‹ß»iai҈§$ï[ûØ7Ví}†'h ¸·-’ý˜æLlBu)QïÙD+å3ɧñ-á6ÎÃN#ï·M5#hÍÅ#'Q­Ìté½€¨2D0“'ù wB±z,ÇËRÁ²2MF6sX 0Ó#]êçs8aØœsT€™)DHXÂ9“µuÝ `@U˜+ÇEÓ&“da¯ùФ°qD˜9˜žIÓixiÉ#“R„©+dõ7Ì<ÝëØÂf>ŽÓà H¸›Ÿ ¨ŠB*àD$<Ã-<=I„ÈÓÜÜ)œF¨‘HCkJÔˆµÞ«ž3Ò iÁC@ mØâv§l2³*`a´D2 ’‘ XʉH·–t óHó†” ÁM‚sò0éöJ÷É}¶Ö™Ú‘ÁHº`8;/˜ÀÜæñ:}zgý±µûÞ¶6’œp¿i±ðÓ0ñÆU&ŒŒ2«Rãƒ&Ü‚…S¨ DYE )›*µ>Væ% DÀŒ1›ÏsúqÞ¶þóÇ­5ÉäLN¢È¡-ˆWeheבå?¾¨a«¥ËL,ÅâRn{dú…Þ»tà¨%€Hà™ K»hºžéî@©ÈVÓ—îÀÓGd„B‰C9é‚pQrÖ³Ÿjõ¤§„D´²¿õÓZ 9a&\±³¨„H$3ÒÂÝÞIUv¥’u×G½Ô³ZBì”æ¾rõ™/2‰Ú¢%ˆ¢`‚T¯&j—ü†"‘¨“«p»¬yüV€ér¯¬ZáÌ’H„·}¯ÏÍ0?sŒ¥=Ÿ•6w«ÇWÎÔ”ŸºoÝÎ<Ï ¨væëY¼<ë^™°ŒpwCT«pÛÚ/¼ÒÔ\£dæle…C.óôš!¢ÚâOŸž !fÞº6½1H›xÄóyœç¬kQzPJC!2ˆ„w‹ô‘“ôÖ·&Â͘)š‚áB©Âª™‚°E¡TY¤H–aþx=çäû¾Ñ¾ sãð „!œUcÍÌÂÓÉSÅi 9å8Ï×k¼^sNgFë­ï]…›V:&°ÖS UL_6^¹µFÙ"[ßô[Òò|÷®ÒuÌé37gßGë4F)Xüºÿ”ŸQOÈkÚçãu¾æ|Ÿ~~}>Ï1ÚX{ÓmSÖÚé°Gu$Ü!Ü´µÎ—e¯´k_²Ãç‡{=AëÄXu´óœd”5P¥4?çˆá§åq³ˆ­ÕS•¡…þO#dÆ ê–±²Y­lJêMÜûÇ­+ RŒé~žÓÌnª,t…®„ÀºµÞšàb 1XÌ*’ >Í/¶cªj•ð½ë­QxŒ9Ï1Ž1Ì+H~Ý3<+Ÿ6mŽ `Û÷Ö[¸OE- f$Ù‚b¯Ç´"âqÓfì’•¯¸t‚£÷ 1N+!0š, ÚŒô ÷´9Ò§ mM"aÉfÓ}†±ðmß›@FaiIÓÂÉÎ1ç˜ÅV47s·Öú¶ÿ¨gPcdPo•m%¸"¬"ˆ„Ï<Ím˜¤uÙ÷FϯÇÿøŽ¬mÛwÑ·Û½òNcŒ `iÛ<‡Û̵Ö' ŠIÓ‚(êÁ5Î9¦‰ö½«2SºÅ´˜§ÛkŽžÜ:ÚÞ¡²í/Ë?ÿþë¯Ç×?篟ü‘rìÞû®¦d;÷˜Çëñ×ó•Á‚¶iÛ­Ý6m*@u•+È …’pk½®vN(ß°”öÎÊÆ3cIÔ¹Ì_‘>Ý"<£Î‹î9&Y„……ÃŒ¦…(2B™÷}WÕ ®MxRšÑ8G¤‘Ñ”¡ûÁö…±±ÿ¼Í?>:kO¹ZÈÛU_|Ì·õÒ”^|“·ü;ÛÿöwþËÌþ»ªyÅ–-<û×òwïêwTýj¬áõÚTr±~ÙoqaA+ž”)LAxÎù×çsZÄ‚ÜܧÛôqº £4Äã•6“ÚÛç”#Ø’‘u— m’ù¦Œf.%"ÍDZF…•f™îÓ½rœD^%Ü:ÎD”€YUøª%@XHKx}¹¿‚ )…~Ä›wyÅÜSÞ6vf©œEÖžývk€R†(BÉ™tÌ™DÊúî\¯„+Õ€ø="®"½ª4eÈ‚ˆ.!c’¢*ÊN'™{L«c?Oº«jÓºÿ•à=DD«-é„TÑaÜXE3PÃe!Ê1?Í-ÏÈ9½Jõ­{5a’ZÝÁÓ-"’¤^ðŠœ^mòË1]Ø«ÌXúy¾ºçõ«s^:k\—Ù|²c’êm‰ë5üžýƒÞ¿š¬ðKµ$‚ÂëW'f4ÅV¼w-[KÔ˯mSm*‚ÊePsÎ'Â(ÃÌ^Ïç1G\½cZúƒ\,ºwÄ.rYH«ÿÆå‚®¬3V4©8¹LH’Fp Qgú¹±PÖú°ˆé^úÙR0¸këªõ=>“,ÁåüA:gfÐt2ݺhó0³3§)ò×]~ݘÉm:…7¥ÖZÍ%@´ÖœÌ”À –ÔMn‚‚"Ù#'Ù‡³¤QÆ$O‰ÐÒ7QÌ4PTÏÛm«Ö®4j¢L)ï ê¢Iéëö(GlIÿÒÖë™uvOJ7“¡ø’ÕqƒU‰‘h36•Ls[dAeÓmç¶|k¸w.ábUVˆY?–ǘ°>Ò)@Ô{SÝo»6q3›6ç©DtkÑÙ,Ûá4,çŒa6‚ÎR.¥sL¸SP€\[`S–½ÿúñsÛ‘îÁl9_c¾|X¬ªMT<Ã)¡´mòqëªjÇðƒ«Kàáá zõÙ¼h|Z~x¿sæ<’8ú&žtèÆÆÿhr“lš5.‚„èÛÒ[#† bIô´_M*ú±ù7å7À|Ò»ýMo¡ÒoQÿÿÕÿ– µ2Boš;~“¬§ço%±•J“x2[ÊsŽót7O£ 3(eîàîƒÌ®?Âä,Á _‚•äö<Î9­r,Õg]yµ÷I³p¨AAáé"ìDÂGð#bšÍMR•Ÿ‰ƒE¨ò‚eK¯×­â¡U„åJ’ƒ© mÔ”kõߛдswù—s\Ð;Ç‚·^,%W²1<.ó ¯þÆ0ÖFK¥õÎÄfÓÜ‚€ÖävÛzo‘õX’V­Š`m¼oM›R®¤^ýno%2–Ž× é~]í®”(‹,– ÖoÅÇ–éߨðKÌõÛ®i©†ñÛöi†—±ë2bëæÞÕØ·ì ’¾æîKGÇà&Õc Gæœæ5 „¨roÚÂ"«î¦¨¶½÷½·®(ðÙ¡49G¦ÐûÞ¶;ÚnË8´Ùó¶©0UÀ+Òƒ™Ñ12c#RUåÌÙ2YödmýþÑï»î«"μIkͳatòÙ·-3ìçô×´¯§1Q0@BÒ'îsl ,-cæ9‰R(n{#êK’“sJ 5É ÙÄ2’N‚5µˆÚ’&ÉÜp¶95½Kœˤò•;#™#3|¦=TâGr(ÌÈjC¬o§C,AæœÈ  Hô€’¸Ež§¹=‰ÉˆFq8cÅYêÁSYCMB88BÀÌà@ŽÈ× š^h ¡£õ³Ýo;Qæ<˜L´¡ß²mÚÚV´VòÂ|lýßþ¸ÿ¼wH&òšÚ/äbfRÁ®¯ÅlaÍT¸AÀúü—ÿúþÙæêóXTœ†µ†‰ÙD{ÛXZ0SÃýÇmÿÇ·}Ûtë]¸Qð063]U7íM´ÕÂÒUnwp&aX>žS^§xœæ¯çùzM·È"E†Ûë<šCAfö8Žç´‘䱞?Bù«ËûŸ··íÞµ©´ÆÒˆU3çÙó9¾¾^ÏÏçx¾ÒCD´5Z®Ê\:á ÂŒ¼ÂÖÅ’^ÄZ)Ç•Èd I…òñu¨ª¨ŠˆŠH¹3as²Á¼†í¬ÂuÛªã8(š¨Jg‘ â^:•RÌ„çÅ2*g³H}:S ?/Q¤zë½õT(§n7ÐÍVß/³#Ø…$INóÏÏçëõ3ΙÚ÷_¿~Þnk©"Â"M ïãU:ÅDzk“š>àºæ¶ƒ%].’$­7Úöñz=Ÿçñé?ï?î7dxL¢jªÚTÂ2—?8Ò#í|Í9EB8µµÛíF 73€zPdXÚ ÂÝÌ"<Ý#cÎבî.,¬ÛÇä×ÿÇÖ»mÉ‘Y–G.ªfî‘H’]ÝÕóÿ65kj5™"ÜÌTå2¢@Õšæb‰d .fª"çìý<®9ŽsΗ½¿ÝYéºÆ¸&ª¼ÝúmïBn; „[ÀKT™ÉcZœq‘F¶l_BŽ#÷ 9Œ¯+8½ ©ùãûtNô'Å®t¿?Þþ&÷ÛÛÿõïÿøŸÿãÏÏÓþù×Ç?ÿúüþq}>;Oí·}ß7b } i]0óq=mNÂcûcß÷&D6Ãf¤ƒ„šª2WkÖ¼lIpc~>:âUëX\ì¦i^×°ë˜a~Û»Ùüùy|ÿøüþq¸EM,`b ¢àöÌ>Ÿ–ç“ht}ïòí}{ÅŠàÀ"”l—OpÊ®ý¦Ú'OEÔi”€+åïV©â—–“báá¿V ¯ZI"®é+½ˆaîë·¼Ê8Yp›|ýñË;Ó)¢o…P~ÉasݾòµRTYûV¤ØˆØZ¿ï÷mÛŽ1ƼŽKÎac &baÒ¶ð+Å•¥Z¼VÈŸ¸Ú,îE^ÕŽ ‡<çZºnÛÖw\c>ŸgøH€W}€Áɪ­5±ðm°ß„™zo½µj:­öÁK²ácšGˆ¤5–NZ=Äê+Œ9ÉLD^,£p_(.¯Táj¥®‹Wÿ…ݬB0Ò_w¶,™1~·Ý}-µ~ýuÙÈ^å‚Öû%È®ž0©rׯÚ0Mwš’ˆª°jÓ…h²¨ŠkßîÛ~i‚â$ gúœã=Âá]² “ŸÏK~«A`‘sLŸ=}O{Äx‹ñó™n…çuë<ˆBU{×ÇM§ñt?'€'ËL™!™Âœ Ò$Nq´+öI=TX"íœÇÀE (¤µ¦Ñ‹Ðp¿íÛ­ÅÃÍ(‰¥‘hdN6¯(G$'‚åœâ‘žÁ4Âð œJÕ÷‰Æù7M– ²UT#ÓÝ#³¨ÃI$›‡‡½"uëZ ÿñÿþEëűÂêÅ0^ëXá­Ëý¶omoõ÷B7ÖwîèÖTd‰¥f랤Ö¬_`ZPÉĘén NœBpŒ`šˆa6ç³qž×q¤¹>í3Â_'ƒüþœá#ŽÓöC7åÞÚ~Ûn÷¾ï}SUdÄyŒ}~|žÏÓÇÌÊÚ(1Ç­k»m[ï šQº'3sXÓ]DmÆ÷ããó4Ëðx#QÆÖñºÇ†1œõ•%0¢ñJ.P¼¦¯d+ˆBÅÈ®¶¥+15qLP^>æd{Wfât!0µÞn±Ëu JgjF>§]WÆ$Fë[XøP¿Øm{<$=’ç žÆ0„™ç5òªàý >ý:F’ô­·ûÛC›—ÍÂøó‰øx>ǸTø~Û¶]+í>Ýg9ѹú{þeŠécXÚä´"”†Ô·€¸×ê(ˆgRfGlSÒÂ,¢6Od6Ï@Û§Œx{l¿÷ &Âwjú€kÌã¸.w'¿ß;QÎÄô(mu"Ì}ŽÖMU2íšfÓØÖùŽˆK™á–n‹„éuÕ'•Mu¡½2ܽâÝá9ç<¯‹ Óìó8¿?>/w(;#YùöçÛíñF]]õ íúqÅóÇgægoÜ›ù;['•×zò…@ TÒá ä¯wÓk—RŸñÕ+-øæ×e ¨—_1£Ýý«àóÿ;øÿª©þÆ¥¯Øõ¦/‰x!YI—Ù˜a™ÁUc²$OÌÙçh lÉHÐq2×°Ëó¼Fdî·M=†ç´¥u¾<È¥vú­QÅôä=1_°¢|¹ë“'$؃£vü” _þ×üýu»ª*l%²º¬ë.Žê ²¼Q„L×Q{õ‘‚€¦ „ûÞû~\~ÏðUI¨ÄK.ÁL)@q.SØ â‰`í#Í™%ºgF¤¸f·cö®[—&²oíþ¸K×p³1ÐÞ¶mCâ:®kÎ…Þ4¯xS d#l:Ü`i´úbœrw/¶=ˆ9/jdí_2AîËr*\D¢*^޵¡Æ/­ÄË@¯ •ÎV~ÕÖcíx‰åé}mzÖ"åk‹¡åÌÍ—ç€4m…µ†Ð¾ÎþÄ­·¾oÛMµgÄ´‹p@M(2ç˜ç˜«h‡:Ö/iw! b¤RüW}…õê$ÁEJÈ2Iy¤¹ÏéÙbƽɷ»¼m©1Õ¦ä$¢PÖ&JÄàHÌaœQïÎè»cÆ<9¯·m»·Î”6˜±µ¼·jú&‹°j@=nŸÆ©"o½Ýš0ê]ÃLµÉY’ˆQ”%YÖË7"ÆúSr ̧„@Ì­ Òœ$±în"@X‰”XDX„¥¨EUXg¦jô°¯±Y!Ý“Òá#ê « G:åW‹™ekÄ™AiӃšpi³UÏØãî™›J(§DX9dÉÁž*ró>E¹ìE},Ÿ¬4µ¦³5·`NZÈ“FFf~^ÁÆŠý~Wm‘9†=áÏ™—¥ˆõy%a̸5%彃€.I§ù1=b€ä :O?ŸCÉnݹiý8÷ÖA1Ã3-}¦ÒÎté"²±ìMÖS•Z"6w‹i6¹‹°Pîéw³w»ŸW˜Íéç5Ÿ×-ܸdçNÃpMÑ–3r|)CÈ•£a´D|†|xž`gŽŒ$–¾A˜Âܶ›Þn­µ’0Q×~¿í­«¥9çœnQL°ÁÑË<‹ð¨xü5ÝÇ(@‚ÍÓ£X®iT°Çet9Ó„sL¦ "ýjç¯w s=½xuZ*Rà/m/T¸ÖйRÌÔ›Þö­wݶv¿mÇýñ¸7muünMn¢êɧ;&ȈšßHjÇ•ÓýeåC™†JdL7wsŸáC—ŸÃ.¯ØÆHsöìÒëõ'­[–½ùj1}fÀsºL×>³]Ü:˜0/‡S§FJ¡{Ò’×å(ˆ3áÊH˜¹›gÕz2×ÿE–£'SÖ¶<÷.oû¦ÂîHRá¦â[7ó¦Ò»6ÖÌ$.ÍÎ"YWÞªFTÈTfnªÂRÆ ZˆzÆ×Û²d£&A’%ÜmºÏ9#V,"§ùn Ìë*3_kì·-æ¸zOÊË®ã:Ïó<žc÷&"8Î1 –šLÂ! Ç`+V!ÓgÄL¢@OhUvõ'_óÂ\œPú‹¯¾dJ`„g Æ­g&1»ùdî]EÀH˜Üîý¶™›QŠg°4Ü$"mæ‰éf6yZ\ÆÛN¢­èC’·1æ1üЦ­õpÍd§L—­µÛûãí펠qÅyŽkÚó:>žOB¶~Sm—EøW¦“KÇ«Zî@&¿ˆÜB‰È5¾¬F_…šíR@;»lxRr'­ó´­ó¶Ÿ×?~úÙsôã<ÆsîíñïÿöÇ~»ýµï?¿Ìyn;ÿýoa>Ï‘cÎÌ`avàš¶ÏÖU›öÖhÎ뼆0HÝ3|ÙïhåÙ‰D$abó²r«âRò¼Ìæ<ÎkÌ™‰1ÓS,èšN”ÁM}$’›4‚àéøøÌ0Ž­]£»åuŽ?Þ¶÷?nÛ.²¸a ÈÖóEüìùêú~Ã'¿P=Õ­\´«ÿBJ¡/cèï‡þßã@_{úÍ*L/»ê«y«9 € ¬®¥D¸ŸçÇ3—[ûmß´8 ½ßöÛãþñqüõýãyœBºÝ¶‰sfØ ÿ:ç½ Kõÿ¿H)k3QÇÅõÇ_ÖcÐk=°†ç*쫵W¨„W¢¦ŽâX£çu´YØ_ŸºHfâ…–yåÔ -‚yVß ÍÝ| rkýíŽóòó8/3Ï”J¿ø×rcEÛŽHbWiB$µ!X_ÓJÈ„[$qoÌÌT3÷pgJvó9Çœ·ÖZß·¶íÚ÷¦¼ÁöDˆ*K³ié"†Ù°sž“ÁÄ ›æ6»5e!N¤GŒéãšnNDDVµŒJ°V;/’jæ—•’˜( @% ªL¼¾Ìòr $%gqü¢ªÒ¥#(p|íþdœ/FíèʨᵥY6s¤»£ø£H)²ï¶3 ÂÓÍ‹p–™ì–an6§+WÙ…ñÂKñ/Õ½ã—?;_‡…—·#î™þâ=—4ÒÒÜDî{ûû{ß³Ó)˜Úœ#A¤ÉdŽëüø8ÿú öþ¸3©¤olœöñããçÏ¿ù¾=¾ÝeN‚qžÑgr2H9›$ÈGÆ•3 åf²UƒYb€"òâR„ ¿V£œZ¹+Hži“‚:1ð%u[x@Ze!âL–Mó$° ©4Ùµµô¨ú¬—˜$ëX=جC_œÉ…“SõõìNÀÍr"'ÁR0e&‚D!;ñLÑÌ@Ñ>³_(Écˆ]!”ÖÄ{/”7.\m“Ö‰%™AÜ»î[¯À9çõaq¿õ}ÛÍ=§uòÁ<´GÄu] &nʽ½½S±_Ü-#¯ÃÏcÄù<éxŽŒl÷íö Û­õíâk\¥» LÛvÞ·ív¿ïÛÎ"Mµ5a®ÇŒ("“G ³'!”ED3Ò 6á“"Y´ob§MwI@…I{¸‡E¹½8\âätpohäÑàNˆHéM¸1sï¸ßÚã±÷m¯*|cf¤¹OMuvºÎ9®éé ôÆívSs{ž×9‡¥š³"¨Ë´^ø•u¸¤ÿF¤ÓâjÈ"S Œàõ£Huå\´Ýõ†]ÏøR©Š[”R`O¡ÖôýqûööØ÷¾ß÷Û}ß·­5ýÚw2gÚ5ׂ$µ5e!áÚ>º»gÒ«ÑcHÏ0w›×לq]óæ^UL‡¿4Q(æ,R¿:Ò¤ 1™Ù)÷ÝZjsVPb\6ƒD‘·¦ûC/µánsš_#Ì"É#Ò|9Y™ä ’ Ž×=Jl 0X¢r²%ôh[kHO" DW¦™um …L™R@‘š"|-KòUÑ!.Pä×óE䯊D‚àˆœ£*¾óל3#˜¸¤Læ Ÿæ^["à ŸžVb»1üº,"EŒç5Aª]ÃCà@^×¥Êmߥõ—‡óåIÐ,hò äPð à:¯DR!Y‘JWˆ9"ã'S¸vVU̱3ŽÚºsl‚ÙE`GâyÙø<¼mÇÖ;3€ZƼlØІf&ªmëÚ¤QÓ싉¯j×¼®çõ<Î1¦ªd’>>ŽŒÈ`AÍÙ3C„{ßK¼H^E†­ðm.yg,ìQðÈœDüÒ'ZÀ AT®‡â“€yÚ׸ŽOvIÛ.ŸŸ—îöø{oè£ÿ1þñî6î]þöíafÿú×÷ãæµÐL;&èDkºõmÛú¾ñyN[1„‡E„0÷¦¢43=|Ž1.÷i‘™ƒ†M›-·¶w½mÛ¾oDrèõ×÷ñÏ¿~zDë[‚ÍÒf^Ì16<žFm÷­‰Š%ŽOØ`e L+ ZÆ¿· IDATÌ Ôí]Û­9WQõר}鯋#Y™âW„ø:Ëu ªsþÊO—5ñ_»¾u¾¯VåïGzy²þÛ óuÊgB„^¡âD ë¶^9Îs>?A̬êžÇiÇñݤÛýííöxl{¿õ¶õþñ¼Îk^çtó²`8¥Ç¢Ó¿x™+9òJAá ¹rØù、Q¹rTÌɼžù‹@ý„X!£5±-U4'b!Q¾jÎÈŠ(å—Rž€„•*(“™RÔÝŸÏgýûo[¿ïí£«[$JdÉ^µ“ f¡1©`DÌ¢4ÀKHÌO—ðD¯º8ÃmÒ¤kŒ„[˜‡L7£5jz£.s›æçÓ}zÕx§ÇyÍq^œ$ÊvÊð€{½=§ÃQ—½´9mÔŸ¡<ŸU±¨ð;3)Àu´þÕGmhK˜V])Ä ¢* øYƒ+B½‹©Ø«¾¨^ëKTÀ×r6ùU( Z±Ø,1cÝ”òUJ¨(Tä €š(©ü¯˜!ÓÝ9S˜Vó”Qëïa–¥®0VÔ]æ Þ¼Tž¯o—Ëh%Åxþ `¥ ¤DÄ®\ý°.òvëìèt¬ØÓœT{í„gòeøxŽ}ÿχSòiX™qZ“­mLafŽ$Žë¼ÎR2ìS(÷ÆÂ­7Ù7n*|Íñããsó´Hº®is¦{¥rºÛó<Ž©ÌB*²mÚ·†¦ÜJÎr&ýõ´+>>Ïëïßúû]Ej¤\}÷$ú•ý§/’ûo'üªþ«*¹Nò_ÃŒßë¿Òÿ_9Ÿ/è«Gðuø§ß]Õ„ñÛ¿ä«ÛÅÌì]Ux{ Ëaôù¼>þúþùããšÁmû6â›ùÞ…˜Mûö×÷ÏÏÏk\£v+ÛýÕPx•+£¶#T&ôWš‡Š{¾4Ú¯Žo®Ô²÷ák‹ëÜ Òëj€/ÆýrÅ®òõËøþò$¤dÉbæzÀÕ½«b†LܪšÏ3UwmÀ"‹VWp„õH£L€=^ }òåjB}”V«­)O“ÎH¢}o×¥™É”q «´½Ïpž×¸Æœæow`Ì™6NHwNj j,²UàÚÜ=áæJÔ¶ÂéESQ›óš6 07«smÑ<ÁHJç@F¾ìãଋ,±Jå¶~ÎPÉØ¡WZx­€¸ˆžüJ³•F›½xlœõëµÞåz5Ñ‚Ôod"¦ÌHÏL›)1G³v ^-LIˆØTûÆcXf‚ =ý•E«‹ 3‹†Ñ Uð÷Ë\Yßluü­ŸgÊʽóco»¢Kv±gŸÿÂp¬±M3 ךz#ò ¸[} LÉD÷ÇÍY}^ Ÿç'Z!Jêt 6ÐÒæ’u X¿:R^tZp($¥ç ³uðÅG©¤a"¢Ìz¸§g*¸žŸ€$6p‚•Û:k/Ly­ãˆ‘ÁHBj–‘éDÔËØSÁ/0¥ X-ZÙv‘p³>£;¦¸ÒÎnN’U𢦠5 ,Â½î—™á «@_2Ê)FB¡œFäÉ,M;‰zB"—¼ÂÉ™Á°$Ü3‡wÛîè ŠÃ/àɘ1›6fÃAŸæóãóG2 ÚS7Ò¾ÝvíˆZߤ5b¨Ìì8Ïçó°9ÉÓ6æØI$[§·›Þš¤ÛÒ•JTŸæ¦MSÉ9''˜93à¹ÒÒIdfáÆe%×uÎI¬fv|~Œã3É23À¬Rœ‘a‘¨q3“KÌNÎ+¼¼~,“Z«(½7Q0‘DÊwp„r$bÌéõåKs–uwÌœ×ô9a™¢´é¶oܳ´1·kš óYÐÜÊp¾(Ä ˆ\âôRè¬RÁájŽ/W=½~×ר,€à¥×à/éã~ëMþ||ûö~¿ïÚ[o­+«Ðª­/G$ qyJE”‰3"ÍK?DÅc.@ÂkâÓüx^×9lz©Ñ¯9¯é‰¬ÚvÑé+ã¶¶í½1SÄ\oî`þ1æãx>O¿®rk|ßûûãfè—‘¨>n7búññùýûç~ŸÇyu¦ë<ÎóÌåk»ßn·Û­ÁÝÍò$¡÷í:ÆyÌkT«½ñýÖn·¾uU&fôÞþöç7býñóø|^ŸŸ§Í™æŽ¤…Ç`{¿í[×{#VÖ.ÜÄ)Ÿs>¯ñó#§=T¿éM‘^ð­\Ï"0Vhú·l>@µá¤Bsù×tŸ@¹æ¯Y,¾b×ü{ß÷·ñšj™Š¾X@T6â…«+Äâeª3Ïa×uEiSÕÇû[ÿ8ÍF uµÔ€OËéé?~*…6Ѿ[Š»IaݪVT¤ùÅv­`É‹cöú “óS–Ñ}ÁèÅsª}yÒb•—£üI+UkªÞhí÷é‹ZQ¬W×43¼¦u”QRÑ}ë,R$´Œ0¯d2²>A¥§ dvL¯ô%‹4DV-A3aå^­Øy±Íˆ‰™1=ìÄMË7¢¬ ¦ÖÚý¶»WŒ4g¤_ÏÏËfnÃlÌW ¼Îr¹‘sC$ ”¢Äªœ;å4¸ ñyŽó¼ú¶?w›sŽó¶õ½k 8‡Óaø~ØÏËÌ © l¬7é’ÿÆáæ3Aå´MŠt‡WC ^Õ’x)Ä~U·_üª—¢¨ A.¹¹/ÚwSi]T¹LÄKcP¥­ Tð7<̘°L6+w€Äáîsªà~Û‚Ø<Îó2«"€0)@éæ1Ó#˜ƒdÝá„d*¾*xé*ù¢ÌR ŠÌœfÎJ‡"9SU£w0k£‹ŒJ@³î·ÚþqÇ8§ûþxlm—¦Äú~»ûðƒcPÒ™„H<Ò"ƒ(ÊÛ`‘á`dç VÏÛÄöLEÈ»#b^_02¡µE©ÛK$Í@&‚‰„$ÁìDF$I"Ò¥ ?õϦG„EX -1)X˜$œÈ@©¡ui¯­A½hTñkϹ&÷ÈGòp»y~`Œ‘Y³ÛŒ´ œiH¶¤¤¶^ߨ“MO(¡,M„‰ÁâPŠIMuß¤ç „[ÝǼFŒF>¦Ù´ŸiçÎIs„Y~h0™7ÝDTšÌ˜?>ô­÷íNšÁsÛú~¿¿=n­µ öð?9Æ8Îóùù´9÷¦ûû[×+XÿÞ÷cD¦$Ò3Ás ¥C92ª°$AJĪ´i *b¬s¦ œ¾$LBÊTUoX)Xo· HŠœc>ϰ @))Êa»„–ux—r°)˜É_p¢ßƒ#Nªc)^a]s7 é·o÷ÛÞÿíoûóÏ?úÖ²TܙȲ¥®÷‡Š6U.›ˆ°¤‡SÅ3"ÝÝÜÖ['àfîcÚqžÏÏsŽÅRÓWÿ­|ሕrͦČ..ŒÉ«dˆ¤Ã¯ ËœLK(h@¦3 ± ëbŠDH4V%a Ø“2à]ÍÓæ O@âq›ƒ#àî9 ÷†ËÃiXøAæ[#¦œ­b®k®Mš¢I0I M§z€1•A‡€U"f¹\Ì9݈’˜š*µÆZåà471®sÛ¶}뢴<_ymfJs¶F*\Œbvßö»j3‹óº®³*œ‘f Ö5A–8§¥¡XE]‰{xÐL˜ÃÝ.”‹Ô‘âž×¸2,ú¸=¶{ߺ’+R 3™! ž`Î…ÿK‚'Â}X\”C XP$Ǥ1qà9f´ ›/ª\Â*k"¦Ù”X´µÛN¸]Oºž&R‚–á4¯$°°¶J9¡M{ßö3hÌËÃëø¾íÚ¶@ZD’sòòøKвöæE° )k‹0Ïáä.רfèu]çyŒq)ƒ…•¶¤5Oª{+'âPfãz °ÎäcÆçóÓ.zÜ´«ŠÜˆ…µ‘¹™ŸŸ@tëLÂDÇóüüþ×Nþ¾ ÆÖmèþÞû}¿µoï›4Qöã:?žóL#–\¨Öt3›™Mµ@〫Ðý¶©ÈØúÑÇççižÒÚmÓÛ&·]ö]„¹~û&"Mãcžvá·#úëäH,mëýÛþ÷··G{pšç™yùLX:++¡…Ó3ÞN•F)ÈET|ÙE ÿ½¹K/kØ×˜þ×_W_à·ÿú–£²ÿmð…füýzðâ¬Öˆví‚^@(<§çC=4£fn·­k£·ÇÍÿ|³ùoE]1óçóùóãÇy]8ÎLöBÔDê›¬æ¦ xÔ^´„#¯h ’"—ú +b’T|ç:Á/f|Ù©˜Öh'Š´TsÜ(æ®fÑ+â´4¹™ž/sÖô˜an‹0SS•î÷ $ç5ŽãŒÅN%úÖ¶}+& ª5[íÅ×g]’()½.¨˜E¤3Q„¿tõ„gæaNYÔùnDeqªX…»—Ì# Æ_X$¦d.‘igtÎ. Äð„6Þv"§ÄecHæc»o[?{;öMúöضœ× !SÉû½Eàsx$]–co‘Øsk²Ð÷ÚZ9Dº{Šðzõí1–ó¡Nø¯ºË2>½fîK•IX5ßUÿ¥Wˆ Ÿ´R&õ¶50föºf,¤Ü•Á¬ x¡<|b]Gç‚ô©ÕÇV¦UeÞ÷»h7>>b/€>qeþ_9)—\çºÅH±S3Ë8€)%[é‚Ö/ÜR<êõBPvá©­3óq¢ÖL´gkÒU•Hƒ`KϘ™æ(”nÀ“’  Iy×½ÈÓ!Çì?®ªØDÏA<Éüµ ÂõC°@Ä›X$QjaýêR@UÅÂÖ/(!!œ€Ãë¡è•ȯ] Q¤< ±¨Â`0 / iL²"¼‘¹-óìÔºŒ1¼òæÓüš>çuNl,e’ˆÿ¢Fs%V D,NÖa!˜YI½NuEÁvŸsP0ùÈé×øx*EÐ~{¼õíkÛæœtÍëçÍnÒî!0‡_„­3ws;Çe6çã:Çu]çÉIûãñöxœ×pÐöö6#?Ÿfq§ˆ°Š˜v¹¤6ѾÍ1É-ÓÌìè}¹JŒ3ùãóü|~qßo*r<žŸ?朵&ÊL³yÇyY@TƒÈ‘#íÊâéÂ7X°×9ÙlÎiì)±Ü5ÎvúE¹ªf§HkÚÆÚZo]ŠûáZ5²˜çyÌ늠$EáB(•CòÊkDG4‰HŠq“œ-¿³EÌé RTbD¨žjz& ¶8Q‘|ñ« _Žò/ 6%x!ÆXVóæy^ ¢··Ç·÷7Ýn9.C s¤I–ÉÚýñض͇]ÏgÎ+}g.ÓÇ}ž³osßœ¨g.üÓ,ÂWÎ$)˜3˜g †¿ˆ¬™t×¥™”ð„Ez$¤þ{LÏÏãcv•Û¾©ª0 © ^Ý¢‰9l ï­õ¾5n’`JÆóøçóøùã‡n{»¿A6¨‡qažçóÙï§l7{6÷÷oüqßüßÿö×çÌ ÆÄ”÷9ÃÑZËÀ¼¦]“6æ˜6Ík'ÛÆ×•ŸŸ¸XùíívW‘&ÂËܘÁð¦ô¸oã²ëÏk–ÔI„9ÝYåñ·oûÿþÇíü}Ãÿ ›–ÿ<æq1ÏkŒ`íSûú¼|kó®èÅûEò¬7c~)¸^Iößʇô  ¸ÿ¿á|¾Öù[ àuÜÝ^¿úJÊW¤Qê¬dx6e- ÄÌh]nÑ¥UµZ 7VÑÆ"`r¯`†ÌäýxþßÿñŸÿúç¿æñLsTrIDDITX$"§M LóÅï°f.q]ÈËåUÀ/-+½ÀTÅpŽ’h|U¢IXZSæÕsÕ6_êC Âá!$¢õôÊ:9ÑÊŸª$*žr^Ó«Y¦*½õ­oÛ¶o#ì‘ÓÌÍ3V²’_[šÅÕYe¶Õg(ƒJ…©÷¶õÆUeu+š©Lx…-QDùhL·­©ùtÉèráÓ7Å&Ñà]©¤F)PY’ ÷™nJ¬ád³);oÓÔ­Q¤Ù1ç5.ʰ%0’Ì8rïýÏ·]D?Oûx^Õ©$¾Dh‘I”'‘7aÑ ‘q®Ù<¯ÐzÍæ«¨ò‹ú/›ÀoßÝ«.Â*õe,ÌQ2|¨D%øõMJŽéªÂ”i†LÔ6#Ò-=<8Ak«ñ„í{¿ëÆÙì蟟ç˜ËîVïµÈd“’RÖ4 nA™no­o·½õ`>@5§NŠÄóŠ+™…6 †5ñTN‘Û¾ßö®üŠîùÄ4–$­÷h}‡P°²$¹9»)ó+'˦œp·tK GÌcªS)j!fÉçôˆ Ùv’Ú)äœNu±®ÁæzPQcñôáA¢›ªfD!M™Õx‰F(+>U%ŽÒJK+y©@xÉ'’ˆ’ fÚoÚxZ 1ê\ª×d Š8á„,B,2#…ìNH‚#W<ˆIlvAˆ®M¶;Kçºur…¸”䯭ë9ç˜ág&Ö~ûûßÿñÇ~›Çóùóç´IM¤kD2koÛ··÷9®ëøyeœ} àr¿Ì"kí™NË;BÒ¶·màööâm;ÎÏË"9¹±´6àM¶½ßîÛvºü:rŽddvÜ=ÆàH3ÿþ×ïß¿#ã¸ßUä8>ã ‚ÿÞ|Ìac"Rµm7¡7ÕÖˆ8‘êÞÂm¥%‹µhNDÊ®iä˜!ˆH^µ>y›²7ÎNW­ÝFºÍÌËâ8®qTi Òʾ‚ °0 N3Ãæ€§_ìbùZì!ËCŸk­›/nDÁ‰RËõje•2{ŘcZîû~¿=˜È§%b¿m÷·›þùír„E¤Ý+ã•)¤üõú}u‚PüðB¼àÕà#BRVˆJ_u•l‚BQ•ý‘*i‘‘ÙT·®M6uʈ$^êuÏ€!-Ã=Qñ˜™#ØÍV§ŽE[¡åÞ»JV©9Ÿ² S׌WàXÚ3eNCŽ9â伂„kÓÃé‰Éœ¬Â*•Ex•ñ(˜”)©×ÞT¤üŒÊ¬u*Ê«ø•\ÇEOKHëÚš¶Îá.ÄÊÉB)@0ƒ(™³ ­\£0H=sÌYëõbB"M¸âk3â"2›™Ê«7rß°m®°YîŠÎx [ Kc’˜6Ïá6#“#0ž×_$Ñ[§FBÉ3Â"&`¥¬¦ˆ”ÁÏô DR~=Ã"9*ŽÁRåuw\§!­5â DxV‹d}Ú—]gÎÑ„2rIŠ3(m»·Çûöþ~WaŸvmdÓÌã¯ïÇçt÷¬•÷Ë7"Œ ª° (µs…-©¡ó5üÓbF·&ˆ3s\3mp¸kë,ê‰dJâ"ržçq]ÓûÖZ¯Í/ËÑ@ø°9G&H·m\ñqšš¼igô°K"”E¶ÛŒ8†Íë'\¬[Ô®§Œw”°ë8ÏçGÆù½ûø·?ÿçÿþ_ûóíÎaá9T$s\¶rƒ2ÒÓæ<Ï9¦Å%·}ÛFþ?ÿùùyþ¸µ[h®¶fu^þ?ªÎm;’䯲¸™¹G3KRwÏüÿ¿ÍK«Uª¬$#ÜÍ À™x¤ÔÏŵ*I:=Ì€söNÊlÊû>gþùuŸ`(›$ÅBd.§é¼o÷Ͳ‰ÓbÇëœó˜ŽmÛ.Èô'4«%³ÔÔ„Ìkn!ü¿A¿²ø×äÿ ûüjô^íW¦_IeþWÄþš~_Ê[пU ÞhUU‚¢p‹E`ášàIãm¿W9©Þ¾Â¬ªÍ$‘Ïs|U¡Ç´æB2A×"?'yVgZUªca¦Áœš$,õ¶ü7Š~yª*.\³Vz·»ªü[ä\dZ­ÉafÔ<.ù93S¾§‡D¨…€ «p&¼ÆJDVL fdUÄ®’6DØL›™™øBf«µŒØšõÞ#Ù l‚¬_jí@!Ä,ZàÊ“­Ñ•î­Sn·þíÛý¶5dŒy®9}Í« ÎT/@QB:ವGo»ñq.甾5£yÄ&0¸Ä(k3•d§<,¢èûfD”±fº˜³­X+£åjy‰W¯{>‹š øa´©>Ûý훪ýý÷?¯s®LnT%^¾ªÃñ–x#E ÚÐÌŒ¯¡Ð¥ƒú%ÿ*Ä_ ]~ûÙñfT7Å’bªrjRkºm·½!W¬uU¶‰Ø¸µá²Bˆ"FæÕÞv³Æ¬D/€3Q¥LËt’¹Öp à·{W»Ý„Ù—W^«vk‰÷LT½Ød¤_Æ3SÙ¶ÇíöM5,ÊBñŠœD”¤Äªb¢ x¦‹’q ™Ùí~ß÷Í8˜Õ±k¡*H’:(˜Ãf¬ËÂ,±0RW^ å µa}WJxÃ@Ž3 "ŠŠÌ ÜÁ a¥ ÊŒ"y*Uõl9—;)ÍЈL82Zk ‘â«B™a"\Q¼‚†d&œTJ¡”´,lJª¤’IÕ⯋VÓÍÈXXu¥i†ŽA4êJn[ç1^GÌŒØÄ5"„ÂÉ–•E " ]KDÓGæ&‘ Hϵ˜@*¬²© HÁÎ9½íßþr»Ý7k $aëmÛšî}¿Ý˜Å=X¯¯yŽ9‡Þöˆ1gDš50Ö83±,(å¿ IDATõMÄ–çó8îǶo{offÊ_X27A©)¶]õñýÛãûoÊês _ë¬*{*@€ÏµÎóç?ÿù?~pâØï¢ºæp_¦DI«úý,ÕÍf¸Åh¬Ö»õGßv«ßO¯÷ˆ¥>Ô§ÓÀYВϚət‰˜ ™–‹OVI’pÊå¹&h‚ÇÌ5\ÁÍœ­ÔLž˜L‹˜g±ST2c­<Æè¾í›ì+9’„I.ÏÛ•' ™HRô9p¤™EµõVÑÀfÖLÖ<×8܃î÷Ûý¾›Â'SöÛíöña*J 7!å ¬ˆÌ4ÑÎÜòJf{ÌP¶z­‹ÀL [é™~Ùäßl„ o½ L¤› §3œX8¹¥(Ü1 ªÚ{Û6išŒE¸pêoð'Qffµh“á c0á^GU³^õ!X_SÕ!²f}ß»5!F²Ö-ªøÛLZ¨¸ÓíÞíFŒ¯Å±@éB»  c±«4', &b¿`…±N¼¡5 âD\Q^««’°šjUÉ©ünÉUS0y:ªlÄÑš–«îë`ª+ÐZ‹‰õˆ¡&·ÇÖZ‰a3‘]övÏLáY\Åëo”dÄl.;YNŽðŽ5ȃÅÝãüq$Ǧ°®Ò "ªd{ÄXk2I­niŒª eR„z„#¤À3Ižœ h!7 ]'!ÓƒY[á€/ª©¨çr Þ¥÷Fäãøãÿ0«>–ªa¿µ­$¸šŒ•óé ,;Í<ÇëyÎ±Š™#Ƭ¾ÒŸÂ¬¢ÌÁb…›5íÜú…ìPI¢¶ÖZÁÄ* ðZqžs®@‚‰šYíó•ÄÀ–¹ÒOÙDZÛÔnI4g1C6ƒŠ1,f›Š»ŸÃ“hΤ¹žìg3î·‡n­‡ŒÓ×Bd(„Ûµ&‘ .ˆÌçqâ÷?œí¾¶ L¹Ik±›/_Ó‚¨ëÛm´V‡Ï53Vkª½KkÒ:dFRT29‘—×ÎoEz>ÉÈk¬¯ß|=_Ïÿù!½¦ yúÓ׌ÀJÇs;Îßî¼é½ЦˆW“>µÞu»§wxáßùž×ró_çäÿú¼¢ÈrM‹«.ù˨%ú¸€þµ ¨ñs"Êu<~‡íEøjù]42!!PE~=r.‹|ÍŸ¯?>לÓý8ç8ü|Íó˜ç±æHÊ|§|ÄâɨpB`ª{g!*4d ¯Ÿ²\‰ ¾¸™o#èµäHpf”ÿ¹.$D—ë]%x׫(Uk§x}{BšDšœ½¼¹W«“ZÝPEª‡ƒ’¶Öê7g*ˆœcÎ53S¯Ÿ"¥4 ª­*ÈïûV¼ËÎE•çÖTÍŠ€©Z),ÙoÛÖMÎÒ±2u$Ûû¶5IO€7Ë-^=Aqº2”¢-d(±¦²0DU†^ø5v7aeIÈJ¡“°|e,uVSq» ·G…/¿1}P"£÷ö}7^;µ¡N­8oŒÌ”"|Õ?Ò#}-@PQ­zœ ør_r‡÷B§Êz#2.¤‰Š0 )X“„ª6›Þ÷Çoý~ïsÏϯ¯¯1¦g²ì+︭wQ.Zu.$¤ƒ#¯Âx ,gÂÇ瘯ª©µ}“ï’–®p&QBIsúZ¹"£N™Rú §ãÌ‘ã ócëÍl- ת†«ðÖH8¡@‚VÐÎÇ ;ÇÆY?ÏgðJddƒt!"‡;å¯,>ØXH™µ5:>7±@-ʈ±"¢[SÕë{OjM­7RÊœ”¦ÖU““ƒû¨G9“%¬Ÿõé*oL"¬ÊJP8“2cIPê‡Q#e¿,iÌ”ˆ†‹7e+ö[ïÊ µTq}gTzb%1iWÕâር¹DL˜EcyÐ…€©75⓯³T½P¸l*™˜s1¸1q®ô‘™)"M›Z‰¥gæŠhÐβyŒ?üx~áöñq<ÔL@5=þúñ?Ç`Qj»n{0›ˆ¨òfÚ|£ÌÖš1Ñ8Ï1Ç~¿©2¥ç\yyry@]S½(5ÄÜÄL”¶Íî÷}+˜ÂŒqѦ#˜XÌÀÌ¢|A«ØT6 › L¤kß’4æÊq"Öµ#¥Ié § ¯,ûEG(_Ð5SVe”é‚#)U©5¦È1ffðâs²°±nÖî3}fnT…j/›IpBPƒfû·Û}¿ßšpót¯•&¬J_>«ø¸æ"æÞ7fq÷ˆÓH¨þÐ uRÕòY4‹`‹©)³ ©²ªÔô„,Y”UΕ¹ÖdAS5–Mõ¾5Ùöà7Z؈Uµ©Qf¦ÓÖÌAŠl{ŧ€¨h×Z+c¥×ã™™Ž‚ò#6€Â]$6õÛÛnî’K(R.‹6œID”ÄH¶åzÌ$à®ÖZ“\é Éž4\VÊrÌñÊ5˜“™ÁÂÛ½›v­dí¸%Y$¯ÈtZgÄ\HOÏ11ˆ¤S'ÂŒ9ªZÚ–Ç·|ÄRYLó|Ò¹©yägJ,” ÃD˜¡_q>¿¾Täq»…óq¬Ò¶}ï­[“T³fle…JEÐçϯŸþãÇO1Á‹m`Q‡ÄXŽ˜§äôµðõrÄ:ÆX -¿PfÔ˜§1’‰”É|åŸþdrãÅ12Cnëñí/{SФp•ØXY,’\Ia2kÚ$2Ïáÿøûÿðïÿ$i¶=¶ûo¢’íÆkŽãx¾hßÕT+7«ôã‚×1§ãñøÖÚíq¼žž^'b9Îñ÷ßþøù<ǼÖ‘Kä$ ÷ü:~ý¿nÿóèS[ËfͶMDE²Ql.½HÊ׿À>ttøWÓo‘íÛŒ7´¿¾êßP—õ²QÑ*¼Jf½”¯¦ÁõµLïs=]ÿ¹R’ 9pUkÍT¡x/8¥¾<3V,ÏéqzËÏá¾|ÿz­_çs¬cŠ/¹èÄP;œ³(”qC\„}³¾wmÊ˱œWÿ‹Rú¦?¤6°‘™qÙ¾ˆ8+°™JÅS¥d}×bƒ"+ï5jffRN2¥µb²f­‹*SåÅæð3ÛÞþú×oª:^ãõ:ÇXÕØ#JU%• j²1«ˆSdd*p)Êjª„Muë]›IíK«{ÉD1__#áDÑM÷.¦¬”pŸ­É÷Gß›*±G šÇœ+(˜-= Ñ51…©4fNw®¡8V] ‘"jëÆ)pF:!²D'*D¬B·{gíIF Å’8É•u°ð÷›éÿýÏ3m¤f‚#‘"il ÂZcœc.÷¬Ïh¯1Öô¸iomÍüÕ¬)'@ÝZÞ¶ê€{(SÁŽÄ­H–Ï1^¯ãëëuŒÈâ!ÀÊÚõÖû.´|~>¿f„jß·]Ř aÑf¤œIJØ»lŠu>ŸÏg€tÛú0Ù„:ÍNKš$™êIBèÆdš¬mž˜+ÒçX±Ö‘þù‡änÍDZ7%F,…7¨©”w¹¯#‰5×?þñ|*mJÒµ÷ÖX8"'=g®Møf¼ItžJQAâ$"•%šJ@`Ñå%&ÁpâéÈ ç¢ŸÈeåÖT‹¡cjUúk+`–¢ËLÌZ7Ó Ig"ˆäè"ÊJ­ÒŽïk/®GZå!@kyxNe U» cN¬–&¢ÊÁ~޵Fù Ê9$I(ø·öÛÃl¯z¬Φ"‰ˆ˜.H&ͨ¾Ÿ ±¶Î,Ï53Ü ¯ E2a‘«íýNÚC·ãöŸÿùþãÛZ£E2áËÇ1ãþÅϯµV.@š4néA«Ø_+sÅ"¤QRX‰98‰U…Áb‘$IB¤ Ð̲+àá⯕9¨¹iè‡v5¦MLÆa5ab´xÑWšŠ˜šŠ1‰;¬¦ª*lWÅ?ÑÈ[·¿|ÿè‹;–‡x“%ò9_§ V}F"‘’¤>ধEŠä fMëi]:i±hªüÉÕ‡òL*ᘊ²™0VâÌTÑꎈnMá¹@É „Gxdq„*Q²¢èÇõïˆuKΕYh9RÞÖ‹—»c9‹i‰Ûv{€ 7VóW%­(Ü3b¸µ½o½›µÙÝšÞ>z€"Ü}Ò &%dd$ÒX”µa^/Ó2ºE Ún¤,Ö+“p²’™×ÄTŒ=#&²ž\EÄB »çJV0ìΪªÅ9«j‘Ô³Š òi­¥V70œÖJ†ªh†ŸãˆX|m*´>3“åJ&fø¤¤ 6²&jœ]È ‰¤H8“3×\§'Ùrœ§yøðÙš¿'ù–d3à™î›Ý3(çɈpå¾A:¤)|(Æw54üýÏóÇÌûmû/!ÕdÎT¸‘o“úS®üÍ⻜=_ €;Äà8A:ÁÁˆnÌΗ#.V¾PÕï?K+…b6QE¿$}ýBW]Þ¤f͈‰#™£¬% ©Ä?'‹(•W˜Š€]P°0_êbÏHPjHÉæç\§œ$’ffM“ýœËG`©¬Æ&‚ð‚ƒW“XòzA’¤"YEE®È[†ú “¸¸7–É™á)”Æ| Oàé>8©™tûP~tµ˜ ·m»ÍDºŸþ Ê爵Î\Sˆ–ÇçyôÅûۈʾ7F”/'ñðX+˜¥·ÍÔ™¯±þ|˜®¶ßo½7ósPrùqœŸ_çó§ÇbRÑI+—™Ë} óþxìs¹Ðë8Nd&©™ÈM­å ?Žé“DhëÖ NsŽs ýÜ’·Ûãñè[ï­)¤ßu¿i7ÑüùãÇk,0KÛ­‰’{B)ÂÈœr!C“»ššª2·ÖYø|}óµqšjk»ö¯¯ãø‚»ƒ)¨ë\ss&DÕèÃ"ËFìã<™›T¡–.B'1-€‚ÄÆº;Éeâ¡D^|@÷Iî)lf;AÒ3@og ¨\ôZE‘j 3ý]ùc‚ûã5çI€Æ¯Fà%A“¤äãD¬!Q¶à¶Hü’…ç¾VFÔ28ƒã|½Šô'­‰µvµXºmD}¥!™É™ˆS•‚ʼn‘2ÅXE¯5´ñ4n¶í÷f[kjû’¯1GŽYê6UmMU„’Ù}.ijû½÷›˜²æÞZÛH_ëù\cÍ­4¡Ä·Æ&&´ÏI™´"LDÄŠ9v`éͨ&!¼ÖzcžkãþèºÿuÅ‚¯Ç¾}ÿvkÂk†±Æ1HV é9Æ|>‚Ù4¥Vÿb»fèdŠà¨³¬´}ozGWlûn3G ’´m¢š±^ÓÅ|ïš!jªÆDŒ0#"fë¬É¾·»é¦·ûöñøð;Y³ã8Âc¬•‘žžÅ©ÈL‚‘\Z¨$Ÿ4uzSÛ´±Fr‚Ï1>çk#E¤@( )…“´†·WV¡F\5p†€Ø»åÇÝþòývß[Fúò"è½'ÜW⿘?IoÏa­ð ñOta¿…ê,{é…Uµ».~¹ARîáÂ羑AU›º&D ¨ØŒ<Ã[èœ>ǦÞ[ëFL˜)ot.”ÕD›6'ŸçùõóËç2É®´µ­s7-Ù|‚‚¤"É'‚ u¦$,¢`e÷ ô«¦¥¤ÒT8¤!Ef+¬gŤîIÂYXl¹À1,RïUÆUo)˜Ì¿å¨‰rïÒšŠJ3³²œàHé›ÞnmëäŠuÎñ:Ç+éB§˜ˆ‰˜Bˆ˜ô‚” ™9!B—2Œ AÕçÈPÊf ¢ŠÀyRÎ`am½ÛÞZ·Td†O¬ó%:[è&a’]™HÁBT«]B¦o¢*™Y¾— çÔ a13‡e²A¤ÌêE¨‹â¼0³u9"G†Œ³q‰C …T‚H2m­íÖ;1sú¶Ç8yþyÄÏs"ÃLM• J©å f†ˆ oÆ¿ÝˆB[°¬ŸcÏð)¢¬F¬ Zkùñ”,ýþ¸í÷Çmß»*!× ·–]×ë5þù<å_ï7i·¶ß÷}»íÖD(5JY–AœI™ì¹›Ý¿Û,7‰Ž¥%ÅBä`¸fVo Ä‘U]fÚ8Ñ,Øõ.ÒÚ:ü¡KÖ3<;йM€${ׯË!<„ä ÑìMøCÂj8Tä¾õ´íç—,ðCt =á¨OD$S°  ìezJöZµ0‘¢J‰Ê¬ÂÒ¸‹1H¬õ¶mÛÆ”+œ$•D@œ[Šp­¬PH9I55ˈVV eV~g`)Œä̼'" vÐuŸ,²U&S2IˆŒ¤±2 Âë¥Ìè­‹™Ô“šé¾Ü‘¤¤¢Æ"\1N è¨U:/Ì÷­s˜$D’Ô“(¨ Ÿ@z ]­«®ˆÅÜ{ûþíã¾5ãˆó˜ãŒÌfMÜ3Á•ïQZ±¦ëJÊúYgr† 5“ÖMX9"¦§OåÜ·n¦LÔúÆ*¤TO”ëÆ­í÷{o6Æùõù»°îÛFÈ[ë´ïk]&”âZF¦¿MÊTæpwB4ÓÛ}›k{c…TB(\ (#r-÷IJ‰@æœëB·¿ü5ÿò—ßH€HT{¿ãNóˆó o^Îhѽµ-cÎ9ƒRÛ1Ý èÂbˆ€¤œƒà d‹¤ ã@ ÓTUA'2ž‹DSdÜE4³•\9¥êrôŽýÓbZ$Bf,Â⤜ri®ƒ() JÙ8¬iBÚLµ‰4µï÷®f¢sÌpÏð¬5 Ðû¶ï{ß>´ß¤YkÖ›˜Ê5q!6!6¤ˆ^ÊÍH_+jGRËzec" ÍŒ!Èc®‘)ÓuœÓçì÷ÍTÜ=2Eš¨-_ÿªIƒP$ÑÀÉœ…5Ä;š5›²}ßof»±qÒϯçdS S&D&ÆÒ[Û÷fÛvÛ6ëÛ\óô#ü;ë‚LÌÈ×ù5çA™BÂéîîË=Â"¤™€EÚ¶í»Š¬•+Î/sé­«uØK_Ç‹RŠðªõ†(XúU\ÅŠ5D¹’&©—ú#yev¥èú:±f DåBÊÌD>'êü°˜}|F~>üþÇÏ×1j?W#Tºþº/+9¿© MhWtãf›*Lr7˜_¿ÿa1›|ï›®`S.³ô5Ýç7HñÍï¹âüÕ8 uP¤¬¸;ˆË£-ÆÄÅ+£‹t)ïS>¿ ¸ùom_!"(Éš²H–ÇœN,j¶æs®ÔLB×À™°ÖöfÛM2¨þìï?_¯y¦Ÿçq0 j¶o}ßúí†Þ[º)3b`Q‚$‘ËÓ‰TÄ")#¹ðqÄ zóa‚t©ß h .Nå þ_Ð0"M”>M²R㙄®[Uâ*)ªPÓ¶mmÛLŠÍïö=1‹ôÞDøqß»ª=_çó5?_ãë5–{^¿Çn ×"©n[0 DV„SõZé2W52ß$X%ëL™Çqòø”½ÜR¹©©j\ïX‰lͬXx¡ÔTŒjc—Íãêw'%Z*0´>(À-€DÍÔ.42ÝsE,d–.¢”A” :Æð·úŸc‰ ÈcV!A…U‰)¾ëºïñè¯#ÚkñkòWŽ3QнÉÞ[ cX ›ä¾Ù_¾³ «ª)ÁÇqœ¯åQB¹LZsC×Z ;=>~ûö±÷V ó\,Ü»f¬œB›Ýo·Þvµ¹ü¯/I©ZzNä"¤€›43cã”\LήgM.-EŠ@T‚r-ª *+#aÂÂç]òvS͆ð8'C¬‰ ÌÁ‘±˜Muë]Úv;±Ÿ~œ#sÆÂz*}ÿÞ7k ’La0Ç&ë&l½cmpŽË’&Á͸nØ—8if2A„EŒµ‰™ 7•?Ÿ/ýØZ5×`Ò¶=ˆJ¶VéÄçóµÖ<žÇ8F„”AÛ¶­Çc&–Ç2%ƒ5‘âN ÷u<Ïççq»õsË5}޹<¯g…˜øv»3ëš>Ʋ›rÉe(ð¦Ô ¢¬¢œÄáAI’¬¤Z&‚bmÊÒ()"üm(…3…BråHê&Õ ç‚f0[½ok„X»fVbJΫ¯^Â÷RBæu¼Q+Ú²†¶ÖšÙ­76!Ó)Μ“"›ÐÇmg‘}¿ßoíöMúV3+SÕ‚S3êÂ}amË(IBff~Ezo|êýÏ­o=)Åf$ÑFÙ¯)Ù¸ƒs‚"aª™Èð¥œR)‘¬l;Œ’®I€$Hk. ò¶µ b‘ëéçyž‡gˆ™7›%®)¿!³ êËq‹rÆ$ (S8|Œõœ12V1ÔD Ÿkyz5 ‹IfÂ#¡LÉFFLIIî” 0‘’×¶Ž…ÕH˜‘8˜ÄDoÛ0’ÄÐn IDATXzYÒj+s²Hå„ê H@u÷.>³Š€WxZ3Ñ%âÑÌT³1N°ƒÀiH#H$3ƒÆò3xuI«ç°r©p”B(‹‰Û›²5nZc²Lóœ5†dz¥2K]y)“óŒüù²ãä3S´qåÚ¥””AéÀ¬[f3×{æÎf²f"²ÒYeoM{ojBHw¬•á3ÃTl3L ¥)PÓb%b.÷H0©(ò”XE·¾µ&f˜¦Ç:Ç‹2{kINclûnýÈqœÇ:æék!ɲY‚‚DjP&f™ãyæ &“Ôkâ^ó¢z¿o,Uç Ï(#xÎ猫R]P6ÞTï{å$Ÿ>™µÛÆ,ž”lIflf½›mª»ˆe’È÷Gÿ¸ï×ëøùõ´=¤ ¯ñ:•®Š‚=@ ZU6.Ç}âyÎ?Ÿ__g&L… \ zóID±_˾MÊÙ„v³½«j6 É8¿Î'ó·o÷òˆ\\–[¹z$˜ö®ÿ*GÏ|ÓÉ®T€êuù¹Ø»oïźêIWÒúÂÿÔuLjsdz.AÌ,+B³mÛ7.o’ª™ˆÁØLÝ´#öìêÍ^çqœÇ?›Îãô˜ñÇaóùÛ­7S­(£uažé‘T= œ™#A¸8É, N¼?fCÖK½>ÆJâUÑâê!&ŠG%o]’‹DÌ…»æ_?‰ê1£´&fõÏÄ /î”^Í •fÚ»ø8×ó5ÏásÁQ7*aEå*BáË´‰Uø?ÊqËBtµ q…¹ˆÁÊÀ¾¢vÈËó%*wÙ´LZSF)FUÖÖLŒ…¯TlÆûL,bILyq7³ïÈÂæ…À¾0«u¡Üƒ³Žså»âË 3g°‹² ˜+*"Zí7Q5mÍnjJì"eÊ`,…K“l›þmë¿=þs|qŽõ<žk[“û¾õÖ·í&5Æaj[o·UÖ¾¢X1l­•ØZÜ6|Ü3ƒ‘MèÞmï`ž™XèuþÖ‰þ¸Ó¾eµÏ„Að5Ï9ŒT36%¦”™|2’µÁ6H#”Qd“ôWçõm¸/øJ –PõäS°®\-C0›2qÎ7ÓfZ|]ˆ)AUx¥,·ÏÐ?Œ™»äNËϘ;oZÞ P®Iñº§4c tg$Ø!DÒ2;%•+$$3TÕZ×¶«5jMD؉]š¶½6®¿,«‘¹¦Ç fÙ¤ÕCsíÄe$Ùz·nÂBŒ>Æás% [W½ø |]–äMI +KAÓq›¤¬decJUp}("Ë'ÍkÆ,l*tAù‚#®e½ß ðå”-šˆpd€¸÷ýãñÛ~Û[—ˆù%ò?cÌä½7%Š8~þ\Ok>ƒam&®Ô61«Áöˆ4†ÐÎ×óç?ÿñ?õ:°ÞÛ~S³¦¦Õ_°fû‚¯áÈûÖ»5ã93xÛ¾ÿö×ßîŽçñüD‚´¥äZ£ ‘¯ùó8^ãyŒ¯g¦¯u6d˜4ë{o­µ¶Ü}Ì×Ö…W®p§šªhðb,Šáóx}òÈðã8Æ8è·vkf fí]»õÌŸË&L‰ä´fΕN$&]ë–XA¥½"!$P ”Üd‰ªhbR2ĤZ-öÝîÔ|ÛŠS%Y³®ÞžòNÍT-³3‰4*N.€U¸^ÊL&mí¶·&)%wÝ¥ífB3Ö\ @3ë&ÍØ¬Àuf»mb+<3”/ç.ˆ+ƒZYö¿–éÌlÆ[§ŒHŒ¹b®p/¯ HXM‘(um}ÏøX>3×ôs8•NÒ¦‹/¢˜¦ ©‘¸1“:µÔzÊ߯ø vP$åy,_ÇðqÁ*<'Q}Î[SµÅD„×à¯ã¹=?{ëÄð˜‘RÆÀ˜QEo¾ñTç×—ñ»Ÿ¨õ9‡:/$昹¼"ÇM¤¹ƒi˜Pµ}À¤MŒõ’‚\xÓ·™¨>FbJäqPµÞ¬q»Úoj¾‰-Z,Ö‹JA`Õvë;{ÖïÂÊç¹Öȹh:Ž9Ì)`N‰ŒÃ3IÉ&`ZDIjB¢$ÊŒ t‘^g7a¨B9.¨€©H’¸¨öÖÖZÇ+èÆ"²Â.DB1G¤Ó/KkÖ¾‹™š¨(3‘I^t\kÖLU«Û‡­ukι˜C·.B‘1”É+È3–¯™áÆš(K`jSƒrp¾æÉg†ùH,WQkÝ#לáÃ}Šœžrœóõ|®y œP!<ãòIÖšÇ9Ï‘^ÙÒâÛ”o>+æ’Yg±ó̘Âuj¡šé¯éç˜Ó“XÌì¶µû­-™„Ùƒ^ÇðíN·«É§™tœ#þùçç׫«4a3½=î÷oýþ¸Ý÷}oû­ÏoãóÛ} P"gäç¹>Ÿçs¬5†¸ër>Æùϯ¿ÿãçÿ÷g&ïýÆÂ¥í(ñǵœ«?®Ü~&ܱ Rº†÷õ@Ÿç˜ê"W“‹¥pÅ3ä_€û_”ž‹E‰$Žòº2Åfk­²×½š+Yƒ+HTÙ€Hë3Sˆ…írósÍÈÄ{i %Ä5#qTyáAÂQÔ ŠñÔJ¢›üßÿúÛããëù:ŽóëóüùçóÏ?ŸççyNŸ¦jÊÍtß÷[kʳÊ™ÅS.Š÷%Edðõ±M+†¯Á%/®0×ïï/Ë{0]Y B”­‚sT·#&–R—‚ ¬"JÄá1K–™ .Bk i“"p4çXáÏc~~-Ïâ¸$"2“„ÙjŽQ}¿Ä.¨RmŽ˜9±ìJ³J•a,¶td¬M°m`“»õ"¨!1Ç|)AЈD+´5m œ±qÁ»=²¡ Ý#Bˆ2ÍL<‚Àü¦ÞmKv䯲Å`FÒÝc_2%u÷ÿÿWŸU]Cª*I™{G¸“4Ãå<€‘j=I/™á֜Na6-ÌÒ#=%F’³4UP"Àhœ2,ˆ¡‹èÆõ&çUç^XiYîËò¶ô7‘ævŒùr”ÆÑ%„’"ùÁZgmÄm¦ž¯ãõz}œçnž”¬ª 0£ú §EËhi>ç1Ïáj]Tuiý~Ûš …ÕQ€#4‹?3 IZ³¹Æ³Òmµ°1Îó8ì<˜Àœ"3q:…3 ¨âò|K[R•8ID˜™ŠsJ™îžé>ll`×`q"·È °(T‰àánƒÂa$„¦¥A©HS–2³‘œ3?öyØÏÃùuØc•oõÖ¢çÙ…(NJ%b޼±&'æ° RˆH¸g„Á#F Êdn**\¤Ni­µÖ—ë÷"Dĵ û´5å ¬9„ <|Äiã¼ÊsŸB D@X9+Ñ–Ãç´ó‡ÁÒš(ê)ˆŒŒœÎ5uºúé© }iÖ.¨Aµ1kÍó‡%\ôÂM™¥_+/Ú*ØF”s"0÷ÂÅá'$ý±*¤±”Ãü8³É’™>mÖß(ˆf!,æù:P^.nÕÔŸásD\¿Ùx"¡Ò×Û 3qÄ~ÿöÿíoý«d>n÷_ÿü—oþs[™UmM+ýÙ[_T&³k·Ä0ƒà=ÉñáÆ J†êºPG²æäôã8~¾¼<ýœâŽ´ãy”©ÒZŸ¡¬ UrÄÖ@‚G²èÖT3<}œ¿EøÙ¶ò9_ç±Ï92„ù¶,k_Tµ·~¿ßUøããÇÇñs–ßJ3D)9æ4;gF µ¦ ®æ·s*J%›LS8(Ò‰Á‹ åÌ¢q~{»m·Çûûñþñªyú´`fMSr&QòµM%Bµ4É/fF #Ý)BE·û²nÛmÛÖ¦H ŸõméëªÇ8=ªV‹¶Üm¥µ¦KS¤1•8Z Ð×Ò½¦þÊ©ì!‘é„R# 1“Rª»3z©›gd(Ÿ©o¡¬áñkÇÇÓO'GsøiÉHFCzÄéiÄÄ™´§¶æI6}ïÇ^OcF@⸈7I1Ç<O/Ãѵϡq¼,ËýËm{,Ü3hÈ÷áÏãÇ+¾?òËmÝV&ÂyØs8Ä%ÿòvÿþýÛãÛ÷Û·ïËíöX{Ç`çÛrgíµ¡›–ëû üã=c¼öçáú‘íÔß~<ÿý¯ÿû??Æ€Ê*—á6 yFÕÀ)ì!êzÉžb¤ÁÝÙÖ ½å´ù¾¿Æqò£%¥ƒ"3‹éuMŒë‚?nô HÌ@|6Wˆ"¢"I 113 _©–ôú Ý/B>}fd,T‚8²˜û>ž¯Ý-kú&ªzÁ%^G}áKvRa ".¤M½¦¯»źõå¶ýé—/aöÚÏ¿ÿóçßþó¿ÿü8öQA’= šÜH¤tìnឈ¨ ndÌL/DÝg¤)“38ë„P»€:,dRÊýó‡(Í#‰<9¹+QÝé -³–×´¶ÚšˆfäyÚ `ˆÐ\‰q¹{8æ´1ÇÇþÚ.å'‹ÚòÖÖ%2Ò£TY­k@uý jÄtŸèBÆg¤1âÛM¿´\p†…€œBÌØçyžºõõ¶ A*²¬}SÖH'*£*§'ùU²ý—ÅÃÃaÌ6k¯yúœ>‚ í:–£×?»œL¨‚,Ǫ­m[ÈÍ ÉzëûÇQÝníq_¿¼½Ý¶·ÞÂí<÷ßã#|¤O!(w†d¡‰ô•d1Â9ן?õÿ¤Ç c„³°'ðeÕ–gÆÓfP¶¾ÝÖõ¶¬·¥7¥Œâ¥’DrÔ uà:ï2ÃìÜwG°ãZÏ–‘6‡©6Ž0I«¾;IT+!ˆóR“ùebãì!Ì"ÂL¸ Òëœtœ‘aIîv望öû푌çœä´b…ãù:ŸÓwÒפ×as¸€Þ6ýõëòýÑN8‘ ŠQÇúÒIÎ'!K3 mr.D«§ë›‘QWRºžA”ÌL™éD ÓÃM÷uiM=ëZ+Â$êº[wiÚzëMD(+Ð5 ± "Kn"‡ò*0Õ lq„ËM¨×UÝ’8“//=ª\BL` y)¼ÿà%37ÑÊW{±¦"’˜'s2— Š"¢’«Á º^EItŽs?'ŠÒ‹$PÄõå±ô¤ á+ÚQQ¤U1¾¢Ùu¾&‡0Xš‡ž9Œ‚Z&~¾?} öøúxmÛã­¯7f!f*‰²Ï&Ì€J£jO4_¶¾¬[@üüa¯=!l–M—/‹š°ï6^sì…_â¾tÞ÷9̈È,ǰd‰¤ÆÌ ñ"AdîéÁ ñ9QHú9ÏcÕZ/›{†SšÏ´ I›Æ6ïmáÞIÚ8¦o™’8gº—v4"¦[0j]B©œ N„pV Œ/¢ÃÅljª yic¬‹® %[èq3'‘Ed ‚‘Áäâd"qaJ¿¨¾Œ>8\½ëííöåÛ×·ûÙ9¢"‚¾¶¾t=æ$0k×Ö—¾ôÖ_|–$RO"°.@dPx9Ê i‚€¹Ü’`IÃ|LÏ«j™ÁÀÒ[k­ÎÕ‘îffV”ð91ctNï‹´¦Ëjc ÀD“|VÃO v’%@3‘T1€ˆœsZ¬ \©¹$¨’8ÊbpÉÕêÔ‚ŒrpFVƃÀp”ŽHåD óLB%Z°Ë¥LÂÅEGfÁGèº!9ád˜Œh n—ù‡ˆ^N‚(5a†˜Õò¡ºÞ…V©#-8Â((½æÉeH}åÜ=¥è~s¯ç<If3)—u%Þ‚:ˆ¤µAê|¡i[€ ãx~¼¿,ô´fÑ›NbKœNîDLÉp1‘7Ožçt¢€"“Ý‹´ õ  8T kƒÂ¥1Ë””I“Ê«ŽªQ93‚P]"Nb‹LKDÌá`–$ "QHSÊž™ åFÝȳHøôjÔŠØüY˜ Šcç8cš3»Þ–¶%EFˆ(C3ÉÝk«õþ¾¿ìÚúãñ&­ £i)6@cNŸ3†Ñ˜‘Ì™5ø¤,w&±@%/%'˜u’QÚ]×~Û–Û¶´ŽÈ1ÍT¨Zà ™cت£7+’Â1‚22ÆÌ±ï¯Ÿß~ùÓÇ·ï¿,}}=_Çý~‡Ðœ“¹îU“ctɘÙÏ÷Ý=ûññóý°™™\"µ:7D0®wZÔ½ 3|F‹ö¶ÜdY¸kßøËC¿¼5ñ9ýÜgúŸ?7Ù¶åÙ_Z½O :˜Áד…®GH­âºd†‡;U˜\ä“éIWŽŠ(’§åœ ˆŠ(ÚИœ(Ýcœã8GT³5=‹Êg9?õE—¹î”‹fFH˜¹ 3sÝ:7]’î–³o:v³Ïãøù:l™ûs ϨԦÀG Ï*þ˜ø3çÖ„³|xåÿ$„]â3|ŠJ'Rþ×Þì_ö4¾ÒÿÄ!%Ü.PP˜{Åè#ÝÌÍ@è qP¤…0¥•t |š½ö¹ïg†ÒçqäBAp]‰.³»h ¤ºµ(ÊDQ$øJzE]mëüë]¾©‹G;»©N‘ÈÜ}öRÜI# )Z'9¢\Ë ¢Åj1Ÿæ–W±œÊBÂHÍÂOª0‰tH3ói#ÝÆtš'´±h†¹Ù±³eÎ̵iur#'Vh_n÷/_¿>îÞVf=‡(æ8§Œ H:ÕÖ%"rºåë0{ÇÏ÷çÇóô†š‡™›»Ç–¼mš"î¶5†Ü´tÝ”9WX»*5ðAë‹<.ö•ˆ0S&D°n]n7Ք澽}qK†dø8w‹Y]„ט{¦!œ<|š™™Ç§é,YY—–®‘Ó#ƒ¬q.rÅÞgØ~š—s†¸™29à”‡[8Ÿ1Üòœöòü9ì9!­?Þ¶¯ }_éË=wX #r&E']º;¦Jª„ x0 )Aä"òe¢`ìœD”^D ­¶P‰ê“)·²¸'(|F&BN³sœÈ¨w@yî2Sjœ™sœ¶Ïr ȶv•V£g‹(¼ÐžçŒB‰½‰.ÙÛÕ€ŠÿwìR²g|N…ê>€â@®JRVœÚźNû|¥•ŠRϤôù?’¸¶ªW¢‰¯|>G0ÉBŒ?È™QÕLDÉÿzsf“qQðª*MÊd6í|ÿù—9×e‘ÞÃ}ZD:™Q„@ÌÚD„ƒ)X!”$‚¥·e=æID‹ª4µ—Íóˆ1Ø£ó¥eL*ü.ê‘èž&Ì¢BŒ’À E9ÒE”AsŒ0c¦tOdsÌsJã¶ -*LF™®œÛºðz;-^cÔGQO×þ0s†efW É‚>óŸ€; V"G"öàôë³Nâ «™œÓóãÃÒn‚ˆú(`ñ$s/ÝHfÎ1Ý} ³ªªBT¡LšîBþ¸­o_nëÖzSбûëà¦ËýÖZO’1\!YZï½-­µÂ9×-Pä’h&]/PP&S$QÓÅ£/Ùèe¿\•¨ß• soísîP4ÎyŒÓÌb†íáy͵1TGRSNÙ ÷iÅÄËq°¡!WÎ$IÜÙâÂjnǬJ"… íª½)1ך°°€Fªˆhk]„º½TÙ×SÎ9§(B­zýǵ¬»8Š.X5Iaª¹]R8q$Q5=R•¡‰¸X%äÕìImÃ#2-ÌWÀ”¹U¡D€§Ÿót·kRŠH´¦"ž˜†Œxö±ïÓh^M¾¾-·¦[’ÌH¢– {e*îM8m<ßaû9µó›>¤ ËŽüǰˆ·ªý^!pDP \3È’‚dAîYyµ”Ö´- a‚dñ—HT7íÕôLH‹Ìa™Á½/Ú`y ƒÄ’—Â)¢²>§f+s'#ËAÌÅ©[üuä!–º° ±Š°ûH‰€8a1N爙.” ì‘W¼Ú„Ò†ÓÂ3ÓãÇë9=‚D[ç¤yœ>&‘+–E@¯‹"((‘–d†t¡àä–`J+è¾-ÇÒ˜-=ÍGýõ˜å¾´Æ¢Ò:ƒ`fY|´¨Ç2ˆÏ™ûᇟg<-xÞZßÏ‘ŒnµÁÇýÀsÿȹ+è¾6Ÿró¹Ÿû9„e]eΨFÕÚº½M¤5ΈAäAÚ›ª cíúõËíO¿ÞΜaáûîûÏÓüœ±Ü¸füˆKœ×Ëäz¿•ìÎ z™3 \{¡$baÑÂA])׌: È#+îÎ@F„YVô¥‚õÄ­©°‚¹œáN†P ;(/£Vmöª$º0“…Ùr ‹×°Ý<8Ù<"¬5y<¶X#nÇ¢Mö1ÝÇkZx€©ƒÅö¶Œß?lA ¢l’MyÝTÚ2,Ç4›sŽQp°VÖ©*Y+KH±}Ã* ü)‘¿úÿJg^ nŠ‹ýß­1QÄ,Øšg–ë+ÛŸó´iŽòy™gš1' 'Ê–üù Ȫ‡{xÂQd¸Ï5ü…ÍÈ0a¦ˆûBå%lDIÂÙä ?Æi~:‚ÂÇ9÷ôÐlᢆøÄæÜÎ #Qˆ$éåÕES9êÛ"]@AÑ’h ¡emªÒ"y?çk—ÃOO'¢¢“Rx=êëxÕY8©5ÐÆ­¯Â¢½·mÝZk¢Ü®>Ò~öŽç™çÌp£1݇¹ûtç9çŒÓ\¹ßï÷®}Ú0ãé:mnk»uQ!ŠÁ^XFKg›î3à¤Ð”xUE¨0IFLÏð9çœÖ˜a~º[ëËÛãëz»W „¥ KzÎsçËÂDD…#rœçq¼Æ8¼Ú !rîá…Þf$sñ kø¥B†YœsŸ‰:˜0diIW!ApÛVKÁÞ7U(½ŒÙÖMÿôýö}Åê»ÚÉ63ë}I€ @NáaÈP(³ 4RÄ…!‘NII{+a†ˆZ;!˜"¥ŒÙDäFîL¬`"r³Ã¦Í3blI‘¬*‰7.W#(g¸Ä¤HsŠiIH’K·A5ÿòÙ×ìR<×Tµ¯ýŒGW$ò¢óò;9(¯8]F/É B ˜…I¨Æ3‰HŠ:Æç5¬%dzxÔoûs–RÐtðµç$ªži^b’ÒÚ1%EeÓEk®âÿ嬎ˆŒt$h!hWn éǰ˜¬¼, ±—#Ep-RZwGDfÆA,EnwÊ”Lv;_ûûóõcPàÖ{gsûëœnÉ̬%E—O‘d©Jà%B.ñ"‘ç<ä rç °›"7Ñ¥÷ÆÍ¦ Sﺽ=ÖÈ}ßÏóL›s ·9lZZ0”®°Jk*bv†; \v¦ë/V°6‚hs¨'/[(gLóæÇŸË2¶Ûíñå SÒþzáÖ´m·M(Ï×ë´ éÛ¶>n7¥ p2cÖõíëã~ï>ößþñûÇûëÌDoÙ{_·~ßîk_‰%!QqƒT+)Êé}a½“òí‘¢k_ZÄëýýøí÷Ÿs¸ª¨¶ÞÚ¼¾ž‘“³ÀrÂ$.£¬ptASfhFÙ’™$“µ;¥´‚·˜gK*ez“ÌÒId¨´ $™ƒKÑå噦 ³p”M-””4ÂÍ=ƒ¢ZUj]gOÏ´t .oQÂ}R¹$-ç´!²EjFu³2"Ç<ߟ¯™t{{ã¦ç˜ç8=}ÑNÎÇ ©œ"Q£\OûšÞÄ5ANXÒŒ¤ŒÆ!ré¬þÈÓ0À䈓•t#¯ ¦'ÛŒ‡¢©3g‰)Ì9‹Ã#)¢†u™Sh›Ù^GF¾X‡¸õÛ³«º "pÒmY#À,n™ùñ:ÏÖ” Ýò`p¸ÓUúòb%]ýŠ ®—¥ÏSȤ4ž1°´&ˆ¤9]îov»'˜Â¹ð<©)ýñ´©ŽÙô &ÖêD!}jdÔE (¾*áT%d"9Ã#«¶ú2«Óû™ ª¨ äbñ××Îïº|^O‚¢äÏe¥ë¼­"½I:"É,}&&ÉH_¾Þ»Ä¹ã IDATÒüùÜ}ÖÖ´qø­ÑÿøÚ=»4ûñrs®·•Y=4d]6Zlÿxý|îq·d!ú<&G"‰Ãéú·¬Y˜0þ9+D‡‚î3KE‡*š¦Ì@%“5¸ªé>â$§7#Jiê× 3ÁA¶ÂP×§ÈR–Ó¼ÔÇ ÊLs/r 2Ë¥<È6Èçºò×Ub4=Ï@ó`žáÃÝâLeAòyø<Ï®|ßdm6 W(6Â…=‚,ệ~ö¥“È…”ÛÚUÖ¦9Æä(}j]À@:ùÊd"éívß´mffá ZuY—ûRGa†T.·ÍA¥®Gý,+ÖXuް9-²® •ôiúzѧe<‰àÉŸBö˼~qŠ=ÝÍ}9K)/l²µ¶h"=L™Ais²°ôUZo­÷ÞÃÝÏ3Ì„{=¡,mQ&º43ûí·ßûñcîL©¢½~3¦}Δ­©¶Ú]" ÷+-NJhÚ ¿Àlq¢4»–¤E`5™siMXbsŒ{úméœíã|íÏ×}óu‡%É‚b”î«£4FLÅ1dNOk—¶°NM"fCØ<ÝNósø˜–ž"Ò…K̥ؒʑÞBN  C;TJ¸–A É(nTj“®ª", !V•¦­Õ‘…ÞÚÚûÚ;3]èÈœsÎ1¦Íý8>^¯cœææÝÃ<=A—ã¦bæá b&ÑZ@*H¤¢ÞµŽFiÊP‘jº¢¸>gF:Pž¢²û ˜™ž‰Ê(n<™5 ÃæsßÇ8Ÿ¯ç²t"$sæ1QÚœD±m]„ÜÏ9’&R›Ë Цõ…¬›n[¶ûãm5K« Qÿùªùü3ºÝo½é ßÇyŽiæ>œ¢~]0¢ ÇFõ´`›æÓ"N«9-Dˆà1A–;O'LÊtSw9Ü…ˆ IæE¹½B‘ æäŒ°˜>g GìA˜Ãæ°*¥™"ô¯`uP95’’-™Ó sΈIDŒ˜ƒFÃnU‘ÜÇû¹ïGPÜ·u[X¥­­mÍffê92EBufF8êç¾,I5‡I ÷Bom[—µcmLÀt2ÒúçÓì=ÎÆFa@Spº“‡xÄ]º³p9Þ'ìÕìËÖ”Ófz¾½Ý#Ù“#ÀYÛÛú¹6ÍÅh£ Ú}E£ÒH{:ÚÚÒ–eé½uóˆp&A侟û±Ï1 qÁ’¯éÀ¢*¢uª¸n—¹ƒ¸vÚט®èu5«Õ7e{d€€ 4s3›sš d°¥´Þî©"}ø<Æ9Îi[ ^3Í™\–¾,=Æ?Éã~[ÿ²|½M9ž§ŸçÚRÕÏ^–U@'ÞÙüqëηçÐã("1ØR“ÈÓ¯ìÀr¥@(V$1XEU…™ëô/ª i[#aÊ fôÞê·U\Ì1í ÿ„·®M¤ k^†yPŠT^îm‰¾pÓo¿üé—oßx}|œ–¼,oÇc{ô¾‰4‹˜î Œï?þýÿþõÿÿñÛo»yš äÎŒ3¦“h»¿}Y–˜™I‘Þâ`3®,%àân{Y‰ˆ"HÔV,"$­¬ `…´mé˶²H%ë>¿áÂЊ.ËúöömÝî"L Çqžû±¿Ž1ÌmÎ1ÎÃæ9Æ~»™¥9Q ©*Ç5$ÈDÛîkÐØŸ>NsŸÉÉ ¬ÒÛm›$gÎi”°ätÎ Ìig•Õéh΄Ø?žÉ’¢ eÖÆ!°¼29³!™-ÉÃÊ”JáµúAG1›„dFºS€-|ÔÁÎ "ôʨ9]¥&¢òh$”XLn4Î"mIékÓEÁĬÈ:B,]ˆõ̇â $EΜӒ@|Ö‘’bº™Õ+ˆ Ò¸”,Õ³ˆ¼nð•ã¹`»œ”Ubú\ë(#ÂÃÍfº’×ZÛëZš\3ÏÆ¸>ú„Jþp9¥iæ«s@ZS)ÀTaóÓ"ò.[âôafé–™A<‚ÔS*ÌMºÿõ÷ÿø—o¿dsB·`ç9ÓٜͦÎs8q[z+f<€u™6?^O´®Û¼¶»µKÕeÛñ C`‘Ó=™Ár¥8µž’6Çq´EZ_ff½wŸçÇÏÇÓ#)µ/˺­méÈl„ÌœsûÇ’«Pv•SX«‚ºX27eiu]ú²­áq¾v¶‰MŸ³VËj*ªM[–³±Ÿcк<î·Es½ïsžÓÃ|UíK/h‚¶‘#Ì|Dšýü9×íþ˯¿|íÝÍ|ß?l¶ÌÆdn‘Æð ‹…ÛÝW´Û½­#2XX¹-`Õ®MEzïÚ„å AqmÛk+ÿI¡#fHûç:*I%7¯ˆu¦’þ(°‡gxZÄœ6ç¤ eõôáÃÍí´×‘¯“®JdXœ‡žÃa*ÔB`ˆ(-*kk½‘¬Ð‘Z~•ª/¦»™0–¥5iÂÜZÓµõÞšh—&½—ÌBE,ŒÖT.«(ÃlÎ12<3_ûë·ß{¾žÓ,3Â܇™YÅ`®ýº0y&he/UДˆÆœÕ!:ÓkGâ èµ14w á(“Ô5‹«8”ˆ ÀÉ Va¨ðH:ŽsŒ‘DQÃn•ö;æÌŒÖ„ xï.­/Ë–Ò3”Š‚Ò#–\…²¥ÍA€êòõË/—÷¿…©˜[K ÷“°¡ "ÂNkªÍH‘Ëæ°1}x¦°v5 NÍʽ'q:›s86#Ùk(® &–:ZDÀ=†™ƒ…µ­ÕÑ0 夰t§ˆNŸ‰ày:ÁUS„ÜÝÜ¢ª`‚;Á,hNð*‡$"0 ¹HSæÓÏçó|~¼ˆâím}Üp˜{[–¥ßÒ|W$sŸÞÝ#JÞR†M@®U)œ£)}{[¿~Ý–ÎM¹ÊÁ–dAh¼ˆ‰£ÐÐW4“82gâŒf.™&lDÒ¤1·€A)Ñ•û—ÛiÇ>~~œ¯ÃNw 9ÓŒˆzïòöÈÆÃëW¢h­ƒDKï÷{•NÏ$ÒLªi²'Ì0‹ÚIOw²ø¤‡p¥#ÆiõÒß3N8(—e9ñÿþ'Süå×·[—ä:£ÄB¸þ™_/Ø5C€ª¸y„j[·í¶nKëD4"†…1žï¯ãùîÕÞšª Ê¨µá¬œSEÑü 3ñç]×-í“–ñiC¾Ô‰ p~J„£¤Øã4@ª€¡íâE¬Óíã<öýùq`®ÒnËýyhJß÷qÎ}ìcýúøõûŸïÙÆ~ÎcÏØ“\ÁÑn"«íöôÛM[»¾f UO(®ìå-EΖ€j3y)”#Í\jú"ÌÌÚtéBˆ9„ @R–"ãÓó*#‚¨|òV¯LÑçf¥˜\—l,?O$Ù®¤{1ÌAéav÷•ÿôåñë½o˜- /è 6´$‡³OBÖÿ;)ä#Í]'¼f™%‰¡ÚÀaa–Òê Ïú1g¸§Eš7š¼ˆçœç¹Ç<8µÃR€(ÍÑÒ—¶4^Úöx|ÿþý¶nãµ3¢7}¼Ýùþmé½8N Rb"ì¯ó?ÿûŸÿçßþößÞ¶m ¥º±=(—&MYûòåË—ÛÛ7fÖ4É“íÅ>ɉé4‡…ò‘é^JK€›*³S³j[Z[%ªX²ªöåv»¯· ™yA2jÙs…D[ÁîÂ2ýÜŸÏŸïïïÏ×>̦ûœçf{ðð´0k|Q¹Ýg¸qÒjN^Ž( b½,Z’ìÖ¤iÓR:q2U¸µ¦ „É¢Y~oáªEqBHµõ¨'ÊUæ»ûçç‡;€¸xü‹ˆ@qÔÉH®è_;8õ̤ „#(¯…@¢"¢”È*ƒW ¸õ¾t(GFÔD*«{ç~åè_| &GØŒœµ6½ŽyíªíRoÅyžÇùr7$I`’XfËXÌÚÒD•Ç1ÿö׿/ûŸ¯Çãm½õL²9iNºS9=‡ ]´/[ï‹€ÈUT·vÿòõÏÿ‹lΟ¿ÿüùc:摼ÜÞ¾¯÷ã<Ÿï? .M)agDå¢8CA¢*m nõvßÞ¾|5¢$lË6×3ÑL ˆ~ûþýû/ß{k6*ŒãDéÓŒOm­¯ËÍC6 ÓXkfË*¬-Òà <Æ ÿ$2#¸Yð ܶmÎóý|îc~¹=þç_~•ôÿø÷ÿóÛï¿ûE±Ã±zž›tiï}ÝÈ£/Ë9&ëý¶´þ÷ÿüÛÏß~CÆ""*Zï÷·ÛÚT`žQy|˜;Ûè­-Ûmé D“ kk,"½qaP=•:ôÖB™‰8®F/Â2#ùÉ6˜3È-(••e!ÀÝ}€?EÃ|XØ4ªüH 7;öùñ<Ÿ/‹pPÆûáûI‡‹%TZoÒ˜¸´ Z†•Kx#×ö‹‰‰5ˆ) $ àð@¥‚¤õÖ”EU·Ûm»ßZoÌÄ1DÚ¶ÝDZ)té­5°0›dkýôÈÞZ÷Rì¸ãx½ž¯sd„œÉ UVf©2´#YÂü”ÂÎ8<‚)‘î-6 è“!4-BDì,Pî xål¤ÞáÂZ¥\JÅén3+p”d+ÏqÒ«¸ÀÖL(ïSVw ©I6‰Ú«T¨ÔÓ“ÁƒuQ½}ùú-r>ŸÏŸÏãµ´®Òš´€N™Ã2cVü†‰»j2¹'…EÂàÁìŸÁ銀X‚‚Ä]Ý*Œ ŠÆ`Á\—Œt„ÅôU4&O¦P¸—;Ê“¢–~… $‹<’@ŸœHd KƒX(|øôaÎõ3`Nå¬åœ>-¼´¶mëÖÄÓÒ6 Anšþè|ß–IíôœÓösÿ8=©I1гÀõ'jL›ÆM­i%N$@<ÝÆ™‰hjãœÇÉÌs°v^ÖÆ¢ «öeLÏ1(8:g·Â;š…˜©ŽX1­yï&cØ´û¤ôôhKoK[z°çëÈÛº¶.A*Ú{æÓ¢ qU¢®,…ÊÛ¿:𠡉ÊKQÂî8ŽeUé‹~ûý™î7åí×+™S¢¢|Å+6QÁ9®*ÕÕÔgQ½ˆ„ŸM¸dÞ‡¿vš{¤O°Í1Ó•žåÏÔI-¡®•7ª‚/“.*?|µþ°ð\8®KÒþÙA¨ÝB­."aîÞØE¨5Yºt’uѳk—l0 ¾½^Çi!«¾‡‡ˆKÇò¦Ûý¡]¾¾Íqìû»QÊz—~óé?þó|#åµûÏýõ|¹ˆ?.Iõ”æ¢í\·–È4sQNP˜ÍLÖVyLW‰¥«°…Ó%¨‡?"™Q0.l7‹P3çõÇâü܃ED™+XîÅ;©epe¤"áANBL.˜`¿5þ¶òמ˜#Ü&aw…JÉQo‰bdR&9kc%Yræ5­$ó‹÷:çaÀr×¥¸>ÁꌰviÚ gý£ZXÕ‰9Ò8©±@!Yy’Ö—ûÛÛ×mÝÒmÎAÌkëo·Ûã¾±Ê9Ì,ªçgæïÏ¿ÿã÷÷]µß÷ÛÒ›ÍãõÔ°©\ <áØÖeéI-SÐÁ—;èØ÷q¼æà9*Ãhi6¦°H0K³„'yÁ NmöNS„ f¬Ç'x– »]Û}Úé6ǹŸ¯}?N³î™Úz[׈ù|ÂìiU?÷L.KGmí’œ’}éB høÇÈqGÊ™É9;Å"-8Ì=¹àÁÊž '$ -.—p¢ÌjÉ#ó$£M¬S|ªÀqè‰3`anð¤P(,¦ÃY(’O‹ôðP •pæŒ+dÏJ€gÐÕ°®à\QuY…[”Ó•µk5±(‹"=Ná±´ž½SS¡w9 )pÙX¸o·¶d=)ª‚OD6½k›ÍæsœH‡ Af>§}"’0†‚@ÿr.Ö\„¹±‘ži”Å–¾Ìn,h­ÕcK™›´ué½+ ¹;M»ˆRæ´9Ý<ÊâÔ¤)ã<‡ÊÌz pàë}Äœ~Žyûyî4f‚{ca¯kk]9sP:yl½ÑýËWUY–N¶ó<µõEk€ö­/ë*,áæ$ÂÚ(òvÿÒ–[fü×ëËg4]ðe{LI,<æÃ=Á˺4†ší<âÿ'ê]–ɱ,Ûó JÒÌÜ#"3[ºýÿu[¤»¤º*3Ü$ÀyÝÔ¢bèƒ'¤çì½–wO®,{ÛäöööòÛo¿KññùÞŸ_áᙵmüýïûÇ߈¹÷á6UçÈ >“ÉRJÛÖÓC<™ˆ"cè ¤L°ð®‹"k±þ¹ÖÐÜÂuöL"OSs ×Â|»¾Þï_Çq¨öpÿüÒiù£n<&÷ãõõ¶ýñÇu»`À¾5À Hdy>ÏçDôŒtõ²mû~£ÚlŒñx˜ªº'SÅD¦*UJãÚ[XNôZµ¯¸Î9 [êeá€užætpwS# 3™…©…;$S)‚D¦¦jˆÈ"™`K=Ó§é°Å­7‹ã°g® bf:C,9ÑO4-¬¨€å™6sƒaBFX^ ®¼,îÌt©Û^·"ÌĵµÛËmÛv"Š4 ó)²m"Ï©n‰¥VaÉ-Ya¡…‰¥V $âtíÌn$‘#ÀWÄ©H©@éiß  FŠs2GpF€V<ÊàTÐR¹§Gú™•Â%C\ªs$•yD@À$‚m«m»Öm‹tÓásŽ1çôÆÓ'S»…BXa&°…ð({…ZÈ"Ô|å¦2°Z‚Å“i´VJ­·×ÏüüüìÃøŠ×ýReÓ©G²X8¤¥¤GZ† !¯tÖº&zpÌFá‚ß$ᓚî‘D¶ˆ‹`±$¾Ì²}K!"<Ó½`¿ò‰ßÖ× Œ@ÐøÎ¤áòs3 ‹ƒ¯tè"»€³»¤!¢­ÈZýy$àv¹ì[Ý.M ’§»úI tÁ™aÂT[ñ*”`jY„0-"ùÌ2¤=ž_}ãÂÁæÐ§CP »›ë »Tz…ëå*U K @gTö :‰±0–$Ì$ŒÀÔáó©ýu‘˾Ý2áðœc +`ö~ K„  DØ\ÖÈ1MÝ©H’9"üf@‚fá+„ŠçÖl>QcaöØ‚¹ Iôá½OøvHðBXëÌ\¢¼H\ƒÿu•$"‚Œ03%$ bWëjÓ‰IXÕÓ´#>Ó&:D¤N‘‚ÄHKÖ½–ÏX‰k)™ 9"çtNÙZ­‘‹jÌC“«b„[ºB«¥Va gQ9¡É*[¹{Ì‘³“0“hÐYQvàB’îãcj"‘‹_ ‘Gïïï_sÌÈÔ&pV¡?~{©,©fÃt2sEj—ÛÞöûóˆ„RZÛ¶ÇýsÎP.¯¿½¼ýxýñ²o²·‚‰—vAàÆ9ŸÿõŸÿù¸×ëõo¿ÿæáÏ©Š¼Ý^¶ý2M½«™'€´"µH-BŒÄ«D¶ ²DÈß’ˆå—ȵç]AžïçžGN>f ÂT‹“{ØJãºAf‘*Âf®ª€Xk!fww3Uícö>=)¸˜‹¦ !Bpªµ­¯Z8‚Ö’­!{˜'øêêð௠"IDŠÔëþ‚Hcj)¸oÛËåzÙ6!$¢mß·}'d€À…ÐÜ÷½Ô{•™À ¨ E:lé5ÂÇÊÆ, HÄÂHÈJܸ†–V„3À2,˜K €>{O7]°.·é>3œr}1i„Ñìdê¯ÊH`®÷E(à$ 0Aˆg¢ƒ§Eój× Õ5•ó$æREÄ]ç<Ü=ÃaÎn9»ºšsƨ´Õ²â䉂„ž1ufÚœ\®ô5SqD^X‡l¥BM77sÕœ¸^B,Ðe)¨©ÎHÂeMKD AX!@\( _ÞV¤ïD `2±Áúp¬…{3iD¢"HàAI`™DTˆRÃ-ƒÖœ†Ð11AÜÙ½è,aÀ€0Ñp¸› ÍôÅɕ֜ÊaîÓ}꺄aݸ?ž:¾¤× ¤¶J/¯Û‚ö¤‡MÅp¦ "Íü:æè^‰0e:N'B{-–ij¨S¤·R„)yÝþ‘ËrB¯%:F’%’zë=0Àl. ÂÂ@&ÄœfqŒ.û^j!ÁˆèÃ̳©f¹¦¶Ètz_ 1‘*Ÿ“õ4ð¥W]y@Z=ôÄ ä Z¥µ$QäÖÚµ¶„Rà\*¯b6"P­{Ú ¹"eIBOB&aF@O˜‘‘s˜ö B,F3×…ŒñEG.x“¸Kðzž¾*tf^—ý„¤ïçiƒŠÕ}ÅøŽÌ‚0 » ǰýzèPŒZåííåíõ¶·JRJ»ì:2ZÙèþx¦*#!²ÚðôçIˆek¡þë×ûçûýñþ¼>ï÷9=8ølñ­]<Ã’³žâãoMØb†e¯¡°µÌ`¡Õ`ÂZ$¿ÖÎg—«zï:Ô2s½Xd[’°“¬Ž‘ôM|ssŒä•˜Â:çþáÁˆŒ˜ˆ±3¾5zÙ¨ aδ9ÜUÇsLJËÀfYwy^å*ô,$×Ò²\¡~ðÔIATÃ23ÈU¬Sz©² U†ð™Ö-”Á ±(&dRð©EÓˆ@®¹ë+ÚÉ,@¥TDòH `0‹È9u¨öãy<æ— ç·ëï?ÿñq ñ¥ IDATöú fIâÉk\ª”m+­Ò7çUxu:¹m[¨Z£Mçt³°e_]ç-ƒ˜CÁ H€©ª>¶Y„ sa”åñ-L;n’bnÓ,!Mm&¤HA*è)î¾kµ”}Û˜ˆ¥pÙŽÑ#Sç8Ñ{ú2z.Æ+t›c„K!^/{E`×AAñÔ ªDH3rd @G¢H .uÛ¥m\ÄÃ\çÚøf$¨ùtàD¡ók¶.¼²/FLž¾’º«Ýzb—qámÀÔ­@/Þ‘À7ŠöD†§G.Ê ¬‡ÌLr0÷HBTËp'ÈUXšfI@LŽÄH…ÜWÊÍñ™%8Œ€þ"/³ÔV™–´‰Ì‘j-×50:mÎ\¨ÃôµÂ<mü„" lµ–"ˆä€È\KÝj+µˆœtBH8£çª#2Ì͇‘j©­]ÅÜ=ì/(ÛwIø»þ‹À@Œäj³ B Ȉ§¸…0çz8'€»#߇~³öát?ú“3Ñ‘Ü37ÌP ÀÜji…˜¸\«1MXU â——×*u<{?úóyO³*Ü “"¦*"™yc¿ÞÌLuÇ“ ÚÖ¶¶•ºÕÒj­1Ò·}ûã«YF`b-mI2aÍR<ÝÔÜÜÔ’iáÎXJQíÏcX%5s`AÄV†F"I e(æ” @t¹î×K‘m»Æ~û:æçççm“ËåòUZ¶ïûß~ÿíïÿýz»0†ÍÑG)•ëþõxÞ¿>ÿ:>ß/×—ßþÇ?ÞÞ^M硞ܸ67Ÿª\KkR sfN¢DA„ðH‹ek`Æý4n /tK¸™Nµ©:Fïc€Xá¥òI ¦Fqk ž634Cƒ8!ÝMݲ:.ê0R2ae©­1—¼ì×——׈èÇÁÌ—ËårÙZ)AD¥w±dó)R·º.6†ë„ˆÆŒÖpðPU ['Œ9ƈÅÊL5Ã,(¹jvI!žijsZ8 à˜sÌg†Òây¥ep.\!ƒ02øâðZâza+÷'^X & $raAA)±Lm±*_óyOw"*RˆIÊVQJ©R2x2è2–D³>‹ËìŠ!Ì è‰i2#TõÝÊÁL<ÕKmôñESž™(„/—«f3×!ãx çÞÒÝÂ)ÉH€7Dôi‘«¥D„áàÀáii–iH„€©ä Ä)€bÑÑ )Ã=9“Й2Ò×87# I2Ö©r%6—$%(XØ,O:Fš18•D…8… Y("ÇÔáññ讃ý¸”ܪè˜úL‡:Žá½ .O¥&1$l_‹ŒÀÈ´²mÛõGh~}Ì0¦Ô ™‚Rb(€ÓMŸOÏxˆt^cš*R—´.l‚S2©áöóky½^·ýV.yè¼÷/PÚ7©òÓåÒÕ»LÜRmêÔæhîêê™hžî~âr’)± ³©-º‰ài¯\üªÄXí´…l—ˆBYÒ™¢|CêÏ&.#ñ¹òÊÓªG… õ_^ò/²Ä©`‘hæ€ ™(k-‘¹zM|žŽ‘˜!œÈ3#ÓUݤ†D"#»03þõ¸nKÈÀ‰þ—Ðç\s,•-“©÷>ß?¾ŽçQ‰ˆ‘™Ž®Çx¹n­J©\ÊNÒÜ!7 ?Ý“?î=ÔÇóyÏ£C3òö²—BŸÿù~~NsvÄzæ’Öoí/»Îuâ O:Å̧;ØñûD€:Ī ° Ð£«Ž©}5[Oï9ìÙÇó˜j‘D4Õc"Bxn­™å‚¢!‚ÈÚC䬸e¸ºPg-T„™QªÀ¥Àކ9= ºÛŸœKÔBy6Z—2§‰ ³Çpõ$‰bÁ~(ÔÏúǸ›áA²!5O ÈŽÅ[I Ai EÐÌ"4 Ü“2…Wˆ©îíR¸ ÓìÝ=Ka×ù|<.t­­µ¶`k‰e[>NBÚ÷öóç R‰çC1‰ý¶É^`«D\!‘1‰Èæúî$<Æj Ié‹©èÄT[uÂgAb(@•¸ S@hè˜ãëÑ}8x"à󫸆²µðVÊOz44SŒ‰éF,µíÄ-c‘å2ˆhù 3 ^o·v½&B¸é8æÑݧêTÕHp1<Í5Yj¡*e˸09€…Œ,"Iˆ¡Hp)­¶K-•0R¨´mß¶+%¯Ç×»ÙHÈPÔÝ ‰KAfNÄ4 HóLΔ8»¹•‹ùIñW5!3M-ÃÑC88/ù«Ïd”§ Æ`X£óp ÂX›xdÀÄÔ0í9§"ÆDÎï--`ñBŠ&b.,Of"3‹ˆ|“"€À!eÛ®¿ýØ…KX˜¹EØj¥»éóyÜ¿}Œu+ $²µÖ„9Vã[„K‘"|þŠ-wy,~Ð!ÀD·WZÏHD$‚L76§»`Åbá’Mœ×¦oÍ73ÐZÐyDx&%‚b*á’ÈQÙ÷v¹ÎÌ}~ÎðëõòrÝ/m¢˜®½ßí_ÿ§5*¯o¯?~ÿ¹¿\I$(`öãóýý9׺ïû¥m¯õÒÛóá²oÛeSiµm„à¦söýâÈ’I½÷¯÷ÙŸaþññaêD¼©%:bî·kÙwUGŸÏñ|ö1œŠ¸j?žÇ×}ƒ[«µ)ÜÝÕl‘ÑëåÊ­rïG:Ôæ¦,”®ÈÛv¹aº=¿ÐG„S¡¿ÿñÇÏ?ÄÌ<ÿ5ôþ|¾5þÛï?[ûÇ¿ÿþþëó8¡è÷ÇýÏÑ;C昄X¯/Ï©ÿþïÿÞßÿõó²_~þtí_ŸáH\²{x4AÙ.L€kg¨‹Ê‹‰f³¤lUD¤Ô«§ö‚sU¶(îàªöxÎã˜Ã|º«BT.e,pÝÓ’™yؘC#) ‰3 `ªÎ1Í<|mG|‚#áÆ ucÌY„Z+×­pN‹ªá‹äà™ªf9³–ÒJe©‰\êöööVXz?²Ù÷ÖZeæ…s}x¢Ô*Â,\¤Æ´çóKõ`ÄZ¡ônæaÇÑç4ÑáîµÉ¶oD<ͦÙTd.Uj3H1ÅûçCÇCõšh!œBëûŸÀÉ´¢.Â\! ’8­bŸC„ë ‘U¹“Â%{º³%/È(’…GwÕ*ekMJåR !Ó “´Í¨ºÇ4UO&$f$Š€PS‹• p³såU ƒ© 3R iaža8|Ƙ Ž„ûvݶ‹ qÖIL˜^!0|:èÐ nÈ@ ij«»'õé„È@ád™™èjÀœà“tbH )Î|z‘ˆ923Ñ"Ô-Á"œ4À3„‰%‰‚p¥ˆ°eð˜îžRJé‡}Ì>‘ ZdbH…5uV‹c>§û‚e4Œ—: õ¯ñ´d©ÈjAièèÝÍVmŠO8Ö’º€%8GààmbŸNI @ “éÄ‹ "AØ5L‚x)r¹^/× ¶²Ô¶nÝ-‰ÙǘÝr¹Èµ½Ü6™O³°¬{ j è:l*¨ùPcLÝÕÐWUÓÃ}^Ùb±ÜÒ ‘˜Ý–Ï6Ö¡èÜr¯ # 8ä4#5iˆ‰c*„#-<뿾„tÎäV®…+ñRÿ&d’9¨‡›çºãe6‘Ó@µ"­I ¼²È€À¶šXË @PD˜ØÌ̧O'w)u=“E„%á[çM믞fº çD¤Ó¾úŸÿüóÑÇý1Í <.[ùíÇ °$•ï-çHå÷°ÿºЀ°h¨kÚÎ÷tmT<…™[­U $¬ü÷ÑGWµˆu^põ1Õ#V‰Pm |;î[»ì»Î]tá’V}‘˜Ê’®E¦C«¼7.œ !LLˆ®¡=|,—»¦5)M‘ƒÜy D-Ø€ØÝ|Á´3§&`áJµÝ‡}³Gö„¯>º=KíÛvÙj©Œ{K膬î 6 F²,s‹©ÌÂJ&æZ‹\.ÛÞªelÚÝ}USŽþ,›ì×}ß¶‚‚E’1à„á$2·Z„yßëË­¾ìÒ—´ÀpNa€ô•D%ˆ"œˆÏÙýyŒ~ ˆ¤Ìôs9S ³Pxô~ý9ô7"¨u»½Þn·—Ä6ž£Óû—¾ßŸÝ†©y?¦5!å?ÊRäv»ì­B€y>§>ŸOÓNߤÄRvæFÄ,Àœ¥r-•Q ‘‰yi„ëÆRIèòr}{{a$U=Žã8¦ª]_^uö©C—ÚåR+A’RKŸ9zŠ@ÈkÕ“É –-­ÖÚ-õÁ‚œ!DÄDŒSF¹pԙȤf0zØTW [p ? Ÿxá=…J-”ä§í8)m¡ÚVŸ*פ½ýxyùñc¨}>>úxŒqúû¾]išNÕϯ¯?y·ËÅÂÊÖH˜„×±ôqÿú¯ÿúÏ÷¯ÏRëõz}½½þöúãv¹Ô"™ŒŸ‡öIÂŒH™°]˜ 9, ¦wÉISu¾|&ÐËËE Õ­ì׋ EïÑÇP}|Þͼl¥VqŸ_Ÿï¿~õçQ˜ß^^®H˜>mšyÔ¶Ýn×$)RØ??¿ÆÁÁ þãÇíz½~ýúu|}ö~`-ûí¥^oóñ|jª×}û_ÿö·ÿõ?ÿ¾mÕ?ßã ÈÖZáB\JmûõBX§Úñ<ŽçÓT¥Ô×·—g¸êh[i{“mÛ`)ž}yàΞÛzxLõçÐÏG¿ßûœ6Í,µV–›p]ÛÙü~-Pè²­¥.ƒ%8;¯€YøúàKÉŒtFh’"M cciä! =%!3ÀÖ½š¨dšÁf.\‘$‘¶­SŸ£Ï΀™À€’ëø`ú<ŽÇ1¤î?®—Ûe+,¡ú|<î÷¯eáaf–ëÂ0tNõX 8Æ0¬–DRx¿\n/WU…€ûÇý#Ò‘‹Ã8æˆ$–"R3L§XF ð€ ŒHL[E}Kp."˜ ‘‘ž'û×ÃsZ!7v „ÕÅ0œ‚$f®îæŽD@è¡“V“2´ŠÉ4ïsF8T_NΈ%Ÿ DœnCMmEP* !xeb" H@AÂ4sxÌ mª,ù#¡a {P $Ydw@M »pe€3¨—pê_ÂËb©ÔÌ["gŽð§…b ¬Î‚î¡àÂŒÓ]ý{#bhjá ¦ )"·ffn%ÍɧcJÁU»@BŠÀ¿4GK`k’"Èôè¹¢ìS3È·}ß.m­,ùøêóqd8‰'rJL‚˜§ª³'±ùzüŸ…}€ ‚I´.§^€#`šyŽÄ’É…ÓŒ9‰¡áÆž{ÖëõaY‹l[›Ó³«ED©µ¢¡¾ð‘TxåcÁW•ìŒx¯2žÀ9$ZÜIˆ@d"ZS|ÇtÿžCÃ÷éÎL¹¹Ï©E­Ö5{]µEZ½ó€ðt$ @8 ±†Lˆ# «O‡U'âe?Gyk,u2yÐ}•Iþº]ÀÒ©¬‘9“æÅ¤G0ÈeS%Šs3wç&ÂuÍúÎ,E¸š­B!¦ëÞþöóÕôr»í—ë>§þó_ŸŸ_9õ²oCóÿíå¶3`­ì@G>ߟ_}–HìC±ÖR·Kuõ‘+=ù—8ù,ff.IÐiìŠóOñPd&1 ®=µVZáÂLã8FÏiÚÇò&xXغx3‚E®'|b®a‚ …°d  ¯h8xØ+T&!$ aVô® T¨%*hfšçpG¡½HÝ6"žïÓžà|©(Ãq8eT®…Û~¼O?‚z–Ãiò2ûÎñRù¥@EMMsSO·(E6q 0ŒÜÀ’Œ%Z 4ç„°¨[}½½–*¦vÿúãy¿–ʵHi“0ÒÓ( 0`ÑkÝ[¡&ÜŸÏPM57U›‘+µĩ¼Lžá:ÀÅ´o?@\´r´©½?Žq FÌ™e×¥\ÀÒ½þ `¾?ž_Ï<:¹¥«.Ô’MEO³1R„?Žþùu?úHDa.,LS%Fâ’[ã"€Ó×þ­”½^D* ¶­þ|y{½¾¶ë^ê^Úœf€à‘na½Ïã9ÒS1-|"¢p!&µŽ®ÃÕFïIÆÀŒŒnj˜hî±Èëáž™LF+sC†˜@D à˜¶šÅkyᱚ鈔H$@K†½À_™‰j g¶>#Vkl¡Ò=À#‰’Á 32Œ89Îz`ºF‚¯zL„Sc9›å€\ˆ#ÒÝ=ü¼DÄY§AŒ¤ `Ò1œ ûq½Þ¶Ë…Ôg?ŽçÇ×q¿χa}Ùâû8Öl¸•WÄ"ç*`iðÏSB$` ,[ðR à9SˆSK_Òõ„¿ /€”@á§E-3"§/£a&Á÷{ˈè˜È ìé…ðvÝ_^.ùõu<ÇœsNq7óÅR9ÜÍÕ ™÷¶¿\·ÛKÑœžnöyÿ|ÿúøxgæãñuÜïéöûÏ?ˆ(3l¨©sd8# *­f˜§ª=ï_¿þìsÞÞ~^_~<îÏ1G³JµCGÛ60µ>æýñèý൭@Äóy½›k‚?ޝ «å<ÊEDWK&‘}¿&´çˆÇðôYˆ„‘( {ñúò{Ûþþxyí}¸ì»j­µmÿFØ(7‘¯÷÷'Œ¡ á:ßÿõëè=!¦Ö pŸÛåZDÊ~ .#ó9Ç×ã‘ÛœÂ,,µ5µ DǘÏ㘣‡ùÞ¶­n·ë+2­V¸lU˜“°päZ5™Gº›Çý_Ïñù8>¿£kD"'Q‹  \üs-½­™á®nÓÔ›ÐÔJk¾¼õ$ÛΈ…ƨéÂ^(05Q…²  «šff@dXù¤o¾ôbªÀÒ ` Si1Þï½Ĩ•<\gd$™Y¸›* ”RZ­þ¸?æaªæn\‰ƒ0’iÅÎKãÚ.\j&Ì1žÏy|¢ÔKÙ.‹DÒŠ´­YÆçǧ¹¾¼½n[Ëôwùó_½ëíåõöò:úñ|Ï92˜ÈÝ#“©Æcê’—®O!¡Pab@@òœ–±dæßƒb0‡¡–ˆµr"X$BÙâ§çLèÈÀ¢‘S'CÔÂĉ LH±j#"‘pª»%baÂB…2™BPŸ}NðHOŸÝý±jä,BR†¦)VÙK)Ä¥ 2$ªYšj†tdi¥äu€sè둖牃 BAÈ’Ð…0GFš cE °ÌŒ`©À⎠ÈÌ;/ÂX¨`20‘l\÷„JdlÓ##¡î›@Ò"¼Ä÷Œu…ÉWZTʲ‹.ø«‡Åªj \¶º]Út1%áZuƒÕk á²5ô©¡ƒÀk1†V[¨ëq¸*¤­c¨ð¢­¨Æ Sà„ôñœê‰®àϽæËK«•I˜³¾ÐþÖZ•ƬSAÕQ”…8=2jáÚ.m3S#HC¶õßLËL:çÎë´¹nk uN ×@šYs¹WŸ2‚˜Ì¥÷Zj)\KÃsjUXÖ;”‘f‘D´dóˆ–¼þÿ,‘`¾¢Š€@°ÚJ¹Àüé a©æsÌu1–RŠ"B0‹È)’©æIKƒêœÃÑGÎV·Vëš>ÑâQ­Ö\€O³•6¾\Úïù檵*o¯WDVû|ÿ||ÝŸ¶ªì¿¿î[ÓÀIêåv5þ¸ÏüPJa$b@™„¥– Ó'Ú)ú¦”Bfú·C q)î–oî›æµ CˆÈ DhAÄÛV/­`¦›>·]xØfD‹ˆp!YïXäT[ÊNZ0@w "ÀMiÎà…`y¹”*žjÝç|àŠ÷Ç@*Aˆ3t¸ZB-•„¥cñK…` ”É`™Ìm¿´zÑ‘¿þi%¶©kxïèc«òv)o[^H1L=,àR3‡¦pCi¤ Nè ‡3cG-åzÛÿ(?/o¯xÁ„TŸG?àWºçåzÛ®—º5&ÓÁ 'l¼^o·Âäýp:0!çZ’™®-#^¶Ò˜úС¾¦Å¥0¡ÇÙK_&,H!4ȯãñì#3¥ÒëmÛ7¾lrÊý~Ÿc g†™Ï#Ü[+ÂX ÔZ4ØSϸ½eÌICç$&`X¼¨ÂÕ$¦r ”V@ƒœ¯//"m¿–²\\€ásÎqÕ° L‡0S[óHGŸzG>…D .ë »& ž0ͧ‡ÙzÅK{™‘ ÚËå…¹¤›‡…O;—„kÆ~"às‰O05'-ùfø°¢ÂpZÇáÔ`ZÆZÉ`z¯¡ÂÚ©EfFæbŸ-í6¯N!bÆbõ­¡þ2;0,íg$P0S­[m C"'ÒŠP®õ®Ž÷_ýùcîc$å1Žãñ÷ç<Ž0LÊ\7K\DËæÆ„˜F¸ZD\X„˜ó¤øÐ©@9Áåß9¨1´®kÞá+TE”¹¾èëˆ`6æ:¦+Ð"µ&e,FSäùœâ…&"DH×ð¡Ä<¼Ï®¦£whµÝþq«M®·ËõúZjMHscÏç¯÷gïS•͘Pëü¼.˧»­&4‡ë°Gä¾ßöÛMJ ·L ›³éÁR÷ëíåíGÝﯯºÕºí÷ûÝ™™Nsó8ÆGŽ!h¦Ë¤ba_ϧªßök)u ¨úÑÍQ¯µJªR— èØ.——½õûûýãÏèöÏÿ®üóïÿöòóo¡R™k *…¹èøúçþßÿóޝGŒŒ$w ”V[-Œ@"¥³ ²>T#Œ"Â’ÂP½ªÓ2òÙ».Á‚9Ÿ âZêÞêe#FÑ1å„£‡9ÇX ¨˜jc<Ç43È@ˆ"ÔZ½^ö­ÕÂ¥æ¥Î6K Ä  :qRFBªѧ€l­ÔÛ¥Ušzø°…ó‰N„mkÐÖ7*—~ÓÝ=,\bÓPjÅZÄLŸ÷cvbtãââ}¸%Œ©Bôr½¾î×R[èüõñqÿúúv#×%“GÄõ>$"!Š”¶í$åÙ»ê\þíD”m«Û%ÝLÇq¿÷ÇCu~|~zÀï¿ÿq{}sKf~}=n·—·?Ǽà||† .%Q©j‡TˆD(k‰á„kȇ‰AK+^ " fŒ<ˆ'!¡šå´HÄ9ˆÖ\eé„×é`AøP$X=˜8—S¹TÁLÀÈ@ŽàµDP9@+“º Hfn@[Ú6ºXÔLSt u3LI&ópDdöŠ›01ÂJ´'²§€$ À¤@‚ŠiØÍVœH(‘ 3“#ICMªW†tÒ‘ß Ë‚¥BDD沆ʀÁ†€Á…hc3™Æ´Ù= Jb"q!AÀðH[G@Y „’]OŠDÀ„ †oJ¦ûÖSUŸ]MÓ‡çšÀDÅËõòã÷ß2ñã×G¿û^ùo¿¿^¯õܘ:ôƒŽãÐ…±gY“l)"…]éësÞ¦ŽI5Á=žÇè#ÌÒ祡ÜD*1#Æ~½•˾áñˆi Dµ•¶ï— ®DRZi­Ìin¡šß_^ÄÀD@4GZ'8©Ž'gMîa ¾Ö )Ý "Á‘rB‚‚£†Þèòr À½?þöör»# ­à‰£ùÖB.b? S)UVjd‘@¾ÿL¸ôk¶™cŽãy¨+—Ò<'»›»3·Ö¶†L % ¼”¸L LÀÅ£>cÌ @Ì$ȹ# ¶o™:m¦ÕZƒ LŸÇ´‡Vëõvù:Ž÷÷þùž £Ï—ë&U˜ÛV«Ô1Æû×cÜûbº'ä4_‡ fªL `‘ Àßs€õ—keYþòM—ÏD'#4!Q5¡Z¤Ö’nîinÝbjºA$¬ÐoB,›æ’e.~jBÑ*ð¸Eºg:3ÆVØ/ ¯….5v1f?¼O½OëŒ ‚™áv(IuH5SÓd>7~jËY(®”XÝOÅŒgÖ²¶IûõåÖn/µ5ÒÄc¸{Æ ÌBÁia=ÂGÀ„œ™àªîCDÛ…œZ$£0 2ºª†zA`dŸíñܶz½\nûñvÞuÎ÷_sô«½¼áϲ8»ânnîÎXŠ´Ú*£U53—£?žÇÙg Ê$5ÓË„ IDAT­4º$ašɨ¾Œ{‹ éѶKÙš<}¦ÇjèýÈ5Y&¢- _k+B·]DÒ×GTYˆY–8[§%x­H¥]JòìfwÏÉ„¼8Hc*&„C&©{«X CRYè'0ÀõõUj9·ƒžAIJmëg!2úóè‘ZMw²‰Dt*rMà (Èc¹ç,Ò–€6<ÝÒÌØ¥°›A¢ˆpŽâ®:×âË!"ì¤åð ·g®GϺ| æ>0 ðù£îé¾tR–AÏ3îij'’L:×9ˆµ2“H–eP…Œ\Œ†…äZ;m"&^KÃZJ©"UH(!m!õm/u9® Žc8hŸ‡ŽÿŸ¨wÛ’ãH²,åªjæ—€H’™5ÕkjÍšÿÿ£îéªÎÌÊJ@D¸»™©ª\æA¬G’Xt7S9gïáÃÃlFøçý#!-þ`ò"™Á¶m9cF"’ÔeX⩘NÒ§lž§ÎeZ:hrÈ<}Øh­MÁãBb¤¹µ>FsŽ?öÔžþß¾À¹¥$–B¢}ŒûíÖ¶U•˜†Ö÷Ù«b¦Óº^/×rš3"E7Û¶ÇÇÇÇãñx<¶Öº{$ ×RÝ퟿ý×~t|Y×—ÓI…<ÝÆ 3Ö¢Äd NDr:Ñ Ìõt*K=AºB€" i>ŸÈZÔzŽAs‘ÌuÅðqìfýÈ ‚áÖf} žýT³Àô2À²ž¾üúóWŒ¯ïß<€šµf§åôéó+!g $Hâ ÃŽmÿþû·ÿüÏÞß¾+%ÑŒØ.ЬEù´u ’}ìÞ•8œIN Ž~Ç–ÖUü„¬â9úèè©¥œ¯/ëå\¯§å´.µ"±Œv±ù£w3·£÷ýè™D$³†ÏÄ×s¹žÎáŽD¥è²ÔZŠN¾¤"Ø $s&X¸$ H}ôÞm4îžàSL›q^ÖÓÂE¸µîá€à{;Æ><"Ed]­Ô摉`Oœfbćc]+¹…ûhÇvômŒ‰‹.—Óe½\±âÓåõ˧×ÑŽïo_·ý1;‘1¼[ ‡›YDSU­ªZ¤*'dúÈ4-ŠxLG:FÞcŒ°‘fîƒ<.ËIY6î}ß»°¾¾¼ ñûÇûv47»¼\Ï˳ìÃ/Ü÷ÇýãMˆÏç+’½ ßR¹Ìá~ e&y*"ºÙˆ‘32‚Ê<É.žh `Ä óͽåü±0 3b!Šd I$· wÈðIˆ„nfû1Ì:@c “h%:#3qM:麲šEÛ©æV";dŸÄÄFIfSó™øg£$d‡ ™>ÌôdH%f„ùdÌH Ø„œ9XF¢Oÿ! "+8fú°á2SšÙ<°[q a°”}TÌÒw­Çœ¡’ Êô*Ìx10L#c¤›?O™sÀ3á ™fe‹‰˜Œ–¹=¶è;ˆ'8"a.ôdU’œ=U´„eQô¥JŽ“Œ–î¤zÞjÙ-’Eˆ²[†keŽôRe÷r?Z·¶‡µ‘ÀˆËaùvcDÑ@ÉÒ’0´ŽZ, ,§s¹,§¥” ÉÖ}Œð€‘í#ǰˆ $$åùv˜€¯‰Œç¢}¾C’rÒ`²¡`R(3Ãc.p%C1ºZO¼ 'Ί¶ÝËñØ/×õÓçëëõTQ|¾VcmaòÐ1Fš*€ÑGÛ7Óµ“öŸaá³ñ0ñ¤¢L¢*Rz߿߶mG$Q©UE$!f×¹y¹”×Ëi]—iET-fùÃ{ÎÞÚ8ŽÞ›g (ãðffDB$ˆH¬3nÜšmx¦0~ùüB„ï÷¯ßo­Ùõ´\΋V‘"KµS-_>n_>!~D<Á”™Iá0Ø3‹ÿÎÿhÿf¢B>o=²'ì)0½¯Eµ¨§Ë9à€™íeF!·§Qr¦ã‡h)i8Í+²…¤­KAL3ïán&쑳ò*¹(œ—'¶ìð°n[6œ¥Î4¡s˜{X"¡oû.ÂÅ=9Çʦ “r–K‹²¯ûžÿu{ü¶e‡R+‚‡Ú€HA/œlß¶wB¬YÙ°%ì‘=aŽÛ ÷£;Ÿ’'xnòÙX’ˆ¤†POøØ¯Ñöóéüzºª”mßæü2ÚÑ·S§B’(±[Ž1b©å´*++/QBÜb„°-'$ £>ˆHÕPÌÍZ>¼·#GoH³EDLtÔG{læŒºŠ ý˜ˆO§÷ü&Ì3%dò *8©$£yC¤ôìG÷>ˆˆ°Sdûæãn£Ï*4# °›Þ:HÐ0Dsƒ„ S),*4ña”æažÝˆYR%iªm"€˜Âg0])“rİÉÌxîcP:yfä@´Ì$GÆy'˜~ J&&žñ! .ün 0僳TeÃ-2G·4 tˆ 33i6›M |ìÆHÝ¢{ÄL)ÍùäsN?¿´èÈÈ釛€é€ ¥N°ñŒ?MÈeªÏL4d΢%0 €'""Ä\„!O²@LÆ%I¨8@šḎP¸ç$nÏI3†C€ÖRj=ŽÖ†ˆ§õº¬‹¨Î§­µ  Š0##1’ÍéõÇÇí~»ÛèÓ: ÄÏä•g‚ÖÜŒT݆õ¶ðRU%Ü÷Ç1Çè–$t}]yÁÒˆöû|¬ËÉY'D×õx¾œÇöè÷;3íÃßî›=VcmÛ¶G7”BDx9-EJ•õRJa³—˺íëŒx|úùg¨€ÖõòËÏ¿¼^^4Æþøöþþ¾m‡Y$Pxl÷ýû÷·ûcžî!DÀÌ,\ 1z9Öõb&÷ÝöÑG°…kâZ—z¾ËzºˆÈãýÛãûoè†Ä†*õüzy‰±Eß׺üüË_¾üåÏç——r*E£‡xDþþqÿ¸G$ F³Ö‚ÈR´°–ºÔRtZ ‘pzÏ2'aš–•§¬UañSzÄèãqßömwˆ0³ûí>޾¬%Á[ƒÀÍú}»{³‘™@D}ÁLpÏH0Ç`áR”‘À3<¡Yï­ !zŒÑíh­7»ck=]N¿|¹–¥Žn¹ocûN¤Z—1lÛ÷á2GïÇ~„û²”óù¼ÔÅ’…ÁýrZT‹'lûÑÍP¨¤0xB€ˆG;Ò#Ȳ.§µ û¯oßßow†ø|ýôóŸ~¹?ÚÛûÛËõü§Ï¯ßÖuxÖe ÷÷cî%!YUÜmt‹1š înžV¤ŠÈ4«²öaæ#3ˆqZˆ'Á•™‹¨'¥"tDy’ÉÜr ³¹W! âèÇG·ó?S/*¥VUÕZôTÍ»s&éB0,Æ–@—H ³è}z"Ú˜â'Lt™#\Â)#‰r*”3x–Ãwƒ9f2 pô1<ŒfŸ6!Ý ¸&L=dºaA 0Ë1Uéä£<º›·}@„ iÑ©±›„6šF€@䜌U7sàIm|2Ïs"¹“˜€’ÂÅÝ  *ŸŠx‚A&#qÎÍp~|ܧS·¨„·ûGa]8¼÷L.‰¨œ‚|‘Ý)3N‹þt^-ß>òöÑ’K;ÄÜG6‹ÄQ-˜‘2hYW>].§S]ÖBˆ˜‡ùÑ,[ßö£ï[wŸ&Þ'è~ží§ý*Â'#òG°ÿ‰ŠO˜{ä'Šcã9s–ô ‡‡‡9¦$lÞ:`¬ŠÙÊÇ·wUü·û—Óÿ󯧓fÀÞso­ï{Œ¶.õz=³¢û´1fn‡¼ÝûcÀµÖº.é€a™€<õGÈr: ‘¶fï·ÇÛÛmòî‰Q‹‘™…ÅRõËOûéåz¹\_.,¬ª "ÂÊ̳ÐzÛ­5cQ­éáÎ¥‚ª0ñ‚¨îÜÆ½ï󨥼¾¾Ý>>îãÃ[ïÝl©B˜"t>ŸJ©?ÿé={ï–9SiÝÃ-=æê="'ùž‰O}õ…Q„˜ Àç©—„¤Tž;,÷d&ž[˜YÊôð@Éæ3a„L“»ËDDdÓNBøéR?¯´ÒQy¢Ó,FÏqL¼³3=Ã4«#Â3 ,Ýû1L¤Mt0c2NÝ›$1—*,½åoïûßÞý[V¿bÇGâcbU`ÖÐ÷q¼¥SÒZ00›gó´i|Tf€0kû‡sÓåÂ1†3VUF¬™‚Y $º°'C9 (T¨Ðº(*³µÞÚŠ®k]k%@î£[¸ÆéTH0RXj-îné6³.ff>ŽÑúh¥èõrY´ D·æéžÁ¢e­äÄáæáó1vÖz¹¼þôÓOŸ^? ëï_ÿûÞ·cŸˆªŒ¨…Ò‘•3²{7ˆpH#èh*žæ‰kQÕR £ˆYw룵v?ŽnöG¥ô&õq~q7Q,J*$†€ªg@ 縔"õ”žÃºcâðn†¸Ë¾1º4šÓðæB±0„ÙÖÇ‘Š»Å¼±f„ïB´Ô…™#2ÜÅ,2‰‘$“‘qVV3sªb" “‚dþ) ‚‰DrRl<ÑfØ8Ó1K‚Ž¤Žˆ™ADÁ¤D™MžŒ’€]UêRæ/!YD« k¸c”™îc˜¥8†¹ÏÌÔVbNboûD¡D "1:Ì]ú]àä—BB&’„Ãp÷ŒçrRXrn´Ý–ˆÐg-8¼µnfÌÄ*¤Rë’bHBSeªJ“÷0óA™Hª…„T¹ôÞ{cNÒ# aÚYŸ­¬L˜ U´ˆËùr9¿ˆò<–Ôe]–SDŽÖz?<‰.¤ÅÒZ;zë(R)T”i?š¨Öõ|zFŒã8Žc˜ƒ–dÛA xdÒr^^>K­îÖ Ì‡…eß·÷¯_Óòë_þ…K‰B<¯ëËù\‹¶mûøþfæ¸&eY——×k•žûÛþÇßþ– Ër„—E_Nkʺª0ûu -o#ýç_þ¿þíßJ=1*GØããûÛoÿüí·¿þã·ß¾=2¨ gÂ8³H-’.çZN/—Û¾?öíÑ“F)l3“¥©*üúzýåËOÊZ×+Šîk±ëZ)=òmÛè¼®§úz^ëëëëz}YÖ³*eØèÝDZÌî¹õ¼@K-¥Ò” NVŽªýX0ÏP‰Ç\0"f8p¤Û̈Í0±ˆpº¥EËãïÞ´+1ºrX}L( ‡7ëÛ˜ïÁzs0rŒ,E*âtÎEkcØ)L µV‘"¥2òÂüRËÃíÛÛ×ßöÃÌ#©Ô5 #`DÃrj&’us>>|¬íQŠàù¼\_.H¬B­w-‹ˆŽ>"rYÖõ´`úöxû1Ÿ3½·>FŠìÃ]jYÎýqk{ûý÷oG·íþ8ýòë/¯?}¹í·¯¿ßnƒÐFÂÔ2PBá„ñ yŒÄÀôYÖqH˜=NšŠ Kw&&@ „ ôùøËŽ6ÐçZ2Sû€£ ó„À¬E«È©µh-`8ÚHÀ<ŸðeAeêÈ©ÜÞ ˜ˆs¤'È" FmÀÈæ´z'I,|Ò i¹‰jæQ™`(èð4v§½;‘EžøÈî)ˆ€™à@($”ˆ#“ÇР`LE«½Ñã~´>ˆÉ=‰À)€Yæºw›žJF$d¦ŠZ”Y> $$I â)i %bfHG†‹Ü{dó>nÖwÇH¶¡6r€%ÅI`ÉÆnÕX¦ÆŒX˜£/Zˆ/ÀPï­8U’bæ1:: "£Œ¬}7µº”e]J-Œ„s&B"$Ä*fðþ¾· B pØhÃ3@žÁš—ž|^è)ÖÉ?V½s#À”ÄɈL‰>Só?ìÀàÄI!­g7Š·¯·o/oøºzÄÛæï·Ö¶Fá¯×Pâ—EŠíÚZ|ß?¾? ÷BÎÄÌàÉ €à4[H`æÂT%Ìem­ï{oÝi®(,AD!3 ¡÷x¿5 N’Ó©  2O†Z&!¡ª,UgêèýOp))áOæRU¡Ë ýãöØ÷fLD„æv8I‘™fÃŒÞÚ§O//çúée… $róÄœ‡_÷H°ÄøóGHLB¤ÙÊNHøÃÖÀIŒªDŽùh}÷Q‹¬u),ó½Ióq¿}Ü·{7#ÕUÈÐD‡˜[pDrv)=ýÉÈ·ÑÍ-Ó…IY#$˜™ÕqŒ´ÑÝ#rÇl à”€ÃÝü0–|ÆZD«ÔB,›¥ïÖÒ­2  õü°d"U®‹®çEµB`Í]Bú¼agÌï‚pé£ቨ¼"Ï‘_Nëª,±ßßÿö¿ÿçÿùëßÿùþøºÅG#„¢€`ÈŽDWæ²På£f¿T¨ˆ[PÔ M]¸ßÇžŸþôúùõÊ_.§?_ªdt»——B¬/è­÷÷c`­¯ëz]./ëå¬LàÃÛèæ‡¹JëÞFi]N™PJYª&Áy€Ÿ°ŸøáX…ˆø šÛ¥)"š ppˆ˜t]÷pO-Ó#͆á}ØÑFÜ7<­|^E˜Ut ¢ÑýØÜ æ,!Â-F¸ Š"!¹E„‘8@u½œ¯×Ë¥­EíØîÛ¶½}Ü{÷$$]W¸"Ö*ë©Öµ¤§ ËLfAÖîxX´æ}Ä*´*1ùº¦V"Ö¢p^—e9`$H-Â¥êþØ0±j‰ôǶ=z/ žÏ×ãóçÿúëÿùÇüû·ß~—²Ñ··["ÿôËÏçuycê£a†ˆ0a2¸÷ÖÝ<Y„éY?|jØæ ‚rB61ˆP€1ò™!¦‚€ðdA̧v+‡õé›OÈáÖ\Î|=-,eß}㎻yö¡¬çU—’Lâð QÙt±;ˆr*9¤eŒ4ƒ€$Ï‘Ðáiá‚|®L<‚çôž†¥Cp„Fc ÄÈÊ ¢:‰“m aŽ ÂT˜p®Zˆ qjßýñhfŽ„9"sQb&e!јh f¤g˜„é¹vÈyº†Da$ž¤LÈ$$‘éy‡ O@îSc üy¢FºÛ ŠËpÉpBLÎ0G€`‚Bˆ 9kt‰b;H¡‚òéTꪆʪ™ù¸Á~oHÌ(4耉("ª2·vO ÍÑ”ÂëZ—ZT[f–"ªTB÷£·Ã|<ÿUý„Gü7ž°™yûJÈ„€ JFBdÀHÊÙ¨ƒ„ÄÂ* ŒÓY'Âq»÷ÿ|=) =:´DGÿˆ8?¿|º*Ë0:v{ÜŽÑL€"i˜Ãщ9=À ’ÀÚn­u"¬‹M#0}ß?n{kÎ:Ë{9í4Ê"""<>îÇÑÜ<ŠËõ¼”2—ÆD’ʺ.ª…¥ÙÛíãöˆHUE$Rá#&XjyÉë°Ü¿ß¶}øpB23ßÛȈl»w˜àµ(×Z=±A?z›Dþø£€=»†Óâó\Vá‚êÄM4>‰ˆ„Sêì™aaF ´¬BœÝÍÜlxÎó÷³¿Á‰X—"Âcxïc˜ ³ëṪò²œY”‰S°ð i#M‰ˆyÛ÷û‘#`˜E¸•"$ìγãAŒ¨Ï†!>cHD¬R e´qôŽ`µduYêZ.g{±À> $<Çψ8!­ZËzÅåLŒÍ}Fóò ¸r!% R>¼QT)5AYuQZk2p¦ÊhÃ{xãû蘾–\Ò¢6W*z>+saåÞ…eBÒ&©2}þt<†·ûýýñxŒ1z$2|Üûýöíë×Û}C–Ë닪NŠð²ž®/Ÿü±õŒ„a·íˆ³W`£1ÉR—Ô]ZêRjÍDóf _{«Ç¾mÇÑÍm:ÚÀ);D˜ç MÃg©gáHoýhmÓeYÀx{ôï_¿:ŸÖÓç/Ëùµª Œ„Dsw³ÉL`"efŸVwx– ) ÁG´Ön÷Û1v ]ëù\Q«›{;ÐFðPαYÁ Ÿ’à@ÑLϹ¡ wG' §$HF ±~˜»* Ì‘<inˆˆ,ˆšX"Ã1 iªª<¦]#3 Á: #Lö´'¸+a:Žœ‡zPf@hæÝ<Ý  &E¤O—%e¦ù5ÎLÊ`H™¼sÀ$œ1ëÙyLš;ÙœN’œèbzZ~<`¾ëÉS˜YI˜EˆhÊ­ÂÜzo{;2£»=EPÈEËù€ÄÃs¸C‚0++Ò¤Ñe2 ’zÌÞqÀó÷LR’¢EXÌ›ûHV®Z3¡–…'8žnu˜?™œ^Äér&æÓr:ŸO‹jxnGÃûí¶>¬uhûql//µ.Ún%8ŸV<¶‡®7®e®2}´öØûãñx;îwÙZ„úÞÚöÈщIN粞ŠVFätÝÓ#_Oòÿþß>¿|.§ÓÞZúX”gÔ ¹/Áìa/—saÈþx¼ßïÖÚíýýýï¿ýõß^\¯°,2 =Ü|ìžg(¼VÁÑ“÷öý1¶AHŒ= ÷ZäËŸþô?þÇ¿|z½põ¾ßîûívô¢eYòþñ~{ÏHÕZ–3s G&QZ‹µ1zŠg‰¤õh#¡VÎ$¦œWx’Pf¨òéø‰pwD"œ>í§Þ!Pk)ˆÜÆcÛ}4†X ΰ $ªEì£ùÖÀ˜á¼¬•ø¢KáL`iˆ4|Ìtä@ DD ¾$U©2¢»G ·Õ²®0³æ{ÆÖvwkGÍ+‘N‡­.Ê̬¥²”aaÃ!ÑoÐDèÞ=0)˰0{‚  áÇ,ýYêOÈ$ fÓ9¸˜9_Ë ®x‘¼,õõúéÓ劌ʣ² ƒ:|¬t]×s-fGï-%,|`:!afBŒ‰!“–hÞ"Œ2Ò!I(ܧÕ93<%i¢óY&€KV ` $Jçtb¤S)€Ù! @)˜Ñ…Gfó ‚Š€nÃl¸#¡"a`&"¶èûØX¤z⼥笎̓-²¢ª ͇+Í’%þa˜ÓVÊôááÊY¥0#àü.Ì×ñŒb:&E¤ !Ìá±\(’J! LH‚&º%2’†ç> ìÞÇZWUy»è*Cû£|¡‹(Îܦgš»[Îóá“ ïÃû06Dátâˆæ¥¹žìþØ·­µáÖ<Ó ç$ g'xfèÉœ™,‰ü¡¿ÄtDÄ„' ãÙ\ƒDÊœkb!fè¿¿÷FÌIDRX­ׂë ½?ú÷¯··ðà¢è Ù éÙ7@@êÝ÷c?zF f@˜ûè±íc?F&aŸ­9`Q&e&Ô`rïë²\ÎÕÆpö$q«h­(º¤»!d`æ¢E‹Ïõ¨™3ŸÖõñhÛÖ"¦˜w&Uzz2R$†û¾ít=¯HXŠ ó1b´ñ„+ ˆÅŽgølêˆÐ1æg2!, c¦p• Ó£F0@1"ÆdC˜Í§ФY=/R™9 A Ò IDAT½F„=±NÑZó1’…P˜¸ŒcÄÖP–Z »í™=lwo–hBÍÝ»+2&pB`FdxbSaV¢È°€$bV­§õ$È (ÍÍ,£›3aùt]…´Ðí÷có’Y9a"£2¦X¶”Й]ÈÝŒ€™Q +Ie¦$N$@d!U%Ò˜)æT9Çæ‰€T.«îc|Üö÷··íqΟþô§Ÿ?Cd7×ÐÉÄ#…¥Ô‰÷a$Œ È@ÊÌ>lŒÖûýØnãh ĢȲíñø¸ßÞnï÷ÖŒ¥Š–V—DT–ËçÏA)_ïÛ1ºÛ8Ú†Û¾»…ЬK=Ÿej.UÊùr®µzÄ0w·™8éR™ªãÝŽ=Ü1#Ѓ ©3f¦ð §DÊùŸÅ=)h©F|ìý¶oßî/Çõuœ« Îu?#þ ÐæL”2Ô5kcGD°²NoFDó±EÛ‘¨ÖºT Lrëì#M!šeóŠ,"i£7ë@äàB@êA1ž4se¥ÙÛ劬‘D˜é³Æ‹I –žDˆ$Aêsb‰Áè™éA‘Hȉ™inÉ€š@™D,–BDÏ˸³n=" §L &% Ã’‰È(=ž·bOœ¿8‘ ˜‘¦d1yÎð&™&… éGïv›gSˆ8€…¤¨32ÑŠ1lâ™`8ô‘ÉE€¸È`†ˆ4›V?N…BLsRd ‘A‘#ÑCfÕ>ÃãÙIzNFŠŠ¶H·tƒ bf–R afÚ¢X.gÈ@L`šÖL¢$pÀ„¢r9Ÿ^®/ªe˜q© ˜ÃcôØ÷æ6ºáî-rï}{l‡ •¨æî2ÚsF Ð[ß÷}¿o·ïÇvƒ4÷]Ï—¯ß¾}ÿíkeüôúº,§A”1³£=Ã-ÇÌírÑõŒTáåtòavÑ:TTâØöÃÃÎç¥=îÛ~Û¾ýþíûû÷÷û߿ۻƒN€Ë¤¥NSBÌ Înþ±‘ÊÚEÂlc$ AžkùõO¿þë¿þùrY…@ÂßÞÞÿ׿ÿýëûc©úz]aß6Þß·÷$\/×óUl¥ÛÑIøçŸ<¸çDÖ&ÉÑ‘§ü 螟!®t‰æI&€&dçÕ;&%ç\ê)ÒTÕË­–™SoÃÖÅúˆíè‰nm´}o™ÔXxîf!ÓTxrÃ÷ÁüÜÖ1cX{³LEOË0ÀÉ­ Œ­¿ïí¡‚\”Ke‘tfÑËz]OW)ÌbE ðä–"2{Ò¶÷v47æÝ ˆ@¸{øýP œîMŽAHøBƬãzÄm¶MXXTˆWýó/_@T¿üåWüûßÿùý÷¯cß¶ûýõõú—Ÿf­¿}{Ûv+Fæ>¦ŠüóÓò$£&†ÍŸÖó\žà01æq;=™"1SHæÃ‡’˜N*Œ0¬5ó¢u)çO¯?}~ýT ›·Óâð‚áðè‡e\OA}{ûîv`ÆœwN+Q¸ðn}ذ˜ÉF‹t¢D¬œ©„ ”Ž”éNÉ3Í$ÀŠ„™ƒÈµ$„¥ÃD‹ aQ)<·èœ^ÀOÄÒD2ÒÌ9C”!’2$q1¡˜áJ”žãœHOœ ÊLðÇ00I$Â'ŠbRðç±iJ~ ãfï§þŠ~|5ž™Øˆ‰ÔÖÙbŸè¼áÖ À*ñ CÁ•H RŒ…!Ã"Ü# \0=܈¹c ÓÅÐL‚©%æiòž‡¶Ö„PUg@<‘Çðãè6"†@,«ÂþáȧueQ>šgD„„gF†‡ù|ýÐ\úÃdvâDiOvL>E©“©•ó×"f‚[$@²€0'KñTá‡ÌdÙ{ÿë?Þn-Pë¶÷û±ÊÜÖº¬e]j%¤DB$¡ùo¶iï£÷ÑÇæmxïÞ‡ÇSRLóÿ!0Mçk0“²Þ½w«ET?×"4F¸çüÌÓ¶ŠÖZŸŸÞŒcoá9¼œVâáÙÇÈe~¹žÌ­ÖÍ=‡øžb(v÷÷{ï½.…U‰‰‰{Ž˜&•Fµüo·BÎîL =ý»@À„4Nôd2QEÄnÃ<ŽcΑsôaæOåž¡!Ò컹›÷nn L2ËÞS†íï›:`˜ "6ÑXY1€@BóˆÌYÀ¤$fËUZ„™È …Â'w‹)At=/eî@X”UX0¯•âEÇ­ÁáÑr´œwS2ÛéAÞ)a!EÍÀqØÑw‚`1AâÌn`fD“Ñ>šÄk=]×å´–FÖ¹)³Ç„îC€(3£–ºžOH€L$ó+ÃÂ}øî6lÜûíqô#Ó ! R²Âíqß·›[Ó¥®—•ºÔšÛ¶‰V*ºž.Wëî݆@0a-…]êrZÄp ©e9/Ì4Æ8Ú±Ûh …•–ZÏTJÞÞ·Ç3û‰âÉ3ò>{|ÃÃ!"Ý\µž‰ÜÍ#Æå´ž?¦ë‹Öòq¿}|¼ó%Ç0ÏÐZ–Rk©nî1ŸuN*"ç+níñq§Áe)STa„AáŽaBQ9\13ݽ\îäLŒ”(Á¢[º; 3b€ÌZ‡O?Ò?È@D‚ìÓÁF`àtçeÒ:7´nIá<£ËA™î¬û É @̹öI'HäÈÈ ÿ¶ö±GŽ B@ž*oúá÷†çþ1ž½‹Ì9“rÀœ¬SeV%b*HœD”ž™6ýˆ\U­u9µ>`V¨ û0󀜨ë1Ì÷&Z¥¤»¹±!{rxøhÞ{º!$Í!ädæ©èét:ŸVfÞ¶í~´c˜ïc|¿Ý®Ÿ>CbbñÑxÿ¾m7$„Œ}ßß>nGk*|ª*óDÆ‚µ^®¯—Ó…"lßoß¾‡Ç²ž·~|ì÷ó˵ÖÓ÷o··oï·ûöýöx?â1ÊàêPÓ Ò#ðIµñi? úØ=}_#Ý0—Ëúë—OŸÏkE_ÏEï·ï_¿A††ÿöÏþÏ¿ý~7øå§×R£þþ±·ާÌüþ°·ã]?6fº\Þy½\YÕ‚#"=Á\Â0ÝÝÌ ¦R.S„§0ÂÌz£MþL"‚¨²ÊðØ÷ý87ŸM`U]OKQ) &^–ED!Ü[ïÛÑ÷cxÀR†ŸV‚<¶ãèÑí ¡g‡(ÃúÞDB8bŒŒÀ„ì 12̧ô8¨¹{:aÍˉ¥G sA(µh¬àK9­çËùúz=_J!‹ÝíèÍ6îûmv‹Ûíq<6Bf*µ0"D‘$Ñ=p`îÇžù ùŠÁ‰ÊœQEÂ@w7úË_þò—_þ¬EO/GúùËŸ¶û¾ßn··ïc=Ÿêz&Òïï·vì½íÓ»É,HDJàé!‰(’žaù\(bL,cÂSqèó;0'³æ412#£8f&‹T&d‡’e]/¯×/Ÿ^~ZJ,ÌkY pëÇa61ÝŽ€#Á #œúˆcŒw7÷ÃÇp'Â*%“š¯z¢¹!tƒàùƒ@ÁŠP R’]yB G3ó@f!".:/¨‚´B®é 1ÕtŒ`%Ê,¢µª zxŒžm@"6/æÏM®O%3$âÓ”ø´L`‚GƲœ þ˜1œ·$"a žY(*ÏØ“X:÷fø,V2%XF0óÂ2<ưçüœh6±bX‚±pA”DhA–ìÈH]ÀFÉDPRï˜]a0z™ÐPFpwAhÉ=Ò-z·¥È©òy-Ⱥíãý¶Û˜J @†ZQÂb»ï÷ûá@ë²hÑ¢Y‹Í¬YYÅM7Ë|…'±€ˆæ_Ï@ú³gùCÁ…„@0»ò9ó¨ˆà„Oì#3aDhYÄ~ûØþñûûðœKæû~¬§å§OPK©ZTˆÍü8º©ÕEæÞÃöØ›ïÝZ÷1Å5iò‡‡"  ÷A(ÔaŸî2÷ÞînÃta‘%"/ê"³ •Øîfkýÿ÷}ùò2W"D€mc ‘4Q:®vœíýãÎo|¹®—m¢pU"z~ºÒYûíãÐ1Zw$¦)EI)'òˆûÑŽzn—r¹\Ó²}¨’#±Çñÿ@? èa?c"BB7w¬ ü{Ýz0áLõÏWŽúüá"³nª1© SšŽ0Å1Ôn÷1f$9g’çåi)Àd1̈10¶1Ôœ™—…2 eJœÖNØ|PbÉB’óŒ%è˜Ìî8µ™Ø¶lOÏ/iÝ€ÈGë÷Ûþqë]»yI”DŽ:~9Î>È #²"Hí£}ëßaª¤\rI‰’õ^÷>jÃ8‰™9/N¢ª4IÂ’¹dAÃ*Áv¹l¹äTpY©”EðuK²oËyîãxv?ʉH’SUæÙ„u¸¶n6Z¯÷ûÇÛÛ÷ûíÖ†¦R®Û¶¦4+tn^k«½—”ž___^^·eÃÀ^k«µ·Ú" _ÖMU1@H–œ>½>_¯¯ÛzI’&ûl˜¤4-­õã8C-qÎ¥¬‚œÑ|®oÏPE³ž)Rˆ D™†a†ó»æšKYøšÀ¢a¾]/Ÿú3^®÷®ý<Ûy´\Z«G=R)Ÿ_?_–‹°ÀPígµ—u[¯—TŠš Óû~Xífz?ϳ݆š™y6Â’$ƒ„Ë&BîÚ[iËvîg¯ÍÂPI¢ááÍBçL]ÝÌ#gbgBwhÞ‡ZxÌÜÌ,åˆ÷ýü¸Ç¹›6U0›?­ÖV©¬"½;@ÊK„ŸçáZ OEÌl y‘,Ëúòòúòò>êý^»SǤ¸-N‹š# ¢G Í‘ ÂûÐæØtyÚþù§?üoÿùß¾¤öñýïÿãïÿõ¿üÛ·[mHÂ`í<Þ«+e’jf£ýÔ LœÂÝl¨¸×=Ç—?œgë¡«>Ê:Ò{›°ð@"P#ìK)Ì "G€™÷>Zï˜h–Ù¸•ÖÇy4w'"Dt žÀp„9§” 9 .}Œž–,B”öûÑúÀÌäCµ·îÚÖ ×•¥¦ªÝ‘²°„º‰0›(dDõÖY&B“™RÚžž_ óÙ°–>ühU mœûý¶í¨}¯£æ¦匉£dÉ 3§µ””çîëq´ñ™îp5U âi1…æJ.ÌAÇ´œø²m—eBK ÐËõyÛüËçcÿúþþMµ_Ÿóëëç_ßîÿÇ?ÞÞ~éícLµò,ßPL!_Œ1 æØ’‚<†ƒMþùÄ„™‡ †Fx°9"øüž!Ådl @´,kYÊvyº¬ÏIòœ‰#2³ˆHbA&ÃÕ JN䪵Úú½·ÚFXHP8›ÕÅD˜mHqª33 ÏõåTGñPs%挚ˆ‡á4$0ãaèîLCp:žgL0©<ÎS("Iˆ1*¨ÍŒ›CWÃp€šIÿß«-8í~3Øn>ó׈þ#ÿ0³?TÙ€4ËÁH¿ç„æ=ö‡—0‚túh™aÌ" –%¿nxå!1Е˜€(ÐÀOÅî€i¢Ls¸°3°ÀÜN˜R„ùc9 ó'fîªSô ¡`!䘙§TÝš*”$"L$䦭öïï{׸\ƺ.S'þÐäð| šøÜõÑœ¥ÿÊ€ÎÀÔ#ž>O¬€>ÿùû9vj4-  Q&m‚„H83§eq‹Ú¬µfæD,Ì1¦9õ5²$)))Yx aʹ”ˆ­+©#¢OGÁCÛ0…ÓÆàs—e:†%!Vå—÷”e¨½¾<­ËR’PdÛ†šê|§R"j½õV?ôÛ÷}ÛÖO/×ëšg0ˆ–’¯Ûº.r¿ÌÚþìæc šA¥ˆÖ”¥—B"\–ánFÄÀ>#Nø#’ðC¸ö ~"Ñ\ïáÜßúÃ0tàêOî6ÜÙ‘ @ç-mj¸Á44x~ÊK,šœUüaëS×hfC­o‰„ã¬uŒfdî(˜¯ëv)ŒÖ½L²å§f죺WSp¢Œi)B5bXò2?EÌ’PGmGÛïûm?›³,Û"†ÞÀ<¼8&œ?à ˆdNÝ ‚;H%!‰œst÷N’%G7míTµ,ÂPXò”:£”r) ÷¶æuýür-ù–Óíƒöý}Œfj#t “”‰y)%IÊ¥°ÌS5ºzoõ¾¿ÜÞîïçq¯Ã¸\fp0˜°$1ËÌ4Ëu¹ä%-U2·ºïç½é`–œËu»0b˜[ÖØ(‰¯OO€p¶v´³µÖG·¡Çqì÷{«UD ‰%aY’d¤an€AáwBftu‹@WRžü{B–´ð‚È6zµÞ,ühz¹<ÃL~ú¨ýÖ/˺•mªu"bM[Ç–%¿~ú„ß¾½>ŽsWµc‚uUÝ|‹`¢P $€, -Ê‘s/ Ej•4FUëMcgÔ‚˜„`ï@,DN¨†4‡6Ì„è–i@˜™£8‘A F8’ q™TÂ0 îÓSkƒ(îNhØÍi~farê"A‚ ƒDÍ ™‘",æ³ö1G÷™/x þ'aÑcÉü`±Í ’$yzº–mõ5âmݶí’KáIùH)TÃ4%i½Þú8϶»ž†6Ü]•Ì»'ÿôå Þ“¶>ŽÑ­¹ÍÌx`Lg| sZ—íééi]×ÑOÕ1G·64Üy^ÂL[4ˆ%ç”GãV{o K)¥až—Rb’ÄbHî~Öz¿}L‰h–tŒ>|tóqõ\àR"JØßßý×ÿvöž¯[s»(9¯ÃBa@°µÞöÛYÛû±·>„„ 'ˆÒ™ÄõÝõ¨VÕôûþíí­n‰IOm7‹ªÉ?•—¼äãöÛ·}?m¸‹ó ´FpL“ø#Pà“ðÆŽž82[NšýùO/ÿ靸ós¦±ïûÛo¿üã¿ÿë/¿îæ¼¢dDG"â…9 ãÝÝP!& 'a ÷Å)i [˜9Ì£¥Ü÷»?,2SO=¨PJ’à¹*ð> %gFÄI dæ¼,3áî¡j˜RšˆúÚzmmYʲ,„¸”Â, µ¦Ö(õagëà@Ä`áÃP;PàV²HîªGí¹û² è¬uarp´÷  )@D¤TÖíõõ‹Aö·]5î{=ÏÊw ou¿Ý÷£GájNÌ™3"šÇP2cwVñ˜cN 3!"‡CkV›»ÏD rzT'˜„çQ1ì¨ý8Ú^êõz)kz¬òäòtÉEÎýžs^¶§Ÿþùw?½½}{ûöó~ûÖΣ÷1¿8¦ÝÍÂ-ÌÀØY櫘(€À‘Üfû³‡‡ZbÌH0¹ˆ©KÓaoaáI°äåz½.ë…YüÇÆǰšJ˜¹vë:Žó<î­0úØÏº÷~šv5rB mQ -œ%<̉s|øŒ33gô qù?™° ¤DPL¼¢×n¤C˜ 4 !¥Ì…‘Àœˆpxï:€ÐyjK¼š pä<0y¸!B&”‡)C IÞ xT.á‡ß‘xòU‰çöAY~âñ~ÃLò´kÏUø„ùY˜#zùô”?]xâa¡áˆ@¤>º›¤`°Ä&n“6dÀªF`Y˜@ 2"9 ¦DÃ<Â1ëÞ]˜™‰¥ŒÛBk&sm\’Ôî½ÐXyêxMÕ'uH­ïûÙZ÷˜bÎøqœãS €Gfðáš‹ùÝ€GrðA¥ŸÙôˆpŠßoLsù‹`jn“† ®¤Ä‚ÈFà*"œRÙ.˜kkch×I^ E8¢žõé²<]VI‚$eI b)ªê·Sxd¡p £pš’Ðß ¿¯*0ÃÃ͔¾½DTë¸ÝÎ/Ÿ^þøÇOÛ’ g›TŽÇ'"^·EÍU·ï÷o¿½í·ëŸÿøy)i U¯€,’.ÛºoÍf¸>BU0™H˜‰“Õ¦æUX¦›3Ü•0’;>$;?9óüô>*t1gˆ0%²@`S§Å n†Ý1‡ÙPusœ & v JÄÌó< ð1nL€Ä" Õ»w#b ¢¦ÝÏ>zëÚU„fÀu»~ýò‡ËR¬×zœà‰xÕf­SÒvž­[^J^–œ3†u=‘IòŠ)U{ÿ°6ƾ[¯D”ÏШëçöx7ƒ>jèAÄ”‘A]µÙ–eÝÊ%o‚»ù‡¦´ä¼¨yN6º—²-9t×à ˆÈƒ,š[à–Yž.Oóò 1ÐÛ¾ks‡áãíýmŒ±®Ûº¬9'ä)äNXÏz»ï½ &.9 G:ÎN"$aˆä1 ̆w`àëò´æKÎ1ˆ}?>ê~gÉëvY—ÜŽûý¸ß´µý¾»G)k^ÉžæÔ3óu½xh-§Ê p*Û!%"ÑŽÖÐ N`Ii8¹;1 1 ‘ çÞÆ÷·Û·câ²&)g­¼ß{?U›ç¾.ëüàÔó¨íµ¹kÕF9“Kúòù“öþí7ýÙÍ͈³„´^›ª%)6 Ü ‘ U‰·§g$rGwÐ1 CT‚cx‹rÝT]<-‰3fd™ç·n¦†ŒÒ­§ÐùÀ¢Ä¨óA( ‰s! 'ÝÕMõñÁ³@Ab¡€†„ÌÄÌc8#ùL@ÈÃc–²`½&:` Žé8&bB×ðº~<\!x>“ 1IY—œWٶ˧/_.×§ 4æ´®—œ @ès\4¡iMûíþñþý·ãþ>FwSCW#D”$Yëàp¹>½¼~}ôýþÑ~a3vW>wÉŽèóó¿­Û¶nÄ܇é0ˆÀW S&Ê)’…&™72û$rÝÖe]ÉŠ?Þ·„^R~}ýôñõÚª»zí<ëÈ Â©l—§—ÏŸ/%k­¿ýÛÿøùëܯo{´un}„K.'~ûhï·¿€!_’B8JÎ’å: ŽðÖðlÞ5!¢Ÿc´o•¼K´’µlúGE]SÇÕ3IZ‰ÊP†f¡:Àƒ‘gñÂ0<‡¶…GÉúôR~úÓÿú—Ÿ.âûþïûÛoÇ9Þî£CÁÄ©\(eƒP3\sYÖ5%÷Ã|˜ÎýðtD`*Õ`?!¡ƒš÷aê.µ÷0 $"'Š®ÚUgÚyý&ÀMÍÌ̈©l«pbÄy½ó°ÇÜh*éÝí¬UMsJ9•’^×,XKoÃE¤÷VëÙÚnS8‚,@©«ß †Û)G5lžŽ&NHÄIÂ]‡GZ2‰(˜Û` mÍ—§Oëå)Y×QÚµKÄaî}à¡6,yŽ~C‡ÛP$ëºuä4£ÎÂëšRffI¹¬9 ‘´®CuÌdÄt¡2óõr½¬+!¹s¸[·ÑÎãlÄQJºlÛ\’朖’S΀ O—õùõyü»Ÿ~ûíßûù¸}÷}?Žý¬g«½Ÿmøïf4MžB ¡ºÛÐ> sfA7pDÙL`"dâ”ÒR–œ ‘¸Ç¢¹É w·Pf˜Zè}¯ç~÷º¿ÞÜã¨ýìcÌÛÄ Ÿh R".hÑmɉ„&‚Þ1\XЃ mÕcÌs<„CG¤Gt#`7"ÔÑ+qÂРÂfÖædfLA@˜ )a@tÂsÙ(•!äàpîÞj`™ù}pÇÇç>ý?hkñcÚ:µ·ë¯ºãmÂJþüÍG`Šç7 ¡$Ú2'‚©|p€n"5¢„€ @xH6ŸJ—Á†@T‚¸Àe•è1™¶®f‹HÁ뵬‰Dîm 5f”RØÃ̼õ‘=¦Ñ¶,ËÓáècŒ1ÌÆ0wG$&™3g"Ê¿÷R~à¿ÿÿ+À\áßù IDATdÌÁñc!âð¨ÎРуT7ØnæFÆ)‘ˆ…©®"Hf1]Ònsöos׬Ã[w^Kz}ºül¨JH,‹¬ÅÇ85¢a±kÁ6ç)ñàÏY˜>_—O¯OáÚëù¼._ž–LÝõ!— ¸¥ÒMЇ»z·S]Ø+øWU&ê© ‰¤Œ$i+ß´ǹ‡A¨[?vS›»·^ˆ$%á䎵уy]Ë….cØÐP듽ctw/©$$ ÓihO¬)€zWTO9 b˜ÞÚyÜÏz¦¼l—ç‹922á’$˜"¥­d»^Z;ï÷ÛY›z@ ª›"—²¢ä`Ð]­»! ‰;…yÉœS†ác f"hjûYëy8XZÖKZÍýý~?{›XU!:䃉’šÞF«a:¬aÛ»EžXž¶UÈÏý­× s*DæÄ°ï»qÊ`Aá‘8Q))­ëv)K¶ˆý¨½v׳ï»õÆ%¥:áÒ®fnˆ`†ÞW$Ç03C 2et õÐ@æ”… Íj#Z¸õ‡¥%!f!ŒðaMÃI<Ì݉‚É=ˆ8¥E£»:Ò£ƒ$'q”GšXŽô `™o žZl ”ÀÉU"ˆ s÷ Ç`Â$)¥Â"(LDK*—­¬—¼n—çççu½“d&1÷ÞZ=OmÍÍ`†ˆ}ìÇ][[‰™ó]m¨ SΜ¡MÈ™yæ:K)Qk¨9°?î#ú5'‘¥”RŠC˜: ñ²0N  ɵŒ›™u$²ä”JÞÖ²®+  ³„{¯ÕFç\>}þê˺œ·÷Qk=Žvß'ª-­éùóןþé_þò—¿¼¾<Çhÿþû¯¿¦§ÇùÛûÞÁ°@”˜?5éÀ ¦ñ PBD7nJn²WÙqTJ†L@ŒÀB”Øa¨òq°¾>†;,HB‘Ã’:ª†N‰ÅoÍw§yhû%9`•Â_þüõùÏÿñ"ò÷ÿú_þößÿ[ïéy÷ň֭lOO$|¶qßO7uŸuª Íz·†n1\`¨ÅÛÇñËoïèÏk7o­µ¡’Dœ"#hÚæÐZn>yˆ(" ¦®aj3êmÀŽöˆüº{#fBbVîUÍur禤örY×µ˜Çå²#"|ûèjê@ˆ’!ù°£ëPkÊ«kÔa.ˆŒä„H*¨B G8D¤”r ܺ§÷{;ÚÏ᪣ÍAÑpÚ1êHˆ ÙÃÌ ÜÐ,Zï½[A ‡"ºÎhäE^_®—Ë’±Ðš–%@TWU­mœgkm¸¹»²àësëÏO¥dž¿Ñ\5ŒÚpÓqž;”RÚ°Þ4ç¼]¶õ²±$÷´^ŸøéòÒz¿íÇѪZwÓZÇýìÕÝlT­{è À4gDàbH8ûÌ-Ú¨6”¥”u]™Y˜SJ9‹ˆèÐÞ5 1 ÁtÛòè€\k»}¼ŸûÍ{³^§²ÐMHA!„RÂÈ&’TX…‘ÂMaBËŒ<B Ø1)xy@þô&Y˜¼€3„"{'F„Ä,“<1‘ÚMÕ<Ð!'aEŽºed1çeå÷o~Þ›C1Ä<çûD;Ïæå| =´WL”D˜ guу~Ä}bZâ÷åÁœÅÒÅòׇŒ¤cïcW°5 §ì:L•f‘$\ gEŠ v¤aäÄèC‡‘ ªæˆðT€û³ƒ«&„¼ÐºÉå©<_KQ[f^{t…Ä”–Œ:ÐÍÌ(‰PfAÂ%Sm£6CÛÐ>Æ<1O@=–Îñƒ*뿟 ¦9(œƒ‰zð“ó)pŸŠ[ŸR1wSdD" þ4ìê>áä@f£%!|ÛëËÞ®—u)²•,ÌchÎéâ¡ÙÆpŒÖ»™Md !ÍNï¼<ÇõÍãÿÞ j3æ€nŽˆÏÏ—$”€…·mAâ¡ó"™J¦’åéiý·Ÿûå·³aÉËqÔ6šDS „œ¹ôŽ3¨ç1÷;FîîQR"NI㨊GÂÁ'tiôIb"r ³@b&&"˜YDt3aÈ‹(û±ëƒuá.Œ…2‡‚†ë¤u'YD`X„ªÚ ¼MnŠ©ªªXÎtÝ–œÊP&FÄÍh°`‘0ªéhñÛ·Zµ/Ë%ç+ožð¸ÀJËD»&z¥çe‘ëóÓë§?,ëuÔ¾ßÞn÷·ýü8νÞï¢qI‹ì­½w¸W?z0‘{jŠ sóás·3÷ЙíºÑç—ä#>ÔÝj@Ù“Pââ ÈR #¯ËÀõÖá¨MÒ’E†£âí<ÎÖqIKþqTÉ9'fŸŠS×€˜‘¸©‚¥‡sjBÑÀ10ÉBH‰IØÅjÕZGk­wU˜ÃÎËvyº>=­OKÚÀa¿ÝÝÃŽs?{xLdTµ÷¦Öt~j«ïïo} $€°1ª©†?Ø}ªÖZkõœ¥®­w•œ—%—EœCù¸õÃ*#Q’XS@’0$,)e&t@À c‘5—@Hë–—u˜}{ûFDŒ ŒÌ°wüåï„sÏGœ˜˜À#nGûþvSÕm‘Dq¿¿¿ßïž #X»¡!s"Ç÷ p Ĉ3…™Yã$„ †ø(Ñl¹ä?ýÓOÿüþåõóëí?ÿãïÿå×ï†Ëv¢Î—u)ÂƦâafvœu˜¯k.9ÅÄôýpÅB˜êíýþs ÿòzeæùÇd]Wt‡¡Ú0<†ëÐA#ç<7a6Ã(án­÷>t*gÝ"Ü…ˆ™f g[–…6$B$ì}T¯)¥mÛrÎD¸,%¥$̹¤û~µïGÄDH:(L&yÀÝü1s¸^¶´\(È(ñ²l>pÿhßÞÜÞ—uº¤çk^7q "—p4šƒ§öÑÍÌ¢Ö^›ª£{(ýX”äšD YÜmPК—í²¤ÌŽqÖúþ¾ŸgŸ7v&ÐîçÙÖµ\¶õz½¬Ëº­ ¢ªL'RÎ…ÀÇÐ÷ÛÇm'b"ÚÝ=¥Rò’“,%§\^D>ÉkÊ¢jÇÞnûy´ˆc´ûÇ·ó~ ”ÖåruŒZwwc–²®—ës„ÿí—÷ï ]AÎ)ç”sžæ"ˆ0UÃÌgL:&á"À-ÆÐzž½5 CèFL¥pt/=F&Ò`ŸÍ2tdÇdŒŠ†á<•¦³.«î¢ ’BPÐ݆÷áÃÁØG’áÒûÜ|8 q&a$07Äb.4à $BÐùÁŒ@aQàj1˲>ë*u}`ŽÀ®o–®0f8›‰„‘™1133>r>@/=¦ø#+ñHi‚ÍSåä‚SpL"êýì‡÷Ä (O)åÌ™A˜ª©Qtˆ™ "œP @byL€Ì1 ˆB¢åàœxIlFŒ´lëåu»^r´¦½ÖÑ›šwó>Ü‚(/eÙRÎG³A„‰Ðm@ Iø”·m 3ŸÌ¸1æ‹Ãz×1|–€JfŸýø±øñB›å„ß‹À3»áîc¸ëÌPB !“$IÀaf:Ü‘ÈÂÕÕ&p>31&¸ŒÜC-0b@´®ûÙÖ"…©¤´”$9ó².: bÌ@ÜÜT¢ÿ^—³G…ù±¸³h] ÝÃ- †÷?|}-9"³äŒÄþànG@Xºâ×/¯þéüþ_ÿÍ£=¿,UýííÞ{'f$"Â’óe[.ë2Zﵪé„*Ï0K˜Å@£GÉšÝéGÉbÎÏbòsž¢âPïf.ŒD,KÞ¶•9µÕ ÃÉòÂldî­ù8üåþ?kY/—ËöúéúõëׯZÎ{ýí—Ÿ÷__·ôïúé˧§¼-’7IÅÍ÷M’˜Úq»é~ö̉Çð_Þîß­° OVDÖœ[ÀP›÷H|´°ä´-Ì^G=Z=šúÙû—OëŸ?=¿– c47#ðœ—íò²€ÜŽÓ´e áP]G£·ª€¦vŽáßßXøº-%K;Ïî]­9 ¤”Êôì 32&a"F`*ÉŽ¦Ú‡…öqíVµÍ—"#¦”?½~ùòå˶®YRhǹ¿]Ûðq¶ÖÆàœ¶u+¥œçÞûðÉ)çÂRüãþqÔcôÖÚ±ï·cßUU’,˺¬!«š©š©‡!Òõ麔’2·KçëˆÊ%-…¬÷Þ±ä"ÌøPš€!¤’VzfsМ\¸öõxt5JvÐûýíÜ?y]ž¯—O×õ©¤ÄèÃÇí8?n·Z÷_¼›5ÕL'åÄ%IÎËR.’J’²¬ëׯ_?}ú¼,[YVÔÖLµ¤ôôt]ÖuM%#koC;Hìõþ·¿ýëÏÿø·Ñª›»‡ÙIÍ­3!gÊÂÌC]Mƒæ2S¸Ûp$dq€0> ãr3u Â\Ê–R ð äÄIçbh`Ì´0Kd"‘df1éÈL7B A+ ‡L¢Ï—¹2Ê´Òƒ!r.ëzY×5§")1!æD,@}DÓŠ8X›‹eʼn‘¹õñýû»›.K. j÷›Ö…ç`DÕZïKÎ/Ÿ.ÛõêLäJî9ñÓuÛ«¬ëË×/]ûýö1γûè ‘²ä” SJ„O—çzÛk­j¡ŽêX›ÇÛ0ãÄϯ/Ëå:Çhˆ$¹,éâj·÷÷ûíCÍRN×——ëóóZVv­½Ÿµîç~¯ûQéå?½^Ö9c^"ÆûÛ÷ýãûqÔ_¾ï¿Þõý˜Ã†`çG™Ï<Ðñ±hH !lfæ I̧Rˆ½«Õ¡CuxèÌ@†„S¥`F I¢² tdadS¤–„K…1ÅðÞ"úú|ùë¿üÓøOÿñëçO¨£÷pW‡}ôuàˆí<]Û|C a½µVÊ% s8¸Ï8ÍDá"#…Åy´÷=%Ú–BDK)""“ïh@³X†á aá¨jD?¿HÄ®ª]m¨S ƒŽ¡î&Ì9ÉÌÆ"’ˆÏj ³”’RS«µö¡qÔ¡–„ˆ('yºnmô²¤õhÖÇЩ¶Eš , FtD'T÷àDËsyyJ¯þôi)K2óßöãý]o{GÁϸ¾j÷{=ŽÖ»ý¨Ó†óCÄ ¿Oªãtó‘°úžOLSÿ‘ 2D Â9³–„N0Ügχ™š…ÇŒ ÁC²1ƒ/ ƒ»3÷îª KI붤R P‡×> œøài ?z1yM³ä mÏÜQô>`ézOŸž–ç§‹¤cÛ’ð|àÎ4ÿÓó’X×¢êæ]J¯µ­·:ˆ‚…™ˆÖµ,9{–&tœçpˆyÔŸ X}<‹ øa-ÛÂ9¡@ 7T5Ә頇ÀÜ"ºzÕÁ„jPëp=“ŒuñR`@€E'ãT€Ù‚0èlª‡zïcè@ •dsóÙòöG§]Ìa¨¹["q.{­ºF2”¦P÷·÷”Þÿê_þé¯ú§¿üù¸Ÿ ÕÇýzÍŸ?úúù™š‡» ä4SÎ)æRm=Žj?'x]E‘ߺKF$S8Ï¡Ã1Áp¸÷SÇ8•:ã–¼=½^C¢Ýk?jsSä|¹^Ÿ×m=Îûþa:Í-º!F¸w¸ëyN(‡ álÁ À–c& ô@s% ð°9¥Ä˺H*¥¬Ÿ^¿^/OP[ï­Ý?>öûmh×°n D)-sÉ1‡SH"ÀÔmôýc¯'!öZã¾ï·óØÕ­”åùåÓS!µÖZk¾.ùz}Þ¶uÎe‡*=¯eILŽNÚPE€Î³Ùè…e]×”˜P[(€x¸ƒ8ª‡ôèoûÇþñ^WEH ðèÍΣ5ó Ãõ§‡ — ®½õ± qô¦gmrÿh½ñýã<Îï¿þz åmyyùòåúúé«=Ž;‘7­—ëóåò|¿}ŒV{kÇqUW°aÆ‚Ä)EˆcQ¤ÐЮ>Ì °0„w·ì€ÎaA`†F>0Y tç¡ÑÜ/è‰A™r’EhNöt˜Õf®@ˆ8·qˆL΄Dîyò“ýÇ÷5fÛÒ Ar:¡!„âôe•”ÖËõr½¤”‘ÌAm˜»†Ð°F™õ;a:ÇWªÄcØyÖû}×Ñσ1AÐèõ¸ ÓëçOO—Wéí¼½}ßkMûÎeËë"„J˜ÊZʶ IyZ×§Ë5úxûÇ?~ûǿƒҒJ¢ÄÂ×ír/k=ëP”/)çÞp.’$vS ô@fLÄ9#“µ\ó¨õyݶ’‹뵞G}¿íµËëë§ÏøúútMdûÙöûÝ­ãüõvÿù£~¿ûQižç“0M¿„{"²0&*)3’“@.E8Õ¦ïïdž©ùd<ýØþD¢˜XvDBfžó1ð9Iì†>éR|)š¹eð~¿~~ùËŸÿ×ÿãÿë?ÿÓµd½ßûí=z+%KN‘rF^îÇ8ŽRbBš°§`2 SSU5O"LDÀSK‰Ì¼”œsBÄ>ô~ÔXKI) Íß”¸Í±ÓÌwüT½Û’Kv¦·Nî™u°Ýì!5$‡I£÷ ™D™Ì¤–‰¦!{v76P‡Ìˆp_']xÖîÑ .pCUf„ûZÿÿ}4ã ÓèK„"HóÙáÌÌ"€öQ«¡i03ÄdÆZ¤ÕZª@ÙöCÕŽc„ r7gÂÓÒʼº&Þö}ïªc®µ=31`‚ŠRZ¹<¯?üpùôPŸNòùie¡oß^^¾¾ûºm››3ep‡Úv ãDo’ s!dáF3ð[ïêÄ$$(Éá‚y*åÔ"vóÃTÝûÐ0'Ê -ŒÙæ@’S˜—¥ óDùf`?t0ÀX–*"ëÚ˜A˜(Ó=B€Z-Ÿž?­§õõí†ÄÁ<±C¦æß^¾o×÷s“±¿]ÎÈuYN§¶œ)À°-K]Â#tŒãêc+Iýv}é ¥D‚HsÕpN‹î¹#a0P-ËiYY("'MÃr¸vð¤IÛ™TO Œ¤œÑ˜˜ÅöÀä©ÜDcšn HŽ@ucfÃSJΪ#“s:„¢+fp9±c²….´(°l `R ¹ò½˜ASS_ˆAÈ ¢@±£†g¦UpBÐR QÉ9‚È1ÌF@ LöçTC ÏæÿïÀŸø1“À ¸§ç]bÒÏçƒácÚsOh—éhšµË];ïziL#3()³@âŒaæÀÐŒHÅ X“Ñ &Cj„&x${/n,œ@ÖA7AÀ$êÇЮ`ná&eÍ µ—Ê­Œ¡Ã<Æ0wN $„Â\+c£<‰ÙrjõÚŽmïC§¨ÊÓ>à§³%ñßÔâ¯v‘ÌùÙ‚yŸQ–‰†ˆL 8aa&2S›õHÌLÌ ˜Øî¿ÒpxÞ!2ï½æyA³€ýн›D€jtVûû¯ 9?°‰3˜–÷ÃdïEšAF"€z Åýî7!Â"܈8‘˜#]‡¥«0Zx?¶Þ{F §C¸{0…e9µ„̽gļÛL Ê”«Ì2Ò=*n†ˆÌÈLnêŽ÷" ºƒkŒá‡Ú®ÝÓ×¥2¢ucêË’— ‡ö~tPÛƒ ˆS0…‘‘ú°ÑmPd¤‡[à¤Oœ…éÐíØk+UÊ”Ý"±É2¢Ü"I¸2fa6tlzÐ[ÅÁ úòT%ZA”ÒͼëaŽ¥"Ò¡c;Ž}Û} F"ÎtAL ¬Ä?<¯Ÿ[~}ßÑý|¾<Χ Œ£ÿ"H éq»^¿ÿvÛ®Hðüüü7ÿîß_ŸOçv½mŒ§åñ‡Ÿþððø\µooï{®¦ûUÇlÎîè"Âi#T#P3,À8ÃL=42Œ0@0 4ɸ6®mï]!ÇR´1BdBäȳᚘœ3eÄ„”¦67ìø1lÈ„ð€¼1îf•°L/œBÄ‚”8%ljÌ$ítùüùËÃÓ# uµèCcSÛxC¦JT–uE¦ÔtÓ4-ÌBâ‘>ÔÂ\Dæ~Ænîí¼þðé‡/ŸJËcß ñ÷—oCÍÃZaf}DD2×ÓªîÞDš,P}ÿö}’Ý8“3@ ÉÒ–õtN)¥,ëùa]WÕauiëåÒZ›^ʼnC·Ìi›%·ˆÝß¿¿~¿nÛç/Ÿþù÷­6s O*íôùùóç‡ÇV81™ñTd©Çmø{÷ëjœÁ4 5ÃÔcÒH“D˜çrAœ°•ºÔZ¹4YϹܮÇqôÛž‘³ôňüA]ÂÈ¿ª!ƒ! ’`þ^=!’îRV ƒ8÷µåe…B=u‹aû¾s;ýíßýíúÿÓù¼þú§ýå_þ帾ÀˆÓòpª¥>¨òív¨ 1È´^ PN‹X"’O 1$€‡Y¤•J¥ÔR Ôí^JÖ!vž¦êÊ 8ËT‰À“•az§"±šª*d¶&µÖ t’*Œhfîa¦ˆ!\˜ BJa‘L4¿[¿^oûÞ‘E¦Ž§‰|~~\Z{¿m/ï·—ë><üðˆ€pH#‚óÚž>=<=_Îç²…¯_o½÷oß^ýõýè P¹Œooãv³®j!HVEOµœOõr–óy½œÎçóËëÛÛû¶–z¡`Nºy™`Içí8Ž£«MX”ÚÖSkK%&XOëÒ€ŒÌHP…+í‘€˜Ô‡~}ÀÇÇ˺.•ÉtôÄâñ IDAT><ÖSýò|>/« ÈÓét—ëõeßoj1½Z×ípÝ–úRÚ*µ<œÏÏOO"|ìG·ä¶I?ŽÛ~¨ ‘š–¯ß^‰—Óy½Äè®á™n–}^LÓJ"À9üJŠ5Sô@˜íŸ  @òD "¢‚ |¿ßS­LÄ9×°áHžÅ¡$s¦›¤$F&œKfH3 ê#,(ˆbµ#¢QOé–… 6DÎLB¬µiHB2Ÿ—„YhêÀ$Q¨¹&âé4éé…‚…i?ðØ2‰ ÜBÓR%îI‘™ù0ž$` ÞuXñ!m£ß*±˜óyo 0‘E81¡œî® š22=bD8s#”Ä‚@án鎌0Ù}ÄÐè‚Û{÷0=zX›C„«[3 ´S¯9i”£0˜òðôDD!ÄŒG¤iþ"`¤¥–™z¨½ãÛvD¨Çýÿë%|ô#xžÔ'¢>pÑp/[Ä_YÚ=ݼ´Z‘d¢)ç{~ò. Âñžº&Ä@š˜!ä„IÑà;ÒÑlFÚ'Çhf–âÃÖ€„óZ‚x¯/å$ÞÜcp‰ó/<Ðñ¼L‰î®Eèñqýüåsaö}o0NñÓcyj&y,äÏ+³Ÿ#ø¶m› b­EDÌ+ AîˆXJâqÇ< °`m a¨æ¦NMX„lž<ýØGï½J%‡pãÂÜŠ{¨9¡‰)ÂR GÄûõM''ŧ›*‰ B‚ ÌÛ!ãû¡Ç0£p@WÝU‡k€ÏDœ›[BŠH)5#m;ŽMíÊGõ7€k±´¶´R©Ïü'88Ip!LÌ$UL‡IƒwFÄ`´ð€@ AB¢HÏ‘­TY¬[¡ŠÃR#,Sœ „’É4!‘&9Ä#õè"W–ÚÃ0,ÝFï}Ûúvè>´ßö·®ãtº@bßû¯ù%Ü—¶´ÓZê²>_ÎkC°×××׷۱ݎkÝ·rÛ£ëÌCÏ’* 3$…‘"€£'MU}ÒDX "Reà 7ªiuY*;hên¦$‚ÚCo\‰‡Ú5™ˆfYjÒniqÕìîQ'ü ¦Mî4æÔ\gFt@ fòY©bš S –åôøéËO¿ûÃÓócdîÇèömÚo·×.Àµ.S0…17îR©-…™+=?®K3÷¹¢{}ùúK7¥^kZ†j˜–>}„õtjuÆÎaJBç‡Ah)FtÛ·~;CBc{[×Nf*¥|þò%™¥-­Õå´0£-µJ)H¡nàûv½¾¿nÛíúþv{¥pøþí×m»½þüsªÎ—]=ˆ?ªRŸ/k Õ­›ÈR™åÛu¼¼û°"…k1W›O~›“üé_û«Ù“Â\{ÏZˉOR—™í*¥y=Õ²÷®1y•E$3ÕÍï@¦¹INB "˜ÑËH¿Z!ln­öË‚‹¸›ÞÞÕqyzþ»¿ÿÇúÇx^ZŽŽª½—÷›EÜŽã”Zh-!<ˆ²Üß >5°ÀtwœÜw³æ^‚K‹àWõ>HÖeM ÷IŽI̹ʼnï»ûŒî¬<@÷ð4@a®K[OK©EÕÒuŒd 5šñAÂßÁˆÈÌm)žÕÝúÐýС æŒ(HE¤´ºž0HI`÷t³B("°žOçˉÆm;ÔìÐcÃ|xš—;!#éý–a®€ŽlHp»¾°À§ËeYÚª'õH6 tÇŒ¢CvÕÈBά„T‰„1Z“ÒD e¦š‘ç§ÇÖÊ1ŽýèGwÈf@(•˜a¨}{yÛ]OMmŒÞU#,´ ]??~y~dÆËrÂÂc­Eàv»ÂÑ×5‰Ñûî>öÑ{dîpÝo‡ùy½dR†z)u}xj§¥ûÛûË~ì,(cÛ¶íÆž­µôp‘H蘎I耹k°PfR&Z¸În@`&ã¤ÝYx 3 Jâ„wº2a:€#„‡zØŒ. "ŠAR£ž`ñ˜ÚÁ™Ðà’4au’È·Â]Ê@ÂŠÌ €P™"a8Ÿ&2øžÀϤp ˜kSóÔ‡¤B'PaYøáŒ…!ÃÒÉèR²×ÔqÙk¤9η¹kø p!ä¬!@"ćõ÷C‘9Y¢‰àqxGN)\ÜqÞ¦à~òÄDòÌÃR8Ó!€8#“Ó…2 œ$¨dÜÛ±@™‰Ì ”àÆ 2,kwD¹Z3ƒ3Xdú  ¦­ˆ±Tn 8Á÷âÔP)Xf¥æÃa 9Ó˜ Xp]k­\‹0“c¨»§OcäoSö9ýÏyiº{:sÅ€ b¦[ˆR-ÂUG’ø1³±÷;ÕýY›ž0wÀ“T >߬âÓpe#’0 À,M Ö=±4:˜¿írà~“ÍyìŽL?½^·ëûòôx©åRJ!"5Ûö#3J-Ä„yÇÕ<>žþùÓÞ} 'ÂLØqx8f2çÜ›!‡#!ÎqTÜ/Š3„éö˜·+"šãºœ·§\̈» 1úðÛm¼]ýv€Zq­LÓèI ä…èD¸svÆà{A¡¤{WS#æJ,4rº«˜‘'Lqê i“¡•R[[j¤ncgÒ" ‘Ö#8¶—¯ÿö'Œ‡ÇÏÁ—×=®×«Ä¸œ¨•Ù7 øöòþçoï¯ï*ɵ.HÖ»  $fˆüú¾ Y–Ïç‡çÏŸ—¶l×kßÞ+ŸWx^²¡CŒBô¼^l—ÓZ+ŽãØÌ6¬§º˜åûÛ8z_Öµ–ZkÍÈ YgogxŸ56 ·»<Ì"pJBÀgÝ0s–¤!°LQT†T.!žÙ‡#r-¥0Hì°ïÃÌÝ-\Ó-=g92<Ò2=<#2",|x?Æ1lnÜ<½§ih„"³ b‘S-k+ÍQC„°O£3ÍtçlåÑ4ঙÐGô‰)c&À¬ga–¥pa„€˜ytÈŒF&bÍLÞˆ[ÔDLÈ)ˆáæq,\‡!ÑA©$€zè–GÈDN$}7;Rˆœ`hÿõ×?ÿ?ü?úí:†~ÿþ ?þño~÷·O­¢êþl“º,ÄA[â&fˆ,²+•jAàÝÁP5Ýa~ÉÐ-%‘,ýHQ ¤˜‡¥Y:€v¿ ¦a£„0Szf÷™*FÐHOœ°i"Dþ)@L. J@F*b2$™ÉÂrz8·u­Ëz^üá§ßýôóz^Í}í#®×[Ç·×_ûèêŽé¹Ô0tc 8†{×V‹0#ÓRD˜ÕR«HnðýTNåôô#qÕÞýØô8H䲞QH˜] K­Ûí·}© r…ÉÞ·n„?ý|YêÃÒÁF_ÖÓ²ž¦VIDEÐ4mŒ .gn\̬ûa©ýØßÞ^¾}¿nW‡k·~è¾#‘îÇŸùs]Þe½œŸžŸ?¯UDB÷·o·®¸\Ú¢}ß¿½n»–§Ë—–§Ö¯×}ïÃ"ÕgŒ1§»¶©DÌd˜n:|߆z²àv(³„»y1 Gd¹ê0··³÷È÷1" Æô ™-ÕV±&îªÖµž?úñwÿþþã?ý‡Ní/ÿòÇ·××­÷íè=ðºë6¸•BÉ=9á^#vœ p„˜ðìN­c¤yz$b¨Ú¡¸»{ì­´y>5›úèeY¦N|Ò><]·ãºí½wëê}L!yF)üp^ I¸dFbpOð}ÛŽ®:4†ûµtdâÄ lÀP6% ä‰ÈÌ5ßûöúöþýû맇‡õÔ†iN‘¡Žá ˜`YOuiD¦æzcY¬V½cÆÒÊi]ÔG¦æÒD’™HÐ=úðÞßßÞÞ&F>"mžw\ß^Þ¾??ýøÃÓ岸P>=>œ×ó1t;ú¶ßú~Í™éCíPÿËËë®ùüø©¶:†2âó§çei½o¯/ÛvUÕ}ÛÎO’ëÖ¿_· ‡û 5! #…™3CuX$ I¸MIj ¸Ü5'äDR QF`d$ÑLÀ2PÎ+%1A&Fh¨†%p€“ %ólg` $s•,@€“LåIXh¡p)Ì’#IŠHa¨œ¥$“ADš†*¸ÍNQbªZWWÌfæÄf‰­ŠpÀ¬~„»GEàJžÎTXc‡_o#â÷FÉŒ@HÄ\WÇîwÞ.A:„ Fà¥(žÇì@Ì$ &D׸ç(Ü0 ˲p["2­KBÃT)˜E¸ÔÙ™©}â˜ÍÔÞÝ ‰J)EJ)LD,ÒÃz·Ñ‡N[î‡ïë¯)DÎßøõ qç]”; .²k`ØÌAÜ÷y_Ð<³Ï#Qf":"Üo‹ÀÓJžˆ)DsN>¿T¸ »G…ýÆíýë>>'¾é·&üu¤ÃÈC{·cÇm?µvZ–‡‡Ë¶í} DIÔEN”eYÎ"C+0 Õ¶»›«ÍÇüq©Dsº=ëâˆ19©™4¹w§Ý;Äp×è`F¿õ„AM®·Ýº‘Ike]X=‰H0³.|Y*Jn¥èö›Ã1l#BQÔ\UU‘ŠˆÌ<±ÀÌ`BÓÜbç©qåR‘= ìðþ’й1¸é±G¨w=zÏå|Œ¬¯·q}¿²÷‡=]¤ ˜iÞƒ¯›©K­­.Íûx{ß6å,$¾¾ëÖä‡O—§OŸÏ§ËûvüÛŸþ¼]ߟNôpòEŽ&ˆ,õt^/OŸË鱫_ßn‡C‡ÚÔQ# <†'–ZÁÁõ°`Lä–fî‡Yz"Еºê>`Ê0ÌÃ!@ }’¿ „ß³gfÝ ŽÄˆÔ®™ÙZ­M2=â¾öt=R?r_ažîäÚMÝ<Ó8M(Ihú ©—ZN­–K!³Fµ¶ZÛTsÌܹ»ªŽ17މÂÄe9ŸZA|<]Þßß5œf%Ò! '槈DJB"cŠ#f¥„ )¼Ô%ÝT zû®cÔ µS;Ý÷·`G‚D’Â#½æ€$,KC @Db©Ê‘éùåßÞ¿ý:o3ëåøK[@ß¾¿þùë/ß^¿y8C€H9ÖÏËùñ|Œq$`)Kïc—§BÊ|ÀÞÍ&Ö)>²èÉèàHÀ•¸5¨’An˜ ËÎ3•Eáx߆¥z„G†EIÑwóDÆÒ@J2{fª7áÓGˆÀ@àÂ0©s9Û¿íô凟~ÿ‡?\ŸZ=×Ëi]™EÌ‹TBN÷Êtn t9no€±œ–óiu3ëC‡öý¶™Q&"P)§óƒí½×*„¸]oçËÓÓç?=?/œÅzÇ4D.UPÊ|nO}&yô÷÷×c·c㌧§§ËÓÓr^ëÓ§rZOM|ôí6tDÆÃÓ#¾¼|ƒÌS)…QˆŠð™­”Ëz9ú±õn`Ltªl­úº¬Mp»½¿¿¾àz>­g*%€åñááñé¡¶&Â0àÛ[ÿþýmÏ-IzïÇðLY–§)žz|ÔÛ¾¿Ýöëml·¾ï=´#5BŒL.¬#_ô ‚$LØêˆ°Lñ„¤Z°öacîÝ€a~ 9iÎLî/Œ`ʇ….•Kº÷݆×zùÃ?ü÷ÿá?þóûŸÊ?ýßüßÿóÿò~»žŸž¨,f¦j‘\Õ‰©H+u…>“é9o’ æ,\ fFê 1&23¨êq03‹»G}}3íD T¤ÕÎNDˆlª†™ 1§ø€f΄µÊº¶ÚÊüoûÉ q.…çýg÷…h.èc”•­ÔÖj&>œó“GWÕ1ÆÞûÞoÛqÝ÷cŒB°d])üTN ¨£}Œ1Ž>nÇÑ-3 Г( üê7W<ÉÈ‚…&z03!ÂïǶm×ci˜ˆÒ§F)'œpš7Ò3ƒˆ9,Âܵ›iŠÔ§Ç³‹`Fô>ö£u&)²™[„[š§j¸)€!S™á+¶ð×wã5á‚¥,ÂR–²P= ©²ˆÐ„ô€r¸Ë@7Óq& à#„àóóóóããûûû·L.pìcFiœ](àîhâ`!šFÃ2 0ðàL!H £@NL‹pd¡¥b)Ié 1h³>?¹˜È„È<ó2ʱw¨‰QÀ˜ –š‰i@‰LdƒT£:gp8 Bº{†eÈan¨ªT@(»jŸG=&"6:kaŒ9³î>ኂNDÈAyT‰Ç :2O· ¾J¿—ãïgå™ Á;ˆ ⃖‰pÿYEdX„…E8¦C ÄRèqåµf¥ÈŒæÃ="Ô ˆf`ÉçAá $LÁ83ÓÀ‰ % „ ðA„î]Õ‹Ô…fG%‘<Ì™¨ŠP:`œÙ+H #Í0ÿtOÍ–4;€;ÍŽ43”rÇ…áQèØ»™GdÞ+õS¦–0ý¬/;šÙÈY¢º¯ &h|j?§­‹î9«{ô§f"Ý#2&kt¦‚f4+&‡jŽ ™æR~jšh¢f¿è^NøXZÜõ÷ÄÍìn€ßÙÕ>J­çu‰ðmëc‰d¢ö#=‰«ƒLSÀZå´Ö¤@liÞ~tImè¶«'3Í:2'9n&®iZ9‰™š®„yBB0 ³Dà*4µ-絜NÄ@D™aÀN@ÄkáR“‡bXxP@:C`LKZ&MÞ53âÜxÃDøçu‰`K#:ŸyŒ¾_¯>n•ö4ïjÊ\åõ}¼\ÅÚAÚèGßÞ+@ìlWX$Ómh.›Ò¦Ù•‘©°wîXU'ŽDó€ÈRÌózÛ~ýþþýå­"<>]žü\G)`õtùòãï~úù÷R—¯_¿ 3—JˆU*sÀÈ¡Çá\ËpÝzßîê…ˆ#Ì!Ñs²(˜8‘-ÐÃv÷}<9°TâtóD¦RJRSšÔuáд®Ú?nc6p Þ_ôd–Ö.‰„ k[(=Ïk ¿î£_Ù‡|¤c Ð=‰°•ÊàásÀEó5à¡I‰äAT“jÞ-è™I‘˜„4ùYpGV&2Ê|„"FÙï=#2SKB˜‹HB0ÓßÌ,2M pðácÜ!2+¤cUÜ1(rä̹!t³‹¤LF`T'F$f¤ðà„‰6Êt·¡fÞ¤œÏ' ñ °`OÜzvË Ë{£]< Í0§mçxy†ˆÆf™v§Ôa%1ž+?¯õaÁç ûÐ;BÁ3Áœ2 ò®J¤;þ|Bvª+¥"%°£Ì"YX„ ÷ÈÄE"F(ÂHèêij#bd`ŒX#º™lÝÒŒïd$ ¤Ù– Vs†>24Ó ˜€R€™I ›…Y褾}˜ÆËþß\€4ûýó\9ëù‘†™Æ"”x7³Í¯øôS},æi}oî7ë{A#3"#ˆ8èž.C „9\L¿w+oÐýá}§ÁL鸧z˜GŦRàCYdþêmX‚ÝŽcl·ÃfiJ5—eiëZKEÜÕS®6}i­kóô¹AÍ3wûqŠøcóÃ×07MwšÈoò.BDP"<œ–«0cxzÜ·ƒHOª™¥©fLá!3É]8C#‘èšf1 ÌÒµ¿¦îÝ/aæÚu-µ•̼&hk¸®g¦óË÷í×—}àõü—måŠ,Ú{^ë²½~»Þ¾íIõ¼¬miü€¡‡jXºyº!@l·[À¶íJ•å¼\žå$ª:ÜRÖO?üþéÇßCæuïëÃ…3‰ÀÜ=ÂízÝ Ò-SÕBÕ qÀìØJ‘9¤×B ˜4)$È™áÉHwËá‘àTOE‚YbDX¦šeÎPdêpu×1Ò†⬚Á  A$Nc%„f R¹¬Ër¹¬R I‘r*ªî.H™„XÜÉ\{ßzß1“yê¤PD )ÂçÓzj /uiRâ”—Kà}¿ ;’E 38£"̶À]£—8{ø‹ÌLìfn@ÂE–! ÝS51Œ¡Wì—J µ· Ô±•Zk5‡®áè`fô % Jˆ>cÊ•J LÄTÿþíëë÷?ÛÑÇ6ú¦EjD¡Ù{ÛÞá|¹\ž"Å̼cëÛŽHBÂÜjut£LuDŠ$Êdd v „0Hs 9Õz)ËŠ$”)>t¨rÉŒt6GÊÒN‰Ívh*%«{¢Öª¨e*5Â¥ð*"§ç†ë²Ô*Úu»<<\΄E»AâRËèúöúúë_~ùú—_Fï`8zzd™Ûýè×móqd:¤gÄX x>Ÿ×Öþr};®7á"i »…_¿Ý^_ûÑ-"KåÈ á§ö\Z}ûúë·_þ|{éãóåtÆå\ÎÐNuY/§3ß'xŠHDÑÌe==”"µ"˜¸- 6üÝö·w;Æ ÆázÛ¯_¿þ×¾í­ÔÒj[ϼœ‚%HÖõ|ZOéºï»evË×ëþõ×Ûë×]UÓ" P™6&¬µ´¥áP‡ÈÂ\¤±{ó©s3ón…„ƒÉ##ˆ)…ga;îXx ¢"\)e tna–îᑉ4áâ™HÁ%B9 øË—Ï¿ûù3Ûí×?þó¿üoÿü¯ÿå^/?ÿwÿéùÑ®/¢{K$?ÆÑ#q”º23e`PÜ´€=ŸsìJð±˜/G~²ˆT¢BÄTZ»¬iu…©ÊÄ)[–W)•"fy™K)˜ÌQ ’'ØŸécÕ>}Áž>SÎæ´Ã IDATóFÀ\fa` s7€,„ÂLÔ®†Re=7w3§ÆBñýÛ˾!¸T‰ûH>4¦^óž±¢œÃü‰±ùÍQêv¿ÑÏàu PF #„ÒoV ;«…iïrîÌ»åeàˆÍ]U©™LQyD2ó²,êqÝí¶÷÷&ÔVÚ©&ªº:‹ÔÚ2Ó<LݱԓpvßÃsZJ „ dt\ʲ>œÃòýå5úc¦À,…õp,R6ócÄÑÇÄþfDazº¬Á´]-»â´)%`†›Ü[³޳ÔF|Ÿ¶Î„|ܧ±I ÈA9Ü‚"Í}8;2ÂŒ M½Ò=DAA”éHF\któ ÀL™Iõ9m œ{SLH Çi- g$ PKCöÉ 6BŒHsK·âJc€id*à r@‡t'F ôó æ9—·Èˆ”ÙQ/Ó†É2?Çæ#™ŠDD2q+ÄD€¼,4‚¥,ˆÐ·››ÁÄý¸„ÓªwÌ&{fC-$•«Ð¹•‡ÆÚ‘Ñ=R i6𠘓0!Â'—30 Á2‘‘0 ÝA€8 ‘e¤Á‘I¹Ì²|À½ÓÂ"1™kšíbóLrc‚%3sšK)‚EÀ#Bm&rÈlc( ¹#5ͧ«éž« ˜ë®¼Çð1‘&9ôV÷‹{% «RãUtêo9“î×{ˆéXàûº~s•Íï@FFfzÞw4óZÆ>?å7µyß$¸³‡! Í'®Ÿé+š;ÈŒ¡C”ëD*ÏíYB¨û†Èýè} !^Û²žÖLêêÇ1L]U×u9-‹š»9"€Û}q­•å߇;Æûn]¸ß‚~³T¢!&Ï ¦ˆ·êµ Ò25"#†¦ƒR¥‚h€)DŽVÞ¿;":10Îo zÌE"bÆý4AH¼‡Â> 1†œO µæ®Œýt’‡óRø Ñv•±uûi­çóÙß_¯}ª¢ 0òu·ëv¨Ëú¸žžx~~.Boo/×þç°€2aTÂVR„<òTÀTN Z-òpå¶>~þùñóÏíòl®çgÀ¾_1Ã<þòòòþönî–¡£o›iHai2óoyýÅ ›Qd OJ#R¸»ÙÜÍ,-µR«”L°ˆH3óù¦q@N’;ô§Ó Ulh˜ê‘Ö B¤`pN\»ÂÄ×& '®…E°6n§e}¸\.¥ ”HÔá¦Ã´«¦Z˜uÏL¦‡ $ó\¤–*¥”óér^Îæ‰TÚé⑈‰#"‘#© 'FD&%‰T¸Sí§<Í"UÁH’d®BưۈTäTlåhÂÄ0²" ›¹',Ë2LüLlHˆòÿ1õfKväÚ•íê¸ï.’™Ì£R*Éêþÿ×Tcveº%“ »ˆØ»XÍ}ÀŽ”ÌøÀÌ&™4wÖšsŒyw˜Ë.<´-벞]mN»Óñ˜9cX7«ÖûäËZ¯¸Qš éV­vDf¡÷£#¸„ ¸£*üØØUh¨§9MGÉ»qqÊ" Ô»V ³@F˜sž9gß’Þ1N¹K·õFQÉ ÍE$—y¿?ìµöÞ)§‡|83#çüpÚ%Š·×ïÛ¶žŽ§ý¼‹­®î– §®½_¿ÿxýòåËׯ_Ì|7nÛöýµ:ð~_¬ÇírûòýëÛ圅f"Pïê[KyÙMźjÓÝ´ßívÑÛ·_ÿPû¶``š÷ "i7Aø—ß²u $)Ï嘧òð|xþ%%& ëл„ö{µÒÕ±H:ìŽÓ4»[f8bʘ̽k·ˆKBaÞÖÍZk:ÀÍ!9}üôéé§Ÿ•y5$ÉBØÚVo[o[µ8¯úvÓ¥†qa5 ‹um[«cU.’¦’…xØB, öL™Æ<9ÂL·Úî­´FÄBÂÆP¿{ ˆ$)sBbNÂŒ÷‘™qtòuë¦ HðP@È w`ºS:>}øéÓÇäíëÿý÷_ÿÏÿúúÇo±;‰Ë·ï¯·¯¿ê¶hH7¬ªt’Lˆ,ŒN>¸É"‚ÁÖ»vë]SâA5up ¥Þ¥''®;"™ç½,ÛÊ„91ÁÝ1>üàn(‰91ˆEÊ‘$2Ù`J„áhaDÌtÿ„À # ô>¯Jl8¸òÆh&sòyWJ™¦²[nÛÃC½Õ~ÙêíÚn׺ÖÞºªš)v'!‚¹7œð}wt¨¾c#,#ˆˆ·Åÿ¼Ò!ÁH*ÝÁä£Ýå÷‘!!##&`†$, Õúí¶˜ffŽw Äx÷GרêKÕëRùn‡BÒÞ{íHÚÔr’ÃaÞïÊéXËøï£X´>ð* œ¸T_µZd”Єq˜É{¯ÕÜQ$—œ„ Á<¶ív[ÛºUí}ÜÿÜÃ]§Ø8aõI•Â{&,D­©umaH`ŒÈÁ‚ˆÂÀäàŽŒàAdD`Í‘‚Ìa<½áhxO`Žçˆ=È… †Ø…9¬«a7TGT.w rè CÍÕÉ*£CzØhšY[ÌU±÷¢]M@4uüY‚((Ð#d@º"8 D´M¡' Á@õeèŽÈÁ#\-Ä"…©x1M™ †Â.ÍXvRf h»¨ÛÚ5Åœ—¥µÞîÔŸçM% 3†ý$û‰2a³ª¬Ã˜¡€ (<ÈG#Çé™PGèƒÅ Ñ]ÜAØHÕ Z3Ûº81¦DÂDCð]««wpçÞ#…s&D·°Hȧ]Š)»Zï]5Ù#º™3!!DÇ{¨nІþ”À‰‚1d.›¼Þd«åÒujý°šöþrü˜÷\ö’ËaJ9 h®{IAS.Sž"—||8Le2U!‰m]Újmq³‡Ý! wm×õ>~cq›µóry9¿€G" Ð®[75N …ˆƒ =¼·>8*Èå5¶{ä~÷8I"a"ÀˆðÐñœ!#±0!8Øè˜‡"+ËèdQF¦ñ{]} è ,(ªÚr¹ YJ¼CXÍ:¼;NQ·+mH¸ŸŽ‡¼@ëkݪé Ö JÝZ·¥M2PŸhU)ˆš…:¨1z"Ó»@ ì€H‚DáÒ´ËÓ!M;ÎBLNè$Â2'(,Ñ{Œº#0û„$›á.7™3ke0@Li.Ó~NóÚMHR‘]¡ñ!goºyß¶6æ—ëír»^km‘“Àå|ùõ÷/_~¼læÇÇg°ôz[/•§ý$ó14–íÚ·†@Ü $˜ÂA›­o¯±]kíÍððð¡”i;¿Ü.¯ "í÷?~<XR"ŽÛõíõÛWoVXyzøxúøQûÙŽ ¨ëÒί—íb½Y8‹ôu{»\YEž<|[×uqND"’ !©©›2Ä”S)Ùì?8|¶)svÓ˲ž·ê,”¸¡·‚‡ùùCÙÍ„ÌAÐW~ë·ÍT‚“C"¦’`3Sí@Ƴ”œPHkk«w Æ<9l`Š1jW8J6€ˆ‚’òîP¦= #bX«[¨Qš¦yzxx|>=n×åû—_—ËÉéñÃG`©¯g‡8ŽNÁðo/?L-Í“R¼-·¾¬jNY·^/¯_…0#PÃÌ]sIëº~ùúuh¯‡}¼Õíòööv97‹ýóO$ÓKû±€Ëaš÷û=´•‰þúÿD~|ÿ~yy¤2jë­]ÏíbN‚ói³Xokl­Ö^‘ËóQv ”ˆ§2™6A9Nu]ß^Ï·¥Ÿ>>ÌÇ´Û_n׸œ%ér¹]Ï/¡k]‘hžwª¶l•S1ó¯ß¿º»öffÀ)Oó^˜k]µ×2åÏŸ9|þK X×õz½ºÃó‡"¼n˯߾~9¿Çý|€TÚ¶Þn×ß¾~½ÞÖn´l°V¢4Ïû A[³Z±iSkÖ »$`³Ð blÕ»7PDND©L)i·Þ¬«»»DsõáÁŒµ*@a$I%Ïœ0 Ÿƒ$Nž˜ÇÝF‚ÏÜkô…ª¢Ò‡çŸ~z}=ÿú?ÿg_®ÓÓ“yO¯ßt;«¹Ò¤|è8Î=FîÜœÑQ Qñ¾F&À0D”œ¬C7,il­ ˜ cëUŒS¨}ó—ëm•û·ß™éúøpyØ’ ÍóŒÌªæ®I,‚" gƒ¸0ÕÞ&NBbf½û݆€Ä2ÄÊÌ9 ÖZÝ-%Äë蜘‰™PïGq`€t ÊÈûyŒ¾ p«z[Öåº\.ׯß~üí7þúõì×-úðçÅý“?Žûc¢8p‡ŽÕ=Q0£#'’Lœ„IiH¡ÉÆ”ï›&ÌÌLt·ž†$.%Y—Í›™Û§€3Alë¶lm©}íí¡îÞ±÷qs‡1}8ØnW>ýôTм¾¾-·Ô>ïòT ‘š£Y2Bà­¶M{šÊÃÓéáx˜…3!Ô­^nk³hÍ ««šš×­oUE¬›ª)8¦œRA¦Øí§ý|¼¬Û)¹…×fî]·M£‘ŒV!ø`’"`¶÷`ª$H¤Ð‡Ã¨fƒ}”;1€-ÀÙÑ, €84BÃÀ5’d†ìÀÍ©i€L \uóë Zg&§Po.4Z ( ¢[@ s0`D ÷ìLÔºB :‚ƒŠ!'áIxš9Ÿ¦Ýq.9 R"Þå²Âž©›¯½÷7#–Ì9˜Ñ™‚LÒè’MGxªFßÚÄ4”hZ×BÊÐM#ì¾3CG0C°ÀêÔà 5pÔz#0”гÅÔ]:˜sÏàBÈ€æ}\s8l]¼–•Ýb¦)‚WO6 rr³Ö׿"™§)gšæLÌ%•´ÖÚ{£ÀÌÒ{z¹¶êAÌ9 … {–‘Ä'U‹áHr¤`a6êÄ$HŒ¤dnª®Jàìˆ>ý~'þ'<ϸ«ß)¢ƒ–7ÊU÷gzÜFpÿZºk×<ÞíÕ|¿Ôã¨?zÙÜõNº¯kÁÞw‡q?f#…A­ýåå’EÜc?—qÐK‰JNݬ«?„»«jmuk1Ü€‰w»ìv§ãnà]Éóþpœw3¢»»«™.Ö·¾­á¦µj]½W0Epp o=<aÁ(`j€÷ç7‘'v÷Ö-$³0 ˜"dŠi¦È‰ˆCÁ«‹ÿ X"”çD–Jäýéé—ÿ2NÈ<íæÓñP˜{ÝÞÎo?^^Ï·kÛVˆ$)IšR–pçйL§mÝšVFžÛž ,\Í1 gt°m{gHJ”›»BEÁÃò‚î`H$nÚ(¨& 7»­[­—,ùétzz<ý—ç}z6³óùV{Œ½‰«öÚç¼ÿðé3C¼\¯Z¯¤Þ΋.+ÔuÊ"Jë¶öZS*š¦Õ,úF½ ÄT²”Ù¹'‘„á½ÕÛr«½î¦éñtz: Ã¯/ë×x:ð‘=yíóññçŸ?›¶ëïÑ×Іž §Ð¶®M!Ò~¢Z—aSlR€dʳٶ…û6è#J©±õ\Ü Á¡cA"جŸ¯çn½™&.’HÊn?S)nýõÛ×årFIÄÌ©çÅC/·‹!<úô åõz¾žÿþ÷«ëz<ì™ðõíõûëK ~øðáãÇOó´3ëõòýÇ·o/ßézÓëÅÇŸ>ø'u]j fÎöpXAÝ-mž,$‚ €Ð™²v«Ë¢Ú‚Y€H„sIDNn(D9¥œ ÁÂU˜§Â"`㤉9§pví=ÂŒÓJ™ö¦3‡›Vçþ¸§ýþp|zÌe¾^®°;îòDËË‚îSž;Ï·š.]z"0¡t‹@C  ¢pâ‘“õgJ¢ênN`hÝM S¢$4°Äàê(jx¾­o×EÌ™¯KkíLÌ(é2l¹€ä„1eó Þmš¤”T²€xmuÓM:Oe*’á®þÓ! éTwsŠ®á­¶q$Ònëms<=b7fA`wu¾ÑÄ|B™]ž 3ME"§@ònÞ š…Áfp#Æ;ÀoT²a€Ûàž‚-ÃÁA’D"<ú¾ˆAˆ0äG®Žã8˜XEÄ8Ë»¹kÄе³dI ¡Ž€µùºõËmYjo}(<Ý Àï3Ê;´u«ƒ'(™Ð¬7aœæÄ‚½ZSS5&’”=´uíÖ¤´iÒ$Ä îËZ—ÚºÄT] b«5;g! ät÷ykne7—œ»§$9íOÝ|[n^Wm7[µ÷ÎY0 W"wrð`D!7Sä$I˜FwÜ™‘)Í=Gz—¢»UëHBœ0Â-‚xÀ^,¼#":Ã=~É“k¸7]W8¿Ñe‹@ß•t(Ï¥ wé[B”4+D Ü€f!òîGsÕP‘NÒ•‰“wÂ`’IäÎ-œv)Ì"ì@ê=Â}ôDÌ“cr` m£Ð^Íê¶T™R~8•Û¢—7ó0BA±®ëe sJL½ƒÛðí€:ª» ö3‚R'„bHŽaÿLâÈIpÅ\Í ’!†{óš'ŽÌ£mh„ Ò:°HEÒäA@ž'ƒÁÞÝš«{±G£´&2`)Šä`!“”ÌjD"ˆÖ AŠ¡K²§$Ì,áÔÕÌÝLkmËV{k@HaH!2b+ìŠævïŽÞÛ…cðdžq»»q£ ïƒÿñ|ÝÜwŽƒµMñÄ|/ ¡_là…ðžš‹„û¿r‡mÕ?®®üóó”Å\¡ã½Å½÷®Nˆ¹ZµÖ0µ”ÂC€sJš¦uíà )˜‘å®fÆ\hžÓÓóüñyŸˆ¼)޽å&áÝ9÷žé¨@#“Y„o‚ý0†ªtDKä¤-+ŸÒD,¯[ý~m·-9eaŒÀî¢:‡o7h){* ää[/èÄ­ ­Â¥©dI)1kn!$"B SFì¦} ë9SIStÄp¤@J“¤cÉ9‰Å4åãÃÃŒ°›ÓaŠ}Ò¹HÞÁjËy¹™Û¡ÀÃùù°nôzy;__Ûz ³†ÔõÒ¶·§ãÓÃîJñ ­ ™$ ñº¶ë¶9Až§, êV—˹nKx£h(anè `ã–ÇÄ x#=újÚ-Ì”JJSž eç$œ…)A{W.b9иgÄ€6yx¸º…yÀhº Øj ¡›$s “]J‡¹LÓ„,—ÛͼkoÞ‡3 eJó®|úøË?ÿóÿóßþ韦ÝL0Fòaf†è¦n†áwñO¸3QÉBAÚõÇ÷×å|a¦ó­Ë©Ì»P7ëmY®·ë¥mÛÀhõÖÑ}(]ÌÕ@"„(c°utC'ð» iÀ£)x ¡‰‡gI2EI Õ¢1&m†Ix ¥M­uÅp*)ó´üðË_ÿúéç˜ærÎeš…ØzÍ»…Ìõ5³ˆÌËb—óÛz»æyFâq»ÞŸœør}‰® 4y§NìFaÒkÔŠVw‚±j«æÐƒ%ÀØ‚†áŒœ0B·ºö¦)gÊÂêÖu[ê¶u§ÖÃ×]©OχOŸúüwÞ./¯çWÕι<><îö'GY–óùr¹]®Ú< ¬®,€­›o¨õn›à àºÅvÆÖ§2y:p™"5 kÚ«vÞùoÿôùñc}]ÿøãíòj[ë]_¾¯5MÏ?펇ËõòãËç×—èÕëRWs5R-¨WŸ¹M3q‡L¹§„Û&`æFZ- IDATýv«À|«ý²niÚþëωvIö%¡Ë”Q؇§LÄ!öÇǧ‡çÓá‘Sq ·¶‚öè­Õ:å)—âæ½mk]Z¯ùxØ?<–ù°mýz~ýöíëï¿ýíòöR²0qゥ óCÛñHËzY—ó¶½s­]5&yÚgÚk¢4Sfe…Ô-};ÃËR»‹P`xo ¨íæc*ØnuYªÒ R‰ÐX–’IO &æÝœwsBT×6•üðp(YÆ!'=ЇÝYHHˆ1ë0ýX¯al†j¤ŒiÊÏÏO‡9<=-?}^Þ~¿~ÿc¹ÝR>QyZVxYâj¤ÀƒäN' S˸gÝÇGËGŽ]¥‘quëê#u›§$LïL’Í]­ O$ÌP{óvŸV2’ðØ í' ÇZ›,<ÍåáápJYÝn×[SÝ•éñtš¦aîî³pW}z¸õÞ­uU³®Ë¶nëmsIi·/žOOYÒôyÄÝïÃ<‚4€!€€€H@B©äÓé´Öx»¬¯ç‹ÔèÃ(Šô^$ÄwügÆßýôßÜ8ƒ‹4𠿦Þ#BíI˜“H’4HÜ”%!"€‰1¿#ŽmƒG  ÃPWÞµ¦ã8á­«ª# †^o²n½6—M[5w‡Þ;§Ñp6ë܈HRÌHªª #nÝ‘«Ú­Õ­Ua°0 ïÌž3¸G„º¢Šd ;ÆLi3o¡±/òpœÜáLq…ØÐ-á®L8¬ËÕ¼3  º‡A#Ì™4º‡G.¥¢¦½u¦ÎˆŽÕ‡•ЀÆïÛ-(ØÔC(Ý0 LµbBqomm7ð3‘wËf¹VéŽÄeï@f¨MHM¹‡ˆ³" 9ƒ€8a„Xb g™°$¢œË<•)³#&ð®mqebP@Ì9qÎà ,”rÉš˜Já¶i÷àTr~<ÑVÉm­Ûb½†` '²œ1ªºqr¦ºUµ*¬ˆ¡CÐÅú8ãñÝtKƒìÀîn`%í½oæšbžˆÈ= 5@Ñ=ºñ€€ ´!,ôð­)öŽCÓÁNX륿ÝàÊÄežÇ|(>’‘Ös J’²`àÖÀ=FÉl syøÿ$¥\JDôÞ™ÈÝoëVk¨<7Ñc$ fdEUÓä ÀŒ{·Fßá^NÿÃï+–;¸tÜhÔ ÈïèŸÀÿöß‹µïÚ†1T'D¸¿Câ.xADŒ€ÖìvÝÀ}7Ožx?9tUc `Š€nª#J‚(’Hµ™¹0™i«–S*9OÓ$·@ß¹HCV91eÞïËnž„“˜¢C0þ9¹¸ÓÆé\s`È›”A3'Ÿ erîK˜!18xï`–r‘4ƒê £_¬Øm¼›¼5u¡é¸ß;ó²²*f¡œÈÕ ƒÂµ·ÖµsÄ¡'­ÛF ÇÝéHBÞ º…5×î@º…ƒ'JÇãìDÄÎ PТ/ë¹BëÖºÕ›rø4wóëm9¿]¼W! „ÚÌó|<}Þ[ÝÔ]÷ûý\vsíóV“˜ÙvÛÖZ—u5sáÄ@Îݵ« eaF"f ÎHŒX{8„ƒ9!á©äHbȈaîݵUíêR/}¿iz„šöªj€eØÍ»œ¸[­ÛÖºšä,I¦œvÓ|:œ¦”ü¶Þ¶íV×Koëˆu¥œw»Ýñôðôôñ—_þñ—Ïÿðpz-3Èjsw7ÓÞº:@ 0Ïeò^)Ìk_ÖµÖFáã€ÂӼ˥˜‡™™[ÝÖm]AqLC³#E@W4ËDH)z¸2xkK*Lä($ ŒA0@’Ë¥p$pOd\Ø&ì·Í«ÂŒ =0¼UÝÌ…1a>ìOOÏOÓ4ß)$(”…÷µí_^Ór#Gt$#ÚzÛn•·9ƒCNåáxüøñÃóóq½ž/ß¿oËæ¹0’¢oa+Y-‰çyoYÒæ·î¨ÁN» 4ìãtGŒÈÚÔ™C’il¡¹ð\ 3«HÒ”^ÖV¾ÿx¢ÄÈŸW¶W4vÝŽÓþàA¿}ûòëßÿýÇ·oлԺË1Ìz]‡³ÃØ*!P€rHvÊABèdKøPÒñTöÿëÓ§ÿÑCþ¿ïÿò·¿ÿX#•a»}¿þ¾þ‰sþñúúÇ—?¬5R…fÝôÝHx:<ìN„Ô¶eÓ6•yÞæÃ…{·eÛæÝ”ç‚ Ì(¥M%•é0ïwÐêú¯?þÝjM|çÁÄVëuY€’|mö>Ís–T>|üIH¾~ýê(ÈIu¹®×¥®.4åŒH—·×·¯_ß^¿ýã÷Ûùm½Ý¶*( YX„´·åv“2qbm‹µ%ÔÍ™1Ÿv|˜°HßïvÙ?–‰¶õ|{3káE¶IbUnÎÚµ-g²åø|9íwkœÛjMá;„v ¨»Yö»"Bw)‡µÖ"çsC™äéétØO "îþúöúúzíÝC„¦‡=ˤªÛ²ÜÐÌ]Ñ£í%í ?ì?==±póØ‚ÏÍÍÑ˦gã‡å²¬Úâž„?1#æêãDŽD6Ú¼ˆHpï°Ýƒ°ˆÈ"è½»önV=%b¤¡¤'D‘Lðþ!1ó>è Œ:æfÄhݬY“½ ×Ö#@Þ–v¹.¯xÙ¶mxpqhJÇÐÍÆü¯ÖÖÕ—­.ƒ“¯îá!/üvYO/7a‚€á {ÿ!,ƒ=Â<n>ˆ¤dÞÍõ°/§} wfjMÕ Ì`Èÿ Ü/IˆNw½ñÈÑ‘9zÇãy¨…ÃÀ€"1ñÀ…;€ ‰Hb p"GbIÂ]Ý¢#:RW[·¾ÜêbËIvy:ì|¿öb@·†!Œœ »h%–YR‰€îÑÀLÁ•îzC$I” ¦Ì;’,¥ä)͉ó©BP931æÄ¥dæL”J™K)îÚ1B.iš8Oèa, I€tk}úҶ™º¨xäBe.Ä\Ã5îž[5Àd¢›™+âày£ÑHÌ#3 é0ÛAE°õ "TÔÕÁ;@„;!Cp˜;4À€á’rPó0¥p†@BîØmu[C=3?èáñiR¡ÚŒp@ˆ;X³®¾õÎ ˆ÷&ªx(¢&6a""ÈYv1!!.ÛÖúñ °8®="v‹­µæÉsÄ{¢ÿOÝÚû^ß1ëHàqLj,êýr#”D÷qÿ¸ûßÍ¢ÝîÅ¿;¶õ½zõg#ÀÆIË""nH‘<¼¢ƒ…›"j€š«ºvs D¢Á9%€wc#!Ü11êËœx*yž‹ªÿqÑ×kí}¼RâN?Š÷XÔûÆrüÜÁݸ·°pG%æ©pI%QDÐU &¯µ±bY|Ê!9<¼ö抦Ú;fš§½1¡5pAw" 7ó¶‘iœgaU¦ãLûÉ´·ÖLÍ‘:DÕ ÀÄ1¸$véƒÆ–™&IîÞÍ-ˆ¨d™-xähFª«›u³Vû¶l˲š5wߺE€º¹z´µw­µ¯mÛ¬+D¢”(G³ÚU¥Pb ì[„^;˜‘ ý20¹õZ·î¦:¾Å$ÀØCÃŒ…ˆS` ɇ‡Óñø@€Z×u[Â\¸ì§ã¼›§œ÷û}N¥×¶Ü–·ëëõü¦½2rÊyþðáÓÏ?ýüáãOOOÏO%ë:P¼ã2ÌÌã â€À"H NÆ.wƒO¸kµ^½mÚ‘#œÏ/" @#T5ºeâ±’Äla‰)D0BYˆÐÃH!„•ÈKráñˆ !’ £Q§”¦,)AÔn® ‰³PN“(î‘RÈVA5ˆ¾™SJDâf·ëµn+"²¤<ísÎD@"’sž •ÒÕº”ùøü—ëº5S'ó¨½îvé¸?&ŠårYÖ-3022Tîm‚í8Óa7;¥[Å$8C“wÜŒER0uïáãõ– ˜ØEȦÝñ§çÇÞûyÙ:P Á4Ý4–¿ýÍ[ JùðøhˆÛ¶y]i³Vvó_þòz>·óË^ÒóóãeY¾~ÿÞU“0`hßLQXK–¹KàèdÝÁ¨”r"ÜÿúëåÛëòÛo¯]ñá4ö¼ œež2A]¯ßþ¸]oÛºšZA,2Ùm]ªùóóþçÿò úåïïÛ†¬Ð¶¥È4íÏÏûÓÉûzõm‰Úß^¯ûõ·ˆB·íÖ[=LSæ”S.SyÛ¶óË÷ëùUDžŸž 3Ë)ïOk³ÛívÛ¶ÖÖæÝÐI28œ¼\¾|»]®ÛvkÛÍ̈%ˆm¼!…QÄÍ<¬×ºÝL;†Ê”ç}N…<ôº˜?}Ü%†/Ûåeio狪Ñiž L¯«/Ke´c¶#¾Í±ÌÔ¥+Z¡ y)ép˜Ž»)ñ½ lá"ìH3Ísf¢¹L̘8`ݺi—ÌLJS™÷Û¶­)¦Lyjt«ëêÉóS=wjÚn·åRûòãíº`9N‡ãmÑ«•°ÒP(1ãûùÕGéã~Jº×VÇGÊÞÍÞB÷¯à}@„˜„Ì”ÂcÛ´5&vs¨BaâÎaC8ªï¿  Ý¹Ûàmi ¯‰Y„Âíë·o//o'DìÍ[Û¶µnk=ö$ŒÌ9—0ß–­µªªÛ¶ÕÖºùºõ­>;…‚«»Ûo_¾ã8Ã1ïæéñáôøpL)žÊ¼ßïÆ?2 "`fˆÃ¾üüÓS.ézí×ëz¾\¯·eÛ´÷èêa®ƒ¾ ˆÃ(t—5ÐÈæõS€sÜFH>æŠf[˜™FN‘$P|l¶Ç#"Ì\uÜï[|¼.·×¯ß_¿oõ&<´3ŸÂÒ£ykî˜P!" %I…KŽðPí}‹ªNôÿõ®½‘$YšÞ¹™™_"H&™YU}™ÙÕ 0  ôÿ‡vBÏLº§«2“—ˆpw3;}°ÈÖ÷D’ ÃÍÎyßç‘zw "ðÞ†DWÉCûQëQ¯ÍvpEJ%á\H=)”IÚ)w1?.p»ÑUy…y}0À¦zíÍÝÇé˜S!æeÊkž&^ˆs #£…5”Ï<¯ËÔfp$,‰9BXJ™%/©”œFïÚæZsË9Msi­÷fjÁ³ ¯óÉÏçíðÛáµwmâÐöêË)O' ë=LÅÞRXtSÕ6„°c)¦áÝÜ- ™IF!(îIDóñ®cp 2"`Zv÷næØÑÑÕÕ5P‡«ËÍ @$5U'‡Y„ÙÞ¾è‘KÉ)Ï%uÆË¦[»UKUµvÅ®£ðA(8b‰†Š(<€Â,<Ïó²Ôí¨ÀœÊ~pÝÌÝV¯•­€ß]½qù‡Ý·zwD ‹ ‡Àߣ:¬¦·1€ƒÆªãL4P]jÑ=‚uìPï>¿÷€aTwÊœ×Óœ³x˜ºé¸¸yBÓØkߦj÷» ! ›yXÐèñ½K)LYx]¦i*µ·ï¯Ça¦¨z//ý#Œìàp\!\Ý{k`-go]¿7}Ç…ÎyšŠ$@R@ƒ75¦ÈÌ=ÓÁ³31B­þ0QG¤Q<ŽÛ];9‹L lªÅ0»ö"zú4A@b]¦ñ§,€CA}`ôHÝ(RÊ„‰8¢32‚yT·®½[—e9Ï) v=‚‹,k^OóºÌëTö§sÝ73 ˆ®êáµýËŸ ¨÷Ö´¼¿Þ£(nªÚ‰£“+F$N< 2rdFÉ£¡î®=î¿OSkwuÔÖ®·›š“Hq·fêH(2hTÖ[8z˜¹1Ë´¬§óùœçRò1Ò8z‰”§çÓùôétz$næ·Ûv}¿Ü®×£^Ñùñáyž×”§‡‡§ßýòûŸ¾ü¼Ì+K¸yJ8‹aL,îP„ÌRx¸v­U]ÞoG­j1.êÐk­ê®@€ê1ÌJÜ"0KZÊ´NS™&0KTŠH=mu‹IÜ)¦¥¤È`î?p`8t±"IráÄ”R Z£’¶ÃT‹ÀÓãú”—š¿]úpÂt,ËiÊ™ë~»\/­^¦åñÓËúð0Í‹¤Äi:ŸŸ¬{Ýöp+ç”øØËQ{)Ó2ÏjzÛíÛk¯»”üðü,™1Ä­D[Ÿ歧¨Ç÷ß~½^Þ pZÖi]ŽÚ^ß^ñåË—ßýþ÷/ÿí_ à¯ÿñç?ýÏÿÇ{¥\ž§YD¶ëUµm¯ÚÈ€… ³cD­jŠ"žOÎKÈI}ºýúvÝ¿=$ɧŸŸ_Îù1Åóš§e.„°í{hÞùáô0 ׺·&^ÏóãCÛöÓÓÓ)%tûöíÛÞêOOøüóOëÃCžWJyßnß¾¾Ö×q»ÜÞ~ýªH?ýñ÷?ýñQò4•!ܵj?‰PsôÛ÷÷Û~<½|yþüKÊùoÿù—¯_ÿóد&D‰Zý¸^·Ëv»jô€#BÓÞé,Ó”8•©@øåããûûÛÞZ&‚¥ðã\æDŒ]ëûû×j½ýúë×ï__÷£÷ç2OÒu¯pûéÓò_>?rÝ÷Ë:ËÓSi;ÜËÃÃôåóùËË:gIƒZˆ€|Ï»öÖLÛiIOË2—ˆ¡eÊsùòôé©um­DšŠô„óËóC7|ýØÞ?>ÈëSê‹_o·Ûö¯ÿZ!½ÝŽ®–RÞŽø~µÖX52eÃ.Ê=8UF÷1fp÷®f†ýîÇ82BvÈ ÙCíÞTÈ<Ì43„lWEDŠ;":"î€|‡Ñ¡S‚è„CWgÖ‘ðz;ž>ŽÇÇÓ\$o·q«Õ-æy ÷Ûm$!5ëjjæ¨÷‚±kÕíÏSžçbfë2#8¨ª`0"C„¡!ˆ Ã<§çç‡åtjÕ?>¶¯_¿{}½\qèÝjÕ˜Ï{C# ~OÝc R"IÉ€cTG¿ŽÆqÂ" îfFÄpp £$H„Î1Ì8ˆÈœrI’)%È o©jÓýh0pƒˆ$,h­ë¯ßÞ®·ËiÎçuve™Oç‘B‰@Íj×£*¶C·ë^U¦e.yšJ„+…%PˆPÀî` LÈ"„£‹5ÖÄÁdžA½·ÖÍj%f *1!Ì)INçy~:Ÿ¡”)SŠ@gäFEÓ@vuŒ–2°sæ$)‰IŽ× Ðj "¤b')gìj €‚<ˆÌUíˆ02—Päl’ön¸5 ¾&àSªó€ÜNß·é8ÄeÑ’7ÝÉ“ç„"XD–œOó²L§,3@²ó®}ïí°ðeZÖyýüés)sïF9‰pz¢”Ë’Ê,%3Xw 4n½'.GïÕܼõÞê¦ <#0H¢Yk¼~tœÏ)³YÛ°ÇÀ»;z`P £‚9€©ºY —“S`rdrgO\ôÇHÂù§Âä ì~OޏWí£¬tŸ ¸Z'ìÝŒ(÷=z¯×í¼.§ÓºžÖyZq-AØk 1¹D0óPÀ² Ž. Osžj!äežS&3í½÷Þoûž¶|Ýš¶Ö›jïî6hŸ0(¤æöËcï €„„|W/ýHÊÜÅßÃ@€?bPcöƒ¥pÏ€„"ìNÍhzCºgÕ¬V* t6OÝÈY@ÄF³®3ù^;`Ü·Fƒ@‚Äj½­ŽN$sàÔLª¦æz”S;?QJ~¥c¿¨·y^N9y»ùáäÎ8&¡ä ó”¦ìÞ÷c¯—÷^kÎÓþñQ–e~x|xzÉÓ´Îg8ÙAa©dIe9ãÃ'ÕÖæy:=<\·ýßÿíOïoo~:?LEpÈHzEm3ÍÙÁ®Ý?\”w#‡¨Ú â4•”)pÁ\9!f0£m‡î Ü,¾_ö©Èãi}œ §âo·K€O§Uj­ù¾ïû~´\f]V8n=ÍÓó/¿4€ÿø÷?ÿûooüùËÿïÿDZ]ÿçÿú_Û%Ï˼ç­÷æ†Ú  ¤ù©úS‹sXâ®°õ—u}þùiYSl±úÉÀ‘¨Ö¶m»îǺžJNCnx>çǧÓç/eš ©š—z»~ûxGáçÏŸ¿|y>êñ·¿þùz=¶ýhûnûufXçùËçOo—ëLøŸ?OóìHœg5ïµ¶ýjèŠˆÄ Lëåýúöºw{x|Z×y]Ë~ùöú[׺"ckÑjß·~¹zo½G&Ifíœ2?>=Me&À®ýãz½îµ;Sf˜Ù×̧yvˆ}»ÜÞ¾n×ííý²·žË´®óº.Ó29Ñ&©ÿò˜þáççýbGÝó4½¤ó§4?® ?œÓËËùùq™³¤» %Kʵ«{OeJЛ èÌúªQ›iŒ»`]×ÇÇu]çóiùôôtZtF¤3#Dv pÇ@4ð8¢Lž8æÂë’j-Ð5´‡ªÕеSWÑ AÿÔoüaQÃA$tgdÁáñª;ÝiäˆÉbHלq/pr§…D7ax8ÏËmof±ÝÜÀÝ<<âÞF ô`sÚ«½½ß¾}_–¼.Ój¾ÝöÞC¸8ƒ’ƒ˜‰vTFBF0‚HHë¼°,j—}oˆ”3ßÙ·ŠAw²b8†Â*“ ر¿÷Þ>?=Ÿ…èzùpÂRfz|ú¸lo· Ñ̵Ú6Šš ˆÆ„’0g‘TDŠ$ÁN0åéáB6` 0Dãa…"EìcÏe#©…Ì) hÏc‘‚,6•}ª ­G“h=ò ¨x9±ÅŽ3Mó쥨c–4¥Ä‚4K:Móy>MefÎHˆî¥UÙn¡­•4—ÓœK «k€ª¹0Q ëÇ ëF ÚêqÝêÖºjíõºmGmá8Rkuo{ !Ѿoï—ãè*)KÊ(ÙÕP›To‡õÞÕÁÁÃq¸u݇P'Bb¼[‰ØÃ{ ªrôLXD˜È‰z˜»%¤L æ-P˜0Ð!ªjë=ÌÇ"Aˆ4@Gƒˆq,øÑ·»3pUØN¾YWSÿôÓúððÈ+Çe7ÜM gõ¸›3¥,Ââµ5wÒ>HBId.iš2"š«;§]9ˆeJjÚÝm@Pzû¡ÌâV‚ˆìæ÷}eØ]DpG!"Åø['D'w§'ñ±Ò»ß,"À‘€áÇŠ ÀÇfñžObŠœù¼NOOëébܺš»$1%; ÖކDNQÃZ÷^Dpd©ÇauÜ)ÍÌ] CÐC›¶(P- „Y…00Ì{÷®-L…s)eš‚ɧy}zú|~zIÓj·Û¶ß®Þ»£ˆ”‰9µÞ¶›Ú]ð I¦yˆùéùåó/?ŸË”sNx•Q$¥oýèµ»@š cÃÆŽjÖU[oÇqlÛµ[—"Hp4íÕZmn&ÌHà€A”8²9BÀœË|~8­§)KI‚ˆÚšyŒ±™3±'Wõ"œ2„{)L8ç‰5ÂQ™QÐ)¥\Фäj}¿EU¨=EÀ¡^!'á<#%kÂ1Ϭ`5'¯ÇÛ¯¯ÿY!åO?ýòåwœÊ*ÄYdüöjSNóùá!3Š`š æòÓñûEDM ²†¶ã¨»yO“ìæ]ylˆ•ÐUP— svèÑÍ™h^',síÖ»F.%Ø:‚jo)ÎÓ|út^Íôë×o­ÕÇçÏóé´·úýoõýœ('‰ýøÛ¿ýûþýõÓÏ_~úÇüo¿ÿC:=ÿëÿøËùÓéÓg iY¿¼¼¼|ùòIÕþöë÷¯ß_-bÉásíëDZT-’h%Å'®3ë™8¹¼½ÿõúõ7BÆ<…$I9IV BjÇþþþ}š–õ|–\Ò¼<¬ëÓÃÙt¾½tsÈ9ŸOï×Ë×o¿Øõòþõë÷½Y)ëÃù!Wò.Œ†ào¯¿ýå?¦°óù¬Äéô0ŸÎp»Þ>¾ým¿¾ K Uï xš[«﯉t—0ŽP‡p·~€7jU¼;h Ñ«:1bx€!t-"§e¹Ý¶ïooo—«’$ #¼cC$ UëJHËéT€RÎë:?<<§ZõÓ$ÓãtÎѹÌåüÒ:¿¤‡?>}~xúI„ º'ls’$÷_‘Taá©pš™ zïàææÖ¬'â;0I€¦,q^ÕT™á¼ä’ÎÛ†Gu*ÏçÇej{Ó?ýÇõrëݳÆPqòaòhº! ÓàW-;š‡X8ݳ·wbŒ'‚`üðDÜêœ1$€þU'¦;RbL¨ÍÂÝÇW‚@W…pÂCwÚÛVŽ’‘]7ìÄtûívëª1h>’džfæQ^Qï]ÍÑù´þòËóó˹”²Nóy]§œ` ¹cÌ·„"°«¹)8e‰NÄhjußTÍÌsæóÃ,‰kÓztU˜Ê¤šŽÖ÷Ú{3íá†>ÂÿàèÀ?B¾£[84÷wÅÎH c€33î°$cÀ}Q3zˆx¥’»×Úˆàáñôôôød¡Fµáå}×V«w ‹'ºu„@s¨Í.—ýû÷u.­ö±ÎïÍz뽩;iDw'‘iZJžS7sðpuõZÊz:MÌ“¨6ðÞõ03€Äâ†àæ¡Ì€4Ö €DD6 nDZ½ï µfƒ8ÖÓ|€”çRfÓÃ{߃8gþ¡Ä²Ló²ÎÄQFv¶›vó;T•˜)"Lmh#Æ]Ÿ(ÄÃÁÝ…rIÙÌÃ5ÐÕ4Hû:#DôFï—èe ýô Kn·‹Ö£[)yMy J‰Ó€¼ò’§µ¬K™ïÓg뙞>õö¹í{a\rí­¹©£‡µ¦€ áØŽ^ÛàBÞ®··×÷v4brˆÛvm­%I§å´”‰ŠKpJe n—ý£oW€¹dN™™!gsmµ­÷fa:²i®ÝÔü^— ‚0!K@èNAnà Þ‘‰ÉÑ„»#D¹aPbI‚ê÷‰±)4 sNŸÈ‰%À,˜83&Æ``s`d¤„i¢<¡$uØ:­ÎK™WN@]#´£ Ó0‹Šð”³Hj­µ¶ÖÍ‚•⎭Õ¶mýGù#Ô¬õf‰ AâLÄî1¸fî`ê{ëGëfÃÉ㸣:ê:î]Ç‘îï›R0‡œú$vꌸFs`ìç~€ÃhÐÁ‚sæ’%3»{ë=Ü[ëµÛÖÀTmßêå²ÕÖJÉIhß[ÜóKÞÍM•‘ÌC»ÂØé"Üõ²$„¬#T"èh1ÉHH0$…1:ƒH"’'Or„çð\ö#·šS’ æ)g@°Þ³°¤hßëÖÚÜÂ{;À”9!H˜ƒ÷L."\!½ïð~©Ýoˆ’è€h¦›"9î{D fañ€lƒ¡ŽŽ\ KabtH”ÌMÓLànf>6’€”‚S² QƒÎ‰JÆÄÃû˜Rf&¸ç DÉ"9#Éèï! 0;™÷Ú?® oÊ SʈÀèìFQ2Ê”,-á­_Þ.¿}­]÷÷¯öùwÿ€ÁDˆ@LyÊÖëåãÀÎç5a?>Âk@ðƒPØÌ0<ƒ/L ÔÜo­Zók ÛG“hâtά›ÚÖÃõþTV8ú±ÏnË2צ߿½^^¿}ûþR~|ù9•%K’OÏO%[Û÷ãàe^O§‡åá,ËR–é—_~ÉT^Öòþïÿùë¿ýùOÁé¿þËÿþ‡ßÿátJ¯¯ß¾½oU£`’À¬–¶#nzÈ"çÓòXòl9{ßnß.aMK"fÎ)å)O³œûz;nIéùååÓçŸnµ½~¼ûëkfì­½½¾y'¡œ%¥o¿ýz¼Uüò𘧵kS ¢¸íûëÛÛV7¯Í÷[‘Ô‘Ö/_þøOÿüpz €v·ëƹð}DBŒHÈÛ¶ýõ/ôv»PÄ”ËѬ«…uôNá™B» XÆZr.‹ËÔÝm;.¿ýª·íõºÿöþ±k'’,êMÃ= P=2nÊååå§4¯»Åå¶A8É”SŒüRÚéÀУ6`YžÁóÃÓç‡Ç§E­ß.[oÍÄa)c ÀÌLÆD9ɰsNîÖUÛ{Òˆ‰–T¦­iÝ›kF,–4•ôò´œKº½½?>}úØúåµ©ŽƒèȈº»;;DpN¢5Ž£„8*ƒ nŽ# w6ž©ßgb0Dœæ‰I˜cY\CÍ%Ð#4‚À,"l”ô†þ;"b HÙ w=j½î„ÀûÞÌœ™Ì´w몣Çt¯‡G3s¨¶ã Iüü|þ㾜@L,ÂJìc6CŠ„^kwõŠ-)žqŒ#1¦9¥’–UëѶm×®èµé^ÛQÛq˜¶ðpÇînáèAwc30áÕLD4¬aw92!ú˜yƒNƒ â ÂÃð¨a½é¾Wp@””&I’ÖyéÕwïÔÒ€q˜›¼õL—ËþqÙ‡Ãx<¸¬»Ž ‚™á<•Ó2g¡^ÕŽÖ¬е§($âçOŸÔúÛë·~˜H*’¨›Û¸ß鸃¸ß¹«€ã1@¢”“DìÇ-BÓtÊeAàc«[·R¦ç§çíòzôÖ:ô°#Æ„HH"T˜JºY„iëµµ®u´·û À˜™ª©C2A ¸¹G8âÝ;Ú(¨„G€›)’ZjJz:ó¶—Û&ßyÎñåQ×¾” uÛkÌ%Ÿž’äT&̹ÌÓ)ó"$ Áäˆnîs™Î'Ës´½îûM¯"yffs;zWõ£é]攥ªUÕ­àGÛµ7õ” `@pD Àè©ØéÔ!–K‚@èn T”D<‚ Á!º9‚‡š[w3ˆ bb²h]ƒ‡e(Ð19 j€9c$E?‚Íݸ3L 2i¸›ƒR8˜®;†d@B2Ä`öD˜%GÆ®>´hÜ¢Lé„ÕqSZ4„q.éq)`gvóÑne&çáëŸSªÝl´ÄÌvS·.Â˲03˜Áˆs0"‚1±aŒÐ±Fï; Á/†GêjC>½ÛH ™›ih7Õ¡»3…Ðgl9~@FC(0 ‘h|šM%/KI)õn·ëá–˜Àu8{SD´¦fÞšû¡]‰$‚Ü#ÝÃÌÆ&M|!1‰9Ì|(ɳgv§q7#ƒåyˆ…ú¡lP2‡Þ 1žÍ¦£Òí*Û!€%§D€ÚÉʬ¦}_¦œXÔ®`Œ>åÄ$ª&„)SÉff’°p!ž{[T±÷ŽÒ×Å—Lë”<»‚’PGdljî݃!y z@ôq½bFpŒîæm¤p”‰r™Ó¼"³™M¥0@Ýwkê­G­m·~ðN©L9'„èMk«µ×®HFA< ¡yë-H½Wõð0íÁ„ˆÑÍZïªÊƒº7þsæjª]“¤Y˜GñŽˆ§œç”òy]ŸÎ'föá¿I Ú¶9 w­f­û~Û[ÓùôxЇPÓÞMÑ£QÐiYO/_^NO'@ïµ·Ú`Ð’›öÚZ­ÛíòÞnå’€Á”¬õ0G D«m¿^>n—ã¶ioÄPÁ«¡ª0 Oà`êC»A)q)¹””§4MEzŒKfD$&f ‚@b4ve#©à]$ %¾úrŽôÿ—Ü\ÕT]Æ8BÈÔ"ƸôNÉ ¤„ˆÈã wµÛÞœ‘êÑÍ, %¡\ò²L)¥”RÎ [íµÖˆ`¢¿gÕ%ñ²Lóœ§"Ãl6ô_„¤} ت©JJÓ\H¸µvìxd‘y™¦yYF‘À0$ÔdsצÖí>;ôP·Úûm«õpUs¯]Umħ‰a윜˜î=ÈÁ˜5 ©vp7U5íz¯PFm°÷nVïQ7õ×÷ë_ýFDGÕëM·­­jxüˆ"’˜u5‡fŒˆ·­½¿o]ïRTvsUßÍ%‹€kà£êõýÒ÷Y 1p–2ñm«áx>æiºÜö¦·‹PUÕ®Ž<ò¹wIMÁ‘Lv5ˆ­U êvg+6ƒ²œÎË’Cw·„thŠ$˜…sâ,9ÑÜ+5«µõ£nf5<ÐLÝÕCCуp\,€’0'æÄ «wàJ$½s÷èæÊÔ˜a^&ÃÓÞüzkgÁÏSœŠ&†ËAó4}:ÿü»—Ë­ÛN €d€ÍT5(€"bïý8¶ˆWÆ@SíDZïGëe:=?YÊ¢nÍZD¤”æ¹ÌÓ”§BL'Æ`ïýýòq´c?öÖª°ôÛvóîM£™ˆ3c*@@œê4‘`¸a×4ÑÄ…’jׯìLan·£ÆÇõv«M¡¹:bÉ@9ZßZ;³ä3b1 ˆ`  h]3ÅÄ{FcÔè`7‚=Á:cf³p òÈ4&u€ŒÂYxBÀÄÑ mÊyÎ ’¨Y ×oÇå¶ï=ga—u_Nû æ™Òã‰Ö¹ÔÞÀQÜ£™šú® ¡C„0OSVU·D‡è¦àErÎÃÈSžãÞó5mÊ¡Žspð 6D„±0³1Úq ”Ðév·¦¡ˆ B8¤éc³7>(€‘”ÝÄV€FŸ‰ '9-óÃé4M“Ô£ç$)KJi]IÞ›jÓÚ´V;ªm[mý0§^͆òÌÆ(ŒUÃÌE¤N‰€‘<ÀM;D.e<;ˆÍ€•(l(@!ÂÈ|”’bÌ}G¢É-ºâqDV•Úx;ÒÞ³RbÇÐØûáVM·¹Vxyé§%DJN S&4ç"âc7Ø#Àƒ‹Æ²õ HOS)vZlÉÌà`‡¹"2%$wBÌL ã" !ĉioàjhU #ç¤à†rÉë*$I ¥Ò]ßÞÞúQ‹ˆ©ºùÀÊ›‡iCæ,‰‘ÁÐZ½}ý^{—”R.à½êø-Ç@ˆ@hëÕÜm VÆÑ(p0žJJÚ ™‘~”ÆÒ”>MË©”©ä©¤$÷:b¨ö¾«ª…Vk·zìÇvl·^7 ba^Wb—x|xúå§ß?z^O VÕ××ïà(œ‘H»mG=jkµ÷v³vàœJÖírùxÓ¦¡è}?®ÛíÚ¶Ck°”P bÁ¨¨DBƒe§½k?PÄ1S™ƒlï‡5C‘âÄ®€LB’k×ÞÆ ©1xIúð8!Ïi>™í¯¿ý[YLà´Òº®s8ÕÖÃ-IZ×UÕ´  Ü´îê%0e佺b€«•§2A@ÓØw¿^ŽãýFaÌÐ\o·K{o[CÇ<—õñ¼–Ÿ^RæR’ššÇ¼œ³Lšäñ<«5µ )áZ÷«öí¨õpmúzÝþóíêvëÛõÏĉ§×Ëqkú‡ÿòÿ÷ÿù}~yiÝnû~Ô–óô/ÿüOÿô¿ýó¥Å×M¿ßêÇë+k}^„A?n_[ž&ð0ÆLIS JÈŒ¸ˆ<žÏÁr9G<ÕÚ{¿ÎËyýôtN¦íý½ºÍ)Ýz½l[¿5–$h ¦·ºï·‹ªö}‹Þ@I9çóÃã㲄;œ>½Ì§5 ¦yþôò…™ ¨œ‰Ó±mû¶×£R;C['€i*"’„…p„Ì!\,NÄ8&§Ôƒœ%—‰p%UÓa rF)ªøp^ÿðóO_¾üœËòñ~yýö›VOÓ|zxz|zžÖsUü1R„ªõðHû®G¤TNçðÙ K‡„ŽÖ!œ™  fUpóÞ\ëa9%¤1"š¦išÓÂF@Ä@Y2pÇVkMÝRʘRB"3÷dÞ/»{šÎ/ó?Êã§£mGßoý¶·½©š¸»r¸01À}&E€‚È÷Ù”[h¯¦£¹wC$@0ºE Ã,žÚÀc‡£ÛýÞŽaHf„à4Ju÷r2þ=ò€êP;øîˆÞ»B82Ó:—ói]Ö9çÄÂîq¹\?Þ½·>¨Å?žˆˆpÔv½ÜJ¢y™D‘D!Sm½·mÛ?.7@Ÿ´Ñj³n° æÔÍÕ ˆÆ=êÇkãj†`½ûu;ºkÎ’K9ڱË& Ð7v W­moªÝ©)æ’óãCɉµõ­¶›ƒ¹‡z4µn& )“`cJœ# i° õª·ëv} @>µö‡ßýòðü|Zú9ˆº5ÓmJô°žrZºávÔÖUM»µýغ»¶ˆ1Š G¦4´@ÃlLž2ÎEæRæ2g™Ôì½¾*€Ví f8}Î2 OíÂŒ†çÌœ%Ö¹œ—9sF¬Rfbúدßßߺƒ€b¸¨óm¯·ÛÅê-úæ®Íbï^=Îë?t\~6C‹=¥x<㺬)@Ro†‡ãÑaÛõr=¶½VUåεU×pu3WÓË™J…èb¸{,K™EÕˆRN, ä%12K:Zõ¶‡xïÍ™zDm¶yôÀ"<›‚jE;¨@5n ‰a3?’ò,4S6õVµÖ^÷ÖÍÇØÂT8¥"”ˆ ’pzw 0ཎ{ÿÌÄ÷ÁÕïSg&dbD¦ûå6‰1"2QN)‰¸;"zxk}?ÚQußÛv´ˆAž…aö&÷èÝÀ}šRÉ hÈ ÂÍURJÓœ“$„¦ä ˆ÷%´×­†Ùà†»ß÷w©jê-Õ6 æY-GPjˆºiïf}ä§Ü<1,s!X{ÏÍÉA<Ò­6Sssëš19iðÞ…zäœn ׄ#¥²{ æœÐz€‘ “#8$Ì)qf€Ð®V»éÑÜÕ K*Óco.€ œÞ&½+…'–$é4-Þ¿_.w„2¦u o„Xh½öcsmæýõ8ž¶}ïݬ‘·)S³nÈ0ó²üáŸþËûç9N¦}ÝnÛmÛ÷*’R ;Žúüúúr]kkaGB?O Ô¶µ¶ïûÚö†î¦ÖÌš™Yw×a½¤Rò”ËÌ©”™§¥ŒÂȉ27ÕÖú˜Ê!2f‘ÄBè‚£ƒOŒ) AX«¡É]Õ»YsoaÝ-¬ƒ…»ƒ¡#bÐh´#©¶Ö+1r9»ãÚT+ ƒ»ç2s^PÁk ׿´`ž{·Úëú°P™¥\î§Ëœ—Ûíu_ŸÃ·²\Ñô˜9góœ3̤¦­åTÈæÔÖ—º¯Gk  @€ê ‘&NÀXú~µ~}üøx«Óãí~)¿áQ¯ûÌ»µ]·Çæ„~è&˜%‘¢ìGkÐ <«½;ß-Ën"´b{º®ÄqŸÓIHZm®-ܨuŒÛíõÚµ`’n­Yð$¼5¯J €ê~í-IúôÃ?ÿÃ?‹ve¢ÞêÞUͧ“'kÛýÚöƒáx¸íÚ§©„Yw‰`óì¥d!Ý=Â18Oe.Ë»ó'ì$ßÖ[ïéçßýüÏÿüïîL]ÕŸ_‚-å$åT{ØmcðOï.e*­ÙÓóöõiýíuUÓ÷ç<2:vkFf¡nþÆŽÚ¬Ûn®­5U÷1m@ó弜NS*Er’!´á¿!Tu^;’ˆ¤ä¨aàÚ|ß»‡Ia2sËån¹s‹ÐO/Ûoß^n[õ€O‰~þíû1 €Á¨èm€âFTè{(ßXyDÄÌàÝ»Z`8˜t„ ›0!ŒèÅØ#¼ ‚Â1€ è L:b³HŒ:œƒäÌ4•|>ÏóTBjˆîFó$ó4FëÍ̉IFußf‡ô¦"@b"äˆKï­kW³zôc¯û^÷ã¸mǺuÕVÍÕ\û[ÏLÝšú€ˆ“G¸Ãâ0‘™Fóc¬’k7G×0‡(I0ÐG¢›6}Ó1‡¹Ym¤¾H‘Ó¹fëGóýµ›"2`ÙŽÕôØŽÚ½Z434 cDÀo™ IDAT:BBAd'è­m÷pÄv6·f­#p`žrJLï>¼çÄG­yšºÖu}^ ¿{x(ùÔZ”õ@á×íy_îèN#Ñæ„ L†Ü:˜:R¤‚Ë$—e¾,çe¾ ȺÝn}Lp™ S¢2K>Í9Oôó»ìý R„ƒ!K±ËBDmÝ»ÇJIœøó·õ×/¿¸Õ„Ôt-{OG3ò6áÁ~4³›ÒêâH^÷e}éþ^5«Þæ²±ÜM3ÆÚÕûÞnÛq]×××ëõuݪ¶D„ÞtíÇøîX?BkÉùÔ×ÍA%3Kz|)K¹,Ó›9%Dr!ÉTÄÌlS&vó­A„EErʪjÕ´š‹BxßzwO‰!({cTÏ©ïá‡0b¢@T3¯½ISQ¢ó9Ÿæa!ä\ 9L›i3甓ƒzDï¥Bh¯7ÕuSNS™çœ2°ÍAw«­·ÖÃ!Ü‰È A݆l×ÔQ&N9áºm½5`IÓ4-ËœR"ŠqgX·}Ý*"1S™dYJbîM7€Zù?“0fª»²0Ÿ—r9§Ág꣈>¸Êc\0‚@Hˆ€>Š'ãßßõº‰YB»öÖbÎeɧÓT²˜Ù¶Õëz´n£t´þz;Öµ«Òhl‡ÃѺwU횘ÑÃÀ‘‚X¸9—yžLC5Üb^ƒ€H aTBGp¼ äC]®Ð,u Jˆì1`‘8H9(D)1Í–é»®×n¦Û꽥ǡµê› ‚˜a7cîÉÉ_­>«÷ªZÕB¬’ÕÍ)µà JŒ…«R.¥Œti·Þ«j@"°ÚÔ-M“0¦fµÐv´¾$êóÌDÝlï-ìïÈNsU3%FL¬¦L‰Â ÔÆe«·jDÙÇ»@Ø­µ0@ ddBäàî‘$e.S*…9LU›ÏÞºi·)ÉT–Ór:ŸïRžÃ±‡¢;ƒÓˆ­: ö¶m7=Öß[¯µ+"³0zM¯û>%A„ËåòþãŸ>ýT¦¹÷¾¯·}ßÁ 猄áÝZ[_^ž~{|¾íÝ\P—„«ùv[­ïÚ×~¬ÞêÐO:12ªJ.ižä´”yšÑÅÁ­nm»Q™–iZ @-ÌÜ r┓ˆ 6gˆB °Î ƒÂ9:’AŒ±72ç‰"Ɔ–Dl4tˆA-¶#ž_z;ú”ürΧsNeBL¤Ö*‹Jfïv5CYNËçåá'"Ê`q4"$§‚è!Â@ÎÁ”J¢eÞ…ü¨µ÷ê AÉ씰ÔZµ7w‡ð\òù,©àôÃO¿ÿ‡ßý¤uûõ׿½~;®ÓYæÓu?Ÿ™é|ZRJCdËBZy™?þüÓtߺIÊÛÑ!'<^¾ÖëS)å§Ÿ´ö·Ço·p‹Ø^¾ýåßþŸ3Bžs{}„~¬//ÿëõñÛߦýè/kuN±¯ûóãM+ òR2…axfä¡ Ih­îÛsïçË¥DY’Íôñ‡§Óé’Óí·/Ï_~±ÖlÌ´‰ ]'òà ¨¹>Lão”ADâ´uÿöüï?ü|¾Ì÷jŽ¢Â´µ}‡hÇ^^Ÿ»ðöò­×›€ 9DX×~xïhÝ·Ô0œÂ óD$ˆpkÖˆ§i–’n®ˆÓ)OrNŠÐ×ßzÀïÿñ¿~üôF»Ý÷ã0@)ór>ͧ‹9Eï"ÉÜ™9•  ÂLÁYÒ”ÉÔ0!¯Þ·cSõÖ»‡•¤©«ê€æ¥D‰y.9gé>’"oóX5&hÀž ¥”9ÂbØ®Ô}Ô ˆÂ"ºÐ@Ñboºï‡‚ÍËr¾œ‰èØ·ºcê—Sš²š™ €t`Ðà@I¢ž­wSýO`öwUÎü~<µJî›QòûÐA¾Ëà{äúâû]žû¢ï#ÿÖŽDÆ·½¸!@€0Kh­™i×,$JYD€˜÷C™»y¸yÝûíVêIdšJFBG&9_–ûí|[«ùV[Û÷ –åÄœÀÝÝz¡L³Ñâ2W÷1¢+INË4O™‰À‘ ´[;zWTõÖÔÜÑÜ< žeäJ5‹AQ 'Bzs£wíÚÁpžçÓrfÕff½›vëêµëºÕ——Û/Ÿ¿õ¯O­vµî1z<úàßá#Ó Îü½11nÌhÐH ‰»Úhôæ) ±PÊ,‘RAV½ˆ’ %–dî^{_¯×¦ÍÝ8ƒÜ)`µ‰hFBµ5Ý~¸9áè5D€#$‘ÓTJÉe^îEæZ!bÛ=–óå2Ï— ¡htd ÀPW #DI(z4UíÝÑqp #´[«FNRî/§‡óýR."¥µ®f½R"RN2Y2¥Âù~¹ûñãýýeN¥Ÿë‘_÷c[D’.‰ôîúº^×k•Ççëz= 6ë6WŸdÉ&,èx4J.È„¼>½>¾ÜÎ Æ—ÓüŒ2uÿŠÃöztë۱ߎ½…¡’SkªÝAD1[I!Sæ<õ¶÷ÞµQÙt¢6O­äaQR)YRŠhx™Xx.Ír­AóÃ@ $á›cÔs u0&d€¾¤é\‘Ùàtq­û˵¥oO€ä8h"œ3%v@shy*)Ë»ûó”Å,ZpPB¤@’y>§4Ÿq;ôõºCØét^–„«v$"!óhÝE¬0s’pÇð°ðÖÆÙgæÖ•©¦¦ í¨ƒ¨€ØÝ!¥œ’QÎišJ–t`FÌ,§yšJÒ¦‰A x«­»K Ú­€7ÂÀ2¥Óy1‹ëõ¸^Û^Âb EˆH„FÖÙ-ÜÁÌõÍ ˆŒÈD’‹$„p7wUEŒóyº83ÁÓóþzÛ®·ÚºÀm?^®ÛºÕ@`Nãf2ÐÌo#$Î)§”„aˆÓ„YŠ”$Ó”æyFâmß÷ÚÍ#ñ[×HûàÀŽËË0›áßk®Ú[W0 àDLÀî Þm(Â&6aHI–¹”‚½¶¯"t?È HL½õè>fâÆf¡s9¦Z·ýH¸‘îVÍ ˜™!\{5; ¥Üz¸k!D7",f9sØð€PšrJºÕí@”y:¦³H©] Á™ÆZA„jo·mp¯ûÚÛÁ„Ì ŠÐ%Íù„°»k' ¦$ìꦭj7$ÌYP˜$gá"S#Êè¦Ó”æÄe’Ì·Ûë¶W $@ó|¹œÎçå<—¹Ì'¤ìÀ΂Œ8|`Ç‹ˆfv´È"iTØÂTa=*ðuNr9~xÿáçŸ~W¦åº®½½à!,ØûQµ·×§/_^_ŽÀ"´Úz·¾‘ï`;¹sÊ‚4Ü1À€|:ÏË’DPÍÕ̵ë±ïûæ(§Ë»Ëå¾¥ êðV·erŠa«qaN)W‰<:D#!  vŒ0DS×Zu?šH’Ln5|DÈ"À‡­=¼Õ}½5k=zܶ-‘|øøçùØÕþ¿ynÖG¯!焼ÔãÔ»!3ç3r€Ä§ËûÌ(œ4ØÔ[ïy¢”§a‚ &f G—ÞwÚWTµ¦a†fV›ûN B¨ÛxÑÒ[ß·½!e  ™Ó%ƒ q0]m}ùöøíë~ÛƒŸ]¦[×Û¶—"‚ÀË ÄÇ®Ï_¿BÄý§þñÿ—OïÎ"ø‡úíºó´üðéý׿üñ_ÿÏÿ£;—J¡,e.aj}ýãÿõ·ÏŸSâé|zÿóï¦ïÿôoÿã_ÿû€§Xf5oêÈéáá|šçív;ŽƒXº{¸çRÞ-K¦R‚…÷çÛfDï>}øéîâùó¯OŸyúò™¤äxë{ð”xF†VµuÃfdsïª.ÄÐÃ)ÉI!òén¹ÜsÊ€NœR–‹àO×/_·oß¾Ý^öºø$’"B5AÂn½roÉ»QDB" ³è½m]_*ÈÝýù|‰$u]™;õ®Hôpž~÷ãûîX„×uí}Û·ÝÃSJ9ç?¼»—8¹õˆànΔOçüS9-¦m(%P1=m·öz;ZwU2sS2(÷·Ã“Ø0 åè_æ¶nûZ¹j%Nïî`[ãhZÝy€¶Âý͇H˜§ˆ°[?„ïÓÿ1ÈxM¸C0Ž£AÅM~«Óønlµƒ=Þ(úñýjAð†ßw³Ó ¨… sxôÁç°·4“»'IRFÜcQ¶]¿=ÞþöË·ˆøôñþ|ž™qàö…q™¦ûË)íÇÞÚ¦FÌD”³¡ªumûV{Wfºœ§©¤´7g¤·u¡ÉˆßI àá–% ›šjü'\ "Tí¨mt¨’dÊBˆÈ(”pšiô\×G™s<~{¹ÞâhÖÔýMâ8þË·ÍQŒÅ+3ˆ » ¡Ú€‹ŽŒA`kíhªfZË22!y¸£”õÀç§êQ%…ˆyýüèÏ×lЧr—[;ÜÅOiÌÕAÑ‘8E C²ÐýévÛÚtžç—ÎO~—½KÝÁƒ‚x×¾õF‰KÓU½ b£À$ °#¸5 àDáŠêÐÛ±kŸr"m–8ŸOË4³zt; sž¸PŠy–;O[£×­®Ì€‘(h4“EðIpbœcœº-·–žÖ~ÛÜö•ô†FR–óùA–9'·0 m¾îýõºë” ¤“8’¤,‘gUÆ|šgÚÃ]%ÏB¶­×v)'"27F˜JêDnè­÷C8|uÜÍ)¢F€0˜ÛPãy8’¦£Á›ò§©Üß_ˆÙÔ™ IDL„9-À¬ÁÌÀŒÇ°@(J¡iJÃÜ;´nªð& &"„Þ­«uµ‘ÖÁDZ¥q#g÷”R.yšòù4Ísyy¹~ùúôíñÖÕÜ­µÞŸ_ëí8š±Ëxê‹C$fÈyV…ÜÕ\¿_u¦œ„M½«nûÑÔ(L£WmÕšº¾Æ4bKøÝPö&~D$,×0Dê5pVΑ'J€tT½]á8NÂs’%˜CÁÁÀJ"¯ÕÜ<˜0säÔVóƒ¹uLj7S''ïaÑ‘;ÒwžU€!™#„ê®­§Œ,HÄ)—œNsÉsh”T™øþþár÷€Ä\›ôînŠä‰k«£f3ôf¶·J™SXd¦D9°™×P ¢RISkµÆŽÐ™YJ¡$Â4±$Êã×+Ð#å’Ó >T׎,eZÆqL,Ó¼ÜÝÝO甲 °H.³$A BïÇz}~ªÇŽÀHljà€æîˆ@˜  ;D–2ßß?œÏ€8Žª½…›©õz´ckÇ­ëúòøòôX÷Š”X2**¢tUð*XzBgz3Í1ͳ„£ QPÛûVUCÈÚª­MÊr@4"ó0 Á~€ÞP[Ê’g&z«Ñ#Ù[ûG·bÜNûÐj„2:¸+tEF"]°#Q›–hà/ÛÖ¶¤Í8¡)ºÂ˜áÕÖ¡ZPá4¡©ÖŽM‹Ä]¯¼¶ ‘4.w§åÌ$­kw4ÕO¹3Ôœª…‡+sš$ÏS`÷VëÍ›ií)“n‡ýZPæ ‚óùT:š’™Ô´îOß¾íuÕ^#ÍÓ)×ÚŽ}À©HJÁ"ga¦ëëíññåykR2üð1z÷Ög¡wïþù¿üáÓ2­_û¿üù_ùìàIøtZŽõºÕ­zܺ’c9º^Þ½ƒ”oÚÚe™X €ÀÂ’½·Z«r@"9Oóå|žë2!§ËÃCã¼ÅžËüðîa–øú×ÿï׿þõØo¹”)ñ2åpïÝ)3grWo¡1¤I6 0  æørÿþþÇù݇÷ww÷‘˜Ôt[o=ìîþ>õþ—Ï{~ú¦¡)%’Ђèî –Ã& $ ÜMÛøŒ’å|ÓIi¬ûVò4/r¹+<ßnÛúüåõ)¸ä<•ÓÝ…˜…ÓýÝý»÷÷ˆP÷íØ­w”Aq˜ W¯,2BÂ` ”$rF ô솇*À*BÌ”IH0€-P ÃCÔ£k ‚²w„‚œyæŒ,I%IÅcQuï)œ<„€Y:†0á‰2[ó§«{®Ý{÷bQ¸ÌsâäÁ”RÇRV£^ió9hßû}B1`aL4îˆ#,L4¥´LÉíx~^#/9'yuH™dJ)1S ª™ª#’ ’ˆ¿ b{3EPíãÜò€Ú|o½.‰æ©ä\˜ ¤ddãz¾ïGmÍ,´Gmæ`"8€]„y¾k¤úkmd6P91\-ˆ1Zõ½Yënö–­ôz¢©¶Þ"˜“p.ùtš—¥0Ñíºþõ¯¿þñO»íšÓDZ_×uÛ¬v°€ @ÁÐ80Gg— Àm˜À ÞëÞ{«M»Z7ïcƒÐUݬµÞºõ7òó[ùï‹]¶oâ\l ‚ÐÍzXD 'Ä┨L’3!†ZˆÜÏç)Ibp³nÐÍû±×óŒÓ̇õ­¢d†Lž(XœÉxœ_DŒ‘’x*®èHM"8ƒ= ·-Œ1/œO”²äRR^ÊÄSòÙ0å<ôk„(D¦êáHHÌÝM½›÷”8“d’œI¡???íG›çK)‚B€Âª4”z‰’ ç’r„rìÄÂ\F1ÀøÉa,Ç=EÒwwÓ4•iáœYR™æy^r)Ä‚ö}uŒªÇVÛ×ç§Ûm% "Ià FÈÝÅ1§¼,3—¹,§Óýryw÷0•¥÷ÞuäËZ;Žm]_Û¯ÏÐv¯û±Þì$‚Ѭ`@˜ Œ123#Fx77’ˆ$}¯VÉöCksFŸ9²0Q?ÚµD0d.Ó `€¦Üè0³iî-…vFI"Œã3®Ú޽×]ÛáIƶ‡«2ƒk 0æBI( 2é„AÚ;ô™SÖ­»5s" v‡¶-OÀœ¡·ºí×õ8ö¯DÏ9î/ÓéœraJ™8O `. Ñ<:€gN‚Èä†^¦ÓåÎÝê~3wÜV ‚~ëõØ[/çóÃûæó;ëÍ·ò®Á|Oxîu=Ö£6C.wÉ¡~ûêõ`"Drµëuµ®)§i™Îww·Ãºú·_?×çÇ~ì!ËÉzåv Ót~»NñóOÞÍùùË/þÓ¶LKÂó¯/×õº{ÿy.Ÿ°½öÖÃm?n_¿}þòíÛQwZ$/,Ñ×c4ƇÓsÉçËr.§™çér¹»¿ÜÏeŽðu½‘ÙXœ^_^^~ûòëþú8Q°šµúáîòé|}[×—#ÜÆ< #ÄèÀ3‚u5C²T"UAÔÞÔ#ϧ‰ü0µ(¹Lsbt«îj@”£{S€ðÄä‘zCÐ.ªÌÌC‰æ©äR ¶Þ{×ð@BƒA‰ƒÇy:ø{áŽFž¢ € ™ºíËìçr2ãº÷}Û0å”h¤ˆÁÁÕ;t™™p*¥ýúúÒë~÷ððîã§óÝå\Õ­¥4¥²,çûež±÷C# #ó(.€"§Tœ“b7LsZî(M¡æ:‘—<Íe™ç³e‹”0´šºù‡Óù2å×Ûë¯OOצ2]n7Ü·,äëÑ«v<ŽŠ9ÉÏ¿û‰‹Þ—Kb IDAT äQÃnÛo¿~þË¿þÏùôŽÊòþ‡Ÿ?ýøþ~þp¼<>þú+ÉüîÓƒÌ'³háÓÝÝ"€Ì-0Mgàìè‡!@ ”)‘÷¾nJ’ó].Ó|¹{÷î#îûVÍ"Â[Û×ö>õù”Ò$Ò¶¯ÿñù×?þ±½^§œ"Â-P˜QǺ˜Ôâ¡9e'oD"8-±ÜÑ”sNn7¯uÿíßÿúùýñد$èæÖ´ˆ§fVÍ=0’°·JªÉM0ÂÔÐ[àFpÎËùôéÃùá½²4”ùîáþþn™%q¿nÛëë­6–S^N§qΦ43’Elõ­Ûv{~~¹­Çº÷ç«>¯¸õ¤Ý2ïOõ®Tëõõ×:w4…|ÝÛÖÜÑ !DXˆa”ÙXà¨ýåº3$3Ám½½\É’3ÏS9ïji;ˆ0JÎ÷—ËiA6ìo(y”Ì©$ƒhÕÁQ»¹›öªÇÑÚqÔ5à´,§óéüé‡÷?ߎ뺭۶oÛ±Ç^o{åÞÕÝÛÑU Б‚€ümƒfÀ"„DàF>äö€cgŒ€ C\úö@oßpxaÀ 4Ž4ћѾÆÌ$"é4M¨aÀŒ’ˆy”D1e:Ë f‘Ü[。 ·14ÕÚmÝêùÔ™P»ï[­­9˜ºªµ^ÝL58åœSíG×®L H€á-Y2ìàk·Ú4ÉÌ# ’Z= Y—iÁœJ¸µÞ˜u0³Bi <£õ^[1B7Ÿ5p¤2‚ÖÜíhMkS±¼s¤z˜* 2cb¶bçÓt:MÌlîªÞºÖnj¡µ÷¦]Þø» £Iû6ð¡ !X–üîáT«ͧiš3€oë¾ï×_¿¼üö´w%@j]ÍýhÞŒks/À%ÁpZS84ëJoAJ$‚Œ„ì¦Î‚¹dbé{Ó6ÐðvPÿ.¾‘ÂÞÂoe 8Z3µÌ>ç!«Öd$aAæ@°ÐÞ£ÖÐc9(n;fíaÖæ,S‚÷95JáiÛíhÞ?þr~~àûÏ÷Ÿ¿ÿþóÛï·÷7LÉN’*–èãýï×··­-§ç§O_ÔáçÏ7ayþô\Ú¾õ¦ Îsö]gÊùùù崜̬YΧ§Ï_8%B|yºä’›†K’ׯ¿÷·ŸB´¸n¿ÿ÷?Þ~Þ¯Wkíi9å*Ž€éˆƒA˜›¹G`3؆;Ðå|ºÔBc‡>…¸œÏôôi–SGŸc»¿Þî÷ëûå¼ú~{ýoÿUÿø}E%E¶H€Ža‘EÔáè€)êDF‰@#t `‘|âõ)O|~âÓ™SZ¤<=:ŸOBDsŽ÷Ûö~̉R_–¥¤Ä}NÕÁ©¦\YXŠä̳ž÷ßÿ¸Ý{‡?Þüç£ ?›Ï¯Y·|½ëÛ#_umclÛ޷ɈÀ„ØY"‹ 8¸šJ" P€!,9I†\$g–ÄmŸK-’kN%aê>Õ÷}gBÌ"µäBv(q!1??­¹P­r9Õðx~9ŸNU„½äTËåùyií¼mûýö¸Ý¶rß­÷1u(Î9øoEü™æÁƒDj…I$„š›ìˆ?/ pˆ ÀÜ=nòáî û~¼…—¯ã‚>æoÇ4€“HÎ9åìè|5SÕ#è‹€îð'œ3ÂÍL'C$)µVbÌ)™yë=g!æDœòL‰§0’þÙ5p5몀DÛ¶‡³˜»™¦DÌ Qtª›‘©ËR—ÖÚÜÛ¸Þ„ðx´ÛõþØjŽÄˆìî:Â#ˆS9Âaî¨3¦Ï@`¦”…%å$$Íéc)jÓÔC$ÕRR„ÍÑ=<ÂWƧKýíï_Ô,€¾ùëãöP›G}ý¨3€`„»«éœ#éOÈI€# ¡1yD:4Ô`ôÙ¶6ÛðiÄAÅCóÖF<¯"¹[ìÂYN53§Ì€®ªŒ‘»ê„iÌG?Â"ÑÕ[¨«‚”\j.4gpN¬`·íAlsè¹.O_.Ÿ?RÉmÆëõñýÇ·Çõõíý¦Ó@’”’]G¨ "¶½µ>=ÂãpP,5§ÌU#‘ äÓš4ºzÈš ‚íÛ ½·}{ÛFO)ç«#®ß_oÿøöõß~ÿ·ïo¯$’¢ˆF(œVÀ¥RÊs¨êŽà€, ˜™<1Ž@!|™óóu/tdÔO Ï{K;h,0/i,KgA¦}ÎvpÕ'’ð!Âü ó&„˜‚(% Ü4À YKáAôØÕ,¸k[h79kN– *,ˆbÎ#b€Ÿ}ö˜e]‘8/Û)í¹ßëY)Ñ©”çRž!É­µ÷}Þ‡õì((¸0ŠHNKÎ9¥` ðžˆ8•óùòùyY³² &*8`*2…€»ƒ˜3! š›™"rø±ÊóÃy‡|HÁlÎ9Æ<ÂEˆˆGø#§¼ÔºäDŒ}Î}ŸcÚÊaêlíPƒ„zÌ †èÜŽ¾HÊÉ=æÔéNœ˜bÚ˜jcèÔ8‚ýxœfAöpñãQ1ÁRäÓËé/¿<§”Æ4 Z–²êm\÷ö~m¯×¡Î,õÀ«º*Z$õ0Ua‹ø`ûñŸÔšC1zø’ %‚rÉ) ƒeÁœ2Û4k>§" ÃaÅô?ŠYY¢>ó‡ØÌ!ZÓ·[sÕçS]Kõ3C¤$œÔA5hš·amëÖ•BÖ —¼/µ¥866>M.Ëós•Ïe_ä~–l·ýÑ­Mr`DaÄÙ3T§™0@±ð˜0g„Åt˜FÀÈ ó9—’‹£ÌÀL’«äðc áÔ¡:"Ãóñ> ÕIÕtk­·qd¡ ȇ’za¶Ùî‡ _>çåR–KJÂSûœó}# %Ià a€Ä¹–º,Ì‚)•RÖº,µ.µÜ˜YD$aDoÛûõíþ¸Ý®ï¯?~ÜÞ®àADî&Dç²øÁ{R#€\s–€D®¥–zI©#¨Ûc»¥œOO§º ½]ßß~üÜo›MïSc¶"$L ð”EPÛí5û^ЩJb‹9C§ÏŽf‚PWñÌÁ" Ò‡»R8)%¬ÙRl1ï¬ä’L‡£"OE  ÀÁ̘3 A8’#N›:‡»ƒ[x¨Ù ƒÑ§Z`b NÇÈèµ#¡¤Ä ˆ)%FQ÷°iŠÀŒ”]¢µ­=6݆ÐZ@:ø[†’ ‰Ð±–ví­'šü—Ï'£çç¿þýóßÿiyzžßFüè:˜e]Wýq»9©?QZÎçR²£ïÂcŒ÷ûnA®6¶½ß7³L R/êæíúó¶õTm/CçûýžRÞòS_|S/¿þJäã|¹L‘ñ¸9X. „1ÌT§¶æá²T9_jN—Ï¿dN6æÞÚùåùÿøÏÿi=?]¯÷÷¯_ohDÀ’Qgh …x¤%ÆmÛûcƒ€`>uì³5ŠS"¹\žêzʵ% ·¾ÝÇýǹüòò—_=­ô\å½à|ýv¿n?¿Ý~~wÄÓùyYWD›-5°ÍÞG&ΜÒ)q&F×Î:8¬P^êš/϶œ7µý~ý÷›MS·ûû|û9®ï/B§T ÁD鯻†™æ”Râ6MçÔ©0ØtâÈ/õ²¬çÓ3×1‹²œÖói=­µ€i×0‹mÛßoUËù”—fLçpÈ©P’R¤–4[»?¶ëí±ï]#»g‹Õèl¾O} UPm{{»Ã¥Cîû6šw¨ =¦: ¤ý2»yoî)3 i˜ªRb)‰–šøÀml€u)‹A Ê9ÄãÑÛ¶‹Ô\ÇÔ4øC2ˆA‰(_NçÓòË—OKJÌan0X8'dJÂp0RIK÷Ǿ=öÐ(à,1‰|ˆÄLk-ĨSÇ43pÿsæå!€ŽÄG‰ Âþì üïÙÿ1òÿúÑ4 B8Ðù BÓ|ªïmªêýÞ¶­·6ÇðãÚáv”â9m‚1jæ§s)5]N50Þ®·_—%åœXRJœ”X‰™"\ݧÛfmëI¶R²$9ò*1G×9ẨÜY 1ôaï×-L[Û·ÖÇ4Ót@Sw3B]=— ¦”q5#‹@bI¦`&& ó9tkcL#¢ºÔ¥–"”rv7D<òµ]á`lÙ!­' ŒD”Ĺ$"6ÓÞµ Só@ @"03S? hv4ä?ˆ1&v³mŒ$é8À$³ˆ`˜éÑSŒ©@ˆäþA2ˆ€À@q@"X«üúùòË/ÏË’ÍB„™¥&Áˆû½ÿøy½ÞZŸÀpè]æðÖ¡2CwˆãûpLëcxÒD6w'„RÒÊ‚ƳäœÃ¦¹í}ª¡>¦b{s3³©q‹ã@3ŸþŸ ‚Æô¾ÏÙzxh…abjcÔŒ“ÂL»ê4˜ª>;éÀ07€S¤,œÐÂ4\ÿúÌ9Ie*kâšdï6ÇPƒƒwð±-qµ@<Ȅ̌† Ác@0/¥&‘Ê|bY%±ˆM@wL’S*¤fΔ —ˆìà‡Üžà£A}L©xjÌ>M ‘JÊKY*‘G†œ<ó—_ÿþ׿þóùôTD¼÷mï-"˜ç,0¶1Lj°œó²žK]" µ@,RjM9ÀTƒ0&Ã|èqt»¾¿~ýýíímÛ÷Ö62-9眇ûG" ÷ÞmN&>ÏIpŒ‰lIFâÓpß·}»Ïa¥žµ¾°Îûë÷?Þ¾#0"Ñ…ãü´ÄvÎPø>ЉN²<­9Bt¶ëÞ "Y’,‰J ÎŒæÉ<Í9·>¤ðó3Æ6o¾ûp% 4‘1€> ê@ÁŒL„"$Çb8üèÇ´0 ·ãΆ˜@8ƒP€ñ¨ü¡¸‡Át"f"wGI „ 3Ì€˜Xt޽u³Èµ”œdA%Õ9‹€²”*h:ÚØwí[bL%å¥.Ï5Uö’§9qJ¾?Þç~mߦº;ˆ”Dœ IJ,Ëér4ºNÕÞǾ?FßR)§ó%qš‡üBU{Ÿ÷k€S==ùõååÌ‘D"Üàårþ¾¿ÿù>kÉë’Á Üs-Ω¨ÂÏ?~€Ç///—óZ.«~CNé·ß~ûõ׿|ýúõß­?îWSC3mí>%%Fë÷Û¶m6ôi]×’Gwïî ‚xËÏ«$†Ûýí¾ww»Ý~öñ€ùÏ uëàç5Ÿpûúöu»ýLÚ>-$(Ö€B$tNÃÖÇ4M%Ëz*µ.u)·Çööú³&‚¥Ô¼¬‘Š!§ òÇ?î×Û—/Ÿ_^žüþïß¿þã2û©–Ä¡ŒD,Ä…ÂP(LlMs&4æ|~®çK>¨VYϘÒÐ Ì©.Ëé\ëî{ۇΡv¿Ý÷m/¹–,ÌÔg3í ~ÌDT÷×Ûóçë?^ßÞGq¨ÝÒ°Ü€FWÓÅÃbÛæ÷7~G0œ€+bps3  Ò­‡©‹BÊhfŠ@†à*J‚AÄN ²9Uƒ’)s2#ZøcßãáH I „¥,©,å²,„I( ñÇÖ7ŽŠnJ)g+Å/!!`X "óLd¢’s’ê½õ1'¥"%%K*}ôéæpÄ|AÎçrPé͈Hè¨zøa ˆãßÁŠ£ȈafŽˆÑˆn÷Í#®·‡ªµ6FŸªáñ1Á ðp7 S'¤ZJ.‚Ï—åÓ§óÓó¹.™ßÞïGvÿA„¥ä½O ¡e-OO+„ñãqÛú¶ Ÿžs S&2µÞÛèÓÔ`öØ÷±wmc¨¹îû¶ía¦|RSª}ªNEÚ;Ý,\r*"Dt CÔL÷>Õö½±ã¥Öš…á0ÅÀ>æcïjµÊ¯ŸŸ>¿<%³xlͦvJðùÓz9×úû/ml{¿?ÚëëíýýÑÆ @ 2ð9uLýÐD"Ó<dab~¿Ý÷Þ÷û~»>ZÓi`îænáú%èÞ_ï$žOåB4\>Ô1×ËRŸPÍö‡Ú€!À”$çc Ï’›™$$¦ºÔ_?}:/‹™>ÚÞÝÛÇÙ]ÝÚÐBè>²Ä/ŸŸ—ZïÛ¶íf|´®ªcßÚ¾»»”r~:©Ž1G¨µm»ßo{ëspJ˜¡’§”<"æÛþ¸ÝÞQ$g©9Ü ¢»û¶m:ýçÛûûíúv}<ºQ&«êKÌ¢@ƒâ ¡Z%¨°yÒÛUæ½ ˆñò˜ee-•šGwǦ&"ú£Ú8Ûá·º~;¿×=’€p0€™wCd! Ö(`]rÌIÖ‰Ìfì“-‰2NŠáNB%Š1(™Æ²œ9S°îh#–>SY$SµµîT»ô £]°VfÓqßýçfßßXãy}’Z(gÊ%S„3éÖºím¶>‰°3äÑtÜîà®Ý戨1º‡™Q^Nõ$a`Þó$DªK©KvW˜C[Ÿ£ Å‘`–dx¸S™˜‰(eNE,æØö9T5ÔƒJ"9tÚÇ1°ã`"Ö&¡#RÌÎJsLݶ1z@†Ã477¤YJkDa8Ò¯¿œŸŸ–mÛo÷Ä9% ÄÛm¼_ûÖÌムqäÖÆðÖ} Ž8âx4%#`Ž:S’º$ž:Ý"‚‰“$bU£Ð1áЃåFèФ0;ò<p¬d áy¨Á€Kɦއÿ¸vsRCDv‡i8ÕÜ0jxQêö~¡SÂ1v²{ ÓB9˜›w˜Í¨þù22€éÖçlÓ ˆ’H‘Ì„† ¬N@RËRr.Ì hºé”˜SbsßÇLe¥Z#@‚rB„˜æÃASNBÇ6)ˆ?}AS³©à†Œëi=—% D’õùù|y.¹’Ïy½¾¿¾¾î½“„Ãh­íMçDv@Þ1ŽÉ¦ZÊRcŒv¤«(lˆ>u´¶iëâ°¦,ŽT“€È¾ï÷­ Й¥N}*ú(˜\-“1Nˆ= wͽÙon2:jŸ5+÷[ñATQˆãTt!Êè—jçâk– 4±$$V\Ói‘½)8$¤¥äºˆ‚y¤ÞyÛ”Å_N!%ŸÇéz ÓpäéìÀHr¼N@8 )úœ>g˜š©‡3€xDΉ “¸(‡G„ÁGT7Ĉ#<:[ CÌæ†6Ã1t b®E˜Yȹ;D !€ìŽšØ„ÁÄ8ˆB !‹ú¸¾}Ýï©=îDÌål²&aí±ÏѦê˜6§…Æýç+®U˜Ùs©Eˆ¼]Eb("#¡KJ%'½?@Û¹æÚÇ"üËç/Cû®jfk)“˜ƒi̹P>×:úAÈe‰tÒIv½Î¾ù~½Ÿ–÷~Û}þ¸¾ÿ·ûw c䥘æív·B0mp¢º&×9ú8Î>3#ŠZÅãT–§Eúýõ½¿Åh÷ëA’G Ç~ÿùÚ¯úè)#Zµ¤7ÁzZèÑFß›H’’™ÉÜmŽpZJ¾ÔËr>ËiÁ Ž:'Ùš˜¤^–²®§He¹?:Ž;qêM¼^5 .…1¡;Ũ˜‚Ä!C|š1†PY"R–˜?~þí?¬ç—47D‘²,œKYWéj£µûíz¿_÷¶6Na³0)h­©š°0g»îíýÇ×ÛíûûãöÇÇ?~è6* µ ·  ·ÝÁ$%NÉò6òÔšñ +qÞäÇ1êjâA¡N)3‡!™ÃºíjJ Aœ9;©a´Ñ7³ZèétyZ–E–’QoýñjŽbˆǪóËR.—óù´æÄ&³0ܦy„Z¨ºM½5È5Õi>-Â!1 å”D’k°0õŒD˜¯K^ÖÒÆœ3Žy7„ËóÓêcÌ>™ˆ8í@wºÌp;æÇ€H|´…ÁÔ݃9˜Lm{´Ñ"™ƒš¹" )}øsóî!Âe•"çZòRÒºæu©uÉjªîsZoƒ‘êRrÎKÕÑGbº\–Ï//D ’†¾õfœÓ²ÖÓy}zZÍüÛ÷×··«›–,µ”>æëûãvoAŒSc‹}`´)€ÜLgôáfá΄ëRž/§Ói)K€©:úl{¿Ž©ªÂ¼.u)‡´ˆ$ ’„Çóþ¸ë÷ëµýõ//ÏψԵ#ƒ¤£´ÏO§ÿø/ÿœry}»ýëý÷¶××Û˜Adæê¦æÇ¸# À0‚…0ÀvÜÜ÷}lûT@>¾ä\;¸~8„4æmo¥ÊÓ¹ää>¦x,œŸNå¼.í¾½ßÜ%eFˆ¬1£;Ð1ÄF.K=ŸÎûËçþí_j]÷½Ý÷mèܶ›=n·Ÿo?ïûþíímYrø$‚µ®çu)K--ïû6MCçcè0S§°9çèmG›Úöíñ¸ï­ëQk¤ƒU¢MÍ"r‘”€ëÝîÝÂs.K…n.c:œXxßo?_ß¾þxûýçëµ5 ɲV&§^<ÜÑÝü1½A¹TuÞvÛwo÷D†Üñ’'¬¯ÍtÀô€ )èÎãA±ÎJe}ÊûʈÚ§9aÓæ¡‰pÅ ó0űØ$p†˜Â=¸Oí}À’³0™{·0Â$âˆ6at¢NÂPzF#l0öS¦†Ð‰oˆ»€ `"*‚KõÓŒbƒHcQÏ{rg>Ÿk³© IDAT®A †Üöf¡SÐßp: ˆD"g0SÕi怂 ‡“Šs½]Õ„SÒ°}Øl@GÄ„ÐçõAt`"$€áöão·@³Œ9'¼¿\¶_>—´ÀÔ YÒ‰ŠN÷0@ œÓtvÈœJ9’HN)s`BG Dõ2µ)gˆÓ˜–2•œ-°)xLRJ΋¤Äè6Õ: Õ’ÖµfÉáá€u=/§ZË…š!Õ¼äE(‹!*@€c¹÷mß÷½«]û´AäÖÛ>zwfª¥Î¥ZÎËét~º\rÉ£÷Þ[8QBÂi®ÓM=Tm2ØÓ¹$æ¶í7UÝ÷­=®°?8l©y2®æï·ûmR¯Y¶à×9 áU<‰!5À1ŠØ)ÅùÌ&edƒg/Âk¥§…?¿Ôu©… ¸Î÷·ÛýQ—üt:=Õ‚h‰0$vHIÓÒð´Ã —äøêýåt^ÔÎë¦ÜAhS¸n:M ™‘‚ÁéP“OÛncº«ƒ¥,ÂÎB©œj0õ¡ÀÂÇ­+<ÌÂ(1»7@×és‚e)àîÓˆ1t©!î¦1Ãg„R0b2†í>²DZ¢\XN&ËÞqkß|vBÌe©ë³:t()϶ÏÑÔ»ÎÑ·ýý†Ì˜ýt©§õ< z÷\—¸ûm¶»ž„‹è»eH¥ž*ˆ:Jd®²+|ÿ·¼þñÇo¿¾¼œKŒ{»Ý¡œK©’—¿üö÷|©××× XsNèªãçýöúxD¢•u™;ŽýÇ×·oèÁL·­ýßÿïÿ÷¯ÿøv>­K¦S*_~ý†_¯×·÷7DÌ%u¤G³}ôÑö¶]MOÏ/ÏËÓç|”Höëûc¦!!’¤œ²ó®!Ĺ$:ª¤$˜J"BÈÂKIÏ— ïml{ë}ê4Œ ?½\N§¥V"x}}ÿãÛ­wüÛ_±Ö¤>N§²Ô†ýas{¾\žÎOöý{–nq´lñÂ=ãè@D}ô@C²=ìŸfa×éx.`Çà£ëA¬ž†s €JE¸”©zý1¶èÆ,‰ÅTÝTÝ,ÐÔL çózyy~ùòòôË/ŸŸ.'§ ê8ôÝÚc¨z›¾é~Ý;‚øRÓ§§§%g ß´©yBv÷iÓ1‚0ݺ¹«…y˜éÔ¡‡$Í݇ét%†RF ×9MÈ<ºu‹TÎLòØoß~¾þß¾ßï93EPRÙˆˆÃb$ JVúV¦É0™•4Ð:¬/u^òONûÞTÙÒÒzšDKŸÓdx"˜•[^3't …˜A P¸¹¢w ´Iî àl“U‰SÎK&ꎆÊ`䚆A8B(ïUŒp¤n¸{Q¼–>'ëµD[Ó`jîÝÝÁÅ‹1ð¹éb˜2Z¡¬ŸžËÛ×»7ë°?úa&ᄎsC¢tz"ažm- a­»¡0 9>A¤beï4­LðcÌîSÇ£µÞ-0ŽçfÇè<˜H¢d$ ©L’% Móíѯï]»"B^O|¹Ô’™ Ý¡é‘ðÃ+ìt`ÍŽ³ÅÃýXGÙmjxP¡y=ÜÃìña²„„€ª®RÓ UI9ñœzZY½Âcn­µæSC¢ÓG+7ÆŒ°@B AULœ$@Ì™SGuïc¶>]é8šbé!Ç÷ @ Ä$G0Ó9çÞM¦§éÉC"ʨ8‚1S†ã‡ ’ˆ1,p·°„CH¾‘¾]Ÿž"çY¨/%—m&Ýa*ê jRä„”wݦ `r e-;jDÁ¹^Òr¦ˆ±ßÇØ$¨R0)ˆ(A&¨sbX‰±Ö|>Ÿ×º•ZÖó²œ*}l¤ÿ”,ïlGœîS‡ÍÝæØÛí~{l÷GÛÚØÝ“›¹¹†x.…(åT–ºœÊ²0 8šÆ fÌDB‚dn:§ÇXJ=3УÝÚãöè½oÙ·Þ/4^–¼œ—-Ðþþ>¶Û¬ïÄ5KI˜P+Ç9×J…@”Eq$W ÈA5Ç’m)\Jp@š˜š¨ÛןÓGZ.e=ÛiqÒFN@Ï·þò߷凿L>?ÞÏÒÏ…3;ŸŸ–§ç&—ðö¸ßÕÕ>²y:ºÎîn@A‰1á±4ʹbYƒÂg^r-îý¶õï¦Ãm€®†ùþãÛëo/ç^Ö°}o×aŠõ …ˆ„7¯#dší}Îv»”Y!õÛk¿Ýåü¥×JçO¼,_þú×ç—϶O3Q$<[_.ËŠwŸÓLmêHIÎuI™ ™@ÑT§]Nçu9­$0[C¯kÂ%¹„©·Ööm=_ÖÓ*œ(œtè>vY—º TÂ*˜fàŽ„™€!Ü ‚…ó’Í}êŒ0Îëš%s©”2‰S*„”KFpG 6Ì`¹~œì¦ñÎAŸr.lªŠ´#ÍPÆN ,"6È”@&#ÏOûíé—¿†ã¶ÝæAÁ\Êr®§SYªyà˜6‡¶‡õ-ÌkZžŸžk-HrÉ]Gë ¡úúúööík›÷[Ü7ß–ï|W4Ê„¨ 8º òùRÇoŸåÍÞç#¼8È!F¥t%¸5w›nÑýxÍ’$fpИ9! HaàÃ5Â܇˜ÃtØL“€€8×e:„…;¡f3m­“°º|xÄ1ü±í½÷C*ÄLîæa$"ˆän€sêÔnvˆ¿0§t*éi]žÎ+1 „†)8l[c‘CLû'v.ÔÔo?J¨þ§>áG'ÀÜ8à`_#5faFF¢C}u,­^)›;o8sÓ1ÃMr–Ì’YjN¥$Õ9Æ@ÀœRÎiŽ®:Çn%q’µ”R«¤ÄîÖGÓ9LU5RôØ[ÓŽž®‡#±ó0½«ªŠš™ãè 2«Ã>¦?ç°mëû>û°¡àf{W$8ö¶ª!TH2#y¿Ýö]!ä|©ÄAH5Çœq½înץʺdÏ™sa¤Ã8vx /$$â)èfá‡J'e·‰C‰0Üè C:lÀÄ„˜§S× @f ³Ûõ}ú<Þ£îæs }|68~€ícŒÉÎk]>þõ/ùåó§çóéÌ’Ý ¤4ˆ~^¯?¾ÿP‹ZÏõ”Õâ±=„#Ð;>^ímÌ9ç,) ̦»…‡1tNKrXãŽ{Ͱ¡fjvÄ,#£P u×@wlÛÎB‹Gi=Þoïß~~ÿúãë­÷iD‘MqÎÀì’ ‘LMݥ̜\Y'ƒ¤\$–“ƒú%ÅKò%šë»8gX«9XZèP‹Þ½Op<°^ „˲œÊùÌ4qª0 ☰:,±Á’P#)H¦Z@¤9'fžC¯×»«µ®¦Â@gB¡*©$I‰„8W90»sÎý±?îc %&̉ΧúôtB:æ¸ÝÛco¦Žñ¿U]LòÃãò>-LÃÌ#€‰P NBöàãºïsš›cÉœRÊ©0%B)™…×’’ÐÞGqªž÷ÑT}PH¨Áôa…w°›Æ|”êxšÝ¶9 kI"P„«¨AŸ¨Y‰Žº„ƒ{¸…9:b=†& ¶=ZÇi¨ 9¡Püé9Bú_¿ $bfa€9ôÑt› !,Å1OF3%Da–Ròº.5g $8¥á ø‘a8Öåî>m´ÛõíÇ·ß¿ÿø£í·ð`Â)s†„‰Òº¬çeY–*YÔìú¸'tOAÄ(çH˜SšÓ·½½o¶w:'íþúýúýºõ5ãËYÎrʰ@]G¹Ü‡ÿدßoðz‡ÇÄ®í|Jÿù?|ùOzIöìí4ïÞÚ˜]j^r —HžhL€å|^‹$‰g­L ¦s*$[/¼|ÿýñõõ‘gù$§d¶j^'ýúÿÿ ÿçß¶?öWg· ÷¯Üþø?ÿùùÿú/ÿòÛß_Jõ>4­ùíu»^ûÖv°Á 4‡Ní!JÙs.u¹LM÷ÍGNCò˜ áæ>ÍÀÉãÐ»к>$À(Ì)ØpíŒ,à€næü@’Ì”˜¢Í‡ÎÁh)W—_:L§Ãé¬NËV$MDä)rímÞ6S E»ºíÇßêÞj«¥€yí½«´&Md“^jm­‚)r`&–îŒ 1rTˆ*²Ì³Áª:Iäé2Ïë6oëM´s £# `dD¨Òks&N˜¼bòònÀ`ä8Ƶ;Ñ8¸€ X”xRšÆ4O)bŒèUm©®-½./…X<¹ä )¹´àN}C[B{ƒÖ+sí`D«E0ˆD®`ÐÝݲzìÌæ Šê„ÈÈ+XÉ CÀ€`†âQ9› æFV2Z ¥Ž¨Y+z²Î€å˜éÇxÄæoÏoÒùã]ÃXÍ—å¶Î›3¥ÃÓáþqJúE‰M¤v/ ›F 2é*(¤ˆÑÜÔ8¤càmí] ‰Þy;„Ìœ–ÙÍÑcމ8†‚;”­.ó:ß¶VÄL™1çt:æÓabÚ¶z›Ëm);ؘÉÜÄÌß+¶»¾ä}Láæ»HÛÉwH(VsE€Ä´7i °‰mÕD1†0À!&#0tQ…„€¡ö~Ûl©Ø”ÜÉœ›º“0{@uØñ Nà討UHÕªt7?MÄÀ®Zª«ºˆbóà˜™p—‘«»:tÑVE¤;îL: 1"FƒP;¬Uk•Z½ôØ= "¡h ËÁc<ǘ¸õÖz' À!0ÅÈ9‡œiÓ/Ï·Ÿ?_k™ Ô(€aóãËŒZ‰ã1õœÁH­aÇãéœBèµI—ÃpÇ̪­÷î1MÓpÎñH˜MÐUɻ̯EZï"i8Æq@ŒCäóýáÇ><<܉6íõp˜îïcHîN1rÄïQT0³Òë:¯]„™rÌ)fAÍ͵[k­”òv»<¿|ûöõËr{­mÓ@EDHB!ÆÀ‘S¤ÝëV¥UuwÊ”&ŽcJ)1«ª*2çEä÷×ùó·:/•q;¦9Ðõªk…í4æá~DL/3¾¾„ùs¼löõ-ÝVߊ[•%Lv¼‹þéþkº½Ø‹mbÚ 9BbŠIh)°õn‰òi‚LŒœcìî¤`Ž‚àÈ6äKñ¶…··“^Ç—›^êxƒ»¿¿ô_?—å:»Ü˜0_¿PùEÈþ«ü9Mw)5ÓeJT(UZ/*`ÌÈ("FD¢ar<×%5æǪ]–ë`2!dG×÷~¶º¿C½Ñ  09£#b7“nÈqײ›ƒö=sjÆÍ™˜¦£ÖÒZ'ÏOvüO_ë‡ÿöëÛ·/Ÿx{y N¡Gf¦¤J½»!,s½\érw¤1“*½{ïãñ§tüà­]5FÓàÚ»§f†IÂaŒoKõ²ÑCLÙVÝ„UЋ™0‚"²ëº–­IsBQÞ–¦Û*ªë<¸Ý?|À‘›"N÷²ÜæoŸçÖq:ÇÁÊVJ­â˲°–‡èÐ/óåRÆã=B1ä âÀØ`yõù- 唯œ¤!jôµBƵö£¥wÔ­“6CÄ€ŒðÎ6u÷„NŒžÆ=f㔇CNÙMj)Öª#†À)Ð>mënm[­m­Ôb¬ã€ÍµK¹ùüÊÖ)æÆ4Œ¡ö­™À8Òñî0@{#okåÖI„83œŽ4Äá|¸út>ßG Ì)¦a<sŠƒºõÒD¤¬KÛV”>0Eé0NÇcÊYÖ¹Ï×:ß®_¿^¿<¿-kÊéá<äc¾|½ÖÎB¹y¢4Ç;3]ûj&¦ÝA§Øyxn­·¥b:å¶êîÆûÙßögˆ#°wÕ¶ƒšÓ>ͦ½ƒÝb-¶­R¨eN9B ‚;Í‹,«¸kŠ4 9¥`ªf†»±ÀœÜ”IÀö §:6ìü.ÜBVð¶ûÔÇDàv½¸ôÒ:à.– ! clms±Ž²•ÎŒh—IÖ&ëÖæµ•"€TPc 8ìo*éͤyïïch·÷ð‹q0Ã=Ž€ïß¡š»ÒîsSÐOä;{ÏÌÔTºö&jÞÍE|ÊayÇœsˆ1¥´ÿWä, ´¾”"bcÌö&·Zk+ÌÄ‘k©ºš“!aŒüp×»-[»Þ6QßÅÀî拓÷?.‚ïŸ[®îਸ਼“MÜÜÅÌZSÄý˜ªµ®½¿ß²ÜÝ\-Y` ‘X祾]·®VûNÔAg{½Ü®×…^òe œ×QÇœrÊ1…Ëu‘n¼L‘ü†ÞwÛ{Ta€2½—’Õ y:Ön[7'Ñ)…˜9îïusŠùx<ݯ—×^VGUÓ½`¦æêÃ0廘†Òd.5®µ4GURÍ[«1÷÷ˆBÛZ‘ÂãÝ]`º\^ײ ‡ó4ŽÉÁZÙêZZ3¢rÒ”S±¬¥¬µ«b×Þ¥×Þjo­WWWâ`j P[ªªLq8­½¾]¿]·—±Lùòiâ4OòpY®MÀ8L`l`¢êÚ݃# "t}{#d†€BM‰=Ÿò”Ͷµ]{"¦ÓokÐY‡X?Ýõ»¡Të€ÃÛr|¾ VœHŽÉÆ4´‹{Œ8eèhŽ,/­63FD ÕÀt7é’! ²( ¢Ša GßÜ.®kÄ| ŒHHÁ¹7pæ–ccgÑ$€(1L™&ðC_{³+ËuäípÊÓÃÁÒ´‰¼<·kR  ò¹É›–"¥·*]¹[ €hæâ減¤™˜)0RpdQ·ÚX‰c v}8BØ5­HcŽ9Bw‚”TJ»^—ÛmÙ¶. ¸ÓÆt˜†@X–íííú|™ç­m[WµøÝ¦­ê༳ß”¾·xv` æ°Gêm—!8@S¬ ¶æUƒyÞkïÖzܶMÔÐUB0Àd—[ùÛ¯ßæEÁ±v5ŽìÄF±!ðŽéd²˜0†„¦Þºî 4GVƒ.&·MÖÒ(¸zëÖ]cD 4b#~ÿàU5QGÆ€‰Ì¹4­M×j[SéfJɈ 4¢ÇŒÎä)À˜1'Ì IïA#€‰wÇÁi ç¨]6U‘¸jürzëƒ>üp blÝ0!eU*ÖE;…8îÇa4m¥n¢žòñ0ÞµB­¥.·m~)ë"ŒÇóÇïüî?M‡39žñtžÒ0Šj©ëþDÉ9"©»™¶nïtjï½]®———çZ DNy8„” TÉ@j›o·e[K«e[×ùRÊÜ]”À‘¾Xæ˜BŠ)9™¶ºÕÒyí®E=¦#§(  ¹X_K/†z™ûÏýýË·e•>åË÷ŸütÌSÖ<ö4Væ|½Èÿñóë¯ÏXmÜ££N¨^ràÇs>îå¥CÃu–m3õÓ{!N1°F/ª ºÌsÛú)bš"Ä}äªy €oëúë[ù¼Ò7½¿•Ü—´4~¾…¯5ß U8 ÊßêüÙdQ0ÚwO?LŸ¾¿ýö6'\t»j]LÛ0˜AØf‘¦Cæá=z“ϟ¯üë7)”ù—·k>Qü> ê-õ-Üë‚¢²ï*9ŠLÁ÷ã£)™8t•Ú\•"9’9²)¹)¨#š#¢»S°ÓñO‡ÓRâïKúÛ—þßæþo¿[(öéSüáÓá=¢¦8‰ƒØ[ÝÅ£)¥ñp¼¸»›8ú õØâñéü'㣩¸,v÷úb½ì ÓxüñõåZæ›l·€8¦xÈÌÔ]“Sº‹Ù '"‚õ²Å0 ãqšN´¬ÅȽ-­&çŒ )fP©]꺆ñx÷ýOÓ×oŸEáVʺéà²].î­”Ò(Nwß=œz«Ïo/¿u Ç&¹}AN!öÊm1%“v펞d²‘À»Àf  dˆ@ï>00qtGÛ•>¶Z÷mµ.ÄÍe[MåPn×bJ¨€°UÝj¯µ^K_!J>OãqŠˆó\êªuƒ0"¸Jï1¥Ó§ñáƒòÔÅ붨jÃ.}+F…Éòƒ IDATz||ºÿôi:Ÿò˜Çw‘ãáx†!¦LÔ´ÖmÛÖ},(jFÁñ½±Ô¶y[.×—o·/Ÿëív»\çyØå©luéqÑЈ¨í›É:DÏ1zÌ1'^ÌdνrQÆ|b©¾"±Š!!wpPàw8&à~ Hp/µ›vUk¥õbM¬wuÂë¬=aöÖ­w#&QU‘étÎÇ1rˆS&@U“¦¥ÝŠ™‰13p $hûJBÍÔ]zÛz'€"!œSmªs«¥›jïÊ÷3DJ©¹v1]Këµöv8Dت¬¥mUÔÑÃaÌH0ä8Ž Ð[—²Éj­Õª¦†`îþÎÂw$Ð>ßB$4#"$G@sp@W·jÝ ÑsN!€»µ.­ÙîÁ5€Ò¥ÔÒÇâ™8;„Z•Px Ä» ‰ØÌÕ5ä<Ž£›]^¯—Ël ØÁEªÔZa: ‡ÃÇļty®¥ö&ûbü]lµ÷Ü \! €ƒ*º#úžlÚ'pî ¸;J¿K03¾mÿ2q‘R¥TuŽ!Ä ªK«®îD̼‘¨äˆC¾0ó8]Á”8í&@sóÞˆƒØ¼B &"éÝÍÄÌÞóZSŒÕ½T•­×Þ4„Q , !äÀ(„”Ó8Mçac[ o‡Ÿ>ýð‡yLé5?¿]·Ú:h`v2Ñn a iÃ)'ÆØÔÅ¥‰®Ûæ œ9«HWâñ1aTõ†·Îµ&õItª›´Úç»q nãÝjmf=œðûg^ vHµ‡Ô0d5êµaoA8Müp$çÏfo‰0BâNÎL‘D¥“C¤ˆ0á¹Is1$fW”ƾdªŽ(êb–2§È€(Þ°F¹Eª]§ª Ç”ó0™æ·•¶›uy#Ä~<ñp²4 Îùéðñþ©ôüåjo¯oP^¸/ÞÔ€Ø)î^ Dbd@4xoý2í4Á®n®LÎNÁÁ죀Ê!¤˜R$&\×z}[o·u+MÍ€8ƘsL)Q«m™×—×Ëå¶•n"Șr kJä9☘»ºUí&»ùÁôcTp'ß  Ø×bUØ);FõêÞ#CLäàµUDJ‘Æ!ŒcìF·µ~þò:Ïm2`2ÈF06 FGG÷ÎÔ§ϧœRêbómk½‹:ǘw{<ØÚ|.ÚD‘bH ൶ÖÝ#aN”¦9ä…®fàÄ [ëe+[iÝ0Ð{´ÇÀ•@R€i·¾«ië A@+m­­ó ˆ #Áñ8~ÿÝépŒ_¿]nÛb"ÈÉ@׺gº“kÒLÎÌiÓZËóÛ³ô-0OÇÇcÆéäÚÍH¤¬K%—ûC-oÏŸ¯/¿«,ãž>>}üþ§¿üóŸÿéŸïîîUµ³Këýò:¿]çë|1§§Û‡§§âžoUG€®ZÊz{{½¾¾ÔºIïfÈ!C aÀ)ÄV·ç—¯Ë¶ÆÀD¤·ª80™@«ÎƼÇm—^ ˜˜ Å|÷”ðÀ‹Ê¶Ö¸Úº,Ï—õRp“x™ÛóËë|›Õ£˜…Mò1~üøpŒCö¯f32` [†Ã0!ç.b*àñ4Œyœ¨—×Ë›õQÑ ™¡;倌SäS‚Š[Û.]6 >ôqôRp 1ÝEÄÄÃ¥Þþ¯oý·--2¬›nµË rA€àÁ% õ§úñã}Žlúîéé§ï¿³ÔÿöõÛÈëD:²Oñ€‘¯Ú{åH>œ>|È]Ëë[ßäéëíô¿ÿ|ù·¯%ž†S·µÀµÿðpü0­ýöFr8‚Æä;Èœ xcimmŤA˜ “9«¹¢#0! éÒ+ŽyÂ<–+üý×_>/å<=ýðôé§ãíÓ)ŸŽ)ŘòÙq\–m¾¾©ÖC‡é.MçÓùî8Ä!@ Œœ)=xzTgÓЕ]¬®µ5误oß~ýÛüåï°¶Ã )S` .\˜àüH㙆)†Àfºmó<æV9ÓñnXʶ–ÒÔÖùÕ(!e–Þ˜èáéS~øîžP+æ‘Ï!&=îI*Üž{YNww˜§ã4}<Ø^¾|]®¯DÃx<>$:¦Bö[/Ë:cI”Æ`E"CsJƒttÜB¾ÓXÍvWHƒˆJ7Tó­uë³"2q@´ÖT5æ<'$.k­¥tW)[»•öZõ¹c‡ßñ_އ£•e~ÞÖ«´Ñ»+úýÓwü—ÿ>?~¸-}¾ÌK c Ny½ÞÔáñáþÏùÓññ ˆ{—å6o[„Ã8åqd޵Iï­—¹,sïj€‡ÎYEHµÏËË×ß^ß¾¾¼¾®×V…ÞUåôø4Ä8ßl«éZŸž×ËeÅŽ.>;¼ ±r8§a˜Ò1ȶ]/¯ó·ÍFñh†)‡©Íeš…¸l JÉÀ6à ÙSȉ'Ð`BÄ"x+ÚU­1„’oæpÛlëÛqkÇ©ÅÄf^› ÂZ¤w<ŒÃùœÏÃYZÛµQo:ÏkiMÍSN9gf@|ÿùêÖE¥«™âœ2BHéÂ:kßÖ¢ª»H–™‰¬¥·ÖKÕ&MÌRJmkµubŽa¸¿›ÌŒcØ=~¬–Mwo0âÿ7úß™4{÷ÞOÀÿhÍÁ{ ÜMvò?ìQTDÙé\êfàæêû¡ÙÑ=Åz×À<ŽtèpoËN»GxÇïHT F$€F(9ÁéÏÇÁÀk“¾§¢c an^«•bª,0tGÚéRN(»W$„÷ß'ÇÀˆ¸5©jæØª–ÒÌ4Æ àØUD%äÈÌà¶÷¬@zw%QPj]ÖbªLL§|w—¦) K¾ÖµJ—½WF±b«¤žÂpÊÓa ÃX´ÜÚ2¯o­l9ŒyxˆRˆ¥·²Õù:ßn¥ìðã„^Ëú\ëËá0|÷ã÷üÓ?üÇÓ˜;š–ºmm›¯Û/¿½þûÏ¿yþÊ ÿüO?ÖÒÆ\º›ˆ‰qëRËÖKÑVUDz—®]–Ò»šf [ ­o/×o­×SÊ™#ª{—bZ…R6ØW-E„Ê@ª}ÛÖÖ6ŸF´.µÕjŽ&ØÛóç—¿ÿv}YqÕPšš rˆæŒ[…u Ó)9r©sBx¸¿û—zøxËqzè¿>¿öŠOÇÇÒ~€kW° Ñ8Š ’YTD CJC&„à-(1iuiÐsWèH>& lŽÇfá×··¿¾A'6q3ul)¬C„Öë2ÿúýö¿þ/þŸÿ§ï¿~þù—e1àX4Œé0ʼn[f3ãuk€J™‡S¸{`°>n¯¿_Óÿý&ÿÑÆ¡ß×a[d5Ê6iÆ m6‘ÝUK³ªÈIRF Ã)æÀ=@ë@1"Ñ1"E27-ކ!2!«ûuë[¡ £sŠß?A<Ññ>=’м¶ÛªéÓ@1 ÈÚöº¶8Å8Lãp˜NãtŠ!äœ9$õ¤#:eâÀàŽ›#bR€íYß ½qpcp&pT÷l€&TÒ”Â8Ž9„aO§a<"nAÙëíV·jRœRÌDfCB>`L²\IZ"O§ŸŽ‡^ËåËçv½9çaÈÔ#”hËc–ñ!8RH˜‚;hµ¦è&Èת`ýœbdŽŒJ,®U¬ƒv"A2òñ]& häŽÈ@ìLH˜PÔy—°º4éMKÑÞ-%ÖsÈ£7µÞºV“Ök_ÖúZÁÏßýðÇ?ÿñá|¨—òùçå峨8Gsè!Oa:N¿Ï÷âxJ² C3™¤u”˜¢?ÞŸïã˜S3,[]–µ”’†8¤”ˆÂVz­UZÓ@,+Ç Ü@¼\õõõòùß¿=ÿ²õÄ`ÑØZ_ëëÌ¿¿Ê[ÅY&RA³2úéi|8NcÌSÊiY/EêÀÏÅK'ÃØÑ™DE†§SŒÃ!¼õË›‹ BÎ5e2 Rp“Ý .BfàŽì1@Î] v[['ä Àcĉˆ¡‹Î‹ oµ©Žc:O1Å,.ÌÜÚ²n×y©McLÃÐc$ÀŒÄ¨j­vUÀÍäzk¦ØÄ·ÚKí­«ê~Ž5f ÑÞÍ]ÐÅkU7iEÜ}šÒ0%@‡CêMZé²s:÷¦&@ð⺗Töt’»Û»æh7Ó¸ï~pT7À@!pLìÉoC$7p3330¯Ú^õÚ{¿^Çã!?܆Ìzwì"]DÌ(DÚùJ*ër»\.ëÖÆÃàŽbV{‘S‘ÒËëü?ÿþÛﯷ¹õn;ôú=Z³Ë¯ßùÙ¸ÇfÌö¦ë»í@ÔTíýeìÛ4ÚÍ @C@$'t"$7µ²?p»½»,w¨sxWmîmͦnî]¡nµ—Ò¯séªHÁDµ»4¯ÕZsŽ÷,º!…Àˆö= €;¢£9‚š80c ÂCd#p`@tÓ®ÃÇÌ¡ÕÒ¶À9FŽ(8 ‰¸¼G9[“K}&‚@íu¾]^^JïÃù<ï×°öu#òHxäO'øªÚ"Ú€kàç6¦× sájÑ!¶ç4ØÃãi<÷òö‚ö­Õ5ºq<4Æ!C$…î0:t0Ws1í¦Ø•9pæ¨` 5Ĩ`Ð" ¢vVu‚) DÀltßíÔæZצº-}Ó1´SèC&ç €n­êÛËõ²¬Eb«’Í„Àð^›xSƒû¾Ý7°³¿Á‘÷î "Ü‘àÄŽØÕwà/3#b¢œ ïü…& ŠHL! sŒqÓ8¦ÂíïæÝÑ080€ÂžŒt1GDO! C‡"»î× —½c¢ŽµúV»ºÄ˜ÆœCˆà`"]±+ lŽ]záãÇó÷ß=Žc±˜ãù8G ¬!°¹´ffÂÀ!Öfbnîïn.“È}ù0¦”£ªu‘ÞÅ‘#í#ÈäÈM\- 7mM=t:§‘ Fä*6o]¥ï9¢Ò¤ì²v"Ç”s É‘9pˆœcŒ™ˆÅÈîÖkëâHQÔ¢âfJÞMM8Òýýøñ!?ÜçÈNàOç)bx½,WíêhÀ†Q€(Åûçþð”Òx[ÊÛëjã80Pâé0sˆ½”åzë­qNѵÞ._PØš:Ý><~øøéãÇO1§e¹Í·7ëµjo·Ëúåó׿þõ?þö˯qÊŽÑX]o ƒrÄý¢¸w¥IUMÅÝjY×y³N0“ Jõê ¦÷„hÔÍA 9”Zµ´‘Ã4$‡žØ ÜÂårI¢”",·õïŸ/¿|Ýæž”ÀÁ#33;ÆŒ˜.×õß}¶OþÃÇs ± Q­×Û«a*ÛU»?>þôÝ÷'ÊNl ]{‹SŒ” k/´Šé0d@³ÓhA9äè”J§µ[—uT*Î/oúןoŸ¿¶[;x$܉/½FkŽÈC½âü/<üÿzü׿Ð(öíç_Þž—‡á4âùrFÓ¾Õ¢¤‘ 3…Æòx<]¿àÿó­ü&çÛñÃ%ž55-пÝÏÏø÷ñ8n—WNˆc­Öµ)h¯]\êÚK©Ç6LçtÈ™´!RENySvkÒ ¢11˜‹»8š4E뀧óðŸÿéü'”J—¶ÞŠ‚ÁƒFóny÷¦$Ç' ÇØ;±3!£("#’«íbDs´Èv˜¸‚®¤mÿõ;ìs±¶t“Î !€ ÎÄh Õ:‰™™1xbíìk@‰™qímy»zk\º8‡‡OO!8ûy„Þ\ÖåõòõZ_GoÉ-²$#S´J]щb60‹Ù•»;0S ƒ¨«¢Š˜9Axïk †c :p3 iod‚€»‚ Y'kˆ =l+!FŽ-2B !ÅCjg¨îúïþ‡ý/Çrýÿíß^ÿ›€Ù8YÌ@‰Ãátüô}ºªÎV;˜#1²9‡t89L§"ho½{ÝŠˆ8"†@!„ˆ˜¨™+ †œSí~YêM 7Ñ·Kÿúmùöm[fŒ!$DˆZ•Û:]éë•gK<ŽŒî­NCüñOÿù/ŸîŽÃå¶~{¹}y¾¾½¾@»}|8üðáøÛKûåk©Š½8#‹¸ÒiÌhT極jÄ!…ãý4 ê úRjsQRCP@@€À ™X±´ÎCÚDc—˜˜cp ·é³Ö¶´¶>ž1r7E„ˆAE×Ò¶Úk“­öyÝåœRN¨MTDÝ{·Z{­"êîhnŒô^`us%4wGFtvÇÖÔÄM401QN1F´„›—Z©wAÍ 0™¨Ù?Êuð£Ù«Æ{8uW;øŽk~÷Ó ÆBÈqÇm íÓvw·äl¬¨¨ËV·uËDþéヨmµöÞDwKƒI¯¥ÔV1圇Aº ‘ºÏk¹Þ¶ß?¿üü˗˵˜“¨íã·]¡ƒˆ;FóݺëoUÀÑ̺˜ÙnUÃ]f÷n0pUurð÷BînáDR÷n&ºcdß"î+QD"3è*ÒÕÌÅœ6µy­ó"ó²mEkwuª][Õ¾§{ÍAME÷‘#"Dâœ"½Û×Ñ À#"#€ê¾pˆL;ðßÕvn€„Á0¨Zo¥ÕÕµìW¢}¸¢µ[÷æîŒ^æ·çßø ©Õv8ÝapçsL‘ÔÔ‰Eœ0<>|9,××m[óáôññáñî|3±6ébóåú–¾ÞMããÝ]íùz{«Û"*ˆDÉ‘w$¥Yâ8æI8Å@óÇœæ7QSF$×5’"@ßôµ8ÃÆ›§6D6akê H»Ôe¹Ù:çiÊa|<óq:EŽ®^Z£‘9PÌqSLƒñ”ŒÓRì2ÏìõqŠzôc¸úöZ½ªa@D/Þ¢ÛN‹„tÀöñXÏq;¤¥­ ´ªorÂxÃ)†ÑGÎ Ûí¶½˜ß˜6³¢ª†ÌyäPÜ´›·î H”\Yd *Ô,Aœ±7oÛÀ~ZÚp½°¼©\zmÛø!}÷§ÓÝ}L¶FÓZìr“¢FäÉA}~Ù.+ LD€A‘ÜÑàc6 â&îìàF;Ö}Ÿ‹3âþ¿ÌITœ!EÚí&†dæ}ŸÓS8¦c­M»!bN< ù0NLTE®ËVºuC63ß9„û;›™T¡T«MÁ½ ™1:º‚4eõRÁÁ³i`!˜c\‹•†ê¼k6T[ŠüôpžÆ4Ï·y)‡iº?Ž‘ÁU½VÙJkMr—P»¨!PÐîÖb†»ÓRnµ­kC ŽCDµöܺ‡8 Šû²ÞTtˆùî8'&4Ø/-[}›UÔÑ\ÍÐcÎ4ä0!§÷pUNát7ÜÝÇiÊqÈ)ŽÓs¬¥¾¼\æE(»‡ß¿|Û~ýÒJ±ýñqúOùîŸîÚe¹-½¹ui[«UÌÚL!ÜßMüéÇ?þøiÛäùíïÛÚ§ñüøø(Uâýýc@¼¼¼,Ë’RœîG=[/­loRVµă#‡˜r`î½ÖÞ]‘ƒ!”¶-Ëu^nQå÷ß^ZÞêZ®)õó Ùƒ)¨% Ù‰UÔÕ¡·feÕÞEƒCÈŒ€ÒÝ1…ýĺ3åÝqé*H0ÄtN£á´5|½®ëåujóé0•¦¿ü¾üúl³ŽFfDPÚ«·Îˆä絺êýÃôãxσ¿¾\ýýö|ÕËlµ5¤Ðš¸Áß?¿!ûwǧÇ<Ü«l]..L1"#JóKß È8D¤Î]»a ‰<¥‚©h¿•¢½sDÅÿ}yý?ÿúûmâxPW740u³è럾?þ¿D½É$I–ŸùYTÕß"2r«Ìªbw×$»y 0‡ÁóÏ‘·x¢Ù$zX]•••¾Ø¢›ˆ¼…µè9†77˜«‹¼÷û}_×}÷î]iç_Ÿúô~C¶¯9.^ÉVG·EË"«™@ ºØçeêûÅêÛ2iø–wï.Ú7ÜI¸>´?=òço†‡ÇñÓÓcw‘Fb‘@a×Çœ1 Š4u§À]Nˆ[嵨q`ðhÎH‘€Y¶Q…™‚:¨ƒ8–R-"¦ÈÜE›ÔYrwuâ¸ß½ÿæðøþÞ™9ĺNÏOÏŸ§Öp×· ±‡þÀû;̽˜S0ÝY€àèæcÊû]vÆALM Ý9DH)ö=çÈ]¥U!â´LŸ~þør™¥5XG˜^­P—b"Œ ,¦fñR|ûî.î ,#±>Üí>¼z¸<§ËO¿¾þù/çéºòáÈïwCFheýt•êÂhÖVº¾‡aŒ £Rè˜cpÆÒÊܦIZ!€D¼q°·U-«ëÚÌr”ÒÃ6¤¾º,e]L¥ †œbd·ªZ¦©5i×ËDš98tR`soÍjÝ ³MÌ1å~·Ûu)¹J)k­­6ÛX·L HÚ†°BrÀ/çvDwhM • ½Õª5v)utd@R5QCµ¦*ºõ›]Í·ÖfÞ?·â/¸98º»£»"QœR ‰9$Ðla`†_Àõ` èîÈ@Ì!$’ 'Ѥµš»mdt7Þ@ÌÁ‘Ì}^Ö²Öiš—uYKÇr:-ãTª¸»#m@wß¼†àènæ²±LÝnè=CbÚ`¤¼ÔÓ¸(ÍÉ‘ÔÙ Hˆ*³S©>›oV=DÁ™CŒýjýu ëÒ‰…V=bÂ0®pjrÊq÷{ÜÅÚæµ¬ôvÖOoëX H Äš¥¸íÙÁ¶“1l¨uߎøŽlUkPO[Ü‹o_'B'7`Æm·ÖTTeÂߘOfÞlë©5ScR<¢SD ‘˜PÌ—RO×étYj5m¾-ÐD¥6ÝnõD¢!•mšhÖbë¼”*b¡4\ 5Œ(‚KÑfªŽµÆZ] ý¶ãPD1t)æ ×Èî­ÔÂÈ ÍÚõ:-Ë*êîäEÜbŠh€`ÒÌMæ©”Ú8"rh‚ꄎæÍL Øœ¬‹°Bd2e@Î9¥€fª*îX ,«¬¢#`dê3=÷S¤]w}JpèÓÃãîÝÓñþxèr×åÄÌ}ç.âéº ÄyµHêZEJNøø¸ûÛ¿ùúßÿáÇoï¦yþÓ/ÿòóÇI “õC.`eh5'ûæéþ¿ÿþóãÃãñímœ¦Úuùp7<<Ü™¡ªGæérÒµ‚ZìBèB“6V]¥ˆ‚bW––æBK±R•S—ú=Ŧ¥i­jÄ]Üßõ_}8ª­Ò|9_ÿø¶ÎbE×¾—ï=å;V°)QUXe#˜;fvQmìÔ‘¸:G2ƒ×àÒ‚ EmB¢û‡Ì%º !GDñ‡dCëëôùy:—£¥;æ@^Àãˆsà¨Ü-}<…Hðë/ô§¿ØÔ¢‡ÁQnŽ“Ÿ^×·é/¿žîüpLZcç©'ªk-’<Ž–°z›—º´ÜåÎ9*“« h 8±7óe²pFH‡Ý»n7*Œmvf ¦òvïþôÐ?brðŠšô{ ¨Á:*X Ž)H»šjLÒ5‹™“Y¤¸çÔÝß­ÿþoïêWÿ|åå×±î;ÿü~Çÿæ¸ævæàww»ØgÙ±ó.ºð9ÉëU¯‹úÒÊZÇ×æÅª†uñ,1˜‚ÅÌ´jUcŒ1DBC÷”âÀX[­Òˆ‘Ccj¾(•t8> æÑÔ¥5iÍ2t»»®ß‡Ô1Gİɼ·uw$ d*ªu-²)Í\ µÕz9Ï]®]G­ªˆ‰sDÎŽ È„LšcS/îÙÀ­ ­¼+Ý(P7mÒÄZr(J&ƒO$^cRFAìöÑ áp^ËÚL`C™€‚˦ gˆ[2X[kD¹)I%)‰<0⸠}LÕš6‘¦ëÂdy—vOßþ8ˆüé¿ÿ·ÿ÷ÿK˜/siš†â4­½|÷ðÍw_}»;>rŠfZj5iºaÜúŒè cö{Ì»äM¬ ¤®ƒ˜Ò)„m´l¦Ót-ËbPÇÏŸž_þy<_ÍÔ´ôûû‡w÷ÇØš®k§²*jØ¥4<Òñ¾{PJË4_›¨K ^JùË_?§ˆMTÕwwÇ},»8‡vzˆþãƒôÑV ¦(M‹@×…!$ÄJ1`"FZOuMbd¸Å¤ñÖjCvjMTj³µÙ`ºÛ‡ Ü]Ñ=€%u÷ÙCŠ1e€€@0¯²–ymŠî]ÀÃÐ¥Ô©# u}dÂe^®×u—Z½Ë‰Ñ7‘ª|1‘!Á†âCßNë°±èÿ·HùÔÙŠx¢:/E ´ÊvæˆI͵6iM›¨ºÚFÖÆ-[´‰d·;1‚nƒ/®/之}Ÿ‰Ñ}ëb5SsØfÏ"jên€ˆ)†~—»>;‚1Ñ-º´]\ÌÔ ‡ˆã²¬ã¼ªÖVÚ²,§óõt§¹‰ Pb@Ýà[š‰hËØ;"°#*:˜ãÍràbº%˜7A¦û­Ýë.†hŒNÛËsTsUG$bU(Mª8!B“&¥´*ê@Ì10†è¾®²NµÖ*jj´›W7îìŽ)PŠNîB]N}Ÿ·Œ¦ÀHšµª¥5s XæV«nòð¾)%b0Gdv´UJêÌ[['¯™=`fà É1qÆhÓ lK ~ÏÓ21‘Ö:-Ëc¿¿@U"æ±H):C¢DÐïéí|Ê‘™ï9=†û»cLñõÜ®—iY*€JkDóöÉqP³²Îãù,Ò(¤µ•ÒiY–ç×ëåtªkuÄ D÷”ˆ8B©V€Æ Ýãîp<ÜÇ´Û û}?¸Vo-§¥h_ßwoŸ/?ÿ2ž.eÄN(Ë ×+>$úa·ã Жµ´Ú @Uå€! †[ä¥6h’<ò°ïzcmEÙ$Òö—q›Hz2?Î)ºU‘J!§ÇÞúÃîn7%ÅVÀí2ãF¼@£hŒ@€€ ùÓËr>ͨ¸.0×£pï˜\IÅêsiÓ¯×?¿LÉJòúþ >|íû aõ •£ˆ[ÅT°kĉ (ikLr<àn×å.ºÎã<}.†Ç§ßÿ»ïNgÿçŸNã:#e¤ùZ–úŸ¦ðþá·ß}øáý£Ôù—q]ˆ9ç9!Í× jë(Æ>ØAEÄf ;ÕŒ’‚Â÷ùØþtÁôÿýJi^ÒÓ·_íÿ¯oÿûýy×NV®Ã.GŒ¥Öy=rr‹™±cY¬T/bÚãÀœB@VƪFîœ:Sƒem¥†œ23Sêv}×X›TQ  NK)ËÒbŠ»ÃÓaOîËõº,KŠ]?óîžBfŽ `ja›ú¡EtÒ&uk ^®oççÏŸ—2Ç. »>é8~ý‹,¯Cg`¥.k¥æ§>Q4$-¦K5‡¾öÃ1Õ¶ÖùŠV ­Z sê€PÚêRÀU)*’êZ:æoŸöf}H“»‹5!mÙyèÝÃã*¹K»Ž!èÜ™[ÓÙŽ‡œw]UYZ]Õcßgêx©ÖZ €‡>í»ÈàM[QDÀ@èÕÄÍc #3·†ª`*¾Å2ÁZbÜ0"DC—Àët׫{ ñõexþ\¥¾üùŸÿåŸ9ì÷»âT–yžw‡þýWßüø7wwÿD1T©ëºÔV¥US1÷”Ss`b”’s\ŵ©‹€cJ‰û#×RA„ºÎͧëxyùh&Si—óèÓ¸÷ªÖ¦V»ãÝ¿ÿýïüš.ÓzºÎ?ýú:žKÚÝ?í•ój´Te…x—×ÅTÊçççRÊ2]s ß~ûÍú‡?<>.zúiþøÇ:Ÿîî{‹çU'YÝ-^q@à€R]M `BÚ2€à~«È@tdÙbí«­mAT#äD!Ç>rðÚÚ²,#Ö.çÜÅ~H9±QuGâJà‰ˆ;)‡a·?ìwÖärÇq]–u]æ‰ ¾°9ÍÝĪ©móm؆nnØæÖ€¥ +ºmÏ—Ò–ÒÂé|EÀÈØw1wQM[­³¹nÝR‡/•_ÜhÌŽ´¥â7å×%òFŠ&ØØ °IqZmµ4ÕM@›M@\¶ 眻®câR “õ]>v)¥m2OpËâ„À„LÖ"Ï/—µצªµ¶ëu&YË3ÚöN›Ýhs~ºÑf#ÝT°u€À·û…›ܾ"¡»«êV Gö䛋ëæ`³M®NA—ÕKÛ¢óàD†à¦b*¦.ž"ìÈܨ­^J]×bî@±6%€€DŽh!lÿ)‡” U©M<„°å—ÀD¼¶æ­Áº‚(¹CAtŽ„ÄS`vCòm’˜ˆ´€(fuߌ!FÄÈÌj\›4QDæ^Ê¢6"a×e4m«bbN)6ÑU­R !£i)R×>Q™8Ãîáñþþ0ä×Úæq‘jHɽ©,Ê @q“ Ëôrú|y{Uñ´^ÞæS×etoMÀW"q¢†½A&Gá¨1ª3ˆº+k…ér‘*ýNÅ!¦HH)¥¸Éår z{{½\//—·Øçnq¢À€¶íÁÔ—ÕšiÊ|Ø sŸty›æ¥K2QdvQi5¢)ÚÜ.C’ÇÀ+ÉDet ’÷#†×†'QeZÀ×fV-™ÀÃâP¤ta¤ ÁUÅÄÑ8Q€æÍÔ&ǽÁƒ¯»·s¹\±Z4ì’¨;1³™9"-“üúó• j±eÖ¦D1D näÉn·Ú„ÅnH ·éÁö·ÉSdfޮϨ†ÖÌÔCðœ‘ac†!38˜Š# ˜"ó¦zS3B®¦EJ3+µ¬ËÚšªB5"w„¦8­>Î`Ž ·Å&‘ z Ы„p{³ˆȈ‘‚ƒ™¡™Àèa{D¹ ºJ"ëR¼?û]_ÖúvÏ—©ŠšC©º¶&fŽhMÐ]‰ÌƒT hŒtè–,tÉÉcfql¢æêL–"¢ˆÂF ¨ Öª€H1Šª:³÷ö1'—ªˆ8tÝ»ÇããCŸû¸ÛíîvÃq舑#—Ú>~|ùÇüçË\ µÌ¯^Þ2´;b>à”°ß·c_XÏãT¦U©}øê8t„øëË¥Ô“UÌØý‡?|÷ÿño~óÃwÃЛËÐ{Î091‘#;ºy¤ŒžbìÏ—çy>M—¹®PjªÚ/B»Ãþpÿa÷Ω›Vó˪jCT)s™Oc)bH|·ïðxÆ©‡—g‹1 õr™ÿ\×õ>}û´ßwáˆs©W©×²8("zp!GÄÄ#ô»ÈìJ*QbfM¸Š71˜‘‚« ‘&ðèK`ßïªÙÏoòi‰»€’+ºù6¬ÃÛ¼ÑÜ ¦É'U0$L!Ä©Ý2sä®b☊Ê4¯%j}[ʹòo¿¾»OQêËRµ¶æ‰w»Ü·VIZŸ)´ê^£"®ÎfÖ–•s·?’ìÎãU¥¹ùÍü@Ì ù2á:ÿîϧëßÿæÇáè¾Æ##*Uw%k¤Ñã.t»Î-ì€U²j¼®»µ]?=ã§ö}¥v¼³ûáíïèó]{K0{§ILÔÖBäTµº„ŽðܘájdÈ!0'â&Ъ4¹š §y EB.­9rðÀUi5B¬ÕšzŠU¨póÃ]·?¾ ®X«}ß§®3`"fÜŠc¦æ®*­I•u­§Óe§Ëeüôüz¾žB‚¡Ï‰Ø§²¾öÑcN­¬ëµ ä»L)6å“‚óÐÜìà!Ƙä„HhMÖeŒ,LfMÅ´T²"¡ ÆfTY)šzk jÌLÌꀈ÷ÇŽ¹ïr¢A™gÓJLÜ%BÍû#M“®«]Q8ö¡K×2—j 0˜™7£j%ò@fæŽLIÀ)¤­Þª+Fæ]‘h.z]W¢øxÜwÀ3^®hã:þõþ÷ér9•Ë›ƒΈ©cÇ®ëv»!wÉÜAÕD›h©µ¬‹© }îcêBJŽ´MCÐ0¤ÀŒ¥Ôy !;ISY×õü2Mãyn€¡OI–Ev]øðÕ»o¾ùp8ìËRDö>ßå}’avÇi‘·¯¯çkäÐC$*HD\Ãq×ýþ7ïÿîï¾>R wí~Òë¯ãër̰Û±.ÕŸÚ§gžÏÞ´'Ê `70cD ›ÚÅñK¬Æ·ˆìæ· Û8^Ý[m¢Õ˜(1v‚B nîµhmŠ ©K»]Û÷|Âýݾë GfŠ­Ù¸,mUu˜—Jö}ÿáýû§‡z:_^OgQ£­Ql`Û&ÔÁÝZ“8cÛ©n%QóÍá ´¹Í››Cs„…ë8"`N‘b"F |›Á#Àð§û¶Yød'pE$GØ22ÈMTÌ|S©431bÜT;à̆ÁÄÐ0FŽ‘  ÕÒê:‡§Ç»ûûCˆ,­‚#ㆽ… ¦y=_Æ·Ó¥6C7«ÕjcƒLaã“ã—Ü#1"nà0ôdÛÏöEdžD@ˆÌ à†öÀ5hC1“+´¦¥JU14Çm€[äšâÖ¾½ÿ`„]•«’ô™\p-6ÍV !±«3n4wÝÚ~X9¥èn¥Hmb@«*ÞV=AU›¨4T €Qˆo« @"$uØ»†H‰\EpÛ2(˜#âž5!B‚íp„àb°¸ˆZb¢€æ2ÍóÆgHVWq 1`pPeð»Ãñpw<ì†.“9€ˆe´.ƾë(†"2ÍK­B€ª€#i«¸. µ‚©ooo¯/Ÿ–et0ð5ò5÷¹?t}α0·A(:õ¢fÖ¤-™›cERt¨UŸ_ßÔ?Çôòv÷úp¼ëÒwuöwÇ;4¿Î×i™ÏÓe9ª>îïvýÐ¥Ƚ ©…´–X˜D·Pb»ng¡q@F iƒõ×" u1Iû]ê‰îAÕA¸á«_—»Ï•ÌesÇÔEHdçØÌlúê[×ÖÅTMQ Wm" Š½†»¹Ü'šÎnšgÇNÈŽ @_ ¥Ài5ó›Øœ#rDWÐ[‚™¶_0sEØlž·ðÖÕcòÀÈtë¦oЪícBŽj àø¥ŸNLHìŽUÅÍ8pàÀL¦*º%ـݩÔÖJ•RµÔÖšlú&313צ4l–ØÁ ôfã ß’xÉœ§Ô°*ÏÌÌÉ‘qp@öm•`à`€jm¿Kß¼;|õtw< )tK)cUsó¦&b(NNŒaznÍ6D6‡ªVÁ›#°#ƒc <¤0tr,Êb¢ŠŽÛ+!Yª™QbŒ)q V«ªyÞ\4ä¥ÖVÖJ–µ5 ˜rìúnèúcs]ª¼¾]~þåó§çrÚr>äCÖµôèC Ã:¿Í?éóóË! {NCwïö}ŸæuÞ¥ñÇoãwï¾}8îÿðo~÷Û¾ÝísS©¥ˆl™DsU#ö€ÀÓÒ^Oe•ØïÌB]_ç%R<„´—qQȈQ›.Ó æu-çW‰XƒÍËô6µÅC Úõ2]OªÓñÀ…Ç7iM9ä¹è¸Èy•ë²¶ûüÃ>¿ßí,`”Ú×E´TQëªæ9DP·ªk™ÉB—Â.%›G×)˜€…HÈͪzõàæ¦õ1úC¢RçÿñËÛù>·{Á!/äjàê€.7!Žo 0#Ä·]¿›º !!ÁŽTÜž¿E®s=¿Îô]úº{wÔñ¹Œ/Š…9í”Â<±M‡]Üç‘(ÇDèÕ̹{úî݇‡¯Ÿ¯úç?~*—W”ÉT ܨïïÝÂ?ýËéÿþÏÿ­µ¯÷}ä¸O$¡jmuVÕˆ© êÚBŸbÊÒ!Æ£5;]>_~y=ýrýøóë|Y¿º¿;ŽL…Óçk{ ã»Do­¹9sèsOìˆPÁ]mÈ1rDT„-°±)pp@ŽfV&k‘'D³€©™Ïsµ&Mãf¡î Y3k`ªÚ¸ÈuªFYuÀZ@#Dk­-e-ëlÒÐID§e^Zmî¹ïŽtD«¥”iôV)Fl ݃j[祅—ÆW Üõ9äbÎ1ô]a#¿›#qÈ@Ѓ:¡8#1qd†u;ä Ë$­ªmC/Í0%®ÄT]»]¬46#RèÌ-ÆÐ‡µ.“¬ 2 ëRâµt]¤ \EÝ—’Z©Î²‡Î™Á¾HU¬+„Ì!²(Eta×w!H)MÍAöÝaÃé\>úåõåew<:Qê;Š hh†­m‹ÚÚ8O†DDk-ëºNÓ4-ã¼,&Ö§>„L1…˜Ä”™ƒ“P •¶NÓ2N`¥M×kǺ¬Ë¸Ö0ujÞVeŠïßõÝw?¤˜O—©T]$¬ÐåûÝûǘS&äë|z}¹þòñ¥úý¾ h÷wÃWïwCŽŸî÷ß~xHÑ–ùFæýýS·{nëšÉß{Èy9«ccΊ°‰e‡Øwpfð[ææ¶·Ûè&^L"P_ÍêÚ–ª‘ÁÍ‚(‹V8kæöî>ÿͱï»nè»Ü/ó:—Å]Tà4–Óëõ¸¾z:öÝýý®J=ǵTu4swà-Ùnæn°%m·×· ÌTÜ€€6" ·í4Øw1€»¹¯¥ *“÷93R !D4Üœ·Û¬Û7ì#"Ð{&ÿ²€/ÕA‹ª‰jSU4gäsL!$ZiÞŒ2;¡Ò¼Ïß|ýôÕû‡¾ps7£ošáæË².k}y»ŒÓÒš45°¦Ò¬l}>æ ‹­ª"°¹µ"Ü[ ÙÁ a›ÓoÝeøòFfBBwÞ¾‚[úFå&°.º,¶Tij_Ô°i7Ì!úÆEG¢[#ÂÕH À¢»»I˜‹-2#nüÑíÝswcÂC Nàfnõ6—7'57UB5w3Vg‘Ъ²CtDÝ./ªŽ€ˆ(bm;€â×ÂDÀÄPÍ7ÿW ŽèD·Þ0š)SdDsfhML¡z³Z—æf9#H­âj‡ãîûw÷ÇÝ®.ó´.R`rðÀ›ÃRÛR0ïŽV¡%´Z–ižæÅØŠ×ë:]ÞNË<™+DR7m Új­°«ZœÛ$¶ô)`ôfmuQ¯ÕWok"†.X6õ*¦Ö¤œýRçzE`@Œ÷ýpP}{{[.‹5YW?öû®‡#‚Jµ‘¢G@È:TC”ÕÙܱJhK‹9‘º·æ“VÈ9¼ÔföBzbœ‰ %ôa¸2:P4G-*ªjà@@þÕÄaÆày,á4¹J‘¶¸øf‹Ø’9îŽ@î¬F·{ÚÖÚ´ç_ Ôˆ€æ îÍoÓ t43Æ‚¡™“:ˆ* ¤È˜˜H¶ÝÍÓaÁÕÕU=3!2:ÕR–e1sQlâM½Š•Öš˜*Š¢4jrSFo4 ÃHœ ]Á ·½€hõªÙ2c$¸Éä ˜(2GD2s·íWÁAÍQ5õôý7wûûoÞ¿?ÆÄ„ðÅ^~;ð©™4eµ „Ëà `àˆÈÄqÓh ж~‘†!çdâ †îq›×Іu±*¶67O€¸=ƒ‚©90™I5ÕÚ¼µöó§×ØQ"†“­±ª¿^¦?ÿôñãó%Å|w÷ôÔw±·™–7©× B%°Yàü¢¯'·}Ú ‡ýý‡Çô<˼ŒºÎOûøõ‡ïóýožŸrÊb:ÍÓ8ÎØå„äµ”q,¥8BR //o¿~ü…ƒ?ÜT†qí/SäÜS·Wh¥Ê|Gî$¦×·Ó<]z†HEi¡™R§ë8¡¶áxøÚé:ŽoãÒÎc”p87•×¹–;»ÞC¿ïúãÓÓ#.—åbóµ.SwYªzH)î8&¬ë6ƒR'ˆ9æ 5·­b)Ͱ~xâ]ާ·ùOŸÆ?=wµË],ÑWB`‡mõ Á!Ý–ìÛFxcb‘9¹ñv;tA"vwU ‰»!R·Òîþ»îñ~¡T ¾þúÝÐu§—ÏãøfU¦¥2®)¥‰ˆïîîúã!îïóÛ´;ü×ÿúOŸõú”Ê%××S©€È™Ñ͈³1>ÿùÿùåõíôÿÛÝâ÷áý‰4N¹SáU”z4"1e0@¿\ÎÿòÇ?Í/E+í2%^qå®Ë}ì"˜TpsWÛ&F)!š™2;$2#qÒ@XQÕ[ ¦˜M«°[ 'v@w2‘¢Ž!¤ó¦¯U4‰lœm­ó‚UH´¶:^ÆðüÖ¤=~®ã*wÅÐ¥“Q+ëz¾Ž§Ó«ÔÒwC×õŠ´¨-­ZùÖg l‰¬ÒZkDÈ¢‚ IDAT- ðpZµÌS­T¥QèC>†>Gt Dܬš§”ºkÙu%tw$CƒH¤ÍoÝHwdå;fB ª¦"ªà† „cMèC)ZŠf ÁC¢®¿.‚Øü2žÆ¨Þq3''Ÿ5ÇldU›˜q4N1tˆhÞ¾„˜áöPâ`æ"U[QBHlÚ;ïcÞsjU—ê¥ê8Ï2ß3•¸6)e,k̹úPÝÖyž×uc«û¼®ŽÌ!4‘e]¯×óuºVm„1Ƙ9F U¢ÀÌêÎŽnf­µZJ««µv}{¹žÎ—óeiTáÐ0O3Žã…¿ÿö«§ï~¿¿ÿz­Pª4gè!瘂*LK;_Ëu\DZ.ÅÏãÔ'<†‡»ã‡÷w‡}÷ôt ìo/?}ziµ%"-Žy‡y—ŽÇãûï/žú´H¼—¾Z×”]Ý6\51ý« ýËyÿ–z߈›è@ÁÌ‘›5m‚@_nlæÒJ-Û…r¼ÌíéÑïAUmK\Kk¥´º.R×ÇÇ}î"ŠèºVCFä툺ý7GØ"í¾Ý40†™Ù6´ËvŽGt 4sUõ@€ÙÜk•y.ŒLbÎQQSîÖ¤ÕÖDÑ ÑmÃÌoˆowºÑ5·Ãµª9¡ãÂI1Ärˆ)¥”4k®DHžöy×çœÂ°¾þðîþn_"L"U ¨¶:Óu\^^¯µé ¤*M´™ж  GShbUR H[R €Ã‡ÁF7C¸L¶ü›ª71Dƒ-N¤`æ¥Àê, kAÑZeF\­íêLëôiÏ¡3“&µ´u8üøí·Þ½ïònšæ¥,Ó4•Z‰B ŧóô˯/ç± kçç·ÓësJôøTú®:b«Ö5%:ò®Ky²Lëòë§Ïoo—>æÈ•Ãrw¿ßï:à !#ù®ïí}w`†ð&~iî ÃËjSiÿrZwûòÕ{üú©;&2ï3ù!:·ui ÁÙˆªÁÚÌZwPsEÍà̤5²0@ˆ’’έ»¡Û9 m‘OT$0 Gs0k@#¢[sS Üì¶ °¥Àn 4SuW4!ãÒÃýáþî@1½^ëxõóć!äãû§wGÌ$ÊfZ×Å[­ÍfèÃ!Äa·O1%ð÷}øÝÓî¤gìºîç1¾qd⸹âsü链¼Ÿ_êÿñŸ~³ïïÑW“8Ä´#vk³4ß&ç®)Us¥*æœ !öÖ¦ÖÈõáápÿý7O=ùôZË n.¢¢cÜÄ)EõAÉ+ƒh1°mPMƒi ‘˜sì0”³#ªˆikª&ÅQYÌÛ"^šÔu– ‹œ® .Ó¼Ìå<É,üÕ,wû.˜¨pj®ó<^F‘bªî®ŽŒÜÇ Ë|­­þ/¦Þ£G–,ËÖÛâ3sâŠÔY¢›õºùÀÿÿ” Á×M´¨ê®ÊªÌ+#•‰sΘßDÇèpp07;{íµ¾åî0HÀin€ÔïvÜekÅ9µe±¦”7›í¶‡äD̸2Ñ‘™9ÇDÚ⪸Š%.ÍÔ)…È!ÅcL±BˆÖš¶ª²ît½µ"ËhóeœOó<_#¦.ÄŒƒÉÖKß™¹ —¦nÕ‘CÇ€p›*:F@²€²"i3"72 ^ïô*ÐLÑÕЈ‚ 9ä…\HÎn<µÎñK•ŸŽã 8íÓã?¼ýþwççOïÞýÜê ä^JK-H¼ÉiÓ¯£c3iU§i:×ëy)³3RˆÀhàb ‘ÌAÕAÝÍÖ(€™Öq<§ñrœ.¹Ô|K8Ï"¾}<¼Ù½y›÷_Wè—"U‚­•ó‚Ó<^®ËùZæEæy1·œRp4dƒóeÕç䟟>©ëËËéùÓótÑë,QÛCxøzJ??]þãCºŽ÷œî/-‰­J.­  ‡[h ­ÿþUKZ·[0ŒnðyûòNîÀ‘ ݈έ½{’ç«~z©÷ûé°åÈ%Ç9@=ž§AÔÁ»E¬6÷U.FE0$@G3t»aÿÀPMˆq=7õ[ ´¦„-ˆHL©‹QDj‘+”œ³¸+€§SdmZ«ˆÈzæ^ýHèän  ë2û®ï».¥Ðõ)çHH`.*Ó4×en¢Sßu]ŽC—öÛ|8lvÛ¾ë†ívˆ) 8‰êR–& ã<OçñZÆ©®éB_ÙVîŽD„ÔDkQt4£Ò¨ˆBA#07Wfº2Ñ­¶m­)ºÕ’ªB­:Í­‰¬¥gªjfÁ4¨³Aâ.zóØøJ_] ¿Ðp½Vèf”Ck‘kŽŽMA¢»+ÒÈÎŒ Uq33•f"¸®TÄsBO7¦øR½­@$&‡[G3!»¹ª!¬š1¹#(¨HóVÑ”c¤”¨6%€MŽLxSžÃj/uJ¹CbS1©ÒšJºœ˜ÕÍP1§ÅÂu²Ò½¼œÏ×¹èe,—éXäÐ69öÝ Š;ô)$&muÍ”äœÙPê¬åÂDCŒ@<$B*ÕZYT*±äˆ)ukî)ÒX—e)eQQk À¹£™@Ôž®/ã<îÒ&…4×r™·~ÛK—ûÜÓë.¤.=½Œ—Ó…ÍШ Uh35*ÞÕe#ÜI ª‚8xGÈØF—YÝWKFg‚ÕIê²îp]ùª€…º.Ç40vÔ¶aajÕ¥òM‘ÀÛ®V«ö:Š£1º£êmk·šûÍÜÖûÝz[ ¯Ý] ì6,+4ñÖèŒ"`dVÀiQ‘b†àAÍͤK¼@Õ cNœ¯©îZu)mœZ-Z«Î¥Î¥6õõµ›ãjãs@[yªH€¼®èWÝAV„0“¦€)¢˜´¦A-¨³x[Êo6ó›íg|9˜˜‚Ô¸ÝÅa“Íô|yÿùé89b L.µ67C ÄÉ1À­Ý¾t!ºH M°¬ÑD,MT*)€:ƒƒYYÔ\ h-J›×õRdJ9ª®“’¥6CN [­K±iò¥9¡ó_ðãÇÏ*m‘&ªhæF!v‡»½C;þÈõó~ðÝaCïLƒW—Ú0v¹ ±7¥Ëéô|1[ϲv¯±ïøö÷õïTΧ©Iq³HŒ^Û¼Ìßüë_?œf[$\&=/ËtaòëÒ_÷û»~›.—s©åuÿÍW¯Þ† Ô e®õÓÓét=dÃy\AbÌ_íºns¸Õæ“Ö)˜}ÿ˜÷ÍÝìÝOÏ×÷§¹xhÊÓ"WK¸„Øðçëqósy½õ·›nŸx膮gœ cÁ²k’C`à@ n¢­•¢¬dj‰˜;&ŽI'|ýêÕßÏýŸÞýòþòÑྑù-0æ¨æ&- A Òíx¿Ï‰XŠJQ‚¦Q¦e1e×5+I.ƈÑD–9ÒæpèZ›ùù4žG©¥™>ÇýÝîðøæ«7ß67;½|>>ër|:~že¢çO᯹¶ûœÿîÇo^výa;}ûUþ×wåÿúãÓ‡Q ̉À¡~xí\6ÿ›õýÿüË?¿ÿù¸Ûòþpÿõ›4(ÕË|=žÇãy¸ÛçÃAÔLÓþþ!þ~ûñoŸ>?][iÞd¢p¶Z%N%hë#¢Jk%¦.¤̬Jsv`¢Üuwî<ªikbU‹RT1#q'„MÌýf«˜¦ÒZ©^‹–i™¯ã|UÓ¡¶¹ÈÆ j™áüSÑVÛØê"x½ÎdMæk<<¾Þ=¼R°@ír>Έ!¥Ü0xkÅj]+æ& žúÍÝÝöî^MÛåÒ,õ­ c­z>SÞt›í>‡DfÒV‚ymâMUš«11òºéAuT a·Ý Ûmî‡ÔoC7PîØZÓ²¸¶µîS¤i)årº|þxyúx¬ -Ä»ÚÆRûd9p>ì¶ç±ÎunflœAÀšS@_«ÀcBŠäbMTgÄž>ä@UŠJ!2“‰9õ›Çîñ-ç¹Ér./ï~ùçkO ¡? ½(¼ŸËáZ¾ýÃÛo¿~óóOz>?·riE«YWŽ˜CL‘SpPpE„Úêùr<ž^ÊRŒU›ª8¨»8°»iêW×ÁÒš™,óx>§óÙŽ8-º4Íýî›·¯¿ÿæñÕ}¯ÈçÙÔ„ Ji/O/?ÿòéóÓ庈9æÌý&ÝßíbÊ€n êü矟¥,&cNÀ1Œ³œÎK™æLåÍ}ýfsx|C»¯~z±ùÛõ—c^æ{èäD+ƒo·y@6¿If~óÉßš±ðf€/æp0Xï @ˆkrl"”Ñ(˜CsYæùòüô|·÷»m¹ëbЉ›¯ü•™"ŒSUgw7fŒ)pkÖš› †U1@ „„„H)"Q-µµ¶¢ý˜9¨¹4!"òRë¼L17¨µJ3P‹”·»S.­.¥Õbµ´Öª ¯Ö ‘ÌŒ€ö»þþî0 9u‘ˆZ“²TªVÉÉ-!nû¼?ì6Û~èãÐçý¶ÛlºbL8‘I•fM´Tçz>ÇÓ8ÏmYtžkYÔ Ði Ù­6Í*6Ï N€, ŒÔÝMÁ€Çô¥ñk-7ºÌÁ €Zƒ¥ÔiÑeQQ_¯Rp^«Ay=d¯åb7ñÿ–E\mÔ´†­ p- ¤ˆî-†6DËhCˆîˆÞ!²çä„äʪZKmÕÖÔ¹(´ª"nîÈ$Œ(h`µ¡(;¢ß|?HÄhÁ@×ö¡u ò•x$RÍ(€ˆ×æ"¦ÃÀ!–6OË’È»òªa¢¹¯ÈnЉ +QUW•ȬY©ë`/eœK®Î¡Ë)Ñå<.“WÙí7w‡]Ÿ8€«»ÄÀ¬¦Rë4:SbêRØt]íúçg»^'Ã’$Æ>RCµuy‰‘ݼ"Ydàb$B9§RºMd¼4;Í˼XŠ6Dˉ‰Ù É<°©WL³ŽEFpr#c" 4m³,¥LË4N³êÒ”¡!ÅM˃/1‡ÉtiMX–¦è< im*šԦ¬ D#à X7ËÄ‘HmªzqhFˆàˆÎä` NæƒÙÊ×R·Ž´‹Bˆ©g@êB žç¥ÙR%OÑTT¾DvÜ oa•t‰€ `H@¼ê+Ús­–77ðõ£ŒäÁA™ÙEAœÁˆÐËâ—Éjó›ñÌ”H™PT˜«›´¶0äà2Õ먭Qk^«–&êF¨èŒÈ9 #Á—³;"¬/òËb`­ç3KÁ{Æ>ÓÒp^hi¨Æº¦õÝ oJþŠà…uié ¾ôY_?l^¿Ùmw]4ŽËñ4>=_NS‹)¹XU5 Œ¬k nD3TäU2wFbc#uŒf\´ 30{ŒžQWÿž)˜Bò.A—cN\KsS „k7pkT›/ÅÔ™ChÕNÇkËÑÎó|¯ºÔ)oî®….ry·Ç—ocÕœ½ 0¨3qŽý.å, uTiB+J§ ÀmšÆóy‰m™g/K)Ó(¥Ø8-ï>>=/ÅbsœK›j+µòXED¿z³ûÍ÷o[/ã5wÝn·ƒ²,ç+¶òrº|úôÒ•×1>¦áü°ý8ÉŸÞ?ŸÚRyKqk@ã<ºŽŸ/å”Ë›ü»¯www=\­DÎH¸4%ó>Ƴ‰+ÄØÚ¡4 'k¡ƒúÐîCŸyÛùï_‡ÿöÊl~•†€ `êÀ;ÜDé¢lðê«îÍýÐÙ­(X¬>?]>[s§*Æ1ïwûÃ]Èyœ®Ççgóêõoüþxº~þt€sH9å~÷êþðp¸¿ÛßÑéåùýOüåÏzúx^êXŽ—ñéCOóõéùÏçñ)Ó}ö·‡ÜeBh hªNàj^m-ÿTkÎJIke±FÊ„­:¬$¦¨–À“¸»¸OsUT¥RšI3™çér¹œ¯ãìmSã®æÃa8¼JËte7-Ëtž®cNDüy<—ë…öÛ-…‹™#ƒIem0OírµÚZ¤9†RkGsc"u ©ßæýþîõ«a³¯c­P•›BUó¹hi,xÊ}T—¹.EÔÄÌP˜”AÀ8ÇØ§®ãÈfÖDRêï_öw¡Ë”„`Žzû4š®']= o7ûWqóp>¾4iµá|m×¹Ì9ønH}Œž;m* ƒ‚7¢äĪ€LÁQM7%@ô€±SGÐ’¡±U¡8 }÷øÝ÷Û×ßÃùéÝ»[ž?þKÙæ^Ï$da9Ÿ/ÞµmŠV;¯‹3*jÍ sæÈ´²´² á4Ïãxn­º˜«4#ÇÁcD¤æU¤©9xtÃ& –R§óy:/§Ó‡ÏóÇc:—~V¨¦)Å7o~óã7w{)µ™;2¡Š~úëÓ»w/ã$ê`ÖZ¥û»×¿ùá«ûÝF¤}x>ÿôîô|Ë,꾇.ëun§QDÃã¾ëv›ÝÃ!í§šþóçëOïæ±v@{ǞЄðWFä:©8! ýJÆÃ•°c€N«ë‰tm›¢5’jnˆŒ°²«píl°Ö.?©¥¾›Œ›¼éÃÐbCbL)m†Ü'Ö"Cß'ƒ bó4#Z×§²ˆÏK©­:"º¢™¯¹U5„µÜjm"B`âSVÓiš°6­­Am À[“ºTWÙlcßuDf)dë³fÞÀ !ÆRÀZ›´–ÇàÝ¥N­-K1±Â0t„9ÜöÛÝ&õ±ëÒ¦ï†.3ÿJD3¨b¢Èj2MËé<ž¯ó²È<·ij*7X¸ŠzSmbKÑ*¸@qe£¡¸brD07D'@¼…ºÑ §YO×Z¨³;!®ÿke üW›Äª â-X€xÛã Ž´ú/ÐW&¸ÆèCOü²x[}:+æÔ ÌB€¹KˆhîØ*®N$GB$GBæ@¾¦rqµø«‘ª»ƒ¹0º­ƒ ÁJ®RÓRu)W3ëó¶ cV'Sr£À™ƒÔ¹Ì¥FZ!¤l¢¢®j.ÅX(§)%uPÑ ZBì·}Ÿùpš/ŸÓ<ÎêÐîbZM1ì6Û‡û». H5C9õ{¢Vûy¥Én»Í¯cŸú•Ûš„Žc$&6Q$ï8¤™¢¹#„À榺ÌMÁ,pÚ¥~“I*¸®‰—9dÍ‘º(!"»x³:G¦DCLÛÑ|4prC0B ‘Ü¡Xr̳^ž¯á%/ÇR PLjhèìîd iBA¸ ¸ÄðÌ<3+bE•àÌž˜a]!N¶®ÀÈb€µ¹€£Sà)†À!l¬qYÔÕq*cåF8âZqç¿ZynçÝÚuK/®çU„Öj½¾×ëŸnþ@Œ€ˆN+Ɇp]¬GrTõÒÌÝ ©N3.%9¦àæK ž§H}“ˆµ¦*èàbpºÊùªM‚€3qbÒUh1gãà˜Ðñ†¹Z u`¸îTÝ™¾üÎL«»¦È™8Põ"(`Îtcv9¬5ëûX)áæ`fc¤å›7›ÿþ?þ/÷ãá°o­žNãñx—&Š  h¢޾Fuuu„¨®‹‘/ÌbU“Ö×UPpÀ×åE-FËRn ÅL]oìÜÍL|m\AŒ€Œ¦ @È Ä@DÐ}¬!Ñv»í÷w›i\Η6køü<‹,T¶ 6›Gˆ!‡ÑÆÈ‰!Ú²¶<ì¶ûW¯û^>¿ŽëjèåÓÓÓûwãõŒˆÆi2ŠŒÑr9ÈièâÝa7ôaÓÑW»s-N|½Œûó»ãÏÍnK“²(o3:O×óÔFæi™çKª‡mÆäcgb^ j8o† }¼¼Jùÿýc—¦¿Mé ql Ü\El†áÛ·ƒ’=÷»öøú+p`q©>βG¿Ï\œ„²bÚ¿ù¾ù¾ˆüÓ?ÿs½<ï6ûß|÷Ýoøñå|²¦—㥕iÓ‡ïÞ¾ýîÛïîïïRŠ¢ŠQS[¦¥•’Â͉ZšO£M ö¯~÷ß¾í·Yþ\Î×ÿõ‡=¾Ê¿øö8Êøé™T˜)Æä—ùúïþysÿæ/—û?_]šüÝßàÛû7çCh»a;Žz½Hxž{Tùøñòi,ÇK¶ÚeØîRÙ /§ùå8–‰åÍý°½ëú¦EÁŒ¦¥š˜˜€ ‹Ù¢^@f)×y™ªb^›]Ø)`0åZ0`€@âºÌ“/.NŽ Þd9_/ã\ºáðæÕW™¨ž?MÓwØ(4…e穯Ӭr¦`Û®¾ySªM–é4]>#(šö—t=Ëtª:äs]®!vûǯ÷o_¥Ý!õAkìCpP¢9’’ˆCiÓõÚ|:•¹D£»°Û„."Ä~ö¯úÍ!Ä´öRH›~K±Dmæ¥j-R«©­AJf )â˜Òæ. ysØŸO¥,"s[Žåü©Õ«xÑmª]D„ B`hxC2w²Uª$B0‹ì Ý\êulj‘ Ô0"ä€àµI (1&¶È´pØTå*@q7t²Lûÿþ¼~ì2wV¢7ã„Ì´aSTÓM|šëiœÆñ\KAgtPQЖ»4t]—;h­57d¦È ÑÑÍÊ4žžŸ/§Óù4<¶ŸyÖ£m·éÍ«ý·oï6É—ñÔšSÌ1/e:_–_~yþøù¼4æÔ‘5iâ¦ÚZ@=lI„?¿è4×—ÑÍûMìÅ-K&{8 úÝ®Oû¡az>ûÇçãß~¹Ž£ebw,_Ò¡_Z£V%m¥e£Üz˜àWŠÅ—çìº|—wM€ô_|A¾>=W—Þº–BˬCö@]“¾4™æVš”–Ô:QXBÄÍSð>õCßu]s§ E.ÇK© GŽ)ºsJª8†B—ˆ:B#¼ù‹C`b®µ€ÅÌDÆq*ei"ãu¬µv]¾?ìû¾Ûy·Ýî·Û™îö»ýfË<¶VQÚo­©‡D¨Ë"ãTÇ©ÎsçVŠºf2·RÛR[hJbkëÐ^÷·41!Ê­ÒàvZeFjóbó‚Œoî©53êh·äÀ—]ÏÍn…n7;5 ݈¨êªˆˆÄjÚ¡b©¾,`Ê„ä ®µEÒ>QŸCj&š…5 kö„ˆ‘Ð]ת˜©"­°"tƒµâlƒ"…Ȉ¨&S©"gS#Ûþq³é벊@1vnäŠ ¯AcB2Q5m@D;¢à ;ÄÀÛ>?îåî|Çctí·ÛÃÛ׎Ȉ]] -ËmE´¸š5°ënпûñÕÿÃo¾ÿö+¼\—§çñéå2/Í)­^O3¨ÍZ5S[kÎWèZvyƒ098Š:˜¨) Š»0u1æìÅ\›‚;é þ4GZ³>hÒtœZkhæ.N·4`œGÖª®ê ŒÉÔ,DÚöÃnÓ-}¾Çç³,ÅÄA7•iš›da_Z“õŽ—»ØÇƒuÖXM @ÜEÜ!¦üöÍÛ·ß?ôñóÇŸ›"×¥}þðéó‡Ó<Ç®î^S¿çÀuÑVtØm»ÇÃ°ß ýÐGFBóÀ©ëb5¸œ?¾ûé/ã_ÿóÕÐÅ@ÌÕ¦ÏÇâeºløñ¾{x¼¶Œó¨ãXæ[Ù!þ··›»»ýÏg{nÓtYª(0&ˆ=å]JÛ^Ú ÄÈ1FÄ”£@H̬UDfä‚QE#áv;l؆L¹KÅÛ˧Ë(—ý¯wÝB#!F µÌm‘‡}þíw»C¬åzTjƒ›b±!9») —v—æËÅ9nîî^}óõ÷¿ýæÛ_½ùåý‡wÿñO©¼Ú>ì;Ž®oÛý?ün¯/OŸ´,‡.îS¼ßô±¶VëØæ—6½Ì ™ ÎK¹6YJ³ª]‚OÇszzúÇo¿úáwßøÜö;>Ñõ??©h&  ,~9¾üŸÿ÷ÿ¸ûýy†Ð ãòòoÿòÓ+×ðíœÞ„a»éÿôómÇÞ:B>~øt}Y #èQ·Ü^oû¯:þˆðyÆM—S fµ)0åÀ¡V[d1¤zDnZ­­ì#À‘ÖÍ~´†cÑÊB”F“V 4 n‹ÈT–Ó´\ùjûæ»ßÿáq¿úå?§eŽ›{Îp:Oµ‘åÍ[E— ¶ï^½~óæ«ó8þÛÿíóÇ®Áû8ÇŽ5úÜ¥«s-¡K”gã¥Z]…°ÙñÝ! ”å|©K¹¼œkm!Åž!t±ë†Vá<Îæ“6˜K•ñR«RBŽ]¶›]×g †n»ö¯rÞqH°²’Í`»AÙÛRÇKg¸1Cès (Æ.Æ”7»½˜¶¶œ_>=;/×SÕ±ÉE¥´àœbÏdi`-D†À h^T«:H5«uJ‘ö÷ûmNó´<'TÝnò.crÈ)7>ןÿôoñé9u¡-§ñü wû×o__®Ÿ/Ñ}? &õz~þå?ÆÝ~hetäÕ.âà‚MÀ!"ö—ÉžOÇëù3y!»¹æº”†Ü1“ÜZe‘p}ºÑ¬Ò¦ëå|<Ï‹Vï‹Å±uÅSLvØåo¿zó°jÏçQ”7ÛCLƒ™^/§OŸÇ«pLn`®›>äÌ`v9¯{f¤VE „ °Š\«>m²Ýï=o„øéÔž_&móùºœÎ¢Ò‡HšBuW*6 ­ ½ùüW4þz–@G_à·ö(\ßî ©_æ‡u…Œ+HljMÜú®ë©›‹Œã(ZšxmŽà¢Í¡MN×i9lïÛÍn³Ý昨o»t9ŸÇe6­@É@UÍÔÁyU”›®#ˆ1¤˜\Ý\BÊBu1Pƒ&²þ€õÙDO— ™ÐÕ°-I-çÈ‘h «áJ·iµ¶¦ª6-*n¥Ô2O±Ë]îòýÝvØ ‡Ã¾ïzM‘6›­žN§ËåŒè›Í&玘0FFà‹ù2ײˆ4+UJwW1¨¢µ´&V”Ä)!¡!®ÜÎê.ÐÐÌÑ”€ÜÜ Wk€×*KÚ©£*n³à£ÿ ÷€/ÀíϸBÝ~âÇ\áPn„˜ÙˆœæJ¥ZW]ÐC Qú›.D¶õ  9&Bsk+˜VꜢCŽL3¨š¯+ ‡µQœÝÐÉ Q(pê:,y*×yYªZæì]f–ZJ½N¹ïs·/ „ÁÜÌ̉9%àµwxVo&˜ˆ"pÇ)3oR‚ˆœðîX˜½œUæÝæ!„àb‘ DCu_j¡/m©‚çÓåùé…Ï#uƒçNC"$Ju6§: nVËLÔ8pUÔ=2††"»€U÷fÖ€,²m{ŽÖ¢^÷Úª›:ˆ¸!¢’6ZäÜÑD©Í„8’B"wñÖÈÌ|YDT…8£«±9º™ƒ­èÎƺ4+¸^–¾’iJU1ôµ™N À¢ARO„AY ºx$Œ¡(ÖÖ]¯™hÃa7-p]R™›;F§ðÅ£¿ÞcÖÖj°uÇúkDéfS[¿õ/îKtgss#pB4 p¶uB€ðÁMM!pS¬š"º3@`&D5ßtôúŽw›.w]JØ=DŸÇv¹¶Zœ@ Á·›°ëƒ«¶æ6é"ÅÔ38ßÔ…•³õëË0¼wÄy©PššŠ‰©ãjÒLëLî´ÚmMV£ƒC@ôš£¼yì¿ûêînÛ·¥ž.ÓßÞ?½ÿ|¾NUň Ý‘,˜‰ª"$z+hs\GV4V÷/ ó= Y ž5Áqö&J„™YÙoq $ÂÕÇyëa@"îc¬=ÌÓ²kâdÍÐTÝjdâ!é¢sqñf(‹‰:C“jî!pNÔ%M¡2 !º¨NÓÐïîï_}ýMØÓü|:–ZÀ¬LÓõ|™—b¸ë7w¯0ïdlæ-%W ¡K©ï1»y)úþÃgu«ŽK=~øEÎç¯;øa‡Ý6ÿ´„útyj°Ç92ž$–I?,>,ø•¥o_ïzÌD|$+›‡Ã7qûø‡Ö¯U&HäÞ¼‘kdŽ1ç"¨…¾Ûî‡Í&ƒ•ñôq9}¨¼ÝñC'õôþÃOe»ßm·}Þ ^ýx9¿¼+£V®oóvÓÀçñ<=¿o—÷=•¾ë‹XÁþÕÃf»ßl´É§ùüÇÿ§ÞÎ?î÷©ßöo»ûOhIÇ©ïYÕÌâ0Îó»÷/iè¾}ÜîÉ w0OOËK”}& fH ^êìÏÄeŽC ™)²ªj+s"þêÕ°¹¼ÉšÁ‘1FR(µIñМ›Š›{N1䔤Ö`Ô&bDvµV›è2Sœ˜RÀ”Ij]Œ°?Üñ>twwØ÷Û·_ÇÝáåtn¡£n—wÖÝ¥ù 2-ÇÏ:·)`™.Ÿÿvϰ|êèjë:B ”{Þ÷ièv”´…|µáZc­¤¢Ì¼Ý#ê³.­^çZ[‘rL]L)—”+Ùœ Ðc ¡Ûlöûûû‡ínÈ9†Sß§Ü¢+Û×MdYÖÎC7U5qS0t怸VÕ¢jDb—Bˆ°CNqŽeyisßæËµ-,¡÷¡…ÁÐÔìXjƒÒQµJ÷„äÈ 0ö)vTkdèB@›®ÓtÖÏïL¬0Sˆ1uCÀv]9jhð»Ëx¹<‰R„@àΠ‘ ·â­éççez²ÏÇ“ÉÔ‡%Óu­H´¾Ûîv€.fâÔ¤Vm#Ç€"‹´©Ôe\t’$‰#ßJʘ!´ª×ë<Í©oJSQ[–&¶ßoºnw¾è‡çÓåÂ쇻a·íAÔ®c…ãy®Å&sh)ëÛ.Î}ÂÓ¨/3.µFDäÁ1¸ƒ¹®Ê× ÕA€ê ÀíëÉn€}C_Ï‘·ÃâÀÕ„‹h+~Ã@Ñ nê9FG_Ä`Qu ÑÝ Eæ!†ˆT«ŽsmÚá˜|ž¯/çºÝM‡Ãf¿ïw}ÞØ_ðtkY–jKiµ¨»!2ÀZÐ`M Üj)m)侺È#çġ֒SÚí¶5ÉõºH©7¬±ª¯p i©p”‚›Im]N÷‡(6dN!&w«UD¼6[j«Íšš¹&Îûo¿}õÍׇýSìº.ç.0Æ€­êûw~yÿÁ\îîvÛÝ…À€14,U—RÆqY‘•ûy+`&2Q1pfaeoFòЛ©¨1Òš¤nj­éÀ‰W½u5uym2/m®¨Ö1G¼ešm= Þ:Õnx@°•µþ¸Žˆ„J )2qªÕ›H Ú !…ÐÄÆYK fÑC°.sSdJ¤„æ¦ö+T}eO1©£Wu§!1#·Ö܆> ؼ;9ù-ª¨nZZ¡(1o÷‡Í2é²,Uåx¥”†È±ª×¥rrŠË²T«-(¹0qÊs Àl‹ˆšƒ9š¬ðý‘]e:™Z£NnV'- Ôe™d¾Ž‘Bì cæ&`†fµ´—ç—§ŸŸ>~6³®ß&›~GÍÌM׿e BV×f®d¼1¸7 Ë9ô¹ëRšXkÈÕŒ°1‰Z«šBØ”bÇ5‡©7«ŠL"-Ò&pŒæh!@•ê‰C@wm Ù1#“#˜1‡˜ˆ L@ÛÍs@#›‚U£á"¹W550s$@WTeCÆÞh¨F` ª®ÂÁ°KØ…ÌdÎg|>¢9„`Ül0fwpd#\]—ŽÀH 7"­ ÅmÓˆÿÅ·¶zØWéQÁõ <˜n»J0€†¨7þ?Ðm¶DoH†Äˆ¯>Hp4ðâî9àn“¶æÀËR—efv/UŸOåtÖZ‚C œ À¬j LLŽ&UM¬I:À€ÜÈußÝ*WAa"‹28™1è•)àÔŠ=ct0qkÎL!Úã>ÿðÍããý¦,ãÏ—ó/ïŸ~ùtºÌEÔ‰XT¼8818Þ2£#E¦5?D¶ö‘ýö&f\]] «´©Fu€Db@˜€Ée5è¥à1– UÜ! j±eÉÙ|³zDVƒrº4D΀¡ÖF¤ 8âv—µy¾²-÷‡þ~}®ìªîMu-EöÖ=»Š¡òöán{§)|:Ÿ¯—óx>[+ä"evµÜe ›ÍáááõW7'w¶ƒ!Lã´ŒWk‹©ñé8]Îç§ãå4-Ó¼l¡þaþñÕëï{ã.É5þëÇR xÜÇØŠ«ˆ!`'LÈX–Ïòt~rÞÂùïïùõýþÉÌæñT/#¶éÕÝæ›o¿ç¸ù×?ýõç÷¿H`MQAC1äQÚ$Îèfúr¾¾?Ïéþñ»ï1ǧååOï^>(cÎÏM/óåÛ­~µÍ}ªÆ,|7î`½]6±>`éÕƒÖ çpF,!5FD.Ô–jÕ)ô ã@!pS¨µÌõ\Ë~z÷žºµŠãåÍ$Ç—_Æç9õýÐ÷¹Õr=Ÿ_JyþåoÛm¿Ù ©OD d¶y"×¥Yi´;¼úîï÷›ßýÐþéßÿå—þËõã¿–çݦ-È»oÞl¿sþËá4[ç&ÍÕÐ7Ûí?üý¿ÿýP®¯ÃV€.ŸDŸŸGmÝØ|¼?ÔÏS»”Ðñfè†C ”"ÒZ¦ã<^"лmŽ&¶2¨ŠˆcÌ=§^‹Oゾ ‘VЏAKËÑŒ\S©ÖT)ö]Ñ"µ bJ]Þ ›ÀT9ôÛÃpxؽþúðê«ÐoÂÕ©…mK4•"õêx{ˆìº ™U¨Î×_ÎÏ!Àv›¾~–/KU3F2mîºýC7lB[šÊ‚$p‡˜ÌÄenå4ér0d`TG3E É6  ˆ"xèJó¦žsJ9Ç´¡4pÌ@Q |eikMW(j 殌©ëˆWyÏ‘)çSr€Z ¨)…”2rpdÃîñ›|ß^—ù8ŸŸ§ã±^ÎZ.K=¹M)PfÖ¥É\µ¡.âj”bâúMàx:N/:¹cŽq“ƒ×ñx9O—FÆš= ×Z®e*¦Ú÷˜ûçãeút"õÃnŸâð×—ÓeœrJ0l–åÌd9'u&êrìS>™¾{.çOïfKÄíÕ8j!ÇZAZÛ†bVµ)!…@ê¶,ËRÜô) R èé~¼Úuéb +Ìö弄Ÿ?ßr Ø{§<×öòÿõMŽ%[ºÝ.Ž"uUݪ[ÝïõSFŽÉ9=¤=šÑÚZ°«o‰”!áî[ppÕ9ÊHËL³°pÜ÷þ¾µÎçüûï_ÿå»w)ö¿þúµ­ÿX‹uC>\]Ž`H§¹Msy>.&¬9Cà6îùíаdª“”‡êÓDØõ¯ß½ºóù¸~þVæŠîÙÜÑȈÑ8½4=Íq#ƒ_\`Û¨ 7Eæöµ»›»›*#GàKØ„LÑ l´ì¹Éª°‘Wô2$ˆYš.E›`c ±4ó2/ÓÓóãÐ…Û«ýÞÃpeû¦ÖN³;†i‹HS%ăH;ÏKkÚå¼Çîöš,¨ˆ†È@®.MDš›¨úÈw÷e½Œök­Žtƒ@h`² ÑMµV)ŪXC€.‡1Eº:Œýéý÷ß¿>Œ¨YbΉ‰PMOçùîáñx<÷cÇ1†È10(á"öô<}½;Þ?Ïç©VõÚÌ|Å»6Û&ŽDˆŠà€_‘•¶–¶‚³"š¡êVÍݎꀨ†ëjóꥱ2¹(ú%g¤Ñ ÝÀ@‘}£b:ªo:±غÄ]„À‰£ªÖÖÀ!†œR¨‹P³ÈnJq?„œ˜ØLÌik(nãK&00U4ETJˆDn°±b¶Œ$G|¹"8©ƒ‰×ÕØa$îÝ#ŘÛyºË-wy_Ä0Æ< ][ñÚˆ€w9ì¢ ˜©¡º!h rl† ˆJܬ´†LCYÖU|Üsæ¨U¦óq>SÌ=`칋1ö]-K-ëy^?}þüñèþÓ?¾~óÖ5¶¹sI›ƒ8Rh¨) cp/*U rȉ!¶æ¥X5¤r‚Z 5/°A«ˆ%¦à’Ì-’‹ƒéÖ/Õ¦‹“ÄÐ'àd10Š­F 1v¹ 1‰ú²õ>i;á!²˜ hðÄÄ ¶t‡“*cË1S¬R›RÌ™Z3ð>8Å@Œ‰š4©æ}ÇÜDLQÂàÆëBU6“•2"2 lÀÙ-á[S/rr7£ ¦vû«/_m º|f“!òÖ‚ 7x™J;90º‚‘ÛÖ‹gv31/„µ 6ö‰¸<£I1©ˆ†Íp^ílÚm;äªî²±· 0"°(™!!¢®Õ Ë¡Ï!’7S‹˜¤K-§(žJ#Š€î€MtY¼¬ ;Üõ,¿Ûßî®—åëã¿ÞO»?¾ý÷WÝ›®Ã«+˜¦jZU£›Ý?žžåÁã0||ðߟon^¿ÿÁËùîéó7èÀe6•W‡ëŸö{Ë^VC.šҮǴG m–fÚqíD¥E­ª³…X6Xm`Ù£p}Rѵ6të"^GÂÒli^æ3¤Øíb?a]e½8Ëó!¯×8Üìú«·Ô¿yjéùù¡Zí{jOóÔ¥4«‘s>ßOOíÑ?„î¶=ÙC™¾~^UˆŠ€nìî ¸ïÂþû÷ó÷–‡ù—Uó„;L{ëÙ¥úddÊ€)FJçWˆà EÊ\,B7ô]dÝ’‹h¨ÌÐE[]§>…Xf?/ka^!—¶ùÔ%dJÝ®Ûg¥’µÅ)Å~8¤~_›¦lïÞܾ{ûöõ»·¾‡q¼;M÷çòpαÕo÷ŸÍlìb{üXî=d÷ÐäXšîó.w)FwTLÄ1R€@B£ë`µ ©ÈXb É‘¶©`ÐÀ‰‘#r¨bË*,̰ ¨@îò0\7ãqF€‡€(É]UÊZæ ܇ÞÓh®jˆb7¦7À22ܦ“ÈËÁ¤ÕÚÜS—ÆqãÕ(7õêÍi÷ð|7Ÿë¹k˓ԹoÂ¥–¥­UE(¡S B_‘ªCÀëw@O à,–ƒdæ=áê¥)ÐÔpj T:ÑŽ¨£ºzXšœêR¼0'%v Ð 2cWk7­ùëÉÿýy},Ö÷õ‡[¸Êm„%º†çÆ :à™@ Hdg4ð*m^æ@À[Ï%üqŒÿ~Ÿçì´11A|8•RWóý÷ß½ÞíÆRíx÷8ÏïÞÞ|÷öö¯?}ˆœµÔoï®RÔÔ¥Üg0­«—*sµumfPÎH¹K4öt3†ÕÖ™ëPNéðîõõoöÏOÓº~›L_Æÿ~y¨^Pêè@—<=:€ÛË@Š6Žß´)¹@/ /ÌŒKîÜüÛžf/‘\l¦†î°7 ;u34 "‹‡ŒW»Ðu@K­çÓÔŠÄ?|àÝ÷9ÄS\«£©–u5Õ£æõéyzž–Ò,ç<Ž]בH }΄ ­4Ù¬FàŒògí¦— ¼;::ǰË1wžNçi*kÕÚ*#¾zµ¿½9 Cêºp¸Þ½{÷j?ÚdYVpD ^j]ÖzžWsê‡ÝnRìXÍA¼T{x<ÿöÇÝ—RÝÌÔ h;0@ß"ÓŒÛèÔ´Ôææ,*øê•Ø-Ì™CD ÒäsñyñÒ‚ãEO"Ž-l=nóà—Ÿ•_äŽÙð‚y2«è+bcâýCpQ×µn?^sm­YSW#3`h1¶.Å.›"…K/ÙÑm“fÿ¹OÚ|^d u-fȼTd#'³;DG47pÛÐDèªä¥°4¯Z=@5$¢ùø¼®“I5ëvûÝ0ö`%„`ÎD1GŠAÀšêÒ4(¦‹‘‘cˆ®Äàˆ Ô0QÈ-ÅQ‘¤ æ~L)¦º©ÕÖÖu=ž¦óyž—Ê©»}uûwÿ忼~õúáîîßÿxüúÉZ ÕÍÁˆ†œG&2‚À!7Åj¼*Bq/u­fDÉA ¹ÃŽM¼×^Ìsâ|MV[]*(°3¸!-DÐ3b¯ŠUšSK‘û ´€2’£¹ QN!Ç Óšj ‘™‘Ðis9‹x”¢##YÉ”bˆ‘­6qe¤l˜„½0 2†Î8X›©k¥· ì(!Æð¬ á%سõŠþãks¿øH»4×_ìàîHvùäÙœ½È€aûÏÐ7è¿ñ…"Š(8¸(¢l©úKŽ]+bIAw÷ÉÊRî3餜ÔpZ}mѬߚ¬º‰ÃX•JÑ…­6;/P5nôYÚö`°åø1\v—嶬à—la>Ü*Z—+´)˜ƒ«#”@s¥ÏÐgÚ÷ùÝë݇·¯bÀÏ÷÷OÓZ1X+«1T H EQÅ[3³Û! 8mÞ“-›ä*è|ѯ¡(Ù†@õ°s·]cöÕejÐ4ûö" Ø™m]]%ÀåBrd6¤emçÓyàõ«Ã8înÝï[3"ÄÌ‹.U€˜Pבë‡+øánûbeÓ)863h•Àè²pÄ–‡<qH„Þ¢—ŽÛ„­²t‘ûœªà×£Þ?“=§Rì2§¾=§Ó1ôã²Ôi)ë,ÇU>Þ¿=®eu·žEÊÌsk†G¡nlNQÌT½!9`Œáõ«Ã®ão®Çc4. ¿<>ìÂñº‹ßߺ=X¨eþúm9û§wwëRÊdq~Zwnp?Þ¤”òÁá´ÎÖ–Ôõß½ûTÃ×_þñ_~‹Ã¡,Rh¼Ê×™dïÇC?”ÖÞ¦èõ¦•ýúHh5Ôb :Žä–ƒßìw¶ƒßέ2uX #avd °ìEQQÌC2£ juM L¦•AR¨ '“ÖkAe£·ŠA[çCÀ·ÿë* IDAT»±Û' ƒ9W=ÕÓê˧‡/˺ïûº,]‚R@s^ÝÉôåoÿôOÿÏ·ßþùiÎïºý-1“mÖ8>=ÿßÿ×??ÞÝþoÿƒþi9.œëãávwýîêÕ-èéøxz<×v Áj3«ÀUSèyïSm“- ¥z&På ¤&Tªo¡¶®ëöCëêÇs©Z F4•&‚T¨Ócò~Gä \1fŠ}dN)åñºiüöõéóÉw»ý«×7c×RMNU¸MA—L§_uý˜S)î1[Oë «c‡n7r$÷¥ùt*uw'B`WYŒÀ<±RR’u½¥s sÊC»¥‘™oõ1E }ß™"hmìèàÈŽ!¹B«­-«¬+"J3Rv$ ­”&ßv­è F"7mf*m-ëb-Ç@Ä»Ç~ß„ª.!@}¾]Ïw©*´À˜CF`U“¢d!öœ¨½ 5q‹NjÙ¨ï#0…”ú]Èúyàq×Zy¸»SŽS×¥ªÕ´m±M*y.ü¤ç%>6Z°ßßÒ«ƒ¾¦ì[cŽ"©Jäá†ó­h’ænîÄ­ê¥YJëªs³_>®¿|±‡yºbî 6££\bÐ82bi)XÝÿøÝ«7·c$A‡qà÷ï®úž0hm“ù2Õ©47‘U¥÷¤{ЮÍÁ1„«@ë"ÇÇÓ:„±KW‡áËqªR‰ÃÆoÜúr[çW/E¯‹Óÿãë°Í€Ð.f2D"L€Ûœ 7YÌvÐw  ~o[»o€>B@` `Ô-&ëÜr­)lR#ŒCŸ®¯†qH^šÌóº¬õé´ì÷óÛWã«ëCŽ]Ч¥$Èt$ôƒ=f¾{8©éR—*yÇ>÷áýÛë²–²–D”80.¬‘yè`ÖDMLqã~ä‡!8$JU`9/Çy]SŽWWÃëÛýO?|xÿæ¶ëÂ&,sÀçã2MK«­Ï)¥DêR¦içÕr×…˜HO³,Ë|ÿüûÇ»ß?Þ}»?MK3¿„ÀID°*1‚»Ë6ÇD"‡(—î‚o#:ÞÂü&H"q@REu/bëŠMÂ¥ºÐ\/‡£hnør¢"4s0{©J6ÂÆ([`Û€î@¤@än¶=j0™imNd|ß»š3YCÎL„—9& ½Ü´þŒm›¹ˆ¨¹¹ÅDÁhC GÞÎjf¨@¶UŸ7Ñ:â6ƒ´"XÅëTØò~8´V¤Jì3u±š¨¬0ÛuÑ),ë*çÒ§~×g©OÏóÌxѺ3m•v0#!ZÌ›¢{`OÕÑÈÄËRæ&%Å”RÄ€ÚÚùx~|~>ÏK©S÷Ý_nV‘œ³P¾{žŽËÓ*³<.¶,Íz‡ÔoY9 ·PT˜»3cõè܂ۀèÞjSo5t̉ˆcì®RrU‡(”JG5tt‰¨‘#6÷¶´âBÍG1O`¼…¿Ñ<50uCDJÎDV´ÕæU3pÜÒ?⌀FVŒ°‰ ž(12‘±º3¢™EPæê n&ŒHd}öܪM+ÙšOg>Ÿ E Fˆ°)>Ðð’ç'4ÀSã_œ!  Ùt…Ð.uXô¨_hV°…j6±5^4·´¹åš» mSytEt  9YJ˜RÊ‘PZ5oM°i(‚L¼•é7W"áæ#,õ¬µÙZÑ‘¶eŠã–sbÆKßF/ž] -ã¯Í_ü爀dŽn ½FTÈ Ì’“í‡Ð'J!ô]HwwÏÒÊ×»»§ã²VTƒV¬5q$Š ¥x]­VŸ&“æ` °½lKX@ 2Dqƒºéº+£¸«;$ñ°VI¬ͬ©oä#FE‡X-´—Õ¶·vsWÄ‘QÜK­L0Ï5D@ÌÌ©Ö%„RŠÝB`4еçõö]÷Ÿ¾®®±¶I €˜Í•9ÄÈÔ¤ ž‘3¬,œ :Ðü å[­EP¦<ö‡°¬a§Fç¥ö=»—µ®Ka™õ÷w¿ÿz_ªÏ NeY%`‘ÝAÝ8Æñæ0¾¿Òh÷ÇõËÕú·ûû·ýãõ¸óæõû‡òËãú¨v<Ï3ªzàx^å—oG¶þç÷·ý¾«ÒÔÚn·»Þ_­‹ýûS}Z¦† ø4ùöÇ7¡}x•xðçúØq»éx °‰I•‚ncŸ¯öÁ*Ìåj<ß<ç… ŸÃµüt¦ål*–\ <X§õyvÙSšTÐ-…˜9‰oFwwèæ•INžjî›á³˜C ~ËŠ·ÝþõþÃu:ìêÜæÇOºW‰¦~õ4\½{ûö]X¦Çû{0æp Ýa‹ùêŸ~?ÿñí±¶ºÖ˜!•eúÛ/ŸZ+?¿ûp|;P:¼û}ï(‹­¹ãýÍÞt|,sÑż™ ¬ ,`êR ™Bܤ©^l£È!öbáx^ÎSQF¹Úõû~°¦]ŒC¬æ¬)p ž<žµÔÞgÀ˜ ¸z•—1u¸–U Ët>ŸO)Æwoo®®Æ@¹“󩶺Ê|‡aF8÷;¦¹£ ¦RÄdûá°ï‡1vTMZ±Éb[˜9 °9ƒ'tFL³“º)¸ƒ:QÊÝÐsŒZV9Ÿ`]ÄÕ(ª4ikˆ}J§Àœ€‚‚hµ¹”Zki¦FÀ1ES°RC"ŒÑ‘Ñ éÆè $¤@ÈÄÍ\‘ÜŒTÑÎõô<«Ø®Æ¾ qH!ÒÐS ¨v#”âj¾.Þ ¡“ 8U @ÑUÏUX=DŽn #¹¤P8K¨€Üq>X[š:R5¯Zh—X‰Š÷F;f@/<…á(ùË>NXœdÜáûÛ|³Q×V{¥´O ­{èÎ+=½Ï¨ÔÚÅ<„u™îîŸþ¸«ÿúëéé@9"2r÷È:ô|uèvãȘi¿®ýÍÕþÇ××Wƒ´"²È8&‡¶efŒtªÐ¦EJ«U‹+±‰ eÉ"½/må¾ö;M{['ûõÓºèÕa¿Ôm¦]É_ Ñ/€ =r‘E_R±›æÂª³K[€}#Ç Ò äÑ ·ö3€»!¢:8¹ãVé½Ô7Î6ø'cÓĆ(­ÙyIádçUÁ ¢ÔVçy]†l]T ”€ ‘ˆBǾO] ~µ_Ç.Ý^¥ 3v]ØõýaÃ÷ß½žNÓtš]¡©""Í9]ßr VK)ZЉ¢c¾¹ÞÑé<Ï¥fYæv|:.ó´ß÷ïß½ýùçï¾{ÿêÛÛÝЫÊyšžŽÓÝãññé¼Ìѯ#Ëe­Óyž—ÕÜw7³Zåñiþíã·ŸîîÓZ›û‹s Ea)²VP g$Ptó §Õ0¸+@hDÖ¥)º€ A“Ö*:P3¨Ì"RDÀ-EàŽlN v‘†#’;_kx  ­‘|è°ï1u‘B\‹ÏK;Ï¥ÏB©n¹®Íb€¡§Ã޶ Áöæ·ºa Üñ?„sªP«4S@L‰ùÂÅpqÂa²‹¹ À7-8‰˜¨ÄhŽ)®s™žK>t¤©œj )õûfXçÀZ >^]k_ATÖÚÎkË)$DPu5bˆ¦¢´XPkJb4×eU·”RJˆËºžÏ§ç‡Ç§ÇÓ¤ ˆœs¿»¾ µÎÓ¯¿šŽ§‡§gL½·•ïyÁ@œ1DvBss1UŒ);€noÆÄ‘AªX›¥¨JŠùú‘»€Ôg2DH—¨KÝ’,UQ‘|€IcnZ[kàŒN( š¨¨¹A¦ÄÛpÚ PŃ¢;WqS‰y£·8V«MÜœ#1¡7oÕÀ=°!;@bÝ'ìr˜ =Ÿì<Ñ<FÌ@þ$\®Ž›/À_0wsDB€ô2²h ]pÛ—›³ƒÃ¬ºH/ë&D ˆŽê®à‚nô’¾!w"™!1ö]̉|s;æÌLXÕWÃ¥¸;#¥¸ñpí’“„í¢â@ksh.þtso<°mÕêîõâË<ÉÀ Épk*à뻑B›6×¹õ0ð~Ì»]wy“µRZ5¢ôíÛñÛ×'‘VZ›×Všò¶œ Á·Éå¼ÊZ¼5* U!@C.ÈôBHrg$ ,Œ&€UÉ ™½KØL­ Q…uU4'#~ñµœ 8f·ìŒ„¼lzUÒíß:¬E?9~úZÎs;Ïm¿ë‰zÓ 9‡LÜæ)$¿éò8„¦«˜cˆ¤ÞE» jf¬@bÁ@*³¦àVÏçeRô¡£}Ç`b\ïö㮑3GD|5vÿí»W»ƒþÏëÇs]Ô[mÚÖÛÇáÆP$4§À ÀTL FH½õW‡|¬6iãUv‡«ýÕÁC|„Wßâóó|Zu)GèiÍ^‹‡*<-«×¶á 98ƒ{$L"Ak ¬7·é°çu>ÎÇ)„.]¿¶Ãëe—ÝÐPµ}µùž« ír¸¾~û—þþ¿]þüÿóÓo¿þñížr¼î¯Çcêžân×õ¹×µhYÍ*€‡«›WïÌh™W¹ûZ¿ºœ#YŒH]Ô•¸4)æguª‚@DCrFæq_– M*³‘p^—Úê0ŒW)ŠÙSQÃÞal.œÑSÚUíŽbÏž)%†sæ–M àÒâ+Q|:®¥@î²­þõ~âÐ]ícÎ2¸;T«6¦ÜwTÎÓÃ/ûúÇ8¤<8¸C3>$|u=îvýÖ,Ý«áõ«ëW¯®†.©¶ /¹”EM· 7â6ØHQåüôt* %]AÌÐÎZöÜ„º ¯N¶›¼S÷8•ðëWIÏ&¢ ˆÛÜvÓýâ¶à}Q™ º¿ õÁÍÝ}ceÇø¢Ÿ·í€rÁƒnPyúsT/q\uW@܈@ànè ÈH¡7ѯ÷Ó—û !Gzèì÷ùù¸š…I܈õÙ)(pÀµ˜ˆ™SŒ h]ÝÕÍ‘»»Œ&«}õû¥YŒ*ʶ{†£;oy+f !2›ûv‡ijÍÐ/Q²‹þ‰ÀÑMAÍåÀtžô—{ cE¤±ç`¹K*Z;3p“õùéþ°;üøæ=¯öåÓ§Z ÓNÌZd)G$'ÌÜ™@9¶®1÷E—siù*9Ç¥¬r,eyx|zº(¥¥œGp—å|ªfÞ ¹{]OÔ{öãþ¶-C.‡('qDu·í&D à*¦Šh´4¯€„˜º. Žmªóª ­icõ€Ñ ¬oA0Bʱ‘͋ϫr‚˜c (Z\c¦1š«V1QCtœr@Ä Ò‰"Å€ À6Ì<:‘a3P!óH LQ‘6¤¸‚CGÑ™¤ÚZÕ™C$¢í5‡&Lý.w½MëTr•#³#mÅ• ‰ bðú¶’ü“^ìdÿ6'Bv4wuwc·-oÀ†0ЋÛ.Ä2»›¸+x l1 l ™@ÇÄ1ÆÀÈ Í]<3¯+[+ÍŠ±xDŠ"^–—4»múmuV@¾ >6Œ–oååikÍ·T%n¬rß>€èe#·}jÖ´¸-}jïnÒï¯ooÆý¡v;úöíñá¡§i)¥Rˆ¢°®ršÚy®‰éÃw¯ÿÇûùþÓ××]kuY—VìtšŸ§Ó¹ˆz—»¡Çh;3{ÂËãÂýÏ;ŒªÔº8,ûÑÿòvü¯}ûó_ÞŽc2ð"ðéëùo¿>þññ8-*æ1òÐǀФ–fM¡¹ cŒœ˜"šy3À€ŒÄ ÜÀes&»m `rB%T…\$åsf57Æ>`ß‘Š•Õª¢X4d¾4²‰ÝÙÍŽ/h«»:8 мX]׈êŽMP ‚™ÖIÎs½Úc”R X0×xü¦°¼é¯ú·9sãäÀMFcæ ¡­7×ðîzì–i±”¯noú´o¡—p8µ\ )©Oϧçãtžê—‡ùÛS™W53ŠAØFX€º½"9­ÖþíÛñR'Ø+ö€É„ÐÉ%Ø’aÙGï£y™DZ†CŘÿ󛛟z;kýŸ¿|üç/ç£uÄëæ¥s`∫”Ïww½|{s»ʲ|}øF××7·7¯ÿ¾ë¢|]>ÎÔ ðò6¿1ßמ%h €ŽœûñðöU·‹UÝ%/–>=78ÚÍýyÏ…^öûHŠžp±õØd¦n§46·º6"‰NnA„KEòÆuž]ˆ%ïÒÕ[þî»ñÍûÔåz8Œ7œ¾®Ëñ¼|ý2†2ÔTbhý¡KùöŒõ,þùË—°;ìÆüwÿðo¾ûaj4OtþãMªçãòÇ¿|üÛ?â¾¥Qµºöûƒ›¨»ª¸z0Œ„Þp=qY§NÅÕÐZ3™[]–uÊýŽct0B €ZêÓ|¿ª:“»CA‚‚$M¥¸taìnÞ¤!éô<•¯e]'^kÛˆ…¢®ÀêAн‘ ®Ä\ªpQG‚ TK]§u•âMAãÐ:„Àî(§fMÕ\ÝÔÜ!ºíMGÐ%J‘P+ªC­ót&+š"üüÃkçòoŸÛRgÈ{"P0-MŸæU ß¿¾ÿêçÞ}Š)ºmBæ8júòítÿøÔç<Ž]b•HpsèZ=<<ͪÏ{ƒWú:ÏHåÉÇÙoè·{+ê|Q– b"b„˧:!mõÎÿ˜¦!º9ùK¨ürt¹ MÚZÊÓïŸ×¥Àíõáí««œ8†cd 3Î}â„¥æÌ9‡i^Ÿçåx^›¸;œŠÊRVƒb†óÜÖµÕ&»>¼{ýÃ÷¯‡ÎÝÊZ—¥-K=ž–iibÎú.CÎ]@Âe©ó²4Õ"S0Ãe)Ó¼ÔRÓrÿx®Õ͸ ¬¤9‚Uh€U@¶i"#mFÛ†žàîJh›Ñ ¡4W,Õÿ¦Þ£É’$ËÒ»D‰™=â,xfUéªA5ÐÀ`XB+üm,±@22Óƒªî¬JÌÉcÆT/ÁÂÌ£Z"–áñÜõÙÓ{î9ß!‡…+’‘ÒºåY°MÏRâ–ª· IDAT }A2w“aŠQbpw¨Õ)%oZn¦°,‚"ź67u7"lyÇ‘øÚ ý5Ü‹Ï_ÿ÷]$N 3\¼bD„ôu–¤gÑ—­â<×¹ {`Œ´þ·}‰˜¬bˆˆäÄT7€8N‡‡ú¸ÍãvÛÆŽSLƒKU߇Ÿ?vÔ¼}ûæúúúþ§“ûc£“¢JBO BFÅÝ×’4p“(‡Ñìx<–*77wûݵ9‚¡ÏeœÇQ¦ê D±ë¶»M[K èã4LLJ§ûÏŸÇa¼ÝßmïÞ*œžvÇnge,1zdbSEâ‚™©(RLŽîäN…xæÈ*0Œ3TÉASZX–T £YŸ"@É0*¨bar¬Š®î(–R ‹èîªhP#º’±HEÈ ÐQÄUÔ ª‹Jl#V¯³ªQ0C(@DŽˆNªh² €Š §¶Éó<Äã9ÏG‰.=«ТÍësy8š;.Z ¡ÿÝh¼ŽË)âÕ.¶˜CpC47BŠH|y¿,6›åiæä®î#âœ#´ ¥iÅ"xy¿K› z5F†9ÜïºÍ¦!Æ~¬ãì“D§Ìñáé_Q¤ëŠk±Îó2s.ïAZ躀kß9‚+ºúÊ$E@^¤n¶ì —Æn6µ:Ÿ¬n®ãûúÿáõ~óöõ‹›RˇÏ÷÷÷‡¿þõþ‡ŸîÞ8‘˜Éäì¢bÄ!§š !d6€§¾üˆlF¥*а¨™ˆ‚'λݾ4Œ®êKõ"©ÃXd*’bÜo~Ôy¬ ¶” ˜».…fèb6“ÏÊ榮ˆÁ«°¸ÒZ…¶¼h^Š*‹úá\ Îj,a;Cžà¶ÁlÖ¢P"§6+7óeR4Ú¶ ÙgéK© ±keÛà‹»îíÛ[øðù8Yk© ¹¥Ø&L9ßݵêÇŸÞìÇ:+=åéTÌ1FžK–L‰#:’!CØ%a `È^W„ž«ûl:1•o^nÿñ»»ÛÖäô…¬`Ü”°;Uz:£Ÿî§ÿüã—c–Øeʤe¤ i™ZÙa³Ù¶»0!Îr» f%ŹÖÇˉ $vôvÓÐþú4i9OEâhLé:n¤ì€®CCPE´ªMÅÊ¥Žc=Oö¥§ó˜RÀ©¿$›¸å—í>½ÞŽÅ –(ãÆÃúŸþñåë×o~{•7/úÓéáÇÿ’ËæŸ®2ûþýÔ UtrÅü‹1fN›ÍæÕËW×ÛÛÏ?ÿåþ—§±7·X”Š!m»nw÷Í65ýéËùðaúð¸kaƒ 2ŒSÚµÝu§êO—80-ÔS ™ÆûÃS|¿»ÊûŸ±ÎÈÌ"öôù#<ü\…„ánÓmo:þtÜ\Mîóù ¬Ö~*O§ …°ßî%‹ûóåËO?ý°Ÿ^7×w!oc 9"¶È!ÄÍTC¤À!)Ši!BȈ°„ØLmÉF¸ºKu©&Õœ"zD³î9n^BË¡Ûl®¯7mB@‹§&Z¡"4F7q#P¯¦ƒ(Žý±O{Ω#»…)&©¶ U´š:º–q<>`™w›]îvó\t¼è4yÕ‹÷¥¹ºÂ@+ÿ¡Ô±'­”çì‹ÍG8-6ÀQDI‘‚…Tˆgð‹”yœŠbÈ!D""PG@7t‘âRS Gk)ÁevŸÌ7;Ún6Húþ8¶O£€œMÜ}L€Al×ÉsÛì÷›6³«J54©&•ÑÊÜÿõ¯§búýÿÛíÿùýù¿þpÔ€3!šºÎŶM¼¹Ù¿{ûúööÆMD}.uœÊeœN—ñËýåßþúË_øp<žw»Ííõ¶kR—ãnÓì¶í‹»«‡ÇÓã—_’<ÝaÝ…YÜŽÚ}ðËØ¸ôp.,93Xî ˜—‡ª¸£9=—ö®}8þ̲ôc. ÈÕúONKÂm]!,ÒÜú1½Ö΂¯iÍ¥ž–ézñ4S7E4Gt ŰˆF¬Ûd» _ïÛa¶ãE†¡ºÛ8Î.Ê„LÊœc€œ‘C 1³}þòôñÓƒ›½yuSµÞî·M ÌÔ"Å® ãXˆc©:©")pPQ7ïš&69†€„ˆ$jçq<^úq˜ÆQk©µÌ1„ÛÛÝnÛJ©ó<_úišê4—¹V"욆Û».¥ÌAÕ8:s<÷ãýÃééÐcÆ2Î"•Dqž¡Ö¸(RÜeYŸ0:.d"øZ} @¸~«95Ÿ 8ø\lªl€’Sô¯ ÍEÕ[oÏìHîˆî“Eò¦Å”ƒˆŽ£šBÓpÓ40#$Â@H™U«6)v"^p†N¾:ÂÖ©Ï`M2Òs¥0""£¡=s¤ÐÇR@æk+¸q¯BîD ãB_ZÜ—Àær·Dd¤€Lm®ãé¢ç󰉑Ȟ±êüp8ª|º¶½¹kžÎ§Ó™ëDó°v9´9 lL³Ê¤fˆnb¦’“ÏEsj^½ùv}í*¦Aĵ–RŠJ­Ó$b)¤Ò¦ÛªÖãéøéã§Çû‡ÃýC™¦—‚©»V¡È´½z9õ6ÛÙæ#:¡š!@ƒ!¦èTEÜy1ÍU…Ñ œHLÉ0B¨ª“Á8±)¢ÀlD“š.ò­V_±-6•ç-ªSI2ïLç*Uæ¢sd^ÆÍµìiIlª¢YpC§*V\Å–6_` ÌÜ¥¢*‚A&U†ÈD.³ EŒâf(AG¨%¹G|.¯ÂÕ¾È|î–†:_Ì/f¶4J…µ©î™5öì7$]㲊ŒDdko{\×Hh1z“ã¶ ûmBœFé‡YTC$ ž+ˆê\ô2LRËíÕ¶mâØóãaº f˜‰"À¬·5±òÜåõw\ÿúëë‚Ã×÷ò:Ë8 »óŠWSA \ß« ÓÁ½–ɽÜ]ã¯ß¾þî›»?þþ›_sw½ßÓñ¤î Uj-ŽbN†l bUžGtÎRCDXEJѹj@`ÂÀj nŒè¸Ô*‚¨0ƶÙÄëe˜«‘˜ŒÅX`e.³5Ú%dò<°«V´¥ÔÌ}Q€ QЫ».ý è^—ïŽ-ÉiZë&XS„ªZ‹@Eu¯Á”É©ÅH¡Ý4›˜ƒå‘Z®A.h”s²Ù_¿¸~÷ê®mpNƒR¾ ¥4ƒ5Ó’dp®Uû±/åx¹ÌâÓ¨^=0£(#tp17!¨¼¯ «H%è¿îUÑBŠfŒív}ûòͽþÝÛ—ûTk=øåiú¿ÿóß¿ÿùÏ ÄÇ)Xè0Äu}è@Š솎ÄÉb78y®R|÷òvP}þvxèïû µ¹Û¿j»Mœ$„Ú›}R¾¤]“·]Ô±¸Î½Ÿ~¸ŸÊ8OZéjNCì÷ž¶’t2‹snci©¯½ƒâ—/Osÿ¥±Ý6“…ó¥°”ÆK£–ØC MCÅ¥XS$y/#hp/”*Ã09÷/®^\·t˜‹ŽMžÌ~ù|¿Ü'÷š¯,ͬÕšYwéÝwï~÷þâ'åsQÑ"† à1"z¥:FÀVÏÙT/õøéüôi¼œ¡Ö3RfÊ!nYkLûÛWߦ6Ÿ~Æ#Š×ÙO§9ˆ`d:Æi˜rŒm“bd ÄbÃãXàR'´ÌMÓìòË]c,‡Oß?~ø!”§&wSÈéúêÖõ¼½¹½¾y´†&EÎÉû1ßÞ]ßÜî6›Ül§Ëùñ‡ÿZ/÷³e¨¡Ðn6m‰AÁÔDUÉ,p Eu—e²6GpWUu' œ@€Õ"uªKQPrÇ©XšÊf‰©ëö;ÅT€º®Û´1¢Ä€1'@Zú»dž´ÌDW-c©µ3O¨–áðÅÅçá2×2Ïó4ÎM·QµR—í•Õyyœ†ñx¼LE»î¸ëRÐÑú“ HEÀÀ•Áct@Åîˆrjrnf™&(“3ãòdÓ¹ Þ_F1伎fSâÈLäf¦JäÁÅD…ƒ˜Öip‘¸¡××{Î1µ×!½üù£ ù(ôݥýMCº Ú£c´ ÌÒäco®Ú»»ÜïOhÓ6 Áê`"CßÿôÓŽðüýëW7÷¿lÓaÒ)äL]Ûî6øò¦¹¹¹Bæ§Ó0ôÃ4–s?<>=}¹x:]N—ùé©¿\.µØå2»ÁÔÝ5S×Äöª½ÞÞ¼ÞV=ÕŸV¨f“x5Fjƒƒ8 <7Ì,—ò÷¾°XžEׯ’ørŸ_?ÂV œy5_¬>VZm´éý«ä‹°¸XyY˜¡»# ¬ÈQ[¾`Xþ-G2F¨ýj×lw”Ó4vÄ@nRçQÍ–qºh-©Ö~T b'W 1v„&f‡c-…k•ÝÕþÍ»>|ºgŽÇcÿå˃™mºÖÄ.—!ÇôæÅÍÍÝ>Fœ†©?OL ˆÂñ8Œc¯ææÚ&ïw[&îÏÃ0ÎsQUCÇÄÌ P×0¬qi !6MnšZJ?NuœÊç/?=Ïuœaš—ÖhVõ¹€ZD ˆdè ësÝÀ \}©XoÿHkw39º;è\u®æŽêÁ "XÄ…åêh  ‚n°ìQÍ ]ºŒW»Ø$ A)¨ç ¦"3¹H ¦ ¥*€ÇȼdVÜa™ÉˆÐÌÁÜuþ`‰š?w‡¡ÃWºËª¡1/6$0G\ƒÏÞ2¬çÙ̘™À`$xv@­ibðçÁŸc’ ÈÑa;Ù8¢*¡hTlþøô`ßÿ»?üéõ·¿£÷ïÇÇ %È1\…Ф†4àÓh2x1TS¯MŒÛ®óØ´ Õef×`ºðTEeêOçÓyÆúêõK•òóûŸ?~þ”›îîÝw§‡ÇÃiíuûÜ4ÝþÖIç¾zíbb0±ê)t£ˆ à®Ë kΑU|V ! ‰ùl:“B €äèääŒì)¡@p ¨ ýd! xM÷ Zaf’‘+ +ñ’KÕjÌmnÚÐEReйæjàˆ€Ù—>*Q\Ö‹fæDÈlv“à5b@³©Š:Jhbe :‚iC˜ý¹\p-&\„0‚5©²"¸š©™/å“Ëãj‘dš­Çmm”@æ%R`®ÊäMä”PC¤ý~»Û¤6a×f€p8 bFB`z¹Œs•ªKe¶MlÚ8W9œæ§ãtºÈ8G$´õ¼R[$ÿ^äë$³ÌÂËbøï­Û¸˜ïV3‰º!É3‚!E¢n¦KÁôy·¡ÿõ?þÃÿñ¿ÿ÷o^\1¢ƒõÃtxì‡~T…®í®¯vWÇjh¥Š¹3!RpB4b3+ <€Y­bUÕ#bä¥$Òl©2¬÷p_C`õr +!tð±&&S6 óìÇ~Þ´±i²š€ŠƒÇ±ˆˆ*`B$t]tõ¥°Íq•Ȫèª/O$@Rc„CGÀîèâ¨ðbyžÛÓ3…˜rG±ã ÓËy×âË—×oÞÞ\í;'zºÌó¨\©=—øå4~ºÆÝ-…6|z8~ÿþñp)ºä¤Ê¥c¼Ù%$Q÷*.‚„ÌD5xI¨¼^õƒa47„’£æfj΀yt< Eüåq,ÿòÓ·wÝÿòÇwÛ«èÉÝbŒ³Ñ/ÇÒ‹¶»Îc“8*B°¯UψÈ|™t²Á†aÎV»ÛÔ²ƒyÜ\Õ1}|8Œ‚Æ÷›Ín›#3›s?Œã 3y—Þ8XœÜûQæj@Æj:P¢H± 9V5F ”8]c{׆ãô1ÕÓ®i„tô@™6Ì­öÙÆbj2§ˆ¡Â‘@Ôça´R£@¸ ´ãc–Ë~lîv»Üä‘á8èS.óütÿéf—µè‡Ÿ>\FqW&a’¶ ÿóxõ›7u(ðáËñ—ÏÃaÒ‚ˆÜ:Q@K8uT=NM)Ÿ¾ÿåÏÃ¥À}H1!1ZbØåuxüñßó§Û·ï^¿y÷âææþý÷ç‡ORB6©e(³A¨Õ­Œ ÖäMÈŒA缡×í‹Z窪0%76/Óc*Bõi–¡äÝþU ù4\ŽÕº»»›Û6%¨· ±¹ºÞ¼Í1†M›7M“»Ý0Œ9šô'À8×JdKàÐJ©bÊDLdÕ'™Í¦*Edt(ŒÃbÍ67Gr­ ¢ãXÆa2³rJ µLã¬*îHm×µ›.æ 7§Dn ڦؤX¥‡ãá0]N:öŒÚv ¥0i)U3§ˆQúóå˃‰¸Y1”ãy8õ×WWÈ|Ç¡B :Ã?~9>™ª£"˜!Âr¥6Q5‘X—½¨fð S‘q®>Lo2‹9J%g4Q"Á@bäQÖ±"ôe®æä!€ŸÁ…Å¢YQ1N1©ˆŠY]Š-#íÛíë›W™Ó¥ïï§rA©„¤MB"¯RçYÍCÓ¶‘›ik uQ_‰C <:熱LfJ)-™pZÙý†þ =XMËAZ$b``Æ¥€ª#z àõ/À²ê®¸‡g¯zˆÆÁYg7Ó ÀãTEª»ƒk©U (¥°éºMÍüÃçÓñ,óLUƒáç²õyÏq^X9ý‹×§ä2Øà×AŸ@‹-ÉŒ@s°” &‘©:@p@wsÛ\^\…ï¾¹úOÿû?ýáF|ÿþËûO?}xüüp¬s!‡Züéiœ&Sq7A‚kñ‹Š`«ÜAÁˆ(&v·¯-c ëFÎÙÑu¸LêâaCÍÑ ¤Ù2uŪÖO€„]9¢fs„ÔÁX}yÒ©VtYÛ°ò‰ÍAÀÄÁŸ'?|ì‘.}õîÁ‘AD¡þõËÓ0A橨Rƒ|Î~þ͵ÿþ¶k’š×ÑÚû4ÿõ¡Ÿà\ø4™sNŸ¦þçûááb»Ûׯ‰êÓå_|ÿ˧§šm÷T_îüv›wmƒ®Uõx™O—9†xµmÚ@¤ÄŒkgkš˜SØ4ĸòþ4·ÿí}>Ì,>ʇ‡óOŸO‡Wf›®öHíSáÚÜT‰ÄÛ¥¶—xër°¿ž®Ìó Z{/Uû¾$¯ìÍ‹‹âc¡ûzÜû¶«FãS:Mû.4] 9N•dFã€û|šwlÙõ®åw××ûëœòaöŸ>ŸOssµ6|b`×bˆR-õFƒúç‡ñé4½d f§ÃÓ¡xî¶û†;Ñm€íuæMŠ í:j:´Sr“Bìò¦ÓqdSæÐ ųL}áÄÃn»m$ÿòØoAÞ\ovÛ6rÙX8sÿ4änÏm>Óùé対»ÛǸ9oÿöñü_~xüá~êëŒHm„»]|qÕ^µ¿z³¯5§§YÆàÖql[™Æ`3̓KÕ¡œäa˜r¸ÞîÀ¶¥>ŽóCØmrÓ(ŽŠ9dvË!åÂÜP !tÛ†¸K™fñÓ0<Ý—÷´Ý¿¹¾œ¦ù샊/aÛ´»¾Ûo;›¦q¸˜9Åä!å¶s“i›Èä…ä›isMyÊ|™Eq,n2Ïr›p,µL}g‘9m;Î!0¢‰AYdA2',³“Œ£U!Gt#¨^ç:O³.ê9ç”âvÓt×W˜Ò"hær ž'ùòpÿéóéñž¬6ÁeL¹ÍFÄH²Ìrøüq<R`äP4¶P- ¶ÛÎêx¼ÿT†¾cÌH¥ú8¹@ŒÜ…È8ΣÔaßnÛ.;z©c˜4 ³ùeh®n1uF´Ø@Eªˆât‘:Õ¶KȤed—¬:NEÍbl”ã,ÀN9&r5)}¹ù²Ï$""ð¦ëRh8µ¢:R­³CÍ¿~…¦©k竨khÛº³À²½ín^l§9ô}L‰CX:Ð0SH¹P˜<û¹öCJ™ÐøÛ?ÿô‹Cj#¿º"Aœkd¼Þ¦Û«ØfžÆárÎ}=_3Ûl›ýõíí‹7Rµ”¹‡O÷ÇÓå4Œ5E¸Ùs‹–qÖ4<ìWÛm,Fñ "è§¡hÀ—ÞK ÅtJHä`€ºSŸáz þY8ÓBýüZÒú¼Ãö¯è‚gæÿúûغ±„gÚËó^ü9"ðìÞ%¤ç`ªÃ’Bp5P%CàaöIjNÚ¶¡IÎ]›R™ÃíÍöÅË]· ªúøty¾<<]BÈ›®Õh—÷›]ۥͦÍ)ö§épÿD`šÆ¾ª¨Oó×'òù›w7»mÚtÀѺHAņqΙSàåÚÑ4¹ÉíõõžˆJ-î"³óâ ‰ÔÍaìç~¬‡Ãåxæi"ÆiÖqö~„±StŠhZ$ec5¬„^ѧ@š‚Ûb6dPZšZ Ü}ñÍ,3/† pW|®[Cô€Ê¡º‰e 6s·I·-n:`51×5U‹Ž„ŠŽDNäD„W¹Ó‚_pC§µVØÿªp®…FÏs¤›ã×<À³º f‘|E~úR1þLC¡Q»àÑ m±þ//\Ø]ØǺ­Ø 7§¨™ïŸF&Ùn5Dã¬)ºƒ¸É0”ûOïŸ^¼ºN´OpøöºÍ!Èiôª"Ô×z¾ÌÃdSµÀ˜ºÓ0°S·¬š ¸ò²˜A2g M hMí˧Oªs‘Š€ó0籑Ûwï^÷íOŸ?>~úYæ£Ë²;0!@È!5ä`Z@B HÔ¢jpƒ@@"……ӯȈ̠H‚:ÖŒ),`)P'¢È”¹Y ´ƒÖDÀ‰µ–~v0 D$1«ê®Ž)¦M»Ù4ÛM³É1ªA;ʶ`¤Š(1h­e(c?LÄy·å«í¶ qÐt6¨ ¾É1´YA ”SlcdÅ€ºœÀÕ;ïK } ¬Ž¯å2´|º- ì2È:â&wZu\݈ænNö< .Ü 5µYÕ$'G²óydÂHG55fŒÌMŽ)'¢çÈ®ðtïe,L˜‰"-úÒœ²«,t³åR¯ þ‘(,\Ñ|ð5ãÎh¸Ü‹Mj Ú5¾Û0r8 RE«{# ¯oš?ýáõïs·ëø_þÛßOûéó¿~ùr9g0!ptž+O™ž™YÀK£ 96 Ù܈ó²›àõ³IÖî¿Åf÷<-ê‘»5s«HP‘LÍÍÀœ È•úÑM$ ‰ÕÍ\A ÔÔÐUVãrµ%äeô‡ÕÖH°HCK2"#ò:08›¸ÿø8þü¥¢:b0Ò*³Mã¯Ûo^»o¯¾<ÞÿË÷Óã燡ŸP(!ç® m3õãüx¸ÝïÛ[‹û/_î?|9̵´‰òt¹ åÛ›p»‡zÒêã/{L,wWÒ%¨ÕD (0!£t­¿¸K›Žr€ÅíÇËæ?ÿ­ª]ÔÀ 0ÆcÑÿ÷¯XÆ–ìæªË›æ4U‹æd˜Œ@t5€}Ýü‚’bˆ€ŠO{êK¿{µÛµ»_žÆŸ?^ŽÞ0‘‰³Î"*­A«¤j 'ÑÄÁÃîq/_^mB¸~×]Ý(ñcÿÚ\—† IDATÏ»?µ§ùn—ßìâïnø†½+¶?œàû§?|º¿¥ÖRešG¹ÞoBà®kîn®^Þ^§ñx8‡ýnÇèešˆ£z|z:=¯î6/^Þîw[v€¶ MêÜ,]†~,m“c`g¶€ÙÝUTŒ(£¡;‡C0·Ytšåxžžýá4<>^úó`›.£R©H Ì‘0¹€æ&^_¥à|ÑÓ¥Ò~ƒ…B(1(@µu*[‹Ï?ø‚tZÀ«¾:¤} úÖ˜e†h£w La®R=¸'t$ð&ÁnÚ†MÜ ¸ær(01.y6còqa¬üý|€!0üýJÿ5 _ÝÏÙ]Y+|{×ƒç¶Øyž§Äg9}üYÛ§çK"8/-¯Ïå`K€VÛÑ"|ân¦'°ÌqÓ`ù‚v(ê nˆLLµŠšª›-[bZK€hùiòóÒ9¬Xd@"sE"_áO¦¸L3îâÑ<º0¥4{ãl³ÿ|r1z ù({JCÙª’wm¾é®Î†âÜåoóÝw¿ýΜ¦qði¼ö*Ì7ÞÛÚ¯6©‰£ú| ÀÍÕm~·OdM(eªÅ8ÇMC  ²Éòò®æ µÎ)¤íç?ßÿø×Ÿ>þ2[~B»<™Éܳr,§³Ðe`¤‰žñb´}Þ¨£3¬OÌÕOF‘ÁüPæþ©œ¼¼¾Ö±°iË倗o«Ag•: –ÚKjÂõݯoöÛ÷ïßÿ8 ㉪ȇƒÿe¾ùÙwÚc.øzòÉËo7948 þðù‡Ã0ZüÂÝÉÿ㯮ÿéENõ‰õÛ6îÞæÂ,XÙ(cîzÐRÀ!oSŒ˜9òc†Y¨ÖÓ\fªˆêXÎjê.uÛvÃ[p˜ç áò(—Q18Äë››·ßÞüo·ÿð«oïþòã/O§Ãv“wm ¦û”:&•^­PNâå|ªu ÁyÓ8å2N:P‹^­¿ X‰C“C“7ˆÓ4«V‘©÷BJ‘ë$ µaÇ .RkµjˆAgk‰Ç"c•-—]up`1¨5Çë4e)NB`B æè.àçÓe¾œÜLB›Ú]Û$7R„j0Õ^ÄÈМÜÑhñÅ‹Mè*U§:\æ¹TŽÀ)YÈœ!§ÜÑvÛIÇaL16)nUC³Ýæ®p6åÔä¦í6;âXE ¼ÌS_Ê,b¦˜§R"E¡àµú8Å ª6KEâÐt“+U)R|z™¢×èzÓæi*Ó4k•äÂ~ñ©‰ùêÚO§Ùäa˜‹Ù.Õ—n-ñ†q³þ|þòQb3—bÓTÏg?m.ý\Œ¹:”Ë ½#3àrš{gˆmD#-`3"V ªÀĨ>Ï2*†&yb . Ñpõô1!sÜPºíOôþé¤aóë·ßänSË4 c™ÕC¤Ø„œCÎ1fJ™§q8ÎçqjC€àªÅ™‘‚*!‘#cdŠÄfXª3!3Ç€]ãH|}½¿½Ù‘Ëåt8Ÿ†óyº¿?>>]ú±:!”LŸ„f«*Ó4öU0äâv,áiࡲ@nbØì’›ÔR\…‚;®$ù•S±âzÖ¾ùµTöY }n‹]á‘_%ÚõÎþÃènä¶E¿þEXQók|•–šaGÀà@«Ö³>ßž¹ ” Ø\WñZl®¶…Œ@™µmézMâ~’Yú˜Ãn{½ÛlsŒVÕÁC­æç9|xšçúònûân¿¿Úì¶]hs$ؘJ?–"´ëbxsûÛï^ÿêWoÛ¦U]t"vC%æã¦ën®vM#€ƒ‡àfRkEp"pW©ÕÌͰTær¾\N—ËÓáòtNçér™Ê,Ìà`Uy.`ˆQô¥ ÅÐ4ÌhŒJ°| ¬ ‰xUZJþKÄó={ùH·5¢±´=ëê }ÜQˆ•Ý<°wm Äa‚¡@Q`Ä€(HKðû¹MÝÀ‘Ý 8:˜»áL^ ‡Ë­‹Ö,ø·çüÇW™ž»‹Ð ðy)´·géןÕ?w´¥çtí•x~Iä@¸aüß±…|9k+ŽÄ}¹ˆ.6p‚¾'ßo¸›cv›v›L!NOø¦Õ}t–¡¨ B ÑÔh¿é8ȬîHHcÎ)å¦]˜k!†ɬè<!ƒP­Ö÷#Z­ÅÇ2‘Û>„Äѵè<¼zóúOÿô§¦I?ÿü”éîjs¹ŒâªŽžIÁašÄP(RЉ‰ÍQêâD·E4cuDÀ&ã6žq¯"Œ51ð(J^GNMÓ #šJpœ•¦êž‘#‡P+šEwX(þ1pbÄĦ>Êäjân"£Ùl¦Uë\æašÍ Í™MË4èŽfdÀ!a›‹\°Ìr"rjRESt1ä%œô÷Cî¾âoߨ²«|^=úói=´öÜYhÿîä-åµëÃÍA‘m¡¡9rl‚!TDO1¦œA*¹ŠˆjU¨ÅúË<Œ*ÊF™BƒáÙìÎëlûlæA0sP\›ª×tÓRµ¸<Ξ[± q-6€µ Á°TFUEpÜ4Ðæ¹‚{Ê©ÿò¹ÿñçþç?:ŸG%ð.„ÀÀˆDK¬˜ÖZ´%ßµV'8¢c¶… ·æ×ÈÂs™ãbXrB0r4X3[‹ËŸ)˜LÕçjËV22˜˜/ å¦ZÀT ÔÙ|Á¯.¯šáðEBâåìNDiñ½ã×¢¶-µhV¶ä¿ÄqYC ‚3(¡û‚Ï ×“ž~úø Wpá±}PnsÆÀ3F˜½Œ‚Üæ·¯ï~ûÝÛÛžŽœ^'}Ùò›_¡½lõõV¶W̹a +ê¤mk]ÇlÞlR{Ó¶7[ ^' P6]er÷"†vÈñØàÇ c}Q%DD#°Èž8hX¤ªŒ5¸PÃÜ@ ¾Émù1,…qË\ D»QñSjtH9\E­^TgRt@5®0 7©¹½¹Úl®û©>ö:Å«BðÏŸÆ;|1£ÁšÝM»ÖˆŠ«ÖSúù_?ÛQ¼ÔŽ ­ä›IÌ¡ë6y+½Íž2`ôêÅl2›à޶Ó<”Rã&äÜ'pDª±!qëË8¨ÇM/³•"Š&0•ª û]¸e”i<ÙtŒç>ù#OeþðéGóùÕÛ_÷2’¶ÓËÿŸªwi’%K²µôµ÷63DÄyfVõí.ú·?Ïœ!" ˆÀm„„æÒ]Õ••çîáîf¶ªÊ`›ÇÉšœAŠäÉŒ 7Õ¥k} ?~x7Äøé/Ÿ/ßO—Û¼Î'õe·K"¦V šfh,ƒK,VQ Ýݲ36+0%! §ëÅ5‹c !fмhË·Ei—‚³ 9‚0&av_n¥|Yô&!·ÁVY®º,Ê!NA¹Õ5çui… Y‚•мîöÇÀTjE„5çÓõºÞnÃãÛwá͓ʆQÂ0ŽÇõr]®w;#üþýYÕÞ<> Öå”ër{^Ú¢ÂÅ¢ŒF“DiÜ)a÷`·—ãÃÃÃÃCQ„cl­Y«CŒãtŽU­Ô‚LLXT—Ú( OÃn¢PÎËr½èšC¹1CC©ÚÖK±.eC#È9¯u=2ìS$ÂÒ´y-­.ëòýyRcT”x­^UÓVÊ!Þð¸³8àÀK^/¿þ¢$j†­qÓ´¹ÞÖVBT–†ä ˆºæhÌæ¨—¼®Æ¢µæ=†L¬€ÈbÚšjunÈÉ8@Aæ •—fäD)FãšãóK:/‘‡éðo«k^Km€ä1ÉnwÀà ,ÔlÏß.ùõ3´Ûáí ä¥B¦dÎÕ¼)6sïSy•¦Ñ,ʆ(ÄàCt/óRÊùüüõÛó§//Ÿ?ÏçÓâni iç!ô\¥¹e@O) šÚ 9Êhɀͱ^Þ§xó Æ€hÔ]›¿E5ÿšÙx_üõL÷?qˈm°>s£>ÎÝ¥;Ü(-?àx¾ÑC_oÖ½ŽÐñC¬ Ö‹Sz¶¿¸»ª ZVmkÎC€!Ö9‹„0IÃ8Žsi†„b¥ê/¿¾|þr>âû·»Ÿ?>==åzy!¢ 1°Æ·ÿññøï?~x|÷æà­©)b3]×å|¾ÞnKJáÃû'UsòàÍã^[i䵦­U0¯·å|¹Íóºæ|¹®×[ÉÅJQ5«jóZ— —™q`@4t«Í^Î ¦kF4€ Ð̽5TÅæt%üÞØÌ›©wŒÜ·iü.uÒFMqßN08 Øcб¤ón3ôPïºz”¤CÁL ¨û‹ÀïFG¸Ã €î;üÈÜóݧáV}7m´ß¶@5uB`â{•’»1nÏÃ+õ Ø·ºé ;õzv°íTÒAï4§ï§ë¬Çòö §ià ­X¢ö@ðq”Ÿq?‚– éáÐ*æÛU ¥!’—¬9 áx<ìæXÔÀjkjîA‚5hÙ­’·V›#†ºÅ$`wØýþ›vã?þÇÿíÿþ?ÿérz~||Xm¾­U&`+ZkiÈ8°!YsoN茂« äêY«‘¥!Ä ¦œ[kÞ +š7DCR3lÎÝþÇÄÁ%¡ZkÍÈ¡´B„ƒ4¬–µ5ˆ‰B¯º DÓ8$k­•Æ$AÂåºø©#ÀÑîȤ.*õqŸÙ;ü`“£zÇ3‘»¢+˜»’›CE2"2`wWóUÁ*j5+[’vxŠá|Ãëm­¢q°Ìu©.Þ~ø»ß?îe^¿¥Ûõ÷ãíç·ðNìMl;iÇ#¼ÿ@OïÓñaJä\ŸO¹æ¥e»•+YÝ=¤ÃÞcºpBÝ¢7b”‘‡üÃ?<–ò·aûÿÅ>Í+ÇÐͱnÖÔÝQ%öÈ{§¹€›ÿ@ܯœFÛmË6PEBªnÏWe/»QÞî‡Ú²Îk4vm³/³ój¡9OO‡7o¿œo¿üå×Ó¼j:á§l_3#&{ã=†ÁA‹Ï©ep­Õˆi8Ná “7 œqŒ0 5a¦Ýw¥CŒ!E'o ¾ÞÖ5gmÐáh\Á´µR¼æ¦p|ÿðm¹¶ÛÅQq.í2ûû懑™1"Nû‡x­Sµ(,T^¾ýåEë)í~» cÁIò·rýÜÊB¾&¬TWoyaØÚº\óR°² D7­Úªf5ÀfµI`hŽÕ ïRÂÒ´´¦$‰ãLÉ‘"aoÍB&*T,EßÊñ''ÎWͤCÓ˜˜¬ÕÙJ®%{PÖ\Ô‡iO­fq– 2L¶–Ûéùv9­óÇ7ï?ÄqbJ1 ã(CªyI»ÁÆ\ˆøÍûw!@žw§ç¯çùÄQß~ˆ»±i#g)Na‡ýjmû}ÒñéÍáø0¤änµ–fD!¦ LæÚt)·Û토„ÀÌBß<öD´¶{Ð]>}ý<_O yX‹Ö¦¦Ž""Ìîšs-ÅÍаÕ4O‘lŸçtÖVÍ⺂®‡!ÈÕ©'äÜÚól*VŒ.JÕÌËM›¹ƒ %"ÕVëZ 3† )¹×Z‘Q8£×Z+ #b…âjêÆ¡)ˆ(æk+àbHÒUIâûÍY°95¢8Ä'¥ÝçËòë§+¥ÃÛŸÚ÷¥®óeÕœ‰ééöt»\^r±µÒùôòËŸÿ2_æ·;6!dµ`­{( Ý=;$DªÕ‚À›·»ãÃÐê²^¯uYcC„Ö®//_–¹0Àp7ÊqÇdµHV—R ´{DðÛåT³§4DÞ¥HÌ…Ì\õvYÕ½¹ ‰c·‡"::Þ ÛØwŠ»£üGS¥+xÇm“›÷*_ës¼÷lÔŒÌàGî~“¿@ðŽÂØ”]wWÛ*i‘ûНÕÃЃh[&:Íë%ç%×ÚZÕá[møx<šããÃÍy)µµ²Ôz}Y[Õ_¿\þôËן?=üø$çÓKL"‹„qàï~úøv“»æRZÓVÍÜsk×ë|z¾ÌK€iÒ ûqHIªZ.yYVUu€u)_¿Ï/×Zµ5[–\š©³9Õ¦¥Ø’Û¼z³€4ŠozxΚw'Ä€œÑ{¯2°;¡£mž‡â¿ýp_ÅõŽõìÿÜï;s¯ÿp'Gb!f”Èe­v½UUmhµ¸©0½Z² ‰ú¼eا¬.Áö Ý`³gßÕxO^Þ½AwãÞI‡è`ÞµO îÝèÉÛ4ƾ(Àæö±>Ñßï ŽèŒ€`f`Û-é˜Ø;öÐ8FÐ!ºÑmi:·èüñýû4Hµ¥µjî’0§‰Æà¢ª„9Sq6­j FÄã˜öÇýî°§„±4Ï9‘À µi­¾.mž<>ßËËí–ͬµ—y¾™§4$fÀÿë?ýÿÏ?ýÓ—_þ’×eÕµ` ,"Kpsd LÂÎØÑX½g Ù]„£z˜k®jZºõj®k©Fƒ I¶b†Üªƒ6Uh”ÔÝÔ¨¨€GBÌFÙÝ KmMÌQUÄA`ª ‘SŒ»a/ír½®k^$‰!4³þ¸˜YkZ´4_ÇaˆÃ„Lèàâ@$D? éáåŸÏë寀‰‘ÝïµÔ¯vsè^Å× ÅðÖ±{5ðÝþÕ-öÛÚ?ÚlËfnôÿ†^*¹1¸943@504×\ô¶”œ €™BS,D H ô#¦¡+lÔctíK)¸2weoGÿqÛÌnaË3¸9;“!Soþªjµ)ÔÊÔR5A·Š¦²ª¼¬f®!É0¥9lÕb&ä¦èk ºŸÁ/ÞŠóÎ÷Ü>}Ñ òv<‰›”à÷å ÙÑÉ]û- €ÅÁ‚ˆ:h«à €£;ª™kcé_z3³H”PS'@Ù, (N îÄî =>l½Ò‘º÷”ïnô¾ôh5:’7ÆF[ ‡­‹CÕ~^ÑæåöøÆþë¿}ø/ÞCYó“ÈO‡¡|x;Žƒ‹œÖ–5<ß¼Û3äç\¿O¡¾}SC²q]F+Ç==}¦'çxuðl®ï¢kºÝ¬ÐÑZƒ]ÂX‘f¤J­àB’#ÆŸoÀ¦?~ûõÿøÒ¾­îVŒ¤®;XC0Dꟸ†ÝRjJÛ¡ÔºÀ;!a‹tím£è€[Ñ‚ Ú¼•1ñ‡é f]N ?ßð²ú¢ðå2__NçÛj˜'DÅä” ­qÉMˆéá§¿ûýþý.±ž^nŸÎê 4´\¯HhbÜñ0á´ðJØ´Y³r­—ÓU³í÷ã~ÄH¬.¨¬¥´Ü”§iÂq7>—úK[sIeõORÆ´´–vÁùé)ퟦµÄË¥­óšs®ªëUoìªk=ýraâ|»A{®SØ…Øju­û‡ñ§ßÿ4%yùúõ럿¾Ì+RLÓŽDª–¥hihÍ×ZU‘ÓHªÙ\Ôµa÷æQ(œ×|^UŒ 5dÂÀ˜uÃÛß¿ÙÃôÞÃT×BÇ7Sa©­Î7G4­‚(D¹”óuæ%‡¦qÔZ˜â8¦ãã°Û_¾K¾žµäu¾­ëÚ â0ìvûýa\XsYjk)…Ãþ8¤Öƒð0NCÜ=}üy÷æÐ[©KÉÕ!¥á°Ûí†4„($¦´ÛÅa`B×¶.óZrÆããÕe.ËKvÕÛËIK.9»ê8N‘pŒ!—\jãÃÃáø¶"ψ-!8Íz[šVC®êÔVhÍÕŒÂB²êšòÍàŒÓ:>š7©ß©¼ ˆÊ¡â®¡/†ñÒèå\/­À€ˆ¥èZ0†˜‰´•JAœ±‹  ÔÔEâÔÀæ¼2Z׸uci$ \­¡·Ðûb˜H"‹ˆ›98õ)@ÐMj _ž}¾­ßŸë’ñ\už_æyÉëR‚Èû7‡7O»§Çã8Lór­­ÝV_sùåϧç/×w»wŒ>ÏK5ˆ÷æØt5pEÄ4ÅÝ>Mc ‚Þ*bØï†ž¬ ׈u)H”+¥€Ç}ŒÄ9[k56E2 ×FZÖe­$‘ÚœN³y3àÑ­ä1jˆÑÖ¢Õ8È]}<_A}pòî›Æ{*ÑëÒi`èæŽ è.Þ©Œî Ð ¹§î¸÷»À³µtÜݼ°y4°ê7†ŒÛ½’xK†Ý ¥rPÅœk[4›;¤òív»BjËRæ%×ffŽ,`\Z­·N…ã*×µ††Â"¤­®Ë͵Z{"˜Zm:/ež×Ršªn¦fbêlufa5צ¥´Ú¬V½\ç—˺¬Z«ÕR—µtLùšõz­9{1nêHBøú^ëfgsvHBÝD³­D¡cÍ{MÐ}~0ÿgºß¶T'‹{§y €ÀB@÷ŽÿªL«¢ “° ¸ÝÀÄ„ôzø¡;Þµwúnêì†ïûMaÄ6‚wÛ׆‹Új‹7{wSÿ+R  ƒ„l{èü¾v¨õÖƒ~VêÎBdDíÔGÚ8GÖ›¹—Hm$ ßµ$F)—q®Ã˼Ógs¨l¡åú¥]ÍÊÅJ8SŠa8Ò‘«El«/­*Ä4î§ý~/AÌ̱—(¡˜™SUZ³"ÒøæÝ»é0Õ?ýË/Ÿþ\s&'¡Ð8~»Üìÿö|zþöýÅIn¹œ¯ÏiOÓ$ÔÉšƒˆŒadG(5"€¢C0€¤[5dÄ N®†fVkm5ó@,Á [1çR[ÎP“)VA×ò IDAT³¡¨€BŒ6D 70pm¥U‹`Ø ]‘#N@‚Þ]¨äÊZƒÚàh¨ÚL1P«¶Ölf% GBwT%A&&OÚx]d¾Éóµžs0ã&Ï£ßqcðj=ÜÈÿ÷eòN×¹;zà7aÚ×À9*â«âîÖÜAj„êÕÈ€°6¸ÜêºTsoÍKuFdpg‡„œ€¢9š»öç°•ú4wØn-é[sßýZew¥Ý]ý±ï!f… {Ïä}‘F‡ÅU/k-ìŠ@ÀB”Ä”`p ¶¬¶¶.ÝÅãZÁs uLHkm®. ¸uÛ™)“¦`€^U{;¯»Úv”{òß+Ì 8h/R37w`¢$†b ÒÌr1õ^±áPû…ƒ6ßçE®C(^I¾í@æÝDC½…ÞÝš@!VA#×^šÙÀÕ¡:9Ppä5Zþ¸ ÿÍßÿ«ívZ~ÞáöÓîJãþéAö{•±6Z¯óúòÝõL*äR=ˆ¯J¥<½ŽOdaѶ¬K-¹ñ4¾yz›b˜JšÞ=µFCòÝ”‡´†ä€B+¶FÌŒ„'Çežþôíô<ó0¤i°%¯nBw↱k'2÷]¿XÑÝi‹Û¥ËÜÿªDñõ¶•`÷o -µ-e!k0‹‰3(3: ¡¿ÜòuYÌÆHÅÝÔA±U‚BPUÒƇýûS¢eYÚ‹]Jc$W-·ç—å—ó`G8<= o§é)Œ;t*.&ƒ0ˆ÷J’êºÜòZöxÃÔbtžP±i]V#6ž$M‘ß¿ ÿÚùT[ä@|¾ø/ßÚ5ÓNl ¾›|œÚ>:ƪ·¹jb&¸aË׫˜†)›&‹ÇGF ,à ‡ñÇéÝÿ{üW ÿ<ÿy­’v…¼Mf®V‹_/ÙÔcì¶.­Z@&XRƒ¸X ²`ÈÕÈR1È´OOï(í>Ÿ.¿¾œ <Úóõv“VSJ`&ȪºÌër»©_ýéñQDÒ˜†i”4†»¨yîH¿çÓË·çÓ8Ž?ÿüÓ4&]o——s®uwƒÈµ”º.­,¦mˆqcœâñÍÓ8Žu]®·—Ú”™£ðnßãdÝúA¦æÚ39ˆÀDDB,eˆÀ×Ëåúü}Y×%WUm³•Zs^3˜îÞ¼{<®XËõ ­Æ4ôlÖZ æèdN ˆ8§eQ¿®aàir«U[×ÕÒŽcD¨V[&¨Õ—µ-æÈÜ «® Fc `Ž¢ŠTCo ‘PQBL†Vµhe0–†Fb@ÑÕÔWp$–a`44%G€V½9(£¹›)b JóÍùõ²Þ÷$t>}o­”ÜÔðéáaÓa?2áõ¶¼\®§—ùeöÚÒZ ‘w1RhMU©á¡Ö©4Weïe™vq||<ì¦! Øa¢i€1bÚퟦ´\nß¾Ÿ¬–1¦ïžLµ¬K-‹QLÅÒõæ×zY²{M‹‰yºÎo¡ÙB^KÞOIRZVo ÍÈ@Ühƒjl"Ú•$ÿïï}Q¯E«~WÐÔ½19bqt#wV§ªÛù‘À Qï¯ç-àuŸláÕûLK[®Ïï÷7pCï€W¸úƯëf ÀàFEËÚx.\[ö¶ÖÚnkÎÕYbŠSJƒ6×ÖÚñ8LÓA¾_¡"D)jb&DE"@©Oöm]K^kÓµÙuÆÖ¬’™3;x.yYò¼”y.×[>¿\_.skŽ­µœ[sof×›ÝnÞT¨;YÝQÝÁ;î¿óµ1ˆÜGìÍ ½äõ>lüµUëŽÞÜ–º>>š‚U‚Ù‡Ä$ÄDœܨª·Ö˜l?&LLãÀÄð ýÀû·¦WúZiîNçm7{ ‘o¤¨þŽïSùV`f[Øï·!ò>ÝoõNÔi鿵~Ük)€Ñ M½9†]…  ¶Å‚ïö'Ü`Æãn dc¨Sh£T3Wfe*Ëòýk[¹°JHh^j.ë"èÇ1ŽIzQÙmmä Îä¸TU !Åeó鹪£$w,;§1°`‘”ö‡ý0¦¼ÌóéËõë'­ ŽkÕ†hDcàŽ%k«Êh-_Ÿ_´Äi!Œ×Ûä×ÕjÆ)0_o #ðr[ž?ic\×Ûõ|nî¹H¨­­—k+e‡4 Æ Ó8*#“•’[3&!LÓ.í'¨Ú´Us#Ä1 ib@&A͹ܮ·ËK)‰!˜Õf€Fº^~ý®ç¯OoÞ$¯«5các¨®>¯kmFÌÄ`M°ÒXÀjU×+;²;TLÕZˆ¤æZ@ xBÐÜ´;:FÓ ˆeÕZ‹64`wÜÇ8¦¸˜·ªîlÍÔÄmâ‚+Ëbæ„$ !X1ëºcS(†¦dà.L’bÝÉ㑪%‰±Öe®¦†n…»ñýÛÇÝ4ηO_ϧóËùr»$Þ9¸0‚*èÈðèî×u8-TZ#Šã(ÇÝ8ITã1QÞôxŒ‘Š—Yâ¦Tó’óRr ‰°• Ö`'àýù&jZu¨6Ý=ŸÐ)9=4h—K*IB`afvÒ-ƒù*ŸÙýÕÙUÒW _A¯ÖnìÕAhàU˜vcšÆ"#8j…%Ûmµ9[ià&HÒ9Ø›鿃ûõe³÷üUÎàµøóþ?õ£P ½÷ÐܵæÎ‚!w2j~YTmÙ%;Na? "ÌÅŒaŒ4ì™0¸×”dŒ(çËDvà µÁu6 :V!&ˆê,¶.yž×œ‹Úö9l ÖŒÑ ç¥–’ŸO/Ïçù6—y®ëZ¯s¾ÜJÉ}M±ª^š–¦k…8ÒæQèN}{ bßàf^Ì6lßoJÛúŸ¡áý-?ö6ëáÈN?AWòJP#µÈXðþëªX›U5DØO‘˜0oo’­Šõn4BxÅ©oöýÎøìÿoö7¿ÿë["6t¹ß+‹ï*ífúß|÷ïõ\ù]ÇÝSÛcÓóÆhˆ½¶Ô^ÝFÀŒ[%Ø=„°½õ^4´5èx«8{S)®§zsh‡÷qøw‰|âõ”W]Ïχ‡!„ Ò¨fNHjUô<á8Œ!‰AHd]×óùåå:Sˆk5’0È›ë<σˆ°0‰ðããA$¾œÏcŒ1MËš98ús¿SKI‰“çJU})i»ÃàÀ®Åš:¨5UoKQ 7Œ„à­µÚÔY‚ L ý\@(„Á)$d·V*8 kÛŒ:ÁUHëšo¹Q%ÔÎvw&$mRruðŽT¾Þæy¡y­j„Au yp$pÀXŠ"ØÓáå _¿ûu Í'Ã›Û ï¿÷¢è>à PoÁÛd DëˆODD C‚-õÞCDw\Ù/ë® WBrFpõ 8(Œ€š#ÜgýA&Är/àF›Îä Í»ógSO »Ꞁ"ü«ËØ`µ!‘»Îá„w„<šõ¦e»³p ½ó1»kЕ¼õBˆVÊ‚Z"J·ìܽ:ækÆÚ Ô8%$2oàÊâ»@cÀfÚšÛÆötpGꊾ²+£uœ³»W7§þóé­¾ôvD/õ£~Ü#ìD#rS]ª£‹ õ¯•¡õÔÆk¸ì'à^å¶û;£{aºE¹‚¹:˜£½ÊH†®î­"5i:yùý‘>ì0_NŸë ¡.-|?û·%%zÀ²·yþZ—çËÄ@'€1ÉÃÃ8…±\q=}ƶì†ÙiŒq3B ³ÃR«z“iâXn7m^%Ø 4M»ù¢ÿÃÿÿÛÿîÿýÓËÑÂÀ[5ä‰zs„˜#!pgßò}ùq¤ž}w"Þ#Ö·¤¾œ÷'~0¸·"…ŽŸEd&q€¬~m®ˆ@”gBFev4pí­,öã­Ñ—Ip’Fì„Öôô|™Ÿkõ¦î¡·B‚Ïu^êíÍNÞ¾ÛýîýÃßÿþÍßþ»ÇqÔæg„U„‰¸;’Éh7¦ã¾•ÂLÕývÍ(¬ ·\ˆ„£P´œ[»íDÿð»ýù¥ýz¾š£Q,Æâ)†d:^×ëËõ™x}x|ØÞæëù´¼\ÝÍC Ùô4¯()òÞÛK®Êê¬Z±–årûz}>]ÛŒMÁÚº¬ë*à© ’!ÁM½jv)9xmVÀ@½×õnñ CØí9‘0¸ã¼Úùüíåû§ï_>Áºbóë¼VÇáá1 ÷×|m¶ä¢jCÉ[Ó’-ß¾}¿Ü–ßýü‘Ào—[{x|8[3éÝǟʲÔåzš¯-/óõêÌuÌUÄÖõv>¯Ë’ÇéøæaѵµRZ)‚8ÆÄˆ••CŒÃLà€ l+"‰!ÅÓUŠÌ­¬KÉkÉ+¸?Âé|>½œAkpQáv^­˜PÞ?>0Åùù9¿¬^+´jÚªƒ#vǰEOhõ ëEê•ÅÃŽDá(­¡.ÅTƒÄÔ‰QŠicD7tW3%VàªMÝPX0$SðÈ DÛǃ¸Ç àęɨœ…·Òdë ¦‚H lØ ˆD‰æ–BýÝÇQÂáåRÿòÅJ SHþxÞ=íw»5ë_>ŸþõÏ_.×[.êr@ qÇ_V=ûÜ‚AjœÔÅ( 5]*åÕ½seºït´6L ù]ªòßxÉ –àæhÄÒD0%þÝǧLJÉlEГ6?¿äóµ¾ÌörmKöfþ¾«¸Ø»ÏsÔ]ýw®Ûæî€E±s?®÷ãE§ys34'phÕfoI(¤i·›dPŽu]k˫֕£$ñ¦Z5é3íÒ8NvsUŸ—º"®ª­5÷M g$4uŒ""r½-Ÿ>}ýú|>¿,/×l¦)Æ!&AäeÍóR;ÃÔ š±A@ ‘ÙßâÖM»«is)+ º98o¯ó»œÞM¯ýãÝéˆ@à~ztú¹’•@5Љܭõ5šck Ž[‹XWÎèµ~õ.Ðoob0å¾.+›Õh{E#Z–üx°ìõ¢D÷B¸zBw1ï~ °û¡ _¹.¯Vp§ŽÁDë™N¼×îdøžý%0W3TìWŸÞ°"‚cpNmÎÙ‹/Íj©Nq~™ê¯ööþæáãÏéöërý¶0Ð~ ag¨êfÎyšvÇGåµÜÎ×õr«ë¹8Ã'g²|Íë ×¥N»7‰‰®/—súB//—ÃÃû?ÿ¤„_¿Âí媭®ÖR6n-Ô6šb`‡\MÁ0:õeQ¼˜inÞZËê„2!7­@î¤jÜ©”n^«  a (X¬eUÇ$•XɈ8$'¤¢„k)­Õj"ÁG@dfuT`$r0숃pLAoË0Ï|>Áe*wŽ ®¼Arh«™BÃ-°ëxï‘0×^½‡¼ƒá_M?¿Õ*½Û( #j;ŠS k!S© ‚Sì/è³~#8›Ó«õ·6ê»F®i戀DÝ–a½}î÷ºWM»²Òoئ÷<ƒªy²‘[¯İ­»Û2‹nÐc¡÷ÜmàŽ¥²ã(ˆw¢b@ÄjVÍÍ #EÄŽôQB¦Üt)ž«DB·~ëÛâý®&dýšäÞ:®ÀTkssF"¢@nøZ! à ÈæjÖ ˆ@Ý }+—ïvBCÄÞ7ìHˆH=é F wxmf0Wðæ÷eÀœÌÑ¡W öBCrˆ¦;X“ÿ´·ÿü½W]íûU×\.k¹zj‚uÉ|^Rkëíñòð8 Ã耥¬ËÈ~H!·µÔ!øqÏqˆŠèEH"3ûÐÌÐãÄ4îÕvßÎó¯ŸO)úïÞîÇq˜—ó·ïß¼]þðóã¿ýz¹ÌEÆ#9Ú–#ÇŽcÄþü[¸ @Ͷ p/|74#ÐÎ80÷ÖÔÌ¡×$1"FïÚˆ#’D!"cóþ×¹9¨[ïdì­+[ëþŒæ›ã΀³™3I蓈7­«-Ö§·éãþùÀóÞœaY5ƒ©0³9VCt'BfÄÄa7@kRôÈZÍPÆ=”0ÿ2/ó÷êûãßý‡Ÿ2óúÿöéT01½Î(ð颲! p7ý¿*z=Ÿ@w“÷ÝösoF…ïOÛ¶ç?в{I^åY÷M_ì#’£!ñvw³n•rC†Š˜ +Pç2Bè IÖº6ODïbÄ¥Á/ÿ¶ž~}Ö·$OðNòqHŽIÍ£º™:HˆãnÚôCæZ[]³å5¡;£º5׿®ËK½9ËMKk)®E0×õ˜ã0ì lÚžŸ©9bÜ)X]ZÐ,b£à9©i^ ãj5·ŠÍQ`t‚†N Z¬h«àêŽ"Ì‘‘Q ªƒP,º6-ÉÄIÁÜ‘†„2¤d ŒûèfË-±gv®@†èìÍ[©­©¢„q¤ÍL©tŒ#cc²È‚$.R弯¼¦yæRcÃ=ðè¾?"²ß5ð¶ÿ·SŽzψ¢‚©8R¯šPèuГ£°y¾^«ÄzÔ”Ì,©ƒ.šGÅþ{œ\È:X¶ò·ºÜî|¼»Î¼cŒ »› ÌÁ ½÷¨Ãöp÷r2oØånØÚ3^³ThŽ® M¨ ˜;¢E„ØGaï¥w ¸a•ÕaÛ0º×È ëÝ 08v΂yâû9¢õð1¾®×F è*¨ j¹ÚRƒÃ@ _Û3º•Ž6YÆû×Ú}(¬M/s[‹˜ŽÎ‚t‹B5«}¦w's|Õ„î­ø\læîÚ—¥­•“€Ì´§€ï“hÿäSwuWpë†Pƒ(ŽLͽ4+"ø°›~v?§üû}ûÃ{ûé±MÒlõó‰¿ÇÜh|·?>íêÈZÛ?N|˜ ˜.­Àä°ÝköºÚ| d»}Œ9c Nž¦Èòv¯L*PF‡÷t`ɳ°ÓÀ Rþ/ÿÃï÷‡ã›·?gxÿ¿þóú?ÿÓ§Oß缬@鎂EŒLwÚ禌÷€`´É/]¡'WFs0­­Õ€ÂÜ[kFb"îŒc@wÃ.×(pçÎ50½s÷ˆ»Æbà ¨NÐ̼RœX¬š›šA;ðÍÇýß¼³`_ü¶ØÙ¿®šý2>Ó.Ôb¦Y¨!¡IDW Ð ´±Ãã8ÁE\ßìÊ·úòËeýó—ëésú¦wOÇ¿y÷Shm­ÿ´|9›æEÛÛ~Oããøöß/tXÜgúÒGËÖr[f[—[0ne]g µénœRT^oËí{! ôc¦U3h!7âaXòº2ä! 6SÓ‰S U—À,ˆUƒE `TÔ–ùùrºd£0Ž)¦Nß9…‡7µúçÏóËíz8îv»‰‰ÌQ “‹4-ôÿSõ&=’lI–ž wPU}ˆˆ7¿|™¯²Æìb£@ Á5ÁþYîøzÑtwU7«3³2+߃6©êD„‹«æ‘ Dlîfjªråœó-]~þá»<¥íz\MÌÜuz@ƒ_Å ßn÷·D„µæ™]ìb…jæWƒ‹+磂U­ä¸_o\耪È4]¦ói¾\Ò4‰* ‰ª™yGÁyf&"ç=8wIBúµCž.—w9‡)uÛͧŸ~žÎG­2s_™3Jß7¬É¯xØn|0”n·¿œ¦é|ATbKÓ”¦Ej.ZKtÔuÄÍvÎ.ç)¥ÌLΡóÑ@s6­ÆV­h©¤ÐJk1d…`HÎeµêAIˆÖ*ª žœ)ÖÌ¥"92’Œšj3&¢©çRPÅ2ªV#D°I R* A#¤(£/é¶¿o܇Ã8§Ô‡áîv³êý»wïß½:œs*¬‰bµ¤ÏŠˆH‚Çq¦C‰¬*±”ËeþùÇÇW«´wu’ÇÚ4O!ÍyžçaÉtÞûþõ›u>x§ªÓœžçi~§S©ºÞø›Wû» oß=LçË8”4]žŸ/¹êÖÎ95Љ9ÕØݨYhƒ/]ãE µÝ–¦eOÕž§ªZQ³C»Ùtß~ýÙ—Ÿßì·})¢ºÎ¹:&© ÀµH‡#·ñ9‚YU#lÖÄkö MÁNL‚675;AEk 0 mЬÞWG""bÌÔ×J§Ó4™˜û.t:/Þs50Ãà;¿ UsÍ—Ã¥ä¶û™èéù< CtûÝšTª–¬ì¼¼OãÃáðô||x<}xÎãŒ*+N•ƹœ/óãagRìÐG`¯È`Š& üK†hâ. #0!9DÒeä_È;)›Hm)f/ŒýËK“ôô ÚoÖD@±1ÕyLÁ»u v„&¦í‹ÈE†÷ IDAT¥JuLÄ-~v-›Á—ê$ÄíÍ- KøŠþT5#4½–»5‘cïðÄôª1¼¬Cµ% ‰Á^ª¢k#„–Z2ÈøÂm²Ûµ`ÁÈLMÙUF„ªµm‘Ùº: 4Ǭ€Rh>MÓãÛÃ>ýÍëûU¯ yN³h@ôÞójÓ¯÷ßG1ƒ,’ –Ò9ÄÁÇ@E0 ä"Iæ\j.ã¬s–ãéõ2DÒÃjM‘ŸŸüwxw£‡÷N+ö+@1ô¨ˆŽ0 CÑ4ç™í\JIeþï½#KZ€ÙÅàE(—YPa‘jª Õ‚'H*U ¹@Äè<"D Á× ³¨q`, ©0¨©(#›a5 À 5Ïš 3³謞h äŒA D@Ÿ§ÇS½Œ4Sð±÷Á‘©©Ðr~k~RpÐ’6jÔœ±P×|ùf÷éëýÍn%U~þùᇷO§i4ë)ôÈδ½ÚÇôÊ2kÿ~{ñ ]< :UÉh™° Ò ªF ¨„…LE´¨ø¾ø|ý«o†>Úû÷ï>þ¾”ùòœôôõ·Ÿ~ùõkÏX+K‹ê8 PP­ ˆ!0ÖNV«„îéíÃô<…SÑçšæn‡ýðWýi®é¿ü·Ót9’U‘ããÄn¿_oH¶—y Ãýþ“Ûç·ß]~þ×AuÛ;Áô˜.EœzÓ"Áj ÑE?§œªïë4;²ÕÊ…P¨LµJ©˜ÄhÌ %!b烪ä43càFûæSÑjˆ`"P3‰ÔñôôîóþÍ×ßìo_i’œd*׃cRJ‹“qð´_oÖÛu)yN ؘä)‘A`><=½{ÿp·¿ýê‹/÷7ûÕª¯Vß>ç4Þî÷ûÝ~·½Ùí¶Ìx9OÏ5g˜r€¾ïVÀÄMnW3‚¶MlŸ­<Ï—ãááéx8TÕÐu>@Lˆ ZR–Zó¾ëѹ訋»NBsÁÓéÍjýåŸuþ«O‡ïß=~x>Ï)íVCè:WjGõ7¯^ß¾.c:¼w9|«±ôôá]Ï‘ÕO S©b Li.9©ó¤êˆˆØ…ÈèAEj­ fT Š 1Åà}Ã3¨¨ˆ¨Z]à NM%W3at^ÑU |VÕ¶£ÑUT-—Jˆäüb2-ªVQ,rÕ Õˆ‘=B°Œ«8¼Zw÷ë‡øÉëõjp©Ì§qº$ËÕ©"’Gîª8ˆ•19Ì'É—ÊPÅÇPS>æ»÷·ë•³àÔ4—q‹ÜÜ®×ë»@ìÖ»ÍÝÍ>zWr~~>==ÏOéÝÃ$&äÂgŸw›Í6°}÷§ó|×Q6½M‡Ñö&FäÉ¢APD ßÕÌMpY"ãr «Ö e—5`Ëþòzõ‹/ß|ùùëý®ËUr887Ïeœò8×"š$›Õ!ƒ9ÄÅÁÛì´×2÷†óXàÖò¡B(Ú¨@ŒÌ ¤V—€›ªaYh¤H^°=®TÔ$ —Ú)w€8Î%§Y:dò€] 1ÄØ—‹ÍS¹œgS[m:ŸMÏ©ÌyåÉHQ¯ÆW#à ffMX•œòùö&þûß|ó÷óů¿¹ùüõJkþþ»÷ÿéŸøÇþñ_þø|8œ9nÑEvΡC!»nܰÅaÀ=ø†[ãT Î  a½ “¢ 9€ ÅhZoãg¯Ã›AÂ4«£q–ùãS:çÀäpìèx¿raÈHÕÁSE3ž UÁȸêÍ­€| ë28 ]Üm)͵BúÙ>„ç¸ûÈßþbzL¿ÿ×qž3x¶ùTLJ¸ºñ³ÁŒ)óp÷m¿ûòûħw¿ë9ß 6‹b®•%Ï… 6ëÁ…pž³š¡|Û÷«@*r¼d@ö ¦9UˆÍ€\LIÍTjö`»M¿Âåxùp8™E ƒ¤lãD]¨)͇CϼZ9T›‡wï§TÄG).Ï%O³”$ÚS¸¹yµßïÜÓy*ÓD³ ªš'2çËyz~xÖÛûû–îrØû¸ÖÛ¸^÷û›nè»ÝM·ÙOÇã|>éé¤}ŒL”Ó쇂ïBÇä^‚†9MiºäiLó%Í£xÇ<©A®õr¹Ô\\ˆ½jïç)ÍçÄHw÷kd­’K¹\¦áõë›O†ÌQðÝáé©–ùt9Ç>€bPb«ÍœÏy~úð®[­âæžÇR/AÅ9ã*¬ª¦Ó5UPñž=ªÖzI 6ѳ™Vt©VÇ´br„ÞaÊ%åJDÞ³2W&@F-UK± 1³OäÄHjvVk…b†D¾ ‘ÈqiI¥©¦k”w¡ëgëS­Ô´‰îÛ_ÜêúÍÝë7õéÃûÇÇ“Ž™µu™S„vƒ`*àß_ˆKí-“e°ºµ\Æ¢­=•QTRÊèæ¤€X*×Ê*bè‡õf³ó ƒ ½?Žùñ8èn[†>¹¿‘Z?<>|pûM7¥)×¢3‹‘kÃ.7ÒŠVÁ@•‚âÂÜÐÿ PDaB3-µŠ1S­ˆuµr¯î×7û!LEr®&2tŽÙ›ªªˆŠs›–>Ôàr-¨ÖDz¸¦–œ7“úÒÛ€? N2aSSÜöJljFÅ,« š0 G`µnα3ƒJ† ˆ=‚©ÌEð’kU%(Ñ)J"v»q†ÓÙ¤r×1W˜S®©š¸.¸ÕzµÝ .øÓ%_.išJJuœË”k©˜Šæ”‘й`­8@ .ã\k§,ÚÂ4ª"¦¹õW)ššš6yýŠ91`"02$nùŶkˆñ¥) ?öŒ’¾œôÉ @cñW™((ˆºzÍOç!bŒÄ AÔ¦fS°J ŽÈ;GÔ ÿ܈ߒð’Ö½fàePo!`B`4\ŽlØf˜! ô%¼Ð /xÇ+¬ÿ¥Þàj¹6SÑ"’kMÂÒL=Í2ô‘ØäAÀ VØEGÞ!‹Äf›&4BÃÙBh1«* hì1¬¹ÛZ¸9ÈÓ<q¡r$ßõ›Ýýë׻펙´6D[U$2¥\´ÔªHÖœòB̼ŽÛXèt>Žƒ·m ιYð2§1”t™êãsöžœg˜µM´Ê•8+UØ ƒäùœg¯hˆÕ@P @®Eu©®1‡…‰bdï±TTu¤Í#Qe/†³yïú¡Û÷Ž^³h š32‹±PvEŒ¥:…Cßm êTÇ„ äÌH´šf‡ÆD‹ aðÈÝ\ãe¦Ã‰¤öŒÎÈ4»öµÎÊ•¥Íë¼<®Zo8\ýâ`À@¼0]_(AðgµØ/¨âö×PÑ*¡‘CÃHä®átc{áe¡-ù’v.UP´F“]RíøqÉÝ"—Š „¤FæÐ<´ôÎR·»\šmÉa`ÀŽˆRÍÒ^ŽJ©¹¶~+¹šÝ—4¶-Á¸ò¹Ì/´éU2(Ù¡ ©ˆy³Ð¨ÉËÝcY¼(Š*mì Ú¿Ø1 ™‘›Ž×üéfˆè˜Œ°.Ž;Ô—Îå¦5.3%.ÒØU²ÃF»A0¸ÄÑ@•™‚ó¢"R@­e¥Ú§µÝ^ˆx¡#".ƒ¬©‘L+.Ÿøz(_oùë×® ñôTÞ~8Mv¬Œ›Á­ûPêa$tDFH&„5ôýj5t™pN‚X‰+°:ÏŒQs©¥T«BGŽM«^JR`ö]Oìj5°Ê¾ Ž2‰’ ÕÑêÙÁ À f–½Ž7½û믺WvŸ.Õu ½ûöW·ÿ¬ßù¿wþÿå»úÝO×Ãú¯G2ZˆX–©u‡é)øÓ_ÿúÛÿóÿø»¿üöÍ~%w‡d¿þõ«ßüæÛoþÃïÿŸÿ÷ÿÓ¿üt)¹È Ø[F³„š];<²#ç¼gBGä;嵄½ø5˜eÒTe‚Ò#u(3jejjDy2Iãš¡žÎ4]>Ý߬¹;<ÍZÕÞ½{ïÜÑѧÛÛÛàÈbI(©'ïA!'©„Jƒ‹Ød·ñòɆXŽÏ8Ÿ3¾;rŠ[¹{Ó;¶7¯q7Ç‹ål ”ÊT']wûàûçǧLJ÷¿þµSýC™ÞŸÿ´óvs³ÁYÆbÕu7‚ôþyšŠnVƒ#t ]ûŽkV›Î¹dv!‚BJiNUÙǹâ,¹‹ì»ŽIœãP:ÛíÙÓ˜Çút<^Þc¹œÇÀ|x||›Êññ™H‡MJËMišú!‰}EœTTÍ;ÜmzQ>_N?þüS÷ü¤}ìºØ¯ã0tC>—LÙÅnècw݃(^F-y/ Á)8ÙV0U-¥Õ¦iLS®U˜h5ôÞÇa½õ}ΩÙ<Ž dª>öÎ‘Ž—ñtº\.èýý«7«Õv>žžß¿ûþûŸ><oïï÷›õº‹çûýóá >tûív.õé|¾<Ô¹>¸Õvw8ŽcŽqõé—ßNëÝñý¿ƧU©ØÓÓI r)äÉwÄsËxU–Á‘« æ0«ˆÔÞ‡èˆp*å4Ž]Œ‚ ºÊ”­ª)°3JÞÈBm¨ˆ$ˆÙªhEDBGæTH̪SA©(@„Îqˆž¼›g8ðÔ±±Ûl6ûÛ¯tõÉ8ËÓÏ?ýøýÃÛw§ç³¯Ðz$ò„|•©qLbfÄ™ÑÄÔ˜=qD£î<_>œŠÛq`4É©ðe"dÿ|.ýÃ(ØÝzRåRL -Ýv·Ûí6‡ó$’×}Ü ýf5ÜÞîî_½:Ë\Ï7⊹ñ\&‘ mK(h­£fQ¶ ZÇ 5y™À@^pv¦Å‘¡’ A%€œÓá|ˆOèœCÀ.03Eï‡^÷ÛžÐñf½ÎIèùôó\Óu¯Í`‹}cÄ— ^»\ÛZ°q3Äœ.áÓf7qfQgKZ Ñ„v4r{ pëÆ5àHUŠÌT³3$%—D‰wŸþ/—KeÇ!2€4nJ¦Ú\ÄÎÆòÃO§Þ^Þ?•çc9\êéb— s11ðfA”ua'i­µ”¢Š€Œ-²¦Í£LLèœ! bó8µÒMDeBÂ¥êrÙéa K0jã1 44«‚jƒ"]ûœ®Ñm5«f°2UÇâƒwŽ™‰s\ŒÌŒÔú• TµíÙ1³C¸ÿÂÇ’ˆeйÂ{®Ž…ó¿X1‰À´!+–9—¶‡H)"áUÂoC?.yë_ñ²¶æ½×?«3nFëbZ@µ’G9ú\ Þ¼ƒ¨ ä!*«º\Pt!hË:.lÓðHE,J$Ù1Íà•×{ö¾úÍn½»q%rʵ$µÚâ ó”çË(5#™1)s6RcÏÎ4K=é*F‡\RS13çÙ9TЬ"Ää#"[­µÎ y@Ø„nÖÀœ«ö«Í«O>Ýìöì=yoHSÎs΀è|@òf¨bZÁâŠ1²‰jª$½Å5ºãM‰c±Á‡ýzgeTôñ`¡(Y›p¼QΫÍä℘új~DÊ £Xš¼¤H`ÉbýZ´?üÓ3ϳ7pHÔX-¸xÀ¬¶_d… "-Ùöke\/ ˆAà¡[®övI^C$íD‹ÀdÄJ(ÍäcÆ¢,æ\#Ý‚-¥¤ LTLÛ‡m©šnŽöØÏ ·Ó P«A%¬ŽÄQE( Jཛ©´sEÕ]¥†vêaN•Ræ"dCOÛ!tÁ!¡´XD3S­j ˆD~©î€%¤ æÐxáî.ZZ›<—õ`ë‚34¹BŒyÁ®5t !ÁÂ_@|1RÙÒþ’í°‚’UrSô—Àgï&rÕ¬ªåR*‚_ .z“ÚbÒR«°ë:5Éo€Q6cD$«–¦:MZÙ9œ.i¾d"T“9OÜùÛ7ûןnþòW÷_¶}~ÿöw¿ýãy„7"¨RMUÁ z@a*Dæ ãñ7s÷ÿ_ÿð¿ÿ¯ßÞÝ:ç3R"L8ÐêvýÅ~x}·º½ñÛ l7~»éØFHïXžÎ3XF45Ô[ØH؈ïÅ{ lÌ‘‹ï2‘pE4ˆr™Ž0?¼ÞØW¯VAR¬ùWŸÜ~ûÅÍ~eÑgR‘#sÝoûØqªsšÏ–'fðCàÈàCç“BVpŽ‚ÓÞËvåÕäíÓÓóyr¶Q­èŒ}XWí 7®ÛÙÎS‰Ýc—¦Qµîooww¯„ý)U!ºUÍšÇÚûÕjs7þþíù8JW=³¤‹Ia»i–ÃqLstÈ\Õr­EÈU#놸Z¯º.i.£¼ÝÇÕÆy—#%J'; Læ‚gïÎãøáñ4NŠV;˜#aW ¶¢p"»½ÙÜÝ߈äÃéÙ€6ÛÛýîMì6Õ0Õœê\jrŒÁ¹’óóáxºŒÌn³Þxç¼ãíÍv³Ý€‰±cœ÷ˆ8Nãñø\jAt¦d†Ze<ŸÇÓ©æ¬*¢*bH8¬V··¯nî^oö÷ëýͰZ3»èx·Ùnw;ïƒÔZE(ÄíÍÝ›7ŸÞì÷h0ãátz÷îý<ÍÛõz¿ÛÅ~«U7l†ÕÖû(9•qÄZAjJ#yÞÜÞ¹0†»Û7·¯^Ò9ÍY¸î“b1çÈ…zÏl* FÄäûJq´è¡ÃQ#"sªS®Å :&oDÂÄ«÷q1™‰f°ÙQu…q4´-5IbÂh¬¶xÞÌ‘ëB·Z­Ô‡§$SΆÃÐÝßlïîö7¯Þ 7oNÉ~ÿû~ûÛï~úùtž¨Xܱ Èе½(-Ü–6©Ró¨’Qqµ€I‘rAï_oî^­œw‡ >$‰E1e“JÄ.öbtÌ¡*Qïèn¿úâó×_|öÉf³j]™-çÙ–;¢0Ž5eTH®1?ÛnØ–¥sí¼nÚ­a¿¦í@5—\ H‰¬÷7á~:/ 9°®‡°ZÅ~ð΀:¦<cÞmWŸ¾¹ùú‹W¿úåW¯îîÎçñÇŸßM¹ÄØ17´½SrÀ„ Aóg¨«“Û‰ƒR4pf`RÐrãÅ! !zBDJË6¨ ÃdK&––Æ'xi#EdÇRJuÇãì½g&©µˆª ‘å*Ód"zžäç÷ãy4Å€ÈÌÑ1BE¬ ¤ê ÌHÀ°*€ZXÚGÑtÑñ+>!rÚ­y) )ˆa ƒÙKMZ9BU0S‡ÈK+¼]+¹t±#7)(¢ÅL@ŒÄ¼ÌëDüò<·k”×ÌÀ{׊LZBÚtd ýiWØâò{IÚKSÏ2‡™©ŠhU34lõ¤Wá ¥ÍôJ«kܧçþÕÀèðêÈ&ïÀ!¨eÓ*M=30Et ]°”¹Ì15ë™ÕöÏ‹TQ4àkÓ “qÙv* ³ïSÑŸÞ—Ý/vÝíq缊žçã VMçȵLˆREj‘ZL 9ð΂ÈåùaJðéëW&z<’¼“t ‡±÷ AJN&dF¢¤ÀHÑâ :Ï1†¹’vÝz5ìÈ;Wjåðüî0s™ïûØõÈèTªi6¶à#- ¬w®wFƒ·mTaLŵK5ž.Â,ŽØ»Ô)G ¹JQT"f…U3гø2Í c‰ÙÏ&s€AM¬"«÷qµcÞ=ìáÉæV@(Í_Ídq-ÅuM‹"DÆ„¤Ë‰°©Jíææè#ð°áðÏ¡:íMm+y¤k[õâ’®úbJWÕ †Wè¿äfÚˆÙË®"™©©X³£/r«³hß¡  ,ºD]6&hí3M:…Hm£Uµf0DS'Æ(£hñŽÖcÄZ¥:|!ã#6ö¨6Ëd;>S;RÑòB6ÿQefÇHh*PJ*&h^´Ç«¢‚Wyå¡¶M"WƒÑU¢UKS­¥óUqΨºÜÐ>~œ›`§õZ|­—B{)ñ^ÖMäcC,&9)"6ºk«2hõɸpÁ–uЂûiü&"‘âj~³ö¿ùæîï¿Z¿^áóŸÞŽð0yö–x.»™VÉ»Ñ,Gv¿Š7Û°Ý"u€OÏåô|RÑïãʱ+¦ê"™ë•á:{ï :KhÙÄ™F¤èL˜C;t’6²'yt˜´Ì3©‘!£ø.1ªB¯q¨,zzôn÷Åzû¿ýíæùá³ÿü‡ṙs¢”kV 7pÐ"0rÍ%ýõ·_üÿÿåÍÉ|æ `ÉòI¾Ç¤ƒ„ÿù/»¯>ÿËž¾~:ÓytÞ?Ÿ?ˆ>õù\ÇüÓOÏýFÈ{ŠÎG£Ø+BAU,j®U³ŽÇ¢UÓ§Ÿ·îéuX¿‰ºŠÛNÜÝz»‰ aþì÷×S~ ’Ö›¾!æ„ æƒ'F¤Ú9ׯº¢áö>xîAÏÅ[­T>äÖwTqž $]$Œ ,Y*‘IpHä(8纔Ê8^YجV››°¾SM”+!yöÔ’SÍsºœ3‡.Ä(µ\ròžU*˜YE¦œ™ýææÖÇÀÎϧ”3‰Äq¾„ÑûÃ<§œ&Ýì¶ëý>ö+"ï»6ëm¿Úº‘@ jJ2Í. ]÷ê³Ïß87KÓín;ÝÝWƒªŽÙ_ ôníªžOãO?ü8ŸPËn³íúþ4ÏŠôê“O^¾zþp<=>§,ßüÍ¿ûöoÿêwÿò_üÓ÷Žãöõ¶[ µ–ÃÇ© ‘ëð «á IDATâÆ{£P°µºçΑg'9W©¢4æ’”üjË!t]wÄ=­º>ÆÀ~ÊZŽ—r*U[‘AE’ä¢ÂHm`rT8D«@N œ±Ëì“ÊCJ hµ^­Öë~»ÙÝßôÃúá|øé»ã?>þðP.St®gß!‡¥ Å>›£ùêÕnr'‚µ4î2¥ ·qãÑLžõ<(J(Œã%—Ѷ¿Ýì½÷ˆà ½¿¿ÛÅà^Ýí| UÀv롾º¹\Æçã±ïxµò!æ15q–èÚú¢MXk×óí¾V¾ŽÙ½:O%å$N‰èv¿~u7¤y|~:–¬ÛíöÕëÛ»ûͰbO¸î‡¾ëÁ¬J>Üì7·ûa½î7ÛÝÃӸ݄,xsRihGÈ×ÞÃ@èK‰':@6BSU´Š–A³1P p„Üî«ÒæÆeÍ‹^Ý &&˺%g©) `¥äªuG·[Ebè:ônAŒ€;ðžB U½\æóEsFÅÙ¨Q&‰‘ÁX—•µ.ö`#P6ÐÆ¹D@d‡È×(aÛ·µ»,crûsmëmÓV?­!ÉÄ,£eiˆhnîw#h°6ñ\ӿ΀ÍÔ¬zH]ðÒc Õc!n“c2ÑÖØÒÈ èÏ =iþR2¼ü/fž— °¶ŽÕ…ì/ï²}¤zâ5n¹ÀA@m!^®ö-ÑQ$DÄ9i14fd@G=ƈ޵ÐÌ”ÀLÕXÑ êr„¢†w¡å*Ô+ÚÌ |5™EÅ…a¿6kŠÃP,¼{kMÓyÊý68²’Å´:‡¦Ä ¨h¬s¾€À8¦9P3) `‚ô”?—§ƒdª´ÞÝ|þÙßåâ,IK*†çòá¹üôöôÿýóþðûï§ù0Nù÷ÑæíÁ»¢ ÑÐ323öqíݪÚtvV•-uŸn_}ý¦ûò“Þó`¥ëûPëñ|xdGŸ|ýùöîþx<<¼ýq<Í»ÍM N‘|ÏìѨ"R ¤Û¾õ3ÎPRÜö¿üÍWŸ|ùÙÓÏ—÷‡ÓÃc1#ÞV[ÇqTí{tC}åCOÝåá]™žÑºqžþ8Í—Kúä›_oo> á •,ÃWuwœž?Èù7ùênç˜5Z¤Û R²Ì—sµiE\¯hótq„·Ÿì¶ëÍÓóC}:VáËIPçM·Þì:6ㄵ$2†¾Ûǹ@=ŽR­–ìhÚE Žz<±dÆ,5Ó°½áîæxÖÓarÁ‘š<^.—|ºŒ Õy]Gè\žIMA»Áìñé!¥IA¶ûíj½Ùî×.„\êeš“wÞ€ÚhîB7týб |Q=“¤„®ëûõ:ô‡¼£Ñs[1¤i:ÇÃAVëÁ ÏSUYïv]?ÔÇÃt89æaµº}uGLëaÁ¿zó¦ß®lšR®%ïÿôÇ«óøú~¿A›KV&Oènoî7ÝæŸÞ¿{ÿÓW¿ø‡¿ø‹_æoß_J‘~w÷é矖<§ãÓcŠÎ9ê\OÌb(*Ž™ °Zô~¬r."Îhö«m¿Þ«¡ë;«ÕTüÐû¾GÀérÉãsÑÙX½e©¤&N…9ôýà0 88_4¤¬ –ÑÆ©$«lÂÝ~ØÄÀŽÙ…šËÓÛ·ã¡®Ö7ÝÍþIæ °fÇØH*tm¢¬K=å"[*ê5`¶Ô³:ïÌõ³uSeBË&ŪVËYgÎóx.ù²^û§çÍvå£#=ž>¼?Že½Z }¾L³Ló\¥2)“HM¥d"êûnÎ6f„ÄÒÌ­)1Fô~)£užb䩈jE *8NUÍnn†ÝškÒÕjsûj¿Ý¯Bfܬ6}ß×Zç)bk‘ŠŽÉ´–Y5;F"ZKæªÁ¨‘宆 xñœ¶üXôX­5ýf²F¬Ö…%¯h¸Ø”¾ÍG“ˆˆ^ËqÕ45€hÑšÀjóä‹d‚ÂhîîvP­MYF@‡Þû<¢J)9«Tdvœ·´åùÈ/°ì$æU4o? :C²†þl0[5´a0[ߦª-HË…oÓ„nÍ3¡™9gí!‹‹]æŠÚP²i55õ]@PL€ÕÚ”Îáòå×h-]¡ÓHÌDtÑ›‹yÙØµq®Kþåÿ¿ö½,d—æ."â\¢«¹xùhø?¬h_®…«Ÿéemø±èJþñLæ›- Á{ Ž#`jì—¶=6e4dà†r¬ímâfi¾~>Í´Ù* ™b }ônEÄD8táRܘuLÖ‡@BvÎNR ª¦äœ‹žÀƒZ­ŠP;VJB§˜J)Õx=Ìs ¹ïå6/yöŽ@KFf"D<øÐ›a•’KUdbO¬µ”iÔâÄ’¤Ù™÷":Ï •Ê4[ÎÑ!³¬ê@ƒjÀŒì•<:(P“$5ŒNûƈ@쪤ÓiÌœÜ0»ž:™½ÎʼnpuLÎYdòŠ€2©•콘õ1®×»éŒuÎ v:ÖËs/ŒÜ¡cQU•v2$ªžÅpž °V¬ ª@dµšYUp¸¸à–2ÝÅ~m–Ð¥Ÿ¢…F®ºØµ]wQ¼®:ÒàŒSµ, >Ó « ´yPT¡Ñ—’ql†HD·º@«JA¨HŠF˜˜ «¢47Vöµ @ˆ¹Ê\ Œ´ö—ÄË22·y-TÉÓœ¢k.¼B¿EÓZwà5ð‚ý~ Ô*ž :Q¬¦h ]°>¢wPJ­Rܵ¥QÁÔ*€!úkÁ¼4é½÷HÑ´ ÃbjˆLÄ`V h!! 7jenä©`mvpíM[â´«¢]˜ªør·1¸õL¬‘è*>‚¡)£êežÿøv<œNSeƒ}„ÄV@“ómˆÐ¬\‘œkòP•TVƒ»{³ aë¹w+ D"°' €‚T3šÊ¥&}ë=ùj-)ÕªÄÈÆ‹Ž‰ÒÜ«Fˆ1xëΣ‰8tƒÁ+³é¨VmÌ©Êi½÷ùåæ“Ûý‡ãn¤Û‹Ý~ÿ®üé?þëï¿ûýO?=ާ4žCL§s:žEÕ›9)ëÓÅåIË8_Êhs߯ÙÎdJP|`ˆøB÷ ×ßh?ÏøÿîëÇ÷žþÛoÿõ·üasÃ77ùáá‡w~¾ä’•U½‡þóW÷ý7Û×w÷LâQ^o^ÝÄÓ¥&;ÓT¤ ±TžÏ§çŸßÇk)‡Ó嘭œÈüÖº»F’ ª¶ªífAEôª ¥ E^¿é|Ü?õaԹΞ5UÞÞo×7ÞðØÅzÿÕí´wïü0ž*V)óáñûõì¾á»WquûÉýWo\tåüô»ÿøoÿõ?ž?>=Ÿß>i²Õf{ãX.6לJΈÐê¼MUˆÇŠ2Fºn•s9gƒŒjP¦ÛmÜí:–ûÊIñ¤„ÝÝÚ³øœ$W¨ ¹ä\§bÕ¹‡N1ÖjPÀ™AÍçóû|xkÊsu] ž8zD§íÙ…ÏÏO¹ÌòÿSõ&¿’%WžÞÌì>½1"#2“L2k`±©.@‚z!@ê…þk‚ZiÑ@7ÔU¥®")2Ljx“Ow°áœ£…]‘Ú™/ü¹û5;ç÷û>ÉÎóv»½¾¹uŽÚ®1„qU­2qTKQtÄÀD ;êúµs<gç½™s×õµz<aJsJñ¼?>?>‡”RlºiÌa»ÝŒq>)¥°^@ÉI5¯WíöêjµÛ whòŒ«®éû¦4|óþ]ÓuûÇg"èŸ?=uܼ{ûöÝÛ[ÉgFùøáãóË¡ÛìTm.r<T]d®kÛ~ ã0¥8£–Ô#ZÒdO¥¬v«/ýíÍÍT3—‘Ó¬ÃùüéãÏÏû'ðÜ®7ÀÝ4˜ ¢¤(‰‰Ð·¥„"Iµ0«•R¬ÁªuWëfÓv«àÁô|<Ÿ_^œ­×›¡NN@J–\ªidõZé Ëw÷%\­ ` ¾tM@ô‡“>vܵ>EI¥¤l\%ö‘¥˜Î§qÓµ>ø”ôñùøÓ§cßõ*Úw b*¥%&3˜¦X²ïºvN%–"¦ˆÞ €‚™ ‚OmËìp˜âË~ȹ 3;^u0O¹ÖßþtrN¾ýÍÍ›·7¹kºÍvÝu ;`¦ÕªkÚ¦$6)*¢)ÉyŠYaž¢dU5(ª©€Ñ2°ÂeNdZs´ËàØ.é‘ËþM”ÀX*»ˆ„°T)™ƒúHZrDÕ–c@Hhˆ‚VŠó…ƒR5š˜€Z`»\Š”ÂˆL.—³“¯mñ,)B)TtA¢. ‚yuU.¥X´Ë€û"W %ÆS H€¨Ë þ HPÿ¤’Kêzb hýµºKUxu¡ý×wÍ—-¦ 'AÌ`1#dU¨K0@b"Ušƒd¨¥N _ÏÞj5r|!wªÁ¶hfõz%÷_þÞ+‚±þl¿0#!28 5Q¼8~Ðàs¼§Æ¼í³¹x‰ÌÁ«ýé‚^©Â›¥`ÎYcÆ„è=9‡Œ¶øƒk,âu¨OumâØÚ€ s*j€Ñ¿vH Iaq¡S°Xlæ>Ú8L»·!¡YãÈ\³Û]Ûâù ÊIm2,€™V’¿dò´jˆÖá¬9žò4i<ï§”óvÕ÷¾)&Q$@bCO†DŽTXPc@œKVvÛõfݵÇyHD¤Pdžƒk\ÔTpUE #«a`àjÄ"×´²7+¢Àdž¨e-c´9{¡’5ŒÜ­ º<¡¥,$ƒrãµëÀ°cïH]cž"Èj³½½~{äxÊY$Í2jâˆ`FBGJ``ÊL}×¶-:O†œ’Î)«Š¦ )Už~›P ó\ÖM‹âºVNñó:iÙÚ…³œÔkÏ©ÎÚMÑJ㨠ž¢Š¨!𔵳å>'$ëEÐJï«kU ¡.uQDpLÞ²"b(ÎÑjÕ"¢œ'KK¼©~•а¿¤Þ–ë5 ’šK"I¢S«œMÁzI±zó[ú9DËRØ8Íl¯±=2ôjÞÍJÑI-7cL–r633WAZË×Q/Èzµ'¨5„å[i¡€©«R3+ˆ€æœ×2ݹ@¤©’›ìUӂ´ÀWÁ h1»ô–Þ‡ÕýåÿO¢EU”ÈÕ[+°Cã\âÓó§#ŠrÖw¶Âqë'²ñ<SÎä}ÇÖó|³¡··›í†š–=QŽ37´Z7‚o@D .+Xë €TKV»žCO«k+ @¤F€L-˜Wƒ‚˜Ð€ë;ÙTÒ<Â4PA¬¾ÇH" ¦X ˜) RÑòBåx×5»¶“Æp³ûÃïnÆÿáÛ‡‡Ãþç¿þïÿçþçþ3¹ù׿zû¿ÿöW_¾!Ï É4eMIKQ3×67ë›öf…zNû‡<´bçºMØí¨ßîÂ:lwá7ßÞøýÃï»§—÷]`›ÏßýùôÝ÷/?<öyŠèÕý¶ùòþ»?üýïÞ$âtصÀ‚ÃÇô8Ñ(ŽsÒ$Ì ¹œ‡áåÃ…pÕµÐPLY%­À#8ö¨YE êÛ\€R€ZNÇé„>7;Öëë·2”§Oxz~ŠåØmVM(ZҘᮬ[å–§aÏlg)>ÿü×ñ¸º»ûÕ·¿}»ù¦íW¯ôê¦?¾ì¢†6<mÕvÀwCzÞCX‡Ð5+Îõó„yN/û33³ï¹”«Ýúfƒmˆ ‡2 !› `é‘5”äÚKˆè¹›-.ãt,“(ô%cá6¬‚k¼X–xdã¢*ÓtzIeŸaÌbBT¬aò®eï[Bo¹L¥Ì%9‡Þ¹4OO7›a½ÝÆœÇa@@K3¨XI!øãQžžžçiºhV+ç=3¶Á#Ú< @è˜Û¦5•y˜bŽ1FMSªØŽqšJŒ9ejüyK)§áä}Xõ”$’cš )ÝœŠÎÓ<!ìvëw_~1ç´¾¾ λan\hCûòø4¬öÛoýë_}I$ÞûO?Ïç·ï¾ð!<<>>>>:P)¥ñþj{u}w: ‡ãqš‡@ˆ(å2ˆÌ؆îêöêÍ]·9€E%0p žÈ/Ç%;½,õ"–A4ªƒ ‡ŽY•΄ÖV}¸ÙmHešÓq“H·Z«:7EùñãËÏ/ÿ×úç?þù‡Õªÿâþæ‹·7Žñ°?¾œbŒ:Ïéå0Ñͺ÷‰ž’rV3Ê„f¬µPõ¬«.¼¹ÙÞí6›¾{|:¿Î%GD·Û4´õÓXž_Ò4N?íßqýÍ×ï¾úúíõnS/1D 9§iòÁñ0ÎQtJÁr‘ãyŽITY =W=Î2#Zæ¾5\áu¢*¤™`‘/tBàŠ$ 3cDSÓdV³Á\kÀj¥žÃ½£¾!GŽ XÌTXE‰ »óäÀ0á @¬ˆP”5]ØäÕ5C—‡ôwªOP^Œt ¼FU.Á¤Ë¤ÖêÒ@­ÆÜ’>!Õ=†h•ð ªYËPÓIæ‘âˬg$³jKµZ075-Œ¥qÀlÈÀ´@˜I ÇI¦©–48Ù®\LDÄŠ¨HQU»ä8‚㠌糃ìÒž­/¾:ˆ—SÚ%γp»k†¹Þäj{á‚/#Ð jIG ½b`@jd@Ľ6Œ¨Âû—QcÝCØkwy9>Òå,§Õ­ ä x…eœ! úåL Z`ID0¢WŧS||I­^®rôެ¿~ÿîöÝ««»õjÀóù8÷§Ó³þø]üùÃ4EÉyšÎ€ÅÐc‚’˜´ û”Ïã‹WVܨëÇBTRŒEÕœ*©jCÄŽJ3¸EöN5O糌§†“E•”ä<‰…Õíõõíý-X~&9rFfîïƒ5Ør-eI³H*ë@ë>Ñ1–SNÉÀ9s›~Õ÷W£Ø|:ïŸ&-p!E-‰•È4:Ðâ\ÒÁ ÏQsû‡øÇÿî÷ÿéùéégrîVÅ_AÝcºàv»ŽœÏé”sÎ2Ž&JäÐ UÈ–N§•lª5Xý]j¯`©Ew§pé£.Ú ´ÏL*«ßÄVS\`E 25™sŠÅ”‰;…©(0‡äFÏr“zÛÇ‹oáp:0rª`µÅnAŠ˜z–.€cc‚9ÕÔ“7X’¡°ìµðóþìÕ§aJš4ÎõðlKòç5‰T—úyf¨d&…Ù¨è²õ\¸Áœ…t²Å¦bˆJdh•˜äˆTM­Ž\Õ'£*¼ÚH.Ë·Zʾü1ššbÕ?ª)˜׳»¨ X}-Å!­ë¸Ë×w1I‰–µßåù„¼ì]t¡¬* ©""Åå2ŠDd¦%–ÂfÝ­ØÚF:wçƒÃ½î6=¯zÝnüÕ®Yo¯ ƒÅVÌ e> e„îJ›ë -,q õ| IDAT^#24¢)AhW®ë•å†\ƒ` bjŒÔ……M¥–Š%‘s´˜ÙŒ3•ÄZÍâ§)rÓzHCÃMë™YUS̹Pœ2¨ešç'â3øruþ×ÿøïþãÿò‡)—yÞ7Ëùn¬ªK 8ÀU6+×nÌB’â¹iÐPÕ’ DõLóQÆs:ŸÌ·žï°í r€Ï«;X½½—ûwo^>ýôtÝ6ë®{ÞŸžNçû;ë½LçAb˜F> {»½Ú8.g ÛíÍuÓþ“”)¸†ÙûNÛmkbeÈE ‘‰‰*:FǯÕóeÅn¦R €s«·ö·××§_M£ûãŸ^†>Êú¯gô}ÛøùÛ·n{Õö˜Ï]ãÍÒþÿáþOÄï~Úÿe_þÝ¿ÿíþ{ÝÓã}ø`iÞn6Šôþ¾üóúùÏÿ$,~³fGPÊ4ŒR0ô]hCÆ2 —„ÃqŠ ¡éo¯ºÒ4œæ˜cÂÃlÝ’â0äÃa:‰Ñ‡†šÖ¯] f;Yœdœ“âɬ̇!>Ÿól˜ œó;OŽŠHJIâd–’Cï!„pÅ­ˆ”œ$eS͹<—OÇãA½÷›íVrùôñÃãï¿ü›¿ýÝýýýn³-sÌ©¤”cœÆã‹xP æiJãIr>F¸Ú]µÝzôMèmUJ„9ͧ‡ùp89ï¶»w hmÛÝß¿ ¡9œsNuÌ·^oº¶=÷±HKŽÙy¦ÆùfÝ‹(¼{sw½ûñ‡þôç¿|xxæÔôíW_½ÛlÖ9ÎÛu?ŸºY¥iÚ<ûç§œ£ a³êû®5+T=Shîzh;sþ¸?¤i89çÜ< ñ|‰¦‘\è×ëÝí½kû˧y.Eø‹ä ‚¡ I Áû®õ¡™³ÍcT±~‹o6Ì@³ÂÑ »àšf·Z{ÂÓéü݇?}øÐ§éí·¬´¡ p5G“L0“Ò2À^ ¬¥ -¡˜©ˆ÷®i° ®i¨ñ„fqšZãéêªÇ3žÎóãÓ(Eæ8]ïÍðûþü—¥ä¯ßÝýÝ·_ÞÝnÇóñx?}:ž‡<Îyš&S¹Þ­ŽgùøxŒ±(0™ :0SEï°oú ×›v»î¾úâúÓÓøßþøÃ_¿ÿibÛðîºß®=Ø´?̧ãt8L"Ö4®ë9öÁG¬$91Nç’ ¦)>¿œÇ)‹y5Ve€Å,ûе®Ò¶ÊÔ^ô„Rá 5\ÊÎЉ™JAP‡Z%âY@Ô©y&@+fõÔJ5dZÍ®*9E«{ú”µÈdæT¬HÇ\rbÝÂξjt9).„‘åIw ˆ×uÍåTØÒ/€öKbõbæ²×íkc—[B5õˆ3öŒ•îlÙMP2ca¶"Vj®?·m—Ç8"!-Ëx"!ªðZ€AhÄ(ÅŠØ\e#Eð„@ MTÔÀ!¹”%§@Þ‡JU\.ÕVlŸƒ¹—ƒŒV[0^„—z°AEŸpõ ™©^¸>¯ÕxûE JÏhù] +—~çr'ÐË=¤æ>–äDzz©v0­i;øy”ÑPM Ùx(² +€2HßrÛ61¥aLf„äÔ¨(3ôCšŸ2vm{½núûž‰‚wºÖõÝñtþøýO‡çg+¡„†4š3)€âú–‹ŠÆÌóìJ!gÜ5RD.*FÌʘPÏ"©$,Ø÷Íf³!†˜&‡¬õX.qžcΞx»ÞýæW¿f'Äx<ïÇ”@ ­‘LÜ~ü4||N©´&¤Qæu¯¡k†L§˜]ú¾™‘žöÇ|@&ï2h6f„Uº RÀ&d ÂH6ÏéxäM¿Ù^³Û}'Yu»›Í•ÄgHßúûë¾o6Ä›¶ïs‰i*ŒI ˆjŠ,³æB©VÞyIõVZ<LÈÄ~‚ãËa>8ÎÀ2~÷ Ž“4Ý‹3NøôOϸëíê*o;¾Ú^oú+9ÍÃ8¥xX»Õzë Æ’gÌ‘4­ê´ QjHÓ´‚¼ö=È«\\L‘c®5·nûõÇrž§ŸäehÎɧbbÒoûhnŠŸçÃcÈúÅ ({Ù¸yÍÓáøÖšJô-]ß¿Ùî®hµÙvmÓ0¤óIæóQ¥L£™³,Y!¸Öçñt¥¡ø:Z5¶ÿ°?‚Øzw‘FŒÝ•ß7C9þðoÿ¥ÝìT%Ïcƒ×Û-¯ºÍ&XãèýÛ¯Lépz9¼<Ä—¬Së“´ v­Ÿ<2Šk<5`yNû—ñør>¾ "¦ä'à ›Tüaß­[|óîöíõêðôt>ŠNÑ…u°o[4h>åßs¤L¡HV¸?ç<§Ö—α ÁU£é çq˜äFÈ9‘¨e-ÀÄœg¢þæö–Bsûæ>=<>~øp><·}u{·Û]wsî{]í®w·÷M×:F&Т%i,ešÇóxŒqRA˜â0ŽÃ1èñðr<<›‰!‡§œtŽíÆmÖWm[R×Z™T²÷MÛ÷ëÍFDÄ[9¤x8SJL¦ÎbÎQ ëú°ºjºnÞÆáyˆ~(«stjnÆ'oJ؃ …øÆumð¾)ˆ§,^J›KQ†<˜>ï?z9©ñÜ<§Q]G]_hõr°µ«y³¢ Uû5åh´ˆ›2ZöN#°:‡«Î­:¿jiÕr×x“B â˜V}{Ó…·o®JÔÓax~9žÇ¹ãîZßÜî~÷Í»›«¾íÂ0NŸÇãq<S)Ù3´mÛ5~šešâ8§¢#d´²¬p ŠiCfçY$ŸGhÁ7ÙEÁ!ÂuÕaÓú•Áªk˜°”R– –¥ä,&SšbžbJ© cNZJÑyÎÓœc5Fr5¥‹À‹.«vµÅOlFìÈT A«"Ë”ì’Æ©/&Q¨D&`©@êå2%FcD1N‚E©zÙªñf(›ªŠ#ÖÊÐÐ š¯çÿ:ä†eÕ}9Ê ˜ÔþEœóÚk3û…R.~P[Hž€uV‡xTåu X¢¡%‚L¨H$ ÎÜ1Çj1g- À8Ó–©îÀk&IØ©«Ú# GÄ€ªŠE-gUUïdÕ¹Þ;Í9‹ˆ*ˆ#f–Ur5ñ03/:²×XÄ2½ü›ë¨uÉ),PÓþYètQí.' ‚ÿSà‚W>½R–{.<"û|¸Øa—^0¤ |.é|Å­Ôÿ6"Wª91! ‚VŒRå;¥8ŸÏ.Íy¡µXô”ZoÁ1ú ¼>'÷tH÷cqÁ°D é{Ún7Á±­ 2° (FRBÓxAÆ,Î×úŒK¢‚µ×騭8HR¶I¬€‰¢¨ˆEó4œÐT0v§\d.Mã¡Ù¬C‹R PÎÓùt4[ç‶qž ‰r»½¹½½¾÷øÃóéÇç¨H¾`SÔROƒ(Eç,ÌŒìTÅÄ‚ËÞ‚+¢æ¼Çx³î®®®r~|yÞ'£ÆûuÊéŸþå>|ç9¶>m;×ùÞÂÜ06΀KÖ“¦¤ÎµwwÝvÛ5M;Ïòü2ûA‡Éæ\5î‹‹î .áózµ× 㥲´î/N¬EíV‰†dP±“‚– “8Rfh¼VŠ¥¬S’¹ˆˆ e¤fyŸ"2².ÀÞúq£ºc2T5Ðz|[à²$æ PPçâÚ60½p‰—«3˜€f$5V ”¬wžÏá:¼ l9/]9Æ$ž‹š%¡lŒè"Ùb©ËG² ùÉ!ù‹ˆÃëwSL¡ –¦aSÕ"E ¢¢Å“VëkVq 5¦…€«£ö¦+>À!1* -²ßÅ÷Á—vo)¹ëñW¿ú¢óÝ?|”t缂’uFc’–,w.}óæú·¿Úüåǧ?Ê)JÛ ŒÛ5þö·÷ÿîËí{ŸîºÒwÓP0ŸMrùîÝÍÕýMMçè â<,«°1tÄêûŠ_A$Ø77mÖœ5‹ED0vÜöØ5T`:—qÿ“JÚñ-5+£ ÷0PUÉ¢1ê0“Ìd"IK–K™…ÌØ(N2«)4Ѭ³N'ÑRØâüáñ%o¯·ývÓí6}×úÖñ4¦8aX¹A2IöÜ’÷’c:åü,ñ…Cnwž‘Lg-‚bpèZÀHHõä=7+ónn£F 3!ƒ *bæˆZÇꑜóïoo)àÁ¸k7vç§—ï†ys{›ýø”Pž‡ýõ n߆Ë0œ§a !x&—g5”Ö“sõ^]µ¥˜˜˜@Ppuû· A L8&Pß8Ú³ <_ßw¿úæÍ»ïÓáì P´Æp“rùáãá¶]‡~Oç“*Jy|yøùÇï‡i@ft<–4å ¬··[¤Õj-§Rd.’‡ád¢š“åÏÃp|Q‚Ð7É,"¹n½¾yÛnv€çÓ<³í’ᘡe^y·vÀ.:ÝfnvÛx~NÑd3³læPlŽùa?ìO£°·„áÙ:á/Îî>FW†Rb• ÂwbĆl `Å,›ÐŒU=C@Ž @rÉ1±C¨¨]3CQ‡Ö«õnÓwM7 ñÇŸNôÙôëÎ_oÛ¯ÞÝ÷}÷ó§§ÿç_¿ÿãi"€u¶›¶i|ð®xx9îOsL^§ÿfÑmËJ †8DsLY‡9C… Ð ¯|Ó@ÎÅ,Mãùt<Ïs1#2…TÊã<ǘešrÊjF€(ER’9Ê0¥9fQv®^ú‹ »Å-c úbò¬uMVª­X«ÛiZjÃdä @L‰ÀyDpÀA!eU+5µ+&*b ä júh‰Ù’÷©ü>úÜH%¬OµWÚO¥ÙÕ'µ^øŠ@ ¶pà Øì"È]:˯åÅÊøQ5¾Lã–afÅ—‚#tdH©ªsEXÁ‰³Â0×1&€jAÏų.~ &òŒ„ŒT€PK¬zž•¢¢–L±ñàHJÑœ@$/szvÐ@-*’ÍšÀÎ/¶€ZceƒÔWc 9-7ž%D Fô:å„Å‹ty}.øEn á³#láÁë¬ñ20­\6†ð sÄÒÆ¾Ü)Wœ]ö öêûZj­8¦¶1M*RÙÀÏé4¼(²#)‚8"0›£"É\ðå”þø—Ÿä‹w÷Ä”bòÎ]mw}Û)„·_+Æé|<Ʊ'k÷Éa.P Ñ;¡ÉÞO9ÍEù†|pnÓ#$Il‚‰šÐ5Î!Lç©XÜl¶ëë›)•!¦‚îîÍ_^ïNi~9Ðó‡Oðpøø4ïOôð¤¢á‹÷_üî÷¿{sÿåÏ??<þS’½ î̼!¿B[k’&2Ú²²\R2ZDW.|ùöêövƒÌ/ƒ@.fdàÈ›êÃÓôø|^6~yoïn7ÛU›Ä8‚ÓäΉº¶ys¿}ûfGŒÏ§$†Ø SÌEª%êÕ.‰²W@åÂ^¸aõÂ]U—+¡-Œc2`0Ë¥maÕ…¾sÌ ’»Ö½½¿z{wÝx:ÏŸ†‡çáå0ÍqN)—‚Š`èŒ<˜Ã%ôòª!¼°©1ë¯0&çÐ1QÀÅ׫¯SX&CfŒêÙˆÀTŠ‚˜W`‚Šj¨'ýËÀ^¡XU[¦Ë +ºªŠu=€G¬äÀJ¾ìRˆÈV¹rå- ³ŠÞEàjÛCTQ©V´Eâ —¥^%y¹~²eÅFpIG š×JHJp±/ þ×ð2 Z™P§›0ÿæwï¯no>ýðñÃÿÛ_¹ÐmŸúÍ—¿þõ—똎ÇóÇvU®VánÓÞôÍWwíß~}û~ç]z!Ì2ó­ìzßûuÚÝͺßö¢:7‡Aâ)å¦-ÚM>?Äsw<Ë^ú=õÐ6Ðl¯ßõÓÓOÏñ|˜ôv<Ìñœ83À f¯v«í­­:hXÁ¤ªÙQêîØŒ$«†&Y {L”;0%­v›ÿé?|û²—ÿíÿøããó…í¦[1æŸ?<{u×´Wo1)*NÔ<ɶ+½‡0Í£¢…Æc™ö~|’OsÁÉ0"ÀÍfs·Û1¨›‹ŸŠæÉZÔ.4ë®I2§˜@q²4´Z¯®o{ï…™¦âö“L IIæøã_5Ýn»}ge|†}apW]iÒyމn·M»ê:J§< ÉqÂv½¾Þ@Ò]Ÿ×LÒõ®q6žÒ€Ês¶l‰E½#6!IÁ’ Y:k™\¿ö>”’ÎÏçlyÎ]à•ëÃáðXâÈÁ§œÔpŒ3¢mÖï|ÛtÄN‹*9â|xy9¤˜Ê4‚–vµÚ^oÙù¶íº¾ßlÖˆã”bŒ1NóœJŽ)ŸÏçéÇœY••UÝÕjŠä¢!H"ÜÐÿªj¥%Ôjuu5³«232cðéùîp3ÓâÞç‘ ä"p¸?÷wý³ßïûÚE‚K€lÐÖÕÙ²ý,ñÓ‡ŸSNmÛ4!lâz™ÁU¹³õâülQyþtûp¿íþûŸþîOïû~½\¾}}ùæÍÕùùJLvoŸþôÃãíÃP„3œTëšÒ"¤õ‚Ú Í4Iw‡ÃÃãáî±™Ø5¢.f¨ 3{O¹Ä§Ýîñq±ÙïJÑ!¥C×õý˜³¦Tr5µ¾»>ûÔõ)åVLGÕ)ÝÈ'°ÍY›ù5¢Õï4õ²ir7úÈÐ+9)¤ÆDLÞÐ ˜¡–i >èE (ñIA¥Ójr¢‹):™“<"&ª(œü8ŸþOÊÚ6Û¦iæ5=á YpùÀ3ÍfʳOB Pä 5ãÈ3{Ÿ"“Kª±›ÁR *LZYÔ‚„bDD޹ʳãI¿¥C,ûœÆ$¢dÊ¢¤ÊæY $Å”2«z40(ÓKÁFÂTÀ (‚ IDAT2³sÞ9ˆ¢ªóìO=ÝS¾NûyÛ€ž¨@ðœÀ™leÏÚ/|>ÞÁ|¨‚ç4ž"ÿðÏ/ö%Ó3Å~ѧœ+Ö³l€áÙ^`_JÙ§èÄ|5P﨩ITÆœɨšTGÓø¸()9÷¹Œûݰkm@ÖcJ€º{ÚÆ~D¥‹ó˯¾úúíoþEÒêûüûTba;óX‹æ![&5-b€TµRTEƒ!;ç¨mŒ0N5“g|‰)÷‰Š9ß^_m–m}¿}2ƒ_ÿæW¿þæÐüðcc?Ž–²O©:FöÕÕÕÍ_ÿîë¶Ý|þx’VÄ-b=A›¦ÐùT,EES%@@â(2]òPÉDRã˜ïî>Ü-¬°P©¢ê®mãë7«‹«ËãÓø´‹‰)RhÛåùfµZ¶Ç®Æ!—DÄmh€ ŒYe:šäÓúMŸ±Sxê¡O?Y4G‚&,Ît:U€é#ÐDÍõ¤ë†^\Õ_½Ù\ßœÂ~X­ªßÿöë¿øöëeÛî±a(Ò羃¡¤1&Òúj³ZžS  c®L@Í ÉÌ$ö;µãê|©`šû295©ÚxW×ÌŒÁY¨%–Õ ß´n"¹bÕp[/ÈÀ…ŽŸ·e»e´¶ñBÌMUŸÕMð›$d³špsÜç?ýé·‹ÕòæõÅÕËpùrB ̨Et¼+ÃgK#¨U¸ZTäAIÕxÒæ,Õ!3™Ä)™Bˆ„b^­òŽÅJ—»’Ž¡^ÀºÖ -îÊq9d>”>¶œA #­û>Õw–³îÇqß/ªe¸ŒÉ¡øå‚—g´¹‚e T,­dCr *¢fÀæ$™˜¸¨ ˜MGÓø¼1SäÜÕõåËKÙnøþgÞ\ýv³Ù¬×uIòãmÇUý«ë›E½¥¸“8tƒ†à*™sè=ƒÚ0 ÇãáµÆ«@ÖïŸâOÇ|sAn§ *ƒ1*(zç]Óøå*\\†¦5ï©ßk¿/éXm®6ëo/ê¶íöåýÖ’£a\Vøûw«—o–ìäñ¡ùøÙö1ú}årGMÀ›õfAŽô°?>öÃ8º%CRÉq¨=.+¤(ýnk‚„4ö‡aì•AŸ¹BTšÕõ†f&BZ< LASÅJU­ jÅš#+Ùav ’Rnúi‹dMí6«æb]¿¸Z4hð°=þñ»Ÿþở?ßï÷»}[û_½{õWùëׯÏç»û§Ï÷»¿ûãûŸ?I*ÅŠ§mÛ4 ÒD6ÖA6 wyVo¶Rr¡\t»Ýýðãç}g®: KIOOËgmj"r)çíÓþ~{¸º*ïJ)cŠý0Ž1j1T…aûaì†tèʾËý(*â0ñ$Û2ž˜÷s:f¦›M öÓè|Ú-«À)çŽOÅ׉-€ˆ•&*9@E”2uLÑÏ49P<éµ&àIDhèt"CN/˜ àÓ©pR LÝC:‰¯ž1ã¨Fú%{0ûìÒétK|2*(Ød¤" 65Õ,&Šb"FªÐšUnúeo :„ç ~1B œ*/jTš18C²¼CŸb¤˜ä ûZ,ˆ¹)¤‹š1©fk˜)™%4%U“R…Ù*ïwHSúeÞÝÏÍE´çµÍ4øœ’5óTóÄh·‰ÐˆFvê÷ÎÞùðƒÏ‘n8u9ŸÉIÏÿì¹ö\¨·ykaFÏ“}ûò£3[’NÞyÊ:ù`F6 ‘Í &Dt Ž Q`„€ì‰ LÐd² 3§ ) ûýqÝÚ²nE Æ(šÇýa×uÇx·íüòêí›·X­£ùA{Š(\ú¤1Bª`’uû¦-±ŠXÎÙ0!{èÙ¼dÓœÆR†„`Œ´Æv_\_^87ÄܬÎ.¯_­r* Ç~ªVÄ­6iµz±Yïö]  épgqÜí¶C,Š5ÑÀ± @2ˈ€ä&L*Ñ d2tÅ*BT`RdŸïûïß?8ÊûC<\;Ç„‚8¥äˆà`¶óxH´’*‘D3¨ƒ¿Ü°A8ß4ëU-‡ãq¿ïº® xTdȌ³nVaÒçü€6;þàY‘11ðyû3ûÀgÊòLARÌ^×K÷êzñ›_]¿{÷’w]u±ú‹o¿úêí bX?Vuã׫êrÞÿ\ß±;Æ$)[,ILˆÈ8È¥äl_üHˆ`VÌŠi)€œ™ô€nꜟbL0a%iRÒƒiN%3š*8žCˆL§6üÍà‚MîP02˜3"höL-êé½û\‡x=*оȹŸUån AÒô\µ):÷¥Á<Óˆ&§M7ˆi¾ƒ³}"ߜĉ'nÀ”ã4RD5l|u}¶Jï~þáüÇO?ÝÝ"ï+&d²C×ÿÃ?}<cêþ÷û×ÿîßýË‹un]9ótûw?þßþVÀýú¯~u¶ x`‰µ®ŠDQ§æ˜zt޽7Ó^†Rz—5j.,¬Â6E÷ˆÉ9VóˆŒ&@ajs蘎»a÷¥[lê¦Ý@Nv8jÖ2DæÑ9£ÚGд—qŸÇ­©G?íXAH (a0¬¬ªÂ[;$åm¿¬C»® S<ºØÙ§·ßýáýãîP­6Û}#…°<»|´$P°ä¸wŸY-û¾wŽƒo\àTÊtb˜F„؆êÍÕÍ7¿þæòÅÍnûððéçãî1v}žÌD"¨ z4­ª°l[ÄljŽCë—mhÛª^Ô¾”1§2&K™|J­?xï< yóµ¯jf@}×oŸûÃ^$¡fÇä}d@H†qb”¥·…÷̾ƒË„oâæÓÖÒ.¶i¨µG`qAÑÏðÆÙAZPZd@1! bE§&H`Lcæ’T…’™©€ )¤lcÑTdL18º9ÏåF<3Ç »á»ïï>ÞDqѶ/.ÚßþæÕ·ß¾®*Üíû}÷év÷ñöxœ5@1“R"è¸v¹inÎÛUËÁ©q]aU!31#³cƒ$¹;ôy°ªrËeU—Üá8º!:*%ISõLèÐc~zÚïö‡n,‡ö½Ä LV{ µÆ„ŠpB\ÌÃGú"†ÁYlc &pòÍLxÄyp‰<ÝgÄPU •áĉWS7½@Áä™—§6%ÔÍ&ò¼§ÜþÙ<9bNˆÉºú0d<]J@e®µÌÇbS£ÙGÓt¬ÀÜ"˜j…¨HHNÅŠª‰êdÄ$´Ó¯nUS™·ö“’Ô¡45mÖ!ã8¦lUM̈`EJΑê*Ä\‰8Ä0{’A‹@F®€Ø€LXubšH1P‘yŠÅ³hås| 9©ÎsöéŽ4`ú´§öì"ÂB :ê'« |¡ÀÜaž KóGšŽ_|'l¸M{‚þ3¯Nô ÿëü“yô„Sœ>$α­9à=Ç Q_ I2ó0k–ç‘¥ÀÔN/)÷]¼»KžsÛrUa]S[U¥•\ оÿø9ì±Kô´/º¬›à$sÉèkOÓ˜²VËu¨Û”J.‡R" {¬C]!³"¹àXX‡xŒ1@ÕÔ !©>Ý"Ô‹ºn]¨ËÕUS9OÛG1t®ùú«eðíöiøÇúóÓã§Çûtñp8¤¬ª¨ÅÀ2”ÁSrØTÜë²Ù1:¥ÃAAAÌ(&yž©v®*ÅÔ†º6b“dñì¦Å‹ÁãaŸu°ìbo~QóÍÅYÓ¬—«E»¨Æ˜UÌLÔ¬˜`Ê%E›Wö¬Óžnš3mvnŸæÉó y:äÈÔ¹1 šò(h&¢eà*/—ír隊;;ÛToo®¯6¯^\.–Õ8ŽÌ¸^ׄ‹ÚUµKb‹E­ÅƱt±dSÑ©Ý>¤<Æ"‚R°È¼†š„ß EM !V4 %gO?’ˆDÀF&J"†ˆ Q@BE@š²:0))¦å!á)Wgób˜ž÷ “‹ÀpB­MVé@Éf€ px~jMä8—žÕ €DNõþ¹ˆs:Á?Çw¦æ)Efó­db =—füõ|¹Ÿ. ª³8„lªH‹ÄQ£¶{Y}üy‡vˆ¶Z,þë?쪰¿ßæmt‡§íÓõ¾¹l~“üÌ@:ûÞ»E¿úʹ:™ I¢/¨Â¥n\SUhN ¢ÓƒÐdK²EAØÀ±cTµ<:š(Gf3³ œƒÞÒ–uï1;EÉŽè·Á90¹€%p.cN$ç䀡˜Hb 6-q7ÍUÛúåª9kÕ.!d QÒ8î¹nÐ/ÉXÇÒÝïnßßßßÅ^ª.óÓas\®¯7›k_MæÄ|åcs.¨Y¬( €’KI{äâjµf0…‚‹jÇazè9 ­¡Sä°¹¬ÚY²bæêz±\äí6G—WvÝøp{¿;Uÿy·Z,+û*Ç.ëê««Ë_¿X¿Ø@Û‚CÌ#æ@À@Žéxߥ^CÕúÖ¡SrjD翈½­œêñU‹MØà<@É¿zþûWír÷Ÿþ¶¿}¸†êū͛õ ¥åÏÛŸÇ߬ÿêë³ËÅq8> ãÇR€‰+fv\9¬]S5Úçqì4Ž _}}Ý÷å¡Ï¶h_¼úÆ{¸ÿüc—º(uåÖM]³Û¢YrªÕ ±öCÕ;¨Š!2ÓS—û§þóCgcY‡Ê-¬ Ö¶rw×g£ÑZpM¨‰ ³äàÄ{b‚\ §cYB,D\‡Õr³ÔóÜ5õB䊔˜5i,0 O‚¨j<ŽiÇf½n›Åb±*EJ·GUÍ’1Ph+SÈ*†à˜‡cÿþýÃÐ-Ûz½Z¯Þ¼~yó24íå‹›ª®Ÿîo?}³Åfã ÈEµ(°ªä±”(R‡ý>G‰QÓ¸ëtÍywØ?u»ÇÃñ€ÈÝ0ôãpb»\9@…œb>öã(bu»\´‹«ë›¯~ýí7¿ýËåÙ:—¬Z4%€Ç޼À¦ñ«¬: CAZlV›vÙ¸"ÇÝÓÃýý~·—ŠœDÆ”&kb×ã¡ëÂvë}¨|Rìûn84—àëà=“ŠuG3ЮÒt¸qM —æ~ÕuWOC~Ü52Vd N A•©L‹Mý’ÑstX¦ßnVT’1¹ˆŠQ`ïÁPMPÊ ’]1_̳áé~›DžvÇèÂn·îÞ¹›õâê¬þúíÅ_|ûz½»ýáönûӇǻûaˆ¨yJÄ€fÓ 22Ŷ gÕùYS9P-`Àˆ¡ò—ç«î•ÑÝxì£f©0yPFsÚwqÝÒfmûãð°}j›Éž¹ö˜Káã1öݸß÷û±<íî±ë‡DDmëBÅj«y@ߦ4ýJ8“`:«›êÌߟ~:·ö»2ì ž½·¢ÅL ‰Í´¡)DD¬ PNU+žªóÐ‹Ø ifRÇÊ'<óLTQU{^›œ·§Œœ6S¦ïÓ,68mæoÉt®À“cé‹`lvÁœðJsÖcr©Î•à“RùKGÀ¾$ÈæÕ„MüAzž\ž$ xjàŒjbET5ˆ„6“ê Ð-¡%3~(·{ÕqV¯^^ÔuíY‚·"¶½ûx|Ú›ñî(ŸRßCµªØqÕpm%Å1 IæÃ­€Š‰™¦Æ;$Q# UÎb 4Ñ¡‘SŒ9~úøi¹Þl.n¼w.ðrµ@ºVÐÛ»mŸ†æjóâÕÍÍ D*ÿý»xèc¿¶».§8A¤d=06€N`.ŒN±<5, gÊ>¡2y'µ uÍH¡¤ï‡Šåb]9‡ût:œÖxT‹Ô‡ý!GT(QÐ??±\.ªªQ£Tl2 3J+fY1 dA ž}¹ <Ý¥güìs½c2q+ÉíÄ@ž$ŠÅL@"ÃÐ6|vÞ,× 1‚Ê¢gçgËX Š!’ó¾j[2ÃYº>¯WKÈ©Ä"ݘ·ûÃv{†¬FÊÓC•” ¦â,"¹yhHàiN7 @3šØ H|B`)²át¯È £)¼xª?Ð)t¢…NT­i ¯Š Æ&hvê$Ì>#Å)ü¡3¾O¯£M¦ù– SÚí¤ôž¢s_l0N^ðy1O÷õÔÍŸ÷5Ó¨xžüƒžj;'ç÷üX4ÝŸßÑšˆW¥Y*#o >þ” "²Ë.¨Uì݈ÝÏz7„z_UWà×XŸû›74–ûÛÛññÃÍeh›B¨¡W³y@’ œGU5ôHLE†Tb66ã €A‹àÆ’{nÖèD ¨‚&f‚lÈEKGÒ׌•«ÁºaèrêÕ©-rùöØ®ÏP·@ÉÑ€ìHxòv‚ZޱH`Ô.äó˜d”US·Y¥Kh✫;“„È1ƒ&CuØïÖ &Tœ ` sˆž`jq† -‚# ÀUQSàŽÑ™¢©!¸ |kÈ´X]¼nÇí®ëF°)ÇÃ.fwùòíåÅr|ˆUáfÌù㽺öëæBVbØç%¢ÕÕòåW°v  ¹À˜@J—wŸ÷ÇûÞ2uT\ãÚ³ªZ0yb`ž·òRÀ€€½‚8f@È—gáù×W‹ziùýüoÛ.íŸ ŠãØ q·/·‡19ø‹7««µú®<æ|´Â’\ààCÎ Zv‚Î %|:QM+\-Ú7oÎ,íÆ]Ì5 Ñ$J»äÍbA!ì»ñvÛ¡wm,pèyÌ|ìH24!8“¡Û!èr‰)UÇ|<Œ-t7«ºY°@ÀC¤”0+B`ÅÀ V²”„X’ÂvÔ£›F, 와 ZÔUh:çö÷E¥ˆ Ų¡I*%Ê„“Œ„œÓ6´ÍåÙµd±{šD†¾Z´«Írµ+ªâëæxèßÿý~ÿ¸^/ß½yûêå»Wo_7«쟶ŸÞ¿ÿÝwfzýöíÕ»w\×9åØ $™¥°í~w8î‡]ÿ´…’=Ò4HX/[tœÓ8ô½ˆ,W ˆ1£oh*Z@8!øË››Ë«›·oß}õ»¿¼~óÕt½éDZ”èMÑX'ΩšÀ˜ @¾®ÛvµZ.êÊÅ¡ø¼ûùÇÝý˜„ày.‘Ì´ÂdzÜïÅ`±\yÇÅrÔ,V­°jIMcÄFQoiÁ©†Š Iôb/×Û–ÇÇå06„ ÒÂÔ<ˆ71s= !a©¼Æ’A<“étz÷×2=Ü ¨0)™:ú¥€ÄŽ ôØÇãþ Í#Â#š^ž/ßÞ´¿ýæõo¾y}s½éúáÃçí?mßÿôôô”T˜²ª™‚ÒŽ+_­W¾ªÈ9ržK1U•\Ìù¦j.Ω뷇ÃlÖ›¶YŒÑvÇnˆE`³ª½¯ÇŸv;âuS׈ˆÌ†séŽããv¿;tÇ>î»üøTž¶ÇqÈÎ 1)hF<Í¦Š©€*‘™¢ž³p2Ï–iÞ7M+@gõ®ÍðyÉö>Ëk (:T™ ¢SŸÛ¢`4 ÓÕál$iê>ç(ÌÙƒÓøz>‹~‰öã´u˜E˜6ó­A§«³¸hÝ"«Ñt3ð§)Ÿ*©9C"TADUUñ,u…Á¦býX²$€©Hιå²q]`&S öÎW9iÎY €“ ƒbQE3dÅ@Ýt¶ÛØFˆÌDU’0‰9Æ‚³Uuvüèñ™(‚0—.lAÍR¦yÒ÷ 140³iÓr:ÙÛ/Ió M'·ÎÝŠth²4(šÎ“Jø¢OÂ_äà46‚_Zƒå¹W`ÿ\½4ƒL Œ +Ï%›J6óˆnZ"œŸ-ƒ%$«Û¦mQzxêÆaŒƒmÎÎRŠ"c[‘iÜïw¼}è¸;Ä"éÝK¼Ú,HÊ8P‡aTݬV MÑTó0*B@‡LÎס!®X‹i)LND¶OÛCß'ÓïZ'(‹EcR‡ýííÓv—X­ÿÔTMŽýývüô0Ü??}~ÒÁœ—õªÞ¬^Ƙïïû1 ºÚ¦<ºN¯¿!çÊ'WE°â¶µ_¶uU³öCFð—gÍ›ëÅ¢¹{ìþðÝý‡Û£(ƒkƸÔ'YÕ¸¬3º\, Ößî·G"¨Ùù"¥ï†’ Ä$+(2˜ÎÇ\OŠJའÄé û…­{BìOñ“é§YÌTâro_Ÿ}ûÍ«×/Ï.ÖíÙÙÙ¢mêÊ!hJ‰Õ¤˜*©¢2»årùêÅuÛ,r*%—\dßõ‡x<Æ®±‹‘)2"ò”8šŸ_Ó»`æ†M2oCàé0ëD@Ì™¦àÀœ>?¡æ7Íwœ‘S"HO»©É~¢‚VTÐÑ#"ê<™xîßëóÚl¾¦OTˆ)]he´˜]öKµßÉÏ„4›ØL§Z°>ïgmvœ,ß§O{ZéÎ D ç…̪•$X ftBÁ¸BÔé%5“Ž¥[.èâõ¢qîÕòøî"ÏUÁzuþâæõÝS;.qˆ]1\,M½B'Y{ͪ ¤(ª%ƒd”Þr–±’ƶñ¾ ÉÐ*@-»Ž«G"_ÃTmÐi¬Vb‰ûñ°O‡‘Ñ×MdûÃpØÇ’ 4¬8 |Þû*6­GÈ–H•Ä¢%zçÚFØ b!u×:Ðñ‡Ç>gA󕯫ªn+ÌŽ±$±@“©‘Õ£‰Âx膱]T¯_Uëe+¹w, ЊˆpðÁ{ïÐÕD4Õ° À9ÏLÐ*¯ÄhIÆY….'ùQ…܈y\^-<òýû÷á¯|]Fï«àRŸ–ÕõÕÍÕûý.Er»aÿç#A½á–ªªô·òþCºŒH%RŠ2tÛíÃcÅÎF%«œ÷CŠÇcÞÀU:Á, ‘PQµ ˆ¨&`”#SºÙÐÿô?Ö•ûêõ««ÿòû?<~úùéþ¡UZDmö îáÅšµÏݪàP·Y0[•HEƒâEU],Οúîï¿ûdŽÆNÇ?ýÒ.Gç+õ<–|,ZJÁÑ`¨ªª@SÎ¥¹f‚ƒfÆÌH$MMné}­Ö¸¼¨4A¢Á|²Z€Ø¨¨.ëŒ IDATH*YQÍ’¥œL=7+UðUYU®ö­ÕMµhªf%¢Ûí¾‹7$¡!„%#;cª¥?v±OÀNA“äT Vuãƒo–«åæª]Ÿ…ª.ZrNLT¤óååeU¢åœSJY ¤áiûðÓ÷þôãûÃþ ñþ>R¨Ê˜sß“”}å‹Ê¡;ûnáétBåœÓRÄ{çC¨êà›1`57‹WmBuvqµÞln^½½¼yñêÕ›×oÞ¹ª~øôéxìDM‘Œ‘«ÊT£5E+8ÔÕbáêZûxŒ¥ï»ããýãöq[Òè“"G¡X° n½¹xy}ÓVÕÃöéq·_®Wç!ÍÈêj+R4ŠÈ”¯®®‡xöyl>iÿ0¸q×Z$óÛ‚ xÐÄÁ ÎhtD2bD5!&ªª2?½`¢`ÏÁPB0-I’”ä*Gº¬ùÅÍÕ¯Þ^¿{sùîíÍÙÙz»=|ÿóíw?ܾÿééÇñ/޹rà¼6¡Þ¬ª& BvÎêàØ‘óާðÕ0–Ý~<GÕ¼^ºº®/.6Î-¶qwìᢩ–‹&ïØW¡®|íœSµã]·? ‡ýp<Œ‡®Æ2Že죈3 öÑ̤”€à Èà—’(‚S½OŸÞfMMu¨ŠÈŠã4þ¶ò¥&гWÇf•%N®yÀ hS Íæ_“H~B6# š›ŽSÑN|>š  3f ˜érµg(¡}©ëÍ»ù9O;£1Í ©šÿ0:D‡ŠVtâÛ亟Áó©T :mjZ/;îc1ZѰEÈm!ø ÕÒÇA‹ššcÇ,©ˆSðà<¨ÆœÌ;öRÊ4v&-IϯÎ/ÎÅȧ4ò´h9Uí”Ö9‰q¾ )¢!š™NdÀiÊHfF§½ÁDû<5« ˜ÙÏ‚" o3¨pn…À¬nRû%ATNgA|öƒÙ 58EÿuÞr( Ú,øœ>i›X³É‘E™•fÆ feê«2:í²nuÉCËîP†8„[cˆ­;¾»æËóEêã§Ï‡÷XtLøØmzX¶Vr4ÍäBåhL¹Ûjï/ÎμçÃÓcÜCvQÕbÞpÈJr*;±1Å4zíoÛôÿügl‚8èý#}zpÝPU¡¾¾hš¦ÚÊýc—bjÿÕÛöÝ«õ_ÿþ›7¯ßýíÿ÷ÿÿ¿þScã×`P":PDñ„Þ1¡1Hpض~µôí" bÌeÑV/®Ï¿ýõ˯Þ\¾zyý¸íñßÿÇOŸþ0äàÂ2ÇMýÒv«Å6Ø‘Eîv÷ƒŒË*4 Sržñä¾2ǦR ²š×™À?ÇEˆ§ šÌ&ÛS”L§;"¢É êeZ2c\/«_½»üýoßÝ\¯—Mµl›Å¢aǪc‘b¢¦¥hSE‚à¹mª1æœsÌ©ë‡î8 A]ÕÄ1&’W¬λˆgC¯é´¼²éÿ§Ó#™ CD`0žÀXÓ› ‰Û<ó˜’ü¦6íŒ O2S3A*JU…LÁÄ¡‚™c?Q–p¢œt‡ÓsÏNÕ:ý9<—׿ $ž`=_­ÓOÉ<>mZ§Y‡ÎPÞÓMcÊ{Vó*qÊL`ÆZÌ€&KŽÍ@pšsøð›Wçó¯®^]Ò&ì÷ÒBmƒ”ý »ÆÙWg!×´hVmXïw»ÝÓƒ¯WMÖÕqÅœ#äFÓn<îÇ’)«; ^s¢…¬0TäƒK‡“ð²%ïNšz0S‰}:ow÷÷ŒËåzƒÔÄkÉc—¢ø>ÁýãØ½¯ØõÁ+pŽeSÓ¯_Õ‹ÆjŸ2z/èoüü黟U ¹\­oV´£3 :çæ>7#lìl]Ÿ½XP 1ßGz÷Íëoÿ¢½¼Ž¦q W1ˆƒ,LÚ.Cå;Rpª@Lè-jwx2¤úüÌ-’7¸AÊ®¤2Ž’“9æàÈ9CÐ<"€OÕº¥ºî>÷Ǥæ¼'ë>~?:>Ûœ¯× ûX›Z,ïßßå±ùöëgí¢”ýîÐý¿ÿåÇÏo^®<¶ÆX~|ÿs)é›_½»¾X…6MðRº±/*qLÎ+–KVG "š§·¨H u+Õ ¬"â×çö¿ýÏ׿ûíææÿ~ÿþ‡Û÷Y›Õ¹ÐRz” >Ž»àJa°eë=s.p˨9´µg…aûú¬úëo®/Wíîn«š½ Ç4<þô90z瀽v{¥ÇcR$çúu„†‰@Xr`!HV‡ ±ñ€Ä¥å1VÊûòV7@‹upžŒ&ëÖL´ï5FˆÊÃè$“/®Î\1{_“÷®¶Ø9D$ªåR™Ü¢]ž]\\Ÿ]¬VËœ†?¿ÿüñça<”±ß? z®œ÷õ¢Y®ÏÎ./ësç< 1£#F "ò«_=Çíãcß IìññqŒýÏ?}ÿñ§÷*R/æ0ætüñÇ\<±#b0Õ’SÊ9‘AÝÖŒÆìCÕ:ïJɘ;ïÙc¨œwèÈ{O`Hì QD˜á|³¹¸º¾¸zyvyuq}½\.ºÃq¿½;î÷E)S „UÕä<ôq4ÕÀž‘«*ðbA‹–*¯w)ŽÃqûp;t= TŽHT ± «åòÕë·/^¾‰ãøpwûáãÇåzÓËaì3£UÓ&L£YV *BCêisÔ—ÝúãNºñIS ˜”UÐT§É4º23 ɈØ4¤,&êœcg©ðU@ ª¦–¦!)š‚–y¢Eɨi+ªªšµYÔ/oÚ——ÍÂcÛÖ_ýú훫váˆy»?üùÏÿþüÓû»»ÇtèÐÀÕ5/¨ƒOUVËv³n5Å¡H©+ßÔ¡®&tð~?ÞÝï?Þ>!á›×—o_Ÿ×M³}ÊOƼ^ÐõyµhÐ,qUµ¦:t}Ý>ÞßÞïú~0³ÉD)Y¬D‡Ù{LÆc"GØ yS+ b†“ñЦa1™:(•“MË)¥SÔÉ jSèÁÈPgX¶M„S³ÿ9¯?3|pâL¢)ûá&îçi¸õ¼—Ç“¿Œ€Nûë¡ñgc„fˆÀŒj*:)ÊDM‹#ºiÃÀ„„Š"` x:PÛ—`Œ²‘Š•\$gU-%8µÚÕU>0!X ®xÄ"8އ1 ‘Á9&$Fïˆ ëŠ[ÎFªD<ÁˆšRÉzúb¦—l*bOúé •9H3›åYÕøc´"jˆû>}…êTZ#3%9[©@} @(“&õ»»¾?ŒæC}±YÔÞâOÝò~ßlm÷C[Åðp̦ùò¢ù×ÿâ«ó7ßþÍ¿ú}Ó\îŸ:0)EOr4„b&¦š‹1F ¬ŽÐT‹”˜”ÀLÔûÐVÔÔÔ4x}½<;[¿yyÖ<& bh«ÅP;Ç#³Qußk:B`ó®xN¡ÆvÉìƒCU‰g¯…M}‘9w‡_ÞtÓ¸Yñ4 Ç/¡¦ÞŒ¦zPF¤¦æ³us¾®+OU@¤ÉCBj¦¥Q•2ÙYÍ´ìÇŸî÷Û]w8t9$7&ÙÄœB­Ð0â„VœÄh2çÉ€¦h#š²ŸŸÁSóðæÝÉ&b(“1ÑNñ3{.CœÙ_ZMjfdDJfÁQêP”2ö)æ"PWˆŒ ó`úñž?óÛwÊ) C™k6¹hOq¹F<‡çh2ÌLÒ¥múà§;õüzÌïpÅ_ö À”æÍª)R ¬Ùð4k7PP•žåéæ‚þ‡oÿòÛæ|1¢y¸;Êp£Ý‰>¹¾´e 4Ö5µëF ÇQ- i”}€P;òŽÕíR±© ¾qê„< ˜P@×xïpÞ¢ŽzA®= 'b3S)PÊØ¥ýSFÓC…òÕÕâÕõ:8Gøù£~øT>àn ‚è‡U]Aè¼* —MÞëº>îÇÿéãîçíÛ—oÞœ¿®Îjò’ãrrLMD¥/"l©Œ=¤§³öxyyö›oÛ·_×äÇ2 %£Çè ­ª‰OÈ&Ïà 5å~?lïwBî<Ô«5"’L%ûI?Å¡MnIÂ@ìÌÒH‘8ëêò,õ´ûÜ÷»½HÔœûýðT>1/¯7kO2 l¥•êåÙµïy8|êÆÏݸ³ÝûÇ…ïêÆõöG;[.ÇX÷#dMÊÀžYU`*È ˆÄ ÊNŠÈÜéêœßÔœ™**$²ÚöåÍæÅ™^®qõòëßüõßÜÞ÷÷ß¾ëÇâ¨é:{²di;zfŸUc)ëÍùõÕË2ßúÛC|ùöÕËÍeBêUpd)Zt¢ˆfÎié¥$µ°¨\½p¬%:TO™ S¶®x@Êf BÚ{ñ0Bäõ-×—#VE Á/Zc0KQ´€e$ኛ˜€ª””SÁ†¨Ç(ŒÜj½\oV%§œ#97c|¹i—׎QÄŤò(Ãø4ô×+×4-y/f)纈cï™›ºjÚ†W5S‹Ã†ÉoñÎKúã~ìŽÖ®–Ír€yÌ%FK £¯‰ÑÄÐÌ¡ †$ˆJHÀ0‘ˆ aÂâ³sÌŽÙØ±2»¶]úªJ9Éz½YoÎËõÿOÕ{4I’-WšJ.1âîÁ2’ ¬=Œ ‹™ÿ¿è‘‘Þ{õª«*«*I0'F.QÕY˜ydÍ.™‘n÷*9ç;m»±A°4ž>þòøñÝx<–¢}qŒ©DIÉ·íÆÅ¦æšbCÛMGÀ‡ýÃi¤¦æ<:$OífÓö›¦Ù4m3¦¼ßïO§SÉ9Móñé0•i–jN “ÉTëÆeÇ:Z¡9Ú凹Ù…JñX•üÑÀ‘A€ @ ®"Ÿœ ¯Ä©&Õ;G¤¢Ù±o Bͳ‰‘-•J5p‘u s]D¤šC‹·/6_~qùÙuܶ®ïº//bÃsÎ)×ý>½ýùéíO‡÷óq²,<9‡m¤6ZaGŽÁ3"g c@"QW…ŽC=ÓfÓÞ\]óåkb¨õÞQv\‚ç&hš'9ž†‡Ç§U³J쇡ìéþi§1xj&ÄR¥ä¢µÔJ¼`ƒØ†…ˆ ªj@¸àpÖÁÑRò‚’«iµ˜š'$[áà‹J|Y)"Ú› ¶hçåì%vði" Ÿ¢yéÌè1F ÷)ÑêW úBö,,x–šØùKÁj©3Cñlmƒˆ°†¯Šê8Íh5©©cŽ›Ðu±kV©CôÆ9O9—iÊ„ž‚KªR%:lòNl¡ZRP ÎQ‰P…x!¹("òÒ"™P¨YŒ#­™_«û÷¹€O`‘¥ƒ[èkÐÁ2µÅOü¤…ÔºöNˆèì“6aÍ [%ÌHHŠVT‹².Fzæ<-áÒ”œ«}°6úRuKÎâºÀKEdÈÙüÓ±lÚ^o?ÿâòCÞü82Q³Ï|šN-ÈËë{öe¨¹N%³†$hÔ„@>0˜iMì9„ж]‡P¬Z-“™æy,:iïŒH“lÑ¿Ú^öòPýénº;4ÜÜlÝ ¢žÆ4³š9œ>{ÑüÓÿöõÿùOýå—ožUJU]í*çÝ(à@QÌTÙ 0§êN ü1µl:j™èû÷j9åa»Ýì¶—}6Ûöi63Vb:”öãiÛoT]`×¢ˆhHLІ€ P”¼¡_›—•γLkõô¬là…C¿t{‹ßΞñ¥3_°YÆKêQɦÊD`*&b¦bzÞ?ëªNS€iÊùþãÿûo߸;Ž£T1 G¢²Ve"$T]œî+$`é¡Î ¨çxa‚ù%× q14]xŸ(ûj†K*¬šUAÐe ¶ìI+Q¡g`ZE(D×ywÑÄ‹]Ûv>¥éãÝ㇇iÈæ‘,/çT>^žéRŽ®”":ëõ׉?­ÿàl›_b1Î ÏTÏe¹æ5¯ê¡µE|>UéWÉ~ºZŠ×³uñû-C 3Q-ª#Ôî‡?üîÕï÷j³AÓ©Jþø¤eÌ2eÒ¬yÒQOÛ¦æy·qhbT‘ñtèZ‹MTLªY­Áé¦'«¨XÉ3¢ŠÚh¦& Ù)#²'ÅŠ p  ë„6’a›]+ÇÇr÷øÁmè›ß^Ý~vQjΙBÝí€ÁOáã^‡‘6± ]è‚Ø<¤ûG>Ì%^⠇ǟ6•׿õÍß}½ý⡯s†’Qʤ÷S9æižêÝý1²\]Ù&-'•JÊË-„á’€S¬V$d¨U§ã~Dö}×±U(£Å„è ,› eЀ‡j ƒ¥ÁJ¦à° Øm½ûªw<ê”óA{çšõø>6—7þvOpP¯ta²@.®ßÝ6XÒiWcè†épØ×luDì7/Ú‹yæïóvÚ. ©o€Ø˜²CtTÇ”²ŠPQ¨†Œ±qE0 l Hý$ ƒj__½öýw¯ÿþü¿ÿßþþ_î÷3“߆è"‚Öræ¹è\®®èŸþáõ›Ÿýñß¿û±†Ñð!wßÄ.Vã¶o‰Â|Âi <2ŠÄÙ†”=:‚è}Í{ƒ¦jmM7ŽdžOÓh®çULeÖ:?FáP=GW¨r9Ôpéƒ!qäÆaÞŸò§ç;ÈUQÉH…¤(Ôj’ Љ¢E'ÌREDõ‡š–¬ àˆv[ÿæ&\vœµ­oº8ÎÓþtȹ¨…ã±þôîôã»òxj ‘ 8T4ÌÙT¬ÐPŒœC"OŽ™¹cvΓžÆ²Ê”jß¡çØÄ&x½èösÑ“(̳,¨Àátüø„û¾“eô¥`Hä¼" S}8ÔýˆcöYœº†¨Ap¸ w@ž}´ ¥gå6‚gX}th”2åÙ€œ¹Ö¨YÈ×Áë2kCƒjdä ¼Ÿ§LÏÝ,?Ý{ùu!¿jCê"6Çó¨qUµ<ç¬þç%øŠÀ<+Ö1¢.ßpb.“4[ô¶Îí–kPê§°€%ñhÝ6è*‡A0d3W”JöK~36·½cOc*Ó˜1{Õ”‹ÎSƒÚ†ƒæ*ªF¢˜«•’_=YðÄ œç*ç _[‚Š˜˜½s€ÌbP« cC^môÉ]ý+ï‡ê€¸hñ¹6:?>]ž¾sÞ¹¶ñ×—ÝíÍöjÛômd懧“¡Jµ³ªXe⮳ ZUMq y[T"zV‡¯°¶Ìû€L×¾ÊDe5ÑÊCYãå²jQ4$BZˆD„‹rt¥ Þ{š+älseð¤>ˆéP}(Ûd—[ß\véõv¶)K ¹ò~"!TqÎ.®ƒ'¬e"O÷œsñúÅK@òi?æ“äœúíŸ$)æi§)—ÀÃlïýñ  ›ŠÃPsVb@BB§ ‰ˆvM|}{}}u-ê>|8¾ýe|ÿpcrK^ÃâþtŠ`„ZÀ²TåR¼f3“vV@&t£ÈÓpØŸ’(½|y¼žé8%@#R„B(†õT ÇÍe·m|©š%#‚0 ‚,šÿ± ê)›@%ô.𢴨éÏpÝ5!î)Õ5zÂPÀjãñõËëßþæ«—¯^;@AÏMš§2ŠÎ¡z‘cÖ§yêÙ†¹ôµ¿àà½0y®ŽÔ4ɵhÕ–7~š5OÉ«9F%¨¥Èñ$#ÇÖûޏ &΋wÔofVsIP+ôýæöÆ OïNÃýíí«ÛÏ_à‹Ëáû¿ÿñ‡Rã_ýÝW o?¾OüöôíÛ;“ù¦½ºhÁUŽ.ƒâÍ‹ÆÀ8ÕÏßÜÞþý›þ‹-øRÉo]èØÔÒ w§·§ôþ(¤¢sÆû®§ËËh–YÑ¢Wˆ!8°’¬&ÕHVP’H±2&º|ùr³Ý¤ñ0?~p|¿ÜOE ˆ1“ ÕYIe>ÉtOut%0lÁ·ÔlíÅ+.÷Li`¯i.iT…¢RP)º¶í,‹ª• Fè9˜Óœ¦¬:&g@¤¾†©f?<…¶ ­w^a‘Õi°Ðl®âo¾jþññ¿¾®?6§ˆ¥H u6,\'¨yßá‡?¼~ñ÷_+ÙãÓGÒjìÞ½;ý›T•íU{±^b«¥s裵Û&"6c–jeÖ\´HW Oó„µÜ4ÁùXdx˜pL&ÀM·íÒÜFè<6®k“ ÎT4IIд‘½åª?ýt÷þnhâEï[/Q ‹‘Cv˜+S)¥FöPksG›‹À¼ÙlãfÀãñðá—Ÿî?LJ§Æ±ƒMÓ]^\Æ®uýæþÃexNÇíîêj³íw7Ë_ #‚Íã8ã8*R{zºÿî§Óþ¨i7W›Í¶k{3T3aŸ‰«c©^j©¥H)*UÕ‘DT6­¶Èûˆ‰< ©¢¨ ûØnúÍ̤ ÞûˆÀ1ƾï..·±ë€BûÃãã·úö»oÿœ?^÷ŽZê\\ôÛMƒFª€Î;ªMŒ›¶Ii§tÆyžjm ä9õÉ1º©È0Uç} A s¶*¥…à™,8 ô]ÓÌÙöûáþqœ‰5@Ð)ZU=ÐàÎe&+%Дª õá’(¿˜cÀ(@rΠVU5…Š îøngMÈ9‰jÑèò*ÕY6Ò(æV:ÅÒŒàsPÔ3?þ9Ïqe°¤‚ÂYÞJëœ[«ê8gPås¦ðÊÉÐÕü·ŒuµÏ)èR¡úÅ]·ìÇ?Ê¢ËuE "€_“ R©§!§ÂHSˆæaÊSÆbÁ4˜QU"â,8ΰÌßuɨ¯" ß.8"tŒŒ UE°š‚‘! Ð"Fï™ ±ÖšSEÃÐ??œE¢³2 mÍ›Xô\«§*°T§Š¦IšÈmbôŽ©kãfÓÅШ¹Óh)÷‡Ãa¬µ !Š¢ä"U¥‚ªVU@‡èؘÙα5?ö,¯8Ë› Qiyüh&Ê"TÄŠa®‹¡ ­±bD¶À^ ɽƒ¾!Ï &€ŠHHœ³¥ Òø¥é˶ÖÜ`w?´*`Vk²ÈýÑšûzQÙ±ï›x}uus}Û´[ïc`wÿþÝ·ÿù?Ÿ¦ z®.’€:ErαsÈ„dVka¤¾ï¶!r0#c%óxEkàj€•@J°i7ûÿû¿üò—ö`vÿ8ý?þTÍ;OD@`¦ª@¶Êo·>µjëG”‹ÀatY¨V•R§àÀüôÇ?gDb˜PžcŠ; IDAT -isšiV*b)±BG®a´ÚÜöè9Õ\­z‚è*"²™_Ñ—ç°%‘VW…Þ9ô×tµ-¢-dœ³¯~¥Ë¢c§bOˆÚwͦïzm£A^þjÎe˜çÓi†t:Œoúxÿp˜R&6tjë„›ñL8;\Ï1_ @déJP–³ MVƒ >ãÃìLó´³i敷ؾ4¯‹KSÕÕ‘«ˆà‚³¾£«­ßn" SÊÅÚÎ7­w s`vÎ)µ l6ÜOÃ\U3’#Àu⻾¥k$ú‚ÜÆçXl0\3ØdÙ_˜ÑùXÜIJöLaxVô­ê>|N^MÏÔŸu½²nKqÁ=Gþ-çÎ52Hˆ©ëðååÍ7_¿úìõ‹®ñ¨…µDҜӘ†Y œÂ"0')(:G}$oÀHZ2Ub!S—ª;äq_Rš”¶ç¦ïr–2[iZŽ›Æ÷8§M±×°(š!‰¹"Ú­^¿éä"¼øúëÐ]Àõ:$çíå+¿}¹{ó…ì®]¿yŸËtu åôôXæùtžµm0wBѾy qA12ƒ*ZEDJ§2L Øcï.ú-²«’ƒG"& AÌ xF4a `$&”¬2‹7fÏg`ªSçawÛZDÈu@¨âPƒÊ^¨U·AvÆ` Kî7—­–ÌÙ]•îiN‘w´W7Ýé(ˆÔju?ýòþ?»üw¿{Ñoú§ù¸?>z ®Ûõ®úÔ£nŒÞƒ©#uVÇDY›Sv8Å;è{j›HêÂñæBþá¯.¿z§§Ãǧ$Î÷-¸*uDLÁ°^]»×—þŸó‡o®û6ýrŸ1‚kH¥î?ÞÿûÃ" ¹Ø=^îâÆÛÎqCÛ¸¶Gœ —$§Ó4ÎnJR÷Ç#¨\÷ÝE[4çÃÁ†±TÉ}'onâU¿i[ïHk Ø\4l‹Çƒ6 KãtH±ò&:_ÕD€Ø˜ »hÈå¡ð!SÉØd¤bŽ\ÓöÛËëËë›íÕuŒ}žÒÅîò°0Ðn³ÙlwMh;tô:}v÷áÅÇŸ¾/iFH 5ÍsJÓìƒÇšóÀO÷ws)¡íÉÇiž+Fã­Ô2œÚo¶ä9ïcôÒ䜫T)¥æ ó~?>퇔Ë8e€àv>ÆÈ8:’mçÉÚ›ëæúºÛlÛœ¦Ó8†Tê‚~Ñ6º««Ýn·C <–ãæ\/¶}ãÝõ®ÍED,Ã<žT2˜cÄ R‘ ÁÔ@…übr^µ»KŒ'˜él*k±n Ë ƒ!‚Cð@dæ…=ÔÊ­¨èBnľ&ð80†õ§@XéêÀžïçOšv='€]úLÌX ´ò3”Î9µj õ¹4X.y4ãÞ`¦‚ @´CŒ¬.ã0äµô4À¥x6 zQ¨ṲCTÅœŠÌ51t©ÂqK1¬æƒ¢W3`ä)Ùœ„ˆ˜ÐTEtù’U0$çÀ±:VO¦¢Ë4X‘ª©ª’ieS͵¦$Ëo‹™–‰á’@KL(,*BúµÇA s…i6)VÚš‹îúrã‚jLÃ8=>”qJÃ8Ó\UÉ–Ì·\dšJ*†HŽ‘Ø±T,‚`D€Œâœ„Á#>Ç|ÒNù3`BU«Uj•ªV*å ÕÙ:Ͷ"Ì `Aw³(«¡™9[&_*ŠTU0Åœiξ¦ôöÝ~Û”ÏnÃ×·ÛÐúöçY)ônêwÇãáO?ž®÷ôõ›Íëë«ß~õÕoû»íå59? ã4ž²A2R%Í5 i-Z«0`p®k‚ œÕ†TÌ”r¤Še’äjŸ h%F$P55«‰°:Ç¥ò~{÷ÝÛï MK±Ód Þ9¿ gqù”A` ¨ ˜@ÀØÐùSÂSFPBå9圞~ywÓ)ÕT1›*-Ë. qF ¡EФաEgÁ«ètgÔιj •‘â9¹OÍ mýÐÚzX¬š>»p”@qÔ‚(P©µd=Ò»wwã4\^m¯ëeUmJi‚wD¦6Œóý~ÿñîññi8< ¿¼z<Œä|hš:[¾ïBT6¤U ˆËNjuã™3lgðÎê¶³;fq¾.ž™À/Xa¦"IMÝrˆ¬aqζw½ó»ïÚà¼ë»nÊe/=ªh쇡<<͇C-eéŒa1ð¬ö ]ÆÈË£¤u ³JWWS6˜ëú?Y¹ ÏçösTª *­ÿ3™žÓœŸßG\!@çT—o-Ÿf–MG‡y×wŸ½¾øâ³ë‹]dÌ&³ÕTKšŽ‡ñxHIÁŽÑßD£¨Ý5±÷ÌÕDPQŠÕTËlm‡±qbîp’_Þwû‘œ\]ÐÅ.\¼hûMøÒ 2rÀØGtšÐ/­ ¸ÐZ9iJ>Ø—óÙ×»Û°½-øûsÙ¡U¶:` Àüê%FÜP»õS’ŸÞ–ÃÝX§<ŸòüÄà{lHû¡d"@‡ÕÊ„%Á”ËqFà°ÝP×´7ínS‹îï%‰ª!€‡è²Ú8ë @ÞaXö)„hdЋšóü8NšK‰½–¢æBl.˜œå Zͪ¡óq{©mKšQ“i3b§¹”¬Í."s9U¹<Ì}(×»8{üù/?Þ\Ä¿úÍKOöîí÷9×¾»Út}š ç¼ Ä .„ضç±Î˜Ì³q¢y¯Ö€–2Ö¼Y"à)ãX¹ÌO‰Ü´íæmý¾ß¦Ë¶¾ùªÛ„úãÏ¿üôË}ªÒv”eJÃC² ]wuÓþý__ý_ÿíÅ?ÿí Hãÿóo?FŽ»ör<ÜÝÏcF@A_ˆpÌûǹaˆ3’ £1¢ŠåªKQ¤RK)fÜìÜ"2$UU¸;üü¨óûÛ¿ùâ†Æé4äÂÜß-¶Ëa<>Ý=Ÿ¼w§ÝN¤~øðáññ)4ÍõËW»ë›ë/^½þ¼LóÇ_~üå§>~ü˜¥ö»‹è(†6PKœæ”ˆBˆ-"§1Íe9ÌÈ9Dr|ÎûåÅ'¦;Ï$Us.óé@Ø…‹n³éU xu±5ç?>~üößþåç?ÿQrž‹œæfmtÞ(©Š-æFV)h…de9òœT­©Vòñrwõúõí7ßüæ7¿ÿÛ÷ó<Oûÿøýá}w8DU¤-©&`&.ôm¿¡‡‡»4%Ï´-t3Ãe±~¸œŽÓ˜¼£AjÂôÅ Þuá—ûòÝ]˜íš]àÐÐyöÎKT’+S%4eSÌ¥'­'‡.g¦,&ì$²]_ø/>Û¾¼½@yR6ö"Çùãþf)UR®§qÜŽ)•~ÓùåE¿iBðÑ{ÍiÛ¶1|ùùíßÿ—?üæ«ÏªÈ‡»‡ïü0ÎéáñIU›àƒDhZš`¯o{»‰Ÿöâë/o¯®¶¿¼ŸöããÓ8Îc߆MÛ ÚižŽ§ãiˆž£ÛMw¹…Ãq~8NÇQU›èqN­2“ZVV€ dáúÛj°DXˆš—5¶Ì¤ˆ¼"z@‡ "fŠб)ZED¬¢ †K¹²Â0™%ý$Y_´6æ åQÞÖéÕÙ…ˆgÒ…þJðº,»Ép¹õWµ&-ŒR³ebOˆ¼îÛ¡‚³Š`d "°™˜¨Å¸g‘.ž5ºÀ+ÁÆ@¬˜Š”jóœR Á»p<Öq–œ(†N‘ÎVe®Ë΀ÌÈ”–µ}1«¨jPY¾µ'Tò+ge+j‘¢Eª¨(p*ê1/é»v.ÍtQ:˜™èY»¨Æ¢TÕ¦d) ÏMëš#ƒ€h)užç9ÍSšÇ)ç `NUÀŒj…\0WrbFjŠX”DŬ®•Ù3ÅéSæðÙ>`KÛg†jXŠÍYs512$4&XÌ~Õ®ÞÆ8ku…·š‰H®&"ªP… ›$øã‡©Ì§§Çp{»ëzÿj'Oœ'3´FÙ=öñaæºéðóW¡k7××—×W0å¹haG›ÝeÉiJ Õˆ¢EvÌ]>åiÈó”N5 c{ªmª@˜V¸-€¡‘Z.6Ls©UAÁŒ€o9D\䉠‹1Þ`Iêf5§†Œ’kjåZA•HŒ­æjãœLª¡c·qΪJF«Œf¼QÙZ%Ð ¸nPH 3Óœ²"AÕ!yË`– êRn/„_Â%=ã¼Ì[–«“uÝÀ­cé¥{%b _ª<ê»GßPªeù0Lãä½_6ÓTž†÷îÇÓ<œ¦§ýøñaÎÕF#o°ð-w¼8JžSº>µ)ËŽb…až5î öêÙY¼¶6[ð¬Läu¾áÕ>Ih–}šY5MNÍ»¾‰ìÙ¤±íbÌnçqšS4LœŸ÷>L9 D$¢Õ"çxl@"4c04ÓÅl€ÏlÑ5lû¼ÃÄ_ss×½çsj â² P:Çv,'¥>…V¸‚-‹™~Qg.þéÕç Œà@jõ¢ƒÏn›/^µ»¾‚URU›f}:éP½ól¦–òe¯·Q•pÓ‡à±*Ôecœ˜åþpº;ÔcRpØlÃÍço>»è:ç<Ç(U«B7z¿Ð$VÖ1(±‹çf€ùÐløêõ%\½êÇù¡¤û<µd)îî§ÃûŸŽ9×®éïB„†ÓîÚõqwx±ýéÇû¿Û½oÚ+åÀ!öÍ%x&ÉjF)R¦y˜ŸöµVc¼Øv×:›SÛ;etÑ¨Ž’çB­kb„¤ò4–TyÛù®ç´ÍÅŠ ÷5a$Ϙş†&¤_d Ô:d(  ¡ -V\  Nó VÈ9ÕÉLJÛä›TÝ>û¯û‹ÃíÕ}˜Ÿª`óp’oßå‹[÷úúóÏÞY™M›èÛ¾mÉéá4Î5». ¯›-8)P«Õ)Ÿ8sP£‚¨€q»Ù8ŸÆùô`ó”0çZ­Juó\AÅùjr¼½vÛ6¢=™Áõ¥üæs2*FÓ®jm®oþðW_þó½øÇ¿j~óyœÞ=µ¼ñÝæúÍ׿ãý0pfNÍ‘T8)‰‚H5É(uU 3#¡­ÉDÁÌŽiq´°ã@ì užócš›ýìÍæÚ%9©FÕ‘ ‰$©ƒôÞ\¿àRÞ>>–ᘫL &àÈRÇ4 ’s±ïvŽÙ3CÇD h RµdÐÒv}s¹q¡A·œ5¢¶Ä@›nË.ÆîbNĘçÁTÆÓ¾–txús9ž†R­ë»‹mÿúÍË›¯b³9íe<þòÓÛa*4nÅE0Ç`žk¥bFÈ!†Ø4yNªZKñD¡ibìbÙqª9¥´èj}M Í†ÑqÓ5mÓÖTæq…æ¢SÕÓéôó?è4ù& Bô.6Ñ5ª÷Šdµ´èƒs$"Õ* zR5CÕÌ -ã‹«—o^ÕuýãaÿþÝ÷w?ýøãÓÓ#{×ôí™%È!4M×·ml Mƒì«{ôWB¯Æ´g…|ätˆX$¸ƒ»Øè…?]‡flzD©ÈÌŽª:×7H>©–"¦À  ¡™P!æªU ¬h¡k¸qðâ*Þ^uM°Ãá8 £óÎyÎ9MÓ< S-bÆYì4ÌûèJ7×—¯^½j¢¦yÈÑónÓoúvÓ5o^^¿¾½¸ºês)ãbDG ¸Y ª1ôh<Óç//¯wš §iæ9ÕT*™…b Nò<œž¦iÊ)!Q#"LYNS=Œ2¤…Þ•À²í]]ªõñ C’e©|†\€ @Kγ!¬Rˆ ›&P1óÎp-; MAlÝX’¢)¡®èT;›ñ u¹k–•÷ʱ4‡(hFç(â3âF?êÏ ú5<À Ÿýmç,Ûu=`g“²š-Ù@Kî´© ³-“? t`‹Ú×j î4#[Â;×&Ñ@çRUkl¹?ÉT* ·È!ˆŠ‚.·©ÑjE32 3µ³¾wQ<)Aõ¬ìDQŒM°!±™ŠU5FަX5§*.`@B]4U+ÇTª¬‘(…\±“jž©o]ÛrÓ€¦i¿ÀÀ ˜y³mûmˆGWÊáé0å¬N *sdÈuI$@@ ·¤ušå*ªZ«8·s—ÂÝP؈ ŠP©8,5¨ Ñ2X^2èÎU¿­éu{U­”ªÉ@D湌ÉJu¢l†ˆŒŒD<øþc½{:Þ¼Ÿß¼/®cçC‰~eœr)ªØOUÞ?ÚÛ÷ÃçŸÞì÷ü\ëýãÝ4½Sç"†ðx²ÓiR©@@&ŒH™­šc ÑFÍYÆZ-Ð$Õ´LU‚ê*±F¿<@rÞ£Çå£IÈ„ŒˆŠj&ª¶¸ñ É–¨ŠµvÊDÆ j Hà‘Ü" ÈìÀ!D5Y#Ð_†YTshLê̬Îf,Ô”Db×°ç*®ª dPд¸ðÅ ü)‡+7þ¬šY =ç?(üÿaTˆäEõ0åŸïðXŤÚái B¬ûSzڧǧyœOS­j¹”4ç”Á0"E@g`jb«¸…—ÑÀòÂÓóG…HQ¸ç™ƒµÎÅ<›ÎiÁ³7žaÁ€FlAçÒº6„ŠX ;rTÅD–Cb 2—á8‡MçÐ;ð^‰ ì /êÿåãŒg.ï’ˆ‹ ¶¬`álÁ9ÉðYð¤«C éìÞY}ëF׎`¥œ9 g è²P[$Y¶BN×ÍÉjr~=LÅ,Wâr½õß|±ûì•îhu(†AÈC¼«l9{(s$Ú4hH ‚1 ’1q5vž¸y:ÔÞï¾?aÓܼº¼ê0ƺ»jûmR.s× o[l¼r‹Øz8·F´Œ~‘¸Ýl¼¿‰m€ÕcÞíü㈇±LÑcÙ?Sšn^\ì.£ùòÄ/__\^Ý\^u§)ÿƒË'zoz¼l7l4ƒN  ë,ãPN§šR‘Š ‘ÍÉÚÖƒg„FÃ}úîí/Iàó—/¯gy–È9pÁ°VÈDÉG×6˜82nõ8q…k×®uà ‚VC4r€@@“äAÊÌÄD(˜¢™‘cßz+¢eÒªÞå« «:ꇎÒn3<¥‡r˜ó ¾«Ö|ó¿¾û‡?\ý—/¿Ùx÷þ»ÿ•RuÍ6æIçBãÌ'ÚìxÛ÷ë4Ëi˜f Öz¿ë7&–®%ˆä¶­Eôžf‚Š•A ²Ìª)¯€Úmâßýuºf-Æ]¶/ÇR}×þÅõ7¯ÁÓ!î@O›¶°e²tûòKâöýßÍû{-ͪ!‚Gö@Dfä”AÕ€–—ßV@Á X|<Ä€´¶÷>d‘÷Oöóƒínn¶/Z•"õTÊ!çÁX±×YJ`% ÁòlœRÎS-š3º¦éw×ýöMæÓÉLLòx:>ÜÝÅÓ)Ï6MGî<§d&`( RŠ¡¾i|É`J@„€¨µŒó\rßo¶»‹«Ë««×W}SNãpJ¹yà&Už3vJŠ&Œ›i•‚LÛ‹ FJÓdfÞ…¾ë»~b0$e±Zsaôms{»»¸ÄÃãÓÏ?~÷þ¨5»Ýí›7ž)GÈìòr£V¤d´">T¤‚(¥ GŽ‘Ø™™ieOìsE“¬9!{úËŸÿô¯ÿö/?üðÝx:š!õ]Œ‘½‹@1ø.†èœ° Ð05;¡ëyÞVóÜÑØa6'cªÎÑ«›ö‹‹ëã¸OiŠÕHÕÄ™:D^ê½Z%WAr0TDt^‰„@œçJ¹#0Ѷs×´iP›ÖW©ûý|<œ0 ×RÍ„Ú6¨WJÅj)mŒ^ŒîîZOó|ŠÑ½zuõâÅîåÍe}ÛøRòát,µžÆSÊcÛ¹—·WsQy|zª›»ööÕUs°jˆL§1M31;µbµª™¡ï[‡¢š½£ƒ'@gˆ§!Oãþ”³ #8ž)zÚõôæ¶ßmÛãJ9 IÀ­ÓJV̲x56ÐìÙb­’r©• Xësðë9{Ç €¬0ºOÑ™ÏÁ ²j u]r»ç¸¨Oòž_aÏMÁØwÆVþ*õVWÞ¢æ=ÁH=™€fÄâX‰PtEÕ,RB\äæ‚ø̹„¥YQÍhBlÈ h¹ ¢!;f_³J­f€ì€ØLLe!õ úþ½a‘ ° ƒ942ƒZuILX‡Àà`#-íÂò˜É€ =©j®â«y„„gŠA•¢ Dl¦©JªX*Õj ÚDÞmœˆ(dèØ·MbdfDôžcC쀇åyVÃ…&€„ÎÈ’,nJ ;G,Ò4¥*’Ku¤Ä‹lYM ½ïÍÌrÁT9«WðDL«ÒGVsòj8}®.@Áp —ËEk1uN ªJ®PÅ„u^‹jHêz°—éðápœïþÖ]¾ùúVcûtº†S-è8ˆÁý±|ûöñêªyù楺0çùþþ.¥‰˜)zç|QË’kž¹Jã‰d‡Ä€Á9`T†Ì6ƒ!’éš°¦ hÄ´LÈ×§DkC¼¦1à¹[jÑgÑ“Õó–‹JÕy!袟]à D¸.ŲŠU+¦ ½!$³—êݪC!3/’ÀГ‘(-¼(£yT°jº¼Xn©8 Œ–ÎÆè9€–ÀžÙ5´"ƒ3!¥‡C)²?ÓýÝ©ñd*¹ê0×ÇÃ|êœY”ÏqÈ ÊÄž0¸çt;¥ÅG‹«øìY+j;¯œÎ‚ÀeC¸úœ¡u¦ ›-­òš˜ÇðÉË졼©˜V¢â\ ›Øì6ííÍvÛ8²‚ 1–j‹¦óp˜Ú ¹ß4Á[ >6ó»rœð{}Î^ž×[KÞ™@ €KÄú”ft^.š?±_¿¶¶]°¢ÌÎA`¸°Jam4lÝC®¿¢%[Å–,òsg&h´HžÌ¥ÝÆ}þf{¹Ó4=¡¹ZD¤#ହƒ6ø®÷!8Q©¶&É 9/f©ÎyÎÓ8~|˜~yÊ3„/.¯^^]n Ê5•ir1ä¹çzÝ]Çf£Zx¹Q‘LŬÆ.4íFEjJ05Oóq_“(ôFñé©”,Šî÷Édž¨ùç¶KÔÅíÖ½¼Ù…J"pùâÖ¶±Èrµ(@™ôx§'k|ã#X@ŽHÎÐVd•š-i9Àþg}wÜÿ%Ý^Ћ—îõ^»&Χ) “W‰Ž(:à`ìTÁ¹ïâî²=ÇKô-0Ì* Ò:LQ61­ d`dcïMœå&œ'ÐÙº¦ ® s9ÕÝô4´’lº+‰¨Ù7ÇÂÇ_&æÓË›—ßÜþF§wï離y°¨9Å@½óι<ét*œ*ï}è»þâ² åñéÑÊCã»È5ï:à­7@¥þT½G“eI’^©ÄÌ.{ÄÝÃ%CWWWÐþÿ[ˆÌf6#]43ƒ8{ì#ª: »Ï#± ‘ððç÷š©~ß99Çê1£"cU2*Mƒß½ÃàHÑc·IÜg5…ùÙÏ)Êem¶=íÂôt|`×¾»»Ûý´;'â¹ýò8þúõ˜Jr ˆ˜²½ªôÐĤâÈÕêÊ´¨©š‚C5ö§Sþ_~æØßoCðŽH°QA‘(.é ,óxir}³qßÁÑižÊœJ“õ²ÝÞì6„9Gf—c9¼—óÉ º~úþÿpd‚ÌTbž¦ÓxyYÆQr™ÆË2/¢¢ f‚ˆìöMQ˜—x9ÇËxbÓv¡k€`‰S íÐv[ç6ä<””Ä¢äì]c´Íôf\Ú—ç^ÌùÀ IDATeº¤!¤ý–:nÏç¢å¼ üý®ùaÊ©ÿúR^Μ-šh2S-XÆ,ªV UD}3õE 58Q⬜ċ€8Rï© Ü6„€Yàáñ$¥ jß7Žgv¾qΙª‰1Q)ê½kÛV§eüó_¾¤˜‰ôî¶»¿¿†í~¿s¨L“ž/)åx@xÿþÍ»{þòõð˧¯—Ë9Þí¾ÿîýÇí¶k—ãÉ9vÌH8tý~·ú‘K.  ÄØõÝÝ®ûönçÏÏ/ÇižãÓ|º\æqÑqÊK*YÀÀÍ7nèÝnÛÝî7ˆìÝd‹Šc¥zÈ2)¡’d)yVU²äP††¹sã(Ó¢E³ !뺙Ö:ª» 5NZî€D\_ÖWzÙ5Jü­´æéê·yͽB¬meÚUkÀ*®Ž:³+7cµá®èx@³ú¾Dµ‚ Ž²gó~þ‹³ÕjeàÔ¸–é›PÌ Zq”CP$“Z.¹’. „Ӣ˔¥+šBTÆÊ×1D¥•—Tª,ÍP=)qA1§à*@N,š"#EbD®'+µ RßÒæ‰BQII=kãÖ³(&¼æÕÕ0eÌÔŒL=›÷êXGmÓì¶ý~?ô]CÌ+o‡€ÙÄ;ºf·ÉKæXxв$"¼bÆ ÑUœ¹™\KÜ\«‹ªJR„Vâ  ˜šX'æĵ6~%¼FJêQ¯va@0$BðÅpŽ+x¯h$Cà Á@j ˆÀ·^3Œùü|rÍ‘NÙ.S‰Éˆ—ç9i™ß}¾<Ó›÷ˆÀÌn·¿ñõåší">¼<¾¼”å 0/). ƒza’R̳k½fÔ$™bl¼®˜ÌkÓªò̾Ñn+¸jÍhTÃë·’ëôVñ*€EÍ™xÕîšYþ ‹¬~þkÀmå®"T-%UûJù_wˆºÆþ«I‚pl¬ ÆÚ ²ëÖQe%„Y Oêz-’¬¶d‘al{ûø~ûñöëDõâ`bÌy\ÎO%EÇì‚-Ër&Êýmßn[€"ª “ä˜Y±¹,x8ã勉“ÑŠo®ë#-¥\f)ÂXŠä\cß9âÜ×w-“KYb‘R®°vÝo»aÓNÓd*Ï4/ó43Bëœw(ιRäåår™¦qZ†®óæÞqCôó—‡Çǧ3½ÿ~ðÁ;‡ˆ@º¶mÂæ4ïÀ;žºÖ;ç›ý;ŸÎóñ´,q>§óyŠYs¶ÒpEn¢sžs±9•9–R®K3ÀZÈpå}3A.Eʬ9{êïî¶·ûátI1ò’0æRÄj¸¿VÿV<^%=b=ÏË™UÈù¢Ï  ¯o,Bpuè + Û®oB[}6+{ý;¯/źý[§bug•3~…èáõQKã  Ìˆ¥XQÑ2›Qe95R¥êõ¬#ƒl¦„yÛ¹7·’ÆiŠâœï[‡–§˜ç’—¬Ù@y=Ôl"@AR¶&¦d ê¼tA tIeɪläe}OÔÛ•‚C46ͦ P¸â Zˆ9¡ <QMY` X)@ðÆ–CuÓµÞÝÝÝßô›¦V•ˆJJó<-Qh»î3N‹Ž‹h,rEy aý‘©uD¬B:„ÅkР쪗cM*ÀDuÁRCœ¯IåWZ,\eÏ ×„2TóR4æz>f@&âjB+fR]°„è†vã ýô¬ŸNɰ”ŒêœC‚¢|šu.¾ÞÜÞ¾s”úÖï†.Í“göM‹ý鯿ò_þŽvñöTJL"5›ÄÄsC 5ƒ2d½,Ó85W+æÕ°]#'µ¤±^{ÍÀdE$]ë f&Š5ëòªÅCC H„¨U%e „ Q@#ñÔ¶q·µÆ[Κ’ËEJqÞŸÛþ¨¾$tŠŠÏ#/g푆•µUꩯìI#Ä„Õ#¨jª@¯UVµšF11°J¥oÐ/(ˆUCã|.xký–EY•ÈqKkª¨†rêƒë1ù5ï¾>q€êÕˆ®5€õÎU©¸•‚ûÍz¥kîŸk¨_׺-r]¬]s¸ªì ´€¥Æißñv㇎úžßÜ?~÷»ÿðýfóxÎY—d‡ÓTT ©|ßïÑT” ú®úL¸hŽLŒë~“ÓQ¼’‰Ö/k/ªÎ5  ˜ãUÓrÕx¬Ñ§×ݨ­„ ºÚ¸úþð7•ú¼6«…“*®O;- Ñ9i[nCÂýÐÿ—?~üÃ?½ón¹ì{'—xxøúüË™­éÛÖ`ÎéànÚþöÎw\Îc‰ZÐ¥Kš 8)¼Ìþ’ØhÓܵû®ñÍΨ)e™O—„eÓAkJ!–@ºï¼QJǯéúÝmw³¿æÎÈ´>—“BΖƈóäÊ"^ží—_^ŸÁS‹’ºmúw÷òÅ~9:Í»í¶Ûº¢³Nçùý-µhæŽéàIçÐt¹œæçO>Nn)i˹ÈvÛï†\ÊÓ²9ࢥ, XqãiOcÓÐÝ÷ooïõö}PS<ŒvŠM1ïÖ}°³Q&ó‰zvÎa:^@ƒ!`AÓú3õ€]0A¡$@$ÜJø2.ÇËñóår˜û ð¬O‡qšïü°ÕÎ雟>Üüð»ÿöùÿþýP’rغ°[Ôý¿œq9ü×¥ÙÜÀé¸Ì绾»§TÅ&´½éX4nw½ÚÓ²Ä9.SòjÞ# •’¤ç³Rˆh³m x7éËE§9'Sd$601Rô@} j]€âìó)x#šrN©÷ýïÚ½ùÐ<í8ŽÏ/OOór<înúýOïÃñy¾¤B&†•V²vk½§Î ˆjð27žBD” jB•Ç’§çP‚Ó· ¿ÏØ— qZŠ(„PÆô<槉&•ÉÅ÷ýöÇwï¾cßÄyYâlÄM7t]Ó6÷-qcÈàÐȤ-òôür8žKN9Nž!8ŸR9¾<ŸÏϹ$d ޡ䲤ê÷tà[+ʰé‡~KÞÈt¾ø¦í‡‡‹Æi§Q›aúspÁsõ«¡æ‚9Ó¦hR=ãËÓã2^‚÷ý°Ýmoº®3•iš–i<_¾üú×ã×§¾ëº¶sˆi>—åL(è1k3d—“1'c“FÌj1CF‡Úy¦¬  BT˜™=.¨?ÿýO$Ç€ºÖwM’”JF¢Ðn$ÛE)“‹9/ÐÍ)ÄÜÆÅçñ8æ)Ï&Ö`Y]’C?äZoBÚÃS:ý˲™e ve3¤*& Åu½[˦€È`¨+¥ Õ'0£‘)š¥¤1³(R´ ~h]Œ-zç²LçÓyNET ‘¶ûé‡÷ß½¿m›û®?”ÿõøé×YJa$BVU Ø4 œç§ÃÐ>~¸{Gè^ŽçaÓÛX–<]fGVrv>¸àA@§e~~~9OŽq·Û¼¹í·CÓ5Þ1ãüøt</9Bh› EÑn¬õ!›–☂kR’ç—Ë’óeJ1gG´NýÑCDYÈTz§÷û¶ë»ó8OEJ2höûÍfÓ].Ó2Ûñ\¾>ŽÇ©xäúb²ú^±5ôS;·jfÕ€HŒõz°æùÕ®¨xDpëÛ¾±¯¨<°Wýæ;rýõê£B4"U3DBzM!®Y_µ…  Z ˆx"È{D€R$¥\VF W:6‚w¶ßº›m( è™·»Ý~ÛŽ/¿|>GÕ\<9ô~혢 ¬ò³ÊÂÑ:S`"4ÏÈd PÔªJ׌€©ž€x5- Õ`‚Ta)€/b‹*X13b‰—hE‰ Ô€[ bi:³í¾{ûÓï7ûA¡¤ˆÙå¬)Éù<§”ÍÈûÐuE5§œWÆ"9D¸VHè[A×*8¾þN5׆Öza«^hED W,ùµÈAhøÚu´+µ_­a+M˜™0#ªú>+hR!Ó¶FÔÅÔŒ\Ò0Í6§ ”¼'æfÍ– ›4r»Ù½Ùno.}ëïÎÇ öý€ä€ôŸõëƒLÓ\ 8QSC]²HÐâR3•Ç4.PMëdŒ*oVSÕu,]Í5ìýíS…í¡Rmr"`0Ñb €PH MIÛ–ïî¶oÞ°ÊåùéEÄЄÌ9\ºV±D*¨)gÑìѹÂf$âµ€ÔÂΡ_e~f–‰Ñ€–zz¥õ®bf†hÄ«ÞjÝÂá*_ïø*Š@X÷V«8€@uÓ…ˆ(fåj«×¡ÊéªD0[q¼D‚«´kÍÇUm.^%"v½F^/ž\§º^É^i›ˆ€P ¿Un5£EÏeèܦ§¾Á6ئ£77íÇ·»¿»Ýmûyìæ9žÇüø4ô];ΙÅt‰).žÁL¡&VæÉur…wâ7qßõÖ{åvi©ÿ®Úî±uo ¿Å Õ6@5ö®’ïú÷­#Œ×Ê7úÏ* @³êc7À¢Esv‡6ßÜö»ÝΑhÒ>ðù—7¿ûÞ;87Tn»p<ÓåËHØ.ùœuæNïnnîv~ cÄ‚&RÖ”ÔÜTÒyÂÈýv{{‹ Ç’cÉ3`TZæ–¨1p&VD-1qbuƒj_Ÿ%ZÉ뇑´›¾”\E2·›¶)qºHQPµµä)Iv7ýö†K’³‰Z&vÞ™wH>;%&‡®Þø«q†[ßøb–t½u]{s{»ÝÝ´m+’‰ñ(E$–à @ X Î5D¤*`ÊÎqV(ˆÈ,ÈšAcF>tŽ(e-VP…#/*I„C­%+™ÀÊ8•%ƒ(³Ìdű;sÛ},°XÖâa&›2"k. ÍÑ•Œy‘˜AÑ‹YŽI“9ÉLØ8 Ë2Çh¢îË&—°#"²d@оF×ÑÛ·¢èU&… ÌDAÁVn ’¢š”‚š-‹ˆÄ&P×6„PrYÌçùtɧãòò2/hIY4ÝîÚwïœASJžÆ1.gÇÒ·­w(%¥H Ì$ÅbŒË<·­ïÚÐWŠ`)ºÌ±o¹mÂf; ›n‰ËóóüùËÃóáRðL‹i,˜š°>ðêpÞ âp!T:§ÖJ1:C*j1“*{VSÓ:B¿ž”€V¹âºý®Q5ôŒÔ¨AÀ\X´4eàp…g5630rMãîn†ïÞïøþþÇ[ü°RDã’^^Ư__އ8ö¹èùçE¦YbR5¦êˆ^sR¿9Á :"RD«…äZ»\E¯67¶«šc,_»ÜftU1¬ÿƒ×nâÏÐkod=‚!905 Qrm¥(0’Y)"*EŒ„z×ö @Å‚‚@Õ$R£¯‘ôœÉƒs¦9.1KmÛïÞJ§Ë¹Ç%•l€>0’h)KpD}ÁV-(!9XU†ªFXºø Ƹ–O®—5¹ñzò%R 5Fp¨×¤š)¡² €("!5ašuœìå(*ElžÁ0¸̱:,Ôp×”$%›ÕfZ|^¼•Ö:Cªí…5(§P²âõ^‡õí‹X3¦`@È~œÛŠ’„kG¸x *¬®Ž®«@­%\_öýÒß*+¼×Q%Ðë}ÁÖ•àª~ûmw]'Õ‹*¬xÕWsu݆Һsȧ&³""n[¿Û ··Ã~ßí·}×à2¤y»i7Cs<ϹÈùô»Ì‚w0žOš£gÝßì»]O.Üܾíúa‰KàP‚o›4ç¥iæi\–eyœc´¢ @àûÆòr/Ç#ÝÜî™9xÏM#S*^°ñØU ŒÐˆM Û¦é¼{s÷ææîóM)%Æ,jdRœÙ¾äÍý2žžÆQÒ¬¦¢’ò’‰€Âh"EZ‚Ö»’“±¶³RœrN —”Q,(ä¬õÀ’Ѳ§&cXÐeNR ÓÌ:“÷Ü ‘o–¼[‹30\Æ>ž_.Y iš9éyOg\–’SYüR$»ÀÛÝÆ1•¼,IÄ¥ Œ†¾=N©ÄœËТ¿D[’,1#Z€@¢I–â0½¿Û~øøî×ÇøùKºÙùw÷Ýím¿ßS×¹O_H¥ÈxÏçó8Æq,R20eC@tZ/ÕÁ³í ‘«Â•°¨‰(¢!*¨¢Ñõ¤îj–ã¤_ë¯v ¶^ÏJ«:³{‰¤}Åõ €¯2Z´B VD@›@wo†û»YS."(ä³Ha ޼C"¼~R<£sÜò %åqœ>?¦¯gÉðãû÷wïïÇ_¿r.°f{W‘­Õ¾êº]ÿÎ"0 sŠ(\óB b †@´råzã±×hóu˜©Hž€PÌ’‰è—`@_­¼ ¨–ÕŠªdÑàÃÛ7»ï¿óþãíííÑLñp:?=~þåùó——q\ˆsÖi–T( 'q€WõÓZ·®áË×7­i­ë÷ëÚç¦Ù¢h×Sß7CA=Œ­A@C%xµ6½~ƒ­ž#©Ê#ÖWB‹©"]­F„à‚Z+ך¹ú¯I)Í9Ç·7ÍÍ&ˆ,Kšƒ³N—i^º$Y̼†Ý~ÿær—%¾LK& Ð±‰Xbo.07¾™sž#ˆÔ;C©=ßê®{-—¼úYíj~^nkdE P ‘Vì'˜ŠIa)l ª@lT7K” ¾<ËósŒÑDw]Û’kKÉsä)n<;f§ÐAػШ¹1H&A„Žl‚<“%“,h¯Gf1½foˆ©>9‘‰×¶¾že«ywý˜V;Õ+ ê¥S„ß .¯jïQyõZáUB¼b.±æÄj=Vn敬k8~¥¾zBVËàUëƒP m}lé5.„dÆ \Q"ÕâËšvúaÓ÷}ÛösÄ.‹"¡w¼Ï.c<Óá”oïú¶¡óe9‹§ÊŒß¨{_•¿¯_-®Yþßü˜W0ì5ÄD¯L¸ŠØÖÞ•¶°.fêÈÄ®= D%S]ÿ¶¢šT²äÙQÚoÜý›pÿ¶ó_Ç¿ýéoß}„øáÿòÏomüuFŒ<>>}yzÉÎÑM‡4lvwînÎñ%Ç ï,l;oBQEˆ‚o] ±9DC7“ž)Û®ÛmºÆ‡ÀØ8€œ%“–,Ù\‘b³ï‚óœSžÇ²¤ÜtÁ1 ˜fˆ£-Ï 'âdN„eÿ¶ýÏïîÉ3c)KœÆœÌÉ1.‘Š-”&€H ]PA‘RÄÅâ¸AY–ôôåYæyóýǶߦ’”6•Es&𗯧ãÓÈìš®;ž.Ó(qÂç‡,?ýãþø·ûùøõßf“™2Œ¡Qp.«™&ï9lw~sëBO%jšçi™“uÍP2N§ÒêÛVÄD„G€h¢Bygdj&†Tú |Û z ¬ŒØwaèÁ'¦%&Ð’AÌŠ€”b€Ø‘oÇ)ÍšÄ9ÂMoà³a()—\dÝìªA² ^?è5¼¡¶žç‘Tµd+¬Dj,@Áœf‹gÜý>Pn岤hæšv×î»Ûwmè‰]Ãʶ•q<³˜ê68ìûa³iÑ1€5à4ç¬MÛînö}Û¿yóöÃÇï/Ï/ŸÓt!æX ‰<²km§¢%ç¸,)ç ¨D¹¤4ÏŽ‰…ЦHçEŽ—yNºßýv×´r8OËñ43è~ðÜ c#"d•£CxswGÈý04]«jÓÒ:­çµuEóú-^Ý×tÇ*0ª9™SÝΦ•©i•-UÛ;àt=¬{oàÁ ”µÖ!‚–o·ƒuíðæööãýðûß}èû€ŒÙlIé4ÅqÉY´#Fâ’Ë8MãœÄx3ln7»óÏãÌ@ì!«$5ÍÔ¢÷ºgÈK-€X›!zÍG­â,üvJ¾VØë3ARç ¢ ‘Ssœ“f“K„ˆ¬`ÅDÑ8Nj¢$Ò13SOÄ@SÖ ¶Qm],F%ƒ‰2¢ƒ…¸§¡Gï)ŒcÔX°ú›„Ð#X$fW!³õ¨ë5¦Þþ¯è­jw~=€×m´zx­°Ú‰t%z¬xžªâU½0ëXÏè B¨($[{¯f„×=îëêÀl¼Û*ûÅk»ä Ê„ë»u€Tv&Ú•.¿aò ;@R4e¹Lñ|œŽÇñó——¯‡y‰ˆ„èR¦q.ç%Ÿ¦shLÅbD@†o‹õf{ *‚™Õ„Ôªc4 {e"ÐZ7Po¨ÏkVLkòjÝÑ|“\/EW˜n]ÅJ½àX™ûPîïÚûÛÞy漌ùùóå|¸ô?Ý~÷vßÞ rSz™ÊK2·¹i››Ðßn÷·Lzüò—éÓË­SæmjzÈ¥¸Öõ햃跋á’µodß77»6g*„`ФL)ÊX s×ÞmÛ®õCML ÆŽßxvD–-^$.šŽ–ŸHÏŽ˜-ߊop‰¡)HÄ3QUI±¨•´8£¦Gs–ASÉ©îÀ]Bß Œ¬ì˜´Žg­[N9•Ò4¬HO_ŽÇcj·o.³>æœXJ@£mÛ¡IÓ%·¡!Q'® Ä,©ÞŸUÄÄ1†Ø›©éd &hÚc…ýW¤¥¡"²!¢a-[‘żœ§<.÷·7wÞЮƒ2Ã’dšöûîáo‡ÿñ¯ÿþåi‰Ølöûbq<=üúw€ðn7ømWrœ°†|‰Ƹ¿ñsì­í¼?Nýò<}ùåéëó}ÿá}Âtz›º]ºÁ[1Í9jhZâ`T<›GÔ9©ª‚G aÛzä¦YpІˆŽ“ÆXJ4 EY•Í’Z1ÓÆ™sYÌ’h¡¯ŸÏ_N‹ ÷ëú]{xþùå勦z(&\›gbªëŠt½û10 **23;›/ǧ¬ûÆz‚R’–"Èæ»¹PšEÚ–×["(Y–¸¤)´.4­CDS12çœ÷½>¥$¦!"Ħë۾ﶃ |>¼c<ŸŽKœÛдM+Eã§ãù|R+VrNQrɉŠÙ˜ÕÎÇÝÜ»v3¥,fäñËÓr8«sgD7/išÆÖÜ4¼ó]ë9Å”b*q1ç‚ …Ƙ¡RoLc\ÆËù|9žŽ§ñ2æ”R.®iÁ˜ ÍŒ™(»Ö{¯Eµ :L9—ÂÞ;c¿Xa@pMÁvŸ”) ¡¤¸\„‹„aFqDÊš“º±´/†/QR4Ë ÑRr¢ `õ(X®Ú3tU;$D5èKÀ>ÃÍ—ÈþHKa"¨ZZˆ×â(®nÔëNøÊJCÕk:REÅL„Q a Þú–¼g@ŒYb¶%sʵç븶°jçµ@èL  üã÷o?¼ß‡ÆBpû͆™S*ˆ±¢HQ7C·ÙlÚ¾#ç¦9=>O牙¶›¾íÚ®kÅðtš¦qjû>«;]ÊËq9§j '¤Ë"þåeNùÃýæíݰÙöˆ˜K–ÃfØï†çËeŒšúM/Æó4jIª˜‹.QR1bbCEÈ à›¦i:Ç̦ž!´-7]Ç4ÏIErŽó<÷]w³ÝÞÝÞ´mw¼LûôøéËñ|É"F ŽÑùuÀ)*bEÁ!‘­g82½&]×’@ýæ84¼Ö÷®ézaXÉü¯oñ:Ùú6ò[‘Ù¯“oSÕZg®™cP+`J¬±öI‰`3øï>ÞþÇþ!8z|ÿúóóËéËá2§,Žˆ±ix¿iÚ.xÇs*—iV5µ"µ6jn«.|~™ÇüËeº B×93—£¦%«|pš#&$gPÈÄ1"BVSUÃ×z´Õø0¾F¢ÌTë¼Ö0ïÚ4¨"†f½G":]ÿ—2áÒ„Ò82®ß}xó?}÷áýV´OóÃ×Ãå2§\¦9æ¬9Ã!fWÙ‹¬ì®Æ¥*䱚º¹f>ŒÖ¥Þ«t¨FôÛœò[Ó÷›Îh%–×Àƒ^áå¨ö qÑŠO½BÓ¯Ôóõz‡ Hn-TÒ&¬·’•ÀiÕYg*s øý›Íü¿~üý?~wÿfCPšÀ›íÆù0Çù|>Ž1º¦õm;lw»Ý6-ãÃC>OÏ/‡’bí¾ß.é"è "FK“9l»nÛñó˜@Y×c«ÔÕ„­Çc¨ë~«£áz+V5 ìܺ…x&Gl¨ "ymÚ`Å/…ÀZ‡M1œ²®’"ïÉ™æ$`ÀÀMª —l€{ Ræ|LËè†Ü¥ß™ÆÐµ}ÉjÅ$",¤iÌȳs hΠ5ä+¦ˆ•.Š5ç§ë¹k³ÔáÚÔÕTÁkSœêʯžd‰VHÏ·<¼j2Ö¥_•Ôÿ%3DY{½ÔàUDö[%ȺG0´¼æf®gc35•:-¨OÕZDUE3`bDŠ1N—ç§Çœþåë§ÏÏ‡Ãør¸œ.K)®¨)QælK^Ë+p¡2|Ö¨RM(Õ«Àª?¹²zÌxÝ^⊪ó+ügE³Z…'{¤­@Y­tQüæ2¯TdS)}c?|Üýðý’þúéáË×ãt±4å¦mßÞÞÜô=øÚaÔå9æì÷Íí†}Û´›¶Dd|y:=/ç|T{A·³]ò˜?¼é»}#Zl‘¸ lZê[ ‹¤"ê¼Stè™Û`Tæ¹Xãw·ûÍv bR"bì½3bòDh$‹¦,,g¤0JQ¶Zg¬jK­‚zbðQ“ V !'™ÏS‰gvè·°°–@‹eÉݦÿîwÛùtçS»û}·éÔ,S%Sì†þþã‡E/祹$wŽ~\„È·¤û(À%CAßuèBÁÅØ€ÑT! (ª#m‚ëzßõÈ û 8@Ãdy[3§öm÷ À@t}Èçx<~þë/%Êûï ò P4Ojs7xuîá8>—vï~ÿÓÍÝýæ×_~ýóßžg…¡»ÿpó—)iÐi–¯/‹÷ø˜aüë—ÓÿüÓ%A/úùçåùejš°Ý•ÖûiÔÓejgûøÝf¿iuy9/ças3tƒoœ'vm ÆÀ ªE£êúލãŸÊEV0bðÌŽ×Ó½rGÔÐ9憉@Î¥L¥t¨{Æ­oºÐ`è“p¼DcÙæ†,4wmӆЕéraàú ïÝ°Ý ]ëÚ–Ò,"ˆc/caGLÀMh·{C¢œþ®Þ¬É’#ÉÒÓÅw¿Kl™‰L$P@ª·én¥‡ûP„"üל§y¤Ì--MáLu7U‰D®±ÝÍ73SU>˜ßH‘È%â†/jGÏùNOûãþ!ºÐuì‡q‡~8¦<‘“‚†~ø´Ó¾}p«õ¤ ¢òs¹KYŠ("yöëÕúb»~qÓµ^7+v¢§Óé°?Ìãˆ&¦ÀÝæòù˯ZêœsmÛ‡ýþñîq÷(`½¤OûÇáxp`‘0tKó˜E‰°qÞ墈Á`ž‹”d&Þ€•"Å@˜Àû&•n7†AšBP=¤dØ^–èh.MòcN NÐ÷Ї2Ì*hŽ”@Õj‡ˆ˜Ð‘*[%ÈRû ¦HÄÔdѹ/ޱšO¤:í\âöÿ3‰ñ²hbfBa‚B$@ h¨˜² É’:Ã`hhŠÈÊ(š@¦ÆëÅÊ7Ñ5móüÅÍo¾~ñâz ýiœRÎ9ç ÌS.%å´^µ!„\Ê8ÎŽùþqÿö—O‡Ã16!„àÓÝîx<ì uµÞ ÞüòéáÐ+@Þû@lc–·Ÿö»ã4^·1l·b8žß½û|u¹ùÝo¿mB<”cchÛT>~ü|ÜŸý8ÛaÈSFRÊbj6g`VëÍþØÿ_ÿ÷?~ø´ç Ï.÷‡ñþöñt8 Ã|÷°ç´Ý^\l/Ú&0ÚŦ¹y~iL»Ã©?DÆlMšè—²I†dˆÄ¬¦O=“Ë@{^Z/Ѝ©C£e•¿ÃdÆ‹³÷ îÞçÔ3€B5~q”,zd­·„:B[ñlm 6’c`‡ÁÓóçë×_]½xv%9=€LsÚ÷iÊàˆPÍ‘lVx¹â&4ìù0œî‡9"…y¥Ž›µ ØMîö5 T- dlDˆÄ7AF¨À~fö`Å:0¶Zó¤@ΖâÒªç/#÷yÕ_ÕÔúKåA†\ýöv–Q Q<[©q(6­»¹Z½x¶½ºX=îOÃ0ïö‡Ói4"×­V†9OÃìïùW 8Ó9íË'}¶déy”Á_»Ÿ¦·Úâõôb3T¨\†¥GÖž°PpneÒ³•§^¸ `—zg:oê¥Å 7ÝêùJ —Lp½ÙM)U˜¨kýõEóíËÍŸÿöùõÕz¿ßŽÃÃÃ^TrîÇñPæ * ½‹Ð¶më‹ä~ÉlÕ®Ÿ«›Û¦¤ì‹Ó2kçu½]±G±4H̳Uv'òwYŒ<¾ë¦Œ©i†¦Û!í•ÐÏ’Á&ò„ÔšEïÖq½]ÅmQ‚ýTåÂÌD5›"¡v­c‚c?Ïe(ÀHŒ¬)”9&¤Sv¹øiOat]ã×]œ'"çœ{WiÅkœ!UuͶ¸ñΡ[£³Ènð+äWµ³‘}Eç ¼ZÜŸ¼rç˜îÙÝ‚jgD*,•`¦ôåÄø%ìKg¦VÙ`±Í<]ÂfOüÕê ¬{$åGp¦›.× åbÃ(f(ÅN§é! Á=üüööóÝþý§Ç‡ÝiN™‘ˆH  “&5 OYUU aFTÓdH¡&žmùJŸöhî|'™êò’ªÞ¸s:äL>¨‡ç§ýöR N5ù„L]TÿŠ€'{d­ƒ6&ØlâóçÛ‹Õýîð¸Ÿ÷»2ÏjÞÑñxz÷æÓ?lºûáñÓ µùj½n+.Ã$ŸO·Ÿ@¬½|5Zè»çn˜ŽÑïSçoóx*à\dÒD0’2"± ±CböÁùÌ#@¸XsÀ«eƒ”‰š(=åG—@G+¢:SÌ™…„Ñ* %°¤º×â‰:ç\t±ˆflC¡’¼ˆ·ì2’Í*vätzœ- ƨD2çÈ‘;CAzþýwº*zs’»bìu6˧©ÄFÖ+×]va½¶€êaQ4(¢jè[·¹r«Ž‘Ä f@'š  àZYž‘x~˜1ÖKb†ÇÛtzt¾#SÅ%Ïc)C»ñ_ÿíhÏvúVyº|á~ÿ/Ì•Ÿ~ÙkÁ›«Íó^~ùÜÏÚ[Þ~ß~>|÷êE³ ñÿãï‡Ç¹e5Ùú¨!ÓTŒ|×´t彋ܮ¼ë§Ã0%yEÌDr.iœó8gÇk/âöÙÀއŸ‡ã>{ާÉb¤ÃOðh-R±,²¸f>&f!›gŒÚ6N­Åpå»ß`|ýñþçŸÞô»(5BQtæ=¢š˜Y}L#:b®ÅèDàj½ây4 §ÌÆŽóѹÆ{r>Žó<އ”GEÜ„-¨0…&´MÛø¦ñ!`ˆ¾éÖÑÇ1¥"Z$WM.眥¡íØ9*’­IeÇ9€B çë#RS–yNcÚÝ÷c{DrE´”É,™$4BpÈãeÀF‡ýñ°?íæa¦àH‡aº¿ß=N)K»o^}~ûŸu윋m1y|Ø=ÜÞ²©s8¦©ŸòzœBÛxÏöøùöí|óÇãØ\\déä~H’ÆhMk@ÅaˆLÌ(Ž¢'E)ÙЈô€©H–Rql\»ÊÒÞéþÔ÷|Tže61fÝäàçWV¶eÌ)Uä!Ù8 Pò,Õ¤Ïh¨ªµ ("z#44+¦RÝÄŽˆaAQ×#Aõ¨¨©ª(+0£ºeQZgŒsíâÙDçzb4e+R…¹¬ª³¡IšÄ)5DHk3OíwK Æ`lÅSº¾p¿y½¹¹l晜3D†IEˆHÍRÊÓ\¼—iÎiN9—aL÷ÇÇýIÍ.¶÷^²Œc>öãiHMprœ~ùøðó»Ïs.Ûíf»jÁðþ8õ©ôce5böŽÝª[?î§÷~úðá–‰›èö:%¼»Û¿}w<¦nµò³pR" `šMÊÍõöÏ~ø†lü§?üÓn?¾üúë¶iN»ã8cl›¶8…®½@Š»ýñöóÇS¿õÍ׫†ž]µŒM­¨Mµi—@Ù 9Xú[–¢ª³ò‡gO.¸ºè_|ûHvV,¾—%»Wéggïy¸X“EfX¸`jš@sdé¶‘6o·ñêzµÝt«®qdïß}Úïw÷ûÝã0ÏE”Õ¼BD2Ŭ†¹àaÈbén7î%Bµúhöˆ¨ˆÀÑÐD Ó:Íqò„ ™93@Sª¢µ1,ñP0eR0ç¨q`ã,ª‚૞MhµîÐDm|™j7˜AŒk_Q=ÎÒ91`ˆÆˆž™PEtNÙϤ"M¤®áÃÍŒÇÆ#"³3 û¤\Ì3µ† µ£ Q ­Ê¼vž«è¼A«IÑzPEç^Ü Ë#˜žPN¶´³.üÒ‚T©nKÃÂ,\°‹:,ˆuŒ$XÚÇêõµô¥Ö_GÀºÆKV»b³:ŽÀáØ—Ÿþô ¿|qYD÷‡Þ}n»Ø ^Ë”¦¤6åYÁ¡u_­â4qJ‰oV]4 ˜šél:sµ9jd7´«nqIS@ôDúkž};Ï›œú1ÖG‹8—‚ëƒ;"õŒ¬f `âКÂ4o´^¯/×)Ãi6“‹Ò”¼Š£6N£Ïckî•Ð bDhÀ"`PÑá4ñ´÷u>Ç&3ºâù iUNÎDL¤Tm|™"ë©JŒTÌ̘,2x¬F8£º—F„³ ga{âyÃCgÇûr"x:ÎWÚ­-¬0ª:¾™ð¹+Ït¨ŠFÔê=2Z¬4 ´ì é|R}Ê–˜™ÇF" O¥(ˆhàRÑœ¥ñAËD†0ãÃÝýîçÇ)™YpÅ1…~_É¢KþŒHTT$?"’.gÀ_óˆàÜ[|¦uÚr®Çû5Ëâü!ÖTÀR’ÍfPè鮲/ê´d4H«{x<ÎcÞíÃq05G Æ–Uÿù§_þÿPº(¿ùýË15 947mXLez(cŸÇÚÕM¼~!«KˆWÎIfþÓxò¨ž\‚äœrRÀÐu«ØrÄ9ÔºV ônU#VA˜ 1ƒ%IEr!-$3ä¥AsR GbÆfbÆlbšÁAREKjE M]™¬¨¢÷í*†­V˜YX³ç˜ J™2r¸}vÍmCÁÏy†Tº¦¡–NcNÞs·q)»v2$d¹!p§ùØÌéå«îæÅ•ïbaàØ(ŒYŠinÃæY¸~ ÑIéFG€ìÔHÁ@3£¢°ŒXûr €ƒ¥(ž¥*:îú~w\wíöæY\G¨¤êR@“úÖ¹—WƒmïÆSÒC·!ÄL`Á¤f»i/V'ÙÄClLá?ý?x¿é2ò×Ï/ó$§ÃýìãÍÅöú"z¹kÝÜ´.ví%¬œÒEô®Tz@Ӻƃ+Yòœæœ2*yÉyCBǦðøxüôáñ°O¹Qo½¹YJv€ ˜s¾Íbj¼€ïŒ3ªFض»†U(ë¬v‡æ0¹ß•&ÜùØ ’˜€X`ŒÑ-«o fæúÈÀ T@dá^xÇ! .Ä&xïÉ:§ÜÍàNýcî§£—æÚ7ÝW_=ß®šÕнGÔµ]`O!—’›U×mVD ÓØ± !ä4Oã§ÑDA H1+SžXM4ç4 #§¥¨TË%—4ZÉÎÔ#úÐlýæE¯Á5:E³ÜŦ¹º\ÑýÃîýÇÏÇaêÚõë—Ï^<Û^_n6ÛMˆmš†\Ì‚ì0Ia¯z<îrêç¾ÿðæÍ»?þëýݧ Ɖc‡jžIR) & Aï(„œ7P1vì=–iV@ޱ¥’4eQ1` ¾kš«û=ßó17Þ¯ŒÐ²˜¡ M\•¶kÖ«ËVó\XŠÊD8‘«!VoöÒp©è+¢ƒÍØLU Xö,D*Z}§T³[Õ\ù`ˆŽ ºíŠa©§?|J\Ѳ•^˜ñ€Š5]jÕy€ KºÌ¤@F3%Õý¥²N¦LdàS–Çý\fˆQ»Ë«›¦é¼ó«®c¤"Ù{bçcÓ c€þ4^nÛ™BôÁyÚn»èÃ0Ìý˜ aµ]mºÕé4ŽÃ<Î1ÄËÍúbÓNs¢ÓH€ÑñÍÅúÕW××Wë96±ë¶Eøó§[æ7×—kQ›ŽŸÿøËÃÃ^Dƒ“@耉 IA›»Æ~ûÍößþõwyžî>£_¿~~s¹žúCXw7/žçb¹è~?³îŽ»a8Mãþápæ¯_¿ü·ý»aLó4ßÝíþôn÷˜ÐıZFzc¤ú‘SeöâR¾¹tÇ8|Rˆé Õq¿=e%áW½ßˆ Nξ³s!æâ¶G˜½+]Ä. 'ëÚð›o_þÕ_}ss¹{ܽùÓ»‡‡S)Š ¥€ ‚¡gŽˆŠ`IòýaØõS*:M:'g挸&"C. È@l¤`ârfQEÊÝE^oc–p8ð4Ôª‚™Õ(p…X¢CR& ˆD´¤Tj•¥*H‚OH•jTF¤r©Äj€§¨tåæ9$œŠ©Á0hÑ\º¶ÝnºÓ˜/.6)ÉÐ)ÏÕM‘в’7B0A”'Äà¹\¹"Ïó_eŠ›"pýi<‰Û€Oæ%…/‰.™î33¥¦î8°“¨Bð ¿ð\eZ ¡2>A ͳób—:»”Î^{S0ä4›mèX1I*  TËÌæ 'ÆÒÄ­éûñ4·_­V›4 –14NQAc/(i§c7—´¾0vÒÍf‘$ÐÆöæYÁ5õ‡«ëÐ?æ?¿“äV«¯”#‡Hž,8fÇBS¤˜f!¤®å‹kl·&Ù„ ¶3RŸÀD£dVKŸ@‹ jnšÆt<?¦S¹ùêzóìÊ/—¯ˆwŽCÔ €ójKßÿðÌà’?¼ùüøñAÆÑ‡Uã¤ñõ#GDfr(ñ݇Ó²ôwñâ¯~ÿ}çôç÷owãz{ùúf#‡S ]רú2 € “ÍÃ$ªÙb³n·kŠPlV-„æÈ‘wÄŒU`±,y˜ò0“Bpl E&)BV„ízsu±¾¹Ún¶,¥¬7˜‰ vÝF˜Ó<>ÞÚþüùçŸ÷whÅû`9+d6‹DD¬tLäÙ{𨨨à˜J¶$¹€r!E$Þ$-;ËYvz,aƼwX7Û»kŠ7 qNcÊBäˆAyøÔ@ÕŒŒ °ˆ‰ ¸ €è]}!9[5TÔ†)'e†´D+±*DuT©ðq¬È£ÚŒKsdÝ% ˜.M±ˆFNÐLÙŒ,‹šž‹J ÏéMúªN æ$«†‚ºa”Ÿ)cû¶éœóD´m»Í¶¤S?‹èéxšY½÷!Æ’Åm×´Y·14)ë0ŒSšn®¯.¶›aL*∣sÁ¨‰ˆ2@øÙU÷í×WÏŸm˜kÿ®Îs¾{èî³ÐvÝŽÃüîÝÃíÝP$°o² H©ÜI52›»hß½ºø7þÕï¿»†éýw/7ûãË‘‘Õo¶——×ÛÝ¡¿ºÜ¤D¿|x¼}”H e•׃\n·Ï®×)Ëýãî4œúIN“sÌ‚2‚Y±å]ÊXI¼‹{ä)îKW¢«ÙBü’%”'«ÿBzŠhŸSnd5H†µÑçiH\ÆKS&‰^£§ˆÉ±ì[ö+ ¸?ÎoßÝŸNòüÅW7϶>ö·÷Ê0Õšú1±”%ç""¡«³¿¡ dÐ\–„R[± <¨0ûÆk×úbqš}š ÙŒP1 0-SQS1§J¨Lëw6Të*qõ@/Mž`P – °2¿éŒ?µ³ÌY‰!%ƒ ðT"&ØËþ8=»Y5m³Ý^óþñØ÷ƒ¨ö§”’8@2+h @ÁȀаfç«cùÌgªÈ`=SÔɾä*Ϲ #;ן.ŽìåHQãxö8œWu$Ö35Éžº³¾˜‹—©N êžDÏ^d³ÚºDÈ dbhÈ ÀE¡Ì0L¶ëÇÃôøêŒ:ôƒw8Oyçóª…Ð`Flº½,)M§}IGÇÄ>ÓœS)É È9·öe鳂±!ç4—ôˆÚo&µ Æ„F 狼rsŸ¬ð•g7»šœC§ÀÚ¢h h ȶ$_¦¡ñÔî,b[2öE½©×‚E)VS.‡>sçWÕLPEAY€&´IH1 ¿È˜†yÄ4ŠBŽ” HžÓXJƒµWÁGÄ %%-)h:PÊ.›)i–4ÎšÌ ÐBXu=+Ñ è§FèÒ}€@K¬˜ÐP¤Þ-ç]Ò‚“¥ºm‚/éò§Ëñ\¾ôtS­üª×ÍrÅ/N3­Z´–p €¯¢åð‚DÈ ä ʘò\ ¢‚‰(‹8ð!‹ ,Q+¦ ) ëê ¬¨*"!9®[ÏóA÷|\ŠKpQAš³ìÆþ>ç¹Ú$ÌÔ™|ûaÚÆý·7Û¯_^dœ”usá.¯ºÙVãq?% cNC9£YV>øfÝÄèM³Z LܵÅtVt10˜@.¤°iãW×—í’X)yÖœ!‚”<¥¢[&pš€€cDך90œ‹D}Ø ÃðÇ?}þ‡?½Oá6S#ÎãykÌ&$f |Oà\y¹ðë隈ɸjS&ª9 “C3–‚Žº`¸RSßÅvÕµMˆÞyÇÎQCÛ61D3”’E:bŽ1s  ª&2)3‚iɪež†4M9Qc纮 ì¹ñ¼‚5«­«ãœ&‰±E¥’(„¸%¿ËvÅί®/Vë6Þ\_½zysuu ¦¯_Ý$Éb¦jµ£±çá¡û#¨­/®ÇLUíÀbr<ÓØ{Ç—Ûu "e*2+fU)Å¢ó%gÓâ9Ä€ìI ‹€AÁl9e54)‚jä]ôÑw^ò¤iâÃ4$é¾úêY³½òZÎ+ï¦4O3§"à 3åtœÆ‘Œ=rDb(&fÆx6~:Bà,RÔÍ#8Z4_%„ÀšHSÉŠ\ËR—G V¥®MTÕ ÔÞ'U4 Cu¨5N*†…LꋈY™ •j9»˜ z$&P(fÙ¬ÈÒ~à¼c^ÇÎwëØ´Í\ÂÏî׿ج./7ÍóK&—¥ä”´$‹ÁÑñtJSЋí*F߬@WŠLÓh*ÌKç ¼s`6Ž“Hé§œRQ1™$缟æ¼|4ËM×eác_ØÉ”$+:ÁÖ"bjÀV˺s/n6×Û–1ƒÍm„uKlI3ïÚ.ŠäyT5}?Ž35k 6ƒíŽùÇÛ<ȹãi8öÓ\¸52Cb2¬õµåéœéµ'æž…Y[,>Ní©Åò Ü$¶@4kÈ•ñ×yŽ ÆQ3\ê–íyõÁ«€ ‘!(Ħõ!ŽÉþëþpžûÝýÝÞûn}‰ìc»‚¦iˆP‹˜Õü«ùJ$"Oäëªêì|_2»g¬ šVs#·eÆãƒË ~±åóYä†Åe¦E ¦¢³¤¬*âÀPMËÓ©Ï$<“ž€)Õ%ƒ ìËü f¢P”yŸ$ÿ×ùøþã?üÍ_|uqµ{÷ññ—··i>¹À‡£¦$ˆL† ‚ ª€‹·ØÄê.'¤’™°m=ÍóœR2%¨«‘§‘U£žg\:ÝÏßœÙ/_ìAOÏô/|D<ƒ¼ °ÞçhDˆR“g«8ZEÌ8 ª¼|ï™™¤ÌšŠ#hZ1ˆò0¦i´”,ßåÃðèÙJð|û8i:užß¬ºOåÐOû¬I¡¨NÞQ×®ÝÓ4ÌR š¦õ1 +;å Þ HÂ쉺nvxœgH¥Ó¥Ï•Æ~Ͳ² ù]¦&›¨$QðcY¶_.'!q_Ý\üðúõ_ÿÙïo®®²H)€S¶a„÷ïÿøÿ¾ùåý#’säŽ'‘Dª$€ÇêÌ4ÆfqÌ®Xk J::°„ˆÙ»Z²D@cC@Ë ©ñ»QaBÊÎ ¨öˆ¦jSÃ)QšPfE·ÄÅëð³”{Õ·µ-2}|­®‡ž‚ÿ_ÒïTm󿲿ˆ™òÒ¥»xêŸ:ÃëÍI†D€\¥&« «úï"¢;ÇLÑ-µé†Oíñ‹¢ˆ¨jRl)ô ÈAŠ™•…HÌ"¢G`]ܦfF†J»°½ð £û¥²dù~kºk+àYxª@YVõX[ÝUõPD‹¶~xú„è…%w¾Äl–º_Ñ"šË×/¶¿ÿí«ËM{:?|¼ÝívMC¯¿ýê‡~øÍ×/ß¿y÷Ïq}áÑo8l}³‰± >êêâêÅwëò’›–ÃÊ%Ïe>NóžÔ‚oÉxêQKÚlóœŽs<yÊz˜‡IÚ€«Î·m Fµêw_R"˦Ĭ®PêÄ\cThÎ!19ˆÎ» Dð3:瀑C0RlÚÎ4LƒíûÝ e”@m×nNóœÓ1ßµá~P)BD¬b`)㿾Jyó/oÛß|½zþê«àáát@h&½?M÷wyÞ1Î/n6—×±]EŒ„0—¹R«ÀÔ„‘bãºÎÐÍ£˜vžo^l·¹¤4JÓ\¦1å Ó RT1@h Ì s}·Ù¬ú“N}™'‡Ò¸tûXp»KnE\ÍçF Î̈‘Ö‹/Ú‹Ë`Y.!8ÇDLŽ™‰¹†U#ÇF&ÂÎ]>»ð!3"tmðÎ¥”¦‰©¢©E“›Áùض«&6È,¦×DF]žfsìÙ9w°}Ê'DôÞÑ™D±½¾ñy“ç4Ãét: ý¨†]q}‡qƒéùsÿìù;l¢k£¿¼¸X­cŒÌbôã4O§ã©?ž†ãiØíO÷÷*éë—7¿ýö•[3"9Ç!r¼Ùl.6Û髯±ä<Ÿ?}zûË»ñþaêGt±Ùt«)çcÊ’‰Õ9UQ)’LÙHM)x¤* fàW—+þÔ«úêæù¿ùoþæ·¿û6 TØÊt8~|ûó›7?~¼ý:çclBðL&jý˜§YÆqš¦Sðps9×ìÃa(%!@âªk½§ÇÇýáxƒ6ÆËí¦ic1=œúa×ë•ó®¤ò§÷oß}¸ç„9çižE1egÍ åöþøãOï™ùÙõå<çiè_}õlsñìöî¸ÛŸÆiô!t«H¡éGéûœÄ’S3 Ûáxº½Û½~ýjžÓ~¿Ûíúèš®íùáñ˜Eú!íS?öMƒ×Ôd…¹@Jö󻇱?^miÕÅ¢øø08‚6ªˆ¡³ŠçZdÞja¯Khzʽ½¯†Nž,ðÔ+¢*•â‚O…ö¥ Ç@̪ŒÎ`šbµÁ“÷Fü¸ëoïÆI‘€Ø¡ ¦øË4?óiìmAÅ›¿¸k–r&ÅŸWÿig•Cl Z³­YÑÌ‘@©¨(g¨vÂåd$ ¢„kׂ΢¥ˆ"°VÄ!H}ÃceÅÔY§Fq©úàê`jdg:¸Ù„ v.`[ÀçA~úù¾?=¾ùùâûooØwŸï†û»½wÖ!ÏIK®Å~ÆçT5.áës¿ TŒˆ€e“LDÑ9çÀD¤d1$0^¾;û àiÁs¶`œ íµ*xq-C?žË–ßò÷èb}®I#rŽXÁAÐ. 'ªVBqT6­‘}ÇyÓx#gªi1JJ'ePÇÈl9Kš1:Û yÛôZní¹ ê‚Ô:dƒ±Ø˜ÅŠ¢Š5sÈ}4!G®Ú;Fvæ¢Ç±ÍÉLj`Õ›‰Z2b& F¤¬Ü¶Rh´y„\ØŒxfoh1Í0O×Û›¿ûë¿üŸÿîï~ÿ›o7ë!ÆÖ;OsÉÇ^þé_>åùaÿð~Êìi“3ìS­˜R ˜Ê¦ lå} 0%ƒ\ÌL³7iÈÑ+ZÉL2£"‚ Tµ¹LGó§v5A3f@”‹#h‹ú™Ú6Z7 aìwkiºuëœù4eNq³b¢¢£!vè:äF•Ñ tP™«S¥^xTGFSTïhØ£J?•Òr>Í÷ŸŽŸ?ÏG$´Š/6—˜†ñþCØÍ#n×ÛKzïñæª}q³þ°›3@×­< Ì9 røûMÿøãý¿ÿw_ÿïÿË‹Iß}ú|Ñݬ›ïçÇۇǷšËæ"èóµëB·AÀ¹Ÿ‡Y‰’H?Œ“`sé·äTH’© YVœÚ6®×Ž @íððn7õ¥ˆÀ ÚÙ6]Û$õÓPD4—’´<œ ÁŠ‚g €BT‹„†DD‰€h–xɶœïŽÚ4"ˆ@Äž\ð²BÄè·M›H̪ê___<»¾jB˜ç4 “™žú‘˜™ª§S)# ®ÖWW×ä]ìØÅU“ša–$b|ЮM‚g£_1É¥x5+ÆŒ1f,šͤ”9c9eÎnKÐHV+§M믶m»jC MŒm۬׾¾%礟>ïÞøxwÿÐããþt{Øí«6ÄØ^_ZfÇàChÚvµîÖ«uÛmÉ1õ§c"ÿy,Ÿï¦q¸ºØ¾zýõ÷¿ûbüñ?þøã¦Ô{Ì "bÐx€hZê‹ZK ·´ZÓ&^úðýo_ýûÿéoþú/¿Ž ¨õ‡Ó›Ÿžùnm_E‡"M›úòf‚à¤!,ÊSæ1ƒHY­üï¾Û¾¼Y¿}›ûÀè¼wVÓb³RÊÄ̆•ø™P• V&€€˜eä… ¸¬QAhаJà‹hd&bOÝö„F´”`‚+Õߣb`V_*X׫€ ã”ÄSf-’ói’qæèdv0&Ûç1=f-LøâÙå‹g›èét:=;ÏÌŽœªÙþxüðñvÒÍõ5ýøã›?üáw½‹ ±+ÓlãTŠ ’îNò_þùÓ~?~óêæâ¢‹Á½þúÅþ˜÷ûÓçS?Ï|uãV«às–2OXÀœ¢CôˆF ŽižÓ‡OËçS(8û¹ï³w±Çñöî¾ç¬X£ ¯¿y¦jwÇ»Çqu—`§Ã‘WÝd ÓTœACs6ˆ¦¬FlP…ð Ëj„µ¬ëìÖE@sgIÿ‹{ê ˹á×ü»'†-å–T_ŸTõ³„§õµJRrJiÆi†¢ 3 ŽÉÞ}Ü?<>8Ï©8ržq™HÙ€ÌÀH©bËáܹY%5¬j7’ Z6Kjä ‚˜OÙüSÚ¢ž_ÿÕÌNÈlÊÅÔÄTÉê>‰ÎbûY$Ã_ÍÔKSØym‚OBû™$ª€V¸½ªaAËTŠS‰fÁÔ)(s‰A0d$A&“‡a œ AhUbξx¯®%§á$˜¦Äœ»VÙQÉâri¤Ä…|kjt‹ÿ«‹§Ýϸ[C3dD>ÃÚ–ä . ßË~¸ºd±–Å׳oÕ ù©ž¦á¥ƒù©ÓZÏ 5[‚í ¨R¥é3gˆÎp=— 85£úYþ×\\†O6§*ΟO‹e ϾŸ'êù¶YHXxn)®òp¶„§[Øâž©ºs],m{ÕWk… 7TºP®/Üïxác‚ §ûþñù¸»ý9íß¿ùñÓçOänf‘GP3ãb^A­ˆjB™Ó<¤þT†£È4é ÑÍ9MóìÚ¶qM³ ÁÐÇ Ú6>4‘A—{_Q‹‚ñ‚6ÐZ«Õ©~;Ä­±4ª$EÖj`#0F(¼@É’ÙR$óœ™gö¼ÞlûÓOx÷ËÇ7¯ÿâùoÿê7Ï_^B(³© dU”DL׿WFÁÒ΋"PÀ¬sw¼y¶ŠWÝT´$1S¤d¬YJ±2ƒëØ{"Ԕ͈¼ׂë˜Õ—d9B‰Î3yUFp¦%cF‚õ)Di#;ça–ywº{8<çͺ›‹µíf{ùÕîóûÃ0s/†äèâfå×›¾ ë¿ùa{œî?Ÿhsµîb8øÓñX’ψ§1ÿñýð§÷§«•Ûõ­÷W/®^Fhò°Ÿó€ÀÞwÎ;¦Itût™ýª¨»=øÑüÊuC¤¶h D€*YuðÜ;ÐYuFDÇlªED€²w²nðjuÑ„˜öý4Ÿ “µ÷§üánüéS¹È|ôD„Vw¡ê&µ;ì¬ ÁYªRüB˜^RA¦ ¢ÀCèV+8¢®k×ëUl[bŠ‘¯/×ϯ/›ÐÌsÞûãIT²–¢š’Nýqè‰dîÇ4LÓéz{uÅÑçR$Kžs’’ŠŒ)MÓIK‘BÄ€0ÎCJ3jqÑ13ëµFâHic;5e?ôû±$.e§qìO×›æë¯®®.×ÛMç]pìcÁqÉ2Íépì?~ºûùç_öû;gªÞÑåv}}¹¹Ø¬µÈñ8ñÒ ¿[uͳçÏ7›+\VHŠšf½ m䃭Öíëo¿ùË¿ýÛîâ*l6ûÇO?ÿëXGËàÄä‚Rp*%«Õ"ÆÈ¢–²FO›ËõÅÕÅo¾}öüª ny¶:‹ËÍw¿ÿaH÷Yç7oO§á”æ!K&À‚–h nå›P“incª¦è»o^´«›Ë«&Íý›·ŸÞ¾ßM36b‹T*_ÁUF¢ÎªYÁ!E«žÅ_÷§â2D=ÕLÍL«\ÀñRUŸà¸4¥ØÙ•lf’C„g×ktôùþ±ï§¾O @}t>´„à˜¢ ä˜HOýÉ%ç½ «¶mÛØ6š'm›¶iZ)ÉTrJYåöv÷áÃÿGÕ{ýJ’di~G˜™Ëˆ¸*eeUWUszz3àr¸ûÀAþí\X»Žì™î®.™òêP.ÌìœÃó¸Ùò!‘È@ܸn~Ä÷ý¾kϼêW»]úñ—‡Ÿßï³õk¬kD$và=²v j•d»{œw»Ow÷‡o¿yýúÕEšçwï>g„ IDATÝí§(mS5! Ù8Œã0gaEV`&PÍ9‹jB²f?Ú4ÎMÂU³Þl é0Îûý0 “!ï..ÏŸ]åD™yΘÄg'F*’˜ 2‚7ôf¨ B¥ò+ƒ'“Bx(z˜"ê(*nG %„>#ì  ;û—ü’.µ »ŒÁŸÒÜ  ëiÔæ‚§* ©CrK.¬ZÊyÚ'DsL䘨»¢Eœˆ‚ôÁ±8C$äH.Sqþ™±ÓÉëi ö½ðżI™VrPU„ĈĖUËYvRÆ+ *¡8-Ü{$,ÉRåËþ$Zú‚…&Fh™(3fi+Ú´ýº÷ªaSÉ^§4 ñîn'-“1ƒ×ÚÆ€¡+‹0-ݲÔCEód`FV¦åË”ÒÍ/.5—³¢ûçÓ”–©•­­èÉ™iH†jÉz§&3hé –É,z'æö£Â$¢ŒxN*‡b7r€L¨ÅSl'@ ©grÌ&giæépTsšõ9Tͼ 5²«ý#Åб«ˆALE'š ¥;Mƒ1a=jgÎùµA· Pš ,#ÆR—8ç+"‚4¹4Ðp<:¯uÇ.0“y0ç1Ÿµ›7/Þ|ñü‹¶î²Î5pAŒ€Äøürý¿üÇß:‚ÿþúã÷㔲auZ ±L’GO†Q8ö›9¬F…µšëÝ}ŸŽ5NhG€Ù1Ô•9Îf‚>4˜& æÄãÔ›]ªµ1fÄ|ö:Oœ)†úx~ûö˜e:ŽÍöp>Œ+ÑÚ´LÙU‘yBÍ––ôd{ d@§Àeí‹VùfK\àR!ãrËS9ãN8\}ºm œ/ôý¢¯) í2&_øomºÕUÉ9EgJL¸®}ãÐÈyB,´æ HŠj¦OB%SQÕ²f “=Ú5–Ì$#IT3$0)€! dÑù•Rf°ªsÀëLqÊÛíMšß0¼ì£±S#P UH‰—_ƒ¿n pE²`F Ù«4cvT‡¾­¼TU4îæã{ƒ­RtžªÍ*´k#3‹šMÅ«UH-¡ÔŒ>;œ ˜Gp(ªSœRÊTy"2¿ö5vÄNÆœó!>|ÊÇbجž­fÞo‡ 1Nñn7?Žêªº_;uËÚ<<€˜ÿ«_=£ý·ÿ%&vÍ‹ºYOc¤)V ¡åíþð»ï>þæë/«ðFRmŠ«u ‡Ú7uˆMAçˆãmRÚÎýL}ûø k‰›;Ê(S…sP%¡,zSœ!N6O`@àй´ªÓEß´uˆ‘8Pcå Úåwºù§·7im„Œ ½šG$QK†Š´À½JMIÑ"ß(b¹53 Ç>çÐum{¶^­Wm¨}ÛÖggëÍzíØ¥”š®núæ8™É{f°œâ~·gRˆiÞ»íaê®Íã<1p]µ¾)ÏEçY%›f"2Kš§i†ìœ±4Ù`šSŠÑ#nº~Ó_¸.èónÜOÛÝÝv7ÄÓœ’Úýn¿nÃóËc~‘šð¬~ãÍíÃaàââÌy—³´fëUG„}WoV 1:0˜†ñ¸¿ß Ž/ΟuMSôåu]o.ÎV›~ØWMW÷›•óUÎV…öÙù‹Ý‡›ãî‘ØÐ;âàÁ£™¨ˆaHfŠªcžEbß„—/ή^\¾¸Ú@—Q^U®×«¿øö·]è׫OŸ®o?½Í¢€è 0fá$äÄ{ì©0äû‡ýq ùòÍó¿ý›¿üë¿ú*¦ñ¿ü—¿ÿ?þ¯~Üçd:Nƒ.RPâÜÖ¾ ”cÆÙ˜ÔÑ1¥Er½d×ݳê)mÌŠMœ 8^N™ÓJ©)L¬$…EƒˆÌì gQÏ.xªC誚ÀÔ9X­BUyE0&Xw~³j™ùxH жͪkrÂB=ìLJÇãpŒm¶‡_Þí|¿ßÏÁÐOÉ#jpJ ]C]×4WMsÊè÷i{˜“UÛ(0ÇÞí>ÜÍ‘@eòãƒ&'ŒÜRt™‘(R6º¹ßýë¿ý~U§—ÏÏêºuÁÝÜïû½#|yµYõu¿j»uï<¢œUŽëÛ›‡qL’³Áœª—’‡ŽUTUÀ„PiYò+Z02pŒ'€‚ª#P³ ÀT¬TºÈô%|ºò§±¨+.À0C ÀPrïÔ꺮ëZm烌€Œ‘ŒÈ“V¦ &ÅY^;™PKéà X 5vqל°…¦jB,U@GnN0ÎY”€œ.Ë#<%ÁjaÚ—*WU­8O ÈT¤h*‚Ä¢¼/3M4£Âý¡erið9äúd‚8‘“JsÒ”¤Tp.4m_µ­Žã,YDlœÆÝ~:¦V#Õ¥}*mð¢×7)[B@ [èÿ„® #¹ð‰` 0à Ÿ &´Q–héÿpa#ž&šXˆ°…_^Š=åDÑRï‚iš§…ƒd‹!cM Q ¼ Bð õœU Nì0Q‹¨™œs¢–’˜&種j¢~ò8…L$g ã>øà×u¥1fF Žš ž¢aÎ"àÙÕŒX¹6h3%Ëà 9¦ºª]ÃX<Ö–³hÌj™™™MQ¢Å‰ CSǎвJÊ ¸^wÏÏžýÕïh»Û%™ òuíƒcbç9„ðêÕó¿úm¼ßwÛáîqŒÑÙ°Fr¥éV@ Î ‡1%•ìœ7t„ìˆ,`¬v3‚²%„¤“˜‹jT¦õ^Ì¡s2‡*[ jTtL‘£g `ˆà ! ˜/m±•:¾Ì½‰É9¥œ‹ËƒÁLK¢õéêëÉþ¿|Š"Çe/ÄP6¶`ù4 ÀEü´>Â''9žr~‹Ö®ØÉè4/XdOK¤ÆìÿöRv/–´Åy¶8öŸý'ðÁòÍÇ%ì”kpêÏ›®àÉ!ON¦§îfˆ.‡‡t¢¡‘WÕŒ©ìLq ¼ÑÅPlK⛦íû>iõ/ÿþáÇw÷}ÎÖݪmŸ¿xcˆÇiLé>i8NºÛ‡ýqŽUÁ°|K"h´<€ "dICŽû˜'CsÞØ²sqÕñÅE¿^Õì -€zg†lXT–†…ç Vô_E~Y~’Ds6Çìƒ[ö» À-8‰UPArŒyŠ €MÔYiΦ@9ÌfÊüp{mg¥`ÁšM]yÔ ƒ—4Nó¶êÝ«MþêBÞÝ_Ï÷cŒÎ$2劅œå˜ß½»»\_|ýòØq8Ž]M]ÏݪÝÔ¾ë2 ©KªF $9ï pÕõmH¡™ÚºöjÇûA%6A뎽gœ0OrÜÆí~LITÔ;¨ƒJ'8î·Óaô‡Ø s3N~JôãÛÝ¿þôðóí8â œ9¤ÓCŽNÑy¢ …ÑñÉ=fZ2F`Q9v„ÌËa’4§«àÐ;¸m«¾oº®ª*ß÷ݪëëºAv*_·õqè5çº 5JžÑ´©|qÙÇCJ1¦iš†à‘cO¨•g>gŒ`šU£€HžÓncJU; †\ùÐTõjsÚ‹#Üálq{Ø?>îsT&g»¹ÙÝÝåÊÁÍÍþqÅàµX¦QUÚ¶ ¡zøt}—²Õuï tˆ}EšR’1eEÔ”2²«êZed•Ï@ÌÀ~Nz}}ôr!Æx¾9ùú«÷FÇá`Y=‘YNVΓج,%™ÅrÓ†gWç¯^>»¼Ø„P0¨©šŸ=«|7Æþìü“óï`Œ¦‚ ÅÜæ ¬ëê×/Κºòž}pUå‚£/^m¾ýÕÕ·ß¾§ùå«÷çg¿(Ž1aÊY%é³eõU¸Ü4罓9M3(Õ‡H·Yf+„ ebÀO´9@§@†„È€Š¢( 1‚€I,,ý¥áI™½é4 0ŬbÌ~µ^µM4‡@mãÎ6ÍÅźmz=ìwq/ÎWçg=Š 3¡sì}—EwÃt{·;fvMzûîá»n÷#{fÇ"¢IMò¼^·_ÿêå7¿zAöûýÍÝñí‡í‡OÃ?^ß{@8Œ(Š}Ú¶ÉÛáp„Œ5°#4²d¦EÙ®j³ÊüáÃèàá7ß¾øæ«}[³L³ûš7íë—W/ž]ÔuH’‡qèju~öæ ½|{ûûïÞ¾¿ÞOISʈŽÈ! ‰$µˆ`žÔLÌJ2,Pžåó"²9Õñà »H T4¡9C_æÊ‚§]A© @‹z((zD&Ód–²XJæƒCòH ( èà BO'Ê“!b05ƒÜT¹ šSŒ3)v •˜ä‚Ã't€h¨ª–ÙÄ6•C8‹XFc°Ï# +2\Ä2üUTQQ2$Q,ô?@K#‘ ™š2XdR*Ó\Â"ZFæú¤X\Ê‹=z‘D/ùMCt·[ÚMI Å”5(dÁ”9DgF ©T@Å1SDöDHÌ`Œ ê™Ñ/"XDË…áaOÔÒSWgZô @ ôϘ>'­Ä©½¨˜EKÜébü%d4Œs©J›•^Éä"2 Qé Ê Å +‚ e&­ƒÕŒŽIS¶ÁÔ!hÎ#¢µ5}óæË_¿Ù\ž…YâÃþ0Í1Ž zV!ªE§¥ïªMÛWu…v£^^]¾ùâõåÅåãöðOÿüïúå‡y?ú*h¨©ˆ gɪ>”sÑ<ì¦Ñ¢šù¦:??ûú«7_ÿêÕªó“QÎNÔ#“Cƒ ”ÓÉŽ !MüpWíw©¤Ä1¦ÀŒ€Df(3"£*#’ ®€&„öôÝ6`D‡´Èz–NÒN†],î˜ ¦`Á!žXÙ§-µ¶}ÖÕèiÄNŸeöxÊ‹'F¬ y– ¸@q±ý)°N ž@CÀ…ÃIŸ]ËöÄÂ-ae‹W§¬Mé„ó±'æ- éI*„ªhRºq*¨.<Ù‚ìôÓ Z$K  §ç˜ÌŒŠéQÑ ïvóa¾Ï?~šÓD ›u÷âòìj³ªë*ªî¶?þòqž_„,IMس LŒ¦’ã”ã@€0Åãx¼Ÿ‡Ç ™›Pרplj9¿¬6›†ƒ”´r•<ç4"»’ÚĆ*¤¢yÎRNû¥ÈÙrVÁlê*vž‰ØQUލˆ1B`ƒŒ)éœa$?ºqÀ»û}ŽRq-ÑÁ„Ã0PïV›Ë¯þ‡çP¥DÞÖÀl®ˆÕ²j¤¹³ ,i<êt$´Ö»ÖpŽyŽIÉ÷¡¹päpšÐÑtȆxî«úuºÅùúýxØÆ|c€ëaU#9QœÆQu¾éê87Ñ|¡F*ˆiš§ñ¸?ÎIªª+ŠypÀ.;ÊI¦œA¨Z!\ ºjj®÷wwq±[ù*ÌS2;ߌ;ùðþîñqö¡‰ñÐÿßþîë»üÃ?ÿoï£;oú3É9N³¤ðø0ÿøÓÏk=^§ý‘ÀêªéW.9?êh€’J«™A†ÍʯŸ7Éû9¸öþzþñ§1˳çë5Õ1Áá0wñ0¦(jd)ë8`24vs…FÓ爫í(¿ÿéæûrHÝý^nÞBX©DDJ…¿0 ijz2ZÀÎK,-îN²BbBfd,z63 >TuS‡*°óijÈ!“jÑë9*ˆ¢²d󬼄\$^E<“-Þõjt²Ñ "#0äûÒìUžuf-‹ª9Ï $šKHp‘ì”RË$zb‡.±‚§Šü´ÿÂ¥i^D7§ò¡ü{™­ŸRÙ–ÞsY+=$ ˆsÀ‰À „¨'9¾iñî !–ÔŽ%x¸8aÌWÂú°§$½§¼³“áiqÀ—Þ©ÄÖ”/ñв$äðSpÄi£-’µmpÕV˜D硌ì4OÉf3p€5bmFÇ1ãHDóœSVuîø}¸î¼Öµ÷Um’¶7×^󪫺 =dâP,Ï)q$Gg¨9ï¯Çû|ÅB‡rÒÙÊ÷] œ4¢f%B±ñ0v@ØtT•—TE“¬2LˆXr|ãœcR ŠÈI’84aÓÔM¨½!fgĨ†Cb±ãlû s¨}¿ƒxw7÷Ãy•ãéÔ÷«º›ïª¼ì”01#!‰f!ò¤YŠ—[4ÏiR€Š¹e×™Œcç‰\fïWÎu8Ôœd´xmß6g‚™âD* Šiž‡©’º‹ÜÍ¢ZyE‰PAŒìM“¡¶rô ÌUU·ÄXÎ1BV m@Õ4C¨Vo¦‡ü8n«q—¦c„„>1pHj9Ë<÷·š¸nÛ1Ž óWßþúoþúµÄãþ°ËZùp„11µq²·ïn_\᯿ü¦ªÂîú€êÚîÌ8ÆC ÉyÑ š” \ݬÎûg/×®s  Çùf{3^rmSÓlï‡ÇÛã^ÐÕýÙ93\?ÜÝ|ï “™É~¿Ó4_®\%ùæö㻾«»U×6yûxóþûÃ~@¡q–O1çœ7çgÎû¦ï꾿|þ¢nª÷ïðÝûû!¸ÊaåÈ 6¡áªnûÕz݇€ót8ìî§¾Zu͉XH‹ða2² Þ²ˆ™‚¢^^¬þçÿðë/^UuµZoBhbm»p¶îW}‡¦oß¾ÿ?ÿë?ý·øÓ‡›ãÉ€µ®ÝzÝ?¿Xíº~»]…¹qcJ[?5DkÅÕ7ÜÝæ³ŒA$Kv@ªhÃh髾¶7ÏÛçWm8‰ìcœÅûÚ˜Ã|<ÎÇ!MsB‚ÚÓªõ}ã™=@®kðÎuµ[5p¾æ‹Ëõ³g›¯¿|ñ·õíååùíýîîþ÷÷×fxõÅóó³õá¸ßívˆÜ6­ˆ>Ü>Þo>ÝÞÝ?Š“W¨îæ_> ÃÌuˆRp†@1Q‰%:Ï᦯®Î›<…é¼Þ¬7ýzó¸?ÝbbË9ÇKúËéiBX4¥f`)§„€›®zýüêÅóêõËþêbÓ4]ÎÀW—çëÕÚæÇy¾{Ø>n<ó«—Ï×ëÎ,;ÕîùeÓ5ðÀ‰—0 ÎØ"°CÏj"bº0;Šžj!puHSƒlÅqŠì JÚ…éXö0e7Š'ÌÍ2P3ËžfG±€¦2•§a© Aˆ«én7g͆•A e{€ú%?Ä Õ–I¢$‰³eqjN Síµ fFc´˜U—¾’@‰UaJ0fÌàýR|Ÿÿˆˆ…s²lì1 *9µL`²0ðyAÜ:#gÈŠd'žø(E;…O ¶§RŸâ·Êu±k 3Xæm ‘ˆuFÉ2 "90wú”lD†ZŸÐ ¼/û²“.‚í„ë,«3ÐÂç7@[š2zŠç.uýÂ`C*>D1(8bz2=[ihÌÔÊA_0‹‹ 9þ9©”]X¢Ì!ÖÁº»ÏÖÜwÞ$cbP32€àa†Ï.Û/__¼ùâyS»a†U;6UÜBÞï÷ižAÉø»-ÏÃLylׯûußT5O1LºÞÔg+;ZSTÒ¼Ò"TèØ4CV àœ8Eµ\Ìã]Û¶Ý…£Õ~'w7‡¯^SºÀl’RÄyŽÓœ‰ òœçiŽs¬«pq±©|ûã¿üñûŸd¿÷„ª-¨²–¢EÜedT‚ã´è0–bTŒH¡’!©¡*:@^jrÓE—µhS”ˆ‘ËÕW556`\¶ñ´\ù’ô[n -xb^H8’ÍÀ€í‰”S45§©úŸr.mÙ3!¢©+Ç ‘Ù2Ä3®à§´¤þêÒÒ“/½d‰±ŒwQq©‚œxÆhO,0•%€[xaìœþ›r í Rü9„øi3 KVœœ¼º¬5 ÞÄ@ÊÆÔ a‘>SQ>hÙ¥¡dÓ‰ ÷®~¾iZœU㔽ÄuÀªï&±ÝQU‘©1PD ¤JÇ9¦y¬æX7Ú®*¿âæê¬Ù´äÒ!mለ\ ÇažMYæýã|÷‡Ûε#‡Ö之¹I-EnÙvJÔícÚ>r8 ³ ¢CEˆŽ&ÔŒ9€z¢L |2ïrJqšQ•›¦Z­ØûÅ:"¦ª™PP3H^@±ÀDu *à1{ñ0õÝüìժߌQFÊs0ÂŒ€œd3( gdB@UE A¤‘œÁk˜rž’i:$Ô®ëžõÇ–IÙÅÙ¼§ÍÕYךfæí4èA+Ç•k›PW•#U1D,@ôÄÈÖÔŽ©G®CÕú”²DLÊ Ñ;ð\AÕ kýÃx;>ÜŽiBv½ ’˜C)–VàS,’ÌsÅã[ô?'˜I9ñ+ZhIz*‰Ñ‘‹f q®!)i"›‚›C6N¹LYt ðeB,aahè ‹ý Ñ"á‚wÅ…Ýo'Öa©ÎÊ)3 bJ ª)¢Ñ¢ö?mð«ŵ"ÀRw¢ÒÉ<°ôO$ˆÙSú"°if´¶âËMh¬j"✠(©&‰HÜ4¡oêW›ºr÷÷»˜æwïï¶Ó˜†Awó~ĎІÑ>ÄìaîjýjÕ­/.ûu›âðñã»çižŽól΃oÑUNÍ™ç ‰£ª˜"”{Á g4ÍÙ4{ïª*¨wU6•ïæ£¾{¼íBûÍ7¿þͯ¿|#LÇ9¡é<Ï‹ëq:ŽûÓ¨:‘ÜvÕùY êªà“D&‡  #—µŸÈ VµF‹¹ááZ1²ÃR<Ÿd\„€r¬ëÉðbBdd`ÅÀþ,[zQBÉ„R,÷‡ˆ‚ÃS>ZÉy(Môòm*‹´,µdü,I2EÄ\2& ñdö}JxÒª/Ûj:=¶ìCh˾®€8?‡IC¡Á©å-?—-à0<½ºüžìðgÁç7Z'3@Yë’Η{§Xü 4L±([ÌÓbDÀf‚ÈeHÇ»cÝZÕ8AæQ¦¹jë—燜Ó㜅˜œ£Âžˆà*–: ¯ê¶ftÝÆéº÷¦¸½ûkãZȹºv>¤q·w2Ü7y¿®Óyã«ÖœÅâc„ý^’jD’l˜d»§qrD˜€§¸ÈÀRÒqÄ!;2ŠHŽqɲ‚YTônÑ”æ”ãl0;¯¬Šc¢N’UÞ|yqh¤jëÛÖ¯ÚÕsçëIjD†2.°9kÊ",b¢*ÊŠÄ¢` >¨«¬‰sdJaÊ à«RÎÇyO#ºÆ;Ç5S’qÌÑ)5ìêUŠù°vQ ³° ®Bݵ›¾udsÌó£2e@]z¼FÍ)¹j½á`2ïMW=ùЧÝ·ÈG¬B¨7Û#ìoSBçHUÑKW»öÕæ8ù7’3Kªîn‡úü+þì¯mÿp 8z2Sq¾êºg‡éñ÷ßÝ]öW/Ï.¤à•@Õ™yŠiΉö»É¸{h]|Ñun’¶©¾xuÖ^ôëUŽÊU뻚ÜÊ…î0*]ù¶žÔ=h{÷)ß\_“]sx½“ë=ÖëK5-‡Cy¾œôÁK>ÞRç/J¹rá2‚eµg'[¾>‰AbTƒ¤hì0xŽ}Ž98çØ@ÊyJiމú¶Yum(xF¤Ýn»ßí±ªjdO\lÎ×®õbZ"–ÊdÙWä¼¶=¨€¤ÍÙù°|¼¹yØÃíÃþ§w»··Óýv’¤—gíë›ÍªA¤Ç},Ovf…ã%ìÔD÷»iÿ8ä¤b¬ì9tmkëÖu7“˜âÙÅÙùù†cŒâP¦Ýã|¼kx^­ZF{ܯ·ƒiÓy‡Ç3…ª-úëÛ[D ¾zöÅ›/^¿jÚúîñAÌ-󬚮^m(„¦ëÖ«þâlÝTµd™cÌ9ƒ)¶ü-ÆE äá‡CR^q€f…/^½xþâªï뺮÷Cþþþï'ÙnoŸ½}÷Éùp}óø‡?¼}ûá@¼jBì@³¦ã ÇšrÝÖd%ÞJ<0"SI )ßY³e$'HÙQ®=õµïªº®É×™Î7Ý_|óêo~û«W/ÎbJØædÇÃø¸Ýh`0ê9£óÎÕUPµãq'5dç©_·ßþúË¿ùë¯^<[¯û•d{ûöúݧ»1iNvuy‚Iûý˜’x_‰ØõíýíýãíÝn·Ÿâ,ª@ ªSÎê}¨QÑrÊIªš¥,ˆPU¬ª?ÿòñ°ßå4><Üâ—¿JÝêò8ŒeZŠ(¬êÇ9͇¾«š¦Îw‡}NsƒTy#@ZõüúõÙ‹g-XLIçy~ÿáz˜æëO·óÛ¯þò/¾f~yûé§Ÿ>n·CðÕÝý#¢´oÚVÍ?»<ÿòÕ‚»}dz°G(x§YE`Ž&@Ì ”ïô,¤“+ŽHN}sˆº âŸîü‚ !!"‘ ¦Ž°oêõº Þù™ëL¢4Î9 EŽh†s44¨ØyÄ`ÄOìÌ'hXA|.”™e\Ϫ!g5ôÀ® ìÕ4嬪ŽbàBŒEÇH–r3Bd§KBQ‰{=½e)— ¸’!¨!) ái;HH奊ÀFlJ'žÿg ‘j1¹àg^ègè‰.¾POŠWB?g³ÙÉ\ÄY–Pçàrß8çy˜,'P+ V-æä"¬/3ïÿ_õvªaÔ.C<¾¡-» £¥]°? E*¸!°D–±’€‹\ÿÌ4Y¾0KüW‹.ï`ËÔás&rùeŸ2æ€ÔP‹i ŒÄÜœlNj¦šÔÄX”<ÇÈŒ}W­VmSׇÇû?|º¹½¹{< 2Lx¿û2¬ È&yâX¼\õ/Þ|ù«_¿¸< ÁA]Õb8Lù8æÃ »ƒIEó1;5vNætõ™¯*EPÍyŽ»¨yÌ»¶éú¶Ç‡íöaK^þâý×_|uµ>ß|ºÝíRVµ è +¥tSóÃí§›Çû»;ïܪ¯‰C¶ÉK.Ú60ŘÁJÔF0ô€&§)Ÿ†æ¶Ä”Ê‚t*Ü'¿íS&-˜-KŸ殀%”qÙI=½¤øÃÉ'+¨ U¡" Ó4ÇŒfdŸ \v*ûKMð9w¹ö'[<"¨,ýýŸågœdZ²EÿºÔËÍSþRèâðyWX µVx›‹Ç§4ÛÊ¥§`‚Sh`áò/°Û?6žòí-Û©‡(RŸr€,á¸ÈŠ%|^ƒ dÐ̈ ”æáqRJóÃQ¦ Õî ÑÄÓ»4¯˜×›õ¹÷TWT­Øw1=·j&Ï·}xا˜ F•qC‘O‘5pŠÊÃe¯K˜‰ • À§£`‰—D*:ÓBãEdZxx%Œ;Ççù¸·cëçU-]ÍuU… ª»Ýn¿? ãdfUUðU]­ú®™Ž»ÝÝ'È‰Ø ’sUÓtU¨«P…œcsŽôž– *åzÆëûû··Ÿ>ÜíŽéf/É*çÉ ^.//¾x}u¾iD²ÂÃõ­HNÎ3ÁbÌ0eMQÌ ÀÕª»†^½¾úê‹‹à)f-ÕÅpÜÇ4x6œKÊM¨CÕ'¬nŽ?z`'jMëÄëºn»¶©C`r„UÓ^]<{óåWÏŸ?ÆW_~ÍUkI$Åg3#_sHœóŽ©ø,ØûàDóçà9÷g‡$I¿üòñæú!E +ß®ê³s—•þôãÍÛ_²|ºÝÿ×ÿç_¾ûþ‘»ßŽˆ*†ûCÞîr–@®¢¢j²’ìÛÃßïÖMZ5±ibNQКÚG©o÷n7г‰ppD˜E‰=Öuµjð¼ /.VÏ.×m_!c×Õ/žŸuMÛ¦ýáqw÷ðpÃþ0Æ9eñÌWçͳ‹™©Ý?<þ4}Œó]ª¦_õgg›U×òá8]ßîÿíß¼¹½ïúöêââìlc*Ó<Ï1‹PLº?ìïwûã”’“SY¢Zçd)™™€*ArdU $$‡Àä áý§‡ŸÕ¨-»éº_ÛýÁÎC– Ú˜âéjS¯×uWï¶»˜2©Ö@Îù@ïw»?~ÿã~¿êšà}uæ‡ÇýÛ·>Ý䜢ÐåßÿøóÇOwUå».mwÇ®kº~ƒÜZ߯¿ùêÍÙæüÓÝþý§»ë»‡˜§8%Ô†À“ÞÁD5òS‡¾ð6Hyr;€ ›¯Tj¦e† žÁ&Æl Œì˜˜õ0N8˜1¡åÄ*‡î¢²Më°üpÉ}2íÑgiÑi.‰dÌÙ’ID†¤1Mm/Ÿõjþú~ÜgfGDf˜›š:rSÌ1fAÉþPùƒ «›Nú È` ÿUïõ$Ù•œyºûW…JU( %›ìæØ×læaÿüYÁáî̇¢Ù (Je¥ˆŒˆ+p÷}¸7²ÈÇ2ËJ÷ß÷û(!" \*‹%u9” ]  øLÚ‘—F>/E—:xEÊ™#ˆ ¸tŽÒÀQ’Q¢3¹pSÔœf/#ˆ&c¸)ÈZœ³½K ¯À$™$©.=ˆ@  ŒHÀéësž½*)ƒ‚ -2‚"E§ *ÉÀTú\Ä`Ǩ!‘€Y‚LqÑEÎJ¾³6YÆÉ|¦#êùÚ˜Ñ*s¸± AøUDfè#!(ŠhR ëÆ­êÒ9wøt÷ÔwÃÃãþØOŒ…H’ \¡3JÈš¤®ìÅ…{ùåÅ«o¿ûõ¯¿ýâªFM9IV3ŽjMƒÒ„ž9šX”,’GÃdÁP5ö«/_ìv—ÖygìØ¶ozóø´"yâ© G<§nÊ£tw]þ—ïÿ©ZãË««º,la²µZ”¦,-ZdQïNO‡0¥˜IrÈ«ÒUJÓcRXàY š Ÿõ@ËŠFà™¦§Ê tNízæÔ̦‹¹'< Ùç –Yž2st쎙yü ªšçÌÝg$°‚¨¨¢%CjHÕ*ÊYš°dIœß×Ïá¿KÂ×b.˜§ ç 1=ç¡. †9ƒjÉ«[Ćóy´´: aà9™zŽ'sˆUa&Òκ]¹H›æƒËsɦ€eQ°Èî`Á*òÜ¡ÐL«Xr6–.d¾øæƒñ3܈Î8lIªlˆT­ª%oJP2C ®U²[UÆá±=±£àPDƹµÃYÊ¥3²-{«ÛUqu½õõšóD9¿|¹¾ºª §ÄjBÉ ”áhs·wù®±ÝÊ&B9uÓiDDåœrËÕÎIA³ŒJÙZk•ÍÎ5"€¦A±'©i¸Ê]£°]!¶pdm:3rÔ"Ò¼YaÑœˆM“žzí2”8=ŽÝá䊢Þ4¦Të2x©&u¹¨íjƒ•§JÑP¡f‹ºa8B&15^%°&PK`E…Œ8gÈ/àŒ%¥ X7ÛU™-b¶Ö‚pž² fNÑ@0ÔLB Æ$ ‰uÌ&¦Â›LAÀ†-±ŒÈ²TÂdRÆÃQûmIU­…1–²ÃL$fU‡œ¨r0bèÒ°ïpâªYq†÷O÷SÒ1—I5LÓÔ8X­¡n`W{¸ÔR¦aê‡O·õõîëuó‹CãÑú&ÄœBžBîÛ‘5{²CTæÂijï×Û*—¾›¢ésÎ)DL*2u› }ù’8ÊØæ-YKM˜pìY¥jÙÞu!)ì.þùýí?þå㇓³ËàŒ[aåUé9Ö‚”ᜈÏÐ|†L Ö,GÍs,DB0´°ç'EìLÁ2ZUn³^yG ÉœÏ+4ÖÚÂcÊ*Â9ga9 c×÷ý4cw›fS¢‹­„>‰f C¶peå«fÕÔ«u¹^uEÖˆÈóêyŽáEçÆ1¼~sûOÿøÇ7?¾;uA¨PÛ¸²ÞhrÎXCMS¤œExµ®¾½{<=ì»Ìh¬AeÄ9hY‡¢!4…B‘³jN¢h¬ñ…-Kg³vý4ƒp4Æ‹Y!™:——=1. ¦ñkEJ™ ÚmËu³­ê•  äu½ûâ«W×/^VMÓ cÌüÅË————q Çý~ÿøØ ý¦< ƹªòÂ9Æ`­©ËÊYŠ1t]ë}i­›/enûþ/?¼û¯ÿ×?½ÿpg1$–$gþ×?¼yýúfÎ,m7<>>M#ÊÓ)$ X»2EÀ 4χ©jæ8FĨi…U’E]}8âÌir‡ +v¶.°ëà©eÉÄpæ&…Ê{¬ ²Ž ! oß}|ÿþîxê÷O!Ä î ®›úb»¹º¼hššŒaá0M··5hV„)AUykÍÝÝ> ½ª´ýøñîÐöáz·zySVÞ*ÂbÛýÚv|ØwÇÓk ¢±§ cH1AÌFŨÈTX¾º¨_Þ¬]AÃÆ)ªRÓÓÓ±M T©p?Måc$bïlS9h‡Ù UÇ¢ÎЗ/š/ošÛÛîýíÐY 9W¨ÊíCÿþ·½Xß½zñí7_¥4s0ñ©þéo~x·ïúüøØ¥œWµ)¼ùÙϾ4ß¿ù¸ß·§¶7¨»uýâÅͯ~E¯ß}úïÿø¯ïÞ½%*Jc­óÙ{Ô$Y"³‚q„†–äÐÅÅjæ›lÁÚù¦UÔËͳÅò–4± ²Q§˜¦.³%t&«º˜Œª²º‚9ç뜂¹nžëó%¬³¦ðì©%óHJŠÊˆL@€Eb 9®×öÛonœq)½?µ}ƒèų[W«¦lÛñþ)D&'sU©²x}aÖ6*¢™Ã§pªŠ( R5Ë+¤ËÜœUÑàA4›1Ó9éß š>¤€è™’þyå1±à"@&D‰’%P°Ã$1‚€´ŠÀš-ré¡tØå4IVp€ŠÊ(‘$*V+¨ ÁÀ䌂šÌ@`žóÝpIjPÈž[ T@RUFê2|uSì¶U7臇˜’,}àìY2ÿ]sÓ35H?“aÖ*ár&#ÌrOA 2)ëÙ¦M* Œ«‚7{õÕÕ7_¦øúÇ·û“dÑ>Ù ()©‹Ö**³"PQ¸US¬êjÓ4——/¿Ø¡¤~˜¦ãëæzUÞxãc¢C¤”PÙVŠÂP¡Þ¹ªnv»Í‹«ëËíe{: ¢y|zû.ÄÔ÷“¢¥l¸Oñû·í¿ºùâ«/×ëméÝÚ7…§ª² j_ÔžÚ~2ÖEå\ßN!²X¢Â‘°FŒ„ªèhîq.²–`nÕçÌÚ9=÷ßgg ϲÂ[¸¸<“néœÈ£Ë¼{i'Ò¢¶#%Uà³1dö{ ( kj³€¨…Jæ U0s«‡xnÜuqË¢Y°— „‹ßkIü=ææ±ý\8Ï]Šœ›Y{ÏI½HÏÃó´Î˜}’™Æƒ3¿÷9žäœÖ·0y‘ž¿gÍ“žç@„hQqvæà]ù…N (‹{yfëY´ð¬U—#ÉåD²¹Üý§_m­þøÃã›wïÑèõ‹‹¦òc?Æ6ÏD… ‘,¢Q– œ¤pÐÔöêr½¹xѵOy诮뫛ÚÂD†4¡rL] .7Ð_¯Lá›!…»t#K&‰ ch Ým iŽ%)%[’·Þ‡˜€}“õÆ`;Éä‡ '[®]³*¨5¬š-:"c¼‹’¢ ’j”D¬(EÌ}ŽSнI U1Ù Ö-=hŽT—Õ奬wÑ Q5`,dŸÇ(ÝhºƒšÆ\_ku¡f`î”Å0VÉ$ã3šbnX`Œµ¯Ë ¢ê¬ð8tS«Bjlæ„L‘È$²dsD‰Êه蒊+RUpEÙ+¦ÄÊúÔÅîáéðiJTœRÝXme¬mŠt³ã¯¾\?ªø—ÓþÄ`c*y·©Çë*竲„ÇÇãþñ8†X~½ÞT…wŽŠÒ_^l_\_^l·Æš˜â0Žã8ƒã4 !íO£s$™?|x|=…¶ïýðÝ·ßüío~ù³W/XøþØ=uãñ4<>¶?>ÞÝ·!£±…5ÆpŽô4ĶÏ,…!‡è3K6ÈëÚq³iVÅ0ÇvÌÆ!‡ÛiH*¨â@r ¹ðR¯Ì¦)ªÒ­VrwHÇÓ”…-¼7Uá ᱌'XœŸºö‡ã{ØsÆÍz[•®®«ë›Ë1¦ã©ûþíû¶ãœ h.íôòÅÚX3ÿñO?üÛÞôcøúËëßýæg/_V›ÍŽÿð§ R]6M½žEø¢i&µ0€?Çç°àgh,4ª¨*¨Ù›\84Æä,)²f ) $FK„ˆ, ,VÔ0CÌJˆÑœDÏeñ"YX™¨ç¨3ç¼dG˜3@DÏe#ª:(fsáqÕPQðfFMá‹Íº¶㘎}Î,€Æ°JP™k©9`ËŸ ÞϤ‘Y?°tÞr¢~6ÈÎ8B@œ=Ý  ³mZD£!|†-Ââù|\””J³§Q5¡¤%”1JVÊQ²è¼E!!`SÒ$91‚%dФ’P¡Ì€!` מ¼3)a?ˬAô’[ IDATé™­Öfæè|DÏuÿ3ˆU˜SaÓÅ®øæÕåvU~¼kïö#âl$šíŸ *º(¥ •žÝ”ølù],ÝŸ–g®"Íשž…Q¤"‚H š…‰òfí~öõåw_o¿ùúE]­Þ¼½‹Û^MÓ¬ ïÓÀ’'R ( dAǘ÷O±´éÃOõ×7›Ë•¯JŸ˜QÔeö¢•3³öCZtj¼CB«j8EÒTzäÚ¯6ÍzÓ aœbs )'ˆ23ó?ì?‘Æ©?ŽC»Û^^_]UUá-½³† ¥%ïÌÍõ5£ó÷û¶ªŽŒÓsF2¸PN–i¡êÏ®Þù㸸R{õ<[¥€P =ï_>gðÉœz±Ìãµ½YÞëùÙ›©¬³.~éEñß]ÜIrT"«èT2êó1ëíÐRTÏB™%\{^/̉ƒ³º_fúùs±d‡¶<‡‰).`•™7eæåѹMEÔ«x†]‰.›¶å$=g}ƒ,gŽ~^Áý»Õ’ês˜ï¢E¤ç˜ìYF´pÏ*èùïûÌ,%3£«Cΰ»Üüõo¿ó¶j‡üôt‡Ö_l7ÎBƒ©š9ƒÈœ;<˜MØÎBY_Úªr›ºàA¦¦‚ª`1Ör¤Ð1'I% ”N%t›BSg¥ã(ãJÄqˆ&Ž¨Ñ™<¦,†]MÞ9«ImÏ6 1zuX4kšNÓýÇ;Éîz-<;&Uͪ*V ¢¦aÒ‰1(“QF%[mÕ[&‹5@“ÇlÚÉ¥>Õ#_lízU7Ûµ¹ÚQµå̲*`Öýñî§»C6X•uyñâjrp%'žÂÔu`ÍææúâÃÇp¿?°b&E€¬¾l6/^~qu¹)K§`ñÄQ7ÜîvÛMãY§ei¶›ÕåÅE]U1†˜KJ™CÌ™… ‡ˆ™sbõC4‡NžN®.w¯¾z±Û¬ïŸžNݰ?öOãǧOwC׃EÐLÀÖĤ)[ è Ð"º˜â©íú®ª+S8[—NÙp±f >à0'˜aМ¢„ÀÛõ‹/V—ÛŸîÇÑZBÔaŒ];Ü~j‡H%UEA«`˜ÇQºn4$…·—»u`Pðû1$VTÕĘT|U–UÝ$F@;Å|jÛ̼Üý¤êªt‡a˜bdË`”ìy] s“¯³(}¤© å%öF Š·ZWä¼™å™ðÃF3ˆ’¨SµŠ€˜ç0_C$Ë6И9E@—aþÙ|¼ àç 'áÂ+\*]f—ËE¾TJó Pχ "˜q’÷‡umŒ£›ËºtcƒFè*[W‰Ê‚ú‘9³’DT6”JÇDçÌ)‹!0HFÑÎBˆYñ õ—³hxÖ'œƒ”gœˆ# ]d Ϻb\/ó1ž7*  ¸Œ,ÏJjÎÁ@œó7y6P¢%c‡$¨£b‡Q&D‡äÌ o‘Œˆh(çœÓdH}…eaP¹Ò8’8(ŒA$üw{ Â%LÏE&*,éËdÐ:ÇŠý˜Æ)‰2Î9ÇK2ª.¡ˆ8{ Î PU™÷8$ {õ¬׳{nôÏl(;ÊÆgžx¨ üù«Ëÿã?ÿúw¿yE„ùþÃ~ÿ##ZQ˜‡,)2I*½:§I8°Q°B®a}é°®\áÍn·> cˆøðØ¿~ÿéííÝá¨I\ÛÇU…«ëŒhLŠE& ±mÞÚìšñ*¤±»Q2YcI³0 CckÚÊ9gMLqµZ•eÝÔ«ª¨æÚØ£jŽ!ÅPTþÕWWÛ­ß?wéÓ}?µÖÐàöYP‹g0Öspμ=´íØÚ‡Éà(9$f…Ô82Ž>;2IÀÌÅhžÙ}sŸoA#"£²ˆ0+g¼Ï “˜e°$àÜó«2(Ñ9Ñ]g†0, Às*Ö¹úŸ‰=çÒZ–ô  y˜'óÀY¬?×:f¹õU UÀtCüéC»Y›u忼٘¶ïï8„˜ÓÔv4{,JÔˆ`EU!×]¬ŠÒSfî§~qÓìvÛ§6¾ýÔ‡¤Ö–Ž¥8éÍÇÞøÛ!R³*Ú~QÚnxýæ§C{ Ù ¥GgAD‰˜ÝÔcwäÂs!æCQUÎ7;½Ø‹JÌ‘È;cœ1¤Œ!s«cá;2„Æ!QUÕΈæ9írâÓ©¿»ïœ£Â›Êû”ÂD°0´Ô¸ŠÊº06TŠÅ<ÉFÄ™¿¨pu&ò!²ÌÒ<çtý‡ŒîsQgeüyMçM>œé=3·JõÌùUšÌÌ˂ل°¤lÍqÚªÏnØeËÏÞþE•3ÿzHÏ)À´P7å¼ 8¿`–œA˜³à³dni)ÎF‡Yµˆø—0ž—k4sŽ—¿DEÏÉØ‹ ~!ÝžÝÐ|þý?ó gêñ"¢…=ôœø=o¬žcõæ>A…@ *pµºÙ_\¯ß¿ßß~:tCŒŠIˆEÉ(€ ÏZ‰¬-I]™‹Mq}Uí. 2Ôu]a½2”YÆLÈ*(Ù’)Œ/D"óŒYÀ¤É¹+qkoj…B­ªu‘5KVN9%LѹTŒNË š”A”ã¬NAÖ;Zï¤,„¦SŸ vMáX8“¨Ušpd‰ˆTTŒµ—k{q!S/µÔ§$'U[ˆ1yëd[ã¦Ãš ´Î ©FÅl– O1s~òcدÀð$4‚k'”I8E훋¾—ýcÎÁ†‡8Ž0ëõ„.«Á1LS'ÚM;W½\Tö‡étàq*ÅV ›i”ýã ™|QYïÈfCzyU7«2ïïB7œ2¢¡Ò!†da£Ÿ@;eŸñ‹ë+ÛëO{áÅî7›Ý5zøøC¿ÿ°Ù5ëjµ7zh{íÒnS KÛÃâ(ê­Û4å ¹rôêÅújWÿX2Zû³_ý ù‡¿ÿoù·ßïO|±+ªÚ“!Ö Ç)§V8÷ånÍT¡]¡]ƒÙdµœ2 s·ŸÞýôéøú¶ÿéSÿiÛQû) ¢-<’EaPbõ3[žGçûItN{Åå¯ÏN/"`REeÅ9St¶ÊÍ \\lõH "Œ(Æ *Xkœ3uå½3‡ãñÔžŽ‡7—ëU¥œÆaè†ñétêûqÝ4§c»®+cÐXTeB,ŠQ$EòèËÒ^8‰pfÊZ}A Y59ëmY‚%ÅD®Þl›¦©ê¦$4O‡öáþ±m[öE±ÞlVM]•…wî÷eéK‡žX!ÏôíùÃå5ÉÙP–d äºÓñ¸/zçÞøt÷é~šâ8†>^Ü\}óÍ—ù]ÿápl’qÞZÞíüÍÅúr]wýôöÇ^¿Ýú‡§øñnØŸ²€%$%$ «àT3 #Ñç@'U$ƒ¦šRþô£ÖMYÎ:;…épêú1Æd@­±VE<ãáÃýPø»ï¾Z]ívE±ùó_~|ûþ0S2Ö@^UeöÛ dÀ»>î§Õ¦( —S:ÚÇûSwLÂ%¡Uà§¾ïsï gÎáx|¦ô¡(ìªÙ ClÛÔö)©X”‚Ä‹³Oç¬fù¾ ˜-úºÜ€¤¢@¶)2geª"Ù8¢%€U%U±$Þ‚!eYpÎóµö'ÏœóLÿ™2OŸÁÞÏ4q}Næù¬V^x5pÞ ,4BEC2Kaðrí.vUùÝeþõ×]NC×CfF$"@  sF–" Yk OeivâÇ)O¹Y4Z"XÚ$° ª «¢¨5г&Ap6E’(‚$Ò¨@‚À8KÞ¨JÊ)#uÖ˜yŒ‹ ”¦ d,”…ñ"Ï~\‹àìç‘$ª2Ì«2 $ éɲ ¯Jzy}ñÍËÍ—//6›•"Žã§‡îÓÃðé~„éxl§nPNq¾Þ2Ñ›Sl[Uñ2Z2–Õ$Áœy€Ô £s®*B˜bßõ‡Ã!–ÞR€™TMÛ‡×?~˜¦Ø4U·J1 ’Ý—Ÿû#x^‚Áy!?çðÂ’Iµh+Ò¬?†Õœ=³‹ZˆÎ©n³|HÎUï§©geÐ2_@ç&–@( /Yž¯÷Å#¸ÔÑx–é‹>·xÏAÔs¹¢ÿ!.o)ä—Eàçºcv©Ì³¥Â^:L:·$€g ©¢ÊŒû˜u Š’3" X%§Døæ €‚sªÎ#:wGÿ®Í8?xÏð`ùÜ)Ì\3UVVE9 U,Š€¨Þ¢Eüðñéïÿß?•%¶§¾ëéûSLâÉ—óÐÀP4˜…•³ˆf& uå6ëâb[_îj2Å@é4Œ§¶¿}ûذÖ>°jW 1LÍ´îU3¨©³«*hÑUÓåqjAS*”W À)+¬=kî˜ H;äuWuÕ'Þ“‘„R6‰ÔÌ€PT´ÎSãrI ‚)3 Özª¸Àbë1»®çNK¨wÍÅUU­Q! /®ëÙ´‘cZ™:ŠÁfµ¾ò›:?‚M@,n³Ïþõ›»Øv[7–¦weX]4¾þʬeÀ„8ŽÓýÀáJL¡b¢NKShÉz6ù®Ýe»!Û€p´l§#¼~x¬ŠãåÅåÅUµZ'g¢Q©=ÚÂ4‡»´ï&ëa2+M'Àbs±n.®†AHˆRÓ˜ã„äKk»Ž{ 7´ü‰ûÛ45éO’óTõV Í)æ60rUùÍåêɘ¬}ØŸ2Û|£ÿñ3{{Û?Xsw}/×µˆ†1MY@K MÛŸ$™Ú™zYmêˆùããñöñx8uÓ8ÜÝïß}zzê8i!P(xtÞQ"XÌ9 ¨–*ßœw]*Ïá8¸À?¨ŠrÈdˆ ~æÜ-áB3”¬±ÞÙÂŽjCà¬qÎZc}Y”e¹Z—»uáý4…~¬50Ã@ ga…S?0ó4†¾ëR˜bœ¥¬ŠÍzmVuÙlkÒ8B „¸¹¾Yï.É:u~˜‚™×öœã4°Í%9kjoíc{:«Ûu¹ª«ÒûuS‡áYÔ¨:…Øöý±í¡íªSÊ"¬ 1æ9ðƒæ!Š*¨±A˜Õ¹1ÆãéhŒ8ï»îã(œWÝlvu]6E(_¾\óêæ«—׻ݦ,¼¨ˆ# ï¼õ…+¼q&†)NÓØOm;Û±Ÿ BC»?==Ʊ3d¦ÄSÊ1±1¦(¼õº®{x|ÇÑ"cD!Máã‡Ûøpÿxœ"(8 –h²2#1!Ϧ™AY½±_UÔÔf·­/¶õÕ®©ªæØÉ?Þ ø¬p8õ)¿ÍSo4^6ؘUYëÚkŒoþòûÍiï¬ýÅÏw)LûÐuíãüö·¿øÕ/ÿ:3pÖ™íÊ­*»öä}‰MC«ºDRk,‘;»^¿?œ†œ²ð©ëß¼ýôúÍíÇÛGkìvs™"w}ûáãñ®®Ëí¶,|¹Y_]m·Ã8þÃÿøçwïNí)Em{™ÏP{"0Ê:sÜ " yžQŠfU$c‰VCŒã]ð.V¥uÞ¤œÆ1f>³êÁèye~¼»½¿¿ßíÝÝ©’óe]÷ ÚváÌœE %¡HÌ"ç$?`üœ„ *¢š… "’ÝÖ:yÌÈj…ižU)ÍW!a*œÖ¥AÔ10ft@%€ù–H@ <;óÎó³3Ÿës¨çsp ž'‚H3<”g·(êÒ«œ¿Þ’@U­°8âo¿¾üúëW"ð—ü·?½¾{ìçÁ(bD¨û˜ÂdÖY­Š¦)sˆÊý02ª4•©K“Rž&N‚HÆX HªÌj#›œä ÿ–ò›Ïf\>{êgz§>oDD¬2¡ÎÚ9U ¤BADÐ  ÑR¾›s$Ÿ†Dæ@E×;ÛbTñÚ‚3Ñgº€+œÃÄf‰Ó"OʳÿØD0o?œîœo ûQ5™* ÇÒæº´ Øöxûtì㪀ДÙB‹Ä–Y=ÂÆL;;š²îdˆ‡»cw Ÿ&÷Ã?þáÝmŒÉÅiLãxü¢ã›MJ²c\XgüË\_Œ9g®@hìãÇûwÇ·ß8ýø©½;ŒIÐf­ ’7ä -V0EP3‹tÎv@R „9E[eÙ7~Îø]" YE$dçÀZ3¯àÈuÆ9Cª¢DÆ9ºÜ­_\íjoÅyW7õîb»Ù¬šÚ×eAdBÈÃ4¥œ­¡º.›ª…ã©Ýn6O‡CŠÙ aÎç06™ëfeœ_­+OýÓ¾}¼'‡›ÝeQ–ŠØc˜¢Äˆ ¤ªÌãÔ…È`á fJ"i”‚j³ª‹ÂMÓôððp8œŽm?†ÈY«²úúå CNJæ‰g¢ IDATcàaȬ3§E#eÀYSxtÖcÑX$—Kën^Ü4M=£u–ŒõEoL ›m¹Ú4ÛËÍîb ã0* ¢³¤€ Ê™cȦ) SœÒ8ÆiǾOœÒÔ·Çýp:qJˆ&dèÆ$…+‚5–œ/¦˜žGkŒ5Æ{hC×½ýéýŸ8î.KIä-Ðìè“ùý$ƒ€”ET…@›Ú¾úêòê¢ð^®¯/~ñóo^}y=Mü?ÿ×m;Ž‹~bÉ£A4¦ØO2~¹)}QœžNzýÆlß¼úåo~ù‹ëþôç?}•{ƒá›¯v×××Þ¹²ð…3ãе§cJ9$NÇŒ¥õª¬ëZÕ}ÿýûÿúÿÏ?¿þ$ŒUa׫:)|¼{úôpȉ/¶uŒéãíýãÓÓÝcGäꪺ¹ÜìvþÛo¾2èÿŸ¿ÿ_ÿýÿ H×;ÁÛœTfI†+ o–³ÐY+‹ªÌ IÉX‚‚³‹9Œ9B&Ì €PYXüt–î 8²’¥ŸRç§OhŽÌ„vm-‚"$‘`0WÎx‹ “Z¬›µuÈi8žúÂWÎXïËõZ„r?1KÜ®ÝÏ_½ü«_ üóë7ïo?=´Ý ý¨m‡hèé4X+›MõåÅz qFƒ¸ª\]—1Áþ† šŸ{Ф ÓƒA *XGš â̳B’3Ù;¨ lJ2Äã8³ªGt $`@É@^òc®Ð|ïÎE "X}† œ÷îg©ó\_Š.l5ðìñ[BDÏ! €,Y%#cˆE»> cð…]¯«Ã©.ÄiìÉsÑ‚ "Ì*Œ™ˆ@­‘²TglU›UɈƒ(×eyµ«¦0pÌŒ€`@110ë9ÈT "Q"dox·..vs0Œý±íC‚ª6«Ú .…P­5™µ$$N™3EOÖRE TH³0z¾-»æla\ô4 0“S ɱðúå‹Ë¿ùÍÏ÷7¯®¯jçÍ4ÅãéiÇã]×?‚RñÿSõ^Ë’eÉ™ž‹%¶uTÊÊ’]@7z0C‚s5O£ÑŒ´™!ƒh´¨êʪTG…Üj)w^ì8Ù=ù'-"|¹ÿÿ÷ù–T…PAs D3+”άÔ™¢üWHsZîIK,3…‹À|¾ <÷Íæ.õY¼€øÙðö$Ÿ—¶ ,à”ˆ‘$¥²ßî·ýpùÚÕÏn®_¾¸¾¾Úñ14•½\5ß}ù™n¶9Fk9Ä©®à«×ëõ†¨Ç®œ™d)İh‹Ö_mÚ«Mýwß?ÿoÿõ·ßÿ:§qèûÕ²¹¼XUÞ‡°¼¹hž]-z»ÜîO€t8Nýø¸ß÷ï?Řråy½hç {ƒ‘ÈÕ„ò jÃSëì³ËÍ‹g×ÖÐ49G"NIs2ÌÖù*Ò€ZÀÙéRÎý€9kÚð‰á#gŸÎgE¢Îerͨ@Å9*gŸ$(«,ø—x<™àžeçä<žÍoç–ðùsO  ý¼ÙS}y8÷‡f3"žwåò¹Ûs®Õ=Q9QqNÿœC8sä)?6¿ø©)P bÁ'œßÃòW/ T!ožÚƒp~‘>Ñdg•ð| çKÈœð?³;g Áú¹ €çGÓLþ*ä4ñ³OÏå™ó dö’#O™ú‰•™ˆÑqN€QurN/7®©ê)Ò±OÇ®‹áÂB S ÃØ¬Ð¶ËÌÕI“3ÁsÕL^ŒbEì*ŠàK–\2Õ¢Y2”¢JR ”Œ`¼_”$%t}HŒÑšsͦkŒ3¨¡So­õdâiúŽ[[mšT4LHd+{ÎBIVbt³'&%+à /Óͨf´L… “«`þ²Rɘ³­,Z«šJÊr¢›ÔµdDŽÇî¶;퇷ß./—7/›Ëz°/_|wóåoøáç|ìÒT*¿ªWÏëÕKO‘4ôÛÇ'ö¶u:ˆv ÇÂÉTjê½J†ØÙptEõ4Ø.r…5IM…ÃT¸©‰Ic!MÙqÕÖͺ±kŸ–.[«@Ò^òÀÀ`ê…+Þ?îKmÀ±#6 ešÆÇŠ ÅcWB¶a²¥WÊdع¦&2%»ûqjÍÍeµnN§îÄÁ´HëŠ;ä©Ïã % ³HcÈ'Í9²5ðrH‰NP9»ÝÿüÃO¿Üž¶“9e?H%èØÖdŒ[çõ‚…<ïýu¦Nƒ(J™»Ch@ŸJ>$çÏ |>I9%•HTàì·AôÞ¶‹ºm«Ú[C”s¦)ÆhŒ®–ÍÕºE,ÆšvÑ^_o.6«¦qÆp ¥ë&ÄDD„Ö0-ÛÆ;ûìæúxêïïöûqœb˜’1)†œS)d­µÎZgŒ_^\UmsNÈäB¨H˜Rœ¦.£²f1ª¾íöý8†ºÚ Hñ•mj¦pÿ°ÆiÎaZãÚ¶¾X¯ºnè±hQñ¥€(ä’ç¬$!:_· WÕŽevd+4’•’¥C8 Y´;NS!–É7þ›o%‘nûc%Y€LŒÖùx8žŽû£p†4öeܧ0 ýÔ:QFW§¬!‡T0 cè´i1K–Cˆ2޽–ôéö~·1]¡q„|^¸ÎÐ×> ³ »XõÁË‹öú²Y-Ù9xv³yùâúòrsÿpìºþq{è†lêš39BïØXRLQË$xè§ãv¿ïÇe{Õ,/þöo¾ýöÕ¥3*‡)…þxÚ>Ö²·( à Q˜‚}ß)Å‹‹¥Š\Ð4 ï?Þÿòááîá„`*‹)‰­kãür¹T‘¦rã8Žc?¥Ü´+o½!Ôß¶M³?Äw‡»ÇÃÍÍõ³gÏ=3ß݇0"‹¢É sUF4gR-à“™JE‹Š5E¡”,€Þضh)P²”Ù;£È€$8û.çl™5 “`]SR Ê L32D¥ o¥¶ háòââÙókkqè à|…ÊË%µËËÕ>Þ=Æ8½|¹ùͯ¿üîë1LŸnþüööñB¤•ñÐ¥4åͦ½¾h‡¡ÛTŠ,×Ô~s?È¥€0„|¾ÀËÙJL„Œ%‹ ArAE£dIUÊyv„â-¬—®v4ö%L’ZDó4ž(ŠÌ59œ‡Áϸ™srÆùÍe×¹0DªgP÷l'/0O$ɹXú/<õAX£âhÉ9[ç\nÆ‚h}ýúÕM?„ÒÐC'"VD¥Ìxy"`”\†!ZËÊfDLYR*ˆPU ˆ¤HH¹pp %æR4@-ƤÕµÙ´õó›‹g7ÖÓ±;~¼}Ü&Å TcŒŒÀ†1ÄÒÚOP„ɘ¢0É©,Ž“aT(¢³«õ¼8}Zƒ~.0FÃRY >KH 2ÖÆ¬[ßÖÞ:nšÊZÞî?ÿòáíÛw‡ÃΛr¹öªGúŸŠ8 ùæëÁùP(ç'â,mÕ™By–a+¤ó“OQ…þ2BËÌŽ'ü|ú š›?óÝIΞ9VÒ\‘A°e(ÐÙ± O±|±–U’¢ ‚³Dà¼ÞÈg[0ý/MkEP0ø9¤Ÿ‰ôù¡þ\|ÆÙ>eŸZ=¨@‚¤È¢g12¢[²UQΊ ™$#¨ À\ÎC0Æ´¿¼X ¸u(û½Ým³– )CL9Ä%Œ)*€·5ý)æ˜kK,X#Fb¶–5E %-""RJ*±0Z&´Ä~¹Žlrg§2e vL… hmhAÐÚ’ •œEŒ-äÇS Iž IÌ#"!1¶è ò| 0h˜Yˆ‘UD$9dÍÉ:G(y ¹$S{b‹€*¹@ɨž.¯k!–­BœÆr<èÒ;Núð8lO;‹7¿ùÛo^¾úõËëMm’sÜ,VLðp÷éþýOïÿ¬q×´ 6+ï×´l«Õ‹zõ0íc7v)hÊTæ€Ø|])%=»:×È)¥Äʻ׸n$qйRãÆIvÛ”‚,*sµä›­ (gDBH8‚wvsAMNAQ]³ÂÀI¯VÞm20[/²HhU@ ã(ôªC"ST@É AÒ1À¤Õåe³X×Còذ|ÿúêõËÅÇ]þ·é£²kl½R­búùÝýûŸïB¢$Ía{|¼;õ“ˆ±àÛÚ¶‚¶‰9®ù/”Ýó{x>¨~ösè| {ªÎ| Q,%çT"ƒÌ€IKd-Rí̪­..–›ÕÂ{[r:õC×÷ÎX@ÔºòuS-Û¦©}åw† KÖœÓ8Hd£êЕiÃ8±a_7ó99Ƙb@)p:%ËØŸ.–Þ©¸ªòÞÙªR¶9e´¾²±Æ”ç¦#¡­2ø.™C—·ÛC £µNsŽÖPãÆ\ØÚªöÎPíŽÓ±ë§”@Aœ·°FTRá)æiJ32  Sf¡¬¥GMi8vÛÝqœ&¤ +¡‹€üæ×»~¤äîÔMS`dÑó‘cA¿îvžËek06—ŠI«Ìu(fþ¢èù»|ŽvZæEkÛÖ–”¥]4ÞûÓ±ßn÷ï><¾}÷qŒÙ€rNA-•l8³GãœrVë7×Ëo¾ûÛß|ÿ›_}ûfØßÞÞ>þô˧iì JSyËfè‡ÃñÄl§©œŽ}wì‡qœ›„Ýå0.¥ÀnßïǪ©ž¿¸‘‚P’õ¶®œ«lS›sŽ©;´nÛ‹‹ o­ã")@ÑÓ¡ÿåýîñЉª5¸XT˦U‡°ÞŸt{Ì%y20WÜ4‹H)ArïÕ°ˆHÌ ÉÔLçöì\¯€¿h4¥¨È,Ð(g $c˜æY›¨"–`Ù8k`ãr¹ø›ï¿úúÍsËe ãv×ÝÞw‡c€Ë…½Ú4*!eûòùúúzÕ¶>Æi˜âþ0>>QO\!Sš —-¯—¦v•3%ÆœSîNÇDEpî|‘2¡yZ  °A˦DÉ)˜a¤”Ÿ~‘APPiþNÈóˆ¬0LS­`-âLªIY%)(*?¹9ÏsÍ<Ù ”³9ö)Dghä™ò”a˜7pOIDEÀy ®Š’-I³àÊU›•[-MšÒ±†Ey»ëSN¥˜ºn UÕtý8¥à|ÕT äRšrÊ"fÖd„8‰fìúQK¨*®j[yèZh˜TAs)J˜˜føŸÔ=¿¬n6n³p›ªjYiYǰŠAûQÆ)uý@Þ9í‡ÒJÙºyªF)ç˜<̵ŠÂ ¢UEÿ* …O\…¹;b¨¬WY¿Ë® äÊ¢¶9MŸ>Ý-ä¬iÛÅvïÇáÕóW_¼ôÛÝøóû]L%« 9DPT"€¢ÙÚ>O~ˆÊŸß]g[SDŒHI(€d-±ˆ(òÓ;Áš3 znaž¯2ëâ D ”@IUæ¸ ˆ¨J0”®®_¼yî+ÿ¸;þòîv‡ûÇ]J¡”$§S¿Ý@úðp<ޛիçÏ^¾ºQÕ»»c?ä”Rœ†¦©n®Ú7o.ÿá¾üæ›—•cK°l<³h]5ÆÙs¡„m†„%»ªøÚËà+¬kri–ö¡XKëuë)$Y'CìpZ4¶m—›Ë«f±Ê¢ÇSwwßw§Ë«ëÍų~á‹! &Ð^‹h©gÁÜù<¢Ÿ½¹ç-ó\=‡'\?Âü#öùzò”´‡9žT '°p~Ë™cƒJ g†õ]óé3‡jîÖÎz1€ 8‡af†¦ œ+BóEà,èP”òÓ˪ ϸO’YÎ5ïEÈ€Î߀43žÌçWàç–üM¥°ß¢FOÄ)_-Æg/àÕ—‹vµøÌ] Ýãñÿ¦íŸiÚ§ítØ…~”0ÆËWÀ\-Ÿ•4õ= iT‰"™fÁrè ?=.ëŠkÅVK¸¨ƒæ±?ŽZrè§Ü'Y²T”Þú¾/Ã) ";t—•·KqMŸÓö0–²Ø\¾2î‚ÈÅ„qœÔ´Ì>Iž†¡„^rD2—ŹB¶Ë²dXP¥ZQ²y8–Ç“†ÌÀãÈ ²2»gͱW²õ)"¬Vk[U§´ý?ßl3Š …KK+ÛxE"ÐL*¤óÍ;@Chç'â ¾D&v@ªRJý|?ƒ7ŸJ1¢RJ‰†Š÷lÙhëaµtUåUÁª,{CÞQå½ojw}u€HU ÎÅNËlU9åy€b$[ Æi¢€„0ÓÃÃöx<‘o*f¦ Þ;ff¦ýáôð¸=,L¼^\­—mS‘w ä\JD뫺i¼s¥d²~±¹ b%3eÆC¾¿#Ô)D$vÞ×$”îûX MÉŽ™§qÀ8X4@nꪩV“V·c?v)äÊ`åL–DJTBìCQÍEbÈ!D‰HnŠèæÜ2ðÜè‘ šqNXhÑRJ‘y±ª¾Zæ?½ýôöý§ŸÞ=|º=‘uK_¥,%%4¦©+o2Aj*Ú¬›U³¹¾²ÎÿÍ÷ßóú¥gû0”\˜‰›Ê½zõì»ï¾i«÷?½ûðaŽ„†‰Wëõz³¶†.6‹õjm]J´^/¿zó|»‡1E¨*W7† m–®déºñ°…²Yùëë¶®¼!mkgØÞßíß¿¿ë‡‰ h¶ž..„qšbÈfŒ !‰fUA ¹`¦R@#é„ÑSYP-˜Kˆªf&d)ªH @Õ¬E DÕĬÌt†x+€2"1#)EdŽüz_µm-eBœVËÅ«çW/®—ŽÓ”l˜¦¾?ÝÝ¥”qé6›vÕ¢Šó¬a ‡ãpì§1–˜0gdd, Ñ»p±ª_\5Ïn–¹TCï‡~¼¿ß߆~(YfèDRp¢E$¤šó<[à¼9›b`eA.tÆE>yCCÊûcaœmž‰?§V$€¤@ŠŽÈ ÓvwzÜvÞùårù÷¿}¾Z.DàÓÝÃãvï}uuya»Ó~zãÝbµ´Ì}wPËXJQÉ"ÌÆùʵµi¼a¶§A3LH™ˆ*ÏÌbœbX4|±rë–k"ÓÃãiIÁ£Lcº²JÁ˜qLRr‰I¬wÀ–,¥$Q©+þâÕâêbe‡þx<ícR*B!JL¥HÑyp™kÁª"9åBlIW /ªåõ¦N%üñÇŸî·?¾½mšvè÷ûx}õâ«/ß´íò¿ÿÏû߆ l½T„l¸X„RD4ƒ˜§éy³«ŸwÄ(¨ 1Ö5ÖM@ã¤}ß—2:#«º©¼3Æ(àÊ0Ž¥ ^…jAЂ*HøÔ: ƒÂOio8Pˈ&Þ\¯¿þúÍpÚÿã?ÿþw¿ÿi áÓÝ}רL€ÛÃ?½+ ï?ÞöG†ï\LøáãíŸ~üðÃOŸîSLW—‹Ï—ß~yõ«¯®^¿ZÅiìû>ÆR*[DB*IÀ°AÆTLœ;˜ÊãîcJ!)@~ñ|Ͷê' 1‰xg@lÓT`pŠsmÄ q wÝï~úeÌRÂTUÕ4ï~þ¸ßÊý}ÿø¸-idèU’äàˆ<‘}"#ÑÙ\EôÄS: 2Ï¡3…ò¼‰²üJ‰]nêÆ;£CW‘³¢%ç$ª˜Ïqž™Wyj}Êͯm…ü»@&eFD-9‰ú+¿0œ­^ @òÁH„i^ê+2VÄ<ñfçÙ *çVíSêPÍ9ë„<ûP³5à λó\4Ê<¸;"#%… …Y [ €ªÌ`àLÎ’³#`Œ¨Òl¨CI(A"ñL™‰I ü”Rø Êx.]àùÕs©øÜU3;UP“AÓXjb5)§)…PŠ1HĹ@Œ‰0ËͲڴ›iŠ!j))$ )†i‚<¤nÇí}IhW—/7/¾ ÂÛÇ]”Ç’dŒLX[[cåJ¡‘ëä–Å·)Å9 á$Ù×ä‡IÛ°;éTœ•„S45Ô~ÿåÕ›Âÿ÷/ÿ”®/l̼ýô0¦Ä®â ¬påjÇy®®°fE-¢ æ#-äÑ Ÿµ×8³¨Îh±ùЯ€ò´ UUÉ¢™±,Z-êÚ›9x±ö7W‹ºòY #VÞUÞV•«œa&UÈ %«("aÊrê†S×Îkõú~ìOý4 ¢""]7œŽ'$\­[ï«ašº~)M[[c¦iêºn'Èf]ÓfQëÜcÕB€lMÍ kœ÷•1FD¬¯DÆXRŸ Ë¢­ŸÝ\Æ0%ÁSsQD4@fÆã±WfšY“ÝØUue,£A$¬-›E‹NS‡R’œÇ hÊ!†T1  -HˆZT“ˆì¶ÇþÇß?ÜmÛÆ7‹z½¹¸Ø,SOýéÐe„¼è~BwüTNjšf±TW¥Œuꂆ£¤1äÄ‹Q Ä sVB –€\)6‰Ãˆ€öòT˜Ñá ‘´ 9ç@KŠ1„BÐvœ5Ë%v]º»‡Çÿ<¼ÿtˆIªzá=#ä˜â¢­~õíë/^®…’z6ÈÖáf½üæ«×›¶ÚŽ‡Ã´X\þö7¿M¯¿xMî·Û·ï>}x»Z.õí›/žU•wÎZÆ s.!¤¦]~ù%!ȇ0Ž"@·«E½\4Þº)¤¡Ÿµ®MÓzï]嵾뻟~þùçDüÕ—¯¾x¾ijWŠ„˜s.9•rIÉ1†™©ä’StÖ6­kêz¹¸jj«‚9ç\†a;§ÝS%Åy¿‰ ¨å¬²’ˆ •[ ªˆ$D´Ö!˜˜rLI•@Ì[&2BUÛÅÂ)ÒÐc¤Äiì"ÆbNµÄ4Å0VÖYöËå"¥ %ïw§ÃqxØ>ÝSAb g!OfŽm]^ÜÔ¿ý›7ß}÷•¢ö}×ûúùî݇Çí¡Óq¢s±mfù…„˜’¤¢LÎXc¡ùÅŸ [BÂyg‡ Z«êç /3•ž"R2c"«9) !ÌÒ Œ1 S¨ˆ@ J™£$ˆHs–öœy>¢çò<àì9ͪJª m¿¹X^lÖÄz:uøñÓ¿ÿÇÏ’O›Õâ»o_}óõKbº»}øôé^E7ëUUÛœo¡òM åã§;”i³Y>ì)L›µ»¼XzçÔ2]¬ÛË«Õ0‰µ‡¦­±«UÅFúif$gÉY×,j`ºðñþ4”lbH’³%o» S’…§Öæ\r¢E4—•ãÿü«›ßþú«1Èþð§w9i l]H°;„œ‹(Áù9)ó)‘@¤”ÃI§Ä–V+uÙ\nçùawøñçO€f6wÏoÖ_ùâÛ/Ÿ‰Zè'IZ9SkI ™I +Æ|†7ÓyUQM—É IDAT9³Z hðœn6õÕÕ2ùt× §¡²é‹—›/ß¼Z-[ÇXD>ÝŸþôÓãã>eqª ˜sŽ(Ñ’ZB̳,¢U&}:Í|{‘’±²Õ>À¿üî—O÷AZ´Í²umm7žwÇSÊerß…»ûÃþô¡üáãüá§Ÿ~y8 ÖÕÒ5µuì7UÕø6Ž9Lj‰M*%vŠ2‰BÌ9Å<ôá°;~üðxê§¢4Náê¢~ñìªâþØÎþâàœÔµ5®*Iî»nL¦±hÇŸÞ…ü¿9üÍ›W_}ù¦]µÿ×ÿó?ÿç?ýiжº1mU[܇ 0Ð –@VDU–¿ø¥ÎG@‘sôÿ³YM4‹€¢!Ûp•|3^lúƘý½NBÞBÝ”4MAs‹„J‚ˆO€LQœc60Üè³²y~Ž”B H…@ xŽÏ©ÌL"A˜¿üˆhFŸÉ¢ÙijöµÀó0Å@ 8ÓtéŒîD‚¬’•Q 4‹A h²H$е‡ÚᜮϊS†œDHçÆ™€¤ŒBPÐÐù&™ETg­1=M7H*ŒÙ›"¹`V«\±q€ ˜E €!ñ¹€OÀŠZÎjT=¿Y¡’ À"t>bhIÀqÚÔöjSU•1úp£¨:ËÄTUÕfYmÖíjÙ2S7ŒÇãñ4ÛúÖmýÍW¯ï9¦Ã»1éÕ…iL.¥ÏÓiìʘSÅÆ ‰–,E@5uÝ,Û¥³T ûn·; [{PÅV¼ÕRâ*lb)È ½è¢J~AŒ‚Q,r˜dœ8eëƒ0 *±UfeÉED 8Ë)Œ'UµÎ#)YÈ ™‰,¨GfC ƒÅ\•⊲ŠK§X¤Rr\âáðøá_³½½z³{þå÷ÎÛa÷nûó??¼ûcšç¶¾€4Œý^Â'2-ÂbyQûúeÁq$‰:•D!иkÒ®6Ñ„|·ßFcW/_¨«s*¦¥³1i×%ÌAs–æ^ÇŸvü86©XG¥>Hýг@`ì¼·¢åòúËÍq:uð}Ü«º}s}¹Ú\†î¶“_èâˆNwëqû, ŽŒ¢†Ý>èNSÎê1ä uDÒ‹årAþß~üôû?P4mÛŠÈJÆÆ´•¢± •׺Ɣb?Ž „ìŠPÎ%ÇÓÐ.«×¯žšÃaœ¦j‰œq(¹üUk_•¨Ð9ß  R@‚·²Yù›«Å¢±RJJê}õêÅæ‹WW‹¶Î%¢wž™˜Ð€~vûý¡'4m[˜PÊ©ë¦a*)c]å‰YJ))§œr.1Äaôùóëׯ_­×ëÛû‡4Epf¹¨™ [ÑYbLã0 ¤ªöDhkFk½q•«­±ZR’’cÌ©H7Ä®O¨x}q±Z´§þ´ÝOÝ”B”DÅ9Ärz«ÇÚóÙ”‚h™½ájXK1C.SHÑÚt±®í²9ìúab‹À¨‚¢ŒDÖ!C˜òï~÷ö‡Þ-VÕõó«×_¼zõüªæ˜ûû2BÔû¼ßÊÃ>öÝ1 È¡ª–—+yÖÜ/]°¾d[2@§)ÅX9·nêÆ™Â©“˜¤(ª2dçê ›£–'´ô|Ê“èT5üüjs±nAÊâ©÷ûC/Y‡©ÐaÜãdH]8œt˜,BÉI˜b±.7UzñÌÿýß½Y-Üñt¸½{x|Ü©ÊÅf­]ßNGgùë7¯¾ÿö‹"Óþ´ÿå݆~ü4vã‹››¯¿|þêÕ•1¶nÖ˜îtº»»¿ÜuC¨|m™ ¨etÞô!L!ZkšÚ:‹›µwnéwΪ6êœ!¶§.ýòþá?¾ýði÷ìÅë¿ýþÕ³ Wï·§ï†n°Ä€Æ1\,È8ö΄ }ŸšÆ~ñzýêÅúÕóõåÅ €v‡îçû_Þß¡v!„Q’"ò“ ŽU¤L–ÂÅÒß\-™t»ÝuCh›Ö<)M¢f"ƒÔÖ+2»>œÁL¹ôãð¸/)…”rΰZ-.®¢JóÅÍúë/ž­×mˆétœº!¸{øùÃÝþ4eµdÎúYB©Ü\¶_}ùì7¿ùæïûkçÍ4Ó4mO?¾½ý÷ßýùÇ·¿<<îb†”¨eŠS–2g P*ƒ«¥­¼5Ö¦,EA€•Ph΂‚´óö HÏ—Ž9@ Îq]qRwš4¥(çbŸG°óÚ¯‚¢µ ¬šŠ¤RRV²h”f¿.Âü5„³"A€XÉæ§aû­—ES5•yñ|‰|¥dßþüp{û°Ý><ÜU«&.VmÛÀ³ëº;õÓ¸Uuë‹ååå†>~¸™ªºZ­lí†dõÙÕâÕË«åtPѳ\6í»n<ö)ô%ÕÞ™U«‹º.,s»ZÞ<»Ê ‡!#SÊ!2ÄÄŠT¨BÔÚcë ä,sïPU!wnð¸ßÊÇO·Ýéty±X®ýþ”RŠ))‘›¥Á ±0Ò EC¡TŒW­cú¾²êÜÈûxì¡Ù,½³|¹>üüöíã1üù—OQ,ÙVÁ‚ªeQТB ô9ÞLˆg ¬èÜoDÕÌ$ËÆmZ{ê{ƒábeß|ñì¿ü§¯¿ûêµw¨eL¹¼ûX‡‡ñpè¥B\ 爐†‘bÑPd¶G ˜‚„(Ef4CÁÓá´}ØcÊÅѳ­Á¬”Éx^_.—íL}–¶©SÌÃÿå_ÿxêãýv8tYÔ4M½Þ¸ª¶©¤c7l÷ãb•c1Î/ËeÝ´*:ŽãB qã8åq 1¦"z8tDN%÷ýxêúª*W™ÒØì¼­ê À8Kmmh'z8L·ûÞ,ôÊ6YwwµZ¾¸\~ñÅUÕúãÐÿñÏï¶òõ›æW_u¹®OÛC°~QN]Ç„h¼Pa˜­“8·²àÜüfQ”YÔC‚XT3"W 5›Ê-àá4¤!Ô¢5¢Q,À‘\ĉsb)^é|{¡3¶„UIç~ŸˆŠHQ%BƒÀˆPEsII敹ÌåÀLfê™ Í6³øÂ ´µ[®ë¬p8öÓAͯ¦¹œK¿³B‰˜À’ZTUI%%AH€DLΕÊe)’æLEXt¶AD%£ªY³–¢ ö³B ˆUYætŸo\ RT‚weÝTéû4ÄT”UXç?ÇüY œÇy<ç¦Ïï2<'þI@@3¡’²æ,¢3Q+µoJcJ]Ñz³DªÚÎûÝiœ‚·j-zç6ëÍ×o^>~ÉN]¿?t÷÷»ín_.–í×_¼¸¿ZýÇ¿üÓŸîN6›ŠoŒÓûXrŽI‹¡q†³h 9·¾2íÂ/Wù°=ö'ÅPiòˆ’ s°Áeò)gHhãÐåÜ”b¡˜¢ Gâ1Í]rcf,ÆÓøbK™"P™›ë%Kꕈ%#SŒ°h0• ¤É7ÖÒBZ¨  ”qŒÝi(Å(¹4ÉÀÀUÒœód€¼$ŽA´ä2ž¦ÃÝ1ÅÇ÷ìîÞ–~`&c[á• áÆÁ¦“Ó…˜E¦FŒ#ç™9¥cœN0öt: Ã#Bßh Ê´h³³AT2x«u ã}Æc9É”‚ E¡} Ãî÷öF79{É™4á)&C$bÇAŽûnêGpUŽ1ŘSR)P²µöêÅ3#úã‡ã݃º)W%C‰¤PQ¦&Ðiˆ¸¤Dä,;B#aŠ©œÂíP¸¼¼ŽÒäŒÝ4f²F@*$æ1SCrÀˆÊ¤Å`nZúÕwÏÿËÿöŸS‚ÿþ?þí§·÷JlåŒ_V•ŒO8¤¿Àxñܳ/Z’3r¹ö_¼Ü<»^‚äã©3DËçÏ®ž?»l›ªä¤Ö:ÃÖ0FQ1Î!}Šc aj¬wl¬@ÆrDÆœ«%ç\b,9gcp¦ãáˆc?ˆ ¯Úz±tF}弯Ç.ŒÝ©QâfQ­ee«J%dFbfC„ ¢2ÃéÔÇ,S’TÈùÖÙjŠ4ÅtŠª”R‚î4v§xê$ 2†$äÙ SíL΂œ3•±šJr–¼·!h,Y*ë6W—MåCÔSTLH™A‘ÀXg}mUpr7f¡äéb‚q‚a<í>üÌå„d?ÜOoïÊ mQŒEª“V]Ñ<ôo–ã2*Å1ûª‚,àWuÓV¦N§¤$b‰)‰k\SÕÞ8_|¤$-Áp¬¼nVæzco.ëÊ{bwÓÛ_noï¶9ça˜´©«¦iÍ„¥L¥!”¸Òg7íj¹0î~ùÓxssât8õý$¥º¯-]^®PbÒ¢Ôuûw~ÙwSÖjµ¨uµ\Ô}wüéÏ$Ú\\ã?|¸ýáÇŸ·‡Ó’aZVÕÌ¥4Η2ö}ê‡þx‡Ãõe{sµ¾ºØnãå²iõá8¾{ÿñ_÷§·ïosáES¯Ú1ï‡O·÷B6‹¶òÞyMDbŒx#µmt³ÄU‹Ž¤ÎWþjí¦¡}¸³%XR°œ%ç’+ðSÒSj¯7—¾i|SÁn×!™”@D‹¢€ðªLj«Vúqèú0LÉ[-EU1#HFÃîâbí_×Í«ëËë‹ÅrQ©è§»Ýþôa»íöûq… ©!]¶î‹W×ß~óæå˛ͪ1*«º¬6«Å¬oÛ¬í§Û]?”ÇíðË»»¡;©wÆZGJ¨©lÓcÕ¬6F2¥1J,)‹X&:oïp€IªˆEAf"[E«t.Ek2…ŠU$†à8´ ê”R,dx^{â_eRÎÍ¿óWå1¥ýÛSï¼»º\º/–—×ëS»häúqº¿¿¯l¼‰‹Õš 1ß~z‘W/ŸY6meJû±ÜCˆ¶]f·h*gmJ‰”hŒ¹ë“¯@U?¦þtd.m½lÏÆpSÛg׫ÅÒN–l1)Ä„¤l@RÆ]2„ÌTBHc²Q}a»Ðýðóíý owîý‡µ,–ä]Ec¤)›ÊÕˆ…4"$KbB‘$BTjJßOãpÇH\rŒ< Ù(RùЇ\ÿô¸?Å·Ž¢žÑ@)˜Á梤…ÎrÖ3qFf®ÉšH€1+LÓ8t{Cé«77ÿéï¾þõ÷¯Ÿ_­ ‹á¦ˆXç¶ÝnwLñ BMen®—›¶ä²;ôÝ$\LHd€¬H ¤‰¸ÀL³„”R#‘.ÍåuR`’·8Eu¶€2T[ãf»ëî‡!T¾ö¾NYª®6¼^cÇüó‡ûP´iܪ­Øp˜ò¦‡ý~»?><îNÃñ0ÆÛ…þüb¹Z!Ò©ë§ñqú Ú†­ƒÆK[³1~®ñ÷Ãx%e5u´<¹*¦†Â$#kq!û‰Å"(ÀÎlÍR’Ñ<§« Vd.ÊF%R4¢š5h+¾¼¬Èèî8ži- „9¢4E•SN})9A/H¤– 8AÑÛâ-*h1$ÖÌ(î4¤±#¢µä¬²-Š ¢%aJœ‹Wr‚@˜ eÆ ’U‹)@ ødëC²ª(¢ BLH*P&„©òܶN¥¤R’ªä,’¸ˆÎc„¨Ѥ@ ZJ)EY ‹bJ¥¤óª’åìŒTb¢\9{½±‹Ú2g¥mÌÕeÛÔMßMµ•c̦®Œa$†Åª~þüÒ;œB ò|·~ÿÃÏ·÷÷MEo^]ß\.ïï¶?þðË}¬%×µ£¶®6Ë*¥&…ÆcbëõÂ87“†Iâ [öžI§²’·äˆ Wª- ç¨bɵ©!öÈ Á¤A²u…jÇÈZ¬«¢ˆu¹ZÚ™&¯Ì† ǺnÈSòì­³XÁ°AEE&LA0.§ SX`L¶}QeL9dþÿ‰zÓ&9Ò$1ÏÝß3"ò¬ @}OÏLïJ-EÉ$JI™þ€þïšÉÄ5’’‰äžsì}¡Tª*¯¸ÞÃÝõ!ÑË––‘á¯?ÏSTÀ²» ×yÎvÞ-¥ÂfÉÎû¦óPú´?ìoßïn=LëõÆQ,¦E bÇ8w½Z!P®uÄ&´æq½mCÃãfu†Q"ÍÁ4mŸ h Ö"«F5T…¹Î‡ñ4ë¸\¿ºøèãSjÞ?öùá!Ž),ŒCÅ,Ds¦èCÛ¿Šp³€—WÝËñ_öÅ/ß¾îßþ^Ï‚FY„ä'ÎèÜñøà!9k?U«rŠ^.ÖñùuwuÑ]¬[TuSÑ&ÚàLp¾m«"„ŽÈ£+Û‘àÍáx̹V®šÉ:¿\, à4ô à} Ñ”˜ «TΕç,µ>¦œš¶Æík¦Ãœ&\\-¯¯/HòÐG= ùÌfÙ.\=:ˆÆ»`Úà xJÒgé+V/ÙÈ€ifêk—Á‹áD𽝫•ß®ã¢uëE\/š‹í¦[,¦9ySÏó\ˆ¬óј0M0ÙâÔµ…‚•W7îßü¯?ÿê«O~û»oÿï¿úëßýñþ£ÏÚx“Q¦Ýííxÿý'/o\·yœÍn¨)ç¡?ä2^\,_<_}ú¢)KÁ_ÿî‡qêc°Ýb™ }óýûo¿?§*’Q§W϶?ûâSc©Ã©¯»R¹Š–ê³Ëæ³—óþbÚ¬Ûë«Íf»66¼{÷ö?ýçüûßüpšàúreìwO’wûÓÐmtËÅ2ÆFJed@¢k¼ %•·ïv?üxGÊ7Wë‹‹Ëi."ê-\oQèçú¸C)ªt¦Å@ ˆ”µ–èãçŸ<{õüêö~ÿí÷OcbU¦ª*\Ðç]©å4LS=“`ç;ÏY2‰`Y¯bl.V«UÛ.j)ý”T4æ4¦tŽl¨BDBq^—Kw}¹~vµ]vHÇ\r6ÆXCëMóêã+†â‚Ûí¡;ì‡#çZcë7›¶‹¾ñÖÊ5Ï)ÙO^]0ÃazxìwýTÙ¨(¨':Ëij€ ˆùLCùàÌ@UÈE2‚Pœ÷( óT¦9Uþ°Õ# •‹ ZBkëré>~yá­ÞÝ=<íSd4 öŸì‘?YbþÉ"g´+Ä`¼™«<Ƨý4%±.tm³hýåvùòåó?¹y~½\-Z {†ÃPßïÓØ§i2Âî³Ïž¹f{oÿð§[ëºØgc®ú´RJ¢‚Hã”ÞÝícÔÓ … ­k›Åb±M cBô›UÓD{<õwwû§§Ó<çœdšt΂¤ÔŠúóÒsaQ•¹P‘ Ù‹6öIú~äS²‘L©gŸ¬U´‚V€ŒfÒD €Q©Š(‘0WS‹ÕÓÀÖRšušD±¦¬ý(‡ÁZ[*Ž#$€‚€FX*|p¿°ªˆXE"D"REѳ.T­‡S®¹Ôœ¼1†qLß|÷îññp}±~ölCª}pv³ Ã01Ëvå¾üôòù³‹‡ÇÝ8¦ÂÁ:$R•R œÏ4´B :£‹HšÐt-Lsð¶ 8LÓ<$çÛå4ŒP­·ƒ†|t¾c{çu±èÈúqšŒàMcÝ½ßÆa³jn®¶%­²?ôoÞ?½½{¼½Û¿è÷ûyž‹hÝ®ƒ¨|öÉs´FSâÓ0y®®®·ë7P+ŒsSžçr8•ûÇqα¶0c­r áû0Ù°?L¯AaÚ“‹hõþéôÃoÿõ¿üòÿ׿jÛMüþÇÇ7o¾ý÷ÿñaÑF­mt!´˜å\&=S¦¢ŒT­±íý|ã²áƒÁ^ØB¾ Ý:o ²×!º!„‡HdÛ*z€œfEò NX”ª © ‹x«­Õ”ò\4Wmªàù UKj,³`a`Ѧq_|vÓuîß½^s0 Ï}º¤TFÕ!UQa0@ : ŒÑk}Ò:UáʆJkM\aɹA >;Î…ó4+‘7äñÆX€Ê¢Æc•T•(G§AĈšÌ®Šù§Â0gš€Q™¤zGÞÚZyN9f!D5xæÔ¢¢ŠˆTFQB$U©Ì,*R’–ìèü–BëE¸¹l.¶]κ;ŽÖÈŦéºNx½ˆWWëU7¯çná‡a>óaDè)CmômlblÔëìŒ"òz½úòg_¡]‘Æ‚P2ŽV‹ÎÀ"—< ã8ÆÐbµr¡qaÖ©wÂTÏRRãИz΢™µŽ¨F@+ŒcšV‹.„€M…R‘¥Ьq¬Ž@Ù  2z§—íÒ6 ͬý$û‘k&g\&¿´ØB(‚Éq¡q6¾@Ñæ¢‡ý´ꬆÍÂz° ì±pÍÌfµ}µ\_»°Œ©ä’zÎý<õÓ4æqR朴°º¶"XÛ.×€Ðü8§¡BÌÅGÖY¤¤ªQ}h­yíÖ–™y˜à4ä™úd‡•ošµ’“yÔ…aL8€ShÓ<F“r0±sêµÖš+–š)ZlÑÍ €µ »‡ïÿ€¡ëçš+{¤Æ®0ãÛû÷Ô87>~4þXNOž€‚ëÁB4`5ÅÔZi ÔRËœK*™¬Ù^l2C‚’ÇÇiÄñtÌÃòl ªäu¹^Äк6n/7—›æ£µýìÚ}úožÙgϯšˆù©,l±’ ÉYî úÁ:¬€tÿ+¨Šˆ| r&È‹/ÖqÙCj ­—«Õjõ°Û÷ýéáA·«f³]:ß‚(!2 3ת$j,®W] n½^ìö§ãiÊ©( €MãM¢7F8–RR.ûÓ0?ÆqÊ %“2Ÿ†qNýþ¸íêóË›«mˆÍr½Ji¢Ù<{µ½Ü@-<ϦV*™ „­qÐ4mh\*©"XÆŠ¨óv¹è@m­ˆ„,EUDgæ*š Ä ! DÖáà¸ëLÛúCá9•TsÉ\2 ™\JUaDqœqÑ;©<×™+Ÿ­ÁU…Â\X0UàʨÊƾ¿}û¦ßÏ'lÉÖ¤%ƒµþújýóŸ}d5½ýñvšv'Iï'Z·îªí¼fàÑ(5Þê±ÆR“R¡(`œs®‰úÍû½ÞŸ cD-\gçtµŠÛ‹.†3 l¬ó†P%7‘>}usy±žç,Ç~|x8ìžN†ôÕGݧ!îöeì‡ëë‹?ûú¿úÕŸ¥ìÿòÿú‡ï_ß§ä¶›Eì4×z|¸Åáv\÷;³¼¼ÌûSSåËm÷ìʵž.¶Ý0ÁŸ¾»ÿáÍ£‚.:Ïw‡‡§áõÛÓû§T* ¦6ð‹g—±mªH:Žýá$ELå=Gï§jÍ„„«Í L8õòÛßÿøëß}¿;NëÍåj½Isùþõ{Uï›ÕrÑu ×Ú÷ã0ÎÌê‚ ÆÄ„ñØ—cßú£&)SUn¢½¹Z/—Ëǧ“Jå)±À¤j>8îUsÑaà©ãÍfq±õ‡c?ÎS*Ö`„´*$fž“¨Jer&DáÓaÒ €ÚÖ]n–›uÛv’ýf÷ÍŸ¾™Æ¤èúqBã¬sžÉ¨B±r¦FAX@¤”ÚsJ)8çœU@ëqV”‰äêjIô±uxÿðÔ4ñz»¸¹Z.:_ ß?R.ö—?ûOGÞÓÃiß—iNÀÏIZ$A«àìYü *Ê’YŠ A1HÎ7íªk"©Ì(EEæ\æ\4xÛoȤ\| Ïž_-œ·?tšt*g$ÀèÙ^(?YÀI@+è½^o»«‹ uÚ†Þí.~Ø„f!¬Ï¯Ö«.üü_|úÉ cp·ÛßÝ=½»}üñÝÃû‡Ó©Ïïwùö)½yÈ1ºo_ŸÞÜî»6Ý\/Íî0áql]_­.¶«\êþpzx*ãzÚØ=»Ù†¦J¥i7Ü=ÞÝîÞçC/§Iç ¬„h ( gØ•9ka@ ÕŒZß:«YÀbÚ,tÙÄå2"d¦åµl0£f©šØx†s‚®ž—vˆl©°?ŒÆØT U…¹8 ”æš2Ä6Z•Z9³oIE'àŠhƒwh€%•š˜ PãŒ(¢*¡a–Ý!pò[°ïîÆoD]´á£ç—Ÿ¾ºn<Þß?|÷ÃÃþ¤‚+°RÑõI}ÊUÑXÕ P¼C®5§¤ê,ž z$€*Š Mô]×Ò4—TXD¬ïhÙ¹›ËvÑ5µr*•AÐ ‹Ëªº"f®A òœ¬Çõº±1’ÕœS4øç IDATÉÓïÇ2 «¡³ºÛ‚*Òäýè›Ñ„Ác©S!f)EÙk]Œ-fV™­™-²ÌÂJ 6ØÙØžÂÛÙªZ²*ˆŠJ­¸:ˆÑ4 !ý<³d1†i•ª­‚ÞK …$P@вѢ¶Ol¨Ú)V@`ƒ€hTC9³¯ ¨¬ÊÅBjuÖÝʇ&1õsÍ9‘h¬!S&.̬è²k‘Œ!&(¨Ì¥Î³·èq‹BPC©ŒÈª\3*;ëºè@u.ª³ò‡ˆ7žWÚ !=Ÿø³b@ƒ@\p(yœÓœIÁ‘1Ψ1UX™¤ª¨€©ªPQÐ"­:Ó6DX‚ ëÅf½Z5m Á,:÷âfûüÙ¥!óðððîîÝiš\ÍaÜËj™–«ÕÅÕÕÕÍ(1ËПúà ŒÃx{÷à,‚&†ZDšKø6þã_¬Ö›\¥Ž%õËήV18Rå\sÉ3‚ïÀ¸RªÖ rMÓ4c²Öw«0Ï\“ar0ƒö¨,uªlR¡1!aa`‘ `±E-8@âš9 Šñ¦IkÙG‹æiÎÓ˜R*ç{‚ì¶½v´ÁB9ç©æDœÌ@‡â;, ÷éÝSŸâª]®B¬æ2ž†Ê0ob¼zöÒÅË*.ç<O§=§Ó©¦*Írµº~UÒ mSíÂXç­!³Â: â|&cm ãse%Â3[!çœ[¬,ˆ–aÞÍ»„m¬Ns-¥Ï4•q¦ÃHcY)‹Ÿí ‚_Uu5 ³2`¬¢® T3Ž#˜šDY !9T«µûc9p¿Äš½ERc]pÖãÕb 4܈iÔÞYÙn./.nüýn|Øî/ì°¹‚64­ *65÷â£ëÕ²³ŽËv³Z^¯—×ëØ6•l'td¼‹­DUë‡<öO†=ø }¨½±Uä§Uá’¹:®¶²¸6]kƒ¿¿»­©$p`AQ))×’‰0ï}Øl‚1Þ»>§ÌÂ9eBç¬UÀèýr¹ˆ1ÔÊ9çu?ïïïSJµ°T¹¹ºxùѳiçy¬ÓüÍ¿ÿö›clˆtšû* Ç©sb´´Á,X2 ÞØà¼#㽎E‹„&ÄÆ»&r)2Œãñ4§œK©‹Î.sæœj)l Ä`‰Ú¦¡ÍºÄTkHS®Ó<cXôLHÃjÑu‹-H.Éi+ À|~~U¨ÌYDte.å8ì· |¾²ëõÊîNÕvþb½X-aÉi¦¾ÔÞY¶c†^üv²< ÃSQPé;7ÍPMh,-8Ë©Ö!ù2ûÛ]ég CÁ ©X„X²ýÈ¥¨Pð~ŽD¸\o›všH¶Æ†Éà8œJgŸ=»üêç/}h~÷Ûw¿ùÝëûü¿¿~øq÷›·¯ßDo/DúYöiìO‡ùðÔa}r†ÛóX¤T 6o¶@÷»c©öpª¯ßÜOÃÅÅ6x×çÙ ß\6]ã‡1ùç×Ë_~õÙÍÕæi¿sV­c*KVV_u!Fßuñêr½Ýnr†o¿{÷›ß}ìO›uwyÙâýÃ<Γu¼ë™LᜦqîA¹mbXìMßÏ»ÝiÆ’çàp˜cÓ“Áó ØZ»X¶>8rtqH‡cÇœ«ˆbeáZKÕ‡ýœ‹Œ3.ºðt˜œ±µjIꂉºHmÐÊ4¹TÏh<Í#[ãœw¨x6´KÉýñxÿ~§¦rFõÏ=*T QA™ññ)¿þq÷êùãϿɻÛÛÇãá¸hãååÖ…¦V<†ãáÔ¶‹O>þ”ŒûüËW?¾¹Msj¿ZFct¦®kÐ:ûìrª«Eì–±[>¼y·»§ia4,!(1ë*TP•j +@¢$‚PÀW‹p}±ŽÞúq·?6Áüù/?ùòÓ¦9ÿæ÷¯_¿ÛMÓàLlÛxyÑ–) |p#ÒùKŸô‡(*RPsíÍes}Ѽß?¾{ôÞÖRcˆ›õâÙÍêæj(ïîö¿ÿã?¼¾;†S?õS9MšŠ¼¾¯ø®wFSNEcQ;N‚㜂§ÏžÿâçŸn7‹‡Çý4½Ki^¶Ýg//׫†,ã<ŒIK.ýI¦yxxîòÝ®F,ì Zc€T°ZSbPc1É p1$wm4¨š“â"`X…‹•¿¼\c„‹Åì =©3âHk…œAÕ"E4$REʹãnlS¥¾èAD‰ ªX+›U\-ÛãqÊódlè:¯Šý鈵®W›Ív©`ŽÇaž”H'Dd–”dÎ…Ù¨%@aUÀ”!)1…!—¹OÀ§o<~óÝýºµ§Sÿ4Œ9uHvÊå4ܾmír¨@Î%uÆ;§¥…ì KQ'¨Åy¹Zš&Æ‹eX/œuí³Öî/ð”$Wb³hÑÐ2Ú6’kqq¯n±æI¸wTc¨Æ4Œ¤ãiz}ûô4Ã"¶h?˜PU¸–dHºØ,»€* AEjIiN5Daž­wëõrÙU֪\ª‚ZGDx¾ñ¥RK)M£1ÆE×YcT…Yú~˜Æ„H†ˆ …&Xç T ¼Ža»^=¿¾¼ÿ¸Ûj)ëE÷ég¯„ËaØíŽúæû×oß„è·ë®–ùááñ×ûë›íâóëW‹çÏ®À²ŠqÆ&¶Î[ËJ©Baȹ–*Þº6Fï)ù¼k<"Ã|< ªr±]}ô"Ns~xØí÷ƒ!ܬýfÝ®7 ÂýãišSfµÌÀÌg›‚#òª ëe·^zoϼ"·­€4×yÎ¥²‚4H¼mj.ã”O)K)gãzÙÜ\]ÛЈf‚YI†Ó!§æ~˜/¶MÛâr/6Ë«‹K.úönw¿výqw˜ç)ÔÆ;ël®pæ¶u 0N%×£ñþúzóÕúe-zÿôϾþò_üóæ-Àþ¸Ÿçãßÿæ÷æT<3y¢Œ0[_Ú…WçY€J¤ŒÎ²s†Àôã|ê§ØiÛ©)‰ˆ…„×ë"ÙS ÃÂØÖDãQg%7X­Àó\k¡“úÔ)¸¢¹@º’:7½oôˆUNÓœŒóÎ}˜ô“‘4 ¢P‘lðv³Û¦‹ÞpV½U”’¦I%‹šÊˆ Þ†qªØ¢3ñ¯œ™)À@`¬ ÞðÌ*¬Š,vJ*š J­Êgáüÿý©„,Šçv^ Rá”j´ŒA²¢5WP•Ê •IЀ³Ygiã/¾¸øó¯?]­šØ4]×ZB©%—\8Ísµ”SNÓ4ïöã»»qäw÷'®ój9S6Ä‹¨] Ù‘ÑnÕy÷ðØ¿~ûÍonEÕ;ûé«ç¿øù¶s±Ô,ýq|x|šçi»Yn×ËEÛ¦ Þ;ç|c#À P¥V­,•§Aæšs)  Æ¢s.x|–$"•˜AÁ[‘ gUvD©°ŠŠ³h€jª àB Ë€e<åá@}!“³SÖ~¢qB®…@u­nÆ’Ý)¥i_ÇS)â*Ö>Éd¬¹Ï¥/2q4ÚººÌu5%JP-6hšK0]a’REEX!ÄÎYÍóÐÏ©rR¢€Ö±T$°ÖXo\G ïÐ;CΠáZ*©•cŒjÌÀiJ3+R*f™‰ô5OrÜ͓ɩ1`ÎB+§„bPP‰+s„Ž•*ë¹fÂJ‚DH1"£ )Yª &´ÆG ©’¥&BµÎ ƒä" DhMϵV˜ÁNU„ÓÒ77›õj•Irjjr±¾¼‰¡YYc¤Ö<£¯ËeèÖ«ÍuÓn˜x€´M·‹…k¶ëŽùáéqžGoc´Ë\§"HÖ˜Ãy•m×n9Z7œN9%1Æuڮߕ>)cS”SR©\ÇE0/®n^¼¸Ùï†7oöÇ\Š Òq’¹Î\fDÝ÷1öÎÈv®/Ãr±Z.bß§9MüÓëÃ1¿~÷xÓašä47.×<0‚×$¥*¸^.¯6«Æa™µî¹‰¸]‡õ¶=ÆÇ‡qHž³ŒÖ·¯>zu¹]£d‹zóâz{±E„ǧÝjé›¶»¼¼ª9ÝÞÝ?<j‘ewÆbëí²mÖËîòbus½]´qÆï¾ûáõoˆìG/ž]]®ÇaH¼ KáÊ„ºÙ4—Û?Ú~òòfÑ´·ïžÞ?Çq~|#«BtÔç¼W f…Rewœ+39¿Xu›u·éÚzS/VöÝ=ŒI’xkêñ˜Oól –Zû‘‘Œ¨¢äíÊ~òÑÍó›mÛ¶ˆâŒZc¬=ݾ?¡åB¨ÛÍçŸ}L¨ã˜¬µ%Ïûýá4 diµˆ›Í2=¿Ùí§Ã‰‡48KÑW.µ¢ #tj¤–²;ôß~÷ö÷üѹˆJ›Íúêòr½^†à¬…E×›µܾ{×4v½l>~±ZEø®ŽïŸ²‚ÉE§i®µÚ7oocðÛ¦íÚ&\n—¥ŠµS?JbÊŒ5³ô¢¥ˆX%kM·8gQUCHHd¨)ífxxœÔŒoJéûÁ|÷úýÏï÷ªu¹ì.ÖËÛÛãýû ò”¸ÔÉ  ˆ ²‚*Cå(ʱk\‰¬Xo6~%J§ã$\ïß? î­·Ëέ:ï\ÇÊ™A­#PšÊ9†â­÷‚d¶Z,«pÎê²k6«å0懇wã4¬×]!6¾i j%ï0Ã*•Y€J…RED C¦de•Ù¹´Zš&KÉER69[a/`TYˆ”¥æ’çj˜PË\Ò\ÓœE`œ…ÑZDŠ‘ÆÄ…©ˆC²ÀŒPP }À½¨"ApèŒ*T>ïò“! Pi#]^„ÊV±¤œ¬5Ÿ~zõßÿŧöõ§Ç¾ö}ýþõ1•“(/󀽫Sf‘‚Hçã&!ƒ>Ä‚L³¢ ¢"6º‹‹íbÙ ÀU£ (ªr?‰IyÎ H bH7A ¬s*L»Ö/Zj‚]. sšr<žÒûÇ¡²”’¢ƒW7«WÏ7‹U4>LŽÕšÑÔ*@‡^,Ãó«ÍjÙœúažj.óî0úœyù|ñÕ/RâÊ5z–šjåiâqÌ©$kx³ö——Ëaœû»o~óÛïïžæ‰½bp΂X4t®V×s¸LÎÈ=š¤DÔ8¶D ÕÁÐxc7íìÜÝ!ý»ÿç›ÿï¿|óü£‹ÿãßþÿgóo¿øô 6+·Ú×)zÀrnFªAa,‚Ùì, PÖ ¸@­ÈÚ‘ä\µ`ŒdTõJÂN˜@Œ€¢!$VTE*Œ„ R˜$:kÙ`• –)B±,s*S.³ž$ì‹7+ [Ôøñ€.Ôìóh±†`‘œ’9¯ ƒªâ9&)  ã@ç|_NEKöÞnV­5Äeš§qN•Å– ¥ˆAc¬À¬ÈJgÚ*PRª ›Fì˜ø4È0Q/dkbÙÉèOù@€sšW~J‘ùà=R…Lç ¨¡1€ÄJ –EIž»d‚ˆQ Ô[h"u­ Á͹œÆqÇUœA­u†§ã8¥ú´;þþoß¼=<ÊqTÀ S0ˆè,:#¨™„»ºvU˜nïûû÷‡×?>Ñ|ìçìC4äOÇþáñðæíí4ÛÅË×ÛU]òb±P V!«Ö‘3è¹2÷§ýÓþPXåC?ÁXdF…3 dÀµ¡(ÆŠ5FÙô‰§\Ñ:¨Ìiž™eE®Y5!ø¤ZÒTA#3Eªi¹qÓØsåH!aNyt¥Êéc2I9É4˜ŠœfžÁAhÈš¸¼ˆÝÚG×4a±hMh(®·Wù°@²¹VÕ h-ˆSQ°AŒŸ¹‡š’õ>¶1¶÷õÍÂ9e–‚\JÑóÓ®!M% 3Y/Ö0yõ(ú)ÏIE( geCÆ[òHfž¥"䄬E$Jdlð&4d ¸Ö¶jŒ ž¥f©YŒþÆšûy<Šñ­T߄ƣE±+‚ÚS­¬õVU–ž¹åÖx#¬ªÃ<Žã#¶u¹Ý®ZP®Ì“„ÙøB@µæR ŠƒyµT’’•Ôb0•Ãîôí÷·?ÞÍb| -ç%‚s$\EA**[CKF±æüM!DtÁNIJ–Óœsª1"”Rk)9§ižEÚ&6±qÖf4†jÍ¥”Rj)’sfa$Ñ‹êt7½{{[Jíº…1v¹X.»öb»&„‡ÝáÍÛû¿û‡ßŸŽÃr±øêgŸÿêW_ÿ«õ?t÷Yôí»Ç_ÿÝßýðÇ_ë¼SÕÓñ8N£#‰ñÇ ßîeÏÁ-ÖW—«Uc­±Hä’ƒ©œŽÇ”³óv±hàœuêOCÎSˆö¦Ùˆ(æZv‡Ó8çǧýõ'ªfV½<½{sË%-×+5íqÄÌ1×sÀ•úx“îÅ7r½Y/}#4MiM\´Wl–rº•Y´ë̼ï‡2—ë‹øåg7/_½úæÛÛwïYDh˜µŸÄJÍsš>~Ù¼|yùüºýèÙåÕå6e9§7oîîŸúÓ OOsæ±qi»‚MçkšO§ÙÅnµnEÛ6®– Pá:9² ,µp1>ºf£uf i¿èZƒ8Ï).ÂÅj±ZµÇ¾g.>ئõ"åýÃß¾ûñéirÁÛõ¦‹ÑGÑÛe×m75ôþa÷ý÷¿þÍ·O»C M×vªXrE”౉5z,sõ±‰«U÷ò£ë?ûå'/_\NýøþþÁZ ÎXCÖ@±Þ4Áƒ)óñ” k{Ì»ýt¹Yt×¾ ]ô€Tß½?–^Î(…1ÁX"‹•¡$q&½¸´ÿíׯþù¯~ñùg/ñîîýñpœ¦ò¸DªJ&’è]ׯÍjÙ6¶²uïß?>>”^—«u. ã<³jÛvëê γMÆÌsâR¤ÊùѨÙíÇüÝ«®ûâó/_~~u¹éZ_jÙ,Û/¿üÔÇöûÞ|ûÍ·/n6ÿÍ×_l~Ñšå2œ†,:Ãt<Cpö4ÌÃ8§\W«ä¬ß¬:D%–SsÍX ´Áw­%TQ2Öyç sUÉ ªbÅPpÕ-—íÅ8æïÜïŽO¾éœ«œò¿û÷3ÓÇ/¯¤i"³ì 0Ä`KAVóÓ”ˆ(ƒ 1¤€Z³º]Åõʬñb»rÖÇûnèûqw8͹œÑ ®°ZÆÛͦ¨Vc0zìÓ8îyÁ´è,‹"3HÁœ“¦Ó:JtÀ%¿y{º½»[,›ëg›l©iN ²AXá8Ìó\r®ý •@PFä,æÖã²udô8è0s.Ègµú™vEµÎy ¥æz.lά\J>Ï5qk©ÒEŠÑÇ@ãfVÕ9¥\Ñ缄×[wuÕnÚ¦{|:Ç“‚:ÀX„SÕØ„Û›Í8•e)ÃXRUUñŽ˜s¡=Ïã=Þ\Çww7iÖÏ÷‡?}ÿãÓËÞyW”ªîŸ_Çíúx{³k»Acë®oû®s¦µf­Kç4¦yX&$ßÄcàK^ù²Ö‡Ô˜sÉ&Ó%’ ‡"4)fÁQaªµf¨¦5ç±Öž»6¶½ÎS–eH5Õ2‹º¶åv}\R4…"iÕAü 0JÍ&p29–l®Ýt]ÓöÌΘ ЪÙnß¾¿¾»kW[rÑ»ÀÄÆÀh†j`FA±*9°ÐÆÍîºY­BÛÅØ6±ÃižkIEÀDs.ì.ú;+¢K)R²7`rˆÂ jR4/X0 e˜Šxâ ûªe)¥ÔÐÑê|€à]#:O>Ô85lìÔq%@ ðÁ!2Ó<œ÷šGÈ€TSuÁmZîÈVR]µý&ôR¦S±>vµ7h“nàÀ9™²/S`«Ì»ú®8؆è€@­‹÷È­9j *Ë©<>çÉ̵Æþ¯Fm»0Æ.ŠkPA¼èɉ]U«¥”R§i™¦i§}äÍ*¾¹Ûµñ Ôæyö‘cô—­_ö^U}ˆf¨¢à.î\BÕKS› ©jõ‘ ½cÏ®Õi^^^÷Ë4^^ >ø9埞^_O]‘ðoþö»o¾y·ÛÄ «ô›oÞûÍÛ?ýáÍÿãÆãs®âA˜ŠU[„žÒ¿|œ^¥ÙÜÜÖ2áu¿ÛnÍ4•¢5W5ïCÛ†¾s`¾d-E–”Tµï›ÕªÑó0Çe|:Oã0eï""®]C}Ó¨Â8ÍsJe) kîxN•ÎãRʼäZëEnO¤L*_è%0/Åj ÎÌ5È@ ”R†Ó!ÅG[}ü<}þ|0×CMpš «9"D4Icþ4Ž“Eüî›íw·Ž€Bܪ7RŦ_ݼÙ\­W¹¦Ã™v+Çèý«7û7¿%ó¼¼Nä† §T¥ŠC”"­ÇÛëíÿü¯óö®»Z¯6ëÝóË ò8Ïù|žcÓìÝr³Æß|ÕoW~IR¡»~ûÍ»÷ïÃýýÇOÓx&fö® ›uÓG¯EqκÞÞýª»:ÇùÄŒ]»Z¦áôª«6l7»~Õàùœ^3"8ŸS–ýi:õ<‰÷"·!4ÁÅÀÛuww{ÓµíyX>|zúó_>ýôáuÉÖ9:ÏÇ£ ãßìú«m½éõ8;Ö®u7Ûîv·êbާ*¥‰n·mNSË©èié=¬Wq»é‰ˆyÆååõôöf•‹tMÓ´}ÓmŠŽ¯‡óë>çTY L¬T vïß^ÿûûæßÿ/ó·óë¯ÞߨȪs÷íO¿¼Ïù4¤¢JL:œ‡ãá¸Yݼ}{š®–,j9k-8Œµ–áÓýóÓËëá”Æ¡¦¹Ôè‘‘gI"R.’X1|y‡S×}÷ÕWoÖ}Îzµ[ǦϕþéŸÿüñããº[©Q×ôíí<’þ|>¥Jwµs«Õ6ç%çZrÙ®×ë7×ïõæöz½Û¾<¼ŒO/Ë<ëÕ¶{w·n¢±cºaÖ——ãá8ƒÊEŠJŽ|×¶Û]së®oîÎçœkYJŸ_ÿóùÃÓã»»ÛÝù4åTK% çŒD/O@ET45@³jZ ç«mû»ß¾ùêÝêíÝúêz'mÖ]<#:×—Jìj‘\Êy,]ﮯú»›æzׯW«ý~Ú®>~zS¥Tk."‚bD¤Îáêjûþ¦y÷f½,§§×Ó0—Ø­§I–e)9©á¼èyÈËRRªÃ°ÎÓ8—Z/¾C ÄM¼VO˜‚c5F™©E"26!Ff×D‹ž<²6‘=ˆù¼@ʘ)˜#3b®U `Õr«€\™ J’M­¢!¡V°ZJUC6ãy®%©oWWW­÷< ™ÑÜË>ÿ×ü°LÃãÃéõu9ê‰ ,¥Rk6ÃRÈÀ!"^¦D&„`fË<I°[E]–"Xðt>§¢çó,ÂŽ LÁªÃÒµÜ5nIsªõ_©E™9z½í¯¶›Ó¹êó˜²fEƒª–‰Æª´î=‚nÖñ.¯Û¶Š÷´îâ¦oNc9œÇaN‰RæR/ÒzPu»¾Ym6Ìaóñ4ýðÓóŸzzx9ãÒøv\Êyœç4Ý^mÞÜ®J™ï_Î5Ucv!ºRÙÅ\‡ϧûûçýP]³iVk„¶0a$bC@"V¤j Æ |Z¸©äœkÓÐvÝ^mº°îÇâZŽN]ßæûýÃø/ÿ-xþýo¾9Oç¿û»ïŸŸ ®³À™•48LÎg²TS%öÁ@UBÛUß²Á—BŸ>=}üüXDסÅzYjÚw‘ÞÜ6«–ÐB„»Ãúêªq ’¡&—Ó~³Ôuìú¶C+Þç½³j ˆ,ª‚𿬳áRÕ0K;;%,V+{P©ãxz ˆÁEˆý<Û¸Lµ$öL„f`ä)8)iHù•r13£TuR8WK&Ål–:ZÁ~˜°›TBX9l5ĉ/fjBQ#àÀˆNÁ7]»ÞDçïîÞ]ݽsM+f&fRr­Ù¤Ô’Æa<œO¥ÔUÛ*Á4-ã’²¡ˆÌ³Ö*)IÑ’ `ä…1›‰¡`BBÌ …Á5šsmÓw:_EUª@U§™!P6M%«1²CÓš–i9e:Q­ b ÌLÇœCfCðâÚ¦Á>DvÎÀ „Tìööç%‘w!x‡”s^湪ó’ÒBÌëÍ&?MÓO?ýüãO?ýö»¯û>2;húvs}»½{ï¼CMd‰e!°Rм‹½_iè¢÷¤ŽaÕ·›íÚ…h·›u©¶ÎÛM—–4Mååõüz8Ân·nÛ8ŽcÊåùåøzÆ)…:ïÙqnvmdGÞ K.µ–r<ÏÓ<9*13×jäœI ž-:B­E!©iªµ¸Z¨”Rå¸3-çCå–â[Ie’BÌ€ÙDÑ‚wž@¥‚¦¾ ëõF)¸¶ùêýæë[G¹›†—Ê>sŸcïnoúw·›ýiºzz:J¥›«í8•×ýóÇOOÃT«y$‡„}¸Hõ,r{Õÿêë»ß~÷ÕõUôÄDˆÈ9öún¯®î®¾~Ó|}×oÖù.¬nw7ïûõf™¦øû¼¿ÉeìªiÚM¿º½êúÖ©V ·ÚÞtýf½m÷OTÌìóÓþ<¿}³T¼ÜÏ©üòéõáéÀŒëÕD„Çã4L2g]ò\jBÔ&\­ºnÕ÷!ÄÃyþóþüÃýÃËx‘ ¦gÓ‚„.¶ÝªoÚ&8X©£àeÛóÕ*´Þ•¥ó4—üõUŸJ Þ-ÅTjðÚ·n½jÚÆ§\ÓfÝÑœkIûýþógçк¶IÅ>?úp¾ÆIаGF@±R¼ƒ··›¿ùÝ·¿úæ+Ïþ¸?V)KJçqùùóþ§ÏçãDŠ¡N˲?œ^÷Ç뫾_/Yì<Ω‚(Ωԧãqÿñ㇇Ç×aÌiQU ч‰ˆH MÍÌÙ€]ˆ¡íBˆ ‹§s¼Z·ÛÝ:61}|:ÿý?ýüýwo®·›UˆM׸ݶó±{÷î+×÷«àݪïÞÜ^_í¶ÛÕjÕ©Ö×ýéçç?ÿðùéåtssõ›ïÞu-¡«û§áÿ)çÁ±óÞ¤šÕRÏà P~ÿÛ¯ÿ¯ÿó¿Úö?þòùþaóù¼LãüúrÎÓ¸¤qäh諪]‚'—é1ª•¥‹õæ:~÷ííïóîöfíNSŠžÃ’óVZï¼sîxšŸ^§q¬&WWýû7Ûï¾yóÕÛ»’ô·¿zÿá~ÿùéøùéuœS)–RU‘ußüö»_ý«ß¼í;÷øø¬šCˆó¢ßÿå³éBUðe??ïS.X+”"UM”EÁ¤0×Õ*ÜÞto®bëµ}ÞçOó~CŒ¢ÇŠLš&vmˆªaÂÞ fRPSA3vˆÃœjðüî®C³Š(¥ê0ÉYk. jqŒL Eµ*˜á—ŸÊ0$ç™XJÞç*ÿòýƒ|o9çš3!jjh—ýƒ|‘Ã_þ Ì”ºÆ­zWqÉ¡(¾¦RM <ƒ)è|í£÷ Œ‰ñ™C³Z§i~9¤Ã³z…0g^Šå:§¬Û9VZ÷MÛ3Ƽçaù|¿?޵jÕ`à€=áEdF fÇ1ýøáIµ¬»öùåøÃ/ÏÏÇ\ b*úùáµÖñp<ü›ßûîíõÕõÕë˜å\© ¼¼ÎÏó§û¤¦jÚõíÊçª9 98uŒŠfµâE­Ȇ|qWƒ*z5\re®žâ¶[ݽ½qíêp·ØEW‡J@HÀf Û¥¸  Š(D9Xu¡kBÓ´mCˆK’§—á©ã”ó¦ ¦2LK-©cG ¤`‚@! <îõñå2|û¾ýõ··}›& ãôý_>ÿÃ?ýøáãË4U0^uq·YE¤´jÛwoVß~urýOÿï¿<¿¤§Çãg‹ë›†«æ$3{‚ønë›÷&€]Ö­:}}½ÙíBÓ8æ´¤4{æó°üÃþ4ýñUˆ±1ÕišŽ‡ãñx§\*ñlQD46~»Y5ÞÏI†YÏç¥Ê¸nz·ê{Z=˜iÍ%ÍØ‡EkF1$p¢¦ J-Bn]{ÕÐTò(µ 7ÛÞ9ÏI¼Q4“6âõ*¬gêTýû·×ÿê÷¿ÛìvMßÝÞíÖ÷¿üüãËa¬¯)˜H×ú¦ ë͆Cs<.ûýñtÆŸát:?<î‹ bPµ@öæfýöf%y9ðîfww½ÙôݺkD$ Ñ¿w«Z×›–ˆ¾z{óõ»ÛèÁBŒëÝn½¾2àÇ—ã_~üðÃOŸrµÍf½Z÷Ìàî6»÷ï®»¶yÉÓøºœïëø$©i¦3‹ûü|ÓVç9Ÿ†2ÎÁ£w”r= K­B󜣧_}ýn»Ùèç‡ýOŸþù?ø|ÌÕ1Gf®Ë"uqbÁxX^_Ξ­íú®ïv+¼Ú6}ëLm?~z}x8(@~³j¨ "AÓÐnÓµÑÏÓ4 ³ÔºZu4/SNéõpšæyI:Ͷ?Õý©” €{rŽ –¢¦%¥ñx:Ý?¼Þ~-yD†ã0ÿñÏŸÿû>ÿò0/Õ#±Ö„N²À¸è§‡Ã§Ç—%•§—Óá8›ñ´|*)§4×Z¼}Ä¥ˆ9ç ¡ä""—’˜©hÑÊ@ä8¶‘ŠŠK•”jÊEïW]—RùÇ?|ÿ÷ÿôc‘úöíí¿ùŸ~s{Õ;Çw·WÝj{}wãr^ú.þö7ß}ûÍ[&sžÞ¿½Ùí6)å¯?Þo7͇O»ÝÕßüþ»¾å%MbŒ¨Ÿ?u/ÏAA]Àšêú›òí±ùÍ7Û÷oûpßýå§õË>ü|üᇟ§´j]Õ€.´BU3„ Ç[CYuÔÉiHËäp½jª yÛûÀÃ8æ¼D1ºœ‘±æ´(;Zu±V[÷Ýæm»Ý„ë+¿YêQFt§ãi<Ÿ×ëþo~÷æ×ß½­%½îŸ‰ÌTOÇá<Œµ$ÌÙ^é8H5o˜½Crª‚–V&n=^­|àpZR¶q¡%™óê¹¶Ñ2–”AD´z`0Q,U#UïØ92¢\+fh#ÇÈUJUi»°î=£šŠšË 9çTª¨²!¢!:T!0ôž›&Ä¢|<ÓRJUÃRä<ÍY2;áËçUÔÈPíËŒèRt©VQ5ïBÑyTf Ñ ¸¥Xž«)€yB@‚P ‚¥dµš÷Ñj-VªNËý}bžrD EnÔÈ´žÇжœÏâH¼cvÁÔ”™«Ña(ûcaçZ FÔ›*€€ìOeœ——ÃÒÅ0œ§ýq,Æä!¨I©Rµ2¹íjb[UæiÇyZðp*û“-ÉÕÒv¼ÛyF)i’’ïš6VÑTU ѸVUE F ˆd* ¢,š¨CY7ýwoÞܽ}—k¾úøøúx8ÇñåþñçïïëÔÔÂÙÎ~-ëkãvβ(FjR1™«wëÒlµ‚†Œ­‚äš—²¨–@>8rŠsÎf<±ŠVT4“*PÄ´*("°V¬J Μƒ‚®V]–!¢4)R¦Zï~½[n»ôÖ_µí‡ƒÿåyuŽØ]¶jHЬ_„ ÙÁYˆ]ÛÅ6åT§qžæ) ¸R­*zÀÉ¢ÚÒÙ_Ù„,êEM É_T_t)Ž#¢™©}ià_Çÿ €†"‚”»FovñÝ›õÕ¦k‚±ó0ŸÓH–¶=­šàÚÆ Ð;ž’æšÕ¢]?p±†*˜¢Ô ù‰˜Á–e¹¿ùÏÿõþñ?Îo¯¶WžÔT«Da̬â§ÇyÉ]×ö]£Vç%}zxÝÇ×××cU#äRªs¾k9©[re²uïn¯c^ªTôÁ¼£¶‰ÛÍZÍRb׆ۛÍá4H)]ï`Jùå0¥"×WÓ›ëiY–?þé§?üËÏO¯C×õ×›uÈ 8gÎê7»í0.÷Ÿ>üò§ex´4xtFÉ|<ê§—U \ª¢H蘤J•·Û4o®w»ÝvMLŸ÷¿|:üôqÿá~:ž•½¬"b—M³ Ï s–’ Xnb¹»îo¶›¾k˜9åüürúËOŸþòӇص«UWK‰ÎÖoÛ¸^·ëu'µ¾¦‹T)gKY»¶ñ±€§ýááyf§¼ó숀.n%ô"òº?ýøËG3’ó<8ïOÃò‡?}øñ—×) ÈTš–wëqüåÓáãý!çe^–Z•ˆ˜)§4Sßµßýê›ë«Õ0ž__Ç¥¸4'“ Ì ªHU3ÓZ…¨H™–ét>ÏÓäWÞ r©§ó 6Çá<í÷Ãç‡S7Î釟ž?~|þÕ××mDç輋ggZv»»¯¾z{}½¦“j+€ÆŒ}Þ¾ÙJ ͺ׻¾?Îiß`.ˆÁg©˜Ú6èx>}úøóï~µís³ÓqIÓËþð¼‡Y’p–Ö¨E$ürŒc0#Ð €FÍP­Ä`}ãLËýÃaé^wﯮ¶è˜§1/9å Ùkð=–bŸ>žŸO9Ißv¿þö†°®:~sÓ2ï¼ïºv5çÓéb¼ºîÓ2çaH)Ë8¦%[­2-:Í5gK ˆ¼Ã ’33 A»hdu8Ž÷PÃþœ_Ž :ÆMGo¯÷²?¤e©ÓTK¢Òr MU— €%ª«±`434‰7½ï» çÊĘkò¨ˆ{‡kšã<Î*JUÌ€¸‰±!ª÷¸ê}ÓˆÎYs2©f`"à˜½ìR1­UÄP/îs©U…LùRªDPÇÄ `&옘S•"…Ì‚Y±*ì:#9CS"@´%—œMÔ³ –HÔ†"5±ËSö¥²»¬,.¡y®5„jÅ/t÷ªXÁµÈÁœ) 0Ø%‘¯F‚MIšªyª¨hÔ8P‘Zí¢Ñ>øªþþi¹+/ûýa9¸?JÑŽüÅ%_ë„Óyúé—ûýá|ÿøòÓ‡Ï/û#p³Š=¡›¦1§Ø)¢HM©˜Ññ\ö§R*ú¶»x÷f»½Z ÀËaLˬ5³Ÿ’íÉ V}l›àœ/YÓR4W3¡"nXÐc­R·q]xã}®µ,0¶ ¨TØ©Ã<.)ãTsfvÙЉc Þä²%£@.¶wcÅ#%räÜER€€Cäçjy,ÑYƒkÜ’kE\  0ªÕ¹¤YK LΣ BeöW7ï¿ýæ·WWwÞyUÝ¿>‹èæj·ÝmœgrlˆYŽˆ!{"©ª€€_êÚÇa¬f›uŸÓ|:~þøÓ?ü!/ãf½‹±ïûÍÝj½^mDê4M%%­¥Ô\j’iÐ2§Š˜TаBPÐt]`¦ì]¡‹C0òä\ÛÀ¬¥T©_à˜e.y6€š#*6 dIó8ÏóR"4-·kEgKò \M± Ü®œóZ,—³Œ'±gÙ9èLyWW^Nç:ž¦ýÜç­R­X*¦–ªÕs>—xݯßHìçRrJËz{—FýøÓÿý~Þ.ö;C¸4¦<á¥*†t‘æá V@«‚h•i)Ã4æ¼ìÖëàÚZËá¸ÏuÙn·ëUï\Ø{ÇŽ™/Ì]ç98G€µªH5US1@Tu—~)…™blZ@B ΂jæ »í&ÄbðÞÝ?<Ÿ‡¹JÙ]­ÞÜ\½¿½]¯úZË8Žèèöæ¦m»iœrZ¤d5W‹–Œ¬Ú{ˆÁ³)£0ÒÅmœ¥¸ øŸÙŦ1°yžÇiF•mßjÓl¢ÁûÍz—ãÌæTÌ„ T¤.IDZOiJâØ¹æ‚±q*>°Ab‚ÐÇØ­´[–0ÌK­P.æD.æŽÒ5ºiF$ÖõŠÞܶ§qœæ‰<ï§ãáD Ëòë¯ß_w«í-zæFmÛmún·Û¢#xy>üüáõþq9œä<Ì@¢0gMÉ]ˆN²Š¢˜iEÈM°¾óRy,‡c¢¥`ª(R»(ïïúï¾ÞšŠ›æ¹ªfLš*VS! H•#pPɤêÉ6½¿ÞuYdZ­Y¤Ub$d6#àÌèBú€ËÊ* ¨ÔšmIeX¬T6%D`Ʀ¡èÈ´iª9 ÞÇF¡fY.[a0C¸ôU,W3¹k… E¹T2cû¢jÆ/ÕPÄ,ÕªY»” Ñ#ĬX§r¹Ì˜ B%U†KWšÌ¨ˆUEö…îrI®€è%!v¡œ˜^r8è9«æš=jã€Ij-¥’¡7`«6œ§çùu½§qZŽC>O0M&ê.xÄ ¦€FŽÉÐ¥%ê j5ÍjHà¿<©ˆ—RL…Q£ëõ¶i¶/ÏËãý‡õ¶»{»ùêvws¾~w~ýòùvŽ>'7.ÇYÛSå> a»]å\ ×®—lÇaÉYæaÓ¶ïqš%/¥VªêÄæÚ4ÚµLNÃ|þå—?ךŠêíM¸Š¡ïZï\Î)çœÒ2/#äÊ¢ËHP( ˜çó æÜÊ…Øu1´ADMÔ ]Zß4±éû««k¨²|8í_æñ<Íc­‘Ô€DAêRkÃ1©KžªAâýú:ô}žFÑÔ¢Äà·MqÎ\³ÚlúZ†é¹5v}Cž’dÉ3*„WÛ°¾‹€¾«9M§¡ÌÊ H`fU¤ ‚"œ©Ëί¯vûæëõío~¹Çÿç?þóßÿãýBoâÚ©Êe£‚„vl\a„ÈHˆtéïªU¸ŸÆeœÇBçç¢ûs:žD^õ!xZ¦9ã\C¨ižæ‘ú>n¶›«Ý¦‰>†øü2œÏçqª ûÞùN1>/U^ê7oW_ßöÛMŸjì÷cÀs CÇÆy`׸ÈÎq×÷ È^Ïç)Íç”´”‚_oWm×ÏÓé0ŽÃy˜™¨ æyt·W›ÛýqbšÙ‘÷<-uœ¥–"Ó´ Ãøº÷Ud˜Ò燗§§×ÃëùÇïÚÆ}õÍ»õÕ.Dsœ‡súPÄ8g Í «JMi)뮹»Ýî¶Mpðüðøpÿøñ—Oã44Ûl¯wëÕõÿGÔ{âªÔ¥žÐ†"@pVü—¹ãfV4ã‚f’àˆF£ñT‰¬ÊÊÌ«C}Ê‹È×SfµK˺V‘æ~üœß¹¸Fö_Ž_Tw%e4ˆ`ÑXB#Q$•™Ý@–˜PQ³e´Ž§žŸ¾ì¾>NãDD ÎAídGIr†R²H!«Dh)‰Qúøø|¾ºê7—7W×××®²ÃÏçÁ^nVw·××WkÀ,¥XcÖ«%÷ñ~×÷ç“s&¥Ø÷çÚs]±3 š2á‹ËôE¿Õ’KŒ1åR·5Sõåóý§Ÿf÷׫ëæöæâÍÛËËËæêâÔÿßÿÏÿ/§u±X!©ae’Ê£±¦cúüð˜b<œ_¿nðÍ›ÅÝÅåÔûíóaÓEPe溪 ™þ<öÇE³DÄý¡;ž§Ý¾ûúu{8œR)̶©Í²5–Òn·‡Îzëše?–iz2—›å²m@$L™˜5"Ú÷C )¦bØ-Úå1ŸŸžö¥ÀÝÝ5²™&mêöîæêØ ÇnH9ˆff2 ¦Æ~þ*jë¦êC|Üž¹?î{œŠOBˆì-!Ѥê `[À53fWëź¹¾h–m*Û4®ªœEÑ)JǧçÃv>ž§~,l°òÆùª®&]¶Õ8‡C÷û?ü"*ç!­7Ë’Sw !Ð3€Pö˜RùøqûóûíþT¦PÆ)y«Þ[$d6È HÈZA@ AaRBÎc¢n˜fx› ]­àöÒ/j{W/Zt(h‰±¨$fRôcà)A‡€ŒÅ;X·v³ð«…M‚Ö˜ÄÒb?Æ"C Õ ÑÃKÛ2¼”»P*éÜGÂTŠ$!Q§`ˆ«TÒÎÃlŒ (XET´ª~¾ÿôUûèÆMý9…À†OC÷uûlë…uuåü8 c7€™Yž¨Z4ÅÔÏãxîÇ㗇χÃñb}Y×õ—‡O÷÷¿Œcï«ÚXg,è0tÌ<ÃXRIý4H°Ä蜢˜BI‰]ôÕ¬©È¹4Å©ºóqì}½XøvµZ_T¾êÇÝñùaûé—q8§uÞW(¥ hŽrƒ¾-Z&ËŠµe[Yf["åaXUì} Ó¦Xªš oœ¯˜¬“”B8 PöˆF Åp8Ÿú)çâÒ 2²¥ª-2ƒ)ÖòbÓ,6µm­PNRªÅfqñýÔ­þã?øÃ·¹ ¯‘aDPƒ HóyLµ"")Ò EAg¨!"{9žÒÏv§S¼ºX,ZPšÚ•¢ÌÀô} ‡ ³•¯šªb£©¤\D ¢â ”TcTAqƸ‚‚äRR?æc—DD!†Æ1ÇTФ"ý0÷×W«‹Íz±¨A%ÆJ. L,9OÓ@*•ócNý˜Nç!—è¡æ’£‚r.d ÕSˆð¼==<|-¥8ßžûéË×'øöÝ›o¿yå+—‹Œ1??î½ñݪϥœÇñqwÚnÏ%ªa&£ÌP£`T.À (ª9•R€œsuíÚšÛÆ®7«ÛÛ›»»ïÌ8„ã±ÞížžŸ»aЉ‡Q§iÇíDU¨7°¾¨W—Æ#´•oBaß.Ù2Xy{µY^®WË冘Ù`U5ÞUA¦q8]*Åx;ÆüáÓÃÇŸ·Û*nÖë¶©ŸBÌ%ÒÊ£÷2¹´¨”˜A1ªVk·lì4Åû·?üôþxêv‡áñù¸ßžºSwØí¦Ö—àVWR1“!ßçé¼²B.š32bUñfSÝ\/–­Óø°?=|Þ>ï¦D•˜”Y “AfJY˜À20â²Æå‚™«˜|L2†òùËþîöŠˆo®ß~óêÃ燧mJ¥ª¬1¶ˆŒaR)må­%ÃxuÙþö·¯r¦R¤ä!….ŒÔxs{ås¦@„‰J)e~‡,b½àËU[9c ®¯ZøËo–-ƒrÓ.V«öÕ«‹»Ûe]›ºj»^¾|½X»aÌ‹¥!ɱıë&b“¤$‡ã`-Ç0ŽÃùÕíåÛÛÍŸ}ûz¿ßOã”ò!e, ̼Y¯¯¯®+Ï!¤ív¿Ýî??¡Ì*ëÜÕåJ7ëÚ[·jÁ™¼;qÝ,¯¯na¿Û™Ww7•·9F$$EÄ¢ R$LAŒ±mÓ”¢ŸŽ_ïÿÃÿûŸþ-fûæõ­ÙíÇ”T»"%—bÊ)–žvç”?¥œÏC8ù8蔌 U-ÖÐåÊ[ŽûSßA® eî·šGÍÊáÍuóún¹l<#4U½Z5MÍ@x8YŸúnøôéˇûçÝa@Pç\)SI¹,þ¯~÷î›þúx8‰è‡ûýîjoŒAT 1ö]È }횥 A>|<}úÜÑ l¼(Ô¥(Æ2KÝŠDÌè§H!JQÊdÔQyÊšs±VÑXb.9OÈd6‹ERwèò” ‚!2€’ >Mù‡£ùÜǦaâOç÷Ÿß|sù?ÿ»¿|}sógßÝ}û&cyÞ üÿéîøÔ÷ƒ1 µ Ã4•½q­Yxr$3tÈ2‘ﯖ«¿ûë¿ù‡¿ÿûo¿ýfµ^f (iºã~Ù4W77ïÞ~s{}wuqUU•ˆä!•ãi÷£ƒ®?=í÷ST"ag7›W×7Õ¢}>íw§]2€{ O©œÓT‡‰†e}¹Y@»Ø·þð%Œ‡IcA /A‹Ži …‰Œ¥â—!IΓXA‹dP ôOU¿ÎððBS€#2Ωv;`ÆC‚€Š ((*¾°>E‘àü$ª(1XGÖ"¢æTº~œbé‡TµÎ8D#JY$„˜j ÓJB!Ì–ÒŲþîÍåÛ»ÖZ©|¦>ÃáØQŒò¸=~¸ßmSL ªL¼hª¦ö)É4Šˆ%k‘´JO]R(EHµ2Yå…8„Ð !`)j¦\ø%Ò,ª ÆrÝQž:ÖÜTµwT@»íþ¼…2õÃåÝÅÕÆˆÉ’#—b XbcÈZc™M‚¢ ’ER,v$KV –ÞǦhÑÔДykq„f*YÁßXßN“jI•ŦB†BŠZ•ñÞúll,AP•TT5+‰q¶2ìÏ]ׇ@Ö‰hCIQ¡X±Æ>¤X·õju}s½Y­*cš)ѳVRžRìú~ŠiÂðØ=íÎ_ŸwÌXÕõÝ««ªö!Åã©§©]¶«Õ2—ôt8ôSìÎSV•’Ë”J,…D¥”i*„bX—‹æööòêjyu±¸¾\Ý\_Ý\_ßÜ\µM¹”)ÆÝîøø´}øºÿéç/ÿòÇÓ籈9øÓÇ£ üÃ_ýæo~÷um! ®šrîú¥ÔÖâ\ æ RÀ°EϪÇã©ë¦ÑzwîÇ0†ûOÛíØ\]n®¯6Îà¹ëªÊ6•kj'%•’@5fÊER*ļX´çó¹ÿOÿõ‡çÃéáùxîr c<Ô<-k[²üôóÇû}U9ËTr¦²æ¢ ùõÝæí»7oî–ãóîéÇß}<‡ˆ’iQ¯/®®î^½yûúuU×J® C,@ÞBUAÛšõÆ»ÊL)Xg4'eoÉd¦XàÓÃñáù°Ý12¡eCdÀXaK‚”A­ÁEë.îϾ¹~÷z£ž»_>ퟞvÇÓÇd[o_]¯¿}{km@† ­ýét:÷S Öòª© p ñϾ½û÷ÿô÷ÞW_¾<¾ÿq軪®\U;k-ïï¿öÃ8:Õ¬’P³Jlk÷ý»×o_¯– dÈ›ÖüíÿòÞÿ{bc*ï¬E•4 }ÊšbøæíÅ¿ûÇßL±0ÛaŽ»Ãñ8N! ûÓ2],í7ïn÷›wßóêþ‹ýéýƒE«(¬•wWW—®ªü¹üñÃ~ø9ª«6'¹¼Ü¬7 cL]UL<Ó«WëE”@4NÓbÑšï¿{—bÎ9“R)šR`"É%§BD*ŠÌ(@ÏÇ_~¹ï»ñîîöw¿ù~ѸÉ™ 1&€™»gÀø˜ñqÛºéÜÇ)CQ‡l™-0b[ÛÚæ¡Og±„P²**,^­ÝÕÊx Hv¹hÚ¶BÇÓq ØÆ)ïw§Ý¡ŸBj*à!†aš`Ù6ëE›BõäèpýXvÇ-a®*®*_DûnRÛÖ‹eÕúéa|:¨ ³q¨„1 QÉ¥ˆ¨¨dUt¿z'YÐäìŠ$@&@… §ÊšE „e{è†!’©ê¶Z-\]kŒdœ&§xêò —Ù·<í× y}½¹¾j˜)Æ¢E™PSÉ!¦’‹ Æ !!Gä°HAUú•Í"`z__¬›)Œ)…¬˜2Ĥ9SÉL¨Þ)3äœc* F±V¬"H‘yã!DTЬQÐ*±"Ïêí< ¾ üóŽ0‘"©–¹‡"æ&#ˆÈl1˜+§›Eµ\Ô€”Ëh8$Ь`f(É\E³3„@Pæ/ˤU P2Q‹l€ EŠÈPDLŒ! 䔫Ú]müõEKÈ»c±ìœuÞò0Ð0g㘙É)˜)Å1JS‘w5"Èøë¡^l0ÄŠ4ærž¢”ÈhI¡¤±ÿ²›Òøöõº;v$·7ƹ…P¦.ÆJF bmj@Ó®]³j–Öù$J`ÊÒŒ)\.·ww¯^ß-Úµ0¢©n./n...—+Ct½¹|{÷úíÝÛ«Í¥¯=0–TΧ3–Ñ9‹–sŠ1ƪª\]‘sâ[±mITB&×8b†¨yR}ÊeW2 Å„nÉ'³h×Û_Iý5žÎ§q¾º*BÉ)ĘP qjÇl <Ï7šÛ Eæô! +¼„w¤ìt IDATg+Ï<¸Ïž9N"³«gë¾Xðfôç ªBåùwŠÙ¦A3‘Fk€Y‘QŠ–¦þTÒý3Lc7ôE ò–Л!A¬ÑÚcãÁ°"’5ÎWm Sßw{" ín¿Û†¬kµóF­…”s?JJØ ‘¨ X‰¸$  1’E8_3x~žÐÎÃKÍȦ±Õ @JQ‘ H%Ma˜Jßv–®.—õ*›ǽ)…`tˆÈ3b©©p~A$M(`”X¢± k_jí½CäR,"¦0o]í%—05UÕ4ÖPŒ£ìAu`KDœ±ëшó@!k)  Ÿz‰]³X¬ü… iœâ$š]!k¡Ä«œúÝþ1ÅÂl7W—¶r§Ãñ|<—’‹ä‡§?¼ÿý/ïa¬ªšˆc*)äÆWoÞ¼»¼¾ óñxèÏ"ZUUˆÓÅúBDç ·T‰À9(¥BWYC¤)M9 aBXå’rCwž ŠÎ®rÅ4…Ãóãy÷´Ä|Õ,˜mVoÔ ¦"fžAÁ¨’ÅRræ¬ ÆëÖ´­›,ŽRŠqY!§.œŽiBÆ‹Ö9^¢¦AÖë‹ÕÝeŸ§Ó1hâ¦Z, ÞRÍP“TÞkx©Ú&Xª1Àd¹ZÓââ_ÿsÿ¿ý?þŸ¿ßÙõ«ÍÊ9† 1ƪª2ŠA€R`.È›O¸ð©B4Ö¤X¦BgP„T;ìû¡H9v#¢yxØ=>=)èÅzu}¹^­H:SJyf"B»ð¯ÞÜ aWyÉéùi?Œ©]4W×+çÜãóá§_>ùº§‰Hﮯn¯/9e9 T7Íf³®êªï‡‡‡çín¯¥(”˜¢uŽÉ-Ž­CÄ’³j©¼mÚêêêâúꢮ| qè{ÉU‰˜P¤ #{8î?~z~> §aTÈ€s\.šs×íöÇ’u³Z¯–K†ièǘ2³1%¦aˆç1 1³uvfÚ ‚æºrW—‹·o®nn6·W—¯oo.7›Õjá+‡†ÐnÖ ÕÔ•‡ÚŠ¥¢àrćǎAþæ/ù»ï¿}u{›ĸe¦cN¹ëÆÓ©%–RR‚ܹ›~ùôõÇŸïäæöʺªïÃáÐcl¶­]][ÐÒ6îõÝÕÝÝsf§ó¹?‡Ói¸ÿ¼=ìOJÒŽ¤˜û1?¦í9¥‚–Èn¼}³)Mcž:ùø|Romå-0ÍÈ56ÆÖ[m–uÛŒ!|Ý?~üpÿÓO_¦ìW¯–+sµ”«›Õj¹p4‡S?>=õÓTÚvÑÔT7µ÷Îy.*Z” Šh&P˾®*ëÝy{˜>?Ä1g+C_8ÏRRÊ9AV¤,E¤lVíÿwßýÝ_wìÎÿ×?ÿðóÇÇ”€1L†´²¸nëËÕ¢"’©5)Ç”J’’s-"oßÞþÓÿð—«Eûû1šÇÝ¡A"çl圖ªÛq ÛÆ×ÖYäemÞÝù7¯VË¥_·îbáÿü›Ww¯¯á×?!äãñc>OãÔ¿¹[ßÞücÊòø´ûùçeBK öµ?÷ò´‹9äT¬5v}Q¿{wws½4æþ-¶¨0¨"JUÙ¦iD´¦,ÀÆÓt:mUàújóêÕ«õº!¦œ%'ecJNŸï?¾ÿ²¾^¼}ûWfµ\ívû&c,3å’rL)fUtÞË”º¾ï†pê¦\T€ˆMÛ4m[ç4åµÌ>S×fÙZB&Ó©R7˜Yˆ‘Ø À8¦ç€ï-¢¢mÌ«7oÝÚwÏ÷îÓۦͶ÷‡Ïcœ¯êvYD’ u[½¾{÷Û¿øÝb¹þôù~¿ßÝ©ª½­L(áП@Qý² &QUÆœBaD0¨†©ò6 Ó¸=lcß¡Hˆbú!Œ#bÉw [yW(*0¡3@¢FÐ#6 + hRÔBÅl 3QÊ€ @²Et,D4 °d,z1`rV˜2 ˜b˜¡YÕ)ç®ë ²M¥Ù[m\<žtÚžûR¹åÒÖ•£¦Þîºþ—Ç_žÆR_¹f“cŒh.RÄpžSÑ’T³ b,*ÂDL¨ê¶µ•ÚôL¡ä,*&‹žûrÿå°; Ô÷a¦Üû`í@Dd¶B—º²·wW‹õêpiú÷¿|<û««Í8Ý"ñû÷÷_žS&Ò¶mîîî˜yµÙ¤”ÚEÝ.êýñøùóÓ§Ï x}¹¶Ìˆ´\®6«MU5¥¤8MÐ4õ+k±nk$ž R†) cØ9/Š˜Š"ôÃtÿùù—}”¤sÂçÇçCåmÎ1Å`­[¯ûE»@Ä®öûsL²\T­#Ÿ8è¦HËÆX2qÊCDŠwÆ9c &Ì)ãh™J ¾òh …§§Ç‡/Ÿ?þ¼}~ŒSoÁÖHuB8÷G´ucÐ4ƒB' †\å Æ1ŸÝ~~ÿõ?þó¿|ùòøúÍío~{ñöõ&uÖy/uíëÆ1"-Ûå»·¯Þ¼~m!žN]×õ»ýiú/Óùû~ÌYS‚\ì”PˬLâÊï.ù›5Ä>¢±LP ùP’)Ñ[X´þêjs}s¹XT÷_>oŸ¾Ýy8¢ÍååíÅíkï¡©³oœJ9÷Ó÷áá9¤©\n.¬³l(æ<†0N2FIYSÊ9gF°ÆºÊOûqÜŸJ†¥©"‰F-sÖ¢Þ᪩ø<”>ä!äRâ0ùÚãzYaœ¦qÎ̲^×Ë¥÷Žœeg Í 6Ch½©›ÊZsúqžžŠ†˜£–TÒ4}JI•RT•Ȥח-³!s¸<*Ò«›Õ«ËzÝ’¥b˜BÛ,׫ÖNÃ8t= d)†LNc Aº>¤//WW—]?O‡†’ÓÕÕå·ß ýáÇ/ÏÛRÀ¡(¦RBÊOÛÃûÛ™1ORPQEëYÇ)ìv‡®M³øËßþÅv{üé§ûíó±òÞ²¹»^#Ãþ8DMÝæ856K~óîöïþ»¿6ÛÃñx>Ç UÞ@ŸÆÝþb®ê&åüõëÓþpÎrÑÕ²in.Þ¾½i[>M„LÊÞùºöu]9£%—”äÜÉ¡Ç(^‰˜„^fÖÌìqʤ’Å#¡Ù׋/õyª(…rFg €Bˆ9§Ç”SHE5UΨHRU²Ö×­ÆRØXÜwÓ~>÷)±Þ®—MíjÑT öuÉ8MåØÅn€$•1¿v!*¸¢¨"„…ç D”^’†EQDç$• ‚JÐ2XŠM­K±® QQr®B²Mã›Ê×ÖA*ZDC”~H㔲¨€gt³®/.V€¼Û÷»ñÔ•’•@,‹JL1ä‚E­¨A&@@@Q¡4̳¿Â‹·b q”’K'ê@X•~Ŭ³¨Š" ¢AdPÉ¿Òÿ (Â\ 2“Uæ£*þ·¾&•ó†‚*0jB €ªH¢¨šçÿ>Pѹ=j¾@P’3ªÙn÷}VdkUdQgªåbU›Z²¤ Y…-[®+oA!N1Láp$·%xAê‹« _r'/O  ¼X†`®AI B€œ!‰IskøææB‘¾<î‡p“Æ~”’𶲦V„\²@n&nˆœ qÚ†Ó‘¨¤¬%¬[{}yÙ¶µ³«|]…T²@˜¦ó4õABv@žØ ’¢"2*༥"ÎÄÝÙ§ôrð ËÜü—•`ö> ²ä’ò e$Æ¢1<ŸûÑ¢*qŒ‡ã—ýö¹¶‹…½]òë¶YZ‰( ç,Õ0XDAc˜ ªªGƒ 5§(ªB, ‚“aGD’#qÖ«ñê!W»qz¶…iL†²5РÑʰg …KÍš“b7 öt]ÈqBSœE.¥ÄééËôåñ)aÕ./F §¸ßn¿>|úâÀ_¬/‚„_>ÿðuûÈhÞ¼ûþõÝ»ÃaûñÓÏHX/U³r¾(! ¥$ë[ë8•û3o«¶™p8÷gÍ“J,Eœ;ƒ‚D Ú'‰AÓ$¬e–$ýþðõÃûÊb }]W„Šêœù‹Y hÃÖSÄ"ˆÌY‹+%çPJ)h „Œ ŠH–©!ªØ¥¦còM£Q»]êûm6"&“à¢VM…µ«! ˜¢5Š3}o†gˆœ3òUƒë‡¯ýïÿð¾ãêò–*ŸËÔwãD‰LB1 ¥Ì¸RA%b[ðGa‰¼·Ö’1¶©Í,UÔ•ž»0 ’22±»¸ïFT˜³5 8Œa qV묵L¤¹[3†òõùxêGkxÇÝv—rS¦B¾ÿô¸?tuSÕ#¢RrJ±®–o^ßÔW)OÏ»÷¿üøËçÝá|w{ãëš5ƒŠ1l-Ò˜ED½³MÛæ—ó`I9ÄSVQV6¶©šeÌe:ŽOÏÇŸ¾~¼ÞÆŒ Å!ÄÓ1FËPyÓ6z~yxØ2ÚÊÔucêÚXÎÖã|VzÜ%œÃ÷Çô¼OIªf±açÆ8†p:§q”I,(„n’¨¹”8Œ%$ƒ¶aëAE¨(2A]™w¯¯›ºùùãÓñÓ6 RÌp<ÛýéxÏçQµ¼~uõW¿ûóï¾³¾Xú¦Âã8Œ!KtÖ]®Vëõ¢m¦ iI*š¤§÷Ó‡_¿>îN}NIV­¿»]¯Wm»LI¥‡)æÆÉõEõÍ› &캘¼wLcžBA§Bœ*gAhèǾR ÆòbÑxW=?Ÿ¶OÇí®›"|»¹|ýêæáqÛwCwP©0Åq÷6Ï»~ãýã§Ÿ?>öCF@†ˆ*ÄR{ã¬É%=oOüã/}ß¼}u÷êÒ~~Ü}úøõáa÷îõ]]µUÍûýùéé z¬œY®677—WWWmæãýP¨¼eÃlXRý±?»ª‹Âãö|ØŸ¨òv³i¿y÷z½\O§¯»aˆR„ÉÇ¢pêú±ý çbvj,dL¬€" ‚ ” £Ô@ˆÄ¨å¥A‘bÂÓ9“ø ÷Æ £3Ö¾”Ž#¦4MÓ²"9¤J…mÎ0Ža»ëö‡¡ˆxojoV ï!CH!ç\D`ŒÐO 2 æ9· ³3À €€É€… D!‰cô•.¿\˜EkÛÚY6ÞÕÞ7!GD 1ïöƒˆÄ,1ë0¤®ËýE^˜ Ʋհ†ý¡;œbH¬ÊjYŠ)E³€¢Î½"@¿Fgc¼ÎÃ0ª*…˜c̈°fô/¸UœÝÀ ¬È/1^P„B/,°((á¼ùÀ«{A@™ÃÚ¢Š Œ³´/!¡‰*h!-¿jô³{gù@UUŠ@.}KR&ÈEC¤’½BäYT ª°*RF}¡ ÍèøÓMgî¸Q0€€€´€Ȭ“™“o³Ÿ^K܆qÌ)æ0'‘hW‹ªiyÑVµw1æía`ŠÖ¨ÀÊÌ%D„\JV(„¢š¥#¬*j/3 ˺YøÍÒÃÄÂDS”nH)çÇÇÓÓó¹bDBC\› 2"PJRv\›Ö;¯93¡ä쬀ãùüÓ/?»Ê¿zõ ú¡ÇawÜÏ€¼h(cRPž#7Ì€`©+ÃHM]b’Q€“j.rfTc-KÆh4DM…Ì$)3³#ÄXRÉ‚ΰ1$""ò"¼ 13Ál¹1ö< ç¡™/”ŠD¾r»ãx8S?íw§BÊQ´R±ÏÛ-¨^lVW—kk7ˆ RØ7M…-KI¤TæbïÚ»¶ñ¢ÊÆ0HQ@,¥¤RTA€Æ©œ»0%ª;9÷Ã/ïøùçOûÓÿOÕ{uG²%Ù™fv”»‡‚Lqóªî®ªfs ÿÿ_˜Å&93ì)ye* !B¸:ÊÌøà[Åg2áqÜMìýí\Å©u `—äðRœs™ O$ ±Ôv]·jW«f³ö›U»¹PçÌãªmº¦Qæ®±"ÚжÞùPŠœŽó^¦*In¯6ßÁk¬VPCôêö¶ÿz~x臡VrQuεm‡H1çX 3Ç9×"Ì"•°||8üí¯¿<>> ¨ñ ¾~ý T//6i6$WW›"²»Ø^__Þ^_^lV›U D꼃¶1Ö¬¯ooW›/¬§\  %"˜¥öçËm½Ýª§cž ~íš×[IRs¡Lðáúr·Û¬@ËãÃÝ—§¡ï3кiV›Ö’Î%ó(ˆëhš‡,q<ÌÃUrÆad%¨˜e–~šŽ}š0;U €HºØ¥¸à\x‘¤B‘œSR­(ÕkÚ×­¹¹l/vÛaì¿ì÷‡¡‘lë}pÎÃ5—4 gcÉt­G¤/‰CmEÔ‚ßm·ëucÆéúj5NÛ¾× ¬[³Û­¼o­ïJ) ÈÚк°"×j•RÓRÖŠTKºY5Ö[gÝ0ÄççqH§¾T1 &ç4§8Hãn¬sœMMéÓÇÇÿøã‡)•ß?>îgCD¤lˆQïHE✦a|x:>=÷ê=oÛÆÑé4Þ?ì÷‡ñƬJ.Oûã)o·ëúîÍ7ß~µ^ùgûøxÜn×›õ §9 c¼¿¾ÿò<ÇÔ±²â8åTÄŠˆ·´Yµ¹Ô?ÿõ×¾W6"PTsÄT %)™…€VAl`²(ÌœYðlõST²u‘½ .ÂzQF­†9)çì›æòz{{µi(©À0硎Ã8&/ѹcp&84¤Óœö‡A®.¶7—ëõÊ‚iŠýö‡qsÌZ*ÌÕ& `ö•™sÆRd¤B²X‚'"–¼˜`±B ,cÿ³à~?/Õ09P#¢–(º¥J1¨tö\Âb£Ôß,–/B~R]È,¬À* DgLèy¦/PYðí–`\¨ua¶‹+*³ Òb A­†” Ã8 )žõâ€È)¢¿à –* `ÁÅ-²E³$Ç!¼CÏ‹‚E`¾Ôa°°VA«b?I?E cI+ dÎU¡ÔÚŠR`»r†`˜x˜%\„*•4Ç›kƒO9ƒðíÍê_¾óêvWJ~|xN=ª:ë†9ÿí§Oϧœóþ0|þrÜ?㬕¦Á¶éÚ¶ bãÃv» ]›¹ý8ô}JIÛͺÖú|xúïÿó¿=ÿû?8Ÿúá4ÍÃçû»Cß÷Ó\ëñîawÿxµÛ³- —¬y¾¾~µ»º~>õÏÇS.Ñ$q¾EÕ©”ˆ®iƒuKU$'\™9)k+æÊÄ¥D-ƒ˜:Ϲ|‰Ô/SOc‰BË iM¼mø­£ï:“@+šCò?}IïŸR*j¬'R‚ç°?ZVBK¦.Û'øm8¾p=ψŸ—´`DY˜µüÒ ¨ƒÔuàíÚ¨š¾¯¹””8§:Rþ|7÷§IÀ–RW]5­wòô|ìÂÃj<¶­UQa)9Ç9êzÕ¾¾½¸ºX_ìV¯n¯º¶™¦TDÇ9žŽÃ©ŸNcgMµUj‰,þÖÖœ÷…‹Çy¹Úe¶¿höä…Ÿ» ­X…E€–¸k\špPv†[o»`EñÄq˜YT›@C· ÕùQýÀzêËg¨$´]µ¡m|h ¡Ñ’ ³ 1¥’!ƒhk¡U°¯»Ýn5FÙïOýq/5VãŒm2cU`Pñ•|Š© XëUR2íº±W¯šÀPŽšጨU‹Ðà R r,•bQEniŒ±BÙ·iw.´9ç)Íý«××»Õ.ÇŒ«Mwóêõ~ÿoß}ýýp:§}Šc*óÓþnš£w¡”X¡ ò4Md\h !‰ª0£Ã±KµGTk­€)²l Yµ££`D gœ4š9¥ŒžÔªEëÔØ ’Ð:o,‚·Ú4!*jÐØÓ× IDATš¬„äÙ%‘#ÝXi¸h™2³664k«,hªu²±‘êiªU‹ÂàŠ’o½sÇÓÃ)iÉ~ë’é Ù~"umÒ®ÿÿç_ç‘7Ý:¸Ö ™àšU×v«ÖXKDÎÙ®išà‰°ÇÜógf1 šKIµ,ðcŠ"Þ¿i»®Yô]’ªÍÕh|p®–šr. e@…•Œ!VSL1r­*Hhœs6±@,¥Ö”€ÙYb–~˜Çq>ÇÇÇãn·¾ºÜ¾yuõêöj·Y¯Ö»›W¯ýx¿~º»ܶaµn­3DèœéV-9Hqš‡ãªMÛ‘!d¢yο¼¿ÿ|÷\*ä"ÇS¿?žN}Œ‘SBVLÊlg !å”+שÄÌÎhcmÛ6]×n¶ín·Þ®›í&„àRç])ÕZ"ƒPÊ*媈Î{"†1Îõ8ÌûãI$óîZjªã9Å\6—»Ëë¯ß]ü[·Zý·ÿþç_><ÄÌdðáÑ~ºs뤮Uj‰QYõÎQ­éÐÇŸ9üøÓCÊåæÕõ»·¯þðûõ¿þnš¦hI9ÇZÍÛ¯^ß¾zsiºöêrw¹]¯g Wk­s–k%åÖ;kÍùËã0Œ‚Ø‘hA(“±£ùÆÛ g­Teô„W>íš°²¶Y»>¹ã0L)2Ôãé4MRØ£ikÈVÑRdæ~ˆ1êÐÇÕ;‹ˆ†EŸ§¡ª­,¹³$<‚VUF@«jˆÐhލÙ[iê‚kƒou ‰$®óÛÛ5™·Ç‰H˜ÿø—÷ï?~Þm×¹HÓ´5óçOy~ùÅ8GûC_*¯ÛЭÖ77—«U˜çé”ãç±”šÕÃÓÓ©?–šN}è§¹h.¼¯ýÓãÓºuΘ©òœ«¼Þlß¾~ÝuMiVIRg mB—EA¨34ÑRðå‚*•ˆ!+ÏZjXõa½gÌÓ³áØaޤŝìæ5ú]cèÂæö-—o|ËÎç°~„ëªÍ—§‘Iª±KŒÛY¤(@JVx±-œ­ú"}IÀ³ ^RD„IKãx×baг)¥”œSD'~zžs.xï-c¸¶S*2ƒ!M Ò\,‚:KMëß¾ºøþë›W7k"§ýã—<ÌeœÒ~z|ŽÇ2E#¸RÛ""/G áܯ .@*KçfIyiAÎÞå¥õQU©$ D/öZ&`”H„Sœ¡²©ånÐg|«hÅÚYæIæœO³±Î“µ€Ä¸Ø¦-©« ã,‰Ñ†ÆÙ×m·¾z{ýæÚœò)ßÕÑ–:Ť’LQ#ËUÕ*,Ö õ¶uT\âÄ œm}÷Õ«Ý·_ßt­­ñ8¿÷wqîY‹CÓ6UÆg†¤¶°© –Ñ$±¬šJñο~õúêê:•:¦â›îõë7ÛÔšÒÄ"@6`ûù×?þôñýÏ\“!(u,}b6 h "ð'k|ð­k\•ª,RØ«´cØK•´rQ.–J@ê¬iŒ‘,*Öø% ;#‚7FˆÀKà”=ªGDpV\ƒUx®¢Œ$¨ \#(¬›U­ÄmðÅ41«²xC 4Rœ&ÖZ´VÔ`< æR&™Š‡1àI$F¶Œ+6ý!¦yĪ·—éj·D÷™%š5YÜy Ä‚9wãiõçñOŸ@š·»]‚ëš°^uÛÝz»é¼·‹­цàÛÆ)À<åSߟú>åbŒ%2sLÓE¤J--Ùà©®¹ˆÈ-«Tç|0AªÆ”æ’cN\™÷‚1ÎZYÚ|Ê…çT«`®BÊ«Æ4­'¢9ç’³%*•€’ÂàŒÛmv·×­u@Žÿt_cDÁfÕŠÊ<ÏOOûq›UãCH)Í)"qÞX“k}xxúá‡÷úóû_>< “L±¦”ˆL0dÐ,ã>CìˆC0HTf- ÂL\KMcÛÖmÖíÕ®Ût>´ˆÈååÖQaöÞÒ8Msδ¤XÄ2Å|ÒýÃ)¥¤nÀxïq0¥kmáí›Õ4]üùÏ6§$ Ú®öýx÷eÓ(Á¢p™IØ)©~ÜýÉ­ÚÕ«7o¿ûöí·ß¼²¤x €òªë®.wƺ\eaÎ.¹¶Þ…Ö¨BŒq$7Dýù×»_?>ƨMçY hv¡îZí·/›jJU%ņP/]î‚ NýÜ?§ÕãÉ9Á¾¢KU!y/•+ ±¡ãêJÎÃ4O©ÎÉϹnŒ‰ëxgç¨Ã¤ hM³ˆÇ@ b QRDD+€Â…ˆ7ws±¾ÚºÎ¢Zë¼wˆ*HòÕÛ«ËËÕçûÇýq:žòÝ¡',¯_mW«MŠ|7= §aÕÙp»év»ÍëW¯n¯Ä;·Z·,%¦Ld yæÀMã_Ý\¼}{sûêr½jÚà–¤êáÞ÷‡ãðøôœÝ¬:¸Å¾?9gon¯pšæ’§§ýñýÇNjͣ7ðöõîòªqV–,Ac|Ó4Î÷®Vé‡/OŸïïC/¨€ØÓÓþ¸êšõf% ï¾ZóvWr×5æýüëÇØÐúÎ:É:·ÚøÝƶ‘RXEiJ‡2N nn7¡[_}yžç)å7íúò*Ï©¦9ǘžŸ¹ÆÃqoãœö""Ò¶¡²î÷§çýqš’qm:¤»û§ãi2ƶŠç ãÇ1ZV;dåÊÌ€*2@Ý´îÛ¯¶W3 §‡}fæ*¤èžª,O7Òs ° ü·œ8£¦Š`P3Îç4Yg¬Æ\R•¢VÔ«:ŒYX¤2{‹M«Ö"ä)ö†Ìëñ”žiŒ¨€tK)¬KLKªú÷QøttÖ¢A«bRQ©"@r–-q-2NÓ¡¢6grff©¹tmÓ¶Á[‘”E³€¾¦ ,TYö©?͈(µžúC)œ¹’õh 9£R mÜfÓµ-‚˜¸"TÕ‚ DÔ4áòrwy¹fá›ËÍ4MΙ«Ë kÝ4ÅZñžÆyêÇÓ©?Ú9¦qŠ¥Êz½Ñýq¦8®Çùtš¾ÜïE±i`©Jä,Ž9¦Š¨Dš*ñ¤l WšÖ§ÛlZÐ)ÁqÔ1Ö@äçbã[æKò)ž‹i@DUªUQÉX"B[²‹!C€Ê†€ÈWV"ã ¶ª–¹2Ïóm«mÓ S?M)…¦›£ö“ĈªÁ˜0HF@uIG?+Ê ”T‡ÂoiS籂-ÚVQZRáq¬HzëIÕIEK…LñÝj@µd. ±@sFƒ#W+` d!3{[Šˆ°èˆ<žÈpy»Œž­¿ˆ@ËEé%+õ¼ª^˜¥´˜tQA`©ÃÏ3ÿ³…`YÄ,ú„3_qéÌ– ~ñf!Z@ȪKâ§YÚ¼|” ’• -ûbIXþf4€N5@5fÁ¨T…(PT–EŒ¡óÞâœî„ "ðÛ Ÿ ÉÒÍ袥@ U# *z~éòñ¬çøK@åÅ‹²8/ È«ÚÅ6 ª9eQ©†ÕE|*Kä',Z&ßê»·ïþó¿}ýîÍö?ýáû›ë Gåîîî¯?y<¤ÖƒÖj¼wÁ™Æ™æb¯w‡ã)æÊж‚Äqš¦•êm·j×oÞ~õö민ó©ÄE‹"Â*…kŒs_+ëªBŒq(wÖFR4¨X΀ÍbˆBÛ1Q.šƒŽÐâC´Áu­µ‹0ƒÀ»×—ÿú»oß¼¹ZmÚ¦kk)÷w>Þ=<J­—»ÝÛ××7ó<íÓû»ÓûÏûaÁfºÆ`É\ªªÂÃãóÃã)WGÔ:ë‘IE•UÀÀ±0†ÕÍRUâª:·ÞúvmCëV«¦k‚sny`\Yˆ D–Èø&l/ÖÞ»ZrÉe¦q3§ÌÓ\vÛðøÔå3ãaRç1ì¸Nçñ8ôÏqÛPÞ¾]ovoo¯¯I“ÅB×´›õ¦“2í‡q“$Ó®o®®¾úvuýzf÷ùþéã‡Ï§ýÓºµß}wq}}Ñví8Æý󉌹¸Ø´µ¥‚ª³Þ»tšâ4•~¨ïßúã_ùðñNÁçj©F¦Ý6¾Ùñ&D¨ êk!Dï½­ZÇ”l$t«ª»OYïjÞ+¨kУ^Õ TKØ9ZyhŒ óœJ?Wf""c´(Ǒрñ®mƒ(Ôt߀")8‹ŽD´Ìµ¢«×kûûï/ÿëÿõÕý/ß¿º½˜çqž¦Íæb³Ýãøôø8Çtÿx|: ¿Œû“ ¸ª ˆí§¢À]çV©eг(_\lw›î°êOGçš›››¶möûƒ!N…wÛnÕú.8ïœæ\bÌ㜇)>úižƒ³›‹îòjç×sÌ1–a˜ñ| Î’‹ÃøåþðéóáæfèZÃZéxîïŸæ9­Vë\ôÏ?~üÿßÏ?þò#_l›ËM»Û6û>~y8Æy^uþ4ä*:§²?¤ãÉ:C†ˆ@ÅC¨¹ÌUS©ÁòfÕ\m[kÀ^¯ìíõ6­/%[‹¬æîþ¡?õ¢p)2ŽsÎ…씪Š4Mc<æ÷ö£s^!¥<ï;ëPµ0­Ç6XaDr•K)€Æ!ñÞì¶Ýª#ÔúåiHYûIúÉ0Cð¬æE @\ü¢(ËFIÕ*$TU­¬ JäÉXV䎜µX‹rY&÷¨D`­ ” ¥ša’R‹m¤É9E“*8¢€Æ½¸å洞k/xö"£" €,‰çI7¨Ê2òH´ü±ä‡cQa&ÑÀFUñÎxgýë0ÆR™u)Ü=¢E´r.pJ°0.ÓîE¿‚``i;œ .AgQ»œ«}é[Î Y€)HËØé®ð…‘ްp‘è,§À¿ãÓÏ\õ—aþ™nyÌÊòŸ½ÀÏüÍsyJ , tVà/t"Ò…qˆd­ªYdH¢B¢vQU¢ ªF@Õ¢:âåGHˆ¨¢ºÈ’~ƒ¾ ?—KGüMÌ´HJ–7X@•ÎUE@Aá³ËIIAJ1(HÅ‚sÆ9‡Æ²rÎ¥” bHU¥8ªëÖÝ^¯¾ÿþíwßÜ^ßÞ„¦½}óî÷ø7¥u²ÆJJ"5´ÞZl¼»¹¹1¶ùõÓýÇ»»<%Ñ\eÎ<å:Å„9o¬5MªèÜ÷Ã0p)RrIs©9s™SJ1[ç4«pÎP3EZ|,€Î#*YïCc¥°AKBĈŒŠDhŒÁÊÊD¤UŒa2ˆhÉN@Pu¶V=›½QÅ (TÎNŠ7’бÕ£U¤ŠQ‰Àf)XÉFAŒä"‘c¦Þ®O—k×oÌp´¹,qBXiÙ…-í - ·ià¹Å—ꉛX¦ë*@Ë×û|ž_ë\j>U‚¸0C!WÕZE%CXNŸ+ªÈ Ê–Ä76¸Æ;CÆ‘smÖ+ï­íÇx|ê§T+ãi(§³‚̈dŒ±‚ À¼TêÿpÇ8cŒÎ»‹Edç,ƒ¿¯4píK¨„¡ó‘¤ó^\'è„ÜBRUÉUæ˜ 0` @)¥0“¯HÆ1 *ÀB¬+Ì…b!ªF–X"ƒ¤D+« Æ)?£jJ¹T4•9©D Ê¥pŒæ¶„›uw±½ Þ·mØlÂÕåÖÍ™sÊÜiL‡Q†LÂìlm)®)ÅJ1 ³­H¦VÌè5˜†ýñø¥raffÅððùóÃýóáéöòúáþSŽóy  $`¢^V‰V •ÈÑ㬱H*Ò6k$Ây‰¼VËÐY»r! eÉY %ͦX¤Æ[c”9¥œ™‹ª°XDo‰l•Z‘ Z€znâ˜A ±±¹òX¹]wëuj¿$“€q¬ª`XD,XfɳèbT”À BÍ,‹WÊå\µP"a™•«s·èn>à?þòùO?=õ%ø®‘<ÍŒ N€»!r‘œª,^JЪ̥Z `-3Äl–²6f9œ’‹â›s9öý±?qæ,íÏ蜨µhŠÀ”KŠ)§X„+8:RЍHQ®Î"°”Á˜`ͪµ«UÓ4ÞXP¶!R¸½ÙÜÞloo.ºU£ŸÇO÷û!U4¦AÛ¤Bóœ÷ûþþáøËÇýÇûcL™@3ˆ€Ì dZ[XDƒ÷Þs¾7 QQfU8z.q1bPÅ€‚V$ñÖ­Ûv³jºÖî6›ÝnÝ5í’ LTa™åÆÔ4¡ñÍn}D›uš§¹2çÊ×W?w¿üúétJ-àY½¹]ã¬EºÜ4.ø«›«®ëÆAœñÛ‹ ß6Ö/2XšÍz½ív×WÝæºŸåóÇþá×î-™õ÷ßv«ËÖ„Tò8N‘š¦iWÁº%C¥¦Är˜™Ëñ0ï÷óÝýð?<ÿéÇýs/É`(M­SRI)—\uI¾Be ûèîû:æùi“®MðJÎ#:&Òà–Ž›¦êc–~ƬÁ8‹ B‰DyÙa: €h€“J `P”-rL0XJ•¦mß¾¹øçï¿ýöÝ»ízCh¬ ›]s}{³YoBócº{>~uŒd /2àTj­ ‰Û×Ýúözƒ° ž‚÷*‚°ØâÃz³ººº°Ö2WPM™›& 3U1gF”a˜ö‡þáéð¼?Ęšà¯/.¯.·»ÝÚŸrÞú8˜¡Vd¡Õª}óúò`¹²|ü¼'óÞX Y­ÛýþðÓ¿ŽCÛ­Ã?þñ—ÏOûèÈ{c®æ†~[ IDAT¯ÖW—«Âð„Kà½76T1Ó”‡y"3-…. A3ûÙPj¼«1Å1™•_¯¶·7ÛÖš‰'jˆ|·òÁº¦Nùé>À·ãnÀ;cŸ!lVí<ÍŸ>ßÿøË§˜ùÝ»Û7¯/n®Âá8äBdI7¹Xcè˜Ë)r‡d­!è’Òi¦¹j)§\ Xg–`=¯¶Ï¡® Cr1lž%Z]Œ/eºÊÂyTQ@0VɲZ]2€pÑH ’!¤PUN3€Re ““„!Tô€ŽÕ"ã9´pÇÃèK5ˆ¤êä·¥!¨žk|‰SG›X{FU‘hlU6˜f* Çd†hY *K$. ‘ªRa_DAÉ"˜%QëÿĨŸ[Dþ(æßk ¥¾8¯Sd CT%Ðs>À¢iZ„güˆ¢‚.åYô„ÿ ’€ ,½%¥uùìð9Ši1*+(£2#Šê•C€$(¢@g˜¨A V`@u ª2«‹°ZR¤å¥ LZQ"”³#ù\<½ø+±øÒb*¾xš—-LSáóþRp.fbAV¨¨ó¦ÃWW›àÃ0ÎÇÓ@–0e)%cÉI¸²Hv¶^]uÿú»›?üË»oß½Úí¶Ç~úp·?§ÍöâÛ¯Ë# 5áúb³j3NÃþ0ôcÌ\OC™fÎ1:×7mÓ]§è¬IÎkŽãþéé°?žŽý¢"•Q«±†œ«@‘…4#/å¤ð„RD‹Öc1@l4 @Z%¢ótÙÙÐæZYÑiEkÑÚ%¬€$®UŒÅÆ (Cdµ H…#Î= ¨h‰À «`UkRp{‚>ÏIxdǹu-!÷O<äon½Ç"Nˆµ¢¢‚4B´„O£êYئ´”ÑgGíbìгÐçÌž³t‹¸«¸\ÅHj]m‚ek§Ä¥fàŒ8¬L Š,„â¬Ù®º‹ÝÖ[;͹ySJ ‰Ž}zÿù°?ÌÑVAVoÝÂ3+D耖1(©ØsK‰Hçó÷"={éVñåä¾€^zyeTU ånHgýÉ9úl±E[զУÆLbU½£l-3F…T‘Á€q@¶ªÆÌ™+‘),Î&g@Uª¨¨z7ÎÂå®UÀRëu˜¤ˆ'µSä\êv»þî»7Þ;DtÖÎS>ìï­%<íûwOÜ­m`Ó„«ÍÊéôt8î³µµmm×ଉ-¨ eF-Â)ãý<ôÏݪZ±éª2+ë9LM@°*pEb5ªÌÃc*c0>ئiVÁ³í’£C-¹ÔÓ¤, R€µø®é®_]\\ï6Û:Ï÷ïš÷.¶^ŒAc€ç¤…Yu.J„IZO\KÉU,Ú­'P¹rª'Còz»Ú¬pW&z-\Œæ)rqÄ+g :ñ+pQÈUyñÈ–”çXŠ *‘ACÚx Š„¬š:ï}{ýë#þûüøó‡}ÆÎ·-’VÉú<Íçݪ ·Z‹TA0Ö  Q©<öÓ§÷CüiNÈ™iÓ<9k¬·,cäÊ„¨ …e.}øøIDß¾yk]°.YRqˆwwO>=ÎsR@géêª#ØH©ûùÃø”rÚîº7¯.¸Æ»Ï_ާY)L©Þ?÷§XY§ëµ}{ùÕ›+k¼rI9­6ë¦]OãЧqÈ5¢C² ]Ñ*ê˜r.©±Åí¨Ìñ°¦ØÔÊ«õêúrss{9Åüó¯ŸT´kÚ««‹Xä翽ÿ_zÿïÿ㇟?MHÀúøö¶ZRgÕþðÓÝõÅjÛµÞšiš™kÛ¸ë‹õ7_¿rFŸöÇçÔŠzcGÐåi‡IgÍ/c\*eN3h@PGèˆ,½X3ÿ7SïÙkI’ë-i¶9®ºÚã4Ié úéú ? •. 2$g†—3ÝÓ¶Ì1Û¦ ³ÖÒ‡È<5@ 4ªOåÙ;3c™÷}Þ•'¹jÆ ­î ÐÖòs ª€±z2Š©€ªV^#542ôÕ6ŠPk_Ĭd@Õ ©ˆ#b"ÈZ7Ké·ØB+Žƒ–)Ó*PäEuP19K NTóðÔØÔhÙ ™‰$É:š¡õ†© EDDETCZæU(¬HF¢^ kE fbŠ`´pwjµ ˆD JS´öK%DTc¼lQJ+0"ÒëoEUk eá/ [ì+¡–ÊxY ¾¶k£±°YÀdÙèÔ¯Š¸î ´Z Ö&hÉ:]ölJ` K·ŠXñ¡ ¦‚HD^‘ÀTµ ÇÅQ 1@S ZC½R³¿™»ÕuŽ©ZmØ+þ@¡-IÇ5ÔLM‹#¹¿Ýüþ·ŸµMûîã³hš£LÃ8Î0G‰“¦Œ"‚¨»û»_ßýçÿôë¿ûÍÛ&Ї÷ÿòÝOªDÌ9ç˜&ïèÍýý?~ó»¾ ?üüËû§Ó_¾ûåpŠ¥¨–È÷·›7Ÿ¿mûçóéå½å1NÓ/?ÿ|¦ÓùÂŒû]Ïdmðä9–LÁÉY2(Ðrû1.d$‡Ž LËLˆ™€ ‹‘3 Ø';„ !{'ˆjbhÅ ˆW±\˜™L ¬ÞVˆ˜³æijº® A¤˜ÕûEHgRLÌ"À¦áΕAó ‚„0dù’ø©]^V]_ÎpqÍÖ{‘@+tÑ/!+¡kyVGpíª^) Ô ÒŒDmpä(f#X=)%rÆŽ•½ã¶ 5i!ç4 Ã8O9'Q¢=Ó09¤–È#®\Þ FõÊW|Vݼ)ÀâÍYžŽ„h˃o«‘¿¦€YM”ª-Á‰\Á»ˆH„Šw5÷À«j3…`@Ó$VŠ’ÆÌ8(¸¬Z4c–º S1eP&T1“ÖÃý¾}¸ß´K¹ŒS‰±˜ó§ižg×wÍW_~Ƥ×a˜ÆøË/?|üØoÚ»»‡)É»Çóó%eóÌL=òfžùxœrœw½}áüÔ)¹$Á/ÅP™©XÉ:ÏS®Ûî6øÖI)2©˜˜fŒ ä” ŒX5H)eÒ<ž|6·{ëïÚM³Iä"q)~œ§’fDj8x°2ÏÙµŒÔ6ý~»ÏoèJï q“ 23„€j€BpŒ¥uÁwµ¤ uV#Ö>V ` ŠZú†CÛw¤x|šM5…Ý p6Û·®o‚š ;vB)k0”A-§iŽ©2³'`Ï艴h4íšÝöá«SéÿåÏOüîhnsóðeß·ûÞo'ÅŽçñxsV·÷÷7­çœË8W¼ €]®ãËáúîãé<&b&¨œcï ,xÚömp\Š”q†x¾L®‚ÏÙ9b4UQ33"‚R„‰˜ˆ‰ƒãMß6•iÎDT—ZÁ³÷Œ`ìh·Û|ýÕ›ÏßÞwm˜æx¦ç—cœãããËÏï§QŒbÑë‡áxœU‰‰\ ר@eQ -cEf 0MÕ^ f ¨ÎU*¿´ºŒ ÔБgª jMÓìw»® f0 cŒ¥¨Zð܆@Lš‹Æt¾\?~Œ>¼ÜÝßÜÝïöŸ¿½¿Ùw!4ŒÖ®g¶oÚ·_Þì6}ÊúáÃéí}ß° ¾é{oLQ :¸½Ý¶¦6Mj¦Œx³½yssˆ5Ç4\§Ä Ðv›‡7ŸÝÝ=|öæá³‡-åÃãñññeŠ©ëšû;g&9Î/‡Ã??žÎIÕœ#üþÇço¿ÿ8&ë6ûûýžQ ¶¡¼½¥m£%ÅyŽb„ì•!xð\fÏš>Ïûƒ”#°÷ÇL@*bÙ—†\ ¼Nr™¬˜Da5 E…ÌÀ!² )c2‰–g5@ UQ)`‚Ph)?ÐÌD¤LÓóóôþýæÝ»Û’Çœ¦˜fd<œNÇÓôÿþËŸÿåß¾ŠX×÷.xBi;7›ýòñùÇ÷çaÌ·7›_}q³íx†ã9 )^'gè™ç¶ ··[QJ9OÓÕ7¡Ãør®£óÄžˆu!ÖhHµ’1sP€óuÔ눦w7}¿isÑï¾w8žÚ6|ó»ßlov/‡ó?ý_ÿö_þéOßÿt.áK¡¾÷ÁŽ£ñÄ»Mã˜~õå}×·oî6žÑ1÷m;·P],v9O/Çô|,E=¹`b C߀ <³¯P<[¤ö¶ˆ.´òê‚»²ðªí pòÀký¯ ‹O®¦ÁRuÚ!!ƒ,.òj‘­õ.„Vl-~^¹—özœ¢33$^þpý­–"¤êËíÊЬ(C5@E@BW«àhjÆ€žÐ™-Rx­ÓÁeÙ¡¶äÿ,± Zm ÑS–|å€,öUE³E³´¢=—,Õ¥'y5÷.Ìe„jPÝÕ°àNWÛ/ÔAOUx¯ZëZ´®z­zITFŸ¼¿¯Á§uÁEP•HDˆDbŠVõ?Uª„f´Ð^ÕQŸZqD^(^$":I²¤r‚"¸~g¨!lÌê+ª!TY´™-3 ap¾k÷ARpŽº–ˆÌÍ$Râ4_Nšblƒ AÇ!^®—/?þô@]óaÊðþyŒâÉ3£Â¥<"uk­‹…Õ½ ШªP„ ðŽhÖdªÈæ²#ô(Šª‚2ÕýIpÔ¸¦o²Î1ŽňC³pžšÐxòT³²š™y°Æ±Að¤ `)¥ÓÓ‹Œåüþ=êñ´ï¬å%ARÇÎwŽ©d“ ª@ =k‡ÙIR@BšŠH‡dœ£¨Ìd£»¾@¾L†3†‰¼8§bZ£˜ 8Ed¹Šº†8U@€#`Ô”S¶»y{Öý~<¼{žß|ñ›Û‡ÏšÍ® ´ëü®kÐà³)s2‡÷wû·7­ççë8§$¹HNqšçëÑù¶ë;ÞVI(\¨¹}ëw›àâsÊ#.9.‹kˆ*¹’¨ë W„sMœwežK‘úÙ»Å6ÖµáþîæîînÓï,ÅñtN§ažãñ4\Ǿ¶H„Æh@ `TD¯Ê å7©U¼¶&‹¦ÊlU›!:xýjõT•?ºüðê¨-Ö"ÁF²Êó_¸: *†´XýÝ×]…Ö­IUØÃâ¨Ý -•–à´qd†1[.(Æ€Ää‘@Å‘‡ ˜³%A&ö„ŽH@¥&tª‰ª¸%[ –»Ñ€ŠjbK ©g2P*ªE”lö¬Þ“ˆiQG”¢~x:§œ—qʪ9[Ê,Ø1X!(΋ª<=ÿòÝOìœc÷ý÷?x<˜S3⧈ ÀÌèÖTHÁÔ¢ÍbJŽÄLŒBa›T3`BïÁ‘±#Rv É›4ªA °^h½«€ ÂÅ­> ¯ú€Uÿë=N Ë0 LI )ˆÚœ%ÄÒ¶ÌÈ)ë0ç`ÃÎ11JÛÅó0åœrR«T)µ”mŽ˜•‘‚ãPk\Ëö¥û¨JÔ…`µc!Ój°¥Xew‹‘z /C3PDZ<øT-I ëëÓÿkBu÷§ªËƒµ0‹€”|Ís} ,«?GLèÈ–|ª¶)5#S H%8è[ß7¡ï3¥8 ÃÜ4®ëº%§R ˆÀ8•ËuŽYBàÓáx:s*0óeºœg˜ÅçɤH.’’"yò-„".Íg-‚CO¬j&\ã;´¨*¤¦Eu”(6"úEÀaJÈ™qŽÃ¦kÛÀy¶8L 4a×Þ4]×µý~{ãóÓsŽ¢ 4{´&Y˜3±|½\¯ãÙ QîC*8EdOÔ 8fçTQ»€+ óXrR7K;£“¨‰EÉ6EÀˆÙyìµ¹¨‚ !3™¦˜ÄÐEUW ”¬Êä¨é\ ×mBpÞó”RÆišcL¦êSÝ;ãJ}C¼^ÇÓù:OqçaÏ—kÌ’E Y RÌqÎ¥»¶kzDS3­{ŒõtFC3U[0ËBÉ£Bò¤ÄXÔT "±Õ<75Br,Q%q:]‡ó8<ä=±›çS2³štYq`æÛm+ªãÎÊþ¦ñ‘74µ„(mË ×Ä`èÛævßùÀÃ4Ã0γj!æ¶íØ7±Î±ç9Æ9E5a &v¾Šm‘ß;ÑašO×A¤°ƒ˜šq¢˜J)†ÄMÛ´]ç8Ïq˜óËñBÞW)†àû¾¾É)_‡4ÎZ4wŽH%–<ϯ#O±¹Ò¶ÎóMœâuL€Æ®æ•›ªÖ³jáLˆ„h ±”qNˆ®ñôp»Ûß<¾¼|ûÇ÷Oˆ®mãO¿<‡ç—Kœµñ}p€Xv=ï·^´\gk¥)@Þm­ëúív<]^ƒ™cvÓœ§yΪØ¯ã” †5 SÐrúÓÖ[ge¶>ð°¯i‰ö\e±øI»¼–ãßÖ³– ‰kÙˆkÁ ëìÉjgk>,šTÓ ÒʾA3W¡È+ZÐÌ´Ž‘×úÖIüZlTÔÍ¢Ú­Ð@UÕeª°T1V£¸j2©™%­þ _ÔPˆ4üô±-¹æu´R‰97ÌdjX²©*×—·€‘«7,²½Š¥\„zΡc²bšŠÑ‚‹ÈVL¬zW£aF™”àQ +†9ãè4Â^Srru6PFÑÕ½¦dã+tY=Õv}VÇÇò”¢!­ï EGÜ‚–9§K€qÆ9CÇÎUUJ­D¦˜KŒqFàà[@#ÄìŠ`ƒà@Àpñ%¯J6µÚ“¯}ó"/£jY_ž™åƒ[Óélý«¹Î´ë8dq Õkù5—¼cƒÊNFSZ«ÿz4àÂ?@(u#Ääx}u-ÂEö\g‹Æqa…y¦]ïo·m1¥¢©” 3! Å"C,¥ BÞ¿LúîqÛñ/??ýðÓÓá4 x¤¶ˆ¥RÒ‚wP€BXŒ  IsF,RR̳@ɦٚÐmÚ]}«9tÀ Q,©"rä…A…™‚kÕ|ªaêVLI… »¾kû~»énš¶ßt}çz2SvÎ…RM);‰RR’bH¤êÌ<”,YA•Úâ[ddö`d9‹h2È@±PV (¥ähi½&ºfÈÄâÛÀ,PR–Y e¬¨gCoLÔöœK@·kX²”œ x /Ô€IêöŠ#¤©¤\w§^9`{“hsíµ½yÓmwÛÞ7NÈ#:P+ó\Œ¹k<¡"’‹3f¸a IDAT$ç£Í1Æ9š–MïöÛ¦i;ß4EtÇ’R ž˜¹ëší¶cGÓR±)™Ø$Y™ÙV’•-c¥**U#3‡ì}Àꥹ 1fSe®+­RDU.—Ëûwðó/z¹Œóœk¤òc‘BìJ6KÙDÐ8Q@­=´øzi=¡•l5~¡®ÓHB3q„]×tSuDhVJQÑœeJ’r2pÕD fcŒ—ë0§Ô÷¡o[O¨5¯½íš&x!0Oض.Ç„ìÙ›¹ãqüù§Ç~ÓlwÛͶÿò«7*yŽWB®—, s±YœwLì4ç||¹<½<]®sJeFMûæ¡H>]¦ñ4v”"†Þ™œÄØwýýíf¿ßŠâóËøîýñåpj?Üo~ýë/îŸÞ=^*g<*œçnŽÔövÏms*×w6 Áºd!¤¶v6+ס@ž7[»í¡ÙØœSIó1e1d”àœ)ÄÄÉZ¡†`AZ‹ˆÍª©Qæ`©e6YÀ” œX1™ ÒÒ·üÅýͦÛ.ÓÓ9¦lY€I½e-šÅ+æ|‘ç—ã0̧K<œâË)ÏÙ9ˆ\M¡3-M ¾e Q¶ÛöÍý¦qúôøô8Çœrê{ÿåçoîÀ0ÆH¤":Ž‘x Î{ç›Ð4Fª¦ªì²šÍ1=Ž?¿{ÿÃO?Ÿ.Ãv·fQƤRçKÓøý~{F:ÎOÏ—çãàœëZ‡\RtÚ† à4ÄÃuž’3fBf2ó-5%Î9'+ÄBÐÆäbßx7SÉ¥€¢U2 €™ªšXLér5ëo7›Í¶iº"tôpïøpˆÿþïß—|-‚S ¢ŠV·7›í&L)_‡\”2!Á4——àà.CºL@kJ¹VÇŒÐwŽÙgq¥˜R° Ư-øð 軺ÙôUs²¢5s«>«µÖÕ• Ÿ”6(uü¸DãØªÿÁe<_{ Õµ.]ÀÙ¶Ø=—Zp)L—IÄ®ñËȽžÛ¸¢ù*F_U0öÉ„k ¸+—¡ýÒ®Ø:\Êäw°Äó®ŸÄ²© )UĬËð^hiF^g󆪵£à׫F¶Æ$­¿)á2e¯¢aXŒ€ d@¯ÌË*ÀpeU›õÒ,+×¶gUc­â¢•†+±s‘í}r /âPVW,P%UXåC –`6„¢d™r±lhä‘¡[¾}SAT@QUV`$c+õi°4oÆ ìPcV0©öFCM`e\ß±CÍÙæ*0#ÈÁɶ£mï™)g¤¬˜GT­è)¿€Ý-™¸šHêðø2ÊñúøpßÞÝu7»mà bRÄŒÁü»ãÿzùoÛÝ/ãtÎGܶŽf)ì\·ïíýûŸæt=ž^ 4Í5 sLŠ‚Cnö7ªx#Ò0¤Q͘ª6Ñ9$ªUC$cZàÁ©‘3JÑ=»/ß~Ù÷Ý8Ï1§qOçóåzRT*æÉÔ)ƒ®0\¼•@%ˆ…1+‚`‚`žÙ³ˆ4sˆL•5Í ^%˜°©NÝô·ä¿ÄqÀSÂùÈ@A°jê¥ÂáÀh•´©‚~¦Wâ®®•j¡­†î ÙD(ŒÔˆêu*X„ˆPU¯×dÅú–%Ë(jbª*Þ±™ŽÉ®#m=¡ e/¶ŒïÿöŽа5Òðµœ'U²Úï”ãõýˆ•ðÆZqUbUK±(Lªöp}YÕ×"1›`©è2X^­ˆàp¥T¼!é²Pµ×F–(˜ª©Y}±±ç±”bS”\ 33ù’mLñpI×¹šÂ\ôÏ?^ÆÿÏ!—Ë8^™©oƒãÐoP¨ØT²$3`Pf#4S©ñùnÃw½ï)º¢fZ€DÑÕå±s.8$êe»ÝïnîïáýËãûÇ÷qž"¡#C-M¢iizÞo›Ûm|×µmè×w¡uŽŠfl‘Øû¦/9šL¨±uÓDsʦ†ªb¦ä˜É¡÷o¾þío~÷»Ð†——ç÷ï~Î/O Qs±!©!õ ×8xW¨ß^„S6f×8DËY80*Ãljž·…ÌõlB"ªª%‹¨[ӄгóÁT‹iRÈEã,H}¿ßsè“…YÃTz¾ß{#tž¶}ÓL0Ǭ`>ì<±«Š}M¹¤!ó”J™¦4M3˜½¹Û}ùåç÷wäXOçë?þtx~Ù´îÍýmÛµf†ˆ¢Š„ä¸í…J–¬‘8Õ]Uƒ¬Š°Eâ,Š9«ªÖPƒ,(RIJ©—Óé:NÓu˜J1ç\b]ïcc‰Ükc¦Xc+Ww=TÍO!*š™ $4AA0VÀ‚‹uj»Mèú®ïG¦%¡AÊöü2</EÄ{6p¢µ˜²c¾Ûu„TD“Š˜ïÛà\n7‰÷Ûnžæ"†€×!}÷ý/OO‡‡77_}ýùþf«*Ä /‡ñp_ž_†a¸Žíá|1“&ÐM äç§ç—ÃA »¶Ý‘unÞ¹©íúà¿~ ít=^ c¶Ç/¶oß~þåo~yÿüÏÿ÷þíO?>=_Çñüõûпýñã?ÿó¿ü—ÿí¿^ŸÞóYØ÷8Æáãev¡uÁ5™æS¼SŠF¦Š^°G×*ºœ6^X"jF ÂàÁú&þþNeÎß> lj•|öÁÀ+µ ¨&ÁœBr€ ªXæ.Ÿoõvß§é§ç4KƒÔ8TM×ÞçÛïq‚œ°yè5ž $ÎÝl°i¨}: ‡cʱLÓ‹ŒÙæh¢Ì—Œ­Î1Ñp×;ÆrÊeÒYeĆŠP¶üü³‡›-J:—áx¶[§ùý‡—OÓËy8_³šgZ´8‡50wÃCˆISÒ”tJr&½^æq’y6õ0Éržæs*V¬MY·¦afÁ¡$1UÇ$ˆXQÇã5Æx{¼Šá“ó®ëbbóšÅn:džIsQµšÿ¡`Õ¤ ¯BÖtV‚WÌÚ2Ä_ªW0T\OÇšºµ‚è­þÜ:é¢Er UJN@° 6`ÿý-¯ŽÆ:†€¤€jVW– Æ øг-Síz_¡áÂÙ_*‘Wã,h•­Þ¥ð2`0|MåÅõ‚ê´VH¦‚Q·×‹®ÄMB\òlY  AÕ×ÏöµÂW°H½xäeV» ~À`\®uGmßrý™ëšEБ¡~Ì`Ÿ¨‹ fºú¡—‘äâ°euñ*UZ>ùÕ6`F¯èvÃWÛ·Íž…‹¹9#dR Á:ÌF3C]±r D f1iQgȉ #£ JkRÔr"Ø\¦Ë·$“‡}¸Ù„iÒ§)ÍIÕ<¢2Ipêˆrʃä1–XP•Tl‘e¢€G „tV¬QB^Í5P“§8)¤~CÎïètº ÀsÄÃI~üå©i7;Ü6¡oCßzp„>l÷ÝÝM%þôþ‡’'ev.xEKVrÉó·ûív»kš¶éÚ®o€,¥vqÌUt‹fŒ bº0 k*š+U LHd‚*ŽðîööË·_‘aŸ/L$9éP’2cp‚ jŒ@uéÉW"'šJ™‹!›¨#9gD*@Ž H"Œ"ŠX±Ñ{DO* y×äý6_¨Ÿ4ΘF¶µj·EŸWVý”Zm¯–\w}Ÿ ?-â,£U×M«¦j  „YJµ0…à½X™¦I}Ó±kmšËqĹç<z>ì1U_C´ðˆÖä2Xw‹ªW5œØßlùpYÅ-ïÐú¢……F¯À¯¥ G$¬²÷UzÄ ä° +~’ÈŒjNv•óÑr%ËOXš(\)&f•[¤ZT¡jºgë$ ±kȧ(bBðÎç¬çË<ŒE„«…'øùãõ¯ïÏ H†Žs×Á~#û>ô½gOjù2Š33!82&R+¹g½mè6pÇ] a4bnÙ{1)©¨šs~¿¹ýý¯¿iº†ÿã/ïßOãŒÁï aJ9U„“©)×tÍÞ;ç=7Ž{×w~ÛºHæ2Íhä|h7’r‰^ËHH¦DKQCEçÚý–›Ö\ûæë¿ÿÕïÿ{@¸¦ÿ–à]2e$B§ÈŠX]b$ìŵEYœˆZŒE•<ÎééÉOדGùìáþ׿úÚ9÷ôü|8œD ‚1³6Í¡ª•¼,ÙKU‚!;爴”<ŽQ©]­cBôµN©¨¡ Ñu()ÅqšR‘"j67Î…àk¤`*vÊE€‘ ™MéÕŸfÈjõ¤FåW11š© eÏÅ9UŬhÊÙL¥°å.€£¶ký~ã=÷26!°³\Rß7Ìnœsʆ)e‘Üõ۾ݔb©¤¬ ¢gnÛ¶íº¶aÂËuÆx>Ó4íw›¦kbLã0ÍsT³”íx¾^®çÇÇ÷)¥ÍfHÃpõN¿|³Øw1N%͆ÆÁö]»kè&¤¶Ûùî.šs3§Ä3øFÞ¾¹{ûÙý<ËÿþOÿú?ýÏÿË?÷»»m·Ûæp8ÿë¿ÿõÛï?þÓý~úóŸ{gÿéíígwô2âíPN–¢ ŠÎ1 ´ Q¹ñL}ÒF$ ;ß™ót‘ ˜úyBͧ­5ß<ôÞ…¿<ÊÇ‹ ¢Î“0 ‹s…4ŠHVuuÙçÙ¦}3ýÐÞíäçÇá#ä \_¬PÊ7ÛüŸ{¼=>]¯ãq”€SpÖ6n»í™áx/O/9QNTŒÙÖ x-/¬b ]NSžç‡û‡øæ·ÿãÿðë”ò?ë0DÂìCãšÐŒãt<¾<ÜÝî6[ÇœržÆ(2™Z)"f ESœ²¤”Ë8¦iÊ`Ø4ífß÷›v‡á2ÜnwûÏß‚•ãùœsô›¾ùÝo¾øüó7?üüø§?}®»Íæîî^Q^ÎãábQs-¡iH}ç¿þbûæÆ½<ÎÓ0=>žDûç—ùÿñËw?r53›xB×P* 0 C4cS 5FhÌH2æ)Ëùz‰óp¹^cLR´Xʉïv}Ó¸/çËeˆY‡aç’ ª(Aq “§4§4Š›bjZ5M˜¢œ/9Pƒ9ç”ÕÀUà" d33tÞˆ 4!"4ô€ö’üµÔŒ Æqqý-x\QËÚ̸ŠXײÅVuþ²Ã*I_0w¯~Ýu¿†Á®2¥JàCZm°¢Š–ÁkÂì:˜\Å&ij´úb¡úÍôUadkÒO|T'Ÿ®nƒºÙ¨F*\.ˆê¬~ßpÝrÕ9ßøøTÉB«V–âÐŒ«@ê¬ëÅÛ«¶W¥ñZÐ,MÕ*ÄR0YUÖüI¿ðiƒ`«¡‚RWœë'0é«EÔÌT„Ø9,Êj~/×$f¹¢jª€)šyo ÙqBR4jM½‚¤"(9‹ŠrM"«)oDÔu~Ó"Z™c‰ÉDQkjç,Z²R'æL Í,#òªÌÐåËao j¨Äæ0i½ZÕ|<žÞ}8*87'ôιàÉ{$ÇÄÔ6îîa{¿CŠ9_D¢BNiŽsAUÆ”Šä2\Çyš™÷îö涆>_¯"šc<Ï—Ë5§¤„DÄuàLŒQÁØDM2£I‡Ã #R*qÇ’2ˆ‘¨#v†>ƒ) º¢ÇÅĬ28(šˆ ÌÑÈñ(ÖäŽ,š%0¨BUÂÀÞ¢$"ðç®™\CKíaœB>²©ƒRéR‹‘V Vª-T‰­ ^´O=pUñév2(lH ÎPÉJUÞ±óm»ñÞÏÓ2³àrNS´¢ P«ˆ5$c½‡ HM+ ^‰œË ÍÖ­Ò«³©.ùÖùûRJÞ3©è&@[7¦KtÅkÀ¬&([vŒ¸,AÉV%4­*Çõg‹p…úVßÓòW¬Q˜ÕŸ'•,Û–ˆ)ftì Ds.YȰ ÎUL ‘Dóœ'žs׸-[c¥÷j fub¨YÅQY”%cŽfI‹y3 bç‚ÐirÉŽ3÷?ù¾í¦çgskL‚ÆHDž˜Ñù`¸ñ}ãš¶ Á;®´<$O¼CfâVR±¢¥H޹¤9å5eõDÍnws»¿ó¦íwY ¦üúCš.OO¿ ‡Vfç]`fçÈSÎÊbÌ.Yš®—L¡ Zªß(Žä ÔJœL®D3²)S§Ò5¸fJy&J9¸Ðwˆ¤ó¬3˜A.*àÂæ–vŸEÞáKÎçXbœCãœï÷7}ÛuŽc×„àˆ ëšnÛ…àÁðz‡CJÙ¹Ðu]Û·)¥mßÝÞÞÜÜlÛ&XÉçÓK*9Ñ2ßî»»}÷ðæÍÃÛ”žÕJׄýnß„Àd×a¬wÔ0æqL9KU¯vï¹kO¤”RšEÑ šà7›®×)ÆŒ†ÀMÊ”Ç<Ç”¥BâHET4eò “Ì3¨1;ÌK¨ Ââ.CFô€¨U&ÕLHP)Vú–ÞÜߦÓy:]UjM `j%åñ: ¨§M³ï˜Ð©n6þ-ܘåÍ68öÏ/—§ÃŬˆä§8wo‰œ÷ŽÔL–Ðz¤øf¿-%™Y)JDjHÌ¡d½^FÑBì\.érIçaö»èƒ¿\/Zæ'„‡ÀŠ˜$F¡¬TØo=•œ.Çëñ|*i‚”Q-†Æ'Oçï~øîÿø?ÿðˇ!–fJL¨‡ÃüÇÿé}úËÏ?üõƒ¶ñ¶µ—&I#²åâekãä x ·‚%›€o¼ï8a™#Z mç]“§IæÒKÜ4¾ ›(nž'„y·Ûÿw¿ý‚78}{xºfÔhliꃴhÌE…T´Äl"Ñq¹íC烔iÛÃßÿÝÃó|óË‹Î×Òµ¨7.¿}Ø’ÊË×óT”v¦fRr‚Ë5Ùu˜Ç1i{£ˆˆ”H×4XTŽ„PÊ €¡é¼ qš†qR…Ífã}ƒ€Mˆ!Íñt:v-³â4¥ëuœ§)ƘJJ9§l9YÎY4‹@.HÜ춛ͮïÚ0^¯OOÏ%ëÃíÝ›7w eœ†TJÌe·é¿þâWì‚cøë·ßnzøûo¾üòË·?¿ÿðËÓyJl®­é‚hE­%Ç¡ÌLfc*ßýøøóGÿñéøþi:]EÁ{&GF-ïXjý±ðÑŒL=ÏE/ciºòà6mã=[Ûr׸®a+ÙûöÖ7»—sŠiÄM!PŒi²‹‚9”¤Ô5›m¿éLœo.ƒŒc2-E.Ãürб8®0 ©hKKŽ ¡i PÏÅaÄ¢ @°t j+<À)r=)+î–âÖpQö,c1Ó’ƒ+^OJZ%+K²6–é;|*³_%<°Ðê}SG†¸;^ÅG‹Éj²ˆñW—-¾ÎêÈ^÷¯V‡¿©zýïzE«ï–p¡š1-f]6Ã[KõÅU¹=H²f,'÷ò™-:ŸO^„Šà©~D@E3BGXB‹lyQ­É»‹…a5ù. j%²,«{ýLq¥â'ó1¬;†5Ã×97¯ßšqQSA1BdgõWF0…‚(Œ™«œ Œ‹$ç¨ ¡ˆ¥\›NÕ’”u!ÃP§`&ÅjÅ’Oc< ˜Í3V ¦¹T̬( ¢7ô†™‰Q¤dÉÐôžË4ÏçãùrºÌÓežÇñ¦—óøü|3üûw‡»ÎùœS•úôú""Ó4Vi¿XÝ¡ ¿¥iÑT‹JF¶9§ùñûŸ~þ‰™ˆ©Ç4O³j%dªŽ"94HRÇ6g\QUFM$¦E­›Z¾2ÛªO“†¯2ó`ŒhεŠUÑrU¨ZÙcä:B?Øp—§“‰D›œU43j‚ÇÅP³ô»«²‹ÞòÀVÇK‹xj­a‹u³%æbÁ0"9Gˆ–KIY³°)Uf3•\Ñ1òÕRÿ-·pqUþ¼Y’ñn¸N1Кv;˜‚.p{\uµ@)’µEËÒÉ,¾ú5¹ã­À¶™ÄÚÔ¶fù´ %^ mÁ–>ÁV€ÓU¸¼".ï!Å*4–¢ÍÌ¡ºß°s®M˜ Ôu®‹lZ§¢˜9&„¨j*¥ŠÔª&÷›Ž™N3^f­Â,V*l<X³ärè°‹¾(䪆EÄ ÔšE²j~xšN/9­Õ‰.T„ZUc6¡w.Fr»@ŒZHÁ30¨ŠÃâœऺ*Sž¦yN)Ïó<çq´<ƒXñîþÝ×üÓáî‰OÇ×?ÿòë2¾:g1ðÐÔÁÁ fMškM€¡sh¡@æc!7§ü4çÑ*ƒf ™Ð¼gò@‘¹XQ645ô!F?xÅeÕ¸èÉ4*E)8Íóišt»6›>Æ0ô]ßu€DH]ˆýÐõb…>„\­â}ðÞ«ªªÆ.l·ÃfÒ<ÿòó¯Ï/¯ w3 ýn»EB5x9OçËež»®{w{{8ÜÌs~ww˜¦Ñ;2´¯?ÿòéééUêok­¼íc-nN)¥2ÎYÄ|à®f:âdZÕ\-¥¤9W©FŠ  s©j(†‘:&bÇ@(Òæ¼fZÔ´¶<{0G¹Õ3h•\« I‡w7[z~.ãT•Càà™H °9.`Jˆ}ôµ ‘݆8vND§iÞ$?lB×y5=].Cï;väíXr­”“sNÍDDMbçoo÷!¸¾‹v:]ÍGïØ }¨UÇËNǧ’e»ís*)Ëé¬ÅÜ~ëAÇI²¥:C9S1:Oåøô:Ué¢mJÉ“ÖËÜÿòñôððËÿûÿ}ÿ·ï?vý&n¶¦(–Ÿ_ò_ÿñ×ôx®—¤_ö›íFH_ÇÓ4È%‘Ó­—-nûQ]qáTÒ˜ë@ÅF˜X :ª8öL»Èì9KÈFã˜1Ïñ6;·]€Óˆš¾8ð[ 0¡ø˜- €·‚Él.ª‹ƒ›²&ó_~ûí¿ùê»_žêåÿüþøð  Ìr)µfoH¥jÉ:Mét®Øˆhœë”£BÂB `j@† àª"‹UG ªçóøød)—šÕ9×w¡ë¢w>¥yœª JµiNÓTΧér™çyR-ÌXry=Žã¤¦(IjÎJUU%–<Õ,›ÍðþþöþþV%Ÿ.Ç"uÎå«/ïþþ/ß–bý‡8ô.ÆÝ_ìû!TƒRÁÌ:j H†ˆ„Ài®OO'§€¦"¿ÿôaJ6MyœÁ‡¡CœÕ BÃøÒj=CBnâѹ±º/Ûoû.2°?*‚Óù0ÖŠµ;bö]ôUD¦RÅÚTÚUqª‚¿½Ý1[žó”°Ô¹ˆ÷â/#\Æô|̧ªùF¡&¨¨Jœ›CvíB¨ Ð{"r¹¨-Ûó…iÙFô´°´nügÎþ5-ÓZ/°(lÛ„¸ÍþE  ¦ˆ²¨ñÛݺ¸]á ºÞxõÙéJâפ Ëx|uÒº`lQ“ºÚñÖËžàÿ±B‚LVxß5¦ W¡!Bjã‚9]@j‹à-F´‰"—Ùü:¬5Ó%Û׈àªÔ7¼ö0µMµ© ü $ŸÁV©ùWÕJaB\2 ßLoÓüÕN|Í*m³Îëá3ÉÁ/ÖìÜdæŠØ*24A$ÔæáðÁQp`UTÄ5‚¡yœç¢UŒœY˨D@E‡€€BVsD”¯s=–4 w¸|ò¤à ¶$"öHNK4ÕŒ9WÑd„º0L™@{ýJ`¥ÔS-]WǶ‡ ºjÑ ¨¦ÙjPða@‚ÈSšNÇËåÕw]p›>v½óhð:^ΗËekÍDx™¦Ç§§$©ëbî¶›nØoDò,ª§Óù2Nì<3;r KM¥ªH+ÿÚwŠ@D‹‚9vUõõ|)U€Ð9‚5«©!;4)µzvƒsìh®¹@‹k¢1&$Õ…>eKˆ5ç/“1Šª¡ 6”„#ðªPE ˆXÍj-µCpa`§š?d{‰X7´·:h¹@9‘ "#¶øºÊ@Mfˆo›?|ó»/ïÒÄ/bzbgäÐyR3¦Ê( D­2*"DdB0/bã(£çí&øÈ,*—,€UÕ¬2ac?8¦¬`Ø ä£rSUœSQ™Áj`6•<—©ôÜ\ ÌfÈžûŽ÷ßõ ¢ Q»jˆÁZЭ:Frˆ£yTs"Ø dq1nö7Ûýcw>½žŸ>¦×O:>s†Ð‡Í5´Ze‚hÅ¡rÔnï»^ªÌYùN¬“¤ª506$H%B&s쑃ªš2­µ š]Œ;â”À Ñ“CE×SÜ%Š9 ¢Ô*vØmoïnn»Mû>ïœsŽ\ð>ïƒwŽ=sçuÞíw@jHt­µ Õ’Ïçq®*èJRzïCœÓüôüüz:§Rñf¿;ö}™™ø ú´Û>e¥Ra¼Ì©(¨¡*ª0hðÔÇa³.S¶—ã<'0Ë)¨J•Z¦Tæ‚¥ª©¢¢ 211"V©¢äzfoDŠŒ¦ ÅDU+Zb0oàjçñÝÝvÓûóy~}s© UËôúü  ótF¬Þ9ïØDEÄd@(EJ–‚÷n³ñûÝv³Ôì2ŽÌîþ‹»a3ì¶Cô왘‰cp!z"•œ‹šX©eœÓeÎ) ±ßïãÐwµæ———§Géûøþ‹»í¶ß ¤öÛýo¿}zy§¹Ù)1\rpq»9Hóü:Š”Jé%•R £»Ûj2N§ã¥N¦ïŸ~þùçO)z @Í)Ÿ.h6WŠÒ–7Ûm¿¡šKõª¾äŒI'ÎPkR®Ù.Hæ-9J(¦ ʾÆ)_}êûwè~x*¯ãÅø½r?%Ât³‰ß¾ß¼d:ͧ9+w:D%‘`ԹлÐm¶ÇÚÿò"Á ››÷ïï÷à.úÊç#–S5c MÖnNBˆ¡3(’æœÌÌÇ™«ŠZy5cBä[òãU¡ÖÂ= 9‰lµÔ2•˜³cF´°ß„Ð8à ‚ã¤O¯é4Éùt9¾Ž)tÞw1Ìe~=]žŽ³ DO}TóñæëŠ€¬mÙu¶¹âB:»ê®‰_ë!èŠ¿Ú – ¢Æˆ]uJ°æŸ˜¡´Zce]µ:-Á®MØ¢ª¦%-añèªXU=«Yy)pɳ][ \Ä «ÅšÌÔÙª‡hMAm¯f€&""Emä¿\€"˜2• <›Îžën`"ºÌ:W0íôuNuÊ\´3Š­Ê[Ü•Ë/Ôž)1ç4t€ÒæøZ^Ž:p†¾©ËL¤ñàLD«‚?¾ê?ýð¼é.ϯ©gÙ,×:‰H߇aC·½ÉËñátzL5¿ _ ±ßn7ÞÑf·»”ôáñ1x7 •>½€cîüðþî‹o¾þêööÀ̇]}Ý^ž^.ÓŒÎ{Ï!ˆº4ã8ߥœE+äbµš©¶Àì’Óãã‚w»ù㟾¤çç××—W1Ì…ƒ”~è÷ûa³íwÛ~·ío»›ÛCár™úK|ÿþݰéCtÔL’‰—ï:Šjð®ªè4§qžÆ¹ÌÙÀJßa¾Jy>/çó~»Ý¶w·[Ç‘´Àû»›ß÷‡úz<ç±<|xñºˆ“ºdL ðž»Í¦ƒ×éAð4Nøñ§ãÓój·‡CUz½ÈT•™¨T©ÈÈ¡e7’¯´QeàÐQèÙAeàÐuÙ]æIr&«hæ³älÄHp,˜K>lÒ}è?ïGútñ>Élz· ßÜo˜è—‡ãéXR5ˆÂDâ:ŒyCvèb'áµÐó¨[‡/Çqxüä˜ÿíßq·õ¿þð¤ã§±ž­~<ñ˜œ1Þî¾é_ÏÌ\ì6‡K†ÇçG­ÇÁgF0Û˜Ü(n "…*jDÚè}ØF:¾ŒÓïŸJNuº$ï™ZÞð<¥ó9cúáç@M)ÏcetÈ#PIéx<½^&UÝáî ôñùõéåÈÎGywH‡M—f©U~ûðáÝÝv·ï¶ûíýý×Á…ÿíÿ¿þ‡ÿéÿø‡yÎEœ—üûÇi.ª¬Ê• ‘5S C§HYýËhs­DšSJEÕ<’ÿL½B„NTÕ€¨QÝÚFÛ6•Méx)?üòr>ûn·RQÕ\jÍ¿ºå)™ó="OIs.€ ÐÉU> §,t<¥ÓyþôDîÎçá?\~yµ™: #º ù_ßå/Ù;W uMe,¢YAÀ£cïUM©Ö:'Ôì\ì\ ]‡j¨jÄž|7|z¾<ž/§© ;ç}è6»Mï]{²„‚÷›¡‹Á›Z©¥Š Xe)µæÜ2º¸ u˜ˆ«J˜æüøðü·þùŸüðð|<ã8¥Ëe®E‚ã¡ ÛMüâËûàºKšžŽªVj}=^Ï—y.*¦ÕŠh5P­¢¦ÄHì‹Òxœ_Fv™«X­•À¼C¨ªf„£ïkóÁл®ó€Š›¾ßowÁ;"ëû(‚ÿòÃÇñ§GQ µV†:x·éb?tÃÆÝl÷„þéåøé)=<‹˜©¢ŠcÞõ½Ûmã—ïo¾úêþý—÷ãœþïÿø×4¾:nÑdøåûÃÿðÕÍa³úÛ›Ýá°ë‡NªÏ1ºãn»!ÑCìcçC„ZKJ)gqà|ÕZ$³¤”Æ)—’S¹xÚn;µªÚrí̱ÛnQÍyT›bG»Ýöù"—ב¡@žÏ¿ÿ<]Æñp·í¢£ÀUgË%ø~¿ßßíw)=¿N¿d”ãÃÇKJøí·_ßÞž_Çã8!84BT¢Ö>²¢cˆªÓóqzèu‹¡tއèz¤hè &¥*À¨`³Âj 5!š˜"¸}ìÞïô ƒfìG·®ïí%äç[§w</ÿðãó¥@Œa£<0•Z/£Aõ'³ßOd(YY)äóå2ÍñÝ»íáæÝnÓGNŸ>Ú/Çéüëå<á4ëÐåýfî<6´Ýì¢s¹Êœ&oçýPþøo¢z•ŸNc! =¢‚ÍŒÚmÂÐù!«zFxz9}x˜jŽÁ•xrD bÓXŽO/GQAÄR,W.æ‹p) ZUjÕ<:Â0&Ñ:e­Južò§Çß;¶w7Ûîï÷Å7ßþáþþÝ-¹›’/ÿËÿúÿüÿó˜e»Ûí™´VPe&r…P›òBÉ›ùTaÊb’ ”ˆ¼3¡µnÃ\^<' MEÑóõÒB&V€Ë\Óœ^_ÆÛÝôî.³çË8OsMå4б!#9@®jÅÑ­Ø}@WÁÈe©ó8É”|µ€ìm™m±!")³ T51Dv„b jªèÙMŠš*€7ŒÐ&‘VW@;#,÷–¾«‹r×ÔÚEßÒÆh†´`ß¾Å"$lÒ6–Ó·Âô3aúUÅ‹W°6 B£…غ’‡–@ˆÁ­Švµ&Û]z~ó¼âu†×È|‹åöJ' åÖ·ÏÀK-a ×ìÍ¡põ5/ À²uÀuÚ+ÌÈLݯI¥­d%\Y!×(µµÌ§5'¸•ëÔö(¦ LêMÕ¿„šýW=\åWk4ççô o§v¥;Ù5Òõs ÔbXæ¯MÀ hF¥"éòã¹å‚!(AQ5¡î6Ä\Æ9WQÄàˆ µª^fHÙŠäHäy¡âR-¶ï-Çfdµ@M!䈅mNÜ~;ŽòôrÒšÑ Z%Ô.xbŸ²åŠˆÄ Šˆäb¸Í{H3À¼ö}× 1t±ó¶ eßS1{1tÁGQ;_N¢Å«H­õýý½€©çñ2çs$¨ª¢FEÊù|:ÎP«€a aè‡R‹Š”š‰¹ªùV<9žM-WGÀ`˜R‘¢@•Œ@«iÉUC 1F:,„è¼V±P…bDH¨¹Ö”Ñ yGàœVªª @®RTe1Bàà61ôäá®”Yëä4¸WÒI$jÞ–txõœ†þ9Â×ê H1°zDƒb&KDߢs§†&\Zpb$B#¤&%‚¥=60Zü‹4ne™/ñ#WcË¢ÛC|3¾/k€=m ºšƒÿBÕmûJ^ä…o=öjÖi¾3RkCüÏœó×I‚QÓ=ÃÕ‡¸„ô-ß`j:ÉÅŸÿ:€«X¶Yé[RZ;™j‹l–x„‚ ˆª(fuJ‚b¥óÁ‡Tqžj®(¬ùç×»dÕÊšg LÔL…̘ÐMÔce.çÀÊ%ó<ùh}t\‹BU…bDÎ9φ" JÒr(P”‘88Ž! †ŠÄ®sÎjðn³Ù…xP3]9Ö9eÂ)V¬¦DcÇ!B5§}öÄsÕR+Íó˧Oóùd%Í—cpªÀy,•ü¬¤ìc$è0³% çŒ_áÓ¥{Ê}Žr{çPý‰ÝÑA¥2±"¨Š„ŽÇ}pÛÀ‘([ád„!ú¡ë†‚fSpA(^¤ŽBœá²àU€ªÚxDÀL±ó]s9­ˆÄŽ›šˆV1$#U0a"”¢RUÅj‘ó9}øtüøð2ç$ )W51rèøõuš§Zr>s.5‹Žiç\²¨,”nv´€ÈLlÎjbó,)U¬ DØG¿íªŠÖ„¶é]ˆ˜€I‘‰¶}üâÝþþþf» 1ºóeÎé2M§ ^ Ç H½Ýõ÷wïâÆ³×@”Æ”§išò%™x†>úíà·ƒóç?}ûçï¾Üí þúñÓ~¾ùòÝnwÓ÷¡‹ô—?ówß}»Ýv1úí0t10aÎÙ¬‹‘‰Ø;DPbô ŒKˆ€T±¶ÄK`Gì»>GŒjZežÓ4ÖZsì|Œ÷q¿Ý‡ûç—ñÃÃøðñáx~E†zç tÄXóy–ñfãû{¸N—O˜ôпãÝŽJJÓó8?f¡ªQmv¾G’ãùt<%3ï}g j  #: ¨2?Óiïn÷qÀIÄГ‹Ž<;D =Mó|§„ý¶ß `130)Ùʱ:þò0ÜÝö>l]ˆÀh¾W¿¸h”s¬'VªÊcVv8xÚÁtš^wèÞ}ùžÉÿúR?œ°ÖºÙ˜}?ÜÄþ6¥ôz: X·ÛŸ‹»œÊEXÑÆ9ýøÓ›ÿøwüËßÿEjúÇ¿þ3þ8àŸ¿Ùü髮§ižàŒb"¦sŒöÕ}·Ñizøx9 hôÑå4¢ÖÝvÇΕ*õRˆÐ{bØí·E,­bSšOcNÅÄœˆU¦¼mzÎižS©•Ùï‹àe’š+C™‹Çâ=ýþpùþç§ýnøî‡£÷ñûŸÇdà|U§b€‘X¡6}µ°!QS_ZK†u+™M) Í­Y¿­䫊¼aõW®úzq!2P?®e5v”+&u³’ƒ3µÐ Cämáù*‚‚©#È`š²–Œ¢ìœ#\¢iÙ§/“,· @A”É”¡ké›D Êjjꩭס &0tKª\s~ÚŸ–’÷šeµšXבÿÕ_gÚ ®+t½Ÿ›ÐU‘—åüª†\—Š]¯*Þ53 Á¸íáÍä my=І×Ë}Y),KýUcow÷5$ëóÌÂ…üÙ #Ô«Šyá–Ðò'ó}s \7! Ë.ërÿêÕ]†ümúÚXâ ŒpéQ|y[^´WµÏº“7¿¬Ê§Å ¼ÔIoñ_„ÍÜ«f€LHM’…kíd«Àás9Áb†\?ýfa¤Ö_-v…+tÉ͵ÛšaÌ”ÑB4)µè~×ï÷qšÏ/Çc‘bÏä¤Ê˜ªÌ è#"‘­èþeB¬hvU1’“©*û›!º¨¢LÖwÔG=^’J5+È;g¦ªÚÈ™ÞC lÊiÖR= 3­„%::îb`竚ÖÔ1í»O›A{ïì|>ÍÓXDJ­Ž¹ë;C8Žgtì†ncÁ;Ç!t}·!„ãñ¥–$¦9ÍÁ»Ífȹ€ a+½T‘½g¿í»~èÅ dñä‰ùé|üíáÃ<™½'öÎ!£X-ÓsBväth˜E.µ äÙ´ûˆ¤¦b ‚Jr°À»#™j™ Š 0#uÕ Þqì(¸¢2§™Þì¶:žJ™:¡^Šéë÷ÑýìT"d" n0èªùbXÁ)vHÑ €‰i2Hˆò–íwÕ-PZ[æ >k%Q-¾˜v\´‚­|Z­óui¨ Úòš¨QÉtõ,OÅ•Oºòñê:1X5€Ör hÅ4Ù{^×ó¾Q…—Ø”ëã³ô ÍÙ¼üï¤+ Û¢ãí`m:¤U!yÍ _Ç «¨FÆ|=KÛ/jµjÉš EW«@Ê ©å‘°5D@æpÑâb¯›5íªl¸>Uɹ\.ÙdD­ýÖûèCP0ð–UR)¹¢‡½'à\Ìvè8pú}ì·æ:ODhhCe°Z•9ótCï¢ó•ˆ™ ¥šUm±o%åœ3ª”ZN¯¯DÐE»pswg¢ÓùÎuÔ³93T4‡æ Ö*z)ó9Ãö°=ìßsz9ªèœ²ÞmüŸî{ÏÝþ‡Q@"T5-¢}îvt+‡þ8uøé¼ïËŸ|ìr7 ÷w›\Âô¤TÕ9˘ôå8Ÿ/Ÿž?=~ÈyDB nØlç,ÇñTÒÅÃ1„î/ß½ÿïÿ›ÿêt>ËåÓ&ý~ñýf¦ñ>Ù”ò”R`þówß|yÿÎÿøòò/?þúá÷Çiº¼œæçãjñŽ9„'EýÎýé·ß|ýž“é|:½¦”ç©¿ùæ«ÍÝaÿÕW÷‡w[ÇìÙ1¡!šY)ÁÀ9b ®s^k­ ¼1B.¥¤¼ä«+µ”k-Õ ;çcð_~qï]Øô/!¸§——*À¤A˜Çé·ß~¿Œã?~üñ§Ç"Ó0xï6CF6֏߿|zyyvˆ·Ãæîæ~’s9æ×—G+€qfDov³ÅaØ_òðÛ‡úrœªˆc#NäØç8šA®˜µVQ1›…_g÷áU7%ßF‡ª©ù™O¹¤,Pw›a3t28Ÿ¬¨3îÈß÷ýv~ëݯþoÏòÏfQ ‹åZÓî®ÿîk÷õg©Pee¿Á¿¼—»Þv›-ùNóéÓiŠ©øJ äÍÒ”~ûåÃñéIªsIµˆUPô"¡æj6÷ÿç?þÿå¿ûî¿ûoÿëÿïþՇǧ×ß}tzD¹çrÒz–¼ û›áyòßÐO¯¦ùåã|ë‹gï)ÔiºT¶]F«&ývÀ÷ïv"󧇔ku>0Ò8//¯/óyœÍŠg¾zOïßïÿþ/ßÞÜt~ýýÓëñTjÉÍœÚÒÊÀ'©¹2C`–Z—çÝî¤uô(R•%9J›RC=`K––.ÝRbÛ½ä´ÁPÀˆQ÷‚Al"o²7¥ÅƒÙ,‹wŒ¹½ž3«Uõ@~­ñ6„.Ã^lshcDG­Ž3n™²LF T ÔDÒh _}½€U¬HHÞV«ªÀèpÙ6T³ŠTm‘½’]ø:»"=Ú.¤ ¶Å²¹dSéU©²LªÕ@?Û›·Sa™-# ˜¼©pà3ä=-!a‹³°Ùš›™ÐVæuV„ø–‰»š ì*l¹ªã?kÚ¥KŸ­ìJ+½VÝoÍ.R³Û‚í[‡mD·Èÿ[§Dt²°Ï׌d" $Ñ*b@žšòß*˜ ’GôhË{d ýgv^½k”ó2Ç[@5+¾¥¯èÆ «g»ixà-N øUÄ›Áøó8'Ä%îáj$¸æAãB‹²¦¹5.j^a·u›!Æà¦TEyèwì"€•,Uب#òFd¦ÐÚ<·H§–ÒÊÆJ–†^ïo÷_±{·zÍ-€ív¾H4ð0ÍSÎ5ÇlÓ<: ]×m;©©‰Ü |ÑšªøÁ‘cª"¹¨€©VdDlÑ] "ªVÐtVx³Ù~q¿›ÇüóO?Íy®Us)¢‘R-ã8æ4ç”K΄à‚'¢œæ4Elë7}¿é=ûÀHì}·v½—qfò}DY!SÐj¦Ê¨ìP Kºd%ÄÁ¹Ž†­MÅ´(‚*1ƒˆë©*•Y K !Æ` Ç["dO̘ҔælšÈD²ÌÓ8¥Œ±;¤t©5«a¼ñm¬S‰rŠNÁœ’'š"ïXw%s“ZOS9f+³­n*Ãv*Yû:Rój›´@‘+®»ÁVûҢȳ· õöŠWÌO{"QðêØÁÿì ´äƒµîÂÖ”kÜR\,<+EWEå¶wææU_tÕ}®øÇë¿o’¤vº9B3­&Òüõ =ÈTUÔ-§:ª’!Óu›q]/€!ÈU9ˆHÞ2š™˜¢®]Æò‡®ú(XÆ U ñ ‘–´r„º¨LÍ'5`úÐaR™K1”#‡n¿†CšÎÓéEò%i[*ªU¤Öœ³èT¥+CÇ *“IR ‰‹‹Å3ß®B)yº€s>¨š©€i®9'€‚óγ’ïbɵÎsJ©xbq¿êRš^/—bN]S¬¥wÜŘçš§23Ž7ÝÁ7Ûng’)£î 19¤ÎÌ 5P“™c&rÞJQ€RÊ”jèw¾ë‹à8Ö1K®PŠ#HUmbÕÓi</Dì}è¢ówDŽ˜CrË|ÎD¥ 2s¨yçèÓÃÓ_ÿéûÿðÿÓ¿ü^¥ÄèWg»–œÒ<—‚¹X©&U•˜UAª‰´ë`‘‘ˆ‰¶$vT`d¢æH©¦„´ÙÄðÛm‡Ý~óîÝíá°óÁ‰VõàhJETEååùù§Ÿ>\¦¢D>¸w7;7Mù|ž_NÇÓ4—êBøãnÿ콩”œµ­ÂTÐÊn¿ýöþîÝ¡í.Dóe<›âv³»½½ún7ÄÍ6„Ž ZAƒ&×R礄HÌÌÍ”‰Ø+°wŽM¨JÕ•LÁDŒ¤ª–RB0çèîîÐõÝþ°}x:<½¼_yN)©s j‹‘œö1vÞuÈdžƒ¢¿½Ý ÝyóÜùšNOOuã{ç·êžÏõÂ5ÝÀ‚•>púŒÇ‚ê ÒWïoon6@ôÿsõ&O–$Yº×TÕÌîàCŒ™Y•UÝE¿×Ý <„ ‚üç,@ä <z¬ÊªŒÉ#ÜýNf¦ªg`¡f×£ß23<<Ìͯ™žáû~_1Rà<Žåp«Ú.xþó×ùñÓñMWÿðû›wѨ䀚"†«bΊ! iu<&Í».C· éͶÓ¿|-ÿÛçÓ?|›æY¶!`Õ–Û®ƒ}˜·$po[Ôå&B-åÓœg“2úñyÎﹿMýëýMŠ4ͧ±NÜmŠÂñ¬¥Ô€Ž^LO7ûýßýû?üø›×ûï~óþþ÷óó»érúðñØ'#âÛWo¶›=Ÿž/Ÿþd2õIobH‡êJχü1žoïö؇ͮv»„)䀵LþÌŸ?==|=¦˜f0MåxΗ©:`ßó6aßS—øÍ}¿ß&rÍs)E™ :Ö.¹‚^Šˆ!p‹¦®ÄÞǤ £J©u˜"*h«/¹”/JŠ–|Ñ`*„K€äM„ìÜÒPבÍu ßo®!‘þo¨™.„ÄàÝ,­ÞkHtºþmkE`;€éêa¥`¨9Ý  ¶nüмpoUD€ T,RN±DF­,µjŒŒí 6gÀèK.i“Ì.ìÈ)ŽËøX¼Y €™¸¶96 áâ¦]^DÚŽVÃÐo‹ ¬ Ù}‘—x;ïa!¤Çõäjüûh/;Kâø2çF`|É]dñK"áËù·t#°$š-,ÎÅ”ü2_ÎôØé æ›WŒ­,M\ÓÇLöè²voW¨ŽàÖ E† f.fhš"R6à쀂08›!`X?Dv=õW=ѲÒÀ¥Ú_}¾œVæÉâd\¤þÞnåz«tñ%_ËÂï\ÁvUb9 ;! µ"¿¥z^õѰRF¡qýMÉq—¥Ú8Å »M(e<²©©SóyKAƒž("2˜úú9y¡O­ÁÎî ºKöÃÛþçßÜÞßmbŒàhÒJAðx»I1ôf`Za»Ý›ùׯ3‚ö1¨âá\γ08¢x8Ï¢Rº”v!¤´ŒÇÓtºÞ¦Yd*%¥¡T[–ZÅ¢G)Üîöïßÿx9_¾ˆjÖR¿ÖÓéœú^̦iÒR¨ÙV1böRs±’+Ó¹ Á» J†®ÀyªZíxç|wûn¿»ÍÓa¾Eª¨¨‡bDsÐb~ÎcNݶ 2¨æh ˜R ˆÝ ÉÕCb$«Yºî~DN5Ò𩞵LZ¢ç.lî:FÉO§G°yל²ë×<_\Äi+ ¦Ué¹ó¼£Ð6¯/[“>š ê¤,@˜“4‡¬V0mŒà>1¨»¶g‰áe‡¸ÀhÛPcý´Qp®[*à•ëc°2É^4<þ"øú¿ƒ.îzC4tG§káK¤¶-ºŸ+;Ƚ üµI—¤t"Z2ànN†-×¹!EÁ˜ÍP¥‚H+ÒWï‚W¦Ziœ56:+"A3¬~{ &k?†–ÄØÐ43Å뛯üްT-ŸÍV+1£)˜ 7ÄêhÎiIˆ‹KV8³ÊîþÝíý›íöþññK™æ)$#'s—sÎS5ºÎ÷»m"ÊRª;UN©-´l7t£äRT¬TáÌî `µˆ”ªÑ7Coµ¢AJ=ozž;_Dt<žÐ< ›[7ËÓq®ÎqÓ Ž ¦Bìž²<œóÄÃæn¸ÙͻΞYNµŽ:Þ &êhƦ\ "˜²†ÐpcæÐíꮢ4:×ã8ÏsÑZ ¡¸‰X»©æöõÛsŒašæ¡ï÷›a·ú QPfCt0“æ¾q LæÈÐ¥n·Ù>?Ÿþ¯ÿôÿóÿòÿù—s¶û»ÛÀ1W©"îZ‹HQTרë†ÉP÷"0g„@ÌŠ-¸ÙÀ]ÝÔÀÚdÏ@ÛNÝâ¶ï^ÝßÜÜìZÝ:Ÿ›½#r¸¿¿yuw«¦¹äǧã§OŸ~ýø8NºÙn†m$€}­µäRÅ€x³ÝÅÔ‰j?$3ÎÅÆi­]77o7CÚl¡Þovoïnþü§?6ÿúç›í[›§cà[¡LpÙì]fßÞt›?ܼº½ÿ¯þæ¯~úáí\ýËa>L®B§çãׯ¹jy~:|ù:ΧéÕÆú·üúM·é{ðZYqHR€uΗ¹ŠØ6Å÷ûôî†"™|ºÄülÿï§ü8[â„É ¨–Içê4ƒ; ïvèĹâ?²ÿçc½@7 Ûàõ¨[¶ßôÒE{˜0Ünß½ÿü\¾>¬9 ÊL¬õ»ßýÿÓ÷7ó»·ovï^߀äøÇþå—?Ÿgœ»wÃö7¯ÿýßí_ÝÅÿZC|úúõ”é[ÉÇÕ‰ÃV1=œA³D\öàÚòXÛ·eŠéŠ­QsC$b@^C¯ÚYÕÊ)i‹9D@P—Zg"dHí’Í™Ù!6æôÓµ°óÛü^\܄̱)‹©5 `ë^€U«_§L/mÏ¿M ¢Å°„Ò6€£¹{C”28z;‹¡¿ÿgì<ôæ¬oÿ¥ëľ9•iÕ3!5©Ñ Ò[T¼Þ8Mn«Û®ÆB¸ømBöÃÖ︻«¹º!2-̾¥|F"@]+Š6¡4k…a³RGD ¨ª‹©·Íuˆ´0qVëàU¹/9Mu¶Z –~çZÉ/ÂëåKÖ{õ²XHˆË7¦%Öqéq})ù­Mg Æ-¶¤y_HH¹ÕÉj¾Œs †ˆã$Uˆ E´d5où‘@mïqMjÅU&†m ¨õvÞ¿^ßqꪹª´Õˆ™›©.áÍ(î愸ل>ň¹ë˜ç"sQñ††!'ÓŠŽs5UƒRì[Î!]nÞ ´Ïš©Š·Z5×Zªâ}ä”B x‰˜Ôœ/—‘˜‰ca³Ùõ1Öy§QK©àµä¶:]Æ,•lwýO±¿E*µO—ËyŒÌ?½ûÉ žžŸàó|ü&6!xö)(Æàf‹«ÅŠQ1F§€A•Š*L}¿v¶U‚Š”’/9WNwÙº"eìýó%@0×Lî¤>0ÇÀlEµ‚i ¢3¦)ë\‘Ä;QP-Èääô‘™6…'À‹C 6é´I]iòþR´–K"t)Ú%Ë” ¯†¶ùkÅvsP-9Á¾úw–æ×@.ZDû/ò9Xb¿˼ØH^Àž­_žýàIËf­¹ª–®ž×mãÕþkÉÖ6z`­±Æ.@je¹»‰ºƒ™;Ñ" ’uE`àºdic{ºÍMÁ[®" ÙÂÒ5Zð; ^9jè„¶\r³öâ‚5Õ—ˆ¯¾kÒ@PhˆX­µºd°ó(#ãžÃLdž¤ÔÊõÊgÃÍDZVñR,ׂ…€d­ts”ù,¬”â\ì\¢…Ô™TÏÜ^žÄPÙ-HöÙ „c@PB&ÍÉÔ…ûaÛoJ˜k. R§IC4â¹Ú1“ó&ƹKAc4B+’çù@¾{ûúîîfxÆyšÔÎà•B‡¡3p„JPûÀ-£TЫբn!Dæ¬xzšFÉYá2—ó8—¢DÄb^U× +¥^.#Ö\]­#cL2@êúIéœÍÉ—ªEL`Yj©¢€ƒG.b>Xÿʆ7Z«U©E«J`îÓ0ô}­5Ï'—ª6[>Gà(c=~žÇ åptS´ž—„„©sÀi>§M7 RÍz©2TCgšÉ¡§V˜â.Å„žºñi;}¾›?¿ê릻µ^¾;΢ÓùëÛî§Û€¨ÿé«ÿïèqu†˜€[ãh›Ðm¡j-†Þõ_¶VKÔ!4ÅLó'ÙêÔo [‡ÞiNv£–°±ø‚ýšhò=×ÇÀ+š8¸##Å6ˆÂ–rJ îÐ!1¹hK`À`騂£;»·­˜;õ LjÀ$Ћ@0G_@W.Vƒ{ /£%Òõ"¯ gðäÖ(…ÌkW¿ ‚«CS…:5ûƒ:´¸óIük•ˆ°Ûv?ö´ó§“]ž`[1 x>_TkÉ#$·@æ¨æàhà`†Ô–0Ы¢)i¦:™™T‡È^y:{ÍÙnïh·÷j8¨3 ˆæ\5†PÈ2IfpfD­6WLI)Ìãu¼ïxÛSm£"Ѫ—ÇNNènl»»m¢ìuªÓ%ÏtM„>³0y`@bu¬æZ –´’§ õÉž.õq¿^x¬Fà*EÌ Æ>F"„œ§»Ä]Ü­ÖJL˜KVMgÜÝíÝÞ4•šÇiõ.õ]²Îýúõ‡ÃåáË·§ç“ˆˆ ¦€N®dªæ¦PˆpÛ‡Ý6ÅDÇóüðí2N*H¶í(©dѪmÉKŠgЪHf†à›.ì7ОŽççãèî!àííf» Û.šÓŸ?|ùöxºœg5‹}žŸ.¨ ¹ÎèêF °CJÄ ]ÆæOóxúõáË·¿ýw—¿ÿ»?¼~µ¿cD @Ô–MØ ßmšb €¦–‹ÔbŽÎ‘€`M‡à̈Ì^´¾jfU ÑÁ#3!3#€‰·Â•Ð!r¨bênîEj©ÅL»öÛ;䪔9#à8—§çS™Ë»7Û¿þÍÛßüæ·]¿{z>žÎõó×Ããáü| Âé\>ýúüvóf—ö“sÉI©ã€¬`ˆ©ï÷aw³ÛØÓñ[-æÖ{ɇÃçÃøEéTä|xšÇ”íVq_ÁžFy:ûO½m©F“Aú}PL° 2 €¹@_ŒQmž{1 ›Bi/ à&SðËû½ýîmºÝkLI¥;Ëiö›}øùU|Êß kVÄÉM K‡Sqa£¹ãøy®æV€¹˜‚í6¾ÞÓ6æ#ã<:ÀíÍþõ»·Û›WµbžGÉÇçÇûù¯þæÝûß ÿ¯vüåÞø‹½ú—éæ[½ÙÜÜz<™|«þ¤v¶"îŒR7l†]L]=ŸO7ä°%&€s¶§)Œãî „Ó´RÁÕªaho/URÝL€'eŽíÓá•6³Â8Y"ºëzïãó3œÕCŠi+ÝX½I#Ž'6¨D 6àæUå+_}-Yî¸ãKêëÂeÑ¥NC7GC`ú.q ÁÙÁÔÚÞ¸!m0›€¹{F䀠kH·Q´y›~]Ç;‹F€‰¨1ðšÍ.8mÀfD NXª®½ èšU‰nîVÝÌ¡"ÖmÛãí.¦O{>d5§÷Š® nænF„‘Úâ™h™êSkÔTÌ y5ºiÛT·¿µ:WÂb+0|AñÓºÕX¢6ùªç¹šŒ})þýËÕ&ºàÐøtÍÆïú¹öïÚò¿Œ°‰Ú¯îØ5>ØmÑã®çpûK‹{Ñ9µÞ¦Au F¸òR'Fs-¶ß¯;’a£s""Á*õ_Û‚«úQÑ3Bfrð0ÍhN ,ÀÖ $دç‚Xië¿Æ-Ùö,PŒ@]µ`RÌŒˆYAÕ CWÄǹŽY«Qߥ˜RJ‰)!›r¯~»cscjÌ(›ˆjÓ€¸1k ‚AŒ"Ç@q”<ÅV¥+ IDAT•*^¥–2ÕZº~("—qÊs‘9ÝðþÕ›YÊežÕObèˆUåp|cqàb8«V7)ñÖ=8L¥”ãá4O—Ûý~·{¥e˜/§ãù|:åóỈ»])%7±Š9Q)Î(Œè †nûЭއçj¥Ût}0Ø8u<×éìZÐÀC¢8Kš.¨—ŽgBQLH•CÂÍŠÔ¢9™hpÍ2è:5PwõhÐsìûŽP/py¸»üåw||ßǹtpÃùÄÆi~ßÑo÷ðóM¼Ùm=ÄÿïÓéá8Ò¹ÄÛSk ¶Å[[è-bkláæ*!6͆/‰ ÿ[Ø_@lÞüéˆmÎñâ³Â5LÑA±±Å®V!\c»¬½'Å#€¡ y^LÍÕ ‚VÛô!„e‘„ì >°#ä&ÚäßÉl1œ)To#ú¯Ör_$™×5+]·«ð¾Üý¾»i¾ÄŠ‚[s,O™-+Fz$ tÃÓ¬ð•n~âM27<̈‡>m¶=bÏÓ!›;Ä4¤>ª—"…‰(D3hU52õ A#T«£š©'"$5Ç“Ž'J!tÁR§Yòù¤2WESC5<BPK14“y6ô®»](¹¢O[âÛ€Äqr˜ÍL”´n¸=z0² ÃÙæiM)t`fqu÷ªRÕ´} óŒyìPS×99æb¿>žþü4¥w }€. º«‘¡#CŒ9õ]·ÝnR ZEsŠÉrñI6‰wC×§>Rœ³”,è :OsÞè6Æ;sz>œO§Ë_~ýx:j™MiH›¡ïÀªQ›s³›Íöí»û÷oîá_~ù볚§·}zu¿Ïsž&â" ŠˆŠ"8»yERŠØ¥x»ú.Ïù|¥&бOÝf3Ün·›ã9ÿåãçú—Ó$H± F§ÑÕ„ÜÙ!¨1FRµ\ª–Ù%ïnžúí|÷ê6ÅhjRÉ=°£×\M ™£ª¡©VQ7 °¥ÛPˆÝÉ]›…ž™‘ÝM«ÔªŽ¨š¨o€h†Day Z5SP5­RÛÙAÈn0Oy ƒyÉåáér8NCß¿ºýã?¾ÿáíóyüøõó‡/_Ïçiœñ~¿Ÿ¿ýó¿|îL~÷ãm`KšÙ¬ÀÃÐoûí> ›.¤j<æz>•\ýëqþú<Õ‡ÝÍVcø¦*.jŽŽ¨§‹ö'I("”noîS†Ñ´ô=m#‰ÁX´” Œz5>OOÏc®{àMVPkÀén“nöIørÆð,ñ¾äq”?ü ?ÄéÇ!×·Aª|x>—š

Mªpn ö†VÙ]›{)Чçž"Tbèú¾ëR™ãt"UB5ÀêìÌ æ>G*„FFdvLƒ9"i t03µBä0šhNm` V檆ˆLèÚ«¥`ÞÛ„rÑú@¸ÛøÀ³CÖ 0vˆY ÏE>Ÿ`Ÿâ>êóNïñüe'¾Žz¸x Ô(˜bTb0§UÔ«ÜÛãË’¯ñbø=º =Ë€í-³ôà¼8jÀm‰;ä†o{ù5ÌŠ#¸€›µrÈ,ƒeA¬+êÇÉ\„ÐVµR‹ à—Mt`D^;^­ -º¹éùjÒº]’V°†zÃw‹S¸æÎ @ó/wÁ—bÔLö@ŒÖx©êdm³Ø(ê-¦YÂè’éÓ÷)¼íßsÚ$-Y5ËÛ>PF4 ݆ތ£ %„`¢Z³HÁ± A]K®'óMg1u„ä¨v;#t€ê¬êbVܪ¨@€\«Nu22v \°E¢ÀHTÕf÷ÝSƒ(*°pè9 1׌Hàƒf1œrH®R¼\È‘ªG‘° Ö ÜÕJOOÓÃCÎ|û-&nþkÒ@Agî™Ûñ^ªˆŠLÅN—oöÛÛ7›íŽ˜«hž³éRbÄ*’ç<Žó4ÎO_¾|ûøñ¡”r»ß†nö71Æñ2Õ©ºÓ\¦¹æÍ¦¿»Ûm6Û\qœóeÒSßQ—ânÓ¿y}·Ùt¥äRKˆ1v½™_.—Ëù"µúêçÀ)Åýv»Ýlò\ÆËér¼ï»êxƘs™ç9†ps»úDä(„Ðw©‹‘ÀZ®¼Ú:^53D¤¦óY:qH"¢ên ¢•Äͼ%Ò2¾Ä‹z`lk/dŽ„<Ïr<\އqœ'U‹!S®2æ\U¹ÒãaúÓ¯_g5—ªÌÜõ]LÁ úK"Õ2Ÿÿò˜Ã0¿•ö=¨BF¤°MÛݰÙu‡(2Ÿžçùù\?~ò|©Oçsµºßv^»,ÀÊd-£},é—'Îs—òMÒ~—ãþë¼­s¾“x;`ô1ÂeÓËn“¶›ýÃ<'„+Ê~MÊZt9Í.ÜܽËp{âw%ãBíßãö²o®^¢E 侯8¬BâFïY<έM³å߆¶oË”kݺø_¤aß ˤÛ{rùÓ6½#oeyëbÀÌÈJÚ×e‘Aü2ç[Xèþ2ÿó5N¡™Ú—XÑëFáÚˆ-e‘~75\×ëa½Š^ÐÅœ€HÝÁˆV;®Ì „Õ,ß®ˆ3s!àÑÍÙ(4¿1‚ÑRÖ/¹Î°|3ƒ™õu Ö^êèAª>>ΧÓHTS°»›Í[§Í&2:!™ù4ÉáXŸå|™6}L)ºáç‡Ã¯>âÏ?ÿp³ß¥ŽÍ äŠL‘©‹Ø§Ä1:jèàÕ ¿yc¢i*YP!VóÓxÕÀ1sŒà:眧ªZ³4)IU=2f™«dÍç}‰c•:«äŠ$܃ÌÕeF³#Luüã‡_žÏ‡.ªv™¦Ëx1­ P•%ìúÝkÞÞ‰šÌ›Ï&s—¸ºRf™Tžg›<&u"Œ5Z&­£×œH88¹3bê ܽ2 ˜ Pî•ཻ›žUK$A2³âèƒbÓ‡4µRï,O`fÕ1‘^¾ÅZ:˜Cä9¦ÅZK­SóxQt©Ý™ÓcÇÿåÿëû›Gˆÿñÿ3žkLdòÚ´Œ+jWš6 |É: -;lùðÀ¼Ý>VþïwÉ´þÉɬÊlA¨/³”õK0.–y·êžª8$Ç€h‚^¬]2)˜³øÊ^²U¡aÞíP1v$ëc0€ZÕ‘ØElÙ+2s£ñš­!ÞKß¼è —7ÍB nÙËö®AÚ€§ˆÒ,@Üf¨ËvÐÛÊ€°I¨PŒ b5üóÃüõ0ßoÓï^÷ïwv~~úz:ÂͶ.{u5§ÒÐ]H&z>ûåx©:w)0h­æÊE»ºÙnÓ€ˆûúMÚ¿Òœ)sÀÐuU&“Љ±e€)štŒC$¡T°š †Ši4/‡‚KD5b8{Dqsˆc—¶U¬ˆ§KTaP—Ñ3ª#XŠÔqD«Zg6ãn/ž¦‚% öU}ÔÂL£»g©æ*Uê8Ïк8pT©Û!ÞÝüîîîUê‡)—RËå|1·¡ëcˆn&µ<>>Ïãç/χS)õîþöÍÛ7)v)¤ižkž[\w)Ñ÷7»~蟟O>^&Žq³ßôL ] ‘‰ši5Æ„J©ZÙ‡¤‰Í,pú¾ïcJ!ÆnžêáùøütÌeî†èL‡óüá˹VW…ªVÄ(n-#Ã6¼ä¶cjRÆåä"àÚÜo‡Ý®ËÅþéŸþ¢¦ +6D&2ó9Q½¿ß¿{{ßwDdÃÐßÞÞ¼yój»éÁÌÕÄWlnCƒ0"vh¶EL1&p¯b¢fî¹Ô ª†Bษ¶i% ˜cQ¨§épç\KÕ9ÏHÄÜܻĀþð||:oÿòùíëׄ!Ä %cT-µrÿªÈ­¡*Þ[z½‹Š6Wá¾ï7w¡O€î:MÇËã¡üå!ÿñÓôéQÆŠ¢ª&GRe¥ØÌ#êáéÇ1ÿƒ)+1wܹ…2 ©t¡ÃyƒÇ¿~‹ÿá¯ßlîºRè1ó¡rŰ"ä9¦ Î#>æåBº Û ]»}æç©LoS~=ÀOwáÓOG,ଭko#²È–°Ü¤n{bê†Íþãçã‡ÿ笚Õ,Z%-—Ëô—OÇ—© ¾¾ÇKùôá[Ãoþùïþþ¿ßïÒññá¿þåÛ·oÇ×Lr³ß¿úñÝÏ7»Ýáøø/úãLJ‡I „Ð¥Jt¬e”z®ïîöÊ©VNI‘ŸÇX¨Ã¾ë —‰ó4š—ž,&q–Y(+´Ú¶TA„͹·Ë!° ÙˆQܹ£˜TȤå¸Z«‚ÌÕMÀ%°Ç@µ88`/¸¾ ‚›vÅ ŒWôGå°²a®–a3pãóYåã«Ý‘µ÷¨ ‘ŠŠ‚ v¿R§¼¥ÊãwkîVI1¡™Ö^Ð`¦}ßõý6çRKƶo>ÓvÔ0S?‘Ên€xÎXŠÏN,]›ÔÃMÝÌÉ™|à°ÛÆÞîxscf»MøóÇããI§’9®+ 7WÕE˜³b$Û:ßÌÊç•‘‡hëñÝ‘¸°w–‘7-å}÷ü¥‚„›¿TË‹êЀ}­ ¿)ú²»Y€ÿ´05›uc™û/iÂWÙ?øwa«?`¥.«[ª|"wnn?XÓÜZ|п™XFÃäàè×"@]1RWüç‚?üŽ=µ*-5ÿB$Z”°ÌØWÕ~Wq_KßAÌC£8šÖVWñ:× öé^óÚ7.Œ’:ﻄЕŒs6ƒš²bYŽØ²XÌÜðé¯WÓ¬õ­AvƒiÒóe6Ÿb7Ûô‰1¥ˆ1FU;_ÎχË8fp\ë4/—Ëå2‡ZÃvàz€H¬2B`®*õnßÜÅ>úœ/§óTÕLXžbà˜(† >Õ’ €¸å9‹•ª:gWupC³ˆÔ¥>vÃ8KžçY-«4qª3U©¤ŽULc¹Ì€E]Ý4¢' w+LžØUÊ<êåÜ1BµÔš'pan$H ÌŽ®õ¢j ÒSqdÈ4÷‚”)V©nЅб¹še"rPU!« ˜Lõ¸ºÐÍ@ Œ(Eî6Á¼ÎÕcŒˆ><1ÆnD%«Èj‹kÑz¨E6É6³[.Bòô>ÎïSÙþ¥{•öwUvÕS)Ä` „AØÕ€Üƒº£dÃÐE¿BÐáõ…kjö [³ºq ¹Cp\ÀS†ø],vK[ Ñ”aSSˆÕ6r`Rr7uDd&ŠŒˆ¨ ¬Ì°¶èø–ÖJ5Pwp K‚ºY[7ÓÒ·+ç¶œ3ZyÌkƒ-£ _RJ^Ò²w´ÆDis °%`ÙA_Ãq±-‹W¨#$5Ìês)—)Ï™^×]WTª˜<ÇÀˆèXL`v„ –sVÚ B»ZDÔ@ R2£ÖyMՌɨ#»8„Hޏä¶5@™bê1Ø\PJpdŠŽ(ȨÀÔmiK¦&Ü›;iVŒ"p'À"…\cêœBÃ3o†¤æS1d"wŠÄÈ1†(Îu®f*ø¹èlı㘱֢ZRJSuPClp%bÌ9¡ˆ\ÆÑ]ªH.…K©¥”œ'@BЧóeÎb×[¦«+Ê P™aèÂfè<ÅnœÊ—O_¿|~T‡Û»Û@mslæ’Ë ´J©Ö"R‘8v›“C Ô'ìµ\NçqÌ2m¶»Í®æ§Ãøíi ;8qDBY"½½ùr|}bðª’hbgf$3Ne’ZÀu»éonð¬ùùñ9ϹëÓîfØîS®sLCßu»ív·Ù]/ž4_cú¾‹ì„EØŽ1Œ10Q2¯ª¹J-âf¦jˆÎLÔÒ*ª-#Pƒëòù\N§ñt¾ˆIê™bR—i–9ç\ ƒ¾ºÝÝÞÝME>}üóÇÇǧ9ŽyÎ5yðB¦)„;ÏV¿¡Ka¿£]”ƒ˜Œ³#x <çòüüôåóñËçúíÀâ}Œ‘J©¢D<` ŒYjq©„Ð1¨dØòe™{™¢j×w¿÷W8᯿>üéA.½zT mtTfîŠèó,Ï3löp³Kïîú?=?üòëá‡Íííi—ä§WÝ—)~«ø8IÛŒ.¿Aô-9¤>{ÀÏãôôøøõËÃi.‚"ÖÙ …a–Zd”?þééã/Rëo?M7?ýpGZˆÃÍ~ã(Ju}ýúÍñW?í‡í¯ôñ[<…ãTc7l6jçË!瑌ˆ  …‘@ü¢cL¯n{…HF÷êR1ˆÜ­’ x²Õ\™#Ô.àÝÍÁŸŽ—"2…BMR ¹hÄØ@«uIDjfÔV“‰0ò0tí¶›aþñ¿NElᴾʀ ½ÛËÕøî€–È`XD>M,~} Ø:Ô¾†U™š1Ä:ÔÖ팥ö~"o®¸eü‡×—ICBºèR†/‚–“ƒ„ÜÂÌmÍ꽞£þ’|†Ø¦îxu…£ÁwQVßË‹ÚÕYû–Ð0€ sI!8@"GtÅï´ù­Û\Ü×-Èêª6òU¤¼KyQ YC¿áµÃô5íEk³-ÁÁ¶FY/Òc¯%EpQpˆaM}hÂAw+„uè}3• jîÀ޼:ÖÁ$.Þ\!P°¶vþBwY·´Ú–à¦hVj•y®y*5"¹C.rç¬Ó šBƒ˜3Éë’HC¥djä&9KÉÉCÜК:‰‘óX†CÊZgw"ÏùÓ¼þòiºU•<€aÖÔÔŒ¨zl&Z‡”8÷½ùfæ¸ ãP×iþé—_NÇátžWÕ¶^nskK]—ãñx<ž›Æahš.·ÛÍ,À©™5·Ãq_—º®mšoÏ×)•rʹՕˆsDLó¼.sQUšWk­ yH¹ÖZk­53ûRë¼1NÇœ„%ÝæV+ŸS9Q¸…™‡Àá™¶Ý]~ÜÆîíÔ¸Ìñ2UweòÃ(ÃAªÆ2-_^nä>žÆÃqy< ¯ß¼~óêñtKN,â[Å3Á,̼ ƒ<’¤aéê¦Ê­äý­/L ï0ß „° ÝXœŠH’ª¶®ËºÎ¹àõxÊ9­kõˆµMÑ<ÂùÃOoÞ~÷îËí××/×ùý‡/á½­ˆzüñй ÅðN}©ó_óÛW‰JLuÒFáȉƒ´ê¼Ôëº:ùƒp)"%‡/• |ð€“!, $Èä0õ%$ „½Òûkü¯ÿOMdï?,ÏSm0—’„Á¢ÎÖÈ @áÂFq'Óåí#Ogÿ¯öòé³ß쌯Ôn‰æ7çá鈯sð@öجÉá´6þXéóeaV)¹Œv›Û2¯Ÿ?Ísµïá ¯!àã©O\ìrËöé™áª«}ºþüó»ëÓc9øá”O§Ì)ˆ){N"¨ þñû7Š_V¥œÃ0VIë|kN7u]ÖˆFI>7Uóa W£R”ªIÊå6…k]Z 3I°1ƒN%ŸÊ0f?K— ÖãÈçG䬇2$>|}©_¯Ö¼º§½U&m#&r÷ì„'f Å=¨Ë÷îª0po^÷žÆ>›o–ëÝýááŽèSÝ¡Ð]‹iãM²ÎàäTª7õÉ9í•Sý—ïœiŽ»åŽŽ?q0fïdmPdjmª· ÔÕÝØèñFðíF$À± C%Ë¢–2Jª­=ëÒ˜cõÕc>ŸrSÿú¼\¯K«jqF.!‰E^¿~pJ·¹¾\/í²Pp·4Á Ô«áwnƒx"˜©c¿Å îß÷ ö¿¹qwNý._#œúož7Ù½»eã~I·–ž{WbÔîÍZ#èýÝÉß®û¦¥_œ‚Ãû} ñ;§Uì±ï Qò»Â^t§»…oæš­z‚à} A8(ñ¦æõؘ’ Ï¿¾%Ë÷fµÍ±}ŽßEz·ayÏ7зRºm­±/‚îf¥Ý§ÖkYÑï9‚`+gМü0HJQ›·m×´;<ànnõ0èéXRÂ4µÛÍa$æ=½Ì÷†Ô-«ð»‹ýî³·o QoŸè_Ž% IDAT§<&N€4…™´F·¹^nËËMÝ“ô&cËÓy,‰Âm^¬df#Ù£‘R[ÔÍÝš±8©¡ ·tu›—©ŠfIt>Œe,Ä\«Ökkëº,)¿‘<æÇÒÖºÌÓZU5„( ›ñEç¬$)±›hMDbÞŒýfDÄdÂ\HŠà&bLŽÙ2_/Úª[=%†Äçeu[X<åÌ©2¢‘­ä ‡'–8HƒqNcϤaëäÑ@Š$)™N>ߨ.I HÌæ¡Öw>=¹.šR‡‹S‘8HuPÅ­N‡AÜFžÙÈI['9sÀ<,œ9,ÔÔϹ ¿–U\g œéò¿ÝRù†SÖ×6Om¾ÚÚÖPï7þ¨.¤ÀfÛßVG;iwã/Çæäøý³µwLlÙ͸AÜwÎíN ã^`hóèBïÆÀêÞ @nÖúæó~ßæ~s7!c\(8`€‘›n§cÇx‘ó¦èïH¾W| Ë(û¬¿Ý¥÷LÝKÄ÷âîNÓŽýÙcÄAn}™ ²iâàÍÈÌýcjÌ1dŒ%gµaºÕgÚž†Ãó2Å0šð²ÎÑ´Gºf«mm™$‚d‹¬1IB™ÑuÙµ*8S²aC>%ø4_–çÏÉ´€Rî°w)¢5ÁÒèR£¼9æ5qÊ™…Rs~±HI2)©›…¯™#Á Y5UØfÙ$ô–¨Ö¶SNR‘’ò0Œãa‰¶°–Ä¢À×yý¯Ï/Æ(99¹H’{¬ ªýöhÌ<ÀÉÕÑýºÕwÖí¶LOçz6fžçuž—roîU#Œxžë²®9ÂT¿|}™—•"U«Ó²†Û± ""Ìá~›n·¹äüpK"WSeRʵY]—0K’Ìi^´í7a'V'‰ÓqXjXhm-%çŒhu^½ÜLuHù蜈•È6 Ž˜À~‡o…oÕ ¸¯•"u2g sA_êÇó’ªúºª6mµMä3¢Öñx<䜙aæ­jk­7åEÉ™‰Yz‘™ck§œ˜nî¶¡ÿD$‰ˆ„‡$†A²´Û²W¯Ž§Ó‡Ã’÷?_®KNõÕãp:¾yûtz<^.ÓÏ?¿÷ár›É53õßp[«´êƬÂÁÌæ|«´,Õæu]øÍ‡óP­-Ó²”ÑܪQõù-Ô\»þÈè ƒpª JÎpâ ëç܉ÄÄÌœ^ÖößþV(è‘ ‰U‚Áæ0çæ)ú‹›$cίÎãåTr.ÕÒ¯¿¶c½¼\æŠ8$IX‹þ¿Í=ódjh @!-ÊZÓÍÌ¢ÆàÜÛ§ÁÈ''š”XÛP/¯µPdF^§úüŸV†rz8χ‡ÇòúUy:Ë0èóËÍÝCÒã«·«ñ¼âËË5ªiÀ“Ñ0¹ÏÕÝHH©š¸k²‹è¦¹äW¯Ÿž†qüúÅos%ÍŒÁ)‡ЈrÊ)— ¢àó)[k‚ë9ÓÃY‰bQ‰p­um )Al`áÄ’vbg‚ÀAÓb‚p·pw_=ÀÌøÛþ›ºî»£K¶›Üên["”÷°ïví¾Æ×1 ­MÕ)HÄC;)'‘ïE¿[6õÛº`»§%³H‘uj<Ü{ÍúûIÃW†¹H’q(\$ $§DÂøóŸ¾ûóÞN7ýzió²Œ?|w~õêàr9}øx¹Üòz½NïÙ?“甇áð|ãÑ~úåËóu© Féi×{Èw–¨Ûû8ÈC¿Ñlz’ykƒbl˜R¿/=<Ü Î‰tË.hw•Ì7[‰Ä{MîÞ$pטÉdáß@Ñãv¶oWhSD·ø]ìÈWÆ7ÿý†/ŠoÞú©¿±r|ï*¢»ù¥_g BÚ"!Ô„xt/Ô~Ç w·}hö½ì¬{ª~7ëÄÇßžŽûôñÍ/´}/îî›@`KJâÓa8Žì®ó¢ÍØ)¥=ÛÁè\WI~¨H¬Õ®S«Ê$ÜK‹הʛ‘davßÛö÷|'˜|ÛilÝs}„pN’-è:Áv[–ë´V…YV"W[›a ÈÖzʹ ûºÎá\›N‹9!›jŠÄÌkÕe1ƒ_.ë|š‡TJÂéPæÖj[ɃÒ@I$ %FÔÔ¡Ë|»µZ“H¤ kî:AÚ¨¹¹Z¢OcÝ"Cs÷À¦lfJN™’Ôw{Ü 0 ²,u ÒaÌ) svG«+Ñì>ƒ‚%b¦f]1áÞjܨ¿oÜ9m•¶ÁáaÁ‘4»Yej ! ˆ@¨x _š$Élîó²N&¥ÈP˜ª)"Âuž-(àI(ùÔ*ñíÕ±p&9Rs;bù3ý&±~MÕŽÿÀ8èlËD×¹Lsš4²{6c²@K °º¶;l…¸(‹¾uJô§Ê‰l§êvC<íUîû‡o‹ö !T«‘‡‡ç P­D}¼å.·Ö™ý0÷i»‡k8Sòp"ÝŸ;´aÛÀQ˜uàŶFz×aЀo€„{æy[÷öiòûw_þýüú¿|½®€¤$ŽÄH]tŠ¥©¥”JÎÂBºò×i×éÒøûKÔ¶&´r8¥áè¢+ rdÉkh3÷˜rÌ LN«»H ²µÔàwj¤oKLÕÈÈH¬%àL¥ÏCìÄ9 §óP‡•Ê-oÖ?öÀ\\‚òM#Z˜ƒsÙ*·¶WØ&†„™Yg­‚#¤Sñàl`øV¥¤‡ãŲç9ôöbó TŠ¥áã5>]ÛÃ_/þp´ç/óå¥FΉ‘—5G8y¬¡žHãTW³ê1›<{‡†»º»Â"'²>¯½ )r’CØ9Öˆ›ÄÜ*3ÎGæa<ŒAáívJúÈñ²ÒõJÓ,¦ ‚p‡‚\ÉÝ ÉA¨ÚÂff?ŒéûS–uµÛÔšÁˆä^Ϧ.ö®–¸‹Ð;-”ÄaÔ ¡`ALÁ[ΔD’È—jØ{Ÿl "xó¶v0FwÏwùöwš5’ìn!›õœ‡¾ðMgjdKÊöpÏ硯ªK73fú·þÓ¿ýËøåÝ—wï?׺œÃããátAòéóíç¿x¹NÓõúòü2M3ùÓ?üË_ÿð‡_½~úéÿ?ÿþñë:„””cé^Û¹KæþMÄ"&§Ø½«¶lƒÐ7ÛfÖ_¹ x öðìFÍß*oÀ;Às‹žöqÁ·.Ÿ@G}°]Ë·B×Ã÷½C¯ÍÜûÇvÛÖÅC›­Çw‰è/Zï‡éŽâ¼+õØëƒ,ŽNBo ³xdD ¤M ïwM3SÇïlŠ ¶"¶Mùó½Âx³ì÷‚>‘ì|ƒŠRìK…ý&f3…ëù”þñO9Çoï>M«U ÚÖL殉ëaˆÃ á¶®ªŽàÜָǹ±Ûûæ[`ÙãÛK†·„ÆØÒþ¤x *©ymíåªÞÌÔ{ƒuò7Ì«^®Ó¡@ÛÚZ³ðµÕËÆ"fº,ªN’¼•t>©dZÛZ­¹.>½*žsJÇÓñäè ¸———ÖÚñxL,…ÓñáñáñiuoUŸ?}þòÙaãq,2PÌK« îpJ ˜éJF„ÂF8´Q¹ô–iiD°ˆ€Ä†ˆ!qDFéÀˆµ5÷RJ–Ò¯nŠhŒ…HÁ‰[ˆ[+3’¡m¹„š°ƒÙHB#D9i.¤•4(<1„Âú¼Ø"Ü”‚¢¹U'@ñ¦â‘„@­«js‹ÚBEDpÊѲ+»kkÍ-ˆ9„%§\‚ÛK­òü™ÊpÅø•‡­Àÿ¹è›rýM>¼¯—©q‰|>=œÞ¾¿ Ÿ¾,1_Gæ\Á•¢"ÄDÚsýŽðƒ;¤{^o¼Øq²0m”¬Î½âÎ%£nû‰ƒõ€ïf·ÑͲ&áðDAoÝâÈ™sNÔš) Á²ýJÞ µoŒû’€â^sÚ«(Ì›õ/ƒܳÂÁoÆIÚšÎ8–$N7nÊî ,`ì!Þ‘Ü÷×è›eòØ:ç÷°e)fL$êâ­/S:ÙÄRêFnäÎÁ:{)̆!‚NãxÔvkm ·ãét8L[:?<žOîÔšßæz½MÍT-¦Ù—9–êÓZ×yÕ”¨ ’2Kbé«:ÕÚªZ€ nhFKãª÷& &À·è¿ST‚©ã¶x°{d7 ­Vɽ%í5žÚM³±ß$¥=TßÅEˆ0QïëoºÞäé "a»Aƒ”áñÍÑŸ\íÃßn:Õóy|xû6ÒñÓ—Û2­ëBŸêúõóò>ùÏ?]‡#çòx~ˆyžTk)^JÉiÆÓPÛ¬K­Ë ^—jÎ,B ÷PCᔥÁg©_GЫã¸>¾\©¶vÈx{Î…˜œ8s mDæEŒe<½¢!Å%Vo3Ö5jsBA*I8KDÔ©'XRÈ {„»&òÇóøoÿôúátxÿqú¯Ÿ>}~Yûö+œ7§òV'‰{GÀnUéo¡^׫½âwOAv—>¯VÄ€HB¦ÚM©‰Bàió²lMî¬}Âõ^LÞ­/¼™S7wzWª%Â"*™‚L œt,4f*â £pDòpõ×’Ó¯ÿú—·¥àÍ«ôç?<Ôj%çÓ)ŸÏcÊíVÿþ§ï~úùýüôÛO¿}yÿiª«ŠŒÿú×?þë?}?ˆ~þô¥Ö‹’©{SéRúÆéÀ=|;4Ÿâ[GõµÀ=dÔÅ­øÖ êæäþê‹.ÓGoÞ}DÛ•Œ~§ÎÓ·ì)EЩ¿;§»ä#@ð !Þd2»ç÷Ñv×ÔÞ9…ðŠ>l÷às8z%ô·*9±oyaŽ~%CïëýÅpìfôz áÍ8ß ä|Û46\¿1tkŒ&PdÚ*“ùÿ_Œú­¬®O 'âÑN‡ôúi¨¶VÕUá<0Ê6&b+E©%ÕcA’h͈Ðî÷qäwT’¸ÿeO}lî`»ˆm²ÿ7çÆÞzq§µöþ7⪙,Äá–”l¦×ibTÓ¶Ö¨ÊD¾6;R¸Ç²j̵f¡°Ã˜#j*@gTOêÙÈBJ– [êËóõëe9ç"é0 ç‡Çãé|ëúr›¯·å&„ÃÔ  ê÷ø°~L,€é¦ö:³p’!±5Õðû.PJ„¬FÖ‚NAnæ–s.RÂÃÕ<òÄš˜,ؼ×Á&¤Ä!ì«DP[LÉ$D0wWnÄEÆ4@`þšn³P@ k°ŒDÁìÞ/Å b°p€êêUƒÅw%3†P ‚†|t\——©ù!sä¡r1µBô‘²ÍõÃËË„æC9•ò§éø4óã§‹j`«òàT6&Ýö~N„a;xË÷Ç·„”ˆ‰’÷3§¯òÀýc¸¹¥¶µ¾Ñû+ØÛ|oéŸcfÉ"´]?X8"TÕÌÂŒœŠm1rg~Ç›6·=Ȼٜ d;ˆL‚ÈLANÌgª™#å0cr4óˆN š €Þ°ñ }´IQÝDÄÜ÷&¾E{×:³d‘…:"R/Tp£ÁòcÈ[‹ô©¾5= _’Çé˜xàçæ•”2 KÑHZ»±÷ßEb YY ŒÃ"¬9·0AŒÌá6Msߨw«§;©{­j¦bÄCv¤E›Y éŸqT® CÇ¡Œ¯©ÐáH„º<ë:åL‡1 ÌT’¶,2 ̶¶¶\Cç”…ðÕt­U\5\=@æSp”×ÇG©×/dRH¨ºZ §œ,æäÁÖé¶Ù#Sc «Q­¤MWfÊEÇ1†¡<œ¯ž^»ùÇŸ?}¹¼\¦—Ë­ª©Çí¦ËìêlDZ) ™¤G)[ÉŒ\Õ¨© 'XÍ׊êIƒÈ]H!áè" œ¶D˜q¸r8i4mÑn\# ¡kþ±8¹§·EsĽ9ƒÌî{æ;·ƒ7ðD¯ã£žtædjÕÕµ¶v>¯_¿=Çáp*åÀ’L×ež§Û”úpœ’$ŽaafX8%v:ÏÓ4ß®Ëí6¹[J¼žFw±ØÀDZU¥”á0”aðˆ¯ÏÏÞ}úåïïß½ÿt[ëËu~ÿþÓÇ_´¹¯ÍZk´TûòÒæšÌá Ãfsê‰8vOµºY[{:óyL)É]—Ÿ//×úpª™§¾ù| ñOO1¼|Ñ‹´b5D°#5ÇptjN¶í0…ˆ2#1D ¯DKò©{ôX]Å{UQXÚž½&–†_?¶_?ÌÕ­"kymVŸëªÏúerw çˆâB ïWÇn’ØÒ¤;òœ™‘‚@‡±uGt¬¡Zpéœ걞†òãc®„ë³UP„hõæ²8žŸÄNöýk>1•I9¥‹Âîlœƒá(k¥ÖŽó¹"m‹U*Cz{e<õÓçK¦9Ë1‘±¤Ãi°„ÉdCÕ¬rH mY>?¿¼4›£TJAûäžØOçT2Ïyž¸¶fÍI-$âĪQ—ÙJkÎÄÐ0ç.lîšÎ>_ÆÝå€Mu&ÙDW×ðp@ö&RDT«f&l„0H(È-¡ÛHzYï6øÇ6ùo?ú­ìv› »Ä½Š’â2­Â¡9‘HcY•ÂM$R»ƒ5qœŽrÅ­]ž§u¹>=>ã0ŒƒHJ냕”û´Ü¾^–OÏ>½L¿~˜~}ÿõŸÿòæû·üñéë¥Î•Zó)¼šPÏáñËÛÊzzŸWê$Ó}½q);èÞ´¼µSõÒô–†-Dw¯’ýöM {übïÚLB¾ïÝ{߃zîòÜ6?oY‹þëY¸m5E‡)=,Ð+z9ºùw´Ñ-Úà±s¿7)p‡¬qŽèþ\(õˆõBhqƒ»Ù)Þoz÷l01Àl‚Æý°è}ig”Þ)û¡½{»¥¢û©‚©©Öå2Ïój}êŠÍ1m*ðaˆQ|HT òjÞ\<„¢†Ûw[ÏšÚÐtw;Ó7;ö.¼žo Fdll&ïÇ1X@‚`„,¸“׈X8§lêÓ´¨yÓ´(Z³,­i; ìk½VË›¶TJz|<$IÉõË%‚æñ1Q:TŸoµ.FÓMשY.Y¦¥\§Çóãù0®Ë¤VIÈ`ÓŽåà:Ý–ùëµYÐC6‚«i¨srÁV4ƒN‰VbË Žk¶.ŠÔE>¨F/ µ= ãAl®³…A˜$åD‘‡lÄËêaDôÕ<„[î©n­ì!–e(åt8<œOCn×õ·wï}÷á6U5Z«.Uצµ†7"géjlÊYR!„ÙBjÄý§ỂEÜ£ªV§¢ñn@uòøÆÝëΜDžð% sš+­5ÖÆÁKéûÙ „ÕUµ­ÉDl±ñ¶"Ç“ÛÖàØx²›Uˆ÷˜  X@jÇß½}ú‡?|ÿÃÛ‡ãAJÜ”ÌRJÇÃû1´ïö“ˆpJ‰ûŸ"¢Õ&@N|8ŽQ†ìáͬˆ1»1Çùá4G"\.·÷ïÞýúËû¿ý×oÿ×ÿøù§_?=_Ö¦.‰‡’Íâz]æ¥Y€XIJ · rá…LÝæDÈ›kÜl†ºrÞ¬¼,2û0b%šÁ+QSŠˆ&fÎBz>/¶tÓVx„Þ?*NfDš+-K ·ñ˜ç`×FjqU¹¶ÊÝéŽDn¡+²9%-nÙ·àM…ÛG¯ HîDh”Þ¿,iùÐH\F‡Ôª¥¤7Ã_•/ׯ:›%pêª6 5Cµˆ‰†â"K.-¨M5FÖÜêÚnŽ•9E¶ˆZÍÃIàì}-º˜›Ö^Nåúú`?ŒüqÀçI§zi«²Û©•ÓÓCOY™ªÑr[¦¯j‚$y‰…G "E[ça,yó2Çí¢×IB¹ å0þú¬ÿ}ùp8Pp™jGì“%¶º¯qWœ£WRE¸ˆ¥ë˜ ¢ˆŽTap‰ õ °=‘¦à´ãZ$»¢¼•Vî2÷fBééSô*°-¹£dÆÔJò±PΔ“8Òm¶ë­¹æ‡SΙY28CRÎ8ŸÏ§óËa®Ó²ÚñœÎçóXRÉT†$©0ÛéTŸžÆøáá6ÛË?~jŸ¾,ûùëÿôO·ïÞŽ¯_¿>Ÿ®Mg%ëL:ßz{öÌBÿÈÆ )L°bïáDìèÆr ÃÀcÊÜ‘˜»¸yd}÷ºGw¨,wÏI¯tŽ 2'gp7 ˆ¹'‰~·(À¦únëŠû:â>ýïÌœ®-z²m0â÷j8¼w¼½ä«×ïÒ9<…íë ÊÔËLú‘ d}@ÃûÄ@&aÏb pG§o@Ñ-€½ñB"LÌÒñþ=¸B»ZH@Óøüu¹ÜÖuepE‹0 ,‰‡ÌC.)ɪVÛÚN Û½÷@ôÎÚ½ÿÛJäÛbf¿¨uã·Øêì×\ù[}±)¨ LR¶úë’Àf®FK‹y¦X™4t^C‚B$µª™³`< ãad`¹Ðó—Ë/êþôôøý±äÛº|™çµY˜³A@|™–¶¾\®óÛ§3¢)) ‡‡Vóè#V¿>‚‰‰S_ùÑk»;)ÏaÁ®dÕÂm[`Iv¤½ÃDØàxV# xŠh®¦)‹Hêlxuêb½™ <Üvˆm'…ª™r.Ô£¦Á„±ÎÑ@yda69“¡bÄœRÎ ˆµNNQÒÈÌa©kNä-$|d9:eKqx8HÊ)¸¹Z[ŒÅV]Œä4ŒR& CÔªó‹Ç%òÅiV¤<¦xS  %ýZ/ŸY¯hNPJ,p'ë2HîÌ(HÝ¥jæÍQ IDAT'†6¨Îv:÷û¨lÀþ¸o%Ö»0œÃ€î†æž•ÚK¼õ]t‡ßö×ݶV›‡[g&³hê!A )„âaŠÐ ÀIúÀ.}…åædÒOŸÎóÆD9a(Ô*9“N¥6¸†ÂŒXw„ïœe&úÿî>·â¾M 2õjÞ³ƒîìÁÔWNDÁ±²M CXÓÌç·Ç|~÷ùò,LJñXŽD×köuqÆê£Þ9À& kj Á!¦DîUÍ]"„ìíÁ§ˆ`HÎr#i.I(¹Dï¦È:¸õbCÒlK´J‡Ç|þ×ÛíòÞn¹ )ç ”f­ªµfkâ”Ã#Ôj[!³Gr…:ùj­U#3nŒÐÝqKˆ3†4È‚¦UÃâ^µHÜÆLr„¹YßQó8”Óé8ŽSúíó§_ß}øíý§Û¼¸ƒ¥ñRc®æ¦m+&!ghX3;S$"±€…»!LmÕ0b&wqoô6GW‚©/@²ðJÑ‚t©u d‘[¶° IýÙ…ÿN¿Ùû²7•¿gÍû»ÄïþÛð 0£ðŽ(U'# LÈÆ%‡é4/ÁȈ•©F9NCÎ's•œûÝIRÊ9—œsme’:±eÌ»ÂÂÝŒL£µ5H%ÉÓ«p‹Ûe¾\¦ÖZµöååò÷_?¿\[.ùÕ«3’˜ª:[ Íä)‡ÀÌW³þYéO0RW]›Ù<.“W[%‘ˆd±Ì”ËH>¬Úš'‡çbß½:ýùÇC]'µ•pù~Œ¯¯RKùý5ýßï–·ÆH\¯C®¯ß„ñ|¹5s LWï]‹ÂÄÙݶ÷X€¯ÍNâ=¥°SUœÈ]à‚@r3m¬5< ‰Yœ#À}8÷ѳ7ƒ6ßA7ctÜJ8lã nå¦ &p˜G4’unt› # á|<¿zûúõiHŸ?_­iP1’Ä›2ÑqÕ¸L×Ó©fTÓ¥­kjÙ˜ÍY)YHÈI#HD`5€%•ÆX©B?>e9 ãzûK}ø÷_çwÏ/>ÓééA”¡ám]ëuÒEB^÷ ‘­[?à½ÙoÑë× K=?•Ó«S.ºÎÓ²V¹ä…,Í×9ÒÕ¹Ô÷†ÓÍcØQíß°Št÷YlPæíä¸Ûê¶«cƒaöF¯¾‘±¼ï ßæ¼ WJ½â‘d{_,Ð ß[OŒăÈSKÌ‚”…Î#ŸÎ£QQ[–em&ƒ$6w¯Îù:ǧ¯óùau*ãá< ‡”²‹„ˆ’óë7OÿsæãéÕËõoÿñ·çËÕþþîöüûßÿñ—IÕyYc^I#[ƒUâö`nGñô™ÿ[¿}O¶ugÈ&Ep÷{ç.:!ÔvW}ôÇöb£ØÖ1Î[ù$H6Ü@¤½†Œ¶i@ˆ»±Èé¾Ê$ú‰ ï™»½£d›^»ákç»n¨D(r×Hic;ï/]J°w1¿÷õoI G¡cIÃÃy﹑·-&¼/Ã7ž7u?tìÿ­xÿz{ʧC‡È¿Yl"Âm‹Xoþ‡ž€b&”ÛÂUu^B­€SÿÎDÏn÷9oJI-/­Õ¦ ’Aߊ·ÌôïšÇâÛ¼/Y ß°»Ÿm»èv åžG—{;±©*¢"–¥ÌYzë÷ë˜9{÷P‘Ä"/-Z³DQhÆÔ6I榮ºLm™)Ü^þ"çCó¡Ò’…Ábjáñx|(¯Ê²Ü>>Î…A"aaÆN’Dú±pˆo÷Pô>l Ž­MEIH$%–%‡÷øy§syb ,†¥k~ 7†q!°ƒ)!Y g~‰ ¦Ð% X?:ˆÌb}}îÔ•Ê®ëe& i½x(§œ’„9‡o#0£käæÑ¡H”<¡¹¸„…˜ £G‡$Ê‚[ÓD$iŒ.@hõˆ°â,S,]šqYêzõô…bÊ© L¹$_c8¦¨)¾ÜÅgG°7Ú®èÝÝAï¦2lž±]ÁïM†] ÚX[ÔC;}Léý ØÝ†DºµqõhïÖ­¢¾a¸…ª»…ôk/sâž]áu$" ‚Þ»ËäVM‰JÚ,µÎ½˜±÷³ ôL4)…ÍÁœ9sî¶þ$„Ê×pófÍ{— öp0m=ñè|l-¼‰.}çaÌ[¢ §'Ž[¹!…%Ø×—åööæÇ§ÃA§ëÒZ=>ždÛ¢d.¼U…$ò÷"’AANêÌÌ‚$ï;¥þt¥Ö!R¦ ‹3åb¹Aœ<[ë “â”Ù®XWñ—¢R¹¦Óžäñ‡‹-ŸçÆ1iBŠõ’›ip–LDæêžâN­š…”HÃâ2}œÚóËÜ‘ÙJÍ|©ºÖîo’Í-ÚÕ¶¾;¢Zã’”šêoï>¼<ß>}zùôõ6­ˆIh.„áŽqê,@aOÜ—NzÉìu ÷¦á§ÌRì® $[â|«m¡Dä W¸2E7ïc<ikƒØé¹Ü`ë^bß‚n{bŒÂf RrwÃýí·ݰHÇC7„nM‘á^«¿<¿ ¢…O…YF3!"á$Â]µÌ9å’RN)K)eH) ߯®ã8óÖéÉP·ºÖZkw‡jèZ›Y‡e¾ÎºÆõe ÇÓë×Me®d4¼ÿàü0² .7w#±‚LÜ•(1ËÞ»³qÖ÷î"&Ê=æ\-–ɑ٠·qàa(Nb‘©œÃ#M./md‚Od—WexŽsRXì'ÄÆ/wµf –”¶Ðdß8m¤“~ä w7IYdô¶†*¹“8KgÍ¿~¸½ûtUgI¹šRn,°…„aŠâ͵‘Ǽ ™‡DQÄ…ÜÝ•¢fh€‰J“£C˜\3G³…âv"<É«9½}çG“¬âµ½\ÌæÉûNÝj¨!ÉÈÑj?`ûùÔ ¯ÓÔÑ ã![­Zçc‰‡‡‡FôzÀ¹”ñÐÖÛƒ;cÐïÀ“;b2îeK Þ8ýß&¢ˆ ÀÌÛ¿pí†ñ€÷½0ÇÖ~AÉÁÛr¡ãÜÝà,(o7ŽHÔ™›afÍ#'À99šÑ¼úé(O§<Íy]4(Öj 5mA¼ŒÇ§Ï_—Z—µýõ/?>=>Žã ŒœR)$Âa,éÍë§Þ>N·ÿþ_RB@>¿Ôÿí¿ýôÓ/É-¾<·ëLÕ õxØö^ñmr¯­ßxÜñ×ä±IAѸý›K{d—8DFîÞç`$ìÈË­ê€* ÙñÞ}žr Ra»”0öÜö}0ÝÔAôZªes¯ËÅ^[†¦_Æ äbô¥dÏï3±‰ï–Ü;‡hËêî>`ÚOLܵ§žq"í`ã°Kà ÀaûŠ@g=™{(±ERË™À G(E‡ô¥n8Èþ_®Þ­I’#9ÖT3s÷ˆÌ¬ª¾ —™!g–¤ðp÷qÿÿ¿àîYî9GH 0 ïÝU•™án¦ûàÕÅÛˆ2UY™‘f¦ªŸzÔÑ66¦îŠÓÆ|]dU8P ½/ôC¾»„³BMDZHõ -ctxêHû:ý÷p„ ÷søGú>³Ç‹t4€h0e,_]ÚQ‘ Øm*í03'5QíÚ€Þ­{½t:CTP¹5uO"¼ÕeH‚Z=ÛýÒú™-tEgo5UÉ&IQUâr²9™¶â+ë²Eè¤F¶íºmK ›#r±lI%™D[·­6÷æ×K,¡ºŠ™øb‹ÓÍ5Ý.k{yëœn¦Ó}ÖË. 6e5…áÒ‘a<б÷¬{ï_î½ßнx;F¾G'¿ÚnTÁ‚ŠH*T0JJa*.lU"4TR¶dÚ×äpnmu²Û—{¸vxƒW°©jNYÆÏo#C˜Hé8„)E¦ªÒ1YûÓ- HILr¯ô`#àNzV1)¾“\„ÃJ8Zû…U»4"¶ N"½èò)7.¼ÂksÖ‡íñÇëÃM>þÛŸ^¿œp]>%Ü7ïNXsÐDš5¢NdJ¨‡ÉT :I;Ì7CRP Pš5Ñ „&X©H³º"d³îS7w²Fq\²o§"Ï>Ÿ×<žß¾<âá²~¹V•ã]*3ÐÂÝDÓ|8·±nuÝ6À¤ä)å‰"Q=¸©Ô)éñˆ’¸—Ÿ/+Ž7å3ºÇõZ¯KT&j3€ ‹õf%Â-=0yx|TÁé8]×íËãùÓÇ/˺a­˜:OÙÙœ¢jI»TØ¿%rÂTT€­úºI£Á ª„xT°_ˆ³Jk©‡4*4Cú>0Ú!£Ïvô*  YÀF7$ÉæaÊ`è2ì¨ 6éׄ½ÛDuîtÚמ~ƒéf9ªz’P éºn¦íÛoÒ‹çw¯¿9Íó<Nyš""ÂUµLùxœ‡Ù²©JJ)©Ž+?;gS)Z‹!d©¡©¨­-jkYt9/µ^>|úŒo^=ûÃßÿýøþûŸ~~{½¬×ey÷îãrY×Õó”´õZ×ÚDU-‘ÆN¦Á:¼u¢”Ô{ÚdœÍàÞÖ¶µðk­ê=M)§7÷øt¾NéúÇWéÛ»SöÇ£®sÑYøú?ðÏ/¶׉2Wù´†ÝÞÔ)ñ8ÅÕí—}³”3Žk,—mN8XÛâÞÉ¿bdRZÙ3–ÁØ"ãxõÔ€¬v̹ÁΛGwh ƒµ1½ëMœlYqsÊJ4sô^:£4I÷q¨ð8ç2Ÿ v½êŠ ’(”ËÂÿúõ,Ü–•¡S Ál‘)Å|sóüùTŠ[<Üä4çØjý²m—:QOÊ)iJâÙ’i[kLn§(¨HÒ>V¦¶µÝ7×”^|y¸þÏŸ~ùõ~§2Ifsbk M 5¡©Z3 1£ŒkŸ¨!™–ÕÖ‘SÕºúåz{œ_¾8\ªúzFÂñ4‘v¾ø¶ i"iˆýòäqÞU°nÖêsúÝXÈp‰Ø[­0XOáÇWK˰KÈWÚ3%…i=OFº°&EÎId3ƒšÕ*ëFÐPmlqý¢(Q›³mÓ<§ÛÛér¾~Ìíá²\. ܼym”K¥¢µëåú¨*77åöæUGä$Ó±šé”óÍa:Li«v<1†ÈµòíÇëÃCJmiãä(}ú7±99Ò´Üý;"¤sKG"Wâ)ÎʧN-¢·±po“m:ÐÅ}ÿ©'A@´ÏX@Ú£ƒdFj?Šb÷Çî×é¡ÎtÔ7„}Œwœè^ó0{‡Än/ö>Ytª÷^bE~õ®ènpï‰î‘GĈ7&ƒœ“b¤ùšHl e}Öè§qYÒ™¼E0  ‚¦²•ÔT¼:kÓÀÔÕyDô–èñ{  }‘ÒˆL‡1‹&ùµ;‰‡wtdŒt¹Uäw,RÝáäñtˆÝA©Ü]áÂÀ¸Ð…2*êöª™ ÒÃù–-3I£ÇA÷¤qÃ"¡&ÅÔÌ›·Jz$AŽP r!òZ•+…&’Â×”Öé̦ËÃ×Ê~xùÇïnªáá·G_¯I|öì_ÿø?ýí§¥ÒK§ÛF¤”Bˆ¤2òìŸU'ÆêPüÌ´$¡· š‰[‡ b÷¹¹± *…båD;„±öÜRëOH2ɧk²”²RÜ+Z…7T ‘P*”ÐpÒ$ˆ†hÒ,4GBm.îÆ½äAuô… $T´ˆf2GHêýÌußùx“K,—¥^"š”ж -ý©2Oy2egꄢƶ±Våb3),ÚNI·FTD]–‡íòp¹G9&†É˜9ÊC`»GˆAŒÔß!€;xt±‘ÑýîûîÞ3‹£’oW•D¿¬$ á©hÔà,©õO ÃáMµ>´µÈ+UÙÆ UCA³~øÉI»ŸS%Ta¢ ÒÝI*Ä©wƒÁÇ¥^D¤ísÕ@“‰Š)DŠ&ÊêáÛѱÂmÐøÕÞP%Ϥþ0Ú53RrÇWëî_݃†€S±‰z0øé\ùpýóëÛïNÏͯËr­mC’Èå¼TnSš'1Hkµ?aŃ18¢:%M¬t¨˜š©Í=Zm!Ðì–·ÇDJ ‘5taa±YTØ®Œfdb#ê"þq½ž§Ã|8>¯vhNpÎÌZ lJe oE Sˆjx‹Úฤ›ÃáÙYøA0g1MÉ)ëê×z]Es2DdgªŽ½‰ÑE²°d¹$÷z]Ödµk}¼^¯ËR)™Úr¶£h»pf“”:tª}oìð“h!Ž„H7×1èŠ $A'‡55Ž V‘á…AV):¾‹á¢ýy›º¨.Ñån‘–ë=ѺO¡|jÐûÓ¯ërL!ÉIÝ!BÉI§»—ß¾þîÕ‹9MEÓœJéd“”¬”RJ*ÙR21µÐQU²×·E²‚hÑØZ´Ú¼¹ªh²”u*yÊÇ»›gAýõí»ŸþÅ’æ¬ü÷/žßÒ·¤|ÿáá矖Çû‡Ë㣢ܞß½>fÍÞ_ß|ÜZ¿§Y:ÚWÕ¿‚wd¡õjfTÛ†¶ š€UÚ—«m>[’Ï¡WŸÛöL·ï¿™îFIÛËCM±LàÖüóãýìqÈqH[1ióíéøü…çÏMß}Þ>µ«Åv;S9_·KC‰4<°Õ¨EøB_(Þ/k FBX‡?$5ã&jÎ ÂÂ{³ _¼|ö‡×ϖLJ·o?TZJóR£#e· !è­Nsþöõ«¹?|úü°y¿']![Åu#ÔÌŠ ŒMväp3!GõCzö¬Äãƒ.óËcúæ[½æ‡Ç·—‡ë²Iª)K΢i“ܤŠÔ¾©øÃæÉš&½7«ªå²á·óåòéòøø™Ûý”/$›«™ W"‚Ï"¡IMÄ:4šœ©]°!fI‡tœ,|ùèkÓæ2ÝåTÈfr‘vBÉ“—…»¿œ£ò+…}ìáÒcšêh)qáð³tÏך©A±Ð=‰2nÕ¤º{B»=NÇc­uÝÜÌ4å:£9!¨9±$²Eu'QÕ’['=ÀsŠ’šÆE1ÍÓm$Äeõ¸šfMºmíÍûÏûõýóÛrs˜q áî}J±œ,‰Ì¹ã 1œ¶t§RJ²uiÍ;G #Pá²÷= g ¿šÀ‰½'x7¢ïøO-ƒz Q‰>#¶¬1%*¢Uo.]ÆV‚èû=:°7`A L=ñ¦{¥šŒ¢µøm\ª¶Çÿœl»­~÷3}­7 ©lˆ¾ˆî–˜lÖL1|m “½'8D 䀢£<}¯2í—Ⱦ¸Ø®§`P†:Y^$'˜´¢Ûq†š<^½¶þ*(QS„óébê{%Iô~ Ýk¹Òp\``tÄj¡ä^,P?É:€ƒ¿Ãùì•=«1†¡§‚%ƒ]x*Ñë×áWä*]X³¶© Û@E?}¼F¶jf=üÒ—ƒdÈ—軕R;=I¬j Š: ÁÚZ@ ôpÙŽùöÕ·/€¿½{×ê-Hpzs—`L"‚Ø ÌÅÒÈjŒ  †(Ä{¤Nu”²9ÙKjµºÓÁ`8FÝ™PLŽ"6‡äV4Ï#m‡Z}1Œ¦(TV÷áó°x*ïÑ6fç.!uì]Õ×FÛ MR§o£õ¯U3 TCGÀ<©äÚ@Ôƒº„o[µRò|Tñæ+bKš•mKtIúøÕÉEÏÕ[PE¯×Í%åœg‰0¬Æ& WÕàŠ†™S[c}\Ï­¦ñ$tï¡"¾Ûw(–à÷±’ñ=ˆû#°5ž:ñ»ÆéýMþµ0c”vIãËPˆ×ÎdòQKª½¨”ŒFÔ`#´ž8‚*6|Isʪæm¥7†ª¥þdpÙy L¬÷>‘¤c `üÚp,5Œ4Èæîã÷èaýþ{*h`(­þt§â“! u7w§ºìàT5e4U*Óñá²þòÛÇÃKŸÅ5V¥æ2o+©Á’t¶¤EUR€Í£xFSt¶Îà Z/ 5Q%¼›àMXD š»òY¡N9·¸6‘›’oæÉ,é*FE…º/†3ˆ­YNG»ûΗk5„GSÕØ<¤úšRAÍÛV×+ÜK‚&ÏYÊ$XÖ¶5ŠL‚!ÜQkxôó[À«ª©ˆH’þÝÆq£V·eó¨Ñ(°ó¥Õ¶‘œç•ÜVrcκ—ÞXÁȇ)e5¨Õݽ¶.i4›Nñè ø¾VjÿË Û¶NÊÈßvÉ£Gù»—O;'0…˜v)ÚY’ hê»\¤Ý¯¸ŸÄ:ÕºU9Ùjô[Eö2>ݱã©.GÄyܺ¨£$§]W8¯%çœ æ’J²R¦”ˆÖ*@£‰ ¦&šG¬L¥“°§T q9_/UÀ”²˜ÌSÉ/_‡i:|ütÿæíÇú{Îz:Íúãww·§u¹~þüù×ß>üý··ŸïSÒãaº½É§cžÒa[ôËö4ï¡ù}”Û‹4õ©k<Æ("’ê#’Ô¯„X0AЦSX¼=_ïÏS³çe:s~é3ãÚꦱ*[VÌ™·Sy}Ãì÷â— DÅ]ɧùðmøkøGÅ—‡êq5aHÛ(ïHx,Äšd”‰ ⻑,Z4°Q¡FU“Íü1ólH³ˆ–l;¯5§òêÅÍíݼ\>‘-(D¸»‹Ñ̰[!š7Õrº¹1¦õº®ëfÓ$BÀµm$‡U}€õDqŸm¹›?Ov\ *·)á0Å!—Ïéüp=·¶Þ oÏ•—Õ·’Ÿm~ûøÙ–ª™ÓÁ¦yJVž¯VZ>~xóå8•ÿíÛs–w—eõC35„±v°… hݹß[‰FRú܇*4Õé0ë\.g‹Õ[ÍË:Í…ÓD§¬ hÿssõSÌsÔe<2ìÚaô‚§”…Žœ…ªýÂ'Ò_ÿJ@'÷º 3¾– bƒlÖ ¢}ý‘®Öw•7íÐî}>‘AJÝ#ÅØŸ·}ÂH‚´Q*ád"R»÷ȉõØÄ“òö ‡)+·©ªkuÀ‰ÂÇîÈêÄR3¤¾ÅÈ(X yÂ[‰6ø+]½â@o.Š=•½O-ñ5óýT“̯)ë.‹í€”Ý{ñÔ  ;=4úÓLà¦[É>eªJ´Ž2Ú뛹g,&Ã’*ÐlÀLwoµu «CëØÚ¥ÈPãD‘…„Òùþ˽{”—ß–Ów‡ãKÈßiòÛçwò×??^J:&I½×hcKt²D*B¢fPw÷Ø%(GP%&LŠæl1Loˆ”¦\¹œBJ­Îh:ï´h¸’AÑ$â«XÎ’² ¤¶h5è‚€uÕK ï}ž*ªˆæ¾µV¥„dS8àð*:25¦ÝĤš,BjÛˆš¬ŠË$yž&K¬õÚ¢J§vÛ˜…T A4kS>†?@œàêKè5&‹<3k4khÊŠ˜‡¤7%ÝÌ9Y9×ù·3ß> µáã«þ„íÓõÎ>~º]oí§Ž›ñC0$¸ó”+q÷pêÞp§ƒˆŠ4E:Ùžðl©GdFûÛ˜)]2‹qj ‰š˜Œ®z¯vÂÛÈò;.¸Ø±¶¿ ’§Ìïú<0Ä@‰¤<!©Ê ÔÆê>ºÇcŸça¢Ú«¹ïKãÐ2Ü“ýðCwøzˆ‚Â,Ïërþéç÷7ÍþüZ¦*¨á[«t߀Kx¥&)CD½•X2ZRijÐŽåOWGŠÁžô~ÍV)w-Ú ,m’¯ŽKk5’™.Îâ~*Ùòs1©ç˺¶ËÍœ¥ñ-Êq~ýéú¡-^›jQÝkÔ5Ä’õC)" j¬G³é`2¥—º,¸TÔÆµÕ\j‘ÒBÝ)`IªGC$I$yOg‘ŒÞÙI¯î­ŠPur×eõ­µRò„ì!îA†uW^€”{‘œ–¢‡œTdÛ°®Û²†3 šT³©‘¡ÊÁüFç*Õ g¯.î‘„G'ЍŠîŸÀÎï^éƒ{ôw®  òýd£Oð]·>Å|ôæ@žà¼Ý•KT O©scÿ1j÷÷Ÿÿúóöá¨§ÚŽÔ IDATÛÓó—/ç)O·óa*)ç®·½[³5™ð¾m›™™&3±¤¦Ѷm‘’µð\&UóÖ~{÷î¯?ýúãÏÿðåáöæx¹n÷÷×uiÿõã¯ÿ÷üøëÛ/Kšæo’D|]«0w>¤íê$<ܨ^ßÄ&£‚A1‚ŠPhyšM7•FR+â›_ÞjùÔ‚Â8rðÖ¤½<Ê¿ý0½x¦Ùk«â˜×šê¥•õýËœ^ÝÞ\n}o>?–)ßÞíK³mb¾©Ûe»ÞÏót:LŠ2˜¯‹_®›N7å0¥mm§´¥®Ûó¹¼8$…, MìXòåZßµ34êõþÍ›ÇÇóe:T¦Ëu‹¶H¹”’ëVÛº!ÄTô|¹ÖçmãˆcGw4w»»‚JÕAM|’dÆ«^¯ämT»ÖôëǸÜ×Cæéxú㋼®ç¥úù±I]§µäpkùÅú˜Ïî×jYÃU£PïîôpÚòéñúîéòßÜ}s{üßÈ}‰u³ƒAÑ$ ¦yc‰†äF§åG‹Fë«" §„ÀÃQ×µ³¾xqwƒ¶}X®çT9MJÍÐH€ÐÙÕx¡?%€Ÿªf)ÃÇQ¼ä@U  Swu$"‰ÔÆswkTFýQ·±ŒdúZ’^²¾x~óÝwÏNÇry ².«;m>Øí­@ìæt¼»=˜ÄÃýgœ£óÒ‹êiΧcQËK7Eº9=KVŽ·‡Wß~;MåÙ³»ûû/Ý*ól¹¤gwÏH[ÖÖÜû3ÇÝ ‰Ôhçëå|9—$ßs“€ÏNß÷ÜÃ/K½¬®FE„H , ¢#“6Ž#ʱ8c6í™c¯2ˆn·‰€a¡ïú‹÷†MEÊ"íƒØéõè¾ ¥ôã‘z@n Ô¾ìWý]¦QTUU&DG¿%¾z‚”{‘Uw/‰ôKKtðHo„ÑZ8#IÏ'ì<"‚~Ùî*³Œ¸wwF$±GzHº$ögð@|+˜„‰&S„n­Š"—2ϱ¬Ñ¼ŠšÈ`çô!›t»%;+ß1Ìl­Î$ëUÜá·#1@yŠ`öÎö§ÿ5Œ¢ãÂòd×Vt¾äv7d“*eÂfZÕB´Ç]Æü7.À"ì…º|MIM"-;]õˆ­yõJVaƒZߨD é¤zôÇËò·7÷wÏ™¦ùä©ýÇO?ýç»/+‡Y-Œ¡°ˆælÔ,Ý,Btuô¬Ž·w°»C‘DM¨Ö(‘$t¬LúUA M`Ê6å2y ®bí ‰½?+jPI…ÂÌÄLÐi0¶5 ÄÔ ú$Àõ¢ ÷¨ÑÐT²¥Î ·”ˆ†Ñ[§Ô¾ÁÁHÒò0èÙTæ©do›o‹¨H)”ì°æ­y£PC I«êEQóLˆ7Ù˜jÒQq«ºˆ]Z»w½5~§6›>/åp<åM~{\–5~øœEîNÇW/Ÿ]®Ÿ–°ɇÇûU···¯_ÍÑÖ/?YlÏòlŠ›i®vXQ??x4M'œgAÓþ%h4R‚9%~øüùºz%,gà©Þˆý›H1j¢ŠH¢aŽå~i‹^Û|=·wkµz>Úò§oÓ_~¸¹=åÓ´]®ÑÎé8Ÿ$}ÓÊÝe±º.±]­Í6·pÚ¤7ižMJÅÇêÏãCÈû{w*5åéxc2qi¸\š×JWñ¤JzmN)"¦Dç'¹4Q‰ËŸs9ÎRŠlÊaó¶ÕZÐPiÚÑ«z7W~µ¡Ž{¨Ðw]`xJÁ íö!“a~öúëÖ”ð8>Ùƒb)¢¨p=NøÃ÷Ïþ÷ÿö7Çüñý‡‡ûCÎóáx“çÃÖ¢:;Ÿ—¿ýí·O_.çEA¥“×vmñîaS=Ï9ÝÌ“D,ËõaiŽrw{ͽI„‡¿üùþøÃ·Ïngµ°œ®ëšÏªÂæ”òažKΖòaÎÿò—oUäóçG‡÷ŸÎo>œ?Ý_IÖm,ý 0A†¤þPë4¾ùÄ®\Uá:%ÎsJ‰)™IÞj]ÖÍæaA¥ŒôU‹vÝ|—=%zt:ÐP´-Hpí•Yˆ ʧuFµî½Ò~DFŒnìØ•.D`‡âË>sì+¾:›$ÒX{¯˜P<`¦)‹Ð¥º{"sÿ{ïiÝaLwÕ?Jû$¾oŠ£ªtDgÒ©q^¸TĽ•ì·77/ŸåO_Ö˲¥w/ˆÁz3^)Jè(~ ‚Cˆàë/;޲_QqìwÏﺿߟþu2@ßeTåÈkîÖ«ÞCðdúBïÆr¡«zêÆK¶žžÝ§¬Ù×uK’;ó5*£u[)¾q(šÍX£ ¬.ê j•hT÷ƺ&4K›¯ÌטV–: â`‘…ÎIYÇuIëVg64`][*vûÛCùé?ž¥a2!±$UP8¸jOíß=ˆÒg~ýzÝÊž°íQÿ±vî¹÷;°·ôC‹J·>uæ€ÖDDÀM•)ÃÐø$ºIÇæEx‡vs´—4wDT€d(4™Á4¢YÃcø³SBï‰N‚éø J›=-.OöÉ}OîßIp`NŒ`8RM`kÕ[sA€pØÕ€§Òï}Œ#FîûgÉ[½N·ùúÓ‹»Åù…ÎI£Nz8“%=×µnÕÅÕ’Bj²i&2µFÓ¦ŒIÜQƒ‰$à ’2¬  q¢ú¶Ô³Îy:ö€¶¸è§Í>_ªäíõ·Çg·ÏÇœÄ,g™¦|LS±°ÛÄõ,Ërõk«Ih»1î pXÂYX€Dk1)MEÔâtJ/^”k´ëæ×V!âÇCš§D:¨µÒ¹…z&T{‘b@|*¦©´­vÚERDk¾µ É3gÕÐ’,<¶µG}tY}'y‘$% ¾"óTT~7ë«èÞ;J¸÷U½ŸUdö:zÌý”${3F‹ˆ 7‰Øý¯dô ”)¬‡ƒ‡9häå)èö]–Þ1*he'?±J¥AIšÉñ˜ÓôìFÿôýËþË_¿~~<ÊTnN'S‹ˆØœ`R³êîîDLÙD‹PÜ}G€¨j/4ˆLsÑåÕýñr}x8úô±mõÅóç)ßüööÓÃyýùïïîﯗ_ß|Êyzy*%Û<™ ÎmÙ*=êãuÙ¼í¨Ó.í ™Qv =thô½PºƒÑªÙ×õÞ4ÚS0À`Ȱ ɤöÍtãúÓçåÓãR””*"Æv”ŠÙ¼|nUîÏ® “^jÎ×qGßеÓíÑÌ®6?ŽÐ¾¤T©úùñ‘@sõ‡¨g¬îíó—Tkm¾®—ëMÞ¾¹ó¾ÁéR§×C­õí}[–UµVU ±­Fe݆¢k­m[j¨hVU„ì•þ^´ä.‚Ž=µß©¶:ú¤¢¶kKµ*›¤° ¹púþ›››YVÑíÙ4ßç‡Ê‡óývÙTT²Bäh‹oŸ¶Ómɇï˜~¾ž_êñø¿¼*Ïs~ó%>¯*­‘OÅÄ×— ‰*2çÌËÖøTƒ BašÜË—m[ÞE>håÑYPî­Ió ‹lª"Y,mÑŸ•:–îßÛ4ÇY6‰N€Gh0QR/×Ûõ¡P÷°dÿf2Ž/£>¦`ÏRVE·ŽÕçwÓß¾|ýüP·õîÙíógwPýõ·w?ÿýÍ»÷ï~»ÿí·Ï_î%pcªË<Ÿ½u{1ývnëÉéÛãå¢o>\oŽs1€ /^´?ÿã÷ÿðýí«Ç%Z@"ü|^Tá^)Ÿvhí4s*˜sÔÖ_¯ñUÕñÔ')NéÓyŸbö{Ôºïо%QöBÊžnùZÐ1#½È$À&píCÙˆoö™%é×N°Nצõ—UÅE!¢$kk.‘ͳšÐ]µu5šYoÊÐÐ;fÈ 9FˆF1SS9#Z#ÂD Ð¥n_Ï)ËËçww‡òéüèÛõÕ«Û\òûïj\I¦L‘+}㦎‰–¡ *c¸h¢Jhõtˆ ,ÜÚ„h 芪†NQ£å¹äY‚µ­îm 'ä˜ó”³n)\¨¤jß*„Ò¢ãªÝulý|-„$K% $¶Úèëþ¹ÎtJ9å›Óéîæœ×m[ü I½ñÇ=í­-DÅ‹ahCtÃRš—lbù±Ösó ?f›JÞ8¯qºÇáJAkâ«:Ù„^³l%*ˆÐ“”ÛomòÊàšdÍR£!ÅM{½·Z5kTMiÖäÎm¹H,Œ•2%CÏ;n‘ÏÔÏ­Ðe>¯§¢–$,k™Ó”²l“˜L³Þ¼®ñéR?mµš¤I³™©ÐÛµOíÚ¡p½HÞá«P²¥lÜš_¦<=»»ûð ×Ú‚¡P•¬ÞLPJRåumtWdˆaÿC™“fó¥Ò¡0¡†G‹ÎmI¢…FD•¤yš¼¶Ú.îÑSn ’D“švlò„@@70õF½Þé‘.æPŸpá%#rŽÇZØ)‡ÈµK4áÔ«ûµ®?À; ®s£C±ÅHÄZ䦨jÍ´Ç–_‹ˆúÿS(7ÇÛ¿üÃ÷ÿÇ¿þùæfrzÀr2o±Ôm­+‡y*Å\×ͽM%ysJáH¸×­b&0ëÕ ¿®ëãùr]ÖnnîæéXÊáÍ»‡ùðîã§û¤ÞšGN%‹•ž^Fkõ²¬».Þ´7iô†öA•gÝ`ÚgýPA'¹ƒ¬"Xà€]±„Žn>@¥9F®*ÄÏ~¼_§è·ID†êwlÁeÕXTœ`õ ø1—ƒEâzš‡tn|x¬ucI[™b:á_þéû&é݇åçßîÍ1§0¬`S×ÊòþÚ~‹–&þütóÍÍ‹×鿏Þ|÷ðQ–õU\Û™K41WIXktß T³ ªA±2n—@A4ú¼„Apêi,M,ºÖÓ²Üî¬ &n~÷fÝÎoåÍ5?;°Z7Ó/ù²µfþe‹µ„ÜIÊ)§@´ÒÜÏ˲¶¸›ÓíW{<Ÿß¼ä›oçã‹W¯‚ÓçOó5ÒÔ˜ÓâëGß>åCɇ‰N0TSJ©èè¾/)0šÇë¨Ýóé‹ *=§È*Œ€'ѹ‹î!=ìËO€v”ª…$Àì>ê^¶0œžObÞ¨ö’ÁàSj‰Ñ‹<-[{óöþ§ŸÞ>¿9ýðÝ«yÒÓ©¤œ?~¼÷öÍÿóßÿã¯ûøp‘¥ /DO¡Ñ'L¥ˆ–ˆV›_0tms¥^/—IC…¢\6þ׿|sgÂo7§i>šIðh*RR:æã¡ð˜§ép<¬uûõW|x¼?ûûO—óem-4¹>®DºYÙû)LŒ"ˆ&\•™z{áííü§ÏnmÝÚýãv^Öem-„TBB,$jWèú®ªý¯"5SSO“i<’ SH‰ §Š+qJ'=Êã#“Ño0ûÕ£O.Ù-•}ˆQ>YÚa‚^8׃DÁ¨M%Ë\Ô=bÙ‚©K"ÂÐÎ.ìJíPÆZ¡Pµræ(:±h·õ÷zð¶£<2ÔȬ@p¹Ì“ö:Õá™î=Ä{‹•íˆSì•2Rº›zö¨öp7Ð#Úc4 ½­pä"º)"6‰f²%sÀ8åþç‹ -„‚¹›Ÿ»?8\FÆÞ'B%¬%"v°Ah FDPEÌv+žàk¨ûLSäÄâîF%¥0ì²j¾o‡Üìh¢~{{üÇ?ÿátðd¨ë߯Í-Í.áÈ&=å &Ód­²#õŒhì?:M4ii;‚¹×… wŠ¢¥`À=Óg—­µ¨)[ÊÌRûfJÑÍYÝ’z9ꨥ3ZkjÈfš4Í7†¦d9©€h¥÷K%ábbÅÒaJÇI2|•ºIÛB¥RÝ$,”D„%$5ƒ˜‡4¦¤‡¤3B<*b¥¬ ƒ%YI’-yºb^cfHbC½²á¡´£X+ «pF5Ëi–‰yÑü^ŽçåîçOöÓ=·YROÂÁþJÏåxëG?:vÄçî”ç×ù¾¿ …Ò½„/=è/{Ýé^ ÜÇãöäHøZWM@’[Û*¤£»U$$°×€J@ƒ¤‚Å0%U@Øúé@AI’ÔÜ¥VxÈR¥9f`*Hãï¾g Ç Ö}¶ä×âù=×ûûÅ»ÓizÿI„(s’$’„KkÎU"CF‡å)œ£"šâïÝRª€¤œëzþôöóoËMy±­ºH$K’Rëã².¾©0¡‘ ‘ŒKa-Þ‚t•Mº9XD95ÈYÄVjˆeËsVCM¬X|ÅvF6³$rô%À¸;ˆY˜:©[IóÍK;À$ŒU=4Íy*eª9?øV¶qj­d3•$ò˜° œìt l5V.b“äL‚áY9'*¶ˆŠ|T3ëÖÄ9+%KÆZwªA§g† " ö^z5•Ì€w°”&U^É„´€B‹JÈX[ǃ­éïþœCsîGVì-#{9ëîÀhô=yLdAwØ("<£ \…&(ÙݤOÒÜ[ ª¶7ôO–GìÇ’1Šp4™ʬ+#k˜©XgAis<>Ö¶´×/N–ËeY>~z÷x¹LóÍ‹ç/Mp>Ÿ—uIÙnnÇÂuÛ¼z]R8§)÷eµE4¤–JžEM"¼Öõzy\®KPçÃiž¾mîísÝÚù¼­ÛÖvÍ)"ǹ¼xv˜_ÞÍSYõæ—µEr—ˆ¾ðtÕSÁ½ÛAbW÷ÀC:™£#ù÷šŒg‹èÈCè&0PN:‚BƒçØ·¯HŽC³Ôy#Š ZØìz ŒXÕωWKJ"ÙakÇ^êÃÒáÈz^ýøîÛÓ¿ýãËãÁ~}óþ?ÿúñݧ¶ºU& w|T‹æÞþtÓþÏ.øá¥‡ýõ·_þ×ÿzxÿ¡RÐôädÉ­wÃ)Ýðµ[åÉŠÞiß 2°a½Œ%`üÿ%LF°/„ “ë l`ô'(-ELŸÖ8oñ.µ")a¶XJjj¨UESˆIÊé0‡oµ®&"È×kœÛúüpwóò›úøåÃýuæöü&ýåÛg(ñÛÃÚ¶éêÖ–‡Ë„dÔ-|«›ô42è„P’ ò“œCU1R›!|.íÙS–uóÚVZÓͺ}_¿~ÿÄî…Ð^ÊÄN?îÞ°Ÿ$-ºûvèþš§ñò¢„r£þò~±ÿþãíéð‡^½üæÑ>}~øñoÿú÷‡¿½YûгæYÕ ý17«´d Œ¢°IÐÖZÉL£DãÆÖà áîñÛÛÇÿþY³}÷Н¿™¬$†S@²4—rÈ%™’Ì®[­6YV¿¸>ž¯µ…sªSA„lUIS¡‡×@Þû¥]¹f©Á¸nrÙ¢;ݾøîûÛcá‡ËVÛýc<^•2AÄCˆH½<¢’FGzOHÁ»‹oÎ…Dê…jÚ']hH¨Š¿ˆFÐ]ú7¼/}°Ô@ #à^¿åìØuQ”ȤRHqÝ;x ö4f'llÜÅdV$D’hAŽêkB7Bº ßoêü] œÝt£Í£G¯A¨/@Þùt£ñ ¯£šƒí²mµywÃ"‚ðA"ê íF¿Š!°7·=ÁžG¡/ý¤Û» bg*¿zFeo¢µfIãP`p4ˆ&'–º.µØëZ©Ö»0>§PµºŽAr„`¼@{c€ ý?SéQV|yÿ.ìæÕýÆõÿcêMšeIŽ,½£ƒ¹{DÜû¦@bìb‘=”…B.{Ë-7ÙÜ”fw‰tuƒU ™ù¦;E„»™©*j/wÉ/ïp7S=çûÚ•e‹X[KFv,Ø£09¢Z³œ…Â"*™Q°0G`Øaóö¥#êê•ÚÅ;¬”|ÂVÜÜ(¬ìn&ù3&!¡’*“ôIQêÐyGAà`rt‹”à¶ÆÕ:õ^«…±xpȤeŽZeÛ–|""B”u*슺÷Ê…°Z»D߈¨” ´jÐ…¤óÒu¶­—¾ž¨«ô†Ú¼#DÅ¡²Ä´0¸{w¯Bðùø,¯_¶W§~í^2í4lçš™'q0; „ »qø½i?ÉúžšàŒìîàÈ!\ä¯Àǹ~?H9B¿4ÚMî10–»_óâAù@ñ@„‹ÄðÜãŒO ñ AŸÙ…‰(£89ïc!btr3ÔÊZIˆcš‚¹Q8¥U:Èw$1‘ÅÞûY‚g0áäkG„©ØèÆ~u+ÄLAÑÑ=”=tô¯ â žÁÕ 5LEƒ8OåÂÌ„€!mÁ[A4ˆ>”¶¾†9Hi8žxˆ)Òú‚\IѮ¸ Ž"“0i®„ͽº9‘2+‘x˜G¨ÊM)”¡Â‡E§I#ÐÌ Ãºös÷ä(‘¼ïáÝaùÈ bä}h¨›Âœ)Іê˜JTðL!½×«õ‡§õúé§>ÕÚ¿z÷Õo¾oǃÖíjîÓ<¥R­á †ó¶önîð€+×I7&&¦y.÷÷§ã2EïZûuë«Ûöü|ýá§÷çóÚ›·-«t|]­™×†yž¾"^˺®´Ö0÷‘²ãË=Æ,2̃D1Fm D4K»7”™v;':ï&Þ_„Fä,Fœ¶ðÅè`¤Q0F—Àˆs§cLp§–Yieš(ØIZhÃ!Ü@L½‰W¶íâõÃÇ_}ƒ_þÂ{w÷ÿüiûOîŸ.G.§BMìsÄËë;üýoâßÿ®wšþÿ¦ÿ×ÁŸ?|ÛM¦2 +%½; ¯„óžEAŒXB°z”€ìÆ[È8 çe IDATjE -#§©œvÀ `Þbœ³}G¬Š€0÷sõ«LªwA î3l†)2M »SËÜ{ïíëóÁ±¼^ë¯>ùÆïîÛé`¯´ý链Ô;”ëê\kP˜§÷=(B‚¤€Â"¼1u椟fè:ÂÝhn~äÑ cUˆËD¬fbQsWÖ±q­DÈPÝ<…é–?Ïå+G9 yøÊoš2j@âT€ÞÝkÛ¶¶n[{yÙ>}~ø/ÿíÏÿõÿ{ÿ—.­¤(ÄB舕òM¹W £GÁ‚B”gY YŸfž&½lþç¿>½<·ë%¾þêÕénRaf)ežÊœ@.À»ÃšSÐéxxóæþ¼uf+‡ƒ>.Ô:ž_z¸‹0ÝzD…çᵪĬâDm*~<ÊiáÞù©ödz¯±V݃&öHÈg½c(s^7¸@¾‡Wv÷mòÚ°—c•èL Q]æè;•ƒw e²Ñëq“ F}xì\pŒ7ò¸¿ÛÄŽŒòÆŽëánQRÞËÄ˽nÊ`AP€}xƒGZsD([Ï{‚É÷AýN×Ï…TPôÄ´9¸‡FVŒ¾uoeˆ¡Žô†î#Ôq<‘D>õ|À­Ræy£þì¯Ø/{ 5‡[¬FA™Ád”é*sr73ëá ECÃÙÜ#:¼»©²ðàEí88bÊÎȆ‚ œ¸‹½·qó‘inÜÞ”f€Š¨0sÄÚ¢»£0‘;_.½")ëZøñ¡ð« åp¸Ÿ‰äplõ|­[箌4Ú!Í1”¼9ì€3)1K69ÝA" §Þ,Wª½1,‘T­÷Öƒ(T˜áÞ[wsCúBA$œñ€Ô9‡;;”…I† ÄÌùw #X†Ò³­DäAÞ½ž¯Þ++ÜV%!štæiÙºwßœI’eq‡ÓAè¤Â"½šYDVý¶ð 2&¸£nºUµ>±ƒŒ™!…ˆI:M†c#îV­µ6L˜îžêòpiÝmžˆ`>º¨éZÊß.B\|H::£ÇH÷É(þÇD |9eËE,4”_úý1¼Û¼¸hdþö¦#$a‰;3ˆ ºG=bLá}D €Ñ~ýeE¸S¦hŒlsŒÁ!GsŒ°Ö©«(Ã(‚à$ ñzM—ŒkçI} bGAt|Î)5EÖÃC„”ƒ„DXq˜Qpé KVn º\ž07ãKc™¯^Ÿ¬=ùõ,Tvm=`L2O:±x7@8óyÒmâsŸÖnNÑ AÐÝ;Šrdš<œƒÉ4Œ›aâé8éµ÷­öÖÑ 3ÍE…›UX xbYJ90+HH ‰æü²Ì|ÿF×ÚjkÞ[¬J!ã$dÁqŠîÛJÄ%DÁ÷~q/OOþ°]Ýf–‘wxÔ2W ¨5fSN9´»»EÊ>±ÂwìÁxÙä–hD! Dƒ÷1¾½³3@þ:À2Ê–' ßUžZ ž 7³¨ðΔü°¢ê¤>«¨‰P)£ó¢Äµù¨ËX‡$¯!õà„3Œ`Œfn}V±Š¨ŠÀ"%ÙbV!Rxùü´ýÇø'‚õÞ„åáÙkÃ›× S0뼋ŠNÂZtRá l×Ö¬{¸rŸŠEÄõzq÷·o^¿{ýÆÍŸÏ×óu{~¹¼œ_z¯µÖççíÇ÷Ï—ë%ÂÀ‘Ö¬DD˜óÖü¼6=×—‹oÝ%ûÎ,ž$E7d@«“P¹åÎ_ÝæÚž†KæàÈ~8àB·åéœv(2,CtFÒ #'Šð°áûÌ™`6ƒµ,ÈÙ„Jqô>?µ§ÇOð‡ß};¿ùöp¿Š|"eddàt*ß|}¼{ÅÏ[ûáãúl>øí²t£è<¢ d‡:’®acÔaтڨ¤çð‘A0Š`;Ð<‡púR)ccNTsÖH{ª`(ÈÁ0wDÉIZ5sfž‚zQ-}ÛÚ¶eJhRœ¬m/—§÷—»»R¦wÛvýp±:‰,ÓüöNe[Ö˜Î^º]Ô6¢Ð„²9yþ )O”ÍÇ…Ç9Q° $q"DÐjÓ狽¨‚ …YŽ êÝÝ[Œ{†7F¢ŸÄŠo,qqp†'±Åó¤;oË¡.k?9ª‰;öÕ»ã¿û·ßÿþw¿¸^¯ÿùþéO?þÃ?þó¿üðp¹¢YÚ¿sÕ³²ƒ ‡D®Ã"Z„s…'2³{'àí›×¿úæÍ$î¶.‹žÏÏŸ>}¶Ú¿ûöýÿø÷ó7ÿê{X´Öæé`×u£ÕÝÝíZ—"ß}ûl«µ?ýõ=³Íó|XôtˆÖÃÂ1OÜ{Þ£y¸‡Í —i.|˜éÝÛ÷߼žT^ÞÿøxÙìåº=½ôÖ ÑâP ¡:\Gû»›’ý’Ô<Ž2x¬²ó¦âÖµp+ƒe­¸®ÜmMû"ãú•0ÉáC±Ûl 1F·•G“yŒ½SÝæŒN°€Ä¨&Èá> %,´ÖDd qô4‰1ƒ¨G"7?y\'XÄæ$.jGjæy=öùiæ}P"XÄÆÈ&’}T>ÔÃv°ƒw`ç.…!c€ =º§â+íkèÀ.ÛA+LÌS]Í$p(¤Ù á°°–p8¨»Q«µ÷ôˆy «Ð²”©Übu>(ccpI0Íçã­lŸ9¤jáìÞ DIÄ ç•,¢õw[7ÇÃv:•RèýOÖÖûc¹»ÿÎÚ¹®Ïôò×Gš>ŠÞ ‚BĈá&™ £al²nŒ(ĦaeÅ„,×޼ê‹Ã„A 0[˜YGßϦÃÉ›¿&Ëa€™ùÀ 3„ƒ™K1ëaîNÔò¢*ÄD áYÂ=È[÷ “Ð4‰²z@ƒ…ÝÂÜES”¢P°5H©Lª*5¨…OèuK‰B@„—™§^Q»t,:%o2.F¬•©.Á*BÚ6}~\6ÇÖkïs£ˆ9(‡‚yÓ,’ ž¨6ÐU¹…¡›8 ˆ=‚ÀŒ‰! µtö}"eðÜÉÉ)cÄ™³Ñ?'Š<\G ,(‰*ĆÞéc<ªëéÏJÜ =1qæ¨iyj£îi©pQ–Ý?Ø—ÙKAk½Vç몽“2 CÕ%½É@&G^sÇÆ.<m£ÑÓ£˜A Öîê[ëpf-öÿOpÚåb–Ã=¿e®ÓÎh²œYη ó]ÿñùc]˹PÂ"Ó¤˜çŰmkogLðñÉÒ¶à`lשŸ56AŸØlãaR8¢U)ÊQ‹.¨…™Ã©Õ-ЦI²ÃbàÖ¹& <9‘A¥:M‡´6[mºn]…˜TXŠ”h­÷n‚˜ÔLXiR&¿.èß¿¯ë«þÁ/°8ä´5r%&<Â{X‹ªx7óny¥ì¨!,ßI“ö×Ç`[¸!2ÁŸâT”6&BX*F ¼í(!.<>~ùfÞÃ-ySÝÉ£ ¢HŸ$&e‘ô{ƒÆ£"¯ÏÔƒ !álÄVÄU‰Àµ{m@Ìù,ëHß[ÆÓ ÍJ1‡¹ï_)chZk;¿¿„ ‹Äy}º^ûýQAàãaþí¯¿þÝoXH6t XÄ#^Îçëº1ëo,æùÄ'9GÛí®ç Ä"Œo昘…‚³õî #„‚•˜¨{ Çqk³u%žQb{uÄ›ûÓZíÓÓºš¥Ú%“!ä {wo¯Žüt±÷îšàQ„¥¤%CÃ*–€` Þýܤ–Ž'‡›Ï¿üæÍÿð7¿ýú훞þøOïÿù/ÿúÓùóã¶Õ`.`¥ñÄÉ}NâYJЄQ50w˶–E[ëí´Ü}óõq)8¿Xmõ|éŸÖ‡Ï//—õ7¿ýþûÍëó˺®,e9/­µèˆ˜¥›—Iï_ß­½‚¸[tóÚzUˆÈÝiÂT¤VAídÖ)ÚÛ7ÇW÷“*½{{ü·ÿúwÿæo×jýßÿÃüË¿üôðâÕ±®f6OÅHÅØwc§,ŸÏí˜Dä1.¹Ø xxUª§Åß¾‘ù µÓçG_¯9üÌÆRD"ÄiäõcLÞ)U¾ûi9ƒ¶„|Aåv'#*;nmXÁÍÀgbJ—$Æ‹LSCt„;½tç}î ì àQZڴцÃ/é„Ì£ÆA7öÎm¼ôsÔøÏ4˜*‚›Íxl´"ò&3ºê´7$nרüöû¸ž€‰ÕÝjo­ÛRÆÒ4",BÓN4éÝWê]²K‘yQÕ½ ‘«RÚ9 N Ã÷ûF*äò†„/sÜqÞõÄéz¹Ye,D2cnîÍÖÕ&ü´mûøá¹|ûæë×ßmçýü~}þĽwÇÃ]u«m#7ƒi´PLJ ó°ü*—Â)ÒtwÄØ‚8ã·ã)‚Oµ@H¸“G1#¤Ä$" w7 ð$2 Sn¤D]iÛzïy}t“ ‹dÜKˆ"ÐÇ™ÑÁª "ÒYÝ¡S 3 LÌJ11©è†Ò5üñÚ׿š„»AÄ! Hj’ṕ@®ÞhŒ /±õü˜Ï»>ËÃU‚H„$2ØEÀ´kæòÅáæ´ïHynEÃ(2Ô.žŠ–lHÞVùùͰ•üˆ=ì›Ë™Ÿ•\"ÂÝ8n0·›$-ù3³…÷4©'KÕ:‚œ ªÒzxt²Ž!t`E0‰`8ÄÇZ*w9ðNY ˜7ñ޶W±r#ãžë‡$Ê&.yÿ<çup„U†œFàs‰Ã”E”Qne¤0Ï=ÂÝò3¼á ¨,®"LšBLD¨°*Ô‡úh$i >Xy$Dâ®jaäÜ­G­—ÜÝúÖìx!÷únR©µ¶Ö¦©°òËËy]ëT–ZÚºn?}øðøü·x~|>¿\<øp<¼}s*_®———µwôæÛæ­¡Zb-nÂ.BÝðñóõríæ¢r`Q¢ŽØ"Z¾EÓ”LžŽŸÍ–r{573ùNœÊÐä\Ç^¢aA½i@ÆQ$F;;—pÒû Ó£ããG؇«R?©%Âj‚góòð¸}~¼®]‹,B3ăÒ‰YObÿ^~jãr÷0bV£AåŽôNt!Hku[kï}$sñàXrÇ”…ˆ– Cp˜j‰#„ìp¤åèÀöü¸¡¢¥÷ØrÞ‚¦^ÄŠ:@n‚¶Któkã%hV’õÀ­ít¦™ïf£Æ­—Õ˜ÌÂéÇ+1“÷gbÞ•ˆBÆCu¤ùI†Z(àl°ÞÂ+# ¼y¥ÙõP³Gr‡Uê^ tP–ã÷rÃ|“¸ð稞“—p ‰þæ~þÕ·oOËôüøòãŸ?~:_¶²Ü½æ¥uëV·Ö,‚ P<„¨ 0UóÞìœU!÷XÀÝŠFa\/ÏïÏÞ_ÎÖ":‰°El-žž×~|ض'³:Í‹JYŠºõ¢²¢"EPi]{­&s¾\Z¯Ô;Ýäxœïr˜¤·þøÜž^ªY?Îú»_Þ}óõ«i’·_½þïþðÝ/¿{ûôø´,ÌÜW™Ds0»Q*‡ïbAÉÓ Ýï+FÑ€´Ló ¥qSܦó;)}JhÿÔòÞN¿ù<"‹ îùEŒ|îUöA™O-êŽXE+c“°L5ÄÐ î<öáT`!Ìó$ÊJ` AzG<‡ç»°(a-„‘‰ÝêÁøv'KJíØ§üß_D®Â, ÀFt¬{¸å"®mõúRõíëåÕ»OÓü˯~ñæÝ7ŸÞz¼8ðÜÝÆL*ÂLÖmutsf½Aˆp3³pDˆˆ8†{$·;Z’™RVÈ™}4ˆ8½1˜Ç«%6+ ³3ªEK÷¸PDÞO#x¤y#,ã J<¢ÞŒ:—Rfï­×M™Dtk‘esk¡w‹2QEƒÔô:ÇUЈÙîË—÷¸ ¤Ðž­$\â¤"ùþï÷¡èºmr<6Ô»B øóˆ0¸3‰‰ÃáNáÞZ¬ä&V X¨uëÝJ‘©°Ìêµ÷ÞâœÁãÉc¡ðÅ‘M4àc;x7v±œMÌ=b«d½ÙÄ!͆‡8ËŽ{WžøgÌß„(íO&aCA™i:×óúô¹ÛV¦©©7„›·mëe:h™ZlÆJ,S™O(§Õ׺½ˆ‘^Šu¥´MywÒü$!f™À ã0km=3öì¶™u‹N a2x·v±>ÅÄâÌy• 0¨°‚Ž[i£Í<Ì,¤B-”G«Ê#Ü =)M8ТC[¨ÓB¤æe’å0[ß.vqPq0%#(ü¸(4ªÕÚvјý¹[>v> dL¡ÌS6ïkµj- ½Yª 6ËÄÄL¤ÙYܧìq8ÂzöV™9 ‘CÄTè0c)¡¼ow™Òâ<%…Ñ7™¯6…±w÷NâEµ0¡Ê¢½‘uïÝ»¥)?}BãSä{?Eˆ…!$žÀÄ_kÝ¢¸VsoÏ/ëËË¥(­ëÖZe•Rج ‰_^žÿúãÇùñã˵J™Š–õ²=<>¯›MÓñåܦ¥´Ök#Ând¦½å9 +·Ã¢‡Ã¡_Ö­ˆ XAd$O¨<ÊlCÕçãÐ9$WIÈ4ö”ŸF™©ìÓº[š€}?·»tN'Ç‹,c„i'å€84‚’a6~P&ö¢Ô1(ᔕFøÈdܸ8‰y:17ôkopÞ5çÏ[XÝâØôD*“å¸Åo>àL5š¢œœ€(ÊÇ»»Ó‘é|¸ô×/ÛA–Óá47«Ÿ>?}üté]„TÂ$ÌN“édRD±sé/äžÈ}’ɶÁ11'DÈì÷¯¢×íò°yUÖâ̑Ʊ0Xgö2ÑT„{°¹W'šÀK Ìúµzóæ%„­;…6‰¾ywtâÞb»tï’¢ èw¦àÏAÔÓÞÊ~*Q—VÏ­”¤\ZmŸ^ÒC‰”‘F !‰bf„>]êår%Ðqâ;7tHzÐ.NÂlNþ-í±{W˜”䈈èë¬õ·¿üöoÿðýýñðÓO>=<½\Ö­6‡zX޼<_¯— =g¸Ä,Nì†ò\ûyy°wo—zà_÷Íw_ß{ôOÏëe‹»i9L²m5`?þø~RLS”‰Ÿ_.“Nmž˜"ÓDQŠˆû¶mOçó5‚™¨÷Þ;u#b;žøõ«Ó·_ÈéÏ?|¾¬Dèûï¿úû¿ûýoýÕ²LóñøúõëÚûãË%@Ëa–Ëj-öŸ¿ ¼F¾sóg7ÚÇ-‰¾ÇdójI_$t)dVׯ¯_ÍOÏçËõr‰Ö– AJ‡ì̳¸î‘ð/ÏSÈ.ç½(L¹ËSxÎ?Æär'ÐŒqf—3µcKвO‚–cŠÎÜ—É™Ñzl­»:Ñ!ä<pº¬Þ™:+Ȭ!t+EìA7‰È©nÿéP üyÀ<È(¡ûu|k²#ÄY‡ ·/Ñ… ÕEúÌ.©ÇÆ-]4Œa‰ŽžÊÈ÷ï~¼ˆtÓ„gª'‹Yý”-mŠuää1,s;¼b7š~ñ4¤nÙG¶)¯S졲 <«« ‡®ëöür~÷¦œîß,ó#^Þ¾½óôøÃöòèüÊùè€2¦¢Sáð°¾QÈ D»Ùc¸yÏñ«ˆ¨``ˆ‰áˆî-¹îH0+QzJˆ £ÿçžâQâîÝZuÑI ÝŒ¬ Â9ÉÆL2¤vfŽ0fQR ePaÖb´º…Ä\Ѝ×Ú×+ B°f wŸÃ‰äÅqw-®pjM@3OÓáàÄ×ëËe«N>å‘`ˆî¦$Çybhø„ª˜4ø¹ñù͘d¢!Öe0E$•%‡Cày^a]ÖÑ»TÏz0B„ Q¦ ö©#¼Ði´ÂÝ#(2æ—=áÄ¥]Lr$–×ý|•ãFUÌ·-nŒ†,Ð¥o%DØ3­fžô%ò, ;¡¹ÇÖ÷b¡"ÝÑÍAUw)÷±ç‹ÛÓä¨Ð "d<|ÿpÇÞ R¥br›¦¥`Xxû8Ð ä|ºúö/É`«zPµlk[ÌÓ7_}ýµó×ÖÎ+¹EgPP\ëåeí2_kaïn d*Q¸]·çÚ/AF"Ö¹›…XZŽ`X”HÂ$T9H…–eÞ¬\×Qõñ‰„¶ *…TÑûZ·Ë4ÏáÓ^[áÂL,`í,"ÝmÍGUpžÂEÕ‰¢»uÛºåAByf…«gŸ„Y“‰àfÌ·Žæ¼Üáþná"çç­]*¥_{wÍq8ïL¯´©³+ùÄÛ«Éï&z\é¹¢‡n>m6Ê. AÆÿ¢#I3\téê}:Mq¯DÞ\‚JxÞ9-—CF>mpƒ3;‰+œ¢Wò—7'ùý¯ßþî7ßüùñ „îýºž_Îçiâ»Ã›7¯îŽK‘ø¼^¶ÞV»q^áHÀJ”Ý!Í÷@¯1Mtºÿú›ï¾yyyþôìÓAß¾ûúÕ }¾§nÖÚÕ¬Íó]™Ä—ËÕ{_f•I¶mÁ»»w"› ßôþ8]®Ñ¬÷u]{+óT¾zûFˆžÎ×Ó©÷ÿýßþîïÿþ_ÿæW_1£Z¬[ûüùñóç—Ú˜øÔÍ®[o}|=r&7.W†¡`ÇóïC¬£díãép‡W•~<È›Wǯ¿º[fq¨ðõ§õ¼và@4+‘!ÈÀN°Ýã”É=´«}Àž"ý=7îPÎ9‚ãVž¿í{¾XV=ÓAìù²ˆJpiübc!•!&Z·î‘™ fÙ+¦ñOÂà4šŽcÜOîÜ#:åN3lL%FÇO¾x%÷Ÿn`Ä]õè‘uÄJtÏWWìRgÚ3®Ù{q"Üà=0,ÙWö¥ØiŠIöÈÒ8…ûþœ fPóŽQÀÊ¿gÜ’¾è5rB9øï_ …C¼ã]”…ÝDø"í¾ÝñD]`Îrb÷ˆÚšj)SÙÃó³È|XNß¼ûöéùùrYùñéüüR/kçâª2ia òÚ{ëͶ̌ IDAT¬AXæž­ <Æa&l„plÊððnaýòá"Ú¯²Ä$BDÞ(ÌIHDàáµG Ì#yì!e±€# ‡G ¨‰Q]J¡>`Ÿù5³î%vb°!¢5g=ˆFÌÓ²°‰Y„•R¦#8àݺ{GÐ$³š™{ÒYY¥Â-(ÑD*à˜&-_]ûýíá%{Ë`ʱuâe{ÒèFä"P –P•"jÝú˜kðèê%þ’ÜÇzhàbs®ÏjcéãÄ9‘ß–°žÁî_ZÂ_ Ct;‡ïG±4Zܶµƒ—û]Is_3ùÙÅ[‰S¾êáî-šq¾ïͽ5Ïöˬ.<ÊfnDÂ…™=â4÷ÛáÞþ™°o÷# YA"ì±Ç®,ÝUYDËÁ(¼Ý5²KC$LÖWß>—…¾~#¿ÿí/ûéìÛ¹½>©Sñ„pŒn¾Œ°+ö«ïxï%|àSotì|C»SxG4;.åx˜¾y÷ú¿ùæïþþøáåÿþÿø|ÿ|>·Þ#fÈTÀptÊñ.·Ýg~ãØí@Ù8Á f#²±Ÿp‰œ2g²ˆ|°¼Ÿ*‚8qZƒWÃ*ÄŒ°0u­š‰+CÊÞ, p’œóåwI%Âk÷–á”X4zDÉxâõóÀ“ˆt$`$>Žî£x ?»¯¡ÑØï‘%qˆC„`¹“ ¸-§ƒ'IÞ`¯gíS,¢ÛP#’»wâo9mJÓ²v–Ç{ÜJ¾c)„}¯²¿#oÛœÍT(N°æø&,Öˆ,¸…¸Çµvæ8‹êtYkyŽ_ýêÝïÿðãûkýüðÉN‡û-ffa o­u[{ïB¤¸‹Š¸wòNLEKv*²½âÌ@Nìƒ Ê&'‡k4Ç8 ‡[Xq@Ù‹»ck^ˆ'"U…EËjñ¾ÿHÓÛ$å0&.1ÐVAN™P7Ÿ‰—ÃÒ[ö fq\¦ÓDÔ®a>—‰ W¡JÔQ溭­5Í*‹Ð,j@mÞUu9^›×m»çz*Ü|¾Æ›ß?¼œþòùåy3Rer$Ÿ9‚˜,ïñùÅ.*“¢@ܺ\7ªFN…XA_.•cö?´_Mcfà\P4B6oïÌÄ‘?óTÆÝþuûT²ðB;ì;É ‚‘ͽUáoöñV{L©VMFP4‚úXQÏá!²C‡õT>34À1àréëÚÇ xºùŒ|8þ¼®ÇEÍUˆ#¢wg&ñ‘ûãá›Dû‹ö <`2÷^¿ÿ ÿóÿô«¿ûÃâ—Ο?IèAµ]ÖÚ*Å<w‡ÓéØêFв¼ŽVŸÖ—K_:½Òùíç;˜xžD•z„ÁkÃZ2·Ö{«$ÂÂC3†N$p¸y3 H)9§û’vÒŒæ EŠ2¸€äáÙ·íaJGEʤJeú–ó¹=>]·Í¤e"³0w-|?Mª‹÷îݽ÷Fá‡Y^Ýϧã²,3­k}|ºœ/ÛõZ™ƒ{@ò°Ü3“23SzxbŸë§0oŒühß‹Çx‚OêFBêdWêINÒ?Ó#@~Û\'A„¿¸ccOžüœ58žA‰êÊ” v­[ân-¼Èœä¸HÛÎ:ЇþD{¼dÆ#¡ky€!Oêº(¡¯Ý°VU°›Ö‡¯Ërúáí¤?Þ­Ï÷_/¯/Óüpl—õQK™OׯËKÁÏ×çhD’+"÷èáè]¢±°NE‡û;žÊ zŸ§rz}ZcÞžÖÈ›±ˆ¦TƒYDDH„¢‚6 €IŒðL©Cæ'(H2ÁÝZÔÏk‚½aAã:„€Eâ¾È8kÑjB›VfgοApñÛ815éUq+-—Ú’÷Ø¡Dþñä ‰AÂì£bê¦3]¡õ«·Ë¯~ùöînj}U_æC¹»[އy™–¢½[¼œãr9‹â°ÌËAçI[먆ËÅ[mAšs_|é’pÑÙ,þéÏÿúöÕöú}õæÕ:÷OŸ×ëöÕ»7¯îޝî—i.×Ëùññùp8œŽbéÍ{s ¹;òýë»w_½ùöD0s§Ú´µÆÄÏOç?Y»;-o^¿úî§ÃAëÃÃÇeV"y~¾~úôô|YŸ.Û_ß?ÿå¯ÏÍï–ûS°%hod;ö,ïÞËÏEöuÖc ëv7­ƒÌªõZ{¸ßŸæ¯¾~ûË_¼-b“ø?ÿåéý§ëÖ“®p ÐÁÁ™×Ú6à\åeáz "C;!ˆžK:¸Ù~üÌGFb€èD}øtc÷ñ(ÿ^ˆuwI¹ºsë]ÙcàÒÍF¢œóßì’R‡[Ƙý1eBWÊ9MÚgø£r#þÃáFÔ™lÀÅCw•A2« ÀD& £0÷Ù'î®BÂäáÝD"šÏ”¹Ð<©Ù%á7ÂÒ¨øN0Üé«ù Šo Ýå»ß•¾Ìûou‚!µ‡ñfG›\ÒŒnô87ëc kT¤ž(Ý(‚Z÷mkZ˜¥xçZ1OË7¯ŽÊ-Þ<7—û7Z¶V_¶³³A KžÊ=XX™-FP´Ì,Õ¼ö# R„§ìO¹Y8 O 6opS…08×Ãì#z¸YWbUíN½…’ë$…aÈQº¹E¨–ãr<膞/óð*eR%¨·ÊÔgâC´ZÑcQx£p›zçè}‘°R\¦Ž²5oѹ0zgkDÌhÝM(5 ÞŽÜffÃéÓåíÃõôX5œ›äg§èª`.ÌÑ=ˆ¹.Âä^7zÙhíTX„ö ÿˆÈ§¿CÅaå•Owò¼øM¶’ ±aðò}K$cÈ—ßǸ dòM7–®ïK%޽¡É¤BIJ_l±Ô‰˜”ÀICŽðˆÍ¼[¸‡0“0‰rQa&3Ú¶ÞÌÂÆ˜–( öÐHx¯î_ÞÏò9¿T‰ îØ¶V[˜3DO¼¯×ö.Á÷¬!˜¼»µVOsÿ÷ÿËïÿ·ÿõßÌöÓú?ÿǦéNg½›¾yë6ßß½{óöPÔ}óˆùp¸Ã«í¼^¶«õ~˜ÁÄl0=Nªo•ÏWªÝ(£kÌJ¥€Ýƒz°x‰6…AÄTE$haS ñè-¡³Ñb¡­Eo‘½aIŒ…p™d^ŠE€Œ„åpØÐê*`mÖ9†"‰‚´jxhL…g‘ÁOŒqäÇÜ„½’º`Eºª…brWBiFͬµŠ^O…ŽóäMÿªÞ¦I’äHÓÓWUÍÜ="#3«ª?Ðh`±;ÃYR„<+B ¤þú=îa)Ü•Á fz¦Ý]]Uùîf¦ª<˜yT7@Ð@Uf„»™êû>OÀp±)rÉssï¾,•´à”âêëõ ÷!“ò2"÷hDM`I#%€©T«Võó*zì„ `PT÷Bn€R—ÝtÔOt@©[^‹¥0btÏ< gÀ#̪»íºRôüœµh{ 8îp#‹=£4ž¢æÄÂ:1d»77#ñØ6÷Yuèåj/¯WÚ™0=Ó£5HŮ˜§œûËcZæÃa9LK+~>o—µ’#éôøxxx˜çYEòåÒž^·^ÖR NÝIŠV·ðÊÒŸDÑÿ‘1ðÊý1CL I°æµ<”Çt`\àöoZwï$Ñ›¼¹Ããm7r€oÿÜm86Zƒ6ꥄòÐw¸F°1Å[7dô`ãÎ%î±Éþ=d9&éY঱ï|UÉwwË=N“}ÅOºlz?HPA5êÅýã]J§_¦D³ª;.•[~ã4q¬Þ…Üo‰aÑ<Œa 7Sæé˜ç£0½Xi9ó4§tL(aÅÙwêÞŒV!M¤BîãæIÞ%§½àÁ‰qÊ꾱Ģö¾+ìæ‘ –UW±"#"†Ã%b-m8\b}xƒ©L’:%ÑÍuQ;¨9^Î\«´…[ÐD˜8¤Ço£§™ £¨M¿~›Ãè°L|]ëëëÙ¼nëæf Ö4©F‹hN€y€“bšuNó4çKi?þôüë‡ÍL‚P»Wòžã†G-V·uvF¬ç×ý—îâÍDÄZ=¿¾>?=ÓóóÓo¿}º¿xûæ­‡€\ñ@­.Š8ówßÞÃ+3‹¾Y×øíÓùÓËky¹äy>Nws³s¹®¯/óåtŸóR=¿”ùôë‡ËóyëÉx3v€ÉÆâ3¬†Âñ9ü=‚æC;µ«q†ö Œpmx~­?¿9,r]_>=?Íóòp·ü·û‡e~?M¿ýöñz¾ž-Œ(9Ü×kÏuQõ(î½Õ_ÐÂ\Í«unÆXu·ŠXOÛþ±7mF´®·f# ,AnÍ̬ )(\­"ˆqãõ÷o]ÏÁ8…›õ×ô3ôÜz”M‰úº€Ú)CtûVŒà[È{1‰ƒÃÃ(°€Ä{¸„>r‡1*‡ |¬.àIbJ`¦jµšT•{)²{ˆnBÞÑwÇ>ÝhtÄG_ ôrBOÔõgQŒsÙø×¾õ‘VÀ­/7$l·)ÊgYN`îù ÿœäà ¢N@ç^óv¦'/¥ÏE¸^·vr‘D3*1p¸Ÿ¦Ù[M"çsmÅL 2õ?X´Ú fæ>–«#˜6d‘zI<ȽZs¸&$5‡S5eJ™KžQHf„u*— g%bï¯Ïh!*‰f=±b^7€ ‰5+'oÔʺٚÅNSÊÌ­e=,‹ÛºZ5ÈQÕa +k^CÈJZr©——íõêFÅ`)çñBÛÚ¢Ñq>ž¦¬×kú噼¶ .˜TÆd+Ü–³GkÊ$a˜GYýºq1 ž!Jè@¥Ø]¸™->ÏÒva–S„y#ïº^¦äa²éi²wSß—†GtØ‹ÀÑã¸DŠñòï$…ˆ` Ep ÷Ã.!¦nqà=ø½ÏÿFÿâ­…)ˆA™H%úH×’÷Rk?“KŸTiGNõ&Ìžús‘½UÔ»àƒ¨Ô½vJ|S•Ä8g`Ô GøŒ8­­®vý»?>þÿÛÿ?üÛ»ÿüÿãÏ?üùù"ó)Ý%¾¿?Žóem)ÏYSV¯Õ‰eyÌG—{j®‚œDuÌÈ܇5¤‡[i$K°s.c,‚©£¢º(­OÀû*):ƒ¢«®0Ì’}5Ö)Ï_ä3£ïöïeìŠp¢ðn)†ç¼‡A§î„Û½êlÏŠ9©ê¸¹L“j ·ê~­[±æS^Ò<“¦çK9Ÿ_Ÿž·ó¹n9Ð߉Y'"s§pJÊ@4«ƒ!Ž÷ 3F×nSaÈgz¹9qWàÒíûtã ©8(0ˆï=D» rêÄgGðH·Ž™ôsù¥âÛƒîæeü^S ¼ &rxPÃöÂC}¨É¬ÇŠdN•¤] rÓ(î­ü8Ÿî—åàø1ÙmÄe®”ŒJó3,H9¢5‹lS«R_éýv}=^¯ <À}Úíc=žj *á\j‹ºh"µ¦.wsl\Î~ÞšgM2>’A$Ì!ýÈc#ºÁƒƒ½}yc¹³ïé­N*ƶñˆÇ˜õŽªP„Ã)×`NQ£(DöY›;ý7-@¦ØîfÌóáþ8?¿ž/[©­y„» rŸ6ùíF5ÜÜ7Š"ì*¤_½[®¬kùë_?žîSJî~½–Ëy=Ÿ¯—ËzÝÊÖ˜ *ÂÆ­Å¶VJ8ät:¤Ã—s:_Ú˵Zí–ò`àäÎÀ””ç1Üer]¯¯ªËýé8góóóå·ß^œ§yY–Ëuýá_z÷öññþ8/z¹^.—‹ªªŠ‡›ùï¿ûútÌ˲̿ÿî]Ê2ÿøë/¿\¶²9ak±v}$ ÞÃ+ÑãT½žxgÙ¹[{ÂÊ"ã@Û-rn>j¿ãˆ`@“°“99‹‡ûÚÌ®àÎ<P€ æÒ›%ƒQÔh¬Tá!æ,ˆ,1%vçR½µæ}„nCF°´è¸/º]ºépèÓ­¿‡Çø@Bœá4h¢âd‚ÐI8 n`FÒÈ à`TrWFeFP·íòçñûÀF?ÂŒõé´ÜÛ}ß:|Ø%¸µ"víÑÎùÁ¬Ö=àw¯ôìêþßoTûj–ˆœa}}ïdNekVbÊÉù츲Ð4%á.kŠRݶJÖCD*Q# 3¯[© aíÔu5·ÌL,Ì`v(2²«ÖóáIrJì½èÔÁÞŒ iÑš %F²·ÊÑ’èH n&‰!Í=ÂÞÖíê$8f DDB´y¯ýUŽJªË/ªíëeùþÍãåZŸ_/ä†hL…$(g Ú ”ïÓÛ¤¬™®ÅK‘”S(Wx%2Θ¥K[œ¢QÌ SÂ%b­¥Zh„î'!GOÃ!4õF@áµÕ(AäA"z˜ÓºÖ—²VÒt<Ìu£K]ƒšŠp·FNàåQjmkZLŽQà ­tînB7D Î2鬒zL‚¦¼-GùúþîÍÃÑjÙê‹Qc@†0†Zõæ™8éÀC2%3 ±¹8:ÑÕgñ¤Ä1<ÐÁÙ4Ö·eôá™à1èÃ* #2Uš3râ± ‘î÷ŠÛb}PŸ¸ŸÜ{|³Ï´…D>uÝ¡€Š{ë]–›¨®/ì»c ­dûhÿË&ííÚ~HfKœ¶ØïR&roÖThRNBI±,¹%ÞjµêÅKPhRÕZš¯µ>½^Ÿ/ëëùúzÞjé£Ü)˜†ËЫGe «R„}žç~!—á>BÞ‰K£ D#è»cóâ³2¨ÿñEãf€ ÑŸˆúð¢s¨ö¦Q En¯¼(ês¬ aÄ‘c܇aL$Œg¼'…|Ÿì",ƒò”ç¶ži oµÀÚ,–`p÷R –2]&´Œ-‘e7oÖÀ%I‘TAææ^kµFn†­ÙºÊÇþé%>•pW&&j»¸ˆ™LIAP6ò¶móZÓ6qÌ0F-©~d{jµ6II äN\C9ö¶ãm¶èAˆ „7lgÅ}NÞïÿÐî+ÝÝ#É{°¤ÿ®x/¢+ ŒÂ,öŸí~õ£‹}î¨nFî~:Loõ—k,¢¶bˆÌèBrxá¨9ù’yJ"'®[<]®?Ó4ñï¾¾QmÚl­±FÖ mb¸^ýr= —0>&‡¯[ZNœ+³7ï®%QݳeVkñ0Izwº¿?NðZ,>½\÷÷ïXæÿõ§¿þõg·6M"yq¯åº%ͧÓ)¥tw<îîýwn^èý‡óµÔÚÊe-ÌTʦzº?¾™2G>~üôç?ÿÓù¯ùáÇÔCîŽ2ø|)—‹¹'çɉ‚œ#zò;ÞÙßAÒ½ÓìùNgµA]ÌåãKmmûô*Ó\ç,ñx7õÕÃaI_¿»³Ö^_m+EXõÕɘ'ae„{£¨ÜµŽýÌÙE‚Ødfa=ÃA)6bþÃþ¸_)9€.¿ˆhä:8d´ƒC˜ÀìafFPá4&…D¼3QÁxt¢IÜÌÛ™„5j1÷Ög²~”Ó”àqv þ "؈ H· öóÔUލýHö¦“ŠæI£Q«&lšœàH¤Ú«×æ·0¹9XAÒç÷·}È“íåJà6£ßg³ãAŠÏpò1°ÕlÁ»ñT æÝe¼Óu{!k4öFÚRâ'¦œäW²ÖêVÈÀBµÜ}~˜æt¸ÚúòºyƒAXk>Ms¼nײ®ä¡¤ŽlÍB €ôéb/ÌG'†+$:ÓÙARÒ4‘Jñ«Œ& Ø‚¬1qbfÁ˜b+K%sv¢PE+°È"’Ô)ØæäÕÚºRsÉÊÒCT’˜Y„ÑZóÚÂÃY™5A3Zc ¢håjµ¨0k"7óÍ2e«ÕÖÍkË ;‰3y­¥º‡¤ò„ª hD±LzGrðÆ´\Óac3 V=jg@¸ë«SY]9É2P3ßJTë2ô¦Êý£U?Êy± F§¥¢Ëò:÷¶ï€ªGü¹žô ïè^€(*2Ê‘„0v÷–¯@5F› ’:4ðÆ¹ HìÓvÚð7Å0kXs¯A-jp –˜À I2˜VæaÕA Èn™% § fÝ'ƒ#þÄcëÅA¼Ö8Û¬›{¤Ðá½F3ÊÍ ¾á¼…î¸T'Ú¾ÿ6ýíŸåúëý§¿ÿí©aù&,•ZS HæiFPÙ¢K û²PàÔÊžÒá“DøÖ8 ¬rvŠjšb>«G3ªîFż5餬R[”ÞHtWÝgØ;ÉÑlu_z™ß×ÚZ C8å”Ö¶¶¯©å$šót8^׳«dƒª"URÒ$I[xØÞ Ü×»ÃìÒb¡,ƒI'f5üú0Ó7ïÞ¾»¿ËTj9+› Wci›\6»–êÑré#©8XžÛ! IDATàær‚ÈIBØ#¨VªæE rï{°âöØgÔ¥‘8fÊã!{Z4Â;Æv¬ð¥{Ó©¯(Ì(h”§=œ½w´|ôô>Ÿ©èÆÚ‡>´?‹GQ…ЇÞe€¬p“ÑDìJ7"ƒo‰ínÖ)sJÑ(˜pjLS~xsHÓÂO¯—ëúôôÜ­5:û@Xbpy*QÇÕwÆ;1³ªp_mD—*xXúe}÷åÄÿ*·KDâÆÎºq©oëÀÝo ;ã;ÛvÓ·Ó¨„öç!]{¸wˆ…@’ЂŒØ;ŠæÞñ¢ž=mqw 4 Îgïc=ó n bb%–1'és©@¯K:qDvÓfááàH Sf& ß‚j?åŒUáhÈrŒl¹S÷?@ïZ°ìO.áAH±€Üh"!Ê,<ª¥xmƒ;·ß`>Öo ¢Ä鱨Ïô…}ù6h?ãÈ¿ïØÆ½¥+)ÇÏ»ç`<™÷«Ãmž³+{£ç8‰»k÷´p?ó ó ýýÎB¤œÓ|àÃ}H²z¡¶ +qÊËÝã×ß-§ *—ÕÞ¿zó-J5f䓸Âe¿Ma Ø9H@HL3óQÒÃ|8L³ˆ·ð«P9ªÌвp¾KénJ¢‚ˆ)ÚAbÎ`¡îeïWcpκÌ:)ØF=eNÂIyRVa°€9È­¯E‰:4!9`p·RŠ[K‰—Ã!穵Ö"8O¥^Ø%cfN©¯Ík 4QJ ¨­ °$ÍVi½ÂK:~²åé’Ö¦Ü g}–F©×€% ApÏ·6Gµ1£êÙ¸}?öÔ1à·ÿ°ç×e´t;Ü®´ìIØþòþ*Å>¬ë¡zvö`¢.—º•Í#¢ ¤= õv²`<ô=z0>Gœºç;ö9Ý~ºhÔΤ×ô¼W·yÜ‚ ÷i#3ºÀ¸ùît‡þ—üü· 0JÃëÕΛw3Á$”µ ÷5:‡v\–vã _ÊöpßþÏÿõ»ÿëùNËû¿üù?>ÛÇ-„˜S^RB´Ö.+s€Ñä®f!ÑYóÄ­\j}u´4eM ±­¶]„å¨w÷2O¬jQ+™‡Î/ÈOÅ/-Jˆ¹¸‰»˜ÁÃ#*YAt8ìpÒ¢ç2Ád 6÷:“ÛVË%¼Po(‘ÒZ³hލ•`”œ'Rå‰u:–—s{¾¬L¬ý À#ÓÑ_/N^6õáz‡)-j–úÍÛåûß½='òM£,)’0ÉòZó¯OíÓkk Ö3Eý·AxÛ¶Rë I*›²!ÌšWCmÜŒÝÙǧ†û'£ß6E,gÏ ÈáΣØ8Ž²ÞŒZCô[¬[¸}QÛaPå¼ç‘cOõ0ï,€™E%e™²NY¦Iræœ0%ʉ“…‡ÈT‹{õšýsÚ›êÞ,{egKï¨kò ‹hð*a“b™5gf¡ w3ë¿ã> bˆ ¤sÀÌš¹³0>Ã.ÇŸ¢Q´A£ŽàÎì}dÈèÂÝ#Ú[ >>Ì·ŸÛ Š‘®ÚÛj<ž tsŠXÐû4Ò ·ŸýŽ# 1•££±i™}Ú'ûuìcç–“D‘X-¼Ÿ´òv7×w÷ñ탻lßß•wGçOôæ)_ßß=¾ýýü~þðè?§v!‡Yj>5Ê!ª^š[p Óç‹9OïþÍtü*hκSÝ®µŸóû¦.,|#߀ †ÃAåë‡ôßýáþû“a}¿^žKD°.Ê¿[âíA›.×&ÔŒ¬C–ekt-±ªÆ>ü‡2N c¢ßÿîãfº[n³™[XˆGfmç´öpÂËF`¼Xb\?K…úÿôxY ˆÜ"*ÅQÐE®nµÙëùõåõ%e}ûæÍéx˜“ÞÒé˜É#2òæV™<1%¥Ó1¿¹?èé°Ìó\j”úi-õ¯¿>½¼>mõíó7ß÷»7Ó”r–ù§÷ëZTÓºÚÓÓv]©ÑD!>'e›àœ'™&³ô (ÚS¨2ê.¬¡LIT@Œ@bIÜÌ>|zþøéÙêv:Nßÿ黯¿~ÓËŽwËá«w÷sNDd-Ì¢Ü×vîÂÌUIIv½®?>ƒhšRµúéÓË?ýóOŸžÏËa~»ÜIš><ýí¥–ºÌ¼Ìsql•œRòêašùá~>Ü%ˆ¼œËûk-Π@!oÜÛ“‰Ø[ìYò>Z·(TͽΙrέÑÏ¿¾||¾|ûíWoß<|õ.·ûÒ¥ìµFVÂó¹|ütu6š&, D¹¶¸^ÝJ$Æa‘y–poÍKÃËÅ˹¹ ñ"‰Ü9œ¬÷NzïÝK_â QvHÀ›;;íÞ u&ê—qb3‹è#g2!sB51‰x0ZÏ}¯Í‹Š@r×FŒY9n6¤!Àx¯½Go“±?µ(‚Íp¹:­&LIàê¾û_FþzõæäQMâ îˆéľµ¥÷À'@{æ?ÆLóÆ8ÜéŽãìÂËD;ÿiÜ×ǶuŸ÷ï÷é\÷ÏSØ[–r´FÙLyÊ`®ÍÐg­ÛVßÿü±•úòí›»¯ÓáÝT/3ÙZ£˜¥iy÷ÕwÈJÄ—Om­ßÜýÝ÷üñ·÷ÿß·òb­Ô(“ªŠ¸ÑÐT‡0 ©BY$b‚uRMkXxs/6™p$•´ä|ŸE²~ðx:‡ÖóA*ƒ¥U¶Ú ùDƒmÓ)M"‘'%PiÖ¬…¶…%k¤9¹¹[‰VA#iH‚ˆcÛÚæžAÁn‰=+M .n¥iÊ,pBé%Ú³&†ö¹²Z 7À-j³eÛDγ·iF†¯9Ã(•í¾!î‚?úÜ6¶ýчØ!¾gnŽ›FlÚIeD²ÿI¼CSÈ ÜgT¬:pXðÕÞé&¼¦ëQìajß~=¯±à'ýõùù;YÞ,‡óÃRß¶<•k ºÔÔÓÌI|V?0³S3gHmhÅê:©(ÓvÙž>•’"2:ÆÂG¿£EX¸³ªªR]¯ç÷ÌÿãŸþæAÓ~þóoõ²… ^ßNöÇÌ!/^U×'±M³/ D¥š¥iN”Ûº½ÿÛ_ÿúëóëÕZs—— Àoß݃¹ZˆÎ_ûˆ¨°;IRw¹\Î"-¼ë\B0˜<=Eãˤ§e^·µ”„¿žQË<3I{u³!îæî‘º{ñFî‰ç$‹d*V?=×ÃÁ¾yww—–ƒ†Ó§—ß>¾¾z½\Öµ´è¶& D<(TJ)qRNJÃÀÉ4;æ¾Y£hPrXxÕ.ï‰Ï!ÁÝû E_jË-ÓͰ –ð^paBCT"c vˆP€I¿¶êÍŒàI8gxÐZ¬9ÌAÄ{‘p0¸ïÒª±+Ãè\CÁNÔ»¿pCOÉÍ à#^aÑ Õ„‹¨Â3)Hi|'{'óÖΰ‚«1Ñß÷ª®<”‹£«ØÃÓݶqë쉾ݖNƒ¨Ü1`ã/ëñ%åñ–¢ß1öºqJª¢>Hü§¶µß~~~~]ïÎõ›oîÿpxœÅã|–íÖ¼”9å·Çûòö«—è 3›SžÓ¼mð,2oµ]Ï›3–Cž4ï“¢P¬DaÑjDf?kJ:‡Qf>%ýjQI g±ÊØ2{5×Ä„2cf&âJ]ßám¿o)QX³Z[c–΀skuŸ ³È¬ª‚h¬!BTsÂPvÙšTrŒc36‚KjÃF×:–)éáhe»mB[Nyma h†£mN+¥ÚÐ6E’nÎ[ÉQmagkÅ*QbI](K\jl¹%@ˆI…“Gc¢ãá iÂë‹_J+Ì"š‘ë¤"2+ûB)™V8çæÍ Õ÷´^ûˆ±H8…;™{k$î–üx?e©Ûõ9Ž÷o–iiçd-¼¯¾)8‰EŸùx5—æI°ÌYîvAµ®³ê0–‡»¹·¾ðæqæÖCz;rÞûõ 4h(/-j­Æ ®–5ÐKk¸{h¨¥ˆ<»s6F¥DD8x?~ÆÞr!˜»£Q„ƒ#ƒƒYx^ µU‡4—u­ZÜÉ }Û¿Ô½çÞÇ@Þž'Ž8¼šÕkÙÌçH9©tR÷(q'Ø$úÚмµ°Ž"¡0+lJÈV¼6'ª‚]Æö æ¤Ì‰Ð8A·WòèJS8y8y%2åß<½ýÞ[ˆÃGßó<±ï9 ¢˜q»5ŒüTWÒ ÕG_`fvÁPí¯«>ý÷Û#öµ`OûöpcÛ˜‰8WÑœñÕ=sº¹0 GáúªQ':f½ÿæpüÓ2SáíO³¿a ´DTâz+Sãˆí¿z”R¢Æ¢9‘=ýü/?^Ÿ~[/u®ò°Ñ1x& 5† ˆ‚è\e}½×xs·¤)5 E“v9äö•„ {ùú#òÇT½s~:Æ[™ú3qHš{‡G”Z7î-©=ú%¼ç¶öŠí‹±S4'²ÈÁ2”ðãweÃçÅ`vw*)Åa‘¬ê[±­xk”¦åþ˜–)·í*Á*Ä*Ó,)åÃÄ‚æÖ˜¤ª*hIœEKu­ææ6eùÝ7|½–Rtžg ´R¹;̧»—çK©-étºË[±úº™9ƒk‰0FÔ­Ú”$I‡)í57&¶p4b”ôp˜—eJÌ ×)GŽÖ(ÌAF Òª¹ç<5«ç׫WÛ[m^¾Ä¤ þôéü÷ÿðÃ?üå‡Ö"O³êäx½,‡|<.SÊË<‹€@ëvÙ¶U„æ¸^®us«VÄL‚`áÔš=}z­ëëåécµš#Þ¼{iŽ÷u»Ö¤K×­V7g"† wú­1(ææõ²zJž‰õ¼µŸ^O‹>žÒq™ùðáòËû§ŸÞ¿\+Še–ÆíZ×ÒòDš ‚Ì2etw#'° -™¬U+W«D<Ékâ󄀡æ6Öˆá5Âö&ʨüu…è yîæ»Aîá[è>íñ…õÔZ¸ÁÃ¥F4ïñGvPDb2ŽV[ëzY©oH;Id4ÂÆ);zR¥oŒé¹suM‘”úÏ·£u»K(xÛÜ|›'[2 CaÙ O½µ ø~êþ"S‰ÑŸÝIо@ÁnÊÑõßÃÿƒ/»ÊÑs#1î£Gpã½ÇìŒô®\§þöÝ7©Ü)¨nåòrÙÚÏ“µ?þéîîÍW² ùõuýðÓ"ÓýÃéïþô§§Ãû_ý§þ¾x´²µJÓáñôðry:××RQ™D›öÖ^ÖKuž™|É3K2çRC ÂCù3…ŸTàS¸™A=Ig¡EµyDm­µŽòÛÜׇh"÷Z‹½FKBÊŒp!€NDÑiNÇÌÇœÄd»z3‹ˆ8¬°oÇIkYl-@iŽ”½ùº½n¥¤ižn «ˆ&Í™%©,™[¸Wºltݪµ¡È¤gl¸/Æúô=,¢1”Ðͽ?b¹=Æ4mW×rJ0vgê&뤟 ¹õƒ{„¹:4zùX»±Ýå9Ú‰ NDêfáÊa¥`êðh1ˆT+™yÜû‡¶’‰÷{{ 0!˜"Âpxknn×èè/Ð@[¸u_mßÓº[`ØUkkOSUŒ.Âùãq¾ðý–;Ú5™™&„ùeë¨Z™iÈ ÷Ì>û¹­\ó¿ùþíãÃR®ÿòë¿ÿvùåŸ?=?™Óq3 ÙÃá ’ÍÈYsm$9I¢ä¨¥»!"'±¿®ëVbJ:MËœHWªuSÔ$¹‰Ô4aѸÖ˺na"9‘êÕ¶’9+O$`!šdR£µº›M"* JC¹¾>…‡(–ÉàmÉó|Xdâ0Ëù¹–"š9-Q¬˜’{bʤG>LÏkùð¯~üñõjIt6àI,éõ;sÀ©T/µu¶Û1ËýŒ ÷V¬\¬Ø¦©j–|<=0òôi=§¸j‡¼‘t­©‚{f "¢ªDáÖúaN`äDÖ¢µÖ ·°æa­oÅ<,̉3™‡‡w©¢<” DJÜ»¿$Í­ùV\´©„÷OˆûãÛ±L>ãˆví^ƺ ß÷`XhšYSá”Sâ[HV¿®X7kÞ_‡½##ìNBÜ+|ý½€=¦4 ÈböpóJ¶EМ1ZÊff†9jñËÕÖâN¤ IVà}©Û@m¼ÈFc¹yX0A )Ho,­ñv@€?g{z;´ïlpx¬³©‚{¢™„Ƚzß›Š{u›ú’Fø„nœ@É`âÅÍ?Øÿ_uÜ(n˜™ÏY£ñ¸ÑÅià†ðá˜9$ìbó³eMñÕ=ÿî±Íô*þ" xÓÍãùb*—á÷é%ÿókqY?蓪–€C’B:ÆÐTf¡•h¡¬S…_ËU£±Èõ—ÒŒ{˜†%¥‹PCªq+-Ø)Jyyz†ÛÕš”p@;‚ÅÃl›¢>LR–·%5ïÈ‘¡Ú=˾G€=%m/<îÆ ÂÞ¾Àç.~ÂîçÏA¦E£p’fÈî ëÛe&‡°çDÞZK‚ã2ÙÝÏ×M¥zóûãòÍ›»)E­×Ê:9e³»€¦”–)‡›ˆNSRM*”s"amnnmžÒñx$ð§§—ó¥ŽËÃéáxÐpÏY–e%BÙj&žNGj­mÅ@D-¨•)‚S’Ã’Ž‡4)ÉHcU[˜‰‡€µƒ¬û°·MÉUbÊÂȪ©V~½–ÚZ©äÄœRózÝ*¤ªœ3×FÕÐ ¥ØR‚ª˜Ûóó‹µz½lç××óµA´yÙ¶skæÆLVK[¯ææ®»ËˆfV¶²¾¬Ïï ¨OÇôx'Óüp|áÍ7óhóè&#ÎËašær½l×< fòV¼”µîu ‡_”b[×O¯ªÓ_yùõãör†c6ž-´5‡…Àƒ“ÎsRDfê?( ï²òñ(w‡¶äíý‡Õ¯-à"#lpÆÄcgô§qXÄØ‘õݽJ0ÂÃ[ô%¯€„"‚j¯íÜ&¤ bvfg5ÕêÍ}ì¾ë÷ŠŠMÒ¡ÊLQ{a¢K ;Pu¼ç°f;ãa_Š ±‰šp1aæp‡@˜¡ )‘E4kµ˜0M*Ñ©ÉÝŒÞ'—18Ãû ~ÔçoŽß±!ÙÏrt+ о­Üße|öáÖ¾AAAü÷èyŠ/Š}ÔóDd·Â• 7¤ƒITrŽ‘çþ¾wªÞ9,ý½Îㆠï/êj¶³xxW{Øb_ô±^³}å!9è}ƒ|Ãvv ¹8õ¥¥³u(½yó0Qí$Ò1¨Š/»•·ª¼!œ$(1ÍŠÈHÏ„U˜š‡ûgNœ¨\¿ÿúðõ»“>CU¿8ýîðá_h}i5’vxu¸º³sfÉ"•½ˆ˜²1‰ÈC%Dµ!JµRHÜÙ‰Žs>ÌÞŠµgPâDÞêæÛºm$ž0N:¥< ½#iDÍÝØºÖÇ[u´p¢fÖüRkõVrNµÌ 7ïŽÓ$ù`Ä, )Ëœ8w4 ˆ2\àN%bã¨]¿9ËÛ“žr°o%Z%«d˜t>pžu^NgÎü„0 ÂÓh¡9ò„”{qŒw±DÌ Y¹Ö¸†QÒ$’¼Â[ÇÚZu«FDNp ES3¯Ö|tœœˆ&NA Hne-•¼hfIªNYHx'+ÇHÆ}©ðо|õ=ß , ßÑÌFv†+;Ã6Ú^Ý~ èçGþn¹ê°Ïw¼Pâ4OSÎ0«Û¶Q4@'pxxs!Fkq]i«ÚB‰3 †¹#ˆ´…o­oá<&jÍÈÁÌ}Ð]¹{KÔòB÷zH·þJé|]òîï¡þø¤ |>UÆ €Ñ#Uý§äŸ»jÄNaøŒMŽ^²ÿ¬ÍQõ›ç3‹;®Ô«‘ÎéîþžÃίà†7wøý£}=½úú©µ‹`†N’î±y èe¡·ösEP®35j¶zê4 v .Ò„…‚Zk ]打fÁiº»»[hj/¾nW0UrÃØ¿¡,Ø*ÁbIé~ÎÑÊÓóå¼€'¡E9Î.«ùSòOA DÎð ë|Z"g2 8vøº÷‚d/Wß…s4ŒW/^îØˆ½Å5ä\ê¦×ŽQ¤=¤Éˆƒ@d">%¸+‹g) ‘„›€Èíaᇅ’Еƒ'>œaE‚ IDATK^l«—ËåZ*ÇCJ•ÂT›(9e¤$ÊBÂr\¦Ç» 8êœüñþððp·Ì©¶²®m0ZN¡Œ7óãñ6*ekf×Õþ?ªÞ­I’#ÉÒ;GUÍÜ=2³.¸t÷lÏr¹B¡ðÿÿ^HŠpwvv¦»ºä%ÂÝÌT•æ‘……à±P( 2ÜÍTÏù¾ç×~ÝSĽ'XÕ4EIE‘¾»I‰ë½¹TQí}ÇARM—˶.˾÷¿ýíKf¸ûZk¤PLDäízN¡ÕZÿÓÿôÏ—‡Ç——×Þ{)eY–Lï£Ýöööv{}}»í¾=>nÛE4_Ÿ¿§·bº¬ªÍ%‚Ó×*L"b p™µ–c÷/ÿø]^÷R)‡]¨ÛZ׺Õrô|k«ï7–”°ŒYQ‰kDô/ÏÎ}3ÓÑcF-`,D³š>lËÇÇu[…Ù]pÒÏÌÊÇŸ>>©è×//Õ~ûÇ×¶·6< ˜ì¢™»qª…‘…2—þã$õp)b’ÃqxŽ`¤ÌAÇì½F SA%múÊ9Ó~³V8qC(`§jDÃÓ»:D3Û|OÃ'Þ·ÆwqãyÐ9«bSŽ@ÑSœ§G¸yxo†Ü£QÙP †ƒ¢Ó_3égàyúÏÏÿ3tÊîãÈ9Žÿ!÷dÇ·w?¨ çt΃ßÓ=ð<ŸwêJþx~žE0Nþô«ì ØÆ];ÃID¤häqõÿòß¾½öþ´Õ‹ù‡ËÇ?ÿôó£C>€øéÓ‡_>_Hû÷¼füþv ‹xXìÏ¿þ¢’û—ßþí幄¦J¨±@V3šªD¬¦‹PG„!MR O¯R.¥xhŒ QXéÈ£÷cßcŒÉ#±‘ââPQ)µVÞ® ª8ï„HŠ B̤,´"I\Ç §ˆÉesðèC<¨Õ™WÏ7OOU`!·×è2{%1$gfŠƒ2Ãv™.EôAÅD®àü:À”8AuRæCH%§eæD|¦#y×÷8ÓgU+ÎÇ» @¬mùhžE½àIãÕ¤avph2GŒ'.öø`N¥ÌŒ´%3&§3qZ5f8rBЄ×üü‰žýã8¿=îžžIJL7Yº dIhP÷ðÀ\ÍÂâIbÖî÷c¸g)ZTî5÷?¶Ýçmê]`fB5·eö晑YŠ$âºw¡Ú|-ËlE3%o•þ´ŽKJoøö{—|üpYwQ{¸<&ÊÈ3ºœáEC8$»2 Į̈ÂRT$G$ã~¢[Ö,í8Žæ$5ÙƒbEŠ ìUpÄP㺚}8P¡uä~ŒÑ³e¡î­WŽ¢ý6|.­Yf"´Ÿ½Øº®—Z6Àn{º=®uË”ã×}?º·Ðï_Úßÿ±ß«—O¤NŽþÝù$@":ò(</qYäqå¶ kÕ­†1áž=”öð¸<>®µÒC^®ùûoûß¿xǃ# ¤ÎŒSKAA U1‘”ɳº«¹,š9· bîyÁT‡ˆ@MT”dÒ$)è:rÞ;=¦QKÃgð^A#vOqHO7ŽsÌM)ªË4*ßç>'ÄæœðþuáL@ùð~b%ç/t ܵÈ[û1Æ`älªÌGp¿ûZʉ¦¼ϸ^Þ=B3!£ŒáÙz N˜ÒSÇá–PÑÚ9¨—Ùü¯ImS5k7$3Ò=–,Á ¬< äøfÝ©?§x0'ÑNHŸãe-wú?Ü"NYó)Úÿ¸¤”“éyÖØN[ÈæJf„gÆ;0\Þ·I>ü1;‰…`BBj_>I±ËºÿÓÿü!ÿ¤_¶ö{ĵ!"sè5‚ÓY8²¿ýiU©â-ÂÕç8¢GfŠ">Ðs ±¤Šh1­& e<-ò—Ïkëùé€ïÇøþÖ¡´Š”ŒYðŠ‘Y™Ÿ?\þòùra»µ7ÍY/dj>{H¨XzŽ–áçjãL(„§Ï§íÝ.GÎþÓ4g%3 þc(8)üã§{çÊåÙß8éO¨bš(Æ]íb@IQPæ1ÚèkÕ§‡E-U‘J)î Q‰Ñ÷Åt[†*©‚Ûè/×ÛÞ]Ëòð¸>Æâã˜+PjÑÅÄÖÅ”\×Z«–¢¦OÛÃ¥.k±Á6ü”×–1 Ÿן~úXŠûí¶÷¿ýv»¯~õHC†ìþÊ#öµhP}x\kîÇÞF¶b²Vù_þç?ÿ§ÿø—ç—·oߟ¶‹Š»¿¾î_¾¾ÞŽìZÊe[–í5v{\.O™åzücŒÎ„ªhJGtæ%ŹîÞoßy9Tu]—ÇŠ±ùÛH¨|¸È§ õf¯}\¯Ã½ÈhSø…4P Æô„m'›汚¡jfŒùõ*â[Åãª?}(Ÿ–e5 Æh>ÚŽ‘L7=>}üøéÃOÖÖŽäóó5^^÷£Mq÷ü:!³î'–¦c5ÙjQÕæ8ÚðªÑ”–PÏ6ØFŒ1 @gºØ#)bŒ¸§yèð!9¤(Râ„PIÉÌ¡j^Ì‘£7( Îñ‚’ \&û<äÌB0™wLÄ B$#cŒSP>:ŠÀLJˆ‹Šn\+ÎýiÅ#4Uµç¤õlÛ’'mïŸéqú¡x/ÏG.ò¾ >‘ øy=áÄ_wñÒYªâ0B8£CÌiü‘â»Å~NN½êðüíeüöú]Ð~zàÿöŸ~ú󯟟.WÏo¯ûõûU†XÌÊŸÊðòòö¶éþü¯ÿ×þõ_²^~þøËøuÿööÚÂw÷fH¦…ªb¢Rì|!ÜÜé^ UR0ˆ±.¸ú@Š0(»ÉKÊ-‘Ü팷”‘¸™4ËAªŠŒ–)Åœõš"\ŠÕªÝó­E°®ëETÛíêž”äù6ô*þ‹¥Œ[9ÞÄ“°šfAæóC>âxu*ËÌR‹HMÐOîgË»ùbHK„dW E$†gÌ¸Û ·Py9mö1¯Ás±$¼ÿ|Í1å™kš“ùÔ¤Æ9nŒä»Ð'©çSîƒ#œÏ‘ „ÊNA¸ädÒSóüÙNROi`&fGI1Òq0ÑÌôw ¤Š@Ð,`D¤‡%KŠ8‚ðŸ@£1pcª/¼yoc­*[™Mà{þ‚?Vëï”À-éJ–rV“ç‰H%3½c£'~ÈÉ!’r/|¡~FÚ¿ÿ{ÿþïÛ×뇧Çõv»&í¡<»ˆþÜûwÊXÖjJi]F×b)LïÌÐŒd¨ $-ÓÌÀíûî×kä\ä`z)&EkYª>¨—·v3½=n9žßä­©ÐÌ4#Gk…ª`x¼"BtÁ ùÖ{Œnâ.uyx{½VÛŒKYC/‡òèe]×ujßü2úÞû?~ï_þþü{îÝ—Rä (Ȥ&ˆpx‹þ}[Û_~¾üéçZ¥Ó;SOÊ”¨±¤bY¶OŸ¶‡KaÜ–Ãþ¿yù?ÿåvå£,[FgÈáçâjî#‘™ÃÏ.¶Ì'÷Y@…*7åéHÌ€ÀÖBhŽ¢Zf:?fˆAD@Jºé<)ÆðhÍ»aÉh€Èê¨á8£ÌóÉ€$°VÉMje ô>z?¶e-K)åºËãCÜŽ}x*0k ¢fs1*VŠÜ×ï‘­2d—á‘I±Êð1T4žâ™Ãã8ŽÖv‘íá²õîÑ[÷ÖUp¹”·u[×…_¾æóëóÛõ8Žˆia/ë<ÑzïчŠ-KÙ·”|ký¿ïážb*ˆlÌÝ8­‡æ¬ÉÒsŒì‡c¬[]ŸêÒðr½Ý^¾[·ÉMñ·½¿ÉÈL……4BÁPÉP‚â,0^#_‰£¨Ožˆˆ,†µp-®lHU3sÉ–sñ}o¯Ï_¿ª²ö‘¢(K®™Ý'r`‚^<•YJQ‘€aEj*{óÄ𘠇 ˆ E0ásj;ùoy6Ý9ùaL’Ћh$Rç(br LÎ37†J,*ìÔý@‹¸OLïN¥Ó2˜÷õ£Ê]·% %ªGFŸ;£‚:í*H!ŠžºDxL¦‘’ŒÌÞú©¥.‹ÍÝŽœz¥³5÷8óÝðüÇXê“qŸœi¹‡ûOCËÄSÐ{æç}ÔŸ¸o@N¶ÌýA<ŸÐwú²Ü9£ÅÏÕ}Ñ[Çoc—ÿò{wÿó?ý²>>‚e[Æñöí·ßGw,>] Fîo_¾ÜZ„ÚòñÃÇŸþüéS ¿]ß®F5ÉáÃ#:_6ezŸ]U+‚Š0ºòäí˜äD7¶É²{23(–eƒ¨ýÖò&ð¢®Vhuäh½QDuVK3%ÃTXÎ-¹0ÊÖmóÑÃYE ÷úb¯ºtöÔÖä8â†ì@€ÌThöŒHˆ¸ä[tˆäˆéÀˆî9\˜»÷8=@8‰—Hºg2H%bδåNt&2àçÅRN`"sNjçV3Î …IÌi} ýGd†' §;~ÛBÞŒè*PMNŠ~†¨æ;‡B §íH¢qúŽÎK¦Dª£•Hr¨PˆÞ1&ÙkN•(ËdP‰1‰‘“džÉHo=ÔÆ$ºÍûo†¼')îÅC0<<¢LðëôƒN’*\²):C€9<’@®9ÇÃà÷ïíë•]KÙÝ›»ôÔå"Â>Þ»±ÅȈŒ„P#b2ŽáîsJš ƒãÈÑIV±$:¢Šª$¥­PÖê‚D•þ¶Ç[Û¿¼µ>¬±(æt:3À‘t b6££O÷­ÆLß{{ëý±#•å¢[0›C•”ÈP±Ç­¼–+ÚˆcWà,ŽÅœæ¾g9<ò`îk‰Ÿ>èϘýh·Y„l)u]DhCd!Àèécôåõ†ç½ôåR¡Œ›Æ¡J±*T…M3kÀ™ŒäYê g…ˆˆžÌZŠ G’é6©øîœV]Ì&<í$÷¤p¤Ç9Â…&$f½ä$ñ(hÁÈðŒŽ6„Á$šG†¬eÅR‹b¦ÙFæHô·ÛhÍÃcÂT"9bòsÏVÙÞ³É2¡ QJ™jÄá~޳C3ɹó¿ëZ@$†X@‹’î1Ý &FˆO,¸(è˜ÔÝ‘;‹cšÔŒIó).ëNNåe 2þ8ñ™zrþ˜ ß÷¾N°ñã1É»º”g2ç¼?¼Wuô}rÏ÷æSlRQ'à;O@"óïù»J“÷kÆy)LGŒ)sÈ÷ÍBŒµ.õÃ6><ô˪K·ñ_ûñŠ«/Ѩd04»eÓ¸JøÐ‡×Üv>]©âaãu‹XUe¥Yˆ‡G zdzøá£Õõ²ÃG»åÈtU¤KÄZ¤_ÙY·_ÖeÛ–Åÿû·|kŒ¬”2"F¿JöO‹ý²ô­¿ÄþzQ-º]Ó)*VpïQ½˜nªe~„dhV—ºl£õÖ()š)wà}Ø?9ÌSö{N4ç˜êFBÞ/Wó~5[ÅJÔŒLø²êåR}ŒÛÛ>ܙԄ4S‡#@3ÕÔDªH¦ x›ï“!¡V·K•1ÆÞI1Ó„*•©B–2ù³sä$€mKî™á1D°neÛSÏwQ¹,ëÇÇË盞4 %óååÚÛ(¥x 3>>™P[ëÒ÷æ×#ë‚Zé­õL’˪bâÅ0ý»·æîÝÈm[×¥jÑ9RBÀGƈDšØ¶,ÕlÒdÑž™o·~ŒÖG"j)µ–Zå²Õç=öþòüÖFD°.º®e4oÇð‘]UêRJÑ‘±©|¬£YV(ÄP¶‘q¤H¨;ÖÌJ®)9ü:¤;•‚Kñ¬ñýÛ~\íéÓç´šì".¢?ŽøT‘Ùu Pd©âèAªHɤ'ŠjUÓ2UDæë-Ú8Zd ¶e´ñvmÃSEÁrÛÇ¿ýûíùåÞv7áedD†ªŽ@DT“µ¦‘Ý¡§„|´£½ÅèAašgQ ²wŒ˜MÜð8€ÝϳÌsiEKù¡0œdå)IæŒù«f1Vc5f¶ãJÏUt2ÔY[d„œk½Ÿ½ÙÁ)[£‡žïF aœ þÁx„{ñvžmNõV´Ñ[‹ªzŽE‹J¥LÔvÞÑ ´xßWŸ'¾yŽÇ‘")÷bÖ|0̸Ï}lŸ÷‡úä+æ? $A¿ÛëåôÂâ %N>èWtÊU©si *²¤épûÛËþíÿ}ùø÷ñËçÇ_úðó‡Åž~jÞÞ¾ü†×¯AýöíÛï/_ëR¬¬/¿{Vë†Ø… ]H£6àHŒÈþ˜Š‘=ZŠÕ"©ÞT3ÑÙvUíԽŵ·î]Ð!2´¾Åö}èðyOÔ€Djb h±²ØRÓ¨Dzg¦¸ËÑ4+K–­‡x„-—̶Ãs\#_ V•‹Æ×k [ÅL—k¡A§7I§Ô¦Ec„Ã0®|ÌOì&œáM_¨Óæ‘„ÐÃ)!s”Jš@Ÿ'î¤Dú î'G¨:qs›Í ó9Á „LÒ:rr~ÒÉ)¥?-’@OBaæ\v$M\Þ·íI!Yt´‘Ñ”M™F¥ùj1Ò ‚ŒŒž p¡ôÌ#ˆÉ4€ÂÁÄ‘ô€œ_º“^dÎ\TÊç-Ñ1i¹”#›C¸.&" Ñ9yBD¢L÷% >F¸ËReÞÏë‡;$ÔJ$%Î, À+^›·ëÏzê²}}öIˆÊqxI1‘\j­’–™Í4D´ºúä/—¡JÈr­ËÃ&‰lmC  Í$lMà*¹oµŸö#ßn¯ÇñÆ>üº#5Y <°#K¤zBIX±‡94Í©©æZ EBgáD’Ör„«r1áÞvzXÊ£É㢹ûdD’x/‡ÏÛh'Úæ?~xÜ6E&L ¬HYJ)40œá‚Dêuûòü|‹²\¨‚èÀ€$U­˜šÉlÝÜÙhˆˆÄx{Ÿ“Ê :‰ÓóŒŒæ4Ë Œ ÌyלÞÙñçOÌÄ}Ä”OÑI"•)pÉ“DYE22rdìÝ™=™ûÑŽ†¥(S¡ÀhÑ2W¼WSç(5²"Ç1ܧ߆Œy™O¨p-Q-Ž19›¾ÓTsò¸„z‚tHKO´ž” µðA¢dŠ'Ó…Ó’u†W3Î;êyâ|!tO ̮لF”„:‰¼óƦ]—ƒ9„"(H=µgÙȧ梀R”ûç wMØìsz×&Ñ'ÏPì %8KPïiVD¤Ðy/=e"f%í\ož‰Ö¦Êˆ8˜ ÊH!ßjüé×õóŸózùòb_Æïuo·×[ë,RV¤ Ù»‹Û •²f_)NÃ|¦†Xj)LËÞzÝ¢ÈmÍ~«û¾Š q ß÷}R×¼ØÉpÍþ¤Üä·Çúüðóöôøð¯oúÜ–Û(//Í=þºù|äÜöÛßßŽ×ø vùÈ^¤ef¦¼e\}Tº|ŒîÃ/+×Z3,¯×ü÷ß^nû¾¸¬«IŽ1"QjD„µHÑÒƒ½õ „ MQLÔ‰ÖÚív¼Ýv"?]–˶ÕR[÷—ÛQ–U¬”êóen)R!HZêº=®GÄmôZõáR›ŽYy²¤K-ÝãöÚòùi#_‡¯öðøiÜÚ÷ß~oÍUU«2Ðû\x™s5©WÏñ|˜z-ë²–ç׈«>|XÖU{Ñ©3tï#Ï’¡("žŽî¥PáéÁ1”;”>{;ž¿½µÞ/—úð¸%ê뛿^¿‹ wJTˆ~’”K‘¢© SÔúðýˆÛ‘Ý‹G‰ 1’#ÜÓÓ]!5Ϧë¾$çó%N­î—Ÿ)ÁùЏÛ-òäL†NbÀ ’TƒÙLLVÎÁ‚& át3S½+WƒsÖ|ò7Õ.ž}d­P9÷hÄûÒTî«\ž8dxô}w!ËéÒÎ{¢‘w¶ç»eòߥÛï Rü¸'œžwý3¼zAïoWÜ!Sùno™ÉÓp÷ÞU.w³¥œ”¼IrªA¯Ç·<ö··ïûËOë?ýõÓãøÏ±>|ùûß¾}ýþåùör`¡(P1Zß¡…¶Ö¢Ño½·ÆHš(¬Ôª)ïÚr [‹fGv$ìD›º',ÌBR,׌J‡èÍ̯Ñ[¤FŒ3 .ô>bø¬n‚UD>C´î­ÃÒ¤+‹Ö¥N¤~ G$ ïÑ^e4ϼ ¿†Ñmí½©Xµê) Z˜"EçVág ×¼³7÷Ò¹fbo9âSÎIa(Hf>Bdʱ8ß²r:\¦Ÿ'rLvÞoÄ,׎ÄÈ …£ i#Ð'_AÌq‡ˆ‹†Î“c›ÿD¨¢‘ôÈ`©ZŠ »w‡LyFÄä7±à™Á G$¦¼/sdrþ|&³-sŒˆ„‹ØtæÝïä¼ ¡œu´ì€cºµ{Š„)×¢‰£']@=ýyHÅTeʃÄ­Šš((RJqG´po)*JÁ\ä”bb/Ï/”øõO_Çå_¾ìû.âWDˆf«æFOohY‘6üm ,¡áeÉ¥ ó.‘îm)º,¦E•צ½AšQ¬£p'ŸRŸÌ$ž–ñ°`$šg$I=rASXª%áÑ| $Mµ”ZêfõâX"šˆÏ#é¼;µ‘ÊÕäa¥j÷)ZôÌ¿7€SD><=þôù±q(W3P”iáéý¸J-—¤¾ùçö/¿½ýöâ)µjxQšS5¥ÉüÄó.9<7ž#OÛ„‘Þ3øç¿bÄYS™=/LÛ Cy§)¿'ÄT©&6ŸœLS Ýûh=3È ‘äÄÒŠ1è~ú±»Ãqk̯ëÂYEÖ‰œr½Y¦žäh ?z”ˆ° 82”® “ÒÍöôéÂ9=B8k'O2¥{è`1ÍS€&IQ'žÛ@AÊÙ^æ„t½Ó7çûÅÈ©ÄH fŸÂoŠ$- 1ï˜`@*h€„÷DŸ—™Ùh"3DA(R?ßç@Ч¨û‡½ï¼œqöwÏ‹†ß+Ñï<À8EÁñ‡=8Nmfμ+¼*”62ZRÉCÈøøyûç¿\žžöƒß—Çú ÝŽíÚwŒ÷Üd&8†Àš¤?ên´Á äÂZ¥?ŽÞ²73+±lŠ™v³ºX©‰·£ïGÐâ}IŒEñÐc;¾`ïiõáÏËòø¥-ÿîoßÞ(ý¯¿~üËŸÕ–ïϯùí–o‰õñò°„ùóÞîdY Ç{YäãLJÃóvkJ½ÞηÇ)Ù|?>à|oß¹+çøoNP'bª”à„(A“J%èçõab±à…¾˜<®RÌ2J¦õáMèDMfAÔŠ‘Á@„›b¡0E“>øýõè®[­*2”™‘ô ºJ~|\¶K5•Öãùùööº[kݬ®Ëª&™Üo‡k,µÌÁo$¶mýé§ÏëzŒÌˆh}ì‡îcôT•ˆ˜)Õêåæ×ý­·#zö)zØyA@LËÊd ×"ÕìrÙ–¥X¡(#"0†÷tU‘á~|oßžo¥.ÅÊÌgXYÊR[à·ooÓÙ§µ~þ铪}ùúüýùÕ”OOx dúðánU­èËëu=<µle%^[Œd Pu‚&1K±=3’%É6ôå ša*¥Úµåè×^l¯Å6+oGÏð§­~ØíåõæNƒˆ>|"ñÌPŒÅ;ÆH÷ ç›Ð^õ”Œˆð-o{OûmŒ¾­Ö¬ufï½GxrÒ3E¥døÔ§{JkÙrå¹ùÀÑòmç1 X:Ð% ±¤Ä}8Ãsošï8°SÁŽÌÈ“‚s’þò=bHFDkˆá½XŠÈÃ&Ò†GG¥0§ýjRψ˜ðƒ“®3±I~F' As>®»ƒ&Е+ IDAT‘ Ls¦ê€Ê„ =Ð{™ÅLˆîÑRÌTÿˆ!¬ä=t?èŸvúùiü¡ýÈw£×»8ñ~o˜0£Yr‰ú 2¼Ë˜¥G¸(U)SøšAøTŽÅ;Ãå®û¾ƒfæê6RâìS;2òv ï{¥þ*Ÿqù ZÂÿ¶åò!éãx»fÀ?ýõóú±¼¾~ýúï×öÞWÍ‹êV·§õ²h²ßà­Ä(ð‹ÆÃ¶x]ÛNŠÜÙÅÓ§8µ²®(ê]»{ŒöL# }ô[°EMè¢GU[%óq)ó*hÉð1˜®R´˜˜š±epÜ|I°.ɲé^Žýæ×ìNïV°Z5:ú@°éˆ€ ·’C3s{BQE¶ÎÁeiQ¿}÷Û-¨ôK¶GÖÈÑÇ«J3‹žØ<„w%h vÏ£¯–¶–MP¯­b coΗº’`Æ^%W+ŽA¸FÀqpôÏ•Ÿê6z»ÇËíè>j­ª¶·èÝÝ›L Ò=†#CT6‘qÙo²=–õò@ª²ÅÒá£yøñ:Fj¸g¼ÞÀׇU_¯·t N†æ<Í‘Š”e­ËZ˜{×9 ðhZ*A„Sð–öæöõ&ßk©A&"RU‹Šp2dN†ý]Ÿ­Ä3j2ù§únyãD{“wOiÜ¥ˆwÁO`LÞ1ñIfÖÔ˜– ¨ˆ@RÂJÔÉßí­37¿Q”“8¯”‘g˜s:Ý#C "%©gVò¤ñÎ-œòlæ3ýÜ\Ý͵™‰áD@M—R{oè®*3»å‘áÃß½îpÒgi,“à z¦ŸŸwѯ *p^ê1ŸýL!¨)œ ÑLz! C¢e™1ÏÚÂ=¡ç¿9c× ¦™§ê[rîÁO9€ ~1ΪY¼ fò¼ä;¾'þ)ÓFx޳øww—˜ÌOóNdšÆäÉëK ÊÁ!D2ò®>%4±ïÁý§ÚþÃe«Þ¿ÝZöxì*ÉÌá=ººËâP«Š{@µ<‰|„[¿~}ôiy3ÁÀ¸­Ì\/$ÚÌ»_p\0ˆãzKdÚ.‚X‚•o—ý·^Ư²ÿ¹úŸž®âÓ#¿Dùß¿Ýöïñ:´JlhK¦GTÊGS#¾÷~kTå¥.«îML2cÎ8Eò8™q÷À"òüºÌH×ùâ.“ítš×ΛÀ®9Ïœ‚æ©l χi.UTÅL><>Û/~=†{ˆˆ’K‘ZÏx¼ˆŠfYøhˆLBsÀ½÷Ã83×—Åð¸ú|é[ýüééÇRn·£wß÷Ý®×}]qyØ.—™îÞÛÈÜ=\•ªbV.ÛÆŸtÛöëív´¦SsgK;ü8Ff˜ÒªiÑ?ÿúX5 Yª™B-§d›&©–4#µ¦•zÙ¶m])L8’‘c¤ˆ•R게ˆÖGïcocø+AUY·åãǧ…òzÝŸ¿?÷1ž><>>\˜<ööúrx©ÅLÜû±OD&3 µ”^óÚZá~}~>Þ9ZxJvpŒ¢Q-"Ž>˜YzÔèEYIÇ€Wͼ½½¹‰j1G{(ö´ÆÛëžcϬ. Q =‚ŽÌTºj¡¬È2¦ç!1c¾_ƒz ~Ë·ÛQÔ׺>®e­±Ôúô¸‚¼Ýö·ëÞ&ìœbj¦%ÃGûáo·qÛGBF5uDf¸-÷ƒŽBµ;v@X}i3}#€2ßÑy÷¶Ìî}2>cowAΑO8>1<ýG?Š´‡m{¼¬"ýíº{ ³N0¥¼›Ég©r²>N æ`øäùJhDÍæ¶P?ðü§‘Ýóºý1YQ3Bª6g”s*{7£œYí»¡ëDý¡µO%î¥ù|=¡=ï;Wæ ‚ŸZð$¡Hø·Ýo ‘P†šI1˜P™‚™x\¾£Þ÷²wçã»y0%…‰>"ܱhò/ûkûúôóS¹üüéŸê¯¿üº¹¿~ùú/ÿÖ¾u'ë_Ÿ>þðëóöaY·ç׿ïÏÿ&ãøy³_·íãÓ‡4^¯:n/Ò½07E1ˆ™ªÌŸeÀ8<$¼ÈD`3i×·ãx ëR±K -bswï»f~xÚJ±h×2F±žªAÕ d©Z+ÊÜKï5“šöð`¦#ÚEúÂãµõc@–u[ªIŠï‹Y÷#\KW €ÑKÈHÀ„ôÈç×ãÛ÷q45H0?æ;Pæ¸rö½ÓÑD33c´gu#bJ=¨ån|ž»Ã9ë”HA¦Ó™9.³~7ë0g4S€¢TMSR°7 —HNŒVÌ×UÌÁt¶á>€‰dd?Z¦ÀLÁPÀÄDeä\ÌL¬˜iŽP¨ÀòýÕ>7Ë‘)UT'úü¤¯§#F¢ξNo4&½—Š Ls#GóŒ,Fè$mÍ­ÃSFb˜ªÐ†góe– –eUå~ÛÓÝTmÈíc” kȆjëOOË÷ýo¿·ß~o½Çjö ãÇ%Ú‘#‘ZL4ÐÈN•ZÕJÉd24=Ðzì=‚mo< h5Ï{ǵUãRP$*³è,…%>]2ýûëííֺςQ‰Ð¹ô7)"á¾ïcS}k_›Çn!k`M˜äðô>†d ,!3 ØÅ_cÜm.\C¬E¶ì—…Ÿ><|þ°n‹~ú°ýòù¢ϯ·¯ßßn·æA‚Å´ŽÑo×áGE“¢ZJ¤ûè}Ϋ à, Nˆ•ŽYò$îûÖ™«Qž3b¢B2¦Øúμ»C™ªHž5J’>'0ƒ>¬5bL̈ŒháF©ì Îûrs†è€ÆT•ƒé1Áð!b ñ€ÏÁ$#9—˜Ê3Šéd’2—à*fæÀ¶þÖ0O=Ñ ö|W¤ßŽñî¢|Ïüü×Ì©Þá‰y!Õ=Û·#o]FóA1LÇÉÌÍÌ’ÍÃ÷Ù Ë6‚39O•šÓ~šY«Â–6¸}sÄŸþòá×+ª¿^_¿ò–ö†å¯µüO‹_ä&•öËÏ(Ñ÷— ëÇm©Þ¸¿è¶ÆÏ-"r¿ñˆè}Á#î“ÐÿuÉ{îk²çî XP‹“à’C˜*„êÜ,LÒmÄ”ƒbxD†‡ƒÞ†:j²ÈôjT£çè7µµ ­ñ#}ˆŠM¸ÜiêÍHFdR2-`ó BAÌ]DÞy=§‚› h&21æíé¤ ('þöêãD†s{DaŠZ´±s €d¸g"ÔZÏ£GL5|±R‹Šì·}ŒH@©BŸùjyºvý¯ÿþvÜ~¹|þéñëíÛ5—%vbò¤²yoÏÏßœ¯Vrˆ±-ÔKU R…æžÇUõ矣µÖúèOfÐʑ۱_×ÕYëfV‘±HÅJôcm‡ÓÊÅDIdŒtgøÄO R•¦\—ZŠšåFÃa*jº·¸W¾}»½}‹ñÉêÖé áÑûíõÚu},˼}þ ,eY/Ç[f¸0Ÿ¾rš ÷ÑÆÿOÕ»ýX’ei^ë¶·Ù9Ç/áy©î®îfP 4£Ñ xGHüÇ$Ã<Œæj˜î©©®ÊÊÌ?3Û{­õñ°íx&ïÊP¸¹ÙÞk}ßï'Å$Y‚dp´L¸*Q1ŒÞ¸” ~»¶·•B"eÜA3ÑZ¤;±æ(‹¹ ×¢²3ö%€Ä §ó¨Á°ÜíéïgPaz—I²¸ŽÏå°êai‚uÝE*#½@ûñ§§’11Ç` ½$e:Å`â62aü¯s‡Pè›"÷êä½aŸNˆZù8›šöÈuswG„¨Z)< 0¦dŠRà9n™!Lb h: SÑ=£$L\ €DW eÏôLå‹“Þ—fI46 Êäœ7æ|—ÎÜ¿7F¤LÌpÎnÂ&žÈD¿/Âï3&úÁ‡~¼Ãv²â.µäý{tÿ1ܯhûoGíÝÓ;s~*÷ø  |ïþ1•1/;0x"®`r⎬'m¿-ô–(¾.çE@3I0/Ì!Ö‚(I8˜"ž„–Ç™k)KöVŒNBBGMI÷D0oHf.¥ØØåª¦'ŠNÔ‘SˆTÕIî%E’=@‰‰S(лd%=ŠYñumÛ5J!êÇz˜æ’~kÞK9«¸½µ×¯Ë­Å<×Çf³ŸNz n˜C˜´#;eŒjà¹#@Ƭ„v“ǨŻt<Ï”AÀŽ@ü*:M÷ì%|uf²Â@¨DÑA…%*Ad&\X‹°šZ"vÑÛû¬’‰j1-–¢p7ÚZÛÚV§ZŠÍóTçb ŽÄ²meU=êdÄ<vªET‰Ù™sšTõPk^—L_Ø•"¦I–LJù‘´÷ܶջŠp±ÂÊ,(EN‡ét8PbYˆ9‹Éa. H”\L ÙºûÚúå²8VJ+1àAÄmkÑûÓñpš>m[£ÑŽÉP¡Ó±¾¼@ã &9NI•»2ˆœvÍÉÞG*òöH*U©7éë™3Wêí'¿.}áyþxüøÝËñ‰®¸­ë•ßB–e™êéåáÃDÛúùOh×™è¢Ì¦ „¯ß8Öï"o(ɘl3…›šuøAN‡kœÝe­Ä‰Ø« TOÎFÁÝbµ8;±1MžmiíízÞâ:Àw’:XZ¥ƒKæè[#så*±q@šª“)9‘{‘Dì‰:R•"L6ê÷Ç{Õ|§‘ÈøP‰ÏQÛ JØBæJ¤£8”›Êd"PI‚RÄCÒ ï`ŠápIªÉ¿@_ê=…¼*Y™D²ªÔB*Ú'^a¡ ÒzdÄ]H,•XA:ª‹L…˜‰=áÃ{@¤#:&¹ “щ|¤Uµ˜*È=žéÄwÖóÝ™Ê9è,ìâáîLd¢ã.%,¦„ðÈä’3 q bï®Õj)«òº¶€%UˆŽâ|zù|¾üÿâoÿÑoô?ûNóãÓóK».¾œo¨ÌØÚeõ6ûCbazœò¯?è§ãT«-½÷m£ÂƶµÐ*ŸŸ‰üO?n}E=(*’Ñ Ê"¦¦b€p$˜I«ñ¢,„0¶ª&LOG.½»;#9·ÕDLU2—hÜײ’ m¦þBBÀÏÙ¶¶Š©ˆ$ĪJ*©Ü‰\ÌÃÏáš>ЄÄ\Ì’23ˆS(“„„â¼ùie>ÖcNÞpŠTîd18# E…29¾>NÚÓü§¯í|”Ód¿?ïwù‰ ÎÏHÉš%HD"q I’ÜÝiÿÿÆ@Sahïè=™¥Ö Dd¦1¦¢Ý3Â#Ò{d¸¦–¡øŒ! 2€TÀ’Å3eîÑ3YL2󲬢üĬVÌÔTÍ{ˆHkmÛt®¥”b¢ rwÏ,i¦28†"\ÌŠåÞ¨¶-ZCMD4Áž™”>˄Β¦V‹Z)Ä83:Ou^Ì{Ÿ¦:ÕÂÊ¢â=ÃÊKÁÁ2q¹m­õuÝê\DDÙJ™#cÝÚr[ŸO§‡ÓéxŒÌˆˆÈd‘Rl:̧Ûz>_oË¢&µÖV¢·Ë¶.˶¶,ßLÓ§—ççÇãåü&`"}»®·¥± QžNóÃñ·UèøñI^ßÚïéí|ëÌâžmÛ<ŒTHÀ ª&Ìâ¡-’ ØW¡ä½¶Ÿ¼WyÆÙ.IÙ"C¨NøÍóó©>å–²4Z–ÝL°,Ûõz-ÛæF˧—‰¤¶×ëá§ÃlfZ8u>©Î‡cxfçÞè|Ý–Õ9S€¢¢ÊqP%'Úy/ÓÞŸû4ÿ®%…ø¹Ÿ¢é]ØBÂÃ%³§¤ÇôPJi ìæ¶b8L\Œ²5Z7o}À˰Qˆ"‚¦:U gÆ¡Hwlm»mCBÌ"8ôtªS1!€ œu¨ Æ;myïÚæ»kwöÈ®/̯.4ù‹á÷îíºS˜ÇËõ~O'¡Jdï¾®Þ:E† a¯Ž @‘äc(+IJÞ™ˆ…EõHt7ÖÒþSyç@rÁ aÉǯOÔVãV'ù«?ÿôíwß?ðúï^¸^Ö?ãó ª§O'^—­&L¨­«#EØŠ±JdPï*i ¶»ÙwØÑ ?Фh _7o Qð<)‹0‹O ‹¤ˆ¡¤HL«ˆ¥SF2±8¶4R«ÉèëíÖÖKö–¨=°ÌÜ®¨)‘8* Õ`MäÎÊQÔ=3¥“î! JD|ßO*§óN‡:!‰•¥Þ+ïˆ ¦4eDF$q2¹ €Æc%<4· °$IAûeàBE„UXМf"‚(ŸNÓ\€ŒóU«j“ã`÷ÌôÉ2vG $òýÇÃCÿç"΢»9pÇñó]`ã}å¬JŔȠhÃÆ¬wX­0«Ü«ƒ"ivªr1Vgq† ›ªÀ)¾Å“ãÃã‘[ó y—;1qŽ_ß–ý¿þþ/>•Çü7ßÿų¿þôóÄIÒB‚Jn.^fT-„¨€{R‹”‰ubO“`$ØÙ†ŠÇ§2#d]¶ìTªÖÃQ-™àÑ’¾ ÞŠ8¹¤S©“êäÈè.ºg´™y²RT3’<«NVF¢>8î”4jp‰dæLkíÚ¶ÍÌEm¶)Ë$ó×ËÛ­ý)µJa´ˆÓ¡ú“¾~ùz볊©(3a¡t•-Q–Îhè™=ÆOéNJ‘2×øñó²6¨&fô-dc6N!”¡~)$ŠÜ¿Ä$*øÕ.l¼‰Á’»Òo§•Ñ{B<‰0J+¹šîþ¾ÿg9’ü#ÿ+w1 ß¡)÷ã …)‡pžáÃØÅ$¬¹OnÞÙ;(öÐ5É‚R¥'U5³RŒÌ%Çt–ÉŠ2—Dg!›É^ÍKƒtV‚ üï  Ó}€‰ €yßë»IÍ Íñ˜=a ŒþãÖ%"Ç¿1"[™ˆ[6Ä™ JÌUfajÉÍ#b$ßIãŠ"»æþžå÷Uæà„‚Àž‘E"ï8Q9Aw5ò˜ŽùøÎÜç›(s?”AP¶ðíöá¨ÿäû§ÿüÏù?®›]nç¶j”SµoJn„¡…ZÝ·î1@ ¢Ç3›4pN‚g%'ºä·”©ˆVf&8¥Àеu‹õ¢ÙfbeŒg"É!],´®l ¡ƒM×IøÄÐܶe£É6–æ½±§ùáå›§C¾öÖ·WÞ'~: Ñ¦-¦ƒdT°†A}\m=bPí’µ}wA"Š½Î¡»1l°±;È…"yQÄXÿ€Uk)“¥@3=Xyª¥{Ýz_7_¶õvK "1±±ßÓz$³Œ™ª©*ZQµ df¬­Ûº™E„›ª_L3%¢um€ƙҙ=Hu_Çk"IE¦©j±fï-ZgbUeåZóuimså0cI2iTÏ"{ë½·Óqzz~@’íé*VL)#G$v µÎðôÌÛºmmc–js-SzoÞ"‚žÌ”ùõV­Z¦Rg33•mk­eôÇ ¹ó×Ëxµ2¿<Ÿ• Á¬bÜ»·IÊuÝÖuY—%ÃÍjo-|ÊÓ¡Ôb­Éùš›çØç“R”Y($# k1a |íOD$2 ‰Û4ÂTËIØÏG{x˜U`gG´fÈÑ»o™.Ÿ?Qº^®S©Ç¯çõóçW"«ÖYÍ=³¡³[·Þx&S$rðk‡»"e$;î0kbf`\ˆ1 ºˆ1)cÒ÷íäΕàQYÊ÷8ÛxU‘È^˜A²ˆ+gžªs1*Šëk[9ƒ¹îB.‘H‰NLYMJááõ-fæéÑbƒç˜S²uÄ¡ê\¤„’ÊÄ»*e°ìbXçîb”ûÙžîùz÷½ÄXè—¦À±Ì÷‘ÿûð=Á/2@ï ï½µ7ºWxGËž¸3Çžº÷À²ERê`[™‘Ê~ï]¤œ"T 2¬Tœª$Éè×õâ~:f8²Í•&üÕ Ûáåo!?¯?µ|mîß}züøñåõÇßÿôóç?›u"í[g‘:WS)AGooÿ;îù^!.DA’D[ÐÚ<¼Kºò Ê¡èÇYeð$sn êÃeiÕ*%Èœif¸Gïð– Ö¢"Þáá äÖùþÀ˜UÝ—[ï.•͘gІ ‘fëH'¡i²ˆŠ±Šš (;š&âBþ釫•¢ÑÕÙ·ÔiúíÇOzô2kœâKúÕWâ¹N"ªÊÏ3²oÛ ìU䍯¢§‡Úz®×[[Û Çãé ªž„ì†D÷eËæE¦Bª­§G(¡ÎSÒ¢%B±£·VE‹Ž%jIEt{»}þ²ÔC³Rš$¤UmÎÄë—Ï&ñí§§C)¡^™>>ÖëÇÃÑ{fôá'€±'w°rKjÉš”‘LLbAV‹ÎSQIáv8>Ì~üáúÓùìisÕ@ã`ÂO/T¬ÔR‰­ƒ3Ëdfª Á±;"¥á7DŒW¿ÊÇQ?‡¤„ß{÷1ë`îôÐñàÙ çžÚõîçö¡ÍY{ „i']Þ<#}?ßc¼-Ç@;)ƒ)ïâ[Á>¢*ãÀ˜¾²ªª™wl. JéÊTÍ̤û¸ˆ3§ª3ëHÆPë™J¤&ÂŒ€g bcäÔ³ cžD›÷£­{ÇÇíZ°w鼦öŽˆ °ƒ%“¬Þëƒ5™ûŽ=!4&\ „P²Ä@!ƒlÐ@#E7Vg¥Ìšmö›ôsáíûÓÓ|ú¶Ä?}h¿¥~ØÎÈx*¢U^Ji”š¸eÜ_i[’€IÔ*aB«Ýó ÔòP¬T6$É8Iƒ©þ¦ÊIpÍÛÅ2“Yº³ 0§˜VJ Pú&T•DD…D’ P‡…ÚV,T-ù1ä µƒ~,ÙœDÒô¾D«>>=œh;•¶ðözâþg³ã¨7xÏC6 ®Ì•™ÕöèÙà}ð_‚Htt3s,oö¬ÄЫð˜2„1þ(A˜Œ“(8ƒeƒ¸ ™éÌ*BI% ¤¢DìÀÛÒ.íõuk­å¥õ€šÒÁT˜¥A¸Kdß5xVµÔÉà ªÓÌÂ.LááQÍlšË4MÇ㱋îçóÕ=ŸŸ§™yª÷‘±µmó¢ZK­Åäá!*VŒU{÷Ëùz»®­ûÚzs÷Ñ}ÛÜ‘¢d6-KÌ“?=¦Z{ë×e ÷RË4MZâ¤ÂŠæ„ˆ9ªÞc]n"]LÝÛ×7ÿüå2M“™–ÂOO‡—çÓ\k&@Â"S)üpÚ¬¼úe]nëvf±ééÇŸ¿þþ?»ù›ÓQM¥G¾ž×øáí¶Œ<¸›¢Fft_.·v¹H…ùåé å0½n?>¯›³Œñ\ޏnš&{~°¹ZïmYûÖ°l¾­½ÊPN“>u>V&n[û㟶±uëÉ–!éÀ”Žót:Ô©hüüu5Ë֤̼ö”¥1a¹][ˆh[_[ÄhÐz õˆ¬…!caͦ¡@Pj¦0“"ŠðÌ.1§ßKÃ;S™)…ïkabíç}*”=3Ò‰ &6vTØ;íM⌸ߡ5Q L.Ëš„œ J5=j oÛ𳔞ܯ±Ü¶Ó,GÊ]ÀʲŠ8€LwÊÜ… ÷â[î_˜w,Þ¯@ï¡Iº7öÝ3Ó/јðÚûqúɃ@÷xåýÖ!Cw¯#}ÂI´%ùJ©‚bD“H5Ò}V&Bˆ ØÒ)C„×Ö¿\óS<0kxL”åòsþ¸>þ³ÿêÿÿÍÛ¯ÿð/ÿÅO÷÷ß|ûÍéñô»ßýÛÏ?ý|xy<ÈA@E„I‘‘jZLÇJc1˜û&™ˆ9À­5ïq(üñX—È-G҅3Iå­ÛÚ“‘éÃ$³G‘6®V¹ 7È©¼·µJ).…lŽîk_ÌB 1…‚EŒÙÎEG&T¨ˆßȯ;/Yóq>ÙÖ;º§S„ŒDö£òýÆ7˜…J`$2“øNÊ#6bxvÂP 3˜»r/’µ³-=»ƒ™Ueüà´‰N$¢£4MLÌAALZTDAÑá¤"IämÝà1>Èäéν‹;"ÇSò~V0KÓ¤DOIˆJ’À32 Õã¼F(÷§Ïrð&àLîч‚‰tÌàRfå}C²ƒ©DRÆF›-‘-ѦVk­•3:‘›±±uO÷Ldë>Ìñ*?®ñÓ—õǟϷ͇÷ùXUéé?}ýïÿ—û×þýý_þÍó‡OÏO¼qö‹_3~óqþ³Ã|ÙÖÞ¯„KÄÖ³ˆMÂe[{¶þp˜j•Lâ”™ê0  ›æíHÑ<–[Ï(‡" R©µ*¦vÓóåõ¶me’c±}ù‰ž•ÕT«qÍdß.×î+U•ªJy0ƒL-Øb]Vþùk¼]¯6]êa=žÐû¶5¿\7÷~˜ê˜ô¶™µ\×¥LåÃóñ²úç·îNšQ*æ‰Æ³'*žáÉðžî¦…kI)v˜ÙxeîÇc9¾|ÔË´Ä—æiSÖ¡ZL9U™¦z<Ô,‰€`˜ÞÑ·ƒ÷?Þj;Ê\x@åå ‰8öä}ÖO¸“.Y…Ívù[Æ © @옻PA‘ûËSu?ŸÜºL ÐLªÂ¥ÇÖcó„Ý#¢3:S€Fì°0+„ÔÇŽ’b1Ö£{²ˆc=pQÕ_˪CÁ©JÂdJ‘ÔÓ9ÜLs1ѶÅmm«÷@!™À5@d9-³ogO7paQ±ýƒ F&qsÍš±ñ#F5:LL—-Þ®ð¤ª\Œª‘ØèØ3{0PÕ`F›÷p@À•¹ìž/ìÁŸd|‘wÝý"€_(×ûçiÇïsrÜ­ŸÂJ@äΦçE±{ ³×ùáP_lýNó„~2þ«ïžÿƒ—Ó|þééüƒ¾®Wéföá4?&iLƤB]hQ:¦|Ýr¥d‚rVò*®ó0®&"’6$AI T«>Uy"¼.›÷X$ º%¤c•jR’Õ¤¶²9¨ªÁ“‰¡¢iT”ÈÖa—è×Þ2CUŠNbUæ²µí|[ß`•KÐxѵíXñÛ‡|,å’õìåmå·µ¯žbµNU„Ý{ôLô{¢K‡ð‡‘”HŒ¤4[ñøiäž-îR`¨˜)=rv-P"wS§ÊQÌ3Ó©Úâ?[£ë×µ-ýf–Ïò ÅL… Ê½{²@U­N¢EMJÛ8ÕRÊ‘îîáJc§Ó,"Eµ–Ú“û¶¬·Û4Ùñ4Õj‘¼m}[#=•Í#¶ÖrðÄÂ4•"µF8‰š¨ÖRæZû“o­/k»Þ–óÛõÒn˺®­—Éj­ÛÆ·[ÌsŸ§ÊL뺞¯W"™çyžk­ªjó¤Iœ }3BhÛ¶ÈÓ„{ëÀ*r#"3zYŽþx<Œ!´° õ§ˆªQ^Ìõ¸µ§ËeûüåÍLŸ?<ÔIß.Ûÿó÷?ÿî÷çîED™¶ç“~ÿÝãÃüuo—mKiÝš­…ç¹L“®Û†¤ZÊéd™Þ6È\¨j¹I?Í|˜Ë¡•e¶Ö³uZ×O!Z³-Íq¾ÑuOŠ©8 ¨p<ØË‡i*S #ݦöøð([Û„É{n«{À#˜*Ø’c4¢2©‡‚„ƒ”#ªJ²+FóN‹HÜ¡qÌäAôÍa¬º'iö˜ú~Š~O¬àR¼ë Y™ºg&©ª(2ƒ)ö±’(uD•ÙÊD÷Pƒ5ÕZíÈÆm們+²!ùédS•{-™hÈ\#½eé8—íY¾w³ÁÎí¿oMù~æ`•¤ç¢Î¤<ôÓÌÌÐUbŽ{áFÞYÔD@zî,ÈÑÜ_»;*dÏ•èH#ØÓ{&k'#IdW–Ã\·ŽËm]ÛvY·ÍûËsýôüeþݾ^¯ëuñ1_Êbssþ7ÿó÷?þoùÛçxz:Ã…[ߎjˆå-¶W_¯ÄÍ ÊÔh#~Ò¡¼™i©Eâ¾rB¤K\§b?<(ôüåÚÖ¥1[pMy97ûÃׯËM§užišÄÁXsÝC0mY§Z ”Ùs¸ùXFQ&È3Њ"bR­>´Ëze›’jwl[_×Ûºµm럧2W3ÓÖÉ“¶¤··K"Y' !E1”¢ÅD•=VÑØ|½"z­³LGâRTTÝxc%›D­$i!\Ñ„8RAÖ±Ña¨„ ±§P$eò~DÜ‘l*1 ­Ã³»{¾îûÀ³üÜÝ´üÞ~JìNkæabÙè㉠¨]6!¼Ãd±SC <`k˜SXUÉ„zpOÞ:(=E`„’ íTC¼g41|›†äÖWÍT˜dÜLd*R‹Ž(³P*ÅXz‰*˜’2Ò=Á0c+6—¡kU)¡IÑbÄš°  ŽP¢J<­I9Pz»è€á*i2Tñ˜g=„™š'Á‰ÈJ=ÌRTÀ,ñ¤Hp “pf&TXæQïáé¼CKƒiø7iÿ¢/FÞÕÁòŽé`Ÿñ˾ÿÇ u˜S!4ñ&ƒ•^Ћ}Д‰óÍôçó÷¿9>–þLë ^A?Q|±€«q)Séko,háÃTªÎÌ•ýˆ5C«˜hÉœ‰«GxF˜É¤D5EU¹ROó°¼ _ÚuõNrÔib1¤ M“$IÊìÏRLÒ뤇Âçž1—R¶ÌBÁà-¥ ›é|8SOêØ”%3£7q—ŒØ®ÌíyÒcÍËJ‡WŸÿx‘/«lÎ@RJQŠ‘ØKö¶—Òs^$üŽ)¿çÞ Ù¹ë•”à‰NUaFïKzQSSea+¬UЗçù›“ ò0 +GR!QQ©V<({™”„j"wW±Ã<1Sk[„R¢oÍž½w ˆj-%ë¶ÞnWâÃÿˆp09ú( ™ª‘÷~ËdpDd$§Ži-ešJ­å0OóT8=°~:ó?|µ·.“x ßVo>–òî4 l¤²7¸…‡èBT˜XØvíÝÞú©²³²SŸŒçI3ÜwqTR8‹`ªjÅ´@tÔw‘Z"ˆ!E<ÁBD€wß‚À*jÂÙ[^×Çd)„Ùǯä{ð±e"JÈDßçP*‰ap¦y©#¤8aDùǰu²„x€wé#ƒ£í˲o›ö_uÎ y_ßÅ€cX‹ä %b¤·îSáZŒ’™ÈT‰imâk®­'áp¨g•ùË×Euä%4 IÎbÓTûrû¿þïßÿÏÏíŸÿ“o ˆ;´Ÿž¦‰r]nËrIŽÓcª!rkáÞ„0Ïz8=h))I€7¦­VµªHYJ-e®aÆ`]Úôe­÷EþÝ×ǧO/ëi~­äé—µ«”ZDzˆx± î½sµ¤Ú¢·–[r‹(ÙëD…ëhpŠÎÏŸž?¼Ìs1°zœUˆ3üz]×Ö›Gëþ岯«h'6¦f–*23«ÄÜ” ­¾ÓDïL6L¢Cñ»vwtfþxšO¨º´èM²Nª…X‰‚)E U™¤õhI+q!ˆúóÁ¬ZýÚÞhe%bwqŸ¥„ê5|#R¢èèxJ!ãŽIFj*ͪ“ ×¼Š ÕF/üòùb?ÿ¸¬ÇÓ4U޶m[†€ ¸=3AlLã«8Žï*¥w¼ÄPJ€)3à R†¶mÝ6›§YtUa²ÂV$áBþéÉô//…‰§i–ÖœÁv°RXEÜ#ì͇A 8)Æë/ÂD532Ó#ìåùiY÷Èt&®“ ÈÛm!p*Q5¢àm3«¥&rk½­Í»·­»‡ªÔjff¦µX)¥{8NéÂr:=,ë¶l­õ<_n·¶MþÝwO¥åõËu»y4xϧ8=j-ȹµ¾­èÄZŠˆ€E’*EÔLÈŽ…Z‹­F©¦ÊZ¶í|¾õbrwQqO_¯R‡ÙZ+çÛz[/·5>Y.7×< ÐÚz‹õ|Û^¯q¹ôÞRÈn)×Õë­ÍUAÚÓ2#‚‡Ã7Oõ2ÛO_n×mÃeŲ%¸‰$³/£,7NPKÕZD”WÍÞ+‹“P’Rpa¼<òoÿìé»og¹\Â=zsoMx*f¥­Åt¾l×e[¶Øz„s7#%1Ç9Ýs~³J¾p’ fÐ(„&íÑMÛ>C\‡ ½ £Dã&>*/;.÷R ˆmd °WÌr\JµiÖÈFLY‹Ì…‰Íè¥ða.Lܶ±c ‰R*š)ÒéƒÄ"ÑSÀÆã;G '(u'‰îΙ!ãàÿþ+¦)ýÂVþÌ"÷-Ç{ô{WŠî¹ µˆe‹ÒC3HYIuO]ŽÚ–ŒY?ˆdǨýº8…Ô¢"B{ésÇGA-W”—õUJ§e[y¹|¬öôøéÑ(} ôZ§Ã¤ ÝRV÷7%Ó1uçQ[QfV1bÑ=ŸD›;TØÙºL4憬€"2²S²Y·¾µìƒ- ¬¯·¡ÑåR@kØ–æ?|:|ûýññyëÛÂÚÍT„();±)õ™ã`ZµB¦/ëñÿý xc5Ól°LªÌ¬Äé¹!À´û5YâueÖ‰¸ì¼?¢ÈûÐ~ÿ2qe)¤„l™û.dÈv¢ºHšÉT«íYÛ½?-áPƒ&e€¼4º®Ý‘¦T8=3’=ÁÝM¤¹%Xe”|ãL!ã$ûc,£´ÃLTI¼{ŸÄÓÑÞždÿ„ûîK‡BDÁ!Ù}a™Š±BAŠ&;$ QS«ôkSBöt$†ÙÝ=[ËZ§ÓqY|Y×V"MFÀˆDXæéøzþñÿÛ¿û³ïÊßüÅÇËöuÝnÇRðF)•Mتy¬½·hÛTp˜ŽOêÄmuGgjTZ±<>-¼—˹mÍꤜäp¦©cúÝoÿçy.ßæÇééà±|Y×¥‚¿„9ăÃÛ¶6€G±”<ÌÝU¨{[z£©–LJùt*‡c©ÆLÇ©-“;eàüv}}»^·lÑYȓ׮±eÑ4Éj9;grßæY?íÄëÅ‹UI•4E¦Ÿ×EzØaqü|yý\اã‘ê䔜àF"MºŒñ³™ÔI…¥woÛFB¢™ ¨h’’s`6“rœÏIÆ×âNŒa‘çÔû}Æø‹¶„w -ÿRÝUUV’ñí¼Ñ¼«kG3 y所YÔˆ“ƒ3BD(ÆÐDI÷põ°¾6B"¨5Éf.:ĦGO©Gl-2ÈTulèH,±nÎã’B0¤ö-û’d,"±õèî‰LÊät&I§%ÞÏÖ`lL!è ¿gp”EU‰¥Zäp¨£WïÁx-RŠçRÍö¯q*”´sñÌØGUHÞ—âÂ),9^þün±Lâá«qFì ÐwäÝm ß%!‘=³¹¯dòøøT( åCñß| ç¹>«}Rÿ(×)ÎÒbÛèËÛíO‘õq~á–· ËtL â„n(7’•Ä¥2ÛÛ¥mÜûÒ©qÍyF58³ûê Ùª›Š²1z2™`æh [‹i"§ÉªòËÁ xõ­/‹–Ä=ÌT«•YYÚ²-ËÖ#gäcáÉøÈèÈ ÷¾µ™ª,*!rËÈ뵯MÖíÐÝ‘œù’\¨„NÂ"kJ]g\8ÎÓúxš9ç/¹ö­Ä$už&ï±ó’GqÂ9¸Mº#)wêÓ>ûç_¦;¨U@%A­÷eÍóµÕiáb6ŸŽ¥ª’« '&ãéÁ¾{xTy€ð²åç×õë×µmy˜ÔJ5SŠHpzd‹”Z™ Zj-uÇK±LÍüÿ¨z³I’,Mïl"¢jfî‘K­Ýœ²òø.oø¼æŠä ˆ&»«»«²2cqw3S9/D-²È›ÌDd"<ÌTEÎùÿïƒHó²æ1Æ ŠLŽ™ŽnÝÅ ñ;®ñsTD á‘êîá€`óõo¦Í ²"3.ëz¢‹ùõvûüõ}Œ=<ïwüò•¤”ËóYNç³*Üß÷ëmóðîãÞ·ÓÚ˜ aeÄd>iPõÃî qèÌcú0Õ"`šªº µÛ½¿ßFA¢H ˆ"e˜‡ga¾, æ}êúö±þ¢zÝû¶G8Ÿ×"àý{Œ1÷ßÈñ~ÓOŸî3YˆJ‚¦§¨y1¦£y!ÆZ2†£#CV">·|®Fè@>¿× |YË~sùÝoOË*×ë¾íûëë}¨"DfÁ]™USÍ?}ݾ¼Þ¹Ha$ˆ0í„pZ"¹zï3¦9~ì@‘„DtØÆsÎŽGJ ÌwÀÄßÌ™í×ä$H¸ãQÿ8[?J·ÂcZŽùÅÌ„( –RN+d‘ð!o•–R<’weAf´¡Ô!Â@ RfÃÀR  %ÒPÜö¨5&4"-@‡D’¤düuîôÍ  ÿ£>ðÈîĈo÷‚üÛÊ\’Dα Ouã£G{Ðàñë#é€ì< ¬)Áˆ<“÷ž@DÇ?˜•·ÈÀ0UBD£À¥ÐÚäË×±÷íõ©¿}É?ÿ -7½µn¶/1á‰82n~2_Ò 3")",-“§À˜Ù1БÐß̇Yñ–ÔÖå2,Ãc¿…ð<í%Ý ;N#Ë1¼;F)UXÈÌÕ!ÍbN–~VÌŠ–£[¡Ó;dh!•Rà =}„‚-ŒÁPÛùÇ7{úçŸÆŸ>ãåR(ø´,˜D2öÚ5¨>êsZƉ’ô­öñkæaòü€‚xb­4¢‘RAl^,’DÃål½‡[̪{D‚rf†¦«{䮾´HAå ÄLÀùhff¢#ŸKÈ2ÿãs…1QLÇÛå‘aãLÊ$@ DDFvÈÀt˜QjÈN GšM7ÑGn IDAT™ÈDžcÅœ¶¥ƒÛH½õ·üÁtœ=Išw&&`JD€ ¦#^ ±.RÊ‹™½yÿó_>‚9܇Ù|N@’Í’4¤H£þåõþ—wù#¿Ð)Š„m÷êéÂ¥¢ pT!,Ûå‚—§-¡êDÉ„„•*c¸avŠ^¹”zf\†fOò YáéœꎾAB„¨9"­+0 –@ÙGÚè®3Í9’… ³5ŠÐq} ížYNK[2¥0ÖRè|òH‰$Uß»&~Í÷Í®;~üðÔV~{£7Ím$ÄœL¾¶rªÈC ¢Ô ,„ሑ°$$dþv»^o[’yz2àô·Eå€tˆDóHÓ1”‰ÛÙG.K=-‹iÝ8’ÉI ƒ ÿ}&fòý!€ ãî‰Ó/‹IÓߨ6ófšx±Þln˜'‡Ðc¾MŽ´ÑÌ[&C#&¢ðc 㣇fLZÖð·c°>‘Qd F¢ۻ߻ëHH,Bnàž¥¢>*Ø€iLdÄ’°õ$ôž·} B+y|ÝTiÏP"hŒ³Ö „"¥V€p‚R$÷nª6¹´µÖV©LòÉÃÑ;EÉDP9Èb^©Ôr@&€%N=Ó±f?¶ï™³¶1'Œ4d‡êÒ1]] BîèûEì?~ÿôR /õ úÛøøÔhÄý/ÿö¶zæé7§mp8ýËýþ™íTp=Ÿ(D‡ÖŒ5{V¯ÒŒ„dÙ͆9ª'²¶•O—,ìÕmxTrfÄts Œ´ô ƒˆ‘×ü6ôuè*¶Ôz®eôxë›ÞÛ›Wf ‚t!°ÔZOR`¸Ã¦P…îÑW©ÄE¥HÆû®ãý–H'3pB\)eÁ’}è½["—VŒ}+®Øñ¤N"›´Àž‚Pˆ±°Ì53bq#;”µŠ,ö`ÄaÏgt¢Dpˈ¸÷ŒW»ímƒaò‡ß–çKeBÈÂZ1À(¡5F¦JZÈ}Ž`nšˆî3¶€éæá³éÅRjŒH$bÄ`¡ºa¦•—RDUÍÂ<ûP³@ÄðcL¾&@²H)ÜÌÔˆ9˜¨–BHvôE¦A ÀÝÍÌÔ‰jÅVPQ+ž¿|zûüvcfa^—šÛÖ»GÞöûv¯…[=!JI᥈ð´ÎgL?ŽGïCMRŠH’ªº›ªÔV–emµ½¿]o_¾¾o›¾ßưHTDb,ŒÏçòrYÔâzÛ·nfàž}¿»3F¤ ¬+?ZÚ‡^7¸ïÐ-52)1ñz×úç_~ù…žÎÔA¤éef>]Áä°*Ì‚…`€âpî» úo?¬øñù|NK @¢¶Ôº6Z&Æ­ÛûU¯·ýzÛ̓‰<â¾oî©æ™‰·M÷ž­ÂrZZåÑï{ßH¸"WµpH!ˆŒI³ÁßÄYJ™¹âÉtÀ

ÂA“™%ÌšÀÌ»{…zý×’ÀüGnAˆEèéÌË"}¨H’,±0'øÞ÷ëÆæ•€,'[ ç©!AâðhNÂHcŒ··½5?­R »[W·˜]¶¹ ˆ„¹MŽ€‡ÙÒ”ÉçÏ#çôðÑäcðèó`þL=g™X[aF`O0WH”£ò“²Ÿð-Ü?ß|HI-@zôìƒJ.!ÜÒ‰ˆY&Q>ÌA5X ‹p"Úýþ^¨þãÿðß÷áö§ÿrGi²ú~{ÚÏ kªwÕ ä|ßËÇU"B0@HôÉH,†ah¡®¯¦¾o_ïÛÒÚ÷—§ï.ïÛ~ÙÞ5‰  Ræ¨Þ=Ù–JÞí¶edYjM·¤¤êAn–f Ɖ²&&¦›þò' "à"3z¬Ãà Ó(ƒ¨BPäs½ü~;ÿtý|°4.µÖ„VK)¬nŒ‘áÝz2ËÁ¯}\äq²ròdäPrKf@ò@lµ0K8šZf éJˆRBÍÃC„…çÅ8™P1T­«‡D‚ 0OÌ .,,„€H b!÷cД逖ߠµ$8)ì3½‘ÂgÕxžâ)`v#AàÔäÀ˜&ÒÑëDˆ)uH/‚µQ©4~Œéá>5–,R¥,m1µ··¯ÿ÷ÿùOýéËË?Ž™jƒYþ¡‰ÇYq–÷\z?Ýó»ßýî;]î¯?›¢—JD˜™R—çËr¢Ñxai~:)3%×9½w{¿Û¦¹Vüñ»ÕCiQìjÛï(¿ûMêéoñ¾½U.u͘9oN¨즄å´P¸ù®ÉDRjpEO³1T1!›P‘„ÔÞ{ßµ²´R`D„ÇóËåÚøáûï~þôú×_~QÓ¶\,ÛO}ûé¯_t°Ûæw½/,PTÁ‰j)…82Í 2Û‡—ó¹-êõýçûÛ7/9ÒÀ<%“c)PÐa †ÓÒÇèÛf‰ &\qIª¾ Ûº‰dᨋxáGåiJ3p~^bÎyèàIç œÌàâLE>Nú€ŒÄ0}¶Ó!v–c²'°Ð,Ä'$}Ã2#b&H̰Œ0CÆ@Ò}˜k¸Or8ˆò4E f¤ØlŒÁ0G´LB P0µÛÖמžë‡çóRëû[ßîž1ãn™HHEݶá'â& &f¤{`8è4@ ‚šYhEi¥BÑ|Ä3JÁV¥A°g ÏûÞ÷ÝÂó´Ð¥ÈR%§`}þhãÿG05™‰˜'282‡>þ x,ÁçòÑ#‚$ A0 !$ë9é0Â8ð¡{«ýÃYÿ›ýüñýc¡{^·×/þUßnì–÷ë¨~-È(T¨´¯¯Ñ›Ãzrß0T0N­6®P8,Â-Yðé»ÄtO$)§Ùú¾#ô‹P)6̆XòÂø½1=_^Ö×_¾\÷÷µàjºHJ[¿½¦°å|a–Le­) ›¬@o_¯yëÂD«  (P€ "3!*` !ǶF‚ëH÷ØÓ Ãjö’ò åeýðÅùCWR¨­“¹Í™QbR†ƒc&ÂüøO×)Ìq&LªåÌ\«£nò¶Áç×ëõÚb­?Nú‰ Þïf¯†‹Ð¹ñé7—»Îy´ŽMuþ<˜‚ñ~ß³6Y–B ‘ˆœˆžžRHjaD”$¶ÈÞ§Š>™™xVåBÍ#@¦â…Ò#Üœ"‰ ‰ V†D7Ÿ2),ÌÌójç12 ˆ¢56/Ø gÂí>ºa.¥ˆ°š{"[rvíÛ¸¡11/­ÐÓº\–e]0"TC‡M»ýÄèMV.š…ª_Χ§óéétZ–…°Ü·è`WϘ²RjÚk£——'–vßä¾ù¾ÇíÞ÷=ˆá´®­6˜îøÂq¾œË—÷øòn¡Ž˜Â„)ï·~½ë‡Îß}\jeS H S°¬­È¡Ì’"К'ê÷înëËÇ%ÀIÊR×Âä>îûþv·¯oöúÞ‡F‚hä¦A# sDÜ7£}X"Ð}lP5ÒBÀ ¡`àtâ" 'Ò´ÍÓílVå!+ ž9¶|tYá,Jö‚‰àD<ôðGsñQ™þ·#“šžŽ&L­ÔÖ¨n™>L‡ÂÞˆ§ &,Ò•Z¥*XÊ[37 `ÀâºÛ°Â²©îû°d&!¤É¨Í¤d  ž¿“yO…‡8‰U:[é<¾·‡üÑý=æ¢GÉ!3@˜9’B#Óaq)  ýJM‡ÜC'8—S{¦ž9F…¨…2[í|©Æ¶Ì­B&ŽaTb‡ÌtßïëÓúßÿý¿9ý_¯ý”Þ@\‚ €YRsæûÞïEZ}Ùzã~nKk”®ó0\¦â€Á°šÝÌÞCn–_w¯c¿´s«ù08¢”d¡Œ XPž‚ÉmL_•p©\dHzTªYŠÝm$y ‘Ôj Ûk2°pb!œÓ·H«20» ³þÄm¹üæn/ÿþ…ÞÆÈ„¥&3¦ ¯ÕJÅÂdUWîD@É3àüàdDâDÜ'2@"Ad†q‚x¨jzETsµ‰çÕ0õh\ Ρçô@§GñÊÈÉŒU„‘]Ó91‰€S%\E²6¤¡17Ò”À’8×®¡qìúgN‘)'Ê##2R ”À2srYhjžb^mAðˆü'cÙ‰úÅü[Rûl†ÍóÑãÎï SÁ“L3¹™‘,R„+ã"Y×¥àå/ýô¯ÿþËU¹dN±ó]Ê„4à,o¶ý×?õÿîïÇ÷~{úØZY›œî_>ExøŽ‚u9=¿”ùóI–§g§C—Ë –ÃFæp×Ð,"ëy ç÷w»>€¡U¿¬±JǾÝïïj8ÆÈ ¥®d-vó1,YS±Õz^(\-îÛm®‚Œ(( %<˜¢HA·¸ÝF-]ËÓ"…zwÕÁDž—¥r[äé\o·ûÞí¶Æ£+bÐ{¿6Ü?®Þ÷®=›¬Ë²HË M]Ó}ØÚâãÓi•õ/ŸÆÛ=·<ß“Ó ‘ aAá,ì€3ƒÏX˜|8hLy„™#áóIJƒ23íG|9F|[õ˜kü)”Èç8ú8éÏ`L ó\Ud¤¹'¤åAGŸ` žÓ’˜'ãó™<‚BÌ "‰äi‹½0ˆHtrƒcó ŽHÕ±&WdÂ@÷°®1bpqÄpˆ$$9(H@áfL0ÙqÀ ª0•Y¸pAÈLW³p™‘^!ª@œ³mê}×ûj„H³ƒM‡{B¤ìþ¼xùqýÊ2A¨‚ÆÌ‘b“Š8×ùí…ä‘–á@P i’éÛÅ! Á ôÜ<¯¿ÿÍú?ý§þøŒ?ÖOÍíëòúËõúúº½uOflK\~¸#1"©¢)‘@) ¾½PTâ=pùaÅK `nûáÑš|øHÏÏ ær`«[ljï1V ¥6Åê·àNT •šTQˆÊ5j®½kC“pÒžBÔ*Ó9Wž\HDM‡k`š`ÊS•ÓSc xëc7ÕÈ…ÔKLZ¾œ_^Χµ"zD/ çó¹ÖÕÃô\ói•µ5$d(rßô¾éÐpW˜™ÿp5WÇÖä 4u m5—–@…¥ºŽëíýËÛíõm¼ßlßÍ=Õp°íîAµ­Ë²ÈÄf’›÷¡c˜:j°šÎw;gb‚!*¢#ÎÜ@Rz‚ÏA6€8Á$~¢LÐ'ýj Áoœü¦'üÖtGø9p`¦9ú<~8!að ƒã¿QMû>"°H9òÌxX왤#w~¿%—þFƒôÍÄ>Üêïñ·`êiÃ`XFÌã1l™£ýs,Ö•c; ¦¸° O›x2Í ù‘]AžÍ~²/í»— A~ýüJÀ_^öûûׯŸe©X[W5ȰG¼÷Ñua¨DÓ¥ª!H‡ŠŒ)yÖØ0æŒÐÁ¤:7 4È´°Ýz@A¡¤4Kè°(?¬×ý¾ï¯;3 WÆ’a}û}˜‚€´ˆð±C:33Õ™§™M¬ £b.µÖeqÌmßèÇïþP–?ü¿?áý·qµEJcPa/„©0‡0pa@P·¡€ „iMîfr:ç³oŒ‡$˜âr^žŸ/RkZÀ¶ýÞÃH§:Ã2‘Pê°¼ßnàã»çõÇï?^N'׸ßúuÁßÕçKº.µóEˆÓô0¸ ùu×·;Œ)7ÆÙqRÍ뵿^Ç}¤#—B…Fñë C©4³Fu"*œ‚ÎÄ5¡øÑTOÞìÝ3‚ ¡Gê<ƒ!1s©+•'ƒSæ)“’ s@†{ذÑ÷¾õ¡™·ûöv½n{W5 p(AÍüÃÊÎ Ô=Giõé|n\lè½÷î ¤§Š ×ëûø×¿\¾ò5.›ÖH),ŒP8[!D7€d!$f‘&¥ÎÉs´Exö1£´Ê­–yŸÄcç8É`È8[(|0–¿ÑŽê8§[<~z¤MÝnbÄQczØ&~*Žç0âœ?Üù30§”Z˜83Í5R‰azÐŽœzBHâ ØfÃåH\âcã¡ÝîwÝT”…¨ 2’ b¤Qú|ŒD¸{F€y¨êPU5³`ƵÉÚ ì›î»G€¶…jcæCz½Û}s A^‰… „œ§,–ð¡Ó™m¼üö²ÄLŒÈH7 7ĬUD8s"úÖÀÊvÐí2ÒrűÖcž…áLÇÔB¶Ô\«^Öþÿéãÿò?ÿÝ|Évÿk±ëºðr>yµÂ,5ÚÉë%©x¤‡9’qQd@¬L§"¥HpqâRä¼VܶžÚÁG×±Ãé™Ö —ZDZ[ÚéLm1À¡*R–uíï#:·A2O™Þ} €W- ”"A;¥3 ‹T$ )KA’ðLAjà˹Ï+Cz·´ðC4ÀÝQ“2!R™¦¯ÓÃF¤¥0K)ˆ@„²®ŒI<ä¼Óeƒê“Œ#ÍÍ1bizäÈ”ÀÌ0=¾ qÜQ¾³;D Õ¤X …Ò2në’/ÎëÒ¼ï㶤Yö‘cx¸ÞßÞß߯7,µ"ÐÞ÷½f^—V‹ˆ°Ïo³³L‰SâlÍF | ; B­ ÐJ!÷¤Ù2êªê>¸s-|:·Ö""ødÛ™eFzf‚™éPCd&™‚b$\ÖêÁ3cŠ›-ëZ[AU9î㾡A´ KZŸN­VÈHßÇx}»õ¡K+ëZj©Âr^¥µÒ*÷}'„Z*³¨ÚÕìv»›y¿øzZJ+?þðáé¼^ï÷mŒ}øím{]Åãòôtzz>»{ÆÎÄ—Óòáå4ö]G‡ be\¤Ôóí6:<+äéiq/•XJæ{FhÀÔ$ˆ€YJaHí>ÆŽÊ¥Pfª:‚RþóÛ~7[š<_p]<#¶]¯[Üï¶í¡æ‘n‘ªi™©¦K‹ËŠk­×ûxßÜ\ø‘º+‰Õ3Á1S!Љœ3)’0iR¦ywbCpn ‘¦tŽ5"~ †~‹ˆ>Âü<<*`ó9|,‰Žt1&•ÝôõÚ=½–db@TËHc&©5À¶ÑÕB Ü1Ÿ/íù"k__õº¹*n]©R0!/üÞ{$®È Õô¾y¸ "‡¥GMôP"Ò¬›Æ\„±0MrVLãí#]yÔHàÈYÎ7f&xøìÄg¢)î{t ŸÇ¦ÀÂÈtdKèW›åÁÜž33~ o€`¤ %Y&$È$BÐìZÎiµòLg&t3 .?úüüçÿ¼0”ß5‰]ð IY^{×±_ ¯ŒÅ÷UxY+a¼mÛí•èÒZ!aÇP‚”Hˆì;b.­•Ó“ÑùiØç½¿Û(g¡‚4û`Ý3:Ÿ®²j}Ï\¡ÖZh¨iIž‡, “%¸ÞÓù`6À èáÆ”OUXš¤H;árëCa)+•ÿú…þåÏ÷×[ÉÂ@èAݲœüPÏ¢Ö¤1ÆP£Ûæ»n–ÂSs‹?”cïsåð(OÛ{xŒ°ißÂnàn€F­R+„‚(¥ÎÐ…ÃPÃ3‡"c Ç>´Ö‚@ @LE •Âh–D}æ ¦øÒ!±`d8øì;d$Í O&¤#1 >6G ø{Þ(ææ&q pî©g¼!ñ€­Äã6Óa‰ÂÉRŽn塟Ib*µ®I{@b‚Ò •™ vóì#Ìp* “púz ÊМ凤\¦U€&l–n= {D†›CRDxx$˜‰{@F“\NÅ4D¤T’‚" “v>ñ(Ó< a{wŒ(eÖ›Y^ñGNj®'¤0¥0# ‘gšºF"¤À1Ë@€ LAÈp OФY1f!nÒ/<\ÿð›§ßýðñþþé·Ï¥íôŽ í¼È‡‹WÇåýö~í–9"†à²÷a¶/mûøQŸžž¾ÿá¥ÞF:D$ ŸNK©™  ÌX¸¨ë¶uy¿Ý˜qæþ ˜±ðÃÉ]h¨g†©˜‡H•ZI˜Id^-}„F$$!1AÑ\-OöŽ)¥1&.-.§3Õ*ËÒJbê ¦Þ7 s‡ÐÔ ¢7ŽŒ ¬µŠHAÄ­ëõ¶Æi©OOçÓºÔZˆ€ŠTDœö_fJˆm#¼o= Ö¥áÓZDÖsV3¸ŸÖç§5!Oç•߯·4#˜¼VnRƦjî¡îÞÊéùùRK»^¯Dت¬õ4Î `\ÊpFöLV•V¸Jå•ÃX°(2«‚N–‰ÈÄ)t*Ä…¯vµÂþõÍJ"öHª} ³È0OUÈÀB(5t B:Œ€ŒÄSFâÓãrdÏ,Ápâ )«Ûøƒ|&0P™®±¹?ÌÈihÇo§þÇj's¦¨ôãcap8áó‘sM xßuø~^é´‘ õ1L„–¥ q+Í›c†*B‚öqnñraŽmX¸g-†‰Q53¨ R$«:$ωÊÁµ¡Ó :! E˜ûˆ,sÝìaHT ?~7y|Ýßùò‹ÌpψtÃ1b0 ’y2€%e3ÓÃç:íZyðýç’%b@ fuˆ Ê$¢£<_ŸÉ Œx9×çµHº[”ºnãíÓÿ÷§?|ùÇß?²mz—¤HЇ¬UžNõ £ =3¬…  [ OBJ*qwõÑk$#w€;’†Ž}7E©ah‘~ÆŠBäžF™ysÝïƒuv˜6[)¼l}ô€"nî6¨Vhk*X&¯Á 3ÀC„óˆÊP9VÉÕù$õd)ÿþ üù—Ûçw>d$ºÜ: ¬t*µT „eñ×wÿú¦ªvàJ28q& Ó#Ð &Õ)‹Ì¢#`Js&."23GH\¤¢ $‘ùþÖWË„Èðð}8!A¦•*8Íà>æù<P˜Áƒg- C$KAÇÜ„1b:%†‡ Ó409ÒL1&¤eÄ<¤=¢7Ó‡‘s£#„”vìEˆ‚=0’1Wn|0ÒÝtz1³Î× î›z3oM>~<#â¾ëõ@’LÞ£f“N‘ œÁ÷Ûëõ Ú‹ IDATýsä]m¿Þ†*Ó‰Þá|jE,`¸ˆX0VßNq7»²+§xe2q©E¢Ån¼–®Ñ-\ȤåjÃTGwµ cf–B•…È!|7íæ PÒP˜°APDh@±ÔZ¤.aÔ÷û§×[wl§özúqÛ_žÎëRÃ}ïÞGªZìæïÛøüº«e+¥VúÈr2rKß65K”ÓéÉ:¶±oã¶oÛТŒ´ÜR¾nõë]®=œµ'"dѼ¿2r=„1±µ³)î&4réÊÄÈ-Ü–ÒãQõðÀÑ„ƒá·‹'Î8ÃìáÎ÷Ã|qð|»0ˆéØ{Ü Ž>z<*åpxÅŽË+ ÃÜ7LsHV€d&šI¢$Ê)Õ&¢ZZD;Æœ07Ø™ÀîtßaÛ Òç²nÆÔ¦žf®SðPÞÎà1õÀ–i„>Enž™(€5†Úmsd%âeiØZŠØÌÜeBZ`$ç‚ÀŒÀ}@:Kq+뱨ŒH>GÇð~æ«§*ŽNÔÂæé{ª{O÷Ú§CD"pGZ œ&à1ˆðñùü÷üw÷û~ÆOCêH†ów',åþYî_ÞÇj]=œ‘j‰ä½›š‰L>z@2ÑìÃKZKʰ#‡ùýë+·Óúô´œÏàN„ít^øÍùû¯ýóë¿þó¦ˆIç"²®1¤ï›ÇîºS¡™¿ZÖ´³î)iaa°dâBP"œæR$ÝÔ)দ Cc÷0È-ˆÜb¦H,Ã49 @B’ްÐÝ<-¹-Ü<‚™[©DX ×ʈDš‘™n1»ÿ¥Èwß=?¿\r¢'—¥z†F²P„OeGDö>úÐO_ÞoÛ¸œ–ÓÚj“HPÕpí}¨ú¶vyHLðñ¿)"µ^dO-ÃÇcäLï"3¢Ôʪâî‘A ¼”v·mÛnˆÇ¤—‰‰Å3‘RÎkmrA¶aUÖY¤Øºõ´šÐæâ%‚Ö%\8âÏ+ »åèf 5Χv>×ZùÞ{ïîiN12 »B1xæ–á‘ÊØŠiŽM&fâHS³¤`â@Öƒ4 iæö‰³5?5,<ùÊ¿.»3sž[¦ÔÆ,·î{‡Êdæ)UÓLJüvÇ­ê±y@…ì¸QÍ€bf¤öLŒÂ&%©2Ñ1Ú,Ib¨ k+•áã‹|ÿá|©p»š×Z­ïKåµVÛ6ÊH(gÉ•ù‰ql­0zF/Ì¥ &×ÒJÍ0í†p7Û‡I +ÐÍ­ÇÞõ¾س(­TJc]ü¶`ç´ ò$”‘A#¯Ÿp7AÀ’ zïÝ-*ž…ê®~Q–ÊBÕ,§ÁU ’]ÁÚrÂ> 6€öùÛ53+± €T®åIúŸî®TY¢€+',ÝÐ"´Šs•ɧµ<38¯{+÷½›YôaÃ,£PÎ*IdœY" t@ðµÕÓy%fWOOB™ëÜyc3 ¡š@pBªUja *L­qWSó d¢pª‘8<Í‚1‹ÇP`p‡nè@sYiÁ„D€Ô‘‘ nƇH®• ±kÜwˆùö'Fœƒ¦dµ!„ëgw׈dB ³0³¤Cž™XdÞuñ@"UÈ)2DFÏØº›ëºP«Äéxßìg¸óÏËyiòQö_ßvëN„HI™’‘éàŠàµâå¥üþ—Ï•w¹}Ú¼Óý¾Ûöb-|Æ¥#B±3»—È1‡ " I0of$·ž»ŠOwg&VÚ·®Nì"R:N6T¸›Ù@:•eq"ÐajšÉÉ„,d¡¾÷̺ l[|ú¼ýù“í^¤µ/ï÷/¯×ΗӲ”ÂÌRÚB!E¨Ð—÷mèëûU1ûå\þø‡û»ï3íó_ÿ¬·¯u]ÖówKyÒþ~¿¾ÞoÛÝm 2$pvyÓbRhYˆ˜Ì2Õ$"f¡Hë£G¤0ñlôF˜%Bý7AÂc…5§÷ˆ@'“Gùð›OB§ùc/ðü:ߘ5õÉ‚@LfÌižÖm:"™9ÇþH0Ãf‰Ì@Sž} – *²>›[ ·ðDJ" Zá¼æ´D¦gš‡ HDÇ´°LHgHNDži¡$Ž„Ý̺·Fµ”ÀTEW÷À–÷ûnHy>ñùÜ2¦wÔ™®˜@:™ƒ''„t àÝq7gµ3ÑeŽáðœ!"A:ð½ä¦¦¦3­Aà˜1“CðĘ…X,À™z"y˼<B¢\ïúþéË@Å÷®šÅKß)¼®HÔÊhmÛa3¿a¤ˆ”–ɸCÌ·Ñ1#L¢DqÔ BàŽÍÂóúùóüþøðݦê:ÖËS{º¼À÷_ ûû[ÿò‰6“ð…ÙOg+uè:úpDZk©’FTNO@ýŽ®hcbÒ݆ã’P äÓ}ÜÆØ_.«<Ÿ¯Ÿß^¯û²¶V%Y gPf  ÉÒ–•Ò- f‚»Å°HÂ*Áž€ÄkmLÐõávÁz9}8Aýú>ݲTr×}xÆt]Cf8&1=÷Ç÷$ƒ¾A„`¬5‰Àl¾&fú­&ÒÞí§Ÿo÷[9·§ÓR+aføˆp)+r¹mú~í‘°¶¶õüéç+}º3Wf‚m»}ý*¥)Ò–åå¢O—VÁ½Š”V/tÀ2Ô”¥0óÄúraÄsËLB.RZ7u³Û}¤_OëÓ‡—óºÈlܺ…‡"×ùqöÞmZĤÈÿÏÔ›tIrdYz÷ "ªjæî1™•u:›ÝE.¸â‚ýÿ×ýHîz`wU¡‰DDø`¦*"oàBÔ#+œáÇÝLMä½{¿ó¿ñȰ1æ3—"rX(ëRKd8hɼ,Uæiç~”—·û}o}6º­k!¡“MŠlÉš›{F2“ia-ªµ”¢ëRŠœÊ[ö°6¬õîIÊEˆ1FÛƒ@pP6†¹[†'3‹RNöQ»/ªº®ËÑòë×îU*«Ša–,…—ÊÄ4&sVŒðUËÃc­KÙ÷öš6,IJ2sN"ÃÙZ¾Ù=AYØ/ê+6Q¨J¸–¨…¶JZÎ܈K³nBTN½z&!Þ¹ý§¿“…˜ÓCÜ ’Nd <õŽô÷tÐ<ë¤gLª-'QP‚ø”ØáÇC^@øñÔŸ¬Ó 6‡Þ­ïÿjI,Íú]È€A‘è#^. BÖ„¸q7Ã¥Äeãm]lÔ>¢8zÞŽ–JaKŒ¦H,'µÊ#Mð»HS]g gFÖ8]LHf33Š”‹È\ ŸÄ[D"f±tÞQAݲ IU®jD1FžL )ñÎP<9ëÉôãS,ýG)çE-)’¦+¶TðB¬ÓébJpHáe•Ë¥VÆã&OײˆÝÞú¾ßlØãeyX¥G:­oˆ–V =½—fs6®K!J‹¶PnªµTVuÊÃGf‘GH3˜Ed7`D Ĉl( ©êE—GÉuô}Hé$Ð+qö¼¶ïÅ:‰ àh}a¯×mÒ<¢Þ”½ @ž¬WÇb¯GX)úé¥Õ¿¾Ä@%%Ð`²Uùa«EÈ«'$!€pš$‚«ÓbnÍ|Øxha#”éÃÃʬʒ1Ž–æy4¼ÞümÏp"’@PúT×E ÑdIN*BÛ¢ab*¢"ÄBx½÷ÛÑïG – ‰ÂFfœL„µP]4R8YÀûq¼Fg#= ÃÝœ™ˆÔC‡‰%Ï ›1B…ežŽjm¡yFè=[:ܘ}‘eQÙ}¶® R‘.ªµ2 {€EåZUÉ=O@óÑzd$kÕª™F1„IDJ-¬èÝÚŒf€Ó)æñ‚ˆR¦RÌ0LXd~Ø8H]ÌœIÖ1¬õÑÃúçÇËåúøùÓÓ_~ùz»%Œ¡ïÕ 0¥Í^HH?Õ÷çLJüòëûËïÿú·o%^³÷v·Â°n‘ž¤iì=)©žl‘’\µ‚µ¥»µ"Ñ|=,Ëõ*$¾H,$¯7m»6MŠ^–®+ £L©B€Y’‚kQ6†sCfK”Â1ÌûáÝR FõvÜîþfÀA¯÷ñv;^^÷‡ëòôxùüñéáº*¥±.ž¶§Ç­wz{k/¯íOø´}þTïä—çëuÝ®?>TŽþ@À·ç—žéª¢Bk½´¾¾µvëLº¨j-$ &"dxzy"Ç8Ëc¥ŒR@ $Gœ1€ZHõtÎ!Ð$È¿W›™3¶0¹ŸgC(&¾Œæ`ÂææŒO‹ä;2í¤ÒOZ‘KÒy²‡ŸÏ3yÌ™‘ï, sÀá–áAWeUz×”ƒ‰T‰ˆ²DEy0M¬¡–wHÑl›™¹E(…Ñœât·a‘‘aÎR™x&‚Õ1†R\®¤K=v˜§EfZNKpë´TlH<Âc~BNSØbð” !ÒÙÔM̶½Z’­! L~#ý½Sͧr‚#<Éûaæ™ÐÈB¬³ú‰“Œ“9'V&RX•ž–ÉÄ ³Rz’QåªÍìùÛK+Q?¯ùÖ,E®Ä5A®œ g‚ÖÆH6ˆ”º1³ÝÍ DÊDb‚˜ÈƒÜIÊH÷Ñîû=ß ÜyÜï˶­ëªEÅ~î¿ÿÔ~ûe´[´f·ÛX+5ê:VO`YW©‹%àeÕe•c¡öJín>üh.²D„Cؘ¹”²Ý›¿Z«J—mõ»…/±>Zs£%3Y½T¦äªJiGÏ"€Ì†v¸û¸w8²°\jÕZ;èÍwx_ƒ.ã0ÜxÊ,Ôˆ|î63sš™±J¦s›ó' ²²3w¡¾(]¶©·o{6W¤"½õÛýíööòzüôqüôñ²VÔ²¬ZlÐó·ïûö]×RêÑŬ·vˆö¢Â”½së®j`*¥Ýoíöº¬‹<\óøøáiYÝÖmßïÈä¢Å=Í<ÌJ"á>º‘½ÛíÞÞöûp}¸åeóŒ×Zja)ÆlÀ ãèǾ#±]¶‡‡‡u­ÊLýåõþòòæg‚¶õ²,5ÃHR˜¶E>™ªZxÜ™} "g!°hŠ€„çekæh‰„(2‡Yw£íÐ˺¬eQÝŽBÈ1ÆÛ­!ûãu]ÖêéãmoÍÒ“‰”q½¬Ýâå­í­'~QZ™¶kyz*Ûey}óçWœû(Kd(á­!ÖU® 3ÌÌ<Æ€+Kfö1Zk­·á HÊ€2饪xbŒ²$¢*e­Z×”ÊZŠÖò¸ùü‹T’`̺­u˜ÇcðBÌgD8y>Kñc^B@=!EWÉ$AÉNSÖŒÇðpÿémGRÆûGÃ|0M$ Ï(ñ¤æ3✙¢z§Ñ”‚0»V:óž1‰gE%“n‡¹{ˆt•ªÊŒH •R‹.A›ãhß÷¶B!sÍ:³FÄ ID¹ÏÊK¶TR-a±÷°äärΟr¶ÅØ2½%,ÊThþˆ˜ÏnDxº‡$Á|^y‚r0s­L`7ú!ž.á÷·üü'Ÿëæw:j “d¦Ïï HN*E¤cÆp™g­¸^Š.Â^Ùª(Soýíõ¶·à‡­¨òÝÓu=Jb¼‰÷#bd?RJÕuca¤'Øœ9U¸§ß†#ˆ{äÞó>ìhÇчƒIeNà*91œ…“Ý9žäFi¬£§c ÏR*e6ë»ÅÁdÁ6âùíuú¤T#Â[77+LÐ0Žp°<=ûçû¡í[ˆQ­ËÝ®^ØQH@dÝløAÛ˜Iw)Œ1’„¤€51’Ü<¬p®²,k9š–Bæ!Â"ÕÜöcŒïà‘)vL=•Hìƒòµ‹˜r\ÖÂ:_ bwôæ$ZYÙ|¼ÝÇ«Â*“ÞG$¬ GÜËPÕwÆ I²Ìfºr a0¢¨²¨GdDD˜ÇÈ£Gd^ˆ¸wPÆaè©É+‘†ÏYõCådeUbŽH˰û˜³ì!¥ä óÈp±p)ÓMìâ½›Ñ{XPA$tjYƒNµ'P ·û‘U0ƒÈhÍ¿}¿Y?AgMp‘7ŸJ7š.¼w )³dú°1X®þœ¯Ïöò«w)’vyþºiBà²t*gÎʨÄL*nsÊ v]¢¬Œ%ãv´W¹l×§{ÚG6^×R{P@Ë¢Éý8†9” ¢Iš„ÌÆql´V ®Höüwã$Fá¤EõCåÇkñ&__n¯ß}ÄÔÿñˆ$]×QK™ë𨅾|ºY¾ÖûívûúõÛ¿ýR¯õçO×§K­¥\/kåp^TDÜ·4­qÝð œÈ·£ß›i-E„-| ‡‹jêLueXp„Œ>—ß9¦*E‹ %‡pªp‘¯?ÏÞ‰Y•ÄY œÒ¸‰Š>'Kï=ï´w£bÌ gÞóÌÑNÇìª ‘:9Ÿf=:ÇF³uçX„’™9³7€Š…gFÌÉ Sò¤ÉTMT'Ñ´ŒÍäÅúƒ*gáÙŒ_RÝ H7¼Ým?,"Xëé^$©p²Ñ¡ T‰JìçwB’yZ‡Š ›‡9T¸€hÚubâEI˜äL²ˆðY±H¡™_ÈüX}ïÖñ¹{ž¶$ÌІ˜Ï^ï\8Lvõi7O¤Ã=@N"©”çüúdŽMOR•‡—?üüø¥ÊRÞªjÇ[ïc“’B…u)¼Ö‘~ tbáR)êKQ‰ ¡I›ð(0eª ˜4n ÂZ•…"ƒ”×u Jb™Šˆº<¬×O²=ýîÑ{i±$/W­«¨Öº­+qNö‹SRá,ûžžhI),ûžŠ®LÜjÅõÂɤá¨×‡— YŽ}o6»*Tˆ–Zç=ÕÓÜ{ç©P •B SîÞÌcÙ–"!,¤š†îÈ£¡ï}òH¯÷±:ÖBË"2<ÏÑ"ãÌŽ¦&ôÅs.«lkAaÏØ•ùºÖµ–µªGï÷Œ$&eN÷@¸~ô±ÔRKåT‡G¿ݬ-…¢JaU À=ÇZëeÙT‘fù׿¾þ›=¯ëòñãõÃsÿò¥ýüÓ'í}ŒÖ·µ®µÔ¢GX¦»›QLúuëv»µççû÷ç·çÛ½[ À`äxѽ&Ek­µHx sÛGþúvßßvJºlÇÃc»^×Çër½®`NÚÈÖ­u«Õk-V ¯K .kU•6ÌÂÍlΨ‘?Ày=™Eì”EeYª(yúüÕÝØ9ÉRãáº<\®áq»õ£µØÊR7 mX‚‚™X¸ ‰ÇýèÁ,ª*Ì—U?~xúòééáâKIî÷&EJÕZŠÈmfa¹lëRxôÞ-ºÆÑl ÷î™­æäA˜ÁÂZ˺¨Ò’Kýp·©J!lÃUùi«BdfN0Á IðÂASÿÁ Êw²ÿüèN›ÝßÉSæfF’¡Å— öΧµŽÞóúÁI2m#DS¸0w¿xÿЙ¥žsSø;–GðÃ%4—K(9!I™3UëŒQ5D¢R¥”îÇ1ö#ºI&‰òeŶ@…Ug옓H”UI…ÜÔ­¿íûNª*•€tG6B!P™©§4bX‘#i :ºØ‰ !ƒdB‘é8:êNnˆ ‡³p-EX9,=, &²‘˜K™—€ÉœôŸ”ìw_Ï Ù¼‘"e¢²‹¿ïLI9,„AJ@xÌ=8Qeebe´´—ÔÂ×§ëããF­ùï>F»'¬e»!F)‹G ѶèE6$€#[ä™\J©œ~Ün/··Ñï.Þ‰2WÉÊ¹Ô _K'z;†åx`.¨>ø€±7÷dèö1µ¯ßïco”.…Ža~{]7ö“°Rœ¥iåº!*jíéùû‡—WޱPw!ÎRRa IFø°‘aÉPŽ`… <‚4à8›ìzVë˜Uµ-Eg¶‘À”ˆÍáYÉÓç”npö¼·!d—µ*ÏIfÚ‰[†ˆƒ""ú\Õ3 ‰9Æ1¤H®õ"¯€d!ªÊº”pX+sÂÒà±(­eî])€á9WÛUÇõ1!GÂ#°oë²lš¤nÍ=(˜E×§²<-Úbyõþ[ÃÞ.׋²ßîoí†$&ø Kñˆè=ºu4¯.ªOx¼Ôµ”a´(/¯}|óvÛ¢/"תOuùóÏ,Ûçfß¶¾­ÊÄ%‰<"<‘dÝ__ïéQ«0ópÏÀÇÇËã…><Ô¿þž÷ûíŸùëRùßýáÃu]¨°ÉÊRÀC¡‡ ƒèùíö¯¿¾Þv,˶m*ŠÖûaÉŒ*Y9ˆÌAIÄ™L1Ãþ2(+DB•TS8Þ[\I‘§àó½Î°ÌQt¦ûû?Æ÷’ÓIK?*‚y =wZ‚œêÐÀ|JØ“"ï"¼ƒ¦‘ï±H°2‡f÷ïþ_š“­yaÁô/Š0!âtâÒ{u~n\ A'¬*  ‰tXcÌZ°Ìô¼’Fˆ9Ì@ U*‚pÊHqæÖÖJB<ÙÑžéð˜®GO&3!›P/…-Ä[f:s20õðç×zæ©"f’w®Õ3ɳ84!ŸA"d¶´AœY- |”ìÁH,¢!2ñóì#†5©ùùóòïÿ—Ï Æóýûó/Oßžo·{çV²%-¶-uýôø¯í8^žH`ǽDQ­÷··Ûí¶ï{ïÂZ‹šåëmßéçZ «dä0?ZÛï{?:ƒÞÞŽß~ѪëÇ—­X7sDFK?î{¼Þ2BTÖZ„¸MªqX€d»\Þ—aq†t™˜X iæ"Ì,Ì©*¥¨¨p½£+côÞº‰jnkÕR–¥&¢T-µ°0—m6íÈÎm¬Ë±,Ä4JrÝêåz].›hq‡;j©ÄºnËu[ÃRIUjw8².²n‹22X2'©Ž¹u€PªTe·aˆŽ4$2lB Ÿ…’Šœn™€ÁM„.+]j!Ê6Þ­W§Ýwæ‡ ärúç.s"ÿ “ŒÃ[?LÀçS\™ç}€“ñÃ(:Ñš‘éD.âë"ÛZJ‘ZKQm­ñIüLsddk¸sTe­Ó:;³ÖUŸjÒñvŒ™sbb wï™A¼€0š”p$}Œ! &‘‹1<Ü"”‚ÌØ{ëNI„°SÊİl6ü2¸óÉ·ðàLkf&ùiþÍ¿ãSØ\sÞâ˜3á÷8ÎWmr £g¡HN™‚Ù%guY³ÛÝËE.eùéãE–Ÿà7{yS$…uîÍÝ”×ôÊ9Bµs§©*EõÔ6À†õ6îûmßoDC /•AKø©µWÒ¢âßÛÍ:®ëcÑ´HpÔd@H¨¦QP¢(sMòÌðLD ‚A, ë…ô’XÆÜeÜ¥½™B¢`òLÎvBLõIš3Á5Ogqþ“œîj±äæõðr8‹2TXD”œE©Qº»³”÷|ÃDõLOø|SxpÔTI˜2ëÂ*ë k™ewx23„IU"ÃI4‚Z§cˆSI`‚àØ&*ªl ×tL/.%2º…Ã'íÙ-E"’9a£»GœUBNì² —áÃ8.–.áBIé5ÅécP€“„ ”=Ãqtæ¥*/"L¥ÄÃýñÚòõ­ìûsïŽx±þVkåRúèã8Ü{²°nËuÙ´Žƒ‘j©¼½\ ŠûÁ¹ì­uy»×Þ^Ÿû±{­«‡¥7s°”¤P&*~‹†²èöáAY]”«ZŠO£Äí.;_ÊÃúa•5m´[~ðvù×o{mØ®‹nfC…®›^ª¡kýp§á¸nï‹>]–ÏO—O×ß¿?GzzPqÖÞ­hpºèú ŽÔkÏ5#,(ž>,Tµ,­ãaÉJ³±”ó,ÌBÄ$Ê”"æŒt (!%#§ .òïÝÜ9[æà“%Éïóþà‰3΂t:MV„ópŠÿÿ¨hRƒ}—f]œ™˜dåÏ%užk✊sÓ¦tb)&?ÐiÊìfÝebÆÏ^ùÜ’‚'aêlêLûj³#(f8Gzœpö$’RÖ•#Ýsdxæ¥Ääî!Œ¥""|0RBSQîž)4zï†Ñ‚‰HÅ\æû$ÂIPK‘`ÃÌ8ƒ§É›@“A}3"OGù».†Bµ`-ßU5Â:Guñ®÷aNRàDHš.ó<1}”Ä¢ÓVãI™m?Žãûyýô¥=¾f ||\–²." yúè'-T*i 9:‡×L™Ë@¤M¨¾n[•m´Âµ@$ e©@€%æ’eÛärR)ür¹ÖõÚbâeifhÊ*u!žçUå%“ç5òGf-uýøÈÛb¶†öʽ‡U ·5“ZÂ,Q(ÄM …+§R]lóÕ’Ž &•žäÃ@PÄ¢ààÖÑÜ‚är-Ûc¹túÛÛñ|óž —Ms™—n@“Áô¾áŸ“̈H Q}HZ$¬•–šÖÍ’8˜çëö½13™Ek¦²(3OH¸Íϧ›Ñ°ðºêe+[©Ê JÂÑÆ~kîIDÂ$,µj­{R¸{)úøøpYWe&`6a2C„„ À°˜wÕ³iaææçœ›UD…Ί<ö£½™˜Öu­u©¥P­¥(%æñÑÜï­±îî&³mDû±G˜y¼¾ìíhZOÖªäóÓÃãÕ J 3¡(æÌQF×Þíè1æ¢~ÞÕÆàyyÇÜ¥—""v÷Ñ›¹ç~Œˆ{Üz²Äãµ|~ZË*ÌY‹^jô1»%פ™r¦iæI F¯›ˆˆÕp¼ÝúÉ'ê¬Nm¸¿WWù$ Óœ|\Ÿ3”3*@asß:¯5`a*ÉŒH›G¢T†*Õ*×uÛêRE™l£Ç+ÝýåÍî{ø Wó°ÈO–‡‹,E"±7·°Dl«0/Ë"Ãf Ä–æî ©$áœÎD€˜—YÔABÙ–…µž2ÔHvGxk¦™cJéJ#Ý-€fi˜)‘’ÐL Çj;(FïŠvNšŸÄŒKˆevƒ~Ê6æm)iÞDCÜbŒT ÍŽÌc&ÒõîÚ‡·ûØ¿¿FØe{ÒZH?mîy÷×î÷°Ã,dQæ©÷s«R.E¥ar^n~¿ïo·½·(Y$3*ÑçOŸI¶—{¿õÞ12Ò(Ü30ÒW¡e©;– Iƹ³X]9…;‘¤nU “™½& ArDÍýòí%ÞžÇ9r·,ó8Î$˜ Èó@1KT…f–A,I‘ž*¡}V3åvÐ_þÖ͉?|\)ãi«Œ4·T*£ãð{Au “2T&ìB})Ä"Ý0lÜ÷¶-ütY‘™¢Z–JDi1ûöÚžo9·U—…f¡fyßm?¼wFÓªÈt @‰ƒ%r§»!A‘êyXó3mJc&+2y6(“ì\4“0,†÷à@u&;GAžš¤ e„(»Ã é#F`.µ.Ë9Á‘:!Í#Z‚æø1XˆÏ´á<$8’Í­÷QD(ÆO ‡2¯ë§O+à_Ÿ_ÿÞGDñŸd¯,ŸþùŸ_ÿóþ¿þ·zøOÿç¿ÃòG|÷—ýûm%4Õ×ËÇüü§oÏzÿúmÁ à½ç¶]˲Z'K¡¥†qÿëýù·ÛþµSª¿7kwŽDH…óá£;1©òå¢@ÂsËÍ>çZ÷èo£&ÿéþð‡?ü¹ò/¿|û�üß¿þöÖ¿þúõöëzY¶U”¥*-ÊzÒóÅÇýøþÚ¾¾ þñRòËÓÏ?}øÇ?þôç?ÿBªzY–Êì6ÞîÁ$Ýs©ŸþÁ×v¸ì®ëZ>üqùßÒݵ{y»Û_ÿúm¿ï*Z´Íl|e‡GH®—å…eÌ\2Ÿ·D²L&”ÂE‰d¶g6…)OØ,[æ8ðĹŸvx–Çâ‡ýý¥˜n­ÉÞĹËJÂ9ÜœìûÿN…š°e¢@Î4¼g¤ùˆ³°LyZ€4 tnÎ×*±D&w4Y_§0=Ü23Ó,=á.¢R—4óéɉ%!`qw»÷Z‚¢`ƒfœ¹îÖ=3T¡•3sXìƒJ¤DÌM{R¤(aUÌØëD‡ÍÍùÆ9( %Ë9.B2纀˜¤ùÑlÎB‘Œ L8T6J£NVõ­¢ ˆ~ô 8Èb[aþúëÛÿk­|òO@†ïÏ/ž5;Üq]’áO¶uùü1ïG«‡f73ðAbæÖº„o‚EYD<5¤ .åzyü¸-õùëo}ôL'–õʧ+„(ãáÓãÓÏ?}ýë_ü^–ÏÿøáþÔÞÛh·ãíe{=É„l‘áFá Õ²®º.IÑÃÇRuy¸G¸i CA0­,9ú톖e‘ÃÇRøÃå’½·£[oÔ¸¢)$E5Çè­{z¨‹#„°2-:àAb¸¹‘0—œOåm{ÒU/;ªÉ5bÙ_ïn6·ûDƒÈ ÈÔ Ea¸å›¬Dôzë˸,,*ë"»‡¹Là$ÎänñõÅŸïGDŽn‚•ôz;Ö’ÛŠ¢ ðºêÃÆHXXïã÷ö ìîüåËC†- W%3»ïMÿûÿü…˜í·¯oûñéëÓÃeýø¸ýé¾<><$ÒÝ#ñøxé}΂½ùýð·[»ß{"U%Ç1½,¢2¥dL÷f ŽÔaÖ¾?ßTh©u-‹^6”ª½Å¾)ëÎt&éDˆ4À¯—eQ^(´jY"¼Ï<âŒûŒ3 ÉÝ!<Ƕ¡J¥¨ˆxøqoÀ2»‡™iæD†Ìvÿ;¸àzY–¢­vôŒNÀÓG:¥'¥M¶bŒÉT —BSÿ«¢"^‘a6nÞ›·fD„mÜv9v#¦=2" ˆZ¸jY”ÖE=!DG³ç·hÂÖEÕM˜®+‘ZìöÖb¹É·EkÕw$bТòóOëO_žjÕa~ìöý¹‘ÝÈs2ÅOKÊT"¾+)>=¸SxšŽtšQÏù{ôwÞ'¦Ûp>é)˜ PsÝlDCÈ9C†¨ðZy]P„ˆjdé×Û(Ú(ûífÍÍéü5?ò¬Qž$r "™˜Å<“¯ö®s¤saÀ ¨G˜HÌÛ/ù ±9b8iª–¢4úëÛË×(‰ìp–‹Äîì‡õ·c_Rb7È–9û(®Òˆ½cñÑ$£ $€¥(+!¬—äG-²\†—Ýuï‡Û±-ò´JÎÌ£m-O[¥·Ö2a´÷qÏ´ZÌcxz’(¦a¾oÓ(`G»÷ãëïØo¼­*@2 3E6€wË1Ï£@ç·*A‘¨H F#P’FrkÞÞö·Âc+?=->\Tù¾fÉ$Ÿ>l}¤…7ïDs‘C ’Dœc-z݈˜±ÇéæÔ²¬EÂÛV‹ í°ä›E°àñq)E†y·ì}Ün~tD( ÅZõáR(Ðö1F˜gt;Ó¿AáßN!žz¦)‘á™Ë˜C=òD01KÉ€{xz̾yX™KæžtÒ)á NTœž¦ XANÜ;È“`‘æ9kÍÇ¢u¤…C„!²Þ%ã IÅÏŠ(%¥ Òm„a­ÂKüÞ=G¢,õÃc}xXXžûýf™fa!<>¿ÞþËûí—_~ÿOÿÇ?¢”d½t_ˆi»–_ÊÃç²Ö%¹¯jLco;%oR…„t»Ýï_ßŽçæ ÀÞÓöèe)¬•)%°pñàÖ; Õ˺¬:†˜Çp3$I²ÙÂl½õ£•mQºþú×ý׿õùíø—¿¿|ÿ~­ë¶mK„貭U5,†eî1Z{ÝÇëÝGÇm?öþv?þô§/ÿñŸþýÇÏû6©fµ±w‹¤ZŸ~ÊÕÆÍ{°\¿üñóÃÃux|Ùÿí×ç×——릵,Zt˜ £ñ”dMô½‘ æö„•X#È"ü4ÃÆ9ÈOwd&Ç<Ó‹ŠˆäY™å™‰¥9Á&qÖ¾N«täT¢Ó¹ÀÙ­šZÐ9.ϤLNÆ8ÑŒ&ŸÁÑœåpŸ Ú3C™ž¹\ÎP ,ïÝ/Ÿçì˜}7¦`šLž,Ræ Ÿ¸!üè®L«±GR$EI‚Úˆn–$ĪÃsÜR† "4H@soeL6Oé}d‚¥Ì.tDp’’ÏÇûl„ëÃWÁ¢ bVf%~Ÿñcfp§,0?@AHeHФdÀ%Ý<’"íħS…3‘о¿³ç§tfð¤Ã|ûö–÷þE®?y€ßo÷¶÷—j=b8ÌÃüh}x^ž®O˕݈Aî5ö½›µŒ{ÖûÆ\‹b­R–ôŒîBYXëõúéóGe¾=cˆ‹‹°Ô¢Dˆ·^ÖåòôayúdRõÓÖ?þy)âÇíí÷¿îûayÔ©A´>Ú=l(cªUu]êºr™ªªÐBİvs0:Á… ÃÝÃ$’…“Àœ[-.Wã÷þõ·×[ç*B4cL³‚‹YÀÓˆPT–‚$sŠ\Àè9ŒjÞ?ÔŠ‡ÚKyõeo‹‘áä[Ù»YTæ•ç-ȃۑ Fî»?lTKF†²Ç»j€„xPëð6srÆßƒFŽ¡Í}­[-Çsî÷3ø›§qgúXéº]>|xŒäÞûó÷×» ×9.ƒ{˜‡ªn‹j­#"iR‡I×U¶m!ÂΩÛJ?Ù~úòTKyy½Ý^}mÀRÊï/:Y4˜«àÙ˜™$G’¤4àÇÖ–Þݹà‰Aˆ¤  8¥œ¨& N¡°n}Ĩê™DÉœª$¢‘¶Kfœ=Ùàî$BŒáÞÌÉøâÃE«´ìíééõ)#ûѲï÷ìiý6ú}˜‡WÉuó†ð’¼­”DðZ|»¶>¼ÅlcŠ¥8ÀªžÔ#úª%û8ú³›QDFŒu¥²é½6­˜)¯Þj¿ïŽ–}ŒF`¥j‘l&a l}Àì3†Ïá÷ÛËË[xûXäQx=§xÓAœ”áA f}÷Ò;Æ~ʤfð€’5ƒ@.°‘y7žûqô—y}[?<.—Z ‹ÜnGR<>mA<òíës ÷‰æ€Î„-Ûúc4P«²0›å`‘[r7* A]äz­ª´]b6ïnð ƒ)™ó²ðÓZ.Ku§Þ0¼7›^ÞäóÊÍDŠö3YÄ43¾1¿-@ @QJ)uqCö eš¶9¥ ž¯=r¦¥Ã,9Ý0JC& ΩI>·— Žðî~Xp!%a†¬ìSš¤ÿ°@dd0Xqnº“%y„™9 ­K©u]FÜ[»ííëóëuûü?ÿ´-kÚ_~ý½…ó´Ä#ËÑðöl·oo×G”â>]i¸T)•’äù•¤5á\>¬…{¶¡c–ŽÐ E…`wï·×ìý²ÔåÅ(nÞ…sr ÑÊœª¤at­õ1Öu]Õêiˆ •dîac´²Øµ¢èå—_îÿÏý¿|;=íYG^¸—ÂJË€»™­Å0ô‘Gë}ØŒž'1KÙ‡_ß_öo·.Ë#ñ>ŽcåËeݶ˶-Þ«Ùnîdé^6è*Z…c«ý²Ê‡§Eèá²®"²ím?Žf1ïþÞ;ç3S\,:~‘17ÛÁÄrG¸ON iQU˜ÑÿN”SõuîÓA<]µ'rvjà™x^_gíi΀@¼"f]øýdÌ<]ÕôîÃ"RŽ ¤%έtмÌê+2³îá,,“Ds¦ŽNxU“³Èü¢…1ãös€Ã tp²22Ã݈³)$‰£efÐèÜçú ² ²ÏwÐ`1­ª\Ê<@Ád„‘A`9ë $³QÙǨœE‰(Iˆ§ä'`â~LÚ(ßáÚ³@”LE€Â©i–møÈ‘Ä ¡¨' žÖÎ÷=’N:Ó(-ºÝ:tà8ܲ>ÜŒÒÝbXìqP[tÝVVÃFüL½[$I’¥'7U3s÷ˆÈK]º{gf9‚ øÿÿ .Øá¢gûZUw73U9|PóìyÍBeFf„›©Šœó}”"¬Â‘L¡¦\ç¦|SË2ƒ#û®‰ZŠÕÊéû}óõVMOË\ç‰U#rØ@ä‘ÛÖ÷lµ>‰=?Ñé¬E‹P».¬R’„Ù=÷UÀµ.bLœVÕŒ‰9H¤)‚‘„«JŒV{°ïØ2‚JÑÛö!,O§ËÄ…;8HIÒs笵:Ù¤bóâÑ-{¥0ÎI¨gP€„¥¨ž`’¹'ÀĹ³ïÕ^fÅ·­­›©»r°0È’!”ÈŠá´H(¸0"δ-Ýï]¹)wSK÷Nç ÒÄH^ócÖ:ú!cæK"l¦¥T3 ­ù,lµ,, ­¥ Ë2™ª‚<ÝáS3+Z˜µí¾­±m-[óÏ/—i*˜e®ååå…Hò~s~ ;Iˆ…ë8˜È€£çn±Šš©òpÏa°öðûÖ›§™šSfôžÄEÆÐ”Çüˬˆ e¸õ ¸ç]uÏd@Ä4!Li# ¨c¬E™9æC*>’6‘é‘‘iƒè™ì}´pÐC‘Ìä‘„í‰ õˆ™³iªË2—yš‹*Gä¼Ì·Û™jJÌY€,jÕLØDš{tUÓØNêì)Ì­yë‡ ‡ ˰š0±™”2ë¶Rß­÷^DRMjî¢ÄÊ ”‚eJO0+%3:Ó\ÙH™ŸÎOŸ_Îç“MuâãÖ¯woQ˜+óC÷{ŒrFæçq–±mê 3Žù˜+Ïò! "s’&q‚è@: ±(§)Ÿæi²z§ûõÖ<àž=sfÑ¢ª† X¡§‹©H)tÛdàô[äum VNu"Vµe™#i`éDX¥ZGó»'Š1I¢tLИŒ¸=1•‡·÷óŒªsUa4¦½eD ^걡`8\Ry´ÎY•ãI>ŠÉC²ÊCˆ€C7“DÉz,Íåñ¿êp¬Ž·Àw­òÑ/ñ¶‡ßx./ËËl½qüø»Ÿhþýo¯Ô{“È=Ü™7â“Ié4±•ÂÁ…0›•Zùò$Ÿ¿ärºýöÛºïâ>MuVÙEÈLËànmô¶¿®7.1ku¦hD)î’Ǭ®{ãl3õ=Ó½‡£hUYº‡dSòŒ=݉•ÌÄ ¥Ppè½™(ëÌRÀ™LIF¤‡HtÐ9)‰LG$`œ50˜Öcw.à16df$#Ka© 躷_~{yžüáÓóÓ¥X‘_שȗrŠÌðëmepE*‹‚2"3dªòò2}æÅ„‘¹îÛõ¾P«žç:Wµ"`ÊRÜsx¶žî¢¹È,ÌS9Mú´ÔZë}‹îØC‚ŒÙÆ6Šs´JFŒ8q@ý¾ÁŽèLAœã‚ ‘ì@w7åÉ$29#Y¤ 2 ê§Öž{÷HJã&@×dž'$8IDH$AksPV%˜G¦y*ËlÜ÷ÜúX=8àüFi'ÖHÛ½[KÓ¬µh©)üú¶ýý×wc}>Ÿ÷çuÝÞoyýxWÑZ”Ysüuɶ[üýO¿à©•¯?-¾®¾åíJ×µ7Ú¦çöóïíòù ù-™˜C² W£T\Ý»«rjeµ[(¥dЍJMNdV²2NYÓRy¥èé)ÜÁ9.ö xßTÚŸÎÎOÿó¯÷?þuûu/X&¨ÕÊçYç*¦G,ð¾5ϾíØ÷ÎT3§Yª ¬×þv½<ý]µÎ…½olÒ#pš.s=ŸÔžiCÄq`7€ =áÃT‰¡È#<t„dl9x˜&•…d S]lìF7™!éÁ1ít ox×T…E§][óèN"LB6¤9"*R‰$3˜ˆMÄ2H‹ˆ2%‘)WóÛH}±5‘‘=0€z‘£2–»C?NübÄCÁ-ÿ‰È*CL– ÖBx‹D2W"böbiÚE‘ÁVȮѱ22sž¦ùÓËÂ÷¯¿}û8÷Þ;oH‡H2$¤s-óE§Å“Ö `'¦}oÝ=™Ì4³d°Š• Ô‚·Fil•X¹pÒúþ~¿¾EßÏçÏušÔŒ¹?\â>ZóðT³ZÊ|žçSQßïHpB<ÐÛNîÑv²…ËlKUK“`Êg«EU=œXµ*“—ª•¨Ý·}Ý\R@¦<±À±®÷Þ[ëaÓlTFí£”2~´œÙ…ó .E 13QË d*rTn™‹ 2Å#YiâߣƒHYÙ‰]HÇ–M˜4BEï›@畞Ô= ÇÂ<™(‘%îØ¢ì5Õ+V¢©°JQÖó¸ãÑæ<ˆƒwtŒlޏèUú®–‡z¼Khdf¢0Â÷ö¸Ò¯Üc64$ ¢ÞîÑÞËRÎo‰Óéùôõ÷ÉÛ¯·kßwñ2¡ÅÄ`a¼íþTõÓ\g³5›³œ‹-ĬèÊc¿_¦Œ æ¹ÖRÌ«zo¯÷û·}»K”bólÚyoë¶y R/Kw¿­,¤\fŠFœfu®/<7ZSîÈ,U#"½'¬R]8‹ÔP-#I’”£Ü *#SFÇ+ A4b*ã‡PñPLƒ)Y$©ˆ¤Žl˜¨ˬ=úûu¿¯MÄž.'3‘"ZtÝöüã— "ÿ&÷ -AhIøŽ~ß¼Ör™ë²LÕ¬÷ø¸¯ë>DS˜6Bs‚pxŒ¸]ffò¾÷Œ^SQ+ªÆª4Yê±EiÃ(¤U¤0ƒàC™zü´<îØÀ¡%¡«æiÒZŒà"LÔaËTN³DbWŽ„²Ø½QwòF²×"sa&i-C8iD9x„›‰AžÂe´B•§Ij5dÂ@2©À),‡‰ ÄÉW{yS IDATÖAkQÌÙ¬–WÙîþ·¿_'ýë¿þËç¾>ÿËÚù?þº­›À@•X‰Ñ=~ùûûÿ'Åùùeö¼÷xo÷vï™$Y0‰Ÿ×ù¼4ΑHºgìÅd¦(¾Êý^ºŸŠÊ qP7Ñy2¤ôÜáM ¤-š2O³Pšgî=È8‰U d€2‹ %öIô?|ú‡?þö«LoE*ŸN \,—Â&:Œ³½^-u×Ö5 f•Å<2bp5šj)µX/"toñú~½,šÑy_ï×I_ÎóËóår9‹ÕRk)Èô¸^ß^¯û½Oe^N‹Nöòò²ó™çåt¾ß¯ëþqÝúÇ=#DLXŸ<2$ !!J棭5øÿC=û8¬dfïû¦ÒТóý5>ô1GF¾ÿìæ÷'š3`ëÐk<9ÔæøžüÀ£~`•1X!""Â÷I“ʨ›gÂÓ:3Ñ =c!DP¦¨`b‚*h”B2ž”Äê98T«œN*{fï,Ôã…Ànv"°‚*X!pU-z(§Z˜µGD""Â{1×±Ö‹t¯p¤%3smfëy´"Æx™ôÜ%f5MÊDô)(3Bd¸Ú¬L•™GO8”DDÆÂe<:=Ü3Ns9iå»·})X”aCÿi™µ/ç2]Tçek£k™9ÞD„szë=‰Õ†M¥$%YI†w¢`•éé²¼¼Ø´ŒSžŒÃÅp ×:]žžÖëSö={GÛÈ,¼Gô GxDl¹Sd$¥{ÐDe1fi’ÑÁ(<~X $"¤dÊ Wtõ æ¹.2ÍIhI­o[½ï=SjQžZæ¾ï³ÉMÄ”çIØ„‚iP9“"<¹³lQÌ&!§ÍX/U.Öß³·,bÄcº3Î ”ªÆ<&}£+ŸLàdòòRä’¤B©”&*C’‡¤ÀjOaéá”C½èmTüù‘C&O„Ã3=ÒÃ{w{ûˆŒ¾¹œ&+ ’H^oñÛë;á]M­Èi.—ó|š‹(»GïQj9껈Œ<º9¬,¼ˆFæc_'c{M 2I{g&¯8±£¿OL#ŸÓ=ˆ9šÜœºÃ@T£SµÉX$EHMK)Ë2·ÈËy¾œ¦e*Å$9É,Æš=·m÷ôÃ:È\«ˆÖatŠói?Œz‹˜Qº¤gß½_o[-¥H8Ã:€­çÇußönªÏOË—Oçze%HÕÂcS$,I‰ S2³R“îîáVHˆ9$r`@šïûæÌ:Ív>/* ª×»\¯h*:Mµ>g¢P¡yž‰õýã¶®›ˆ&\LÑZCÒíÞ®·ývë[˃83IÃZFÀÃùɇI,Êbo’} þ‘÷°ûqH&6KÕˆŒ}ß2a6].SÐz®wôî÷{T›žŸNOÏg¡Ia)¥¨Èàn™2 ¡jžªèÞÞ¯·írŠçËi™m9ÏV•eŸPKå3{ôˆ¦OÏÓ²”µGo‘¢²Ì%A½š8gÒÞĨƒðÓ‰Ê×óq7e™ªDPóØEp¢$KˆÙˆÇ<ÿ8ìS­»7:JÃ)†d$!˜‰1¸ÎœA2=ží$ĆwL%M†åµ4Ï}¿_æüòi*Joí~£O1Zž·%ÿ¼¿_ß~å2§¹ßo%Ä÷N=¶=§³Îsi\¾yÝ7)ßîn¶½¾L2é¬2iÛ."*jFUÜÕß›D¾‚î‘§ì’©há="´”Ê$ÈÞ±s­u“ð¶°T›Ï§ÏÍæ»0õŠnsµEx½ï·ž”Ì\çå%β]£{+ Ö8Æ4€7ÄAœÄÎÌVC²Ç‰… $fN’€Iúbi&@xÏî&‚Ä»#ãåùôùëËׯŸÿü§¿½½^'³jŸYù?þò±ÞQè¨g3"”r®v>ÏÓ©L‹e`©óT "öð–1¬Ft÷$&ÊRY˜§jS­,J°PžH`@¨Æ€ô1‘8pŠ)tÜG)…ŠqQš ¿\êù<3#Ó#ÑNIày²y2€nkû¸íD4M6UBo½5'‘brªJ™d¦Å¤;â’¡J¢) a’èžÉ”™ÙS:€LQižÖ L` ½(« Ò3†Y‰ÁB¢ÁºGxúæí”0³©˜[Ý;ÿÇ_^ýßþú¿ÿ¯ýù‡ç?ÿé¯ßÞî÷ÆI*To÷Ûÿûßþøeù©Úgûõí·m{íÛ•;–ó‹Í§Þûo_ýFK™«LÛǾÝûS·³óý¾~¼õûEç©Ôy™š[1ºœØ]÷=”`U¸Pƒ»÷ð&&Iêé™:UUDˆ9¡Á¥{î÷Æ{>Ûü_Î_§?üoÿ~ìÿùÿúº.ü\Š,Ÿ¯î$çÀ/‹ à‘;h[Kå©LÓ²ˆ°X¹í=Ó‘½õ†ôbô±”oo¥N¥L˲,SŠuÝz‹}÷}»oÍO—i>UöÝÁdB"¤pwž Uèqn×qz–±–Ä`¶´q¶S +5"$æT!bÕúÎ¥9ðýJ‡Åv )ä@Ï1ó1T:q,’¢:Ö¥/?d‰ ÂèÈC&,,>1 Á»b ZÌ2É=zx>ÞFƒØ‚š(@CßZ¨ˆ0TH•Å„e$‡ˆjRElÐv"På:ÑÔÙ†™[äÖšG°LÌFæeÁÌì"-¿¼òÈîÞ=܆“íõu‹¾ï³¨È æÑZî{´ÖYŠ<]–mOS!Õã_‡· =^É86€d"åÁ‰P¾ïé&™&UMïÃ5©‡îþ8l1 tGDÄ}÷Û{'b`*|™í4Û\ÙŒÅ}Ý㺶×ûi©?|¾üøå¹<Í*2FÔEÄH5<¼„ÂfV‹5b4*TL†E=]”LsÐ{gfQ«Äá·ûz§MTÆÐ›I’22tÛü×ß®ï﫨|þtÞþðÕ~ÿç§E•'-FHaVÕ!£­SÄiÝÕ´V[×îI=sÛÚ¶µM˜lœ´Uõ´ÌËÌÅ8QJu‘Œèçóü|¹œæyžÊTY•J­Ýa…ßÞ¬­Tç·×÷æh DÈ É‡ ò˜þ«P’‘ˆ§“ÁòÈÈ1Ÿ“î¥ØÑ»óÞœ¬^Ζˆ×Ü6÷e™þë?úúI¾½ÞþãÏ··wh‘|:]ž.çÖÚ¶5Ò”ÀTtžŠ‰GfÒ1‡b6ó}EÄývóÖ=|—/üéËryšÝã~ß½w‚ÔÂ&Ò9„ÙÌæ…/IûÞ×­˜ª™±wo ÷•®kîšc÷˜+‹¤÷ŽÌyJ¨)@á*\§R+s)IXA>>Û‡Ša\1ì˜}à´y,îèe$!Ž]8öðPšd%iB"œj¢ªº{àù2ý|&‘×;oë´Ý•¶&÷·õí×_ß^¹ž•7ëwNO©;•-„Â_Š쥾۴5µõvÚþö‰ïËåbÓä!(ó¤ŠôèÛ}Û¾µ|…\µv „¯ÛÎÑ“(X$2ÐEm.'« YÕ¤SURÖ™ÓdÓ²ìÒÍHG.…;25âyš§çóû·ý}­,³˜SG‚ì$Âw ý@à!§c¨ODZ"‚išŒ9÷æ…ˆJ$Zï½÷Ó©¼<Ïó)ö½õžó\zÄëûöq[ lRÍÌT¦IÌ ÁZ§Ygyº,SUæ2«hk]ö 2ÁQ΀é$˜Í”çZ§RØ» äÞ}wõ’-ÆÆ…\(l+AªrZêe)s¡ó\ÎK±jôC-H©Ê¢Ë}cA/UŠŽ6g*DÕlª|^2#;p&9)©†(Y wtÆQ¾vHŽê$Ü=ˆ²f³J5¡e¦QìA NR"©SiN{$Î’JPaXÙÜÿþºýø±ýôãO_žOŸž–?þ¯¿ÿõ·uw‚Óýõã¿ÿû_þaþݾFöícEßë²ÔË-×í£E¯ÕQ/¸eüòÛ~»æË&§oíýíííc]›z,D8Mòt.§ÓyYp¿íp¿<.ýXo¿~ì’˜Dř̬ÕSÑ„·ÞŒ˜›çö~¯‘§—§K}²å4 KP6¦Î° nŽûŽ%6‘(³2(ÃAñJ‹¤Â&¢ÊÂ=òcm­ SF¤˜¥9ûuÛöÞqZæ§ó\õØj±ðìÑZ#+$"mïë½÷ŽÞã¶®ï·uë€Êø š 倯 𺽧²ý‘9P¾+©dÜ޹ÿƒqœÌÇuüh›™££Í4Îþ"|< é;8ˆyܳq#’Ÿï‡ßó˜³±Ž  þ3 AÌÌ\="LŠÄ0±ª˜ŒV·Èo¯sÝéÒJ%IBfV«U 6sOžœN™AI1üj*TÌ–EmÒÍ«mÙ·Ñ­ Ö]¬ûîÀËüùëþðùÇIK’ÕóSŽ÷Ù±ñçBJDO"hM²û}ï§óV2Û¼5.vªõrÑåbó¬ÕÈ8R#z¢³‰LZf£Æyõ¿þ²¶k;ž¿þîóäñú·Û·~mtƒÞ›#3y¤$õXÂ"Ñ<…‹$X˜Ô4š¬pôl³åÉj ŒI9Œ(¨²(:å[q²¥x̬Ŕ˜ J¤‹$t„‰k%Gï LSµR"ioîNA’T sêq€4"aŠ <ÒÎd$BU™<È׎± öDë>á"œ™f1)wă÷ŽmoûÞY̬°hdÔbµÌ†Œ1ÖxŒôí?BÏÃr`Â0`¶q8¿Ç[äÑu§TÉï§ù‘cÀÌ™ i¸ d`&"ÆÙŠB9ük‰Þ2R Y”ç*ÊüÓó¿ýׯ?~¶ÿõgº^W@kyúüyùüi:ÏÒv3x}ïÓ0U8Ä¢ Òñ&‘eJÓ9¡÷¦@Lsÿ4vBxFÄ>^P*”@k‘‘fõ4WSçxªjÕéÛÁ”Ľ'M•.gz¦((“öæ­¹ŠDLöŽP ´ ®3' DF0¢{N¡»qcb$¥?ZÕãó0I™Dñ`AŒn€ßD#kM1LëÓ"§ª™¼çÒX¶¦~½Ïí>#”ë2Ÿg•vÛ×®-Y™$Òß7ß»c²¸0 £õ\[JbfïyÛö~_%Cg•̶ïï÷õ·Î¼@Ë̘9$Ü3SL8‚#LeªS)&„EÌ[ú_·¶öùDjE¥zúuÌucóu¢í"jA“ð$܉tÊ~ØmÏ“8G0áðѦú9p –¦âJn-•ééROKmmï½!û¶¯»{µÖ¯oW=Ÿæ¯_Ÿï뎈Óõççˆ~¿oD^'¦²ÔRJI’½'î{2NK68¡ˆˆ=‰÷PŽ‘ŽC¹)UÓež«•½yîÞz´î÷µßFå?&S œÆcÖa˜°ê´§)– —E«± €.b6UbÎŽ!¬1¾\fº¯[ïN™Ä\§©T!fÍðîkëÛºö­±§%†¶˜(" !Éegcf2‚"©(q(íQ†g ¨LUÌXÔÜ#’ ¨$+¨ôäîˆp‚Yi¿¾®ÏûíëËéåé’`Òo¯ï[o|/¯·x½óûªJ{ÜS;W›¦ËLowºÖJpñáKgÖÇwº2вò’h@B*…Ú­õ¾ï…y–B­sߟ„t*•©€¯ZºØÞ³&Í=¯0ž˜)iä\ dÌ R¨$2b#SF"V–©ºGßwdˆj1cVožy$4ö@±ÂbÙ»Gv™‡J àmï÷½GŠZQaB'ìÕtžªÙx‘šZ)™œ.€ÚÓÙFϽµðèÝ#"çÂçóÄ, ‘jVŠÊøÌóÈq?Ê‹4~‰é‘?ÜÕã‘ÈE?p}üÐôèè“—îaº@Ï)b¦¢zž8I"Ðz„ÀëžD="§b‘¼mqoÜIî­~ZNË$*µF­jª*:vcÓ0(Â÷´¢RQ+ã‘'ÉB“g³pUϬ¦Ë41sDôæ­Ç †{„›èlöåùimí¶Þ(™jRT™ÒiòXTÇ"s’DdªIÊ:O¾nÍî"DÆdDmïžd‰R-hœ-ó¬6O:ŠØ¦R‹¨pfd€×ëúþv{{»ÕZˆ¸¨!ÑÂ÷ÖÜ#"3rª¦&Õº¶RNTe ) D Òñ$¦£€1„d6&&äxiì-ý}-…#hY¦ßýôüûŸ?Ÿúõõí|ÖZÏ?ýøõëçËTˆ‘·ûõæ±®í4OãŽ}uÞižÌªw¨çT˜‰<•¨nÞ×=TØD1•̤móµ©ÎÜñqûøø¸—Ò–yá¹Q$“5…p/ÊIŠÌ™bö!w „·è-ºs#Þ$‰L!Œõ׸îÂ*™="™‹å–ƒ‚!£âÂÙ•£ +‹Eމ8;ÁIFýZ™2щBUM©9I&’´ŠVFï-Åìô.}½—Ø¿žÏR¿<}úÜ··¿ì·NB6MÄS¸vo­mÈ×"Ë)¥e>)UO‹µ¯÷uß›*Ÿ€"Å¥†d2Q8žT>™× ´±‰Ø’±DœÔ*“’Wʳ€• ´Þ·½¸-ª¥GD§ª……c[{»{XŠ2눳+œIÉÀ0N#)øàÌÂ$ :I*G+:C½_¿½_[`fÄ®ÜÏK) ðªD"àAµžçRA ßáΡ¨rtBüôã§ßýáŸ~þÃùå‡?ý÷_ÿÛÿøÛm›Î ’@f”JE™“<†±uèäx»0)“Žû¸8Í ‚Ñzà.$e_J*SUõ6Èc|:-@PDTOb:¦ZÍTËp“3Eä4U-%å¢!¬ªæû¾QBˆNzpðÇ·òÁ-œ™ÇŽ‚jä˜nÑ!~Œ®×¸—ówß—ð19|2ß{Ã|ì:¨@øŦ£s†ýù?ÿ™‰ÙèáŽäc¿:f"L ÈˆD?>¬Ç_‡H4A;u÷G€HY“âq,F¶áÞ{HŠÌS™ªã"RÌLÇÄî?•:<‰DdV«…»Å¾ï{w%IÝCYºÏËy54ò1™ ›»ƒ lã/.€gbo(xmŽÛw“éA² ¤$€‘ŒPE1«Uö{ØÚìN=J ’ÑfT&9ÀˆÈ°²ZPéB“Ó[ökꤣ ——JäᙤŪ¨q©ušË¼Lç oÊÍWwVeföÈ.Ræ:©Zz‚:‚¾§ƒªª¨¨©FÆz»¾û¶ÞV+õó×>ùÊL×ÛõãýƒE§å,§$Y–sYÎ¥Nª,äŒw®Ûý¶yë ¬ÌM”ˆ<‘A¦zZ,2™DÔ5"8«¥)©(o­§ç˜:æFcö’AœÂ…¥ÈØ÷1äEâAÍskÒ”™Ðz mËe*¿ÿéùÿü·ýürÞî·÷ë͓랑2¾²@êžkÛîc/)j†P¦ób—…߮ё l;]ot_9“Ú ª“€ bRæ¹è²Åºîá¾ï(&EŠ•áHÒ ¥¤Ê[Bø¸ ªšY%ð¾·ûÝ)H“ \GÑAè MàpfF­ÄD{óæqqƨzØ¥ˆÁSš OÆL´íˆf-´àÇÆ›Â;3™j)6Muš“M’é*¾¨ù¶m*SÏ{ë¿üú~ÊëyšõôYêtýøeS9Y±ŠÆØ“ö-ûÖÁPÞÞ“›L¦óLÌNHw!Ò¢RTÔ„­L§…ì´¶eÛ ýè3k­eÕéæÁ òɰ)ƒÑŒC)™xRœ*íáÙHL,InL¬¬Æ•¸^ïõ}£æc/=ŽrÌð(™nÑAEű$A"‘Â!¨ºsvAÍ íA˜+–j}:y€™ß?îç¹Òå,L…ùlzºÌ§S=M{»Ä×ħO§OOË·×ë¶÷­uwøôQîl=×Í9YYšûæÞ»{`Ì,fiÈDë$…(AU·½ï­µæûŽÖ¸»¥ÌàéðvsŒv³© ǘkq$y‚2ñi*—¥0³;¬¨õè-“‘’¢¦*ÌEù4UQ]ÍLT™E4"Zߣ‡píA½³gQ“e."²í¾mÉÌ&K…Âý¨fqÒ¨:Ѭë¨tæÁ}WP’#…{]¦2Yî÷ÖI(ÑÑ‘ÅÁ?£ˆ IDATDMÒƒœ¹íx¿3yæÓÓ¼Ìõ˧sôý~ž[Ãû-~}ÃËé)ä &îx[׫“Î…çòÞCoZëóSY×= 6—ŸÿË×ùnüÓkoøáç§Ï_/é¿B “'u”A‚PÐTaÖzJÏÖz’ŠÚ¹Ð-UñÓ×çÿýßþåéç?Üoøyý÷?]×XÎç—àBè¦%’ (A@G¯s”‚˜¤Lʬ"sÊÌZDá-Ž•¿`kíÖ÷ëÛë‡2y:Ù—Ï—ó锉Þ: µžûîµ”©NÓ<ÔZË„ªÕyžzöS?Ò› ÊÑÛ<8  CyBGC2‰>öRêÎAø¤×ýN5ø¾Oÿþ§È?‚=ÿàCŸ[¦ 9ŒÇ—1²¹G|€¾ûPº_&BæÀc¨³ÜèÐãÑ ¨ëH\ŽV‘0‘$g,:+ŠÔŽžð‘òæÑ›V3*j¡b2ÒQDJ¢bJ¢ƒ)©šL¦Íáɻ˺ssFH·¤½p/Z•u|×…¦Âs‘Þ}ÝzOT¢)¡!BÂÙ{cbÕÊã¬0ÀJƒ LJf‡sÔ˘£1& QT•á Úw¸qDjs6!Sú~o‰Ì<ÛZ{©«0¹Ö¢{r'!°÷–J ± âžÔ¸-¤•eV#+mî^çì­"¥õìwŠi¡Ãd&ÈÈÞA©™rÄÃm[·ûŠüÿ©z³ž9–$MÏ6wÈå[Hž¥¦«4sÑ€~¾~Ã#H€Œ–‘Ý35Õµœ:ù-™în‹.<’§Å ^ÄÇdfd„¹ÙkσϧóùñÃÇùx°ÞœKØdí­­"óéAæJ= Ç ‰±(ËH‡ÀÔÂåà8x—‹Þ@üñx>~ÇŠöN6Ï€€q¤^ ‘‰œ¹c€»@7·Ö(ð0iG‡ÉiG¤ÌIÔl3LL@G9­’67ïLè#N9–Ö”!‚Áˆ‰¾-©[زñˆt"€›éFL–$ˆœˆÂAÕêæ1€;œ#¢6Ww c@J">`L µDI(æ›¶îëf­ºL“ 2³äîÌ)çÄ ÌÀ46¾Ñ‘F&—áëù~?¡{„¹TØðæHôŠ£æç±@x'œŒÊû«ås$džG€! ÆDàÝ›áŠ1f™îQ›G˜ˆÂ¶jÚû¶õë­•’æ)ŽåxjÇã<ÏeÎYÍ\Ý“Ã4 3…©vópRb&xU""J3@)ÒUÖÖZo8ORˆÕ¡+¸ xQ„)D0'NéÓ§wcÂõ¶U¦T23 1C ݉Ðà¥#1¥1Ôsö0o­ªIkýr¹®K½g#‡ÛýÙ8ÒX­[ëj]mžò<ˆÝy€‰IfšSê öUª2pH9RDìÝÖMk3mq w¤ Ë0wWL˜D†à¬÷¾ïoÞ'A¡¦ëê?ýôÂH9Ëu¹æ$ÿðý§üwÿæ0—ŸúùõýÒz—”N’Ý”1¡¶ªÝ×­Ý–Úz„”äPòœË‡Ç£þÁ¥\¿¼µëͶFýi¹mFÜͶð A‹§¾¶åátüðtž3­[í­™ví‘$%Éœ³ 9aÔÚÍ#<@»«úŽRl»JÜÈŒ_‡â±¦S [tD˜2–D]±uhÍÔ=ö&X‚`†)Ó”Id¨.ÂÂZ¯ÌD`î á"Ì4XŽD©äiÆ 1uÆ&¤„è®[‘’„n—åÇþú\š"¾/×ëËËåön(,9ÜH;™¸‚o“PÊDÐkë„9Dr€ L%eddâ 3¡œ¹4ÿ± ¼ÃR08ÉjäÞ ]˜JGU÷k8¨w³È)(i@WsëB*”R:²|¨uþrÁ÷WOD„Ñaø¼Ìîo8ÇÅÉ‘tÇ€›aXÉ4O¨ÝÃÃÁÍT«öÑo4swKÌÀØš™ÆõVß§e.ùá|<JÉ©0á¹5k½ÆâéPZ×ek[mª¦j]½™¹ùºÖ¾u" uS³Á+»‡!ÝÆæ%‚g!' $’RÙ6èfMÑ#æ±æN{óuéñŽ˜u èfAE@Õ[×’ežËé"Ì|ØŽÓpDíødÄÄÔm´`i(ü¦’ ©öÞM­4µYÉ:g! u$aa$ê0BI‰x2ÈâËêM»šƒÁmuœs$q@ʉ #SIzYlë8u%íBšˆÃ 4"ÁÎY ¤»'Ñáëª4c¢4p[ˆÁID¨d2çQô`dÞßÿÕŽ’™ ÒÍôEY¦óÄÁDXU=z÷VÃ}¸ê H’n fb,X¡ÌªA2CQh«Ûbу‚’¤2ç2KJmm}»ìªE€¨ukÛ¶\o½õ‡‡Çǧ§óéä¯_>ßÞ^Â<¥2¥´¦¹øtô 'ÞTÅ) ŽõVk7€’Î,“qîàJ^™”Å|6`ª2µÌn›‡×[µr¦Oǃl›þu[jp)9géA%±yWõ¶5tÏ) Ï­5×1yˆ5 ;!La·À-.TñéÀçlk¡< ´&û¾k ÇØ ©}Ç÷±€»µÖçÂçsA@S#D©-švÝ‚y°Á‚‘WMâóT¾ùæ`¦ÛºjïÄ‚,îæ@„µÇmÕÖÕÌDøx*"Ih>Ü—spÑùŽ„D¦¯Ñ>„{?l‹ŒÖ‡¹¹ªºÚ>×I¡ò  p a$´ J@p@ ;ÐÛh\ׄóÃcþËß^þö÷~½ùO_–_ÞVæŽÐã” «w‘k|ÓÿÝó‡‡çµõËe¹¼ßjí!YPRʉ„àvÛº©Á=¼Ã²©¥=NØ1ã;.a’°ðn6L…§L[Åpµ;\ÁÈ#3—,)í–°”¡x˜ ù0ÀuGô)M9‰¹™7Žõ6tFë]ke ˆÞÛÚºfÌ×¾üõóçÛ²¡µ4ˆ ¬ëº˜K‚9Ë,Óá,9[]]»‡Y.ù0‰Ã • ¤Àf-¬}(ùã\hÐn®Q+r.cõ6C$"5«Öˆ ·­÷æ”):ä‹A7à1x–§çß¾Ôù§÷¶m!ro-ŠøˆÉ ./" ø^© í\vDO‰Ž"¢Q°YZùÃF²Uã[m½YbîΉǹ¸3'.Ðj«>ž‰Ù¶­®kÝj_«¾ßÖe­½j·>”+€A;ö*•’r€hMÝBDJ)Ìð@ìAdM}«®‘`?0(†bt@e—©"{΄LÞ#t'™©ÅÛµÖ^NåÓǧç§Ó‡§ÃTøt:J*_^.?ÿúÅêúxšN§óÖâååªæœx¨)¤TÒ¦ko‘„¥0Ιj°»˜!†›¹‡ªX°)cŒíõ{>Ƕ¨E4D ”èvvÞM8JÞ±ÏL%s˜š*„ªz"*I$s€›ÛRëºùmA9ßÿÍãÓáÇŸ?ÿ察ÿ¯ú±o×ßÿîÿøÍwŸ>Lö.æù|LŠÏNà ÁúáY~w~‚%]_ž}Û K|üî€Ëöåóùø8‡Þ¥jsí%ùü§Cš3GoÛ¶õpÈÒ¼ä7è5 ëZsN) þËüáËŸþÇÿøÇÿüÇ7çsJ³áè+£™# Ç.qƒ!:ÚiÊ8ÞÄÝt#„ÆaáÝ1ÏÈH†€ŠA±°!L쯗íý²°äÎi·¢[×¶8x6v—0@Î)Pæ´xÿ©·¢¥ ãøÌß|?O¯?/íÍIHŠ6ëÚ)qN“wCmP6mmm@ŠÀ’@Z¤Ø)'s›1@Äæ… Qæ ϓ׮«‘#:“Ï9M9›ÓÖ4ü«Ó’ÈÝwf.#‘€Ê<a·nÈÂ+TUÜI"‘RxOlIèá”ã&µn()‘L[ëîšDTãýZ—ºcæôü0Ë`ÚÐ].û¯‘óÙg„G½Ÿð÷U¢°ÝÄ¡fŽª £hÔ/DDö@‹>)¼¯ø{Œ™ÄÈ™"Œ®;Þ÷Õ÷àÐãCp÷„ûTk ‚kçf¨ =Â5‘‰\¡Û謠6S]1Їi@s¦”SÎ'/È=z÷Þ:QIì @œÉÌ{_S–Ɉwý ‚£‘¨#ØŽÝáY!¡ÖÝ\D¥ #ô òW,ü}TŠ0ñq*S×€3½-Ëm­­YkѶ¾®ÕÃ% Î%O§’smõír]Ö5’#ô¦·Ûv]`ka`ã5·¦ËÖo›/›7ÅfD‚áRt ðî;3>‹&F£ÍÝ|µvä®ÀÁ3Ò#bÂþ¦u[©[Δ„:‚&~Ïøúú®Žó‡9%WsknÙ22ƒj 7%†¢ÑÓÃáhTú¢ÛåmŠv8>þüùö¿üÓŸþÓŸ.?¼Å›ŸÓ<¥øÚè à@öѨ§}:ºæà`À€¨ÌŒ¡ê£p‡ÑëõnÈ$BX2戦ªnÑM»6!g uSuœ—ª¡Ëf¦£Ã?ÞÈ=¾ïw”Àl!á¾Å÷ݤûýd¨]G }TFŸâ·óÝ3?{2æN‚Ø%wzÜ-¶pçûìè3D2 }èá˜wÕÿÎ2‡s°°Þ²¶g‡î§†ÁÕ°ÄBJ{vøÞžÜÏ*ህ°µà‰1ñ]<8ISÔ`p@£³¢n€Ñšb€JBrdIÌ̈aÄÎ3$Á¹ÓÚâ²y5·µye3pë"4OÓTdn®kS_ØA5LB!ȃ!ˆï®WøÊÿ ²Ž±Æ=´2ú°³TÆÚ62 ¢ã.‘—a–$ìÈ÷¸Ú ÒÒÍð­¹x;EK„ àN@4Ik ½vã*‡È§wƒn ÈÀ$ÓT惤\[Nåp–” ˜i˜Xˆ©Ýn—\¤µúööz[Võpd5_¯×·/_ÖË[˜5uL…ç™ÚêÔu€jó”-œÐÁ:˜ ur µõ¶8èôP¦”™0«Y §ŒLN܇R|"{œRßbѾmX»«yI{Ýk–¹¸ÀÒ{]–œ§”ÊX—½v)Î ¶NÇûœS)8Ox6öVƒŒÄ^ ÖªÐm|næÃF:’Õ$H‚Ú;ÓØÀ÷ýìÇƒÉææì!¨Þ/KhÇÉ)”Ð ƒ0ÁÀF[€˜­d.‰eÿznñ 8¸Œˆp/ÐÇ|ÀǼnÿD.šzï£É@H»Çrü df„ýšS‹Ý~ƒq7®Ñ‘Pܭ∘˜ðŽøC¡=RMÀ#C3BÕâ>%Šˆn¡Ãøádh»:»u0D BrÜmã]ÍD(%y|<”’¡·nL¬h¦ÝšÆŸ×u]—f=æÙއ’3!)r´Öv„ËÈMÑ=ÑûØDÍ\U{ë5%ñ’#ÐÀM‡O‘qDõMa¤ Bˆç™ #‡{)iš·ÞM»ok_· ˆÓ¡”,9I–D„jyšeÛfwÝÖ:Ïå¸Î]û T.k{»lïïu«ºÜÚmõ¦ȰFŒR&t'S4¢Áì FL"M»íƒcr`2o!~<þÍï÷»óéá8O™kßr¡ù¿ýö¹Ì¥5ý ÄR–MÇ¡‰ŽóñxÈE¬õAn ,§ÓôÔI£Å6„Õ£'¡œ3!/k_k_ª×êAÄs–}|—’€0U¢HDV€¹wïÚGó³ š0C ï¨*°Ø#‹ã”ë¤]-™$!a`4¤(I¨9(ŽªÌcЙB˜˜Ð¶Úº9² †‡#13Rxx` L½¡7$ÏùméÿòË–púôtn½}~½^6{|ÌÏÙ!ÁFÐ DrÊbÓ¤yVÎ=@<Žy:fñ0³Š®ªî-Pݵºÿ¼éßW›P3 %–Éܛ­nk«NaÐÅ9‡çŠØ=šZ7^ûVŒ¦C'X‚«ë:¿¾ùº4̇‘'1Ý3?àÑ Ã80#¥ ò=ÈšÁ”Q<¼¶¾¥–$ aw€¡d.BDj«oµw h†„0')Â#‰±lúùåòüxxzüôéÃóÇ—Ûj Osê­­//õwŽIØûb†Þ™yøŒ|¾¾\nÛg‰8Oò|â,èÀщ¨`.f­µjY0%€\r¡œ"zß´{Q à®`aŒ@¡m½$]>||¦ÓÓü—¿üÏÿ÷_ÿø’ùábš‡|@î ŒÀs(Œ Àà€Q º¹ƒ@ „Δ ÒX  7ˆŠ€^ë ŠD&H„‰‘X†6º#0RU5_7$dDõì{ß{ãY6ZU{ãoêc 7%!ßC8Š{—u÷úÄ÷oì?ì°˜¯¿Ãu´Ÿ|@݇÷\»™×Ú Ó ÏõÝ £ü÷½€Ùñ&ãÄ€L7$cÚõ í]ã³w1}ìw13 £»Ñn(ó{ï!ÆlŠˆÂ=4Ì|ŒfݱvUGq¢Ž9Ó<%‘Ý«=Ô,$gá †-63'©f¦=qG±!Í…=¬öÕ|üŒØš1Áp(“0ïßý±ƒ{€l0Í€±íû±N»öf„4¶˜qÿD¿ŽrÌcôè‰ÓÁP/[›sŸXÙƒ ‰{ò¾üCà:֬ŒÈ!T; ¹‚5·n¦f€ ™²Pò æœ'Ì9½Uí`JY’'¸Ý–××/­¯‡ÃÁ>~ÿ»oÿ‡9Ohös]­Wßn™P $·ÅÞ|½ç$ÓIÊŒ’÷x}oàæëűk³Ë{síàìà Ç|øø=—5Ýßß­]¯Ÿo ¯.™|ë¦ Ö{˜7…Öºµ#áÆ¦ì2'¥ÔÝW³n4;r>—Ì nÎŽP,m ¸€ œw¨ƒº[€™ @º+˜pDéÃm€ <̽£BxD寧f`†ˆÌÀˆn} á¶µmk·ì™C&ð‰\ÍݺºÓPÜP„ ^Å@ÂXÝ7=±×û¸¯üŒÁ¾Üs4î_éñ°v ¤áT0÷4öcù5iDÄ;ëkW¨îéÿÑ' ÆøšbßéÀ¯ ‚#¹=e@ŒMÇ<öTÇžvP®·õµ-ó´=<çCʉsJìFfc»A8q kFû›JHˆ4¾ßDÀB<æŸ6ÆžƒÍÌûxn4ShÜœwF2C"!‡@I ݽwÛ {â$Ó4¢;Å! ŽÇ¬fŒÌÂ]u«­m¾­½nÕÜ®ë¶m¯µémíëæµ†v  €0«¿ á,L”P÷ᣛ‡)AŠÞÛ1€À‚8f¸àR’¤)‚·ênKTÕ’3±œŽ'8!3wšŽÌÀ %QhÔ¶¼¼ê² 9 0²Z¼ßZÜ:„õ®`@;§ €¨G¾51÷÷÷ír[#âp(„Gs4b!šzQ $t®!¢ØÃÁ T&pÞºé=[àc/u\à6FW0ËÄ’c2'Æ"ˆèŒ‰Hxx:𷥸qu¸+ 0R"¡@´p5ßçµ8zd®'"¡Ñ­=^Þë¯ïúü8…)>ÏÕ¤ø–u¡ fãã!kâ^Ùô ö˜xÊâr°8è„¥pYß¿´öcÏÛÈè1JqÀMë¦[p”œ¥¾wc­€¡ªZ­-Ñ0>àá©.£åíõÖÄ=‘€E œÈÁé®Ö-ADq&Rcd v$G&@ SëŒ(@É`D1:–D¦èf¦–’<<Öí¶ÕæîàØ›·hMS4DL‰EÙ-<‰ˆ¥yP¸Ýôõ²µVÝ=IâL Â9sÉ‚€sÉçÓñùá,D ¥5ûõËûmY.·môÌ"(J–¦]M§IOù|HÇYN‡)B.7u›Î'|þøèQ¶¿|¶ÖÁµ§ ÛæÈyJ¹ÉVíõº"@IÌÄ’2aöèªÞ½/µÕÞ¬÷^Íç;q IDAT=ˆ‡Å×Ñ5ÂjÑB$:Œ%‡‘Ïí›Ê Üó>þdÏ­ãý6´àèÈÁ<¢äcTIæ¸ÖÎe\oî’("bÒPc5Sµ5 Ì‚—!ÈT÷ÞûårûòåòéÃÓùáá÷¿û¶Õ¦ÍKÎô$ù»™à}³Ú#H;ØsÃNm=Ök¼_l«ÜcÞðA}¢¤áv]oôSÎ%Ïžœ DôukšHăÌ<‘§PEk§OßóüíïXåÏoûÛ:]Ê7óá[EoáûƒpЮ:‰ÐFÕ»e±÷ø!ˆ&$F 0# Ó §Æqâm9YÁàp‚`î§`"B dIâá­ûXô†½û~ÏéÞùû€ˆèü-|o)#ìôÁ1¢þÊî@¤` µ÷±ƒƒ0®{‘0Òö»Öd¤öÅáêî4îŽ÷Qâ0?Ê@õï\ñ=0®´Á½Ý+½½²ÇvÜø0»ú~„QÇ Ã=÷¬ü]%°ëC|¼lDBHY $ÜÍ,€|,§cЂt#„z¾ÔÖÕ{¸Ã| žx1¹lÐÔ˜Qt°®a x,’yDÓÕ¡ tbSíêŒçCž„Ã×.s…óÚ°6ØÔ5‚’…Tuª:&ذgưÅÞ‚$FtEˆˆ‚kó­†é`5‘E(ræk½[«a8׎fž3%—faˆè½¹„a8aÜ3ç!û&/ (/íPÏû†Ï}Ä{u‡À4>ù±é;ZÛÌ$.¶/Œaˆ`¨Ö“ßGޏÛ?`ºE8„þ6ÏSD‚]ŠtßGrߥU0¾·„ HH‚Ù)#Q0 Sò0€ª-k˜±¤DD1ÚÛÚÛV—Û¶­í|>y¸ »$É”[m·_ÞÛ±õ®îˆËZo·Í@›@çy.ÓxxNs¾mzú89± Ý·AÃOÞ¡½ a€  &æñX…ð–ÎTóf^­àétœçÖZ]n·ëû†P¦CâL§óÏxþù³~ù!!:S „gò3T7ÍœsÐõŒ>Cë$O’2›S§”j‡7ónëK€F4„NH¶¹ß+'œO9òeµµW¬†Ø0›n›×¡ØÝ¦žŽU½¶Ú׫'R&³aàF¼'^wçO0 ã X'QŦ¦A)p !÷ÖìÚ{K³dpS5ÂÞm¹­õ<çÄçÓ,Œ%'¸ÝÖ®ë˜ðCМ Š!ô®ëÚn±-ë6OQŽÇÇ'%ŠÞ;b ©„ööÖÖZ»«u;Îskª¦Ó”?}x:ûVÛ¶m­÷ÑÜœ óÃy~z(§ O¥HS`Šœ\=~úu}»Õ­&!g4%„œóašaÛ¶Ròùp<ŸÓ<Ýní—_^_^ß8Q™ëZ·ÖÇ–¤£; 0¡d!`‹ëÖªº3O9•TÂÁ!qB ±Ø›7`„cš{WhèœF³Æwm«¹îý°A‘™/«¶M%qJ,ÌD€8O™IT½©­MþntB€Þõó—÷¿ýðËè»Ï®ýååm¹-Iýàxæâ3RrÛ´j¿š®D8óô!S&ûÒéåb¥ãùIÍ··Í6ÒÈ<ŸRžr •PhË%£??>qyþáÿáŸ~ù?ÐkúäòÜ)qàwq#Æ”GiÐÂ!Ó\5ª75Ç  )¤8ˆÈ»A7ãxÒ2…#ª°±„;3{OÝ8»9’ Ñ”…Ã}ç^egÞ·÷FJdÐ~ ˆÀ>Äeùo@º{ѾÿE¢ä?*Óaîß5‘ÿ?Xç=¡{_ƽ¿¡á¸K¬$tDvqX E¸{8ÚØKƯó„ÚSûBp|Jïúù;»4,`?WÀWºèˆê‡š©ƈF¡;¢#Òy€š{ŒXO ™™ù%fÙ!W#[ƒ#£dÝW_ë@NÌ"I´}ÊÀOO‰¶ ¶†MCÕ˜i¬ ü=rì‘+S@â”ф̠7cÄ,# ûHnçÉ aß×3ö±Ï€æ 31;„š;"t$ô‘WaD"èŠJÉ;¶D ŒÈ£CÜÐM˜€=b0ÁMUµ¯Öh$„ Ò4OS)`ÚÛ¶¼¿öVLJ¬½µºõjœ§Ç-':Žóñ$m[¶·×—¿þéýÇ?Óö>£e`€°­—roEkÚëÐ)»Æ¶uA²NooËÖÞ>}{<=?ÿtµ¾yÛ&Ó”ç§çírÙl²éÀ§é @?^.—U ><žÎÙ6ØÞ{Ý¢y@^W_×õVýs¢IäHò!M“bo­©– Y*þúÒ_¯u«Ú=„ °›c3Æ $&µØq`F…psâÈ‚D»Ìúîf½«),%*Y²‚™+!åœHÕÔМ,$ ÂZ„ÛuiDD$ص»kI@L%áðàí^§¸ÛÀáÞ= 1ƒ”{uNãKL`na±#j91iìeB=9 WÇàˆßaa膡»Nl„~“ãÝ)¸ƒÌ†${äÐphk CÙK Œ7@+ÂI8Â[ów#ÜípL§ÃÁ#ÖµÕf[³Óe=Ë4qÎÆ……³U{¹¶eYkk[«µ63gdsX·þ~ko×íº6€8Îùù<K:ÌåxšráÓyúý?|óÝ7‡)MIDR„99Bd#˜1ôØ5dÄ)MŒi–Ž ¸ÇÀ-¸™Ûñ0ñ7” DXxlî’†=ñEˆ€Öu«{_ðõíý_þö÷?ÿùï·K]7¿,zÛ¬6W)ñÕNs‘yJà¼zôÚÉ À‘Fþ1È!Ù¾•äB ä@€fáH_nþr»Ü„ðX '#ÒùP¾ùôñé|"×’è»ïŸÿŸÎÇù|˜Š°©ÞŽ×µö­j­Öšv…® )13ªuB<ÎÓÃéк¿]õË¥/Í“ƒTÕ¥…ß:sÌl9gá"äf±mÝÜ9ç<Ïó$ìn½ù"²mµkK2ÂÝãé%fQQ‡ª7ÁŒ@…zI€D­;B »«zíhan:ƳN€H(ÄcHáaQ‡cèÄBæ!cod¿¯;Bðpêi¯ÂôðPžžKF¿½±n¥L¬·Û˵ÛûwY×cÎÓ ¦£ô k'Œìkô8««Û&hæTý™Í§Þ6";N™UuÝÞz¼.Úìè@L›õk·«‚Bˆ`!,=­÷¶º&†ÕsÃxèææŽ1{þfóu]~N½tB2LJ ¸c Ép¢Áû$ð€ªã…ñœa­~©Öœf”‚¾uÝÔB˜J&PG5Š1Ë!vôÞýõr›f~~:ç|HršK¸Ý¶ÍMQ[(«#³à€àÔ­½½.[¯€>•t:æiþôáüñÃÑ\UU›ÖÚk³µõË­¿_·mm¯ïËç/—§§adŠRò¿ý÷x[¶÷ëõýz½^–ãA‰Ò}x*þÛŸ~úOÿïŸ_ßß>|[šA ÊŽ„PXÌ-ç$›bb”’„Å,¶6ðÿáLÈÝ0È‚Ü ÆM ˆ"8Í#@ ì~¦Ý½ˆÍ¡ºç@N9#œ˜‰ —Œл^×Ú›„yG'f ØÖúÃß~vÓo¿ùPÊ”Òê±4·ëöåíš$ÍEf.ÒÒåm5N™ËL’ÀS_´W0Îyþ$òDм]À}±ÎKkâ+Tì_Þy¹d÷)•tjm>*NyÓõöþtšæç§÷+ÿûÿýŸÿ‡ÿõǾjþ”SJ¶"0@"èMçR@oªŒ£6côp·@ ˜ƒÀ‡À¤Õ`cê !HiÜÙ94‘ :BïÛ¦„ÝQÝ9|B$7”QÛÓ}atˆ°ö•™½¥6Æ@;E÷®âÁûcäc%ŸpOá®ÝÝçc¹+b×ÒâpÒüÆöäÝ^8(£dÃ}´ÃD€qÏÃo¯w xü¦øWà ·0ó-I0~8ú>;w"ÂÁ ’pä!uU °=»àÊÌN(jÑÕ<³ˆ0 €;áàk ± ®Ð¾ÿÇ0ïͺ¹zé\üá‡91“Y˜‰”"šÕ{ƒºGWDˆnhn­¡gÁ© °<„u …Þ€Ja²9³áâ¸C}€F‡Ÿ‘Á"ˆQ(1ˆCtíª†(dCÆ„"œsâ@Z›©†ª“19²îâu&IH¤è[˜–ÈHÌ®½Uu%—5st!Iœð0OŸŽŸž9Ëíz¹¾}¹¾~³ùpH)™ªÕѰÎçyþøÝ÷Ó”¦D‡’—ÛúÓßÿþúëÏ×_|ÿá/ëÏ“zKˆX9MERB¥=°)‡ùåõZ—Þß|7µ½¯¯·ÛeûüåÝ ~ûð­Êü/ÿå¿^øë¹Ð§ïŸø»§Ã)§sBÊ^•H¦‡c¼´uzQd>?ã·ù¤™º¾ê{z[DL%—pøòåýíýæ˜ò4»³6 ãç2œƒHLÁ÷/¹ò=|²O¿*?F!¾¤wW—[XØÞÑ$$GûêA`¢»´s@Ði¸@î£9Øi·w\×.ü¹70þ?ªÞ¬I’#ËÒ»›ªš¹{xDf"TUOÉôp(ÂÀÏ'ò•äP„”JKÏpzº™«/f¦z>¨z$< ‘KÀÃÍUï¹ç|ûÆÙG ‰p”ôt!E¯ÒÄ@0† $¬fÖw]ÂNæhŽ[ &ÏÒS Q¦Ì,jzYjkêæÄ;ɤ®dÈL’È‚Èt­êQ5ªÂ¦´Uîþ÷í’Út©òzõÐRèùåôü‡O?|8üðéÃýñn?'ÎÜ·æD’…„ÐÜš+¸Óž 1u£Ñ (Et¢FØmõÚ[V+˜I˜qä¶Æ†×=¼à×ëúúúöv¾ž/Ûß¿¾þí—¯_¾½m«·ÆË[æ+ƒî‰!eœ2e $bÄÀÀ#$f ‰ BÊ æÚkÉ{$¥V£¦Á¾V°U[Î A­®u»|{9]—õÏúáóÇãn³|Þ—Ãn:ŸÛº˜!îï¯^!änª@\J¾;ìTdÓðúR·‚ˆhNæFLX•LÌàaàfµÖuà H„§’‰™µ•À²jª¶­µt®æîa }Nf€ÌP¢õc`s¯j¤„Èj¶m†žq.œHúÛãväÍÓ ‰‰Ì‘ûc8°¸H€ˆŒ‘ÑÔƒ¹”|ܹ€µ_¾¼}¹>ý$úÇIîwÙóN‘g¬‰|G6 é¶œÍ'Ô°Å‘SA²ÖÖËåE¦Ým=Ÿßž®u‰Ì`GòO%ÍŒ—u}[õì\1¼?hÖ¿ mEßÂÁ ¥¹e‡M@©–Ù?´üiÛr;¿ÑºpfR`ƒ Ý ôÞ!€@9¬n[¢&”B›ÙÖšGr 8H@Â`4 ä°î!ŠRÓe©§Ë:MyÎ"‰ÃØónÚçTJ.Âäuݶº]®Ûõ²]¯[Õf榭µýnw<ÞMSîóŒªm[»®ÛÛy½?®o¯—ÓéüÛ×—·Ë"B%ÁçOûý”D—œQA›æ”s.)'$Œpoaæàq]êëÛúvÚšÁnžöwón'ë¦Ý6n[ÝÐ7tÝM×å°l[ˆËår¾nÍ0Y¢/°Æ/s蟇»9C@¯ B§]IX·ÖLÃ0\ºÔ‚†nœÌÀ#ÈÑ™€¸§œižÁ¤Û {3n U nBDŒAÑCô‰™(Ÿ!Zk—«åBI0338\—õ—_¿]–UR¾.ÛuÑÄþüzúúTû»œ<Ôi–$–ùÓþ#´m4¿˜NŠC1ˆµâêQ¤jM¨j¯/¯Õêá°EÜÿüïàÿñoÿ×_ÿ÷~ü/_í:…w9jòê˜b¯ÌzYTgXª"C#¬ ‹£8 ¹ˆ›*:8Åø–iº2Y?)hœÅÒ)€Ä”™poÃä pïúýÙ|úØ!¸ëÃÁÑ…Ô[ÉÔ­¡ì{ï ´ „x£ÿmÍ0|<£ [‰z;¨Ãͽï5Á®ï- ƒ>Ž°Î—Å›ág8ñ†"Qãxï Åá¬ÂnH xÅàþ{¤ú‹æÀ`½@ðj€ÞCÑ£f6|¶H=Í0ÔDìMA6¶¶¨@L@V«më:K 3“ B!gñD@NUÁúF‡°Äb ·@«™J)ÂâhŽˆA`®`.,Ø1x[“ÀعQÜzæz„p½sÕñ½Z©ûÅ„9,Â0@ ®[$Yö† ^ÕÉ‚112RIfa­ç-¬®ÄYÜ몭QÚï§éþðéãî°ß.—ÓÛÛùíÙ¶u·ÛO¹”2¯ëR× r–ýnÚÍS*‰Á¶ëåù×ß¾þ÷¹¼<¶·G?=Évۥ﹜0D@²%L“Ôëy½¼^.']¶OÓýÏþÒþíùÿ{z}®Þî~œÖëùíËsýözüxH î°èB± o@®&S¹ÿ¸ƒÍ4SEÝŽB` ÿåé\v÷e÷㔢7|£ô—óú´µ< -UH ]¤äéznO/—ËÅ &Ά‰ÃÇ{›"Q"A£PwU€,Q2f ÅàžÏAI”ò(Ør!¿un°y¨ù­ÝÜ»U;(a81€©y WìÅcA‚„,D„Ú²A GÇÄðƒ¶×˜âUÕ›9‰0#2C@¸†™P$A!`Øï’º¯Ë¢Û0qʈDAT={mHmžÓ<³[â\$ vlt N‰ûÖE›¥œIòÛãó¥jHÿRƒ"$ G×?‘yD/ G `‚á½b<jsï¹n‰Rû}v$‡0„¾ÁB&ö[…N;Q?ÜÃà2#,kûöê>«Èôp?gÜ-X/×óÓ›ñöáóqŸÙêU›c8 iJÀ[«æe¯„ y€¶m˲Ym­¾Õí\Á0Ý}ú˜vÍøñªß6¸$ªÞ¼Åº5«fÀL Ñ\É}ò¶óG‰·Àçü åÏ—öay|ã—×]Û©!+ "q8H ˜BtÔ…#"±@ìÕø²¶€˜ŠÏ ®W—nHó@qFBéa&$wˆPTws3ÜV½\ª™30ÞÕöpÜÝöSÉ"É#j«ÛÚÎ×z¾Ô¥Öf-§”æ9²n×¥¯íp·ßï¦yʇÃt¾mÕš_¯Û_ÿþõ¯¿~Ùj­Ík¥Ý®-k5Q÷ÀAÊ’„˜€½ÙR H’”™©¹YRÝÌ#D(%ä¹à4g@Hˆ¡Ž¯çxµv¾¸Ã)à[@;ìyY—yæ2ï§)¹iknÖ1†ì  æv+lŸ&‘Ä­êr]Ð5KD­Ý„¨vk#î7p ÅÐð¡þPŒZWï ‹.Í õf@2BH™“¢¶æÄÈ…ˆÐ<Dd*²¬õri×rI»)Ñ„œ(Ôà¼Ôk{#b÷X—-‘ívéíbo'£0„&ÄÓ¼ïÈæè€.KÆ,@ì Ñ£9ªJk“Ö£¿6VâR>ÌÓ‘.lÃs^ë5„ø¸ÿ°NxýÂÿË?]ÿóó¤óÃ4Ýz8pÇÝ!"Pi¡º:¡C£lÞëj­ê9$EÁŽŠ¨Šdž„1A8Eͬ™zEeÜ<!‚€ŒY¤_ÃzL¿Óâhâtp·÷ûºwlÌ ×ѳµÐ©úÃ]ƒñ½è÷ÖÃ5îóÿÆ 7H×€Þ´ù&jÿ÷(Èø û%¢GA:¾2nå?4,¯7cq—GJÆò#yè_à%èÞG‡`?ó llViìÁ{7MGˆYØh Ã2A9fì_žz !Çè15ïhàèg/vð!'˜„ýíõé¥m5VE”D8ˆÙ™œ­Q]H MsÅØ,•ÊuYÚþ´æ|œÛTªÄa7Ú{||ùò[½liÿ>¦»9 Ø9TÝÌ °yË v äãäKÅöš^®åÇÝ>ï.~ùzyaãŸø4Ï»§ ?]¸®žjÑEõye*¾+êÌÏ•^71æ"„x£Ö6ƒ&Ê E=â®p†¶.k 'I¼Ÿ¸$ô浆[0`Ì,Æ‚©×^cDÙ÷0w'6pµOŒˆjAœHº9D0E¿@5ëÑcz/ $ø]á¼ïãÞû»ÇѰvåà °¯Þƒ†ì„~S†‹û݇×QüׇBpÀ÷ãåOÖ¥lB@á>ú 2÷äòØÎá¨+GBHDÄýf€ªÞäÎŒ· ša0SÔf/oËÖZ™…MÝ›ƒ£›5 m¡Íú'F§0w%–æ´mm«È=œS·úòºüúõõ/¿<~úx÷ÇŸ?~þá¸Ûψ´ËåÓýÝÇ>@¦Ì)‰0õï®Cé#¼B¾ÜKo½K)<ªü¶æto­i3n—ëúzZ^ÎõtÑóÅÖ5ZsuFvÐ`‚$!)aÎBŒÝÑHD"Dn@Ø©ÒÀN ä LÈŒÈàáî„s™KÉfv]ÖVd¶Dºúæ,yÊ¥$ŠðZ·u«—µ^VÝì­5#"NéÓÃNÒ4•IXÂÁÃ;nU Ù4„±µv]®€€,‡}y8mkóʉ¹Õ¶T4ÈnîÄXŠ@ ÞíËá0O“¢0眉ê†, ­¥mÕË¢D% ºÆeØ ®Ñ÷%Žh ˜! “HΣÛœ¼¯·†²}뵉þ½ë„ŸÝŠñ“-ÀÙÁUzèÉ".›Ÿ’ ØLq¸;Þß}~ÚâõzE™·ÇµM¼Ì,ìTª;q¸xkˆ.ÅÒä"Ä(²mÚ®WT_—ö«¿h¬oæ†,;‚= oíyÓÇ߯æÀÀˆ-pr‡j¨1’Êá„[P¥Ã*ŸÏvÿøl×í _O»uÉFl$ŽÄÀ;ˆàÚÅÔÞŒÀ@â17ç˶yXNXÄ´^B P„ P+˜‚ˆ-"À› †»ÖV͆eÙšš»™7ô bafaII$ r‚oˆ IDATø\äþn§Óòüzþòõ•™ï»ãÝîá~÷áãÝa?MI‚¼$®ú°Y;®ªŠHĹ6hMµ©6[×jêîÐ\»(ÊnB™;œÔ}ݪ™%‰9Ç\b*4ï2bäY·ju³Ü]ë|ºæBµæuÓR `[×u«µ ñ Ù¹3½3d‘PJ˜÷ÏöT9ÕP]M] ‚…³ˆ¨×Ö*!G…»YŸ.„ÁhFÊhd nÚþ ûôŸ=°?8 wÇ¡o£kÇݽïaøUûJ¹S:vúV úÞë5„vÄÐW®£[ÔF0‘o0¢ap §ÀÛ¸]™¿ ŽˆaèDHF7¤(POAô÷=å¡Ñ CÄ@ÔaMïé„nÎr @p54µ†“§ÔÏPf!F’$Äl´m›5s»A#"\s‚#'7»žÛõZ┤wF~'µPÌ­] Þã¼ÔGñèei0øh}Îù>-·…0ˆ"š{Ón“ŽÚ4^.™±d4ê¡gDJâºÕ¨«&7S 1”jýe`L„FlAËu‹åñúü¤u›ï?|¾ûôCPºœN—e©j)ç<í‘Óé²<~ýöå—_^¿]ϧuk—Uëù²Sûiÿp?§.^x3ð`×Ê„«oëõM¦iÿðæYЖ½µx{\ˆÍ¶iWîç©„¿üúúí1òñ°¤éëi¹kp7{É™K f»\|ml”É©ÚL^À‘!MóÿîòÒÊ®ö;áe«õ r Þ°¨‚kíÍÛsn ŸUÏ×zUž™ ¢…Û`@„»iëјj`à^(¡  &¦$2q‰upJ …‚0Xˆ$AD £ DŽs³È# Ka"òn飦D¥Q¸`@pDÈ`‹ò¨ùŠ>È;ݺ£j¢_4!ˆz!a‡½ÜŽ—qûïî"  >œÆx{Ë ÇM=€·fn|ÆÑ¥‚Ñk€oL/$` "Àáô±ÊîØ2óWbÐ[P¦Þ_Ÿ¬µµ ­´¦µ5³0ƒjí²nt†þ F€›»ºš›ÃVë¶Õ>nÄ0¸ºµ¦¨aÎVÍšS/B$LÂD¨Ö¾=½=¾œÿöëùnÈY tÊüÃýݧû»Ý.§œæýtwœŽ»ûôŸdšR’ÎÄ ËŸnåE& À0‡žØ W­ ÑœÈÈAA$Ž[k§K{}k§S[Woн…±wºåÄ%SNÀLBH½˜¥³FIۭ΃@PPL­¯§›YÓ° I9•)—„àD°%LÂwwsNTkm$©'¢ 65­MØ´áãSüÀu©?¾Ï9­-(1 ±÷úHx/ÅJAk­U¥TÒ4—ãý¡™±d&j›Êµ­mƒ0F@I)e¡y’Ã.ïvsgm!"OSI"µ)vé¸O½¤‰™«öüFñ7ÁR°Gs✘;Í-2c0L‰„Ægy7×!vH u¢E`ï èù6~èÀïÌw£>±™W 2Ç˲LóáŸ?L-ž_¾.‰j…ß. Xû7¯€‹ìV ÓV‰0g^©ÔHkˆ22hÆ%ûŠn€2-åî->Y~¨òÓóyùö5¶oÅš$G@tAÀþ°®Õ e †é= !j¶¬îN"<§H±iN8gÁŽÐ_u¦žaG žµËém;ŸNOrØO?|þøp„ˆV›¬U…óÃ}ƈÚZ«úåÛKt¸wcDX¿ô1I$”rŠðóeÛÖ­ç¯ëfn»"ûéîx·ÿðñ®L¹5M‰v“Hb5gà’‰ LõtZ¶ZM­«T£V­U͉û›ÎÃ<0ºàéßi»0M9ÌÕ="$ 'â„Ájnˆ½tÙÇ›Æ{D?ƒÀÝ݆I¸ï§û“Tz +X« ¡Cœ Y¢išJBPDàãaÀëZ[kî®jÄ"Ä„Ñ+3 )D`[íñéüÏÞÛÃTÿçÿXþý½ÆÊ vnaî`)—¹ä’ó¾JÔöºn‹ˆÐ|šŽ»TÈ`»VfNEÖËå|~jU¯«AøôP~ò4×ýõõý?þé?ý¿_à˜ŸÃ·p–@²®†{¦@Øq9H„…ô0)hoªv‡0Kˆ™;SÓù$6Ÿî¡fÞÁDHƒë†Aï™ù !ÇEŒ@ð­©w0ûn÷åÏ Þûts•ß²½øoC¸ýøÇwÔ'~wõté ÌÝÍs3n¦á÷«ýí¯Ÿ1¸iýÞÐCÃDøn5ðèõVÝ`Öa£qÃQuÀÒ NÙfïìЕdBá^_6¤Æñ¾d'€¸­Hà?ÀFÇ[I§’whá°YÏGÀ@oŽ—£¯ ú…¤cFµšw̰!Q&éådB)SSÙšª†Eô$($a¼Ã¤Í—uU…iIÄÈ·*ƒÁH €è«’±è_Ë(Kô^1Û¯X=ܬî7pÓ-IMر£¦fjÁ$LàZë¶­+Þ%&§&'p0" W­Wض=À$ ”"*µYÒ´;Öæ,fþüö"Hs™>~þéþÓ‡ã? ”çÇçÇ/m]ˆó|U|ûõùùåôöv:¿žß^¶ëŶçÅ׳ï!Y¾ÛössÐT"C ÐUh«](?‚c+—¯×¹žHø²ìÝÄCÕb:Þ¥œ%¥µ®oÿR°ýᇻ<äûÂ…Ü›.Õ6ƒ¥‘ƒ&¶Ã.íæ¬u»œÖØ}øøãÏ)%nmçm®1¥”ZNWÇp{ðó䯟sºÛ}úë›×óy[ä=†9‚•”Jè3dmµ*˜áõêmÃ}É9M;¡»ˆÈ¼§T< ÏžÎäDÈÄcó½ùÈ­cú)"Zr5@s s·‘Ë `w Dfa£°.w„¸!0"߸æý9~ßFÜTüþp}ÞͱßùãN9ÂÜGóγ£ úÎà½^ ¯‡1€D0u·Aêuw½p ë‘HÙ,ÔÂÝn8€ „)K™²yœ¯kÓH’„)¢©¶g"g„ªÚ T£ªš[ŸŸÕ ™©Z¯[•7û6c`„;4‹ïpI€èc!äÌ)QkÍa[7¿<þùO>=ÌÛz}z~­-„yÛê²à\»•”æ‚„¼nºnµ©–œûw,¥t¼;D óUMÕã|ÝâËËé´D@­MÕÕ™»y*©¹¿¼¼¯å$9ÉT3:3O%MERsx}»¾=«Lþïžôp}y\ÖÍö?åygîPÍšªÜÏ”¦²?bÊ9§TÊÃOÿ€ak­Ë&@ö¿Âé³Ϙ 0òƒÉNw§‹þõõåÙ¦rÿY°8†®«Eq’ÁÈ'ð`p "AŒhBé ÕSDjÎbH>â-#šGe²Ìœ˜@™#q#…C ëÚa0Eb`î[g`&¡wÌgÜbDСï¿xÆÿîÂþµÂŒ“|€èf?üÝ/À÷¶¯â¾{¸Ãí)57ïÿzû5v3 téÍF®wø"è†ñ€ Žê¿“{ßýõ¯…ÀÀ{ü7Þ¼ûú1VÃ!L28c&¦ø>v8 G·DQ|/>¸ûø}j‰…)ÂúZûýäíÆ…‘WîðPì„ÖÎp7Gƒ$ì]™DȈCnͶÍÖÕª;w°É~Ê™e]uY¶fFŠ,Ü%FDÄ@·.ù ¶ò(CóRtÅ“†Òz‹AñóPYÜCÕ Fë71 !™……uò"Fsƒ0U·Œ™3PÈRQµ…CΩ$²!b€f–æéãÏúéç?”ý%N×_{úåo_ bwwGZ—§/ßžO¯§kÿÎWº\dk°©TÇ·¶^žånBLœîg<&ÞãR¶ ÚB„3e¹R{–0KõZlÅ×ëõôXËD.Ð`Qóþì‡OŸ$庭×gUÝô‘‰ÊnÎLØWëØ®‚ÛqGå0ak¶®ëZi‚9K™šÝAù(å›]D$æÓµ‘á?åw0§5 êÅÕQúïK˜„3'!aˆàóbçÕ›ckQk#äRJIä¶mëêžîŽ»2¥ÜC4Ý~kéíÔ.ôp¢@"gpİUU3wÓˆg¦,¼ÖѯåáŽD1¶Ã€B®L½ˆç“ è‡h½kßU€ð,´±›Q°ò½y¤+ÅC®è”ˆ\ÏÏð ñ»…‡ˆ ˜;+Dsï ¢ˆ!êŸ ] ¡èó ¸Žý E8B””>Üßõqù|Ù¦IvSfÊû9ßßßïçÜZ}¡ÐðjL„ѪÚÚFMù` Õ¡ #(_=0EBõ"S'fŠw% AHަk‹fèpÝ^ßÎOOo_¿¼ÓOŸÿáÿð?üãïs"v|Éh„Cû€3?Éô3©¹ž/Û×ÇÓ—¯¯O/çeµÖ QˆS3ßjÝ6féu¨®£ið÷¥ö]‰±¢í"Î|NˆHêÕZ=‚äÁÂ,!­m¡4ËÚ.«©"BÇ<åãa^·z]ššÔjµ-O/ç­®ûý$” ™{ôá6X~·Ó÷t ³á.%p‹°,œyšEÕûwÄ5\ÒÍH ‘² CÝ´ÖjæÌ„ˆ‰ñ°›˜ðÁ Ýñåõ ^¯K¯l`¿ÉDÄ|;ÜÝCÝX’ã{ æ8¤qˆ9>(|áÞwzн±·ÓÞ͸ýýDý‡‘ˆ§sÂÄ­Q¬uûòíј—Ë |ˉ§y? éˆß$!a2)è 6{sbaÐ`*ÙJ"3q—ê×ÜYœd t¢”ù ¦œQL[q›2°€Új¹æ?øü'‡í‚¾I†4Q0@ë­T@ý- îͱÙ@È :X²—™Úð b"’ÆTwçš¤ÎÆzw'ôLj0á<å>üüðáán7 ¢íÛ.©#J'z 65SGpX¶æîL„"%‰ˆD #â”ó¼ï¡¦ÄL8Š]6µmÛÀ]ë6—\k»^®çËF°›KI)IöpfÌ™Ræ”ØWÓê[ƒZ#Ðm7I™X˜öû"‚Zër¹nkUumÎÔDHEH’ ˆZ˜°ó˜cB˜¨WD†w ÿ–•Š€ðB2ëº*P‡¯»;䄌Ԉ͔ D˜PÜ¢Ö¸²r 0a|G/:‘21á–iÀ"\ër=o3•ý”$©™»™¥^1 Ôif6Œq Õq©!nÓŸ>ßÝåËút¹œ2||˜ „ÙÖlµòõx?ß{b’TR™ÃárzÛªA™¬QÎi*4͉Ò¹<^ÜZ{«¸á´ÿðÓ':^–ízݰ›]‘yèÕÞ‹=bn FŠ¢8!fu°¦ä# FdÆä‰"0+’1w(6 ’´PHÄIX˜û’™¹kßÃú.·{éXصª¯Ûo3Á(/Œwdä­¸kþ]ïîwbÂïbßnQàïö ¼•ö|Ïáá¨Þñ4š[ÇÖÀèƒøû¾*ˆïA‚ðq€÷V²›àØo’< £ý?ƒ›õ»{¯§ë€QtY"Fïew$½Á̼½Ö}t:àhµë', Wn|§ozzß’ŒÊ$ìsÅÍÐÌëÖ*C!f$DŽ` ÆQC ã=!LMÒpvðCAG\l´õkÕøF ×`ç, ‚0y¿ t3¸zë‹ÿÀ^æ›ÙRMÀ†fÊÐ0 €œ,‚KV¯•1ZøÖ”"æ${ ¶æV=‰J™îî>Ü?||øôYv‡-`»lOOç_¾žþúÛI-ò‹nþòv­×M)—‚DµyS®J«Áj¡ÕߪM‹æ„™áñÚŽR?Ïþ‡9ÄS("BÛ–o¿„5©ë$T(©ÃºÙj^  ùTJ™÷wØÖ-܉SHœ—€Çk#ú`Ó~vô0L‘½íb™#x¹8–¼Û}ø´:ûåùËb¹EÚ‘ÔKÕëµ$¹ßËY›ƒüñÇÏÿ㻳É9ï_/è° sïŒBêhXw¯ŒX:9å4EsZ·z=‡0¦Lsömóe©¾ó™xXÞ–ù{J~xÝû©çãæA#ù©¯N!"°dÜM¡fËÖÌÁ4Ö50¢¤¸ÅìQØAœ¨³#Æ5|ù½á1ÆB±ïéöØýžÑ@a7lÖí±[„h”™öz¿ýwË ÂÍÈSâTÒºµ]\]¸³òÁºí=<¤›Tèýo µjp>ÞM©¢å„ó4ïw™¦iúøñþ¸ÏÚ*’WÓªæHÄÆêÍ‚ÔÇÇ!ø­/9g£×Ž@ÊIúnß9À#T]Õ;çZd澎ÙÜ#š&fŽíkÎZýË·Ë/¿½ý÷¿}ûörmÿøçÏ?}:ÜåI„ûúÞní3ìNÁˆÈÌ=ÜTOçíåmù׿?þóýû/¿½ž.ê!Œ´VoÕUC¤szóGocŸuLü¾ÄÍEz9h… óû9äÑKÚ<”AR¯¼‰Öjݶž…QƒªaÎÞ-Fds¡ãaNI–Z#KnJf«š].›p×V"º‡…²7Ð V×>zÓ]ã$Þ—€n MÝÂZ4vhHœrpFòuÝši‡0åÔ)«qƒGû¶\Ý,n;Öp4¿ IL=šy¤nõü]¡û»¥Æí¾Ç¾Í€€‘ˆ0z4éfõÀQ8ÖOyÏ ‡r¿jo[]7×Ëêàº]XFšs:ì§™jѲð@–ÀPU4ÍÚ 'æNØV MÉw”Œò.rHm0à†BÂîZÁ,¶ÅR Éô(p/4Mw x©ë/Q6Ðu¶óÕ^[œ4tä¡Z tì"(ƒ€9ALl½Hâ1r¨˜dbhŒ£¬ŽúÔÚ¿Âx·O?Œà[«Pv99öí]bÀmÓëZ/—Z«"D€«Z„‹p)™ˆZm­êºÕ­V 'Æ”xžË®LB¸nÕÏËÖ”…Á¡µ¦µ™¹õŒ² $‘RRŠp$è¼×åª×kݶ†È’Їv>Bž¦iÊ€ðúvªµ-KÓÚ» <\ XNsÊsb  Iœ„G×GmýŽAˆ ˆp3web&º½#ÐÃF`ØÉÑÔÐzz˜œ0RbfnUk­F]=ýA²#ê:x%ApD 1y€ ³0´Z¯ç˾¤¹dD2Ó¦æaˆ"Â92b_h€#õ-†ZTµêà$Ìéþ°ûéÓ‡»C2]×mƒk…RJpXU[®×iÚív©!©ZÛÖuYWa@‚$&W–¼§épªööÖ°4žîÊ|'éÍý„)±$0C$ ”a¸Å,ŽÑÀƆáálXLv ;@Uì,`gR%t$O ‰‚ɘŒ»È¢{N#§<•ÌÒ^'Fê¢ÜwcMü.©wûç½°óF×é‘íÑðÎ˹©9ƒÌó{PŸ'qÜÈo<}2<\æðþý›¿Â»ö>ŒJ£+hìôºND½ ƼA½§ # zevo«HŒ®œ¼ÿlÃíHüõÿ·Oz×QúØŸf&$3÷þYápë<ˆ÷Ù¸/C,nG̰¢Æ€B7'S/ƒ.Áõ ¤U](˜QR"a¡Þ­(h™¸³#ÀÜÕ|0 ™Ý´g3ÃðVˆÜíÿñNZrBtºQ™¨‡Fƒ)»À7K–Æx0Ì×VÏkÛ´í³5ƒZ7ö« $¦œ9ˆ(“¹½mJ^Á aÞÉ]N;pVc N’ç’v)íäõZצ˪Ï×_ŸÖ¿?µµ¹…žÎ—µÖû‡‡?¬U/×7ÄàªxÙüº4WL”Zp Ž“Æ[@mt˜v‡iíŒafm ¯$Ìén…ém­ÝbÜÂÝÀC)@šÙ²im„Ü_/Ö⺬íÉJ‚Ý;þàIÖEÏ× óî¸ßßïMZûmÙÎÛó¾ÕxY¶óVá°+ÑfŽ–³Ëî¹Í{Íÿù·ôß¾ÕK%I©·1dØZ»®•‰KNÂ4ƒN9ψ|˜yJˆ([ ì¶:ÂÛcƒ€÷úû9»·òFþô"'AäŒ a`wûH‚×Å®«µæµ:Þ>Q€ >ZŒž.ê¦"·P7‡^IKLØ7a·Ñ»Kn4 =@@ˆ66…·/¿Ç†zðq0{»Mˆˆ¼?÷æBs9wyÙN祆# Þ¬ÿ©½\ÃC#ÜÃù{‡"œ1æB÷ó\ðrœ™Á[kŒ®BSžË~WæKZ¶êêà@Ä ÄÁèxƒ m8ê¨W‚¼‡uoj÷,°@÷¡Q“'Á$DˆæN«ÕZ) ÷½\W‡ÜQ .‹½]Öˆ/².ëöçÿøóLJãaš2Oñ~%µ˦qY‡‘Çra&¦ZÛëÛõ×//¿üúòßþòõ¯|;ojÈLÀì½Fdp—qQ©ß"b8ö?è,ÄœÂCMI¸””:)9ÌC‰q*#µµš3aSmÍÔ¼ÃEoÂs·Öª‚]…ŽwûÃ~B€ëµšcqÞ4­ê®êÔûµÐ{Z·/[Á­#¦QX˜ ":ø¬ßÙÜÆÊªãÈÝÝ­§µ,¨6œæé˜áÔ U6ÚΜ w&)9O¥¬U¡ý=Ü\›šŽºÉ¯%’0r§†tÿô¸oõ*lä[•fôÅs×g¨c=zÔŸFæÑ ‰¥sÃã. ƒnÛ¶4ãÌΉÂ93î{âH˜±?„†Áˆ.Ô‚<Ìtq &H 8¿‹î¿±ò¼›@Þ…ã[¾Þ÷¿3)ú»ûgÄN»oÆIßif}¤xÿJÆoýÎÿˆ±Ë>_x/ûŒá`ˆïÃø ú)|t_êÈ£ÓÍ’Ð5îÛÿU O:¡tÈâßmQ£ð,F‚¶§œ=†Ó ÌÔGòêözÞ¶MÒãÚá@ÀÌ}Uî6n=æ¾nAL©è~)¥ 3 ³HÁåÿçêÝš#9®,Ý}sˆÌPU¤HQêéÓ3csì<Ìÿÿ+cÖÖêî‘Ô-‘¬ €ÌŒwß—óàgh4ãå( ã²}íµ¾ŒÖK€Â|”B8q˜½U½aT½w›9±wS§©ÛˆODUp´GupˆûQ§:”W €ªf¦Î@¥iÛwÉøøÎ‹Bì®SJ!H‚£œA…š‹Y„Ä)¥žbwDewȧêøíõ^ ·|ÁL[i¥ØË;ÝýÛNU¹V}yÞ1ô‡òÓãÃóËë¶ à¦Q‹›8Pi¡¡y–9/ÕùK©ÿö5¶Å? ~œ8³Š Ätyõó_¿µ{‹O§9­÷{©ÕÍC52B2ESà”"P›íýÅîkùþ;ùÃïÏç9NÒ¾Øv¢, sH¢EÎêþõùV*ùt!öæPö•‘¦¿~­ÿëÏ×ÿý²üåþáuw $æÑ”âaŽÕ¦‰'I™LÝJ¦Y2!%îþÞÙ€·]µi«=Æ5,ä> hùh÷€aFè`Dä6*7Sìm4ÄLÞÐÍ)"T#¸fSïtE $fE·p`ÜjÜ·v>ùù<-'$Á¦Õ ‰ÍÜ"\]›™*D0ñ”àdÞ(Mˆ·²ýé/ÿñÜþ¸pkûýïÏzK—óÓ÷~·LU«»>?ßQ–ÓÙ ×u¯ûŽœOçŒH‰…å´DØÞ€®{yÙrâ4£_NéÓÓùºÚ^©™6·½i&êD¶C]ÇÎ(ë TàŒ˜5F²<¬™SXoÂD:Æ_wÓf¦„D³áÐþGþ¿3È|<1ðßÍ÷>†µæ}zø?z5ñ )¼øÆÛ¿+JŠî¡ùMðÛ®stERÔðCÅ»@?ºd|À~àm£Ìg¬©†R6j‡ )ð=éПèÇ»²Ÿ|\ÙƒÐ!½0xLËáÀß‹ñÞ°Epi$Þ¢ }3Â}ºìüê²ÞñÀé. t ¿}:˜æØ îkÄ)§I8 Qo1–,Õš»iÓ}oµš[Q ¹y3¶,DpT׎oá>ƒ!áaIÄ8J€FdÜñ(3§2óîš ZÕZí|Ї%}ø8ýðINøŠ›z8ôUö^‡Ú•,c´é¢”w Û•R° rb:çåÃS¾<M%øÛµV×u+¥êóËú²j12`Jüñã‡ùü÷øðñ)¼>?31sÙµ©…áØ›!!2Èr¯üïÏë—çíŸ>Ä4Ogaˆ”o°üû³ýeõ§‡åã÷fòºo5<šµußâÖÐ˶#PJ31»; ³¤f¡J`é$Ó,Í wžð|Šw«·*Î`˜ér¡í/R¢|ÑM×½VD HŸwø—_ôß¿¬7ÈD‰ €B#0!%óØ[Ü+-%¹@HŸBÂÜ¢9QJ)Fk^OñÇ[W/à x«±÷ʰ÷šGŒs b@0£L‰÷ÂÖ‡i ÷0P)Aá Ôí¤ÝTÝ—q#L†NN!˜ÞhÿÇZb¬…ƒ¸÷RqÇ©™6ÝÜÝÌ4hº=K Çw¸ £}#JÑëu…À%O„ÚjS5@LÌd# ت9‹0Â4åœ'3´ß}÷x>/ý‚D­ù¶{S"ŽRë·çÛR \NËùtºk}®¥ïiJŒ.­6ÕÑXßAhÂÌB îæqÝzg{ô^'1c²q(pgˆÈ çI% t²;„Æœi‚) ®·ýz_ÿòŸ_§üçyâŸ~øøÿý¿ÿí¿ýÓΗ^ÿ áæˆ,’X8ÂÌ4ÂEd¯ú·Ÿ¿üë¿þÇŸÿòùõÖ¶ì‡æ ÌFs$¡;¬kAhL‚HjÚ´¹!abE’%BŒži΄áSNq]735õ0èq¾Î3E& ððèíД‚{|½{Ž Y#@¢7+È=5ŽÈDÈdäQ1TÍÕ[ÀËëýë×çË"çÓãœ"ŸOäÍÔÝ0Ü÷m½­ÛíÞC/s€…\rN”Á€«Á—×Õn%‰qD^ÞD/‹·u—«ßwIÝ7á@Ä‚DS"I"ÄHîÖš!ŲÐ<3LÓù鲬(·û]Äž³FS%! Þ lGxƒ(A˜C­íjHÊjÚ ”&É„ÉïS» S&@lH[SGD9§|Ê”¦à K #ÌÂȲªPd+Aë•Jö4“&Ñ”L#„aʘs_ûE8<œò”KG’OTê¾î¾Û««U'²…8`„ÒH!z€Ù@+ š;4uuO"—Ó’3«›jk­…7sß÷ÝÂÏËüééÒ]ô""ÄqßÖRŠêh&J‰'â,æeÓûV¯¯»$Î'I§åÄLfZ›Vµ½µR¤œ pÛöºïSX÷½¶SJË<=$V_ ¥LH¥ÖRZm¥5ïa'†Ÿ.üéwß}xÄð²ï"œ’ÔÖ´i8lÍÖ­¶R[k¥TUía“>©àoüâ]£53 bpCr¤÷È$¢,¥Ll,‚hâV­VSSâDS«ª"I’ ¡ªjsu0Gtì L9§I.ó²Ìµ–RŠY¨áÞ¬îu/µ–áSæ)%&&Ħ ¡ éUÛ_]7Ùe²ºÞËö*Ûz2"9?<}7Ïçû®¿üúúí>}JI®¯÷Rö‡ÇLJóÉ´™1bvF˜ŒbAÄÄ{Z[‡j«6føøá‘9§oÛ×—ý¾yxss Œ4Ì3ì 0žö‰H<’™õ9˜SB·XuKB0öö0‡PW'Fŵ”’0S€{öŠ€̶«<ö‰]9ªcâPÍ1Þ\@‡¸ô–ý}¶Ç{®Þ§ò7fAÄ»•fÌí`½®¼¿O9Ïc»Š8Xú1™#[ìCE;LAc´¶á«!`"Dd&Dr{ÝÞ@Š£>¨«÷˜}ûã˜ý¸ûH@‚8Eõ†Ш3îT\ Óî³&ŠäR¤þî¶^~ÁäàÇ>ÀÆgÐßMz,è÷Öôµe¡9óãe–Ä ‰H, Yó0mz£ýæ{9.ÈÈ)X3ÕfŒÁ2–ðá`áaÍÅS’”Fóçp!õ¬‡«K²Ã°Œ Þšö[_$w¨=]¦?>^TïZ«†’£·Pñ€0Å$qÊ»riì<èzÛ¯w7ÇÄ8§øáÓüÇ?|÷ÇŸ.žPæµÀ/Ÿo?ÿúíõº–Z×M_®[mÆ —Sþ釟þÇýñŸþŸ?bDmZ݉_ow§Ðj 3@‘<‰zk@ì¼l!Mã1|—O€7—?ýzýÓ—-?}úñO¶ûLa ¶ÞîeÛ!Lµ&"ô0$X¦L$ÛÞŒêmoÖœEMиm¾­Æ&a^tE¨¡¯÷Û¯›ß ååMO"ÌB—ó„¯÷m/­4y­¯·†—3Ÿgá”™YXH½++]Ðóm,Djý8f#‹3´ÙA ˆ`RX¸Ž#s?HA0÷ñ¼à["6‡á–Bè0¯^˜ Aj°7¿®-´nkMyˆÇ‡é|ž$q¸†ù2Ï—œ“¹º ð¾ëõu{y¹¯[SD꡹õÐ.öVfAì2Ôý‘Ý-ˆî£õýÈVŽÒaî §~è¬x[­¨j¸Î¥,ýECŒhÎäÄx|Ê ‚=¯«¦E½5ëÙc777ÇÀN| ô 3ö)Ó: ¬Í{™»&rXÇšy”0322ƒ65 ·P‹××õÛùz>OS✙ ±8šöRfž2#¡ÙZJÓ‰1¸Y7Mc\2c S¼qJÔ¯öï­š}¯ÞýøoLmœ¦Ó’N§ešÎH@ªFˆN5ÜÌÔº`/€Q[y½^C5LN)õŽIŠ@ ï6ûÑçˆÈÂýÔì#;ÙYƒ ßq0êMÝt<îÜß½Ú#O9˜BGúûþ€‰8#+=‡ÌÕÌÌ0Ï™™›«¹ÇñN1×¢ñ²Öéå~Zäáa:-Kf"ˆÒ4ÀI£W™šÅè6eDÄ9:®Dè|&´Ÿ¯Ïúûý\æù#‘./w-¿ÞW]NY#=ßî÷_ÿóü|xz2ÕÖl·Ý Ï)P(M²œJË}ßÖÕ ò<=Ñ,5‚Цªî!„À>fqAHÀΜ̲Zw—! (z%P‚@âD9¡bw¹D è°u¤ÎÀŽ @ìˆÏ¡¿è®ïQoÕC¶c„í5Àã°×y8ïæŸßì—( ~c×·z¸}à $JGÖ~Aß·YXøul1ŽGÚ1ÕÙ¾+ù@ÝøhÞñ#yüvö8îVàžâé ~Âñý{$¨?à1‚‘}ÜïcÏÚ§Š£»ì8Ð"b`Gfû› ߃¿HÄ„ˆ{œ%mØ·úI£Ÿ=Æý`~MA#¸Ü›\úqá°M¢™¯[½­ežóÔ’Hï¶ RBk¦ÕܵT73a S@áDŒînêÚ|¬Q0ˆz[3½AÀc ³ŽZÀ°Þœ Ô#©Œ)MfÄ€DªVŠˆL±¬ÊÀ)<@î…¿^}«èUíºÂ½NŽ’'|Êøqyš>ü°|ø!ŸO”¦õ¶~ýåó·ç—۾צ°W×Ö\7:Í?|÷ýý§þË?|¯µ¸Þ˶—½5l€’r΂QÛ¾"§tšy™@¡ri²àÃÉþ|ûç¿ÿ|SÿŸÿýÓOß?òþ¹Õrb œjÐf¶‡õ¡9±  ™1CšHD4jÓÛsáÖÒ9ÌeÃÛóZk™Î".@ŽV}/ÕµX¼6ÛŒL rÕýº:¤ï¿ûû¶ºÅ²,éÛK¹®%‚€¡¨ÅËkÝ(T‰S:e ªáAÄ@L|I@ܵ];®ù1€!ç Í ù~Äá¡‹áÖ)‰Çc#úÿ ,'d!¶@p 0@79îÍP=P”ºe¥O°½i‚Ûš;ª3 1v ¾©#"Ñ=ôwá8-û›zq„ÿßÂAˆ0t’!B™‡³ƒptWÆqÖãëGoc$æÞ6Ü#9Ó)Ÿæ€^¯·oÏ·ë½îÕ_ïz_¶Bùǧß}üþãIÛþz]¯ë¾n»…£pí<¤¯ò¡á„ d}q9–…è6þˆèáÔs8–³è¡NˆDãÅãðÔíQõYˆ¸—n¥­è×çk)ëºÎ)'DKL]û^¼25ØZÔæH"è­ÿÀHÞ=Èá¡È(ïŠæÚcµ„„ÇG_L—yÞì-ý¾½x0 ˆp’”¢»áÍû[ŽTµ–Þñ°àÞ±«½ïFOSPu&‚#;`w(l_\›GÙšµ`!A¼ðÁŽ‚N/Š$œ™Ý¡µ0µÛZþü"‚àöáñ¼,Ì„Ø#€‰1§å4E@f9Mùõ¶®e7c&ÊLBÀ¥ù^+`œN9L­¶¦6Þ\kzd`‡f6(Ýãh`Ñý}½Ø±ÿŠ1¢‹…\ñ<¥³@òý”éçǂٿ~†º%! Ä)gL)± Aãî pƒè'r$b–fÞz°RX‚R`³ áãœX1¨ÖðÕdEj`6¸˜-¥Ö5ÅJªÃ}µ¯¯vÝØ /“¤„EÕ(*aÌi¾œgu-Ú#HIC«¶m/n´íõ¶¹E&d÷0 !`FòHFím4ÀTÄ,’ ¯*¡×Ò¾³"¢ÖöõÛËzÛæyš—ɯ·õv½»é2çižÀÝ< ª©š×Öjsmáæ±—}/3ФRb+­ÔV›¢0µ¬e+µéóËýz_K­ªFBÓûtÛÏëõtöÓù¬Ž÷¢/?™¯[N“»ãkÙk|÷é)'èHÖ ,P-Ì]͘ùáéAUoë a—çä4NïŠ9L àHâhî¤!è5¤?îÑ•©&aNÄ‚A àÑÌ­o‹GëD¨šPO' úa¤?Ú8ûš3ÞÊyà7páCׇÏý @‡Ü@oÀÏï`³ƒ#2·}éÛ‰ÞÇ©ÑßÿÏ` }xGè„[=Gºx¬F3Aß ÀøžoXŒžI÷£ó ¼æ Ã.p¤X©s# ¬[ù\Ïo@›Ø!Ùï!£:¬ç†¡ç¦ø*R§õaÄ"z¼ïø]örlŠ£v ßdÚΚ팷ãb¢ªðz«Ë\ÏË,ÂBÌØÌÀ='Y– @Þ´µÚœ¡[ì)<X8eS¯¤ÚA:ñË+Ù{Øš1h´DP¯ðÞ‚š¤w¨#b0°"}{­ûÖ¾»œ/—‹—Û^^É…Ò…Ò kÓÛÖ¾]ÛË5Äk‹­MÕ™²È’/ß-§%¦_¿U¹9ɺ®íùåv_˺ս¨9©F˜Ö,Óããòøx:-ý—?üÿòŸ¯·ûm­÷Ý÷F>úá$€ÜC›a` 1r®á×–¿êyköo/÷çš—‰B­ñË5ì'žÎ Y´j=Ö#׈Ȝ“X^Òù4§™ö{‡­5ˆEæÜ7KÕj˜œqÎ’ÕÚ¦Q0Ù”‚E(<0¼:O-àe­_êFSÎSÎ9ñ‡Ç3"¸zYk $Àðf¸*ÆÕƒË§~˜C¤ãÒàßD;Ÿð°×©x(§#ý fo4·¾µêaï@`2Îè%A ¢ã€€Üƒ‰Œ$ü˜ŠÑó÷V<¤+’¨È¿=(˜¯¾ Dë ë@ÃyD4$Fänôî†ñèçàŽï/“Åþ¢ñ£¯cD<ÀÕzáL8 2K@Ï¥Á¾C¯ãÖ} í“Eµ¸VÕrRköüíúò²Þw/†kÑRŒH¿øøñòÓï?¾¼¼\o¥¶¨-)e‘n›©™G"ë[•>4Œx7*vúY?+1'Š`€4â_€~¸õ©ÏÃ9,öäÔ%c„ƒÜí =t˜Rð½Tó8Ÿ¦ùI"”$)€ºuBQ"ê0\'æ\×jÑÌ©hkÖÌ•=À-öRo·íõzon"’$¥$çó2Í´ª›oûP÷¢ÁÌÄÇ0ŽŒHÂÄ3MIˆYÑZiý+{½Þ³`º¯Í",ŒH–œˆX˜”Ð)ˆ ½HI ÔÕ{z/í¢·w3uÕPèR 9 à®õȱˆ0“EXkªæ-˜(JF‘ŒÁLØse,L`­"¢°È,î`M•BÁjÕ½TíûBIÜÖ,„ñ”eoUÍ<Fë’ '›¾ûµ^¾î¿T|8ÁVÌ>}/º¾žNûÇNO÷uÿöõUÍÜ!¥Ôš—¦9³?œ–ó”/ËdÛ¶i+fÚtѳgK:_æÛn$ìŒÝ‚È9 •YFú)º‡G¡K@&D®M %„Ä ,ÝÌÛU8w‡@îø2ŒA¥éé7g Šø¿ý8qäz£»ùcèKF€oKÆ·íâ€ÇÛTð›X[·ý&—Gó'¾wV±xË»Á°&õUüapÐ#<|…i4yú[X߮ģZßûÌ©×! u×~÷ñô²h @G3í ùÁGéç•!Fwô䢿…zNÍA€EDr¿ì#}˜Žs0›ð·b³þ¦;ò˜]jpè^í^oØ= ·{™²œOó$Dà^¼;€'á0XZ`æÀÝæMÑ£GèˆýM#ˆƒáˆâ±ŸF£IßWõÏ,¼›sÆÞs¬§qPG‰¨: ˜;îqßh½ïÓt µm-Û¦Õ(P–̧™™érÊß}zºœOHØyÿÍ0³8b²9«t> 0®´ƒŒ„0àÖaL (}jóÞÊ‚ˆ„‚Ñ ´ŸÒßêÎà@ýxoWI:"ÆÁƒ w=÷Å æ)=œ ˜åáñòøxš33ÃX "0 p֛ÌÜs€½\€ˆFð4ÀlTÁyy A!Ü‘@®Á›¼Õ:ôO… ‚\‡±ÅÑ!!›«ªFqêW£áŽB@D!ff:º×¸8b0‘pÊÒ›^:÷ÀT›ªG'€ïÚÈ’°¢™›÷%{0 €)y¯í÷U©öíe‹øjNMñrYrfLL€Ž)'ŠÔ-)ʉÉÝ_¾=¯[13g¢)§óiAÀÜ3Ï[mê„ÄÄhfÚzZ$Þ}¸cfÀãŒÝÍ-ÀCƒë46wµ–~÷¸üþ²×°”¾¾¾üýÛK-·'æ„„À†`fáVÕÔ[E3a¢¾Ý\BN”f„,Ëåò8f ¶m9?j±Vk¸":òn¾j½ÕrRØL?ßî×[kµxå}Ÿ‹§†3S2$$æLp§´kì ^ï†àÞ™ŒÂ(Œ¼d¬ÍF'N\LjñZ³§, ±ŒSui¦am×pP$C’Ô‘|ýQppT-jÕRj¢ÚìvßîëªfAˆó4Uõµ´ÛÞ>8ŸOHý¥ÊÈ,9%'ƒì"Sž¾~{y¹®jjæÞïe ÷hêQÕq™æœ²M“œ–LL­Ö0iµíën͘™Eˆ3€Ôæ–3gIF¤µÚ^¬TõÖÆ›ÓBˆ%pRçuÓ¦èˆVÄ@µÖVÕÝÝ:{m¢Y£cº£>oŘÕ:R¡×5D¨Ä ztËtW$C`¸Ø[|+l;â}~rbÀ8p@‚DˆÈfnÊàHÀAPöº—Šˆ9O"T¹A:&v hêHP«FŽ  S ÷‘Vy6ZZ+ÛµÀsÀÓe¦=)„½¬× üÿðñûå‘_¯×Û}½¯ë}]ùu¡yI?~÷áßÿx9¡0žOsJœײ×ÖrΞ>XÈ˪óIòæZ ¦x“«qÀp±0‹có¾J7  "ˆDÊèŒÁ£õê·q·rCé¯Èp"Ì“ˆˆû #Ä!NƒÅÉñió¦¼Õvá›îƒ›ÜÑXǧŽÔ#}o^ €øþþŠ·:°îû‡?*àÍÐïÇ{|!?ܽGwR-õCÏPÚˆwDáÈL õ è¨IßÛ^|;Fôü@'ŽôëtÐ)€‚ÁìÍÝÝN$D8˜lî8€™< ]bEõeCí²cô-äh7EýMjñzݘÀ-äÇï.)$3'FD„ÂÌ)3b¸û}k®ê Yˆ‰ Ñ ƒ@ÀÕB-Šzêþ¥ ”~J'om÷Ú¬60à€@7u"Df ŽÀ @"DÊáôí^¾ì·²íf˜'º˜ç½Víx±ä8ÑèÍHÙ4‘ƒÖízßov»w™É9 p[mÛÔ E³àôtþý~úé÷y:¯«rìËe Än€éÏ»º®E[©úUÛËýáÄ9«¶Ö Á#€ ™ ‰ÜÀÝYÕÛV™)'‘<Íçǧé|"XoÛ·_~Þ_¾’W„0¢ ·( ›E„4φ‰˜ÒKŽ,DL#ú€àëÞ¶aŠ`)ÑN`I®æX[±ZX@5µc‚EɘU• Óº‘.³âë­|þòòã÷Ÿ~úýïÿð‡?|þúù_þå_ÿó?ÿ† yÊóIöu· ß}hÓ’ñ‡¿W5!²ÖÀašsâÛž²<=žŠ"½ªZaŠQáA“à2¥ÜJknC ëü4ïÏF7‹°¼Ãá⇜h™R?§ÄŸ>=\Nµêóóõ¾îà]…ê“fà7z<¾¾™Þ¶ô>Ü;]õDÀŽ×ìÎþ£ï¶ãtè0ýŒ€ VÑX fñ»×ßìô8Þßo³?†{„90;†ßC=FB!‡1顎ïuHÚîØ0>4Äs·Næéö:áц|(„‰HÑß2cÉG&Ì-lè‹!(ôíLÓé¢ã¤=xGk&„wê@o‡€N`è‡ &`FSûòåµU›æe>-‰C„Nçó”“ðºïÍÃÓœ1àf^Í%唄²0•R!< hsôyÐ89çé4/9 ¢«j©Ú YäýG'pÇÞ¿MLý&ô@BÒâIù!*óf“Ö^âÁ$BÀÀˆ1MLà¶n»j!„¦`®k…‡‡<¥¹¹×˜ˆ™iÊùéáòðp®U?þæÚìát_·—ëíýé?þùOûûçRZ’aYFG)QUf 'A î‹C$A $†ù˜ÔO>ÿ¸ ý\oFú˜¸˜­ØJ7ÙL‚§‰…¶Új YòjP¶Š‚„µ•ºFë1µ¼,,¹Å|^¶Xª3Ÿ—ŸÂâó—õ¯_>ÿÇ/ÛÝ e>ŸõI©V¯È8e~<… ô¬ZL231GD4¡7Tí¾Ö—[UC!É‚Y€0ÌÌ=˜išD8ZóZ͘Ô,@Çî0ޱ’0¹Yk žç‘,6u=Þ œX¾na¼?åiŽmR_M‰ƒØ"8¼ËrÌ,½#µ÷ÓõE¥÷!q? A;Ü:Êó¨§}«û;D‡,°îx‰7ZØ0'ÆÑåAÄ„6ãK.G3ud@áŽÍœ¦e>/K„·0Iùáá´ÌÉÃÝñv[o×û}Û®÷u/Z«×ê[ѽjÕfá8(íÁHÌ DHÌ}Vˆ,“ˆìÅ^®[mÀL̨:äaBF†×æÖŒiÄg‡©žÞ´Dö"pÇcÍGæ¸-¥øiÎAØÉÔQ1$f†‚”' ”$"ÔÌýø½tøކæQÿ#Ã-Ø_]HvíWŠukJ’$' F·p·p'f$ê’Ì0´  ©·4¶¦õX­ƒõàÆøÐ-qç’S„„†·ÖZëÖƒÞXdÇšÑÁͼëAtÀõÉGhÈØ<ÔÆ2÷°h9€83!xŽ`JÒ£f{m¯×ýõuÿüåõõz©uw{:fI‚ĪfU-»bO„Ëiñ H,ÜKÑd´W^œ¦”¡”j€˜#™ª[?¼#\ !1æL½êb„·À,¼Y4µäíBqŠê{ÙKYÖ[ynVrZ"ͳ‚09p¨;ºcßûK!'°0 #p²ªµX æl±NyúáÃ÷?HžÝ}>¿"è [»?[«æ{åiºÌ§$Ù#M<%Â?ÿ|¾éºsQ,ŽÊn‰e03ÍK9Õ3ž7¸Z·?ëzüõ¬Wbõ ·eª“Èi™æ©ªîoßw0Ÿkõ­W$øøøpÛ…È\MiººÌg6œ´ããñŽ¿Ì¯Óåeíôö«~ßÊnHS‰å\æižj­U€É0„"¶fÝb0âĵÔ)˜Ã!×1¹Þó®¾5o=ö­0,•EÀÝ2eàLh]=ð0"9˜ÓŸPã‘g!´`Ãî믿C„úô²LÕÜ»ʋIJ”R¿ì{_ï[ß;3K!¤p7¢‰yqë–šfFbfæ¾c~`ëÐ|4ìkÁÓ$uâÜ3C86lõ׊炭õEëܺ·½!HY®¸\:Åû98È”Üü°õ R8¢‚ÑœäD°=6oó2™¶°ÐnªÂÏçèëƒc_ï°íÑ:ôFE˜Xˆþò2! Íß·þq}4PÇÐPGŸ˜*y2Õ*˜\2¤•akÑÔmÕèTažH !¦e“lª<À“ˆÄº»ödÔkº,TXzWU#vÌãŽö0 `äñ²EDÄ®Þk¿œ§Z®½÷iš–åÔ»ÂTïªÉ07UCôPÓ wa(ŒÖlš¤Ö+3íûöýíýöØó*硦Ð6 ò}×¶·°u%æ}×uÛ[둆Á@˜ýh¤ÚÍ „XoëúX÷Û}ëêÄ¥P!¤ÞCmß{Û¶–d¬`Þy`þš©ºa bä€&‹_ª‘‡ì”„[@„ ‘Côýåj-"2á“|­dá¡ "ËSáÓ•KÄpGB&°³ŒìzfZ…9ÿBwr4C3¸ßÛûÛíåTÎçexì»CR‘ÁÚ£é`\°ƒ˜¡v7K1HD„:8•®îL ÁUêiYáã~ÿýíC=ùóçëßÿö÷¶Ûí¶!²BÜë?ÿx{ôG· ñ ÝÖ=ª1áëõr>Ÿ?íz^nçiºÝÚýÑ~ÜöØ‹'Ö–„Àzïj¦ àLT!H[·ÐRøúRÏs‰¾·ÝÔìzžþúËËËå¤Ý¾}»?6ᘧ…£w»Ý„8Oóë…­lÛNèò Ñ…p´ÂÍÕ}ÜÂEêå²TaÕ¾·mÝ»šáX/3 pQL–]¯q9l‘?õ‡GO7MYC5plô¿Od!Œ²îXBý©›<Êžn/?&!xdð™êÉØí'‹"»38˜„i™Ä«äüŒ¶Þ3¦ô„¢øqxÕ„dd2г2BHLàèþ3ê„c t”? ¦ žìöŸаp`.µT¤Ø¶}}<.§ #@­…_iªÒ»VF0'ÇÛc{[W}xß} e¶eFærë4×ÖÍ,'£ÖUªÔBÌÃÓ€EP¨Ä4%Ž©›¯¨ûîÄÇl.ÍRáhyUÒ ã?`8¡Aò>²P00±ÛÄ#ë„D"H” h­ñ¼L]ͬ««‡# O“¼¼ž_>]|ÿñÿýÿ_ÿþÛûz"fÔR€Ô¡9Z9!NÀÔü±Ðt¢Ê,LAdŒ8OBer^ S³ÍàûmǾó%D&µlFH¤®Ñzxl´Ç¶ƒY`lf`€Ä($[·›ï¦(fÐZ3ë§ëÔ_'~ø²Ð|~ùrqd.´,²ÌS•‰¨ˆ°T 0SÛɬûºµ¦žû\Õ©páôn=í–mH&7Pw0£ðÖâ"Ýã‡U+Й¡* sa–ÂRÀr4ëææM#=Š5+ÞË— +Eƒí½Ó»UóÙ8(ï*>è•ÙþMÔ=Œm ðÏàhôætÄBЈ>ÓSbc¸žîê@È´yøÐKa¢ YJ)ä]ÉÑc€çÀÑ%‡›,·Z¸™Þ[7¢ëO"˜´fÝÀÇý4Æ r.uYjÄ][kPK%!Õ¶·-¦*S•<^ÖZêT #ª,Ÿ_.$ÒÌßn+ROÁÍC}¼ó*ˆçó|½ÎîzlëªÛîûf‡¡‰xÈ`Ü)°ÎsçežfuGté>H3æÄMÕ´+HÙ̃íg>sÇ­ Ÿ»\'ãlÊrƒ$€BÝ]S¦DÏ]죌§BpÖ¤a`(SS8¶:‰A¥Ñ;£%™i#"A#E áN©% "”ôþB˜fšÁ»†:f~vXÇ„F-[ð>vù#æKô¡žóZ¨)ÂÂ%sœþq[1 Ø9LûÞ¶RËë˫Ԓ?æ4)²®Ýºö½B)LÝ\Õ¼»©"‚”ÂDFæä’ \D.b] Â'¦ë©\εT6³ÞFß5|©ñYè:¢¹LQflj©_ÕËIyÚ  ø!YJаŸ“” R0@àJ à à®Ûz{»½}ã2‡v°†àåtžˆñtuõ·ÑÝͺ)½^/2_^w¸¼í?Þ·Ö=\ЭN•e蘋Èe^NI xÄýaÝ‚ ÛO•ˆQ«©Ã\K)50Ì{˜æï˸PtöÞ +i€…D6(#0Â]5Êœ$⃰Ló§—K׆HSù¼ÌÛ¶wµ­mf:Ou™¦„¤‘·®…k‘­uãBµLµˆu3diê¦æ–d2 KØvz XºiWÕ1<ŽS¹q²€ÖúíþPï@Ðö¾ïiÀÈ \l]MóÑ˃“ªÖº¢zìÝÌt›DJJØA¢ÿŽcüLÐe·( ÌÍ,žg{|"!sÚ<–@€4Â,à ªC {F¢#3 JWEÄ Êㆇs(SDÏSU@kíããññ±Ù_pšf’.GB\˜ J­é6KÚ„z1SÉq‚‡÷nàÌ»aonÞOSí °,ÓçÓ¼­ûÞöÿøÏ™õ—ëõ¿ÿ÷ÿööö±ní¾î[Ó÷G3(Ó<Ïë¾·pe¢Z«£ £_/'–òص5_×–Yôµ·f6Âôã ­{k\0q®¹–4)ñr-ÿåZñ¼Ý§Çº½¾œþßÿç¯_¿¼˜Á?ÿõÇÿü·|Ü ‰ÕtÝ·¨E–i˜+ש„í-{M„ÈI%Mç·kW7•l¤¬*fìËÃ8 äÁäô øy`÷´È/\ü<àƒw»Ø1€ ðÑ|­ƒ¼Œfà;À$± ÐÑ'ÌY?>}Ï#‚ˆSþm¦ÁÝ>RJGµ0á©+úS°iT?Ÿ´ÿ°œCý©ŽÌ”Øf Äç¡,Ë™44HYª‡q3E„ð0DGðü,Þ…?ƒ;‚!z´}}Üû¥žæ ÀcLØ{ŸD —*u¹?à4m÷]÷®´6æ;P|z=Ÿ—óõ<ÊæÞö–Í¡ ,S¥‰ Ý(Ô¡wÏ\ÐHs:°Ƙۆ{.ù<â(âÇ/èX]!a¸¡§É”R)>Í®nÝÔ¶R„IŒ¨+¹A)õ—¯_~ùz©•_¿\ËT›úí¶Ýï]µ0âR9ª ‰ô ÜukfæÄ ‘Ï]ûcoåјh™¹Ìu™¨ ÊTJ¸ Šmw5Tv,ʴ̳ø9úÚÀVõÖœXïMÌÄ ¢ßömG’²ìä>͵LtWX·0sCï=6}| xÀe½®§R #!»‚¦ÓÄ"Åźƺ«EW‡¤*2P\ð0 b(ì#¶œkÕÑÝØ Ò§Ç]FS¡i¢"”I–pbb¡ð”ã¹'!.@»Kï ï ã—Ÿ í½ió‡-!•.@fö„+ŽTÀÍãLÿ ¯ P_ðˆ C a/†ŒÒ xª´ÃwK΢,3 HvÜ )˜8¯#„©}=âA±nMÕýr7Þ IDAT³WœuS‚@óÌ¢<'ÀÈÌ\Šœæz>OÑZ À:Mˆ±7v ˜j]扩NÄ,„T˜+óT…nÛ¾µ^ «@žAÝ3:BÄXBI!#ïseðp‹ž4bðñ{vð0-‚ç“\.óršë4q8aT9üÌ<*ÑæÚ¹,ËŸ'Tµuݵ©Y”p£~:á_ÏËĵ5_^ëòE;L¼/ÂÖ­Q1@AˆÞÉHD CP×ðNX€ˆÈÇ6%€ÃM?Þ¾yÀ4-3s­µœ9Ÿ—÷è{»¿ýØoÊ:z&B²ê%ÂafHérq@ÁtÔL|Yèå,—*~[“lºOuúúåÓÇÇC»F¸0#’îÚÍ!€|5ë;33!Oˆš5·ƒjðs‘MDõN†",PÜÜÔ8S_ ‹0ËV,)`vÄ {žŸÌbDˆÔ ýÌ9 ÙfpTΣóÓ‚žú¢ô"€Æq£‘ OÈAè ‡C¦w,À²¾Èx<ïñž1s£€äÜ#{=TŒÆÁqvÉ.ðQƒv÷¤ý#’pÇ­Ç¥„Ç@#å’ u7p„àá©E 0÷ćîûþööQ‹ É„ÄU¨×"§—Eçy:=¦2¡üA÷û½ø}[Õ›öv½\æ¹ÖB2Õy™.§sWsÿa= ¨” "DÛ£7õÈ&(-S‰Õðp3WuÂò°cÄŸ7˜Q"EG>H­ãˆ2–hH€ 0Wþô²Ô û£ouïaM½›—S.ÓòéõÓëë¹õýýý¶mºïýõõËû-~¼ïùcŠLP„—7ÕÜó@bÔmS ,Ì0bF Ð ñߨ÷‰æ…iêÄ^™ùDú}}¨‚……‹·Ì\Uï[ï¥2›û¾UÂóé,¥ í±Luº^pï݃Û#Þ·¿÷Û^±@bˆ˜òlapïDv9ŸŠÔiæ—×K©SoÞvuU'ô¹Ài–ÊìÝ4OäL8 AÁA ü?–kƒ¡,ÜŽpÄ:›mBÎb B0§ ÆÜ ÌÀŽKwRÁÅÚHÀ½Ç‹Ãµòİ+½+#s|ró•5Ob̈Q‰tç·ÙzÛ Éøi2‰Í”…(üy-ˆ äa€}F…ŽAðÑx1$$–"U˜5ô¶®Ý:&êqoê`êL’+‹¹N±µnnSåjê[ßTõ±·ûº÷n­këàn$$LâHz_µ÷wF‹p57s&$63Su‡ðPKCðR>¾¼¾ž§¹Haácé2ZY]ÍÜK)˲”úànlæf4Vñ„fÏ}3AfŠÀèaùô?XœfŽU¤0«zëêî9ÿ‚¡ªápWŠ(œT2ðÓ<¸lÛxŽl’˜I¡™íÌCF 9óW}:+µŠ„’®€!<Oj G¢…ü?Ô—j© ³n!ÌE¨0—Â"¥²@¸™Ö*ó|’ÂáÞö0¨µq»^–ËyÎíŽC€’:H…R‹p¾Y!æišæÅÌßßoß¿ñí¶í]1Œ! Ó4ñ²Ôy®µ "–"¾ÓŒ<¾Nô匬ð¾[.§Ë"ó~¿­o߀áRJ`”À“(¨¹$úÉ Rõ€¡1ºàBØÃÑÃa7xïÛ:Õéåt~ùëùr©—zX÷¦~:úö}–ûÎÿxûãÇx­èMû¾{W®u>ÏL°®ëÛû `/—Óßþòukúýã·÷Ûæˆ4ñEºDá2—*…€„ªH²®½ÇÞtÃÆD¨É­p uì€Ù³b5@‹qÍ#€°‘j ĘË̈}ï¿éÛíqš§©TæfêÛ¶[hdžk­EDr¢áê‘HÐîÞ›=Öývßo÷‡›3rž'l–#ÌBÍý“ðÖtÛ[„-u>ÍUÕÞaPçgÂÂ4b‚¡M}51qABc€‘Õ­õnæIŸq3s„ÈÏ:DóÕõËê(’t=Bω28FHÙQ¥£¡•À#17ž˜c›QÆÄ’ÁpEQúÅèY¥d UsBɇò¡wŸp sB¨U‚&múíýþ¿ÿù[äËçs-¼LeÇ bG’*Õ<÷°0G¤Z…'ÇnØ›àáÝFµx»wBm*@^¤üåë—_¾|>/¥·mß÷½µnHðr½¸ÑÇí±>oÞ?¿žþþ·_–¹¶ÖöÞMmÛµw±Ç£­[Û»bÐi™¾±ˆ¾«3Ïs½žÏ ô¸ßoG³`@b!¹ÌeÖ}¿÷6Ïs­õÇï¿ÿþmžç——ëiž_.‹Ð/nVJ%ámo÷m7 ðØ›m¶nûªZæY¤LuUËÏÀXBPVôX˜Æ´Ü1-\­k·´§ PªpŽœRMVK·ØZ6¯Ž AJ„žÀº—çC\èáù4åÃã9|‰ü;„‡îéMËŠøÞñg· O~ ;üù|F@æ#4‡ë‰"˜)Ç1a1 9‚.zêÔÃm¸½sØ'fšgfD`ƒÿüç(QÌY`sîÌÄ•лZwÍÙ-–ø±â„ïA“˽€m­¿;PÓP ÿúòéºÌs©¥Kí*•Oçòú2}ýtùþøç¿~l»ªëÞúoßÞ~|¬µÔ©Êi.Ÿ>½¼¼^‰T ™‰‚Ke*acâLŒÓR¤È¹»ª·î÷u¿?öpËnÆ(Ї#çïÆ-i„#.œ»tba&f3Ÿæòéõüz-ûÖï7}¬·÷·ÖºÑTù4S¸þøqÿöãm]×ó2ÿòùËßþö×Ûj·ý›“#…Å@ èô,Ïe›#‚1 ãi}°Âû‘„wTÞ­kÏæ.A€{Êê¶!•Yàlp "ç à÷–ç,ùy)$‚@òDŸ†«a0 g2—ýá%Ì»&É!‚ò¡…„BÄĤj3"$,€‰I:ŠöèîanáA& eZÑÁ ‚޲R2N1ÄQòq€á¾íýþ°Ã‡By¥wŒ dæJÞÙtoëT©»ƶµ´·¨zkÖUÕ¡»ï»©!ç€Çb$€"[×Ö:AZß"D¤TfæÞc p3@’RI„^?]ÿòË—¯_^ÏËT„RÄ|˜i´¢ÂÝÆ (¼”0ù4!gØ?iKÉð‰¤OJ°„F°‘¨`8¹8ˆpe&Äæšä c"DbEaðJ­Ü Áóç óèÇy"ã…3hùĈaü!ë½áa18ÛO!FŒßÐáýz&Í¼ÏØÉŽ#K¾Ë2,cÖ€]Á™¢w¬¬®âÅ0ŒÑ:FEœ‘@Í@D1€‰I8›înè@Ò €æZÏçež—Þu}<|žæ:Õ½)ÁXtUŒB! tug¢Rjt]ÎËRd~åýÌm»÷}oÚ¯çËù{ÛßÔàT±ˆÁä@NÈ•ÑÍ»µ‚ˆ 29F¸0‘ 1sAb³°¦îJÞµ[³¶¢9O ½\QBÌt·Le:- [#ó‡nÝ<¬Ó~Û]ÛýÞx ?ÍÑ 1ÔìþØî[»Ý·ÇÚE„EÊR£°æç-UxŒ(ààêšÿ3@A 2@»¦ŽÞÓg)‘ñžcMù<ü;€º£AJüj"pÇÞîk»•­ ‡Gï¶íÝÜê$×ëéÓËùtªˆ ÍZSÍ&cZ½Ù¾{ïÞö¸©î½Æ$$@æ¤>LÞÉ;!a:Må2OÛ¶ß"`ÌT™ #3ÖJÜÔÍòµË8U™+ a-•Hîëöþqß÷fff¸ìof¼û@·ƒ{˜*@`°»¡ZVXj³‘ž¥Í8©tÐÎ="œðO6ðì'ÑÏ@EºÌãÈ€1ôQgâ0td¢”å*ȰÔiíúÏÿü& ùòéüéõµuØvU4g!1RuDˆ+®EwY»I-€¶˜'h úÖ}ßËuùt]¦EÖ}ÝZÛÖþþq†e™§r>M÷?~üAEÏçúzª” ƒˆVhë¾{ÓZÐÈ3¼11^&Ù–ÚzšÛu™ùï9¾œ·é?£ß~ì[G`ŽÊQ(¬÷Û­ÀÙ€~¼=¾}û âËùýó§Ó/Ÿ/_>k­Ó4Õ©vío÷·ûã¾›*×™»TuW:ØÚð„݇ãá c&™j…ô mÛº>ÚÞr¸^©¢"â–s˜ ôY’LÝ,ÇèéäɾÓ1YïÓ´’cžz \FÏo¼è8¥P‚Ÿ!‹Ã4O P ãVž3šÿÎö7CqÝäf;83äue8‡â§šë¸¾"0R¤ÿ.0H…‡:Ô"™ýXX µÖ[óä " D sw’œƒ¼Ò³ ̈ i<8RÀÄ ,áªÐº[¨ÃÚ-`žêõ¼ Ñ@2’Àå\Ï¿|~ëÌ,·GÛööq¿?Ûmm±ja©BMïÛNŒ¦*ĵԩò\ÅY‚ÈÌTÓõ¿šâÌdakàᚣU²€áˆF€ F„yx@Ƚ±g¬‚ÆS¡©Îe z‡µï»µaÂSF_nðû·›v-4%$À€X’Vðþ1"KúIÔÝÐ-„(»+°7Û»¥_Qè!ihe(ÔLZH€½Ï½ê¯Óue@ ŽÖÃ:°¡¸Á…´uF“)NÓÞyoÛÉ{E"*|¼ï›+pD5û~§æg‹ÒMÀÀš…¶R:0/ÍËÖ4f¨SY¾~ª×ËI„?nüㇹ9‘¨C3¥û‹p`$1Ä„.dñç¢ÿÄ „‘ãJZƒg%7=\qÌ·Éã¡Ú¼«wÕ‘5J¡£0;±5À&¾î_N0a{(7 bÏŲ;#¥›8¹A?¯"ž°— öÑ8G‚ÜÍüøÿ´úYÕr~tJnùø4PäS ï 8«>H[änøäzAÐÈÒ×#‡Ÿun Fs4H6?¹£«k·Þ³ Œ‘; ‚†º‡nˆ€ÁÂR ¹¹ª…G ™åju`Ì(ÙØmðh2¤Í$šh B¯L“„HL…™dç^ ŸN' Ò¿ýrýåëËëõºÌõ€Á|´¾E ª¯[_·®Ži„T9D &0(©ÍƒˆOÄ£Y„T‹¸šÇø^M>@5×t>0ò£Ô×=iFÄ㾆æpD°ß—·çŠ8¯8dëÏSHÄ¿ãÐw}ÆlçIw< [9gŠœ†%Æ)»ðÏàé1”r %ˆÔm½ì´©6mÛ^ÖY—yž¦:OUXŠÔR wÓfº#â4Ï¥ÎÓdµ23_¯—išöm¿^×}Ýõã±'{9/óÖïëˆ,\ J¡u> yªS-óR_Ïó¥ÒÝ×Û·? ­Íº›íûv{Ü?ÜthœAÝ4€¨Ìn-B»§µ’1# nÀ"XŠ\®ežz7Üšs‚z0Ý5Ú÷·»ÃùÛR0,0Ê<½~åÚAn·Û¿ýzûõû}Ýt÷ö®ëv¿a¸”ÂÐ-¬í¹‘C¾Ý÷uû]Íܬˆ˜“[¹ÐÁëˆ0"B C ³€˜  q)ÈÜÕ©u7Ë,Ldr/ÂÈИÝ=ÐA˜9(W›0ÅSáÓ© ÁúÀÇÚÃlÛšö®jÝÜ,zG7W÷EX¶]ïuo-D s‰8 æêÖU›v@@çdcXΗZ"ÛøT§i’RÄÜšjWótËeƇ™™‹ð4$°ÎTž ’°ÔÊs­ÔB% Gs‹Ô`³¡˜8"3Pupä±±©cköd°‚êÔh X00%ÛþÝÀÁ¯í1£Í,q¦²Ïã0©çOÀH„RŒ“3 0UEj]ûýí4——ëùó§W3¸­Íî¡1!’BÅÑÌ\M#±ð4‰\– iß»EqREíJæ:Í/¯—ó¹"ôÖ¥.S-×ó²ÞÚãvïæu¡å²\ÎååSÔËiî­s@aN¨¬ëžk²îÚ]¨¡¥à_>Ï{‡fÞ5*‡ ]Îååò…KéñǯÜ‚‰|oíýMKA.HèNÌ“¹½ßWµ9ê<ËT¤ q= m­|<Ìmžêétb!µþq»ß×@%3þå; laj½õ.ED˜E8 0×iªuf¢Œ6wí»FS裨ûlóy‘Ú/ŒŸw‡¼ŒåæöH$úe²†*c0Á0wtw°g|lnÀS@7˜ øÌ`šî‰òc‰]“ç†Ü^!<›Áã‰Í !ƤZAtíND(ADµŽ0«ç„Ør“J”Ú1TsïªN)nÇ1 F¡‡äêã¼F9Ð í9R¿¯mWëî{7 &*¥0 2ù—ÏצúØÚºíoïòý}Ü7Ud.DôØûúë7w3Ëýj9Mõržç¥r5o{k]Ddä%Ï,ººöf0\O³B†¸c,Êë¨uÃȆ»yó®ì ·;“æ)¤àõz!±}Wuð}·ÇcÀÂx9]>þÔÝÿõÛïï·¼œx„»º‚ïõ`މsT8 9€Äœ*÷0óŠá™€)„¤á –)" » PÐ$¥ŠHÁR(ˆ I.`]»#Õi¾8Îç~ÿ."çVþõþÝ}ídá;c™Mj–O8gìÑ›‰Äé4ÕI ‡»vÝ×u?É4yCtT@sÛöÖûFàDÐ{W Bæ‚@äMÉ€ÙltÈ&WÒ~Ñ‚P2çncÆ œÉÏCwaáæ¦)¤T=å¤TH 21h¡ðµwäMÄ_'YÈoÊïkYpò1%_seÈ/Dâð°|è¶}¸G`*-Ññ=?`Ç·ø¹KÞHíö ž5Äøº'˜ìÙB Éñƒç?¾¥ña>Ø4îAh` ¨fṯŸxÄ?£‰<¼„ƒs·ÒS¾ ˆLÙM& 0 JdB¶‘@‹†tdd´©à\¨NRç)â|Z>¿^¦Bý|=ÿõëËé4 SfÙÓqj—=“…`È,ÓtªÕ÷¾;BDGŠÝ°ÜÒ8Aà€­â W1aQ'wW ?ž“ÞÍTè`V&ªÈ#ÀÑÍ­[·¤«ŒÇØ1%ŠQ²:TƒôóJ ˆ†èNc ™‘„Lı|öÈà§Ž>ÿäH»ññ8äË㾈˜+_pϱ©fcÛlìû\d*í´ì—Ó|>-m®ËbóbJDt53â ŒEP¸2&ì½õÞÔâ㮿þþýv¿ÕI.×3vUOÿJ-u’Z±œ¦º,Ó™õ}Û2ýLŒ\ 3ü®f-À ˆÓ4žåTSß[w+ç¹¾¾žˆ©÷hM{ë½õnfæf‘ Ü:ñ4ââHÍ\Ý·µmë°9 y¨™™?ÓÁ$Ä@ÄC¹ nnŒ ú¦ººoÝœ8÷ 9£Twv´€ªÂµŽŸÚ³§‹€fÑÕòi[Š Wp·ÞºªydÆ"‡1š]èÁ GB‰—Ç!ò-9$/»rÐ 2Hš5N<ÔÔø V#! æt‰ŽtÐÓè4ÔªNÙô?h¢ñl© ¨2sºá1‚1HHkûõ÷¯_¿¾|úR*Oês)«ˆvÎxï{Û›º…¸užç‰˜jߺ»õ†Ûf®}Wíu*××óiÊ. ËËùD‰ZèöØ5©/åòò‚„¨X-\˜Eª0"àckëÚ\m.¥%Cáåõôש@`×X÷~_×uÛ¿¿ÝÏç“Ôr:ÕåA{SBGDõx¬;ï1M’?"æªfÝZóøXuúØ{¿q€]^N”I€Zäô2þü²,¥µý×oÿøç··ïaÆ¥  @@‚àZëwx12«JäÜ;¡H7HPUïêݽ¨’CPDÞ²b*H9W³dZ@ ås2†“1;_?ccqˆs)Ë`È#“ß;¤ NGp0?Î(ÏRYxÓ¥AiYŽp\Ÿ[nþhiòSçÏ»+Á $Oå6°ƒëNI¤ PÝÃ]Á¨p¡ÂéUttóLäõ| ‰…™‘(‡N‚€=+¤až¸<¡üÃn»ÝÖýv¿ÜçÖOv9/Ë$”Y(¢óùô7ôÖukíåe¾œ§÷÷ÇÞ<@Ü£µ¶­ûºySSˆ]çòX–‡”àH†„Y&ÝÝM9(ã¢@è8&‚‚äÉÖÆ¼úhiD)X—‰ƒZÓ­u¤˜'.o­5»ž}ª„óT=¢ožqpa*¥â<ËËëõååúÇ÷ß~¼=ëTϧó™@ooëÚÓ3ë˜{€`)²AuJki€ã±úw‡p t÷qcé˜ÆO§·;}0Ö¹òTi©p©…™Êu2"s¯$<×þòr²õÚ÷¾ÛüþNÿéí ÀXÌ \ ¨RBÑ+ÁÂŽRHä3‘"°Pk™êÂT8p „ÇŠ:Ü1ØHÙfÀôãøÓpÖRZ€¡žöáô;NåǨ$«¹ê}˜È]óÍ È„á2r " ä;!Òºù®ÇÜ_0P>Fƒ×#Æ ! #8#L…‡ÇÐ0Šø2ÑT¨NÓõååt9-K}½ž^®K ×RËëëE„Çâq|ê!×î8œ AçóüåóKShÝ÷­›…+РïxQDsÀйçÌ1Ç‘"âªÖmôˆS!#­qÀóâàà`jNLŒAann))<ÆöÄ,"pX"ܲàíC¿žh¶±ú‡Ñ¯òÃry4ˆ ö9¹’ü‰‹†¼/æ<›G\5«Éáh©›Éu&{O’WÚ×Ƕ­óýþ¨•§¹,ó4ÍS™ªˆââûÞœB×n[Û÷½k§·÷ý×ß¾½½}›&¹Þ/¸>Ú¶*c)D$µÈiY®×ëi™–išç*Mu}lûúØn?šö/_¿ž^^e:ýøñ¾-}BÃ\Ñr)‚‘5f1dsE‚Rg©3r!âå|9ú|ýúËéõS™f¬DÚÚ·ïßýí·÷ÿ¸·öØ›Gƒ˜ cñŽo7õ» Ïó鲜ïå­­¡–/WUP §*‰ów_G BÆ`èÂt=ŸæIzëû¦ Œj0¦y™§yk½Ý±BÖU IDATÖ»«yxÌ“|z=ý|uïo?~<k®çˆ¡f&ó°îa€vh¢LMMßof8Ÿ–OŸ¦ÿë¿üõËçWØ·½5M Cï½kw3Ë(Lë¾í}]÷··÷÷ûcÛÛ¾mûÖºy$t€ˆY„9o£páÀÂÈûÞz ÀL‹#aXf“ÃÔ¶0së]/×Óå²0‚¶N"¥"4פµ¡æ2M…¤0Qkm]÷ÖT÷ff»Y‡cÔ‘hp0OäX&EiT{ÑéIAÁ2»c2ëøäL$::""Hˆ„³i0,ÃB•üŸc^8ä©?O_þ¼ 3|^1²v‰RÄ­Ü·ýñ~~y}½œi™ç®{7̱¨0RkÍöݶ½!`)eš¤Ô“EX@« E·mkmÿñãöýÇýo__ëuZNseAÀ2I)|¾^ßoÛ|ÛÚæŽŒ¡êP€2ÈŒ¼ïí~ÿ(ÿËß¿n»ÞŸ¦úõ˧iªæp_õŸÿúã÷oßíûûí±w5¸\μî}ïB8 ·Ž‚"RL‰ªH¥ŠDåí}ýã·¾u)üùËõÓç“P\ÏóËi~y¹~þúyž¾þµŸO—û·ÿ½>V@ ŒDÐ Iæy*µ2ºk7õŽÄ¥ÔôðÇnÞ[ß{oç¥Ö©"¨‚§Qvà11'­Ѳgaîš8Çì¤c’;üi#þY0#Fá,¼ÐÓi™°ÂdÃyÐè @JpÓ=“r »xf6G,ÕmÜ>|_FÒlà볊|Àiji¹ö|S±ˆg)Î=OF FæaÞ=<еNR%×µßn®x´o~0‹’ZW³ˆ`d‘ˆ®=ŽŽÃb”ã32µÇc{{¿]/S«bfûÞEø4×Qï$œ¦Êüba{×y>-óùÓ˾mº·öxlwÏ{Œ`h7Û[¿Ý6y 'a‘I„™QÆ¡-“·ù–c&µ±©ËêBÞΑ˜1™ 0 E àÓ4}ùôzž—¶÷÷[·¾\zûñq¿oápšEFô jD¨"_¿¾þåë'æh}_Ns­¥°C¼^¦ÿú_ÿï¹Ò?ÿãßÿþ®š.­L¿€#fìj ZÝAÍüéš[çŸê ¦!&uL[h¶™$NÀ‚†ˆ‚R'”$ÕåS=]n·ÇG“‰~ùËù¢E ÕÔ´«öÞÕ5³ñIªE*•1!7 ªÿ?UoÖ$É‘dëéffî‘™Uz™ËK ÿÿ¯")w8Óݨ%3#ÜÝU僚G5ñA jÉŠt7Óåœï´ B¤4¨Ðõzùí·/×["*€%Y­M„/—[³Ç^¯G«ÇØ÷Öú0w‚¡ý£8“ £²{bð>´›<•òu~ÜTуO„30½'õ'—A²zÿz¡ß®Ä£×£6óxUHuŒ:T …<Äo³ëÀ œQÐQò¡ƒD¶¼R_ͧ{c&m»Ûp''0b"ŠSŒéÃeâÆ9&žª™ØBFíC¬ˆEÂd¬Dµ=E-§Hmh×ÑŒá:Ê æHts;¡¥øÄøžlš6¦³öõ‰ÎGG{nOŸ¨„Sð™`§ ]1«DÌ%­…Ö…ij RJååvy{»¾¾\˜‘J’¥dšq›óvž{"’ŠȇpYÒo_¯mè~ÔýÑlLÂ>Ç䎱z›TY´çIŒ§nð7ÔÀ)X˦ „t&£€™«sôà~YÙAˆ™»6T˜9üRˆäçrÒÍ\Lqú¸OÉ9Wz†ÞŸF€I†>õ SW ÿK=‰Mõ3!ÚÉQ9Íf)‰€6ÿóüÉèùU›ì€0<¹µ¾¿o’RYËå²\ײ®:FðˆßC[G­{ë`ܪֽ%¯Û6†UMAÐM2Sb¢"rYʺdbìÝŽ½·ãuëíö/_¿¾~ýË}ïí¨dý’©šYèh9aa„Þ¼6DÁ¼8sÊùr{]n/R@Ê¥\n/ëËk^®œ!"$s§—/~ýÂß–ÏíØZ2CÎÎÀg†ÎœR*aO ’¨dcDD©G¹3·põ™ ›3…¡Š£;-(’/ë¢R ö¦"Þ»êÑú^ûj c¸›[rx}MYr‘þñ‰¦Žˆ¦c˜i`¸éTd§Ž!6­CÞ+ýùé(·ÛË_þø}]Ò’x êmhíUµ3yIÌL}Œãh­~Þ7F,¥<¶úþywóz4íŠóЙ<Uë}¸!ˆ ‰0«Zm½›âÀik âÙ|‚™íGÛ÷> ¸$Vµ”(‚?M Ü’¤$¬6z5gIÉ|ݶã~?Ž]=‚]t¨åÎaÛS¨o†ªp:¯8J©sÙ³o$ Û €zB^i¶3 bþï),DFÆÐÆûSH`³ÄIa'öîCÐÉ c ADÒÕÿõí.ùÛ¿õëšK–µ$Yx óáæ(àÐûpDpS3'–œ$”ÂÌÎBˆV»ßÛ?þûýËõ²$^s"IS %™ˆÅt<6vÀ>¬¶ÑzG‚œ%liÔ»m{¯[sÕ×·—¯_¿¶ÖÿùÏ}Þ7„p¢S×ÑÆhCU¡#¸·Þ‡91 zC·Ä´. œ´sIù²^‘ißG ‰2sY$%Þ·þãý¸?*1îC õ¯¿]¿¼^s’²,Dл®kùÛ×kI_nùýçGèÊ>îÏÏI®ëz½®’Ьƒ)!±‹Ý/i‡£öZ{¯ÝÔ¤”Kb6D°¡¿î‡ »s‚ßžˆº)ŜƿIcb&D÷ДFWA $˜0Û9`ûÙïÇèfà ¦Ã™Asœ°”`ûµ/eY "ôÖôh>4æô˜3§,¦Þ¢£vT€ lˆ òˆ‚œúeÅËJcOŽÉ0)IJIÚöJ]‹*М“B8ð'xßÏ€€E—ËLî’xwÄù4©›*ú´u"Ñ3Wb~u®ÏPÓ„¿ì›hѾ„æÕ£ÛcdFš¤ªèžÃd}Us˜ÖnmL÷ ººƒ"z¤šÑÌ—uzjSâ„ ËÌ•³ÓWŠá^6ss…_}ÃS‰ä~rîOu¬»‚W$/XJ΋àhc?†úÆ"¯·Œhaæ‰P}~ÒÏÂià s$8MQ.X)ò†ü8Zù!"ÒšùI0›¿‰ò>‡sD€4¯tŠò‡ùÐ1†©Ml(ºÿéãrjês8•ç$ÌbŽCé™Ř(Â5ô’]8ÑWhfàb²S¦/:ì;x~sãûmðËvÎ%ãE÷°? ƒ"?n¸„Läñ埶@$QÍ:9I"áÞ[=šmM¶º|>–%_.˺®Âäf]ƒûî­­6nÐq]¯¹0 »«¢Ðº®o¯×—ÛrY8ç€D»kov4ë]q]òEn„£ä²×ú¯oß¿û'÷K&B"N€„$äfƒz¹¬¯ü}¹¼äËe}y[®WJ9r0RIB€ œ Ø(ÉryùMhyùÒº©íG{lµÕffLÈèª:ºn{ýñ~ߎ ˆ9'pQ5#B7f2÷>N4±¹êhÃÌÉÜ Û!än}h×áê#¸m¯p´½Ž£é¹C£3V¦íÛŽ« …x˜XÇvGU;ŠP<¹1“í’~ޝ_®¼].%­KNIŽÞ÷Ú†zpŸ…ÑsR¡epgz&»—ü|ßÿë¿.‰3³ä,Ì—Éä·kI Ôá¨ê}ô8†z½Sì]Û1ಖۥ¼\3Þ ú”šƒõcßïÛ¾mc ¤ˆŸ`ÚkÕv0 F!tIÂY²¤4,¨²ÎæêÆ’æfÝä¡—zÍ’ÞhrðÇýÞ»öëºþåË_¿}¹-÷ÇÑz;Úøç¿¾ÿ×ÓëRJIhæ`ÄœR.†XÛ¨-RIf‰ μ”ˆsbD;µì0“ƒ'7>f\3àÜ ÀºáÉî{"|"QEÍÌÍP#¥4Âà|hÉC—0 9Ž8AÌq+L€A(ñƒ >Ù&êêætËô¶D˜è\²ÃD‹„Ɖ˜Râij‹l¢GÓ6LÕ€B£µuUï>J‘Þ-â9¦ufÊéæÄÍûÐ E D>ÈgdÛˆ!Ú9Žœ› "VÕûVß?’—$UÍ܈R éÂGs½,Ff]®·õõe1³Ïû~ˆSUffwKLî µƒªAò$3ŠG,¢'z›‰Í<þšºÓ¯øA«cÛ÷Ûµ\—r½ä.9¿üíÒÞŽZ«©>ñËëí¯ÿúr+„Ðëøøü|`v8]×!s°©eâ9¿?‰Òó‡D.4Y ç~f=""³ÌEvZUuÄ}l Ê0å?ðEO‡óœÊéÅéýg+:·ËðkL…têb§ôükM‚s,š§!([S› u*!¸á0;Zã]R’Þ{­Ý¨õía’h]×µlDŒÏš†ÂŠ}ÔÚm8:¦\H(ä"’RÎùíõåËëíRR)TŠ”’RNv{­½upó"V2,e·}èŸ?¾ýëÏ?ë±-ÖLI‰!PÓfhŠ6¼\×Ëÿñ?^¿þ†œ©”¼¬’³Ÿ´Tð Ý HÊùFÉÍ¡6]>÷û磵¦nm´ÑÛççãçÏm;Îu°(…©=xज&€4p”v¾ëCí¾íc4sØÀ‘ÕÑÜÇhn>Ýb¥æ@BÈxTûþckS’¢Ãǰ0î# "˜÷HeŠ]?1AJIRJ¥dfZTzï­ÖÚº ÷ŒªÚc´ã f<apÛŸÇîËRJbÓdá®wWUbÌYRJTû¾®ÊI–ua[F\Õaßû¶õ}ï{=ÚH@HN½™{#;ZŽ`àhøË"rõs_1eÜ4fÓíj6“TÑ&2ÐÎlwD¤g7þLv>1×3õõ KAw ‰T^?¶íhÛQÝìï¼]—$œzß\Á„€He¨ž¸ U'°% !ÚûÑÿüv_Kº^ÖëeMIaF8I DSJX[š¹½ sËY$%Fèõ(¥\×Ò_®,é··fàÞáóq<¶Go|D’kM¬ÂD¨n]JbNˆØM:ö¦µa ŒÑ@ú0CB·q4}ßÉÇQë—·Ûº.ªjÝeô!ײ¼\¯×‹Ô>–¥0Ëv¯f€ 9‘ð:¥)® R;zknCÈAÔÜÁZk„‰…gÛËÒ ÚA?–6<ÎÔ[<H]˜ERP"{w.î£öŸM¸BXgtê3#lÖÝÔ§D'ÃÓ‚×BwïÃt!ÇŒgBH3$x>Á17¡›6镆ÑxP´HÀ )qFwqb¥Þ[ï¦JH¸wm½Ýõ8U§„)Üú0[ÑY¶„Ÿ’h^ˆ8¿ºå‚!ãL$À3Ó&zõíQ¿}ûdL/· µ×Ú C§ai‰ù²äq[á²üòzûúe µÐŽ£š$w7F컎>¬«µÏ„l~Æ#; !>©Ü§_< @ý©Œ!<¦Þýñylë~-¹ä4zïC᯿½ßt 7Ú¶ãØ÷——Ë_^ßÞ.G=þqÿ×Çû5øíë××—5'$¤¿ýåëï_ߨÑÛá Lè¸dReîÑ  ÔlD®yS¡}Áñ‘@±™brÂHºãHoBêF]mî†@£n:€ž8]z㜸³ªê¨u `â—×ÛåæC} cìÛ¾µ¡±ÓTwfBOB‰¡µöþþ¹IÊ)™ÒºF®’ˆ  01ºjœÌMuï}sLHLIȆ›©¡0Å8Iñ :T.—ò—¿~Ii½}¸ÙÇç½”rY—Ö»ÙQ[oc¦4F8µ"°™š©I×>ܾ?l;àVò%Ë’GbëÖÁš'ÇŒ€Ðù–zè(8VÆNà}<>õ¥$$„@‘¦}*WBä¡ PTí6ã,¦¼† %3çPßÄ¥$sžÑW†L˜DèP>󦞌{Ç“J¡ª)?Á÷ÕG#Q3sŒÉ£àÆH°SÌãÏÎ~Tt1óPþ £€#—³w h„M¶ª×aR•ÐÕi’:‹Ün×˲ Cbff@P7ŒÉýl9¦êíL„ž;&N뺮kí–d eSa?Ëõð‰ƒGº§+ÍúCM„@à¡ñ¢ñ˜éÉI%3gwr`¦œ˜ˆ-¶ÁC7¨AœðÁ ÓÓNpJ ŸŸÜ¯p€i ›yîrýxfž”’³¹ûå%ˆóæy&Tø©ÂXÏh°s,3[¾ø!9‚ÛóäsƒÚ†ù ÍÜlºÉ™‰zSíGø½DX‚Ü4FoÂVÎ „=꾩>òÞûöØZÅuÉot+ `j:Z×>œ\…­&dE©cÜ·cŒ‘Ï’˜r6Su€¡¶ëðnŒ’H’#©ÛUMW¿ KWëCÁGfÏ åÜÙ»’0'‚ZS7=ª Ãö8T}tëÝŽcÕFa.³$NÂŒèFÃ)ŽÖhŸ…£íµtµq蹄ŠÞ34DææÄÀŽK9a$¢:üÛ{tÄîÞÝ5‰ˆdÁ±˜)ÓÀ¹¢4£QµáïŸu£ÆŒàP[ݶ£«13 ß~<~þ¼¿½^DÄ >ïõã¾>æD!<7'btò@\AbIH§Óˆõ@NLŒÂdÂîF™DB!¦æÐ»ÕÚ{:·hÄ 9Éõv½Ý®ëeÉXwc˜å,Ì,,fF€Ât½–,HH˲ÑãÑ>Þ÷?ß¾o sŠÙdãÙ¥#"clƒŸ£4x xb1p¾}„1 œczbB¶èžÛÏ@­Ð„ÀÅïEŒˆ-tò†Nïþ™8 3Wȃà*a!‡6l?Ô}f±×5%fâµ,½Ñ•“HÞºR3?Q¿1¦uâ”+‚ý¸ÿõÏwI˜ ç%å¼ÄaG’„#£8 çÌ­¬ÉÕ¬¶ÁØT•(Âæqtu«½ B(™KNÂürµ¡¾×XQ4pUB¹-L+‚õZ%¥õ²8Ð~ÔcÛk÷aàŽj1€è}ø0¯}cBAÛÑUûçãøù±ß®—ÄÌ@Úa]SÊ|» !Aº^Öß¿¾•´ïGS×$œ$ù„×Ì<µœROza¾·¡½ÆH˜˜œth6B©††135Ýçˆ ™OÜÆ¹uò‰å9BÛ¢ø0wµ¤ÓsÅM#Ì­ò¯\aˆT+Ÿñϳ¬Ÿö±g°4‘梋¦¸ŽO÷¹[ð±"Fzú Bå)cD B±@ĉÊÓA„"ÉÌöÚZkf cÞBÖkjD©ÛîéõQ¢0üJDf¦îFTIyö6¡ß:MÄmøŸÑázÙÞ^×QÝ^ÖëÊ’æj"üúr»¬ÅÁÀ½W}½^þÇ_»^.Gíµµ6úÑÆqh ¹yí>4²†4%IÌ/9ÇðU Š‚ò¼Œ™AžÃ¶¸!€Üðñh?>^®ëooWákm½$Ê ×k)å¶.—VÇ÷ïßÍM–R~ÿýkNùííµd½ùíõ*’T­f~5›E01_ë¨uô¡æ® µëãh>¦ :b‚DÒ’9‰˜‘êÔÓiG"r"g c€0£ªÕZkWpèÒ²÷ÞkuŽ:SêRîÌšðè \/¹V}ÿluK.KJ™Y %WEfO…ÚPUDJI.KÊ™E‰¶­!Ž”Fž¶ Üu \—²”l, ɉøåÔ¿¤"Û1¶fC˜œÑÌì8š¥”'‡Ým<¶ýãc¹\¨kWC•ºîÐŽZk±¾ °&8žŠüS³I­ïˆÔ•aŇvØ›ÝUí*©"Ÿ0˜ÔȲ£n¦±оL”JX‡«á¿ÿsèlà„Žä'9ØÏ fI…RaÎ3o ãÆºÀI¿Ÿ[¹Sl3íÿnu38wñEŠ{(,*@DŽL d½Ï_5#O€ÍäfŸTÜðAÏŸéÓŒ'©ˆ§fÐ -ND›L5tÇa¶í¯%—œ‡¹°/k¾Ý.×K!PJH Šf;!·X}Ò\Ù! ÷ÞZx¹®%1 ûÞg¶Ô¹±5s€Ô¹ÆÁ1ænÃÎø’ÙÝ0¢1ÍôxI(ÌnÐÌ,:W&6'btf¡œe6bè€s̈)M°SŠÙS ÿ¯ˆ8`8QdO(i̤žŽß§$ì™~ “_~&KÆŠÙñiHœæ)J/ÉÜ2ÌÜ‘9ÿœ0óiý rWGrwo­;ùdþä¼,%¥änèHˆ) sCMË’XÄÌ^kë‘Ì€Çþø¼ÿ‰Žˆ·Ûå¯í÷ÚûºÈeI¯×åõõmáØßè¸bWðÁ‚å*å¸]úrIµ–¼·fŸwÀŒ:8þøùþØj¼5ÄTÖ Jy߯ÏÏn×òzË×K)yuÔaâ”ID‰ÝQ—‚‚¹d2GuØ®W"Q¥aéÇgß¶Ïíh„• G7(Ìæ4XW·© @”g>› ‹ŒI`™Ÿñ@4[¯˜#bØdTA»uôh¾Üƃys*Œ¤ÓPÈô|Šzïîƒ:‰•ôòry¹]™°Þ[G)ë5ç °> +îUû½G½ß÷ýh:Ìm8@]ÝÈlª „Eˆ&wÀúPíÝ™ %aÄ`j)TÖ¼.%‹q„=ßïûç¶ï­Òëåúõõååõõz[r¦œ‰{ÇÑ‚…¯LΙ)¦–ˆ.¯×ëz½\@|lývÙ—¥,‹lLjÄâÀÛ~||~ÖVMÕܘSÎY˜ ÔûЮ>bìrŽùq‚Òxf¦h—ù\|:SòîvfÓ„%ô×™ÝF?³™˜Y‡¶ª?ÛçûÏÏ÷I[Íúàr 'n(^sÊÈ«ƒõÖw".¥¼lÇÇ}{l{ë£v}<Žãh­u³Q ºóèKÚ\2QÐXpbMÍáèãhCõ|f=ƒ³¾Ç: ±£ôÑ?>÷Ïí÷¯/_¿¾¶Þzë:ª;ç´Ü®oø¼?†£Ö$ò÷¿ý-ÒÝìqÔº#a*²,/¯o·ß¿ÖcoûÑb=ûó}û|CÍÀUuÛ›|î÷GkmD äÄy)9!Œ®µõÖ†YÄx‡#D@ˆ‘…ÜÛñØj®Õ[‚±&»fW³Í°¼™RƒÌ}¡ƒ;ÚQªÊ}§ÚPó~¤„€‘O†ÌœSŠº\ˆÃİc&ªµ©ªm|n›ƒ©š‡’Òí²–%‹PNY$¿­××/_¾|~þ÷¿¾oŸµ5Dw šµöØ™jÊ|YÒ²¼<î÷ƒ˜[ï?ßûÞèиd3Ó$¤Ã4®€)¢&‰AÈ¿]ŸIMÝІJÒlár½Ò ²GÂsס®NŒLÜšq¨Î¼²þ…¿$GHd‘]ï§e#^[‡_\HÇ?,%ÎÓ)>'z1¹A""Ãsï6yuóìŠ=uÌœQÝunçÑZ”à¶Î`¶¸„vÔÓRUf†@B<¿ñg äôKàþk€öô¬2ÓdÞ¾5¾l?yåcŒ†–gN%sΰ®œ3ŠDÇäêêf„“µi!¤ˆ47!>À18ɲ¤¥$7c¡Ëmy}»®ßïG­c˜ Q"œ- üÚHš£EhNæ3ù©çaÌB,<Æ$0ÏNN#[qz3ŸT"„(ËtØ¿M"ç€1œ‰>ÁM'ƒð,(fªËéñš›óŠ™Gô§oñ€Ñ™L39=3‚f²³‘@c‚îpšÊ1’§b¡E íéóQš"%€øÐÔÕX0KIBÌlpˆªÉÔµ¯] %B‡^G­ÇÐî{W§ôù82ÃÛ­üŸÿóo¯_—uõ*·f\:z…ÔAÌ9‘üv]¿Ü–´,.©ì(×cf…µ“¶>Æ?ÿñOLnèݬCÊ–ÿþÙÿ׿¶:èrYÞnËÛËz¹\%-,K.˲–ëµäÂ$–˜y~Ê‘(H"$bŽ}”LkIe)€I-|N·˜Û…9 IN]ÜøJrAŽ.p˜´:r@çòÁá³M0õ SN¦Ýé ŸÂäDîh:ó<­hˆ½¥äœ¥ä´ï^k7ƒ¼äœ‚«93‰äãÐÏûýóþè](çâ]»¹Ÿì´‹«!㬱ÌÔ­ÍÀ˜PÕˆ1ƒÕŠêŠXJ^KIITíýóþíÇûÇ}wóuÉ)Kà’Eø²êm¤”Œv SNÀ†6f\Êr»\J5Óá}ͯº–…ã4@U¼î%Á¾K€O%§|vlà~Ô¾íÍk›ìQ9Íý~¹†ç‰ÎÁo”øO”×t€E ¸MSAXm¦0ˆE„œM]­‡¯)Ž÷øs-°Àd®µŽ?÷ÞÆvÉÇÑí‹_×òúrsp n€ÐÇÕÜÉ=üúCÝ=›±›­·[ùOþúõ˺”·[)IÎDÛh9T#ìqì0Ë’%ä£{ïêC‰¸äBä€:z]{ŽözÍ|½¹ã·?€r½K%‹¤RÇxìcoƒ„E„]õn½Ã–5»¡3Ïm½:´n¦­3ÓÇŽU«#Ôª%KÉ©,Ë~ôû}?ŽCÍc ìKÎK)Ĭú¶£{íæ X÷£sÈÍ”öí¸ßÛvôáh– ›q¿„ hè¦Lñ„Ôº¢á¯M¬ù¬ÿcªu‚/½ 553Pƒg¦Ëù/˜Ë¥Ð¢ÍSyÎm'ãyZ ‘…˜9ò(&™ Ôb4~ÞÆ`¼geñC`€ ±Ä šrumJ…hŽ/R¬J±÷nnë’KɪºmÛê¶·>ìhcÛ«Ùˆ¢… ™Ä‰Ææã4ÿFñ4žºo„©šëD©„bz&˜Ñ0 ÀÌeMß^8QЇ/!]£)Ç ¢3°0‘°”R®W[¶C‹ÐÑF:† ³¡¦#%º^Rn•\„—"—KbwEF&$s8Z¿?ÚqôÑÕÌG0Ä<€Á䎡b¹G©½ÿüËþå·ß_—K¾~ª*81'D'òëu!F5cÂ’òõ²®Ë‚ˆÛck½µ/,$’aBaAà·ŒÞuŒ¡þýççÿý¿þÑú€®ž…²0â§B÷èeáuÍ%pÚ·cÛÚѺÍí3“º³¡ {x™Ü 5Ý«¶æÁ¨€1œôuÑ¿]’ýØËG÷J<.©½¤¶˜ÚV‹Ž2œ\­·Nh¦îÈ”KÉL"Œ”h]R)‚ QçÄrÚ\uØ åŽ.S}ÛêûçžsZc<”òZÊzYˆ¥,åºöÞ ¶ªµ ‚\–ÛËÜ>ïûûû½õ>Ìj÷>`Ja]‘YxfvE;Àn€6’Ô‹ôÌC^× $£:–D¹ :^Þ˜^9]I˜À ‘Q(%b2×Þºi„€ 8„ƒÒ<, 2œ€âR¶N!BÐèCWxF+†…–Ã)Ï‚ÄðT}œâÇX)šžš ÊME:€…-`V'xæ\¢ 30("Œ¨~ád÷œHà+8C-têàé—Ý@ÁBi>õäçÐâÓ PúLÑvúð§•WÍ[ïÌDK–%ø#hö Ù Š¥¦¹!# ±DG†“ºI#ü[±` €ËZ¾~¹¾Þ–í1\€@’ÌBns{†-`xƒ84T3ôMu˜›33± ‡¾çt4¸º;ÑE¿NÌÁìãhæé¿Q]g97Eù1‚Ÿ«ÚØý*Ö_ÏΦVufCœòP‹Î.€èdH©F;Cáð_´š‹Ü~N,¼0mŽæ0q°ÑCD‹hѹMÅZ­c¨²PÉ\ЍN‡CkX GšÁ0U‹e¹ÒÔâqX.†ÑÇ£ÞC|æKÎ×ׯ74Ýj÷í}¯?í±{®[Í­6+¢ÜˆX–åâfàQ I‡ß÷ý»©wñÖ\ä õ?ÚÿõÏãcƒ$y-ù²”RŠ”%å¼,麖ÛõRÖ¼^ùåº\×5Kv‡û^üüüñóóýcûþs;jcbYd-R’ä$@ÒG|bï˜[X‰‰ÁçŒpV‹3Oˆ€âQ#G:Ó:'H2V2çBÍ †¢ÎÁŸ^û3CôôýÏß$l*äcؾ÷û.‹a£Þ‰, $‘uIæ¸mûýóñØc¨¤TÊBD­wm&qƒ£j,Õ½›ñI¤ —!2qA¢“eæC ›m[õÑš^×ß¾¾½¾^Ê"’ðv]z®£÷ãã£UÌo—5/"È,³?·n9¥”³¹«2•R8ÉPo­×ÖûèDþúº\. ưÞý¶Êí"µEÎŒ¢ªö®ÏIÅŒß4$!dŠ^Â`žƒ4_7;‘øo»;<#¢~ŸÔu$BdCšÞ~í¡{Ã¥†àŒØî÷˜g©‡~ÕM˜‘Ðöj:j­C»þõ·×— 8€¤D9 ˜ÑÐ`ìl™ ITqtøùQÿŸÿü3%ùûï/_Þ®¥dBÔ9üäp1ŠÒ=ù3‘Fïû±ïGeN%ç”dâÞµ÷JŒ9§$<ºzïÇ^·£ÇFŒ¸^W t|£»Ï\7Ãg4!ŸSÖè#ºƒƒN ¨æ?ïÍÿóÛûû¶.éõåör»¶®?ß?jmC}?jב$¹Eäš]ï{ÛB°7ü KÉIÚckG}ì½i â?1Ì”…a®yžaÏçaî@îBQÝž»[ ì«{@½úˆ‚&7Ëp¾ªÈ“$â‘Õ8op™þ„V:N/ʤµ!:Êh‡JHjÕ"¯Úˆ'ršB*„ÀáÜL8{÷Xs£—4ç¶‘…æYèºfb|¹-ÛÖÞ?ï­›û¾{¨aÁxþ!lnpÆ1 ¤˜2Îcqt  ˜³0©z·Ÿ31»q裛úçÖéÇ£uí}üöõËËË%¶Df"ËL>ŸZMŽšjK]§D‚‰RN)§¡Þ𵬭uBω^_Öu•8›MA‡ö®9KN²m­Õ1†ï­­[L7-$¦ÎQA‘cfÃGýöþñÇo¿½]tù¼ïªˆÜpØ`¦——uVªêãñ0Óã8û~´ÆyQáî¦`&T™„PÑK&·Þ{D™Ìt‹ÐXa_/ùv[XX‡·Ú÷­íGd_ÒŒ’3SE#tu`Íqïºc¯áéˆC]‰È®eÜVÈ å&JžÁ/ØW„Þð~¨ªÅ,Ä`¸~ Ö\u!ôÞ¼ˆœ 䔀ˆÆPBpR«y­ã¨cÛ[ëznF€¥ä”ÅÝ…èºfk½#3'N™ Ñ–…_oËëmm­oÛÅÐjföœÍØ è&DE5¡Q¤-ÒåšMõœ{*dÙé¦ôEÒ‹äÂb„J!yea!sdôÑMMÇPÕdæi ˆ›o’ï#¾!xqð„ú03 NéüŒŽŒ˜ F b¦Ä²c/Wˆ²Ã”¢>ñ1Ñ$a!™ßûS„äÄLÑ¿žé³³”$˜ T„âæ§pð¤^ãT%FT-!Í@ªs"=;‚ç?Ž> Gð # 8$sú™xŽçl#®Ms€á~Ô)y"`ÞÚÕšÎ4Û“y÷'$œkDÌ$pîLc¹‘™^/ËmM™­£!aɼ–LL­uד :áQ ²9 ‹ìè `ž†Â$®îêæ@PdsÇ=f´~’bÝ­nn3¶2ìó ®ÎÀ’)ä:ç9gÝŽíOÊï¥èÏ\ìgõÿ¬ÑÍçû« °‡Ï˜H‚3€÷¸gY¼;Ó ¾—“Ü2—Üñ̨™6À>z‡ã@¢s»­s—„z2×8PªgY8Ô‘L±î|0t´þçÏ·ïïœ Ó”Íò?~|ûóãÁåš%×cûs¯ý‘rÉ—2 ZÝq Lk÷mÿüÔ® Ñ‚C a’!‘÷ œ8‰¸ãçc¼ï`Ø!'X2¥TRÎ×Kz½•—Ûíåze‘Ǿÿøøøø¸ßïõý³îGE¢”‘Í` c±ØL†ëDL:¢!±0‘é$…šuS k=’3ÄÇ<]¥O]ÝkŠÈͦnxÀãŸÊ/"G°1†,‚È )ÂAÑ{ß¿ýìÇRrfìº?övк,˺¨ÂÏ÷ÇÇÇÖû æ%§¹Ôc&¤|&Ð`bÒˆþFwT&fJb¦„ˆ"Œ|UkáîtïG{ß÷ÇÜ×l¦ÿó²|ùò²,©îG­íhuߎýè­ûFÚß§œRÈQÌ”€„1gaIæ>4#aNjm{íµus“Ä·Ûúöåšٰѽ¾^kCç9ÖÆxÿùñþþÙêC=¡_sŒËm˜Á !X+hŽjÑ4ý?¨jsO‹Ïpܸq¢3³  ;õšRGu a`$dx.S,:6›šw%œ“ƒkoUµ·îj)‰äT2˜š£ka`5 a­+8àP TI%U÷Zíÿý¯ïcŒ÷Ÿoÿñ·ßþö—¯¿ýö–„Z;´TC$0cÝ‚ì2lm<9(¥Ünëõr1wÕÎŒ„Øk=öúörÃÿùíÇ÷÷wüíë—RJíÚZ33áT€ÍmfÇó€VØÉJ›ø&`ö°è@pêê??ŽÇýÈB—õcY2bˆ} Ý{s‡Ë‚Œ£5Ú÷Ú¶ÚZ5ŠîÀŒ) ’­ÕÖ÷£÷qšµ#/ž0(ºI0'$œ™°Ä"rt0Óqáñðs¾?Ç+!Q lN˜ìÙ/:t4§ËS˜y*ÎéÌ™´ÐëG‹1Kôþ’ˆÆ£@èCãè<50+‡i¿sœ,BÄL¦Ûu¹®+¸ß;¢åœ^_no¯7I¤¦DŸwoƒÐˆœ™ÈmhwÉI<ŒãjîÈÄ„4`˜Í‘Ó&ÁFê`6Lu¦º;XíúýçVkß÷j"%‰äÂ%gaBšæjbb‰èO7&m‚Ç‹S @=:ÓXJ®•{¯¾‘u¹\ !m[}Œ¡"üöz]J:¶ÞšÂæ]ûIÕždw´ˆ“Dˆ¢¦ïŸÇ÷÷ÇíºHÊ­նïGNkJœ“¤î;7…Võ8jµ®îŽÔ‡n[u7ÂÁH%™¸«»"Q·.Œ9“åe‡oß~þøùsÛ:¸¯—üöv-Kªµ×ÚŽ][×PŽž'ËÜC+Р@ûjïÚ†Õá}Jü‰˜?m®WZ ]Á¼0/eÔnusrG $c Óã×:9°Æ9æ½CÌMsNÄB,")çŒä¦ª£c¬ÐÌ -vÔ~Tcµµz˜*3ç`ɉ{ÉóTH‰JÊB@h¥Ðë­,EtT!/ ͻٳ$ —©9 „…ˆ(¤÷J ¬ÄNŒ²”5¥Utöڻyj‚"”˜ UÜRŠÝ|ÐÚg„+¢EàŽ™!"“«=éðާ@?tó‘,Lhx$N^ΓÐBè`ÆHB$ètr]~…f™>¡–vÊvf®åÚœ*#…¦x>‰O$5 ¢ŠL-ÉLW hØølZθñˆ'uWĤ^ø¯ ”3ˆÂÏh­™V|¢·ÿ»óù—?5.4¸Ûqè¶õǣČ Ì !É î‰èw°Ùy›À'ö[5ržéº–߾ܟ;Ó1–’–"æÐü,¯Á#ÑÂÞJÈ ±.Aõ_qBq9¡ƒ˜éÌ;PVÀ˜b÷3·¡_ ÆdEûS÷=4•O–ˆPzr–à&,s˜°7„§£ðWðy8"†ˆÊÀ€§Ù"­&eN)rH m»·6Üìi€Œ¤ëçœùü:ˆèßUIpâ¨! Ð>oqà_ñ§aóɉrsC£È¸ ‡¬%´@¦]ß?î…ûZh¹\6(?¶±oõkZ’·ûñ¹íãAKEî’!etMÖÄU÷{€@‰9¥’Ê*WIrPÙ WñayIK=Æç½W“îˆG{3ØÆýNï?Ky\¯kY²¹ííØö~T+y0CÚWs0‹Œe–R̳%úÜÄÌ´,É,,Ì 1<hH¿6@v.ó(øúsýIæŒ È@³ÁC&!ç¡­k‹xiä)H‚ˆ­Ö÷Ï£7}{…²Èº”4“ÈPÝö¾mµÖÁ€µö š«Å(Ü80º„‰f E*)1q¤N$L‰EÄÌGï®Á†}47SÕÏÇãããs]òËe¹-Yu¨[íãñ¨ûFHf62 KèXE¦á’a¨…c, ¹››vU©0TJ^–"‚.î–z›¸-îCK¢’xßkïÖ‡Õ1ö£G?êÐÚ㕊ä6"RWÇyôÒSŠ7A~¾*™é6 BµŒ%.7OÿYo²$G’¬ëé`fîC&€ªê᜖C¹ÂËßÿm¸ EN× 3#ÂÝÍL.ÔB£#‚hL˜¢,fîâð¨òõýŒ—ó~¡ÇŽjÇ"¸Äð⸖€#º›¢¸»)1dÂTRŠ¢#œæù󧫈ôÞºp.yžò<åD@äìèžl mÜ,v‚í0ˆ# ÄMÜ&È‘)LÝ~ø"Bé™*‡ùñÜpsS;‚þO0§ûA}ß¹ ñ,Æ Îdæ±ïÓøýŽÇ 8ª{W•î:ÖcÌ£|0¶CK†4Llc@†?„Va8‡¨P"¢˜­»~ýö8-ïËDÄç’KÊŒ%atM81GýJ ÒÖèp,SXµn­$Î)f€ÏD”®§Ó¿ûúöpfÔ®A!¤®bfĘ!A@ÄcÆ‚Ä © Ä&×Óá÷ݬšš¿‚At ÂÕ££fáæŠàAŽ&f× éàý?Ç÷ÏSøêãÁ7‹Cù‹±ÿé`;\'æL4ÏS™²ƒšôD8Oi.™‰9å$ª½‹´$q=l÷¤Dt¸ ð¸ß=Éð¼|Œæ£oGfõØ~ÅÉŸmåºxŠÊ†ÆoèÜÄ@YÌ>>n´}=/©¼~þ~[ßî­¤’K}ìë;õ­;c'qß å’R¯Å¹*´ÚÐm*y9^®—O×s™¦UW¥¹®5 /Ö„A¸pÐ2UDš€:©ù¾[oûºw·¯§œ\MÀƇ‘šxmwˆ1eFÂQ¡1tµœè|>ŸÏ3§l ­öàmc0n¡ BpfŸ2•„QÔ’sg§Œs!"ïÒ[íàέ·m[Emnð8m¸¨˜v±‡ q5ðϯ—_~þr9/{ïï·[—w¤†¤qïª]úxŒàø(¢;3-Ë´,¥”DD%'FJ½øM{¤iæœR¦ó”r"6W5Á8ˆ1ø¶¯9¦œÊyžO§Üšmkkµ©upkm7‡”Ëù|.%#˜véáÔKŒ‰Pˆ(ç q¿L:Æzn€U‚¾ß%%þüé|=Ï]L ÷½¿}Ü¿}ÿØbµ’s’Þ]•B`jG!þy \=j61ÌAJĉTTEL;a¸*GÄ'úË=–*ÈÄ€L” ¸Oî¢f¦ãLí¦jÒ€j÷oïÚêõrúôér½L9çÌÙÔ»”Dó”Ô víEN%—„Æjhn­ûßÖoïë¿ýã¿ûã_ÿúÛßyýòz™KFwt ™@$TÈiÛM…Á®AîË9Ï¥döLNDêÞá 1g\~úù~û~Û¶þý}]÷¶Õ®âh£LéP¤$p:¦‘·:*³Wʱ©–!€:PfF@5Olæ.¢Ò77KÌeš1‘)ôî¢Î‰¦© qëcÎZJAtBH£K7‡‘Þ3­¨ƒG%ÚŽcº»ˆ ŠWìÏÇ»rXä(ê|HC<Šãy¬§/|DˆÈÃ21´Ñ?Ø;GÚ/b±£"À ÉCîDÎvç8Jêäf#[dîªBêÆHè‰)ç‰8ç”â™2¿¼^N×S¼K[¯”‰Ï§óßù[mý±µ<ÝéûǺuwÀ\ÂkÜEÂ(ÃMf„¢ÞíHº™'W7•ø¹ à—ª!1™ÁºõÇ£ÝWX·]Õ{o¥PJp¹œ^.×9g€ê˜€Â,’3¿¤óõzí[ÇÎLõýûíëºè§Ï/Ëœ÷µöÖM¬¤R¦’xE@Âä½uK‰Ép6‡mí{‹i]d¦TMO íýû·Û”¨½¼,óL̤*½×Ü#°l ½7sã(’rš²Å‡ ÌBÀTkk( ¦îà¤æeÊ?ýôJ˜À³4û|½^¯§—×—œÒã±þþÇÛÇÛã±÷&®2Þ«8ÎØjîÝMµã@U©YXÍcVã* *ù÷›ï­ýt•ë ]oR7JœRƒ}ï]‰sr$w N„èS»É˜]!*6÷ÖÄÜ*ó–3—‰™Î§SJyJ¿ÞJaQ6›Tußå±ÕZ»«1á2çå|B¢Þ…À¾¼^þã?ýíç×óyÊ9«@Ý{ë½«ŠØº×_ûúë¯ßn·MÝ LÌk“VÅz”ï Šl IDATÑšëãõuú?þçüý§ëýÏßÿï–ír´Ûª]RvA’ŽA@Ÿç¾Ì™‰™gÆ…i.‰§BÄd¦â‚Å@LÝÄ1!1+3dŽ%Œó„Y<þÂSx´õÄuä@ V¤CÌ>˜s>ÀÑÁ¡{¶á …YԞШ£Óêø”ZŒYüès¬%ã±…H?žjƒ.ÀBŸ¸ Ã 4`¥0´XãøO°Cp{ 8dɨ+‘9mݾÝÖü'Í™¬Ìùõõüùõ”˜Ô„œ2qNLDªÖ›™ "š£8¨y]+º}~½¼^Ï%§àË”)q4‹ÿâ ²ö€@ÄÿYU0ŽJ;Q€MÍlÔ{q¤³"üzüu=Vöÿá~âQµöcÀ2»ñóœeI×Ë\ ÚRÒõ²œ—BHîT»}»µzs5&˜K25WU±ñb‚ˆß¦£Ff?Ü0–ZGTh„ºh |†²¯”ž~&z¶Ÿ+D%‚D`:æÖÚ^e/Îüöv¯ÝæëÜÜöÇH™ Q̱˜6PQNÀÉÑœÝÑ49'$* ž>ã|*†glçúþx¼ïÍ€Êrž¨•)%.¦ÖäèÖš…IVÍko¢J¦!ÈŒ=0ÿpf$JŽàäÆ@K™§)¹yU‹ˆ.¢/KùòùårYÜ¡îÌT%~LCèΈŒ¡ôiJ¥¤HÙ:Г;4Ïi..û¾ï[5 r𹉠2äñ 0QQ5µ˜Àí½ÃæËé”Rž“AâÌ)qb.|ìåÌÌíÀñ05MæÓ;CÒ …ò°[4´\(1MeºžO§yNŒágJ99ºjHš¨dÏó´\Îg@2ƒÞÚãñX·ûãq¯µŠjJy -fù#"BÀyL¼oíÞú^k¯YE ³ˆwi½‰ôƒëïDÓH˜RNÌŒ ÄLU`,vRæœr\°[ªWb†8Ôy ÔŒ#ˆŠI¼ØƒöíÚ¤kß›V1‘åçÏ—óéîû¢2ºžJb~ì½õî¦)*ž¹\›?6}líímûóÛû¿{û¯ÿüå¿þó—_¾¼¼^–©2DB/!¥(¤ƒ»SšsNœˆ˜8•è ¢,UÝ÷öØjm-BŸKNHÛVßnÛÖãŒYÑFOv-@ô‡àX<‡Ñð»AÜ݈¦yšr!NÛÖÜ?ráËe¹\Î]d½¯"²o;RBàÓr&ª]m.©d^{#JCmz€Ë£ÇP¦”Kn]`¯ªÒgÅY›‘³Ù°ü)»›Š6ѵöÛã±×ÖZûòåeYRE>½¼”œ¢çñTƒ»§œ—·ÞDxJ¥ðüïˉ¥wDœ§Éd`øÌŒKâRXTÍm¯šs*SÉîÀ耮؛u×C‹?=pU‹—œª®wÿÎ8§ÌL// "ªYë½”DÆÕgsD/å™ýBB É:‘™÷ÖZÛ”hXhžp™Èi}ô9Óÿö¯¿_OyÊ·û¶ïuÛúãÑj&"0Â,g<ðѺ%pŽ&-¡¥”`¼ÜÑÔ»`íÙUK’)YâF` ‰°Ôæ÷Õ«$§ „¦c!JH à¨6+ÑI‰ú>¹é^¢Ôæ´-µ à|9OÓL™©gfÑ”O}ÖœðNàfSNçó2-³¨!^NÓßùô¯ý|>Ï)e¬[Û[몸o»I{ûþv»[L·O§ ÖǾïMZ“î—%ýÏÿúùÿü+ ÿ~7=•ôûwWÍbÙ‰ÀÁèèµ!šCmîÞ³x.1ôÆ ,ÁÌ™ašÒÔŻؾ÷Z»š©*190cÚ¢¬Ã‰\<ȉπ… Ǧ3wòðŒÓÝA ;¢c;þ ‡JŸª²çÄõù¤‰ =Äå[L£Õ‰1@f°'ív&bH‡’83B&G5#ÿA#9ʈñ4·a9>Àþ—ÁFPnFÙTÍÌ\pÝûǽ>È{«eJÄüÓ§—ežS†ÄœåD Ôº‰ª›KíbfÔ{O €ž #`2hÍ¢–LˆSë­w,™G41Ì]@“·oÊ4ÆúÃëDc—2‡ãóéqq|Ë@'äðD˜ r ;IƒáxPGo{DBžôøkó'r PÑ2ÀS=œ¯—éå2~½ž—Bä&¾ïº}¿?Öíq_ ¥”Ÿæä–ZWoýàH1xÈ‘$!øücú¬™È1v€]{tâ1gšæÛ¦œóyæ„"²oM×=ç—À„Î)¥s™b膵ÛÛÛ»LÕRø´Ì%f& JÌ9eÓD¤µ©tpW5fÑmÛ÷½ºyÉ9Nç15ŽJÛ÷½·f*„PJæ”ÍLzŒÑóAÖõ#ÚlÖ1¦DâAû X&0“ž[Ç’±;ˆ¢89Ù`²Èûô#€'ÄÀ#£‰ \÷jú¶™ôÌ8ÏS)¹xZ¬˜†€\íîâ½kÅ^’'vfv wq÷ÜÀ·Úýí¾=äë·þãóÿþ?þñ¿ž )¨#ÓÑ JâyÊ™˜™1§®ÒZ“ÚDuoúývÿúíco+ÉÖêíãññþ¨{‰»§ƒ+¦[BGˆÀ¡Ó!{´ !QNqŽ`ü{t7#â¨Ûµ.Ú!Ãä)f„ Þ»‚yíj®µ¹H—.ˆ\rZJb„ÚºµÎ…Ó3èðÊ ²¹7ÑXh'¢DHÆ‹z@@Rª¨©«?ðGÜöyˆ÷ì® GïáÁ=싇w=žêîd`Aþ‰ÕÇñ>=NñNy2¹Ÿ7 ŠæýÀÓákæq\îµj%l)ïæN;Ýy+™OKFôëåôz½,eúøxÜk—œZ“mÛ¶º«j|*Zíˆv ¾Ç*ÆÃ9ónDë{}™—BË”s)efwèÒCMLœŽ%?† ÆŒ…šhï­‹8!åD‰ftÏI?½žÎ—S.éívûøøøþq_wQÅÑ)°˜çŽ ÈQü‹[h€ 0æÌÄã¦+¢¸7W JŽÙÐ X­k[Û²ËÜtò±È1Ó(Ë 0{ìmÌÐá°¦šègu*~f*¼nâ~ßë~>—Ó2—S ¸4§Œ—%39]ϧÓiQ³Çºƒ”’æ¹,Ë”Kp€Í­ïuÝ{C@i¢ÚÍDT¶½!@f8¦tN½3Ì/§Ÿ_?ýóóÒß~ûþöu{ÿ¸dNUó`1Žã²[¹gŒ K<'Œ,{ŽS³1åœqòlžR&¬ûÞD:’¦Œ¤£ÆwfHó'Ž©’ãPlðX…º‚:!Óñ8`ê8˜:>{¹ñ{0ÆzaHøÐGÏ ‰G4YÕ"ÃPÌ7~ÚLÄ“^z$Á1‚\†C·>íÁ|96äOƒøb¯RpÂÈXÇ kãÇÖ ¼¶–j¿œwU\–ó¼ »Òs5J2¥½êý~¿?6¢\Êû?toÿ« ì©£”rUqK)¥yYÊÄû¶=ÛûÇþûïoïµõÌœ2¢]TMDã@ˆ \˜Œ~Â0ÏÐkF³cdб(¸Ö¸Í˜›ë‘¢¶Á¸Æø£¦œóœ§ÌçÓ´œ—ÌÖe»oM­×½ñ4ŸÎ—Óä¥?J},è;QfNe!­U°ºvsUEgù’K¡2‰ÓíÞ]E|[ëûû»¾|¹¦é¼·nªºmUÔS¢4Ïó´$"žËrù×ëéõzVÕßÿ|ûóëc«f†¢¦*î¨ä®dà¡•;fé)óåº\Î3˜¬û&]Ü ‰Œ˜R¼ãrKÇ) # "Ê QÅ¥UÕNÄ)'¤z¥œ¢WÃI'@ëÖš4ñ¸q8‰È÷÷÷PV£9ÒižêÊ´Iï]UÍ-™Їébè2œ¹GUÙA 5íª(ñ*%¹ŠÂé´ÌËÔz¯UïëÖZ]·õz=/ËœRbæRÊËËëT–ûcûýïoï7wH‰–S)™S:‘¬G+‰Ï§Á‘0*§­õºï½µ”2'J93¡ªnÛ®j1S¯µâ²ÌD©©µ.µ¶ºWŸ“ã1Š5ðûa”øn»¹šº©Š 3:¡©ÀQõDp ü‘—sv§£¬ç@”óÄ*ƒž"ñXëP²5»ßÛ÷é1/ËË ¥”–…)ï5³»%7«ÝÍ´6uœ8åÂÄ“£™bJSïIš|{«ï·õÏ·µµÛÖ^¯§œRN)ç´,¹”˜zJœ3g&B¬f÷µÞÞîûVkíëÞß?îß¾¿·ÖƒÑZ]×uß[ïÑ3ëM¤:1g4AFb*œ€b¢9áiJD¬#Ã™Ú¡Ï ‰1’ÍæêΡZlw7ÃX^ZWU%€¹ðå¼LóÔÅvUcÂÄ:2(Hñ8G1u7‘0 ò¨39¸“ª:ÄâB1?¾ë<´yÄB£MÁtàÝé/Ëܑ׳ÑÒ;l®ñò\? …G6ÞšppÇŸo‡Ã93¤B nŒNÌL\ri]·&ò~§;äœNËt=ÏDp9Ï—óùr¾î»Ö·÷Ûíf{•&ª>àvÞ?w; ËÏšƒªyP‰Â™ ’ǹš8!€©ˆÆ*ÃD‰œ(;ƒ‘þõû#ç·RÊ—×S­òö~#¤Ëea © ‰Jë½io½ïëÚ¦v½¾~ùéº÷¿ýñÇ÷õ±7¨×ËišÒÜLÍ ½!'æ H™ó”KÎ)eBÊÌH9§Ûýñíûý·?Þ¿¿=öª~ä' ÒÆèN„þ—Zã2¡¶cƒŸ˜sbä૆ÏBb9;&cÒÞÚý!·ê&Áâ∢jÒœœ¤ÄHd†ªh1øvw:¢SÇD›ãÙ§ ëÖZ«Û¶/ËÔ^àÓ§×RJNœÜ”OKž¦éÓëuYæÖúížÃèËL¢Þ’!!Šéº¯ß߾ݷ  õòú²w¸Õm}Ü¿[O©ðyáÓO×ë’&¨÷÷?~{ûcÜ•e9§TÈŸ ”´8<¹£>=[0DÚ„ÌÀÕݰK:Øì ‚C“¦&d¤HàHà4Ø~˜2±jЋºËxÄň)H¿£b'ëñܵÚsŸJ)|V¾CvÃ=;^KGa šn!ù;´Bð#¹ý#~2:ˆœÃ¢b½K¼âžXÀÁ©9s)Ó Ð{<:! 0NŽ€ªz´eAD÷½¢"b­}ßš©#&@¾ö£›’8%Ó(J˜€!‘»‹* @Æ1QíÄpš§Ö¬µ5¦ò>ü?ã®cÏî5pœúMa¬rÔ†‘ØÀ|„Ãì®hìDѨֈ Å83>…Íàöƒ #¼óÔD¼¥ÿßkéè…Á_¤Àî"×Hsßö o½«íM§Ìû¶Ýïëí¾ܶ½õÄÌ)…s”©iÊÜ%xºdcÚ4 RŽ PÇËÇý¹í-¯Xgºá¨0Û±³6Ã}¿ÑTŠ›*‡B!¥2¥ëe~½ž§2IßÜVqêNP[Ûn÷Ér¦L”ÔZΉ˄yë ! ó”sÎ3sJFY19fxßöû½6á2M€´oۺ׺×^¥uUUCTqf&ë­¦”–Tæ93áõ<ùtEâÖýýÖ·ÖÜ̓ðã,¦2,ÛúOu„”x™s™’ô.*€0•’RÖk 6`œkÆ}[5¾€ª¦*©°A„šo|LJã.sÊ‘°<ö&ÚªlµÖ†:?„ÜzHÈSNDлK|ˆ<Ž£fQoÈ)†Lká’ NÞ:"5ìêPÕt77q;Ÿ&·½uGŽY 3#áºï¢½K¿´SÉ%¥( `ÎeYp™¶GÚEUÍ[•Z»ˆ2ˆ`@¦™h9ÍD ÑF7sƒðòå’JÉLìæµÉí¶õ®H¡º¶”è|šÁëãýñq{ÔÚUd¬>Ž$[¶i¼V ™ÉÀŽAa|âq†‚_FpˆY¸ƒ5 ‡CÉi€—)º°dNfl@n1_ ßü‘x<ÚŸ_o]áå2Ï…ç)3zäRSÊ÷­·.ÁèbÌ6Oyž™RlÝZâÖDÔÞîûÿõÿöí}}¹^ÎË|ž§ëeþéËõz=ÅqˆKI… È·Ö¾½}|ûúQ·¶·¾mõþØÖûªªÁ÷rÊùœË|òÖ}ÛÛºYm…9§ ˆ]L„»*€Ÿ–ùå|Ê)µ^kÛsÉ38Šh|BÅÐ D ¦”§ysdàŽÌh¦½wé]ô˜äƒ—¹w\J*9-ó4MEvéÊ)B2Fè DñmøáÌáñ†ÄPÅPå8eE loƉa¥é0ùÅæ"þCéÏåñ¾Æa;êuOÿ±ÈõQ€¢`ž&e¤h)DT,^fü4¼»¹¸³CÎ8M ™km{‘îªó\('Z×íñØëƬm[·m«» s|®£¬]?´#zäj×hÃ3ž ¢&jzôè(¹“©3¨ æDл÷fß¿ßç)gDºÎ`[(+—SŽÑÀ.§„¦]tßÚý¾Kµ\¦yž~þùÕ; Òͧe^^^ÎÑxÙ¶îJ\’!š›Š™zÄ´»hWm­I3pWé’­”4ÙÄ9¹#qêªïo·_ûúÿüûûŸßÖÇ£´Y„«ÜãiãQ¯h€ºœ…o$Ä®­×HŠ‘çÂÐÍ·æÅÓ¥™lê«LŠ5ÈR*Ç–ÀŒ˜'&WƒÞ}Lqé€Y+.8²I]\´ïUj·fv½,—%§œr‰[ÎS¹^–yžì4-§ißÛúØÌüϯïj~¹ÎËibÄÚ{À–EŒ Ê4}þô ŽsÆ}#黹 ëËùúÏ¿½’Õoü¶>Þ»ãN'Ñôvƒ´LÎ* ê€È‰¢^60cؾùýGyúhHø_Æ9Ž,±pØâ+8˜JcñÛZkÐzýxì¿ÿñ‰…`×61ÀÇ2·Ö:'^–Ó4éV»ƒ˜¹õc€„Wzt²¿ìF)Î-ŠçOüú°ªýW±™çÅÌ0¥’Ë4•R˜™Â3ÍKž?'öj¼ÿùþöýÛÿþMÎùœ$YKÞ3·®Z›³ 7ÖáãILË'®]ö½›v\Μ²“ÑDç…|Û¶ÞeoÒšÒTÎH(]«èZÅ|/ip² ·Î!ÚU»ö­îÓ”DZ>{{œOeYÊ2ω§™Da][eyò¯ÉÌý|^Ì@͈{—øö™¦hceOD­…Ò)- QlÅAÕššˆ©‚ˆ«÷'xd¯ív_ou­zXZ‡*›Âú: =9MÁ¸ÊÂÿôùürž®×¿ª_·öv»Ü·ÖÄ ÜLÄhÆÓ2_γ¨ÖfëZ›»èbnwy¿}e~+‰—B×sùüé|½Ìn¦¢9çóùT¦„h{oïï÷÷GëÒºì{m{7QŠAcÆå<¿¾^¯—sb–.u¯Á=twD€½ö½vµ£ûå¼|~½–ÌÒjë-†b½«Šš«€*nkÕÞNóòéËgdzlëºm½73­3r(¥,§9'Æ£ù†ˆ±íî*ÛÖö½¹!‚FCiÌ2È 1š‡ü—œÀpHCê qÍm^™Ñb0rÀ÷ilHC¦Nà(1ž"LGQ Ýb]0Ê»˜ˆ x™”˜-Ì G4щ‰ÑÉ À™† ü© ÐJ#TŠäqh$ȉ245 Hy*¹˜úÇÇã·ü­‹àÛûíã~ÑÄy*¹$vOIc#„ªßO‡P2G¼¸:¨DËÌÆ?D!ˆº€CSÜâB˜2ºCk1¸K8ÔÚàNÛ.ÿþõëz»ýç?~þÏÿø;¯û®ÞçiZ¦9êÓ4!Që’3Ì“¸ª-L_^¯§2}¾¾´Ú¼Kû¸Ý¾~ûžòìεvéÏqùTæóå\Ê<•‡ˆå©¨ûíö¸Ý½›¹!SN¬É­Ç©!Ž[•Vµš§²®òëo_ß?nLÔ«î[5óTg6·Þ¤Ö^[Q‡£«£93CJ<ÏS.)æ¯[•·Ç×o··ýq¯=&V…N"öœ˜JB¦` £c¨z)ú•v¼¥W Ü;ÐȉQ f:ßD»´ì™‹Â©q)¹:¸ €¹Î+ƒÈ:¤” ¡ ’§„ FƒÁPEt¨”!š¨v5qÝ{ýþ/sy¹œþöÓë—//ó”!‰9s.<ÏežËýc}ûþñûï_SæÓ©¼¼œ?º¾|ú4ŸÎ­©™¯[­û~Yð<]¦òšKª}¿ß>ú)©IŸ&vþTp² Ö·¾o’^¯'ñÖ ræ)˜ƒ¸9•¸ä sB@±ÞMÅT=d­éøg’ËÊT&Ê(èàÄL`QÖ0'v$ðÈŒÆY[Â3>¯c`«@$âØð"Úvýá Ïy1´~¼„‘Âèj wÙ!% ëJ ð¥kï¨ICðHÀwøc&~Ì¢43bgpÃ#B ˆ1ÃÔ~frаv%b³Æ‡Ò â°Q.ì pJùr.Ë’kküù¶×z:Oó\†ˆ„œä’ÓËu¾žOÛ^ëÖZk­?¶µAp.SùåçŸæÓ¹|ýnÒˆx>M^ ©°Œa{ ¬;$¥èõ12O¦Ø°Y`òÝ} ¥D1“ehÜ%jAãðDOGò_ ›pƒ#ÐE„耥£j…FCèK! Šâ8!R¢£âdF½vÕFH9%f"f4kì$]‘ˆsðÖTz¤é\)0¬î€À[yzvE` d€û_b0A€ Ò9ZèXe3cÊœ#BëÝ €/çe*KÊÈP¦GçÛƒQÝa¯µ%@Òf½{òˆƒ¢0¥œ1%A5WQßÛ®.âÄ%¥Üë¾®u¯µuñe9-ó‰˜v¬â½‰nµ«`áh¯43 €[]÷öç×Ǻ7QŽÄm~bÌD%¶•í1™ÙcÝ{N?(+%ÿòóg÷¾-Bs IDATóÛ[~l½u­­ëÄñ%í"b–s™ç Öm_÷}ßĵNÅ]mßå±m­W0°î¦Û󰌌ô B* )ƒ»™…i¤ÐÍÉ@Tg¦Ð^ŒêÑ‘>{’J1aT\Ƶ”ÝÅî<4dª}Û!СLüq{Ì…®çùõår¹\¦yJ)»Am†¨€ƒ6ÎYà)‘²§Ä”R—brsÞd"ˆ†1«•™]]bgjˆ˜rR3G"uÛj}{»½½Ý×MâM<î5î%VUSEŒK&ŠÃM0ÚP¤ ,–”æ%'æ(Bu‘m×èf3'·dÆs†0#' l ÎÍSébè£쎠?”nÐö¾5"_æt½,S*î8Í1ù¶uéÞ£¸M%BíŠ`jÄP ÷*moÛÖ*³û€ß¾~/ Ý –Óéz½æÂîÚE¶µ®{‘Ö¥µ¦¢ ”ˆ™‘3r.=g] ‘ãi™//×Ëõb µÖ}ßö-ÒA &î¶ÌÓi™˜NÙÜkëÛV{p·xÁ"ª!!¶ ¦©œæ9ϹL<ÏißkÝ›4qä\Ò§O/_¾|šKV3“®µ¶ÚöÞÚ¾·Z»›¨Z¬RÐÆfœ™r.H¤‘á$ŽÉb¼yÕÜMa|$ƒUD”˜˜~H¼ŽE%)qìU5Dæ44N„n£GœÒ0ÿ“s:z5˜Št(ŽÁ1žK<†Qo0Ëåøî ³Æi"mŠè‰Ñ3«e„|>Ÿ/ç“´ýv¿í­Ü÷D¼ïûÖ: Í3åì™c~e’åT€\DÅLºõ_°¨0‚(˜ù(D˜ºª˜ëøv!+ÄÍ@cÑHüæˆ:‘›)º#²9¾ßö÷·7üþót¾8ÔÚ:/F¤6g6pU˜ g.ªÝÝÜä|:¿\.¯×—ûýq<>n]T?>îªRN^¦XDº¨uõÂùtFPÑe™§yÚ>¿þúÛŸ¿þþµIã”01'pFrWtC0tÃÇÖZ¯†@u—÷÷û¾WJœ›©ªŠhü܈(•Ì)E(c»>Æöñ×M­ûº÷m×ÞãLS6$¢è1æ’Ê2q¢8È©DófÌæ|<ð(âCLy7tB`ˆön€i‚´P¢Âz亀£Ço±{BcòD€„ÎÈ ÜDš™Ä z .ŸóLµwŠöFï·u¿¿}ÜN93|þüRJA7GÔ´#$ÆóiFÀ½¶÷ý{°OŸ/)¥þã—e9¹¹ˆ~ßî3\NçÏŸ^RâÛãöV¬n°}.éçŸþþ¶ë­s¦4‰µôz½¸CW“&îžRxm@ÔÐ0!ÑTÒ2—Dè Haw‚ÞTzlr´+Ô†{¥º73ëÒ‚'ˆj®(pƒÑça`D#²ý!&âPydnÄ‘Ï]ÕGe0âƒðôÍ;²øQO2‡A®ñ?8FÙ®aDPõ§ Êâ88=/~Øîyôb‡XpÛ"<þñú§Sãx‹º ‚Çe*‚AB5xøñ›ÿ(ãù’__ËiIîvß¶¦²îµä”˜¦¹”¹¤".]‚EÈóTÐT{— \ÔÙÌ9á<¥óiª—“¦Ì-Ói.à¼WÓ½hüd,6‘·&j• F“ j@Š Y$°}L¡Gçr°Ç“šG¦þ8øúA™ ¿ 1ÿ:ù'Ä £aBF@Qw‚3œ!eˆè'Æ…ŽóÇpÓÄ}Æ Ù£¯GC‹¾¨«vPtÎàÔµw]iª¦ †Š–ðYâ xñyˆÀ( ÆÆøÔ‘•`¦'7È98‰¹dÎ5QuS]:ÐÜU÷ÚÔ[¯¹œ®ËBÖèÈäLm]ûÛÛýzž^¯g$ ði¢ó©4‘RoF{W$sÊ©SïyßQ%þÖ)3[æÈ¢#¹£715@Hˆ õÞˆ0vÑÒµuSÑÞ{ ’ Ü ÔÐakf·õ^ s"˜— Œà·ûm]Ñiιd&N€˜8¡kï6ò®Ì@SŠ*|\ƒÍÌZß@3ÍeÎE›ârž^?®×¹ääVz·ÛãöØïë£w‘îÑeué(9n 8%L‰EAÝÅETµKð·ÊoÅXü2s~ÚN£t7²ïJ4ÚöOä5!{˜“ýq¤‚€Œ€991å(ò†eÁÑ܉˜I”Ðø“ÄîÇ$ŠLÇ«ß=® ‘æ÷‚Š©¨úaq&,%%â‰ÓÑ+Nµ#®R’™¸)©#sÄ;£cˆ>Mœòlæ­éºVÓ1/@dB?Ê-á£:FŸ%>4æÀîêêƒir‡@{™¡C øb³Aê,B·­>ÖUURfs3Gàø4€ª¹93H“Ú[â Í¥ bN§¥¼¼¼˜áãQSÎŒH%gæt¬Û^ßÞïMâ€Ï"”Ó2Í{­ßßßekaFMŒ˜†Î.ô ƒã`¨n÷uÛû>jH½ÛºÖÖ@(øVD‘ùtut¦GGS3µ6zð!Bur#Œ =UhY[©ä¦ªÌ$LËRn×uiMUÿý‡e¢R¹-år]–µÕRE¤V¹^×Rä½÷Ž…)(ó›næ!X¤ ™¡–(ê@B&!d,P™8 àc«÷^J­­zt5°Â¥JU.2o?¹TÉÑòln"2"³P-ÕÃTwí6¸ à°²ðÛååííËÇ]¿}ßûè‰NŠ'Ó9§gˆ!Lnª+Éìo%à9ã@œÓN,©ùû·ÛãŸÿå,¡èÞ ¿^V¡±³2†Ž {@*•¸w-R†š£¹Yói(>i‚I§Ý5¶±ª=·ßfyH"Œ R4·Þw%@"hwº?ö_û!ûñ8F)òåzy»­—K+RˆQÕFùdh5ÖîúP°&¯ÂBÚ{–k‚j,TD–KŽcÿÐÁ„¥øxlï÷í±g 1Å#Húfn‡ká*œ¿ÄÕ\mô¡ ˆ’lÊ$#Fp3ÊSö9m¹ìÊ™ìDhÐü„¤«R~º¾ 1¢Y ÎoÍ,Žç8hBNáñ‰ùϪ`îèi’ô"‚‰ÏeNœ,Iù®p§D¢"Ll®¹,E¸ÖÒ …xàèCó»öì%»k„ˆøI÷Kšò\ÆlѨˆ<6æ~8ÿ‚N¾x¸úpG..ž;áææÇ®)úC)[×ÿùõ÷××õëO/µ “äoOˆ“r¦ª"ò”ž¢ºª Ä\òðº.fAÄn³s<ù,$CÇøè#Q,Â"L„×[{Û/k«Û>™iàCã3«›|ôÑ5/Œ„s¼É’Ö¢iK("åãÂùaHL;j€Y$ÁÖƒ ´HwhÄ)!ÄYDj'Š-NoÉóŒ1Ù„ç„.ÏiL©¤ö@F¦ 8çÍpðÉëppWƒ FPæáÆ`©@ʬ±ÄÐSæ†j²±"±TTk¹.K-u¬qoeŒ»{<¶ý¾íK+R( Us™gÌÈŒÌðöv½¬—mëÇþþã1ÞÞÖ—ËÒJiMþñó+‚3À8vGøÀ¼…:;2bCdc¤KåubÞ,ã~“dDÄXQÍMÓûçnjˆŒp Àê@Oh1zà¡€asCüœ€ƒ«c’¹‚™‚‚Á3_“é”낈OÍ+œ‰s³ãÁ@‰õ™b¾ÌÐÌ´ÏÜMž (<#¹¶Ï}   Q›«Í‹Äù@‚ç3.vçD1/•>÷ ÎsF‚î<–Yz",,K“"õcf#%·yÿ%GtF@=bß›ÃðØÇ¾u_—Ì€X„\»ë¨… I-U ú°¡>ÂÃM‡IWhKK;KE4!Õ±›cþaÁÑ=B=±H4½lç”ô´4œÀH‡K'ç¢i&  ‚#˯Da˜ãÀyÌ¿Qš_ÊÈ‚>3W‘Z* Ó.Ë€a¹Y›UŒ©c"©Ò–Zju»ßï}×liÎ-ìóê Êfä¡Kš> ,Êû˜?E^'®™Pò˜˜ÄɤÍþñ´TL‚õ¼¥p^Í0 S-\Q•”n¯íö² ¦(uiŒÅÔbüqؽ«Ù÷ïXÉ‚d8†k[¸‡¹4ö½cáÈï£}ÿ8´ÐÒ»ºy¨Ånà!y.'4óáUa§#{ B äù}âÂ2Pc¢¹az?ç¡ 'Íñ4H£Š`©ycŒÞûøöýáK•&X˜ÔðýÃÜußúÇÇÖÇ@$SèÃTЈ3è›M 0ÊZ(pNÓ÷‡ ˆ3ÃŽŽ yYLNÓ”ÉMŒ_>—Ïâkú™gôþ?N¬×³ÙŒ–ïwcg9ˆ¡p, —Kq¥cï¦À̵–¶´Ú–ÚZïïÛÇû…j•Öêu—uÔZKáe©D,¥¶Új‘äá¤ÐFò‹™ Sa*•‰ÉŒh¤ÿêÓ’ ,X åUÇ,êKã—[EX…a?À#j‘ZJ@H®˜Eè)çs÷1&¬¦éˆIkáp4)c˜{XåÑ)P¤.íB¬{·½wÍ×óS°–;Je=8A´˜!ªÄ41eø沉pŽÜqïöããøØÆÛ(LdZ…äÒšðÆ](;˜E·(æÕ=LœÄ"Bp˜ÌÁ¹Ôvð™yÌ&Α"{Œ1••yRÇt`€#Ø™`$Gë¾ pË¡‚»a„È´,Pj¸»º©»‹ˆÐœ;˜‡G˜ƒY˜`bQÉÔͳb„j†èØû0Ó@Äe ÿñ±=6í=©$ÁìœëÓ~.Ï Ñ…NÙDýè62ñŒˆN`–º“üÍbÀÔ!FÀS*Ï}Z¾b)ru•õr&`fa>Y q6ˆf;ÄóašSÅ £z’OrÔ,ð€:¤·-õF˜1z 5?UÁ8E53[?O½ÂxŒÞ»–RÖu©U–V–"çvP…]¤2±kø0õ¬CÌÓ!JA®©·p#SаìQ¨[dÔ$h癄€0Òé@Œm"l¥ʶ÷£{XÊìYÿüñø¿ÿùË~úr[ku3M?Ô"îŠ Â™eèPÓ,ÒŠø†Øk%ˆvÚU}ìÄ"Šð8¬oHؤp€·Æ¯/—·Ûu»w ä$¾L‘h<áØ3»A˜¹9"Ë0!b—²æ–n'"üäçÏãÕüä1”ss𤻡ZĘ3Ó€ ,…#A jÌvEÚ…ð¼Lþì©¡>mHgŸ0$å%:gX1ÒùŽœ~ó ž @AD Åbd"fa&2C ËXÉÉLÐ¥*ô…±5â²ê ~ìû÷Õ¶´"ÂO ºZŒnCGˆÔ—×K©|ÿx<¶8Lǵ•Ê×¥µPUoëå ü¼ï~ìè(#höuÏÖƒˆ"¹OöNœs0f$¦RÄ,¦ˆäüe§e ÜQG¨ZÞܘèèÞûzİÈÝ1z@× ˆžål™/W6µ0;'Á‘NЛ qF{ðLˆÿ„̯žª‹)kÀS ñ$¯ f7ƒâ„ ba$ PW3ÒÍÏÀF¸!Ò«†§¬ìy%È‚Q¶ÍÃÍs¸àB°Ôr]ËíÖˆåÇû>F`¦¢‚-ÀÀ‘‚ …ÀÔþüãÇãÑ[“Úˆ{÷Çv ¸…;Àq¯×Ëëu½^—¥á²JmµA GdæÀˆîvŒÞÇB­VA àÌݾÜÖ×ëÑÊÝíÛ·½k޾=Ü8€€€`â*ù·0žvw÷œè “–Œa23·Â„ÔÙ»ÂÐȯH>Ýã9`GœÌvdÿÉ|†… „s9FjöýýÞU¯Ky»®Ð k¼?Žc?z?¢µÂ¥Žac¨™c[8àÔÈÄ0F`FAœäš¸ËÔ9ûTÒG^Ê æ`‚XÏóž‡ú©°ð³¸ð„ ÎVÂ'Õž8pö˜™Ô4‰g!©‹e)„0ºº…¹mû>FÂÇv¼ßï÷½¡]¶þqßED˜˜±Vùí÷?__.ëÚZ•Zʺ´Z…§æ‚¥H–``Æ©''-ïœsì}R‘¨Dž^݉ 5|¹Õ¥Êq]{Wµ§üB8À ÓÜ7wçfèî¥ !cÂ=¢–’@Ÿ&•ÐQe)Eݵ?H䟿üt»]ûãÛûý JI±³‘Z¨0ÚÖ"·¦ŒÀ”7gœ¸ù“ïöô»|ÜÿûïßYà—¯·¥ÔZ–VZ•¶”öèï£÷~ì}hÞý±½”*ëZZ-Ç®ý0ónªÙÝ1ƒ‰ãÄÄ›q0§E1ô¼LX¸›æ[‰(G\ª¢"µ&G]-îuG)CÝ •ƒtvNÀòD>ÜÔ‘rëcX8”*iá $$E7ß÷¡]#H=¶ÞÛ±ïŽD j-B’7p@Pw5ƒ3 Ö»}x²Lš9†ä¼,W~§„'ߪóIÀ„çñf#N·!LcK¦\ !AJís6Ä <'JC=YD¨ªcЉ7% fCÇ14I˜„2ƒá殡4¥ ªy"€€Y¬àÄ $»¸¢9‡£&t­r,…Kf¡EÖ¶®mÙ½›!‰2nÁBYÏ]‡;!"åÎóÀ„(Ežrˆ b"€¡C÷~¹Ö¯_®×ëB(û¦™`YT]uÔ€üñ8~ûýÛlu|y½\BHIëõº¶&G·>=â±=i]Ö¥.¦ÓP+ÂK‹~ØãqÜǶo>ü²,/·ëN|¿?öÞ5>?Þ?.—zYêÿùÿþYKýñþ8ÆpðF¥-˾£,¹=³,>¯±‘á3vò§½‘)ŸOQœÃع ä I®?žzœ „ŒÄB"Á¦@ÙbB‡’áI(Ï/Ô¤GÎ$ød:a±šæÁ07Dp@bŸq.#$fiˆâÀˆ(̘âB÷Yu@"Æ¡肜-ÏkhDlGÇØ÷}¹p[j«+@¼¿o½µ•Â\DÚR×뺬U˜¬Ñ{Wµµu•RnêNŒánÃöí JÜ€#Áº.\xYWSçaÜ7§µ! Ï9¯0—L” K˶\þe1"‹à9펹Ôó‰‘T7ƒ0fbaˆ8öcì 9eב“( Îó2F¢ï¡€PJ1IçÇÈš?"Ïœ~ÂTýãI;ËhýI~fî#ã@³ïD§"óêyGôÏñ,2y¾Ü9P-,KГ=LÀDÄèÃÌÆdUÏß8çélË:!\ýôÖ¾~¹Þ®‹Z€ë8HÙ ÌÐí¤fK À†¿ïÛ÷÷@¯/—¥Õêî¶m¦ª£w¼\Öå²¾½ÖÖ²`½÷~¨¹#1‚‡ ”(DëR—Ú27\[­­ÀífHíûÇþ±æÙš škB’00œk"¨‡äÙç(xyóëÅ€8ÁˆHg/ïæf–îȹÍ(}þZ-ËÚJabL#lb%¤pŠÒ2ˆDÎOÅÃYUD°>|ï¹?,ÂÂ@Äá¨îO“09 ãìæbÚ¦° <†šuO¶0œ»àÜ#BiEJ9eù`ž+(3‹1Ôìé>öÉËœ y,"­J-ëE^Ö‚®÷ïû_æ{ öÏ//o·ëã¯qüx˲^Ú庮íåÚþû—Ÿ/ËòÇþûßÿQS)%„ƒØ­8„íÇØÃ-²¿˜+"!·a¦ˆT˜85L°2Õìz2QYZ[j ‹AÒƒògûvÌeþü[ ÊÁ'ƒazYÏ£wÂ=ûèct×&44Ž};úî­ÖÖ@>]MˆJ‘Ü5™š3“€˜ñÌÍû¬ %k{rgýs#AžCžÏÉS<-äó¸ÿd“ÅéyR_çÿ¦§p„r*9ã¡g™ÐûpÚGk"• aßú¾wµH^û¦¦HàCÁÌzïpúF˜éÛ·ËZ¯—eiµ¾^×ÛõÒjáËe½.\abáÍ H-·2gŒÞç‘þ„îF€kôc 5"\Z­…ÖóÇqß¶ãèy}1$Ìn܉úÍÿª3ã:ºš%z ’IT¦*¾Ã¾õ}{Ü®ëÿ¯Ÿ~úIÐücø†™Gî€IJ-À‚cŒ}ëI½O8T„‹ã€û×ëz[®„ØÇè”a©å²üôó—ŸÿñåíåRj!f8Ž£lmYV–fÖã8ÌìPkKò‚ÁE¹ ×þøèx<ÖÆ"­«y8 J)lª„P[•"'¤eâÇÜqŠs&šáù^Œ¹nñÜ"–Ê,\DÆá6¸àüÑzâS<Ü1|¾<0Jd>è|w1 avjÏqøóqŠéޤ󓜺¦éù‚‰Ö9ý0ÍfsT?Å‹³\<ßÚ3IÀL0 ‹8 ó?Ðá3 š/ĘÀ ¿SÿI 0‘³µÈ—·Ë/ÿx½¬uïªc¸ê~˜ônýБ‡QÀgÿ€ÍÀÍCwÓ8®K<ºF@a9Žññq_]®\P\mÛúq Õ éÚ‡u~yYo׋0÷½‘ñ&^ør)µ"3£Om0±qd#)ˆX²³kùÊŽSå3© i½òð| ¡ãYéÎþ{·—Ÿ:>`jµÔZXN}Z„Gäá2„H œs#óÑu®ŸO®ëDV›Ùp’R€<ÿQF6?ånȘ;ëZxYš1ó>T "Ð5­ƒ¥È…hFNóÛ ÌX‹€H0ƒçH[ÕÔÁ}.Ê"ètÕÌ~­¹!f^ ¹5®kUíѤɭbïÇû±«]Wùç×em…ÆRè˲¬ëåRŠ´V®/k½\iXß¶}¿«eŠ@êz-‹á½ð´9fš‚¦ƒ1±¶Vk3ãkb¨˜©ÔR‹PÒ_™Š»‡ª÷>º…ä.;fí5'ðàÉ»@ ¢éNøÄ33!B²ýò5H0<†zŠ0QcF‘ÇÞ½ç •‰$ÇîÉcüÁ<ìIÓÊëÈÓŽé‡øä±Ætd·çü…§?™$[ˆ“‰ ž˜ªÏ| žñàd |¶Yp¨Ç~DØu-­±›l{w‡Zk)„8Ô1…QYX›ß¥|ñy uìŽé©£¸?ß¿¿/K[–åvãEo—*ÂÙD@ÍŸÛŒ4ŧ<1%®aIgêÚ·¡]O3á|˜G8B0΢$f=¿O‡ƒkrõ²i7†‚{u˜³-@Gס( &ÍóÀ²”/_®»½o$B¹¬SLœçfw…П0°Ü?NØ*:æß‘«Á¾ûŸßöÛõ½•úv[ð¸–"" º«öG`â5mJú褒1‹` Ä>ì  yƒ31†Nç…8¨®™Ã†È(l@îÒS˹ý&zÂÊ9ÿ=j±mýèI[€¨…Z‘ÂĹUFFbDó°‘œÃùþavŒDmG¿oÇ8-ƒ*ÌBŒ’øy†Ï·§OÞRn*LMsx$E’¤Ãg¯?>y̳U7Û1ÄÙ/øè™ÆzQ,­,K#IÊU ˆžN*D S·óK<-?Â"kÒhNmºu—uQUpP 4µÈ±F6`@‘³<‚@à@îè6¿Ú¨ˆEJaA„R…™<ˆ¸ÖÆ¡D^²üŽ@D•ª‹… A­ ·eßúï÷~ìÃÜ â… ³òH‹N&%809x„‘HãÊËÒ.mi\ÖÍ­ºÝÖÂíC6ŽàKåZÙ݇Úû}ún1Þ^/·ëš$!ªR½¡ªšŽŒûªi€•B­²¹;1ŠðRS4 ÷ÇacŒ€(µ”V†™ZÝÞ?:óGkõ²Ö/_.D!…ÿã}?ÔJ妩s9·Àð]gì7³ÀSÜtNMðìã~†)Éq.!Î'Î!+œt˜ôŒðL y¤Õ˜Dæ°/:ÌsÉ@–Åð94ž<Ùl·B­¼¶‚ŒÃÔl˜a-"$Îè6“½nAÇpó˜T€' ȳ° ©y‚2ŠðºÈË­¶ÆÇÞ¿}»?îûÐ XÇgÓ@ýþ8´š'›ÂMUñÛãûýxߎ|½ýôåöúry}}Ù÷²ï»ª"î5&¶²ñþ8¶>^n—ÊQÈŠ°õ(\¹4ˆVÙs]K(K#æu]—¥ãPÝ~t#zO»ë9qÌ”ž…øˆH-n•L—23ô‹aFëÙ#Âô”%åŸÖ-83 sÐ'/‰æ3#×ëá~Z~Ñ!2V•Ö<Écs”‡ÄYJvs7‡|TúŒuQrÏÚ«y„ æj3ñ>_ŠÉòpômÉIwæÛ>¾PÏÏi~nlŽÇ Q¤Ôº, ¶^õ6BŠ 3ÀÃ\“­„ÙÎs)‚ èä`‘Qlbá ­pkM„B‡>ÇP3Õ¡ªj½k?ÔÌãðз//?}}½^8d„dc¨13a-,‚0æ9 a)ÄÄ$€æs|:)JóµŒ~ä (eŸ }ó,õgë?R¹ϽýÌáð&怅“ˆ“¿v~÷'te†³EÎ>IªlòsADiV*%\Ì5Ôtt WB~&µ&4 Šðí¶¼½Þ–e1óǶ?ÛÑu„[­ÎÿÌ0{áÌt½ÔµIÚ`Ò¡lîCu?†*ؼõœkàÈü´¹›×"­–¥q«¼®emEÇ1F¶xã×?üçö¯Ÿ¾üüõµ•rY«;šƒ›‚+„í÷û¿÷í8ößý÷¿þBDæêêjh(Ër­¯°¶+h‡¾ ë=Ÿ™æ†ˆT[{y¹•"÷ǾíîX„[+E$݆ÚÑŽaû1\%ÛáˆÄLEHÂ’ªÁ…jå*Óû@È\Jk"åô–q)T*•B­VbvËp£nÛ¾Ý÷cê> ˜;}‹p¦¦À€Ü.b>¦ðÓ0”dtá| Ÿ–nŒ¿·Æ˜=Ý2îî–ÿ$$Ëâô¼œMtôY}ñ§;7„h©umeiREÂè.ÃÂEª‡â ù¯˜ËWæ'QÊDÆä—À,¶£«Ù~ô}?tìf×VkŽË[kjn<‰&'ò_ènªÚûÝÜS€‚fÞÃÔ<)"Ç‘·™¹Á™òŽp¿4Ô-}æÓ‰žåênÇj(ÒD„ˆ¢÷ÞÖ¶®².òØ8@ˆY‡©Ž¡ƒÉÍ’ªžÖmf¦ðHúä}æñ<("0÷þu¢ð××ÛÊ… 3/C¯ª¶q1‘E‚£[ÇÈñ!"é÷Œ¿ë¥>ipîžÁØ'>a$ÓTàîN„9t§ÓL9[nNˆŽcDï6?x9ÚbÊx´{Êl!ˆçÖüÄ&0gëÅT÷½ªG×Þ'U3k…¹œ$'¤Œ6L±."‘äöàTAND1Í=g’½’fƒç>Ò@Lù@„…›Úç#6‘ˆ(¥¯­ÔB®0†»{^Z¦Ñ½÷îÄ$…™9I9L$ˆ¹ÉÊ¿í#¸#3•²¬¶ª‘\þù­CTÕ™¸ !‡°‰ˆÈ¢¼d‘ºµÂLÙ— p!É T)­ÖÚÊ œ$Z "A3ËÆCx"RÇÐnf 8·Œx„\u€ÅLm@0„%‘Sf6zï}˜F)¸´rYŠÐc ˆ×Ûz}¹ Û~¸Çvìò­–ÛíFTÌDxE:·pNOs€×VÌÛÑû‘tÇ"Lœ¥uý0ÁŒ—ëjã}ÃU¡w{¿_Öòúr]×åç”þϯìÇ€­w<öÑ{n‚ŸÒÝ3QOÏD²ÌÇŸÆSA›)s è³Xb÷Ù& É‡²¤¤€¡(…Y0…§j:ò}ßÙì çæ. j©ž$¢¥æŸ"\5L5Üyî(jzf@rš3„¿†YYû¡L|»–×—úöZ—ZŽ}`©}äq>_3°âxô‘ëZ@dBD6n?¶]õÛ_ßþëëËÿþ_¿üôÓ›”eEÑ1òX ­×•Ž¿Æ±•XÑÃUj ,»Á€»ÔÖj¹Ü^Có¡’DÎëZ½IaY×¥µJ C‰8ˆI$Š˜#<œ00aêg‹š}š°xÎ ˆbiŒXò¨¥fƒ"Û’9 ÿ»ãuï3öÿäùãYÒ˜Ù¡ù ŸýÌœæ  Ï£7?o³ÏÑ<Š!R­,…!Â|HÓFé³ßGœ!A‡` .è–uFJx«&ÎçIÆç©¢ËéÚYFÈ´<9f$ `þ×ûVZÙÕqï> ÔCÝ¢.…³™`ŽfyÂÁ,Õãià)"ö[k][¹¬e]Ò°]ÞßÕ(•™ÙÌÇ–… °ÈVM8ˆ0#Pﻚ"Q­r¹.ëZÑí\ÒŠäq†b8üMÔàgøìð§4rÎ-7#0=©4Hþü¬d4 s)B<‹ÜôI_:‡«D™ #wp3wGÊ\ ~®èÏf~ˆÇÐÈJ"¡gÔ+#¬,¼,õååòöv[×%<.k½7Þöc óX\ÍÃÆ¤B\3æP+¿¼¬K«1ºêð>B7u®n9º°¹áò@ò D,¥^.ËëËr»ÔeBÛe]×åPýõÏÿóÛû÷Çx{»Ü^¿^®/­Ê‹þöíÇïvßú1zßÛûofý².µ «ÓãÐq{“+´ý#¾»õ1¿7î\¸Öz‘²@[JÄb$­H-è"\Õ·chB½†g·2;†Y¢©É ¶Ô{¢·ÊµÁÄÕQi\ e$ŸHDJ)Œœµ̬ï騇]ÇÐp§™éÀS7‡pÚ#“%ã³ç󹛯ÏO ¨'|:Ùx‚„™ç'œ™K)ˆà`6á@˜á(µ¾¼\×e&÷‰MDÔ4ò¢!œ§DžÉŸÙl$‘tÛ1åz$ã/încô½ó}£¡æHhy¬ÏÊ/„¹gª ’63Ïà:|dOÐÎå °Dø't!‡xn ªAÌ"Òäk_Û4sðPË•±d. A›#Z×âQ.ký¸¡€ÂHÀ¹cÌ4W-uŒP›G…˜Ÿª”Ô/ôŸœMD5øöcw3)t½]j­ŽáµÈ—×7ÂBÁYôð¬÷妴wsëy$Hpoašû¤¼Ò™÷Dô伟ºé¹A"Ê&f˜Înå NÖ"2Kž(’lvtëÝT}»fÀÞ¦yÐçRkÔ ˆa•Ò´8úÐ1tè¡:Ì'- '¦3K}3c2Ýön6ÔÎuy ‡…ºá‰é ù,Ÿª¿% >ão9ŽÉ˜Rþ«ií]ÇÈ©"•’\bæR$ÇC5<"8,—~Á,HÙ¬s7G"É8k¸‘¹1UáAûÞ=meˆLÃ3‡‰Ȉö·ï*g_ ¸f¼¹RÞxóõzŒãØ o…†0¬kY—%ùÏÕVxVù%ÑoÇÑÍàÅÑ-°«šgËl*ÎóŽà!¹Ø$ ÙC"OS0`+B/kø „¯?½´V˜éPóˆÞmÛǶ*°Š° ƒ1u@`$÷PÕe©ËÒ¶íèÇ ÂRxY3÷£ßï[ï#,T°­-€¶mŒa½kï²ïúãÇfŽ­5–úözíûæzÃA—<Ž„ž~ò¼€3{ÿ·°6Ìì>{Ã'89{½§uBò‡j¡ÃóÿÇ`L&´?ARÉ„ Ęrrðil†$Ÿ SœV8œwÍ€BdÄ‘7" `OÖ"#`A,€„@jnjùJ=¿Àˆ­F.…ß^——›\V¾,íº.¦ññ±}Ü·ˆ€¬'Ì4-PBf´.œ˜“,ª÷þx<>¶m·üØ—µÕ"’¡9A.@¥V¤úصw3æû>‚‡ÛÖËãííõíå9L»OŠK2 À,N* óõ²ÖyXwÕcûÞŽãÎjáæDæ4ß²àù™wfIV_ªo&×-¯k" »p‚It: çÈé$ìŸKEŠgÝ7G“˜ŸŸ4‡WD§Éë@$Éñòœg³0°ƒ;©¦} KIÿv†Žt 3‰Š¹w½[î´ÂfM‚Î M0ž¯Ó†‚~fµßÿúxlG[ 3›ºªjÊŒ×u]— ³JbfnÙ}OE¦‰\ÃÌL ¤0¥9ö½ï{O*_^×z¹Ðe]/ëŽc¨™.kÀ>dïH„ˆ*VBâ®±.íõå(G}×~‘§(Ó¢SŒ ”cGÀ"s¸%„Ì)|AÿÌÄÙ,YÀÍh8Caª¥á“‘wnÌ1×”‘>±C§‹-?/ç_QXÅò¸:`pFˆ<À òÈ™rKáLñ¤”j•u­Ä¢æ£€@ðumëÚXJ©BœØ“Øwë»jþ$D°TFDÓÀÓ>zïÇpÏ}œç'3š2…!J©Ëe}y»½½,Mˆ Ö¥\oMmüùçŸÿù÷oÇ1êz]ooÜ®ÝH÷ÁìH¢¦óAi=L[)Ë[]jc§œÛ‘˜ácÐ@¾Q½tÎTŒˆpþíqrÊz×F|½^¾~y%d fq]slf¡j6ìÀ°pÍHAö ¥¤Åˆ@ÎI)¹ùðZ+³Œ1ßî:‡Å€€¦8´›«›eŽÀS]7WtÈ,ëJ&(,UDxj Ð ÜM‡j‘Ùœ`Àó ³Ûóvø|ùÐt’gD!|r¿(µ•Häñ$ƒ¨ªÎîD±=Tíè‰ ˜ÙBtpÅ&Bòˆ¡:Ô0Ï Œ"$žFBG3¤ùhF9µ Hˆ3n¹V€|jœ\«9•{6]';/>÷*“g ¹‚›ùþ<ë@ž¡&T‡‰¡!å©(3å"’`ÆSõœ‹Ø¹]÷ð8Êpšy+p·¡cÒÜ‘ˆAZ)­V©á"Dˆ÷ÃÔXÎÄÛŒ¤SŒJY¢µ$Õ¢[Ä* söD,Ô‡íûžr}ô>‰•—¥Ü®k© ÕŒY˜€†åàQ‡>îûÇ}lãñx¸k­‚‡Î>MÊm¸ÙœvO8@„W©K]<¢,ôåËË—¯/„qè@\s#G)òõëK)²¬UUÍ!0±™÷îûþ¾Ûo/Wº]  KaéªyM@pb.D‰æ4U…¨­ÊëËu˜“”mëáF„RJ‘:ûþã>†íûØ—öñ°íø@ü(…/Kýù§×Ë"}ÿø¸w&º®_ `˜>ö~tÕ‘ÑO$žtµOÓÏ”ä&m cî=)iþg‹ 3ç™ìk˜ª&„gæ'ÀÌ‘ˆ„y¦ÅpÄq¢êÉ\®Ì²´²´u]—RÊtØåþƒ¦ ×lÊ‘ˆeÒÄM?sîø±™ýúý¯ï›)…k)×u¹\ʲð÷µ!ÀàCCñ03£wÕñ¸ß×;F3æþGrç7ÔÆØø˜ à¶,Ë"”À>ˆãÐû}ß¶47$ÛÆA‡R6—0»°¡œÃ“‰YEËcr¢£²7aêngýòIôJzœœÚ3é=yÿ9ÖxºátgžîZH à9W@U¼œäa$ddBÀ>|ØpwΨT)R$Àî[Œ¡Ù)8“ú?/ Ù\˜u„ٞ뮈xìãñè¹Äbfšg _ׯ"µ5bLk@XL]Õ®k»Ý®L4ÆÈš—™m›„Ô‚µb©¥Bº'õ²¶Ÿ¾Ü.Š÷ûþñ±  æfÁ’º(›J[$64S„Z˜™<ùS¿=‰¡ç"{æA“·ãˆ!B­–Väùe›ÅHg3á©H1ê32>]®>]߉L]ôH œ>zBd’*D\˜«ð„‡dVŒ Â1TÜL9 +EÚ²”ZZk’G*£Ûý¾ U&bwëcô1F·ãÐÇãx<Ž®–:áyhR…MìF6˜ (Ô£Cð·×Ûןðÿüûÿÿõþs¼ÿxY%¤‹æÞk­Eø¶,̆•¥¼\®·õ%ûûÇãØÑcì]b¬¤rlÖÇýC¥¶ÖÜÈ¥'A¤^/ëº4aÁàǶv  "³tõ\i‡x0ŠP‘"Rˆ€9jJ!.cÀûûãããÐpk"$ˆ¡æ}(€!!2ê} Õål„…»é¦CmD8<¥€@„‰Ò!L™i~ÿ1õg…ñé®›ý³ó¶à'à1„,œÅ„(Bë¥\ÖÚZ]ÚZkµðÞ»[ÍŒ² ÈÌ!G¿oSÏ?W-r½.¥P­²¶ÖZ#.™DŒ© ’Â¥ÀÐ1Ìžoåù¥ÎY²DÇûžÜÇ$¹Ñe]Z-8† õ}û1†sW£>úPS³¼c@ºŠOÁ—ÃÄsaÅÙÔ$äÞÇc?Žc¨z@° é€a€ˆËÂ×Ë"¥ô®CãõõòË/?Ý®K˜†:£ÔR™Æ˜ S_ª¼¾\n×KRö‰Y$8(µ:Dæîh˜n*fòŒ©áD<3¢áß¾ßûýû˺^qó¡;­ë’¬¯ÇÑ ý;àã£݆yWS5³0WK$©8þ¶úÜ5“_ê`–q— 1&²”’‰0§ŒX¸PK”ºC8$ÑüÉ• 3ÝÃ$ic0Æf„\KöœD?ã8/m 'œ»Ë\¶Ûó%f>FVMžw]:ý-ñdåe#ýH¤Çgóy\ÿùŸq .¥®mq³ÈUu<0ã«0º÷¼€d'Ü#ú°>ŒeÔ*­FøèÃPS‡G)Š.…XÂÝ\#|i…IRì f{ï>É[ RhY*£ µ®6ÔŽ­C@kë—·ëõÒr³=Ô·}||<ö}}˜vÕAH˲¼½ÞÞ^.¯/u]šc˜¹š§ÑRì[77"Úöã?¾ûþñØ5Ë49 t@‚Ĺ&¨&·Ln†€¥Ô¥-Bìá×ëò¯þüË/_Fß™ÃýzôqÿØÛ¶D[×Ö– ½1Ô F·Çv0‘‰`)xYË‚è$K-Å×PÓíØ“?ðRÔ,M½½3/K»\dá Š"•bî@Ä÷ÇfîGW94 FßÃÆ××ËÿùßÿýÓÿór¹üû×?ï¾®—ëõ†{ßï÷íãc<úчšæìåïܤ8N\^88‚aæ‰ÍÜÌ}ØLŠÂ9á?'‰@H9÷Í#S|¦1ÑÃMͦ1åó7œ]AfÉLî®æ‘ ¤p„D@@!†É¢E@&”öÜz‰0 Àq¨z6J†w-E]íxl Úji€E#<’•5gÅ0g—î!Â, ®#\Ϥ:N»%p±÷=RLt]êm奱´*¥¶Z–VZ…¥6i+“ûaîDß¿½ÿþû_@L­ÈëËíõå*C3E½£w`·\¯«çÒ/kEØÂsÈ\Ý'ŸçÔÞ²g36†šyŽúHˆ|W¬BL˜“}wGpfX i¡6’oÓàϵ÷yv=‡Eôd¿'ÍÎSa‡è‘„PD‘‚À£«i-©¡¹ò§Bb©ŒÐÌ0¼ ×ëu}y½2ñí¶÷áC=éD¨C¿FGDa¹\*qdŠ]5<²Ýn&¥²çÿºU¢3 Ÿ ù~ÀP;º‡c$¡9•,¦>ÔÝ@9½ƒ(<Û49‰Ìç‹ÒÍÎÆÀ9wši9.µÖ"iƒŸÕÌÀŒ=¨Sú S]IÙW›'?1Áqš h:¡çׂSáÁ‰&N} º«*Fx„óØ÷ñu?¸2Q­•ˆÍ 1’:¬Ö»ÍÆHï:äù8¥æ§}ž5ç‘áµññyß÷¥¾¾¿Û°ÏÇq»_Hß^–¨…aøZ+•ÅÜj)Ñ!¼=P¤.…×¥¼lÛr)KGèØ†VòMJï²ùǾJáÄ…óú-¥P)\…·u{}½¦ÖöûPDñ&\«„‘[` Ôº·6®UŠ$ÍS ³Z‡rð IDAT\WYkbŽ7ïžn·Ö:˜¡ªÕ#tatLjPMÈ5`,¥\. spÇpˆ`™A”iéŽDÄPÛ[;úps°Àxâ:Áó ]¥ä$ÆL}ddÄS8?é*ç;éÌ#œUżL gE%ÏwÈ "ùèŽÑ‡™EÌäl»01 "‚9/¾˜Lt­òöv½¾¬ë2­ Xzðü^$Ⓢ˜8 L0"˜Y¤ˆp¨ŠjIêgë:ÔÐݲjž[W)µ×¥QWÓá}Xë='æ®'¶DóနCì³/y2Qó‡SààÄùZbË ž8ó¶Tdü="–eùéÛõço&¼Ýö¡ñË/ß¾½¿êÐßï·{ì˜EmVZ…é²-ëZî÷GëMU±@NX|öÈ0}«“ûeI¶ÿë,ÊÁŒÕ ÿõûÇRÊ?ÿíÛËZ ¬lÛRŠˆ,þë7ôø£Þ¿îýh#Ž<Ž‚†›š«E)žÉÇgi‚Ès盋ñ|X@^ÿáü²'‹*áFHè–³×ÀùZŸO‡™·Qu7G – &$ȳuYŠd‘7/ÚDèn).8ß¡™ÜSÕ˜è6þ+æ† é¶Nâ$?W>v¾¹¦+c^1ò­Kçk~ãIÞ üûž¯jDÉ A!{sîÞZ?Ú@–dæ8˜yÒH ‹0#f¡«Ö"%Gˆ‘Z@5¶ÔåÛû 1µÞ÷Ö"Œˆ¤ˆ 3^¯Û²ÔÖõóÖ´ßm BbâmÛ^^¶RrnµÊv)£oÇ~ì{¯Çp‡Ëeûù§·×—u[„™º…L¹6ôn±ïãv;ÆÌt´öñõ¸Ý÷X—e]«™¡„T ]½›[0géäɬp$äÂ\Ñ×J¿üòö_Þ®—eˆ/‰äëÖzCÇЀ> 콫9á__íóëV«¬[½ÆÂÂR„˜<\uä‚q]Õ‘6é£ ö¼ûE&ã-ˆ¹©B̈ĵJV!Þ®«»GÃÂGÄ„Èãþ8>>¾ÖZ_®—üâÄŸ£ëÇËëååååõeùX÷ÏÏÇí¾ïG Õ¿Äÿ–¶Ì{õùoМ½ä’ßS’t~r)Íù¤BNB‰©‡F„—Â,$Ìè0zw‹œ„6ÈË$dIRDh6·N!ÉÜaæ$3|žÓÔGPÄ,{x@d’ ±pÆ€§ŒÔÜ[‡žù—Òöæ÷{ÄÉ-@gpfbÐèÔÍî œ¦ðé·f4 0·€½[˜¶=¨®Z—ºT[W¿^p­9—Ä "áJÙÚò1zHÌR¤u-Ì¥TŒ®:†5ݱ1¤¿\8Ÿµˆy=Úö×ùfÎT‰¤Da*ˆÇn}DxÄ9D€›ç–?ˆÒ_SJ)Äl§2>‡Žøt§MðÂô)Ì Zr‡2m.fT‡MçD²"ä©GÒmsBŒ&¦Ï݆™c·ˆRxYKaM{7s'ŒËÂ[Ý„áëÑzVe3ÀšÓãð“˜"QB¤ t7 'ÄúûÌÙ,î·ã^«”"LX˜‰0½vÌ¥Ö ¤Þzk]JÝä4²sAX^—ŠGkÇÑz·R»Ô…'ŽÆ™ zï£íËR–u),…ñå²®kMdaa,_7¾=údçîÂX+/¥aºiT£cŒœ¾z~¹ÓU”[y?Ë>OÄJ ¸Žð™?8'§Úùù?³è0‡Óõâ@æjÌ’Åó<¹¤„@ݬ#¸PÉFArÁ8#ñ¹ 6ÓÇÑm?¦ ÄA˜K-µJ­¥È@’ÐfhAˆÌuIþ—":!™%FƒfH˜ÂÃÜÈÝU½:H©±7üøxŒÖ¹6qdXJe{Y/o¯‡ŽÑº=>¹e)%ã „U‚‹¡ ŒÀǨ·/¸}ù>Ø‘°«9ô"¼ŠãZézYÞß^®—‹öþ¸·ûíŽ\–íº,+«nfJ —ëJ„û~Œn˺l—…\G˜‘——íõí²®R˜Èáöh·÷ÛíÞZ˽kkcŒü4žç¢t‡,fsœk-˲ÔZÑl]’\„¹&uˆÈL´»õn½;DpÀüdšçÉ- @$Š`æ|·˜9N¥ÝßR§ ìô®ÄùrB„Ùi˼?f_ÝÍZ·Ñ5ü°Ð Çp&"©¼,Lœ›1XÖuÝ.á CÃl»¬ïï¯/¯˜º±°G1QáThÏ v6F@Ì̈èf>-ª1õ… §áE.’q%IÔ£'` Ë Ø“Vh¹Õ9$ÉÜåÁó¹¼;ÕpSñˆÁ9ÐŽ£=ŽÇ1z%%}[W@Øw3ñëËöë¿ýüÿö­>îGë~}yÆßÿñÛï¶]¡ÃØbÁe©¥pbRòÍFˆž­cÍA;3ÆXâùãšJ %Âo·ãÿÿ¯ï̼þÇ?^¶eŒãh{„®¾ÔZÞ_¯Ä,HЇA8§=,žÅ¼žó‹Ì—FÌpxžfßqWÒ „Áì©™q÷ò¢ånáÆHˆ ÌcR·Ü„y­RD¤ð岊ªjßÇÍÆueFsí£ÅôºDžž7×vŒv¨š×R¯/ë¶‘lbX˜¹u33SØñùuoíÆd)¾{/µlëbcüùãGï €„ »[$ê.Ë=0tä“È‚y[Ë·÷ë?ÿíýÛÛ¥bZ„Vn-’ãÀG·ãèiþ¶Ç¡_÷ã¾÷a~»ëZÞß¡”år½†«G¸;3/UÆRrn@YqöðôÙ#Jœ´d¤À„Õ›©¶æÃ Ŷ0‘† aZ‡ŽÿúãÏ>ôííu»\~ùþÇÇý+âx{¿–R¯—êfÓ³ç¾gÒÚsøòü”=#Y. °¬ÎÖâ™™ßBŸT;‰®‰K)ÂBŒèD$2Ïîža:5p‘Ô²@))Ÿè¡TVàÙ^<›ˆ¹³Ãôs¸3³‘»YÄp05 ö4Y¥R@ºÒçW ûèÃë¶DXw§Ä¢§’…˜ÀT€ Yjî,ÿüî`ŠÀDŒ‹TBÂÕ\I»µÖöf÷Ǩe_ ¥Ä]5ºº×õec4_Ö Ì2z¨ê²b)u%F¤œN˜KФp>T…V(9ÚÛða9Ã;÷£9@á²øÛÀ¤Jĉ}T LDp"/¥ˆó€ Ñõ¤Ž;ÎÏ <þ1¾pê·f” €'ÔMMmžQ ·éá—Ëòþ¾±äÓ>~üèC‡QÞç(›;¹ÙaÄ"ù3Yå—Ÿ®?{ùÇÏï¿þúÓº­ž9Àѽú¸÷GÀ–Õj¦Ð»­sïúÇŸ÷1ŒP^¯oëºåÑf3J-@Àaà¦j#gSAÙL†B\ض:úpOË¢'E”®[Y–äe¥‰œÄÑ?ÇýèoöËÏ?½¼\¿}{'ˆ¡Ç¾ÛÆÌ¸,l^'eÅC‡OwŒ<Áà)JŒPaff1Ë逜=-€¿ön~âÇf‘̲™-…X2ùoÀ%ï4ƒpË´' Â#ÜL‘A¦¾³20 x2â™3©?éc8çz;œeÌ ±“šC*Æ€ŽÃÚþh­#•uÛˆH;é ÷±ÜëÏÑËü’çm‘Ü`¤u”€2ò­zBÌÙªÖ@Ξ¹zë¡3㺔µ "Œ¡­«Ôº\®ëe]“:SŠÈç½3CPˆpfªn’ HÎàTkêÖiR¯i:lÆÚNà@GìyT_–*"çv˜ˆf9Ó&0ÇÑÍy9ºø šÒ·é7ÈÒsU4ï„X'M=ßé€2=‡˜hùT%"aÌRëÕqâ Ñ¡4µ¡†…Q­( #2&*ç'‹–¸ón:\Õ-Ëëpf&ó@xf ²ó3/'çýû¼x„åµÀ",Á‚&Â5‰, o£O8Cv\»:Â#˜ —E ÐÔ£.‹ÝööÛ÷¯Ûãe[/—e]r€Í¾®µ.Ká Î~Ú_æ#³)¼D©‡ÔÊ›Wf3ˆe©—ËrÙ* ³ˆ±TðKY¼ú eÏΥ홥’©îð<“–RÈóµžÄàùÃÄ{DöÛÌÕÌ\à =l~G<‡_fgÆ/Ü|VFr9áæzú%ܨ!B'’~^Ð’‘hAùpŸ¤*–â@wê6¥–N‰hÊÉ>÷Sù¢ I çß¡[P ’p^©TªÂ×˺­—£i]–÷uÛ./¥Ô p¹lkþð ¨–¢‹´Ç>L=†w’O³½í_Ÿ__?¾îŸ·+)å¡üÛ¾´,R˜0ˆ©‘Zä²Õu«µ ¡˜…»¿¼\~z}ÙŸ÷Ï[»ÝŽÏ}´áa"d×m©Â"¬ª£§*…¾h:÷G _ŽGÿ×ÇÞf“DÈL"Hœ"¹p‹©qÁéîÈ”ÖМb>…žÃPbF¢8/…º¹A8åo’HžHa70ÍuTvj ³0aªö÷J!ѤWD¤p;Î6ç„Ûå©™²DBÁHT‘HG˜åùØ¡¹šR©µpªÐ™X‡{dGÎ 9‡`9ž?«œó»9dœLÏ+sÚ-€)¦3×=¢iwsUCÛÙMÏóŸ™ÍDîyJM“à$Rü„Ïν{˜gp¼a© Ãtôaê,²ÔRËfêÇ£ý a ½?>Q}©‚j~tûóÇíûÇÞ²WLÀL@™„Öz¸%ÈHÍC 6H™‹&ŒÚÀ™J‘º2c),ÄpÍs›«‡›†'³Rur?ÁaRr#„檜؈³ËKODîI½š]¹x¦´ñ)pIwv b>ÕyJB˜q6Ï$p7ˆhY$߇…ãeáUp Þ¸±lžØ0šK«$^Hzý².F”%è¬îÆÌù¾(R`Å"E„Öe©¥“¹ßîǾïcØëëËÏ?}[×uÛ6©%o3…²dÁ$RŠ”BÄhîµ”^£5=öv´¶5µÊe]d]ò’ç€ÃãúzÕ®L\ “´n÷û~Û»³,dHàháœ:@ÐYŒÅºÔŸÞ/ÿ×ÿùÏÿüçϯ—e[ë²”ÞÆ1Fþ–¿¾öýöãÏ·ÇÑ ÀCÍÍ-EàS æqŒÖÌ =àãëëåº\/ëe[/ka"æ W³•gf€#páRår¹‚ãqô¦ƒX¶m%Ÿ×Âpwî ”ŽÏ1to­µû½ýüËO?½½|ûé}Œ5[‚E Öâáê®j½›»sJA',…òY‘±8ÙôWðû¼K€Z|&šÁœsÊzÆ;"ù¼ÂœE‹Ü•ù³I€m! w˜r±3 Š4Q·ŽˆYÈŽÌ™BмÕgfé¯R…HAŠ™'h(fN2rþÂ.ÂŒ’Dz©D8z?ZS7g x¾‰¥0F¸Ð¬=  {€Ç'ÄÄÛ0#1 ïÃÝC5ÌÆ±+$Šs¨…—Ú[ïm¯Ë2ò¯ß?–…ˆ_®—*ÂD‚@fÖµ«éPU)u‰@D'‚ðzF$§Ã0qrš=*WÄ("µVáB,¥È²Èv©ëZóŽ–3H&vÓc<ûþ8Ž®}xÖU&–Ç4tÚóœ=­=€X„·¥Öz®ÓbƒÈYDœˆ%dÌZ¸[ž8€2XÉ‹0²z´ÞÇs ‰¹~‰ûcwí/—m©¥”²¬Õ‘„m4om4ÕáÀŒ‰]›Ùt85ÉüÂü@¢;úð3Yš켪êÜÃ20C˜«¦Íã”[@ËU‘×Z¶m)B­c«…J•eã}èýñhÇñ¸ß—Z^_®ßÞ_ˆŒˆ"¥.‹›¹sPÓ®£«›'Ëúèf*…6\˜Muè(ÄürÙ–ZÍm4ë:öÇ®:Öµr©æ0†õ>Ô,r/à3F_˜9¥zX¥,… S8jäAì/øçŒÿŸ‰Ø$æ½b˜Å4§´Î‰§¡(lòÔçž9‰În6rê•ѽ¼+²P-ìÃ)<|Xþ%ˆ„‘ çRÖòS¦n§'{Êùaq„T3I!aÁˆÞ‡õ\#±C¨«!ɺ^_¯ï„ûh;”×÷ú¶.L(Ÿ_cK)Bïïo7=~ÿñýóûG8ÑŸãÑö¾ïÖt4·Â·eý}/7“\ˆ  -K©U„¹0­k]–ûVkEÊí ®·¯Çív´¼ »µݼ5»,µ!î¥ò¶–"”êSwƒÇÆúýÑ>>ŽãÐôÓöœÚ!ª•ˆÐò”DNÌÄ’u¯œ‹yxÀlgÌŽªpÎDóxžxÍl»Û<ÿ­$ðüf…£¸+@˜3ÂȨGô ÆžÛE”"Âgôó,2âýe¡À <ÅFOo°p©uÑa­ìš+"^ºÙæUXiô0·‰c!p ƒ0tÙókO‡ò¼KãÓ‡÷´§Ì’½é\’ ÓÑ»š™úÞÇ0³9·›Åª8S+ÉML=:d›+èT½#"1£™›*@$™ ”eeâ"Ü{o#ZÙœ&†þµßŽÿ ÿJz)ªÃÐð)5¿ë“"nàzºïÓ‚àˆ^k3)uqpÍj˜º s!›íŽ“!œ¢(cüë·?¶;ÀºüçûeõØv¡ •R~úöº®‹”²­ß¿¾Ú0ؑī¡áà2• À¿«•óœ`§Ïm¶ƒ q–ùÐÊKrnŽ‹Ô˜·üÑMFÞÖix";i^KѸºÛ¼ÉM„" ¹ã03uÊ.7†™š+hä'gî8OAR\g¬èdeÍ£9LÁŠ@°€‡…G³ˆHÎ!'±=¡S‚Tj-\)È„|e,èá ,´ÍÇ'Ra)¥”"‰Íy`Æf#CX¥2¤PJ)…ˆ¶-  31öc¿?·ûÃݯÛåÛûëõº-µ Ò4W¸Q¾_ó ÀTD@± ôî­ÏÇÇ}wðÿõ§÷·×ëºæQ݇" p¼Ýî_Ÿ·ûñyÛ¿ÿ¼=šEe©:0¡f€(@`Ç$Æ××—ÿþüûÿóÿ÷þúŽ`½õÇÞþüøÚ÷ÆÌGó?¾ýöû¯ûq „99’Ì—™ƒªþöÇÇãØÿõûßÞ/?¿¿þôíõ×¼½¿m"’ÄB¤Ââ¡™¸VÓQ—¥¬Û ª6t¬Ë"Ûµëc$£ÊÍzK‚+‘¹‡Á²0à~´ï?>÷Ö]íßÿíç÷÷+€«j°Hè-Q‹™å,‘ŽGûü¼1,<Îã=`НŸUÊ89jlZ*Ïd‹ÅìÔcöjg''Ð!?´$,¹ÿ Ìì|â9T2À8)· @ÉžÏhÔy¯…ÔŠà_CÓç7(óÂL@UŠ ª«Y`:€‰Ðe[G!À¨ëBU#`] ’=îè¶+Xª‘2ÌRX¬I-sqÇûcßcgf¦:•IHLìBd=—ínÞ'Ýyv¤[£ëíóN/×ååå"·Go#^_&”Bà>ß…Ž­ãèáfæá©Ü¬UÌP#TÉÈ1fœi¾¶Û*\…Ū”m¡Ê‹ˆdˆ·0-‹ÉË…Çkm}ëÇ}|<>nüe…£âÈô8YéP˜˜ –ÂéösD’2ÙħÌ ! Áœ²l áaÌÆB‹”ëVTUÍÔ Â­H6šöÖû°—ËeÖX€‚  b8¦ÓbI1rr妿ē’Ï@D¨'H,mê§/?JjNææ–Õq$¤œ"eðÁr6É"ƹ{.ÉÔZ ½½nS€jàY%„ÀD‹„ ÕÇqtµ”\GDï ¶eðC/[‘"¬æààáû¡·{7õë¥0zäç$Û÷×ÈK.Pþ¨Ã‰¹°âÔÜœ¼FÈ_IÌ/ñù…ð)ƒ²A`L_Ø<"’@²§°9ç˹Á! Èî²%²·0E¸!8;"ÌÙØyŸ?è'&~â72 ž×ð˜ H:ådÁ=ûÌÕ£RÄÍ!!‰îž?nsÐÁ…áµ·Þ{GÔûÞ£` ëuôîQK«EÖEl˜cÜ·ãèä„P‰(Èœ~¿Áç‡ýÖÅ“åsk[…Ö*s–š;ÁÖG×e @¦e§ýh½ B^ â0Rw7èÃLÕ ¬ ÷u-EfLÕ uk}BMœsÏ7Ê)L72eòó8” ¿L g昈èy$}Â)ótâánÞz7³4ÆÏä`À0ñc'«Ä# ÌL…¤”â§ÂnÎoܲÿå3`:óÏÕL–Uv¼Üà ˜ -²œíöyëO A„21ËÈA:žfý©H‘’›i š‡·¹Æ4SY¶GÜO¡É¼äØü„‡›iî¦ÌLMGC-Éž°g¡zNªüœ°M[gný'Š-«ˆÌsiC敉°Ô` äü±´: "ÍeŠˆîЇÑùÕB$æu[.ëBˆ:†êiUgÆðÃL3óDáæýE&¤Ù Ë®2Ng90£{Ì„¯çé9±°0bSøzŒÿñ?¿ou¡ÿöËe-"côvGÚÖµ.u]˯ÿx+Œ×ÇíÑ??w÷|̘ÙÓ§|V²œ6µô¹y„t !càô˜Z.­52-ƒ$“3äpòâ’±ÃÊb:Ô#Ô9ÊpZ!0, Rl}¾1O$‘§’1Φï_‹‘¿èÚù:'ÿs,þWŠ ãT“å&ÀòI B…tšÜÍÓGùbH| ‹”"\2|ÎÈ0F~ÉÑ…\pöd KáZ¹–’ƒâœªŒ>ÆUðR硺úf4Ž™™Mõhíþxì­!ö®—˶¬uF-ÓäÉ1“ÜJ3æÄÝ,žÚ*5ëCU ÕR–¥!S BÂ"¥H釶£}ü¸ÿùùø¼íŸ_Mm>Ó ÀÃ|ê¤Ñ"À,ÂXøíåòËOo/×…Ü [|ííóvïG)·½=zoÆŤ¦;Œ&,ñ 0` ôÇ~¨ÙÑÆí¶ßî÷RèõåÂÄfö¬8!Ÿƒpr­Eo IDAT3 )Ej³$ñ.¢æl­Ïq‘HX»^ÒWM;“»ÿøñU¤üú÷——Z*ëpBòêc‰1 pkùô$ÄR¶Èöà˜è„ˆÀp<]mÓŸÏ$ @fZ× qtùµC OâúLwGæÝÀóÓ’¥çl)óLü2'ú ßꈄ(sÕ §® N…é iþµ#ƒ§Ú g¿"·² Ô=é®4ãÎ/[ݶEÝLÇDá–RÖÅèF"dáyIɺKnÁ‘-çnàE° …a¦æ@ÈPjSˆ¡q¦³ÊªÃ»E€)J©Q‘PJYj±¡!‚•ªuhª ˤÂQò*ùŸÚTÝ8˜Éø$ôù˜Hû>Öº bX4Œ½@©ùí’Ëå÷C—"µ–¤†÷1Ž£©Ú­å÷i¾³}tÕ1Üm[… ¡0×ZRK„î>L5ÂÝçn>¨Dfª#Zsf¨µ\¶m- g Éò‘ÄŒêÑÕŽÞkI.¬©; ±P¥BB>"ÉÅ€'ˆçF5N¤èŸRð d€7ïWY!Ö ÉçðˆQ˜Ig~(J ~Œ1TUuŒzÑz¹Ô—Ëöþ~•"Âì£4=äJm¨ÆÈú$~#2x€jž5`Û"9RR| u ³ÀX÷=»AD]B,,ldéÚcîšÓºeŒÏQÆåíÔ;ã3ö†³{9;ˆóÅH5'gùǃ˜q|¨ñ<È"H!w𘣗³Aìt~‹33ÄDNìAÙ?6‹pð’ø³}w:îã|]Å”“М ä±§A`NfT}d_Ì ˜‰h©ä@áè:ƒf¾»·£ë€Ç£‡ië·ì×n[1awfjºݵS(¹Žã~¿ßÂ1TÕº–õÒ|ÜÇŸo¾î.ÉëË,[èP⥡ÙCã8© õ±VvSóX׉ÛÑûpVP5C0¦RJdëjlÄ%­˜ˆæ> ,æÇ>Ïy¼!ÎlÆF®¡ƒ‹Y˜ºzË=LBr’ ๣8a:ç™õ´e·òjnûÿûÿýzü÷ÿü¥.uŒþx쪶ê¨K¹¬uùõ§ëuûü|ÔBeám[n·ö¸·û£k¨›Å)K€œ“0KÅL¤fDJ bÎkrO%ÌBÈ®fjùBšdB.%ÒýD‹YxC‹ü'…<É”K²$Ïf—мì åò•˜­¤ÉYK¹N”ßôP~ê¡ $§Ù!÷ÿÄœôB˜<®üµ"ò¹eõ ÂH”b8˜«°9š[@ä7ó¥„ÈŒµÊºÔä”C ±dõv˜6íC‡0 —¥.HgÝŽOèû­¥[­ˆ¬ë¶­‹ˆÅІ§Ÿ8iŽ\ Ká4¡Ãgh›žjp&ÜÖº®õ²,àÑZÓ1)›¼Þúq»íŸŸ÷Û­Ýnýö°açÙÓ3_3½œ%„ I¥×kùö¾½\+åo¦C‹”U‡wõ£k·0GK¨v>Ïæ<êéÂY‡ÃH¾ ªÆ×c<ŽÞúøöþöËÏ?‹”9 Dðü ç $³ ³gäRÊõåÊ,Á‚ÌÕúÐÞ4­,D@éJf.pµëÚú8výþýÂ"^¯×­”ÂÄ¡êªþ¨²ï0TÃUG­U¤l—•…‡žÌN‹¡ÑZVä!SÓùNÅ™¬pPP5óÈ=ÃèHTžW"<¥Có àóÃ'äy–ï!¿¾y)ÆrDŽ˜½sèsä’ußÀ“Œö·ßf’ &ã€1€k B|æSd]˺"¸ÆCm¼l«¾ÂŸþøãÇ÷ÖÔ]2ÅGI]CDUÕ®áˆÂ´¼l†8 †™’“YЬKuw)Gïêv&Kc걈‘‡¢¼½nLvÙaâlÞ'&ß=“¥æ ‚¦ ƧÙÂ:AHâ™BÂ0á¦\"ðØ»«ÕRÅÁFh·èC6[¶mæÂðþº^¶‹;ôÞîÇǧ…µ¡cÖC"ÿDæja°ƒY) Eè²-K-/—µVáð8Zkc8€MHBžÂÓCnfCÕ#øÐý°µv>ñXcX#3—@D¨•–*ä ¦6LͲ[Âæ>ÁÏÄR¤*olª‘@†SŸ‰î q¢”9÷òa¡ˆŽ4¯ ‘žœ\¦4G"ýÂ{wÕÑzsxyyÝ^^¯µ’0×R"à~»·¾',Õtꤤ a„°l÷ÖU‡`-µ,…"†_ –¥ÙØ{{jzt½ßÚ¾1ÖȪ®Gcx&G<sˆ˜)þ<‘ç­è4Á,d<¡ìç÷n>š²Y,y˜Å x Bˆnç³ Ò >w)àöœd¦:6ÜG„ãl„ÓœûBBôœ†1æ@(qóœ„+=´‘êaŠàI; tu7tAN3¡€—@ž´qð6Ô>>1P‰ƒ+ÑËZ//u½l°ß¿î_?l¿C?|ôpE`)Q™¤®åíûa¿9r‘òv±Àã¡Ãòhg­ $”Â"è¦áZ Eˆ¹«joƒÀ \D–¥ 0 3âÀPˆ±H¼^¶Ëu5£æ:¹ïLêЇ‡­§Ä7G-“>!ƒé6ÏDæ\eåP% ó Á8!®iõ& HZ(ä1ÑýüglA ¹eS¡Ø0™šð×DØÃÌ- K©µVf4³|kèPUÍs8¸CWoÝú˜E†l/‹0{œ$ù¤êEpPñzïÁ’Óa¦#9Ô¼, !©ª¦×-ÀÝ H„l˜"@¶9""u"“þ€@:†&#hê«Î¹!"Óñç‡àÌôë?^Ks½?Ž1ÆÅÖ——˺®EJ-R~{ëÇ¡·[ûñqÿýïÝvµ È],’0Ÿ·4\erÆŽ‘°¦ÜðB>üSv@K‘"Aê£iÓ¡€T ‘PD€ó¶ óµ,µùÈÖ`@8ÂyÅ›)í¤ÚäÀ|çª-`nè™ó´8ç.Ì#±Ê3ÙàybÈ);ÌX£ä,ÌáÜÛ1S¾ÃBŠ MLJ*;3ËD³¨–ÒÀ´ ‘m]`fóÔÀ-Ôýä$Àp‹°€šµnªÉ¥R‘™)W€u]/ëê®Î)i@è¦}Œ®Ö†ÝÔ¦*Sîv–((ò¡dƒÇuåütùõ—×ëeaD@â(u-u<îc?öû>Ú05Š  I7ÏÄÉ¡z¢3'‹Ý¬„a´ÿúíã²ýþøéu[ëRë¶Nj˜¦ÖÔÝTíhM˜·eYW¤Þ!ÔR˜e ícÌLš0£D“Ô*RÈt¨Ù~ô¸ïûøü¼¸Y¼¿¿—ZÔ­TÞ6¹\Ê~HÎ.Ô|ŒX\–ºnELó™¦j)%ôL&Hr<³ã>4ö£CX×aá@ K©Ädn®57;AsYò´×á_³ð§U6eS9È›=Ï8•1ihSW|Ž“p^&&(òìWD'§üBeD ¾(ÜËRËR—˶0ÅR+‚üJ_÷Ï_‡ZÎc0¡° iŒÑÝt©åço?_.—ý~?öÈ4À‡yÔ¥®µ# Ôa½Ck¡#…DÈÂB…€d[(sä9“+RDž[Þ˜©¹G„åŸ*Ð-2å!B TC³Ü2 8 I-¥.\2Mµ×*J.#„ \—*+víDZ|{[>¿^Z³£ûãhGïáæaj¦–d} fÉû  “,r¹¬1Ô{½UÍàd®Ë}RØHÍÛá_·;Å=ׂ!BÛZ×¥d~]„ÖµÔ"êv½¯rÿºµ”G C"7H¥yV{éÌHNx G8³49Ïy¶úüLàF<³(àæc˜ç99œ™hcà 8h`Gï{k¯¶b0F`@aŽ­‰Ôû1qºÈ#bŒaªàY²DàHKº’^ÑÇȈH?l?t?F;FDð}oGïf‰Jp&)EøÌr„Ïò[{À#}dç’:óOx¾¶ÜÁ’‡í3@’Öa"̈‚eš‚)ñÿñœÜ†Sˆ›)fÑ#$ÃÏqÒÎ'™,Ó¨îÞÐóÌZHTxଋ儞h0Ä`pŸ0§Üë@äãØQ„=Â0KÉ á¤jå{${ s°ŒàÝÕÚ¾?Ø–JrźTáÐÝ{V ‰Z• ã«é÷NŸ±8p5¥ÀB‚‚såYº*™±–år¹ÖZUÕÃkI¬bˆˆ»«Ž"&im ÚûÛúËÏï—í ({3‘¨Ûe¹lÕÕo_Çí¡m˜©¹91”"ˆ³Ñ…©(.E–R˜È=¦çÚe.¸¸ÖÜAå¡…Õ“ÏZwcDªBÝ3Õ³˜¥28‰y:ÏZb‚ùçÀç€ÀÍpF€'ɉBhèÎêí3(‘¼š“Ä“ÿÏ;–’ú•3p”ÚS!fæ<0e|JûóN‘üJb̯¡OZñ<™ý5þwOìÈFjñ3Œg÷üï€mŸETø{ºiª ð/«:MéÞ¬‹f7“å"eݶe©Hh ¥·ó¿ Ñ,Z×pT tBä¿Úy!LŒyPÎH‚oæ{TÍ£wÔ”RÕaÁc¸ÊˆPÂ` g̉Ÿ%d&®sž’_´ÈgI‚Í`ŽéNšÆónDÔ‡þþç}¨}|Þþýß~¹nz´át¹`a¾¬k­’èô£ÛqèÏŸÿë·ïÿë·¯{#tdДgqZ-T-Φڴý1åoÙ#Ôpž]ƄʫÔR€yÐAÝÍsü/’<‚N㙚[`D–Òaþõbª»bN9œ184gkOW¤¯)B4yçæ$sþ´¦Ø ‰1ó˜jpfŠ“¹FIéÊÇñÎÎ4Ì븇At³Uáµ." ½wÕòù½÷Ö;8@(ì} %f@ì£wËéÖ"LlD´©Â\8˜ge.Þ<‰æ‰’‚,Ú¹;ÖÂßÞ¯/—…… ÷1Z}( nk”’b& ÊÄï²@$ΊªEþr›•èÂøz]þñó˯¿¼¼^—ËeAdwj}ÜíëÖ>¾Ž[{ìúhÞF80Ë‚Ïíã„àGjpÀŸÏŒ–!ábëñ¿~ûïo—ëËúþrùõç÷÷·k-T!ÈM'âÒmŒ±‘1¸ùì]y»úýþps&ž³- ÐàJëeC„eéHôP¯{÷¸ÊËëuµl5GâœD›C7‡a³VžK%æRÙ-#§nÁ‰çi|ô¼†—ºB-u[aN/ÓÙŽA¤ ìA¾r§¹5Ë»YûGŠóÑMø›@æÝ)—‰ù}£IŠxr€9…Ý=ÌÏŽN˜óiwňh­í÷Õ*o/×_Þß®Ûúz]¹Ô¦í_ß_ïÇ0£8¹—ᦆ³+ ´,ËõR/k)»ûPSpd¨Èç±3z·Þ1-Ûù"ÁyS JµtÔᡨêÇ19 øß\½Ù’$É‘eÉ›ˆªš™Ç’Y@uWÓüÿÍ •™îf¦*"¼Ì‹šxA&r‰p7Wa¾÷f"<¢ž{œÞÕ̉€ÆÈñOÏ•c’ÍÒΔ,#·™€E Næ'Ke‰ÌMÔ¥¬·mÛj•Ù­ ³ã©…G ŽXÿí÷¯ÇaCñ8ôãñx¶cž\Õ{÷û}¿ßw@Ú¶m­\9³éÇw¾lË÷oß–uC[yBm}Œac8 ÷Pí½=ŸÃFçy,Àëuٶ˺]n׺®²­åºÕZØÌ÷½ÿ³.‚?î{ós7N攇†«úèI§°Ì•ÓicÞÒ‰…Ï ‘ûÈN)B~Éáå>˜DW3uÏÏ(yµämR(¸,•(ÌúÏŸkA¡ðµ)µ”™gÐ:ÆÛÑÍ<‡0"Â,È„ª6†mÜïÇÇýù±?¡½G?ìùl{ ,îq쩦33G eA‘3±¡j:4æ%;[£š¹¹NÏ,Íì3eò.9°©J€éž4W’ii.’Çî9Ùš.êð÷ «înÓ#`æU²mIöP‹UÍ‚6„‡ÂiÙ4SS#Â"ÌN“›±_„WÁ"IÙ9}žŒ€œðJÌu@zÁÜç|.ÌŒ‚ W¦RŠ 7ëû8î½í?ÆSÛÝÆñïÿþûï_ßðRï ík6~h˜…uŒ6ÚóýÙÕ©Ô·jüqßûxâ…˜‰b V<ÓNNÄ—­¬KýÛï¿ýþÛw ØŸÏÑG~•û÷û»ÛX©¼¥­þíoßþ÷ÿú;‘¼ìn^˺nëº.~ÿx 5Sc@©’Ìæ²TfIó."äg´Öº®+!öÞ¼{Ÿ1ù’üªf8â¬È@2é<ƒÇ9“i¨öȰP$}ˆE¨–"LªvÇqŠçÁæZ>¶TÕý³ 9ŸX/íàöcÌVOþøÈôõΑí²Îd‡ç]Í3T…gõ‰¹ÞÊ3MãýËB<½¯>fä»Þýìhž‡ûyº‡Åxù2³´/VîÄÑÎí!rî9s›ž·¨Œ¯ÛåííF„­µ1ì8FkcNÜCûGÙ±`ÉRq²êòîŸ'ËXá‰xò1\M{S‡ ª;ÐòTF qY⢹ÔÊ%ë¯1ÕžYº:)õˆìî/ÈÎìŒO‰H~]Z·üóçŸïÏcü?ÿç½]À8šz<‡ú¶Ö¥ÊRä² Z‘xП?ïÿù_üñÇÇÇûñãÇó¹wcö¤RyàPÑ"Œ ¿‚ñX£æ],#Z@T¥ðe[—¥f›… k)µŠÔ‚x½ì” hÌbÈ÷™ †I´Œ`²,Ûø$Î N eM\ΞšêpKêÚË»tÖyÓ£¦Æˆ…k) R¨ÍÌóý3jE䤂ƹòÅ_K†ágè"@ÃÍÀNÁ²TwÛ÷¶?Þºš÷0 `ÃEH -‹¸Ãþªu)ÛZkáR¤#¢ f¦!˜ÃÈø2Ždè n^ÑáÇÞÝuŒîµÖ¯Û:º¹G´>îG{¿?cäÑè†gÇœ (ê"_Ìa˜%´š J”€É«Õiª‰ZøívýþýÛÛÛ¥2ÇçîfúóãþÇŸ?þz>žcßUÕ‡E®–+Ô·)ÁÊa8¢ÅgVkVfçã0ËèíãýÏ÷ç¶É·/Ug¢/o[¶ŸÁÀfàÍ£õîæD2k)¦Á—ËBŒLô|84T}oÃŽãÐúvÛ¶¥JYn·@ ½ÙÑýq¨ÿñóèm»Ôu]j]‘©,Û1ºöaG·ÖGW‹ÐóIˆÂE*DÖSQÀ³÷yÏò¢Y qÔZ™¥7m]³¹””¢’3À`IýBzÓa¶HÏÝÂìRç:…à5ïÏXiâ›èöÍŸñ“Ä “mŽÙ w2šC_ÉŸŸË\ŒÞc4+óÀeqbº^o—Ë8á @H5"_/ë—¯—Ë*Gï?~¼?íc 0I¡®ºwõÀ4´Ö…™!·_¥H]J`H¥"<šêèâ½Ûûû>†í]j)"E$A{‰õÃû‘ýæR—… {×Gch.XrÙ¡ç¡ Â`˜'‘e5ˆQƒ°°…õѤV\ªEKä57|Ö·‘‰h Xj¸ÓP»^¹÷5³n½û¾ëŸU˜`XÔECòãÝ»Eô1´. °ÂHjO½¹oÃ÷ÞϱïCÇŒS!«F¶T\¬e¹^Öµ2„m…­ëh‰šùÑG„ÎXm · ¿"ÐðÃäìACDBR£0OU¦`¶°æ'ÎÜ!¥¼Œ Ó¡V˜…Q&ZGJ¡ã°Ü0¢dŠ'Ü,ƒ1¬Ñ$g°˜k#FÔË’[° KØÑÆÇsÿx<÷6Ô'1aÒó9în)ÈuæìÑ Ýct3s8à ™ÒΗ½*´pþ³GŸØ½È ¸ÁœCe?f%=Ðcú³8ÿ‚#@Ω(Mé¸Gr1€„©°2E€…9H¸»uˆ8 Éá>~û!èäÍärýì %h“͗õÔ3‚æj áQ‹ÐRpA–=åsÚœCšŠTÂÌšÒü¼ÁÜ*¤ÜÁ=·>ÙZ$‘ 'ÂÇ1“©aNÙíùÅO8[γK“¼S™G´{.Íð‘Ü—͈w@ª ’Z?ôÚ…câ$Šd`ÆY¨A¤ÑÇþlÇÞ– é`a)3–;G=9û§<0L¢.Jî<ÍAJ©UBU©<˜®ÚÕ4‘§PÙ‡ælϪ:*¡YVI2´4‰}„!€@3âA¨Aæê¯jjÌÄÉ/úHr¤}è?ÿ|g.ûýËíV„ÃÌZoîʾ”í²ÔÊ’Ÿ[‘·µòß¾Ý>Þüóý¿þùããþqv gKˆ=C–î˜K˜!4"d `UÞt‰eYV17Ÿ\×YcIåPFí…öO!/:±d>.a›HÀhaà ¦y^.»icd¡L}ÎX%ï*ß|yò955HxòÍ"óo—Üå@Ý4¿q–$qÞ.Îöò¬g$›!În%&JásÏ~´Ž÷gëÆ]­C -Ø $S/ˆÐÀz½w$tX‰‘ˆ*“Éß1‚’ˆ˜à*¤ŒÖZÖZJ©8í°ÜpŒ®èaDŒK-`jêÑttÕû³ÇXkñtbRÞ»º­kY<ŽítŸ0Ëg“"†ºüx?ÞŸ{/e–‡úÏûý|¿ïm„*f˜Ø üõ„Ó¤4'â<Ý„’×ÁD…9Ì4Ìû±ïM=Xx»¬Kw?º ug„7šy8|ø U!Â!ÔÝ[Zøv]«¹ZßÉZÅ[å ¥3#; Å\9' 9ˆŒÈ Øë’ðÞl! _}ïfá½õÞ UʇKÓŸ÷ W!4Ç>ÆqϽ»ƒvÕû³ÝïYLñL—äZŸuØûû½÷çýQ¾ÜVŒßn— bX|»®Úßj©ÏÞïDZª¦Ý¡Ð|/j^9çÓâ—c¢>æ„#ÅRIðøüDFi1òzö«Ì3!à‚Á„¥"`EŒ|—"ÛVÁ=FónF,àANÄê"U¤–ª'h<û6ùvã<Ë’Hq 7pf’YÕKÙ-ÓÌÒÅlà¥Ö ©æNˆA$BÉÈ/áù9Ìu€f{Ê“äŸjHøÄã™ÏC'xÈ”¢Tš ïš0 f ·R‰Í£›ïMÞÛýÙ¾¾]~ûöuÙj³€>ò%è@­»ÿÜ2n×Û¶­K‘¶ô˦kS :ŽqøˆÎìVÖÕr}Z—ÕFWïs‰5ýN€Xk½½­HÖÇ0ëAìçÎ)()Xæa|‚!çf1ø”_ÌLò¹ >=)ÊáëÌÅËIE”%â\B„M2AµÌ¬÷ÌTçg'bœ  {ÄÏGß÷#§œj`1ç¶3žûÄ0æ´6šûxô½C©¼P :44À"å"T²ˆaæ`ž¢A@Ssu·`fyj}¨Ž„륀1D8Ú°1Ìu?F"À0<"L3Óy~Xé$º`¸1çˆMÌÕƒ ‘®·ËÐÜ#œEˆ‚Ì&lN¿enóHhQ+¾]‹lÃŽ6>@µÅ~ +R‰@2“ ò0È=]WðÀÞtßGoÃ-š…,¹aÙEÙ[|<àþØEäËí†ÎDµÔ¯_±TY’©±L©ª ÅRP ¶ªæÝd›a Xòî#£³Éj@÷Ð Èdbf¨ãôÚäÇÀÂÎÕ|x€z<[»[(# pkÞF,&HáÓÈ”§pP7ÍÐ6²ÉxFÎÞmòÑŠðºÔ0GÔ=Òàã çC`KÄ9³û¼ç'¨ rÆ S¨ùSDçVœóèxZœÉÏÀžE¢@G€@›1ÿ¤‡z.ŸcžÂ<‰YrÒ›3Õ®àÁÈÉ @?öü£1ÆpkŽ(þ±ë·/—ëe[×øŠr0ýUã~A3ÂØ CƇ‰ò¡†`VÀ©5øËôþÜë²0ËÑÇóè}Ä0~0šŽíȹ¶¡êc[ ‚Sê}.Ejº†Ý 3Í•™¶K]–ÌB5ÆÐãh7"ašîÙùMgd©¶­REÄÃGvÆÀ#ÜU£ël¥ÎÂkFÅ“™h–T'w›V¸ÎNýüËÛ€sOH‘T×­’ù¥Ǭæñi„Ë…Ÿ%ÍŒ™^˜³ë|³Ñ‡úü¤Ç©´Äen~Ðç+^ÓÓsMørd¼þ$žs}€—©8kŸgçcóöžÔÎl1œ­€@$dd˜ìæœOãÑ5ò™mSÆÈ€ävÆ“òg(aÙ @3 7$ DÇüÄ—œ¸ºˆh ™ÍoK¡•ù´Le Ó0·ùZÉûbj£Ï0ð”6Ì#cX FP2†a¾¿H<ùìÏ>ú_º­uÛÖë×·•ÉûhêÖúZæd#·zRˆY~gùíë[]³ ýóãñÇîM C-Rõ ˜xÁÜQ©R—ºÖ¥JÉ£§»™•4¼æðÂ=lJ•Ã3yœ¡Jªk‘R¥¦pâ¹[kˆCMtxïÖÃ="Ck,,Œ™,Í¥AjÚ‚ 0FÄÐaj4¥éÉÉh(!¦v7oa„˜€sϨ¶—"Äz—8Eé'Ñ99…qzó/˜Á¶9ë"Š"X«lÛ&RÆÐçþÜÖTGGï^+‹Ôk]¶²†ÛRåz¹ÖºN2€ªÞÏ?þø8šz@®²Õ}©åËmRÊPƒÐÝò§A*Uæäl¾: >Ì6Ž£»ÛRøz­ëº˜âóÑþúóÙ#¤®ãù|Í#*’°H€ eNC_$SlÍŸG< 1r-ƒÀfÐÕUOÃýDϾÓwޝ6M2`=çŠá,´M­N¼âr÷§~ìãqè¶.äTŠáÐÐnÙtŠ™ÖDwÀÌyŸU5fÚ.kÒc<޶C–øÆu)«õÖ £0IÆŽãØOÕ u­ëE¶[\†y;¥#µ1ÁòQ(RkƬ̸.UJŠ”×*o׋TR³Ê{èÇýÙ<}Ö³œ1rn:0ÜghnfA'ÙòŽó~6Ðâ4ßšx9f™à´æŽ1æø1á!é U3³’Õ“!:†³ÖpŒPuµp{¹óή6ÂB{0F¦84Ü•""ò2'hX—Ü×…3@d*@¤êDi7 )’[pŠj6lŒ9 fD'SËå53°™ë·Až¬/šäÕ¹T9è<`áŽÃÌ<¢·¦Hèm„Ô¸–‚)š]êB˜Ô~ô0OÁ 1"“f€ƒ$* ®f¦Þš^j©Rÿz<è)ojgÛw"˜k¸®®£™kB)S® î蟥¹€°Ø›ÿùó¹ýã¯÷÷%ÚËR™€Xp] QqŸ d m]Ÿ‡Ê!ëZÃÌÝŽ>FO~Ø ½Ì’îÌëfn%YÂq¸MBþÙ1͉wÎsSï3¯8 YD_„ Âû£•?ï{Wa 4&,E!Ð ¦²2?¸á9Œ¤M›™:DTâ(óÈ~ö¬Ý‚ss—.Çâfý?e“š'(< Ÿÿü×:fz>DñiÊZÜlMZ’%p¾€3q1gÅpRŒ~!mz0úÌ'D~š³pî6¿Þ‘.$È›y ä®‘9  ºB{vG.Á—(¡ÇóùníãçGÈ*Ëœ®ßûöý‹:þØñòá>µ™¸·áÛÛº­ 1–Ê_n—·Û¶.ÂD]ýÑvzz>÷ûã¹÷£GvÞjA” ¨2dÏ%¨2Š ‡ãˆðm]¶EΤ±\4Ö­öÞ¥ªÅãÙ’ìfªáºTYjaæQ¦ìïNðeÜ¡¸»Ã áÌ(…,šõ뙓wðO³Ç€éa½²´¡PdxN> Í›f¤~‚ÒŠ}žõ(DóŸG¯ !8F>’Èòø2ùiÂòD’Âl›ø²LÇO‰Eî“Â13lœsس­{n£izæç|½ÏðyÑ…)^ƒq…ù¾³Ð$h Qòí y€º«9 €—€ )˜P0WW¤>ïÓÝ‘7e8™MàaCd)RÌ,ß#‡ 9'a )(ŒìN*¤IbŸh‚¦–©œ=çÏ!$уυÆ$’‡!: ½~½™Ô‚4@³p‹añþèî÷¥®LôöV„™…q¨2¢0gÒëÕ¾-åöýËš@*u¸ßŸ|[=É«­k ÁLæC=õ舾0¦¢²˞-»¬w¡#`ùž©ùg $Ôkƒ!¶Zo—M„ÔµvÙt1ƒÖôñ8 s—\°1'ƒúŒ•½Žæ!€(–R~ûÊëÊ×Ëá?þz|¼?Ÿ{C*¥Ðs?ŽnCÁÜrôN6­6ˆÛ¶|­B„íП?Ûb9¸%Zœ˜i†üRQ;¿EÄAç]ß1 ’å©[Iˆ…eÈêÜï9"B0Eš,àñì?~>¿\j-è›'AáEVOõ&„º 7Ò´h±pñð G€HñíÛv{«?”÷ƒ€ZëR¢úvÛz ÷$šX÷Çã9†¯—uÙê¶rúý·k•¿ÿÛï{Á®¾í裛«‚9z€†]¨ÈU.µ,¥zP;t‡9ü­!d¬…jEgÇ  ˆl›ŒG³¡” N„pǘ4 ó<ñÌ>Cƒ/jâ+ãþò¿Ã1ÎËîl0bÄU¥ “ˆ=0Üϼ2m¸Õñ¹÷1’ë¹I`ÎG•©µH¶åû-L= *Äs­&„’Á$A"ñž?nèæGküŒAŒB$¥H‚<Ï–©‘”ÂDóý…AÄlDîSH”­é³:ó47w7Kþýd¤c¢;" wí#—ÚÛ ÀÑÇõRk¥ÛÍ#p©åt£ä3YfœdM¢Â.Ù44õ"^–KY®eY~<†0’2A„™‡Gè0æš.uC‚Re¦É3a€8EŠy\¦*Øšþç?þ§1ѲÔÛírÙÀh#_Œ”†¬¼pÃvwKÌ—»î­÷nª®jCSêî0{!+õÙtgœ9ÿ|Í#ž…$䄸¥ýe\Ü 5w äçèϽ”‚•q©²®‹Z)Êȫ»Ê<®SU™g÷ÖZkªc¾»  0âÊk­­šz½#‹$N‡‰–*Â'tPíI:äþ«Í—ž[¦s^‰yˆ‰_, Ð]GkîcÒ#'¸…Î*—'…‹ðŠâ'×pÖo_NÁÏÿàyàSÒ¯ùÓ‹Éæ ˆÁÌH £›¢òìãMbn|"kæÁlúªÓÄLa8†Ž>gÖn†„ÌY ¤9þ&L4G:UqÙêr¹m×ÛFL£wë‡1Åãhïï?Pö·Ûí·/ßûºH‘¿7ÿþ×ñÿþqüóc  `–ß¾ûûßÞ Gz»^×Z˜"À‡ÚÞú³õçóùþþx<ŸÏÆ -ëvÝʺmѵ¹[-¼®år]–Zäh÷{}Ýê×·0‡‹~Ó‹¹©ù¾÷ÿùóýñx´æa×Ëòû÷/o׋{¤kXm2+qr‡™O9-@¾\–RfVwwrGDs7×6iÍgøÓn{^q¢½Ï”ldªÞ%ç¶ö<=Ï“‹;†zƒqRúi¶âEny…cçˆ/Ή?¾6J”FæÏxõüð3añ¹‹úè-Z;DUãèÚšæcA*!2ªŽ÷÷;,¥2UBÖ1t Õá"ôýÛ×mÝŽ®ŽÄÌ1†ªBl« ‚yj1™‰sÏÙåLª¹šÛpW¦o_o"Œfããã~Ã4êR¸ÖÇq8¹žß;æ©Op³u©_¾}ûíû!üøq7…¼K;ư>«ÞDDž}xîKòE 4//˜}]x  ˜˜Ó¼†Â̪㣵ˆ”òmï·ë……ÕMÍóB&„¥P©¢óߥp-äın%\­÷ѺUW7¡q¦ }Áé(OpK¶TÔ)#F¯[i!!Á”X¢S†á1f !³…šÓÈç-¾ô@Xˆ(oSÿ¦¾?Çãqè¹~'"¬ÂÀrªDLÌ’ÃÑ¥ð¶.EÄ,ÚСšeaLŒæ]˜^ØÓ|i¿ ª'£ßÃÌÕ| ïÝÂMăs‚¯C\žr‚xt–Nîûkð?50ð™>]~ÛŸÑ¿xE,=NÒbœ€3|…[”;<ñ2ô¹óÌpg‘BûhGÏ[›©Š0RuSP dÁ(âˆnhˆ¸ˆó…·åv-lí> „°¸Ûº’F;†F].Ëz©o_Ë—¯¶|9ê?Þµ· uMò,R®ë&œãp'¶<=Úè„ÀÄH‘â÷¥ðíº\o Œf^—e»,×Ûe]×plü¤Ât»,ß¿ß]»‰, ™5³1ü]öûýIHÄøö¶ýýoß.Û²ïí#†zRßÝ5/HªŽQ¿}»¬[ILÇhªÃNÆÀfv+—õÇHçŽ'o¯\LŽ~æì{~?UÏŸ' Cp&‚…žäƒ1&¥^F€siç‡ f™–NN8'Ís6_2¥áô¹ª~==æ, 7bä/Eå'WÉ’Yx–?1…ƒùûw †˜“0$Ä<‘:¨šjÌщ1‰1¹#[æŸò¥íZëòýË—ËmsBx<÷ÇÑgËÍN¢cªp!B$´”;Nwðü¾MMböï9³X˜{…p·Ü|¼2Qg$—^ B š«”¼ÿ¹›iV*çV†‰Ò¼â q?ûŸ´«‰Ü®Ô<}k"Lç;Ÿ˜æ¨Î}_¡ëU0PÇh½7퀎¦ÑÕîÏÇÏŸëã¾›†‡j:›æÆ‚E¨™ª™êÌ´1Q*&2Íg¦#¨8/ _ßn˺b$å=B½ ·Da  2O-¢…áù»:ÉQ³i‘Å÷)SŒSjçÓFˆÈœ9†;Bf`tŠù$žJ´¹.ú¥åŽ€’76µ|Œz¸º¡«;‰cPèȼ2­×u]+KîÄÈÌ÷½Ýï{•ÅV SwÃùZ‡¥®·ËÕÌ LŠˆ°{ìǃ'ð:U•$4-á`îš™‘ä .P™Åܧ¯âö¶.ËÖÞ»yš!tB_-K8Ùû÷ZÊׯ·oßÞLÇóy¤y ™@LÓ‰‚u|ÉfRrÇIHLí aB˜l„`¡¥p©LHnçz›X]GŒá÷G¿Þu-ëR )—ƒLØM#¦­!¯L½ ܃*ˆªòØûþ|.eY–õz[ÚxÞ?Ú®X¤Š¬«°B2 ølpí­õ]ŸÏþ|˜ª¯×[YWâ Ŷnk½Œ>Ô\]¯6Æš³Âìïþøyw°@F®>4ÈK$¥ÔÊhîfù 5óaˆ€š™Å¬Sx¸N&Z֘ǀÓ*|Úrcp†ÿõ?1ç8Ÿv±¹ÑÿGÀBEœ‰ò6߇š2°ÓðÑúÈ3XΘ¹F óœAR³Ï_¿ƒDaªUˆÐ ÌPýͬÿ¤ ˜C8¡f)åÙ$¯üi^&XÂl&CRm“L‚Pu3À¼Û"e[+©Ì¯A&™ZhñœÂL %Óôo3QB”ïÏá!KY·µVwšö&–ôúB¶ Í=Ì‘€ý,å¡O|Î+ ˜A˜œßÌÓi@ …£™0¯+sY·ívYj‘ ³ÇÈS'Ë:¹ sdŠîY·ò>4]!L „”U†"|»®™303DZ«ÔR’½nBgÈ?,y¹€;½Dx¾N»R‚É-ÔÜ&V$s£„À1i\€ñ M9C>ޝÐůãþ8»›CÝ,’$¹á„è§…, \¹Ñš'¶¼™â‹ éÙ2Â ŠŸá‘ÏÉ@®«0ŸW¦Ú»Eâ™&àÉË{a Ýa ÓiˆÐÀ¡®p8úmr,¹þÆ/×uéº7Õ…âvYþƒ®ôG}>víŠ íq×.£Ô~áan8“¼ámÝZ‡½G×á¼®|½.@àhªVjÉBg)lˆV nëúåËår]#t21“„CGC€ÛV¿Þ.÷GÃg÷ˆ¥Òoß¿|ÿv7J«æd4™gU.fסTYÖKCŸý¹µô ç·3ûÕ˜Ó<­cvÿ%-*]âÕ˜´¨Of‚ æ2á”M—X8„û¼Ÿ¿\ZîÁixÀødøÌ:˼¡ÌæËœÍ™ÓLæ¿Z¿ÓËx–ÏsOš j8o,‘ëÏyÉwÔéÏÈ̱y’ãÏH\XšØ€Îm?22`d"ž_E8Áó1Ô’¹„ˆR¸ä3$‚$BGfÁ„kåÛÛv½­ÄôÜ÷ÇÑÏcßS; Ê$Ej) ±0€®ÂÑ}F›1Îèå¹]áÙn@`¤à¤‚¤Í%¦E³S4oôy~ÕP Ï+×Tä„H¸hÐ÷àO¤ø?ÿñûíº„«›E~IóàDƒ3©áæ–£º"ÎLy„NSïí­¾Ý–öì®`á :|˜F‚¯Í­wkG;†  ‹œÆÐ.œFBÇ €C”*%‡‹ëZo×U ‡j~´Ûó¹ßï–¹ NqíYÍÒ;Q";Oh‡;:þ’p"’óØçá<Éžëºd/§6(_XAt2„òäàx^yN›Ái*Gœ¤ !!Dsµ.RÓ­Äbu)_¿Ù.‹&`§ÝTÍây’Gj$ ÓÞGI½ Öë*¾0s´F ÂE^•’Yóˆ‘w°87yHL`èêvºp©UD¶m¢£í½%“ÜÅn$YíÌøíûív­RÀ̉ÐÝÕs±ÈÙîšÈìgá…Ï’TVË(r–å›"ÈÍÑ9B’÷˜žS›Öz„äÕöÏ]Ͼn£”R‹ÀkΔÉ7°`fbaC“è'»¬ö|ì¨_®WssëàÇÑ`­µ–²”š¿ ÷ð(+17ÕÞíèãÿýÇÇý~»Õ·/ë—Ûe­• `75ë…év¹²P@˜Çsoë"_Þ6)åè6TÃQkb†@f" Ä LaÏýI ‰È=l©¤æáªÃèe©˜uAŸªëÏ! |ªTð×#ü …á_Ÿ¨’8Ϻ0EC‘ÏŠÄ.çD ÝÝ æ® Éݩ֒ ç>FæcÕ2"Ë,xöÔ†‰¤f:çØ4“v",D¦¦ªîpþîrbÌÌeЉ$çÄsÜÏôÉb‘R9ÀUG²O]ÕÓ<'Tšò25½hÌŒPu^¹N¥Nœ†ÐG¥¿0†y÷X<Ð4ZSæDa†™Ÿ~¹ fÖ6D`n:zoûè-ÜY¸¶>†úÑt]üºI)ukþÜÇ1Jß¾¿}ûúÐŽq¨êPâBL)áI[JÈæ¬>ԑ؆Ây›3÷çûûã¹çÇ’qtëýy‡½Öz½n_¾Ü¶ëaÚ”K8 —­ëÇû㯿þ,E¾|{ûöíöýûÛÛÛ€uxk#ßI• 3Æ "®Ëzt½ïí8š›!QÖuÜÂ4()|LhªjŽ""Bë²,½Þ[®›Nñ(8‚O‚ß/^Å(I4G„¿Žù²§qþ¬Ÿs Â×jgX «ˆhç'=+¸©&@®UÀ#CÐavbYhb¢_è× p6@7CÄ*nZ…–Z#p ë]͢˜€ ¡¢™›šÌÄÏ„õb¼ŠxÄ špC,R  ˜Í~í‰ò !¢Z <¥0€¤DdDn)oñÔ"VaI]^ GÀ¬ë8:m´Ö‹ q¶‰²?yæ”ra<_ìs”9ò'âZ9PHÜ€FÏC‘vX—a…Q¦:÷ÔµLÀYªèæ`¾Ug¡œIpÚ€ÃBÃÓW 4¯E2šOÛRd]k]TÉ,t Uo0Ü [óãÐ>ò®…EP˜°²+çqÒ:æY‘Ò“ëðâ„&ú_€€×É…Nõ5!Fáyʇu¢Kü„ާóKͳáÝ»½õÜ9„›FNÕÜ…øº­ËÂs–ï%?èšD 7BX)…‰ÁÍuSXäà;G—äÿ÷Ý9y®)½Œ9{ApƒÌCâüRL&üäzç—;- u˜ »ÜxÔæm"§áxÎ_Òyxü•²çŒ9^ã}8o¢¯äSdnl¶’FFȌ京‰Ì Ò’{Æ€°,ÍÐd&Z !Í1Ìè±Û±ëOÑ"¶-ñ¶ÄmA5c†"n¨ÈŒÇ³ßŸ¶\n¥®ß®u]xíðãÃþj½©º™­¡µD qaÂÂËÂß¾òí²ª,…oÛrÙŠ”‚»ôµ.U$]ÎÄtÙX`YabfÌæ†ù°Üøa©ôv[Aj-Âèn<'Á^ ×Âa¢u–¶s“ÄáϽEøèMU'8Ð=/!ÈÓ€¿ôfÏ|ÿ||¿\È8Ó]1Á»3qRðó6¯j×¹:a=xn^Tu¦"ÈœÕöSÈt^l'ûwfñ?ÿü/%”—¼'Ë"“@ðÚ^¼lóSŸ“<àPs³‘ã=:SÿKñ²]æ}è"r8÷á‘,ÜZJ-53tчõ>²š„àKáµÊRëvY—ZŽÇÞŽaF ÄEH€9m ˜Ô×™ƒ$†pîƒq2íä€çÈxÆè0"äÔÓ£»«’à $G5HÊêI 8#¹‘{h>aª@„–¤î¹ !& ÊSœÖß?öûñ7õÊL„îÚzÂRëé%̨Ëù ˜Ð¼ü”Ù 6Æœ"æ! $côQ gâ4lñÖ9ßj~~t³¿=99S JünéÄÛó<©µBMùÿ§êÌ–IŽ,««™;YKO÷ÿÜÈ̻ɪÌÀÝL—yPsD²(”*а2p7S½÷@F"&a*·CLÝÂ,Ü^Ûz%1éú뺽֙†˜¡¢z–Q‰ôËÏ„(",\ŸB¤úãúèÇÚ Ä•®Ë =Tð6Ú<S&1‹*H’pmf"°üÄè‰??žŸ ®{,Ò¹GL³éáÕ"@ÈÛfÛ6E°w)ïHcª‹+IÅ«“âšö-ŠÄW‘áJÅ×´u…‚3!ÜR•Á-£ÂD±5þþ~ûãûN$äîsúyÎHdUFKæ‚Zä/ÎÇ=D:Þ׫¨pxˆˆ¤"Ì*¤ÜÈ3¬jº¯6c°ä‹Œ猟9l&ämßÞî›0’ `¢‰0RÁŒ˜3ÜfD€'ØðéÃÝ‚ˆ)sÔJ¤!#¤Ï1Ç9#ãœæ}cÚö¶æñDî@çy>9ÿùóãqü|žÿñ‡5âq<Ç9á0çCTuo½ ½Ý¶Û–æù>ÆqŒóœÃ¬”D9ΑÁë¼TBºï}ßz„9Ìü9æq ÷zmà²ø7óU*¬NÒ5x¿P¸µ`„/Ðm毱øed³:ƒ¯ùu½G/™Øk¹Kˆ"eŽÏÌ1¼Àúõ#¢‡Z@‚Íð˜ÀX®Å,Ð!,¤åºÚ‹b&˜ex­»"3„¿þª€¬§Íp°Ó\˜Ó¶µ[ïLäZ´¸¸,@ˆ]µ·ÞëTíŽÇa™V‡vat§HàZ54e!ª}ˆy@†»ŸgUʼ+~»w&FdLÊWz;¦ùÚóÀŒZ#! io¡pÚ1cZ]ÃÃÃH6éDŒ„ÄÉœ×7‰êÛQ/fl­3Qz `oM›¬¦(T ¦Íi54¹Ìº%×Ë8Žṉ̃¾_L˜\¿¯ôðÊ•¹eB 1“\͇zìTÄð<ˆ0’¸ûñ´9íçÇñùyÊ[We³˜sXDDö¦,õÏxñá¿â"|¡j!VCõ  U—„ME=À="=×[8lz”1cÁ«,ÂÌf½Þ2ƒ ŠŸ\>"ÖÖȃ »roÚºˆ"Î9ÝŽJW†`ŠýrèÁŠÙ^õf¬Û†y\ˆŠ%”¬—R‰néêÀ_Møe\À…¡Ì"ÄÕéVȼÆv (ÒjTôÖŽ9ÇH@JšÇóQ/¬:H1sW¹ß¶ÛÞXàœóó9žÏi–„ØEÜᘮBzÐxë\ÃXO'¸¾ºt%”¿ø¸_$@sˆ5¦ê 0!FDkr¿m6Ã,Ü£¼qe@ï]öM™1ÜÎi‘aîàž"²ï=½äŸžÕ=ª9cÕ¦¶CD03Z“Þ»ªŽiŸÏót"eD˜³¶á*BÌ™9¦%ÄyF†½Ýúý®ßî[ ¨©4—á‘‹Ž  €ç|žÏÇóœsDSÙ·ýíÛ~œçñ<Ã! Xˆ#rÇøñùü8Ÿÿó÷_ïßn¿¿ïû­Åyž–™Êøû»H{<Ï1§¹}ü|ÚéMÖáU„Ç9ý8Ednö~ï·­mM2ᾫÝ÷Ÿ¿~s"" º• _êL7ƒŒû^ï:&¢øëÇÇ?þû_Ç9Ø 2Â ó—¤ |¹†®‹ÁB2þ²x¥‡¿X­Pǰu´¸xP°XoLªªn‘@°âø k~HÐëý†>ÎéàLWVÖ+ÂÁÍÜ2ë]˜0§i‰…¦ç̾µÖ çœ+qË‚{WÑVƒYZ[ð#³ô9 Ì„%{õa‘…Ø,2’U¨·övÛ¶FD€æ9ÜT ’ÌÜ<€ˆP„•Ð’K¶–súãñ´ñÖTö­aõÜéÒøÔ¯~¯˜Y»ÜZd öªÔñ|>ç阑潣´Ö¸‰0© ˆsD•é Ëi‹t—Y³“Ä’…„ûŒpuU+´E„ëóÚ·v»u&d¤Ì~7•ÖH„§Ù€¨c]mðŠ¯¬yB¡ —ùòµ]ȼ¬e«½^¯ƒzÒ1‘¤E‘@_…Yªc U8J#Ï9ŸGx¨rïº÷­¢;±LlÜTƒ‘ ·.·›Öy:"̽ÔÂuÁº’0üÅGÆ_KLX}’xIib])—ì7¼*Y‡KÓ’H^Üd‚¬}î+·ÔlÕ; ¨‰¼HI“˜0Üõ<§­P*Ò ψè›zä~3KFB@qæ`w„Œ“D§{x'”p»òò«x¶+€`æÇ1"bëUëÇÅ‹w[CHœÃs"‘‹Ù<Î!ÒZ#È´áÃ|z!\ òÜUÜD*O¨g¦{µï‚ë†S]ôô‹+S†RØD,)`=lë"WŒõLdâPdÁ1íš´ÔØ*< f:¤ý÷ÿüÜ6™¿¿u•¦mk}ëMQµ~õKF&ä°æ¸h­Ó %n­“h&ÏÓÜAµm]™…˜?Žãóxþýóñ×_Ÿ> ý—nІ ›p»µûÛsÌãsŽ1gº* 2³ DÌÊddcD­-rtÌŒ1竞C‚¬œéaÓl†YÃ`NÛÛ9Þæ¶IïJÌcŒÞ¤Z e2È(Lü:LJ«Åº†Âˆ@Wé뵩]’z~õFæÅ£ dÀ¦–Ì/+åJiâÒË £A$¦D¬]u„›cwj.ÀBX0Ý·ôi *hæ.Úävï­µêG&²PßtÛTÖ˜†Ý"ˆ™89j —fyœSgt‘5æ+ýŸ©ðÖykµ¼$ ,1Ž'¨{<Ïó<-àÊJFä*Õ· ËD&·N½«*«2R®PÐz!Tb—vh­úkp ¥™ã´9Òý27d¨¶Û¾»ß…iZÎ9ƒëI}=—jáW©K„Yª¬zãU¥ºî„0×¶‡…‘ž ñx° 5QB²isŒ2',Ú‰»+oª*R3òŸÏ?Žsø#'4¡ûûÞ¿í^œiù<ÁͽTSHÕJÌë@TgÇz×DúqŸŸŸ[CÊ 3ÌÀk%Sµ.žH$H9ëÕÀ,, cc5åm-|mŒ+~]t‹aÛÖö}wTaÂú[;2$¨°èô0a^)†pX ¦‹ÎqYbjV´~Þ”õ¢®«Õ Ó Úà5¬ëA%8¨ì«I_úu]Š5ð_/Ú¯rçkÚÿzÔ‰¯ã5K-zAƒÿí%sw7FF ‡^ô:@°:8gísÀ=@UåBÉ—ž'-J²dæîª‚¼k#ÕÓIŽ91ÿïßññ<7NAÐFd–Ã3 ÓD€EXzk~dD˜9嘀óaêàçxn­Ý·=¾ßî[ÃbUa)f\¿¦š•܈ ³°€ÊØê™P×þHdaf¡LX'•Ì(säKÛ¶r•|ù°â Îã/Qš¬êâkò‹§™Xg¬ˆ ~Åïñ•°®©O35e©Úëœ6†á6£&õ/ êº`¢¸m²oÃÝ=*¦V{õ©‹Xü×Ë@½*tÕ±p ÀÖG½š ^Xòk‚ˆÈ¹Zâ+£L„ªBÀ5˜,"×ÒѬÍÚŠ b%‰YíÄÝmžÙšÞï·û­wA‚ئÍén½·}ï"$UÊ$¶²‰²p­Ü ‹-Cè8Ó WÄu¹Y)1I 7nÌá1ÃüÕ¸¬'¿0o½CS÷yý”*gîî阅/+%Q¦Sß´wÜjøîév Q‹à±:•ûçeîÂ\i½†J$š›žç§=ÇqkL"Ê­iœÓÍOœ ÍBT£¸åu¯ëüÊÒfðKå@È£V1„+wR!üuù«9!" $׬—‘Ð"2Á=à™îS¨‰ÐÖÛmß{ë ™Q¿5U† fî]ZÎ/îÁ*»Ñka…Wmå—ã?d¢'dz¤#‚ƒYÙБ˜øBJ,ÏXåiê É¯O÷ê4Ó…JÂ(U`%^Ò«L¨ ´2DÌéBtëmZœÓ‹WÑz‰×ø/æNKi„µOOaê"LÄ‚—ž r^Ef¨W‰R2Ó<Ìcí90#sŒ9Æ æöB.f~Aã*¶±í½ïûÖš*Lç9yë­ž2fõŸþ8Çœ3¸vÅ )ÂûêFoÓ̼~C…Òvª$%‹™#"1'„¹—eÒ#žÏÃÌ ÖÛ-R8™EÊI%À«þBWOÞ<þ<þñpØ6éªowGÄÖôZó,9&B‚ oM!aˆiµ†šÍiu’j19€µ÷& ᔉøáð|ÚÿüóCˆßn=3ÎésŽ9YðíÛ~¿uìrŽé!YueNdabÂÛ¾m­ÌuäKBêMï÷Ç‹`Nls¸v8‡ŽÃÑ3Dkl!îEƒ•ã…L•X+®Oâu÷ÕÏÊbd­kØWZàbÝò+)yéÈ+熌(* ™¥×º\Há‹ôB˜ÂHª[sfd U‰„¹÷Æ‘0Æé6½jÌÓ'DªòÛýÖ3S"cSÉLíÒ”Y(ÂÅÍH3W° ØWV; Ç´Çç4¾íZ:Ç [‚ ½Ñ¶qý9 [ç⿜cÖuÈ<­ð¦•"ä‚I#î]~{ïo÷N¹ªÂ\¤yªº$—=Ó£ˆ<•k/Ò ‘!b fS–¦ tžÃ2TøûÛí÷÷ï·Û>çð˜îù‹/fß•¼ŽØtà›´$5ùõ¿.׿yƒ„±‰ fšû•M¬Ä=&QŠ‚ö¾ß¶­I„‰Ðö<ç<#=ºÐŸ¿½ýùÇoDp<ŸÏçyœ¾>3tÚ H÷,£ø/ŸÀµ’Ž9í¯¿>lž?>ÿã÷û¾GäŒ@MhßÛ¾·¢ÀÖõýíNHcõ¦û­#GØô:!€g*3ˆŠâÚÑû1 1U[SA /lHfBš¹›g"tbš ³iñò^‡hø:æ¼Påך3½^GHD‘s†™U^È- TùXÔ+uQ‡øz~¼¦ü×à®&[ù •芈¬0GþB®'#S®tåúÒ&0©˜åÔ4Ïã8& ‹²Ùc²â:¡0b¸“²ŠzÂ1® Äôá9Ú Â›ªb“èdÈÍæùy>žçlŒŒÀ4ÚÐþmCD?'äØ÷¶Ýzß:&¤{@š™ùÌZïn!Kž'¡¼Ý‚AÜD»ˆ"‘&J»ø+n>çôp$F€tO3_¡{@ˆ·4÷Êî_¬õ…ÆÞ% ,¬ 9ŒéP-ÇRUԬÿڼpÑÌ×™ëë׺Ì=¥ª±(~1,‘6",à¦(‹6­sySÙ7íM{o‹èuÎóœsN[ó¬£yEæêL„Û&­^y²LZñ³„ôb#°€ ¿D15˜¯¡êUx];Š+ȇX{ábl½8 ±Ak3É\xflòb´àeȉ/Õ•[UDˆ…0Ü!ƒ {Ó­7UÁEr_],D¸ßö‚-2"áã˜)"¢bQˬåuMIáÚÜ0‘23!3,˜(ýR—Áe[€X«ôú —ih-a¬î¼u®ùlÖ-'s-uµËý¾g`1þÍ}Ž9†iöªá3HpDšMs£DA\h ºf'„µÃYV0wÌùñ8>MdSí[o™p÷i“A…•/``½8Ö”µê[×uv½ ¬³Ú X j$ĮژP’¶•¿òÅDÀB€HIi¡Ä¸‘ª4‘Z÷{0’01A¬CùÖÛÖ›gÄ s03³p"¦>+qt9ÑÕšBÝ7< cI!âµn®Y8'`¬Ô×/<Òù*ZT•‰¨ôs«á¶b™î™*ÄD¢”îù<ÎtDbB¨¸ yx¡6iE U¨)1wå­‘0§6Þº"Ò´(œWCªÞæa†ËRUc ª£˜e&3ªHkMUá0&‚‡ ³1' ì[g–ÞSFð}kD¬, ØTŽá1Í?ó5ŒY(®ÌdGÂDW¶11‰½„¤ P q¯ËCfº;eœa6Îq¢¯ëT¦°6e“ ŸàáÅSÀçáÿ8DÚ4<4Ìn·MT˜˜ÐÈ”°bÓ®}º?žÏ1Çãñ”9fé“<¡² ½5UºacB~>Žç1þï?þuÛZß»ˆà˜ç 4gdFÜ:SRª]ž›¯å.Ð IDAT³T/¶I‰”€–'”ˆö­#Ñ07 oncÆñœ6Ƭ{‚€$ÄðxcŸÚBˆIUÞÞn,ã6‡×ö:G.!\íž)­Õו+þ‚]i…|áý*VT1÷„…£J`†ª¤¦»3!y ª3Í’p¥¥µ®îá´þ1!‚ o[ë{Ó¦2†?ŸÇ°éÓgX µu›ê‰˜ª¼mÍÝŸÏC¸Øb°Ò%`äÈÀ ¬"è4Ëôz95‘ë%À­Iß4Ó)DÈæjšAzÒ´fÓíúy!#$#(á¾ËûÛþçoïïoªr%¬«¨ÃYçú\ðj•r€ üPh3Qºßºö@fÎÐð¾µ?~{¿ß6·øñóñ×Ïãð9 ’˜Ö*¦n.„™Œ”WšhaS 0“K˜»Hƒñõc˜™ÓÎ ¦Y³‘€4só0OwÌ$â5 *Ô·v»÷Çs>Ã~ü|üøñxÛ7¥‚ŠÒƒjÇ<ŸÓgN‹i¯áW­þ“ªô—è§Ÿ§ýüy>ó?ÿãmÓÒŽˆ°ÇmqÒPï·FçiyUÇ8Bƒ0•*£®L,HŒ h‹ßè<Ëæs ÓÖ…ˆæô°HÏ€cFÄç4[—ì\à"|q3~‰Öý*”^ŒM" ®:9x€-Äåá¾t7ÕÒà €¸¼”„\‘uÍX`ö¥#¢¥½ê•…L… ¼ˆlP¨™ŠÖˈ ùò³– æ¬?AÒó9?>ÌÔºFÔ¢•’ˆ¯ši BSÝ÷=2á<½¼6¢ˆĸ¨B¹7LWzžã—©)²Ð4VrgD¡k4Z„ÂÌœÃÏi£„€î‰å(F$P`(ù,ĵ e¨}ȲÊÕ•MèÇä%a)Š®{8‰*i#ÕRΔüz×B¨rš2!<“ˆ¶NÛÖ«&´LÜ>ͽPž1æœî@P¾¡â¶C­·*Y]{±ús{%dÑ=!1“ÁÌžçYáEô]‰Œ Àv•™žˆ¹š¬Më–A ,É5ô/“¸[xdi* Ÿî—"º¸W±cµÇ= ,)Ü q˜ýøüì“ï·~Û7a7 tËÆÆ¢|5Öñ€^)žå_UsJLÀ@F.z¥Ñƒ0„é߈eb,׿¨ÂB¸u…M‰øuï „D‚¢¶&ÌÈX\ÝZá‹ ™Úš×öCP{¶¬‰ãrÃÔ\2 ~Y{©`õoPæ7ƺ¥£¤-¾¸EBFЪGUñ"} Ú¯*;PF®†ÃRž9¢t-oaÎa¸5ñš~˜aŽ–¥”jD)" U•êW,,»6e"í¢Êù|œë²M`µ©®'}mÂ#È=ÌÒˆPED8ÌârƒyŒ9Ïó¬ZB©ëܰ¦Æ][!.t³á EÈmчêl¿84WAˆ•%%à4`ÌŒb‘"©Q]¹×S…Èœ"¬´‘Õ,í&15¥=Ô"ÝÂݬ^½HHîqöócL‡¦`ÓÒãyœ­±(o[¿ßv" a,”H ‰9R —4ÓÍÂ<("ŸÌ(L]EDwæÖö&MÎi#|œ~­°3*e›å±ííí¾Ãþúñ‘øóq!W¢£Š÷Pç$/ºEyî_‡£È˾þ‚„eYÞ_³Ì p„ô°È1ý8‰à¡üùîMÞníím¿í{ëÒt»ï­uYÁq@›~sŒe•‰XSµºš^öëK÷œkÒ‘é+8$,5‰D›1†ç|Çqcذœž€k}¼TGµH€Â{ÓÚû—‰®UŒ¹'8Ñjñ"‹hoM„ëçOàáĸïû¾7Q.§ .Î4Ѷ5"Te&H‡i1¦1æ9kÎ"DkSqU"1 YÒD»ŠKÅW#J \uíifÏeŽÏÕF–J!y¸ç+\· à0ÎiÏp0béD¹»*Œˆ.à‘E\ÀLUŽTó(ôÜWŒ*Yº€àÅNDdsÿûçgfã<Çñ_ÿùûŸ¿ß7ccÌA³fCøb-ay ‰ =1!JJðÊ1*Ê•XKfâøZ|®¥r–½§º`u¬®-åëŠË2„>íóqœçyë]›d‚MH7Ë Áë[Ï ” Zï^Ø¿È׌ ‘9)2Ã<×9—¥f–òJÍy€9 ¡°EdÅ™I›°Px¦#¬žÆœ3,ˆPD˜)o›~¿ßo))¢ëÛ}¨ŸC@"yæ4«h®pa¸0lïæé‘Ó<=„…™‘ˆ<2Îþ¤qº§jQõIDššûô1æ9g…4 Ûn1F•;Í|T9ÝÝÍÖ£¹©Šˆ IC È™~Žó<Ÿþvë·[sÚôp‹ð€LB¡„´9!¡´Ðî,më-cáËüµN©Ao­5…H¯ùUF0"¹›ùd&MÀ9 ï¹Ð‹ÇœÏç32†ÙŸŸ???{çßÞopž'3ñ¶íç{n{SA!l*ûÖó8ϱ’ͪŠÊeOóóœæ•™ác’Õ*‘ö›Þn}N?Ž3!«Óÿvß÷ö[Mܽ°C 1žgaXGuáÜü¾é�ßo$Ä gbeº"­$ÜVLûÞxÛÄ|LsB(dï˜öù8Z&È9§™!¦ k,”Un‹H_óà‰ÄXÀXä @W¢»£Xt¯*t¬'úWŪê3-"ž‡#æÖÛ¶oÛÞ &óxä_?Ÿý|´&·[ÿþ~ÿ?á÷ïßZk·Hh¬‡L¤'ZJd$NK„œ ~´ÆZ•ûÃãœ?>Ž·oã¾3ÏiÏç :™Ò˜`í½‘µ13AÏãéØZ—ÞÔ"™ òñÈóYçL"ŸS*‘I5ß©)ßY‡G¸yå6³:ªùu­Ë—Ý÷`„DJZ䣂”À-bÕ2Ë./EjÔªìRËÚK©JhëÍ!DUð€•iÆ¢âêóÒ -_—ÿšEÂÒQ© ‘æ´cL³D÷Ã3‘ÂÓÁ™¥õ¾’ „ל­^½ÎD½oƒ†› ³(Fø„t"„&Øšh—°<=Ë—‹ ÛÞD)DdÛdNýxŒayëò¶+¯ÑrZ„…ÇŒÌ"UÜš £ 7eUN€ÏÇa#”ì4ÿø8ÿjÕÎL1Çñø|–â~Û©.iHÀ(€ 9ÀSœ‚8VÝÇëw0ÝÇis ©(ïe¸ä„Ü2áŽáÙº sÏ¢wF¸„®)>¹ù´š‚a†G½Ô^×kÀûoÖÆŠ.@$º0 •b/#KþÜyŒ»÷›ï¹ÅÞ•‘EÖ鳋ܶž¯åê ®Àp™(Ü#lú:%fú´óîŽL*"ÊDŒ€qöx<ŸŸ???ŸóyÖI¢*¡uºÂB§©ˆDYwq1ók³âQG+Z‰Œš¼Wb2½.OèD¸õ¶mJ¼X¤«¢LÈõaDŸ–çéÇ9ÎaµwÇ©ãiÒxkÚZó„çQÙ¶DA"ó4óz+ˆq}¯Ê;Œžéçœ3ܼâM‹HŠ„+c‘L@üåEKÌ °3Ü,Á‰¡µV,”Úä ±‡Ÿç6Ó@ˆÒ׳ñ \6µ/þ7dŽs¸ûÇÇççG'æoß޾ߛœnÇLŸ–ᘸ-ʪ/gPÝD×õe¹„…XY^ÓÓpwʬ¢z®>ç‚Mc¥ –«j–@5r8†}>îþövÛ÷ÝÝÏÏãv¯[ôÊ.sõ這¥–í€ ¹„AP°”ôˆH_EY@¢RG.:Ðue©-¾nâ•CA`Œ0è\=&‚Y„Ï9-ÌU…ˆDIYÞßïïßï{×ºŽ BÅ€ëµTtX¯7 w"Ta@´ˆéixœÃǘ6Í&2¡ ŽÙ̉VV¶¦£Äd:¦…?Ïã3#+vm `R¹õɨQ×Å“xÁ£—?¶þn‘VNŸãc0á¶÷¾µ€8Žóñ9Ïcº9hQÎðA…‡–õª©fR’ͳ2Ê´7™‘‰ØZëªXÊl‘Àt3Œ@€ã p¦­k"!Î,G§­ Ÿ‡Ÿ#Ìý8¹²+›"S&ÐùÏ¿žûÞ~û¾ÿöí¶uÙ÷^/ÛÓ-3„˜€€…ò3Π+Gú"þæ¥û¦Œ®†’{Žó4³ûýÇï¿¿wᦨʎ+ÙV½±i6Î eR©EUß’ˆ’–¨Ä+tõÝ#ˆf­é…Œæ:T xL3麺ÕT.ÇŒã˜æQ?%X‚—Œ×n¢†Uˆ[¨½ D†{%žãºc¬JSý-‹eM*Ðgo­qçœc¨2PíxÃ-Yˆ.X UUªR õè§ ŠË¬DëRÓ›Ünòö¶÷&¢ àNDMU„’ÃãÚ‹°'MÌÓ3Öùꊀ¯üœn€€¼`U$­›dµ×––ày DJ„uÏX:ˆ€i ™½1#¯òj]xbfæúz19€Eޙӑ[“­IoLÌMP™ŽÆæåe%€47^  H"¢&B”VH»„$N‚M…E,Á"#!cgÁ†EÌlºùZˆ²û YAx„ÓmX)ÿJÓ#òqF@Ú8??ÎçãGï2ÆwLØT¸õö†„ªüç¹î”Ê8Îsd!£W°Ìæ°½éý·ûÖ¶:ºUµ-|z.lÏãs2Žû[c"D™óüùq~!€KýeV{ŒÞ›t•È0KF I€°a6B*b/Œ²Io­ÆÐˆÉB•͘^@"ÆÈf–FœÂ8Nò|žÓÃK¾œð ×凉­yØÿüýóÿýã¯ûÖÿ~/ä- ²6óŒ9ÍÜ‚Ý[PS .rE:ñåi†¨ßz9ÃKoK„K—.% 1/¤Z»$Œª VÁKHš:EØ´ê‰ k±c3)ƒŠX˜áfVÜÊ"-C^‘¦ üÐ…i¨¥j]Ϭ¾ˆ9Íêåx¹<"™H„*_‘ÊM§ªÐmoïoûm߈¨@ÃxŒ_’5Œ‹q‘N a‘f^ø:b‚¦JH˜|ÆêhÇ1†y”Ä-0ˆÊœS7µ$)Ä1S#‰‘!£©4Õª–µ1 •tÖ½¾\õH(bXù3‰¥5f^™%R!T•1#ˆ(Â3ýåÇX‡ÈttVÜZ« ­ùb¦ùt·iaV1ys@fɪÒ3·®­)"zøfÓ©þûœÿŸªw[–#IÎõü‘Ykè©m´­Ãû¿’t§ ™m‘§XU™á]xd¡uCÎÐh¬ªÌ÷ÿÿ>·`$UݺÀœf6ã<¢|z”ÁàçÏ3NŸûã±·­çâµÎë43'Åmßú1Ç<Ãm(R%‚¸¹PBBþØ¥„Äpž×óx ·¢ù1¯óù:¹wõÈ×1žÇù:¦yÙ¼é××ÐV `­+qØ@$fB‚Ò¾Å2¶®?~|‹ðçëõ:ÎÞæ©6†%„ÛLG!rfTæ®"ŒÈHåÞD¬þÈ5ìùu>a×ôóš†x$ï;®®à;ÓEÅí]©ÅÂvV¢þ©U`x d+0kóMHÄ«˜“€Î ªE_5þ("\¹Ûlzd-ÄT¤‡ò®~Û÷½EÄá}“oßûÞÓý:.) Áççöñènv\çŸ|º* £gZxÓˆR8…1“=rL;ŽÙ˜»Hya=Ì[#êMnþÝj«¸y›¼ísN‡Df妬Äà‰Eð-nJÓ"R•Ó#¦»y¦OŸfÃmN 2LA¢a0q¸S…r CDÏðˆ9bÓ‡Ûóy~=Ïëœ6ßë'·ÿy•Õ–|¹`¬q—HÂ-=‚ˆb¥©`¦áàV„\ Š$„·ªfªÔ2)3#TåcÓñhã4›@5¥7ÿõó¼.ìsï[ÓI„!($`žRòt/ä¼WÐ ™sØ3PØé÷¢"’Eâ!Bûðˆ$„ÏGë½³”ñ$ [SIV•!œ™ª¼oš L™ácºŠУVvùNL,ÓZ/áj-ÿþ%üÞ…Õî7EäŽãTûÇnÑÖ»—ƒXùޱ-BUÞ£r’$r+{£¼õ,·Å—n#FþþG¾%Woðm̹Ï_™„)LØ›0c‚Š–E’h6’YŸä¥«o1´.1™ñó£ù̽}~îÛÞ™Q¥Í§¥¢ SEˆ!û¦}ÓµH@—]cÖhöuŽ8çÌø» 1#‚4ÅÖY™µˆ ,,¬ ˆ41Ïá¾Ñ÷Ç‡ŠŒ9E0<”yëÚ“ðÚkDäszå~s\ó×°‰ôæd!#)Ka ^× @ ‚ŒW8 R¿n„\×ðHw?¯1féþ€¤0õ]ñ4f¯JD܆ôÛü\ïo :±”^õ¦6¬†0•‡–H…¶®•7¨·psÖ•ŸpZ°,Z„.¬ÚÚóÖ=©>ÀN«ú€‰œÄ‚"‘D´ Œ@(Ú6×ÖDšŠpoÚ>ÏkDa- kï·b¡T‹GJ ‰õ IDAT´Þ4õW`æ‘.Œe%'fa­™r%•é.²ÔÄ!Ãa¹êzÅ€0Íž¯óõ:*PÈÝj¿´&‘6Ýfd20SkM´y” „P…ëoæ™[,UE›´®˜àµ¬B53í·."4gðò–CoäMÜq…£ -›˜¥~Øq]ÆÌL,fm„ûP•­í½¹Åó_ÏÓÜüx]Ç9«cYï‹%–GBbQ•}Û"óù:ÎËþÇ¿ÿsï½èÅÇy†ç¶í}ëD,¢*Ò#cQ#…‰$–‡‹¸œß %°>¦Ë@]#ÂwçûoÛ(ÔsJ¼U º9Êçr!eo­ cB¦W¤¡BéÄ…7`NI˜nq;æÖ‚½ˆž"‹ŒMuj@˜­ðU` ©ˆ`ë*ÂM ª¢X!ÔED©] #1câ 8!¦HctgØ7ýØ·ÏÇÖ›TJ”nEñš®—¨s½)*Ï—D(*éîp³¾!II…•hS±ˆ ˆô뼎ã:qòên3¶V^jd®åÒ›é¶ý*ÔÅ3½"vµäÿÿ½"gšù$_c¢Xd@w¯bQÑfΰR‹‰é ÀÉoIùšj3$V~µ."ˆnsÎQ¨«kLw¿ôIˆŒ å–W&bŠ ›1†›{BVÔËp˜µ¬U$༬<" *ß| ~=ÏÌD`fm™°)§gX‘ᨷöísÏÌër3 @J(`—‘Òðª#P2P¼Îy\gg"1Fú¯çõu"š‡›•ñ3æŒçs°¼öí®‰gº9b„`ÆÚÃPSV‚­ñ¾ ‘6­ñÖÆ«Í12TxëJŒ½y4•½õÖŠ7¹ÞûåU`&w/†{Â(Ã4Ý:ÏÈÒ~¼G›õn¯Œ8$¬kÝ}S¨ìJ¬uB"Wêá¦V޹îݸþ/AbU¤4}ut‰HfÙº2£Ï "m][kD AŸ®Bß¾ïÛÞÜüù<Žóå¦ÂL‘©*òׯî[ÿØ:m­õºò¾ 1,,˜€Êq‡ ŒL˜¹ô´¯ã²9 gëômƒ¥å*ó|ÜqQfÊæÍ9aËPýŽS¬t»ÖÁ×k!ÁÍ`át"ªZ‰€ÂÊPóRÜKÞüõõõ×_¿<Ò"gmOf#|LŸ‡™eQÌÖ·ºÚË@_ãšz¤-øo¥‘‹ï,°Ç4·irWE+ÈÛ»dr¸‚Ü>f{< 2Ð<}šYtUbdaîª\Ìçáîén™`Ž~¸û˜–]ýµ²¨–?‚…'ZæòÉ ­6{ÍßͪTwÛQï˜>3ó "¼®éîMèãÑÊë(L„´·fžNL 1}Î9˜©Z Õ‹ O„1F„y¸E‘ˆ@s\5UªÅDö¢*e€ö7ðß5]+ùûFõ# +Ôº8HY‡­ˆXºˆu*+Ü^mê”ÂÀ˜„¾Ð?(7¯p•@ CëEï"ó™Æ,\çmº]79ã.Ïåºú""PF$aRb'aw G÷XÂÖ:¹;l[Û¶O!쪽+ "$“ Žà÷í±—?˜>¦„ŒˆI×e?_ϯó²HÈ´ic¦eØ_Ïy½õ¦LÂÛÖö›²2wiM´õrÿÒ.½«04m›v"Ž´ Ï^~P‘Þë-Tƒ®ó<=ÏsšÏ×´t`@’:oTCT˜©)°Ð5gý€Çœ__D>öÞU™>?ôñh˜@~kÎY[×ê±E¼Åmkºïf‘cÖºú¹À̽é:oF‰23Òê8MD$‚L˜ÌØ[ë­#`3²W±Låß­/Ûz·øMõ¯Gÿ »Ñ]ÌpL`ÐÞ,iw"& #‘`boÚzÛ¶öíñøùùñóç×_?¿ÆðûÓµ–Nïí¼'ÁP”6wOˆÐb Lž2)ˆ¼æâkO™i3Ü*ã‰È…p8¯ëù<ÆÌRË8áza AÒ<‡M[ÎÄH¢mÛöÞ;3GÄóudFúLàzv„*5Ѽ, ‘e¡KˆT$›‹ÒãÑöMÍÌlºC½#¤Y¸ê™éé€Ñš¨HiÈ‘€D*_5®·8·¸JÌ*$üùýã³ì-ñ×Ï_ÿüó×°äÌœcD87m}k[×¾5a™æ ùçϯÿüÿ×ø÷ÿl*ãºlxký|ûñÇçãÑöýÑ›Ï9mUC½ u3™¾HŒ7$¨ØAw–°ò„u/Ø|¦‘ À#DÜ-<ÂW6D…¸6Tט×uExoÒz"wsŸÂÜ»0) Dį5bæ9f$ "ß½˜BÞŸ é-0A%k­Zß…J¾®ÏfdªÊ­JI"¬-i[Àœ‘ÁØÞ¤û¡‹[ãå%̼S%´Hãqàï1-$aʦ’ (æ%¹Dè»ó,xÿq\ט‘H ÈL¼:Jîᘔ1¬Ô pSXX/–uw@ðHŸæÓƒ˜<|ŒËÝç,âB¥ €Hˆ— ˜€!! "#æXªÁmkuH¤NlcxB¸[¸CD ¾¦%œfE|ì[S„Ì038/ã×™ [WT²cÎa‘("­É´8N‹·¹£ñB••4[D2ŽóºÆëy!«¶¶}t|cm‰Ó¼4ÉXÍŽÚOɦüØÚç¾µ&‹C»‚Å ‚ÜZ½…3÷½ï{oz0¹Ã¾ï½3ãœf¾wK–ÂK ˆ™á! ˆá>Ó'a2aº[„#‚‹"a•ÎÃóº¦O_Õ„*¬'>.£e`V–¡z…pW ï}2Ô0Ù+5\GÌ(¹(/5€Çy\éŒÔ6†ˆ9Æ…IBB¤îc\nózÇG¾Ž§¨4!‘ç× ó4ø¶ikòýóc=’í"€”ç㾎$yºÁ0ÿ“9Ÿ»6aDοÁb|1«(.C’ÀZØà­õÌuL‹ßÈŸ¶öÔ*Þ."– ‘¤]Õ¨j4Ýö1ü¯ŸÏ¯¯cN¯%ÎuÎ9Ý2K2*À„\eЄ›‚€5½ L ó÷dQÇ+µ±¤±å·ó DA佬A 01…HXúŒy]£Î(ànÀ¨Øj¡*ÄÔT]Óaͨ É`cQ@ø´mcá5*'–d(`&¬íØÝ…]'Àå/¸S÷îaæ€`FáÞT¶}&álÂ[ë›öÖiºM³1Æñ:ŽóÜZ'"mšé2I›ªû ¦òIë,qçË'PÕÇ8+Ö›wïaÕc9àÒ½¥Oy—ƒë¸÷m‹@³c}–™ißzk™Lغî[ßzcÄ:‰0"%Ì Àáç„IŒÛ®]Ýì<®1âõš}=_×$aÂ$õçuÍëÃ~|ûØ7wwËuð•ÖÚÖšv-·¥1‘>>öÏÏ1Ïçe\q]*ûŽ0«jQ_3Ó×fÎqÚyÎóœIÙ·Öªä¢"½÷®5þyD/^ Ýýõ:cA„–WH‹d†ùáh–ç9¾¾^cÌ…A-'¥‡YÍÀý¸0†å\Ó³Bï\P€L/Y6–5©DÑÌÔš s®ƒ~2cÝ×ø}üþ-ྈ̜¹î©÷­’ ‚„$ÒjضB¾˜Ì$,õïÎÂB$ÈMT™mZø«¢¿ð·{|Þ²úÕ)UŸ…™Ab s˜adÒ˜@jÕ&î­¥×Ä,WÊÜbÎikL3Ƙ•Ææ!•Âc¬Û C‹™HE =YÚª¢x” {£ PáÖ˜y=™‹÷åù7Þ³‰1ň9Ì"‰É"¹kWUÅDs£ ¤dfcÎ9¡¢ê1«€HÈë€MEµåGBü|ôG?‡¹“™ÇasªÈ¶õ¾õ2†Ú´1!™è¸Æÿóþùçkß:¸ŸÇˆÌÏÿÜÿíßþñ¿þ/ÿí_ÿå;7™Œc’E¸¹¡¡HM£Ü½"(ŒÜ«nõw ÍRÐRUºÿ·’ ‹ªWX fêÒpÌi>† s‡U/a& wHʱÔ|2™±p¿ˆ˜awâ)ï!ò"ÒÊ:bŠîj41 1¡¤‡GDù@"q r1(Q•TjS…”HEç)LJo›²šÍ*ÎD`­%kŸW_|0H,ë-ƽF^dá2oࢲ»8d„#¥ ŠÊbʇ4•}Û®afîáÙ»n]…$=×20=0ãÎ^PTugIÀî@G/+õ4Ǹ®ºæBR¤˜0õõtCçPHˆˆR"Ôn¤Úôkbèw»mN¿N7s¤¼·YµA©*ŽpÕ髈 u­/¥Emô²n0„M‰Eò—™ë‚×¥™×Ï«îÕÅ·™æcÎL¯ÊDWik j™×4´wmÂÞXŸáçehîcÎõ÷ëáëë*‹©XÑHP!æ"œê¶µ¦ {Ûv»†e¦[à4CÌâ4'ä#N{aŒ½«ðþhªËÎV]@F€ë QMU!Q&úñýñýû'dÇán€ ”ý¦Œ÷³œë¸ï9Í"Ò™PDšr‘&Ú‘¯s^s&ÄúuKzs#ê¡öâ‰Æ @YqhÂ[9µVHˆY<¦ZjfD91 ÒEa1ݬÔi4Ð3<æA ˆžCž± dŒs¼®1Ë&AüØIƒLxŽyöøhüñhMzã¥dÌ $XWõ;–§œ¥y ÈË௟G†o÷½3†ËÒJ5ÈѺÜûŽwëJqiÇoÄimêMë÷G5k €Hà×ÓÆ÷Š<##Ï1=Ï¿~6×À,<+ñ Ë£S‹)€Ì´³%«’–yº…E8…"9}™}à.¡0Už¸Î0ì‘sºP¥X‚™´i¤\“b†Ç¨AÆMe À#<’˜‰ €nÜ[fLw“ ¾åüÛ} ‘™¡ ¹€À•B-¸UÝs#0ˆI”¹2£fyÍpŸÄ/d¹æì6%߃¿IáäsÌ9Í#ÐÌcÚXv.U$$h] µÃÏ×ó8+Ñ É“Áë¿Rý7~ÿ>Ì#B €0€òm Ž[VÇ…Zª’%Þ¾\7úªhW1/3€‘›ñ6,($DF!í+Y”k„RD3–Ò|FÄûCî…ôb¾ec·,iENVž8jZéˆA™LTå°"cBAâçt€pc"aAB÷x~=ý|]Ó“ID ‰fðõÏk:PÛ6!êÊBrް_×¶„k€yYÛüxA JàHAeKAU‡éæÓ­¼zE®e~Âê]ßî“zÊÑÖ·ˆi–¤ˆuíMZã}ÓÇÇ®ÂE_¹áÀžÅ;sÏZÍ #!^(¹]MP3œQ¶1¸Á>§C$sVL2QØ™çœV ßÌðà¨/l(3#aÍ+ë©ZkJUUe  ­Ö),¥ë \A"¬"AÏõ½•º/µ×!Y>¤t®°ÇŠ·-¿Á[KP÷Ú4áØÔlûøØ¦ù˜åZ®£;þ>}DdVO <Ñ=Ý#!TÊ­sW–#W „‘ä™ÉuMñð«Ø|žÌ*,Uc+="DzÍÑk@¬ØSa@N(ò¤CLBPåÖÛ5&dÖy´0Sî°"+N¥™ *°‡…qP)çô1Í"Á”cZ¸ykBë‚T<>‡qùy³!ª½oH\eVÂ÷š‰‘(ƒ!Þ,쟽ë03®1£ƒ«Z­9®qžó8/7oÌ®Í .˼ Fà5æá¿‚âÛ÷ý_þ§OfN&@…ûš+ÓjV—ÆÜ1 ؃)jWŒH¸¨ +"Ho!:TÒñvueÔ«rz\ã:ç5Ý1¯iæ^@Ê$÷¨éY¬ãeá} &DT"Í÷Êu-‡¢œàU~¥]éV”"{ñv,0k±™K¸ÁH²@6”Hà(Uã'pDF‚T. 6MÇÄôpeVàôô¤åïóX“ª¼­yo¸öÒ'ÃÒÅ%1"K˜‡Yµ¨‹W¡ÊÛ¦fa63B˜”8â‘Õ W–"‰€Ö½®1fŒqG@Jj™À,‚ D€Éœ,€ @¾Nø€åÚ#&´3«ÛGÜ­ ¿á£×L÷X,¤e˜å&æyE …óªmþZHb4JB…àÚó F ®æt“•ÿrô*)eR&y„O÷9^ŒÄ?:r`B'Hd¸[}ì›;\§sØyÙy¹Yb0E¤ERG†g IE™ÙÌ„áóѤ k'AdÄ­Ûu9cLð‹°éMUX|Ú5À“S´±ŠtîÝËg&BM*Òã³æÂ"¶5_çÊÌ9¯ã &Îð g!iÁ^*ƒŒjw @Õy›ÊÞ·  Æž…ùbFeì*M¨7i[CÁ9Ýbf:Q1'–ôVÐ%!#+!Tç[bYÙ3*ÞÃPבUHK`Ÿ‘ÕuE@¬Æy$'„UzFÁ#cÚ "Â"é=Ý"<`L{»Vj8'J­UÊÌçôËâë š’pÄ.>‘?7Â=ˆ©õÞš" Ï:G‚0A'Qf…69ˆU$Æ÷Ïi6D+7½bbµ_-§ÙݧÎõžº }Te´ÄßÅ™õ‘ JD'Ë„€HXnNDªŸ¬W•3hƒ€‚°È¾Lô[6Tƒ”Ú{³"‹&€ÕÊ©f¹õÈv'DÑÆHµÞ[W}¤ªÎz–—aÅü–›¸ø#Ä”‰c\£p+€Òú˜ùç_Ïÿøÿ2ýó“˜xLBÜ·½o§Å°ýóñýÛ£ +!üçŸÇŸ¿NH ¬þ;Pf–‘ËÖ,‚!™„Ë´ˆæîn×5»j“˜Veø(9–‡;UA°Ž­D­! {¤G=Ûy뺩l]·Mû&ªëc^[jD¬ÚCVX¢„¸ž ÄD fVA̵mËDH|<ÚÖµ–ç5JØT @fé„P§×™ÕÃcŽ(®›*« ®ˆg]7°Âñˆ­~Æñ%FRUa–ŠæÖÒð¶Ø®\ âXÿ Õ™¤—Xé´Å‰7 k‘)L­É¶éþèç9Š|ÏCïŽ`B®Ú󽯪³®°4Õ°p7@dmŠ„ÓÌ͉Y³8ã^eÆrxÝ*ŠÒ P]ÉRÅšU¨ÑÃ3ƒY¶­×ººˆ®5K‹(tUµQUH›sVo4×^ÛÝ=׳þ©…™"OL`Oæuzc–,²ê5K©\ûNÀt‹ëc\LstUZÌ(ZÃa"]j©„äÈ4@Ú·öù±™Çë¯×P᢯ Á4›Ç9ÍREê}㞦9=¦ûªügš¯çñ<.@nmC@Š fg@jÝD½VÌ0æ˜óê½=JôÈBTóÝ Ž¯7<äÍœHÏwp ),ŽacŒã<_g±ÒÜ,Ã…°÷®­’GXuqsi§ê°¬ô¼çŒw^*"¬‚vE jMµ)D& ÈBæ%åˆ ÝÌ ƒ“„ˆÒ£fçááà€\qeäú%tÓ2ÝXeo{‘È|Ö·ì—u¨æs¦W—½¶Y7 p9µ+cUÖ^>i¯Z°’°¨phšaF5‹ÌºÆüõíxŸ¸×Ì–JyëÓ{ ›æ‘V¶àzTÝ“uĨ v §á´(e™0£¨ éî6—½1±¶õ/Y=dFÑRBQýQ ×e§¦ ¥”|;©*RRqFN§ˆ °òè0ÂȰi5ûçð ¿áuaNÄ’¸?Ÿ—0§¶dA‘ fpžÆÀÛÖ¿}|xP™?ãð"02RZf˜‚ÃÅ™ànáÄŒ¢Ý·þJâëiØ·MD.…óô¦Øºö®cŒ"{\'%‰ÒãÑ??÷­ko(Äa9Ãü”:À5æU0II·ºGbL·çëÜZSa¤¤$Ö˜æcd¬Rfé"¦Ù5 ÆOM)•kŒá1®+f‹:@Þ0“,ü-!é+܈¢¢MV©‰ zXÑ$âò~paõïÑ7Rùæ’0¡ÒDëL¿‰Ã§¨ÃT&&5Á ͬ"ª» %$ˆFÆ×ó2ƒ¦íñØ·ô7“óà뜰6ï´B~ cÂóeî‰(Öºí»•JbZ”È38Ma}³’ÂןoWÞE€Zìdxøôz<ÆM†B×"²fcîqžóù·|~ˆBĨíK9*ˆªª»ÊÖÊyÄHéþFT–.­kO a!Ä3«Ó6­T½ n¥Ý»üö®”u»¾SxăVÙÚ(1=Ójî^©¬ªF`F-L‚<–Õ. (Öxµ¾tËȉ ‚€DÁRÒû8ßR°J°ÝX0‚Uæ»Û ^‘ôD$­}o½g¦¹YNãȉcLWÕ½)ŒaÃùyúó´çe‘@Ãå°Z@ k“´ß?ÿõïŒ1ÝCž# ]·.M+Ö‹,Œˆ‘hsÂÔl™L*Ü„+àãÉÌ$€ž™æµïöŒ")ø6‰až8Õñ”‰[×¶‰0+‹(#¡eä|¿¿#JR™ràºLÝímdF ÊX©÷úÿ3 AE@!3=8䚀õnÍÈ´ˆZÕH àå^Í•®f¡Šõ+ƒÔ-€+éK* UW¼ë}+õP~e*Ä232Ý×’U OâÅu%X›‚Ú¿ƒyÛ…¹’ø÷§ºn¬ÉŒ ”„=tßÛñЀL3¬…HÞ›Ç:¶Å2e*Â" 1“pKä²ó.Z\yv•P%²ºLQWaeîÚfΈ¬a :ÐKpŒîH˜Q&T‘e£¯mc-00ªbŽ ‰Ä("ûÞ™°lUUD‰h-̇ÅÌûÈå ÃbFM™ÂyiVñtˈZ¹-°ae‰–à»Xñ%w¢ß=ýµ½¹ÿS2BeÿQ •1„P9×`ëJEäqâ/ðã "à‹(?C6 Œ|¾Æ__sƒ¬ñF-®}˜%" RSar³8G×eîDDÔ™+"ƒ¹ô£¿ PÕo6ËÅÒ@Àiqžs ;/Ÿ3ÂÖ§¡zÄÀõ!àÒB¿½Š7,s}²™ B¾Nbõfp°pOZij¯rͨM`Õ±jž œ™´*‚ÕP©:5ÕóÖP@•‰¸Ž*K̘^² ža6‡¹%  æ˜Ò#¼^3xw&îú}ÖeûM޾ם¸ÎR¹PÙ$TíÄLFù[×,“I… * ¿ẻË`SÄ–µpË…ÑÏÀ×¢õ^mÁÀ*ØÆÝt×Ò-@½nÝÜ¢x¨5¢B§ƒ0`¯½¦$8Ü*Ôú½Ë”¼ÔàÄ\·'BΨŒ»øËe„§;NËŒz\9VÉœˆ2È=óyŽø+U±w͘á×8íTôO`ÑÞäÇ·Îîót³ËÀ<1C(k„Ÿcø5㳿^ˆ®M˜…Iš¶¾KBøå–Hˆ­ 30™Yàc×1f¸»y0'Qª¬ìçÇÖ›p6i¡´Ög 3Ü,’rNs÷i³Ä×¾õÏÇÖf3# »Yý ˜Í”0&*£6!QÎÈ@B!¤1lž–TælÇß9¾å]ø¬i>­Îézg$A•ß½¿ô›‚Eëãȼè@ïñ($P™ToËCMXëÌw¤9n‚zýn¼Î5Ç/ë'÷í8Ç4gB@'~|l":F È–d³<]¥:>×4³üz˜á6¾}nÚ¸&1M8ÍsÎ+ÒYX…™ q-ô®Tˆ!qÁ¢ëÙW¼ü-K,·qÙ¢3"柧}}¿¾Žã´²÷ZF½&]·ÂⱬIx':,nßCànb3Ç)€Ö, ‰¹‚D”wÒ°Ìsa6k”“”׌sœ«þhÁŸ‰{×¾qL3§,§03=6b:Ž9Ÿ#nûwYé2c\ó…'qUEY»$¤›Wo†i£œ"?úùmç&súyLwc¡Ö¤wa‘뜿~>|tÄø—|ûßÿ·ÿþãûÇy<¿ž?#òºæ¡§‡›™±oýãcW&(à¬{Üuv÷—]çˆ#~þüúëÏ_´<6¸O_ IDATT92½~´ëHå)¼á éø“ÅUXX¡Ø»¶YP%wf0GXq „š «À‹5i›LX¢¥Y¢>Œz!’UÏ:’Y·Þ¶^¹Ü·Œ4 k,M`QqÒ"]p]¡Íf¨6F®q-S-7<™aß{kZì1fÙ”ç|VÊ7Ü÷mïÚZc¿Æëõz>ψøü|¨væfÓÏó Âän_ÏÃã%*ÛÖ7å&¤LµE,CSµ‚¤ÉK ÷’ ÝãºfíÄÐ-JñK,Ú€ÈÙܱÁ¢M÷½ sÒ2}½5þ–Ý«FºÇ´]l‘kjN¼R[Åò€²Ýyñ^aUäYSxÝ"Ö†‡‹®ÌH•Úšf°´ƒ eÂúùºŸ,ÜTDZeBÍ#Ғפ¸Š_¥°È¤ÀzlDp+*×-¹ üýæ_ñÑÌ›ÉTþ’•´Âw˘Š°"÷É¡vÔK`¿î‹vTµQXœÀ:Bð²Ê@ªrã X%ÞLOôJ{@e¤I‘*•™æfn˜éY{{ú²dE¥«]YlXu¤bïªô¦Ì2=ömŒ9§}=ÏþùœcRkªÌ6çíØ…ºuÀ4?'¶¦ÇË”u¥G‹øÑº°lMé}sWùøxþùóüùuºçÞvH#®Ëàç×ñ?þ#çܾ}<>{kû¾%D«Tf⸒YDX•TôºÆœ®"ß>úvŸ™Q¦ҫC7U³©G\Ãæ°Ì D)œû4¿Æ\6CH&Œ¬@ƒ¸Å4½ˆâѼ™=‹²¯1Zfj"â©ÄœcÌQE?aj*M›03££Gæ"­r@N·ô‚{Ñ:—ûZÔ÷³NLfv]vœã8Ç5lÌy÷Ò}ÖEá^"xFÙò ,öÒ²$Þ8.ª Ö %ƒ n,rµ£1€)Ç\u[ˆ4;é¸ @]H ÖøóÑDY”sÎy^’ª(¡T=` ?Ï1¦U¶gætÈQ·…" ÒêB%Þ†º '¡ ûøØ?ºY¼Úy'<>úÇçƒYýzú˜ô ý±Á÷ïŸß~|c¾Ì ¯it]§Wåm[IŒ9ìvÍé¥TÓŸ?¯ë<‘Ä¿žçü×?ÿë¯_$ DRmê ºÕ ‘øMïÉÛ‘‘w=-×ÚqpÖqg ‰1’ ‘•þ†HT­†"d‚WÈ,£ 5贤ə€>æ´9rߺ0UBW#¡"´@hÓJ^ºk’2±—ld™ YÍ<‘¨µ†Hó²ã¼Üjfçu×eIÀcXoŒB0&ýøhúϾ=ƈþóç¼âò êMikáv¼æqÏ׆žòýso‚Œ ­’¹e8«ì­í›f‚O‡9}ÎR.9Ô[m£ïüû;R™õÌ$⦭ˆ8 ·n˜(ÀD>}†3« ®©Ù*€fE¤˜©©2q!##½¢ä*RýÎ5¥1¡Ââk ‘ Ú‰{_þÅ9gd¨HkZè§ÒõÔuä– W >heÆÒ£„ MUE+œ­ÊËË ÂXǪZ•÷éþ‰…oDÛšÝbáeîrYþáSÿëz3Ôô/0‚# éÛGrÓ®rr=i{BúœîµÛ¥„åŠA‚H7KÕBK¡-q‘>ëO‘i6–)‰Ö²™JWHL éQ aJ³@têT1¯RdÍÕb¹¢ú¶/psx\ç8ÏáásB¥–™äŽ®bŒšù “GŒ1®ë–­µÖ” W—ù¬C1eR6aÕ&¬TŸU&¬ ¬0·&$XDzúi¾Q¿µnf¯×5ͰÀ¬ÂÌL‘%g¥šî Ÿç­õm3Õãº<ïJ8rEü02~ý:þü¿{çÿö?ÿñßÿí_ÿñãS…h\ׯç üø¦ß?ZfI–„œs f„‘™)"•¯Ã\-·k‰oæ…jÉ܆˜Ä L"jÂ4¦›§23¶õ÷V‹¬JÕøßΠ5ï@âŒL2Ï4‚(È höÀÛŠ\ÇÒj’DV·fñž¹|ÆRG½­ÛáHÉ s¸¦Ó˜PPG3nªÈ‹ŽR©†9ãWf||ìß¾}«»¹»yØ4¢@N@`@®8u©I3@¸Ò?\Çá% úcÆ]¥÷7ð=ü_÷ò¨¤/nqa»³<È¿étµo¸+^Å2Äô3§e+_ÃØ¬Ü@æJXpÁ|aQ9î?]ÒZǃ#Ó=¦›™exU22¢«>x£àúm‘@ê£ p¯¹hùk¢š €¼5³Ü¶Vǡǯ/7ãò[àLŒÅG)[J¬A©Xäu^”¾wÿ||ôçqŠbSUmŸŸ½oǾõ?™ã„ Ä*YÓqžÿñŸ#ÜTÚç·Ñzßvö`DìÚºn•ô$ ŸcÒÖ›ª,ùyu.©ùëViÜõi´Y¬U¬¦„Y\ÃΫ©€˜ªìcFää9ðŸfæ€X9ÏUÅ%¬hv„Ï`Üê½û-aŽcXäôud^Œïu,_ø5¨aEM#¢†ú\ôéU[$¦ÚSÜȇ…3¬7EýFY—À5Ã}%¸=Jõ†»?T^qÄûWÃõÖ1UÖ?¯V¹¢à˜#=r 3RCÌsš; edMaÊk€‘8 "a¾àÃæc6•×·‰ˆšø¶ÅÖµ¡"ÔŠ`_ *“ƒ@M„™,bš»/JŒÿ¬Î1íºl 3ˆå¯‰È0 Œ«vtÑ–Ü+ó>‹¬‡>-[®û-¼T‘¨ e€$ŠÌàf1sFåYFU’*g¿nü~[o¹võ™m{—ÏÞ—œc­æÀÝøBU 1ì8Æ0Ïu`X±˜jÖ‚> ›2ã21fÚ´„Dt´,‘š+á¦là ¥æÚ˜û&ÇþýÇgå\~þüiæ¯×a×ÕšLsž“´©273w1ü¼ìu\Ã,2ùºìë×Ëæ% ñëëxž6½¢b XéFàÞŸïÚcPÜ|"XQÇXâz\Ž»Úd½“+U‰÷ó´†ÁN˜¢ªMª¼ðVlÀÝ辶fÙÜÁ<‡y0Iì›¶Æ"D•Ô/ãã²bcxŒ9¯q‚ôMU‘°æm‹RT}tĨ 1 wfBB‰6¨ƒ o¸!³Y@>Ÿ¯LÛööxôÞ˜J’Jòõ¼l´Úv.G,áöz]ů+Ž3Y±7F9æWf°PyT•Qxék¥þõˆ‘8×ËëxœTƒ w¦|sU‘Ö6ì†q©ðš Õ“ËÂÍÜf†3aeç¹^­ž„Àò&ܯ|qs<±jô°¤Å7úsÁ+Wø¾² ®“zx6å*ﲬé:b"ø]ù‚ÊÁÝ]YdOLQR‘ 8' Jýà+sß°® ¥¼GXF^¬†V K!]‡€ÊXdåþþˆOâ»}þ®ù#0coº°çRé 7¦¤ÅÍ7J¦úñáÅdªƒx¥ <ÐÝn<â»±|g*ñÂTÜ›%O[‹ÖÛD 5µ’Wz«Â1ÓÌ}š©ŸŸÛÇÇ£¬Òá~ŽúUÈ¡õ'¥Æ,œçyù˜o+%êÓ}žþøØ¶½ãy^qã×,™do½÷^%Xà©ò›"A†/68­*žyä¬z¨ŸcºI"¡ WjöþÏŒˆs†Ùt/gˆ0Q­¯Ö›‚=#ƒ¯­Ê7ü¶„&©Jím<Ñë!Ÿî9gÔÍY@)挙õ B»kU5ÔfÆ w!P.;³ CNÏLabDÏôLf"å¬ØØ‘¿Oð„€É\}zdæ&,´6°º)ëñü9þ>£–þŽh¥¢Ö×ÿ¶ŠG‘ðnˆWØîü~ý¢{ZDÁ˜é º{—c8 £îq9c!œˆyšÏiဌæi„J|o\›6a½%yóuœaÞš2 2½™ZuVË|_ÜÓ"ç°24zD}8³”æi…³L¨+²™Í9¯icXцŘaU¥‰0‹ˆt‡Y_© ¼£¹‹7t?§ªïC&f¤§831sm …Y„ æðË܉IDpM£ß¯Ö¬^wD †J#”kµç(„Ṗ~9℟nVÏzÞZw^X¦*Ns¼2˜‘”Ñ}Ž,Zm"ñ˜v^C%™¹võ·wG•~|ÿüöíãñØ€àx¿~}=sNÃL–ª0²rÛúÖDâÿ£êL—äH’#m—{dV¡Á&¹»ïÿ€{ »•ávì5!‘á4ºP¨Œp·CõÓŠó:ßo?ßþ>×û}]kEV½^þÏ×;3Ì•˜¾NTч0EÄâb1 œ…œxVI¨BY2¨Z߀mr&aÛ.DœMüùÖ`ìYEŒHªæËâý?¸ª{ D¢ªf™y-ŽˆæçœÇCŸO›ÓH¤ˆÑØ«UPA™R'L®R›´Ê"”+^Ë+—Á0˜)Œµø1½ùŠôb~>GdQÖûëüõÏ?ïëõòo?þx>ŽJ7a5ãùxŽ×{!a×=ßç{ù%+Ͱ+׈+òÒä*W)îw‹Wª˜1`€:Ì´C y3É÷0IäHïF,”*se¬Œ=«ÿFQª¨tX– ªèÙC溮":x1"@0*ÍLœW´®È,Áøó<¯h¼wq£“€¸ÌDÕ„u œ¾!Jé\%®â’î+šÓ_œ~-[^Ùjìú­é h¸J{óŽ‚P: Ø¸t à=el##Ð! b ‘ñm’$³6¢› EÃd SÇ5Ò %¦XË„]º .áJis#¸Þç•Y`±´p-)<ÂʬW"Ý÷#šÊXUuE¦G[«çÍàÕWs‰à+`–Þ§:…¯ëò×›Ý<fcD•{$Ž™¢€é Ö}°cèeQÄ%ECUèRþõrúñããx<Ìæ^ V™ÙósŒa*ŠÎYÃ}0@¤Ù“æª\ë:ßïHÒ9wïÄ{,·n¤ˆÄìP ___çÿù¿ÿúãóñÇ1Ff>Ÿ“Þ»PU5³H3¥´M¹€n~ZÐË1³V²J¤ a¬‘´(«ÈVßñЏµ˜Éä·€![Å<‚ ф啅 U„((3%sV»¤º¼‚馲 o¤çMu4äËÞ ùŽâÞJ}èmTa ;¯‹æŒÄä4$öÈ÷ûtw½Tr6åÑ\“j)s7vD¿)ÿ·|Û ”o>Üx›"Äœ”¾–{äÎâ6ùçî)6ƒ uÜFŽ7Ç +ΣåI¸«¢gR…þ¡:ºOªVe챤Gçû OD–£oG˜i‹XYL¬ô–º¢Š³í/˜@a¦To¿Lx¨¦jVz%‹}|~þOÇ_¿þùz‘.¢¿f&Ñ…"SóŸíúëÏ/?Fȸ«ÂüãÇǘóýöÿýÿþYÿúë¯8O½Öß¿Þë+¿N_É‘W¸½¯s­L⫎ɟÇãq¬¨órªBïÚìËÖûˆ «ÔvLBô’$Ö0 ›Ùö§1U •aZTN-¼Ó»3))„È:éo§¥¡Šëº<ýù|3î'fa-Ì`#+38ðv$ðçȸ…æ}`Äm…E¨m +±!¶Bbbv6(ÞFn¤Rµçuó8ûÊÌ &Ò Ap—˜6`± ݬL/AUG·3å·£…îaûŽÿBÜËn–¨ÈC%b°º×Ì:†90Yo"1áÓ7Ó•FÂ%¿U¨é ÊŸ1¼[“,÷ØQÄrgòf4¥8îT;F™~ﯱ [EÑ’òÎfMÇÛ—áõþxÌ9D±eRüõÐWšˆ©‹(WÑçãHˆ#s-Q+uçåë½.~éãx˜‚„²ÌfŒÔU49{Ýgeâ¬L¸8k-?ÏÂÍ®–nÐ^aàE~×ZáPº‹šðº«Ká¦SÈ<˜(ô|¸Â__ï×ëM…b‹iE©Ê; Bs˜¤óm 4Ó9ÇÀ$w¯¶ú™TŽax¾`ëMµ`a ÷äËVƒ¤zÏ¿…ï;uTNîE 0ÿ€´Xª¬\ûó…bdPaAb-NqfØíÝÌb&6EòýR´Rùro­þ=—o-MFÕ…‰€JfµSH6ik[À㔼¹ÛÙ#ö{sÕßl•Ñé3­Êkü_­ð̤àNøeN$ÓŽÐà–ŠîMÝ\isMgIãéTrø–¨‚Ý–©8;.™DЏ8Ù8v6ÉV‰XÔÔð|ìÖ¡XXyLSíò£¿A¹õÜkƒâåáÆ(%âÞj?| 3‘_ü:/dŽŸWx&Å„‡2KXL­X<ãëtùë5ÌL¸r~>‡ð`N:ô1Týr÷¼Té<—¯loxÆu寯×?¿Þ?>>>>-¢¨46SJ¥b¶yÐzžìèͺÊgUt\ÒäÇ /¢"&$\ÄWø G÷""¦:&?ó8æœÛ¼ ÏóŒµ öðå¾²Š8˜‚”9ÇÅœ&€¤*‰qgœ+œ&rÌÇÇó Ѱ´_¨:u½yO'­«™ ¼ÎÑÜ |g\o²D2ɾ.îÅví«lwàð°ìISt‰(»ËK²MN„£‚ª$ÞHÊû‚P$ìkUÖPz^KLÕl Ó‚©¦é1u¨¥Fª}E½ßïvÑèúz] o8•iŒsÎ zX‘ÑdÀ¼–Ÿçå—/µâZé‹"*3ª9f }ETe°{Á¯_}X`AϦÚMÝgb²ŒÃ KA,b5FCEˆŒ…‡3;4yM½ãÇqÐñ€ˆ… šã-Ø2Qd,aq ýRUF„/wgOúõº”EEªj¹{t-»7ŒÛ&ŽÒ¿×²F35qà;6cQŽÛžÁ eD}½NfÍ¢ãljLŠù³˜VåZ'UÀ€¥ÊüxrÛÔõ~¯óºþùõ÷r7ÇsX¹G¾O_qº_î+r­ °†%*Š¿jÿb†" Nn|:á(>¹ÇÚÒÕ6‰VõVº2£Üë¼®÷åWԊ̨.&•q—fÔ•NªZ_S‚ønfºV¯k‰@®üxΧSÕãgæ4Q.®–plE7ɆÚ_xÖÍ `e=Ž©6ÆÇ<Ž9˜ ¡µL¥&ÇcN2rk]V–•HMMžð…è¥LÀsÅ[¾ÎŒºVœ—ŸW¼Þëõ>¿^W~ÿóÊÈX+‹ª„•çÐcŒçqÈŠˆ4Ó9õñªâÑm¾IÌxxáôH"¬ß;T.<Öò¢úüxŒo×=4mN6 ÷Qά¦ Ø¢ö™£vÎZ•¨2‹JÍ æ§Ì Nù€5ƒd5ãöKd-ÐìÕáÎp^¦§ˆ ̃…aßæ¨À'3`ñ§.E$o¿ck:0\lÈ)”!,Uš°²­š­vÝÄ'r[­ÓFè1BÍ€(¬¨ÌP Ùa…ÞÒO&3}3"ÏË+ qLóýïsEµi a@‘±.pOåˆÛȤÜûçö5š}ÇìƒsÏ*Á Ñ겿嫻گޠ °˜}¼bFU™EïË—ÿýëëucÎ1‡ÇCM´émª¢c±Yd„Šd1©xÄׯ×ëuz$ ‰$ò¬¯¯·ÐµSºT­ùãLJ Sî¼¶ýx±–W%?¸;U„Ñ‚ãŸd&1ÃŒ˜®«²rŒùx<ÔìZØÔ0+–ž ÷5ÑÊÙÇs|ÏǘãX+Â]™c`ƒM#"±‡YŒ H2<¬Ú?fº2ÉÉ<‡aMCË$ &càó¸–¯•HQ%¨ÜžÉLZhcYq§£·d¶–ÛÁ(YkYö²T!3¾š0½=½È]Œ`S¦L0Úá§Ñ:ã½*á–ÔV‚zÀãöŠF„Õ¨&í—¢Š<‚C²WØ™ÊVÞïÚ)]¹Ì½‰ËF×=Þç};¡«e»nøÜ·XŸîÉ+ó7’˜YD+·ÇA6®q¥Ù3Ú4Mx’‰û[E`"£Z+ÂŒ²B™çcŽ1Trl‰9"}!dÀߪ"C³ìqqg©¦vÖR*LI¥ÃX-+™B¨ž‡1ذ÷¹Â+VüýõޝsE¥¨fx€ÖºŠ»ÉZË__¦ü:×uüøññùd’ºÜ¿Þ終ˆþóßÿí?ÿýÏð8ßëï¿^ÿó:ײ)ÏÎëP1¢*³Xy¨nõºC¡€={`„#À®d1ª)ÙxÔn+ÁNͪë¼Þ¯å^ו"õãÏÏãóã˜Ó˜p!ÎLóõþõuy¶‰¶ $Û°¦Ê8„·s /Zá½5ôùñRÜÔ˜èºÎk]U b†‡)”™(¾¹—ÓÒ„sáj‚í½Fã|ÎÂ[3Ý{¢oÏYí AÕ^ÁenAÚõÑÿFk‚˜ ýhൈÅRVcª \í™åQ™t­u]vúÊID*cŽ9 w%©0ß×ÎäôºÎµÖu<ÛŒ%÷f㘄œJZn£u‚f 8™°Š˜˜)Gærw*ÏT¦pª ÷+2ÌìCô@>BfUÍ9Ç3·qôÆ:²èZž‘½ˆgbæ¡òù˜ÿþóÇçÇã˜êáçŦYTMªð㘦:ÇpZÃŽi¼óÙï­QV‰jt"‰L¯TaºEH<§_nD Ú;" !s+B…Å\Ê%ƒµ¬ØhGW÷á¸Cu˜…[XUž±ŒÜ/¥$ ³™¨qF€o …Œ™¶àaÓp©Ò£ËÄ>b•‡ŠäÈÂ&Hƒæ"œ½xÆTTɘ´Ú¸Ä·(º£1¶ $6ľ™a-׺=¸¿=Ç]?á±ÇK»ŸÚŠÀÕ[QÓ/BÏg);èõî‹ãBhÐfTT– 3©— ‘HÔn—#sR1}Ç<Žc2Ó1¸Öåçé'UdÚÐãfšEke%‰î²²XHIYŒ°-/SÏŠ$eUãÈUT¡,i¢ú8ŽXqžkU­L:—{ • «ˆ¯u®‹XlŒaþÇŸ?ÿø<¦…Ç_}ýë_§šüøññóÇÇã˜c¨š(ƒ–;„©šŒcŒ«ã…³‡‰X¸1{ØùœYföt5}ùuúu-_YsÎ?þøøùÇçÇs˜‰¯U¹Ê«„gXË“v7R\#R˜ÇPÆÀÇsÿÁŽ+yŒ9&FLšYçû}^ïtgS~Ì9§™É:Æ`–ŒˆˆêxvÌ„`Ìèvx} PgÒõðcób¿atµmêw—›÷„'ÁÁ®=v£Ç„›i^†‘÷­á6:†Ž¡ˆi¼NψëŠóº|íwNLǰîVwÊ 1_EIr­üõZçFfEFT¥°kƒ«ú\Hä-kyHíuÏóïö í:éVét8Tç¾l’B¢²@ãÞ*üÙ=TÇPBÕLD€aRfñµˆäxÌc ¡–Öe$1!'RU@+ƾ‚ûhÅ Nèš"“’˜MX²òº–/‚°¡ˆ’#Š%‹[™ÉE J†Á Y­<Æ—¢¦ÐàÔþ¦Þî»=Ü×Å 5 +JVa6ø:U“ ¿®“÷ŸÅÊ$$Ês"R„UŸd”_q®ë½Ö¹<¢LEl°HÄÚÉßg²ONr859D šâmÒ…£€‘)æ@•Ônu:Å ¿¸:y ¿…ª(#Îk]çrlVyô$¦!×LÑVa‚©HÀvmvº¬iúãùøü8‡5{2v$M<ŸßZºé­j„€9º 9R”Ì¥ÂóçÓæá2l²m }q–{”/÷kUæ´A<<|¥¥(WIDçb–¯¯÷?¿^¯·¿Ûìî"ôxÈ<ÔÄÖH÷‰ý‰Óư"±ðó9?>ǘÓ@é'â9Æq µÑ‚mb÷¢”IŒª×=¢’”E”D²÷M–™È]Ê Æ,HLµN8bælgÈt¨J„e7Çý¹S± K³Š‚´“ ˜!”33(„KLz2xÛ—ÝÙaCssžjæŠ AzmØ—‹áÝJ|;½¡b†®Dƒé7•u{€ÿ£{Ø}Ufr&9urIRd^×Z+2ƒˆÌ:[}EDù–fµ<´¥ˆVáhu²˜T£°ö Ýíëm…2ªÙ {á.¥ò›P‚ï¿Zþ6'Nb»B¿é¼Q[ŒØÊ“›£P%¤R;¥õ”u^k-·Ž~I6é„<Uð¼)ýøxTÕy\h´s ÃŽw­Ë×&Æ GÖû}F¤*›i½‹b&ųŠÙ0PsUD«–×Zky spå'ÇoÕðÁƃSµË‘ˆ½Ÿ‚"pþxŸó8LUŠjeÃ…‘÷WDy—=ŽÃT=á`ãA¬µeîJÆííÙ|Úo OÉ5#±ñÕ‚Ù,²"1F*¡Âs+]Ѻ'<6;lóÛb‰7ûjè2~˜[+ÏDÌfÊ,Y…è€núµ†–±FlD9whWePnÜ/r6"|%“ «ä+{¦ÞZ ü6ø»yœÕ¡xµ1Ür—h_-Ñoœ‰úÎâÈž{4šBˆ’÷ïBLe}ÿë•q…2+EùÆ"VÇÇD6µ¦ªWg0mÃ~²§õP:æ|a2Íi6,"Ïó JÊ¡’ª-"åŠ Ô³Å-ë|LCìί$"¬ÅŠÔÃ*cKDª˜‚pq{…{ªÖÊI‹Q¬ƣ„™ç”1ô*Ú´¢:}¾¯çÊj:Çøúº¾^§þõPÉÏãþù1}½Yäããñãóøø˜ 5ÅšLר3¼ÞÊ’Ðd5§®q«Õ`çÁMIJ:“–;1Ï9³xiÑãq|~Ìc²* —*C™¦\I$Çc|øaèð$0z=ÂÆLEX(·ôy2 xfs¢Íšëš¡B6‡ˆŒ1‡Ù]F&o¦.æ‘û0ÜØÏ›K‹b™µeä¿‘äî"Ÿ·Ú¯ç9-x£Bœ;غŠ)©2E«ÁõÂE•QòCÿ¸·Cb`)¯P6ƺ3ȵü&¾7ɶ¢Mê di¡eZQçŠ×ÛÃ³Š‹²SE#óŽY[3D3˜S¥D°M“"«¢Š¢,˜“˜9E“»À•ƒY]d§bÔ–úóVúe3¡m'äÄ/b¦Ä¥Âc&V)fžs0KÇ gE&ãÓƒD4¼Ü3t)1fðò–ÇíŸÛP îµb°ã Ùûª¬n‹Ò¾ãM ¹p­ƒôXîU‰W¸’Ü=öÇž\Uµ®E•fJ$"†óœèVBÂgFÂå¹Î÷+³ö8eÝÃ!bk #½*`Æ@ƒ."bCÍ,«®ëº`ÙD)—)DC‰‡ˆÜÈžlËW„{UiU–‰Ú^{5^í±z_gíúŽ"_y^ë>‡©Tååu<ìñÏ1†rïUEÇ0Ø‹8h[ÿ 1ËìǃÅT˜Ì"–íãq<æ¦8ÒÁx§Ïã0ØÚûîIfFÂâÍó,afÓê#¶ö º“ßäw4NÁÌNÝÎ&^ Óãmò€ÇY9MªÈ†cÌaÜ/D~'ÁÅk g‡OµýJ -ià?oõâ‰u Dîké4ÈJJûo1™U€`@N=èO_‰Ðñ ²,Ü E•WUëMûj%¯ôPFD Àw"*ÄiO’b¹êö/ÝEÒ -ÙŠzã nÀ!G{=Ç÷_³ˆ‚´\E”|ÙžªVÅ=qÝ5ZWÞI‘D×_ï+“”‹™Æ1ÌFj;ùÅL-2Vfp¦)ÿñãù|øÉ/_YÓÀú\¾®ëº#±˜É}Ex— jsvu€Ú±{ë“,Z˯Hd÷³óøøxsೞsGkfº/aþü|âÏy½®¸VôòJTøã9þx>iÈEDR!‚?ˆàùA¥UÔ$kH¡ ±e£ýx%sua¹ü%H¢ƒ±­ؽSõàQÃlPûøo;¦ÔÕ¹aí± `·˜_¹åA¦ììôÝ×=ˆÇ×43QÚ’¼=þÞ¿:Kò9ùÆOíÿGBÌÚB×vÜŠŠB&@;$hg›~ïI²‹ó^U5‰§ò;9„¸àõºVfbâ˜u»YÚ ˜YUžtÃöxëã¸óh`D  G¢7#5CUE¼Iÿí×,ÛMwÞyö’D™ÌeÆcÌŸ<~þ04».ÿõÿþz½Þ`8 1^‘™ç{W6­‰O’#e°òD™»ÒŒÂ0#2Ò3ÝLe˜9^**¦¨\+Ù \5ƒSbÎÖ @-¯ë<µi?þˆâÿúë×ý×?ë<ýúø·û1 ò;3Mãa<†Ži{2˜ ú¾Í© 3ÓJ—bd®)aoØ"/Hà  ÏŒ0Õ?>ŽG!g*ÇPæŠðìRX Qù#Ä|9¬¦¹Ü‰ˆ,UˆM W8³œD*E$BÁ¥xå™kN;Ø„AÍ*R•‘îQì ­ˆL/*V!Úav­¯¬û oM)÷ÃÜOÜYuT>Úv3øÂˆ™°™ÞUxÙŽ¹ïüª22³£n+|Ö ­Ä_²"êr:W^+>Ô&{-?¯µÜWeö S„“1¯¨ŽyJwGW,*EžåÎ\ÜàUœ8£WN"ÌdjCMºÐϨ ÅœÉU…)§(Í1ŽÑÕ”¯õ:¯ÇÇüã1~|>3é|¯××+"׊ó\Ä’U&¬*x›¦Ù4cæL,²%øpoö+oªeó9 üÞmä–ŸõcÉ%D*ˆœ³{ ³ÛÁª,<÷Ћ¨ÊmäKÉ`ˆÄ÷[Q€ófF•dQñ4žóù|Èj:©˜ÙÈ̵9¸I ~grRÿ£F…rÇÈíB°¹Ã]ìË fƒèMФgœßvÈ·7~O“¸HÕD°@ƈD «Îåá~¢Ž‰,Ü[—ÞIxUáZØàÐÙ2‰j›;iyb! ¼e±L÷]Ôžâ{>¼Ž`¼ãýMpåPžsÌiL 5ÿ·AGÚ-[EÂUàïX†›Òò|óPÂÖ¦þùóãÿyžkE©Ù4=æ<¦ 'Fö¤;%W’¯X~§i‘LfâivÌÁÌ‘Idx#y­¼.?/_0æ¢á²¡r§[ìg ¦4”;{‹Ĉ&«DĆ`†[¹…q\,%›žÕks)UQ½q}à7GD™É1„)Ïë\T­û4F!;¯v†q«? òO自 ]^“˜Ñ¿™Ú0VÕcê1LD t/w/t’M¾—cl’U×™×ÑŠ5f&Š púx9L‡>Ÿ‡£ u:ÄÓPêªÊ‰åx£L„Tô0{>æ1mÏa%"˜ž´`±ß~©–éJR;&WJOŒöåšuGö Å ~eN¢[x Ð×–pì,ˆëòÌ£Ô gHsTf8\=p…·r¹WÞ轿©Ž(Nšè/ý;žU€`23†…¤Šô_Ù<´Ü¬ h ùËö {æµÖu.ïôAb8s¨RE¸çZá•$d¦‡¡–I_¯ó××ûuž×¹Þïë_}½×Êb¦¸“‘o//6<ß»áo<Æ ¶Õ®šˆ÷®ÐmŽ{5Ô”ïèI ­Ò ¦‰W¥HQ¿ÎxKšRÃY’™áçuæ:ŒÝ+³®kÙh*fƒzìZð_Ùüî£ P˜~§Uýñõ·óìïÊb|ðŠ:ŠŽóË׊sÆ0C­û|L°ðyUVø…±nU-8W’ ~„g–)ÿùó³èŸ )OÓ9 nzT¢ í4=¦Çc U2¥¢Øs6ëò`&µŽêyÂÖøn"8©2!HMˆ;ôœvné·¾Œ¬èÀ©¥‡C5E™°êDž®”™¿š­zç¤`*e³[¦ Âf›É¸M§ˆÖ@•ÕgæMiÑä†ðw‘·Ù™Ò^ü&FT»T*†’![ûƒ1Ì-IJs‚Kä7z¥£@BXÉDbmöïÑ)ÆtSQýl€Î¾€ £¢*©Ì•QjrÓLa¸×àöë"$º:/‹<ÃÛBM̷˘±ûÏÌ+)ÆÔçs>s>Ærÿ׿þâJ§¼"¾~¾üq ‘Ü×û<¯å¼¹FßJDa›ã–M%ùrF‘‡ÉxF1ÅÎ""ò••«÷!•,jÃ>ù#jd}ýóÏ×u!)O ÒBl6RXUIEä8L»–™I*úñ8„5ƒ¾žšS!™f2lýü|~|<æôhk²è– ·O„¨"W—½ fm§h»As;¶A)Ê–EÔ3ÖlÜ'Šî‚‡›“"΄<8ÛýA•&b7¦µ(3”U"Uª¬RÃøççã?þýçÇóáØ2•ÜiõJ$•%%¦™ÐÚd¢?€*’®—§¯ LSAŠ%رàO žšóÃ}ýò-c£È~•`€¦^÷øL´õ‚±Öùz_"ÔªHËXÄê+~}½ßç‘`Œ¬ø*Eejçc“•#âu^¯¯ä –°¨´³[¼¶´XÛ†Åð,‰¡ñF˜¢PJD¥„(¦ ŠàÂ!•ÅECåxŒÏÏÇÃ}ï‹´Â…c RÊÌd.˜™Y`Ã*4MCÍ(“®UáÁ-7â*b‘yžŠ^Žš{ÈÖ|O.¡ÿqOïKÇwú Ý[)Â&ÓÞúFUÐöLO;Ž!B˯LÎäÀãž æ"NUóh:1rCÏ&Bû‘AÄRßkPÂBm-ú¢k˜þçŸ?ÿ×ÿúO"z½ßk1Í!Ç1‡)Iy­3S®å_¯õz]çu¥ »í*Ì<†>Ž)*{v’X±¸Óëå•gFé ž\ m“¥lVf¦g‘{Ç3ãˆw¯ˆ \é1í˜`eD-µ* .@gU,³¨Ñf*Dí!¨¢LŽÀ¤*׺@VQÕ¡òxŒçcŒ!Uéˆe›´Ù0r C*<–·AHûfáÄkª•õ>WÃy±mÛvRaV2„”Îå×z—2Ù3fª¨%äÏC~þñsØx>Ž1ÅqX¯Ó×r D06°©óYd‡ LJڟvèaô˜rìá<„ªšI¯ó뺮Ïüø¡ó0á2“1烾?GÐÀ2²(¶®tƭߦ¢ì¢O¹bbÔ½U~Ó†‹ˆJ‰HqJfVVF'"Ò’ýÖB Á†1"3Yè8æãñ0ßk™î<¨6ó·K™]K}¯þoÚ_«Î¤ˆ J2” *±$ÜW¸“vT&Š“7v N÷Œ3“Ö hXˆ%ªÎk]0p¬p÷d‘1ôãùx>]§}_ç™Ãô8Žiƒˆ¿^ç_¿¾~}}½¿Þ×¹./f®X¦¶r§c°øæ:4Üɾɟ—†Gÿ·Âö˜öÊfk¢wW³ÛÝ“Œîèò·Ñ u/¾…Q-ØÂl¢šA+"bྯë:Ey ûx‘ô|Í7Uocš¡è¶:׎µ:¹‚õö 0wBÙö[s'™F'9¢tkLê͘ßóþï­òMï9nGXݰvïÌHì"2KXvMÝë°æµm Öš*Usl=Æý-ÕFô6v䥂ïˆrë® ¿ÓœHo„» ÜϬ,2¨°:adµ¡°V‘Ù UªH‡P8Ifé||~>žS”3óï^ëur $ãò8cªr¢{ßm%OŠmìÚváçȈ“ænÀ%d22\dî ×`1±±ÇüCQr^×û¼”uŒ!ÌØ°&Wfb/#DŠ D.°­LÕD¦éø1ÔÆëu^~U…*Ïiã6§=ŸÇ1'tlý¶Sïx¹ƒi¥k8ùƒ*RPÚÓyᎸÞÃyLUJH¥)¡E™ÄÉÊÔQhÉ\á_MUxíð|^cOAÈ£– {>žÇª4”?>æÏ?>Æï׉ò“à¿©b÷¨3ÌDaÉNr÷L‡ãEÄÂ}­ëëë|ŸW¬5‡}~~ÚÐXØ ÙãxTow¼¨† (÷ °C´ãQNŒÚ¶`=0ˆÛ×¹hfŒ 3ìÔãå~‰BÚ”It-¤eešUI[³qWÓ´û–½Çl>²Ò Â"Dc5_Lmþa’bR*¤X¿’fR‡×êtRÖ1õó9Ÿày< ‘$Êf¸ÎQ4ÓÆ´˜ Í!fâQÀ1 4J¢Êbï÷…Ä8wX¸NIM•¡ûbL ¼#Òã»ÑÜUÝgX8ªä®¦ÆvÈŽ`æ¬\Ë×ZW…Á6V¬Í4DÀD¦g¦'ÝŽúî(¨—h½•ý=óc wʨik­TÇa6d­µ–wqH…×êŠX"X9²Þ×õõ¾Î+2i¨=çãù˜cš™fˆèbÆO–*I˜•–²2©t+&·[£e»Ý¿ÝŠïþq±Ö^»AµÚÖ ¸·+1å:¯õ–òL„f€ã(Ì ¨Êˆö ÍIι…¶Â5L\Î"á«&EêcLSd¾rrW8˜.s‚D@¬¥%•ïkí1(™{b÷wÈ"Qy] Tœ”¯. IDAT"žÓ昴H1=™…ãù˜ó˜óx – ¤2²®ï÷¹.Gšo„Š8”A81áCíxŒq •Š-1=¸+üŠë“ŸÏÇñ| 31¹®U¨0ãXÈZ¾è$ÇdV‚æ- ëaÚ R Y×Pÿ-ýŠ‹ßË;¼³°¥ÅâioÒSÙ¥jD¸¯ó\½pCbq‘˜qQb6cÛ3Ì`êåïäþ]ò¾••ððÊ6å|ÇMïͤJÁWÁª°÷qEéÙAKèe¡9ks7X"<1Vàò¬¬DžãeèÊûuýóëýëõZîª6Ç5Ƥâ¯×ûŸ¯¯÷y®k¥g’°n¥0‹[x‹{µÊÄŪ‚¤ä®è³ wÀï8 ß†·ž‰9ªã&ïMòä« hi™‰tÿ(Æ%N"”E%RVèþ²ï¯Ž”âŠdÎDA)\2 ã7¨É$*’ÐN›ê´Ã!2çÔ†¿“UŽ)xn?Ð›Å’Õ ·F>up8]Ý™šl¦ƒtŒ9簡­Â÷*bCçPžÂTGÓžø>Ý:ëzοñKísªì‹Ln—÷=šG2b?N(ŒîhËÞÖÿ–ï¼?þÊŽÜLº¿P}³Û/[`pܲ¼ õ­ØIúþ#ÀNUÉÀÚä€ÿPnòì}KÁ>‹ïóÖ$äî`êöÙ#íáŸk6-mÊoŒÑ­†á¸éo™u-÷V"ÃÜH¦z̈ L”ª ýa/–áy§ï­#¦§@›ÃGÝXÛ¨²‹ FV"I¦eQ"vÏZI,ðwó°¡Ìåîï×Éi±¨“ç1þxªÊûZ¯_ï×ë‘srg§Çñ0VvÏ©fR%5–’nó1ZR‚~bóÂYY; “ÇêMDÔu­€}YU‹ªÈ—¯Ê+3+QüS¼DEØ<Ë1ÇÇ1mã&vŒñsšš ±NËK±ÁIvvã˜6¦ì¬"(ªEÔ¤ªLeeÉŒ…!ÜF%rfl ro!p÷UWÒ ¦uÌñùùüüx‚z•¯×ºÎK*véqÈí†Î\\r”Œ!•¹ÖåY"fÖøD¢¢¡¢fðüT–g­è—:¿em©Ù`‚17þ]<$¡GD¦&*¦¦#=£‚©ÊDY»OT¦Ž-€©¾=ªô ¥[´„`S€ÏúæÛˆ‰iMUºgªB˜£ßõÇÆ7µ¡…EÔ,‹‹á›‰ÌïL–¾‘Gæ¹|ÅëëúõÏûë}.w¦ËÔT¯Ìz_çû:a%ê‘ÀwŽ2ÖÄ0/H#P~K7oÜKnaÝ– lõÝ#ßMÁn”ÀXÛr ½Ãµs‹¡þbb)ú†-öŒ":š¾<,EL¹ „<xAI„Õdßܘ`C”¥àè¹·XX6/b¢H/¨_™Cç»T•ܳIÑ’§¶ˆ~'*êæÁ&QÁcÝ›¤ŒKmyeôS2çDŸÁŠŒr熪ˆh§´SUÍÛÿ Èwj-‹¬ù çj^Ë.Ïw½ ]ÝK×ÍlM4Q] Uó57wî~b4Ww¾ltÝ’Þ“Ì;¤O  ÂÔ˜ZU);-nO™ÊÝe2w;J”ÁI7³nKˆ‹³|T±s´¡u|©2º$×>;Fª\‘¬ôô ÂÛ ÄŒ W‘1¢ cØ<$:ª¬Ê¦ ér_×jö't¢Ý'T‰Hûr÷”‰£1tÆ·O‚Iß"Âl°U1å09¦™Ú1‡ì¯+3—š,'‹¬’ÇÔÁ‘±â<ã:MõùÇçcªS ‘™!›ÝÕ´’¸O(¸Íð ù T"Üxgî⸸§qÒ© LI)ÊJr½ý×?ïó\Wø+s¬Ö+I‰y 6Ê4LŽ?>,ü‰Œ©†n—g^TËLŽ¡C… µ“±nÚ2AáÞY ñú]Img FG´¥˜yïÇ0HÍÛ²;Ç„,h‡1šÑ,Ë0w76ÑH¬¨Ûf*C _M˜mH³'¨Tc˜Ž),ä×y-‡ tC{yßWÑáç,E|u]ëõõf•ÌšsBð<¦‰^fËýºÎ勉ͤvÈ]çw&à:逞&˜ÝÁ\̤ ;‚>\d»ñI¾ûº\Dl {ŽCD2<+¡Ñ­Óä,Š,²aàxTÅò¨¯×ù~_ïÓÏ+Ü]•éa;Nú-\´ZUðÛ|ÇpQ¯B¥^Ó=dÙÀÎïàQ„¸£öL¦o‡á×9nL%”V3­L_WUniúZ;f \¨`wL >Ïrwl×qæÊ65AíF—Çû<_¯÷ûZU,ÊÀaÑ„kþ—GïÑð„­Ö¥HÎðHâ–%tfaîä,Ì…»)‰"" ܪJª:Œ#ó¬ €·#¡ˆTùCç^=¡óÜòed9"Òƒ2©Ñx°ûT0• 8‚›˜¤cô,¬sH›"8è{¸ Ü'$¤%¬&¢ªsغm•|ká‰5‹üŒL‡@¨ª®ó|}½–»¨ ³ÑeDµq¥•êQçk]§ïu©è´¡¦Å CT^çúõëõ~¿=þ?]oÖ9’diʦ é•U53ÿÿïu¿t-NT–y¸¢0sÏêÈ“çdDzFPÈrïw=³æ8>ç<§M°À«ˆW".‰¢È32•Ýã´ó<Õäëù}¹Âíå+Ö\)’âÁÛ:ؼ{|GÑX†éXT×rŸ’ªÒÅ6øÊòÌåù|^hà‰9 cvF)¼ 8§gDc >ÀÝ*HšEØ›…ô •H?`ÁÖž>ÞÆ¨[ÓGQî±Â‹hŽqÞËŒ-dGKQyÔ+ö%µãº S…MĽq&Ûã…œTOÊg=Ÿëûk}­ëB‚U1óʪå+2èÖgoPiûT0’ÜN¨Wjц=B% Â}4µi¡ÓB7zÅY¶¬|6!òÙ¨:þÅ J8ùã¢{d9&!$UBJý(0Yå¦fZ$6V#Ž×LƲÈÌ”ÄJªÊs 4iY•”V5ɽPÁ+‚ß„M%Ü·´×Í¥l‰Xg«ÝžÈÇ宄±ÑŽ«E•É”¯Ma¨ôúaj {ŒVU„bEÒ¥P :ÎãˆpÁlSuã™x“ìAˆã½¼mL­1ï*GSô[•·3‚ZüÀ¯·À]Mô¬§6F{OO—m/rKïù5ѧ7¯;ÊHh€ñ2ÒÝ;`(Ë*yq·î{§nDÛ¾•ÀÖ`ºKДzìj*„´Æóšé#"øªaR*‹˜ð1ÌØlÇÑ“DœWVЫ2ϰeêû”AUr7ÆE1Òë>9RØÀ1W’·‹ wdW9Æx<眦œTžUUªrSDtE›Ú9Õ8ÃK6§É˜ó˜&•µ®å× âû{]Ë«× 2†rÕ‚×(Љ³‘Œ¶N2JI$”EäÊ a®1”hHfáå•’%”Ëýç×÷ß_ß+QµócöñI©"£/&«TG  3kº¯¯¯¯sÊb6Ìø˜ ©ä9[­ ï‡{•–ê`ƒ‹¯'wºª(jôÈÄ9+);Ølºß}–;œ¤î”‹.ÁE²¼ý…läȬNJóZO±<1]g)g¨ˆU°Æg¨Ä¨(sE2}}}}?‰•Y‹•s._ŽÙ(›yKŠ`eæð¸øb*3;† ÓˆZkþüúúúþöå,B4|¥[3vNUéË× _ÍÃÏDt=š*á@ ffs˜ 0KÙÌÌŒ¨Tj(y<§çAs† [~p ë$ª#Ñhj½Vq@õ%Ƙְ<ô˜%_Æ@’üNõî—+“)sdÆ•MôŽE˜Ê—0•)Ï)¤çº\Õ¶I­XÅTLù˜6‡5¡(©¨ŠJŠ’~+gDx|}_Ë£X¬µ<Ó#ŸO>}yÁ»œI¢Ä´öWdÏ ©&²JƒtÐ}G‡¯*t–/ÝÁ^€ÞášÄECBvjK“@ Þnb¦dŠ,ËL‘ÌP®9xŒÉjU¼.ÿúÊïofÛ(ÃdV‹™Ð–&ƒÎ¾®ëÒŠXY%*h²òº®¯¯çò€÷aAî%r´ûBÄ ”!Êë@Â@­u]éykOaw$sw7C{ÍŒ_ë0„Mv¦k0•öœã(ÈYÈÀ¦¯S¤ÿĪüFd‡ë%A &Šêâ Fèé–—75>–DÃUŒlHÏXî¢Ù%8D@¤¦cØœf"]ÀC­!‡•8Å,j\”áÎ\Ç~µ‚›Dô¼–¯Å,|=!Úm ÈTæÇã||LÅî×××÷Z.6>ŽCUÏy|~žjyí™Ïå2ÆÃ×Uáóãq(“²óóz~=Ÿã8çñPÑtòHJè|yºûPi]!sRÐõôµ«fÑ*rOæì²(*(âÄñÌéY™âéÀd›@ŠÌËs…¯…¢?"sy¸£Í1ô<ç0Þ·H â&‹cÖAWÒ¸dêKl*ÒvÙÚì/x§r£±ZHZIÔw8fq»+¡Žª¦YY¦ÊIõÎ$%{<»s‰Z•ÕïÂ,‚£†`vC˜Í‚M‡ Wác°9ÛÅ‹Ëȹ¥·îà–µµŒûvÁ5ô8ì^AMÚ+”ª¤Áɸ§ =*…°´V @ƒŠô¦vÇyÓ¤*VÔ*¬É\ˆ»µó?>æiR™+(9¸­Š_«2üJ qóû¹®ky [;lL˜Eà¿mÈ’‰±XÂ$D‘ôŒz³åqŒšcb¢¤e&ŒÄàÇÇL#u¨<Žóœ‡ˆDefôöÆýr ‘©›s r(i˜HHM>ÆqL ÷ÎÂðº/ÏdФA ƒ‰”6Åc*VR^é•EiÊó˜¢úýµ~þõ,fS£MºBÜŠÜy%¯ÓŒH 2â"+Jä‘ÞMœL<2?ŽMkŽå¾ìÆC@@äüXjÞCÝH9¬AÜ!}éÔP4=‘ˆÔËaö8U!^ªBl†è=¦]—7–©‰Å×Ï$†wœå6d‚^XI$I%Õ´¨nØØŽ@ÉóoAÀxJ­f.“B¶#¾7®ûرLÔTÍtNUÞkÑå´²^M^E”W1¥;G\_ßu3;Nƒ,£^3EšYe‹é8ÇÇç9¦Vâµj)ÊÎ"·‰w Jº¬(/Ƴy§+@LU+âéë ßTÎExu'žef¥J¤0ÑÎ;Œr+`{ ¹Ç»…i1ÌgIè ´mn¶Aq¯³++b uD¯ÅM €2Ã×â"9çœFñ Þ4UJÈ-è>^ˆEÂ'¹q/…b£"se¬@KpªaÇ ÚjŒY !;3SûÎõáÁ¤§M¥+-²SÏȬQ—/§Ã#?óóq|œó˜ÃxO~#N•#kNûÇ¿|þñ㘃ùǧ{=¿ã?þþ¡õãó,/õPM 'U¹;¶CTÖ²ašTåQÌj¸$9ÏP ꆹoà6o;™Êq°zÇli2SJB„˜#*61KØæý±2$COw˜kuè<”ˆWT-×ÄTeŸpqghC $…öÎÜ@$<Â4"31KÎN"»w5Í Û®ØLÚ±€åîׂJ“"Ù 03Àëžä^¾ÒW.¸Uàð Srre–[+¤:U‰·É—wú66pçTP»žXHYE@4 ÑNÛt[¾ÃG6´ÕÖ¹§ÿ å, ðX”»ü«Î²£.¶"øa°zÙNΨŠb*$óf‘.!*UÎâL¾Fª° ==ŽsÀ\¶›S¾›­vBŒW lE‡ê‘íIyî\Þ;´ fî¶ñ±8¹š=è…Pºc!^Ò¾`x=“ŠÀÔ:xW°—ï<¼Üª—„ŽnÍK ’0}aãöëO3¡ìéÆí:á-µßÞöŽ3aJâ!ª2¦m4 â#£ ùúz®âÇ» K')»ÝÓ¤Éõ¼Ö_}ýõ÷ϦÀ,÷ þ¯N/®”êQlk¼ùÎh|eTnâ„ê•T+—x 5a›³)D5Æè;*ºJã›t¾‚{)—»üÄ=Ò À£ï`ï‚d¾‡ê÷@fĆ㶼9w®HϲcXIM[(À5Ž1Žö"¥ævtSKЉšÙ°1ÔÌÆ6Ôª²ê)ãÈøŽšÓã40é®u}¯øëëù×ßßßσ2KŠ‹áÔ͈Ë=Â1d=Çü×üø÷ý1”+9Kƒ…MÌH¤"ê¹èÊ^uK%M9Ççõx~}¯ëY‘éW'QÝáLª<¦Ž9LÔX†‰p‰Ôà fm)¸P ‘$G‰‰”™K2r[ÅBtF(Ø v;‚Gç*¬:ЍéÞX;Ì‘¹HÚÛÎBbZL”’Ôޯܬsö&Úý€*e 9E¥#¾¨Œ-Ê`a1%Êè’˜MTR&Qê ¥–íE@Ú_ȤéÈ#ë7t2†Í¡83"j-¿žêê eÝ)–µ=¢*` wƒZ››»#6/ WGJD®•"Ëþ×ÿþ?™u­x>#‹E$™7R´7N.¹Ë;¥ ö³ÔÕÕ AÀMúŽ€ïŸ¼½þ hC¾ëÐ)lèÇÇqÌéžîOŒ…°ÇTDmØqÎó4‘€d|@cµOé±"üù¼ž×¢µVÆœ_b/­™”)æq]~­EÞ™c`È™BC,·. ?˜›ÛÇÕ¹ÊÄrËjP°3¹’( Ë™âB ©Žiǰ¡jÊãÐy­ϧC ã`QA±€3š“"~^õ¼ü–f¡óÀeHC{F’Iʬ"NÑŠ$3|W¡8I€()JR. °3œ;O¥"²„ðdS¡•îS)IDì‰ ‚Ñ(gå yê~ ¯Ï‘Ú@qf5ÅÎ]˜3r¹eæÛÞ±_Êá‘bf%“DÕµüºŽÌl,ªÔäêªV»05øˆê]{L¨ì{è\#!ÁH›ê-AkÇ“³¨ápLlZÓs]±®íÛò¸¼ @Lî& "êºüºâr÷ ­Å>Ω¸²„w8FTU¨ ›‚·"Ás‡˜1em^nÖÛC½NGX/3fNªšky›’Ý„Zª1ªwæ{ÿ]-ÿVÚ;`àÜ•®LóN£áÈ£› IDAT¶“Uѯ‡Ø/àìÞ ŽD瘕DÔ°`a3~®ë\s î\*’-àÂWÃÛŠ7hWÞhH›»•òÙŠ  T¬Ë¥J4;К”…÷.}Å^km‚õdrÏã;l™’Ë Äò³^é¶¼}ŽíÑÔŽ¼ÜX›lò‚0É€´9<0j³ 6"Â͵])*ã˜t"W÷x¢9LL©ÝPSñ•Ⱥòß^iä­±"d.z®µ¾¿¿žßߪú8ÏÏÏN9÷@rw5’”DÑé@Xaõ²!!ôæËN먌 a´ð(Ú?H‡ñÚLíýa©Ã/wprAãJáá;ϸv÷ÌU;†(SˆæcÚZëëë+ºWàí2¾ÝþÛu̬B:x|51‡ã`ɦñˆÑPÂg2‡9àS*„†G…êȃŒ0AŽ5VÒ×_ß~]Œƒ2S¾¾×ß?¿*‚†¥µÿè_þøøÿþŸüû¿~ryF0VyIA\^ôó;~>Ë+Š(©µ¼*<†dÈu}_×f%*:ŽI<:eí *5\@*œ”$@¹ÜUTJ_•\Ì¥jjpŒô†Z~!,bZÌU¡R•©ÂÇ'”¸ŒtSH¹8¢}jƒƒ:ùØ·zaoiv³jIÔ¤DY¹A:ý"Ò¸T#jµk´÷æ¢QhÛçÞ>^-Ñ„¦*«!]ªÊB&f¦c =#*N­9ìóc$€×Šàûû`ìqj´<€…~ü8ÿíÇcVº_O÷ȯ‹BxþñQ~ñxúüÏçõŸ?²=ç´Cä$>`£=³t'ƒÑ¶ä,ò2¢fŠõ×pU%Û±³tLýxÈDaž†uDÁRØñ6 rÑZî×u­µð+¨köÇ¢2LÇPÛ:º-Ój>HŠ’l«+TzYT"TYk±P‡inI3CéÄCÞ El )+ƒ–×÷×s¡†™¡ZÅP¶ÂdÅóÛ¿/¬3[ì÷6AéF³2ŠÝª*´DýÛ±ªIyë}vÏÊ;£ÞÄâRÌY ^q$SP£bvžáÌ/Gë h-ÑßùJÚIgÖ~í8`µD1îe´ "Uõtw®ªf×’ŽLY9g⇓-ÁÒ[9F4ÈÐÑó^Îvy©Ä¤›ôz×p;Ë$:IݬÙ£âÛµ%û›ôŠeG,Së€÷¦¸¸,¸H81[‡ÄuïXYî5"𝷦ôŽ­¸×í¢¥,F‘8œ=ÊcU ™!qlÜApû7•]Þn(&&<³Nòû º“Åî˜êm¸GÊe&ÇÔ?>cÊ1?þø<æÄÒ! ›âEDä+œÜê*Jp+3û†m&FkôÊ›² dßPžÇø8Ç¡¦$ÜÔÑ­Ö”ØW¥î“¥OÊÌËÃ# Ô‡ªŸöÇÛ(~Ï”X$ÛvÌ4lüø8=Œ*ÖṟM€@ôæLëÁfÃŽ9Lõ6@ëÀU‘!«ÔÌueaˆh+‰eãããÓ¸ñÛ+¤ÍÐ%X6”ÔŠ†êç1«dǨ%{Ô×÷õó§¬kPe1‰ª™}žÇŸŸ‡qa‘Ð\È",C´ã„bɨ«Öò•ù1Ÿ_ä•¥Z,Ô Ô7µ…™aß2Û $¢"brLƒŠ£ˆMÍŽÁ"é«]`TH0Œ*æcÎóœjɾ}® # XEE_E.øÑÇS  £zÎÂDš8ïà7ÝC—LÊ M@ƒ )wü#Já¢~æajE±Ð£Ž[AiŽkŒ^V˜¸’B2:4+Q2÷’Xö ¡¸Œˆ²¼Ó[ˆDIY¦j'm*C¹ƒ½ PÚdLDÙI¥;¸½•X´s…d%W"ù`Ÿ:̪µõT}.Õ g £Û%M˹Q–¿´èÍìßf"…u+U˜+¨ *JcDÿ4ÄD7‘0©þ×ïï“òÇçùùqšŠ¡Á¹âJ6ð˜ý NB³ì4F6Stã·[Ú”ª¿fSì*BWý ^O\û(4ö[5§Ø¿³“•eÇÇD ܰº5“XpVR`u/=ç‡ÂU‰¤_16aÆ~v©iºCš· J oÍ8}?××óBÞ³7ÿ*Pa£Ìý¾®Ë=ƒ2êZ±Ü=cÇlR/ùluꄱî°p"üȬ§Æ Ÿ'“—RGª2›’ââ÷h˜öð Vû”³È;í¹î‚¹õ‚ÄhÖ²¢ºõôX¸b[•X¾Qæ›U”B CÁ²Ç}"àÓzH¤°CCåÙUÌb&î±®0m²‘™@ßmCÑ”‘j9àF: 3ÇvlæÓ»&xÇCÚÞŽÖ¶8çž\µðåæçó¿¹'`̓¬‡*aEªœrU!²á÷õ"ƑȮö·Õ¤Ñ÷Äõ‚â¢HE@i13‚-닇Ë43¾f ;æì€Ñåz#ª÷‡@úD½™%°[™Ö utÇt› ©ª¢J#•Cy~œÂÌsà ÎwORÕŒ;ºXŠh /)SF¤f›.¨(‘LÁÉ©ÂÆ¦F›f8ç8ÏsÎ1d…°°\¢Jˆ[ß(È»Q‰2!39°™oÙÝ¡=ÁQaÎ _žÁĊȰAôðÀ<‚pMà°Æ}!4Ãtó]évQZj@ñ#I[8ÌÆè ßKo®âd½=øbÐÅ ±ù¢buSUŸÃâó#óìï¯{NÁ9Åí”G&cñ¡:Ξ wö”ï¹<”uFœßœÁMÿÓm3zím°HÇB žx3>¦ yŠˆÀYï|åî,U*ûITQ$Bü«ûÙÊjGoU†¿"\n¥Rõ³¥˜-WìôJ*rØá3£ ¨Üçê»Ew»º“”Š1à¥Ê.]w®åÎæË¤ˆù)¨®H+u§®QÓ†Š9UJ ü*.¢T!RDTŘLñ&Ý~ÄàÀ9—BrŒaÑ6ÂZ=©á˜XRP!1Cb‘;É){,¶g¯rʪ²óѼ² o)ó~‘Îb¼­ U»ì);¦¤Yå–k­u­*ÃæÜUsvXæà¬ñ ÊW›¸óˆ01.dèàí|]×÷×wdõT+kOrîÏáÌŽãh{VºWf³H$b¢¹×oQÊÐ3ãzf;Í—£Ê¦ì u€¾TÌʈ2’ªÆ0Õ±ÖºÊ+odCš1…Ü>@S*uè /VÍ¥µa\¥XO&í ÍP {uÔÁ™z°¸‚Á©m›ò¹Q7dÐt)³ ‹dµ®1£ŠÌ(|.ÿ¾®ËWfå ¥)·ž¹Ü¯µ¼ù?»ôÞü+1&_‘•¤;¥-nI×ÄÊ’T”YëéIÅÇ œZ·•Œ•ˆr-µ„ØRnδ=ËF»±–Cºp^óm厭¸…"MBÌ#™ ®‘î6½"ð¼´[‚n»úš÷TÊDUQ™B©*¦2–yæ™ï ¾•Ž•î!C¸°úÃTUy ›/2•–9±MîÓ@®âÕÚz– ²$¦Ü}Kÿ œXËw>˜‹*ºÙ‘Õxh0 Lœ•‘éZæ[8Û èî;Zpû{Œ’. ¹¥\=LåaXrÁP&•@–ÆÛ~†¢Jšâô67¥Ûd»Óîè ÈFoU¥˜Bo¹T5è•2)R2Ç €ÏªL¦R”kå‡ü¯NÔֹ‰dÑu­ëòLü¢É—»³š'XëÈ?eøòoÙs—n-¿i’¾E]ïëÍ$*ÃÆ6l/±TÙñã;Šù¶í‘½µ…Ià¶!L;àOš[L»]̨䣵×Ûú¶;4Ž|¥¡I#Å߈®¯„zëJZàÚèä—y¹Ëgˆçú3DК¤ I1¿í¿ZÀ(¯ozg)f{eFHBÖ†¹5–ïëøæ½@K_¦=­Ø÷À^óâ‡i#·ð†«µð·»š7‹ÉÜh±ú­æuÒ÷¥Û$Ìb p͘w»ÓÑ-aÜƺpßâ<.©POIbô¶oÕXãjûƒSõ†e ­ÊÜ–­ÏA*cì4  #ýEÞ¬èHÊÈû7¾dß4µÄ”ÅR,ÉRÕÀH.¤'dA…]úvÆvbmuÄD ?›(´þˆhñM…Ø1ÓÂI0a 3+DÌöÂáVø¯zhï¹*Ü×Z×Zkyí 1›Ê1&¹X6ŠÐí}•0EÅmôl1bæÅÄg‹×£ˆ©J#ÿBBDRo¼(U2e%7Å/~Çk;«ÑÐ^ŒŽ©,šÉ~ùV_‘>Îj¨ý›åÜ@Už¦Ótie•øw¬ýX„ç°ÏÏãóqÓŽÃ>NlĺõœCó4Œ>Í*ŒðÌ…tÛ¡ª*þ÷ßWF°ˆg}?Ý3áb“¡4§žsÇC0'çjÄåéÒï%¤n€‹ ZIL&#ÙÄt˜Q•ÇÂûœ<ªÊfØx˜)Guš;5h/ [fê`PMqO´ë·¹(„°èËT˜XÊÆ„~AÑ€tŒqoíp|c ùÿöªgD{-j*ºÌUd(#ãrOË" ƒ(†™ (ÁéÁN¢Ü!̾‰ëµ+ü– ïT"ç  :àâô[5¼÷jÒiáÁJC„©iU“Ça˜LÓøz"=æ1qŠñ˜6†AuSÌÖò¯¯/¥ø˜&ʯŒ¢aú8ÆcÚP&¢yŽùôñ¼òº †©ŒÛ˜Ûj@hÈ3¡Ú‚ ¸5Æ0êmãŽnÆMvýµ_I(ƒà£:¸;>U4Öz“vSWçK;Tš.²‘u©›Ã|³`2÷»L€Âª"ê´ ‰!‚ö¨§rÕ€½åËÝ˳–Çs­ÎDåŽàÁ*âȸ—••Ï"Eo艢;*p¸`u«µ<+)[åáîžYÊÂ×ÕØi!XÇrψ"•½ãu¹»CžÛœr÷Ò*šQr¯KZJN=âb!*f¸x÷›¯î‡ °ãJ áz¶“OäNèò49™ø8ÆçãqžÇœƒ™n†|¤³¦f…¦e•ŠèR≫ª&=ûm «¦h²]"+‹¬AíBo—WT€Ó´UO-‡A6jy.ÏÛE ]5šŸêlß½oñƒ*^ÖxMh"!íÚ)k´M]wÁklÊ öÐIÿ;|ËÂ…ªÖJ–=ËÎÚ©{¸ù hÿty§ ß©7öå[Cžw‘z£·¾1$ÝžÛ*ÎT%CÔQcÚUXw[™–UÄI_ÊFq™r„³aó`9ÃÌÛ.zóÒƒó¦›òÃ:ö¶õËwkÄô6žÏ›üX·9ò~4j{ëo?Á.ë{ëÃEÐ~ÜáûËýÊ£3÷*[_♢÷D $¼t8Ô#ìzË ¬·ï^¼Ò¤í EŽî=Ú7ûG«_£Ü꽞æŽ4ª}ÃçKl³ãôöFbósøÎ8Ý}@RÀ*mecßœ[=WY\TòžŠ„qØö5Ý;–λ7<ÿÜÓÖK[÷v·&êƒÎß‚ºýÈTçiÓVGâv¿;‹UœÄËV-nQ\n\ƒli)-ä¤R™‰²¹Uá 5ã;$Š ·(NzÒm‰ÙîýJ!{†öj´D¥*ÝWV"Ôˆ{ÕPm­E9Û™pMy{~¹e¬°…ÐöN¯ŒÞÆ5¶(}ʈ=7“ÞîÒŠw2Nu‘ X9†»G!ÐGÓ§Õë3‘1¸¨._ÐÖÞ‰šUJ„Èk"UžÓ¨ØWËÍø8ÆyLZ€"%ÕµWI#U¢6€\€ * ¯ºß×CU9U™)’£Ê¦“U…Å=¾³*Öú HߘØ|†é`o]! qwâšcÇ8{|È¥Rÿ½<‰…Æ@ï˜È€¯Ï½3bXeŒùñ÷)ªtd VÀU†ìÌïï§;æýTÄ!*JEpÍOùñ˜|žç1Ç0Ñc`+€b÷W&LA\cê${MO¡få!E$Äļݩ0&·®´Ó{ÑxFqÓçHг{1ê.â×:Q¥±<2öˆKúäh¿%ën† @ßvRE)fÝPôÔ|W+Å?` a5µÎu/!°vGWÝDõÒþR°\Ö«{¦8©’È `Î"’õ}”ú:{Pƒ*³’¾àY¼ÕßFy¸ÓªrÎËbeáš&ǘÇ9Ç4™†å³1³Þ‚(ª˜cZ‰6<«æ 5.J{ ?Wæ}ÅåB2…ŒB3Ï>¦ñT7É©R5”‡²‚‚‘zûO$2¨CÊér¿®‹¨DjŸ›™,_/¼*ݘŸû=×f$¨ý‰K•¶È™iKy_¦BuϨng—ÜÚí~KVV¤WðmÕæÍý¼eÁˆëÁ2~…»ofbäZ FäL[óòå0#Ÿe[k—’rÇöû¸ý­†‡åcãˆÊd¦¬|>=²à?GHqUˆè45•ÊX+T…uH{zy~רܹÂÝ+ñø´jVÌT†‰aŸDP“‹€×™")B™… «Ìº®k¹3“˜©šN3®ÊÎéÍÂê5ý0Çìx>âºmÓá^DÇç1§Y Ýñ+P:¤óÅá£pÇX;w_Œ²DÔZQa,à[2Ö=¾™# „Wnb#bÏ$‰.7½ í !=£ÖZØêTL ÜPJrâTf¼„9üºžñªª_R“æÄ©ê^¯õ´×=«n†"í?°+À^ÐŽ^£°ùéT“µ_yÔo…ãÖç´¸þé]bê—» ’¢—m€:K¾-ÅM!íuUVQ5ÈV¨"ÞtÔ;š3È1dH™*¯ç"†7†™ ‘[L¿k™ÍBêoÝÎf¼¿†µýðÂã/±ý7äN‰ÚGÀ®ë=ßÙÅ7÷ì\™_Js¾Q™¯Rûž¹óÛ_·¤Š~õBý¢bª_ªó÷Nà®þûçï ·›LûzÞò·ú·Ïö{Æ\/$J†}ãí›}7Ô+ätG£Æíw½ÇèJò¦hí\Ètø·ßÄÿí¯·‹üÛ¯­ãØ)û¿/\+¶o‚Ç>–ù&H±±X/‰äœJmªáZ›ÙéÞ!F™[ Ÿ‘‘ƒîTQ­cS~'èdd(—4v¾’wü¢xFÅÕÿÞ–5º_©XC u\ 1ƒæÝ¦Þ­*âFBPÂGbÙ2£W  ã°°èŽ#‡û„úc QÆ¥Z¿U z.y»îÌ×ÖœÁNØ(."1•bÍJÞiM0m ƒ’²M9ÁÅK3“ETÇè@%Ž¢lf“²Œ Ðçu]ÏçYYŠ(ñûÝŒFFÌ'CKg¨ *)™¼[T¤¢R ³}דš—¥(»Ü¨Ô#˜ù˜ããóññóo¿zÿT¦Êµ®‚=ÄÕ|ŵVV²Š r%3V”ˆ’•d•™¨ x¼›k6Žy´>^èqÍ„š IDATΟóœí5ÚÆö–×"f) F¥W°·q3馜ŠJ2Uö(¸ S|¥¢B¼ÃB”\ qÂF­;\»‰Þ<¶¹×¢EÑ2Œ!H\ç=®«VX!LJ”̘ª /%B§ñÞÝué/,cbFDT©¢"Ôœ¨î¤aõàØCŠÔs&"‚5TðšƒÊ+*=Cú0 _Pí;Š™ŒiÒ athÄl¼MŸ,VUÙÐ|°"ª6tbc|<æ<‡N… Ÿ(‚‹D8™JX¥1Œ˜#ƒ(TXÈdê©è5Æs­¥•ÁCs('¥WŠpŽ Jã*$1ka $›á+ @++K‰DQ]kU•ZÑ=üÞœ±^× ïÍ®‰ß^fÌ pf–Rë¼-V0#AjX-™SŒ~ì8‡ƒÈÚ¨þt_$¾1+ýX3¸À µ÷ üy¬ò×rw°Ê¸³]1بª$$ ÷Iº‘‚76aÐ;A…3ZwßÞê*˜°lÉ•vqÝÍ1;U¤*ˆM;XD‰ŠäC%³O[TªŒ_Í!`[tjÐ7Ö+<"x`}#*#÷XŽ®çx^WîJÑ"\”;6 cˆÊ$JvÌ9ÆÀÏŒ"µI†a %¨Q´ŸÒà2„ÞЏ¢¡–s°ð ›PDD–¹{@’„”|‹Ìˆ\Œü5¿dûTDºµ¨J€ý#Ê—Wæ›e“ïi70tî ãJü €$"~2?6 –Xëù¼Ι»ÀøMfÓu”°Íaý» uK©÷ “ùFÛ0ë^Bìà‡Ì»Î{¯M™é¬ù^¤Þ²u3»ì˜I6xmþïšx¯]^CÖˆp— }Üã&N z Óaa m¹Üø/¾;¡w#>‚Ð=›ÛÚ-İrpNŽ9 ¹¬ð[­÷‹ÆðŸæèõËVà5[ÏÁ °Áxïè61ro©_¯} È­Ü{¾z+RoÏÀïŸéN ÿ§šþ·ò÷½Òýí‹üÖ!üöõw~ ½/î¿ý¥3Ùérý*Îíyx¯ñ_ÞoÒ–ÑðGwFµt‡úûöR8Ñ[bCƒvïÆâŸ®Õo×ç·f?îž)¾¾ÍÛÕËXh·ØÄ[(×ÕQ™mE%e©#œ I¢­üR?ñ¨ëºˆrLUl†3wVd•ô¤´Er",)¹+ºgFÄœ’­IlQª(¼gäw€Füëûù–rW¿vG•÷H„‰lšG⌆¹¤É»Œ$¨ÉITjb €"ÈlÀ®{kLÅi¯ûQ/'(¸ÈÚã~îrÕŽbØbDŒHšÔT0³’AvÂeJCé{Èù&&Œ¸#É=‘b&Êfò8NÙ¿85¯•”¬Ê¦(aOud´_ƒžAjc¨ðóò¿¿¾®õ%µ©N;ŒEXL†³q0SF`°{yçB@ÀÀ4ÝÊ„V2³Ììó1ÏÁþQîUî~=¿®ç•ÌâYÌ¥¦“ùòk…gåÃL™“…ÍìLV[¢¤-¥î¬¨u*àt©°ÜKçæIs÷v0‰Q§˜²–²ƒˆ³á${}ݰ°Âõ­ÝåýÒHˆÃ1𠯞/¼É·•¤ö¸-ÐÎ`«>”it¬½WÓ²‚Ȭ&¤*ÆÐõ8öLH !§Ìkñ) <˜9”BLìÀ掘Ší­õÏŸë¶) ÏËR+1NËÇ^¥ vP›ª·q.«û¶µ8¤HWë=XãörC3Fa*…–Ó"¥¸*ªÚ¶™ªk›¸î¶»ÚÇek]Ká"‘gR©ƒ—9vIÛ‚àE©õ†ˆ5Uæ@µ”qˆ¼Ò‘9ˆn˜cO4Oïo)̤¦½7H[NI÷;uo2ztÏ¥MJ"ÃÙÑÔÆÂ`¹lôà:…­ÇÉÌÈs îIÅ O‘“:ç·à­kœä†v:³1†qí¦êˆ™…P F’RáÈxF6÷^<‹MQ5¨°Žî,)oh­¨«gÌ\Î=±gÄ‘J8W¹#DÀ "jÖÁÕò#˜Q{„,§$Š&%4ÀñÝœÌÁœ!FX+¾¿ ‚ÿù÷åï­[j‘Ü´÷ {kÚ5/§* à(Ü•/ ìLô¶D˜`Ïý7„Q{”|9¤†*$_ä×fô÷çf¹TB³‚MÈm¬-SJ4Ÿy–v¼}:6Fb±3Gïsg¸÷)E±±%¬›†]'8Ó˜J‘)[¼o&>gð·HõuSëªÚ{’Ú:‡–C›5l’`³=êü”†§T3äCgl`£*^ƒ8䈒³ËHˆƒ¤–&•°Jà#…H jj&*,­WŠ”"Q‘‡R̬koï9ïñ HcuDÈ#›!?íÌŽ ŒŒ†-¿D ÷ ÿÄGÎ$`B)ìÎÂôÁÔ´sÆ€W€3 Ÿ,¦»+h›Js0ê@ ÎjRÎò; ‰Í*9†”[glº ¡ƒ“›vÏ ôi2Á‰ÇÁgJÚhLï zïä‚Ûêñ8#BFŒçóé´„Uwº¯bxAÁKò®ÚÜ©P WÅ‘E ¨¾˜ñ…`ÄâŽÃÁpfaB, ½GdoÛ¶ÞºÎð(- á2˜YÛ´u÷ÁoŽO’º‰¥Š!JR"9qƹ§àÒ2üÍM‰˜ƒO:jBä±ï ÆÎídïû©>ñóúÀÐ/˜ Ç/ΡˆöŒGG8\uô³¡“Ô¬’4<º¹92§ìz½HÄD2EáàÖT/—ÕÜ H»~|\>~^ZïHPk-µaÎi#r…–2œ3ñ9Ìõcí½Yïn~¿°yäɦæÖ;õÐr¸0g|…8#9 GSç>3ý(!†‡@My p¨wwSUbá0JŽä3Ê@'ÂZk] :´Þ›ÚÚZk}3-ä¡>º|Âç‡~|^~~4C¡R`³nM+C©¼œO§·…˜#C,²¿k),E»éÖ?>/åëûI°´Þ†–+Ì1‡ÎÀLè’¼„…m`ŸZS3 $‚7‚CXI½1M67³¶{9<3±-§j=“Q-§@昼êáâ…Ú]+O‡ø"Êi BÒ°…„„tÙy›NÊøŽdZz¢ÍãÞ wùz–΋ðwC¨xl0 GoV|‡ˆL_ Z¬oãö¹•ÑÄ5¥Ýz Æ3'Ãw2  •ÊÌà„·”otˆõÑÄD„ÞFg¸}0»b¢`¦±–E÷éjÈ®œFº]œÄFÌèÞ­O–e‘­wÇ1ûgâ©‘G C¯vu0$pôÌL‹‰’ÕZ"1ð&€„½Ÿ?/mk½wë¡ËòB÷·åíí à­mD$,àж¦î§ór:USj˜8]ÛÖ/ëvÙÖÞ{oºmÍ"nî‘2ц‘#÷}ìT4ÉŽ6Næ¬çÆiðÖ=9í˜)É(¹r8uû¹¹ˆkfWÐêã /¾ò8ÞOX÷ä\¼oËú›×œ…éQjq¬ôóç§…ôád:3ã"jõØ (oÈQT5ìóx8ô¶„,y gwaÝUªÈÈñÎÀæÜ_áAQ28°7B{±øhâþXI²÷ÓR½?¾÷ŠOùÇ_wx¬ÂÒä¾Ù»©Ÿ æŸÛï¿ëû¿~¢ß·j/Ú·=äÑõq_š?ì?o>à͉4#1`äÞKž^|êiƒ¹û1¼q}Ì8Ï{ÑЃåŸûð»ÀKC)CG„7j¦´|ųØÓ¨6……q9DÂ81 F " A¥°0ÅÌiÝÚ²ÐçeÝÖn]³rqr ¡v€-ß^Rj5;Ð`eÔ³ç+ÀTÛN4:¢ ÔFSgáÁ¹òP)˜·îîjœ“1ר »¡!;|RÓ‚Ð 7ÇÄ ›'LO¬câÙ™á)iú!Ãð ÀP5v5@M-º·nÊâ¹Á5&:-ÈLëÖ´÷¦TB½ŠaÊ«{PáˆÁ‘0v‘q[žÜ³ UášIF6¸qà[ˆÌ|ÛÚå²vµPy²ØSU´[«pžíèèÝ:1f9*öýäèF5žâž½]±!1s.Š“(ÆC‰€9ãci v«ÏAlʱò·Z*"âèU‹ÀOíi¬ænÖZ(+‚fhf=7`îêèAä4$¦Ádôå1Ù¥‰éc4ÒFˆçe)ÄÆL§¥–Z#˜ÆÁb”ႈÈÁà"þóçÇÏŸŸëjî$µrÀN"v´›)1£ªQXÚ)äÆ}ZXdBÃÏ1L0&Æ6êPÌkα›YSê‹H!v ucGêÝ՘ϰHáÂ(Ï‚¯' DØU/—~ÙŒk9ÞHjk}ûT<½Õ¯_ÞNo§·swÓX'zx+2Hù0ø~¹ô¥J­2üÍ‘3¹¶f“­æ„ZEjaG§ÖÝŒ›÷İ绥bÄÌ=Ühª­µ„7h¨æ­Ç­ÕÔZ×àÇ  âp'*j¦¦C6'ýY›©Z×ì5Cˆß»ÎàñàG¸¦Z±ÎŒïÑÖBB'!`Y`Ž:†©†8}¸î¶Ó_avøyÂxjwŽâ¸SgÄÇP6ã˜CF¤~g ÝÝæ68¯„ K¦æ™k·—Å1–RX ñ˜î+dƒDÙiÄêqèV8$€qådš1•åTÏoK(ßÜ c,ãÐZ¿|¬më.,Rk-çóR‹l½ýøùcÛ…«”ÊD(…ˆÎmY·ÍÜ‚à}`)¥$‡ s?Úîýy?Pu‘ùk"!•&f^#), ÂXºÄÅO“<|¼ýpB†‰½"(,î`ÕÍk© ™„2Â%:Æ;×,zÅL¢Ø!$vUìN¦d@Çøˆæãèc’/ RÀW©'ûLùáPó~˜z] T Á)~E8T~ˆ:–QзÖ"g¸ömŸoú-¶2ŠÎS§ÁÁ™‹("¡-f¿c‡ÍDË"Ka!àýPŽ~è¶ÂÛÿy.7pÊœîË»‡ ùõô°fãCºÎ³iýµdë)Ãç¾æ~¦þèy½éô^èdn:Ãc·öl¸þz3ðl_ñð ¼ieÖô'ý7}Ú/Ìþh^zø¬m»Ã¾Þn9fû‰x¸×ÍŽî¸dpBrŽ ¾tÌ5ŒT˜¼©¸º9б[ÕTÅZFŽ1ó©2Ó²,2Þ!]{ÌüÇ+6×à@†„Èkëÿþ¯ïÿþ¯ïÛfæÐL»wD#‰f7ˆ‹(ç$éœOÜͼ‡w9Ià‰ìËÝ?¸ƒw ÊuÌÊ‘F…{ÒÐü]s”þ˜<ó´¸9Ö^~´ÜŽù_üï`¨lÆ$9uB¥}h¹)(§Ôçh3«LDäP.¶ÖMƒ•bzsÍÛRùTK-ÁËM,Ó8àˆ»ôç(Ü>¢Æaô}ÔóKÞ{ÁÌý„n³ÒU®;o+žªz8èYýzȵãYï ú‡¿ú¦È>®\î‹ò£ç¾v¿ïoš‡óûÕÿ=°è™¯àØù>Tèí­ÖZ*gÌ_Щ‰3»@ UÍ@ç•‹– DËf}HÛ£'ÔÞØÍ±÷¾®›ö bÁÖuòŒ3b$‘бpsý‚Â\paè&3±Ši櫎ÔI•wëíÊ‹}ä6ᤡL>ãw ÂÜÍr¼‰Qñé}@)h™æ3‡Ãyž"°1“HWÃ@4æXÉ-‹`fa¡"R¨bBS77æð‡”–ZJ•Е$^–8Rca‡‰YÏÍ2:sD°!ƒPAkÁÂŽÞGá ¨ˆH…éí\ãéqZ–¥PÆ™àËÛi@q&Ò|¨°PqÎá~܉†Ù²Ê[˜Ðq!þHd÷B€=iŽÖÈÁ#XÃÆ‚xTFG¥Ó–Ÿt‰žƒÈ:xõùú! îpÂ'cº™iÛºvJ _·âY¼},è|)Ëòm3¿4ûþóòãÇgÛ" W4Œô=<Óž…w>œÁ“ª‘{äx"·ð™!¤4>ç'óþŸ©3>â „O4uèC•Å1–Ì(Èqkœ ¼FŽJ6áQN‘ÈEYÂv%ÌAbCB*EÕL/­m#Û±^ÛÔ»"€0)€ØÝ·­mÛ†àŒ$Lã &Šå¸Y¸1Œ ¸ £«ö Ë¢!¶tG"š£©ªY÷Þ­§œ'\s”™Ê‘"E5Aäø9O€»õ¦# kÞ) 2†¥Hëö¹mrgU'S€LäyótèÆƒhP؆Á%Ð×L""Ñt&¸$æÕ€Ôš^Öµ›FhZafWÓxû"‘ŠñkÖËæÚCiÀT$V‰“ö* çjàE"øÝ‚ Zm½;€”¥–eYêÉë°u‚*¸‘0I©­õŸØ­÷·3½¿W$lÝ/]×®FXé|ÂÞkð¼UU‹D1hàC½ãfK†º™šVV—ptt®w Ç̰ây)…‰ ¿¼ŸßÞ4W*"„œ²w7oÝÁº#¡Y¦Ùh³îæÖx/¤—ï¿ýãû_ÞO ª½;Õ Ê¥ufê æ¤NŽDÂ… SöpjÐ.ÛçÏÝVa<¿‰–ܦ|râ‰#z! °†¡î‰õ[hšZoká S@‚¼¢ÛÌÆ)R¸Ó@5ˆ½¡™Ùœ‡») jÚ1ž|"Ç=•9Cu?½˜ab¡ØÍ`Œ@àö¦ë‡qêü˜€‘rš¸3ÅÂ``£âÍPÜsÔ:¨e<ô$P8™"*ň‘…O§¥ ލêæê·‹R˜‰ S hdÜo‘<ˆUˆ‘bcfÝ\“²æL$¥ SJ‚¶¶ ‰á¼‹2íéäˆHË©–R0#V`d’aB•Zw¿rHÆ™‘CåžÁQm†Ã`Üû£p¼ÔÌúm<§›aœFÞNð®Öõ>™{8½"îzP' ߃@áƒ*›S¦frº((;,òã û€õŠUóxð#ò(äx,ÜÇÃdß=)­÷1Cy™MÀ©ãµ®jÖïQ6×ÁIðBóópìzïž9Á9°˜a3 ù͹í³&›¡ïó?Þø’ãB‹\˜YÇ"( 2æZ‚øãèx“9u¤é#Üb§ì* `îN„ëÃgÈË›’ñžóLar£Û™ þ‡²®yXfÅÝu³‚¸QÝçÜ77žû%ÏñÓ=ãÝïIhåïÚC[Å ïijâg(Òû£ýl3pãm¸Ÿýß–½R=z@nƒãàÐl_Q³üŠj“3™ñ18ÂÝpÝ¥Îz¦yL˜:îŽòØ–¤™AD¤Ì½Mý )Ba‘3ÒÀ?¾žÖË×u݈¨üýýãÿ]?Ý•¨d¬6`†¸D}>¤øŽèäc晌31‘c¼‘tšôF¸9z܆wä §L6´:Ö«¸C2˜‡à'‡v‘¿˜!ÜÓDû¼&H«ÖL=(+V4ÅÇ¢ºƈX…­ˆºGJÁÖÔ ˜‰‘Á¡»;1H‘@º+%\bÀLÌÀÌ¥0j7âL0!芓JR+0.¾üÞ݈BF‹àÎèN€s÷xÁZ%ÖëæÞT›ö®ªÝ “)x­Rª¸ëFé O/ ‚™Eà(vÕf­»æscç0"IºY €î–]HÄ^’-hœ Gc„¥†‚´k5£M.ŠÈi)¥Ä̕š¸5ÅHÃÑ03úÉOçãß Q¤°p.ÂK!frs]·Ká@%b'".QxY¥Së*Ì"…„DaSU4.ˆdæf%âŸ,…h{ï˜è÷ÖsÆ™÷846S‚ZÓR¨÷N@Ää€ê¦‘Ó©.µ$#°0#Òð½bf/r+§Ê"Ô»ªš*tõÖT{$á"lHö±õí¿~üû¯v-‚§/ÈÛBuq°fþ±v¿t@¬Ër^¤0B7h]·uÛšZSUäªeñ&1…Z¨ 2 RÕ"Ë©ú§õÞÇLÓÿdÏžZ`¢¨)­cS4±Î„A†P‹ôÕ¡÷‹)#ÉÊ ÎxnL§Ï73_)qÍ£LŸÐ¶¼sÚ¤? \ÜOôDç{\!FTÊ¡Bò°ËwµÞÀJ€á'ŒqÆ•[,w…ë"± öÑÈBÎnBaÎÚ’ÂêÃXÊ!À(B,´ZD$ËRN§¥TŠj¿V2]˜Ã‚¨½žQb"qc½j°&Eq‡6ÇÄ`‡Ó©’ÇÃhþ03»:ÐדQ̈ç³93nðàÈ ßëôö@ºÏà™Y»LaOhøЃr1´L »‡*™ÚG€‡§û‘‰‡}H\Aœ°g¿ÂÆÃHE°(¿R°ñÌ üLö}ñ>Ð$àuñf@ûÐúÐÅ{ í ½Î#¯çQ»òy˜ß;"°ðn&@ F!F!,áµWæ#k§|Î΂ægGÇ$ë:UýøB(õD%7b›ýçc2{ÃCÞÖ ©úQVô,¬÷™ ë~ºÄòÜOîï ëû¶ð¡ÊÿE“ðšWûP—Ÿ½÷ã[yÚû¢›Îä¡ûþÊýðÈnš+ÞƒÍᔆk4ÄRkTÿc£|S6îo‰•K¼ŠÝ)úµ j˜¡R¾ „ÎzËñ€‹µ¿í¢ÄýÎìN`„Tßß«+³lÚç… œ‰™(ŽRX:ho¡l€X‰f–Ƕ8Ô6C4b#ÐÀÁÂd•Ì™˜ºx~ôäóÑ ÜQþ®ı3áÞ5 òjÞ»vÓ¨ q0°#Èxë† ºaß.«0 I‘q“µÐ9/µh”§îîÞÔ ¼/¥0Pï…JaD¬UÜOž{OÛ,1"P!)4¡ƒÆTLb™®ì®{ !:ÒV ¢;tí­#’H)1 Gj C1òJ gd!êÚm]›6Ó,R=Pœ]6bá·s¡²°8´ÏÖ7Y;ñœ¤ÈP w& îòÝ Z¦Æ©6 9JÁ¤ÅÄÜ–‹H©lf"TOž 8TJYj%²È«áRJ)¬Ö×uÛÖvY[×O^Db#ɰ–ÆÚG»š6ôöõíÛÿøÿdÁÏ˧µ."Ä ,Îäài¶äx+¡‡‹ ,",lÌ’²ó(f,QÓnfĬ]ûÖ¤°”Ò»ö®®_|{÷®¦Ú¦E³æÈÖ7Yà"ú bÜzsÓ·¥œNÅM·µ­«­›~l—õ"…¾þñv>Wa4ó—öãûìÛÛ×óÿñO(òýçŸ?>ÂÅF©—¥påÌêOðòöÆoo‚.…€ÈR\7qÃ1Ÿã ¢LÙÎ 1ñR«vë͆4Ñg"¢v Ïsžå£ˆ(«%íBX„#ö4Œ&¬äQ3ÎÒÍÕôKM0†L-öaé¨Á¦Ý¡¾ó+EÀÌíÉ{ú̸u?˜;™Ò<3Ä£W±­«6ë½ ÓûÛû×/gDè#‰1tÓáOîÖœL£7J¶&X,ñB.—´ùˆ˜;º-e9½-R$w#¥`ÜúY¤Hea&¦pÁHùB ì®{ÓÜ}…KŸ+áÈÁ·iãž=Öõ`®·¿´DÚŸî`™çøx׿ûA q›J„3~j†^TÞ‡)ìñT‰zrW£ì^¼]8̧5ÙM9effœ–”}i}¥Beèp®\‘¯…×½ÑÑ›:φô¿Þø‹Áê£1çS—ðÍÜú¾œõôC¡ù½FeâhŽ‚x€g–vð ‚²ç~ÌÕ.r˜}Ýxÿï)^WሠÅg¥ö}üí‹”†Ú}‚Ï„ûg–߇ó웲ð›æDÏÃà­‡Eð³T²×q/˜¡¯õ÷¯ûÛ›ò*uóžŸm^¿Õû&äz“çùu Þýw÷Tܼ!Œà•ׯhæpCk­ÙDæÄ 3kuÏ Œ6DÞ9Ž{ã¼àñcÌ`ô¤S)1²˜ëåçÇççDøcŠÚ\B’c =™ÍÃÌ7š$¤ ÿXÔ“©î!'ƒàèªÓ\•“xð‘œÞIf¬AÆT ‹°tSsΦ]´©ÅºüLsGtSÀžcÆŒu)"BHL&°"ÌàM!L­cøè"",î…‰‡/t'ñïÚ»;™ƒ0I€xÀ@5ÐàŠ@ ©áòX¾; q0¡S$¾©æÓR˜s0ÙÕâ d)é  ÈÓDw¦ØoÄ4!Ôã"!·/oË?ÿã÷/çÓi€¿þüûßÿþûã²vî4¡±Ê!öRPd`Ý!ÈŒ0ñ¡}g‚RED˜À‡ó•ˆG†¥’?L£#î I‚ߌîµÈ·o_ÿøãK÷öãççÏ—?ÿúûûß#‘&€ÞúÖ¶Ô™90R䯏®ºÑ·÷óRäüVЏ5c ÌàÞ{g¤²œëRCÕ=JO lŠ¡óyñ1ñŽ+5”Á{ê:fÀÚš«ÖZ¥”X¸‡3Dc×UÕŒYD*¶mÛÚf®ž@»8'#h É# 6Zj]ÞÎD¨½ƒ…Ì Ü¡mºmvùì???ñËoïïçS­ˆüã²~ÿþ÷u©¼¼-J~Ré£"ÖZ0²0(f›(Œ\„edæ$"W1uèCiæÇ¤D'÷Ü ©®VÅÞºª«Nú:͉×ÈYÈÐV†Z‚Bf¦*RjЫ"Ý& Q&`Î’|÷-ÅÇ›÷žxpG÷’á!>ëË{V}Öæûg>¤å†×€UHÿWäOÛ@®´‘kˆ‡ŒüãÖ“›|U<h?ÇàŠ8~3m¼Æ¥§ƒ"]Dá ÀœÊ×ê‹Ã[ºý‘ßhžÒcžábî5/"¢~9BN@JÎZÇáÕU~øÿC¼1Þ®–ö ¸•Z=²ï À3½ø}õÿ’óŒ#§Gïý^4'Ùǘ³ûdß›aö3÷Â>[¦c£ßcž}5÷Ÿèæ‡_s'¶â…cøEWóÂü vôìœüèÔõcnÓ Û Ð¸¹u öéÞ.˜{8·Ï‰Akm5SD µ´gôÍD²ýì=ô»sð5ÌmÐHCr„;¶4uÜÔ¶~ùù±þçŸ?~~l‡uÒ,¤5u„$ƒdŠ `¦ºº©ðØ06 [NµçíÜÜu< ‚+þ`S3 à¨$æÒØc0Àó/«²¹ŽÛ2,ñŠˆêhFj® E¡Šdd3!Í[63Š'†É2Zr@ç‚ø‰ˆ‚LHnpY7ïÊJž\Þgj`LSCŸ:z;Í'9p|ñ½;¹c)FX¥,UˆØ|xr"õVCÕÐ!D®(“x<ÛÉÉX„Ðõ}¡3ë .‹õeYÞÿõþ~.þ¼4C3ÿùñãû_÷Þª”¯ïçoß¾¼½-1Òv'5è]»%êÔµH°6 ’µ¯\ylÙ9÷ #€‰‰PûF¨ç…þñmq’÷7Y¿½ÿñÇÛŸßß/kÓ®í²¹÷Ö4PáxŒNGÐ}[·ßž :à8ŸZwõŽ„(È…0c¼ƒ¢¸—&µHRp‡py $Sx­æ€’í’¸*D¯„^(”Oàö‘"RÜ}]érA r vëkÛÔ\Õ{SWEÄR%ˆFçs)E¼ëççöyÙ±žJ=û[³öf§OþܺƒmmÐ"|/ÿ8‘-®Ý@k¡Ó?¿üãË„J!BgpF+R†:¡[ÆÛŽØB1à„À£žUMk3Švýùóòsm‘‰0¤ß%)†‰)CfC€GXc#•¢[ÜÉLœÌðÇyS‹¯ÜɯŠé€L·+†½¬ÇI\Áaþ‰ø1W7 .$ñHbr"‰!¨{ïîšÙvÚ{ÛÀ­˜õÞVI ivEíS„ÁG 0JD" Ì0 >æˆ. „RøôVOµ†‡…2Üp¸m(ý^A(ÙQÑ¡@ ñŒˆÊ˜•ŒqCˆÓ€Sj ~˜»ûU­…×î ÂÖ½dJŒ}Èê;Eg׎Óiüï( òæb÷„ 1Ðg†§ÜÓì‰ñq¦£Ã/J„Yb¯üN¥³gYºó±J8¨žv´Ë°FÀ¨‚ä³òt9Ó}Åv_¾ }‹_Hž$7½Ø üôŒ˜þ;bñ‡X÷¬ÎÏçwrÇ~‡¦zÓÆüÒðôߢ½00<ú»= æãnˆR„è÷þߪ–*ƒÑ!Dºld,¹»ªê® J†`ÚX{Óx|L0!áµ /oÐhù0õD~ƒ12 |þÜ~üX?.íÇÇöósëŽhÚãŽ\ij$ôX„ÀØ'›Î®Ýå˜\âÁP3ÍšÚÂKˆFÊñÔ¡H¸qïj¶Ÿ ×—†Cñ @„J•®ª­'zrL<ò¤pbY"+ư3Z»©rWòÁèÓ¢Àé`Š ,}ò>ÂBSY9Ù"qŽ+ºš­½oMµõõó®ÿøöõ¼,RJfV'«GÇ ÓTC)™Â¨”¶:¢rœ«”E{d‚H9–÷·óR%{Ôxîà®v¼‰ªÙ«Ÿë³,ÖÍcí‘ÏÀ˥ñêÈÍß°zß7¬Ç,Ìa•öÃëáëüëv-tÞŸûIž'Àí‹‚CÁG*''û!oî$« IDAT/Ç0œîà æ84øB×yO×µšÀAø¢¾®šš`£ƒ”Wò âA[³?€"‹´r¡æXCÛ駯?Ù¡Ïy?ÞcâÒ#šÊì¼`“Ñ$”Ž“v?äp9úkšûáÌ›ì.8¥¾g™¿.)®ÀöÏä÷ÁF3ÌìFtüpøz¯´¹«éYrð±›èô7ÎW‹ öê=ñ}>Ü ü&ûånÂú@aÿøxlìaP ü¿ó° ø%Òçaø;y¿x¶c¹‰C>b‘&úóõÌû!Ùó¡Wø~¼}Ìc¾yÍùµÞŸc7b¤£y ¶/Æÿ·Çë Àñ—¾¾Fî„møzCõ"àE“ð;&ûG9;® £ôºY»Ý œbÚ‹è*ú@ äÎðr<’®Þ90^‹ñj®1—åÖ3ú×UÿüëçŸýÝ/««¶îëæŸ«nMIÌ ÀJa©‡ æä@sÏ>ÙÖÍ3öÒÀ­»ªQLÌó6ðCLÈsÒx¥€<0 F~% p¦Úàœ&GÔVÌð‡J#Ê„ 6¢| &×±–’LÆ®– GW°€äq?CuW 4> ¡™b³ž¯áZâÊ}3SµôIXôZk­LñE ‘vCP$,"RÑ{ë®ÆL¥Š||ô­5wKÿµõH%ffDG°RùtªÂDˆËRj)ˆØ›:Àù|úãë×ó²0áP2Ûp¦¦•8EQãƒ;3‘"’ƒÏl4"Ì¥Û¼šc¬Çó)ŽÈÀ©mIºЊĘsî.!Ö#NÉs é­ :î"’;©)u7tÂ…8$"6ul£¹9˜˜xöSœ¦ãg ù˜ÇÂ(NÁÃF1A·^Ÿ4ÖÀŽèÛOT¿ ™?f‘8=-§ º¨jÜ¡–;»qÓûÈBÀàªãÂÄQèå63I)3d U3äèø´¦1w÷®³få“S,aÑK‘ôøC¤Å7ÏuÈé~~)4CmYøÛ·÷÷ó)å£vu·Þû¶6B·ø²ÇÕ׌۫8 YL“<‹z/ W%þR_{ó®îkâgNÓAöœo@oÔD¨Š¼÷ùž%‰ø‹òBì~¬;jÊšÂ=ç¼ ï¾©›oí¡^âºhŽí:ýæüþ*¥ê‹,Øg>Λ÷óZçýâD:‚ð÷ÀˆCaÂ0÷–Í®î›2îaí~TÈÜËÍ_ý÷$Êuëõˆ :®˜îÿÊ3ÌøÒNY=æ‚»‚QnÞ–°÷ÀóïÎFåˆEz *}ÑÜÞ{Ûú‹ÄÍiÿLtãÇx˜ öJû;‹‘ÝtbÇ1ǃ«éFQv”ÇO%ØhrXyÜçp"8ñöÚϱ¬øw˜Q5næ¦è½ë_ýøûÇjÎ[÷ÿùýÿþßÿyù¼  £˜“¨yh{ÌŒ¥ 0±0sA’¨ô)8(ÚUz„ Î[©u©ÎÓ¶Iâs’ÔY»àõÕ˜ùùrDQ…X4žá¶²k:#.ÀÀ3¤(d7ÝÔt6šx°‡ #zŽV1$5|»‘¸‚£'þ›D¤‡ÐšYDÅ+–*R©H.˜p9W5b)U¸,›«”¸xOçåë×·s-D‘+Œà¨ÀÂÂÕ?&>–Ǩ“ðLƒ`î¦ æoŸ] z¢…rÀ ѱ[ê¹÷ßר1ºv: 4ì)£¦óøÐ̉(a„sdz«ô#Î(ÛŒˆk"sd¤ SÂÓ1w£óÖ?nýwóà æÍ÷Ëñ(ŒÔ‰ýåðzny3t¹Z­d%îÆûûC˜p®i§Ü·ü‰ZL±Ò°úí>Æëb9Eˆîêz¬Ùö­Œ Û¤ƒùtuæ{˜˜2˜3סÏËÈ-`–R»:\:®=ä|ÄÄH`nD`æj‚¸bkª¬¨NÁD 5{ÄeÁðKûñÔ™ãŒÞ4óÞ{n|"ðnÝV7WS¡8EÅÑr8}Øð|°…Ÿ6¾Z"‡3ŽŽÑtP€(ɳ&" Â*\8eæ:Rf)ïÉ6@Š%1!‰{$¥€ÍÌܰ×Þ7è]M™ê©ˆD ‡úI­=‰šã3=É œËCà³ô~óþ"¿ó>ãóµü㨔ÝõiOTÎ7­Â|pDœómè‹àa98[ ‡õß‹Rà¿e:üMSìCÓÀ}¹v?ǽ©à_82_T“7SäûéûÑ*ú;ë×Gé…áX6í%ããÇûSh~¡¯-ª/À5÷"Ÿ›.îÅ6éæº›ÓºyBNµ< tûÍC÷ zN|ŒÅ}6,¿¯ÔS x?\ì<[•üÒ\ûÐ}q¿ û%ŸêYÆðkƒÄCkÄË"“õR MÇd($ɪ€ݬuí‰LM-ƒY ‡¨TFÙB清©03GƒL.SQE'Ad pS(Eêr*"è¾`” J*äñs:—BÔ[w°åT™åËûikß¡”"¥€»›"$hR„—¥žNµã ÒIõ®ÞAREBJ>;î$Ä1ð€jøÒ”ìI@„œê»az.ÇÑf{™ƒsÜÙãÇ< ÷°ªãpŠçÛ\ äZ`´ƒÉ.vô½Qܵ;˜àÑÜ?ŒüGš˜lðCë÷¿+Ó"¹£ÏÞÔã}à¥|³Ûµˆ6îá6áãd¤À„“;Úx¼{"®ŠÜ!v‡íà>38H™çݯ7„†2¨:éRút  ìçÞPå{dx¸«:QžHÌt>W.%ìç81f`dæÈ@‚¼é¦ÚU3©‰À2âtgXFtp„Bû‘ý›Vts×­µÖÆoTÙ'²UMÔ˜™mÂûÇ”$ò‰EDDJ‰T <¨PÜÁ(ÁõÌ%ÛÒðý›:Qšy˜Bí¨€„ù{å ,“-ÛVUGa.RÄÁÜ=2tÛ::j·Ö1"žp©„,ÌÃ%d˜›Œ`¼Vè¾.ßJGnœŽ¿ÈûfßïÔ Ï*žÚ’ÂègjãÆÓgz•‡€‡ÇgÙ«÷Aªë¤z†•ß3‰Ñô%¿°¼è=^xd_èà_Ÿ67AůϮ›üYÓÿ´Ëý¬÷—/ûl‰q³fyæð{¦ûxÀXy£”F»¹Üã,£÷˜O±‡®Ü#w릉ºo‰Ÿ9Fž9÷Ãþ‡0«‡:º_žo7ª¶_yÿ;ÿ{¨ªzñÃ7íúïLOf…×AÇ­K×Þ¶±ïÄTJ)¥ÄVÛÝTÝÔ.kûþýïÏËúñ±ýõ÷ÇÇÚ·êF,ooï§÷ÿ¯·o[’#DZHÈL©TÛ=¶k6/óÿÖfý0¶f»ÛÝU%e8}HÂy¡š©‡µáN'ƒsARU$‰L'õ}$Y2?΄šþÃàP3<ÔDûÃX>[68"PUT©¦@½p,²¥F·*³•EŠV81 1#’š~å\OuÒd€ÏóüãÇÏÏãž#hªeµØ¦'Ñ3±FYâ q:#Šã ò€Ï\o ဈÄ'1Þ0„„ 10 M*Àýˆï÷p;b:€˜o·x¿¿|}%3=$JÒŸÄn·Ûq×ÎfŒ%m‚Kj‚Y"\½ÞjèŒâþyæDJù-úeˆ!šGhÈ‚¥FÏ’l$DÑìÚ  Bß²-»B‘¢Ê[BN¤3úÒ<À%. ¤15æÕI$³•sÓ“%ñº÷[ÝØlßïç¶J>F¤@L-G¸7ûͺ_#q 3*²W¨´7‰ ÎÎ4y` ‰ÍâÉ8Crˆ†‡ˆºE=i{ µüD¨O(e)xµëdžVL½zVE•ƒ^÷65Cþ¬ìžÑÆfƒ/uHJ~ÿ<#ÙË^JºÎÐvz©÷mXÙCÙjÛŽ š¹yC™N Ãņ“!Öà´a}õ?cò Ç;Âåþº-«ÿÞ¶uçÏäÑËÎyøh74­Y›T~KÎ=3 =ÇŽ¥óL‰1„ÛÃýûãÇî_ý·wxœœBŒÇq‹Gd¥„À™ÒçyŠÆ-ôãÇãóóS–«h9ÅæG˜%rôÿö×o”8%*(n!ôêŒUù[c½BNäÉ\ ›Ìåvd&Cˆ jHÌIßå–œLDôãñøüq>>ˆAhK*$,¶bꔘ™1ˆ7K8¤(>!=ÎÏ3ƒË($øv‹·ãŒÄ•õããí—o_ˆÏ?þøŽ·Dç™Îã1FT—BŠ1ñý†ŒŒp>óã&Y¹Õ?H·€N>srs”¿+îÜU?ŽÅ]*yÖµL”(åsef‰•bh^Ñ© Rv'HjãEØ¢(£â―ÊW/Ü=Î`ÞÆC}` Ž• Ÿ #†ÌG—ÏÉ«ëSÍ-Q{ÙèIøFæ®ÉœC¨lxx˜'‹ÑJÞD/:*;å‚bä[rF5q3v.ÖN%wæÅ|T²À/û‡ .-5 %J¤r‰ùcμÊR-1±fr+KIM7‹=¦M¥LœCPßê®Y™KÚ›Ç(™eXd€ª(.Æ?Ä8HïÉïÀÄtR:SJg"N¬Rè3¥ÏT¯ìù8Ó㤜}&ƒ˜ÛFMI©qmyN4Æ:s~¨¸û«9Ën‰Ò™~$¢„·{,cn;ìÖýK:¥ìL({>±ˆˆ²}XÎòÓ‘ "ÞEeóˆpx¿ßn7ñy s¯ÙïŒ 7&b ì%÷Œ/䌷cIÒN!5½õ¥F£ –ì ¹ di 3à|X'WõYíÞ#ʶ˜°w¼|Ùe€h] —LL<}¶qõ ï㌡ԣ­Î¡Av{^ÁªRÏ›Þoæ)¹CRwj£aM騨û#£¾u¬‡–ã&GÙ2|õɱÀ¿¥ý8ï?# “wËœÁi}‡?e²K['êuèyNï±,Áö焎ҩßf²à¥±Õ,Wa¸š…¦/’mjÖŠ7½„Ãç !Üï÷ã8Äc” @` 1Ý9n÷ÛýñÆñãíÇ#„t‘PiBQ‘>zÇ2çÇçùùùHI%e‰D»B¹ab>þýý%=>ŸŸ)‘‚ÇWÆLªæ³êCÅñs¸$BÔï5sXÂzUU¨žêgÁYC®j À-Þ»¤ÂMIFà„“{è$úLôH'cˆ!¼ÝâÛQÑbJ”‰#`¼Ýno÷x?b â¾ÿ#Üoߎãøí_Ÿüþ¯ï€'À?¾Ÿ”ñ/ooïo·Çùý<ïo·xˆ¨2 ~†œ'€áv‹B:bä¼>(°¸}©Á„o­“6g»'MËb^ªÉ>Ê (ò –º³=„\ ƒ-ï\º­äºF?‡h4±}æ)×&%Ê>ûÔ‚J03U¨XÜ)«[J45@5CR¨-ƒâ²_ç……µÎ4r{#a¨¼ù!…®iáýiÑo –yl µØ¬šQ=€9gULÈî=Äõóg1¨´ã¢ÿÇ,ƒ°cÜBÎᇛ“DªkÞ…!‹Æã“DºËgJbþdÒôJ P²…à1@±ÄáåG*çM QB ¯« ®+ q¤Ñ&SÌî0–X`NÂ;$þ<ÏÛ)™rÌÄŸŸŸŸ?‚ê~)Ñù)m±d\K·Œ—FV;I…È’u ò‰³¯ŠnÓƒRJ|Þ"ñCÛd?H¤½dIµÎáךèÈ a ÂCñvܾ~ýøøx E}žS=¥c%N)OÞ0ɃŠlÝl¨ Xº˜]½ÛˆL³¹ Á|SÁɳuÒ›ù¥¿OóÙ#ý»5Ǻ3D¦{~ˆ/Kè¡á“;k—ÊKãÌÓìÁdǽþ»4 id¨ié1ŽÒ?ÛÁšíÔâû°÷h€•«ÏòêÍ•Nás—ÛYÊÞS`ÿl]5Ìár›É^ù§RñG(Î@B ·Û ŽÛÂApKtÜîŸzª—@€’LR€Ål`„Ä È>±ÄsJÉ l·Šã툥DJ µxÄÛr,W¡èeõ b6.M‚ZYGk¿œÉ×X*$€, 6s/K"F),˜XB[o1„ˆ¢œ•% ÷·ð{¢“ Füåãþë×ãçy>”Òù8ûãñÏß”‡ÏÄ€ü~Ün·&>ÿø×?>>îÈôãÇï‰àãÛ·ãë?~û×ß6€À9d“G8no÷·C}~üñù;¥tRˆúÔ!‡VÖª$áÌKŽ(ÉâÖí“èLDò¡4ãY> ‰¹©ØMr9s§¡¦ºlh{¹_Fˆ"!qD¸÷ûxÜo÷··›£¨Ècĵ«Xp"Î<®r4×H[®ÞWÀ\’Ôû£kÖlþç€a>}V/:Ï‘ÃÉvXø0Šuô;ÅÖŒ\1#ÕH©$‡žcS@÷!Ô7>ö—´ˆ`dëé`Ÿ–à1#í°t†`óg-¿Èá`€ëµTŽI)†š¾e'‹`ƒà‹4†ƒ‘¦v,ÕJIºA[…ÏÌgfßѶgVCÜë³-½§É¶í‡íÆÿ0ÔlywbØËó™8~èæ|¿4ÎXög•ÃçÂeô €%eõ^¨ýXÕÆÃñźšù(n¯éä"ÅûI r"Ε ©É¹jLµbÓú•ª„íõ‹Ó¯øæ²Ï3g¢‚ŠLDn1`ˆ1rŒ!ÞÂ?N$¦[Ä¿üúñþí—ã÷Ç# ÿúåýׯ_Ž[HÌ)¥tžéAÿúíÇÿþ?ÿüýûC@àÛ¿~ýøòþ~?þøýŸÿïÿüöOx{¿¿Ýãþö?þú×·/¿ÿþ¯ýF)½Ýï_?Þ¿}yÿöõíJ'у‘e ˜C²p Æ“² -2à ^½™[ÕÎ?Å®A—? #÷I¿&›±&J}àÛk´fšsê°Ïš…;]ÄLï»$£ÃÈ qX³ ú†QmÕ·¾ ¦ü6ExIÇšñC‹ôe$Ó’ 6Ü®g>H3hÜá5ÍúÉnI"êÍ@í`Ä™«øÊ““ËÏR©Ç­Î’ŒÞK »_J¢øÖqÈñÃu¸g;£€Æ{j‡Ž¿ÄæÞq÷÷Ÿ‘X0CÍ }§pf†³&ge“àV ¼òù±¬P™¤ØR‰Ó¥ÆÚUH”>)}|~?Sµû(X¯:YÆÊòϺ65r¬‡|Uÿå•~|$d<çyÊìZ2ìå„Rf ‹ùJÀlK¢JOÈÒÒ`J@'³Ú…!Ê1 •zM‘ˆ”xË%‡†‰Bà€#ĈïoÇÛý~1DŒ1ÞnGŒ!ýñ{ŒÌÿö×/ùë¯)àçã˜ßã~;0 `88Ý8Ñ_¾¾ÿõÛÇw1ý¦Þî···{€ðý÷ãÿ'¥ôí×oß¾}{{»½½Ýîw⯟Ÿ¿&J1¨™Ïûývƒ@)%:Y)=9 3Ä(`Y–Xª¼Fœƒ…””9Á@!*H{!ã‚…¥ó’‚ª0&ªÒ‹ÜæÊ? Z”š#BàÀ ¿ÛIél&sULi]Š*¹V±‚b6À Æó6H»S´‘Ì– t‘ˆöÎ,Üg ñѶÜá ú.DXæ-úçË•Õ×Ï ]-›}äÂËÌ Žå2_g,&$CÞê1¤(80båýCAƒjªÏ>^R¡Œé;_BÑ4ñ(1©fúŒLiX%¼0ë{…$¤±ˆˆ1ÕqP¹ÝÀßo÷[8µ¹``H) OQ&`—Ó6xªÔ!êt(ˆ›™$jen¿ì”Â6ÒhpF$(± T’B·[Œ!·ãv?¤Oü$¼ßb”ýN[ª›(ÓM—ɯº•Ù”Vl¸\õ<Æ‹ ¨fÄ C‡èJvjKÎqpïWøSòÓ^w»3R÷å >y`i®mNyYJ©¹Kc¥¡ï~‘gíÁ>[}gþÓ¢šÚ«0›Ð0vx ~`íE=,@‡ÊÍ:~ijÙw˜3~HCäè«ÿ§ ²©¥ú8¯} |Ù±sêùô¼e”ÇTQs IDATðæåìÐåd9ºáå%Þ¸¡y‘óágFCÃÇïÈ›m1pžgªy¶lë¿dg8Ò&suGí'g`àáË—û™Òo¿ÿ<02ÄÌbD¼ßûÛ'†ÇILrê“dÙS<[D*ᕎ“ ‰'ŽG<Ž"Æ€êŠÛ…Å„½°>× …y€•ÄD¬ãÅ¥Cý‰!UXÝ gCûKc’›œc¸ßÕ‰A û ðÇÏÒ/ï·÷;Ò—‘2Aú”l.ø~»ã—û;)}Š™’`¥ø~ÿòõ—{ÀðõëׯG ”ÎD‰¾ÞoÇñEtÖRËáÄ¡ˆ‚;Óu J¯ý·æ1$0ŠjPoJv¹ö´Ÿ%¢¨”DÅ›RJž²¡ !Ù2äß!ÌS{ŒLZÑÜ_ÎÉöñÈ8g4•[^B:4"[¯@¸Vº\;ƒñÕ1Ã"¸„’^ó8Z¤ÝR{»ôþdêó¿¨Ñé# L½Ê‹SJ”˜ß~¡BÒO(“F4 ™1{dÉ÷ɽP6o€£$z¤Dà€ˆ!0„«ç«M|±I•ƒJ‡IÁ Û€ bEU¦³˜ùp–²F ™ SÜ7AçDL‰²:—Ë­ˆb€24ÁdñÀ÷Û•êÊ@ÌçyÊ«‰ÕLTà–]ÅdÓj¦ºšhãÈÄ)‘#Ðæ²çl2CbŒáv‹Ç¡½úq!J ‹R‰žÍƒ \ ‚ZAñ‰ à'伕_¯²ÊT^}y Á‚Ý A¥¥v|9f3ôYuÒ? ;F@N@Á³ôÙÙ³é«*"»ÏF€kˆ#]m ¸a:Û팷×4[þ¡k–„–ý>a†ž:•t#*õ•!Ë1ÅΊµaº³ØµÞÑ9›ÚË›hÀ¹™È û«Í[0|¾,ë 6œLFzó“ÌØ53ð{É·nöm¨öii3;àá¨döëfUþLMÔ—9£ƒ&GyhŠ Æ‹É6ÖX6;òqц••+˜RŒáË×÷p÷÷ûo<'HЮœ¿ˆx¿ßn·˜ ¤ L%bLZbe#xb’Tû$ À·¯o"¼EÀûýööv‹Gˆ!1Ä#Dá2Ë/wcNÅm+5XíÿBf)u½P”›d-y8dUlÖ¥–YÅ`9‰‘~á@ ÓƒèL!  ¤( (¦(Q ù“Ki}Ê :bKæ*%/‘¨D@™YAüðãi´G%N’' È6úB €˜$œ:%J§x™åŠY%ê§DòfÒíKê€"Œ¡P ¾#MÚFî—ÉçÎàŒ:^¥ñ â€TkåÜå;©ë'¨ x¢ >™rÆc¥!%Í©LG‚ÊÃKª¡¢¦€œ*À£J×.Œz”ý·…Ÿ›}Ïb&3ý#Ðh{ÑŒ5çvj͆PÇÞá±Ý×÷¾›‡SB ½wúªhè»oáÛ™"¢ÁklÐG}5 –gþ×^¹ÿ³Víó­ge±3åè‰^ ¦Ó›~:ògË]Îg㵆dï3FvHCû×áÂy¥¯ö™I]—͘e¨ï;ëïHw†æ›;‰hùˆádoÏÖöÐhŒnÞÖ÷…š! ~‹\Û^HºA¨äR4ŽñðË×ÛûÇÇ—ç§HñÄv»ü¢0@H'èÔüÀÛÕí#»la"TMðñïÿó—Å GÄCˆE`žu¨â]ÁÈ9‹(ht1„ ï–·rRr›5«Šçpu•ñ!_ÜÜWU9â ë„8WCÐ)C`@L‰5| hp€ÖDBš`æ€9l™ˆé“œÇí80 à› à3†S>vˆàGÉ$»0dƒØ€Æÿ×êòE®8g­gñS´gIñÉÌN絤È#l£I*HoÎ0›ÈxaÃ_ÇŽÙ…IâÙˆ´bª…Ò®¾ò¢Ç­>oBöª>T×§å«ä‹Òs"‡ÿp3µ,üFîìàÖ-Q•-yLQÈúº°­¨f)ŒuT%Ê@ŠF´\Q_ 7J'ÂP:éçŠQF¡/f®y@ÊnLJä§ #"’ŽÂréIô8ÏD)ŒBé 2@’æø*5ǃׅ,MV!hõ¯ÖOåÝ$26Ÿ5ïXg î3„\øgÝ2Q)­2 G¶ @DöDõëœIçȈòìQ%ÄUýžÓÏkö[Öî3A}à,úàkáXf‹ŸréêgÇî¬Þµ¾¾Aû0'ØN½œãÜq _–~5æp3,ηcJãüS¯(uš‡áÁßW¢²Ÿ4R k%Ô°;¬S½ìqø~1´cõMË¿°Kô&ü?«hcÓenîíöb½U|Ó{ô*ÞYYï‹k—Šy‡“³DñaeõcÔ³?èö33Y§qÚþîO'fˆ¾s)š­f8 púŠ> Í6~›ÔFb«]GkŒ¯U²žo GÀ·x?‚ uDBÀÍãö#Б-J´ªŸ_×kÂ(¿¼«Ž˜Ýt^Ê}-ø´`ÈREª$¦lëbÒL+þ¡D!ƒw_y#™[2¦ôG´¿ü’<ÍgÀ,¢äD„@¢ˆùÔ`G¾ODŒAó€„#d/ó(dR=‚…øxÜB”˜\@¤#$ @‹Š¹2³ˆ¾ì½GÄBŒñ¸!'à Œ–O¢}–­ºµI¢J4Ö£fsŒGT8\¶¼¶Ñ$öN |õ°óèf,.­Z9 „7U!)u@îþŠ?¥<ÖV·‚¸ÐÓñ2±\j0úȨ!vÐàìùêÓˆm…1ܰJ™§–Få“ ÙûÐ<íųHé÷PZø¶«8vÁÍL(_ µºÏÏŽÄ]ƒ$,«©`PÝ,%¹1f^_BÎÔ'K¼5¤ƒ‹á(Ö~T…å@¤‰m¡âk¹L²T¡ržçé¤û,ñºCîðC1)*ꤔóêB P›3•!ŠÏhn4muÄDI%OµÅ..S@WgŒ>Ô 7ÅtЇÊÕ‘ ŽšOQr2ìrÎËAhŽ˜säZ!©M˜·V}0Ê!V«ƒ ¹ ¸“¿ë»Êl¦lÎbqVɲZ–Ž}S¾÷’¥åŸïþÑTöv;]´æn6­‚uݹ/›å,¼úß³ ÎMVfKK_Âë—‡×aJåKãnºhˉZ.Q˜È g>¤~ÖOΈ–Oß³†˜ÖÓÂ-–wagc™Åq¼ÌHl¬f×ßÎñú’¬ÿ° ÂïHm„Ü„ýQÐa@uÝ,ù7"LªN$‚@šP¤|!ŽÀbÿ¡ ªTÊ)%æH,|†#0 jÆ“Qeåçf²kåd¦R9õÏÙ5cI wVÛñRïd¤RýU¢ *-õDÉ?ªF l²Ð)„,ÌõÜ&D㎄1DdFÍY-p¬ˆIõÄD'ŸHp†‚è~樣’0›C8Žx‡LU4ÿŒN Q´@H9ôÔàÜ :†À IXlTÀõ3¶ÓgD˜yÞ_~V¤Ø„Jç¡ìŠì%¶eýÖN­p=0ÏxLµÎa¯K|é¸Â»&RÌ*+''DŒQDô`\u›=½1³›V›ßOK…vñAÕA—Ä.Ó ÖX3Kñ*c"€œŽ[ Õ,·.ä(õÅ¢òdI ÑÈeNÅå´4=¾Š1`„ÄRQ)f0ˆGU”¦Š+q!߃tˆ ªf7‹ë(È[ÚÌ’p-ù]ˆGáÛÈÝG„™Ã„55>DÆC’À³@eµŠÎKªdQh·•‡¦et‰h²ìŒø¡´à™tX¼¦B~#®ÔF³Œl}¨X¾þšÒÇÞËÏ6ãÃã¡qˆsª™¡–Ó46Ì;{Lté—7«0f@é¬>îË !è€{Êþ,Øg,ì¤Ùßåxõ5Ÿ9³mÉ‘M¦v*ø™CËÏÿç;º,?ɦ|y¦jðs”Ÿú´ÍðùåIÈŒ#×´Ù›å&ì¥k÷j‡M^“£èØ¡Êì7ÃÔá‘Ïy“ÑX^%g7pÈ<³Nµwh…QŠˆí~|´NÿÅ0jvƒú1Q³Ég®?5òRáp6'—‰‡’0€l¦n”…,ÞÒ™£hŠ©0Šù5IÀ‡w•8/…ÑI)Q¡ÙÌ—s®Nþ{é6HY6:¼P9œˆ’*1„ì‘/‘¥™#ÅÙqÅhDÕMFq5¶³øêI¨™MÊf&€ -ŒÚúei,±¶êQjb܃¦˜a­ÿ¨2<0Œ(ÎEx&މÕúFmÅAø7Š) êîÁÈâ¯ÒŠj°Jœs­þsz¥Ú=ÕÊ Ÿé÷©4ÐÙ{[Öe³éC"e[BÑ,7ÌUæ• U‚„/З‚âbk«ã¬Lx?ÇÑ4m¡?tð÷¸bõÐ+.R„R±×Ó½„3\·<]F|eU—ÈZ”f›þJ–c Ëb¦ ·gUùßg‰‹PüûóãÀ1Ä"Ç|H%$"ÅÏ7(hBu&íð³á?ÃIDÀ‘Q“9”¦¤¡ª‚J£.d0Ì+S‘ûŒ@2P¨ä(™Pþš‹+‚\ÌPHsòØ+çÇ6`©@°[ÊwP× (½ÜCÊ«Aé=l¬¦ÃKY7 î@Ò{pQîàì,/èf† k3Jna?e©¯cšÀaþøÜƒþ©ì}}†Àlh°é[âàŽËi4»¤v“,(IÏŸý$®#Ù¦¸ê%œ†jÇ6LNô=šf†îûë°»Ût”÷Ò¦y¿©˜¥Ç,½Y.hÓGËY›v'ÜmÉbÚ/ý›HoßÂur8¤çÍhl}Ï?kø—ã&»ìİ×ëËD×\;r4pµ`næÀ,Ö2L}n@ÞÖ@‰Âp 0 Ñ*}† Ã\Ê2 ÏIEÊÕÎò9>ÞÞ¾à’ò'ˆRR· fn¬ˆ:!Òêõ#õJ¥Ÿ‰æš½£. Œ©ðÕº3©]²ŽؤœÎ!VZoA 38—ĕśiâÌúg]#Òs°Ðð¢ÅË6%z«+^›éþ€’l, –¤…tž©<„¹e;ç™ÊtCÔTål-Lî•ùF–Æ$X>‚ÄÖ²>Z9JZþÇ‚Äûéí#–œî"Vªî°²T¢¸~• b‚¬œ`N GMÈl|JT…Ì (›hèP¢}BMqÉ¥®éÑ`MO ’c´ÑÑücÈîGÅ®«üÖâÇ]\AC÷²ëj1ŒíëãYÑ{Š÷Ê–žñ,D+“»%„?ëÆû__¾ì@ïÛ~õzƒô?Û¤} Ñâ£Ù,{§@3RØ-ÅR1ûßb_) "t’A4´iÐMÿ9kê†úÝ—íO•ÝÃÍÖÎCv¸"=<ö]Í£†£¡áƒÖS5–WføøÌ|x‡îF›ý¼Ï¹ß,)UÃzÆÈwÞÇï‹f$ŸQ€ŸL·ÙXÎì}ú¤êFÞS2@ºa/÷tAk»bùE[ª ëÛYjÕì9â+”A´¼q†Ç0‡±J°r}ó°>½" ‰3 ˜]òP Py>Ò01AP‘(hRæ8_JRÁ±)¤ð•}/ÃöÂ5a„JknB å>KöYbNyr4.Su´'qò ! HY–'Å©€÷•Up¨ª*0!hc¸òŸ€˜A}Q w„!¤DtP:âc Æõ‰³”–rb—£GD³’´e áˆFÅ@CˆµkLyèµîx´±5ÓR–^Äh5 EÚ ¹©c¥9;¹0‘2Uj+[œ¼‰WËüÌÕ6ô ‡CÙ„ó5;ccÑ=´¡쿃9@¥Ë_dË—zËrwlB`•êÒ_Xû¡ÈÀ¥$%µVª„},Ÿ¥Ô¿%TM¦X9œÅ‹Fí÷³~^êú®& Ýy0YÊ ÂˆãD ¨žW$'8BÉ?ÖeRõíJÁ·É„F¡P|c+0×àÀF7aÎf(;¥ f”Ã8HT‰Ñ‘׆ÑnðMS§³G²íRBålY`*±ò7›/›0gÙÇÄ©N ¾,dw˜~eà ‘×‰:Þ;=Êë€ýŽ©È¬ÜIVjDÉ›Hç°oŸE\ÙóÞ ³*FNˆ½ ¤ñ-°ó‡¬ƒÍ»Ù_R¿f…=½æ&åf5µSDÎV¸Ã܆ò')U~ÙêxÚÎ&0ÃǤ©#V9n¾Àwy—‡×ß¿øý‡/F:N|ïrÒòÔ(Æn_N:5`, FºôÆ%ÅÎíE“¾Ý†öªÃûç«å –t•Ý]±“RŠ–IÍtª38êd»”øÈUõà3óì3÷UÉÆúw •©‚ê_Ž!†Xì¯WS-ε°ƒ,À*ñBlŸY„ŠPOÉúÄB’Vˆ]ôˆ§^6ýØbm(,BV®>‹C :hÆoáæîHPhõbÛî=(‰ó´NµBD@Iæ !<ÎÇIU§HLg:‰)ÅtÄI¤\-S ¥){ª)ªXìC4nCÈÄo8C”oøBº !÷-bñ6…:®µWñv©LìÊug[+×g&3$Ô3µÒ¥JãΙÐ@¶¸†J¹ª—¡XFöàVÛ9Ã,›Wú"yð¶øËDŸ\â«t/©W¨|<ûÄÖgù²m[ÕëO]œ”Ìöò4©j—¥ó,z­P9k5¬çj:/Ô¢B>b!­•P[Vã ·à2ÌeS‚>*Ñ´—ÉW†ð2È¢*£­†WyCSÍ:ôÐ@˜…ËlÜÅ2Œ¡;]†GÊ•F0þý…j©¼¾BD«£Ê,ùã*ÃÊMtÞÖØè×ËDÈl^Í™D…"535ï1ݧ8¯³Šß'*̬»ª·w Î7Œ|È Úü¾Cöl ”góg-Y ƒ…fltlX¡;ˆoóO-ô ù{Y×Ë 'fnÈGò#ö»‘Ÿ÷BÝ̃ëÕ&Îýò5 ›ü~Ÿ ²t­iþgŸÏsQòŽýŽïÐóª6|‡œÞr?W¸ùóìf-c4fcâksWýw?Äè“Æ“4@k±\±Õ?  py¸˜ßHJ”Nª!S2Ô.§žëSÒ²ººk.²‚z†“ë6)7Y¿¡@T´2HNˆÅ› ÏE*€1¸­8n¨é¸X®JjD”B_ †˜x¡@ˆN"0Qáq1HMêU uhafÿ˜ ýÌD±X®2¦ –c@f ¨Ò2¨ô‡ô¨Ø6«y @–£áºÐ@Cÿ©2Çc,M4Í·r°²[|CQé)Ùe|X+P±})ËS:Aâ«5O‘±ŽÎE㉔­‚ÚÒ·C/4’JymJ†ˆŒŽ¹EcÝKõÙ€À¶IØ11„ërdƒ[:ІmÞvFê‹UûˆhV>b»æ‰”ä)ÖÛföí®C1ÓúšµæÍq¤ì(›b(ZêÝbŸ4|„K‹•R"âœÖ¬vb9é–khG–ð„Z$“ qV ?Û0VËà,m¬:€ÜÅfüÂZÄ^º&4®œmÊS4‹ *³ ¯ëÄÞôêDp¥sõEƒi‰¯õ}õIš‡³4kŸ¥ã«÷‡ïMç¿éúç°›œ8¼§Æ}Í4Ë+õëû^U¼Ù<ô]ÊïÞÀ„kböš¥ÊLÖå[ïovM}ʳ°w_üáÒ¾)¬Ì"÷§ ”ÛÛÄõ©2ÐȾ&*€‘¯Wàƒg/³ ¡o2wØS.CC±C…ò5¾ÁrëUŽ;šéMÈ`x¡“ß¾|š7­ÚgÔäWwD=X•5Ñ~vTo®ÙB2ãóRafr>減K²! '@„ƒ ˆ¸RšJʲÙSûgÕE$§>,ÀZ>QäÌZh~Ÿ)X pvª 'ýBH-iY˜ˆÒy2‘Øb <|ÖøS)1¹¯Ú¬di2‚x%Q(›š™•'>GN‡¾w x½˜0Ñîôô€«,,Hf‚“Î ‡ÐBªu„Ñ‘i°T§Ñ7Ô óý`®+‚IÖ†áÃúK!ÀTó«>›#óä«ð´ôاó”Ó¶øpé0ذ_™JõÇÑé«áöûpÑWäyYþ·¦u¨öª6KLY{Å«FTµŒÄ†QH‚J×Ê9 C¢Ü.;1¤·2Qð§Òí¦ Õ*W.¡ôæ×¯ÌÒΖ‘À~:)çæñd¨’ hg¯52 KVv¦¾láY~ªņïPm&Ü ŸV4tqévfïæ€—Ï:·ìL*†5в”YZã/±ÃÙõ·¥äN8nóœÅ`=( i¸nïÃðûÎR‡R¿ësêàgg2~u¾ô¤Feù&ª}>«“ÿ°Y”¿Ì²Ü>-mHÇšÍÄ‚ëxã|¶×PËîè)ó~ǼÛ”6Ág,m‘K™×ËÊǵ§/hžÙ~ µ«ÂÔÅßPOk ®ÁX&hÒFº ÌÅ G°®î„•Í Æ »2#²†sªÚº"˜§¯5äSdJ)â6hÜÓªÔµx‘wò)`ŽÌ”¹.œÓQ‹ñ#i,³õŠ}sŽÝJ¼ußË]+wã¸Ç•ÜÅŠÑeS‰ýïfæhBGk³ÚëoŒ(‡çèL°k+ÜË@Ÿ/Å«áúÝ™KøÂW¸|ò–¥šG;“ê-²úMV?~3² ”ãíãºìLá_M"•mRèìnê@~— A¯Í~!XYƒQ½o^ Bs‚a ¶º­?É%ܺŒ"B®«|\ûO®¼—Kd¹òÊõÇÅ%Ýî#M°Ô ¦62aÀY­ þö ó¤¡Á£ÙßGÀv [ƶﱽˆ]¯ÐÎò`„} À²fU5¶`02äñ‹x¿rrÛ Õ±wè 3no£Ùgx7Àü’ý?¼ï³ †Ó5ÍþY ²Íµí‰ÃÛÚä´Ì ñÆ­é–ê‚æRï˜o.¯ÏÌôiؼͱ'›í¯œu˜4ç|Ô~J¼#‘Ÿ=>~†€?'±wÙ6uÎ…]Zñn sgbƒMÑír4K\6ºÍ@º<¸§¦›/àyí:T$­¿-DíW°fÖ'´H‡­hx  Ês dÛŠŒµ íb±½¼™¯Ú˜¹P˜//Š£ÐÊȾiH‰ oÊô\õ7±gƒ]Õzê÷ÖM1M¡ÛäŸe"=0ä&ÙŽªy‰FÖ™æjI}Ïéj‹_kàbÝ [p[g# >E„i‡&Ù³·zÍXæö8Ãòk¢Þ¹öuïÛ3Ä5‡ô'‹qÍŽÑ%âë ¡Î2ë3žEô{0k–Ä<[`J ïTÿ=å¦ Ï60;+Ð9d×Ï¥>£·ÁÊÂ8 ‰bøO™i,-ù—½¥íúl†i³ßî(Îý[ðT 1$þ5fbv­=ÇÌîÛch€Â€5•ÎŽ!|©Ò;÷Jƒm”Ī0,´V'&¢d'Ûux„ô›¾Æ„]‹{`ØÌp¡ô)W?ÿj,VúÅu«äªsÀá= U±.Çï²/Ñú*Ä ïôm9QŸì¾@±bòàuN.‡ ôá-Þ$¼«ÌÙ+—ªß¦í­aÄýð¦÷ìÁá÷mªá¹ô¿L¢v ÇN5ïdùï0#âÏâ4½Ù‚f¿¨§{•qÜÌ|i©¾]ÆlÃílÔ½ÌÊYß“´`^3•*L\5ndÖPõ±Ü>ŽÞø%ÝÑ âûOå4´Î¡ÐWh½Ó9º”ýžÄ™ÅmŠ=lql#±‡…ÍðX|6SÂéÍÌŽi©‰IDATfÎKüÂÒ 6QBý⟠†îlP6Ùû©…³n/Ÿå<3œj»´€†Ê?eU:Š·*<4¯½Œ®íoqešASË-»ü«­éûÕsÇ0Ê®)€–{DëšoRfš ޳džÇp?Dë/¯7.ÈæÂc2aÓ©Î9ÿ`e²±“QÒÇ$Œw¾XµÌôúQÕT3ǃ­óÊáÑv#˜!‘­¢6¹×Kd¢_óàf—æŒÙÈJ0Z”{´òò³TÈQwõ®Këòœî6›¨s fþßÎÖäŸ÷³õß§BÎ’Éàç¤>•5¯û ¥¦êÝSgS#Kç•Ïh¦Ÿ2̤›,…¡Oå,Q˱4^ðM?MwÝ©ûJ`¸9AËýgVÿ;ù0²¾2Äú-±¿ø3‚Ù°Éé ^ü×¹e>Žî¸~­å—UŽþ”V¾»¢Z³ÛÑo׎Hf©ŸÐ~îLufÕsƒñaÍÛüeŸObë@[’•d§æ+”öÉi€‡k[þp8]ãì}‡ë‚DäÞ9c-ëöeà öïc–¦#~¿Œš)áìëËÙ8ì=|:ìÌ'®‡Ø­J¬_… ð°³/\(@™ Þ>uêû2FDfWi˜c n’èp·‚‡öÌ@¼ ‚}„¦Ë ÚT ­’Œ¹gaä£ÌwŽa˜§áôGæ,ÑY" }ñåì@mMˆ&š4ó…x•>îd¶ƒûº´f=—ôÍh³Ù†­ESÎήpwÑt”†Ô 0wpúáÐcY@;«hˆ9£€Ãg6‰Zʇ•ŠÐîä:ÁU7ä9ø«r3EÈÑK̪„åjW·í{kú ®þ5 à5›ù,kñåPz˜–êäÂÎ,tœ9@ä͆<Í »ïeäÍñ†ÏnN<ú×Û}i'&aÉû w¯vNاäI¾ïþ,»·ßRüxvRÌÚÇêÀ— gÑ3Ïa¿WBTß2ì6½*WòRM݃#¢ïl´Û¬ä! SQl©$‹Sûô=J?‰CÄœ}WxŠÇ,gŽ3È¡0AGŠõ'vÇt€ùgøO=*Ó“õanbUζæYêQúßbž!äü¬8æBŸ+.–çì(N#7ƒ^†hÑW kMÇ·x–̺‹ñF ç¢ÑµÊúüWáÐìcýõÇòPñ[ÐÅVn›«®¦wÆ—°áó”õ¬Â5m¾úfÓ'ªöÉ`ÉÌVJ½Ìv"oy¤—–›ŽhÇ©œ,.ÕÛ!8ÊÂfV9,8ú âЦÌe'ÛkVD:{Ȧ*Àÿ§™í=nCW½þuØ /WË$õ³Zg™ÚëT›ŽŸýTÙá®Ì`ãæyôÜÙ%ÝÜwìƒúÖev[{§©Ù‚w>§óD?EµZN“fc%©²”ý6ÃÝ7];ge¤³úÛȬ"Šä¼að×»ÑôHв˜™°×ÿ+~ÅÁƒkŒPOKi¢Ç‡Àñì9:2=lKKÛs‹/ìÙ1ï— ;¾¿3tm(ºêIÃ9¦ï`-)† €õisœ¦—@øêPÆj«–¡¥÷¾_Á”(oàÐØÜÄÞv¸ìÎá·ŒÙIt¤ûª¬Á/²Î±%ÂÎ¥÷ì³-‡j?˜“š|Šù¾úRˆ¿Cö&µùKî)*ªÿ«›öM–ÈŽRÖ|¹É\S`ÖK,C4aC½àæý…Qmñ­Ûwâ³GËt ØU_3Ã,ý‡wùX=|Ì ‘¡zxì¤7Ër>mõâá5J±™ýjWj,K‘3§ð¥_õ¬E±«®—Tî–ã×õ/*/}áG/N‚QJc†½Tsú¸¬˜ÐŽNw@GÎëŠÁØ0A·òæàΖÄljä,{:tõñŸ!;Åwœl¶å.ÙÙ‘ï Â›îI³‚þbC¬úV’à2!‡%ÂðTržîÞÓß¾öÍ|f,õî,¡Åp„ÏvýgØÏˆ˜Iæzñ¥ƒg%ã/©N1çL¶‡‹öY;  XRówA‡îëð†»ú²ìöáŒáYßßýR'mºTÿV§îK¢gý°M}­¯ (‘8õ¡Ó£§úƒ:†™²Ù®ù GI<†9ã6+¿âÄkj»XìªÏYÜöùÍÆ¬ïwª™Í'vöeíšž%nаÅï—™>¼á?H3”q~’kþžæîß ¿žóA”ñóSÒ›Jª?½ao²«}Èä²›ÔÄdè“ ï§w&ÈûŸvÿ[ûŸ¶‡Ò—_ª/)†]YoôîÀ¢¾ã‡3Î~-à†Í¢o“מA”›iäìïû!FBû7w¸?Ï ?¤séƒÙ£þC&ýþn¾ûޏÓù`~A0«à‚:)¬ä ÃV V.û>ïÙ %˜½fà>¼Q û\ùÍ#Àß.fr2g²Ô¿:Ï×°jìŸ+=‚‰;‚£ê: }‚tn\¹h½õÜþI½Ügf[ÍŽjæ‘ýÊïê÷7±ž²¸ƒ̬„g|žeé?l5-‡[Ï,æàzСMö›[[øýýïvê³MÄÙå‡nÇNYÌ3€aúTÕÕaì£;NÅàÔeYbRšN Æ5LÊY{›+Ç? g»ÀB›çû4†ÍÈ›”Ù2«ÿ-fÛ߬‚ï{ûYÛ9;Þf6#³ %š5¬ ._s¶úè7^X¯áyO!p’·ãâðÂïÝ,õžÝ_àu윸/oË0‘]ξà ÞžU~›7wx»—•™Ÿð8ìLf”Ô¥AçS7îOÌÐ]ê)wöFGfêkÇÉp¹u÷ ä}j“úû'…#|ÚÄí<æ;ô!²¼”u-!áõtGÎhÈ)í+›ØÖâþ ®¤Ä«†¶l—Õ MÙf…ymÄÑ Q„QƸüûßÿþ´ì·†kw‡]=ögÇû;‘ã ¼Kϰ ÿ9Ù܆ù>Ιí_=ÅË‘aÌì–{sÿÔÜ)»}„w+Ë…))aÂËfp¦ÆþŒÒá†=¥òû¢§&'>:è`NCþnS…ûìS§þl„êo@0·ÚÜAÔüsT·¹_sƒùg½Óô–½–òûT_êØíí ¯•hþ쯫œï©Gl|­²t| `ÛKçe¨èÙO.IÒáîÂ3DÍ¥Ëêr+pf¿þ3¾?ßw»Ú™Ò;•Ï2‘jv5–É?0OJ6Š?ÿ°€«®tú K™#;™>ÍÆãC–éŽtÞ6 väšßü:ûzß ÖoW/­Ø#Jÿÿõ8šÙçÌdôÃÕ{̆°ËèD‹´·ªñLJÀML„‰Rg‰U,1W§.™­cJÙ\ñ;V0¾.Ùç‰B7wv å;;–·›~K0dM7©Œ÷ëymÐD[—¼9˜Ø7õgҌּcü×Ó!v܆3»%ÉAû¯Ü'ÆÇDû2hŸÊ s§EÿhÙÌ]ro(U÷÷%šÕeæ°x‰Cžœ¬;àôS¦%–ÄÙFœRf¶9Õ`ø·¦ÉÓîBVóÚ(ix•f²œá»íhØö¡Cµ^¬´ÎÖšÓË×ÛÙšùækààIËÃr¿Å´QŽÍRk­`âW฀>5„ ‡oëÀ]0ªú#­”éKâéì€ôé†Ë¨óY‡`ÍF`Â3Þüj;´ËᬰTùXþ²HΛ^™Áøö«\ah€8ääx– { À²Ø6™3Öæ ³´ƒ ‡Ì³ccl¡¥Qجiéá$×ñÑ÷7ñåྟN,Úø*ôXXø£Ø£9½óï ªÒá©y‚Ó9ï÷N‘±“aRΗùaÏÂͤ녧rÙYÁKéKû Û΄áOéj6;;Mò¾CÆÎyºßËùîsÎ35ŒØ³&;O®ãœ3L;™ÕÓ>3p¸9÷Ö&¿§àÙWž,Ñ0cíýe<£æ7öYç¹äãÍòR6/]{0ò¿ªÐ²+9jw‰œð–þŽGÕÎAû,;¢‰HèßÄgKS“zQ£‚õË»6ÛS]ÐË-Óð±têª!_hüçÀ¢¾Žæ>å0s?e­c+àñô‚8í÷ @y=Š!'Ø¿AˆzrÔìT:öø;©cõ5ròÿyÁ ¡Ž3g”׋Ð8¹šÜþòö#–»¿Ã`ž™’õ»ílбù€7ie›;faî<ï;¢üe«0„N}[[¿B]©–ó 5˜ÁÕ³B_døü¡Ñs‡À¤OÜçbý)LŒŸÈì þÎWx*&V’ͧˆŽO9S;<·‹®xx:XϬ÷Z¹÷~ N­â7;µòŒ·ìņôgo«x:à¬ÓéìýœùÄì?böëá¤Y\ýP" «|ÛYÙ6xܤüg¯ƒ]>Jk§ÚÿüÏÿ|ZF–lÞŒ%8=ãøÎʈ4Ê-cg9þ};åÑ&lÓ‡ÒAgS½“¶ø+Éñx^Ÿ=ºü0 `e_@eøÏÍj »R_ {ók¿ƒÚ¯«†¡ô;µˆoȳ ‡,ç› ²£GWŸ·³˜÷w’e“ï*í@5õ†r1b_GdüTÅ¿ÄÒfœÆM›©á•‡m¿È˜ ›ªþdî󞛆v6£ë­»ŸÚÞŠ3)éeègÿžù> ‘»PÉáÕËÈÚæ×tؤ3èds?¼à +aÆvöÛ€{ùS!~q2|ÃÙƒóTjÍ6¶Ÿ…²¹!Ì@·gm!gˆö°™y¦9ÙVÎÈn–.+ÛæRyé³]kêOúü£×@8M¿ã’¸¥™7l;ˆùí+“—=5ªSÍä°1sêyØIaš9.èŽtõ©¡Ûþ¡¸ãxh‰›w!g›ð¼þ‚Ì6¬Ÿ„ñžj w »¥zÒ/ë7€>Zø5_;¸<¹ýLÓ%dëpfF(Ïædï{<ûÑHO)tw²#üƒy_¶Òû çID1Æã8–¹~?S&n¤øøl`<+ïþÉöogq>5ÉÙyÖþëöÀ§ƒÍ08§ðgàËÒb(G^е6Cžj´^{ÃåÙxüÌÝ\ª(—ìM¢ùæøèµ’oöƒKΘsXû÷ŽçÅÏê£ÆÏÅ?RJåŠûÒ=x&h V>¾ý,rù»fØÐcž$íÀÏ©¸œ AçÛ eû µÏ"(³®ô'Kó—/ã>Ø9þ"¶À:¨sPœ™7¿¶GûÞ2ÏmŽgÎk=Ør_“Eò§1?ùQûIÂÏè«fTÃŒCÔÞÉœ~!öãSþĺmWIoÿ+ @áv» ]§–"ѧl?tyøþfó[àõ&QK…C{ÛY¨OÁ[;}õSCçúЧ¡y+QzÁ1`3øpÿÃ<‡¹wÿëz€å“ó²…<ÉNã›(ˆÿrÌwÍ¢ÞDX_FŸjÒžyÿé/†Ñ ¶á€îWäO}˜MÿMèF4ûÛÅ ‰§€ü?1ݬrüú鿃>óev"Þí¹µãRê”×û– ûÔ©þà?ÝòÏó³ßdlB6LhŽliÇ鮿Sðj®È ¥É承roš‡­?óÍîÂËåÊŸµêž2ìÿ³ÜE—Åñ’JíKo_NÁÞPe_ØùŽ;‡æìš C—ÁÍAÿù çøÛßþöÿñ¿üò œçÙÇ”£O~! çå‚©‡¦ž1 N³)Õ³—~sêýÔåz¯2l4n@“sÑßâ™ÞÅ9{ž=QÆÇ°‚ø×#-¿Nb±9ƒ KÛ·…žÙ€ÂÄFÖU¾‘èÏ?™¯ùºì?óEvü“¿{m%ôÏÎÒu€êeÌäŒíÖ³¥Ÿeú¦CÓïýBç'‰ãþð[ûñf¯åØDú_N{ܹڰ!#nLZ^¸˜¯µú=;Ëj^ý¼ŽgQÛ™8§—Q.ÆOžÑO]·eóßcáK9Ó°úwˆð$Åüg6í<Ú?±/]F ïÿìÐB§©­­.È!ßÏÏï°"Ó.ƒ †µ1ìQå/ÞìçÛ³Ù=ýÿŠå– $xIEND®B`‚opensurgsim-0.7.0/Examples/DroppingBalls/DroppingBalls.cpp000066400000000000000000000311171277777236100237010ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include "SurgSim/Framework/Framework.h" #include "SurgSim/Graphics/Graphics.h" #include "SurgSim/Math/Math.h" #include "SurgSim/Physics/Physics.h" #include "Examples/DroppingBalls/AddRandomSphereBehavior.h" using SurgSim::Blocks::AddRandomSphereBehavior; using SurgSim::Framework::BasicSceneElement; using SurgSim::Framework::Logger; using SurgSim::Framework::SceneElement; using SurgSim::Graphics::OsgMaterial; using SurgSim::Graphics::OsgPlaneRepresentation; using SurgSim::Graphics::OsgProgram; using SurgSim::Graphics::OsgSphereRepresentation; using SurgSim::Graphics::OsgTexture2d; using SurgSim::Graphics::OsgUniform; using SurgSim::Graphics::OsgViewElement; using SurgSim::Graphics::ViewElement; using SurgSim::Math::DoubleSidedPlaneShape; using SurgSim::Math::Quaterniond; using SurgSim::Math::SphereShape; using SurgSim::Math::Vector3d; using SurgSim::Math::Vector4f; using SurgSim::Math::makeRigidTransform; using SurgSim::Physics::FixedRepresentation; using SurgSim::Physics::PhysicsManager; using SurgSim::Physics::Representation; using SurgSim::Physics::RigidRepresentation; /// \file /// Example of how to put together a very simple demo of balls colliding with each other. /// Discrete Collision Detection (dcd) is used to detect collisions between spheres. /// Simple behavior to show that the spheres are moving while we don't have graphics. /// \note A Behavior is a type of Component that causes changes or actions. class PrintoutBehavior : public SurgSim::Framework::Behavior { public: /// Constructor /// \param name The printout behavior name explicit PrintoutBehavior(const std::string& name = "PrintOutBehavior") : Behavior(name) {} ~PrintoutBehavior() {} /// Set representation for printout behavior /// \param representation The representation information void setRepresentation(std::shared_ptr representation) { m_representation = representation; } /// Perform per-period actions, i.e., what to do each "frame". /// \note Behavior::update() is called by ComponentManager::processBehaviors(), which is called by /// BehaviorManager::doUpdate() or Graphics::Manager::doUpdate() or PhysicsManager::doUpdate() depending on the /// output of Behavior::getTargetManagerType(). Those manager's \c doUpdate() functions are called by /// BasicThread() inside a \c while(running) loop. /// Managers (e.g., ComponentManager) are threads and run their own update loops. virtual void update(double dt) { // SURGSIM_LOG_DEBUG is a macro to ensure only messages of a certain threshold are output. SURGSIM_LOG_DEBUG(m_logger) << m_representation->getName() << ": " << m_representation->getPose().translation().transpose(); } protected: /// Allocate the internal structures. /// \return Success? /// \note Initialization is a two-step process. First the ComponentManager calls initialize() on each Component, /// which calls doInitialize() to setup the internal structures. virtual bool doInitialize() { // If the named logger does not exist, the LoggerManager creates a new logger that uses the default output m_logger = Logger::getLogger("printout"); // Set the threshold for display of messages. m_logger->setThreshold(SurgSim::Framework::LOG_LEVEL_DEBUG); return true; } /// Setup foreign references. After this the Component is ready to update(). /// \return Success? /// \note The second step of initialization. This function acquires any foreign references, all of which were /// allocated by the respective foreign objects' doInitialize(). virtual bool doWakeUp() { return true; } private: // A Representation is a type of Component that stores information. // A RigidRepresentation stores 6 degree-of-freedom (DOF) pose, force, torque, inertia, and compliance. std::shared_ptr m_representation; // A Logger can output to file or stream. std::shared_ptr m_logger; }; /// Creates a planar SceneElement with graphics, physics, and collision. std::shared_ptr createPlane(const std::string& name) { std::shared_ptr shape = std::make_shared(); // A FixedRepresentation has no motion or compliance. It does not change. std::shared_ptr physics = std::make_shared("Physics"); physics->setShape(shape); // An OsgPlaneRepresentation is a Component containing the OSG-specific graphics information to display a plane. std::shared_ptr graphics; graphics = std::make_shared("Graphics"); // A OsgMaterial is an OSG implementation of a Material. Materials define visual appearance and contain Uniforms // and a Shader. Uniforms represent values that are relatively constant, e.g., textures or position of a light. std::shared_ptr material = std::make_shared("material"); // An OsgShader is an OSG implementation of a Shader. Shaders are programs that determine how to render a geometry. std::shared_ptr program = std::make_shared(); // Create a Uniform for the RGBA color of the plane. std::shared_ptr> uniform = std::make_shared>("color"); uniform->set(Vector4f(0.0f, 0.6f, 1.0f, 0.0f)); material->addUniform(uniform); // This Shader sets the fragment's color to the value of the "color" uniform. program->setFragmentShaderSource( "uniform vec4 color;\n" "void main(void)\n" "{\n" " gl_FragColor = color;\n" "}"); material->setProgram(program); graphics->setMaterial(material); // RigidCollisionRepresentation will use provided physics representation to do collisions. Collision detection // occurs in SurgSim::Physics::DcdCollision::doUpdate(), which uses the Shape. Then the physics representations // (of the colliding pair) are used to generate constraints that the solver uses to calculate forces that will // un-collide the pair. The entire process of collision detection, constraint generation, and solving is handled in // SurgSim::PhysicsManager::doUpdate(). std::shared_ptr collision; collision = std::make_shared("Collision"); physics->setCollisionRepresentation(collision); // Here the SceneElement for the plane is created, to which the various Components that collectively define the // plane are added. std::shared_ptr element = std::make_shared(name); element->addComponent(physics); element->addComponent(collision); element->addComponent(graphics); element->addComponent(material); // This Behavior will add balls to the Scene at random locations every few seconds. element->addComponent(std::make_shared()); return element; } /// Creates a SceneElement of a rigid sphere with a graphic texture loaded from an image file. std::shared_ptr createEarth(const SurgSim::Framework::ApplicationData& data, const std::string& name) { // A RigidRepresentation is for a non-deformable 6 degree-of-freedom (DOF) object with compliance and inertia. std::shared_ptr physics = std::make_shared("Physics"); // Density determines inertia and compliance, which are used in the collision response. physics->setDensity(5513.0); // Damping generates a force that opposes the velocity. physics->setLinearDamping(0.1); // A SphereShape is a Shape for a sphere. It has functions to find shape properties such as the mass center, // volume, and inertia. The constructor's argument is the radius in meters. std::shared_ptr shape = std::make_shared(0.5); physics->setShape(shape); std::shared_ptr graphics = std::make_shared("Graphics"); graphics->setRadius(shape->getRadius()); std::shared_ptr material = std::make_shared("material"); std::shared_ptr texture = std::make_shared(); // findFile() will look in the folders specified by the ApplicationData. std::string image = data.findFile("Earth.png"); SURGSIM_ASSERT(image != "") << "Could not find image file for sphere texture: " << image; SURGSIM_ASSERT(texture->loadImage(image)) << "Could not load image file for sphere texture: " << image; std::shared_ptr>> uniform = std::make_shared>>("diffuseMap"); uniform->set(texture); material->addUniform(uniform); graphics->setMaterial(material); // By adding the PrintoutBehavior, the BehaviorManager will output this SceneElement's position each update. std::shared_ptr printoutBehavior = std::make_shared(); printoutBehavior->setRepresentation(physics); // Now create the SceneElement based on the physics and graphics. Note there is no collision Component. std::shared_ptr element = std::make_shared(name); element->addComponent(physics); element->addComponent(graphics); element->addComponent(material); element->addComponent(printoutBehavior); return element; } int main(int argc, char* argv[]) { // The config file contains a list of folder locations which will be used to find resources, such as images, shader // code, physics descriptions, etc. const SurgSim::Framework::ApplicationData data("config.txt"); // Here the various Managers are created. Managers contain and update their type of Components. A Manager is a // sub-class of BasicThread, so each Manager runs in its own thread and can have its own target update rate. // The three types of Managers are: // a) Graphics::Manager to display the graphic scene from graphics representations (using graphics-shapes, // materials, shaders, etc.), // b) PhysicsManager to update the physics simulation based on physics representations (using physics-shapes, // fixed/rigid/FEM models, compliance, inertia, collision type, etc.), and // c) BehaviorManager for any actions not handled in the graphics or physics threads. std::shared_ptr graphicsManager = std::make_shared(); std::shared_ptr physicsManager = std::make_shared(); std::shared_ptr behaviorManager = std::make_shared(); // A Runtime is the top-level container for all of the Managers and a single Scene. std::shared_ptr runtime(new SurgSim::Framework::Runtime()); runtime->addManager(physicsManager); runtime->addManager(graphicsManager); runtime->addManager(behaviorManager); // A Scene is a container for all of the SceneElements, which in turn contain their Components. // Since the Scene contains all of the Elements, a Runtime therefore has access to all of the Components. std::shared_ptr scene = runtime->getScene(); std::shared_ptr earth = createEarth(data, "earth"); earth->setPose(makeRigidTransform(Quaterniond::Identity(), Vector3d(0.0, 3.0, 0.0))); scene->addSceneElement(earth); std::shared_ptr plane = createPlane("plane"); plane->setPose(makeRigidTransform(Quaterniond::Identity(), Vector3d(0.0, 0.0, 0.0))); scene->addSceneElement(plane); std::shared_ptr view = std::make_shared("view"); view->setPose(makeRigidTransform(Quaterniond::Identity(), Vector3d(0.0, 0.5, 5.0))); scene->addSceneElement(view); // Run the simulation, starting with initialize/startup of Managers and Components. For each Component of each // Element (Runtime::preprocessSceneElements) the Runtime tries to give access to the Component to each of the // Managers (Runtime::addComponents). The Managers only accept the types of Components that they manage. Once the // Managers are running, the Runtime can be used to stop/step the Managers. // Runtime::execute() will block until one of the Managers quits. runtime->execute(); return 0; } opensurgsim-0.7.0/Examples/DroppingBalls/config.txt.in000066400000000000000000000000421277777236100230410ustar00rootroot00000000000000${CMAKE_CURRENT_BINARY_DIR}/Data/ opensurgsim-0.7.0/Examples/GraphicsScene/000077500000000000000000000000001277777236100204105ustar00rootroot00000000000000opensurgsim-0.7.0/Examples/GraphicsScene/CMakeLists.txt000066400000000000000000000027371277777236100231610ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. find_package(OpenSceneGraph COMPONENTS osg osgViewer osgText osgUtil osgDB osgGA osgAnimation REQUIRED) find_package(OpenThreads) link_directories( ${Boost_LIBRARY_DIRS} ) include_directories( "${CMAKE_CURRENT_SOURCE_DIR}" "${OPENTHREADS_INCLUDE_DIR}" ) set(SOURCES GraphicsScene.cpp ) set(HEADERS ) file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/Data DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) # Configure the path for the data files configure_file( "${CMAKE_CURRENT_SOURCE_DIR}/config.txt.in" "${CMAKE_CURRENT_BINARY_DIR}/config.txt" ) surgsim_add_executable(GraphicsScene "${SOURCES}" "${HEADERS}") SET(LIBS SurgSimBlocks SurgSimGraphics SurgSimDevices ${Boost_LIBRARIES} ${YAML_CPP_LIBRARIES} ) target_link_libraries(GraphicsScene ${LIBS}) # Put GraphicsScene into folder "Examples" set_target_properties(GraphicsScene PROPERTIES FOLDER "Examples") opensurgsim-0.7.0/Examples/GraphicsScene/Data/000077500000000000000000000000001277777236100212615ustar00rootroot00000000000000opensurgsim-0.7.0/Examples/GraphicsScene/Data/StereoView.yaml000066400000000000000000000023521277777236100242430ustar00rootroot00000000000000- SurgSim::Framework::BasicSceneElement: Name: View Components: - SurgSim::Blocks::DriveElementFromInputBehavior: Name: ViewElementDriver Source: SurgSim::Input::InputComponent: Name: Oculus Id: 9b77c4e2-e9ea-484f-bfca-72121189dcb6 - SurgSim::Input::InputComponent: Name: Oculus Id: 9b77c4e2-e9ea-484f-bfca-72121189dcb6 DeviceName: Oculus LocalPose: Quaternion: [0, 1, 0, 0] Translation: [2.0, 1.0, 2.0] - SurgSim::Device::OculusView: InputComponent: SurgSim::Input::InputComponent: Id: 9b77c4e2-e9ea-484f-bfca-72121189dcb6 Name: Oculus Camera: SurgSim::Graphics::OsgCamera: Id: 9018dd38-c1ae-4e80-a27a-dc24e4b75d35 Name: Camera TargetScreen: 2 FullScreen: true EyeSeparation: 0.06 Name: View - SurgSim::Graphics::OsgCamera: Id: 9018dd38-c1ae-4e80-a27a-dc24e4b75d35 Name: Camera MainCamera: true PerspectiveProjection: [120, 0.88, 0.1, 10.0] RenderGroupReference: __OssDefault__opensurgsim-0.7.0/Examples/GraphicsScene/Data/Textures/000077500000000000000000000000001277777236100231045ustar00rootroot00000000000000opensurgsim-0.7.0/Examples/GraphicsScene/Data/Textures/CheckerBoard.png000066400000000000000000000076511277777236100261370ustar00rootroot00000000000000‰PNG  IHDRôxÔúsRGB®ÎébKGDÿÿÿ ½§“ pHYs  ÒÝ~ütIMEÝ ²jÒ)IDATxÚíÝ1ªI…Ѫ¡=´-Dë×B´&«¡=A1覾¾¾¾¾~]ß3€0À€ñï¸Ç©¯¯¯¯¯ß×·€Í€™‰zÏY_____¿¯o‹Ýçœ79è=g}}}}}ý¾¾ ,à=g}}}}}ý¾¾ lÞ¤ÝÃÔ×××××ïëÛÀb0ÀÐ"¾Dè§¾¾¾¾¾~_ß6ožç‰zÏY_____¿¯o‹Ý3ó&½ç¬¯¯¯¯¯ß×·€Åâo¼ç¬¯¯¯¯¯ß×·€Í€ø {˜úúúúúúu}XÌÀ`ZĿ৾¾¾¾¾~_ß6of&:è=g}}}}}ý¾¾ ,vŸsÞä ÷œõõõõõõûú6°Xü €÷œõõõõõõûú6°ytS_____¿¯o‹À` @‹ø¡{œúúúúúú}}ؼxž':è=g}}}}}ý¾¾ ,vÏÌ›ôž³¾¾¾¾¾~_ß‹¿ðž³¾¾¾¾¾~_ß6oâƒîaêëëëëë×õm`1` €hÿ€{œúúúúúú}}ؼ˜™è ÷œõõõõõõûú6°Ø}Îy“ƒÞsÖ×××××ïëÛÀbñ7ÞsÖ×××××ïëÛÀæ @zÐ=L}}}}}ý¾¾ ,f` €0-âK„îqêëëëëë÷õm`óàyžè ÷œõõõõõõûú6°Ø=3orÐ{Îúúúúúú}}X,þÀ{Îúúúúúú}}ؼˆº‡©¯¯¯¯¯_×·€Å ` €0 Eü;îqêëëëëë÷õm`ó`f¢ƒÞsÖ×××××ïëÛÀb÷9çMzÏY_____¿¯o‹ÅßxÏY_____¿¯o›7éA÷0õõõõõõûú6°˜ €0À´ˆ/ºÇ©¯¯¯¯¯ß×·€Í€çy¢ƒÞsÖ×××××ïëÛÀb÷̼ÉAï9ëëëëëë÷õm`±øï9ëëëëëë÷õm`ó >覾¾¾¾¾~]ß3€0À€ñï¸Ç©¯¯¯¯¯ß×·€Í€™‰zÏY_____¿¯o‹Ýçœ79è=g}}}}}ý¾¾ ,à=g}}}}}ý¾¾ lÞ¤ÝÃÔ×××××ïëÛÀb0ÀÐ"¾Dè§¾¾¾¾¾~_ß6ožç‰zÏY_____¿¯o‹Ý3ó&½ç¬¯¯¯¯¯ß×·€Åâo¼ç¬¯¯¯¯¯ß×·€Í€ø {˜úúúúúúu}XÌÀ`ZĿ৾¾¾¾¾~_ß6of&:è=g}}}}}ý¾¾ ,vŸsÞä ÷œõõõõõõûú6°Xü €÷œõõõõõõûú6°ytS_____¿¯o‹À` @‹ø¡{œúúúúúú}}ؼxž':è=g}}}}}ý¾¾ ,vÏÌ›ôž³¾¾¾¾¾~_ß‹¿ðž³¾¾¾¾¾~_ß6oâƒîaêëëëëë×õm`1` €hÿ€{œúúúúúú}}ؼ˜™è ÷œõõõõõõûú6°Ø}Îy“ƒÞsÖ×××××ïëÛÀbñ7ÞsÖ×××××ïëÛÀæ @zÐ=L}}}}}ý¾¾ ,f` €0-âK„îqêëëëëë÷õm`óàyžè ÷œõõõõõõûú6°Ø=3orÐ{Îúúúúúú}}X,þÀ{Îúúúúúú}}ؼˆº‡©¯¯¯¯¯_×·€Å ` €0 Eü;îqêëëëëë÷õm`ó`f¢ƒÞsÖ×××××ïëÛÀb÷9çMzÏY_____¿¯o‹ÅßxÏY_____¿¯o›7éA÷0õõõõõõûú6°˜ €0À´ˆ/ºÇ©¯¯¯¯¯ß×·€Í€çy¢ƒÞsÖ×××××ïëÛÀb÷̼ÉAï9ëëëëëë÷õm`±øï9ëëëëëë÷õm`ó >覾¾¾¾¾~]ß3€0À€ñï¸Ç©¯¯¯¯¯ß×·€Í€™‰zÏY_____¿¯o‹Ýçœ79è=g}}}}}ý¾¾ ,à=g}}}}}ý¾¾ lÞ¤ÝÃÔ×××××ïëÛÀb0ÀÐ"¾Dè§¾¾¾¾¾~_ß6ožç‰zÏY_____¿¯o‹Ý3ó&½ç¬¯¯¯¯¯ß×·€Åâo¼ç¬¯¯¯¯¯ß×·€Í€ø {˜úúúúúúu}XÌÀ`ZĿ৾¾¾¾¾~_ß6of&:è=g}}}}}ý¾¾ ,vŸsÞä ÷œõõõõõõûú6°Xü €÷œõõõõõõûú6°ytS_____¿¯o‹À` @‹ø¡{œúúúúúú}}ؼxž':è=g}}}}}ý¾¾ ,vÏÌ›ôž³¾¾¾¾¾~_ß‹¿ðž³¾¾¾¾¾~_ß6oâƒîaêëëëëë×õm`1` €hÿ€{œúúúúúú}}ؼ˜™è ÷œõõõõõõûú6°Ø}Îy“ƒÞsÖ×××××ïëÛÀbñ7ÞsÖ×××××ïëÛÀæ @zÐ=L}}}}}ý¾¾ ,f` €0-âK„îqêëëëëë÷õm`óàyžè ÷œõõõõõõûú6°Ø=3orÐ{Îúúúúúú}}X,þÀ{Îúúúúúú}}ؼˆº‡©¯¯¯¯¯_×·€Å ` €0 Eü;îqêëëëëë÷õm`ó`f¢ƒÞsÖ×××××ïëÛÀb÷9çMzÏY_____¿¯o‹ÅßxÏY_____¿¯o›7éA÷0õõõõõõûú6°˜ €0À´ˆ/ºÇ©¯¯¯¯¯ß×·€Í€çy¢ƒÞsÖ×××××ïëÛÀb÷̼ÉAï9ëëëëëë÷õm`±øï9ëëëëëë÷õm`ó >覾¾¾¾¾~]ß3€0À€ñï¸Ç©¯¯¯¯¯ß×·€Í€™‰zÏY_____¿¯o‹Ýçœ79è=g}}}}}ý¾¾ ,à=g}}}}}ý¾¾ lÞ¤ÝÃÔ×××××ïëÛÀb0ÀÐ"¾Dè§¾¾¾¾¾~_ß6ožç‰zÏY_____¿¯o‹Ý3ó&½ç¬¯¯¯¯¯ß×·€Åâo¼ç¬¯¯¯¯¯ß×·€Í€ø {˜úúúúúúu}XÌÀ`ZĿ৾¾¾¾¾~_ß6of&:è=g}}}}}ý¾¾ ,vŸsÞä ÷œõõõõõõûú6°Xü €÷œõõõõõõûú6°ytS_____¿¯o‹À` €0Àü›þ uYò¯2IEND®B`‚opensurgsim-0.7.0/Examples/GraphicsScene/GraphicsScene.cpp000066400000000000000000000316461277777236100236440ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include #include #include "SurgSim/Blocks/DriveElementFromInputBehavior.h" #include "SurgSim/Blocks/GraphicsUtilities.h" #include "SurgSim/Blocks/PoseInterpolator.h" #include "SurgSim/Blocks/ShadowMapping.h" #include "SurgSim/Devices/Devices.h" #include "SurgSim/Framework/Framework.h" #include "SurgSim/Graphics/Graphics.h" #include "SurgSim/Input/Input.h" #include "SurgSim/Math/Math.h" using SurgSim::Framework::Logger; using SurgSim::Graphics::OsgTextureUniform; using SurgSim::Graphics::OsgTexture2d; using SurgSim::Graphics::OsgUniform; using SurgSim::Math::makeRigidTransform; using SurgSim::Math::Matrix44f; using SurgSim::Math::Quaterniond; using SurgSim::Math::RigidTransform3d; using SurgSim::Math::Vector3d; using SurgSim::Math::Vector4d; /// \file /// This example creates a simple graphics scene and use the RenderPass object to show /// a simple shadowing algorithm. For the algorithm see http://en.wikipedia.org/wiki/Shadow_mapping /// There are two preprocessing passes that use specific program, plus a main pass that renders the /// objects using a program that can process the output from the preprocessing steps. /// Each program output becomes the input for the next shader, some parameters from other scene elements /// is passed into the program as uniforms. /// All of the information is kept up to date using a \sa TransferPropertiesBehavior /// Both the light and the main camera are being moved through a \sa PoseInterpolator to demonstrate /// dynamic changes and how to handle them in the rendering pipeline namespace { std::unordered_map> materials; std::shared_ptr createMonoView( const std::string& name, int x, int y, int width, int height) { using SurgSim::Graphics::OsgViewElement; std::shared_ptr viewElement = std::make_shared(name); std::array position = {x, y}; std::array dimensions = {width, height}; viewElement->getView()->setPosition(position); viewElement->getView()->setDimensions(dimensions); double aspectRatio = static_cast(width) / static_cast(height); viewElement->getCamera()->setPerspectiveProjection(60.0, aspectRatio, 0.01, 10.0); std::dynamic_pointer_cast(viewElement->getCamera())->setMainCamera(true); /// It's an OsgViewElement, we have an OsgView, turn on mapping of uniform and attribute values std::dynamic_pointer_cast(viewElement->getView())->setOsgMapsUniforms(true); // Move the camera from left to right over along the scene auto interpolator = std::make_shared("Interpolator"); RigidTransform3d from = makeRigidTransform( Vector3d(-4.0, 1.0, -3.0), Vector3d(0.0, 0.0, 0.0), Vector3d(0.0, 1.0, 0.0)); RigidTransform3d to = makeRigidTransform( Vector3d(4.0, 1.0, -3.0), Vector3d(0.0, 0.0, 0.0), Vector3d(0.0, 1.0, 0.0)); interpolator->setTarget(viewElement); interpolator->setStartingPose(from); interpolator->setDuration(10.0); interpolator->setEndingPose(to); interpolator->setPingPong(true); viewElement->setPose(from); viewElement->enableManipulator(true); // viewElement->addComponent(interpolator); return viewElement; } std::shared_ptr createMaterialWithShaders( const SurgSim::Framework::ApplicationData& data, const std::string& name) { auto program = SurgSim::Graphics::loadProgram(data, name); std::shared_ptr material; if (program != nullptr) { material = std::make_shared(name); material->setProgram(program); } return material; } std::shared_ptr createLight() { auto result = std::make_shared("Light"); auto light = std::make_shared("Light"); light->setDiffuseColor(Vector4d(1.0, 1.0, 1.0, 1.0)); light->setSpecularColor(Vector4d(0.8, 0.8, 0.8, 1.0)); light->setLightGroupReference(SurgSim::Graphics::Representation::DefaultGroupName); result->addComponent(light); // Move the light from left to right over along the scene auto interpolator = std::make_shared("Interpolator"); RigidTransform3d from = makeRigidTransform(Vector3d(5.0, 3.0, -5.0), Vector3d(0.0, 0.0, 0.0), Vector3d(0.0, 1.0, 0.0)); RigidTransform3d to = makeRigidTransform(Vector3d(-5.0, 3.0, -5.0), Vector3d(0.0, 0.0, 0.0), Vector3d(0.0, 1.0, 0.0)); interpolator->setTarget(result); interpolator->setStartingPose(from); interpolator->setDuration(10.0); interpolator->setEndingPose(to); interpolator->setPingPong(true); result->setPose(from); // result->addComponent(interpolator); return result; } void configureShinyMaterial() { // This will change the shared material auto material = materials["shiny"]; material->addUniform("vec4", "diffuseColor"); material->setValue("diffuseColor", SurgSim::Math::Vector4f(0.8, 0.8, 0.1, 1.0)); material->addUniform("vec4", "specularColor"); material->setValue("specularColor", SurgSim::Math::Vector4f(0.9, 0.9, 0.1, 1.0)); material->addUniform("float", "shininess"); material->setValue("shininess", 32.0f); } void configureTexturedMaterial(const std::string& filename) { auto material = materials["texturedShadowed"]; material->addUniform("vec4", "diffuseColor"); material->setValue("diffuseColor", SurgSim::Math::Vector4f(1.0, 1.0, 1.0, 1.0)); material->addUniform("vec4", "specularColor"); material->setValue("specularColor", SurgSim::Math::Vector4f(1.0, 1.0, 1.0, 1.0)); material->addUniform("float", "shininess"); material->setValue("shininess", 32.0f); auto texture = std::make_shared(); texture->loadImage(filename); material->addUniform("sampler2D", "diffuseMap"); material->setValue("diffuseMap", texture); } /// A simple box as a scenelement class SimpleBox : public SurgSim::Framework::BasicSceneElement { public: explicit SimpleBox(const std::string& name) : BasicSceneElement(name) { m_box = std::make_shared(getName() + " Graphics"); // The material that this object uses m_box->setMaterial(materials["basicShadowed"]); // Assign this to the pass for shadowing objects m_box->addGroupReference(SurgSim::Blocks::GROUP_SHADOW_CASTER); // Assign this to the pass for shadowed objects m_box->addGroupReference(SurgSim::Blocks::GROUP_SHADOW_RECEIVER); } bool doInitialize() override { addComponent(m_box); return true; } void setSize(double width, double height, double length) { m_box->setSizeXYZ(width, height, length); } void setMaterial(const std::shared_ptr material) { m_box->setMaterial(material); } private: std::shared_ptr m_box; }; class SimpleSphere : public SurgSim::Framework::BasicSceneElement { public: explicit SimpleSphere(const std::string& name) : BasicSceneElement(name) { m_sphere = std::make_shared(getName() + " Graphics"); m_sphere->setMaterial(materials["basicShadowed"]); m_sphere->addGroupReference(SurgSim::Blocks::GROUP_SHADOW_CASTER); m_sphere->addGroupReference(SurgSim::Blocks::GROUP_SHADOW_RECEIVER); } bool doInitialize() override { addComponent(m_sphere); return true; } void setRadius(double radius) { m_sphere->setRadius(radius); } void setMaterial(const std::shared_ptr material) { m_sphere->setMaterial(material); } private: std::shared_ptr m_sphere; }; } // Create an array of spheres void addSpheres(std::shared_ptr scene) { double radius = 0.05; Vector3d origin(-1.0, 0.0, -1.0); Vector3d spacing(0.5, 0.5, 0.5); for (int i = 0; i < 3; ++i) { for (int j = 0; j < 3; ++j) { auto sphere = std::make_shared("Sphere_" + std::to_string(static_cast(i * 3 + j))); sphere->setRadius(radius); Vector3d position = origin + Vector3d(spacing.array() * Vector3d(static_cast(i), 1.0, static_cast(j)).array()); sphere->setPose(makeRigidTransform(Quaterniond::Identity(), position)); scene->addSceneElement(sphere); } } } void createScene(std::shared_ptr runtime, bool useStereo = false) { auto scene = runtime->getScene(); auto box = std::make_shared("Plane"); box->setSize(3.0, 0.01, 3.0); box->setPose(RigidTransform3d::Identity()); box->setMaterial(materials["texturedShadowed"]); scene->addSceneElement(box); box = std::make_shared("Box 1"); box->setSize(0.25, 1.0, 0.25); box->setPose(makeRigidTransform(Quaterniond::Identity(), Vector3d(1.0, 0.5, -1.0))); scene->addSceneElement(box); addSpheres(scene); auto sphere = std::make_shared("Shiny Sphere"); sphere->setRadius(0.25); sphere->setMaterial(materials["basicShadowed"]); scene->addSceneElement(sphere); if (useStereo == true) { // This will most like have to be edited to conform with the screen configuration // TargetScreen, or Dimensions and Location are candidates for being incorrect depending // on the system runtime->addSceneElements("StereoView.yaml"); } else { scene->addSceneElement(createMonoView("View", 40, 40, 1024, 768)); } auto element = std::make_shared("Materials"); element->addComponent(materials["shiny"]); element->addComponent(materials["texturedShadowed"]); element->addComponent(materials["basicShadowed"]); scene->addSceneElement(element); scene->addSceneElement(createLight()); std::array lightProjection = { -2.6, 2.6, -2.6, 2.6, 4, 10}; auto elements = SurgSim::Blocks::createShadowMapping( scene->getComponent("View", "Camera"), scene->getComponent("Light", "Light"), 4096, 1024, lightProjection, 0.0005, 0.8, true, 8.0, false); scene->addSceneElements(elements); } int main(int argc, char* argv[]) { using boost::program_options::value; bool useStereo = false; boost::program_options::options_description visible("Allowed options"); visible.add_options()("help", "produce help message") ("useStereo", value(&useStereo)->default_value(false), "Show scene via stereo"); boost::program_options::variables_map variables; boost::program_options::store(boost::program_options::command_line_parser(argc, argv).options(visible).run(), variables); boost::program_options::notify(variables); if (variables.count("help")) { std::cout << visible << "\n"; return 1; } auto runtime(std::make_shared("config.txt")); auto data = runtime->getApplicationData(); materials["basicLit"] = createMaterialWithShaders(*data, "Shaders/basic_lit"); materials["basicUnlit"] = createMaterialWithShaders(*data, "Shaders/basic_unlit"); materials["basicShadowed"] = createMaterialWithShaders(*data, "Shaders/s_mapping"); materials["texturedUnlit"] = createMaterialWithShaders(*data, "Shaders/unlit_texture"); materials["texturedShadowed"] = createMaterialWithShaders(*data, "Shaders/ds_mapping_material"); materials["shiny"] = createMaterialWithShaders(*data, "Shaders/material"); materials["default"] = materials["basic_lit"]; auto graphics = std::make_shared(); graphics->setMultiThreading(true); auto input = std::make_shared(); if (useStereo) { // Only interested in the oculus auto device = SurgSim::Devices::createDevice("SurgSim::Devices::OculusDevice", "Oculus"); if (device != nullptr) { input->addDevice(device); } else { SURGSIM_LOG_WARNING(SurgSim::Framework::Logger::getDefaultLogger()) << "Could not initialize Oculus Device, falling back to mono display."; useStereo = false; } } auto behaviors = std::make_shared(); runtime->addManager(graphics); runtime->addManager(behaviors); runtime->addManager(input); configureShinyMaterial(); configureTexturedMaterial(runtime->getApplicationData()->findFile("Textures/CheckerBoard.png")); createScene(runtime, useStereo); runtime->execute(); return 0; } opensurgsim-0.7.0/Examples/GraphicsScene/config.txt.in000066400000000000000000000001001277777236100230120ustar00rootroot00000000000000${PROJECT_BINARY_DIR}/Data/ ${CMAKE_CURRENT_BINARY_DIR}/Data/ opensurgsim-0.7.0/Examples/InputVtc/000077500000000000000000000000001277777236100174465ustar00rootroot00000000000000opensurgsim-0.7.0/Examples/InputVtc/CMakeLists.txt000066400000000000000000000024721277777236100222130ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. link_directories( ${Boost_LIBRARY_DIRS} ) include_directories( ${CMAKE_CURRENT_SOURCE_DIR} ${OPENTHREADS_INCLUDE_DIR} ) set(SOURCES InputVtc.cpp ) set(HEADERS ) surgsim_add_executable(InputVtc "${SOURCES}" "${HEADERS}") set(LIBS SurgSimBlocks SurgSimDevices SurgSimGraphics SurgSimMath ${YAML_CPP_LIBRARIES} ) target_link_libraries(InputVtc ${LIBS}) file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/Data DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) # Configure the path for the data files configure_file( "${CMAKE_CURRENT_SOURCE_DIR}/config.txt.in" "${CMAKE_CURRENT_BINARY_DIR}/config.txt" ) # Put InputVtc into folder "Examples" set_target_properties(InputVtc PROPERTIES FOLDER "Examples") opensurgsim-0.7.0/Examples/InputVtc/Data/000077500000000000000000000000001277777236100203175ustar00rootroot00000000000000opensurgsim-0.7.0/Examples/InputVtc/Data/Device.yaml000066400000000000000000000005751277777236100224110ustar00rootroot00000000000000- SurgSim::Devices::NovintDevice: Name: Tool_Device InitializationName: 7DofFalcon 7DofDevice: true - SurgSim::Devices::PhantomDevice: Name: Tool_Device - SurgSim::Devices::NovintDevice: Name: Tool_Device 7DofDevice: false - SurgSim::Devices::MultiAxisDevice: Name: Tool_Device - SurgSim::Devices::IdentityPoseDevice: Name: Tool_Device opensurgsim-0.7.0/Examples/InputVtc/InputVtc.cpp000066400000000000000000000216671277777236100217420ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Blocks/DriveElementFromInputBehavior.h" #include "SurgSim/Devices/Devices.h" #include "SurgSim/Framework/Framework.h" #include "SurgSim/Graphics/Graphics.h" #include "SurgSim/Input/Input.h" #include "SurgSim/Math/Math.h" #include "SurgSim/Physics/Physics.h" using SurgSim::Blocks::DriveElementFromInputBehavior; using SurgSim::Framework::BasicSceneElement; using SurgSim::Framework::SceneElement; using SurgSim::Graphics::OsgBoxRepresentation; using SurgSim::Graphics::OsgMaterial; using SurgSim::Graphics::OsgPlaneRepresentation; using SurgSim::Graphics::OsgProgram; using SurgSim::Graphics::OsgUniform; using SurgSim::Graphics::OsgViewElement; using SurgSim::Graphics::ViewElement; using SurgSim::Math::BoxShape; using SurgSim::Math::DoubleSidedPlaneShape; using SurgSim::Math::makeRigidTransform; using SurgSim::Math::Vector4f; using SurgSim::Math::Vector3d; using SurgSim::Physics::FixedRepresentation; using SurgSim::Physics::Representation; using SurgSim::Physics::RigidRepresentation; using SurgSim::Physics::PhysicsManager; using SurgSim::Physics::VirtualToolCoupler; std::shared_ptr createPlane(const std::string& name) { std::shared_ptr planeShape = std::make_shared(); std::shared_ptr physicsRepresentation = std::make_shared(name + " Physics"); physicsRepresentation->setShape(planeShape); std::shared_ptr graphicsRepresentation = std::make_shared(name + " Graphics"); std::shared_ptr material = std::make_shared("material"); std::shared_ptr program = std::make_shared(); std::shared_ptr> uniform = std::make_shared>("color"); uniform->set(Vector4f(0.0f, 0.6f, 1.0f, 0.0f)); material->addUniform(uniform); program->setFragmentShaderSource( "uniform vec4 color;\n" "void main(void)\n" "{\n" " gl_FragColor = color;\n" "}"); material->setProgram(program); graphicsRepresentation->setMaterial(material); std::shared_ptr planeElement = std::make_shared(name); planeElement->addComponent(physicsRepresentation); planeElement->addComponent(graphicsRepresentation); planeElement->addComponent(material); std::shared_ptr collisionRepresentation; collisionRepresentation = std::make_shared(name + " Collision"); physicsRepresentation->setCollisionRepresentation(collisionRepresentation); planeElement->addComponent(collisionRepresentation); return planeElement; } std::shared_ptr createBox(const std::string& name, const std::string& deviceName) { std::shared_ptr box = std::make_shared(0.8, 2.0, 0.2); // in meter // Physics Components std::shared_ptr physicsRepresentation = std::make_shared(name + " Physics"); physicsRepresentation->setIsGravityEnabled(false); physicsRepresentation->setDensity(0.1); physicsRepresentation->setShape(box); // Collision Components auto collisionRepresentation = std::make_shared("Box Collision Representation"); physicsRepresentation->setCollisionRepresentation(collisionRepresentation); // Graphics Components std::shared_ptr graphicsRepresentation = std::make_shared(name + " Graphics"); graphicsRepresentation->setSizeXYZ(box->getSizeX(), box->getSizeY(), box->getSizeZ()); // Input Components std::shared_ptr inputComponent = std::make_shared(name + " Input"); inputComponent->setDeviceName(deviceName); // Output Components std::shared_ptr outputComponent = nullptr; outputComponent = std::make_shared(name + " Output"); outputComponent->setDeviceName(deviceName); // A virtual tool coupler can be used to connect an input/output device with the physics thread. // The physics representation follows the pose provided by the device, and the representation's collisions // generate forces and torques on the device. std::shared_ptr inputCoupler = std::make_shared(name + " Input Coupler"); inputCoupler->setInput(inputComponent); inputCoupler->setOutput(outputComponent); inputCoupler->setRepresentation(physicsRepresentation); inputCoupler->setHapticOutputOnlyWhenColliding(true); // The SceneElement std::shared_ptr boxElement = std::make_shared(name); boxElement->addComponent(physicsRepresentation); boxElement->addComponent(collisionRepresentation); boxElement->addComponent(graphicsRepresentation); boxElement->addComponent(inputComponent); boxElement->addComponent(outputComponent); boxElement->addComponent(inputCoupler); return boxElement; } std::shared_ptr createBoxForRawInput(const std::string& name, const std::string& deviceName) { std::shared_ptr graphicsRepresentation; graphicsRepresentation = std::make_shared(name + " Graphics"); graphicsRepresentation->setSizeXYZ(0.8, 2.0, 0.2); std::shared_ptr material = std::make_shared("material"); std::shared_ptr program = std::make_shared(); program->setVertexShaderSource( "void main(void)\n" "{\n" " gl_Position = ftransform();\n" "}"); program->setFragmentShaderSource( "void main(void)\n" "{\n" " gl_FragColor = vec4(0.2, 0.2, 0.2, 1.0);\n" "}"); material->setProgram(program); graphicsRepresentation->setMaterial(material); std::shared_ptr inputComponent; inputComponent = std::make_shared(name + " Input"); inputComponent->setDeviceName(deviceName); std::shared_ptr driver; driver = std::make_shared(name + " Driver"); driver->setSource(inputComponent); std::shared_ptr element = std::make_shared(name); element->addComponent(graphicsRepresentation); element->addComponent(inputComponent); element->addComponent(driver); element->addComponent(material); return element; } int main(int argc, char* argv[]) { std::shared_ptr graphicsManager = std::make_shared(); std::shared_ptr physicsManager = std::make_shared(); std::shared_ptr behaviorManager = std::make_shared(); std::shared_ptr inputManager = std::make_shared(); std::shared_ptr runtime = std::make_shared("config.txt"); runtime->addManager(physicsManager); runtime->addManager(graphicsManager); runtime->addManager(behaviorManager); runtime->addManager(inputManager); const std::string deviceName = "Tool_Device"; std::shared_ptr device = SurgSim::Devices::loadDevice("Device.yaml"); SURGSIM_ASSERT(device != nullptr) << "Failed to initialize any device."; SURGSIM_LOG_IF(std::dynamic_pointer_cast(device) != nullptr, SurgSim::Framework::Logger::getDefaultLogger(), WARNING) << "The InputVtc example was unable to initialize " << "an input device that provides poses, so it will use a constant pose."; inputManager->addDevice(device); std::shared_ptr scene = runtime->getScene(); scene->addSceneElement(createBox("VTC Box", deviceName)); scene->addSceneElement(createBoxForRawInput("Raw Input", deviceName)); std::shared_ptr plane = createPlane("Plane"); plane->setPose(makeRigidTransform(SurgSim::Math::Quaterniond::Identity(), Vector3d(0.0, -1.0, 0.0))); scene->addSceneElement(plane); std::shared_ptr viewElement = std::make_shared("view"); viewElement->setPose(makeRigidTransform(SurgSim::Math::Quaterniond::Identity(), Vector3d(0.0, 0.5, 5.0))); scene->addSceneElement(viewElement); runtime->execute(); return 0; } opensurgsim-0.7.0/Examples/InputVtc/config.txt.in000066400000000000000000000000761277777236100220640ustar00rootroot00000000000000${CMAKE_CURRENT_BINARY_DIR}/Data/ ${SURGSIM_SOURCE_DIR}/Data/opensurgsim-0.7.0/Examples/ShowScenery/000077500000000000000000000000001277777236100201435ustar00rootroot00000000000000opensurgsim-0.7.0/Examples/ShowScenery/CMakeLists.txt000066400000000000000000000023551277777236100227100ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. link_directories( ${Boost_LIBRARY_DIRS} ) include_directories( "${CMAKE_CURRENT_SOURCE_DIR}" "${OPENTHREADS_INCLUDE_DIR}" ) set(SOURCES ShowScenery.cpp ) set(HEADERS ) # Configure the path for the data files configure_file( "${CMAKE_CURRENT_SOURCE_DIR}/config.txt.in" "${CMAKE_CURRENT_BINARY_DIR}/config.txt" ) surgsim_add_executable(ShowScenery "${SOURCES}" "${HEADERS}") SET(LIBS SurgSimBlocks SurgSimGraphics ${Boost_LIBRARIES} ${YAML_CPP_LIBRARIES} ) target_link_libraries(ShowScenery ${LIBS}) # Put ShowScenery into folder "Examples" set_target_properties(ShowScenery PROPERTIES FOLDER "Examples") opensurgsim-0.7.0/Examples/ShowScenery/ShowScenery.cpp000066400000000000000000000101151277777236100231160ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include "SurgSim/Framework/Framework.h" #include "SurgSim/Graphics/Graphics.h" #include "SurgSim/Math/Math.h" using SurgSim::Framework::BasicSceneElement; using SurgSim::Framework::Logger; using SurgSim::Framework::Runtime; using SurgSim::Graphics::OsgAxesRepresentation; using SurgSim::Graphics::OsgSceneryRepresentation; using SurgSim::Graphics::OsgViewElement; using SurgSim::Math::Vector3d; namespace po = boost::program_options; namespace { std::shared_ptr createView(const std::string& name, int x, int y, int width, int height) { std::shared_ptr viewElement = std::make_shared(name); std::array position = {x, y}; std::array dimensions = {width, height}; viewElement->getView()->setPosition(position); viewElement->getView()->setDimensions(dimensions); return viewElement; } } int main(int argc, char* argv[]) { // Parse commandline parameters po::options_description visible("Allowed options"); visible.add_options()("help", "produce help message") ("config-file", po::value(), "The config file to use"); po::options_description hidden("Hidden options"); hidden.add_options()("input-file", po::value>(), "input file"); po::options_description all("All options"); all.add(visible).add(hidden); po::positional_options_description positional; positional.add("input-file", -1); po::variables_map variables; po::store(po::command_line_parser(argc, argv).options(all).positional(positional).run(), variables); if (variables.count("help")) { std::cout << visible << "\n"; return 1; } if (variables.count("input-file") == 0) { std::cout << "You need to supply one or more input files.\n"; return 1; } std::shared_ptr runtime; if (variables.count("config-file") == 1) { runtime = std::make_shared(variables["config-file"].as()); } else { runtime = std::make_shared(); } auto data = runtime->getApplicationData(); runtime->addManager(std::make_shared()); runtime->addManager(std::make_shared()); auto scene = runtime->getScene(); auto viewElement = createView("View", 40, 40, 1024, 768); scene->addSceneElement(viewElement); viewElement->enableManipulator(true); viewElement->setManipulatorParameters(Vector3d(0, 0, 2), Vector3d(0, 0, 0)); auto element = std::make_shared("Graphics"); auto axes = std::make_shared("axes"); element->addComponent(axes); auto files = variables["input-file"].as>(); for (auto file : files) { auto appData = runtime->getApplicationData(); std::string path; #ifdef WIN32 // Fix windows backslashes coming in from the command-line, these may be absolute paths std::replace_if(file.begin(), file.end(), [](const char& c) { return c == '\\'; }, '/'); #endif // In this case we circumvent the assertion that will stop execution if the file can't be found and // try to show as many scenery objects as possible if (appData->tryFindFile(file, &path)) { auto graphics = std::make_shared(file); graphics->loadModel(file); element->addComponent(graphics); } else { SURGSIM_LOG_WARNING(Logger::getDefaultLogger()) << "Can't find " << file; } } scene->addSceneElement(element); runtime->execute(); return 0; } opensurgsim-0.7.0/Examples/ShowScenery/config.txt.in000066400000000000000000000000351277777236100225540ustar00rootroot00000000000000${PROJECT_BINARY_DIR}/Data/ opensurgsim-0.7.0/Examples/Stapling/000077500000000000000000000000001277777236100174535ustar00rootroot00000000000000opensurgsim-0.7.0/Examples/Stapling/CMakeLists.txt000066400000000000000000000033361277777236100222200ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. include_directories( ${CMAKE_CURRENT_SOURCE_DIR} ) set(STAPLING_SOURCES StapleElement.cpp StaplerBehavior.cpp Stapling.cpp ) set(STAPLING_HEADERS StapleElement.h StaplerBehavior.h ) surgsim_add_executable(Stapling "${STAPLING_SOURCES}" "${STAPLING_HEADERS}") set(SERIALIZEDSTAPLING_SOURCES SerializedStapling.cpp StapleElement.cpp StaplerBehavior.cpp ) set(SERIALIZEDSTAPLING_HEADERS StapleElement.h StaplerBehavior.h ) surgsim_add_executable(SerializedStapling "${SERIALIZEDSTAPLING_SOURCES}" "${SERIALIZEDSTAPLING_HEADERS}") set(LIBS IdentityPoseDevice MultiAxisDevice SurgSimBlocks SurgSimFramework SurgSimGraphics ${YAML_CPP_LIBRARIES} ) target_link_libraries(Stapling ${LIBS}) target_link_libraries(SerializedStapling ${LIBS}) file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/Data DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) # Configure the path for the data files configure_file( "${CMAKE_CURRENT_SOURCE_DIR}/config.txt.in" "${CMAKE_CURRENT_BINARY_DIR}/config.txt" ) set_target_properties(Stapling PROPERTIES FOLDER "Examples") set_target_properties(SerializedStapling PROPERTIES FOLDER "Examples") opensurgsim-0.7.0/Examples/Stapling/Data/000077500000000000000000000000001277777236100203245ustar00rootroot00000000000000opensurgsim-0.7.0/Examples/Stapling/Data/Geometry/000077500000000000000000000000001277777236100221175ustar00rootroot00000000000000opensurgsim-0.7.0/Examples/Stapling/Data/Geometry/arm_collision.ply000066400000000000000000003661021277777236100255070ustar00rootroot00000000000000ply format ascii 1.0 comment Created by Blender 2.69 (sub 0) - www.blender.org, source file: '' element vertex 1582 property float x property float y property float z property float nx property float ny property float nz property float s property float t element face 528 property list uchar uint vertex_indices end_header -0.034406 -0.085027 -0.138728 0.463145 -0.829541 -0.312024 0.135340 0.509730 -0.095526 -0.117518 -0.143070 0.463145 -0.829541 -0.312024 0.282049 0.406200 -0.073474 -0.097069 -0.164703 0.463145 -0.829541 -0.312024 0.259420 0.472470 -0.095526 -0.117518 -0.143070 -0.477746 -0.729957 0.488795 0.282049 0.406200 -0.089139 -0.098688 -0.108707 -0.477746 -0.729957 0.488795 0.188060 0.358130 -0.129650 -0.099186 -0.149046 -0.477746 -0.729957 0.488795 0.350790 0.366940 -0.129650 -0.099186 -0.149046 -0.496761 -0.707815 0.502222 0.350790 0.366940 -0.133343 -0.079854 -0.125453 -0.496761 -0.707815 0.502222 0.293109 0.318900 -0.158610 -0.087944 -0.161847 -0.496761 -0.707815 0.502222 0.443599 0.357970 -0.133343 -0.079854 -0.125453 -0.732850 -0.346174 0.585742 0.293109 0.318900 -0.147506 -0.066233 -0.135123 -0.732850 -0.346174 0.585742 0.342009 0.305170 -0.158610 -0.087944 -0.161847 -0.732850 -0.346174 0.585742 0.443599 0.357970 -0.140091 -0.047694 -0.134212 -0.313873 0.817137 0.483498 0.319526 0.270466 -0.112058 -0.031450 -0.143467 -0.313873 0.817137 0.483498 0.278074 0.212619 -0.137006 -0.024205 -0.171907 -0.313873 0.817137 0.483498 0.365560 0.214520 -0.147506 -0.066233 -0.135123 -0.903873 0.349389 0.246860 0.342009 0.305170 -0.127485 -0.041471 -0.096863 -0.903873 0.349389 0.246860 0.207157 0.259402 -0.140091 -0.047694 -0.134212 -0.903873 0.349389 0.246860 0.319526 0.270466 -0.127485 -0.041471 -0.096863 -0.715701 0.686737 0.127140 0.207157 0.259402 -0.107972 -0.020968 -0.097765 -0.715701 0.686737 0.127140 0.188810 0.220410 -0.140091 -0.047694 -0.134212 -0.715701 0.686737 0.127140 0.319526 0.270466 -0.140091 -0.047694 -0.134212 -0.531301 0.834859 -0.143978 0.319526 0.270466 -0.107972 -0.020968 -0.097765 -0.531301 0.834859 -0.143978 0.188810 0.220410 -0.112058 -0.031450 -0.143467 -0.531301 0.834859 -0.143978 0.278074 0.212619 -0.127485 -0.041471 -0.096863 -0.718029 0.687994 0.105349 0.207157 0.259402 -0.100711 -0.017457 -0.071205 -0.718029 0.687994 0.105349 0.153949 0.220629 -0.107972 -0.020968 -0.097765 -0.718029 0.687994 0.105349 0.188810 0.220410 -0.100711 -0.017457 -0.071205 -0.795001 0.438312 0.419352 0.153949 0.220629 -0.127485 -0.041471 -0.096863 -0.795001 0.438312 0.419352 0.207157 0.259402 -0.094869 -0.027848 -0.049269 -0.795001 0.438312 0.419352 0.131870 0.234050 -0.094869 -0.027848 -0.049269 -0.834640 0.121010 0.537339 0.131870 0.234050 -0.127485 -0.041471 -0.096863 -0.834640 0.121010 0.537339 0.207157 0.259402 -0.117000 -0.054747 -0.077587 -0.834640 0.121010 0.537339 0.163450 0.270300 -0.117000 -0.054747 -0.077587 -0.650931 -0.557859 0.514861 0.163450 0.270300 -0.133343 -0.079854 -0.125453 -0.650931 -0.557859 0.514861 0.293109 0.318900 -0.095276 -0.068078 -0.064566 -0.650931 -0.557859 0.514861 0.130968 0.286588 -0.127485 -0.041471 -0.096863 -0.882285 -0.013640 0.470517 0.207157 0.259402 -0.147506 -0.066233 -0.135123 -0.882285 -0.013640 0.470517 0.342009 0.305170 -0.117000 -0.054747 -0.077587 -0.882285 -0.013640 0.470517 0.163450 0.270300 -0.147506 -0.066233 -0.135123 -0.754814 -0.438572 0.487761 0.342009 0.305170 -0.133343 -0.079854 -0.125453 -0.754814 -0.438572 0.487761 0.293109 0.318900 -0.117000 -0.054747 -0.077587 -0.754814 -0.438572 0.487761 0.163450 0.270300 -0.113704 -0.014641 -0.177831 0.106434 0.895194 0.432782 0.354810 0.871980 -0.112058 -0.031450 -0.143467 0.106434 0.895194 0.432782 0.296340 0.934129 -0.089934 -0.029127 -0.153713 0.106434 0.895194 0.432782 0.266570 0.800189 -0.089934 -0.029127 -0.153713 -0.118744 0.992428 -0.031396 0.266570 0.800189 -0.112058 -0.031450 -0.143467 -0.118744 0.992428 -0.031396 0.296340 0.934129 -0.079289 -0.027650 -0.147286 -0.118744 0.992428 -0.031396 0.236930 0.764110 -0.137006 -0.024205 -0.171907 -0.244844 0.866271 0.435461 0.366090 0.965530 -0.112058 -0.031450 -0.143467 -0.244844 0.866271 0.435461 0.296340 0.934129 -0.113704 -0.014641 -0.177831 -0.244844 0.866271 0.435461 0.354810 0.871980 -0.079289 -0.027650 -0.147286 0.201966 0.942022 -0.267964 0.236930 0.764110 -0.082414 -0.008469 -0.082211 0.201966 0.942022 -0.267964 0.147348 0.905596 -0.051717 -0.030921 -0.138004 0.201966 0.942022 -0.267964 0.172420 0.668253 -0.082414 -0.008469 -0.082211 0.000804 0.927855 -0.372941 0.147348 0.905596 -0.025528 -0.015002 -0.098342 0.000804 0.927855 -0.372941 0.106645 0.656621 -0.051717 -0.030921 -0.138004 0.000804 0.927855 -0.372941 0.172420 0.668253 -0.112058 -0.031450 -0.143467 -0.136721 0.968133 -0.209823 0.296340 0.934129 -0.107972 -0.020968 -0.097765 -0.136721 0.968133 -0.209823 0.209280 0.974420 -0.079289 -0.027650 -0.147286 -0.136721 0.968133 -0.209823 0.236930 0.764110 -0.107972 -0.020968 -0.097765 -0.276259 0.918193 -0.283906 0.209280 0.974420 -0.082414 -0.008469 -0.082211 -0.276259 0.918193 -0.283906 0.147348 0.905596 -0.079289 -0.027650 -0.147286 -0.276259 0.918193 -0.283906 0.236930 0.764110 -0.142783 -0.123768 -0.254342 0.665454 -0.706442 -0.241061 0.656300 0.541330 -0.101305 -0.091627 -0.234032 0.665454 -0.706442 -0.241061 0.553391 0.588060 -0.102843 -0.103309 -0.204043 0.665454 -0.706442 -0.241061 0.405861 0.510860 -0.102843 -0.103309 -0.204043 0.696247 -0.680205 -0.229262 0.405861 0.510860 -0.101305 -0.091627 -0.234032 0.696247 -0.680205 -0.229262 0.553391 0.588060 -0.072018 -0.074296 -0.196510 0.696247 -0.680205 -0.229262 0.356783 0.579623 -0.142783 -0.123768 -0.254342 0.627018 -0.777378 -0.050307 0.656300 0.541330 -0.142754 -0.121434 -0.290047 0.627018 -0.777378 -0.050307 0.750953 0.583825 -0.101305 -0.091627 -0.234032 0.627018 -0.777378 -0.050307 0.553391 0.588060 -0.118145 -0.075826 -0.291408 0.815307 -0.450766 -0.363433 0.807090 0.695700 -0.101305 -0.091627 -0.234032 0.815307 -0.450766 -0.363433 0.553391 0.588060 -0.142754 -0.121434 -0.290047 0.815307 -0.450766 -0.363433 0.750953 0.583825 -0.094587 -0.070190 -0.237734 0.811379 -0.336776 -0.477751 0.571026 0.654340 -0.072018 -0.074296 -0.196510 0.811379 -0.336776 -0.477751 0.356783 0.579623 -0.101305 -0.091627 -0.234032 0.811379 -0.336776 -0.477751 0.553391 0.588060 -0.101305 -0.091627 -0.234032 0.875332 -0.334594 -0.349057 0.553391 0.588060 -0.118145 -0.075826 -0.291408 0.875332 -0.334594 -0.349057 0.807090 0.695700 -0.094587 -0.070190 -0.237734 0.875332 -0.334594 -0.349057 0.571026 0.654340 -0.118145 -0.075826 -0.291408 0.910991 0.067262 -0.406905 0.807090 0.695700 -0.107834 -0.057088 -0.265226 0.910991 0.067262 -0.406905 0.726160 0.731651 -0.094587 -0.070190 -0.237734 0.910991 0.067262 -0.406905 0.571026 0.654340 -0.100382 -0.018451 -0.205285 0.630584 0.461830 -0.623760 0.411672 0.797526 -0.071727 -0.047559 -0.197868 0.630584 0.461830 -0.623760 0.379059 0.666993 -0.094587 -0.070190 -0.237734 0.630584 0.461830 -0.623760 0.571026 0.654340 -0.107834 -0.057088 -0.265226 0.908900 0.289840 -0.299822 0.726160 0.731651 -0.100382 -0.018451 -0.205285 0.908900 0.289840 -0.299822 0.411672 0.797526 -0.094587 -0.070190 -0.237734 0.908900 0.289840 -0.299822 0.571026 0.654340 -0.100382 -0.018451 -0.205285 0.872117 0.354694 -0.337053 0.411672 0.797526 -0.107834 -0.057088 -0.265226 0.872117 0.354694 -0.337053 0.726160 0.731651 -0.117261 -0.018451 -0.248959 0.872117 0.354694 -0.337053 0.595351 0.822090 -0.100382 -0.018451 -0.205285 0.712515 0.701656 0.000902 0.411672 0.797526 -0.089934 -0.029127 -0.153713 0.712515 0.701656 0.000902 0.266570 0.800189 -0.071727 -0.047559 -0.197868 0.712515 0.701656 0.000902 0.379059 0.666993 -0.089934 -0.029127 -0.153713 0.084482 0.931430 -0.353979 0.266570 0.800189 -0.079289 -0.027650 -0.147286 0.084482 0.931430 -0.353979 0.236930 0.764110 -0.071727 -0.047559 -0.197868 0.084482 0.931430 -0.353979 0.379059 0.666993 -0.137698 -0.007571 -0.242054 0.278313 0.960489 0.001757 0.534770 0.882390 -0.113704 -0.014641 -0.177831 0.278313 0.960489 0.001757 0.354810 0.871980 -0.100382 -0.018451 -0.205285 0.278313 0.960489 0.001757 0.411672 0.797526 -0.113704 -0.014641 -0.177831 0.447186 0.889536 0.093549 0.354810 0.871980 -0.089934 -0.029127 -0.153713 0.447186 0.889536 0.093549 0.266570 0.800189 -0.100382 -0.018451 -0.205285 0.447186 0.889536 0.093549 0.411672 0.797526 -0.137698 -0.007571 -0.242054 0.420355 0.892698 -0.162457 0.534770 0.882390 -0.100382 -0.018451 -0.205285 0.420355 0.892698 -0.162457 0.411672 0.797526 -0.117261 -0.018451 -0.248959 0.420355 0.892698 -0.162457 0.595351 0.822090 -0.169827 -0.013664 -0.222033 -0.096689 0.984765 0.144531 0.462741 0.950520 -0.113704 -0.014641 -0.177831 -0.096689 0.984765 0.144531 0.354810 0.871980 -0.137698 -0.007571 -0.242054 -0.096689 0.984765 0.144531 0.534770 0.882390 -0.072018 -0.074296 -0.196510 0.276017 -0.787433 -0.551147 0.356783 0.579623 -0.054913 -0.089177 -0.166683 0.276017 -0.787433 -0.551147 0.228820 0.514750 -0.073474 -0.097069 -0.164703 0.276017 -0.787433 -0.551147 0.255890 0.486160 -0.072018 -0.074296 -0.196510 0.708039 -0.379637 -0.595447 0.356783 0.579623 -0.053999 -0.068243 -0.178943 0.708039 -0.379637 -0.595447 0.256240 0.570673 -0.054913 -0.089177 -0.166683 0.708039 -0.379637 -0.595447 0.228820 0.514750 -0.094587 -0.070190 -0.237734 0.875211 -0.034034 -0.482543 0.571026 0.654340 -0.071727 -0.047559 -0.197868 0.875211 -0.034034 -0.482543 0.379059 0.666993 -0.072018 -0.074296 -0.196510 0.875211 -0.034034 -0.482543 0.356783 0.579623 -0.071727 -0.047559 -0.197868 0.769087 -0.040767 -0.637842 0.379059 0.666993 -0.056141 -0.053097 -0.178721 0.769087 -0.040767 -0.637842 0.263661 0.612951 -0.072018 -0.074296 -0.196510 0.769087 -0.040767 -0.637842 0.356783 0.579623 -0.072018 -0.074296 -0.196510 0.675592 0.106238 -0.729581 0.356783 0.579623 -0.056141 -0.053097 -0.178721 0.675592 0.106238 -0.729581 0.263661 0.612951 -0.053999 -0.068243 -0.178943 0.675592 0.106238 -0.729581 0.256240 0.570673 -0.056141 -0.053097 -0.178721 0.744189 0.114890 -0.658015 0.263661 0.612951 -0.040966 -0.049422 -0.160917 0.744189 0.114890 -0.658015 0.191410 0.590020 -0.053999 -0.068243 -0.178943 0.744189 0.114890 -0.658015 0.256240 0.570673 -0.056141 -0.053097 -0.178721 0.318008 0.837714 -0.443966 0.263661 0.612951 -0.079289 -0.027650 -0.147286 0.318008 0.837714 -0.443966 0.236930 0.764110 -0.040966 -0.049422 -0.160917 0.318008 0.837714 -0.443966 0.191410 0.590020 -0.040966 -0.049422 -0.160917 0.272144 0.807082 -0.523982 0.191410 0.590020 -0.079289 -0.027650 -0.147286 0.272144 0.807082 -0.523982 0.236930 0.764110 -0.051717 -0.030921 -0.138004 0.272144 0.807082 -0.523982 0.172420 0.668253 -0.051717 -0.030921 -0.138004 0.476749 0.660592 -0.579939 0.172420 0.668253 -0.025528 -0.015002 -0.098342 0.476749 0.660592 -0.579939 0.106645 0.656621 -0.024684 -0.048566 -0.135880 0.476749 0.660592 -0.579939 0.122524 0.566469 -0.071727 -0.047559 -0.197868 0.562916 0.794306 -0.228482 0.379059 0.666993 -0.079289 -0.027650 -0.147286 0.562916 0.794306 -0.228482 0.236930 0.764110 -0.056141 -0.053097 -0.178721 0.562916 0.794306 -0.228482 0.263661 0.612951 -0.053999 -0.068243 -0.178943 0.785684 0.046741 -0.616860 0.256240 0.570673 -0.040966 -0.049422 -0.160917 0.785684 0.046741 -0.616860 0.191410 0.590020 -0.032947 -0.077119 -0.152802 0.785684 0.046741 -0.616860 0.169058 0.522833 -0.040966 -0.049422 -0.160917 0.834235 0.081761 -0.545313 0.191410 0.590020 -0.024684 -0.048566 -0.135880 0.834235 0.081761 -0.545313 0.122524 0.566469 -0.032947 -0.077119 -0.152802 0.834235 0.081761 -0.545313 0.169058 0.522833 -0.040966 -0.049422 -0.160917 0.528082 0.764562 -0.369561 0.191410 0.590020 -0.051717 -0.030921 -0.138004 0.528082 0.764562 -0.369561 0.172420 0.668253 -0.024684 -0.048566 -0.135880 0.528082 0.764562 -0.369561 0.122524 0.566469 -0.034406 -0.085027 -0.138728 0.608441 -0.717136 -0.339875 0.133570 0.514180 -0.054913 -0.089177 -0.166683 0.608441 -0.717136 -0.339875 0.228820 0.514750 -0.032947 -0.077119 -0.152802 0.608441 -0.717136 -0.339875 0.169058 0.522833 -0.054913 -0.089177 -0.166683 0.637355 -0.409948 -0.652473 0.228820 0.514750 -0.053999 -0.068243 -0.178943 0.637355 -0.409948 -0.652473 0.256240 0.570673 -0.032947 -0.077119 -0.152802 0.637355 -0.409948 -0.652473 0.169058 0.522833 -0.034406 -0.085027 -0.138728 0.374905 -0.916591 -0.138950 0.133570 0.514180 -0.073474 -0.097069 -0.164703 0.374905 -0.916591 -0.138950 0.255890 0.486160 -0.054913 -0.089177 -0.166683 0.374905 -0.916591 -0.138950 0.228820 0.514750 -0.095526 -0.117518 -0.143070 0.512856 -0.820429 -0.252735 0.282049 0.406200 -0.102843 -0.103309 -0.204043 0.512856 -0.820429 -0.252735 0.415881 0.497320 -0.073474 -0.097069 -0.164703 0.512856 -0.820429 -0.252735 0.259420 0.472470 -0.073474 -0.097069 -0.164703 0.676644 -0.612992 -0.407913 0.259420 0.472470 -0.102843 -0.103309 -0.204043 0.676644 -0.612992 -0.407913 0.415881 0.497320 -0.072018 -0.074296 -0.196510 0.676644 -0.612992 -0.407913 0.361480 0.499110 -0.095526 -0.117518 -0.143070 0.236883 -0.939518 -0.247370 0.282049 0.406200 -0.124310 -0.115529 -0.178188 0.236883 -0.939518 -0.247370 0.421920 0.440600 -0.102843 -0.103309 -0.204043 0.236883 -0.939518 -0.247370 0.415881 0.497320 -0.102843 -0.103309 -0.204043 0.424966 -0.904694 0.030537 0.415881 0.497320 -0.151491 -0.126917 -0.226451 0.424966 -0.904694 0.030537 0.608100 0.477680 -0.142783 -0.123768 -0.254342 0.424966 -0.904694 0.030537 0.645660 0.519570 -0.168455 -0.131316 -0.250414 0.272706 -0.960063 -0.062537 0.689931 0.491150 -0.142754 -0.121434 -0.290047 0.272706 -0.960063 -0.062537 0.754360 0.554610 -0.142783 -0.123768 -0.254342 0.272706 -0.960063 -0.062537 0.645660 0.519570 -0.162641 -0.121335 -0.214932 -0.169057 -0.941215 0.292463 0.600580 0.452870 -0.168455 -0.131316 -0.250414 -0.169057 -0.941215 0.292463 0.689931 0.491150 -0.151491 -0.126917 -0.226451 -0.169057 -0.941215 0.292463 0.608100 0.477680 -0.168455 -0.131316 -0.250414 -0.250108 -0.920587 0.299941 0.689931 0.491150 -0.162641 -0.121335 -0.214932 -0.250108 -0.920587 0.299941 0.600580 0.452870 -0.192548 -0.119802 -0.235165 -0.250108 -0.920587 0.299941 0.712841 0.454750 -0.192548 -0.119802 -0.235165 -0.575113 -0.594797 0.561660 0.712841 0.454750 -0.175871 -0.092860 -0.189557 -0.575113 -0.594797 0.561660 0.559241 0.386500 -0.205504 -0.102593 -0.230207 -0.575113 -0.594797 0.561660 0.730051 0.431070 -0.205504 -0.102593 -0.230207 -0.813566 -0.099523 0.572892 0.730051 0.431070 -0.180305 -0.073818 -0.189423 -0.813566 -0.099523 0.572892 0.576059 0.350370 -0.204769 -0.059822 -0.221733 -0.813566 -0.099523 0.572892 0.717807 0.342718 -0.162641 -0.121335 -0.214932 -0.386754 -0.765893 0.513643 0.600580 0.452870 -0.161023 -0.105518 -0.190129 -0.386754 -0.765893 0.513643 0.528620 0.411331 -0.192548 -0.119802 -0.235165 -0.386754 -0.765893 0.513643 0.712841 0.454750 -0.161023 -0.105518 -0.190129 -0.521526 -0.637389 0.567226 0.528620 0.411331 -0.175871 -0.092860 -0.189557 -0.521526 -0.637389 0.567226 0.559241 0.386500 -0.192548 -0.119802 -0.235165 -0.521526 -0.637389 0.567226 0.712841 0.454750 -0.175871 -0.092860 -0.189557 -0.772734 -0.184209 0.607413 0.559241 0.386500 -0.180305 -0.073818 -0.189423 -0.772734 -0.184209 0.607413 0.576059 0.350370 -0.205504 -0.102593 -0.230207 -0.772734 -0.184209 0.607413 0.730051 0.431070 -0.180305 -0.073818 -0.189423 -0.797283 -0.000158 0.603606 0.576059 0.350370 -0.164097 -0.053186 -0.168009 -0.797283 -0.000158 0.603606 0.473341 0.291050 -0.204769 -0.059822 -0.221733 -0.797283 -0.000158 0.603606 0.717807 0.342718 -0.161023 -0.105518 -0.190129 -0.561833 -0.680306 0.470667 0.528620 0.411331 -0.158610 -0.087944 -0.161847 -0.561833 -0.680306 0.470667 0.443599 0.357970 -0.175871 -0.092860 -0.189557 -0.561833 -0.680306 0.470667 0.559241 0.386500 -0.175871 -0.092860 -0.189557 -0.816845 -0.194029 0.543248 0.559241 0.386500 -0.158610 -0.087944 -0.161847 -0.816845 -0.194029 0.543248 0.443599 0.357970 -0.180305 -0.073818 -0.189423 -0.816845 -0.194029 0.543248 0.576059 0.350370 -0.161023 -0.105518 -0.190129 -0.494924 -0.718494 0.488688 0.528620 0.411331 -0.129650 -0.099186 -0.149046 -0.494924 -0.718494 0.488688 0.350790 0.366940 -0.158610 -0.087944 -0.161847 -0.494924 -0.718494 0.488688 0.443599 0.357970 -0.158610 -0.087944 -0.161847 -0.818624 -0.229412 0.526522 0.443599 0.357970 -0.147506 -0.066233 -0.135123 -0.818624 -0.229412 0.526522 0.342009 0.305170 -0.180305 -0.073818 -0.189423 -0.818624 -0.229412 0.526522 0.576059 0.350370 -0.180305 -0.073818 -0.189423 -0.854780 0.158605 0.494161 0.576059 0.350370 -0.147506 -0.066233 -0.135123 -0.854780 0.158605 0.494161 0.342009 0.305170 -0.164097 -0.053186 -0.168009 -0.854780 0.158605 0.494161 0.473341 0.291050 -0.147506 -0.066233 -0.135123 -0.801007 0.294772 0.521054 0.342009 0.305170 -0.140091 -0.047694 -0.134212 -0.801007 0.294772 0.521054 0.319526 0.270466 -0.164097 -0.053186 -0.168009 -0.801007 0.294772 0.521054 0.473341 0.291050 -0.140091 -0.047694 -0.134212 -0.624110 0.709123 0.328073 0.319526 0.270466 -0.147443 -0.045298 -0.153377 -0.624110 0.709123 0.328073 0.381480 0.262520 -0.164097 -0.053186 -0.168009 -0.624110 0.709123 0.328073 0.473341 0.291050 -0.175397 -0.029894 -0.208187 -0.687990 0.526958 0.498984 0.596889 0.253480 -0.164097 -0.053186 -0.168009 -0.687990 0.526958 0.498984 0.473341 0.291050 -0.147443 -0.045298 -0.153377 -0.687990 0.526958 0.498984 0.381480 0.262520 -0.164097 -0.053186 -0.168009 -0.723318 0.489391 0.487142 0.473341 0.291050 -0.175397 -0.029894 -0.208187 -0.723318 0.489391 0.487142 0.596889 0.253480 -0.204769 -0.059822 -0.221733 -0.723318 0.489391 0.487142 0.717807 0.342718 -0.175397 -0.029894 -0.208187 -0.741902 0.563983 0.362636 0.596889 0.253480 -0.169827 -0.013664 -0.222033 -0.741902 0.563983 0.362636 0.587758 0.225680 -0.204769 -0.059822 -0.221733 -0.741902 0.563983 0.362636 0.717807 0.342718 -0.102843 -0.103309 -0.204043 0.519801 -0.853827 0.028033 0.415881 0.497320 -0.124310 -0.115529 -0.178188 0.519801 -0.853827 0.028033 0.421920 0.440600 -0.123395 -0.115491 -0.193997 0.519801 -0.853827 0.028033 0.457371 0.460770 -0.102843 -0.103309 -0.204043 0.471050 -0.876510 -0.099206 0.415881 0.497320 -0.123395 -0.115491 -0.193997 0.471050 -0.876510 -0.099206 0.457371 0.460770 -0.151491 -0.126917 -0.226451 0.471050 -0.876510 -0.099206 0.608100 0.477680 -0.124310 -0.115529 -0.178188 -0.059584 -0.998206 -0.005848 0.421920 0.440600 -0.139576 -0.114521 -0.194705 -0.059584 -0.998206 -0.005848 0.499065 0.446365 -0.123395 -0.115491 -0.193997 -0.059584 -0.998206 -0.005848 0.457371 0.460770 -0.123395 -0.115491 -0.193997 -0.072024 -0.919631 0.386125 0.457371 0.460770 -0.139576 -0.114521 -0.194705 -0.072024 -0.919631 0.386125 0.499065 0.446365 -0.151491 -0.126917 -0.226451 -0.072024 -0.919631 0.386125 0.608100 0.477680 -0.139576 -0.114521 -0.194705 -0.064537 -0.921118 0.383896 0.499065 0.446365 -0.162641 -0.121335 -0.214932 -0.064537 -0.921118 0.383896 0.600580 0.452870 -0.151491 -0.126917 -0.226451 -0.064537 -0.921118 0.383896 0.608100 0.477680 -0.139576 -0.114521 -0.194705 -0.227822 -0.814171 0.534063 0.499065 0.446365 -0.161023 -0.105518 -0.190129 -0.227822 -0.814171 0.534063 0.528620 0.411331 -0.162641 -0.121335 -0.214932 -0.227822 -0.814171 0.534063 0.600580 0.452870 -0.129650 -0.099186 -0.149046 -0.294368 -0.884819 0.361169 0.350790 0.366940 -0.161023 -0.105518 -0.190129 -0.294368 -0.884819 0.361169 0.528620 0.411331 -0.139576 -0.114521 -0.194705 -0.294368 -0.884819 0.361169 0.499065 0.446365 -0.095526 -0.117518 -0.143070 -0.489842 -0.795621 0.356430 0.282049 0.406200 -0.129650 -0.099186 -0.149046 -0.489842 -0.795621 0.356430 0.350790 0.366940 -0.124310 -0.115529 -0.178188 -0.489842 -0.795621 0.356430 0.421920 0.440600 -0.168455 -0.131316 -0.250414 0.279015 -0.960051 -0.021281 0.689931 0.491150 -0.142783 -0.123768 -0.254342 0.279015 -0.960051 -0.021281 0.645660 0.519570 -0.151491 -0.126917 -0.226451 0.279015 -0.960051 -0.021281 0.608100 0.477680 -0.175397 -0.029894 -0.208187 -0.578082 0.635273 0.512102 0.596889 0.253480 -0.137006 -0.024205 -0.171907 -0.578082 0.635273 0.512102 0.365560 0.214520 -0.169827 -0.013664 -0.222033 -0.578082 0.635273 0.512102 0.587758 0.225680 -0.169827 -0.013664 -0.222033 -0.272387 0.890056 0.365521 0.587758 0.225680 -0.137006 -0.024205 -0.171907 -0.272387 0.890056 0.365521 0.365560 0.214520 -0.113704 -0.014641 -0.177831 -0.272387 0.890056 0.365521 0.380571 0.208017 -0.175397 -0.029894 -0.208187 -0.549633 0.688114 0.473712 0.596889 0.253480 -0.147443 -0.045298 -0.153377 -0.549633 0.688114 0.473712 0.381480 0.262520 -0.137006 -0.024205 -0.171907 -0.549633 0.688114 0.473712 0.365560 0.214520 -0.147443 -0.045298 -0.153377 -0.686218 0.641229 0.343410 0.381480 0.262520 -0.140091 -0.047694 -0.134212 -0.686218 0.641229 0.343410 0.319526 0.270466 -0.137006 -0.024205 -0.171907 -0.686218 0.641229 0.343410 0.365560 0.214520 -0.095276 -0.068078 -0.064566 -0.488904 -0.747201 0.450181 0.130968 0.286588 -0.133343 -0.079854 -0.125453 -0.488904 -0.747201 0.450181 0.293109 0.318900 -0.089139 -0.098688 -0.108707 -0.488904 -0.747201 0.450181 0.188060 0.358130 -0.133343 -0.079854 -0.125453 -0.493067 -0.709186 0.503924 0.293109 0.318900 -0.129650 -0.099186 -0.149046 -0.493067 -0.709186 0.503924 0.350790 0.366940 -0.089139 -0.098688 -0.108707 -0.493067 -0.709186 0.503924 0.188060 0.358130 -0.029661 -0.072947 -0.026017 -0.402720 -0.693022 0.597944 0.040560 0.331810 -0.016507 -0.053189 0.005742 -0.402720 -0.693022 0.597944 0.082710 0.266979 -0.095276 -0.068078 -0.064566 -0.402720 -0.693022 0.597944 0.130968 0.286588 -0.095276 -0.068078 -0.064566 -0.529318 -0.485446 0.695819 0.130968 0.286588 -0.016507 -0.053189 0.005742 -0.529318 -0.485446 0.695819 0.082710 0.266979 -0.077178 -0.040515 -0.031569 -0.529318 -0.485446 0.695819 0.101726 0.254639 -0.095276 -0.068078 -0.064566 -0.636433 -0.383377 0.669309 0.130968 0.286588 -0.077178 -0.040515 -0.031569 -0.636433 -0.383377 0.669309 0.101726 0.254639 -0.117000 -0.054747 -0.077587 -0.636433 -0.383377 0.669309 0.163450 0.270300 -0.117000 -0.054747 -0.077587 -0.737679 -0.096543 0.668213 0.163450 0.270300 -0.077178 -0.040515 -0.031569 -0.737679 -0.096543 0.668213 0.101726 0.254639 -0.094869 -0.027848 -0.049269 -0.737679 -0.096543 0.668213 0.131870 0.234050 -0.029661 -0.072947 -0.026017 0.012096 -0.951483 0.307463 0.040560 0.331810 -0.069241 -0.093206 -0.087154 0.012096 -0.951483 0.307463 0.131630 0.354850 -0.012845 -0.075192 -0.033626 0.012096 -0.951483 0.307463 0.064239 0.351802 -0.069241 -0.093206 -0.087154 -0.000226 -0.917027 0.398825 0.131630 0.354850 -0.095526 -0.117518 -0.143070 -0.000226 -0.917027 0.398825 0.282049 0.406200 -0.047403 -0.100711 -0.104398 -0.000226 -0.917027 0.398825 0.159656 0.410770 -0.095276 -0.068078 -0.064566 -0.329351 -0.796728 0.506708 0.130968 0.286588 -0.089139 -0.098688 -0.108707 -0.329351 -0.796728 0.506708 0.188060 0.358130 -0.069241 -0.093206 -0.087154 -0.329351 -0.796728 0.506708 0.131630 0.354850 -0.069241 -0.093206 -0.087154 -0.320327 -0.804401 0.500329 0.131630 0.354850 -0.089139 -0.098688 -0.108707 -0.320327 -0.804401 0.500329 0.188060 0.358130 -0.095526 -0.117518 -0.143070 -0.320327 -0.804401 0.500329 0.282049 0.406200 -0.029661 -0.072947 -0.026017 -0.347068 -0.799819 0.489728 0.040560 0.331810 -0.095276 -0.068078 -0.064566 -0.347068 -0.799819 0.489728 0.130968 0.286588 -0.069241 -0.093206 -0.087154 -0.347068 -0.799819 0.489728 0.131630 0.354850 -0.129650 -0.099186 -0.149046 -0.454677 -0.809791 0.370820 0.350790 0.366940 -0.139576 -0.114521 -0.194705 -0.454677 -0.809791 0.370820 0.499065 0.446365 -0.124310 -0.115529 -0.178188 -0.454677 -0.809791 0.370820 0.421920 0.440600 -0.100711 -0.017457 -0.071205 -0.440118 0.897938 0.001620 0.143802 0.982094 -0.082414 -0.008469 -0.082211 -0.440118 0.897938 0.001620 0.147348 0.905596 -0.107972 -0.020968 -0.097765 -0.440118 0.897938 0.001620 0.209280 0.974420 -0.045772 -0.006289 -0.019566 -0.515516 0.712087 0.476629 0.000000 0.000000 -0.070686 -0.013774 -0.035330 -0.515516 0.712087 0.476629 1.000000 1.000000 -0.060966 -0.016531 -0.020698 -0.515516 0.712087 0.476629 1.000000 0.000000 -0.045772 -0.006289 -0.019566 -0.515529 0.712052 0.476667 0.000000 0.000000 -0.080407 -0.011017 -0.049962 -0.515529 0.712052 0.476667 1.000000 0.000000 -0.070686 -0.013774 -0.035330 -0.515529 0.712052 0.476667 1.000000 1.000000 -0.042958 -0.003989 -0.023216 -0.365347 0.888354 0.278117 0.000000 0.000000 -0.080407 -0.011017 -0.049962 -0.365347 0.888354 0.278117 1.000000 1.000000 -0.045772 -0.006289 -0.019566 -0.365347 0.888354 0.278117 1.000000 0.000000 -0.042958 -0.003989 -0.023216 -0.264898 0.956846 0.119474 0.000000 0.000000 -0.064116 -0.005870 -0.055063 -0.264898 0.956846 0.119474 1.000000 1.000000 -0.080407 -0.011017 -0.049962 -0.264898 0.956846 0.119474 1.000000 0.000000 -0.045772 -0.006289 -0.019566 -0.536799 0.754638 0.377317 0.000000 0.000000 -0.060966 -0.016531 -0.020698 -0.536799 0.754638 0.377317 1.000000 1.000000 -0.041213 -0.007368 -0.010922 -0.536799 0.754638 0.377317 1.000000 0.000000 -0.041213 -0.007368 -0.010922 -0.561355 0.562765 0.606775 0.000000 0.000000 -0.060966 -0.016531 -0.020698 -0.561355 0.562765 0.606775 1.000000 0.000000 -0.045510 -0.018062 -0.004979 -0.561355 0.562765 0.606775 1.000000 1.000000 -0.038985 -0.007852 -0.007374 -0.673320 0.546990 0.497435 0.000000 0.000000 -0.041213 -0.007368 -0.010922 -0.673320 0.546990 0.497435 1.000000 0.000000 -0.045510 -0.018062 -0.004979 -0.673320 0.546990 0.497435 1.000000 1.000000 -0.038985 -0.007852 -0.007374 -0.640237 0.537824 0.548491 0.000000 0.000000 -0.045510 -0.018062 -0.004979 -0.640237 0.537824 0.548491 1.000000 1.000000 -0.031328 -0.009383 0.003065 -0.640237 0.537824 0.548491 1.000000 0.000000 -0.031328 -0.009383 0.003065 -0.627779 0.416148 0.657810 0.000000 0.000000 -0.045510 -0.018062 -0.004979 -0.627779 0.416148 0.657810 1.000000 1.000000 -0.030055 -0.019593 0.010739 -0.627779 0.416148 0.657810 1.000000 0.000000 -0.031328 -0.009383 0.003065 -0.541170 0.461086 0.703232 0.000000 0.000000 -0.030055 -0.019593 0.010739 -0.541170 0.461086 0.703232 1.000000 1.000000 -0.024969 -0.006524 0.006084 -0.541170 0.461086 0.703232 1.000000 0.000000 0.005457 0.003922 0.021488 -0.480042 0.796582 0.367447 0.000000 0.000000 -0.003050 0.001094 0.016505 -0.480042 0.796582 0.367447 1.000000 0.000000 -0.003552 -0.007667 0.034842 -0.480042 0.796582 0.367447 1.000000 1.000000 0.005457 0.003922 0.021488 -0.615744 0.751523 0.236795 0.000000 0.000000 -0.003552 -0.007667 0.034842 -0.615744 0.751523 0.236795 1.000000 0.000000 0.012243 0.001958 0.045367 -0.615744 0.751523 0.236795 1.000000 1.000000 0.005457 0.003922 0.021488 -0.318409 0.933086 0.167231 0.000000 0.000000 0.012243 0.001958 0.045367 -0.318409 0.933086 0.167231 1.000000 1.000000 0.017288 0.006507 0.029591 -0.318409 0.933086 0.167231 1.000000 0.000000 0.025400 0.008882 0.035581 -0.374675 0.915863 0.144271 0.000000 0.000000 0.017288 0.006507 0.029591 -0.374675 0.915863 0.144271 1.000000 0.000000 0.012243 0.001958 0.045367 -0.374675 0.915863 0.144271 1.000000 1.000000 0.025400 0.008882 0.035581 -0.494629 0.867597 -0.051154 0.000000 0.000000 0.012243 0.001958 0.045367 -0.494629 0.867597 -0.051154 1.000000 1.000000 0.028037 0.011583 0.055893 -0.494629 0.867597 -0.051154 1.000000 0.000000 0.025400 0.008882 0.035581 -0.265878 0.959503 -0.093073 0.000000 0.000000 0.028037 0.011583 0.055893 -0.265878 0.959503 -0.093073 1.000000 1.000000 0.028559 0.009976 0.037835 -0.265878 0.959503 -0.093073 1.000000 0.000000 0.028559 0.009976 0.037835 -0.116648 0.988960 -0.091381 0.000000 0.000000 0.028037 0.011583 0.055893 -0.116648 0.988960 -0.091381 1.000000 0.000000 0.036877 0.011536 0.044100 -0.116648 0.988960 -0.091381 1.000000 1.000000 0.028559 0.009976 0.037835 -0.087429 0.987671 -0.129854 0.000000 0.000000 0.036877 0.011536 0.044100 -0.087429 0.987671 -0.129854 1.000000 1.000000 0.031086 0.009975 0.036126 -0.087429 0.987671 -0.129854 1.000000 0.000000 0.037350 0.010384 0.030379 -0.110824 0.990030 -0.086942 0.000000 0.000000 0.036877 0.011536 0.044100 -0.110824 0.990030 -0.086942 1.000000 1.000000 0.045717 0.011490 0.032308 -0.110824 0.990030 -0.086942 1.000000 0.000000 0.031086 0.009975 0.036126 -0.144849 0.985556 -0.087740 0.000000 0.000000 0.036877 0.011536 0.044100 -0.144849 0.985556 -0.087740 1.000000 1.000000 0.037350 0.010384 0.030379 -0.144849 0.985556 -0.087740 1.000000 0.000000 0.040411 0.009454 0.028108 -0.026287 0.912167 -0.408975 0.000000 0.000000 0.037350 0.010384 0.030379 -0.026287 0.912167 -0.408975 1.000000 0.000000 0.045717 0.011490 0.032308 -0.026287 0.912167 -0.408975 1.000000 1.000000 0.048486 0.003959 0.022397 0.143885 0.806883 -0.572920 0.000000 0.000000 0.040411 0.009454 0.028108 0.143885 0.806883 -0.572920 1.000000 0.000000 0.045717 0.011490 0.032308 0.143885 0.806883 -0.572920 1.000000 1.000000 0.055057 -0.002370 0.018595 0.420243 0.711610 -0.563034 0.000000 0.000000 0.052980 -0.000209 0.019776 0.420243 0.711610 -0.563034 1.000000 0.000000 0.063030 -0.001161 0.026074 0.420243 0.711610 -0.563034 1.000000 1.000000 0.055057 -0.002370 0.018595 0.368501 0.772161 -0.517663 0.000000 0.000000 0.063030 -0.001161 0.026074 0.368501 0.772161 -0.517663 1.000000 0.000000 0.050502 -0.009120 0.005284 0.368501 0.772161 -0.517663 1.000000 1.000000 0.055057 -0.002370 0.018595 0.709834 0.499780 -0.496342 0.000000 0.000000 0.050502 -0.009120 0.005284 0.709834 0.499780 -0.496342 1.000000 1.000000 0.050963 -0.002376 0.012734 0.709834 0.499780 -0.496342 1.000000 0.000000 0.050963 -0.002376 0.012734 0.698510 0.508482 -0.503519 0.000000 0.000000 0.050502 -0.009120 0.005284 0.698510 0.508482 -0.503519 1.000000 1.000000 0.042826 -0.002162 0.001662 0.698510 0.508482 -0.503519 1.000000 0.000000 0.042826 -0.002162 0.001662 0.700957 0.518210 -0.490018 0.000000 0.000000 0.050502 -0.009120 0.005284 0.700957 0.518210 -0.490018 1.000000 0.000000 0.040124 -0.009825 -0.010307 0.700957 0.518210 -0.490018 1.000000 1.000000 0.037686 -0.002161 -0.005301 0.676497 0.541338 -0.499304 0.000000 0.000000 0.042826 -0.002162 0.001662 0.676497 0.541338 -0.499304 1.000000 0.000000 0.040124 -0.009825 -0.010307 0.676497 0.541338 -0.499304 1.000000 1.000000 0.037686 -0.002161 -0.005301 0.691229 0.536271 -0.484372 0.000000 0.000000 0.040124 -0.009825 -0.010307 0.691229 0.536271 -0.484372 1.000000 1.000000 0.029745 -0.010530 -0.025899 0.691229 0.536271 -0.484372 1.000000 0.000000 0.037686 -0.002161 -0.005301 0.544411 0.682763 -0.487290 0.000000 0.000000 0.029745 -0.010530 -0.025899 0.544411 0.682763 -0.487290 1.000000 1.000000 0.026633 -0.001955 -0.017361 0.544411 0.682763 -0.487290 1.000000 0.000000 0.026633 -0.001955 -0.017361 0.612689 0.658097 -0.437631 0.000000 0.000000 0.029745 -0.010530 -0.025899 0.612689 0.658097 -0.437631 1.000000 0.000000 0.019367 -0.011236 -0.041490 0.612689 0.658097 -0.437631 1.000000 1.000000 0.026633 -0.001955 -0.017361 0.419944 0.797484 -0.433204 0.000000 0.000000 0.019367 -0.011236 -0.041490 0.419944 0.797484 -0.433204 1.000000 1.000000 0.018301 -0.002420 -0.026294 0.419944 0.797484 -0.433204 1.000000 0.000000 0.018301 -0.002420 -0.026294 0.310508 0.831512 -0.460622 0.000000 0.000000 0.019367 -0.011236 -0.041490 0.310508 0.831512 -0.460622 1.000000 1.000000 0.010551 -0.002935 -0.032448 0.310508 0.831512 -0.460622 1.000000 0.000000 0.010551 -0.002935 -0.032448 0.442964 0.832609 -0.332483 0.000000 0.000000 0.019367 -0.011236 -0.041490 0.442964 0.832609 -0.332483 1.000000 1.000000 0.008989 -0.011941 -0.057082 0.442964 0.832609 -0.332483 1.000000 0.000000 0.010551 -0.002935 -0.032448 0.230950 0.908997 -0.346967 0.000000 0.000000 0.008989 -0.011941 -0.057082 0.230950 0.908997 -0.346967 1.000000 1.000000 0.002911 -0.002986 -0.037667 0.230950 0.908997 -0.346967 1.000000 0.000000 0.002911 -0.002986 -0.037667 0.251867 0.906368 -0.339205 0.000000 0.000000 0.008989 -0.011941 -0.057082 0.251867 0.906368 -0.339205 1.000000 1.000000 -0.004764 -0.002641 -0.042444 0.251867 0.906368 -0.339205 1.000000 0.000000 -0.004764 -0.002641 -0.042444 0.286681 0.907444 -0.307180 0.000000 0.000000 0.008989 -0.011941 -0.057082 0.286681 0.907444 -0.307180 1.000000 0.000000 -0.008270 -0.013472 -0.077712 0.286681 0.907444 -0.307180 1.000000 1.000000 -0.014017 -0.001829 -0.047775 0.257267 0.916287 -0.306972 0.000000 0.000000 -0.004764 -0.002641 -0.042444 0.257267 0.916287 -0.306972 1.000000 0.000000 -0.008270 -0.013472 -0.077712 0.257267 0.916287 -0.306972 1.000000 1.000000 -0.014017 -0.001829 -0.047775 0.279052 0.911860 -0.301068 0.000000 0.000000 -0.008270 -0.013472 -0.077712 0.279052 0.911860 -0.301068 1.000000 1.000000 -0.025528 -0.015002 -0.098342 0.279052 0.911860 -0.301068 1.000000 0.000000 -0.014017 -0.001829 -0.047775 0.106410 0.959588 -0.260514 0.000000 0.000000 -0.036677 -0.007862 -0.079253 0.106410 0.959588 -0.260514 1.000000 1.000000 -0.020227 0.000071 -0.043313 0.106410 0.959588 -0.260514 1.000000 0.000000 -0.014017 -0.001829 -0.047775 0.133057 0.951290 -0.278106 0.000000 0.000000 -0.025528 -0.015002 -0.098342 0.133057 0.951290 -0.278106 1.000000 0.000000 -0.036677 -0.007862 -0.079253 0.133057 0.951290 -0.278106 1.000000 1.000000 -0.020227 0.000071 -0.043313 0.140005 0.951457 -0.274096 0.000000 0.000000 -0.036677 -0.007862 -0.079253 0.140005 0.951457 -0.274096 1.000000 1.000000 -0.047826 -0.000722 -0.060163 0.140005 0.951457 -0.274096 1.000000 0.000000 -0.026591 0.001059 -0.038391 0.051904 0.989943 -0.131603 0.000000 0.000000 -0.020227 0.000071 -0.043313 0.051904 0.989943 -0.131603 1.000000 0.000000 -0.047826 -0.000722 -0.060163 0.051904 0.989943 -0.131603 1.000000 1.000000 -0.026591 0.001059 -0.038391 -0.038404 0.998284 -0.044205 0.000000 0.000000 -0.047826 -0.000722 -0.060163 -0.038404 0.998284 -0.044205 1.000000 1.000000 -0.030314 0.001072 -0.034863 -0.038404 0.998284 -0.044205 1.000000 0.000000 -0.034613 -0.000049 -0.031344 -0.212069 0.975881 0.051798 0.000000 0.000000 -0.030314 0.001072 -0.034863 -0.212069 0.975881 0.051798 1.000000 0.000000 -0.055971 -0.003296 -0.057613 -0.212069 0.975881 0.051798 1.000000 1.000000 -0.030314 0.001072 -0.034863 -0.266010 0.956932 0.116270 0.000000 0.000000 -0.047826 -0.000722 -0.060163 -0.266010 0.956932 0.116270 1.000000 0.000000 -0.055971 -0.003296 -0.057613 -0.266010 0.956932 0.116270 1.000000 1.000000 -0.038250 -0.001447 -0.027644 -0.267589 0.958424 0.099096 0.000000 0.000000 -0.034613 -0.000049 -0.031344 -0.267589 0.958424 0.099096 1.000000 0.000000 -0.055971 -0.003296 -0.057613 -0.267589 0.958424 0.099096 1.000000 1.000000 -0.038250 -0.001447 -0.027644 -0.270871 0.957291 0.101107 0.000000 0.000000 -0.055971 -0.003296 -0.057613 -0.270871 0.957291 0.101107 1.000000 1.000000 -0.064116 -0.005870 -0.055063 -0.270871 0.957291 0.101107 1.000000 0.000000 -0.038250 -0.001447 -0.027644 -0.339058 0.925165 0.170615 0.000000 0.000000 -0.064116 -0.005870 -0.055063 -0.339058 0.925165 0.170615 1.000000 1.000000 -0.042958 -0.003989 -0.023216 -0.339058 0.925165 0.170615 1.000000 0.000000 -0.024969 -0.006524 0.006084 -0.700964 0.465309 0.540497 0.000000 0.000000 -0.030055 -0.019593 0.010739 -0.700964 0.465309 0.540497 1.000000 0.000000 -0.023429 -0.016611 0.016765 -0.700964 0.465309 0.540497 1.000000 1.000000 -0.019299 -0.004036 0.008727 -0.539148 0.572132 0.618049 0.000000 0.000000 -0.024969 -0.006524 0.006084 -0.539148 0.572132 0.618049 1.000000 0.000000 -0.023429 -0.016611 0.016765 -0.539148 0.572132 0.618049 1.000000 1.000000 -0.012031 -0.001713 0.012042 -0.484270 0.578566 0.656311 0.000000 0.000000 -0.019299 -0.004036 0.008727 -0.484270 0.578566 0.656311 1.000000 0.000000 -0.023429 -0.016611 0.016765 -0.484270 0.578566 0.656311 1.000000 1.000000 -0.012031 -0.001713 0.012042 -0.657173 0.632668 0.409701 0.000000 0.000000 -0.023429 -0.016611 0.016765 -0.657173 0.632668 0.409701 1.000000 1.000000 -0.016803 -0.013630 0.022790 -0.657173 0.632668 0.409701 1.000000 0.000000 -0.006243 0.000018 0.014676 -0.460670 0.689048 0.559460 0.000000 0.000000 -0.012031 -0.001713 0.012042 -0.460670 0.689048 0.559460 1.000000 0.000000 -0.016803 -0.013630 0.022790 -0.460670 0.689048 0.559460 1.000000 1.000000 -0.006243 0.000018 0.014676 -0.629542 0.694363 0.348620 0.000000 0.000000 -0.016803 -0.013630 0.022790 -0.629542 0.694363 0.348620 1.000000 1.000000 -0.003552 -0.007667 0.034842 -0.629542 0.694363 0.348620 1.000000 0.000000 -0.006243 0.000018 0.014676 -0.479183 0.796996 0.367668 0.000000 0.000000 -0.003552 -0.007667 0.034842 -0.479183 0.796996 0.367668 1.000000 1.000000 -0.003050 0.001094 0.016505 -0.479183 0.796996 0.367668 1.000000 0.000000 0.052980 -0.000209 0.019776 0.444707 0.768639 -0.459815 0.000000 0.000000 0.048486 0.003959 0.022397 0.444707 0.768639 -0.459815 1.000000 0.000000 0.045717 0.011490 0.032308 0.444707 0.768639 -0.459815 1.000000 1.000000 0.052980 -0.000209 0.019776 0.386545 0.775200 -0.499648 0.000000 0.000000 0.045717 0.011490 0.032308 0.386545 0.775200 -0.499648 1.000000 0.000000 0.063030 -0.001161 0.026074 0.386545 0.775200 -0.499648 1.000000 1.000000 0.053360 0.088072 0.187479 -0.745121 -0.286945 0.602044 0.322451 0.094662 0.048824 0.075798 0.176015 -0.745121 -0.286945 0.602044 0.338641 0.110258 0.060302 0.081476 0.192927 -0.745121 -0.286945 0.602044 0.310308 0.088773 0.048824 0.075798 0.176015 -0.916966 0.394495 -0.059550 0.338641 0.110258 0.053360 0.088072 0.187479 -0.916966 0.394495 -0.059550 0.322451 0.094662 0.053192 0.085858 0.175399 -0.916966 0.394495 -0.059550 0.335220 0.101700 -0.100711 -0.017457 -0.071205 -0.665292 0.590463 0.456881 0.966166 0.212554 -0.094869 -0.027848 -0.049269 -0.665292 0.590463 0.456881 0.952723 0.231841 -0.080407 -0.011017 -0.049962 -0.665292 0.590463 0.456881 0.934786 0.219472 -0.080407 -0.011017 -0.049962 -0.629837 0.563209 0.534884 0.934786 0.219472 -0.094869 -0.027848 -0.049269 -0.629837 0.563209 0.534884 0.952723 0.231841 -0.071377 -0.019477 -0.030421 -0.629837 0.563209 0.534884 0.889548 0.226645 -0.094869 -0.027848 -0.049269 -0.649287 0.138224 0.747877 0.952723 0.231841 -0.077178 -0.040515 -0.031569 -0.649287 0.138224 0.747877 0.899208 0.251069 -0.071377 -0.019477 -0.030421 -0.649287 0.138224 0.747877 0.889548 0.226645 -0.071377 -0.019477 -0.030421 -0.697333 0.154085 0.699989 0.889548 0.226645 -0.077178 -0.040515 -0.031569 -0.697333 0.154085 0.699989 0.899208 0.251069 -0.060966 -0.016531 -0.020698 -0.697333 0.154085 0.699989 0.847640 0.236770 -0.077178 -0.040515 -0.031569 -0.673515 0.125054 0.728518 0.899208 0.251069 -0.030500 -0.033141 0.010319 -0.673515 0.125054 0.728518 0.740681 0.264800 -0.060966 -0.016531 -0.020698 -0.673515 0.125054 0.728518 0.847640 0.236770 -0.030500 -0.033141 0.010319 -0.613359 -0.556141 0.560800 0.740681 0.264800 -0.016507 -0.053189 0.005742 -0.613359 -0.556141 0.560800 0.718071 0.309760 -0.001950 -0.040273 0.034472 -0.613359 -0.556141 0.560800 0.643033 0.298300 -0.077178 -0.040515 -0.031569 -0.523697 -0.519646 0.675062 0.899208 0.251069 -0.016507 -0.053189 0.005742 -0.523697 -0.519646 0.675062 0.718071 0.309760 -0.030500 -0.033141 0.010319 -0.523697 -0.519646 0.675062 0.740681 0.264800 0.009464 -0.061640 0.000422 -0.181614 -0.859215 0.478294 0.670646 0.372138 -0.001950 -0.040273 0.034472 -0.181614 -0.859215 0.478294 0.643033 0.298300 -0.016507 -0.053189 0.005742 -0.181614 -0.859215 0.478294 0.718071 0.309760 0.009464 -0.061640 0.000422 -0.227359 -0.857354 0.461792 0.670646 0.372138 0.031230 -0.028204 0.073215 -0.227359 -0.857354 0.461792 0.513823 0.299301 -0.001950 -0.040273 0.034472 -0.227359 -0.857354 0.461792 0.643033 0.298300 -0.001950 -0.040273 0.034472 -0.691545 -0.419585 0.587975 0.643033 0.298300 -0.001327 -0.021202 0.048814 -0.691545 -0.419585 0.587975 0.618682 0.273535 -0.023862 -0.025303 0.019383 -0.691545 -0.419585 0.587975 0.712310 0.264110 -0.001327 -0.021202 0.048814 -0.750619 0.410812 0.517497 0.618682 0.273535 -0.003552 -0.007667 0.034842 -0.750619 0.410812 0.517497 0.647650 0.255020 -0.023862 -0.025303 0.019383 -0.750619 0.410812 0.517497 0.712310 0.264110 -0.001327 -0.021202 0.048814 -0.839834 0.316908 0.440737 0.618682 0.273535 0.016955 -0.004583 0.071701 -0.839834 0.316908 0.440737 0.548534 0.263306 -0.003552 -0.007667 0.034842 -0.839834 0.316908 0.440737 0.647650 0.255020 0.016955 -0.004583 0.071701 -0.726514 0.460848 0.509702 0.548534 0.263306 0.029876 -0.001883 0.087677 -0.726514 0.460848 0.509702 0.498770 0.268030 0.034158 0.013303 0.080050 -0.726514 0.460848 0.509702 0.513733 0.250058 0.043933 -0.002318 0.113530 -0.668360 -0.655072 0.352384 0.426570 0.255980 0.034355 0.014456 0.126546 -0.668360 -0.655072 0.352384 0.427820 0.215940 0.029876 -0.001883 0.087677 -0.668360 -0.655072 0.352384 0.498770 0.268030 0.029876 -0.001883 0.087677 -0.838913 -0.460432 0.290218 0.498770 0.268030 0.034355 0.014456 0.126546 -0.838913 -0.460432 0.290218 0.427820 0.215940 0.027702 0.029101 0.130549 -0.838913 -0.460432 0.290218 0.434330 0.198350 0.027702 0.029101 0.130549 -0.991845 -0.023218 -0.125317 0.434330 0.198350 0.027156 0.044410 0.132034 -0.991845 -0.023218 -0.125317 0.437699 0.188555 0.030087 0.039882 0.109675 -0.991845 -0.023218 -0.125317 0.470850 0.222740 0.034355 0.014456 0.126546 -0.785511 -0.467636 0.405326 0.427820 0.215940 0.033561 0.031491 0.144661 -0.785511 -0.467636 0.405326 0.402106 0.187773 0.027702 0.029101 0.130549 -0.785511 -0.467636 0.405326 0.434330 0.198350 0.033561 0.031491 0.144661 -0.916944 -0.070794 0.392685 0.402106 0.187773 0.027156 0.044410 0.132034 -0.916944 -0.070794 0.392685 0.437699 0.188555 0.027702 0.029101 0.130549 -0.916944 -0.070794 0.392685 0.434330 0.198350 0.033561 0.031491 0.144661 -0.940232 -0.189813 0.282727 0.402106 0.187773 0.031436 0.049052 0.149384 -0.940232 -0.189813 0.282727 0.399565 0.167196 0.027156 0.044410 0.132034 -0.940232 -0.189813 0.282727 0.437699 0.188555 0.027156 0.044410 0.132034 -0.864752 0.495672 0.080705 0.437699 0.188555 0.031436 0.049052 0.149384 -0.864752 0.495672 0.080705 0.399565 0.167196 0.042691 0.068252 0.152059 -0.864752 0.495672 0.080705 0.431340 0.169670 0.031436 0.049052 0.149384 -0.828294 0.515973 -0.218405 0.399565 0.167196 0.036733 0.065820 0.168909 -0.828294 0.515973 -0.218405 0.369148 0.127941 0.042691 0.068252 0.152059 -0.828294 0.515973 -0.218405 0.395810 0.143320 0.031436 0.049052 0.149384 -0.720002 -0.417785 0.554124 0.399565 0.167196 0.041507 0.041081 0.156460 -0.720002 -0.417785 0.554124 0.365580 0.162280 0.036733 0.065820 0.168909 -0.720002 -0.417785 0.554124 0.369148 0.127941 0.036733 0.065820 0.168909 -0.470592 -0.467407 0.748380 0.369148 0.127941 0.041507 0.041081 0.156460 -0.470592 -0.467407 0.748380 0.365580 0.162280 0.053331 0.064539 0.178546 -0.470592 -0.467407 0.748380 0.324280 0.113570 0.054500 0.046985 0.157414 0.334482 -0.813087 0.476457 0.327890 0.162200 0.057856 0.057044 0.172224 0.334482 -0.813087 0.476457 0.313070 0.128910 0.041507 0.041081 0.156460 0.334482 -0.813087 0.476457 0.365580 0.162280 0.041507 0.041081 0.156460 -0.065725 -0.666251 0.742826 0.365580 0.162280 0.057856 0.057044 0.172224 -0.065725 -0.666251 0.742826 0.313070 0.128910 0.053331 0.064539 0.178546 -0.065725 -0.666251 0.742826 0.324280 0.113570 0.057856 0.057044 0.172224 -0.004204 -0.646233 0.763129 0.313070 0.128910 0.060302 0.081476 0.192927 -0.004204 -0.646233 0.763129 0.299460 0.087742 0.053331 0.064539 0.178546 -0.004204 -0.646233 0.763129 0.309980 0.099810 0.057856 0.057044 0.172224 0.038133 -0.648233 0.760487 0.313070 0.128910 0.072808 0.072316 0.184492 0.038133 -0.648233 0.760487 0.284679 0.109697 0.060302 0.081476 0.192927 0.038133 -0.648233 0.760487 0.299460 0.087742 0.053331 0.064539 0.178546 -0.502495 -0.006800 0.864553 0.324280 0.113570 0.048824 0.075798 0.176015 -0.502495 -0.006800 0.864553 0.344190 0.112360 0.036733 0.065820 0.168909 -0.502495 -0.006800 0.864553 0.369148 0.127941 0.048824 0.075798 0.176015 -0.598940 0.794892 -0.097051 0.378837 0.128303 0.042691 0.068252 0.152059 -0.598940 0.794892 -0.097051 0.395810 0.143320 0.036733 0.065820 0.168909 -0.598940 0.794892 -0.097051 0.369148 0.127941 0.042691 0.068252 0.152059 -0.909661 0.401486 0.106418 0.384310 0.126990 0.048824 0.075798 0.176015 -0.909661 0.401486 0.106418 0.344190 0.112360 0.053192 0.085858 0.175399 -0.909661 0.401486 0.106418 0.347560 0.104090 -0.001950 -0.040273 0.034472 -0.660818 -0.256176 0.705474 0.643033 0.298300 -0.023862 -0.025303 0.019383 -0.660818 -0.256176 0.705474 0.712310 0.264110 -0.030500 -0.033141 0.010319 -0.660818 -0.256176 0.705474 0.740681 0.264800 -0.023862 -0.025303 0.019383 -0.810222 0.008444 0.586062 0.712310 0.264110 -0.030055 -0.019593 0.010739 -0.810222 0.008444 0.586062 0.733560 0.250650 -0.030500 -0.033141 0.010319 -0.810222 0.008444 0.586062 0.740681 0.264800 0.053331 0.064539 0.178546 -0.784552 -0.180721 0.593142 0.325550 0.108270 0.060302 0.081476 0.192927 -0.784552 -0.180721 0.593142 0.310308 0.088773 0.048824 0.075798 0.176015 -0.784552 -0.180721 0.593142 0.338641 0.110258 0.057856 0.057044 0.172224 0.804863 -0.559570 0.197677 0.313070 0.128910 0.054500 0.046985 0.157414 0.804863 -0.559570 0.197677 0.327890 0.162200 0.062351 0.052413 0.140813 0.804863 -0.559570 0.197677 0.316680 0.182090 0.030087 0.039882 0.109675 -0.956082 0.140357 -0.257308 0.470850 0.222740 0.034158 0.013303 0.080050 -0.956082 0.140357 -0.257308 0.513733 0.250058 0.029876 -0.001883 0.087677 -0.956082 0.140357 -0.257308 0.498770 0.268030 0.030087 0.039882 0.109675 -0.994873 0.051019 -0.087321 0.470850 0.222740 0.029876 -0.001883 0.087677 -0.994873 0.051019 -0.087321 0.498770 0.268030 0.027702 0.029101 0.130549 -0.994873 0.051019 -0.087321 0.434330 0.198350 0.054500 0.046985 0.157414 0.801033 -0.566444 0.193618 0.327890 0.162200 0.044423 0.031511 0.153834 0.801033 -0.566444 0.193618 0.364836 0.180676 0.062351 0.052413 0.140813 0.801033 -0.566444 0.193618 0.316680 0.182090 0.044423 0.031511 0.153834 -0.492545 -0.644665 0.584642 0.364836 0.180676 0.033561 0.031491 0.144661 -0.492545 -0.644665 0.584642 0.402106 0.187773 0.034355 0.014456 0.126546 -0.492545 -0.644665 0.584642 0.427820 0.215940 0.041507 0.041081 0.156460 -0.597367 -0.376343 0.708179 0.365580 0.162280 0.033561 0.031491 0.144661 -0.597367 -0.376343 0.708179 0.402106 0.187773 0.044423 0.031511 0.153834 -0.597367 -0.376343 0.708179 0.364836 0.180676 0.041507 0.041081 0.156460 -0.685984 -0.265235 0.677552 0.365580 0.162280 0.031436 0.049052 0.149384 -0.685984 -0.265235 0.677552 0.399565 0.167196 0.033561 0.031491 0.144661 -0.685984 -0.265235 0.677552 0.402106 0.187773 0.044423 0.031511 0.153834 0.043531 -0.252010 0.966745 0.364836 0.180676 0.054500 0.046985 0.157414 0.043531 -0.252010 0.966745 0.327890 0.162200 0.041507 0.041081 0.156460 0.043531 -0.252010 0.966745 0.365580 0.162280 0.044423 0.031511 0.153834 -0.616245 -0.362089 0.699380 0.364836 0.180676 0.077645 0.019022 0.176641 -0.616245 -0.362089 0.699380 0.260121 0.223980 0.062326 0.031884 0.169802 -0.616245 -0.362089 0.699380 0.301326 0.204647 0.077645 0.019022 0.176641 -0.093862 -0.853624 0.512363 0.260121 0.223980 0.089982 -0.007425 0.134839 -0.093862 -0.853624 0.512363 0.295650 0.315700 0.090978 0.012292 0.167871 -0.093862 -0.853624 0.512363 0.243450 0.264540 0.089982 -0.007425 0.134839 -0.198069 -0.839011 0.506783 0.295650 0.315700 0.104416 0.007223 0.164731 -0.198069 -0.839011 0.506783 0.220810 0.296310 0.090978 0.012292 0.167871 -0.198069 -0.839011 0.506783 0.243450 0.264540 0.089982 -0.007425 0.134839 0.157287 -0.945881 0.283847 0.295650 0.315700 0.071473 -0.024618 0.087802 0.157287 -0.945881 0.283847 0.405190 0.354640 0.099112 -0.012738 0.112075 0.157287 -0.945881 0.283847 0.310110 0.370450 0.089982 -0.007425 0.134839 -0.003403 -0.938786 0.344485 0.295650 0.315700 0.056200 -0.017740 0.106395 -0.003403 -0.938786 0.344485 0.410687 0.294059 0.071473 -0.024618 0.087802 -0.003403 -0.938786 0.344485 0.405190 0.354640 0.071473 -0.024618 0.087802 -0.048886 -0.930285 0.363565 0.405190 0.354640 0.031230 -0.028204 0.073215 -0.048886 -0.930285 0.363565 0.513823 0.299301 0.048578 -0.040054 0.045226 -0.048886 -0.930285 0.363565 0.518630 0.377680 0.031230 -0.028204 0.073215 -0.842235 -0.292242 0.453029 0.513823 0.299301 0.043933 -0.002318 0.113530 -0.842235 -0.292242 0.453029 0.426570 0.255980 0.029876 -0.001883 0.087677 -0.842235 -0.292242 0.453029 0.498770 0.268030 0.029876 -0.001883 0.087677 -0.688296 -0.376206 0.620257 0.498770 0.268030 0.016955 -0.004583 0.071701 -0.688296 -0.376206 0.620257 0.548534 0.263306 0.031230 -0.028204 0.073215 -0.688296 -0.376206 0.620257 0.513823 0.299301 0.031230 -0.028204 0.073215 -0.611092 -0.322985 0.722667 0.513823 0.299301 0.016955 -0.004583 0.071701 -0.611092 -0.322985 0.722667 0.548534 0.263306 -0.001327 -0.021202 0.048814 -0.611092 -0.322985 0.722667 0.618682 0.273535 0.056200 -0.017740 0.106395 -0.539644 -0.666945 0.513779 0.410687 0.294059 0.077645 0.019022 0.176641 -0.539644 -0.666945 0.513779 0.260121 0.223980 0.043933 -0.002318 0.113530 -0.539644 -0.666945 0.513779 0.426570 0.255980 0.043933 -0.002318 0.113530 -0.489524 -0.655452 0.575108 0.426570 0.255980 0.031230 -0.028204 0.073215 -0.489524 -0.655452 0.575108 0.513823 0.299301 0.056200 -0.017740 0.106395 -0.489524 -0.655452 0.575108 0.410687 0.294059 0.056200 -0.017740 0.106395 -0.032782 -0.945844 0.322962 0.410687 0.294059 0.031230 -0.028204 0.073215 -0.032782 -0.945844 0.322962 0.513823 0.299301 0.071473 -0.024618 0.087802 -0.032782 -0.945844 0.322962 0.405190 0.354640 -0.001327 -0.021202 0.048814 -0.591435 -0.472219 0.653616 0.618682 0.273535 -0.001950 -0.040273 0.034472 -0.591435 -0.472219 0.653616 0.643033 0.298300 0.031230 -0.028204 0.073215 -0.591435 -0.472219 0.653616 0.513823 0.299301 0.048578 -0.040054 0.045226 0.522461 -0.851548 0.043590 0.518630 0.377680 0.038577 -0.048319 0.003636 0.522461 -0.851548 0.043590 0.601120 0.425850 0.069661 -0.026788 0.051686 0.522461 -0.851548 0.043590 0.462860 0.409610 0.031230 -0.028204 0.073215 0.035688 -0.912147 0.408305 0.513823 0.299301 0.009464 -0.061640 0.000422 0.035688 -0.912147 0.408305 0.670646 0.372138 0.048578 -0.040054 0.045226 0.035688 -0.912147 0.408305 0.518630 0.377680 0.048578 -0.040054 0.045226 0.407063 -0.909632 0.082882 0.518630 0.377680 0.009464 -0.061640 0.000422 0.407063 -0.909632 0.082882 0.670646 0.372138 0.038577 -0.048319 0.003636 0.407063 -0.909632 0.082882 0.601120 0.425850 0.009464 -0.061640 0.000422 0.405337 -0.909086 0.096254 0.670646 0.372138 -0.012845 -0.075192 -0.033626 0.405337 -0.909086 0.096254 0.768420 0.382030 0.038577 -0.048319 0.003636 0.405337 -0.909086 0.096254 0.601120 0.425850 0.038577 -0.048319 0.003636 0.511382 -0.854700 -0.089312 0.601120 0.425850 -0.012845 -0.075192 -0.033626 0.511382 -0.854700 -0.089312 0.768420 0.382030 0.022281 -0.052876 -0.046062 0.511382 -0.854700 -0.089312 0.714108 0.468367 -0.012845 -0.075192 -0.033626 0.567700 -0.809188 0.151432 0.768420 0.382030 -0.012438 -0.080839 -0.065327 0.567700 -0.809188 0.151432 0.815400 0.434250 0.022281 -0.052876 -0.046062 0.567700 -0.809188 0.151432 0.714108 0.468367 -0.012438 -0.080839 -0.065327 0.645768 -0.735881 -0.203625 0.815400 0.434250 -0.047403 -0.100711 -0.104398 0.645768 -0.735881 -0.203625 0.951641 0.425704 0.007882 -0.060295 -0.075129 0.645768 -0.735881 -0.203625 0.786970 0.489360 -0.095526 -0.117518 -0.143070 0.470368 -0.856341 -0.213151 0.981023 0.456908 -0.034406 -0.085027 -0.138728 0.470368 -0.856341 -0.213151 0.961750 0.509730 -0.047403 -0.100711 -0.104398 0.470368 -0.856341 -0.213151 0.951641 0.425704 -0.047403 -0.100711 -0.104398 0.625410 -0.771661 -0.115767 0.951641 0.425704 -0.034406 -0.085027 -0.138728 0.625410 -0.771661 -0.115767 0.961750 0.509730 0.007882 -0.060295 -0.075129 0.625410 -0.771661 -0.115767 0.786970 0.489360 0.044423 0.031511 0.153834 -0.601876 -0.558302 0.571003 0.364836 0.180676 0.034355 0.014456 0.126546 -0.601876 -0.558302 0.571003 0.427820 0.215940 0.077645 0.019022 0.176641 -0.601876 -0.558302 0.571003 0.260121 0.223980 0.034355 0.014456 0.126546 -0.515910 -0.689282 0.508653 0.427820 0.215940 0.043933 -0.002318 0.113530 -0.515910 -0.689282 0.508653 0.426570 0.255980 0.077645 0.019022 0.176641 -0.515910 -0.689282 0.508653 0.260121 0.223980 0.089982 -0.007425 0.134839 -0.155682 -0.854882 0.494914 0.295650 0.315700 0.077645 0.019022 0.176641 -0.155682 -0.854882 0.494914 0.260121 0.223980 0.056200 -0.017740 0.106395 -0.155682 -0.854882 0.494914 0.410687 0.294059 0.086777 -0.007718 0.051774 0.768201 -0.481981 -0.421381 0.428198 0.444416 0.099099 0.007341 0.057013 0.768201 -0.481981 -0.421381 0.395210 0.454600 0.116055 -0.004211 0.101138 0.768201 -0.481981 -0.421381 0.289090 0.422220 0.099099 0.007341 0.057013 0.499735 -0.771389 -0.393985 0.395210 0.454600 0.117596 0.011385 0.072557 0.499735 -0.771389 -0.393985 0.326990 0.473156 0.116055 -0.004211 0.101138 0.499735 -0.771389 -0.393985 0.289090 0.422220 0.117596 0.011385 0.072557 0.726269 -0.619128 -0.298686 0.326990 0.473156 0.135593 0.023447 0.091315 0.726269 -0.619128 -0.298686 0.260220 0.478520 0.116055 -0.004211 0.101138 0.726269 -0.619128 -0.298686 0.289090 0.422220 0.153810 0.036576 0.117798 0.769282 -0.594302 -0.234544 0.196867 0.467708 0.140320 0.014932 0.128395 0.769282 -0.594302 -0.234544 0.195960 0.427720 0.135593 0.023447 0.091315 0.769282 -0.594302 -0.234544 0.260220 0.478520 0.140320 0.014932 0.128395 0.872224 -0.425780 0.240700 0.195960 0.427720 0.153810 0.036576 0.117798 0.872224 -0.425780 0.240700 0.196867 0.467708 0.142930 0.026574 0.139531 0.872224 -0.425780 0.240700 0.174691 0.414974 0.135350 0.021139 0.160543 0.247142 -0.851050 0.463287 0.158440 0.365650 0.115943 0.014365 0.158452 0.247142 -0.851050 0.463287 0.203120 0.329410 0.111779 0.000945 0.136021 0.247142 -0.851050 0.463287 0.245470 0.357710 0.119415 0.029098 0.161260 -0.044159 -0.176988 0.983222 0.188520 0.331390 0.115943 0.014365 0.158452 -0.044159 -0.176988 0.983222 0.203120 0.329410 0.135350 0.021139 0.160543 -0.044159 -0.176988 0.983222 0.158440 0.365650 0.119415 0.029098 0.161260 0.969037 -0.201043 -0.143350 0.188520 0.331390 0.120143 0.026107 0.170376 0.969037 -0.201043 -0.143350 0.178018 0.316824 0.115943 0.014365 0.158452 0.969037 -0.201043 -0.143350 0.203120 0.329410 0.104416 0.007223 0.164731 0.618089 -0.719833 0.315921 0.220810 0.296310 0.111779 0.000945 0.136021 0.618089 -0.719833 0.315921 0.245470 0.357710 0.115943 0.014365 0.158452 0.618089 -0.719833 0.315921 0.203120 0.329410 0.089982 -0.007425 0.134839 0.321758 -0.885320 0.335677 0.295650 0.315700 0.099112 -0.012738 0.112075 0.321758 -0.885320 0.335677 0.310110 0.370450 0.111779 0.000945 0.136021 0.321758 -0.885320 0.335677 0.245470 0.357710 0.099112 -0.012738 0.112075 0.535414 -0.823546 0.187359 0.310110 0.370450 0.116055 -0.004211 0.101138 0.535414 -0.823546 0.187359 0.289090 0.422220 0.111779 0.000945 0.136021 0.535414 -0.823546 0.187359 0.245470 0.357710 0.099112 -0.012738 0.112075 0.445046 -0.895465 -0.008706 0.310110 0.370450 0.069661 -0.026788 0.051686 0.445046 -0.895465 -0.008706 0.462860 0.409610 0.116055 -0.004211 0.101138 0.445046 -0.895465 -0.008706 0.289090 0.422220 0.135593 0.023447 0.091315 0.751786 -0.615293 -0.237134 0.260220 0.478520 0.140320 0.014932 0.128395 0.751786 -0.615293 -0.237134 0.195960 0.427720 0.116055 -0.004211 0.101138 0.751786 -0.615293 -0.237134 0.289090 0.422220 0.071473 -0.024618 0.087802 0.526997 -0.849511 0.024602 0.405190 0.354640 0.048578 -0.040054 0.045226 0.526997 -0.849511 0.024602 0.518630 0.377680 0.069661 -0.026788 0.051686 0.526997 -0.849511 0.024602 0.462860 0.409610 0.143992 0.050780 0.185383 -0.796384 0.373403 0.475754 0.102570 0.343770 0.124638 0.045934 0.156789 -0.796384 0.373403 0.475754 0.172400 0.336930 0.119415 0.029098 0.161260 -0.796384 0.373403 0.475754 0.188520 0.331390 0.143992 0.050780 0.185383 -0.892768 0.217083 0.394766 0.102570 0.343770 0.149787 0.066389 0.189905 -0.892768 0.217083 0.394766 0.078462 0.341776 0.142136 0.060030 0.176099 -0.892768 0.217083 0.394766 0.112540 0.336640 0.158948 0.073733 0.201971 0.079730 -0.617483 0.782533 0.082315 0.372172 0.143992 0.050780 0.185383 0.079730 -0.617483 0.782533 0.102570 0.343770 0.156843 0.044757 0.179321 0.079730 -0.617483 0.782533 0.082094 0.377823 0.143992 0.050780 0.185383 0.052633 -0.650386 0.757779 0.102570 0.343770 0.135350 0.021139 0.160543 0.052633 -0.650386 0.757779 0.158440 0.365650 0.156843 0.044757 0.179321 0.052633 -0.650386 0.757779 0.087780 0.372400 0.111779 0.000945 0.136021 0.519729 -0.833631 0.186927 0.245470 0.357710 0.116055 -0.004211 0.101138 0.519729 -0.833631 0.186927 0.289090 0.422220 0.135350 0.021139 0.160543 0.519729 -0.833631 0.186927 0.158440 0.365650 0.116055 -0.004211 0.101138 0.425900 -0.873837 0.234560 0.289090 0.422220 0.140320 0.014932 0.128395 0.425900 -0.873837 0.234560 0.195960 0.427720 0.135350 0.021139 0.160543 0.425900 -0.873837 0.234560 0.158440 0.365650 0.143992 0.050780 0.185383 -0.829621 0.152396 0.537126 0.102570 0.343770 0.158948 0.073733 0.201971 -0.829621 0.152396 0.537126 0.045070 0.346890 0.149787 0.066389 0.189905 -0.829621 0.152396 0.537126 0.078462 0.341776 0.164352 0.057553 0.175030 0.869006 -0.491847 0.053994 0.073840 0.398740 0.174433 0.077625 0.195623 0.869006 -0.491847 0.053994 0.020480 0.387770 0.156843 0.044757 0.179321 0.869006 -0.491847 0.053994 0.078100 0.382990 0.156843 0.044757 0.179321 0.429872 -0.575227 0.695934 0.078100 0.382990 0.174433 0.077625 0.195623 0.429872 -0.575227 0.695934 0.020480 0.387770 0.158948 0.073733 0.201971 0.429872 -0.575227 0.695934 0.045070 0.346890 0.164352 0.057553 0.175030 0.654188 -0.676188 0.338833 0.073840 0.398740 0.173943 0.072128 0.185599 0.654188 -0.676188 0.338833 0.037193 0.399844 0.174433 0.077625 0.195623 0.654188 -0.676188 0.338833 0.020480 0.387770 0.069661 -0.026788 0.051686 0.709077 -0.635008 -0.306553 0.462860 0.409610 0.068895 -0.018779 0.033324 0.709077 -0.635008 -0.306553 0.491740 0.437240 0.086777 -0.007718 0.051774 0.709077 -0.635008 -0.306553 0.428198 0.444416 0.069661 -0.026788 0.051686 0.366670 -0.929597 0.037458 0.462860 0.409610 0.099112 -0.012738 0.112075 0.366670 -0.929597 0.037458 0.310110 0.370450 0.071473 -0.024618 0.087802 0.366670 -0.929597 0.037458 0.405190 0.354640 0.038577 -0.048319 0.003636 0.800629 -0.529312 -0.280752 0.601120 0.425850 0.053625 -0.028163 0.008548 0.800629 -0.529312 -0.280752 0.561610 0.440210 0.069661 -0.026788 0.051686 0.800629 -0.529312 -0.280752 0.462860 0.409610 0.069661 -0.026788 0.051686 0.785880 -0.554125 -0.274478 0.462860 0.409610 0.053625 -0.028163 0.008548 0.785880 -0.554125 -0.274478 0.561610 0.440210 0.068895 -0.018779 0.033324 0.785880 -0.554125 -0.274478 0.491740 0.437240 0.053625 -0.028163 0.008548 0.807024 -0.550314 -0.214163 0.561610 0.440210 0.038577 -0.048319 0.003636 0.807024 -0.550314 -0.214163 0.601120 0.425850 0.022281 -0.052876 -0.046062 0.807024 -0.550314 -0.214163 0.714108 0.468367 0.022281 -0.052876 -0.046062 0.668114 -0.729858 -0.144678 0.714108 0.468367 -0.012438 -0.080839 -0.065327 0.668114 -0.729858 -0.144678 0.815400 0.434250 0.007882 -0.060295 -0.075129 0.668114 -0.729858 -0.144678 0.786970 0.489360 0.069661 -0.026788 0.051686 0.693113 -0.620400 -0.367013 0.462860 0.409610 0.086777 -0.007718 0.051774 0.693113 -0.620400 -0.367013 0.428198 0.444416 0.116055 -0.004211 0.101138 0.693113 -0.620400 -0.367013 0.289090 0.422220 0.143992 0.050780 0.185383 -0.253221 -0.576939 0.776544 0.102570 0.343770 0.119415 0.029098 0.161260 -0.253221 -0.576939 0.776544 0.188520 0.331390 0.135350 0.021139 0.160543 -0.253221 -0.576939 0.776544 0.158440 0.365650 0.077645 0.019022 0.176641 0.042084 -0.760703 0.647735 0.260121 0.223980 0.090978 0.012292 0.167871 0.042084 -0.760703 0.647735 0.243450 0.264540 0.085054 0.021891 0.179529 0.042084 -0.760703 0.647735 0.240270 0.232350 0.085054 0.021891 0.179529 -0.531019 -0.632109 0.564320 0.240270 0.232350 0.087669 0.033440 0.194926 -0.531019 -0.632109 0.564320 0.211122 0.213362 0.075763 0.037689 0.188482 -0.531019 -0.632109 0.564320 0.246170 0.197800 0.075763 0.037689 0.188482 -0.879984 0.084000 0.467517 0.246170 0.197800 0.086585 0.059950 0.204852 -0.879984 0.084000 0.467517 0.187156 0.190790 0.071425 0.047528 0.178549 -0.879984 0.084000 0.467517 0.267450 0.197950 0.075763 0.037689 0.188482 -0.948637 -0.124740 0.290736 0.246170 0.197800 0.071425 0.047528 0.178549 -0.948637 -0.124740 0.290736 0.267450 0.197950 0.073688 0.029712 0.178289 -0.948637 -0.124740 0.290736 0.265743 0.210273 0.071425 0.047528 0.178549 -0.606906 -0.088616 0.789818 0.267450 0.197950 0.062326 0.031884 0.169802 -0.606906 -0.088616 0.789818 0.301326 0.204647 0.073688 0.029712 0.178289 -0.606906 -0.088616 0.789818 0.265743 0.210273 0.073688 0.029712 0.178289 -0.604123 -0.335083 0.723017 0.265743 0.210273 0.062326 0.031884 0.169802 -0.604123 -0.335083 0.723017 0.301326 0.204647 0.077645 0.019022 0.176641 -0.604123 -0.335083 0.723017 0.260121 0.223980 0.085054 0.021891 0.179529 -0.269053 -0.243256 0.931899 0.240270 0.232350 0.073688 0.029712 0.178289 -0.269053 -0.243256 0.931899 0.265743 0.210273 0.077645 0.019022 0.176641 -0.269053 -0.243256 0.931899 0.260121 0.223980 0.085054 0.021891 0.179529 -0.498692 -0.630416 0.594880 0.240270 0.232350 0.075763 0.037689 0.188482 -0.498692 -0.630416 0.594880 0.246170 0.197800 0.073688 0.029712 0.178289 -0.498692 -0.630416 0.594880 0.265743 0.210273 0.062326 0.031884 0.169802 -0.849376 0.227831 0.476081 0.301326 0.204647 0.071425 0.047528 0.178549 -0.849376 0.227831 0.476081 0.267450 0.197950 0.061518 0.042216 0.163416 -0.849376 0.227831 0.476081 0.310410 0.197450 0.062326 0.031884 0.169802 -0.621038 0.376365 0.687504 0.301326 0.204647 0.061518 0.042216 0.163416 -0.621038 0.376365 0.687504 0.310410 0.197450 0.044423 0.031511 0.153834 -0.621038 0.376365 0.687504 0.364836 0.180676 0.090978 0.012292 0.167871 0.033077 -0.461478 0.886535 0.243450 0.264540 0.104416 0.007223 0.164731 0.033077 -0.461478 0.886535 0.220810 0.296310 0.095701 0.027930 0.175835 0.033077 -0.461478 0.886535 0.220030 0.259690 0.095701 0.027930 0.175835 -0.373817 -0.555589 0.742685 0.220030 0.259690 0.104416 0.007223 0.164731 -0.373817 -0.555589 0.742685 0.220810 0.296310 0.109910 0.024071 0.180100 -0.373817 -0.555589 0.742685 0.186271 0.283171 0.104416 0.007223 0.164731 0.592484 -0.639773 0.489543 0.220810 0.296310 0.120143 0.026107 0.170376 0.592484 -0.639773 0.489543 0.178018 0.316824 0.109910 0.024071 0.180100 0.592484 -0.639773 0.489543 0.186271 0.283171 0.109910 0.024071 0.180100 0.472250 -0.819184 0.325450 0.186271 0.283171 0.120143 0.026107 0.170376 0.472250 -0.819184 0.325450 0.178018 0.316824 0.141667 0.052178 0.204766 0.472250 -0.819184 0.325450 0.098020 0.295780 0.120143 0.026107 0.170376 0.568638 -0.786656 0.240464 0.178018 0.316824 0.141560 0.048534 0.193098 0.568638 -0.786656 0.240464 0.098520 0.321330 0.141667 0.052178 0.204766 0.568638 -0.786656 0.240464 0.098020 0.295780 0.123196 0.044287 0.202612 -0.491871 -0.233698 0.838718 0.092590 0.280640 0.141494 0.076623 0.222353 -0.491871 -0.233698 0.838718 0.059790 0.277920 0.123289 0.059764 0.206979 -0.491871 -0.233698 0.838718 0.112692 0.264495 0.141667 0.052178 0.204766 0.999135 -0.041404 0.003769 0.081990 0.304590 0.141560 0.048534 0.193098 0.999135 -0.041404 0.003769 0.098520 0.321330 0.142189 0.063498 0.190741 0.999135 -0.041404 0.003769 0.087940 0.327060 0.141560 0.048534 0.193098 0.828272 -0.120991 -0.547108 0.098520 0.321330 0.135284 0.055424 0.182073 0.828272 -0.120991 -0.547108 0.107730 0.328780 0.142189 0.063498 0.190741 0.828272 -0.120991 -0.547108 0.087940 0.327060 0.141560 0.048534 0.193098 0.799768 -0.185219 -0.571021 0.098520 0.321330 0.120143 0.026107 0.170376 0.799768 -0.185219 -0.571021 0.178018 0.316824 0.135284 0.055424 0.182073 0.799768 -0.185219 -0.571021 0.107730 0.328780 0.135284 0.055424 0.182073 0.867247 -0.285024 -0.408221 0.107730 0.328780 0.120143 0.026107 0.170376 0.867247 -0.285024 -0.408221 0.178018 0.316824 0.119302 0.038419 0.159993 0.867247 -0.285024 -0.408221 0.180790 0.332860 0.120143 0.026107 0.170376 0.996860 0.001323 -0.079174 0.178018 0.316824 0.119415 0.029098 0.161260 0.996860 0.001323 -0.079174 0.188520 0.331390 0.119302 0.038419 0.159993 0.996860 0.001323 -0.079174 0.180790 0.332860 0.090978 0.012292 0.167871 0.524756 -0.506802 0.683946 0.243450 0.264540 0.095701 0.027930 0.175835 0.524756 -0.506802 0.683946 0.220030 0.259690 0.085054 0.021891 0.179529 0.524756 -0.506802 0.683946 0.240270 0.232350 0.100002 0.036926 0.190618 0.964968 -0.215553 -0.149578 0.190200 0.243860 0.095701 0.027930 0.175835 0.964968 -0.215553 -0.149578 0.220030 0.259690 0.097660 0.038978 0.172552 0.964968 -0.215553 -0.149578 0.211300 0.262970 0.100002 0.036926 0.190618 0.548370 -0.775661 0.312474 0.190200 0.243860 0.085054 0.021891 0.179529 0.548370 -0.775661 0.312474 0.240270 0.232350 0.095701 0.027930 0.175835 0.548370 -0.775661 0.312474 0.220030 0.259690 0.107389 0.046282 0.210566 0.668609 -0.737112 0.098125 0.147990 0.226080 0.085054 0.021891 0.179529 0.668609 -0.737112 0.098125 0.240270 0.232350 0.100002 0.036926 0.190618 0.668609 -0.737112 0.098125 0.190200 0.243860 0.107389 0.046282 0.210566 0.052277 -0.803117 0.593524 0.147990 0.226080 0.087669 0.033440 0.194926 0.052277 -0.803117 0.593524 0.211122 0.213362 0.085054 0.021891 0.179529 0.052277 -0.803117 0.593524 0.240270 0.232350 0.108825 0.043741 0.199336 0.924372 -0.026921 -0.380540 0.159984 0.245722 0.097660 0.038978 0.172552 0.924372 -0.026921 -0.380540 0.211300 0.262970 0.108636 0.055260 0.198062 0.924372 -0.026921 -0.380540 0.155020 0.252040 0.108636 0.055260 0.198062 0.727876 0.391428 -0.563011 0.155020 0.252040 0.097660 0.038978 0.172552 0.727876 0.391428 -0.563011 0.211300 0.262970 0.088707 0.052685 0.170507 0.727876 0.391428 -0.563011 0.200790 0.261530 0.131489 0.078973 0.229080 0.754704 -0.639453 0.146699 0.069787 0.240614 0.118713 0.062923 0.224846 0.754704 -0.639453 0.146699 0.104782 0.225075 0.107389 0.046282 0.210566 0.754704 -0.639453 0.146699 0.147990 0.226080 0.118713 0.062923 0.224846 0.059877 -0.673205 0.737028 0.104782 0.225075 0.107296 0.067456 0.229914 0.059877 -0.673205 0.737028 0.116859 0.196548 0.107389 0.046282 0.210566 0.059877 -0.673205 0.737028 0.147990 0.226080 0.107389 0.046282 0.210566 -0.085449 -0.672296 0.735334 0.147990 0.226080 0.107296 0.067456 0.229914 -0.085449 -0.672296 0.735334 0.116859 0.196548 0.093507 0.047680 0.210231 -0.085449 -0.672296 0.735334 0.175260 0.199050 0.107296 0.067456 0.229914 -0.744129 -0.132778 0.654708 0.116859 0.196548 0.086585 0.059950 0.204852 -0.744129 -0.132778 0.654708 0.187156 0.190790 0.093507 0.047680 0.210231 -0.744129 -0.132778 0.654708 0.175260 0.199050 0.108825 0.043741 0.199336 0.821736 -0.049308 -0.567731 0.159984 0.245722 0.108636 0.055260 0.198062 0.821736 -0.049308 -0.567731 0.155020 0.252040 0.131489 0.078973 0.229080 0.821736 -0.049308 -0.567731 0.069787 0.240614 0.142987 0.029221 0.148360 0.853671 -0.470722 0.222860 0.161963 0.397901 0.135350 0.021139 0.160543 0.853671 -0.470722 0.222860 0.158440 0.365650 0.140320 0.014932 0.128395 0.853671 -0.470722 0.222860 0.195960 0.427720 0.150255 0.033474 0.161588 0.605924 -0.753726 0.254467 0.126154 0.391636 0.156843 0.044757 0.179321 0.605924 -0.753726 0.254467 0.089596 0.378162 0.135350 0.021139 0.160543 0.605924 -0.753726 0.254467 0.158440 0.365650 0.142987 0.029221 0.148360 0.885699 -0.170473 -0.431829 0.161963 0.397901 0.150595 0.051764 0.155065 0.885699 -0.170473 -0.431829 0.121890 0.403040 0.150255 0.033474 0.161588 0.885699 -0.170473 -0.431829 0.126154 0.391636 0.150595 0.051764 0.155065 0.832961 -0.199547 -0.516097 0.121890 0.403040 0.164352 0.057553 0.175030 0.832961 -0.199547 -0.516097 0.073840 0.398740 0.150255 0.033474 0.161588 0.832961 -0.199547 -0.516097 0.126154 0.391636 0.150255 0.033474 0.161588 0.862659 -0.505784 0.001328 0.126154 0.391636 0.164352 0.057553 0.175030 0.862659 -0.505784 0.001328 0.073840 0.398740 0.156843 0.044757 0.179321 0.862659 -0.505784 0.001328 0.089596 0.378162 0.100002 0.036926 0.190618 0.424000 -0.870155 0.251107 0.190200 0.243860 0.108825 0.043741 0.199336 0.424000 -0.870155 0.251107 0.159984 0.245722 0.107389 0.046282 0.210566 0.424000 -0.870155 0.251107 0.147990 0.226080 0.108825 0.043741 0.199336 0.701902 -0.691795 -0.169568 0.159984 0.245722 0.100002 0.036926 0.190618 0.701902 -0.691795 -0.169568 0.190200 0.243860 0.097660 0.038978 0.172552 0.701902 -0.691795 -0.169568 0.211300 0.262970 0.089982 -0.007425 0.134839 0.330601 -0.900733 0.281749 0.295650 0.315700 0.111779 0.000945 0.136021 0.330601 -0.900733 0.281749 0.245470 0.357710 0.104416 0.007223 0.164731 0.330601 -0.900733 0.281749 0.220810 0.296310 0.104416 0.007223 0.164731 0.632117 -0.651732 0.419134 0.220810 0.296310 0.115943 0.014365 0.158452 0.632117 -0.651732 0.419134 0.203120 0.329410 0.120143 0.026107 0.170376 0.632117 -0.651732 0.419134 0.178018 0.316824 -0.047403 -0.100711 -0.104398 0.030618 -0.901724 0.431227 0.951641 0.425704 -0.012438 -0.080839 -0.065327 0.030618 -0.901724 0.431227 0.815400 0.434250 -0.069241 -0.093206 -0.087154 0.030618 -0.901724 0.431227 0.914152 0.365852 -0.069241 -0.093206 -0.087154 0.144648 -0.973826 0.175328 0.914152 0.365852 -0.012438 -0.080839 -0.065327 0.144648 -0.973826 0.175328 0.815400 0.434250 -0.012845 -0.075192 -0.033626 0.144648 -0.973826 0.175328 0.768420 0.382030 -0.012845 -0.075192 -0.033626 0.033640 -0.935960 0.350495 0.768420 0.382030 0.009464 -0.061640 0.000422 0.033640 -0.935960 0.350495 0.670646 0.372138 -0.029661 -0.072947 -0.026017 0.033640 -0.935960 0.350495 0.793950 0.336740 0.009464 -0.061640 0.000422 -0.148008 -0.811083 0.565896 0.670646 0.372138 -0.016507 -0.053189 0.005742 -0.148008 -0.811083 0.565896 0.718071 0.309760 -0.029661 -0.072947 -0.026017 -0.148008 -0.811083 0.565896 0.790105 0.328337 0.174312 0.080673 0.176682 -0.036027 -0.475138 0.879174 0.042770 0.427560 0.168610 0.067224 0.169180 -0.036027 -0.475138 0.879174 0.058830 0.426820 0.182614 0.078900 0.176064 -0.036027 -0.475138 0.879174 0.042790 0.429381 0.168610 0.067224 0.169180 0.299846 -0.725121 0.619913 0.062340 0.427740 0.179213 0.068282 0.165289 0.299846 -0.725121 0.619913 0.055790 0.445457 0.182614 0.078900 0.176064 0.299846 -0.725121 0.619913 0.042790 0.429381 -0.034406 -0.085027 -0.138728 0.750296 -0.606529 -0.263020 0.959968 0.514181 -0.032947 -0.077119 -0.152802 0.750296 -0.606529 -0.263020 0.958829 0.529430 0.007882 -0.060295 -0.075129 0.750296 -0.606529 -0.263020 0.932195 0.522238 -0.032947 -0.077119 -0.152802 0.888469 -0.143330 -0.435981 0.958829 0.529430 0.003153 -0.046601 -0.089268 0.888469 -0.143330 -0.435981 0.824771 0.564740 0.007882 -0.060295 -0.075129 0.888469 -0.143330 -0.435981 0.787970 0.551140 0.007882 -0.060295 -0.075129 0.901465 -0.118530 -0.416308 0.787970 0.551140 0.003153 -0.046601 -0.089268 0.901465 -0.118530 -0.416308 0.824771 0.564740 0.022281 -0.052876 -0.046062 0.901465 -0.118530 -0.416308 0.707390 0.565900 0.003153 -0.046601 -0.089268 0.889847 -0.178533 -0.419879 0.824771 0.564740 0.029309 -0.029773 -0.040991 0.889847 -0.178533 -0.419879 0.694998 0.593245 0.022281 -0.052876 -0.046062 0.889847 -0.178533 -0.419879 0.707390 0.565900 0.003153 -0.046601 -0.089268 0.831577 0.197122 -0.519251 0.824771 0.564740 -0.004285 -0.027983 -0.094112 0.831577 0.197122 -0.519251 0.848720 0.590070 0.029309 -0.029773 -0.040991 0.831577 0.197122 -0.519251 0.694998 0.593245 -0.004285 -0.027983 -0.094112 0.762594 0.447416 -0.467192 0.848720 0.590070 0.008989 -0.011941 -0.057082 0.762594 0.447416 -0.467192 0.757109 0.626270 0.029309 -0.029773 -0.040991 0.762594 0.447416 -0.467192 0.694998 0.593245 -0.025528 -0.015002 -0.098342 0.508655 0.647474 -0.567492 0.894100 0.654540 -0.004285 -0.027983 -0.094112 0.508655 0.647474 -0.567492 0.848720 0.590070 -0.024684 -0.048566 -0.135880 0.508655 0.647474 -0.567492 0.936076 0.565704 -0.004285 -0.027983 -0.094112 0.837053 0.202129 -0.508415 0.848720 0.590070 0.003153 -0.046601 -0.089268 0.837053 0.202129 -0.508415 0.824771 0.564740 -0.024684 -0.048566 -0.135880 0.837053 0.202129 -0.508415 0.936076 0.565704 0.087669 0.033440 0.194926 -0.521755 -0.206783 0.827655 0.211122 0.213362 0.107389 0.046282 0.210566 -0.521755 -0.206783 0.827655 0.147990 0.226080 0.075763 0.037689 0.188482 -0.521755 -0.206783 0.827655 0.246170 0.197800 0.075763 0.037689 0.188482 -0.099325 -0.870994 0.481149 0.246170 0.197800 0.107389 0.046282 0.210566 -0.099325 -0.870994 0.481149 0.147990 0.226080 0.093507 0.047680 0.210231 -0.099325 -0.870994 0.481149 0.175260 0.199050 -0.082414 -0.008469 -0.082211 -0.391394 0.915132 0.096663 0.963945 0.892963 -0.100711 -0.017457 -0.071205 -0.391394 0.915132 0.096663 0.970203 0.982094 -0.080407 -0.011017 -0.049962 -0.391394 0.915132 0.096663 0.928039 0.969549 0.029309 -0.029773 -0.040991 0.894507 0.071045 -0.441373 0.694998 0.593245 0.050502 -0.009120 0.005284 0.894507 0.071045 -0.441373 0.573141 0.624110 0.053625 -0.028163 0.008548 0.894507 0.071045 -0.441373 0.563770 0.587680 0.086777 -0.007718 0.051774 0.681626 0.542006 -0.491543 0.435511 0.601870 0.063030 -0.001161 0.026074 0.681626 0.542006 -0.491543 0.516921 0.625450 0.073622 0.006154 0.048828 0.681626 0.542006 -0.491543 0.455920 0.622257 0.063030 -0.001161 0.026074 0.451598 0.766511 -0.456639 0.516921 0.625450 0.062588 0.018440 0.058539 0.451598 0.766511 -0.456639 0.462180 0.663670 0.073622 0.006154 0.048828 0.451598 0.766511 -0.456639 0.455920 0.622257 0.063030 -0.001161 0.026074 0.405018 0.785142 -0.468522 0.516921 0.625450 0.045717 0.011490 0.032308 0.405018 0.785142 -0.468522 0.534848 0.690702 0.062588 0.018440 0.058539 0.405018 0.785142 -0.468522 0.462180 0.663670 0.062588 0.018440 0.058539 -0.173223 0.959148 -0.223672 0.462180 0.663670 0.028037 0.011583 0.055893 -0.173223 0.959148 -0.223672 0.537360 0.785940 0.046779 0.017207 0.065495 -0.173223 0.959148 -0.223672 0.484460 0.711190 0.063030 -0.001161 0.026074 0.844207 0.061935 -0.532427 0.516921 0.625450 0.068895 -0.018779 0.033324 0.844207 0.061935 -0.532427 0.497300 0.593550 0.050502 -0.009120 0.005284 0.844207 0.061935 -0.532427 0.573141 0.624110 0.068895 -0.018779 0.033324 0.842489 0.046169 -0.536731 0.497300 0.593550 0.053625 -0.028163 0.008548 0.842489 0.046169 -0.536731 0.563770 0.587680 0.050502 -0.009120 0.005284 0.842489 0.046169 -0.536731 0.573141 0.624110 0.068895 -0.018779 0.033324 0.728993 -0.038560 -0.683434 0.497300 0.593550 0.063030 -0.001161 0.026074 0.728993 -0.038560 -0.683434 0.516921 0.625450 0.086777 -0.007718 0.051774 0.728993 -0.038560 -0.683434 0.435511 0.601870 0.046779 0.017207 0.065495 -0.289907 0.957040 0.005316 0.484460 0.711190 0.028037 0.011583 0.055893 -0.289907 0.957040 0.005316 0.537360 0.785940 0.034158 0.013303 0.080050 -0.289907 0.957040 0.005316 0.491340 0.772430 0.028037 0.011583 0.055893 -0.745791 0.650730 0.142639 0.537360 0.785940 0.016955 -0.004583 0.071701 -0.745791 0.650730 0.142639 0.536530 0.818012 0.034158 0.013303 0.080050 -0.745791 0.650730 0.142639 0.491340 0.772430 0.030087 0.039882 0.109675 -0.467734 0.624982 -0.624997 0.442490 0.810560 0.052997 0.025909 0.078557 -0.467734 0.624982 -0.624997 0.450460 0.714650 0.034158 0.013303 0.080050 -0.467734 0.624982 -0.624997 0.491340 0.772430 0.052997 0.025909 0.078557 -0.335140 0.742402 -0.580103 0.450460 0.714650 0.030087 0.039882 0.109675 -0.335140 0.742402 -0.580103 0.442490 0.810560 0.037569 0.053938 0.123341 -0.335140 0.742402 -0.580103 0.410010 0.816830 0.037569 0.053938 0.123341 0.007768 0.894407 -0.447187 0.410010 0.816830 0.042691 0.068252 0.152059 0.007768 0.894407 -0.447187 0.349380 0.855820 0.047565 0.058833 0.133305 0.007768 0.894407 -0.447187 0.373890 0.809190 0.047565 0.058833 0.133305 0.498963 0.819491 -0.281905 0.373890 0.809190 0.042691 0.068252 0.152059 0.498963 0.819491 -0.281905 0.349380 0.855820 0.062351 0.052413 0.140813 0.498963 0.819491 -0.281905 0.331610 0.786970 0.058327 0.063550 0.158191 0.977882 0.175297 0.114093 0.307721 0.837801 0.057856 0.057044 0.172224 0.977882 0.175297 0.114093 0.297906 0.831523 0.062351 0.052413 0.140813 0.977882 0.175297 0.114093 0.331610 0.786970 0.042691 0.068252 0.152059 0.409099 0.808356 -0.423319 0.349380 0.855820 0.058327 0.063550 0.158191 0.409099 0.808356 -0.423319 0.307721 0.837801 0.062351 0.052413 0.140813 0.409099 0.808356 -0.423319 0.331610 0.786970 0.042691 0.068252 0.152059 0.405169 0.177834 -0.896780 0.319714 0.849451 0.056886 0.077181 0.160243 0.405169 0.177834 -0.896780 0.302102 0.842047 0.058327 0.063550 0.158191 0.405169 0.177834 -0.896780 0.307721 0.837801 0.058327 0.063550 0.158191 0.782993 -0.573945 -0.239813 0.286889 0.843306 0.072808 0.072316 0.184492 0.782993 -0.573945 -0.239813 0.257003 0.877169 0.057856 0.057044 0.172224 0.782993 -0.573945 -0.239813 0.297906 0.831523 0.058327 0.063550 0.158191 0.839232 0.166641 -0.517611 0.286889 0.843306 0.056886 0.077181 0.160243 0.839232 0.166641 -0.517611 0.305477 0.856494 0.072808 0.072316 0.184492 0.839232 0.166641 -0.517611 0.257003 0.877169 0.056886 0.077181 0.160243 0.808889 0.370093 -0.456869 0.305477 0.856494 0.063223 0.090410 0.182179 0.808889 0.370093 -0.456869 0.270710 0.887400 0.072808 0.072316 0.184492 0.808889 0.370093 -0.456869 0.257003 0.877169 0.056886 0.077181 0.160243 -0.049432 0.861534 -0.505288 0.305477 0.856494 0.053192 0.085858 0.175399 -0.049432 0.861534 -0.505288 0.298639 0.885778 0.063223 0.090410 0.182179 -0.049432 0.861534 -0.505288 0.270710 0.887400 0.042691 0.068252 0.152059 -0.215916 0.823748 -0.524232 0.336759 0.863565 0.053192 0.085858 0.175399 -0.215916 0.823748 -0.524232 0.298639 0.885778 0.056886 0.077181 0.160243 -0.215916 0.823748 -0.524232 0.305477 0.856494 0.042691 0.068252 0.152059 -0.743626 0.641830 -0.187280 0.349380 0.855820 0.037569 0.053938 0.123341 -0.743626 0.641830 -0.187280 0.410010 0.816830 0.027156 0.044410 0.132034 -0.743626 0.641830 -0.187280 0.415793 0.851809 0.053360 0.088072 0.187479 0.179671 0.731949 0.657243 0.282632 0.904939 0.060302 0.081476 0.192927 0.179671 0.731949 0.657243 0.268112 0.906565 0.063223 0.090410 0.182179 0.179671 0.731949 0.657243 0.270710 0.887400 0.063223 0.090410 0.182179 0.701219 0.442880 0.558703 0.270710 0.887400 0.060302 0.081476 0.192927 0.701219 0.442880 0.558703 0.268112 0.906565 0.072808 0.072316 0.184492 0.701219 0.442880 0.558703 0.257003 0.877169 0.047565 0.058833 0.133305 0.347701 0.930974 0.111313 0.373890 0.809190 0.062351 0.052413 0.140813 0.347701 0.930974 0.111313 0.329190 0.784830 0.068440 0.051968 0.125515 0.347701 0.930974 0.111313 0.344030 0.750640 0.062351 0.052413 0.140813 0.438217 0.886495 0.148635 0.329190 0.784830 0.084341 0.041774 0.139434 0.438217 0.886495 0.148635 0.288930 0.734470 0.068440 0.051968 0.125515 0.438217 0.886495 0.148635 0.344030 0.750640 0.062351 0.052413 0.140813 0.421293 0.820772 0.385805 0.329190 0.784830 0.061518 0.042216 0.163416 0.421293 0.820772 0.385805 0.295840 0.820350 0.084341 0.041774 0.139434 0.421293 0.820772 0.385805 0.288930 0.734470 0.061518 0.042216 0.163416 -0.485820 0.873986 0.011261 0.295840 0.820350 0.071425 0.047528 0.178549 -0.485820 0.873986 0.011261 0.250100 0.818029 0.075682 0.050078 0.164293 -0.485820 0.873986 0.011261 0.266450 0.791830 0.075682 0.050078 0.164293 -0.421508 0.805782 -0.415988 0.273470 0.776000 0.084341 0.041774 0.139434 -0.421508 0.805782 -0.415988 0.288930 0.734470 0.061518 0.042216 0.163416 -0.421508 0.805782 -0.415988 0.295840 0.820350 0.084341 0.041774 0.139434 0.594443 0.798600 -0.094210 0.288930 0.734470 0.071762 0.046670 0.101566 0.594443 0.798600 -0.094210 0.374767 0.709924 0.068440 0.051968 0.125515 0.594443 0.798600 -0.094210 0.344030 0.750640 0.084341 0.041774 0.139434 0.428511 0.903175 -0.025570 0.288930 0.734470 0.092476 0.037228 0.115191 0.428511 0.903175 -0.025570 0.311310 0.679780 0.071762 0.046670 0.101566 0.428511 0.903175 -0.025570 0.374767 0.709924 0.092476 0.037228 0.115191 0.585187 0.704593 -0.401380 0.311310 0.679780 0.081658 0.033262 0.092457 0.585187 0.704593 -0.401380 0.369880 0.669890 0.071762 0.046670 0.101566 0.585187 0.704593 -0.401380 0.374767 0.709924 0.081658 0.033262 0.092457 -0.056815 0.926175 -0.372790 0.369880 0.669890 0.062588 0.018440 0.058539 -0.056815 0.926175 -0.372790 0.462180 0.663670 0.052997 0.025909 0.078557 -0.056815 0.926175 -0.372790 0.450460 0.714650 0.111719 0.044626 0.093231 -0.336433 0.907171 -0.252691 0.306530 0.603540 0.101997 0.035315 0.072748 -0.336433 0.907171 -0.252691 0.357290 0.597774 0.081658 0.033262 0.092457 -0.336433 0.907171 -0.252691 0.369880 0.669890 0.081658 0.033262 0.092457 -0.313049 0.922211 -0.226993 0.369880 0.669890 0.101997 0.035315 0.072748 -0.313049 0.922211 -0.226993 0.357290 0.597774 0.062588 0.018440 0.058539 -0.313049 0.922211 -0.226993 0.462180 0.663670 0.062588 0.018440 0.058539 -0.070025 0.733132 -0.676471 0.462180 0.663670 0.101997 0.035315 0.072748 -0.070025 0.733132 -0.676471 0.357290 0.597774 0.082305 0.017903 0.055916 -0.070025 0.733132 -0.676471 0.424935 0.616345 0.101997 0.035315 0.072748 0.329360 0.436749 -0.837121 0.357290 0.597774 0.099099 0.007341 0.057013 0.329360 0.436749 -0.837121 0.392743 0.582936 0.082305 0.017903 0.055916 0.329360 0.436749 -0.837121 0.424935 0.616345 0.111719 0.044626 0.093231 0.077988 0.893121 -0.443004 0.306530 0.603540 0.121015 0.040796 0.087146 0.077988 0.893121 -0.443004 0.297580 0.574370 0.101997 0.035315 0.072748 0.077988 0.893121 -0.443004 0.357290 0.597774 0.121015 0.040796 0.087146 0.425958 0.501006 -0.753361 0.297580 0.574370 0.123985 0.028751 0.080815 0.425958 0.501006 -0.753361 0.301840 0.556970 0.101997 0.035315 0.072748 0.425958 0.501006 -0.753361 0.357290 0.597774 0.123985 0.028751 0.080815 0.419674 0.411575 -0.809000 0.301840 0.556970 0.099099 0.007341 0.057013 0.419674 0.411575 -0.809000 0.392743 0.582936 0.101997 0.035315 0.072748 0.419674 0.411575 -0.809000 0.357290 0.597774 0.123985 0.028751 0.080815 0.618935 0.139825 -0.772896 0.301840 0.556970 0.117596 0.011385 0.072557 0.618935 0.139825 -0.772896 0.329168 0.559598 0.099099 0.007341 0.057013 0.618935 0.139825 -0.772896 0.392743 0.582936 0.117596 0.011385 0.072557 0.690001 0.087795 -0.718464 0.329168 0.559598 0.123985 0.028751 0.080815 0.690001 0.087795 -0.718464 0.301840 0.556970 0.135593 0.023447 0.091315 0.690001 0.087795 -0.718464 0.261680 0.547960 0.123985 0.028751 0.080815 0.711784 0.322511 -0.623980 0.301840 0.556970 0.138591 0.044894 0.105820 0.711784 0.322511 -0.623980 0.231540 0.563650 0.135593 0.023447 0.091315 0.711784 0.322511 -0.623980 0.261680 0.547960 0.123985 0.028751 0.080815 0.580459 0.486386 -0.653066 0.301840 0.556970 0.121015 0.040796 0.087146 0.580459 0.486386 -0.653066 0.297580 0.574370 0.138591 0.044894 0.105820 0.580459 0.486386 -0.653066 0.231540 0.563650 0.111719 0.044626 0.093231 0.183978 0.933850 -0.306719 0.306530 0.603540 0.127937 0.047717 0.112370 0.183978 0.933850 -0.306719 0.243160 0.595480 0.121015 0.040796 0.087146 0.183978 0.933850 -0.306719 0.297580 0.574370 0.092476 0.037228 0.115191 -0.353719 0.935337 0.005146 0.311310 0.679780 0.111719 0.044626 0.093231 -0.353719 0.935337 0.005146 0.306530 0.603540 0.081658 0.033262 0.092457 -0.353719 0.935337 0.005146 0.369880 0.669890 0.037569 0.053938 0.123341 -0.056134 0.917262 -0.394308 0.410010 0.816830 0.047565 0.058833 0.133305 -0.056134 0.917262 -0.394308 0.373890 0.809190 0.071762 0.046670 0.101566 -0.056134 0.917262 -0.394308 0.374767 0.709924 0.047565 0.058833 0.133305 0.247467 0.952698 -0.176429 0.373890 0.809190 0.068440 0.051968 0.125515 0.247467 0.952698 -0.176429 0.344030 0.750640 0.071762 0.046670 0.101566 0.247467 0.952698 -0.176429 0.374767 0.709924 0.052997 0.025909 0.078557 -0.550643 0.791501 -0.265177 0.450460 0.714650 0.046779 0.017207 0.065495 -0.550643 0.791501 -0.265177 0.484460 0.711190 0.034158 0.013303 0.080050 -0.550643 0.791501 -0.265177 0.491340 0.772430 0.052997 0.025909 0.078557 -0.262672 0.856016 -0.445242 0.450460 0.714650 0.062588 0.018440 0.058539 -0.262672 0.856016 -0.445242 0.462180 0.663670 0.046779 0.017207 0.065495 -0.262672 0.856016 -0.445242 0.484460 0.711190 0.062588 0.018440 0.058539 -0.093763 0.564177 -0.820313 0.462180 0.663670 0.082305 0.017903 0.055916 -0.093763 0.564177 -0.820313 0.424935 0.616345 0.073622 0.006154 0.048828 -0.093763 0.564177 -0.820313 0.455920 0.622257 0.082305 0.017903 0.055916 0.424912 0.216272 -0.879020 0.424935 0.616345 0.086777 -0.007718 0.051774 0.424912 0.216272 -0.879020 0.435511 0.601870 0.073622 0.006154 0.048828 0.424912 0.216272 -0.879020 0.455920 0.622257 0.082305 0.017903 0.055916 0.181094 0.187678 -0.965392 0.424935 0.616345 0.099099 0.007341 0.057013 0.181094 0.187678 -0.965392 0.392743 0.582936 0.086777 -0.007718 0.051774 0.181094 0.187678 -0.965392 0.435511 0.601870 0.105390 0.048647 0.164927 0.052283 0.952515 -0.299970 0.259600 0.732880 0.084341 0.041774 0.139434 0.052283 0.952515 -0.299970 0.288930 0.734470 0.075682 0.050078 0.164293 0.052283 0.952515 -0.299970 0.266450 0.791830 0.037569 0.053938 0.123341 -0.753064 0.618642 -0.224001 0.410010 0.816830 0.030087 0.039882 0.109675 -0.753064 0.618642 -0.224001 0.442490 0.810560 0.027156 0.044410 0.132034 -0.753064 0.618642 -0.224001 0.415793 0.851809 0.037569 0.053938 0.123341 -0.190908 0.801157 -0.567188 0.410010 0.816830 0.071762 0.046670 0.101566 -0.190908 0.801157 -0.567188 0.374767 0.709924 0.052997 0.025909 0.078557 -0.190908 0.801157 -0.567188 0.450460 0.714650 0.062351 0.052413 0.140813 -0.621950 0.722121 0.302853 0.318930 0.812548 0.044423 0.031511 0.153834 -0.621950 0.722121 0.302853 0.301720 0.824680 0.061518 0.042216 0.163416 -0.621950 0.722121 0.302853 0.316160 0.818176 0.135593 0.023447 0.091315 0.689132 0.337391 -0.641299 0.261680 0.547960 0.138591 0.044894 0.105820 0.689132 0.337391 -0.641299 0.231540 0.563650 0.153810 0.036576 0.117798 0.689132 0.337391 -0.641299 0.204756 0.548310 0.121015 0.040796 0.087146 0.078730 0.955641 -0.283816 0.297580 0.574370 0.127937 0.047717 0.112370 0.078730 0.955641 -0.283816 0.243160 0.595480 0.138591 0.044894 0.105820 0.078730 0.955641 -0.283816 0.231540 0.563650 0.127937 0.047717 0.112370 -0.079966 0.992494 -0.092529 0.243160 0.595480 0.111719 0.044626 0.093231 -0.079966 0.992494 -0.092529 0.306530 0.603540 0.124840 0.048888 0.127607 -0.079966 0.992494 -0.092529 0.225220 0.625490 0.111719 0.044626 0.093231 -0.343962 0.938866 0.014885 0.306530 0.603540 0.092476 0.037228 0.115191 -0.343962 0.938866 0.014885 0.262670 0.665250 0.124840 0.048888 0.127607 -0.343962 0.938866 0.014885 0.225220 0.625490 0.124840 0.048888 0.127607 -0.287104 0.947413 -0.141349 0.225220 0.625490 0.092476 0.037228 0.115191 -0.287104 0.947413 -0.141349 0.262670 0.665250 0.117201 0.050385 0.153157 -0.287104 0.947413 -0.141349 0.200900 0.681330 0.153810 0.036576 0.117798 0.682750 0.273587 -0.677498 0.204756 0.548310 0.138591 0.044894 0.105820 0.682750 0.273587 -0.677498 0.231540 0.563650 0.161981 0.058897 0.135046 0.682750 0.273587 -0.677498 0.205510 0.554570 0.138591 0.044894 0.105820 -0.026246 0.901799 -0.431359 0.231540 0.563650 0.127937 0.047717 0.112370 -0.026246 0.901799 -0.431359 0.243160 0.595480 0.143106 0.052573 0.121599 -0.026246 0.901799 -0.431359 0.196590 0.574980 0.127937 0.047717 0.112370 -0.234628 0.964423 -0.121808 0.243160 0.595480 0.124840 0.048888 0.127607 -0.234628 0.964423 -0.121808 0.225220 0.625490 0.143106 0.052573 0.121599 -0.234628 0.964423 -0.121808 0.196590 0.574980 0.124840 0.048888 0.127607 0.072311 0.996704 -0.036778 0.225220 0.625490 0.117201 0.050385 0.153157 0.072311 0.996704 -0.036778 0.200900 0.681330 0.130922 0.049236 0.148996 0.072311 0.996704 -0.036778 0.179280 0.644260 0.161981 0.058897 0.135046 0.013148 0.897611 -0.440593 0.205510 0.554570 0.138591 0.044894 0.105820 0.013148 0.897611 -0.440593 0.231540 0.563650 0.143106 0.052573 0.121599 0.013148 0.897611 -0.440593 0.196590 0.574980 0.124840 0.048888 0.127607 0.163404 0.984578 -0.062483 0.225220 0.625490 0.130922 0.049236 0.148996 0.163404 0.984578 -0.062483 0.179280 0.644260 0.136199 0.047431 0.134354 0.163404 0.984578 -0.062483 0.190281 0.610355 0.143992 0.050780 0.185383 -0.806753 0.330047 0.490120 0.151250 0.671000 0.142136 0.060030 0.176099 -0.806753 0.330047 0.490120 0.111570 0.658070 0.124638 0.045934 0.156789 -0.806753 0.330047 0.490120 0.178405 0.669185 0.124638 0.045934 0.156789 -0.555997 0.825311 -0.098641 0.178405 0.669185 0.142136 0.060030 0.176099 -0.555997 0.825311 -0.098641 0.111570 0.658070 0.130922 0.049236 0.148996 -0.555997 0.825311 -0.098641 0.179280 0.644260 0.142136 0.060030 0.176099 -0.445050 0.879929 -0.166298 0.111570 0.658070 0.158775 0.066912 0.167984 -0.445050 0.879929 -0.166298 0.089401 0.614255 0.130922 0.049236 0.148996 -0.445050 0.879929 -0.166298 0.179280 0.644260 0.158775 0.066912 0.167984 -0.538539 0.565618 -0.624542 0.089401 0.614255 0.142136 0.060030 0.176099 -0.538539 0.565618 -0.624542 0.111570 0.658070 0.159528 0.087068 0.185589 -0.538539 0.565618 -0.624542 0.063021 0.631922 0.142136 0.060030 0.176099 -0.850902 0.455459 0.261769 0.111570 0.658070 0.149787 0.066389 0.189905 -0.850902 0.455459 0.261769 0.077689 0.659309 0.159528 0.087068 0.185589 -0.850902 0.455459 0.261769 0.063021 0.631922 0.149787 0.066389 0.189905 -0.903421 0.428521 0.014169 0.077689 0.659309 0.159469 0.086296 0.205175 -0.903421 0.428521 0.014169 0.032164 0.653374 0.159528 0.087068 0.185589 -0.903421 0.428521 0.014169 0.063021 0.631922 0.169176 0.083665 0.181754 0.897506 0.249696 -0.363503 0.047225 0.608980 0.176435 0.092959 0.206061 0.897506 0.249696 -0.363503 0.007966 0.628355 0.173943 0.072128 0.185599 0.897506 0.249696 -0.363503 0.042490 0.600000 0.169176 0.083665 0.181754 0.953574 0.036913 -0.298888 0.047225 0.608980 0.172181 0.094044 0.192623 0.953574 0.036913 -0.298888 0.024866 0.619390 0.176435 0.092959 0.206061 0.953574 0.036913 -0.298888 0.007966 0.628355 0.159528 0.087068 0.185589 -0.017556 0.725530 -0.687967 0.058333 0.632730 0.172181 0.094044 0.192623 -0.017556 0.725530 -0.687967 0.024866 0.619390 0.169176 0.083665 0.181754 -0.017556 0.725530 -0.687967 0.047225 0.608980 0.172181 0.094044 0.192623 0.283248 0.958969 -0.012238 0.024866 0.619390 0.165030 0.096221 0.197703 0.283248 0.958969 -0.012238 0.028538 0.636841 0.176435 0.092959 0.206061 0.283248 0.958969 -0.012238 0.007966 0.628355 0.159528 0.087068 0.185589 -0.144013 0.819906 -0.554089 0.058333 0.632730 0.165030 0.096221 0.197703 -0.144013 0.819906 -0.554089 0.028538 0.636841 0.172181 0.094044 0.192623 -0.144013 0.819906 -0.554089 0.024866 0.619390 0.165030 0.096221 0.197703 -0.866743 0.498464 0.017036 0.028538 0.636841 0.159528 0.087068 0.185589 -0.866743 0.498464 0.017036 0.063021 0.631922 0.159469 0.086296 0.205175 -0.866743 0.498464 0.017036 0.032164 0.653374 0.159469 0.086296 0.205175 -0.300410 0.675374 0.673516 0.032164 0.653374 0.176435 0.092959 0.206061 -0.300410 0.675374 0.673516 0.007966 0.628355 0.165030 0.096221 0.197703 -0.300410 0.675374 0.673516 0.028538 0.636841 0.130922 0.049236 0.148996 0.229247 0.816022 0.530616 0.179280 0.644260 0.117201 0.050385 0.153157 0.229247 0.816022 0.530616 0.200900 0.681330 0.124638 0.045934 0.156789 0.229247 0.816022 0.530616 0.181247 0.669140 0.124638 0.045934 0.156789 -0.142384 0.472025 0.870011 0.178405 0.669185 0.117201 0.050385 0.153157 -0.142384 0.472025 0.870011 0.200900 0.681330 0.119302 0.038419 0.159993 -0.142384 0.472025 0.870011 0.182900 0.687000 0.117201 0.050385 0.153157 0.791086 0.402199 0.460890 0.200900 0.681330 0.113399 0.048360 0.161450 0.791086 0.402199 0.460890 0.194766 0.703056 0.119302 0.038419 0.159993 0.791086 0.402199 0.460890 0.182900 0.687000 0.105390 0.048647 0.164927 0.052436 0.876901 -0.477802 0.205070 0.725670 0.075682 0.050078 0.164293 0.052436 0.876901 -0.477802 0.266450 0.791830 0.088707 0.052685 0.170507 0.052436 0.876901 -0.477802 0.230999 0.772807 0.071425 0.047528 0.178549 -0.241205 0.965243 0.100629 0.250100 0.818029 0.088707 0.052685 0.170507 -0.241205 0.965243 0.100629 0.230999 0.772807 0.075682 0.050078 0.164293 -0.241205 0.965243 0.100629 0.266450 0.791830 0.105390 0.048647 0.164927 -0.221711 0.971910 -0.078968 0.205070 0.725670 0.117201 0.050385 0.153157 -0.221711 0.971910 -0.078968 0.200900 0.681330 0.084341 0.041774 0.139434 -0.221711 0.971910 -0.078968 0.260430 0.698770 0.117201 0.050385 0.153157 -0.154762 0.960323 -0.232010 0.200900 0.681330 0.092476 0.037228 0.115191 -0.154762 0.960323 -0.232010 0.262670 0.665250 0.084341 0.041774 0.139434 -0.154762 0.960323 -0.232010 0.260430 0.698770 0.088707 0.052685 0.170507 0.637007 0.574152 -0.514366 0.230999 0.772807 0.098148 0.065280 0.196258 0.637007 0.574152 -0.514366 0.169760 0.791210 0.108636 0.055260 0.198062 0.637007 0.574152 -0.514366 0.148075 0.768006 0.088707 0.052685 0.170507 -0.532034 0.821139 -0.206567 0.230999 0.772807 0.086585 0.059950 0.204852 -0.532034 0.821139 -0.206567 0.176753 0.823046 0.098148 0.065280 0.196258 -0.532034 0.821139 -0.206567 0.169760 0.791210 0.098148 0.065280 0.196258 0.484165 0.363483 -0.795905 0.169760 0.791210 0.119937 0.077291 0.214998 0.484165 0.363483 -0.795905 0.094384 0.772592 0.108636 0.055260 0.198062 0.484165 0.363483 -0.795905 0.148075 0.768006 0.086585 0.059950 0.204852 -0.569170 0.770049 -0.288219 0.172969 0.822403 0.104757 0.078397 0.218252 -0.569170 0.770049 -0.288219 0.119475 0.806425 0.098148 0.065280 0.196258 -0.569170 0.770049 -0.288219 0.167530 0.791000 0.104757 0.078397 0.218252 -0.044623 0.863844 -0.501779 0.119475 0.806425 0.119937 0.077291 0.214998 -0.044623 0.863844 -0.501779 0.094384 0.772592 0.098148 0.065280 0.196258 -0.044623 0.863844 -0.501779 0.167530 0.791000 0.118628 0.093343 0.233243 0.366299 0.919435 0.143053 0.068000 0.797370 0.128282 0.088243 0.241302 0.366299 0.919435 0.143053 0.043946 0.784224 0.128568 0.090583 0.225530 0.366299 0.919435 0.143053 0.062010 0.771769 0.128568 0.090583 0.225530 0.964069 0.259680 0.056009 0.062010 0.771769 0.128282 0.088243 0.241302 0.964069 0.259680 0.056009 0.043946 0.784224 0.131489 0.078973 0.229080 0.964069 0.259680 0.056009 0.057647 0.763215 0.128282 0.088243 0.241302 -0.172738 0.725585 0.666099 0.043946 0.784224 0.118628 0.093343 0.233243 -0.172738 0.725585 0.666099 0.068000 0.797370 0.113825 0.086887 0.239030 -0.172738 0.725585 0.666099 0.071740 0.814150 0.086585 0.059950 0.204852 -0.369460 0.904245 -0.214102 0.176753 0.823046 0.088707 0.052685 0.170507 -0.369460 0.904245 -0.214102 0.230999 0.772807 0.071425 0.047528 0.178549 -0.369460 0.904245 -0.214102 0.250100 0.818029 0.104757 0.078397 0.218252 -0.767031 0.637287 0.074351 0.113396 0.806480 0.113825 0.086887 0.239030 -0.767031 0.637287 0.074351 0.071740 0.814150 0.118628 0.093343 0.233243 -0.767031 0.637287 0.074351 0.068000 0.797370 0.104757 0.078397 0.218252 -0.724534 0.688353 0.034938 0.113396 0.806480 0.086585 0.059950 0.204852 -0.724534 0.688353 0.034938 0.172969 0.822403 0.113825 0.086887 0.239030 -0.724534 0.688353 0.034938 0.071740 0.814150 0.108636 0.055260 0.198062 0.763522 0.098921 -0.638161 0.148075 0.768006 0.119937 0.077291 0.214998 0.763522 0.098921 -0.638161 0.094384 0.772592 0.131489 0.078973 0.229080 0.763522 0.098921 -0.638161 0.057647 0.763215 0.128568 0.090583 0.225530 0.773107 0.000565 -0.634276 0.062010 0.771769 0.131489 0.078973 0.229080 0.773107 0.000565 -0.634276 0.057647 0.763215 0.119937 0.077291 0.214998 0.773107 0.000565 -0.634276 0.094384 0.772592 0.117201 0.050385 0.153157 0.166062 0.937727 0.305108 0.200900 0.681330 0.105390 0.048647 0.164927 0.166062 0.937727 0.305108 0.205070 0.725670 0.113399 0.048360 0.161450 0.166062 0.937727 0.305108 0.194766 0.703056 0.105390 0.048647 0.164927 -0.154431 0.889921 -0.429176 0.205070 0.725670 0.126783 0.063450 0.187924 -0.154431 0.889921 -0.429176 0.123640 0.711560 0.113399 0.048360 0.161450 -0.154431 0.889921 -0.429176 0.194766 0.703056 0.097660 0.038978 0.172552 -0.748673 0.658556 0.076109 0.207600 0.751920 0.114482 0.056148 0.189459 -0.748673 0.658556 0.076109 0.147190 0.741800 0.105390 0.048647 0.164927 -0.748673 0.658556 0.076109 0.205070 0.725670 0.105390 0.048647 0.164927 -0.515642 0.853940 -0.069998 0.205070 0.725670 0.114482 0.056148 0.189459 -0.515642 0.853940 -0.069998 0.147190 0.741800 0.126783 0.063450 0.187924 -0.515642 0.853940 -0.069998 0.123640 0.711560 0.097660 0.038978 0.172552 -0.819569 0.385936 0.423509 0.207600 0.751920 0.107971 0.041337 0.190356 -0.819569 0.385936 0.423509 0.161290 0.754120 0.114482 0.056148 0.189459 -0.819569 0.385936 0.423509 0.147190 0.741800 0.107971 0.041337 0.190356 -0.850928 0.395041 0.346213 0.161290 0.754120 0.123289 0.059764 0.206979 -0.850928 0.395041 0.346213 0.100160 0.745330 0.114482 0.056148 0.189459 -0.850928 0.395041 0.346213 0.147190 0.741800 0.114482 0.056148 0.189459 -0.843830 0.416628 0.338189 0.147190 0.741800 0.123289 0.059764 0.206979 -0.843830 0.416628 0.338189 0.100160 0.745330 0.127109 0.070575 0.203192 -0.843830 0.416628 0.338189 0.099430 0.733770 0.114482 0.056148 0.189459 -0.509573 0.783824 -0.354901 0.147190 0.741800 0.127109 0.070575 0.203192 -0.509573 0.783824 -0.354901 0.099430 0.733770 0.126783 0.063450 0.187924 -0.509573 0.783824 -0.354901 0.123640 0.711560 0.142189 0.063498 0.190741 0.131333 0.671051 -0.729686 0.092348 0.685197 0.135284 0.055424 0.182073 0.131333 0.671051 -0.729686 0.119930 0.686806 0.126783 0.063450 0.187924 0.131333 0.671051 -0.729686 0.123640 0.711560 0.126783 0.063450 0.187924 0.307594 0.751384 -0.583788 0.123640 0.711560 0.135284 0.055424 0.182073 0.307594 0.751384 -0.583788 0.119930 0.686806 0.113399 0.048360 0.161450 0.307594 0.751384 -0.583788 0.194766 0.703056 0.135284 0.055424 0.182073 0.542714 0.428171 -0.722586 0.119930 0.686806 0.119302 0.038419 0.159993 0.542714 0.428171 -0.722586 0.182900 0.687000 0.113399 0.048360 0.161450 0.542714 0.428171 -0.722586 0.194766 0.703056 0.127109 0.070575 0.203192 -0.875533 0.402820 0.266792 0.099430 0.733770 0.123289 0.059764 0.206979 -0.875533 0.402820 0.266792 0.100160 0.745330 0.148253 0.104663 0.221112 -0.875533 0.402820 0.266792 0.025313 0.709884 0.123289 0.059764 0.206979 -0.877269 0.408353 0.252284 0.100160 0.745330 0.144382 0.092417 0.227473 -0.877269 0.408353 0.252284 0.026020 0.727900 0.148253 0.104663 0.221112 -0.877269 0.408353 0.252284 0.025313 0.709884 0.148253 0.104663 0.221112 -0.750055 0.605322 -0.266465 0.025313 0.709884 0.126783 0.063450 0.187924 -0.750055 0.605322 -0.266465 0.123640 0.711560 0.127109 0.070575 0.203192 -0.750055 0.605322 -0.266465 0.099430 0.733770 0.160456 0.093784 0.213636 0.150116 0.536996 -0.830121 0.020110 0.678290 0.142189 0.063498 0.190741 0.150116 0.536996 -0.830121 0.092348 0.685197 0.126783 0.063450 0.187924 0.150116 0.536996 -0.830121 0.123640 0.711560 0.154832 0.073607 0.208689 0.839615 -0.103280 -0.533273 0.052320 0.675130 0.142189 0.063498 0.190741 0.839615 -0.103280 -0.533273 0.092348 0.685197 0.160456 0.093784 0.213636 0.839615 -0.103280 -0.533273 0.020110 0.678290 0.126783 0.063450 0.187924 0.056925 0.608025 -0.791874 0.123640 0.711560 0.148253 0.104663 0.221112 0.056925 0.608025 -0.791874 0.025313 0.709884 0.160456 0.093784 0.213636 0.056925 0.608025 -0.791874 0.020110 0.678290 0.144382 0.092417 0.227473 -0.238748 0.505996 0.828835 0.026020 0.727900 0.156812 0.096983 0.228266 -0.238748 0.505996 0.828835 0.004768 0.704040 0.148253 0.104663 0.221112 -0.238748 0.505996 0.828835 0.025313 0.709884 0.160456 0.093784 0.213636 0.666468 0.745528 0.002985 0.020110 0.678290 0.148253 0.104663 0.221112 0.666468 0.745528 0.002985 0.025313 0.709884 0.156812 0.096983 0.228266 0.666468 0.745528 0.002985 0.004768 0.704040 0.053625 -0.028163 0.008548 0.886028 -0.175324 -0.429205 0.563770 0.587680 0.022281 -0.052876 -0.046062 0.886028 -0.175324 -0.429205 0.707390 0.565900 0.029309 -0.029773 -0.040991 0.886028 -0.175324 -0.429205 0.694998 0.593245 0.142987 0.029221 0.148360 0.933907 -0.344071 0.097126 0.162840 0.613160 0.142930 0.026574 0.139531 0.933907 -0.344071 0.097126 0.168030 0.609880 0.150595 0.051764 0.155065 0.933907 -0.344071 0.097126 0.128281 0.611740 0.142930 0.026574 0.139531 0.205114 0.467758 -0.859728 0.168030 0.609880 0.130922 0.049236 0.148996 0.205114 0.467758 -0.859728 0.177100 0.643890 0.150595 0.051764 0.155065 0.205114 0.467758 -0.859728 0.128281 0.611740 0.136199 0.047431 0.134354 -0.626252 0.779220 -0.024993 0.190281 0.610355 0.151269 0.059879 0.144841 -0.626252 0.779220 -0.024993 0.146100 0.591670 0.143106 0.052573 0.121599 -0.626252 0.779220 -0.024993 0.196590 0.574980 0.142930 0.026574 0.139531 -0.722055 -0.061990 0.689053 0.168030 0.609880 0.159537 0.060161 0.159955 -0.722055 -0.061990 0.689053 0.117383 0.597700 0.136199 0.047431 0.134354 -0.722055 -0.061990 0.689053 0.190281 0.610355 0.136199 0.047431 0.134354 -0.732416 0.557915 0.390253 0.190281 0.610355 0.159537 0.060161 0.159955 -0.732416 0.557915 0.390253 0.117383 0.597700 0.151269 0.059879 0.144841 -0.732416 0.557915 0.390253 0.146100 0.591670 0.143106 0.052573 0.121599 -0.141877 0.957493 -0.251153 0.196590 0.574980 0.151269 0.059879 0.144841 -0.141877 0.957493 -0.251153 0.146100 0.591670 0.161981 0.058897 0.135046 -0.141877 0.957493 -0.251153 0.137991 0.550913 0.130922 0.049236 0.148996 0.892027 0.356758 0.277508 0.177100 0.643890 0.142930 0.026574 0.139531 0.892027 0.356758 0.277508 0.168030 0.609880 0.136199 0.047431 0.134354 0.892027 0.356758 0.277508 0.170267 0.618432 0.150595 0.051764 0.155065 0.815290 0.051619 -0.576748 0.128281 0.611740 0.158775 0.066912 0.167984 0.815290 0.051619 -0.576748 0.089401 0.614255 0.164352 0.057553 0.175030 0.815290 0.051619 -0.576748 0.075400 0.602490 0.150595 0.051764 0.155065 0.169529 0.584917 -0.793178 0.128281 0.611740 0.130922 0.049236 0.148996 0.169529 0.584917 -0.793178 0.177100 0.643890 0.158775 0.066912 0.167984 0.169529 0.584917 -0.793178 0.089401 0.614255 0.159537 0.060161 0.159955 -0.596094 -0.180948 0.782259 0.117383 0.597700 0.142930 0.026574 0.139531 -0.596094 -0.180948 0.782259 0.168030 0.609880 0.156379 0.044803 0.153996 -0.596094 -0.180948 0.782259 0.124200 0.603440 0.164352 0.057553 0.175030 0.762134 -0.032642 -0.646596 0.075400 0.602490 0.158775 0.066912 0.167984 0.762134 -0.032642 -0.646596 0.089401 0.614255 0.173943 0.072128 0.185599 0.762134 -0.032642 -0.646596 0.042490 0.600000 0.158775 0.066912 0.167984 0.742392 0.085284 -0.664515 0.089401 0.614255 0.169176 0.083665 0.181754 0.742392 0.085284 -0.664515 0.055650 0.607740 0.173943 0.072128 0.185599 0.742392 0.085284 -0.664515 0.042490 0.600000 0.158775 0.066912 0.167984 -0.066216 0.657796 -0.750280 0.089401 0.614255 0.159528 0.087068 0.185589 -0.066216 0.657796 -0.750280 0.063021 0.631922 0.169176 0.083665 0.181754 -0.066216 0.657796 -0.750280 0.055650 0.607740 0.136199 0.047431 0.134354 -0.078967 0.938671 0.335651 0.190281 0.610355 0.143106 0.052573 0.121599 -0.078967 0.938671 0.335651 0.196590 0.574980 0.124840 0.048888 0.127607 -0.078967 0.938671 0.335651 0.225220 0.625490 0.156379 0.044803 0.153996 -0.639687 -0.160153 0.751766 0.116410 0.602830 0.168610 0.067224 0.169180 -0.639687 -0.160153 0.751766 0.071290 0.596710 0.159537 0.060161 0.159955 -0.639687 -0.160153 0.751766 0.117383 0.597700 0.159537 0.060161 0.159955 -0.649562 -0.141322 0.747060 0.117383 0.597700 0.168610 0.067224 0.169180 -0.649562 -0.141322 0.747060 0.071290 0.596710 0.174312 0.080673 0.176682 -0.649562 -0.141322 0.747060 0.046580 0.584910 0.159537 0.060161 0.159955 -0.854005 0.237795 0.462740 0.102401 0.594698 0.174312 0.080673 0.176682 -0.854005 0.237795 0.462740 0.046580 0.584910 0.151269 0.059879 0.144841 -0.854005 0.237795 0.462740 0.134250 0.589370 0.151269 0.059879 0.144841 -0.855175 0.294363 0.426645 0.134250 0.589370 0.174312 0.080673 0.176682 -0.855175 0.294363 0.426645 0.046580 0.584910 0.172340 0.088145 0.167574 -0.855175 0.294363 0.426645 0.061920 0.574880 0.161018 0.070392 0.147527 -0.684546 0.692765 -0.226877 0.119270 0.573250 0.151269 0.059879 0.144841 -0.684546 0.692765 -0.226877 0.134250 0.589370 0.172340 0.088145 0.167574 -0.684546 0.692765 -0.226877 0.061920 0.574880 0.172340 0.088145 0.167574 -0.217964 0.788476 -0.575150 0.061920 0.574880 0.177914 0.078618 0.152401 -0.217964 0.788476 -0.575150 0.076558 0.550459 0.161018 0.070392 0.147527 -0.217964 0.788476 -0.575150 0.119270 0.573250 0.161981 0.058897 0.135046 -0.155900 0.720547 -0.675653 0.137991 0.550913 0.161018 0.070392 0.147527 -0.155900 0.720547 -0.675653 0.119270 0.573250 0.177914 0.078618 0.152401 -0.155900 0.720547 -0.675653 0.076558 0.550459 0.161981 0.058897 0.135046 -0.498954 0.617936 -0.607618 0.137991 0.550913 0.151269 0.059879 0.144841 -0.498954 0.617936 -0.607618 0.134250 0.589370 0.161018 0.070392 0.147527 -0.498954 0.617936 -0.607618 0.119270 0.573250 0.177914 0.078618 0.152401 0.491377 0.807443 -0.326473 0.076558 0.550459 0.172340 0.088145 0.167574 0.491377 0.807443 -0.326473 0.061920 0.574880 0.184018 0.079932 0.164838 0.491377 0.807443 -0.326473 0.046470 0.549800 0.104757 0.078397 0.218252 -0.087544 0.744781 -0.661541 0.119475 0.806425 0.118628 0.093343 0.233243 -0.087544 0.744781 -0.661541 0.068000 0.797370 0.119937 0.077291 0.214998 -0.087544 0.744781 -0.661541 0.094384 0.772592 0.119937 0.077291 0.214998 -0.302290 0.704802 -0.641775 0.094384 0.772592 0.118628 0.093343 0.233243 -0.302290 0.704802 -0.641775 0.068000 0.797370 0.128568 0.090583 0.225530 -0.302290 0.704802 -0.641775 0.062010 0.771769 0.086585 0.059950 0.204852 -0.739178 -0.127042 0.661420 0.187156 0.190790 0.075763 0.037689 0.188482 -0.739178 -0.127042 0.661420 0.246170 0.197800 0.093507 0.047680 0.210231 -0.739178 -0.127042 0.661420 0.175260 0.199050 0.097660 0.038978 0.172552 -0.194770 0.310967 0.930250 0.210540 0.264840 0.095701 0.027930 0.175835 -0.194770 0.310967 0.930250 0.220030 0.259690 0.109910 0.024071 0.180100 -0.194770 0.310967 0.930250 0.186271 0.283171 0.109910 0.024071 0.180100 -0.489258 -0.485360 0.724605 0.186271 0.283171 0.123196 0.044287 0.202612 -0.489258 -0.485360 0.724605 0.122720 0.274200 0.107971 0.041337 0.190356 -0.489258 -0.485360 0.724605 0.166593 0.267539 0.123289 0.059764 0.206979 -0.586337 -0.216715 0.780540 0.112692 0.264495 0.107971 0.041337 0.190356 -0.586337 -0.216715 0.780540 0.166593 0.267539 0.123196 0.044287 0.202612 -0.586337 -0.216715 0.780540 0.122720 0.274200 0.109910 0.024071 0.180100 0.273703 -0.790311 0.548174 0.186271 0.283171 0.141667 0.052178 0.204766 0.273703 -0.790311 0.548174 0.098020 0.295780 0.123196 0.044287 0.202612 0.273703 -0.790311 0.548174 0.122720 0.274200 0.109910 0.024071 0.180100 -0.775908 -0.384301 0.500279 0.186271 0.283171 0.107971 0.041337 0.190356 -0.775908 -0.384301 0.500279 0.166593 0.267539 0.097660 0.038978 0.172552 -0.775908 -0.384301 0.500279 0.210540 0.264840 0.123289 0.059764 0.206979 -0.540231 -0.168491 0.824476 0.112692 0.264495 0.141494 0.076623 0.222353 -0.540231 -0.168491 0.824476 0.059790 0.277920 0.144382 0.092417 0.227473 -0.540231 -0.168491 0.824476 0.036651 0.275151 0.141494 0.076623 0.222353 0.056107 -0.317159 0.946711 0.053758 0.278100 0.156812 0.096983 0.228266 0.056107 -0.317159 0.946711 0.033925 0.290432 0.144382 0.092417 0.227473 0.056107 -0.317159 0.946711 0.036651 0.275151 0.141667 0.052178 0.204766 0.417494 -0.528731 0.739015 0.043468 0.298260 0.156812 0.096983 0.228266 0.417494 -0.528731 0.739015 0.033925 0.290432 0.141494 0.076623 0.222353 0.417494 -0.528731 0.739015 0.053758 0.278100 0.141667 0.052178 0.204766 0.668676 -0.509881 0.541197 0.043468 0.298260 0.154832 0.073607 0.208689 0.668676 -0.509881 0.541197 0.049561 0.321938 0.156812 0.096983 0.228266 0.668676 -0.509881 0.541197 0.033925 0.290432 0.154832 0.073607 0.208689 0.899394 -0.322928 0.294630 0.049561 0.321938 0.160456 0.093784 0.213636 0.899394 -0.322928 0.294630 0.025280 0.326291 0.156812 0.096983 0.228266 0.899394 -0.322928 0.294630 0.010440 0.305130 0.154832 0.073607 0.208689 0.829718 -0.449044 -0.331555 0.048226 0.322009 0.141667 0.052178 0.204766 0.829718 -0.449044 -0.331555 0.081990 0.304590 0.142189 0.063498 0.190741 0.829718 -0.449044 -0.331555 0.087940 0.327060 0.184018 0.079932 0.164838 0.591821 0.792575 0.146878 0.044750 0.458050 0.172340 0.088145 0.167574 0.591821 0.792575 0.146878 0.035060 0.447515 0.182614 0.078900 0.176064 0.591821 0.792575 0.146878 0.036999 0.436733 0.141494 0.076623 0.222353 0.152655 -0.576454 0.802743 0.059790 0.277920 0.123196 0.044287 0.202612 0.152655 -0.576454 0.802743 0.092590 0.280640 0.141667 0.052178 0.204766 0.152655 -0.576454 0.802743 0.081990 0.304590 0.172340 0.088145 0.167574 0.210187 0.777679 0.592483 0.036470 0.432090 0.174312 0.080673 0.176682 0.210187 0.777679 0.592483 0.043260 0.424780 0.182614 0.078900 0.176064 0.210187 0.777679 0.592483 0.036999 0.436733 0.168610 0.067224 0.169180 0.319246 -0.644602 0.694673 0.067350 0.424040 0.156379 0.044803 0.153996 0.319246 -0.644602 0.694673 0.116650 0.420010 0.179213 0.068282 0.165289 0.319246 -0.644602 0.694673 0.085250 0.429680 0.177914 0.078618 0.152401 0.739921 -0.005832 -0.672668 0.075080 0.466000 0.172189 0.056197 0.146298 0.739921 -0.005832 -0.672668 0.098560 0.464290 0.161981 0.058897 0.135046 0.739921 -0.005832 -0.672668 0.116410 0.468430 0.172189 0.056197 0.146298 0.748595 0.211528 -0.628380 0.098560 0.464290 0.153810 0.036576 0.117798 0.748595 0.211528 -0.628380 0.173706 0.466822 0.161981 0.058897 0.135046 0.748595 0.211528 -0.628380 0.116410 0.468430 0.156379 0.044803 0.153996 0.620950 -0.772732 0.131555 0.128690 0.429070 0.153810 0.036576 0.117798 0.620950 -0.772732 0.131555 0.173706 0.466822 0.172189 0.056197 0.146298 0.620950 -0.772732 0.131555 0.098560 0.464290 0.142930 0.026574 0.139531 0.765804 -0.636695 0.090357 0.174691 0.414974 0.153810 0.036576 0.117798 0.765804 -0.636695 0.090357 0.173706 0.466822 0.156379 0.044803 0.153996 0.765804 -0.636695 0.090357 0.128690 0.429070 0.172189 0.056197 0.146298 0.918839 -0.382700 -0.096309 0.098560 0.464290 0.184018 0.079932 0.164838 0.918839 -0.382700 -0.096309 0.044750 0.458050 0.179213 0.068282 0.165289 0.918839 -0.382700 -0.096309 0.058440 0.452240 0.172189 0.056197 0.146298 0.896665 -0.112398 -0.428203 0.098560 0.464290 0.177914 0.078618 0.152401 0.896665 -0.112398 -0.428203 0.075080 0.466000 0.184018 0.079932 0.164838 0.896665 -0.112398 -0.428203 0.044750 0.458050 0.179213 0.068282 0.165289 0.640173 -0.733080 0.229724 0.085250 0.429680 0.156379 0.044803 0.153996 0.640173 -0.733080 0.229724 0.116650 0.420010 0.172189 0.056197 0.146298 0.640173 -0.733080 0.229724 0.098560 0.464290 0.003153 -0.046601 -0.089268 0.856116 0.056674 -0.513667 0.824771 0.564740 -0.032947 -0.077119 -0.152802 0.856116 0.056674 -0.513667 0.958829 0.529430 -0.024684 -0.048566 -0.135880 0.856116 0.056674 -0.513667 0.936076 0.565704 0.097660 0.038978 0.172552 0.374096 0.371146 0.849884 0.207600 0.751920 0.105390 0.048647 0.164927 0.374096 0.371146 0.849884 0.205070 0.725670 0.088707 0.052685 0.170507 0.374096 0.371146 0.849884 0.230999 0.772807 0.179213 0.068282 0.165289 0.922539 -0.377374 0.080688 0.055790 0.445457 0.184018 0.079932 0.164838 0.922539 -0.377374 0.080688 0.049275 0.450166 0.182614 0.078900 0.176064 0.922539 -0.377374 0.080688 0.039630 0.437958 0.118713 0.062923 0.224846 0.130581 -0.574499 0.808022 0.104782 0.225075 0.128282 0.088243 0.241302 0.130581 -0.574499 0.808022 0.086230 0.212680 0.107296 0.067456 0.229914 0.130581 -0.574499 0.808022 0.116859 0.196548 0.118713 0.062923 0.224846 0.546977 -0.591640 0.592265 0.102323 0.225356 0.131489 0.078973 0.229080 0.546977 -0.591640 0.592265 0.069787 0.240614 0.128282 0.088243 0.241302 0.546977 -0.591640 0.592265 0.086230 0.212680 0.128282 0.088243 0.241302 -0.106723 -0.392687 0.913459 0.086230 0.212680 0.113825 0.086887 0.239030 -0.106723 -0.392687 0.913459 0.085630 0.194932 0.107296 0.067456 0.229914 -0.106723 -0.392687 0.913459 0.116859 0.196548 0.158948 0.073733 0.201971 -0.747981 -0.134729 0.649902 0.045070 0.346890 0.159469 0.086296 0.205175 -0.747981 -0.134729 0.649902 0.036382 0.346078 0.149787 0.066389 0.189905 -0.747981 -0.134729 0.649902 0.078462 0.341776 0.173943 0.072128 0.185599 0.987532 -0.153296 0.035792 0.037193 0.399844 0.176435 0.092959 0.206061 0.987532 -0.153296 0.035792 0.016240 0.393960 0.174433 0.077625 0.195623 0.987532 -0.153296 0.035792 0.020480 0.387770 0.176435 0.092959 0.206061 0.047143 -0.248685 0.967436 0.007915 0.371467 0.159469 0.086296 0.205175 0.047143 -0.248685 0.967436 0.021672 0.354337 0.158948 0.073733 0.201971 0.047143 -0.248685 0.967436 0.030040 0.353640 0.158948 0.073733 0.201971 0.431624 -0.545427 0.718477 0.030040 0.353640 0.174433 0.077625 0.195623 0.431624 -0.545427 0.718477 0.019210 0.387510 0.176435 0.092959 0.206061 0.431624 -0.545427 0.718477 0.007915 0.371467 0.113825 0.086887 0.239030 -0.763241 -0.045901 0.644482 0.085630 0.194932 0.086585 0.059950 0.204852 -0.763241 -0.045901 0.644482 0.187156 0.190790 0.107296 0.067456 0.229914 -0.763241 -0.045901 0.644482 0.116859 0.196548 0.142987 0.029221 0.148360 0.638381 -0.762440 -0.105617 0.161963 0.397901 0.150255 0.033474 0.161588 0.638381 -0.762440 -0.105617 0.126154 0.391636 0.135350 0.021139 0.160543 0.638381 -0.762440 -0.105617 0.158440 0.365650 0.119302 0.038419 0.159993 0.369961 0.129537 0.919972 0.182860 0.335000 0.119415 0.029098 0.161260 0.369961 0.129537 0.919972 0.188520 0.331390 0.124638 0.045934 0.156789 0.369961 0.129537 0.919972 0.172400 0.336930 0.142930 0.026574 0.139531 0.953163 -0.291356 0.081197 0.174691 0.414974 0.142987 0.029221 0.148360 0.953163 -0.291356 0.081197 0.161963 0.397901 0.140320 0.014932 0.128395 0.953163 -0.291356 0.081197 0.195960 0.427720 0.131489 0.078973 0.229080 0.711285 -0.660514 0.240407 0.069787 0.240614 0.107389 0.046282 0.210566 0.711285 -0.660514 0.240407 0.147990 0.226080 0.108825 0.043741 0.199336 0.711285 -0.660514 0.240407 0.159984 0.245722 0.053360 0.088072 0.187479 -0.311539 0.935424 -0.167110 0.282632 0.904939 0.063223 0.090410 0.182179 -0.311539 0.935424 -0.167110 0.270710 0.887400 0.053192 0.085858 0.175399 -0.311539 0.935424 -0.167110 0.298639 0.885778 0.052997 0.025909 0.078557 0.193159 0.644918 -0.739440 0.450460 0.714650 0.071762 0.046670 0.101566 0.193159 0.644918 -0.739440 0.374767 0.709924 0.081658 0.033262 0.092457 0.193159 0.644918 -0.739440 0.369880 0.669890 -0.060966 -0.016531 -0.020698 -0.651389 0.538782 0.534235 0.841232 0.965642 -0.070686 -0.013774 -0.035330 -0.651389 0.538782 0.534235 0.884636 0.967596 -0.071377 -0.019477 -0.030421 -0.651389 0.538782 0.534235 0.879123 0.988764 -0.070686 -0.013774 -0.035330 -0.651354 0.538799 0.534260 0.884636 0.967596 -0.080407 -0.011017 -0.049962 -0.651354 0.538799 0.534260 0.928039 0.969549 -0.071377 -0.019477 -0.030421 -0.651354 0.538799 0.534260 0.879123 0.988764 -0.030055 -0.019593 0.010739 -0.712964 0.001680 0.701198 0.733560 0.250650 -0.045510 -0.018062 -0.004979 -0.712964 0.001680 0.701198 0.790600 0.243710 -0.030500 -0.033141 0.010319 -0.712964 0.001680 0.701198 0.740681 0.264800 -0.045510 -0.018062 -0.004979 -0.712964 0.001681 0.701199 0.790600 0.243710 -0.060966 -0.016531 -0.020698 -0.712964 0.001681 0.701199 0.847640 0.236770 -0.030500 -0.033141 0.010319 -0.712964 0.001681 0.701199 0.740681 0.264800 -0.003552 -0.007667 0.034842 -0.709785 0.235454 0.663902 0.647650 0.255020 -0.016803 -0.013630 0.022790 -0.709785 0.235454 0.663902 0.690605 0.252835 -0.023862 -0.025303 0.019383 -0.709785 0.235454 0.663902 0.712310 0.264110 -0.025528 -0.015002 -0.098342 0.523553 0.697209 -0.489685 0.894100 0.654540 -0.008270 -0.013472 -0.077712 0.523553 0.697209 -0.489685 0.825605 0.640405 -0.004285 -0.027983 -0.094112 0.523553 0.697209 -0.489685 0.848720 0.590070 -0.008270 -0.013472 -0.077712 0.523510 0.697224 -0.489709 0.825605 0.640405 0.008989 -0.011941 -0.057082 0.523510 0.697224 -0.489709 0.757109 0.626270 -0.004285 -0.027983 -0.094112 0.523510 0.697224 -0.489709 0.848720 0.590070 -0.047826 -0.000722 -0.060163 0.009873 0.938464 -0.345236 0.877380 0.822860 -0.036677 -0.007862 -0.079253 0.009873 0.938464 -0.345236 0.885739 0.738700 -0.082414 -0.008469 -0.082211 0.009873 0.938464 -0.345236 0.963945 0.892963 -0.036677 -0.007862 -0.079253 0.009874 0.938458 -0.345252 0.885739 0.738700 -0.025528 -0.015002 -0.098342 0.009874 0.938458 -0.345252 0.894100 0.654540 -0.082414 -0.008469 -0.082211 0.009874 0.938458 -0.345252 0.963945 0.892963 -0.080407 -0.011017 -0.049962 -0.273470 0.957407 0.092664 0.928039 0.969549 -0.064116 -0.005870 -0.055063 -0.273470 0.957407 0.092664 0.902709 0.896205 -0.082414 -0.008469 -0.082211 -0.273470 0.957407 0.092664 0.963945 0.892963 0.045717 0.011490 0.032308 -0.182390 0.973132 -0.140527 0.534848 0.690702 0.036877 0.011536 0.044100 -0.182390 0.973132 -0.140527 0.536104 0.738321 0.062588 0.018440 0.058539 -0.182390 0.973132 -0.140527 0.462180 0.663670 0.036877 0.011536 0.044100 -0.182362 0.973130 -0.140576 0.536104 0.738321 0.028037 0.011583 0.055893 -0.182362 0.973130 -0.140576 0.537360 0.785940 0.062588 0.018440 0.058539 -0.182362 0.973130 -0.140576 0.462180 0.663670 0.028037 0.011583 0.055893 -0.631896 0.718168 0.291449 0.537360 0.785940 0.012243 0.001958 0.045367 -0.631896 0.718168 0.291449 0.575925 0.816265 0.016955 -0.004583 0.071701 -0.631896 0.718168 0.291449 0.536530 0.818012 0.012243 0.001958 0.045367 -0.631858 0.718200 0.291451 0.575925 0.816265 -0.003552 -0.007667 0.034842 -0.631858 0.718200 0.291451 0.614490 0.846590 0.016955 -0.004583 0.071701 -0.631858 0.718200 0.291451 0.536530 0.818012 0.029745 -0.010530 -0.025899 0.757465 0.392194 -0.521949 0.708175 0.630170 0.040124 -0.009825 -0.010307 0.757465 0.392194 -0.521949 0.683707 0.632120 0.029309 -0.029773 -0.040991 0.757465 0.392194 -0.521949 0.694998 0.593245 0.040124 -0.009825 -0.010307 0.757479 0.392177 -0.521942 0.683707 0.632120 0.050502 -0.009120 0.005284 0.757479 0.392177 -0.521942 0.659240 0.634070 0.029309 -0.029773 -0.040991 0.757479 0.392177 -0.521942 0.694998 0.593245 0.008989 -0.011941 -0.057082 0.757481 0.392213 -0.521912 0.757109 0.626270 0.019367 -0.011236 -0.041490 0.757481 0.392213 -0.521912 0.732642 0.628220 0.029309 -0.029773 -0.040991 0.757481 0.392213 -0.521912 0.694998 0.593245 0.019367 -0.011236 -0.041490 0.757458 0.392199 -0.521955 0.732642 0.628220 0.029745 -0.010530 -0.025899 0.757458 0.392199 -0.521955 0.708175 0.630170 0.029309 -0.029773 -0.040991 0.757458 0.392199 -0.521955 0.694998 0.593245 -0.064116 -0.005870 -0.055063 -0.273531 0.957385 0.092707 0.902709 0.896205 -0.055971 -0.003296 -0.057613 -0.273531 0.957385 0.092707 0.890044 0.859532 -0.082414 -0.008469 -0.082211 -0.273531 0.957385 0.092707 0.963945 0.892963 -0.047826 -0.000722 -0.060163 -0.273531 0.957385 0.092707 0.877380 0.822860 -0.016803 -0.013630 0.022790 -0.709692 0.235359 0.664036 0.690605 0.252835 -0.023429 -0.016611 0.016765 -0.709692 0.235359 0.664036 0.712083 0.251742 -0.023862 -0.025303 0.019383 -0.709692 0.235359 0.664036 0.712310 0.264110 -0.023429 -0.016611 0.016765 -0.709760 0.235342 0.663969 0.712083 0.251742 -0.030055 -0.019593 0.010739 -0.709760 0.235342 0.663969 0.733560 0.250650 -0.023862 -0.025303 0.019383 -0.709760 0.235342 0.663969 0.712310 0.264110 3 0 1 2 3 3 4 5 3 6 7 8 3 9 10 11 3 12 13 14 3 15 16 17 3 18 19 20 3 21 22 23 3 24 25 26 3 27 28 29 3 30 31 32 3 33 34 35 3 36 37 38 3 39 40 41 3 42 43 44 3 45 46 47 3 48 49 50 3 51 52 53 3 54 55 56 3 57 58 59 3 60 61 62 3 63 64 65 3 66 67 68 3 69 70 71 3 72 73 74 3 75 76 77 3 78 79 80 3 81 82 83 3 84 85 86 3 87 88 89 3 90 91 92 3 93 94 95 3 96 97 98 3 99 100 101 3 102 103 104 3 105 106 107 3 108 109 110 3 111 112 113 3 114 115 116 3 117 118 119 3 120 121 122 3 123 124 125 3 126 127 128 3 129 130 131 3 132 133 134 3 135 136 137 3 138 139 140 3 141 142 143 3 144 145 146 3 147 148 149 3 150 151 152 3 153 154 155 3 156 157 158 3 159 160 161 3 162 163 164 3 165 166 167 3 168 169 170 3 171 172 173 3 174 175 176 3 177 178 179 3 180 181 182 3 183 184 185 3 186 187 188 3 189 190 191 3 192 193 194 3 195 196 197 3 198 199 200 3 201 202 203 3 204 205 206 3 207 208 209 3 210 211 212 3 213 214 215 3 216 217 218 3 219 220 221 3 222 223 224 3 225 226 227 3 228 229 230 3 231 232 233 3 234 235 236 3 237 238 239 3 240 241 242 3 243 244 245 3 246 247 248 3 249 250 251 3 252 253 254 3 255 256 257 3 258 259 260 3 261 262 263 3 264 265 266 3 267 268 269 3 270 271 272 3 273 274 275 3 276 277 278 3 279 280 281 3 282 283 284 3 285 286 287 3 288 289 290 3 291 292 293 3 294 295 296 3 297 298 299 3 300 301 302 3 303 304 305 3 306 307 308 3 309 310 311 3 312 313 314 3 315 316 317 3 318 319 320 3 321 322 323 3 324 325 326 3 327 328 329 3 330 331 332 3 333 334 335 3 336 337 338 3 339 340 341 3 342 343 344 3 345 346 347 3 348 349 350 3 351 352 353 3 354 355 356 3 357 358 359 3 360 361 362 3 363 364 365 3 366 367 368 3 369 370 371 3 372 373 374 3 375 376 377 3 378 379 380 3 381 382 383 3 384 385 386 3 387 388 389 3 390 391 392 3 393 394 395 3 396 397 398 3 399 400 401 3 402 403 404 3 405 406 407 3 408 409 410 3 411 412 413 3 414 415 416 3 417 418 419 3 420 421 422 3 423 424 425 3 426 427 428 3 429 430 431 3 432 433 434 3 435 436 437 3 438 439 440 3 441 442 443 3 444 445 446 3 447 448 449 3 450 451 452 3 453 454 455 3 456 457 458 3 459 460 461 3 462 463 464 3 465 466 467 3 468 469 470 3 471 472 473 3 474 475 476 3 477 478 479 3 480 481 482 3 483 484 485 3 486 487 488 3 489 490 491 3 492 493 494 3 495 496 497 3 498 499 500 3 501 502 503 3 504 505 506 3 507 508 509 3 510 511 512 3 513 514 515 3 516 517 518 3 519 520 521 3 522 523 524 3 525 526 527 3 528 529 530 3 531 532 533 3 534 535 536 3 537 538 539 3 540 541 542 3 543 544 545 3 546 547 548 3 549 550 551 3 552 553 554 3 555 556 557 3 558 559 560 3 561 562 563 3 564 565 566 3 567 568 569 3 570 571 572 3 573 574 575 3 576 577 578 3 579 580 581 3 582 583 584 3 585 586 587 3 588 589 590 3 591 592 593 3 594 595 596 3 597 598 599 3 600 601 602 3 603 604 605 3 606 607 608 3 609 610 611 3 612 613 614 3 615 616 617 3 618 619 620 3 621 622 623 3 624 625 626 3 627 628 629 3 630 631 632 3 633 634 635 3 636 637 638 3 639 640 641 3 642 643 644 3 645 646 647 3 648 649 650 3 651 652 653 3 654 655 656 3 657 658 659 3 660 661 662 3 663 664 665 3 666 667 668 3 669 670 671 3 672 673 674 3 675 676 677 3 678 679 680 3 681 682 683 3 684 685 686 3 687 688 689 3 690 691 692 3 693 694 695 3 696 697 698 3 699 700 701 3 702 703 704 3 705 706 707 3 708 709 710 3 711 712 713 3 714 715 716 3 717 718 719 3 720 721 722 3 723 724 725 3 726 727 728 3 729 730 731 3 732 733 734 3 735 736 737 3 738 739 740 3 741 742 743 3 744 745 746 3 747 748 749 3 750 751 752 3 753 754 755 3 756 757 758 3 759 760 761 3 762 763 764 3 765 766 767 3 768 769 770 3 771 772 773 3 774 775 776 3 777 778 779 3 780 781 782 3 783 784 785 3 786 787 788 3 789 790 791 3 792 793 794 3 795 796 797 3 798 799 800 3 801 802 803 3 804 805 806 3 807 808 809 3 810 811 812 3 813 814 815 3 816 817 818 3 819 820 821 3 822 823 824 3 825 826 827 3 828 829 830 3 831 832 833 3 834 835 836 3 837 838 839 3 840 841 842 3 843 844 845 3 846 847 848 3 849 850 851 3 852 853 854 3 855 856 857 3 858 859 860 3 861 862 863 3 864 865 866 3 867 868 869 3 870 871 872 3 873 874 875 3 876 877 878 3 879 880 881 3 882 883 884 3 885 886 887 3 888 889 890 3 891 892 893 3 894 895 896 3 897 898 899 3 900 901 902 3 903 904 905 3 906 907 908 3 909 910 911 3 912 913 914 3 915 916 917 3 918 919 920 3 921 922 923 3 924 925 926 3 927 928 929 3 930 931 932 3 933 934 935 3 936 937 938 3 939 940 941 3 942 943 944 3 945 946 947 3 948 949 950 3 951 952 953 3 954 955 956 3 957 958 959 3 960 961 962 3 963 964 965 3 966 967 968 3 969 970 971 3 972 973 974 3 975 976 977 3 978 979 980 3 981 982 983 3 984 985 986 3 987 988 989 3 990 991 992 3 993 994 995 3 996 997 998 3 999 1000 1001 3 1002 1003 1004 3 1005 1006 1007 3 1008 1009 1010 3 1011 1012 1013 3 1014 1015 1016 3 1017 1018 1019 3 1020 1021 1022 3 1023 1024 1025 3 1026 1027 1028 3 1029 1030 1031 3 1032 1033 1034 3 1035 1036 1037 3 1038 1039 1040 3 1041 1042 1043 3 1044 1045 1046 3 1047 1048 1049 3 1050 1051 1052 3 1053 1054 1055 3 1056 1057 1058 3 1059 1060 1061 3 1062 1063 1064 3 1065 1066 1067 3 1068 1069 1070 3 1071 1072 1073 3 1074 1075 1076 3 1077 1078 1079 3 1080 1081 1082 3 1083 1084 1085 3 1086 1087 1088 3 1089 1090 1091 3 1092 1093 1094 3 1095 1096 1097 3 1098 1099 1100 3 1101 1102 1103 3 1104 1105 1106 3 1107 1108 1109 3 1110 1111 1112 3 1113 1114 1115 3 1116 1117 1118 3 1119 1120 1121 3 1122 1123 1124 3 1125 1126 1127 3 1128 1129 1130 3 1131 1132 1133 3 1134 1135 1136 3 1137 1138 1139 3 1140 1141 1142 3 1143 1144 1145 3 1146 1147 1148 3 1149 1150 1151 3 1152 1153 1154 3 1155 1156 1157 3 1158 1159 1160 3 1161 1162 1163 3 1164 1165 1166 3 1167 1168 1169 3 1170 1171 1172 3 1173 1174 1175 3 1176 1177 1178 3 1179 1180 1181 3 1182 1183 1184 3 1185 1186 1187 3 1188 1189 1190 3 1191 1192 1193 3 1194 1195 1196 3 1197 1198 1199 3 1200 1201 1202 3 1203 1204 1205 3 1206 1207 1208 3 1209 1210 1211 3 1212 1213 1214 3 1215 1216 1217 3 1218 1219 1220 3 1221 1222 1223 3 1224 1225 1226 3 1227 1228 1229 3 1230 1231 1232 3 1233 1234 1235 3 1236 1237 1238 3 1239 1240 1241 3 1242 1243 1244 3 1245 1246 1247 3 1248 1249 1250 3 1251 1252 1253 3 1254 1255 1256 3 1257 1258 1259 3 1260 1261 1262 3 1263 1264 1265 3 1266 1267 1268 3 1269 1270 1271 3 1272 1273 1274 3 1275 1276 1277 3 1278 1279 1280 3 1281 1282 1283 3 1284 1285 1286 3 1287 1288 1289 3 1290 1291 1292 3 1293 1294 1295 3 1296 1297 1298 3 1299 1300 1301 3 1302 1303 1304 3 1305 1306 1307 3 1308 1309 1310 3 1311 1312 1313 3 1314 1315 1316 3 1317 1318 1319 3 1320 1321 1322 3 1323 1324 1325 3 1326 1327 1328 3 1329 1330 1331 3 1332 1333 1334 3 1335 1336 1337 3 1338 1339 1340 3 1341 1342 1343 3 1344 1345 1346 3 1347 1348 1349 3 1350 1351 1352 3 1353 1354 1355 3 1356 1357 1358 3 1359 1360 1361 3 1362 1363 1364 3 1365 1366 1367 3 1368 1369 1370 3 1371 1372 1373 3 1374 1375 1376 3 1377 1378 1379 3 1380 1381 1382 3 1383 1384 1385 3 1386 1387 1388 3 1389 1390 1391 3 1392 1393 1394 3 1395 1396 1397 3 1398 1399 1400 3 1401 1402 1403 3 1404 1405 1406 3 1407 1408 1409 3 1410 1411 1412 3 1413 1414 1415 3 1416 1417 1418 3 1419 1420 1421 3 1422 1423 1424 3 1425 1426 1427 3 1428 1429 1430 3 1431 1432 1433 3 1434 1435 1436 3 1437 1438 1439 3 1440 1441 1442 3 1443 1444 1445 3 1446 1447 1448 3 1449 1450 1451 3 1452 1453 1454 3 1455 1456 1457 3 1458 1459 1460 3 1461 1462 1463 3 1464 1465 1466 3 1467 1468 1469 3 1470 1471 1472 3 1473 1474 1475 3 1476 1477 1478 3 1479 1480 1481 3 1482 1483 1484 3 1485 1486 1487 3 1488 1489 1490 3 1491 1492 1493 3 1494 1495 1496 3 1497 1498 1499 3 1500 1501 1502 3 1503 1504 1505 3 1506 1507 1508 3 1509 1510 1511 3 1512 1513 1514 3 1515 1516 1517 3 1518 1519 1520 3 1521 1522 1523 3 1524 1525 1526 3 1527 1528 1529 3 1530 1531 1532 3 1533 1534 1535 3 1536 1537 1538 3 1539 1540 1541 3 1542 1543 1544 3 1545 1546 1547 3 1548 1549 1550 3 1551 1552 1553 3 1554 1555 1556 3 1557 1558 1559 3 1560 1561 1562 3 1563 1564 1565 3 1566 1567 1568 3 1569 1570 1571 3 1572 1573 1574 3 1573 1575 1574 3 1576 1577 1578 3 1579 1580 1581 opensurgsim-0.7.0/Examples/Stapling/Data/Geometry/forearm.osgb000066400000000000000000005360451277777236100244430ustar00rootroot00000000000000¡‘lEEûP0 osg::Groupbody_forearm.objÿÿÿÿ osg::Geodeforearmÿÿÿÿ osg::Geometry osg::StateSet osg::Materialforearm_mat_forearm.png€?€?ÍÌL?ÍÌL?ÍÌL?€?ÍÌL?ÍÌL?ÍÌL?€?ÍÌÌ=ÍÌÌ=ÍÌÌ=€?ÍÌÌ=ÍÌÌ=ÍÌÌ=€?€?€?q=ŠAq=ŠAá osg::Texture2D)))'&€?  forearm.png{5‹5Œ‹…Š„‰ƒˆ‚ZXYV5 …€„ƒ~‚}XWVU5€xv~u}t|s{rRPQO5xwv&u't/s7r?PGON5 &%'./67>?FGMN5 %-.56=>EFM5 -45<=DELM54;<CDJK5;BCIJ5IBHA@9810)(5A:921*) 5:32+*! ú53,+"! üúû5    ™ü›û5     –˜—™›5  ‘’‡†5 wy‘z€…5€zxyw5C P Q O R Y Z 5P N O d l k o n u m t s r q 5N a d c k j n m 5a ` c b j i m 5` a L M J K H A ? @ 8 9 2 z {  5K C A B @ u 9 y z ~  ˆ ‰ ‘ C 5B t u x y ~ 5 ~ x ˆ w v @ A > ? 9 5x t w s v r A ? 5t p s o r n q 5p k o j n i 5k W j g i f h e < T U N V M L A 5h < 6 U W V X L Y K , - ( )  5   ( ' , [ Y Z X 5 ‚ ' ƒ [ \ Z 5‚ ƒ ] \ 5] ^  _ } ð { î ã ì á ç ß Ý Þ 5 €  ~ } | { z ã y â x à w v 5 € ˆ ~ ‡ | † z … y „ x w 5ˆ ‡ Ž † … „ 5 ˆ ¼ Ž . 58476545/.¾ ¼ ½ ¸ · ¶ µ ´ ³ ² ± ° 5¼ ¸ ¹ ¶ ´ 5 » ¹ º ´ ² 5 ² º ” » ’ ‘ ˆ ‰ € Š ‚  5 ” ’ “ ‘ ˜ ‰ ‹ Š Œ   5˜ ‹ ™ Œ ¢  5 £ ¢ š ™ • “ ” 5£ › š — • – ” ² 5› œ — ® – ° ² 5œ ­ ® ¯ ° ± 5¯ ± 5ÿ þ ý ¨ § ¥ ¦ ¤ 5 þ « ¨ © ¥ £ ¤ ¢ 5«   © ª £ ¡ ¢   µ ³ ´ ² Ñ  Ò 5  ¡ ª ¨ ¡ ª   ³ 5¡ § ¨ © ª « ³ ² 5 ² « ± © ° § ¯ ® @ > ? = 5§ ¦ ® ­ > < = ; 5­ ¬ < # ; 9 8 6 5# % 9 : 6 4 5 3 5%  :  4 . 3 2 52 . -         D E H 5 E     "  (  + , 0 1 5 E !   # " ' ( * + / 0 5 $ # & ' ) * / 5$ % [ d a c ` b _ e f g h i j 5 ! [ Z a ^ ` ] _ \ f s h t j u 5Z W ^ V ] U \ T s z t { u | v } 5W L V N U P T R z { ‚ | ƒ } „ 5L M N O P Q R S ˆ ‚ ‰ ƒ Š „ ‹ 5„ ‹ … Œ † ‡ Ž ” ‘ ˜ ™ › š ž 5 … †  € y • – ˜ œ › ž 5˜ • ” € ‡ † 5ã â á à ß Þ 5 i h m 6 5 / - . , 5, + - 4 5 ; m 5+ 3 4 : ; 5 : 3 9 2 8 1 7 0 J ù K û 53 ) 2 ' 1 % 0 ø ù ö ú õ · ò à è 5) ( ' & % ñ ø ï ÷ í ô ë ê ç æ Ý 5 ø ÷ ö ô ó ê é æ å Û Ù Ú Ø 5æ Ý Û Ü Ú 5}|W{5 {RTSU^_ijoqp5 RQS]^hinompl5nhg]\QO5O[\fglm5ù ú û · ­ ® © ª ¡ ¢ š › Z [ Y 5® ¯ ª « ¢ £ › œ Z X Y W _ U ^ S 5U W V X œ ¥    > < = ; 5¥ ³  µ   < : ; 9 ÝØÜÛçæ5³ ´ µ ¶   : 8 9 רÖÛÚæå5´ $ ¶   7 8 6 ×ÕÖÔÚÙåÌ5 7 5 6 4 ÕÓÔÎÙÌ5ÓÒÎÍÌËÊÉÈÇÆÅÄÃÂÀ5ÍÑËÐÉÏÇÅ5Ñ0 Ð/ Ï. ÅÃ50 Ñ1 2 3 4 5 54 2 ÒÑÍ5ö ó õ ò 5ó é ò è 5é å è ä Æ É Ç Ê È Ë ¾ Ì À Í Â Î 5 å Ù ä × É Ð Ê Ñ Ë Ò Ì Í 5 Ù Ø × Ö Ð Ó Ñ Ô Ò Õ Í Î 5® · ¯ ¸ ° ¹ ± º » ¼ ½ ¾ ¿ À Á  5· à ¸ Ä ¹ Å º ¼ 5Ã Æ Ä Ç Å È ¼ ¾ 59 8 > = @ B C 58 7 = G B D C E ‘ – ’ — “ ˜ ” ™ 57 J G H D F E – 5F ž – — 5F § ž Ÿ — ˜ 5§ ¨ Ÿ   ˜ ™ 5§ ­ ¨ ©   ¡ ™ š • Ž [ † ‡ … W 5• Ž † „ … ƒ    ( & ' % / . 5… W    & $ % # . - 4 3 : € 5W T  ÿ þ $ " # ! - , 3 | 5T Q ÿ ý þ ü " !  , z | { } „ 5ü k l  x z y { ƒ „ † ‡    5l j x w y ‚ ƒ † 5 w ‚     5     5     5   O 5 N O P 5 w N v P u 5w j v t u s 5j h t r s q 5h f r o q p 5p o n b a ^ ] S Q R P T    5p n m a ` ] \ Q O P F  E ˜ 5P    5  5 @ ˜5 > @ ? A ãB äG ìL ôN ü5> = ? áãâäëìóôûü 5= ßáàâêëòóúûþÿ  5 ßÞàéêñòùúýþ 5 Þèéðñøù  5ù ý   53 + ) * ( 5™ • ” Œ „ ‚ ƒ }  * ( ) ' 0 / 5 0 1 ) + * | } ‚ ‹ Œ “ ” 5 1 2 + { | € Š ‹ ’ “ 5{  € ‰ Š ‘ ’ 5‚ †  5     5  þ ÿ ž ý £ § ¤ ¨ ¥ © ¦ ª 5¦ ¢ ¥ ¡ ¤   £ Ÿ ž š – — “ ” 5¢ ¡ œ   › Ÿ š 5š › — ˜ ” • 5› œ ˜ ™ • 5: ; 4 5 . / 5; < 5 6 / 0 5< = 6 7 0 1 5= > 7 8 1 2 5= F > ? 8 5 ? F H G J I L ^ ` _ b 5G E I \ ^ ] _ 5E D \ [ ] 5D Z [ Ž 5 Ž Œ ‹ Š ‰ ˆ … ‡ „ 5 Œ X Š €  … } „ 5€ ~  } 5G F E = < 5E < D ; Z 5ñ ð ï î í ì ë ç 5­ § û I 5§ F I H 5ü ý k i j h 5ý Q i g h f 5Q R g e f d o b 5 b d c e S R U T W 5 W ‡ U V S _ c ^ b 5‡ [ V Y _ 5 @ A ˜C E D F I O K  2A 5B G D H I J K 5G L H M J 5€ X : Y 5Y X Z Ž 2$5%4'5)6+7-8/91:;<5 4=5>6?7@895=A>B?@5ACBDEFGHIJKLMNOP5 OQMRKSITGU@95 QVRWSXTYU:95 VZW[X\Y<:5Z][^\_<`;abcde5]f^g_h`iajcklm5 hniojpkqrs5 ntoupvqwx5tyuzv{w5{z|}~€‚ƒ„…†‡ˆ‰5ƒŠ…‹‡Œ‰Ž‘’“”•5’–—Ž˜‰™š›œžŸ ¡5—–¢£˜¤™¥›¦§Ÿ¨¡©5–ª£«¤¬¥­¦®§¯¨°©±5ª²«³¬´­µ®¶¯·°¸±¹5²º³»´¼µ½¶¾·¿¸À¹Á5 ½Â¾Ã¿ÄÀÅÁÆÇÈ5 ÃÉÄÊÅËÆÌÈÍ5 ÉÎÊÏËÐÌÑÍÒÓÔ5 ÎÕÏÖÐ×ÑØÒÙÔÚ5 ÕÛÖÜ×ÝØÞÙßÚà5 ÛáÜâÝãÞäßåàæ5 áçâèãéäêåëæì5 çíèîéïêðëñìò5íóîôïõðöñ÷òøùúû5 óýôþõÿö÷øú5ýÁþÂÿ5ÁÀÂ5À5À¾¿½ÿÞéßà×áÙ5ÀÁ¿þÿòéêàâáã&5Áýþøòóêëâäãå5ýóøùóôëìäæåç5óíùúôõìíæèçï 5 íçúûõöíîèï5çáûüö÷îðïñ >5áÛüý÷ÉÃ5ÛÕýÉ25b h i g 5h f g e 5f [ e 5O l Y p 5–’ªa²[ºU@A>?5’”a\[VUOAJBKDLFM5”]\WVPOJ5JPKQLRMSNTëéêèóò5 PWQXRYSZTé5W]X^Y_Z`éçèæòñúù5_b`cçåæäñðùø·µ¶5c‘åãäâðïø¹·¸¶½¾Å5‘ãáâßﻹº¸¼½ÄÅÏ5ßݻغּÕÓÔÑÒÐËÊg5ÝÚØÙÖ×ÕÎÔÍÒÌËhg5×yÎtÍnÌh5y×Û5}zy5Œš…†5BE@G5 º@»=¼½ñÂðÃ÷5@>=ñ5&(')5 (*)+½¼¾¿5/*,+-¼¶¸·¹¨Á§Â¦5 /0,.-µ¶ª·¨5/01.2µ®¬­«±³—´˜5µ¬ª«©´¡˜™’š”97865¡™›šœ9:8;<=>?@AB586<¸>@5¸j@B5 jiBhDgFfHe5 ishtgufvew5sytz{|u}v~w€5 |‚}ƒ~„…†‡ˆ‰5 ‚Šƒ‹„Œ…†Žˆ5 ‚Š‹‘Œ’“Ž5 ’‘”•–—˜™š›œ5‚—™›5‚|žŸ5|zž 5zy ¡5¡yxsrikjl¹n421,*5 lmkqr£x¢¡5lnmo5 onp23./-¿ÀÁÂÃ52,.-5,+-)ÀÄÂÅ5,*+)5*()'Ä5*0(&'%ùÊÌËͺÏÑÐÙ5ËÕº×ÑØÙ  ÿ5 ×ÖØ5 Ö#ÿ5#"þÿý 5 !þüýû;Ø5 !öüõûúùØ5úòùñØáÙâÚãÛäßfàg5ÚÛÐÜÑÞÒàngmlvuxx5xyvwmonpÒÇÑÈÐÉÏÊ5pÅÇÄÈÃÉGÊFË?Ì=<85ÅÀÄÁÃÂGIHA@5BACJELMYZdek5AIJKLXYcdjksltmu5I¼K]X\c¦j¥s}w~x5¼^][\Z¦X¥V}UTc†…2U5Y`WaUbc…5Y_`fagbij„†…‡•Œ–5 Œ‰‡ˆ†kjlb…5…lƒkˆŠ}‹{Ÿ¡ ¢§5¢¡z{|}~€‚ƒ„…†5z‡|ˆ~‰€Š‚‹„ŒŽ5‹‘Œ’Ž“”•–—˜™š›œ5•—ž™Ÿ› ¡¢£¤¥¦§5 ›œ¡¨£©¥ª§«¬­®5®¯¬°§¦5®±¯²°³¦´µ¶·¸¹º»¼5±½²¾³¿´¶5¾À¿Á¶Â¸ÃºÄÅÆÇÈÉÊ5ÁÀÂËÌÍÎÏÆÐÈÑÊÒÓÔ5ÀÕËÖÍ×ÏØÐÙÑÚÒÛÜÝ5 ×ÞØßÙàÚáâãä5 ×åÞæçèßéàá5 ×êåëæìíîïðñòó5×Öêôëõìî5 ÖÕôöõ÷îøðùò5 Õ¾ö½÷±øúù5 8 on¤[PX5    mnl[\XYQR5lt\]Y^ZîTUKMLN÷ö5 öø÷ELCKJTSZRY5RSIJACBDÄÅÆÇÈÉÊË5Ê#È‘ÆÄˉŠ76545‘ŽŒ‹Š5ŠŒ–Ž—˜’5—±–Š5б²¯°465°6²Š5Y[_^d½¾À¿ÅÆpqow5^¼½ÁÀ5Á¼ÂI5ÊÓÉðñb`a_ó]SQRPT5 ðïbîaòóUSTR5ïþîíòìWëVêéDNEM5 òWUVTéPNOMZ5Z[OQP5 Ze[f\gh¼iºÅ5elfmgn¼o»pqr ¢5munvop5v{p|rŸ 5 |{zvyuxtws5yz€|Ÿ5€ž5~†T5 ÒÜÔûüýþÿ5Ürûqý ÿ   91875q   5 q 15 s¯rÝÜ5ݨ¯§Ž*0./-5 §Ž"*).-5"œ’›”š–®Ð¯Ï5‘’“”•–—˜™ÐÏ5 •“³‘²©«ª¬®äâ5 ‘©¨ªÝ®ÛâÚ5þïüÓÔ5 ‘’“”•7564¸¹j5“$•05145“‘$#%Ê5%&$05&ÝÛÜÚ 5 Ü! "#$5 Òѹ·¸@85 80¸º¹»ÓÞÕß×50(º¼»½Þ5(¼¾½5×ÙÛÚÜÞŠ‹5ÚÝÞà‹Œ5ÝßàŒ5ßá5»Á¹5»º¹¸5ºÀ¸¿¼5•”“’‡5’”  5­ ¦ ¥ ž Ÿ 5 ¦ ¡ ž   Ÿ « ¬ þ 5©ª¨Y5Ÿž 5ž 5 žedcba`_U5d b¡`¢U2ˆ5‹‰Œ›–𙣳²´¿¾ÆÅ5 £²±ÀÁÆÇÅÏ5ÆÀ¿²5 öNõOôWóðòïñá5 NMOVWëðèïåáâ5 MUVìëéèæåãâ5 Uíìêéçæäã5íbêdçfä2b5ckelg5cjktuwx÷ÿþyýü5ÿy  Œ†‡{ˆ}Š5  ‹Œ…†z{q|Æ¿5 qwzy…„‹5yx„ÿ5œ › ¤ 5› £ ¤ ¬ ­ 5£ ! ¬ " # $ % &      þ ÿ 5 $ ø & ù  ú  ü þ ý ÿ 5$ 0 ø 2 ù 4 ú û 50 1 2 3 4 5 6 7 {< > = ? b õ d 5 1 8 3 9 5 : 7 ; < = 58 @ 9 A : B C D E F G H I J p x 5A M B N D O F P H Q R S Ü Û ˆ Ú 5N T O d P c Q S 5 T e d b c a S Ý Û 5a b ` e f 5f ^ ` _ a Þ Ý 5 _ ^ ] X \ V [ S Z R 5 ^ g X W V U S T R 5W k U l T 5k p l B 5 ‹ Ž Š Ø Ù 5 Ù Š ‰ ‚ z y r q e c d b 5 Ù ‰ ˆ € y x q p c a b = 5= ` a I p 5= ; ` E G 5E ; C : 5dœb315£ ! * + 0 $ 5 ) * . / 1 0 5) - . 8 1 58 - @ K L 5ç è é ° ê © ë ¨ 5è ± ° ª © £ ¢ › š ’ ‘ ‡ † … ~ 5± « ª ¤ £ œ › ” ’ “ ‡  † ~ 5« ¥ ¤ œ – ” • “ ì  w ~ v 5¥ ž ˜ – — • ï ì í w o v m u k 5ž Ÿ ˜ ò — ñ ï ð í î o n m l k j 5k j i h g f e d 5e r g s i t k u 5 r z s { t | u } v 5z ‚ { ƒ | „ } 5‚ Š ƒ ‹ „ 5" !'&$% !žŸ ¡5œž›š¡®£¥¤¦5¤¢£¡5! + " $ 2^5b ` 5  RûQúùø5 ‡ýûüú5‡‰ÿýþü5 +'($#5+,()#"5 ),-34    ÿ5  54/-5;5761/05 7;<×ÓÖÔÕÎÏÊ5<ÓÌÍËÎÊ5ÎÍÔÓ5;Ø×Ö5ØÙÖÕ5ÙÚÕÐÏ5_IaH5HIGJEKCLAM?NOPQR5 KSLTMUNVPR5 KcSYTXW5XZ 5Z\[]d5[cdKJ5?O=Qù5=ù øŸ5= ;:5 : žŸ¥¤¦§5 :žœ›£¢¤§5§¨¢©¡5¹ÁµÇ5HGFEDCBA5_^b•c“‘5^]•”5TWUV5WVR5]^\ 5^   5 ¼ÓÄÑÏÐÉÊÃgf5ÃÈÉÇÏ5ÃÂÈÁÇ5î°Á±5®­°¬±£5®¦­¥¬¤£š5 š¤œ¥ž¦§¨©ª«]Z5¦®¨¯ª]5®Ã¯f]5i j k l m n o p q r — – œ ž 5 j u l v n w p x r y – 5v } w ~ x  y 5} „ ~ …  5 ÙØ×ÖÕÔÓÒ¹5ØÖÔÒ554 6 û zý 56 {z> |5š ™ “ ‘ ’ 5‘ Ž 5 M L K J I H G D F C 5L W J X Y Z ! 5! E Y J 5±  ²  5‰ŽŠ‹5D  C  5          A  B 5         5    5 . 5    5 ,  - 5, 1 - 2 5ç æ å á ß à ¸ º ¹ » È Ç É Î 5æ ã á â à õº ¼ » ½ Æ Å Ì Ë Ð Ï 5ã ä â öõ¾ ¼ ½ 5ä ÷öÀ ¾ ¿ ½ Å 5÷ À Á ¿ Ä Å Ë 5Ë Ä Ã Á  5 Â × Ã Ô Ï Õ Ñ Ö Ó 5Ó Ò Ñ Ð Ï 5Ó Î Ò Í Ð Ì 5Î Ç Í Æ Ì 5ÆÄÎÃÌÂ5ÛÜŠƒ5 å ß ± ² « ¬ ¥ ¦ ž   Ÿ 5 ß ¸ ² ³ ¬ ­ ¦ ® § 5³ ´ ­ ¯ ® 5³ ¶ ´ µ ¯ 5µ ¶ ÷ ö Ê È É 5ö ¶ · ³ ¸ 5¸ ¹ · ö 5K M N a 5 !"5» ¼ ¾ À  *"+5» º ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç à ß 5Å Ã È Á É ¿ Ê Ë Ì Í Î ¸ Ï ¶ Ð Ñ 5Ñ Ò Ð Ó Ï Ô Î Õ Ì Ö Ê × É Ø È Ù 5Õ Ú Ö × 5Ú Û × Ø 5Û Ü Ø Ý Ù Þ Ç ß 5Ç Å Ù È 5ë ã ê é î 5 ê î ø ÷ ö õ ×ò }z|{‰5‰Š|~}5~€ŠŒŽ5€Ž5‘‚€Ö5 ‘„‚ƒÔÓÑÐÍú ÎÏ5 „…ƒÕÔÒÑËÍÌÎ5 „†…‡ÕºÒÂËÊÌ5 †ˆ‡¹ºÁÂÉÊ5ˆ¸¹ÀÁÈÉ5¸¿ÀÇÈ5ǿƾŽļûñðòóìí5¿·¾¶½µ¼´»³ðïóîíë5·ª¶«µ¬´­³¯±°²Ûæà5 ª£«¥¬§­®¯°5°®¨§¦¥¤£¢¡ ›Ÿš†5£ª¡© Ÿ5©ˆŸ†5ˆ©¸·¿5ß á à â ê 5á ã â ä é è í õ ð ö ò ÷ ô ø 5ã å ä æ è ù õ ú ö û ÷ ü ø ý þ ÿ 5å ç æ ù  ú  û  ü  ý  ÿ  5 ç     5    5       5       5         5          5é í î ï -(5í ð ï ñ ()'5ð ò ñ ó )2þ 5 ‚„ÍÌËÊÉÈÇÄÆÃ5„†ÌÎÊÅÈÄ5†ˆÎÅ5ˆšÅœÄžÃ 5 '%&$,+ì *Ä Â 5%#$"+5Ä Æ ì ê ë 5 ÓÖÐù ú û Ïë 5ù ö Ö×5°¨ÛÚàßá5ßÚÞÙÝØÜžôœ˜—–•”“5ڦ٤آžœ›—š•™“„5„™†š5òúóô5 8„ 9w 5ã Ü â Û á Ú à Ù ß Ø Þ × Ý Ñ 5 Ü Ö Û Õ Ú Ô Ù Ó Ø Ò × Ñ 5Ö Ð Õ Ï Ô Î Ó Í Ò Ì Ñ Ë ³ 5Ð Ê Ï É Î È Í Ç Ì Æ Ë · µ ³ 5 Ê Å É Ã È Á Ç ¿ Æ ½ · 5 Å Ä Ã Â Á À ¿ ¾ ½ 5Ä e 1À 0/5e31205”“’‘5³ ± 55  5   Ý 5  Ý ä Þ å ß æ à ç á è â 5 ï ä ì å í æ 5í ì ð ï w5wxð yñ zò 5ñ ò ó ô ü ÷ î 5tsrq5puikjv5ijhxzy{}~‡ˆ‰Š‹Œø5jwxy5w|y}5¦µ¤¢5¢µ·q¹»56453<;EDL¸³µ´¶54231;:D»¸¹µ·¶5201:¾»¼¹½º   5¼¾½ýœü%5¾.œ%5/-.&%5-,&('    )5 )  5 5 5 üúûø 5ýû5'&5$úùø÷õÿþ 5 øÿ  5  ·5   ·º¹5 5_`XYOPHI?A@Bª©5 ª«@9?>HGONX5«897>=GFNMWV^²5MLV³²´5   äæåçíîòó5 òíìåãäâ+5ä +5 æ)è* "!5 æçèé*ð"ñöõ5çîéïðñ5îóïôñõ5õôþó5þ5òìë5êëáãâ5 âàáßê2+5âàÜßÞ23   5 ÛÜÚÞÝ5 ÝÙÚÐÛ5ÐÎûÌúùÆ5Æúüûý5ÿýþü5ÿþp53,2+2Ì5ê5üÅÆÄ2”5—¤™¥›¦§Ÿ¨¡©£ª«¬5¥­¦®§¯¨°©±²³´µ¶·5­¸®¹¯º°»±¼³½µ¾·¿5¸À¹ÁºÂ»Ã¼Ä½ÅÆÇÈ5 ÀÉÁÊÂËÃÌÍÎÏÐÑ5 ÉÒÊÓËÔÌÕÎÖ×5 ÒØÓÙÔÚÕÛÜ5ÙÝÚÞÛ5 ÝÙßàáâãäå5ÙØàæâçä5Øèæéç5éèêëìíîïðñòóôõö¤5èÒëÉíÀï¸ñ­ó¥õ¤5 ©²ª,-./01235 ª-¬/415675¬4859:;59<8=¬>«£5 9?<@=ABCDE5ECLAM@?5MNLKEG5NOKIGHFyDnacbd½¾5IJH{z|xwnocpegfh5Hzyxn5 ²´,ƒ.„0…†5´¶ƒ‡„ˆ‰5¶·‡Š‹5ÃÍÄÏÅÇ5 ¢Ÿ ½5½¢b£>5b>aBD5ÑÐ5Ñз϶5·¶@H5¢CKJŸR±T5 CAJIRQS[\d]fh5IPQZ[bc5 [cdefgl°n5lnmopqrstuvwxy5 w¯y®­¬§©B5B¨§¦­5¨BCA2R5S\U]5PYZab2æ5çêéë5 ëêìòñóôþ5 þüôõñðìíëî5 îíïðöõúû5ïö÷úT5XTU÷ø‹5 XYUVøùŒ†Ž…5YWVù5WÌùÊ‘’5Žù5÷‹ï‰î555 †…„ƒ‚€~{5…„ƒ‚~}dfegp5~bdceo5€`bac5€ƒ‚„5~ˆ€„‚5ÌËÊÉ‘È5 ËÍÉÎÈÏÐÑÒÓ5ÍÔÎÏ5ÔÕÏÑ5ÕÖÑ×ÓØ5ÖÝר5ØÝÞßà5Þàáâvã5âäãå}‡5ghfz}{5a`_^5TSHJ5JSYQXPWOVN)0*1+25SRQJPIOHNG0516275JAI?H=G:59687+9*5 A@?>=<:;6534256312050/1769:5978/-.,58-+,*5þýüûõ5ýû5      5    5 555 !"#$%&'()5 !c#k%n'o)5cikjnm5cbifhegd5baf`e_d^5 ba]`\_[^Z5 ]\[Z 5[\Q]5]\^hi2]5`^ˆiÅ5ÅLjñ`5!cb5ÿ 5*;9:832-+,(‚%€5;<:43/-.,ƒ‚„…€5" øö5ø"Ò#ÔÖÕ×5ÒÔÓÕË5ËÉÓÇÅ5ÓÅÒEø5ÅDEC5+(*')&VZW[XLYJ5(%'$&#P"O!Q VZ«5%$#"! «©5¢©§5 ~|{A@‡z5 ~}|z{CAB‡ˆ5 }yzECDBLˆ‰5 EFDMLN‰mŠ‘‹5EGFHMONPmn‘t’“5GIHJQRPonpts“”5 IKJSR†o‡q5oqprsu”–5XQPGF;9:1324®¯­±5 QHG=;<:5345H?=><755?@>‰75?A@BÃÄ5A?IHRQ5HQOP5yxEG5xwGI5wvIK5PF¤9o859185ŽŒ5€~5 ÄÅÁ´·¶¸5 ÅÆÂ÷¹¸º 5 º¹»ÃÇÆÏÎÔ5 ÏÐÇȻɺËÍ 5ÈÊÉË5ÊÌËÍ5rsq5¸ 5 ¶µ´³Á5EDCB5DêB5êë5ëì5ìíþ5•y—x¤ö5¿¾÷ø5¾ÆøÈ5†‡…ˆ5 )JKI1627489:5 JHIG6;7<8=:q5HDGB;><?=pqovu5 DCBA>@?npo5 AO@lnmotusœ5Ojlkmrs5Ohjikír5hèiæí5 èhgPQMLCEDFH5hOPNMAC5ègéfáã5–Š•‰”’“5Š‹‰“5‹5ÝÞÜäãèçéìíð5 ÝÜÛâàáßå5Üâãáæåê5êëæçã5çëìîï5ìïðñòóôõ5óõö¯­®¬5 ¬­£¥¤¦ÖÕ×5­°¥§¦²Õ5²§±°2Ö5 ¬£«¢ª¡© ¨Ÿœ5 £–¢ž¡ œŸ›5 –”žš™œ˜›—5 ”’š™Ž˜Œ—Š5 ”“’‘ŽŒ‹Š5“Ú‘Û5“ÙÚàÛ5£¤–•”“5£¡¢¥5¡¤¥­5 ™5§ žŸ›5žœ›š5ÞÝ5Ýß !"5ßá#$5 áã#%$&'()5ãå%*&+(5NMQP5M?P9;5$'5')!5R5RS5STUV5VW5 WX YZ[\]^5WX_Y`[]5&PZ[5PN[L5 Í  5 "ZŒŽ‘’5Œ“Ž”•–—5•”˜“™5•˜š™›œžŸ ¡¢£¤5 •𥛦§Ÿ¨¡©£5 ©ª¨«§¬¦­®5¦®¥¯°5¥°•—5 01+*)(' &%5 *{(• 5•yuts5yxuwtvs5 vw~xz|{3*2153}|€~5€~v5¤¢dXZY5¢cXVWU[SQRECDBHA5 AB?CaRTSU5?=A@HLK5?>=<; : 5:O;N@ML5•{yzx5¢ cžb5cbVTU5XWY]5]W\[^_5[Q_`5`QPEGF5EDFJ5JDIHK5Z\º»5 %J&B,9786[\Z5B;9:8YZ5&,'-)5 êë576.504545\65AB:;34,-$%&w5#$",5"#5õ d ô f ó h 5ÿ¼Ñ2‚5ƒŠ…f5‰ˆ‡†5þýüûúùø÷5ä­¬«5­°«±²³5 °´±µ³¶•Ö—ÕÔ5 ´þµý¶·ÖØ×ÙÜß5 þüýúÚøÙàß½5üûúùøõàâáãÿ  5 ÿ»á½à5 :·¹¸ºÃÄÉ5:;·µ¶´ÁÀÇÍΙ5 ;<µ³´²À¿Ï¯5 ;=<«³±²°¿¯5°±©«ª¬5ª¨©§°¥¯®5¥§¦¨5ÙØÚ·ý5û÷ùõ5÷öõôâäã 5ä9  598 587!"#$%& '576!4"1#+*,TU@>?=565421+5532-+,53/-.,VU>5 /0.]VW><=5]^WX<5]h^_X`5hi_a`b5 hkiljmnogpqr5kh‹]05CFDEFM5EFDB5 ø  5 ø÷ðïèçÜ5çîïö÷  5çæîíõ   5  õöî5  ö 5èÞÜÝ5ÞßÝ; 5ÄÑÒÓ5=D?EFKQLM"N‘’5 PNOMIGHAT@5@?AFGQM5æåíÊÈ5íÈ " ! # 5!   í5   5   5> ?5?=>;5?­=«5pr25”“5”’“‘5‘"!#5#"$LK5 PSORI()$#5S'R&(%$5I)HT5T)*#5ÉÃÈÂÇÁ5ø¶Á5 ‹ “ ’ – ‘ ž þ 5‹ ‰ ’ ‘ 5‰ ˆ ‘ ‡ þ  5ÇÌÈË5ÌÑËÊ5ÊÑÆçèÝÞÜ5ÊÆÅ¾5ÀÏÍ™2º 5» à ½ Ä ¿ Å Æ Ç È É Ê Ë Ì Í 5Ã Ï Ä Ð Å Ñ Ç Ò É Ó Ë Ô Õ Ö   5Ï Ø Ð Ù Ñ Ú Ò Û Ó Ü Ô Ý Ö Þ  5 Ø à Ù á Ú â Û ã Ü Ý 5Ý ã ç â æ á å à ä ß è é ê ë ì í 5 à Ø ß × é ö ë ÷ í 5Ø Ï × Î ö ü ÷ 5Ï Ã Î Â ü 5Ì L Ê È 5L M È Á Æ ¿ 5Ë Õ Í  5Õ    5 ".-5-",$+&*(5+/,0-50/5495/3425{}|~¿h¾d5}~€hed_5€gef_5 g€‚ƒŠ‰ˆ‡5€}Š5g‚i„5‚ƒ„ƒ…•5ƒ‚ƒ‘“’”˜™ ³µ´¶¾5 ƒ‰‚‘’—˜ 5 ‰‡Ž  úù5ù —5µ —5ƒ“•”–™5‡Ž  5 ûúò5üûóò5óüôýõþ÷5÷öõìôêó5÷vöpîdIeGtEuC?5vupqdfegtvuw kml5 urqrfhgivw5 rhrshjikw5h]stjlk5]h_iajc5cba`_^]5bí`î^5CBA@5    5     < 5    5   5    5  ÿ û5 … Œ ‘ ™ š ¡ ¢ ¨ © 2R 5T V  5 Î Ï Â Á     7  5 Ï !     5 7 5!     3 5 5      1 0 51 3   5Á  ¿ ½ 5  " ½ # » ² ± ¦ ¬ ¤ £ œ 5œ ¤ ¥ ¦ ³ ² ´ $ 5² # $  5 #  "  5LKJA5£ « ¬ ° ± 5hrisjt5rust5tuwv÷2h5ilkm5ÛæåÓ5æÒÓΙ5³±ïî5î±ë²çåèä5èéçêëí5íêìé5²æåâäã5æàâáã5Þ½¾¼5½»¼ºÄ5º»¹5¿ ½ Ë Í 5½ º Í ¸ 5 ¸ º ¹ » · 5¢ µ · ¶ ¸ 5µ ´ ¶ Ñ 5êìëíNHMF5 ìîíIHGFEDCB?A5_jakc5{}|~€5|wqop5 sqrp¼g³i´k¸¹5³¼trs5t²³´5²¶´·¸5¶²µ±5²t±v5vtus‚5 gihj( l) * + 5ikjl5kml- , 598725acbd5cedf5z@5cnom5àÞßÝÛÜ5+)/.5H R J x 5x R € Ü ˆ 5ÿ  5 9:>?=5=>8:95· ¸ ´ µ ± ² ® 5® ­ ± ° ´ ³ 5­ ¬ ° ¯ ³ ø 5¬ « ¯ ù ø ð ï ñ 5« ú ù ó ð ò ñ 5ú õ ó ô ò 5ô õ     5  õ û ú § « ¨ ¬ © ­ ª ® 5§ ý û   5ý ÿ   5² µ ¶ º 5º µ ¹ ¸ 5+ $ ) % ' & ÂÄ5$ Æ% Ä& 5Æ$ " # 5ÛÕ×Ö5öù#$5˜™—Œ5 ™ÇŒ‹ƒ‚€|z{5 Œƒ…„~|}{–— 5~}– 5  ‡~†…Œ•5•ކˆ‡‰ž5 ‰ŠˆŽ“”š›5š“’Š5u  5›–”•Ž5Ø5¾d¿fÀÁÂ' 5fhÁ( ' ) 5fdec5|„ƒ5/5ÜÛÚÙ5ÛRÙS5H@GF5F@?5 "!# 5 5 !5»­¬«®5®¯¬5®°¯±²³´5¯²´5¯554DKLN[Ogmnqkj˜™ ;b1£¤¥¦§¨¾šˆ‰ÉÕÎ%&'kulÛÿxx01/567<8klexyŸ‹ ¡¢«­¬¶¸·™—Ô×ÜÝñÇÉïðÓ„†~}T@Ж˜¡›¢£¤¨ª©³´«@Éëìãûýü0*1XYZîìö§¨ÜÝÞUîíôúõû;Þ ö!$%&'()./0HFUE\]lmnŠŒ†‘“’‡ÏÑ=B>sk¹m    ÷    ÈÆ" * l, ÒÓ4 ; ß= L N M j l k | } ~ œ ™  à » ì í î   ÿ   O  \   Ö    f g ^ p t B ¯ ° « Ü Ý Þ Æ Ã è * + , ? r q J K H Q T R o p l Œ Ž X Þ à v € ‚ ˜ ™ “ ¦ § ¡ · ¸ ¹ ê Æ à ò ô ó * / 0 @ L A ` G I Œ ¦ §   Æ Ç » Ã Ï Ë Ù ˆ Ú È ö ¹   5 7 6    W Z X Ž J E H !"#ì ë ,¾ À /798;@=mstÌÊåxzy‹ŒŠ‘“„ª·©¦Ú¨Û !/0678LME^_W`aY‘]h‡žÿ123ANOQfgblmj­¼°½¾¿±À³ÅÎÆÔÐÏÙßà‹-,7BC;8Z[egfijaš…›Þçß®ú±ÆÉÇ—¢˜€žŸÕÀ¾Ÿ›{utsqxmkrcleÞ Ý ç       ÒèØ<> ‘»–’·¿Š¾½Æ:5720†…„‰ˆ‡‹ÐÎ×ÖÕÜ^\º-9>¡=Q1>'E;>›u¡=Tá/>\:>› £=&Q/>`ã:>’%ž=8->dW:>—¥¢=TQ,>~Ý9>žy™=,>`ã:>’%ž=8->~Ý9>žy™=,>¯]:>šAœ=]Q*>~Ý9>žy™=,>¦ë9>”©˜=AA)>¯]:>šAœ=]Q*>›_=˜í¯=%!A>«^=•I³=[ñ=> CZ=ý²=á=>cY=•I³=0;>“`=œa´=4a;>c^=œñ²=8>SY=—•±=Nñ8> CZ=ý²=á=>ãW=–M¯=Ra<>›_=˜í¯=%!A>Ã\=™M«=2?>³X=œq¥=<>cY=•I³=0;>[W=˜Õ°=Xq:>sT=–©=/Á9> ËN=›m£=*Q6> ÓR=—qž="Q8>ÓJ=’ÙŸ=3Q4>SY=—•±=Nñ8> ›W=”®=¡6>U=“ݬ=3á7>P=œ‘§=á4>»L=›™¤=!3>£R=’¡©=9!4>y¶½½lõf¼¦…½wǽ ÷ȼ`›h½o¦¨½‰{‡¼a{<½s«½³mâ¼P{ ½y.’½™Ÿ¼6ù¼x†½¦ù¼86Ö¼åŒw½Ž»·¼vŸ¼éE½SìC¼pv›½Ò¸a½]û"½âìq½Ç a½öã¼xf½É¬~½\;1½êŒT½cx½[½Þl8½Ï˜n½2v¼à̽`ꂽ.ö¨¼Ù™ø¼Ø(k½Øý»åù¼`.ƒ½;lG¼tóh¼ÇÀp½•búÀ³=¼a(½™Øô»/½ºËØp½ÝN.;“ºm怽—ØÆ»–Œ-<ÂTn½m'Æ;/L&<Êœx½7±»;¦®<Æ f½`'ñ;U |<ÆÜu½Iì¼$f¶<Ò¤Y½Û‰’=‚šŒ9†ö=›O=­¬'»²bø=3L=af§¹w‚ý=s_=†™ÏºNÑ>ƒ,=Es.; Âñ=c$=—¦­:@¢é=“=™¹¼;ªbê==ÓÄ<¬Âæ=¦ò<òŒG<[BÞ=†ô<ÊÜ|<}è= FåÆà<:7=B!>Æà<&ë&=(Ñ>ó0=©¹ž;J"û=£#=˜yþ;âü= ó=´ü@=R^0†è<3ß=Á>¦â<+[=Á> &á<%÷*=Á>33=¢éË;7¡> #'=Ö !<9a>S=¯\oƒ=rÖ±<6‘ >fÿ+Æï<;¯ =7Q >!†ç<4 =Q >3Æâ<0£.=/Á > S=e.ÕC=;×=0Ñ>#fö<"#=V>ì<3—%=DÁ >7†å<'2=&Á >Æä<5[9=I >7¦ç<5<=Eñ >“=,=G>&÷<&»=‘> Æí<2³*=E>!Æë<77=' > †ó< ›D= >!&ü<=\q>F÷<+$='>8Fò<0³/=?q>&õ< ó<=¡>.¦þ<&£J=9Ñ> £=!ÓP= >S=)sX=W>ã="Ÿ=>'Fû<)‹'=1>=Fù<"‹4=(Ñ>†þ<4ÓB=B!> “=3›Q=Q>ã =%{_=:‘>3="¿=I> S=+ +=@Á>c=!‹9=Na>“=+sI=%±>ƒ =.sZ=FÑ> “=*Ûl=/¡> ã =6o!=+>S=&/=q>S=8û>=)!>ã=,kQ=GQ>£ =!Ûc=2!>ã=*ër=Y>Ã=4_%=S‘>S =3Ë4=Eñ>³ =";E=Gá>="SY=;q>³ =0Ûi=2á>s=3ëv=Xá>Ó=%Û*=?á> ƒ=3Ë9=%‘>ƒ =+ K=6!> Ó=7«^=C> ƒ =!³n=8>C=|=&> s=4Û0=$a>Ó=!S>=Rñ> Ó ='ãN=@¡>Ó =*c=M>£=7Ós=Y1> Ã=#+=‘> £=–„=%‘> 3=–1„==A"> ã"=“­‰=>q >ó=–qˆ=<$> #"=/ƒ6=\q!> 3=!CB=a!> ã=&[S=M >s =$[g=@¡>=*ss=;Q"> #=5|=\%> C=ši=Á&> s=•…="Q(>s=7«Y=D">C= »f=*Q&> Ó='óo=I)>Ó=3Ët=Q*>S=5kz="á+>=˜Ñ‰=/Á)>  =—­€= ±->S=‘!Œ=Eñ*>c$=”ƒ=4ñ.>ƒ!=Õ=)±+>c(=˜ý…=¡/>“=/SN= Ñ$>#=+ó[=(>ƒ&=4{e=9A+>“(=9#j=DÁ,>ƒ+=3{o=KQ.>³-=#Ës=!q/>s2=)ûx=6±0>ó5=8û~=\q1>{@=3Su=9a2>Ó*=4«H=-A&> C.=5£U=/Á)>ó1=0_=DÁ,>³4=&Cd=E.>ƒ8=8[j=I10>ƒ4=%›F=¡&>Ó8=;+S=!!*> k<=)³\=/Q-> ?=" b=+1/> ÓA=3Ãf=;‘0> ë<= so=Y1>E=! l=NÑ1>ÛG=![q=)Ñ2> F=,S}=Ua3>³L=5[y=Añ3> {?=8+G='a&>³D=*sS='ñ)>+H=3û\=/Q->KJ=8+b=)A/>SL=%f=8¡0> O=8ãj=G2>³Q= so=!3>#U=3Ûu=814>+N=-;I=@Á%> ›R=%+U=/Á)> V=&3^=8->KX=.£b=4ñ.>KZ=, f=DQ0>S]=*»j=Ká1>s_=/Sn=&á2>Ãb=%t=<4>C^=%ëK=F‘%>Ëa=9£W=8)>›e=,ƒ`=AÑ,>›h=4kd=E.>Ck=,+h=[±/>«n='Ãl='1>ãp="p=G2>t=9ƒu=[A3> o=.»Q='¡$> cp=!Ë]=Pá(>›t=&ëf=9A+>kw=&³k=Oq,> »y=,Óo=/Q->}=&kt=E.>Û=8Ûw=!q/>—‚=5›}=.á0>[v=2³j=B±%>“y=8»u=3á'>K{=7#y=Nñ(>ã|=0ó}=Pá(> ›=›!€=%*>©=š5‚=<1+>Ž…=©†=[ñ->‰qˆ=œq…= Ñ4> ~=Õ‚=Xá6>†e‚=›=‹=B;> £t=—É‹=JÑ:>«w=”á“=NA>> óh=õ”=5!=> 3m=’œ=DQ@> Kh=›–=31=> óh=õ”=5!=> `=–I“=A:>ka=™•=Eñ:>KX=˜É–=Nñ8>‰ÕŠ=™I=U¡1>†‰‹=”Ž=@Q9>ƒAƒ=–©“=9Ñ>>Sy=™µ™=*A>Ãx=œ9Ÿ=*ÁB>q=“m =-±B> ëu=’‰¥=O‘C>³o=™¥=M¡C> cp=I«=UaC>Ëg=Eª=UaC>i=›‘±=QA>y=e–=S7>Œu‹=1—='=>‚¡ƒ=”‘™='A>±ƒ=–uŸ=;QB>†õ€=–É¥=)ÑB>û|=“-¬=EB>‹½Œ=åž='ñ9>©‹=œ¡=Á=>‰=‰=›iœ=DQ@>Žñ‡=œq¥=8¡@>…ɉ=™½§="á;>‹%†=“a«=2?>“l=˜±‚=JA7>_=”ƒ=Uñ6>³V=‘…=-A6>3Q=—‡=Kq5>+G=™ ‹=Dá3>«;=—µƒ=;Q2>û;=”Q=B!2>C/=’ Š=<0> S4=U•=¡/>Ãh=›iŒ=Q:>óa=”1Ž=89> “]=–ý=I9>³Q=œ%’=!‘6>KG=˜ —=>4>ûA=–›=Iñ1>8=’)š=DÁ,>›U=›Á”=3á7>ûJ=•™=\5>SG=”í=[A3>óE=—­ =<0>ë@=™õ=Gá*>“7=™¥˜=9±'> O=’±š=-A6>ÓJ=’ÙŸ=3Q4>óI=–Ý¢=B!2>£R=’¡©=9!4>S=’mª=$ñ2>ûX=—1¯=E¡5>»L=›™¤=!3> ›W=”®=¡6>ûX=—1¯=E¡5>ã(=˜Õ=31-> Ó-=— •=8)>ã/=m”=SA%> #'=‘Ñ‘=>‘'> #,=—‰’=9!$> #'=‘Ñ‘=>‘'> #,=—‰’=9!$>“ =’ÉŽ=6&>c=YŒ=Na%>ëJ=—¤=7á.> £%=”Ž=@1">é¹Å¼¢‡¼¼}<[c=m´=U>> “d=—­°= AA>Ëg=Eª=UaC>“k=’‰¥=J±C>«k=˜]¡=;QB> Ëi=šÉœ=J!@>«k=˜]¡=;QB> Ëi=šÉœ=J!@> 3m=’œ=DQ@> 3m=’œ=DQ@> Ëi=šÉœ=J!@> Kh=›–=31=> Ëi=šÉœ=J!@>ëe=—õ—==ñ<>ka=™•=Eñ:>«[=‘Eš=Eñ:>KX=˜É–=Nñ8>ëe=—õ—==ñ<>+a=‘} =KQ>> Ëi=šÉœ=J!@>«k=˜]¡=;QB>d=™¥= AA>“k=’‰¥=J±C>Ëg=Eª=UaC>7fã<2‹5=M1>ët=' d=W‘!>Co='óO=7¡ > ó^=-ûD=(Ñ">;_="s@="1!>kK=7C@=YQ#>{J=5ã9=G">;<=!Ë==>$>“:=$ 8=-±">³1=&«==0a$>“/=5K8=#>(=)@=<$>c%=!#;=+Á">c=3ÃF=+Á">'íâ×=ææ<^î¸v=³]==ñ>£p=)«N=Ñ>«j=2ƒB='>ë]='39=¡>Ki=3s7=Y1>û[=3§+=*q>›b=9›)=>V=-G='>³Y=4Ã=31>cS='k=7á>³Y=4Ã=31>cS='k=7á> ca=$+=]á>;\=;§=K! >+I=&Ã1=:‘ >ËJ=&ë&=-!>ÓJ='_=LQ> ËN=#3=-!> “D=#›=E>ÓK=+¿ =YÁ>[@=AG =S!>‹G==ï=+1>ƒ;=)k=BÑ>³>=~ú ã3=`æûKB=7G'="q> S;="=Á>3=#Ë=I¡>#.=:S =+¡> “)=';=A>³#=2ë= a>s-=L¶æ<"Q> Ó=P¦ì<0a>Ã=eÅ5=+s)=¡>/=+3 =*q> #'=7=[!>³!=5Ï=JÑ>=7— =Pá>“=9‹=9ñ> 3(=&W,=[±>ó!=-ß$=,a>“=2»=+¡>“=%w=.Á>#=!/=GQ>ã=0³=á>³,=333=PÁ!>³8=++2=a!>C!=`Æ”<9A > s*=}æ¬<,ñ>#2=aVƒ<31 > Ó7=~¦ž³C=¹übÓK=Yf‘<[Ñ>«Y=Åì@<4>ób=af„< !> Ûo=Ø<<71>û{=¼Gí…=Ô¬<7Q>Q„=ðlj<6± >‡•‹=§|><%!!>S1=FÄ<6>+@=r¾½<'ñ>ãR=Rö±<8>ós=j¦–<6± >…=oa=`žÄÓZ=‡þäËJ=].â<+1>3T=&Ÿ=;Q">ƒI=bÎý<> +P=+ ='!>û<=WÞß<&Á>+w=,Û]=<1>ƒv=0[=Q> Ãt="«Q=#>ƒq=*k@=A> sl=+Ã3=LÁ> cf=&Ÿ(=2q> Ûo=&Ó2=#> cf=&Ÿ(=2q>£n=)ó*=WA>Ks=)S1=A>“v=-ë>=W±>ãw=0N=>‘> []=&K=Lá!> +Z=1³=2‘"> »c=&/=FÑ#>Ca=4 =.q$>³m=;Ó=$&>cl=)ó=>‘'>ãz=+£=V*>;=xó<+¡+>†É„=8=Gq.>ŒÝ‰=xŽÒ<2/>cq=X¶à<>‘'>„Í…=‚þÂ<&Á+>…=oÖ <9A+>…­Ž=Xþ¼<¡/>ƒ©‘={& <Á->ˆu”=tn¤Š±—=_‰ŠI™=h®“<<0>Šqž=v®ƒ<‘/>†yŠ=_FŒ<Á&>]“=ól{<6‘)>„¥•=on‚<+¡+>……™=óÜg<@+>ŠÉ›=¹Œv<-a->†1ž=Õ _‹‘ =ÏŠù£= }U<8)>‹A¦=«li<\!,>…Á«=Á‰©®=»ìW<<1+>ù´=×l#<>‘'>Ž…·=ØŒBމ¾=ù\7<'ñ)>‰¥—=ô¬ZŽuœ= ÍP<"Q(>„=¢=Ü\FŠ©=ò¼/<$&>‰¥²=×D…9»=¥¹ø;Dá#>‹Í½=Ô<<-A&>…aÀ=°yê;YQ#>qÄ=Òä‰Ç=¹ ç;Dá#>‡¡š=á†m =ÕÌ5¡§=ÒÄ<+$>Š%°=¥Ùú;!#>Ž­·=¯yÑ;PÁ!> ½=«ù»;3Á >½Ã=´9Î;G">‚ÑÆ=©©¼;'!>‹yœ=Ú< <,ñ >­¢=²‰é;H1 >‡Ñ­=¤IÒ;%!!>‰—=Ñ„< A!>‰Õš=¢¹ë;>±>޹¡=­é°; ±>Ž‘¬=¦É±;¡>…}«=ª™”;#¡>!µ=¥ ¡;;Á>y³=RS};Ra>‡u¹=kÓy;M>…¡´=Œæ–:0ñ>†µ·=†Í:<¡>Ž)³=p™ìº[A>¶=¡ »+Á>…í²=[vˆ»0>… £=¤ùˆ;)±>‡Éª=^k;5a>„°=˜&×:'1>‹1°=GÙºO‘>Ž}¯=«Œk»‘>Ù­=Y–Ø»*á >‡¥±=Onß»D1 >‰Õª=(£#¼G>‹Á®=-“#¼'>µ¤=WóR¼`÷=ݤ=f³Q;*á>‡©¨=@3!;Pá>¬=Àe©¹?>„e¬=›ì8»Tá>…Qª=U®Ã»Za >…ݦ=-c ¼+Á>…e§=X~ª»O± >)£=&·¼YQ>„} =þRP¼£Âø=ˆù=©d€¼f¢è=i¢=«Ý€¼²¢æ=„Eš=—™¼¢BÕ=†¥¦='‚¼rÂä=„Až=·š¼bbÓ=†!¢=<•¼®bÑ=‹á•= ¬­¼}âÅ=‰µ˜=dy²¼{ÂÂ=¡Ž=sô¸¼}¾=‹1 =-— ¼K±>ƒœ="wG¼uú=‡u™=%Ó|¼ªbê=†±=0;•¼‡‚Ù=„¥•= Õ—¼WB×=‹‰=8ó«¼p¢Ç=ŽA’=À¬¼s‚Æ=a™=^;=¼Oû=…)•=!u¼g"ì=ˆŒ=K‘¼´âÛ=)ƒ=‘ £¼}"Ï=‘Ň=²û©¼uÊ=x=“›²¼p"Å=Õ=ﺼ|‚¿= óo=ýœÂ¼w»= S{=¥ȼu‚·= Ci=›ŒÏ¼|²= Û{=‡ÀѼyâ®= «b=‰mܼ{b§=ûa=.1»¼{"¾=ó]=‡¶È¼s"¶=P=”¢Õ¼yb¬=$›K=§¬æ¼{âŸ= \=€¥é¼r‚›=ÃF=œô¼v¢”=›U=®•õ¼y‘=ã?=Ç0½v‚‡=;^=Ž]ý¼qB‡=ÓG=À9½åD{=\=ËI½òDp=C<=Ã{½çc=s5=’vã¼r" =!‹9=¹‹ð¼y"˜=ã/=3ý¼r¢=“=Û±½y=C+=Õ3½ãÄr=£=ËÙ½éDb=£=Í0½õS=$†Ó<ÂÒ%½çC=Fß<Ï@1½ö.=c%=¦ßô¼vâ’= Ó=Óû½p¢‡=>fñ<Ø8 ½óÄs=F°<ܤ½çDL=C =²‹ý¼uŠ=³=“‡ê¼zb—=³%=µ}Ù¼p£=[9=œòͼ}¢¬=£&=Ƽ{¢«=#9=Îuµ¼y·=c =×A¯¼t‚±=“,=„Jœ¼sB½=$c=²§“¼uµ=Ã=’œ‚¼t"Á=³ =;Í]¼s"¶=ã=K#A¼w"Â=4¦û<™ †¼s¢¨=$ =Y,ª¼|¨=c=+S¼x¦=3=› Ò¼p£=“=°[ß¼r‚›=Ó= »î¼yâŽ=@á<Ë›½÷Ä=¦Ú<‡‘¼tâœ=-F¸<K޼p“=FÕ<]•U¼q‚ =Æî< W,¼r‚«=fÉ‹!„=a®ÿ»'>‡=R‘»GQ>­Œ=\Ƭ»T>Œ!Š=¡²LºÑ >Ž!=™­ºZñ >*=;Oa¼yBÊ=[?=åz¼;âÐ=sS=›<€¼®‚Ø=«i=W_¼U‚å=‡Q€=37¼F"ô=‰‰=(¼7¡>„q‘=^ö»&q>©•=°l »/Q >‚%=¹¬[»Y1 >ó6=¢Q‹¼yÂÇ=«K=—°‘¼BÎ=S_=—¼ŠâÕ=»v=áy¼ªBã=ƒÁ…=`#I¼uâò=†Å=+/¼M>A—=`â»I>†µœ=-'¼0a>sC=Þ€ ¼wBÄ=ÃX=Äd ¼wË=›m= Óš¼pÓ=‰ =µ,„¼f‚á=Ž…=‰‡¼‚Âà=‹ÅŠ=÷R¼—ò=‹UŽ=Ra¼sbï=…õ•=Û2¼‚ü= R=—w°¼y¢À= «g=n¡«¼tâÇ=³|=ûž¼¥¢Ñ=‰ùˆ=§Ù¼w‚Ý=‹É‘=;Õk¼µ¢í= ÓM=¯Â¼s‚¶=‹U=3ç=,ñ >+Q=0£=>q > []=&K=Lá!> æÊ<æeâ¹|b=£#=Ä„'½áÄA=ÓN=Íx½òDP=c7=Ô¤*½ôÄ.= óY=Å4½óÄ3===Τ-½ñ = k^=ÈL½ô„ =S.=Ør8½ÙÉ <D=ØZ$½ùɇ< =ÆêE½ÓNn;"Ó+=×ø,½k‰¹ S=×ÈI½ì^¼##=Ê\/½,¶‰¼;ÆÕ<Ç.L½#v÷¼=†ý<Õæ:½ãÄ=# =ˤA½Ù‰÷<$ =ÀžJ½óÉ¥¼nž½Ù]ཧsE¼mŒ¢½PÛk½«ó^¼gb¥½ªÝ•½Ä9¼gZ§½¤m¼½Ìù˜¼g¥½Áý཮™¼¼pº ½ðÞ¾´YмeB²½§-”½ÊÙà¼k¾µ½§Ý´½á\½j>¸½Å=Ö½Ü9Þ¼pž°½¸=á½áü½j®¹½ê=õ½Ôyù¼f¶°½µ½ý½ä,,½nö·½Ç& ¾ãì ½m"®½¶¾ƒ+=ÄNË;=›Œ*<;q >ëQ=Ð\6=Ô4<71>³C=œiÆ;6>\=ª9§;O± >Sn=ž)Ë;O>›p=TÓ};#¡ >3=žY–;Lá> {=R“G;Tá>Š¡†=\óS;!>ŽÑ…=yæå:=>…Œ=t¦Ø:6q> CN=§©†;-A> ëa=;ó<;F! >‹r=V; >K~=³¦ä:Á >5ƒ=ùe“¹M >ûF=RÓl;Cá>óS=G;\>;e=kfÊ:0ñ> #s=½æ°:O± >{=^5G9Gá >q€=É,N»M1>û>=š©˜;/¡>›H=KÓ;=A> W=PMn:HÁ> sg=÷Ì:T>Ër=¸3Y9Mñ>»v=½Œ»±> «==NSS;£âÿ= J=¡¦Ž:=>ãY=ÔÊ ¹+Á>Ãj=Afã¹/1>»o=G™¢º2!>ãp=R&”»\q> {==Oó;FBû=Ch=ªlL»Z>Ó]=f^³»["÷=Œ-”=©fÖ:Cá>‡I=UsJ;PQ>Ù“=[³W;Q>„ý=¢ù”;0ñ>Œ-”=§˜;1±>†uŽ=©¹Ã;#>‡‘”=²iÂ;&Á>ŽU=¦‰ë;Y1>ˆ¹”=´yó;Ñ>Í=Ôü<Á>‚Å‘=ÙÜ"=»|k<Á&>މ™=qÍ:+Á>‡œ=_3;-A>Œeš=P“p;K>‡ý™=«) ;7Q>Ž-š=§iÀ;DÁ>‰á¤=‰MX:\>‚¡=À²Rº\q>‡I¨=¤ì»Aa>„­£=OV»9A >‹]‘=4&¼Câþ=3p=ÂM½çÄY= +u=·ú¼å„=‰Å„=¢Hí¼ùÄp=„a…=¥æ¼y"ˆ=‰íŽ=žÛÕ¼rB‚=‘ý=‹ïÕ¼xb‘=‹Ù—=ª—ļtâŒ=‹á•=‚Nȼr‚›=‡­Ÿ=:¸¼v‚—=…=¥¼¼p"¥=Š©=O«¨¼sâ¡=…¤=yα¼s¯=Š®=%?¢¼t"±=õ„=€}ô¼êÄO=éŽ=ª4ؼå„d=Œ!š=ÅW»¼ôx=‹m¢=Øÿ¯¼v¢‰=‡!¨=©æ¨¼y‚“=á±=¦D’¼w–=†=¸=l‹¼y¢¥=…­¾==ß`¼}b˜=ŽË=.!¼s¤= Í=T®è»s‚–=Šq®='ó¼}bˆ=‰¸==v¼vBŽ=ŽÙÃ= %¼}=‡Î=yæºqâ‹=TÅÔ=aÊ8¹t‚‘=’ Ø=²IÀ;zB…=®ñÙ=Åæ¡:pâ•=e§ß=×|°‰í;sÂÊ=Ö6>Þ,JÆ:<8‚Ô=ÍZ >v‡p¦“<‚Âà=ÇÔ >m¦§w.Œr^­<|"´=¦Ö >W.Ê‚îÜ<{bÇ=â>`^Û<=bÔ=ä >ê}fÿfF¿<¯"ã=$>tž§t–Ù<¥‚ê=ª>a¾¡FŽ< Âñ=Û¢ >ª|tÓ4<›"à=º/>Ý,<³Bñ=ÁQ>¸¹¥;tBè=˼>Ú„µ ƒ;4‚í=f×ý=`³y;8‚ô=‚Oó=3™¿ºt"á=Œ%ì=’ŒE»™Bç=)=>|6¼}æ‘<¯ü=áB>ϼwë¬qÆh >ü ^T<7¡>²·>Û\¦Éó;nÂý=ÑW>¯IÐ;Z>¬>Ô4¿|>Ûœ¬ >ÛâÇ>ë^<"q>Þ; >p€<3Á>ݰ >Æ|e<=A>¸u>Ùüd<˜¢ü=Í8 >¸ n<2!>³% >îLWÏ¿ >m>‰á >b††<=ñ >ÛN >fî†<@¡>Ô™ >qN‘» >ë¬q<1>¼” >}‡<á>ÞX>‰n‡Ù >àì{<%±>Ôó>jÞŒ½á>^–›Ù>_.˜Ì{ >„†™á? >„¬<<>ß >›¼< >Y¾®<=a>²î>‚FŸ£¬>…®©<1A >½ü>t¾©<0>ÏL>[ÎÊ<7¡>½>b¦È<&á>Pp>wnõà~>…žèÇI>P®Ÿ<"Q>²>Ʊ<4¡ >I>oέ<)± >Ï»>f®ÂÈÍ>^Èå^>qŽ4·>^~§<ñ>Φ>an·Àr>g¶Æ<&q>¥M>ŠfÔwþã<%!>=(>Y†ø<¥¢ñ=D1>+ç=Y¢ó=-Î>&‹=•bç=`>.g =E‚é=¶Ô>}F˜Ov>^f³<4>2‘>~n¨`>wË<¹Âû=¨>c6í<†âî=5¶>(S=˜Âã=ãm>0£=w‚Ý=߉ >ÌLz<<¡>×Þ>³¼aÝZ>МP<)!>¹‡>ü 9Ð]>Ǭ(ž“þ=Ûl <+Q>Çóù=Ö´<q>{mö=´yÒ;G‘>Wë=§ùÏ;RA>SAå=fÓW;H1>~½â=[Sn;a>‹½×=m²º2q >|ÑÞ=i³b;/¡>{÷ç=³ùÍ;(a>…Aù=«¼.<1A>Â÷þ=Ò&<ñ>ß0>Μ?<Ñ>Â>ûÜ?<<1>§æ>òüX<[±>¿»>ðÜV<8>¤ü> }<"1!>Éq> ]x<0>¯²>w~‘<6q">¬þ>RN<:‘ >´åü=õ|M<)A>àH>¸ìk<"1!>ÀÍ>W‰<2‘"> ‰ð=]<<8>sŸü=ý\~<9a">ܹ>b¾—¯v>kö›Íé>rþ¦<.q$>ä>xþ¾<-A&>½>fþÇá&>~öã<0ñ'>¼uþ=6ç=$&>¼Ì>,Ó=q(>çþ= O=á$>´>.‹.=+$>ޝý=uŽÁµû=j>Ý<ñ$> Qú=6=á$>O;ü=9÷=%±$>Ëgù==»=M¡#>]÷ö=1 =6A$>Å©ö=~öã<)‘$>G‹ó=R&µÊ7û=‡Fœ<+$>Sô=‚^îg?ò=€ö¾<\%>‡î=q>‹gð=pþ‹<#>†sí=Û\k<=A">’uø=~¶„Xãì=ËLD<>±>¥Ûò=d®ÌÉUì=}æ‘<0ñ'>LÙé=õLe<"Á$>¸!æ=ÊÌ;<(Ñ">Éãé=´ü@<= >Oæ=ڬƟè=ÛD“§ì=ÝÄÇ]ä=ªéÀ;Fa>—çá=ÚŒ<6± >¥ÙÜ=·É°; !>´Ãß=­™©;Pá>[íá=«©°;)!>µÛ=jD;M¡>|Ô=L2ºI¡ >ŠÑÉ=X¦¾»71>}YÚ=f29º]Q >‰EÌ=U¿»!>ÂÐ=WvÅ»B!>‡eÈ=-¼FBû=XýÑ=â2QºZñ >õÄ=OûVñ>‡™Ç=P¾»Kq>E¿=/‡¼nÂý=†IÂ=)ß¼8¢û=Ž‘¼=ûC¼8‚ô=‰Ã=ƒ5¼bõ=Ž=Ë=+3¼˜‚õ=ÊýÎ=-¼kBú=ÇÒ=*¼«õ=¤áÔ=KÚ» âø=¸Ú=O†Ó»˜‚õ=”MÙ=W»»£Âø=¬iÞ=Q¦‹»8¢û=iÚ=]—»Ubþ=·ëå=Û6-9;á>ªá=O²Mº<¡>¡Ûë=aSF;/Q >Ž!À=&£J¼I‚ð=…íÇ=$C3¼³Bñ=i9Ð=&¼5ñ=JéÙ=Tžé»©‚ñ=|ëã=PÖ”»8‚ô=}¯á=\Ö’»›ù=g ò=·&›:M>¯Yî=gMA:B!>uÉø=©™œ;2!>™ëô=¸)–; a>Úq>Öd<9Ñ>‰Ä=K#A¼Kâì=€ñÌ=÷V$¼Y‚ì={ÙÖ=/{¼Y‚ì=XÞ=S6Ñ»B"í=pã=O6«»{¢ë=uè=©ìd»\ð=Iiö=TS;FBû=‹éÈ=Aó9¼•bç=W‘Ñ=&o¼9Bæ=kaÖ=,‡¼LÂå=o%Û=RÞý»¯"ã=•±á=LnÒ»r¢Ý=µ…ç=X^¬»s‚Ö=•¯ë=Y总D¢Ð=l9÷=Åe˹¦BÜ=‹gð=å2bºwâÈ=…9Ë=ÛA¼|bÝ=™ÑÏ=7¼©¢Ø=¹Ö=E«$¼pÓ=Ü=&£¼|BË=ŠýÅ=*çf¼KâÌ=eÊ=%ÓW¼x"È=‹1Ð=IÏ>¼ubÀ=¦}Ó=^/(¼sº=aýß=KÆï»yBÅ=e‹ä=^6‘»tâ¼=…éÀ=i3s¼¸"Ñ=„©¼=¦_‡¼x"½=‡¡Å=b¼w‚²=—UØ=\–é»t"±=^Gü=IóG;¹¢Ô=‰Ýˆ=“Ô¸¼|‚¿=‘ù†=¥~ürb¹=‹Õ=/2Á¼{‚¹=iˆ=̼w‚²=Š-Ž=%ŒË¼{"®=U„= DÕ¼v‚§=‰¡‹=›ÌÓ¼|‚Ÿ=Œ€=°kà¼tš=Ž…=‚¥ß¼}“=»x=ªuì¼vâ=!kr=°[ß¼w¡= j=«Jì¼zB•=Ír >S®°<ñ$>Êß >`fÎ<7Á'>¨¥ >[Îå©O>]Îö¿b >B;=7á.>J>$Ë=.á0>º>9ƒ=-±2>b>0»"=9!4>6w>.Ç+=±6>g¶>7K.=*Q6>b¿>5;2= a8>µ¦>)c7=89>×õ >2ß&=á4>ËI>$c=+ñ0>Ò8>Bc='->¨Ä>*.=9Ñ.>ÊÞ>-s=7Q+>ß3>$û6=Dq'>²Ÿ>)+A=V*>©ó>-C<=-±2>Üc >5 O=E.>Ú >0 M=I5>Üó >;‹^==A2>ªa>7‹W=W±8>Éå>7ƒi=á4>Oé>*ã_=5‘9>-x><Ão=46>'ù>8+b=O±:>ÉW>8›s=R7>'M>9óf=\!<>¶ >/ w=0ñ7>26>. |=2±9>ÊN>!:=8>(›>-ëC=<1;>ÄA>0ÃP=Ra<>G:>5³V=*q=>6È>%ûL=\á=>RA>*V=B‘>>9*>)L==±>>,,>&óT=[±?>¿í>0sK=<Á>>W’>8S=!q?>Ï×>7ƒI="¡=>&¥ >& N=Y1<>Äê>-£G=@;>»Õ#>)»O=8>IÙ">+cH=9±7>}W$>-ÓJ=.q4>k¹#>/›E='¡4>¿‚>/«F=DÁ<>B>!cD=/Q=>WÌ>'+F=U>>ÉË>&SE=%‘=>0ð>4óD=K‘<>;Ž>53D=U:>IÙ">+cH=9±7>t%">7SA=[Ñ6>YÚ>2ë@=F±<>:­>$ÓA=Oq<>.6>9{B=&Á;>;Ž>53D=U:>.6>9{B=&Á;>º.>=>!;>į>8ë==&Á;>º.>=>!;>Û4>0?=.‘;>Ä>)ë7=3¡9>®ð>0ó===a9>®ð>0ó===a9>Âô>8S7=&18>Âô>8S7=&18>«!>*;8= Ñ4>ÃH>)Ë0=7q2>R">-3;=Iñ1>'ù!>2›;=Tá/>.‰#>9ÓD=<0>6;">+ËA='->è#>-s?=Ua3>ær#>2sA=G2>è#>-s?=Ua3>>æ#>*«D=!3>>æ#>*«D=!3>YÛ$>8{Q=Q1>N|%>)ÛV=á4>"&>/ãa=Y1>T'>'£e=SA5>žs'>0³t=U¡1>«!>*;8= Ñ4>Ì!>4Ó==;á5>Ì!>4Ó==;á5>k¹#>/›E='¡4>d=Õ=]ζ»3Á>µ½Ý=g™‡ºD1 >™Eè=`³7;4ñ>Çóù=¹™Ù;Añ>»E>Û| <>ªÓ>Û¼<%!>ß>þìG©i>«¼SÉ>Þ4"nOð=©é†;9A >S[ê=&M$:HÁ>æÉ%>!£m=NA.>p%>8ë]=S!.>ÓÚ$>9«j=TQ,>åî#>5«c=MÁ*>7à#>;cN=S!.>»Õ#>'W="á+>^.">3K=MÁ*>jJ">*KY=Y¡(>$|>$óH=4&>X‹>0k8=/Á)>·í>%;6=/¡">$´%>,Û]=$:>ý0">=s[=U>>f„'>8{l=AÑ<>¥$>&j=8¡@>o &>4ƒx=)ÑB>á´ >+l=3QD>ç!>7«y=/1F>×õ>=«q=áD>ÌÏ>—­€=JAG>º¼>›Å€=81D>C>—E‡=B±E>ä>˜Q‡=?>YÂ>™™Ž=PÁA>¡Ÿ)>9ës=\‘8>‚)>,»{=/?>~¡'>–Ý‚=3QD>N[#>’‚=)!H>Þ:>–Q†=NñH>]¨>›­Œ=JAG>ä,>šU”=FÑC>6,>›Õ=@;>å)+>˜!„=3Á@>v(>‘µ†=T1E>¼\$>I†==aI>Ø' >™!Š=AJ>Ö>–]=qH>Ní>ž ˜=\E>‹õ->’©‡=;=>,,>¹‡=S±A>‡)>›a‰=;áE>¦ì$>ŸÕˆ=1J>¥„ >•¥Œ=<1K>0ó>”Ñ’=AAI>ÕY>›-š=E¡E> />˜%‹=X>>iÄ,>’ Š=/¡B>¤)>‘™‹=!‘F>Ù$>–5‹=2qK>U2 >›=&ÁK>@P>–ý”=*áI>(·>›Mœ=-AF>C9!>‘‘=DÁL>›?&>—Á= ñK>åA*>“MŽ=EaG>{.>—ÑŽ=5AD>\/>’‘“=2!F>a1>˜m’=3Á@> "2>Õ—=*ÁB>2"1>”Õ™=8=>àN2>”¥¡=‘?>å€->—)Œ=[AC>Dl0>˜=[±?>Ïg0>š‘–="á;>„¿/>šQ=7á>>×/>”­”=@;>E/>›¡’=]Q:>Ïa.>–‘=AA9>φ,>”Õ‰=S7>“*>1‚=3Q4>À:>8û^=GB>A >2 c=aA>'õ>)“_=$a?>]m>'ãn=Gq>>AÒ>+‹x=%!A>·>”é=WA<>Ûv=Ét½àD9=…=«Kü¼ë*=‡=}µÙ¼ï„C=‡Í†= gؼúD=‹Á“=Í긼âÄ7=ý‹=o-®¼å=…É™=ù™¼ø„1=±™=P±{¼îD$=‡¡=\‘s¼êD==)Ÿ=Sg$¼òD0=ݤ=+[¼íÄ@=Ÿ=[vˆ»ô8=¹–=½»¼øÄU=‘©œ=¨Sž¼æH=Ši =\¼î`=¡£=…´†¼òDP=„ª=Õi¼çÄ^=…§=I=U¼ðL=…Ùª=2‹¼êÄO=u¦=ef»ûÄF=e¶=ÿΑ¼t‚Á=°=—¼x‚È=†»=˜M€¼«Õ=‡±¶=Ý„¼L‚×=Š•¼=* k¼Xâá=…·=\5t¼Žä=†E»=&S`¼E‚é=ŠU¸= 9c¼’ë=‹‰½=esU¼U¢ì=Á¹=29Z¼‹Âî==¶=ýÈc¼Fí=†i´= Iw¼[bå=M²=©‰¼p"Ú=…Qª=_aœ¼KâÌ=]¢=n¯¼r¢½=Šª=Ó>§¼uº=‹…±=›x¼‹¢ç=‹)­=«Fм`"Þ=„õ¯=Œ!м<‚Û=Ž¥=› ¼™bÎ=Ši«=³øƒ¼¡‚ã=ŠA›=[éµ¼}"¿=ŽÅ–=ªÁ¼ubµ=Š •=rǼ{"©=ý›=™D½¼vb°=‰•¦=0ï–¼ëDx=i±==YV¼ðDu= ²=U^ö»ïD_=†õ»=^VÕ»ðq=¡¸=J™³ºð„^=† Å=€fï:ïÄl=ŠuÅ=[6„»z‚=aº=*«D¼t¢ƒ=}‘Ð=°y;ã|=Ž1œ=U®Ã»æ(=‡1™=Gƒ%¼÷Ä=„Ý‹=‡F¼ò= Óz=Òó¸¼Ê‰¶< ³s=¬=â¼ð‰Ð<{j=Ái½çÉ뎤=`&€<$a/>Ží =b^‘<7q2>†¥¦=ˆÖŠŠm§=‚~•…Á«=[Þ‹‰Õª=y.<'¡4>Š™³=RŽ“‹…±=~¾­<;á5>…ý¸=kæµ<á4>†…´=R¶È…»=T¾Ì‚¹·=n¦Ý<$Ñ;>†ý¾=XNç<-Ñ9>¡£=n¶ž<%±4>…¦=a¦­<'a6>Žqª=TæÁ<\‘8>‚¬=rÖÌ‹õ­=YÙ‚½£=OþîŠÁ¨=0o=NÑA>‡)›='_=*A>†Í¦=!7(=@QI>ñ¡=2sF=RG>†õ°=78=)AO>†I¢=gþâ‡}—=0C=3¡9>‡˜=./ =N<>ˆý”=$K=Eñ:>‚m™=;ó<=Á=>‰q“=.Ë2=7Á7>‹‘=*‡=4Ñ7>‰=6=I5>†é–=^fó‹ý=}Öëƒ5™=i&΂E”=‡>΄©—=d–½]“=]v¾„—=gÖ­<2‘2>ŽM—=]¡<\q1>‚A=N6¯<.q4>Œeš=€Ž <7q2>ŒŸ=xÀ<-A6>‰É =wæÔ<)!8>Q=^ÆÞ†=ˆ=,7=3Á0>ŽùŠ=*ë =&á2>=†= ×!=+1/>͉=$ó#=B!2>ƒiˆ=7{6=B‘.>„Ý‹='Ë:="11>†‚=1›=DÁ,>«|=4·'=q(>‚=2ï,=!!*>…„=3{/=7Q+>‡)†=3C4=Ra,>‰ÍŒ=+»%=+4>„ =%c0=Y5>‡©=}}<7á.>‹õ²=÷}<7á.>Ž=»=ÆÌtŠÁ¸=]&”<Q1>‹‰½=[‰Í¼=^&¯‰…À=r©<7q2>EÃ=‚NÈ„•Ä=^ž©<42>†éÆ=UvË„ñÈ=y¶½påÌ=b~ÓJ!Ð=w®¹<)‘4>NµÖ=~>À<@Á5>s Ó=]Æ¨Š½Á=ôl< ±->Ž}¿=c…]Ä=…&‰<[±/>‚AÈ=[晊%Ë=[<*1>rÏ=}Þž½qÒ=X¾“ªÕ×=[®£¡ã=x³ª—ß=UÞé<@;>O±ê=fnÙ<%A8>‚ûá=^†š²+í=~†·t!ö=~æâT1õ=4/=@¡>>ÜÔ>2ï=-Ñ9>Œÿ="›='¡D>ͬ>)=O@>¦³>%‹%=PáH>Æ6 >%C)="ÁD>Ý?>%Û/=9AK>³ >0+4=<¡G>ÊÝ>%Ã6=>áL>°8 >.s:==aI>NÏû=6C=9Ñ.>·”>.¿=T15>É’ >.#0=K‘<>Öq >;Ó5=2‘B>À><»<=@ÁE>ɬ>5{@=.H>²a >.;?='ñI>ß7>!ÛC=JÑJ>¹O>7F=IñA>ÒŠ>5SF='aF>«Í>;»F=RÑH>³$>2£I=[aJ>à*>/›J=TQL>à*>/›J=TQL>â! >2ãM= AQ>Ý> >9‹H=FAP>¶>%ûQ=L¡S>©N>/ W='¡T>ãû>%[X=9!T>¤¤>,Û]=E¡U>Àv>$«L=AG>Éo>;+S=]QJ>Îû>3P=;M>Ò¨>;;T=ÑM>ß >8S=9aR>´è >!{X=XQS>·Ë>9Ã^=81T>²>.Ke=±V>⯠>5“o=qX>½>8ûy=AW>ÆK>’m…=UZ>ÆÅ>)“_=±F>¬á>3_=@K>&¨>;ÓZ=<ÁN>Ý”>'sb=O>Ø·>,Kj=4aK>¹ý>&cf=PáH>4„>œ€=DqG>&Þ>7#y=NaE>Ôb>;“q=XQC>Ç(>,Ãi=aA>² >!kW='¡D>ÄÏ>.3Q=TqC>ßR>;›d=Tá?>¯ >/ã\=X>>Öü>+ƒJ=AA9>áz><#;=)Ñ2>Œÿ=3ç/=TQ,>³ >,/='->Å©ö=*o'=*Q&>`ø=&w=Ea'>½ãô=-¯=)‘$>| õ=-ó =81$>“9ö=e¶õ<+(>| õ=-ó =81$>ÇEõ=8û=Va#>½ãô=-¯=)‘$>…¥À=W>Ë<.q4>Šù¾=X¾Ó<8ñ5>ŠUÃ=yÖä<+4>‡™Â=pVé„EÅ=?=GÁ3>Š Å=4—=%±4>‚ÑÆ=)=Tq3>‰ Æ==G==Ñ5>бÇ=c=%±4>‹É=6 ='a6>‡1É=(ƒ=XQ3>ŠiË==¯"=W!5>ŠÊ=;Ï.=Tq3>„%Ã=]Žò‚Ê=? =P¡:>²1Ï=<ƒ&=Pá8>‹Ì=2ã-=SA5>SÍÌ=1?=1C>ŽÄ==£=Á=>„yÄ=?« =$F>Š•¼=Núíº=;' =&1H>†Ñ²=röó‡Í±=2÷=II>…9»=0Ÿ'=9ÑN>‚¡Ã=.W=UN>‡yÀ=2k3=ER>‚AÈ=+'+=aQ>ŠYÊ='‹1=S>Y-Ð=2ß+=3ÁP>‰•Ñ=)C0=,±R>¯]Ú=8›3=+ñP>Ê1Ù=3C4=)ÑR>Æ¡Þ=;k<=L¡S>K‘Ü=7»:=YU>³!ß=7Ë@=,AV>Â…Ü=5#>=SW>‡ÁÜ=.B=%AX>½ýÙ=2C>=7ÁW>ĵÚ=) :=;áU>iÅ×=*6="ÁT>…!Ò='«3=81T>Ž=Ë=2‹5=)‘T>‰YÄ="s;=YU>†Â=4 9=FÑS>„ ¿=0#A==ÑU>†]º=.ÃD=.qT>Žñ¼=3ÃF=ÁV>YÕÒ=8C6=SAU>Ž Ì=2»8==ÑU>‹YÅ=/k==*QV>„IÁ=8³B=L1W>Š]Æ=4k?=EaW>·ÕÌ=4+;=UñV>SYÔ=/K;=O!W>‡Î=*K>=3áW>SYÔ=/K;=O!W>{MÏ=3ÃA=TÁX>˜…Ö=9[@=Y¡X>Ê¥Ñ=%›F=S‘Z>˜…Ö=9[@=Y¡X>r×=5#C=8Y>Y1Ü='E=@QY>ËÙ=0ËH=UZ>R)Ö=0[7=@ÁU>½ýÙ=2C>=7ÁW>Y1Ü='E=@QY>¦íß=2sF=0ñW>}åá=%F=NaU>¬¥à=;›?=B!R>Gß=5ó:=!qO>^AÚ=9»0=JaN>©1á=3;A=\!L>y!Ý="‹4=\‘H>|)Ü=3‹K=4F>S×=2ß+=FA@>ÂeÕ=;ËG=YÁ?>GÝÎ='ƒ>=@Q9>Œß=9ƒU=[aJ>uýâ=*#I=ÁM>Åã=- F=;‘P>‡ƒä='ÃL=AñS>›ä='ãN=>‘W>°ãß=2ÃK=*áY>ËÙ=0ËH=UZ>`«ä=* P=+1O>½mæ=*ûS=S±Q>cé=/K[=0aT>„Kç=0ÃU=5V>bÓê=5‹a=3áW>æ=)“Z=@[>U½Ü=0+O=.‘[>«qÖ=.ÛS=8]>\Ô='KM="á[>eÎ=3ËY=,a]>|³í=+q=+1_>LMâ=3s\=[ñ]>IÛ=3+`=[±_>T‰Ò="Óf=Aa`>‡¹É="#q=!q_>‚)Ä=0#a=2q[>Š­À=›¡‚=>á\>ŠYº=23x=RÑX>”›è=={n=U¡a>®Gá=.«p=Tqc>¦aØ=3ëv=0ad>Á©Ï=™ý€=9!d>Š)Ç=™u‹=S±a>I¡ì=;Kz=Dác>Wëä=&‹{=B±e>|)Ü=’Í€=Áf>«ÉÓ=™i†=Sg>­Ì=™Y=\e>’YÝ=Õ‚=7Ág>=æ=3£=¡f>{Mï=™á€=Kqe>|+ò=4ã~=Ya>YGõ=”Yƒ=c>’Íõ=™Q‚=.!_>Åù=–•†="1a>¹ƒø=™M†=Oq\>¯Éú=–‰=[ñ]>GOñ=8Ûw=Y1\>©5í=3Ët=NaU>°©ó=œ%‚=TÁX>¼=è=9«j=\qQ>ŽÏä=*#d=2O>j/â=%›a=31M>”á=9 [=Y1L>‡¡•=ÓìK<±&>ŠÍÂ=µY¼5Bß==Á=>3R¼obè=»a >oޮ̴ >T.¹ÏÖ>o¶Þ·˜>X~Ï<&Á>Þ>y†ú<.Q>]¤>X.å?ª>9[=2!>¿›>€ŽÅ<;á>Ý# >{^–<6!>cì>/ë=*á>ÀÏ>'k=PÁ!>+l>1=GQ'>&R>;+=)±+>'‚>;›$=NA>·#>6«#=-A&>±Ý>&û'=//>²  >2›6=[ñ->¤ÁÍ=*‹"=5!M>sIÕ="Ó&=S‘J>„eÌ=|­ O=’±š=-A6>‹‰¸=O3I¼¹¢ô=Š=´=/ƒV¼‰bò=‡5°=B[¼’"ò=Š•¬=ÿU¼gBó=‰…µ=e¯-¼5Bÿ=‹Í¸= Ç,¼`"þ=‹Õ»=*×%¼r¢ý=…½¿=O®ë»&q>‡¼=NÎñ»Vñ>…=²=6'¼FA>ŽÙ¨=÷R¼¦"õ=…á¸=R†ä»@>À=Z†“»I¡ >ŠÄ=M抻TQ >‹aÈ=™ h»WA >ŒÐ=¬eø¹Tá>¾™Ø=X36;"Á> áÍ=e…¹'>5É=o云>…±Å=“Œ»¡>MÂ=’l»M>‡q½=W††»8 >†yµ=P&Þ»"Q>T1Õ=d“:;;á>…¥Ë=©ÑT86q>„MÈ=I’µ¸Va>p]Ñ=\3?;JA>NñØ=§)´;$Ñ>E¹Ô=§Ù°;,a>lqÍ=T“7;q>„½Ä=4)C¸71>ùÀ=@Ø 8.q>†]¿=¨ì »?q>%½=¬Œ»)>†]º=Yöƒ»Á >„º=ª¬»Iñ>Ŷ=Pf‹»@¡>¤ÁÍ=¦©’;F±>‡YÉ=U@;1±>IÆ=W3>;*á>‡Y¾=Û6-96>õÉ=­¹Š;I¡>‹¥Ã=a3@;JÑ>‡ »=ê5A9Vñ>MÇ=©9’;]á>UÀ=TH;)±>á¼=g“d;TQ>‹Ä=¤‰˜;4ñ>†)À=´ ¨;[±>‡¼=¶9¥;+1>¶=µÉ´;DQ >‰±Ì=¦©¯;+1>ŠíÉ=¸´;O >ÇaÐ=²ù°;@¡>GÝÎ=¦iÄ;Q!>„©Ì=¦™É;Lá!>ŽEÉ=°Ù×;#>†åÊ=·éð;PQ%>‹ Ç=ÙLŽ)Ã=ÒŽ Ã=Ïl2<%*>{õÑ=¥9Ç;)!>U¹Ð=©iÕ;YQ#>uåÓ=®ð;'a&>ÀÑÎ=Ø4<)!(>Ä Ø=ØUõÒ=ÔD#YõÙ= ý'<1*>^ñÔ=¤¬:I¹Û=»ü=<4a+>ÁÉÖ=·üQ<*q->XÞ=¢l[ÁÝÙ=©Çµá=þluG‰Ý=|þ…<+1/>½7æ=W.в Ü=Ùü ŽåÝ=Ö¤!<)!(>Ä™ß=½7<;q)>lá=ÁÌRËeã=¸|Z<1*>«uâ=Á=<.(>Igà=Â$<$&>§Þ=ל <\%>¹MØ=³Éé;PQ%>¯!Ø=ªéÝ;Tq#>{Ýâ= e+<"Á$>‰Õß=Úä <$ñ">ªÕ×=¯‰Ô;'!>™å=°\J<$&>¡-ç=ô|r\!ì=}£<2q+>‰yÖ=v¦<Q1>rÝÔ=k6…ÕÍ={6†íÑ=ålp<.!/>Ë=Õœr<<Á.>rÏ=ËüY<Á->„ñÈ=ÍV<6!->g%Í=©¼B…™Æ=õ-<A*>†Ê=ÖÔ"<%*>‡¡Å=¦\a<*q->)È=\΀<)A/>0+4>œ=¶==±N>Ó3> ²=5!M>Ny4>”µ²=RaL>Ny4>”µ²=RaL>Ó3> ²=5!M>S#4>’­®=]QJ>íŒE½sZÁ½Ëž¾ÞL1½gBý]í½äŒ\½r–ȽÏ¾Þ M½iɽ²Mê½Ýüp½0νž=÷½ä|[½p2˽Ù]à½s&‚½¯Îѽs½í½×Ìp½ª ͽ}ؽsvŒ½böÒ½¢]å½p¦ƒ½BŽÍ½œ½Ó½wö•½d&ѽÄ]ݽu6‰½oúɽ¦=ʽçL_½rާ=À½å\J½rBǽªË½ä+½nν”-Ò½ì\"½nÒ¾½­]´½àl.½m¦·½¦½œ½æ¼u½gVÀ½¦-´½ð`½g¶¶½¦M›½Û !½i†®½U{}½ò U½n¯½«ý‚½Þ¬½gú¦½I›O½ïlO½j¦½Xû[½ì,½hŸ½S{,½îO½n蜽]û=½áŒ+½kF–½½áŒ+½kF–½½Ù\5½l¦Œ½!6ý¼ð¬s½gœ‘½U;9½Ð¹Ñ¼kþ©½Js½×¹Î¼pp£½]ûB½áÙÔ¼q¦ž½Û½áYç¼f昽5öö¼áŒ+½kF–½½Ô™û¼bÞŽ½&6º¼Ô™û¼bÞŽ½&6º¼§sE¼r œ½X›5½jsR¼kþ™½» ½ÂY€¼fd•½6×¼ÞY–¼ll½-¶¤¼Ô™û¼bÞŽ½&6º¼ìùš¼e нylp¼Ô™û¼bÞŽ½&6º¼Ô™û¼bÞŽ½&6º¼iλd"½ ½6碻c´Ž½;ö½¼s¼g.‹½¶ˆ¼m3:¼a:ˆ½5ìR¼Â˜™;n憽C¶¢¼t1<;`‚„½/lM¼áŒ+½kF–½½Ô™û¼bÞŽ½&6º¼`ã:>’%ž=8->'E;>›u¡=Tá/>á²:>™Už=]¡/>y¬9>™íŸ=a1>þ[9>™œ=.á0>¿8>™9ž=&á2>EI8>•Ù›=9a2>‰7>™±=>4>´7>œe›=Tq3>óý4>›Ñš=Ua3>K5>±™=3>óý4>›Ñš=Ua3>É«3>›É—==A2>kÑ2>žÕ˜=E2>'E;>›u¡=Tá/>-9>¡=Q1>y¬9>™íŸ=a1>WÌ8>›Å =!3>ý5>”=Añ3>WÌ8>›Å =!3>©i7>˜ÅŸ=<4>‰7>™±=>4>ý5>”=Añ3>¤«4>–Eœ=Ua3>w2>›å’=I10>w2>›å’=I10> þ3>š‘–=NÑ1>Üd4>’y”=3Á0>46>¡˜=7q2><5>š‰“=2/>øk2>›U=<Á.>MP3>­=>á,>Óø5>•q=9A+>é¼6>›…’='->Uñ6>”…='ñ)>:8>’ “=.‘+>-°7>—•‘==a)>åÒ8>•=3¡)> Ä7>”É=)!(>µÙ8>˜í”=Y¡(>«­8>–!“=4Ñ'>çü4>—¹Š=A*>Šå6>”!=Pá(>‰6>‹=(> Ä7>”É=)!(>½7>˜½Œ=!‘&>¯ 9>“e’=[Ñ&>‹:>©–=0ñ'>¦ë9>”©˜=AA)>¢°;>”Í›=@Q)>¯]:>šAœ=]Q*>·í;>’yŸ=K‘,>`ã:>’%ž=8->'E;>›u¡=Tá/>ãì ½m"®½¶¾Ë9ç¼n&›½Îþ¾®™¼¼pº ½ðÞ¾ËÙ–¼o¦ˆ½ÜF¾­3>¼nž½Ù]à½/çç»Á¼q½yݽ¥æ<¹Ò½¥ýº½‡1;ÉðS½« ¹½dL<Æ´`½¥™½B *<ÙÂ8½¨ ˜½0†<ÍfD½Tw½;æ—<Ï.½\{u½BæÊ<ÍJ)½Gû?½9fÏ<Ȧ½Y;@½C=Ѧ½» ½“=¡·Ý¼› ½isw¼Ù(a½{½û½5g³»ÐxB½˜-Ù½1O;Äö)½©m³½k :<ܽ« ”½D¦—<«Wö¼G[p½E&Å<ʼK›;½!æÒ<‚Ý•¼;½ †ñ½=g¤»ò¬,»S›.½”λô¬=»J»'½ÏÙݼyæá»¦=š½Êù¢¼töˆ»^ûx½ž33¼éLR»OÛP½Ð3,¼ß »G»;½<çú»âl»b›4½Ý¹¦¼ÅäºL{T½™óg¼ÚåºO[C½¹î¼ÿì»T›i½ëœ½€ö›»±ý½æÌ1½í »§½‚½Ü W½Š®ê»« ¤½õ¼v½…––»¥M•½o½ó&¼®¶½o®›½I3¼°}§½ðÌ5½=c¼­°½oN€½l«Y¼°ǽ༽/G4¼§Ý¹½õÌW½&r¼ÅϽÞ|9½°÷‡¼¦Íؽ²¹ê¼K·[¼­MýäÜ!½9œ¼à½ã½´Ù½¼·B˜¼Šͽï, ½;«Å¼ëMì½âù–¼¹ ϼ{mÖ½Øùí¼µ£ø¼Áô½†3d¼Ü¨½ÆÝà½ÇÙϼÊ:½°Ýý½n³g¼ÅÄ&½Ç}ë½¼yżÜ3½Âö¾¶9„¼ÙTB½«­ø½¸™À¼ÎžP½ºž¾µÙ;÷ŒH»;½´˜¯;ï G»›½†‰¶=)ÓC=*ÁR>‹¡±="s[=KáQ>†-·=7[O=W!U>ñ±=)ke=9aR>…Ñ·=%ÓW=!‘V>„A³=2Ãk=O‘S>‹áµ= “q=F‘U>‰9½=++M=0ñW>‹ñ»=*;]=Y¡X>„ÁÀ=0CH=%AX>áÀ=5KS=2±Y>…uÃ=2ãM=/ÁY>†ÍÆ=/sU=7Q[>‰éÇ=93P=@[>T9Í=$3R=TQ\>‡ÁÌ=8N=)±[>\Ô='KM="á[>Ê¥Ñ=%›F=S‘Z>‹‰È=!“L=LÁZ>ÑÊ=8ÃH=XqZ>‡ÁÌ=8N=)±[>ÑÊ=8ÃH=XqZ>‹YÅ=-KJ=3¡Y>…‘Ã=/›E= aX>Ž…Ç=$[B= aX>îbÔ:ùÌD» û½ÄY‘¼©35ºK{9½×ß¼µ19[;;½Ù9²¼Á—Û9a,½¾мiLs:Wû ½Ù¬½å30º[T½é¬½YL :J›*½íì0½ç˜ºSû>½ÚŒ½7câ8»½ð ?½í»[»(½çü/½ -:»Böð¼ò<]½w˻۽àLG½t®î»5ö¶¼ó p½<ÿQ¼0v̼ê|S½9©y¼Sìh¼åŒw½Ž»·¼vŸ¼ÞLQ½%¨Æ¼ol,¼î,U½šêºN;f½ã|v½{&¤»S;C½qž‹½.Ê»°M„½tžœ½E7¼T{b½nf‰½7[/¼"»½o¦¨½‰{‡¼a{<½y.’½™Ÿ¼6ù¼r&¬½AŸ#¼®—½y¶½½lõf¼¦…½*f©<\«=¼V›½7F¼<%ã=¼ ›½Bf<{æú»»½+¦­»»½å\/½)×ʼD± »í¼-½·w¼­Ø€»í|$½Ș¼pÅnºç<½ w6¼\±y»ö¬½c;¼tb‹ºò ½>/ ¼<±{»ål½>{ ¼L±»ëܽ¼¯Ê¼«NV;ò½ Ü“¼j¸:Û| ½M¿D¼à:îü ½@s¼žb“ºâ¬½@;¼Ôìd9Ý ½„7š¼V'ˆ;àL½œ‹¿¼°<ø¼½6.’¼^'Ô;ê¹û¼$@¼©<¸ù뼓_µ¼ÛI<ÔÙä¼e­|¼x2<é¹Å¼¢‡¼¼}<ÄͼI—H¼Ó“C<Ðùº¼/3¼—Y<Ýy½¼@÷¼é“&<ǹ¨¼€vÍ»“.<ÅY¬¼v »°<Öùœ¼x†€»¯<óœ½p‹C¼`'Š;Ù9ò¼g4¼f'Å;×9á¼S+'¼c'ö;Áy̼93 ¼¬“<Ðùº¼w&¸»a'é;Þùż}>Ê»Y'Ó;ÎùμlÎÚ»\'Ã;àÙÞ¼o¦ø»W'¥;¸Ùé¼?§¼e';Êyõ¼@ ¼ÆNt;ÔÙÿ¼>'¼ÅNB;蜽A§¼’Ð:)=ÁÌ»‰ý¹Ã3=`–»w’9û<=4Û¼tb‹º==g&˜»×NV;"ó-=Ô »—°:33=é,»»N8;7=Ï, »q'‰;Û:=ÖŒ»o'²;«>=Ô,»b'Ý;ë ½;¼ªØÒ»á ½?㼜ت»³4=8C¼Ø»£=Íà½ö£¼36=¿=½2±y» W=œ}Z“< Óz=Òó¸¼Ê‰¶<Ëa=«0‡¼®“D<;u=´„†¼ÛI©<„Ý‹=‡F¼ò==3ÿ"¼çI¾<‡¡Š=/K¼ó ô<kx=evŽ»ÞÉÂ<„-†=»l.»æ‰ñ<›t=4);ï‰õ<‹M‹=&ƒ:ëD=Šñ€=é­;óÄ=‹Í=.3p;ï„(=††=“Éç;÷D-=‹Ž=˜™¾;ðD5=Љ=Ël<ïD:=‰½–=Y总éÄ=…}–=‹ÙšºéD'=’™–=A;âÄ7=Ý=¥éà;î@=‹áŠ=Îô<îDD=‡ƒ=ót.<î@=†¥†=²L?<çDL=Sz=¡ìR<éDG=£=½ìh<æDV=[l=Ò s<ç„P=–õ=ÔŒ<éÄ4=#sv=°ì8<õD7=+g=ò\_<çÄ>=#Y=Ã\w<øDH= _=aVƒ<øÄZ=cL=\΀<õS=«R=PΆ<ô„e=@=wV<î`="KF=].‡<æDq=!ó2=x<ìDn= »9=kF†<ð„~=Ó$=Îl|<é~=+w=Òì<á&=£b=â 4<óD&= «Q=ÁìT<â„.=cC=·Œe<Þ:=³6=Æ\c<ï„H=#)=Ð,d<õDW=Ó=éÌb<÷i=³ =ÝŒd<ó}=ã_= yï;ç=«I=Ö¤%<ë=ƒ9=õÔâ×=#Æü<)Ÿ=w‚Ý=7Æé<3Ã=€bä=/Æö<&C$=¥‚ê=7fã<3S=›âñ=3&ó<-Ó/=n¢ö= s=%#G=Abû=s=2U=Šâõ=“=7»Z=XÂú=/=*Ó^=›ù=Ã-="“b=“Âü= »F="Ãe=¡bü=!sE=,³h=5Bÿ=KZ=.i=Lá> +Z=%Ci=$ñ>[l="c=.>#Z=‹h=/1>3 =9sT=Q>Ã=5#^=L¢þ=“,=3Kg=NÑ>kD=8m=+Á>S=7C`=$ñ>#)=&+p=2á>ÓB=/ûp=>›X=0 m=5a > n=!Cb= >“k=+»e=‘> z='3Y=\q> w=!#[=FÑ> Ó|=9CL=G‘>ãw=0N=>‘>“v=-ë>=W±>+@="ëz=%‘ >»Z= “q=+1>cj=0cj=@1> £t=9K_=;á> Ãt="«Q=#> ›W=2#w="1>Kj=.‹n=Cá>+t=4ãc=JA>ƒv=0[=Q>‹Y= ³x=9a>«j='‹q=á>ƒt=+Ûg=)!>+w=,Û]=<1>S>=.;=%!>ëX=3Sz=&á>«j=%£t=;á> t=&£j=8>v=³]==ñ>»U=%ã}=:!>Ãi=#y=7Á> Cs= cn=+¡>v=*c=B‘> S=—Í‚=M1> #g=,ë~=9A>£q=;+s=E>ët=' d=W‘!>ãR=šå‡=?á>Óf=”ù‚=4ñ>ãq=&ãx=PÁ!>[v=2³j=B±%>“V=›ÕŒ=Aa >‹i=‘q†=S±!>“t=™€=6A$>“y=8»u=3á'>Û\=•½=B!"> «l=”©ˆ=!#>x=—‰‚==Ñ%>K{=7#y=Nñ(>Û\=•½=B!"> “q=µ‹=9!$>»|=™M†=Á&>ã|=0ó}=Pá(>»|=™M†=Á&> ›=›!€=%*>ˆ]€=œ‰=0ñ'>©=š5‚=<1+>…]„=”¹Ž=9A+>Ž…=©†=[ñ->‰ÕŠ=™I=U¡1> “q=µ‹=9!$>Óu=•Ž=\%>Ë|=’•=<¡'>”¥=›­œ=,>ƒ‡=š±˜=2/>Í„=œ¥¤=;‘0>‡¡Š=™Už=5A4>‹aˆ=™¡¬=Y5>‹Š=œ¦=+8>¹†=U°=;q9>…ɉ=™½§="á;>‹%†=“a«=2?> a=—q“=#>Ki=—©™=SA%>+r=–… ='ñ)> y=œñ§=E.> ó~=—Q±=7q2> =’¡´=&q6> z=˜A¶=%:>‚i‚=’²==ñ<>‹m=—iµ=;=>cR=‘™›=T1%> ã]=—‰¢=F!)>[f=˜©='->Ãk=˜e¯=B!2>»n=“í²=SA5> o=Áµ= a8>‹h=˜uµ=Q:>“`=œa´=4a;> K=”¡=6‘)>CU=œM§= ±->Ã^=œÉ­=@12>c=–m±=SA5>³e=m´=)!8>ëJ=—¤=7á.>S=’mª=$ñ2>ûX=—1¯=E¡5>c^=œñ²=8>ë@=™õ=Gá*> A=™M›=/1&>“7=™¥˜=9±'>38=”–=O‘#>ã/=m”=SA%> Ã4=–í“=9a"> #,=—‰’=9!$> Ã4=–í“=9a">C0=—½‘=Q!> #,=—‰’=9!$> £%=”Ž=@1">.=ñ=YÁ> ã"=“­‰=>q >Ã+=’1ˆ=DÁ> “I=”–=/¡">ëE=—Ý“=W‘!>ëE=—Ý“=W‘!>k@=‘±=VÑ>k==™Ý‰=K‘> +:=—-ƒ=±>Û\=•½=B!"> <=˜=Tq>ƒ=3sw=9Ñ>S!=&|=6q>#=;="Á>#$=œ=.> £=–„=%‘> “=*Ûl=/¡>ã=*ër=Y>s=3ëv=Xá>C=|=&>#=2“h=; >Ã=7 e= a>à =/£X=9ñ>Æþ<*ËK=Kq>Fú<+cC=9a>;†ì<$+?=2!>7¦ç<-«5=:!>7fã<2‹5=M1> &á<%÷*=Á>s=7C[=Q >¦ÿ<$SO=K >)&ïÆä<5[9=I >7¦ç<5<=Eñ > †ó< ›D= > £=!ÓP= >S=)sX=W>ã =%{_=:‘> 3=ÉüH>i=›‘±=QA>#u=˜E²=Rñ?> cp=I«=UaC>û|=“-¬=EB>31='CZ=°âô=³2=2«W=‰bò=3I=3;a=²bø=ÓK=9Ã^=˜‚õ= sb=.kg=9"ÿ=+i=!C]=I¢÷= s}=;ó\=D>­=5£U=•"ù=†5Š=&óT=Va>‰U=3Q=<‚û=)“=-£G=Y>Œ˜="³D=GÂþ=…a›=-›9=+Q>+H=)Ãb=p"ú=K^=3[h=,ñ> 3y=8³b=+Q>‡)†=8CV=Mñ>¥Ž=*CK=LÁ >ˆ•–=0@=[! >‹Už=*6=BÑ >KZ=.i=Lá>#u=8³b=0ñ>¡ƒ=%KW=,a >ÑŠ=)M=?q>Y‘=5«C=G>‚u—=*;8=M¡>…E =4ë1=6q> £t=*ó`=6‘ >Š­€=,3V=FA>¹†=7“J=PQ>e‹=9{B=5Ñ>M‘=.ƒ;='1>Ž©=4£:=5a>„±š=* 5=?Q>‹M=5ã9=;Á>‡¡š='39=F±>‰“=3c;=)!>‡-‚=&ÛE=Xá>…Õƒ=9K?=A>‹éˆ=$“==[!>]ƒ=5ó:=31>Œy‡= K:=&Q>-€=4ƒ8==ñ>…=*6=H1 >‡õ†=.S8=#>{y=+³2=YÁ>“|=8›3=&á">}=&;1=6A$> {}=.›/=8ñ%>‡õ†=.S8=#>ŠuŠ=73:=.q$>‚­‚=0+4=Xá&>„E…=97=0ñ'>ŠuŠ=73:=.q$>‚Œ=<=Na%>ƒ­ˆ=5ó:=%A(>ŒÑ=2c@==Ñ%>†‰‹=8ë==6‘)>«|=4·'=q(>‚=2ï,=!!*>…„=3{/=7Q+>‡)†=3C4=Ra,>ƒiˆ=7{6=B‘.>‹ùŽ=7SA=4a+>„Ý‹='Ë:="11>…M“=.;D=*q->%’=7cB=2‘2>‰-˜="ÓF=.!/>ŽÅ›=7ûH=Tá/>‡ÉŸ='kO=;->„Á›=)‹L=V*>ŠÕ•=%»H=Y¡(>„Y’=-ëC=S'>„eœ=2+J=*Q&>„™=8KD='¡$>Žá–=5{@=YQ#>† •='û==B!">‰“=3c;=)!>†}¡=!ûE=W‘!>†}¡=!ûE=W‘!>Šé=/Ã?=YÁ>‹yœ=;ó<=Ia>†5ª=&3C='>„ ¨=;ó<=$Ñ>„E¥='«8=9A>‰µ£=5+6='ñ>‰Á¢=S2=JA>„ ­='34==Ñ>Šª=4Û0=)‘>)¨=-[0=Tq>‚¦=6£0=Z>‰­¥="#1=6! >ޤ=5K3=Fa> ¡=%K7=,ñ>†µœ=0‹?=gBó=‹©=6“/=Ia>Á©=&ÿ.=;q >õ¨=./=$ñ>…U¦=.C2=>â÷=ƒe¡=$s6=Xé=ˆ –=5#>={‚ä=‚œ=238=ŒbÙ=†Å=. <=˜‚Õ=å“=7ï.=uÂË=ˆeƒ=8·.={bÇ=á«=7K.=%‘ >Ù­=/+=(a>‡-­=4×)=nÂý=‡Éª=*.=ï=!¥='/-=‡¢à=½ž=2w(=pÓ=‹é˜= C"=wÂÆ=†—=6=y‚¾=‰m±=%,= >ޱ³=/?&=D>…q±=*#$=¢Bõ=‰©®=8³'=™Bç=Š}¨=%_$=uÚ=q =4Ó=B"Í=Ž•¸='S =›ù=йµ=/—=§î=…=²=-S=Ebâ=‹­«=)ƒ=bÕ=Ž…¢=#=xbÆ=‡9—=;C=|B¶=†ˆ=^næw.Œr^­<|"´=Ô >-£=y"³=¦Ö >W.Ê;ƒ =uB¾=ı>‚îÜ<{bÇ=»F >,K=y¢Å=ä >ê'k=wBÉ=·Ë>9'=sbÏ=×ö>+;3=xBÏ=³Î>7[4=bbÓ=âS>2c@=DâÞ=Šò=5ó=x¬=̱ü=**=p¹=â>>7,=ubÅ=¸>'‹1=u"Ì=Ž“â=.Ë2=}¢¼=˜óì='C:=|ÂÈ=¹Ûõ=5›==~¢Ò=}#ú=2c@= âØ=’#ý=0›@=OÛ=Åáì=*;==¤ç=u7ï=+›>=E‚é=•±á=5Ã2=˜‚õ=Uä=4“4=;ø=«éÚ=/+=B!>‘×=8ó+=‹ÂÎ=à=%û1=›Ù=…è=.s:=O"â=Ë}Ò=-£'=ŠÝ=~áÕ=*C+=7âé=TùÞ=-?0=RBð=³íÔ=*(=R‚þ=ŠíÉ=$k#=¹¢ô=qË=7G"=4bæ=„Å=—=€‚ë=35=)ËU=o‚ï=S:=5 O=Bæ=“R=$ûV=µ¢í=£X=3K=A‚â=Ãn=)SQ=B"í= sv=%CI=Œ‚à=Œq„=4#M=¬âí=Ž5ˆ=8+B=JBâ=µ=[E=RBð=ãR=J潕Ó=2ß+=JA>Ž È=8›.=JÑ >†‰Ë=9Ë1=/Q >Ñ¿=*Ó9=Z>… Ã=.==:!>†­¹=8A=[Ñ>‡¥¼=!cD=D1>Žm³=7“E=0>‹…¶=&J= ±>Š-®=7K=DQ >…íÇ=0'(=,ñ>‹¥Ã=2ï,=9±>‹)½=8»5=9Ñ>…·=3 >="Á>‡‰±=);B=*á>‚-«='³F=Gq>…å¤=7“J=!#>À=Ç*=/1>†E»=82=6! >1¶=/Ã:=Tq>Že°=$³?=Pá>†5ª=&3C='>Š­ =/ËM=0ñ'>õ¹=-§.=)± >Š1µ="»7=6q>Že°=$³?=Pá>‡©³=-ó1==>‹Ý®=0:=Xá>޽¸=$‹*=D1 >„Å·=%#'=I>ý¼=+%=(Ñ>‹=º=#‡#=/á>Ž}¿=( =yâù=‹™¾=/»'= Ñ>„ÑÁ=+ç!=iâý=‡ÕÄ=0 =s‚ö=„ñÃ="Ï$=©Âÿ=‡ÕÄ=0 =s‚ö=‹½Œ=åž='ñ9>y=e–=S7>8î<0³4=K!>Æà<&ë&=(Ñ> ¦á<4— =˜¢ü=#A=*B=ŒbÙ=ƒG=7[/={¢Ë=»K=:ÿ=x"½=k`=³==´ÂÔ={g=3+={bÇ=ól=-ç={¢»=!S~=!S>=uâÒ=k}=*+W=K!>Š­€=,3V=FA> =7K=Y>[{=/k==TÁ>s=5<= !>ûw=2{4=N±>sz=-«5=F±> {u=-?0=BÑ>Ks=%s,=¡>ãt= *=;Q">óm=*ç&="q> “n=+»%=S±!> ãs=7£&=M¡#>Ks=)S1=A>ûw=2{4=N±>£n=)ó*=WA> {u=-?0=BÑ>“h=3ÿ#=7á> ûg=&_=Q!>ƒn="“"=Tq#>[q=-£"=W!%>«`=3s=7¡ > Ûe="=/¡"> »c=&/=FÑ#>³m=;Ó=$&>£n=)ó*=WA> ca=$+=]á>“h=3ÿ#=7á>;\=;§=K! > []=&K=Lá!>½§>}fÿ0£=w‚Ý=ÅV>9Ë,=›Ù=Èz ><›:=¹ÂÛ=§>7sC=>"æ=T¿ò=-û?==Bí=”Mù=&3C=8‚ô=²è="«6=¹Âû=l­ï=4Ã<=W‘>ËÞ=-·/=Añ>’!ç=/;:=W±>…™Ö=*Ÿ/=BA >„¹Ý=7›8=*q >fõÎ=%;6=+1>BZ>78=kbá=¹Â >2“H=d"å=½R>%sL=ï=¶M>3{J=R‚þ=T‡ü=3ãH=4>°ø="[L=2>uÅì=8KD=2>°§ý=^™÷=,KO=[Ñ>²¸>%sL=PÂì=¹5 >"›P=kBú=¦›>+ûI=!>×>-“F=8 >¨m>2+J=#¡ >¤5>'£E=Ia>È“>7“J=G>¹>&Ë?=:‘>Îý>%«G=0a>¯$ >&{:=(Ñ>­Ý>0ËC=G‘>Ày>0£N= A>ŒIÿ=0ÃP=(a>»Ï>%ƒM="Q>Ç>4«H=8>Ø€>.+C=Q>¨7>){F=Q¡>£u>$ãG=&Á>Ø€>.+C=Q> >/»G=.>­¿>0ëJ=;>F—÷=/ÛN=1>ƒGû=8ÓI=K‘>ÁÁþ=/óB=%‘>ÁÁþ=/óB=%‘>£Ê>&S@=VÑ>â>>" B=a!>¨>'{P=9Ñ>«É>8ÃH=Tq#>²/ > ÃY=U¡!>¬V>3#R=*Q&>‚Ç÷=3ƒ==YÁ>Fçü=*³7== >Â-ÿ="«1=4">´>.‹.=+$>ß3>$û6=Dq'>²Ÿ>)+A=V*>© >%{_=[a*>Æü >4g=8ñ%>'À>9cs=A*>­‰>++r=±&>TÂ>&|="¡->D.>%Ó|=$*>U1>•5€=2/>+ù>”}=4a+>J˜>”Ń=Ra,>bH>2C~=%*>PO>—‚=7Q+>ÛK>™á…=-a->P >‘…=N,>/0>™Íˆ=B‘.>$!>’¡‰=Gq.>Èì>™m=Aa0>®ž#>’µ‘=Q1>«å>›õ“=3>µ2!>’Á›=E¡5>Äx>–á™==a9>72>œÑ =.‘;>·&>–½›=[±?>³[>“Ý‘=¡6>B\>µ‹=>4>Ãò>™y‡=;Q2>E>™Ñ„=%!1>+f>“™=)‘4>- >›¡‚=M0>­ƒ>9Ó=R3>/¡>7»z=2‘2>c&>.ët= A1>¬ý >8{l=NA.>Éå>7ƒi=á4>-x><Ão=46>ÉW>8›s=R7>¶ >/ w=0ñ7>?U>›õƒ=8ñ5>´þ>˜•‡=0ñ7>¥I>›¡=JÑ:>:’>œ-•=%‘=>26>. |=2±9>·>”é=WA<>ä>˜Q‡=?>YÂ>™™Ž=PÁA>ä,>šU”=FÑC>Ní>ž ˜=\E>Ò>—YŸ=+ñ@>ÕY>›-š=E¡E>1•>•E¡=U¡A>(·>›Mœ=-AF>Éý>”Y£=@1B>Úr>™íŸ=EaG>­½>“q§=!C>- >žµ¦=3¡I>¿(!>˜¨=[ñ=>¼Ì >˜A¦=-a=>¼Ì >˜A¦=-a=>”º$>–9§=3¡9>.8#>’¢=3á7>ÝÐ$>ɨ=!!:>”º$>–9§=3¡9>t–)>™Y¥=\‘8>°*>œ±©=3¡9>6Z.>™£=1:>â5/>’±ª=K‘<>àN2>”¥¡=‘?>ð2> Y­=7qB>F[%>“=­=2q;> +>–±=TQ<>Û0>”%´=Aa@>f3>™=µ=4F>Sç!>Y¬=+1?>A™&>˜!´=Ja>>À_,>›Ù¸=DQ@>ëà0>º=.qD>»H1>œÕ¼=UñF>¸”3>˜é¸=TÁH>u©1>˜µ¾=F!I>"m3>›»=9AK>¾¼0>“mÀ=)±K>/¡2>5¾=S!N>Ä–.>’qÁ=ÁM>Ä_#>ž¹²=GB>ÞP(>—A»=9aB>»‚->œ)¾=0aD>$^.>“¡¿=RG>Xp/>ž}À=2±I>¥*>‰¿=/1F>ês%>žy¹=E¡E>Á#>õ´=II>|C!>žÕ­=B±E>Wå">½®=,aM>dy'>›¾=PáH>ž&>œUº=\!L>| &>›eµ=OP>nÀ'>že¼="¡M>íó(>—u¿=<1K>i+>•½À=TÁH>`w*>•¡À=*qM>xë,>’qÁ=4aK>ع)>œ•¾=<ÁN>£+>“±À=+1O>(>›±¸=.áP>yå*>—)¼=YQ>x->—I¾=\qQ>Vƒ0>˜e¿=DQP>Üc >5 O=E.>Üó >;‹^==A2>XWå=/‹D=&á>´ýë=8KI=.>¼“ï=;ÛH=2q> ¿ð=4‹F=7á>Jëï=0›@=3Á >€Õñ=%³5=@1">bgê=%›A=6q">K=ë="Û>=M¡#>yqâ=*H=6&>F‘Õ=&3>=(Ñ>i©Ü=<“G=JA>XQã=+L=>\=ç=+“K=-!>Éãé='ÃG=7¡ >ŠQÌ=4‹F=q>s¡Ò=9ËL=ñ>ƽÙ="‹O=YÁ>ÊÞ=.N=6q">µùß=-ãK=FÑ#>°Ô=!£M=4&>`ÉÕ=%ÛJ=GQ'>‚ÅÌ=8ÃH= a(>¯YÎ=*k@=S‘*>…ÉÉ=-G==a)>‰iÊ=$>=)±+>…Æ= »F=P¡*>YÁÏ=9»P=FÑ#>ŠíÉ=+£L=-A&>‹}Ã=/3L=0ñ'>%Á=3ãH=Oq,>‹iÆ=$£>='->Å=2Û?=7á.>‹aÈ=.C2=B‘.>Ž5È=-//=DQ0>†ùÇ=)3O="1!>‰À=7KN=Dá#>„5¹=7[O=&q&>‡-½='KM=2±)>‡ù²=+Q=>!+>¶='ãN=6!->…q¬="«Q=P1.>…!·=0£N=NA.>‹­=%ƒR=+1/>б·=.›O=/>ŠÑ®=0KV=;‘0>Ž¡Â=2;K=;>ý»=! L=¡>‡M´=&O=3Q$>‡é¬=3{O=Ea'>†ª=*ûS=WA,>‹…¡=4ËO=<Á.>ˆ)¡=5ûM=>q0>…å¤=.CR=Ká1>‚]˜=;SH=+4>-¤=3{O=8)>‰-¨=7KN=\%>ŽÝ¯=!£M=W‘!>Š-®=7K=DQ >‹…¶=&J= ±>¥¿=*H=C>‡¥¼=!cD=D1>‚©Æ=8“@=B±>… Ã=.==:!>†‰Ë=9Ë1=/Q >•Ó=2ß+=JA>«éÚ=/+=B!>† À=0SI=S!.>µÀ=-;I=Rñ/>ŽÆ=$“==6±0>„Â=-KJ=Y1>È=/k==9a2>„•Ä=*ÛL=Dá3>9Ê=0ó== Ñ4>„5É='‹Q=+8>GÝÎ='ƒ>=@Q9>¸éÏ=!Y=Ñ=>ÂeÕ=;ËG=YÁ?>WuÖ=)£`=AñC>|)Ü=3‹K=4F>ÆQÙ='£e=4ÑG>Œß=9ƒU=[aJ>WíÚ=%Ëi='ñI>† ¹=2ÓQ=.á0>†±»=)SV=$ñ2>†ÙÀ=+›^=Xá6>„iÈ=7k=N<>RÎ=.Ër=C>íÑ=%Kw=ÁF>aÓ='»y= aH>l‘Ô=8S|==aI>†±°=9ƒZ=NÑ1>„éµ=$e=I5>‹Í½=9Sr=DÁ<>„•Ä=)+|=RC>‰È=›©€=SG>Š%Ë=›¡‚==aI>Š%Ë=›¡‚==aI>ÅáÌ=ž•„=UJ>‡ý©=.³^=Á6>…©²=8n=@¡>>‹=º=5ãy=@ÁE>a¾=˜‘€=@QI>…ÝÁ=‘%ƒ=+¡K>…ÝÁ=‘%ƒ=+¡K>ŽÙÃ=•]…=AÑL>‘Æ=—݈==±N>„ù¦=$[b=B!B>I¯=)Cp=D1I>‹I´=.Cw=;M>ŠU¸=+›~=+1O>ŠU¸=+›~=+1O>…õº=í=;‘P>ñ±=)ke=9aR>„A³=2Ãk=O‘S>‹áµ= “q=F‘U>‰!¾=–……=S>‰¡Ë=a=ER>gÍÏ=š)ˆ=Y1L>| Õ=“ÕŽ=O>]iÙ=˜!„=RaL>žÉÞ=‘Š=O>jeâ=/Ãz=7áN>§¯ç=”Ñ‚=GR>ŠYº=23x=RÑX>‰ÑÃ=••‹=ÁV>•™Ò=”Ý—=UñV>¤mÜ=˜ —=+T>P¥æ=M’=+T>»'ï=™eŠ==ÑU>©5í=3Ët=NaU>°©ó=œ%‚=TÁX>Š­À=›¡‚=>á\>!Ë=–”=.‘[>f½Ø=”í=4a[>f…â=›Õœ=D1Y>kcì=› ˜=PáX>½ãô=–‘=*áY>¹ƒø=™M†=Oq\>Š)Ç=™u‹=S±a>‚ÝÐ=–iš=_>²¡Û=”± =Ñ]>]må=”…Ÿ=)±[>Xï=Áš=<1[>™]÷=’M“=\>¯Éú=–‰=[ñ]>·#ü=Ñ‹=9Ñ^>ÉuÓ=’=\qa>G‰Ý=ž¹¢=‘_>Lgç=“™¡=*q]>t=ñ=œ¹œ=F±\>¼‘ù=’5”=0A]>f¡ý=”1Ž=WÑ_>F?ú=”-—=U^>¸Çò=–©ž="¡]>›±è=ži£=E^>nýô=žý¢=)A_>nkë=›…§=J!`>½ýù=˜i«=;Qb>‚Ýð=—1¯=Uac>l9÷=“I·=GQg>fõî=•é·=Nñh>X9ô=•¥¼=\!l>xÓí=œ!»=<Án>Sô=œÕ¼='q>^Iò=A¸=<t>imú=’Á»=/¡r>¾-ø=—¾=.!o>§«û=••»=P¡j>â>œ´=4f>Øœ>™]¬=4f>´á>ži£=/¡b>°â>—é¢=\‘h>‡>Ù™="Ád>†Çþ=¼=[ñm>Ï >%¸=3¡i>¿‚>˜‰²='ñi>»•>ž«=TQl>ÙÉ>Ù¹=9ar>‡>—!¹=;m>­ƒ>í¶=;‘p>È]>žµ=%‘m>¬>”­¯=‘o>©>œÅ¶=W!u>¹0>”]µ=.qt>Û.>œÉ²=4r>«ãø=’í·=\u>‹¡±="s[=KáQ>„U«=2›V=ÁM>ñ¡=2sF=RG>‚m™=;ó<=Á=>…á=$ËS=/Á9>‰q“=.Ë2=7Á7>„ =%c0=Y5>†ýÞ=™q¤=;‘`>´ÿá=™‰¨=@1b>|Ù=—i¥=PQe>’Ëß=“µ¬=)!h>IMÛ=ͤ=Oql>´5â=™•­=[±o>kaÖ=e¡=GÁc>jõÕ=š =/Ái>¸‘Ò=™E˜=+h>kaÖ=e¡=GÁc>[™Ð=™Å•=Sg>„ Ï=”Å“=5f>­Ì=™Y=\e>¡EÖ=›e€=S‘J>Ü=0n=7QK>”á=9 [=Y1L>^¹Þ=<{s=DÁL>j/â=%›a=31M>ŽÏä=*#d=2O>¼=è=9«j=\qQ>‹Ì=2ã-=SA5>ŠÊ=;Ï.=Tq3>9É=!+.=Ká1>`éü=œ©›=Rñ_>Ä>•U’=S±a>¤Qá=43I=ñ$>Á5×=+cH= a(>OÐ=/Ó;=$Ñ+>…}Ë=…}Ë=‹È=/§=6±0>ÉÌ='+=¡/>‚¥Ê=7S!=+ñ0>‡ÁÌ=8ß#=PÁ1>¦aØ=+SG=8)>“UÑ=+‹8=6!->¼Ò=%+5=7á.>J}Ù='ÃG=B+>¥ùã=8ÃH=JA'>°Ô='#8='1>”õÛ=%ûL=/Q->’Wç="kM=3¡)>¯â=;ÃT=;Q2>‡î=2»X=Ja.>psê=9Ód=O!7>p­ö=53d=Añ3>l[ô=,óq=AÑ<>Ä>;ûo=;q9>Kü=â’>5‹|=%‘=>à~>žý‚=GÁC>Ç)Ú=5‹A=±6>Æá=*cR=Ra<>Šuê=<ûe=GB>KÉò=4ûw=$F>IõÝ=8Û7=+ñ@>†ûè=3›L=EaG>¥Ÿð=5‹a=0K>’ö=3Ct=ÁM>¹ø=’µ==aI>Oÿù=’„=JÑJ>´“>œq…=YE>»·>—!‰=¡F>ãÄ>ˆ=&áB>­4 >˜5Œ="ÁD>Íq>”¥†=O‘C>Òp >”A=*QF>ÖŠ>’]„=QA>¬Ä >˜m‚=NÑA>&Þ>7#y=NaE>4„>œ€=DqG>Ôb>;“q=XQC>Ön >;{}=FA@>ß>™É=Rñ?>Ç(>,Ãi=aA>Ù[ >'#x=B‘>>ââ>; q=TQ<>Âe>8£a=&18>¤6>)»T=;Q2>µÙø=8ÓI=TQ,>ßR>;›d=Tá?>¯ >/ã\=X>>Öü>+ƒJ=AA9>áz><#;=)Ñ2>Œÿ=3ç/=TQ,>oñð=9Ó?=JA'>Å©ö=*o'=*Q&>©»ò=8—,=>$>½ãô=-¯=)‘$>½ãô=-¯=)‘$>°ñ=&ÿ.=M¡#>Xãì=-Û==á$>ÇEõ=8û=Va#>¹ƒø=6Û+=D">Ëgù==»=M¡#>½oü=0÷$=!#>O;ü=9÷=%±$>çþ= O=á$>`ÉÕ=2ƒ'=Q:>fõÎ=7o=3Q4>Sù=5ãy=TáO>Æùû=•±†=TQL>Ô(>–™=\‘H>‡»ú=4K}=QQ>§Sþ=œY=TqS>x]ÿ=˜%‹=JaN>×>”͆=E¡U>Ý(>’‰=LP>¹>’…Ž=NñX>ÖÊ>œE™=FÑS>àƒ>–é—=N\>Ùé>šñ¡=JAW>Ús >Ùž==±^>ËÓ >”!¨=8Y>Ù% >©¡=$a_>¼¯ >™ «=[aZ>Ò¦ >šÍ£=Tá_>ı>’I¬='¡T>ÇÑ >™M¦=;QR>ØÔ >–Ý=2O>ÆK>”E–=Y1L>¿'>™Ù’=EñJ>²„>ù=$J>Ý# >™A‘=M1G>«>—ýŠ=YE>G>™M¦=9ÑN>Ç >i=0K>Ôœ >}•=TÁH>Ð_>šùŸ=WAL>äÖ>’Ý–=@QI>[í>™=±F>)É>–“=FAP>â©>“5Š=TQL>ÇE>šU„=D1I>b>œUš=/¡R>ÂI>“a¦=.!O>Iõ>›y=L¡S>³%>™U©=8¡P>ׂ>›™Ÿ=5AT>Iƒ>™M«=aQ>ãk>’ £=NaU>f2>—u¯=4R>$!>”ɪ=JAW>¤Ü>˜ ·=\U>ÿ">›´=!!Z>Ü›>™9¾=3áW>o™#>›Iº==ñ\>î >›Ä=XqZ>$>=¬=QQ>7þ>—¯=/¡R>¯y>—Q±=TqS>KY>›1¶='¡T>À>›¾=O!W>½ý>—iÅ=5‘Y>A}>“yÊ=)±[>»x>œ9¯==ÑU>Âú>•±±=$V>`Ê>“·=<¡W>åµ>•M¿=$Z>QŸ>™ÕÆ=N\>¸W>•ÙË=B‘^>d> MÎ=FA`>§? >—9­=EñZ>¤R >˜å±= ñ[>¦™>›é¹=S!^>T5>’qÁ=;‘`>ß6>—EÇ=@1b>`á>œÝÊ=O‘c>°T>…=Í=Ye>ÔÏ >Y§=*a>¢ì >žå®=/¡b>BÍ>“Y¸=%±d>Ûn>›¥¾=/1f>´q>žáÂ=9±g>%>>• Æ=h>N“>…=Í==Ñe>-Ñ>ž%È=F!i>PÝ>’AÉ=Y¡h>PÝ>ŠÍ=@Áe>ÎÂ>˜É=+h>$ >“áÈ=[Ñf>Ý>§qÏ=7qb>½¥>…=Í= ±]> \!>˜È=*q]>1#>•À=Tá_>]ü>ÎÝÎ=>q`>aú>®Í=3Qd>>!>œ­Ç=T1e>+j >™…Ì=4b>ir!>ÙÉ=<`>+¦">œ½Ã=S±a>ð/">™áÅ=XQc>3†ù<Ê’/½ ›½´É>*«d=Lá!>Êú >%ÃV=?á>ºJ>7#Y=$a>&á>4{E=&>7‹>8Û7=+¡>ßT>+7,="Q>'‚>;›$=NA>cì>/ë=*á>?t>='"=D¡>¶>8û9=N!>æz >!“L=*á>¥Ù >% 3=@Á>¬‹ >-ã0=ñ>¬‹ >-ã0=ñ>± >%³5=?>Ù >8‡&=&á>¥  >6Ï,==A>Õw><=Q>ØC >'‹1=Aa>«¬ >"*=)A>¯Ì >!ã6=]á >Öt >-»6=1A >ÂO >;>=$Ñ >×g>2 C=LÁ >ÃÓ >< G=K >® >3?=ñ >³ì >5ó:=Ia>Ù>$Ã@=,a >´Ç >5 O=!>Ö>5;R=D¡>¯•>;ÃT=w‚ý=Iñ>"ËX=0Ñ>Ô(>+“P=TÂó=·ë>.ÛX=Œbù=¨o>%F=‰bò=Ö§>3{O=XÂú=®A>8›3=ƒ¢ù=£">&»>=£âÿ=d>7ãT=?‘>»#>%#b=&á>´U>5‹a=0Ñ>0G>.ÛX=3Á>® $>$kH=2‘>À@>9óA=K‘ >-®>/[\=4¡ >Î3>*Ëk=(a>»d>0Ch=.q>~!>"û`=O‘>&8%>&O=:!>%?>' D=YÁ>» >9óf=M >R>)Ëp=4¡ >en>*Ûl=JA>x">)óe=Kq>%&>2{T=PQ>IH><ÓP=NÑ>»Î>*ëm=¡>G®>%“s=[! >’:!>)»o=K >&É#>'[i=!‘>Õ&>4ƒX=&q>bƒ>'«8=RA>á>*ÃX=Y>4Ô>3›q=G>-µ>&{u= ± >+÷">4cq=-Ñ >-í$>#Ën=+>üÃ&>$Ã`=Q>O>/Ã?=RÑ>©ó>,ë^=GQ>Bæ>)Cu=3Q>¿ >8ëx=7á>eU$>"«v=@ >-í$>#Ën=+> T&>+³r=BA >4(>4+[=q>0c>9‹H=Xq>¦Ó>'ûb=1±>eU$>"«v=@ >YO>6s-=LÁ>;þ>7F=Y1>¦Ó>'ûb=1±>KX>;ci=?Q>Bæ>)Cu=3Q>¦'>,#z=W!>¦'>,#z=W!>àc >+›~=K!>a3 >'Û{=‘>Ž>&>;k|=TQ >Ž>&>;k|=TQ >€ò'>2#w=C > T&>+³r=BA >¿ >8ëx=7á>?ª>9[=2!>ÙZ>6O=FÑ>à~>…žèÛÞ>7{=+Á>Ù >8‡&=&á>Pp>wnõß>U¦ó¤ý>/W=DQ>=º>kæõ<¡>Ïj>.O =a>¤ú>-Ó/=P1>³?>.§$=6±>(Ô>4û=>/S>)k*=1>>=>+÷"=W!>ã6>7ƒ$=)!>·í>%;6=/¡">9\>2ƒG=DQ >$|>$óH=4&>ÛÞ>=û[=%±$>jJ">*KY=Y¡(> !>'[i=>‘'>åî#>5«c=MÁ*>†r">9Sr=2±)>ÓÚ$>9«j=TQ,>V|#>%Ów=9A+>æÉ%>!£m=NA.>@m$>5}=DÁ,>žs'>0³t=U¡1>Ã%>›)ƒ=7á.>¸;>5cl=á$>ß…>7óu=+(>¥¿'>›‹=\q1>“*>1‚=3Q4>φ,>”Õ‰=S7>«*>Ÿ%“=3Q4>Ïa.>–‘=AA9>é ,>—ݘ=]Á6>E/>›¡’=]Q:>˜ó,>šý›=.8>×/>”­”=@;>«¬->’QŸ=F!9>Ïg0>š‘–="á;>«¬->’QŸ=F!9>2"1>”Õ™=8=>2<&>šÁ™=5A4>«\(>˜=Ÿ=&q6>jj)>½£=)!8>jj)>½£=)!8>²g><[Q=WB÷=)>'ãN=³Bñ=GÊ>8ë==¡¢ê=(Ð>2»==^bì=`>.g =E‚é=ä‡>''=PÂì=GÊ>8ë==¡¢ê=4œ>!M=Bî=`>.g =E‚é=-Î>&‹=•bç=X¨>5‹<=¬Âæ=5¶>(S=˜Âã=VŒ)<‰ù¤;é Ë<³é;'q; Ö<³é;!ó;ì =X1`; ˜å9» þs¼¼ ™<Ìsi¼çL{»†b<ÇÙ¼xæ§»‡“E){+=³Bñ=ß>U¦ó2Ä>ovÐ?>yVÒ<; >±Ü>wfÂK±>gnÏ<2q >H0>>Ñ>=>j>Ý<>U£>w¶ì©G>^>þ<,>,(>6ï=Oû=^Ô>'_=U¡>®A>8›3=ƒ¢ù=­§>wþã<%!>D1>+ç=Y¢ó=2>@_=Šâõ=ä‡>''=PÂì=Ý\>){+=³Bñ=Ý>2K1="á>Ñ! >$ƒ7= ±>»d>3óI=;>?á>'ãN==ñ>Ñ! >$ƒ7= ±><Ù>2ãM=P1>«>.kg=JÑ>_é>&cf=WA>×Ý>2C~=¡>Tr>4Ëj=,a>5 >”I‚=7Á>XÄ >%;v=2>+  >–Ù†=Za>:è">œY=)!>õ-#>—mŒ=F±>9!$>œõŽ=>±>ÊS&>—™“=F!>7'>—‘•=]Q>†!>3û<=2>0G>3óN=-!>†!>3û<=2>„‚">)KC=Rñ>áÏ >7[T=>q >Òn$>3óN=U¡!>Y3">8s^=G"><ƒ&>;[[=FÑ#>$E$>0Si=6A$>*o'>9ã`= Ñ$>.Y%>.o=Kq%>ž%(>/e=F‘%>M&>2ks='a&>)>##l=S'>Ëõ&>0z=<¡'>2*>5;r=+(>K8$> ‚=O‘#>\Ë$>’‰…=81$>6z%>ŸMˆ=E¡%>ïà'>™€=RÑ(>ÀB&>—…‹=S'>» )>•‘„=1*>>é$>— ‘=VÑ>;«%>“1“=%!!>>Ž&>›1–=B!">mT'>”É=(>ʧ'>•Aš=HÁ#>óW(>˜1•=P¡*>f)>šqŸ=@Á%>PS+> =31->Dˆ+>—½¦=AA)>â«->—=¤=Aa0>e(>žá—=5a>+/)>›µš=I¡>ù~*>–ež=LQ>3,>›)£=7¡ >W³.>™™©="Á$>óÅ.>™ «=Ra,>¸Ž1>—±¬=@Q)>N›1>’¬=2/> 84>™9®=Y1,>‡h4>“µ¬=W‘1>Äb4>œe«='a&>B!2>žù¦=\q!>bf/>- =?á>2ã->™1›=Za>^˜,>–a—=\‘>üq+>”­”=GQ>‚Š*>”q’=+Q>yâ)>›=W!>ïn5>™q¤=Lá!>í*4>•y =>±>t[2>“­™=Q¡>Ðî0>±”='1>·˜/>’‰=+Q>eS.>™Í=\>«@->‹=Cá>Ó,>–‰=&á>2“8>­=Q!>æ6>œ‘—=Ñ>ö4>–Õ=S‘>ÙV3>”]Š= a>Xý1>™á…=!‘>N³0>–eƒ=ñ>á–/>™ý€=R>ÛÞ.>%ã}=6q>Ô~+>œ†=)>®·->5;w=:‘>"¥)>›Å€=Ñ >ž+>){k=,a > x)>'ëa= ! >à€&>”a=E>œ(>1‡=FA>!)>A=>ãû">–¹„=Lá>†#>±‰=)‘>¤á$>“)=Q>¦º >› =,ñ>×Ý>2C~=¡>¬*>–á‰="á+>.->•™’=+1/>ôL/>›Å›=B!2>ëª0>”e¨=)Ñ2>V½,>•™‚=>!+>%/>’ÙŠ=0A->¤Ç/>—Ù‘=‘/>Çd1>žy™=NÑ1>Ù±1>¡=>4>P3>—µž=Ua3>t—4>˜Ý£=)‘4>+N5>œÑ =0a4>°6>”%¤=Dá3>eú5>™m¨=!3>õ´3>—¨=FÑ3>ž7>›qª=NÑ1>î\8>–Q¦=*Á2><.:>ž§='1>çÝ8>›Y«=J!0>°‡6>˜Ù¬=.!/>œÂ:>˜õ§=-a->yv9>’}«=6!->ïª7>”I­=I¡,>$6>™)­=$*>ML7>’í§=B±%>²M:>š­¡=ñ$>T;>”E¦=K)>ïþ8>”…ª=6‘)>” +>&ky=;q)>Šè=—á¯=T1e>}ÿæ=Uµ=+¡k>\¯é=›eµ=*Ár>„U«=2›V=ÁM>‡Å=UVä<>4>‹•Ç=†Fæ<9!4>޵Ê=o6ç<á4>ŽQÈ=3ÿ=Tq3>…õÊ=6Ÿ =<4>‰=É=;ï=Iñ1>‚qË=7=!3>‚¥Ê=7S!=+ñ0>‡ÁÌ=8ß#=PÁ1>fõÎ=7o=3Q4>[™Ð=g&ó<Á6>¤‰×=)Ç =DÁ<>J›ê=?ç =QA>¸©á=6{=&áB>¥Mõ=)g=<¡G>|Gí=3‹0=2±I>¹ûü=&G+=&ÁK>Æßö=$û6="¡M>·=>*s3=NAN>F{ü=8c==‘O>º>+3@=AaP>°4>/#F= AQ>¶¿>$;@=8¡P>Žsû=7ƒI=5±P>ÁÉö=;#E=/O>\ñ=)kE=OqL>†ûè=3›L=EaG>IõÝ=8Û7=+ñ@>aÝø='{P=AaP>esõ=7kU=/O>¥Ÿð=5‹a=0K>Æ¡þ=,›T==AR>R û=.ûZ=S±Q>Uø=4[c=;‘P>’ö=3Ct=ÁM>jý=%`=*ÁR>°æ>9£W=]1S>Î4>+£L=;QR>§Ë>0³O=!S>ׄ>;#E=YQ>¦ï>$#L=,±R>à >)[D=‘O>à >)[D=‘O>¦ï>$#L=,±R>³?>7cb=GÁS>Ã]ý='Óm=[AS>³=ú="Ãj=PÁQ>Sù=5ãy=TáO>±÷>&;=!qO>àò>;ã;=XN>`ÉÕ=2ƒ'=Q:>‡»ú=4K}=QQ>§Sþ=œY=TqS>Ë,>0£n=F‘U>×>”͆=E¡U>¹>’…Ž=NñX>ÐÑ >›Ý=U^>àƒ>–é—=N\>ʦ >š]—=>q`>Ús >Ùž==±^>Öª >Ñ›=S±a>Ù% >©¡=$a_>Öª >Ñ›=S±a>Ò¦ >šÍ£=Tá_>£s>’ñž=)Ñb>â>’ Š= ±]>Ëó>–õ‘=Tá_>Lü>–Ù–="1a>Lü>–Ù–="1a>PÄ>m™=B!b>Ãb>EŸ=Rc>åC>“m¥=5Ad>Ä=>–9§=ñd>=)>y®=4f>ÀÌ>™¬==Ñe>F^>›=K‘\>¶j>œa”=[ñ]>¶j>œa”=[ñ]>d>š—=7á^>$>•q=;‘`>PP>}¥=4b>]>”]ª=+d>%’>›¯==Ñe>¤û>™ý=RÑX>$Î>’]”=2±Y>ÀA>–Q–=1Z>,ò>™-™=>![>&ú>˜ÅŸ=5!]>3O>“q§=!q_>.3>“Qª=c>DN>“ù¬='a>]2>›¯=Eb>ºÙ>“E°=NÑa>ª¶>˜!”=*QV>Á7>’A™=7ÁW>Á7>’A™=7ÁW>Ô >”Uœ=W±X>[{>ž…£=LÁZ>ùƒ!>˜­= ±]>Wv!>œá±=Aa`>E!>’­³=Ya>b>œUš=/¡R>Iõ>›y=L¡S>ׂ>›™Ÿ=5AT>ãk>’ £=NaU>$!>”ɪ=JAW>ÿ">›´=!!Z>¤Š">™µ´=$a_>o™#>›Iº==ñ\>">›ùº=4b>1#>•À=Tá_>V¹ >›U´=B!b>">›ùº=4b>Š!>”ɺ=Uac>B<">˜!¿=+d>ì…">“À=Uac>ßN">›¡Â=T1e>ð/">™áÅ=XQc>>!>œ­Ç=T1e>èØ!>™ùÄ=$f>$ >“áÈ=[Ñf>É!>œ=Æ=+h>ÎÂ>˜É=+h>æ[>›ýÆ=F!i>PÝ>’AÉ=Y¡h>È>žùÆ=#j>-Ñ>ž%È=F!i>Å>œqÅ=Uj>?>ÕÂ='ñi>?>ÕÂ='ñi>¦ž>“ݼ=F!i>¬R>•±Á=Aj>µˆ>™A¼=@Qi>4Ú>µ»=TÁh>.:>œE´=Sg>Å>œqÅ=Uj>Ïò>˜ÝÃ=Aj>È>žùÆ=#j>Ò9>—µÃ=8i>fM>™iÁ=*ái>ß¾>›íÀ=Ii>És>»=<¡g>ʈ>’ ³=@Áe>-²>žý²=5Ad>@e>›½­=[Ac>]2>›¯=Eb>æ[>›ýÆ=F!i>Àv >—éÂ="Qh>6®>œÀ=&1h>b>˜º=5f>3£>“u³=!c>ºÙ>“E°=NÑa>ºÙ>“E°=NÑa>V¹ >›U´=B!b>î >›º=0ad> ì!>a¿=SAe>px!>•õÁ=Sg>ßN">›¡Â=T1e>px!>•õÁ=Sg>ßN">›¡Â=T1e>èØ!>™ùÄ=$f>Š!>”ɺ=Uac>B<">˜!¿=+d>Ù´>%«b=\U>%’>›¯==Ñe>Þq>i­=+d>Þq>i­=+d>Üñ>”-²=Sg>Üñ>”-²=Sg>­¤>“)°=Xáf>%’>›¯==Ñe>M>”Ͷ=qh>Yö>“Á¶=h>Yö>“Á¶=h>©¾>”Ý·=3ág>­¤>“)°=Xáf>BÍ>“Y¸=%±d>¢ì >žå®=/¡b>ÔÏ >Y§=*a>Ûn>›¥¾=/1f>¦ž>“ݼ=F!i>´q>žáÂ=9±g>%>>• Æ=h>+¦">œ½Ã=S±a>@e>›½­=[Ac>)É>–“=FAP>æt>˜5Œ=AñS>â©>“5Š=TQL>Dn>”¥=OP>ÇE>šU„=D1I>8>'3t='M>Êø>”ň=!‘V>¿ >*ãz=$ñR>/‰>8ók=3ÁP>Ę>’݆=UZ>:Ê>!ãv=AW>³$>;Ûh=E¡U>£ >%ã}=UZ>9É=!+.=Ká1>‹È=+/=Ká1>Ž5È=-//=DQ0>‹È=/§=6±0>‹aÈ=.C2=B‘.>†ÍÆ=*Ÿ=7q2>‰=É=;ï=Iñ1>„EÅ=?=GÁ3>É!>œ=Æ=+h>'E;>›u¡=Tá/>j-<>’­£==ñ,>¤7<>–A =Nñ(>T;>”E¦=K)>²M:>š­¡=ñ$>œÂ:>˜õ§=-a->$Ñ;>›Ý¤=FA0>¼¯:>™-¤=@12>-9>¡=Q1> —8>”µ¢=Ua3>WÌ8>›Å =!3>©i7>˜ÅŸ=<4><.:>ž§='1>î\8>–Q¦=*Á2>°6>”%¤=Dá3>¾Ù6>–m¡=9!4>·µ5>šéž=814>·µ5>šéž=814>÷3>žM=Ua3>¤«4>–Eœ=Ua3>kÑ2>žÕ˜=E2>+N5>œÑ =0a4>÷3>žM=Ua3>P3>—µž=Ua3>Çd1>žy™=NÑ1>kÑ2>žÕ˜=E2>jÛ0>›Õ‘=]¡/>øk2>›U=<Á.>B²0>”9Œ=%‘->4f2>šŠ=.‘+>Çd1>žy™=NÑ1>¤Ç/>—Ù‘=‘/>jÛ0>›Õ‘=]¡/>B²0>”9Œ=%‘->%/>’ÙŠ=0A->4f2>šŠ=.‘+>ëÅ0>’y„=JÑ*>DÆ3>”E†=3¡)>çü4>—¹Š=A*>P5>”µ‡=Dq'>ÒÉ2>–}‚=)!(>^Ô.>. |=Pá(>V½,>•™‚=>!+>” +>&ky=;q)>='->#3r=JA'> 1>)ûx=E¡%>e:4>½ƒ=Kq%>s‚6>š±ˆ=O‘#>n¨8>›e=0a$>—¬:>š±˜=@Á%>¸¯3>™á€=Iñ!>BÍ0>+ãu=[±>!;/>* p=HÁ#>´9.>&+k=/¡">5,>0 m=*Q&>5,>0 m=*Q&>2*>5;r=+(>)>##l=S'>jô*>7ƒd='¡$>´9.>&+k=/¡">¶Þ/>7[o=Gq>”H2>![v= !>jh3>—%€=2q>Xý1>™á…=!‘>ÙV3>”]Š= a>By/>%ëk= ±>Ó,>*‹b=:‘ >Y*>*Ó^=YQ#>ž%(>/e=F‘%>*o'>9ã`= Ñ$>.p)>/ÃZ=4">œà+>'ë\="q> Ø.>0Ûd=Ra>ô£1>;ƒp=5Ñ>N³0>–eƒ=ñ>J"+>'3Y=B‘> ±->,c^=9A>ëª0>'Óh=+Q>á–/>™ý€=R> í,>&óY=Za>ç/>5«c=PQ>ÛÞ.>%ã}=6q>jŸ.>9£\=FÑ>®·->5;w=:‘>ž+>){k=,a >ÛQ,>5£P=W‘> x)>'ëa= ! >J*>&ëF=B‘>4(>4+[=q>P2)>0#A=*q >2“(>8“@=&Á >IN&>)S6=D>X¨%>/“2=/á>=$>%G0=-A>·”#>;¯,=W!>ëÈ!>9.=-Ñ>ß0!>"Ó+=RÑ>Ý>2K1="á>ïá">0¿)=<>¸Í$>7g.=YÁ>ž'>4³;=Gá >Õ&>4ƒX=&q>üÃ&>$Ã`=Q>Y€&>%K7=-Ñ >%&>2{T=PQ>ïá">0¿)=<>Õ@#>.—(=S!>¸Í$>7g.=YÁ> %>/û0==a >&8%>&O=:!>и >-"=G>Ëö!>3ÿ#=BÑ >îÉ#>%-=O!>® $>$kH=2‘>£">&»>=£âÿ=¨n>)ë=VÑ>Ú«>;Ó=Xq >/h!>0S$=%±>_•>3ó =1A >N>6ƒ=<¡>²}>p>õ¸<>Y–ù<-!>Á§>6s =@1>Ñ>+Û=S±>&>!/=)‘>(Ô>4û=>>=>+÷"=W!>Z¸>4G=á>ã6>7ƒ$=)!>I.>6C%=T>YO>6s-=LÁ>ß0!>"Ó+=RÑ>Ïj>.O =a>d>Uöø+ú>\îç<@¡>Èx>tÖÝÙê>UöÝ=º>kæõ<¡>ý5>”=Añ3>©i7>˜ÅŸ=<4>75>–É…=#¡>¸7>—9=K! >m9>›Á”=-±">2“8>­=Q!>ö4>–Õ=S‘>æ6>œ‘—=Ñ><ƒ&>;[[=FÑ#>¦a(>3CT=Q!>2*>% S=,a>­‹+>$ÛT=D1>Òn$>3óN=U¡!>‰C&><£H=)A>`ê'>$kH=5a>`t)>)óJ=Q>»›'>%‹@="Á>×À&>3S:=YQ>„‚">)KC=Rñ>ep$>R&>;{==;q>†!>3û<=2>µ‰#>'7=K‘> 6%>77=$A>µ‰#>'7=K‘>@¾$>5K3=JA>†!>3û<=2>Ñ! >$ƒ7= ±>n">.»1=Gá>Ñ! >$ƒ7= ±>‹È=/§=6±0>×>Íg< !>ÚÇ >uV‹ÛÄ >‰>„<>‰‡=°Ù™;Kq>s~=° á;)‘>‹ ‡=©9Ð;@>‚1‡=¥¹ø;F!>әżÛps½¹ ¾ÂYÛ¼gнÛn¾‡áÉ=7‡0=V.>‡È=8ë==I¡,>‹È=/§=6±0>®.7>–I˜=%!1>²b8>—õ—=!q/>‚T:>—mœ=2/>`ã:>’%ž=8->ëT9>–-˜=-a->âý8>’™–=O±*>~Ý9>žy™=,>WÌ8>’¹˜=;q)>WÌ8>’¹˜=;q)>~Ý9>žy™=,>¯]:>šAœ=]Q*>¦ë9>”©˜=AA)>XmÞ=™q„=Y¡h>¦Cç=Ÿ=Eag>tà=—å†=2±i>»è=’„="Qh>y§â=™M‹=9Ak>‹Më=”eˆ=,Ñi>›«æ=˜m’=/Qm>€cï=šµ=\!l>…¯ï=“ •=NAn>Š=ô=›õ“='m>eö=—õ—=NAn>”¹ù=š™”=TQl>W#û=—Á˜="¡m>¯­ÿ=š‘–=4ak>{Mï=™á€=Kqe>jÛð=yƒ=,Af>—;ó=Õ‡=9±g>]Áö=—=!!j>YGõ=”Yƒ=c>]÷ö=“•…=Dác>²›ù=šŠ=Ie>”1þ=š5’=TÁh>Åù=–•†="1a>~Åú=ŸÕˆ=Eb>¾Gý=—ÙŒ=GÁc>¦ >žQ”=O!g>àŸ>’¥›=#Ñk> kÿ=žñ˜=>ál>Ôì>›ñœ="¡m>¯wÿ=•…š="¡m>¯Î>“‘ž=En>·#ü=Ñ‹=9Ñ^>f¡ý=”1Ž=WÑ_>Ä>•U’=S±a>‡>Ù™="Ád>°â>—é¢=\‘h>׺>œ=¦=4ñn>»•>ž«=TQl>¬>”­¯=‘o>¿>–A¥=CQp>à >œ =&Qo>¹£ÿ=˜ñ›=P1n>¹£ÿ=˜ñ›=P1n>Àþ=™õ=[±o>²¡û=aš=NAn>Eù=”Ñ=Aap>¬ýý=œ¤=!s>ÊÅø=Á¥=Cás>”õû=™1«=@Áu>^Ï÷=”Á¬=;áu>~mý=“M®=¡v>»A>”…ª=PÁq>¿>–A¥=CQp>ÕÎ>žåž=&Qo>à >œ =&Qo>ÕÎ>žåž=&Qo>ÕÎ>žåž=&Qo>Ä#>œÙ£=Er>Ƨ>œm©=át>à >œ =&Qo>Ô¹>—¤=%!q>©…>˜¥¨=J±s>³x>œ‘¬=B±u>¢þ=–±=Áv>“«ø=œÙ®=&qv>ůø=“9±=#v>}«õ=’…®=5v>WÍó=˜‘°=;áu>¹÷ð=–y«=ñt>ä>—©=,±r>¹>–ñª=5At>áí>a¯=;áu>¿>–A¥=CQp>Ô¹>—¤=%!q>ä>—©=,±r>«x>›y­=<t>²¡û=aš=NAn>W#û=—Á˜="¡m>O!÷=Ù™=9Ñn>eö=—õ—=NAn>lò=œe›=YÁo>ÂKð=—õ—=4ñn>fê=A˜=.!o>»à=š=@¡n>›qÚ=–±‘= ñk>jõÕ=š =/Ái>Åçî=“ ž=

¾)ì=—ýš=YÁo>Åê=š¥ž=

¥×æ=“ùœ=Lp>®õå=˜õ¢=W‘q>IMÛ=ͤ=Oql>wgí=š%¡="1q>]‡ê=—™£=@1r>°ì=’­=.qt>´5â=™•­=[±o>\¯é=›eµ=*Ár>…Ñì=— ¥=9ar>Åçî=”±«= Ñt>Œó=”µ²=E¡u>^Iò=A¸=<t>WÍó=˜‘°=;áu>a§ø=•©³=,Av>«ãø=’í·=\u>®Ÿþ=“1³=¡v>©>œÅ¶=W!u>Ä\>›‘±=E¡u>¹0>”]µ=.qt>Û.>œÉ²=4r>»A>”…ª=PÁq>WÍó=˜‘°=;áu>ůø=“9±=#v>a§ø=•©³=,Av>¢þ=–±=Áv>®Ÿþ=“1³=¡v>áí>a¯=;áu>Ä\>›‘±=E¡u>«x>›y­=<t>«x>›y­=<t>ä>—©=,±r>«x>›y­=<t>‡Ý×=›ÕŒ=!!j>œùÕ=’mŠ=Ki>¸ÍÔ=”ň=+h>¸‘Ò=™E˜=+h>[™Ð=™Å•=Sg>„ Ï=”Å“=5f>wgí=š%¡="1q>‰·î=™M¦=Rs>WÍó=˜‘°=;áu>Åçî=”±«= Ñt>‰·î=™M¦=Rs>‰·î=™M¦=Rs>²gï=œa¤=9ar>bóñ=”Aª= Ñt>nýô=—¨=81t>wgí=š%¡="1q>~3ñ=œá¡=Iñq>Åçî=“ ž=

J™ô=“]Ÿ=Qq>lò=œe›=YÁo>O!÷=Ù™=9Ñn>x->—I¾=\qQ>yå*>—)¼=YQ>Ø+,>—í¹=!S>¯)>•Ù¶=2‘R>[[(>“¦=0ÑP>%°)>›u¡=]¡O>ª˜*>“a¦=8¡P>MK,>œ¤=O>nø->i­=W‘Q>¢y0>“µ¬=OP>kd'>Õ²=NÑQ>ýb&>›Ù¨=\qQ>~¡'>žU«=S±Q>[[(>“¦=0ÑP>$J+>žåž=NAN>jº.>™a£="¡M>¾F2>–é¬=XN>W3>•ݲ=‘O>AÖ3>›]²=UN>J±3>™=µ=I1P>“4>’´=EN>­À0>™ù¤=)±K>Fé2>i­=I¡L>Fé2>i­=I¡L>Ó3> ²=5!M>Ó3> ²=5!M>0+4>œ=¶==±N>'Ô3>œ]¸=5±P>B2>”Õ¹=*ÁR>Ny4>”µ²=RaL>¹i3>ž]®=<1K>õ{2>”ª=[aJ>¢—1>˜É¦=S‘J>vs1>”¡¥=TÁH>ÁÇ0>žý¢=AAI>"1>Å¡=II>*þ/>’5Ÿ=!!J>"1>Å¡=II>*þ/>’5Ÿ=!!J>Vh0>•éœ=3¡I>@h->˜5œ=2qK>â¨,>’¹˜=XqJ>Y¤)> ™=0AM>Á/>•½ =AJ>W°->“‘ž=Y1L>W°->“‘ž=Y1L>$J+>žåž=NAN>æ’*>—Ùœ=ÑM>i'>¥š=.!O>*o'>å“=*qM>DÃ">——=9ÑN>W°->“‘ž=Y1L>%°)>›u¡=]¡O>²)'>’M£=3ÁP>åñ$>- =DQP>³">žé¥=)AO>æy >—ž=AÑL>- >žµ¦=3¡I>а(>œ9Ÿ=‘O>->˜a˜=EñJ>Úr>™íŸ=EaG>x|+>žA“=F!I>çý/>’ý˜=&1H>µ†2>”õ›=2!F>ž2>˜ùž="QH>í»2>˜¤=\‘H>í»2>˜¤=\‘H>G‹3>—™¨=F!I>­á2>“­©=2±I>S#4>’­®=]QJ>îx3>›ý¡=81D> ˜3>–Á¢=SG>364>ž‘¨=EaG>G‹3>—™¨=F!I>¯¬4>›U¯=KI>S#4>’­®=]QJ>@¾4>—=´=>!K>Ny4>”µ²=RaL>+f4> ¹=8M>0+4>œ=¶==±N>çÃ3>”ɺ=]¡O>Ò4>”Aª=YE>”„4>“U±=7ÁG>@¾4>—=´=>!K>f3>™=µ=4F>¸”3>˜é¸=TÁH>"m3>›»=9AK>+f4> ¹=8M>/¡2>5¾=S!N>Vƒ0>˜e¿=DQP>DÀ1>ž!¼=GR>½Æ.>›»=S>~¡'>žU«=S±Q>¦(>—A«=U¡Q> ,>”¹®=B!R>¾™(>’²=2‘R>Å*>—ɰ=4R>²F->œ‰´=XQS>¸7/>•1´=!S>á–/>˜É¶=O‘S>g$2>“¥¶=;QR>/Þ/>’…¹=>T>½Æ.>›»=S>‚Þ+>™=µ=UaS>Áˆ->™­¶=FÑS>Ø+,>—í¹=!S>øÄ*>™i¶=XQS>½Æ.>›»=S>B2>”Õ¹=*ÁR>DÀ1>ž!¼=GR>çÃ3>”ɺ=]¡O>Ø+,>—í¹=!S>¯)>•Ù¶=2‘R>øÄ*>™i¶=XQS>¾™(>’²=2‘R>'Ô3>œ]¸=5±P>ð2> Y­=7qB>¯)>•Ù¶=2‘R>kd'>Õ²=NÑQ>¾™(>’²=2‘R>~¡'>žU«=S±Q>Wå">½®=,aM>á°$>™ý«=3ÁP>| &>›eµ=OP>kd'>Õ²=NÑQ>(>›±¸=.áP>¢²1>œ•³=U¡Q>T7>˜ýµ=0ñg>M>”Ͷ=qh>ÃB=„V–’¹˜=;q)>WÌ8>’¹˜=;q)>¦ë9>”©˜=AA)>`>.g =E‚é=V ª>§AQ?Óùð>±?¡×S?h0<‰ë@?L(?Âõ<¶-^?H>Ⱦܛo?Bî=Dª¾w»>?Ý`(½Qk*¿r§×ùk?•Iž,a-½5™?r¥6¿tE¹>-]?”kJ¿ëà>-]?”kJ¿ëà>åÕu?±‹¾&âm=`/¿Š9È><Ÿ?%Y—¾Ð)h?0¹™>D¿!;?6å’>Ë¿©iS?â!L½¡–¾ç§t?»€<¦ ×¾½ÿ_?ïqv¾z«>¿LQ"?ÇÙT¾D¿!;?6å’>à÷s¿÷Ý`/¿Š9È><Ÿ?È—`¿TÉ ¾Ð)è>Íub¿ñý½Ç-æ>Ë¿©iS?â!L½ëoq¿P5ª>R :ñEw¿ðø>å d>Ü)q¿ç¨>0ž>À¯]¿bò½ýÁø>Åãb¿Oy4>ÀAÛ>z«>¿LQ"?ÇÙT¾°s[¿ý…þ>üP ¾ÝAl¿} Å>ŸK¼ßm¿ƒù»>‘¯=Ù]h¿{Ù¾>“QE>¸?_¿û=ù>sK=· ¿œ‰M?Ïu>| =¿²ñà>í?:Ï¿Oå$?çáô>g4¿æél>V,?9) ¿äÙí>Ho ?Lk'¿=†sA?II'¿-‡>g™5?Q%¿xñ¾½‹3B?eS.¿Á>rý7?`;,¿~á5¾nÛ7?t#8¿ºâ=`‘/?gÑ/¿ÀYj¾[™0?y:¿ Qž=U¿.?nß3¿»ñ^¾Uk-?iQ7¿©1á=is0?{=¿K9>Jë'?wŸ?¿U¡=X)?N·$¿9 ¾„Ù@?(¿9¾oC?4+¿l•°¾~Å:?:u¿ˆÕǾ__/?4׿ÌEì¾Q'?.=¿ q¿Lá!?B“$¿‘)ǾOé(?1C¿ùJ¿E×!?HÃ!¿0ž¾eß5?i ¿{Á¾‚Ç??‡ ¿‡¥É¾€»o‚ï<Úqk¿ƒiÈ>PáH=çUq¿`å¨>g6>ñ¡t¿ï9p>†>ëWr¿k)@>qY½>Ó…l¿l!È=‰>Ý?r¿m”>m¡½ØEi¿—Ï>ºR¾±MZ¿õÕõ>›uƾeã5¿2W?½ ¿5¿Hm&?°¦;ßOm¿rù¿>s;¾ºK^¿èùë>E¡¥¾”iH¿ ?“¿&«¿9?ò˜¾Ê7c¿ÁÅâ>m޾œ5P¿ÿÎ?äeõ¾AŸ$¿.å?Òi¾²×W¿äiù>²ÙÙ¾i§2¿ }?"ã¿{ ¿C7?G«"¿Êâ¾Hý!?yy>¿ßÁï½Ic(?{B¿S‘Š=P%?v>¿Qù§>)y?tï5¿§ÉÌ> '?Qù'¿= ?õ?Ž=þw<¿©? »¿<3¿*S?:!¿ôÝõ¾=?„c>¿KÉ2¾D1%?’?H¿ÒY>/÷?xÕ;¿ÿÐ?عé>Kç'¿"?ëáû>> ¿TW*?£åÐ>t =¿`!3¾F³&?œMK¿ˆñÚ=-#?š•M¿\U¶>ò™ô>d=5¿Ii"?9Ñž>MÙ)¿YÝ.?DMœ>%A¿•aL?¨9Y>„C¿Ü€Ï¼D¥%?¤9N¿³y\>M ?{»=¿™?…Ѽ>3Q¿|+B?ði>Í¿œ¥P?Aa >–O¿Nѱ=-í?’±J¿ÉYà>²ÙÙ>J)(¿m:?‡ÁL>Q/,¿fõ6?”iD>M¿Ôaå>ŸqÉ>H£&¿zý9?¤Qa> ÃL¿¤¥Ú>¹á×>–AI¿9™?ޱ³=×Ko¿?É>é4>Õ!k¿W±¨>ÝÑ_¾ö}|¿^ñ´= ™¾è3t¿žAC=*­—¾ö{z¿nÁ2¾Ÿqá½ñƒ{¿DQ0¾¡‘½Õj¿}!ľ#i>Ûûp¿CÉœ¾ ù>L¿ñ¿:¡>š¿›®¼§AQ=ëÇr¿.唾ùh>©X¿Áqá¾H©œ>~9C¿âéí¾À]æ>p?4¿+ÿ’éÐ>S],¿Û¿Í?6[¿<¥¿òA÷>É¿8÷¿µ?'ƒ¿S±)¿ÑÉê>m ¿Z1¿ïY÷>Ù ¿r‰7¿¼=à>èÙô¾ty;¿à-ø>ß¿^ñ,¿ç©ö>D"¿SË&¿±ÝÕ>o×7¿/ù¿~å¹>”MI¿Ý¿S•®>Ø×j¿gѳ¾|¹?>Ð+f¿h=´¾-…>ûs}¿ É ¾á&=õG|¿‘ܽ-A>`¿M1‡=“µ¼ùõ¿îAˆ¼/ù;é+x¿q©:>l!(¾÷­z¿ô¨>9)¾C=!¿Mƒ&¿¤QÙ>;ß¿Q3(¿®)Ø>xí:¿.Y¿x ¶>¦—P¿ýh¿1Í”>Ú‘j¿PQ­¾¦ [>øm|¿ A¾E²=Æ~¿®Á½ïϼý¿z¿BA)>´‘ë½ '¿c{1¿Å=æ>4õ¿]¿,¿À%Ø>t•6¿@k¿]‰¨>¨§S¿Q¿ ±‚>â#n¿U¥¥¾cA1>íGz¿ª)I¾ a˜=û¿ ñ«½~½<}¿9Ñ>÷!o½!“¿g™1¿°UÚ>,E¿h!1¿Ðñá>T7'¿Jï#¿ÙÎ>ñE¿ ¿~Å>Äy`¿Õ¾¾4i›>â[t¿×‰[¾ÅT>ýƒ|¿‰a§½$ >¶¿æ (=X¾<5c¿W'+¿Ð}á> ¿Ug-¿ò}ù>7ß¿3¿k?X.¿¿q?¢—Q¿±¥×¾›ÉÇ>Ø-n¿YA¾@Ý >ãmu¿¹¾™>ûw}¿!޼>QM)¿&m¿ømø>™ƒP¿Um¯¾Ñ­ï>ÜIl¿L‰$¾fù²>ç§p¿šA<¾2“>ù£x¿)Bê<òéq>òíu¿Ù>rÁ™<ØGk¿[a²>n‰<>¹‰^¿†¾¦™Ö>ßÃm¿B{¾5Ž>Ü×q¿èؾ*Éš>ÛÁl¿«yN>G¥>Ã^¿Øaì>Œ5>Ýyj¿)€¾9™ >ØIm¿²X¾HÝž>â“r¿ÁBÝ]k¿>Œ>Å©b¿£YÙ>”ÁA>ªIX¿?¶{=¯ÑV¿ç ?-Ñ™=Ã^¿鉾·)Ö>Ø}k¿–AE¾Xá®>ïUs¿ÉqÇ="ý–>×Qm¿Aa˜>Áqi>ǹe¿«Y×>q>¯µ[¿?–@ =¢·P¿u­µ¾åAê>ÒÃh¿‘™;¾y]¿>ès¿-A>+Ù‘>àõq¿,>u±)>ÜÕk¿’!Ç>>@»™P¿*?»ñî½~ã?¿®)оµ?²½Z¿'i¾êý>âém¿[ÑÆ=mY¶>ð¿y¿‹©D>³ÑÙ=ÞÉk¿g}º>üà ¾‰·B¿<‡?†qG¾L©'¿Ž!À¾Sé'?‘™G¿B±%¾0×?Ôck¿Í!)½Ž!È>þ}¿Ä±Î=b¡–=Æof¿š Î>v‰*¾f…6¿Y‰)?ËÙk¾3¿¯éѾjÙ2?“WG¿]޾ù?׿k¿EÙ+¾\!´>$~¿0¯=DÁ¬=Àéa¿Áä>8i¾b5¿Qg*?ÎÁs¾¿ ¿ q¿M¿(?ˆ×A¿z½¾é ?Ûki¿­¡T¾_]µ>}¿=ñ¼=°ñ=Åÿe¿¿eÞ>܃½¯ÏT¿» ?£±Ö½X7.¿R+?3á—¾¼A\¿å ø>NÑ!¾nO4¿.? ÝɾÀë_¿®EÛ>Î9h¾ññ¾· ¿fÙ/?d­5¿Žuɾ-—?ÈÓb¿’±J¾¶Ö>öay¿Ïe=³ `>ê w¿(a>éah>èOw¿!>Ò©[>ü|¿ªÆ=HÁ>ùÙ|¿Ôaå=|ÑÞ=´“Y¿„K¾òéù>©ÝW¿¾Ùf¾öÑù>½[¿ jx¾ÔÑé>¼^¿޾£•Ó>¹q[¿•€¾Ø)æ>ÓÛk¿\q±>SY4>›©L¿ Bü½4?ŸYN¿¸•Þ>š•Í>QO+¿–Aµ<}#>?„)B¿Ë?›UÇ><ù ¿ )>ÏC?Vó,¿ ÝѾ7ß?bM1¿­Q×¾.?o»4¿¥½Ù¾#÷?e¥1¿©1Ù¾$ï?M&¿…•ʾQg&?7Á¿> œ¾|Õ>?¹¿çqh¾ž S?áñõ¾oĽÃ-_?‘µÎ¾õ€¾¾a?¤9Ò¾+¿¿g0?¿µÛ¾?s¿Ig(?Úáç¾C ¿?5"?áAë¾(¹¿Z×,?ËMì¾èÝ𾇇@?%‘½n‡6¿ji2?lAϽƒA¿E&?(™ ¾’ëF¿BA?hé*¾{=¿T7'?–ÑH¾Ug)¿l?9?Ž±Ë¾©Ë¾©£S?Æùk¾ß ¿–!N?½¾•¹Ñ¾Ãƒ^?ù޾¡¾Ïóc?iýµ¾:=—¾Àc?Y1>‰µ@¿Bí#?ßÁÏ= §M¿&7?öð…=¢CT¿?,‚ÿ<®ÙR¿õ?>j¼• G¿>í ?Èap½Zg0¿yç8?óá½$¿šÏM?Ñ5¾çý÷¾¶K[?wÙ?>›J¿/Á?+i>¢ER¿' ?ñ>·AY¿/?šAÜ=¶Ù\¿ôýü>ÒqÕ= kS¿#Û ?M1Ç=”ÛF¿AG?Á­=g5¿a3?|ar=?‹!¿ŠF? e>/N¿= ?2’>™ÙO¿]?Fµ >µOW¿¾‰á>qå´>¦_V¿®Õ>–yË>ž?M¿Â…ä> QÒ>’•K¿ÌEä>§éÓ>‡ùB¿òAÿ>eÆ>qË;¿%é?uç9?8÷¿½’>YQ/?K&¿R¹©>„EE?4¿›>>žAK?*ã¿ôÀ>ž±O?%!¿îAH=÷B?Mi%¿†K=O}—:?W•-¿LáÁ=ÿ]{?P/¾|ñ¥½ãßs?¼É_¾¡X¾ãqm?(I—¾ãQj¾Ä?`?Ou¨¾m‘´¾¼y^?w…¾¾XᦾÃ`?€ÕÁ¾2u—¾¾Ka?uu·¾AŸ¾tµ=?S{%¿pÑ9> a…>v>¿=e?yY3>fŸ3¿\Ë0?û¾7û¿Ž!H?Ý™i¾9_ ¿†Ë>?#ó¿§!Ò¾nû6?·]à¾÷ ¿nÝ5?vý6¿d!ª¾Aƒ?#ó¿§!Ò¾nû6?zã8¿ŒIO¾QM)?_ï2¿2韾O¯$?‚?¿é™n¾C?â!t?˜1å½¾“K?õü¾Y¥´>|Ñ>>GW%¿{…=?4Ù¾(¿¦'P?ðà'½˜Ý˾Зj?yƒ¾íö¾©…V?ÿ@ >὎}?l!½Lq%¾ö}|?>~9Ã>Ïij?¾ÙÞ¾A+>Äwb?ðÀ€½{??V™)?þ›?‘¼HÁS½¥ƒU?2Yœ¾â9ë>ˆ> Á¿KQ?=Ež>ä1c¾Ü½l?|ñÅ>t™:>Òog?½Î>õÕý>ÓD?÷¯|?:!$>>À:è¡r?Z!>é>d•2?P96¾e©1?vù>?y>/k?ÛÛi?{Á>9)>dç5?Ý?ç‰÷>%Õ¼0õ¿›åJ?1’¾Í­à¾°Z?æ]í¾y‰¾·'X?"©¿A ¾£‘O?W¿G"½¡ÛS?Ý%ñ¾Îÿ+¼ÄÍa?1]¿ì¡ý=žAK?<£¿g)9>‡QD?k·9¿ª}Ò>M ?fÙ«¾ëú¾¢ N?o¿c™¶¾‹kD?N{&¿æyp¾oñ8?eû0¿¿Ñνp%7?fù6¿•=f2?QF¿l±»>å?~<¿T+?Èað=n1;¿8¡ ¾Rï)?‘cG¿Ÿ =;S ?¶W¿!u‹>Ñ!ð>¦ U¿K?N™+>K)¿}u=?&á¾DO¿ãC?m97¾ž?Q¿º¡i½+Á?Åãb¿Oy4>ÀAÛ>Àë_¿~Ä>- ˜>¸?_¿û=ù>sK=}A;¿Pß*?¾V++¿iã4?¼!m¾Ù]h¿{Ù¾>“QE>°s[¿ý…þ>üP ¾V++¿iã4?¼!m¾†ÇB¿2û>±mÙ>[•0¿yW9?yL».q¿ŒI?µW¾_a-¿wM¿P%?Tá/¾¬©T¿Fþ>ñ¸€¾jÛ0¿q5?9™¾mY2¿;?ŽuÁ¾c 1¿fݯ>H§"?4Õ“¾Ñg?M¡£>5 ¢¾jm2?N·$?¾ÙÞ¾A+>Äwb?¥Ͼ8ù•¾½Ç]? m¿ä-ï¾kÕ6?™Eо1E¿h4?¸ÍÔ¾.¿cÓ2?¸ÍÔ¾.¿cÓ2?¸ÍÔ¾.¿cÓ2?·]à¾÷ ¿nÝ5?^i-¿Ëæ¾%ë?vý6¿d!ª¾Aƒ?^i-¿Ëæ¾%ë?l%4¿ý̾-A?_ï2¿2韾O¯$?†U@¿.9ž¾1E?‚?¿é™n¾C?l%4¿ý̾-A?iI¿9a¢¾?^i-¿Ëæ¾%ë? m¿ä-ï¾kÕ6?™cM¿ñ¾ S?¥Ͼ8ù•¾½Ç]?¾ÙÞ¾A+>Äwb?óy¿§Aa>U1•½ª?!N½iÚ;¸;[?ü÷¾uY<>mÉ>šïH¿àõ># ?HS%¿ ?? ¢~>r‰7¿N¹&?y‰>K¯!¿{/:?pé(>lw3¿g™1?ÿ@ >[Ï,¿s¹9?DQ ½cC/¿sƒ9?d±Í½U‡,¿y];?ž±Ï¾&Ç¿u7?±ؾÇ ¿x8?Vƒ,¿–±É¾? ?ãûn¿ý†>ªx¾~}¿ýÀ=-Ñ ¾ô~¿ô½V‚żÓ3m¿}>%!‘¾ïUw¿=‚[=ò$¾ô|¿c¼i1¾Ó¿h¿k1>ŽéÁ¾ô5{¿&á¢=ty3¾¹‹`¿ý¤‚>ªIоèMu¿‹Q·=‹¾­kX¿“>Æ5æ¾ö)¿81¤½u¼ÿ]?÷Ý<逄=û‘~?–A5½ÃÄ=Ãd? ̾őW>•ŸL?}!ľÑí>k?c ¿V×)?g¹4?fM´¾@M?ýØ?`¸¾™)I? ?NÑ!¾¨R?K±«>¡¡ß=ß‹o?ºâ=Üê>¼Ëa?7Å›¾ly5?Gå"?ºâ=Üê>¼Ëa?7Å›¾ly5?Gå"? S¿—ÉH?_™¯>Fë ¿tï9?(aŽ> ú{>ã¿¡óN?½’>7©˜¾Ïi?.;1A¼ô?¨á[¾ ›?¤SS?X9¬¾PQ5>ÚÅl? ¿PQ­>Š!I?šÿ¾h!¡½´å\?Bé¿`!3½‰—G?+ ¿"Á”¾“áH?N{&¿Lq5¾z=?? ¿ZE¯¾Š¯B?‘¼<Ûýê¾Ä[c?ÌyV¾+Mš¾Ù!n?nù°¾¯±K¾ÓÁj?¨5Õ¾am¬¾¶/X?ܽì¾Â¡ß¾ƒ‡E?¿×‰ã¾y[9?>?¿›Í¾[Í.?4Õ¿ ÿ;§?:¯¿…¿§ ?«Ñ˽<Ù¿ŽëG?£y`¾âý¾µW?4M˜¾£Yɾĵ^?¶¹Ù¾Ë…⾎J?¯ ¿ä½ò¾e0?XÅ+¿›Ѿ8i?õ€¾Z)¿mý4?Xɧ¾G ¿„¹E?ͱä¾ÕYå¾’AF?,»¿Â¡ç¾K¯)?a34¿º1Õ¾'M?”3H¿|Ѷ¾ Á?Q1¾Q…+¿vß9?B!‚=K­#¿…'D?9 ¿1E¿Ó ?KY&¿í ¿?1—¿2å¿C?FÏ!¿*¿õ?#K¿Ké%¿C? ÷¿H%¿#¡ ?ï¿__+¿É ?g¿UK*¿• ?÷9þ¾]m-¿ë ? W¿]Å*¿G ?ÿ•ý¾_2¿G? ¯¿CY$¿Ù ?³¿`-¿ _?]§-¿àõñ¾%?8ó¿é}û¾5]? ñ¿% ¿JC!?_¿F ¿*Ç?&¿'¿¿.q?,¿îAð¾X­(?H7"¿àu¾~Se‰6?S±-¿(e’¾T9-?Ð? À¼WB÷<÷Y}?I¾ôÀ‡½üSz?Èað½\q1>¡¹N?a¾&m?LÝ%?–y;¾|G=? =è¡î>ÅÅa?ÊýÞ>–Ñè=È—d? =è¡î>ÅÅa?ë¿—«G?#½>™¾C9%?d­5?†ý>&á’>žíQ?Õyh?M¡3>“©Â>Ja"¿>ç"?»¹à>Qi(¿¤Ë>I½#?V,¿?èû>]Á*¿4Ù>x}:?qÿ5¿ŠÍ¿>)[?f¿2¿Œ‚``É1?V·.¿K‘,¾o6?}w;¿Xqʽ_y,?\*¿ížK=#?GË%¿O!§¾`?0?;¿Çë¾Kw#?:É¿-y¿¿ ?Y¥(¿ë­ù¾¥?Ic$¿*7¿ïåþ>K#"¿S ¿"Ç?g¿_a-¿ï?ßmî¾Rñ+¿(?ïqv¾¡÷N¿{ ?S¿7Ç¿¿ ?! ¿LÇ(¿?$Õ¿W?*¿ëáû>P‰£¾¢µR¿èið>‘¾§yS¿åaù>$¦½Õ h¿­5Ô>NBi½Ì³f¿ÆùÛ>ºÖ½Èïa¿Õ±ê>?q€½ËŸc¿Õ è>]4¾°WT¿µ?ò±û½¬oT¿U ?2𽥿S¿± ?h±”½‹5H¿?o?}A«½J¿3§?0“¾ª V¿íõî>ÐÑʽËf¿ÄµÚ>1 ¾¿I_¿éÕð>¢ÑM¾£‘S¿¡?¹¾¥MU¿ ?\E½ºe[¿ S?5ѧ½²óZ¿ ÷?6‘™½¿›^¿ãÝù>Y¾ÂK`¿Ì]ë>ò±Û½Ã›e¿²¡Û>’󽾇_¿ßýñ>±¾µýW¿#?™)M¾ N¿$í?l!(¾¥ƒQ¿õ ?SBp½±X¿ q?èÀò¼¿¹_¿éaø>†K½É9a¿Þò>rý»;Õj¿”…Ï>€4¾£¯P¿C ?¶[¾’ËG¿2W?™ ¾›M¿1A?\‘(¾¨ÇV¿ Ã?¿ab¾•cJ¿'/?€™O¾¦µQ¿W ?¼!í½¹‰Z¿ýú?‡1©½Ô f¿¯™Ü>μۥi¿§ÍÐ>˜ÁX½Çcb¿âuí>@Á¥½µ§\¿?V¹ ¾¯µS¿1 ?´!¿½¬ãT¿% ?i©<¾£T¿{?Þ°=½a¿ì1ñ>,a-½Íéb¿çì>%±¾¾¿a¿Ú­å>©Á´½Ð_d¿¾Ýâ>ë྽o\¿:ü>èip¾œOQ¿‘?Ùég¾§éS¿e?.â{½Íwd¿ÙÍä>Ü¡á=ÞYk¿YÁ>taÄ=ß5l¿%¿>úñ÷=Þsl¿„)º>ÈAé=Õn¿_)³>%A¾È?c¿É­á>ͱü½Æ‡a¿ÓÙé>W 6¾½§Z¿ø5ú>ø¤ƒ¾¨5Q¿?2t¾¡GT¿g?`!3½Éçe¿²à>ݱx¾¥-R¿A?’±J¾§yW¿ÿ–?ßÀä¼Öi¿¬Ñ>âu=ßmr¿G¡>`±Æ=áyq¿S‘¢>=‚[=ïÉs¿.É™>¥À=ßOq¿Tª>u¯<ëSr¿F±¤>yö<ê‘r¿Há¢>*œ;à×p¿Y…­>Èa0=âåq¿C¦>œÁß<â#n¿iU»>^i9¾¬åV¿+?4¹¾¹3_¿âÉî>( ½ân¿rá¸>£’;âÍr¿@1¢>×À=íIt¿#Ý—>Ž=åEr¿WA¤>lBÚ<ß7r¿G¥>#I¾½§^¿Úò>wÒ½ÌAh¿¨ÅÐ>jÁK½ßo¿f-µ>‚c¼ãão¿t™²>HÁ=Ý%q¿JѪ>ö@«¼à»m¿‰™½>i=äMn¿h º>©Àɼ߿m¿ni½> BÜ<ær¿>=¦>œý»î's¿L >Br=ëqw¿J>Ë =æ=v¿¡Š>ÈAé½Ô h¿®)Ð>‘¯½Ùyk¿“ýÃ>QÁ¡½Õn¿¸>>À:çÇs¿FEœ>[Ѧ=ô5w¿öy|>%A8=ïÇu¿M>ÐñÑ=çsv¿)€>‘…=é™r¿?ýŸ>sÙ(>à½s¿Áƒ>üp>äón¿M¬>Ïiv>Ûßm¿-•>)Y>Í!i¿‘)Ç>¡¡ß½Ù?k¿ŠÂ>ë½áar¿EÙ£>Åt¼ä‡r¿:­£>?”¼Ú7k¿¢ÕÉ> ‚G=Ù!j¿…Í>]½À³a¿çýï>¶€P<Ðïc¿Óùè>“q̽¿™`¿ÝEð>Ja^½Ñ¯e¿¹Uà>u!¶½ÖÉm¿n¸>¾¡p½Ó¿l¿ƒiÀ>'‰¾»ñ^¿îAð>¿)\¾¥»S¿ ñ?By¾Âkc¿¼!Ý>Œ9¾Ãd¿—qÓ>ÍÉ[¾º¿^¿Ä!ã>^<¾Ã·`¿Ì}â>>•£¾Ÿ[L¿¯?$ñ’¾¤ýS¿ì‰ö>¼Aä¾u“8¿ Ë?°ÅÖ¾…±A¿c?2‘¿8÷¿ ™?!¿Nï&¿/?Œ-D¿Îáâ¾ê%î>y@¿œÅÓ¾?rO7¿ñÕ¾!?+¿,-¿ù ?æéì¾dé3¿S ?[}µ¾’=J¿ ?1µ•¾¨ÃV¿Ûýê>:±—¾¡iQ¿éeü>y‚¾©gU¿Þú>}%À¾~q=¿&á?M‡"¿øýû¾6s?ý¿D¿"¿!=?£uÔ¾!?¿?̵à¾m©3¿¡?‰a¿¾{Á?¿ ?Þò¾Oy(¿%?ìùú¾NC$¿2?g¿#I¿µÁY¿:!4½!?Öÿi¿ˆ.½š}Î>»G^¿[Ñ6>åñì>æ¯t¿ÑÅ=!Ž>ÌCb¿Éé[¾˜½Ô>ð¿u¿©¾å™w>zÇ9¿Âà¾å?¶÷]¿[A³¾]mµ>^g/¿Vþ¾]?1ë¿6¿S ?*W¿-™¿&U?ÿ±ø¾`Y-¿} ?õIþ¾OÍ)¿'M?¾Á×¾j18¿M ?Ðñé¾l{7¿Ù?u‘¾cD¿ K?ªÑ¾‡¿B¿ë?(¹“¾™IP¿ 3?5µ”¾¢ N¿{?tA-¾¨WV¿ ?¥€¾¥Q¿û?81$¾¬Y¿þH? ¿<Ý¿ ñ?á)ô¾m©7¿üþ?… þ)D¿s?L¥Ÿ¾œÅK¿Í?‹¾¡S¿ö ü>§yG¾¬ÿW¿?Q¾¶eX¿ Ã?#ù ¾¯'Z¿û\?ɾµ[¿ý.?‰à¾}y=¿}?jõµ¾¡KP¿×‰ë>ö$€¾¶÷Y¿Çñë>´‘K¾·'\¿à¡ð>=a)¾Á­_¿Ù%ê>!¾¸é[¿èùû>©ÁÔ½±Z¿ c?:"ÿ½²ƒZ¿}?H‰¥¾£•S¿Ùíë>ãÁf¾Áb¿˜‰Ò>ñ¾Íg¿œ‰Ñ>·Aͽ˅f¿¾¡Ø>€Խʣg¿ªeÓ>0bÿ½Ãgc¿ÔEâ>ß1ü½ÅWc¿ÓÁâ>çqؽÆÃ_¿ä½ò>Á9S¾ÆQa¿®ÙÚ>¢õ½Ü×i¿ƒÇ>,T½Üƒl¿wÂ>9ñ•½Ñ!l¿†!Â>ÈAé½Ôf¿¶ÙØ>lÑ2¾Ãïb¿ªeÛ>5 ¿/¥? £?Ö9æ¾6?Hû'?Ja"¿>ç"?»¹à>­‰U¿éñk>E?2é=ÚÉh¿¤áÌ>@mœ>Ͻg¿>%—>8…•>ÓKl¿1€>Þé>¾a¿9¹>‰à>Ãd¿ŒÕ=9c?Ž#J¿Bk½¹ ?«yV¿Œ‚`<}?=?W“'¿QÁ!¾N™#?±B¿ÐÑ꽑aI?'Á¿Yƒ¾e3?Wy.¿£é\¾›«J?» ¿eˆ¾„·??DO"¿sIE¾æ ˆ=àÙn¿[ µ>Ô)_>ìÛq¿ú™z>i5´>×ml¿)±>Èyß>Îýe¿ÔaE=_ ?®EW¿á`½=¹"?…yC¿¤qè½eã1?s¹5¿Â1ë½?ºÝ[¿Áþë;=ï?SH¿NA>½],?rm<¿4¢½ }?­mZ¿!ƒ=E)!?–ÏF¿êAÁ¼Ió'?|_@¿ý Ž½š[I?/1¿u9E¾yé>?J#¿h B¾½©`?>í ¾ƒQ¹¾¨ÇV?´‘Ó¾d=µ¾ªa×>Ï»e¿ >)¯?ŸYR¿è‚ú¼0Ÿ?ž{O¿iQŸ½YM+?kI7¿Œ¹K¾ D?A¿O=¢¾M>éµq¿QÁ1>ÖÉé>Ç»c¿ˆ.¼ ­?´ãZ¿[aº½›?«YW¿™Þ½óü>¹OZ¿e2¾ ?¤QQ¿ŠéB¾½Qã>¶¹]¿Ék¾'ƒ?‚;D¿&‘¾'K¿L5#¿[?2¿F%!¿ ?»¿Wí*¿ © ?/o¿H%¿Þ=ð>#¿Ae$¿ ?ú ÿ¾[ë+¿i ?ê]ü¾W±,¿« ?ìö¾dÉ0¿Y ?íú¾b/0¿S ?Îáê¾w8¿¥?¨©Í¾€óB¿3?Ž­¿¾ŠWE¿ë?킾§ÉT¿í¹ü>ûX¿^ñ,¿s ?Ôeñ¾rá4¿?á í¾q7¿ ÿ?Àéå¾w9¿©?}±¿¾Œ÷C¿ó?ß ¿aÅ-¿÷éø>òyõ¾rù7¿ë?Úqë¾m;9¿Å?ÚYì¾jk8¿?ÚUè¾qÿ9¿?‹ùɾ_C¿?7á¿G‘%¿ºõâ>ó ¿f¿6¿¹‰â>áµó¾wƒ<¿ê%ö>ٵ往›=¿û?Ü)í¾u:¿ý¼?è-î¾y¯:¿ût?2¿Tã-¿¯µÏ>k ¿zá:¿°Ø>åañ¾wõ>¿×Ùð>Ï1è¾~«=¿í™ý>æÍñ¾y:¿jÿ>æåð¾sc:¿ó9ÿ>7¿\;1¿¢]Í>æ]í¾€×;¿öAþ>Šù¾f½4¿…?eá+¾À¯]¿í)ñ>õ¾®ƒS¿øUù>•ñ?¾Âi]¿Ðaî>NÕ­¾ŽwG¿ ß?ès¾°WT¿ m?•™Â¾‡Ý?¿à ?ýÀ…¾™×I¿‹?pµ¾¾=B¿É?ÀAk¾£=N¿Ç ?yÍþF¿;?f®¾‘+I¿=?M¿W_)¿'?=¹¾¸­]¿í¹ô>é¾À a¿Öç>Hù)¾º÷`¿Ð å>¨R¾­…U¿?» n¾’?H¿0õ?1 ¾ºÝ_¿Ñ‘ì>N ¾¼±\¿ö ø>h±4¾±QZ¿õ¡û>€™?¾´ÇW¿%?I޽_¿û!ö>¦ Ï>ÓÝe¿NÑ1>9aš>àMo¿Ž!@>º-á>É“d¿qÅ=Vñ®>ãûn¿ãáÝ=É­é>À±c¿±ÁÂåïn¿2j=¾M×>Ð)h¿ŽÙ¼bi°>æ?p¿–Aµ<›‘É>Ò9k¿AÒ¼{Ù¶>Öo¿‚<½U×>Ëh¿u!½lÍ®>å}p¿DÂ÷<•Ë>Õçj¿]ú»Ÿ ?®U¿¹à =m?£WS¿Ô,¼« ?ª›S¿ãqѽñÕö>µû]¿ ¾ò%ô>Àë_¿ A±½ Å?ªaW¿’ú½q?ºZ¿€Ô½6s?íE¿H‰-¾2?€µB¿ÑéY¾^½2?Hù!¿du«¾)Ï?”‡I¿ÞY{¾('?ŒG¿À±g¾hy2??ý¿gѳ¾qU5? ¿µÁá¾c'0?+¿Òqå¾Z1?l•¸¾81 ¿['.?6W¿¼=ؾ3‰?„IÁ¾jÁ3¿Cu#?O#)¿ˆʾQõ+?Yý©¾Q‡)¿0»?lé5¿mý´¾rá4? †¾MK(¿Wí.?O•#¿cÑ´¾a1?:[ ¿sñ·¾dW.?N¹&¿XY«¾H#?x{8¿Œ¾M¿$?`;0¿ZI«¾I¹#?„Ó>¿bi@¾w½¿¸!F½w ?§?S¿I >$E?¨ÿP¿ëà>Ñ?©ŸS¿‹áJ>c?°WX¿ÁÎ=o?¬Z¿© >­§V?;¿Á¾œÅO?µ ¿v‰J¾mE?9 ¿Úá_¾~>?P©*¿0¡‚½l%4?mW4¿‡Á¼½Ž•È>¹ÿX¿q!·> ½? 7M¿&‘>ï?¨áW¿rù?>&‹?£?P¿S!>-?¦)V¿s;>>"?”1F¿3úQ;L5'?{/:¿À±W>mY2?f¡5¿“áØ=“SG?0ƒ¿™)=>¥iÐ>ÅSc¿É[>,ñ>Ýël¿vݳ>øÿ>²Z¿U1%>M?Ÿ;Q¿”¡Ê=FC"?nû6¿8M—>Z-0?K)¿7ý™>l%8?%Í¿”½Å>¡»T?± ¿^¡¯=yë8?\ÿ.¿ÄÑÕ=Ž#F?Hý!¿–Aµ<•I?;q¿{¡@½R·+?j18¿)8>V.?D‡$¿e³>½J?å ¿-%“>p6? ¿Àéå>¥C?» ¿gÕ¯>Á«]?í)ù¾Øaì=¼=\?¿Á=¿Ga?ç9ò¾º¡)=~B? í¿~½>–ËN?íñò¾c ³>„ C?åµê¾Ö5ê>ÕËk?b1ª¾¦O>Ñ;e?‚‘¿¾Üñv>í»z?9ñ•=„a@>õ½~?’‘³½Ü:=†ÇF?-¿b³>š]O?à-ø¾_í¨>”3H? i¿t™º>y‘=?ì¡õ¾åíð>§S?M¬¾É9é>‚ÿA?2­¿öÔ‚>¾÷_?ÎÁë¾™>Ïe?°YÞ¾¸‘Ò=·}[?ÿ"¿%õ=µ5^?êý¾¿¼Q?){¿4¡ ½À]^?Á©ç¾¤©N¾©½T?úµõ¾ í¾­…Y? ‚G¼ ï¿’M?8=4¹¿¹ûX?›¿ÓÁú<É!f?²ß¾-A½Àí]?å™÷¾Ú÷½±\?s¿e“½Âù\?Îé¾Ñy]¾±‹V?‹Á½k ¿£R?4€7¼"S¿vq;?Z+.¿aÁýÀ±_¿õ¹j>ËÕß>Ça¿eB>b1:>Í;f¿’‘Ë>y!=>Óƒf¿š™É>ÄAâ=Â¥c¿ÀAã>rþ=Æm`¿áñí>åAz>Ͻc¿{…Å>U„>À³a¿–%Ê>{¹>ÅËc¿$Ž>õ‚>Ã}d¿u!¾>Åt<¤ÇO¿1{?¨QH>´­Z¿ùö>Æá\>¯™T¿ÿx?Ìyæ>½«Z¿5…>Üñv>Š9D¿9_?Û…î>eN¿‚­º>QùŸ>X/¿V¹(? ?pC8¿¼!Ý>#I˜>8ƒ¿w-9?)??Rc*¿ì‰î>*»k·9¿b/0?’!=cµ1¿o8?ú(>K ¿¢ïR?*¼s…;¿W?.?K‘>Sw%¿y]??HQ§=—9;՗i?O±Š=û"¿À[\?2½z½¾Ö‹m?ɑν­¿¸ÉX?:s¾ÿév¾çáp?á•ô¾Ì ⾂oB?(›¿²‚ß¼¤ãN?¤ÿU¿Mƒ"<w ?uÇ6¿¹>H'?¹ÿX¿6•>É=Ý>Ãñܽ8¡¾òë{?F™¾¶;½éGs?•ñϾ™aÃ=Î¥h?=¿úat>£!S?h±D¾ú)~>às?Q=.9>ý-}?€I:>a᤽øßz?Øa\>‡Q@¾ïSu?f»èùs¾ñx?²ŸY?¬áâ½ Ë?´Y?%!‘¾¼!å>¡iM?̾¼Yã>›N>µˆ¾áCq?ÿ@?Pq$¿-™?úA]= ¿½áZ?}é½>Ž;I¿î%ý>Ò§e?Âiá¾ka=¥iT?Ü)í¾4eŸ>zÃ=?/Q¿F ª>>"?të5¿AE>/Ã?__3¿Ž=Ë> ?’F¿†U¼>Ãã>”mL¿œÁÏ>äl>’#M¿O ?²ÙÙ>¶gZ¿4š>öµö>¶×V¿øü€>4¡™>ÁW`¿ráÀ>JA§>½û_¿eý¶>¼uÞ>¸Y\¿¹‡>‚åÀ>ÎÅc¿íƒ>’éÀ>¹‹`¿/m˜>C­™>ÌCb¿n¥·>¡H>»`¿¾iâ>ÄyX>Ã}`¿±ýÜ>ÑAw>Æ‹a¿¬9Ð>ö)w>Æá`¿´Ó>–éÏ>¾M_¿"m‹>|)Ä>»™a¿¥>‚‘¿>¼Wa¿,a•>9“>Ãd¿rÁ±>ǹ]>ÊÅ`¿©…Ú>…é;>Ïùe¿˜QÌ>ì¡}>Ƈe¿…é»>‚ɽ>Çgb¿#1‘>¨áË>¶¹]¿0¡š>ŠÉË>½Ç]¿%uš>µáØ>³·X¿;¥>ZÕª>»™]¿r¿>YQ«>±ß[¿š}Æ>Re >»G^¿“åÄ>°ÉÚ>Ã^¿ ¢~>Öqì>´q\¿—©Y>ÃÜ>Ç»_¿Ð)h>±QÞ>ÅWc¿8i>%Š>ßQo¿ºIl>j¡¼>×÷i¿Q1.>ŽÉ>Ógg¿F™->¢ÕÉ>Íf¿j‰E>ܽì>ÁÅ^¿X.>mž>¿×\¿Q¯>K?©‡T¿«ÑK>»™Ù>º¡Y¿-!Ÿ>º¡á>º/_¿ÐÑZ>ŽÍ>¿Ñb¿ô1o>î=ô>³?\¿{Á7>v©¹>×3l¿>=Æ>Öi¿ù>ŠéÊ>Ê‹h¿%A>µß>Ãd¿ ²å=ïÉó>ºe_¿§±Ý=ó ?§U¿(a>c ?ªGR¿?q >“UÁ>Íi¿GÉ+>ÝÅ>ÌEh¿=a)>ªa×>ße¿#ù >Çñã>Ë/c¿ô=Ö5ò>È'`¿‰aÇ=¡?¿×\¿Âj=)#?ŸN¿‰Ñ³½AI!?Ž#F¿Ô€½^0?_A.¿¾”½Å>Ôñh¿.©>ÂÝÙ>Ë×e¿÷è=ß5è>Éqc¿ï= æÿ>À³]¿G¼¦ Ï>Óùh¿@Q¹=Ãeå>ÈÑd¿²€‰<á}õ>ÄC`¿”ÁQ½/ ?+R¿Yi2¾3?¥iP¿Aa¾="?q­:¿Ù‚¾ƒÁ½>Ù³k¿³Ñù=ÁUÞ>È•f¿æ< ?®óW¿Q ¾9G?~;=¿!=¾eo1?f½0¿À!T¾à¡h=ä‡n¿p•·>G!I=åCp¿iå®>”1¾=éÑt¿Ù>†q·=ëUx¿· g>}‘0>ì¥y¿3>™ >ú%z¿0I%>Ûv>ô1w¿Õ±Ê=±>>îx¿Vñ&>-…>ò u¿>ʉf>ë9u¿P96>ä1ã=ùŸx¿·ñW>E¡>ðMw¿¥1Z>Ü)m>Ní(¿fù6?!»>„eD¿ ï?R³½M*¿‚>?zý¹>‘cG¿á?Ä@½6u¿–íK?à¹w>eÃ2¿`u,?¡½=¿ŽËH?…]Ä>må9¿,?pA¶¼Z+.¿{‡;?2š>%H¿Ç ?áaZ={-<¿\-?ka–=EC¿Ou$?¸=Ù¾ˆÙþ R?©Mܾ`!«¾­§V?¿¶õÓ¾zQ??˜iK¿q>2é?¥ÙT¿ÐÑÊ=ó ?¹ÅX¿€ È>d͸>•M¿ÔEê>‹ÁÃ>’éL¿e9)>(?¡T¿¯!à>iá²>”3L¿é‰>! ?L¿ùiü>Xq²>…H¿¡G>&?ŽÉF¿ m?]¬>‘›E¿‡‰¾>ñ?Ž=K¿ M??U>™õN¿KÍž>ú ?®×X¿Í­è>'>”K¿ÿ@>Ñ ?±£Y¿Õéð>ÔÑq>¯'Z¿¾Ý>(I—>ÿyú¾+½–¾¦)R?î!ù¾Íé⾈¹@?r¥6¿Z¡È½_›1?RÓ&¿ìÁd=£A?²à¾kñ±¾ªIT?á}õ¾‰Ñ³½Æ…_?¼Yc¾œmξÈCc?ÁáU¾Kͦ¾Ý l?'¡´=Úqó¾Ã`?†‘>>$}¿¦CO?Võ²>*Ç¿u?I ¿‹mÂ>{=? Ñ¿ÀíÙ>ËÕg?‘}ȾB™&>ª¹T?ñeú¾µ‡>ž%о… ¿w-=?®Q¾I-(¿qÉ9?c¼<1¿›K?³a]>C¿~7A?ŽuÉ><ù ¿\­+?ñ ?;û¿0ó?{=? Ñ¿ÀíÙ>`-?7Å¿»}Þ>þð“=†sA¿Q¡&?'õ>c'4¿Tq'?õÉ>`å,¿A?ñ ?;û¿0ó?õÉ>`å,¿A?ûÉx>ˆeC¿:??ÓÀ¼–CK¿??ûÉx>ˆeC¿:??{ÁG¾tA9¿Sw)?*ü½V™)¿x%=?íIø>QŸ,¿?íIø>QŸ,¿?›Í>‚=¿‘ ?›Í>‚=¿‘ ?=+?v‹<¿Y‘>Hû#?}?A¿*>}•@?M(¿Za½MF?3Q¿aq(¾»ï`?ÁݾµáP¾¶+X?ßÁç¾’¾œK?%y¿@1">´![?ÿZ¿g¶½œK?%y¿@1">ÓÝi?•ñϾ¾À¬<ÓÝi?•ñϾ¾À¬<Ü-q?O•Ÿ¾Ãñü½ßQk?Ž•È¾-!=êÍp?!¾²¹J¾Ù—h?®IϾwÒ½Æûe?_);¾£u̾=+?v‹<¿Y‘>V*?Gã$¿|™À>V*?Gã$¿|™À>ª¹T?ñeú¾µ‡>¦¹Õ>Ás_¿ U>ñ}>Íub¿MÊ> e>ÌÏi¿Tq£>¶1Ö>Åf¿ >æyø>¹Ç^¿Ž‘¬=˹ì>Â…`¿ q>4?”I¿³ÑÙ=GY?‚çB¿y‘9>;‹?‘™K¿åaa=Ì ê>£a¿’ó=šµÄ>ÀÏ\¿\‘¨>Éqg?ォ Ú¾Þn?¾iZ¾6‘™¾²+]?ßÀä<µ¿²Z?‚ü¼×¿Î3f?`u¬¾Ꮎ̗c? Ù¾!þ·EY?q³¾†˾ª)Q?Á¾ß¿ªGR?Ôl¾{¿¯]V?Ï…á¾B±¥¾¹ÁX?Á‘p¾éeô¾—‹L?#¿äùl>u ?Hù!¿á ?g 4?9{¿Š½>G ?I-(¿ ¥?$_?-µ¿5?—>BA¿qW;? é€>)“¿•»G?n‰´¾œ1Ô¾°ÅV?[Ñ®¾`=¶¾¼¯^?‡F¿Ÿ ½Ec!?›«J¿?‘§=3ý?½qb¿CY¨>O]©>É;g¿T5±>ûÌ>´Y]?¿|a2½u;?,›¿uÍ´>7Á?#׿ µ?}‡>,Õ¿ƒA?v©Á¾e²¾¾ƒ[?¦Q¿øá`=?Ø×n¿ Í>ÀAk>¿c\?¿[B¾¼j3?'M¿š•Í>,õ?.¿µ?-Ž>9µ¿…[>?³±Ò¾ Qʾ£=R?¹‰Z¿ÙA¥¼ 7?çor¿ú €>”1N>»+[?E¿%«»N *?6«¿ñÕ> y??q¿÷ ?iŠ>I#¿lÏ8?îíö¾ï©ô¾sñ;?ÍÉc¿âJ½Þ=è>çûq¿ }ˆ>ž™@>°ÉZ?ç¿q©»CÉ ?TÉ(¿´‘Ó>y ?CÉ ¿; ?ÆQÙ=B뿇£G?%¯¿UÝ«¾we??¼­\¿má9=9?â=s¿ Å…>v.>°­ß¾A)¢¾¶…W?då·>5 ¿kŸ6? A ?JC!¿é ?JA#?;¿ã¥ë>I…%?<ù¿ÚUè>Îmf?¾ݾU¢l=äp?s¹±¾6ñ;Ó-g?î!a½ºÚ¾Õ“i?íÖ<¬ѾF•%?LÝ%¿ŒõÍ>Æm`?îö¾JA·<Ï/f?)¾ª Ö¾±‡Z? Q¿Íí»º^?ñý½ßõ¾· ]?8I¾é÷¾³%[?^¡/¾ý¡ù¾¯[?}‘@¾ïåö¾¯ÑZ?¬‘]¾ð…ñ¾BA>R}+¿t):?À!ܾ5Aœ¾¶ƒY?1™¿,‚½˜iK?’%G¿t™*>7?£±N¿!#=%¯?¾÷[¿ áÍ>Lá¡>Ý?µùW¿caH=`-?u8¿(ѾX;*?{÷;¿$Ñ ¾se()¿Yß(?{=¿!¾n8?Ie&¿Ùy{¾Vñ*?r¿7¿ÙI¾A>?5ñ¿L᡾ŠéB?¹ ¿t)¶¾™P?[í±¾ÓÝí¾ŒIG?Lq5¾:#¿Y1,?ñ>má9¿yÂ>Ûl¿aÁ=Jµ§>âwo¿ >xA´>à¡l¿!‘>:A£>×o¿.Y%>XY«>×Ùl¿r7> MŠ>åÓo¿Úqc>+…>Üñn¿¯Ñb>êyw>ßSq¿¹qk>Í‘>éq¿_™7>›N>å·p¿…Œ>’!G>èõo¿0õ“>ñ¹s>áÏp¿å™w>íˆ>æq¿³ P>a‹>ãUr¿[™0>™>àMs¿A>aQ©>ݱp¿(a¦=9ñ>Ü)q¿F}š>DQ >ëqs¿ ˆ>íao>âYr¿Íéb>k1>îët¿Æ‰o>°ü<ßßp¿Y¥¬>cñ+>ñ»u¿ÆÁe>Ói]>éCw¿+Ù>íŠ>ìßu¿?=3¥>ä÷r¿ !‡=73?w/?¿×‰{¾Ní(?@£ ¿´‘Ó¾V×-?x™¹¾Mg#¿Yß,?Rú¾] ¿7 ?.Y%¾§yS¿4Õ?ãqa¾ŠC¿p_7?g¿ÞÉï¾G‘%?Na%¿¤‰Ï¾N*?&5”¾aý/¿Ã)_?Úqs>½QÛ¾ ÝQ?S±‘½)u¿“QI?L‰4¾7‹¿ÀÏ\?°YN¾Ý•í¾˜‡L? ½¿B•¢¾}uA?3¿Ë¹t¾šëP?s¿¹‡¾Á;]?iɳ¾qu¸¾°;Y?¸Ú¾9™ ¾È a?:Y¢¾r1¶¾­mZ?ªEÔ¾8õ¡¾¯ÍV?ãÝñ¾о›YO?§ ¿â±o¾Âûb?µƒ¾šµÄ¾Ëic?Á‘`¾—ξÅd?b1:¾¤UÕ¾1³?š@‘¼š'K¿W?îx¾µ§X¿*Ç?¡ŸQ¿PáÈ=b¡V½ÌCb¿Ïõí>ù„„¾~9;¿I…!?ÄA¼¸[¿g?ü¼Š?B¿O­&?“QÅ=ŸR¿!?Cá³=d1¿q7?³a]>p'9¿Tå'?léA>TÉ,¿e6?’YÍ>9™ ¿Pß*?º1m>yD¿:?Fþ>og3¿?J}©>ŸM¿ zÿ>:y?d1¿ÝÁ>ޱS¾FÍ¿ƒÝ@?dÉ<¾ Ñ¿œ¿M?.9¾a5.¿s+8?» N¾ƒÃC¿5µ?´q佑EJ¿4G?ö™ó¾Q‡%¿/£?È}ã¾C$¿A»?…'D¿)A¾#?AG¿ŒÅ¾cc.?·}[¿ô¨>þ}þ>ã¿{-À¾m=?Ê÷¾;ý¿FÍ?~s;¿Ó¡ë¾ƒ?„›@¿Åã¾÷éø>Éãe¿ÈAI½ºÙß>Æ3d¿F™¥>F}¢>›O¿aUµ>äð> ÝQ¿e(¼)“?˜H¿³™S¾.­?CW¿­ݾN (?=E"¿9ˆ¾lé9?¥¿~å¹¾’=F? {¿^…¬¾„+@?¹¿­ÁÓ¾•??2u¿È±Ý¾]‡*?g ¿Áè¾fÝ3?%]¿W ¿DÁ ?¿™Ø¾çû¾ C?±mÙ¾‘¿kñ5?¥½Ù¾Î龊=H?ÎÅ߾Ͻホ•D?Z)¿3Ý›¾[µ/?‚C¿`±Æ½EÙ#?›¯J¿–Ñè½+£?µ5Z¿HQ>g?°‘X¿ÖÐ=?НF¿ Ï?5}–>{¿9¿-ë?d±µ>IJ¿Xá6>3?vý6¿üQü>îþ>‡>¿Ÿ?œ5Ð>ˆeG¿ÿ$?rý»>†­E¿+Ù?}>¦)V¿ØaÌ=å ?ƒ…?¿b«>+Á?Br»¿·a¿ß‰ñ>1=•»K¿9›?’!=b÷1¿oÓ7?®ÙZ>Xå*¿l“6?ýØ>> ¿ŽE? y> 5¿˜1M?Na¥= ‡¿°=[?YQ>5޾ÜIp?bõ½³%Ó¾Ë/g?ã‰p¾q¾ð§v?=ƒ¾.¾ÙÍl?N} ¾¥1J¾ÞÇm?ºùV¾‚‘¿¾É;g?31 ¾¦ü¾²×[?u‘¢½g ¿®eV?Ž‘Ì½ZK)¿vO>?á½3ß¿œkL?ÛQü½:y¿›qJ?Y ¾{ ¿¢%S?þ¸ ¾-?¿Ÿ«M?ÿx¾Ñ ¿ kS?—R¼9G¿ŸM?.q$>7ã¿‘F?‹>yç8¿F³"?—qS¾QÛ&¿tÏ:?‰>˜ùN¿-?¶½Ý>O$¿EK"?W{(?Gé&¿ˆ½À>D1!?#A¿†©=>#…’>±5W¿Ýaë>E ?†=E¿â!ì=÷9~>©¥U¿Æû>9c ?ŒKE¿ áí=‰‚>®ÕR¿³?8e?ŠuF¿i9@>e³>‡SF¿Ý?3o?ƒC¿]>M¬>ÁF¿ y?()?…CC¿LÁ¢>²X?÷Éù¾Ãd¾²ƒZ?«íÖ¾Jí¾¢ T?åÕé¾Q1¦¾³E?;q!¿F±œ½†¯C?R %¿S£;u7?Z»-¿Y1,>,)?uÍ8¿—9Å>7û?c{5¿oÕµ>ÀY^?Fa§¾‚©¾¾Ã `?â­ë¾G9¾–•N?+Ý¿$aŸ=‰]G?%Ï¿®Ig>6“?[[,¿Ô¹â>6“?[[,¿Ô¹â>©ÙÓ>jO5¿k?tѸ>bƒ-¿I÷#?UÁˆ=3¥¿ ÿN?Q—=;o¿˜…J?ôùx¾…Í¾Ì b?"`:úEù¾»›_?ÙÏj?u¿¾2¾½qb?äùì¾Bk=c)2?8g¿‰)Á>iý1?K$¿[]¦>‘ÕÅ>rk6¿2ç?ÄAÚ>J³!¿QÁ%?Ûê>4¹¿QÙ(?‰ ¾Ïeâ¾¾Ýb?‘|½öþ¾Âm]? Âý¾øÁy¾ªcU?»Ñ׾͑¾¶e\?Õ=j?qU¾cÕ°¾ÎÃi?›©Ð¾´Ø»€Ó??+÷¿Nñ¨>·{]?Íå¾ã©g>ïåv?ëÉ|¾¼±À½Ôñl?©1Q¾=)£¾¦ïU?ƒ1¢½ ¿‘™G?~á=> ¿û>?"rú=O‘'¿™J? >()¿ÎÃi?WѾuÉÀ¾Ã›e?ÅÉm¾z©À¾’éH?øP>1C¿†­A?Ü¡a=KÍ&¿ˆñF?öAV=D‹ ¿–?K?Za=;ÿ¿Œ+J?'1>/M¿µ7\?Á‘P¾ðQワßP?AI!>g¿Æc? ¾Í•á¾Ùék?ıî=‰™½¾õ×w?B²<ía>×m?à¡x¾'Á“¾õ×w?B²<ía>þœ?%±Œ>¥ŸP?Ùék?ıî=‰™½¾Þõ>ª)Ѿ†ËF?_µ2?ë ¿å%ï>Yß(?Æc¾oÓ7?Ê3c?}%À¾݈>;ÿ?²ò˺Œ¡H?ݱp?Lý¬¾á-=æër?=‹¾*©#¾É!b?ǹݾ‚‘7¾Åc?m°¾=ñœ¾Êýb?~ý¸¾*©“¾Ñëg?Ô¹b¾vÁ¸¾ÇIe?wÙ?¾š}ξÌÓi?•‚î<—áϾ«YS?) ¿+¡ >·íW? Q ¿ÀBæ¼Ñyi?½Š¾6•¾Ñj?>A"=ª ξXÇ-?w+;¿2q‹=D§#?}‘<¿­ùa>¥½Ñ>«#W¿e©µ>•Ã>²ÙU¿žaÊ>. ¼“«L¿8¿?Ú,½¦CO¿+Ý?q´¾A)"¿is0?9Œ¾6«¿xA<—B¿UO&?R÷½›F¿<‡?œ]>·A]¿Á‘è>íê=ÒÃd¿´9Þ>ý1ý>­‡W¿Ãñ\>Y¥´>įd¿}Ž>Tå'?p™;¿^i9>ü?¢}P¿&á’>Gq&?ao.¿^¬>Ó…è>„+D¿Í­è>ÝÑï>aS3¿Ó ?±P>Ž“J¿,?J]ª>©½X¿¯™Ô>ž ]>Çe¿È>“á8=Èa¿Ûýò>!¾£;T¿3 ?A’¾œ3N¿ë?@m¤¾z?¿#1?¹ÅÔ¾‘·D¿î!ù>1Í¿2­¿ C?a ¿+Ý¿.Å?*»Âù\¿;?ÝA콨SV¿Õ?鉾Ÿ“R¿ý2?iá²¾mU:¿( ? Âu¾ŽE¿)w?¯!ؽK¿0?G¢»˜ÃJ¿=C?ÝAl½m:¿W#/?G¢»˜ÃJ¿=C?@¡^½†“@¿U(?‹ÁC=ŒG¿>y ?'¢_½i«6¿dË2?‹ÁC=ŒG¿>y ?óqí=pë6¿Z0?0)ž>hÍ3¿A+$?ŠB>L&¿z©Ž“J¿,?0)ž>hÍ3¿A+$?G‘!?P%¿ÀAÛ>’F?0ƒ¿ˆR>‚ýC?>Í!¿Bõ=‘GH?C;¿ÊÀ=$ ?“K¿ca(>Õ±j?Ym¦¾Ì™m¾¼][?Òý¾=¾Ä¯d?º¡é=ɑ޾ÈÏb?Xqª¾T9¥¾³³X?éD> .þ¾¾g\?ù@>ãÝñ¾·{]?wI,>ÓÙñ¾áÑn?˜Q\¾4Õ“¾½qb?âéí¾!#½°­W?׿Ӡˆ=z¥@?:!¿óY~>õ÷>WÏ)¿'/?ŠB>L&¿z©!!Š>\/¿_—-?¨¼=¹¿Œ×H?()°¹!#¿¨ÅP?)Y–¾Ã è¾°sW?Xs,?Y+¿6‘¡>}y¹>tµ9¿%Ï?Ö¥? Y¾!¿‹5H?%;¿| ¹¾z¥û±ù>®ES¿Èyo> •?|aÂ>oõ8¿!é?W±˜=]Q.¿o:?¦_¾&ý¿“ÇG? µ ¿ŒÁ¾w>?¼Y[¿ca8>ÞU÷>Åß>qÉ9¿ G?ÈaÐ=\;1¿rß6?[±¾5 ¿‡ùF?êYð¾Òå後ŸB?”‡M¿$Ñ‹=5›?Ÿ‘H¾J³!¿@?¸ß=fg5¿`w2?§AÙ>k·5¿ë?\.?c·/¿¹ƒ>U1)?f»2¿ÙŒ>…?C?LS$¿Lá¡=“ãJ?9µ¿û@2=º½`?§%¾Æ§d?¤qX¾¡1˾ T?%#¿|Bö¼Ä'a?£YY¾¼Ú¾®eZ?îÑk¾ã©ï¾·]X?â !½ q¿©¡Q?sK=(a¿…'D?,bø=H‰!¿§ÉP?5a >ù¿`Í©¾ž)L¿ÿ?ˆ¾>Ój¿Gé">iá²>Õ‘k¿†É4>9í?eÇ2¿ÅÆ>ƒE?H5 ¿ëqÿ=b-2?gí6¿Tá=¤ûU? ¿iQŸ½˜ÛM?£¿õ…¾Îßd?›Õ¾HQ'¾³?\?m9'¾ä-÷¾Ð¹g?™õÒ¾‘aÕ=•GK?'Ÿ¿§YP>-P?ÀyQ¾y ¿«%Y?ÑAç¾%‘¾hu2?v77¿Á-=|;?L3)¿HQ'>²×W?†9A¾ã¿Ækb?ˆÆ¾üà„¾ÏD?Nc#¿¿a"=ŠI?3¥¿-Ѿv¶>°;Y¿ ‰È>)??£sN¿fÊ=?É-¾Ìyî¾ÂQ^?ž?Q¿º¡i½+Á?¶¡R>Í!i¿fi·>>Ücm¿cA±>Ý`(=Ø-n¿huº>O@“<àKm¿vá¿>ãá==Ù³k¿ŽYÆ>¬©\>Þk¿QÁ©>J ©>ѯe¿!–> yŒ>Ög¿O!§>Âx=Ê5i¿¦ÕÐ>z;Í‘i¿œ‰Ñ>u!Ö=âém¿cEµ>´Ø:Íf¿ÊÅà>­Á{=Èëa¿Ôµî>…>Ä#a¿ž)Ì>\å±>¹o]¿ƒQ¹>T¢>Á­_¿mý¼>5„>ÓÝe¿x}¶>õI~>»'_¿ªIØ> í—>ºZ¿ÂùÜ>Ñ‚>·C[¿¼•å>>A‚=Ãe]¿öþ>Z¡=» `¿è÷>>A">Ëi¿~ýÀ>Ê©m>Ê©e¿rmÀ>Ý‹>ÅË_¿ŒÍ>סz>ÇK_¿©½Ø>̓>Õwf¿k¹³> í‡>Ð+f¿s-²>ìiw>ãÝm¿->¬áR>Ò9g¿ˆ½À>û±é=¼b¿Ê1é>S!.>ÎUc¿ÄµÚ>¼±À=Ãc_¿÷Yõ>ÙŒ>· _¿‘ Ð>ÑYv>É­a¿–éÏ>3Q”>Å‘_¿¡È>|™8>Òf¿›qÊ> Ñ>Ô™k¿lé¹>R÷=Ñwg¿¤ÅÑ>II>Òog¿šÍË>5„>¿eb¿”Ç>! >Ø»k¿xíº>‚©F>Ð g¿–ÍÄ>ÌñÊ=Â5_¿á}õ>:!>Ôïj¿pa½>Þ^=Êd¿Ã¹æ>"½¼Í[¿ A?âJ=È_f¿ÄÑÝ>/áP½À#b¿Û…î>6F½Ì}f¿ÃeÝ>’@½»_a¿åAò>Âç=àcp¿>=¦>9Ñ®=Þo¿`¯>ó>î#s¿‰‘>´!=ôÁv¿ù„„>Lÿ<ês¿AÕ >%!Q½ãn¿r5º>ê¾Òÿj¿y±À>Å©V¾´uX¿þaû>ZÙ¾¨áW¿¹?†!2¾„¹E¿Aa?ñ¡ä=í¹x¿­‰U>V<òÑv¿ɇ>FaW=×gn¿m¸>„»½Á^¿é)ú>Ûf>§±Q¿ ?E¾{Á;¿XÉ+¿UÁ(?6‘)>M÷"¿}Ï@?l½>;¿l?5?Â~>A ¿{3>? æÿ>&¿AG#?`­²>=ï¿g'7??#?#÷¿Û?¯}Ñ>¥MQ¿™eÏ>÷±ú>uW>¿Ì)é>ôÅþ>k 5¿‹?èMõ>H‰!¿@/?Ec!?B¿×‰ó>AG?b-2¿dy·>8i?tÏ:¿BѤ>½ ?¥ùO¿ßùe>)A>Ùëi¿<Á–>ûys>í-u¿e©%>LS(?ty7¿ãám> ?¤§T¿>[ͪ>Úuo¿£‘ï=iÃ1?Va'¿=Õ™>k7?Ÿ ¿ÁÅÚ>¹K?'¿bi¨>\%>5›¿ G?Q=@3 ¿”ÛF?=ñ¼½>u¿Ž;I?ý…;>]!¿ˆ»F? Rð½IÕ"¿†;C?Aa½Sy'¿‡Å@? ‰¾SË*¿yÉ;?çì½TÅ,¿t•:?nQF¾>¿J%$?i9¾“UE¿9_??©¾^+¿s-:? i ¾3á¿”õG?î³z?4¡©½€ñ<>Ü×i?…™¾¾J)(>çu?q9>¾ÂQb>‚ÿ=?% ¿•)Î>‚ÿ=?% ¿•)Î>‚ÿ=?% ¿•)Î>²…à>¹‰^¿áyi¾µÁá>Â5c¿±¾‹É>Æßf¿r16¾K­>ßkp¿^¢z½uɸ>ßùm¿ ᘽ.u>äeu¿f¡=]Ž>î[u¿4‚=‰a7>éw¿[a:>ñ>óãw¿¸±Y>Cá“=å™s¿+ù˜>®€Â¼Þp¿T©±>ca½Ù?k¿™-É>üP‰=ìßq¿:!¤>·aT>ö%w¿X‘!> ¼>Ün¿\…<‰ÑS>óåu¿’A>>³A&=êÏr¿AÕ >E¾¼Ñ!l¿]Å>Ö¼êq¿Qõ«><Áþ<å³t¿8…•>8©½Ü×m¿m¸>&áB½Úåo¿\±>¥II¾ÃÕ]¿ÏÙê>h‘=¾Àc¿·ÑØ>4i›¾kK¿™?Gq¦¾ 3M¿ût?Gq¦¾ 3M¿ût?«%ݾe0¿"Å?·aÔ¾Vc-¿/‰?5y>éís¿ ņ>¼Aô=í»v¿å t>ÒÞ;èKs¿;5Ÿ> ù¾Ì·f¿«=Ô>Gq¦¾ 3M¿ût?}”¾“UI¿• ?}”¾“UI¿• ?H1 >Ú;o¿F™->Ɖ_>Þ«r¿öam>‹q¾=ãQn¿uÍ´>Á¸¼Ë÷d¿¼­ä>}”¾“UI¿• ?,‚ÿ½­‡S¿™ ?}”¾“UI¿• ?}”¾“UI¿• ? ¥Ë>Õyh¿øà>Z>Ún¿ñ‰>Ïù=Ñëk¿w½¼>é<¾Û`¿î±ô>e²>à¡l¿)Y>˜V>çq¿ц>Gq¦¾ 3M¿ût?}”¾“UI¿• ?Ôg?§=Õ¾pA¶=¨T? Bü½! ?¬SY?šÍ˾jù±>¬©T?¢Aмq?‡¥E?äùì¾ÊýÞ>Š9H?L¥Ÿ¾ ?=µ"?*7¿ —?€™Ç>:!¤¾Áý\?X‘©>?¿uu7?W 6¾x™¹¾Î3j?Âø<7Q¿ŸUN?W 6¾x™¹¾Î3j?Ä \¾=¿¦V?P5¢¾€I¾º…^?¨T? Bü½! ?¦ÕP? Á¾u?¬©T?¢Aмq?›!M?{Ág=6w?’‘³½%…¾é)v?›!M?{Ág=6w?/‰“>*áI½òÏt?€™Ç>:!¤¾Áý\?’‘³½%…¾é)v?4¡™¾Aa˜¾Öh?Ìñê½2Ë¿—ÅL?Ìñê½2Ë¿—ÅL?Aa=UM(¿¯@?,õ”>s9¿@i ?31>s-:¿5%?ºÚ>w¿:¿Ó?ŸYB>k3¿[ï/?¨UÔ>ro6¿(×?.?Cÿ ¿ômù>:??^+¿´uà>ŸqQ?üáÿ¾&‘>¦¹Q?#Û ¿>­ÝR? ¿‘aE>å r?B!¢¾ñš=²/Y? ¥Ó¾bI©>«ÍS?•˾¢)Ë>„a@?ú}ÿ¾ÃñÜ>"Ç?9µ¿% ?“M?ãQ꾂UÅ>†ËB? W¿}‘À>²/Y? ¥Ó¾bI©>²óV?7¿{Á7>½‹[?àõé¾Þ‘q>}uA?&q¿K=£>?» ¿QK'?‡ßA?…¿1A>5™?r¥6¿tE¹>˜¿N?  ¿¢|>r§‘J?ðýý¾e9¹>'ƒ?‚;D¿&‘¾š—O?‘¹Ê¾À•ܾ D?A¿O=¢¾ÆÃ_?£y@¾×Q徨ÇV?´‘Ó¾d=µ¾ÆOc?G‘¾¿Eß¾½©`?>í ¾ƒQ¹¾ÉWf?3Á½ÆmܾÂûb?µƒ¾šµÄ¾½qb?¨C½Í‘í¾Ëic?Á‘`¾—ξÄÍa?ÑA—¼âñ¾Åd?b1:¾¤UÕ¾ÉY`?>A‚=çmô¾ÍÉc?§!ê½¶-â¾°sW?°ÉZ>òý¾¬W?ÒQÎ= ¥¿´wZ?± >ú¶¿¿µ_?=ñ¼=ê]ô¾¾]?81¤=ðÝþ¾¾Á[?|¹?>öyô¾—SN?XÅ«>û±ù¾‚ÉA?¿™Ø>öþ¾—uG?ˆ½À>ùJ¿fÁ4?’ÿ>ÿ’¿˜ùN?ÿЄ>7¿§]T?¥ÙL>u¿£çR?8¡˜>òÍö¾ŠÉG?±ýÜ>Õ•ç¾gÓ5? ‘?Óií¾oŸ5?Òþ>ümÿ¾¥?Z¡0?Úê¾#£?^õ,?èÙô¾x%Á>œ¿Q?ÁݾŽÉÊ>¤Q?³µÖ¾üP>Æßf?du³¾då/?ïñ>q ¿må5?Öú>K¿j¡4?5?¸=á¾W*?;?°qݾ¯?|{??¢%Ͼg¶>¶[?{ù½¾øQ}>Ü j?H5¤¾‚D>ä¡o?—¾ ?^e-?G¿ ?mÇ8?µã¾?ƒE?– Ǿ›ÉÏ>§‘V?f…º¾=)£>Áb?]°¾Î©t>ØGk?Pm ¾»Ñg>Ûûl??›¾„IA>àq?‹¾Ù>>å r?©ˆ¾š Æ>ªóP?¯±Û¾Q¯>½a?U¡©¾7>ÓÙe?4-¡¾*É’>Ͻg?M… ¾ Y>Ég?^i©¾ò±k>ßo?!鋾Ã`>Þn?$a—¾}YJ>Þq? ˆ¾nQF>Ügq?‰Š¾æyp>Ùyk?@Ý ¾ q„>Òl? “¾%É‹>عi?,-›¾å){>Þ“o?…¾ÑéY>ês?Æál¾½U>è÷q?Ñ€¾%é >àÙr?,E’¾Qù7>âéq?õ‹¾¢Ñ]>Þ!q?Yƒ¾ŠR>ã7u?¤ÁM¾È±U>ç7t?¸Y\¾ýh>íõv?à¡h¾`!3>ïuv?… S¾eQ¸=êÍx?ı^¾Vñ¦=æ¯t?‘¾ö@«<ñ+z?X¾HÁÓ<ìÛq?ZE§¾…AÙ½øÁy?™D¾!½çßr?G­ ¾Tq3¾ë‹x?M1'¾ÿ@¹<Þ«r?Q¡¢¾Ç<åCp?X©°¾—á=äiq?YM§¾yL;â!p?nm±¾YÁï<Ö‹m?=¾¾¢aQ>Îod?¬ý;áA>¯±[?íEô¾ŸÉ>†!B? 3¿s¹¹>€-??±¿ö™ó>X/?‹ ¿¶1Þ>h[1?+k¿7q??%Ï¿W ?5E?3m¿q©:?g¹>)•¿T+?î•ù> í¿¿D?8õ™>¿‡ýF?Y¥¤>k ¿ƒiH>çmp?y¾£±F>èMq? ‹¾<1¿u!¶¾f6?Àía¿Š‘¥½Ü)í>Œ¿E¿då·¾?êAq¿ ± ><…œ>‘GD¿4¾H5 ?ÑÉj¿ñIw>;Q¢>º/[¿e®>‚Ç>)=¿ji¶¾€äeq?i‰¾øp >ïy?ƒ‰?¾"á;=ð5|?nù(¾„ñ³=|?Y1¾>j<ý…~?¼‘Ù½\ð¼÷­~?®aƽ;Q’½ÿ³~?Aa½u/¾ü|?gö<œáF¾û{?+Áâ<+Q޾ä×s?Þþ=rM±¾Ø m?F >ž%ȾÌÏa?þ˜†>·¿“ãJ?+Mš> ¿T5-?ëú>P(¿ûÍü> ?II'¿-‡>g™5?eS.¿Á>rý7?Ii&¾ò•|?ëó»"U”¾Ý™q?b#>äù|¾íx?*þï:ù¼¾ÔGh?{ùM>½æ¾£O?‰ Â>:Ï¿Oå$?çáô>9) ¿äÙí>Ho ?"Q˜¾á_t?.x¼· ¿œ‰M?Ïu>H'?&?ö%ó¾U…*?¹?õ½ö¾ ?{-±QV?¥Ýؾ™eÇ>œkP?²Ü¾†>ȱe?|ñµ¾"q—>¾Ýb?e‰¶¾Q ?U¡-?ýMø¾· ã>›ÿK?« Ò¾"q—>¾Ýb?e‰¶¾Iõ>Âßc?\­«¾8ƒ?D"?Þõ¾ßñ>’=F?·]ؾ^-¯>½‹_?U¡±¾cÕ¨>Áÿ^?~Qº¾5³?Dù"?éEõ¾g)5?òaö>o¿‘óJ?d•ª>ý¤¿?~à m¿Rï)? a ?W¿‰{@?¶IÕ>Í¿>w"?'ù?¿>w"?'ù?¿O ?[ï/?è½ñ¾'Ÿ?[ -?Òqí¾Ù]è>˜iK?«yξ»Eà>›YO?¥Ç¾å?r‹5?àeö¾¥ ?cG/?ûu÷¾ 5?p±:?ÎᾩÖ>›åN?™IÔ¾›åÊ>¬T?Šéʾ’éÈ>°åU?”ÝľrmÀ>²V?”¡Ê¾bY½ö%?¶{½î±ô½ô~?ýÁÀ<Ën¾è…w?åñÔ=Q‘¾ëWr?WA>‡¥Á¾È·g?§‘F>ëú¾¬«R?…”>=µ¿c).?ž%È>3Q¿2?ý ?W[-¿hy¶>KË$?C!¿ —?Á?K&¿ù¾?"¥?[ ¿w‡8?Â¥Û> ß¿wg9?ÎÁã>¿GI?mŶ>…¿}ç??›Î>§ËR?!Í>ìÙû¾À±c?Z!=Í!龸[^?<Ù->ÒQî¾Ög?'Ù ¾²ñоÈAa?9a¢=íÕ﾿'b?–@ ½ÏIᄎ¡Y?É>³¿¸\?V®=Û¿ž{K?G> ÿ¿£N?5 ¢> ¿aS3? ?bú¾x™9?ðùù>ÿ±ø¾5Ó?O])?¨Ú¾“9J?m´>‘¿-K?8™>¿¦ S?¹‰j>{¿{¿9?¸!Ö>ã ¿t =?µ×>Õ¿@Á!?- ?üú¾Xã,?,Õ?îÍᆱ ?rý;? ÁξG ?|C=?¡Ù;j18?ÖÉé>ñ¿gÑ3?ïÅÿ> É¿ds1?‰? g¿'‡?B³#?õ-û¾é)ò>НF?¯yÕ¾0›?E×%?âÍò¾×Áé>ŒõI?—‘Ò¾çý÷>„›D?ªÖ¾4g?@£ ?ý…þ¾ÖUñ>‰]G?¸åÓ¾ñõý>B?¬­Ø¾î±ü>‡ûD?¤‰Ï¾é}ó>’­F?£Ô¾Eõž>¼Ï]?-ȾÈÑ\>ÊÅh?q9¶¾Ða^>Õíh?^ñ´¾©>ÉÉd?ke²¾•aL>ÜIl?Aa¨¾IF>ÖWk?ga¯¾x >>å{n?N  ¾†Y8>Ûn?Rí£¾t#8¿ºâ=`‘/?ao2¿Cá£>FA$?h 6¿>S{%?Vƒ(¿èÝð>&q?^õ,¿Þ­ì>*?·¿L(?ö•ÿ>Ñ ¿Zƒ+?ý>y:¿ Qž=U¿.?io8¿µ>LÅ"?VŸ+¿±¥ß>7‰?#ù¿IÙ"?ó?I¿Pã&?õ?sñ7¿×¡j>L(?iQ7¿©1á=is0?bM1¿!­‘>T­)?fI0¿3ù–>W•)?{=¿K9>Jë'?e0¿r1¶>Bë!?c 1¿fݯ>H§"?HÁ#¿öyô>/1?Ac¿ ¹?0Õ?1 ¿5)? u?1 ¿N+)?y? ¿„aD?ƒÃ>ߥ쾨9Q?[%°>Ac"¿Â5ç>I ?4g¿òý>4ó?C¿· ?"ã?+÷¿2?Û ?û¿yY??Ê©Ý>?¿~5??²-Û>k ¿c—4?åñì>7 ¿Ve+?ý†?S ¿N¹*?c?¿BA!?  ?3¿>A?O ?¿@…? Ó?+i?eo5?¶1Ö¾Y+?(+?óô¾†åC?ƒÝÈ>§¿aß2? ?ðõ¾!?q8?´9Ö¾/‡?__/?ÎÝÞ¾/‹?^+1?¿ Ù¾.ã?R +?ʩݾ0e?^×/?°qÕ¾Ù ¿Z-?ú)þ> y¿`å0?òéù>œáJ?JѪ> ­¿È a?:Y¢¾r1¶¾°;Y?¸Ú¾9™ ¾Á;]?iɳ¾qu¸¾ÀÏ\?°YN¾Ý•í¾Áÿ^?âu=Šù¾±mU?Ÿ ¼Y ¿“QI?L‰4¾7‹¿—UL?S±±=9™¿qqK¿P%¿æ±ö>ka2?¿‰?Ró)?^ý¾Ôeé>‚ã>?êÍø¾{?P5*?ëÉü¾É!ê>~z7>? zÿ¾½B?jm²>- ¿iÿ7?à ?ÇeܾA›?e ? ï¿õñø>P©*?(¿š±Ð>„Ù@?¿–Ã>•ÕL?Û1í¾e5­>—ãM?ê!ú¾EI >¯[?· Ó¾Á‘p>³]]?ÐE㾋‰M>Ô l?`Y©¾¦Ï>ŠÍG?áµó¾mU²>¡1S?»Õã¾!€>Æ¿c?”‰Ã¾•ñ¯=ìQt?)]’¾G!I=òëw? z¾{ÁǽìÛy?m9G¾^ñ´½îéz?ƒÁ5¾\q1¾÷;x?bi0¾%‘¾íGz?2‘¾ÑAW¾çw?=)¾©J¾ômy?ñݽ٠o¾ðûw?Ž‘¬½Š9È>ñI?õ¹ò¾ í—>¯}Y?¯Aß¾Eñ>Ùék?c ·¾&Q½ðy?É9a¾£±F¾òµw?7%¾qU¾é™v?y!-¾Üj¾æv?NA¾E¡¥¾ÝÓq?0b_½cA¹>œQO?×iì¾ßÁ>¿)`?²¡Ó¾H1 =åcs?&™¾*¾÷±z?:!¾C+¾õƒz?¬qö½‰A@¾ôáy?â±ß½'‰•¾ê]t?µáp½¿ºÛY?VñÆ=6Í“>³_[?¦Ú¾´Éa>Ìce?†=žl@„¼óqy?Ïe¾_™'¾ðýy? )¾:Y*¾ùz?ãqñ½áAs¾ñ)x?£|½ª¹Ü¾ÊSf?<1‹=3Q¿|+B?ði>«!a¾êYx?ËÒ½,ñ˜¾ìt?Á#½‹mʾÕ!k?¼§»Í¿œ¥P?Aa >£åؾÌ'g?HÁ“=%A¿•aL?¨9Y>¬Ҿ˟g?¢Aê=Öqä¾¾Ÿb? I>%é’¾ì1u?3À…àen?d•ª¾ë©u>Ï1d?„ÙľùŽ>º/_?›ξG9 >®+Z?¥¡Ö¾c%®>­MS?×¥æ¾^¹®>­‡W?œùÕ¾…•Â>œùQ?¬áÚ¾›qÒ>Œ£F?äùô¾´Uá>—9I?Å=Þ¾?fÝ3?ü¾÷9þ>‰ë@?…ܾ31?N_#?èÁí¾‹qB?S=±>÷ ¿ŸuQ?ò°=$ ¿¤«T?É>Ñ ¿«³V?Öáh>÷Yý¾y¿@M!?M×#?Í!á¾Bw?[C)?¨áÛ¾B?Ku%?¾Ýâ¾3û?Z¡,?Ì Þ¾ ÝQ?S±‘½)u¿Ã)_?Úqs>½QÛ¾‚­B?:É–>()¿ y?•IÅ>n‰8¿2û>+?J•(¿‚uÄ>Ôµî>‘ L¿€ À>kñ1?2ÿ¿X94>>¯ ?}B¿Ál>“ýG?,¿ca=„gB?LU&¿â!ì=´wZ?ÿ ¿Ý±Ø=ÔÓk?~©¿¾“ýs»Òûf?ª¹Ü¾*1½îÍs?D…š¾ò(¾ÙÑl?a©¶¾A+¾è£t? jx¾ÈÑl¾Ò‰l?2图íao¾ßár?¼‘Y¾M•¾Ù{i?“¾Ý‘¾ãßo?¿ÑN¾톾îv?JѪ½QÙ°¾×gj?½qR¾½Î¾Õyh?û‘â½–˾» `?*å¾ µ¿£[O?­“¾O•Ÿ¾î's?Î<Ýaë¾ÉWb?~q©=!¿ŸçO?-Ñ™½H£&¿zý9?¤Qa>–AI¿9™?ޱ³=Âþ¾±¿\?Ž!À=Q/,¿fõ6?”iD>J)(¿m:?‡ÁL>vÿ8¿4+?Uª¾ÿ’¿mq9?×Áñ¾Hß ¿úíû>.9¿w¿ç?MK(¿‰¿Îÿ>jû3¿©Ý×¾KÍ"?Sw%¿~Q¾8õ?j÷3¿ ޾EK&?e55¿lA?¾hÏ1?^Ù1¿u!V½mE?Ii"¿ßÀ$½L?9}¿ a>‚7D?C ¿© >‡§C?C=!¿­kX¿“>Æ5æ¾nÛ3¿¾¡Ø>-w¿ôýü¾4M??o¿Âùd¾}Í>?;Ç ¿¹‹`¿ý¤‚>ªIоjÁ3¿Üæ>a ¿*¿+i?&Q¿¿á¾QÛ*?1µ¿0½¿9 ? ¿®Õ¾c5?%•¿E¿-“?³¿·Ñؾk-4?&¿Q1*¿;©?È%Þ¾ÂÙå¾|{??öEú¾S +¿D$?iÁ¾sõ»¾¯—V?­iξu‘¾šP?Æ1â¾Ó¿h¿k1>ŽéÁ¾‡SB¿³)ß>ç‰÷¾€)C¿óåý>µÝÔ¾Ó3m¿}>%!‘¾ãûn¿ý†>ªx¾¨R¿Ðà>qU¹¾é+x¿q©:>l!(¾¢·T¿Õuè>J™¤¾÷­z¿ô¨>9)¾¶KW¿Ý±ð>‰¾u«;¿1'?cA©¾ÊÅè¾…³C?Ïù龿•󾌡H?”i̾M,¾µ§X?[¿³ P¾Å7d?­QϾ؂^<¿I_?ôMú¾€ ¼ÝÏq?Z¹§¾ i >ñó{?±Á⽦ñK>ú_z?8¢{½a‘>â‘t?§=4½”>æyt?4¢t½Y…-¿_]1?éñ{¾º¡á¾²/]?2y¾Õ‡¾ÍWi?Pá ¾9aB=ë©y?œ]¾;¿¤ßR?úñw¾5E˜¾ÇIe?RE©¾k=>Ý r?5‰¾½mÖ>Á©_?öa}¾þÖ?³™[?Ÿ!\½>u ?ƒ…C?:é¾lí9?Zõ-?ÅÔ=´=V? = ?”·=P(??C?Õyh?M¡3>“©Â>†ý>&á’>žíQ?DÁ,>ßÁk?vݳ¾ù? mM?Xu¦¾j¡4?Vï(?1„¾Ý'o?\uµ>ü$½üSz?Èað½\q1>Ñué>£N?ˆ…¾}­;?"ã ?¤ÅɾïYs?bI9>!¾÷Y}?I¾ôÀ‡½ÞYë>„·??ê]ô¾|ñ9?³?´à¾ÝEp? ‰„>º¡i¾Ð? À¼WB÷<ÿAä=Úÿl?oñ¸¾ÅUÝ>_H?É=å¾]§1?Cq#?Yiª¾Úl?•™Â>>±Ž½û‘~?–A5½ÃÄ=Va³>±‡Z?ƒMžRÑ,?d1?÷¬ƒ¾ßQk?›Æ>ñ–½ÿ]?÷Ý<逄=;m•>¿I_?‘ñȾ^½.?aÝ0?Êás¾ÏÙj?Š‘Å>—ǽª?!N½iÚ;|aÂ>IF?þ~¿g 6?!u?ŸUξÙ=m?ù> ;ÿ]{?P/¾|ñ¥½¥Ç>.=?n§5¿bƒ1?ŠÆ>4Ÿ¿Ã¹b?‹áÊ=Þ=è¾ãßs?¼É_¾¡X¾„aÀ>¬©Ô>¡T¿W=,?”W>p—5¿¦ñS?–±Á½ƒ ¿ãqm?(I—¾ãQj¾„aÀ>¬©Ô>¡T¿½?‚‘×=¡»P¿•J?%‘ ¾/i¿Ä?`?Ou¨¾m‘´¾•J?%‘ ¾/i¿¼y^?w…¾¾Xᦾ­½W??‘§½ 3¿Ã`?€ÕÁ¾2u—¾Á«]?<¿¾Ka?uu·¾AŸ¾â!t?˜1å½¾½?‚‘×=¡»P¿8K?K±#>ŠÇE¿lÑ2?+i>Mi%¿W?.?žµË>Bw¿¬ÇY?¾ÙV>õ½ö¾l5?—qÃ>1]¿âÉn?c)B>,õœ¾ P?òyõ>S §¾ð¿u?( > áM½ŽYF?;ý ?*‘„=ÛÛi?{Á>9)>dç5?Ý?ç‰÷>H5œ>½Ë>·{]¿nÁ²> ?ŠãD¿¹Ï>I…!?RI)¿då¯>?!?jm2¿ÿ$†>€ñ@?4K¿5 ’>ÙCk?I‹¾¬J>ý¿z?Ï%=äiñ>™»J?•Æ>ë<ë§w?>Ý@¼mq5?e‹4¿f‚a<‘'I?EK¿&<¤oN?7U¿ðÁ뽩ÁT?G ¿5A$¾Òe?¬‘Õ¾¬qö½òÑv?é)r¾Ï¡l¾ñ×x?BA)½¡–¾ç§t?»€<—‘ʾ£S?šéξžEǾª T?Qξvù¶¾­¿U?³AÖ¾OÍ¥¾¶Ÿ\?™ÙǾ8I›¾Îi?ɾjÛ0¿q5?9™¾}A;¿Pß*?¾V++¿iã4?¼!m¾¦ ×¾½ÿ_?ïqv¾K)¿}u=?&᾵Ǿš?N?¼Aä¾DO¿ãC?m97¾j…¹¾•ÕL?ݵô¾.q¿ŒI?µW¾r޾™EP?Ä]å¾6¿xa??1‹¾r޾™EP?Ä]å¾jõµ¾rÝ¿DÂ÷¿/áP=lí1?h—7¿‚'¼¡R?#K¿ Òì½Õíh?¦ñ˾„aÀ>¬©Ô>¡T¿ës¼àq?]¬¾Äྷ]\?…¾Þí¾²Z?òÑr¾Öã¾³·\?Ú‘z¾ þ¾¥O?QM¡¾X7.¿R+?3á—¾™P¿*?»ñ·B¿<‡?†qG¾f…6¿Y‰)?ËÙk¾b5¿Qg*?ÎÁs¾t›8¿S=-?7Á¾*«¿ÏD?¥„¾XÅ+¿h 6?™ñV¾„)F¿6å?Á>¾¢ N¿?Q‡¾ÅÇ_¿Ç½é>8)¾Ù{m¿[™¨>{14¾óy¿§Aa>U1•½¶¿æ (=X¾<~7A¿Na%?ÿ‘é½™)M¿.;?ê°‚½¹ßY¿ I?s‚¶¼òíu¿Ù>rÁ™<ØGk¿[a²>n‰<>Ã^¿Øaì>Œ5>ªIX¿?¶{=¯ÑV¿ç ?-Ñ™=¯µ[¿?–@ =Õ!k¿W±¨>ÝÑ_¾4Õ“¾Ñg?M¡£>ðÀ€½{??V™)?2~>Œ£F?&s?>~9Ã>Ïij?½Î>õÕý>ÓD?{-¾¸É\?î=ô¾€¹6¾ÉÇb?ÀAÛ¾ž½Ùµi?™);¸@½Ðíe?Ãྖ ?>Ù¯o?!Y˜¾ïqv>ÀYb?õ̾¡IÒ>Ãõd?Na5¾™‡>Ó£m?…¾ÁáÝ>Ôµf?°ã?¹™õÒ>Æûe?N™¾-[?¥/P?5ñ®=i?»›[?ŽÄ<?·í[?œQ³=Ö¼Ãae?Ä!ã¾ôàŽ=õ/}?+i¾‚‘¿>Ôam?óÿ*<þµü>º^?ïz=y ?¯'V?ÕAÞ=%;?¨P?ÔÌ=žAË>Ðíi?ž±¯= i >ñó{?±Áâ½¢)K>écv?‰™=>¥õÏ>Î9d?•IM>øQõ>¯ [?¨QH> o ?¡õP?µùO>Ö9æ>¿+b?Y>Ûik>óy?ç=Aç=ì¡u?!„>óqm>Ïif?‚á¼>ÁJ>ËId?˜MÐ>L¨>ÅUa?fõ®>¼±Ø>Ãõ`?Òáa>zx>í·v?èã=tA->õc{?)±«½1A<¶?M¡3½PQµ½ß7r?GYŸ¾¢ÑM¾éÑt?¨9Y¾Ê1ù½·—X?Ù?Z)4¾Ôcg?¡Ç>ÎÁÓ=ñGu?±ˆ>r|¾Þn? Œ>©Át½ð{?–!>>­½Ï¾Äé`? ù€>I¡¤¾Ûýn?$ ">Ìag¾éw?ÎÁó=%[¿’ÏK?X9$>¿¤3T?¨S>6Ë¿‚­>?'¡”>*ÿ¿‰aG?¾iZ>Ìag¾éw?ÎÁó=O¬¾á%p?`¬½,)¿ŽåI?GY/>¿ ¿´wV?¢Ñ½=O¬¾á%p?`¬½€I¾įd?ív¾ ] ¿©V? »ÑžÊb?%ˆ¾¿¾g\? Üîþ>‡>¿Ÿ?œ5Ð>ˆeG¿ÿ$?rý»>†­E¿+Ù?}>НF¿ Ï?5}–>ûû¾¾£^?Í!i={¿9¿-ë?d±µ>¥˾ڭi?VñÆ= Í¿ªïP?:|>]ù´¾×‡m?'2ó=—ʾÝyj?ù”==e¥¾ëãq?3áW=—¾å}t?ʼn¼ta¼¾ßÅk?ÿ¾“qľÒe?סj¾U•¾Õj?()¾S]¨¾¾3^?x}¾¾ ”¾Âd?l=³¾a’¾Ðg?Cɤ¾¢ÑM¾éÑt?¨9Y¾LŦ¾¬­X?¯µ×¾LŦ¾¬­X?¯µ×¾„¾¿_?´YÕ¾x™1¾Í!i?„õ¿¾wõ¾‘ L?Öð¾™a˾H?æ=ö¾°‘d¾Ç»_?¯ݾk½½è/p?`­ª¾Ý@<õÛ{?‡‰6¾™Í¾¯}U?„½Á¾|aÒ½îx?ê‘f¾êAA= ~?ѱã½õ€ >ô§}?ºƒX¼ý¼>ôkw?¡&=^…´>Ý]o?¡=ó!ø>Æ_?I™=¼!å>Ád?:A›½‡J>þñz?®-¼=ñœ>ë§s?Ë€3¼ÉÉÜ>Ôóf?¨ÿ,¼ºÿ>µÁ]?„ƒ=<×ó>Æß^?Ѿ‘‚>ìÙs?i*¾ßé>§=U?;ý ¾CY(>ÔÑm?QÁ©¾>u¤>žAK?¿ Áª<ž'R?+¿PQ%>ÿ=|?Gb½GU›>èOs?ኽÓÁê>Ìac?&ê¼ÿz?³C\?HÂ~½S?¤ûM?'ù‘¾ ?kó3?Ä™ç¾ê±õ>m©3? Å¿µ¿>nk7?&«¿óÿ*¼þÕ{?„7¾ßùu>ñ/v?%Y¾Þñ>º1a?þ€‡½e?ÙN?~ÉF¾7?~áA?’!Ͼªø>}??Þé¾yY3>ùex?Q¡*¾šAÌ>Ñ=g?¥O?¶Mᾇ‰F>œOQ?Ç ¿á1½Ð e?׉ã¾Ì™m¾¥1V?úý¾±ÁÂ=ðýy?ƒÁE¾šÑO>ãUr?)€¾2›>Éf?B!¢¾^e­>Åd?'M›¾¼±`>Îg?ly½¾¢AŠ¼Ô›m?mY¾¾Ù¾à+r?0Õ”¾“O¾Ð¹g?ŠY¿¾«YW¾Ý{p?™Š¾29¾ësy?s/¾µáнüz?šÑ?¾-²ý½ûå{?ú(¾÷H½´}?Ðaþ½å€½ømx?èùs¾œQC¾ñKu?ÀYZ¾dͰ¾æÏo? Áf½Y¥¬¾åñp?ü¤¼àir¾îÍw?!!ª½û!v¾ê?w?r1ƽRÑ ¾Úp?D‰¾ƒ‰?¾Åçb?¶ÙؾfI0¾Ä¯`?Âùä¾òÑ⽺-Y?‡¿O±¾½_?ÐÕî¾·Aͽ·Ñ\?ôÝý¾Ù½¾×‡m?!#½C£¾çsr?(a&½M-«¾â;q?c¼ZE§¾Ô»l?›ÉG¾Ö9v¾Æ3d?Œ¡Ä¾»™Q¾Àu]?Íuê¾,I¾¨R?1 ¿üO½„)B?LU&¿Å‰¼sƒ=?V ,¿ÉÉd>%??Œ+J¿£!C> Šþ>«±X¿ô¥ÿ>ë9i>¤ÿU¿ŸÉξÔÑi?ŠR½V®¾æ;p?ÓÁz½Œ¾Üõn?Ê©m¾U½(?f…2¿y‰>5{?ŠËA¿Ñym>.å?‰—G¿¢aa> S?¬ÅS¿ìMô>œÁO>´ãZ¿Z1?l•¸¾81 ¿N*?&5”¾aý/¿õ ? Š>¡KL¿ ?->¡…L¿æÉõ>õt>±X¿rá4? †¾MK(¿Qõ+?Yý©¾Q‡)¿3‰?„IÁ¾jÁ3¿ˆgA?•™R¾:=¿,g?@i >{3>¿‘CL?*9¾-—¿C$?ˆ½À>TÇ*¿£‘S?YÁ¯½q¿U½(?ÊÞ>:?¿ºi[?;á%½w¿8ó?Ä•Û>K'¿´éX?K!=¿¿;s?Å­ê>S!&¿^Ù-?’‘Ã>>u ¿ƒ»>¢cO?Õ±ê¾G9¨>“L?üÄ¿má9=ýi{?_);¾?U>xc9?5 ¿tEÁ>˜½H?*ü¾Š!Á>”õK?è½ñ¾'Ù’>—N?ã¿31 ¾ñ·u? z¾|Y½ú'|?N (¾b/½÷éx?Çk¾Ä@×¼úÑ|?Gq¾õ€9=óÇ|?Há¾½Š¾ðiv? ðÀ8ÇÙd¾ñy?A!Ø×j?lé¹¾®í=áAo?J%¬¾ÿЄ>ÔEj?8ù¾¶k>à×p?Ýé~¾Gå¦>ÔIj?Ö©r¾a«¾‘)K?üþ¿£оš[I?ÜÙÕ¾¨UT?~á½¾v¶¾§yW?’•Ͼ2›¾³Z?ºõÚ¾-о½m^?´qÔ¾¨q_¾Ä_c?§ϾGYŸ¾Êb?aQ±¾jù¹¾Å­^?H᪾…¾Í#g?kI¯¾zx¾À“b?›Y˾{ÙF¾Õ[g?ŒMþœ1̽¿c?ßáæ¾²¼¬Y?忚±È½©¥Q?¿¿ýÀ¾yY??M½&¿m¶¼'3?¡R¿‚9:>“ýÃ>ÊÝg¿š±Ð>X9$>Ñf¿?R{>ŸqQ¿1³?š@‘¼š'K¿Y1,?ñ>má9¿?”½]©/?{K9¿!!>É>È'h¿g)¹>Wé>ÞUk¿7 ?.Y%¾§yS¿W?îx¾µ§X¿“Ï>II/>Êße¿4Õ?ãqa¾ŠC¿.q¾œM?'¥¿JÑ*¾§¯S?y ¿=a¾µ5Z?A¿—R¼ö—}?Y ¾ré½õey?®IG¾ä¡/=ë‹x?É9q¾£!c½áo?e²¾Î<Ý{p?S ¯¾qè¼à…m?zm¾¾Q1޽à+r?D¢¾ga¯½Þn?y]·¾Q'¾Òl?ge³¾|aÒ½Þ!q?L©£¾ŠÉK¾Õ•k?M¬¾#ù ¾éw?®]¾ës½÷?x?Ýyr¾mq­½Úçm?aý·¾wI<¾Ôj?g¶¾!!оÏIc?|Ѿ¾.=’¾´]?¡…Ô¾òyu¾Òok?M1Ÿ¾Ë¡e¾Õn?(•¾ïz¾Ã+e?{Ù¾¾FÍŸ¾³Ó[?оˆÙþ«_U? ̾wõ¾‘ L?Öð¾“QU¾î³v?c +¾-±š¾Ê‰b?\uµ¾›qʾ©ÛQ? Ô¾ˆÙþ«_U? ̾Q¥®¾¹^?t ·¾ï­ø¾‰}B?µQݾõ€ ¾æ?t? ‰¾Ù`!=ïU{?”1>¾íV½êy?Ìag¾Îpƒ=øãz?{¡@¾ «¼÷{?¡ÙE¾Û‰r¾Ôñl?,)—¾nÁB¾áEs?Øa|¾оÞËq?wÙ?¾>•£¾Ù]h?E‹¾оÞËq?wÙ?¾÷¯|?:!$>>À:þ›?‘¼HÁS½Áã_¿¼AÜ>àe¾}¿9Ñ>÷!o½ý¿z¿BA)>´‘ë½[ ¾®»U?Q¿{IC¾aJ?#÷¿A+¾…#D?8Ù¿¹á7½µ]?‡¿3áW½ŸM?4¹¿øÁy½‹QG?Cá¿RS=Å9f?ÂMÞ¾–Ë>¹q_?4¡‘>óqm>Ïif?‚á¼>ǹm>—«K?=?Na%¾ke2?iá2?Þî¾–AM?‰AÀ>MÛ#¿n‡6?#…’>E»"¿|·A?79>[±+¿u±9?C‘>c³3¿hÏ1?#1!>l—6¿F}&?Ñ…>Tá'¿y;:?ˆN>Sw)¿qå4? Ò>W“/¿`/?B~>™¾C9%?d­5?MÛ#¿n‡6?#…’>ë¿—«G?#½>[±+¿u±9?C‘>*Å¿™)I?ñm>6±¿‚??&å–>U/'¿h—3?ý‘>]m1¿IŸ&?B™ž>§¿Š¯F?Uù®>#K¿€V,¿?èû>qÿ5¿ŠÍ¿>)[?ë¿—«G?#½> S¿—ÉH?_™¯>*Å¿™)I?ñm>Fë ¿tï9?(aŽ>Ja"¿>ç"?»¹à>ÆÛb?B!¾¸±á¾£R?4€7¼"S¿5?e ?SY(¿:é>±iY?C¿*‘¾ägs?,¾Æá\¾ñõy?Lÿ¼2=‘¾ëÅt?U1•½j½·¾æçn?‡<`¸¾ân?¡˜½o´¾ÝÑk?9™(¾c}«¾Þl?rG¾Ál¾à/n?Í‘¾É!r¾Ô×k?3ž¾þð¾Öi?ŒɾóÉò>!?Uß)¿‡Á<=Âia?߉ñ¾9ñ%¾ò{w?yyJ¾Éqg¾øUy?$†¼á¾ò?}?,ñ€½fÙ#¾ùy?Xq*¾,}¾æ¯p?œQC¾åAú½öí|?·ÑÀ½€)C¾ûËz?¡¡½¬=×Kk? žªaß½n~?ùÀ޼µÁɽp|?+ù>M0>ó“v?·yS>ñ]>öyx?u!Ö½ á?À_\?€ =ÎÅß>Íf?Í!)½Wµ(?ƒù??Bk=û?¡×S?{Ág=…íC?J%$?‚c=(C?¨åO?~½þñz?þ˜¾0>óÇ|?û@2=rm¸>»ca?LÝ>Týª>¿µ_?rÝ´>}†>¹\?Î9à¾Î= ~?ÁáÅ=1¾ìût?‰¾}†>¹\?Î9à¾6ñ¼~ÿB?K¯%¿ÁʾÅÉe?š F¾ᦽò{w?Ð)x>iQ/>£R?¥ ?ʼn;ºg]??ʼn;ºg]??ʩ徤ýO?‚©¾>n6¿^õ,?®aF>ý-ù¾ŸUR? í—¾}]>¿Me)?¡Ã=í)ñ¾°W?ý‰¾mq9¿d•.?×1Î=¿)l>+Ã?¿D?ÜIt¾5]?‡5E?@1"¿ä-ï>Dß?¹ÿX¿6•>É=Ý>¹ÅX¿€ È>d͸>•M¿ÔEê>‹ÁÃ>~>¿F™%?[y)>Âùä¾±ß[?摾Ëe뾸ç]?j‰E¾/á¾¹ÿX?å¿×¡ò¾°ç[?nQF¾wF¾˜‰J?#‡¿![¿ù@?OÍ¥¾G!¡¾kñ5?A!¿@ù›¾¯=e!?D¿> ,>*?Š­H¿IÙ¢¾u±=?,c¿cA1> ?…M¿x ¾s½9? ¿]©'>» ?¨«S¿n¡³¾p 6?8÷¿f¡½=… ?¬©T¿»™á¾b1.?2㿊­À¾G'?MÛ'¿ƒB¿&?3Ý“¾~á=¿,ñ?, œ¾Ç g¿ÉUÜ>‘€Q¼y;:¿J]"?ù…¾`‘/¿d‘.?-‚¾X,¿gÑ3?êYp¾8k¿vq;?$ š¾m:¿]1/?Òáa½,¿‡¥A?޾„ŸD¿Lã#?—|¼†Ë>¿Z›*?‚œŽÉF¿ m?]¬>Ž=K¿ M??U>®×X¿Í­è>'>±£Y¿Õéð>ÔÑq>cH¿6å?A7=™KJ¿3Á? ‚Ç<©3W¿ ÿ ?‘aU=Ìñb¿ØÕì>¨ÿ,<¯'Z¿¾Ý>(I—>¾÷[¿ áÍ>Lá¡>½qb¿CY¨>O]©>É;g¿T5±>ûÌ>Ø×n¿ Í>ÀAk>çor¿ú €>”1N>¿eb¿Ýéî>ؼçûq¿ }ˆ>ž™@>Ç¡f¿¹¥Ý>Öû¼â=s¿ Å…>v.>Øi¿Ž‘Ì>vq»½ãp¿$a>¯ I>ÔÓg¿½Ö>“½×Qi¿Mõ¤>ÿƒ>”¥F¿Êþ>œmƾ|›>¿&Ç?]Q²¾|›>¿&Ç?]Q²¾"Á”¾.ã?õ@¿&Q¾]5+?]O0¿ˆÕǾË?…í?¿"Á”¾.ã?õ@¿>é>Äíà>Ãïb¿7Q>ì½ø>À[\¿Bµ?û@‚>|Õ>¿Fï ?|ñµ>j1¿Õ“i?íÖ<¬ѾÊka?oI.>½qâ¾€Eƾ5a?]§1¿K‘,>9ñ?†ÉD¿4÷? Þÿ>9¿°©W?l]º>™a˾‹ýA¿ ?H©¾yº¾v¥9?0¹¿‘<>wÛ=?O%¿Ç ?W,?òý¾'O?nQ6?—qÓ¾²»\?¶Û>о)¯?‚«D? i…¾¨UP???a¾Ž!È>Ûýj?aн;S ?•F? œ=q>óqy?|a2>oƒ:¿M¿$?ñ)p¾C9©¾ªET?ÒÅæ¾Sé7>¸^?çUí¾ßùu>Íuj?F±¤¾»¹X>â9s?¹‰j¾ß‰i¾ã¥o? ‰¾V))¿vý:?X©0¾©OR¿$_?ßÁO=¶ó]¿øÿ>Gã;¯#Z¿§uË>mY®>#K¿§ëQ? ½sÕ<¿Jµ#?ǹ]>r‰7¿æ!ë> A?@k"¿mS4?Eñ¢>Ì æ¾Ì d?×PŠ=çQñ½ð5|?Ç¡þ½»¹Ø¾ÉYd?;Q">}AK½p?èÀ2½+ ¿vÁ8?¥-Ö>üp€¾È™f?\uµ>5—¿ ?/i?¯éÙ¾Ní$?G«"?†q×½•-N?&S?G>¼#[?²õÔ>¡T¿¯!à>iá²>L¿ùiü>Xq²>sIE¾ès?J}¾éð¾ü¥}?ÈAI½<ö³:ö}|?4¹(>òéq>·ÓZ?Ñ‘ì>{Á>Pm$?[Í*?÷9þ>ý…þ>k'6?üP?‘cG?M¾>1??™ñJ?åAz=ës>óWx?K!P=úоÒái?Šž‘ˆ½ìt?1•–¾í€‹=û=}?'¡¾Ïe>ñw?òú=xÕÃ>›K?æåð>3Á°½Óùl?m‘¼¾…A½ë9y?ÁÉf¾¬=ú ?²€‰¼0¹!>ñ/z?:‘>S±¡>Ñ•d?FE¤>WÑ¿=ß‹s?-A–>Ÿ!Ü=½^?åEö>ÀA;=»ï\?Ç?WAŒ=n¿8?\W0?vqK>®¹S?›?d±µ>=e?oK4?µ©Ú>ŽÉF?Ü)í>s‚¶¼ô7}?'¡>C1<îCv?­‹>q‘;>ì1u?Ô¹b>ÎÅß>¼]_?¨q_>^G0?77?¥¡Î>ŸN?,?‚\=¬U?jõ­>À]Þ>ù/|?ð1ø=‚ù½%‘½öï~?ÁF½®­<ð?—ÿ;~Q¢=ý/?TáOº¥S>ê“x?¾Á÷= y>ü9}?SB°<éah>ö·x?&Š=}A«=öï~?Tá=¥1J>î=x?=)¾AR½ëWv?¹ˆ¾Øa|>Íåf?kµ¾mÿÊ»¦ÕT??¿Rñ¿½è-v?ýøƒ¾àA½ù{?|™8¾Å‰;Ö~?u‘½©Á´¼ö ~?¯!ø½ê!Z½ž?¨ÿ,¼ßQs¾ï7v?ù0 >i­¾ä¿p?a½¸¾·³_?@‰§¾>ë¿‘cK?záN=> ¾ôÅz?)¾HÁ¾ê“x?… C¾|ñ¥½ò³y?‘ÑQ¾ŠÉK¾Õ•k?M¬¾|aÒ½Þ!q?L©£¾†‘¾½éÕp?G妾ga¯½Þn?y]·¾£¼½ÕYi?¨5;qè¼à…m?zm¾¾£!c½áo?e²¾ré½õey?®IG¾Œ¾ìÛu?ÇW½¹¥Ý>Óƒf?eá+½‰ ?—áK? Ù¾ª X?¼‘á>6­œ¾/ý?dÏ.?¼­ä¾§­U?~á½>¤qоM$?){?Û¿°qY?;m>³™Û¾i76?¿Iã>W ¿¾g\?ù@>ãÝñ¾~QB?5Ã>¿³³X?éD> .þ¾“ýG?œÅË>ç5ö¾Ä¯d?º¡é=ɑ޾Œ-H?¢ñÌ>ߥô¾·{]?wI,>ÓÙñ¾õ'¿Dš>›‘I?¹ ¿s¿>gï4?4׿Ëá>OW+?6!¿=?S¯+? ¿é ?aÿ-?òíõ¾+?U(?û•þ¾*?"§?%!¿ëû>K?q5¿à½ŸUR?*«¿‚œ<» ^?ùþ¾B²<ÙAi?µ©Ò¾ü„=Ý{l?…AÁ¾™ê=Ï£f?¢EÖ¾i>ÙN?)A¿i>ÙN?)A¿˜À­<…œ>ÑÉj¿ñIw>;Q¢>º/[¿e®>‚Ç>g'7¿h¯2?¢Bõ¼¸â¾M?Ùξ>À:iq2?i‹7¿nÁÒ<{/:?`‘/¿Î‰å>°qÕ>œiJ¿â±ï>Áåá>‚ýC¿Qõ+?tÑ@>wi7¿a/?>A">oÙ5¿®ES¿Èyo> •?}u=¿[%,?í¼½U×¾¨ÿT?g)¹¾÷=“G?>%¿Ü¡é>ç?k·9¿\0?mÉ:>oc3¿Ä'a?£YY¾¼Ú¾®eZ?îÑk¾ã©ï¾µ‰[¿HQ'>û±ù>qË;¿V×-?Ä@×¼}=·¾À±_?]‰¨¾¦Ñä=­S?ù ¿æÉí>5{?HÅ'¿v©=?µÁY>H#¿º½`?§%¾¼Y[¿ca8>ÞU÷>t#<¿_›-?È(ºK¤¾Åb?m­¯¾É!â=°uU?s ¿¯µß>:=?V*¿iÃ1?Å€>S—,¿Æ§d?¤qX¾¡1˾½§b? y¾må½¾k™8¿_y0?#¡½]᥾¹3[?œù;šA|=”ƒI?8¿¡IÊ> # ?… ?¿q¯4?¡IB>V·.¿Ñ;i?ÒQn¾b-®¾Qƒ)?ò i>vÃ6¿Zõ±>Ô}ð>½O¿G";S#,?}y=¿Y’>ÓMê>­‡W¿zây½T7'?3A¿éo> Ñ?©ÛQ¿1a´½c5?`3¿A‚⼓‹E??©"¿YÁ§¾¬US?áA뾉™M¾Ýëp?=‹¾ôÅö¾·³_?+Á‚=š}¾Þ¯n?Ɇ>Gqž¾hë4?HÝ"?Ja¾=Ä%c?ÑAç> =Ü?•€<õ0>Êùf?¤¥Ò¾lé±>T&?aÝ,¿mA?Uƒ>4K¿DÛ%?\!,>ƒ1>¿ícu?«ÑK¾Á‘P¾Òh?…¾Uª¾I…©>æ]q?νÕAî>˜¥I?¤©Î¾ §M?å™÷>má±¾?bg=ÿ!}½µ©â>­W?Re >DÃ?—«G?!«½†“D?7ã?|Ñ>>Åe?Ãä>vÂ˼ñ/z? >Uù.>%Í>VI,?_)/?7á?6¯? »?Í•e?é™n>€À>PQµ½:Í?•G?Àía¿Š‘¥½Ü)í>«íV¿žyY>ü?·}[¿ô¨>þ}þ>Æ3d¿F™¥>F}¢>LÇ(¿„+@?ý .½›O¿aUµ>äð>ƒ…?¿b«>+Á?qY½¾ˆÙG? õ¿ˆ…ʾ€ >?m ¿zm:¿`?,?ï8¾o4¿j32?ü8 ¾³ÍU¿'ù™>ÎÁë>›WQ¿^½²>åAê>‚@¿S“(?b|½¯ W¿%É‹>æð>¥ÙT¿”‰;> E?‚@¿S“(?b|½°ÿZ¿¸Yl>×Qí>¾ƒ[¿Å‘g>Йì>”‡M¿$Ñ‹=5›?ØÕä>²õÜ>Ž•H¿Wé*?á‡>^2¿§ÉP?5a >ù¿Yk(?ºùf>kï7¿…'D?,bø=H‰!¿©¡Q?sK=(a¿·]X?â !½ q¿Ñj?>A"=ª ξÌÓi?•‚î<—áϾٙn?!! =i­¸¾M-#?^¹>>we?¿Ê©e?Ú{¾vÝ»¾'¡”>×il?]€>»€¼ÐCi?œÝÒ>ð1h¾ƒûA?@£?!‘–½Hû#?Ž­C?!‘–½Hû#?Ž­C?Ô}è>¶MÙ>‰H?èiø¾C%?1??¿éað>Y3.?Z,¿'?'?Çg¾í+s?Æá\>³AÞ¾‡M@? ’þ>A¿a©2?vá·>¾ú¾Ä%_?g€‹<ÒÉ=ëýv?Ú©y¾”‰G¿&û?ó9w>)?¿¬7R?É{½Xÿç;ÊÁd?ÅÉå¾§ ¿­U?ú` ¾=½Äy`?Úqó¾âéí¾»ï\?²¹J¾™=±¥[? ¿x)½¾É¯c?ʼn¾!k=«uR?"ÿ¿TU¨¾ÇÕ`?s¹±¾*þﻚ]K?1y¿ƒ‰¿¾­mV?œÅ˾§]P¿M ?[y9>¥»O¿­?`±&>‹7F¿5 ?a>të5¿n4?z»¸[¿ŸÉN>óô>³V¿»ÑW>«?©‡X¿îÑk>óYö>¼­\¿OY­>{Á>d“0¿u;7?ªaß½ˆB¿G;&?s‚v½Ê5律¥D?âYê¾ïÉó¾„ó=?Ý™ñ¾º1ݽe«/?l%8¿<Ù ¾|;?X+¿l=»>§×>¥ŸT¿µÁé½oñ4?g·2¿vÁ ½nk7?\q1¿—UÐ>­¥Ð>GQ¿‘™G?~á=> ¿¦ïU?ƒ1¢½ ¿û>?"rú=O‘'¿½åÚ>ôQö>…íC¿f¡]=ˆgA?F#'¿™J? >()¿†ý>{?r‹5¿¾ùÝ>?€-?¿ÒQî>ò ù>sI=¿ a?%?Oç*¿æð>.W?Xÿ'¿’éH?øP>1C¿†­A?Ü¡a=KÍ&¿ˆñF?öAV=D‹ ¿–?K?Za=;ÿ¿Œ+J?'1>/M¿!•?%?4¿¿œßP?AI!>g¿Z+?Sͬ>ZG)¿Ùék?ıî=‰™½¾Ùék?ıî=‰™½¾¾K]?ïÅÿ>>"f½“?uË6?Ü-ñ¾þœ?%±Œ>¥ŸP?£¼=-Ã>Ø}k?h±D¾ú)~>às?±ÁÒ¾má¹>¤ûU?=¿úat>£!S?uÇ6¿¹>H'?¹á_¿zx>»ñÖ>‰ÏA¿%>5'?ÁÇ\¿"’>» Ö>ŽYJ¿4½?,”<ãqù¾‹3B?¿}ݾ®ÕZ¿I„>À]æ>Œ+J¿kI7>'3?—ÅL¿.å?uo=¤ÅM¿b1:>*?‡á?¿Q'?òÑâ½O¿î>&«?›WQ¿-!?jÂö¼/N¿€à=&?§‘R¿Y?®€½ §Q¿rì=!å?ªÓU¿Ë ?܃½­Y¿†‘>>ýþ>¸X¿K?FÑýª¹T¿) >; ? ¿cµ1? âü¾3¿d5?Üõò¾ ¿q96?ìö¾¿p}4?ý1ý¾í¹ü¾l#:?íEô¾Â‰à¾‰ B?ã5÷¾s;¾eq/?am4¿€ñ¼>vÅ´>¹\¿Ž±C¾cÑ0?e‰2¿œM¾GU'?tÓ:¿R¹9¾Fy&?sÙ<¿ÆQé>Gu¢>£åT¿§%Ö>,—>»Ñ[¿ƒ5Æ>T²>¸•Z¿»í^?’¾Ž‘̾±O\?¯™\¾ÝA쾫“S?7Á'¾á ¿ÎÁc?ý‡¾v¾¾òµ÷>“9Î>ŠåF¿¾/b?_a1¾ÂÁÞ¾î±ô>›­Ô>†!F¿Õëf?’AN¾—qþ½Ý>y­¼>¡½R¿É«g?šyB¾yå¾’ÍÅ>HQ§>¸Í\¿Ñi?sÙ(¾‹m¾§•Ò>•ñÇ>®ÕR¿ëýr?Õ!w½Cž¾âéõ>ÂmÝ>ŠUC¿û±}?°Q=öaý½½qò½ÁS`¿íñ>³Aƽ¯íY¿ I?Mƒ"¼¯}Y¿×?3ÂÛ<”M¿+¡?zá®=LO$¿{Ù:?ÚÉp>m½¾°ã[?d=µ>Ÿ¯M¿^I2>(»?«E¿u‘B>;9?¦EQ¿;,>! ?Ÿ[L¿-‡>“ ?X(¿Ž­Ï>@Û"?ÑYæ¾2¯?R +?÷ ¾¶W?+?þd„¾^K0?^i-?]Á–=’I?BA?WA>Ì{h?‚‘Ç>ga¯>‡§C?Ý ?1#?n÷2?t ¿>@¡^½ù?݃=ޱÓ=Ååd?Ç ß¾gï0?B%?qÀ¾,~?Êáó=\;>Í¡>Ü-q?Ôa彯‰ß>µ[?é>´ÇW?íþ>±ÁR>m4?n…4?á”=žµO?)±?Á‘À½öëv?‰…>#=å—q?7© >ƒÁÕ=­mZ?ªEÔ¾8õ¡¾î!á½¶ƒY?¿€ ½›uN?%¿;m¥>"5?{Ý>¿E©>ç?‘CL¿oÙ5?¶Ï=fO2¿F$?«!ñ=ƒ5B¿²×W?†9A¾ã¿-P?ÀyQ¾y ¿·?K‘,>¢µN¿@‰—>é™î>°qU¿”¡*½”OK?<1¿õŠ>Çeä>±QZ¿@Û?3Ã?òµÿ¾@Û?3Ã?òµÿ¾kG9?Ra(?¨©U¾¢)O?ÿ²?"9‘¾œQ?,ƒ?ðP”½· _?¦ Ó>!Yˆ>~o;?4÷?W]§>ì½ð>žû>~©;? ¥Ó>k1?/?€4>.?‰ÑG?l!¨=o½:?V×-?-¾]‡.?Z×,?¡¦½ºKZ? ?.>ªET?ø÷>%u?€ B?1] >?§çU?b¡6>¯ÑR¾ìx?ù0 >Íâ¾ÁÅ^?Ö`>ùh¾ät?j1(¾¿«]S?ÃIj¾ÒqÕ=´çZ?¿@Áż«•Q?'Ý¿ zÿ>ß ?\-¿æYñ>m?pa5¿¥1R?2q‹½'¿†ËF?ó–¼;7!¿‡ßA¿:W ?w1=>¿–I?Ì=£#U?u ¿¾½Û>%•?n¡3¿˜kI?!5=>—¿m«9¿ŸÉÖ>» ?«AT¿­?rÁ)>_ ¬¾Ù{i?á™p¾®í=²õ\?õ¡û¾tÑÀ>@m ?a¥.¿i=?WBw=Zƒ+¿¢›Q¿Õ‰> Í?£=¿B]$?„)J>•)F¾åv?€@¾T—=Ï1d?Óõä¾81”>H7&?p 4¿ro:?µÁÉ=_›-¿©¿R¿*Å–>æyø>Hß ¿}“>?ºùf>øP¾ú%z?Q1.¾´X;Íuf?¼éÞ¾Ïùi>[C)?pë6¿q«4?0¡>g1¿~«=¿ˆ€=Z¹+?”ÁM¿;ý˜>µ?$Ó¿˜§K?¼YS>†Y8¾íIt?úat¾WÑ/¾º/[?ãqù¾øp‰=Hk$?†uC¿1·?U15>F¿aS3¿ÂÁÞ¼m6?ŸwK¿Oé > å?\ç/¿m7?™>Ɖ߾–AI?¸éß¾ …ˆ¾˜½H?"q¿øp‰=Hk$?†uC¿j‰µ>1•?o:¿›L?Èap½2ç¿rk:¿’@ƒ¼ge/?… C¿þ´>9™? …ˆ¾˜½H?"q¿.U‘¾$+¿ŠsD?Z¹/¿§yW¾b12?… C¿þ´>9™?™¹P¿i¹>¿Eç>\ç/¿m7?™>u±=¿J·%?]Á6¾u±=¿J·%?]Á6¾w ¿[Í.?ýiû¾Ë¿V*? ¿JÑ*¾ŒÙF?2u¿JÑ*¾ŒÙF?2u¿–]È>-¯?o¹6¿j‰µ>1•?o:¿Æ‰ß¾–AI?¸éß¾³?\?m9'¾ä-÷¾V .?)y>]á-¿õ½~?’‘³½Ü:=âss?Dùš>1Ñ€½¢)O?ÿ²?"9‘¾í»z?9ñ•=„a@>Éãe?–!½Â‰à>yÌ»&Q>ûw}?xAD>*‘”¾Þp?ºÚ¾%‰¾´]?Ý‹¾Äéä>» Z?a3¿¾Á÷=gE4?Îé¾Ð a¾±¿\?RÓ*¿‡Áü<€>?W ¿¹QT¾¡¿P?(Õ–¾·¿”3L?¹ÁX?Á‘p¾éeô¾vÿO<¿ª)Q?Á¾ß¿8i?9µ›>vÁ<¿²Z?‚ü¼×¿7U?~©·>xï8¿²+]?ßÀä<µ¿@¿?YQ³>dÏ2¿Éqg?ォ Ú¾JÓ(?*q•>iW1¿Æûe?_);¾£u̾J›"? T>yy>¿ÀYj>N'?jg8¿Úqc>M¿$?s;¿,)?¤áT>ˆŸG¿¯ÑZ?¬‘]¾ð…ñ¾¯[?}‘@¾ïåö¾4?ìQh>“G¿³%[?^¡/¾ý¡ù¾0)?Ôl>¡C¿· ]?8I¾é÷¾:[?øÁy>{×@¿º^?ñý½ßõ¾H‰!?¯™\>†Ç>¿Ï/f?)¾ª Ö¾H‰!?¯™\>†Ç>¿Ó-g?î!a½ºÚ¾G"> A?®+V¿jz>ûéÿ>¢³T¿{i:> ºý>±iY¿{i:> ºý>±iY¿¹QĽüýz?Rñ/¾8Ù>Ñçk?sñ·¾.?/ý?#e¿<õ?Óè>E¡%¿’M?8=4¹¿³³X?2ɾþÒ¿.?/ý?#e¿Á©o>ÇÙ`?±iÕ¾’M?8=4¹¿­…Y? ‚G¼ ï¿"S?M ?@ù¿±‹V?‹Á½k ¿Òx¾ø7x?vá=¡È¾Ï‡g?F±,>¿žÑR?¢ñD>O¿™¹H?5‰>MÙ)¿YÝ.?DMœ>> ¿TW*?£åÐ>¤mÔ¾Éça?¨c>-¿’H?P§>e ¿ˆiC?€ ¸>#I¿vm7?˜ùÆ>Ô ì¾¹«[?êyg>å¹ö¾¥‡U? e‰>i5¼¾âm?|a²=~å¹¾×Ùl?‘Ñá=¾õÙ¾¼=`?ìQh>Ieª¾àq?þaK=U¡©¾àGq?ë3=8ež¾ìis?Në©í¾§éS?PU¡>0Ÿ¿^ñ0?¹QÜ>Y¿XÉ/?×mè>Qù'¿= ?õ?*o¿I-(?àMï>FC"¿+¿?¯?O¿?@?«Y×>¿¿oc3?òü>±ÝÕ¾¬ãX?`¨>¥½Ñ¾¹ûX?Y¥¬>Û‰ò¾ L?y•½>‰ ʾ¼­`?=‹>œɾÆ3`?©>|e¶¾Ë+g?äÙu>u‘º¾Ì]g?ÆÁe>z¹¾Ôïj?eQ(>Kç'¿"?ëáû>tï5¿§ÉÌ> '?@‰¿ý?#Ù?«±Ü¾¥½Q?‹Á>”‰K?±Œ=5C¿Éãe?–!½Â‰à>B?~½¾f»2?P‹)? “ ¿¥?–³G?Á¿=¹¦>uÍ—‹L?1?¿ìÁä={O=?MK(¿:!>€}@?W—'¿Ež½„»C?LÇ$¿« ½¹9Y?Ñ•è¾Ýо³ V?]¿¼±P¾¥1R?2q‹½'¿Q?){¿4¡ ½©½T?úµõ¾ í¾¨SR?±¿üq{¾³³X?2ɾþÒ¿”‰K?±Œ=5C¿¦ß½n‡6¿bM1?ø‰s¾'‰¿‹§F?,-¿Ùn»–•N?MI&¿*á©=}yA?ø‰s¾'‰¿‹§F?Yû/¿—qÓ½h8?¨ÿP¿óÉj>­?lw7¿a‡>L3%?ŸWL¿/§?bù#>€·@¿¸Yl>>Í?”¡F¿='!?;á%=©K¿b~>!s ?«ÏQ¿Í ?i1>¸\¿™)]>éÑì>¡T¿Q ?úð >Äy`¿Áä>RÑ8>M¿gK?+i•¾¿ƒmD?:¡¾—ǽy¿´ÇW?%¿à0‘½¨ÇR?—ǽy¿´ÇW? Á&½ýh¿Á7]?¥¿>!¾ OP?íV½«¿­KY?4ƒ¿¹á÷½Œ1H? Á‘½+¿¨T?J›"¿'¡¾ëB?Ó ˆ½‰¿¦™R?T«'¿€ñ<¾p•;?Òɽ/û¿•ïM?S%&¿º1M¾ß;?…Ñ̽&¿›WQ?Ió#¿ŒiV¾€'=?:A»½+ ¿¢CT?¿_¿ôQæ=îéò>ÍWe¿òö=«éÚ>Ëig¿­¡Ô=·aÔ>Ag¿©Z¾Š‘A?ÄÑa¿õ >×mè>"¥¿yéF¾Ÿ‘L?ÁS`¿Ðaî>ì¡ý=Ìce¿£Ø>) >Êb¿éÑì>¡Ÿ=ÉWb¿½Æ=Íê>É«c¿Ú©é>Áã<ºg]¿ùÿ=ôùø>³µZ¿]?/ÂT=¸åW¿aQ1>7?‰³F¿9µ?—‘º=‚;D¿Å­Ú>à…õ>Cs¿qÉ9?=Ѿß¿x·:?~ɾ¾!¿oó:?„Iɾ÷!÷¾“ÿI?ˆ…¾MIž¾Ìci?‰Š¾ âü¾»›[?)>»)U¾øy?µÁɽ³±Ò¾Ì'c?U>0¡½Ø?qS¼ ¼Å©b?Ðíí>?>Øi?ޑľ‚á¼=­÷S?• ¿á½~ÿB?D¥%¿‡Q°½{K9?[A/¿|ñŽq!7?g)1¿y±Ð½g+7?_í0¿]½€c??Ts)¿rý»;‚ýC?G­$¿¾ùå>jK1?}¿£åØ>HÅ?V(¿›Î>_ ?x%=¿†9É>ëö>‹©H¿•Ã>ßÁç>¢AN¿ù¼>×Qí>¤5N¿¡IÊ>îéú>’çF¿Ùë>y?vù:¿ˆD?:­£>7¿ŽçC?±‰L>?§¿ùH?Á‚=A¹¿›ÉK?\…>Y¿êuó>™?s+8¿ŒÛH?›!Õ=>u¿¥»>¥?‘'E¿žEK?^¢z=1Ó¿•µI?_bl=5ï¿Cq'¾t'8?[Ó,¿é ¾\,?r1:¿iÚ¼q9?X90¿Ü-é¾o4?# ¿Ñ ¿]á1?ãÅê¾#‡¿Á>?tµµ¾òéñ¾|=?øÝô¾ŸWL¿/§?bù#>M¿õ‰¾¢_O?üQü¾)±“¾ž'R?ÿx¿¨©U¾¦U? ¿U?Yù-?îAH½çQñ¾Âma?­À= ¿³ÍU?B±µ½ K¿µûY?~©/¾²à¾Çóa?ø„¾"á¾æ;t?ÇÙT¾k¹³¾Ø¹i?C=â=ý3?#¢X½ö¾óu}? µ‘>5ˆ>×Ãk?þH>Y?ŸR? a•½Ü ò>ÈÍ`?X‘±>i98?/û?}=Ç>¼uæ>œ¿M?B™?FÍ?ô©ó>  ?•·K?±>äÙe>ë§s?ºV>ŽF?>Y!?=a =!?¨sQ?qèæ­r?}@ ¼9Š>Ókk?3’¾à-è>†Ë>?ç9ú¾ŒgD?‰±Ä>{¿ŒƒG?$ï? m‰¾"ý?’]I? ½†¾_Ñ­½¿±ùX?… þŒƒC? i¿M(¿u‘>?ÙAå½E-!¿ K?(×?«íV¿žyY>ü?0Ù>pa½þï|?¤K¾ÿ°…=óYz?ç9ò¾l!=»_a?RI¥¾å)k>Ð k?>%¿“©R>}yA? Åʾo½¶>¸“X?kG5¿QÁ©>G“?¿éað>Y3.?Z,¿'?'?‰ÏA¿%>5'?&5¿P‰¾ŸçO?c /¿"©¾Z×,?q¾dç5¿jÛ0?9¹¿Jy¥¾y‘9?á¾s¹5¿[C1?()¿Qݬ¾>?¬qö½}Ë<¿\*?˜MȾèùû¾”G?=‚›<_)/¿{Ÿ:?#Ù‹¾ò ñ¾±ÁV?l!¨½Ñ¿©iS?MI6¾ß5ð¾Âm]?ý Ž=N'%¿ŽÉB?ŠU˾Cž¾¸=]?å ¿Ûi{¾‘GL?io8¿¡¸½`0?³V¿»ÑW>«?¸[¿ŸÉN>óô>Ÿ ¿‚q0¾¥£P?o¹6¿¥¡F½jÝ2?©‡X¿îÑk>óYö>¨Ú¾ƒ¾» ^?(·¿,a ¾L?£=¿NBé<_Ï+?¼­\¿OY­>{Á>» ¿I¹+¾ž'R?†9Á¾2š¾Ç/`?ù…¾¨qϾÄ?`?©¾Ý î¾Ä%_?öa==4¿¿’•K?ÝÑÿ=5 ¿•ïI?œQÓ>be4¿'½?œQÓ>be4¿'½?ÝÑÿ=5 ¿•ïI?ãQê¾ä1s¾´W[?X©,¿³@»¼yç» Ö> >`=.¿uÉ8?r1¾>y¯:¿&?¹á_¿zx>»ñÖ>®ÕZ¿I„>À]æ>Œ+J¿kI7>'3?Ó…ð¾P96¾¼W]?¤ÅM¿b1:>*?O¿î>&«?–=Ѿ8- ¾¯{[?/N¿€à=&? Åʾ=a¡¾ÁÇ\? §Q¿rì=!å?¾…å¾+Ý•¾­5X?­Y¿†‘>>ýþ>¾…å¾+Ý•¾­5X?ª¹T¿) >; ?Ý;툾Ç+`?i= ý¿´é\?gñ¢= ¿´‘[?"Á”=[ ¿®T?"Á”=[ ¿®T?d!º=S ¿¦U? >Թ⾼;b?i宾Ù9¾Ól?q>­ÁÛ¾ÌAd?U‰ª¾„¾Òh?†©=>nݵ¾Új? µ?¿Rc&??1¿D‡ ??1¿D‡ ?â±÷>;9¿?!?ë?¿¿[[,?ê•ú>3 ¿]0?»Õã>k™´¾ª·R?m±>\!¬¾ÄC`?}[@?ƒ¿aUµ>x >?™¿€»>b¡2?"Q¿ ©×>wi7?ƒ ¿²ÙÙ>qq4? §¿÷ø>Lá)?"o ¿ü?$—?Y‰©¾v7??:±?Йì¾F[!?êÍø>Ã)Û¾ŒC?1??á}í¾Lý(?µÁY?y¿áŠ=²eY?k¿€aÙ=²eY?k¿€aÙ=½o\?ó­÷¾&9 >¸•Z?æ•ó¾X>²ÙY?ÕAæ¾ÑŠ>ˆD?§AѾüÅü>ˆB?q´¾ý ?ÎÁc?ý‡¾v¾¾¾/b?_a1¾ÂÁÞ¾Õëf?’AN¾—qþɫg?šyB¾yå¾Ñi?sÙ(¾‹m¾ëýr?Õ!w½Cž¾Éég?#…’¾HÅŸ>û±}?°Q=öaý½Ì d?.Y•¾mU²>,~?Êáó=\;†@?—UȾ¹?Ì d?.Y•¾mU²>™×M?¦ Û¾«]Ó>ÒQf?,¹š¾RE¡>ôS|?=aI½5)%>óçw?Mƒ"<÷!>å—q?7© >ƒÁÕ=´ÇW?íþ>±ÁR>ËŸg?má9>‡5Å>1#?n÷2?t ¿>iá6?~á½>2å?ga¯>‡§C?Ý ?Ñ!è>½QÛ>˜H?]Á–=’I?BA?R¹)>Ú9õ>¼­\?þd„¾^K0?^i-?Ù ¾ñIw>ññu?—å˾}>É!b?—å˾}>É!b?!‹¾gñ½å'u?C1<­‹¾åEv?$Ñ‹=’­Î¾Îi?Ïe>÷‘ó¾®»Y?Ù o>Ñ•ð¾·ëY?Ù ¾ñIw>ññu?ƒ‰?>,ñ¾ùÙx?R¹)>Ú9õ>¼­\?ÏIß>HÁ¾Ãcc?š™Y>ž±Ï¾Í“c?˜ÁÐ>٠モáH?°9×>× ¿oó:?˜ùÆ>C¿ƒ£D?÷ü>é ¿Z,? ?v5Á¾w>?êÍø>Ã)Û¾ŒC?Ñ!è>½QÛ>˜H?\å-?¿¹_¾hY3?I?ú ÿ¾R_*?&ß?«¿J'"?¿?m¿K&?1??á}í¾Lý(?1??á}í¾Lý(?†@?—UȾ¹?y?:?¼•å¾ é?¹K?ƒiȾ҉ì>•×F?Géš¾#g ?óçw?Mƒ"<÷!>•×F?Géš¾#g ?óçw?Mƒ"<÷!>ËŸg?má9>‡5Å>™×M?¦ Û¾«]Ó>ÒQf?,¹š¾RE¡>Dýž¾:Í¢¾ÆQe?m±>\!¬¾ÄC`?y?a‘¾©‡P?y?a‘¾©‡P?‹©D>½å¾À{_?‹©D>½å¾À{_?ÔV¼’uоÖÉi?m±>\!¬¾ÄC`?u‘2>U…®¾Ý{l?)±¾y•µ¾Ð)l?)±¾y•µ¾Ð)l?%•¿Á¾œ5L?ÔV¼’uоÖÉi?¦EQ¿;,>! ?«E¿u‘B>;9?Ÿ¯M¿^I2>(»?Ÿ[L¿-‡>“ ?!‹¾gñ½å'u?X(¿Ž­Ï>@Û"?ÑYæ¾2¯?R +?öëv?‰…>#= ?v5Á¾w>?»í^?’¾Ž‘̾¶½]?Êÿ¾'ƒ#<±O\?¯™\¾ÝAì¾Ðïc?ÎÝæ¾½á~½«“S?7Á'¾á ¿á m?xA¼¾K!°½“G?û¿+¡“>¤ÿM? Ó¿!Yˆ>¨P?c¿‘>¿?(+¿J³!?ç?1Í¿C9!?¦ü>0e¿LU"?Á£=ë¿­mZ?Ù™n?!! =i­¸¾ñw?N¹"¾U¾ù/|?ð1ø=‚ù½Ô}è>¶MÙ>‰H?¬U?jõ­>À]Þ>´^?áA3=êý> Åʾo½¶>¸“X?;ÿ?²ò˺Œ¡H?iá6?~á½>2å?‘J?ðýý¾e9¹>û}?:é >öa}=ûY|?o€¼EÙ+¾ŒƒG?$ï? m‰¾ŒgD?‰±Ä>{¿ŽF?>Y!?=a =ÓÛk?™‡> µ‘>b¡.?„aÀ½w¡9?¦ÕP? Á¾u? ]?¦_=ªñR?›!M?{Ág=6w?/‰“>*áI½òÏt?B™?FÍ?ô©ó>}=Ç>¼uæ>œ¿M? µ‘>5ˆ>×Ãk?Î9X>/á°=ê=y?ìÁd½ö`‚¾î#w?ìÁd½ö`‚¾î#w?)•¾Tq«¾É!f?4¡™¾Aa˜¾Öh?P5¢¾€I¾º…^?#¢X½ö¾óu}?)•¾Tq«¾É!f?ÇÙT¾k¹³¾Ø¹i?~©/¾²à¾Çóa?P5¢¾€I¾º…^?ÆQÙ½¹ ¿¨ÅT?ŸYB>k3¿[ï/?ñÝ=Yý-¿k·9?Ž!À>Hß ¿ak.?~©/¾²à¾Çóa?B±µ½ K¿µûY?ÆQÙ½¹ ¿¨ÅT?ñÝ=Yý-¿k·9?­À= ¿³ÍU?Ž!À>Hß ¿ak.?oñ¸>¿{??%=?7¿'Ý?"Ç?9µ¿% ?{3:?L"¿a‡>?á?N¹*¿°Ù>_™·>LÅ&¿N%+?îAH½çQñ¾Âma?_Ñ­½¿±ùX?€¼>g4¿0G?KY&?dY4¿#’>‹3B?A»¿“@>«#S?¿à=Íçd?Õíä¾s‚¶¼íGr?Ù‡¾“q<¾‡F?E-!¿X>=Œ½C?E»"¿ÆQÙ=Cu?}ç;¿‰Š>l3?^g+¿ø€>—Ç>fù6¿0Õ?—Ç>fù6¿0Õ?:A»½+ ¿¢CT?…Ñ̽&¿›WQ?•-Ò>y‘9¿ ?l3?^g+¿ø€>—‹L?+Ù¿¤áD>Ð_h?¹9Õ¾/áP½Æe?­ÁÓ¾q‘+¾™-I?:8<=I¿›ÉK?\…\å-?YÝ*¿(-œ>®aÞ>i©8¿ ?Òɽ/û¿•ïM?Ó ˆ½‰¿¦™R?Ð)è>jM7¿ Û?D÷$?kc4¿= ˜>‰aG?1[¿ÅYa>áEo?G9¨¾%é ¾—qG?7q²=Fí¿N+%?o/5¿(E“>{3:?K‘(¿ŸéE>Õ³h?}•¼¾}±G¾„A?§Añ=Na%¿d0?j¥4¿mq->ÊQd?žÑξŒ1P¾“G? I>>Y¿¶-Z?èÙô¾ÒY¾ŒÛH?›!Õ=>u¿žEK?^¢z=1Ó¿¦ÓV? Ó¿©Áô½•µI?_bl=5￵‡]?ÛMð¾fÙ3¾›L?Èap½2翳ëV? û¿1¾¶»W?Ì Þ¾IM£¾…é??K(¿,¨=‰%A?I'¿Zñ=R '?nÁ:¿”ÁQ>??†ÿD¿—qC>fi·>¬7V¿¶õÓ>=¹¦>¾1\¿ ýÈ>¦ß½n‡6¿bM1?&?ž{O¿b3>qÿ5?cí3¿ˆ€Ã<´wV?Þñ¾)y¾q«4?0¡>g1¿1·?U15>F¿šAP?ØEñ¾iq®¾ro:?µÁÉ=_›-¿&?ž{O¿b3>OË'?/A¿û@òd•.?v3;¿Ã:<¥¡N?g ¿õ¡{¾˜kI?!5=>—¿†ËF?ó–¼;7!¿BÍ$?}‘<¿¾1T>w¿:?b/¿¢<šéN?“¿ ¾_Ó+?nm5¿«y^>†E?Cq#¿e(¸•Ö>Y)¿Cu?w-Á>~ÿ>¿o ?–Au½ ¿°ÇT?¾(¿›M?Îé¾Ð a¾±¿\?W ¿¹QT¾¡¿P?‡ÁÄ>…{E¿Ó?(Õ–¾·¿”3L?c™®>°U¿Çõß>.U‘¾$+¿ŠsD?=¹¦>¾1\¿ ýÈ>ºÚ¾%‰¾´]?Ù`=Ó-ã¾Ï×d?…]¼>Ë¿Œ1D?Jë#?AÕ¿Û1í>šµÄ>àMレÑK?xAD>*‘”¾Þp?’‘³½%…¾é)v?/‰“>*áI½òÏt?¿Ec?}ɾÜIt¾Ñ±g?]᥾)¾â9o?z‰1¾<-Ÿ¾ˆD?:­£>7¿ùH?Á‚=A¹¿ŽçC?±‰L>?§¿ Á‘½+¿¨T?â­ó>qU5¿ q?U¿&?oc7¿ €>`;,?x™9¿3ù>íV½«¿­KY? 1?b1¿ E?l3?[y-¿¶Ùh>sK7?T­-¿eQ(>€B??É!¿@Ù$>‹J?'M¿TÉ > Á&½ýh¿Á7]?ã?Mõ(¿¹?y=@?:¿Ôae>—ǽy¿´ÇW? ??v7;¿Æùã>•F?8-¿ÉYX> ??v7;¿Æùã>b£4?`é,¿Ÿ9[>—ǽy¿´ÇW?ø‰s¾'‰¿‹§F?¥Ï>¨S¿¡IÊ>ø‰s¾'‰¿‹§F?Ô}è>¶MÙ>‰H?OË#?€ŸA¿2q >žëO?,g¿Rñ¿=w19?M÷&¿ÜÙg>¿}å¾lw7¿Å? þ¾bó-¿O ?Óùð¾b¿/¿"ß ?ðñ¾pÏ3¿¡?±OX?ÞÞ= ¿´ÉY?Á­½Ç¿ý>È]ä>}??2=?É ?- ?Ô}è>¶MÙ>‰H?î•ù>l%8¿öaý>S¯+?K"¿•µÅ>£­R?¿â9k>Ôg?§=Õ¾pA¶=§•R?[ ¿{¡@>âr?S‘¢¾7Q‹½ÑAg?µ5Ú¾oD½ëx?u9E¾>Y>-“¿oE6?‰aǾ˜H¿"á?Õép>-“¿oE6?‰aǾ©¾#?¯W¿u95¾@ÿ„ÓB?Âñ=V·*¿uYH7"¿z¥@?W±˜½¡¿´åX?t™J>3¿ŠwD?èÁ]½ Á¿±¥[?oñ@>O‘#¿ë>?y±°=w¿®ñY? U‰>=¹¿ @?Zz>Í¿¨WR?“Ë>PÃ#¿M…(?5–>Gu"¿l7?ùö>b3¿ %?§AÙ>k·5¿ë?çmì>Ve+¿$ï?È ë>R™&¿1Ï?²Ø>_µ.¿+Ã?U1)?f»2¿ÙŒ>N—)?]¿,¿V}¦>NÕ%?Q£(¿‡áÃ>0ñ?k+2¿¶-Ú>“ãJ?9µ¿û@2=˜ÛM?'Ý¿2Ÿ=ŸuM?&¿ìÁä=”G?0¿W &>r=?,e¿4ž>˜ÝÃ>m2¿7?g?L"¿ ³?1™š>FA$¿p}4?¢ñÔ>Eƒ ¿I(?½§b? y¾må½¾Ñ;i?ÒQn¾b-®¾Ê©e?Ú{¾vÝ»¾Òh?…¾Uª¾ícu?«ÑK¾Á‘P¾Â¿`?sõ»¾?U>?bg=ÿ!}½ñ/z? >Uù.>eá/? ¿Ýµô>Ï¡ì>VE(¿9_?C9©>`,¿U¥)?C9©>`,¿U¥)?$¹Œ>lí5¿OÉ%?1…>Wí*¿e2?4I>X;.¿vq7?\É>O#)¿y… »>× ¿ˆó@?… »>× ¿ˆó@?… »>× ¿ˆó@?«=Ô>`3¿,õ?«=Ô>`3¿,õ?b¡¶>ga/¿J—"?˜‰R>7Q¿©G?.ç?KË$¿ —?0-?; ¿·?ù>4»¿A!?M…¨>±Æ¾À_\?Ù!~=ƒy¼ûy?;á%¾œÁO¾ë7w?yF¾! =õ÷z?èùs¾ú¹q¾Ü)q?•Ž¾Ü€Ï¼ïÇu?‘ñX¾Y¥¤¾Õ?l?ŒÛH?½Þ¾¾Ýâ>Yk,?x%¹¾B%?ñ¡ü>ÜÚ½¹û\?eá/? ¿Ýµô>0-?; ¿·?ŒÛH?½Þ¾¾Ýâ>±¿X?™ê½?1…>Wí*¿e2?5–>Gu"¿l7?u?>:‘ ¿“A?Zz>Í¿¨WR?ôp‚=›¿¨áW?¥¡Æ=Á‘è¾Ì³b?Âj½Ðaæ¾È#d?´uؾ¾ºƒ\?ó!ø¾üà„¾²ÕU?¯ W¿%É‹>æð>P°½ÿú¾¹O^?2¿»¼±Ø¾Èíg?A½Öï¾Ì b?[A³½ËÞ¾Ñue?™Í¾)!¾¾_?³ÍU¿'ù™>ÎÁë>*‘½- ¿ª»V?¡5½;¿´¯\?â=÷¾>±Ž½Ás_?›WQ¿^½²>åAê>E-!¿ K?(×?šÑ?¾Ó¿ ûR?+½Ž¾#I˜¾×Ái?j‰­¾}‚>ËÕg?Gqž¾hë4?HÝ"?•Ž¾Ü€Ï¼ïÇu?j¡4¾'ù‘>Ü-q?PQµ½:Í?•G?U‰">X©¨>ÝCn?%Í>VI,?_)/?Aï?E>|Ñ>?7á?6¯? »?Í•e?é™n>€À>Îýe?éñk¾‰a¿>•Ž¾Ü€Ï¼ïÇu?yF¾! =õ÷z?j¡4¾'ù‘>Ü-q?Ù!~=ƒy¼ûy?U‰">X©¨>ÝCn?ñ¡ü>ÜÚ½¹û\?Aï?E>|Ñ>?±¿X?™ê½?±¿X?™ê½?ŒÛH?½Þ¾¾Ýâ>±¿X?™ê½?u¿81œ¾œOM?u ¿\q±¾‡ÃB?© ¿}yÁ¾…}??¥ÙT¿”‰;> E?°ÿZ¿¸Yl>×Qí>¾ƒ[¿Å‘g>Йì>*‘½- ¿ª»V?v.¾A ¿ŸYR?•Ž¾Ü€Ï¼ïÇu?+½Ž¾#I˜¾×Ái?v.¾A ¿ŸYR?v.¾A ¿ŸYR?<ö³º7á¿‘ÓK?œQ³½ÿ–¿µ7\?9¾ ¿¤UU?*‘½- ¿ª»V?‰A@¾ñ¿­§V?P°½ÿú¾¹O^?Ò^¼:Ë¿—SJ?ôp‚=›¿¨áW?u?>:‘ ¿“A?†q×½•-N?&S?¯éÙ¾Ní$?G«"? •‡¾°åÝ>ºƒ\?óý¾©Ã>ãG?ú >/5š¾Ý•q?(µ>­¥Ø¾±‰\?Á>žyɾËMh?k¸>ñÕþ¾íI?i’>â9ë¾®EW? ?‡¿K«)?ù¾¿n1/>¬ãX?vq;¾É¾ñ y?oñн©J¾í™y?ú >/5š¾Ý•q?°uÙ>w¿uË6?+ù?3¿+?w+??«¿³EÚ>c›4?óuù¾¿?¼`?«íÖ¾è¡v>¥‡U?DQ ¾Äyè>ë7w?½©h¾y>‰{H?ƒ¿HÁ£>Ä%_?º1å¾~L>Ä%_?º1å¾~L>Ü×i?…™¾¾J)(>Ü×i?…™¾¾J)(>î³z?4¡©½€ñ<>ÔCl?­¡=‹5Ä>I¡$?qŠ>og7?mS4?-µ¿­iÖ>šíJ?K¿mÅ®>‘J? ¿OY­>¸‘^?ìQð¾<Ù>-_?Õ¾¾nM:? ‰P?ès¾y?ý?Î<´q\?Vñ&?Ra¬½zß@?ý?Î<´q\?Vñ&?Ra¬½zß@?+/?|a¾k4? ?úì¿cc.?1?*ý¿SË&? ñ ?ìmû¾^Ÿ-?Š!A?L©«¾&s?C ?ͱä¾HÅ#?C ?ͱä¾HÅ#?°uÙ>w¿uË6?Ø}ç>åíø¾‡m??<õ >‹¥È¾´U]?ªIÐ>Ýéö¾›F?/Q•¾0)ž¾Ï½g?C ?ͱä¾HÅ#?(µ>­¥Ø¾±‰\?‰Ñ3>%Í—¾ÛQp?”W¾Ý f¾æ•s?si8¿@Á…=]Ã0?œSM¿)!˜=)±?×Qi¿Mõ¤>ÿƒ>5Aœ>‡¾¾Ã}`?²eY¿<Á>= ¥?ãp¿$a>¯ I>m?!¿0½?.q?)é¿)?•N?fþ¾JE£>’]I?'¥¾‹ ?$?U15¾ÛK?$?U15¾ÛK?<?§Ͼ_³,?Ýéö> ¿`=2?”÷I?¯yÕ¾Øç>ô£y?“QE¾¦ß½í›s?Îq¾„)J>õóv?׉[¾&©><?§Ͼ_³,?ðy?w¡9¾B!>”÷I?¯yÕ¾Øç>÷[?LQŽ=0‚F¼çu?q9>¾ÂQb>ëWv?‰>IE=î³z?4¡©½€ñ<>¨ÃR?þµü>u>ðOy?Tw¼Ùég¾úAy?ãqñ=¹G¾÷[?LQŽ=0‚F¼°©W?l]º>™a˾²»\?¶Û>о¨UP???a¾ëWv?‰>IE=;S ?•F? œ=G>¼#[?²õÔ>Æýß>ds5?"¥ ?ä¡o=qs6?gñ2?oñн©J¾í™y?ÌAÐ<- ˜¾â[t?<1‹=rmÀ¾Ñ•l?…¾˜Á¸½íït?6"X½BŸ¾íõr?A=q;ÓMj?ô1>ǹ德³[?çk>Ÿ=Ͼȕb?ÿ?ž)̾[???É->#¢ø=û[z?ä¡o=qs6?gñ2?þò½Ui+¾üz?HÁ“½h!1¾ûu{? •‡¾°åÝ>ºƒ\?#ݾ?>çßr?ä¡o=qs6?gñ2?I¡$?qŠ>og7?Æýß>ds5?"¥ ?¨ÃR?þµü>u> •‡¾°åÝ>ºƒ\?óý¾©Ã>ãG?#ݾ?>çßr?…¾˜Á¸½íït?ÔCl?­¡=‹5Ä>Êka?oI.>½qâ¾óý¾©Ã>ãG?ù¾¿n1/>¬ãX?…¾˜Á¸½íït?oñн©J¾í™y?¯#Z¿§uË>mY®>Oé$¿+Ù!>‚‘??r‰7¿æ!ë> A?ù¾¿n1/>¬ãX?5—¿ ?/i?ïqþ>ýú¾g›7?a‰7>~ážԙg?u‘2>U…®¾Ý{l?Uù®¾ÌÓe?-A޾*þo»ö]}¿;Q>ëx?u9E¾>Y>?» ¿QK'?’M?8=4¹¿€?€?€?€?©Û=à¡à>b÷=wã>Õ>=·yã>Öä)=êçå>nÀ'=Ì(æ>NÒ<=fNç>Õê+=†Žå>NÒ<=fNç>âYB=ª+ç>NÒ<=fNç>À_L=¸ç>âYB=ª+ç>e£>°=Òà¦>X´=ak¦>b¹=FÓ©>È_º=ÔEª>DPµ=Eh¬>é¹=7ã¬>ëªÀ=ï ¦>>"Æ=2<¦>ZÔÇ=òÑ¢>Ðï»=d:¤>‹‹Ã=“¦>K!Ð=¡Ú¨>( Ê=ÉÈ©>¬Î=Í!©>°pÒ= ­>nÝ=©©>PªÝ=8ƒ¯>Ü¡á=ó“ª>íƒÌ=õ¡«>þEÐ=]ûª>.çÒ=ž)¬>“oÖ=&q®>øÙ=ê¬>ŽçÓ=¨Vw?Á§Y>Ûmw?z¦g>#No?E½`>"Žm?–n>k¹c? h>.Ua?äŸy>CÿX?Ÿtr>l=W?7P€>j†P?²F}>ž{O??‹…>RaH?c‚>£!G?…‡>=»D?éî‚>=?B”‡>b…??X¬>CÊ;?ÚU€>Å8s?¡w>ê"i?79|>Í‘]?ò[„>JïS?ú›ˆ> 4L?p ‹> D?MŽ>‰9?Øï‘>Ø3?ÿZŽ>‚»™m? `‚>ŠÍc?©†…>$Y?î‹>JÎM?âv>€»h?y±ˆ>˜M\?nQŽ>´ªe?Öá>ô£Y?‚ʘ>H4Q?ÆÁ•>¼‘M?"Çž>i©D?§u›>m®B?c ¦>ñK9?ý§>Ï:?ßá®> —0?U÷°>€¸3?¥¸>·—(?=µº>´,?ÂNÁ>z"?•ÕÄ>~5+?|Ë>K”?¾ö¼>Í%?â²>ÿ³.?„ð¨>³Ó7?W˜ž>¡g??õ¢–>vR?Þ’´>P$?_šª>xÐ,?m¨ >g*4?òz˜>n‡?ÿè«>iÆ"?“s¢>*?窙>ÑÏ?Ó¡£>Z ?9d›>±N%?–&•>Ó)? Þ>^-?±k‹>%Z6?9‡>aû-?¯†>$2?£ €>º¤.?ys€>ް?oœ>Pß?á›–>î?€>u#?PÇ‹>ú—$?Hþˆ>êX%?r6…>ÑÎ)?«Ð€>y?&?Ü>4?ÍçŒ> ?ÖU‰>Xs?ã†>#ó?7‚>2Ì!?áñ}>û?vq{>ä?Þ;Š>µ?Cdž>Á?5aƒ>Œ?A¹}> ?h"|>6­ ?)&‡>6W ?‚¨ƒ>,d?8Û|>Bë ?_^€>¡?aˆ„>íñ? T>¦d?‹…>KW?]€>¼#?ÿ•…>‡¨?…^>yW??…>:?=¸ƒ>šAü>ž„>T©ù>È‚>Gô>ßn>)éñ>Ø {>Üdì>mS|>÷wþ>™J‡>÷÷>Vó„>B¯ï>̳‚>ë«ë>S„> ªå>Q¾€>Šá>ƒ…>ègÚ>ƒ>Ö>PȆ>PsÒ>JD€>LýÌ>阃>FÌ>{¡€>aˆÄ>‰ ƒ>¤Ù>é¸z>l>Þ>C}>â>u>@Kç>èŸp>Q1î>ú›p>ÚSê>Ô i>ýôï>Õm>ZØë>$Ed>·Ñð>åAj>aì>ú›`>bñ>nd>þaë>BX>èƒÝ>…w>·aÜ> Ct>¨ªà>ˆŸo>‚7ä>Ìëh>bHæ>iWa>›Ææ>™ð[>ÃEæ>ÚW>}ìæ>YQ>â“Ö>Q/x>ðmÚ>mq>AÔÝ>Y¤i>µà>dY`>Ñâ>ãW>Ÿ>â>8¤Q>â>$ÔL>‘™ã>&4I>¼\Ô>KVu>TR×>¾m>¦Ú>Ù´b>Ü>“W>fkÝ>ølM>+øÝ>/RH>ÊâÞ>G¬E>%!á>÷D>:yÑ>Hjq>pÓ>TUh>žîÔ>Ž@\> ŒÔ>ÀvP>¨Œ×>ÙÎG>>—Ù>5C>¥ Û>ƒàA>{Ý>_^@>-éÐ>TH>.=Ò>'/B>|ÑÖ>•Ó>>bIÙ>G >>-Û>¸<>µTÞ>]ù<>žbÝ>{3:>{¿Ñ>Lý<>†Õ>®-<>f„×>UN;>ùƒÙ>.9>ÿwÜ>­¡4>IÓ>ñô:>m8Ô>%:>º‚Õ>2®8>O×>ïŒ6>Ñ<Ø>Y63>VØÜ><¾->•ÔÙ>Ìc->ÖUÑ>çû9><ÝÑ>Û‹8>×Ò>/6>CÔ>(Ñ2>:Õ> ã.>Ä ×>ÅW+>•DÎ>p˜8>¶ÛÎ>°¯5>ÁÏ>ðü2>ú*Ñ>y]/>hÎÒ>³@+>ê@&>aoÊ>­k4> [Ë>P1>¤Ì>\“.>LÎ> f,>x`Ð>/…'>àÑ>g#>+lÆ>"Œ/>´Ç>r,>عÉ>Ù *>ô©Ë>˜£'>¯ÒÍ>þ $>†Ð>Ñ?!>?WÃ>¦*>Å>ø'>OÇ>æ“%>Á;É>’%#>+5Ë>ç >‘Í>I†>?qÀ>nN%>åšÂ>=_#>ÄÄ>ØE!>Y¾Æ>bK>ŠèÇ>dÉ>!ÊÇ>Ë¿>z§Ê>DÃ>»îÅ>î!>™¹È>¾À >ŠÌÄ>û >£"¾>ÿ– >€œÀ>5 >;ÅÂ>ˆ>J™Ä>†>š Ä> >šíÂ>ç>aàÁ>™ >ÌÐÀ>ò >0hÁ>G>{÷¿>¾1>{ô¾>îC>cÔ½>| >iļ>[³>Œó¿>±3>XY»>N>uȽ>¢|>e6¸>NÕý=v3»>¸#ü= š¶>ï’ø=Þ°½> T>Çe¼>"‰>+Áº>‰µ>Ϲ>oŸ>àc¸>Ô >37·>ãn>â´>"«û=¥O³>"ø=;¬°>…ø=¿Ò¹>S>>´¸>ÙÍ >æX¶>Ì^>˜Lµ>Ñ>ˆ€³> Èþ=.9¶>¼A>4.´>5ë >Òp²>4,>78±>†<>c°>pÐþ=,¶±>ÌÓù=«®>Wêù=M„­>Ÿö=Í®>&Æò=>•«>‡Àñ=¤9²> Í>=ׯ>¡h>S!®>A>ð­>I>³(¬>+4>ûª>”¼ú=‹Þ©>ªÒö=}v¨>ÎRò=`é¬>\v>èÀª>k>¿ ©>d >&û§>Ûû>ä§>>&>ƒÁ¥>[ þ=ÃÖ¤>ú=qv£>Ù&õ=§>ãQ>œ4¥>¡ø>k`£>š >ò ¢>i>ë > >özŸ>rP>iŒž>–x>K;>EÙû=ßú >iý>ÝìŸ>9>Üž>¿Ô>àœ>uw > ê›>–¯ >‡š>™c >åa™>P>iª—>@£>ö&ž>hX>À°œ>U¾>÷ê›>ˆ>ÖS›>ð¿>40š>Ý—>X©˜>z8>És•>%ì >xD•>ÏJú=é ™> í=ž –>S²Ü=Xœ>²žÚ="rš>™ºË=¶ž>HkÌ= >B|À=! > 6Î=¨ >Î=Þª£>È\Ù=;T£>*WØ=î#§>öß={‘>=˜>YN’>é=Ñê”>E*Ì=hz™>Jп=Þv™>v2¸=oKœ>œü¶==dš>kï³=ެœ>„‚²=™Ó>ù¤=÷ž>ž¬=åb¤>ü9¥=zmŽ>Cò=¦ð>Ø=ïX”>RÂ=â!”>˜¼=ìM”>“á¸=Câ–>4ô¯=ã>Yä=kØ>8Ó=V™‘>5 É=´:‘>%êÅ=S’>&ÿÓ=uä>£:½=½pŸ>Öáè=Žv¤>_´ç=ž§>Bwé=轩>øâë=®>†sí=Ôž²>¨ó=Lij>júì=%[µ>q8ó=û¶>Àï=¤q >’±Ú=$ £>{öÜ=¸¤>~:Þ=Hj©>@0ç=Gª¯>ÑÎé=ðP´>Gè=_¸>âZí=´Ë§>'Þá=ÑϬ>À®æ=ݱ>úaä=ý´>±Oà=ó¹>xœâ= Þ¼>nï=R·«>s+ä=Mù°>Z„â=²¹²>‰zá=Çd±>НÖ= ô±>ª-Õ=©i¯>vSÊ=ïþ°>Íß== ¯>hXÌ=JF®>?8¿=ÖR¸>¼zõ=?:½>Šè÷=þœÂ>”†ú=- À>cÒÿ=&ÄÄ>h >ìöÁ>Ýa>d[Æ>^>R Ã>ð¤>­ÁÃ>ŒØ>5д>±¦Ò=³zÇ>x¹>Rî6?ƒ¤>óã§>¯=4Õ£>rN¬=÷<Ÿ>Ëf®=$H>c)²=à>Q½µ=´>¤À=à>Q½µ=´>¤À=¸ž>N³À=¸ž>N³À=´>¤À=; >s½Í=àež> À=øm >)Í=У>Z€Ö=¦*¥>¾…Õ=Ö­¦>©¼Ý=#¡>—WÎ=t´¢>7pÇ=LŸ>6çÀ=7Rž>U£·=š@¡>ûº=;ÿž>´=_ÏŸ>±´=™Ùß>K@>m9Ÿ>nN%>ƒl¡>”Û&>F§>Å>—á§><&>ni­>‹>;¦®>b¢!>ܺ³>”¼>#ƒ´>*Œ>¨Œ·>g>@„¸>o¼>á&»>nÞ>8L¼>ïp>¢ï¾>mä>)¯õ>XYk>eõ>ér>³·ô>è¤w>Šrù>\r>¤ø>ÈEu>$Õ÷>Ex>`éü>5x>Šú>!±}>£‘ÿ>%|>8öü>ì€>Z,?g×}>¹ö>Á}>Ã-Ÿ>¼,>weŸ>µ¨/>¹ß¡>)\/>0¥>ñð.>0ת>~V)>øR¨>—u/>à‚¬>·,> ª>t¶0>8 ­>¾h/>J¶ª>!°2>l[¬>ç¨3>ûs©>Ò§5>E»ª>I¢7>ƒ¨>u“8>™©>4¿:>¡f°>ZG%>[ï¯>Gu*>û±±>kc,>2°>F•1>"´>K/>*p²>Ñ;5>uZ·>J–3>ýµ>Uß9>®ƒ»>[C9>»>kð>>€~¿>‹n=>¨³>>v'>Tȵ>Çó)>ù£¸>´.>K¼>Y‡3>«’À>&:>Ç*Å>GV>>{õÁ>}C>üâÊ>ÖýC>8ºÊ>ÊÁL>ÎÅ·>œÛ$>Áq¹>Ò(>œ4½>ªò->Ô»À>„Ù4>â«Å>±ù8>"áË>¾=>פ»>«u">¼?¾>E'>ðÞÁ>Ù!.>LÂÅ>~Š3>-`Ê> a8>:]Î>5F;>ع¹>×g>¡Ùµ>ÈÐ!>yÎ>?ÄV>DÂÇ>†!R>3pÈ>w.\>”÷Á>¯%T>D¥Á>€·`>ã6º>µúZ>ع¹>£g>`±>µÞ_> p²>\8p>¬7ª>™„k>솥>_Ðr>ün¢>«\h>}ž>!o>k'Â>ƒMM>¼”º>ÀN>¨Æ³>¬áR>¨>ïÇ]>$|Ÿ>œŒZ>>”¨>(òT>…é«>(cL> ¼³>`I>$c­>¢ëB>Wд>ËA>%ͯ>×Ú;>»> LG>Ÿ=Ÿ>¿µ3>È”Ÿ>05>òD >œù5>&ÿ£>5>P§>$ 3><0¨>)@4>ÐC¥>„~6>³µ¦>Ÿ=7>ì¡¥> '9>ù¿£>¡Ÿ9>h$¢>Íu:>zpŸ>¾;>Ù§>Ý A>‡Þª>Ò«A>37§>zûC>ß©>¶jG>š ¤>!èH>'Ü£>Œ¿M>,Iž>¡¹N>Ísœ>z§R>ù—>9+R>ŠÌ”>XuV>–[¢>ò"S>Pp™>§¯W>|˜•>èi`>¸±‘>DOZ>S{‘>á~`>% Ž>”O_>gò>óf>{I‹>¤Ãc>N'‰>v‰j>ꕚ>®d>Â¥“>‚i>ðÛ>h>b0>”øl><Œ>Íxk>ë>ïÆr>•ï‰>’q>­£Š>Ã.z>zp‡>+x>A‡>À‚>¦˜ƒ>ã3>1Ï‚>‘_‡>E~>îC†>„·w>ÞVŠ>´É‘>©‰n> ¥>w‡t>æ>Ö{>Ü׉>½q‚>;Æ…>ˆ>A)‚>'¤>]ü}>CÿŒ>²‚> »>î&x>-‘>fiw>(ž“>NE’>ZJv>y®>Jy}>1aŒ>"ƒ>ú¶ˆ>ÅŒˆ>Öª…>l”>Hpƒ>H‘>»Ó}>8‡“>=Ó{>ðÚ•>Ë•>+O€>â>’>&„>€‹>5 ‰>'Ø—>S‘z>ߦ—>ÁV>ùŸ”>û­…>ªH>U¡‰>ÅS>O±Š>ªD‰>®ºŽ>Çñ‹>ºÙ>-˜ˆ>÷Ì’>‘šŽ>”>€'>ì•>²Ô’>¯&—>²e‘>ÊT™>Ê–>g}š>ªc•>û‡>Ôe‘>‡2Œ>×Ù>DŠ‘>ó8”>é`•>š—>°W˜>6­œ>>$œ>h›>Å©ž>ƒ/¤>L¡>Ô¹¢>@Þ£>zT¬>zQ£>õº•>fŠ>l”>+3>‘&–> î’>æ™>x}–>¯>ž>xò™>µÅ¥>ótž>t˜Ÿ>j1˜>·b§>mœ>Tþ­>†t >aUµ>}Î¥>Â¥³>ä¨><ƒ¾>^Û«>>²>Ê«>2½>㦮>§»>¼v±>œÆ>0ñ¯>‹3Æ>‡¨²>¶.Í>þ'¯>>³Eš>ÿ®¯>vã>—·>E»¢>#,Â>É=¥>,GÀ>ô¨¨> ƒÊ>ùª>%\È>0Ø­>’±>“â›>Fи>9ÔŸ> ×Ã>{Ú¡>ábÍ>“¢>]ÃÌ> §>kòÔ>u£>&äÓ>ßP¨>(ôÚ>î%¥>)$Ù>_|©>,à>‡§>Ï-Ü> *­>åÑå>æÍ©>¿˜Ý>EI >¥¢á>ˆ…¢>Ié>7£>~äî>—§>¼ì>û¬>Ì`ô>Ãdª>¤ªñ>ü«¯>7û>Ñ®>öïò>måµ>—ü>´>£#ù>vŒ»>}?È%¶>æÎô>‚6¡>¨ö>CŽ¥>Q.ý>Œd§>8M?Û2¨>Âû?\“®>= ?–˜§>i ?Ó‡®>ƒR?3£§>qt?vo­> þ>B•¢>¹ý?Ó¼£>‡Ä ?Do¡>YÞ?y@¡>ÔC?PŸ>zÿ>[Bž>Bø>~þ›>%ï>>‘œô>€·˜>Yë>%w˜>û#ô>J´”>¸tì> ú’>åÑõ>”m>Ä{î>‹Ž>–“ø> ýŒ><.ò>Íæ‰>i?g|>,ý>öÔ’>zªû>§[–>¤4û>‚™>œ2ÿ>œøš>©ƒ?9d›>Æ ?ÓÚœ>Ö:?ÅÈš>ÂP?÷=’>å&?G•>!?˜h˜>‰$?^¼—>Χ ?³Ñ™>Ü ?PÈ–>¨Œ?Ä“•>Œ£?lé‘>ä‚?b¼Ž>ǹ?Ot>á ?*‹>ë7?´””>µß?á&“>¥?yê‘> 8?éí>nÚ?'>ª ?©‰Ž>Çd?) >aÂ?û²Œ>×û?#‹>Ǹú>ÞåŠ>‰Ó?äŠ>ÆÜý>Åʼn>$€?¿×ˆ>ŽË?×mˆ>Zñõ>\vˆ>Ebú>2ˆ>ì>| ‰>9^ñ>¸…>· ç>œ‹‡>õHã>jM‹>7¨Ý>¬r‰>¹8Ú>œÃ>iRÒ>àŠ>oÏ>qŽ>[ÑÆ>ýõŠ> (Ä>çŽ>×Q½>âtŠ>aû¹>7Ž>áµ³>–vŠ>Žæ°>•>->­>‚©†>×Ü©>^Ÿ‰>eQè>UûŒ>»à>³>eÂ×>J³‘>§ìÌ>{’>j4Á>üß‘>†V·>z8‘>B´®>6s>P§>#÷Œ>ä¤>,¶‘>©¼å>œS‘>°Ý>õò“>…Õ>ÂÙ•>'/Ê>ƒP–>5³¾>²+•>ølµ>•Ò“>)@¬>79”>ª>‰ð—>¥ã>{ù•>ÏMÛ>-˜˜>‚­Ò>Áªš>ˆºÇ>ññ™>ëŽÅ>PŒœ>MK¼>˜>rS»>z›>/P²>Ë‚™>rüà>*›>njØ>€¶>²Ï>Ÿ>¤áÄ>ÔŸ>óº>…>Åäå>Bž>–¯«>ø;>/®>R,7>ir©>ªò=>Mg?%²‡>Ž?W³¶>¨T?]Á¾>Y¢?¨§¿>"r?ëqÇ>è ?»EÈ> §?•Ñ>éš?f½Ð>ÞÉ?ÖáØ>ã?}Ú>Ìz?”Ùà>%w$?Ãõà>9d#?‡øç>%°-?Õxé>Àu?¹ãµ>äƒ?˜¾>ú)?2Ç>*q?3mÏ>„ '?Ã~×>ÇF0?>Êà>4h8?4ë>*¨4?¨sÕ>Šsc˜C?/Âì>ÊÄA? ©×>[ H?¹qã>ËeO?Ø‚î>eJ? ø>¢*V?£°û>‡S?ݵ?³Ò`?Æk?-]M?‘˜Ø>$T?ä>us]?)ëï>ãâd?1µý>è½m?¶?ÂlZ?’×>€›a?áaâ>5^j?…?ë>‹¤i?Œòô>%ér?é¸ò>.Êp?w1ý>U¦x?Ãõø>ü4v?þ}? ¢Î>“b>$šÈ>çSg> RÀ>½¨m>ö Î>€ m>ýÈ>1q>æ¾>j¿u>Róµ>aPv>Ê·>Ïh{>ò¯>éÖ{>€a±>‚S>3«>€>Ä“­>C<‚>ä¨>„>}éÅ>fúu>Ûj¾>¢D{>ݶ·>ùö~>G³>Î>ù÷±>õ0„>;§É>A-v>NFÅ>Oçz>ƒk¾>÷~> ˜¸>µÆ€>®F¶>ø©‚>ìi·>>%‡> ÂÌ>. t>°pÊ>,¶y> `Å>9›~>„¾>cÕ€>ö¹>;‚>æ’º>"ÿ„>&Ï>Åâw>ÑXË>S}>°VÅ>à×€>H3¾>CW‚>ûè¼>e«ƒ>šÀ>!ʇ>¨àÐ>…˜{>5^Â>÷…>²›É>yɇ>»F£> І>Êú¥>Ž‚>õ¡>!„>¤¨£>ÁS€>Òûž>€ ‚>lΡ>-—}>p>>aŒ€>4¾Ÿ>µúz>wŸ›>ÏÚ}>“Tž>ãâx> ƒš>¸Ít>ÏI—>«Îj>Ó/¡>ÈzŠ>˜1>Äíˆ>ƒœ>µÅ…>Mžš>¼²ƒ>Öp™>’–‚>ÍW™>iqŽ>E×>/¨>Åãš>Eô“>ë9¡>ZÖ•>ùõ³>ƒ5–>dÊ÷>×QÅ> zï>ZÙ¾>Ï¡ì>'Ç>Ý}æ>åíÀ>ôkã>”/È>ÁUÞ>1{Á>j£Ú>ÔbÈ>VGÖ>XÁ>×kÒ>ÉÈ>EÎ>y[Á><„É>]‰È>¯ Ç>¥NÀ>ðÛÀ>.Å>¦ò>wöÍ>óZé>ãÁÎ>¡ß>¸xÐ>µÖ>‰#Ï>aSÏ>6Î>OÎÈ>r¦Ñ>׿>ÖÈÎ>5Á>•}×>ñµ>jOÙ>èº>àžß>aýÏ>æÉÕ>ò•È>"QØ>þœÂ>gÒÞ>ës½>„ä>¯µ·>€›å>·~º>ŸWì>E³>uæ>ݵ´>“oî> n«>¢~ç>‰±¬>“Uñ>ØE¡>´Ué>ü¢>-ó>~´>˜Üà>(›ª>cAá>èN >Žâ>j•>.ã>ÄB•>î–ì>—‰>îvå>œ¤‰>›Zî>º…~><¼ç>Y5€>>[ï>¯Íf>é>»Õs>"ð>øŠ–>ô>V+‹>(õ>‡j‚>¸õ>_x>•ô>W´i>¥¢ñ>§ên>5ô>ÿwd>…_ò>Ã[>“í>«Ð`>œ‡ë>ùJP>”Âì>ÀPŒä>ÍWY>ã>YR^>¡„á>Sè|>ƒ¿ß>CÈi>Ø·Û>Týz>bgÚ> Ùi>Ó…Ø>^Øz>j„Ö>`Yy>KéÑ>š™‰>é€Ô>K=‹>ÊSÎ>ÜœJ> Rå>˜ŠM>õ»à>Ÿ’S>ñ.ß>eSN> Ý> S>ÚÝ>,R>¦Ú>«Ah>Š[Õ>j>àÒ>sk>kfÍ>‚ÿ]>#KÎ>O­^>kË>EƒD>~Í>c€D>B•Ê>!V?>öÊ>jKM>ÂlÚ>îµ`>wJ×>4žH>†ÇÖ>ýøK>›Ô>[™@>0Ó>uæ>>¾úÐ>W"@>!ÌÍ>nh:>»FË>”L>>à¹Ç>ux8>òëÇ>š`H>8 Ý>Ë¿F>ïËÙ>™ž@>‹3Ö>²×;>¿dÓ>‹;>ŒÑ>ä;>VÎ>-ê3>yYË>ãŒ1>\sÇ>—,>ïÆ>@<> àÕ>Î¥8>‘cÓ>%t7>3Ñ>6V2>4HÑ>Þ0>Ö­Î>„ />‹¥Ð>š•->ðÏ>fƒ<>)$Ù>ÔÖ8>xÔØ> ü8>ͬÕ>ÓÚ4>ãáÕ>­P4>ùÓ>ú›@>9^Ù>`X>>êXÝ>Íä;>¥Þ>d8>´èÝ>¡õ@>ÿ’ä>…ï=>ƈä>ˆƒD>òêì>Ë,B>½ãì> ±J>GËñ>º2H>E‚ñ>¤oB>H¤Ý>ÅV@>Gà>B±E>á>*ÇD>‰ å>ËH>Níì>¬O>Åò>ž^Y>„gò>i§6>’”Ä>Q.=>|Ä>Ø<>[êÀ>ÁC>—®À>pÏC>zà»>ïO>.8»>êP>?·>„ðX>ð¢·>Gve>T8²>Â¥s>äL³>m¬t>±>´¯„>NG°>"w>%®>z‹g>kš¯>ÈzJ> Å²>“9F>“ȶ>¶?>vù¶>YO=>ϼ>l?9>~5·>óè6>’;¼>Cr2>ä¸>åC0>ÿ\¼>‘Ò,>2ɸ>Ò¦*> ¶¼>r‰C>×ú²>þµ<>àI³>ù.5>®¼´>¯@T>êv®>9?> G°>Xÿ7>H¨±>ûÎ/>’tµ>(2>×K³>¦—(>2µ>¾L4>¯z°>m,>j¥°>¼7>»Ó­>lË0>òÒ­>Û6>𤋮>׈0>{‚¬>qâ;>ÅŽ®>A›<>“­>J%<>c›¬>#ó8>–ͬ>÷X:>wI¬>áñ=>(ï«>íš@>Ú«>ãÅB>K¬>†9A>¨ß­>c A>Ò«©>’@C>¸±©>øÄJ>!v¦>ÓOH>1Ϫ>*þO>Ƨ¨>wG>l´¬>E×U>kE«> í?>œÃ¥>f½H>(`£> 8P>DÁ¤>£W>Cp¤>zmV>§>¨>å€]>ÇÚ§>¾ù]>¸«>8¢[> 9®>4òi> ì¬>9Ñ^>Öý£>5 n>6Φ>÷Êl>KZ©>{‡k>8«>x%y>ty«>‡…>¸­>¨‘>Ÿ"¯>„>*‹²>/2‘>ÿ[±>£‘>kH´>3R—>Õ³>&ý…>O«>¦D’>(eª>Óô‘>3û¬>ŠU›>®> {š>Y†°>Ñ< >/ˆ°>œ>ñ¹³>—á—>ä¡·>ø”>²·>Ì”>1”»>R`‘>¢)»>eÂ>Î6¿>>…{½>N%‹>iå¾>PŒŒ>¥…»>É>æ$¼>å&‚>lz¸>[´p> ¹>ÅŸ>ãþ³>²H›>lµ·>®Õ–>ú¼>§\‘>;ÇÀ>âÍŠ>]¨Ä>)]Š>d­Á>¢›}>eÇ>«”~>Æ…Ã>>Bm>†ŽÅ>õ.n>¾¿Á>øüP>í™Å>ªž>&Å·>ºKš>36¼>hç”>ÇIÁ>Á>¤«Ä>PŠŽ>¸éÇ>]6Š>ªÈ>R||>÷[Ë>,dž>[D¼>š>û"Á>§—>ÒÃ>aÿ•>{MÇ>~”>9îÌ>éñ“>‘ÔÒ>¡Û“>‰a×>H‰> …Ø>ž)”>LýÜ>íØ >y‘Á> >5ÓÅ>›Æž>=_Ë>«^ž>w¡Ñ>ŽÎ©>\«Å>ª)©>3ßÉ>à¨>æÐ>û"©>?Ô>œmž>¡Ö>#Ÿ>ÚÛ>‹üª>ÂNÁ>J´´>c^Ç>‹Á³>7PÐ>Eª>½qÚ>vP‰>j3Þ>VÐ>dé«>:\Ó>¯y­>líÍ>.s²>³#Õ>, ±>|šÓ>øÅµ>ÏhÛ>†u³>ÊjÚ>ܺ>"râ>ˆ¶>˜â><¼>:;é>6ê¹>žšã>¼"°>ô‹ê>¢)³>Q0#>”¹>5_>%É»>2>[î´>ƒ£>#h¼>3Ý >Qlµ>6ì=ªž¼>\<ü=G¶>tCÓ=.t½>„šá=U4¶>÷Ã=hê½>¼ZÎ=”/¸>2¬Â=Ê1¹>Â>h¯>‡á>Ð|®>Pß">ôo¯>¨>¬>I)>•ð¬>Ç/,>I÷«>ø>«>hË >ýج>«° >A,«>üp>³í¬>%ë>|«>‘òó=c ®>ûò=(H¬>TRç=$´­>‰Óé=üQ¬>áEß=g™­> ã=fh¬>>\Ò=KÊ­>c`Ý=²f¬>ž&Ó=x&¬>þ·ò=½p¯>jÜ=°>©Þ=¥f¯>ðÓ=#i¯>ÄË=<¤°> WÇ=È—°>G ¾=¿a²>`̶=̘²>Òü±=”.µ>B]¤=ML·>⬨=?¹> Bœ=c%¾>í»¢=nQ¾>M™=rÄ>åòŸ=¾Ä>X£='LÈ>ÃJ¥='‡Ç>t˜Ï=×M±>êÂ=Nc³>Pü¸=™´>í±=y·>F]«=8º>éï¥=íf¾>G£=ÔòÃ>c¹¥=§Ä>¸x¸=…϶>†±=ظ>êx¬=”úº>Ä”¨=T¾>Í®=¯"»>NÔ²=Psº>˜MÀ=Ða¶>C¸=Þ¹>¹Ë=ÿ´>Ù•Ö=Ra´>4¬=Iº¾>ð¯=Ü»¾>zų=›«¾>&¹=A~¾>ùµ=·—Ä><-¿=ŠÌÄ>;T³=íIÈ>èº=ËÉ>µP²=N¹Ê>ïÀ=ºÝË>rÀ®=$FÇ>6®=VcÉ> Ï«=HàÇ>Ò©=#óÈ> ª=ˆÊ>½ª=NcË>[Óœ=É>íô£=ô‰Ì>î±”= {Ê>ØÔ™= áÍ>s°=k™Ä>]­=ÁÄ> ô©=s„Ä>Ùé§=ž–Ç>vþ>cÒ·>½ƒ>Á7µ>°:r>“àµ>½‹W>Õ̺>ZœQ>‹Ý¾>ÂQ>þ Â>ÙíC>q;Ä>=GD>hÇ>“P>¥É>#õn>-½>’?€>æ À>‘¯=ÙÎ> Å²=r1Î> ¹=a‰Ï>ŽÁ=Ã×Ï>ŽÈ·=ÉÿÌ>޲¾=•ÓÎ>¾KÉ=Î>ÛÏ=¦íÏ>þÒâ=·$Ï>p°×=@/Ì>ý¡ù=È[Î>ù„Œ=EÅ>çâ=•)¾>÷éx=H©Ä> €=Þ¾>'b=¹4¾>Ñçƒ=s…·>*pr=:·>Là–=º0²>BÒ‡=t%²>Í ž=FA°> ¼“=p°>˜ü¯=‰™­>‘Eš=©¿®>ŸÌ=]QÊ>N*Z=·ÕÄ>iUK=–¾>…DZ=K·>ÆQy= 6²>’y„=mW°>q©Š=Ë®> S[=AÓÊ>×ÁA=%Å>à?=Ǽ¾>±J=ç·>•ži=‡²>˜úy=àH°>2==’w®>o?=Ë>†3=mÅ>ð‰5=|Ѿ>Ì&@= þ¶>Cp\= ‹±>d=u=ϯ>Ház=…[®>M,0=¿dË>±Þ(=cEÅ>à‚,=>̾>|)<=ˆ¡µ>åì]=Fz±>7k= æ¯>F"t=Ú<®>þHQ=ç±>D…*=cò¶>"=“Ⱦ>>•=:?Å>”4ÿ<”ÂÄ>ÌÏ =a4Ë>Óhò<¢Ê>*=Î>eU=niÍ>"‰= {Å>.=#eË>Á#=)YÎ>Î$=À\Ë>u-=ënÎ>ÿÎ6=uÎ>4K=¯Î>flh=¶Î>XqŠ= QÎ>˜•=£ç¶>S®=Á²>©gÁ=³˜°>eUÄ=j„®>€Õ±=4€¯>dÄ=p­>!ü>¦¹Í>½û>1·Ó>ðŠð>àÔ>›Êú>sÙ>³ï>ÉrÚ>’=ú><Þ>éì>õØÞ>Qjï>…á> Ïæ>\à>ìOê>×úâ>K[ä>úòâ>£Èê>Ð ç>RÖç>°ÊÕ>î#ç>©£Û>m¨à>à¡Ø>¾Úá>›Ý>}­Û>îÏÝ>øÆà>}%à>\UÞ>|ðâ>ú^ã>í·æ>|¶>\YÂ>i·>”„¼>±¿¬>O¯¼>à/®>§w¹>–$§>\8¸>X©>CÉ´>_ ¥>‹k´>+¦>äI²>¡¢¢>‰E´>Öâ£>Ts±>%y¦>ƒLª>åš²>j¢¯>€*¶> â¸>/…·>©ÞÂ>(»¹>À>-¿>ú «>+4°>ò°>½â±>¢^°>6\´>Àèº>v´>îè¯>~É®>á'Æ>°qµ>S>Ì>f3·>•¹Ñ>ÉZ»>îBË>¢î»>ÿÌØ>ÚËÖ>o~Ó>çüÜ>Š×>Årã>¿€Î> 8ã> VÔ>ÊŒç>:YÊ>ÏÀè>Æ‹Å>7àã>DË>7ÞÝ>¸=Á>Øë> óî>ˆ+ç>zÇñ>¸>ä>ULý>»~á>=*?· â>ð?PÝ>í?ídØ>ߦ?­ß>ãã?"«ã>i?(|æ>1 #?=›í>–>,?µRð>ÖÅ5?ò¶ò>—«??²Ÿõ>£ZH?¼ý>æ>?N›ù>¿4?÷ö>p&Þ>#¿æ> RÙ>N)ç>„el>¦É>2<†>¹p>§±…>¡fh>5í‚>S o>è>2ªl>‰A€>€t>ÚT}>pën>ûuw>”õ{> (t>¨s>w‚m>Ðò|>àl>"þq>Pg>{>žd>AFp>µ¨_>ýz>”†‚>Çfg>fø>7g>õöw>¹h>x·r>"âf>]üm>Tàd>’®y>«[>«l>¦ W>®|>XŒJ>Òc>³ÎH>íi>!éC>¾2O>È\I>%y~>]>(…>ëR>ƒ>®ºN>X¨…>‹kL>O•>ÛÂC>ïˆ>ž²J>qXŠ>jO>y!>—Q>wˆ>ÎQW>În>’V>—Ƈ>GÉ[>p´‹>QƒY>IJ‰>Nœ\>L>½[>‘¹Š>øŠ^>É«‹>½5`>Q1†>rMa>)?‰>ž·a>-êƒ> 7`>ÊŠ>Pã^>Pá>N|U>a”>¼êQ>*R‘>;Q>!±•>á]N>q®‘>¥O>tð”>F`L>Uß‘>júL>€ð™>@PN>1îž>Œ/J>"«›>‚TJ>9·™>erJ>F—>\K>ÉvŽ>’AN>á²J>Þƒ>Ów>”ø|>PR€>|s>QL†>xs>åF>€~o> ¨„>ȳk>ú¹>ÉYh>¯”…>0e>õÚ„>;a>ÿ=ˆ>ÆM]>´Ë‡>ÝêY>w¡‰>±U> =Š>T>©J‹>YàK>çüŒ>´ÌR>±¿Œ>„m>×܉>eh>攈>Î3f>)BŠ> 8`>BŠ>N_>©‹>|´X>O;Œ>àJV>°Ž>%¯N>ÞÉ>©gA>ö—•>NE:>!>hZ2>Š•>z¦G>Å8—>—>>묞>¢,>³µž>—o>Ú9•>Yü>iŸ>M >Ž•>¦G>7pŸ>éÑô=°–>Þé=‰#Ÿ>³â=ÆÄ–>®‚Ø=¾£ž>`ÌÖ=I—>¾/Î=ùgž>ö²->Ϥ¥>ZÔ>™,¦>ªÿ=%;¦>|á=‘C¤>ƒÑ=;9£>‡ŒÇ=R ¢>–˜Ç=Ë+Ÿ>\VÁ=²LŸ>Ý#Û=°ª¦>³³È=8L¤>ê>À=˜‰¢>Œ/º=œ¡>–—¼=²óž>©¢¸=øþž>7U·=fÝ—>È ¾=˜¾—>Õ?È=÷?>«?Â= >™»Ö=x&Œ>7Þ½="§>!\Á=üQ¤>¦¶´=rú¢>³=NDŸ>‚É­=ðQŸ>­½¯=`ê—>ú{©=çý—>ãû¢=*˜>˜÷¸=Ù?>A¶¬=Úu>ÙÇ=t~Š>þ°=ÏM‹>‡ú½=¡M¦>¬=îÑ£>Ÿ¦=ÍŸ>]S =ãߟ>àž§=p¤>B²=.Å¥>D´=âs§>iÁ= ‚§>]È=ÓÀ§>ª Î=…í§>êÉ=ÿΦ>s/Ð=ú¦>Ö=I¨>×0ã=Èa¨>0ƒ>Y5¨>’x>#©> o+>Í©>Yø*>Îã¨>`®5>^ª>è†6>E¸©>} 9> lª>«=>/÷©>¯Ò=>Ÿ[¨>F´=>&«>ß§:>¢Ó«>ºÝ;>˜3«>‹âe>É‚>ine>ï­€>þÒb> „>ÓÀ_>Ë»‚>YR^>-¯„>¸t\>kEƒ>aàY>4½„>ÐðV>u;ƒ>µÂT>+‰„>pxQ>Êp„>¨¦T>Â…>zPP>¹…>Ä\R>Ò†>¥»[>„ð€>š^R>ˆ…‚>&ýM>Ü„>'lO>Ò†>ÃB>p¶y>ÃGT>\Êy>LàF>l±k>š–X>¾m>-ÐN>/_>Ka>Èša>kW>[_T> ¯D>™šT>ã¨<>Bv^>F$:>j¡T>¥2>!±]>Ù->`]>¸ê*>qÈf>÷’&>e>õ>ßúp>‘ >5šl>lè>1Ñp>Ë>Âjl>„‚>m>Í=>Ü-i>O">\g>­Ú>{Oe>¶Ö>ëi>Z¸>Qùg>c³#>È$c>Æ¥*>Fx[>Ù{1>«S>ÛL5>‡áS>ñ6>ÃñL>â?=>ÁtJ>¿7>.UI>š[!>Yb> þ'>8NZ>‹Œ.>f R>Ê¥1>BM>”Ú+>ªîQ>–w%>€FY>û>}v`>n¦">}êX>Iò>¯•`> >dÍX>Tâ>´`>9G>X>â[>KW`>Âh>Nz_>fÙ>Ö¬c>•Õ>Ã~_>;>O¯d>æ>>ue>ý->Ýe>! >k>Ô>kbq>ü>]mu>ç>\¬x>{#>!u>ÿB>ËÕ>Öü(>&È€>*>Dj‚>fƒ<>>•ƒ>@/<>âæ„>(œM>§ç…>R!>½S> ç>ãÿ~>¥¡>€z>>¶gv>76 >œÜo>7T >ãg>Ë,>Zc`>ÿé>YR~>»H>~þ{>XŒ >Jz>ôü >ˆ×u>ŠU>ÖTv>P>7¥l>Ó3 >¾Úa>í>}Y>!@>û“X>Èz>ûéO>²¹ê=°;m>†«>\­c>¼>Æ¢Y>78>„O>FE>eH>.(>êèH>AØ)>qC>ëÇ6>T;C>¸î=Ïd>øUù=RžY>Öå>uæN>êÏ>nlF>Q¤> ¶A>I.ß=od>’–ê=£Y>è‚ú=(ÕN>>¦ïE>)Ë>¹úA>¬õ=ÁpN>Ì å=œnY>~VÙ=*‘d>ü8Ú=Ô n>œÓ=,In>›8Ù==›u> JÑ=ð‰u>KXÛ=úÕ|>—Ò=sº|>”Úë=îêu>­k>bÙ|>·ìð=ü}>,¸>”L~> 7>W"€>ÕB> ¤€>+n>À>\”>0/p>1²¤>âr¼>˜0¢>Sé·>K!>„Ù¼>>Y!>Â>ƒO>¿Ã>Õ[#>gÇ>¿`>xœÊ>¹o%>¹âÊ>m9'>ú)Î>o..>Û3Ë>4+>í¸Á>">fÎ>³\>àË>9d>†äÄ>“Æè=»DÅ>²¹ >qÎ>ÿð=g›Ë>G>Ï=Æ>‹Æ=¥ØÉ>!3>.Xj>@†.> .v>Z>§•Š>ÿ#«>Íâ=¾i¢>ïq®>l”¥>Ð(­>&à§>6«>äi©>zߨ>Ö >M…¨>Œºž>e¨ª>C>]j¬>胕>J)¨>¬—>üã¥>o¡>ŠV¦>çȪ>P9¦>/m˜>ˆ¾£>»{>A}£>iŒŽ><¾¥>J~Œ>†Ê§>DP…>©>t´z>Ê©>Oè…>ý ¦>2މ>´t¥>ós‹>&¦£>™óŒ>„¡>ìÛ‘>"Š¡>û±™>—X¡>±|>e¦>Q†>.V¤>S?‡>Lá¡>zá~>ÚV£>ßo>Žs£>'r>”ùŸ>~¬€>ÎT >½Žˆ>ò\Ÿ>jmŠ> >>FCŽ>t³Ÿ>P>y$ž>–“>weŸ>Ö>ÒÄ›>P”> Òœ>ÆÀz>>"þ>¬8>„ƒ>é}›>Ô¹Š>”¡š>¢ï~>›>wI„>cd™>WÍ‹>«&˜>C€>•¶˜>@h…>xñ–>_Ô†>`«”>>ˆ0–>½Œ‚>•“>ÿ!…>pì‘>2Z‡>Š Ž>ä0x>™fš>ûz>TU˜>u>‡Áœ>Ž®r>¹Ä™>ÔCt>0/˜>/v>âu•>wq>.q”>6 r>{¼>8ôv>@>§°r>F–Œ>œÁo>ö™›>©m>ª™>é¹e>1˜>P«h>$*”>šD]>y"˜>ð_>Ìì“>ðjY>Ú˜>µâ[>Åæ“>3ÀU>ܘ>ÈX>tÒ“> ìQ>W{˜>¡LS>I¡”>Õ>M>lš>¹N> Ô•>òH>&©œ>c \>Rí›>t'X>1Ò›>cT>£›>€·P>_)›>Í#O>oõœ>QfS>Fž>LãW>÷wž>»š\>±‡ž>czb>@O›>]me> ¿œ>…ÒW>õ/¡>Æ]>¬¡>Hi>d‘ž>ß3R>%!¡>ÏkL>2«Ÿ>¼C>5` >0¡R>y>%êU>g>å›]>`éŒ>4ÚZ>ô>Ÿ>b>Ív>ÿx_>ß>Šåf>ö>. d>ïÅ>«yn>ç5Ž>Ok>Â0>[”i>ˆŒ> d><Û‹>_™7<ª~Å>ÚË6ÚË6_™7<ª~Å>ôàn­iz?½î>´ét?Þé> ß{?Ž å>Éx?7©à>Úÿ|?ó8Ü>–>x?GãØ>ðÞ}?sfÓ>¡Ÿy?€ Ð>Ñx~?Ñ=Ë>ëá{?|~È>!ê~?ùKÃ>~y?„½Á>Ñr?ú´Ê>Mr?Z¸Ô>5o?×jß>nOh?^eÕ>W•e?ÌšÈ>ï‘q?2À>Þj?ôP»>Î3^?­¿>üd?d´>^Y?-_·>uZ_? ì¬>†rV?Õz¯>Qˆ\?©Ú¦>õ¾U?|§>hêU?§§>É9U?•e >Þ`?Oœ>™U?óçË>lîP?aÂ>#¡M?SX¹>?ýK?&а>#†U?¼]§>oƒJ?²G¨>KJ?»¶§>eUH?dsÍ>=·D?p™Ã>kC?Âlº>LªB?Lp²>4GJ?p?¨>yë@?AE­>RDJ?ʨ>@LJ?Aõ§>zâ=?;ÃÌ>^‰;?·~º>*®·5?«ZÊ>»ð3?NEÂ>³U?Kè¦>a©J?ܧ>Õê+=†Žå>Vb=ÀAã>®Ø=hã>üª=9´à>Ù>$=¾à>N=Þ>ýl$=R_Þ>üo%=AeÜ>…(=¥JÜ>õ»0=“ßÚ>.s:=­¾Ú>l{;=i7Ú>}³M=2ÌÙ>ͰQ=HjÙ>b÷=wã>Ê4=§à>æ=Á¬à>€=È~Þ>¥0/=ŸèÚ>ñ=:xÞ>ëR#=?Ü> ¯$=ZÜ>•î.=ÆÛÚ>Ò6>=KéÙ>¶…g=kÖÙ>¥‡a=ï7Ú>3M=.sÚ>4ôO=¹Û>È·7= Ü>ÍS= Þ>) m=–^Û>;¬p=ÚÝ>£!c=`èá>?O=×à>\b=­÷ã>ϤM=¶õã>_=Q.å>HÁS=ò#æ>4öe=vOæ>O“Y=ç>·˜_=Suç>‡Šq=ȵá>Fëh=?Æä>’An=xµä>Iºf=S•æ>£[o="Œç>ib=?§è>P©R=Ëè>â!L=Q/è>›­<=;Vé>W#;=Òãç>ƾ$=“þæ>¯(=F^æ>a=mã>vÀu?^¡?M.v?æÍ?U¤n?d±?Iœm?O ?b?ñ?â<`?… ?,õT?ÝÒ ?5T? û?$¸I?/ ?áÓH?Ÿ°?#¿>?”ö? ƒ>?í ?Æ5?Þ?TÈ5?^.?B²,?‰(?ùL.?½n?×ûi?]S ?7ü^?iÉ?åAR? )?M×G?c'?Ò:>?¡M?Öã6?)¯?ºg1?¢Ó?Ot-?Áo?/.?»+?[?Y6?¥eP?ô3?ÃF?5]?þ=??m9#?®·=?**?„›?{.?Y??yx3?.s>?Û2?VY?ö$,?g*P?©¤.?l@H?š1?5ED?õ2?mÅB?µ6?²G@?ë4?”J\?`È6?ÞR?Àê8?#1I?n¢6?ÚâF?s*9?xµD?΋7? O? s>?Ù!J?Þª;?EðS?:;A?¹S^?`Z@?¸é_?` L?eŒk?1íK?˜¦l?§ÎW?i¬u?ËöU?-wv?"5a?8»i?@?lÎu?ÉËJ?"Rg?¿˜5? 2r?ÏÙ>?AFp?cÕ4?CXe?Ó¥+?Hpo?Îÿ+?amd?üm#?¦Dn?3$?,Óc?¢ ?ÅUm?å?;Žc??šDm?Έ?£Íe??Ôžn?>?i?®Õ?/p?_Ð?Þ­8?ç/?çª9?Ç/?ìC>­OI>—‹H>Ë€C>†¯?> F>ÎlG>òìB>Ní<>¡jD>–>D>óUB>÷—B>ñò4>AœG>¾O5>k(E>, 0>ú´J>™b.>¦|H>σ+> K>ƒ%>3ÝK>¥$>_M> >hÐP>x>PQ>W±>¿HX>²Ô>Æ3X>óv$>“N>ûv">lQ>½5 > pQ>ÿ%><3Q>e¥)>Ó3M>d->äeM>á )>5cQ>’x=?j/2?c´J?«é>?wÙO?ÊýF?mK?—VC?%L?èùG?%•U?à¹K?LP?)vL?JBV?§?S?ÐCQ?bfS?³ W?MhZ?ðiR? `?ÅX? Àg?ŽÉR?a¨o?XäW?§®t?3O?‚¨s?íÒV?-²y?p&N?s‚v?ËLa?›!Y?ADb?n¡g?0dm?ÞŽd?êm?Pr?ëb?Ùt?†=m?)~?4a?£}?åzw?UÀm?9_x?ƒj{?Ëž4?š\ ?D2?!å?¢3?Ø %?r†2?)°$?úï1?—'?nÁ.?ƒ5&?ý¾/?Â*?ºK.?t{)?¬/?Ñ–#?-?Xâ%?€€-?·A)?vp,?sô(?§-?¶K#?£È*?d\%?—+?ï­(?X *?Mf(?°T+?9Õ"?£*?´?Ê*?®.?––)?å+%?¹þ)?‘"?±Ã(?&R"?Z)(?|?9`'?N "?5_%?*p?B&?[Ò!?fL%?£!?Éè$?Õ?$?ú#?šÑ#?…$?+Ü&?†#?Ä–&?Tã%?z$?#'?8‚$? ^(?á %?ŒÙ&?x'?„%?´!'?â )?Á(?fø'?ŠÉ'?jL?È~J? ìL?É!N?Ÿ”M?"‹T?.N?™bZ?‘O?^Øf?QKO?*8l?®.O?kcp?VžL?žÐo?tJ?wÖr?œ¤I?)&o?*TG?±1o?VI?Jzl?‰íF?·Õl?kM?¼Ík?þÒJ?4.l?s%?Ð?Þ%?$?d”?Ú?Ø ?Š=?>?ÓP?‹S?ã?ºÚ?9î?x(??V-?BÒ?€¹?œÅ?âä?Í"?½Ž?)Z!?<.?M†#?e‰"?GË?4º?˜L?wô?'0?Ô_?¿‚ ?׈?Uø?c—?ä‡"? ?‘d"?¥,?õ$?*?rÝ$?-è!?7þ ?æ<#??!?–]$?v!?fÚ"? ‘#?g"?„H&?¹¥!?‘#?Ec!?ê<&?ƒ/ ?é%?F]? #?¸Z?6•%?y?78%?¦?a%?776?má%?¶j3? ?(?X2?Ž+?Ñ?1?¦î*?õÙ5?ð…)?ž4?Ö«,?o)3?-,?èg6?G°-?Ä|5?„*-?BÐE?Øñs?ŸF?)r?vE?`Íq?§E?K=o?zÆB?K®n?ðàC?–—l?ð£B?J~l?²A?µÄr?cîB?v5q?±@?În?<¾A?ll?Ôœ@?ïTl?3Á@?’Êp?~=?1Ðq?õ=?…#p?äÛ;?¨Ãn?“¦9?Xp?n2:?­m?Û÷4?£Xn?«è7?Z-l?ú{5?Ä–j?"37?}Ëh?ÿ‘5?N_g?M7?÷te?¨5?Ù'd?,>?ùm?l%?Ì&l?;Š?? ?l?bø? Ã$?Y‡?W?"?+¡?øÞ?&?Åä!?vm?¥Ÿ$?è-?…$?l ?Hk$?Ä$?ÅV$?V?ÿ=$?yêE?"Ál?éðD?6­l??¯ë?†7#?g|?·ë?þ?—V?¼?;8?¼Z?šì ?Þ?ž(?ði?¡žþ>Ôò?Ö§?0F?¯??cG?°Y?§u?kØ?ÕÌ?Yû?1Ï"?7Âú>ÞV?…êþ>Â2"?ÎPô>-!?bK÷>3À!?º¡ñ>¯@ ?Û3ó>á'"?Ù—ô>Oç?Ž!ð>—‹?§Éì>Ç?•î>âv ?Að>\"?Üô>¦B$?ÀÏð>+…$?H§ö>Ó½&?ŒJò>¿d'?î\ø>’—)?xì÷>­¢#?¹âú>PÅ%?Bý>v¦(?öëþ>r‰+?I»ù>‡l,?Ú?ŸY.? Áú>s0/?M?ÃÕ1?Y‡û>™2? Ñ?;«5?Eü>þ5?“?T8:?t ÿ>Ñ?%?\?n…(?q?,?~?=‚/?#I?ãŽ3?­Û?9?j¥?O>=?¥Ÿ?‡A?Y4?„(?ÀA?éï-?Ë?È•2?ý?´Ë7?R ?¬›Ç?­í> þ?Ëdè>›ª? –å>Ý{?ô7é>-µ?$€ã>-“?÷çê>ŽZ!?5¸å><3!?ä,ì>éº$?s…ç>¼•%?_î>ˆ.(?ïó>Rc*?'Øï>ÜJ+?›Wõ>Á;-?ž(ñ>aÿ-?(aö>™ô/?¨4ò>²œ0?‰#÷>Ÿ®2?Ö8ó>tb3?ª ø>Z6?VÓý>*p:?9íù>¬V:?/Âü>·Ð=?›Æö>s,;?!#ø>b,??)y?­Þ=?¹o?âB?§=ý>b‚B?G?äöG?ãUþ>ŒØG?åC?¼WE?¢Ò?{¢K?Z ?8LD?·(ó>9&??X’ô>CÅD?÷ð>ëå??óï>L@?|_ì>m;?ƒ¢é>¶;?¢æ>Mó6?.å>íŸ7? (ß>«3?O–Ú>â#6?:>Ò>h°1?ÿ’Ì>«®3? ö>MõH?¯Bò>öíD?ßë>þï@?`!ã>±¥;?qâó>iRJ?™ ï>ÿ¯F?ùKë>aG?CÇæ>¯B?N)ç>õH?mÆá>Â/E?Eôã>ú·K?ª Þ>ª`H?Cåß>‹N?PsÚ>w„K?»CÚ>=bP?S•Ö>—©M?©¡Õ>½ŒN?'ñ>0K?P9î> J?¸é>ýL?ÌÏí>ªïL?CÈé>žAO?#†å>w/O?I0å>AÔQ?ðá>R?S“à>òÓT?§®Ü>F–T?v7×>+†S?-”Ô>êÊO?4ÚÒ>ÜÔP?Î>`tM?SèÌ>dWN?Ú¨Æ>Ó½J?bÜÅ>ŠtK?V»¾>›WI?êç½>eÄI?K;µ>×I?+P»>‡ýJ?³%Ó>×3T?ïþÐ>gcQ?šyÊ>ïÉO?é˜Ã>CÉL?=Î>ÕÌR?š}Æ>çŽR?*o¿>'O?y“·>Ä#M?†±> `J?¼]¯>yL?S%ª>[²J?Õ©>ÖL?% ¦>bÚK?²d¦>üûL?Aô¤>y‘M? ¼>—oQ?Uø³>|FN?Ή­>3M?ɨ>ãM?œ¨¥>mN?×ú²>Ê3O?â<¬>õÕM?t¨>+N?¸¦>ÎÝN?g¸±>ø¤O?4ø«>·N?:¨>ØÓN?öA¦>GO?©¥¹>÷çR?Ÿq±>|ïO?—«>WÑO?XX¨>Û2P?L¥>½P?2°>„óQ?cª>{¾R?6Ë¥>ÝR?¶M¡> S?g*¬>g×U?$œ¦>³U?‚¡>ïU?Q1ž>ÆT?€§>ž@X? á¡>wW?Gçœ>]RU?ßÝš>J•T?Pà¥>x)Y?Ë >ƒOW?F}š>>V?vÁ˜>ºóT?/i¤>³aY? œ>ÃHW?ÔÓ—>eV?5–>³'U?ޱ£>ŸuY?­š>dW?¾/–>èÀV?Ê”>ûsU?|¸”>R W?†Ë’>éV?E‘>9¸X?š³Ž>Ô¸W?n5‹>=dZ?¨å‡>dvZ? |…>g\?ë˜>´æW?K9—>~SX?¼’>×Y?5Ñ>6®[?W^Š>Í\?g€‹>Zb]?îÏ…>Û4^?tî†>¨_?Ûøƒ>y`?Zñ…>xa?À²‚>‘&b?j¦ƒ>ŠXd?º¾Ÿ>\Z?6è›>¢{Z?±¢–><\?› ’>œ¿]?*6Ž>u;_?Ä?Œ>5a?¨:Œ>Ógc?$+‡>Ióc? >™òe?°£>ýh\?6æ>0d]?Õé˜>èÛ^?ß”>‰±`?hZ’>°b?²»>Iƒc?i’>= e?#2”>!@f?¯ ¤>d;_?Ëœž>ìh`?Í<™>tÔa?ËK–>nûb?C”>Ò4d?r‹¡>Ááa?õ›>/Äb?”˜>˜§c?qT–>zþd?Ú¦>E½`?R©>|e^?z«>¡ò_?*Ǭ>ê]?©N¯>™e_?ù‚®>Ÿ]?Þ±>Ì'_?–°>^€]?ø±>Œf]?¿²>Ç,_?l@´>­¾^?…•²>éÑ\?ò¶>e^?éÑ´>9[?ÌF§> ú[?1©>eÂ[?‡R«>qr[?们> $[?Àì®>ŽéY?»—³>>@W?þ¡> ÅY?Hl·>&ÈT?ùfÃ>¶†V?cÀ>º£W?î´½>áDX?¢|¹>äÙY?×Ù¸>W ]?’[Ã>çªY?ÑÀ>áBZ?¡÷¾>¶Z?¯@¼>iÅ[?W=È>¹ÂW?Ë>ƒU?*ÈÏ> %V?ÆÓ>\’W?*Ö>bÀV?âæÔ>GY?Ë×>™¹X?L3Õ>+Z?÷ÍÕ>Q-Z?ãÞÌ>‚X?ïÐ>0ÙX?yyÒ>ÄèY?áÓ>ÅÈZ?gÑ>ÃH[?=Ï>ÆÛZ?…Í>­ÚY?Õ{Ê>âÊY?@úÆ>þY?¨ãù>`VH? ô‘>5]g?ÞuŽ>æyh?‹>*Éf?øúŠ>}æh?)\‡>Ô)g?ˆ+Ï>kcL?»ÑÏ>>°K?¡Ç>¥I?†È>sºH?í¾>LPG?vÆ¿>{öD?{ µ>œkD?Ç„¸><„A?Å©®>Ú­A?g±>P©>?UÁ¨>ƒÃ??Mܪ>B>må=?—7Ç>LJ?«y¾>ßkH?ÀA³>œ£F?^G¬>æéD?V}¦>b0C?È\¡>°qA?µÝœ>ñ??q¾>%çH?ò³> ÏG?ûª>ÂLG?áë£>4fF?OWŸ>m E?»íš>¨D?c^—>ùA?”ܱ>…|H??Œ¨>òêH?¬¢>$cI?µ>!I?„gš>\wG?}%˜>ýÜH?²”>Á;E?7¨•>X7J?`’>¶†F?£”>»œJ?ª'£>áEK?КŸ>fL? †›>óTK?ö|>ePM?·™>ïL?ÎQŸ> N?Zœ>_ÐN?ÙB˜>ënN?M.ž>ÆÃO?‹ˆš>XP?tE™>uP?¾Ü—>Q?sö–>5}N?8…•>ŸN?´–>Ÿ Q?ææ“>ÏP?”>´N?Ú8’>ÂÂM?òé‘>äöO?³?>\M?k>U£O?5 —>^÷R?eÆ“>ƆR?Ò‘>VfR?Äê> 6R?ëÿŒ>QgR?;4Œ>ÑXO?*‰>VfR?OZˆ>*äN? Ò„>Ì%Q?€„>B%N?‚>EgM?fO‚>è0K?Çc†>²cK?›åŠ>-^L?Ž>¦ºL?d‰>‹¤I?.qŒ>úïI?i§Ž>J?ñ‚>S%J?°p’>¡MJ?© Š>#fF?ÞŒ>œ§F?Íê>»F?õ¸>s¡F?Ç)Š>LpB?Íä‹>žaB?c¹>8øB?Ü›>èB?P5’>Ø-B?Õ&Ž>S´>?_^>9ð>?*‹’>ô1??ú&•>˜??²Ö˜>P‹=?B@ž>BÒ;?±ý¤>åE:?­>¿8?É–>È =?»™>.þ:?qWŸ>“Æ8?NA¦>âè6?+½®>ùƒ5?&V¶>Úá7?µ·><4?}‘À>èj7?JbÁ>kÔ3?ŽË>÷°7?iS•>ò;?š>Ÿ°8?‚q >6?§>÷3?E.°>zá2?õñ¸>O2?ÉÀ>Ù{1?xÐÄ>èN0?[µ“>pÍ9?<‡š>Dk5?]§¡>¯A3?겨>bh1?J$±>Ö«0?^dº>¹‹0?태>í1?‰b¢>¬0?ÙѨ>z/?ŸV±>îé.?Ù¼>h¯.? ?È>Þ.?J_Ø>C;/?­kä>NÐ2?8…>z/?SÌ¡>Ös.?T«§>Ê©-?†T±>Í[-?:½>gó,?G°É>ùŸ,?[ÓÔ>ŸW,?=à>Úã-?Ìð×>m+?Lâœ>”-?$¸¡>Øð,?_%§>ðk,?uޱ>.+?ˆ½>m+? Ê>Á*?kb¡>éœ+?>”¨>^¢*?Dû°>B{)?'‰½>R)?à½Ë>l?)?J`Û>Ù[*?›âá>Ý`,?w¿â>Lo+?)wç>_·,?žÑæ>'Ù*?e£>Îà'?-Z°>Öã&?éÔ½>ýõ&?­ÃÉ>Ú7'?×>u(?7Ê>;5#?ʉÖ>©Ÿ#?e6È>uX?ñ-Ô>x ?‘}È>-¯?ÀÒ>~:?tÐÅ>÷?7p§>Ö!?ܲ>Èë!?sÛ¾>ûW"?ºKª>ýJ?âZµ>«Í?Ò9¿>¾?78©>+j?d:´>ãŒ?®×¼>å?ÌñÂ>¥?¹¿>;?bž½>¸v?ùNÄ>Pr?7Þ¥>Ù#?Ö°>Äè?¤Â¸>¤¥?,¼£>±l?èM­>±?Ù°¶>P6?ÿ"˜>† ?L‹š>¸•?éñ‹>$ ?+Û>=E?€)ƒ> ?Yü†>\å ?fÀy>‘ ?0>ø¦ ?Ã)s>Ô( ?Œ¼|>¶ž ? %s> { ?ô£>¨ã?Ì*|>©¡?&‚>˜?¸>øS?Ä“>”À?ÃdŠ>Ǹ?ÊÁ„>d[?Ú7Ÿ>æ±? •>:? ”Œ>\Z?då‡>N?N|…>ÂÞ?Áýˆ>Q»?Sˆ> Š?†èˆ>^Ÿ%?\®†>k%?wô‡>«y*?>“>ï8!?Òâ”>á™ ?™)>å ?I€š>LR%?áš“>?È&?gŒ>4g%?׋>Äë*?Dk•>b/,?÷Xš>Œ)?g€›>ìÙ+?œPÐ>}ÍJ?¼ÊÒ>LH?ÑÉ>¶HF?ú|Ì>DRC?!•Â>40B?ƦÅ>è¼>?û>¡ž>?ëS¾>|`;?È]´>К;?µkê>!Ë6?$œî>Aƒ9?Éò>óè:?²î>«í6?\tê>I4?EÕç>È&1?ñJâ>qæ/?fõî>ÛM4?t@ò>Ó7?/‡í>a1?CŒç>á›.?±¿ì>e.?tÒë>s/,?ôMê>Ð})?#å>io(?Áâ>jO%?ñ á>!?È™Þ>Qô?Y6Û>ì4?O$à>ÏI?óÜ>ìg?ŒÖá>/À?ÔFÝ>­ ?ÓÙÙ>l±?¿˜Õ>ÌÐ? oÓ>/ú?i9Ø>¬s?óÊÍ>éò?1Ì>³|?2rÞ>eÿ$?@¡Þ>='?~åá>°*?µßŠ>µ©.?—«‡>“Ž.?$)‰>_ë2?Χ†>ô2?8÷‡>KÈ7?°…>Nî7?Â܆>àƒ;?Ñê„>(ž;?‡S†>Ý??0Ÿ„>ƒ??²†>6ZB?f‘>ÿB/?dç>?þ2?‹>º„7?1–‰>Y;?Í’ˆ>÷>?.ˆ>1zB?Eº‡>/ûE?îµ>PS3?9Ö>õg7?V‹><;?4ò‰>_ë>?Do‰>¿eB?ì…> I?;©>=7?TªŒ>l";?ãŠ>…ê>?¨ýŽ>ñÙ:?–YŒ>þ˜>?íG’>è¥6?1µ•>‚‹5?I0•>3?M,˜> 3?f¢˜>È#0?ÁÅ’>ïY3?þÓ•>æ;0?¥Ý˜>B!.?`”>]ú/?5B—>Îý-?œ¤>—®`?]‡‚>´_?QƒÙ>ÂV?yÙ>ú¶X?'†Ü>ÇöV?}Ö>4óD?ÆûÙ>£xA?Ì·Þ>&>?×ùÏ>˜§??IƒÓ>ž%„*9?É>f;? Xª>Z·I?†9©>Ê5I?±3¥>°èJ?Êü£>u=M?Ø¡>|,M?Mž¢>pN?A ¡>ýÚN?U¡¡>QO?Ù$Ÿ>fMP? 8œ>þ¹P?Fš >9 Q?ÁR>¬SQ?@j›>á^Q?¯[¤>SÏN?!é£>a©N?ôÁ¢>»O?^I¢>ü§O?R*¡>EQ?È™ž>vãQ?Åœ>û@R?Æû™>K#R?5›Ÿ>¨SR?m>‰·R?‘{š>~S?Ș>óS?ËJ£>%P? ±¢>F™Q?¹ß¡>ûsQ?b¡>È´R?ˆ+Ÿ>9`S?û]h>=C ?qXZ>l[ ?/Rh>ýf?î r>’A?ïþx>q?؃>d;?t~z>o½?[&ƒ>µü$?kx>‚7$?Ë/ƒ>'ù)?íu>“Q)?^ó‚>7.?)ëw>ëÄ-?n‚>^ž2?íe[>bH? þg>(E?zk>d:?bøh>øû?bJd>òB"? Z>­¾&?| f>]*?t\M>g '?tzN> ô)?Y¿Y>Õw?†:\>S²?>?\>™‚?úÕL>ߌ?½¨M>·)"?‚ÄF>7ß ?OD>(#?­l?>bŸ ?Rš=>§?#?cš9>ãâ ?Žé9>3#?—ÊK>ô¤$?\G>š'?ØÖ?>¨'?ÝA<>ð'?8Ù6>ÂÜ"?)?9>V+'?wØ4>´ç&?74>¾Ù"?Ö0>>w"?Ê60>ð£&?È I>d;+?ÇA>+?9_<>Kt*? :>û‘*?Ó5>¥‚*?$C*?ž—*>ߌ&? ë)>®+*?”Ü!>Óh&?R' >ÖÉ)?4ô?>áC-?w†9>˜,?5 4>0,? Ï.>wd,?V»&>ÿ’,?Áà>†Æ+?{õ>7)?´>´ä%?;>¯^%?¯z>ÊP!?Eò=…ì$?èjë=¥!?£ç=¾¥$?¬äã=6!!?ª(Þ='!?_µÒ=p—?<.Ê=؃?VØ=B"!?g'Ã=N€?æ¯Ð=Ã!?‘ж=t`?•·Ã=œÄ ?èM¥=TT?’%³=¦ ?§\¡= S ?c¶¤=$Õ#?¯²–=ü«#?Ë‘=»b&?| ¶=Ñ$?8£Æ=é'$?JñÑ=µN$?oJÙ=)_$?ÿ@Ù=¢)'?eàà=¤Œ$?Aà=€D'?¿æ=Ön'?ññ=‹Å'?•Ò>n(?«˜ê=E×)?›Xà=€e)?/¦Ù=ÝD)?ÊáÓ=]3)?âÑ=&'?RÒÃ=ýõ&?f1±=Ͼ&?NŸ=|&?ÎÉ=ø2)?ÎÞ¹=J$)?F@¥={ö(?Ô”=rˆ(?ñ‚ˆ=(?™¼=¶€(?ADŠ=‘`&?É{=®‚(?øÅ…=ìK&?þót=D‡(?ÐB‚=AH&?À±g=iŠ(?Î9x=ï7&?RL=|(?~ÿ†=uu#?d<Š=¬t#?É‘Ž=eŒ#?C­‰=ï?Íæ‘=æ ?‚7„=bõ?5†=5Ñ?VŸk=Ö§?Þs`=iÈ?x :=¯“?ÌÑ#= û?~; =í?FzѲ9=Wè#?0ƒ1=€*&?Dm[=ƒP&? Â=²G(?¼w=µù#?.‘ =«&?ò@ä<){'?Éç<þ%?+Üò<Š$?4×é&+? ÿþ=‡*?†qg>/¦-?kX>’²-?QOO>Óô-?›H>«é.?‡nF>Û/?­/B>bÚ/?SXI>2?gœF>»C2?ÒÄK>ã§5?¡w>*2?¾Ki>fÀ1?¤ãZ>“¦1?GæQ>Ùµ1?iÄL>ý†1?@x>Ö6?el>.X6?^¹^>"Ä5?ÄìU>ôŒ5?oÙQ>¾…5?x^Z>Y¿9?Ü V>Mº9?€^>û²®=?£‘_>é=?Ñ=[>Ù™>?ûXa>o??ŸYb> ":?Ðcd>µ&??kƒc>4‚A?Mf\>j@?Í“[>©PA?µ£X>E@?ÇV>f÷@?on>´[;?ˆGr>J—>?Z,u>²„A?Ëôk>»™A?:t> E??m>£ÊD?ÐÒu>ö H?Ðj>¢E?¿šs>³CH?Y5h>´YE?~Žo>5EH?T¬z>bK;?"P}>('>?ù¢}>vB?¨€>–\E?sK{>‡üG?I€>´WK?zÃ}>”L?]©w>óŽK?Û€>ŸP?"Þ‚>I¡H?vl„>‰ÏE?€Dƒ>*UB?Ü)…>—SB?û‚>nû>?†t€>e;?Îpƒ>.‘;?¨>ñh7?ÈB„>¶Ö7?ÒV…>vâ2?1_†>¯|.?V}†>±M*?Õìa>“sB?1D^>¶öB?= W>h‘A?$bZ>A(C?ÛR>ÆA?+T>mTC?0ÕL>èB?‹¥H>³•C?3Ü@>ótB?Ÿ‘8>ÛC?âç/>ŸC?· (>4MD?•Ó>ÄzC?sö>ªïD?'g>¡ÛC?G«>²FE?¤d>È{E?r¥^>€€E?×S>#‚E?J]B>WzE?–{1>×1F?¨6(>@¡F?òï#>ÊF?FD!>nàF?[µk>œ1H?&o`>"H?GÌL>”H?¢;>w1I?V×1>ˆI?¯Ò->-“I?/ß*>½I?ÖW'>JyI?Ò¦j>ÃòK?d"U>XsL?ðùA>¹ûL?8>}$M? ò3>‚M?¼Ì0>M?và,>¼çL? '>”ÙL?Ön[>fQ?N¸G>³]Q?¸t<>ØdQ?£;8>P6Q?Ï4>àQ?öî/>oÖP?Ö96>×T?‚þ2>g&T?Ú->þ&T?x¹(>×ÝP?n‰>›©L?Ū!>9GI?oó>$I?!”>žF?Á >éHF?ã >šëD?-îÿ=[°D?"R#>ÅT?[î>]¨P?” >Û‡L?Îl>ªÔH?ú=ÄìE?Ehä=D?A é=ÍtC?Ú¨Î=®EC?PT>ŒØS?H¿ >ídP?&>÷uL?Õvó=ÚH?AFà=kñE?Ò©Ë=ÉéC?Ì›Ã=îC?Æý>5ÑS?צ>.;P?»œò=ŠŽL?ˆå=º÷H?Ò5Ó=- F?œÁ¿=D?Íç¼=|&C?Õv³=†ZC?»¶÷=‚;P?=+é=üªL?ÁãÛ=oI?x(Ê=qÿE?Øb·=€×C?;7­=ðMC?õc³=#ôC?2åÃ=öìE?•ØÕ=I?‘Eº=°åE?6åÊ=ÜóH?ÀB¦= E??pµ=ŸH?Äî›=ÏHH?¬§=š>K?¿|’=öJ?j.—=ãÂM?ì…‚=&ÈL?UKz=ÿyN?Lb=f£K?æÊ€=œøJ?hAˆ=|DH?ö|=šDE?‡~=ÜFC?F[•=H‹C?hYw=1´B?\q‘=C?>{n=@£H?ÍÍw=ß¿E?‘&^=ÑäöS?cD>a7T?ªX>$`T?¢Cp>®IS?h$r>¶„P?€>ùR?j„>böR?qçâ=Æ£L?d¯×=€bL?ûæÞ=7ûO?X8É=É;O?ywÄ=ž#R?æ«=0hQ?3nê=SBP?ó×=œ§R?–Yä=UùR?&ð=cP?Q¿ë=!S?œò=Â1S?åAú=ÄzS?ç¦>|ÕF?®>ŠD?êÎ>°7E?6>å(D?„ > D?`>3D?Ö5J>î´A?RN>ÞrA?„R>žCA?‘î§=KçC?[¥=ÂLC?—N>y•5?\wS>•¹9?3TU>=?£±V>Û??ÇôT>o??ž•T>Ô}@?rR>±k??‹ˆR>˃@?d O> 7@?ŠwP>Ò9?gÓQ>„.=?ÚWN>¤=?õõL>(:?4H>S±5?k¸H>ïâ=?á¶F>ï;:?—ÿ@>Rž5?U8>9a:?ö{2>05?Á(> Ô9?Òà >Ä'5?^ñ>Ä#9?/o>7Ž4?¡Ù>w‡8? >ç4?šÏù=R+8?Ƈ9>ÌC>?[^)>µo>?·¸>›æ=?Š>;=?»)%>A?·˜>ïX@?W@>g¶??W"ð=$ ??(ñù=ÏR 1?ïY>L71?[Í*>qª1?Z.Û=é™.?sgæ=ʤ.?µùÿ=Ì'/? >”/?…'>=×/?ƒö:>¸2?á›6> 0?9³=>Í’0?ZI;>ß/?[$=>Vð/?yÌ@>‘0?ZðB>žB2?I¼<>ÁT/?ãŠ;>%ê-?œ8>B.?Ÿ6>)-?,~3>Ü-?¶€0>‰)-?­18>¥Ý@?R¶H>¸@?;9ã=Òû>?Ö«è= Î?¤4Û=Ø›?{¢Ë=IØ;?"§=/>?\æ´=Á;?Kå=S{=?á =ŒI;?Ãô}=3=?=Ž=p ;?dÎs==?¡‡=óä:?iŽl=ˆ÷{¤!?ý£>Ýê!?Fš>£“?28>€?Ü>¼?Mô> ›?CX >Aœ?•ï>:<?‡2$>Æ6?¡&>#?Ý™)>2"?ÉX->ëá?*R1>3Q ?N 3>|D ?ÝÓ5>GÈ ?R`1>3¨?]m5>9E?‰)1>L?)?9>ÆÀ?*6>©÷?*<>ˆ‚?È9>ÉU? c>>6s?«Ñ;>'Ý?nßC>.¬?iÆB>ÅÉ?Ö?>qÈ?ywD>Ïh?ˆM>`t?AB>3‹?eJ>° ?ŠsD>#?UK>öB?]ûB>øQ?ÇdA>?S#4>”Á ?æ¬/>è ?%>%² ?Â…<>r?·>>ç:?Ïf5>áî?óZ)>3Š ?±¿>'ƒ ?5>b‚?Qö6>†“?IÙ2>Ï?oJ)>¼’?Î!>>“ ?×Ã>çr ?äØ*>ÿy?mq->2U?£ê'>j?ž >)z?}\>ê{ ?:<>ip ?]Å">˜?ÅÈ">·ñ?|>ƒÚ? $>r‰?ŠÊ>E- ?Ó>Ôc ?‹k>yÊ?µ¦>Ú?éî>T«?°Ê>^¹?ýN>EÚ?>o ?µù>µ¨ ?G’>Ä`?Š>œ?1š>Ÿw?ô¦>>\?Ä>±?~>' ? ,>þó ?µÄ >¢_ ?è >é)?¸w >Ày?E>HŒ?’!>~à?›>^.?`w >¤p? > ý?¾ø>ê^?\>€?ê >wõ?¨n>>±?ÁÄ>l“?´¬ >73?*>ò ?¤8>Äy ?H >±¿ ?Ì)>Ïi?{¾&>Qø?Çb+>¹?ÿv)>©û?G.>М?yZ.>Q?´Ž*> ¤?ÿè+>¡K?Ó¥/>V?w.,>°þ?üq+>ˆ¾?ã5>Ö?Z»->¦C?K#&>!¯? Š&>cC?þ>åz?©>g€?|óû=—ý?Ήý=b ?Åß=¤Ä?ìLá=éC?ȶÌ=vS?x Ï=v?-!¿=H3?0¡Â=Ž?g¶=y??ßS¹=Š?ºI¬=æw?㤰=1(?Qkš=¸<?B]¤="3?ÒŠï=If?²×Û=ÊP?Þ”=· ?ƆŽ=B?‘ x=yê?¿(=¬Æ?¾ŸZ=ö²?TUh=ê•?‘L=˜?ùôX=;‹?™+C=*Œ?gÓQ=çŠ?¦d9=¥‡?ML= ‹??­"=Pª?Ž?‘=åñ?“¦=rŒ?«v=gž?)’o=Ìš?óR> œ?,gO>eo?ª M>™ ?’xI>¢Ñ ?·BH>úF ?K±C>ÞT ?ZôN>’?a¥R>L?¬þH>»` ?”‰K>L ?½qR>ø ?”P>ÿA ?I¹?40R?ÁÇ ?´W?È•?œY?Ò¬ ?‘[?Ÿ?€Ò`?¤ú"?\wc?ÞU#?F`X?—q#?<ù\?F~%?€^?a'?È`?Q¿'?@Ã[?œR*?ò^?Ð )?CÿX?»b*?ÀZ?y°%?aPZ?æë&?l\W?Ùé'?CX?Ý%?V?K¬$?è¢U?«>#?iŠT?sØ!?›S?°â ?èöR?øn+?‰ÒZ?W–,?Éu_?|B*?$ b?ê—,?CÊc?4,? xi?ü¨.?Ð^e?æ0?g? 1?Ic?—«3?­¿e?ßR2?9 a?0œ3?î?b?7Ý.?Ù±a?Ï0?®ô^?†1?úí_?s/?ó^?E.?U]?÷”,?´[?‰—'?´wf?0F0?Ø»k?»3?}?i?LÃ4?ÊRc?PV<>§# ?E1>—SÒ>´ç2>3àÔ>ÊŠ1>×>éž5>ÔØ>xœ2>†Ù>Òq5>líÝ> p1>³ Þ>vÆ7>’¯ä>ì‰.>Ÿuå>ÕÊ4>¸í>MÖ(>rì>5 />sÙð>ge;>Mä>ƒÂ@>Ì%í>tA=>lí>NïB>Wñ>‘™;>Ý[ñ>¥J>a©?…[þ=_{?f»>ˆö?‘Ñ>*«?t–ù=Ûj?TTý=!±?†ä>¯î?•ô>ï?Ox >7á?þÑ÷=qu?ý¢>y”?SÊë=N ?µû=èg?(™Ü=Ì—?Ã+é=‘Õ?ÙîÞ=c ?¥Úç=÷±?Šwà= ¢?Ró=k€?¯˜ñ=½S?Efî=TS?_´ç=ß7?˜mç=x?ÊÅØ=_²?³ Û=Ë?ÒåÍ=Ž?? ™Î=,œ?ž³Å=öB?Æ=µŒ?Å8¿=Ý[?E„¿=%–?n3µ=v?àM·=i­?,+­=®f?ãÿÎ=Ð?jˆÊ=¡¼?õHÃ=øÞ?ðÛ°=GÈ?X»=bõ?æç¦=,·?øØ=«?ÿçÐ=ù?‡þÉ=õ?ºf²=¸é?ùJÀ=ñ?ŠÇ¥=üá?€G´=ßâ?v“=g?ÓØž=%Ï?êÏ~=·î?´:Ù=HŒ?cðÐ=^d?2Æ=ªG?*W¸=§@?À[ =LQ?®š‡=á$?†=õh?¤ng=à‚?nßc=ôü?MÛ?=£æ?Wèƒ=³´?Íçœ=}"?Ú˶=kô?píÄ=Xá?uÐ=·î?ñØ=§ ?Õ°ß=G>?æ=0?˜ö=Yn ? „=|î ?8Ú±=üp ? k¿=:W ?¤ãÊ=Ëd ?€GÔ=0Ÿ ? KÜ= Î ?‹ˆâ=nÚ ?æƒ=3m ?Ÿ•=o ?9{§=·î ?‰ µ= ?Ù]À=¼ ?¦îÊ=Ú; ?¢ Ô= T ?íbÚ=2V ?Çì= ¶ ?å=4J ?écþ=æ” ?Þä÷=„G ?)y>@K ?š>Ù™?‚áü=î^?2ð=lè?p\>ÎÞ?ê>š”?ÈBô=”À?çm >6Î? > >= ?Lã—=5š?J†=5`?§=e==ÞÇ?Š'=J¶?Þ3=Ì]?WëD=­1?Þ_=¨á?žt=ÉÈ ?ã‰`=òÐ ?mY>=Ó¿ ?5îM=ÐF?™d¤=PQ?ÇÁ=dÎK?–$¯=4…N?òì’=vlP?1V>™FC>\Ì_>åÑ…>Ý\\>&6‡>íºW>{׈>y¬Y>F²‡>XÊR>W ‰>-°W>ýÙ‡>[&S>R€ˆ>„T>Nî‡>ÁÇP>Cˆ>/÷I>“:‰>ò'J>Ί>>> J‰>9 %>ˆ¡>@½)>þ´‰>â>Åä>Á«>ˆ>Z>˜jŽ>Œf>×Á‰>·³ï={2>FÐø=û‹>Ɔî=G=Œ>‰Bë=Û§‹> ÅÝ=…Ò>¾÷=÷“‰>¡g>Cˆ>^€ >Z¹‡>> %†>¹q+>@ˆ>]þ=©‡ˆ>WÐ>؇>Žè>…>Ì*ì=ê‰>·šõ=‹Šˆ>“þ=?n‡>úF>vþ…>¡í=êˆ>à„â=ÚÇŠ>Àã=WÍ‹>”†Ú=!ÉŒ>´×= Û>ýÒ=Œ1><¿È=›p—>Ð{Ã=«——>+øÍ=¾P>zªã=Y¤‰>tEé=t³‡>5}ö=ƒn‡>÷Xú=à/†>¡…ä=kó>ÛÞÎ=wJ—>>{>>‚Vˆ>«yî=P…>û[â=n‡†>œùÕ=h$Š>ãÓ=´<‡>…Ò·= ¨ˆ>‹—=ëü‹>x– =¨9‰>[ ˆ=æ‹>ü©‘=Âi‰>y>ƒ=½à‹>‘Œ=;Œ‰>” =¨á‹>Ìëˆ=ü©‰>J]r=¸Ê‹>3Š…=S®>Êm=#½>ª c=UÁ>[ ]=и>™ÔP=‡Å>lx:=wH‘>ÙY=nnŒ> Ñ!=Á’>%Ï5=Þæ>4i=7Â’>óR=Hþ˜>r4G=Vï˜>Eó@=|ò˜>5}6=¼Ì˜>ú(#=–x˜>S— =F&˜>Óø=õI–>_˜ =g“>§èH=mÈŸ>?<=ŸçŸ>'¤5=ŒóŸ>NE*=2éŸ>?p=üRŸ>+ø<"Çž>ûõ<æÍ™>ŠÓ<mž>ãÞ<‰œ>¢ñÄ<Ápž>+ÞH=죣>£•;=Šä£>Võ2=sõ£>|'&=F¤>d± =éÖ£>âæÔ<Ý|£>*åµ<ô7¡>¼]¯<ÛŸ>.çR=ö ¨>•ðD=ߨ>˜l<=Ù'¨>n.=2¨>ïä=g¨>ïä<%è§>\ÿ®<ö%£>‘ ¹<ç5¦>\•<¢ >ÍêÓ‡®Ä_“<9  >ø5’ÅTz<·}Ÿ><ÐП>*ÈO<Ñèž>Å®m<ƒi >ÔïB<*Ÿ>õ04<Á7>4J<þ|›>r"<}A›>„~&<¸Z—>&W1<ït—>—‹x<†”>,‚<Õ^”>:@°<2:>é›´<µ>k›â<¬ŒŽ> {Ú<,Ó>!Y=ÉV>O½<%Ë‘>Ïç<]¿>2ƪœö4»¿×<‡”>JŠ<»µ”>¨Å`<„f—>t}Ÿ<Ä$”>–—|<ýJ—>må¥ÀéÝ<ð–>ð…É<#,š>eáë<§™> Ù<(cœ>•»OO=RS®p<Û÷˜>øª•]Rµ-î¿<þGž>åÃ<0Lž>M®<¢ Ÿ>³ÓŽg<ô§>nma<9d›> [<Ê>¢N¨ýV<}ž>š—C<¥Jœ>)Ë<‘О>t•n<¦™ž>×QÕ= %‹>)=¶“>€ÿ<ð§–>½Å=ff–>†=‘>×Ù=Mù> z=°Ë>àÚ =î““>Eœ=Â÷Ž>ž=5³Ž>±À=3À>|'&=ê>‡ˆ=÷Ë>œiB=e7‹>_c=Š>Üh€=eã‰>Š'=Hp‹>=¦ï>_› =ÁWŒ>]4ä<¸È>üˆ<ý¼¡>ü©ñâ°t=§§>{Ÿj=ÔH£>±“= ·§>Ž=jh£>O<§=1Χ> Y=J–£>3üg=›Ÿ>k`‹=ß‹Ÿ>Y†˜==ן>Ùn=!è˜>ˆŒ=…|˜>‹À˜=—U˜>mœ=¬>8 U>·Ó†>SW>Ró…>íV>Cdž>`X>œ£†>;W>‡>îì[>GÇ…>Ÿ”Y>¤ú†>ØF\>’\†>Î<<šCš>¯Z=¿ã>Õ³ =¨ýæ>D4:=¿+ê>€}4={Ýê>B˜[=6ì>›=° å>x=aÃã>1¶=&þà>HÄ=³Îà>į=©†Ý>y²=^MÞ>ú%"=ÎÜ>' = á>‘a=ç:Ý>õ#=úòÚ>ÅU%=þFÛ>¾¡0=cÚ>P0=ÿ”Ú>DA=ˆÙ>Í >=ãÝÙ>¨S=íDÙ>‹41=k}Ù>žDD=$Ù>ÇØI=wØ>RF\=çqØ>EV=±Ù>ÏLp=º†Ù>²hz=¬:Û>SZ=7Û>Z€=õÝ> d=þÑ×> •=cØ>€€u= Ù>Í•=¯“Ú>kñ‰=mÙ>ÿƒ=f¡Ý>}‰=ñÜ>” =¶ôà>¨9y=6vá>eq=d]ä>M ˆ=3á>©Ÿ—=­†Ü>0š=Š’Ø>‘¦=9Ø>p´£=#Ü>>@—=~Œá>$bŠ=âæä>ÿ…=\Çè>ÁWt=ñJê>ÿyZ=a4ë>ì—=K9ç>žaª=£"æ>Þ!¥=(,á>·Õ¬=€á>佪= úÛ>š˜®=¬ÿÛ>*®=t]Ø>þ,¶=è3Ø>X<µ=/Ü>ò³±=.á>°²=Ü,æ>Ãb´=m8ì>‰x«=ÿAì>'÷»= 1ï>ž´°=˜ï>y¶=Zeæ>¬¹=¸Xá>‘í¼=î=Ü>©¾=üpØ>!Ä=WØ>`Â=WAÜ>v‹À=8Ká>˜¢¼=åÔæ>q¾=÷tí>Ã=´rï>åEÆ=†9á>AôÄ=É‘æ>·¸Æ=$´í>Ì=$|ï>eÞÊ=9€æ>›þÌ=ˆ¼í>¸[Ò=íŸï>c ×=Á«í>àß=µÃï>jiî=íÕï>Ù³ç=·&í>íd>½ßð>¼[ù=…í>œ¨>úð>¨Å>ŸZí>%–>©î><>þ˜æ> k> ëæ> ùü=†á>àœ>®Gá>$%ý=æ•Û>ê\>BÎÛ>7‰>Ý ×>’¯>ná>cò>Œøæ>[ >@Üí>Ž@ >[êð>Tp>5Ôð>£ >2’í>Ƥ>rüð>U¾>Ná>Å« >2°æ>\ >uËæ>Ä´>~ì>Ëh>ñ>ôn >Bèà>¢|>Ä{æ>°å>Gí>B\>´ñ>Ðc$>Êñ>E¹>eà>4ò>¡æ>Ѳ>†“ì>aÄ>Ü›ß>Ÿã#>Þ°å>á^)>»˜Þ>àž'> —Ø>­¦>[”Ù>êv&>¼<Õ>™„>Ö>’'>TâÒ>\®>œ¢Ó>î>ÄwÚ>ß>BÕ>Ct>BÛ>™ñ>`=Ö>†Æ>–¯Û>¤¦->t@Ò>Mº->~ÃÔ>ÝD->¯Ö><Ü.>÷«Ø>¬0>ÖÕ>¤0>ˆÓ>9/=^½Ú>l#=/Ü>C©=Ê2ì>Í“‹=’¯ì>#fv=ò™ì>ƒ¢y=.ªí>´8£=Eõî>&T=;:î>ƒöÊ=z5Ø>ŽÊ=W&Ü>9ÑÎ={á>ŠsÔ=8æ>3‰Ú=*ã×>”ƒÙ=K±Û>¬ÇÝ=qà>!Îã=¬å>I¾ò=O²å>°Éú=«æ>íÕç=ŒI×>™ æ=ÀAÛ>Õ´ë=NGà>¬åî=ò ×>9bí=GÛ>þíò=¶eà>vßñ=©/Û>òÐ÷=µà>È ô=ÌÒÖ>Nñø=IºÖ>%÷=Õ[Û>9³ý=ª·Ö>Ì—W>·˜‡>.6>äÁ>>ê/>^Ã>m­/> :Á>ƒQ©>/¢}>0®>ww>w¾§>ADz>~p¦>K­w>‰yr?¹« ?¿t?%@ ?oöW>±¥??©2\>ÜŸ??0U>k¸@?S’5=,IÞ>( 5=Žæà>¡&=Ñ=ã>ji.=“6å>]39=¯–ã>L=›rå>!<=¡/å>•ÔI=(|æ>•ÔI=(|æ>œ==÷æ>âYB=ª+ç>À_L=¸ç>ð=™N>xà=í)Y>gDé=.N>æwÚ=ëY>ãß=.N>æyÐ=NY>+4Ð=ÝÎN>ƧÀ=;§Y>fÀ¹=¯|V> "²=ìh\>t\­=tA]>ñ»©=ãþc>Â¥=*Žc>LoŸ=¨k>‰ÔÔ=Ωd>MóÎ=YÛd>IÅ=ëd>x˜¶=¦€d>Y¾Î=•n> ²È=³o>I+¾=Œo>5yª=Übn>†Ì=œ¨u>,ÕÅ=¦ïu>0K»=)¯u>‡¿¦=!u>²’=x–p>㥛=uäh>y®=î"l>qU™= ¸g>‰=ðmj>*SÌ=:•|>óÆ=dx|>–^»=Tå{>l§=1|>]Ý‘=S‘z>¹7=4¾o>­ƒ=Óu>¨6x=…o>Éè€=HPl>ÓŒ=†Èi>į˜="3g>ÓL—=¡÷f>–=3âb>`ÇŸ=„¸b> Æ=Í]>(~Œ=¿G]>›W•=]‹V>´éˆ=üÃV>–‘=ÂQR>”ƒ=¼ÎV>Jñq=Èj>3Ü€=Eñj>•|Œ=i>ÓŒ=†Èi>•|Œ=i>¼“=eg>4ö…=æÁŽ=‹¤]>½Š=”i>­Þ=à h>Ñtv=`rc>Óks=Së]>À^=ÒàV>ÙŽ=BR>fMŒ=¯éQ>mÊ•=©ÝO>ïÅ—=ñðN>Õ%£=§ÉL>¶¼r=fNg>vþm= ¬c>xEp=ž ^>3Ü€=Eñj>dt€=¹nj>4œr=(Óh>rl=ùÚc>Vס=ùb>Ñ®¢= 5ª=|G]>-%«=OY]>!é³=§@V>2r¶=—þU>_Ã=¶GO>Ú¬Ú=i§F>•îî=%–D>ßÞõ=øÆ@>í)¹=DQ>½=ôjP>­l¿=Ë÷L>#ºÇ=ž|J>p#Å=@G>ÃJå=ùžA>gº=…[N>ßS¹=²¹J>82¯=‹¥H>Y¤É=¤B>¡†¯=”F>›è³=sÕL>¨=éîJ>í)™= êK>À™=¹nJ>¯î˜=ÜL>[C‰=éíO>'ø†=¢ÔN>§zr=‰šX>^ój=s*Y>Š‘e=ݶ_> 7`=ÑW`>0Ie=úEi>Øq=åk>4M˜=ÀÎM>ò`‹=¼Q>ÞqŠ=ÃfP>§®|=â=W>¨6x=XÉW>í€k=PÈ^>Z×h=}=_>#,j=…{e>Ki=f>@1r=¦i>9g=¤ng>máù=2èD>J¸>óâD>éb>‚:E>ãÝ>^A>–’>áÏ@>73 >®bA>/m¸=&O>á±=ÌcM>‘ ˜==`N>i§¦= ™K>@¿¯=ÕYM>5²«=¦M>;:®=GtO>Âi¡=}N>¯™œ=â#R>ø¶=YO>3§«=h R>éÑ´=ýQ>9 ¦=s‚V>°=PŠV>ðà§=¿,]>G2<¯—¶>á “<­Ü³>ë<ùµ>•š½<²×³>(öU¢ì<ªa·>x~Ñ<†·>eÁ<2º>ùK‹<Ï/º>|¸d<ž ¾>Iºæøm=ì…²>¡,ü<|³>ظþ<´¯´>\Vá<,º>= ­<†8¾>^ñT<­…Á>­m <­OÁ>8 %<ûÂ>¡Úà;r2Á>wö<º¿Â>M <¾ÚÁ>M`<“SÃ>vþm<ñHÄ>_$4<éÖÃ>ß7><-yÄ>é <Ñ®Â>…Í;ëÁ>ÆÃ; ½>ÚË6Çõo<†ÿÄ>Q’<ä»Ä>ð‡Ÿ<:­Ã>E/£< Å>¼;²Ef® Q¾< hÂ>Ìz±<)ÏÄ>VžÀ<ãÂ>"¦Ä<‰›Ã>ÇÔÝT÷<ý»¾>#=zS¹>²hºË+×<èk¾>‰yÖ< о>‰íî<Ì º>KÉò<Éȹ>œ1 =øªµ>c =âä¶>k8=²›±>wлDõ<·>ž³=‡á³> ê=T²>+)=M,°> ‚G=™€¯>§]L=l#®>Üþ<ƒk¶>öš^=+À¯>¼g=á ®>^ =5˜¾>YM×<ƒùÃ>LÃÈ>0»§<ʉÆ>`Ÿ<ÔµÆ>•d<hÆ>lŽ<¿ÑÆ>f“<€¶Å>ôànhæÉ<ÐÊ>W$¦<ÌšÈ>ñ.—<ÔñÈ>ÉŒ<^HÇ>özw<È>%?b<`ÌÆ>¾.C<ŒiÆ>Ít/<ö—Å>v<6ÈÄ>ªœö;¶ÚÃ>ðv;ºfÂ>. ´<ä½Ê>kׄmG<æêÇ>Êà¨ÔV<í¸É>p—ý;0öÆ>U<ö—Å>ƒÂ ;ÁªÂ>1ì:9_¼>N—E;·|¼>s<Œ‚¸>e4ò<­÷³> ¸ç<9¸´> ¦ümÏh“Ãs¼‚<$ ¸>}I<ºKº>ò /B`å;tн>þÒ"¸<Ì º>‚oš<Œ¶>Úäp<\ç·>+Qv<¦C·>>«<~µ>0b<ò?¹>¬Ž;·ð¼>“ýs;6­¼>÷Ì’;çûÁ>P<“¶>`²}쮕}×<î"´>ºØ´;2XÁ>;Ý<ÐÌ>¬æ¹<9D´>Tqã<«“³>xÝ<Åæ³>t]ø<ö™³>.82=Öü°>ìM =Ãf°>éaèÆüÜ<~§±>›¯§y=²…>Q =šx>_³ô>[Í6?“K=)Ðç>“K=)Ðç>À_L=¸ç>CqG>¬ñ>opensurgsim-0.7.0/Examples/Stapling/Data/Geometry/forearm.png000066400000000000000000013640401277777236100242700ustar00rootroot00000000000000‰PNG  IHDR{C­ pHYs  šœ IDATxœìÝÙìÙq'öo,çü–̬íî½w³%’¢HJ#YšÅã² 3€g`~òƒŸü¯~¶ñò` Ȳ0Òh§¤¡†¤Ødsíf“Ý—½ß^nßýÖ–ù[Ή?d˲µ²)iòóP(ÔKdVeœ_œ8ØÙÙÙù·ÏéùüÝ×î¹Çsß¾é/½zç|ð÷oŸ¾ù΃¤JªnQ=Âk­ÂLD ¨ŠY•$ݲ·iRâ¾_P¦Õj±¿HW/-¯]Zÿò¿zýúë_¼~û¥ßù>¦ ¹Åªƒ–mÎÜýØš$·ÙJ›Íü/çú¿øÜ+¿ú¹Wæ·¾ôÀ Xá‰ÃgÿÝŸzòÉ W/¶O>qøÄ#û_[=õØþ#—ûƒUûѯs8?~ûk_zå¹ßyç›ÏYÙ\¾zõðÒ¥½®¹ô?­)…UG0¤Xu÷¦í=|.NB@† ÒZ«$e’©–€'‚Ì"˜àAä`a'çð€3˜T#,¤UbÖœs­ó\-‹0’¨ñ0)LG ’æfÿÁÉÃÅj€{3"Rjñ‡·¿v`ggçèÎýóÿóW¿óK¿ùÒ¿þ½×pü-à*ºËŸù™§ÿ«Ÿÿìßýéÿì3Ÿ¸üäcý{™ðþõÞøúß|þ w_ûv³Ü[ìí\¸ðcûg2Bsž‡‰˜D4@2ç ¥‚Da"æ (‰ƒ‚‰ Œ™¼ÂJ%³˜¸˜iÓ€Áä%\ˆÉQê¹…cÑÌÕ-«ºù4 XuWáà®]´ZK)DMÎDÔæöèð¨”r¾Y—yêÚ&»ÐÎÎÎ_¶ï<ü…ß|é×~ëåç¾y#ÞWŸúG?÷©ÿü?ùÌ?ûoþé>s釽º?âôöûo~ëÞüÆ—n¼ðe³îV‡«ÃÃý£‹OüƒŸ“®õiJY'£j³ÏSµÊ”ª¹8âÃ2 i®Ìáæz2Qý0¿ÂTgsXOef(\\%ƒ$Í6à ˆ„¶ÑV‹U,ºE ›†Á¼fV©áQk)µš%Ub&³PÕ¬©i`V­°”Ú@Ìó‡Ì\k]ö‹5@¤9»Õ v`ggç/èνõ/ýÆw¿ò­›ŸÿÊ›7¿ëïý‡?úÿƒÿ÷ÿí?ùÌ^ùa/íÿm×o~ãK7^øê;ßþòño-÷ÛÅŠÚþÊSßÛ[1S#àÜT÷:Ž^Æf› ‹85H,`bQÀ™˜TÄÄÄBpq «áLîä.D$BA̬ìæuΪfAî.‰"LH! vbÀ)w²º›g3Ž$‘0GDˆÃ)æq113±¨¨ŠžŸŸ¥¤ãfãÕW{+«FDVk“›¤´ ;;;¿ðë×_xùƒqŠÍf¼xÔÿ“ÿøÿõù3L?Ø“Ø?Àëßøâ»/~õÝï~í½ï~cÿðh±¿·Ø;ºüÈÕ£G÷bS-Òj¹€›[©œÇÍÁ]¦€‚@ÆŠ È-B(e00eÉY¶;ÿb•"ÆZ„3F–H ,ÌÄ4תªVfv ‚r*fV«8¢z)˾7+pˆj "¬Äš´ihÜ“&JœNî OIÜÜ!"‚¬g›óƒƒƒƒ££Íf˜ë&¥7‹0s•¹…ïR@;;;:/\¿·ï¯ËlSñŸÿO?ñ_ü£Oü°õÇ{ûÛ_ýþ×ÿõ;/<÷½ç>ŸR¾úØã®^]®V?ù~®:æbã4Ì›iÙ‹6zñ`iîÕkDhnµi|O†˜J´ šS™ŒÝS—¡dÁ IsD!¦2×”S #’@°de©á”m˜ÜÝÄ]×*g SQÌ#<8(È”;"9DˆááÁ`°Á ^m*%åVX½–¤Za¬ ‹cQCˆM Ðõ3Ïó4ŒSN™”‰9æqùö*Ã.üáøÃ~„?n;èÃôãÎÎÊÛ7OÛ¬W/ö7ïžß¹?þÄ'þj¥ïÿoÓúäå/ý«{o¿üæ·žûàú·…µ=<ÈmáÒåÿÿÓ¦ÍîTJYÃpÿx= ˦Y­ú.«±h0Q%e®L"ªZkتo5f%Æ^›NLÄ=@" æiNš²j9·*ÕHfqá2•œ3Y©PÖ”r-ÎF¦ª³•R˜ÆÌH)3( Êæ^1W‡‰(‰phpΪêu2ój•‰DÅ­r^4„Rê<ÏĤM.^.$ÅŒ˜=€÷*»ð‹ØÆfP‹S™¦2ŒVJÙ>›`f"aef%f!‚›ŠÓLø 1³aûu!vþ¬ª»2ß~0,}ꑽí¹´|äÒò‡»°ÓÝw߸ñâWß~á«ïï[§ï¿5™?<=»öØW®=úìOþìb¹ìû>œÆy,Õ6×V­Ô™{«î‘˘ÃjÕ¦«ÅûE*Õ‡É!›+3|®Äló\QÛ”áshCDMÐè–Ú†AÓT¨¥:’Löð°p‡*Ą̂0«å”$åZ¦ašnAÄ"ìµVN:…U+¬É ÜKµˆ(æQ-åV•Áá"8(³«x™Ìˆ‰@iž"b7)ç¬*‹•» )sx¤”ݱ w9"ÌKõ³“ñƒ;'7oß}x~v|¾­ZE 9E“$‹hRVM S==Ûœžmæ©yפ®KmÖ¾oû>umÛ¶ÚæÜw©m›œ97©ÉÒ797ª)%abῊYÚ¿2”À•£î‡½?â—¾ùÚ׿øÖ·Ÿ{û;_yxïÖþÁÅnµÇ¹Ùß;üØOýmº®ëW{ó4Xø<ÚñéZ˜Šû<f]8Xì-³Õêfà:¬Ób)"™gŸ­„…¹Wf ¨pg6×&1oÆx1žÃÌÐÕêÕ]T«;Î-Ü#BA(ÂRKu¸V“ ³Y!ˆ0‡Íî.Êa^Ý…‰AîáîÌp7Bo³FIe.€Gµ€ª&Ñ4—Ê qX´éØŒÂôðáÉjµÏ¬VM%ª™0—0«FL0ÿð’Ú.ü๸µž«¿ûÞƒ¾÷ÎKß»ùÆÛ·ïÝ?ß ó4U³BÄVE‘4s¢œ4qM±Çqíxãç%(T¤m’6 797mÎIû.·m^,š®Í}£m—öVýááB”.ì/˶ïšeß´MjÛÔµ¹ksΉÿîÇïìüe:¹çÝï~ãõŸûðÚ׿DÌÝro±\^¼|éѧ¯=¹·Zí¬šÔÔZ‡¹l†õéÍ›ˆf!âažú&?zíHó¼™çÙÍ\¤jÊË¥‹Ä0ÖZ(D IɈœ&çD`ž#7ŒÂ<,å\̨faÚÖþ×:«* ‹6D4¾½j•\˜yÛA¨¸i ÖZ«enX¨Ë "ŒØkk¨†2×j’4ÌYD)%7cwÛ^ô¬ ÆXÌA‰™U£zX‰ÀÁÁ3 ó,T½‚ˆ&7î>®7I²¨¸•mŠy~àø~ÊÞx÷þoþ¥ßø½nÜxpzºž«™ÍsñRE²nTî_«Ç—ÒCð°·èÖƒ…±Y³)톯½c— Á¤ äœRbbtYr›û¶½öÈe+c“uo¯].»E—÷Výþ~{áhuéâêâ…½ƒU¿Úëmnš?a„ÅÎέwÞxõù/ÝxåÛ¯ó+7^ú¦?¼´ß-Vm»¸òÈ£Ÿø©¿cšn¯úÕê`µì–gÓ0MÓ{÷6çÃ4M"@‰ìh¹È™»åaÅh؜󰶔UX ™óXÝ*T`³jîJaÄ1´y¬#q8‚À‰³‘„™EÕ¼øœµP«EDn›Ô¦a3*‹*»3¢n¥ÌÂdf¥U\H ê^ÍY„HxÛ˜n®ÕÝ9@™l§~Ñ»»fÞ¶™9Âk0 1PBDˆ2$û\ˆÜÝÜC“š!% ̵ÔÚlÖËÕ ìî¾K}ÔÞ½ùàs¿ÿÒ/ýê׿ûòa¨p 1掊â„ܸ=ŠÛWÛ÷.6w÷;Ê‚©ªƒbl‡“ªëH/žðÝr!)…™£NÓ˜rÃÛ÷VùÞkï2 ÂmÓ´YEiÙwý¢=:X^¹¸¼xéàÊåÕµk‡O>rá±GŽ.­Ú&韥ãùÎΟ^^úÚ×ßþÎ7_ýúsw_éÍï¼Ðe¤ ÑtáÊ•~ïàoý½¯XII„%͵˜cµXî/]ÛöS™†i<=_Ws+%§¤)àâÑÁbÙí-/fÇ3IwÍ=g¡0B±Éi˜‘˜BÔ¡¸9·)gQ³yš'°¦°êGãæ*TÝ™%%ö€(ÜÈ„X™ÍH$«»W‹ˆˆðIM#µR1‡C2«&PPÝÃq~¶ ò®íSJ)¥RŠˆ ¢Ô ŠœsÎyž îAÕ"J% e6bRx5W¨éZ7«µË\f&35"i¢EfØVz>B''Ã×¾ùæï~á»/ÿæÙÙ()qDØ\Œš¬žnºþtûÁÓùúÞr“Ô[KL!ÉB¢VW'ÑMÃ÷>¾¬‹µÝÑý( Ž)u­{8… T̽ΕX¨Äf8#@s†Ÿ‘D“tÑ5‹¾[ôùò•½§ž¸ô‰g¯=óԕǹpõÊÁáaŸu÷‡±órr:}㛯\ÿî¿ùë¿vã{×Ïß¾[àÒa{p´ºpùâg~ö³9gÀ²æ`ôÝBDعk—î?<ÜO—.^¼rù‚MS9ßlŽO˜Í$I”¤!ÂÅ {mßî—ivw3+ĜȅŒ$”eæâÅ»&G¤ëšužfsOšaA’Æ sAê¬I)£œ­'E¥®GD$MÁ‚ZF8ÈÃÈÍJ­Ó´íÈ&*ºèºyž§¹3ÏóLÂ"„kRN¶-Ø+æîªÊ" ²êI•fÁŒ†ÛiQ ˆ9%-AÆ51à " Ôjp sgLìîÌdás)ÃfÈû;ùî&ðGišê+¯¿ÿ…ç^ùÎ÷ÞZof¦ð€±0mg¶}¸kçKvó2nò}¡Üè*+ˆÈƒH *^££NËôÐï\i¤V¿O‰ œ&÷€c{ŽDªb¸S0E`®ÄÄàõ4®×#ËyD¼ù^óÆ[÷®_ÿà±GŸ}êê§~ìÑÿ±Ç¿v¡ïóû5Ûùk`ýõ·î<ÿµ×ÞzóÆ×¾ö[ïÝþþ÷_-å`>’n??uŸÞOû~¬QIYT¤_4®YózK-´­’¼tñÂÁþê“Ï<>!†Ít÷áiëûÌS—WËn—ÚÙzx:¾{óìËß¼ñúkw¾ü·^{ãÖƒë¯À€ÇY›¾OWã?úwN¥®ßýØEêóaÎÙ¦ÒvyÑöˆJ›Ó\ƶÉOã|éÒŧŸzbo¹ìÚþtsâ»§çë͆‚>MSÛtLѵ©ï»ƒƒ¥²”RIõ|œ¦a²Øö`"²QG¸Š¤¦©›„P-ë21‘*XAÃfãnÚÖÆT¯eR'ŸÜ..ú¹”$2—ɽ®Ç2SÎ ¥RܶU}îªÄMn)eòâîŒ(eŠ0"ލªj&)i­¾¿èÇíÈö"*e78¥”€mÒ¹.ejÚ¦Î3[„ˆ(k5'‚;­‡MnrÞ)‘XTÁÂÕ*ˆ²¨ƒæjánDäY%%D„M¾;þÈœœn¾ýÝ·¿üÕWß|ëÖ¸™¶WÃ)(' ˜×ÊJ¹Ô%Ý¿ŒW®Ä”"Zv'+D°XD‘ÕFW’K‚Åb`Æ©9*èÍš-`( Ì$ðÊ,îŽcC˜{Px@%ˆ1Ï%‚†Íp¶Þœœ?<>{ðàä'?û̳O]½rù`µì„wÅ£ÿV¸û`3åµ÷O_yíÞ‹¯|ðÂK¼òê­óëo 4àÌvWŸ¹ØúæñK|óö[äÒ6Þéñ!ÏÓûW›ñèò’˜†ÍEhÁó4{ç9§¦éÌæ¦m÷W«'âÙgž®µÞ¹ûðd½¾|ꀻ{1€4%~ôÊ•v¡™“»§¤²ÙLÉ" Ä!%"Q|š<Bbn¦âsÊf33¹W3""¶‚ÅbÁÌu®¥FX)BrzvÚ6mnQ­IuXßÉšÌ-ç쀕ÂÌÛíó4Õ®IÕ=‰h†Å¢+ʼn`fÕš¦±ˆÍùyß÷ÉÍç2¥œT5"˜Ed;¡ŒSJîžUá0Ú¦‘Z«Hª^%q¸ÃC’xضÔÈáÊD$ªŠíJ’i^oÇHnàˆðP‘]7Ј9Þ»ùàÛß¹ñòõ÷ÖçsRÚV…ëoçB˜øƒ\¯÷òÞÞB„;5 "Ƕ٬0 º½ÄÈ4—ư¶× ók·¦Ùp[lb‰ Ž B8*™‡yðaó À˜y{ט Šbus>½?­§qzpÿøÍ7?øô'Ÿúä'ÿij\¹¼ßuÍû…Üùó;>/§ëáõwO_}ûA-òëï¾üæÃõ&Þ{ïÁ½7àÞ9`…8úQ@ŽNI¥iiÿ“OuÌ>Y=¬H’ð±o%?… ÷îNZu±’‡ÏŠ­t¬G‡ŠˆÇ» ðñÉIÓ·‹½eJº¿è½üôbµÈ9Ÿ­ßxëÆí;wú¾Ÿk%pÊ ©\>:<8:Jɧ¡€hœÍc™Á¬Â™m»Û̳ƒÈ anœ·õla€ˆÒfÜ,úŽ ²Í¦:ÌÍ5åÉ6DT«- yʹmÛaÐ!Ì‘TÎ6çmÛÎun›VˆlžåÃjÛ¶Ôâó< ¥`&â¶UUv3…Ùö¾kZ•ˆý½ƒóõ™‡§ÔÔZÇy>ì:3³¨ªÉÝ›&™¹¨žœd+Ex„× f1¯ó8q—s0Èg&õ €S5h""°Rš¦ ó¦mÊ<µí¢Ôy.FLn^æÂ»Vq˜Þzçîw¯ß¸uû~©•E‡›“HÁ™•7®ÅÝ£U‚ ›y€k¨&amßÝ ¢B’Ôj½”)óÔ¾ã->±t‡pm8™9³šYPõ0àd¥Ö¬ 2q8e­^լΆ[·ÊýûÞ~çæ«¯½ûñWûéŸüØßúìÇž|òêŃ¥æÝÌÁwξóò{·ïÃlbÍ œ¯‹¶]g¸{óÞ½ÍýµÝ¿}>GaÐíçwÞpã] X´(!1ú ¯ì!‰öŸØã'SâqØä$ð¨6l(K ŠbJ–©˜ºG]öyÚÜ9°»×.õ<˜j„{YÄý§•Z†ˆ›¦AP˜yÔ¶[¾ÝË×ð6 1·&$aÕÞ¼ÌÃD)%˜«ˆ“‘RÜÜkÛ´@ÔbÑDD˜º~•5¯Ï/^¸Xª»³Hm‡éÚ,Âu[ÕÍÜuý4DÛÚž”[fª^‡yr™ÊØäÌÌnÖ4y[<¤*îÞ4Í )+ˆ$%&·@¸{ß¶¥Ö¤©œO»'€È0Î7?xxóÖñ\Š…g…›“¶ˆêæDVG+|3—Ó#òÃrr!e cgb“‘HD¨¶_Y{M¹æœJså|5•ï?6óѨ‰("PêL¤`ð¶ù·º”¦2…9+{ÝfÙ‹QX!¦Z›ÍðàÁé»ïßyçÝÛo½}û'~â™ûø>rñho!¶QÚ;NÕë/ÿÚKÿÝ?î _x÷ô{ÐŒÃ,°X@NÈ †îh:øV @ÂÜ_[´ïgÌsNÍz}.rPmŽZÙÍ<ú~¹^Êb^ J@­•™‘»FeXwJ¢Ì¥ºµ|/?\Ñ´ÙœÜâ®Ió¡?ÜÏç|o¡Rá)'mSßu‹Õ²kZƒOÃðìS?óä9éÓÓ÷oßË\ͬD­µËùÊåömº¶IŠy,³ùz™£n;¨µm6Ã8O"2ÏVkIIÇq“Rrf[Cí5P˜E%ܽ–šÉ A9¹»1 ‡jÊÙ‰ˆ…‰h›r)¥”y$"•$¢™¨ÔÊ` „˜™SJLdVÍcÇs÷œZe©µF33³ˆnwîDáµQô}_JAÐ<Ï̬‰™ÙÌrJDØl†åªÑ\‹€ÀLBp‡¦fžçmîuÛæÙÝ݃A¢bÂ\™3æZU8¼Z@4;{›ûT±; IDATfŠ QŒÓDNÄLµFÞ€À4Îg§ëa½a·¦r»ÙÈÁÎ`‘“v8¾†Ì¬ŽÊH„9H8AÄDœE wN™„µkà äf– ŒïÜ;yÓÛ5µâŽpóÉpcexk ÔZØ´]  …; »3SÔ°a=¾;ÕõPnÝ;~ë»oüøíOê‰}ö±«WWË.é. ü œœ ¿ø+ßúÿ÷ç¾þwQ#5.»JÛvÔw.Dá’ódŽb‹‹mÛß»sûèÊ•óqÔÄã<'ÍuÛ@ª†÷mŸsžë˜•öV÷ï3åq´ÌšûfLEˆ©m8§dgCõ‘™—*Œ •ˆÖ™n®èÏ“ˆFS–”RD˜Y5#³2MÓb¹´bDBÌDBT™yµZMÓ´=õíºL‘4ÏÓ<ÏÓ4™7y›ð)Å<Î7ç²Ã‰Z`ìTÈán`ây,,,"MJ æˆ.5^æðÀ‡íivàÌÝÏÏÆ‡ÇçÃf"’ðBùð±Õf³ìçes¬uÈZZȉսªf"QIJ¡"%IJæqµ™IY%<'”²ŸkW6ó^-G­ßÚ³×ïõçç^ ®¢¥Ø€2+P­ÌÅLD€„,b^ ¼ž¼ÜÙ¬Ïnß½?¼ûÁé[7îþÔgžù̧Ÿ|ú©K‡{=í: ýe˜çú«¿ýÿù{î÷¾ðJ-hº6/»`m<¥LÊYSñÒ.{Ñ|¾Ù´«…(з} £ˆÌ¡ÏÓ0.›e‹~¶8æUײyîZLó‡ùìâ3L‚æõØ(÷¤Ôª>|p¯M5ÉñRÏiºkë¡b:òhS¨ºîÂ^»XtD#àìääàðàGäc«år†³³5Èk…pv/}›f+Î0w«ÎœDDKµZ<ÂATªÛ\Á¬-š&3q0PÝJ f¸ kÎÙ̶mrRmšKÛ÷*ÂIj Ià3?<Ýô]—sÞlÖã8¦”ˆe›«ؽ~ø­ûƒÓ㣃£¾ï»Ü¤ÜÃúÁƒ‡«ÅªŒc‡‡‡Ó41‘ªæœ­Ø4Å ‚rJ°,Â)y-B„i*„Hh\’Â\¼ŠÈ%,I³÷}/Ìã<#5^ªG ؼ0DÑ6ùt= C”×çç‹År&JªãzcR#SlçÂïÀ–ElÆyJ)æµ…0Ã4˜´ój~ZµtÊ*.1yÍ.žTaf)%f°ˆ#„”Áe¶R6…@„"’H0F (4dŸ»Vò²©—}|LÇ{³ÞxO|1)1’•1•Ä’=°í耊2ƒÀŽˆp„‚¼º{°¤¤bJ¼wçäáéxûîù­;g÷Ž×?yüÔ\’ÕÉÌ>,ŒfHÎ¥–€%¹ 2lÛ¬t·áÜõ‰Eƒh*3o‡12[x›ûóóóåbu¾ÙdÍÛRËõfÝw}“›j4ÍóééyÛttzz&"Ç''}_ˆ¨k›¶m7㸭ÊÇöxV’{€É™E”IRêÈ©Kn ¤¦‰jª©Ö*ªD„à"Y‚H™*Q­ÕÝU„9Ü49%.¥ÖZš&‘ˆ¶mÅ,%@›òÉÙÉTJ—sçB gᨡLA¤"ó\ Aežá1N“{ÉÛËqÓ4µ9™»Ûv¤ñ.ü mÇ8—â„^‚*g‘åt•Hä)©ªn sˆ(å$¼'dDVIásÍ]b!3ĤÊ­•@ðâ¤U­§£•=:߹؜ß=]¾7ïÝOYÜ+8²$s›±íC+¶ÍþƒÂ$ä”Q¡*"BDµVŠÄ8×nŸ c}x:ݼyòÙÏ<ñéO>öÌS—ú?~„Í_ªašû¶ýAÿ–Òõ×ný¯|óÿøßxõÍ;p´Ë^Sr–¤Ys2 Õ††Hm6BõÍ4*ÉѲrR¸V8#-W\ç*ÓÁþr89s´iÏ1N{©s…«36Ã:„“r㳜nf±×'¹µ÷Ê÷’GÛfÒ²^5Ó…ŽX¶ÝÑÑžïíïÕq´±DÄÁáÞ³Ï<»¿¿|r¼9}X«tµ\ˆjš¦mµ A"“•œ³ˆÎsq‡*ˆrnRòpwhæ@èvº;S­fX.ºZJÊÙj%IÄ©ÂTÔÍàà@“³¾q÷þýË—¯,º…»ãض­²œŸŸ÷1Ñ<ŽmÓ¤”dµ g'ïÚ>ÜÆqT‘R m{ª5MëîÕ+3sNYHk¬¦&S i¶:2…H‚Šª:܉ɫ›T`h1ã¶A@DܱúÄÄäܵ-ÎÎÎNNN‰hž‘Û¬ ÜÝ`9g¹mçZÖ¨+3Â#Dj-pÛþ»z„¨23l{Wsîð&²ÙIu‹²$'’ 0òÏ&ÀŽ,ÅS,)HÁJdÉ–Ô²šT7»ÙÍá‘|o¸Óªjï5äC=ùsÔ“Õ××sqqpP»Ö^ë71!‹›13@k}´/…53zïçgî– ———Ïž=k­©ªð,}n3ãz­_-B*…°÷0EíZ4,¼;Ò+FÔêÀD¾J‹3(Çq„$Š6c|9üü+ÍÜÜ!À3Ò3ú‰½‡"„aYd– €D뎆ðo7‘‰Ý%…9Ì™(Ì‘9“XŠpïÝhØ¥t/êÃùaà}¹ýt´7¯äÛsŽ$€‘ ÀUiZÚf»mîÌ\T¢/fa„ìÈLÄŒ‚Dûc?¶Ãaò›»ej†¿þ¾þàbóókˆùñÇÏ^{í’~ɕəù'ÿñãüÛÿá_ÿÁ»×7Kl.¶œéUjJ†ª¥& —ˆ@<+c/Ë´´åé§ŸîÎvEuo3×B=Ò½ÏóîüònФ–]‡ª ÙÐ,ÎÑ¥uZö¢§óó¾eŒöÂç/ÎôB«Hì·0W„¯ŸÅ¦*!ËPªj³íø?ü÷ÿíùvw{wøð£êf8;Û–±N³õÞçfЩJI ¤ &ÄJ¶¸ƒ[ £CGxD `z†Çº¥Y©™ ˜˜UŠ™³ÖèÆ,Ý ›3ÖÌd-ˆ°XgF­RDÚ<ƒ&ñ¶Ê4/ÂbaÃ0¬Œq³A!k¹™O½uLô ¹»¹+uÔ22af²ˆ[,ý(¬ è­ªV"I†æI,J”î™n½j t$„nÁÂÈ «î,‰!̈H#zï‰9÷©” Šr&!@sC€ãñ4ÏsëÙîœ,ŒˆÑ"¢”bf€™™",Bhéî›Í¦»i݈ˆ»³uG&b:Üd’0‘˜hÏ ³Ív{šNÄœˆéK³~üÉóóóí£‡Ä¿L‹ ››Ó¿ù¿¿ÿ?ÿÓ?ûóï<^æ¾dÐ#‰AP%•ôòlÈKsdQ-´î“¶g/^\_>|-úðó~üäÁƒ³ÍXwçã/EH€ï|÷³ú/þÓ¿ü½ïþè£gnvq¾ÁÈÖ[2åXwáéîÄ̧ãÄu‡ˆ'Èt/ãÄûýa(ÃÓ/ž"ãÙv{Ü{¡ÖÛvØN‹µ³‹û‘9Rimªª1ÔB KúeÕæýóGöâøü³ÎXÛ¶âŽæ²œ6Õ—«éâ|'Bˆ¸ÇÞmUX«êk÷/¾öúýÙsé–Ämž‘%ÍCœ·»å8íï•üÚVaºEçe¾yo4=Â26cÍÈ.ÞúÆëîq}œD$6ÄtHp?-ŒD,€é`˜ I$ˆ °ºšp© Än!ʰôI£¢`BÊ î#X7a&ÀSoŒ’Ö­µ€¡j ZŸ|Dê}Æ:ÔBD<Žˆ¸Ûîæ¥õÞTÜ#<³YM ¼”BˆW×W¯½þº[’’¹I-LÃPy¨méÏž½Üî¶ ÂâžZ!ë áD$*Ý»ªfƼtY=§Y˜× afæžÙ-´HN‹»g&‰°™¦S!ÆÃ[m!l Zñl Ôšé¥ðí~B€ª…0€¹µ^J-ZZtXÁdT|ÅÅewg¦Õ`îËð3¨Ì@ ÈŒÌy±Ó´öÓí~žg?Mó§Ÿ_]ÝL¹Ûl÷Ç#84ŸKÑg‰¡±C"Ož{Ó(è)5B„„‰–ÜŒU…¨Î¨‚*XH8"Š,BÖ;dÚdDŒE“ØÜ=i;ŽÛ Ü샎rûÛóéî ¶—ËWþÇã8£j!AH$Æ%Wûh ­Vk]Z+¥@‡p7$!ó\–NˆŸ^¦Éꈅ¿úæÃݶþ [ÀÒ–O?yxÿüÞåv»-÷]0þý¾ÿþ³ßþ?¾ûÏÿíw?ùøj6GÁpBZ#Â3ø5Òzg)™‡Ã¡îÎ|AÚ]æ‡a¸<;íïÚ²0mªí÷@љƴì’ÊLî™±=Û¥yoËépÌâäóv¼‚ùÓ¸zR¸ãòµ]ÿŠš]_×ÂøàþýífH3**¢B,¿öæ×/ï/½€­Â莉ŒŒ¬ÊŽ„xjSI§Áȶ&Û`@¦EÜÚ÷>¼ÆüÈ2áÛo=8ßTø7™áúæîÃOž¾öÚ½{÷ÎÆÝ°Ý ;€yüñŸ}üO~û/ÿèO>øøñKB+CåLÇl½"'!“d0•$*ece;l¶Ûi™¨0'–±.áýÃæ¬õ8ÍC©Ó4gç›ÝÐævíÓh~{ö²­ÏÑZì6,íùpü|3ßÎóíæŒ1t,ó`wØJ@(Å{÷.˜ˆ Çã;ß~ë÷Oótw8ABsGOèËÒÝ"!#HËX ¢Fx2 Bp*Nî¼ÚÎQ÷NÈž$èa¤L 2T$´f ÁEsöAÅ=™±õÞ[ËàUŽÌÜZc">N&lv;$bÌèî›ívYÑ„Çi7›u{îC•¾,«$fB"FÀf³™çi#» D®ã°4W0³q` c‰ˆ2Ö\Ù–B$Ä A€X„=B ºõÖÚ0TXM|»‰@ÌË¢’E¤q6k½7QÁDOLDœg#Uu÷››[ÎÌ¡V›'7™+÷zoUU ×laŒXÃâ38ºE-%#’ynÈðeø™”GܦO>{ùÝ¿ùì½÷?}üéõÕËÃÝa>Nsëæ§Ó|š=_mk0!#3"’¡Ðp¶—Šqˆ‘Wa-Ý2P‘ˆè„U¸0Š€"3Ã Ä U³J†¢fŠ`Ë¢¸QÏj„à Àìº)ª%¹e¤;D•q÷æ:_Ägï/ËáÊÿá1ùlÐŒ8¥‹ ÎÓLC­™F"èÖ- i±EK–æ†E$ÓšåÓ'·Ø=2<Ò<¿õ{—£ü,,ƒÎ·…?òâÝ÷GÚÙ_ IDAT~tvVw»ª_}T‡¿_ñÍÝô{øÃò;ùgõéËëýn#”aNàf¹Š*ÌÜ „PupDlÞ=òòââpÜï.Îͽ ˜ˆì†á4ÏZòÞ» lËÔ(OÖ^œûó›'O?¯C)›º@6öј×[^¦~AoËh×ï¼Qc3†¡ìÎÆb%deÂßúïþ볋³ýþÈZ"¡¹7sI\–å•ÉS†U”&LÔzÌDTæDL 8žzÇn¦Z‰DÅÌ08#P™D¼õ ‘Žî¢¼zÞfDôž‰µŒ€ª2Žãé}š"CIH…ÖÔëÌœ@îiæÍ:!ÍóTËDD¬æ™ÝCU…uYš™"‘ ”õt4#æ(¥®[øˆŒH€L·UÁ¦¥@ÆFÌ)ÀL™îæ(ˆÞÝ<ÜÝÝY”k‘˜À{UfÜn·½{D¶Ö#¬5H"JŒdÌa§eF€Ì\?rïWW·¯¿ñz"bôî™ÄÂÌ +^âˆÐz)¯Vˆ„d "ŠL­5ø²üôåwûé£O_þÅ_}ø§ñÁ_¿÷éO¯N‹/SOD&È6‚,\z,n!kKB@rZŽ˜¾ ü>þìåþ8G¸{dOðÂŒ„A žäì)ˆI¢%R0T摎—¹ŒvØm3À")ywÚ'ÈÁsÑòòDŒãóÛ¶%¬‘NH˜!„€ÉÌa‰±°e2%#•wÛ³·ßúæ‡?þ@O@ khÝ 8”š}!@­ñÕ˾)ßûìÅØk_¿Û±õ(µ°Eîûˆ@$Fl4/Á Kî ­nÓ$$òÅó»é´ÌSë–TÞá‹óá§ñ2qÄõÝíüäþý‹{ç[-,÷Hø¿p>g¼÷þóßý·ïþoÿò?}ðÑCÖª %Ü­-f3³FØêÚ©Äž),ĤRt,=Êv*BœÌ®§v„H‘ Š£êáêXK­UÐszöÌ{ݬ—ùnƒ×Ž9·ã/—tÜèí¶6*@ÀY™†q,(LLñßyëþ½{ûyž[ì6Ã<Ï–Œé ž¨¢"I$DÜ=cõŒ Fi­‰ˆ#R³šw3‘ˆ@ÈÔªB´˜¯.üˆXTë0¤¯¦@bf‘™ALËbÌ<ŽcfP"ö0ZÏr ¥öÖÌBFÈÈBîÑÍEˆ™k¦i*¥ºE)" 0“Ðõ÷ÎÄ€˜@E¨µ®ŒÌ<{ˆP8%¤›×Z!=TE[O@@L$€ˆUÇ "™+AÓ¡ddB,KCDa^ÕΙÁ,«+Û ÉŠpïé=ÃQpP¹»›WitDÀ+¨Y‘Ñsw!œç‘‹k𤙩Hp2Jïk?€UbínëWü[KÔ/i ?eeÎSûâùÍ?úâo¾ÿéû?þìÉWÇ©­Ú?"¢p ÇÈeY„I8##½[„&kƒ/÷èæ,[>Žõ0Š•" }Ü@¡´{§)öHÓs>ÿt9[rtdððÄÍC(Ü=Æ¢B˜sÂõñýϾϼfª2 1c¨¤"kÑŠävØÜcÜóþƒË“}¼µ»üÖÕ$޶rÖ!Ü (Eèüìl™ÚÍþvÜ ™h`éPXÂs6w‡éݾ0sȨ¿óök»Ÿ &ô"°^î®®ï~øÃÇ÷îmŠ 1_œoø¿œ2àéóßþåãó‡ïÿÑøÙwªLá6w¢KQ3GÌR¸÷ÈdvHd"²Hñ ¶\Ú©”«hÑãa&b™ç6 £÷%Ø%óøüúÁƒ{‹Í§»;hþðGc6Í~ºÊE {Á9§ØnËüì|<žñŒ9ïôrG/U‰”Ñ,^{pùëß~«»·Ö—¥Ís+B-c»Ûápš›EŠ–R”˜eiµ0"1' ®/hGd¢n©ÈÀCZkÌØ-À"Tt奨êùÞ?úÅõþtr‡Lƒ€ŒL@GB¦ F„ 4ÏìDNˆLmÓƒº¨7;ºÝ‰jŠÄ‘ †Džù•G®Ÿ_öËë_yðö×_‹€«yúèóës]>9nN°Ã$wTÀìKee@&NÊÅ}¶ŒLUuOI§¥¨`R¤©hefŠÂuàQéLËüNÃñûW/?Ç7}y]vÛtÏp_—þ$’éÏŸ=S©µ 8§½ñ¯½|üy2B†¥ÏæqX>|rwþý/î_nTå[ß|p¶-?ñÏžaB‘ªÝ³÷öôÉË~ðd†2¨o·•á6A™ù×ßö¿ÿÁ»ô'~ÿ‡ÏonŽ,EH¥7sÂd–Ö–ÌX[íW‰d§2¡VîSË6±tÂH+Pº5t:M­GøRÇ-.Ó´LÃnX ‚Ÿf9—Ãô\ïöwo¼ö¸yv{÷xßúƒa~T´½y´CËýq¶›ñx˜ “%Íc6ÿÕ;߸ÿàò°?j)ȘÄl‰Ì (*ÜYˆ–艘nÀêZ L­eÆr:ÕZ‹–ªÕÂ"3j-fÖÚ,ˆªá"‘ŽD™¹2 W­V˜@2ó4ÆqÛºi)î±!4÷Eëæ‰I´nåY‹‡G"’P¢-sCt"]%¸@0n èÍ$̼m7›»ã^˜‹"Tá±Ö}ÛŸN3º'3¨ª™ñʆcZa€AVHÀ\•Ü;¹™1‘0Ûú9€–bžÀÅ­!0 #“C"``d„‡iU@H°”™ÉiÐL„×8䈄€PVbÏŒt*¥¤Jï}q§•;éJØ[C¤:¨{"¢*‡'{&~iýSTzÆÝ~~üøêý>yÿýÏ>yüìêz?[â*æH@$$f‚4 p%G `ˆ–ï61+´ŠG2Ѫ fo~óía;>xøp¿?ÞÝÝ~þÃBb'ØR-»NqºiÓê‘Çè¢ H€’=£7"t Œäô†™=ŒÒbUÝ“ª6ƒCO@,L‚œ Ûr–6ïÔïmgöÑ©½¼:îøüu1a•“#@š›ª)S›Yš=ýÑG»] áèmPµÞ_^Ý}÷{±+â[_¿w¾û £ÄªPe¬LÍÀAkŸ~ör¬¥ÖRÕr9ÖŸ¼»üµ,ýßçÓö¯Þû½?üÞó—sx«EV¼2¶SCJÎL@ Èuþr/”‘Ñ:x‚C.|€y‡‡±ž4ïi[«;08ä_û*·Öq³Ù\\œ]^Þ{òäóUia<Öc,äýˆg$ˆÈa}MJƒDJf $¤nIDhj‹²z@d$!eÐd}"8¶À×]F-¶qëÚsïË)¾æ2ºçª=N)¹j‡¡ ÅÌS¡0@–¢ÃõÝéÝ÷ŸDô:È|ëë—g»WGåïT¥$qº;3»d½½=<þôjÜmw›a¬*÷YË/ 8Úïÿ»þ§þWùÏonOÄ9ƒGXk‘ÁˆDkòôn¥V÷)Va§t‹ËßòwÓÅ£GÉeÍwµãfØÃõþötXJ•´ Œ^k¡å°#¡Û«9ÓE¡{ç¦O>¸ØÇþ´â‹ Ñy(<Ôšæ«G%1²Òbö«ßzóWß~ë4ÏmnáÈmñàp%Gèn½;""³##"¶ÖëKD&&"I­µjíî•%ÒZ³Z5Wó-"‰Ë4Ùf @¥w[MlJ)饆0ÏF&È VÌ$¢t\]  2Iˆ,ÙÃYÄÃEhžçM­w·ûwWeÄ‘Ì,Dªuw¾ksg¤ÈɸÌKBÖq@Ïp'BkÎcqôÅA!ZˆŠ0Ï­ÁêÈ’¹,Ë0 ½wæ aZ dŠDï¹båµóÉ=蘌¥ho=lN(¯\nDÕÌ i^æZë²,ãføä³—I@w·§ÃܾýÖÃûg£ÈߤL…Ñ3˜X€on÷übëfSJ)—÷6ôóW‡½¸>ýŸÿîGÿËïüÕŸ}çq›—q(¯ãfhÓ¶,)¹ô–½ÍR”Â…Ì!0 ±õnD nè†ÃfXæ óîÑ=;çXzÚ¿?!øÝH;>Øýø|yú1·'Ýo/àxyÆgƒ *Û²¨* e”~ãÛï<|x9Í­/Ý#˜ˆœ„É ,´¹'"¢Ðê‰ÐÓ`¨‘‰€€5D(¢+Á¾µye¹3 ƒœŽG$Qâe±ÓéTTµT©µNÓÉýÕÑÝ‘YE,‘Ìp]€”D–þŸÄ€8ÀPŠX73“"„äæK_´–ˆ˜Ý,}¬užfÈ,¥Îó)"¹nsšÂœ™¹Êà´4B¤HgƒHfæyØ ‘Q†¡›qòi™5kH˜E©œ°ÛnûÒ™©µÆLªbdÓ´ èü?'Ñ»GDd¢Y[Mã3Q˜™(  VÌÌnná–Ã8¬_ˆ”i>õÖÎζáàfÂ\EZÚ|šZ7FbL†W#;2 ËúT|Ù~¢J@$&VÁ  ˜‘¹¬jÆL`"$p ]ÍùÒ9f 5Š8¹Ý\w؇ž8“8³Ï "Ó[ï|KKE‚UÈ D½Až]^ñ<ÍL›\Ø-ŽSÑñÙrÞ›2bAôì˜IL˜hÎH€è &„H@憑Ύ(˜™ €±¾Í¸œšAP" Ó§XNà'ÁGè¼D%¬›q€¤Ìd$aGÐR Dån­ˆœÇÀüäó«ý4íóþ4»Ã¯½ýèá½Í߉мê1™N=Ì‘­ùÍíþG}±Û”ͦ”A6›B?·\‚iîï¾ÿìÿßO~ÿßï/Ó´«•šµ¡ÖišÓ\ˆ#Ò@Q Bt¦$³™¸˜%¤×ac‘绳ÃiZÄ/=¸½Ûo·ÛpvkKSÑãþ&{ŸvÉë¹Ù¯_æáER”zæÏc¿ùìtóúyÒéÇåîá)!¦2‡y©œÃXï_>xðàÞÃû—ŠxZº¯FÁ†ÑÝÜY€„Xj¡ešK­«[3E&#f€ öÞkÙD˜g†GxGfZ·‹€‘°$¬„b^µ¸Ë²à]‚ÌŠ©Ê¥¬¹qV«Ä¢+XÂÉH¥"†LïÍz7-€¼÷#!Ä´pÀ•Y*%ÇZ§ibQÁìݧiÙlv™Y˰ 2#3 !#"¦¹ 1æêíâD”™†ˆÖí•™Âf(žÉBÖŒ¹4·\ÁŒ5&>0"’™˜uÝMõÞk­ó Ü–?ú³þÅïÿà/ßûüãOoZ뻡xoÈ»wBððÈTÄq7"ŽLÏXEÊd)źIŽó4÷E‡±/6ŽÕšÑv FŠœGÝhk`¯çÕ_Æå(‡ùöw.g<7»¾kWêõü’úòr¬Â´ÛÔĬLËÜ‘`w÷.Ï>|xq~oTnsºõŽDž‰¡ªµFÌŒÅÿ?ö޵Ƕå:Ï{Ç¥ªæ\kuïKïs£DJ”D;A‚|Ë_ÉïÑ?1 ŒÈ ÙQ"H0$ŽœèJJ¡$S¤HÃsÛg_ú²ÖœUã’ÕÇ€Y–IæSNؽ±ÕÝk®Uc¼ïóºB’¨`f"Ff$@ºjË€rqRêÄ3ôQˆŒfŽ é…%Ò–eQ•LÞ÷ ¨¡ÞsÔZ¦Gm~²ˆX7V#E‰dN01õaHæûóåp<Øã.@ÔÇLÝ}£”ÒZI3Íy{FÎŽw“<óeLLPk5âÄ— ÌÖb8yÊÜÝ]Œ»ÛÛ'Ož˜E):áÕ{ß™X c*Â#=\‹Ff£3“™¹Ç¬v"Ykí½ÏÂ0[a"âîcŒˆI¥m;ïû¸¾>E¤»OrѲÝ7·1‡%,é3” ª¬¼]v­5Ü÷½»Z* N'3K@§ ”BÒ˜þÕø§XÌ$ªMe­²]…Ïn1y‰©ùLËŒ Ï4ïóyäb„Yã¨N 68“#ÆzXßùà}SHŠ ¤Ç§"©È|¾zýZKQ×ëº>­×ûV_}z'w¶ŽmØtçÓ¤Ê׿öþ‹››ÖÖVD„|¦:_ÎB”AiÃŽ‡µ”2ñýÛvÉ+­åøåæ%D³4³ KB 1¢ —éÞº\¶ÚTééiázXXˆ2=¼ÖàyžfUcLe‘ÍH;0¤BLu©fcFšM‹´‹¨mgˆˆ2} f.µÂC˜afî)ª½+Ë D„ˆÄ—ôm:†¹°0s„3óØ÷VZ™O`‘ {ïWµJYZ»ÑL¿»;Gë²"H•Ál>XtÛÜ,˜ ëæé"œ™¥”L”òøëbb&²1@ÄLDjcÐDǹ;3‘Dì>J©ç‡‡Ì03áF” .¬ÝwŒ(E¨÷M¸AµF&‚Íz©•2­; s¸g"̾*?ÙÊLan¥\]ÕëS­‹‚)6J…„@D–’IdLžû&¸)†D¤e¦Àq%fˆüÆ/ÿd`ú#A˜øžGp˜PrNÍo¦»—¥OÇ}Û„BÅëÆQÆË‡·ßß¶‘ÇM4ÂIfL‚Ô¡Ðe’RI$„HdÀÜ 3eD ’`ââÑ‚†' ž9]%LcçýuÒ‡e}öÂF«ËÉ¢'D¹‚"³__-‰el¦•‰òîîüÝ¿ùˆÈ˜ ‘ßúå÷¯OõSî>{ýª÷çiÔWÙóG9=9½ùâãxû×_?vÕõðôúè¶ÛèŽ\Z{þâé;ÏŸ?úD‹FÌË>„£¥1饖ȰH&B Y‹0æ#á.*¤‚ÄÔä°–á."EZxLgD¨Š[T–Ý\À™©Â*ÂÄ‘³{“ós£ª˜Ñð™I”ªËˆA‹ªŠ&Ñè¶o—¶¶¢J\&(t•ªÄ¬¥¸[„2`Áf]祃)œdÖ1m¹¶í‡ÆWe{¹Ý}¸áÕ80"XXcÙ#Î;ˆ@¡y™ˆÝ}â׉)‚,ˆ¨{RÆŒ aŽH!ö´€ŒäÊe©O0>%9´|¯È•—æ›ZÅÝ*K–w› 9_¾/´T­B@þÊ7ß¹¾>Ênp\—¥J‚’Ù°0‹Ç°SÛe|üÙÛ÷>ysýäЊ֦ò³`=\úïüþßü³ñGú//—½(K"2Ë!2ÌsSÄâÁJ ,R3S1GºÃAPb¹:úè$š g ZOG§Èm¼xÿév{ûôÙÓËýYŸ‡Ï—‡ûqþ<îo¯ž<9žøöÓ?ûúò†Žç¥ˆÖŒ}¿¬ërsóôÝg/ž>9Õ倎Œ¢Ú/F&2‰!’*Âî»±báðèc°Q±n ҙ!E43Y€9FFÎÛV)jæRÄÌ#úLIaæË¾+sfêäÄÒ$݃IA”žÌÄ,xxµÃD ŠteÙ¶="Í¢Ã"pY–Rëê>D'¢Lg.2›J™"ˆÌéK]îöûˆ¨µÜ?lµèùþþx:Ao'Ä\K±˜IõFuw–ÖæÌ¬µ–™ËRÝmÒ‘!ªçóÈZŠ2í[OB³›š@P‚PDn·N`— "Uè‹&Û IDATM¢J8mÛv8˜(žƒqÀ"´¶ëù«Ëæa®­ ’˜"C!*’A¤<ÏøDéh½\.™i>ªTKJs€¯ ÀO±¨(õúº\]I]QŠõ/‡õÌBƨC`òqÉØ[ïÇ-2œÃa’(ÊÜÇáúꃯÿB¤P²ƒ#R‰Ü‡D `3'Ò‚$}x[Ö±m`vËB*;ïUô°Åó‹üpùäâ籄R$Gy€H fN ŠDxz¢[qXf3eŠ…’Î0F ç´;2ÀœÉÝ”PŠPå<ÒÈóß‘4nש×OOFÈðÞ$8¹ÔŒáo¿¸ûÞ_},£g¸*}óèêtø‡k@­"E“ˆ‰ZBÅ©ÜocßsÝ?\>ûìõ?¾zñüT[½áÍiúO±Î—þÛ¿÷ýö?ÿáŸ|ûãû˾,-#§ãùüDÀE(“è瘂àŒp‰jÑÁ3¯!Ò%ß\îÖÖÀ™Àát2 vª—·¯3|»ëãaï¯ÇëW/ž_?Ü~ö´ÒÍa_·¿ûÅÛùõ[bQ¢Ói¹\Α¥ª|ýkïðþ ‘ª¬™nû^ÖSRIØZ » ¨¢¨†E¸³Hxºesp†¹…!xfI”B`¢d‚§Ð¤(s˜*˜h˜‰°ˆØpå©ÃšÈÚ÷®"ª:FŸ]ŽÖÚL¿æ~‡Ãñ1ÜÖuñ³yZ˜!Ü/wËP2!‘ ÏéVb “ž¨Ê6ÝÌËR/çE¹w!arë¢KÕŠÈËù|.f6Ì–e±á³)D‘bf" ݱ(óDV`žGþœþÛ1Ʋ´9–PÕ}t&A”ÍR•ÍIU”‘Ì6Ü|°. ÇÓ)Â@*¥F„»×eÙ÷m2D3bZ(ö1!ª$9ûð‹ã°4’P4ë€yŠÈcŒQkK)IÓÈRé¯ ÀO¸`¦ÃÚníű]7YKÚî™Î„éæVFDWXåÌô õnƒÄ+CA¬$BÃcxºåý+ßôt& HŠ0(áSŸçi2ÇÀóSK¥‹Öj†² ÆNé‚¥J×bƒŠ-kŽôü¶zo/CïŒ{È„š!E¦˜̪2#ÆAÈZDˆ’‘+Z a"h;Dx¨hÛ0Xª¨(“’!fO0¤‹G°¤ˆ`ºU¥2©Ù`•bfNc=, wÊ`‘1,2fûK¤0ç1Ì,ÂL´›-­31?4Ìúؙԉ8³8ÔÃRÙ†›…{ˆÁ,B QªÀÍLŠ„{f>\.U•™k!EfÿÀ0+¥~©SôoHUÏ— ™Ù¶õù¾“Qª>ö¸"GDŤVŒ1̬µÖš<²¦V`æEЧcR²>ÒȸHß{!e&‘ û~e&Ò¢:z/­HE‹VópQØsŒ\2Ùؙˆµ©‘í.U´Êe÷è=3m Õ*"@FÀÌÚºö}'¦Ùpýªü„kFt.Kyz¬OOåj•£Ä…É„À”™NIrˈÜ9G WMó!$<àÞcÛðätµ™±P0 (b…E„sŠN¢¹3RAzB™3)r¤pF&q+µHÙÍD¼–zjçlûìÂ?¼—/6yèt¬EàÄIàD–ÊÊš™ *RÀII*BD\ˆAÃÒ>¢*'æ÷ÈDip¢X‹€”‰'ˆ…±rì:>ªkH‘ÒÖ ²„°¤l¶Ñë/ò{ßCº‚0ãë/®®þ“yÂÇZ¸¨²€˜œ ªäÉ8ÛÞÂûååË·?¾^¯Nõtjµ‰rù‰å@ßþ‹O~íýîüɇoîÎEE‰ÍúR©(9Ó$F· ™ÞÓ# 1`d†ÍFs¿\ ƒÓŽÇÓÖû‹›§Ÿ|òñAŸÕ¢åZ·Ë‹­ïÿüÓjãîí÷üòé³v1{ýÁ1ø¶«P%Ö¥©*ƒ–㺶òõŸÿÚépLæLO#̺Õ"Ê:¦ŠÀri p‘zú´_!à”Ä\![n™Y´éB$°’€õM„´®+%»;ÄTJ±˜zv`Ö×u5Û‹VD\’rimw·ð*…Yƒ2ÃÆðÒÔf;Û#"3”€Lr-ÔGRK[JnîF¼¶&c@…’ɆùØ…H•‰°mûápðÈÖêÝ۷˲$SeB`&•aFDµÖ>FRŠ{´Ãâcð£ˆ3çaR}}zψˆ@ª@)Õ3Áûl9]­OŸǵÊdaý|ôú7~÷¯~ç÷ÿêõ›Km¢H¤s‘ÞGPf„¨ 3ƒÜöá™Ê9|{¯µd*éÉJP©R°ÞÖ’‘¡„}xD3ƒˆ™áQ˜{ßK­IÈÇ#ˆCI÷±»˜ °@¦O2Ä岯«jˆV˾?Âë#ü°.E8#¶ËÅ݉¸ ‹ÎÎ Õ}Û=†Ð"‰G‘%€/e—9+ûÈ”RÊÞwa±a*Ìf®DËÒÎçMUÆ0`a’æ>X”@†´p}Ì‚de‰¶”±ï ʈ$²ˆ±m!,$ô8's”ZÝ ä#íŽYÍ6fZÚºï{­ÅÌ¿¤Cg­•c Àà˜ôgU=×1ƾ'³™MÖYuôð÷Á¥,ËR«Æ´>H ØÖÍ} s2“ 'µvܶ-ˆ|{ˆ°¯ ÀO¾àR§Ó;ÏϯÇF…öˆ¢"Èa®DDAÓsœé™NÔ=;ÁÃñìÅó)° I0 )¥ð<‚Âa‘IˆG· ”‚Á³3¯¢%ÀœÂÙ+ ³u#ØR½f;ž8"ßöÎÚÏcÿüÌwTÏ!„ò˜[À4à"¡…Kx$ææ^TT¸¶Èn™eD$ i¦ †Y÷\[)ÄÉØÝVfˆVqó‡‡m'­E w'¦*ä—-^~Æñ].ŠRIE>ø¹›òÿÊ|þd=,Œ!‘\È·!Ê7kýèå=<…¹(Ìû¾Ég/ß>º¾÷îõñzÑ*:Çÿqëþaÿý÷£ßøí¿üë¿ýœ3{ß[­UU˜2siõ²ùñPï.•ˆ‘9óaÓI„…áNBLY”Ò ëg/?½¹>ìã¼¶e=¶»Û‡S« y9k‹zïÌ<¢312k’Ì—Îs¬Ç,±¨EÔR¶m+Vä,ªž®U#Ã,ǵ÷] "bôè¼[G:˜§gþtó—RxtF’Ö²1Œ} ˜¤ôðÌXd*4iX2S88‚…Tôâ¾õK¿pwÙ™É4Q‰¤=‚ ÌŒ¤à˜ÎVbHfB7Î,`#Ép8ÊT@k݇×Z¨VrË+­ìsx]äE#rìwýÖ÷·}}ë'+j 4MGdÌÃTÎÎÕ©è£E9À@eªœÊ°@”a>å:#7Ò2Ðfð žT>Ä~¿Ø’,)–û«$ÛÝëÏ>Ž¿,Òª,EUäæÝ§­ýG5 åºz0õ@SÚ-Ì—m¬Mmð¹erƒ(ßßÝ¿~syõúþúzm¥`©ÿHòж?øÃý‹ßúÎýÙ·a•ét}ýöíÛV›ªº;1UÕ󹓲E˜™cßo®Ÿ¼~û:}^FæÒdß6‚Y¬IŒ±©$ç8ß=\/ÕöÛ¤¸:i\x§ÍíüÉ5>ªõÕ[ß.çãé°®§ãÚ®Ÿ^?»:­§“€,à¾=%K$†©jä#s30aO$B¬å²on)*k[é±­-‚ôÞkk¶m—mk­Úˆ$R•¾’a J!6"¢"‘Ì,•AèÖI‚À¥B4}‹¢bFcìÝl]×yHÔi)áëñè>jmîYІ?°HäæÃ2CH€!,¥hïˆÑ3{D­ußwi­ÝßÝ•ebfÝ÷‹¨&Ѻ.f¾,K"ǘú¢`¡Â­)gÈ–Ä*L$Esúõ@ç}V‘B´‰ÙXÖÅ<’’“˜´¬ž$33¥©›(E÷}Ì1ÕÑU‹»Û¥4‹¨K¥èԓϹ]k+ÜQ„EÎ÷÷­µˆ¨µö}O –JD£÷ŒÈdan”)Ç#gf©šYÝ3"ŽÇÃð$æãºôaP¦”’HÒÖzß´)™#¾*?Åš<Ü–Óq½¾.‡cYÒúðä!AÓw›6" Ê"BDD,ÔÃè‘ßüà ˜=\iê !ÄAb§S22 ëì ÓÝ,$3ÂmƆ’Ì/=À2yÍÈÆÊÆ²ÒšÒkì™M"Ü<"Eõض«Ë8œïõá‹Àõ-]‚QƒïÇ8%óJäI,D È9l&eP”¬{1·ÇC6;Ì\”G&ÂX8"ït½ û°€{HqIÑ‘q¹óá"£O(â·Ü_¼÷|]ë8·¯u9,ÊŽØ©'gRUGæp 3_ 8É3¶ó¼}úÙË›gÇ«ÓrXZ)&à?SöÿãÛþÚ¿úóó³9-­ˆÒ¶m¢Ú·Ñ®ËÛÛÛÅŽU•8ç‡ûz\÷‡;½œo™R”-:SÚÊ‚0F„«Ãcœ /OÖr¾{þ䘶ÇÃí:ìÝçëí'|wÿÉ?}ÆU¬È²íçÓZŸ\ß}çù“'ÇB¥»)Pra6'VÊ}–é®TQ£îTª“Máf„ô1b]Wau7Q˜G¸£5´Ö$&¥áNƒÍ=AE`ÉT$ÝK->l¸Û<G†gRm%#'\˜©"Yë¶m³“>ƒÛ¾«Vç|Ü:{_–Å23sß/¥¢Ì¤ZÄ=EÊHbÙpÏ"©"Á`÷Ø÷3ÌFÄãE\X†܈ÉÙÃ=¥0r‚½÷Öš»¯«¸ HDhzU˜2!µÖ1vwÈ#Ö¢TJfîîeYD¤÷îî¬ZKeÖóù>‰3SŠì—9ýÙ‘™éÃE5|Ô¥­­‘"\dïÆLµL JQ.÷KúW- ŸnRÚzxþâƒwnÞyzõý¾SŒáDDä¶³2=j~¸¦FØ.AEâ‘–?ÿµ49<!x¸Ùà¹`Nœ‘BDÀT4&1T%bdRÆèi.E’˜½À¤Ê2x’)à{ЍËJì}O‹nFÌ%²•司“ëý½Ëv»Ÿ¿¸ïv¹“•ê5) Ã< ˜@™g@N& EšÇ6 `¡¬d(‹Ó†S‰¸ 2U‘Pr$ÓPN&yDšlÝüñ‡üZÝ}ã¿òxÿƒ›um³ƒß´”BΤŽáJRÔöAµˆY¨RfZ`÷f··÷?þèóÃ*‡¥Ö¥,ÿð%àáaÿÃoøk¿ù§ÿöþîÕ«3 %dì©B‡ey°{ëc]޵r"xïÖZÝrÇéŠyh-áB¸ô&¨’0ùØ’²±=ÔB#.\îﯖòŇ?ÿooŽ•bëQÈož\¿xqóî{Ï+q«áz|–UÈ¢ Nv§Ùø'fG„³¤ò|»üÑ~•(LSÌN³}9Æ(µu³Ùp"JOƒ‰Hà1 8“R8ÃK-Èð@„À›P„_6=æÖÜ™¹–j6¦ü¿”22gÅ—Ç4`3/Mks Â4F•R˜y˜U!a!°ˆi–°ïûõõõôÙºçÞ÷Öš™Ïï$"zï"b#´ÔÖÖÞ¿ä®"3|ŒQK¹½½b]׌œ€!i"û>¦Ø_DÜS˜Ì,=ƒ¢°Šp@Iĉ y†*¯Ë’ȶ˜µÖjfQÚêî”C žI™"5Ó3‚¶w0›Ù|ϦYÚ̈ ¥DD-b\rÛ"SŠˆèt¢5->ÛG„€.¨‰ †·º„õ“*¬²†YšÃ‡üê¯þêÿ7{ãÿOÑß¼~ûðêíÝÃíÝp¦”ÊR¥TÕBr(RUxê (=F¸+ƒ€óèÿͯ|ír±¥DzÆta2#9ˆAÈ)M`N!úÚ­«½\þÛ~ñª?_вpu<½ÿîÍû¼¸yv½ÖÂLµ,å°ˆF€˜¥ !Ü/ÊúxãœzK«@³ 3&‘G”~’©”H+µN\1§GÍ£}†ÍHU¶š&t’I»Ó*E´cÌ¡ðŒöš’ÿi†¹:fk;2˜"ñ%að‰r’ÔD„… ÄåÜ[«Û¶©Êü?ž*¸Hç9ãb®µFÄû²¬æH"Q•Z îQký2q SÒü|ÿôÙ³¾ïZ}XE¹÷½%bVÌP'‹ &·P•D"rV²ZKL²w¡H0Qfd˜k‘Z+ ±™Í+ÇÃaŒN\JQfn­QºOn—ÂDÌìÃDµ‘g$„2l¥¨¡ï¢e¦i­Z«¹ ñ \ñº®>Æz:\ýÜ·¾ºü ¯×/~þÿä—?ýá>þäÓ/îíþ<9” 暦ŒìN€™‹¹Û“€¾ýƒ‡ÿ!äÌîûp)<“02éILž)É9‡lÈœf-p•4BxL$™§PAÁ˜í¿B"ZvòîÙŠÀÎäíÔ–G’Ûår©ÙÀÔZo£Üß¾rGûÀ¹rÏ € ÏäLJ&TQÏL£ªâ™…É#/áÓ?ªN–¯ŸÇP 1± ¿ûäpÞ@#©·Ûý³Cé¶ïŸúÉýÝCŽ1¦íÝókßxïth¥eK ‡Q¦?j§"T„à¼TîÝ̓<†o¯¾x{8./Ÿ]Ý<[ǵÖ*’ï4ø/þòã_ÿ­oÿîïýÕGß—¶T ÝÆ&P–)Ø€(Â\Y“ŒÂR !¸–"Œ ”.ç[!<Ü]Ê3ßW&w{–g'ØýmÖ<·rKçÏ9ïnÚvXèúúêÍ›7™vóäÙóW7OŸ–ÖŠB›Ô%ÃÍ8…¤ŠÈ ¢¤°LrBz„Cé1(ʼnUš8Ò¢‘ÌìžIÉðH%™Ê³H¤»Ûæµ5M²…ñ£>’ÒÌ™4Ænf"ÂI3ÜL ÔÚ˜1™ÉH$8=ÒÒ`¢Rʾm¢:Ü3"3R-™ND@(«…E€u©ñzî³!T’,irºÅ<”¢£ÛíÝ-ËÒ0·ãÉ‚JHdR&Mufº[)…ˆµŠ0µCýðGoßýà]žu. ™ªUuâ%Á`·ñx³! EÉ=×eÙûH‹‚…‘Ãû¬„:ÝžNÄ.*¢bf"……Z­34 OjË1Âú¾­ëêæ¬:oRQð>’‘$¤$Â$®É .Zj(3¹(™Du$,D˜-õ¢Å‘žÎ‰R„x »@Ì|¹\ZkS»9†‰Ê¾ou9%rnܤZŠ‚‰$“¡\ÖÃýÝ}«˜cF#…ÅÝç8ºµ6Ƙ7•R&–nzÖ„åéÍSÌNÇÚ1E„RJ<’±ÁÌ"ÊLA`I‚J™Æy˜É¥« XÊéx¬RÈdÒÄ»Þ×Ãf‘¼¬+2/.@D0QfX¸ˆ$xŒ1ã0J­³ö"’ˆë¢}ßifu÷ãñhöx“±DºjIÏuY«êéç¿õUøY,"h­\ίïÏo_ß>œÏ›‘0S‚t¦©&%Hˆ3ÝbÌH¼*T‹ñù›ÿþ¿û¥}ß)9’ äÝ}ßs bVQ0ÏÄ•éåóÝ‘p(à,ÌÎ`J)‹ˆ%'䱡"¢5„"sï–gAD ƒ’HÒ“‰\—ãÓëëôÑØÙ/ûÝ…Ldu"VMv’ý IDATeè™R$ˆd¦¢œ™çUP˜FR:”e¸1‚÷onlëU5€@N¬‡Cï£OL>Êû|¾ôË~y8ÛnF «§ïÞÿèÏ—Óéa·=dQw¿ì¶(<†¹uf£{DîcØ ?Ô¶®z\K]š Ó\~ðýý_ýÙ¯ÿÖ·øá[>3"=Ý­ÛR¤( Q „3¬O‘mc}xûZ„ S¤]¯…Ü„C)¥ýr×42öµæ—wŸVÛ.…ãõÝÇWÅ×|É—®ðêfŪ¦ŒÒÚZÛ~óγ>xñÞ‹›ªZGpë aQqB¦öÜÝÆÖ#C¸2³2HR O/pfn{/:ꈙ⒠®¥Ef; “† ™%dþ»*»ç„'ŸÏ—ˆpÖj<E̱Ì)Qi%i ¢sðc†d!•‰Q«¥$Í=>bvE¡÷á‡Ã<û™"j­L\k%ÎHwÊeiëļ.Kƒ™üqE)Å=ü˾ e’»‹Ì¿C„i &ÉŒRjffΔôO‚ÿL‚âȹÓi¾91'ÑÅ ÏsI™h•’L‘˜”R•sn‘D^Jq·™V[™Ý²«ë'3™3MHÌ-ƒÜCE Ä$*ÿìå‹ëi·ãiǤŽÔqf< ²¶l]•ùÙŠ&Êã˜IbÊÈH¤°ŠLSÝÏ;¨’Ò, ÔZ#-†4Ϥ¤Ò½ÃIµTdˆR7³ÍÌ­ÉÌ~á¡ÉÏ»9 Lp‘“ÊpžiUu³1ˆ…k©ë²DF"†¶ÁDÝ3"´(õÞµÖÌôp"rZçRjfÖúÜÁ2¾pëŠñéaR•Þ›h‚O)Å<ÌúT«»·ÖT…­­"ªª£!ÀÝ2GM®™@ý9‘û¼Ÿ"‡­G„G­X™ZëDDÂÌ\¥”ÂÄãìVUfv÷¢Zç™2{³@Q­…˜A$D*bf*JJÛ¶í÷ûïòÀA "J ‹`bw¯¥œÎçáwŠÀhZN ¨0QïÎ"µh­õr¹LÓ$¢$%g&2çÝìž‘1Õ)<ðˆªzüâ×ÿÿðÿØ7.“ÎÓlÛúýÓ²<]"c7O#ùÂA¦I«kÛ(=GÙ—Gåüù_¿ÿGÿÁ¯x Ò¢pïÄLZ4‹(àžŽ wóaÁqd©²~KóRUÎHVŠ$©*¢Î#«Ï`!hкÀ@ !d5Δ2jÌ™R@II“9îf!¾>L×…§öp~º_)¤E)¥¸e_M…AÝ3*©róÌÌIÊ¡Œ’"¼ö·ËæAD—fK·Ê¼«T«®ÍwU•I’ˆuë¾.ëé¼uÔ×xGuzõâpû¸ö‘±@bë½5_[ïî½{o½uoÝÉ3ÌÖËîB`‘]•¹hÝU)•‰.§óÿô?ÿáóOþùŸýø}3 „GPffšu÷~suôBD7b'N•ì뢜ÖÖ]%P×´}åÌMÉ„¬Š“÷D/â Û'øË}}:¯~~ûš>®OÍ}VÙïæ¹N‡ýþÅËë×W/_¾÷½ï_¿|YëžH,LãÆw r¢R'IIJ¦ ±L‹ì)³°Ô¢#¿ÏPáR„ˆT¤²PZT„{ïIÄ<ó”Â$¢DlÖ“hbEe$›æRˆ%<ˆ½Š<2#”9€'ð°µx¢»=33OÓÎÙIUU‹Y‹ˆiªî3»sª²E0€”"™aææ®Uð0„Àwp"2ë*€ˆ¦i"÷a½Ç@úôÞKÑñ0WÕeYž§ CHPy„ïÍcžg":’?˜§ÙG-uUJ*µÔ¹2ˆÀ@ª n^'Qs¢”š@wÇ`Æ©So>MÓãi¦ðŒÌ@ÂãD“Ëe‚0«* b@…“8Æ‘A¢E‡š— V „ycâH*u¢L gR2 eze„' +3›žG…Yk¢¢*föü~©U’ØÍ™Ÿë_˜ Hl[g&IOQiÞ‡Íó4œ©ùíyTòŽ–Äyžfá1cˆ˜ˆÁ¬EÇfÛÌTjµÖ‰¨h@fFÄØ(dD"ñm`–¿ó QUÞ–e·ß»™eÖZôÙ×I©¥j)©¥‚0 @R*€@kPÖR­Û´ßE˜ªRnnD L WW"r:Ÿk)2LLÃÇ9Ïówø<&>ìv`´Ö’¨·6ZiJ)fD‰àÖÔ:…³ÔR(³¨¸#‘­5a«voÈܶõp80‘ŠöÞÝCE‹Êá³_ù÷pdz¸§5Ûξ]|[Ñ[ŽH6þïÇÁw¦ü¿üÀ¿éÉÛ;ÿÖHWÇÝ4‘=ž·‡ÇõrY“…¹:qëìI‘‚ðˆÕbõ±1±åO~öðû{*ˆg)Ò»nTQNbqÐ3^䙄„§Áé‘”A©j %fJ&lîZƳ–ÀIè  %{0Á)( Oœa+¡WI•@´ª1Köíb}Û—`²mÝÒ׉1EyæõZÞÌßüÊGõ8k-Óá0GÄõ‹ãñjÿê£×¯?ûþ´»öp·àLGÚóSŠ8áÈñõÎÂÊ$F ÁLBâö¬0‹ð³5@"“ÀD`%Îq©g ³D4ƒé€é¨>úÂ\ˆrì®Dè"ÏÓ4Ø8l݉@„"Zku7ÄÊcÏ”J5+1~ñ·Jf¢Ìd‚GD8#džô»ÐÀ4Í ÑÚx"L#KL,caD3á¥V ¶Ö¦©ªˆ‡'€eÄ‚°øŽÄ,# 1ºðÊT 0 I‹D@Km½q+[ j“qíêuª­µý<÷¶•iNL¤ÛhfÑR˜2<ÇN>2­w)óD,S}îÂ+¥Œ+ϲ,,, ª:E42H %#\‹~[*É\8ZÓR ˆ"…é)E#Â}¼¹”n½õ¢Zj¥D¦]}ï×ÿÛ@¿;žÃ=Ã龿fÙ.Þ6ïÛöøÐ­(Zëî ÇƒL™fª3‹@”ÀCéCD„#Ý-hx’I$ˆ•xd±2Ÿ}lé J‚f~þ°§O¾ÿÃÐ/Í›ó¿øƒ}ýö®‘Z*»C˜+Ó©¨Û¹I–ð”Y Bñ¿üÞþgÿéÔ.&d)šµÚÒ’LÕUJ'$ÂÅz' "¡¨v K2ÖÆ¥Ôï‘ÁÔãîå矼ý“¿Ø.'Ê€¤8Ñ(ùÝ ÆL "_%{ážd€{Ö".¥ì7»ép:=i©™˜ÊFÀÇݶ¶vZÛÃú×ïÏôØ4ñ¢èUZT-KË]8²A{Ðu-›5bjnÇyj­#ÙÖÎL¬„Ê´öÕ!ÌÌɵèý²>žìn_vú¥ÏoäkÌE¨ ‚™ùäðBhûB='%k¾x»ý&•ð³—WW½¹šÿäÏÿæ÷ÿONO'&bÒ-–Ã4}2r‹n`ÚOÕ»Yt&Îì˜Õ·ÞÉ\Kîe?T{hkUݶöbf®½eöðk¹»Òû—u}1íäÉm»àõÇ7Ÿ~òÅõG³o«§3w§®üˆ  VÙî S®*`rË@22Š fsâxfŠ E™gFP"ÓŸ ÃSaf‰@F¨ˆ¥%‘pZf„—"ª:¤¨Ì ”RÄzcæž.T™Åݺ÷0wOç$–q„zd-™`Ùøkë›”’”cÑ=jâ/—ËÇ¿‰Hea¢,B»y¾\VóÞ£±0€RŠY€ÌZʲ,㈷Ü¿¿ß]_¹5²Š†÷͈„Y˜È{·h‘Á æH 1‡yç’ÝÖýñøÉ÷¿øëýøéþÃ406Ï P&F œT3¨ä©ÄD¢€3rψp„’gÏNIZåx<\.ᙢ%Ó´fÛ¶Ju_òE½üÒ›oçåöbO­¢±#}3™“´NÉËóy_˜œPUЭ²¨RëiÖˆYDÍ¡šHI¸öî§åü7ù6,"ú/}vó_tžË°•z8‚8Ù‘Ây^m0èâÙ[œ×Óºîß¾{ÿÙ'7?ùéW¿÷Ïÿô¯~úU­TœBÂz,«)ór^§¹ŒR­¶µ‰ËÃòøæx¼lK k±›w77ï[ó›Yß?]^ìR²ï$> =Úeâû7èŸ×õzžöûJp¼úèê͛ׯ?ùÐÞ6A±ˆPï$$à`Dåž^  ‘q³M#ÀáÈ *Èp$?#~8<¥PXüoÔ‘E„Fl:Nœ™Ò{Q(+"S)."Pé«ÏóD,.EH¹X¦¤x0±[DïmOx¸0‹j̬5{¶Wf†Ž'a]·Ãá0Õ:âv@']Uƒ(s™·Ö@c7AÓ4·¶F>“i%É=ÒRFg̾óÆÐ··ì¡ü0±…Ÿbâž9q5ó¨;ØÚˆÑ¬‹H¸S)鬈”‹Â>Æd5ë#zVÊÔ{·°ƒîEÊ·3¦d7ÿ2ÃZ¤<Ù )…ˆÎçsÑz>ŸÇ–xPB™$Ìö/˶2#À"%‘pà®ó<5ÆðÅÁ÷Ý4™™õN 3C¡´s³2Uoü;…ƒÎQç=–ÅÚêËi»œ.OîžžN—§Ëz:-O§óÓiyz|:.§ójnDZJ¹º:__½¸~ñâêææðâ¸q}œjIDk}]Û²õÖl]·¥uë†çK–R¤°r)Eއ¹j‰ŒÖ{kÑ­¥'«Ìµ\_ï^ݼؿ¼ž¯^Mǣ̻«/¾ü‡ÿ¨Ÿ¶XºÜŸÿjnèI³fBÏ«ÃG[g?/L—¤š¤-N;5Rü¯ÿì_ü—ÿÕÞ›§Ã5\Æ Šu•!ìaà…ÁäÛ"=’¡ÝÓ°@°ÒÚŸ~üÇôôÍ;­Õú†Rb¯’“’‹¤F¦–RÁ4|e-s¨J묞‰PÍPœO—³ò`¶ £ÖšG×rÝ[“Bý#ἎÈL*ÍZëÛ›^½º¹þ/¿ÿ'õ“?þÉ–Ë[Ç.ywΫ‡¶÷¬4¥b0R\2™¸KLÈæaÒ§î•bî¿öêÅ?œtÞ)£9S!l!ðè^l[%SºçãýÝ㡾}ûîç?{ûÇÿêÏ#|RâÂ-¢dXäÒìóO[ËÖµ ݪøëƒfœ^u]×íÅ\/pÀ&içe­”3#2zø©ÄéM¹ýroŸ¿¨ÇÃÇm3bJÏã¡öó›O¿¸yùqëKÄâIsgTg¡Íœ…(#T˜§iBf³Nä‘ADºƒÈ#!e"–¡R–¹à™—)#þ§c‹€¡˜„‘Ê·R"d0J²e@&áñU'!d$Íó~˜µDEY-¢¥s’’‹2¥…YŒ°Xº§ þ³ˆÖ3{ LÓ`ûx’ ªÖZ2=’à½ÔÊÌ™^Ê4¢Â—Ëežg!b"σH)1|G d†ˆšÅ Â- lf10ú=ôLY LÌó´,k­b[*sÂ=ÀÄ$$ZD!áÍçiîÞ…Ä((Sˆ3“‰Ým¿›<#‰ÌlÖ"¢`rwBŽÁˆóù À“gÜÐZûºº™µ>ïv,Ô{›ËnôP^_ý-ÕZ—e!¢:w_Î "¸b²PñNÌÁL`ª½C5#<‚Ì$,,ÒÚ(KP"l›[·"Ï),ùw¢à¹ÑÙ mm—S{|8=Üßß=<œ¶»‡Ó‡ûÓ7ï>ÜÝΗuY¶óy]ΗÇÓétYÍ š¦iš¦Ýn}sõêúæx=__^¿¾™'MÊÖ|Y¶å|¹,mÛZÛÚºµD˜»0×iªª,:Oõ°Ÿ/ö}³Öú²YX÷H çªWÇý'½øü‹Won®>úøÕñ£×»ãáêÓO÷?l§†µËŸýùϾ¾;_z Ì4•Ì7¢ŸFüµYfÆIjI+‚#ðã?ùñ/ÿàû—%(½uZ½OmM¥š1®û ðs‰+2u\¢lÞÙE«¦¾mËù¼¿: ÄážLÄ ¥i"V #?‚ „Ñ(‚ªE߬Gö¾´µY'e2³ÈÄèc0}ã]@F*ÌÍ|ÞÔÉëO¿÷ƒüúvY~wùø£Ïþ‹7ßûßòß¼G¼1É…–ÛK]c¾[fª³Rº›Œ]úéÜvóÄYƒ”™|÷øiÌù‚”ÛG/s›G&ÒàÝ£·"L™!NIÞûùòôõ/¾¹½=ß?=‰æL£»ÀCr.‘ޖ™°Q—”Å;C˜2½/—Ë‹YŸoýRëÚ¯+m[g‘Ì“WI°paŸŠ~=m‘žÍ3ÓÓ#Ò#„yÞU¥‡Ÿüüþ£—W¯__ÿ{üæÅëWÇÃqV)ßûüÍïüö¶m?½=}89‰€\&Ÿ§m P— ¿PÝG¹§íXÎ?ù×qyX¾ÿ[_jÊ\Ye·mâ[çÓ&Ò™™)*I@²‘q3I¹º[F€N*œ-dH%báRªÈ4§§ Irf’q_ª,ÒÒÚ¶®ç'‘J‚™ ôY¨ª0ˆKJ 3µJ¢Ã­ÈÝÕ‹áØcƒ=Ó¬H™‚¤™„5ÌtúOþñïþë?ûÉí‡Ç›ëÃ>üåA¾¹Û~úä[=öHëÖTø´®½qD øPwÜûÓÓéDµðõÕôáî\¯?Š$UжtâdP©Ü[/íX¢§{ÞÝ=>žWÚϬ¢½åÌÁ[NaSM k«}r=­[Ûºw·ë.½ÀMR²øº.…—7SûXíFíp³›‹dbÚíüæú E¯_¾9®{kéW@°«úÀ†ƒƒ¬UÅ##@B`3_H’’¤N¡JH°ù‰*â†!r€%‡u”6'‹&9ÒÄÄÄ–i*ZJŒplz÷¢%ó\™ÙlÜÍ‘–ÉÄÌÛ¶•"æÀ³ë4SXFèoD‘•YJ¹\.õYÛIU‰ÈQz>ïæî^ûãþéá$U¶Ö„È)µè8C#¼¨FDzµZ%³°Pt8ÊÜIé¼åÞÜE4£ƒ({%³F8(ÃqZžÊT«ê€wžŸ†'‡J"´°[ˆP7' Oêó~u,3£õ^ÇF]¤D¸ûn·[·uÛú~f'–*»ÝÞ¬3¡”âî­õišÆÚÀ3/ˆyžFvÌ{—Ì­­Û¶i"òÞªî1×ÚšYëIÐyn—’À¬Ì^JSön!*@:«"ÀŒž#; f–²Žd\­Í}†äß²>€L÷ØV_Oöt¾¿½¿{üæýãWïÞÞž~öõí×ïÞ?,·ïŸ.˺z ´îæ ³­‰nmXΉ§Ñ>¤u†T !QCÉ(¦jÍ¡æÍˆ¾»¼‰ IDAT9¥öìÞ=“=Ò̉IYZ0¹Ô"+prL–”ž@†cëÁJ•ùÔ;ˆÞ>Üýn¹úêá/~úþͫ뗯Ž×ÇÝÍ‹ý«W/ß|òâïÿ½_÷Wüã¯ÞÞžÒy¿Û­eRŸí‰!ФÜ|!+©w8hûúo¾¾\ÿÁü[Iδ«½hlL½Soe_¦ÞüâŠ^všk©=YÁ]hÏœEÏK¶t™T‚œ»IN{ò4Ça–Þ3Ò…iKš(¢r帘çÓ¶g^Ö(Thʌֶo~y¿þÚ ÑJ¿¾b-eDèvªµÖÃn7Uw‡Ã‹Wëeqa¸1’|?N†p¦Ó É$¡ÌæžCÿAâ¹­“xà8Á̪#JBö€T®LK„ ³ö¬È3·y,€U„ÜCÄ[3ÍÈ1´HfB¥ÖÒ͉É6˜)ÂóÙ‰4&¤aîcQ‘Ó~""U ód ØÚ: ŠàÄ4í²-ëºÕ¢©Sž{WUmÞ@$€›¥Çº^‡3 ‰j¸ˆþK@‘á-–Sœï·ûÛ§ÛÛon?|õÍÝÏ¿¾{{z÷áé«oînï/wç¶lx2Ú,<$Œ‚8™œˆŒL"ve=Z„’¤'I¸R‘jRT¦ó²V™‚Í=º÷ÂbÉ#£”mÔ÷À %)!J(ä=™”ÁÌž!äDZ4”2!iI Zsm­ž_¸üìëûW?¿úô“Wo^½˜ •™‚¦OÊá~=%’”Üú¶ æÀÝj“Æ«²ÌôûùËï‹ãëktªàVËæH Md +F„«ˆ¥X!<”CM%Á¥2kIaQH…Y™˜"C…˜Å¶5@Eĉ[7¡Ü‘ìw;kÍAŽ@‘L’ð”‰{¼Iˆ¶mµL÷gEšÇúøðâ*.=tªb¡k³ÈÔBÄB‰jßÜwSÙ¥è꣨ÿ.@F¬‹­Oñt¿=ÜÞßÞ¾¿}üúÝíÛw_½½ýæÝýíÝÓýÃòxn‹Ñ¹ñÙèÒÀ¢‰’‰`˜»¨: ¬¢Ji‹7aÞº…E™Ê¨Dd. BUtÚ%I‘‘¥ÎݼˆX¹aÛÖD4Ë5¶ž òvÄ•µìd×m•¤nÏt’BÑ[Rd ‰ÀU½Â¬w­q^ýáÔ߸\ßYäÛ÷}tdvå¾ÿLIÑÞGK=¡;.Í›nkŠÜ 1éßüÑO>úüæÓþZ˜Wï°­„d-é”pD@yWˆ’™ÁáZ ¦ç(sd ’ºêÄ”pkI(\ˆ©wÛíJ„ xëKØV´L,Ý, ¢gvswQæiòȾžu’Ìd1UĹ-[g" ƒ •Šð¤4QrfÍî齯ù[?ø29¾þðèÝIèX"w‹Ýw§#±%E„ %3¥YLIOËvsظ»›ežwY.‰x.VcˆKÒH‘r&sòÚ­€ÜQ•®¨´nL,ˆSúÕ¼Ý-›°(U/ÑßÝÔöÅ®î‹ýq€  Q)"t<ÌÓ|¬»c¸{¸÷(£™(@Bb OdIF8¬œfù qL<_0Fk&܇_"잢%-H5©«ˆ·Fµ#ÁV¬V”ǃ àÓ45³È„ŽÒa.uî뀉<­Ô)Óz7f¨Vyt й0qo›Ì3ˆ/ËE„Ý]Y#0MS) “ضõúúEQ O.r5–åÂ¥€Òº±’âm«µlk{æ¥3—HD ™…‰É¬‰*žÍ EÝ»îªF)E¶Þ ßq☹ÖÚ¶A›%’AŒ(»]ÉL!!p¤' ª/®¯÷‡Ãº,~¢)Íš”¹÷^Tc4$3—R×åRjf Ͼ™…P‘Ȭ¥Ñe]«*eHjÉôÃn×Âݬ÷Nª¬žS:™é¥î–eQU"Z–UEYG$¬ƒ»÷ †ˆf¢ŠZ´ÿÏ+!3ìüdO·ë»_<Ü}¸ûðð‹w÷_óá›·ï¾z÷áéñ|ûáüáál‡[Js ‘¢5b˜øÍIDk8( ÌÎ=m¨ýL ªEH,Zœ)eª=¼–¤8°^.Ì\K]–mÄ,Xà±µ¤ˆL8 fѪRÀS)E˜-"3—mM2Ê™gWæq°!c»Œ`!‚cŽw‹¶]Ö­}x`wÛñ˜Pš•ß„î³÷‡@/¹5ŠK•÷6mw¡{"‘w_?,OüËÿð·•€ÌX75bö ×B 08p­*IZ‰Ò"Ò56eJ¦p2‹R ˆ"£/]KÙº1eomÝÚ<—ÅH“©N}D•ªs–Þór‘„Y e´{öµSajD†DÏ^fü¼½É’%É•¦÷ŸAUÍîu÷ˆH (…ÕÝB!Ù›î=ß ŸOKiR(dw±0g"çDfDÆä~3Õ3p¡7±g³ºb+—‘qMÕÎùÿðŒ1ng“ÔDoO¿úå/I¾ýîÕK‹,•é|þõÃñÛ݆• 'æÂžHM BJóð''w÷|÷þéyÐr@jÛ@#I©w'%$rÖÿ‰—¦æ9<‰²2•B}7$°‹T"Ïg̾í[\h¼^Êù£»óŽKÓ䢭–éP¬KÑR–Vg,ý¸¬m] %ÒÝLPÁd23ÁD9yyÂpd`†ªæÍ\àÎL’”"™žTd„‘3¹ qçd&ÉBDEII7àIU±9U0S–ÒZÎŽPÞh“IÔÍŠò¾[xðÂ9½sʇÃÁÍÂÃ)ËôÙfLBCÎýg˜O¶ƒúZ43Á$̪œYö}”²º;ˆ©K‰tuw­µpá $#‹pPÌ ÀíÍ=-x6u)ÑÌ ÔV®×k‚N”ÃGl6ûÌ"l‘ PæèCDÌl)­{L¶]¸[z%©”(UÃ!,µ¶PÐZ÷릵´ÖƾÕÉãtÏZË.AIcŒ>º™¹¹™­ëz~|¼{öìôôþîîè£[ÄÚýÐJ›G ˜çaÀ”œH\k!¨µc‘î¸ÜB ú¶yDk+ õË¥.Ë$ˆ(ÞZËÌÃaÃÇè4Ià9ç’LËôÞMµÀ2ó_qà׋½ûîüíWýú›/¾~ùíË7¯^½~õæÝãÓéÕË7oO—=‡Ëæ´“n¢Õ‰2øt5. IAÄ\”*< eùt¶'PJˆ…‚˜©%œU*˜ƒP-w¶_÷©¼Ð°áÝ÷g‡sz£‘¸tª"Ï—‡–£Ëtн0 %§±AŠ Y"|#á‘^é€d ëp%w d¸O² +qŠŽ@ß9¸HfzFº…_…*èE#z´HÝiß¡ž©CðãÅŸ­zýOÿÛÿõ›ÿð?i;ðœö3ùW¡08¬EYÁ ‚2˜% ÉÓ(ÃÄâ÷`BžOײ4)MY¶±$Ã}æ4¦ÈÚÌÝŒDX8-"Yë¾u»^Ó‡SCɼ»! ž–,TkÉDÀ29rЄ,f€iäg"É,$Læ1º‘dôñ¿ü»"ñÙËï‹´e±‡ìOc‡ÏŒ'{f óu¿ «hðnvW—7ï—¥ËÍFm­;ó`%˜ƒçó3™ É,Y‘ÄĘӽŒhÜëãe_£/òšÊ#‰Ý5[³ìûª$ÉÙZi¥33­m-µª/ʬÊeõp߇pˆòä˜eó¬—OîÀ¼å|.1)QtŠ}B”PÕé G§«Ñ,#¥û´…$ž™J†ñˆ$€ ÔR@Œtf0‰EZ“·ŽÌôH¡’YDú¾Π,Z<ƒÁ\ÄÍE$Ýv†Éî)ZÆ0%&"µáÌ|w<^¯ ‘P)Ä’ w¯Zƒ‚’<("2çýMTg€2’XEF÷ˆH02Et¢ž÷ÞEu2}ªèÒÚ¾mZdmK}³k­kfîÛ¹:g5"ñBª*¢c˜»å$)%¹{]¤Ol)Ó´š¹Ý<3‰b*eÖuÝú¦¬óTÕÙ]&V]Z}z7EJó¨˜jÔ>F-ubÚgM/Ì)2™‹JIÉÓÞ®$ÁÁÈ-Œö]™™ÅÙ$•ÙÝ•ëÚöÝÖµmÛ6_bö=È< V¤•mëNQ[µa,Óò¯u³÷¯·W_|÷Å—öͧŸþõ“/¿~õòÍééét¾nûx¿ù5)œƒØ2,"°P)’‘4?ÉX!@0K`NÜ,JbhY¢³‘H]ÃÙ …v*D 8$"9ÂOgK;Èc¾óœraêk£§ñ†èpù0øÚ)2)!ÝøZ  âIh±l‹NNµæ¶o"#U˜2i˜àõ V(ù|'¤iŸ8 >î9¶Èk’…1=1Ð}Ë“¸¯^[Q"úì¿üö'ÿøë‡Š ‚æðWˆÌÐdÜôL &'§AÜ<àóëŽL0j«¢l}0¦×$C[J$]¯›ˆjÑÜΗÞbP„ 3Ò)2s¤gºj-­OHJ¸pxfúÈ`uÔÈd~XúE")ˆ3Ÿ¶ñoþþçÝíÛׇZH°ïæÞ¿OUEÎei)2ä4æ¾oûûÇóCzm©\œ‹ç|CKb¢ÉOcvdØ‚‡¸»%ÇuO{û¼ôãúdû÷LJ…ü¸Û)=Áº¶…$K«"L¬k]j»j-­´ F¸ù䢊 "iøa¤›e ‰#Q‚8 ‚˜õ ·IQž&š”LŸ¤N óH|ÆZF¤¶BIá&‹„'%ˆy ©g*¼÷p½™«¦vÁR@S$093iž‰$ž¾0X$EÄ­Õ=EÄÓ™("8§ø¶r0¼÷Ã:—2•îÛvxó©óõðÌ  šL8VKéY”Ì)Ôå[l­[?,k}ôã²öIˆˆÐZóôf6¦I›„=Á VÞ†-ÚHˆ‰Zk½oÌE$ÍÆýÃÙ˜s¡¿ÍHk[z"\Ú²õ-p£Â´¶^.ga0&^Ú:Æ–IEµ÷N„Óù¤åV?N¢¾mZ+ë½,K¸ ÏX³‚EU¶)€4€¨^N§õ¸Î뺅)­muf÷¤NÌúxº-06ˆð¾ïó¼™ jåRZÓ­5M·Šò<<ã_aÛ¥¿úòÕ§üÉ—úõg_~ûÅWß¼}ýîñt=™uç=à9#pL…9‹%%ŠhÝöèÝi¾Û‚3R‰Ó ´Dx¦"Å­##3)²ZÀÉ’Áò$´pQ§½Œ}¥'ÆVØU0m<à÷ÔŸë½`œîŸ—R3.o:½­RŸöw{½gF‘ÓRZ$½§kVå¸O-%/ÝdõÌà r wá„äC €g–UBN÷ê„aäwM·Ûë¤+‡'‡§_"ÃÚׯ~½þêÙ8(Öïþð±þzÿÑG¾KFx¸¹§daFdÄm^C<_¥é𛆕 Žà€¶Ú––L¶÷ÞÖÂ<¯#³¤÷ØF΄eçRyY؆÷ýrVa„íc$åÔgÌ«y)Z´¹ÛL™#‰T•N,$„'xb¦GÚ”WP¦ÃSóí ¿ùù?ù×ï^×¢÷‡žtù¾–HÒB6€Ä <1 µ„‡Q<¬Ç7ïŸÜÆ‹ðÈQïB+Åe³¦’œÖ­PFøkãôP¢Š¼;½½¯¨ÅŽ?α»»n§çZkßÎMxÈñЊ2 8µh-e]¥Ö¢\µD"Ë)ïbRfbËÈpF&?(Y,=cž|ÈL)ó9IÄySÍ+ ;LÀ#BDÓƒA9' ™¬Œœ;ÉIHFxº"ŠQbÀ¥6en4§ìîÁ<ÝAÐRÔD ­µÈù†ÁûÞ#üx8ô”)""R©¥lÛ&Êã]˜§ƒ¥–"Â9I–ª³YF”“Ê0mïžP¢¢ ÀÝ ‹Á$VJñœPhŸb›×cRÇ|1aæ½Kkè½·"c楔—e™´Âbae¾(Üþ®"â˲˜RJÕåéòXkµ2‹pe fÞŠîûÞÚbff~>ŸÜãpX’Ä}dB”¬ÿÍ?L9›¢sÅZ+"<“çê|¦—@1Pc03îI’cÛX”Á¤”ÃÍ­®wW‘ô}wV+³êD§cÒFg_v26Ì:³!Q™cªŠðmÛÖu±1Åaÿ½apqyܾþäÏ¿ýíýݧ¿ûç_}õí÷ß¿}w¹î†-8RJÊLbÑä’(‰&‚ܦÊÜ"…8JŒƒõœìÈ#QN@j\»ÅQû=ády(HÚÁvÀ³vñª|îß©,+Xà-;“3gG¬™’²`­•ÛÉáºhí¥† ÜöŽš¾_Šyæ¡Ðù\L;'´<;bíô¸ó+8Á7* íÎ {ŽÎu÷C°RÈ£ìe£E˜3Ù-\‚&ý<äBÊ$~ÞÛhèxÒ0³4ÆVp…YF_/ùÑÁ?$~Ðå›ß}ܾüöÙ‡/ôn­‡c-Å-2‚XH !ý¬©g 2 ¥j1s!IMæ€u„²U™KzIJ4&ôn}ÛÎZJÉÙÖʹmï^½)L}ìfÝÝk‘ð –R$äi qÇ i’d¡äÞ,ªL¸[ïÆ"E'ÞÃ’“©’¦ÿæ×ï™}ùöá(äÛêF‰ðùhͰ&D&²*-† †,KÄ 1–U6s"’"ª:"ˆÐmLˆBJ1ÿÊpÌW€Þ÷TÆ"ÂD9‹¾1Ý©zîKk™ÉE{7UhØÈü6ªRj½œÏwwwáî"1O#ž™1êÝT‘„(¥¥w¦•™PEh]O§K[jf´åxÝß×dn™Ì`–½ï:“—‘¬žQŠ ³”’™½@hU‹Xjs Xú¾oKiZÊéñr8ÆØ×µ1"r>d#Q¤LóDf.Ks÷YÍ=#Öuu÷ÜwVíî™Ifª2ìoΜYKFD´L–·;ØÝöÝÖϤDxˆ½ZÚ×›¥ Àk†}[ݺ³žN§u]YÄÆÄÙRD2‰EÌ7¯ÿn€›Ÿß^¿þËïþŸßÿçÿãŸÿé÷Ÿ~ýõ·ç˹çÌ’™H°ƒ•ȉÍ!s¾Ï!éˆ$rÂu1•ÂQõK[|¡(©ãrê*§dT»ê8ÂE½°`³ìkm}7ªçs_ÙH„aï‰Y©Y-ÉíXk µ}%"Rƒî¶p†[ÄðkTлÒöüxÜÝ ûñž ïl×Q† Þôx5åžsg;,Y8®ücÛîžøù°Íìa/lT•<6½D#E…e=¼x¼þ›}{VóßSßE”Y/—´w^wý^ñËå¾ú>öó»7n!JÄôìï>zöáOŽÏŸE†µ½ÏÄ2Ѥ³ g&œ… =™… ÈÜ‘L…Dƒh½»#ËmïF†0k߯OOýº» Osï¡Ò†+é’“3ÌD°è”APÒDwK!“"“éHU&ž5ØäF™W¥ðÑ1ºýúïñøþ²;Úd;r‘—ÉwǵÏtq÷Òjm-"´éãã㺮޽{<3bªW¶í²“ˆG,u±Œcãè½×Öúv*Eû°›âåéññáÙ³™åW­¢ÚÇ®ZgÅwF`”RH0ÒÍÌ7*5ÿ°2C-fÁD¥”Lc¨ò|uŸlQ¥V¢*²_÷u-ì."óU¥ms7mÓe¦¥ÐMT|£êan؉þå€ôá—'{ûÝ»o¾üóŸ>ÿßÿïßý×úýg_¾¼Ž¼Ü<Ò ÖpÒÉ%™Via;Ñ•yèðîûñ¨kî’Å{pæzå°R íÚŸ:Ý{iI†q§~do¥<ü’9Â×Vî*;ñ|W÷H¢äŒž±©ÊYÀ—ÞGÏwÀ«w~yOã}åáÙ×C 9íq}]Þ‰=¿¸œG¹ò=e(p„3ÁûÉV_~>ôyÚ7ñøeòûtgp"ߦ¿ {òåî‹}TûGmù Jpîï®o.Ÿ¿ýB×çÏ÷õþ8§ò¤”DH±¡óFá I¢Û@ÐÝ@šZc fvTóœcê IDATµÀìüôÔ/›*õëæŠVK w˜œÉÛØ#B[!ˆ¡'‹(Ö¢ *DÄA„"”"”žbáB…)(#±{PjüÿöWÿü‡O[£¿ûiy¶äÕûÙŠ¥È¬Ê=¦#hî€&–ûÞk­÷‹ýä9<Ì­‰ˆ€É6¥J-´› O¤—‡p«mP¶µEx ;,%ÌÛRªV0©T-,TXµ[·nƒtQ:“¡L±gŽÆí¥³w4‘,7"@ 7³AÄÉ`€Ó3$ˆÈÌj© ¨¨H¹žO´RÑR—ÅÌ%¹Ué½–ÆsH/µš•Bžp¸-µt”ìnµjß¶Z•n€P¤µb„¥HI ae–9ã›>3³w‘0Þ[kYKcÏLf¶ë†¶³ÃA™³Ôæf3•ײTÌ]ˆ€ËåòððÙ·m®I´Td(ªc˜Î°)J®s«Q>==ÕeaâI=‘DÞÝ{ï̪ªÛ¶MYQõLå²o×°D¤µv:ɺVOûV—ÅÌhßééEeæ¸Æ˜Ó²Ñ%pÆÈ§÷Û›oß~óåW_~ûé×ßþéŸÿù“Ï?ÿò囋I)1÷NÄÛH!Ä‘G•¾]ÅÞÈšâÀÜÚȺ7‰%í@µ%MNn% ÇÃAŠ0KßgV+FHB‚ÄSŠªð·W’™©y¹×Öï ™Á‚¢læo'h•(eD ƒ„4Q±i¦EW©ø ó/ü¬- 1/ý|¾¼;Ÿ^½~óÝë/ºŸý«×œØ¨Ž­ŽX_Ÿ+eܶŸí¢^Ä™dáÃhÿ?úÐü½öí"wê̶±ã}ÚvÙßÙõg5v‘Ú¸”:¯ ß_Ë›÷wë‡?ûimGgdPPÀ‚ˆ2éÖ䃅…Z÷‹{Fì &‘4[Öš4N¶áçmëûսݑZyÑ`;E’”ÀMш`K¦ ÑÔÂ$‘„ôÛý:.ÌÂé,Iâ@r7ˆ@˜`Áè¾,åßýæÿå“O“v®~ç[\,a¢AB’` °¤Vå÷Wg¦}~L$‰.B¢ª¥hf„; ¹TÍÌJ]·«è”ÖÇ]“p»lû‹ûelÝ«³gª(«SJ#¬gº–6!ý`A$؃IJͦYŒˆ˜KÕ™G óÛ (“2C¤‘ ÌÓ&ú³” ð°N·=eøÌtº ž«×pw›S¡Öš¹Y„ߢ=Âc$ Y÷¬¼w›R”V4HJHb€Ù=X•I€Ùq ­­l½g„HI@›°ûL6º‡±J¦—"sý€m»Ì'C­uŒÑÍ]ÞmÑ!Õ‘ ÃRß^ ¥}¡°±ñuûÙî›.šUSЉ{U#qDa$£®¼Öò³Ã1ÈîZI±&Ñð`àû·®5˜9˜ÄÛuëµ-ÌœIî!ñó_hQe>_/ûõòýãÓÖ·WoÞ÷¤WOo^ìBk’½y«ïùÑý?}_¿å<4†&“ënyÜãJcW)áÇæþ]õÅo~òËŸ>ñL2ö½Rj´"[òëËuÙú‹>HΠÈ(ó¹Ÿ4—Q ÚmŒ1/nÈð9j¤’\Η¶Tn>úØ®gfæ)LîÆZ‚H[S¢D¦GVQv'€[c­ ’‡)u>V"Ó}°²eHщ$£Lez ¿aj§£ÜÃ^<¿ûå‡|ü—'!YŸ¤‡…0‘V!À÷žÞJ9o{‘RKYK¼;_mô1v³1˜Rë\p#0[QH¦'&¸’«›Kºú%®Ã‹{8ÓÚÖÈ@‚EJ-aάçÓÉúYŠ–áNÌ$ ¤g3“èC&ËyVÂgÐÅsfJ8Ü’mXáîTsF<¥QHÌÜd ‰)Ò#KDiï}J>ÍB˜…Ň ‹ˆ2!|:n¹µ‘îžIó?o„7 cx&G攢gd29ç3bˆÃzwce–ÒÜÆ|èÕZæðj®|31Fg,ë2µïóá(¤ªÑÇ ªDI¢¤aÖJC)û¾k“Z+—B?LÆF·¢Å| óÞûrXj«ð@DÔBÈT%3˜Ù°QT‡C­Úû ¢u]߿Îww<™E9Ý×u===1³;’æáE$2­oÇãýv¹Ì´Òf£–ÖÇ‘•Â}ÐMH Ph©¤ü/ „I ·KýÍÛ/>ùä“/ÿùùì‹¿~û×—ïß?¾}Üíy¶¤ õ¤Ç­3]Õ/÷ä5ú*xXpט©¯ŠšAî`—õ ‡C“¢ÚÌ”–éáéÙN>ð³Ü?CH†(SöAN.ì6G Á¦’ˆDÞ¾¯Ä$ÉÆÈ*c/"h%¸g"ÀìIÁ‚ã&„$)Ej¥Y±G2˜(A@x·îcLC©ÔÃúóãÁGÿÙóŠ!ðª f eú_ÿ£øË«ñ—W§—]”£;§–§-^¿ß¶~ýÕO^<[Û±ÿîÅáþûŸì)§½÷À¾ï–jF"H.kŒë¾½üúëÜ.?þÕ¯FIÛ3¨4%I&&ÎÁI¥Ô1:’,‚£o=,õ|=%ŒSº_Ïç§óG†Ö&Lyh)ED!lÉÁK˜E'©6JmYSDˆfä;†0sF…˜U€ â´„YÌíâ,:_»í×?ûðûWo3¢²ÄÁrRE/ÝI‚HÍl©ªÊèù“{i²^Ã÷±w‹ýj‡S’EÜ’ìDÌa R¦RE(k‘íê1ÈÆÞÃÍú²|tV…BT,žÁ*½ïïÞÝY´ {"YIÈ3K­œ9+"œÛ˜vÉ ¦I0N€Ã:X 3+ ÀîCH'yxöïfOÕŒ# 0q’Å`Ñéñœ|·áÖ¨Nñõ-LB&ËœíÀàPw'fã¶›Sþ9‡òaJªµ¸ vf‚ŠF„m^J…CTûÞ3!2ùá#f á‘K›:—jÖ™I˜E$Ò‰f7wwdžQ)Ås‘=v¥›ØË=挅„—Úzøü~ÍJ‹§Ïrb[*‘D·A¸Ha¢ ÉIÍ .ÌËÒzïc(X‡í×ë^K±1‚‚YX8cŽDÈÜ| &2wU2»Ñ™Ã=Ý…7eå‘^s¯€Vʾu&aÕt»9)!Èd¾UHˆl0#Uf~x8Fœ… SRÉÜ®×"r¾î÷¢mm6 ™É¢fc¯Šê”rÄôƒþwzÇÀ æéWXÚÚªí½Ôúøø¾¶Â™9ïkÿ?ap‘îOï.ß|úÍ_>ýÝ?ÿó'ŸÿáyõêõÛÓõÚá`ï‹Fyb¿<«ýE£t»ÓXTˆpW¹-$Ç£Ö»ûc#–-¼r·° X¹@‚2FRPÀÓçzD”…°ž§NóþAš‰LH‘00)É죄8Y ’ÈÝÁ”"n¦ª…B¸„ÏLG8Kd‚"“˜C’R N4ëü@™­*|¸ûÍ.ÌÂ`Šèݘ0ºÛÈaŽtaå’¿e:(„än]þã¯W™~¯ ·N9æCÓn1,‡ÇWïN`ÍHIi‰€ZÂz¼ùzaõ1Þ|þå‡ÿðKäØà}X˜»rSEzFÆ~BÌ%ÇþæôöütV·ñîéÝ÷¯ß†; —z(¢ÒjÖ•”l–Ñw!0$©¥d&q¦›g¥ Oå ’ˆÏÄÆL¤h!Š‘Îv»9ÞrÝS@Ó¿ÿwÿðõÉ ,a­`¸Ô™RX…Â@,2)ýÅ*Çäq=]+™ðÒš ‘*§»-M„ (%±í;Þ=<ÚqQ0{$îécŒHOÖ,2 H 7y³Çœ÷ öð’¡IÌ좷ù±ŠS†±”°!$PXFÙ§I…H¡%`ã×R…ømEW‰Š;(5$‘ QD©Pºõ„äÕÙ™¥,œïˆ*é™ã¶ìc†ää´'$âdrõ¤} (ƒYY$ÂX »YÉYÛ–ÝC"8ӉΗË÷¯^^/§Ú¡-í|>çãSÀ?úõo¢÷kZN —î ò ‘DŠ› âr9±ï#Â:Syzz|óæ-*ª¥–u¡Z¤®¬æÜ­h)­ÇÎz×Ú&ýQsJ”yú•løéýûZk° @” OQef¸uñÓbú{’•ÂÛž`RÛÁ¤§¤$KãIÎ%3pgÝ^ˆ8Â2)R¥ï‰mïIÄÌa¹o&l}6@î%ɉ¶Ñe‘+•AcÞp‡Ì$æÞÇrX&îÈdƤEÛ>ϰ"B'ËZ+s1sQ.¢Ã‡Y—Z3CDlî­5·h3Lˆê<¸*ñ,ÖFX´²G¯µîû^ŠŠÈõzýàƒžžžd’RgŠ oðG÷1kbîÌÅÌx!U‰1Qc ¢[ *“ —«oT¡ªan`¶áK+û¾Ì',Ë2w­ ÌÖ»#:¬}·˜¹–âcp]ìraUH†Ç¶mEK­K«Ë^_~ñõÇÿñO_üöòñçß~óêíi{êy Ta0•è„KãÎÔŸk–.ÝÊÈšt×Ú?:<Z©%#@´u ™¦å¤à[M6}þ+KD¤É4Ù9(œI\uA¤†°6À­ðtS0e¸%3ÀàHO0Ò|o¥rR†#Á`eÆ@h2{²Ï®#(„Ut>Œ(Ä¢Â$A’ NK³FäÄ ¨¹ €É¶äªìI–nilÐ`/œD38)19 {IˆªJ",bžÌDÂL€ ±'K’ÎØ#úõÒGý´?®?¹x¸[Üí^Ÿ½þëwŸüá¨õßþlïƒ2"ˆ|\2^—å°®\ Ûyë;›ïÛvݶp;™]÷‹–ZµŠ–º,uYEšƒG0 ²®H•åâ}¸Ï«Žw‡PkµÔ2£#n`¦1öŒ¡TÉ𠈧‰a <¦ÞföJ™f¤E!"á/|û(›‡CF$§yvJ#Áp€á ¢Œ‡¥mûõí»Ëq‘gÜ×ð´ÞÓ£÷‘‘#Ó"ÃFÚBÃ8æv4'Ò·Üò´°ý|®µ²@S‰2aIÈ9»ŸÐÒȬ $V€ø£H°L ÏÌ$¦Én@2Ïv‹ŠP&Í©Rßgín1ýïž!³ï%tXHfÊȘ<`>!òÎÛ~­M™%Ì<Éõ£Õpƈ"¶y¹»;±kMT…È=Ttî9ç8‚ ³˜y8&xƉÈ] cïû~½;·mËLx“°ïû‹/ÎçsÄb B¤ô>TuY–Yk0³u=l}óæ faÞöƒÛÒÆ6fÂR„T$(Ðä›I¬ªRØn±íÛ”ØÜR@DA” û~<ûæ·wq™ º¹ö¿ök]êð}6qy~¼f Œ1éÇeÙ®W”I˜ö}çÉ+·6J)ÝÜÜÍv"AL#äh­QÎÿ6£‹, î»qa!yÚ¯ëae) DzU½nûºÔ­G!ÒÚú¶Çí˜Éô`­s“ßJëa“¨”îôôxbâ@R’’2‘õýÿócìo¾{ûågŸ~òÉï~ÿÙïÿç/>ûæû×ï{l‰$©Õ${Ë«âr”8ÊX)ŒÜâÅÝáç¿ø©HD~uI¦$ˆ%$ÈA,Ìó+I’p(;@œ¢r“&ñ°$ʉAY,“AL$A„IHiN,ážyXšr'Áäø>JRÄÝYH©”×?PS¸4™ÄAÌ‘æBê„R €ZªÁÂÝ=}taQ¸÷ E#‰ÃÆèxb›pˆ ‚›±€ˆD•X, h2Œ:>xX2Peywzgž$òÛÿüþ/ÿé?µVÆ`é—§LãH¨ îN ff×ËùôôEÛq½—µ.µµRê̬«JB)ED‰HIÁì}CBT!"«Þ)‹²R!ŸåcHQâ”dJ+`Ìá’F@$A f$(#%=B ª-ú~XÊGa¯ßyG$%ç]-#fT1'Q];((l»‹ÜÝÿèa=Ð/³°Ù ò0˜¹Í@K$!´6FHaw¾em8s??‚ˆ´°“LÂRc& ‘ΉDjæ|æHæ1_SÍæT?UÔ2ƒ"2 ?L Û˜$™>y yÜpÏL4nmR"b’EG‹Œn`ÖYNa ŠeY'8“ctæ`ÕD„‹”ÌœX6R™‚ ±ª¨&RJ¡°yGQQ3˜™/BÌîk‹ÊRŸÝ­«ÊÄRU„@VMk.öäî9O#ü ®µfæ ôL3›má°Q¤FºS$„Ó<ˆ g )”ÃfÈ3KiZÔƒ–¥1–u±óù||x˜Oüùºàc³ªšy)ü·C³Î‘ð¤J@€›é´Œ¨þ¿”½Ëe[~çõý=ÖÚ{ŸˆÈÇÍ{ë–ëå*—±Œ_€AȨ-K ÜMÔˆY3î  POú@HŒa„Ô$ÄV·Ô`F6ÈÝåv—ë]·n•oUå}ä#2"Î9{ïµ~ë¤'´é&†™ŠP扽×ú=¾ßÏwD°%Ѷï777a6bXó¢= aR-‘à"ë¶E ·6,½­õቨU#‚‚Œ ÄfÑ{Û{»’+VÂÞ#À*–‹Dº{„ƒ5àÒl/ª*2œÑ)Ä—ðj-‚ÅÒ»þù°õxþäãç?þà»ßùàÛßýà‡?üɧÏ?}y\wG PÕÕã8ùþ¬Ú懦Áƒ=¿üµ/}åk_ÙN­ÙéØvD‚xøÃÝ<Æn[2“«NÃ/‘ÄrB—”€g¤'S‘P1MbAÑ sŠ¢ X¡ A R´Œ=ZfpYÊz^E瀫( »SŸ‘ÎtÂx’CÒÂ#Z%)‡oÉ;D"ST´Ö*ï­§‹È@>RöÞˆNIœaL°£ s’H2A"bž3“Õs·ÈªWYïǾ6ÛskµÌóT=ýÜ\—m;­í¡÷3Ädªå›W/nnn(S”iš{këöà 1•"$¶o·¯^mûÊ¢Ë<—Rë4MµB•T©…ŠÈP‹–…:DMuò$päãRRIE#=Ä—Ú7»wN¢:ä  âY¥÷潦@„ÆáÓ†ìDĈ$fåºdØ“ký…§vûIb¢©Œt~غ*K)…)¢‰Õ±‹D¦'&ïm]iUE—Î £ŒÁZÜ»E¢é½1³IÇHéÍB"Ùû1=t^ÆPŽ˜%"J”1Lv<Ü{ˆ`CyE—é˜ae‰0‹‘sÉ$YtêÖ2)ݹ*³ º_.ºÜ÷8‘ÔÍ5@M󜙪TËlÑ£{„C6ü´¥N²î=(YÙ=–y‰ ’ ‰)”ÌZë4éÞöÌì™ Èp$|`bw¸MSq÷LÏÌ7vßI).¢ó£ƒÖãqýÁGò¿üoöæþæéy÷I÷NåPOáž½óÕßù7ž~þ½¾oëý 14šzš™e¢63&¦ACs#¢Ã<™usËLeñ€YÖ™áh­×Hb²nü—‘ðˆ4³eY¢ùt>2ÐÌžMÓ¶m#‚˜‰¦ÍÝ­wæe„œΑE!AP¸ƒRhàJ•Ò™Ý}ª•˜DõêêJUïϧR§ôæKøWd&Öóö–;M‡å°í{ïmž—ˆÑ6ÂÍYDÀS-,„Háâi…'À™ 'wëLK7å€J•"%æn¦ÈZJføR4ŸçÃùxo ÉõPÚñîÍG?úÑ~ôÍo~ÿûßÿðgñѧ/oïVÛ˜˜-N5_=Íö¹…É¢@ÏÈœ§åW~ýWæÃá|jfžÉµN}kC=(ŒHp&œ qfªœˆà B=½P’ΠªÊÓ’$ÃQ´’P‚ÀcÖ&È©(©@TÔÍ„‹j©åpïG):©:Ì#-²ˆ&qQAŽŠ<¸( €BDáa!0Œ4 0ÆþJ@†œ§¥»…DUË2Ï}=ÚÞ}p]Ô ’’©Hˆå`¦Qߦ L¥Ê4M§mï= ´nwLJ矾`Õ'OË"B÷÷÷Çõüù÷¿pu˜û¶†Å¾v0g’xj?{þüæ×~=Ç'<¶àªÉ03aÞÏë›×wçu«ušçÃõõ\j­$ ¢"Ó˜L0 “C(¹ÖBÂét}u˜¼+«(E IJ0 Œ\ €BµL‚ ÂA  BwçPp’‡ 3C€§@éIµÖl’¯½§¯ëGkrQÌ&yr˜Ç9©Õb¦ÝIÞ6«´…ËÕ"N9h á „;ó·$-ƒ¼ è%A!2¾eßÀ"*IJ™ÌÃÛ”@Oêži"ÁÌ3F‚ gf$1a¨9ÿÒJËRߢ}0êMq7q—$ªˆè,b6äšâ”yë}Ò‰™:/"\(°Óî…Ù"UK†“ ÷pQa #“…#C˜Šr&ŠDà’‡HaÑ‹¨*§wäØåó¾ïÓ<[ï±m?=o^ëÕåɵ¯ýüüÕOÿðO^ýÓïòéüÉ'¯ž¾s£O^úG÷¬8ÞÈìØ|ý?ü½ßýOÿúû_ýâù|lǦ¥ H³˜û¾÷k-µPáâHkmš¦f-½91<,Z*ÌBèRŠ™I‘ô$"ˆdd2‡û|sÓ{»ººZו ?ºy<ª:"R¢«{€/оa¡î}˜¶0ɺž—e‰À¡L÷ë±HÙ¶ýpа®$ÅÍàZÊv^mX!¹0³»1SQ5u7÷T­™!4j…d‡©NÂlž¬)ª½u’°'ˆ³(§êÑ÷LB)dIÆ{ßÇu&*ÖsßQj‘i*÷Q‰8ó_•佯w·ŸýäÇßýÖþì›ßýÁ÷ôü§?{s>Zd!=v_èôŒÖ÷k\©Š(#<ýÙÓgÿÚoüªYo½bË{p¡ <;B Ä#@›¤–!NObZ–Cz˜wë=½j’3ˆÁ4´”\KR °"¢¬Õlgex¦kެoÞ¼>¯ë»O×:M‡™Üާóz>¾÷Óyj IDATûäÑa™Ý£g¶p £{¦Ó¼L¹¯h.0j¥C­Ü[ÏÌžm9Ê4лu>\K)£BdbQ!bƒN‘O¯ï@ÌsBB%DAÉ,pC„\*ÿøî¿ñâŸ|+ow/ÌC–2=¹9¼óxKÂõüå/¼÷³Ÿ¾xùæÍÒqÅeMÿÖ?üÃ?ú‡øK_û¿õüþoÿÍïɳG§»k­­;‘ì_dªj ÂEÚ—‰ÖÖL ±õ^jÔO"²°·íÂÜÛ›0«µéÝý])Õ¬«PŽáË8µ#€Rk;.–‘ˆeY̬µv¸¾9=Ü]]] )ç T'ð›«GçíD9¶Ç>puC20–¶o9:ú‹˜EdÛ7UAd)šH³0Û§i(õ½—ë²íAœé& mßçeŠ6ÈÙøÖ·øÏ¿ùíï營|ü驇9@UBÛ:ñúÞ´?©ôH*”|[·_þ•_{÷Þo}73Jdïf½ÑP@‹âT H XÆ'8ôÌt*”UUáð°Aƒº~ KRB8A*—JI)é O°Ò\f©CZɲ«`wFõ I¡Þ`îS)#bu\Ãp_Ê”‘¬”HPHaÁ°M'—¢,¤eÊ ¡ âÑ:¨Î@Šâ2‚KPU·}¥î3'Á™Hª Æ)+ÃD\2–Âi‘Z™%×½¹õÓy{õò5«<~òxY®XHHÎûÚ÷óRË£ëk­t>¶D†%IñÜÚîµ°ƒŸ½÷ &b@Y"M! òÁÆ’ƒx, $Ñ"¢åîÊ"ƒ$€’R€„J&;Ò‰8 c,†ôÍ bUÖ2ÕºDú`üŠhkÍ£[Xx€‡!«áDk$2DÓÃÄ 2 *…‚-í´Ûï}EÿàÃý¾é"ÈLe€]‘q µ/BªI ¢t À%qJfã\.³*…Qåè,Œ èEÛžûA¤*X’˜‰ƒÏÌŠ 0ƒ€5A%ÜÃ/p Éc$T’‚3£Ìˆd€893®D½ ä#‹YÀ<ä0p7cªµ˜%1 +"¡ER’3";Gu.#¯‘ؘyžfkm<¢EÔöž¾v³ÌRJ‰È2W¢9ÜÝYç’]êñù'§o~çÇôv{G\Ïæåp=]]/³üÅ_üüóŸ&É…ÒÀ~𼯛&-Sm =xB|IòùŸÿø¿ÿûÿüüŸ¾þû¿÷‹¿õ«¿ø[_‡jø9ÓGŠ@b3DHÌšGŒW¬Ö@͵¶Þh­µÖ€@ĺžçÃBãÿív>Ÿ®¯¯ï®æ%‘`ÞÖu<ùª’ oÛvóè‘Y€xì¥#6!’RÝCD‰Äû¾«"-LD#ÓÝý¢ Êë››m=-f>ÚªeÛ¶ešâRÏ`adùÔ­—,PÒèg.ên©µ²H`ÀÅ]Y$v O’ež=Bõ²õ&"ÊܶýêJ- `)¢,à¨RTˆñ/CAD¢­Û«úá·ôgþ½ï}ç~ðÁ§/_÷žÈ$JãX o_˜Ž¿0õYZmÿæ¿û;µLí¼zFZbïërVvJø`Àƒ ,S)`R‘mO•¢ªªœ9hÆ ‘2ßÜß^¡9h!Pη:ÕšÉH¡·N4®ñ‘ï,¢*ÌSÕäûÓ‘äéœÑúeø+$DnÎ$eôòf¦9´º# ªwÔ/&bA)åBšg2Æp—½m;FìI"ÊHë•3’3DAI "–q3's9®6OÅ£÷mݶõöåëešçešê•"­۾×ígϦyêf,C IÖŒÂX‘‡ÇOê2!I8™¥* .Fæ <*@A.] s YYE„EHRè-±AB ¦EéAÂe¤ 1ÑE«ˆ³J¿ëà ÌÈ afÀÒ<"#Ü÷R‹¸‚ ŸEe8™a[+W52ÜEÜþêPîv÷â³|ëGÿäßüÖ·¾÷³ŸüôÍ›7{\hh@÷Èè¶§õô^¹\G:Ó|øÍßüÍè½Û>lFD$ug²‚:ŒæÆìªJĪDÈ § T]R2“¶­œ&Ö: )KW* ÊLÕÂÂBœ€«T)$J$ Ó¢‘x "G-3’,=( <—J‹8σ Á«?lçNé¤eŒ~ŒœŠr§t÷a3#e.’Nɰ޹¦–'šI)‘`p:y¹ž×ÓyßWJ¢¦.Ñ‘b¦¥2ˆDTK©ŠÞœˆåŠ•óôæ´Ï÷÷of•G‡¥”JD´Û.ÀëÛOŸ•½waQUkí¯¼"°žŽ?ÿìÃ?úùOöòáá~Ý«¦"Í£ ‘rÅöNÝAûu)ƒzñø½÷¿ø•¯öí™,´ïž­“3“Qr*)Q†–Ä•9½» ’dìѤ車bfPd'hL\‰ qÁxe&ážD`[X >(àIâÖZ«ô½U–W/?ëÛvýèIFº¥[xø4Žeä V2‹2¿]JX‹0‘’Ä,R„ ¸GÑ*Ì’H ¤v-u·F,¬Zj™îÚgJØZ>Ö2‰r) "™æ% r”²f{[ïß܇÷e>,¥t¯û¶®§}ßËTHTˆEÔ9÷Þv´IÊé´s)}ß—««º,Öz־ÜîDÂ`€#RuÊtO\B$Ð0x2Ìî$âûîŽpÕ¡;Y(D"-•ÆêHóŒpkxaad}³@ºÓ´\%€™JŒK†ß’A¬|I»G¶nLc:Ï‘p* ñä1ývÉïß¡21 A˜Ù«ªP˜ë%“‘"äw¦©DDœÃ½…p@S2s€Î/Sx¬:Ë0CºŽ!\¶K°—° âpvy6̘–¹3s-öúÍóÿõÿèßúîéçŸÞ}o~ÿ=ÉòòõËׯ_ß¾\ËÏ?Ýš0)›í.e;ŸÁ:II³ÈlDWÊï<]^½¸dg:õ|B™U•7ÃÏ~òÙø?ÿoþë«G|Û{oBRæ"@²HQ ~·Ì"Q ”Y8 ³(SÉLo­ªlÖ—ºl­ám gU.¥ì{‹‡ÑÖ»3‘²ÄeC#Kuª…*BfÆ"䮪™±ïͬÏ"î>χ}?ƒJ©š˜Ü‚8§2YØHãX abGÄáp0»Då ¨óe`œ|u5‘ÈTKѨD îÍÍ—R!”È¢ÅÒU+‘“ªXk\ižÛöãñ\kµ?c“¡<%ºyôè¼3¢÷¿z n§7·Ï?~õüùgoîŽk·R IÈ,Š$œp~‡ûÓIš°§Oßýü¿ÔÛjû mñP,Ysꦰ`ÎËk@š{8« ^9AˆÈuÌX2DƒP2n€R†þ!eFš7Q¾ S‰ÈDŒàh™Æ:Äú^®–ó¶ª ÜZÏ ¤ÆàêŠsa€$2‘3”·-ÄUE™f}è"˜S‰Â"ÂEK ¤õfn$B,Ùýç?ÿF0:ƳŒ4p`Õ˜„ûS2(A è½¯ë±Ÿ7·mžë<_·MêÜÓŽÇð¾,ËÝý›÷Þ_X<»JÙ¶£R±¶·æ{"—ë+•Bé=¹ZæH£LeN-"cÙ:vëIÄÃÎ9T•x:Ñ€fgfdf%•ªœ c.voQÑQ€ÌìÑ€$Jss2I(˜Œeškd&IÏÄ‘ÌìÖ«K H Nf-ˆHq]ÒŸ<–_|tê1ÄJ4¢Þ/sQ„#‰<]©R˜0Qòð} ‹{²¥&ÒÄb÷¯" eŠñ1–*¿R’§áÂÎ!éÉD:‰ƒ‹°'e+ô•Ôqš3AÃÎ"E"àa"…À部 ¦ðDžeÞ­‹²0ïûΪDðnõP PâmÛ‚Y„4É3¥Îƒ'šCüžµªh¤¹õZkÑ2IÙcLíð±ZC7ÓÃ’ó´ÿä£ýŸ}ûüÍï~òÁO¯ß}”ó ?zúÙ'·Ó³«»×÷þpÚãîdÀ,_ßÝ:"Þ\³¨yKó/bGyŸû4] c¨HÄB4ìõ]¤HÕmÛê\[ëÝzwÏHsW"S%"2‹'O®_¼86vV1³ªyÖRÎ}“RMšÛÞ"rž&‹Þ­—©D7z3›ûÝÝ]Qfrû«3ûÞÞܾyþüÓO?ýxím¨ÚAé’à„a5ï7HM"Ä£'ï~îK_¶Þ£ûh­ØÝ±wöaWãA±Ð#÷HHÊÄ IbIVe{'„ ײ¬ëiämH•ˆ .<¨ T”°¶]‹’èè‘ßFÓèx#=tðÌD”EضžS)™AÔ ™µTâMÂ*@’€»ufh©6ð`A‰ »TdHÀDUʈÏÅZ @dæ`T’ >žo£›l0àtÅu|{&%2= ¡¤¶nçí$"w·o˜¥hÉt–çÓѺ]__wë777”d‘EÅÚšÖѬ#MJ9Lu©‹L¥¹Ûn¤Êa¶æR8Ãæ”`°%}СPÁ%9G•RažT¤D³ÃšH˜ÒÍð0GޏyB:DàɼYBYʤSQ wËÌ ô,cÁ‰A¦ŽôìÙœËT¹8þ*hm=½~ñæÅËWûñl‰Èì £g¨“½Ã~¥;POž¾÷ _l­10 èÖ³7òH d:.(F ^-9”•˜âb”æ¡We%‚°*Uesëûž–áÌcÜaNâˆØ:-ct*—Žß*z/ %•©&¥wãI‰Êé|¯¥‚,-(©ÄL#½Ï"˜IFòƒª"HX´’»'—Ñâ0s·N©:ÆŽ‘‘ pKˆ–”"JL[ßÎûª:~™Ã®"ã²b€ÏH¨HvÛ·=Ân?½‹´ùp˜ëÁ­‹ò‹W·™ñèÑu‚jÕ¦$<¶uM“›O•C ƒ¸ˆsðé<´ €à‘Rë~Þk‘cKÂÌÔšiUÀ »ÖÃU«H5w7hâ,L”äîÆ"ÎîÑ ˆ·SfFV1¨hMNÕZkI¢Á:ˆ0ZÍ•yt„‚ʘ»Gj&J$ ã…Jvv6õBòb¥`³*I’K&]†ÅJ3"Ê$f"¦S­”†9 aj¡!ÁR< ¢eZZƒy Ä3’99#DÝÌTèíÞ’›õq31ÁÃï„@J22.7ž™ŸǸ】BEÚÞˆHT3³wÏ O—ÖQä°(‚¹Œa]Dˆ ¬©*({ÆT ³P"ƒ5ÂjÞ#FJMfd©ÂT+Ìïÿï?½ûÇÜ×ó“÷Þýtkw¯Ï"’a‘;aÛνZ¨4–ë"÷ëik{Æ:׊”—ÖuʸšžE>‚ßZ|üÉ›½m2ó½õ÷ž=z~wÿKë¯ÿöïÿµíþ4´s@ÂTܽ”’NÌ`"‰ r/êPnM˜Ö¥[ ÏëGÚvJ¦Ö¬hÙ¶Ó¶m¥NR˜‚¬;‘{ObN»LÇbƬfýjYÜ}žæ5ÎÙÖËPýÃÌT«Û΀ªŒxbŽ {hûÎDžYUGîckíp8˜õy®Û¶ÕZ‚t¤<¹– ÚŽ§óH0f¢„™õ6/×p,Ë”9úZ„…,{NóŒ‡"º¹><<œì­©ª‘’ŽÎcÛ÷ëÃBÌÓ<µæŽ þ^×W···¯o×moîC¢áD(4´‡í†·YH«¾÷þ—öÖÜÜÌ›Gšl§Lèh[€åŒJ ðNÂ#r ffaL˜êT´K2´¨U U-Œ·CeÈeQÌQåy<D(,ÚòV&Ìeô{™"ÔŸ–©ykm#7dFîDRDÛmÒÌ/ÐbQ¸;q&ÐÍÀü_ßøð¿û>þŸÿÑ~Z—GO|ûúøé‹;.ª\3D˜ lÞ2§…µ.³€Ü³õÞ{/ZêTX–ÉÝÏçs놡õ¶×Z¶Œ2OD4˜Zu¦ªz:†fô­½…ˆ}=Ÿµ(‹ˆˆóéÌ"cÉTJUXF"̤VeN $_r&.ß…ÌdÖ6Ö` ̈1@f¦*SPf̵òȶÿ…ûz|xýú~=÷nC0’˜877§Õú:=î[ϯ~í{\nˆ0sRÂ;ˆ(-9’ ‚ƒ<Ñ®Y´¬ä™ÍME‚@’$ðõõÕË—çA’!¡±¨‹‘2–IžI©"¤{¥BLã%–ÐRH-<’ާã¼,#ÁO0‚U 4Ã%[çbÖ`1Q¥ IDATF§¢–’ÊDrø"´¨²¦{’gRóHˆKÞ©NÛéndPpŠgF’FB™ÆB.öBÈÃú¾Åñá.ׇkepo}ß×gOi(3Ý{’{„œŽGaåéø \¨ÌúÊð¶‚©„ŠÈFà$âRÉÂÁ2–/È4lìªsÍ+ÑÖ7á:^“È˜ŠŠÖÖ, Ý"ÓYˆe•ö8̓…iÃájD÷Ä‘y\¬ÿƒ]UF…XFúy$¨=¼(Uº9뜔ÄJ:yLŠ !DD2 %©ÈÆ q¿%€t7E: ”鞥Ш´JÑ ,¢ÝaîLðp¹Øâ èá•9´ íqaœ S™š÷ŒUNêÞ³Œ»!áœÉ0=} 8(£·¾Õ¢yÙøŒõh4¸\8ÿÓ?Û¾ñíýöáÉõÿÆÍ‹^¿~}ÿò–«ð4ÕG7û«‡DÞÜÜœnßÜÞ„è—¿ö=ž®Î±®çãÃÝ;ï>úÜÞy}wŸW§æûËWŸùT@É5“Þ>œ6o'öƒÖuoë×ÿæßý/f‘7kËåßO<0>0¥HñÌ^œe®vì,ÒÏfCð½ï+³2óÞ·"š™:Œ;ª™Y´<<<,WWÊÃD­cßzÓ"ó4E„Ȉå Vœ÷Z5„Åû^uq³¨«µº›u›—éî¶M’nAÊ LÓ´ï»JµÞE”3£…Þ{)e(VG:šbænVk f>N5+‚J)l=Ì} ý"­±jw/¥( €}ß/×Iø0–;ÚØ0‹P ë庮ªÂ,Í-ÃÿÅ@¸oëùáþøpw×Ý ðÌôt÷݃УyÝûœþôÏÍWWa-‡½†p$²EdÄ  3>»0‘Kz*A…•ˆ‰U"µˆ S„Ô™GÌ8#|ˆJœ#èBK‚.Óžñp3G&ùUï>v^έyú_fà`žçZ öí,,Â:®H"rá*µ–!ly­™H82“T(‡ÆQ cWé§(*E¥¨²j)ª"}[·óÊ™iÞ¤We­`á"ÂBÃæªR˜¹÷nÖÜ{d÷hwC$Ú¬òÍé¡L³av) ˆY™™½%ÍóðZk™jN * Ë^3ºŒ³3… 'B 7|€Å#<:t)–g…Ž, óP˜‰™"I,s€ƒ1BÁ¤LR* R€Y"u*£©ÐAÉ4Õ2i›ÐHL$ dDk ‰ /, Nf1‰RÁX‡±ˆ Ê¥h™”%cLJA(HÝ=ÛÿC×›üZ–Ù}ëkö>ç6ïE—ÌÌ`’É$)²È*u–K‚4(76,hà‰!l0 °'¶ AðÀ€‡žú°=u34j`ÃpI4Ê*—TEÅ*23ÉŒÌÈè^{ï=gï¯ñ`ß lŽ Q§¥ÅóÁ†%±Ý]˜b‡Q(›fp³D!½'q ŽKXôv•Mφ GöpO@‹–¢TÈ£ƒÒ#ÝÌ Á:¥ ~ú±+ž‹˜Çª `hÏZU”F¯#FûR¸YgF°°GRteñHüŽá‘ê(Ve–`–e¡±„{¥ˆ¨òÅî~.HÈ$¢i®£.†hÀ>emMX‰ET"³LS8ªJ&ÌŒ2GäÕzWaGJ¡ÞÌÌ´µQ‘€™"¬w ˜ÕÚ"œÄjîÖ}Hûýåº,`°e]Tµ7·Þˆ ˆ!ÈŒ$‰Š2EkDôÞ™UDJ©±ß_Ñr:ÇØZaàeY@B´ä¹ EÁȪe({°Lsàž#V6Mpž£Ó èevUžç:gC¢ø (èít<–Ö›eæT(†“Ásõ7 s13ïÉç*‹ñqö> ¤N™ Qx´ÅÜ´#.9LJ—Dʰû‡û æÒN >I)HP°ÃB8u!æîð8GŽ™Ýz‚˜Ô‘C:åp‹"FüzÚTµ0ËÞ{)BãCâ,ã&0$w•Ò1àø™É$ÄcœŽ"Ó´!Žy0Hx]Zø(LŽ$ZˆË4Û#ÖBD*$z~þf*™‡1hù4fÊÄ1Béhåšt¯”-¨[@¼L’Éš±$£°Z¸”‚ôZÔ€ïoLL:o|]ÂÄ.ÂÝ ¢a)À<Ïnf™Â爟†—ÁĈ8 D1`ÄÂHDd)³¹é­9Ò“YÑ)E¦€™©­MTr$˜()ãã *¤¥RF$W-fY1•ÒÍÜ‹‹ Ñ0MÎèAD*ºfê~—7×Çÿíÿê?ÿe¹¼¸Zu»yüþÓåΈګ/¯Óq¹ÙH% ¼ÿÑûÿüO>¹É¬aûI`y2Ãëë¶ú×Þÿ‹e½VýοyõóÏ_¾²iº¾:ð<«J+ë×.ŸìçÝç_¯¯¯nÞÜÞ!ÊEù­ÿô?Ú_>\nn§©­ÆX1MÕÝZknkÛíg™çÍb›;²¶FĽ¯S©ÁfZJ[–³×“¹»Ã“Ý¢G›§‰ˆU‘™é±Úêîm·ÛeYkÕñI?wŠXÈ ªUO™î]uÀ¢/kÛì/X…“ a·AD¬½oÎ,ÈsÀá¸^^î‡(=ú¡-3–eºÿ8q¶ÖJ)½÷A&)S½?¦¹rp˜¢/­ˆdD÷eCÅF§w­™ÃõP‰ú8Zch"8½çfæR„§Õ@ñ/e…Û²ÚzX¬·îAaªÌ-¡ÄKw Ž­wìºô8w§ÅØ=’º!;‹&k‘±ŽHdF¦88U‚X jÑ5•‰2TÖšïv Š:mÚñ”æ6©F@r€%AAÉIÑÍEE žÁ™Lìá‰T’ÌzŠK2@…E´Ý6(Ò­¯Ã™/$çë6FÍöó ŒŒ@ªîa¥K'¢sŸEÀ©RgR‚woÞ"#­/Ý:ѾÓÙ¾PæÝTc®uS_|yû¾þλﶛ¥9j•?}öÙæÑæ·þËßyòß[ïîÜÂɘ(Ý#AI½[[ÛÚûÅž·'E„µuYvu„„¸ÔbÝÌ£ÔLw"òÞ‰àŽ¼:»Ý®÷ŽôŒá«3–ÓªªˆPïÙ{FÁýu³ .¥„™2gæi=g…§Öz\Öy³ w€µ–ÖÚèò-¥€ÈÌbšð Ý5ÛX&™õRÊèø}ë;²³‚gæîûýŲœZkó<÷ÖÌÝzë­-ÌÿÑ’gPþ݉²5‹Ueá<ë® a@2 H!¬í®­‡ðµ/ÍcTFÕ:Ð×”™–™)'Yóú””Ö›ÝßT¦i» ëÝÛÒ–iÚèT§i.¥"°ZײI÷®!˜93@Õ”%X‹2œ©Š%KvÕ ¦HPŽj,Î.ÅÃ9„”Ü ÕbÁÔ.eRÕ@’$HÃÖZËÈñ)qëgªŒ0¤BƒXö‘–fB"ÚÈ£&O‹¸€2……h|2))B4ÜÓCcôHR&Œ–Æt‹!àALéH6‡&8É•Ñ% v*pCZ¸Sàtl š6b²4ÔBH2ÖdiË Z ‘Èdn@ºg…fP‘Zkë=Ɉ5}°Þ’˜iáá™”c` fJâÌœJͤÈÀQ ÀB™„-d–&+%<" LgÞ‰‘0TÀ ?ïcìéî4Þ”…YµôæZJ)Ê*^ ïvý~|ú_÷éw¿~|xÙj‰¹üâÙýí:oçÍ'Ÿ~N7¯ßìB.ww¾xòàkORËëÛ[%§ãq;ÉT«I}uºúÖÓë7ÏþÑq÷õÇ~‚Ýôoüàƒõó7ïí·çíºÞ”ÛõõíçlϯãB~ûügïþÆ÷O×·Öz&X9rÙØGþ™3ª¥Öjcæ)¢¬ëººgš›ŽÆž”{w¬5ž7ª2M5ÂÆ^\kuwRV™"X­[¥3£“Çl”ÞÇYKm½åÀf`vö5Qxf˜ê¹J~˜|ܳÖi°`ÇwôAº»°LµöÞÓc íÆñÿ<È!V’ÅÝE°ÙlîîîD„¦iYÖRT³¨/Ô I"D9´¿¶¶qé!bwÛ]\ŒFb"œ$"¦á.XeÐ?.³¯ÊP ,zïK[W‹pä¤Ä@ÏtÂÌy l…^øÍõ›ýöÁцA ޤôÐB‰ñRž±îÄçs–Š&2æ¡…YžNé%qt÷µi©àÖÖµ/kƪRrPo3¦©˜w"J²„[„9ÖêÝ€Œ4³d@˨ãÑ ÐÍÎcdçAHfå$8’Çi4h£#³;¼LJ³ ")¥¨äʉ#Iˆ»õ¢ŠŒµ-fÖ¼ÙÒ‘£5Š ‘&Ò­þXµÌ%r ñ“Ù›{¬Þ{‹y¿“y:¾¸%äé°<~ò˜Ë°4¦÷Ö'-¤j«e$MÚz/Uä)«‡›)„…Ù„“”"«€……È&’©ÔÞ[žm‡¢:®Ãæ’ÀȬ‹‡yR-dá¢"™Ä9ò|QëçKPd$ HÀ›©H·5Ã#¹HI¨fB~uYFDH–¡2 1ˆ•Z("ÝDqö9Ä`ÁüÜŠˆn„a«ª 06axvð”™„ÂÚIž!¤²%N N•ìÎRÉî@±ñêfŒsºˆŒo?éÔÖyÖþàLa!BᑆÈL=&!!"R„2£J ¬`§P¶%XœX#É<xJÍæ„Ä5½eÂÂ2”™9™¡"i>M“»3îÃúWJ)EûÚU5KñDùì——?þÑúɳç÷Gþâ&"cÞ\ž}ùÒéþö¾N¬?üîÓçŸ|øî㶬7Ï_}ô½÷Ÿ}rõåŸ}úÝå#~•w}}ÕÃéÉà -Ç~ûì÷z¿Ú¯}øô‹ûöøÝ-U¾¿Y.Þ{Dâ7¿|£½>XõÉî7ÿ›¿÷࣯^_‘§™Íóáçfc`äX¹RÉôÐçÉdÈr¥‚8<¦Z§ZÖfƒÖå6Þ?÷÷.ªaFªˆ8N›ý>“<×)3Ýœßöä2ë¯r£Dè}HÕæåtJÎÒlž¦Þ„fá_¹øÝݬGÀŒYẋþ†·à*²Žf¸ÌM)Çe)¥œN§RÊðnFÄiY˜©÷6L×´ˆín×Ö6F€"TJUiÝÝ"j­o÷Þnf?w» ±TÕûÖÚé´ßîHÕz°äR¦L´6úhIŠZg-õ«6€L‹èæîé‘–ˆR3ádP‹4À÷ŽÅãþözž¶ÇvN™°{' £ƒ1œ# ÷c¡!ïJ4Âe#øß#YXD"#-×Äét" Xži""bãd˜¦¢ ÊpŠxû] ÄD1‹OŠZJºŸÖ(@¼¬«Fé€2xð> [@$ˆˆÑZÉH Ö‰ùÜòÜÍ ’¡ÚX·>.ïî®Í›°D1‰@PO0Qò •I8<(9rõ^´$¸¹úÅåúNW÷k[#l·Û×yÒI(= «õyš9ÑÍ;»ªdz©…„‰(ÀEqJ¢ÊEaÉ#“!ZJH‹ˆ ê9ŽJÉÓ´Ûí‡#³˜5ÕV"Z×UTŠX93È»™ó 8wDônLà,’$R‡±oSyƒt>o&[:eúÈ%ÕRÌúð³E³@f¥+’<:.33U”h§²~[ Ê §Í†4Æ`b)^*#r´M¤d†7€™+QQºŸãcÌ0º©KU³PåˆÐªîɤúÈ.°0!¶L#’ˆ %ˆƒ˜Gr@T=|ìˆä.Ì AD,œà™  ƒJ&*I_GÀ,2üSÊ Ð9_ÁÈäãéž™7»™‰{„O›’XÿÉ?nôÇòÃ'¯?¿ùZÙ\B f J *U…Uˆ0€"`vJfR…#ÓzàÁƒ½¹gËvZ2ÍA!ˆ‡œU*£µSW”dм¹=±®';d¾óùÕÝÞ;uì·’÷¯7¾ì¶u§²›zZ|û¿öòÕ癿ì| YŸ¿~TËn¹ÏYO·ëí«×­ò7¿õÞå~‚”/Ÿ=_.ö­Y|rÿá¯ø'?þå®D@^½¸kÀ÷ÿö¿ý¿û·Í­Ý)̱ÝLAi­×ZßE}\¹¼wµÊ4ÕÌдÍnWk5;ۑ݆~RÇz:ÚÞþ«'!FF&bžç„Dýtbæ2MDô«“xžÙXX§ZÌ:³d&À =ó%ͬ·FDn¦oq…Y©…EÂ=2=BTÈz73Û׺¸ÀÛýY r7f ³~yyyw{+Ûí²,T¸™+³ ÚÚ¥"”s)ËùëwVEDëm£[b©EÇc­µ€¨»+1"áDRTWafùªÀ(iá:1 '—P"ÉÁ0W–ƒå!yæòx· IDAT³Øó/_½÷Á÷LKІÕD7 +kº%s„3Wd€²÷%ÁEÙI¢ª™ahÁU[3áöÑ@Œ´€0D€p‡Rdf$'åê]HÌg×,Ì“ÜBšyôn½7d¶uȰ‘ˆ!‰¨ ÉpœÈ fq¸!=¥*¥âloü‘ÑÛ*J”ÙûÉ–Õš RÙCëݱªèÀÆ1÷¾`¨ù¾ 3»Áòàòržç××/˲®m{¹¦©ÌÕ­GÆÒ: A&·Í²‘Z‹y[E¤TjåTʈGPaOUDK+*Ž$– &$±‹zD¤‹T–ˆd‘"¼¯½hñèQ¹f†®¢JçM "P-‹’R†ŽÏ‰WŸ??µ€VDîw;Í\×µj£÷à ;Cf'=bP“˜s4öf:Œ¡/5šƒ¦$‡XUÉz”:E&<4"°1˜9%)$É c‰gs©¥@=cpòj‘†Œî>HÎÉ)Ì OD&2ÀÄL”‚JʳÔ›‹qz7¼/n‰m` ”…˜•­Ypª2X%-OË"*ZJ´&4^&åŒ ‹ÌÜl6gÓó’ŽR響ûOýxœÛ‹õæ¡ê;»w¾üôy»í?k¯^¿¾):=yïéým‹åþøìUdç;v?üÍYêáù›/ß¼Ñüãëþáû»é~}øÑã›ýgŸ~æ—eçþgŸ}ñø½‡/Ÿ½:l7¯®®6•ä~Y •Å®—Ž‹Í|Õo_ñ?ü÷¾ùïÿ­Xûr{§"Á̉°@­zì'"R-@¬Ê68î ³§~ K-Ö»µV¦‰™{k»yÂTJfÎó|8...Új#FÀÌV¦t"¼5¨ŽnV¥·[3R>Æ+ Ü[SQóÑÞ;#n¡¥ æÖ{R ÎP ]–®¥$kYGmBª D! ‘î>¢#z°d0zÆE–åÄ2Êñ0m6çh‘ˆ”’½[w@n™ÄÄÚ7FÍàð¹Ì1ŽnÂDIÉî£PÈÝŽÇu<Ÿª¥H}Õ €)¥ÎS¦*’„*$ÌAIJ˜§ùÅ鎘 rg}žñÙË›íŶÎÕÃbÄþX’ÍiLƒ4ÐK)aaÙ)$Yê4‰™DTdlæ§uíË1=º‡Á1¨Ž ÷ÆªÜ Ì"#|ÊÄÊ"œ’”*,"8×i¨’Gï'ΰhf™ ·–™†SQ‘2(# 2f5íL QÊLÀz'**9Òþ.B@†õˆ^¸Dk}Ymm‡G$ W­ bMb-B*¼ö6´‚}œ¤=£¨öðM™¦Rî—Sšùº”ÌÓ4ϳÖÍZ³$ÙnfD€+#FrŽ•…ƒY9cmF:%“$p #Œ\"TÈ’‘L ©L9zëF?)yT©ê2•"Å­‰È×µ 1ÒÉF°h{ Ö*Z=#‚†¥*ÂÏÍÌ"'!.%‡‘±Ù͉€™»Ùuë‘‘™7vSJÉÁ_VÚî6¢¥™1qr‚i$àc`BH§µ!ëˆYÕn:MD„L‚’Xx j÷á¾5ÁsB‰d"YÕ¬‰ÔL+:E8cøƒ¹­+× Ò¹òa9FwÅ –!w2"U9,ÔûÀÜ1q!cDÑ™tk%%‘ìÖ Õ D‹’cžç€sdfºå~»_[c¦ªÊÊ™`%ëFI¢B Umf<l6ÓǯåýÞýïý¿¯Ññ¤µ¯–Ú–'{öÎv«W/_ÞÞÎóþx8Q[.9Ê|1Q¿ØÚ¬1OüËŸÍO.Å.ë_ÛÝ_¹]-ÁüäÝ‹vuj·K^.?|Ÿùìâݤõ£§®?ÛüüŸý‚» ɦ”çú¢^”¯^¼þúþ|çßù7ï^¾. &R-ëºöî¥*¥yËÑèán"?ƒô$¢ƒ>˜T:ȑ֬›¹õŒÔAé$"I“©[&™åŽU óR9#"CX**Î42A’iëÚ×åÄñp‹žkoÞON, "QRQ&î½™­œ°h#3LDEÌ#µ®K?O÷‡°ušêå~3‹Ìe]6Û] óSÖ¤¨*Ý=ÜÁ@ˆÉ´qf°SÅùöD ¥ “%tZ»‹‡“(”üµ–³u¥”Þ–tƒˆ‘nNÁÄÉÃÈ–€‡ WÉ),£K@˜x€Øj5ëÈ dXF¤ ‹"™¤·> èçIi˜F…ý÷ÞÚIË'!$ÎÞ2Re f‚ E&¬"¢ÉŒáQcÒZøB¸„Y¦"G!#ݨ臭ž”žHjÞ§‰•yq·Ê íŠd™’Éh @âeå°à@$BY‰‘ÈËp‹ŒŠˆ$aŒ“%2T5àÇãQEU‹jq3ÑÂé)"¥¸k9‡S²­´7×ô¿ÿ±|üs­úKвÙÊfzðè§ûãóO^ß½Yž¿z5ñ¼‘y]NÓj/¶œåý÷.qûúݧOñüåÏúìGôÅ¿õÛ}ôÁ{¹¯ŸþìåþÇ¿øƒÏæŸáþ³×W¯O1_ýâúëûãëv,¾Ýn÷ßzúè‹«ãóÛíÓËK®ŽŸ_Ýåðoü·ÿàÉ_ùþòú†Üƒ ÖLUÖµywbDZ-"DHx& ‘¤Ö)ÏfDĺ6€UuôŽKïM¤˜5"d†ˆ},ÌÊ4µÞ•G°ÓyzWGøRD¨wb±¯ÖÚ°–¹ÙlNK„ÎA 3f*Ót&ñÀØð Nfæº.Ó4¯}!¢q‘RT»ý6š{zD(Ñ Œ ¿÷>xB佫j&†©4‰FàÜÍÖ¶"‰ÒUL±vS¡Lv§Zjï]˜‡ ÀÌF®h1âäS[‡QÞ=j×u‰ˆZKkm»ß}eŒêT¶ûÍ4ïëfâ»2>CJâ}­‡Ÿz\¥€è¶Ã#þéŸ=ûàk/.ö£¬õÞ»{7ƒ¿p–"Ó´Ùo7S-SfÑZUJFôtîI1ÎZ6ÊI™Ì)bVÖźuê‰ãÍ g:Qа…Qf‚D ,B$‰,Z§Rž–#&áTEóK%%ÔA).ÂDî)ÂU…K:¥d„#ˆ,¼¯ëêÑ3Lfë’aÖR'báZˆ‰˜aiîFÉ–Î|&›;óÌ\×…˜½­H•i³k·V ËÚ :pµ N‚ÊP'%“Zk!•b“„X%»K LGd­agþ(Ⱥk6óNX<3«EU¥­–Ê´fE•EZoƒA,"Z„™‰5(LI$䜔£~DFÌ·5U57ë UÝD#&ËB‘˜ÀÂDcËNf&T€{D-­ð‘»:’ûÚ-C)• feo.udÎÊàíÆƒt'i¥ŸÁ]*%*jV'ó>0šcÈL9¦Áà sŒb¾±óEº@‚ ÄIðîªÄÌpPPçB£8}t“b"‚[£Áµ5'¡ÁùDÀÌt®¤¬¥LDÕÖµµ¤JˆÍf3Ôgb’í–ììÙ úÝß¿ˆzg½¾óµg¯¿Hå?úèò[ïúrs¼ûé>[O udž(÷* øÁ¯ãñûŸýèî›á;¿¼9|òùñoý»áúË/Ë‹¼wñá;ËUûõ¿úýÏ¿ÿõËù{?ø†ÿâþëý;xv-ß~G’>ýìÅöÑþQ™ïq÷ê‹7·ˆ#Pðí¿ú÷þã'}ãþå+4èŒlˆÀîb&ˆÆŸÏ‚Ï~ЯŽç¥”AwQï}š 0‰È¨Q *­õÁY{߉ôuÕÍÆÜ‡ƒˆ’ˆ™Gøn·s÷á@ÉLMµ¶Ïáp×!sš¦icæˆlÝ…ymE M2†®9b½,%"E˜b– Æz:©l#|8€çÍlš¦ñÐ@„ÈdDf_×:Õív».§—ÆH¢zd*Ò» %ƒ=PŠJº{¨¨ˆäW™#PJfmÝrõ0ÍcȦiºººÚï÷»‹ _-Q)óf³½Üo7›Rîz(T˜à"LAûM}Ý[‰8qh.¾Zb¹=}¹¯/Ÿxïôù'VÊâñ(éþ¦ýäO>>¶Æ‰ý´ÁJƒ÷lk¹ùòUuÿüÕÁ./>>§¢í£¯=ýðÛŸýôg¿þÃ!¿{³ ’Š÷Ìöü¶õ~ý?Ýn7×?ÿüñîbÛúëb§öúyƒöàoþöÓßù;ÑãîùËôάكT=!L¡E—¾d÷Zj"k­­µÂexcüí¯1îþÿÿã™veö–>p[ÌœßÉå- ËÜUµÖ93ŠžIcBŽ®Sf†õºßÛñ°. à_í(¥”Á~²nužˆ937Óææþ¶f ‘Eø´Ùާñ•öÕ,ÌúP³Ç£–B™qFˆŸà±»XkÄ”žÓ4y„™3Ç4MÞZ¸»™ÊpvÁóìža‘ʃ<ÌÜz'Ñ1¬¦·(:O¢2î1ZkDÔ:­ë:ך$"Ò»åØ?¾êÙm7—›‹Ë‹ÍíR:Ÿ¤Hœ¬ªH“©GKX¢y<÷‰/ž½þøË7ï=~øp·=¬ëÝý=™Ýßõ:±²”Q®4ÖD’ˆ$è!-a ’ÐGâ“Ñܧ¢dbª§.Gß-õ°yÐ),«§BÜ#‹ª{ª¤Òý˜IºyëÆóýiªßä\ëhÌÓLIuÚÓ~·©"æƒóäo)…£eÀÞ-Íl9­ýôÿ1öf¿’m[z×øÆs®{ïlNž¾¹÷øÖ­*W¹Ê%°lY¶%[‚7y@!ZÉò?€2oü+âÉ`ÉÝFa$0¸¨ª[·?ýÉ~÷±Öœ£áaFüP92t¶2cÇŽ5çh¾ïû E yroM˜6óV§ªR‰è&…#p„+Â…§¬dœLO\¿z JЍUG6Ñn»ÛZd$ÊÕûãAK ,%‰‘ä` ŠÖ(K28:es*Ü@œ#`+Óçíλ‰PQ]{SU­DG€=ÍRÄû¡8<3’P¦a3Qe•1bO c\H„ˆ<ÕÓ˜”Áän/“fF¸!œL£ ¢d”Zª…Óxã„‘D¥T¢ì½é¶e!J$YsFR­%F†ÏPk¤øØ€Ç:Ÿ,Œ¢$FX0±25Š$k†“‹hS.î}œ§v„TKfj)éîE+E䙡wÎL‹” 'U3çøüd¸xX溑¤')èÍì±»µ¶ªÊ,ÓTDܲÖ:‚çÒ…ÀÉÀn+×w›ÿù_\ÿ£Ú®ï¾÷»¿±W}þúÅïÿö×ß>{ôö»6»Ë¯_¾¼_:Ê·Ïo¶Ì•„=Ü®Ër\³&æhõǯ„úÍòÃOÞ{ðåÍÕq}÷ììxs_7ç«“Ç÷?~o>ô­bs~Voo¼¬o?Øù¦´WלÓqoçÁÇû8£r¶ûÛÿÞƒë¯Ùq•µõuÝl6A™“¸·&󔞉psUMJÐPñ2Nd:e!ô®ªó<Çãñ8®X¼©sz# fÞï÷¥èº¶óóó“£—¹µ&¥0£5‘a¦L¦ìAfVK9.÷(ªó¼im=}ˆ»u7bL›Íº,"ÃWW˜y·Û„[³Ø‰|·ÎŸ½yžNiBuš83"KÑ4ÿn¢5êšL¯uË€õpØý°Ýl‹ª™­ëzq~¾öž¤°ÞËfãÝÖÞ*'kéÝŠ–Þû4M­5ss7‘Q¤gÊðNƒ»w òu&Ûyn­Q¢hù“/€Ruw~öî;?üðýõ¸÷‡ÈFa­AáD¼ÜÇzMí°§Ý§ÇŠIéH¹wòÊþÕí%â2 m…8©°rÉœ(+3,“x5*ˆ 0hõ¸:xI7ä~5V¡€°6Ó”ÕZ grdOªÜ(D‹4 Ñ‚pV" °x#Þ&ÑpgfŠr^ø tѤ¥'±38‹{0ŠÔZŽUka™'=¿Øí¶ÛyÞ4÷0O¦L± <<—3"ïM:y¸©Ö±§ýÄç#2"’1O BPèn¸êœAÄÄNëËšOK-Ó¤U×¥™y -BµÐHÛ CA&yR& ‚Œ @2¨ÊBªÔ‡‚0#83”i¥`0q@„U•(#ˆ¬‘ ˜=ú€¥¤ƒ‚:ÀTVæáF Ê®i}fðˆuË ÓIØÃÀIM9L" ³œT¾`^¬13Ê<1`f§Inff ‚á`ª8E+À&0CY=IÎ@"á#ø¾‚„BŠDæØ3¡r‚ÿÁr¼÷ˆ¬Ê`œ8Tk^ú—ŸáqÊq8ƒ(<“3ü„ ebÀxü¿Ñ‰{gR qKd2³ÕÕ‹X¨Ó<~Zñ]¦Áˆƒ碲ÝrüóŸ,ÿäýµÿ”|ø¡ï®ßÿþÇØœ]þø3ýóßÿÃ÷œüÝ~“‡ý_üKþ'?ùùùöâZ¨-nNÙ{¿us>ÍW·ï?|øÁùûo¿¾|uóÓ?øåƒ?õöÿÊïž_<>îï~ÿ£¸ºûÑÿþ£îxzìï)OEîöÇŸ¾¸úsõ·Ûç¯>ØŠ°^.þàqù;K~ý#¾_úþ0²ÁÖÖ”Ç7ë¥ÔS©þFM?"Ä"mrTOЧ1ù{œ|£ØQ­÷÷wÓ4EÀ§5,‘»ÏóL¢¦ªëºöµŸÀ°»ÝÙqyÅÌÞûXÛ²2w¨ªE”R=<<¸¢µÎ,DnÆ"D¡ªnmÌÍË1(ÈóöþNDÉZ„£ßÍXUsS•*µÖJL}5OŠô©l(}TÔ:»yþK23KQ2Ô{ß÷Ó¼µ6(ÉL"½¯æ€2ài3丠ØmÇm”á:ün”Të”˺Àcª#´Š¤”°_…gÑó‡ßÿäÃË«ûZêÝíÍÍõ “¥­ÈHoÙìݳøú*ž]Y÷f·-7šÛÔ_”¤H$zfÉÐf„¨B|€Y '2·žPÎæÑ6­µ²$a%S#!±sIÀfáp Ã,â ,l¥S‚øtô² Wëž•0Pº)èh}íqX“Ê$’äÌÊÄPÑMšWêÄ(L¯n^mtè­'ïœí...Î,2i¹#ª¯ YxO–(µ0ˆAŒa|ˆ“Ø"„ ’LbAĉñD‡ HJfx8Ì|š¦um1•BNZÓ©ª”µ7ÑÒÛA…E°®1im¾Xká SÐ-6Ž#==dfÃB”ªa!Ó`è-Kn¢€2#I!Ä6€· ‚reY½™#2¨Pdæ¶žÄÔ#Û,ÒÜ…9"AŠpå¢*Å–åB/ñO‡€ r8S†ŸÂ@AZ„@¢Ê’’Ù –Az÷é"R𾙪F7žž–¢£•æÖÖ¤A-Öèš' ú‰n—Ñ12ÆÍ!JDaD‚´`¡ QdPxä€PD€–ÒÖ•U9=3 + ¨Šu' ßtÀciLµ`7÷?üÅÍßýûËÙ[Ov­Èë†ëãòËϾ8{çƒyÒ«›ý¾ÑçO_|ñüåñözËÛóó·~ó×{[øðü›8¤wÛªO“>Ý÷ï=šqy‹Ýîý·Ÿœ×úûß¾úøìü­·.®^ÞÞ|}ýÍ//onöýÙñÛŸ~uùòõo~òÞá¾ýäî®CvàÖû¯opw˜&¬O/õ7¾ŸÿåÈo=’ûãÒ;s‰0ÕáÝm¨EØ=€¹,Ìœhk9Iÿ¿£P¤µ¾Ùœ¸ÇªÚ»‰ˆ»·f¥È *„äð”R‡ÃØŽl6›‘¦Pk§IU‡Ã˜yˈ¬¥.Ë‘YÀ|w¸ÿîv»í½©ŠõDT«+j-nÎÌd-\ ÷0®ºŒ4 îî…bžçûýe x]Û˜S‰Õ¬ÎsDd¦‡/½—:¢{é>¾;À(Z":Ep„2G&Q0Kom{6{ä› Y9Žófó~¿?;;ËLë6¼cÌ,¢­€_1bÙï>øðÝem.¶W¯¯Ç£-ër¼³Ö˜z_MâÉöÙöÑôíåÍõëc_S™©'NYšJŒ«xfˆŠ=•Ð984|D+ÄÜ- ³qvŽÕ9ˆ=Ö½gB ‰î…’IB•7 „ZÔ92ú€©² ÇC¡Ié™ÖÛ ¢"=!ôÑ“gSyûñC‘ˆišzïãíðÖ"“B@|·ì‡cFožy‡ðÓ×·K>ÛûYµý“³ùâ­óí¶n6néDY¤Š ŠÌà¢*9ÊòsR"“ˆÆÉE£¦LÁÄJ‚Ec÷EU8jeV•Rì͈ÜÂ^îîg*˃GÿÌÇ—?µÌõÃOß‹½_ݼÎ¼ ÔÿoÌÿÁßð¶æíÞÍ©Q³k)aËrŒ3›¦9sL“HUKa=­®Ú4UÊH3¶Û³ëëk3rèñ˜e]òæ×X¨j)X×e8{G*õnÌ9 ‡^KIóc÷}$³»©êa]Ç]R¦i |¦©m´#,Ò=0Ëf»[–ƒ{D„j74ìªeä]‘ {²2Çû2À¢fQD"bœÇÓ=ü-Ó4‰8³œ_¬­éfZ—ET‡™™•™IDTˆ…Ó™îÑݶ›M³0¢L ívƒx`%"U™{_#§÷ŒÇÎ¿Š œIEËÃǦ:=|xîÇýÚŽÑzZóÞá½­kþòõ·o¿óÅÃçŸM_ÿâéÍþf»õw€By&ÈppJ|# ƒ •))ˆfåæÄñ D-9U1†í”´äVt[TÒ[ÚâI(3#hpJ  Dx°HdR‘5¬‚…•2G¤Izº‡¡ÌŒ©Ê,îžµ§ '¢Tá1 ÉLR&^Ž´ÌpÇ€-GÄùÙ9˜@1f5ZŠªzD)n$xª"R"-2Áš¹ ¥€:©LÉ@ª0e’ÖÊ‚Ö{7¯"Œô &³õ>Q!%÷ !œNºL €pf y&X8)#F,Œõ¨EåÍŒB$¥²[‚ÝÕ É:PÏæ²0JfõÑì—R¦yÉ?ú~úÓ[YšüìG?¿(»g×û}.-{Ïòí·/.ïï~üùèÝgÛ<¼ýÑù·µ~ûå!Ž—?º\ìå‹·»ëÌ5è•û |ÿ“y·»zñR¨÷¶fÄ«gÏ¿¹]é§_mwç××—/Ÿ]òø¢°ž}ôö—ÿË©êîñ£8úëñÙzwG×7+a÷wþöô×þ\y[ùÙÏÞ›?ºøò›Ë»×7wûûEÑ7¤–É0Z#I¸ ŒÈ35‰•ýñ”é$̼…Íê QUÍ*,E¡ãijé‰,R‚HD¶BExž6µª›ƒœpz}u—ñÏ¢Ê"B™”é>ŠÁ€¡œ¥dƈabRdRI` nÁáæ”YJR%ÎÈHî+¬ED—¢¬ÖÇÑš"!"Š N!$«pP±ŒéÁXŽŽi9 9Šä‚n Ló4ÍóôúrÏ'›Ÿ'å4ÏÉêÞ´Ùmnoïæi:Ù¾†šž Ø0ÈÒ äÆ4¨¡ &öÈÖq”1¸tI 0"z¤¨D®Ë:Òt‰„)E@P A`(‚³ˆ¦eù¸º¿­NÂ"‘D#T3Bãf‚ˆƒXºİDUÎ(ŒäÁt bŽ€$œÌ…)œä„AzÌRkFJa K­K[DÀ½Ë’'°EwsBXFèPÑ´t†8‰4âŸááªe´ùÝ‚ˆ2’˜±ddpŽO 4Ä%V 1K.B 4O¤¨®­!\"Å­µ°qÁ(XQ’8‰Îv›»ýÌu*)zÿ?þÃóåXÏpØ÷ËûËí“ÝŃֆãõ•§¼¾º´2õ›Wèý>Øö¶^ïo¢–'çiáíÙþ˜××£½M“ßßmÜó§ßÿþ§rӎѦÝ${ï±§¯¿¹ý½ßûu›Ð;ùþðö[÷k^]_¿x¹ÿþ§ïo?zëê'OŸýâÙÔóìè¯>ú°þ×ÿI~ü._íié7ZUͬÔS>™ Èi‘“i½ƒÙƒŠÀØÇ%Pï&¢µV(Zûr(¥tO€"cHò‰HU³yªêº¶ñ€·Ö2s¤aHDùáp(s”ç6`,Ãî0ƒHÙlfÊQõ»åóÈH䈈»øÌT÷,µ†»Ycê=29"2{ï¢:OóíõÕ±Ÿ©Ÿ«WÚVšE’’k™ø4:­s©•t´>"õày)a½·¶, éæ7„ݱw#Òqé ;Á@#00ÔÄÄ夶…19CˆQˆ…˜K1k+E%{:!SEáz32-;«Q†%eJ GB8éÍ@<3U¢ ä„ §¤HgfzdHkC;XˆÔ¹­D©¥öGN¢v\" 7C¤ ¼wvœ†#]r¤Ëa$`K8IQˆhkk­¥­^æz’Óå,aíÇ$*Ì"ÊÌΩÉ`"ê­! qŠŽQ^Ži#11 CØJ2šˆÔÍ“‚inécó ·ÒÊU£SîT"c3ÍÃ|N‚ˆHfM»Äô·t@(ÖL7euâN#\AFb~„¨¦…¥NtC&óSžè»%œN k€…Ad·fJ €2œ‚¤ˆžhÖ·Ó¶¹A4U§0=©ˆs­U„‡úyµ>Ò´(EÙÝ"Z'Þm÷{û‡¿\ßo?|g¸¹~q]ëüîo}²Û¼{õìþ'O_nмµ}ëªÝ]”:©’å{OÞ–ùQ#Áq»ß{÷Oï¯vðÖ_|ùÍåqÝÌ›ªøÁGOÊç"×@¾º™—þöŸzøÃn^_mÀxÎk¬ö¯þúýÿùÓö£oýÙÝÍ7w·w·O´DËõoþýÏþm˜ùëkÝl—°c÷È,SYŽÇŒü鉛ÍIn}¬="“ÂÊ`VY–Ã03—eÚm1Nq·eñ³g½÷©Lk_ÇRAÑ£»•2J~mmûáAËQED¶v³ f!4î^JñðÍ4%Òl,øID0Q3Bm6›ÈÌU¼%âÖ@)lš&ëýp·O¤ˆ¸GkMU†vaìu‡QßßìÉFÄÛØl‰H­U™ë:0ÔÂó<ï$y$"=:×öð`.€.Ëa*e齯kÕÓ™^k`ÖUu˜¾h¸Ãs´qÛ~]„}mÿ?À(o@&¢2jÛï~©2%Ÿmvål®SÉ¢>Ïó²»8²Ý^˜ÇË»ÃÑî˜Öú“mì²?,ö¨2¢MZŠä¶T+Âë4³h­“¨xº÷.§ÑÊIÃ1¬5§äá$-1x’Ãî3B!F 4@änIrRâì]–¡SgFS D0DªÌHÂBÉ™H¤7„G™ 32¹[²8T:˜’NLp¦¡ÚÁÐÎ$’IRXx Th Sˆ)‘, ±qæyNûeàCa1f±¹AÀ ëV懫Š{¸»[ƒn8z ¬"½ûÐÙiRQi­ÍóÞй¬+Ed)ÊÝ ±X¬C£ *÷p±8i¨iÌà1vžœéZʰцÚz§ $rœøµ²›˜$A¹ô&\=\˜iHѱèÒÿÍNcöJ2ìeš"Ì}dç“7+ZèáANŒ æS¹‡eNÈ$BÌ£j"(˜$ =†;d f’hÌ‹“9r<©œD$@àD#+EÇ@ÎÂÂIA‘£p/Ìcå›l¤pÀ‹Î ±T€»¥%3Xtä9³¨Ö¢)žLÓã‹å›g—÷ï½wQh¾P•W_ßô¶<ùä{’Ó´Ûò[Óý²NÓ£‡»Ù”èîÑÃíõÝåãÇËã'Óz|Úõ7Ì/_ßôõÜø¸,Eøƒ÷ßÝmæ‡oíÛáöÕµí×·ë§o=x%Ó¿ù½§_?ùòêA™Þ{ü°^¬Ï~úõçŸ?ÓÇuÿêîáÃóOeó|âüoþSüÆ÷æµÛþÊÞûÚMUU0|}]ù4œÏaÜ5³äîL¤Z-L™×n½÷Z·»¸ò]¥E$'%¹ûÚWU=öµÖ<@ÚÖÆÌ°¼®ƒñK»Ýn¤;ŒÓ¿”b>(›`fÏLi*ãŸ~üøÑrXF9˜Ì:ôDÙû(Â%™dÄð? l…*!©›1P”J™N)ß)|Ó±ÑPG¼9úCII¢"àŠÎ¬”‹°Žtœâé0 Äj2|k9‚zZä 1g¦ «§½ŠX{0ó(P"ƒù„-ÐÌÓ “LÄÿÂáƒßî:®±áè‹ ‚0!BXk=©‚ƒi<a(Zb$ig*¤‹ïvLeý£ßþwÿ@—•ßþ(§†<ØGú{Þÿx½y8|ùùS9?º?ìúÓ¿wuu½7±Î÷W¯%ÌT÷×—ï½j.¶Ñ NªÓüÞÛoMg55–ç—7_~}ÛÚ?ý°bÇ÷/._^íãßý^^öòp{óǯþG_øÃG?zk¾¿¹¿ùwþrþ^/Îüò¶^œV ¦H/(æVŠHQ:a)Ü(K˜³jÐPªQ[[-:ª®zvÞÛ:êô1ˆ‹ˆˆ㔑Ó0>ãkÆÄ#JbæañÞ³ÖZй/Ë2–½î¾ÛíÖu8 á¼óîîMµ*kHX¤Vi‡ÎL¬â‰u¿l¶Ûãºf¦ªBˆRÌ{fJïÖ{D„ƒÓ ªR(sª“{‘Í<_]^•y®쮽÷yžÇhžçû»»Rëñx$¢êÍð´Ì ófÊt$A†=œšEUѲtúLñÌNÎβ,G8š °÷rZ½ø0~]\<¸½½•±RþW9ý“(Ýr=,—/¯ž__]^]Þ¼|ýâå‹Ë—Ïž>öíåóo×÷´Þsö »YÎ…j‹¾Æû3}ôxÚ•òðÁÃÍn·Ûí¤T÷ Êèaa‚U”˜líY#¼‹2KAeÎÈaÍLpI E7fÎÄHíõŒX³ncA(Ï,`Ϭ…Ó(­wb$CFÁâohÉN Ì@ÂáN%Fí½"3•9Dë!Í,‰OC9!b[Jâb9µ*Ì O ÁÈAâEž\Eˆh˜gGÙB#>‰"û{1jk‡*œº5@,l„k…¹÷Ž Ø”¶,Uµ{gVbC‘’Ô©P‹HŠˆ¨Âƒ£"Es "À¹Ö$òÁQ9¥PäŠù ¤ ãÄ,´¥‹É2FnD´.«ja IPµš[&÷D H©šªfP­ÎÄDÀñpÄP2œ¸zÒÝ@º B˜©à}‰¤H•Ï 4´Öf-,áÞÓ)2_^D¼ÁúÂb¤T°q=Ý%'—3(‡ÕF2oVGcáÌa §ST…G2“5AP1‚”@$T´¶eÉn&TÊÚÖyžLH"¤S–íµ>ÿþñõ?ùŸDå½?zqy7_}¶RÑiûäúÅõü‹ÏöìËk%ì¿ö½ܼ¸ì÷‡ý‹«£.J|û|¿-Ó£›»Ë¶S“#rS7´ËG|8í¦×W¯âöæòë—Lüä'íáÙ$§×7/>{¾yr×­?ûÅóõúðàÉY{~_^]íÿµßyýÿõò;?”÷÷îvw/Âf­”RT§iÞïï7›M‚TËáp†qT±ÀÝ!"oHÞãƒ'¢Ñ[æ •ZͬN5¼uÙ˜ËÑwǺYsÏÞûn·=I*E†¿zô¦iZ–e\'¢§®u¤J˜åð²ð²?”ydþ„H)#\Ú݉ɺ1DxÐcÜlim­‡™¢ìnÌ´,==–㑈vÛí(툨Ö:öؽwÊìfÓ›L§ Ì”R¢[-sfð òV3}Ý›ð¢um¾ÙíÜœé!¥‘¶,é>Ouž§››æ¹Ü/ë¼ÙŒËµ¨$2‹ªY0ëiDN4ädÙ×ZkõôÖÓòÝXçÿïèûûåõ7¯¾úò«¯¾}ñúîÅóß|õÅ˯É÷wÍ®¨5²s’Δ¼>|p±{p¶ÝlÌ-ºÂ<¯îV!ó @tXŠ<Ã=‰\XJÏ!+1|l{ BÄf!ÊL·g.€ÆÔüDÕ3‘°°Ûp@d¸‰(™ ¸Y'‚#àQJó¸?ÌlØn ˆ™1ìˆÌ,¢#oí”ëB”½›˜Gkã6ÎáÁs±ƒD˜yã”\¦L#ãGÙÌs$T«Ú€B$ skNY§'÷c‚r³ `À¼b_V0ûP¨0"¢[f'ž Ej’g¦h’A©s7Ê9Ò™ÉÎéc3O.f}&kÃñÈ@)¥› ׈Dç±æ¢JÂÃi´Øn¤*«µ¤„ƒÃòM€ñªHƕ˙­å­Ê°ŒÓ„8ÇÝz§D)„a@¡Îu]V&8z)jÄHH%7”*£ŸR-æNvj)¦ÝüâûûŸùðÉ[™ß¾xÑ®ns·-us4ÚßÛWŸ=ýüÙW÷{«}óx¦Oßy'™¯oï}SôbûñNÚaŲĽâðìrÂe®–9m•÷øæË¯fÕ=¸Ø=}}SË̺V¼ÿÉ;on—«ÛÍo~|}}ÿ`[ôj±ßþµÝßúwíÃ÷Õ-Ë\êMo›ÍfD~¸;©ZÚº^œŸ­­3μK9é'›BL &báx£ZéƒÖ'oVŒ¬â§¸¤øÆÌ»Ýn];|Rc°3ú ¦©ª™eæñxÜn·ã¶ð7bµZËЧ†Y­ó.-Ë2¦ŽëºÖZ‡Þr@K‡_w€J­4¦fî>of>5+“[cÑ"RÈáN„¤¹ÖÃñxÚbÒ)¼h(A‚t¼c=ë™›M½¿ßG·ã²ÌÛÍhk’7k[€¸‘ÍfK£×xÑqÛ…A«Üß..æ!7úníLDÖ­µ¦(uš¬5÷_aóv8¾xöò‹_üìg_üäg_~ùÅw7¯÷WÏìîŽw%C f°23´Ôòä½·Ï.v´Ã±õnæîÆ ‚Ae8œèÄ #ØÑž8eÝa*EÁË…ÅmPßSÀ*èæŒÑE)º®=2•N$<= tò€3ĸ6pÚ©˜¡T&Þ˜O[V9y7‚ã—Ás£Ì@u#ô~lÓ<"{9ˆI!EÁrš Bµ*Ó¸™^sàå@È(µz1‡™N•"´²™gp:¹yT)£–EàD(ûHKïI•™Üˆ(L©r¶ÊdK³µNs&(oFTªÜ»'Â-¹Noj±lëq<C;;l#DT¦ ”ÄDI¶'–Á77ë²ß/Ôi©^ADƒ‚²LÑ2ì6£ònŽXu! l01i RËq¡ÈÓÊ)áOWBfzë(ˆ\À1¡ ‘äfÙ™j˜™§dX·2AÀýMÝ—Ì”BBĬL [Ž=’GÊ8¨DÏ1d®f"NOåB7#w ï9†· Hd2‹ˆ´–‰Ô"ZʺQ Ó4e¦ÖŠ©ÜóâÿúoÿþG?ødi}¿-¼û¤¼ýÎþ›Ë›}_ú‘®—ëÅž`óàÉ;kÛìvðìYï¾E~0ÕOž¼½ì¹ß^½–ökß?ÞÜ/Ý:âbScÃVm·?œ¿ÿäÉ{ï^œ]\—û×WKåzV¶gÓæÑî?üþ³/Ÿ~ùOùúeÿK¿³ý¯þsù½ß̈¼¿Ùánn¨”uíU%»È47O- &BFÔ:õp€ŠH˜©ÈfÞȆâX«4Nð“=qÔXIôfÚ™#ãa¤¿h­©–7IpÒZ#ˆ„Ê"7··›Í¦”Ú{;»Ýv]—ÁŽeÆ=žP²ÌE¥õþ/ƒyGëp_Jñ“ÝjÜL™™y]×uY„a=AŽ­«‚Au³ÈT.Ër˜¦ F°ù›À¸ái8ƒ3â¯Ad­ `½óÙn+s$1sº{gf&Z­OTKÇe™D‡SGkm­de†DZk§ÕL ZÀHßï÷ÛÍ|q~~<¬¢B™¥üIapËÕ‹W?ÿñÏ~ò‹?úñ/òÓ_¾øæóãÕS¶û’ûäFÏ@6ÓôèÑ£³‹‹ä´½Z'7¯Sf7‹$"73PÞYxè,à]2 'ç?ËÀ¹)“íþÐrˆ%22™ŒÍ4gø=-¤ ÖB„ÌÓ\ÅÍ ËXªp’äîu>%q›%³p­%‰ƒÏ™é=PIá2ef‹NŠ’…›[€'),¢Ên“(ƒ”D æt@ÓÌ3•œ“E’J$Q""´j~gA¦qrE‚"ÎÌî'Álí1 IDAT"Œˆ“JíëšIªÕ#pïÉsæøf(‚K Ç0(ý¿d½Ë¯n[zÞõ¼—1æüÖe_ΩsêWU\vÊvì2F$„8œp`ARD¤Ðtà_ A“-Zˆé"!Å„°ÅØIœØqA9ŠC•«N•«NÕ¹í½Ö÷}sŽñ^h¼smƒXÝÚëö­ùñ^žç÷ÔÎ]¤©†ÕU÷mcíªÊJ‘˜sÖ{ÀÝ—ÖD|,/܃Á ZeÉÔ’…–&îkgQí==˜¸´4ovµÅGP•Öà{DH3·9YšB­èFœR†&€k3æädQVi™¡ÚŸztbÎ1‰Û¢“!ˆ¢8x’†Ù¶_3cÖð7$$œ* •’£ADͳ7ÍL¡ÚV r{bF"ÜC%Tû!ƒhk¥Æ@±H&–é!¬³$†™î嬋ªU#Â-òõW^]Îï9øðÉ’ò…¯üÑGq»Œ>~ýÉãëÞOû~yÖÖY·ñðýÍ>›óãO/oµìŸf{ÛÎç—Öûõò¸FXÎ}_–w?wzëùåÕã;Á¯ïŸE_ßz÷Ýíáò²/ÿ÷0%úŸÿéÎ7¯/oßÞ~û;ß;ÝýÅûá~ŽÖSl» $„y¸Õc@GÔÏS(.Ѳ,QW7_––3jQ™6vÕˆˆ`U™iª2g¾ 3)Y¬ê¸¬ºÁÌç­ÕÔÕšÔ)#,Ýq`¶#ܘUÄÇñ$ñ ªçóYU™ÕÝçtDôeÙ÷]TUdß÷ÃTÌ| ŸJ a®­=<>ªˆj3›Eú`{xX×#„›ÛlMify,†*Ï9™{p PæmNê½ð»;WýZ¢mJ£zn"ÑZÛ÷ýæfeaxÊ*3ˆDµö*‚@JÑÃ…D#r]—i¶4vOnO§mßîîß»ÄÊéÿ¿ÐåûüãßúÍø›_ÿÿóëßýÖ7~ðAËKóÂ~RÜÈúòÅóÛÛg§Û{^Z½< Ú˜9Lh7#\L$£qÖß=)'‡@„"BX@´¶+Œ1ˆÓ•(Zkå%b"&p 1ói]X@Ûn”&L¬Ê¬µ‰aN„ *(œÂR”ˆ¤KÏ`iìÈtnÒŒÀ"c¹‹zF­Pv7iÚH!,HNŸ´m+[ø>vf­¬Ñ p‘ÖdQ¡DŽÃÌ…%Ó@ a²p€¦¥©E†…ª³u»Ÿ\pLb隉9/{8Ü‘‰¦æî™µìH¦HO„B•™I7U (kè†Ö’8¹¸fyZï[o\‡,æ#Ýq:Uד8Ó23˜H!DŠ Îj_ªÊô9EÖÆrº»û"Ó&{LƒM)ˆ[”9ÜÝ&%*æ-2¸)¥sÌØÃöiDTîJJˆÈt‹ˆ°ÈpÒfs‚„…““DPBáJ­fº;œ=ˆ+.•#ºB¨‰x&'Q$bÇœÃm‘fF¸Íu=„„HUDƾ-KUn’˜EµE#<<-’`½yvÿÍ¿ú7ò³ëéå VÝwöýúÁ÷~€U_}øúÓ×Ö•nÅœ½ß|ïÕuM¾QýÒéîÕx}·¶~øÝýÙ³;^#âÛŸ|Êa’ó½çw§Þ#pŽí¦ëÇ—Wøl|ô÷Éìf½ùé÷ÞûÝïÿýÅzûáwÿ໯.ãç~ªÿùƒ~òGé£OèrÞ¯×ÛÛÛôs¶Ö˜èöæfº/ªó°/MfbU!P<œsDWæ¶lÛµ®ü}ßonoSö}pPrQÏ7ç>žlù]dx¨ÿ™kZr>ŸE¸‚³DêÝá$ôððpww7çôtV•Õ‰ofÕ„¶¦D<ö}Û¯5Ü+õe6Õ92-¢©ëºîûd&i­Y}ÁÖ„i\·vw+ªUAf¦HchÄ`fPÕ}ßzocm ™q½ªêíí­›U[¯*f."ÛõܱDÒ²,cŸË݈¤ó6®·§›ºŸ„eÚ”’!e23"µs&u•$ìû .éë¾Ã“Iz[¦ûõr!&@äœÿ_èöƒ?øÚßý»ÿÛ¯þßþ‡¿ùé‡ß”ù¸Ä¼•y’xùâÙ‹çÏïnïR%R‚)=X¤kga#$%¹'À¼¶5»»›?^ÁÅa®¨îAÙ¤‘’ k·7Z×È$J‰p@ÔUJJ^úé>"2BY‰*àÐÝѳThN‘˜k Œ¨Ÿ0HȲ¢##²¢¢’¥*kðL‹ ¨Ýn ³LizÒý£Ié*ÚUˆ¡IàÞµIo²4¶Èœ!Ä\‹O€šPë$™,|Ñ- Ìž–¤Ò˜3sîII "OñUÒ- ™ÊÄ¢Ã딄ƒ”A§TÀI4¶$À)ÒÄ¿´Ê¾VéÃ@¤H7•Žô9ÜÃŽž”(݃äLDLBB,÷P+‘  ‹«®eŒê’‘¨iÓ®ªZuÃLš—ÍžR>ˆ(Øj;B]›…E€Ò'§”"”\W¤“€ˆ¥Å4÷d€"Ðä8Ø3II&ƒ‘D}Õ¹OÕÞZžÔŠn”TÍT×Ô$Q’%iù4ŠÞdªG0‰ å–²hÄ6ö¤’J¡ MKïPv‹Ì‰@?µ±EÝâªMÐÞ¹ñ7þöoŸ¿þåî~õ‘Èzÿ2éáÕGŸ]æ<¿>kbiíÕëÝ¥ùu ȶïÏ–… ï5i–Ÿ“õyoÙr—ýN—/¾|y>ooݽõï0¦ïûÑ5äÕÃ+:Ééî~ß¶/½÷žìù{~ÿ¶ž¿õý~çŸÒË[ü¥§}õ'5¿–Í2),ºêÃõRƒA¢0·Monæ¾+³©Êœ‘§Ó qÄ(­Ž‘ô²ˆ¿)ð‘¹ö~õkùWÀ)"á)øÇ<æ.ðÕ´„6kÄÌÇÃY½™µ.sÛÔ$­® eñ°â©*À½kD&"çó¥-Kë}ŒQóÕ¶,œiëétêE˜y ë"lYÖ1¬L|™)Àºörö¢ÈtÌ¢*"û¾e¦ˆX¢Ú\÷?´chk`¶9Ýýñ|>ÝÞÎ9onnDÔ#ÖÓítÑuåWí œ9>ŽW`‘9Fžö ‘P¸©¶ ÛÖ{§¤¤p÷*Äç¨Ú÷ÍÍWßùÆ×~ã7ÿÚ_ÿ•ßúû¿~ùä;ÏV¡ÑÓn”ßÿ½ç/_Œa33 DÂtˆâ ÷±;!–s·’P–S§x©¤ÌÌV»Qf®Ü$:(YYÎΈd¦b¨÷¶‚€ ¥­¯·GB˜‡³pÌdÖÖ›猃† (é¢dE™S ­‰4w³¤k ü{™iHŠ`dù°<,?ª% 7/šç4$gc%ÔJÊ ¬u ºMŠ”¦°hm9F…3(ëºl—kr‰ë)æó²]ëüO›åñÇ’´ Hk„ô9Á$ÔQÕ11ƒ¢•3VAꇕ X¸‚jwaî "OŽH7 K­L•#óˆXäf9]·!MÜ'¤†rìá´¦ÓüˆÑÊr‰eã T&‰H¥0ãr=óÎ"â””K[nO§í|6³Lx˜Í©$*âaé ¸¶E”Äâ¨á¬# z2÷½XÒÛØ˜DØ#¹19³(FµgëËzŠ™Ëi%¢#Õ@€9ó´ž¶}kªŽÏ 0Qo}ÆÎ$á)íÛÒ—1çÝÝÝåzm½ã¤E²Œ¦= K€b@^Iœ`rw0™£- **dÕëãõÿ+ígÿè¿ÿÅ÷>úG¿ýðþþÖͳ››gç~ÿúƒONÊ 4¦ °(bðë´Óæ§õS·×“âú¼õÔ|ÿ­ç¹ùGŸFÊ‹wÞúòûïüð‘³ÙíÒïÏzî ?ò•ŸüÉO?ûì£ü»v½>\^‘ø¿þ'Ö_ú—úó|¹Æ´P)BïÝg¡fåD¨ÃúX"ÍU¸òŒ‘ÄOxmafŒ9K“OðÎëõêe£k­9bì{À(AYùÞ\ Ø’jz¼ÁågïZ¥tÖüº(ü"YÍÁº®Û¶À,€µ¦sî…­>ãz½ffº“HW–vðv¶-"æ˜*ÒDZksÎumÛv)¸È~¹ôû@DîsŒ•Õ0Ç®*û¾µÖEØÜ³R‡Ë¡VZUc,ªåÎmª­µíz½^¯ª*¢×m‹Ì.+aæ‘ÂQûä9ª65§µ}ßǸ½½`û”…÷9EÅ3{oÙÚœ&M÷Ë sëËÒ{;ÛEµocØœZœ¯O¿ù{çoýƯþêßúGïWÆëž7W¸sÜ®7äKï“ê´°HBx§s§ O ”ˆ¾×IÄÎÈFPâΜ «¶ðâŸ1R…€e8'7i–¡Ú˜ØŸ ©MHe\öe饷×ðFœ)–(q⨊3ÂKsXÿ°Ûì ™A’‹C*eô$fWb;Ø6®*DŽÉ=%(æ”&óõ%Ú¤Ø5!¼ náHsÏpצk›É¢Êdþ& èÐü<>>Š* “e¡Z›ö±o˲Ix¤Bš6£±x½)Œ šðtbÊP… Ñ ·mI8 à„¨RbÚ –9§öÅ#2\(T¡½5ÎÞ;kùôZ„)±¢L®ÉH¤  ûØ3²i#‹²r›fHP›srìAÚ ‘0ŸzŸÓö±Ç6ÜöŒpwV( तeYJ?ë»WCa!” éTgÓ´-—ÇGV¡º&ɉE›™``Yo„EQïÝ”b“Á9Ínnoç‘™Ó\[”ªçz¹¢sÄ\O§üô˜Ç¤…|Væ¬á>Ü‚(áB¶ÖDdŸs=*-rš2’¤K0ýòùß}óÕÃýÇëi9;¾ñ­oí÷/Þ{v7?{¼ ¹K½D¬Ïï^½z~¯óÓ|ÇcPïÄé9pŠÉÒsÛõYo÷ý³/×óûï¿»Ü.r¿¿z5×öŸÓgŸð§ú¹gm]¢‹ŒÇði;ý7ÿ4ÿÅ_’7×ÏñúqíýÑwUÉÌ@,Ër½^‹’]{£Já.¢ŸG¬Ëºïc]OÄäëºÞÓýÃÃ’ÌiÊZïÃC^{$+d„‰Hjök`ÌÌéq„Dº»™·Ö‰2ÂÊ)VŸ^ドDÊ®ÇqPÕLJ‡º•ë*Š x –ɈQlw¢¾m;+³è´É̉f7§›¥/ud×mç‘0+Ï­»qoýáò°¢CZfºÛr°U ˆ'*ê±çX×õr½ÞœNçÇÇ»»»RŠßÞÞ2óù|&0ÌÄÊa–é”àEùr½6i6-)…9"üI¡Ä•ˆ) Þšöfó@©Ï9ƈޗBhŒÁzLÞˆY÷m»~ÿ»óWþö/ÿÏÿëw¾öë¹ýðÝoÝèzëÅÛo¿û–…Ǭß”1›§ùPÑŽ'Q¢r´= Á¢BHO"JÍ9öHJ@u1‹šÍLo"¨9•’¯âñ´‰t#3Çd" ÕmÛ³ÒeE$ƒˆi‘6ÍEJ…FÁÄÄɤL""½ŒVý)ˆE3áÏèKï¬ñ1TL˜¤ªI¥'L G€÷m;?¬ N2mJL£+)‰ RÒœT<&Q‘àHzKáVá5>ÜzëJbæÅ}¢@B…áAI ža6&rãÌÈÉDéŒ °2!‰= ’L`ªèÑ$˜%0™iNoªŠDfZã:®Õ>—䓉+ql̉L˜&%ÜkeB Þ—óù|w—^2»q ѦÔÀì>YT[/ÖBuÓ€G›åEñô2 é‘ÀL€ˆNE¢%yÖ¬‹")™A>÷”ÄLBö¥§›Ù!ësUŒ•Ç>ô0ì@¥U"Ê—ª]=CX—ea6Vfé½ÛœcÚ0³LÉ>‡0eârÝo·Á¢½7‘v¾\µk_›‡/­Ç‘e)0zÔb Ú"‚Ë;ÈXoÖ¾þÿë÷~?o|ÿÃ?þÀÇŸ½âÍ>üá>vYZËœÛ F¯ÏïaÐÛïÜ¿þärw'ò&ºÍ‡—ò9ÃNÉï¿ûâ­1–çý£ÓG_ü‰Ïó7÷á²={¦‹®»o×íºfîc~øS_<ÿù_Ì/½£ÓÛy›¯NÏŸQzÌ9Ü<#‰i—ÞOV:‹ˆt÷9g„_¯×Þ˜3Ã&D$#hª™i6oO§„œÏç:‹‰ÊgW’žœû¬ÌÂ'vWfb1C&2ÍæétcåÉP- J®VÄòêÌÌÌž=Y®Öu%Â~s³P’,˶m­÷òa¹Y3¿»=¹§OeícÌt¼^îŸÝºGu-Ås¶ÖËÙND5Ý•(ªbc^¯[o}ˆ¢~U}õêÕË—/kõaî…ÕÖlÎ~ssè”˺Œm¿½Ó˶k-†» ´51 ”Q¸9¶í2'¬k»Œ«@E5`Ú÷=U­-#ª§QUæ°¥µ-Cþ³¿üÿƒ_ÿû¿ü¿üõ¯ÿ毮Ÿ¼¢ÏôÔÛ{ï½óìåí¾ïfaîžAÊ(¥¼"üiƒC*Kfxd:ÁgQ0™IΤHDÚei84‰`b>’¡*YÌ¢5U&Ž9˜û>ÆÚôP‘Zø´2þ•:¸€Êu‘˜ «Hx‚RZ‹¤JŒMajMI%"¸ÄÈ£¨#“˜Bˆ’Y©ÚQ®uüöx¹œÏ¯_#S¨BL…’è1›$3 |mŸƒ•W•Ts¤-ýz½€‘‘­5s×&DضK&¼ìpñ²½ýî‹ìüüî>Ûòéý˜2ß{ç ¬o=ÐúÚé!ǃ±É—Ý?÷Ö÷þ½?³ÿ[ÿ╲o&îã2ê¡Ý¶mY"‹ÝFÀ¾ïE Á¿nÌÊLié*„$뽃py|”§Ü.U1³eY˜î¡ˆ›…Z%¤ˆ@8<â)V·èä轡Ú*üKUëØ­y”{´§o1ÆÀS„œˆ„»¶FDcL3ïËR#ø1Fk-¹nÛ±þܶb¥5Õ}‹Ì}/Érul…-±ïåzY–>Æ~:Šfº]¯Mª}Œ!ÌLˆWshÿîïïkú:çlÕcEx¦0ïûÞûMÛ6÷z~Ú²¨h¦gP¦«Vuxæ­·ZDd¤*É$æða©i™1çÞ[o½3a߬õînHð·ÿéïýÍ_û¯ýÖoòöñ—îóíÛeYôË?ú…ûg·HføtžA6&ÌnáVÓ7ŠHGÁ+rÂ7‹ÛÅçy‹qår9'±H«?|y»™Y¤ALVùOQ€Ä ° Ó2¶IÈH¸Ow‡GIµ´ ADHÒ‚=…1«Š8BA™§›N)Œb$¥çt3¸|·ÄLYÁTFbx䜃)Øösxnç‡&ÒD¬Rc@Éb~d“ίzÌ,ý«»3’„PRB*Óåü˜ª¬ÂÌi^Ò´9'‚ÁoÂK¼’ˆDÀ=JÚrƒ¥™‰z§˜) ¨P9m;1 8ͱÈÚ{)%„æ9Ý#ÜÓ… ŠÈÞ—È F N w ×ÖJ–s¹\ç­õ­g?¼owï¾xqÿÎL•gÏ¿7ìóµçŒ^__>ÿÞ¿úóü…mÿüK}<ßÌ„;ŽñlÊsL7ß÷mجÒ*2ˆH„ÜÝ}ŠsDДEÛ1^؆YÑ+4á1¦»«òœYŒ*òk4§gf†3=ææ>T{f…-ÊÓ ½²”>À½°¿¥#êãðf&U¾Äœ33ˆ ReÓá撇–L¾ò&ݳL%7ëZmŠ™Mw®¡QD ÛÝ,"ç´š8̧¤5slªÍ݆ÍJ2¨…­ˆÜÝÝÝÞÞVApd­5….5pê•ÌpæfÃ2©lk÷}ìÚµµU{î)ª­÷0#ʹ°¸\…%3ÕºbªÎû¤ ôœ ¨ÄiþÚï|ýüúß{ýþxÊ{]øÑ/©õ–!4”iažæ\e,X˜„¡Î`Ït§™1'EfPøN¶1&¡Ôî•‘J&éÒVÑ Œõ«rž’ÅEX¤â9Ä":mîc/û(ËîõÓSfýW‘–"åöŒÌ Êã$lŒJ_]aea!–Âq'aN‹äHQ¤"L2îDuËyX†ŸÏÎ\;WÊ÷$†S²dÂÜͳn°I)o‘¢63ªo_Ér@!£ËÞÒD2K+NM{&y D˜D:”C‘ iQÝ:üh®]Ž5K8Š3WxQq÷1JÌã¥VPm7·M{ dZ#„2T‰%™“…¹oÛe{tL܈ÄSIáé‘Ó|š{ºs‚*z ÓARYL ñ±_mdÑZiŠTPÏ[fgBá8‰—¶4iÒš,Íf^»2ŠãÕùE 3óHÔTÂæ^ÿGHZS Ã<3é6b:‰Œ1Üf-Õ2c˜]¯7c&&)U’?U ÚÉvfnû~³®k[ "“¹ráhîC˜U•Q”r(‰–µýÚÿô7~ëw¿=€Ç> #ÐÇÌ·íªë²Óõzy}=;Bˆ ¡¤÷BB䟞óõáüüùͳŸx÷î½·öÞ>%Ógý»çí§ý¼Ý=¿¿‰;{ȤÐÞä}IþÒ/Å_þ þǾœ—ëj3bÊôuY¤–( á§~ŠaÑ[ÏDTÛœN$o¤8c€‚10S_Jî’îÎÊÝ#Âf‡”³8hxCEÎ9æØ" Ê9fÌLðiHòY„ 7;º‡*óIRÄ•(pÄÔ̽¢§Í,"Ez5 UÂ[F?™¢EuEø47"ªR·®„:ýKÆs|ºy_{Ò®×kÝ §Ó)3+ëq]ûõz-¡{9êåª)Pý Ì…’ãÖuå§Ði"ªó ¢"B (ãáá!3=œˆD©²ÁÜ*™[Q©“ÊÄ¢ ò°Ô•—È=}zÖ¼=RTøw¿öµoÿþ?ùÑÛÇÏ­K0}îÝ—`šá:¸`&–›ÇV–ˆ‘,¤,DLš¥äˆ”ÏûõM*iAÇvéDD•Ë(‘á0RYL2Ã=¨`C—ôUÞ”¶ëN nšá^ë5&Ь=9…ˆ¶ÞZï)ÇÁB¤ò‘ K# ´‰˜îÌLJÞ(á>ä̹Ÿ“™Al*À¢YXº[®ë*f¬ëÚ¥fr`š‡»isǦ £Ó®A¶@HÀɨ·QØØ+=ÝàÏ‚©4‘¶,MEX–ue¡ÖÚíÍM¡(ÂS”+L‘™ÎEù.J‰Ð@‰Ý)ª,Oy’§¥ Ò{ëæ3Â3)+LÒc¬‘‰LÎÌaæ–…`fYZ$fěمÍQö·Þ´ Žm»*ING:@@z„úÒEhÛ/‰(]—Í™™6]™þ›ÿö¬Õz'íª]dÛs%H˜EØ>øî÷?þáÅ6iíùóçKï7½ùôwß½»l£wYYåÅé‹_ú|ÿü3}¶~v¾¾žž™w÷Ëwþà‡þ»?8ÿΟ~÷Û§¯|^ÿ£_¼þû _ýñ|ýÈÛÈéLœI’俉¬aaüä Ecpí›Õ õs‚i‘eYǘ‡&È "rw&ŠãE«RŒk#Z7`}"ÀªG‚ #9ç¤$÷ðcÅ™žYŠ"¨¶ªÄù€lÌÂãr¹Ô°¥d{o–Á\Idyœ°™ÚZFÔâ8,ªÏ`÷ô<öÞ5T)Œà!¾|ƒ¥K$ÐZÇÝxz•*<’ÙŸô͵Œ­ñÔ¶mo‚¬š‹L3+$ªºGSµ9˜Á„¦­¬v˲ˆ(„9æ|xxÛõÍí2æ€2Æt »öZ îÛ‘Þ[Ä“¨™™sú4‹ &–/={~ùäŸüø=­¢··7/ßzÅÚM/À¾gTÛ€ í­ðm,­‘°’Šöp"QdqSz˜ Ë  RV&%¢l=){[„uL/û®T~+K:)i2Lå”ïw‚Í IDATZCÙÌNk_–æž$Ð#‰{o ÕÚB¸G­Ú |êHi­5I"sc&Ox@ˆ‰Ìyt©Kg”‡uŸ"Št&ž¶}øìÈ“(€ §ƒú©$¤ˆˆ…)„uéKMD¢ª^³&š¾½¹®‚P¢æ§`Å£ÖÏ¿Œ<-˜‰$pÂÜ<Lá¬LEÕ¤ñ¡2ÒV³éDf8‰I ’×ŸÉ !âÞ×&˜ò©RÐZ“7NˆµœÎko$¤*,ZCp"*~E«¢rYHJ¢ŸáÃÌö}wŸáÉÊ3“˜-}îÓÜrðsºosR¦.]¸…èŠ ¦* D…,ÒD²ÊX‚«è6¶ÌÊwÉGfW wQ­Ì’¾,Çn#)3ê-—™`¡ÌÂùE_VdaŒLí]DÜLˆ^¿~-ÂÓ­•6,Á,Oe=™±Þ,6æœ3lªÊ‹·_|ð{ßúýï}ô H ã$ú¬wÚ\š<EæùrQ•ÏÿÈnoÖÛÓš—± »»Y^?nëËÛ›¥½õî?Óx‹?žÓ&Þ~÷íûÂç?ý?~›¿÷êü'¯ÿî/,ÿòW“ çÍÎ×±íU¶&Ól]Ö9M˜2¨¦+ZýÛÒ–:àŠ,FDÅèñññæt3÷}¹¹)ѼÇñÇŠHw3‹u]çug0s)ˆª…ªá~$.2› fá €ëÉ̽·´$BD´Ö·íRߥ˜áQ"†ºWjå[É_ù¤ré­4RDæ,¿•³y€™3œYêÞ¢§‘’¡­­ë›³V½•C—ö93ý¿>ŽAsF\.—ÒªÖ/RDÒ*ÃMòAb·érO÷õt*¥Ó>¬õFÌåS:¿>kSwïKÛ¶D¬‚Ϙ‘±ïãææ&‘EµQiyômæP:¸`ŸS˜A/?×óãw×U—þÅ/½G• D2,ÒžàJìÔÖ¾ˆªˆŠ4HÕ maR0³ÏÑõ°Z Kc„D³°h"—EëØaJ!ÁˆLÀ„¥I#Ñ„÷ea¿^µ‘}0ÇHªD„ˆæ_D´ÕéŸÁ<}€IU ç ifÎ,Ü”ËÉ0sY#<ë02Û·Í3 UḎŸa6-˜kÓ®Ò‘&—:‚TXM¤–vÝ.ÙºFø´‚(Ì[0²èó"EqsÍË V€PUCâ)BÎä1ÌfPˆ0*È^IÁÒšT×<çd¦2Ò¥5aIPÓ¥2Q“ˆ°ðÑçñQËV›Ö{wwæ YÐ:Ó3Y¸!ÈŠQQ¨R²,c`dÄ ŸC¨ò 22ç>š kЗUUoîîTÔîžÓ2¼ÚöHgâÖ5¼ä …6Q¸ñÒûô ³„y︌ýÂB×ëuŒ½·ÆÂ>ÍÌKVÍ«Ô;3 H&!3;­§òªj%Uüäzs;ÇÞzáÓédÓ„ Ó¤sߺ *º¶ÕÆèKƒeô¦3<=kqmq ìãŸý“?÷áoýãW¯W@‰´éíÌ몓xóÜm3xÓåôìþõ«óÛ/ž¯Žíüj ‚ŒÍžß¬/äGÿð_ì“óû/^ÒÇüñ/öþ¹óÏÿ,Ö.ÃÉ"ÌßÌ£H°»7icŒš©VÃS%ÿÑÉHÓe®b%"‰¡Ò+’(áÖú¢*c "‰¦œÓZëÌòððºµEŽôv©©½ Ó¦™yx‰EÍòˆ ±Š Ïa‰ Ô=)õT¸»(g‡éº®™.¢¥/EA ¥w¢,MŽŠ/¢$žQ… yÄÒ»{d©™ÃÝÜ×ecHåh¿Q=á™Á,>æÔeɈ çªD°êœÌìþþþz½öÞݬúr0Ƙ•æ¨"mYÜÌ"U¥üÛBÂJºïû²t3cJaÕ¦bǘÀ"mí&d·Þ(iº(bjëcߟ67²,Kº' _}‘_ÔÁÒßÿ‘wµ/ 惩‘f– Ôò’„U:‹´ÞX”E!ª¤`n}¶dRi¢js×ò 1‘gôuaQi¥D&ðŒ&ÊJáQœ"c"-,åÙE$´­sߦO‹©(óv½†{Épâ F_õ¬¶V‘/V…!˜ZC&“"Ú;"ÿ0{¤Ú´ÖÀ5>›Ó2Cˆ[0í>®—Çëë×àTÑËù*ÄÜ ÒHZfx’ª¨˜šÕÎàJÅJ Âk ì^ìë£Jï½ÚýéæÎ'dd5m\Ö]¤»ÂÂDéÃÃÓëÆ b¦¦Lˆ"¢‚ ­1ñ›ã1Íh Ïð,îjÖ* xRJk8¬‚)B"l> È ÞÛ£f)`9ˆžÌRZøj/IˆÈ=ˆXHËÇÆZ!h w%‰È Wfb9­Kî^sM3|nC”ḐӉAîUàp“¦¢,œÒZF  g•k½ÒÂÄà±m‘9­š jMË3Qk묥¦peY"ÀLMÕ‘½uªPI¾ET¸$ç~:­fS@cîËÒ.çkSY–uŽ!ÊÈ ¦t²˜Hh9XÀn®*n¾¬íg~þ«Û½úð#fz¹è¾g¦ÌäšÏO}ci‹¹ícÚŒ´Ñ‚}··Ÿ?÷=ƒÒ‘ïÿØ;½/ßûæÇ?û•÷n¯fúÌög>ú…æ“î§i]üõãBds,KÞŽ`æ¢Þ™ƒØÌ´ ‡˜2RºL3UUm |BæEkh³âërs,Ë2ç(ÊBéš €¨F7û~­`t³‘9-¢ÜþI”•Õ½/”t$dÕžPJ°bˆ¢¹ÖUï‡W7Ó+­®Æ/áGÕRÿÌt¯±ûÍèîÚÚØ÷¢¹Õ…T,£Þ±)‘h‹0-=dµîNÌÂz¹^zïõ(®Ë²±.ËœóÍ;îz½žN'æJ<–9gÕ×yXgkýpØ©ÖõTk‰óù|{{›îv³ÞÌ9æÜ딡‰T‚ÓØ7f"›3‰z_ÌMDYärÝj&¥HÑÑ%”Òš¶mˆ°üÉwôŽx¹¹yçóŸ«‹½b©†¥#µÑú¢ÐŠ ª;’ÖTE;Dû²Öˆ“uá¹M–ÂèPÄLªD:t“¬Ò@†Rʳd"¢VÞ¨EmÓÏ\o–±ïsÌuYªdÞ/—±ï‡†´)3ƒŠH]ÑsNìMH™ÂGRyd´¾ ó0ª¢»Tçuг§ä9çÆD‘Q§êåò`ÓbÆ,áÎÚˆ…U“I¤ ‹ö¦"%ËÔ’« —`À"¼»½qG±Ñ à#—Ük¨K¦ò.²ôÖ•X˜¤~Ú$HÂÝA4mËð€“§È¬Ä`%Õ×u ¦J),Ä„%ËÚk—Pb[#?¼ÌÌJޤFbUq3Qè›Þ¶Â ܽ¦‚•ÍÂ"‰…„›â˜ÿVjè莙;wQáÞ r÷ìöþÅóa¶í×LJ³¨„[¦i"2ÍŠ¾Sï$ƒITš‚È}Q˜“ОÚ4£Ìñ»™­K'¦pß®{ë*ç Ru±„§¨& –ª*RÄÀËÒUû>ÆÒz†REêt:`ÓÆ ö°Þ ‰ Ô—ÅÞ‚ØÍ‰RUPáËùr÷âù—~î+?øÖw?üðöLµ‰¦,r1îîî¯Û&Ôðx¹äu[@¶äöüþd¯7ó9¾õ‰„òŸøêë?ó‹þgÿÔå®ìçØe.KÛwk­ïûÖ{÷ðŒ"gT¸Yo¶}sïZg´²€*Ðq}YJ|É,H¨4ëËÉÜÂ|=†Í<¦‡•"å"RpnU%¾ì9{oû¾ýá`:±, K¸›GÀˆy0Õ‹òØ „h±¼cß÷²ô—Ä@AmkD^ûzêè)þˆ‡¸ÏÂ2I“™Â2Í(•gÕòé΄ÂùmÛÖ{QŠpe|ΙqÌ.*ËŸ|\½uøšYÙ¸z/!éMMYÓ½5í}Ù·UU¨$Í9Ìc]J²¹‹¶ÃláNtÄš”ÌÀÆ‘±ï&r(¦"ÂÜ•µ&E@Îi„ÐÖx!JâwßÿœEÂÃ==lFž™@É6˜‰¸‹.ýPò0÷ÞZ[ `anâ‘Ì=-·Ër·vUÖÌÒÆSíCáDÌ Ì(=8—Bz˜™»18ŸsΊ‚K$)CÄ2Ì=,àI O$Ø%»!Pm¨Âƒ „‡[Døî>ÓHú°QPîû0`·1lŽ1ÌcD̈éÃÉ0â~ûã¾1Çå”$mÚ€ëœaà•–˜ž"@@ ‚BÌÂTàÙá ‘ÖÛÌÄ)­G±&I“25S i–âRôÍ@†¹ùΆ¸¸ …s%ñJí¤ F ùi1HfsHsÖVöé ©HÀÁÉ ¦#¼JØ÷=3µËL„S Kk"D$I’DåúTbEZÔI%Ã,ÍnA<­KïH:¿~€{&z×fÐî¾ï×9w‹à¦DB* ¶fb¢ÞZm Ú:WED™$,5ócnÛFTí,Ì‚•¥‹…Ë“KD„Ù#‰hY޳cYºÍ°¦,Ê}Ñ¥µ @f p Óu»„;³Œ±‰êÒ•Rðm!a”°½Ü!É1æLÏíñÜOËŸûOÿƒ¯üÌ6»]˜Æ&×q~¼H¥Ú¢…mŒä¾ißb>æ~õWÛg†Ç×÷/ÏÿÊŸnÿÅòÁÿê¸Yâá5æëÉ\—…ˆ"éû>2="îO·6F)yÆ> †µQQÏ×ó™X¶mO„§×üzß÷ÖÚ¶ouV`£µå|~$"Ï´9mZÌ=QÚUB²ÀÁ"y03*Z…y=?tàÒ¦I„ÒK9ª:ö="Ƙµæ=v¼%û4@UyÌîjÖ¡Š(½c¥Ù•w!ë^´XpeÎ?DAžYöõ1FADôñü˜å RP©ñ Ôî7Ì«›d‘iV2§ZK”ž§ŠžxÊ< ·¢’¼W|1•›—É|2¸õV•S}ŠjkÚ(+N…ês«~µ%`>÷¹_çóÒ×§)ÊwÈvŒš»oûò/|~mß{ÿÝ1f2Ìjï xÀ£hÌ5rÊL*˜Z¯É HID©9XHŒœ—þú“)‰`B0„¥ñÿÃÔÛíH–%Ùyk™ÙÞÇ=2«ª§9‡¤† (J" P? ô ¼Ð  УJ7‚BEJ¤8=äLwWe„Ÿ³·ýèÂNä0¯ …D†Çq÷½íg­oY@ó¦éÙMªâ^3¢Ñɤ»ÀŸþYÍžÏG'§ù¹²R†EÅÈ&µ:• ³a¢IITEªMšv¬¯ªR*KŒÝk×Ñn«Ìª:ÆL8 Púë=>v¦Š3…Œ«°å›³ÕaC”)ˆ¤Ú÷™‚¬úLê)©ªjîL$TE@ê4QôfÍ”dí~3Ro¤I•GEÙ· –¨¡IÏŽºU•1Ÿ‰ ¤È QH‚Cû&Æ1Õ^ ©(ïù,I¦“„ûÖ£[¹åÛП€6—½ " ×¥ˆ¶ç³ãuÇ÷×,+s/ßÛ÷ÇsSÌPY纶»ª|y{+TEE¶¼ïþUÚå(Ùëô6µ¿¹¹?'WÖø8l­Ýå™G”gÝ1TS‚ª†’b aŸìhxéò¿­ItyÌí»P¨s¸oíj¦JMÝ÷ëýµ}5FÕÚáq-h6{Eo2ÕtwŽ.V%מÇ?ø¯ÿÑ/ÿö7¿ýÍ_¾›·÷D¡êZn°QšØžW…+ðüáWú§¢ÿí?úò?ÿ?ý/ÿþ§sŽ×o7Zõ'"2æ<ÏóS±f&jYpÎã:ÏDÎydÝgSDذ–'Œ1Ö^]䢥нãC— c¨Šv-_÷Þ-ÕN$¥M9é·Ñ}và¾÷˜#" oõo¨*Èë¼î±¢°‡3{oQí⣗À¿ÿýÏÇqŸpU鋪;Ô¾$ô3É'|‹0~×U6çÞ» ­ÀéᘒmÓíÞLæÀ÷žs¾^¯öXE„¨ðŽmÐÝÜaýáMß1­^ÍÌçÛ[[¹Ñ2§ÈHV´ð]x'c+¹÷~>Ž÷‹t~<2ÂŽ£›SõQ{Ì£ûðV"}ýá|þèžwÍ9úºsš0ßÞÞ×ÞÙ;ú/ß÷#âííÍó?ŠÃƘ&lœ§»7µ¿2¡º× ).Ù·T?EÌ=ÆgÚk~Æ4¯t­ÕMjs2³½P=\Úá€Çq]×ÇÇÇ—/_<2pï6ÎócB´½ë=ÔïÄž9šÊµn¤ŒasÎú¼×ZRøùçŸã‘½ã ˜ Þ¾>QÈH¯ÈpBÕôôHg§t´E#ß”¯ž¡%¢ºÏ—α։¡È @‰DµF?<0±È#c#ò–˜1¤‰Éèö¨Ìð’Gî7 †tLkzÊÔ¬45é:•Ÿ(’•RÎF°8lP«íJÉÀ4ÝÑ@Ôp÷¶ŠXî¢r†qä¾ÌÌMÏ÷%[æ1ˆÂL"«‡M ƒÂ½•ˆÉÈŠÞ¸¯ mL‚r­5ç\;UqÈXkí•yK`…ÒÂ8ßÛ“ŸÂöúîŒT!t@2+ƒ%]ÿ©T‘¥$=#.v#ôxYw+ƒªÙt_= íùi†SØ‘Ù|»p‘`nß= ”ÎæéÅ„·²)[ÇÕk®$áA•pc¼¶÷r$²^çk-OWÊןþÀÝC ÃåÚ.ý‰ÉBUÒT*m"éL‘ ‡Ê×ú[”Ù“œÎ¶ëö¥$Ç{ïyî©zå¢5õìeé]A’¼ûÂpÆÏðÞ^€$ Ÿ‰Ä"ŠOuÍZË#Ž1EÍÃQÈÌkï~‘ý÷ïmS³’öê¦13{-ón»~çq‰÷-ŒaføqŒV‡·LV*áÝ’xd9U•%¤€™Á¬ …¦óyLÖh¦§ï½övæ.ìB¤G¬ë:ßw,׺Ém­Ò¯Ö ªŠÊíð•ËÓ½¼ª¨6j.«Š±=³TYfùÞ¯Êð½¹›^»|eÖu¨vIiİ‚TK}+‘ž«Q¾#°÷Ú{e¬ˆµ®oçõÍ}ï½¶{n<"…QåÏ´ç,©³“ڴм>P Ñ"ÞN¥½½ýÖU‰(MƒØ{ûÞì¼¹9Ý}÷µ%Fê ij`E¤¶ËõS{5Rî^B”ÏçC”mÐt÷*s­½|»_H(Y’id²<Ü»ÙRÕ1†¨v—XY7Û‘ØŽØè£f³‡y™Ø]þUURUêE|º81(Ze„ÿò7ÿn{ØÈJ‚¦St@äùüòÓ¯þàycNØŒ,Ú4R4ŠÐI*‹Ä4» ±&æŠøZ¹£"DLºQf@†P“*ØCUf¿_ËDû¦!Ðg¹kpΙ^@ÝckQAôª÷„]#w×0TPL¯ê=™êPÕÖ@¥¼¼îš”Ÿi'¸QkÈÌ9Í=ÉôT޽b9ëu"+¶³#ˆ©Uas<Ç9®k‹ŠÙtoÔèúTˆŸù%3ût›Ó™`#jú8‹;K]š„ŒO©|T‘|>kŘL6ߤçÚ™í5‹¬µ|Î%BÚœ@õù{<ž IÂ3mŒ¸¡ÊÖqB¾^¯–îˆbõýJ* Bé}~Ͼ×Z×y’™éªt_üÜröñõ½S¹×zÓÖ2b­Õ¾[ÉV|ÝÇzf®¤Œqß”-Üz‹¾v;ú]«Þ-mî ÂçóÙ@º1&•(¼ÿòþyµ°ŸÆ-R]}'™U–Pæ4Qõy­rûÞ{óþÇ%Â÷v ÓD⺮ÊòL›†¢M#2Ý[k$fk]Ú“j•óºÖò¨8Ï—ˆ(oOgçš­µô¿ÿã©À×¾^×ÙÙ„îBE+³œuK¼)*Ÿ‚,¡ ªr§§¯k’ÙéÃ(¼Q¡…Ä!¼÷†uíBµj ¥ZQÕÇ^G¨&„W…ïÝrG–û®ò¬Š\¦ªc E„& ‚Òg.˜EÀ=²2bW!Ý}_½ÙÎÂÊ1ë -Ë—ï†Ä½¿¾ýö/ÿýÓÆÛÏ¡V¹Õ´·ãjzŒ9)ÒªH‰R†Ž]A¦ /_ïÝ#ÙÛÕÑcŒçã¹Öªí¨ì¡X&:æx'ø]ú†í;3M yK,D>3g:ðÈŒÐÆ`³TõNÙ& e‡&Tg²ÞÍrƒ9šHÅF«÷¦¢ªÏ8ùTõ„`wîÖߺ¼c´ç¶@|:·bûÞ~Ó¸¬»QÕÇã€)ÇUy{ˆˆk~?ŠË=Ü½Ô · ˆ™Ãf1ª•íĉ U11š·f {_=q©*òV¥Ý¦ìbTšhŸ&}„µ¡&î;31?^-‡eVŠ* _Þž+<#Ñw¶”[âЃ-Ã-P>U$«ðlÓSàVoExzˆÞ—Ɉ}]KDpû]n[éy^(ÌÇôu™Úq<>>ÞǾwï ?|ýrí}Û°ë–ì>ƒÔú¦cxlS#é{7?•Ë#2çœÛÌ„wÏ^n[[À(²Ýnø% fdÍÖÚoÏ£¡o‘R:î~1«±$PSËwU.õ‰v¨*F8Åæ½émÚ¾G|@™½[Ö™cØ÷²°Üì IDAT½ç<ç¹E8¨TYk©Ú'd‚"ô[â¹=ö<]•ÍyôØ•”ŒÕLòæZWµŽœR•~ƒ2¢ºÆo±SŸûݺÇ1ëgü\g— ›e‘Ø9Žññ:oå^¥òÆèF‡ŠÌãèˬ"›× "ïïߦQ)"sk_¢v^—ššÉu-Qßûããã|½~õÓOž©ÿÝÚãxèÐf« oð…5œBC/´ÕÔXa9€Œ a¤GUEl¯¨ŒÜÈ ú‹LDd¢šZYÕƒ» b²¿Ié­­ÉQ¤·|NˈŠx}œí‡UH­ë#*+Ö 5Uš–Ø=žÎÌŠÈðìþ&³îUF‰¨SÌÄŒfv<Ƙ”QÔ¬ê‰üö:×¹_ûýw¿ýéoýôåíèÝ´ `¨CÅ„µ>™Ç&„Hm>:ã0«‡ £ŠAhÃh²ÖBMzRî*´aûÜ»„uËÔÒ¨*wÆÖСœ*%J;Ã]Ǫ7Ý妩KUÈž,‹à.âÅüüŒF7¿"ƒ½CïL4àÆ±Gk hUtJN{°ª ‰ÛCÞWK©6æ´Û9™q»Öú5 µaƒ"—{2‚CT+Pð½öÞY! ©¨ oM0U*Z”BŠ ¹cïëxLmǹaÚ¸÷ @FõñT÷¨*AÑi62ÃÔ"Ê}1Š]#Ѝ†ggÉ~ŽŠßÃÊ{X±Öóù|½ÎÇãí¼NQñˆ9{|d’„çó™ L¬n½klTW©díífÒf"\«E÷÷tûãã5çÑgÇœ³"öÞcÎóu~ýúîËw ™zfÛ﬚®µmXÆç@ !*¢²÷† ST[Þ>ÆÈ*B>óõZÝL‹¬ÌìÝR•"«y™yO$n‘(‰R“½¼‡yüEÅZ­ÛoMœí¤ßNzøœÚ[Deúœ½«ÜªáU)Ögì½®Ë=îÃÝ=Ìôºö—/_ÖZ7óç—ݧÿZëõ:ŸÏgS»^æm­ïø”TôÕN\ë´¶„(YâYËý;eè¾Ý©·¶µÖzÌyž×Ð!ÃÒƒÂý·Þ¦/‘˜~ïŸEYQçcæžå!Úß_PÚÍD{oU‘ïVa #v’ß_çÛóÑVä"+k>žçy6'3‡ JúŠ6ô½=Ÿè?ýµ*+ _¾<ôðD&o·…RzOŸA¡H4Òw^ÛI­‚˜¤°Š"°!{­ÊD0Ó¨f©‰)«Š™ Ñöß’Ü뺽@VÏ%$" ÕNÔ¬"*<ûwà <YSæ<¦™ÙGqϼ£WÚ´¤ˆM;¦Z#¤¬ÓÀ†šRû³8T6æÉÓ÷Þ¾£Àûãw¿½¾üÁÛ1­2ãcZl>†ÍaGcHq?§EJ¤Ðã8>Þ?lÈ3#i-fã8Ž®ª+‘µ{âÆªˆ-J$—;%…dIz¦¯ÌfwV%2+ƒ1† %+AFÏõîäòÕá-&£+3kÎA_²•å¾²Yª’™J€¦$:Õ±˜ HQ©ˆŠÈ¡bªUY•„šŠ©ÑDнåcÏ=PÀjÈ „ªmÃÆ$yEð˜"ZY2 é‘•çë}û6Zn"Ñ’ZUšŽÎ¤ì,ìüNTe{«µƒÂ3 iv´øGÅŠÕT悈ØÚ«UÀ½eõðì§WÙöõæÛt¾|UsôCkÇÑAÔ2籿i¸§ÃÖþÍî†D|ê§)U­w$?ƒ«ª qnû›Åߣ޹{‡†.oúVmRš Q e¯U"Ú¾¹cÎ*´§]„ž{Û§›¯ûŒ[}QÙs ÓáqÇ.ö®ØÝÅÌ×¥jªS¤÷Ù’°›(uß‹à™‚vOgŸ!‰[XX÷˜Q‘í(è}Øm_ªpα÷júo—DXùT@¸—Heá1çµ–ˆ˜×ë5ç±·7Gºß¸ÇãYU9Ï m÷•9N¢K #ü8¸g¡m`4½ÑR,”’fcïÕŽ›•U%f­!f'<3»ö¢*ân¡ÖZfs¦cÄötŠv6BÒ³ÿBž_¾¸û<æ÷eá1'B­Š„³—7Qs½n‰Ä1FV¹„THUØ´×ûù8æ^[•¾ÝÝAê0ý' OURŸob)µ]EéÉ]Ë€ònÀ+Eu̵a¤B € Õ1œP¨¬Œ.6E Ìn/X}:W¥»g”˜RØÅ"Ò±#²¢sfÆÏå"e<óñ£™™?¾}y{ΡcÌ1Ÿ‡@«4¼¿ 2†é˜:tL›ªj¦¦brÆ©ª˜N³ã˜6Ç1cÇ¡: ˆ‡ÿò»¿þöóï…ùë_=ÈH Ì¦ê:Eµ¡"T”gÄV›_¿|)a6ÇÈÊt HR†U‡ýöe³/P˜ 2bïLzµq–Q±v¸¨@P…e"¿O`ªwì­Ä5³ž–L÷R %@ávOg$*m¨ˆ¶ÎF?Gs=AÙ·¯0Ì)èÌ£Tk_=f`!R­…¤Rú;DTEeV_™h(Õ(ÇÛcïHCe=OP¢\Eµx½^˜E2{eV±¡Í÷éٔІ¹¯*T9îmu NUÅ{™Ž€×Ž–¡˜i±d˜ŠR%2‡ÚŠ@æÛ—/¢x»–Ly­}ÌÇ Á¯ºƒ½ sÎOuy\×%"fy) -cDì1î²qï ±2ËÌÖÚ]8÷Œ­Õ,]ì ó½IMÁ¼ Òïå'’”ôè!xU§T«-ïå¶ŠˆîµšWî¤]©*ÆŽã8ZCÙãßåKD{?ç\{gêò[°X•••¨vK|žnÖÃn~®bI^m5RõL!#âf^fTVdèíêbD‹âöã8vìÖu}d÷dk]Ôæm¤­*ã{î¼|BâzÛ…÷Æaz¿~R­cè5?eãÝ)Špα*ï}~æv‰Ì;L‰L€Å¨05ýTtœ¸MêëõQUC5>÷üj½wñÝSàÌcF&MÖåbÒp$Çc-ÿøx>ŸBF¦¨Ç|?_õÉÁmÚ(‰hœuQ…s4xm·9·oS©ˆ1æ^")Òï×ÓV ÷ßýö—·Ðîà™ žÑºYô…‚(ÖQ5ñ”îÇ̈·czîƒïÖþº¢éóÈ"êZyÊ€Xà ªCÕlö_¬)S…~zTPÄ#$J”Ç_hCEÌBx¸pšbV?öµcKæIÖ·o/Â"çyº'ÉRôýÛ/Uh(yx{=¿|}{{ûåã|ÿíï~¿òþÑ1Ç£2*bªCmØÒþ’dªÍav^«„´‡š ±ß»“½7 ÞB¶‹d/¿ÇÓò© ”*Ðc«jº‹TméäÅü.]:aíADx¨ˆQ_ëÛœ@xj5r«0+£Ù/õF±ÖCH ,O-è`+Ù[XDê‹ìPƒ@ÇÛ¢®›ˆ›IÖ'S ¨D+.ìÈCàÌ_~þ&C%‚¨¬Bæk}cA•±ëЍÄ¡PÇLt¹$UmÙÀ˜S”éF‹\"È÷Np ¢&V±‹*fUL)S äãíË:¯å×wŸz½Z5ÌTy{†{ÓóŸFnQÄw ½UƒS$â^ñ©j&D"‚ÇñzQ(÷‚,÷c´œµOËj·<üñx¬ušz:ÁOVY|êÖïš=ñÝÓÔÎÕïçàÍ«JOµùz½î/n[, rCŒEDLm…÷^äíùxŸ•ý±}η·ÇZ—ÙáîB) GÒ×¾z=ô©¦KôMCVÁ=«¼û–Ê<æ$QrÓÍ¥"D5‚ÛcGV™ÎuÏç—Ž¸uu$H©ª-`ýx¦„Ùè—œ™6Fy<Ïß¿»®ÅOŠ3Ã{"tõ‚!âÞ…õ‹ù|øÞ½8ÏÕ﬙­½³ÊÆlâéµÖwÿíãñå[üò˜e ði êñå¹~o•×÷[ÐÆÜçêýô—/_üw¿CÊœbC×¾ÝQ•¢f"×ÕFŠ×ëÀãùÄ}"3ÜÅ,#Þ_?ýøcs&÷rítŽäy^ª#b‘Ì*k$%2ì·ë\6)”o×óíAaïy"+ÁôŒ*U‰Jª/^¥ªè=å"£ò8Fi °^gÆgÞ›D‚BËdåö A†gFeùcN#EhÃÐ Ó®aMnH\I™9”T=Äô‰×yºÞ¿}Háãu^×"p­ýqž¦í94¿¢éŒ,‚çÞÓz“ŠçãÙˆSŸcªðÜA^«×z¯¬ßxü@üô·¾vBKÆ¡:ǘc•ÉiåÎR€)2ÔBªàï¯SU#Ö^k< "ÕaäªÎL_7¹ph•‡À ç¹ª @Eô¦P«u#B²3˜[Fâ¥CYÞU32‹R£1dUEí‹ì¯yjNQ‰`¦+LUk{•MB•ÞÈ©Z‡j’hüE/î²"¨DEF6¬ˆØ{‰ÙP Ñ›ãA‚bº¶‹¡2~þbsжMéÙ“úyÌÊj ›´6£isdzÃÓƒì¡"’Џ6‡ õ Š–É\¨ã8šÄ["s>ÎuNyÌCÂ= RÒfP{Ùy¨ nÔûrÏŽ)Õµ›1Ъ»¦waU9×ò{ ËbÜÒ *«ÊÝ d‡tæ »YÁ͋τ* ò±wÛšÌæÛÛÛÏ?ÿÒµ¿|¦ŸWÕÃ÷êy‚™~_Nö(Yj“xÌy]—Š4 »ù9îÑÖ寿dÅ:Odã¹öþ.Y‘1g+âzF0‘÷Ð9ÌÖçȨ÷7Ì_Dc¾>^dsmÙňïÝ?ºËØ„µc›z’æÞüѪÒ뺬º 4ÙÊ¡¨/ïQ“?zëjœslÙeæ'к½] ¥¨tŸ@ Ýýæ=áîýÖZçy~ùò¥¯ç1FTøJ¤Gš‰0Sª²}a¾‚*ѪŒ€Ý~J)X…o¿ü‚†XÍÂ1޵·€¨šc,wcL²^×õãׯ™ Zñª7³u^¦£Y³föíõñåË×ÞÈ:Ïóñx^¯“Âëºl ¢Þ¿}{<žÇsFÁ~þÕëú#žÎ’ðø­åŽdQJª*{ëÙŒóïÜબ2Ã([ ¾AP±«„Jl÷½¶ïWUs~ýá9ޝ&"Ò¹£{ï b¯x… iªãqŒÖò;œà¯þú÷{¯_^ï×6§H«T;«red$EÖÚ•YÿþÛ{„ìÔ¨Ú•—ÈÈ=©Â|ØÏ_•¦"c|¬_¾9$ãòõgüë?üã?þë_^ïkEèö÷~xØqWúcŒÑò?&z‘U­L¬¬•>ÇÀ­l`‚Ë/ÌĨYH&ˆcÌëºêÆf•_; Õ(Ž¡ÚØ†Á€U%²JR 5L<õ¦%fJI‹Eˆâ:QŸ‘;™»Šc(9>·ðˆZ;‹bïòÖ§·0CUo ‰™vO"úNžj½µR²¡LUÀTô³‘aZ­ŠˆM±ª6që—r>Žª,`£m/ã˜ëõB2 Ü>¬tÕjO–FfŸ¨¢ÊpRtÐwe‰½ãqBUZk»H’²ÜÍlû íñSAUFÃÒ·v“wJ3 ‰Tªê0s´!Ué¨Ö•ÎÇáñY[ƒ>>>Hövtï-¦ù9c¶Â¤5ø}Î~î!oôX–ËPD²ØE0³ñfYŸ!SîNQÞ‰W¹÷6•(£^çù|Ì*›Ó®ëªŠ½½gD=^ï±Õ÷mØxç1{_ iuÍS„ëºlŒHËcï%b-y^k¹ûqŒ>Uë³³‰¨ª\{©©©¶Rûsß©E&Jq§ï=g!E[IET¹{GÆ5µ­b÷gºç*}#šêÚ«‹µ–ŠÅ޾*:`±_ØóùÌ;†V[X™ÙÉ`l=4@1k(dÁ¦Vy_l¸}¨;BrHxìí¤´’ÌÞ4úöÝZ¬ñse€9geqƒýèE%#÷êTò$±ÖnØí:×óy¸û*U­"53ÄýbÜ}Û[–šµšžDAác Ý·Ìz¾½‘H"íçÿöuýðv¡ð€îÁArÇ6J%;ÊDX¢š#Ø" oßt0½töȿ޿ý\‘ÒqàTH¸ûë¼"öœò?½ýðåé^ï¯ówõñqžïïª,–{U€ˆ¿yà{íkÅkE‚‘,)Û%Tyˆ‹Šî¬í\Y ¾QºJ9ó¨BbxÑ+*$%¹ôÚS¯í¾c{Õ×!ÿð~øÇçÏÿä׿þ¸âÛu­Ð¿ýÓÛüøUefÆ4MUU‡™µºEX%èç+Ã*#«bož]¨WîjÂ=­²ØñÂIQîsÁf¶ï”öGo¶•,11“÷ó]obhö8˜ "´w·Ÿ%|Š˜ˆÅzÍcjÕ8f»‚a|èã;ªº˜÷Ï(t¼W¯îU5÷N Ó㺮œdf{¡ç÷¨-K©BMzݺyè+gŒ±÷îåG‹\朙af˽*D2‰Š8Žãò‹Âyô”/3ûöjŸ° & ”F5óÏãxg)@^×%rØáÞ^Ù~÷×ZýÊ c@ˆû&ÅÆ¼Ö""(‚çy¾GU Q%ª&öøÍÇ·ŸÞýïનí<ŸfÇ•[ÄTˆ6´*”)‚‹Þˆ‡z!%§(eû /1‘6çbúüêWÇ—¯¿:_ë/ÿÃïÿå¿ú®U QÑŽ›Ù%zØyUÆÊ‚Ãö¢ D%¨Uôýé (€“ÂiÇΦgU4+ÍFcûãííããB F4ÈŒ;ÆÔØ)Êc‚ AªÞTT*‡· ʨ•£1ƒ_~ü!+DU(I®³EˆÛ‡U"ðÆÀ}R*wÏvªz˜pGUú 1¹Î5†²DZ´EvòÌœÓt|¼>zàsXÏû˜Žòôi³U(=/ax®µµû›Þžf®ªD±x^×ñ|þòË/ò'úóÏ‘ÙsÇÑ!ˆ­ÒI÷®•|­õx>×ZcØöÍOÙ}ZUUU›È;pmðÞëú#r›ÞÛC5Wð32Ü9«c‹lï*T(sïU”acï]‰f|µÑ÷<¯ÇãØ;MYå!½€f3¢½x•žPôÂDEÚ¸#"Çq‡³W¡J©ý[àsút›§ F¦VF ªZ$ýþþ~ÌY"×µŸO#éå• %EÔ4ÒÇñÜ{M!ªä™Ý5 ³"c­¦ì 2À4†»ÍS@fªXú¥ª™”²Ö:ޝ6Ìw—£©_m¬Ý!ÌUÉîWúiØ×Õ‚f÷¥L¶wezUï¨ro¿œs>„Ü6ª€R͈æÙúÞ6¡Ð³†È^KÔÛCî‘Z¯ê]qÕŽ È8ŽÞgЬÙÑ$µöjBaD¦{(­ªPüøøfö‰©ˆˆFŠhFn_óxÂá™»ªÎëiôŸÏçZgܺ§ï´ƒÞ4ô›YAÂ}78«Æqœç‰âÞ;=²ŸAÌÁ ýéþ¡üßÿßoö#>ü#ןÔ/2¦}|{_×ãW¿úá§~ :Õ\o3SçsŒñ¬ÄPþöç“ä¿þ‹ßUáýÌ_ÎóÜþ›ßŸ ØÊÚ!"–ṳ́…ì€'sxäÇUmÛBA¶§vð1™z¥p •¢ë¦Í¤q¦ÁËaÈ1@eH†‚×]_ò«õEùãaoo2‡ êóË?GeâÒll‚ˆIF–`H‘ÝýÚQë°qíK…oG M¥ ÔÛëk«h~R”ì(ÄrÞ켤V ¡äàùZž2L‘™…”D„S²B‚‰°íP D%¼v_çÉ(dÄö”fí©TA´*¥"RT‡ˆ »Ù¬*Š"5Hf…˜D¦QE5$ÁlÆb÷ΉÛEÔƒ ÖA·…T©¼3(Hj«VQA¤:ZpªFAA¬È€P•Rµ½®³ó'Tb;µ¨²ÜõÆPkGÔµåЄcŽkíãí¹×nMqµñ; ¨í1Žcj/ts³F¨£Ö:Mt¶ÝªOêLã0óµnám!“k»gìå@Jw:À°éµû>ŒHp&KL*²•þý¸Öu‘¢2º@Ë,‚à O×&Çí-j…*óú8眙ˆŒô@ᘇ_ÙK‚÷÷á¾ÇOpOú¬¼ÎSísçéM/Xødd>ŸÏ¦¤™ÊûÞ=9×¥Ô×ëfž1tDÏüò|œ¯u¿ŸP®uªÚùþ>¹­¬¥ZÚ,/rï$—C™c6k+ú•1¬Q¼ö<_—Y+^‚:P¸®óy|I;Oæº.ùlÚ®uê{ÛõÝ0'tw¶°ÒàÞ™4I/7'ÜI,åNi@D#€4=>Ónqºlög¼©Ö=·ñÔéÁÚØÛýDÖÞªÚN×÷Sá€{¨ŠB:ª7#[|užçóù‘í{í|<凯_wåº6ª"bØÏªê+¿PW³ž"ºWû¾«ÏLŠŠÊZ+Áu½tX_ˆ6~<Ÿ"•=MORgfÙßý{ÿ×ÿÇÿùmé_oð¿ºüëЯ©ßíëÿýËßþúW_þÁßÿÛëµq]%©Ãþå_;¯úwõñ»Wüöµ"¢ï©†RGà@É Ñ1,Ió,”JW†65 ÎÑ&2A!²LÑ™«‘’ ù¦ˆLeM®ŸÞ¢b+×¶MøqШ\#÷=ê×Ç`^?}}{~};Æ<æ1ç1C‡‰¨PÁ.0¬ -d«¡0uýÿL½[mÙq¥cD̹Væ©SERÖÅB·»†Ñ° Øh?úÅð»ÿ¶Ÿ|%7ZVëF‘’È–(Þêdî½æŒ‹båa×S8•ÜgåÚsÆeŒoøuNS™ûrJç0èa“:ЋÅBì ez4rHÉŒ½¥ç(x^OÐ2âþ³Ï¨ …BªÁYEPÄ&¬Š ­T jØ»|5Me$ 6Œ¥"Õ;I/%ˆ„Ú]íôr¶ƒ@Ä´uäÌJS¨höðu»yÚ‡¡>ºéhDB@©J&¢× =.G ©cšG·º©ãªSc¥¼„4=ÎdF À^ns6E’ƒÀŒô¬4ãµ·ÙÜkI–ÒJŠ‚h_ĨPs/³ñöå݆ͩYšéµIŒoÔꜲ°Ý©Úòs ‹–;Mß»JU¥*²–Çœ:Æñ¼®aªs¦ïëzž¯gDÞÐ9K¤G·P²å@¾³ÄÌöZj¶=‡UFö‘k¥÷ŠaïE²* Î1¯ë:…×Çd™ªj" IDATuÁ­F­äÚ>©1?@ÿ_G¤<Ÿ×qñ›?"rœçõ|’YU=}îI÷óZŸ>¾½7²Š¡*—_ÒÃú†úº)YUZÙ†55Ë*‰{0›bQªfÜîÓ”ª‚« ]Jd2Uk­0sW ’á³$æ×%jZ2Ü}ï=ç”nBÉçZB% i 2ä­Í2[ÿãIEÞv•›æî¯¯¯Û½²ª<\Ô´/ö|>ûÉé)&róëcìߪvªÅŽht»Ò”z]`U•y·VUcÐ8Úxÿ|<眵òØ8k´ÀÌjVk­qœRµ·k“h[ÂáÞ“¢^”ÈZëõõµ•¬Ç#›5­ƒJÙÆ Ê„T{}#nï{ÇyJTÙÿ?üö§òãŸÿòKƯóôeoÅú~ÙÈ’5Kþü7oÿûÿr•¸°+ô9ÌR:S ø¨Ñ‰´,©¸•Ä£`ÁK*éÁ¡™eR,‘‰Lé@’DÂ+k()Rºý÷Oü»×÷Ï”I9Ï4æçs 9l±6cyøóÊ}íõßûÁ·Ç˜ß|ûIi4Î1vdV­½A`@Ž1D¤"S„0 7œ3Æ,J1ö–ªcÎcŽ1_æë«r–8À¨ÝfÂÜ;ÃUð§Q+öy’ÕXéÞFvÉÄNŠ*V,ˆLtº -‹ ¥j;<2±· a¼2‰~Ê‚•q5iêÀaŠ’ÒÓÑW+4Ûe€JÇ`Vec­ðapÏ £JíÎhwB[ €(U厓@ÄӥƭÈ2+G@©„p@M•Û½DDÚ(Ô°!@VJIJ ëù´1mLß句/µ!£¦SÌ,="÷‡‡GŠÈ^Rô8_·/VžsN²Íá¶ö•± ()4©èÆE2I´ ×U‚qŒæ¦ïÆœ= àñþþúúâéYU—2™sïçG“yÔŒ™hff+hQ²jñ«tÝš›ïÚ>,0>r Û `f` Ìh6{Ô/ÅÏçœÓךsš™’6çãýÝÝç´¯\â>.ÙÛžcšâòÕ¹T½b?×So®¸OÕ+ÂÌTÄ«&¹¶'Š‚ð¢J©®½›«¹RªÞo{°Üì€ÈDÄ’~Yìî–mRC©Z-Z#"2âœGTsôŠ@UÇKƒE{ÎÖóJ»sØÝÆx>ŸTJ¦ëº^_^Únr¾|ú1FAèÜk×-7¾=Kxžý ïÅŒHç ;ž×{ëècohÇûèqtâ±7Û£×ò Ü{)ЈØ;¾ù4=ã– ¹_×åîcLÕ&+˺®¡L`ûΤ kp#o¥šµ•îåñè‘£J’Ðåk{󙨠 R=\+ÍèÏk%¯ësÚ¿ûŸþÝ?ÿü?ýÇÿð'¿ú§_üì—¿úþWÅ¥*!öhì»âY¥:ª†«¡ÍKTïÛ™P@…miÊ”¡wÄÏ U—0]´UìUBhÈU>!(@bÔe²mä›û¼Ì“˜Ü?8äÛCUR•ƒŽib;`RÇ´#¥®½ç¤¾4½Ë>}sžcf‰·w ÿ¹.ÕV{"C ÚœDän`•£*ÓJ5rL br U1³2@SØÎ'J2 ÛWkDX‚}=Õôy­^u¢¤ÓØÁ¢wòAgÂxKC¥Ä l¥PPåÚ;:];TQéähd§A‰JÅ7±øRÄÐ*)—”^O³ª™$&(d¿Rb…–”¤¤”™°DÈIË”ëÃ} Õi® i3gdÝéQY©®Ã T4fã5³)æG›²”íš„°”T!<¼–4[;òà5²rוå¹ÇÚ\€¢€ìáHe‡my†T‰Ð#ç´¾&×ö××—÷·/üðnº{J´>›cxEo8EõãQòÍÝÐqf)™ó<%³n÷PŒ1HºÇùú²¯-"Ú-R•¾³â)¦Ã,ܳªUú­ì.^\k«éu]¦ºn8¸;Ê“ÆË¯cœ%˜c^×’‚sLÉçsS¹sNB!•%îß~ûÍu­˜}¬BÚz6#"!5§IUDªÍ«9‰’Uµüq'ÉèK©D2Õ(%R9TzÅEŠï­jJ®p|]ŽW)F¸W•Dp˜™1Ýß×z}}¥ˆšug³Ös ^=Béw|ï=Æl]­šåó©c …ÄõxᤉDfN³¡sÆZ ì}U¡ªÁˆbÓö¾=t½AݶS‘ô½K52LíÚûw_òÕÆq [½§JÑß/_¾|þö›ˆìï)‰””žÛˆ° f .lDHf©fì<³±¯Õ!6îÎ9 áÛíªÊÌKß)ßYÒ~@pמÃ$|Œãíû/ó83ê<_ÜÃþõûßýo”¿ø·ÿõÏ~ú“¿ûéOþóŸÿæ×¿|{<žOßÞíJ­¨\²ÂÜv²ÔÊWŠ’2!Š,)“™Ïýåq•'³DY‘þæz@¹ãÅB5±åTù4ýœõ‰yžZÛ%¯o>½fÖwß~Sh©„fZR4©‚ê˜ã°9÷µ¾9q̪¼zÔ{mDn?¨½ì—ðååÌÈ1Buª™^ïÑŸ’ÐðŒÚëñz˜‰>%\Ra£F¥M@d½wˆÚ¾®wI@²² YB‘DänK}{̬9[‚âÍ{j6F&Zä:Ðb ¹_;¡ •¨–a Q¢´rT»B*߄̸—£ȇÂSJ”·ì„7=4“ò8ÏCÚ[QªCÍØTedd¦¶gص´Tµv”ÝkFv{ßÞí> VÔì96ÛÓ›(…Uæ —V2K )âäh/”*E°‡Tcð^fBèU%m*¯ýˆh¨«T G”üàÓ§çs1ÎSžÏ*Î1W8ÍÀ* YÐ{‡*}m‘,~`âI½Eú]8Ëý=mlç§OŸžÏçZn6dÖ%ù1Ž~ÇÚWs‘HÖZ‰¦ƒhY¥l댤êüþËo¿ûüƒ½6>à”{_Çù‚èa7mŒ¶°AŠJd1Ï À3El޵·ï=޳ˆQ=H‘¦ë4ºº9‹¨,dMvìù€Zç¾ÂÃ"Bôw¸…¨P ÔÌòôcNU}<½ ÿüyDdrK™¾ˆ1޽¯È¬í-‹ê^¼U­íNøP7ÞY•ÉÊ^ gºªîµ„lïCg±íÜ;$ª¦jDv fß;j–îT-÷ŽÓ²Ao af;ÈDäù|Î92ªowï&¬ïƒŒÔ©*HwQ­ªŠ€jf½¿¿·u¦êwMƒªõ•ø05ûsy6 ªÈD•ìˆÊ ¯‡{ˆÄ¡ç1gVJ•¤è´Î;ù îe„W†™¹E+¢JöÎå~§g¦W1MU]^ ÒÝ?}þ|Îãû÷ޥľû£?þüÝwÿòßü«_þì~òÓŸþô'÷?ÿÙ?ÿó¯¾ÿí÷¿ùÍoßÞŸçóm¹½çÛ•.á– ÖdX9ˆ ›åßNjÕ ¦Z®Ø§Âž˜;+Q—–ÿ‹o>}Lü›O£b2Ç€šÍó¸žkÎÑÞBÚB”[5!PªH•äy¾ÎóÅldîŒÚÄÏJÖn1œªvâ=Èîoî8N—)Rç1âk…çdÁŠ‘AJÍÁܱË#¢¼B—â…:¨C€ó8ûýoJª2ÖºDªa˜~Ø‘’ªæ¾#ªù  Ÿ™·1šµ<%÷"%W"S¨•yžooï÷Ô§‚(Aç(A„Ã*¡)%ía¡fú Ël*µy#øhNm!9ÇD«$R€¿EG­”Š6-"A@ ZRøpúߨ¯’J¦ê ,"©UP’¢*…ã°Œ1#Cu– Z¡ ¨é%ÛºAÔõxö(³áÍm: h/ʰc1Ð0ÃÆH)©:Ηt_áSAϰy¼€ñöö>æô°AbPâ˜óy#®$³±¦´çzö¯UÙz‹µÍžÏçqRõ!D¬[S‰•JxÖv_×S_U3ÞlUÝ™ÌÌLSY{9•\Ó캮½®acÇn™v/+…ÔYž¦Nµ.nödŒÃÝÏ1®k³38/7#Í”R…µ·Tud•7Ðâë9õÝwŸŸÏ§@öº”³üpØÎ9=.T Ì¢w°p ]ìØkWxéÝ @ÙU@¡Ììy²ÝÕFÁ´ ,S+=Ê4zM&…ÊaãñôcF L4÷»c-]j(QLÔaCD¼J¡˜€gÛ‰ ¢º®Q ª¢ŽLi–S`L°Bñ¨¿öz‚m   fø’ܱRÍ”tÏ—×SN¬ëÝì¨,³f¾ ÙÃ&*‘¦C•×¾ð\Bv HPL‘È"Õ3ZRíYW}š™ïw;f•gDÁ*q3<þ³¯w"UÕ÷æ=ŽçvGóEz;Æ »cZç8šp^€`îˆ V•øZÀT¨ûU^÷£ƒØ]ðŠÈPíCËÈc ßÞ æ{ æžç1Kˆƒ“Ü{ ³½]íÎÖRC–]×¥41r›{Œ1ÝWUó_o¬ED½¾ëòžP»;mÜ“xR¤¯=¹®H Îó|>šÑÖ 5Ë¡IŸx>Ÿc˜RÃ#«æTw¸oH•²V9nÛm/l+¢YN³Ìj']Ÿ›f¿;÷ûpïITÿ{ÿK«Ü"sÎu}‘R ê-$%éîcNù¸T¤ª<înÀ_í½=B¤š¼¿÷c<ÞßÛ$÷jŸ¬æH½W[.ºŸèŠ¡¤”ÖVÉô’*Ø`x¤Gt\Z¥{‘$„"½»~{ÿòzNUÍP_«2‘ôÌÇãѲÛäafU¨(‡S­<ž~©Z{ï÷çSY;+}½‡oßüàHZ¸KìǯþñŸÿîïÿúoþá¯þòÇû·÷‹_üì—ÿôózüá{? –{–žøÄó«¤ Žñšµ#e / 0ôØ ¡äÎóE›Í¬ *1c­qŽó8@£â|y!ú QQ5½‹¦”’BIuËÄÊhTû‡R é­·Ø”ÔAÞæš[¤ßÆŸS…ñƒùWÅ6VÌc{  ŒýÜÈ´9UG²hx{ËõÌJ”W…ª²ç[á`Ól§$êœfÖÈÃ&Æt¸¯VFÏ’¨š(‘BVí½Ð†4€ J( 5’,@5=‰¬³Á¬•¢ãÅ“6¢g3áÑ,7j'üRU ºËŠNÃl3PÀA6­WiCPw¹‚¬6|1ç½ö)Á¡º+¢TdÁXA…ª»ûÞ056ð¢XsˆšL 1XÏ•x<Þ ã˜ç¾Vu+-c@ÄE*r¯ Š:(­ˆBMU[éFKMÙO36¨Yòöþ6mVUuˆÊáî/ç§1l¯•"•Õ ’¬’”½Ú©ó<÷ÞÇq˜šfBÊÀÈ\Ï}üð5ÜUõËûÛ1£… ÉÜ›ª­Žh/Ãc¾Ìç[¶£»÷uk9)¿« ?¬Üªµ<*û”Qj„kÎvó·šÓ½‡–Z²Q<(B͵* zÛÜ2™)fGfdÙ­ ¡e-3ÝÛ¡& ÞÝçs÷÷ ÀZW«Ïå¨jŸs7èF®ˆ¨êik'+6±Y„Ry×F݈÷âq=ŸÇq$oÔ)cÍ1~àwªZ/Ôîôûbp÷14SêcdŸ7mßûÔžç™ÛÍnã×D‡j±P‡P}„0Õž[J‰¯ÇŒLZkÏ1¤D"ȱ÷–âTíˆ4$ìý7¿~þòŸ~úWýgöçñÿýåßÿü§?ýË¿Òýåêq(?!„©¤šªT•Lµ¢2ÌÆ8G¡ÎsŠ(:Bxjæ'T5A¤oU˜Ú˜S‡vb ?^ßµW"{ïÞ·Ü0FIŠÂ¬mø) )¥FµrFÌ4’µž$Ê6H™÷±.jh ;M­“}ìNBçdA ¤Ì”¨ëNf°å»ò6Ú¯¯Ÿ=+|gzd°D2@Ùd'¡*›‘Vmª)h%ÕññlT…"T˜Y[¨"‰}gEFlíó"¥±ÑVÇäöÚœ@¡D¬$(C…Eâhô$*©ºEX”;`Xú‡o_ S¼nî€*X´   `e0#Õ…$60¥TÇ3…Ö½Œ •CØþûe ¨ó4)¥6rUˆÖRG $#Òvv÷*Ùï{}ú|ˆq@³„F ’¬…^ý¹Ú#›âðµ%E¤{äóùüôéó^W¦|z9¿ýîÛ_üê—r›>(5¦*l»^×coBJ2=s@’„ˆ4¤wÎÙT—ÖYBÍw¸ûyœ¿|«ÊíûWf§›Öu=DNUóèIw?ŸÌ”†óë ´Xfúáob¦dz‹.2oŠNe‚\¾º°•…Ï.Õú‚ésS?à¦}u¨UYeo¦ @˜½÷M‘IïbEUâ @˜å”ò5¬·¾™IˆïÐAéûÿååõñxTeå†}bd¥ªéÞA®µÆP÷T÷6“»{úÐ!u§Ò—Tä1ÇZ»s{iïî1¾÷:Ž™î1ÂtDlU[êÌ^½ÄW‘}]$…‰* vFf¶ÓuL×û“:Dr»ŸÇlÙ¹DR±®P³Ø 4ûO?ùÉOþú¯þß?ý³ÿðïÿüÇ?þ›ü§øQ=¦^/‡b(3sŽiˆ9†sÇùúrº 6[3B’Q ”è(ÈãËYÐ*¯aÂyÜL¤¢Š…žä‘‰HˆxõßGMÕ€Èfã]%r³pRZ”ÊêÊC& ÇR5‡ee JʤïyJ ™›TU"w÷°áh•EÈóÚT¾¾¾îu…¯1HÇ<ÏðµÜ׺i¦R!•ÞyØ=~R;2«ÄïiZYY«¦EjooW¤ˆìæ9H&ذ½¾V½œ ŠhŠ+J(™*Í¡PPªã1mŒt!D‰„˜°ªÌ’½t¨2Nµû~͵”"=ÿ!išd½oª"ÄlªšˆdEf†B[¯)•"£2š@i %J‰,PX¥ÊN=Û™ž…P%‹eª DtJ5I]Ë=² jìy¨c‡ÍSÒ›X@*Ó0lz†¨zúàŒ –R „Þ¡Û¼ÿÈR³O//é¹Ö³jTzx™–*+ÂÔ2Z¤Uxä{‘écŒ}]0°¤ÎyHÔZKRÂ#ò"pGîÞ¿Ë>S˜UFâ#Vä›ýxEC)Íè^"»D2)¢™9æüþW_†™ŠDÏàÖºDä|9³òÚ×'ýiöŽtAj£¡“Ñî¹eeqd>¡££L×õœÇY…ŽåèáST$÷öï¾ûüþþ\k“ø°˜åq¼|œûÝqTD§ËI›Z?}óÉ#3]}Ïc¼}yïhFÞ2î½{¢èª[‡ºHsÖ‡‰¡7Ã=À¹wηQKöÞã8öÓ}=Í Uqm¸óÞ`ó˜"II¢B 5Ó?þ ˆ¡Œãx\×1Ïõxêc]— ¿¬Ë”¨ôت֩‚_ÞÞæɨ½–u“acøÞ‘+ÏoΈlæ Bv¸©|½Òƒ§VíþŠÝÖñ 륷™d¶l™¾¢$‡é¾V‡ î}U¦@@UÑÞ^ j¨z†”î¦Û’¾–š¹¯R­’’½wÚС¤Èºöë§©ÿëÿü¿üßÿç¿ÿÓÿçÏþú/þæ7¿üÙ7øþ÷lÿpàÛS9šsBr¨~þüÍ·?øæ›o>uœSxx„ûwšmôÖRAǺ‡¨4¡@Q*K„·á”D'ÌUŸ=Ròòz¨ÔV"¸_ÐRòNë%:C)+aF7£— ¤wŸEe×)/F~ðÎZÇÔ‚Ý;£W‰BU­½*d˜Æö/ï_tP" /ŸæYU©­ŒïÜ(B(”ª "KV¬íkŒÁBàCIŸMÛì‘"I(ôæ)K¹´(!OFévrv3Î.±…Y&ï¦K’ T! ˆ”¡s£7ir´ìA‡oæ68p/š3ì<²2* %‰®òHP YØ™4U‚½¥WÊýûQ!‡T½RªE†¢ÆIEfšÚËË Ð>þ}ÞßFÜÓ¤FIªªš‰¤G Ž^¨ÂtöNÁl¤Äµ®¬¨J5xÕ˜Ã}WDDdÆ^;ÃIù;YY÷Xfo?ÎSˆ±÷>‘%‘¥%; ÷M"3iŒU!TU­ˆqÎôcÄÞ7ʦ:G~½¼¼>ž×ÖEÕúßóýˆPµºÇbï)Y™)ÏÇã倦’•¨Zk·µÞÝ{µ•_Ià비QygKÐL+""ÍÔ=˜Ã¶»©¹{›ÜÖ_•ÌÈ’„0$³"è÷¿¢Æ°¬4U¯*ý7ÿòßþ_ÿÇŸüÇÿýo~ý«ß¿þ×ýÙêÓË„BJ’x™óåõÕæ4õ‘¢žŠz*Ùd. "ƒL)!¡Ö¹T÷ý{Ÿk`¥H•ÙL)@(5ÔLÍTIé…OWIU2³¤q¤F–W:U$ª æöÌaŸî gŒcvæµÒ*%2KXU½–”–ô[àùxK é9Ž ›"U¦R7N3êkB ¡ª6†ß!Ñx^«Æœ •ìøÓª*¦hdG÷I;A­U–áŽ`‡ªIUT§ˆõªŠŠÆõ‡ÜÕg$E¦‰ªêèüµöí’4£q "èÄȘ455¢…·fæ#WU€6Œ9hjóho>6ð˜)9ú±¦6uJ:Er§ß,”šóè™{U˜ÎÞ6{…*€0ªÓkÕÔÂýù\vÌÃF¤Ño’Ù†îɪ¨4èË7/}©@9çh_غž"B…Œ•{·Oõýñ8ÆP(*µcçÆH÷ž®žc\«³6Mu'x'µd·G—«]îµï^7v¯Iª*i_“~|$€é×ÍçÞ»¤2ó˜³\™·Gudg¨Ñ·g–šyE<ï'å®çyÓ"ÝLÇhvHϲ»XƘî×^Þ]Ef¢(ÄóñlSKgC¶Ì àMHÚ@?§u¢–ªãP³µžªãvH%9Ƭ*SËHëZQáË;–«×¤{­®ÉZR±ÃëÎIo¾î,\‘ÍÎÅÞWDsÚ°»¾"*Óælì6 UÛkÍãHwÈWé}{ ;F´¤Ê#24)é¨[écŒÇãjm(!;³{«¼—î:¼Ý‘ýV›²ß„þ¨íÄÌÊ_õó¬ÌvJe¦™wF[ÝQ¹ý¿Ï.îÜ]²ˆ†{-¤Ú;ãÖtIzÄG4'Ñdþ̪2åÚWfôh ’‘ùržè?ÿÑ_þíOÞžo?À÷üòü¡b§M3*‘ï¾ûdÇ숾ʈ@e²Ñ¥ª:” ~Rµ„™ÕÚí¶éDÖ-e.‘"i=‰iú˜˜cj?ý^–Êò*‚ ÑS Š”ˆ˜á5¤UÓ"AFú³ï6¦‚j:æ!Ŭ½ Þ9®)RôèMµzÆÛ÷ßUXÜUÛ½›¿fùÞ]Œgx¿ Õ®øºOjPXÌð4‘—6‘Ê;6§eHnÆVå>¯+%Ûg™TÇ™¾«ÚO§÷[„`UÜ·HÿsoÌ¥**k¹£çñÚ½+î¬aZUé>çx{?Ƥª¾Œýâû_~[¿øo>=þ`â8†MR¡eýè÷¯ÍŠlmxÙm=€žPg•(GM鸇¦$%‹ã´yTfÝš¢€";Jž4ͨ9؉ð’™v³£ ™+‹\×’Ì °b»›2Ýûô‡ˆ  :çèð; j7¢ŒFÒl’BXd• sÓ†©~ùò%jU÷]%u%YY$»°%Ä#æ9[Ih:B›,Éuù< •}v¢*#*s»g¥6àˆ½Ã‘Ž¯ TH‡²Hè°¢¨ˆ·JPTQÚË.)Ò%†¢‘.PL{/Ñ–•žvQÐñ‘¼#«¨J›:ý”©ã0ôŸSU›@GPJFeDç %EM)5ZR™1û÷. ªP¢²§ -mõë@Ÿ)Pôr'4 cÎóœCÕ }5˜%ÇœkÇœçÚ+Â#ú«–”D#éê‡ßýàŠª 7Â3Ó»œ‘¨¬ˆ˜ÃJP{X׳“»Eš¾§U©ªÇÕ·ð­yÏ0µu]Ÿ^_ïhÀ(öCSt*H¤KÈZOUÝû¢‚)Š~®’™d¦‚¦fGf¶”Úǽ¯Ì2Õ^#«Úãz(í8GD èé¥F÷øh[)"×uM3|ŒÎ‡ }œ'ÍlØÞ«‡ø×Zj£¢x^Ïóã<Ì(RŸ¿ýö¿øý?ˆ_Ý_F}( ¤DK•p|ýWi“‚EA½Ç,C}yµãý}ˆžó˜)f:h6Õ1]+n  Ó@kÅŽ©0¥ï‘£Ç©P¥ŠB2²$…sˆ€4j ã,ST‡Ü½Šz ­ók¯/_~sŽs?Y5ÌÆœ¸›_E¡¤ª2ª1Tï,¢ =Cy^—ûºÁ‚­ß‘ªlfe0SJMR ° B$ L…IBun䳕u©ªÊí¥ÌÉ`–* b¢]3Q«€šiWŸBâ&˜@]Ò¨EQU©4ê^ÏŸÇ$Õã’@ üIŠ–g輺*QmɸÛÑå°Gö1ELÕ+tZe}ÿýo=÷¤´è‚f¤A´ª‚õ)\ Í)qr¶híì\Y’Uqm""2R‹ I©P +ûö`),@ªïIÑÌ$Ú¸P¢’€W(£çÐ=©ÌBBUÕ:ÞÝ@mÐü]÷oªxóæˆ6¶ôaÄ{fÓé Á–´gB©cNJ)›~ö÷Oô^3Ø X @†êàðòÊšóx=Αç<í}c’Þ"TB·¤Ø­`ï *‘ÇóYéÇ8QYUá›=ÿ‰D•—7È}™Š$l(%Q™U©Ô¨——×9ŸɈ™rí Ä ["Ûâ&^]ëùòò²®«)UEÅqžUh„»ïîqUéîÇ1c…™ z?#á¡PaG¼Âì¨ŠŽ‹HUDÔZ×r%Ý´ÝC ÷ éáI‘©–Y F%U;e7#ï¯@$‰)'™UYI ³šËÇ©š^×3«¶{ï«KÊÔpÏ µ‹ñ9g·½É¨’^Ô¹»Ù¸gë"â+=,cÌ1ÚjîÛ;o<ã¶XS)‚ð°iq*z‹ÎØ®¤á™Ö·2€í»Jöµ¥²¤HMµáfÜ{e•šÉ‡Û9" …Âñ2ŸÏ w–F ö#"‡Ž¦ I”@#½ZMåμzÜÛµ{èR€<ŸUªÙ£i‘̼®K•c¨Ò R)h’¹d„¨÷MJ¦¬}AYÚjc‘Ñû [CÕ Î8޳hª*¤¤Œa°š™ ‹ ÷ìak¯÷Eʨ»uò‘ó°Êè¥ßY¿bmRýÁüÑÏ_ÿW/o/sꜪ8Žóÿè¢üÚ+=nP2:òEgÿ*4 ²ô¸×Ð6&5Ç0µ¨”ÌØ^R® 3Ušª‚T›${ÚÒLÜ®RÞ2ÞŸ°让EØÒÁˆX×uû¨ T©Ùõ\U¡JÓ‘…㜷ªácLÔÏðíý}œGDøÞ”.º Òé„á.sؘóÚWVRYíBk²ÿ‡c P²ÜMíãTñ¾B†Z{íöÞ\î¤fV…«ÙÚžQÝj÷5vd%mp{<žNã~,Ò/OÏɼ/{Ioá8ôœGV€¢÷Õ UžÇÑ÷T4­ ÷µw¯»/‘9ǰ¹ÜÄÛ&ƒfe2¨*‚êù¹ *lŽ}­q’EüÿL½OdI’ä'úÇìyDfUw×ÌôÎìpÁËòLðÈ Á¿ÿG ÀvÈÝfª*<¨yÎ4F¢*ááánOMTä'‚:+¨†Zÿúë/*j÷þí¿ýå7I1¦óÿðç,b­ûóÇýz]5Ü!fª&êj%‰b§|ànjî>z¶T¢;UÅÍ\Àôé6̵#ýÝ!Å|œÜaËfmžÕ¼Fmì>Âϵ–©˜YEdÑ:ÿ EBÅÜ]׈»Ù7GòŽHó¡j(&¡"}{{OÖÇLJ oo?þö;!ªSU³ùxÝM«Pv‚|’ZU¹wïàÛzá";˜!ì>åj-¿íÈfÖCûÑïU¡bm0S² J3 RZ_/Q¡ˆ ®¥ìû`2 ¸¹©köïÓ­žÀëþéP}úpg±-L¯áC»UR^çŽ{Ã{­—•'¤­ûµ|4¹ä>Š‘»ò^«€1Æ××'A¶9ADaj£ªJY™ÔŠÝë¶åñvåÚ‚pô­.Ú;Ð* ™‘±wî-BÖsÓ#éTX1kÏ1ú‰HyM½9ìÓvŒÁdW3öï<"[©8Uæpk3Û˜µ×Nòz;ÕJªY‘Ó|¯…/HU31¯ A£r|Œµ"IQÂÃɵ*DU»†Â1®|Õ‘dEÕQüø8ÍÍÕ×Þ}X÷é<‡·”Ø÷›þe;Ö5gO]‘Ùzó˜3öVU5)”‰U–Šú°WÄÍ“RC?W?I½„X?·6«ö޳²a{U¢ƒ&=í¶FVÙ*Å6‹šYdº·z¬‘!Fÿ­ªh÷*ÄP½WÐû¾çu êß6W™@V–¸eȽ·›ñu-kÝ{§ÉÙ· [J±ˆmªÌr··««ñööæcØþŸ¿}~7sw¨üÓ?ÿǦÄ~üøBÖã}4é3¤& ì(‘4P!“Ô.nÃÌ_‹C*טóko$Ô[ІªËylL;FôoÝÌD+W©vTËæp@*Y‚õÊÁÏ9 º÷ýo 'm¢Õ̾皎ËÇLSD3Ò|˜¹™>YâSÝçûC§ÿå¿ÿwìÐËïçÚë.†ªÁÄúØ%ºôƒI*“™jÈãV@gΓdqøŒ2B¶°SRQ–žà‹ªKk1 L•i)Q¤Õ‰@©F–Ьã€öÌ, HŠXI»LUºË°ý óé½ñ5oð‡_—©ª›_Ó;¤°uí, µ&‰@1HTõ](¨ˆ˜³Üˆ‰w[1E móLŸVYÜ„ôJ ëqùu©Èõ¸"VK®ûdót˜1˜P5–ÏuäÝ®É5–Hõç»oz‚"ÕT\Xe&¦Çâ×V²~åG í­qeÒÚ±Þ–³é3+ÇuUæOà3)oo~BtŸ;y&”DeBÝõèìèÉýº.‚Çbă'!KÕ¨ì/ æ|¬{]o UT)¾ ÊãuhŽ1’É8&’Íö‰ÈvÝø8VUͽ)€Je¨h&«àÓ«rŒÁÃn?fÄŒ<Ù_3UÜ;[´Œ*iNÁ¬LÖûÛ;[¢ìÅoûÄüeϯ².é¥áœ…j“Ý~Nû¾oWTUEù‚íè¿3ÑŠˆŒ´ÆÀB¬µæcªyÊ¢€ 2æœÏõì“W^-i™ùê8éâÌ4‘¾Í©IûµëKª¢};U÷Zý|ÐJ €¨Ê5«ÈççW_XÆœ™ÛÌ¥c=ƒ3ÓÜUÑTÑŽa›nˆ6dwŒßÌ"¨*;CŽS sν~¶DpÎÑSQk¯QÏq©LSóá fŽmg:·^B­/ˆ¸í+ì·_¾«ªýáºþç·ýf„Ø÷?üòýÛ·ŒÜ뮪êCÛèÖ1¬Žµo²MŽÙßl¥O7ŸC§©ADÍÿZÏëý2óÈèM×…B½ÀÊ"LLzÖèJÕ“HÐtØT-BDƺ;¹hf=9þTÇzýÓ×°„*2Ôg/¦DõE¬ƒ¬jj®>†üþ·}?Õd˜­õì ã*ÃÔ:'Õ˸ˆ(†¹7Ê—%E1—1ç^»J)^+7ÎÒL"?=ÚMâÝÏq µ«Ê\wxÔÆ+ôM‚Ù4l{c³¡®ÃUÍÝÄÇp“¡bÍÛl¨H½z¹ÍzdÉO¯{ÃjnC ] °S‹èÓUNžEDLêYêgXÍà£Wûæc’ÒI%óS}‚ܱ3K[ZdUfNÕÖ.Eñ/ÅrÈóëKÎóܤM]§T§åÕ aeBh¦âšþªj±¤§3¢P&¾öê ɽ£ã×¼23’U|{{t¿Ç/¿|ÿñãGî{Œk­°éÌtWÕ–Gôh ©PlW¹×¾®ëüësSw!ŸÏ[Tš `>;ÖÕWµ†Š¬XB° ÐzfðØ™Ì9/5µ–øÜ{¿]×½–€jîÓ×ó9ÆÃÜ!’kõÃà˜@^÷‰Æ»ò|.si^P븻÷«J Ѷ×9]ug¢NiQ—•ŸÉýuw*mï}ßw·*®½ûé­@‹?Ÿ_Ÿ¦v]×Ï0zÜ­ªbfì•ß¾½¯µæ˜Y¥*¹c?æ£}ô¦v¼•|%ÈDÐ¥:ÝÑ›{«{Fì{ï}äñ¾uuÕÏÞ»º¾¸{›¨ŸFTEÁJpͦÑdu»ö& QÜÏ<"Çhó3¨¦­Pôiº#ܽsp*éXß amª*êÖA_¼‚=XüœĬ3¾ìöbœ÷_Dºòd¸+w5u§÷‘ñ˜CÕìÏoþÏoñ0WÓøó$2×ÇêSÊ;‡‚“¡m ‡Šj Y¢2î:LMm¡ÃT\]I\ooª÷‘áFЯÙy>Vù¸ÐaS÷aKJYWJÕ3D4“¬Z+:L;lõ|>ÍÔ¬»:J´K”Uw”耪'¤éN^³â1¨Pàê»ö_ÿö‚˜²£îýd¦¨Ø5:8E‘¡.®¨¬ÊŒE2"«RÚþ>†«¹Ë×ÇSÄJ"ɬP@KDµiüÁëß‘2!Pzg¿HHRRX`Á*6F#ÛQ#•„¨#CaJiö¢^MTÕFë"ÖˉªÃÔ”“ë–о´ô¶ÜÔ¼™]ªuÞFÂÌÄdø|í²á{"*G!z:ëi®€Èþ¶CÝÆðvpßµÞÞÞT»­~÷’LÄ"£-úUÈ÷_~Ù_ŸÜk±ãu@jÈ,Tš9ª˜Áˆ"3KäT¹Z·ÇÔ»>§zÑb&UU¬Ú‘™QUdä ¸5ˆ`f¼¤íSV•î£ç¼Žõ»jÖcöJ33÷^f.h½Ÿ€õŒ6ç¨**DÔ},rÌñBOe’ ‘ί4ÏKED°wÌ1vìyÍX±cge1O©©{uƒ[„*g‹øÛMADæA*òˆ$m$7³sè¥mfw;·sE_0ÎViú”ï¥edßuÑz`70‹*XfAE]·»e =I~21†¶'’ÀŽ­Psh6;ÿ¯ŠŠô9ŠÈŒ÷÷÷:DT¥x#?%b¡¤›‡Å´m””*:'‰ÊRs²+Ðp·ª”¾¡æ¶I„|±ª*"Ï5Z¬­êIô´¸œk¨c§º©ðããkŒ¶Ÿ€»¿ z""kï6ŠjCý®kör]×ÞϽ£uÿµ¶ûx{\€èi;¨Æp·¨ÕÿÇÝwd_|[¤RÕÊsVe_:ïi*Çô°¸×~ÿfnz UJD¯ë‘™kÝû^4ŠÔVPµQßDAÕ¡@¡˜` ÌTÝLáEq“ž¹‡º™nÓuÀбïÖIû£Ýš_¦šÂJ2Š…Øa¦c˜¨ª˜s”©Ù $"Õ»ÍQÐÓÐô2Z ïß¾Çs@f)¤‰™‹O°ß©!t…ï}ýøÑ÷Mƒ}~þÈ-j¶¢ÙÀ¯`¤2«6‘"eíMá‰åˆà~Æ Ad¡R²w‡Šzí5ÎÞÐ J]Šª-šýÁ¥¡°Öæ 5‰Ñ®LTõ/²ëÖTRE] ÃaCÍ`ên>ÌÔâTd–‰¦"¹‘»˜jTHGÃ:Á¯Ø QÝBQ4µªìˆ\E¼‡ƒ™^6fWÙ½4ëÃ!SsŸ×¸6®µwVHoÍèê}ßÏçs­•‰Ü;"îçóán05Éû~{\Ü‘‘«"EÚp3qht‚³b³DàÎ^c÷ÙäfÜ;žëŽL-©öâÕ&Ð^šVjWo5Ĥ#Jª¦Šy=zÿ|>[õ dgFE_:ÍÌÆTuÕ¦”¿ø T¨¨˜]×èåfH„ÀZ7ÙÁH<hË&÷©Bw& î^™__{ïØÌyA B÷!jsÎ1<ö²M™íÌAÖ×ÇÇß|=×Z[DM¬Ã ;Ö˜#ÖŽsâiÁ]ï{w ×Àaèë @ºÜŪh¦íE¹® ˆŠ 4£ÚÛTz¯g£6F_¤ÜR‘õÓ#©¢ÜÏ{ïÈŒˆ&;›«ß½ÖèZ sV‰«º9…™¤BÝ;•DD½]oÚÉàKˆ}·7¤^ÜÌH”ØAÕ:f6üÛRÇü÷}wŸ«™™Î?Ã1æÞ;“ê:ûËú)‚ž«9Ù©úù˜‡ ã·äé û©ÄJæÆËÛ#Ž™¹"ìßÖ-Q t ¯_[U™[ÆîÉGEÔÔM2ƒ;:4¤ª×5fãïó?}¢þñŸþy&1ôE»[},5ô)=V–u:UE;áë¢æ0s¿2ËýúŠõË/ßwìu?Õ\Lg¯°²Qbª0Óá'.]@`¥Rä˜S¤ŸlTBEbÇœƒ¬½¶i‹Rˆâã1³J©f£}2PQ¸ôÙP%æ¢ê6Ž–N‘9çŽçZqç-iVÔ¿‰‰«Qjâ®C‰X;s7&‹"0›Þ3¯hIüø±Ã œ”â±  . ¶Èsl%D+K °BŸ×¨rŠƒ"$¤áËâ> j¢CDûõõ˜ÆÍˆÓ.­c¨SEM)QÐüTB¶îÙ€Áö+dQDçpÊñõ¼±µÂÑÂ"òíí,¨%!À0S³jœ$« jª})nº»ûœcŒQDdˆÈ}ßç3&¬*aeÕ®Í ¡˜ÛÚq?¿zR&¡›BPUïßÞÀÈŒ*m2e_%ýÚðÎ…æZ%¨Ìþ¦ 9Ü#ژ׼(ÌÌÇã‘%tdóÔšéfYÙHýþŠŠxaž÷SUÞßß>??›œ#¢Ã=3;[‘gAªmS·½ *–s>îûivœBh;Wg«±FÖß~|<®«—É÷*¬ªŠŒk¾ev/V¶Ù´GxÅ ÉvÝõ&À̉ÅTïûé¦B¶THÓ1ÆXû»•G*Ó_â~UÓL{·Q¯Äx_+3£÷º‡a®,öý¯2UÄÝÿý÷ÇÛ[³ÌÌ”ÉØñý×ï{ïçóÙ‹‡µÖœ3‹YÙM›PŸÏçp-ÕíÞkØ+«Æ.öõ¼ý$GûmdV¾QMTÅóùÕƒütSu»ÂÌû‡=aÉrðøYM=v4“äs/é –bf/ÿ.L¤w3fƒÂŸŸ}&å ãU£»»ÿ•"Â9ÇÞÙÉŒŸûê¾q¶úÏó'ýbXy~ËUÍâÖ1fæ)KcD¦µ‡Á”Vµ¿62X„ʯ¿þš±ö:Ê¡ýÝÛÛ¯~¿9þø§ßv&@‘CM³fÍÀš.Ôuu˜Z¬Å$Æ)Wõ¡¦j˜ ›p}~}ýöÛo_ŸÏ½w;ææôꕯéôlÀ Sf÷.ƒfÇ_GKŠÑs¬ˆØ9̾¾>jÞ }1$içëi€‘†=t¸»ÏLHEK$Cüø‘™H$ãû÷oýë¿îÌÙsÅ>NM­3T!¯*¨î¬2YÏ'Ÿµ{aÑ«Ia'úBŒ»„¢:üPGªØ‡¹µ–Ý–+Ú+ÒL®*ª]=æb.âcL÷.¾µ×‚G›|+æÙZЏH3ûœiû1ž¡XE’p!sÎᱞë~\̇CtŽqÍÉZUüºŸ…*Ö}˜þ¸Þ.#ÂY¹wURmÌÑ&@˜ªXffÅñù Ue ¤Y©ª¥Õí¬ˆè|I‘ ÃÌY¹#2ÒÝ…R¬–Pb§ ¢ B†`Á$*ܬÑ7sŽ*FÖãýê”êŒXc ¼bÜ]Ïtß·ŠØ°†ž„…Uõët€bÝë˜|*ÈjÔI@||Ì9›Ov²„é0Cì~máf¬ìB݈`UÄ653Ýûn!bÝ[´ã5ìG#Xu]CÀo¿|ÿúüj¡¹«¸ìœ(ÃLXݨ®£o¤Ñö¦êîÈŒˆŒx¡=Y+‚×’ÀOç„ûÎŽ—ÛØ{·¶™y”ß:€µ×5æ½ÂÝÕ4“×uíµ;>U ¸ÛÇç×··ÇsÝé~m#ÁÂ9¼Wtïž(Ò·>N–ˆe™iEŽ¡lO‚*D˜%*æ”Y™k¯ëúÃT IDATšÒ™Ðõô¬)G‹ßûîg«Ì½¢¢Pf‘?ïU-h{n´ÍiäO?hë«Ç'Û5§‹´Ê¤éÙ…û¾qåu¯[U¯a™Õ²ªÙû¸þþ?Mýþ˯u*Ÿ\MÔœPtªTUM*I¢ˆ!íSôÊ"S†«ª‡ ˆš³,uÿüüz<æÇß!UmÄŒÌ;Ÿ{ Ž4r§º˜ú¸.uÑ•m£.Žq}þø1†Á$×rõö8Üeêjúy bêe2Ü(ñ)jc8Y*:l¸kì;ª„™ dªéçÇ‘ü=pÍI¶"”Öšû²æc55"žõ{~)„«ù«2GT(„Žv?Ƣ„°’V4RŠšÅ•º¨pª6Lh&€ªX¡:`*£ÝJP‡O3sSƒëÁ] ‘«->¶´ª*‘¥¢ÝÕBT?Ã|({½+b¦f ·×™nÍüts·MLT‡(“0s‹>¹¬ù¨²vÌëZk}îåÃß®·–-seì-¬bź¢b¢Œ¬ÊÇ5¯Ç¬½n)teL„ð1šY•%Šh€u—ƒô´)¨ªá–¬ªN·Ñ}D¯3ú*ÃB2{’¬®¸ªjY’¨VÏ‚*еoSgðñxß±úD6÷ʸ®GÆžs¼Ü~TÕ{EnÖû¾æ?±jÌ‘•ªCMïû®žÃõT„V[³|øZ»Ô=6F” ÔDÎ’€D¹X°UµßÞæ$gÄÞ»rJkàîYþ ̽qÍϯ[å`ûp,+x¬ôÃ9ê§R~—_ùC1D¥9Y¢M3WCÌ5Qõ^(íI­ãknŸsŠÌD`Pv¯çœþããG§Š†i[n)PEQ –(²*)}Lˆ5“¾ »¸˜=ïýv½þþ;X"jsBPˆ‰·Ö¯"Ö½‹=¿]óA¹ª¸Šü™2ŠÙß“Ä&±3ž__+îªVÛ9ƨ"úi%(@íÝÚî¦*Pcæó3?v¶R =ɸ^²ÒzAT©C¤Ë´Èp…hAº*¼™±ªÐW·ÀPiohÏæíÃRU'M`Ãæõx:ÆÀñ—b /QP¥ 0ÀT¼å‹á0³Ñ¾35sDM´—öÃýRS¶©H8Ì;ó¥j$UIÂÜݧ²ùAª÷ QÌq%šh¨VKÒÔÇõøþýûψ•¹U•îíFŸÊ-€æ˜U…‚Q¹s7G©Dܽˆ½WeJƒ£;#¨ ±Êb+Hÿfÿì§ÉŠØ÷RÕ¬—}¾6Ô—¬HŸ³—@ëÇFjf½UŽ¨Ê¾›úÞ÷˜8Ø¢ÊH÷a/’„ª“ÙÇJu8‹lËl£Ì"Ën§@ À^»Ï;éÜ5ã<ßÀûÞ$ǘ,@¥Åœ¶¯4@D²ŠÄº—¹¶'¤SoîSDw¬–ÖZæ~J½òyE„vÏ¡…öz wQ­â8бêýÊëf`‰V$ Å°sÜ£¡Ê¦†ã/Âóùõ믿´©FU×ÚsÎýrm6â73rᆰöh’‰qdI&ÓÍû.Û_ koŸSˆµ×ÛÛ[UÀÔÖÞMÜTëE÷ñµšq‘Ž¿õ¨ªk-H+¥’¹Iíåjõžë‡bƒßqÒÚ€ÉôQ¤ªeÔ0/RUV³4D˜,ÐŽ|hÿ1šèWfÂjÑÚõÀõš‡aU±×cˆ`Œ¹úOD^£Æy‘ hhëFÖ|Ì\hñˆX{©»öðÇDþùÿ§?vC^|Ì:ìë¢BÂŽÓ¼ÚTN5£IFߌ :°…bcB*2…²ònÛÈœ#"L- RÜܳ‚%…tQwÅì‘ ÉŒœ×ÈÊ\i.±îùxˆHZ›«'eÌKÄ*OÈËÇsD·j8Fª7T£Î1}P¬b>?ž__•@•ŠŒi(vITÚ_Ó¥ž¨r珞²ïûÞØ‚R(`nÞŽk¸@/ƒ–QˆJ ødÝUe¦ƒZeô}QU̧öF„TµË;‹‹t.Ò?N¤ºþFÅ;Ý–hX|wæ½å-ϸI3V½;¨¢ê]¹iµÓ¯c½ç¹ƒˆÊJFfDϾû°ù“æ¯ …þ:´úsÅÚÐ2SVŠè5&ª9¼»YF„*¤*ÍÚ¼ •E…ªA(É@ D>#¼j?‘õŠçÈÚÒ6ÙN“½º ¬Ès1G›;DÖ+!9æØ{Ùë¾Çu±hvZ‡ÏÜÓŒñsÌI¶“•ÌÈWdºû®­€™·o¯üc+¿U5l\÷z{ b­ÛæÌˆ··‡ÂšÌ|Ñ·áÆî—R›¨Ÿ[Ùñ…óy•¦ 4¶öy?¯·«²ØmÖýÛÑÐÅuï¾õ¶é¸'n´üÙþ7•ŠYŠ">‡€I˜*ê'ñ‰sÎ~ õÚ¥/%g¥¶^ÍÀU¡Š[°ûyUµŸX/ØF6„.³ªÒ´«ÑÙy½ý|ª(½÷ŽÕjÞ˜cGuÁY_•ìe½×óŸ~û¥ å*­~›š«jwŒ´HºÚ€¢`ÆRW1¥¡0ÉD’*3A˜Ô½ž®§SBL‰FCCÔ ‘n ä^›T5É*¦ªï}ööíÛ_þÇ_ǘÉê,­¨‹,¶lÔlmõÊm³‚†“_ ˆ‚ •.Glm.7Ùû+V¶[v~+]¯("Ú?d@8®ÇÙ"FÄf·+¸N!1dšŠ›©SKs(Ä(Šp§Š·Å^6yLœÒQ—d‰[‘rÖÆJ6%»1lý'm_n6\\UÛ〢«>‹‰ƒ’bµWÍ©°DÇ03b§ÊTÂÄ"£ '¾ÄÕKºTY!)Scb1²Ê‡—tO:D´Yx{¯ˆ%Š1ÈÈ@ÁTÆeû^›¹‹å"‹,3E!Ö½Û±@¨!’ÌpõFd°²OÂBI›‰Áª$ë§å³pÒLÑÇþIŽa²º@ös{&Q¹Öjˆf¶›Ò)R##¨jæE˜éЏæ\kEÎ9Yen÷¾AÌk~~~™yæVµ¨“gl/¨v›f?&#"ò$i»£4µæØ?:B•§"1úw=æ€ÀmÄ!ð'iyïÝM;èò¾V7“ˆ¹“$÷ZMŒÚ;:aÛQÌs&9†÷WFÌ’±¥mÝGR0ÕooßvìÆ2ÿd‹jDýÌþìtÄ+6| {Uüøˆvm@ÐÕú¼ÍLãåŸQmYʪގö®>*û¢œí]h\eK,6Ffu,q­‘"ç°ÌÌÈÇõhš€­Ãœ—/Íh‹^ÖtÓE/Ç3s—º©˜˜wA4Éû¾›ºa>ކhî6²òºfŸõ­ áÕzÖ:OÇŽç]­•éjQv<«i]·I ÀŸ¹¹voŽ1 ²Öî%vÄVQk8èæ®÷å+g`lŽ·wüaÔ¯¿ýñ—Èf)x—˜œ¦§ аû§H!4³çÃ^Ëû¸F‰¬+pïÊæÚw(EÄUAÐÚ ßÛHRBImV4^ß×TuPöÞ÷ý|{ŒußÙìLh+BÌÝU$J!ɤĈc¨yoEÔd/Ví"síûùyß_0ÉZ÷ýõû¿ìç§€f馦R 6œÀ¨/‡˜Š™z‡ÑÍL@ÅüŠRÒ]]€4w[ÕÜÌ­ùn£§\†èjÓJ‹ÎMJ¡ ÉafæÏçÓÕ(T¼è¦M‹UZGÉH1s¨š¹—ׯ|µÍ–ò ýñцdÑaZàk>fDš¹é(V£ý?+쫪DØ,àlU›D&éc••×õf¦ 1 ¢×5ÔÌ4++£²kÝwV)ÌŠÞjÇŽˆÌÈØÕÆÇþ/+wf¡ß ÉØh2ª‚ÈÃÈl·æ0QT+ùþ¸¨x>Ÿ™aÒ-p΋̪dfS*ÜL(>FU8fö¢‚]‰e'm }¼]ŸÏOƒiƒ’:=Ýó#»ajÉîèû··ˆÍ,(+‹ÍÃ~ý¯ÖÃ>ŽIvÚîu;¶©1ûæÖûüroßHµ¸—Eè1³÷Ò‡o§a{‰-"±3¹¡gDâÇß;£KÁ£fCGd6ºR~b»H775‚§Y¾ýðgqPÇ#²ÙúÙ|Í9ÇÏ€»¯µúåõ`Û†®>ÆÕ'cdt:¬V{íyÇãHVVOf­þv¤ê–;0µ¨=md„»‹àùuê=Óšiw@µM¨™óYn÷¾ÛûØ|{y-A{K,î±; Bõt!èMÑ?š‰!öÀ{‡ßÇà+XúZ-""*s4¯r’Ûí89ë×CºƒÚÔŠª2sª¸YUTÑ;¶ª4y‚$«HúÚv³ýxv÷"ÜÒ×ó?þ‡?ˆYv¾emr¤ºç‘2UUQ žÒ¯1©â>Ü ÷½ª¢ÌbÖÌ–qU,™ý©éPRsZT¥Ø¥ˆ(H ???oo`ÝÏO3U³¢FËÍo’ŠÌ¢óM"6üt­P2ë¹VÄ®ÈX+j=׆(á_÷××ÇïÈ…!ME©Ò= ¹•ð1¯y’±™lN@C•3"¢¾2S·7yb¢ëfbÃeBmn–ˆfQUͯK̦G[l¦_Ζ¨Û…ɱ–«º–EÏŽæ\öYÞ6*SS!-¢Œ Sƒv{%ëßÕYcx_«{Üs5U¯æLœÂäúù¡ìO੼W= öŠƒ™9 šÜñ·ý‹‰~}~ºŠÙ(ffTf“FÏÂzÄ&;ÙÜP Ƚcgõt#çlRQ&RÌîXËêz@+{ñ`eF¥ Hi;Ði‰iM´ *ìu³R22MÌ̆¾¢Ç+¡€ÈŽhºµ¤j¦Õ ‘ì?·½VU™» D”¬µîaSM÷N@Þß-Ùgf?ç‚<䀗žmŒeËAªú|>GUvØä¨—ì$­&û1ðï¦HõâEˆ4CMªiˆØ}¯Ž^þáÜ+øZ6fVŸÑªº*E¬sgsôŠf6†ß÷9‡WU=Ÿëp¤«ª¶¨²ŸÕǾÒ?uÿ în&Ç>$Ò'Uãºï§¨ {m*О–¦cšÉj}£*º5·X™‘Ö’ˆºæUMÒTŠb¦>žú¶Ç˜Kgšg5܆t ø&ÇÑÏL5¯Ê1¯þÒùˆØ™cJˆy½íØ•5l´dwØýÂô0Ø÷Þ¢Ú5^8ðUµµV°úÙÖxvýèª×f»/}úWU_¤Îsݽñß¾}¡Š²jEªHtè±½aäççgÍUÕÞߟ÷¢‰H¯þû¿7sªŠz¤Òò©hFiϦ½&UEbÚÞ¦NU['³5“RÁçý¬*dhƒÝ;‘gPtl ÁbûRiddí€ U]±âãë3vtÎ+`b].¯]%O¨ÝO#6ªŠbH’ˆÌbI#¨XEÜk/ÊÚ»ò)̵²±ÍýŒb%3ªrŒ9}˜ús=ïûnt…jÏA¨ªý¬/`êfqˆºMè0³¾r ÍKª‚Ü¢jòv¥¸©M•ê®2†Šd©Œ^üºÖ¼% ¨6MÐRÝ"·ª‰fÝÞîU.—9&Z0~eÄÉý¸þ…¢úêúîÓ­?|½?ôº®ÞÅbÓzâ¡Ðmä ’Ãìu«•NEÝ뎵ÖÞÃmŽQ{Eîêò†ªXçL*d¬uïûës7A…é®;·‚"رûC¯£AÛ¬jFáeÜîr@têŠíð‰rWÓaZ")…¬¬ {GSa|\Y JB›ƒ"÷ºç5\ Ì¡^(©^ó–ªÍy)Obèñx±w|=Ÿc s¨áÚ‡µÙ¸ã®Ó {­Çã±b =ÊIøµ~¨Êû~ª‹{7%UÌdöºÛ€  †î×xTÕ×Þ6ÜLû1P,ôžº! ::ïØ‘®Ì Zm¨1&3ªWhUû¾ïöûWÕ'¸]UëRÑ•«†v 'é6ºëøºÞîûÙŠ €çó~<æ&xÞ÷ðAòëëËÌ|4S’R(”4Îõízk¤·rÉzåºæ ¨Ž†5fK¦’ÌØqã¿j êtYŸ6Ít÷ f”™÷ìW@ülTR•qydeºe%Ä®G— •*â̾溉aí²kòO¬ïo³]×Ñ[–1¬êx·çœU•¬—é3ͼoý î¯îÏ<°ª6S¤S÷½D…™…jØ}œtÞíñnÿÃÿîãë‹"ID}üþOÿü͆š‰Y ¬WiIJ’`¨+l\ctà*PQÙE Ö¾¿ÖBnï.øáE$)fY€è×smbugm:ÔHD—h«Ù¸~Ý ¨ûùŒ½{/Ý[ÝØaÓÛ²†^D‹î½»öu¯½wt‚|W~î\Uù‡‡ÿövýƒÅ;žïoo¥öüüÌ ¬’J¢û^\Õ²öÇç—™©ÚC]ãÔ"K `0m´žë¢›Ê€™ºjb"•¨%êTŽé8ú}RKU¤ Uë!µ™—¯M^ßÏÂÈ}p¨‹ºYdQÊ…؇º y>Ó¼÷Zl%¡ QÚ÷þÞ±ê+ìu¼ZMzÝuH¬Rd?ç¬ Ë˜@XY;#ZâÙkíµÝ]¤rMcH&#™`ߣv1{#.hW!#ãþzvW;IÖõÎ$@†»57-Q™©Ò)—(DH)©~0G"ìœu\›d‡„c“°~Îöº¯„ñƒA.&6ÜM«’ÝO®u¿_o»MˆMJF&k¨}=Ÿö¾§uHÕÎ$ú!, _›;6¦-ãþŒÉî}¨ÂÞ1}vÄ_D:®ß¿L;~ün¿hèMgM›Vd$Æ5+´3TdŒ¡ªÍi~~=ï5Nõz¶õÆö^×xö°¯"÷ÑVà<Äæ^"¢ÆœkßÍ!ÉêÉY{èìú^D#ØÍìùüúþý—ÏÏOŸS¯û9çcïUàð¡êbPñ.]`•¿b{íëñ7½:½%ÖÕ·¢Úp7ÓŒ4›d­~´“PŒyUÒÕ"¶¨U¥šeä5&^@ÓÌ”S݃Οò,r)ÐBµµa’(ªgm¦»G¦¹F°·†×;õ{=tûéW¨nŽ(S)Ș³}Pxm™¥%µCÛ<½½®*³Ñ»¢ÖúÆuº‚Ž[4÷.à¸:€æÊŒµW3žûñiÿËÿôŸþÇ_~dÓtÊóù×ÿþç?ÿùz<Ú€¨f«nDA„EfoFÛ1 ©ARY¹3sE1"ÂU(S‘…*˜ Þ+w «Ô†‰©Û»»³l˜@vì½Ö¾×ý¼U¡ÖUæL5ø« ÏçÚÁüº×½âÇçó¹ëÞ±3îH³üãCþô΋6ÿåëþ/ûxðžcÜ¥ÏPw¶Î"Ç&ÞZ…)]ݯi¢‰2ªˆ$í³¾`*ˆø!¹ ˜+D}H{ÏȈdm7Åp”]ïôÚ2iK¿½¸s€òœÆu8"Ðf4¨Ûñ;· £c¤·:""BîUE“eæBéÌWWv´Ñûçü(@ì-Ú M½ (ø6Eå>!É#%Š‘ÌB%ªLåý1{Á.Ú.uüöÛo»VÆnïl¯<Ô´*ºÛäÞ;Öê;›tÿµõ› 4°‘³ h¥°j“¹#¢vig†X]—E¨™å:Ì«˜‘E¾î¬ªB> äÛœE$êñx4މâõ}UZ±¯9DõùµÆc®ç3«î{Í1*é×òóùY‰È¸×êC¹XzBFP(+¶ýæ´¹°—‡…þ%-£e·ˆàÏûÛûûÞÛ}ôŒüºÆuŒ@õZ®÷÷÷>k"³Eyß+É¡NÐEÕlïÝq­ˆÈ¬n›‘½sL÷a_ÏÏ9fEiÇ;Ö}!îíãcÜ÷³}íöžX!m @ÝþJ§Cúß;¸ŸSnÅžÈÁûùõüoýüþ¿ÏùÛ×çS«~||ýøØúõñ—_•[$*%=Žõªp)\|˜ v°Ld JÒá"bnðÞèà`)܄ª5/7¹ËÝD„¢Åb…› ¥ýí/ó!˜ª <æ•Ñ. Íì´PBD gƒÔê£À¥DDtØ4wQrY x‡®å¸&QÅìA ,y çÄÝlH‘½UP©ÊSB²²ï†=k²Ý,U¬ŠÏÏ ÇpD&¥2sÇYÙsÕÊ(JÕЄ<1ÎÌ}W†cŒ)à\aD¬óè]¢½ Î9²z¡- ;¬BjÆ1SVí{UÖ¼fëÌŒ*Ìöts¡ºùÞwd|{{¿ï§ +3i‚y]D´²"­Y³ÊT¥LÈ$;ða¤~ªhìj‹}ÛE¥²VDw&WITDæûÛ[î=æl,ÏÏy¿÷k­ëºú¥öQþõõÕS¡ªê¡“¶S ð³ÎÌ>>>ÞÞÞÖZç'uoßYnjê.."°2ý·ÈB?úû÷ÛÑèëq©(IÕf ¢H9b©íµˆŸt‘³–h5£ªD›QÊÇÛDs´l`EAÔ«R"M*k=}޵nVçe)àÐ_³P¬æ©©ª‰™žÒ QU)yÞÏéNY-ìˆ*¸kf¹»³dB€Èl¸œ–t˜"¦*j"ܱqž*"Ã,«„ór·î•~­‚‹E(ÔmǶã|)²žk×Þ×Û75‘½såz¿Þ M’öïšG5€Œ² a»Ï@D"×^ËÝEÑÄé#™õÚ¬­Ànfÿ×ÿñþ·ÿ÷ÿþëç"ñÜB i¾þò¯ýËŸ~ûSçШ`Õì¶äNJY¡ep}®Ú…¹˜UùõU¨tÕR[+Õ´\µ•›•ÌÁ 0·B«A£"ï{Gä½î‚ˆÉ&7-’Aù\ûó^ñܹ`;Æý9r?™ûOßõïþ8}ê{WF®OV!·rýö_u=ò!fæûxæÞR4Ÿ&FSUɳ´VSÚú$¢^s (_Œ~ãÝàBÝùX”( FA˲?Hˆœ«¥öF´+œ´{nÏ_¡¤BÇìz0ÔœÒ;Í<TÑ$ ¦îª Ššw÷ÓϱHŠ’•*†¨Ýµ+CLú&Ûé@˜¢˜««€ªL–¶x±R¤TÅDv«*£«ERD3#sƒÙkÔhÖeFæÎê¹¼ºX!*Eº=#Úã×% e³"+†é/ßÞ¯y™™¨S½ºÉV픉šeQ•*íî­nw¡‰@ö½%[ÅŠ$´bwq&Q­7oŠ™uNº¦zhGˆM%3†Ü™í­ìJ£ªÌŠæý™÷šãX©j•ÛÌïçóz¼âb «7Ѭt³bùIÕ¶›ÖÖ}Ow’÷Zx™gúÜç)¡Ìˆ˜sª6Gó@{®ëjäÀ£§Ú¶ýªHeŒùÿ3ö.K’\IšžþªzŽ™{Dd&¸UõÔ°«k†#2CiÎìøä– Šp͇äP¸ …dOU×—* ‰Ìˆpw³sôÂ…Z {x+ˆ@2‘€{˜£úÿß·°0½DAê—´¦­­õ;×ûƒ½·¶4›ÖZÿù‘ÝZ;B1Òâ0 Š6­)DF<ç(AWDÕ ‚&B"×ë5_j"•âƒ۾ߟïÌf¹D˜’EQ fN$³ôÞ·1éž™Ê<ÌÊUÊ bÍHÕ1QÖªTdÑ#(Èݤk½´çʦý6ö¦Í3äx¥qE•ZÓ0¯¬˜£V"ª:Ý ?zÈüŸSZ«6>³Peâ(U&Q€¤ÚèôOéRj*qÌyRX·9nOÏçó›9*+üó§–•ê(ST˜{I¤ Kký·~¨™UµÀºµÒô‰ü·ÿÍý—?þéǧË>S„[óÝÙ‚™xìÛw_£œŸ~ò !HŒ¬du™#“ùzLóq³9<Üb¼ïs¦_’öÈ½ÉæQK&aDXI×’Òâ%ﻦ,ÞÐbšÙ|°ï‘y–öFè“F¯xž}¼nþ‹3!‚ãfsáûWç7Ÿ¾úò‹{QÜ6ßͤa”dæ&OCÞ_óirp»e½¿[úr^דö.kH“™uY£ =‚˜š²ˆBp»î{;<ÛY IDATN°°«P“’ã]‘ä&D-X™Å#™(ŸUÈpóŠÊ‰hc!£Úãô2†  ´›Â"…YkE\ï$QPîî× æhù×…±4d`I‘bðeåÇz!„ø¨MÂÝý@ûJé`‹Yh¶z^›ÍˆƒŒ-@Hˆ"Â"¦ûÌzE8£õ•¥‚Ûf€‰K:^gBzÚÜžÃHÛù¼žï–z»N&ψi ƒÂë.¤„(T€:£¥J5c™fY„–šÅ³`Nc‘õ´"2"ZëÅ&|y;ÄhkÂbsHåÓzïÃFoÂ|,, `‚‡/ÚÈÉf)v³Ï*ºï{ïÜ¥é², T¯Ì>&3ÌÌl.‹<ÇÄËT¿ ÷¾¸Eë:§‰èœ£÷^3"`€rÑ !0sP@P£ùgŽõ‚‹h_×ð€*=Y×……ÍŒ˜Ü¼‚õE:–îÌ\ñÐis]ÖZTxXR°Ô‰ ]‘‘§Ó”e…Ï̹ï§ûû*R1ó4³9™Ú)¡úô$”Vï`d:×u†‘žQ}ú‚Eeµ‚‹P Foç –&äL$RêôqæŒ=¦JûysÇ̵ fŸ–” UŸS”£ˆN„ì‹ç7 ˆv&Ti-‹‚—!Ì]u³ °Lº\.¯1›õƒn/Óá¤ÏS?8Ó)¢--¼¢±VƒLr%.>Ï‹#DÒ´½”¤¬|ttº}k-‘…z||\×õ¸Xˆ¦çm¿­Ë"‚u]oû~Ûn‘IFª2Gæ>纴1ÜÌŽäi’Ð&ÌìfKk/ÓÑØmœïîæ¾ËÚÃ1l.m§{¸OáÖ•Ù÷!r¬Ê>fJ 3gV& ‹u­%vAu”ˆ2I—…Ü›´ *Øi½2M[Kw¥º°P&A ½Ù܉2œ’&eÌi,ÐÖ|N’I d6mExMÀœ(¼Akïîûív:X(Gš¹€ÃLD œU ñÌŽòknu‚ŒV=N¥Þ|ÙDÂ<ÓŽ/$‚TûG‚ pÏTýì¿üÿïþüõ·6¶·?¼{wÝ>îq›~™Ù ÎüaækåG–öï¿Ïÿý»ýˇקÓú~ñpg¤‹ž–óþôñª:¯·™—éñÓe$Ð!Ȥôýúo˜òºoBJ܉Ó_Ÿ—Óª_ÿù'mü<.¼.ýÓWç_~ñÙç÷”i1çÜ>¾ÿf8ùn*PÈ"[Wf.9q@NæÖµ‹ÖÎÝ´+,Ê`°¹ÙÜRÐ,k­"Ë¢né“TÛœ7Ê$wéÂ"ÇXF"‰HHR*#9D­èì”t°»+Ä”¤"s·YDTØ)pLŽvu·H¢%Áq3ÌÈzŠ$Á-’†jnx9ÜeEä“4ɨáp ‚ZDM·‘EÅ 3ÌBã¦3™e‹û$·ƒæÀjIsDˆj¢n¦ª“Òxi %y튄gÌÚU«²1#™Ürg$ n–Hwô.„Æ]>}Õ~z¾ýõ½Ý†Éñòeˆ ®šGE6TYÀ”¼‡=}ØßóeizwZ>¹5Ì¢¸?ä!M¹Cû"ÍšH½ápÀ k"dæ"Uþ@ôîíç¿þ7ÿê¿úñ¯½Ó׿ÿú§w?|ûî»w—íÝ“mO š» bmÒ›\=ÿ§ïž•®ä‹·›‹MZ…¸ÑI±Ú¬I˜ƒ‰÷È/ß,¿ùÅÃþ«Ï¹ËÁ¢½i—¦ÜGFŒ¿ÿ» a‡X¡J)‰p·‚Â$AaµÅÆT1gÊdŠP-/8 Ä&šsfÒ2(¥ªc/ShJR®~–¨¤E…÷‰9bÌhmÑ9줧±¥Eøm!™µÞ$ç}fW¥ 0ux ’K.Ç¥L¥í 7•/bO÷iNÞ˜k¤4®ÁÝË(‡#ÐêîÖhBã%®_9b}™'$¥eÐѬ‰ˆ£ªnNfQuXѦZaÏ8’NAN§ü?âÁ/[AJ²¹eÂ=U+œ¨±@RVΣ΀$ˆé &÷&R÷  D¤g02ÌgÉìÓr΀ʲ.iÛìO?^‡‡¹õÖÊ>çû,Z¡UàSDÜ3Ó¬¦Y¬m›q™—ÏÛWŸ¾zµ.÷ !g„qX?-1%Âè¼xì Ho˲>]žš¶Ø…ÅÌD[W÷Jž+£j(c¸MÊ`nÚ:”s#DbZ¶Œ9mYÊC¹^‘ž¦­®§P©&Ô>§6]To·­‰nû~:Ý1…§kÓ9÷:ò»ûS¤ï×pª”Kï™{ën·§§‹€—•ò˜EÖóÙÆˆˆ¯^½ª]‚ÙLð¢bsKï똳ô½wËätfÎðCs5cèÂH–Fîᤧ3$Ýç‹ Ì”y‹ˆÙ½Ð_ 7ƒðQ“²“”¥SY"RˆÌ\!¬J¯]WaÜoî]U•=sÎ fÔß ƒ<¦ÏÖ–˜C@#hlSû?!ÖÍ¢µbMØœ„`h–ÚB)Â2N]¹f&¢å|`Œ`m>w: äÇ{Èw¿n×ûóƒÙR•ÂDŠ(î_½þWÿöß}úÉßýíw?üåûo~ó›?|ýÍŸþøí·üúÝû?^¯OÓ(if‘u,ÓפûgÇk¡_žâµêªŸBþÕÛ·_œþÅ/Þ®§»mŽ›ÿöû×q}Þ|Û÷qÛáŽ,—zZRÓ|¾¾{¼DÚymgXZƒ4¡$ÔJKZ&­­«ÔF”‘#X‚€æ….¤ÖÔ¦õÖ`u^ƒf‚Â<3gº93D«A‚¢êBªˆ2f†ÆÜ2'åYTf&œÀ`ogåˆ Rgc$(Q©¨Pf€²dÞ-§¢LýUD™¸Kt#çÄLZjIÉ”BA‘3é;s5pD‰®‚!Â3jQE‚ª¸O›®õˆDŽ«t(·  ÌŒðô&†GÖQݦSXƘÂT‘> F[š°³‡Ù¬¨f„‡‹ª< a¬ é‘„á–„ŒœsΪ" Yqrþñr{ÿhžLåó"&äLÚökÓ <Ìö@.ÐÝf!b7c´»« ïÛ¶GþvÛ3ó«7¯þåÛ·ËÝz·®ï>>›¦çž>œ@cnm€±¬ynýéi¤GæAc!"Ë"™D]yEx;ë=î)}º·ÖÒ£Ò,PêÌiÇ¥ï|>Õ#gmKj6}ýÔ¨†°Â;‘¨¦ X—:L› jÂf…¬ˆÓi Šóùü´é³A"Í#‹Ï,ÂÞI’%l:ÐÛ©/­f;x9«\oWeáæ±ÐmÛNëú&÷  ]ްy…#|Ÿ;I™ú‚‰m­»ÇØ÷eYo·c˜™a¶.k_2ü@0j‘û>*V¯*Ew˜s¯ƒºSmzë§ÀŒT I›!‘”ž¡`'Ï µ­cmËî“1œzGÚtmLDÒŽƒ”»¡5аpÎ"0¦O‘f¬ ®«*%t„‰2Ç!Êî'½nÛ‹ŸæNàÅž²L1ÓLµ³Š$>²kÞvCScD¦KºgJ°!)ù aº¨šùý]?ʽ ¤Ú¥ÕqŒáfËé4öýt: ·L¯Õø¶m­µ,Ö;sëmß÷ݶ¥µ1FÝÃ<<Ü•&jŸèr·~úåÃWï¾øêë/¿xó˯¾üÇ/>ûá‡÷ƒ,¶ï¯OÛþý“=îí:ä?þëûñ…æ«Ö…—7_½ýü¡­Ô“óšÛûc›¼Û6oWŒý “,eÑF$D‰Tbôó‰Àà4ßæ>9JMª²F 2•¤µvŠ3Ë!©,„PU#CRk<"£7e›ÏUç‹ ˆQD3ñtq÷Ô¥Qhå±*à+Q|¡‰YZ+ z’êÒǶ™ÌB‘¤DINIÄÔZPr2‘P˜C33#ÐUÜ…™›7ŸVyÊ)é1$™”!ÜܶøÚZPEk `î‰Àa¦/uÛQõ}Aç"E2¢¸fI¨•,yš»{3Ò2³ô&ÌI^,-€Üfµg8Kñ$ SVbNA¦që•<í Ò‚W‚À,tؽxï$dMùfôãeÎa>ÝcXC òW ðYx舖ÌäÓ©.ÀÁfÆš,ì¢ H·‘¢ ~ýÃOÿøÝ_gä¿øümýÛ¿ýÅ«¾¼Y—mÛ?\ölÙ4Âø~YT9i{XåÙÂ"êécš§eÝç$Ï(zEV5˜ÙæŒtbˆ(OóÖäÀ²›©êÜDzh"D˜™"³õžLaÞ—vÛ®¢…Ì×k&ÌêCl*”ññº­­§' lŸ­7Û B ,]™»ÍÂë·bõofçÖ®‡;ko"fF*mÛo–“¥U‡€­-ÛãÓé´¦§6±Aõ%Ú÷@ï-|Vƒét:íû>Æ BxÔ Tõa0sFXnÛ­érØW‰TÅfÕJS¤Í¹¯ë¹–Ì>|8N\“1÷*—Õ}WUŠœ¤àŒè­E„‚³‰m žaé^ÇÛúÞ DšeÕåìÈwRÅÑT[xX˜š4óID»9'A`AEUŠc²ràT<¾v¤Ì>Ê»å.š9†“ÊËÅš¨±³lÛ°HEfP$s¦ÑÀº¶3h5¥J$O³JûÜ®WÖæek"cΩDæŽQÌú¤*)^“zëg¦“™qk ` c*œpå“IDõŒQïÒßÊéA_}zÿö‹/¿üæ‹Ï?ýþ¯?=_7Ê´ˆO—o¿ûñÛoþ2æûÛ Ïäñoîž?…¿ÖÆdŸ|º,mŒ<6ãâ>g©Òªœ‹.EÄ%Xš™¥t B3;Š Oà…Ù 㣵JŠpÌYYÝ#7^ÚÌHAk1f„›q—¥÷z§GV@ˉCYÓƒÊG±Ô£ú µÿ÷Ö4³©½ÍØ9%Ãmš.Ë5'Þ9™àû€ˆ1¢ªðLib‰„dM*…ãR¨úv0—t‚Ò”éŽÔ‚Sz°{‚Ò)cŽw›™èÂ&I0”…‚fâ t-¥ÇdpI'êºçæ­7d¤!")Ҝ¦Y¹fä°­µvÀ@‡¸0¬ÒÜ­ÀÖ…¶'"„·1¬pÓ§z×Z4ƒÂÍ2án<Ç.Œ¥´ö—×ËžªÂ`tá‰ÅÌEÙfx”¾Ñ,rì{2Ìn”º×†7Cµ·:ÍyŠdc1ÒE2Ëé´,i6íÇO­·ÿñþ?,ŒfüÍg¯îïú¯¿ø¼KçNëé f›ƒ#˜ûnÖZó±ƒÉ™|ü\erzˆÔá–ê˜Á ÝML–—ÈÆ”.Múp§DoêfQN4›Ô—Ȅǘ°&9yô¾—Ø-rì{ï]é&¢–a„Ó?mÁÜ®¬§å|Û·9§¨Ü®›ŠÌ镊!áp«øS¹ÉÌfµDĆ“'¯§R3y†oÛ8–1æ?1˾٠ÌÞ¢y¹ÜÖuí½sŽLZ×õxfæa~é“GÖViÕÕaå ã~ž ‚ÌŒð`B@‰|Yš ë­©°»O÷µ tU¹ªYY+ÌDÉ„².·Þ»çTââýD„´<0QPÒ4°›yÍ3Â,’[ý—Hƒ‚)‘0ŸIr>¼Ãµ½”ÞúÍ]YŽÅ Ç>b"R/ÂËí&" ¤Ì£ ¡€‡Y/Òˆ/Î6½Ð‡¶±#Ñ!l‚»EXkKý/TúOÿbíôê-¯ç·÷ŸÞ¿ýìï>þ´ï#€§çÛïþðõû?nÛöýÓ~Ùæ¯ÚÇ7t½—¥)I_—ÓÙ¶ëÓœÛå†È+K[—Þ9#µ¯GÁ{!°J Ø]’ŒÀn]Í-Idá%Þª2C$aûŽeiíHΘÏÖ{f‚›0vŠ ×Öèv«VˆT]‚‚½Zøá¼´#fãÙ—%ƒT¨†¼ÅüËDÅ-DÛ~jjiæ#E9f$rJ€Ã1æÎ¬ö¨( +@]ÈnBLAI)ÃfÖ ùBÞ?Pç$Ràµbº@\ù4ÀÉ=¬(Ÿ–êI“Ia‘)”©ðÏb¼q²Hím”¢àD"ÁÙµÕ9”ôÀ¿˜!"y$€ºüs––;̹œOGV5i߆ñGJßNšþ0òòaΑ–AMÄsÎ ÌpßÓ¦[ømÛ‰ÛÓ#̃YO ï3"Àg^·[¦3QR¨´*S[Ú"mÛ=ÂD[æ­üG"r“ÂVïùÛïþ âÿõïž/×_ÿò³×½õùC¸Ù©?ÜÐt»ÞÖu9ßÝ]n7Û­Ÿ„‰÷éD¢žé$*Ì)>5UeOdÎ9æ°ÐÞ8’]e‰Ì&«ªÈÒ{R¶.\sPÊ}ßX(ÌS“¢êx)*æëÚ™Bª¯Äë²ìÛaLbHpÔŒR‹ÉæcJÇõ²©ÙAeMÆœ³·6æˆÌš³_ž¯¯ß¼cëMéEü´m·Ö:½Lò…Íì~Ñc©äpUžsT]`]WÕ6m")(JD!ÚO'¹Ýn˲´¶Œ±ƒÒfÁŽ ƒÂœ™2Ì‘A NŠiænþù77weqXE…us뽃0#ÒÂHûÁsâbü³Î9pðt“æÑDGfWáHb2 mEj¡xJ  VÈ‚˜²‹\ç<õö²Ï¡}é­M˜ùHϨ›Ý ‚)ç,è‚DF$‚Ÿî¾ïã`„•"xzº¼º—äbcæm½ýß^TýŸ~Ço¹ÿd…³mÿôÛßýî뿾ûáûÞ=Û[¹üj½½Õ.J"ôêõ«±=ó¸­+¤ŠÙMÓÝZÒë /?1ÖÞ³ô&It¯ˆf̹žP鮽#‰´-`Ô¢DUÒÂ=vJ"Ò$‰2\ZoªûvMâˆÍ$‚“Á œsF¹ž„‰¤—?ÍÂLL‹žÊI虃uy±L9 ƒ„Õ£øéÂ$ " géåv »á^ŸÄV23¥† ˆòHRÖ L ³[€pЬÐp÷ÄìXœB,îwfx]ç2ÙzKO’à $žû/áQ$3¿ìÕUç>{óH†H! aq³}ŸÂRæ@ JÑ ±ŠËÒ‰Õ@ö™e Ò¾ 4Þ÷AiT`N2’êQcùîGƒ$ƒ›l7ëž·ƒoÛíºÍ}ÌÛéiNDŒÞbNÖ>§{Æ*¹Íå˜>ìzÙK¬èZe`¤ /½õÖ–®ËÒ—Hé²]öµ÷ d‚¥Z$’ú²„‘о¾¿ÿö‡ÕöÿòqŒy>õ_|úðë_}®6jÃËùÕÒºnûÞœ6mL§¦ #…iÝ¿ IDATrš÷§…YçœÄRÌ­iέe’(é4óð¥5ŸiiË Ñ©xQ0°Ï[×µŽr.‰Þ[¦wÕ™‘R1ŠiÖºŽ9TùùéùþᕹÎS[[מÌ9äÌ2ªn]¼Lá¦fjãçç«Ù‘eíD¤Z@x2󙾨FFZ–ð¨²Ì9’’˜À<ç(*õœCµ!kÙHý¤¶]WaæËåâîsÎ ok·MøÈô„hÎ+ÛS”s%fx-gˆˆ€cÖôð U¥d÷ÁL×m;ŸNDÜ$n^ ²TdÕ¬ ÌA1J¬ŒYùj½'Q'‘¨˜MUusNrí-_f2Ì”1¡‚º ×O q‚ÜBI%¤snš Ã¹t¾ |z¾½ºëÓ³,£µŠÏÈ~a{ï}ßG„3Ò‘„Ì¡ `ŽQ»÷iór¹PíI°ðìû®ÌŸ~òú‡ÞñÅg¥ÿ|¸u¹^þ^DDåŽ;+Ñåõþݾþú›ßÿîß<îa·ÏÏŸè`9÷®ëýÛ&1’YéŒDÑNÃR´Ì%Lé)U! ’®ä a’ ÅE!ÂHÔlJE’¨±:'å°‘èÅ™ ”3k™˜”Œ,„Èé|<Ù³Ž«IN$‰dáa¶J÷DõËLK@Ó%"Z'm ”ܺ £$3"a -©b )BR ~”<ÍEYÀV×i–úm‰À”ÈpÉP‚…IÂRBáH(àT"2&BŠ0ˆD4X¨èÊHUÉHXNß@œÎ1÷ZÖ…¦ g¸ pd¨è?HbÎLOæT'b*'K&È«íD’s–N#,˱EÙç,I!…¨qrb‚oûi6<)šôÖ™Nkæïß?ýts³'möô¸Íì¶™Gþý¯ß~¸\ Ç !&VmjLçÓ¢­Ñ¢ÃeékÙ#ò:çØƒŽ­¥¯K»Ý6(/]<’Æ´ëõVR°Ë³}=Æu›íÄâþêõ¹·µ·~ZZW^”IUµPª”‘ D_¸ÉvÛ—eiH»ÝæùÔ,)âi£ìÁÚ[FF:%§9 Ù6D’ÒsˆÀ¦«²Oƒrú$p8B”uŸH,-3)¬$HÆ¢¼Ú4) # áÆ"6ˆÔE÷9l*·}šûíréë:æŒÈ1.ëz6³³œâðÆ»êRW‡$êm)2hu¶m{xxµíéiiKA0E[†™umÓ##žŸE4ÆÞT™UŽ®@íÝ ÚˆR 3'3™óÏXfgå KÏæ™ ÿ³¾ 7ª.ûl¢Ä‘"Rˆ0Õ¥N€ ÎkÆ¾í­µ¦Í["S€¥5:Ñ%W`"bŒš†yÓæs¼ôù9U ¢éž8ú*!–à@†'3‰ŒÀ’‘ùóHsÅáÖK¡‰¤1Ç`fëzRíµzÁñü‘ãsÎ"j]¯×²§EF×¾Ï=bëôf¶íû"²ízyúá{¸¿áçËs¸ý¿¼þÓ¿ìÃ÷øý7¿ûí?þå§çÇÁ÷’o”nÂëzÖÞýzUUN&É<À$$¥g¦™à¬¶¬€Ä8 Xà™ffvÈ<ùeP§*`.òHÅ£û0˜€'Jà˜T6%´Þ†{‹`æ™ÆÉÊB”\<Žˆ ‰$Î1w@B[úAÓeåÖ‰ûz:oÛEÏà‰tJ#ŒŠ3[©$ü Ö·ðB2MJ%T: ¨iª1sšIëI9Ó[“Ú ò>KaEKEå)B 2Í!¢ðHðáàc bé´àã8îé”BˆK½"ä÷úUžîÉyA!î¤G:sR0kX%Ò̓S€H ÍKãú#̓Èñ¢ì"øýÚ„ñß¼ûþ§kï ¢®ýiŽëåæ–·±9ƒrí–ÃÒ"þz—ñá¶}Øžýÿú5T–W¦g^?Õå¤|î nÃýîþìæ EæÔ–3Ýs›—)â Pé×Û¾t½]®#±ò§oÞܶ¹o{ïKÓþøø”P¤Š>^žU¢ùõçÓ².mYû©õ¶ÈýrV¡¥5¼¹??ÜöÍ”yŸÞCƘëÒ·Ûa”: &M(#lê©í 3°ªôŒ¶öœ³N†½5‹0(9¤ŸŸÇaë²xŠ‘èðŒ”US½Yº+wðrjéH„±GR‚˜–ç³'܃NMÜisaž½GR)³[ìsÔ0ûéééîî®rñÒD¤Í9"½ÆsNw~~^ßvŠ:Í&m:wWQP ŽÈ1¼5°È0K"ejë àèE¢¤CÇ+éÃÔü"X$¼ì|ID žsg*¼Û̱ttVO ’.¸™š2!™1öyäž)’äD1ÃÖÞÓ¬&o"¡Öûõù"|7sº[>†´2nVÇ3NÌÝ3â1¤wVõ‹U‚Ž˜3£†Y/¹ˆdŽÙÆÞšpSK3r8,Є”º[=ä~hm«.ÎÇÃCTö±»ûœÞ{SÕ¦:̨5bõa¸Ëß¿ÿò‹/”1“ÿ¼lÿøÝŸþ—ÿíwøÓŸºQ¸ÿâ4>‘yê+‹<|ööú´1“ªPrc9H8¢i#åB˜Vè»Àö@–d˜4ÂÜÃwC r2"ÊRÔ‡€pgîE× ;—¢j6• ÒAT–¹°î™HŠŒt>øË%Ô Ÿ“zom-$_t»‘¥¶H·Pérן?‚+3Y8!JÎÑÌKÀjÔÄàH¯ˆ1NªÚÍõÞ"wÍŒ’5¸E=ð‹C›>¸uÒ1)3)œ°…’”]¸i#w¯ÅµMKgf@Ü«ž@Å‘(>x%ï[SfDÀlÌž$I‘.ªáa•+`d„‹¥³rÑ€Y JjT½è@–r-@aîÓf¬'}XOîù?<}÷îcoÒ—Õ|ºÙóeÜæ°áµ¿2§§m|xžß~|z¿]ÆËõSùðv==œ_•Ë'3^³Üßîö! ZÛÝo›·ÖgøãÓ\›ÜæÞrö朶 U}U.´Ù»ÍõnQ×}Û}Î?þé[íºöþî²Û IÛ>¼NGÜ/zVùü~y¸? òéùúüHw÷wO|³°Þ•€eéKoA)àHú›Ï?Ã>¹_{0MN§žñ¾Ùœ[J»;/éA5y‹` C&)­ü©DŠ*ÈÂPŠrSß·2v"#KR,"ž6=r„9KO¢°Éª» ÏE™[!— Hê qòõ~Ýç†xœ—îûv[ÏwÓ­‰&Ñz:G情çÍU¥õVÙMa‘”§ÓiÛæºôðt7UeaMÍŒ}ŸÚ»¥qÐ*2¶9m.KË«Ó1È óÞ4Ä뼜dI(2'3÷¢Z¸.«›[„pšî¬`Qh¤,ÎeÛèEåGáÅÿX—î~ˆ-Ü'"Pd„•h^•ÍÃÌúÚ—ÓBTrÍÌLÏrª• OË„§©ômÛµi!ổÚ&2”éf&¢æ"–•á‰ô af"ÒEzoõñ' cÛYkcfq·Þû»ˆŠ(øšÿÐñÐKj´¬+U›(#Ƙy~õ°¬wÒ|Fº;ˆþ¿_q}úþÛ?ÿþ_ÿåÝûëDÏù¦o]0f~ùŧ™‰Ää ŒyPÃÊäAQkË rKpzÔ¸¬÷îŒJ22w°2 ï£ãXd`âp/Ç`¹ êuG ŽàÈ€ƒ]NX†ÍzG$—ä^¼˜ák¢t½T¹ü€î\µk’Œðl¢“Œ(5e]ÎOº¤oM¢ž2Ý~Z‹æ“ÁI΀¦E *GÒz¯ ,‹Ö4g¸­Ú"“’Ê‘4Æ<-K°æ´Df™Ò§K“aF™AÌÜ¥*\Ë´ÿ“±7k–,¹²óÖÜωˆ;äPTÐh5)u³e)šd&3™éQfúYýe2QM² «*+‡;Eœãî{ЃGRojÔK¾UfÞŒ8Ç}ïµ¾¯1(Ò™ ‹fOw#ºZ÷ÂIsReRÀ˜è(fŽpU“…gDÌ] à>«ü41s„ p0xJJA"Bù7H¹[ó j!¡Kùúþ¸–òû÷øð¼·Î,»eŒ­µñ²mÛ f„Oû»ÏÏÏû˜N»ûÛ7ÿöNuû˯=ªáD|Ú‘Ã=ÍAyq ÷ŸÏƒï”F¡ÚE(c<Ÿ-½3ÇMåÞ÷µDá$Í[ïcïããÓKÀ÷Þž·>"iÀÜí)Ø&çtS4 çn·E¾>­¯åíQoªìm?žÖ›Ã Ñòr~ró}ë"bQù§ß¿c¥wï9@¯nV½½9êvZ˲(“ s¤`¿ôZKæüg¡¥–¥C hš èœÛþÜF¥L¾9ÝnÛ–cLÃZ³±ÔCxæ„–KTeëÓ%ðf‰¬¬‘…T…ØÌуWFRÀs†Û{;×uY–u ïQÁ”Ä„“0ƒÈ£ÇˆÞ»|Qœ/‡ÅÝu‚AH`ݤÌ4fŠ@n£'Ó¸âW¯¢fZkÂL×2sÅÕ&ÓGáéh©jûžª9ßD³×"×[´³V̯_¤Å¨¥”R<•òŒ¥\CÆé]jåÌ`XEdY–ðÉשrv3j[ÓR§Ú†ÕESÄ}ˆT³V¥ø¤Â31&Ù‰m²ŒZ£R% 1 XLÔÆ¾Ô;Ì4Ýüf¬uAÂzNçùè}'–Z1§m<ïþD½›ê(e%ÊmÛ겈jF´Ö&öî6>“ÍgîFæÍÍMD\½Óî*òg¼¶Ç÷?¿{÷ÓÃæ XååNvݼ9ÝÜÜ<_`>ÍÁ‡éE$1Aa6ÁDÌ‘’pÏð«5A§‡˜ déÇå‘RŠ'ë$‰2án)Is.™î±jAD^_ pÈìpj¢M¶AdrR˜b„×\3;1Ïö€€#rnbÓ¢”2¿BÄ ¢'+-Â10d^>,Æ R»²¢(Ýy~‚0q"4Ù%  ’Ì$Q"rs]êäðÅÌÊ3`>fc1’k©&ë]JÝfkVU’`aK’(’EC ¬«*ÉÍ¡”²þöý§ïߟŸÏ/Z7b¦¶ïO—íûŸŸ|ÚŸ[{ê» ¹]^½zõßäí/Þ¼y›ã&¨nÝ»•án‘F[Mç*Ç–jïí·?ÿÚD¦E„(b9Ôóå,H÷r¤d7ë‘M žûTÞ&ŒÁ„•QB(†Aè 0àC¡1âTu 2¨ªî|Ü¿¸8b}},¯ú‹S}»,u‘M 1KѢœÛËùîÕ}ùò|9N?Ÿ‹J¤U]ˆQUއõîî$Ï-œ–¥gDß-„.—DIüæî`£ÝœNw ½=¾Ùöóét\ û(*žôty¹;–¼²Ü“ ÆhmèœG8<ƒÅ KI³ÎÉ¢ ¬VCŠ*bPF°Y/*U¡éÖ(i]+€J¢´èÙJY”+ËÓùrs"‚Žagº–h£MØä,¶«y<yjDÍ"­×C͉™dŽÖËR0›BÀ‰êO(OL­·­÷0û²GÅÞ†ˆÀSE†™(w3a¿š Íf%=YÆpG]iÖg¿7‘²Gç1)ƒù@Da³oUëÊóHÏLG$ÍÝ€ŽáËZ 02bò«<)#lLBF„'x†D´®ËÞ› ûp­Š¤9ðÈäôÔ¢[Û‡ªK¤MÙ$k™Û8fڶݬ­ëZK™oñ©ÞÜ÷½Öºm[\¥ÓWد¾HŸ—­uÛZpþË/oûÓãùüòÔ;2ú%ö•ÒÃïîîšYŒ!”ÌÂ:»§ 8AH8íïž.¿ûñÛÞŠVNñÝÞ?>}x:ÿñÃçßž7€òéöTÿÍ7oþâêzª‡£öQRÅ ;2ú¨u¥Eb…´OçmŸŠØZkÆé/Tî"“‰8ìunt8¥yérâ&µF&ç[Š,º$äoßömùöíýÏç£Þ%GEØhë‚»ú´?Þ•øûÿò½å§n»"„ba0Ô3~ïžû?ê¾÷§ò›×Ç»ª÷§åÓho^½‚.Ï/û|˜gÄ˲Ö>HQdYäy¿¼\¶Ÿ?=-¥%ë²îÛ^—Ò»ÕʧÓíO>_¶ýî.þ©m{ëñÝwä ­0î׃h/iǪEІ3¥fØ( =¡l­§‘œâ6–ªìÃG¤¦p¢õkx·{†s’Ò$«¤ñ8Þ.>¼ 0)„Rx•6êºöa··¥ ·6RPW˜„ˆ\.{]Œ™ s„‰¦áÀº¬Ëͱí£DW°o»³ 2¹%«z¡yå¸00ÆPfÙ¶ ™…ÙOGäô}}±c€b …FRÒÕîLÉŒpŽtÊ™„"DX„¤§Y—LÑaF@&™ùát7"ïf>œ„ú¶O„YŒ°0ë<(Ã\+³…‡‹¸ 4“2 PeJf³‘žO¢1œYöÖ„döxJ]?mïµVa–yåÊÍ!PfR)¢*D€p˜¹;eÜÞÝ´½ÅªëU 2yÑ”é˜Í )[5gFDü;€+ÿ@Ff€OäÊ«¯^~|™Ãkh0‚Á™s³0)®ƒg¦ MNÌzrÁÝ‚…EkmÛ’ÃZöm'7$™wщE aq÷ \ eÒLIóJ3àJÒÃ2Ü=8'ß½GR†[â(ô¥æ«ÌâÀtÓ/ÂnfÌ ÷ ’+|K!ÓZŽ fgB°¨RNL&I¸\kk"„Lä°$'f„G"R¢¹ÔB˜Ìa¶0÷!=ƒB=’Cˆì¿v…2`s#f¡™Ö…=½¤SŸy@·$˜ƒÁZ™)3l&D˜˜¤ÔŠ$–éŒæHèæpè62Á­O`:GÌ€a†ƒÙ<ïÌ÷¨õ?üû¿yyüüÔ>º?~zþ¸]½7–XJdd^/çñÓËãÛc}{lU°”ýóËe-z:®ÊÖDŠä{kGÖ‚Ò-תD|¹4U­µ´½gbÛ{aÉÀ~ÙaÖÇ~®ZšÛUé`ù¹m?æs]—ÉŽf~ùÅý­rzØ7·'óˆÀRæÇÛH<. §ª¢ýy?U… ‘Z—„´tQc“L"{Wðì$OŸ½¦Z2FÖ·ó^EEeŒn9b¢]<ŠÖ ÛØ“õXZwp­ew÷@ëã°¬ï‡Z ôy`öÌYòÊ>&|m24}X†±H„1d­°â ¸®Ö2gÚÍ á1S É’AÃ¥³æŒTqÀKõmBèˆHÆÌÉLnÉË2Ù™˜&TÖiO7*êäLäf"bªÊ„9è/ZöýR°°8æ¤q±ˆö}—Rf’'Z…ˆD(m„JfÉ$]«46Fäd;FddRKm½‚ˆÜŒ…_^Îi¡µlÛ6iå‹þenŒ‹ˆ”µ÷ŽÈm߈¨^[ÿ¿ÿ1˺jQ²´‘ýM0§[JŠá‰ƒšÃ‡iÊHš‹'D 7eV-nžWW!YD‚…UÃK%°’†[)%Aœcî‡ ¤3¨$;Å,—:x¡Bn©W,ƒF.e=G,uÙÛY…RáÉÀ—i³¨.4=Ô vw®Ós*Œ*AÔ/ _Òåo™™ifH“2' 2˜&–2’|âþ`Žðœ·‘>™ÌŒtJŒ1XøOÍJQÌ;/Q¤‚3g3NK!&¿nŒÃçdç,>>ßÞß·½]ÚÎ_ÈÞ’¬Ä#"3âyÛ¶Èï?œ#áÇÊ€‡±oon—± óñêææö¾¶3+«/KŒóÙ ¥®¢ÊK"©’zfŽæ¹/ǃyÃIBž¬\ëç’*¬¥¬mTÙáp H¢sL—<½–ÝwOÞeöôÃépë=ÀE9à*ê› Ïj+"#•Øà²°$fÒBn1³‡ãÁÇ0Ÿ‘9š"ô°` Pñ´ðÔB¡ÂÓp€HD@$˜X:ºnt0“ò$òÒ„ý{ô1-ž­VH&¢$°,µî{'*˜€w$ 92ëÊä}KÆB—eq·ŒtX^ÿ,s'ŸIa’$Z2iFKÞþâëO>™Ÿ§ˆUk÷`¦1l6{IÉ‘aîd£E†…ãZÛ^–¥µv:Ìlô>l "Yê²¼J)" 6LLŠÌË}xxXv%"KxDkH á7µ.+¿îÿðLJ?½ÿ23 Rª ×€jé­­©}Л׷írf©#QE!ä6/íÕiÙÌj]ØK 1ÄòÒöcQsCŠÌ”˜DÎû I4;ŸûÙEhxæ§Ï’R¶|èC¡íã«WtœåYŠ¥èØÎ7ë""¤ yç§ó™„³ˆ8ámÓÂÊl°t*vÏ)°!`•p6cÕ5Å'ž7¬s©R4·€ÌE(j 9zëÌEbf{$<}˜®U ÓóÒ 3+‹€2ld&¥ÌTª^CýÈ}41 qÕjD5¡ ŒÁ¢¬Z#<¤âÝ´0<ÚÞ°Q…Ì€9#Í’‘9F.<Ÿ*³>톪ê“mxíå_Ÿ0™ $dÛvfž\ 3‹€ÂBÔ)”9ÆÉ¬µ:¼fåýýýüÓå|.¢ž~wÿJE2ÃÒ=€þh1G‘ÑÇ(ZUUD¶m›Oÿ¹wœ¥ŠRŠÑ“8S˜3s¶ˆÿ¥ Ðñæí«»×¯_*!ó’ü°ã_×L0³V݉u&õÃ'4™ÌíZᣉöà9Y“’špãð˜: ·±¨¼¼¼ŒaIáÈ%“‰IÉÁÁ\än¤<±,\T„D…÷Ñ•t†ô—E§Ž|Æù™Ø)°ÈüŸ%ˆ™x6"³ªò‹MÍ„8"T™Â…h¸-‡Åσ‚z:³„˜G·ÃR=2Â&1ÄÊÉ@³ã«“|Ç×roŽÞ‡Ö5É9 SªÃ'LÂl|vLóÖÁ1-ÕQpÊõšXŠ¥aJb@沈Töd­%ÇU·°6¦" V²Îœä dææ†¢²­‹Fòüá¥ÿöŸ_^ž}y¾ñ÷ÿøñãÏmOX×WÿÃÍí¿^ÖïÀJŒ³ ½›3‹€!e¢]̉˜[³ãÍ©÷*ºfdä[ì£'‚´m'.Ê3èÇ9•úä ¨^å$…ÄÇ8nŸžŸE8‰’SK‹R¥ í®õ(cswxôÛÃRV ³Î¥”Š‹•%„îN+ÈÛÞ@øé¸Û§½×Ãëmø_üúÛçÏçŸ_ÚÇ—öÉÚ§>ú"³lõÞ IDATÜb„C$Þ?or–mŒûC½Y¤(¿¹j*ñ6ª°ÖZI§‡Ï¢¸½½ÑyÈî¢:úxøüxsºkf[u-—Ç)"¬‰è»¯ëÊ"›¢]Gf¶½•RÛ~¹=ÖR<BŽ}/µ¼ìÝlˆòû§Ë!`{O¢E42ýù|«dkÉ×w7ñfY݆TYJíc$)FA߆§™“@\éZI48WÕac'^(<Ù„•³HAŽ¢"µv>ÓÊcøéP2C—êÔÚy;ݭ׺S‘½í‹ì{ج‹PßFG°Îq0!£=V3“ÌÊÀ—““åà¼~ä‰Èða™óÐÎÌ1›¹Ë"£ÛÜd°pW†E°Po]€ d`Ò&BHU `f{&‚‰¿Ôm|4ˆ€k•‰ö$¢Rtö¢µnÛþ…~pÍÁN_º¹ª™E÷»Wwïþð‡»ÛÛõpÌ "ÍLfh)±ï;‡ãÊ@ëƒÀ‰´Þ·Þ„‹*»ÛAÄû¾MœÜº®Äæ}¿Qkýϸ,Çû¯ß~ýÕWÇhA{à׿üf +‰€L®ëJ*95Q™€#Ó3)SY’A”‰T%©”E&S$øpX/—Ë{¤ $™é“Ù xÒ8‹D,‰2ˆê$2FF©š‘ÉDI´®«”ÚzŸZDQ®Ah¡™Eȧ2*ŒËüéMžH0ƒ2‹2’ûºÄæÖzU=#IÄRkwK¸Î ½ä¼ÙHN'¦I,E² ÍÌMAË2}|Í7““ ܣ̾0†ie›2³u)@!fbÉ„°æ]¶½Ï[$Ÿ»ÿüüù݇Ç.Oîoþý«ïþôUïÛ¦ŠÖ;ŽÖ#µÈ">b¶«Íè°,ÃÒ"t)fTêi7«KqóŠ®î®ºœ¸Ž‡Ó ésæë~¨–ÃhÓÇ‹a è6Í_ûf‰ð)ʼo¶ʧÇgZÊÓÖXy Zާ@Ü_¿<=‹êÃe«ë ‹hÕ´vyÙ¤TKj»Ý¬Ç‡§óͲ|¾dº®‡2Æa„¼$ÿâ«ßøå«5ÍíýöüÉöóæ.,Ãm­bÆ[·>‚ï·7§C$Nk¹)ºKÏûC_D AjÙv»]OËZGš4ó@7÷|^—ÃóÓy±¥0ÇH˶ʈ–àÿšpò‰ÐÆp+¬c£†ùFIA´– <¹HÚHß·õx ¢>ÚR”AÂò¸mžÃÃ>ïx>?¸ñ½ÛÃZ‰Üóõ¡,¨è¶À„¬53Σƒ4Y¨ œD¸{JŠ­+¯kÌ2FÔÊU³€")<ú呸lnÇ››Â°3Ùð™S(R2bÛ6e°j¦QäpZtŽkÀW™3¥0 i`)És …À‘ $³0¥ˆd’Yúð²¬û¾›Á}L8 1Ã9 ¢% Éž¡ôÙOE¸O³4"Y(2ǰZŠ# ‰–eì; 2ž4ëcÔµ¸Œ>F&¹»X:§ï}ópßZûå·¿üñ¬ÕÜëÂîn¥®ªºï{̃ï™s ìªbîa1m­­ëÊ^jÉL6JYlìÛ¾ÿK`]nïÞ~õõ›»ÛZ ¶‘Ÿ†üãï÷Wÿú¯·½MÃ6ïè™læ_Ž×WŒÙHópbsQd­5YÃG‚X (DiŒe3WÀ}.ÌpÏt2(É3毅˜ä±1pdš¢e6&2R”=&$§z²^'DȬ!!\÷±Ã½0g-{³}Ûi­“ŠhaȰ!Ä#ˆJ‘©‘7 ΀À=2 <±êNDÄ$È’Þ»jÕÙÕA@ߣ¶pÊVæð@³ÚÀ%i„e„‘{Š<‚EÌ#ÌE ¥P a( Œ˜íÖœ0¸JxïîÉ“”rÃNrnñiËÏ?¿Xàüré£?_ZëöÒóLJÏ?}zúaÛèúÝéÛÿåîÍ¿iy“-Ý› ‡%Áy9¾9·q<¾jÓVb4c"0öHQ çôЪiˆqiu]ÜÜÝ(QŽe?ï…ùò|9OO/T¥‡%’¬¨ëÕhäŒ_[ñ6ìxs nv9·µ”zºµä²H½hÝ.Ûº®¶oOOç ¬Ë*Z×EÏ/çû7¯>ü߾9¿œ«ðÈÒŒ×ãMUkwoN?ü<‚¤/ƒºéíñ†×»o¿^_öÏíòxCãÃû©>:ï·7Y0lÝèæû°çmÁ-_ÝÞ=q!¾;,÷k_Ïí‡OO»¿9Šd²P¸¬‘¬ÉIæE…Îñ´ƒ¥ ‘Ù_^îoïÀaæ,m Vfâ6ú2Æÿ—Þ­Ë2º© ‹¾!"8#‰„ÂMˆ%‰Ã|0«ðt?[X„‹±úè´#Â…YŽym@·,I””ÃçØŒˆæ÷$T–Ó.Èô!zôÌ@1‘@d¸3ãj¿Jªµz$2•™¥z„Y@9ÜæT.É$(FêáŸ?‡#r¥Og¦ƒ)&¤% <Ò²³™–jôÑ$µÖ5mÌÙWB˜Y•‰&õ‘9ÕF—/ÖÐ9Jr‘L“”9O£Ü¬ 32Èl²¥R«$¡*¾8i -÷ d„uä餇»ÃnôøâOϱ¶_¶1úekçóÖ"zæ§Çý·ï~¸< ó_ÿêoþ'[^QºçKäØžµ”¥]Öçóv\nÍ}H”—fÊÚ}j=LÀÔs³µ‹2›”R¸ÐÊf>Ç›ã6ÒîNwèm·q¸9Ñ'Óp]Ö¤fEeŒé 楶­seÛˆ!D½‡/ˇOŸ–¢ÛÃ.¥DoiQKŒ7¯ßþô‡wJ빿X——ýs}IY‚«ñ¦ªæ¥>== A²ð°^—-[]Jd€ Ÿ[äÇç—RŽZËí/þò«W~{þãñýûŸÍùÑ}'09ØÜtnÐ>üçó~ª•˜Þ®ëé {á® !Ö¢íq‹«ÈÑ¡K¦²ÔÞMK&q¸Eº?=¸½½Ëˆ¤Òû^!»µe=>¿¼œŽ'w/µl—A¥ƒ2YH=Ó÷!«dRˆØ-ýZ´Ì}ßU…„-æò‰Uuo»îîŸ^ÖÓñÝÓ^™Ž…¾zuóÕíáþûÈ}ï¡ÑF:h„y²ì1ª–„XPF9Ùe)……ª>=¿˜'SRälº&±á1TDáEŠ2œòjz }1“ %žÉÄB4èªÃC:‹(ò U9=¾ÐŽà©U݉=-3=}rÄÜ]¹ìØgiVT÷}'æy+ OeH0Ï£ªp Sx¤û¨Áž Ð IN’Gˆè„’iÕ<¼› ‘¨´ÑJ-3ÚôÍ·¿üðóçRÊÞ{Qœ)réôažžw"Ú¶¶×ZJ)ÌL”¦ªˆî±ï›™ÝœN™©"òw÷wÿâ À÷óŸ~÷ÛÿøŸþþŸøÐ,(óÍbÛ‡÷¿þÍoä6¬ÉWÈD"ȼ’èc ž=È ‹hNE¡ùt£aDa6&á.¬Ä˜ÁRëõ 6‰ ‰ÌªqdxÌT¸£í­–’áf†ÌR„HÜÌ‘µ® 8fv8™ÙÜ ºŽê3Ólb¬Ü#¼,šðËËKfˆXÍ`r3 ‰ID<œ’®¢ÄÌæ’L™$ìW?b„”šI¬„¹BÂcî©‘„Œ rD€9<Ø-Å=çþCXʺ&"™#3‚WûÒSÍn{UÒ Î°q(åÕ«C9¬O»ÿþcÿãûçÇKzÙ>?~øüôéùòx±÷çöŸøøýîÇxx8óë×ßþo_ÿÅÿ±¾ùÛàÛð«’ `$'$IÏ»Ž·ÍÒtr"Ÿr²iLå4·H·ôdb­aÒâ­§BK-Ëp·Ö²n9Q"œÄ‰èÖ­õ²Ô3ú,ÒÚA´Äð¥J¼à ©#§åXkª ‹ÃammPÐeÛ âîÝb­%DT‹e’ªfê¨êˆ”²D‚©šû6‚Y…Õ"KYºS­5€µ,¤ä–`í‡ —!"¯–Ó··w¿†Üœ–·=*/ååB=à™¬" `w¸lïÏÛçóx8ïïΛ?6ûø²?·—¶hß¶KoÄâ™}o´6?Ÿq8ÆèÁ܇!“äú‰º\öºÌíp8^öK„g°G”ª9ëK3ò•HJDËRz³ ˆ³ÌɵPŠ•køÔ{¯*EêeoOûxÿpùáa³¤º.¹HYgÆ0\‰)G‡9+–BÞG™šLà2#ës½·¹‡Ye:œÖiºcUa"YtNR -ãùùœá”‘ 7§$¢4÷RxÒÃúèÌ<#µÔÉ’šC`)E˜TëìNO 0™ˆ<ƒEçÈèp<>>=ý9, €Ër<Ýoßœ}ÞýiðO{y%ö÷ÿÏüëÿþß2h?´Ëãgë^”= eÎ"Yñ…\B`ŒàªLRJÂîIiFe¤§H7K\rž, ŒN"ȰŸ›b­©{ª†š‘ "{Ä0Wbd“ w¦ "Äôm(“ÒT|8‘ o´0Ó´_'óñpøêëÅ`Ñ¿â¯ÿݯ~ù·§õ­£<¾\zts ¥÷írÿúM߈±½4b¶YjóT­îNL1†1Â’k ]vÒºÖe˜Þ¹ho—JÒ•8úèÆÉK‘˜m’>v!18,ËÞ·½õ*JÄ…Ù,ˆBKµ1À¼7ãR™YàÌDÀs»‰÷¾c8±HE2Ýúõ˜©²†“h ´HÊc=Xx@÷”ÌÊ!&Ž-‘ ÏS-Ý\uÝöÁ*Ð GÚ›Ûûv_¿}õîÇŸ×ãwIùö­µo¾+íåÒö÷—ž/LÖÇ^‡Zƒ°ˆîp~îãóÖJUÿôÔ×"÷/ã~Ñâ—f —ÈxÃKÞL„U‡Å(‹‡yoMu¡Óá°¬NU.Ï#é¬RçŒÜØG£w[5÷e9FfOˆŸæRj}y¹°JYĽµ¢…‰jYG뢲íÛÍñæ’-œ˜á‹ÈèíòÒÞÿü ‰_¿½]+ЦðùìxºÁ•2VM. Ô ž'Šî£½_KŽº÷ž,ZÁ#[¸ƒR…G7V×Ê…`QµZ½[hR$,°*BÄ…cD,Z“Э#©.îŽ$w'bDá®U­ÑXª[DcÒ¬SyòM}D0˼p3K¸“ÀŒ Oaf—YÚJbâ0‡Ù8NÉ–RÝ}X\}|µÖˆ f Ý[­u9T'Z—Ç?­@³Êkf"BÊ–>Ì%ÓÜ·m»UM`V"„™z·LQ-ccôu]™YU·m¯µþY7€~|÷¿}÷Ûïÿx1P2aU,>TËéÍëÌœM]ˆIµ&b%!0˜9Ilið ¢Þ›»ƒXD‡íó•Û{7³)<É]! Fz²ð4gFxDdÄaÖ§Üx^;„Z…ÕÌÚ™©ÌSãÉ„ijš`„9¶**,:îcdºùf®\–e9Nßÿ}&B:e¦° MÆ¢;]©ètUïNr!CY‘‘ašÀFf™–é"eÁuq™hf‘H"šo¼U0ˆ" 1.é®ö¤È Hf‰¬D*P¦›Û¥– zlö_¾ÿøÏzüñÃóã§ËãÓùÓÓþÃÓùãýø¸ýç>üýüç[?Þ¿ýo¿ýß×oÿgY9B·ÄóvIäë7¯{K-µî¥Ï—F"»ÙT£`ZÜ8™Ae]Úe'.¢W2 ‘ð«ÛW——­ˆ‚(=êzHá™6”e)êŽp•B°¢â˜7":žNó¨4Úxõ˯[ï÷·÷1›ÝžÄâÇCF ÷»û;Ë<žNû6Àp>’‰BŠWEë)y:ÞRKoÍ"—ºD‘¨.‘Dͼ Kð°@ˆµ–ª¥z²yöá˲ŒK6ç“w"I•ø0P7_hy½Ô7Zß®ë7eýZ‡Ô¥”rn}ë–Lf1Üݳ{€iëñØýi󧞟žÚÖûÖFX>?nóÙ¿1öhÍZwY‡fƒX#3:³ro]¸Z@ªNû±´m¯ëºíD"¥äIÁÕ}¿Ðü,kéch‘½ww{||:œŽÇ㺵˜-'Wˆ Ôú®L>lD|ºìŸ.ùóó>*X —¥¦[0e€åPvaÖB”T‹x÷n6Q†™ xZì½/¥\.­õQ´,…tj<ó8)Ì"Ì2C}(Up•’ rš¿æ5;I8N>ª” ˆH!R)"a¹>÷ˆ¢lc>ééíHDÀ3ˆ¨Ô)^NpD†j ·t£«O¶\ë8,æ##§… À™!‰I )Ê%x*}|dD>2¨Lâ¾ï}4Êé扜$p¤!AÄûv‘ié€ù›ªòñÓ㟠‡Ó7ù—ÿê¿ûo¿û?ñ§Ï—¶ÛÇÆ,|ªáÿøëÝ”š¬ëÍ«8Ø~yÎtâ"ÂÄLIœHGð|5E˜À‚B!f®jîIéÓwã>©¤S±E@朻gf3úÂ,ˆÀ“›ÊB`«¤™·¶›s¨EO'.AøM%d6zJ1ç?‘ˆÌ«.‹ÈF?_¶î‰áÞÍ‘TÔU$<©àÈ€Ì"©Ä³~ ZªP”9ÝMJ¨{ÆŒ‹Iº»reO JNFea$±h™Æ'ž+€’”ÑÆ$ƒRJLt¢Z|XËççvöñy{üƒ=>ŸaÙÛèáaÑ=×—Þ>>ŸþüøÐÎßßßþ¯õÝßntlIn&½yRÑJÎc@T|ÿ¸Ž}Ì DÕµÖ~Þæç©Ù‘ZVsS–@\Î kīާó²¬iÜöÎÊfÁ•£¹E0…‡}÷Í·?½{·íˆE„“÷n}å0_Ç#(ûØD„”íåì}l´õÿ—µwë¹,9ïûžSU­µöÞï¡»§g8’’(Ê’#K P2lȆm ŒøÆA>N>K.‚\&7ÇãÄJœ8ˆK‘E C9‡žééÃ{Ø{ªê9äb5A`ÆI}nô^½VÕSÿÿï×u˜ÆÖöÖÜBõÚ$¥ukÓ4½zñõÓžYwÓ~uýt^Îã˜1Ü.çËÍxj}ݺZ :¦ãáôxyäw8)#B³€RÄÌdÈ}^Å"zÈe^ˆQ®ŽÇÚ*˜7OÀr1ë€ûäà0MçËZQAs–Ú‡CF¡Þ¶a ¤‡rsÞ– yí—K²ºÙ…¼/ÆœˆŠ¼ºÌ—u£ ë!MoήúÛßý†___µº>¹¾¹\.ÃPbíÄrY6&¤h˜Ù—uK%_–Tò®YºDr÷ðxs{KDá]Ût˜¤i øT9™±ÔÚ…†aZkËå¦ÛEP)#Qv÷nCʵ5¡ˆàoÏ(ŒW‡!‹]!.ÕnŸ^I’u]Õá0Z[(£›c Ø4ènæã<<ÜSNž2C¸”Rüò,¦Š‰À Ì€À+"1yàÎv©êNkÃ\‚PÚ»¶™¢;XoïÐ5ïl%äfµw³¤ðx7,’àD®á;ÁÔ‚ÑÜ¡ù.@ ¯ëºSnûÕ£`ý¹÷˜˜Ýzk=§Ä µöœ“0¨“!MÓ¡ö»¶5ä=¾Èb¡ÚÚ¶U¢ "@DQUr‹µniLJ1'fk="XµIʦzžfüOsÖm{}wyýòÅý\¢9pÇQ°¿}õþ7¿¹´nfAÂÈã^nÎH€" ˆBHlj€A]Õ Ôt´Þ»63UÂ}ü@fﶈ(̱'Z= œ%!án¬@W%&t÷Þ{o­·ænÀ €¼c+‰xÇØšº¹k×ÀP&u¯Úkµ¹VS«µuëÄÌ)µÖêV÷‘kJ™˜¥›¥ÄûÍYIˆ’‹¨…3eÉR˜ù5’"´u&v„ÝnM[WußÇöÈœH˜Eˆ˜QvzRJ\†TÆ2•r¸šÇét,Ç1o›â—ó§¯ÏÿËŸ~ùgŸ½ýñço¾|u~|¬ËÚW{«pçøÕ¹ÿôíÃÇ_½üÓW/_]Î>¼—>üËWþÍéö¯Êõ·W`déÍ$ImÞ5T Rv@ ºõa: »‚™3%&II$÷Þ<¢«&bdÁ!ó0¤¾v¢t5WS$œÒ>â7wCâù²HJyÈnÌ $'óŽhê«i;_bwÀ".ó9§d­k­Ótf^ëþ‹$i?‘%ÎH˜Rnkµ=ÝZÁ¡aÔÕ0P›V3Så”Y8ç¢ánèáH‚ÁHì@`”ŠšJl昊©¶ææ1Ž“zd™kGFíŽ"Ý¢uSÀjÖ̻ƓëëËHGIW(áÛRÞçáöpu­•¢{ ÐŽ»‡ö“ùªýÅ›‡/îæuÙúNhêmiH’JÒj&,é|žË4X †[ š&ÊÍX–eFDF w p7ÊcY¶*’öçÒMŸ<{º,K³ $ÌÄ’ê¶©šºrJ„ ª.’˜¹ö^›‚;³A)żS3¿¿Ô³ÒYýqé¯kÛ¶yí·§8 ‡1å„;ß[ë@8 ™Ù‡B^ # ¹ƒkCIˆB¨áAeÈà¡nD¸‹z ‰È˜4€I "˜ ™< "ÌQhÇšïÅ`Ú]ÎîÚ•=<Ì»º{ìž/À}¦¿'¾‘ Xß‘ìÀ™ÀÔvë@tU&"f×ÎÌÚAؘ$½;%fwƈÓá겭ᎸSõ°ißs‹¸ïz»îÓ!CÄlª»)$ÁÀDRWEµ–Rº?/€¿z_åúö×~ó/ÿð³WŸ~öâþò¿?œç¹éOQúEξÈ~ô+ßýUHyi€ÂC ‘¤Ò»»)r0eWwÄ]©»Ë ‰¶uSƒGb"T£p‹HDˆD¤ê½wsÛq̤¦¦;¿ß‘ ÿâs"ò*EXzß"‚@°µ¶µÄÐ{4µœR˜mÍEµ;&ï­¸u¢”sÆx×Gû7¯Þê–9¥ IDATþå¿üÏÿ‹ü_ý—ÿð_ÿøãZ»\|ãà‡¢æøÆõôü›¾w{å°«Çjï]Û^n S G|‚Ø­èÈ‘SFˆÞ6ŒH9MCAØÙJà Ú‘)Í|'+E€0†Ñîz aÌnÝ»8¤”`­-€$%FÚÿSk}ëz™—”³‚F8²†»GÛš›8Þ{ï˜o¯o^~õÕ˯_>½}òùývi12ßžÒë7—’%‡ÌWÇ1Ý}×­pÂe³ï<¿E ÷'WS" ÊÔ›=<®ûh2.K½œ)^¾y$ÆZõÍÛ3ÈNZ×’ËüìäÄÀÉ<–fÕ}©í\[íºµ¶´úŽd·ÿxéæpý[ÃÕG†Ãø|­µ‹¨jæäD½÷¡ŒË¶æ4´p&ÑÞÊxX× #I–ÄëZsÊ ®ÞhHÒw+}wLhÍTõz~í»Oó×?|}ùÃýåׯÏMMö6@0ìà7ß}J¡.‰yoÆ!98ªYŽãˆÐ‘ݼ÷&,ªž²ìx4@õ|= ï[ ‹q,Ý̶íöïŸï p«-º¥Ä{wFõíÆp$LضFˆœ…×e.Ó¸­["&ï=¥¼^%¥pkfÑ# Áz B€qH݉ÈüEN[ƒýºB•³sz{>)mU™1'i­—œTëÖuköàMsfF „®3cgoM[ôc#lãX´Z«ízæåOއœNÇòäpÆ,ÄsFtU}ruÕµ›n‡q\kÂu[Æ1Ÿ§fv„È’-€™ï^?}út„31¥”\- GÀ²,­n,ép8Z(x¸;¸“ˆ«Gô> 2§R¢Wí¶õêfeÈ™ìX·­ou=Nè±´%‰Ù;bXF˜Æ|R ëHt‘8E¦˜¸$ZjcÎÞƒ×V¨ÕÞ-Ôw‘=º`í¾[ÜÔ€pÃîÀÄÄdªÈ´7Â]’¨»5Eá’9iïnÞ{Ï,{°Ñ,è#b—2î÷Ž®¶Ëf˜Þ©À™aG¹×Î9ÇîÓOR,4åBû…%B™R)eÈù²Ì/¿þ:öñ—Y­µ›•œ‰¡®u«=܆’DUÇcïHv?””غ¹uÞ©H- Ò0 Ô{óH¹ îÞµí ËhöúÍ}S½Ì•§œJ)ŽhµùÚj­›÷¾h½»{£”RµþÕÛsyõø¼n_̰; à*áû§id¸Ê 0šEU?W„¥ùU‹(ò)ÜLÂ’xÄ;y BÝ wGÉ À×nBÄÄÁ™«ry½@u«ÝVµÖ¬ºÖªµ7Gˆ¾« ÿ¯SÛ ŽÏóðÝ4þrágè Ñõñ²ŽWSߺGPP±@3Ê”òäÞ½×–sª­JâÖúÕõ­Ö^· €{ä-‹pt[‡à­‚†uÈ>?ý­¿þ½¿õ×~%Âÿ›?øøç°â¡ ®hË2ãäðîÎü],Ñš):PʉQÈm3³à"WWWÛº•¼Ç=},£ZÔm±Öö}F‚wcw_¾–,ÚU€ šb¤”ÎóœˆÝI#Y H].ÃÍaîx"Ž8]Ñb«=¥¡÷žÇ+íê@$P܈˜›ê¼UdÑᨭ KJB¹˜Zåix|xì['LµcÆVûº¹nºmzdÊÀ§Q˜p`.‰§‘…Õ¡ª¯æa³yÛ|mmîÖ­oÝÕºþ|Oÿ•¹( ‰Ëpíi*éùaø¾Ñéx<Í­ ˆFÓ^À܈(ÚÒ)ìMq ]×e+¼2ïQ7²ÍÀe˜×íϾØñgo?ýÎ7?ØZ{¸¾šÆózu8“IJ:›j­ãö&z4F˜× Ëñx”D)¶ºž—Åzg–@PwìÚý¼NÓ HpY¶¶5n6•Ñt3ëµww»>Ö^i®µnDp¹ÇÑÝ×ùñt8zÀ{ï=ÿø“‰“#'am ™,š¥D©˜) õîIhš®ü®mµ¶~ÿ𸮠sþâumÛÊLHx3Ê¥®ßþà©›=».f>–2MyžEqGœWS A`øîËîF®ÖPŽíd†î`ª” ³’5óphÝÐX$‰ˆ @-€‘Ü‘¸@àŽMæ0LÌ­wrtߥÁ±ÖmJx8x‘²GÊ#BÕâ²-)ñGÏ¿ñ³ŸmÛÆ‰-¼jßý_­õek¥L@€»@»ºé¶U&jµšjÚÓlìýtúÅŠ`qN§_ûwþ’i ÑŸüѳ—_¾¼{óå›ùË˪½éc¨õ ŒG F/°Vç•3ö4v €ö¸Ž™cHI0ãNôåÌä!Ð\»M‰d]˜1a€aX«Ä"(=<£2­ë¼HÎÃPX÷½Z`0í\ wsÞƒA`ŒË²>T[Ôïî×»M/[Ìœ¹È óaÇ|0‡M# 1Ѧè@E¤™<»¾à½3 ]š3ªSíÆˆÌ^7kæZ[[ÖÚ½ÕmCÞšVŒð}zãà(”Œ1PD²$ ÌÓá éZø¦:!O¹ƒ%ÜJÊÀ] ÔãêeOÍs΋®)e /‡é|w'y¨ÍIö‚¢:€µ°l„,Q¸Ô¶`Ò$9©{NaÝ>ü¥oýìÇ?i½–CÑÖSÎšù³g§ßÿ½ïþGÿÁoÿßÿõ§·Óþœ0óó§§oóú—¾ýôõݬݪúÞ  ’xk¡áÞ 8‘„eÏGKØ îHá¦{²LæÊD[ÝXh­¸3!§´Ö&"ˆ¸^–ápHepÇz^‘¨Ïk""L9mµ¹ÏíÅC*t25njá¦Ý»9!I¢ÚÚéêT·Šîo_½K1 $H‰{uÍeª[c¦e™9eYkE…T&7@–ä®Ñ»[¬5,tO>£ ±ÔªÃtå®CNÖ5Ì«º¢yoUr™·`ŒÔ½©ŠðÓ@ÕÞ÷Fáp¢ †Ís6ß¾x}€íh¸¾ºoÝ–óù¡öãUùñ‹×§!?¿½=Œ˜H–ÚCa2]VV#å̘Ëxw?׿‡6 %!ñ²V‰eƒpqBw\M-Ö<`. 8492»yµ­×ÞÛC$ZÚ]%¦pshakkkSCšŽ×ЃˆSJÁ­UqÇ¥nÌi,Ò̾Œ¾m±EJzï½ß÷ÞOW§1•7kÝûÉ—sUýÉW‘Êp5æãÌx%X o[-·‡¡ÏZÈ–mI’£4Zz‹t@ë©{]ƒ!Ä#åØÍj× ` A ÀagMt D fA ç°0D$nÖÇ»Ò/` b] ÉI˜1€Ø}Wƒt#†»ßª!Áw¾ùÁϾüRÊÛ¶™j"€i:xàî¤ëˆPU{ëæîÃ8ŽÓ´.Ë<Ïù˜=O«Úÿ‹Kà?_q~{ÿñŸ~üÉO>yñù‹¯>ÿò³ŸýôíË—oß¾y¸Ü×ó¦½B€¶)›…»fFlÝx—b„Aab€ªàB,ˆh{òÉA™(!BSOBÝ¢™1B"vbæc¢ëDÇÌÌr5BN•¤]Q˜8¦qR­[³Ú7«öPÛcõ/î¶‹ÂætéÐ:†ŒÏŽWÇé:Ñ`NÀ€aî‰0ÌÁÝ™È̇Ìjq,ùqÓãÈ—Íù]ÑÜ(s ØZÓ(bÈ ¸“"ÆDNž×õÜj–)arFb î AÔ-j3âŒ@]Á# vB¦)’Ì— „ ²§ŸÌ#0¦á@$îÖ{ Ñ6ŸÓt‚®=@Eòžñ ÒVS*Y²º‹È¼,CÖºRÊÓçû·2Œè‘rF‡Þ›š÷Ö {Ó¯þêû÷oþú?ø{¿ý;¿ýÑð®”àõÝü¯þè‹ÿúŸ}üßýöñOß,kƒÀœ’¹YkÃ0lµº‘¶F)Ñžgfrï;ê•„±VeÊ bk*ÃÃ=¸€ª£;![k·Ä Ì4qª½O'­5ˆ¨õ™,,qò0"Ú‰¤ÀÌл³Ðë×0Œ`!&Dè¦ÇãqkÕƒqÊùñá!CX·@Ä`IÚÚ> TS&b¤$Ì’½®[îÖz³aH—ˉ“¼cˆYÀ'§ëËüÈ’ÈYr6oˆ8–lÝ.ë.Š15Œ€ Ã×¥F¢±LC)¦Ì´nõ‹¹ýX,Þƶj‹Õ¶Gd@™d""ºº>†*0¦hßúàƒóÃÃ8äœòzydÁVëó÷ž¥„f <(xsÉCm½.mGHb½ %Î{sy<2óŽǃZ–®0†alµR²™¥´Þ£WsÈ,Hˆ¤ŒÒUÓøx9#x¦Ëã£G¸!ÞÞ\ŸÏç D0wIlaÖ{J©ŒƒZÝz×ëë›­wPU5}v=@øí1e6ÍC™¦1—ä—Ë[õéê¨@[­Ú;¥¡‚áÕw9ð>M¨Q1 ‚(ÙµAræ¥:¦„„¸©&¦!%ÓjŽQÝÿ>YÊ®øba‚’¥[qX" zë»l®””˜¿xùõ¼,½µ€˜òе»GI¥«²pkpÇ-“‡…û.‰ÜiB=?ý'ÿôåûOÿ6€}mËr¹œÏo¿úêË—¯>ûé§/~úéWŸvÿúår9Wߢwmëc7롵.M·ˆ@²VtêÍ£Û~Á‹‰Ð{D&q!ìá@¸ßsz„:%$Ø©Ušˆ‰â*1AÜ&¼Êœ)ñyU¸[ûÛ¹¿^¢El' Ròq‡"SÊBÁ»Õ>0#{„{tsDTwab HL‰60DD*‚jÐ#†$Ø5€v’T ³øÞ¥pJI±w÷ˆî0 E˜È(µ®ŽÔ;&$Ö ’³F@$d2 tDÀ J$Ú̆¡¬ëJĪšJ¦ ŽÔ€Ý|7©†Á0´mh¦‡ë«õ|–Lmë,¬Ý œ÷âS¯"ˆà[>ý½ïô÷ÿî_ùýßûîGÞüߟVõÇŸ¾ýƒÿù“ôOô£_ò³—ȉkkA ""9×ZØSk "ö/ªçœ{o"²å{ׄ%IªuÍyPµ®Ã.GÔVER˜íVÔZuÇùü@@RöàĤf5ºH†à”ÝHÈ~NÏèu J"ÈœÇCÙ–-,´«ƒ"2£°XDË|žH÷ý>!1j7áHyh­gÉU[b‹e™E€ï^ñé8õ­î}ïw»Fáeiž˜±Y9õÞ³ð4M÷30`Yó)' ­½q ií¾3Sà¾õ\zÚ¤… —eC «í²²dFrW•wù nÖóñzWaV 2prŽNœˆ¼V' &A‡BÑÍX00DÀîÿ`fÄ€@ŒhJ̉¡¤üã/_žç%sÆ:/µës„ƒ†9×Z…eïœ1ìÛ©£Ôÿìo¦øÿúøó¥ª}>·Ç·ëÛW}¹Xo¸{k[«½kÓÚôq^ÏË\kgæ®v™çÏ>ÿüÍ«»Ç»ûeYïÏsÕ@t5”à‡©4õÖ"ÆQ†A®¦ã!A´û¬«ÍMëæ[Û¢«GÆœÂ×û­¿™õë…šî5 !Ê%cÉc)j@Ý‚˜0Ý#±X`BÌÂMÍ 4Ó=Ö½“@Õ‹ íÆ—$¤DˆØKÎæX¸9f)سw'" ì ïäe$")çô0W"fIU ‘ @ÔTR ¢Ö5§A½0 ƒ#ìáyÄÞÍCÙ!ÅÌ…ewÏÆ4ëVwL'¨'7电[„[x"Øa¥êªMI8tÙùƒç×éWžþ¿ú«퇿ü[¿ñáûïþOEkö³/îþù¿øÉ?þƒÿðO^þäg_·n{so×#Ýp4 Ã<Ïi±ÖJÎï6€R’$*)ÌjëN½©   JS&s”ʋ¹£ÃRWp#'(CîÍIµ §”Í3íwz¶"4"—¬fã4ÍËEH¬Y.Ù´'‘V«1Qf~×kì €P€š6bNîîáЃÀQMU-%1.ˆ;‹j—üÕyEæétð®æfUk¨a˜æ4îÈ íJÄÄ´Í9­é!qå€KÅ”dŽÈYVÔ>/ã0„Z*2Ï_eŸQ›û%ÊÃ$C_üWßÿM_}ýÅCÎp{zòâåË:ç£<Bó0<9\k[…Áj¿¹:ÕÚÓ”s~óúž™\{ å4$®Ö‰(:Ó€à,ÇÑZ×¶©:ïh÷ñ0©ik•0rÕ[Ùê6¤æ>–âîû¿\bÑè®–K^ku’ ”éýçï?Þ½%ÄÇÇGÓžÝC½3@Ê9'™·9q2ïLX› cr’q[ç,ŒDàê@ànê¶Î+0?{ö¤7=¯Ëa<¶Zãèá7§R[ûƳãå¼|ðtŠf9HC1Þ©¸«õÙÁÇ•XÍ<<,qBFW'„ˆT'Ï#„¥”ÌöKĤnHÈòn» 0 ‹ÌÛú£Ï^\så²"R6w‘ î–DÀ ñÇ?þê«G¿:ª‚†¹0X„j$ÁÝÉ΂fÀÄ¡…ÌD(Ü5\ˆ (šºQK(ƒPU›Š\š11mˆËD IDAT Hº“ƒ&Nå<×Û›«qî.+#{à^3ljA,HD„D­ÇŽ@•wäTÊ©t7@ljÂ%܉¤«î—(V7ÈRˆdUÛ}âªÊ,€Ð­‚CJ‰ˆÔ:¡¨¶!îN ÖytɃjôÖ@µŒé[<ýáï|û÷÷—÷¿ôkß{>•ô‹?ÛŸüÙËÿöŸüOþÙŸýѾºX›!äœ^Q€ ¢WB ƒñ0öÖ„Dµï†{o½Œ‡¦m·¯‚‰HëÁ Ì£ê–Ë`j;cÝÕ-‚™ÙÍ›«HÚ©$)%‘œ3/—™9­u$PµT†±Œ¦:o—]š‡ìn€Ót0ït^Vë]„‡cïÝ̑ԻvË’km„H™Á„¹µMK.(´nÕÝui‚#Òn¦ ÷œJ¸±pnÖ1:  *î‘BpŠô䪮sÕ¥¥"åtˆ¥.—%gî€"hÛ2KK‘0m}‹u;Èà-îÎ?ü*Gº"ŒÉn7½ÏSí—aHÂdÖ¿ñáStíà‘,„ðîõ㘠åT„dÓ¦9ç}¦@ÿ'yoÖ,Û¶fe7ƘM5«Ý{ŸæžÛêJº²%m0ïüþ?€ Lø 6cÔZò•ŽÎ9ûìf­UÝlF“™<Ô¹`c…@aÉr>UTUÔ˨9rΙßçÞ´AR×u˼¶RÚ0l(„‡"ÚÃÝÍeškλý¾¬«/Ój®CJîP[f”‚ª=??û­æ¬U‡Mµ1£i# érÈëºzDëRïnˆæ†ÇãËv³IBjâ°5m] ÉÑ °¸kH ¦Ó2ÏËÓñâ6û-¹Å(] µT‰ñJÚ)­Uº]4€Anº %JÛ%)Ž÷û ÞÑZ°.0Ç@È™Š£U-Ꜹf¥+M¦Hp5I½åV øš%Y„µ5GVwFˆ!xÓݦÿí?ù À NÇó•F‡ˆK^9ÄÈy)×Ù§ÍnãUàU7ÿ·ÿ]úüö/8ðÿˆ"ðgu—:«FwC@ky;>9¼ÿÙù4_N§ÓùùãiÕÖª©)"f껎…LMUûDZßl·ý0 óÌ1/ó|^æeVƒ¥ëBˆ"’j-ËÜ–Z~ëÿÃ÷ÏÿèÃr™+‚«£#’‘áÕÚlh€…ÜÜ®BËm'Èt^ !\7ªN¸94·îzE#'113[šE1P3$–êBè85ˆK5sîÇÛ¥B/ú¢p)Žäèf <†Ü‰T¯cä Ä àΤ f¨æ}ŠÙj#ÔæÒF殾3h%·ësƒª©Àµd%ˆ››ýùt«Ë” ›­L”ËŒHZŒYÖZÛ¼¢ã˜äû?zü‡ÿ‡ÿõù+ÿà7¿ÿÅg·¿æý ü#Æ¡ûþ÷î~ãðéû§éåX„/‡Ë²ÌË•X‹ˆ"@êU³:bìc­Í ,—‚Aª2ÇØ•5s E$˜˜_ÖyQ̨B”m¿¿]K1-JÐc@Á!ÆyYPM[c¡È\‰Àk]K'oÄ„`%,癚­¥H ˆ(KÓHâ`θÎa—vÃPZsôeš‰Á‘µª»ŠÈÐwÝØëËÑÝ¿@wËÍØP.s!$p¢>jÍ®LAbÒµ¸#qh¥Iª­o¥ˆ…Ri­@3.‡Ë¤µÛîµÓbæêtJû¨š…Íær> ÷ŸÜ»y^]Ykh·o>)˲‰¿öõåË·ËÛ?ít~ž2¥Ûµä ÃÇÅǤÖç§ç®Ûlö›NìrZ‹ywÙ´äªÓ9†àä┯BìæûÍã'ß|õõ|Ü=ZsŒúr>‚K-³Ú%·6$êúП¿ü˜B )µIÍXר3«—SN!‚%ou*F‰9Ý.¹Œ¥Íe62«¹¢YÒFiØUwtå+)pÓ‡M@œ¿í6Ý>ÿöã?ž>?gqË’4ÓÒ\—ú´˜âà ÷Ûw¯ü«Ó:ÿ¾üƒbíåÀXõT‚ë0n‘úé4mS¬P‹ÈržwCì·P>›ß_ÎïâQ¨ïDz®›ò°Óû ßmÒ˜¤ëd#ÁWCö\[Su@ScÀZ ‡ˆ1 *¨:€ZUu»‚ÂØ£aTàÀfv·Û|ýþc ö»ÎÕJ­ÓeÝï·Ž€ª¯äD„àhDà>Í—Süo¦îå/9üy;\ÁÍ@0޲•Zݵåq>ÿ ÏP*€©³¸¥Äýê5 ¢¨ðªà^ë­V['°æî,B¤Á@[ñ–C×%ÿ÷’&’@ZͯÇíDÜ 0@®n¨ æ@Ž€ÓZÕ…R&PS3`"r… ÀˆYÍÑ`mÔG~Y['WÃÜ YÜxrÌfâ ª jâtÉVN%Å šI…ª™ª #¢x5O)ŠÁe*ý0–RÊy^¸3I–²æÍf{<Ÿ‰»8~§”7‡HäÖÁݦéBàÀîÍòº"1˜«ßÁ¦ÌZûôÕý/ýèñïý§ßû‡ÿÇ¿ùŸ~öúÏ8ãýÿ"xsÓÿøû÷_½=~ùõËóá"Ì1%»êñJiW¿Åu¼»µ†ˆADÈ«6PµÒ  D‚<çq7Ú/xèˆÖ °¡™kŒÑ ñáp‰7»M× O/O]ì.Ó$ru>5³Ô¥ežHb.µ"ˆ)æe¹ú»…¤ï{QpâÅš¡SàZõê¿c‚Ð÷Ëœ7}¿\Ò÷  çˆH¦ŽŽ8ÏS.ÙýÊåæ5PP‡•eH®&!®5Iym}ê–<¯­ ‹ ™·Z²«§!Æ.†]Ÿ“HP‚@q¿½°ÓyÚßîçežNgI©‚锣ôå²v)­—CH\rÓ·oßSŸrm‘ÈÉÞ>½[×éþáÕ©%»}ýæ‹_ýú·~+Ïßlßl•¥ øsã†ñ÷þéït‘†¥Âûu³é—Üœ•{h”MyY×RÙJ·ä*Œjüt¸ ›!­k)Nç"B¤Ë\6ÝŽyˆY[êA‡¬5+FJìu½$AË&'Ü¿Ýüò—åáLŸ:xæù°•5û”ˆ´ÚØE¬k@ÁfÑ?P“r=¥¿»Ý¬ÛVýð/xˆ)íÖl F¶`}zÓ- +u&ÊÃóé=ÈþÝñÖF²nú¦¯˜•Â(ÒÚs”¸Mâ¾øÞög?ØÜvš¬õÞ"{Îm©…]¡@7DDfp¤+RNÁˆHÍ èëýö˯ßKH)zˆÉÔSß™CÉÊïÆ±ë{­M¯=ªkΟ}r“ò» àߎ+‰EzÞÜ]Í¿(I!þ_ÙâúÖ¿~÷ùÝë@ûü7¿à¿(R”(ÿÄñÚrEo ¹"úØÅÒ,ÔÖš^IÝ„¡Ù•#ä©4S³ž%:¯uŒ²Küý¿ßQýø|9^–¬90}÷ó Qˆ=7¬Žh  L‘ˆP›Q '$6»Vc°çÒãZm* H `]+‹¹¥ †  KC €®F-u,K•õªO! 4Sf2†œKJñzéjF±ô‚MÍ•c°e Ò#š¹ qÍJHuY‰¸Ô’Rºj„MÍÝQÐÌщ¬ÖŒ„·ûáÓ×ÛßøµÏþίþ›ûóŸüèñõÃF˜þVó__¢Ý˜¾÷ùíoüêgï?,/Çüå7GWäï\J×¼ë‰cŒæîûÝvšŠbf,bÕ!õ]©º¹¹YæAD‘*¦«íÙÔm9çÍf£­¦.¾<ܘ0u©ë×e!áÒÚÕÔT£„â&,î $ª®m©Ù6­E•ˆœÝŠ€c_ÔD8ç…„ØÑ º0ˆP­MUÍÁ[)Ô3E& gVrvhM‡Ô/µv)­¥–—¡ „fî„,1$ C?îv§ã™oov$ò|9'õyžÓ6ÑÇï)õ¡, zèiÑRæÓþþþi:w#W2R·è%çûWo.‡§ê~ÿøúãùR*¥ ã¦m¶û"çeJß{ä§òòõËù=KZÏ/­|Åã.¦pjE†¸š_ë­äüö8w›!¸4n¬B·Ÿ?žc !Æà"gPÇ´mRUxY³ _Z»ÙŽó”]õ06»žmðØ­ë¹L Z­µÍív¾L]7TáçsÞ¤*ˇ§›mZ.OXNëÚoÏág ½1ìyr¸‹Žå)œ¾”¸Ð6Ò¼¥”È jé†5p'uE¡iãÚy¶F¹L‰á,Ûª®1ĘÄÛ ´™‰1@S³Ö5ô1¸†® Òh‹äÖNK{–™ç‡› §ó1/e:-cJÛˆÛý ­©®ØÔ_ÂOŸOs­Å÷»±©åq:ÁdPc+Í"€"r2'T&Ft‚`>¤t¸¬µU0w÷Ë|6S­®Ð ¯!pÎMuýE©ri‡òÿ(<üuJ1]^NóRœ‘›ÂUŠå¦î àWä78¦¢73€€dhsöN¨™2 !ÀÚœÐáZo)f©sa§æl€@ìÈÄÁIˆ)r ÔÌÙ›+7pâP› J$ l°.SߥÒ O-ÄèäØ\8Ô’£ÄÀâf¦†êB׈CĨßcŒ©”ZK+­B%dØn‡7oö?ùâþüg?ùÙOîíW>ùâ“}ßÇ¿Šu¦ÇÛñ—ôêíûˇçi™Û»'GŽ],µšy¶JÈÄTJU›§ê@®C¬­ÞÞÝ_^žKÕÍÙ½ EÜL›"a­F! ±’ ÉÀàf¿oàE«NÅš‡>‚;"–5›:‹3 ]Cî®cü®I4D-fÚŒ$赬F „ÜTE¤5»sšj É¡¨¹»µV¤–BLŽ˜$*£7#¢-¦hf€h D,ça32 s4mšçeYÁ1¯kŸúãáÀ`Zêz>ö7Û\ÖØC„Xw÷½g«UkÓí&p¼Yrí·;HRžŽ!vjÖQ€®»Ì“%vä‚¢8]NãýxªÑÃV¾yûî>¾vûçÓa|ó¶U›ˆ ” ¸êÒÖ˜xm8¼~]çÕˆ8 o^ýìnss~y[ÖÒ‰–õ<ÞßkŠ—Ë §¥Uè·»m7€.çeä. ¨­mu7ka»'7oãrÖ¶¦ÐÝêþµÜõL¨Öfªþõ¼™Ãa»}àês­dvKù||8Ç8ôœæò¼ã5Ú¡´åúiz÷Ûù²DÅ茛¶ÖIä„ç P©ãý¦ÏÖÚöîñr¹ôæ¤]'Œn6M'`½»»CÐççûÝ^çéC¸2G»Ø²Lµ•>!ûÔš–Z».ív1…z~z‚ÍÔ J"‰Lćóôöcùbûñþfºp7Ê® )¸¸ºG) ˆæ} Í=F€¶ŽW­SuU]se‰¥-e­CßK¢År©}ꩵu1z}øGaÿÅßð ê]¿ùü‹ïá·rnS® ¡™§JS`vs`î˜çÚÔyiÔ¤NŠYS&"[ÔMi×!3 ø1 k± ˜ˆ€T³«ü׫"™#+’£“}w!Ë\®pDÓ+Ô™‰ÝŠ6Æ”óÒ¥Tš^áH€à®M‹ µÖ¶»Ýùxâ@­5pÁiÍ! † jΪ ˆ=77]—BB]ŠŸz»K_|~ûË?~üÕŸ¾þÙO^ýèûww·ã_íJ t]|óz÷·~åÍñ´Ns1ÀOǦ„DJ̼fuD' ×í5çÒõ½®ëìŒØÏÓ9JD³ãe½ }WÁ@+í:àFˆ¸äêèÃfdæVkkf,h†Ò 9 ‚zá‡ÒRsÞìvë²X5ÕŠÆ·wÇË)¦¾– U]U¡ºSäXÚ¢f,‚j`Í®¢~x|Xæ9nÇ—ÏVjfdU7CVïP®]·  ÒZ ¡Ö\«9e‘‘)„RkFa ؉U` Ëi·ÛãÓ‡ÀñôrŒûz^XºÒùtìÒ †åp¹}óæòüÜo·Ìëºï;¾}xúðñ’/¹2Gn˜çá~7Ÿ/}?^v7kÅ»íÌûï}²|; ®û»ûËtYOóã'¯ËËǧËÇ.Ÿï{ä’€ Ùvss8žž?¾Ýo÷+ºý6„q:N´é¢¯ß4Äãt™ŠQ¿kên|þðÒm†t³_Ï¡4Ã& 7_ÀéÅ̵•Óå›×&7lù…J»¹ õãÓÃP¦å¸å²½oÒbtaâÆ³žn¡"†Q–y}7‘Îg™6ûŽ Ô6sì[­5/»Í~U}¡‚ª¥\6IRˆ=¯a£Äi©»a¼,K^["E´pˆ!Æî­,ƒ¤äVû®‘”ºiZú~ p Z—%]ž§ _ï~˜Hqed¯ªÊJIDr]Ogx7•Ëtl )Ên_<ŸßÅÏw±" ºåµ:I!<>Ÿ¤C@G©Z€%(rì6‰YbkM›R 3°0ÿâÕ}üž¼í×z®øÕ׿~÷ñý·‡Óiz9/ku`Á0™piÃ@âjŒÐŠZsB ¨Í`­Šd‘«14óȨ pUD!¹!2¨‚U¬ê!aÀèæÅÔYâµRq5»:QL"‹•”:*Õ‰8JSå fê€Úìj6®¦ øòòÂ!4S`'33P+Vr®TÑ»ÀÝ&ö]¸»¾øôæ‡_Üÿø{w¿ôãÇÿî“77·ûð—Vêùóƒ o÷ÝOü¨ª­*#ýÀ‡©ªªV# ‘†¾ËkíRÊ¥9ظךÈcßÏ—ÓérÞîFT )©Ù°Ûêš%%³æMEˆS,9;Id­¡[žªÕ5cJ‚ÌÜ4ÅnY1Wp­-DQÕRš¶¦îÇó‘†Í¦-*>¾cœ_iì…„C—e©¦WÇw«I”$H5Eâ·ïß—²†ãI$J ÀÀM•‘C®ÔÉ®OfÈè.S¦Ë%Ęs3"$ÅREr)èè‰b—€BxüÁ÷U±ì·»yKnÛ~Xë9Ö–c×çó9o7­)k{9^6»›µ¬‡/Ÿ_ÿóéãÁjùô³/¾ùú+:—TIB^›ÄN-›úþáa9Ƈ[>çŽ6»Ïî×’ãÍýf3lÇñÃó{’¡¿Ù´yQÖ&ààÃÃÞ¥)…€‡ùý¦«‡éi/7u©k))Æ® ¥‘!ô°ýÁ Àg—“ÓëûÏÓ®;}ýîcýn5m7<¥'üø6Ým`r¨çí¶+Çß~^¶ðvå\Ê2ÈÖó·§A Õºât»‘¼Ô›ÎkÞÇþéå¹g@º!žOµÁIf¨ Ëþ~¸/7e¢i^¢ôy=˜¥õ&¨çéc¨–ÁÊöf;&^syØm[É›1ŽcXQƒ*иÝmòœ÷» ;@”°,˜³¦nbìš—ÿe„Ð 6Óµ اÃ4¯­¢H;éæ—<½«_}úão6äCÏû~èc`¶!âMrc dCà?¼˜·k£}C!«Åi]rŒRвP®uª~›¢Óßô ÝøÃÿäï<~ï‹ÓÓáÛÏò廯¾}ùÓ¯>¾ýðòü|:œæPª6,fªXÍš _A* Lù»FQÏÍ{&¼Ö Ì€ÜÀ ÑÍèzóŽÀÄ쉫ɪà˜"Ó03…†À,¬Í€X˜RJ`6OËÚkij^¦ €ˆŒ@ÍYU×R8° ˜«b©9tÉÝ ¹‹|{»Ó;»»Û<ÜvŸ¿¾}ýêæ“O¶?øôæÓ7›ûûqèÒ刑?yÜ0~‚Å€ôíùåù€ ÎÒ!rH)æÀ¨ŠIÂZj¤`^Öe±æ@ŽH †Úšš¡óÒÚ0ô’k­YcÝ-kDŽ„D,!Tknä¦X– À±OµÖ¾ërÎæ ˜;úf·[.³š wÆ9WµZsâ¸æõZöÙî÷çóDˆ.àÕbJZpØîûR««åµ³­KI[•ˆD©ªÁí8L9¯¹ˆP¹Lͽæ©ßŽ&,’%Ö\;é$x«†L}—^ŽÇœ3¯B} y™k]oîóqúÝç%lÆ póêG ÛÁ‰û»û)Ï]H·Ûýó·ïï÷·§\ú¾cLáæîîxxÎK6rB†ñÝ7ßÜ<>ŧ)„n;êÒÎùÜ‘p­t»{õÐUÌZBŸ¢ôý 2†è( å4%ê%Ž÷¿øÏç·ÿ㓎C×È×—óøÙ+ÈÌ»q8}|‘Ýv´¸½My½@/z“hãú€M!ŸOË»/»ö€_m.TŸ#SòÐЙ¼‡YÏ}½¸ÏÇ®¨óç§üÙíý ¼äÇ]×%ܾy8O˜×¥B¨Ëœ‚ô‚º\Vãí¸‘Ø[Q$eôP 4€u]*EÁêfLC"«)I®­í7›yž@Ûá˜SŠ1¦Ò”C` LÆÌY6C¸\¦ºN—éòxw»½Û²p v¥¶~Øq×ãþx.k;=‹už¶]8ÑKœ/mþÐÍÁCZ4Žs¾Ýô›½þÞÑGdôÜ”ÔÑ*¸)x>" M¹ôýÐ $X`2–¿äA°¿žá¦ªó¼œŽOï?~óíÓWß¼|óîéíÛÃqš‡õ|™Î§é¼äåRš{kºZe„m sËâÐÍ@›»õ‚àÐE\«ºáÚ „XÍ‘ 9ÇX!*tÅcW”JC'fN!ÆV]µ ŠYU%F`ÒZkm1WGæZ*2¨CD)Z‘ÁÝQŠ<öÝ8Èvˆ¯ÞܼyÜ|öúæÓ7ÛO^í^½Þ½ºÛÜìû±}÷×%Ù—ÖÞœ~÷_~øÇÿÓÏÿÉ?ÿê÷þÕÇç—ÅÀ¢«‹]½-ŒÂ¬Ž]ßy)óÇÎáöá¦æRZ†¾•"­™“kSê¢Ö"@¥6L)ÍÓÅ8%psU"p‡«LXÊ”»± ÌÕÕšµ\‡M¿,+3K ËtHv ©µ8X«•q¿ÙæuÝÜìžß}dƒ†BªËÚ÷ƒ¹‹Èr>C”¼ÌB"t¡›K¶æ×^ÔcSo^]Aº8©ON€n1eY~ô“ŸüöïÿÞ:mînfCB@IQ«a·›Þ ã()̇øߟ§K:B^¾ý°}ó¸Lëææ¦º…€U­ï:ˆ²ÌY·Z^¿þôýË3X ꥵýíÍyšv›ýy™1„°®sßG=Í@NêºÆqPo¸ÔûÏïž¿úf—Â]Ÿ_žÓbŒ]—eJw·‡·ï4ŸÊÅú»PÖê^)×6þößúõç‹®ù,oîžë_}þJd1Ã|þ“§(ÈÖ‰o^ÝXÑÃW¿ƒöG¿ôÙò×_B„9jMq†uàã`*‘É¥¹[©8õ¢Ñ “^.—ׯ?–YÕúaXó2ö½»åe½mL »µ\0¸¹½ƈr)mY%„VKˆi³é‘y]ÖRªD±Úæu°›ÝY+µ^‡oçyáu]?yýút:ßîwûÃ4’0n Y™¼bØÞÞŠš1ªƒ5DÈ꤫‚(¹ œK5‚¾‘03¨Í/Oe=‘5"žr=Oëbr©H!¨ú»cvŒjÎ$‚%¯B…\ÍÈZi¦-v™¥ßüWû·ßžò_—MÚ÷ªÅ IDATá¯4€™y»Ûíö“O?ÿ•ük‡Óép|z:¼œ¦——étZÞ?><>¾›^ÎÇóñ²Lëº.y]zPA ªÞÜZÓm’>˜yLªcppVઔ ²GP7#±† ÈÄ ØZÍ%3§Ø¥é²ôÝ P…¤ä*,Í´ÖÊÄ®Æ!.uaÄÝíͺ^z&7½6©—!…¡C—Þ¼Ú¾zÜ|úz÷êaóéë›Û]7nÆ´Ùġᱭ/E^ÝoÉC”¾ïÿå??×eZæœSì0ÅpY¦~¯Ìý¾ëªVÚ$Û6—µµq³Áui¦@<ç9„LL¦ÌÁÜûÍÀN‡ !ÔÆ!z škìúe™‘ÐjÈqè–ó‚îÐÐjõµÒˆ¯Ì1PõÚÅ NC×ç%«ÛùpJCL2/ÈœÆ!Ä4­³bå1!²#Ý=¼ZÖÕšÖ¢¦^JEbî:q-‘“± Ð8nB ¹ÕežL@<œNÀ16óXZ­DXUEКê4¾ÎÃpÀ®ïCø‘w›ÑÃÉ vã0-™ K^#obŸòùL,ÓËS \JÝlÇzië¼ C:ŸnïnòZÐÌÕëê1Äz:mwÇÖÊóáñõ?Ì?ÿÃ]×…–+éã]:y²x&p³ùâ/Ïëé˜ú;<·ýö1 ¬Ó vy÷¶x¿Øíf»{þƒßýâŸÔ¥¤Í6´ÁÕß>®ýËôüÇüþõ}mÏßS¨Ìå¥Kñf`”œE¥™ J³—‚ƃX…|ˆ!u½ 2ßÝßÖºèí~3vã Ú¹ Ý™¯Œ›æiYN÷w÷¼ùæÛw̾ú˜âº®ÖKέºÍ¸)ª½‡,!t}z¾l·"TUsn캀HBÎÚ¼-¾©Ûáo|пDû>öýí›×ŸÖRsÑRÖ%ŸO———ÓËóñÝûÃÓÓñååx>^æyYΧÃóóº,Kž­) #Rׇe5¨mØ”j(¶V7$ €@TjkÕ¼„‰U•˜›æÚœÀ€ ´ÂÌ­nî¶öé_÷‘vÛt»ût¿OŸz7DÞíºÛ}¿ßô›M¼Ýuw·ãfì6cŒÁç؈^½‰™8öéŸýÖÏsሑˆÜ´4 i RKuU(Zk;kÔínBÉΰP Qχ(1/ËÕÅaj–çÕÛ cŒö‹N:0‹uº ÀÆœ³;iS#â+ƒÜ@4!$V3–¾ïÆy¾€[ÕÚ ¨›Ó:Ï!\ ±¼®àŠýQ0Ûí7˼ Q© ›±ï(æ4 mš§¶ºZ^fqÕ•À‰±¬•‰·»›eçóx{W›UpEÄívgàù*æàÈq3VÐfF]7}«y™&"ä Çóñ*ÆX–uwsZ.Cµµ(‘†þæf¿||Cj}rƒÍfSK EÖÓË‘X-šZnÙmˆñã·_õ»Ífèð›ßi‡§í~¤1Hðêê­OhË—:¤ìöwñ˜©¬ó“†åðRzº²äKÂË»'ÿ#{…ôýûÔÛ3ÅÜ­ï//Óç÷§s~Þ¥Ž¾}~¥¥ß¢ØBƒ[¬y­y ó\ë,Âýý]ˆ®D§EUuè„©&:™Gb 10€£K”eº$›m¬mФ%Oy¶®n÷k+­Î)²Ü½z˜–…9€Ä»R5Æ>/KÍùRŸÌus÷(]ÄÆ[ÞR÷ÙÓøjãyÑÒÔ»€²)XÔÜ]¬FÈ ™‚]-±*‘‘ÄÑ]au`h»MÌJ­¶ÐÔÐÜÈÔ‰Ðܪ*Y5I1×Üê*!…aìî^õñðõe= Å»ù‡Ÿþãß™~!a­ „¤50sf‚˜zŽq:'¨ÿ¿Ù2þò!Äb€-ÀƒÙ­ÕœóeÊ—óåtY/çiž//Ïϧãá|:OÇÓé|¾Ìk>Ÿ/4Í3C ®@,ëR/k)6‡Š $Hâàr5b2`tûÔLctFô±O÷»»»ññn¼Ý§‡»ñv×ïwÝíí°ßôw7ýí®ß )u1I@ÂOç·!Ì=⣺“Àr<ÿþW§§—y-‰k³p^—Ív\Ö,Âfš§y{»;?±5ŠÝM­ã.vÑ’´\»n8¼<¿¾»{9œ€Å¯œåÚD$×FD¡8rp«^‰¬*“p)e7lל9Hàà¶Qk Ý«™ºÆÌLDr)⼜ˆ£¤ØÊœbl­R`Fhêã¸YÖuš&7Ý ;ŠRrž¦¹ëÆœ €9w™nïÇS£j¹ßì.—ó´Lªó:é¹K€HHÙ•™‰ÐÝŒ¦ó9u=¹©ÕËáTHwÛ­ª÷1t)–u }ÌeeAÍÙC¨yfva›Ÿž"“•µI‡µ(µ[ܱÄ$kͦ>vB–eF§7·Óu‡kþúëßð®ËÓòÅ÷í¾þR_=¾ñVBŠ/O_ÿé¾z¨ù®çãŽa®¸:ÕËó~ZO§Žå®›±>åün§ÚSÁ%}…}"†u-”‹ ;m)kÕ|{ûzÎÓ>í\•lEð»›»¶.iØÖÒZ­`íîþ¶¶2Ïs!Ýp8Öq[«f>î¶(Âf1uâyšöm/„ЊåË‚æÌÝý'˜úžZ »;èݵeqy¼¹u@«–FÈàØ‚¤(èLÞ 7¨ˆ}­¸[`$fC3íÙ#FñR­!¹6tê›HmU´µë83˜ië"³Û2W 0ˆ[룙óÒ¼f•ýíݦšÃåüápþÈÝ+q:š^Ñ”ÜᲬ̌u­¶v?ŒŽýÄ àß $’%Æ~»xýÊ ´ZɶÎ:Oóép~~ž¦õxžÞ?ŽÇËù<›[©¶¬yžS`‘\›)­§¥’‡Á9†8(K)°äVHB¸vt)¦ÄÛ]¼¿Ù|özÿúaÿp7>Üö»mŸºÐ' Bü—7–õ×'‚ðÃýð·ð31ÿ³Ÿÿþ—ôáin )R®¥ÇyY%¥ÚJ`ι@QˆÉÊâàȬÚÖ2‘ðá|ÆqÆó²ö÷·gØoXÝ[kµ°ˆ©I!¯çËIÁbìú>-Ë2Ž}^ÖRÊBc Ìæ&]—kufš¶ÖÚg¯_¿ŒXMK)›}WÊ*1æšSèJÉcLIÁ8…€ažç%—ûÐHE˺ÛïŸÞ¾•”¦eâ§—e]pÜ뺖˜Â¶§uF Zr-ë°Ù¶¦æÐ±4­Sb™3mw»µ¬BȘ˜1l7ÎéÚ¨€Ž­%ò¶í{ÈyÓ…`Ö§4Qi9oR§JYÐ}3Î/óù¤ÖV²H]Wsë°üàáÁ_øÃŸþñîîuÅ46íóñçÿüxóúGm=í—åÐÖ:Ãæ² x:µ¥½}ÿí÷¿÷ª¼?¶¦ûÛje(kŠ„gÄå¾ku~q˜nÞX0aéCrœ!ãv#y "7C×4畘üåpTk`¼z+)’© k¤Ò W ¯ºþœçÍf ¢·ß¾mµîoïR7¸[dÎë9W‹ý»‡Tºa÷ƒW"#[h 4¦ÄÖj)0€ZUc²f(C(ÞÌÕY80€›zn&€L€Ôˆ—2€¬H¨_J1"h¦©”z´™Ï­€!ˆÎœð°$nêWU`ö¢„}LHºÛ=~ýÇ¿; ›ýf÷?ÿ«˜õ¬תÂiÓoZÍNáþþnºL—˱(ÀÃÍÝ»é/èþ&‰˜CÇã>܃ä©?}]@s›ç–×5çRª»µÒ–yQw30mÆBqa(F ˜B˜8ÄuÕµj.J…¨K‘¿CÓ@´ÒЧ¡O»mŠ1ù¸Ýÿ™„ßÜAdèb ÝW?ÿzúꛊbmUD¬¹pd’t§y‘¾³+\!LÂývÓšÏ'rW‘ æ&}/cß…þ¼œÙTç|õÇq(óJŽy^‘¨ª7Àq3€Ph®®˜D$„V«¹™_!ßøöí;éRà¹î·ûV͉Ykæ~ðÙ Â|< û½5¥Mè¡oµæu·Ã´˜hkOÏϲÙÈÐ¥šS?–f©ë׆±_–颳 ]heíw{}Ôœ+´q»]Êên bÈóDB𫕬A$€`i0=ºbJR–9D¦Ž¤-‹»u¿Ÿ§ˆŒ­m…¸‹žçÓå¥cê‚ù˜ä0ŸõôöMÜ=æ÷ÇßûƒÓÏÿÅ㻹Ú9Ç‘»´2/úÉpÓço³‰µ8Ïyd«úËáç_<<^¦6/n}ê–ßêÙ3:¥qÝ[)ÈÊÜw¯ˆ’ÄcJýrmê@Ä~µ01XEÇ”˜b³íöfˆQ®îqŽÇ£Äp¹LCßsL©ëÌ \c“a‡Ý`ÆuܺD2è˜X°™ƒV¨µÖZɳÌtÃd&¯P …”TŠ’Þ;XkÎ9GŽ‘ÏÓl‘yZkCX¶©fM­YUçƒE3« Ñ!ä6©‘C4õˆŠ€«–ž\sÍÚ´™Š1"‚¯R´‰j Èk)J\KÖ"À†Y ¡ —ZSÜû¾Óª÷·GÙÞÍóÖõ®§õw—pYæ@ˆØD| ŽÁÿôñ ¼ïR«e¾þTÚ¿ßüË""R¶2]Ûºq~wöâM{~m0 •  ™¨ˆ€n¼˜ UAÁ´* â«Úž _AÕ¿ó¯.ÄtwHüûÎÓ°ëþÞ?ú,&Ÿ¾,ÌÔ²ºàsÝzߨö ÷NµæèC•bÊyÛ@[Ó¢c,j@ÍSȪ֤h³"HÀÞ¿Þ—&­lŒ\·¾•vy¹$ŽV$P 5Ðn¦ÓE—¼!q{=‚sÁ^% Hèȳ˜*x(¸¸ë‘1ñ &æ0K Þ¼ýðÓ÷¹‰™‰Z?Žûýîùñ‰½cbïš¾Òøº~œ×ežÖÐ÷H4-ËḗFLÎD<±ï†\OÛšC×µ5«V6E3äW«jÕè*Ã~Üèõ²„èšÔ²\¼KëuZM⸫×K Ý>ÀòøÙ‡æ7àiö}Ÿ­p?FÅ÷Ã-ž/±üã;ûõ>Ùïo·Üõti]ë†a‡Ÿ?ýÌîóÝ‘¶Ó? Ž®³†•«Õ`=±¨Êtú½þð\_ÞöàC#d·D¼F1Ù¶Õ££V£çÑ÷Ã8ša ŒÈ¢RrëºñÈa×’¿? L„­5v꼫¦‰ÌºÐíÆ‘Ak+ËËÒíwÝWï‘RKRïÜMÓì´RÛÖ<•ÀÁƒE653ï]†=!z1 fˆRˆ={è"+‚åU¶ì”,94mžYÌÈ ¥0΋0+ ë裢lËgwÁ3Uˆ`-8.- ràb„ªTD”mH¾¬eRa¦&m•M÷ýPDÑ9O¦¢†]½^¡‘=BY»ñöñË?¾¨û/ÿfÿ¿þ‚?-Kçc^gtê½»è)Ęrèûþãçõ߀a¤•ºnõzÚÎOÛõ*%÷÷`À> c€˜˜€éðʱ£ZÈS‡ôÏü·ÌðOuÿ$ÿ¯üÿ4Äx{ˆŽîºvÑíúîïþ½ßþú§sÉU* ±oR¡”W^Þ–Îû\sìûº­K“Æ™=a¾L0öì ×e‹CÊóÚ¥TJiÒ|Ys5=tÃË|v)îßÜ¸ÛØŠ‡ãéå ×in‚çÓÅ K5ö1¦Ø¤Õ­–R]t>†:Ïq› a™&Ï>tñº­JÜ,CFDïȇªó:¥q7öÃérŠ>^¦ .,dìYP„À9fGµºà«(’s›š„J©Ý®—Z-Ð2Í; >ù¡ë·çsüº”Ö äuíb@爓›Új9G»Î?=¾ôÖ’GI°‹7µlÉr³Õ¿¬Ãx’¡guûy¾ööˆ—û–ÚŸ 6}Ógß eÙº—¹äânbòybÊ9Ç`Þw•"ÎòGó~ýëߤúDn!àºÒ¤ÕòöánZ¦Rkß÷Ã8ÀÇÏ_Öu»?Þ ¹ëtU1 ÎÕVûäïnöµ,Ó¹>':Þpž°”¼ëS|É%&ßpwçÐÞ¾ÿýJ#såµu;Tòb³ Y³@£k¹­­mf-´Fâ ÕTБóÆ`± fŒˆX›nyS|½©Ì๭™C XEÌù¨VÃ~[»>w} …èÔ3“¡EÈÍØ™•™#úÁ9¢&RZ#a5hUQ^J3m"V˜•-@a1#ERÇ,­@5C±ír–¢Š’öcßu¹–oÆíV?z½‡jF Û´w»Óy®vqÌ@qˆ°,Óápûï À?'"Z·%¿<®çÇítºNs«êÅuÖaGD&•|B5ö„D@ÿUÈ”˜Í”¤ü?æìì_¼â(‚©!!¼j ^¥½ÿnd¿ ¿çö]t»c磅?ùðç?žžOMPEÕ]×÷yÛ°™ ¤¦i"¢¹ïYµ0@VœkI1i®ÐZ#¢`Þ3YkhpNÒj H¹¡’gX[én÷„¶ÿöŽš…¥s¶UÍÖ¥xfs¤jÑûf CXµššª†aè\X¦ëíÝͲ¬F˜jmÇÃÍéù¢mµp«ùUìeÊDÑ%BÄju)Þ„×§­Îû]ê_êRÈKñè¢ÓÚ†~<_^Æý¡•컞Él€*‚­hqâ" Z¾žAÕ÷Žg]_>Åñ2MãýAJÉ>Ĩ.¿,Vz &Ûuúƒë.9„§;ûð޾OýzÛEVSÞI¥}ßí7 züãËËç§/¹ÔüÓós?û”ZCOf­@»m›ÿüÏþ|Ò”/»ãë:ýMÎ[#8Þß圥´Ÿ¾¼ûŽÑ—m¹ÿMÞ6&züðÛonn"ó<çà@e©¹l¹½{ûnž–¡Ç±ÛÊ6îñx'¡ó!b"¨T+rm£Z4ƒN86ä\‰D5(8Ò@Ì<‹˜Î+U€ª©A >³˜ŠY“اWÔ®gfòêÕz- µzÒõé ½oØSè<1:Doߨ´ÖL yçKÞˆ’wÎu¡VC³Bô¨ÕÕZ´¤}s¬iA3mæ§yºn«ÔŒ*4+•=ío¿ùÕ¯Þßý­·ô¿üÏ¿êÀGކPÚF€‡~ˆž0ø†þ»¯ÞX^-Ù¿sàUó‹` ¯†¯W‹ h•W “Ôš¯§åËÏÓé|ž¦R´–æ Ô×y“îbµ’c4EPµ˜H«YJ­¥ÕRr•¤@EI¯‚*ÖÄÔÕ‚c3#GŒdjµµ&Šˆ&jˆ¤@Þy‡c=cŠÞ'ÏDÞ±#¢¿†ÇØwá›÷.&7ñö8þñ?üùWß_~þùeÅs¶¦EjH½K«Z•CpÀÑŦMœsµÖª„yÍ@ˆHµ5Ðuª77{+Uòeº`rö:x!À Ð”ª>>=¾{û.uC;·áx\×ÅLÁ°Ýò*Ùj@J!Ôe…®µ Â4/Îs$Ç1Ù–çmE¥–a7Öm3©ÎES%8 ³Cï<U(j9 ]oóBຘ®//ƒaÉKdhÍö}o`Ã8À²ú~€è&}r·uá&Ì7wwHPk!„¨îÎùÌ4—R Á­ç',˜òÚËç¶^¯ë9ô½ _.ËûØÝ[ñîüí-ê–‰ÃËsÛÊz7øu.Ôf×r¯ñx<Æ.ÎÎMóRls)Ä\àùz‘¼2j«F)0iôn]Ëù|þåw¿<öÍÈõ}Ò7£Ÿ_®ÞÇû‡q-×èƒtÞ£S“RÍÛe]Ÿ_^nß¾ã|ÜwG¡°ãP$Ï«BDN UläÌ*eI]ß«sÍhΛ!²`@4õdPÈÀ9Á¿Pò€rE­jŒ]S‘m>yaU Jž¼l*æ=8öŽ·e½\×€°ßí¶eí‡è‚3±wεºšcsú ½Ev$ÎZ.-¥HJl&%w>n‘œŠji[Þyÿe]—9÷1x‚yY²‚gÒ&CLŽ ›YޖĘçÖ(Ëpûf·ÿŒ¾û¯þóÿì:ý×ÿÑìN ”ÛÃpóq©îîîùùúòtž'ù )üwë?WÝõ×5&­•e‘m33!þ‹î»Ö¢Råu৬Û<_Î×eÍ¥ŠªyÌTK™Ê?[`Ç옹JÛ¶6ÏËu©ç¥.*ðZñyÞÎsAÑw¥Úe^š1·,  ïÓ~?^ç ¤Å®sDä=˜:£Z› ¨Bm‘|ôl€dû}Ÿu¿Ùïû»¡ëƒKSì 11¾!ÀL шØŽ™È1½ÎEýÛˆžÞÝõÑÑ;{÷Ðÿý_=ýñŸ¸ŸžëÓç“*±6SÔœKlª¥Õi.ìØcDd*¥0"#€¶úª¿¬ªì¹ëúù:±P©kpaY7jšÒàCPÕK¾”µ¤¾[×U浕ª—«g¯ÚšéW_½?]ÏMõáþ~+e9_¼/Ï/ \çšN¹8æ!˜4I)¦a¿æMZeïö[Þj6C­µìw#"Y[sAOÝ!Íçóܲ˜åZ†àçÀÞ•y‰cÚj!‚”‚Yó]¿NËpèæó K6U©ÛŠëÅiG`œœ"tÌ<_Ϲ 7ísS¾RV9öc ù{˜ PNRö!-Ûöu*oü§wÎE}¹º‘ºBm5z÷öÍÛSð?}Ì«ïRÐê‡>Kò²¿éA³\늒çÒXdÛ»¼ny»úè| _¾-¹ìm-€èÍnЖÜi«‘ÝãS=t r\×5¯—ýþ[1é|ˆwØyÏUÔ™£€ÚÈ9Jݾ‰Jkª­¡"«uŽI(I»®©biу I¥5Vcç‰ØSçb°Ò¤ÖÙ+³Î£6ØØyrDÈž·R0y’Vçu!$G»¾3U5©ó‡N®ZÛÅþš—~x0$B4DvDÈèØ»m35òØùXjKŒLnÝ20!ÐÍn÷ürâ>îú!°;]ÎH -»èºäALÕµ"µÕ>$‡@¡K»ýñ7¿ù᫇“¯tþÜ“Çx8>ýø (*Î; —ÌŽœ–L»¿Ö, ×~‹€5ɵ-Óòüåüøt¾Î" €Íš!hU D!º¼(4i9×’‹š"rmR›"Øóe™®WEn­N—¹ 4×˥š+—©N¥Mr1AJqX–¶‰Å8f15‡Ýér³’äM÷ÇÃóÓ³óÜÌ‚Pµ©Dª#R \ªˆì†Á§˜·åáöF±¡Ùþ0ÀØù~HLÊŒ‡›½‰0Ap޽#öž[«] ÁÓíÍ>:Ø }pÐ1x×E‡„1ï˜þ% þÆ1Ýßvcîþëwû¯ú?þûÿ”à´¶ç%¨ºåSŒôJßcï=;QÓÖÇÖ¡66&P)æˆH5:ÿéËgVˆ]’‡Î/kn‚¨‹‰Öš;Å¢f›Ê]ß!ŠäÚ\ôL´”r:]Þ¼}øÝï~×u]ˆIM÷w{?¤-<3ø¦Ï—k7ì>‹6±R—cÞrß§º­)&Þ! ù>V-¥¬ã~¯µ²÷%g‡Ôˆ” ŒR«ª8dTõTjÛ{0Ùd;÷ë2ŧ– ½-ë¢æ¢d³¢gº¿9¤aûøk žäü²^?øÔÔÈ“_ÏAžØVŒáôù»»øÀW³BÚ;ï ŒB|ýž9O.zfT³užÁ1¼}û°Ìäí¸ëN6•\µû¢l7Cïÿò›ïÖ-_Îg'¹C N/Ÿì‡>xŽ)äåÅ3Tpwû»4ÌJÝûïtïÿÖjAÚV"*LÓl53‡ˆÜ´ÔL]Œ€ŠÕ ×>ÈæX«TvBB/fµC^®Kb߉9ZÛ¼'φ&¦Œ¹ ‚šåy35önÚ–»Ã^Ä )yGUdHœçy$bhbXVÙ^ç|·ë¶ë\l[u}(ÓL¯9CBVlm­ML©ˆhcÇš*3˜¢W󑆗e«y+ÎñØÇ¼s µBL5‰‰·-¯¯Êòšw7uy!Æ¿ó_üqÏÕ‡pØï½s×ë%z‡jÛ|5ÄkáOç>þ5Û¼®ø!§×&’WY¯mYótþüññóóôë~~z™ pÛ ’ÕÒ’öCo­ÎëìÇ]%³R£÷ØuF@@5—aØïƈ*Còã®‹ŽÆ>îw}dHïwÝÐÅ]º>tÉõ)†àR`tî/,¹ÿ†ƒ€]r_¿ÝíºøpLß¼ÙÿÃo_þîŸüüýã|šå¥æÈ[kªÕ…ÔJuΫ©¶†d Zj¾½¹™Î3²I%UÝš#:ÎyõÞ1;÷ê]Y° Öm{ÿÕWŸŸy-ÎGi ¹anyk×䈹í IDAT\]óÒëPqmµåÚ9 °ýpË»£qù‚ø8žÏ×q|hФ¨-óÒu±å¼†®Kfº‡­æë¤Á9Çe[SŒw·eËk•PŽ7£ˆ"4Bº„ά‰CEOÒŠÕÍ7>ô ½ëw{Ž¢–ò‚:+e“Vd›´‰o@èÐ 9'-“a`ç¶*Ô$xkê•T£QKña¿©*Fª×"µæ\c;¤}hMÁ «VjJd€` ÆÄ€JFDhJMŒrΞ} Ù‡6_k3 纮•z—ã0@n¦Bò um¦%€Õm © ¤Úª¨„à´*´ªLQ­˜`t:m]BS5U˜J%­}0æÐ¤¤Ô?Ïs­¹Ã]UÄ*Z뺬€HN U¥É†ƒóÁÇCå}f,„—E˜˜¨· )õ›¿ªè¥N®3ý·¢˜â?{>jø/_wþïªH1%Ó¦­Á¶–é´]Îóåüôtz¾®çëò»¿|úrúùÃãuZDµÕlb¡‹žðîþöùñŒÛVÖu«MÏ×K.YTj«Ä®Õf&5çÛ»‡\VAï}Sä@íòô©5 ã.™še%2Lk%âæÅZ5³èÁ±#j{U€ZÖ§!b÷Ÿó9SáÍ›±n§Rê0ŒbÊ­¶U MÉ…&ºNS ÁÔº~7×i™RßçEÖiw;rît91]¶­l¥ôݰÙ«m·;°w]J>zvn+kpÇŽ»a”¢ï‡p{Øw7chèbùæv | ®ëÉyzý¨A0Ïà_é‘ý¿ #ÝRL¼ïܾ§äø«ç?ûñzùüÚæB4†¡æª ¦¼3Õ!¥–3nÓ ÖH@˜­µŠÚ¹°•üøyò1Fß­%ǘ9«¤·e >taÈ%ƒš÷T¥#zmÏiµÖ¶ýñ N19?mõÏ—×’õçO)8c¿{ÿÕéûKÞ‡Ýùùêú°^®ÑÚÊVkÓ}çÍdÛ¶û7ï i³Ö§$ˆ”Ò¦e[KÎn­1"ƒMO‡¯k«ÓÓôÇ裿^^{.["åfyÚÆ‡¾N/yvCYÛƒK¶;mÏ~­ÝúcΗ[œ¾º,Íõó/öÙ±LCßï†C^çÒ¶¡Þ}ÿþ䨨Övص””R«ݮ傠}Ÿr^R?tïß½¹\N) ¥0ÐÖ@Û÷¿þ³ãíÑïÃ8ÜÝ2wÝî»ZqÌ«ÖR§•jöŽ·VI8—LLMK¨^ME«s®‹®"8çÍQÓ¶KѤ™pðŒT¡KˆÆ.sþ »™Š©´úzܧVÍ1:"m ªˆZiˆ*H$ Q¤‘Z^fNcH‰ˆ€›É:Í}ìÁy«ÔGŸØLjD‚S‘¶<> Ãà9EGT¡®§”‚]"/ ­&g€¥Ôè!S‚0•¼åÌ08t[)LXkI1ô}ÇÞ1˜rð÷oöO_>©‚r®™™Atwÿ6˜*£äìØ3!zÇÓu™®“ŠcŸsvÎqÿWY @kµ¶I.  ‘Íš¼®þä8"’C"04°ÚŒÌDÍ Ìj®Û*Ë´^/§óåñùòññütZ>~úòtY.çëåºäÜ.Óô*dAvm]q]»¾»üöw‚¯ÕZÓ\·’´V‰ˆD-…Ф1S+-„Øj^·bˆw\¶ c°¦CðXWÈs .¤”·sÍëÃqÿùò(LÕ1£sšcò;¬ëº¶‚òýÜ•­ñ„_½÷áå™ ¼µ2•1öìHÊúîÝ›ÓËËËt>Œãr=‡®óºˆâûû=žŸ¦oñ‹óù4½,]ˆ¹æõxèL·¸>øÔùˆ0t>ìbðžS`úËØ=ôÑÿâýá°ëÞ½Ù÷ÍÓßûÕó:->>ºä·-ƒ8 JÞOótx³«ÏCÀ’ÔJ@Ñ…Z«´æCЦŒÞ«¡ª¦ZÓªæ˜[­óõJL.ŒÛÖ”¥6 cÔ¦?M/»®_—™È½yûðÛïûõw¿¼œ_8졾{øªŠÌëÚ§ÓÒÖÇ(kíRJ7È2­«lyˆ·Î×—>ÅëO¿A±ZÄaJĨ¤fw«ÊfCTuJÙòúœ ’®Ýšu¾¾Ì_4çwß|ûáóïzi,× 9m}G- ùv^³}YÀN ^;·¯’Üå6•½Ó®ë(éíÍÐG¿:G5OÃБÙq_ž_îï>ùÒ´\§ù°Ûç@%pìbtìNçËa¿#Æ\Ö—Ç6Íï|Ÿü|z4tïï—¾?²ëÒñC‡¯st(ó|ª×epÉzpÑ:³Ó:¡ó‘{D_½yÔDjuÌÀG`BCcïy'"Ž xCŠ!ÌÛÚDáÍË®Zû®5QµªEšõ1F€lª90#PS3²ÒJçcn­I¸U51Egh I¹c*"5¹Æø8N[ŽÞá¤9(¢ ŒX ¸èSìDEÕ"Ъ…™SŠ¢ÚÔˆ‘€oÞ¾kóV¦31©TÉU…ãèÃÝÓó“©úà§uò1´ÚJÉžh<ºàUDÁ´–.u˲Õ&‘AköÑn˜q^OÛbœçݰC@0*¥Ômݶ|XsQÃ8h33@QP{õµ¶j­Z]u™·Ëi½œJ©Ò*;*[AD3ŒÁ÷}Bï»Ô‰)‚!;TÕº®Ä$"j¦­IÓZÊ4çiÝ.KþôåùËÓùée~|~~>]E­•س–K€Rš÷† ¥%šŠ""0¢VEOûã!¯¹Ö£Ñ& ›"®[=n—Z€7ûuË’W‚Öui«†&wÇ$¿¬LãÃyÙZkhM«Žw{}zzŽÎíúaž7ç Cš·­Ìy×sÍ*Ò…ÎD¦uºØcJÉ…tz<Í9ß>ÜmµÉ»o¾þùã§:_v»Ã"­”ÍûˆJ"2˼ćcp1?OÏOÏ1 »a0ãÓ|8÷Áñaw»µŠ€.§SÉÛ0Ž>Ʀ–«xǘúé7ÿÇÃÃÃ÷ßÿðþý{EÄà£Hmµò:/)¦y^œû×Ì©uÛê¶,µ–V«Õjµ”m–u[æåz½¾<Ÿ®óüŠU …­l¹T& 1ôŽ} »a@Sb Þ³ã¥ÕëuF#Zçi!Ç˼ž/óuÉÓ¼,kÞÖº.ëÖ*ù Ev‡Hcм¶ZsŠÃÝͰä bMÛ0 ˼Ä!0—\ª¢"ŒäÎ_¾8§1&‡ˆl·ûãõzrÁ«JΙö‡>—sìcPf¹>þt¿ƒ²6F©<µ¼í]?Í´§N±Pm?ÿø §‹t~†ÃîP×eP£Ìµn;€q?\¦Å!CòV6;‚·e‚’1\ŽØ¨Née»Rµ¬u9xþ›_¦Ã·ã»Ï_._6‡·§ë3ÂuÚÚåó¾ïcž^>ý8îï覷&µœãпïz"™Îýñøøåeݲžvý~Þf5ó!Õù²…ØÍ¹]¾ÿت,[Ic'¥Üßßç¶]Ïgï8DŸbwC-?HÛÞ½¹¹éãqð7Cw}LŒ]ç»èûtüЇ]Rò]bïÙÿ+”„!ùî­¸í‡Îýí¿Ó©ið‰PÀ” K½;¦ir~ •Œ„׺ß÷ë¶9U´”‚LÎû-oL,s!¤MëV!U×(·êA” çÊŽØ3Í9Ç>ªjÖf€æØ3×*1×÷„zrôx}1ïêºÚŠô{ôù§­·µ;­óöów¿ï<hÞC¹®·oîL×}`P郿gùǘÖé|-¶í†ýúé·7àü¼ {þz½~¢ÄeÞ†ôØÊöòÔß&ˆ]7?=Vñgµí°g„ÖÀ³‘Èqß·uí}»ãÇ/mØûݾ#ÂužJ­ªUjëB(X©ïzbî{<Þ HÙŠÔ¢*-/ “½ÿö»tóUˆ=÷;‡ Öª`ÕåÔª˜9õˆfJJž<:R„N|ÓÚ‡à9 š #òŒhŠ„µ5¨9ù€Äjâ|@+ÀÈä Ì ©äÖjU•\À€Eš94Áà\32ÐÀ,P‘u[&ç\ð¾”ͱwž¤4OÈ¤ŽØ•š…LJ6#L@A𙍙Õe]{ïÐZ`1dÄÞÇmYÀ+XÛõýºžs&Ö†½OÛ¶†à mÛæŒÜ§ÈÎÕR?}¹y{ÿüùÑÈ9TB9gÇ®æ|¹\¥Õæ\ÈóÕ¯ëâ=K©Uõùå±ëºª¸ vž¥¹¼ŠÖV{烘ñ™ØÇýËùå|:LJa€Èl!¤®7Tú×µhbµ”iZçiûôåååùr–e]µ´².ë¶äeYçåôòTÖm^'ïx.ÖÌÇPK&çú¥•¼åÃáÇÔ@ËÙÈ­¥8ǦºÕÍšµÚZmÛ´\4ú ©,›½JÆK)DÄDbBÞK)ªê¼7S‡H¡: ìUµ–í9óŸþðýÛ·_MÓÔû¢ @µ™s‰|x~¹~ó‹ï>?^0Æ4ô7»ÛŸúq«âcÈk)µ|ý‹o?}ùÌÄMQ©åp{$‘1y"’@ØÇ˜<§ÈÇ}¼Ý÷CG·»´ýí¾ï“;ìÒÍ.ŽcŒÁ3"¼vÿ¹¨ |ûß|û¾'¤¼¬Š¸ï»¼e@¬¹ǰ­«sàN³;îÁá´fv!,Ë6¦”sn*ä9550 ä2ŠÖC¯žY¿¢™w*êûX·L‹)^–u7ôë¶‚ãŽ=D¯[®Éy='#ËmuC:tqj¹¶ù Øc™á®ë¶K{B2’@U³çíJ×ëM º—§{k ¯ïµ!nkyÃпΠæBÂÖ\b7¼Þw«Lý˜µbª…!<<øyÎ×Óé•!»à´íö£Yf@$¼»X–Õ;7Ž#€–*Þ¹yšy7"¼¯­ä\–m;îö¹le™Ñp¹žÞ÷Ç÷¿”´c@°ŠME²B­ÕBmBd†€LÀèLªGtì‘PT* Â&ÂÞ#±šJ.ä¼™ÄJkŒ(bÞ;ÕF@˶ìS¨­¢g~½«ƒ "blµ"9ˆ¶œ‰ ¥~gf^·ÜJq1JÍÁ5C5ƒäzDȹ"¨šÙZ·è¼ãN¡v¹Öq×1PËUa­BŒŒvžgûÄΛAY·ZÊë{Ú§~^.çó¥¶ò‹¯¾®-ïnËRæuz9¿ìÇýØ÷ÀTrk„ï¿úº–r½^_-Q­mÈaY¦¾ëóVr^º~þüéÛ¯Þ.'ÉÙ9vL>¥bÞ”coÏ/CÂHŽ»Ô›ñV[ýáOøôñþàïîî/׳gbh­‰¨æ¼m¹ôÝð—¿hUr.§Óõéñôùéòß¾\>=žçRZ-óåB(ºæe]I›Ê–—µJmÁ¬ÕÒ‡.mÛ…«‰Ùe]¼ûrw{ ˜§¥ƒµýr‡úòsUø‡÷åçÏ;ÚO3ë:ÿ'ïÞÿïÚº¥±7¡‡cW–SräòlheÓè“÷NJ»?Ä/Œ¡kb°ÑÏçßr¬å¼Öq<îvo¡ÕDøpsûååÙ;?-—Ã8ÌÏ'h¥«M¥ê}Wk•›Ã¡µý®‡°ëhô´? ß=ìöûp»ëû!t‘˜ÌÓ0¸ÃÐÆ”þ ½jˆïÞÏÏgê¼s~™V$v.H‘nw¸^Î>¹äñr–Z›Û‡–Å@"±3¨É«'Ë5dƒDPkH="j®ÅêÎ ƒ»¼|VˆÇñxÊKõ¤‘jk€ “÷ë²$… Tæ5Þws­ã8nu]ûö¾ùݧŸò/]¾÷7V®³M)ÜPØ_æ“Cžsýf¸ÌvûýZÁGV4Ïœò¨õ]«—ÎgòeØ­Ã4QGäó›a¬Õ-yS\šˆEƒ`"ë0pi¸,“YM)ÝŽ­.}L7‡ñ¸,KmuHîöp?MÓz}Æþ8¤R CѦûáXK{y~º¹9Jmùò2·ü:›þðËÿàðÕ×.tÖd*“l™™ÐLȈ™‡–C§ ¡©¢‚'B#ÇAÐ*;oìëšC d *¡2¹ˆl͈Hœc°Öùà}˜§$ß” ´ÕZjޱ#dDFjR À{ªó ªšKI¡oZUUaeZÙB`ïЩ²„PEšJnÂbBRYÍ:‡Û¶iæ”’O‰<ád–Û¶­a7dBF-­.óIÁ./¸ßí¤¹¶æÆËÒZˆÉœÓZŸ¿|¹»½!B¸L—®ëXÕš´”µÓœu±PÝŠŠŽœéÚ„£5rHÊNZr©.×%÷°øïwC+e·ßŸb`D Á/Û†&Ï/Ï>ŸаˆóÎ{ÇÙy5%0 pŽB|»óï¼Y•f`Œ`sUGÞÀ3WQ †¦ÕÉ Ì˜èÕLÀÖmMÐ(ƒªTô.t)h HŽ˜éõÛ™€¬¶²-ĸ­Ût½>?ºž§y[ï[îêÜÿ×¼¯2¶2pE*cô,Þ–í œØ.¹kžÑÅ1DÄœï÷C a¾Noo>þø©óüøø¡ëº¢ùƒ7{swsž¯)úÖUº˜¼óŒÓ:~zöÞ/y—Õ3‚@×…*?¿Ù]À»cç†>h«ÁyBø?Y{¯eY“äJÏUˆ_dæGÔ©îj`ÒÈá5yÏà ñ’÷4f3À€3ƒnÍÐhQºÎÙ*3ÂÝy±†o–ö{ÄZ¾¾5ÏùíÝôùûùóÏ?ÿñÝçï·ïOÂ~{œ »™†e/ëªqÈÕt’OÒ1I`;Þ²OtU/J‘TƒD«´´—Lã@›6¶ÂØ¡±šzp룃y·]ÆÁ·UË'¶-LŸ==]6’áx¨—çÛ¦}[Ó8lËC9?)9¸ù0Ì¿þ?þ÷!FžX×G¾Íkë7†—ó'm޽¯ýço>ƒ?ü§·c¿<ûüRoѵ~ûv’7™êéT‡e›Æ¹™™õ >ÝMAâùå±Hq¢(Rû½‰÷²^½q"}ÿÙmQ-Ž1†÷Þ·Þ?~úõÝí ÏãÔJî§>þ°…=„bº\^z5p8_žrà—‡‡Ãøá'o¿øcJ]µ÷r=ƒ9[îÄlÁ $Õ¦Z:‰¨Ç(ÚJŒÔѬ;€v“ăª{«ÂÇ„n{iLž$o[ap‰äj ŒªÌ⪰Cqµ(ˆº1–Ò±·–sTmèVºQª½;@Î#x'sUGt"c·¢[SÓœ£ig*àµÈÜrŽ@ŠŠh M±–;"dŽ’ZÝÑ=;3¿¦O/YˆssÇîÂj)rÑ&ÑÌu<¦Üµ KuÝJi½kJADÌú8þÿDU³õ¼>><ýðÝÇ/¿}þíï¾ÿò«Ço>~4Ňǧf¶–bMÚœ"+†mÿLR¨O¦ûÛ(–L™{|›>=|ûfRrm[Ž)å@`DFóÆVPBäŽO¤ÖzßJJBÌE6ï4E켫ÅuÝÞ  /M-»Á7ã8$“¾Ç Z¯ƒN yJ#9ÆæqL99›Y)¥V]®Ûº-¥iæapDp”ˆ…ÑŒDBN¦ ¨÷Z;twmÀ… C@&QíìhŽ ]EI¬w‚ ™÷Wà#ª‚ºöZX„ Ù™ÉÉÀ¬Z'j/®J1 Ñ!Ç›»Ï‚Qµ_/—óåz}y)Ë7OÏ¿žB®8¬–üp¨:6¾);J—%ûV®Õ¤VOÓ0Ì2Žû×ÉÃòt†Ÿ~øæ@¸mû%.çÌq6×ÚÔïnç²µ—óËgŸ¿ÿöëoó0äØœiñöôñw_‰]뺬—畆ÕÛq>mû굺{Š9’¾¹?½»>|vøßþ—Ÿ¾;3Ëü&÷¾zÓäßß:mŸÎ¦0î5ÞÙº‚­Ö=Xßu» yæÀ=ÞÄ÷ççÇ¡\e™²„-À†ƒ‚÷îŽh½1’—jÛf7©ï[Œ£AØÎÑFjÏ/³@lÛFÍÏOص ïløþ¶.ûmùÃÿõ™sîMÏOCsóo^æãñ†êÃú’2¼{øúåò«ùþþp †v°†oct`ŒI?ÌÓù¥MCmEKÑZw`E„Ó<,Ë2sÙwЇ»µ]ƒ,±—²û0ž($‡tº½Ñ®ë¶õ®7ÇãO¾øÂ]Ÿ¯ÏóÍlîoß¿ûôôÓ0M“oëåñÓw9¥ùxºùÙŸÞÿû»˜sÓê¥ëvE°-ªØ›BÓÄ‚‚ÑqW І98À®®ÚÍœ!u°VkjMY8BwŠ"¦ Í,ˆxwíÕˆcvš§}o­4 ‚žR(½kkLÔÍ„˜™™x+ÍzwQo ÁÜ!§áñùù4s«{ ‰£¬ksŽûV^ ½MØ T»£åö^Ù©ƒ™+9ç™'¯­1ñëÝÝÉAš»ií}&`ˆ?ûñ‡o~÷e³Š„)åaBˆiÈ:ú4MÚT}¿.v8ºló<»ãz]äÈÈĉg9ºkkõ³÷Ÿ}÷ÝwÏÏWwcÆóå< t¾n)%C'7è Þ@ˆ(ðñî8‡ù8#kï_|ñãRJ){)UM‡<ú«к–½¼|züÝï¾ýÕßýw¿þÃõeûôøü²,eÛ/ç5Ž9&‰­ÍD‰žr«¶´—9N„«õ%%1+d1cuòY QbëµÕHÔæ$`HŒÕÁÕÜú#Çèæµëºí1Ew ,,è®­[i(ÁÍÈÁ(!Z 1£Bs CgB ŽôºnJ€$,"{­ûV u/™‘°ÖFNŽîàîžrdNìîH8˜ª¶BȺ.{WUmˆ1¥ ¯ý.…$Hr÷ÚUDÜ9’8¸™ 3±ìÛfÞ{Ç£»–Zsí°·f"D@µ˜ ó% ˜ IDATCpwbVsD$!S„.¯$SĺÕOøö»Ò‹3ƒsk ÖÞ„Þ×p[çûÇrXèî¹ñRk‹B(,cvÞ†yT´ºï`t Æ)imÖúÍ| ,—Ëz:·² b~|y!D¾í[ ¹¬›«UsF!‡m]ƒ¤Þzß«³‘^k9’OSþéûÃoŸËíÝŒ‘dY&f 8ê’/s3p,×ÑkW÷—ºÓi {©µ´æÔ0ž»„°, 2||i"æ|ó¢—uºÓR§a:Ÿw@èÍ#Áé :»=Œ´ÂZÇ|ô¸¡€Ð4¯ë$鲞Þ\æÔýº½aíùº=Vå”S”,óo篯l_Ïxa’K;ãåzœ,Ì~;´´èÔMu¾9ˆ`$0ëûºÇ4½\®Ú,çÑÐSŽ×Ë€Ô|Äó€ëùq]Êýì§µ”nýÇoß¼UÓ¯¾ü Þø`½_¯×óåùG>ßÖ-ç|½.‡éH òáÃ_üÕ¹ýð³áÝg£ï¨3Úb[Îdn` („Ö ö­82ZÆ1g7@ÄRwBf"'ÒZÓ̼µÆˆLÜÁ´Ú<¦n€`@R€æ†H^Ö’‡\÷YrŒÈ´·JÆ>½œpÈ B ½³×ÚJiˆ$D&`¾¬ ;Nã´,×”BiYñééoæcïJĵVt”Œ) ¥s‡´,K3Ë93¡6¥\Õº!¸›©5¡EªZí}È‹4í…¾ýá•ÕÏL1Æ}ßß¾{ûåW_"ÐÍí±õNDw÷w¥öeYnnnšö ‘H^žŸ\=ƨ¨§Ã©÷z>/Ó4´æÃj)Ÿ> ÓçïÞ?¿œ?=|z{‡¡–""’Ò÷ß?~ñ“ŸìÚHhÛ† È"’ûÃÃ÷ßݼ}(–׌ä¿$u¶m• "òßôØ÷úðíÇo¿ùþïÿþ«_ü¿øíï¾ûáááò¼d¦ê][»†Ñ^N{9å…ízL¹@ïÓq$ÛAÜt'í»ÇÉ ŒAÔ™c”nNäH’C‡I˜QHLÛ˜RâˆàØêîDA4±Ñ4 Ȥªµö ûRLèn,df$‚@80‹½î¤‚#"À®  )1u÷uÛj)ÍTÁ˜ÐT­ª6u CÎã8·më¥V@õjmȃ° #Æ€$©n€€±µ}[·aÈ!Sï¦FL¨½Z×.Ȉ´—¢…×< e_÷M…¤ƒ¡CŒÃ¶]MA ·nÍ{mˆÇÑU›¸JÝ› Èý›wïß~¨Z?}÷ñryé±Á¬$øPõáåùïÞN‡ªoŸåÇ¿Ówxz[Zí@çuo­´ ÜZ»±›ÖqœSk})9É8§²_‘¼|’n·§£–öøécGìæÌÐû¶?Ýfj´ÕfЃP!àtw»o+8dQ†ëZ€á/ù‡Ó»û¾{™2ü“J¾Gþ"–·o–Ùò¼ 1?~ú”¼níÍé´.M0”²y¾c”0\ÂÚ)šB§§‡JvѺ~úæ„*x57¹<”®OaûèÜWn¥ŽÃ5à¨V‚õ1A{ú]žÓ¡.yœ1îjl‘<Æ-ö'ý}™L <ÄAn³ £€•(1Æd÷µñv½æã±h%¤<îîî?=½ä4¨waÑÞ‡i|üôi¤È­1BLa7pЃR¯uG"0ën&qpƒ(a/+,ˆaÛ^ 4§îfP¶­Õr~~RjMµÛñ8_.ëå¼ÜÜÝ–ÚöR‚ˆ©îÛV[5µ<¤¦B|ssì½tÀÐj#”œ†4N3øóåÅki!DíêÚßÞ«k Ó`<ì×­ywUBZ(Àå²Or:˶ïÛ.AXP­§$fÿ (ˆÖÛ÷_}ó_ÿúù·¿ùõ?|óýw—eõ¦u¹áÆê!\ßD¢ö|Hv˜ªƒeÈb@f@õ`ˆÐxœ'‰'r0€f†H®nDäÖÑ;€¿ÊäÖÍzW„”¸v1­¹4Ý—Ž€]kHAÁ‹º¹aw2…ˆf£™[oæà€4ÄäУoÝ»6S׎ÈVŠw%€ÈìjÎPÆq`w@gbw­ë¢½»Aë™´kŽ1¶Þ×ëòÚ§f¦…UYË^0d" ½Á0Ž#×z½^ˆ1$L1×Vƒà¾·@ÒkÙ¬q`&&y~y×KˆLœrˆÖ5JqÕf`Âj ØJ[µ.H)æ$A$¸›ˆHW53ïØÁˆø³ýèsþb¹nûrÝëVË~Hé†LKÙο?ô¯î,}õOéôþ'Ÿì] §Ý+ØØ”s²k¯Ž°\ž\MÌäy[ÊVBdG:¼{Çfëzq¦7?sþþytd4Lc­í4lU5ôèbŠHÐP/ìѪöþøÉŸöŠA’7S»¾=äœ`ûÍðVïOœ# ŒyÎóžoïnáü)5îŒÔc¸†" ¼ ‡Où6õýûðÓ´®—5Ë/¿üý<½_Î[žoЩi•ô‚!T=ïö0³š¢»StüÈþQuªÃQɹi£&­U­Ÿç!ém½î ÃDiV¯ÕMãØ½«×ÌÆ X½Í§»q½þлJänæ€i‡ ½6tË9ˆUí­!ÂËùåóÏߌ1åÌ{‰‡ã ЯË5Æ ­äñ0ƒüü'?þÍ—__·íÆÂüágzóEŽLÀ[í’•ª¶hj Bˆæj)ž—%9…TÖ"1ТʀNÞzG€Óé¸î;€_—ÅUÇùHˆæ†ê"!Ÿ\ÎDŒàÂo¦aÙ‘cÝ÷Ãz¾ÄA˜¡·^dHiÝ+F'a’€ÚZ×qŒ­õÖkÌ‘]ƒDë½›3Š’šjˆ‚  Ý =EÎc4S"&ê8„¶–œ3ã0ëªjÍÈAbPp3Ý·ýx<-Ë•ƒ©™ É0L­ÕeßÈÑÑBˆºkƒ&"{ki:Lû²å…¨X—”¶­¤1‡0·²®8ç\{ ‰{Õƒ™ãs|z|yz|R I„ %HÙkÈÂ1ʾ¯OyïN·H°­+áÐZ«uÿîmšÚÏ}m1 %÷ÖÝšs$Sí½ŸÏÏ1D…ÎNHˆ{WUý7xþáã¯~ùOþÿâW¿þ§‡‡óu9«ÖÛÐ~šõ}j¹ïlm:Ž>F$Lj‘(Ä(1gzuíÝÐÍj¯LbfêFHLî¤FÄ"¸÷BæÌį4ä›îC¢Pxí­×Fœs$j=ŠP­98t!”Wò‘’êkHÊY„{ón›µ®à­U&6W@Ï9öÚ¼KÉÅ]ÁÑú+g°Xë­w%«­×Þ €˜›öåªÓ¦È[-Cbàœ’Aßk«{ )¹ºÖ}+E›Ã8ÆXJëÛžf´nî¸o{"":ª¤Ô›»{mM b”nïÂ{­ûu9?>}lU·7Äô9Á¿{ïÏç_ü„¸`昋„biµÓWëüP•oî‹%Xv Ô{ywû®÷¶~û$–¥?}¦<ªö£±mUÜyßÂVƒEHqrk´/£?½ÃÇÊÉÆ#mñÖ‹ÐÓóxÄù./×PžçØäü› >®K~Þnoxˆ¾ÁÞB ó0›¡nû8 æ&CJqzz~)Këš–a$mRÈ+E: òívûöò=\—<H¼¬ß‹ 3|k?üèôyŒq;/—å‚îcœ¡j"ti±_Û*1Åäï§°®[Há6'×Þëv<œZÖ¬¬-òTûn½˜zO)ìÛÕmÈ!nmGÃååiœGB«eUE7[×ë0 ó8—`×óùfŠ·Çéx<ň—Ë2 i_ø‹½?_×i>ÄùÆE®0õ†¨|÷Ù#€¢3`¬÷"¸HÝ:š1‚¯[q×8@°¦P; Ûr]Õ:°•Rkï8yHËËJüªUB ZKy½¼¹uË!õÞ·e-{>¼37-Bˆãnö/×¾4M—ë5çì¨!$âhÖÐ œEZµVU˜ Y/¥D ¨V›¦9ƒoÛV™¦iRМ"Ä<¥yœ¼k–ôðð0­k+EÝ×ëužÇu)"RKæyßV$šçC)%ˆöæzoPMQ‘ˆ$&s âa26h/OOó8Æ4œ—˺ºÎ§Ûóõ_LL™dHq+v{{Z–E[SSGLœÆy‡½”œ“µvÙkk JÃXÍß}vë¶=?=-ûUÝ×õ*ÇùP+n×%OÓZO™ò”ŸŽÇ}Ûz©ûº^û2çcï{J‰ÿìÏþìß0¶ëåþîÿÏ?ÿå_üå/?}ÿ²¬–÷áå/ïåzÄåîh?ùÑé0E2 t"$C’”2:8XSß×µÕÒKcC@'B&$ af&" yÑÕ_I–LDÜÜ´Ïóc3s#¢À”‡¦˜ ^¥dpÍ1 ¸ƒ«5µÞƒ„È n{iî®®èj@@ˆÌd¦`Þzg tevëct÷n]˜À@­›)²USk*Ì’"82N)S!°0r¯»£›)¸1pÎ9¤¸í{Î9¦CtxøônjŠn1HÌyÛ&6´!€Æ€\ÑÔ@ ÍCŒ!È<Ï,ÌÌ®­¶Âdn®ë²”Úk­¦µî†ÖjÉ1 ý3 ‰†azsÿùq>Γ¼ül¼{ÇSLG1õˆNîÝ{ËÂLn­u×´L½5­„“õîHQ]ÉÑõõ\ º+A`Â׆€Z› zÊ ×R%„Z #!c¯Šˆf6Cku¯­×Sœâ¸ÕâæèÎ ûº q ™[kã”_½»hGá,̉ٴõ^£p”ÐjAÌ%²¶®¦9¤®=æáz]^5™ËzÍ!æ<®ëUÝ÷} A˜D^‰/óñ0äÔj­­ikÄÒ{CDD–<äÚkïzº¹u„Þûë]^ÕTrL)H¯õ¯½·²oÃ0‚¹¶Úc®ËõíÛ7/çKk5ÄÀBóõÌ1Æèt:!a­•œX˜ k«T×5…hžBbä}/Ï7÷o¯/Ï777eßBHû^ë¾ß½¹ß·mY6!æ±y·n,A·ë²®¯F`މÐ!ÄÐÚBü· íúýï~÷þã¯þãÿó }øêƒ<ßáå]Z>/ï¦úî4ÿèóûÀRÖÍ{#T"æØ™Qˆ÷íZKa0‰a2¢;B #G‰(‘E¼ÂùÌCœR/»I9¹™¹) Y×ãñŽêÚ»š©° "’Pï–r¦aL)ˆÀÝU@‘\U]ݺª¹™©¹A FtpìµÇµubBiHÄ”sÂf*"à˜<0Ç#GÒÞ™Ô-0#¸ˆˆ G )f–@à€L àÝ*™{ Þ®‹0wSt‡|½^Æ!Ÿæcmмµ£xïîÆD~¹\žŸŸcŒ9 ] æÓ#³ˆ„ອNàH†öêN÷ëËõº-ÚuÛ÷­Ö}/ˆN^[jˆ‡q¾™7€ $.1/ËeÝÖo¾ÿ¸wZ¶¶¹2ÃôC¾|‘¾øQX[\7]ïay{¨Û‘úmýth—ãòýÏâsýø_†òOŸÙwüéo³þA~ø§þ{úáW÷öíÿþ„Ÿ¦þå;úý›ññG·ÛOïìÇóJËW?’󟾩÷iMˆÇãÝVÛ0 §il­…§Ã(A˜Ð¡3SŒ²^^B Ã4>¿<¾½»²t­Æ)î6ëW&A☲°)¶‚)qS…®!øИÅa+KoEˆ|š3³Ì‡cP-ðÓŸ|îfЭ´9´VÝÕÝ$íö ˆb µïLs|xü”sv÷“ööáÝ»ËËËñ8Ó’€+h¡Ÿ†”<V àîV6Ps+ä(ìB™Ð : ÷Þ…ÑÕ»U6tUJAºöVus×j¥º»³ « Që]˜’¨‰­—Ûã¡· æ! Ѝùáx<Ÿ/€h]çÓmŠt¹\[kÇÓ‰ »)™q1wk­ew'’®}HQ»uÓÀ,Ì[i„Àˆê áµ@™$60fF0$ÒÚ0åTZ+eÏ9Žãdê—ëužçÖõÖ ‰ÒÇq¬¥™) óZ¶Óáä襕@Ò[7ÕºWµ€¥ì‰ë¶O9÷¦U›°¨yWÆ!åì]cʆvŸó@Ì1Ew_×5Æ\ʪµ#ò4ާãézYCLÌò:êÞ½{yy¹<<>><˜6ˆ9ç%Es#Än}'&|zø4N‡Û›avë­¶abNûR8 ˆ¢½˜öN!Ò~I9/ˇyœfG —Ë5„}ÀÍ¿ýæo~ùÿõ?ýÍúû_ÿwÓõ͸ Âó[¿+­¯ëöõ®ó˜Q‚€“›™»v§I¤ì;!ó”SŠÌ5¦ÈLŒÌÚ+Bl„­U2g„Ëù9ÇÑÁþ9NÞÝ̬/—+¢ƒ…؆œ‘Y$IJ¦j]Œ܉cl¥tƒÀôºÐeê"þd6íqžJÝÝŒ1²1"…€B„,ÌÚÍÝ݉ÜÑ´!£iÓ,ÑͧqADH› £÷H9l°•‚îû¾š*9™k#t…庨6 jÂó411 ŽyX¶ëe¿ CTëjîÚH=渶ª¥ ;¸b÷i™If Å »öaˆy ———m/¥Õ"×j (´rgpà„eß´uˆã˜$“3"(ÝÞÞ¡‰˜ÃÄ”ÃåñãÓßÿÍ·­ÒÖ QÒ!¶u;Nãûøq†Mi^ ·c_vÌQˆ'¯û†coÝþ‡£ãÀv~*Ãí¨{¾9 âóaŒ‘—¢C~§V»V§a˜oïʹ•6"oÛí\ãO¨Å.ëî§iøî›oOÓ9†ÈÒ½kïó<_¯×4d‰)çq4ò!G8{ŠvÞZˆIZbv³ºïÞ€#¤bĤmN'†s|~ºäƒl«J )â¾_{[ïï½Û<µWfØöv:¶õ< Á´·½š¶Ì¡–í‡j€à9žX[5ìÞ­”EQæÃt˜ga L6ŸÆy ýxÈ9ÐóËcøög<o ßÛ¾ù£ïµ÷B€ŒZ{›FQkÚt˜l ÈAŒ˜(•µ†€½×Mk !¼ÖÔ´B05wcÉ!0o«¯×ó›û7Õ‘ëKÑ<Ęë¾I1ǧó²\¯àcZ]/çÄÔÇiX÷5‡áö&\ŸŸ¬Uð! Å0ÕmUb \6­{AÂÓ4¡»ª2‘dEKH½)¦¶RD°šõ^Ç”L…Tµ«åa.Û†$Ó0=½<Å(^[É1@`6Š®MÝrº÷”RJ@XZïµá#fB"æý² !OóÔZo½]¯›àVŠš±³´¦Ý¬Ô>i8Œ¼ÕççmÝDnµuU">_.·7œcv@ýîÛoonn–å „(1vÕÚjkÍPB’Ça`fè}§iœ>}üHçÃÑ^®Ï’øt˜áå|ÝJMÓxzsg1_žŸ\qÙ+Â0ihàB©­ö–™Zëf: ©µö¯—‡Oÿð·ÿð×õ«—?üâߟ®§¸ÌÇ$˜zwD ß[L" ¨Qu÷Y1§àA„$`iÈ,¦ê¦ÍÀÀŒisI‚DŒ$áõ-ŒDäîf¦ª!Æ‚C|ÒgpŽQÑZ5‡’™›1ºwl Ž¯‰í„;Vd”Þ»™šê˜’ ï¥fGO9ªv$D3CÅ®Í\ˆÁT[kÌCè&žLXÔÝÝ{ïHòZÚÕ]Ź«`--§!Bm¥·&1!; ‹”}e¤ÚÊË·çyžk©½Õ͵«¶RR k÷R"¸ŽiðÚ9çH„­×ñ0‹Ù8 çëu^µ39#ÝÑT‰EÜa+ûKìµLÓ ö}Õ¶'†AA×¾7Bâ€@ضfæ5Lóçÿîî‹?ù×óþ\@W$z~ôÃqÇÇÀ­íÖûíýíùùRzÆÚàÝ0Üžî¾üý—y]vë Œ·“È4HŒcäù4‹`Ù5a>ÝÜ ð7?|9Gæi ©õ–bŒÙ?cª½ïõi€§Ci=† æ„Œ!bŒ¼ï‹jQ¦Cޡ׿y3" PìcÚ·ë›û›Rû—¿ÿ}i]˜BHž¡´}ÆÚÔRÊæÇén+ËÍéPÊFȇãqJy-%D>|œÆar“àµ×µ·Õ]™ÁjGêÌF,ÈCŽe_ˆåæt4S&}óö&Šìk$ÎÓÀ„ó4Œ1¤qN§7Óá- ÕZA·Ñݨ7EËARbí¶/ëp—¶ª¯-pÕ† àn­P„ììeÛ‘XM1D‡¾í›×½æ!bpfH"IU…0E9ÝÜ4U$Œ9—²Ï‡‰…[«Ó4]·%E‰ÀÈÌ ›îõÒUEd‡åºpÀÓth‹ça²VÀ< ®eç#±.{mhäîÆÁ›u¨Åx04f’À/— zÏcäm]bLÄäÆãá°,×ãÁHÈîeÇ)ãår¹½ã½¢uwÇñpØ—kLñÈ'횆)í­[àxº‘m[‡ihÚ·u§Y»–½‚{L™Ì€cfj†1ƒú¶nÓ4º1uµãéèÄÝ,ÅXJ ×åép?<bJéx:Õ½ne³Þ¿ûþû”RNCWÛkÝK‘ßÜ¿x|4E½÷ÖÕJSWhm/çç)ͯ¬È½ßœNˆÜ¬9Q3™åa¸^Îÿ: èúôô‡_ÿýŸÿåßýî¯ÿêsüæÍÔ PæÌ‰Õ»«»ƒ3" !¥RR”㘣Hˆ11bˆÁ DTU‹¼ŠÖTö=Ѝ)£°° ©µÞÕÝK)¥”a¦i„mYˆY„bÀÞë4ŽDDLæ%º©›÷R˜PÍÑÝ@Ýüõ[ØõÕ‹ Ç:À?w; „È@…ÐÝ €‰1Å(,"BÌÚ[ŠÌ£H´ÀD˜$ÅT{ebìM›¶ƒBï½oû†Œ¯ƒ …É]km¥”Þ[ÝÛv½ö½>|zØ·»·Ö¶u‰1›* ø0M‡›“¹‘™ÉaÐ×mUÓÈ1©Õ)¥œcJ ™™0Äàn1Æâë²yÎ)¦Ô͉ÈÔ¾‚~"’€©»9¢!Û^[+SÈcœîÒx§qœ¦y£pŒyÌ# ¡;ºÂ4ïO÷˺TmµÔÚK+ÛýÍÝá8ÜßÝæCÝ “ )›im• oÞÜ x«e' a]–y_¾)%aJ1.×§Ã<¤@ëºÌ‡€™!¦4¶½t³V‹¬Ë: Ùjk9 ËuóHŒÚ;1†˜ö½°„ÖÚº®1E×VEA½i57pÕœ¢›ÁižÌ­wíµÔýÍÍMÎÃ8FÇÜz›†üîîör93‘$qÏIæyœ“ö.DÇÓñOþèO¾ÿôÝÛ»»·oßô¦ùpsúâq¸yãºkïít„ißJ«- ÇÀÚ»i#´”“© !p`ADâe¹äL­Tí-¶²1’ªÆZiàŽŒiHj §)k×VŠ:R‡iÛ÷!¥}+9e3uF4ÇÈ Ë¶Ç”ÜUµõÚ_Oò«¤ÅÝê^bÊÂËó‹«çA[B†é|¹¼»¿ß÷¾÷fÝcB †ÞÀÔܺeLÔAÝñææ¦w"N)…â^á(`¶_×aÑ¡kÜ›"¦bN­w Ä­÷ÒTR|5¯ËbfÚkÊ öRµÖÃ|pÕ‰„˜€¶½ì­io)k][ŸæÙÝ °Ôòî³ÏK-HÌ! 3N‡ÃñæD({-‡Û›b3sdNÑÀ§ùtÞžÇqŒ8ÅÈHÖÐÐÕYðx8ÜÜÝ~üô1†x{:"smíý»÷ `»^Lµí B,ï÷º IDAT'­Âxg‰ SNQd+ˆ’„ÿ5Àõåé«_ÿæÏÿâoÿó_ýåqýÇw¹wÔ)OSc Þ{ke3ín†HDÌ<Æ !’%ÇYD˜$b$bBì­Æ”E EBˆÑÍݽiK1ÕV…Y‚{U雚õÚ[Ê)§¼,Kë­›2‹p$¢@S 1“#˜z¡÷ND`F„½õ#í­i+n*Ý ÁRžÆÞjm-‡(‘½+¾¶²¼† Q˜øŸW_õ,”^gÆb"$ÿl轎0èfˆŒ¼.«é­õVM»«×²—ZÍ´Õº\ÏÚ{.­À8B€œ‘Œˆ…9Ä8äA»C"µÔ4¦iœJ)hÝBà÷ïß”²™Ù8ŽDãëà zí1†!& fªî)fDP÷²m¤ÚkCìàDÝÊF®˜LÍÝM»š²eˆ²+­&Õe(ÕZíœ@SÕ§óÃoóÛ§> ã%¸Út3ÝÝÝ¿þu§yÞëfn„œƒ\.ç1'‘(Œëº† j½×v<ÎÚª  ê€Úû|{·yÐz7wbþáãw´l+7Oãi<_V)µ„·½,ç 8„®——aº6Cf$4pBT0b^®çyœ[ï¦Æ¦%0µÖzÙïïnýæ4Ž3x7³â8N?ùâG¯é¼››c¼®k-ííýÝaž€ašæirLÂ|{{"0«åôöå9Lw9ͨjÞôe[Üê>MÙ¶ËN¨)±;ÆÀ#˜¸÷ÞY‰‘0†Xö½µîîCNµµ^K”T˦†‡<1Áõrìóaä¶ïî- ­÷ã<.ë:Oó§ÇG 9F!j``ˆZ+ˆnÝ<YÎ9¥ÔûÿÇØ›4I–dWzwÐé½g“‘™™U(=,øÿÿB³»EØÂ&Á DE•™ááî6¼AUïÀ…%z‰jß›/LÄTõž{Îw$çÔµûÚ%"†C)Å.f`i,)•¡ÕÎÌÒ;€ç–yKKFW4%€”£«˜¶Úd3Ïk»Í·q(¶µžcJÃÝ꜖yž¦©kç¦i¼¼_†aL)©A$ 1" ƒÃPv9gbŠ9Ç”Á‘ˆIELº‰ÁX²¹‹ª9¤»tUÉ©lµ­ÛÒj/1EŠjVk¯uJaæ¥mO>¤qx|~Îc¾Þ.±ŒÛ¼<üî‡ü|´Þón—9t3p(»!–¼;×ëõã?ŸG`n"[oê¶ÖZ· #×­qŽïï×ÖÛ8íMúmžÕMÖå:÷±¤mÉ50:Ò4”ë²PdG˜¦‰°‰\.·ÿÙ `»\þùoÿö?ÿ—¿ýûÿþký‡ÿë§xá!§ñápDp‘¦ÒMlœFwPtcBdH12QJ!ÇBL1–”˜¢ºª–2ôÞˆˆe™ÝŒˆzïJÚ–S L`H1%4X×Ôv»Ãá°ûv–ÖÍlÈCˆñ."¥˜Ð­¶-ÆHD÷å‹:8™ZWó¹«tr@„ÀŒîL´Ö: %ç$m‹!)!:ÜWF*=献C¸ßvÄÌ䙉è_#Ìd]RJ®÷ݵhŠa7"‚ Ò´k¿‡Š¥55CÇ{Ð<– ]¶ZÇaWbˆRJ1DæÀ©äq·SpÌ%¦”Òét`D0;ì÷—ó{ QÍÄtǦ²,+Ü®·Cˆì9%GX—56ǵnCÉî ¢%çÄ „&¶-+ €±57Á[—¹#!!0ºY„poØ5¸ãLYÕÁÐ`ÈÀ‰cI>B[säÛíšSbâ2Œnjf€Øjm­}ÿéã×ÏŸSLŒ´Ôºmó·—·¡dضu¾­µuâÐ[Ÿç%¥¤ê­ÖV·¢Sàc¨Û¶ßM"ÁȈ<—Ø¥–Të~*Œ8åpÜ¡#Oû]DT3sO‘"3ìÊØÛíö•Çýá°K™i8}øîÇ&¸Š¯Ì ÁØlR@TBrDQiªM«0cÉ%$6#tw'&O!© ÕmC‡ççï¤65‘»É´ëtÜQ€Ëùz<îÍ|ˆÐ™˜ ·­Öm;v»ýØÖMÅrŽt:ßßßjºÛOë2%‰HïšÇì»ÀÌ!æ’ ìüö†àjª!†ÛívØï[mfF@CÉ pgî¨HëÛ8NÌÌî @KÄ4Ær®ËÀ¸ßM[kã~P‡SïMÍèõÛÛñq·¬õéÃSrÎjæj[[÷‡#ï)¥ýñÖnÒœ‘º‰59­w­µ! p`¼÷V„s.‚ˆŠXíUºäRÔ´õžóèb îÒu·Ûs }k»ýQ[G·®îfŽH &µÖ­m·åòrþüË/—Ëùáø¹ä”‚v¥Àe8íómFÇ.m(9Ƙª’×ÛVÛ¶­»Ý¡K;Îï¯ðáéùr¹6íMTÕìêh·ÛÿÛûÿñ¯þËÿýwÿð×ÿõwôõéÈÌ|Ú HTTˆ8æHÄÉUÂÝFC ,¥˜YŠ‘bŒ1,ë¢nÚ™ù^ð""8Þ­:ˆæÖ;s G@7f^ÖTèx<„Äç·³iO%§!§CàÞûýßÞÿ£©Ý ¦ à ºG3C"Ué½#‚3ѶmÃ8¸ú’“#"€Hä® ˆˆ®/Û&jCÉ€ˆæŒxç‡Kï®¶¬+º#"¸ÿ&˸Ç@ànÍÚ¶©(‚s 9…˜RF±>¥”l„D‘GNˆHf@rN)1‡ãépŠ)0Q ÁQzï1D BâXòëûû8M½wI)ALñÛËׇñ‹ à*1¤!gQ 1¶º1RëÍ,r@¦ºU"jÒÀ 0‘yß4¤®`¢änÆ„ÎLî'À@@lä˜@;¹9(€ 6!!xRÈÅ)8…aÚûix|Ú==§âá1ïž%Œw¡Œa(J†I9 NŽ8¬ÎÞ{ËÓÀ!¨é¶­Œ´ÕŠDˆh"ºöf&î°,sJår½ÔÚT¤·Nó<ßn7wðO?}{ðÓþc0Ó·÷sŒáp:îwƒ™1Ã~šˆð»ßß½äöýwßwÓãñ€ˆ1¦è¢9§"‚á¶­`>ŽÃ8–ëûûÆáôô¸;”‡¼ÿ.•ãj†Ú{»´@^r!sícŽÝ<'B°ºmŒ@È(&)pï=Þ§I•Ì!Å€Í{à઴­kݶ¹·žB )¨—± H_Ûn?$"/9Ça2÷Þ«ª¨¹©N‡¥n„Þ¤0?=>]/çTräˆk«wB«½õþðô(fHžKy<Öu«­ŸÄ5¦´ÖJDfB Ã4I­xÿÑ"smõéù©ÕsºsŒsÎë²Ä˜N§õv]–ܦi÷òݒפE½õÃ~/¢ç·óO¿ûý¶®î^[›´mY‡© `Š…wÃh 1¦¶n—·31—2¨öÚ%…¸¬ËÝÖ{†˜s) 0ßÖB@Ê9ë|3³\òñôè`­;!»!„Dc¾¾¾Hë‰H·†àÒ%Æt»\C CJÛ¶1ÒùüÎÝýÇrõ¨8Ni_ÊqÏ!,óL‘ÇÓ©öíüö**óº ëþ°K)G”¸‚˜´V†Ò[;=>ÃP[ÛŸN]Sˆ1uíÃ0üù  oõOó7ÿûúþóý›?þßrýËÝeØåÈ!§là¿uÄ8ÄÈ̈hj©dJ9”˜T-ÄÀÌ x›¯„è.äˆî興]ÄÌ[oCÉ÷5¯Hs³Þº¸02¦˜`«UÅ.ó5‡øøái>ÏçË{.)Ƙs¼Ûrº"NÀDbº·P¹ˆ˜ ¸¨:"°#¸õÖ86‰CÚ¶ÕÝ"#¸›ÊoFkâˆJާ&úH¥û#ELKÌ î &ÂûÓ>öÀ‘DD]ïñ7¾+}0†¸?ìcÌhšSÒÞU5çœrŠ1–¡€¨¨ f7ŸÆÑÁsŠîŽ­V7E€”#e00[×¥m­IË‘{«CMµ·ÍL:1ÕZ‘ØÝT-„0/ Þy!½ikÕ­›þ¦÷˜¢£‹Kw3Ž ä&Ökw5G LÚõöÇßä¦Dª ÐÑÌï<<¸³T9˜ª«›“x‚ž¼¥À²n„IA:š6m@µ®°Œ%˜ã0fÒu]1Ådæ]·Z·¶Õu )Þ.·¿þë¿úùç_OÛ²ÜÑòëºb8ÆSŒÓ4â4·Û-•,Å€î‡ýñ0íRŒ1Å’cICëÛÃéxØïz­Ú5Æ`"ûÝÄ„®î]Ìïæ4ØMdxúáÃãÃãÇçÃÇßÿ›8>NÏbí nuYWë¹w¯CÊ1Äa–y»ËoŒdZ]-nµEÞMcë À9D@"rT‘< ®UˆPTÑz«™†T¶u{||ðµ6)CŒZ]U%åÌÔ%—Ì‘óù|>ö—÷Ëa7Í—ùã§B¾|þÌ!£{mëa·»gbbÎ9&æ0Ó¯_~ýỦ¡Ì·› û´ŸZo!ÄÓn:¬ób §Ó1æÔ{†ÒZeezë%gUYæÙLRÊ&ºµ–KC†o_^Rd“¾?>®Ëbîã´WPéòýÇO˼Áù|Ä9§sSspÛ÷`àó²N‡Ë|K¥¸ˆÄÈq,·ÛuØ e‰Ãu™ )æÌD)Æ¡Œ#G"buŸ× i·›y]Ö2”Ú–˜Òõ:zͫ2×Û¹SˆLZëDR8ìO×ù–R¼]gk=¦¸®ë:ϘJƱm5f ĈC,mëîp>_†wãÐkïÒ./_šHŒe(y¾Ìi,­µÈ$ª‘‰·y×ÜCˆæP÷·üÿþÿôþ‡ÿøWŸùºÍ×ÇëcZÆiÇÄ9pw7æ‰cä8N1x¯1‡XR Z«Ä¨©š[JÉÁ IM]º`$Lew7í]ÀÜ]¥+8pCJB²^o·ëá°1Þ®W"œv;Ža¿ßš2so-%å n1DBvS`$3³®‘Á‘€ˆ´w ï¦b°ÀDcêΈîFàv÷³¶æî~¹Þ.—K)%„Ðk5€@s"¦LûãZæcT$˜Ð È×u〦`¦nb¢¢`ã8.Û‚àLJŠ"¨ô‚»™˜©–’—e]n !M»}«Ý\‰¨úºl*9ªYoÍT QDÀUU͈á> ´¶1Ó½5·äÜ¥m[ ‘[ku[Ä„ á.eùo4ÁnÍÙ{k ÀÈLhhw ¤V5B4QB3UÕ@Œþ[L¯·î‘° \¬µi(E3t²MÔ”E$ ‚;ré-:¥SfŠœ´÷­UW®¸wäm[™< ÞÁPÝhÛ¶.""»ÃNEsIp8îÀ¡µþøðsäRŠ1$3{z~žo3}÷ÝÓñ´¦iˆ‘Àìt<8ÔmM9EæœâõrÙ»ôšr.9‡2ìøË8=<•݈1ÿôéS7wÃÛm L¢Õ ÕÔT6HÉK æÀ)–aPµ"DpF%Âý$c‚’OÃ(]ïã©t‰)¸ûm^†qÐÞ»´’³©nÒKΠÝЧ‡­·â~(o/ß¼ƒ»Eâ\Rím¿Û)x¢¸®7F¼ÏÇÝþz~ß=="À§O?¾½Ÿ§Ã¯Ÿ¿üôÓ©”ÖZ,¹7yzz˜×õ|¾¤KÉ1–{!ën7u5;ìw~gã<<<Òí2›hm}ÚMÃ8„Üͦý8ÏKR$æ@à!…åvY®·ãñx[æ”<_oeø-Õ—z><—ô/1IëÒº™Oûý¶¬"Â1ÄOÇ÷·×Ëù ×ë­^f´z»\NOË6N9%0+ãP·MͧqKÙíOíÏÚ@µöëË·—oçµ®ó|ß¼_±ÄbªâD‘7˜C sRµÜÍ ±äµuL!†°Öê]ˆè.ɸZŒÔº†´nŽJÈ`¦"îpOd…@ ˜‘ȇÁT‰HkÍ9þfb)1nÖÝñ¾}픜Ç.¢ZÑ ÌUÜ €E<ÆXÛ`t—oÜÀDˆ°7 3w%À.∎w|3 C¢ d/Ÿ !¥¡päÁL[«æ°›v°÷VB¢–e1¦ÐͱäÔmD­¤o·™!°šéÝ ÜZ+¹¨*ˆrlv½^SJHhª*^rríèÊ`ŒDª9Q ÅcŠÁq7 Žp»-î¦}3ÃÖZÈQš<==}{yé*ˆSUÝD:s 0í½WJºÍÛ¶¬umµK“!¡!¹yWEÆÌŒÈΈ€ÔE¡6pt×!£4c Ô·å.ênk7³¦2M8 B7CðÞÍ#­­×¢(øº±[.)§¨®ÚUêV†»£¯"0ùÂV×™bH9ÖÖ’“¦SÛ=®€Íe3½!hGFÈ)ö è½ÇBÙíbJ—?þq·~øôéïÿþï#GU›Æ<–áÃwë2s XÑqšöÎaÜ—q\Ö­ìö‡ã8Žãðï>|¢q˜bÞ¶ÍÝѽµclµô©„ÞÍn·óºl`>ìbŠÔUÝÌ@˜Y”B¡Š©8H ®ÒêF"šALU\À\ˆUºª/avÓ2 w})ÑhdnRC`QÊÃpßœqKÕ)’igÇ:oÓñ€&`«[­mÜE­]BL]¥¤HÃ0.óú»Ÿ~ÿëç/ ƒñëëë4 ·ÛíùéùÛ·7fúöíÛOŸ>m.M4Åxœv 8·íùñ’m·µŠÇ” ‚¢mÛJDSÉ)ÒZ{,¹kO1‰8B ¡2mkÝïÆÚ[Œ1†<–ñª mòÐö‡.RR²mJ×åvÓãñðòùK"¬ëbî‘~ýõ—\ :!óu¾®µNã°F˜­;dÌ)ùüùùÃãóã‡_>~<ñùýýt:½½Ÿ7ëãî0 ¹Öm»ªˆ–i «Ù4Ÿ?m0 Êùr>öãnw“ˆ;¡™žß.Ó0ÕÔuFws}ÿååpØ£éõí­ ƒ´ë¼ Úm™cˆÝú?ühjp»ÞrIîx8î¯ËòöþöéÃU+¸—a8žÛívÜï}Ÿ·ÚzÏ»¦4íö&R[Ã^¿¼î÷û»è_¾~Þíönº¾¿Ôeе5Yû÷x~Üc iÆÙÌÌCH&â àˆ¿¥³š™¦CL!rp7p5ÕÖÞýSîŒ*fîänÄ("ªÚ[w³V·H±¶šc÷œbúõ—?8sLC’ÞSäH„ÌŒf¢#§U Á‡Cï-DQu4p—Þb)æžbÐÖ›´lf*"½#€!`[—nˆ €[oàH‘ ÑÐSŒÄ„L˜S:Ï7wd"BTë@Î! ã}âQw Š‘ÍÜÌÅ|Y7C䘣ÔÞE80!qëíþ½¾¿Àm¾©ˆ™öÚzo¹mÍÍÝu,CÌ)0Gâ`êãnHrÉÒz ÊÌÛVk­ÚšAW]çÍÝÇq”Þ±×Æ‡Úª‘»‚«‹Êëë 3¹I›Wuw7Õ®àfŽ"Òzg'B ØcÉHØ¥ºˆ%˺©ˆ´"»é|½XdS1wãÍ\¥3ÁPrI™c$pP×Rr ™:‘¡Ú4)%0U3T13uTëÒ±UÑ¥ û¸ŸÂîÄÃ! û˜‡a¾½|émRØ?)3Ùj=§Óé±u==>Ç¡¤a 9î§ç¾úþÇ<íøéùw˜ÓñböÓ¸{x|„œØ1•çË­·*]Ì]µš;º¹iL¡Õ^[•¥Š©SJC&ÄûzÖÝŒrB·@Ä)Z¯`™Ñ ÑAýííÛ}^é­’Ù<ÏSÌînnžBH¥Ü®·”Rë:ìÆÞjIy,ÃmÙ2ó0 }Ù`¾œ¿{~üÓÏ¿>?=¬Û6îÆëûe(E{¯ÚžŸ?¤RÀ4Ó½šUôíòºŸ¦¥UE?y—e‰)Ú0“6Nåüþ6Œc±®3åað.MZ-Ã0ä<_®1ŇÃÃùí쎇îICb‘­ë°+ˆ@ˆ¦R¼¾¾³ô< hÆÌ`°ÖuØ 9—uÝj­1¦Óñ±jÛ¶–‡RÆáå勪¶¶žNoïïäÈK)!$@ˆe¨Ûzç¸ä2ZÀŸ>q ÊQ¶-#œžO0æZëþt4õÝ~ß¶¶¬kJN<ä$)†Z73x{}ÀeÛ¢9Ôm=Ÿ/ŽÏµvbV5s}x|$ï×÷Ãî@Djöþòº®KŽ€+†r¾ÿñS“npÏe8ŠênšÜ S(C15,¥œ¯çËù’bÈã0NãøáCß:AÉ%/Ë|8®·k— ˺–䎌¶Oæ"ÿü§¯ß¾ýúSœO;&â™ÜÜîntC$&bb$p—V!S77Tp@'3s7SfrW7g0¿#‚Ô´µÆÌ1…ô#Ä÷o¯¸?쉙0¦Ô{uÕ.ÝrÉD„îÈ<•Ñ@µ91ÝŸN€ˆà€`DÜzoÛÆŒª*¿Q³]ZK1×ÞSÎ&‘ ¸ÛoŸTp¢`¦©¤&ʱ”œR&d¢(]Åå"‚{~mY7Sí½Åœr)×uQé­÷ûYïÑ@UÄÔ¤µV«ô^—mžEB˜—¹ÄŒL8ÆèHßÿð}í=—h*®6C¤¨"½÷Ökâtx8 ˆ Ã8M"Åîëõ ŽÃ0ÜW#¸ßíÖºµÖTµä¼ßïÆ)ß·ÙûidÆaH%ǘ¸¤˜#圈´”¼Û½·qH­5w—®LX[ße™g³ÿ±,‘u]‡i0sF_çz­%s°\òZkï]jsS ´Öæ"àJJ!×ÚûI¥ƒÞi*Êä8Ä¢éŒèwä…böû§¿ûð»{úø‡áøüðü„i÷ã_ü¯?ý›—÷‡e­ˆaÚO)OÇÓË0”‘˜)†ÄQ¤oëJH^ké ¬U1é½·œsH‰JŠ®ݤöâr™("äÄ€D€"ÒÔ™P¤ »‘Åt›×îX—HXr€ˆ€Ž×ùCLH¦’†\·¶öm‡ÀÜDbà1µ÷ÒívŽùŽTÉ1Íóu,q[i[vÆ”†’¥ ‚§Ýˆö§ã4 ]ÚÚ¶q(¦Ök‹BŒÖ%§|»Ýv»©-[Œ)ÆžN_ß^®·ëG³b0Óý4òçþYEö»™k­‡iJ)¿½¿C·ÿóår9Ÿ·ÛœcÄ9çëí*‰ƒ$ÄÃ4™ª#¾¿¾Å\EÕçuA‚ƒt‡D)¦zï!%`øñÓÇ­®½¶qZ­uÛr.*ç\æåÖZs•<Žê µq* ~8žºÈ¼ÌÓaoîH„Òu]jÉÇq¼^¯ÓîcÆ÷×sßzŽÌJH‡Óñý|>îwȱµF%üôcÇRÊ)„4쀤j˲¤@øöòÝÌýííüáÇ*=桌™ˆ·u…€ëºŽ¹L»)ÄÀçËõ|>?ŽóåZÆiš5‡ÁC ·÷Ù¤wéˆ˰ܮu¾Å<,Ë’bH%ÇØUDíÃwOÿ:Ü>¢¶\¾üéç¿ûã/×¹ÊòöÃcŠ|ÏU;Åœ  K3W77rÓÞA=F" Òºƒ•RZmîæè*f"è€@ØU¤IoÍÉTÝMî/&½ÇÞßÞRŠ9Fsß¶uœôû¹ÙSdSë½¥AMÝ ÍÑÀLU»˜y¯›©9ƒ¹º»¡!Âýl/×”"7s !0a7¿Û{DB à¨]ÌD»XWQww@w'„®f]]]Ý™híÍ̺ˆˆ‚(¸: £!8ß±üàŽcˆ‘ˆ€CØSˆ±ä!æ”î°·q§!¥"VsJ9¤R*y·›j­e(×ó™zkµõqÀ¾½½™;™q$'K1§ÄË:s¸¿9”)„Ì},)ç ü^ŒÂ%$\×õññ9q¦1„DÄk­¨Æ10ƒ4yz~ŒLfè7;2Ñ3‹´È!çÌDã8îûu™ûÉT÷û]]77ép÷°O»]H10OÓÀ%ç\âV{ ‰cìk-C6óÚZ ÑÀÜ[íâ#bäR BpŠ1#Sk]r¢“«nKeÊ9ªÊ¶´å²ºRH»Ãîp< À0 êB|Gx÷ÀÔÅ—yN¥0‘›xŒéÛ·¯ß¾~•Ö½¯3ü ™•Ç”j­)¥Hì ÄÔ×ùv»|üøýÛùz<.ó j9†”x·Àb X[WƒHüøôp½\(ðºmÓ˜çË5†°­+…`w‹»Ê¶®D¸ŸöbŠDyD…R±ä—Ÿ?CÏO >_¯‡ýþýüÆ@-îf/_¿>?>;A‡aÝjŠÜ–uM1<ýðár~ÏaØvÝ4rU&Üæ5Ä$‚‘R™F3}|zBô¿ûÿûO¿ÿI´ÿüó?÷áÓ¶®½n T×m«+ºïö“ôÞév¹îŽGt½ÝÆ©äœÜTª¨I)’»ˆŠÙ0L¡¤¯ó< SJ¡·Šbo×Koít<]¯7wß1…!€bF¢sLy>_d^¿ÿË߃æ˜DåîW&¤ÇÏù×?ýi:¥÷Ã~[¶V;1å\¤vˆ±LÓ|»õÞDÜó4 ãîr»}øá»8b±˜ò4íßÞß?œJ.¯o]äøp‡e™oëb!GäèàO?|ê­9!"ïwcJŒ©©„R*C™(†îÒj 19áp:ÄsRap ðÃÃÃðé‡Ýái9¿—1Þ®3üáû÷O?¶ÖKÉŒl&Ã8þ«€»»¹4[®o_¾üñç¯?ÿòùv~{,ëT2#3Á}!ŽèLáÞ6ÖÕT™ÕIkµ†È Pº¸©š™ +"s0@¤„èFkmzKï½;shUs·Û.%‡"˜£+!zoÝÔD8"‘Z·»½ÔÁATj¯Uµ«»‹*˜›«;§4L»Ûõ–SVSí]D »› ꇍ†jº.UÜTTU T…‰ÔµµîjbnjjæÒÅ\îÏRóßBÒ )'Žá78ḻĘÃáp4F"Š!ÅÈ9–ˆ‘‡¡Ärˆááñ)ß)LÓ4vm‘ýOÜ õšSnuw C¸]n‡IºŽÃèæ.6ä"M(„¶Õxk ˜ÐcJHÄDwCLN‰™Ía[×Ã~ï„cRÊêb*ç··i¿‡QMcŒ)çÖ·Òñxøòù×ø[ îu¦æ¶Gq[·Ãa·›v)¥œ#!áùí-Æ€D9ç§¢âêÌÞÄ LÕ¥ÕœbWt5½¤ô;™‹Èµ7¸®É !å\Æ!`@pô;Š™YD¦]!$ܶšK™¦Ñ@­UëÕlÛïwÒ$J¬uC"fGòÞºµîÛ2—ab"su3ZæÛíz ˆ˜zëŽ>ŒÃ:Ïe"xŒ±-K’›µÞk“LJÓù|=ìwo¯¯Ó8ô­¢c­3Sˆ)rÈE[K1¨Úm™{磻uYîÓÑñ°}{;î8I—ÉÌb e©1p!åhnÛ²íû××’Úbà2ä·÷·Óñx¸çæÔ|²ºIï‡ã‘Z­0bøû¿û»ßýî§¾væp›çiœ”<qŒ½·÷÷÷ýápؾ|ýåééC“*½øðüòò51‡Þekµ”R† îç×·Ý4ºX*RŽ9g#x{-1?w½6•ȼmOÓäŽ9&3ÆÍœv‡.u¾Ý…Ûõúõõåt<}úøñÛ·×ëëÛ0ûaÕy^¶º%OÓ(­©¸µþðÝ h×yË ?ÿúëóízýøãÇ×—×""ø-K­ý‡ÿåœr¸3-ÖÛúù×_NOO©äR3‹!öÖoó–cV„Þ;qúðñSkBè¦ZbV“Û<ç”Æa*9·Þ×ynuC·aœvÓ îÎ4ŽÁ,E•ëùÝMÛº•R\, £›1G&j[½\榖ÌûÚ¶n‘ØÕÄ¬ÞævÙ¶ë îî^{¦5€€Ž€êÖ×zyûùóëÏ?¿hÇíöíã)! š#Pï]ÅÔ œP̤÷µ›€KíLäÈnh‘RmâÒámNÌŽîâèý¾·WAó€È !„|¹µ!zŒD½ €I—Öš¡ûŽ€èÞZ»7­Bï½µÔ@@Ý\ôÎü'ˆ´,·˜""zo¢`ë²#§À|'¸Ýy8ÖEEÕDÑÑÜÍî½ZKoŽ€ˆX†C " f R !îwcÈÉïlhÎDbâïEqݘÃ4i(Ä!¦@Ct5$¼gŸŸžË0´Öc «471w0  00Õu­­:8&„.=§ ÙÁ¥·Ç‡éMEïß&”TvÓNUî #ÝÃÞÄ”sJ)!x.™ø7töÞǃHϹ bJ¹ÖZ·S Ì‡éØ¶æn%¥q݉#§aÈ¥äœ{k®ªeL@L1Ę1SA €<Œ%‡X[u)¹j]–Öë~{ïL,­†ˆV›÷n*5ÆLŽ(Ĉü.w*˜-·ÕÁCdL!®ëLˆ@ µÖuiÛ’RŒ!rHÇÃ.ÅdD­KdËXræùü…ÀǺ./__†‡Ëå&‘(j½NGU#Â@Dwf$tãi¹Í§ãñv›‘a‡Úêõ|a¢bÊiØí[­½ :˜6ŽÀ¦i×Ev»Ý/?ÿ²-Ëó‡ïΗKkíùáùz>_o·2”‡ãñ|¹\n—ý~ÿôôôååëež ±÷6î÷çóåùÃGùöú: #€ ûÉÌQ Ñw»£ºåiúüë—„Ød‹b /ïç”Ò_üá÷ß^^ÜÍUûÝ<ßö»Ýåv6QbÖÞµ #-·e·Ÿ.×+"3¡Š®Ërº¾¿¹ Ónm«cˆ!˜cŒ!Åt¾¼@,e¿ŸÔñÛ·oøý_\¯3sèkÛ¶€vûÃÖZÉ¥‹(*Ã?ýéOÏß}à˜êÚŸ¤wÎi눌`,ƒ´BX¯óõvcfsCOO/o/øp:ÈÖæóíéÃSöïç·Ý41"ö^ËpçßEB_çKNa¾\Áµö.­Íó<îÓa?=ªTíânŒÐkÓÞ¶ÛŒî*r¹\Õ\UˆÃ2Ï­öº.Òe]—u­[DÜ–YT–uëÛjÒÛþôár½‚Tuk½žZ¯e(f€à&âµÊíýÛëõóËëëy>ŸoßeH¥›4Q…{žÇ:¸Š¶­Jï!bf&sÅÝQÝ‘¹# QW„ŽH–å»Ož10¡(ÆÌØDæÙ8p2[{Qqfè[#@&R0uEÀÚuk­wñ®½6WF5½›ïa&0‡”R•^Bts7ïÚ{—@˜¹!šöÖT½µêâæÿ "äÖ[΃»ÞÅv÷b ‰ˆï,¬;Çôª#bŠ1•CŒ%õV‡2˜Xˆ1p€€¸ÕÖÚÿOØ›4Ë–%×yÞìî4ÑÜö5ÙT• A”ÒÐ@?šcÊd$Ò@ ªP( 2+ë½Ì×Ý{£;Íî|»‘¢Ìd2"†1ŠÁ‰³}/_ë[™´Qð3k¼sH$¥*#!¢ä¢HÞ»RŠ%j¢"Zb,)OGäŸ5}ClEÐR«µVJY–Ä|Íh®e&ÓªŒ›1¥ÕºÐ´IS¸.HN‡Ãýím-Í{Lj)&Ñ&µ4Qi Ö°¾•z …©èuЭÎZ©mìºqKÌÖÙaèãûqTUcL.ÅlÆMÌea^–¾¡ëˆÑ°ADìº^[Õ¦×lön»?]ÎÖ:mÍXKlIš2Ñf»ag­5¡ï×5®i .°å¸FfüYá$­eëv3Ë<C½µµ,Õ² Ô¶®ëÍþv]Ôf —™b,ÃΗ#“% Äa×51£µ¼í‡¾ ÐrF¢¸Ì·%×BìC8ûÛ)µJ1ƨ´ÍnŸr†‰€€ SJÎ;&¬¥ž¦Ëv·!dDhË<9ë´Öšr^bkû~Ç×8fE¼>*>tÚt³Û?½¼,ËúÍ/~ñxŸ¦%I !¼<ºÍ°»ÙçSʆÈy߇Þ}üéÃnÜ¢4cœ”¼,SÞ8><¿<>Ü'Ýf[[»¹}¨ dÝþÍ+²6=çËÜu}•üpÿêp<ô!BèúçOP¤b‘𖛿‡m?lwì­JSa¦éb}õúMŒ«w 7íº>.ë²ÌaÜPúÏ_>åRïï¡i¬¥¦|sÿp:ŸIa»ÝçRsŠlÔ:lUu¡;¿ž_^L×rÉù«_ýŠCÖÎË DcÒºöý¸¬ñÕÛ¯?}þÔo"cŒgkó²æ%2+ `Ϋ±îpÓ@õgÇÆ5•„ÄÆ Q½£ ÒU·P@ Pd ¥VÚ BßUjuÍ­²c㚢:ËäðáPl$­ŠHU…Ö®.m¥´"¥VÉMj®EJÊÙŸZ¥¶ÒRÉÒ®*)p+Zš¨hmµÔ""ÌDHˆ¬µLŒˆè}¸6Æxï•@€èªég‰ˆÙúàk2Yk1Ö:fÓZ3†³1Ö{Ÿs†³ìƒ‹)õ¶j!tª­U1̵VË—(s2†K­ZòЍûýnYCØŠT-}×5‘Ðw%ËÐ÷Ç㩦LÆÚœrÊ ­ñ¢"¥†>hkˆ&^&kuZ{yy9žNã¦ÛŒ[˜–庛Õ*)Eçl“ê­é¼1ÕZ@Q¥" Al¢Ûq³Ì«e ]h­©*Š”.І„$U‚óRZß•˜¯1‚q»K)"èv·+¥zç–5jë]ßwËšBç@Ñ;ƒM%TxýÍÛõ|‘˜áé2Y2Þ2!•˜ˆ–5Yþ¹¬Bk錹ÂeIÁù.ÅXÖÔ$§yN1ÖR,S.©3¾”ªÐr®R²¶ÔÃt<›Ñ0;cŒ¡ýfûôô,R{Bçà:¥ºZk"UBð>~²Ö¼ýê«é<…®K)=Ü?"bSú®Ôl­sÖÄ5:ë±a.¹ÕÒù®‰Ò²Ns>„Ëù$µ:烙yZ7›4‰ëL–DŠï¼÷¾‡ççãíý}ÍYEN‡sËùöööÃçOMçCJq»{`EŒ1~ý‹oN§Ó8Ž¡ë6»íñr"&gÌ4_æi6†Çí°N뺮»·o¤‰ ®‰¦"C衉Î)¾úêí‡ï6㦻Óñx{w·.‘‰ õËÓ³UìœgÃÇççé<ÎçÇW¯ ›¸Æ” 3&I)YÅœJC"¥”JÉÙ÷}•d o›T"¸œÃØuÆWÅe™únÜ 4˜ÎD)Þº%Æyš‡›:rÞ½<=ûÍ7·¥J.¥ûZ2hK11+ãúþOÿû“ÙôoñmÍ5Ƹ»ÙïvcðËóÓÍÍîxx&]è*h©Åyïý€1'bg !‘5ö|9›q³Ù’a© ›™¯?2ÌÓ)–%¥5„À˲6Õ` 2ow» ‚*P‘6ÏÓ°ª4ï\C˜çÙûžˆ/Ó¬µ"ÀÃãcŽY¥12¬­ÝHÆyË.˶H1†æyþwÚr’uÉ——Ãi>ÏK̹Ði-§ÓóÖK×ymÐQCQm Hœ1„ ˆª€„ д¡VFh­‘²×(£1À×1”Ù ©‚âõö H„l¬Gcr-©C?tÖ¦Î21…Æ`¨5´Î™V” ;f$ã¸KIµŠ\—ÂU›@-±ˆ¤T 6ï­5NDJ̈øóš˜TäÎZ¥H­­ªµ–­ebDfë#©±Ü÷Ýõ…n )(¢k¶óAU™ÉÃ×å&±eã½#¤ýn›ÒJÞ‡V[kÐ@sÞ9c¬Ôêƒ "4Ö–ZÆa3nÆóé PkS1Æ’jaëjmh 6ÌÖ8 ŠÃ02Ò2/üã÷H|7„@ ¹"2LRåêæ¥`­´º®«E2†^žŸ{6C/¥äškʪ Zki‰ZK5Ö¦œKÍ cdc@µ…®r=1r±Æ¦’@Õ‡pe¯2›Z3¢÷T¼³¥Vëìo¶Û”âåxyóöÍËÓÁ J­]§ó´·&„Ÿ?½ùÕ7Î÷HºÝnÏ/RÊfÖeÚ~øã÷ûÝVýØkÓç§/Ãvss{3ÏS* ZsÎã¬3Û݈çÓ±‚bÉùæf¿LËr™Y¤æ$dx{"ª*ÞZËx®‰-0 c—s)R3pç(w·ižRÌÎâ¸:ßÅ5]æË¿,i“–cšŽó²Îóz8]R”¤æÓE~ø|ÜpÙöVPT­©l²p«æçÙ"’@CTB!¨ €X¤ªcë‚c$@&ƒz~DPQ¯[Vg hË)!ˆõÞ0©¡"™Ö®P`sí”i­5e6€T€Ø(p‘ÒD³´v| jmÒt]Å[;_¥A«Eʺ%Ô&U®¬:iM¬5ÌÖY×…`YCÖRéBpΪJkŠ„Ú PÓf ©”ÂL peĵ¦L$¥¨ê<ÏM‘Úº®¢M¤ï®|:gŒa»®+3â¸õ2]ªdÃ(%£1Ú`YÖín·ÌËÐ÷1­ PE‘{ßYçæé².‹õÆ;‡µ–Rk©µÖB„ Í&$mÚZ­µÖÚrZs©Ö:c¸B°]LQr!â´Fï¬5Vš””Ñxç­AÄ\.¥ïû”s-™BEİÉÖ9@0l×”I[˹ÔV@+%§üêõƒˆ*¢1öîö6ÅÔŒõ*åt>{ã¼L¼ýêíþæîøô,€ŠpmaL)U©§Ó ‰¬5?3¥ ÷DšaZ—eûu½BkÚuCkÒƒwáååðêññåå‹1,µj-޹ÖbŒ!$)%¥øåógFê;ŸSº±äÜjõ}?O³ëüvÜJ­LT‹°Áàýy:#áv¿É%©w m»Ý=??C4ôÃn·ÝînŽÇÃ:h€ Îù)Åa|èOÇS×…a>|üðÍ·ßOGãÃÍÍ=’éoÇ5•4_TÁ"’"”REJL9çÔ®>©9Õ»»»z8¬sHæ|>>ÜÞAjMêôù¹ßí¶77ç—3[ë owûi93¢¦e 6,ktÞÁešŒáéxJÓ4O± ]Šy7kŒÓ²Œ]pÎ^.gl?~úl­ña+MŠSJPkÝl·HL±äyžϧÓãë·¥4c4ëŠÒæZöû›’óº®Ë|™ç˜LðÁ9·,KÎéöþîržx»½ùøáÓë·ÀβũԼLÓ|ñ]hª¡ïÈ1Y~z>üòß~øøÓ0núaPÑeY–´XâûÇÛ,uZ“w^@Õ»`Œñ¡«¢ó:ê<Ï}€”­ab",)UiÎZ"jUOOGcy·%çë}ât®É‡àŒ•’ovÛi¾Äi¾»»oLç—/o_]‡*)O³ˆ´R~úé§Íf„¢jûÁ»NЦ†Sè!mî.óäœÛî·MÁ0ŸÏÇׯ+3‡.HÓ$Íz‚Ï1Zk¯ßéxÉ)² ¸ÙlއãíÝ3Ïvè jY£s¼ßÞ߯´òíÝžØ Âét9·ûk¯d»ÝßÌ1înýÐMÓDD¾ó­•¡Öu™—©ï;ë‚ þp| ÞåR/§óf¿u¶‹9}øðáöîv]WB"C!tHh5Ö_ë…@XkÂÐU•ívÜm¶—ËÔT®.>)‘™úÁ»¡×VÙ˜¦0ìzQ躞õÞÂ4¯ë R?\K^¦©¬Q— ¨ýý«óá0Ã̆«ª6C5–ú/²€­s›=h»¯µ4©ÅZ~4ÇeÜÞl¿ýøáéï~ÿý=§‡ny½‡a¹íó¹PWßB†¼fWL ¬§,mš4øhÿiþòü¬£i¯6ávçœ9÷d´«”8ôL¸ßí7··%­*BØX5È€ HZT6¶Ô‚¹°µÌ¤µ¥VÆÔ_É`dŠJÈk«¤ XÛZBÃ*ÂZ9åV†ªÜP‘5‹ˆ IDAT_yÖl• €5–È0qQ•Ö*!‘µXŠˆ‚(4lHxm1† IiB¨F5[Ç"ØZ+%ž¿¼ºpÖpk›ÝVr½\.ˆX%— ѲÑãéi¿ßHJ(òñý{ï-²ÍrMŒ·ÝÍ®¦ –”E4°§ééù™jκL«¢æ”¥UnˆT•éçZ-RØ1²QmÞú5ÆR ¥šÙ‹H)ÅöAP j¸æìrÖÆR–‡ÐyosQ4ìC‡ˆÞ÷1Wm`II,ÛZª7¾ÖB¤ûÝî|>>}ùüí·ßŠÔ¾JÎs\µ÷÷KŒh-7lã¶Gb$¶d®$G ëy²7!„PRQÂ*…‘÷̂֘¹U@ƒ  Ð9Ìlm«uÜï˜óñà»þùå0nkÙ{7lzçlMØš"r)™˜´¶VJ·»nèÉZW«ô}ך0R)Å{ßD´”²¦ÍÝ-[Î9ÖZóÆ÷ä®Kì‡ÁƒŒ}×Õ5¶¦{ðŒ!ÆKî¼·Ä­T4ŠIdIéùéyw³fzúüQåZ/¤Ú .—ó/ùËwïßo7›˜R@º¿»[Öe·ß!´¶ÙŒËå|¼œ¼q ª€¤íûO›ÝNQ‘³a!¤Íf†Ç§—k=[H5!Ò«o¿‰ç‹”ãœ9ž_qwûMÖõÝûôLûéÿd»_ʺ8ÏMd:ž×÷ÛmÎy»ÝçVSÌûqüáLJ»[¶êƒCäZåóûÀè;wüô, Öwóœ>}ùòÍ/~ùéÓÇËùüêë¯w­•R­Í9]ó*eZÃÍ,ìúÍšV6Œ†ã¾”26Pmv‚wnßç\‚ KMë·»m©õ×õ—ï¿ÿáùåéö¡‹óªì½ñnè‘÷›Íï^¸Á~»ùüüdƒÞöÿËÿþ¿ýÍ¿ýwŸ>~ûõ›Ý~ÿòåùýwß?¼yôlÌ0®9ÇËYrÛl6&s“QDhRJbkPêíÝ]žgçûq3”RUTÝHQ´? ÄÈÔ´iYâ÷ß}~ýúõ2Ï7÷­i?ôÓ<r¥äåù")ýú×ñO/Ïs\^½Î)§Ó IDËÔTd=ŸGÛU÷ÿÓk© 6hxå1s½#ËÈÖŠÒœê¼Êœ´ß?>|û¯éîñK÷Û/æoþ|þÇüéD/8Nº«tó´òã¡Â¡µi¾{wߟåGþ?ߥßÿ°þÃûü·ŸÖïOûUo?-ö·Ïñw_–ÿë}û›õÏëï\ÿpñïWNsüpYÿüãOøÇß½œ¦$e¾œ^>=øø´Æ£–jˆ]g½ó̬Wo 20¶ŸòØ”´*6E5 J1©p„r‘Þ²³°J–˜r»Æ•‘¬qÆXK–­÷†™Ñ™«KP¯|E¢+fN ZkĈÈÊ×T-( J-×âDhe-„$9AÓÛ›@tΜ/•Æ€ˆ@ÄŒŒMQ¡5i­^Éšˆh #B©%`’ì­!kP¡Öc$""Z×x-Wȵ^S"‚Ê¥Ök1g)¹Ua&ä«¿¦]™Ý""ÅÕ&¤ *DX«´R ›q윳Cè¬ad¶Î"!# ]×1ȬLä½—VÔ{ª­ Zû³‚4 Ãv³[æ¥5¹ÏC×Âe]k©çó¹ŠJï½³® CNÙ0+T©U°Å¸îv7x¥K¡.óbœµLÆXi­ë:½æ“cñ!\N“!KÖXc!¸0­K|J9çÔu¡J3hŒ3 ÍY·ÛlsÉdÞë­'"Ë\J©¹ÜÞÞ¤u7Ûínór8ì6ÛyY˜ùv¿ÕÍ0”\3¥Ôýv‹Œ":Mç L—yš/ã°eçš”qM°]RkžgHªÆ8÷ÃHŒ}ðóÓ§é¸îǾäJÆ0S1lîÞ¾›ÍËñ¼¿½Ùí÷Óe†aY–qÜ”ò3°=•"Y”p9\¨iJyww ÖÝÝ?ôãÆ:ËÖŽw»Óævo½¤e]»¾×¦>ti^›áåt*113±qËå S^½ëZŽ]ßIŒ…e¸Óå’Söì” ¥h%Dùòᣦ´¿»-q™–)¸.çSÚïo^½}„ª–Ͳ̥Ã4ŽýÓ—§W¯‡›]uÁK«Ma1§4 ½ÔÖ Ù¸ € ëšb\ûÍúaN«sÞ¯a¬w‡—ã8ô1ŪZK>yŽMš±øõ7¿(µVi® dLZÓÍ~:žáó—Ï686:¯ª¹”×ã‡/ No¿ýºÌé|>=}üœKrÎ…aì·£*l6›*BˆÇã R,¾÷Єג¬5F‘sÕû»[æ]o­& òÛííëWÐÙ§_øåùùáñžˆœ Ó2g)Rën·éÆþt:Þ?Ü_»`kÊ—érs[DÁX¶àŒË5KÎL˜bBÃÌüÿ½”´¶u¾¨x%»q’Pkð~컇ûýóy‰BÕ”)RʸÒÃ7ÿó_­¥¸Ö.9ÿáOßË—c w÷óåLE¥j\É;D\S¼ÝîbÌ˺tÝàœ;ÛͶMç·oÞ¾œ§§g$|¸úñ|:þÅëõãOï¡¡”ÖC:–ÏG’ÖN§—eo6û5®ÇÓáÎÜn÷ûÃË‹Ôô‹¿ü‹?ÿñ»?ýùOoß¾NÓ ˆ)eD:ÍSÎõJ¬¥WoÞ¼ÿþñíg·nN¥IÕ”óãÃã—Ï/ß|ý¦,Ù~õÐÖä­=Ž´.Ë4Ii(­–꽓Ö8xœõ®!ÞÞßN§ ;{{lj*?þôþ‘àõ›W‡ÓéÇŸ>}ýÕ·—8žŸw»qØî>¼{?ÛùrÎY‚ë—”v7wÁõ´–‡W¯?}üß}??!²("­¶kq¹¨jÕ󼞦õËËåtšTÑyGKk­ÕV­uçÓR0èpã}xû므xŽ‹ É»›Ë—i:l-;HsÇÎ"LÇè¶›&’SÌËÌ8x3¾T÷ê/s–ÂøøíÿšçK¤\×§?ý¦'˜ÏZçO b¾¹¡_>ø¯†.XIcL—ÃÔYNEÍ`áÞ‘µÈˆÎ9ÓÙ­ª–:ðQ´i2ÍÚ¬H§91ii*­¡¡–+[ i×V‚æ­µÈ×Q&§Ü¤ÖŸíFÈp…s"µQAP¡[@©µ"„`m褶e]JÍÔ´1spŽDJ* -‹±d˜T•µ¦ÖP®¹'d)Ò@­jkpZ.ãRŠã¸qΧs©‰ÙYƒµÈv·m" J ØQUQ5ÖQ«M±뙵µÖu½HKK¼9FðA$¯1•RA-ZjD­ÕÜš#²ÆIÓív›jé|TF4dRJΘeš¬µ]†­´œËúÛ+ SÎ"Âl±õfÜ}õîÝ»ßÿá÷5滇‡—çYZÛmwÛ›}\Öiš¡ëÃ2-"¥6 Îaš§‹ Áv†‘înƒ" 2Zb0Æ£"ë\¸ ~ ’7 w›Ýöü"Îl„Ý0loo^OmnÃ0 ÊãÃ/Þýé–jÛnÆZš[K¾| Æ9gw»íÓÓk-!/C‡ÏO›íxw{ûòòLˆ`Ë)mÆíËó3CWYcv6²ŠjŒõ»-õƒy¶)O*zÝ”"xë:ã)ÆõññÕš²ñ¶J±!”Ö¸”eYjÎ}MéxœŒóÆøRD›æs뺞NÇ»›Úv}ÞçÛ""•Ù0*E·ïï<}÷ÝŸÞ¼~­¹–R—eNË·’“›-3“ߌóÇ?#2çvûíz7§ÕZ>ÎÎÛË4w]§ˆÒZ–4/‹u>øpwùÍééÃÇíý=1Ÿçyš÷Û¶ör8ášÖ†ÜÄ«¡Û *^â¼û?ÿù‡%ÆÍ¸™çYAq]“s¾ä¼Ûmט‰‘¯®oÃÛívY#ƒ•Z½1—Ëj_sÙ>Þ>|ºûúøù)%!f^S4¾#CžÝïÿþwõ?þUY“e~÷Ãw]è2ûË:½ÿîû¸®XSÕJÓùÂl//gßw¡ëššBï‚}o7—ËùÕÝWÃÍöwû›‡W¯¦ãåË—§Íf{w_JyúòiÇoon—Ëñ0],Û×oߦe=]NÓ<çâ²0»Ãák.«:g©iC@Ã/χÍ~Çìö›ÛüÖw9îÖe=OÓ8 MÕç ÎÇ’+¾œçà]É¥Ö8ìïn 奡NÓ4Œãÿ{Ôezþî¿ùÛß~üôÜTˆU•VE²´V$¥tšãeÊ¥áyÍO§5ŠQˤØ0Zhµ´)."l¬ízììº67öÇÎÀ¸ßÝÅ5ùM¿{(—w‹óý¸Ñ0ާÓyëx³õ»,ƒ\)˜×5=]Úë¯ÿ§¿þýüÏó¼îno|ÿÞcÈ}õÕýÓ—§n÷û»Íf‹H·ï7míîÕãÓçÏÏOOí<ÙÞ›ÍÓùÙ{+ý¸‹µ­9?¼~sEË4;© ÈTÅ&úùã³c·½½%¢(gA’œ!i¹oãež¦ééùù›¯¿î‡ 3.9ùà,¹¶1Ç/ŸkZFîí—õœS1Ö¤ôÿ¸€jŠÇþø_þÓùwÿáïþöïÿðÓOÏï~úüþÇÏ//—Ÿ>½|÷§÷ï>~þøñù§ÏO>ž–y=Ÿ×ÏŸ'ÁÉƒšµ˜Æ$aU‘Ð 6¦©s•5sˆkÛío²2+’5="‚¢A ¨N“ú±àóÒûìZvª®åÁ{ê”e©-– Ú€‰rÓø×vü ï_%Þ/á»cøÇÝï?øü)üÝ{ùÏŸø?þ±ü§ö>í¾»¼ú§ôõo—·¿_ýûö«¿m÷_p7SÀ^ÿíùßüÏ£gÔTr6›­Õ*M€€Ù;k‘ÀZÇÆB“V* !)¤& ˆÀD ÚYIÅ 3|-Ï¡’s)‘Z©Ó4©4hšS¾vò!©6‘LL­e‘**ÐÔ°))å’¯-Zx%Wk%¢«šGÌ]ms¾ªÿ­ ª•ÚȰHsÖ:k¯?𙉵ü_Ë“–KÍ9""Ê%‰4f Ö„½ÛíØu3{ï˜ HƒÛa|ùüÚ°:Ãfž&"&¢8/qùêøTi]×åZ6Æ-³uÚ þæöÞ"Ò›»;",µ²÷›Íæþî¡ë{@C··Š§@Cèœ1Î@tÞ‘áuE*2YG77·UjŠÉö!Ù5Eo•GÕíwý8|úáÝfÂØñ5ÑG´ÌóóŸ–óùWßüb]–u]¯¥‡ãËÃÝÍvÜ"(bChب뻜‹cß…Njé|wøôE‹ä’ýàD T%FB$ÆÎû—çƒ7‰$Ëe>[k½óÞûËÍÍ 3)`×÷µ•“mÚR9ŸNˆXR$6,U›6C¬Mј9.÷9åãùì»`¼ß#«ªu®ëºçÏÏ!x©âˆÙಬÃ0Æãñ°†ér ¡mÔЇŽrŒC.ç˺ÆýßÿÅáå9×ÚÃáðòðøóº’1›Íؤ½žw7»šEURªy`玧“·.ååáÕVr©¹8o)æ4Ïç7_½ž—õt>¾~û&¸.K©÷÷÷UàñÕ›O?æ\úq !L—³‚:ïpž—Í~óÓïœñΙ8¯iº¼yûv]§ýÍþr9—‘Ùwƒ´ÚcŒ)øPjE¢érþ9õŸeýé2­ëºÛí$W0Á™›–ÒõC+éÇÞ?¾zŒóRjyõøªªÔA´ä ˆ+ÌÓ„HÆšç—Û¯¾Y.çœ2ÞÞßMó²ÛoðÝÜÞÝÍóD–/‡í¸I)®)ã6¥xúðÉŽõ®ï{€v÷øS)%ž‡óéĆcZ›T¬*0“ÔdŒ­*ÖT­ÆšV¥T9N9ÅûLJq;ÃÖºeYÉ;_µ­1²³(z>^”YsZ¼wÎv¡ï͵Hbùøþ7÷Ûÿã?üæw¿ûç/ŸŸz? ·›´®ÝÐ-ç3TEÛ ´¦¢îOêzbêìrŽ.Êc0Ü’ (CÕ yJQ+Û V‘WÕš n†>•%X ª\³ç<ÔãXÖ=Ÿ<ŠÜy#µ dÇ(Y•êÌ â÷'‚¥4òÝ:¯ 6¢!Ól!qÜÜw÷KÔÀ„ù„®ðdâvc.‹ Ò¥P”HÍé¹90kµgv »ÑÿóÛ7v®PbgŒAFeD&”Š–˜ˆ®íd¨€@øówZ+:ØJï­µ¶€‚Š "U ÈŠ¥ëœ! Кuv¤±”ÂÆl¬%Äàf¨jM"U¥µÖØ ![¤‚ 1;"ÂFJ`¬éû>çdŒqÎa«IŒ7 j“Z‘YS¬,µ‰Fff,™E€s^M­Õ©Ds-1Å—i ý`=9àqÜMÓ‚ó¾óÞ‡RŠÃÐ×ZK®Eå›_ýâéå™J]§éÕãë»Û›÷ï~¬¥xk¶›!ç|¾œº¾·ÖÇ%:ëKÉÐ$ ãJÔ‹T¬€X‘»®3Æ´ZSã½ëÜ:ÍàÔß=<œNÇRÔÚ«âĹ–ºÌÌhB¬Ÿ–ež¦F8 ]–Ü@áyšvo¶£a‘Òy³ÝmГ2ç5v}{wz9ôCŸbê‡p<¬×÷Ç——»»‡yYœë^¦cçüíþîùødƒ©EúÐ7IÖ…aèȱLŒ#,ºž—Ínk!VˆÓÕZÖiE°£ïîîî§—±ëŸä qð6tÀXUÛºž–µ6í¼¹,Ë÷?|ÿ×ý×Ë]Ú0“·Èÿ7MïÑ$ëvé-³ÝgÓTÕ©:æzMJd·B!u4•"4Ñßîh…ºEBd H\÷[&Ýg·]äå8#r’¹×Þë}ŸÇvýÆ{ßöÝóñP¹jS·?ýôóíí=2VÎ…u%Í¿ài!d/9ç¬.Þ/9ö›ÍñtrN¡äu8WmÇã0um÷åóãããËþÕÝŸüÓõ}ÎI—yqU=Í“ª+mµSÎO³«Ý—vÓ4ÛöôÓûûW÷ŸþòóÃÍÚ–ù¹­›¡ðûŸ~ìº^[£ooo÷»Ç?[c^Ý?¬«_StM¥êv;gÝñøòý÷?¬Þçˆ1EïãÊÄsÆÚóx?¾@.¿|‰Ë¬•¹Ê_•âÛû»q>~üè¬ÆAk®ë:ÄÜ6-³þòåéþž±nš¶éCNDÙ¦ÛßMùYJyu÷ðóÿ÷é娭Ùnö(0œO¯^+cµBïýæfßÎS×4Öèe]]m‰¹v6“¼ÿ¡íúãñÙvíyÞl*ß —ÁT®nšRÊår¶Lñoþ·ÿå§?þ)L“ˆŒãeõ¹ªjmÛn³í¥$SJ©]{†T ¡¾}}»Î3‘šý¼L‹ §”cŒÛí>ÍK ©m[kœ±Z Œ d4'ŒãóA¡ÒÆJ b5³±»Ý~žW•bLÃñ_~÷‡ÿòÿü÷üÝ_2_†ý›®çpTi¤"Å{û E]Òs(„˜Ÿ¿j6,CòIâ²±¼xØ*-+Us’œˆ[ØT¤ÍšNs Tâ|kâ–×:lÊ󖌩ê“&F„ÌeõMeø\&.ŽÇ¢/“ ì¼i—’¡o#Û%ªͬmÒ ¡M>;¥ê‰ SÅPQEÝ–¬JÝï0ÄÛƒ{¼‘K6ͺ¬_¯ÿr3¿ÿ?îR)1b% ÐDXK‘Rˆ€™…µfÅŠP)]D@ø#‘"%’c’üÒˬ˜…渦ä 8§(€Š±dFD­‘¤üxÏ9jm‘u¥4 BJ)uUï\ s"Š1]e™YŠ.9çà£vu‘‹p¹î  P)‰!`ÎA €R²qÎû€J($B!ùRJÎêªqæ°,Ddœ©j[7íöm×õ­HŒamëmŒi³¹YCZ×u¿ÛÿtýÖ(Â’rÈ«±¶ë»Ç§§ªªJ)¶v9¤èWÐ!+2œ²$‘çç—¾ßËó—ƒä¤XÏË,EžG¥LIi/>>:c‡Ë1oÚööî^ivsýéùYDBÈëêï_½ bUµ-HÎ!¶·{ùú›¯þô¯ÌRšª—y]cˆ>Æx8ÿݯ~óòü|{ûzY–û‡7‡ÓéþîNUÍšüÿÃ_ÿÓû¯ÓÒ厇çw?¼^^‚÷J3°ÚnwŸ?ûe½ý¦ßo\]ïon@+fB`å§Qk0FÏGÍöýŸÿ²¿õùÇûû{€<.#éVÏÄÇÏO%§ª©•æi2Pùòøåëo¾‡q³ßýôç?ïwûÛûW/dz©Ü¦ßå•qmÛ\†!–4¬³5î<œˆŒRõ¦[^–ÃãËk[÷m Ú0ãñéóñ|f­ ñ4­Q"øuÙl6u]ûõ 1¦ŒKRÈÓ4[[ FŸ IDATŘÔr¹<þñÿíï~÷ÛÿïŸ?>cáîFß×—Ÿ!œ6ª6‰Š°¥ ¤©µR2eyÑkI ~Uˆ8PQO™n„R lªB”Q¨ÐírH¤f#ó¦¬[5vvaµÓ®j–¬X™8 ¯vXÙ8EJ`ÃÌeY–ã$Ql ©ºˆ'm§•'1Æ€R.g'¸ ª¬ª^cÐQX|F ­ ©©×/´ò´Ttàèî×ë‡û×ê¶±|D¶È9—e¦´fÊŒ’s–‚È(%¥Â@Ê0‘þ7ügŒ™ –…P#ÒUHY2jbF(¢P#'Æ”_ÂË"D’s!Â"‰@R*"™ˆ¯ï9PŠ(E¢È¦àSΘ# (6L( ‰5Å’ªºZV¯P²kcÄL!c.ÀTÕî2ÎF«“!-Âq͘KŒ1眘uð>c‘|ÌyYb]U1%)ÅZWUUÎY)Ž‘Öu±vŽSò \b"Â\ &™§yg2b湈°")ŇR6Z[R„<Ís¿Ù–˜XUë:"bݵR 1çTH@µ®&¢äC ©ßvÃe@Pêf·Í)χ—ãßþíß~ùò²$Å €ûýÍå<,ë²Ýí—emû.¦ØÔîÇÿÜTõý«WÇÓ¹`N!Ló¨‘ß|ývž—ª¶1úeZBòçYªª49㺮†ëª«O§Sß÷¥HSUãe:ŸÖjfi¬;ŽÍ›ª„DdLe5ó§ÏŸš¶ÓÖÌSô>äÇÓ7ß~ÖÙïwOOŠÑh•’ÒJÍÓHš¶UW$#‚H÷;¿çœ÷^[k]€Ýfs9ŠÏ3Ì)¦§/ÏŒb­eÄGcM.²Ûm^Žç}{[»J*MËz¸œooo¬±¹Î1†ýÝï¿ÿÍoØrHA×FÞ~÷uÌ1•˜rX/Y“rʬe.Á?žÏ÷÷`]“óùõ7o“ÄñƒO‚ÊÕoûÝÇ/ŸîØ>¾Çéîá~]&õæÝ——§ýý«˜ÒùøÒ¶Õùt!€Ýv7ã—ñ’Rn¶}S×Óylßmzâ¦i>|þÄK^cl›:úHŒà³sÕ¦n>?ù×ÿ5—b´-9*ã:âv¿?ŸO€ÈZƒä¶éFRHwoÞDçuFÄs·Ù²RÚ9}Û‡óã‡/»®/>Q)çeš/ÓóÇíý>ydRí«®þÑíîþôÇ?­ã´ý |´¶ž†³GãÌÝ«{)Ù/ë)”é2n¶ªoÚñt®lU Ü½~³ >”²Ùnƒ÷/ÇS×ôF©uœ3ggmJ£b€ ŒùîWß³Òåûý«Óåœ ú5~zzn*×6›ýæf^†J™ã~³+Ž| l¬ë{S[|Zæ¾ïö7·Ÿ?~Z¯´½»½‹(ãËeñkÊ%Ï )! çºJiÚÖkêF½|üð÷¿ýýoÿá?ÿô !è<¼i’+¹Kh;Ò $% (YRaĬ,$‹ÚX⪨-IANJq,ÚBÅå-d€ªdS™E)fô™b~É4F…B JEC*ƒiª.ØàK8*â”Ò9äe•ºîY¡v͚ψ©qÊê%Ä9äE[£K>­ ¬1k'F3 Î() ÕF+˪f!¥,ÅÊUˆª¨WÆ5ÊV\uÉEa𣡬±HA€A³&ʹ@˜¸”DÈ¥$] +P%†tÕv(!e­5b¹NâœK¾’Ç*­%",t”R”‚+5‰œÖ¬”_WPÁ²f @È ‰Yimâ² ‘Rê2ŽW¦&"‰Í4]º¶7¬CL„J„ •aH &ÉˆÌ YrNR `A!dEÝn½Ÿ×‰ˆ¨ëºœóvÛÍ3ãØö-±f+•uã4äœ@èåå P”¶uÓ=}yä‡{VZ+’”×yrÓŽçeÐÚ0âä×Z™ˆ¥°Ñ~œèЏˆ)*¥|Àj½bRÆ}ôÛ÷×Ý~Kˆó?þÝß}÷W¿çèããý»waß}ûÕÏ?½/)NãX9ãê*gé»þó—Oß~óаRÆÚâ4ž—óI•§ew»ÓJ(Œ  Wu3~Zý°.9%œ¦é·¿ýûÛÛ»_tÍHƘiœŒÖ‡óPYÛö­÷~™—š ˜•±ŠX3|ÿñÃÝý>ILRLemå~õë_N§W¯þô—¿·ì¯/Çãv¿}~~î·½ÑV²hc”ÖH4Žc&2­»­ßœ§ŒEa}Å«0CJÙûˆˆŠ™HYë0•qöq®®œÕ’r–üÓŸÿXD$¤RÒt÷Û[¥4½¹»ÍLßÌÓš%³†˜V­i\&ˆÑ{ŸŒ«³”Ù‡vÛÆ˜¿|þ¤/'Dœ¯4÷ÝþóçÇ»ý~'‰Á!>=†›íæªÃ8Ž]ÓTÎõÍn ëÛýWß÷ÍyöÆØËå²ÝïûÝöãÿTß~z|oµªÛ&øu.øðöÝp:¾ÿøiY—y]÷7J @«Ìp<ûeíÞ¼>UÝåq˜¦©®k H)£sÎûw¯ßÿã?×wºßnÆÐ©Ç×ǃ_Wд.-kZˆÌË<Œ#H6Ö¶]_W ²Rˆ¡Ûì0'T€E†óèlu¹œ^?|9î•1üÝï]í¦Ë´R‚O_¾°f§tI>FØî·Ç󱮫ª®|ô—ãñéù0]†ï~ýý›ïî?½ÿ„V™Êiæ}Û´š¯8qmªÊéb”ºœÎèô_þåÇo~øÎ÷ðîÍt>·mwµZ9çš®ó)éR¾|yv·;46 ,k¨+M 뻺Â%&Ôüôxx>ž¾ûæ;þ¿þ÷ÿó?ÿçÿ÷wÿýóéðM¾»Ã¯÷Ê©¬)[æë(ŠŒ«´Ó–X·)Ä)ä ˜H@+PPDÄiÕű(*,”‰@k1J*]ÖŠWË…µ¬]S…Â}ÝbL˲*œ+çi^}IEÖÆ˜Úe¸x£mADEkÌ׆i i ¸d PLç\ߢµÈÖ`[0è¦(—ÈÖ®iUº»Íº¶Îé ( S)…põóâ—â}L9@)¬”1ZÈZ1#±RÿvçfÌYJÉ9å\Jb,„¿Ð#JI©¤S‰RŠdRZ1k$‘"ˆtÕª1Ñ¿é D$3°” ¬KA”Š­k°ÖñµYŠdÄSʉI±àU}™ýUUZSð‘‹¥x—u]@)fâà1‹HÉÉÚJ;KDu×lwÛiš¶Û]¿Ù–œ+çBUU7U…E¢È´N뺭%K©l¥Œ/竆—5¥CÌ×åö2N]Ó@ŽÙUNr–¯¿z7cމ 0gx÷Õ»çÇg¥ô<(¸íûuYÂ웪*>ŒÁo7Ýz™Ù¹ªvΧƒÿãþ5•òúõø°¦EJÑÖ€”òøü²ë6$‚EJI9øe‘‰IaŒiœÆ¾í¶ýöý_~Š9;gme‘øþþÞµ­«­_ÖÛÛ[D\×¥ªª¦éRðκóp&¢¶í¥ˆ_—®osÌã0Üßß­vçãy§¦n¡È•Ø*R\SÇùÏþó7_-Ib ]Sùü©ëºœâê}[×R !¬ËZW ‰ šªîû‰æ5ìv},Éjå\BŠë:¿œteH))9¯iÇ" õuFmwÛ˜SÛõEi}<𦾼œëºêÚæ*‘v®ÇñîöfÆè£Uæ‡ÿô¿<>7];ŸG”äj·Œ“ѺnÜ2Í»Ûí§º®ó~õkPÖ ÓØö=kîúM‚¢X-ËZ÷ÝºŽ“÷uÕ Ñ8-ÎYcMS×¹@Ƽ¦ä×åõÛ·çËÅ…Ä)GFmÇ¡mªuY£O÷o/§³_Ã<ŒZ™óË i­•&„i™ëÊiÖËrÎ}Ó±«_>~‰>t·›2/¥ÈãáÙZ{ÿð H!æìŒ >mwÛÚUëéRõ]XÃîƒ_¬³º®â2úlvýŸþüã«×¯mU§’SJ·÷¯˜¹°„œrZÛÝVc´Î\½ UÕXc^^^4k? §—Ó~¿ÿæ»oÈËã‹Ò‘nöÛË85M­­&T\w]ÎqY—Ëñ4œÏÓ4Ýݾº}uOµ«7ýÓÏœÓÖ˜cLÑh»¬«i;ÒF!‡yòó¢o¬aÒÖ(­ÇiÀmßø”ˆÿãøOÿå¿þÃéøÔ”—ÿñµêtI (ƒ”ÀµWoQ$SJ)—¬,egÉ2gÀ”¶qL´^WJ1FØ(¸‚ÉQ”B.uÕedÜ©”âPÒ䜮\MZÅÅ}õ< ñÞ‚¾®å*{$J1²(k D;]5R–Ykc•aÅZ3)$†ÌL̤Èf¥meµM, ZÅ”çÖy”5C”Ù‡èc.Y)æ+ªÙÒŠ•1º¤Tr¤”\Á>%e@ø¥& Q®âk; ÐÆ*f)((Z1³äR03 ý²f(9'Fô!Ò•é/ "Öº”"“* kòD cÊUU¥‰(¥LˆDDˆÃ8K‘R$§è}H9ÇrNó´h­¬sZcLÁZ'’©š]ç\%"ÖZVª”¬­±Î"#P*¹rnšfk”ÖF²”˜JI%g1nö=):ŸÎݦ k«uˆ±ÖÆÌ‹W¬´39eÌÙh{:qa]/Ã¥mêB¦ñáÝ?/ûÝöðò¢X³ò~õËŒIÊ/—s¿ÝŒóض­qîæöCÎËêÇeYÖ¶i§i©¬•R¨àñtê›¶äìý¼ÝîBXRLÓùüÚÔUòRež>|úÈVßß?HÛ´Z»Â9ùÕo¶¥t«sN$/ë\5ÍõÔ®ªR.µ«‡Ëx•Óˆ">§ e ëþö‘æuFÁ›û;Ãz^Öý¦éÙ˜q¬3ë²ì÷ûXRÉåz`Çè}•sS®ª„Ð5•ÑÖ3-³ó×_}¹ŒUÛ„¬«´u§úfóú«¯Çóyšç’âé|ú櫯CL¯Þ¼¾,ó·ß}ûøô¸,~Óm»M‚_ÖÕhµÌ«öÛ}HÑ{x>îÞ¼É1&‘pžX+mTœ—T¹t‘ÈŸÏg&¨ªæt:–,J3)â0]b¶ÖØÊIÁË8învÞ‡¦mæy1"Q×w!$EøúáõËÓRÈx÷pïú çÅonn¬µ—ËTJŠ!g¡””vÛÝöî6Aò>¹ª¢ŒY îêyîÞ¾~üùãåt¼é7‡ãË7?|7Ïsñ~Z—ºªˆTM;M£±jž§åx!£ È².Ô¸$¨›ÊlšxÆÃ±ræøòÔm¶›ÛÓµï¾ÿúÃ_~Ö¤BˆZ›ªjž?Þì·ýf×l¶ã0¥”BJË8χÖUMÓˆ÷뛯ßMëz ‘ãd¬ñѧ”ÉVŠ¤Ñ¯ÁC–ýÍþéñéûw_ã°Ýl Ñùññæõ*¨ˆ­á«ŠŠùÅ‹“½!,ãH„º®Hd8ÎVÊj(R’‰•µ>Dþ›ßüûøíï;3ý‡[~}SWÎÕÖ2+ÍJÕ­ª[H±ø1KˆI Ǩ q2ЄlQi“JYcÈ’BbÒÂFý‚+.BHB ­vUUY‡K«"!\Žg£´2u·í°”põI«#Š(ÅD*eO@k”RÄmŒfë´aV¬€‘T*`Hi¥ÐUÖc´QF‰Ì¥(( ¦y§IBÅÇ’Š`L«&ÒV9cÀÕA&DÊ1æRÎ)D„E@3_c¢Ì¬”ÑZi­™Ù¹šsÎW˜ƒ\ÍÌJ1!²Vö¿DB­423c‹dctJ s,B¤Y_Ó¨%—«Ž†ˆ1†HZç\ÀhÚK)¥H.%äìýê“a€¢b“S"¥”ÕÖ¸Ê:V¼¦Èˆ›~‚gƦîÐÕ•ÖF¬uMÝ+QZ/óúÕ뇧§g¥èvw³,KA)^–¥ªÜ8ÌÛí-¤+ .¦@Ä)e hŒ»®š¦(ÆZÖüñýVÌÈ!¤®­×e !å˜înîŽÏ/U×í÷7Á‡yZD ®Ü4^¼ÃÉO³/™ I¤LÓLX4Ó²Ìèý|Ea+­JU»R22í¶›iš¢!„››ýÏ?ý|sw³¬ àõ·3F[ë| uÝ —K‘c¬+—J’”Æñ@Jik+DÑZ‹pÞY§•®¬ž§EPü´–Rˆ™Æqz¸{M€ó2g‘eš”R1&` !lowçË@˜É¹*'‚u]Ä{Š\å/§ºiê¾ç¦&¥ ÐñpªêZk= çÝv{¾ J[¥tÉe»¿É¥TbúüáCãlÊI)}¹\𾯩ª;)rûê~»¿ !°RçqhÛžµyúùãâý»¯Þ|øé#J¡ÝWo@d8œÊf·‰ÙÇuýùÇ?Ýl6¹äeYÖi©êÚ*õáó§ÛWwu]ƒR}ÛÙ®‘”M]WÎÎ!–—è^?¤TŒ5Ó´t}»L>¦ (1„Ív?\.¤T]Wça¬++" 2/ã8ŽûÛ›¾Û6m÷ñóço¾þnÆ~³=½_^)F‹j™§, +ëªfY–yžÓ Šq®rnG@¥<úÒtŸGÙ=ÜdKóålõ³OÁïnîÆy^CüÍÿú?›?ýüA³ž^MÛzÉ~šÞ¾½²_˜Õ8ëê‘`ž–ÛûûœcÎrÇœsíœ6J‘²Vï6»n»Çaœ§vÓ–˜¯ý~³%V!†¶®šM»Ìë2\>ýýïŽ>u]czùühX”5ú¦ëbŒm]M/?ý\ «Ú­>%!¿,UÓ²bˆ1#+W×\U]߇SÌ©ªÜùrQF±‚WwP(¥Äß>|7|üò·¯áõ†”rúêÚ.¨(G¿œsZC‘Ä 4ˆ* ‘™SÊ9'çŒ&‚‚RDÉhEŠÖRKɈX çbŒª›Ú)ŽÓ¬ jmÂê}HÆic­Ñ6† ¥¢8£@ä*;Ì9%$ÊÞwÎt]m¬bF!f­H30f‘˜­eë ­‘‰¡”ä\R(Bë°¦eI~I>¤2ä’rŠž*[)¥‘àj”'"(9 ¢)Ö|U²Xm´qZk­”LJ­é—d½ bιü"­ÕWz”Rˆ®MOF,¥`f`Å"ˆˆ’òÕ rýXi¥åïN¾2ù‰(K.RÂêsɈ ¥HÎ"òu#¹m[`$¥Ô/ £•F)Ìl•ÑÊ€H¿Ý–œQ©®m‡a¨ªÊZ«µŠ) 5ª@q•MY¬U~ Á{f½¿¹»VÒdǺ®D¤øk±€ùê÷è»®äl”Ê©(ÍP '/%·}Sê7}Xçu^$†%[ã.—sÓ´H’S®*ç\¥ˆ²€"$«M—e˜ÖyZ¦‰‘@[—¼ošˆ®d¤JÛœò:ÍD0 C×µ"²Î Zg™Ç%¡±¶j&åC\æ9ÆèC¨‚ýÍ kå×ušffŠ1±£×€­I¿xÒ¢cíïÿùw_ûN@æuvÖZ£‡ËC¨]彯´›ç¹ji19&W51¤ª®Œu‡ÓKò‘‰÷»}òyÎ%¥ýn@k=óÝÝííë»óyZÖi™GETUÕËÓãå鹯z/åû_ÿªž^ÎÖÚ¦­s­Uëùt’B§ãa³Ý´ÛýŸÿé÷›¾o_ÝhR’"Õ÷wÎ5%œ.Þ/û››¸,ã<µmßw”Œ~Yúù}[w®jbNí¶$A"R—irÆ ¤ëªí7}ÌŠdãêªró|øÙ0÷w7»û[<̬µ­œE"W9ÖÆ"b´¶ÎHIÃóËñùy8RX¡”ÊU(%ÆôüôìÇ™‹8¥EÊ4Ni&cÌu'8¡ EMˆ×Q À4ÏÊØ”Âê—”’f2Ά5 ôRu]m6Ýf³A€ª2MÝ´U…ˆˆ¤P kCŠ`sSWÑuÎPJÑŠQP¡*1•RªÊ­a­*÷øåË8Ï>¦5†Xr„dœK(ÚéR ßl›í>ƒ¼<|X—Å·}ŸRÌ’cˆ§—ó4Œˆ0œG‰Q¡rl¦ËcFEÝí­é›¾ßL~«ƒ$SUOÏÏBÂJ ã Öe¹ÙÝieO§ã´®7ïÞjä,ôáãgÐfIùt>(€eñÓeàë:g „"ÈÄçóPU.¬!…STŠæu‚”µåWT°®sÓ·ÌRXÖ*眵mS­‰8^UÃu³¬‹HÁ”Ó:/·û]×¶Ñ/§——yjËRÊ«»WÃùâ—i³ßvûÛ»‡ûi] €÷>¥4è]ýôñc^Öáð’‚_§ár>­öÛÛ¾­æñ¬5ú05Jæáìç¡Ò¦øt>¿6M]o7¶­w·7ó2×ÛíÃëw%@·Ý(( †Ãa&(¢™¥¤˜V×XŸ—›Ýfx9 —‹H@­æàÛ¦}:<hÜ?ÜÇ3 2H)•5­ëóY1ÿþŸÿ‡ùç§—‡‡·¤xña—÷?©+îdép8™ÊªŒ­œÒê—ùtxf¤—Ó!Ä8.KJ9Ƴ„˜·»]ÓÔˆ¨ã¼ÞÜî1ùËåáF6Nš¶ÉOO@¨  ä¬Y!jE¤€3a*¨hÅŠ€€0‹ä%cŠZV„x=/ DÂl4k&k,3„¸®~-±,k¼*•V’%'A¥Q)ÍÌ€€ˆÆ^Éd­QŒµ»æ ¯‹X0ƸÊYå L¹XMŠ%„¹v&çÈ"1b.1fÌ)‡a\WÌ9-‘3hÅ]Ý4um1J”’2#Îó|<¢¿¦3I)¥VÌ}ëS*P€€ˆJ­5@¾Žä@$©,>º¶jú‰X±µ¦ªk æ+º‘ð}¬ÑB¬µÀ,À\A„‰ ©`UwLJˆmU•R2”˜£O>ø¨-1¦”K*‘33+!¥êºa£­©ˆ9¥Üwm¿ÝÔM«I•’(„¾isˆMí¦y€,q¿ßgmíP‘±SY†IkÖõê3 bï—ýÍ~X¿xgPŠ dë¬Öz˜§%®•«®€Õyžçy)Ó4•"€˜JN%ŸÏçÕ{}½E„§q†\®ø$PBÎUÓ=Îû7oï~ýCÎ…ÙÄ5ä˜D å0{wûôôìçå*“‹)oovBW1‡SˆÙhu8_²³±ºª›>¬!¦4Ln7ÛíÝ.äœ —B¦j”BTвB”RDÒ0Î"Òí·!äœeœæºjlUóÔtu6…chê&úJN‹¿¹Ý1Â:MOÏÏqŸŸ¶ÛÝxÏPØo7ιá|>c.Er4•™–ù|™ØØqž‡iˆÑ¿<½¤çùŒZ5Mûôù±qmŠ”²/ò® ¸é·J«ªiÏÏ¢Ÿç]×}úù½jl»ÙØÆÅèsÉÚ™iBö¹$míçŸ_¾¼H£Ôöf“s‡aÓw}ÛH‰o^cÞ¾-$ã8ÍãØm¶‡§ƒ¶ˆe\sdæ·¯ßl›M̱nšãË‘D´V®nî^¿½}ó CÌÜ4†ÙÇh’VFXoö7dYu}ß40å ˲jVDXcÌâcH!)Åü?½ýö×»¥sŽY}üø”Òš+« … ™ *BATB¨ˆ5“äÂ)×V[¥KNA 2§Ó IDAT2%REHŒ|--*’¥”\9c­QJ+‚õrA"§ML±dÑFYã¼_ 1K*ZëR "£A@‚â•Ml¬F%ˆ\P±bB&*L¤Yå\@®…,¸JE”ÒRŠÄ¬1³RH$ÖYÍ\$µubX½Ï%VÊÄÑH ­!"kí¼³˜‰‰IÑÕðWÔ•R® ¥x kˆ)„5®k†‚ˆ¨bÎy ¾Ä’SÌ’‹«\J³är,é—41 ­ øàY³ ”T‚Ã8{¯AÕÂõ ÔUk•VÖ²Ql”sƺZ+nÚ­_cU9DDÔ¬”Öë )Æ/ÏG…•«‚}×{E®êTR@R1ç¦é€È˜ÚX %‡º¶/)um3-ó|5~^númˆ~™–¸øœ³_}UW¤- ”°úež«Ú®[×´Ýn›¦™Æéæææx<,Ëb­c¦yYŒ1ÇËéæÕÝétØî÷" €uí~úùýfÛ#óv·=Ÿ×6®®›®Ž)\ß6ëºnÛ*%¹\©qî|>mû~ kðþËÓ͈Dó4~óÕ·KŠMÛh[Õ»-Ä2‡~×­>"áë7o??~÷›2‚¿ŒÃi`)Û»[¿,ˆê|¶»W÷ß~U™Êuõðá³_Öíí¾êš«ˆOk}ίîSIŨ۷oChˆnoo/§s×7Ó´t›®”r¿¶M·¿Ù_†&„»¯Þ,)úe®]eIÍËâ—…sËåÜ·­Ñæãû÷Sz÷Ãw—a|üé=Îk}³ÓÆHÊ%Fï¬=ŸÏß}û­_ƒ2ÚuíéËË2¦r(\ tÛ ² ÐêCI)ƒ¸ÊMËäšÊ£=_Œ¶)¥››ýû÷v}ûéãû°úÛÛ]³í†Ë8/ !¾}÷nœç’rÝ4ó0²2›í>¦Ôõ},Ù9ÇÆ4]ß÷ÝóËsX–Q‘’"1Fa.IÎàŒÒÚ óâý«×ÝÍ~.1¤æf«ÚúæÝë¾ÛŽGWiSjûHñ2ÏÓ0Z¥­­ë‚8\ÎÃ4‹`ŸbUÙ’3C‘’KJJ)P ŽÇÃnÛ[­KL9F"˜Œ¬Šèp:ÂÊp«ÉO˺Ì벤%32#1+%•ÆÊ²6 $(Lš`$ÌWÒ€6¦*’P²A&V„ ä*¨‘,¨”Ê×ìc!,XR,˜ ‘«ãâÊ*PJ32_aûˆ($|½hbT„”¥°R¬P¬„‰±ä‚@pý«)%çXJff&Ö†˜•3ÆiWr& eü4ßmû_¼ÉDLÊhëXkëºî›–Èm\UÕm…H 4 –cL1|ˆ~ óì—Óp^Öõp|z|yy>«O!…Õ/Ë0Ïˤ,ER)’®˜iUXé"’r¡’Ë2Í1Ę¢÷+ (ÍDø‹À\S©J7Û1¶©Ûε(„ŒJYI‘P®Î2"uÝO„\]A¿éÆqEüp÷jY×¾kÖy>?ÆË@$Ji¥Õp¼ÜÜí”V%ç+%»6®øP²TÎÝÝl§ár8>[K!zbÅÈÊ(DP¨“dˆÉŠHÑ ÌBÌ¥LóCŒ16m3“ˆ"ÅÃ5k»øÅû”R‰ 8ã4g,¥rÊÃ<æRº¾éºf§Ú9W¹óå|x~¹œ·»Me"À…˜¹²•ˆXg—eA`bÀ‡ûû"³ÖZ§œ5EÜ´µv®í72¤üøøäs¸‚ÖPcŽ) ˲zRfÿꎵKˆÚU7·û”òétÇaõ ”¢ˆ»vÓÔÝáéårEÀÿï~¼GP)f$ÈʨW¯ŒuÚT‚ •fP~]¦Ë},)wM PÆapÖn7[$Z½7Z?½¼ä5uuë¬nšf™gRúéüòWÿþo°²…A¬Ö7ï^‡\^^^söÑh=Æ÷?þiÆ}¿M Âv7·ÛW÷)Û_ýõãû/çãÙ()Ãù<œ^Èi£ÍËñ 4.§f»­¾<>W®"­Þ¼~3M“÷Þ§BІ¦Ë¨5÷]Ÿ±ªë"™•VÖ†e­ªJkcìw»é2X­£÷µÛº9>Ÿ>îúÎY—K9<>ßn7íÍ~óõ[óìg_×U\cLEæi‘ÊNžÈ˜é2Ÿl]­1Lã$…ŒûÿyzeÉ’,Ëîe—{ÄI°Ì¬JV% @h´`‚ïoL!@wÉ̈Ȉp÷ÇŒ]¦ì , 3û½j[÷^+°1±$ËfØlK®/¯ÏëšÖ”û»Çï•äßþý_¯§ƒkLS¢ë×ÔRøáû´L¢åííe»ß¿ûö´jž/—Öٷ秪‰ˆ€twwš™ö_=ŠªmÃæá®ŠÜß?î¶wÞ7]×/Ót½žÇãÉøfóáa‘Üt]fp]ÃĪƷóM‰óRÒškÕZÇë*µ"\æI¿ùæÛÇ•9×BlriºÆª`ìv·ö‡ãéZ†í¶¬¥¦4_®Ë¼ðÿüõý‡VÍu]öÛo}Êõæ†Ñ\AÅCÈÁZ§ÚXvÄ,Rórã£9ç¤ÔRª±†ó|£LWA"¬¥T$2δ¾©¹"éùxìüM¹0×RBh6»þx> ]/@ÈhЈ yïTn/{s¶Æ2ݼ•d˜¬¡LüÑ-< "©…,— HU­µZ…´”JÀD&Xûøøx~}UÕ&  ÒZR­ Šæf¤²¦ŠZcA«"i)yI)—ZjY–˜bUUc­PLqY×%®9ªKŠ¥”ªRD”HªÔ*DŒÄtûË"RK)¥jÎQnR˜%Æ%.ªŠˆDœsˆxÖ[ãú®]S²Æìïïçy)91³ÔBÄZÕXSja¦¶ ’kh¼ ›>­9ƸÝîâ2Ïqu†A¡ íõ|¶lœq1¦à­ëÂÄD ˆ}ß/ËŠd(4íéí¨ †MÎñv—gkº~s¾\!´mÊÉ;«ˆZ¥išgç|۴˲Ü\+EøæQ3ÖÚ’“ªŠTpÖBAbfV FÌRsŠDଳlw(ZT´èúÎs½^l"’K©Z‘h‰s­õÃÇó¼Xï‘Ékœûëßo6ƒª Ñ8ý0Ä%ZËÁ†ñtîú 9Âý»wq^jÉÛí–ÀŠ–´ÄRKI  äl­©Mèo ‡\J­U–%•\ÛÝöéóÓÝýý?þ½hÅ’åÝÃÃù2Qí‡!®ë‡o¾ÇëÓóK‚îûuš¯ãXrÉk*¹T©·-N®e{·Ï1‡¾<=ýãþ°6ßÿ凮ë.Ç f1T—ôé—Ï÷ww¯¯ÏçËÙÿpGÖ+âO?þíÃwßîöû·××ÓÛ«3 Œã5—X¦EK)%†àQåïŸÚo÷]ÛÖRãIaww·Îs)" zwwˆq]–… #  ¡y{}ÞÜbN§ã±i;†›¬Lؘ® §Óëé|ê‡Ýî°DZ훧/_îïï ›Æû’3"}þùçͦÛn¶çë9ç4Í×”ÓfØ\®×¶k»MSFçüuY?~ó­1œk>.ƹëùºÄøpÿ˜ ×u6Ã~»Ï—Ëå×ì­Ûî÷y]Û¶»Ž'k0®ëö°]ʪÝÐìîÇ×WcÌv»{{y+¹ÔcëÛTªwn—¼&@ðÞªÈóóÓn·Û||_\rÌ©o/—£³¶ÛÍt@¤q¡o[ï½c»†Óñõfßî÷76¿1 ŒZ…½¼/‚¨ È õV•TJ"¹–pŽkšYÝö¯û«3n×·mð—yjÛ¾ñ¦ÔÂÿåÛÇG¯×”Ú&<ì7X@µŠ¾iÚš+ °jk­7L¥ €©Š!tÖp.¹J$ã3#T%&@%Që,ª:Šä²–SÛ5†xg@h»¶i›···Æ7ÀÀH`¨Š6!ˆH)YQµ”ŠÌR*d㈠ð†[ÆÛ H‚ „ µVbК‘n”Í_?†Ùg¹uñ­1µ”¬Ô,RJÊ%gPÍ9—Z‰˜oW]kHѰagU…~mÛà —k-¥ˆÔcŒ‹H5Þ€®mZë‚Ö*D ÉZvÞ‘!笵Ö笽m}ˆ ‹Tb£„µJ‘[À$¥ÖÛ+§ *ÊÀ·.óm¤JDÀä”0x‡¨Ì†P7ýS®%×*›Íæ:ŽMãxeF¸¿¿;¾Û¦/—aD@K)C·9Þv‡ýùtÞm¶5—œs×5ªª˜‘h]FëÂí ‹ _¯×Ãã}·¦q,9Ýö—ËÈdÁ^SôÎ¥‘ÐZ&$ɵfÃNµ € Ä´×°w*jŒ!deÌ)!1—*"Ú¶M©õVñ¹¹0kÍ¥”â]DÌœK¶.ÄoÀ"‘R« ªuÎ{¯@ÎïÃËós?ô"jƒ1lRÎMhr)÷¬(9‹(1©€óf³ÝŸŸž/_}ýuUÉUÀZcLªuÓožÇ»‡{%"kI‰ðçŸÞí¶Çãq³Ù­Ó”JÆšËf³Ùm;EPÄu^ö‡!çSLÖY`&vƲVU›¡[âÒ„fÇý~[R¯W-%ÅeÓµ!´O¯OMÛõ}?Çh½_×9Æv»ý_ÿò¯¿úúó/Ÿ|Ó|õ›o—5ÖZƒ³?ýø#*¢!nš¶kQÉyžÇO_žþ§ÿô¿üíßÿš¦ºiœ ²mœNq»þöÃ÷ï?¾?¿¾úhˆ áñtqξûê=sSåÔR q-Q/—»¦AbcLÍ•ƒÛ* ˆ?ýýï÷»}ÊÉ?}þb­ªóåTŠ&fSr&¸=R)y]SÓõã<;×ìïÖ”ØØÃvgœûô·dZþý_þòÝï~³ÌËëñ¸¿˜çIÖlÀ°¥ûû"·yÜßNŸúÅ;×¶}©5¦Õ:s=^ÞÞŽmëÚÐãÆ8½¿ˆ1kóšœa‘jØñùøöñ«oæ”v‡;$ôÁÇq¾‘n§ël™j•R  N/ÇRÊÛé¸Ý6Ûáôvô¡±ÞÝT}9¦×çÏÓñ8O3"t]7§¥z™V©QQJ‰MÛx×xç‚1Æ9@n‡öz.Ó¨’AŒ¡*Ïo—wßG€049&ËZTsiÞXÉË#ÿçïw®…]ßݼQ€l­a6ž¹‚¦˜‘eFT­¢Å UѪÕ;¯BE+3+"o ª"±€]—HŒH ÌˆlpYVBu–k)Ó²à¦Ûd•y™è?àÄ€ÆUe6ˆ$ ¬jØØÙ € Îtl,©ˆˆ"ˆ–›Ä^*‚ `)EEo_„*Š ZŠ¶ÖŠÔežœ÷ àŒË9;ïsΈÈlЬŠDÆú¤UEK½ ç©ä Jˆè½…œ³1x[7m뜳ÞÛÛ‹¶±†õ†Ù ¢sÞ°%2Æ{¶ž#3 “cvŽ c” ÕZDj-Rs)µ‘¢µ 3‡¦aÃÞ{$rÆß¾·¯Îf3¬ëê\#¢ˆä}ÕÓãþ°3–—%C¿ÆõÆJ«1¶];Ž£‚¬ËŠÄ}×]Îçýþר†v§ÍÐ×3*çk®—ëɲ[×Ù{»Ûî/ב ±15WDXS l—y„"Ã0(bãÃ<ÍŠºé7¨ÂÄI*ˆ‚”r{Ìe^VÓø® $•Ü Ã<<2R®µq¤@Nùr¹¼ûðnY–’sJ%ß4þòvÜíþö—¿Ú¦¹76›%š×…ˆ¬3ó²‘mš~»ûÍ?üîõíõõíˆÌ}×½|9_ß.—»‡ƒ 1ǸÆe ¡+97m{¾\š¦a¢nØç†a[Ö”c:>?o‡ÍÝûç×7ëBó¸óÖ !qm}Øî‡Ðµ9—ÆEøô˧®iû¦;žßîß½ûùï?ù¶ Ö“áRb)e:ŸÖ¸h­?ÿ×¾ëãe¼i5ã¼4Îï‡ë4m6ƒßl⺓3¦íšÏ_¾Üí÷Á{f¼\.xÇwïß/óL7¹…ífûýmûÎVEvcF"$`ë–e„Zå|:{ׂ¨aN1â¦k_žžï?~xýü9O³kÚíÃÁnšöíxjúFИÍf(¥Îã…}]Ä××cçƒ ¾íDˆKüôÓ§ï¾þ.–èœßnrÞ=?Ùl6ó4±åiK­ãxíûî|¾h•~·5μ>=ï7‡ãé˜RrÖÌëÔkŒ}}~"2ªâ½s!QG‰½¥Êp·¿ž®†¸š`m\ÖÝaï½%ÃmÛ¥%]ÞŽ5•®ïx‰K\Ö³ ¶æ<Å$ŠÄÈΦ˜™¨ Mß4J µÔq™ÀÚÝn·L+*!&¬hOãBàÿí뇻xè;g˜ÙcȰµ·ßÄŒS•â#¨%¦™Ñ¢ŒèCP(@È.øœ³óމ‘•D«óŒXUUUœµ /—Sã"â²$@è»VE×eqÎï Á’%¦¡Y«”*ä ’%fQ!0 Ò…ž ¤–BJl´ª-ÊÈ5—µD$s‹T™™U ¢êM삈 ‚„R«s.ç €ZKR$Pz³ È-”¹ùyQb*¹æT0ˆl ß‚\E¬1>8@º-‡AÅ:GÖ"38kI‰µ¡ Ì̆ÙRÕÊ3ĆÙ;cŒµˆhœ mSj&CBCD*b­K¥ìw;!Ìë¼í{µhÆqÞ ]JÅ1ßí÷qY—8¾{÷þ—O¿lº~'ç\Ž%¥¨ªÌ”–e»Ý®Óµ”bØäÛ¦­"ZJUy^PJ%¢šrŠ™ÖÀ#·ûˆ°EÑj q‘*PAs-ÛÍ–™×eacúa°Ö•Tº¡'D4– 0€h„ÉõÆPbï¼`h<ËÌTÛ¦5ÖÓ¥:笂²1›ÍŽÙJ‘ótí‡nY×Ífˆ1¦\Ö5ïœsU%8»Î  Sßµ!4¥ff¾±?q»Ý^Æq»ß1E$Çó<ïû’˲,̼ºŸ~ùÙ‡f»Û½>¿ªÖÍa[EÇñÚ´=[®·$R¿ÝMó¼ßßå5 €÷¨¢1>~8žŽÏ/oûýÎo€¼w RS"gs¶¤Ü¶Ý<)çínûúvž§ë~g½çyšÇ~è?|÷Ýÿøþûn·ÛöÝÓ/_º®ƒ 9Å,y7lP`ÇЄ&„uœR.hàõõåÃû¯bЍÕy¢l¥(**Ü=Ü=?¿ÜÝ?¬qA)ŒæåÓçýþNQ”i¦Z]—)§ä¼+I-óuœÞÞŽ¨¨€ýÐ/ËœsÝïvL0^GT<ÏÞyM%ëîöûªb¬í𦖛Çß}õ•žß^îîä|Û¡gc§ñ<#vÛá°ß^.cÛµÖ@r6°å\*WÍë**]?,ë* UuYg\)¥¢ÿÿR«¾½¾àñåù2Žë²´mhÚ‘«ÔRd·Û{Àšež·‡m®².KÌÑ€¼¼¼tMs<ïî?ù´ÛïJ)ΙR€Ø¹¡ï©Ä|¹çË•,SN±¤œbÞì¶µ´.ÅXK¹{w—E›®M1vÃf»ÝZ¢q‚l·û­VõÁzc€­ó¶83Mó:M¯oÏ›ÝþñýÇÍÝ6_¯gQÒZS*y5ôëæ‘ÿó×;'H|ØmšDUP ‰˜ˆ Úí%ç3€¤53¡!¼Í|ªÀlÐ:ï]©bFU,9h­b­S­"bŒ¹u¦éêÛÀ@„œó’KÝô=[›âbe¶U«A ·¯¿‚1† .‹±‚µJ7‘¹aJ- Š„,ª… ç˜n¼3BAbB„Š‚Hªµäd é-ÀQP•r¹\½cP% *1+€wn^–”r­¥®5—R²”y\jI1åË岬«ÀmheŒ5„·8KT€™KÎé?"¦ÆˆÈf4l±u€jdk †¦a6ÖyÃÞ0rJHŒl¬3Æ9ÇDè¼UBdcnkÌ8Žw÷÷˼6Î/'c,ÚaœGg­sM)˜KŒ×óxw¸¿•¬³†­ÔÂLRk¬+–Úöíx¾23ªÎËÜ6MZgß4k\½9"üÕ5­·W¢"IjÝnw¥Ö¶í–¸4MsûWgçtëþJ´0†½o BZ×»‡‚k|L‰Ù¬ËÜ6Š0’esÛK£BQ¤Ûÿ*&D¬1Öx³®Ñˆ¹&‘z¸;0›\rÛö†ˆ½É¹盾Í1U‘¾kÇiÊkTД ˆïÃ4MDì}X–å–4—KÛu›Í.×ÂÆ®k ÞÓ8ø†­k컞ŸŸUÔY‚¿^¯Ó<ï?¾wÆÄß¿Ï9Õ‚LÔ´÷n]×¶ëç¸øàóûßÿû¿ýåñá¡m»eYó›ßž.\–Y ÚÐT©!4ãå|½ŽífSka6ŠÐw=³Ùï)—ñzmûoÿò/>~5¾žÒ¸ˆÈýo¿yþòúù‡¿ÿáÏ>~þüöåSURcì×¶ëþòßÿe·Û"®)í·»¿þ寿û‡ßµ}ÛÞmó¼Zgd‰ËM´†Óåªy]ß|½ŒÃa¿Œc©©ë:Éõx¹æ”«Hh›\ ¶¾­kŠßýþ¯—˺Îq]¥”Ðú~è>úôÕ×_9ë™ÙX>ŸO—Ëu; ÈôvùUèÁ&„6å¨ ¾õ*„ˆdÙZ¯¨·c*QEdPFF`¶ìœ#E´ˆ ¢R‹HÑG!׆D@Q[R()*”œ}ó<ߊ4‰˜uµÖeš±JTŠÜ¶×ë‘­5§´ÆE€oôEbP(9""EgÞ€ –mU©¥ÆeUï=*0Þ€ ’ éºy^ ‘˜«VÂXœ%²æva±l,›=´Ö ˆÖÜZ=à¼Ç«õVª0Ð-¿EUZ5ǸÎÑ—J’*›®_— ì†a^çÆé‚„%Æ.4»ÝîíåÅûÆ2^¯'Dm¼[ÖÛ6¤5:k@TjµÆ ³0Q.Ù9/ÌØ4¡äÚõýƒŒçyaa ®Uºi]]ðÖã¬xTê¯1 ÖZŠ òÞß$—€ÊÌÆ9 J"6ø"HÆõC]¦Î‡üeZOÇ·_}¼Œ#2B@¬*ŽÙ°+¹Æ˜R•Ývw¼\¤JÛuË÷ݰ®AR.ÖØúˆÌX$ÖZ,³ñ<_F©Å1©j%2ˆJŠªÈÖ"ÒÍ$¥€d-[¢,Å;[EPn¬qÞ/ËŒH%'o½¤bœÍ9㜷lÜ4MýfPclð!–_ÛH ˆ¬HL·NBR$íºFr!@€**"Õ«Tb*%1¢T¹TEU…j-R«¨"‘ˆ0sJkΙ´ªV‰žnÉ IDATUP%©¥J-µÔ\SÎ×y$¶Î݆¾LÖ„¦iúÎû`Œ1Ž]ð·ýÚ­ËSE¤ÔRJFÐRSJ1—‚ R ‘Òÿ¬`œAE eĶ ©VfrÆÔZ‰I­³Á% %k•Øä”˜Ù0¯ëj˜D+#Ïãu¿?œÏ§¡ßl‡Á»v/Ã0-Rkaë-q*©i›8­l¸kÂ:Ï>p®S\UòáñÝéí As\Ó<ÏÁ¶KN9§à{ësNU`³Ñ9oÇ·ífP¨BPkÝ8MUjÚqž/Ó8l7Þº[+‹¬1Ö,óê}ãœ[–u3 L6æ’c4ÆT©$¥xkæiæ_©«ÈHŠ· Aï-±qÖµms¹œ÷‡CÉ·MÎù°¿Åççׯ…RJÓ´Ï_¾tmÛv]ÊÙYwóºô]×µíÿò¥Z­wÓ4Oóu¿ßcÒ‡Ív>_º¶½¼3lÛ¡SÑ’ÓõzuÆm÷Û—ç§Mßç\Le8lœµæøåÙ{×ömŒ¤Ëx:Ÿë¿úúã¼,µÊv³I)—ZËÍŽ©ª ÆðÝáδ^ª¸ÆYã×iš®GKx=_ú~°ÎL׫ © ‚†®sÎ]ç¬T¨ªP³Š!¶û’S)ÒvMðn¼ÌÞùuÿüOÿ|¹^«êóÓs? Uêv¿+UߎgUI)ãäßm·mÛS°*p®ÎÚóõ²Ùm—eö!ë_ž_¬õã8:çuZË’ÓÐöJ¸Ûo÷›½µnš®Ëy´ÎJ߆¡¦yº^ÇÃ~ÏÈË29G.CŒ"5®µTË\JÚî¶Z¡¦RÆqZÖ˜‹´mÇÁùÍ0žÎqY!•øîÝ}­µª¸àƒ÷¡m@ª*cø¿|{ç¹놦aº!HDT‘ J­ à §K)Ñ;k˜k)Ö¹Z@€oñ9ˆ"":k 9•,"̈†n¤ÌƇ¸¬ç˵E²÷a]“÷þÖ'=Oý°-¹¤X†Í¦Þ2™* Š¥æ[Á€ˆX°ÖšU ‰ŠaB ›×0­ à×b<߯Y¹äÛ$ûÆÛ(¥ÜXüµVD©j­…W©U@@UsÍë­ûÄÞÞXí7ä"²e6–€±¢÷ÞÃÎÁ¯%!dBC$UµVPQT¬U«”Š–„EK©¢R¤k$©I¬s ZID $®U˜Ð˜°,‹5d Þ#bÎÕÝxë´6mXâB묩µ\¯oý㻇£R]ÖÕ2çœk-¢â­»N#zãSŠm—ë(µ†àKJMÓüú(]²„ÐH•еqN„QT³ÖAçy»Û¥”UI]9測q»Ý â§Ÿúðñ£ òšš¦ag–e ¡qÞ)6|ÍÅ;Í‹1ì[b$…ëe\¦QC ‘· kAqls©!„%® à‚Ï%Å9=ÜÝ¿ýý{“ÅZÞ=ÜŽ'Ã&—Òu]\#’åušÇóÕû&t 5~·Í¹æ’ƒ±%××—WÚý~÷òòòÍ7ß¾þ¸*<¾{ÿý¿üÛ~»ãÚ¾÷ÎcK-˼0ѲÌ˼¢AÂ’ËMq¼®«"›ÍZRÛv—ÓÉyß¶>4Íå|ækkm¹^¯ÎšÍ¶/¹2Q\Ó4N¬h˜ažgVÈ%‹(*Óõr&0ݰ ]3ÍS­Š€lM¡m[¬¥¶mÓtÁûpÿpßuÝå|&¥ç—縖]; èõtýøñ£Š¼|ù¢Rú¾C•u÷?þð}×·†mŽiǸ.žùåå¥oÛÛ¸ 6ÆäCSKí‡T_^?Çy´ ’jYÖS\×ñ:îûиÚ·—F4–—eeâ’«µ>ÅØ5MžæñryÜRеæqœsN%•¾Œ5*úöö  ¡iøýæng*Xg-yvˆ *" Šÿ×ý¯Çã[Ûø¸,Îc°Š:çŒA&SkE&&nÚ6.+;F@ã €j­ˆD¿J)×b`YVÍÅyc !äœØ01m·›ç——¡Tq^–nh¬¡ÛYŒ÷·n""#¢ó®äªóº VU"¼MÀ@r© zCE ªTœKŽëzó¼!cD•É  ©óª‚J*ZRžç)•ê|ÓvZºix™Œõñv UA0É0b©•Œ5ŠÀ€* "µä\²f­¥¦”sL¨¤µÔ USÌ·§ QQF*K,’UÓº4!”œ¥Öy¾æœœ *ÎY"bBK”Ka¶Œ* ûûÃÛÛ+iUB)ÉÝæ>Äykú–rŒ)gK† Îól½Ó’ÇËe¿ÙÌã˜Ré:w>MÓˆÊãû‡q¼ÜÝ=\ÇÑxï»\§Íf3Îóv¿—™ˆTª2Ù&Øu‰Šz~{Ûoï¨ÖšRÙïvµÖ”sh[n›´.6„nØ"A\Ö|VA"kùz¹²á`‚Ô8Îc޹:DFäÿ¸‡!bÎiúT*Xc^ގ˼t}·Æ5„&®ëеMhŽÇ7¨Òõ=‡®yzy퇡í;r®ÎsÉÙyÏôëX—©¥Ê°ß€H7´7v –ÑkSL¥ç])e]¦œóeº¶C›c5Æ!™ëuj›¶–*J¥–ÃÝAªÞß?~þòÙÿ»ßüö‡ï†¾ªæ¸.ëKÙîv:ôÍóÓÓa»ÿñû¿õ}o‘^ß^r®–̺,løãÜ®Ì×Ëe|~½>¿ì¶Û×_>ßž»¶ºADØØ®m²”à}ÎkI…‘êùåµ m÷ø€Þ‚‚(@Zãö°C"ËÏÿú—ö~ëú.­Ñ7¡i›À†«ÔÝáðéï?!ÂïÿøÇçÏORÕ{|~)kt.„`o§®õ@¼ÿñ¯ßÛ °F™Îg©ún]V‘ìBÈqY×µÖìœoÚFjƳõ-">¾ûP%‰³}Ócçé ëºJ­ëšœgQ9>=CÛn¸LãápøåËçÃ~?Ž#"…¦aPU®£c›Jn­ïÚ6.K.¹¤$ ëÉšR«·Þùà÷úüb­™§Ù[s¼œéõùµ¤â¼ËµXãµ5—ù2Î1Ž—s)¹6óõ@7ß_̱iËhM°ÆªVÃ@L„°,«”ãºL׳Öz+Ȧ5!SÝ­eôåç/i]â²jª¹”®i±”¼Ì‹q\KeÃ*u8Nç·vè U-%Õœ—u!Dcýv»óMGÖR­¥Š®ëì}Ãÿû7ƒ­€Ì†Bð„P¥jÑÂd™MãÜñ|¹ß%FK„DµÔÛ)ƒ ¥ð. àºÌL$ †h­äìí&ÎHR@D¤ÖÐ4ó<;ç@•˜‰9x<ŸºvpÁ¬Ëb˜¼÷ÌFT‰ŒcEŠ€:f@-µ”5×Z*”úÿã•™‹ÖT’!¾ATJU±ÖBŠ™ø×äÇ9g™‹ÔH_±ª 2B-¹–RªÈ*˜7»óŽ­e¶ˆ„DBtsVã€‰Ò t¢€|‹ñ‘ ÝæºH B ª*qRœ¥ (Z K 9¥˜&VÕr‹€PÒ’JÌ¥BÊ11áåtôΦà<3ª‚d2Ðø RsÓöë-qZ¢(*ˆjNÉ1—œœå&´¹f2œRôÖçœ ß0p\R*RÚ®[§ Í-7@…qžú®O© }¿®K\bèºu]ï¾ýpüòÌt?dÑdŒ/9ÛÆqj‡Ž µÝæóóóÃÝ»Tj¬¥2‡¶ckÖ*¡m,YQDUï”JÀË4e©ZjÓ4Rj*±o{ã¬VYæE×uiBÃL†M®µï‡c×÷Ç——’ëÿð§ °ÌSŠéÆ#Z×U«:ïR*D†I;kí:.Æ›ªjQ€˜sÓ¶ ªZr­*°®«"U‘¶ ÇÓ±ºZDDÖ¸‚Âf7ñ~}hº>¥EŠTÉMß>¿½@•ýÝáöèíl0Ì€úòôô»ßýöíø„€"¥oûñ:bÕÍn#U|ðãùòáÃûuK.ÛaX®ó4M†HEȲ™—¥ï»§§§o¿ýöåíµqÍéøºézPÇy»Ý“¥ÏŸ¿4³ÞcÕ’S*9×Z¯§“%{÷ñYKŽAHJùùûï÷‡RŠLË—ÿÛwÿô{j|ùý×?úDÈë¥Vª1ÏÓô᫯cŽ)Åér/cÃÎ8Žk$bDõÖÖ\¯×³¦T¦%»\§ËéøÍ?þvš—iïï¯O/ËûÃu\ H×´Dt|y’RCJÍÓ¼ m»®«T‰)7Þܦ™â}HËcºœÎçËyhÛéºZ¬µlLNéWG‰wÛíöõøÖ„¦mÚ*u]g"ê7›’ëããcÊIµ¦œ¬åÓù¼Ùn °®kn½ÿê믗¸¬k´Î©ÈÎNó²Ùnº¦ MS×8¯ËÐõªK.]Ó¬ËÚ4ÍšSpÖ[ËÆ,SìÚöýûƘ9>áñ|z~úr:ž¦ËY5í7ÛÃáàZ7^§å:}üæ»ív÷ôò|9_îÉ"¦5ç”?ýü%żÛZÕš§ª"±H-%b­5ÅH†jIÁ5Šz~;·]Çzwø0P5h¬³L|ó™‚sº¾{÷pKNÓÂ̈ "ŠÚzbJ-%%kœóŒ ¹d2ŒÌª P ›\ ²±Eo J"p>Äe6Ö*À¯Ï}Dó<{ï߯økƒˆ¬59e&"ª5ݶ· 7ÓŠÔLˆ¥¼±‚ 3ݠȥJE%­)תƘ\kÌÉ06DBÈHÈ±ŠˆÔ5¥œ3(®9ªoƒoBÓ´Á;"ABf`âZªqn;[‘šK­ÖØ’r*u]Wo½÷Îk‰¬1Ì„ Pn/)õvÜ£j…ËÛ¬1R%§èŒÁ 9'©5§:^/ j+¥TQe6†P«(PIEµ4ÎŽm‰  `5ÖyçbJó4Yoó@°®©–24-T"tlEDA5Å|s>_6ýFQrLÃv»¬©”Ú4ár9o6»ëõÊlT…TµË²nú.Æ¤Š–½ó6¥l)ë’œk5s\ÉÜP®8.Ën·cBkl©Å2K­Æ&bC¥”64ã´xo·ûÃ2Ž5 1µ]cL)9cæuuM(¢@„„€o»bg}ÓvûRrÊiº^»¶ëúîz>å’vû­€¬ëšrvÎ}þùÓt:MÓuè‡R‹µö6%BgÜñôÖ…¦‚ež•qY–ïßÅ%2Ec€ÉÍó„€Óe$CÆð4N‚*˼ŽóòðîÝérÚv×iÚn·çóiÓoާ ªJ‰_~~>Ÿ^[cVɵ„”Öuš¦¶ïõö°¤r™¦~¬ ˼.q}~}þãÿôv<Æßû-!L/G‘~[«3Æz·®Ëf30s\r\æÆ7 ež—ëeÞîê9娆®æâ,纡›ßÞÎãÞ}÷ÍÓ—O»ÝÝó—OÖXߨ~3,˵ž_ß–ƒó»»ÃÃÃÝ´,›ÝæÆâßí÷%ËéíµæúÏúçÿöÿ¿i\ßÁãñøÛ?ý>.Ët½>>>¦uýîۯɠa;OW2Ô6TAƶJ.ßýòó/"RsQ©¥ŠÔê}Só*š6 ûÝv؆®ú¡m×_~^Öi× ÆZ˜¦%¯ñõõuœgßcèîî1®ùüòòðøˆ§Ó+5¡ mãC£5¯óDªè‚« Uе¾Ä´,ëv³iÚÆ0¯óc4Ć ›¦Mq)¹xç@±ÖxBŠ1:g¬7Ë:Õ¢ˆD„ª2Ï‘ˆTUDEĬõ†¨"jQ€”Ë-į5ë¯Ì}t.€Š‚”,ˆ@@¢z[œ# Ý’rùçÄ "¨È¦‚Zcr®)ÕZ²2Cˆlœµ–€Mh¼µŽõüÿÿxz“&Dz$ÍNUïôf6û‘™‘UÕ-%Òþÿ…›ÞPHv³ª»º*"=ÂÝ&o¼£*Ï“X›Á ywPÕï$Ø#rb(%áÞø™ ”¬H‘ÒJEZï³’ZkB.HTY«Œ2ÆîýL…$HÖíÈbF@D‰!Šp×Ô(hŒ®*Àm=°Vû=)9í¼ß4ªœ’ìß§T‚Û2OÎYúÿw ‚f,ÌÂlœ 1° rJi6M¥¡_ç¶î6¿)­s1¥º®@8qnjc’SUUœŠ¡r•VjZÆáÐ{¿ :ëH©×—×ÓÍ‘Èïëº%¥E°kº˜Ëq8n[@°Ö3úèR(²¬›³•"Xç…´©ë:¦|@]?(¥JÉûqlÛ6@2ÖVuM bˆMåõ|·e½»»[¦yóñt8ô‡Ã·ïß›¦3Æ<|x0ÎîhRMT /ÛšSêû‰¡0Ó~¶ÑF•\bŒ¶2ÖTJëƒß6­uæ¼.ëÝý}LɧIãÂ…±Ãáb\×õæî6§Ô¶ ¡ÌËÄ]Ó‡m]:[k¥«¦¹LWMÊ£Çi[9cÜz.™‹N)åŒJ¥µ6u[§’vû«"e”fBBµRÈ¥B­UBÄ-lEŠic*ã4*£5R»¬‘KÉ ‚ PHá>S›sA*%qŠˆ(ŒU刵ÖJ+µ«|¢2Î*¢”DiPJkHk%¤È{Ÿ¼/\\嚺B R¢4i¥R*Š*Af@¤”rÓXfY–µªk$åœãS*ÎidQÊ¿I[7)"M Û² mï·}½­”"Ê9WÎå\ÐU‘*k‚m]—RÒ¶l( ”µUH>øR²"jëz]ÖÊUŠ”ÑfÞ¶¦j´Q)æeÝN7·ÚYfF¥·°ÝÞß#s*ièûyšœ³F©RŠ6V!1‰Rªäœ Wuµ†ÕVÕg ! @ÓT¦rb#B“s–K!¿m;sbY–¦mžŸ_:W/ÛDmÕË·ß¿*­ééñqœ¯MÛ£+M×qÔ{ØB©iž»®Ë)ÝÜßÎÛRÛ*ø€D"bCÀ¦® ð<Íι"jí¬­\UÕÀëËÛ²­Ÿ>†ár¾ÜÜß\ΗÊÕ%¥rNe†õ:O×­êê\Êе¤uô^;BX–åx{º.ÅÄ(US»ºY¦ñ—¿þ%¦ôþú:´í·ççãÐ3óã‡ÇËuì†Ã²ÎÖgpY· AhÕFìš&¬ÞoÛõz­µqCG€ëujš:Í>„M mÛ¼.ë6)%Øë¸HÓ8uÝ@Vi¤yY›¦2ÚÆE„»®wÖ2óx‡¡oÛzžçz誶é‡! §y«œÍÀmß ‡Ãt½´U5ŽW§”&Ê,« ³Ñ¦py{ﺮª\)I+ÅÀ~Û ¤á4 ¬ëºSÏIiœÇéx<àü¶®>}RÎ=<=ÞÜÞŠRë2õýÌMÓØºR?ÿé§oß¾þÓ—uYµQÛºœŽ …hžçî0´m5^¯†t您´sUÓJ.ÛæQ©’2ˆooñüúÞ6M !—Ü4Ìó8n3¢^—íîéq½Îƪ~J))—/?}Y–¥®ÜÛûûåz]ÖÕhg›¦qþí·_Çò¬M×½¿½9k9åœ#ßV¬+9 @.<_çñ<)f©\ ë¼øÍ—ÂÛ6·mÓÖõBˆÁh­~~út½¼ ²õ–JQ‚•sÆêœ“°I¬4âzµU(ZçLJÉÝVQz¿œÊ>˜ÍHD(Äh…@)åR2‘2Ú¤”¸”ü•b"RF© À˲  0`AA¶Î"À¼¬{ ¹Hà‚{)=³äœ9'æ’3! 2)” {D€A@²0 Ö¨´¨´°Hˆ1„Âæ×Mi­”*²ëúšºí¤i¥DöOFAaAaÙã¾"¹”(’Y¡ò)paBQ€¸ ÀD2¡€BÒ¦”B¢ŠƒmI)!EΣ ˜+cµ5Ì%z_[“%Ç5RÉ%¦è¬AÎL𴦢"D¤]ÃR˜•Ö,€(»‹†H—’Jf"ˆ1#€ÒHJ ǃ÷kÉÉX[UU)PÓ6Ó8µ]7O£6PW…Ûv˜¶1fa4(% iBì‡Îo›‘­lÙUî<Žwïã|w§”JÂ]× Q‘rs{{¹\š¶~}}ë»5–á2bÞ ]²Å­o‡ÛÇÇÕûÚÕ)%Ì)oNˆÊ‡ÈˆD ‰êªâ‚%ggMŽ©”ì´>¿]¬1D„DÆhgœ,Ûz½\*W)…š*rDÌJicRŒ%•×ó›1n/T"è˜ *†!Æ8ϋі6žÞÞÞœsû_Çñx{s}}×V]ÇDîžl]áù|¶ÖÖUíã}¸»½½^&fFç\œ¬­¶––eišfžæRR]·ÌC®ëú|¹TMóÛo¿9ã´21ç"Œ‚Ë<Çîno/çwR„™KÜB ÛãǼ„еݴ.Ú˜½ä|󧟬2¯¿ÿa­M뺟tÖe5F+aŸ¼v¶®›û‡»ïÏßš¾·V©°l@¤•Y7_×uÎEJÙáäÖÚqûö°­Ë2Ï%k­¶zš'\—…Ï—·Úš¦ïœ3 àCàyš‡®Õ¨’áGT¨•¶•ë–sö›¯«Š1mÛx”R†™SŒHÊ›RZ¯kÕ··Ÿž|.Áûºk$Å3^ý²lÛÓÓÓ²l¯//uí.ß__¿=‹@Ó·¦® Ç|—÷wC–5íÖ¸b媒2缇ô}w9¿çonnd^–»‡ÛÊZ¥õ鿀H‘0§êÊ®ã5Ç`ŒÍ¥¤˜XŠˆÑnç^ÖÕ9WY¼GRUc­­^ßÞžî×u±ÎåDdº"xûpÛ¶mÓ÷äTw<„”®×ëý§§®m@Ѻú÷××Û‡ûºkßÎïMÝ¢Ëõ‚DZëëû™Õ/Ÿ~¾Î×§j‚¶©YJL\¤¤’‘…KáŒZ­oo"¨Œ¶H„ Iç\ BB•8§˜I)þ‘Nbø»ó„ˆB¹dk­Ö PdÛ6cLá²—†„Y”RÆØcΉˆ1…( QSN¬”2A¤¤‚EJâL@ˆSŒ1qÊ1†"²Ì³"¸ë`€„€ÈjáR A@”ýY!B£tÉ;§™‹°2ÎãꆔFZ+köº5Š°Ù©Á•2J…@J!§•"MF@F‘½~D£•&¥”%R%¥L)…Eœ©Š’V‚`ŒnšÆ¹J4i‚È;ਔ’s±Ú €1¦”‚ଥ½zNJkµ7tê¦Q€€ ™óÐ1GÉ"RBð¹¤"³.…K&”RŠ ¤”š¦Ù5‰³3.”Â"pç_þ‡ÈI IDATÓ?}ýõ·¶ïú¶Ï%¡¨¶íJŒZÙóÛûát¼œ/‡ã!l!prÖ„˜r.u[o›¿»»›ýBÊØÚ¦œÚ®Ï1i«›áÀ%•TžŸ¾ÿÞÖ®©*£uΜJmlŠ©n;S™¦i“÷ÂB £‘TèS)Á‡¦ªŒ2{À;„Ðv½Õ†Œzÿþ:¯ËçOŸæe^×¹í:R$Ä1”vh3Ç~¸®Ó>¬ˆà|¹*¢a8@ÉIëºÖFk­nnOH¸.[ØVc3+gb 9å¾m@óõëסëXäz¹h­ÃLe«¶> Ç—·w«ÕÃÝݺ-1ćû§ÿù/ÿz{{{9Ÿ­¶%f$Ó ‡KL1ç|ssS×õåò~{wSâ’×eéÛ6„8]¯§ãÍê×ÅXûù—Ÿi]懇»uÛ¶i©·-þøúÇÓ§ï/×SS×óõjÛ×õá/_áõí­­ë×÷÷Ÿ?‡?|ü¸† D®ã¨´:ÝÝDNýpŒ)Ãx¹*M~YîïÆé:OsÓu%•œ" ¶}§I Š¼Ì“S n‡÷Ëe8ÖšC\Ó¶ùóûÅ8k4uM _ÿ~ÄG„c…ÊépګƘm^%Ó¸}Žãrû®QZ/g‰%KA”át·Å«µÖ"yóË8¦ûþ`jÛTÕ<Í?ýù—ë劈1nçóùӗϧ‡ÛËõ7¯«J‘±Ö~øéËù:~þË/ó4wM»úmGWY(ÉûÕ(ÍPJŽmÛÍÓuY&«u]×uUeæÈ¥†ñriÚör¾003/ãÂ6^Æ”|Û4ÚÖÆmLÕÔ]Û)À¦ª¦ 1TU DjG[¹½*ãŒçYšº¹hkr§L×·¨´VF[Ýt-hêO‡ççç®í—e¶Öh¥QJÛÖ´ 0¨¿|øÅ*¸¼½¾«,‘u.DŽ1 #¢€8çrŽ9Î%‡HÊ ’(à"€,²KÛí>—9qeuL€sN,°¿JæÂ¬ÕJ)Dµmk)b­¥"©\æ€Y„ s)%3HÉ\XE#  à~!sI …e·çœr)Œ ¨¨”’¹üʈäRP$sE R„‘ ‘€¬¶ÆìUv¥•<8!¥HQ){nmŒÓZ“Ñfï1ƒ”¢Ja@ PÚÎ¥ä„"¥d„ÂPD‚ÚÖu'€¤•ä’S*9Ia)¥(……Y+ƒWÏ+­éï/clμ£41,Rr&R…Y!íŒI9£'þÑa¶Z €÷ÑZ»«ö-\kíCp•‹!Ê4kEmßo>Ìãâœ=‡Ây[Ö |}~k½ß¼6º­«eš»~(¥p)ýpbaä\Œ¶…E„9眹nk­lŒažç›ÓÍë÷g…¨ŒÁ‚"$EÇà  §’sUð‘4¥]U¡V¥ˆ26¦PÕ±FrJÞc ˆ àÓ‡§ÿç¿ÿ·?ýüóå|6Uµ. sQˆ…åîá~§TµSF1¤Ìr{º 1®ë¢Hiƒ¼“¾I]ƹiº÷÷ó¡?pá¡ëÃæA+SÛ¡?NË}ìúþëo_ooN—ë9ÆÔ¶ý.̹\GktÓµ·Ÿ¿¿Ô®1þôÓÏÏ/χá–ÅVÕu™ëC{ýþýp{«‰‚”-n>~¥ªÆ±ˆpnÛfž.×óõøtWbæ}<³«ÍËóóí㉬ËËr¹^ —ǟ꺲J§Õýú0wUû/ÿí¿?>>=ûs<c jõþöc¬ŒM1ÿöÝÕ¶Ör­5ôÃðv~ûò矂_×yöËR¼Žmm×µÓëÛ›€R7··Âå}œ §þÐE~Z.×ËÝÍmU×÷wZ«ïß_ŽC_w-iU» €œ2Ó¶¾¿¿1ÈÝãCŠI)ýýåõáññõå­?ž&¿ŽÇà·¦©\U.m×ÍËÒ5m]wˆ¸,Kɼy_Y«-ë ™ Ô¶RJ£R¹dçœs®nŠcK*Êj­Õ²ú˜BÓ6¥ˆs–KiêÆ©*×ýÇ/Ÿ/×+iÚÖ©mjáý6Ž …$ˆŠe÷*¥”U×yBe™’¨¤øõß~]æÅÏ[ aOä”wÇâ¶lMÝTV—÷Ê£hYfƒ ‰P 0”ÂêçÇŸÑÔ㸆mþ|ßh¢¾kDÀ‡ ¸WØ@[W ¤uÎ>1AAaÌ) €0À3`á½,/(¬´X«ú®}{}®êF„÷¶hɼS]JœƒÖš‰ ÅÌ9îš×}u&R²‘\rÁ"/­.©ä’RŒÁ‡T’°pÎ)Ç]J·ÿXùñ$Äœ¤Jb‘9äT2(Úyå¤5í•"D¥•""Pûè¹HÚ•pÏÑ2f7«XW)m€÷”‘ÖšˆiAÑJi¥D¤!)A cœ1€ÂR²€hD @k 嫪"¢¸„ZDÞ÷û‰ •¶Z#)WU~[Û¶[×5ÆØ·íx½Ä”CЍ5(¥DŠsN„«ªÙÔ{ó¼r®íÚmKMÝÑå<><=®ã”!sÒzç- °ßÖÛ»“­ëïÏÏÃábRœ³©°«lÓ¶çéz8œDd8çi2•kêHÍÓÔ×ýºÌmÝpLÉ{EªiZg–É×M“J6¦RdV¿‘F«ìáx“´Ö«V+W7VÛ”M*¦¸O¤6uõ~>|ü0MsÛö¬2Ó¼>Üß àõ2jm5Û¶i¥´uóºVÖ ‰¤T@Öu³NWM#¨Œ­Ú¦Ù¼ÁCo€óû»suNE“"Âuõ\2‰Håªóë»vFYªm5/ËýÝÝûËåöö~œ¶ÃЗ”qš­ÝOùóæCÓ7Á¿ùápZ·M)U9;^¯{×çt38cKÉ×ó%ÿéËO"𷯻{¼Ï)/ã$9ie®Ï¯ßÿøýãÏŸ!®!Ýo­µç÷sN9ÅPç—åxü‰"Ñ¿þírc·ceb,mm•)ÆœEb*ç9x¿æ° 3hMhX1VZƒ‹BDˆ%§"á~¼cgmÊq@£•¢º©%…¨þÞyÑ[cbŒ¨È{¿W~‰4"¦”sJ¹d,Œ,YrA‘R˜P­I!"3H)¼ÛcbŠ1FŸ–eÉ¥äŤ’óHØO¸Ì¼ƒ€ Þ…™E9g‘â^ÒJ+ÙÓ bŒF"̉… ü½W¼Ë" ””‚DÀEv@‚)RV%»Å`?N9–"¥ä¾m‰Ðok‰ù‡•³‚‚1jgÌî{ˆ6zoTî.bÙ;Óˆ)c+ •s²FgÉÚ˶R´—8‚÷1%æ¼G×´Bkôu¼8׿Û¶ !6M³†°×ñëfŸC¨A „p8È8;ž/}?,óÜ Ý<¯™£º½xùþýÃçÏó8oÉkgöT„Ñ6¦2 C i8ôË´‘R ‰IY×Ôчyã`JH؇¡‹%/ó²?äÆhÌ)7CÃ(®®RJJ+c­³ÆÇ Öhµ3Û²öC¿“@@¼_»¾õ>ÜÜÜj¥Öe&eûãà´^®—Ëåýææ(VëèÃ8N‡á`¬ ) €0Ïó|{ÿ ¬*¥O§Ëù2ó ×T1çeóuÝ(Z›<(„ÊY]¹×¯Ä~ùÏÿ8Í˺.Çãp8ôoo/ιoß¾)$W9.ÙÔZÝ6Íûù½ªëÛ›Ó47w÷%mõº¬ à0 oç—¾émóo/¯ÿéŸÿùõåYie´eÂáx4ÎÔUõúõ»Â†Ãa^VEŠ´ òu§Ãׯ¿ikë®qÖýþõ¦nX˜”ê†aÛÖÏ¿üôÇüíöáîíõÝYs½\´R!„¾”6ýp|}~½½»Ï,~[Àºl€ÐÔõæC;tϯ/Oú¾S†¥ëÚB@Äß~ûíÏþóéþv\æ|<ÞOǾïSww·~™ó.ó|8†cw¾œQpõÛí§ÍñŽc\—U§8ûužÂ RîÇTÊšÂÏúåo¿}å"Á‡¦n/ïçÊYh7ÎS×÷›÷aÛ®ïç’*•‚G!«ÕÖó彪jW4šÚªkšº¤˜J²Ú²¤mžŸî_ž_P¸jêápŒ!äŒJëmÙšºÞ¶5¥thûªrë¶¥—ùZrf.U]o~³Ö^§ñùùwg¬9_¯ ¢•®êk‰P+ €Fk¨Û&¬ +­­ÖÆÈ®»à°-ÖVu]3çóå|½Ž_¾|YçCŠˆx<Aë”@RaTýô$U»¶hõ_ÿõ÷_n‹)ìSҵ诱0TmNITV#%")D£$)Â2‹¨B$RŠ”]ãT8 ¦I©y5je5¡z?ŸKÉÎ:m´öÞ“6"RÚ¶€»‰„!å’r,,Y˜SI1 ï¨ eFãŒR„ŠD@A`8ǘ!Æ”‚O9ÿýº Jáò.O”r.™­Ò1Æëu´ÖŠ#ƒ ¢. Å’Q €8ïò"£@3)-j?b  &ü!ÿf $Î%,~Z¦Õû¦mœµÀ\RtŠP$¦(Â…´¶u]ï[ï˜hš&„€1&…‚;iÙhTŠbŠ•µÛæYæYÄ8·nAJQJZÃ"ÊØ"ìœAD˜–¹kj«”¤’›¦aïý^ÇÑ«ŒÎ%¢BÕ´ýx¹<=~~ýþòøùÓûÛ(ŒÑ?}øä×U)es®ZÖ%¦ÔvÝ¡òaSJq*w·§óyìûf¯ã8içRJZk®\ ®rëÆûû{â4ÍÚ¸ÊÙÊØËåÒ¶mAhêÚ§p™.­kÛ¦Î+S½¾¿~þòñëo¿ßÞÞ®Þ/ëz<ݬKÐÖ!Ò4^EQÕ4Ê/—ºnïïïI;Ç…·Í;[ÕÆœÏ…Ðv‡"6Ê~xzò> R9gg\)¹m‡u]ïŸâê}ð¸m¾ï;.R:×ëõ:MÇ¡ïªöz=OËl”ºz Á_.—ª®bI7§SŠér¹’JÓvã4ÿ¯ùW¥µ”b-P‰Âæ—u±¨.Ï/ÕÐäŒqÆØË4 ‡£þío}] ÃëËËp8¡q¿ü—~{V"Ëê+¥ÐÙëóëátŸ_­µHXWýp<*Mãõ:¯3'&£›ª©Û¦q®*Ë\Öeê‡Î¾¾œëºŽÇ°®)ef úíí­ï»¿ýöÛ_þñß.ãÓý!¥Ì% —”²ß6ãÜõí½ëÚóû›d¹9‚÷)§ª­IqÕ¶2óËû5rJijd.!­3„d "ªBbˆ´b·@)8Æœ Áe'!+2Î``ÈYkB€R8xŸcBílÊ)†9 ’¦,‚@D²{E!‰ü8X2aÙA¢11æ˜2ÑD¢0gP¨öÉÌ”S‘}-¹”’3†B)ìcÁœXra.E#1£1´C’w°ÕV •Œ,Z‘ Šì:⌥"*½§Å@˜wH)3óÝûÐFYE”2ÇÓîÃM ”Ö®®¬sÖ()@¶Â,¥h ýãÕ•cA=š›sŸ’ÒÆc£ß´2„*s¤°m®ªBXA!æ°qæ"B@{H KáþÐŔڦFµÍÑÕUíÜÞ¸9¿?¯\=ôýëõüpw}¿jk9•¦­/—‘€ªÚã( >¼½¼©ª®³”m[ïîRŒMßCݶÑûÆÕÓ:"±6ÛÚwߢp.);£çi©ÛªìÒH9€R ‰`É¥î2 Y ³q•”’Û¶[æ9æ¼ÿgUÓtãuÂ¥ªªóûåx:=¿¼ÝÞ>^Æëq8ú><®Ûæ*ws{‹ Ï—‹1F£•Ö¹”®ï.ãèêJkS˜¥pN I]¦‹V¶ºüç/_.—³ˆ,ëjŒmëÆû¥ˆ´Çãår>9¤Ë<÷}{>ŸkSÿþí”ÒýÝÝŸþôó¿ÿúïëºzïSÊ×÷ËýÝÝå:Nã4/óËËËÍñöññašç\ÛTãujš¦¯ûÓãÝüϯ«úîéa¿g×U%À©$(E1kÖi¶¶2•»\ÆÓéÀ(¦àëÛ«mªë4ýõ¯}y{í\űÄX MêñŸ~™ßßq>_§ñšs®[www_UÎ{—U„ï—yþõ·_îoçéRJYÖ9n~wêÖuåý6t}*ܵ&D¿ù’rL)¬AP¶mµFs¿Nó23€ÖfÝÖ»ÇÇÓÃÝóßkç^Ÿ¿ €´}«•N)9c9礕.Ì,b”)¥Xg*kýæcI­u¤UôQ]Unç›Óiœf„’³ÖæýÛ³un½œé÷ËåþéÑoÞ˜ªÄüíß~£¶rÖ˜ºn»NJF‘Ëå’¢g‘»»Føõß½¿¿'Ä 1ËËó‹3Æ/¾®,‰ÀNó%½m[IyÝÖãñp~{÷!äÂÆiçªóùì\Hˆº¤¸®KÉÑÏó¶®óåjü–JŠŠ¨0·u]rÉ)rÌÓ4•œ­Pƒ³®i­uÉüððpº=Å\²ðñpÄo|!‹pU7²oþòñÏœ £Â®îbqÿǯ—˜ó}W,fJ™+]XK„"È ŠÂ½·‹ J!"ìv!Æ" ÄYšJNÑšŒµvÛ‚ßRöQúà·Å¯" 9¥K.RI…¹@dÙœB °0"²€y.!F.ÂB\H3…„¨9KL’cfIE÷MD €"Œˆ ÔYB…%ó.)df$fEH‚J+BPD¸&ÜÁÿ ÑZ)Ùû±œw;¢1€ FAdàÌ)G@@­qÎ*£#Eœ‹Ñ»å>‚R•1ˆXWͼ, q/¥”œµ™E›Ý ¬­uX„³@æ’Jr®N)”¤Լ,>xFATÆi ÒÚì׬O?nëV5uˆáöæ&ær{s³ßŠ óÍÝÝËÛ«¶¦iÎÅ:÷Çï|ùéËùzmªjÝÖÅoÌ|:–uÑμ½¾µm¼ïÚ•šæ)§\WÕº® ‚ ‡¡_üê×U#’ÖÆE:§(,R²R„GÞ#×Ñ9g­êj[Wg66û€ÂÚVã4ßÝÜÄA´RFë½Íc¬µZ.JÓâWcªë<ßÝÞ½½_º¦únó«Ò¤É°”m ‡Ã0cU7ïoïÚ˜CUU~ÛúãaÛüét\ÆåßoÛ.Ĩ•ò!‚pÊeš|×7Þ{qÆT®JÞûmCA£s1F}ýý¿þò×u^bŠ_~þsÝ6Óu¯×××÷e^žk×ÜÜÝŽ×ëéî¶ê›aèúnXæe™'C]U¹lκªébÊŒÒ÷ýëËÛ6ŽãåâºfÙæÊ¹ÊZÂýÓãõíMH5Cë×XÕNr®úöøéáÛ¿þiý×_þ¼m@~úå^¿}«êîr½iƒ–Š~]»¦‰) È4/ue´µÎºâétìûÞ/kÊ Yj[»Ê=>=­ëb\E¤‘„´^–E+µ_×UðÞVíápôÛ\›¶j«Ê{\,b Y+¥µrU m[C,¹äû‡‡·×WcLÛ´œy™Öºkœ1¶uÓºLˆd¬Q¨çþö†Pm1hç”Ò!f¥T A¤Ä¤ëÛ®mÆËµ+«‡£nìešoï8Ó¶Ï?y=_ŽÇƒ¬ÛÖ¶mܶn µïog«‡Ë4aÝw¯ï¯C?ô]ϧi<ôƒ1z™F6«•Õ¶®jè‡cÓ´!l!¦a‘µ&Åcô>Fï+çX˜¸ü˜oWÚä\6¿yJÎ×ë{Œû¾Ç 2MSJ9,ÛÛÛËÛûû¿5mˆmÛ”’áxŒ±°®«³µµ.•¨ˆXÄÖn]}Š9¥Ø8ˆýáp~{Ú‰¼÷Ö¹¦i^^_Á(ktJI}ìú¶mI©\¤iÛqœ2ÃýýMÎòv~?nc¡¤\rUWÆïýæý¼­Â¬´RÊ(¢®i¯—KJéts‘mÛú¡.)ÄœRQaÉÌ„b¸¿¿ßü¶ècþù§/ûíoÃÍQXŒ1ûú[[7§Óéééáû÷ïÏß¾7u¶­›6”CÊ%œŽÇq¼ bÚ¼VfZ.<ž¯Î¹îТótµF5§sMÛ^ßß«®šŸ¯%ÅʸºjJakmæ’yÙ¼1¥œKÎ%ùô>žïoîÖm­ÛFDâ´IæìSUW’Kò¡pA¤àý0 H´¬óüx¹2 béÚ6†à·‰‚ÆÙe^r)]Û8c¯çK1¥·Õ«H‰àq8ä”cF+kmŒ>ædº®d®*‡±”RPp¼^†þ˜K±u­­ÑŠrÈà½7ÆAÉuUÏÛ: úÌ*§Ü÷½ˆ(CË2 ÀõzíÛιºª­­^/×OŸ>6m„Ó¼üåÏš–cÓ4õiøôåÓÿø_ÿŽ"F©üÎ/ ¢Ëù @ÇãÑÖ®0TÆÍ›ÇñˇÆXB]7!†qž›¦95®RZWõ‡Câüòüâ×…¥lë’Sz||$0Z[cßß_ g§,0°äÂ0œŒQ9'`+S9£”ÞüFŠêºêÚ.§¼'E•¶‡Ó)ÆØ´½0@–Ëõ\WNïÜ3­‡ã1‡SRÿÛþ/×ëhŒI¥8«ƒ¤Ýýí-·§ÿë;ÿï¿mß_ÈÕ\rB9H1 PV.œ#!kf±Éà*f#¬rÒY•H%1K¦¡$ŒY…L!KNe ŒE3ОF²¨vÕqèDðþþBZU¶Úš\„v²'Š€ *.Â, ñžwG`”cÉEÆuaÀ”vò'ˆ²N éÂ’J*© ¨’‘X+Â!2‹F („ȹ€‹ˆïGu""»ÛšA ÿØ®€§¼?ü‚,…@ýø•L@R˜Y˜P)M¸O‚*%SI´O›[“ a* ´"áœò^I3Ö‚€"½Þ ³Öz‹Zæ™÷wDB-P®Ódˆr))%ïWRF»¿ß´ÖdÖ„,"‡f1c÷Ѓ d–ªjvnÜ6¥•÷Þ}¹\«ºÊ!nÛ¶®¾mÛœ3j©lEúG"D1Š1ZXæyz¼\æÉ8R´±ë:9e8ç¸mm?øu+𬳹0i Â1d­i]½BnÛއ͹j ¡d®k'ˆÇãq !çl­™Çign ¢ˆ¬óœsn\… $—išO·÷ 4Ž‘Þ–ùîésQ¨]U{ïSŽ7w;Ê-ÆÐt}Œq85Èåý<óº.X·íûåüééӼ̈b0ÖvícRÈÀÀÌ®ª4Ѻ¦i­ IDATùmöi ó²Ü?ޯ˒YÄÇu[‘çS^o”®ëÆhCÖDf[”§Ó1†p{¼¹\Ï>¬œ‹­ª¾?Vέׅ×mã>ù¢ SˆÀœ“/›¿¼¿¦Rš¾!P~]ý*k^¾?C’y›µ6mS÷}ïCk¬]%%§äƒä2ŽSUWŸ>.óuGWUUS;gÇiòËv<¶ÿá/­ÃæSŒ!Eþÿxz“^Û²5=ë+F5«Uîâ'θE8ÓéÄÈ4,! ‰-w,D‡¢C‹®?„.}$D'™`œÎÌ›¾÷Fuê½÷ªg5êAc…Y¿`iM­9Çü¾÷}ægw÷S?””µÒÆh¡¤¨*DPZ- VÆq<žVë.º6• 9ãt¹\ºnAD>DÈ©?]fksNÃ8ÖMC$–Z©¼óÑ_rZu‹Ç§§årYéªH’ÞÎÛ››OÖú›íM×tûý£6UÓ-›íŠSLûãqG)…ÑMt>Dçf‹ ›Õ’€›õå4±¬T[·ÆÉŸ'{í*+£½ó4UãØµ«Ù:[™Øhi„rÖ*Ñ9;ϵ®.ãÈ,îîïÐYêºzûæíßÿÁN¾Rꛆ¦y6Z Öß|óÍù|b¦åã§Oý0xçŒ19gkýµAUW N!c¯¥²Ök¥Ëκs^.Rë~˜HBðþÿ'?¾ù »n¹Y­Ï}_|LJèz½ioî,Üüë÷á_šÞ?Æ‹%€)Œq VÌ>æKÉVJ$*Ê4E›Ø4Ip 1•”ü”¼…4‡èC±9—¦1 ‘˜³™X@‘€K¤\X’Ôf½^wuM(XjÉ…ºf!ˆ²$d&ÌD “‘L ¡ +Å’HêëP*!¤ª•4µR̈¦©¤ £ÒFÖ)…J)Œ„× Åâ €”‹@Â+̈2—œ®{ä‚ @IþKÒÙœdЬ!Åå³`„s†œ±äDÈDDÌ€t`„‘¹©jS©bI‘„`ÄŸq=„©Ñu'_1§L(SŠ„X J2Þ‡¦©¼÷€Ä„.øsŠ „0 ”“‘Z()‰ 1Q)H€1fvscÚ˜³*çËõA%Rе1>„”6<{þ,żÙ,w»#¤2;»ìºþr1uÓýöæÖY×Öõ8Ž1gÉr¹Zöcß6íÔÏ’)8ÇÈ>%Ù:««ÚM##2"Ä뺉Á )‰È9'¥ò!c9¥¨k“|&,±Äœ "+©¼sP ]=”.„JëÓùlŒ§Ñy/•¨k3 g¢Jº:4 £u‚ØŸÎõrÁJºqJŘSʦÖÁFµY¯ß¿}'¥±ÎÖ]­Ûloú~0F×Uu9]–‹.—Ü4uò!Oˆ¦ªöÅåt<]úûûÛÕö vO¿ü{ïð¸ÛÞlµ–ã8¹à¿ùÝ7¿ùúëÃî)–dûñf³~øôišæ»ÛÛyšWÛÍáá FlZǘRΌؘêüôôöûŸ$óv»qÎÚi®ë¡@¦mµ4,Ä<Ϩ¦m Çœ‚©«a_|þúx8°äaœV›MÓ¶À¸\®´Ñ—þ2^N9¦óé„„Z*Á¬kãƒEäfÑ|øð‰¶ëõþpX.ó8ºÙÆ”X0øà+A"€’ì캶ÀÇO/^¾ìû‹VrÑuOMÛ0s]×}ß )cÎ7/îñåxÔ¦ªLUµMaB`k}]™ë¬”…˜ÜLR±’Á»àü4ͧñ 0²ŒsÓl—«5K†”­ -¡0F£Àóñ|*V›×õhgV …„€ÚÔÖNÀBJ¥ÿðÝw,¨«[–&•<ãá|X,—LPsØísAÈ©2Æ[[Õµ·vt¡g´X¯¬÷‹nÑFïßüøæîfûüöÙØ‡ÃÞÎ6å2Ï“BJ €Dôõ×_ÿ^Oéæææþ憘½MS‘ Á,¥êÇɹ°\­ÚºêÇ)8O„$dÝÖçÓ©ïûõje­ý™0†Èÿý?ûoþÍß|“ \'¼€`Swªn±ÝlÚg¿/¾øÅï÷ë¿»À·î÷‡dK5fsl¶“ÜÃ4ì¼íC™ÇSéœÇÙBq>RŠ!ø<»äm:?žÃ4C˜C¢œÀȺ҂dÍRˆXD•dªÉl@Õ¬µ"”HHD8gH™3¡+èC*€  Í$P)–’¥¢« R¹¦ü)Ë"IVZÖumê®jjeZeºÌbšFÆÂLL²”ŒŒ‘ñç~J0³`dPr"ÁÀH)$0Z_駈!„ŸeÊ)fB9]Ù,X²1yÈE±J)m8å”]bbfB•’*£ !2*©Ð;;{¼ó>‰ë ®@I)03#†¢u‚©ïûŸ_»¤Ê¬”üÙ}"­s‚É/Y†K¥Œ÷s]7ýк®&{eó¹¤R1E<¦‚Ýr™JÜÜlÏç^Vfssóô¸o›ÖZÛݬÆ~Ô•¾&)›¦ÙöËÅÒ:çÝ í䉱éÚÃØR«ºÒó<È„ÐÔõ~¿×R¦©ëº‡µ6IJªLŒ…æ®â\Åò*ËtÖjc¤äè¼ïº®®ª‡‡OZªF›¾ïµÑŠD޹O]ÕÆ”G;-‹qXÈ‚Q!ÏÓJÉ9 f"VBÊÙÏåõë×‡Ó K~öÅË›ç/øþ‡Å¢e"rÖÆÜ<'¥’§ã¹¤DH‹®5¦>WÔ¶õÖYWiÝnoÆóY0ÝÞÜ÷ýpwwÛÖÍñrf¢ýaß-—m׎ýK¶“œS‚‘hžæqžž}ö²k«Ã餥^TÍiº¬–Ë»g·ýå,¥\ÜnKŠö<õ—¾2 ÌD@ЭZUëãxé77Ûit›åÊÎ_–H0㨤Ñúðáqè{ŠYiy9_ŒRª29–~œïŸß1+c»Y™¦mWëê]ì‡Ãóç/ÇËp{s{ü´SRÍÃ$@ˆœ‚”:†p-µ !0”´XvûÃAH‚T6ÛTúÓ§ëím/Ó¢kSÌÝj¥´±ól½“‚óáx&¦›ííûË¥RJ(N©éšªª€´Q»ãáÕ«ÏÇ#2je*Syçüì‹RÊÍ6礕–B¡)—àB ®ä,„L!j£‡aô1(Y}ù寊U]I)®kL#ÕÔ_9¥äÕR!¤qÇãlmeLU5«õúi¿S.¸ÓùÄHº2ýeØïŸ¾xõ…©*ÓÔuÓ={y?ÍSÓÖÎG¥t)…ˆ‹…sމX¥´s0‰kz\+©µÆqö¡2µÖêr>9çJLM×]g˜WcÕ~wTJò¿øŸÿ§7ß¿ýôxŒ)\óÄìlVÚDŸ •ÏàR.”jAÛ{¼ù¥ÚüÑ'ñÅ®~³ëÞ<òŸÜ‡<ÿt4O¡}Šà Ÿ©S ^×V©‚’žÇâR€ÂÈÌY:†!•‡!Ÿ§i§á¼qzŠqzû.æX˜Ñ(¢BL")9Á(u$AÈÊÔmÛ )„T>%Ê9—SN%•ˆóµ²+J¾fó™ˆ%£”¤”PJUUݳÔÕ&%Ç‹µÖŽC®@éºçSp9øTŠ”‚®E¶|Ø”r n"ÐU€¯¥RJB*‘1úHH9¦K.ÁBÂru·”ÄB”‚Å•e-$3sS·>„œsZ5]µÝnŠw–ˆ„L”3 ©Y\ñ‹Âγng%%KÁ,L”RN)ùàÓÏu¸”s&Bc*$tÍeA)¥k»yžÏýR!€å|¾,WË~š¶„ÌRܬ·—¾O)9çÛ¶!"Aü´ß#B¥ëËùRUuÉ`Ç%3cHÁh­›f¿{ÂT–Ý hmR •2nÖ×ß ¦¨Œ(κ¢®*&1„åj…ã8l×+k]Ó4.¥˜R ¡jj)EÈ™I°ªŒwNJ!g›„WŸ{U™óá䦹ÒUU™Ëe0U¥*=ÚÙŽÓb½aÉûÝ®m+ʀĥ¤TŠÒW|éSÓ´BHˆ¥œŽ‡ÚT±SWãl+£&¢wM]±Ã0v]ÓŸOÌlŒêºÅ¥¿)º¦ !O—Ãñp]b€b¸ ï?6MCÀ×>ÇÇÿøþèÓã§”½DQ×µd.XÜì­wL¨´’’7÷·³u%\M¨…™”RÇÃ!×Ôu)l¬šöô´OÑg¢\2J!˜2”i/ÇÓb±d¢¡¿Av¶”‚— sÁìÓz½9O›õjž¦årå½ç©éÚ1ø—Ÿ½Ì€×d‘”FUÆÏ®ÄÄ€w·Ûw?½{ûîÍÝÍþÊùY®¹ïdAçÓe÷øÈÄý8’‚øÅ_ŒÃ€|ðuÓNvÞn6Hˆ9ÏýEjU®•#äCÓv]Ó–œ3@ô~u»‰) £*­ ¢â|êûK×vUSå”}ÌP°],&7Ï“].ºLÅ£Ô"ç,•JÁ甉Ä4OË›U‰ñ:£¾Šf—í¿{Ø™ª™ç™‰p§Ëù ¥Ôm«” )é»õx8µ]gŒ¹ô}¬ëªm[­5"(©»e7MSÎYiÅDZ$ÒµPU3‡¹j꺪ûá´{ÜUUcd…HÃùüñÓ'cŒÖ:„cL! %t?ŒMcˆÑù” 4Uc*-„ &?[ç³8÷–¢iüµszµûò¿ø_þ×;|ûišQ 9CH)òlJ±PISÖ,°dRBHÆõݾ’¯þ¸¾ùûåÙŸËçOaùö„ß~Lû4|û>þnŸ¿ýè~|ò?êÝIM²ìB8§Ô“ࣔ”sX¼胳?õê‡Óð8ãÇOñéÉ]ãÇ»ïã›]þ«žþßwýo¿=|÷áøwoøýû'›»Á…1ÄÍBK†ÆÈV‰ÊÈN³QX1-õ}£îZ¹j•쌅‘‰(¸ùiž/§½.—óå|ÞÙRí¦úc𶪪ÊTBbNÁ#`Ι˜sLDÄÀ1w.•W%q‚CŒ!GH!Å Ì93ð]R ‘‘’µ2B ÄÀ9f¡$ %XêÉÎ%§\K™Sªš&ØPJrÞ³ ʃsW•MLÙÚ9Å µ,$sL™é*ø,9ç’S†CRJ^uÛ^'i`µ^â»ßÿáþÙ]É©íÖPr×-¬µJ©ºªbÖ{¥ä0ÍËÕjœzmd­Íy1x¿ÜlRÊ@¤Œ~:J.Ýjéc(—ãy¹è¦i¾š¤‚÷•Ñ“µ@PRH…Š`!•Òéç&vøðîýó—Ï b™æ©mZ)õ8ŽmÛBL…PHJ¹"!DΉ˜µ”vœQ”äýÔÀT„!F;ÍûÝ!çÔ-:\ Ï6Tu³\´KJ¥”bí\Wu.)ä8ŽCUÕÎZ%Å8ÍUUSMý@@ó4I%K*ËÕj¹Zçvtm´Rý00£1*¦ìC¤ºªÎ—³ òîz ÈðüÙ³b³êL]½xù¹ü´ÛмÑf·ß§˜V‹ÕÛwïMƒ$½··÷J+‚1Zëêí›·ý0­W$1攎»ªÒmWÓÔ¶m)9rÊsnÛ ¬77.&Ýz³î‡Ùãñpøì³—çËXLmH)—ÒbQ cJÎýe˜Æ‘rÉ%j­r*³ûËå¿ø*8{î{¥xÙ­¼³‚Äi·»ì}?‡é|$÷»cÁ²Z¬MÛ^qfWÏ+b¦Õ¢sý¸Þnëõ4[®6&CN¥¤˜J¶n‡¡ï‡­ïï„Ös/_…Q…J°ÞE9ÅtÕÏ‘®jo7[¡5"ÚÉ…àcˆxw§YÄ÷»ÝËן» q|z²Ö. !ee”PòéáqœÇÛÍŠ –0Ûiœ¼³7Û[@®šºª*ç= !˜I2IAZé4ŽÁÙyûáÒÖóA)£# !Tˆ!†¨µVB¤ ä\Š1’Yµ]×¶sé À æÝáPr1•†‚mÛ Ñ0 Rʪª´R“›ÑBpJ‘Y.Ú…÷¾ï/,Ù9‡HŒP7&¥ÌÄÁù˜SS5ÁŘR`d¡—ëÿðŸüÃdÿ·ÿýÿúæû·Î»ZJ‚”R¥ZÊ&B$Ÿ=…‚1-R™D*øv©ïW}]€»¯¥Ê!MÓ%—ÚÙÛý´¸ÓÇŸ~˜d¦a¯ —v‡K 䕾ËêUõôq@B„‹FYJrP Öp3A­{¥mk¿{R3ÈFRà P‘A]Ù1yP-È% q p„’jæ/ŸEéëçë_±Xƒ]¶ë”\A1M—ƒ®ï—~8 TRÉ”r Á†Â™ˆICŠÙzwmxYSŠ)K…ˆ1ǘK)!ÖŒˆµ@(AW*Æ"Y„ˆ™RJ` d¬´Ù¬——aŠÖ]NG\o2€îªùrA"ä‚L1Fʉ˜@ …åÊÙ+Èl§ItÝõͮɢT ""’0*–"eUé31ªiè?ÿü‹»çOU³ˆÞK–¹ˆ!ôì·ªëVÃ8Y 9ÅÜ5‹±·C™¥”\U@¸ßï7Ûíþñ©k[ÌR®t5Os·h?½{Àº.æyÖZ—RæiÖÆ8ëažg R•>õýšH !nonÿÍ_þ?_¾þ"¸‰ëJ’H1 -¥”Þ¹ƒ®*(œË1ÞÜßYÀÉ[jº:¤ÀJe‚eÓO'­+Óµ’Ù×´í4ÌÔàr¹ð‡}Ù§º¾dìl™)$ßTaší׿¾{óî”jss›¢(UU“/^}öáÃ'%ÕRóä>üøc²ñ«¿ÿõy "<ïŽJÉ©”3@Yv ïsJ±mZDz|||ÿტéZÓhŸý¢kö¸Ýv!ïC×´oß¿û÷þôvm³]oÇÝè-–d´ªŒ‚Êj¹Š9ýþÛß½þâË_|ùåÃã‡T™ã~gê*CñÎÆ7›»‡Ý§e·ìº•õîôþÔ4W4‡í³gvìË  •Ì”ÐÎväÝú|:m67?=Þ>»C(ÇÃé¼ßñêõáp¨Lc­qÿü÷øîŸ¾9nÎMW'àÓãƒÒF+EJ#ÂrѽVìc8ŸÏm×µ‹Ž¥|:_ñ*ÌýźYKýþýû_}ýkmªè}értqç!õ¯¿øb˜cª¦î¦þâ‡)úÀ©<¾Û6ºœ‡g n IRºÙ嘞޿Ë»Ï?sÓ,´Ü¬Ö—apÞ§”ÆqR˜ÚøÑþøÛo|-á«×¯ß½}¯”ÊÁ ­F_Ž'!©ß9–bÝÜö«¯¾”Ò`ˆ§ãyu›•ÒPR>ͳFßÔõuÙsÿ|ùô¸†i¹Y¡„W´bI!zcrRê¢RÒ‡Ô}W·,$>>>.—ËÕjõò³Ï>~ø`½o—úžˆ¼÷×jd ñÎŒ\RaÌÖYc 3aAB*)]©0UE3Ì’…8œNZškQ€$ $†ÅíöÿÓÑ&ñüËß~œ¬#IâJ€2ôBYhBV¡è\(#‘÷2g„u­²÷R"bu×ûPÚ틈YÕ_~U-ž¦¡{ñ§:ç"`S·e SòBêð¦ª*lûþxk÷«g÷LJá|œhu3íu£Õváƒ'Yþ,¿Ø¦Y°ôsÔ±,Vê²;-µÉmӃݗMlÒƒªVy~øJugæÉ}U*Q ©¾ªö5xŸK‘TP=O¾ø9 ³>O£‹S¨RÈ1 ö™¥betÓr)Q™s)!SÎ,å1aŒá*d€”¢”Ò‡(°€`QW5Ñu¯LÀ‹BDL©T¦qÞ!¡Vì½—¬½÷9$ Þ£ÕþpðÖO— ´mÎ?W=-ÖK"C‘²Vl{»¾Ùvãù‚‚0¦XJÅö8ÝÞo+S=>=c¿\,›ízêaBæQ(¹ª¤¬ôãñ©nÓVÓ8û³ÿüå«ËA=ÿüsk-´M3#ŽsI¥¸ô—E·Χ|¥Õì‚$aK¬»V-Ú¦éõÛ·?Õ˸è¥_¯ø‡¾—Z ¡äiG„‚ÀJëóñt‚”•V,Ä4Œ]Ó”\˜ÐT:år§çÏž }_röÎù˜êª%šuU{çSŒX`½]ÀÓã§cN%xÚã4Že¹"ÉuÓ¤”œs»Ýî³ç/^~ùÙŸÿË?ýÕ/»vÑuui:Ž;û¤µ.Çç_¼¢ßýø Ê9ç”êª)uÙŽFk„r÷Ü{ûÝ÷o‰ív[›†%:›¦"$!²*¥xﯰïœRªªªãñØ4õ꺽þlÿþ1$ÐU-ÞRFÞÞÜõý¹?]ÛÚÉ>{þìýÇ_ÿú7¿ý»ß~¦_,‹Ífüñ’ƒË¡Ä±PtéíOo×÷÷E0ÐR ýq¿{\ÞݾúÅWoß­—ke$Qwõ8 †e°Ž˜˜ùñãão¾þÕ8ÙóñbÜÞÞ q·XðÐ÷u×,ÚU „˜ÚºnÛV0÷ã˜m<ïö÷ÏŸ¥(úqK‘ ™¦ εMûø¸Ã‚ÁηÛíñ|6UíSÀ%SŵRÊhD*Dï?¼{ý‹_`*!úÓîôŠa1Z„›í6‡ôøéýz½ºôÃr¹¨ëÚY'©Ú¦äR><~š†áų»à£T‚%1ËårÕ6í0²PAÂtÍåxœÏóáxB,—˧Ç',¨´ðƒ—RJ)SÊ}?®W²]µÚh­Mñ|¬ •Ñ?~öÙ‹RÈ™C 6æ¦]”Å‹õ‹ÝÓÓ0Œ"ÚÙ¾ÿö/þÕßþÙ_þõ7ß½™&ëB6uçSqѤc2[ÞýwPÐA‚*A˜.nÄ J‰HIƒ|Õ}€ä”¡Ä\Jž­•J©­µˆ µR&)•BTbòÞIÉBH$,œ·R««¯•¥¸>Šs‘¢OJ˜&$ö)1øèiL9†¼‡’sŠ%“PŠ…Þ;„, Dˆ9BI’}H‚™vyyÝ IDAT(‹BJaÎRH@n«f¶³’"”"•nºöÒÏ.&Fl»îý›w‹EWÕõþpäe·¾s./_ènÑC_­]Wã¹ßÞÜì÷»Åª%¦KßANiš†iž·ËMSWF«qšbIËåj÷øØ-VÉ„2N¶[´ZJç½d.— àýÌRW]=ÛÇóét³Ý–˜ÆþpruµèÚ§Ããj½‰!";넱„¦n§i`Dœ` µÑ9%çüb±¸œ/!FÅb÷éQ ¥ˆ3ÀÓᨵš‡ JI13e„œ¢%¡R)&Œà'ÿ8~|ùòÅÛ7o€°®ªÕfS…!†§§'Áôý7ß|öê³åÍúõë×UÛuuÕ4Í~¿[tŒÓØ6í<ŽÖy åW¿üòÛïDçÓ‘™y‡›õ¶mšãùòò³ó× ˆ›Í–êr´®Îç“’ZIpã¸Ú.¿ùÝ·¯>u¹\´‘ïßýÔ6Ýù|ç©.åiw(1Ÿ½2¥,ÁwÛ•ËQ7UM³¼ßÚsRúi½^½ÿÞÎVj%r]YçV›ÍîáÉ{Ï&DÙšÓù°\·š¥nœzs‘³¥”Ó4mnïsˆXðÓÛ÷7«õ‡÷·ÛÍùpV‹¤Ô§yVJµË–¤”L>‘æ‰-T7Fk½ØV»ãöfÓ÷ƒdy>a¹Ö¦.çi¾ÿìsŸp˜fŸÝ—_}eV]é³àÅv½ßïw‡ã4Ûõí6ŽN ÖRœ‡Åªq.Øy‚­s£Aªº©K,꺞ì@ˆ,ÄööfÆB>oïî~zûSÛt“µ«Õ–%w]ޱô—oÏç÷!õý¹]t„Ì«¶]-^½ú"†0 ýþé)ßܱÈ@…1ڨɋå"—,*‰…|ŒÅ%;;Ê}>¦èlÝÖS?˜küÑZëœ3ÆœÏg`½›¦Î™ªºªëzÇa®(âÅ¢ ÁŸÎs­õîñ©ÖUUWÓ4c¡ÊÔÑG"ô9ž/Ÿór¹àÿñ¿ûço~û7ÿçŸýÕßüÛïÎÇ!±÷Ñ»ÈD¶ˆÚþ៬ÞD‚)VCÈP`ÎÉSˆ Q-$wv.&…‚lÊ>˹h‡*pc¹›¹™‰û¤Æ\õ¹ëA[Z÷Øœ¡=åf—«}iØhÝÇÕh«K.gŒ«RšjaÆà€Ph1Æù8ÛI"Y´Ò„  R 2Z^†Q+dd’b .9›b–,¤Y”B1E?§à ÃÀÙ! A"zwn *é+•4åB˜\Še¼œ½ ’‰€º¦!â”JˆÁÅ3)¥„Š…’r¶cUÕX !ʼnP+¥”*s‚«NàúùÿM5B2+éM1»Ù 1Å«n4øhgr,HRŠ¥`J¡¤¼/¥¤CÊ!ùX²sþ — Fg]*9”ktÕ§„  ’HsÉXš¦ÅÂÉÇÊ4Mˆl*Óõ»‰q¶•©R.!y­µ&¡¤Öu&`ÄP0§t»Ý¼}ûîÅ‹)–âêK0Ò\.gbF @¸zz3„,B€2[ûâù‹Óq¯›ŒÒBKç¬RU ©©Í4NMÝ)©| 1¥T²w>§Ø¶ƒ2ÒûX×M* JÉ)@%ål­ÖšˆRÊ AÎó<+­c nžter‰RiÀ,…H»OUU…©[.RJ`¼\ªªÂœ éã‡w%CS7ûÃNIÙ6©ªŸ~ü©«»ªi”T]Û c~üéûÍv{8î—Ýj÷ô„$RŽ„¬µÛõrvÓåxðÑ¿xö|ÜS=~— üðãw7·W¬·µR¾œO×kw÷òY >Cyv ØGo‡ùt9ÞÜÜØiʧ±_-­Ñ»§§BÓtÛ›eT&DE‹ÅÒ45#=íwëÕÊZGˆ®ÓÇïnîï”ÖvžuU!±‹Ž…ÜÜß…à)¦ÃîXˆçK/ˆwÇS[׺®_¾úÜ{w>_îoïwO»OO]×±UÕ¤œLUGÝTü§r9_ºÅBi$ µî*ciªJ.gÕ´1ÆÉÍ\Оg(y¼ôÃéœ!õøX.Ú¶SJ=<~bAŸ½zaÓµ©šzž'e4!”R˜1§Xi3÷Ó8õÓ—˜µ” % ¤T0AH!HRHL Q*‘cFD)嵉ÊÌR)b(~¶“A‚9x,ˆ%çhýìB/3ÙÙÅœ¼³)GRI™Xt]wUÙ3ãì]Fˆùg½1—\r*ò5¥*¤D$¡$”B¤rU¼\52tUÙ0RÊ3)¤ÖZkýÍfíl0•ñÞ-—ËýÓ^]™ –ëHQ)Š) Ȥ•b9¼®LUÕó43!„˜¡än¹˜¦Œ©œµB Á‚»®›æ±©7;)d ¹”²X®Çój±1Æœr)P2 nš&…À(s ‰˜dÊ…@ HÉ…©¤K*1¥«'‡˜÷ÆT‚Ù;­­š:Ĭ‡ AI¤™rÌ—áb¤f"©¥ÑÆ{ŸSb!+ïBÛ6?±LÔ,VçK¿ÝÜ•TÞ¼ù±íºÍj}8Ÿ„”ÏžÝ_†¾”’R^,dçÉÙ9Å´ÞlÞ¿ÿéöÙ³àýÝ<»‘ÌÎZ­´³³³žµ6$XEr¡E·ÄÄÆT]Ó&%DŽeõâY"°‡‹–¬µv³È”ðññxùÙg¥­Û~RŒ±”åbYBxóÝuÛ\úKÓ´$¸ï{çírÑI)N§“i³^ŸNÇœÒf»ÞŽ]·¬êJW&åR F¥ô8ôÓ0ÞÞm|—ýLkBôRÊE×¼ÿð!†˜b¤\À'RŒR %‘‘…êº:çXÚ¶€ãáÜÕü—Ö›õ<Ï>f!H©Y)5ÍÓjµçã§§§ýž3Æaì¶KŸâ<ÍÍbQ7MÝ4!Æãy˜/cêÕr9Mns»AĪnœõÎyçl~¼L‡ýÓ¹ë®a!^ÿâ«¶kee«Åí‹gËõ¢Zv>e(3ö‡}ÌÉù0ÍS)¥n«œ“V•4Ò…€%gï½un觇‡Oã8€R6 R""¥””’™®©Ÿœ‹’F0Æ 3 …rÌE ™c 1˜ªòÎÒ¢íæÙãØu]Ý4ó4ÅRêºÁK) ÿ—ÿèýÙ_üÍw߿㵺ŒeÙPÃó .ZõvÙI-Dp“’*Ä‚HT²–B±,„.„9ÊYR‰HÈÄ$ .WT•‚RjBÅÇ<³È9C̳Pu©eÆœA)#B€èB¢’.öÊ),cáR Y”ˆ™)çŒ@Xr )•H)^—œ‘‰(eÈ%ç„´’BJd.HRPL¶ÀUƒT -Ù{ïCÈ1JÊ … )p!ÈPÀ{—cNÁ#’ª\Y HRŠëí¼”@ˆ…Hb&‚”êZ,#!„ ÈåÊïI)^ÙÔÚˆb))çBŠ9§Xæë¶ÒUÅ„Ì$H8ç®:„+!ƒreŒ`Y ¥½RÉŸoô,!C–,‰I*AB”L$ å”Ë_*…œ3,›õúéé‰ãåÜo¶+ë2›ºç‘iÝ•œ›º§9¸P·ÝÃÃc[5ÇÃiѶ§Ó  ””R*ÖY)eL~»]óÈ,»¶-¹X;-º‡”ÈH cŒJ²R²®*Ìyšg@4ÆXg•Ò>(éßùÙÀZÛ4mNÞG¯„.pe°³ì§Q²ˆÖ[;™ª¶Ó…3+霿zZ”λº©}H)FŸ|­u>—C,%9넇ã‘QÔmcþøáãÝíö:€~Üí¾úê«§ý^km¤t1ŒÃ°Ùl.—þf³ªT%´|Øíb.yÑ-êfqÚï§yzvÿL(ÙOgSéàc·Y¥ÏûSAjÛfœæ""¼|þò/ÿâϻŢ©[tET1óÓa—óµ§‚68âññéOþá?è/½õžˆ¦ÚnbÔm³ºÛôO‡ýãV"úXÕZkSº½¿ûéû¦[䜫õ2A.€eÕu>¾qvÞÜÜ´‹®¿Ì1†iMeb(_~õÕÃã'¥M)ج¤µÑætÚ+)Ž»Ã4…‰Ö«,Pž»¹»M1¼}û¶mZ]›Åj{é‡vÙ½}ûö—¿þuŠ¡ ³–R ÑUúvIÖIf@P¦ŠœÆÔ!z&º }ÓTUÓaH‘™*S9gsÌ©DfÁˆÞy¡ªõv³Úl£Ûí½"—ÂJEïCŒŒXU1.— ]WàÒ_ˆ ©Ûq²˜Á; ƒŸýòW_ÞÜÝi­N—ÓÍzóøéa÷ôbˆ)ÙyÎ9Gggg' bÁ7ww7·7Z›ªªæyvÓ\rö.„¼s9#¡ò9”„¬Õj¹¬«†¥˜§Q ,åÿãéMvd˲ô¼Õíæœc··‰.#“,²ªX %Ž4á@ÐP€ ‘ÞGàsh"jª—Ѐ(‰bU±˜ÌÌÊȈ¸×ýº»™;ÍîÖÒàõ77sß¾ÏZÿÿ}ZR10"b¦Ö ÕŠÄ`¶á6mÎår×eÞuj*±ïĹœ a-\pž]i-çrw{/NRJ9gþoþê_üõ¿ÿ¯o Žwb_E€ùÓG7}åæ!XÖæ ]׌çuu!Ö\‘ D–m^Õ´( 132³—fˆ&ÿ?÷LÄ×fµ6ÍYµ2»\´¥•XxØÅ(¾-»ÀyY7hó²6+“ Þ€j3çœ6„šj&ÈL€hˆdÚj³¦­!f`FaaQ0TFU­>“ N˜¶£ÓÔ°  j»ŽWP#º>çÌ„jê'Ày™ *T"ôÁ3RìÂæu‰Î#˜9fm• ™Ð6ù¶¦$\J5mÎ$¨V™™ J«€ˆµ¶º5ÛLsÉ€XK&âÃaÛqÚLk3TlÔÌÄBÄ8t€‚LÞ;ç="… yŒ;XXœ7f"OL¥V3 Á¥µÄ®‹Á7€ ÁçRóùôF̱ë1øþx|}yÝßÄÉy<‹ )­âÃ.ÄÓxFUD¨µ¬93YJùöævœ¦ØÅ›Û›q:#âó—燛û´Î95C%m¶}âX ÖÔŨ.B|}yñÞ?Ü=\Æó²¬]ìjSqY7‡RYk—ó¸ßÌ”Öl`Á9U Î÷]\æÙ»ØõÝx»]O(%WUë7èéý½óáåé¹´âÅ7¹¬„˜—Ô\/—\ÊõzýæÛ1ô%%p„ÎßÞÝ^ÇÉZs^ÔÔyß9÷éó'3øüù©ï¤ñüáñîASNûÝa<ŸTí°;¤´šBqºÎPU?ýñ‡ß}Ýï‡|ÏçS)åþá~žçØõ»ÝPJN)ÕZ§i”q¼D ·÷„4 ݼÌwïÞ¿{xÿôô™húq77óxÊ)—e©Ú¡ï†ñ:ª6 šÆÑ³Ñý¯¿“Ýp=_¼Hßw]è^Nçœòǯ¾òÞ¡ãýîÐï÷/§g&ljìÝ~7€5­µž/ãŸÿóñë?ÿ³²Öyš>??õ‡aèâ”×Ãa߉¿^§m°^§‚ üüãOóx¹½y âiš€©Ûî?>¶béåôúåÅDJm!vL$©ÖúçQjúÃïÿ@€77·ûÃ!v1çœsîú¨o%—Í·¸s1"Óyy·;lŒu]jk"‚»Ýþ§O?CBÇ???©Áñö†¤ZRÊU±‹Çó%•4οþõo>|óτ˚ž¿<¥5ï‡BèºÃñ0OiÇ 3Ïs×õÄ2¯ "L×ëxy+)U­@äXjË­ÕÍ&8ÍóëÛë8ŽÃ0˜aÓ@ë:§´^¯×RJ©ZÓ®ïnïo§ë´…sή¶¦fótõNbXJ–jÊÌ>Üf´EDÇþíoþóßÿaLÕ9õº—·[8õüá(Á1!€÷ΉW„yºŠó`ŠF@ÆÄÆ”KÃVšAõB€lH̲ᢑ¡* *3«ª¦‚µxÇBZÎBÈD!p^km1ºº.9çÒªæe¨Þ9& W¶ã}ŒˆŒ€¥¶ 5îeóô¢¿yÌ´áÖžö^ĉhf­•Z[.̬¥% jU3€–rQkD¤EI˜PÉz:ñ›³R„ƒw[Ù9ï!Ä s.!ºV9"/ÉZU@p")¨µVZ3³RsJ+ ©5Ýê‡Úª‚š ;ar<]§Öj©ÕTÕ6/1’0:& ç!*¡cOÄ@€DdDÌDÎÅûhÛûæBTh»nWjk¦i]ˆ™s-Ì”¦5·ØÚn¿7Óe™­ª<=¿ Ç$¥•RÊe<ç5Å›jßueY‚9§Ý~·Û ¹0ð.tâÞÆóÍáfY—.Æi]ð%gBb¢èÃšÖ ¹Á„Þ»išœ÷Ò‘ÇÃr¡äB4ÓÜ 6*Èv)Øø âji·w7¯¯'k]t9§Ãa§Z¯ãùã×çyf/Âétª%Ž7‚|G@^æôý÷¿úôùóå|A°Vt8LÑÀı6E€’ó².ïßk­]×§ó4O¿ú(,Ó¼{ûòúáÃW—óùåå¥ë:ï}méËë“‚:'>ø.vÆÄ—ñòí·ßËÿøÃýãûRµ=zúÝå2îºþÇ?ýÈj-猌u^ƒ“ûûû²¦¥ÕC7 »þt¹¤®ç ‚¥´´Ózž.Ãn}øO¿ûíã»÷çó胓àû>ž/×¾‹Cßq-e™®ÓuZæu™®»¡ÅO?þ¸ßï¬Ù»‡‡ÐõZk^“ªnWïÝ0´š??}^¯sÎå»ï~¥­îŽÇÒêûïûû›šòÓ?.§3!vǽ–Z‡ÞÆük âæe®­úèÑ;?§ÃfÓ²ÄK«ã¼Þ?|ìb,¹.)¹ú¾#3B8ŽÈjýî0×ýí­s®ýn8Þ܈¶*,CìÞ^ß^>?u1šBðÞÃå<þôßZ3ï½¶v{¼™ç´ÛuØj®23(\¯—Zk+ítz}y{q,7··ý~Øö]×w1’ˆwa²h«ÁÇ®ï7Ÿ9£´ÖÔt»eö]C˼n»C$bÚ ™ˆDœ©ö1"à2­†”s¾¿¿—Y[kªk^kj!zDÌ9 ÿîëç×30ßF>Ö·÷2~Ø»Îñ°ëÓ²†èj.ÄÎy§Uçyr$„ „t­!BÊŽ ¡’U ñæ&ª flf­QkdÍwŽPLµ´j "Ü÷"LNÄ !5­)µRZÍŬl¡iòLEX˜Ñ°mUÅ;3k­’c0@ôÞ ‹8FB¢Z› SˆÑ‰gDk  ÕÒȰ‚(ª™ÖZ… û¾÷." 2!Ø&$"f&BçØù®åÅQ͇ˆ„ÈL›„Yê6ËiYÁ˜‰6 ÙÆ1@PSh9'RSÅÚŒÛzÛb@ÎgkhPkÉ¥Ô¦dH1ȹ”ÒùñŒœÓ¢Áûy™\ôMÕ¯M°ïûuÍÞ‡Úš²¸_¦ùÎ¥”ŒÐyLl¥Æ.¾¾½í÷‡´®Ì¾•’K³ZKÓÚjõÁi>¼½½ÝÞÜ,)Å®S„á0¼Þbè–u]×õññ1å²Û÷OŸžŽÇ£Z5»V @iG磵¶ÛíNç³0âËëËW_}ÕjM¹©6ïÝ~8ÎÓ2¯‹žEP­”lŽ8åÔ÷CÎkmªjÁIIůµ®¥X1ÏÐZiµ)^Æ1† †i]ƒH©E[s^JmP›¶z|x˜Æ±e‹]¸ÎóÝÝÝù2zvÑ…Ö´V›—õpا”BMóå|Ž]‡MïïÖ”½wª&ž~þÓÓÝÝí4Ïâý¾ßãåx<¶¦ã<\Nç´$&FÄõ:§œ6š­¥§‘@vCß}Jë<¯}·3À´–><½¼"ÒííÝóËËíýýãÇÿî¯ÿÝ_üÕ_¾¼¾éúWÿ쟇»>ž¾¼.ËòúöÖTsɇÃ1•ºN«“ÐyryZçùúüú6tñþþþp{燧¦žýuk«fp¸9NÓ’K•ÞÈ-·Z|t%'"¼»¿›×éåõMD.ãÙÔrÎ>5kìãñxãvÃÝÃïcjµv‚¨€ªæñ\[›æéã7ßܾ{üòåíîñáååËöf€D­µÔòëË%­ùîö&ç¼Ì³÷È¥5íoŽ ÈØªšµª¥]ÇiYfbÞív¥¤š×Vê’–——·.FøùçOÌ„Ì)­ËuY–U²ÓéºäZb×;ïR)÷û¡¯­j­>Dºž K­Þ¹~N§Óë—Wö,ŒÄÂÇÃÍîpD zmZ›ÊQEÔVsÎ §43c£#9@î|ÜÄó4Oã•€™Ø‡€È×뙜;Ž­þ2-ðÁ²ÔZ–eI9‹ãMW~9ŸIdºN¯o_Z«µÖy^ø«Û÷×\™³ÔÓ#ÍïbÂáxBSᜋˆ'vUa½\Å10 ¢aÎU´ “ Ôú>‚nç0ª@U- ÀD`ÊÄlU­)STõa¹ñ "RÍ9‹‘07«Ôõ}3uŒ­fvâ  v¹NÛ×:d4j)»ÀÌ´ЉPr+[ûF$ˆ ^¨ª5ÐjÖ¬Ub3&FƒR³_K#bñ[bÒ{T >¨*‰€êƒ70ñkuŒ¦Øu>­+{F"äH¢À„Äd`Þyfdb$iÚÐŒ˜ À Q›5CÈ93 3 0Ûˆü­™‚‘™8×6ð´™™½÷âœ1S)%F_jiªì$t6ícÀfˆÀâ‚—fÀŒ´éî…¹jeA&ÙJ)¥è½ªVÓ>„”Š™R³ºë‡œVÓŠHi^Bì‰ÈÔTP¶Ùè¢V Îåea$ï½Öv¼½[–ÁºØ­ëJD]×—V‡Ø­ë jâä<^ºˆp×˺.Ó5t±´&ÛìQJIKJHÜÅnÇ£x13D¨µõCojÎûiK.ÌÜZƒ®ë[­†êD„¹ÔœKie‘5%&BfSÈ9?}~úúýG3ÂiœçùzzyEâ»»»q<ýõ×ëšNçSˆ ‚ o§·ÛãѧsËEKá·Óéöá.§¼Ûuó<«Öé:ž›/W5‚ë8:‘ýñ0/ËÍíÝuš€Ð ÃÓúÛßþÖ{…”sn¶%hI$׃ ÒG"ìúþç§'ºÃñ8ÏËW_õôåóÃÝÃëÓóû»¿ügÿ,—Öu=˜2bÎëøzÚöeY£‹e­ï>>^.×´¦÷ß|•Z!¦‚x|¸ËZ»ýt½Ä¾÷Þ/-_§Ë_ý×ÿâé§Ÿ›ÖRJiíááAD¾¼>w±_ÖåÛï¿…Ts+µYì;ç\¿JÊÓxyxx0³qS.÷÷÷÷÷§·×Ö2Ôêƒü?ýóõw÷kJ/_¾\¾¼u1ö1žÞÞ°5‰}jíîþáîãû—ÏO×·")i*õñý×>ƺ\K¬]¯ciÕ ×’Çë CÃp°Óu‰}ÿp¸9æœwÃnš—>†Ñ/1uYoïoI†»¡ÇDìCüøñc7Z-,®:ïR.×ëˆÚç´VU»µæRê~·caS33b>ÜœsDØjÛ6ˆ1ú~è‘`I TÍ¥¤”K®h(âÖ%5kïÞê8ŽÓuª¥ö]? 1¶ÖX„¡‚óŽN¯¯!Æ­[ÚjË)9ï\­UØåœjk·7w»ÝááñYLõp8˜5~óþ’¬£üÇ?ÿnØï†®‹Î‰)8UqMÍÒ‘H ÀZIêYº¦9…Ð9áV*¨ÙæêÈ æm¯OÄɬ±šcsÛÄW‰LQ~Yш€5bVÓØ{Ca3$çC«j©ÂäI¡äÜZÿËÚ“j«ÛƒÕZÍp7ô¡"!ªæl€LTkݞё½XQ­A³†›r ½÷Œ\[Û>ZïšrŒÃšÖ~è­)›!ñ†aP!AB4XsV4Cl „©ik­šA5Tb±ª„¨¦µ* ±co°mšÈ€ˆ„bˆ¦¶ñ÷cŒfPkuÞ™¡ÖÄ-ËŒjó¼t}Ÿk!"ï\³†Dë²î7‘$@­•É¥uEU­µúBìÀ´,ÇÃîõõå7ßÿêþð‡ý¡åRK5Ó´¤×óe×÷1ÄëxUÓw÷h@â¦eŒ]ЪȶæÚ@ƒw¯¯^G÷´ IDATo}߀!¦e!Út:à}T³.$Z—e¿ß¯yu›pàÝýãë8Fç@)—⽋±Oyí‡~·ß­ž½šnš¹üöâ—y¤¼æ®ë¶›u©¥ä꜄è_ÞN]ìB ó2 »n×¹à ]çÜòЗqÓeÊÖj­ê£w.ˆsÎù®ë>}zrÌ÷z½\Ñ´µŠ¨ë¼ºÎ—Rî§iêûÎùp~=Ýî–eº¾¶ÖžÖRU÷û½ áéùóñpøüôùáñ!µòöåËî¸W¨%gçýx9©ÕVRßïbô¾ ŽÜš³hiŽù§ÿ4 »}ß/)!Ñ<_oïo_>2ÕÂÍíñ2žkmÌÈ"_¾¼ö{'ž„Z-M¼§IBØíö¥j;5åÎYÓëÛ[ÉÕŒˆ‰Oç“'6€Ëé´ßí7°(¨-iýú«~¾ÎK{mµ5}||ÜŒ^äçÏ?kÕï¿ÿþ÷¿ûÏKZ¼‹ôæövØãõ:OùøxS ç5™UBBÒëy‡ïÞ¿3„¢i½^§ápŒ±C@qäÒš®—)ºp~½ÄMA[-)!r×u¹–ÜÊå2:Ç]ß)Ú<ÎUu7 µ $f'¬ªÁkæÄÏÓ<ǵ”ZKSö‡jÖyßïw›ƒ9'­dÐ:tÝÐõf¦B2M3—‘„x§iZZ©%åëiDƒ4gb`ôâ!†.²pð!„~œ®ÁES€R*ÒXðH²¦ä‚u^Óšæ´ ²åÚT…¹šmŒ’‹ã£°C†óåBD‡Ý‰™?Ü~°éŸèÝÁ¹à£ ,ŽØ‰`AœBZ³.k@bR4f"Fkµ–ºº"XS'¾µ†„Öн!9EÔ_DUjÎÑA2"Œ!n•Z3¬¥2±0#¡2‚BŒ B$-Û6ÇñJµY­ €¥¬]×1Ó&0D04³T€…ÄD3 ÐÚL jZIôZU5f¬ ºAú·.3#¢gnµÒá¸_æä6ù¢™ÅçyñΣ!Akf­Á/WyPmH‚ÌL¸a¾M[Sh­Õ’| Ú²˜êÆ 0¬U‰ÑT Dœx!§jD´¬3€ù ª ±¤œÔV[k›-²Õ‚À›ÿÀ¬iÊ…™×”ÌŒE¬hÉÉWJmªÓ<‡àK-ÂlhV­¶ê|$„i™bôUÓ<Í77Çãa¯ª€”Ö%¯™™7ûe]˺¬ìÙš»¾ä5çüøø8MKŒQ›m^„‘¿¼>=ÜÝ×Ú†—yž®S×ÇRZ Á‰SÀn? âùrq"ìXȽ¾½ívƒ™y`°ZJ×GÕJ€Þ{0áVòf‚,M½çÐ…ËùŒ„€ j@VKeáÛÛ»ézIkï.—³™zçˆß54B8n_Ïo„ÆNZ­!t¹äRÊøBI9çÒÅΚ)Qk XÌ “ ;bvªÀŒVZEV5BÒÚœ“’3  s+ÍÖ’óŽx^W'nI 1  ¡b­&ìınKÔÒ„‘›6&Dsâ©ë:vΚ áFÉDÔT #‡èU5¥Õ;@f¦Z2mö¤Íê.@$\Kxñi͵V0u, \jeäØuµ ‚­ûE"Ž5m$ÔZkZU[kjhÕš!`­•sI†ŒÛ¿ çE«µ®ÍŒˆ·¢zß•TCð%"h¥‚Ö‚Ô¦ªšò$^Ô4—¢UÍŒ‰¯—1—¤­yï[ijf¥"0aJYD„¸iÙŽZÊЇ¼f3%ï\)¥ï÷ë:ïw=«³ sÉm¿?äœÒšú~`ÆTŠG„Ó4;–V›÷aš¦®ïÇ»/O_|—”îÖuIËäH˜QˆAõËÛË~¿kjµæÓeìcÇL9¯.¸MK°möZÓºR«÷®ÕJ$[„Λ5Ǿµ6/³¾ ¡ææÅ-óTr±Ö>|ýÕz]¦ñB@çñRr¾}|¦i]>}úéûïÅìT[)eèúZ ¹išRÊ!D/çyžÇÓÛnCÄ –snZ‡~çGÀÓér8nïŽ?úüñë¯v‡Ãå|N5ßÝ=æš½ ww7¥”~èž¾<‹£ÖÚýíCˆÝÏŸ>íïnkm&xw/1þýßÿ§‡û‡þôãÝíÝñö6ÄøþÇË鲤Ù;þæ»ï~þùç_ÿ›Ÿ?ýx¼9 J®ÅJ½ÿð®”z&­­ëúV­¶º?Þ?~úñÇ·Ó«8±Öžž¿´) imÚZ)%/Ëù<þêÛïþÃßü¿ÿü_þËñt 1j^½ Ë<³÷×ézØï„eMu¼^µj*Ù;c\Kž—¥ëâ0 @˜ZåÔ^ϧe™˜9vá‡þä}|úü©žß.õ« R=Üߧɇ€žwÃ>ådjϯ¯7ww‡Û›”V`X¯cÎy躾ëž^¿ˆ Á…~×BNi͉ûÃ.¯Ë<„æD^žŸj®Î‡®ëû¾ 1jÓãádιÓùÜj]çìCGDªÐÕ ˆs¹¬¨–µA³Z31©¶Óé».ø€f"RA™y؇8ôCs³7Àþ±”ºA~À x¯ÓõúúúöòúzÇuY>þŒˆÛHZ-ë<_ç ¿ûöÛàü’VeçZ­iž‘Ð1“aÉ%תÖà¿ôȶç{bÞï­92kª*N €ÿ«ôg_Nãàáû}Ù÷N¼óÎ9öÄÄH †HÞ{×÷ç—g4cF'âXˆ™PØñf”º^¯¡ëРêfWWbrŽ‘Œˆ¶¶Ûf60 k­!š“KéºÎ0ç M[«ÚTS-Á{ø/R§uM„`Z´¡šáí~o†5+K3ÃZ šªmÁGfF@bê»aöÀ(쀠ÕÒš£ÖJD¤µVUq $,Z­ë{Õí&nKZE¼ó~{[ ÔÑLkm¥”m?ìDXœ6m`„Bª*" À‚Lˆ¿ì÷¶¼ ‚Õm!¡Ðš"«Àödº>ÍPYœò>ÜÜÞä59/×ët¹\iˆa·rÕà}ÍÅyY–Åyff3è»>•ºa°Ñ–u¦š›6­Z´”R³ªÖš7¤h£iË9×RÁŒÀP„Œ ©"nËäÅ ðþî.åRjF€aè¯×ñp8\¯WBÊ%•ZºØ3S)º–T¬Æ>æœBì¬é².чeY·GkúöúâÅkSœ¦åþþ ®ÓÔ…nMùö憙çë|/©Xký~ˆ]OÌäÄÕR[«ÁûÚ*˜!VõÁ-iEÃý°¯×Z“wþõü¶ëw~è¼sÓ´˜ißõ9¯jXRu.¤”žŸ_|ó4âÍÝ*œ^NÏOÏäÿáë¯4Wc¼½½»¹½w>ÄçeBÄé|½ŒWçüÐhºÌË7?¼œ^ÑèºÎ¿ùGÿH¢Oiv‚ç¿<qª6?týÍq8¬%ïú –œÐ`8:‘Ï?þ¼Û퇃*Æ®›—¥å<-³¶Úyÿöö*âÄùã~oÚˆÑ ž/ã’òûû»ÝÐUk—ñÊdH.° ghÇŸú©VefècG,H†ˆ¦¶Ûí6ÓgZÓëëK ¡ä⼆a¿ßøøõýý}-º?öà kÎ>†ÖŒ­iÉ‹jÇ1åÌL`€D¹µj¶¿½iˆ,Æè1ÔR·K¤‚íwÇ%­†Ò }_J=Ÿ/ˆÌÿý¿úWÿÛ?Tƒï÷åfpâ=Ä´VU%3@`F ÁÓé"Lì…‘DD¼_×LÈÞ9G‚HÓxafS¤_ô‰ÛU+lg1 «µà¼605avÃ:/!:(­Õ¶¥`›¢YÛÒ÷ªBH)­ëºí@DS®!„èãxÁйPkq$F¼ˆs¦Š@M™˜™}@B«M[#ÃZ3¨jS$'Df»ØÕZ[Qb*µ9牔ˆBµVt"`ÚZ20a"äœ3ˆ8 kâýePÓVZƒ&H ¦†M­–VL7D3XSkµ5-Zë–P­¥6U¿Å:‘¡©:'Þ;¾½½Íyº®®«^¨J!0“–FBB¨ ÎQ)Ù;Ùvž!ú\2³#Â-ÂÈ€Ã0¤e]¯“±¦H¸.+šš\ÖÅjóÞ‹È&´qÄŒ”ÓJf‚Hû¡çépwl¹öýp¹\ct9ç\êÐEÂçZòºæu·ë –yñ]mëš½÷_^ž˜dCÎE ºÆiޞغ¡_—µÔJ,¦Ð¹D)­7û›e·•É»Øt2ÍלsI‰û®/­å5ïéz¾Dßç4ãe†××W ÄŽ ‘;½¾ä”wî´vØíJÍÄ<¯£8!ÄTên·Wh—óE\xúéÓ¯ÿÉŸQ0CDv×¢µ!nÇ ¨nYÉœSÎéþþŽ[k¥dD Þmc£À†@XµUÅZ›äZˆÑ‰  *ÂPµ ªÚÕGäfFŒˆÀ„Á‹±÷.ç*,± 9'f13'ŽÝ†¹À¦ ·oÍÎåÖš‹ãÍì b€ fLjµj­¹•ZsZçt]Ò’kUTØm°ý-©jeDP­`àE¶â_ˆÁ…ÒúðîAI‰À¡ªk)çDNÓ:‘#fò¬YÉÅ;öô±ëCg¥v¡â À…ÐõﻯÞKtì0?>Þ9FÍ)uÁ§5—R½w -¥ôúö… ™œöýÐ/×e]æŸþðƒMÓ„ëºÞÝÝ.Ëê‚8©¦¡ß9ª*õ> ?ÞßK”TÒºtâ]8½ž½“a·Ï)+Ø—Óùññk),\Kéºè˜¼÷jFÂ9åmõRR~{=ÕœM­–Òj5€Z²¶R´”aè/óÙ9ê÷Ãóó3³„º.¶ÖÊºŽ¯]W(ÙßKJ­–#¢}øøQ–eÙRù€z¼9œ§ëºÎhpº|9ŸÏ&Â˲°Ù2^ov}÷pÿüå³óRZ/ý0|þüiØV5-¥¦œ·Ê[Z×Ë8^çËå2ŠcF®)ÿ_ÿöß¾=9¿æiµf]ŒHè»Nc×u‡Ûã8Ÿ%ˆ‚w~™ç¡‹ FÈ%§ØÅyžIDœ8çc—e))­Ë‚»NS­Åÿöoÿ.2OçKßï€ðç§ÏÞw}ßkÓ¾ï/çñ|:E¦i¼äyú~¿;,ËòôüÜ÷}?ìbúÃN ¦yô]ÇøõõU\…ÓÛéã×_+#6UÂO?ýºBBWš5Ó¢0;Uüüé‰D¦õúÕ×_’1ÙÃã}J«s2ì§ëxÿnY–ýao`Þ»Ãn¿\§?þî~ûw÷·ý^??QÓjè¢?.üûœï)Ïkš‹ñp{wóp»Û!¨ºÎ+š9'ªmÊ×§§'BSU¹^®>øý~§kJ± T±µZJiȈ©®ˆdfªÖu}YËõ<µZ—ijµ~þü\O >0a«uÇå23ÆsÎÞûËåRr9ŽÞy"BSEÀÐ…e¼^Ïg33Cí» Zk-µ5bŽ!²¸RjJ©”²ÌIx£w}711?><Üîö‡>×bˆÇ››aàÿåý7óþó»?ÜÄòíÈ9&"qL„€µ©QUÏ‚BeIóeôŽœs€@,²ÖÚ9ï¼#Ï˺¨Y^ ¶X¾A›†jS@B°¾I˜—urÞ"3/ë»PJéClª¿„ M¶ç 7ì×q‘œ+€¶ˆèĵÖB×5­54ÐÖ´ëºV 3#n˜ŽŽP‚÷jÊÄ%¯ˆ°¡3jkN¤ÔÊÂÂTZc@CbB$³MªÕTÕÀ¹PJuN‘²äœºÐ-ë¶î‹¡5ƒÚ 3£aÕf"dÄ`ú‹ªª¶¶é‚ —Š­©‚"R-¥ÖæC`'ÌN„c×™U€­WL–›­y5„!vd ¼óãy 1Ö\}ðÁ)M]ßo?æfa,­ 4mûýî|Yœ0 KÊY­:ï‡Ý4_Õ´‹),Ë4_'º~èœ÷„"L¥©sÎÔr.]×oxUú~š'nÚö÷Çé2­ërÿø8-ËñpL-§5ïúµÖõQÍLœ«µhk%·Vk?ì>==÷°VJícÆýñj–[ N¶V#«YZÒáxSk53S3UÇ~Y—œÓáx|{9µZKJÃn¨Ms®ß|óõåtšçÅ9×wÃï~÷û÷ïß—’SI7wwë¼ä\œmõ|z­­F—u½¹; ·‡Ë|%¢eZRmιãþðüå¹–ÖÇð‡ßÿ¢™‘Ikšs‰]w¯ÝÐùàÞN¯ókZY\-eèwÃnx9Ÿ§ñLÂ5§u-7÷·ïß\æ¹4ÕÖúa¸Œ—nvûÝüôÓ °ßïÍôx¼9ŸÏ`z8þðŒ^>6³ØE+­]—õ7¿þÇ×yF/îôö–SþðñÃåz}~z Î}õՇϟ?»QRm.¸_üúÛoÖ’®ÓÔíBJëZZíº®”R´ÆvC™ÆëxM)­k*¹íGExz~~zzÂÖ˜¹v‡Û43Uõ^ZmµÔ´¦Øu³â2•„kÖ­êQkmÅæyεñ­5Sˆ]/L‡ýáí|!q¹”Z³˜50F&3Ó¦‚W°ZÛáx@‘\ʰ߫ªÄ€ yM½ (t>_¦ë”Ju..ëjfÓ´LëlÚbשÙxçe^ÖUœ«­ÕZ]ß¿¾¼ì‡]ݼÌ5W3EBaÇÿó¿þ×ÿí÷¯þ÷󿽎§¿üjÇìÐ1÷]´[¦ÀÌĈ"ìäòü Ìâ­6–ÊŒ,ìÈåT 4µ†¸.‘ˆH[3"BB2ÜJ’­–àƒjí|·>LIˆTk)¹šú˜0úr†!„ðùóSßwÞ{B*Тï¸AkÚ$0¨­112 ¨3$a Œ!šÐÆ÷Ó¦­hÛµÖZ "¥5ƒöËÌ M@¬©ÕVXˆ PUŹ֪°sÁ§’Cj­B‚Œ Í Íi‘¦æ¨aSC4B*µ›*0ü/#hÕš#‚!‚)˜™8ï¼xöB$¤ÍjkŒ„‚ÄâY´5#3‡Œvºœ¶´QðœR+µL׋ó]JkŒ]kMÿ?¶Þ¤W¶-ËҚŪvaf§¸å{î…{tR¢G#D6’¿å}Ú´hH©h@JhÑ€HH‚T*‹ðâù»÷ž{αr«˜sÒØ72IÓùf&;{­9æßð)FﶃÍLSŠ`0 C΋c0ˆ1ʆ[°Öª…ä‡ÝÎÔR×å²2q«U¤ÍË4cÎki›“.— 3ä²0³¿]o)õÖ¾‘™µÖÛõúøñÝæÒ›n·qoçë0 µ¬»qüòôôøøFT[D8ŸŽûÝþz½îº1vÃé|rH¥f@ç¼sαó R«€ˆ6%ç}nm^æ!õ9—Ú¤¶²;ìæiíûˆµ¶š³ªxïEìóÓÓÛ7ã8~ùúu·ß¿yxûåéó0ý0Ö’ïîînnƒ¶ÁBÌÄû0솮凞„µÊ4-ªúæ'ß;VÅǘÎÇSkÊÎÇà Š3wû®ï_Ÿ^\ŒÉûËõÌŽïÞîö>†×¯§¾k¢Ò¤K}ð\Ø~{¹$×õÉÅ@Dó4spëõ2îG&7 ÃùéÅDCŠçãåã÷K©Óíúó_üâ·Ÿ~´äü²._¾<=?¿:vó´~þüé7?üÎ1þÝ—ãÉÔ¤6Qy~~ùøñ=?µÒ¤Ò¦"µå.&@40]—µ.åpØOGF^—ÙJ©¥–åzÝïÆ×—çÚı[kIcßržs~x|솤Éí¶ô)-Ó||ý*µ•\>ú‘™oçËóÓ—Ãþp>_‚÷Ÿ?}ÚíFâ ¦Û†óz:5B’ÖR?œŽÇã¸ß/·Ûñ|ì^ž_ÿú¯ÿºKÝ»÷ïw»}m-ÄHžïw‡7oßÅÔ©"“ ±ßÖB†Fè‚/e13¢Ö÷]×Åèü·13o ÔœW‘º,KkÅÇΗKÉùÍãC7 „„ZŽCßL˜¹i[˺äµIûÞ»ðòò²Ó–y»®–ŠŽ\Œ!õ ˜kÝí÷C?¨Ùn·“VÇûƒ1JÓaì°ëû~ècŒÄÔk)p¾œ‰ ‰ÉÙö\ÿå/éú\Nÿøú_¾ÛãýÐ9¼Þ›Šª9瘘 i>¾n i‡°…™½Ta`YË\[Ö­- ÑÈ ‘·í'8f©Eãu­1U !¡m“…¢ 4©Í1ùØw¯§Sìbêú¯OOˆÀL11†N6DÖÖ( è¨g¯f¦\0†bÌd&LÔrÉË‚ˆŽ©‰Ð¶6@Ú0aÄDÌ>ø­t6Ä…s¸Õíæœ7sŽsn™æMª’]j @­ 9ÏŽDÔ±C0cB$€ ŠF„°…ÈÌ´HSdâ80†àÍ»£C‡¨F L.+›w\pµ‡\k½ßÝÕRÑùª}û~ ‚e]ófjÖ<{üoˆ1v]gªÒÚÛ·o®×)Dߤ•Öº”À I !Mólf› ´e/Môz½üä»ï—eZ–¨”l&ÎQ—úëíª¢ŒÜu]Œ±æ¼Ö²ÛíÎó-OóýýÝ2/}—ZÝ€ÕÜ´•ZcŠ„ÄÎ…Ô1˜˜¢!Ìó’/Ëꂟ¦yw­VBXó’‚Sr®ÕjjÞ$T³a웪g>½žö‡=˜aŒÝ¼¬óu:ܦۄDH.„` µµÓç§—ùöæÍ›\fr.ކ˜¬5#ÇþóçÏ!Å®ïRŒUª÷þr¹Æƒ÷ˆ˜úÞÄžŸŸÆ»ƒªÞÖÛûï«”—Ó©µšÃŠÊ IDAT¶¬Ë<Í>ºÝ~<¾¼NËtwB˜os?î»."ótžŽ/c·ûúüewØ bkªdµÔ×××Zên·Cƒeºm.ã¼æ\+W©HäSº-³‹qž§÷ïßÎëÒwÑçu½œ®»¾ö .ëúðp7 Ãvýþ»ïv‡CS½Þn[Sfè¢51)9ç|=ßÜ8ìÆÝ8ç…j­¤p›ç»ÃÞ–uQÕÓëéññqšæ¡ëž^¿þÉŸü|^ÖËåúþãûaì]ˆ¹ÖÝnjÓ:­¹á~¿¿M·ÂÃÃüf™n×ûÛå:Oó‡wï»”b ã0øTÌ1{bD¼œÏó4½}óþ|zm­Å”únö»Û4õccÚ¶’?ÿÅ/öûC)%çÚÅ$ªÎùÓé´•)^o×q?²cýòô¥”–óBt¸…[\ˆñx<Ã( ÞwÍ`­­‹©Ù¼.Ú4Æ´ßíû~ÕRÚÓÓÓFÿ-ëR—r¾^¶Û’H]Ö¢b)ÆÍ±ãC¸œOûݾ.Ëmšj­ë²nxÉ\Êm™ïïïcHkËÑEb$ÜÆßyYÖ’}è|H€¤ÿ/ùgš§mßPk6Uv¤jüË_þþþŸÿù_þ7ÿÝ_~ó³7½šÊFY424U£´FêõºÎ“d Î9cr9rÀŽ‘¨”êbDøÖŠ „€è£W1D@ #ïšêšg+¥yOË²Ž©B5q@ˆ¨ª¸ÕÔ±s!Åižƒódv½^™‚™ö}/¦1$缈am ¤´c¬µq`@¨µ8FBf@d3“àB^× ŒDD„Š[c¢™9v€€ˆyY\Œ­"R©f$µ8ïÉ9¯ yYE‰˜‚®kŽ)";„* Hèƒo¥ˆ  ‘ZSU5ý5pþoC &ˆž˜11ƒó cJ!E"rHVš8æýn'¢[’c&ø!DOì‚3µ}¿[r!Oy]‰hóþ¦”ÖR̉jYE´µFHD| !Ý®×ཪôý˜KõžEõûßýîó' A"SàaèK)/Ç׸5!BBkŠˆÎûu[“»ýár9ßãš+µ’ƒ‹ìh]WUM}·ææ«Ò†®Ë­æ’û¾#ç¼÷¥ä~7L·åÝ»·—ë-Do]ß­yeDPSÕÚ*1¡‘šIŸRΫ™ ºœ+9fÄœË~ß_ÎWdO„ûݾ¶†ŒÑ‡ZÊÓËó÷?äÒ‚÷›±êõõµK©– çëÅ9ÿøð@!Ì묢Ó<§}HÇËénw:Ís?ô¢˜¡cÏ®”òýÇ}7–¥¬9_og .¢ܦÛnÜùœŽ½”¶^¦Ûëéîña×÷·ëÅÌßÿøãÝá°N3#Ô\›ÔZê~7ÖÖˆY¤l£‰ į×ùððà˜§S?ôŽØ1©š‚öÃðéË—·ï>45"ôÁ£B-Yš¼¾¼üìg¿§j1v·Ûõááár>—’sÎß÷ñééëÏ~ï÷‘hYK.ù¶¬wûQyxx(Mˆ¹ÔšRGŒ­µÚ”æue&ȹ¯ãn·ßí«6%D *9@Í%¯³áv½¤®óÁÍë²Ü¦Ý0"âÚ²‰² ©‹>¤œËاÚ۬«41… ˆh1»ý®µv>Ÿ7Eáéë×>t)‚Ùé|FdPÝïîùéå+ «­^¯·‚n¡œÛí6Ž;Q›–y@H!úÔÏiíû½c.*HìÙûár¹"¡sŽˆ»4:Ǫ‚ª&ÒÐ{€ót«M:ß™ˆŠ~;à§ß¿û‹ÿöøxÀ]EÕ̶Ä|“MW@­­¶VÊ:Ÿ/1:bFb FjÚœw!„­ÖófcüVƒ»p\¤©jtÞÔ MÍ7 ›*2‚QkU̘¨Ö dZr1Ðñ°ŸòZ¤Æ˜‰]p!¸¦•jh­Å7RSmÒ@‘¹I3"B0RЦô ¥¹®à˜Øy3,Ò´5Blª"Í6£8 " jФ±£mÙRJi¢[ûš±Œh¦ˆì€ "°§¦º)L*†„ĸ“`¢jŒŽ1Šh—’g‡8ù¸)M„µÉF+jµ´¦„Ø´‡yžÍLTœcFÐÚ@¥´¶µï÷㺬)n—ç\­µKÉ!5i!ø’K×÷"b Þ‡ú ;å¼Ë’£ó!ø’3ÙåtêCêbl¶%¦¡µÂ¥ä®­Š#B˜ç•™œóëºî»Ûõª*€ÄŽ»5¯LÌ çÓ¹KCJqZg‘–bèbzy~ÞßíÇqTmk.yYÁÀÅÐuqY瘒*€ˆnýÞo†($·ÙCcˆ·ó±ïb·ÆqÜÿðãï†açØ-9ÏÓ4ô£s.Ï7U‹)ÓÃÝÝmZDåãÇ/ÏÏk^SèBSׇ؎ç Zwwÿp=_~õë¾ÿÉw·y‰>¤ÐMë<Ýn <ìF3\–¥Š–¶¸ÖeaÇýБwÓ4#bêé4OoÞ¼ýá‡ßìîï}Œã0”V¶äsp®æS8_/]H×ËeèÆ\Ëëëñîî0C7 e] ïD«5‡Ýçßý¶ë;3-U–u1EïC ÉÀœw¥6Bª¦€ÄÁ/¥Ä”î›´fBˆçó ûÛß¾{÷ƳۊØR—˜@’£ãë«j³Çǻڊ´öõëó0 ÖTÁ`Óm™Þ½}çœ{9žúݘ¯sžÖÇ÷oK)ˆº®ë<ÏÃ0ŒÃ€ÏÏ/ÏÏÏËZR×!"Úõz€ãñXÖÜ÷ÝVׂ÷Áçe5ÂÃa—ºnYó²Î>|W[]JµÚÚ²fm-—bfk)ä|Œ¡ï†ÍVÀÎ÷Ã`ÄÜÅÎ7bÊt»ú.5Ò2ߺ~×j­µ2m,–¦¹rüöþÍírùñËï?¼O©ëÆ¡v1ÆóíˆÈèc<îºqð©ßßí¥IL~S&ÆqWk1zïÍ,¸à½{9½zïïß¼¤&f@¦<£ÚZë–½EÝðfm[^†ÑÐ ÕLL‚÷`PjqÎõ]jM‰ðÿsüÉŸþ«òOþ÷¿ú§ø>"{©˜˜<#" ©"ššêí夠!:3%ößèЦÒuižfPU@†&†„Î;b53C©[,Š·ÚÑ´®)ÆÍú ›³(†¨¥ä®ëÁ»Û<ï†ÑÔ–eŽ1‚˜‰Øfz@ SÑ&ÍoìoÇ"‚RZ^€†L„` €[=%‚¶o·f&*E¶7‰€*`¹¾µFĈb¨¢HlXsÄeš}¢€Œªâˆ íoÛY6yk¹ãæq%ǦªªFjÛÐ;@`"E„MCÜ*\¾‰Ü>šCòÌÆ ¨hLXj##«¥˜šQ©¦æ˜yÐæ¢¯¥ïJ)¼AëºPrö1ªHŒQDÌÄLXÍTDÍ¢÷~]ö¼©sw‡Ã·Œ 9lµ ýx[nÎ@$¢œË0Œ9¯‡Ãþååy×çë ýôg¿»NR;CP…äùv»Ç-‹óA·ï²,F!ö]·ÌKߤ¶Ñ,º®+¥ÆÔ-ËS"tÌ|9ÃXkö>´ÖLDU4úP¥{vd" l«™5êúáv½Œ‡Ãñtz}}--Ç”º.1ûqrž.·+;—b@æRËñr‘»ÝÞ‡p>Ÿ|]ß·ÒÌÌm^/ibBÀbº¬«TùÉOº–r›Î_žžÞ¾}ïÅ.©â/~ñ÷>ýî“§ `ËZö‡ûΧ5ç¦|ˆ1˜™Îçàã?ü&vCìBFD¾\o¨(`ËtÛ퀭ʗ¯Ÿ÷ãNÉÞc$¾ž/÷÷Îùœ—VònŽÇóñtlb`‚w3)å²î÷ûËåLÇÝpww·Q:œw­Öýa_rÞ»\êÇ÷ïÕðùëó»ï½÷×ó¥úyÍʱ+¥Ý¼í9>úòáûq¿?žÏó4}øø5Ûìùr{ûðPA¾Õg(³+­¬ËÚZK]·Ûíþ½?ýÓy™Á`¸;Ý.5—¡Ul]V3ýÝçÏ—ëuYÖy:çµ²£aÜýê׿º].»Ã] Á<»˜¢'&3Æý8ö>øÝ¸;ŸÎÌÛTº‘йMµ)l!ÿ¡w÷ÇÓL‘Ž/GQ놑š6%–Ú°µ¶¶úåËçï?2Rˆ±,ë²,Ž(Æxzz™n·àý2g©eaâu]¤éõr Þ—"ŽÝ·(oJ×Ûu^mÆÞ;ôÛKrΈ®©Ìóâ\ "vL.xX‰C”&*ˆj©ìX(¢r]KE„¿;àÏÿá?ø/ÿ³ÿ äöaßekhjèpkƒj’—õ­™sDÄ ÆFs£mUÒŠ°€’¢šÙf;1f^–Ù6׸©–Üu=J,­™¨º¯Ï}×Ãp¾]¢ µ•ËåÖ§ÎP\ˆ¹.ØumæN€-®$²¡ 7©UCf"3Þ‹Šg6Q5͹xç!—h@ÐJ]sF®­€ó Ú”Ô”ØH#µÝ–29dµŠìjmb¦ME T• U•Ùi[’”¢ ¦@€f†hMÈ;BÜ*ÄØÇ‚GS$ Z[Ö¼:tÚªs^jE"&Pó>¨Èº–ÔuÛ»p>äZ˜™ l3Ôv}WJPF@³ r»-ì¼”ÌÎ!ØõrE£¡ï–uƒ¡¼w·éÖwýõzõ>xçsYºn0U"Š!ŠÀšsŒ^U›44Y–UU=qkíîþ¾”윿\/Ì4Ïs^2  Ý‚Ÿ¦™GàaÜÝæ©fyxó˜×…œ×Zúýp|yI)¢Ô‚„Äl&Þ…RrH‰–eñR ¢-—FÎ1sSÙЀµÖ®K%D²uY1„ðôôųïR7/ó~?jŒnûDŠÖ£HÝûËõ‚D1†q¿ÿõ¯b!À¸ßÿî‡ßn«”ëmaïqž'vÛ‚]®—‹c÷æñQ J^¦ëå_ü˶–¹”e7 UÚñ奊€4‰19€Q«¬ë,*ëtk¦‡qçïº!çlf„¸æuz"`t¹æR‹ç°?ì‡2‹É:ݺ”Z«·ÛMMªêõzùýŸýQJ A‰s©Ù„÷ãx»^÷w;"ÄÓùˆÉ{ ž‰k­ë¼„Þ¾yGÞå²îw»9¯»ý~™g4Œ1ù^ž_îïj-¥”Ö9ÆÃaçË­KæiN! C×Pà¶L]k«ìÈæ¤yžDÀ ªâîn÷æý{4»-ˇïÇÝØõÃ~·wÎïöƒ €£èâí:åyÕ¡†q$ÀÒ20Pm­äŒÌZÅ{ŸséûÎÌ^__o·Û~·cÄV›Oa7Ž­Š™Ññ|:øþÝ["„®ïC𦠦Æ@¾KФ&`z؆h͹¶f"©ë\Œìü»÷ï yØjŠHÓmBBtnÜíRß"ï¥É².Ó¼0qêbêú#3…ÔZ«s.¥d34³Ö¤6A` ¸Þ.α!ÀVÜœRtÌ˼0¢s™Íìß8(v»á?ÿ/þÑÏÞóÃnlºõ*AU@Õ†"(¶,« 23“ÑVqŽ Žh]çÈT‰ çÕQPS@‡Ä„AZnªcE@Zsvžj)Èß2´¥ÔTµáVû'&&!Åëíê\P“u]ÆÝÎo­~6O‹÷LÛd¼™áöG&b"m+eUmÕTµILÁT Ô9ß´¡Ù¶#RZU@ γ÷>·… ‚š#oj>ÂëÂu­ä}-ÉÀ6ƒ|«—AÀà<ØÖÉL(ª€ß s`ˆ¦lf*@Ñ Ð9GÈÌNTZi °Á‘Éi©h`¢UÕ±óÞ÷}4DçÙíz}÷îÝÚêV†¶®y™¦”Âþî~ž¼¬„虑€ØO§BÎu{BúúôrG‘&`Žª–Z‰½ !”ÒBòµç<@Lª~úüùîîáÇO?†>ýÞïýþå|)­î{ï|mS<_Ù±st:ÅÌL!:_¾~9Sשêå| ±;Ï»aœç٧λx=_»n0P\sÞµJ-µ”*UÔàõùõþî¡0«­þæW¿ýßýÁå:õý0/3,¥¼>íÇñéé ˆÌ`žo}ê ë@cæÓùœÕëõúðæñëחLJGe¤¯Ÿ¾ €ó1Ÿ,óæDxy~½¸WýöƒSb4ƒ»»û¹|«s8Ÿ¯]JŽYÍØ9Qú!:w™ç\ ;N±{==ç’ïß<ª}#¨îöÌlM/×)„ÀÌË4©YažUE"Rk¿÷û?Ù<02-Ën·v»M3îºdÍ0¥ôòõ†w‡‡*:îv—ã1u]J¡3bBÃR—íò¾ßí˜y‡’ó×§¯ï>¾ïºÞ9—[f攺m¢ÚíÆ®òš‰@s.]—¼÷ã8~üøq“UaºM9/¶–š‚»¾•Êìj)%·Rk?î¼-×”"Õ¼¼žÏ5çaܳsK-Žíÿø̤&ëš—ynÒJiMëùv1ïýý›û¢ólMbìòºnÙ¡ë´¿|Ýíö)pA  É‹h^s«–œÓЇB "Vk{}}Ýz>TQªÕÖj«/Ç—¯Ÿ¿ÌË"Ò¢sÞ{Ç DÿÆ?ÿûö¿þåÿüùWïçwc×ÒÈ#(ä\¦5çZL3ªµÆÄžØ{§›‹ÁˆrihM©¨n#!"˜j"0&RÚD[«Ð ¨Dç·ªtçx‹9Ç]¦yŽ1®%;G!Æuž\bOΠå¼6U¦­'«ª¶M¨/µrôÐZËy§`µV0#FÕD¤æK­@$&ˆMšªÒv+FC540•ÖT€ÔÀJkHlh¾‹jfMstF@̌ĞÉ#27ÕཱÛöÒ&¦`ˆìœ)Jmk©Ú6Í ¼c&$Db&v`¦´Ç€ƒ÷!FmŠ´ïP­i-ÀH%W&& Ñ-=G›„‚ÄFÈHè¼'„°Ý=ÕÔ»o8iÀ(taûw[s>ì÷Zª÷~Y§.%)‘™qgÏž‘¥µ®KË2­kaæ¡ëªhimè{•Ü`“hZ«1øÛ<ã Kky]÷»]m N—kßžÓmºæ%¯ËrÿæáååÅ1!B)5Äx¹]ºÔ{çÖiQµaè×¹ìûZr•ló¼öãÓ*MAEÕJ­Ë²zïÇcY+ ¾y÷î|>§ÔùÀÒZ¼.K5ƒïÞ-ë HŒ.¸p>ŸN§Ûétz¼»;_®D>çõËÓÓ»·o›ZY ^§« ‘j«_Ÿ¿Fï^__ú±Gb[sy=Ÿß¾ëƒok¹­óâCw¹\ß¼Äëõb*_ž?wÝðøx/Uû±WU"{ßZiªRk†þx¼¤”RŠÇ㙘6Ðé²NÃ8zÏ×ë)¯y‡­dùáþ>Æx|}m*ŽxÃÎ,Ë `Þûm™çƒs.Xk™c—6†Hk-çl ?ý½?È¥¤s®µ63T3•fUZŠ1ÆHÞ_ŽÃ0¯ÝÐ-óL·üsJÝ~¿Ÿæ‰½‹ÎmÛ¾”’™Óóׯˆôðpw¾^bˆL´ü^žŸÉ°–â}`fkMòZˆx7ŒMôõåD]J]×]¯W35%çØ{¿.k)¥Ôr|yMÑúáÇ_ýêשK¹Ô Üjefç|×¥¾ïvã®5!€ 윺ÎTçe–-WÂñå%õª4C×ïölMjC‡Óñøÿ_ÿÇËË3__s.Чècô>Ä.ÆØ™µZe¾Mλښ¶¦%çy™3ÈÝýs±´"Uíôrü›_ÿÚ׃ˆûÀ^t+…%æÐuƒ÷a3tt}PÑÔ…¡îï÷û=€rˆkY· î¿}À?üÿ£_þ'ÿé_ÿpù÷¿w1ª(H³\sË@èÔ9¢°9BP3³\Z5õZ•mµŠ€ß¾FØ´mÛ ÆÀÌ¥–ZŠ0±è7Z% "¨ˆc·,ÙGof¢k­:ï™ \ô%W3 >ná©ÖZk…‘̳ß4ÒDÍ‘‘™6X<åZTÕÉÌÉ9ST„&bM6èÏ—/¥lNÓ ÝÀ˜È1sÕÊ „"âh“¸@T…œE—ÕÀÖ¼–²ª)2¢(Gç44Ù‚ÚÀڔ؋*2mÀ;bÛBˆcß]ßÄšTG„ ¥–mž„’‹ hk”tžƒšš±S PÚšsXEj-yYs.ûýN¥õi0€’›jëbÿôùS“æ]pìÖšSìšH1ñbˆk)µV·m°Íú¾Ÿç s¨†Rå|¾Þß=ÚÆs}~zz÷ömmòøððü|Ìózws^˜ÅÔݦ+3¡A­5õݦ€]Î×Ö$ÆØ§´i\˼ĘTÅ .—ó~<,ëBLÚĶÄb« Z\ò DÒ €¥˜T%— ˆûÃn‹¿øäÒRVÇniåíã»óõÒ½"V©¹æ“\§ëå|»{¸«MCð·Ë¹ŠžoóX­Uún¸^®]§ãéùùùpwBô.^o×à\©ùør|¼»¯Uȹ¿ù׿>ìNçD—”‘øõ弆5gDpìS—xY×R[©µëûZÊår™ç™ñÝ»·OŸŸw‡/_¾¼ÿž™Dä|¹Ä~sÄJßwÄn]s·Û•’Ñ9@,9wCÇŒÞÕc7Mó0 ª­ÖJ)&f¨µÅØ}ýúy7î†Ý.¥p›–àýºæC ¾‰N·É1]7îv_¿|UÓ?øã?(Ëz›çwoÞò›7ÚDTs^Ø9F̹@“—ëe] !zòj˜óòpÿØ ]ðátzõÞýøÃ§.†±çuÝp®º¯//Þ¹.ÆR뺮©ëæyE´\Š´Öšç¢OË<ÿö7¿½xüÃ?þSç7× ‹Ïë|½\çiiµ5­HŒË²zû®;ŸŽHt½^»¡câyšLUT@(øçi&ǵ1H1þäãG$®­Å.<<<}/f9ç­²Ä Z+Ó<3ø(ĘÒáî~‡u^HUœ‹Ze+‰b’&DÎ^7€0u]§úMSp޶ÏF˼”RJi¥4ï“kM‰ÿøqÿò/ÿÅÿ¿ý«Ï_ò‡¾¼Û'Q32nˆP xDfoH@Ô*Ve0pìÈ×Âk6‘Fè›Ú´­KU„x[Á’6 1,k–ÖÄ”¶•™hS4@D3˜–i{Ž“c·-<¸ÕF¨[w¢ã 4 ´¹5Ík®µŠÔ-å„LR³ßøk"RrF"g¤¦jÂLÁ@T031ýö´SBÜüEOÑÌͶ/ƒI ÅjkÛQŒ FÄÞy!XK®µ6me‹V©ÉFØ0"dGÑÀ-K&bï™·¤©n;=ÚC€ÀÌ)¦.tªšKU Û>,€*8G¢€Dh$h¦ºæµi Þmé7r(µ‚‰cGä}1S—EjK]_[ASìûŽÑÇx:]b ž;–Vs TÇÝnš&! ¢c×Z!ÇŽœ™9âyYïîöž]SsžC—˜ÝšsêºóåÔu ̼ ¢}̹(`ŸúRKêºuÍ}ŠÒ¬j“Ç7oÖšcêAmž¦>ö1úR²š¥ÔÍËìbbrffbÍ!­ëR[›—%¸@„e-Cßßn·yZïw·iöÁWiÃ8nIÃuYbð·éZrk*чË4yvΩšBܲ{Û½57ÍóÊìn·‰ˆ¯×ç¼¼}÷§iÚ£ˆ"Àõvéûašfý0Œk-}êøÝïÞ}øx:wCoÈÄ©ï_Ž/?û£?,%ïvãËéµ–L·ib°aì­Ùn×Ïóúðð8ôÃZK«µúÏ_¾Üîvû¡¶v¹\Ì,:·Ûœ× L!FbÞRãÐ/óRÇJ«¥ªJŒ©µBäZ“Í!f¦§ÓY´ÕÒ†¡)hÓy™Õ„¡0Kkó2÷Cg€ÃÐ}ùú¼¿;ô]ï\øñÇÏoÞ>2Ó¶ª¥ÎkVµuÍUÄ1×µ‚Â~·wžSL*ªk.Çãq¿?Ñéõ”ºŽ¼‹)Aôa0€á2/›^b"“Vkm¹tÉoׂËñ¸Îóõz~úôé|>xÿááánšfSíºNEÖeY–…=K•uY˜ni`Ó’+!:Çë²zç»ÔŸÏǼdç\-uóž´R¡+ëš×Ú…Ø ˜>}ùbŒ>yŸˆi»±±ÛÎD€ }"`"]+µ¬™}Ö1„8¯Ë°ûaDvìCLñrD€˜ÌyŸsÎË" •Uë&Õª"¦ßÊ j­Û/Œïîî¿|ùlf1ÆÖj ˆ«Êº®wos+ûqw|=¥®Ë¹„º~|úòœº~Y¦ûûûy™}ðÇã©‹ÝÖín¦žƒ¡Áåv#cp^Lk©›5ˆˆ__O»Ý.¯=yï Êš§iN)Ѻ.»q@ÄÖ"Ò´.oUm­ùp¿™‰k)Jx9_™Âƾ!± óåæ|PÉK^×ÂÎÍ뢥 ´*Å9w½œ?|øp¼^žŸžcßá2ÏyY{5uÎ^¾~]bç¦Û|›®­µï¿ÿîëׯôóŸ=¿¼Ï>¸üt›ïï/ÏÏ—Ë%¤nìGノ6ý86•uYϧóÝÝýËëËt»åZJ®û»1çZ<9öïîr•¾ë¶A<ç‚`ÖL áõåùÝÛ·>¸º Œ€ì\.ÅÀ6.“÷~]g!Íyzóö-»Ð ¶&©ïZmy]§yî‡q¿Û€}úôéþî€À¯¯/!úuͱëZ-Ìž]ØíÆR!BÆA¤ÕÒj)HNTK­Þû»û{QU‘ËõÚ÷}ð¾VI)zçZ­ó<;&眚v1‚™©"Qð!Ädfµäq ½Þ¿ï†îññ^Dj^·­wND@ÅÖÖ ïÒ|»•Ròº8ïœó!„*™w1¥4 ˲,Ëä˜7³x-’×ų DˆàƒC"•ffÇóiØ ã~çCØZծ׫w~šfpìCêšhLÝ4Ýœ÷UZi5…°µWxß¿<¿ÄÍtSSE,׊ˆ)Ef„œëš3 ÂVÓ]V©­Æ tžæ®ëw»Ù™ÚZÖ¿ ‚ý[/ï~ºwÿã?þ«ì?üæ:üëç—N§`«wikc7DElÆB\P"UPTt"Äì ]C2d3%4@5lUœµMÚ[È9‚_×\sQ ÒÚ–œ[kLä+ØTj`$@dÆuɵ+¹:kk´Y\°•–×*­m^CÄ-`ÛZóQ @­Å MPAD‰HU Ñ{o¸=ç‘Q­‰ ÌÄTe»Jk³V«{_kÞU3ÝFU1uΡ™)2yiBKÙ1Ù2µÕRrˆ>8¿‰WŠ€)%bUŸBð s­Ò†¡0U Éíúñv]J«Ì.¦n£ÿW)bè’gbfª&¦¼/¥ ""1cmÍ9ÏÌ€l*Þ;3¼^¯ž¨”ÂDR[×%Ys6S"ªµ„è§i„&¼7ƒãç̧ãQ€ºÅ$„0-s½šJç\7¤u-`ÐÖ¼¬Ùû@„ÚÚšK×wªÆÌºÁɉ§S•ÚÅNµ!snÎ¥Õ2/ËápÿîÝ»Ët Á‹yr)4S .äRZ«Cì̇ØZBiuYÖ’KŸ‚”œCðãýa¾ÝîîŸO'va7޵–óåC 1"Q“VJÙŠõ>?}†sþ|>¦¾ó!‰Ôó娛˜sÔšäu-%Çi]ß¿{;îv!„5çR«˜Åñv½ÖV÷»ý2/yÍ1Å®ïD4÷æÍ#{:ß.¦&¢—óe·Û]o·.õ!z)vžÎ?ýÉ÷Çãét>ÎËRJÉ¥RðÐh+Þ‘Ö˜ykWö>”u=Üj©Á»µÔãédj·ëõz¾ªéÇŸ|ç»­¡P?úôáãw*ÒZEâ¾ëÀ Öz½]wwÚ4o`Ú¤ï¥YJ¤U»\®)†ôwH\—Õ{ÏŒ9—Rkm­”²]i[kŽ™C r"BÌ*m‹¬kÞÕÛˆúÞÔ®·›š!€sމ€hw.„ç§ç¡O"­Ôjªw‡»®KË¼Üæévn·k­ºÌë<ÝJ®Rˆå@¢Z‹wŽSàà°6YÖr>]®—ˇï>¦¼ ¥µuYE¤ïÒõ|qÞ!ZmBÒ¤Ö< #®yÕÒaÉù:O¹Tç|©‘Ùl"­VÕZ«23‡CÚ ]š(€9ïP“ffªu]—óùR´!Xñß}À/þì?øñŸýÓþ7?Âð0Ówÿçü›×Ïmšù:õas$zsΣGôÑ\@a_+з9!jb* mCu²ªm¾Òm~0rnͰ•ÒDjkK^ó\€0¥P¿]Þ k“Rë²æÚ¬n5@ÄfÖDÌ@Q·õ·ªØ €ÛracžêFmÒšVkZ[•&­T"FB ´Z[L Ð0†hfꈀI˜¨š6U6¾©™XÓZkC5ù¶Ž6bR35ؼ@[–Ž'i&ƒT­ZÛÄ"®ÒZU´Z«‚‰TiÆÁ{0PÛ>”‚ÿÞÞäÇ’m»Ï[Ýn"âœìªê6¯c'vE˜²Øl6à‘¡™ÿ_ l XE2aR|ï½{oUe{Nt»YkyE Ñ2lÇ0Y™@ÖÙ;Öúý¾p[w3=ŒžÄ¤ÖpÈi)›#~Q’2s̹ÖB f4 £Hoµi¿¿»1ºyïU™rŒ9 ƒ¶Ž)ªÝTïîî·m¦á:Ï9ÅuY„ÅÍöRý¸b¿¼< ÃDjoÇ í4ÝÔV‘p]·÷ï^^žSÎÚ3" r@Õýø+¿½¿s3u·VXò^›¶FÌSFĽ¶Ö 13 ­ëz¾¹9*憄›Z ‘ˆÈʾuµç§'w{½¼-Ë|{w»l+;aáRìÖ¶}‡±´z¸¥ÀID¶Z¬nbº›rÕfPJ•Àèðz¹¤œ—mò4Ï×óù¬îHdêj¿¾\¿þêÔsS='&˜—5~¸Øj†á<—e>.z1Æ2Á<¯GUó|>oÛþüú<æáòv]Öõ|sÃÙÝÜázYrέÖmßSŒy˜¶²/Ëjàïß½gÉÏ/O!į¾þ€ÈÇgåû÷ï>~~œ¦“»µÖ@bˆÂÄXKu„»‡wÏÏÏGrúý»÷ÂÒ{/µLçó)Çüôåé¥÷þîþ™mëÎA˜¹ÖB !"bS1"±°ÕR[ŒÁ—RZ«{ÙƒH§2þ<’e/Ø]ñtsN1˜ÙñÒb"/—7m}¾Î„JÙ­µyžÍl¦˜â!ZiµžO§ãS[DŽo¢½×R¶uEhGµ¡ÕÚj77í¾ïÛ²îã0æàt{sws›‡lf¯¯¯fS "ó¼˜6s„)织‡²×”b)-)­šz7Ÿ†™]A8:q©µ”bÖѬuÝËbžÒX[17–pŒLU]µõ^[ "¹õÞZ£ãN‡ä{ÙK+ÓtÆ1C áKãôßwÀÿ/þ»ÿí_þÏßzëá|÷Óò<þì//_ÿë§ø¯~õôW¿¾¬OnJ‘}Ç‘oÆ„Å(udC;RÆÎhÈdˆîÜÄ•\ŒÌL½w«­+ÀCîîn]Õçy¹^æÖ)sSe ¸,kÙ·® Z-HÝÜô ºƒZ33óÖ[W$T50ëffÖUÍ]•´iëÐZ7õmßUMÕjé¦Ö­ƒÙ1­Ú‰ñËż7fA×®ýá¹£;”ÍÞÍâ~)AxëîD¤Ç ‡Á¡{G@ b†t(™HÀ¬öên NäŒl ˆtð¥Cà#"a,ä@MÕ °`Î ‘Uõßý(‚¢¦Ú+ñ i-»„p”KË^ ŒŽÎôÞ €ˆZ×óéÜ{1Õ®½Öýf2Ò¿þa/uHY˜ Œ™I„¦i"bpŒCÞ¶ýÝÃÃ^û8æy>(%Lòòú–bœ×5äAÁ}«õȈ×ëzžNÞkU¤¸2 Ô¦ç›w(eá­ìBÒZ/µÅʾÕÖÈ(!±Ðõz ˆÔZy}»œon–u}÷ÕW’RŽi:ß\¯sio»™ç¶e)[¹xWÛH8rÛÖz!éíõ’òÁ…ßÇqØ–SˆQBˆyC`NQ¬w&tðq…ùr¹ŽCN9÷Öµ×aÚ^´×ÿèÇ! rc@œ×5§4¤a/kGm}YÖÛÛÛ}߉XU{³Û»Û}ß÷­¼{÷n]—£5x½\_^Ÿ?~úlnL´Õc\·˜ZkÌôöòüéóG"úñ~¬jˆÈ"Ë2??¿j·››sï.Âû¾·ÞÏç³;”ZN7§ÓtJ)ýòW¿º^çwˆx½\X„‰Þ.—ëuîÚ×yÞö£”R·² c¾9/×këmš¦CúBhµºÙ˜’»‡[×ÀÄÈ!$B"7µ½–Þú4df­¶1eBÜ÷öúöæ®Û¶Žç‰‘\µ_®sŒéöæÐMuÛ¶Óù<Ž£ª^¯Wí­÷E¶}7³}ßEä8톔ûá© œBèf˜MM[rÖ¦—·—mß×uDZ”¶.˧OËåj½»9¡a5ßÖ5$ÑÞö½^¯×bï&„Eu^vŒ9Õ¦îîn­60‡ÞÚÇÚ·ZÍAb0ë_th¦½û63 ÂD´¬KSe¢£™Xk‹‘{·œÇ˜DÍŽ¤Ö±+ý€áOþà7>~|~|¹"Ò˜ßý~ò{ð›|Í¿ûçë‡õþô»·ÿ寮ú·/ñ·Ÿ~õq…Qü§Æó`ddarŒ11c †Øˆ‰atºE4vS0G4"Qu–àjÃtž„úAŒùH²vµ¦UÍÐE½‘!‚©µÞk±Z«9™»!@7×c‚†Àn€d„.‚)J,BÈ(_”¥·f‡ ¡wÓ$¹ÙÒ¾V? rÄh€€_ ÆÞͽ÷‚¸‚012‚ºj÷/›$<@ÓèŽDê~Ìûèø™U‘È›v "p«¥r<€GàÇj(ˆ¨™#hÕC—JD©÷ææÌA»—~xQ’»;¸2" »ªš"àÍ͹”c`u â”Rïvÿúú û¾‡BËõ:Œã…Ú¶}š&sO1]ç+‡pw¿í{J¢ãDÌðööüøô8 )§áºÌã8®Ûb·ÇÇç1gu+¥Œy"€²îT{7–p½¼Å”¶}»9ßt³mÛonΗËE{Ï9·ÞEÄöZµ·˜rÙÊ0!…Z*콸9"#r-ÕUÍ\ˆ÷Ãß|ýˆlm1™j³šÃ_tüøùãíí©”’ÓÑ'ØkoçÓôúzí½¢CLĩš×ÚøÁpº)û–bò`½OÓ©¶>Nç²7!dU½¿»å#•F¡Õzww§î÷ww­ufB @H9™¹™ž¦Ó<Ï"²íÅÁbLÛ¶íûž†¡ÕST@òÃ0îþá«ÏÏ÷÷Ã0lÛvš¦4îp{¾]·Uâ\•›=¼{ÇÂû¶­ëªnïÞ½¯µ¾ÿpìHZk­fbv„—××étjµÇ<óº®fJ„§ÓY­·®™Cµ53E¦Ú»š.×™cÌ9×ZN§›mÛ¶u«ÚSJÄütO¿1ó7Ûóÿþ2ü¯ßõÿ鯿ÿ—öò§õ7ù·ŸýòX–u]·ÞJ/Õj9~qE´?=)G‰G4pO!GU)•RÌ æðîá¡•òôò:ŽCkšÇÑú¸ªÓ錀H_R޹u¿’Ãéæ”SÄ®ch¦çÓ´m›ƒ‡æeN)¿»øRD,¥ž¦)çÁT{ ­ëˆC”c1Žˆ¥µxœýî臘¾×Zj½»¿?œ${)—ëõþî~]·Ötš¦cº’svõ®é¨Ñöq×uržçe:e¯ßÿƒ¸cŠ1ãy:±H+%ÆNÞjSÕi÷RÌ ”>¼G÷Ã7%–Ö8 æ ®ŒìªVºÍÛ†ÈfŠ$—ËÞZ )µZÜ©©ž¦S3ûüø8NÓi<‚9jo$P˜km˜sfapp·RÊåò6Ž! “ªÝ?<¨ªDAÄÖZ[«Ëºnë2Œ# ÇáÝݽ™oëòôôˆã8¦aºöÃp~&lRH‘™cÅ]•cD‡Z‹yï­_—UÕ[«à0ŒCJ)a¦eÝ{ë—··Þ[ˆéz½¦RŒ!FÜËŠè½wÇñ€‡ Øko½Б¬w‰ ™ä°š„(òðî'?ýOÿ'ø;ßN7Ãå²==¿\/Ër]ç·¹_¶r¹ôº-½¥ó»ó7?¿ýíágÿäzó?L?ú”ßÿ›§øçß÷óØþÏÛ/ßÊó:ëõr}y¶ëózyZ_¿Ÿß~]—®s]ŸÁ ÐY0œ@F'ÞJÛj'QEå¢a­®ÀÜŽ3€;8š"*(;°8(YdȆcâ˜ÃpÊÓÇ@œ„EB ’ ‘Xˆ9H9º÷ýªeéev­®Ýµ»z-Ø«2€ƒY Ž]»ˆà1%DĄȒĴÛaB¦C;Œà@À€ ½”Ò8’Ùñ ¹›ƒ»“1€ûÞŠƒõ®fÄH¤Mc y^^žÁ,¤0Ï‹»³ àAp#Bv3 ‡DÝ=Ä0Ƭַ­˜õ”:† 1Æ®*‚!"n­ ÃÐ{gâñ4˜¹0·Ö_ÎuZ¶õt>àa—ì­‚ûÇï¸9Ÿ€Kˆ­ôÈSª­Mãx]æŸDbL±´êórUÕÞÕݘ)Lj]·²YWí½5€Öµµ‚ˆû¾ÏË‚@1¥išÜ<ˆHJkÙ)©êÍÍC­åÔ!‘éƒÐ‚H@3ï½§”rÎÚÍÔZkQx†‚"€#&@7û‡Œ§›Ÿüöoü—ÿô÷þäÿìááÜU÷y{·º¬å1Ÿî(ä­t° »’z‚q_¿¿úOìá·üý?~¦¯þêþ²Ú­Û´Ù©ÇwK'h¾—R´û¼è¶•ù²¯³·¦Ú»8§S:¿Oç{äÔÔI€’…i4 ‚BTªÅnÑ )pƒ`”“"Å(„4Ž!%^×úøéõ—¿øîó§—ï¿ÿüüúúùùéãÓç§çç§OŸ>~þüüòøñãë§çeÞÖ—¥µMÍj­µ¶VuÝ®óõ ¡@W0ÃÁœÝ( |!(! ;ºYGw!LaP3ÀÃ@ Ž&|¬sŒI¾¤£ÝÐÀ˜…ƒ„(È䪽uDdÄÞ›‚¶êÝš›O§ó<_¬5#\æ…˜ÝÝG‚yˆQ¿P®XMÙÁÍÆñcÞ¶Sr€”sˆ1§ ˆnj»ö1!H)µwuל‡Þ•„D¢‚õ¿’xa‘óélfËveÀa÷½!qŒP Mã©«œÖ˜½<½žooü¸Ìªê4Û¶“¯×9…ñPòj×Vº#ë/fÀ ¡÷B¨­Ä„¥{ë]ý$ «¹ bˆ‘Iˆ…ºªZÇ!ùùåùt>qLûºuu€ÎDL­”Óù\k‘ jêhÃ0Ř¿ÿøùÝÝ;TWº\žY‚u5€˜SofÚsÓÊDu¯çóù¸¤£©jûî»_ÖZ†”ò8˜ÛºÎµváPjMy8R+®¶¬‹¸ê'3gâuÙBL!ȶ•Öj’@@Ó0gÇñzç륵~s{B¨µà "µ×··KÙªö¾¬Ë8 ¥”u]kÓ——gF9ßœ»jž¦“šYŠ®‘‡qìê¦jˆÇÿéé9瘇áÀéTm·7·Ç (GÇáðÈ"3!ÓBOiPë€tìè{k"´RI 騅ÆB×Ëå|žÈ­7½ÎWi ÂZkÙûiLŽðþÝ=1NÓDè½5B4;ÖC\×Bе7tp³#¸r` ©›­ëRòÈ,fBTk=Þ¿÷/df'âZkïsŽ!ÈÁñŸ†ÐSÈ(ÄÄæ>Ïó±x+Û.""_O„8Mçc}8MÓ˜‡u]Q€ "0Zwwµ”†R{±i— 9壱üåJH„G(Gwg¡qœÜa[w@8N„˜S> ½}™Oæ!&7swù‡>ýÿ¯c ÝÞÿóÿêŸÿñ?ýƒÿño~øË¿ùøçýÃ_ÿíÓwß¿¾½­óV—ë¾–ÚZ­U[5…ʰ"å.o~gzøý]Ë/Ûó_|ú9ÎϧŸ?g¤Û¿=û7ÜL< FŠÚºj]ûçñ8¤?¾|û퇷·çußbJ)ÅZʼ\CŠù<¤œÖÇ×fÚU[ÓÞ ¥œnïοÿ¡6¦zì?k¡îJÆVtDn½îunMq­ˆÊ¾zHLTksØoîîÊ¥0º©aBFñæÝ †aZçeÛ÷qªÙýímíf µïÒÞúrÊéåízšKInAˆÈ·ÖCÎó2—½8ÐËËecï½”jPzצ]ˆ÷­9Ð4>¬û,!ië¢õJ1t³£Á°úBŒOOÏD4žÏPšPèÖO··½V‘P¶ù»ÏÏÿèwþQï*Ä]û|½ªNÓäh€p¹¼!SÝëëõíî|çnwww€°¬ ç¨æFPÛžÇñtQD¾HÊA·ZпþúëÖZΓj{üüx>ŸÇé$"Â4MÇXYMËV¼©®ËêÌiÈ[óÞë¼,ùt“fqW7|yy !0Å <°¨{ÎæWW3D\–ÕoóHÄ„Üj}üá#"JŒã0 ¡»¯ëòeô¤ @,q0pèÖU-¥ }Ûw9bJ¹¶ZJQ·h$™ÇÓtĶ}sD`!ôvà“º‚9嘖e9ÞÌLàùù¹ë—iµRBÃ0\.—²HŒUµõ–R&À§i:ŸÏ!&3k½sqj)ÂŽK‚„½ÔÀD¬·–rÎ9ñ¸  IDATs`!ÞÊæA¢h®ëºCÞ¶íîæ†ŽziäxŽèÄà®fàŒdµîÛ„Žàµ"DSažçùKìÿöðåIÓùÿèü‡ô»ÿBûº•——mÙÊõº}ÿty~™Ÿ_®ßÿpùÅwß}|ýü¼.óþ¶nûV¤KÝ6‰)ˆŒã×øÍ]ÈÜûÞ®)ýüã¯ÛÛÏáãðùÇ~ýŠo8óC>ÝDèŽPì<ƒ}|…¿ù¬Ä?þѻǧëËÛ… .ž˜Sä€í>ç.v¾9P+}ÞJÝûÜÐT cà b(ÖµcqÞœ®e.ísÇAõ¿áß}wÞ¦ÓŸüä¦ÿæWyLU?tU¬ûÜ/{ÝW ÀeëÞu¥ÕìÃn d½“ù^JÈLÀDdæ9 ÂÒT%™»7Ñf€<šw4wá!çª @Æ!'¡¥ÔÖJ--¤”¤÷¤¬›H<ºÍ•˜LÕw ŽàfÀÀÝ«öœGj­"dJ­â1÷ïÃâ¤_tBªŠdÄØZECäVûé4téCÎg:|ü8_—q<]^_`š¦Ëë 8œÏ§µÔ¾¯†žÇaßÖ£·ÅUµµÞÔÏ77—Ëõz½ ÇZ+JäÒŠo{·Œ$æ Ô@ RN×ÇÕƌT ²lË†ÌæÞêNNNà,a«Ñ äüüéc2"98‡À"µµ·§§¾îÃ0Ômë­‚¯}É)vµá|.ÚïoÞð¥«{×ÞtÞ·VûÓãóý»»®FàËòö|}½»ÿ–½÷eudwB°ÒÝ®¯ëº‘¿Vµ¯¾zX— Ñœp«uÝö˜£–özYnïîŸ_yÿRÞ×óÍ©•VKeÖ+"¤˜™Ä‹9¤4 Ѽ®¼—Îèû¾‡ÇqŠ)£asEƹZN㾕a„dÛ¶i˜XÈnnnö²=ÜÝ]×™Iʾ#³°äœWÛ­v&ÜZõ àNˆe«tsžÊ¾öÖ9‘í¥gF$±²Ã˜‹‡°Ù1ñù|~~~Š!s@¬®Ë¶æñ¬Ö%¦ª]«»kS!`­•$Z3? 4"M;VíÚ»¤lîÀRT10pнXs‡}]×yf ½v?*A)rkÇ4†T;;øÁ´p‡ÌÕAbwf®µôªzÊcï5„0 ›iëŠæ­5w¿¿»cF`„Ú+éVvtdëjb¦ƒ©«¶éöœ8ªj¯Z´\.—Ótj¤ÛV,G9ŸFat@Ìc…Þ-F! ¦jª„Ü¡–½.݈ñ4LˆhƒÞºº¹1{ï]ÍJAÄçç×óéô}ü»‡XN'9¦¿÷õÖíéùòëï_~ýéõ×ß?ÿðùú‹_~þ›_>}zœ_Þ–V{ß·Ìx3"ž«áVëéýoÊO¿vóyŸa¿n³Ïýº>ÁüC«ÚwKXj›Û/~L£¢+*;l§;½ó=c^¤4äeS|Ýk”pÜÇ» p˜«6PÜ}ïàö'ð¿ùéõîöö-E¢‚æ„xX½ª!x æhA9e ìµ!C²¦ ®­™!€gÆ®5„äL¨n)dbr÷! ¶\EÓÄäŽÚŠ$ÈÃC¸¾½y×1ƽ50ÄÞM0œÏçu_IʺÒåzõ¾ZÈ$DÒ1W©ÖÊÌ)Æétnµº;æö­qˆfF€‘¹¹Íór栟q›SÞ^/`%Dé± “VÍ9OÓi]gíÚÑk)1¦}ßÔœ„M͵ݎ·SžæuÙZ;ßܨêx_žŸyµ÷Pˆ¡N£Rí§ÓͧO h-U¯Û|š¦ÒêuÞBJ˲yØ÷líã8]ç9ÙÔcŠ­µ<¦×××ߟÆaÙ¶}+"L"­ö8DTÛ÷}|ø0_—˜ƒ)­ïµåaT’G'@%§;$^畃‰l- ©!š†áißÛ¾w„Óùüåó¨UéÖïîîÆœ?=~º¹¹c!DÈ9­ëBzy½ª+@ iSuèµ7@Ý ÷fà7··æ¦­ÍËŒ`§ÓM­­7eã°—ŽÞÓ×z«$D§3ª*8_ç}ÆlYVƒ„A‚³0€º·j,b†„¦î® ÔÓ0˜˜»!ÄÃÈ_œµŒåð+J8à e+GŸ™H.—Å’°6¢Úk †êÚZצ$Œ¨ëZ$ñ²‚9"OC¨µÅ½™ªrŠç!»™HX×mß¶Ö»"Z«DL{­îêhÈxΧÞ; ÷Ò†itçy¾2‰Tkíoó%¥änËõºmÛ4MyšjëyÌ­65 •ÝI«ë¾®?|ÿqž—o¾ýæýûw½; ˜vµŽ8„榵† „PJùðîþŸÿ¾'}óÕÝ7_Ýýg°–¶.ûóëúéñòë^ÿí/Ÿ~ýýó/~õÔ´ÿÿíŸ|ü|}½¬/—ý²lËÚ®siæjê†išöÖ·¥ôÒÈÕY(=Àò2 {5@ PP­¼­?ü ×xսΘêÀã4ýä†)Z}Ìîßž×›»;[Ì) ÕÞ½ßü·ðóŸÿÙðooÃ\Å¥ù‚ ìÀÌQ¬ 9ª3‚;l  µu5%L.¸QÛæ`nxdÕ¢£ö®ÈHÜ[!æ“zV3‰Áƒ!Äc™ƒˆãéäfêñ‚;2SëítYÈ lÝ×m_ô¨M'A$>Üety»ˆ0PWG7ä „D ööö–†ÌLL<Äa¯{­5MÙU͵˜¡õ 2Žš¹ƒOSl]Eäöî¶ÕÂ$j]Í“p,XÔ)ŽqЮïß½_–u»^熇ÚT{OiÜ·în§Ó¹µöº½ÿðþõõí«_½].Û\ÌìzB¯­µ›ª1ÎI­µÚcÌáééi‡Ä­ïå O¡ZoªqÊ{i"ҺƔ‘D–mõÈ¡×Úk“œÀ„%¥¢1Kï1„¥é®Ž”÷fZv"R’}-çónMŽ<ÒWß~ûøñ³šƒzs7‰äÄjýém!o^J¿¿$H/¯­÷C]çÄ S7ûæ'?nj‚p½,1óùæù嚦a[+ꡉFBX–L͈@ ÷ÞZ§€L`¨Å¼€"2å\]‰9ä˜%ÔÚcbaw3­{gäe[Õ k]Vf$RÇÄ ¬³€;a´v K AjQd,uäuYCŒs+«0Ç”‡Ú*Á¥„ymÖ›Ä8N16Õ†V¶²ìÃyÌæ[Û©!#¥Ì BÈØqßW$‰Bµö‘$jµ;IíÝðæöf[ÖRZéx#dwضͺA·> c #R3O)v³1MMÍ]}™—!FAâ˜yke±µleʉÒÐ÷Õd¯UÍHµkGƒeÙ©˜“$!4ƒj{Éà "D¬•½›ÙÍý½¹ûn9ž†£˜j`1ä$‚HœÉÌÅšîл“4wD¼½½}{{;´ µÔ}ßsŽêMõHå©™î­Ö^¿ýöë‡w÷ªÖZ?œ—¸ŒDz©}¯ù>*bÙw‰QÍìÿýàï=c c ïο÷Û__qƒÏ—ý¿ü¯ÿóßw³½ôe+—y¿^÷—×õé2_ßö­¶yióÚ>?]÷RÖâ—eÛ÷ör]¤yYÉ[­ˆ¤9õæÓé7˜Ÿ`ào&[nëDÛY®†*×Ï?ÊX·u×>2~sßöõØ~š¾«ŒNLÌ; ³$æ Њ:k%g÷nH`>0˜7DâºSˆrø+˜9Eêµ ¡¶ÞȉÐ÷m±<ºã¾•ClGÌfÆA˜Å )šˆ¬óbîCŽÄĂ蔲àâ 1g5`ÇôúúÖZÝkAŸ„Çd‘€IÜC ànH@ÈAö}BúúëA„„9ÐZw8ëu!æ=…àîåð>8ÓíÍöo½×4œr’y¾ ‡\Ö™ ‡œzW"¿\_§1aÀC”Ñš†/ó<6WÕnîÎ]1ÆÜ{ÿá‡O½·®=cug¡½î˜ˆsŠÚýÐ-¸¯yÔ*uë½–m[IÄ€ m{ÓŽtDSßë–!‹3™¶£jσÔZLRSw×À!ÆHÄۺ朶]YTQÖºkT¤“!_—UBêZ›õˆ¡¶s.]Є‘Hz5 ñº_>¼¿¯{i½¨¶Þ[ 1k!$ QM[7Ýö¥ìm¯MD”% rÝ·ƒÍÁ4¥py›]»»[SHH 6×Ú :Ê ¼£r:Ý ™apP3ÐÖR9 èB:ÕÚˆc±nÚ#G „}IAˆ¡¶}KãpptÛ¬o—|sF‡®-Åa-- µ73 ‰º¶}[t*¥ 0µ^µÝòiÆ}ß%§€8ŒÃãããÚÊAº¾^sŽÚºˆ¬ûÊÄãtÊãЋ‰°mÛº:P©eßkHÁ݃&Þ«žÏ7‚¾×ÖÕZ;¸î$ˆLU­uÂ$!ˆDîªÖ- !MÂ!Tí}¯,H4„”ÐÍJé茠(DÚ{ "ÚjÆe^· ³„hj9Œö’Í­U¦Ø[».Û8‚ûÖJб› y­]‘N÷ï½Öi/× 3ßÝÝКñ4‡°ï;„ö}"­Õ}ßB ?ùÙφa÷mßRˆ{mÈ3×RXˆr¬ýKqµ©™!þ~ü½§5mMoNÃñ'¿½o-ŠÂé<æ(9p­ôç·ùñÓåmÙæëv{?•}£Þöë¼¾\2í^:1…{+mnvÝVæÍOüù[-ïüÓmÚG\q¹NcfDxw{óî6ß üº–·Uq— ì…˜ÀÀƒxÆÔ´:š"ª‚sµŽ hÀè êÎQnïîÚ¾æ@B"Üݼmd'ãe/5 ƒ6 ÝlFv<ÔÔ!’³ª…!%7Û·Up*­2G`P;°®ÇÎZi€$öÚÚ8ŽmçƲneßS ÁÌ„Ù+¨¨HBàÞ*#Ó&ŠÉÍÌ™‚D$¢RwUwôÀa_–æÊ )攆}_{kÓùœc^ʺ,³¸ó¶m)D ¡m5%Æ1¡Ëµ¼¸ä`fö–Ó4ͲŒãhê½oÃ0!!Øu›{ÓÃU’sêHÆÒ Q´—< GæA†ÜªöÖ·e;ßÞG0pŽñåõíº^sžBŠ9Äж¶m›äÈLÑ…èØÂ©÷Þ»2å4õk•€ Æ,°”½òÁÙ’@FHh`T@Ü[‹‚„CÈy}­-’ƒ§iX®k7 v3qP]QHöy )Ç_^ÞÒ˜Óé„îc«Í $Hâ-c£ä9úüŒoß>ÞÖ:Üæ‰0 ¶±×:†" aP.Ú¶c†ÛX¿šæå4ß=<Pƒ„™y}x€˜„AÐ6Úœç0”À²äÞ«*ËâLÌy.ꆉ¢úpÏ,¹Ìàѵ…[ÎsÛ6R Bæ<q¸Õ­åT†j@ •4R™¤.†(r~˜Š cÂÑÕóÌè>4ŸïÔɬ#1'÷q~| ¢\rvÓ^iÀ4¹Ç@`a²P"W,èÆÑ¢sšÐuoÝb€ž Ÿ¦y^æ8MÓúzmÚ[k§yY÷í¼œ‘y_×­î_~ùÄ Â”EÊ4…3#¡Õ€!’Eƒ§S–Âê©àÐ P–Ræq"ŒºíUÇhCc´±­Ûó§'–üøøØTo·›¤Ôû`Æå|çMÍÕž_^OËÌîMk™çÓi!b‘´ï+2ù覶oû4•œŠ©&ˆ»ûûeYjï$ÐÔÍÂAHJ9OÛºšF)“¹ª»ª¢¹l{EÄ0‹ä”2ö^YzWDưÛe›Jd$ßšš…«F %â’’Ã8ŸfU+‰#ÂÝ[ëÓ<s’´×ªî)%óøðÇÇÇ·’ÒãÝݽîõ²7ïÃÆ]^ŽÿÖŸï î‰(˜)¡ð¡|’$£®:•ùí»Äˆˆ ÃŒSBƽïLÍ”§’ö½O%‘Hk픊ˆªáFþ}Þëá ®" µ—ëþá‡Ëw.¿ûôúÍ7ŸùõÇßþp­-6#t4$ÕANÃÃ-.[Ý[¯XRkÍG€zÉãç÷·æ?Ÿ>=NòýõüÜÏSª¿¾!ÚëOàõóõ«òüåòáîüÈÓ=O÷‚2ã€0Dr¤`‚Í:ÔŠ RºŸ'’€m4r¡"\ÒÔ{û±] ÌLˆN©„„A#%!0»n}*ná0IÖÞã¶J€œòù|ïfJ£ÞvÄ8¸u’’†Ÿ–™˜<€“ €¥œÍìòrém{âÄYÊ”%凇ÇÞto›êè£Èl®­©3´¶ªc°Hš ™·\rI%’tw:_.7$ ³)ç£[/Ì’RX c*¹µ–r¢Ñl6ÔFá8TýèæÄêp`Ÿ×ë…E¦”`=ÄF{sG댺÷Ç7ûË%O…¸S.Óç§Ï®¡€ûZ!àÚö,Y„†Zb©­ŽÝšî)ôxz}É‚oÞ|Q{[ΧËe=æ}[—óÝ^^îÎK ÜÏŽ>º†;çœK)€xH7(¥¡!T ƒÜÍc søð¶_Üô‡„Óm]ϧéõº Ñùþ1•cL˼^^N³«‘3 %d¡\扛:4í„ÒÐ}:Uót4Õ1”XMèpAßw ÊS?: arN®JI$BuLË€ª¶×=Iê­‘àáD³pSÏ)®ªišT ™Á¬œrX[sBâ½l|9°G¿Ç›¿´>z[­¯÷òïùýßüúó‡§ÛÇ«ÿî‡öËo/ÛŽÿéù{­×ÿP>†’1'@DOüçÛOr dаÀÿìñwÝbh…pCÂÜä ˜‡‚+ŠIQ>)þ}7inÙzIÍØ\…8ÏL1j7­Ì£t>ª¸@AHL„DHÃüh †[“õy@á tÎ%¦ÛH“PFRˆÀ¦‡z€ELÝܬkx…›rí”’ö‘2"(8â!®BDNn6‚X˜)Càíz;ßk; Ô²Ö (‘ íªìv8Í‘xHï}ˆ“1õmØÐõ¦oÞ¼›£§Dà@ežzí†1¥äî‘¶}ŸJ s$FÄ‹$TkŒåð å”! Xo‰„Z\J¯=Oùv»µÞ§y2õçÏŸJ.ó4O­[oãý_}øþÃ~[ÛÞ9Ë<-SÎIÒÇ>æSZÊÔh´×½µíý—_‚àëë庮ÌÐZ{¸¿[×õ4ÍÛ¾KJ8 Š\^_s.Ȉ$Y˜–²©æ”8•¡=B‚D˜(à6€3 °ëåÛÏmôÖ”8 …Ûº¦’›£HÉ6 öus÷6üùÚœ@„ò¦5% á[[…§}8àiYŒÈ†FDɹ¶Vo+@”2>–Ó,Lû¾cø#ͳ¤"€|:™CYÎ2MÌ"†™»!:–œƒ‰B¯Û ök]{ÿþÛoR™o·›¨ûÃRJÓ²Œ6áTN%çR G "Ú÷5å]õ‹o#/Ó¶ï}«–Ëéñq™&U'B–òñÃs*é4/á´÷‡Êƒååò‚Dórš–éóÓ‹»ïmº¿¸¼^Þ¼ `3ºÝÖœSJÉÜÜl¨V¦mÛOË Ð ñr½¦$½ÿHAI­½îf>4ÆØ†j"N% óºWuE@"ÉàôùùUµ 7½Ý®Ó´l·Ííé4§®DmëÌ”%õ1ц3wÏ’Êð1Ô ¥õIÁ࡬L´œ¦pßjG¢óýƒx[#¶aán ÌC‡#2‘ƒk‹Ë9¯×í˜lMSQS‡h­¹ùrZ˜é`ª—R¶í@K¦!Œ órCÌ]˜p¹;1îïï×õF7ÀÝÝsÎD„ ‡Ÿ`»®’ÄÕÑ=ˆI’ÀÿŸÀÿÃk [×úéåöíw¯¿ùþùëß}þ›¯øþóúzóÏ+¦öëÿÓž?OQ-µ’¬“9HŽÄÄÙ‰™)%`À¿\ï‡ N‰‘Ã|Ì,FQ¡ªs(* BÑŽÍ ž–SkNa¢ûH#‰¤”“ÏæŽª{!rWäd ‚y@€ tvb¤îÖ=#w܃¢·DÀ’ÜW"–ÄÁm¯ê^ÛnÖçi ôešµöÄ(sÊrwÿryñ7ED ¦„£kó–iÁpW0·?‚Ö%ˆPÓæD¦M‰31SI" )1€0„F˜[´½J€DòñtªCt,%bNát:mûž“¸ÚpݎůíˆH^^^ÏÓiÙÛúùwO½õmÛˆX»A˜Ù?ùÙOñדSf懇‡Ÿ>}þô9ç2OÓõv›ç™ÅÇ”dýt"LÛÓN OódáGä<Ï­w€˜R𦃑‚h™ÊemS)F¢ãú»î¶Þö\fÔèÞCk„µÑT E„»u@‡:1õ06:øÕçs©Ûö´ïoîÝ¢y»Þ¶×—W"räÈ)³¤çÏOêöîÍ»»‡>OÓí¶Ùñ·×išÖ+™jI($OÏ/­·`6'fp„x¾\lt×È9mëfáçóÙ<˜K–€iYÖÛ@§ù|é/#Ƽ̤ëVÕÀ‘XR w7’Ô†¦yI¹Ô½bçÄ)¥rZ€ñºmiJm]™e.eoÍ#^^.eš·mó€¦6/çOŸ˜ç% ´Ö§iZNg@C×uouŸçyÛûÝÃ# €sâ½^o7DšJÙku7Víuo€4OÓÛ·o[kû¾ ³Ò03·>ƶdI{Ýu¨¤i™OR’õNI€2`L9y2&aÉC2bPk{ka³a‰°›Ûh=¥ì@Ütdî½3é°}ߥ”eY,º‰€B KJö>R’1 ç’z ‘|ˆçiŠˆج°Ä1ôá:ÆÃý]Ý6žæpÞ:º8CœÎ'c¸#€‘ÈÐc¨Y`0…ˆ!s aAâxŒøû[À†^^×ßüöã_}óá/þÍ·ý«Oßþ!ø¨Ù IDATp¹¬¦[§Ðÿ×ÿZþYã»}34A¸EP°B sŒÈ@ÊáJhìA>DkbB AIÂb£3%SF5°@è´ä”$T @FO…]ƒû ä)ÀÊÛÞÀUȃÜÔAr™$ƒ{¸³»ùP>È´àAàŽ À`j1Ü( å¦Ã¬ ºùÚZJ)±LS´©Ì`1 Úiº?~'3-Óiï»nDˆ(ÇT' : A f&"3Ich” €…!è¨ÝKïayb7ë˜)õÞ¥ww?œ'fn®ÄŒˆµ×ùt €©”Þª™ú°y’: Ýs)¤ªN²ô®”dØ`åC…1ŸÎµnId>-cßUd_¯îÆ9 Ķ×\¦ù~®Ã(±cœïîöº+ t½¾¾¼}ó®;ŒÑÔ4ÀÿàËŸHJ×Ë‹ªÞŸN—Ûöþ‹/÷ºkÀV·$2•94Úè£å}¿æ<‘0'&FÈ¥´1DrcôƒÍ„Qz'eÔ ûzýèAnq¹­E½×a×­2Š:â݈áPûöÅ_v­îËù\æ Džž^óΈȼ¬»v£{ˆ€zäI0|ôqÛ«Üïèó§OQž&"È%Y„Aá’ ^^¯ØÍG_Õüºõ¡C}GD%!àí¶Öh{ºž–Yzi@`8uó½Þ€?|þÄÌÒ»êpÜ0%ñ@"Æ<Õá°¯ë4ÍcßC!åÔ†©ö<-½î7p& @,,0Í÷Ó’÷µvm´­›Ã'í½¶JDC]‡Ñr:…ÇV3@½V‹`¢ÓùÌÌ©”¡C»-Ë óédn()ݶ-ÜGoû¾ÎÓ)¥¢f¯—+D´Þ˜eš&õƒèª†ˆ%§ƒ±3Ís­½ÛØoUP^×ušº±xfl]AÄÆ¨µ3SpDÄ>œ0çÌIH²kB”áƒ1†!u@p.%¥4t„º$ ·J‰=¼µŒ€„"@ä˜R–Kq³Z; µ>2'£ŸN‹;q.?¦<Ø}ô¡jlÞ«º{Àõ¶>œOD¼×fã0±‡Á7È%ï넜XuˆP©£33D¸SÓR2"·Öþ¿°€þß_:ÆõéåÛß|÷/ÿòëÿùû·ÿâ/~õÍwOu××ëú®þú¿§ôwå×]î—ᘜI (<¹'ôäpBg‡( £­$,œˆ,1;zô@DT @¼#õS|š&&€a¤uÊÅ€(‰€AxÓŠL(,e‚8Êá2F`bÌx´3 Ì Â)@$Ë”9Ic0 Úpw÷p‡#J¯:¬S?m„A,Ó4 CÎ… jíÓ¼0§€ˆ80Î>Z°×' ŽÐÛ`aBF<Ì?ÁD½µˆA‡—¦w GDæbBäJm6†*b‚[ˆ$UE$s,S©­K¤Ã¨¾o›ˆì­ÕVç<é°©Víëe#¦ûLJƒVä[ÝJ*ãP70†ÂÚvID€”ór~¸oµ•2-Ëišga)sQ÷¶·ÚºE<Ü=죃C€C @èÓ<¿Ü®oQˆ‘B˜Ô-.—Ë_}•Rê­Í§EUSÎe*‰Ó¨•ºi÷˜–™…‘+V×ËkëkkZ»Ö6jm·½÷aûÖš™#æyšÎg-OŽNrí­Ö½LSïmÛö>°¤aÞj»Þn[k, c ¨uï­wõ"’éFsÓÑD’°83' aFÀp "öp4‹Ã/ˆÑÔ—¹EDJi ÛÖÌb¨æ< 3':ÝÝå29R>Íî\rN¥§äAœ×­¾y|´wc´.I8%Êœ$•2]·µ5S³ußjÕí¶ÄÝÃ=bÜŸïçy„?|<ÝŸöÛv:Ÿ‰}ªê¶Þ¶uµ{W¯ÛØZß[ûÞvu@¶Eò€\Ê GâÀÊ¥$”Ĺ”iVǽö­õ®º·Ñ5rYܡ־« 9ÏÿÁÏþx^Në¶!¦" 1T›«Z\^7uÿðñÓºï­)ZøLb)Ó´®{ëF)wÅZívÛ eÝZÕÖÿìþçÂómë—ËšeREɧ®´·è-öû¦@¥7­Úûè—ëÍ#>??»¹IžÄtøVëºÕÛº½¾¾^¯·nšÓäŒRŠî{­ÃÌA‡z $i[{~y-ef.ÓýÃýmÛU ™±Ìs‘IÍë> €HjoLÂ8zÿøÃÇß}ûôô²Ì³¹3ãÞzb.sƒ@2 "½ñá„$FDJ‰P€ÐÍÚ·ë‰Ñ#RNq¸˜H”ª†»‡›ù¡œZo›¹õ>ê¾ ÓèŠLLœI$ Ô­÷!Ìæ£$ÉILuD2šZ²ˆŒfHˆnÊÇî{(1æ\ÀÝÁ„é¶­æ>Nçeasë½’0#Õº€«©[Iež32¹ZÛ÷ãSç6–óݦj¥$d–pÐÑSÊa6Æ@DBF„7oÞŠFJé–»9%QUUk½gÉ¿ŸíÛ_ÿÕ¯þÅŸÿõ¿úw¿½\B ±dÿûù×Ü>ì–Ø°#1 ‹›ÃŒîä ¬âp¬a®HÁcüøvá0Ï\4Lƒ Œœéo"ÂéØñ'qbJáˆf}žï±usg@N$È­rïI]¥ Œ8Á‚l ” 4 Á…s*A-y âDMÓ´í}ô^ÊØïÞ<´ë:Z»{¸ïaûug¢ÇÇÇËå2Ÿçóét]×å4 ‹dÙV ÀníÝÛwm´ûûsí­µ}¨fÕeYž¯×{>Zéf¾”é`¨¸ƒpýüym½›Åõòœ¦E¿{~Îul„äÓrïÚ/×ë²ÌY$%iÍt3=}^Ë)o{'‚u]—27ÃàÐ}´½©©”6Æp&!¦ôú2F¯„x7—áq«—ß|ø 0—l¾|¿®Ûºn6†j "žîîr"©ê16`Ú÷êAïßøçË+ ç’vŒPoúéŸüüýÓÿêþîîÁhŠr÷»o¿»?Ó¾vNiÛö§ËÎ_}ñöá´¬·ë¦ ¦©ÂÝùáµVØwŒ  ™Jšþäÿ£Þêóëåóë‘"ú², nÄr«mýáI­…Å»÷ïգϟ_áðf—”ÜÑ8¶½¥ÄÂÉ… ¨^÷_ýô%%êÃAR®(HánH”{@Æj9›©+´±ƒÓ4ϹLc óX×] 1ÍË ÜÍÌ‘ öQ’J, 2ïè@”GÛÍ2š#€ïj PHÜ­7%â4%F4Bm5BÁÉ‘ ÔÔŽI£P­#Ôçenµ“;Ø̦ê<ÍÓhÚ [‡øsŒæ)•$Ü2à4Ïû¾Lrb„nèæÖ1pXŒÖ㈎x„f÷Æ”Ö^‰™ÀÀt61¤C´îú{:í믿ý«¿úåß¿ðtÇôn´ÿþ¿{üÍÅDÂxF0‹¡:0è”Å0ö`"Ã÷LpÄŒƒ8!\DO~¸G¦œ˜1úPæ¤Ú-4ç´œò¶îè–©0 2pJ)ÌÂÝkí\¦ À†cÕÚæeF?:,ÁAƒ³L=Ì=ˆ¡9 )qÆrsîÀHÌ®€ØûˆbžO³î«öiÎa£³°“‰èp¼›)C 8 H£9„ª0­[C€,i¸€{æ„Ì`êG¤WÍ,8fQÀ@ȈJÈHBÄн„ÛÞr1oÁ\˜Â¼ŸóTæ½n­jJb¦ˆyôNɼöNB"s·AA§‡;wˆ¦CR.Ë|{½2§î½í;2¥¹¸E* ïNwA„‰“Ѹ¼¼ì­šÙãû·n1•²î»ö>ÝÝMÓòþýûo¾ùfžæÇÇÇ1t«M$圗ey}}-K LêÁœùþáÍëËsš—Ä2ºŽ¡óTrÎáȹÖýÇDÒ4 ¶¡¯·KÛ±ZI¸ƒ%¦Ñz™Òé|gÞswê¡$I²¤yÚ§² Ü™°†'`eŠŒ„§4o׋E f¾\Ÿ-°œ¦õ¥[¯eB@LH”SÛb úÅÇUë¹d‡ûû¼\¯EL}ÞÚ€ÎlÊ9¥_÷*’¯»~ùþÝï>üI¾{}¹©^×]~ñ»‡ÓýÛ÷oùݧnþØô×/ÛíÃëÝ”ПýÝŸüWÿÍüí¯÷?þ“i 1•÷³Âóæàà‚a~^滹¼½›zïµZÿîùýãÝÝã—·ëK.™joC)öÖ¶Û–r&šGè‡Ï×/¾x£Áæ:OÓõòzš!RG×è½³L¶w%Õ³Ìä<†¦\ˆRÎóV·®œ˜ÍqØÈ)áAªÁHLYÀ1©[¼\7DrS‹·¹,½ ð‰0 H-lßö”Òm]qžgWD¦ççËzÛîÁqžæ>ôõõš“qW¯û^æ‚Ý gD*bÃLýøŽ3€QrF$÷Oß’ˆùp' ½V ˆae*$hffŒˆ—u;Ís ¤$©«¢ëCEä :F‘”„ùõz â]ÕÆ ¶m†è½±$Š0³ªÆœæ)×Ú âåõåñí[wŠ.¹õáaBÀaÑ}üžR@º?????½0zÄë²(í鿼»•TîPÛuS3†Œ€-“ªƒÐ¢’‡ÂL5º1 'd ""’>ªHBÀ֜ѤÄ\ “B’DÌð·ä£RŠÙ;®"$ŒÃÐÝL·á¹`·‘îÙÇØ; Í)ÝÚ)3ذ½–©lµQëmÎå²ïI8€ ‹ìµ!! 2(ä,ë¶©É1LrtŠL| ÑA‡ª@˜ÃvÈ%Q@Ó€œÙM±‡ioˆ„8ȉ3 åŒ@n†(LÇ€À˜Ù\¢uA´Ã__;–p¤£†¡­W4kÓ”˜Qµb3ãóÙÝ­G–‘çyN,Û¶ Õe^âG?8@=qÞF?ÏÔ–8…0€ÉR–4·ý(jÊ2…{€/sÞ¶ýíãÛÇÇZk„Ѿúê«ÞûT !;D¯ýt:mÛ¶,K rÊ­µyšêèÓÕ«ëí6Ài>-¯[¸„ròðËËuˆLi6‹Ïk=•Óôæg¿ýîÃë××½‘÷åÄŸ^ëÏúþßüê7ãûËã©áïŸn¦~š¦Ûöò÷~òö>Ñýã»õúËéûçkPü“ýÝ<‘9ìõõ§o–14 …ãÔž·¾w>þäýý?ûí¿u¼ì)(`)òñöôô7¿«=âT^Þø.ño?=¿ôö|û-ü/—L8ù|]=ü< ¶ dõPýÃàÞßM’¾þø7‰á¿øÓ¿óõ÷OSÎ á«wo—äñîí»?úû?ÿôý÷ûë:º?¾»[÷ŽØö}›Êôîí[$¦Ûº±H)™#KW óÖÔ_/ˆdnwwwDøéö’ sáúz¹¦”¥L“ÛCY jƨj„N‰$/gaé«™GJlá.‰}àºn¥f9tßó4qJ‚DñîÝ»¹Ì,äá‚©˜çáeš BmتªîJrĈŒ”DT‡+p3e$ c ‡½·a¢´÷fªS)Ì”’¨š»ÒÍw $WgÒhµy£ÂÄ⦀Ôzb³°¡àÐÕŒXxØ Ã1Ì]~,!‘ÔÌÍçåÎ-ö^SJäÀäèaé÷Õhûvy}VK׌ø<ýÙy¿Ðçö|>ßeé^kó mˤYx LäÐ;%CÌÄÁàˆ##Wì˜ \dÀÞ‘D ݑ Í# o›ý˜ƒGw6Çœsï]UK™Ÿ__ߤD®&,ww·ÛªÍ€É´»””Â[í`š9ÁP#€uDâÖ}Œ–J{ëntÌ¢"Ü RI½µ¹LËãÃ~½µÚSB`<ˆ“¢ª%ShøÆ!£ Dvl˜$öVâÆÌ¥”:N˜,L{Gfwoc@Äé|ª­ò´ ³y™RJû¶¥Ä}oIŽ£<2mûªŽŒ|´iˆðv»°ÑUPÉ©¨ëùt~€u»õZ—e­ÝÖ YÌý¿úÕýùßö÷«o—ó¹uÿîWßöÞ$¥ûwoàó§J*ŒeXsžÞ~ñÕõòÚ6Ý<4etZÃuŸÞ¼ýÃ_ýæ×w÷oÓ”/Š_ÿÑp,ˆ›«Žõ·Ÿþ­+.KI _®+?ã<¼ù§ÿæëÞû\äõiëj§yµq{ÙóÿùÛÏÝìÖ¾A yJDàètmã±d™é×OOª1g—o–ÓDüÏýC!y€ B>ŸÏ£—ùt÷æ+îß<–¤o>ïŸãTþáŸ~Iˆµõ}Ý?ß.õvímÜ/“Æ•9¶áf—¡!r2ë£9Püæã3 Þ/Eüâã§»eþæÓí²í?¹ö¯sµÐ_=]÷¿ü÷g/·uNrãÞ÷í«÷ïïïßÄe;ø’#: áåRÍuÊÅÛˆÓiÙ®¯°v#áª1aÛo+!IWוܾüò›o‡éõ¶ÿÑÏþNsYÂÄ-žŸo{UÂÌ™.µ°±Ê©œÞ¿Þj~]¡ní6ôéé·Ÿ¯ÿn>åu|-$ÿÉŸüþ7ýã©"äDæ>öžzÚ»Qçq˘nZ¯ã a68³ÚF_<ΩAêCÑc(ö5SÏ·!@ó<Íì]ïóüþ±0ÀÇuÜß=üñÛ?z§üþ§woß|åá¶®)MUÇ~Ûß¼{»m›7ýÓ/Þ¾^Ö'³4å»{ûßÜÝ¥eI%kŸ>fæ·wwi)¯¯ÕÛí»OßÚçuÿá‡o~íúNùÛï?œ¡ÿ½Ÿ½¯w'«žž®·"ØÐþñ_þÕÏúnüÍÓöÓwo.ß¾RÙgZNSB-; ôH’$!ÜÆ†&áI/šæ‡A(6ƦË|bb…è·=O%§Ô[@òh£"í½1!1¡EWWÆÑzJÉ=œˆˆë¾Í2Õ6È0e)9’F sB””<µˆÃt@¸Ž)eWóa@hu«e)}ôÞÇÐq*LàÃîKÙš¢cêÌ ˜ ô€ðÐÃÞÝö ¨Èi™Îf^÷Ý,LU‰†‰°µ)C‡›«#ä2ÙÐÚö0\–©µÖ÷ŠÂ)§môÑF`:è³èÚK)ïÞ½çÓ¾ï½ë‘/85î ) €Õº«êTC@æw$8-ŠÕZàd->í\¹7m›–%S>ëÎ]užë0¬ ²g&GdHUûUÃBH ™Ô²yÜîÖ±Ö%†@XD8OIDŒx9‡Ý¨©pøàƒ–eYæù8Û¶C¤%¥¤Ê„‡Ã>ƦjÍÅ¡¦£«5]§`DâæFRsjÙÿú>»y80‡Øví—o_^^ž¿~}0’’Ó± †ÎDÞÌð_ßRnšöá0 ÅìÚ÷ýÍþ¡o;͵jM¸»›šØä_þê«o?}ñÕë7 AAÙõX»þŠh8q©ÒÔyP¾u¶]HYްÜ_¿¾ÇEúB†¯&“‚»‹MË«€qw~U™‡ñâê‚Cs¼{Äâí;OÎ6gÇqIÇe³ížjŠÍê 5ú0MCw¸Í¸ÉÅȦ©Í”àöæ¾oÊSŠÝàjÔs†õÐ7ÛaV¿™¦r< ’ó0îÇ#Âx›¦M»yþ„®v›—o¾úè7/ºŽï^]oÎ7·‡›'móé'?͇»`áøøVš»7]Ý Ÿ¿~¼Ú ŸÜܼ¼{üàg²Àª‡¡iÆ¢‚Ý@­!)´ ¦ñÈA‘š.PM÷GtïºÐ6AÌ!k¡èZj¼Ñìó’WÃàˆì¨«qSÑÜMb,¹1±Ç#i;qw‘H€Bh «¹+!2q.ì²W-•ÀrÉÌ<Î5ª‰Èz·))M㤦à莛Í6•ÂÌ˲ Òñ8-yyþl‹Äi>öÞ´™¥/VÍ*iUõꦌ$¡S‡œ–œshâE‚iQ4¬nêjɧqOÆÒ2Ç8NÅØQó’€Ä «©&AP LM˜*q×ß/·cX×^ðA/ß¹ZnîírÖÃæœïʈ»‹Õ6ï6¯îïòRwï=?<<„¶»á³7/?üáoÍ×woîéÖZÇ0s½úÎûc]ÊþñùÙ³¯Þ¾îœJ]¦Üô¿ùúùöü!Õ4ÎÝæé±m—ÕqõìG–¬Ÿ·gýshïÞ|Âh¯^?”)®àû¯”íuw¾÷í÷j5rÙ<ÛÂ%¶< ›s÷šsÂâÜ4êÜRv™k ,Æ ˆKÕqylXLUµJà”-ÆÔ÷]ŒM*KÛs+ê0˦¦ÊM»Y­‰ØÐxÉ.Œ¨€®~JÛ"qu,È6'eatÔª"dMÛ3r)%gu·×¯^ï6gêàHj€„÷û‡õ°Î)SÄU»îû¡Ô|;Î)eAß5MYcרCE'‘e.(\³i¶#b“U™IñDƒB6ScChØLB`NÀŒ‘‘™„Í ©² „K‰ÜÐLÕ¡!R‘R ¹‰ˆ˜sÞíÎŽÇcÎ'>vd‰9犠Nooî–%A ]çPÄ@›HŒn¹çšê¢D2´ëî…è4‡Ê$ÂLn5;µ~ ‡8‘Ÿ@²P˜ÑÐȰ²i5²Ó’{µ Þ’ˆ#A"ÒêÂ\«ZÜDr*Vk®%p¨¥ ÆU‹Áq‡€a¬sˆí bªûã1Ä gÚËÝÕ21ž\»¾L,Ô‹šZ9½O“–[t">¥ð¸‰UU‘€‰ È ÐÌÀ­V74 "âT—“º“ ©”\ \ÝIܱVDQFsU"65%?¹ßÌÌ ªÕH$˜™¶m[ÍÈñ”w¶”fF -´®(xJÐaéû.¶!t1V­ó²Œ‡Cß­–\Çc#s5CðÓ ¢‘ˆD掄fæèª%Ävs.MZêÇŸ~Ú´í哎ýضMÓ4MÓ5ÑÒ²„sÎ)çœRéúöññ0M㜲°tíð8Jšû~»@±„5Î>l¾ûî“/nhsq­òå›ëÝÙ.ºßç/>¸~sçæmÖµ#ØRÚÕÖû³1—ÞBZÕOõæý§ï`ä¶—¢oÒÅùÅ<ÍÛÝîåxW›u¬åõW7»õYªùæåµ¬7?ýÙçç«¡ë/]§%s„ðÕ뻳‹-6ë—··Ð´œÁ „Î?8«oîÍy½¾xûõèh8;ï¶[«š—ÍË›[ç²§¬ÿöGÕ<Ë~¦û9‘ôóôðéŸüÍ_ßùtÃjqWÓ”½Ûm‰chÆ ŠQ\ʈJSM†äP̪“`RðTŠåì£:XZxš”qá{œÛØ"€BuÕ”rÒ„æ¸k[ù¦á<ŸTe® œ’™W3`ÄÈ aC¸¿¾Þì6mH„è1ö]¿m›ðöþ¶‘Ѓvýrɹt]ï øp8¼½¹3WÜ\œÏË2§¢¦÷÷÷ÛÝ®o[¨ ‘`: =œY$˜eÈÈA ÁÁ Y`upfŠq•RªµNÓÌÌ%ep?½tÇåŸæ˜¯¾¾IãÔÙ͉µPEý”ÞÂVšjÆ ‰ºæü铇Ç}5tG÷Z2SëŽíóC×êˆÀ‰ H¬°‡‘ÍÀÜãÐ-‡%D^¦°B YR‰!`²ZAIkpbÙÌ…¨ªO9wm×4ÃxL"ˆػ«ùIKDDf UÍ]ÝÔŒE„©‚i)ŽDR[ôZ0‰™Õ\±VP5dB3åˆ$4%­V™Å20‹›ª0GaDB¶‚ÈÀ¨IPM…¹‰WUpŽÈNè ZÍLDÀÁ°j5""0Us7!&F#A+BèÄêX4 W¯XG ަjZ2%ö\²Hèú¾ä\j ±‘بjIŠ`€ÌÝСH=eפu­Ž\݃4†ž–ôÕ›WoÞ¼½8ryqšð¬_™ÛRZ¦²hæZí䬧æã#bT›Sιì¶gñòâp؃SÛ÷Ç£yݬWo¯oþ¿¿ÿ¬¿…?5×Ü÷P¯ÀF$¨E‹f;1:,C@ŠæT0cSS—©kZS¦Ø4L˜JÝ?<£ª§UUUÿ €º¿{só0-S×4yT$pÐZ5 “€QEs€&Ê7,›ØÊºÙn×ãa¬ " ‚"&R020÷¾_)€‚#X4®h`¥sähA=Õ|b0±ðRsLyZÒ@dÌ"HDã‰cÈãlÕzOH,—Ú„8ù[é†HÌŽÈ´¤R;lO ž’kªiÞOsZ­–N¨òª9‹ Äe^’UB$;m¤š:€{ˆQ˜«š»£êX';-Ϙª±¨92ºZquD@t‰h^ /Å‘™¢*8¨;;€— Áô´” $À ÕNþ+#4W¨Ø 9¶ÁÔ¬˜PÃHA"Çè§áQશ¤™*›©Ew_–lU™jÍDTJ‰QÌ@Ô)°‘ÄØösˆSRá’2¸_\^^\>]R*®6•ÛýcÎ)Ŷëº~¬#1mûí~¿—¡_Æ™›¦ ã8Îó^k£nd8OãЭ9òõõíßýähä«·‡‡ÃR”¿ÿýï-&þŸ—œp׆¢ãåð­Ÿ|çê;¿ññ§_º6þà_¿|àËÝ«_½¦¦EèW¿<ÜõKš—iÝmaûnóx7\<»ç’rËñþÕMí†õ~œ.úUÎZS"‚öÈLÓÂ±Ë ‡ép6ëó³çíª*Øôø8-yµ^i1Nå|wöêöF†³‰0nÏ/¶gÇýåùùþñ^VCD§éü½÷ßÜ=¤g¯BaÛ®ÍÃë·oŸ?{~}wcû¸ÜÝÎÞyöòÍÝjXYMÇeýìÙ|ÌÍêl™Æ½*o·ã¼””V« õÛÞ GÐmÜwež‡J‚Ø„!¬Ý«—/¯ž¿ç®Ç2ï.Ÿ¼|õšXºvý‹/MÙ+º´Í¬ax~µ>7_~þ§ŸýÃO;ÈOÖÛýÆw>|ñn×4sN°¤bû®OÓ£4‘XˆežÆõз]ŸSÓÓ6 ;"ä’C1ÐR£4Œ",¥Z](LSªª­:ºU¶œó}:4±%~lš¶ï»@R4pZ‰H4¨A*e r‚dãÝÝ—´xÕRKÑÔ*0E’¢µVÕ@b/îP…ùxWë5"õ]/!œ8uKNV}{væª!ÈzwÖ4ÍÃÝí8-!W HÐ0«ÖeYª[;wd"VÉ™‚ 4^ëT³8±„VÄJ& l±œvT]«+š ™)„¶š™Ù2Ïྤ2#2z)¥NÓ„Dÿ(ˆÇ_}ü¯þ÷?}ss/LZ¿}î!® qè"!:Ò)ºkŽp0´ZïÞ¾%DDB@D@‚¦ µTd ÂQ„˜MM$"’ƒ3  8ÚIaå@D]ÛNǹk3µjŽÎƒ›9x;t©­ºÙ¬ÍñË\ÒœR^ívK©Hœç|êB1J`s336·¼,mÛ¢jΠÕHPÕ¹”ŒDÕT‹š#¹e2B¤o9¶ ‘0„ê¦fBPj5sóšR3 ‚b êžkM¹;ø)M€‚€fà„†èÄ'UUeB‘(!žÂßFôMjÜÜÉÁƒ 8"€3" ‰0à †Qɪ×\ª€wÝ0 m5CDU€œs. Ô|s™U b`b!p@”ý~Ÿ–Òvý‰CxgUM)¥R†~µÛ3ÉjX¥e™Ž#‰Èãa?Žã0 )es !˜#÷}¾¹×°"bl¥iïïü³_*ÊÛƒýê6‡x±}ñÁϾzøüë·Ïv»ó«'?øÞï}÷G¿õÛýó~÷Ÿß.áz—*@ñŸ!«ög¼{zÞ0G–žÆåþë׫õÎ-o·»›ùÐíÏþ“þülÛwçO/ç2ÎÇ¢¦Û³ËØö–½ZáÃáxyu)š b@f9;#ŽëݼÔ¹é:ÓêüBšVÚ®Ýl^¿º~òƒïÆc+*>ÞXâü¸d—í³§Çã(܃Ìd\ãîòª÷ËüpLîÝjÈŽÍzÝ®V9iÚ¢ÔÅP¬”Yõ8ψ´Ÿ¦(íùÙnÉYº&§dè<å:¥|w×6ý4/m «nµZ¯rZ`¿ j›~«sI¥nã&MÅBˆ7wç»+=–Ì‚NÃî|>ÆÛ‡Æ/κËßÎG®¾óêë›×o¯ÿô§y}}½Yí¾õþ{M ¶áÕf rp †¡!檦N)gîúVšÆÜ…Y¹i»ÓÞÅ0¬VîÝHJÕØmÛqÛá¢ Ž¹Ô)ÄS˜æ|{{{8ŒûÃþ8އq<ŒÓãã~™òqY¼zÊu<.H2NË~¼¿¿GîWýjµîú>0‡Ðªº0«yÊY$@1etOi ¡©jÓ4MÓ(}Ó ëæy4³Ãþx<=Æ@ÄjFD®ÆABlŠVwŒ12SÉ©‰¡Ö2Yh""³R1·(ŽÁ3EnMK­U\ÕÔ€8d­€¼,ɬŠ0"¨Ö\ 9À?ÅðÙÏþðÿü‹ëëGa¸»øîv^õibƒ03¸ Ÿj;œ e›–˜ê´ŒãÜ÷ ¡#9"1# ‰˜IµÖÅÌB`SgáR+:“škµV¡‰]­E«…Fr)! BB 9¥TKÓvJb –R¬¨ÆÐÍ]ÓdÓ“B´ZÝ‘͵šB)š«v]ïªNhjŽ® ˆd ~‚°©P)%D)ÕŠ•F"²xQ¡% D2<ãIHÌjΙR­fF%!8U­µZ`!„Ó~3›»¹2:šzfÕNée@&&`@BB6ó äHŽÕ 99š«ª"»ÓI ˆßÀWˆ¸º! »•RÐý¸LyI&pb ãÉi׈x©µê’ŠWc暪¹¦Tú¾!¦Xróâæx·Þu«~žæeI5×ižûƒ˜k.eèwÆy³Z5]'ë21œÓ2ÎS5Øõ]·¤å>þô‹›ôÉmÚãf»»’®»[&S;ö‡çüðG»‹o5ŒÍðÉëk¡°äÇåé»ïNãrñôjžëÙî¼}ï»Ïndè_Þ_ïÖ»õfÛmWZt)åõxwyùìùùÓgçWËËû¿ýÅÇçÃî¨Å œïÎö{ ᤢb¡`¡h±ªÖnÖI ̳–ZÂj¥Õû0s7‚ÈÓ’†n¸x Ší0çtuyuw<´NAøíË7çÛíÐËý11X±¾íæ”J-•½Û®«Z&à¤%ç%K))C†ãýaøþ{9TÎ9pV¯ŽB÷×wßýð»ŠR>ßÍ57!6][²u}¿ß¦e M87çç»Ø#Ô§M¿êûª5¹vC‡m;ßìû®ç™/¶ó4â¢5eF1¡°êb…‡þ[?x÷é¬w¿›Ÿ|4Ëßüô_ÿßó—7ÇÅb'ðd·îWˆ03 Ç&Ž À±·RÍÜÁÉÍ€±äLŒèRª¦¦¦ÕN£(bfÃÐïÇýt„*½i›6v€ÄA†a=¬WÄŒ,]Û a MÇ1ÉaœJÍf›x9ç¶[]ž_6}gæiÉ¥¤Rˆ‰Ô=PpD+f œÒ¼Û›áñ¸Ï¥”ZCl$Äœ³™ÍË’ó‰\P»®Y­6$ÍÙÝ܉ ix̹ªûÐunÖ ƒ;¤% ‘©Œ¨UˆÈ„jUD"÷oÎHr"B$ˆ!a×´MÛÖZjÎDŒH'=e?¬¦eùµ×W¿øû?þ“¿¹ÛïÕ1ÏËÓ¾^öBappfŽÄvr2#8 ’W'ŽŒD÷oo90GDà HÀ,1F3pDl›ÎÁ²˜93WUÚlvûÃiŒnf1R»ýñØÄx"A˜…C`Ûšó’RAÃäRÌjJùþáaž&f.µæ”R©&®pê»Tr«õ*ÄPJ]Jq7&¦“ý`NYÁU«ª¹ƒº‰ ± 1!cu;5…HˆS-ŽnÕ ÌàDœ&–ÓÜßÁ9°„€ˆîfLßÐ?œNÜÜN~qùÞîù•åúpî.ŸÈóÝÓ÷ û/¿¸¾›õÍa¡~Mgú~ïG_½z³_Ò°:úõø0ÛTLkVs.–u= ‡Ãøx8`µu¿Fµ2Íï<þõíÝåååY\• }æ‡=3!¸Wv»âq<¶N¡3îÛ”K0BÂÍæl<¤Z%†ûû{rØïGª€ }슪=Ûø1÷}„̱æàDûƒ6M“–Y88x^j»Ú즟nx.l6Žm×'PWE ÇqºM ¤S+íÃñ@1D‘>v±ooîorÎŒ<<8±¸¹ˆq!ĸÝlÑÌìÄ E@Ž‘P¡D˜¸:´¡ ±íû–˜Ý±š’ºe=Ñapž—oÂJnEZô_|úæ×žxÍ©‚–²ÞÄæüìã×ß½(äÅL–’ÑEDNƒjƒPÕU]5â¶ïVg[2Œ@jNY±%BpÇCJY«sÇ^¡Ë¥R.)eÌã‘ ± 2Ms×4s)‘°K™ÔUÁ¥º"€²Ds"£ªf–¥ K. ( '.zÒz\¦(Ͳ€ŸÊnAwC’”  h­A¤Ö¬jÌ ˆZrÍùTUU]sFFG:aÁ™ˆÕ½V#&FYòÄ h'ôƒ›©»#˜;¡ƒ+!£s PþmçˆÈBŒ€œK2`s#’”:ªZôh£07LªNˆÌ|""¸:²0Ä1%Âd½4j`ÕÔ§9QZ…¶mU•N ±¶mCMK)¥$¯hHTs­EEØÌ¬–âÔõ— àó4æûcADH˜™Ô¼úØveÉ Q8’0e¡Ø"rLB–i6ýœA4ftdC^æôéonnæÍùöù÷žýýK=Þß7Ýúý>ân›»0ÕÞìž½‡û~è7gŸýfØl~úñ?âÙî|{ñöáÁ\â°XUªUWÍêr=Ü_ßQ”¾iú¾÷ï~ë[·)YÎv»ÇûÛŠtv!äEËý·ý|“Ò¼Y­qûô¼æ:Ý?šŒûÇÍf• æýqsv&H A@®¥<éV¯ÁÓ¡tm·ß "í{4Â!t¼&Ä×o^Ÿ_]-Çc-¶Ýl÷ûýv³e„»W÷›Ý¹»¬äæíÛ¿ýÞý«ýn½Ö›Ãþ±_­ÝJ¿úÐT÷J:/©[­‡#~z~us{'!lŸ\çiÕu,ͳ–qÕ ‡šeÕõÕÍ´d[uÍ“ï>õégßÿáoÞ~ùº]­”ÂáõlWšá³ÇÛ_¼ü¼ßîòT»nµèHAæÛ}Ø<<ÖéÀa÷æeXÿð?û­ï¿üãÿëÇ¿øÛÿþÿè€?z÷»ÿü?ùa—¶]Å.MK%d9Q†žº¾5]/ËŒê¦Þw1pHyaŽ¥O%­wf©^ÀÁ‰ÜAÁÍ ˆƒ©›Ææd<ÌÌ€ÜÛÀd ÌÈD§{;#Q®Ö1uG§qAAÁò8!º+¨19àqšÀ Œã©¸©ZßwZ}G‘hµV¯H´,³p4ôS±63ôSﺲ3Ï¥Ö“òÚ«§qAœòþp¬)«Õ’³o·ý0ľoºˆT5~¼½ãÈœ‰^~õöo>¹ùÉ?¾š¥ùµ_j×ÿøÓ?ûëŸÞÝïYBßðço¯ø~Û95æp _œ”à¦ßÌÀ ÐršO÷n¦ÓB,"±p@4ËZ« ¦vºƒ#KȹԬnØ ýãá@AÜŒÌ €ŠÙ’JÛF&F„TsÓvÇãˆèT— XdΩԚ–…ˆÌª»«w$$=Mh‰à@ˆ™›º; .YÝaYò©À¼,U+€ƒ£™›8¨9!£;:"‚£Ù7ªÈjê€ÕÌ¬Š„“"˜™N ("–àÄnÎLtÚ %,¥º;æ”ÉÝ™Øà´4ŒPÌœà´þ€¦ªˆBlîD€D%CmƒBæH§!6cñS†­T"$b@T«À걉mׄ6¦yaƒ¢Ê€‘YˆÝUˆR.8Žã8Nàb hB\¯×Ó8¹¹@ȹ`­õô5 ¼Ô\s5SpТ)U«U«"ã8«£æâÔ¶¢¥¼}û˜ÞïyåÕÝôélmÞ­®vWï=SÛÝ—4YVI@ äìÉó¯Þ¼™³rhŸ}øÝ»»GޱïW^)ƒRä«§Oö{Yµ÷wgWW]וR„ãëW¯œñåËW¯¾~ÕJC,³Û2gÐV«gÓóíNúîîævÕÀ8çÈÍñ0sU 1tÜVËÞ4SYV½‘n³G#ºyܿ؜µ1/E‹g[o¶Hˆq>Œ‚Ø5]Ê¥Yõã8_],Kj›®ºëë›íåù4O›íæaœàâìbÕ­:ŒaJ©mºã4®š6Äð8O²¦Ã±Ís:¿ùüÍ£µëwž¾Ø¬úÍæâêâ’YÁM)ðf³éº®Ô²¤™rmY¯z–PÕ BˆD%H""§¤‹Qõ¦§–ˆ›;œršÞ+F°yIMÓ`qÅ“ܼԊ@µ7ÐRjÊ$˜K]–¹kWÄ ÁÛ®U‡SŸÝÌrJjÎ "2¬V§qÝq¸zž–ÙM“–³ÝNPs%¬ Y­IN1nÇóÝÖ†îæávfè1n6›´,¹”)å¥Ô¾ëÛÕð8Š=¹¸¸¾¾i¥! KJï={ñ¸ Dµ”¹€·}›S9¦cˆ¢ˆˆQpÉëvõ¸ÌÛó32·Z‚¯È/.¯wûíåyžÒÙú,–i}¾Ñj@u»9{ÜZnTÍŠæe©Es®TL™ÃÐWÆnè½hÛö¥$DÑ¢Xì8ϵ˜ª›{^–ã’sØvHÑüôÅÓW¿ø8Å'ïÞe=ûîï^}û_ öýxùþýÒ|ùúåßÿòÇÿÛ_þÉýù¿ù‹ñÙ¯>y˜8\4CÓ^žÕZ֫ΰtQH(´M ­ºõë•£›C×6sYˆÙµ~“â% MtD`æ¶i¬i# U-Ã00s© ˜µ¨™1„Õœ8”¬¹ä%ϹäR•„‰BDp¨ZKQfqT34G$"’ MÛ8RUӢȴÞnU¡VG’e©±iˆÅE2§·9¶ŠàDê˜r]–²¤r}}—²æRK-àBŒÌî84mÛ½¹ß?Þ?Þ]O‡›Ÿüüÿõþ?ÿåþ›¿ýòøþ‡/žþà£~ï£ßùínuök·€ˆ†¾ßl PdÜí>~ùð;ïÛͺ%JÞ·œkbk˜ºppG+U«*„M=—C0²ªzêÎ#"Ÿ2MN¹*³¤œ±;m¤ Ru¯µ41><Å8\?Ü1¡H@€á|½n»7û¼,µ¤õfkÈg»­M^fK»«ó!UQß“2%U]ìêâ\i)Ó²[o—œ¿óÁ‡77ooo6M¿L{º”—lõêìlÎY½÷ëÛ›a»ÁÉPpžçív#óÔ¬ûûÃc5S(e…±íÚÀ<¹ÖzÜÃP—º–Ûön»mz8D¦~5,ã{ž§ñëi1®ã8Gr þxwÛ®šýá¡é[ÕÛW× ¼nûûÃ¡Ö @ÒÄwÞ{z{s·îW‡£›r\¯HØÜP–ÚµKJÅŠª±FÇ5­>ù‡_|ø½¾øò««¿µ–æí›·–xûÝß÷Í š/¯6›íñ‘" )¾yÓ,·÷¯ñê‹?ýéáù*@þp÷Îûï¿øÝ~ð½½/juYò45M+ùX+rÓk,ÝjÅ‚PjdišFU…Ñ™%•âFnEÖk³ZkE\µ]Ÿó235Ò„hFšœóœJí‡ÁͲv&Ðz¢yW¯@™—œƒIŒ½SI9·mkµj-„nàMC'ˆeޱqV£†‰Y˜S™«ªºÓ2ÐÑHÒ”5—ûûÇãᙩ”ê,ÔÄ#öÕk`áž}hZkšÕŸÿÕOþ»ý˯µ|øìwþàŸýÁ{ï}8{vüɯ^6MßÁ~ÏíßýÙõßüË?ü_ÿ4›‡Fš–^}þÙo­ÿìûgë~kê²¾OfNè쉘€ˆ=§|;g%À¶ L H1Ʀ‰1ÆšÃþCŒÂ²äEO²m÷ZÕMµé›&6Ó4YÕÐĶZJèäo^½Ùn¶mÛ‹H˜§1—$pMÒR¦4YQ'â+‘p?)6ÿÞޤ׺4;ZÝûîæ4·ûúè232Ó•Î2*ËØª*Ë  ƒy‰1sæ 1BBL@ •„€’ ,!ª(—1.;íÌŒŒˆ/"¾æö÷4»yßÕ0Ø÷KdÆIÙ=çÞ{öÙ{ŸÕ<ëYÏîÈT-ÜŒ…“º.Ì- 4«°ÐäaÙÊ€Z=ÌñƒƒOLãÀŒÂyµêP¤‘Ôä& ¼ÌShk­îˆKé,”EÌ,!KZüé…Î(S±ÐP7EÆþ¹2 ÙŸ0‰„‰1ÀëTÔ¬•Ü6 IVU¢H‰Rn‚RÓ!z­žRŠÅ¤"‰ªši¿Ú ±ºÖÇé7,è 33£ b-ÚtM™Š¡‡:g7/†¹åñ0ižœlÕlâ$"Âb`žZéW+SŸ¦ÉÌL=%9ŒC0Íf†hóP§¦ã·oövÝêéç«§[u2lAùüI„ÈÉÙå7WJHëÓ'(y𸿺å,,¹[¯únóÕW_žà=çÜ÷Çýþųçï޿χZšäQðÅ‹§ïß^Z™§q:=9ßž?¿¼½}(“WõÀ‹'§7÷§çgãýNúv†aMÒùÅ©NSž¬;=ñq¦,¡€Œo¯Þ¿|ùòáæ¾?;iŠÇéÉÓ‹w‡ýæÉéüp¬óÔ¬ºry·¾8…‡(i7õÛÎU½v‘+êíåÍéÅi·ÝF¸†÷Çkûb$ Þxu<ONN¶«Ó»ûÛûý]+½£wë> § Eèp8¬›õ«O.®ßß'âÃ0™Úa8®VýrgNãàJÏÎÎ/o®rN97»Ã!åtñì"5yxxúâé»ïÞ?99›†q<‘h:ÎSXîò|¹O§›òþ&#u'™`7_¼zñõŸÿÙËßû»§ë^Š×Y/¿ùný죻¨ë”ÁT·¯žíÞ\âhØæá¡nÏžÖ5õÛ-]ÿÅúÏíõŸ| |Ú>ûƒ¿÷“Ï^|üt›êƒÇ„çç§ó4/‚QÂ\sÊ„H€Äئ<ÖjVJ-)§®kÂ,ªYN™…C5"¬j¸Õj–%—i$á&%s÷ð>e³@\Œ €¶ËÌRÊÄL€˜%±$0E‚å[‰àÆ’˜pžK€7’Ô4ç êºL|ç2ÏE#üî~_\o¯®Í£IIÕ@Š4]ßäœçyFŒèÚRJ]Âu—¿¼ºû'ÿû/ÿÇŸ}pþïÿÑ¿“ÏŸPÞìîJ­)s“R)µíVÃ4ýÀüíßü·ÿõ?þ¯þ›ÿéæîaa0’.¿ùúß|V~ôê¬iš~}š¶'f`nnŠnˆ0Ïóq<Ô±†;17‰)1! §œs’œS"¤q <å¬fjî¾ÀH¡îª–s›2{D)Fl7'cÁ‘û='Þ¬6Mj(Içy.9çXŒp­Žã¨ê„˜›\Õšœàñ|`€Í5,&-nžSBNî*L€ásƒH"Ì<ÀÔ"‚( Qn3 I@€;›k-„ؤ<Ž03à¢fÈ,- "¢e±00‘EqAUMku0spƒ0DB0XÁ‰11{­,aµZmûĜÂ%RDJœ"<õ:bb!âEM‰€ŠV‘ܵm j)ÈÄ"^JÑÒ÷½Y ‚×j@PkirW´±A$i,ÂÜÀÕT-$gBTóu·§,ÃþLVÁ‹z ‹ð¬6W«µv]ëŽó8а#»Õc™~ñíî—o›ýú%žl›ÕjœR·jÎd{zº}›W'Ýæ´:Ö¶½z{urq6ÜJØæ6¯V}Û|ûÝ#Hòö„Ì!¢šNÇ‘sêÚîå«oÞ_Mó0Ö¹e.µöM íß¿xØÓúþv·ÞöÇqNggg×—ïë\Ï·[nRâtu{W1êxl¤=¿8g€7Wo?þø{oß½qð'/ŸïnïÛnåÃH(¨‰÷» ž´ýLЖ¹ááÖt9¥†KU Æ®é‡áØôíÃí=¯Ú®ëÚ’`ºz˜C ©Ii{röúõWOŸ>›Æ¡iÛ¶íoo¯™8¥Ô®û:λÝÀ{érßÌÃ!ç\¦Ê)!Ænwˆˆ&‰Wmšþêææüô´Ö*)OuNÈÑ$Özr¶MÈ·wB ]N×·7¹ïÃèêáдMæÆ!$æZ7§Û«ë+&Ül×) ]µ èçúÿî¿ûo¿½¿]ûü³·W7ç'gOŸ^´§ÍÝ»ÛïþòOï¿ù³Ãw¿b½ÑiŸ»þGŸ½:]÷'M÷òÅi³iO…3µÈèàj-aÛpQ3›% ’X©ëu«"¬µ–RúU/$ã8“0X˜!!1óãÌ J©Mf÷"’,„fªÞtÔX ÎÆÂ‹OøDH‹[%ÄjµÎ…n\ªÖj,ræ©êq˜ŽÇý4º®ÉàÐti½ÚLÓ@ Z£i¸Ím©*‰çêz²no¯/ÿäÿø³ÿõg»÷%>úìßøÉO~ºÙ¼b«ÝmË’“ÜÜ\o7Ûj¶»8=;sÀß@ðýýŸÿoü_ü—ÿßýù_A &ûáw—ÿ𹞯º&µ©•v}ÚnNÀUÍjÕtž{5@BáÄLáI„91A¿^—ivwU#¦…²n¶(1„©21ñãdùpدV+Ä(³±0AãªïD¤mZbZÜœU= Žó<—âMÎD˜ÅÍ€ÂÂ]ÝÑ—þ0Œ0!1-«‰ X#ÂŒˆ~-$‹B¢Š@"’r÷Ü4¸lº™›/6¥UU°m’Õ<IˆPRjSPÒ ff4bYJͦˆŠÔºÙä¦fhÌ „  ‚"8QºU-)C[+è93#cÛuÀ)-”Ub`N`îá˜s& &Æ6µ¥Î‡ÃN«æ¦3SD`¦Õjµ0W%gSGb3Ÿæâîá>iX¤5\„%å¦i«™ÖšsZäûÊ\Á  ±š[UviœÔ}šË±ÖׯïUOãä‡Ã<Î$´Þn·ÏÓT¼ÊSÉ'e*VMÖÛ<‡|ºÝßß÷ëÍ0L„Ø=;«·G 6ðùxTóœÒúb{ÒÝ]ßÜÝÞä&¯N¶g«õåõ»6¥¿üU‰ÿôçÇAÄ6·µ*¦&CÀîá¡ï{U%¢”a±k -6D€ä<mß™7 t”òhóí„Q*&Hf€I€¦D@R „¹‹"M áfÐuà  ˆÐu  0´ iaž ˆ È Ì3l·0ŽÀmÓ" G„çÏãõk|öö`Z€"@€ƒ9´íãÛ!‚;4 ªÁì÷'§§¡ªªšSæ”|áê‡q½^›UUuUIÉ̘¸ªŠH­5ç¼ÜÓ4aðj½ÚïvÛÓí4Œ)¥¶i"TՎDZis&&/sIMN²tÞ E!b®åâÕ“ÿèýçÿÙ?þ—ôoýë'Ï6§Û«·os›ÚÜ ã mZo6óa8ìwDòäÙó›ë›ß€m¶ŸÿðÇô÷¿¹½Ý}ñÅ—ÈÉLNú'ßûï¿zûŸ?ÛÚZ¥ÎóÃõÛn}zöôyÎÇa?C­Éè ¶˜!€‡¹V'š§9Ñ)Ü]Ý!™“dÿ £‹Ð™‰™„íÑŽ„ŽÃÐõ]Ó4èaZ,"ª.šÐà ‹ü€éÂÂtu¯™‰–Yw#wu"‚p7wFª®hX‰¨%¢Å„¥MÂËÜÃIÂ$ …E„‘ƒ5}æb‹Ü¼`EЃ†WXæ\p`ÂS‘š²"K¿Òp«æ ض]nG ˆ¨ãe®f£•„hÌÈ UÉqš¦œ›ÐÚ¶=q3ˆªE8%b67I)¥–k), €–ÅÈ$Â"n^‹‚aÌÇ!<4%IÕªÕE’ä4•bµ ÇaX¯7ˆXJ€õj5ׄì¤ÕÑL•Üô8MÇãPtgýêÍîÍaÕ~ï·µïæ[꺣¡L«ÍE–‹óµSjrû`û»»»ï}ÿåÝ~è¶Ûݻ˗/?~÷îmbùøåGßéx}{{~ñ$??¥+øÁôöëo†Ãx˜&/ž>›¢¾üøÕîòz½=nï éìιë@D†¡v}·j@z8h.Ù=‹°™".T<€”Äæy€œsJÉ=‰òáp@¬ëuc†‹éù8Îm›Ûv{¼?3©FÎyqep'DT%f^ ïÆÑº®ç."ˆ¼ëºGdr)5µV3*¥¬×!bžÛR´m‘À,-ÜÜq€Ü¦R°/2@I¬Vl›„Œ··¥ë»öaÿ°£óÙÔÚˆY-LDDKÛ `š§iñG0f†²Ýf$šç™HƱÉ;^­WÇAŠ2í‰QN/N§qÒZ‹r܃HéW+ÓôþrÎYr&`fw_¯VÃ8Í¥Ô¦¹GŒ,²ÛTKß÷áînMnJ)ˆÀœT甊©.ŽÓ4õZ+ õeéûµª€ㄈã4™[’„HW7w«Õ*rÓìöÇi®"2 Ãv½¦fµi[ŒØï÷á¶ÜÏ)gÕyGwGĈ`æyœk))ÉûÈQ.ß¾ùÕßüõ<À‰XH32BÀBê_nwSD3gIDTÝoG°a*ó\¦¡ŽyÕ¥ÜÁ tuD\ Î8ÜQ’šúÒ´vm»ø£ªjJ™sBD&ÊmKÌ ,Ò%""Df–¦ëÚ¶!â©VaAâR½šÍ³ÎZÃ]˜ ÔÅF•«Öa‘(UUÝ’$&6°I5ÌsÎã8½þîíÍõîên÷þæöþXJÉúì·›—Nt˜¬BΫóÜo#´ýv ŠîÒ­VyE@mß¿ß]#¥p^wën½ýè£W·W׆4ì®zþôIË“íéW?ûåÙóg¬Ú´MßõVªÕÚ$aT{ùÙ«u›Þóúýð_]N-@ಪɬªhæ‹âŠûcW*"DTJ€¶m—gJ),„)¥qœ–Å:"Z¢^) Kt63÷…J P¹üÛEͱiDlš¦”rrrr<—ˆ€ˆã8ªVfw'"3K"ªÚ¶]­Er"D¦±kšZ D<Š*NSÊÍ4 ÛÍÖÌŒ(ÉÂÙ«s™K1ÕDZë:"ôG)X‚$ GD÷0Ó¾oˬÓ\Ì"çdDì¾0–célbQ/ \Ž6¥Ã0äœkØÒ-²y‰9%çân9å{af€(ó䦖³ÔjªSÓäR*3»Vá„ Zµše‘ÅTo ÍËY€qœrn‘i.¥ëúpE$f–TU×ëM)£{pJ¦ÛÍ&8%ÿpQ£ÖÚ4Íápèû~Ùi¯µ¶m‹ðØ ”RƒRjJ©]שjÓ´æ*"ª6sÓdDxô 7]n¤ån€ðżÎzú_~®ÿä¯ë÷>ÿÞÃõîäâe¿Þî‡i?ÕàæüÅKÇtsPâ±øÝà ë¦î7“¥9½¸x²NUíöá0Î¥TELHt²>áþôO¿Ý¿Ý{Æ&¡c821S ‚›¸ú…€0¯ªKÆFA@Ðp ˆpÇÄå¾Ñ3wGóÿp‘ŽÐjH˜Y¬àÔUÕ މ%¥¶kèÑ* A˜Q8% "Ò£h7S’ÌÄH¼ >ËVy’Ôä”–p—óªoÖm·îÛÍfµîÛ¶M'ÛÕvÝõmÓµMnZÉ}êzI]ê:a‘Ô®×§©_?ÜÞ¼yýåë/¾8Ž’e©ñ‰‰ÐÕˆ=W/Šf¥²"R5¢”¨YÛe$¹ÚÞìg@\eJ9µmÛæDzhXX’‚…:<²p˜ 7ˆsj$g‘䀹isîD$IóÝâªmÖ«–3 AÎ.áQЧN€€ÁÝÉ ¹ù¨³dp3 $"_õ«RÊÃþ®oÖ5Ê<•nµZ÷½9¤,œóbDéàìêݪ3‹qš G# &aàÖ1]í†p–®[u}¿}ó>IJ¹G†ó“óÛÛ»oß|Û÷«,Íj½É«Žf­¾ýòëÏ¿÷ùáöA6}ìöþvžç.5/ž½|ûî;$ú‹ÿó/Ÿ|üBáü¥aptsDªQSJÉÌNÀè—.-¥df‹µ,"¹›-ÜRôäääýû÷\UæK ±!"ÕR«ÕZ–1À‚µm»@ËasnÜušt‰Î ¼ƒˆ«ÕJU—"TÍÆi"°@Ä:WDPWZ„¥€„‰—¬™13±pιÖýjuØïàÑ… ”"‹Î¹ÖEy‘×ëµ{Ôª,’RÊ9G81š£‡-‡dæ]fN¶æKi«j)aÛ¶ûž€ÄŒfó8‹ÈÒ­†B†…Õ¬MmÓµ:—ñx$Ä&±#2¥D¥HIUû¾wì?0ÂTkι”ÂLKó„Hfµmû”džæêÕÁ×뀘æ9¯òÒ{¹ë8ŽmßÇèID¦ijÛFU»®3 J¿Æ …xœÇ®ëJ)¬ZÖë ÙXSnÁÜÍÛ¶Ýl×óXQˆrÛ¢/õ„ªÖ¨ªÚäF$ûúäôÓÏÏ÷÷_P¤¶ïîûnÕ ¶ KrÃ’‡RT6Ä,¿É²9ùþïýþ“>úÝßý­ŸñÍë¯ß¾½¼¹¼ºÝÝïÇaž‡ßþþ§S¾¼¿þ³Ÿ_¶Æï¯éùºíÓ "ļXºÍ¤èM Ò¢@iˆX«•ªmj ˆ"0\+’˜;Ï¥h1’E¬Ÿ#BR¢ @K)óœæj‹Ôrbg ÌÉÍÜBÍÁ)Ü%fX¦oˆ ȃ¥1G£°à:ø1ÊÃW{ýê®vëns~¡€w“Þ û'O7¯ß¿sck"}qÂÏVôã ‹.Q£¬Ô ÑPç©qCáŽ&‹Ò!#’°i(3‚ÕR ²p˜ã”R"á$2L“€ 39FD¤”j­Ëðãd}úìyËWû¹L¸y¾išÌIr ‡Ì^’,º “å”̬Í- „»7Ânµ‚ ŒÓÐ4M —–3o™Ç æY˜Ë¤Èؤ´€6ÇãDÃTÂ4"ˆÙ ÑçZˆ„´ÎE!†q43fÙl7£ÁäˆDüþõwMÌ(@¾ñzÖ¿š_d{ÚZ:Œ˜V™¤U¥‚‰¸Y¯7ûq`η·Ç¡Þ­ÏNQ„ îoî7Ô”ãñdsòäâùëׯs×¾ùöÍI¿ªa?ùìóc©i³Ú6m{s{½]¯¡áWçOÌõW¿úÕz³½¹»~õéÇrºž__¶à®Õ\ˆ覔òaÀ›`¹K¶63Suô,¹”™™TU¤ÞP{Ç”R,=}øñ8-e{“ÛRç Eü˜D,¡d©4kUf^ÞÚ اiš…p2Móöds8˜–çeªZW«Õrä Õäì®Ú¶Ír(YÄrÎóÜ ç<ŽcÎM¸Öy^JþÇ$J°TA ¨~ ÜŠHÓ¶"i†jÚäôaê„0iaa3³j ‘åvšç‰9/©·ÍªØ4N›æôøæ†V)r{usß÷«U×ß=ì݃ºÌÂМ½aBæ4N¿G°¿ý Ôœ|òýÍ‹ð;÷ãýÍþæþýÛËo¿{ÿÕ·—oß^¾¹¼{Ø=l×gŸÐç··wüöZÊø´=~²ÆWgMK(‰’hÛŠ¨ÁqœŽÕ/å0ÃA-:–Ô©ç‰!D0 ZÒE¿êçi ˜¦™¦A VÃ0tàêÅGC^N²H4Ø,¸SŒÄ“–ˆfT»ü‹ë: !Ÿž<=ÿƒo È"ŽÓ:ñsÇUC?ýä·NO7ïï®»»_¾»ýgonþ™ï>?k~tbß;[‚ëîdÄÜŒ$Q0‘¹{T«š  '¤ðœ@Cµº{Ž ¸ð—}`wC´¶mÃ(ú^=yÚµ€ÓíªÉ$ —vR= *…yjCD@UH$@Ì@ÁµpFNÌD4ÍŠhÀ—ïÞ™C¿Z5MûáH”b #šé<ëv‘8&’RŠ™’.òÒ൚©‚¤¾ïUgCpMLïÞ¼‡&¯É•˜ÆR¾¾ž‡öóü£ÎÄëÍÉ~¶ÀèÚµRî›ÕõííÅó—·ïoº¶[ŸžXŸÊ~¦zvqÑSK.>ùøý×ošuÿþöš‚Žû'OŸíÞ^öƒ—ÿêú!l˜7ën½éyýÞz?<Üu©}8ÞzJ–b÷þýG½€_ ÀÁ u¬ÀÎM³Ä,³jæ,´€¼mÛÑ\ §qÌÙ{Ê|ŒˆišVëu™gZ¨MÓF€ˆi©È,ò,Uóbôºü‡¾ïqÙ1s·Ì9-¿#’jÊÜHg&w_@¤%‹t]w<—£]†¢H2×iñ_<ù‹ZÛ®š&eÉeÜ2°Ö¶­Ed¢ÄÔ›#Z›§Ruô2Žj -ÆÝXûŒ‰êаxõª']íYŸ´r¶NOÖ)0Ì5f³:·}»/!Ì¡áp_JU³Š‰(K*f:º³ôª6”ù]-ƒÖ•œŸŸußÿéLJѧ©f¡aò¹Œ ŒGu<ÒÊåÍí;fÉéÙç/Ïú½¿s{¼ûòÝ»úõU|µï^lèùº[KœuiÝ´î ®æ–XX­’ä„ÅÌ牙D87f³™»¹7 œsÎÉpÖM2È!}2JZ­°éâÖezœbCJDHHQÝ(€‘Â+‹ÎZ 攄QqÝoH˜1PœJq35#r3Ó¹VS"†95Œԭz7­Eku³*"M“LÃë4«97M’¶.R€¸½˜‡)çÆÐÐc.õí5¿Õïk÷CvõÌΙº.ùÜ­.І£<ÜÞ·Ý×+¾ß_¼|þå—¯³÷»û] mºÕŒñâå«ï¾}£eöûÍéi×´›ïŽwëg›ýaÇ-!n7pÒ¿|ÿÓO>ûú˯NWëO>ýèòöƈnîo§¯^ û(˜zÓ´¾„Q"f&Uƒ¢¥×Aw¯¥ô}§SM)/&îŽüHáXp|ÐZĦi‡ý<Ï)¥E½…AÝÍ„ež‡¦éq™.ñ«”²Œ̬ÖʼPNyš†Íf£ZK™ˆÒÝÝ'öb’e©ýSJÓ4-‘ñx<.3ƒ#Ê$¹iÜê®ÔZW«õ0 ]“#|ÙAˆ&7nîÓ4!bΙ"=ýÁ0 uw¿»¹¾¹¾»½¹wu{ùþöæþx{»þÞþ~·»?ì÷w‡ïîïvÿV.ÚäMâ®Ë)¯fôWŸÕjêqqvšR²ªª*™‡ip-2ϵˀ„ûC»=ùñ×z9ííþŒø¼ÅœpPèè Æƒ±8C´±ÛÞIˆ»aÄÀz̸N·Óøj{!'í«®%3ŽÖ¨¾ß;zÍ]SŠzÕz«ªæ éà•ª¥”ÔiEÌÚõú£òR>S6æýhãÿõî»i¾þAÖ¿óòä$Í[K¢NôØ£P)“¥,m“kQO)I-U˜´Vw€D Ó "Ì4P"|.³;Çê[¿¸x5 ãýîæ¸ð¶kš¶ nrr ^ P"âƒï!"¥asF&€œÓ\u¦®mêÃ0E£xâ…ˆ‚8L£GxDj2`ðŒ"@~<ìE’«`Î-xh u›¦Ñ81§Ä•Á,æÉÚ®ó€  Õÿê]\ÅÇòÙo»Ó4‡ôíÝ\W.ú[«"ózÝ®¶Wß½m$¿þúu¿Y Åž?‘Sº»º©ÙÇ#>{ñB·'!\æ™úì»:?ÿêõ›Óó'ß]¾ÿäÓÏÞ|óM_b¼Û Á“ç/ÿü/þÒÀ?úè£øÉöœNN¯Û-À_1"@€ùl6C×-jìaî.)¹*-˜¯£ƒ§”~ —»Ç0NMN pWJQ3ªÕL—ò8Ž›Í@ ÅF,q™†‘h™033ðDs"r‡RÊRçŽãÄÌfJ„ž¹Ýéȉû¾/¥ ò2C6³_SN‰¨š‰X“¸2Y-MÓÎóœ’l·«i*Ëwz)–ç™È#–™Ç4M\ "&€Â¬fè¸PzL-,ÐU—qB‘i G·jœÆcJ DÐnw›$‡G›9•¹LÓtzv:SÓ6®–švžçýþþxšœ9¡X­Ìbâ»ã¸d‹iš~ͬ…G2•Š$U'â%IpJ6Ïmß›*bˆäE¬E͘(¥¤¦¥,k ¶îÛZ m‘†0ëV+fšç²Ì`Â]#Rb&¢}Ù¯Ú•™•ZÑ—eŽRÛÜÔRÃÃÙ%'«¥Z1$'f.fQÊÒzçôȆ'ê6ër·{˜ë‹O?z¸½ß=ìAºP CR3†ýa¦Àø×’þßr»âvÕ>ûè¸zõ8LÇýaØßïîö»ûÝpysw÷p8”qǹ,ƒþZëzÕlVýÛ7—ǹ&‘»»k­ãDŒÌ+(ev—ᨫՙäîþð«vyûà›M‡˜onŸ?=K'çåp Ìr}s×µ]ÛvêfUÁ¬kšç/^~ýæÛêVºv]C=ŽŽ)u`3ÍÄ™ˆ&é`axéÛ<ξwcDƤŽs 6˜5N×gS˜É*þΓ©îß|ýó?þÕÛ<‰ïÄE¢u·áÈ:圑8Œ`R7@2T«P°o³D`5E®¥.’ È„¨jd„Çy¼~òýï“ðÉɳåw×o:ÞmÖëíɶmÛOMwT ”p sʹd÷æa#!’ZÍÒˆ4›M«ŽÓ4­Quš¦$é0ÕjUæ®í¡B¤F˜DìZaæi(‘¤–ºZuµTuGp–,DûMæˆ‚éø° w˜l~àË÷v¹ý-<ÿÞ®~òäãyÐ~µ&3#JýÉæìæúZ9\ßâ<ŒgOÏ“Èñê*¬}‡¦í&³W¯^ÜÝ{s—štùÝÛÕ˳>up»_÷ÝÃawñìÙõåM'ùä³ÓýíC^7ß~ûÕÓÏÔl½Ý(Æú|óí_ëM…ÄH„ˆÕkn’l¶ˆîà‹%[5s¢eÿü1߈ˆ‰ŠVAx„;|QéÆ@\°øÕjµ¨!-V]r®ãH$ëõêòxHUÈU¨êãÃ#€˜ZQÎy†¥®W­ˆ¨¦Ûí³‘ÇÕ§v 䜛¦9Mשª/~«n¸€EÓ4mOOÇaîšf†%z8%ѪMÓLÓtØïÛ®3³… oµ˜ûÂ[ãÄÇñˆˆI$TÙ%ê[sgÄižÛ¶5›RJÄH†ùP«Š»3D0‰šõLàî9Ë<—®ï×}wOÌT­ˆS×µ0ŽÃÒ ,4ªåÃþz)w!nãbL¶´GµÖ6çQ5Põë# Ö’RÓ6í\f4œçiyi¡EÍ¥$"U%w[ÂôÒA˜…êœsUÅ… F:MmÊ”h)TµÎu¹˜ˆ˜S€Ñ&È9—y^&vs…s×¶a£ê0t])ÇÝõC P–aœÆÝ®Ém™ç$™ ×ëÍt)/¦°æ»Þ«”&5Ôyc`Ïì0P.Í%U¥¨!0²:«H ‡ý½÷¡@)¾|¿Öþµá.+w¡»›ËË»ƒÊ"Ä1Ä.çúþö.„ØìEÏ.¯Ö%åZ×i‡áxv»ZËnܼøúÅf»{ñÕ/Bç«èGÏŸÅßzrüÙ‹³«óáúh³'Ï.§yéû¶šb·éÀ^¿}{µÝþø¯þý'ŸAKh®`ÍTk­¾áD¥ž"9:¦ép¶Û©*"Æœsiz%ï\-EU‡aø”R5„ИékJÞ¹R µ'ÇΑó]×Mm_ÈD`æÛ%£)T[×i¯°M÷µÖa–e‘Z«÷ŽÙ®¥Ô‹A³"â:bô^ÕÚ~i>‰I¨¥«€ª™IpžåR9È9†0Žãíí­÷ÎÁ A¤JNZ^"@¬")%(YQUw] P«HÈ#15ÿKïú>®ËL`ž¢.ËÂDRJˆ]^—öâÑû.öªB—ÒZ«87¶âÛžXJÉ9—lëܺ®M ˆò€Ž¤”¬†ÐÝÜÜ\\\X)µ"€IÉ›qSBjWŠºf3Kë:ö½IEP$·®s×ux‚qAD !—”|ŒÓ4ÕZ/>ùd>cßgÉJàZûTМ—æS$yçÚÛìbDD©•˜±`-¥08ï Ü×_ÝÀý¾“ý8ÃÍ5t˜`M,°¬Ðup˜À*ć8wñŸüÚþ#Çwà»/Î4©ØÙ§ß7)?<–ûÛe>æTSZK•¼–ÔŽËúþöxs{7gM«§eMõîþ¸CÉâNÐù®Ó®ß!A 1¦)/Õ]\<{ùúÍÛÛI´ögWªPuY‡ÐQ¿í¾þæ?»|rÜÍwÆœ›œ‚¢?&4Ã.rè|Êâû8 ã2ÍW]톾ªVÉZÓºn./—y™¦òè;ÿÕfûƒõ¸Ü-/‡ÛŸ_ÿô•+ŸŒg·ý“.kuPR¯èUV@2'Òâ$°*±@Bƒ ~oãë¹»Kµÿþ»?DÓÎ!3¨Øóã&×3“uš'd‹Ý@­ŽzÉÀÈ1’*±ïü6†¢ZŠÔa·… ìݲæiZ˜• ˜"“…8úíf—$÷‡ØÇ¼lq?Hót(b*yç½÷UDjÕ*ªd$5 &­îËW9õ¿wWƃ¦ÐcØQ?žßÝݰ‹½_]]¾zó¾tv®ëÍÛëRªïcJÅ{Ûþ°LW/¿ýúå³gæÃqs¶ ì÷û»«G_õ‚JÙïï?í·™èn]înn£·¯¯ãöœ§)_>¾ùò?üÁïüìŸÿù§Êx­¦j ÎùZÔ™™œ÷&"µZ­FDf>F˜—%Æà*ޱ+UÚpýàOжÛY¢›³  5eLJi»Ù˜Õu]לû¾C³ÆÁ1óÔ–×' ŠBØn·‡Ãᨠfþ MPUç,ÖuÝl6µVçB­Â•ÍQZ—RNŒÉ©á–RÙ!€V…ݸ{ÿþýfØä”Öœ#€s.„˜R‘¾  PÓ²ÙlrJí5h‹´ "5#D³VÙ'"Niq>JÎ𠱦\œc$l‰Ö&Úx÷ÒóO ‹*RŒÚZ“Ú}>¦©Iá|Sض‹K#é7=í<¯ÃÛÿzfhM¢±§  SZû4Õ®ërÎä½”R¥Á¶íºªR+y_ŠŽc¬Õ‡ªê´ß³÷¾šÖu]‡0ßß·†=-ËÐueI¼TñÞC'¢í¦¢ ûÕÆ‚ !w¾”‚X­ô?þ—ÿÓ¿ýo|º§¶{¥&b¯"„æ\{SÆDDô÷_ý§ðúÏy8DÑ ›áésµ¢j‚†VKI©,ó|8ÎÓ4-ë2¥9•iη÷óõíñööøþî«ÂõÍ]@öûyŠ£GGOϯæãdï×ì¶ç±ï(—×oÞ<~ò´‹ƒÞÜÝ’÷ó’]ØQFêχÃ4sÒ’¨s¼=‹¥$0%äÝ&l‡Í¸ûηó³q3Dbbd-"šDrÑRíÕ»û¯^¼ÛÇ-ų>ùtÜÞ¾ÿù›Ÿþï_Þî_®úÝ3ü­Ù µæL}ïj%6.VP=Q)©–‚Á¡{¥w —u¤»Gý´¯r*LˆH †¨Þyåê°«æ,Kž k&nÑ’tº¡Ÿ§Tk-UŽË|P)…=—ª:i$ë+@ŒÑ¶]o¢º¬åýû[S)µê².Þs× R«Æ.Š”o©¦¹¹Äj‹µ'2RüÅ›ùþàÎ_vq(ÓÔùq(j«Û¬R•Æ~X™üåðæï¾îCŸ³œíœ÷»³‹Ã|tHÞ¹ùííån÷ÉÇÿäo~¼Ûl~ñõ×Û˳ÏþÓϾûŒóv{vWêtÍÖwƒ÷>º€XÃck­¥Ôa¢w.F©Ò4áÌÜäÁ}?¤œZ§ÕÚÚ"!Òt˜| Í÷›™ÍP›Zš­Â².ìX¥¶ß,%çâ›ÀíC$çT•Ù™i­BÜï÷›ÝîþîNrnzLÏŒwÇ<ϳ‚6:[K*UDÈ%¢ó\­zÇjÊHKÎCß«ªI ѹišÇí® â²,ûû½HE¬ª'#_â_¥”ÆqÇq™çív‹ˆZ«”‚'åcÄUd3ŽÕ”Ç£c6ÄuY‰Ù¬6¦o»`9熡k2:Ii !4ðŠRÝl6ªÊ€Æ¾¯¥äœ@r¦aÁ‘C‡ˆÎSËIœ£¢X•,MPbfÌÔ÷›ZK)…RÎ7Y?úíM|JÿÈrúäòãb àÃÁ¶7ðÄÐÞBôÃ.®vZªVQ)jZÖ4Ïóñ0ëÍíá0¯‡9Ýïç$°¤´&5 5ÍÈÎÏKÕ’ín öÏ?yºÙ]Îïï¦ý¼õ4 ›e^\÷û}GFz´Ù…òš½g6˜†à®ÎÇOž\ŒcÜôÃnÏvÃÅù8ŽP¤ÖªUªNKþöÍýÿþÅŸüå/~úÅ+dÿjºáðìÉoÿ÷ëõßÞ]ÿùß¾'x~Ø)õ…2•qÉ«wÜEO"HXÄ!Þ䱚{Þ}¼«”²*J%¨ÜRÕÙ¼HÅâ¼GFÏ,V]cÅ“CœwDÎ9 ë²Ä>êÓ'ÏÌðÝ»ëâ$„PEª©¥yP4Çæ£¯EØÑZÒÐÌÄÌHPŠ˜„d¯¥@“q1ª‚Y`YËͽûÙáIùô³Šp_ópvQ»Î»a:LI‹ðaða€aô„¬ùøw/w݈ޱc>ß^_'•u]/w[—´ÿ­gŸ}ñwÏ®{ñåW¸íwçÇû}.‚Ž¿þÙ—¶B«Rt|tùê«xyþr¾&‚ݰ+UÐç_ü|Øí„Gð0¹c­õþ‡*¶ ¦ÚæÊ†y6 ÄÐj®zÐZ: ýÌ ÉTkJðawaª€`Z ¬¥M›™÷.¥¹”Ø”µÑÅR €åœ—eÙn6>3NËZ¡"Z[O·ewS–t]眻»[ºÎÏë<ö£wÎq0ÀZ¤š…¦ei¤£VCÛº¼ñ–ei80¡iÎ…ˆœã5K×õιã~ÏÌhæc þä#4ÏsÛ}@‘Z­²a»Z«c.¥”Z‡Í&•,V™Ù@c !xU±ZTUˆº&$ô>4ÿ D ¡³šVcLáƒ!™5v{°9gClŸM²KªÓ´l6cŒ]ÕJDÞÑšK³&›hý•™!rtÚÓ|ú!s̱뀙çeîcßuš)¢jæÐuí*E\pLLDµ ˜*©Úº¦ö3ªµÞÞÞz¹VÁ¶šæ%•ø+Òª àÿí 4J Dè·°x¢Vr)%ÉšRM²ŸŽy•¬ZÕQJÂeÉEª*Þçin‘|ÒýÞwÓRÖ*ûýÔœ‚J)hÇÍ×5ñлƒc`ÆÍ/·ã³'Û³ÍÆE½6ƒìÇÖ²¿ ¬y_üöÝüèb[„ræ/_¼ÍŠ^aµÐöß>¹¼zûÅÿö³ãþ|Ø~¢3)`%CrU\DnÑ8,®¿µí\=£\ÂõÕYfò¥ «ˆƒ‰šcGÈΑ{b‹Ö&SsžŠs!8‡DÎû’Ë4/›qT"ä£óL¼ãô”’Œš@×Õ…Xª«V‘Ð9dS”R$PPÐyžCß13…‡e]× ÊäÁЂ§¾£_¼•Ÿ¼†íü~w±«÷ Çí´d´ÚírÜÄN³vq˜æõ(©æüɳö÷“Ûmw÷¶o^¾ ìy;žVÝ\}þåϺín½Ù?}þÑŒ5í÷çg÷·7] Óóó³óûû{uÌõãps{sþÙó%åáòÒLnn߃£Íª±.0L8ÇŒª'÷˜VDðÿê¯Þ&Ü*r"©~†!‚…àÌÔ J)"ÂŒÍ5¨UØ’!’sí«0„ˆhM%"!"j §³³³ÛÛ[ï½s d¨hv2GÉ%ûèÍ@NŽ*­Å4ÚÖjͱ  †»Gâ“¡Eeö©&ˆ!@Œ§@$€ö ÑÅ1«H !hó7TÕ®–å^UÇaȹt] ޫ꺮­z~K#Ve`ßwÞûež1Þ̤”ਔê¼/µ”¼æckV#°Úh34týº,εGÚä`vêÐmN÷Þ·-ŠcvD¢º¦ä™ÛóWU á—-7š"âSN¥Ýž}zvÎkZ‘œ>l„ú¾7³e™ÍÖ.F»®V¥Ä;"¢Ed&D¢Z #Öæb„˜KA3})BDJˆ]Z’˜ä\ƒw1Æe7»a6] ‹›èÿ±*þGÎ?·ð@ÂØ…6fð¬ifh&€¬ªUDD‹”Rt]T©)IELkIkSS%âà¹ï|#ÞÇÈÞ‘gLÑQ?öC|ð@È'øçŽ{˜!l¶ƒónɺ æªïn—»ý'ÖyVþÄýNyý{ ›']€<"V0ª¼2#T ¡î¦nnjkêËÛÐçš:ãbµ4»T0Ó\˜-ÅŒ™@£óÌT«ˆiÉYC§ª>ø jEUг2h½? k >i‘²?†¾†±`FVIJ¬¥êá8·'zuuØ¥œºr)9å»û‰” X\-ªÝÍó²p6z5=ÿè÷ÿðèÕ×oưõŠ.ìB¿¹¹?v$ÂÊçÛCÎèBp]YªX½}w½6óÍýH~×ãåù·o^×yŒ¾sW(ýã³ØûïÞ—yÝP|öì£ÛÛ›ó³‹Wo^žßÝߩՖ:-ûB¥$t¼úCe{ÏÞ-Y ¨6¢¡ª•Rí²á®mÓÖˆÄ'~a[¿4¿IR­MëÓ„Á̾•ÔB££”RZ‰| \¢s>¥ä¼';}k5“œÅ{nëšœs‹9jD#(RJ. éõ>4Ð6r†U €ïh@ó15#æR&UëûˆØ¹ýÝ]£Áƒr¸¹]B[ )ˆ.Æ8Ï €C7/“÷¾){»®;Lün¡Ö¡Xrª¥ÔRb×-ÓÔ>ÎÞµ?ÕªÊäœsPÕwQqEc$Õ\ë)™ŽÛíj³–e!:9h¶½9xïÑÌ!ÅhëZRòÃК„SJ #i0Àf3†Ð¹eYŽÇyÞs•*ºXjú^Uçy¾¸8/¥¬iAfÏœ²(XóÈûÐäDÄy§ZK–a‹2Ç«Hð^jefï¼æÜ°e3Cf4B¨UJ*‘púeÉP¥Ö*ªJŽ¿ÒùçßþÃÿ¥…ÿÛçTUR0Uk¾ÓEZ *6?g"P@GŒm#ÚluO ‚Ô!ÄGwð{Ÿ©! ýù¿]K–¢…ØÌmÏþÝÀýôg?ùfwù=EM$^ ÍJòÝÁÎVÙør< û³ 18ÇÎW“i­HŽ-WU³ª ¥*"``tL> :îÄŠˆ:bC*’„‰£oæ‡"Š`µ€ ±9B 5Ón¨ZÈ»i]sIð)yM51yÃ;/éä~%ªÄt< Pª6Pº6²4-9窰h|s›^&ßÿè_½ºMq»½è/oæt>ráýíÝã‹Ç3“1§\Þí÷ˆ„¥ªwsZ–ýúÑw?»{÷ž=~ïG?üñ_ü%Üß–à@*ŽÝnmíû—_¾è¶e{vFg#Ð7ß¾üøùGß~õ-wý7_½>Ûí>ûô³ë·oŸç³ã’ñ¦f°âÐuŠ ªYô°®p6€ÕZ ™DM°ºé¢l‚fÓdGÐêûÉg›Ù9×*{ˆKÉÍû¯Mßí—äÃF¨Viž«Í‡[ȉs¾”rww·ÝnU•È @­\K‚·ÔVFˆ,¢ˆM!…MÞÅÌ©”.Äæ’Sr®"]ßyïÓº‚™g¶ZÍ,•2ö}ŒÑTÒÀD Võ»§iZ–eÆý~ÏD RSJŒèBð!”RhžgUÝŽ¨’DŠvÄx2VR©Þq%láÌ^ ±¹ÇÅ‹T6hR^"Z×e‡R¤iîNd|³†ýž0€Ö‰Z†kSÒ ÃpB0€¢Üãñ˜’˜)t]8®ÇaÁêIî¡ÚuÝ<¯"ÊÌ1t}ìK)„˜DÖŒÝ)–O¡ˆ!sI‰³“×ëGÒæmÐ÷}-uèâaž@Uøp˜úlrÔj%DûÇžÓùOæúÏì"b³ß@Çä‹ÁuÑwï»Ðu!ç=;ÇÞ5›,$<¥~þª?&ƸãØwtw».*¥€Öâ\\cÐû/ŽIÕuWq¿H»ÈÁ»‚8Ñٞɴ¿rƒó!ö]ЪêÂFM :6Õ"E+˜VÓÚ¸‹äœÃf0™Ä9ç[¢)*:ïÑ@ƒóm€tìr)ÀdªL†‘Ö”ƒç&߯jZ­‚1b‹Î¨µ‚A–""iM’µVE¦rŠ uNR,K^”ï–z(ñ®ÿÁ7Gq\*®qئ‚äƒ ÝRjñ,@Cˆå0o6ãþöÞ?½Ä"cß§¼ V-úÍ«—Û®÷ý0çOž>}öüòx8Ëôê†Æñ{z}½z´ã|§¨9%·Ê<ÿ_üÎ7_~!dß~ý²Téúþêâòf÷üùóo_~ýý~ÿóŸ}>l6×îê~ÿç߉³“ ê´J«RÑÐO¹”¶+ÿßÔÊ´€gD¬RUOŽ¡ÐœÑNTq8Ýßm?þ^÷è£_­øü¦ü:Ç´ã8úàÙæ£¤9[U­ÅÇ3wÖÕé«×…·c÷éX€]ˆÛD{÷$­¶IßœÉï] r ÕJI~8‡Zͪ!8F­à=#T) (i‹­+Øn4Lމ© ;ºaÍ«žFTÂ%ktÑmÏÎ7ÛMìºÃa’R AµŠ!›i‘f_EL” ðò*˼˜6ƒÝ¬ÇÛ¹¾«çßÚsŒC6\„h³IY»q#À D”<˸ݮ©vCœÖÕ)MÓ1—âÉ >2á7EÄJZó]-õìÑcBÜ]ÿôç??¿¼˜ŽSÃ~Þ»àºMTƒã³Ë³·oß®ï·ÃÓ‹GÏ]½{÷{÷ò›K.&òè“Os®ïÞÕ?úÃo߯‘­ªH®µ)-ö‘Mkì:) Î9P`ÇÞ³rž›ß'>œ6æ·¤°”Vü%[ÿ®‹m}ÔêH)•š&Ró±i Þfæ§›| <¶z7 Ã/ÙDÿÃ7%Bhµü²–”RDš­?µ/?¹cºZkÊk?ŒU„˜—y1d)Z¤¼!˜èþ~ï½kÔRyHClÚ¸ežÉßb³ªÈ0 )•})§Îg¦ªà½3!Ç"å¡]3 !ŠHˆÑ9’RÚ;k¤-pšª®íÚûm¥½i/"E¤q®Ú*¯•ÕÃ4÷éÖÅÍ,Æpsw;n·Lˆ@-Buž"R­îmíÕ*>úuYCÇãO&ØÖlõDD k©ªuYW$ŠÞ#s#ŒµAj‘êœ#çJ#lßUks0­iÝ}ç‡ÝÕó_©òü¦üº&†n;ôŽ‘¼ß߸‹ž/ž|²iôÇL—WOžùp9ùñm½|‹Ï¨²ßqî§!†È ˜©X)!†F´‚§Û.¢a3ˆ§R«J%€ªZAŒÈº‘P+P ³ZLQ¤nÇm–Â-€©¢šu]W¥î÷Çyº~{]J“ôÕ\rÎ%çRÕ Ø‹‰T ÞU‘R4‹§µ9Lu*~^â‹ü”¯>AçsÒ¸½\D±ƒ @œŠ Á‡¢ºíGŒ.ôý€ÅlÜì..Ï­Tô®zžî÷™ŒŸ\ ¿õ»?@©7ïo1†×¯ÞgÛ×oß^lv?øÞo¿½~ýèêêp8¼s³Ù•)y¿wõü8OÇyzs}}þè\k¦'Ÿ>·_½{3áÅý׿¸^;­Í›—ÛºŸ¬EÖ©6ÆÞ‰woÍ ¾û°ÌQ"K)"3·í6o €V¾›M[5DჳÙÓ«Ö"¶ÿjuÍÖë!„æ.—sn@å»éæ+×öïx¢×“sü¡Ø‰(y§fRJ{1ü€G§u%GˆfÄ'Ë1‡KJ-­)Fמ 3¶Œ„ 9>Ì™YóÙ©ªÊL§«R£“zj•¾ï‘¨”R¤2“÷^UZÃc¦”R‘|¾;K)(ó©d·Ò¦øVÜ?<½¶“l‹~fö1®ËÒt¼ªÚ¼b×µ>ÑÒš šˆ¼wÓa:Û) ©›ÍšRJ©Y|›;‡fía.ËBÀÄ}L%Yµà j)ˆØÅXµ®ë2Œc£·'Óf0ðÁ•Z=:<"v1œ4ìÖei¬bï}Ϋ÷z¶ýÁo}ç{Ÿýð£‹>ž]¾HwøìZvÇî£5»îöïŸøo;]è}pMOHÈèãHª'€ªÀÄ€ˆžÙÀZb ˜¡@uD€Ô$".8µ*jUªÔL&*ªÓñHÌ}×Gï4„ØÌ³†Ýhf±‹¡Ë<×Z×uU51fgì*A©R¤:D•zœ&Q(9§œ©”§L·øÔ÷ßïç´ÔÚõÙ\?ž¿¿¿uÜ™Yè{ n˜»h%@”Õ)9- zýöxž–)£âÙfóèê‚@öÓôÍ‹—qìû1TÅà9Æðûÿò÷ü“Ÿ@UE(Å:â³~Ì%»à¾½}“c .éÙ£³t<øÐ§cE á®lþçù÷/§ÐJmãþœê1Ÿâ Í9&¤RJ­'3×6hCK0Õ¶Éi®5øpGhi+ýD­öµŒ­–¸ŽÍYº}߆ÌòØŽÞûÚˆªf͸Â9c(%·Ÿ~×u"✸[Sõ!˜{h9ø ›-¥4㚆Œ‘wPk­ê‚óÞ§’‰¨j3Ú<ùܵ5·Y£¯|Ønµ‡à7ŽÓû‚ݾ¸ýè£oö·9»}+9×*OÎ.‡¸‰ñ 2«hpƒ73ç)-Éy×R¡ÚÀëœSµœ…ˆ@-—µ…@ÕZBˆ¹”¶íi—U9Yóû“‹¤Ï9ŸHŠD'fpßÅ”–ÆmNpvr‘<‘«­ª¶ÕÖ$rÎ"u]KŸCh5ÚÊâ<Ï}ߢšyçdY‚÷ˆ˜Ö5x_ò45킈Œ¼i9\ f¨µTðÞ«Y‹8ϧ|'ª[¹,Ë8ŽÎ¹'  "Úô9çÆ m›-C1„ÀÄÉÔÌÚ5ˆ4k-%ñ„š””Äê)hŹiš>´Ãæ«“Rúp£j ™H)õ]gúÀ‰*¥€Y1C‘fy-"›Í±1µÔ{>,KÔhZ‡8fD°.Æ,2ö½™•TmIiã\A€CÎЀöû½w>‘÷ÃH„ "+bSŠˆ š¡â2ÏÃ0V© æ½ü)#23ªHˆ@µEí7, ú‡?~4úðôÉ£Íá8¯©Üïç¿ûêýW¯áå[¼¹ì½WòWõëvCîº~pä½oiv‚Cß'dÕ–/à à;3ö†UÙ<“°ëœ·,•€PU+bΙCЪ¥DØîκ.”"H-š,ƒ|ZSN3 áƒ7½ ÃÒÚâ«2€GGNµj>¨ïˆÚ_lVØ d y÷;ÆgNašJˆ¾ßíŽË<î®Ø”úþ8Og=_ßtg»Ãá>v£$¤é8¹æý?.»‹HÞ§y™ÏÏÏÓþ;W—} Ÿœ_¼ËénX³Ùñž;z¾}–ÖeG±ëÃ|}½»º|qózÃ<ž=~^W›ÞÞÑW/¿-jÁóÙfcfÏ>ýøÝW/D-}ñ·Mþ¶æ•7Ó42ÖÒüô©•3Ph2DÑç”ciÈaá)¾ÆDxâ·”ÒfÛÝnw8LÁ9t-ØD[J³™…àÍ(ç=43g‘Æ9©f¹åª4T³}¯æžÖªgΩmKN¿{ÌŽ\Ó¯I³œ4Ë)0³Vv €DcË@+¥6æL©ut.¥TJ!D—ÒZ+¨I“w-ËâœC€,BˆD"YD•™j-!¸vwik+ïý²,µJ»ýЬ-"V-tè}PMÍT£õ<;™ß ´ž×ãf³ù„4 ,窈ðƒÝ ÿ¨"íö¤æUòv»}óöQ!-=†Z<!š5‹7©&Ì,¥ˆj-åòòrMkb"€Zk©…´¡Í¤ Á;È"Î9€”1!áÝÝ­žÈ7z(3{ÇÞùýþΜóµVvܺȯt~Ó~Oôüôjûôj ·ûôgýÕýý‹/_ÞÞ-Ôîš#X~Äן¿:ö>vLøÁUÜ{¯ÕO™ÌÍ€Zü¶ÁUi’4ÀÀ¡¨ Ô®ë ATkZȇȀ"9e+UÐ_rNEc«iÛ`œÈ-fµJ5CrU˜±±‰,÷@)¢Ä´ª%“jÃ~Ú¾w¿‡5ïCèÆãÝ_.¦TµNS2‡óM?vF(†XÜèÿü´ü!j׈öëD"¥ýɹ¨•Ǽ–t6ž¡ÙœR Ò² ¢cVC©¥Ö„èªCRSjôC&ªµ.)mB1Šˆ¨«™im 6mßFu)¥-è§”Úí§i\›b«©á½wm#ÔXRµn¼±÷âƒà¦UüÖC·ïûF5³—/_~ø';g"ÎQlWÉ ]Yd³Ù´è Kiž³hƒD¤dCnJfçØTɹZíp8Ô,}CÖu Þ«H­kNc5sÞ«VXKºN­–Z›-`““i­|ŒÕµMž"šˆÄØym³®ë!þr¨ç?òüÊ_ð›óŸó¨ÂW/oþ×?ýòOþú‡ãZòj}ßßßý ýÕwñúbÝ0ôšô@´ªç\ ~­ŒZQM²™TGèÈšå3û0Œ;‡†žú¡ïB¨Uµš)˜"€­k.UÙ¨RU«U*¢9')¥Vi¶\'êER#r#@E"öÞ»û÷×)%•RaÅ®¦þ°Ò5œ½÷W9øEÔùMè7‡u½øøÙa?áZÇÍ6„À!d°êp¿¬DÔyoEØû㲜m^|û2‹±‰ë¢"8¤º¿ßmC¹?¾õfs~~¶Ý>}ôd]¾; âõûëÇŸ<Ž5øÑ¿ù]ïœÒrœ«Ù¼.*rØß?ztyöäñÓgO+š˜ö÷ÛóÝïÿàGßýì»WžÀ0T&êºX«13¢¡wA$«Ö¦ï€x@›L¬”ò`«V ™>¸u>ðvÚŒ*Íð€(x~9LjÐ2×Ö5-Ëò€‹žlîCì©Y}؆·=’ª’ÚI"ÐVçˆl¦ÔÌ2 œ÷ §ò~é¾Ô‚ñ¹Ž8ÄXªU33,µ¶4à\Ê2ÏMÁäÙkK7r®ïûnΕÙJ IDAT<'´“¨‚±sþ!ä«:ö}yð°ÐoÏGDU@|ÝEM½Ü.[‚nZelÆÔÍý´Ê¾ÜíÅ´ÉÔ¦i‘,ˆ­SŠH*µ1Yƒ÷9g‘aÍà°ß!¡Áf»5S)Ň µjÕâ°Ý 'TF[ù´,Ó4­9ƒ™ÑsÑjf’³6,§ÖR«™Îóâçš//.ËÚu#.Ë|˜–¡½wíIýÕ…`¿i¿ÎÇ^¾Ýÿù_üõß½ùúÛCZ,ï÷Oí¿;¾Øusè‡q³ CÇÞ39wJ¤Ó"²FGÐ;î]ô®qD9ò!úèB àœ”"V£}çc à‰Ø³#©uÚSÉ!t”ÊJL”s1Ãf~â½'Ä\ €Qp<;‡ì¢š—ÙùÁ{ò †’“Õzœ‡T^Ü[Ú}¼K’>ìº~SÁõq|ùÕëÇŸ\ö½,ëvÜH.„X‹J)Ó:߯“T­ñ|Œà‚Zè| |{{[µê2?ºê/‡½ÿ½ý¯¤ÔëÛÛõ~º~ó–}Ø÷®ï9Fß_\ì¾þ÷_ âý›÷¹Š™í6[7 ÛËËû÷7Zëõõu©úɳçž=?úäo>ÿÛÔóûŸþ´¢!—’Uë4Ím° >“¨ \µZ3†{°|¨µ:tÎ9P40+ZRi5‘ˆs˲¬kú@=l¿ m&Í9ÀIt`Vk:ÖG€úÕv'sÎjiUÌ-e¬­¥ÌšB™Û⛈€œ”‚fóøf)ÌÎ;ò,VçeR«)%D†eYŽË”%«êš–¬*"ÍÉÝJ©"`méM:¯€D†*9—j€ 5/(uüö¾Ûßê<ê8ì²Ôë»ë\J–²ÝyYx;,*7ÇiÕa¤de[Öyž‡Ûû]Tª‹ŒÛÝãóÝ¿÷ÑþÅg‰ÊÝrøæöýW_üÌŽ—çäû³³óš+õáúæÖo‡÷ïnt¥~{·›‹axôøQíðúþúÕ«oý°Çž=¾ºúæóŸÝÝ\Ë”*¯_¾†íJ麈ˆÍ0U¤+]óŠCKÆÄU³œž „ÀMHLLM=Põ´ä)%µëÃu í‡ÓH)jª9gt.4ÀpFæÓ‚¥•þ6SK)h-ô ƒ}H-·V%ÛBœš¾·ÍãªÕÛ¼\Eâ04ÒR3Ÿ""0CRSòÎi0CçªYUMëÚ´ZµÖà½äÜn$í5ˆ(èÉOªúÖèäSíÚO„]µ–6KΩ”v+êBpεý>37Í™=Ð8݇ǸÝn ¹k´'lI5ÅfÇÃÜD¶úŽÐù€fLdª€$Ö¼4üƒG Áá8ç’sÉLÜuCŒ1„N¤ÔZÚë?5ݪÐLjÌ.„Ö‡ÉÛßZιÝNšzމ»Ø5<‰€7„hh`€Ìì\•âƒ/%›iŒá7 àŸÉYsùüïþÝŸ~ùïþøË¿øñËw×û¥¬º“åûÝWß?[²;ïŒJÊŽ©ñÝ}¾™¤žÙÀ@­ÖjˆÂC<%Jƒ‘£èºÍ¸1nÇMŒÀš=––jÄȾI k­ÍI8çR¥NólÚ†X*©¡C0)kËVsDÎL4Móa™“ÔUD’”¬ÙtYÖüþ~Å‹èÙwnîVð†Á\8{üLŒ°ë øLö~¿9Ûqp‹TÇÞJ•Rû¾ú1-]œ§õêñ£œäå¼/]ðžôÉÓ@Ëí»7å8;tƒsÏž>{òìöÝ»‹ËÝÏ~þ¹ˆïîzÛ‹§žžãÅ£ËTfrüí«o²úvçO]^_ßlƳ»»ûþìlÉb–>}þt{ÖA:‚rËE1Ó}Œ!Fµ*!Ç™™wþ!ÌÀµ5·•"Ø,B`"l„ÙµvÃÕ[uh•ºMßÀ'¾sÎ{'"DØöm˜m¤Ò*pûZÈ¥´êÖì">°!ÄÚi8¥$VPð]—K®"*¢§5Km³6ÅØqðÔ{Ï!4“µÖ{j­Î±óޚ͈•ZæuªZ«U Þç”Úr¬ >¥ÓR«½ÍRŠšxÆqì†ЬÖS£Їùxt]wŠ!cFÄFN3³”RÓ ´÷\P3+9·GÑ4kí3Å [KÉ"¼×*µÖã4MÌ @]¹$)%…SÐX6ÓÆÀšç™´V@0fd0¨**j)¯È§5š©ê~¿…’K×÷Yrs® G “¿¿;¨jƒ²3’ äýÊ&¿=Ït,ñ7ßþ/üó¿úüÕíTæu >Ì óûÿâü›ËP!öœ'BÄÚ±¯5ù6­µšZôlä™À[¢š!0‰A’)ö*ˆ”Z\5­ˆXE­$Bß ªŠTÑZ‹!˜ñ¢‹wž˜-¥Ü.ÝkÊÎyd¬bˆ ŠÕjI)Ä.KAeç“ÕÕ|B;ÐðFô–ÍÕùª<‹,Fp·ÏÕž^}ºÞï-vkIë²* šç#{Ï„Ëq ] ¤¶.ßÿì“·ï®/?J‡{ŸÊ]YÞ=ytVyŒàwþú]=×È~¿ßo†mì#-TTÞ¼{s6ŽZáOÿìÏ~ë“OÇn{æ§.n¤ÛDãׯßľŸçc¹Ún7gcAƒ’¤€Ã´$|­ªŠ DιöWŒÍ'2Æ®ä¢í¯Ùœ‡™É ™ œ#©ŠØ$KÒ䛪WˆÈ9ú?Ù{“_ÉÒ,Oè ßpï5³gopîásfTdfeWu×¥.¨îB 5ˆA½5X ±é Äþ,XÀ‚u- QvW‘TW'•‘CDF¤áîÏß`f÷Þo8ç°øÌ^&Ðj*² YÄY„ÜCÏÍ왽wÎ÷ýÎo("žU\^Jj^4Ó4‰ ÷t쑆¶„!´=°Öj"HmíZ£GDbr쉴­(bŒµ‘ê}²ç•î˜RjDUÛߌ@U­ªž¹a89gTlC X‡hp ¨ Ã0”\¤Ö¾ïK)sN‚G@$3ʹ Ãb»Ýj)è(K ™9Í3zßè­ ç!â6ä˜ã<·ú‰”Rƒƒßô0óÔ@0ä]†å­Ro±X@WŽÈ³!æ\J©ª@L¼·uTlöÔµ*c­%+ i›äбæ}>° Á{'µ:jÖ@û£=¨ªÅ@²_˜"ä1;ïqžR13ɵa­Õ˜KÉŒX«æœ¤Èçm5_€/bØÇŸ^~÷{O^^n³‚gÇÎÜñæ{o¼qtEŽó® 1çjýÉdU4!$ç˜=‚šsÌÔú‘ÕZY¤$ƒ!1« 2¨hì;¢P¸Ì"|H©HÁ¹¤`¾ÉˆÁÈÙT€¤ "´LíÒšHΉ‰É Ä@‰€@§­#2C$XMSÕåËŸãk—Ù-ÏÖÛ¹EF¾©ãpï•~Ô§ÏžÆËv»\¯Ùà€x‚PƒÐÅËíͪ¶iüìú œ|ù²âW¿rö•‡wŽ;U Ÿ|ö¬ó«gžfÕi.1.b×¹®æRCŒ«ÕêòòD³Çëãõêú•ûýàG®×ÛÍXʪbä8ØrÈÓ”®·/ÒØ)Z7 pç@RÕ*5†ˆˆì}mƿީVÕÚ ¥J.5WUõÁY©ˆXreÏ=pÛܺ9O¢Jˆ $iGÑÛ{µG‘æà}`ŽBÎ9„Î UKƒ—ͦÁA0MS×u€ˆ«Õ*åÜ¢©ZN-’kvmÏÚv¢pX\K)íbáBh~¥·/»a)@$ªŽYJ©bÎ1( ¢Ô:•²\­ö|'#fjGæ6$š½5ìÅÏÐö{fŽjç¹­«,ÏÙLjÌižÛü.ŒyL9™Ùœæ…s·ª„‚ªmi,Îí}ÖnÅÀ­½¶ûþg¶,Ú·¶ˆnìÛöq”’ƒÄÐ`("bäàƒª6çb× Ó4“dcæ¾ë¤”9¥¾Ñ3çT†a`çÌÐ1¤ZµVÛë!J513;ÏLU´¢@)E¬3©µ 3œ/97 ö0ÑÏ=¾„€¾ˆµ\Æ"õâfs}³3„L Þñå“ãÕgN.cç9pßÜE?‹ÿè¥ནõݳӎXKŽÌ!z@Gž  V¨5¡’’GbÄfÐXŠ þøääèd»¡ˆb5Ð)ÍS)¢ŠÌjÆLfP³ˆÈ8Ž›ÍfÇišSÊí«æRrJÕ4Ëã®ä¢ÖN«è}ÇžUL¥^ßì^Œ‹ p¿¾ž2rï]?¥rïè3Ìy¶@œïzE+¥Žµó8§¬¶›³v1Ð;§GÑ{S<^-ï×ßúWþê š@ÊÅóç«a(5»^½ÿðüìôädqsyùìécËõ³GOæÍtïôìÎÙYðþñãGðüÎþaÙå9"¯—ËŰ<^®De·¹‰>îÆ±V£Ú/z¸ÙAˆÑ±¯57,‚ÍL¤™@h΂H@Fž!§R« ¶Õ#5ùUkLmMJf øn˜FÛë6B§™Íó8Ž[r®€ ö8-y±!Có¼gCêÁ³Ù*ì÷µ6]16û{ADÓª­ÍÕZîOÈαŠpÍ’­-þÔvB•ˆÚyÂÌБcÖÚ$]ÍÞ&„@¥–¶Zh¬ÓXÝÜÜ´lÞÆbÊ¥èÞÕÒöËn343•œ32ß6tdvnå¾­~Ô²<ôÏvS¼ýFà°oïpÚøÆsXu2•"¥”œŠˆ4,«JmÏu÷pÌ z»„_¬Ž˜Ñ90D13IÍM’K½îªjp }âZ«ˆù—«£è¼ó¾ë:ç„×” †®[,!fç~ê5ÿ§­/À±‚ã»g«£wJ‰ܬ¡øûç¯,^>„Ï.žOy¾¹¾¢Uï‚OãìcÈ9wÍe(•là||åìðñÅ®”x÷üïþÁæÊþÚ7Ž~ÿ¿þ7ìþÅÏ®fQ­µbû½g€=¢P«„TEj-Ì<,?ým“=Ͻ­òn}ô¾ªšY³Èß­H[C‡f*Òâ­ëd;÷1s#ºÀ5¸jì9‘MÑjj5ç}ú993Í93ùqÜÓI÷kj³&JJ9ß ¸Ì¬E_퀤ÔöbÖîˆ%¥F¥ï»ÕDjJ©–¢Z ÷ ¶gß×f¥×îU¥…&ƾ‡ƒÁ9„ÃVCU›J«ÍvÎ{Ÿö¦ÐØþ¡ÛËè»®»ÙnÛ(å ‡”kôyÁíµ©1‚ˆ°ïúvR51 c»4ä\šxâVuaf9—B–l°ipÎZ®%ô¡%ö0·1ãZú™w¾Y‰4÷ô†¶±÷ s Þ;b3ÑZJÓN眫ÆkMf`1ö¥äq}Í.ûóÕ—;€/d!œ®º{§G?zvc 4Ù(/ïÆí‘÷è"³ç?¹œ²Ö!ø>:ZÎ7Û«ç—‹£á˜Ø!ÄØŸ?¼ýôùîb·>_ šˆ€9[­ÞiŽˆÖ¼Ë4$íŒÄ>Dȹ’j­Z%WæZÕ2$4$¦®ë[ðˆ‚©ÁœfM™ a¤yÖ9ãöx#Ÿl—ñôÝŒ…¼_-dîâE‹ÃÅ¢¿¼>]¹·ž,—>¥:÷“ç›ë¹8„f(f`–§i\¯×´7 µv&MiRõíØÛž:çÜZIë8‚¯Uˆ‰DjóŸ@æá§æœ±ëQ´4 U¹VA”[z ”"Î!"12âÞö¹ŠøØ1@júÛíÔ¼¦œå=–%ÛµZk)âAÈ…àÚ°ižE´¿.PËî†ån·)9@• Šô}À9§ÍÍ®m¨[Õ¦)kNηά¥äaZö‹04â?3£9tÁ5âó¾æœRnÓ(tALê\«T®ûnÛ2g‚¸Ÿ{tn  "9%ØívGGK$jo¾ólfh(`]ìtœ¦Åj5m·€è¢ÇÃʨìýpLÅ­VëË«+K%å\š¥k­e·Û Ÿ³Ï|9¾ åÑŒàbg±\õB¾‡^T1Å!úÞûæê숃sÄ´ZÏ^>~|t÷®c|\Ÿžw«£Ÿ|ôIßóéS&GŒŽ8çbbFÙ·›˜QªÄa!2ïýÂÚjUÇ,`–榕b‚UÅy6@HéæS0„$ÅÄÕJ»} ãÐu}|û«ïMIÿèO>¹¼ºñ_ÿšû;ÿá¯ýÿòûú¨M Æ€T3›Y^M, î=€—RÆŸæ\hH…Lô¹Aîf 1zD¤Ý¥e~ 1¦ZÁÌ1…›|l¿ÿ$*%ñ0 777͹4®‘!š‚"ªJÛ?ß²9w»i½^µä²[gÐyÎËePµ¦ÏåŸÉµG$3Q£LZQMˆØÄª(æ’sš‡aì[ç ÞPé‹ TQ2ï}»£ÐÁòhÏÕ!DB`ÚkÖRš ±­Lú¾gÄݸY-Ö»y"tÄέj¦DÜP¦ÆðñÞ§<—R¢÷¡JA$ˆk [Æ­ª:æ,IJ Þ#‘g’ZA­V1 ªÔ*VZ@8Q» ™¡s¡HEG®Å½ÕZU4DŸæ4t}.YmDaš¦"9Þ»fúMçÜÍvç98ßf| *¥ˆD2¢à81KUUe瀒÷Ž?÷N÷Ëð-"¼ÿÊq·èv9»›§K¾pÖ#…A…Ú2«…¿ Ù»Î!.ŠužNï܇þêÓO§e>¾sæûØ¿õÕwŸ=úäéÇŸ¾úÚCDòÄàÃ4N>ÆÞ…yÎ%gbÉ98Ç>ÎsÉ9"Ü TsÎÄHŽAAÍ@ÔÀHÑÆ›ëëqÜ)bH¹äšÁÛßþpûq>}ÿŸþ.¯Šu®¿Ú¥óÓ°*Ö¯½qo½Œ¼qïÕñ½·ÏÞ{íìÎq×…Ÿó'³*ÌE³ÚË‹+áøòróîïcºþì%öñâzÛõÃ'?~¾M¥\ÏÿÒï}ðŸþÍ¿þïŸýOd‡q³FØ`•ŠìŒˆkÍ¥bÓŽúcJ€¸?r¶Žs+¾= ·v`(‚ ’öWD1CÇAEBjsj®‘MN圛¦¢:uÝÀìrc숤Vóž[Ò¼ÇUÍómßn·M<%²‡àAÀ̰±b`Q ª{e­•ˆ›(Œˆœ€RìºyžEŠ™™ˆëmŠ™(: !";ËÕÇXkj÷f(E˜] É!"%ê—s IDATjÍÙ;32FTUkŒ}1$p±CÏŽÝ4'"©'†DsÎx+=coª²:ZšCÇíÐw =§ÃB¸-Nšòn±Xä”]ðŽ|®™j-Pµªjp< 'U åZÖë”’GžSòäó<; Ëœ{¿¨¥’cI:Ís×õÍëôàɄΠW«£føá˜‡.ΩĮ[Ÿœ RÍÙ1§)q𞉋hRsAd´z}¾úr|ËÌr©]ïºÈΑÁË׎RGV˜­VÇÞ“cïÀÔˆ A‘ѱV­XÇt¼>éûÅÓ¿¿¥—«“ÓÉÄŸ¾þÖ;Ÿþø£ð£×¾¶Z/0ÄnN‰ £U¥äܶL%%ï<±Ës6"2ÍU±* 0# Z;Ûª°wæÝ˜vSÉe&«YªHxü¢þ½®Çþî›ßú­ÍβÛîr\,æœ ôx5Ü;î^{õèë_={ýÕåýóÕuÂÏON«†'ggÏ^^÷ËUaïüfw½ùð£1[AµÉsv’ë¿ó7ÞûOþÍo}ð•õÏýD¥”Æz‘œ^Š8Ç„¬ªPÍ:f­–ÒÜuë”’*QΑChTt@ÕJäTQ¤xïD ³±–õÈ ˆÎ{È9€s- ÇÝØÈˆmÐSv»fï\QR-ˆ®6"ZŠçc»‘ ¢ª5œY k•ÆUQ€=áçà#‡øøFzj¾uJ䌵ÔÒ> Q!çÀÕ^^©"í‡Cð"bhŽyšgçxš¶Ž=±!ˆTï b3#iÓDŠHAÄT’'n¦ €–æ™ç1Uç\a³Ù8çBôµ +"!¶d w0m yDÆÃ¬¥äZ’ÔE?¨V‰1©’Å7Îy}rúâÅsf–<·–­R (hà0ÜÙG1OóÔvÈ Ð|ª™™¨-_è  .R}èÆqL)1»Íö&„`ZÍ!Ñ”RE`ö„f%çÎû[éßçª/À±r‘ËËisµ†¡Ëisõøís·î)DBðì!zG䥱oÄŠ3EdðlˆÓfBxðõ_zòá÷åӟܽo÷ì™?»óæÛïŸÞ}åþð;ëãõÉéI·èºÐÝŒ£ê&„®Ú\æbè­)ÕЩSQä¦Q©JˆÎØ1û‹«ËÇOŸASšª<¾®>¹¹ÌÄwO¿ñë'ýÑhÑSˆ½ÏN×ËÅjX.úWïŸ;Û|òI×EBWµbSº™SD@"®Eºn˜‘sH„U‘0¥Â½“ZÁÿfܬhé½G@¨Ú¼ñÓ¿Š8‘\rS` ¢cSpž‰¸Aa!„\J‰#çzD°ZEh¯?  6k÷¦MÌáãz½nb76CæP¼¢”ZM»®Ÿ¦ˆR) äÜçîç_€/b•ª—SúäÅõË4‰ÏSÞZèˆB‘$ ¥õ¡V õœET2yŽÙç$ðî_úåO¾û'¾÷££çã4œ¿òà·ÿ™ßùá~tqy6a±†®Ÿ§iÜŒ†@ÎÍ¥ÈX ´¤"¨ÞG¦äíD­‚óèÃÅÅõ³‹Ëy‚‹ ¯§üñ“ñ£„axïþ·¾u®ˆyàUÏ §ë£n‹Å°èã½ó“»w—÷î½rg¸w¶|p~tºî‡Þ»Ï/cù¿GšSéV«í¤Ó¤?¾ª—WéŸýƽÿè_ÿúo}óõ?ûãß–Þ1—CR£©µ ™1ÖRBôŒ¤R ëú’³Híû…HmŒ½yÎ"‚"Ñšï¼s>—³˜0#37Рôiž ÷lSD‚«Õº.4}@)ET¹C)9Rô£Ú\òk­NURÚÛÎ4Bk[RÄ…}Ö±Y ÂÕ®ër.f R‘)çÂÌ9kßc.ž@F䘱VQ®äHL˜R²ö_=˜òç”Ø¹i.ýb€Y©”–ÊÒ—’]E*´ç\®¹õoöŒF`vëfBðŽÌd¹»|çƒ_*_{ÿ‡ø‡1è_§T—‹Õ;ï¼k ?üÑG—WW}7Ä.®Öý<¥í¸iö^ÙX©36«Žœ¨yï—Î}üróýOo~ü¼<ý¬¸wâ;>9^DvwÎŽN†îÁýã“e÷àülÜùÙÑÑQ<^Å£U½óîÏ¡ïßÖ”êÓsåÅ·ÿ·ïþsùµÿìoýÊo}óáŸããÿ´lˆ›ˆVrj…½u{ìbÎê‘Ø5E˜ˆ”œˆ¹!µVæ=¥‡™D,cdšR"r·±‘Ó @¦Z2Õj!@­ÖNåí¤\j51csžkZªsŽ‘Ø1¶µþL$!sU ε¦Ùî–sfvDPÊÞ¶ˆ° ÐÚŠÚ¬Dr¤*ˆ”E‰HEoznÅ ûYÊÇBèºNQ º¿etŽ6ãØ÷½"!¶à 1úÝn×u¹©Öë“¶zIsrÎ"ìÍ6DÌGw˜jMÀ•‰ €ÓdRåâå…Q”Œ`§® ó\€¨ëûižj­>©¥‹±ä:Ísp¼ÛÑíß4çH}Lë£#8 L`jJ šRb¢"Ú‚C »qtä†aPm‹à¼³jŽ™ˆ³dfß¶iœ\pb2OSˆÑ»XK2¢Ïïýåø‚ÕvÌ=¾úƒïþä;ÿû“Ë$Ó9¢:ƹTI†¤Ìäº `óVÔ”h‚ÈÖƒq;8ùÏ.†åâ½o~óOþè·Ÿ]¬–iž¦Ý<…¾¿ÿêƒWô•?þøÅ“Çgwïv]\»“qN/¯_ÎSAï‚SÍ¢ˆ<ôÁ¡,—ñzÒ¿û÷Ÿ|ïùÍwŸW¿~è_ÿÎâìNXŠv ëøúwÞ]ݽ³ºwvt¶îO»³Ó£õQçƒóŽ<þY±ž|=z~ýêÙòoÿkßøúë¿ñÿÆãßÖœ÷n0Î;Q%vŒÈjÕ̤y*Waªª Ž=17Ç·rxféÕZjÛˆ~‰ «ªGkgÕÆiiþý13ƒà} ¡QYnUcÐÚ¨©ï»œ ™8-F‘ˆ˜}-…H›CC#õ}߂ÑÜòͬV !´ÇnðTÓ6´fAkiö÷)ß}‘Co&†Ø –o­·B0>8†¶”œsK€QÕRª!ùàM KJÞûœ+’SKÖ¤¿-Pž™¼wm¤ÕRÇq×p·'õ{3³R¬–Y*15ut]·Ûí¼÷µJ×uÕæ~XÌãf@Ð/ú¹ÎLàýÞ7{o@-R‹týps³ëúèÌŒ¼ÇÑqïÀº®Ë¹Á<ë³³Ý4ÝÜÜxïkË¥ !zRÝÓZŠän·‹1ÆT•‘[02:sÎÒw«õzœF"Rarj9 »"Õ’aŒ]ÎÓÏaìðåøbÕœëÇŸ\þ/ÿðÑwþè'»­`2›/WÎß9rŲrÊGÓyÚ™/;VÛmwì0`ìC(ª¤fu|4øÝõuB|÷kïlw»ýð£•Ô)M]· C€“Ó»«£ã§Ïž¿˜.û“Õj±8å;S®l†sI˜„GO«Ž~ôDÿÛß¿|ZfyõkÞüÆ'Ì`Ƥ: îდó³øÁ;ç_ïÁƒóÅ«÷ÏúÞÅàCdÿsœO>ýÿùïþð,Ð…à‚+›R¥:çDUÝ ûPC@B0#`hzZU-µr­´_ÞBÛ`ë\̾Åv¡Ç1t1K­!t@$%#òíS‘Å0È¡•ßJÏr‘¸÷uȎɽóâ863‰@ǽs@”Ç‘™ÙÄŠ$﹩OÛ—ÙÞY¨Aùj©Uªw¾V%çBˆí\¿ß#³cT,µ"#3×R€È3«ªw®mDTµ‹ñÖS¡Ñ@°æœ31sÞ•’Á™™¸ñ Ö*f5g"RçÈJÎMrÁL:§É{ÏÎ1{vÔ"(ßæäœ‹E×uRkìºišÐqȹ9ç\JÚ49gd'© ‘yïq¿œ÷Œ°·öK)9ÇΪçRJ>ÆÀ¼Ýn»¾oJ·ÆÄ½¾¾n"µ½½à8ð!˜sÞ{1Õ*•Е"L„Þw„,šÌØy?îFæv¢ú’ú ^ѳšŒó‹çÛ”4œ–)?¾ç8†N”Ýl‰ú££õvܽ¸xy´^½öðÕ?ùqH}®ª;×÷}×Ý;¿{}uùèѳ']ìú¡¤ì¢óÅP{„#ÿýL÷{^Žùøõ7òp”êÄ¢]Œ¬pv¶x÷W^»7|ãÝï¼qò•§G«>ÆÏ­MÿE©Æò¾=7èû!¥¹!%t›éH(¥ªƒà\©ÚqzßS°×».ÖZrÉÞGD¬9ïu¿RLlªÕN܈غ)…Y[2eð„d`(¦ –MÙ³¥ŸÆNïɹRë¼ÛÅYEÙ‡y7ù`M0îœ+ÍŒÀ T |ôµ”>öEDL  |ð2«¨8`ç½þ 7¥ªBÛ·ãp×¥yÖæˆi6cmª]D$bæ’RØ/$2!¦’À¬”BlÿyžÉ¹”3;'‚ΓšG‚æäÓüìjmº\[,›™ÀMBÑrqoÆ`jR23åZSj™w ƒ÷踺cJS­µóÝÞdÉlžGç\BpŽÛÎ&ÆHÞçZ»ÚGv{QkÛ£CDZÝÛT(”R½w"*R›¤Î‡ÎyÎseBbžS¦à£÷¢ª†¥ÖR€åóo¾_´ ÁÝ??ºïèd½xùrªcªó&û uçXM+9ojiBöëÕêx5x ¾ë¬÷ìùü•;7Ï_l//»ÕjµXŠ”õ+ç»í´ÙnbˆÐuW—7ÌøÆ[o}òãG—//ºÐm.¯ÀQ?,º¾‹C÷Æ›¯oÇ,@à©(9IeáÈü—/~{wÿî_þµU5'Qåó;ëÓu|û+wßx°zøÊú—Þ:íÕãÕ2 1ü?·¿È%*R,ÄNjiÎeÍ@U½9O `i(3퉳VT™h¯xa‘öË ·v.¥æ`£w«ØUc4²ê bqýòþƒþî|ùñO¦íîäìÎnœÄª n³½ñކ.Þl·u7>|ø Wyyy…š»ÝnºÚÌ®‹ÎõF®d5·ˆ4A•EçNÿÍ·»Ïàƒßø+¿úñîÙN¸wñ|Ùã½óo¾wþÞWNßxprçlqr4tñçȦûE+ïyžGGŽ0c3Ë“lÆÕÆušSp!†µ€”œ›ÞúÞ¹”3ªq‹z—f_YMxZK‰1¶g,¥¬ëøP€à}½gfÝŸ+‹(V­ŽÀD¥ ƒYa"5küŸ}´"!¨ê0,Z0U•胈Hrè½ÃæÒcÖz%—RzCU3Bª ìýä7ÂL33 ƒ-„¦ynNÑ{4³qÜ9ç’TpÞ—œ«Y{sÚ0SÕ›ÍMŒJI!v›«›¾]#bŸÒ´_HõΫ*(ÜbV ÆiÌÚö†ÔªYKJ©-Kع¾ëbŒH”sö.0ón7ºàiïÎ]¦/fã8ì™NEĘ[<\ûŽn}8Ú³{ï»®»¸¸hï ¢Ë¹Tšµ<á4΄–sõw-¶€Éå\Á‡ ")Wþü(ë—à‹UÎñú¨;9 G§Ãâbùl£Ü—Ø/r5 7Pè†å=}OÁGsDàR .¬¾ýÆÅãGJñæ“GŸ|ôã“;§Ç§ÇÎ{æÙª­WË)¥ëëkb:9>Î¥^mF qcV›Ò, µd™Ð9Ð*•~ÿcÙŸw~¼½æÄHÁNo>X}ëýW~óƒ‡ï¼~z|ÜùϯDÿÅ-E¢• SÉ! !±S<q5cÇLT‹ˆlœ´µ]Ñâ8V«GƒšS©ûÒ¦êB"jÖ’S/"Ä,-‘šñþk* ‘H1ó c¢Pµ9йRJð>ÄXk5BÑqcô"Š€Î1`K»¤†\xçšÕ~;Æ6O "3³Ü"´´ö}œ&SU9xG7e–¡äb<ˆË¸U1sˆ  µv{}óÉ€æÎðBµvÓBB¨šžz†XKí»èЂjõº¡+¹äRZˆJ-UÒfCÂqÛaß9×6í ¾ŸCˆÄB ÂRJK½‘qtÞåœç4ìùWf¥Ö=ªCØÂa\µÖZ ;׸¼ío.ã8Æw»Ýf³Y,Þû¦¯µbËœ&"çÁ”Ùµ¢Í,ÖØû)ÍHÄ„)§èü\;¶/À«q½ ï¯Ïzû0cñÁû›kðg™]¿\t!¢²ŒwNŽJ&ï\ß•TGǵT½DüüÑ£ŸœÝ»ëÇà'È7cöÄGGG××××ÓU×õ§GËm–í8K)ލŠJ!æ\hë?Ÿ ßswߺЅ•ywº<Îew¾îÞûî/½}÷õ‡ÇÇëÞó_üSÿÏVN‰ ÄlïóÕlZh¹³3G4šY»õ߆¼ßÒá£÷3€‚4‡h¤OUQŽo¨…ÐlË,„hͦ‘GUAÕ™›~Û²†Ø¨6—Ù~Þ€"bU•œ½sÎûÚ®ª1v1v)%e&­JØ6´UÐÑ4MíºÐŽ®9çÐhHR Ljõ] µ™á ³À–ÖÁÕl®UDª‚Öº?Æ2b3h€;"6ç f4ÓÅbÑŒ—ÍLE˜÷àRû8±JBÑ&;€qœºÐ¥y>ä¼SJ™™À Ê><».æ<ïÃâÚùàœ735q¾kNª6Ä~œgç •’¤Ö¶LÎí½šEJQö® ÷œsR Ú!c²Í˜ö†Ìó¬fì\“•9‡{.)13Ø4Žˆ$`ÁGdOTªB­µEÈatZ5Y !T­Ÿ÷ÇøÿGG¶/~X­ }Ï×Ãw4Ô’í¹êËÍè™K*í@…€¸\ÙéÚ¯–4tý½;G÷ïÞ½ÿŠNó‹GOn^lT)ö‹îν;o½Å«£ç/..ž_ÎÛ„]ô 6Í¥ëŽÂpöb§^\æ\|`YrB‘6%±ÌIlêít^±`)²ÙݬWËw¾röÁ[çï½vv¶îÜŸ+—ÿ¢LEDÚ•¼sŒèƒ„Rë<îRÎÒx8ªÝ!‹ª¡·¡%ûa°©ÒZµ¹+ß®ZËÍUL¤ÖšŠˆª¸á k" ±s!L)MãØ6Íü™(´tÑZ¥Ööj €™3˜ÕRN×éä½ð­ì»*ƒ ËîþùâÝ×OÞ{óìütø¹Û~¡«õp®!`±VafØGhA“n5Læ–ß:NÞûzÈ}$‚ökODÞk³ `&Êyn»PGMÍ+Dd"1ÆFÛoôØÌ|ÌÚ„±}º0â~ùÌΙÁZ âS¤ˆR ‚‰"W©Í¿RN!©ÂεIVJ™¦i±XܲžjÝ[=×Z!åÔܰcŒã8ÀÏRKÉ92Dœ›Ã5oýœMµ"Öyö>07ä¤V©´wHÝ#BˆÐ†€ˆw\™ 1åÄεµDìü4ΪÚÞÉZ‘«sεÂÞº˜¸ÖÌÌ1òA醈0O €bŒ)&ÚÇIæ\—Ë¥j•ÐuÔ>tBASPäÀ&ÚÎþоßö‰ïÍìöîL•½%k|!P4ïCšçR•#3«A­ULѨ–ÊŒûÍumö¹êËÀ¥JÖ7ÓwøÙÿôŸ|ûž~ï‡ÏõG'ï¼@ÿàÉvwyÕE_r>êâq· 9ï.oâb±^.ïÜp=î.//È0ÂÍåegç³sa±Xë»LqÞ–/^î¶[-YELÀ”Ì`qz„!\OóÓÏ?y|ó¿þøÙ÷7/Ÿì–w>”wvÄ‹Ül-ÍλÓuüêÛw¿þÞùƒ{«¾ûÜ)t1ª5ýœs#öÝÜÜŒãØþp'ƒ†_‰Ü/¶–®ÐúýÁᬇ56Kß6í±cF€¨€ˆÎ¹œÒn·“Z·Ó$µÖœÍ9ߤÇiNpæõóÉ×ÌèÎëÚܽ¯íööÖ"DHµ!švr¼P ¢j3wô€1†¹«{ëÖÍ€Yd][ŠÆ?Sý&ÞÝ~ k¨]ݵýôê/¾ÿÁ_ýøõÿþoþáõÍÒ—¸ÖÁû<ùéíßÿé‹ßùÊt˵ïwÓÓ§!„Ÿ<¹þøúg÷£õõU;6]„ܨ¯ýæêuYj­S-%o¼¥^¿|Ñ·}|3IÅY ”0§µ Ð`ØÍ,>•ǯn÷ðìíúðO@‡ëzØínÇÃTŸ<¼|ûÉþÝ7/Ÿ<˜ùÿAï/éèªiëvyy™A¾fF„N’8uB:gï¶1¶efÒø¶Ã÷twKŸÈD’‘ ÂÈMÍ“c²EÑžýÚ6^90Q„M»©·Æ$Ú{Ƈ¹Q†‘a)%…`ªZêdf"tÞ'§“§Yˆ  “Iæy>%ÐP™J_{©“¶.“¢:¤s—âîDØ»åV "<ðLx?·«™ÕZÕ¬·ê)ÇJ×hY–¥E5E`:"‚˜Ñuíý¼KˆUK÷ÿ¤ñ¤IdÒ#¸r(1a”ÀZE-J¡ÅÀÙÐÑc¨Fpë‹›‰;!qNS:šª c‘´9b7PTSp²Ç˜ ÙƒSù Hfæ†ÈÎRуÂ, !Ö•Y Ü}Œut®Ó¾ FRÐÞzÑH‡$0»wý,èÝ~þñÝßüðåßþèêï~ørY•v»8?•G_¹Uª  IDAT{ùâ¿ÿ±~ùâ¿õæÕõ«‹gOŸzuû÷?ÿøÅÇ77w0 ±WüúïÔ«Ÿ~ï£ÿ«MÿõeûÉßþ@øŸÈ›o>ûð§ÿàKÃÙÍAvTÆj3€¯K{ñòv>\3ó˜é7ÿ3Kxžr*‚ˆÇã-3»w‘ “ôé§(ÝØh(é¤/çu¨ŸR ÇGDOZ:Óf^f'ÊM­•·ÌÞåÌË7 @ÄÞ[)áKfv@'„pDTÕÝ~?²m f®¡àö„E¨­64C†ò?¥ "ÞÞÞJ©"äîk[çyÖ aqó!(E¤·ÖTeª¦–™ÉXD$Ì8zhóeYTu·ÛE²žµ÷ 8KžÒPS³ÊLˆŸðjÌ¢©Õ¹æÛf䎈>,Ô{DºaX`Ô*î5—a>†Îó¼®=‰Š;¸ƒê(¥äò…¨ä[p2í©„èªL„ˆª ß+¸»YÒ¶D$M{8¹3GrC5"= Ü‘€ `sÇCˆˆ $VSÂll£»wdfsVU$ªEZ_ç‰ÐNr‡ÏTüçþçÿ_ýIÜ×ç.B¼ØOOÞyó² º6ê^°ö…¨òå^ž´×ÿö»]]D{oîÄÓÕÕõr¼µµ_]¿zùñ«›Û›×7wwëZk-e 7ýêÕÍÍ5Oµ°˜ë²¶ãÒnnîÚz§7}ýðåëîƒ v}ø÷þWÿ–­zÁºÜÃÁš2úó·}åùÅŸþÞ»ðÛoéÍ»‰?ëàצ¾ó/¿}ùÆ[xŠw÷ØÜ2‘X ¼ˆ\ßÞÖ©€Ç9É=o{Im€Ä‚j­ :ˆJu­ËJÀ¨:¸”¼Œ ÑØì6c C¦¤–«31!í餓ºbw3‡"cò¼+þdˆšÉ$´o1KzÖÍóþ¼×Õa@éiœwV™’¼¨ªÀ[’Œ§·eomYW95§8³¥HXœwÂ~Ê@3E‡”(o9gÄgeVãÕR1ànµ„èM‡6.Ãr @ßRK£÷‘óA¾_€®Ã‰Ò_¢­¡"‰ˆ›[x „kÂY8 "€¥™ƒ;Fœ Ò4›ÉÜÕ,ÿTt v‡@)‚„HÛÔ•ÁÎÈLj€á„ˆê Kon:MSX¤ÿàXnùë—o}6óóûðKS»¹|á­_zþðña^?ºÖÅ?zuã-zyòÀ¾1㥾ü‡¿ü„ì½ËþøâqÝï®Ö…ˆ ³öõg?ûÙ«/^üZj¹»9^]_í<Ø_\ªZ ` ±ÏU~þáÝ~öáÓ'„ñE¿øÁøêÇóû5P‚ˆ‘pÞí™ð­§ßÿò³?þÆÛÿáï¾óO¿õîW¿ðèáaÂß`ü¾û/¿}ñô-Àô2zGH\ÝÕ(ÌÇÃ`sóØR×óR)"뺖2E@¸ív»ãqaæLÑ€½ƒ{‰j­f>Ï3@€&׿¤ÌbfBb"$ì}`„ŸaºDŸ¸Œpļ±ê\Jœ]<‰˜)À0ÂÁ]3šFGUí½ÕšŽÇáža’V¦xRçÚVÍ„…ˆòð©D¨jŒ §°Él~D„DnV¤ä8B'·NR¬‘È¦Š˜K æBŒ®ì›û^þ,B4zÃ2›_œ?\u Åij¯FF3æBÂÔ"œ‰‰ØFOb“{„™q)’bìˆ "î½Bz"A »¹0#`>«ºH13fc´uM“겋ˆH®¦€bjÙ9 ‘`Ó¢™ ¡åæñ—¿úðíÏ–ztß~¹ŠˆÞxrx?…ïîúqÕÝt¹ÞÝ­ËéÇOß;¾úû¿xñ³cÏà¶`<}ø°±´õæîhjDH××WÂåé³gf¶£µ @Gð†øò#x¹^?~xØïÞÎSÿèÇû¯_Ô=éj•¥]ÛJLO^¼ÿÅGÿÑ<ÿç¿óΟüÎ;ï½óèb_?ǰùkVßùß>~öh?Öñó>¼~uGîv'Óƒ¯ÿ^ÙÿöÅË~8tWã8ÕéÙㇻÝLÂëè ½÷W}tuýj=®ê `ÃÝøv‰¿hCüÅõá¯^ù¯à_–7¼øƒyZ—Ûižyž8p𧇇é½çþÙï¾ýŸüñÿàÏß~ãPä×Öáù3Õwÿ›o_¾ùFÌ»ù$ó! t· ,F6rNrMâ9À™ Û‰ÌÁç%AZ@ëH(RÙ‡Cø°p7&j­«)ŽÞÒ=?=¡µž¦`ª ǺoÛÑ”ÅFÔRÜìn]÷» ‘”2Z“"„tÞ3Ç6bƒÍÓlC‡*8˜kn¡³ó1DŠPÃÜPµÝÞÜ ¡§ŠYÒpÔ,#qòd×Þ·v€p‹Ô>§Ãi²i{W€(µS„[*ÍÌ1òÂŽ˜\öŒ !¡JJáÓví“çmC ª„˜m®pxäçœäc vU@ "8•ÎÙº"¬Öiž§7÷ˆÀ"ÀRJkI÷„ )©±"’Ú½ZKk Ü\CÍ”X$iQžÛD$TÕ©”@ÎÅ|»»yãýo>|~?üZ3½ñäâ÷¿õîŸü_øæ×ß}÷ùC"ìj·7ww·ZßøLo¼üèå_~øâƒë› ZúÚ&–ˋãljeèp7'@8E ¢ÀZäã[}ñ£›¿ùéÝüí¿¾ü'ð×ok D¾»»! ï­³ðãõ·¿üä¿øã¯üÇô¥¯}éÉ£‹é7ôÿGõñí‡o¿c¦’EDi@$¥H"즆´]ô „…9Oê“Õ%¹¹Élá³n(c¹Hd]×ì,ŒD} J$ušÛ§†*#` ë­G€»!›i$©ŸKÙð@$baB€œkÝì8RÐçÖµçdèjõHÉÁ·ÀN82‡ªò&î3fAæÑ»{'[jPœŒ¤¶œ B©Äh,äfi÷¤f­56¡ CÍ#ÚñîÙûßxø'€{Ð/u ÓW¿üì«_~ö_ý§_ûÉ×ÿË_þä¿ýÿö_÷ƒŸ|ð‘]¾Wþø=ýÉ÷¿óá¿þ?^üü·Ë7ž½~ïíÝó§O—»§o>ò „ÀC=(ƺ.ëøðƒõƒ›òׯŸøÖ[ ÞZñKŸÌà0UvÇ‚k[w»Ý¾Ô¯½÷ì¿ùÖ?ÿƒç¿ý[OÓo¨â÷ßUf:Z/ET#Û1£“š.Ë@$"ÚXž¨bMaÇDDu¿ßNUÞŒäJJJd¶¢»/­ív»5É‹¹pv«µŽT!Ì•XhŒ1OUDÒiÍš23‰œ:J.{ÍÁ»€!¬Ë2ïvEDLjSVâÚ»ö."ÄîÃMN u·su@c¸CÊÝÝm)Åq‹5æÖZ­ED¶ ™ˆá¦£5G˜¦NîÂ<Ì ˜Ã´ÖÒÚÚš&O)ÒÖÂ!ZÓ”*_ˆˆeY@D2ȲÖJ@æD d®îÎ ½¯"Ò5„lšª™¹+š)QÃÝÕZK 2‘†´e1Ų2"J„ˆ’_"!ªšðežeïmŒÎÌy²×R–Õœ‡½ª®} 8¹jf®es„Ðaf[,`¢hD…hR¤ê‚¤bk+†úªK©“nHÔg¬ûð«Q——»o]î¾õõ·þó?ûÚÿü¿þä_ýó?ýÅ?üý‹›»gOþ0Úß{õo¾÷£¿†ýì1üôøóÃôÎO.ŸM‚Ýl^Ú£W´ÿ!ÀJ_“gÿôã7úaWÝVÆæªê±Û^½º‘*Òâ˾ÿÞ_ýÒ“o¾ÿô·ß{òÕ/==L÷¿'ÿ¸ˆ9<Ìò3‘käBH¬Ú‘NÏ÷RJDD[—ÞÖ:W NÙ‘ŽD†–xwÞ7€"¬›NÓ®-wqrSHÂþÖ9°µ&©h-(u¾¥”ÖšF”mÛLÚ•DÂ=,˜ÁC!†i­•#ZkDDC5ü ÇСAc @r5"]Vs™êNÕc´-˜™GwWUU§„ýÁC=´+"h÷:6Tk­¡ ÃÌooo=zäî µŽP(e³Ï;;j$àcˆƒ= ‘ˆ†B0´ÖÌF^©‰¸Š÷ÞYv`®SrüÈ 8¤åƒQoKÉ”Nõ€ ¸@}¤rÍY¤÷QkÉ { uDbf"˜¦ÉÜÂÔÂb@„–Ü…"å2‘‰LGqî:رVjmÔ DˆîUÄÌ»ºˆ Š U`¤ aÉã3Öýö¯X}áíG_ø/ýgöÕïÿàçßùîOÿ·ïýì?½þÙGoÖo]- $^üÑëâ?¾{/~ëøžÃ4Á¨Ï.0 Z[¡ùÍÑ/wmiÊP´?óáa'_y÷ñ{ï\ü³o<ÿÖWŸ½ûæÃÃîþ7äÿ¾’ñéîÓ\¤EË]+"ÐÉs;RÌÞ`"  Hö¤š1€j Øp!€h­#"³q)k[`]×yž áS}øèQo}Ç-ådŽŸ“"¦SÚIˆ€Ë:Æ¢1ù¢:lô#àcšJBÓ^nîÆë›q}»^ÝŽ«Ûöú¸ÜÜö»Þ¯nŽDån=¶6Þ|üÔMˆüù;OçZ.÷_xòôðôAý³ïñѳG‡'ê³t¿ëý¬>€#²©­Ú8C½Yr©ëgN_æ^%|±ÛíÜýúúêòÁôûÏOVóZ·œ€ Ft€¾ç}cÙHÇã‘TG„ç8E¿gð†¥lœ÷Ö6[ˈPw0˜&ÉÓ3Ç Uçz¼[Òè„·~""ý¯ÛÒ§yöÀ´ûWUÔáHö©l¯Í )ç›üIJ1bh:ß™:%qžÒU©Nu.u˜1Þ ="9­Üú¾Ÿ÷€'×´ˆ€ðáæ›¿ivh¢8. 0³Ánî€D`éišÛU] ˆ¥Ne47×R =<ã è <Ú`ày7aa,´IöP͵7MþñFIÒ£ûÒÆºö«Û~\zˆLt8Ls¹¸(ó$ŸGCþ›^cqssSk™êœ‹Ð¼Œã©R¹jfi mÆzÄvìšq9“D1,rI¸ž€nVDò󼞦i]WIìâ¼!H&;P¿Ì4Mœˆ‡ªÖZφÒéËÏ\ Íú#| QõÖ{©UÇ@Ø”À@ › ö1ÔLj=Û|n› åი"lŒî^òkE [Žái$­ÇZë4M-Ū¥”RÊèCè”0wZ8»°@xì§ÙTÝŒ’£I¹‰´Ü—.@îJÈ£Þ "ö> ‚EÜ7šHuWwWSŒ°w75‚`a÷ÈQ¤”2†š5sï]‰¸!µÌÙçj­¡æaLìᦠD9-fßMɛԊµÖÞ[)5)ÝúÚZ«µ"pD01„a€ÙÚîæ²$€(BI7s‹ðÏsß~½ KåRùÁåüæ³ßÏå׫NwÌ@v€¾ŽÂ•eË<—Zkd´ˆºY$C½µ€ËÝõ4ïòÜL’8 ™)A${OŽO¥^D #Îu^ûJ|šñ#Ì}ÛFÖZñ”Ö ¥ˆ!<3ÿ3öÙ6e.¥PŠDF®ó¯ÜœY ‚‘€9ϦMMjÀc,Q‘`[0lüôFò|3í=]š™³Ëåö"‰­îi‘F¤î…%¼÷îÉSª6FDRÖ1“¼ˆ ]( ¾><Âu,£;x)S:ßÑ)=ÍÑ"";YœÎè“2À‰È!†+QPpavþÄcUûñζ(]‘Ónï””1ZºÎa„Ÿ™Tˆ¹0sZ¥µ•¹ÔsàV:§š1ó=«µfÂû©× ª!€F b#Û œ ——Ë1 ÅÀL€á»Ý®÷n6„?áΦ…\Z/‰p¹Û8m€ˆ¦JˆRŠ¡vs_÷õ‹)sG"ëZ˜÷{8Bx\ß\3•Ãa—Î3| 'D(le®fQ§Ò{/¥äù‘€ º‡ûÈÉàÌêIô€ˆ$mΧd.S%P ÛJŒl%ªnñ¶A¸å)nVt›=²é4Qj¸ˆ¸wÍð±R ³D8"2¢E¨Ž´fPwhëš¾iSZŠx€vsß­7"¼L9ÐL»]ëÝÇ8 .ÂBn®c¤Ì•œ>‰EÛ8¯Ÿ&Pm- ö‡9`ó×à¿|òäñyÝÌ@„ªáÞóg¯µBr6#„ÈU·¬KBfdÞá×ð¹Ê=J¶ÌÄÖÎïÈnÚ~4UÍiÆÝ…(òxÂ\-0€©:¢0À)Èž½\¤0SB2›.WÛ¾y`§3(íç´ÞbôÜÀ\=Üõ~p_÷õ ©2O€Ðz«R<âúúzÞÏÑãâp‘¬¿-ÒÓ^ [[ ¤”RJ]×c²ƒlË p f$Ä@N·uËn'0'·ÅÛ·ÈIâx·`ÝÍæÃT/¥`b"ûæyγ,"2u$cÜÇhˆÁ\Ü=÷»¹¨ˆOUv†S¢Ö†YϹgš¦ý~?Æh­™ Zï(‚¦zÎèm¨¥HÊ€9c쥻ÁbˆD”‹bD´0r÷ižÀÀµ» ï÷»wë;Èxæƒ&ÔŽH­‰ ‘2×Ö÷û=¹Q¨¦³iþìàn²­å‰J)ëÚDx 5·ÈÞ‹È€qf÷æ˜"Ì ÝdVèT¹©AŽPÀ•9¯ðI(Ú"‘H¶&mµÊÃ=D*âF"0Õ3Í (<7Æ?Y|:„"ûÏáÐußîë¾>O¥ðÒ-\€=ìx\*wwóRK:€€©:"Õ “iªæ€ˆó<¿~ýúáC&Š€›;Pf…Gav ¹…ZJÎû°áÈÛm8÷ª6†cÀÐe] CäѰRëùêšÄ¡ÓÂÜó”åžsE„«ZÄŽDáîàŸØ 繬6ÂÂr‘O&w ûý˜8,·#Â]}wØm 1±/H6Äp¯\Ý×<ëógÌqzï¥LÂÖÚ  †„F0Ê<%4ŸO#!š1F\f1ÀL3-9,˜Äj‘Ö@ ú#ó‰™)IU.2™¨S˜o®«HDšÚ„C©õŽH”3ßЭ“e¯u"sÚ=1sdó×#Á(ÉN”O/ß,@¢LYùˆpké".¡ëL}ªõ³þß7€ûº¯ÏSëº>D¼¸Ø¥‘3Û°1ÔUW›æ]þm“HÞÔR† côišÓœÒ-¼›ºÃ4MyEvÔ•÷ÙˆÎTÉøäÒJ´>ÄÀÂf†BPeæC©¥N%è´-ˆtدHyæbæ§€ÜÖÈ\‰#,Æ7(Iæù¾c¨"<§¦d®Œê¸»Ë)Œ>dªÐš™ÄñØæ™=¢¥é? ‡E æO#fy°ævd·›Ç02ƒ”•¸«€Òñînš'ÇL7Àãñxj˜¯a>Nï ‘zî¥D’R×µ™9³³@LSÏÑ{ ƺD(LŽ„± ¢BZ3åÌ æˆØÇp³ɱ@æysx@`\×õ¼±H¸¬÷^kÙí6£tMÅ´êCÌ ÌðЮL”F¦Ýܘ˜™W;ÿb|†ºg{>þ/ IDATÝ×}}ž:!Âh¶1O¸2à´›ë4yX©"Ì„¨I? ß¼~ûè»Ý|uu-E‘ßü!gù< ó€(ÌxÊž= ¯â“í.×y7ïöû„‰‰™kH¾ãvÇÌŠ“Ç2«nþ¤§G‹iªˆ„î‘<*B""¤É.Ið!R$ŒhfžÏ| #‚ý~ϼQÔ!Ô†õ@"bì]óùäQ¤¢H*ή¯¯# Edš¦ó“ÀôOFÀµ¦ŠD·Çc[{0#!M5€š¦)Sé™9}@‰¨Ö*"—g’˜ªŽÞÖõ¼uH=]­s²þóµO‡Vd.”Ú7‚ÌTÜ´µffgW6Ÿü^g˜6u¹o²‰ó¼ä`X–53‚ÑÑ‘pŒöIž¢ƒ¥µe 7 ß2Ût´up/»¯ûúÅ”™¦IU¡>­aSQ5¦ijkóR¡p9|¡º@X8À\ç®M˜Ã!0ÒT8°[0¬Ù§÷Àiïsf婽qÆ#ˆ —ZˆÝt·? äòpƒÑó@ô-ð$SS\dÛs.Ëb&"UmšJ’r XX¸$³†p˜‘1’£é:y5Îݪê`&€ô©Ö @÷Psff•ÙÌn¯oJ©¢cäºo[ÜišÆècŒ-²!ÂRÄ×77»ÝîâòÒÝ‹P®ÎK—DTrR)¥$6•­4arl EÂp¢œÒ–÷òIØr^Ò À¤L ÔÇ@UËÎdA«;)ºé4UõÞ™ùx<æ³Ê³O-Ë’·¶ô]H7ž~xyqY„“ˆžt­5w ÌXJQÕ$%áÉ(‚™{×܈p)’8w©• À=Fˆd„ @mtaÉÙ–rLD½·ãñ˜^c(Yú÷H­N’ÄJçK.<Ì*×ZëÓ§OÈÝFï­åxŒ¢’°XZî<þüñãÇ"üøñÃ3Ðt8O9Ìl6ò ÊEB~('•œÞÖÖòö“mÆ™D”,¦3îaÈáNLclo¤û À‰’4†7.Ù«¶ýf I+Jb(¤ÐìLy*EˆHÕ æyã™i)…IÌO­mÍk¸ˆkoêNÈÛí/@U Ô,lØqfö 5 UÕ¹ºzm¦wËí÷ûÃáàîˆDˆjŸTÞsÓÈá<¨ºïv;$$òñIØúIªˆ˜lû4¤;O0‰ìv»$\ÇÛÛ[UE‘O®À¦ ªáNˆ€ $aîçKnâàî~ò™èîn§u."d`r¨«n|¢t°Heï¶2÷ ­6 u´u]—eQíˆ0MY€ÇãýÌŒ:ïBËÿ9ÏóäQÕR8‡6"°ˆ)ô®MÖR¦i"F„s$c‘""»Ý®ÖêáæŠŽ€è'åp~¶ˆ—¶©KÈ–“Ï$_½„‰òu«¥  à¦dn­©Úº®ˆÞšöÞÍÐÂX˜‰Ï…÷vÐ÷u_¿˜ÊK¢¹b­õx<2 1[WsóÐÝ~ÇTÔƒ˜ûPav‡iªÉh$föäÉÓ«««D½óôDDŽ5ãSèÕ?¯#ò¾%p5f‰Ðiš2A`9•;DP„m~¢ûý."ïÂj¶]Q÷ûý²,4Fû45«ÈhÍED˜ÕLM‘ÐTñ¼‰‘î–Q7 ¥Ö±±n‚˜Â¿‚dŽönÙSÄ›WæyžÝºç®3)3< j©0†KÄÞû:MÅ}»lfp˲$£4<_±^²Û!¢™„P¨YÀf°ãÑuF­5ý0™6Ü&6ÏØöÉà¦ÔÐZcÎÓÍQˆ2ñX‰0-H ש<8³•¼»²ˆ'Ó[ã;b˜(DD8¸”b–®„÷0÷u_¿JÈ;÷€L˜#ÿ^d Ö¹Ú`D67"Fô1ƒƒÌ˜iá²è²Í™Ý8F’î)ùþé±,Ë™IDc(ÀÈ‹¶ˆ0£çw¶5Nà ˜ÉÔ¢”±Ý7Çc)¢êón§}˜13ì÷ûÞ{Df­ä"á|z"³2m{׳GBDaÄh}EaL <8z¡¥aјöSoge™elïyt€„AXt P7ÓRj˜DD e‚p nÌ¥12ö«¦{vö›RÊñxÜï÷ Ëœqª3ËÞÔ17𮜛ªŠ„D4L R0ô¡n£¤§™2òñn©SMáðä0!3‚ºy@Žëºîvž¢Û é=¹^á´µ1}sJ›¦©ÎSï›9R¾8½÷ÂLR12,ˆÜ“;€~ow_÷õ‹)U]–!@‡Ïsqw™÷saž¦IxÓ½‘¸‡´uݰr‚´ š¦)ƒ1F[×*âjfƈɔ?ÙBXï=Y’x2˜LZaž¿p"®ä)€$î ˆ„À›æà„ò»!×àiùˆ3<¢®]Õ#†j)%É+`Cf¤’v]æk먭‡{0bj`ó|Êí7¢› ó¶½<\½÷åxdÄì¯f ˆ”÷- j-ó<#B)r?ܽÖ‡ÃÇ3v1?D›e¿1zïææfˆ)y³\·FΪÍ}°”p;®ë²®½u,\v30³”­+…¯ËÒµaÉ Lr=Šë}=1y0ŸC ǧèFÉ!ͼßÞ›Û8ÞÝ}²!@f­µu]Ûºš»$31GB¤Ï‘pßîë¾>O%’ë¶qL"Ð=®®¯™™HÆÀDÈ@ˆÀŒ" ß<Üaš DèD@Ä¥B¼]O:в.y:”ÂÉ`Ùôºù˜…™¥”‰ˆÝA¤ˆH€žM§@ô®ëº¼zõ*ç†1#%ò=• Ù"ótÕ¬ \Œ[„qr4rÕqf£n7fËñØÖU{7w#Ìûéb¿GUC 5ë­Eß\Ø4CTÇÙK93!”DQT5oåç71I\D¨£»fC¢-+æ¾1@ˆ”|)ÆÐacmë:ºÙò@nk„ÀÌTOi9g][­ÓyzK®jD¸2> ²S@¬êî™ièÞ@Í„Ï7 $b‘êîw·w柙zßîë¾>O•ZS³“–ꉡ›-½VÓ Ý-O؈C‰  ŒÝa/uŠð¼!ŠÈ´ßÁº,¯^_=~ü8"v»iš&f†µµ1¶(ɰPµ-aüä—§jœî†fC„™XmäÁru}=ú@@"$á „qâΫZ '÷} MXïáçÓ¿[ïá>ïvnN bïëzìÀ¾¥,$G+N¼Õ‘V:×Ö™§Ræy¿.w9ÜD¯ëê©÷6ãR("íK7ÉñiDHÆÑæ²™#I­ì:†Ž@d_W&Ìÿ¤{+ˆûº¯_L…̻ݲ4?í0 „9ÜešL5ºm>ʵU÷ B€Ô6$DXò<í ˜!¸$92<†nAð€ˆË²œ99yŽ3KÞ{ë,¸Ûí{ s @wI(JÝOS:Nçi˜"[(¥æmOA]'ÙÑ8YPP²-õT©út6Ëš`žçeYY2{&¯ç‰×Ÿ 0È#€ lŒ²ŠM†€ª]ˆÀJ©m½ëMÝ·gØZ+…—e´6D,;–ŸrÐ"@Mk™ÌLDzïÇãqÛ9'íò„¤a€Ác42âR ºë$Rjeæ>†{|š‰ŸÒkG‡Ré`î­µ"5_º¤~F6F„Þ‡E¤fm7Ïg žr7ží|]—ÄÖÒ*â´DÉËýžz_÷õ‹)7_––{N8™$Ç–âBfÌNü“H3rÒêon®‰¹2¹ADç 5‰= ªê^J}öìãqQíDe]FŒZ ÃtÒõõõÚÛTJ^Û…ˆÎ‘U9^Ì»9æ>†ˆ@ èÐíÆé–øU^“U5-ɇC¢F´ã±NSºRgÄe¸³Pø¦Tc";)¹jw·L•ÉsVÇÈã^D,³Ïæ x[Ì<튈Ššm¡W–fAd8–‚«Bèay°‘ÙÖQÆØ¬ó<¯ëfÀlaë:]^ŠE„›ó&&Èfpvk„:ÏHX¸l ÝsçÜþG  ”2•bîàŽÌ£/EÌ”ÓÖÔ|˜ˆ˜y„:s6ܽ¦„Ø}“ó„fŠMñ—[ U!B¢B‘Aöéïñë¾Ü×}}žº[Žn/_¾(¥\\\äAv8ˆðêê†yË^Ÿç—u©uŽ,á8OušÚ²\\\ôÜaB D„nW¹ÿ³½óé‘+ɵ;Ɉ{3³¤×ó€y¯ Ã;ÿïô¼™i©T•y#‚¼àͲ—î6Ð'Z*!Q%EÉs~G@™Ñ{‹ðûã>Ǹ].Mk ä¼o{¡%Éóçã½ÈhF„Ìb>çŽ_«ã|¢@‰¨Âž'z{{û d·µö}cÀ(³ÌNªææÙ©à3D ØB¦3$32˾Àª%±>T%»Ä¹ScŸrWÇqÎUX9SDxÎùñþÞö­õ.ÌÛ¶´–×ÒXDÖš¥ÿ©¢¼§7ÈÊ1Î)âIßËL%r 7órÄ1Q² …†8¹§uîáBA$­m'Oi2P?¾¾÷ð•HBFfÛ6Ùšgv’…‰)-Ïe̬×ðªWý™º\.¥ üøø¨˜­/2èårÍŒ²ÝÖ+’+u—à"˜Çèª?ÿýÛÛMÁ£”ûDO‹çJÊðÌ3˳뮭U{žØQ&ªÇ·ooߎ1ŽyˆjžHËÓWUÛBwW-ëì×@™)‚YáfkyD¸ßïw0G± YWМS+·R›Ù¬tßçÜ©(È(SÒ™Ã{j‚€¾·9‰@„#XúC•ÝÝÜ{µ<ªÇq03ƒÇXÛ&á)çpŸÝ§j£”ÇãØ÷¾ˆªå ¬$³:,…¹š€rHä“„ZgwïÝÍÇŽóFd°Èšs„3·ëU™™2ŒrŒÑZ‹ f๜ø6§–Ù3ÓVï9™¬gCC¡m·Ì"@Œ1.—‹*G$³¶M[¶µÜÃ-ŒœtkéžÌÂ'Ôˆ³‰äŒPÄÊgžŒ(3sZÖÇÓ¦Ó^0¸W½ê¯*mˆ 4ÿãÇÂЗôg–¬‹ÖRªaFIé NfbÕðå–ÓGk’YîÁD€ñýÛ·¬|w¢ˆøÇ?þÃ=ÿó?ÿgï'(¯û&¢ŸŸŸEû©·$€ˆåžª×/Oo½s¹,¸ ët—ÖÆXñùýÛwN'â¦J@$ 3±>“3Ïè].À5¹Q¦‘{Û–Y „Öt„á¶X$)"Ã,L '²¹DÄcÍ­m5¢ Šx<Œˆ„›™‹°ˆÎé­Ñ×@¿µns w¨Q]Ã_?£ÇãQ¿Ss_Vø£ó…„­L"`Œ»{”3CšæÿÖÑ"ÒYlêá¡}73NꛜIŒœf™Äª€,wO7¢±–ÒÚ?þ¼^®ÅÔìM#<’’è×Ç/Pl2ˆh,™™ˆëí‚ÄtC AÇãfó`îÛrŸ¶"Ÿ3ÙZ bn­j¶T»0[Ù\ €‘Oef”õv¹¬u,&'BDëðÃB 6%#™3rÛw&šfÓV…TÆ“ò_bD€È‰Z—e¦O-ì)«UÐz7÷ª~Év‰ˆ˜1ÆØZëªîþñùùùññövõ°å§¸:**~™JÑ %s«;¯íÚ¥w‘<ùÐãQ]š»ë¢ä³™.—9F5Xk-ÊDq§éD_Ðûû»jï½¹ûœ^¬$Ëè,éÌhú2‚½êUI­5ǘ¶¼íMµñ¸¶7°¦™»!£m1»‡t&œ2GÕ—Ëvæ,qN{Øc†»dcݺŠG¦ÙŠU ™Œûczdïºíhí\*p/ZE\Q¦‘¨º»Ï“˜Ö{cîûår¿’ VœïçLްÇÃU9³ˆö\Xf´¶…çd"lmcFd>Žãz¹,¹\UEÅ#>ïwfÞ·-‘v,b`@¦ 5ÇÈUOóÖ¤èIþœÿ¸GÍs¦{@º# à}ßÍJ¢IÅOµµD¥”ñE¸cæÈ`Æ™ŠÜ·Þ¤Î0awL!›ª}ß÷"¹BO÷»oªc­)"Ìlj!r¢ó±æ*!2Ë쮟¯ š’$Ure‰VUÕ͆\~ºÿú×õºg>ÝRt»3ôQDDØ={kË=ƒ)sÎù8Ž|Á^õª¿¦æœs½70ûò˶™Ùí¢™Jd™ZðLR¡¬µjÚZ—Ḛ̀CFcM #Ç{ïª2G ÷û–ñ8Ž­+«0–Dû\‡v÷ñp‡SRï]žúz¢ˆ8ùÃ_üzÿ–½KucæˆuÓ="£¦çDTdiUUíf+Óç4€ZkO_ €{W.U`¶T™YAð¤û¯ZG×¨È â@+´x¿>>ú¶Ùé`D4ÂùtGÊæTó,fÔ€ÈÃY¤m]Dk®¡Ç˜ŒL—&¼o× » k­Ï¹ ,D…u3ZzD4ÕÖûýxØòË„Š€ñþñÁ™Ø7VÖún®µäz².˜ˆà$&²9UÄc±0ˆòÉLðêþ BÇ‘™¥F}»ÜîÇ=©¨Î¤ª­õˆ,Ž”›«êô9ƒU÷]cÜn7"O¢V 3OÆÓÿðøu¼êU¦j&pæ·¤‹ˆ›}~~þío¿Ív7Í  ËÔZ#q12Ð7ÍIËd¹]:¹mÜÖ1#Å=¶­5ÍC™ƒIH¦™M'8©2qds’«h#€åãór¦S•ûˆSÿŸ,‡b׬s‚¯™á½ï™¸ß?}|ìÛ&Rw@ƒYèå~Õ«þš’Œ­7 Ô¡ÌÀv½ß?þõûï×¾³€ÂZã%¢Âµ¨tÀ)3(ÜÒ—¥€ðèÛÖ‰>—=>ïÌÒöýúöö¯þ“ é섘cé¾7 2Αt$E†Bš0š’‡’‘–D(oѾÓóüRU·Xf½73a­h*Ú÷ýr¹˜ûýþx{»Õ¡Ü{ðˆtædÆs !%?U©)ú§SÇÖ¶lT; Nÿ_¿~‰HkaJÊp¯3ÎÎñ”Ik2·½7J°°/S¥µhÍEÏÚ­œ°#Ä÷€‚hÚ1kMDdëÝ#„h% p%˜,LXÊ!}Üïž$€´Æu“].—"tŽ"!,žIDAT1œóE0YÝmŒ±ï;)ÂDìn6Gµmsw \ÊðqÇqüýïP÷ID"R¸ýrù‚L˜ùq fë]Ì Ššûßïwd¦½3)eü ÐKúªWý™Úv¥ôZOX†¾¿½Ù<Ì& T”!gXnéΑѵ)sW½\®­÷ð5ÆáÛ¾ßn·Ìøøñ»G|ûþ‘—ëÖ›ªÈа9‰B˜‰¢´‘%… ¥[Å{©rß„)›ÊußÒ#lã °ì—}ïbÞzÛšVîcž4Ó-2˜Y€:›Zëî‹Èßß?êU[‰“5çók©ŒKî¾–1€à“¼Ÿ¥pe–ŠÉ‹k.‹ϵž)Än–ÄfvÌ5×9rO@|¥QØ2òt˜™“Ó4{Ü–f£8Žc¦Gf=Þ”"ó¸ìû¿ýö=#Í\šû¾Ó™ÙÙjlUNïêr|­—àU¯ú‹Šˆ< ].Gç{“ÄÒ“Æ1·¦æö8¦/£Æ P„6Že½·LÜ׉ÈôÉ*ÒzFóqÄ´ÙÈ<òÔ’f$%ÜWf¨n!I±Æñ˜@‚9=üu%¢yÌÏÏO(n×[Û7È“¨¾üŒ,35›~N¸”±Ì„……‘Ù[«YMÛw%÷‰Ò¶ÕWd&Ê¡Ås-€ÌŒ .èQW@0 ¥«¶dI'’Ü·m­é J,’ ¢’BB ˜­ÏÏy{{+nRëÝ"[ߪñR•µ‹0ØÝZo©z|~º»ò)+*¾ˆ‡3³­É¢I7)ÊÅúÿâZ“»­åi•Æ%ñ\k”³—˜ˆ$ÂcVse¸uO$ÆÐÖD0¯ž0›{º÷Ö,’(>~ýZsòó†©þ «ê¶è+¶áˇÀÜÿðûÿu¼êU®þã¿ýiÖTukDHTXcePdx sºÐZkÛ7gåðpVñ €z$ZW/ä…AÔµyDQCm™'cˆŠg—D,Â|ÂÝj¢B¤‘)ŠÌ _"báœ5¿ÊÊp¯ŽÁ݉КÖR·3ê€2üðRÇF$ƒ[k f©Ö¡4 Lðˆ='?×òõ«G0ÌËìË¢Œçš½:³“P½Výó«]qk­@ ½÷ÿò_ÿ»üq#ØÿêKhà6=¿IEND®B`‚opensurgsim-0.7.0/Examples/Stapling/Data/Geometry/forearm_normal.png000066400000000000000000006336541277777236100256510ustar00rootroot00000000000000‰PNG  IHDR{C­ pHYs  šœ IDATxœì½Ù–[¹®ù!R²}†¾î—=oÜ7>vI$Ñ1ÌA%•¤ªr™±rIÌä°±þ˜Úÿù?Ê“žô¤'ý7SÀò³}ßÕìø·®ßÞ¿¯4ìÕ}›¡Ð€ί­ÓktP0¸åuZ]_‘†5€ÙøÜøW³¿ÓþaÈ÷=蓞ô¤'ý‡“&µüðÈ/B²{9~Z^ÜòÛ¶¹3†-Tií¸³b5D` ÖXLsÐj¨Ò`Bƒ©èČ֠±:ºE[4c‰MÆ÷ÍÜ“žô¤'ý‡Ó›ºùo S¶W_ì>è_Z§¥ü0Á „>T‘‰ DQC;mrQ– ÂP0ÔoòQPša-$‘%§ãÒA™ª4y €'=éIOúôšéí‘é7Ð0öY†N–2& (ÁÜ™h‰˜ÉR† “1 Ç)MéLQn@øM€Bnsö)žô¤'=éû¨ø»³[Í_AI΂O`Àé¡¿‹0 -E‚…‡ŽßÚ YÒ\0tTPÁ>C]M·'&Ý‘(…Å¥Á@<À“žô¤ÿ r¦,Ÿ•æ•Ã@x\iÞeù·ô< Ä0A-þª :tµ}: * \ác…âoЛ ŒÎçÅæD‹`FWY(?îéŸô¤'=éÏAúÖO}E:fùjþWþÛ/ß”ï®<~+ú }¬üÕ±„øLh¶½4$E‡ùgC'#M —M†6´ƒÐ m Ü•fˆb0\À<-€'=éIÿa¤Šü{ôÊík@ÿýÛY"úoº“9¯P‡‰ßGh‚Yjú§s8‡aÐßá>h> Q¦"Ð$‚ˆLDP£+£Ó” KД~“§xÒ“žôg¥“×Cýá;é=Õ>Á÷Í/ß;;1™ ÿm±Úó¹VG,âJø>éIOzÒ·¾óù¤ŸÇ¨ìØ9A!IG¦yó¬ãtéqªŠBK (ݺ¿ "â*ùUŠº–P‘8 ”à•öðñÇ”:ÚhÓp‡÷XÐŽ6l"Ð=–ÔÂÕ\óý´žô¤'ý$ï|þyôf˜æ ÷€"¡=‚5î›uõ91¥¥“¶xt8uûN-e¶ã.ywIÕÞ­hšÉ½eAwÎî´pÛĄֆWsãƒÁÊL4] ÈÂW"K րɥ…Y;žõë6G‰¢§ðÑwV›úUúQÙíOzÒŸœÎ­tªÓªuÒ›û"yhI´÷¸Ia½Ü°žºÕ‘… ]Òµ;òFÜPÌS±Øg<<Ìêý)$4çæ+’(ÚPI–è' 7ËGnØdÀm`ø 0Á:ºâô)1©Oð;’=þïVá7]áÅÑú~ÜÙkó OúO§÷Võ£¤ÇÔŸukÙþÙŽ‹øáá5†DHAkhcôð©bá.ö {¿{Ô{è1––âE³Œãl40Kéâu~Ò£  -°šéB‚)Rþ†ÓÄ™®0„ jÈ@¼DhEND½ý¿+Y*îÙwþ[ç-pî5}ŒfŠáë¿¿(Nû¤'ýGÐ{ñøg`þ;¼~S®mH鿎ÝwæÀCÑ/øN%²«èèbÚšg5hS6Ðý¡ã{mNˆÐR©?G.ŽÎ7V¹š+XÓ•ýÁœGŠÙ8 hÆ,̽¥¤Ôh*ô•“—ÒSü~Tñµ Î˜¬“^üQÞR¾^Í?E—Ógžô¤?о¯Ç¿|ÓÏÃÏÙ¬SY0$´ã8 /)†jðG96©ÀL¦©†Y`DàŒÆ*õ<+?« ®Î7n0Fú2À´‚V£ÆÿÓ¯w–~£•³åÕå2ØŒëÛ…«¢žjÐa0”{Ã:(ÒПOð»RðáëCÞ£/䡜{ãŒ>æñó“é?éOH¯9þ ãõÓÿzË5}­2h×`ß’á1ÃÑžŽf‰MWÉ:©8 ¼,³1“¨Õã›±°î0ÐÚjÖ„ëyÚ7p$i[)$¦ï÷UÒÏ| ÎPì°„ÝòF›YýfÁ wë׌ð%Uè8ïw³‡ø÷ÈÏâàtO!ù .`3A(IÍÝ1…A @¤hê΢ÐÐýº!ŽÊÍE“ !UlÒ3€Çý|ÂPTÃLÊlÐ3 ¨åÌHK`GXDíè–9 *hßî:3Þ¹¿<_î2†¢ù6ŸàçR;¸yIòÊ<ëǬ4·&u8Þ¾xö ã"4H2ÊHÍl[ýå§'ýièÍú6õë› âP<Ï 4Ù ½G>~~ð+žÊ¦å~T ¥d+r©"ÈrÏZò΂:YǪËU4 HÕ·9†W ´RÖÀܳaÂZtI•k¡Ð‰$)/ÙÖ5Æ©¶«.#¬ÄT¥+ –2„©È•·lÍ(#Rv¥qoÛþˆœŸÕÅCnyqdÌ÷ì >n“ž~`ß¿±£+Lb’½˜³õÑùàhÈ¡²“Šõkryk˜…Ô,¾ÿ?—"rËÙ/¿¼wkÓ ?á61K&žtúÕÞ•'ä›ß7‰îsO+ÑmvKàI*²CÍŽô`Þïñ¶m0·èÄ¡|¼,òÈ­CTH $÷Œt/I¿èƒue~F@¥´½³š’¯Å-Ï5½²w2ùwJM ¥VxÁÜž!e‚9ï>0(Q¥E¡t¢²[È ÀÇ}ßûtÂ¥ñIø–ÞT¯ü<FŸåŽBl$Ón;é@†»sXÅ”.Ü/ :þž4Ð|¤e½hgýÍ¢,DL”G#­Ÿdñ!‰ X–-„4M¨ èÈàC‹Šu~=,†'ýDre?\ùíØ =Zzz€ÚŽÕc³'ÂÓÞçÕ-ARÍÕ[¥§šÀÈIýâ9ô§"Ûk@^ìKÝK(ÞšƒÂ-Aj‰w-cWúåÅö¶ðXºÒê¡Gš²PC:£a&Ñw°Ið¬¶ÐWLásŒ‹ôˆiáÅ‚Òc䮫*ÜÐTÛõ‚üö7¸Ð:÷…­e…KÍŠi®/»•à–+ øuY‰! ˆ?î¢ϳ\û´r‹¾˜J³Ê†ôz¥ 6´ŒéÄŽD‰‹ ‰ž\€ÁÔ[œ;‹ ŸÁb%×/74q¡63ŒÇBQkÂj´É"r’}ƒ¯|ö`åþ0 f˜;‘—0Q¥l 7Tw!#žÀï@ºÍ\ Ký‘É&ÅÜ«‰¨ì½d©.…=®¯XCÒ6ˆWš>÷‡mFnÆ2sXÖOqðSeÒ>ߊ¦.,‰’`±cÂMس1@4°é(‚–…'ÕSO/è•vs;4ØÁLΫpUþ½øÇà¸.–·LCÞÓ!Jë¯IºGžáF6*1è#ÜŒo5AæÖ ±à|Öœ.aÍ8dS©[pqI61°Æ5s§D¸O†Ò„qC/¨pQÖ˜w.Ѹ}Šhy×£;ãÔKñ©°%££þ¾Eà_L”0Á(21A:(: é öç³çm¿&ȳÀu»ÖÐk{Øè‹ec`#Á€Æ´”‹·4ÒMØž‰`¿µCϮеpæ$VãPc³TØÏók5èyF`¼º—S9‡=ØKÛFŸ|í›g9˜¬N­?'ÅàÿêáL¾Ïg´CEðõ0•Æm0²œÎâ[¨±Í¡çÅ„ëÈJõw"X~îèÀ~gY¤GMŠ\Àp|€5‘ÎÈtX!í×/¢øu}{ ÛÙ¹ Ò¼h„»5”˜CìÏŠJp|kîßNÇú³A£A‡~g Ö¹OÄr ´Ðãkp3®“φ*ãt0\B€ GT+;á@²˜;ál0÷Ž‘ b9'ÝY| žùOgupcà—°ÂuŒDI¢¶²šl‡ Dwx™¬l ãnySV£wîÊ80+žÀÏ&ËÏ"YQ$ú¥<$õ¹R›Ê Gq@_:å{‹k—sÍ “NI Öu Íbª™°ó§iÿ…ý;šþX.­Äsjåã>Yè€ÉP>CiWTY^ l ·`US¸^˜Ìý»%¡ fÄ=€ 76>yKß@V­y Z¥[&.ùÓôŒ}°òp¸ãz£ÿÆ7Å4Dƒ{‰MMÔ+Œ]yFÁ=yê+´+·xæŒyþ¼wú/ÔôÁíàvã’ø~##>§B=¬a)c¬@ËŠráðëÌd¥È9¬¶¤Ø~a¶ˆa•+bè È`wCn™“©Jo»R?`û„ìi åÞá)~:ôlà°èW4zžmGì”Y”âÝjõhB“YŽ*n𨋅îuæŽûB©¡TÒ|aMî~Á^ÿLòÀíè•Wô§£wÌš€g¬„Ñ)ž¨°ƒåNÈ ÷OôÎr÷Ò=º ª04`Gœ½× 7·Z“qEíHG[èBs“#°ä!Êïñ‡°•ሓ+`·Rz ðTFúÀÕÒb.âà ”¿ŠÞ˜«N3ð–寭s™ ãæ U~ :¸(·ëQ³Ó½»cbmG‹úÕU¹(wÖ››õûPËÎ1ÁÆ–Ö šRšÏ*)³‰A^„åàá2™â‰<¶*’ðèT”ô=(Ú2ri2F8l,ÝÖ°qGþÁÓÊQìô?ô­Ýƃ¯Î¢'jJ‹8ß„"ÖwÉrÒ^~“¶Ðí¦«=Ùe“†BÙ•&¸ÅyD9Æÿò¤)ò!j[ É÷;ôˆ"»h¤ø ú†25‹h`ßra­RÐ}A»ÑÀàÆ²8àe³÷†8B/#uÓ"ûTÒÉjxéïUˆ?¯ëé»­Þoº»Ma„[Œ;ŒrU| 'àVá®üíÆç+Úy´;S@X“–Ý:bè(IoG—cc*³1–7ŽáHŠ™Ü.®‰w°¬æVá:’ƒ4Vâ³rùÌýÇ{⮓˕‘¶»¡’PXŠÈ^¬ ²hˆÆÐŸ>€ŸMí íHc­~rƒ½<ÒBì;^À_Œ}Gý=W ôh„yY‚Ÿ¤l…J¨rä2Ý;&±ð—¤œyËp-ÑŒî 9D¸4îî"ü¶@2˜`J›Q±`-Æ`^7T¸)¶Ât\öÞ¬¦ú較d'Bw¤`ˆáuVj6.\ǨF+ÁK q/qš¡ô(ÒaÐ4“`ÈGnéÛ¸!ƹ†ZÓóâÀ,L_h%ª%Ç'þuç§” =kÃy̨gíÚD5+:¤Y0ª¹£D iÜKŽ®Øäzlv5FcÎ Üž BÝq»m„U¡ºëÊ(ôÜ\Zb_+ƒÖÄÌ2,ÐGšû÷)þ aï¶tg•¡A]VãUg5 Ò;•«7ô¯ƒŸøüuÁ¼Aù¤;'ržxKù$Ä€G:Ñz(¼· 0>b ™Ù:ññÉiw6d$×6ZvYÑLJF™ì£öI²¯¬?£…gx÷ŒŠ‰X¡v; ŒÜÒ˜Ÿ£$K ¼æ£ crk¨q™õà.3¼©~…îÒk²$ñlj‚6.-buVKT-{‡ùã÷dÍêqD„#§Ñ®Ü`´]ÍÔcÜjYBŸ!Ý_dõGYˆu j@%9VàAªw–ŽŸˆ§ø½ÉÒ/ülïiçVJž^*Sj;{o}‡ñëà½p P˜Oº—Dî‰[©L$q3e=žõ»Q‹hô¿>oÜ1_Qîù®ïŸÎùîüra\ÑÆ¸sóÆRDX‘ïs!‹05úÄa óÆõ#CùÜ"%5Þž9ê/ÆUpPƒ¸aûøŠpw„¤«#ÐÐ7K÷€´p–60Œt‰¥Þ3-£€Ôã3¡)ª!ŒÈN˜÷(«àŸÃíì’Àe^êI.zÃä¡ $ƒ cÖ:M4Mã»!Ê2¤įi„L¡ûǤYÄ\á“W­ä[6Îþ\zO OèÊJ©Yš™¿I#¬)Kã%˜¦|•å°è_ïYiŽ˜ñ„€þ(Úb¼âÀÛAlSf ›AkŧTÂ@äÑcAwÏ'¯´Ò2êóû8x„Ïþ î¤mô¦ôß%_¹M¤cÀ5ýF»Ó…ËCgvï)@S¹:z Hçú¿Y¿„£8n¬0öí^k•ƒb¶sÍL"6?LX Å¥¢–mÆ-"ÜEµˆ’Áѳ³ì`_9=}I;b)ìÿ=WwôŸ‘’¦¹O.Š\QƒÅ0Šé‹²íÝ›†f%än1­£Â>~f±¶$P3v£1QfFæŒCòúÏÎЛ0졊œ¦ëÂeä‘kí¯~* ‹ â-=D%‰?¾êcö®i ùŒ%('™ìýÇíæÿ&ÒnZM}ä€5$ÕJôA*¼¸fê¿ê‹/b…|Õ –½i#y€8  3{X:Z¸ÓïH­ ª¿Ì°UiÇè\;ÖÆås€3ÿO„ö;ÂÁË 9êÝÑÈ[»—¬~b(ííoð7ðOlE™‡Èÿw|½h4yŸY8rMw!hiñkdo%û†èF«-ÐgIU& ±yè‹'WLZ^Ä*¶âHA•:¬élƽÑÿ:\?3]NÜ»»é´ õ¬”U“ÆÕ;×; ¿4®3'Çwƒ9+ìMž^ñš¬?_$ÜÑÏ!'¶©mÑ#ÌÓ,¶Ú3 7g žÃ]Ü£¡ƒÑ×wÛ,¾…ÅlÐð Z(Ó~&½Á³m= ’-_Æþ×—xæšË«kìs+ƒL¾2ÙGºŸ¹Ú)(MSÆîŠßYüUé4ªÎ²N¡t+m ÊÔP~%CýàxQú` |€^iæ.Púä~ǜŰ ÒŽ^LLòÔ:G|n ÷„)®q5ï{º¬"aØv(©M;SÝêËH£Öo”¦­ûxqÌýU+¼JÞS$k`ʇÅm`íð†™¬–“7λâáÞiʇ;ö?X{èFnÏF£§N®âLYSûÇdRä—¡å‡M‰,-%b:c, ˆfq€°QaLÃn©V’Þ‘ª˜"3êÿôŠ©yÒïF±=,’¿"àò_ûŸ_Z9ß_qÍý:‘,ªÕÑ!É 쓾™ZðÇâ,"¬á÷-Pº¦[õ# lmðZ'í]ç?‘ÏY%âߨ iQ¹sNÚ¦‘ƒR‘îqãGrñcBëGSkÑ3úzüOd!î[NtffYVËÁ¢†VY:ÍŒ©‰»ª.YöÙ³m[K+‘¦‹7tÔ§öåÚVV˜ÌÆÈˆ‰(~ºì}‡Ðîag¸û!­fLá"ŒÿËíFs£A óÈÅ-4ÌËGC4 0=Ä^ÏÎ ïBn(²`†1!wX0ê°c†ñã=r)ÖÓœá•í¶ˆ{¡ÿ9OÀϧ#t2 €¨â$?‡udÿ©5Y‘igTô:¿û^ÿÕt}:#€2ƒp]Ü$çyeo[ay‘úL—½*SàÈ ÆG€>ùìuÖÀ:3 ‹÷T‰ð4Ê¡›È–R-1t% ûx°@d™5”Ȩ›D„ m$”\äM-g#îXYë UÉþ%\àæ²AwHReGŽÆì \”I®XÂ/²UEF´ˆ‰14l2®Ü£¡“f‘HåÚ½Œˆk*˜Eª&¨¦ (ÙaÕ »ö ËkU0ÍëLÕ–×êQ¢·ŒG º>èJÇnsÿLø5zèÎÆ1Q‡{y”l%0/Ì…Ü€¨îâq;2˜£†žŒz0'WC%;8Óê)`Î¶Úæì/V_Áý5Ú`≡·¬fŒd­ž²beÿeŒìZfŽÕàzCÏ}añÙ¢_¶)+ž¦ÛÌ/(Ê€OÎo{Ì¥rÔ¹tnÞ¼ tÐçQNQƒíº—Ø5›(ŸwE'£Åƒ8—·”FˆÍ•lâd)?„ì:YèÖ a Ѿѹ³;œmDš…G¾ZÖÞp9Ú ,"a¥Ï,;tùŒ2jò ³K^–×Ý02ÃÄñTM+ÿI?‹o3z‹’¶…Eþ™¦ÔvúÈ o™èíÀD%1Ö'½IC–;v|ãɤ@?ÅÜÊ¿@ÑKÔ|d^a1”ù+QüKo GÓâ1‹ »¥Ò Ò7Âþ‚¢€ Ä` RPÃVD2RoíiÔ– è8ø-Ú¹$ÈÙa… ž‰cmn,Þ¿=ܤaGŒ½¦q©ë¤ŠíXUÆ_ØŒÚÚa‘!¢@qüÊûÈO?²Eix,ŒõÄóg@ÊuMö-ì=NFõFÄWôJSºí tSFªØWNT84ô°áZÛììÞ4è霸ï¥%Ê0V;z¥e_ɧøÉä6à6R^Áø•Lïyõ󇒦µ÷jŽJe.?`bOÀ[d‰8{E{ñ¢Êda’£\‘ëý{3qáâ|å#KÑOÈ„Àš\á>“yK¾¼˜÷­Y¬Êõ»‰]P@<ÙEHCpl=Å•ŒèÐ&6£¬¬”à<úcä×ÚJVX¸“fÃÑ4 |³(²h3*Ôy[öHƒ×`j®»{ ¶RÄT [xPÎþbõ}+n(”hžKQ*\;\XMy,Ãu¸Tn¾QéóàÏø)ÑÈ- ½ V†ŽËãêE°Þ°vMF#†Z˜G´ IDATÒˆßQüXÇ\¸ 4Öª¼QFÍX†Ùxj®ÇtfÃBO9î$õú£g´C9€FGûCÖð¥Ô·FÏB˜Sv]²ÌœÄÒL‘~ÔµΣBäyÕHZáà`Uõ¦"…x1$›sdƒ—‘õsw#¦µ7ÆQ8OŠí6ĸÛ!ïÛ#032’]hVóõfñ{Ôƒ}F(ùÊ!/±×Û ‡fÉ ÀÇz jð‡ó˜¿Òó`[×ï=ù{ÙÃ}sÆÈR‘ô ¸òõ'àþoÒÖ¶rõˆðY` ‹Ûù%BÅÿœãÿcè´ŠQæ,N³YÀ\1ôèLä_ÌZ‹>·óƵÀ2;]%¼qS>^ƒ1™bmWzómh*þ’Á9rê³=âñ½¸q«:Du|çƒ ‚ö±ƒR”£/J2V=¦‚*JarPëÿHyÕ㌰ŠÚÜW¨Ú;h*O.#‰Yí ]B›Ø ÐŽWG;Úé‰2ùNŒÆM®÷¸6mH‹ð ºI=Þ7¸¬å18Ë>»TP¡·¨6ÑZZ>×ìÆßJa¶-ÉÌ^¥Íoa¬ç5-Ö2¬HBõZxnÓC51±ù¼C›PMzNÑã„zm/ÅÈ·Óï…¥>ð¥88ð¿è(Ëæ¿“,~,“cKü·½O À¹pû;8ws•íÁõøHGoÈ/È…1PáþOú¢}¤ý%\¯Ñ/°€8y9yVXdv¨Ÿ¨¢3ZqéÿDn°ð¿ŠÞ˜YyæNtùò*˜w¤g_Ü+ÁL=`´#.Vž:ìµøW½T½E:‚Sˆ–ÚY¿Ó<Êhîu±+Ù¡¨ ÇI)ÎDЧ¤ñCjÐ+ËDÌL‹=5&Ú¸÷ÈP£´–U}´zÉ.u¥K:{ʧž®øŠ¿ìî5ÉÑ#ñ«BxÜ&ö¤ß•ØŽ>ùôL2ÉFc&}’ ì*¹Á¸ÓÜñäµ–z}Ô%õt9èõØžœCK/·h”Ìë®,lSêbÃý:3ò®£Z.°>àã¶f´e…¯IÎGxÒo£Ü¯¨¥Ÿ½²®-¸¡¥å«e_WÉÖ¯¡\oß÷+è¿ÛÛüþÁœ‡UAA÷kݱ{ôöoû %Ê@¾ºåo¤wFú§#õºl +ŠjÔÛ—Ì•­ÖlÚ“%Mš Ÿ˜ŸàŠÁÇŽ^£ØjŒL¸Þ±‰MäJÿ—Ð]–´÷õ]‰ŒËCA@ºh÷y°È™z˜í”[žå»RÁ—ËØ:ûŽ„µlB1v d^±&Ò%9s,CÊ¡-Mõ\.λ1áÛé3™ãöŽ(ѹe„ ArÔ¸YQs¿”¸(â–öרªxÉOÞÌÚÚž÷ÛÁ˜i.8£ï8Ö¢n³GBJ”°RL¯@G.ÐC¦˜*eÙÔûÕð.Œ{<ݯ´ãŸÜt[¢q­wzB@ßK§»IC•°•5¾·²–jÎܶØhoB?«EF_äû|k¬Mµ™$B8†7/ßdñ€X=8¯§9<™Æèô}†¹ZZòß Rñg&=þéú£JÒ@ÄDvº§ïº¶(ÌÁð}¡)ërE•Ë/|†Ë߸ysÇÛ1#Ùë­¡9¡¿Ëb¥{Ö2I‰!Êm–ê²RmÜŒ¨.Åš³Èe`ÛiÌâmÖ³¦fiÐu#GÕG°Çým¸È”4Oþºa ;\;«Ç¾ë¹°µB0-šÜ̹ywíG½&sÌ;BÔõœ),ºDk&ç¡6ro´(w1% |rczO‡[¦YO–L[+ÀÀÛ4€©q?]z¨‰Æv*lDÈ7æÑèFzÉ—wtcNª|÷3ìGÑKE)!<_.–:NÍ;Ûefʯ¾G-%Ï¥E Eñ™oR#@‚1™†QRi5zèÛVQ µITGbPKãºA§Yšç¤±¬HÈýNú“rÿcº|bcrÜ…˜ìUt³<ˆžxÿ^¯‡3¯iœ[t~dM>^ùüÿpý{°æµ»‚A:²/ù¿%§Zf̶ØŽÔ/¯”A)>.¯Z,5Î,5ü «8—d†aCûNpk)ùBJ¥…•8[ ¤¼ñÍ–ºC’$ûÕ_L±Ãî’më3@^kþ}TG É´»Êä†fåÔVšJ¶K2÷è 22f÷ÂrÖï’Ø½Á3*ö¾ŠxÒ Ì—Üwš °ˆÐ²ÊÄçÛ.ç5h•5R¯ 5 ÑHškÙ ¡)ó–çf…:<À?Þ0r/–î¼·[)ó `_PáÀ^N¥Â¼t_ÿ+™c#²ü„ðV¾5JáÊ[ïìù´` b ¤à`_3mç–ë^h=ùÒ£þ:Òóax,Õ+Nõ>‹PÖ|VñŒvô’õÉ™YQƒ¨×8?…G}L–pè•Û¿¡¡WĘ ˆ†$Ní Š?ɔҰF#ú–øx0d/1KTºÊé¿ì—v‚P,†±ò+-Áï å{ï»ù×Ôp‰Ú>;À´0G@vFG;CÃú\é“p2©{ß`IèÃ{ázg—-Öó²3~½E°ÕIuÛcd—;·o™-qÝÈŠh˜Có:/Åzê=êº1m´KXÕmåvÖø·{ÖÈä~Êc¢óš‹ê WX #}Î’`wïLÑž/õϱ‡þºlfœ[Z]ÃäÝw ‘{Rjcá*±Ÿ žÃáö5c:ÆZ‡±ó á ŠÌVu½"MbÜbp‡{&ñ°¾VÉâÒ?(èáòG‡yTàu„~·ÊŽâ\noÉc˜ÇßH¨a^Dtý2àŸG.ˆ2ãNK2ÆümªÌ¯21k…´(@Oƽ·Íxyé(;‰”\´«±*ÓÙŽuÙøîE«åwˆ?y"kèÁãàwYrnNdæÆqŽF0kÜá…õ5SÀâ Ã;í#n…Ô›rN=ñ™œlç6dV-‘nF}h4 {K/HcÜá†Ìð¾t˾KÐ3ƒ•iìz‘g×úLk›F ‚ ³Ó-A¯ÂBL ®cåÛ‘±ÿ~.Dc4êxŸõÇžÀwÑ©†¾Ön·í»‚›»}êÜÚ·(ן_ª8]+&ØB? %Ë÷ÀqØ×@KrŒB‹SÔ¨Ê6?œ6å.ò£Î_¥LE-#ÏS~åÁßì ]Ï~pùf2^Š"WÊÂŽlXÞ ÆÚ™¾«DÍ»âà’L³•3ÀçV«sç4vwkLa7ÕH*¦ZýBš,‹Ý5RP®Ï„Ûñ´&ÑQ§&ßr¢:´ræ -+5º¸ö"tG"êÓøítî¾7çq£%©éQ9Vx—o=°ËÔÏÛù—üÑ;ò £÷+û>ßAu¿r§d”eRTb}•0K=wOy‚æaä&È+—Ĉߴ-¾…^Z8m›,ßäùaTJ%ƒ(-£9Z•×$õîÔÅác ƒìfñlãŸ@¶j)Eïc@í›1¶_áþf;,€‚žpŠ&+/¨êHÅ*9¡m›5+³¥ÈضxóØ¥d5c'-õ¢œÒ0ª¡®ÇI¢1%A-®SòDWÒõÐQ¢’¾¥H‹Ñ¤Q¢Ù„#¯æJ¹‡ØG Vï2±™zŒîèYÑÿ½®ìŒ8 ççÌÂéD6 "•¬\К‰ÐùY–ޏ¬<Û ëô(¼AÀz)]h=Üã1íî5¹E! ´õÜæªuñ´~.ùž—c±jÑ;~MÛnHÛV“kìQíÕSv¥#5v· ,þKŽ‘8¤©ë´ã¶¸òØÛÚÏ|=Õ|KbJ¨B~Ìúµ4¥7©½ÉâËßNäFýÞ¦€$“ÑûÛ&½vré†>a+9ïØŠ¶¿2ï ¨©V[Îñ oy¼€€×KxrìÈQ§&”ò $­½èÈXœØýøF£_JSKqæx\án“vIý7ý©"DÚ*€Ç`ì€Vä(z|X®~/O¤ÙÅZ–^7D2Ä~ ÊÕ˜-ôâ°KÀ²nÜd+Ý&{º†5v”‹W!Í€¨s®L"ÖëRm)ÏùÔ(–"305Àç–ÈÒÊÕm4}†~'½Ø–/UT×®ùš KItèÕ«uµ<ååºÿhµíÊÄͽmÞ7¯óšò"aP“«3[PmûÙÿ(.ß+Õ^-ŸØU¤ˆyh·WÛø7â6‡À‹ˆˆœÊß Šíç΄¡Ür¿ÕEÞS¢ÛÞÉV/H–ëÑ”Z"G×2·–d ß>Âæ1?-ÝŒ•ªøoëaÏE½IÅ&xðe‹×TÑŽ¥8'nòp;ä³Ebz–Í©N®‹Ô•+)74zÝ…&ÙñÈG Å&ñ“Ȫu)z¤øé+ãjÒ Ÿ 1?SÊrí¾Çõ;̳5ZrUã)¸‚ý„%áu„>¼>T•Í+ŸþùÜ_vÔÄÞÈ­  ýáùe’z}bq~@TÎÈö™ŽÁŠG¥•æyΣ#‚^C‘{ €FoL¥‰3$yüšG¿²ªÎ{ñÇ ‘úE¬è*!w€þµ.ÏÝŸèÝgàªv¬NЉ•Jh³ËŸÚü帎:Y{ J»a+¹ÒûyôøOÒ Gáâ?qAÛƒx ‘¦È§­ª÷Kt_*­"âmmuO;V†c:D2F”w¯ðžß7·¶ôÌ·œœì¦¢åÈ;Á£KëŽèÖ0w=æ_ëE$þ®©ÃJö «Bi.Ò¢ÝÊBËŽ¢@•([úÊËàc¡Íp„ºXÒ’»9 Í*˜íQÛõB–5”¼O²‡º-‰‘{)7ï 9sk¸SWÙ»£Ü9nçíÜoÉbœ-N,IÙû´öZTͳxݽkBõ‡iîw÷ªv¥ E%Qw$÷;í÷ÿm7$ëg?é{é 5”è¬ù\Êò—Î1̵û&lã·ôE³+ÿe÷F’q ’e¶¨ šöÎáó¹ÊÖÖP^"\áºM`+– ,…ùúŠ?kÂD¡àõ[\é±ùÙâŠkì7ꀟ@ޤ;÷t™–;asE8?éåóª¤ôúHx#ò‘¦Ò5´ï³gäWÚl{lÖÏ„eš éɲ ý´‡U¡ÿµ¨òöJÖ¢ÉKïÀ•3Á¥§Ž`X¬Ò:ÖÊ ¼¸>îYi#ÕˆpçG‹r›ç:ê’…"ð¦bor""‡VE×"ok%?yÓýѤc­¥[¤-%ÇY&ááÙÒ²sKi*ìëWrÝÎø‘|@˜|‚ª»}P!ÀS–çºWZ Ú·–&3ùo½Ž<-€B_Ú¢r¬¼l¨©ä™¬Ø¶Ìxûú¹åPBý^šW kÏi-DËõ­¡š¹VøÀ¤¥Ç‚]–f¬yòŒ„^ÜXíš'jdBº˜‰ôZkòp—ß@’ÆMOvL–ÊÚåì(âï8ƒUˆÅ“:+1Áîûˆ*ÄnP 7© ÚdfÔ ë)¹¿•ô%ÓÏ?‡Ë”ó[Kö—Áû+9 Çþ{L¡·Awám¹,#g$™_ÓÊ={¨ù~wiHgzªÊ ¦©d9{a¸œ°œ@â:») 7Uñ0âuÿoP'‚ȰůÐ#÷b%tž³Ðí((”š{Y)‰žU9bÞÇ?2“KBø‚¬$ÍX9ckúçÛ õ|\\eÚ<Öã.4‡q$ÅÃÉåÏëŒÔÕLsÐÕmwK¯’‹6éö?ŽNãìá¯é\†³%»jæ«c¶>žpÊyË$æ°µH‰Š‘ÆR}V³f׬SÉ^¾ÊsÑÔy5‡¢¯N4HÛÆ%³¶ŒŒÿ9qÕn4—â+JœÏ W‹ôËõå…ÞÒ{yTÎÀK6v>N¦fËÍû-d¹Z‚ç–ò{šGàŠß¥@Y`D3¸pÅZb~$pH²$M5"Þµîj$’UõT©4¢[\Y~ÍÃÔhé®(Þr$Á@ó™êiYÞQÝ¥ìÄîqÁ^Ši`8C_í,‹š<¤þîá4®]µ–E\|ÔZô¬÷'ŒS8b7g:-æaW›š¬ îÌÍ:^5ºW®oéyz¨by:¥få<Ÿ»O 3ÝÒÍn -â6žàPémò⯵²[»¶ä+ ó¸f{‹#‚${®^?{­X:—ü°ÐY…Ö·¿Íó_¥<æ´^ݪ@÷¢ŒÑ¥÷ÏÁãðÌ‚A_À_5S´”Nª ìæeùe2éôÔ7½€áù–ÑWË[û^P‡ÑY :Ñ#óiÉÜìoµ *´\*‡™åú2ÙVÙ¨ªú²bq"âsÿhÐX’ ‡†y¬jáE~ì¡|hFššDÏ™ÐI¤IAjÛ±Š-–Mʖ͸õ“9ç>(×Z®ÎU½Ÿ¥eÂmb’a14hѳEáª{£˜²”‹E!åVu•ó¹ôÜh„“`¯+Ùæ¦TM‹i¤T — yr91£ G#²´Ð”ãðûe{†NääTaÁ‘â§Ây÷´K˜+Í£d* k ÄŽ8”'ý0za44²7¸R_b«@¶|{}‚…Å-¶g1#NNÞv4B°HÍÊã¹uµö¼ìÃÞ¥÷Ëq×n~ «±BOÑ[6¨$“Šà< øTVȈ@ÉŒÖ/ËRV0hMEu (­±ú‘R#!\ûB':"8¡XêuKV»ë[h´_oƒ±hÿF-½Óù ¤|KCÿ5;ú…\ãñó’ÕÞP þÅ%=Þ¥zDì¸Ø|¤“Ï„k,™•”ƒÜ&ï#hsãBu¼€Ð(Xô?ŒJ} S}8Ó‹Cvu­â6²f¶}éz~B)kšŠ¶ä¦må uÙ@,™æíYZ¨ê­>9–Ñ9¸¯± üÀGQd™´¬+œÃPS¢A¦ͰüÄZôd®ÀWÝô4xޤJËÏíûd€«Q»Úv ˜;Lû¼zhޤêuÛ;ß;t{æÝkÀ5€ß¨õW›I9„¨bVŒ&Gx‰ä¨¹pé5œ}gXá0ÖD$ú,î RP9VN ^ ³%üñE¤Žì¼8'¦Ée™ùޤ  KÅrZ(‡'{ÌÎs[~°¿—²°™Ø”k=‚Ù¬<qŸÞzÁ½â>ÁPÚÚ‚xÀU 9õöù€’{Ðçm»ÜŽ×:ñ …•—ËÙ¥ 3 …1v«™JÏöp)-&^w,5.§©l§*åw™Ç>ÎÊ’ªhgO à‡Ñ‹]ü&Ó‘4Üš¾úªd@rä¾¢…©^²¢â„”7¥…ë/nž†u®·©²žºá îüŽ\úu1Pn†X‚-{†d<_ð ‰(÷+ò!ü~ƒ´Ü%“ §üá1B„“¡«k ÙÐü´“Þ|+^2ÁÞê\sÛ0瀟eÎþ-Þ××ûùEffxùƒ·y½Â»ÀŒ`Ço ñ©Ñ²Y² 4טÉxû-“ü]Ìã «‚˜%ø¯¯ ]Ö„x|ôº5V%«èé&Åú Íâšh´+i-’z†*š¼8·Â:*£å-ú‘·,eq•QpVª·ÆŒ©¤ßX!Š$/Ýauø@ÏdFÿ{$m<²È‘¬-¾l1ÖꮘìFíÕ’D«Fv9®W£iš{/âÉxª˜†‡Ù¯»å;*ÁšþY†++!ƒ¼ŸÀÏ wç4ôkÍ´ ¼f´¬ßËD>G£jmQ*Äé´ÿÈÒž­þ˜#ØYÁõ#[ìkYÚùó’ÛçŽzð%¼Iú0&gëe𬠂ºNÖ ÔDgZ¶-ܧX„}“?ÀÒÈt·‚­R\å‘ÃÆzE"o½²ÜÊ7|»ÀG™-»kÉX‘«ÂÐôj’‘$i+Dwù¬6_š­„eR°ä¼–æàœ™ëŸ&?ɰ<”°¥ß~äÛ÷@ÉxjÙ\ÞoÑ2¬P\Ž©K}ÖÍ£f¬¬ÌÃɬ„Ù6w†Èdl®òyT\2ïò%zW¯²öêÍyQ¸fCVüÄí ƒµÔ´_½f1 $2æ*ç?=v/<Õ(M¾V» Ð(,êÃè%)WrCΑގÊn«2¢%äʵž‰ÒöLÄRÑÈï+ÅQIÿ|z¹Ÿà'Ðk­Y^þÝß¾¿”àšc,8¸ôuœ‘'[ÚK:V‚Âù óõVJ7„c1µ—:gºãƒâÊÅÛñBíá'ÔŸ -´Åb|îxž‡ *ÌÌ’·Œ¤7Ik„Éè!,–ê’$ËSÞ,zH¾”§@•mEÑÉ÷o0XÊš²û¼×E÷†ü~i¯MÖPö•S/(©åòpÍw‡Ð$v£Íù¯QjZnè”8×¶Ÿ¡e¬ºYg35ÞH4ÂM°1 2tÕê³fv‚ëËÁm%ŸÕh+ß…_Ì™òÌ>vßMµ#ï,¹£ªŸÞa|ä<Ý[lÎCOÊ¢è[CÒo×#4Ó’ájʉ*ˆ²E—FéºÈxÈaxQË7â=Ê•F•Z@ƒ^¨ £g³'ý0ú‚šõ§4|³Zxh+÷o¥Ý>Üc«¹º3þô ØÞ`±è]ŘoÑöŠÉâV[RŒ•J"û2ƒNað6¤ã·XG³ª‹ÞwúÛ—fò¸‰“ÕÌI²°–°€ì|Áƒ+üÆùËk?DËn'B戺Vµšðô·Ž\󔞼ò‹ÃþZ:ð«’INQ^)Y’¥×ºB„wó©•!5*ï!u˜qMÂjTÅt†DŸ©Â:Ê"ˆŠ-¿í€•S“ˆ1—Êß"¯ØßNèã5¶˜›Ãyà’8Bò5­=É%·•AcöÜ_DÈ–f0t©ÿU¡hH”5ÝqP¿F§¼C‰®iªÇŒfØ-6˃úâ bùeº2C0{ÜRT¦ßXpí¨2æê]W‘É,—9ìÜ’¢Ð@cQlæ»Nƒ&¾ýë[öþÏ¦Š²zƒy9¸áz:›)¿8Yˆ¦?áå· ðâøR¸!ô\;lꙜC ÷¨ và vBÖtK›Ô7@ËTC5†¦HOãÖ²Þš·Ñ·cÎ.†>Z hØÞežoæÓQ®ËsÆVr®d^¿bZäÆp.–U‰®ëɤTÂ0”äJúvï7Ñ©iÖ<¶ÒÉ­N˜>XIîÿ`‚ÜöÄZeªGŽ[–Ý–ê¡CáÑ’P÷­O¾S†$§+øBB•ÁZx¡ü"[=oÐÂÕé#Ê\ŒDR¢ã£‘mR¼U™6C5¶üÔ Îv#ŽKÂíQÏÍ&\Ç.¸F:WãØqü½Dåâhä—){íIšò~'iÚïý;ÝÉ¡úðúX\[¦Ž=ÈŠõÚ`šÄ‚nÓsM’¢×Àh˜k–À² [°}ý†ac IDAT¿½àòòÖ?K¼ÍõŽ/ö²x}º‚aG¼Zñ,–©ÏÂ# iX§5>}æo¿D륹" zŸ{,I_¨;î\bé‘Wâ™P…u~×+ÐËr­]¬æk.æ¤9Ñ!3úë“_QH5JýÊz*G…NKå÷FëYs)Aÿ¯-½÷k$õ~ýÓ;R0΋‡¯†Ì¶[0Æ!¹)š£…z(€‰HFõrâv$" €Ô½ü¼|Lͺ nÕYÕšYæ t…PQ[–ëÌMP¡„;]³Ý£ø8óÒ …VÛþjïHá~W)8Ï%hÚˆ’Zƒr‹Ø§0€,;êŒR ïwñbtsöàønUŒ‡ù O‡…æ¤é:V¶CÞíË+·+½À¨têDo™Ù|3¶³Hx%Á­èð,–eòJ“K÷ÏÖ…ZÀ³-zÍôߤ?蹷›+Þ¿–þ¢tXíóž{jNÁͰÁ™ ç¸-úÿàÃÿ‹6VÖŠˆºSé« ÃßËIš—Ä"—¸¡—°^ýA¶€úU\èËóÒ¼H F但k¾@zòÛŒ,×:i‡ðŠ|ža#<棴5 °^^l!úëƒañ=Ìë-y9%±¾õhÙ¾‡ ×¶£ÖˆFí—8±ÞW¡ÿ•(”m±‘œn#O—\?Î÷¢†‡œŒ‰hšýL\]Í´¸{õ÷¥^­rCï ç_×,É$9'¥HÅúÚÂf0|-¦ïãÌÕîUÛ„Ì€ë{öÊà~¡ãk5À©yÈV ¾fÂÜX!x††k×ÃíN—µ£IÍ[<¦e!¹ î èbhÌmËê xV yKù­ÇâïG×ÉÔÞ(\:¢¯p7¾uþЯ2÷“ œ,æ»U¶¯¤ÒAäq,;d ]S¯,{Í÷IÛ\Þ2ØÕ)DÅù»‚p¹piüóÿÛˈÜE¾pÄ"ÙòÅ€Jaiçæ©ŒD ˆöÍÇxw"Ïã_S#aŠ„°åõì¼C-”ò”ƒÛJÍP… ¾@;žZ£ƒ3¬æÙ¸ÂÍy_C•»wO¬9)íõ»i?tr.ûíˆÈ´Çj>Ë€±šÀÒÐÙÌBØÅ œýJci5z4f’r•»c«I_’Raô ˜k\@g„Ö…fWâ¡¡Xv¹)+X²^š‹r†ÞcŒ ¸ ‰”њÈ¯o bè1կ׿š™[<‹X}å)Ø't½•RA·‡üa3¿uÿx¶ò]`Ð…éÙFÉRBQ6þó›©–äÃS¶ˆÜp±ö"ÍÛí÷]°ìh°2W{LN‹c^ç[¤k‡|Y-o&G“)M­¿iÔ¹t­¶e½+ÀFŠKog•w&a™T„5µ{gަ RõmFØŠ*ú@i$#±Ž–}ω»×íÊr ‹§<Àéyz¸ª,gñ é4”ßÉ·ÄÆ©ˆ‰¦pÛå6¸&þv£eO4—depoÓI3°ì/tE–þr }ŹOÎÝòâ/?S ä^ˆÛ¾þnd@d#kÏ.ÚŒ¯=0I¥·¥„ï¹Îœ‘ Ôûn`» ]©‹N¥›û©-ö­w·þ½GTWî"³B­½üÙÜ?âÁþŸ>þÉþ?>¦ô5A5«ñ)óé„­+ùÝûëVÐd¤‰6YDâÔ®ió¡Å•sÿïRÿS5Ùì•̤ó7"/Š?Ý•f€avtïɳ4{²;_{y­SºèqźîD 'Ë –* 7eèT,0Û»L²GnÅ yÿ–­ýTð%¡Røeëmlc® Ï5tm掮TŠe B͈8%Š:¹w}ù*|â¨zToA‘Á”SɱW".(ížxŠ9áž$ÜgâK-—ñÚÈ^XT3ãsˆqJÖ ·Kv~/^Ú‘kl=*nZM†•½amYx&W¤¤ÓX¡+ËU™3w쿙쭟ÁðÓÈ÷ðƒEr|çø2GT¨vÏ`†:½ÊR˜{$é¸-‰D âØN®4U¦®¯WÏàí Ô[D}èŠmü©–u©À#RC—ÐÛ©3[£…Ùá"÷¯èø5òé­M[â}ÛVßÂq~µÃÞäA`Ʋ¦"cÛˆS¯Xâàà±W#î±Ñ|ò‚ÄrÛC¢ùkïL-n2·ŽÀ\!9È„ØêûÚÒ3a®a­”"þL 4G“Ö?/F¹ç$žtå“ó¯šÕØÎ[·HʾÉ9¯¡HªCÁmÇz½ #`¥=úïƒüõÀ£Š)kí_©@–)<§RâÃ3"{6µù=ôlO¶ï²oš'cÉšK&Ip½å½*þ5¥à¾OŒ…Þ)¾‡þ¼Ÿ4­™hãÒ…÷|¥-ëË+Õ¥@O³J1¬3º¦@‚ø¤nfš ¬=Öõp>«ÐææêF,¸Ô“¦–`D=«È©®¥›fvZµQÊmè%cá£PÎ¥0ÏV3õžAõ‹[&^à‡’syµ=,ñ“-ï5²õ‚7vþ¯°RE.fgmMÝç<º`„W×ùá{[Ãmù•ÆN&W˜‹îÒDJ%¬èº2–µ±ÚQ èñÇó'õ½š(‚i&­T}íáÄ÷Kqv£J¼(âc$b ^öüôó¡ãI{àÔßrº¯à’õKK5?M®íý©‚E¹Jvá6ÍòÅþóHüÍôøÆwoùNÆî®\ÇS®i·à¶~ÀéõE·"I={]%™éC1tW2¯ª2Ú¤ÚힶݦìD-Fº*Øße^J¤Jx¨5T^Ít{¸jØ=éÀ¤:^±ý^MdÃ.C‡Pù}‰Vw£•š»_ÍåÇ~]BmÛ1)zýß« ÑkvÊó9IÏöY­Á«ue–RŸƒ“ôuY™JãøJ`Ò:zÉŠ@õýYV¬Í𠌱VæÝŽâmá<Д…¿#½„Z~ʵߦ´˜Î#äàku (˛˄ÿ‹ý;×|ˆ‰®dÛÉÙ‰Úpi((Iá=[jî•ä‰Ã¶b«öCHµ/£@q#íKcaxÃ>•>T¸ß…¶Òõ³nûúª±þèsw´VwqÊ#?z`Íúâ÷Czý7Q>lÙÖ2¶'ÌŸðùPíÒ•DééqJNäkÑ›H””Ñw4"‹s+éî[œ™.›Ãó¢]-¥‚½òXRµÔÙRù¥¶{<+ßþJÆ+¶öÖìH–”-¢ Ëq…IÅñ“¡j['µäDÁo_\Ú™á¶Ì\ óVä~Û& bÃ\¸î\ÂãÁõeáY-¦ƒÂÚqÉþ,.S«Ã»[Ì%¼­í 6± &ÌH‰r%4|阙°Ë¢$§™†íRé¡UY%Q7êO”ÅÏKïq“¶"±J#Ĭ–ò_Ý%›»Éâoú%y:ye?²§¼×|›JWn ¹Jµ‰Þ±• é)±t`ø>­öAÍ3·Ê‚|À ;Ãljë£Zå)iŒ²¥~?:·òO ×Wõô(rv$ )Zž~8 DÕOZ?QH¾©8¥‡%È1üò©ú¿\MH,Õ7ƒ C˜ÓP^ª“_­fiô†²á#ß]–6ŠÞC-lå-Ì[ïb59²=­NóèÄm¾ Ú+/*ΪÉþ‰¿|'Ø£/}QÔÅÈ!²à/ɯ7KM†"‰[Ö|h6[“«ä,Ñ~š'zŸG± <„–óðîžwIÙˆö)GóÀØ\Å(I¹K†'åóiq¬ÿ£)Š$õ¶U¦’G²µ°† -[,š7X.åz„}CÎ^š1@xò£â¿ìk=E!c1|+IŠ=Ù$mõN3Zgöàã¦4aH¼÷²h–û•¼ãlnk…íR8˜ÁòB³—˜"Ÿüpùfé·1£±#qXÆ·³µ˜ÕüwæTü¾`«dߢ¾¢/o×zÎVùúgµã«ÿ8 hèÈ`„½cƒ »(Áq4†U:E–ji«'UJøf5qw|µÄǵt:‰Û6X+ìú`,ÙŽ&0Ü#­IÏÒÍþj+ž«ùÛ©@êó"íÐêäÃÍò/[½8 b˸)uâ¿§I¥³ƒâ³8Dq7Ÿ®º‹¶Ãߣb¥ß·Ušë Tg/žkªDšKÅ9iÊ®© û£‘[;…ëvªuÔ_AûV- çq¾+_©BP- ‰8,b ð.ÏùÐL¦UõÞ±\s§¢XU¶”7d×Ô{ʹŒØèéh þkL÷ð=4ꄆ¬4§€öwhèµ²K—Ùu;|︺Ö2ø»g2Ë£=¥É¤3oø¾Zþ$œšxšgi.jk·>,Ìß¾W­ú)cùë‘+ìÓ)µŒ4VªÔR“Ø<µŒ]È%êÆ¤ò²k¤ÒÚ/èÂ8m,SÔ!à‘>ºRÏŸòUñ9G+§Ó¨—õ­Î£×ýOyõº-Ë-i<^åàÈíäç’ê¼FmѼÒ1xÙ[7Nyñmþ-Äm¾©ójñâ’÷Å_$r¬Ú‘Jª¶ è‡âßSêƒvF²”bô¬rœ~c¯¼äÉãkH8khÙ’"GM!H>ÂÀÇ3"–T ZËæVÜŽ½D§CWüŽœ¸–hèI-ǯ¡æ‹Û^‰¶vÊb´ÖŒ’DD£±­¿kʰú¸’nC­ÝÑB>ù•ß.^P à~å¶– )äF‹nDƒ0+£ÊâÇ[O;I3ýBV ¦åä«.>é?Fü€xôã«ÜçµCÇz&j HT;puÌR`XFž…Qy@(¶2Ó§ç^­Í/†ºR19Ö ¼JûÚœúŒmà0%ÿXJyS2¯šÆ‡s>ÂÿÏÞ›5I’wž?SsÈ̺ºq‘3àÌ,eDöi¿ÿ—Ù}˜å H4ÐGUef„›©íƒf‘UÕh‚˜!‡B—’îÌHw;ÔTÿzFÈgùÌýŸZñj MblaäYo+ŸD1•ÃÙO4Y„˜M–t%bxpË~:x,¼çjÕÌjor1ÒñFZ\cÝRöÜ3e¥öE9ˆ ù° ¤Ó½.·ÍI‚·•2UlfŒxÆÀ¿À¹kVß;JöSÙŠËÑŒË4ä´ ¯ác7[MÖ,g]L0Hse‚y‘£Qs;#Ž|+Kh`©î ÔâÂ]á¢Ô+–¯HáC-nüI@ð’Hþãúws¥åÇAÓ§$©ŒêÊ#,ö_¼(fÞynX8`ƒJÙÙïÐâT Q’W)ê•fÉÀÿ ãR¼žùo‡“Ÿð´fØP3Óm½LÏx‘¬Û?üë]+×[5jY˜Èr¯Än –zmù·Í+¼ÓyWþ5 1ÝhŠô)DÍ‚”^¶ òÇ••1…ÂÒ†eºëíufÖð”@Xfä€ÀÂæ®°Šün÷Û¼ÀY*Ž3Èr ŶYKDµPƒr\š})Ö(Þà€D9Ò¹ mÑK w‡hu§‚Y·<ÄS§úrÕ%øÒ<ÌêeJs(Vz\ß1…+l²Ç—ºÎP_ºß-$ÕZEfN²ÜL^ñø"«×[" 6?5Ь"Цé.ÅÁÙ€×g N‹ ŸÓS—œ¥kð÷Ê¡T¨•­Ò—~LcÌn$àxËJÓLœå§Ô¤QC¯ÞÆþeœß‹Ð‚Iº+O–ÇÊÍ‘øW¸ÄÞ3+Bl$y„…°ü¤£ŸŸ‹0ˬlÖx‡qعÑai‘q›ØÂܱxSˆX@ û†£ì¶tsKAK]BóÓh–P"QVcúfÕÙÄJÜZXrë} îÈr›„,ôb4cÏ/Éd#ªÇn“pòf×3çŽX,]¤ž„Ì«¢ÊSÇÕY×~ ­±5·™¤ê)¡Rq¶l«‡Ó¨×Y‹dŸFÊ}s6í¢xÏ÷ô2"êa°ÅýdjzR‚Me•¤È¯¶U5ÇŒ <3ƒbùh²Ø_<Ðù?®+W¢†•¨kå+]:H\ªü×tíF\ù(ìgÊXrI”ÞGŸ8B·dÑÌEtå² pp—V©àJºf‡Ý^i6tV˜Öƒe[Ð@†7ô~áÆdß%ãõ×é矓ó&XO#}iº°@Ë8ç ¥Š£EO)ψX c>P¦?™e/ö¦ñÖ4“øc¢I¡› ÃfXN¾E½Î‘Åu¯"“½ê65gÐYð¹û×·N» Ö¾®ÕÏGdàXç¦_[œ_?z#ŠiãêàÎìóa¯ÖÔZ¦¸-+)þ;¹"~€ÕvùÉ,õ“ìÊHä$Ç/Š„_þ÷oíZ¤ÙaZ¬˜„¾_ ²3ªçg•ájé€Ñ‘BI†ð›=ÇÂkŠdcÏIÞÌŠ½!ÈH˜¢ø³^¡Üz€_¼(aõ{q¿ø‘þŒýŸ.~‚ì‘ÅÚ¾"å!t¥lÔâ–Ùn¾ß3£2”Ñâð† ŒÀ\/óNÃ!üYꜺM¾bÁƒ«üéèNý§Ö}]¹?^Ëe,y¹ÖBd6Xä ¯È¡Zº2æ M^ÆR´rÄsШ³j–’­ŽLíÖ——yÌä20<{hÙp[б•YÙˆº >•¨ÊPB?“e@i¥ƒÊ ÂÔàÔe,»+p„¾ú*ºf“=^ŠÓžÛ—ÊË0}Å&Õ¶F†É†ˆËÆ&_´²/ù¦-góæ1¶pÏá2µ[ÁŒA3ð¤h"Ïå+¸A¢fáÙ[XY-è6C¡ GõÏ!<‚Œ¼{®Úšå7¸»‚8à›eSo¨æ·[êúýï ~ Ë sý…Z:"ÁÒ©¡Îó­K.ødÜ#”mâ󔜩8Û'mþ¬aÔàKTtÏð9ý…t…1fÍŸ©}éʬKË_†‚j¡ø]Ù*Û†Ïô6ÕLO¥16ÞЃÞƒ›[r«‘ Ðb¡†w#r íî*©°ÿŽ _ÙnǾt-õýi¹›ù«ú†ªüè£nùþŒ©õOúlÍ»’wëí ׇ¯–º Þ|¾K—åæOÆÉG¨mØçî¾5üyÃk ·ŒäI¤ 4ej–-2é«ÍÝ>rD-U"ÚšIèuØéËhjÊ}6hêV ãéc9&)V5þª«7;d0⾄é(ÊxÓû„]k[Öœ^sR¡élí4Ý-vgËÙ¶2-x³VH_S¦õÑŸ*ÒØº×=-#êâ ewl4B™áEX@‰ò*!JçÔw°Ø§¨XÇ"†ÿÍ]y 7\ø³—‰tÅ1”¯‚‡M ÿ‚¹›£0Š¢Éüá§—OߟöÐEK°a 3±Sn±{çÂg8•k&踹~„‰‡!b.‚Ì#1ʢ˿xR™ßµyA·è±Íáƒj¥_]×ö×Qº²‰ŸóR !o>†6¨€É`õàpvï`-÷"D Dý¯\Y8ÆËë…–`œ73¡ÙÆ+2ì?»˜²,Ñg)Î…Dñ K‰.ùÜ·‚¬ê¥®Ïb.Ü8À7±¬¤¡ Èðæä_#óÓFbU$‡R¢^¼ÆÍF¢Ûm„ø€Z¢1¯1¬Žwrˆi$ËÜ’´4£z,q7¿@Wî ÏT#øâÛ¹ žÅÛ¾ÛtÜNèÅÞèÍË“ŒàöÚ?e•vÌ622<4©H=S]ðȱºq DœÏú«ñÍ×%<)}È%¶CaÔ6u£*K¡%œÀe•ôv * ¥ J÷NçEÛ­4·n¹Ø*± ÅÓÍÚR—K6ÂÿÐÔšŒÍõ²²©µ³ë¿­¦ðÁ_òò“UæéI–Wnï$ó XX³=$š^͇'åÆ }¥ìwK¡3Xl +’ÉŸm”Š·“•øJɆ¡Ê9<×Û‡ðÉÏ9Î[þ’é— q{—é-­qð^Ø·Ú¥8ÔÒWª µÒ•ñLOÀŽT2ƒjpúO>ΕÏL"[C2–ùÊš9P¨u¦€Ùh·HZòc/@ïúîðX—VØ4Ê»—ÂŒ2òò rÈŒ Ê&Ñ&Wnv¯¦²ªàyðâ ªH£œFC€nö«±QÃØmñ-žÊ ¾dõsZ¨q¦TˆÆ1!Rª‹¢«°E¬ð¨qŒ96vå²9,°2¦¹np,h£p[gåQ®PŠÇäŒH§Wƒ´h%´ Zç^œM—Av yYC X@×èácF$Ç©k†ÍgnAeëîåé²ÆÃ–ÒwB§áA±–È6Š÷zú·$ðócT8ÛLçŸìÿ ð™üBâO“Å@³?çqÍÃåN•á7îæˆ<Ø·–õ;ùˆ|©ÎOD¼j•±¿­2¬kÜ_ú„QªÜXK¡é$@ d‘˧,®«d÷øŠv8 ÞàéÊl»ëìú"û#¯ÝÓ K¡uN»wñî½…Þ+žŒÈÍy±i±†[ Õ --i×6ç?&£im*×KæhO‹uøŒ6“‘‹'€»"‹.Ô2›RDÑØ9wóW±Z9¨±¶–¼N9†…ÔâóOž¹‚•ÏÊ8½UÝÊ2sîÔIÙÇva„…ÊBÚ³ä½g¤ÆA‹U‡ ýIY´4C«Ã¹ªáÙÝœº9"c¸áåt¢¾åíWªú¨p¿ÑÈL•t IDATËB \ª»ßœÎ£U¤FR.ž„5A¡Á©0ró…–°÷*Wå„—!±æ”¦X(®—´»æá§}£t¤sÀ©FK€Yâ3Ô‹¨ iÂR§·¦*Ú§­Oà€‡áÁªPÝm`q¥"p²Ž{¶•± ö®~ ¡K©úä±YZ([lèðnº=â ôAf2÷]V•1Æçm/YÞò¥KnÊ£%QiËü1iÏ‘ØCííis¿¹VÌ’ÒkO²¤tùèdý©Ga‰ÍŸ ‹c0ÍòÓ±9<Ïä »aÄ,L§<„Ý2rÌ2`¹fRoKÞr.ÎnÌK¼mþfSë²JvóLÖh-P8½¡¼Ñ»½<Ëñ­ï¥ ô½G^Q…KçüŠÚÐÁhåÝßU~»=þ\ÿözÝ¿ÝÞ|³qŒÝìò%Äyt65+¼ºå‚EWÞÉý„&œs£6?¼V£ßh¤tÉF1|Ó§©ñ8ÁŸÖ:"ƒ]iÅ­W °UGÓö'ƒ;ÞlÀ mœÒ=?y6þ,áI~Ò5’ [ ±†¶>†]­ú· ÔÒPeš.z n±Ñ¨Í‡Ü–Õð4HÛÙýóÏ”{h<~/å7rêÆóÆÏ;ß?Ò.œåĶS6h…m÷³Öq÷»òðOççWåé××Çÿú\›´¿¯?ÿƒˆÍعz,}`ƒg"Žž…&A»ãÈMÑâ•– çõst,a©êPƈsZc‰¶6°JŽLÅ >•ÅXÐ>eÛ.—<™Y,ÁÇá·ýg—L¹ÝIuý– :fŠŽ¦@Xž¥IöŠà±!àòãÇL@/øu*ŒÞ•Æëù¨ân–CµÊVèÌݾ‰B êô\ŒøÜ/“®ÑÑ)mè-¸†…=¤–`Ä#š)›™;#:ÌÞ=6$B%n|ÁìnÒMÓŽ‚*¬§\™0üç‘„ÀdÆ‘Y§ë•R8.hs+¤;…9ñØ¡²E”ž-õÉŠ¥p Êénä%ˆÆ±Zž—™z”ZüœÌYçú±–)ÖM†ÅZx¨ §!ÎÈœK®µäÄIEÚŒæÌ²-/|~Â¥!h)4Ï…— ÓžÓûÌå£L !q¢'ðLóÎÊÑ—ã\7œ™™B%yn‰†µ ”Bœ ?övUZÝN¶t#$®Ý­°oÁåuòtËÏʹ8'Šx!cÐu¸Ï‡Ók¶·T¿—ãïéÏ\Oô‡UN'žï ÞPÅ«}\®È§J·<Á+C¨¯9®œ.cÿöúwåE¿ÿ¨?;#ƒ¾‡Œ`YFÌ–+t¡\Ù…Ge76¸P‘éå'¡ uÐàÁeÙz¯ušqkêǶ‹wЖ´UQm4¦W•øJSNxKŸM¹*…Ht =¾_MÝK¼Bê4á­E’Zè"îÂ5î¤ÔâÞŽô`›^è¶&u¢D¤ªÜ P¾ºòkþåÜ?ÔØÄZiÚ]Ãoˆ6¡=tðuQJ™VÍêHve Ÿ¡$cLL×ÀbW/ e7E»8®´{ÊZm8ÒsV¶ Ë¯cõà‰Ë, ƒ¸fY‚ÅuSqiPJ” gºìJ<Ù&)@c{õóÛM£Àr¡ú`ÛWŽƒóîµAö<´ô&ôNSÎÏ´=¤‹NZBÅ‘¨ýš IïØL¦‹‚>;2ñÇ$´.¶â¥ ›{„Dã8fi—XÄE•YE~ìÔ§¼{º¾oÿô7¬ev>½Ò3ÔqVHìlÑþïsIÔlñ—eŽ1åħŠËÔfBSÐp™ǯ‹ˆ5ÍÒ)ʬu†÷IH5û¹…rÊ ó[¶AôsËU%<çê!½Ð:Û†üŒmGíú³4Øý5_ï¼ w.O¼Q.­Àš?sÐ ÛϽ"=!Ð;TúÁ©"ƒüÍõ¿¾= q=ÛÄe´šbZrÁll‚À¥qÞâü*ç­ˆÐ`X×P¥Ì$ÖÄÝ!îQ·õÇ™Ú'¸FY B$” »,WJâÞRæw4+yÔeäñÞ³wß,rô*EjÜæÚ[qkuÝyõ -¯øøAÆ· 8„ó[.Â+s<4ô=‡…óo\Ÿ9—à†Ð'ÐGT]9<ǚȉ*ü¿ÿßõM•¯_»¹Ðݼ€F5 ó~ÿTO3¶öX®áu'Q“g%5oÂFx°mˆ-¶>ܛƙՈ…‹îà )=lA„™T<„Áy:ì¦%>ÎÁôå&d´Âvá*‹%9 —mÏHÏ( ñ’‹†¦¡BüEÝmô¹­° |6ÀEèÂûþ<æ?âY/¸ʱYÛâ³™V ýFz½#”ø\^|=Ô‰aãO3: Ö—AUžÃön×Ó OhL¼UFŒ9äæf3€˜©§ÁåôûÆ£R• Gqh曽eÅÊ H`I¥[ÔÚîî/Óú“ç[•Ä2<óÀF2šÁnêFôJ½U¡DÑ:Dzòs™%øZHŒäÔ>ò4Y{uȹ-¯)7¼X–5)t|Ë0Ü(4æ‡ùü?Á»oŸ_N¹µìØç¯±|Å¢PRîÈ2Îôèä4M‘*Ì%-ñ/ 3þr´üW‡ê#?ù”ì­  ËYS؇YóÕÙVÚ!}4%™(u¸Á¨ÅˆÓÅ7†z.H=qÿ+í¯U¿“ëߡÆÛ¥s* å®ó\ O+|æ<8”röiy´ÂIéÅ+±¡W/¸Udç~߯ÿå¯v‚.¦Pšîâ¬-üºóÅk@UE%X¡Õ€‰¶RÁ}‹,èÆÞ†NR"ö}Àj?˜0^L1‚*Èœ¡HË’…<‰6«<š$Ó¡»ÇKtÑÀÂ; lJÇ‹&eÙÑêO¯'¢xb,ãg“fÄCH-ÖËŽ­MJ¾äHÊüñCòcWš}nñš•»§L¸Áb Ôr˜³ÀcÛuœ”4Á‹La£L¾ãü"Sìºè±qbÁâöRO@,qTzÀ >a.sâi¾HÖ  eßÑâèÛã^–Û'Ù±¯‘— Â%uvÓú+ú©´‚4ª‰X=Ó"KáˆÐÒŠóÙ†šÛͲQS[òyŒ3ÍM¼)xAžÌ<0{‘E—¦–à‹]î=‚”cñ“Í…Š’q‡âû’ƒÿIðÙ›~ü‹ö ^º9üA¤9›¤ï4,ýf‚Óu.,”¼|FD+ο©ßaù%ÉßýƒnQ+Jì©<n‚»Ñ¨Ù9:U=¹©[´[è+‚›°c8îÅÙN¼úZúßmM(•}ó.¡÷ðÜJ¶&žÞ‹÷/ÙЊ60'–•š8Ñ+µóý7ãßµÿþ_ÎæöÏX{CÊåÞ$j™™M¼UømÜö­2£Èì0ŽŽlá 3VÊ8•6¤xB¥³fSÖ³ŽþyknA²9K¯SÔ±=h†¸Ù84*LJሪ e©YDA{h<ƒV½ðQY(*@tìT8PwÊ•QÑ+;PÇ3¿ÿÃñ×_×󣻂^à°ýPPæúÛ9Í²Æ 2Ë”JñÓ¼¤26Æ5Ô¦,2ä_–~ejA¹i¶cÛÚušûú:ÁX‚L¸`ìb¤^«žÃ5*Z9 >ŽY„n|¼lIEöL‹ìÌÁX\L˜ì$·؜éwnèÒŠve/Å[Õ& hþ—FÞЋk4Úõnvie–1E ›á è4¹g~4ܵªâ”P'qᙦ‰ŒiÑ[6?"$yÎ'zIÛÏVîj0ËÒzéDõäÃÑfdÈ`†7ÈJ‚Q¥ E9,píÊè” aŒ¾\èóF”ê ’V»zØâío®štBŸòaçÊkθÃ1^rSÏ]ˆÔ9Û ab.êM‹A¢Ä^¾"SsÉâEù‰íܬ,^T¢²ñÂ$eœ©SÜ2Æ?çJKº$ X–J"\yù®”=vYCþNÚNwœïØNt¥=2Œ…YÀe£Ÿ¨ðá‰ýB½òÅ;O•‡;€ë…ýB9£Þ·ÄJn–¸R¯\[á7ÿtÜßן¿/Ø—*\Ü*S]YaWÝ&PC"z$j7Û²¤Š#:‰Jà¨Î5¦q`çßèQ}›§Cilavs_ZluÁ´çHn\E:­sX§Øì ŽÎ< =άuõi ƒƒ¨êƒ£«V8°êI¸ÑÂSy©šl&3/õSåu^?‘ûö6¹-翌E¿vpºm@n¬@0Ù"2'lYœà&Dñ†$sNŽAi³"¿1I]¸8 -B˜þ˜ºÈÐÑ(]œÕFe]s'»µàJÝ]¹ñ^¸â'ÅRf× ì÷qœ‡ ­áëvélÚ#,¬»LฺŠ`%wD'^cÑézZÙ´äXó#˜ùH²C,a7‘cͿ¢áqG¶Øët €uK‹öJ0[x ûËÎïèb4[ÿR˜>L»åýÔˈS£ÜÂÊÍSƤÌÎíKiÁí€ÖQ+„B–™‹0æZœÌ˜aÝù­å‰Q+©2jŠQ÷Cfüxjž:q¶gÈw5(œ_qÿ+N•¿“Ëw\vN¿äü ú .8Q6ÆpJ»ð±qÏé …~áü„ ž>R7ôÄù€Æ¹q5Fyåù#\¡"÷üî»~÷jûůD†«A†¥æÆÕ •Ñè$ìòÞ ëmö½²ó»å·X%ÑEm"UÆä-5>Oë®p.¨ž"çkÍ)ž –J°âíÆIü¿fá4¹%.ì ï·Pâ“#eBŸÉ³ΔtVî3ÈÒ$–.xW&E›×Ú$k)Hwõÿúy‚ "üñë†(oO›7=/7ÑÊ99]˜Ý_»=¼X%Û(4èWàe7º<4#LX` üxiBì2ãdF†9gôXA2åìú2åMr:+^p™Õ®·ƒ6´û4”ƒ/AÕž)0èQOÜ 5W›RœX˜¯[LÖWO|p#­ ˆQ¨9íÝ^à("Q3èmñ3ñveôeèÅÍ>ÂâXN1 –dŒ@þSô˜:Ÿ-” ª~“-œì3›O%9´Š›‡ÕO¼f_…BS_cë%(ä¥p™¦äð^\åæŸ|r®’ÓùÓ.'ž[ Ë+ItÿY›7øôî(¡ÆK¼ hÏÃ…a(täÌÛ_¢g.ßòáÑFíÜ_©Ð9žÑÆ1à‘ñ‘]¸¾â® …!\+û§WôÎq¥ rp4äSåQÙ*µ ž\ØŒ{¶WŒÂ7P*ýóÒ4b1mj-ò*4BqØFB¸÷ëôˆ4³NDF²¹j®Á͂ꊬUz¨³­‚+ÄÙâi¸íÛ«ìÅÔŠ'”­¦æEµP8ÆæÆ»Yô¦Ñ¼µ–t‹t´t7«Î–>Ñ(6GÌ-=Ó雋 ¦ñ eDIô„lѯ>ÝD±Ž`9ÿ¨|kI_nðV¢±ÊùõÉ÷qÈi{ãõÜót,ø4÷8+úmrÌ‘H°Á[<[h d1UËø§ ÖLÀºõ'h`‰ Uu-a¯“jý G±¬kõâÒ@1ƒ* 5ŠÓÂ.A»m[üT&0J”Àå#á@¤ßâÏ9Y#ʤrºˆ·¸39áN¿Xn+ùûç\rYÃ"7ûEõq®tl/Õ¥ý©Tô4…·“ÉjÐË1¿%—1i;&ìuS"Äï#zݘMÙ€^®“w\ŠL+’5s³ƒ²_ÆúEµÿjÐw’©!Ò‡Bs‹ Ål5O÷›M™Ø ß5ñ,W4#4Ü:¿—Å|¬Eð¸ ^õÁC$›pÕ¨öQv˜Ù­!V\=‚Gth±Â%0¾œ= <¤ƒAÜzaÀ_+›1·0ix1»H=›‚Y˜˜mÍš]€æÍ ]sm½Ê¿´è ¯nyJ!‚Ü3Ž˜ÞPðµP Õl®xÜ£uF§øé(Ó>˜%­4O˜”<„åf\Ú]?AÛ¢â³óG¦¹wÑ0æÓ^°œ‰ÕÛAݡК3»‘ì’`T:Mº¦r®æ3úTžyÏ#-{NgZœæ®a<±¹[¸ˆ²X3ÔS…ªçÜ'z-NF{t·°j°'ÓmÂÞÑÐ73Zky.QOé¤ÎH¤—€x]F=ÚHåšÙ{ö/„0å´‹žLð ö,ëÍÌÕvîТ\Y²˜Ï¼sx ùÍf,±¤1Ô‰ˆÕc¡½EѬÅÍe%Ë™DN¬ZXAª¶8Q,Z3¶/(JcÌVÙaÛØÞr®èŽ'ž ¯Ï”ÊiðÃkþJQázEõNŽ¿…ê½:º2”SGδŽƒñÌ[¡oœ;ï?òW;ÿð‘¯\àü†M8.œ ]ùý·z|¿þu5Ë•ÓtaÀ6èQ³aŒ(Ø`¤’Ù‰Š3ªQ|_‰ð¡”ù¥Ã‘¶egõõÙ¯\­…dñ`!¢=Kâ¤ðî4\*±Åݲ^jhZÑC𬈬#’ˆSZÐHLp4¶Æ±ÑºŸ¬wÊ%x}>ÜÌ8› Ê(ÆZñÇ…I†¨NÊ5pg‘(úô(ýòH¡ç5æmIÜ$µÔ$sìiÛU_ÐÐ?Œcé'= FîÓú‰ 7 5²¥Ü7›-$o5£pb,ãùf.> ÓMÙ»oöTk²€Ì²h沂‡"X­^èÝËÙ©è œa …£ñd‡ÞÜBþ‡u"kPGö-«m+~$ìàm9åð=N^cÏ1Óæ—õæøU–~Ö ?Ûˆ'¬"pŸRÏi$–BR´,’ÜP¹†‡3¯²p]¢Wš±O/®2wÁ”•mEÐÎÀÍ #ÖÜÛþ…øYglâáSI@ÛŒ`ây¿ !'2& 난?Yͻӣ*q|$qÁÕ¨Z<¬äýàlHùޝßê·yúÎ9ûÝ€Êqe;Øï)OhƒÂÖ¹(å‰ãà|çÅJU¨•ñ -Ü=òø oßòÃÏiíÂ¥1vJ娏;ñ}çtæ´qíÞåñ¿×OýÿøõNœ¾@Jð¢{@)´Â¶uœð2 œ†»XbT§óÃ+ _n§´„QÙàZèâQ|’çqæãélƵ"wL¢ðg–äCâ‰- xøcZ€¼á¹~^ ›€ê©×½GûR«8m~îú½G(,®l'£ …=AQE(‹vT1«¯Ò›ë@ü¸àO^%£˜mþu›ïžxyý(!s¬.ÜLõˇÿ›ÇZîz“,†Ühà:µÉC· YDf@Q/Z,Ϲ(qø¢Sš IDAT¸c`>åâi±³êKA_z DœFáá\ÀOiD»ÏȶÂ8MŠ´•-•^è° R­½ àž• •“,ªj ü,±>§fV¤°é®Û´l ÇY±-mG©K˜‚Ù}qVǸ,Ë%Ëö(N!««Vóž¤P³äÞó°d…qg~7;xã˜æA“ßIMf:°VÝ%¤þȰœx„©§¥-ó"ŠÆK?oÙ‹c#¿)s lkRF¾tb‡{yUw áøÉÕ^xpÓHGÃBb(ªÞqÿ²Óþ(ã‰qG©÷<¼¸TÆ™S§=òô‘ò9(ö¯Ùþšc÷b½÷•ýŽ­£ÇñKÎû·Œg¾»²¼ºçºñ \”bÈÔ¬ÿ…ü'ýø4þó¯w^¸„/~àÖ°0Ž»ö–‹cð+æÎÒ‡}3óKÞ=^~wfgæo³ã·á ÎÌ4_BOucÌ'~°OÖ’”¤=j8ÙÔâf}w(ª—9ðΔe‚’í”(N³±à¦·Ùó«ÿl&ïýEvü46ÓfY[¹"-* dnà_Ä0lÞlRÿÁLµÕT1ˆÄwsÜ+Ï•X´¨×¶2,_XÛñ"15d€o’R®Tuƒ£Û7¸áûç¡Írq’­»À¶Ü`ã3—lÙÂ)Þ`R—¨¾@®ÒÖC&Ò8žÙ”:–jø†%-™CÉR½M½½ªó‘ÄÂÓÊü ë\4cg=Nº”mSaOË00Ê;ã(‹84‚#:Ü3QÂkâ2#Mÿ‘Œ,Ûú+¹/Ô;¢ €­‰ì|3eO1mÒØ}ú L“0•È"|‚¡eZä’|Éwô9cOÇìš9 y Bw™‹œsL›Rœ=¥› )„/h¬ ;ÙP|²-yIsA𵕙YïÐ~ÅÓ‚tCN±æ%½#QK£4“‹¦uw‚ Í,¼L”1Ïž‹ŸT¿‚J"€n»á÷ }”õõ©"äÛÍ•˜Î>\%¹¡Kdši{©Q¹ß"8—c—1Ç 7ïŸhU;tÝ [“c  žâÛ´zà‹kýÉŒV2W ¹©F§·ÜͼÿȨ”Ê¥s†sA½Ñž¹\¸kh§ Ž3÷ïx¾PÍ|•ëGÞu>ì<<óôD?q< o¸Wê”gÊ;Ɖ‡ÊõžQà—ŒŸÓàîÄ®øÝÿèµó«_Ws õÅ~UñzA$L©oÖè%1#fÅFË2•ÈŠÁ¡pÙpjkÚ¦±BÃÆHõã¼Ó„‡9·E&Õýþn‘“´h†,áhŒP2$‰[#àÇCƒB¼1(ÕÇï–Ø8 ZƒÛ,â!é_­nдÌX²N§—èD0ۙ݀ ½Ÿz¹Ì‰­©¸M#Œ±¹€*¥Ì“ì;Ÿ?—Ð}†ûâí!œo®Œ®½÷d )´Å—†õ¾˜f ö÷éäË ›‘Ó ÀÒEƒ3–<«5áDÙB-¸Ñë—HG˜uníf¡’N¶(wì2Ú¬»2d ¢x ¶"ì-t¥Ô¹À+K²cÃ’Cš½bTO1V¾ËâVUèÞ«ÏØ%="µWŽÿb=.ҩʸ°]‘Wä ƒrPÒÚ%3Â5—mZÌÕO¬âHü¦—팩ÒñIÚO“Ï:e(#ŽñÜ®´tkÆÑå¶Õãòét_\ùäRÐêÍ]HWJq¯€Æ‘Öþ“Ô:òÚ¢–C̼Á B<¦"<ÿÀã{Î…²ÑÜÁÒ9žèÏH…·ÈktC;¼gÿ–B­ÜC{ä4з´ï`cN¯©¯øþ+îwôó3;¯:—gFãîÂó3"”ÊïÇïs¼~'?ûuóµŒi*1ç €NújqÈ4rÔ%ðÖ@)vkó°}/š6Å @²Q’Ђ´H¦Y˜‰j4cÑÐqà CZ ŒZmó¼}c»eóáÉ@Êðc¢Åûh0%_\r}Û$ò(A m¹>­°…żFKQ²ãoŽâ †ùjqGãð/s[Ðw£U4ZéZXRªI%§q*ÏAŠ[×îò ¡V´ºì‰•‚9¥¬&‘TªË ‰vK.zÞßÍp(?~«®aËÚ—'§Ó"ÙS Sc¼wópçåa·|ß®j¦›pDCâ·¦£óæÆÊ£yŽŒXm‰e1CÁ"·@Þ¤EZ–#±Ç²&©+„ kÃËx9Ò:ƒj”*RÐÙqÈÍš&AÀÜY`ßÜ«áìUÝólú“ÑñÀm_¥ÎæqsRu>v¾tuÃ2…·]É`i‡à9±7NƒeÌezt420Å’w ¨9s1j0™Ïb)' ëYhÖøÅ~ÝÝ*; ÏÃ8áu«$ ) up±×m”N©ˆRïyõ }ê<ý 1Ùï¸kŒF-”ʵó|eSÆ=28]¸(cðQ¡°íœÙßp¹RO´'ô‰gåþž:hgîŸÑÂåêœno–Û3œ÷Èg¦àš£¸šáw–ɶ&$Ìp”dškài°’€a77¯¹I¡£¥U»­3%’c#?[;ug¯®KZ#øaÑRèA/3©f.j7»)1åá÷gƒ$¹þéÀ÷ìz 6›UþÏwC|Ž+ŠÉXo¶Œè1͆" m”靿Î[ëõ6tXÉŠWÉè˺uÖÉê܈¢¼§DPÙZ¬P" º›^·pKËd$vy%Ýx]ÒC.,+F)¨rþ 0šâ²MÒÕÔoLØ[ ™ÉÑ3Û;^wøFž:bíp;£Ð…­r'<\;ýŽ»Êõ‰f=¹§Áó•vGæú-ÇGÞ½†¯P¡?òº¢'Ê•v\ϼ‚>òN¹ÞÓWÞ .¯gdçÿ0þømûo³³Ó[X6ˆDuš)ñÃÉšªœbÝF ‡góPŽ»[”aPî`ÈöújU²‡û{‹µ„„¾¹‰_*‡Þt›0ƒ°™õ]9ÓhǤç•òMÑŽ 'sàÈ€½8–2¦ÔÄõEiu2z•可)p†æI „Â$i\•­Î%%ÛÃE½a=Ã'ëN\/ª&h½5ÀþéË}2óPæ5fúœF:ÿobwÇÂg×+N»Ýïâá…V±þ¶ BIÿ’qäìxžæÈ`…*Så¢ÈðS Ç™–£ÙÐÜ俆5¬¸Œ´où“¬;]›vÑ1 'êð$[ŽŒjx«¯T•nÓ@ÇðÆanIÿ›Â¸µ3¼~‹Þ±)EJã¬\FA¯”îèoçžÞs >¼á«×\ú-_ï<ýÊ3~`\>²7Îf¤zÃåÂÃÁ‡ϯù%Rø‡ÿÑÐÿú·»U«xö8¡ÙLg'‰ +£¯‚ô™JiÝ×AÌ:¼ž ¢Ð¿²mñ8¡)g+ÝÒ¸ w‘ áú20ábIÍé4©—ظ­W ûzáîâ5||Ó+£Mw`ôšôº"\qœ™¶Fg³„îaò¢„#>këõ-^Þ­&¸Qú, µ°›Ð]Ö¤ht½ÿ쵂õ×K3‰äå¹7bäó=ëB¿xnd^L"-ëµÝ|å‹Í™àìl\Ét§Ê¨D'Dµ t”m‘%‘¤^â j1·Æ/%œs°ŒÅ–³À½„ag šr®ô àï!ŒõQ!ÕÆÃ{ñL“L_¹Îë^ž5ƺáÒ~5•Y\§6cAÍæg#JŽÌåMvöéNÝÊWãk^¾{Š–9JÔKL0BTO°tƒ“lwLïì å ›7Š8#k­yX%J_,á:ö\ÉÀ³øD¸KrÍ5É¿ðåÆ"çïÓa >©3%€Í–™À‘¸)„Ô¹€Z±³ •ÒÙï¸ÿ…^ë· Ô3σëι±íœ_1*.\†BEwä@ m<Â~ÅwJ/ü üß¿çÝ÷üükþé5OO”g®¼¹Rÿž?^\wꎼâh¼ÔÁãkî/”ÆÛÎS¥]øæ7Ƕ˯ÿÏÝŠi—ÝcgKè1½Îݰc[\½xŽ/Æ•“DÜ2MyÖÓÚ4™N`¡½ÖW—’ò.nwН§µOH—¾2ÈCÝCŸ6`72@Ó´™Á×ìÑ‹ý«±§zõpZNåñŽB+œ:½EèjÖ/ ’Š‹%1WM¨–&{ª"–6ÓbÐýõ ï#¼/–àS}eÛ+±æ_ó’Û_×+Í yŒtv'Ÿ×¸ýõÇ•sŒ¬Ÿ¼àP‘’÷—å.¹ýÞ§rK½! æ2ŠÇSޤƒD‘<ÃÍwVfk¹Uú ¨ã…töðas1 Dnó f$qØx¹/~P ¤x½û7û7êB¦Æïj(¹ËBLÖ¯ŸYŸ“Šˆ:ñ¬mÓg³ø2);q»ÄkΔU4!'Öž'yî˯Z‹³È)˜Ý9³íºDzvp¢i\Lzñ‰hv×YdT‰y'ØeIËüó\ºžÛ˜=SÎ>‡íx(õÄ«_)\¿‘ÇGúξ±wOý¯_<ô,ª úA•¯à}gMßx¾ðöËÏðõ/yPNW®…û×Ô ½R+ ¶·Ha/´ì¯x¹SM€5>|Ï÷¿?~±½ûºh‡ƒ÷\’4e8, &î…‘u‹JÈÆU6ä'Ü ôo!.v{]¢9kØÇ4õò¯t ¸¿tÇ9µekJma¶Ì$\qÚ½ãiSN§ÐBfK¸´ ™hL˪OÄÁÁ5n¸l…g«ŸÕ/²|´RKd« ª ®áC2_Ú˜V GW¡jÜÃÕ ì×%iüŸ}…˜› ÍF+3ûTxÁ¾?{éç~.ŸüðÇùâí?¢.|V8}v0Ëý3¼ÝÞ0è¡!²V¡þ'c*/_§¸ÆP¶0nŒ8ùÅQaÍUÿkrº ¢¶¾XA˜1±3iIøÜ¼&Š-–x²F“ÒY[¢8¾Î/&¶'¤IMòÌ««¥Äc%àd–Š]~N=l2Mcú« WçFäÌRŠ &â^³Š<¥Þ÷oö®!;Çn\îãåÛæŠÞÜæ/ÂõŲl }i¤:ã/¥Eà¢Ü<»€(£0:öwl…íùýoiùjã‡×¡¾ãûx{eÜq-Ô'ž6ŽBUzGÕ‹3ë ”qáµòþ=§Î6x>q>Ñ+Ï8wŽÑùað·›þ¡HmŒœ ß)õÀÞ#•v¦v/Ÿ÷ýwúôAßüÍþîKg·Y[ª…±fª¦ÛÄ+LØ´+@"D¢¯²)Ïw}öì5 i2ÂÊø$zYÁ©¸ÿYqusnQxpr usž,CX-jyï#k5Ööx 74IÒO_r2‡Wlµck=ŒMBôá€rÀ°üçðú”°=ZQÈhƲY[eYذeÇ{Ö[Êj |¦8ªN^ñ¹ëK\R}IÜ|öémeù÷Ùç”?÷ß_äúñçëçþEÐäWCÃx5Vîx8Åä¨%Y…™Œ"ïãåÓünØÐ6“ÈÌ ´ ]²]øã?éñ‘ŸÿÕöpOoNçCÜa>b‚ÆCý 0éÇ•ãˆWqpãêX0,+ѱ1{H¨å£Œéð7ãjJß‚gÒô [gˆ ¹"06ôä²9c(°,âhÌ£š`e8Ç¡ÓX÷1ƒíesºÈ(ÒÒ%NvÙËÔÞÉDx£‡ _žç5t£¬l–RÌÆ™–bmkåc‹¤ú’ èÇ0zvÕ·_¼ó§ë³£ *O¦™êUÜiäâO n>“B—/_µ€âQ¨±œMÊìgŠ«„ÖÒzØ·ákpx»`ŸÏÌt BStp<[(¤ÍpÑ¥³àÛœ/©Ô-,‰P™œ~6æ*iÎ<ëÿD©"Vì¯~O 2ÊD@s$ã3¤—FìIä(˜˜ÿ4» o &%˜”µ³W&‘[hÇJò\:dníHñޚËþ"ëØÄ“{í[æžIK4}eç—¿ÔàÃ?È87èà4Ð;ž噺#î”ã„6Zçûw¼yd+Ô åÙëêÔŽ¶ÁÇ+{áü–ÒyÿG~Ñøþ+Æ=÷î¨;§ƒü£´¼½p½£_¨;o¾æû+_}Åû+£²ñæWr*<N+ lïfÃr t{¶àà›Ny¼ªW ™³_ 1¬žT…Mi׿Æ­Q˜3x÷å4è;(Û 5ˆÈ1cĺQ•Ö„}0¬ôVõ7Úì,F+KGœºyº™Ð&h·ià¶‘nÔŠ »i$)´âŽî©€ö _£´Ej£± ­.’ÃxKG GTÏ¥Ö ¬«‚üé•Ú=?.(þ]\I©Ÿš¶Ò¤‹ït_n½(I²<ï–uÝdŠ’ž1.yDÜHí6fàðÈ÷#›5”Òþ˜|JýÉ’˜¢És,]ë½ò#¹ÿ‹ÐÞ(kc Ý´Nk˜ÈÅ›§´S°ö§lºF/§\‡d€áÑÑ^>žEQ^’nØ‚OK.µxá±Ü/‹É%}!9Îò9õâÆ³š}BæÍE·^IhýSŽ!b®L{°øE¬¨@‡Â«w´½~#ïzáë{Zå©ÓŸo)÷œ^ÑO^?Ñ„>(p~à㉭3®Ô-*^ˆH¸^Ù+wwHá÷?°½¦oÜ_(8®Ü+Û™÷Êã3ïîé;—ï¨Êý(úÜóñ;¾ùm{xµ½û-ž]ešœCå¦AZ>×ɲº£PáÚy‘À‹‚QŠÖ™5©¡àº?b¢²ø åpY^¤1M³HpNÍÀ|è=ZA¨ç¸èÃ{dä•ÛY+ÕéÝ£X™(WÔÕ¾›?Ié[t,sØ+?ÑÈë´Rsù.C‡©(K²‘H$D=¦ ¶æ¥eŽÆ¶1Lp¦'<¿ËûR”OxÝgIöß.¸ÿÒÐD¤ý”kð²@%h1YÆú¢õÓ·‰“‘6p„B^&sDÍ ã;g6‚GzíÜt–ÈÜcÍ×¥tÑFÆM‡=%:XÍâ®$¶%¹XÃin§â]1~[óãj|¹”œ 3¸~D•ž‹¼²æ¤ïäÈ =U&ŸË\¼nŠaCp+#KiR;–Ê 3‹D m#‘þþ‚Ð|(Ô na)N€ƒý,Ã+¹¼Ë¤Fì]Z”·ô†0w”Æã?ȶSwʉQÑgFã©ò³¯yýЧƒï>²+÷'á|âýÎù๳ßÑ;'á*lÊup\Ù—^m áý§W¼~Åw…R¹ï\Î0ƒÊÛŸqÞøæûkÞ\wߣ?ü®õ×õþ5ÛàÉ(¶Ð`ct :Æ ÉxÄ*º@RY —«2™WyqgX‹o¡ÿï~¡Ô+mðzã1X›­ùÁè‘—ÈÂD$ÆPB'-qC×™e–\Ì`q dÛñü/åyc.®ùÆ)Rf‘ú „f!QÒ‹ðve‹¶ÌVôÍ4€ÇI´@ ,l-h$YyX±æüÇL5Üú4Š›ŒÉÝ ˜k‘R-Cì_ì°³û…·ø½¦[ÃñƒV¨ƒ¦<5^UÆZá´ÃÎéÌøžxE}Í88ŽÀãè¯wF£_üƒ>7~þ·ûù }Ößw‘6̱&noaݲ,¡†±1³vI:R0šW¸tzº‘,'œ7)W±V"d.aÖ@;5DuÆ¡š N+MÙ Í$’x ýhP²•[¨Ã=É'uÀ¾îòDeûRÀH¤bm!4 p¦9¹®lɶVÓšC˜¯[ ›ùÁ×ÍdZãdáÀQÃig굈׉úiQ@?‘™jÔÇ'WÿR׺´Ÿ^ò¹&ÛÒŸ<þO®[ ÊÉúù q ‘”{3Ô¸éðϵD.x(¶m£iE´±Y¥¶È^1`S7yOˆ†uÓjíFLvO lnÏyÄõekÚ%cT9ÐuFß2-'@_@î¢AÓ=õ¬„_ÄÒáÖzS‚î2œ‹ 7nP6N+&QUÔÄÒsâþÔl?² øïX¶ÜìKÓè+6^|u,[½¤¯–_ýäEõh=Md8ð\iÂëÍ ç{îN|ûžMw”ƒ÷© ç°1TEŸynl…» Ú‰ÚQ¨•1à= ö“ÁrÚàòÄéD­`ݾçô‘])dTìÊþÀö†WîÎü¼òÔ©WF燿k׿úï[±JJ%ª&T7=Û:kØ[l´]9ysxŸµù6ZÈ€dî¹â:<¥Öêlx›áG£Š_‰6aF¡[$ñÚøÇˆÔ´³w°Ù_­æšÈ‡º\‡»ÁL‘2Qt‰ü²&.flÚ¢taXꨓ#"A ʨs]üTðÓ¯d Ó ý/¸ô ?öɉÕuY—¶—`þ Fýv(7·Ÿ‰Súí;%ï‰1¬¸ Ÿ½7lK²Å®È R'ÀÛ:v… ®m–+˳j8§—>ìÑšNÝ|»x”‘vO"x?91Q´.ói~$2FÓP³ÞÎnI–Ñ8³Ha,–íÑÌ7°·/®ÔÔ¯ÓÐO®X±½ÆÖ€PG\H˜’2!³\Q‘øyÄRTW½!7RÝR·YÞJ¢ûØfm”ê å $Ã^×DTUz³SùˆA)¼zK‡?ptÞœy„Ý8Ái€ð¡óðÌ~âi° t£?s_è•Ó[T8sMè m ;;WáAyˇ±…6¾¶®îÅC]PªÂ’ ÙñNÉdœ¶ëìŸY­žY’¬âšD!s‡+ªµBQ]7áyÛ['Cœ Mœ”ì÷;~ñ_|.üóïqëxÜðrÃ÷îh¯xnŸ1¿ÂÓñUÃÞq{ÅüŒÞðɱnèkÊB5YWÕï{¾Â§ÜnˆÀw“{úò‚þÞÞñÌŠr¿Æø5îoøý;Ú+¼!þôOnÀ·gý®êófÃh27§([ï¥,¯}‰mW ¿«¤JYÞ©Lh÷MÑb³x¦Qóh Kå²gQUå^åV§K¹Kó‚# X¤Ÿ:ÝžöÍtBQªÉvwÝFe[—™Tè§úptà‘O÷˜J–¯¬:+'€ÉZ=€xQ§ÊÀ¿Ð=Y<ÜO¡(Œ< CáÅdeF@LNð×?óÊó?ùÞÇØŽ÷‡ëKÈo‡ò}Ão›ïVyçSÈpóÓ%ýqIÚL,¹•ЬÕ0®:G5†6HÍÐ"¦}m ãd­À3,ô#ÿªiŠC°ÝXcÞöÆƺÁ¹Šch˜G0I‡K9îZçúCÉ)›u‹íVæš+<¹jZ>®õñ’ˆuªµ~½ýäÑe’O…£íÑâˆKc·“3ië<>ê) l«bØ>Y§žî¤.4¥¢âD§ou!·Î¹¼¥7è¬>Ñ $Þª4‹‘¥ä.ÇM —‰õßp¦½|ƒ_ýÊßÿhÿãŸñU :níß>ß`wÜ?ãüðÄ|Áó 0q{¢c}BïhŽ<Ö–ší,`â‡'~Û±¾Âý3Þïßa½aÜðløüFëP»ctÜ?~û¯À÷ïñø³¿þ­ýâo¬}ò^Ô2c}¬©XMS€Ö-áç½ 6•)|SÞ:.8ïÕ€sôÃ(³I–5`ÒãÝ kÏáºayTƒ Y;MEªEØqcÇ‚8Dµb†»:`¤¦ŒKnðLè2å·vh´éÛ[`yÏjéžÂQ&#G{nm¦2~§ b\§p-ü”&2:H–\z•ã¯ï¨×y~*Ñ´>9ñcÙò°OT½’ËÔåÙ¶åä q-ÆËƒ}ä@¹Ðh~ëUä2 áA¨€4¢ºgSûCÇn$[P¨æþÑ(”¯Îa´ƒVÎf¶üAûj!O+“]?9 ÖeWÔAƒ,.`Ó®*’r¥nÔ¬WSÈZôÑäU1 ¶'ké‹Sªý^çª X~DÝŠå/1¬å®8¦$è£ìøõ“œÅÀAoW›déOûQÇסùðÄýóŸ|bª*Sú‘fæ[ÎÖÏ™–©hŠì*…Ï_½âõÕ÷öúŽuÃË+ž11ŸˆÚ@ï€áíöÀ—wÜ^¾ÁãU­±Êt,ÇW`ñð˜@°‚Û½¡ßZÇçl74ð\øæ?u|õnÙÙôkDÃÿè?|Á/~e/ŸÌŒÖä´‰;Q¸N<íàqë:,w(ðØCJ€ˆ‡¿Ê4ŽPƒÆ6 ŒuÞ¡/Êݶ4܆TÔÚZgB<± kbþˆþí ì>a¯x¾°á8¾Æú„[Ç7 |b=€/À‚ÝaÏ{àøúÇý×X¿B|…öGüÿÅý‰_þûêk–;† ‘ÂÔ£*6?¢O ¨Œ_l‚ó§Mk¸Ðsrç:VT4ÁR9e™èš7=qvþ¤7ÌÎéµAæð',È(Ó)µiCÀŠOãÁ1F‘ü2 ûæÌnsøÆvEO›ð- … e«È žý{a(à Þi,"òK»–Ža†yý\G5J I0”às`bM¸a(êô_ý*~ôsì…¶Š Ö18!˜ôÄ Î’M9ާU–½¾øìQbl;":© 2ä…RE\ù¨ÉO/Ð+áã€)‰9nTF’õñM½— éìê¾¶ ñƒ¶–i Øo3`Ž9€F“ éªJf©ÒQÞ°;¦Á†1Žîð3bÂõ7:oC‘f´%‚ô?’ð&ÌxÏLžÏ9F‡?qo$¹µà§|_KYMÐ)/;M2+ˆ¡ø– %ü“’m1lw°íÆÝÅÇŪLt°Íì–áùübâ&Þª14'+á´DCœ¨ð “H¶ûå ùÎÒÐù“š¢CÛfðÁÒ²¡†ázt¤Å®6 -HH¢d$€•ªdÇ•úÃmÓ dÈJ™šöS¶Å(syÉ×ëskY2/aI½¯†–tâÜñÎuË’–¶Ä@ë;R(Ñ+i]kë±GeEKL¸«ƒã¾#k5Wè¦ïEŸIµ‰Vkå[0<·á¸kvf®ÇcÊ±Ž«ZÒŠ…ã›Ï¸¿áO´Ž·‰Õqûý3n7<&ì í9¯ý{ÁãmRuë¯xÜa7¬ô_Àî ÞðÜ^qxL ÃóýŽõŠܾà¹ðå‰×‰uƒ‹_tüîïñãó—ŽÛ¶Ï_3N&ýaåÖm³¦e1ßPÆÀû ‡8˜çÙqRQQˆi%­ ‹m¦œ+i K€›˜ñ!ÍÕûfÌ€Ñëkk—TÔô[¶Ïmô¯r_`Kµ‚UW‘B]†MtÓ3+’Gh,WIž³œ€‰ñ€pÈD?U£4KÌB(h“¤vªËÕ§$TeÛ6™ÍôØ:}Öi½â_éA?ÿòc#?àÄó…Ó°@X%ª5ÿx¿8*÷â,¢™ß$0Ó‘K¼xlsz{ý |zžê8žgÇ5¥˜ç®PfœÂ1ɺæÒi„6²âS]Z##px>ó&ÂD9(û5TSÓ¸¡PÈn*: @õ!ò·y]­h÷#´ÎçΔſ‰é“Í9­C61ÖvÓB®î!àëï\d;¶ŒÙ²·×0|úáe8†Øº›Î}YuM§qÁKÆ´†ˆ¹U«‹.¨¥s9Û7Ô®]Ï/uÊ·§ùFSæP®ïq—£×çÒj%f «í»©VŒ/¯øüâ¿ÿ³¹ãSö#»£ Ü2CêX˜/x™äe-p{ãá±ðÚ°z`t¼îO¼gòQvYÂþNŸYtÄüøÀËÀî°—/?âíðÞý×g÷ŽgHIjj å¬JÉêôCNq@Ë — kC7H-BfÀT«UÀÔ—* Žaxæš÷ÉÄ˧"Í2;‰ŽÁµûÀ`sì$ƒ#±8ZN($6£S–üöWþýÎ~ùÀíÞ'>½ãå ñŠñ Ï…•©° )YGbl ü‰ÑÑÞà~žˆ°ðrÃûÀèxwG[xàþ@¼àaøê+Ü ß/|û5žßÿð^~ƒ_½Z†.PÑx(1§Ð=» "Åž©g\DXðtwçç¡ Ná/&u†ñàp¨Ø¾Þ FO8vÄí2õÀnûŽí›°å'ZŽpitpòÛ$Ò 3æl4¶ëîú U·J+–aH¥Œ&e>³Ç¯ãž¥¶m;láÑ0‚³Tvd'~²±÷Âåƒ€ì ŒÌ™~¸ZF1¬Å+>¾>ª+£ù)~*¾/\zì«íÓòáÆí¸ÀôÏNgŽž¢»ñä;޼"Ám’mü?ðÆ«´#$,^ÚàÓ#ü€Àº¯ŸÖÎÇðâòúb¡ŒóÖµ’õós‹RZ³G£ó«Ü)ù‘´XÖÿ›É±±“DŽT5*]VÒnÖ¤~²ÍÛsNS>p(£B$-v+ðsÉGú”+ÄTÉÔ-uâ L© –³!?Aí¶Á:¡ÃhX²AåMjÆ$OZÓí3t*Oš)ó3Õp<ºÂ{$ŠØ Tkž2u‰OqSÔ⸒9ºãÙðŸ¾õçÂï ¿éø üîŽÑ1žxmxÃ\ìv‚À\¸ba™2lñ|†¯pÃ?âÅðjøgÀ;F½o¯:^ž¯hŽÇD,¬ÿÃÿün¿Ä˯mt„³«aŒáîxŽÝ³¥œ%)á¸Ö ˜ŽWÇC™YEÎC±1¹D„ØEƒ:GÝá_™â’[¬À¬ô^„d´ vUÉmUð Ô+4¡âéH¡ž%(¬£ºz¬&©ga‰•‘?ƒˆ¤ÚV3?¦í2AEx9a2¨£NmÓ±rCŸ€Ážxd£cc5!²’w–ÞŸŽ„€™:%˜4$Gä!š¼’ç7­î¸9ÞtfGR`g¾¡µ†ÞÉzËÛýÊãcŸÈvnu¨© U}ÅXÚ¸´Ò>•ñùÀÔ9âõ“Ÿì•Û¨+g@ñ‹²‰ÿtfÂ5PVwKoÄÜÍ ×D©®mW[ûéÐCÜŸnØ•0¶A Ø …5ÑŒå}Ò]Öž‹ëµ–›qã@ñ'÷çå‡ÌãwÅRÅ£mtZ& ê,áTJßÇFh]fµ…±ëªp’&Èwà‰x‡¿aLàÁ¤1a¶àSaã²Î»y¨cÉcì!H¡Â2°]=†Ô2vúžiÊîÚ‚ãmZ¯€’–0ß6‘gCãÖá¶9NoAWÑã´ö<‰m ôÚ»T%ß¼àW/ëÿl·;Þ¿Æ´Žçí+ëR¶³4g1hÿIÜ@5“ž²ê+/¹âô+¾³Ž‹”6S/hrcˆ¤ÿÙ®†Ã_hUÌ5¦$^ŒÅ!ò×+71hÂüîð ¨Ï†NUDÖ+\N„dÆ4¥×Yi03<Ô `– hjä). · @™©©¨0Ó}Uƒk3X§bü!+?û„OààémŽ‘âdJqfz;,‹kr¯­œ¹ðË…¯'¢õ4>Tô^íªíí¹D(vâÁ]þœô“Ð/>c;,$Íty¥c~Œ¡6 Ç+M¤ã¹åÆJ;ljâÈ£³þF6p <2¨«C…©ÇNäÒ:àjÿݶIÇÁ ÝV–Ц“³Û±Mç¡úɺ֣Ï/¡¸èDÙéÚjwå¾I™­ã·ï˜Ï#˦xA†K5ÒeFn´ÜÑU²1Ùt#goIåsxð‰M¸Ç|5¶g¥È©\”ü3%¦jœ!~4+«#¿ xö€UI^2zƒæ:AjÓ|D7L²øÉ@Jå’W½¼FRŽÿüËç?üaľžxÞ>¿¡/`á‘0âÉn‹yÏp9 ó8‹À,Ç-ð–MÞñ̆·7¼þ€Ì`øõ+ð4`ÀÄwÿ§?¿÷oþÆ>ýã €yÛ'+–¦…#ièހǜM]V°¼DROgÃÑv*Ug4̦Ö+Æeq‰–…®&¢R™Ln ÂW4 —˜îÎÍM‹ “çûs|ƒ sÁRÞO²%ÆS1M%Šîµ ¨Ác.‰žx‚íhxÓ7Œ¡îP`l•Œ›BBåGYÆ2ur·Ê.¯ã;æH>– Ò­lø“a|¨éæG|"‚oÈ‚‘šo7Î6~ÅÒÆÔ/B`_C½ÌÄkBì²o޶yÓaš·#¸õDẳ˜#~–û7*Úíü¶xÁÉ ½–ÞÅ[s4>=€Æ ûÝö˜HîŒO×8 ý*c ÜXð=­=&Õ/–›ØßV]*Þ_ëVëï‡DØÀ:iúM–Ë’øÚ ¾°u]"…’!V(-Ê’ž3TQ„Bypt×ù¯YäTšÜÝM ž?(!>¢¿¶w?Ž€zVûXAâ¶—ÅÕb!1½‹Žeo÷@è8I¥Ê2Žþªhflt“`;‹û§ŸØ‘x™—[Û´Š2ÔØŒ‹<,¥"G¡7ßD’œ¯ê»dö,‘lƒrå…äs“ž—¬@&rÂ89” °söi?©ÁwŽ#›UL/-Õ½À–“cdŒìÛÊ`Ðô´g*CVï€c¸Òè* ¹ªx%mP EÝÖˉÈ[ ¸K¹r(VVN¸À(ãæÆ§âþLºn@®4÷`qóüæ¬\e› šmfºå|>ô#eýÛŸÑ3´è;¿À/È@wîXZŠÒàࢆÃïj•MÆú&ÊÈ}…d˜—àÕ³2-3+„yœê¡ 'ÿjúäHbbÒ‡XÓŒH.ùyy¶Jæ“%ŠF[i¹3b[[’A{¯ÃƒRn—ˆ³ÜmA.SôPž¼M–Ój¾¯ñ½+‘õð£iuI¯Ò Ú^I^_R­>n‚i nDrØ.õ}Mâ¾ÐÏwAYfSZôZ=qL&|YƒÂ(2÷.'GÞó,ý/Ö‚#@\¹פ‘D—áfí¿ü‡÷ÿõŸî3p/§¤Þ0ŸX¡:0¯ŽÇÀÝñþŽxÃË Ÿ ß}B<;Æë>™1û|Çü‚~@LßÚçW, -½PÑ1<›jW¸–´¥~ЕY39 » @9ÆO¬…]@Ãj¸-Õ-츛+œ½Ã¦à<—]~õ3Úq°Téë_`u$(žq‚N'ÿ‰kK;GÇ‹«]Ò€@ÆPgº˜hCÖNÁ©t5B¨!+nGoÀ]N>M$ë…¸(ÇT=Ô°qCN}m¢)”+!Ãt¾œ«‘ZW ¢H‡s„òW<‘¨¸ÿFCÉšƒ5è¬a~‰¤æ&ÕÁ‹M%¹+»£[ð©ÔÎ$WxP„ÏÔ Šê¥:5ƒ¥LqÑÓ‡[\:¾rªjÚ@D#s)X7'[ rv¯;;<<ƒ5÷wU€Ë¼7;óLßlç«PgÊ"ßmŽ,Ù™?QHC±Âª×榤bh´( ,õËvðO=r]äýóœw W;’‡GÙŒ~XcÈÑ®AÝl*¬Þpøx3Ô“½ú{8"æùd€MvŽ­[BF]’¾iñÏb[9ÍxËà‡â>ò×ÑRwð!ý Fª€„Gç,V ‚±"f V.$èÊe˹ïe1²‰ß`>þѾ؈È#– 26<²¥”Ãéx>q_hÐÙpŸGL¬îŸáŽ×ÀŸ7àßãïï7ø7ˆ‰þþ'´ŽÛoÑï–á ±Ð:C†Á;°0°£zHgÛk’çtÊ<½,QYZ²Á¡“>Y¸)Æí`©nZuìQ ú¹€Ç.ª{—‘$ û*ƒ¡ºÉ4dUÜ6ŠªÎ”Þé1'—t5¨©®¸’‚^‰5É-û69V ÌÆÄSŸÖ€Æe Ï— ´t 7ÀñPc™Ùð ¼­V64`¾‘”ûc·R¨lCeÆ+ƒfUb`ÞÖƒûo³‰­ÜáÜ’mö’z’ï­ /vé‚´ec5¡Q/oü:€tkøVAN}­°qq1Ä–ayð(À>€èš¯«r§*½0ÛKXÛĪL=PAâÂø—€-bSFßi —lo&Q« “—P7z…6G̸¸Rw¢#èì&}°i©È]'6=./nA7”Ù•ûËpdMFBÓ£kL¦’À 7Ø)£_{§[¾÷»1NŸS3=NÇ&A=lsïĆö¬œa!¹Y§öÉbǾlI¹02•?ÈÅj™‚…¥È]¦¼M­|É Å”.KÕ/lâ XÃwñù÷~Bf#A&«¾°æÄ ŒxÃmaìž~Ǹ7,cfï+ðf˜xÅ7oxþßøÓÿü ã—øæ[ÀÐ3Yz)•!7.`ª¾|Ú'ó´¸–P4 hÃqÿYšhãòò0 ‚Ì©»'ä*Å«ˆçB§tù u(­&“r¨{š‡p½ŠN“ *U[ *Kn8m2mƒH¯Öõ ¡YÃòŸ‚dý2“8¡ýyíƒLü17ÁX%u §ìtUÂ`îðª´Ê §÷Ó–ÉYn¯#†²MŸ öÍÝ$ ±}2Õ¿n:T^'­Î¾úöå¦î˜Å“‰H¶CŒ¾ØðŽk„2lum1OÉÓSd¢­P\ $sè03´±˜²ï@ÆâvÔ¯ß|K0-i…ÖI‘¹¡|(®‹bL–&KÌrdÆ×#6o—Íb. IDAT rœZÛËÅ5®EúkçºêØànûǤ짪w9¯,TÅD6L°;½úu½l/>îÇ¢•Ý ‰€Tã r§åÄ$„[f™fð4vMô§oÇš$Õ-6ÖÕè4ïðùF¦0c/lº‹ü¢¬ðž9/¿®øqç;r.ÓèÂ÷¼‰“%•å³TB1¸¤pîEàüøÿðÕø»ÿ6ïï˜ mÑÜ‘à’;°æÀøŒö‚;î ·À|†h˜ƒ¯7üñüâ ?,|øøÓï1~Àí·øôa/Ô࣠Bš+XY‡il1“Ë$Å7{ʉ+䶉'ŠýUxAþ±Ïšlž¹þ¶ú®­{zòKcƒQ ·CÌç·PÛ]ƒ2ž¢L˜6¬á0`£csHM–“µh…ãMd9a]zßÛš8„˜¢¨Üâð–CfYÄ9ŒL›‚h†$³œZ8ð k'¬L”!¢ ™z:\ÖÎÓ*»¶è)ÄõÀº[êæøz—vr† ç*¾Å$Ì;O¾«áf·@2cÚN€¼4jDýk£fùB3Æq£<„.W»mqëÿ’H°g yM×—¼ú‰¬ó šÁú!‰íXC)Œ -‘/Íze×Vri ¹ï‹¡Ê©Zïû±S%Í*îÀD»Ãïj}39´¥Ão·]ÁR#hP²Â&Ê‘ïËÎyCAÓiöiÚdz+‹‹Z Ž™OU¥å%QqÓQ­@Q6)ÎØä½¨q Ç?þ¦?¾iÿáwëS`ÞqëìDHjy£{p/Àã‰öÿ„–ñ©Ž6a|}× ¿¡ë÷°?àËŸa¿Åç¿… øs·> Xªi=…m›¬Ë™ÓjØk˜Æ ’bwÐÇ’¤Wå’m[“†ZƒÎ;‡¸sh/ü¤OÙ‘&ŽpbÍ©ü…„:i¼b=Ël BM qbPmUìAt­ZÏìKevSŠDP•­/C£G$±áÐBæ#ìFÞ0ÒuçØJ­ôÒkA#[ÊQòä6TC´Ì ,ÐñcòÃs—oî¿\q­Î¶øW\JU&H#”@e.õÙûiGC·„¥PƒfîÄ¡”žµ¶a7L@CÃ@w“¸æ•¥Xð(ïú3uÂøhÐØúP™ Ú8âyØÍ |S;Àž‰{ótºmLT°:›†yÜAÈñLƒìàõÏP¨ëÚäÅ|=0 ÅLÛ?ä4×\©™üÄé/µýäãuDô€›biªºä܃d0ÐÚ7ÕªeÝiC¿ë<”™b FIàes„êlÁ“ò{h="P“§4•)§EŠÏYW»ÚwdëƒË”&N®ê* ™b¯"O¶ÛüýoìíSû›Z·Ü0'ÆdJÊøŒi˜ODàõŒw¬L|ô_`Ýñ§ïÐ~ÀwïøôÆ·¸}‹û ¾dâ‡3dëH{NƨLS‰±$àTpWýÐ aZD+ü^ài¨t¥xhÚÓØ‡dUéàe!ý>¹øÂŽ.¢ªÎæF?|I²¤Ø&ËÒÞ^‰=Hð­i2/Ï*üž@»øá‚9Z‘XcØK‘FÖ`OÀš‰3˜ØLo+  j¤ž!e+FÙi²)QqûM` ([%P퀬F„2O%W£¦a¬cñ‹YîUŽ}8Ü7¡0«¢PCÑ´8Q Œ´-Ö^Ö«ÕÕ¨kì ^Œúj Œ¥½Ãñµ)9ÐÕéiïÀ‰ôf±·-®tV—¾æÇ]d"‹,“µ~‹íñ¢ÞÔ á´sXbÇ[)™Ùg„’WBÅàÊR¹ØM¶Ýªà¢‹“º\Ø(V¦Ø4™D‹{æÍšÜuÀ6‚œ J¶bîqÚÑêš@ Ï®RÚDR!©«‘›Æ`@ª µ¹0ÇtœÏ<áÆÖ–°›Ð?¦ZÁíÀ¡Ü9gÒ] ‡ªž¤Ö®u(D È”q»l[ÎúšYüݶNÃE†W}(ˆ†tw+â{¯XéøÇ?j§xȲ³T²H(ËÓ7CtæÔ0Ÿ°¶{ºæÚ±eûÎê™ÀUy@õ\U Þe¨5°Ãêp<93’çRY<É x1¼%…ôM'¦:3¸e]+à®N¹¥f•TX¸0´Ž?üÖâwþ7ÿ}ýî7ýù5!×l¸ßá ˜hŽÞO¬ |Áû¿ÿˆïããå?—Opàîø¸OÙç¥?³t¥¼ÃÚS:;™Ý=` Þq«§­â/J .©-,ˆ‘ Qõ+õÝ+Á¬²Uµ}ÜØMº!s”ÌͰ(®ÈúF aþ¼„wÚÁK%p6`î¾íŒaUÔM=y‚ûm xÇ‹ã$~[€±ðL£(©r­m’pßj‡ûÞMáZp¯E§ÆbKßfÔQ’û×Ycm®&'s’Ÿ18mùci”…¡Ôe4iÞ@¡Ã¿Z¡æ Ó•DŸƒmË~ÀaÆ‚û5i3-A ðm‰+^ øyF_Á÷#Ì å¬¡ÊzUã½Â^±:Š~Ñ„j0XÅá6êU;¿, 2‡‡¹âû9Çd¤ø†{‚>C—Ñ¿æ"pS¼]Jæü//F¨öd~Q=B×UrgEEs´s޵øÇëJ*X!ƒ@þPXØ?2~Ý[€å1®±–˜ìÛˆDÄpDÏàÇQ7åmŒÆeMFa¢*ÅÐ'É ²¢³H‡ìdžÄÓX•[ë{!ý ‰üw²ËG`ÔÖ«.ø†ú…_"Rûݯí×Ã_ÿq¶¿Ç3«ˆß`¯öÞ‰uÞxƒ«¯¸ýG‹ÏÖoLKô†˜»èl›ëŽ6”A9(MSMϘ}7FÑ„ ô9ý Œ8R.²I-²bdzôñs ãnŽ7ÃÝ)ï°ž‹\„5Ù½ŽçÝé,¥0è U(¸á€=H#ðÞp¸«â›è/e@?Àe Ð&¬1ƒ)§g²16Ðî‘&”LkJ ÌXçIeÜT¢8£ jåœÌTDÒ(Ò0ØÁ— ®$k™ñRê÷†gߪÄŽ§”’¤x«ð³ôÛàÞMßÕq§ì|Ò¸Ž Õ™ Å[ÛսʚŸþóY‡(©·Q•7Õ€k DNª€Á/rÏ—¡ gC Ï3Ÿ ‹‡'SzF°è3×­ò@ 1ÌñnŒ…c­³\Df)ü5&ö~™øü†göй k =ázØjghxÂ!3Ú¤%ÏÌî¹ØÑdIƒ2|ß§¬rUz(qH^Ø ˜Š!é|TˆØ¡j$4>ƒˆ“\šA‘1MR*hƒ†Ñ°Ê_jÀ@ÛÕÊÁZZùÕ®h”·Uà³én Ÿ“Ý  ÓËÈ–¥ ‹Ôù `adè‹æž„'¤‚¦j:‘Å™OÖ_ uî£V,ï]_¥`*ZŽ'Ǩ£ä@}ÿ" I²ý>©gÀ>Á^à§.â{¸Á¾ÝŒ‹°,´¦íE5Ì1/º‚¯mÄ@;£õß$ZÞ»±~¸U¶gr𠊬õ£Pi2(OeßäS&|²ÞÜæŒUé¤Ô&qÆ.ËgÁÍ*ÙYI»AbÁ'z#²KÖ?–øNÐ]Ás¸=õ·XM¥Óp€-ÇVéÒ2žBaÄ'aªpîeò¾¨Ý1j'îô™Q$šã¤¡÷ƒ®D {g‘cd{Þ…˜lÿB|é²½8U‹oOòÀzê+ÊÀª†NIY…åT mØÙß=¸€iIOWPb»6ÅÖÉÀº,¨•¿¢fÃ×Ôf¬¨ ûÔ—ÝLžsGÍùViá.„aŽ5hϘw¼¼bÞi=³÷嚊WèbïŒQ_'#&³SÌ>¹°Ór Œò¯4qB ðʳ[$ ÊS‹×®lÔ#íÁ×6Ôðô¢ÅvnäÔ© øS ßuø‹ñ̰ÄÓ3™zºq!z“…=”!aoû¹9(©Û•CÈþ˜ežT“§XmÂ’ˆ­î與ZÞ«‡²JçYÒÎm×ql†¸39 µÚ°DeQ³5)gS&sèŽÔ“ ¨íº/®aPÒܱd®5Å0pØZÒ Ô)PYóôQn‰¶mDyœ’¼Ëî—,¯|•2Z;5°Û¸3׿£5–k-ÿGÞ¡*[بnÙÁ:Ä’Y%;­ å9Ë+»¿ŒÔ82H`e<ÔÚÎ&Ÿ. Š »/L )Ët$sõÒ÷›¡ú;èEP€'k’[&mã°ÃÐ<Û€É:¸¹2»È'O ™×¹/£*µA~ÝtU¿LŽuõOâ–¨ˆêÆ£D"1é[€)‹RPv¿¦ö¿éæe°»Ô;Ê“ ½½|׃al)¡!E3¹DWU¯ —;µºìs^ô›šÆ´dñ û‰ ¹ã"ÔŠÉ|lí¢UA 5eíÈ<JFÃ-ðl*âQÐÒhÔ+úô:!ÌäΰXÝŸÂm_ÅiíÛáŒúo‰ôú©ï­åx4€|tkð¹åÍñ¾*G‘ÏZÀB[;*´è 8MÚà<³dlÈÅ©_™BÉqµt«Úo^aE~·”ÄÍKþ§õ™È?·æ&©G4UÀ ÒõPÛË øÆëÍŽ ª ÄIÓˆ\OIz:~¬5, ™Ÿ™µ biZm®fj7®XƉûÒ±ãá!©FEjÛ…ùé¨5Ô”ýœ‚Nø^BC± Û›”'—^hŘò¿Â ¦÷љ̊ÊÚçéu[ú’xÃV˜*"³ØT®¹‹EBý5ûCR°Î XÉ~+O…á˧àÇv_ñ†´Î .R8 ²ÿìnE מ ~¯ÊçÉj³ûÊ_‡ûJ°h2è5¢*;é(yÏ} Ë2\emŠêšŠï¶‚à²40')#‘ÚÌ\êT9ò)É|¡-ñÖZ ?•?qÐ[c˜ìH纅¬Á‚¡•dÚt”B­/Jš'÷:ÃIs é*°3Ú-¯Y@¶kÎ&K˸%Z ¦ òh¸ƒf xÇUquõŽË1.Ô¦ÁS¸EX%……ŠÇeö@ðn^Yüâ@‹T(ûOÄ>í)ÏYøH"ËL±Ô >ÉW«ÿ]KÙü‹opY¡ · ôr¤aȾÌz³Î=)Å9“­øõì!ƒÕ£“}»Ø=ϰ‹…Yª‚¹Ÿ ¸ò];eyE2p+ëCã¦yU©Y«k=­¦cÊN¬µ*©™ÿË®/¥Z#'ø­&*tìñÜvåŸùPÝÄ®³á»ˆ·4Ù(xÜŽüÃJé~؋ڎ¦ ¢æ¼§7er–Ÿ£ á¶Mœ.Úð <Ž“ìðØ~8”檌PWÌÒ¾ª¸Ð¾J”м[¢¶ü¾K×Rˆ– däær €"¾TF'p®‰0Xq«v2¼ÉAÑÞ«mh¥+Èaåb+rĸɠÎ؉ZÒ¤lj7_ë~)q›JfZRšCûÂNŠØ*j:µVV†ÆA"؉Ê¢"½9ZǰÝ&ˆ³mhʹ›­€‰°¶£¸<(zR—º›b=”ñ[Ÿ%ÔˆM\ÑM4oO-È\/O•ñNYÊq†T•mÁ…ÅÑÆJç²å1Èîš.ŸXíM "UK7„ve¿ýBI9€VÞ­j´IØ—uƒøGÞÿ—¾Jâ@àB !×o·N“h$ùâÇŽö¨éØëŽ, u2,0"ËÄâ÷‘Ö*•a$ŠË8í›OeÌ_„„åÁtö²‡*Ä÷/ÄV+{Àü6¿šdˆmoiPÚ ÀŽ@,¾’¡_Š30–.¿u6`w®âÈÛgþ¨eÀ½jV ¨“ÞbÏtT‰è‡g…g%^pí•ÙD5¥€¼4tT•~É:‹†{È<•¦†MäüĨºí“‡È\Úg9„\A±u–29×!øð€+ø2ÏתÎƽ›˜ØnÚ¢»Øïh®üX¨N_‘®Ñ œ¬¼ç]šÐf®ÊÃùòcC²}¶ ¬+ÕÀø¢U,kȸT„Û?_\+7º4Wlualφ1es%ÍD2Zäue©â¦€Ic±Û@«ÎŽZ «˜ÌL¾Õ—Ý<5¿rÑò¡ªb`úQÞdJ¡Ì 2sÌIw0»$aÕ'(Fà$¾m§­›(ÖhsÁ+Né²™ú¿춬lr1go×÷æõ=¦ÿñ%FéêuSš„ëœû:Ù<Ê|&R¶ÏÌö>‹eæÍ£ÂìpÍÈÕz†j›-F±ê£ ¡Îª™x„hJïá`‹#Œce/„E´b’~…¯ã‚ x¡ì}ݼIlÔð/‰ÂÐÒ´=’bæèÀã¹k 1•RzJ 5@¶fFÕ ‡Î¹ó¡é­‰¬;²4²&„ž£–‚ì*h“éx]ÂØUP/Yv¹ôwH€NC€a<;N-¤JJ€ž‰ÖµÚÜ’¹Ë”…´ÚárÌ6YÒ ùBN`/òVë’Ùå> ³Ihi™ûºÕ¶ÁŠB’p(Ü)€ððAo*à 1ÚM«ŠO8,®gDoíx)¦&Þ]mjÒÿ¤û¡À8ÀÒ§,±PØ_‹Ü¾ ?£$0Xß% ¥0 <Ë‘,ªA0È%K–ô‰Ë²ù¬Š™› 7&š¸c©ÞÌf/MË廎PEÇ0ˆK‚ÓŠ `° ÐhÆ¢Œi,Û^FŹqí¸ ª´“h«Í2å=V(S×É¥% ? h¾Úñßÿ_¥j$£?<±M ŠcwbÍy!r|•’V+Á÷‚KM>d“ Ø’¯ÕÉóòºŠÀÚõª_ ö5d(€kRÝs£ûb%r¯ím=ã׿Õ°Ã3êIz“ÅÄ•³^ÓܧŠÐ‡ŒÑy• ßò«)éZ™ÌUBŠ£=ÊÙ¯4Ó ³ÞQ¶Î ªò³´ìÂ!üa€O¸ÆznqǶdÁ€-妵½P§³½"@¢(¡òB+°Í¹Q¦Õyª°4á°ŒLƒI…–Èx¡ÈPôJKt¼›Ò+eOÀ&@½Èg òðÚ h>N ‰88UäJ†ÃÿoíõA)¹bšú°x÷MR ÊÂ>Èîˆu€èjG%«—Ë~Úœ Tá\8,ôè8¬4àö§bA“eebëé´œFY9œŒdÛI; j¿³[V›žW°Q“mú<9W5+eBê‹7ØSŒI¿r%:ZûhÅ"ùMÄâO\îTs!ßÈÕØÄ,_BŠó+Žã27a^n‰³pEŽƒal]Õ¾Œ(2OûTý¨å:íPd(ÒÔ›b‹e-qíxÊ3=ÓsÞ€À\¸ î­ë®CéE¶­©¿ZÁÆÚe¢º,-!ÎÁ£ÈUc²jÌ sBN"¥°e)£läºÆ¦ôÚÄ’c.k°,¨y}Ù‹()ýÕ6bø&0Ž*Nee–‚áRÜ?×&Æþ­QÒ'_®"¯¤—{:ÎT$0ļkb ;¦Üªµò®{~¸*¡àG;« Ò+€€Q0Ôb¤¼Laó|Mùùæ- Ðä;³1 œý|`hYFš:TÁi‰ôs`Úr‚‚éCþç0st…1TÑ í­ h/.Ǿޭ޸¾þ}A~u Œ&‹LedñnW–Â’½ÇLµú”ÿÎÂÚ“ #Qy– Ž‚ø~ˆ•Läxœ‹w˜ Äi,rʱ/Nsûrk.…µƒ±I‰­Z—?vô[ì2Ô M8EuùM6údLÕÏq¬¤i:Wh,Ηrj¬J$jØé·ä?oX}—¥—² ~ê—±°0víW=«ò4rzãX;es<À IDAT@3]y.Bˆ²iƒhG{ ÍÈK÷rn›ƒJ[+)ï‚“àñfWBå!‰–«©¬Mr±2€ûµ0Žž¾OmÎk08ÒEl;wZ̽ g}‚VõŸ¯p*Å clØݹh»ÿ6—Ú6+¯L1~™1ï@tú¬Êôc Ba7«¸¿£‰thÇÕ¨¾é¶vÒLH`ð±1žµMú$8rc gñÜkŸۼÆÊ²ÉÍ rž†ZK&Á”Ÿ#uÅ£âÄØ½×ÔzÀúÒΓð¡x¬BRÓ’ÄÿßÞÿ.^~LG¯S°7ì~pÄd?Š‚±»b­vq¿$xËNêÂiHmcŽ <É qŠŒ"/¼¼mÙÊñ«ÇåÓ…Åñõ£t¸““^ JŸ’ñÉ7Û%rŽž·óÎ8~~.`(ç«>O]8MS±õëk.ùd–6 ±ìPÄ ŽœLïÔÇKZçóÓ„Êp†§¦þ4y› QÏM¯lÒ]MĹªô©‚Ìú,¤šiδÕâbM‹Y§nCéEQG,Ã?;㥫ÙÁðG?ÊçU‰Çì1’†¾ èàr…åH¯õ@æ•6‡¢¢“®Ê°²$6¯À¤ ÍÚÖy`)&bo67,äk‡Í¤UƒñŸ"¾Ó)IÉÞY|4=.uêcˆB3Î’A܈-Eõˆ$—Äѽ‡Ò®€šoÅ%ÏuSb߸9_kèb$×j„$‡ßÿ£¥†Ðw±–ü´2¨vq* *’¡C1E·i„ÚåÜ÷±TŸ¶┿-ÁëOÿ÷ÂÜöU,-_öñ{i“h@W¡Í‚ŠÅÔL‹Ö»H3eøyÏrÅÔ¯ìB¾À±˜µÔéù-ÚEʱïï ôa»>·ŒEQ]ýjŽ.ÉTÏ/o-”麈…ôíçŶíÐ`UÁ!¶(dâØófÏÚ“õ™!X4AÝ¥Å.tìÕÔ1Q}P£žO ÝÁãXX)ƒjDÅwÖË€8Θõ rÊZš¨(Ò¼EúHWÁ€E¥mÕ•±§\K»Ïv9„äÓN‹ÖÍ„ðÔo† —Ÿ†·¬ô0…õ³ ^¨@P¨–dþ*I‰÷ ™¢€ÐvöPmÙêPF´ÉIæ”§‰ZɃ¦›§‹ÒÀ$ŒæT|»ú%à`_”-u€±v¡i`c)ªSq¤ŒíG†¡0¹ì®ãPí̦1©Î–t vwq ì`âÉsd(Cº(†8µCe6‚á›C­"n˜!œâ¶Ñ·á¾ÏH’SF •ïÊ ³Up0JŠ6ä [Âc*‚qÓ¤S$”£$¥HV‡N= †äØÎnEn ;Ε¯]è?-þ¦øŽ‰º¦†1ðÄÅ(J8¶Œ*ëåR*Ìù2E„Án¨TœáAÿÆ_~}ѨÅ_¯ßDhWœ Û4®S¯jÂÅöÉäÆô®ºo­1 F$’{0h,`GÍKp#A-§Ì’Øpì€HÓŒÊAg%´jRu ôN3‹.#$/le<*õm]p¬¬iŽ—·*.”d­è½K\ì}?·AÎó$ëA†R<m#nÆéCüEq ‰ŒlÀï4 ±ëºLgø`Ù–æt>o9}ß–áùÒ†2c6GV¶m׫ðPýÑw ZÆçžX7ÒBš“—Ö?1 5Ød•Z]:š‚JYd¸}[ ¹•Á—mab× .uÁ4¤|x/ádB6!ÜÅþ’/ =̦: ³`*žÛì2@óŸ7(­×ú3SU¬–"¼)<´Pª(ÓDÕI·¡Ð£ÉÄgÝ´i@ÆÒÅã;:vE¨Dâ:zrYÄéSµÉ»Ã#l~EY†A⼤ï4À0&‹µ9%À”\&ë\%vÙÀ2æ”Ť§!…è&fšQå²l Ìq6ß$)þ¿~ùOÞóúöãz•aë|ãrnÉë<’ °¥Âº"«%Ód,˜° š*¯p]šÎ-Ô²±®o2˜jf)±ësljî )×YÂÚÅ‚÷MŸpÚÅVFQ¹у&rH*í"Ê+»Má)-Ù™w.åÉýýú•{꾕åL4e"hå“WÄݾm8ó[{GŠp«Í\ÖŽÏYìs²Y›¶©ÓqâÙa7D'¶JvCÜÝ÷L]Ø‹ úÈ5ôL4-–UtGÕ¨(“EQŽÆ_H¢£Ç’Fm$ ÃzÒCefÍ3ŽÙë)õ®-4æªÂ‹ròWiöu¨‰z)'£É݉ãA€bÁÏm?N è_µíÙUíÜ_$C÷$æPºÖ‡3^þp¾Ë[—ä«èd(S=M%¹é}K²ü£<©V?Á®/™ÙƇWšN ›‡º~R¢ÑŒÛt=ƒ:C"½a‹jRÃØwË@Û6úymžsèJª¤Gâ’,/zˆð=¡:òIri ýóþâ×Áâ'o¾ÚaÚª9´ýçß9úøxûóß›€µ´BB,LÚõM|$Ïóã ƒ$&ZäN}50qü}04ýäV­öR„‚¦-äâ>d[wZ]ù ¥_†ÑºÚ…àN¹%d‘+Æ8¢ØßO½ü|ˤÃ~í×eä®IA.QÝÆ%^ÅÍ“<Ž2 V†ã‰æˆA¶eµ,âì™ÈlX°‘À;¤‡½ŸDåþ ©”5ËìÂuk⬙!Ae'o}RÛ[º€îÓ†ÔNbÿéËÉ(ܯp€ÓŠ Nj—Ç€H.O¯DN :Xz}©'véùV °ªYR$7.ô¹&c²µ\"•¦dX´Ã.§ý*išãYm¬óدŠF^’I$·™ Îa ç“–Z ¦þØ©3è»ê—¾›êÈ0Z:¹Velq=1«¬ßJ6kY\ö4Mó'e¹˜Òð F+NÁuä óØåêr™bp:åÜ ¤7‡Ò0JÐÔtè±c¸ùëÊdë|îS >ÌB lƒ#—T¼#Tùç‡ ÏÜíÀ!‡~ w棺è²iÅP##Ð^øÒÔ¦}Ùž´Ìîí`Ž¡B¡<M¯ö1È1^ %_©N:v~?µ ²ÎaçñnÒÍK(ž3ÊK©I¬£R ®»såþ†ë}Ε:õ¥ÁŸ2Ô`‚HU"Éi€>7€®xÇ´Gk×¢ª“†Ø¥H…®fAWïðnŽ0N3§ò«èUâ[Y1ÇíÅ=݉` ´;y‰sŽAQ. ëFdîhã˜y ÅS*¬®Á9øÊnéKFùœÄ#¢â°]`ÐËi‡qX0¼'wÜ'ƒ•®Gn¨4ˆk‡:«X‘z‘`rFéã “vfÒ6JšÏ)9ÔŒ] UÖÍ7ÁlN'SI '>Xj­j QªaQ{ySx}m„l+‚¶Yçiz©·|~{ÆXç3ÕÒ.W)ô+Ò†Ñ@ß%*z¥áèü#D-oYt;÷â80 « '¨rÛKtž¶|è_…÷Ÿ·”7ƒªìÐ]+›ß´Íyrç¼ÆÉŒ&«_á(fP%_r7<Ûôí9lmý‰L¡a8S?Æü§Gh€6Ãp#«Â9 'À´Ãȱ?Ô¶#h¤‹ÈÿÙŽ¹KÃÝMNíß÷ |`Ð^ë–_ÅãÒ„ågpÔù+—ÛÀ.\²W[sÑ'êº3tŠ$é²ÙgŠ–bx`춘ÛÇžS ”æGPÊFï\ÉWÇC£Êàku ´|41WŠØàØ>Ã\òŽCÍùV­')yç2s»©À¼Ü0ÚÝ#c9ðMò,¸ÅQ˜‡W;œ‰çšdKC¿ØeFm¢½†É♑tWÀ¥BSzg¢ÖA6øB{ßʃ…‚‘.¡"ˆ^‹!%h•V¯Dšq®q:Nã.Mbî~æ®­ÙS …)W%©;嬲WÎÂÈA×ÅÀª‰ö8¹Rs¨V±¸ˆySäwò„Z½¦ý‚ Ú I#ÝÍÀYePœUØ÷ß–‰Œ 'Ÿþ \/bÛcÎî1Øð—¿üöUÎ’Eí¨ˆG©ä:d.nU&³šÿ…¡è4eüŸÉo] 1'¼xVýqݳ8‚½l?/f2kzlô¸Ýñ#g¤ãê¹ CWP’5v} å€þê+¦àê­Çý¼¬¶Ëß%Gj/¸Šõ ßëL®Z4§Ç}Ø‚ËCôóŸòzÇšk .‘/ ™ nþ«]ƒlÖV'PG½©ìO"†ÔŽkͽ ,g9˜&_âÒq*Ù–±ü^6:)ò•ˆñ…d¯¡p÷͹™ΠƒÐÛþ™k@›Ëû®S–oÇß›/éÃãs\c% šBËH'È´wY~S¤Ù¬ò¥Ò­Ûá§: YLÞ”ŽäLeânFÙôlÿ°7áK.ã(ÔCÑÕ­›â¤]vm7 Ÿt²?'ا£[LaBà\à{7BÙ°Õ:ý.e¥Ì)QGì ŠªLàgì¯Á+Œ2%0öf*:8ઞŸDÕÔÄË._Bb ½5ýhà[û>•”D È,®öLÇP2p„ͱo広i8 Æ•µ:»Ë†×èç†Ë:\V©ø]¬üûÕ´>’ ì®ç7Q¤ƒËAÍD£Õ}óÿáîݶ$9r$ALÝ“ìžÝ§ùÿ¯œîb†«B÷"P˜G$™$«zº×N2ÂÃÜL/P@pû=.¹•ËU¹]7ArWÓ…ékâ“KÝ·‡G©Y-û€mvŸÎD†ð«ºz~3‹žÈYh `œ-ó´+2¸XRžÀ”ã©J›b¢s¥Å¹oSE­ÁUÜ7ì‹`V€9ŠoÀ.\¬'@o*ÛXâàDfŸ]ÒöyW¡¼Ò‚´Žóø¢òé—J¿i‡1ä4G•†¦o ¯r¨€ú‡]Ôvà±±²m¤)ÙîBv¼ùÅyÂ<²KüA¢ oÔ`ˆ ›ürà¬[tÓþ&yTÇ‚2¦yE@•@Hßì{uIÄ´ÈI‚^Á¶(ìÅ7á<­§ÄI.`ÂÁLßqÐ ê/’åIWy”Ø´&Ïà³½·ú@›wz£"þ%€Pë!1Õ®ÐÀ[ñ™äø÷ï¦éÏWš€m÷Åû #ì?P~¶Ž.õv ½·µó¹?‘„˜ ”Ì- K8¶‹zVòtkÏp:ôMyÕ;˜¼n†k¨RGNPý­zà]Q$QRE"Æ%Ú†Á h¬ÿ\´yHúgæmÕ;¼Ý¾%œÞ¤ý>ԙܰV˜0í³Ï¶pÎÍVO†ÈÍÎ&ú"¥ÂT ±]„z_((" PJYAl@ b€ õ´âIC" oL@U²i˜²£èÀ™ÙW''´V»Á#Â&eötÉá‡nmã4*ªîçÁÀ§4oÔ¥Qè‚tVùó¼³wðêõä°{tïíÚb(ï FéçÀG‘lÞ´$–+)mµ÷‡yMÀÛçpœûóë‡ôÙ½…Ö1ÈZ¢ T@˜TQ:`ãP‰•‘9œ#)Àø®r]£Ù—J¨ê›Ã¬Šâð*ÅŸvÏÚ㻕}¿ÉЭŸm¨íöûÒˆ‰—B g3ȳ¶ú¼oc}5p C=-ÿP–œÔX‹e;ˆ‘ö-|±›^aøÙù$ÿÎÌ´á,áäM-'aË\)zœ…ͬģ¥'EaÉB¸Ù já©èÃKFêüV™ô¨( )y™‹´Ó"t®PR1K0ÿ–Ey¦=„j¾ˆÜ$MYÜÆµõÎæ‚\+ˆ/8pµŽ•NI2 ²RRðl×㲨»1Gñ£ÑŽR-*ÒiÙ£kÑx&¦ìÒ0Òja:\­¡àüîÔ@°m ´ŒpLÇUAá…KDYQ€]yé‹[¬ìœ¡o¬tr%êïÑ–›‹ 5ï,Ú0#gJʺnpPôì‡Ø†ÔEêàX…ºéëe¤uM„áy(- ŠáD—žÃ\&°[\)vu·÷6~p¿"DUnÑ—[‚Ž•ÂtpU/)Æ}¤Žq)ÿÔ+r °†aTl¨×Ò 0óÛNçàKQ¨G1D%&ÓðÔ2õÐ:È΀Jr‘ÊïJ/Ø…ŒZ" 7Oàâ €úë'_ ÇÑ<úeâ’vû Ëïò[ÖUþ«uÐñ j(‡¿£ÁÃ¥*ug…€lWiݼ3<®ægþ À…xÀ§miž —ªÞ³i¢–Z' ïBËÀØ8 ¹ Vc îˆ_€'vœ w]K1õ²DwÈB[ö„ml;¢=oÛ oß{˜Ðo¤;©]ØOÀYø%ê¬Nb)‰Xü¶ƒmj_;-SO؇æ mÛÍQXªG®³kõ ® uBo±|<¶ÖœºZá)¥¹:çDùärŸ»Õ¾*àriǮŕ—Œ¬5ŒŒÀ4ŒØä¨4i©‰> (ÈâÇBò,ƒt^—ü†X_Íà H™v·Ðg}ŽÓ¦BsædY' Á4MáTÊ( 7 ’dqÎ{kiE(Z$Z ¨dëO7̨E9OhrwKvÕÜ’DjcŽ»D}7|7qçÚ{oFù4d_Ž˜XÏ‹…\ 8 "Ã¥«  ÷é¨Ðo¬I8-á‚„·uo,þÈ×|£þ½éa¥—lD@×$V÷LY^Ä’ õ…OrˆŸ™ØAeܾX+¼uêœærðj–`Šg-ÇæÄF…žg®#€ËÅÊý,Ƥòí¥øgüe" Tm¬I¹’Ê¥}Ç\\ŸÐÒ…ºŒÕjWŽ>7*3wüFª¯——ibž2Ȥœ"ÆÔ œq2¹8~!Œ-”CU†ÂqUh5€gqCíÅšÃåNš×¤vñt‰±œFy¬t g´˜+ˆÓëi b4*™•ÒŸ† aÌc°E¨±·LáÿP)¤i"vÊOÇd¡´ŠèÛd›q«4—]˜»‡¤%j¢¡l’»°¯ð”E¥qT›û&ÅN£ýÇ+@Îg ³)m*ùñTð:N Ä›¹ QˆSß» ’´€VÈÿÐ]o0•гÚó¢•>ý|å¸gêq¡sU†8yŽG¾ø°‘VÏ 0; Ôˆ¼®¼[Æ¢RÜjõ^RÑ”d+ŠÛ™Xˆx©bÆû´7¹^ÏKúÍfŽ2夋˜è^Ö¤3íÄ‘¨!F“ÐO…" &_þÕªp²Ñ÷â¦[†¦²èc²þòshH…SŽbÔÄóûuê!iXµ€)BŽyPƒ9`Glu¾UlñÖÎÛå¨×›µô&队—Z%{2p°zí%iÅÙ¾Ô«Jyï²8Í®­Z•²Lì<>oëVXž¤—öŠ­•›úÓ”…—üýjˆŠÿÚ¤Æ2ÖÀ<Θó‹³òìlJšš1dqˆê‚Ò5û KšN¯ìI’å!«ƒ•z”… &ƒm¬¶ØÏ8”‡1g­¦[0îÒÎf´m/Êœé‹3¶ª+r²uB(«ŠÎ &P6IÑ€Ã6gb¶áÀDB2•_Ç!A!ŠùV+éd¹ó’­)Ø×ävma‡,u´îœ‚|ü­bO.e}. ß [–µ.* Ðý‡ë¥°–Ä\h×–C_’\W4€ÖOà Â8Âq]°‹iÅ×;åXÖ ÆÀÝ£ Þ9Ȳ·ß¡6&ÞWîXSüÓïÞ­:uG½gU;Û(t ²~«´ýë»î2ÓWZ5šàÔJµÏ¸ÖÏíyš>ë¸úÙ>â‚ øþT!ϧˆÁ[t|>Ï™Aí/E˜˜Š!7`N A'm÷Oäc+j¨Œ!›ÎUk»ƒ¨ IDATÁZÀÕýM62=Añ0^ËUX{Ù2ÒÍÕ¢'©(‰\QLù…Ì+ôD¬áŸ·„Ê”¸lVc o¯¢ ër×ÒZ’| Î@ÏíZ"W’ÝB¼Xs†é  ¹¹¦ öÒ¼«« ª¨"­&3%ï„þŒ1 †H\Oˆ 97eI9dnÊgOìTž¶8ûÅ£`ÆŸº§’YZÕßzµ„¯¬™å(’‚Ê¢5qÅzËzT}rcøöV\aë­Yøwv5¢…‚@Ü¡¤…$ ´6¨Øá ôÓÝŸ–õKS¾–¥ø/7ÁÉ;dä«;z i®ž CÉѳ¡Ý¬t—U‡Õ¸ÊMŠ[{ >9X $²,VN©“`d©8è¢sø2Ài=˃1× tuî,ùîÇðXHÒÄ!´[ó©{r'“õXË©NÔ<õ×üâØJÑ€ÂQ´‡7Aõè.Vêú–©½öPÈMas¨Æ'Q‹7gù„”"ÎÅ ‘„ëáV_ ’u2ÐR"_º”µC¥ ¦¸vÍqëF‚Å~;ŨÀ?qœ,†1×Yá¼™!˜£à# =©/Êý(|û dªº)ì!’™ÞËsWÚ:ÊA§Ggo¹Ô,ôTú\{¾ËÇé®êžÍçÁæ) T!Lið,þCÆé šRÖˆÿ‡V>õNTsÆ”%EÏ‚P‡ù)É"¥pkåË:Ç—T®Øï}}|âÛu庘4—_‘0$“)_”¾ò>8“ær<šƒèíEh0v'Vu@°«³…¾Õ'§ºº ·¦-³ºšÁ=­róOvÁþ‡cåãRêz© mäÅþ*ZàȘ²Š~šòY qá#–$ÏêžrÖ¿›D#©STPåpp±Ë*€qнnàDª„F— De©wûgª´`·–„T»ZÉ@O‰¢°Î<ÿܾ þ 6"=Up ç¬îTIfvðD°òÜ,iÍ+ãZö†] XšâævSäŸ+˜E§7°/®vU™®ó_8³præuá¦:d´t’w‚îP{t3Ì8l#4ÌÖj\’^-jºùÞZQæÜ¤jšh þ¡N§Þƒ¼”gPW^$>È>5_T£‘Éz#ðò–÷$@“(žbX®~€Ù XrLÕϺ!=y«Ä?¸5 ÂéµLœ$ ÔúŠË–Xªm5kª•èì Ť5ž‚(mÒèb­ÆA§â´§º~%ƽàªÈí‚2G³/M—Êj*A¶¨hæ=‰JߘLaŽ”Ê¯€;®g{~]ù¬]çM|g×¹0@ªD4ìº!oRnAžëPB÷Ð IW!‘-å.W¹ÌÊ(¦fŸö@7D{­Xgº-Sõ\í§³¯æ <sbOæçļb¿òIAyžÏJa™0¬"´;Ƀ˜v+EWǦ+ÇÛ³Nœ¨w\ÙHÁJ ©ÕhtÉ íy+K$¸…†4#òëZÞûµe‹èÒççÐ_[õAÅw®Á…Ú¢òÜŽ2×2rN¶æGð `YT¸›Ý +Šân´bËõv¿¯/õv„öZìˆ@5e¡1ûIô*\µÙuü*Ô51`æÊV–Ò¥LÌ'ÆEv —½[d :»Ò™iIÙ†5P¡úS)ÈÜíZÃà°sî}ýQ°%à‹æã¢¥õA#&Õä Œ ÌPaà2S”nîéYígÛpUø@cO¦OŠSÍhüükÇn6Y™NUKM,ŒLYü -²’žŒu`5‚*¹øio©HL,ûã…þ<Íû¡-KÚËÌ e¥–ÊTÝÙ”øªi*£œÅÚ*¿Î?ËMž 1ðxãxØ"å_Ðj•€î‹¦¯ËX=´ì¸áð×1•È¥æ÷qL†Æ2±À`‹ÄÇ(ØØ†+ÕÁ‹¿ÖâË<':4É ‰±S†hßÜ¡SqaE5±Ú¹ž‹•!07½ÓË`/ir¸¥ø¡†Ö³ Qq‰¼ÙÁ]½Ÿ;%‹Ô¶î'f Å#Í_Ø ¾1å i!ü$º¨ÓsëÓNHµ V£.h#ÚÉ8ësä$¤2–E|Iãø£*‰Ã XˆI£Ái„fµü<!&RêÅÜŸ0ñ¶Í7æ) öyãð*]`õ··ebÚjIç¡0:£ZÔf¹Ù!š Jû¼ˆÓ´ø@;áx_„bˆ[©ùÇ¥áI6ôHÁZ®|QzšÖŠƒ®­ß4S,M¹,ò¹ɳ†ˆ'€çCåŽ'‘„w¶Û~<ÎŽ+Éì˜>ãm£§–¾ï~ßÜœ´$€%¦E%lð–}ª:!å"˜±Kx°aˆ…‡¦ã[éÎ<£-8É:» §»‹5…âìï–„®ñðr(N&P6¥GUMh¢3›·me3…žãL¥ÊìÀÚx%ý±(¸~·õN+|a cîאַ Æé$K÷ sH’eþvÀ/¸«\‡¶ î¦ù ŽiB‡Š±Ž*™ûjI—ën‚Šn…J相P WPqù0\ý7tpŽÕL½¥Á–¶m›‚$´µi° †ŒZ2²%›ò ä•x=ÖÝœÚ>-ÍsÝ´;43ØÀXØÓuì+P@î¯cv3ÆÑb•¥‘¯ºT°¢žrï N\Ñ×ÑÏÃCÞ§øÅñøægEÊ[àZ‚îÎóãõ3Ú“7¿V©CÀkÄá%«4°³:Þ ÖK¦iZ!JÉ•óú~Eû¹’iÊ>d>­.,S-B'~i•êhÙYŠÃ¿>¹ 6¾pö”I¡nn‚ó< ‹ÿü ?<Ñúd€GnUØ!ž3ñ¸=/Bú<“¿\Z±ŠJH>!-°~­–.Ÿ@¯[~Dk ¼ŠM—âÕŒû=¬%ù@ŠŠ´Ù•×E^æšbߌU•-ÔÚ:䕆&´Ú-ç iYt(«óæÊC<Aq5e?\3ŒÀG áC„óCl–fÒŒf|‘ë°˜Yí<•¹&?ùÖ®URêñW§C®J–Ê%ÍïœÆM¿}:v‡ä8®À‡ãXqë5f8}Œ©#ŠÅ Õ¥Èetíi¾‹P®£-îÙ©8©nÂpü^I3ùºÔ9ÇG;+Ÿ™/à ì)ßÏHJý¼uŽ@‹Á[ø0-A.Ü+7” Ù-W¸jö 3S^[ù™ÊUy¬…ûˆ™#³ýÔ—Ü|òM0¿ÝKç¶ð™È\ê?x×u Ü `BNô‡H0Tàµí'+‡¬ÜÏê/¤M†8­±‘œTe:ߊ•ÌÝÍ>À{Wó=hŽ•Œßÿ€¿-’ѧÈj±iøÖ»]+fc‚•'ÒxYgÂ¥scãkw¼Y9í¬´ã¶P[•wC+dèõÔ„ ~cJøÂ­¤GE¥lSªú¬ò@\;¹ƒýb öo°{•¤Ú¾‚Œ;EQ\fó!.g]Éã¶®:Ý Uâ?î€@U0®êOÕ¥G«e`$XæbŒݘ¶÷Òb³9×slŠtH¸° WuÚû¨@€ BÀ§VP4ÃZö)H;hÒ²þe²Eª›â¡„`Q°C¢16žü®É0íÿŽý lN4Ÿt÷âjÛ\Ù€WæÖΞN×|“«`ž²AçÞâsP)ʰ ƒ úœóµcSP½'mJ³g7·ŠøÄ”ùjÚu2MwÃU ­ÜoiP*E@2&i*ØÀñWu V¤ddg¾þØ~KopŽÍe/)øå}s3tÂÏý$à%SioC|Ã0ÌoœT^±YT#·lëT,l[W™ÚQ2@gòvÝíg71b‡Ýœza jÕIÎ$¬tʧiϵvä’Ï)ôfGs‰óñÖ2läÿ2® zH\œh?sé\ôºp£lÎ^ß*–äÅjqT~.´h®?åƒ2|Wî•vñèª%M»(Õxl´TägCKÑ2òö™8¦Ûý¥šW—¿»ëBdoµq˜¸õŠÊ8Ú_È =€6Xa =#©Í7Ÿ¦ÿ²‰·íÛ’‹BB"ô›iõ“­“xBlÝåJ˜¤“Pa›$ºbáŽÙØDz#ç•!=¬ oScÀ>NïêA(ƒ :4„]¦°sìŒg*˜FJ¼!'\¸#e©…æÑPpWš¤,ðøŽ'Ê!-”»erÌY¢‡|ßy~áú“Íz؇‡l­ð*›aeBò€OŽ3=·WóœÛ…×f˵¹; ã’Ë_Ögÿ¦iÞt"V3 ¾0U§ó^¿rtõ,ºÔw0ÅþI¢d›•B̵À–jÅWa\nYœPW9;·Ä'­ÚŽ4¦}Q®¹…·%Ë ÈR·E-…\û×wËù[a—ÛU:Œ;³+š;UýüvÃvÙÚ_n4îÙnÜGC­—k­à ì÷Òiøs=?Eñ&ÌaOàø“áÆi²ÌW{™ û”³qDZƒ#Zi’õ… Ñ–°€ 0ÓýÛî^šøÍwâ'§,Ðz¥mñˆÚUíýç59dák’ëbC])Kë £ÛÖÀÀ¤®³8ãñn®Íâ£%}sRbèÞâYž'¨Yt™þC™®9òì`L ¡Œ'€«ÀP\¸Ô¨$ÆXΗ}+ Ø!6ÔþH5ÒªÀ 8?VÓÓ¸Fj «e>jkèw–N39~sv¸é¡4@—¨¶®ª¶p¾¸`*Éu ˜hŽ}!®VõD„4 §°IÜé•OÛñDC‚yêOTÄÌ9Ëd2=¤+ G°‹¡íç4ÒUéÓô'[§4‘4ÐìHÎ`Y5ûpL,%-òó*«Ž¢Ì ¥IÊŽºZåÔˤP‘…õÜP +9Q©¦ÉD0±›EM®©—$¨8kNO!Ï%iNFB}ÅtG¹õë{‹•ÎE ÖbbÊ]Ñ¥¬ Q sÆGŒßH26W¶ ƒŸ%H":ÚtÈNºq¬=[÷›ÆïyAqr©÷¥é|tÞÝù´ÖÕ{«®Z“:gyîNEëüµª¯ç&CÙ2§xi¯ “õ¡ã¯ò&áÚZåF'Ñ»ô°ê¾TŶrE fp4ïWnWBÕŠUycmúG*Xß2mG·HÝ0´&! ,¿![Ü61_´Œ\#¿~ÙÁ"™ª'aKÚÇ¢qWµÈ7ÿ^ÁWqÐ\·d {£ø,‚N‹oðuª¶-%·-N™}”ŠÖ­Iù¾]ƒAœ)âÙã¬÷r·;õÑÖ ÚwÚG»Ï°ýÅ(f^ å§)°'Gk%{ÀSz‘xröhÎC´‰Bc.I”¨+ ”ë–)‹âÞm#õ]©¢E É^ëâÍ•C¨0Œò²ð¨4Hƒf´‚©Ä-.ÞHœ±‚Ö·˜õövÂû¥Q¿lXž™HS d‚ùu*šº¨eZ·)ßdm!šÆ†&±±/òŽòO¥yn]wn0Eš>å¦ZO§­ÀDy.¬ôzÃ>JÒ4²HvÃõ,£¨I”‚®ï<±ÃØd4}zSF•—#L'³‡ ›8l¢–kIrä¬ÇT™Ò뀛 ÕA}(ÿT‡1ÇGFQ§” ±ÚZ9"H´Ãl‡©†6yì[}¤O7@`*HÀªW( GplâÉLdÃÂe×s%Ó´U%.jŽ»Çµ;Åæ*šLŠB o<§À;¦µ‹g+{@U óÀXÜŽžÀ?6 x$‰ç¬-Ý<2xê+0!±Å u µ†_ß›Á¿]²ox•Áòú¬qU#œÜv,׌ÌíÈîULKa§‘ho¬wègkÿÚn|5Ú/ÿýá=¹UÜ6é±AsS¨êihׂ‹2„û‡M¿]%ÿ$M¸yu.aN ‚YWW«WÏã€yûG¼&4äFmcnÙg½úGm2Àä‹óãç'ßeä™ê¸t¯÷¹ƒ‰ÓÈÊïÞ|¤¦—´Òo'ˆ¾Ì&:,}17e/5•#Iy£JÃhÐ4g¾rY½¨ÈÏÆf!eTš«ß˜™w :{M>0Žks´Åp“&çd Ûd:aìw˜‚ójnÂU$ºÌ3Èb¬54ÇËðKöžg…¯Zù jp™&_gBÇTæÔÀ"p]ˆPþpnè&¹^‚öÿ› ²ÔÊ2tÃŽâô»9´èV À^=e$‹˜æð‹„=5Œ}®ª®**¥`È|Ëk9ò`!€+ÍDŽÀ÷qÇ|ùäâÀõ](è6 Ħ‡àª’ã’Ó_×:שÅ3 MèöúÖíýð5ô¯»îÌöwï³3©´·bÃ.ñGÃnœÌó\»ùfÅÊk ܪ0¦Ù=*OÍñœ·½? S^Áú¤Q|.ïµi pJ$ÅWÍÛª+YßL¶Ø÷¤FQ¦:®* Ii+HK_=8ý’ýÇâ×(ü[†/%ƒ’&xòkÀïÌ2z'¬ qéR8‡1 Ù(–wë+[žÕ L%º¦Ié^ PóPÜÍPâ)F¤d8Ð5OŠ•ªœˆò­Ò¶v|€ÐF ì—]^l'Xp»×fÄ0J&ðü ßSÐ&`̶‘ãl·5L½ÒàG0$|¹Àl» ¬ "Ý긩Z3K„%6µUP=‰P³¨Eu0úvé°¦$›o‹¯è©7+Ùn†~µí/wnÅOgpdnbצctü®3~‰íºÆÆÃ¥Ù¹Ã†:”qƉ´¸ÂãC™|”U!˸j¢`­ÀÂ(‰ )Æêž –’:¥UËnÜ¢ò~÷ºL^ööG¿}x¾¸ïòã+6 È—‡ü¦MýìE~ô3·– &hP¹. •“ûoêØn޾yŒÆS…yÕ/»ÔØ£¡ ‰èÃÛšh«ÊOhæ5o’ ŒŽ“1©ÿŸS«æ¥ÁÕ%Î Çš=Šõò4°0T?sqj¿Œ{]"!Ðì{Þ$sPcx—‹[¦ÿþÀß5å¡p Ž9"ÿ”NòÝ \µŒßÏ)Tþíf­ˆÌ$à£déŠÆ>Px\¾Ç|]X%HJ›ÒlNwxh/*&ïUuÏl4˜Dº'DK']f“–Ȩ»úžÅÚŒ\ >0Ÿ¸ØÆ4ŒK|Ä€ ë©(”FÀé¾Þʪ©E™™­u£Ýj€  ·åˆ• IDAT»SzU )â–BšÆ:ãôU†pÂèwë™ù‰ëH]È3Fe(F3à‡•¨²ÎrUšÂYW.@fŒõ¸°íigSò=~ o¡XÖ7kv˜ÔW*œ Ù67ë£%«c:QNÍö’‘¡¤¿ÕÂÁ‹¢6Ö¢>EPí»×[V¹Gå¨Jö¸àTJÖÊçBÿ¡ç6W Î=„/Å3¡!™~“”EUg"YSyÔr¹z¸öš€>_xk8µjvçµÕµ…AÝÞŒHņåß+;ïÛˆÎÁ®*H Z¦ôvqŸPJ>§Ç\‹µ…˜ê-»1,RÆ&u”î[Âb!=Ã+}_ÃMa8ªq×*ûj¹¬´ØŠ.¸]šÌ„“e½ñ3€¸/)OލsN5m·ÕvXè`Æ>{áU+1ß´Î:ûŸR NÀ?å* pšÖ”¾ :þQü ½7ƒÜÓírº?êæ¡V!¹&;šRzª{* `꯫—j®˜˜¤ºn¥æ³dÛæ3U·™‹fm¹’wŒ—ã—hÉzɶ’SW‡GóÂPâ†ÌAOÌÀ3NÓˆbÊæ»0À2ê@izÉ–’µÈÇi9`“–Æc|ŒØƒ½7ÁnY¿~‚î“\%WÇЄYÉF®Šð¶ËmÝèPQ˜@Eœ/6u?MðQA½]E~´b‡·$hkɽÉÖËê½ht˜®‹Ò΋}ñ–Iy‰9(Ao°ÚlÕÍL½™2û©(O½q7?M†ye“HUÎÄ?ïªØØMÇ®eœ¤*.„ÄâaèžZöÔ Û=ì)f»×EpÉÔQÏÓx Gå …è)p"íîcvNð —ÛZE°5Mv8Z`!„Ò Ê½ Éö„Š3·§ÞQr^oç«UCS¿‹ëœE¢›,Îe€1jM(€ µÂb'6é+IÙß°¡Gi¨»`¬rInºÔ`TöÁeÕ&—oSà<š ø*«ãíúÌñý~þÞŸ~øW_¢¸k±gYˆõDÕ1gÛ—ó~ö7·¯jü&UT.Ãp|ŸG¦–UÁD®…î®$gØ“?o`ÆVÚýTb!õ†9Ø[1šævï ZM“»MàòS !éeú ?rËqys]€rÜ`ØÙÿ§8  µ\HbÔ«—ÖÍíŽã„c™™ÓŽ«¥ëgÖKÖH‡VÞ\•‰Óë^¶DyHpH»Vu+¸øgüÙ'*μ7­×EZÞö´xà õ䬟#¶TH3üð[ÀUM9´8!O-Å?såë³Ï‘=à`°óW¬fÔ®ÔkfèK†ŽL·¹€üR]YÎDùüy·0&Hw‹ž1°‹³»@!zîßQ!`j©((x;ë:¸Â6Ꞔ¬fy'³V´"_PorW+zÃËo?Ÿu^–>íb/][ ·â#wî^ý#îãÌßê†}Bï{‚"ÿŠë—Y,ßâ`«|±XšAÆ~ŸûöÕ¿·•ùË>ýû×Û;÷Û'zþ›¾Qü$W7Ø}‚;µB«Š’CDâ/VÙ®X‘¦âx5bò¤&ì©LEäN¦µ4 æÈÏÁ#""áýv¿-ùÉ{b°0‚Õ¶{ ¿‹÷ ƒN“¡œËa‹ñ-&;ø¡Êæ“C—»vŒ«Ñ 3Ý|iA¿Tl\2/ûuâåòÕŽäO P5ˆ&óÆa&]ÕY(¸V§žšw,Bßø–­vC•k7v0˜¸&ÈS.ñ“¦'8÷(fæ7m}Í+ÊWñ3׾̷‹Ñ{Ï‚àû;â;⃠ӹsâà\}˜£éO¯(‹Ðá_š6¾¿ìÚ uë6ðüT9û|,³‡6r™‹ôA±Ô’½U²?¯’Äáì­oéÀ Ùj(ð.NªïDO½>™ShÇ£T<;¼ÒdÞ©¶½w„·Õ>#p.ÔÞØët)è¹{±YÅL(Ho1Ò 5 ØpÌä>OU6/"ù,ÃÞ®Ï|¿_ñéß?ëÚŸþýøúR”Dÿ“XÕ‘;²(¾­}4 á²Õ¤kª[7;3mg;måQ<"«—ÛÀè™L#¡Ë5zµøæCµ³LÇíj+\‘¦I{[f{"²·R!YÝŸôŸXÛ&ƒðÂØìì ‹n]ä•ñv:À£WIvf ¸ÚÕ‚í2=0¥h@s…ó»ùƒ‰ÔÔ‰Q¨òXWÚÏ! q_c´÷†J_Ç/:jŸ”Ëp$P7¡\ä)¦Ôæ´¼}ÝI11‚‘ !yKG¬Gì‰1±6|Q­Ï…Ÿ2Ýœ`_Ý@×ÖRü2´@5[Éí D=Õ±ûÍW;{Áǹ°BVhr¥_IRÚ7ßÌ×7#Ÿ¯Û]mCÎ礰–Ä›šÝáÈ`e«Pr|‹óp/e 5˜\â*YÚä€[|-çÙ†FíÅO;–©>Æ9‹./ï3ç[놔[Qâönöh0œ¸éäHÓÙP9øBj·‡üÿÌôûõ÷€|ÅKôǰ€Êvvêï·üSéóO†@þ/êo›$÷b€™e%þ당Å5S#åTÇhe'ÊÆj¢.½ùتÝé¬Õ Ú‘iå¿`/¸ì (£P—ªöáx ÌÌ–ÊR †Èù •¸0öIv¼IÊ…¸“„á¼@‡ªƒ5+ÃZ°Ù…ö8EÖ–=y·¶ßó÷˜þÛÕád½ñ]RöÿHøçê î£Ä@A3nåâF;zD¯é¶XUœÑbÍh¬¤ŸuCª\„¹;<È€¬á×dVÁ…p ÇÇÀãs«X…œy>pBøN…<5¸z¨-ÿDŸ¥mV¶vž”V‚"ç¡HG¥Y1RÙÅ77µ“\ŠtcÜr6+Ç3dU.Û@•ñilm9õ9â?ÿŒ‚’Oh¯ˆ6«j/¸µ³!Ijæ²þk±ÓC-šTöªóxé_éœkŽÓB16žøÇÀ·'lÁ‡:Hÿüõå~NÊÉæ¸CÅêý’ô‘4Ta¿¨¥Á­KpýP«éêPšœq4g7 Õ=´…^{ΊÆÎÏQ ?¹¶¹½QLqº6à-)BÖŸ8WC“:ÆÆ™¨d`0¥åç—¨Má='xnS-u-]¾ž†N…çùåç_ðI߆ƄÎÄ]Êg:x· ¾4—}×V5ËÕÉ Ô‹¸Åoð»ËEûêß_¸¾´ä|þu󄇿ï왩·ÞÄÿàâjiîõ &ÿ "À—80˜~¿/¥¨>£Z5…¤vŸð zÁŒ»Ï3ÙfŽu˜éðK?d`¹TŒÌ˜Ô’7'…ø¤$$6AÏÐiºñ™bµ8%v.·%­uèNHBÃ(5òÄã{ZмqCÙ^ùvcq0Vjj çvõ‚1ù®©â%yoð_këv"ýz£˜b(ŸÝõ–Ÿó%üÎõ&þ¢ÅÛäëÐþÈ~]œ±ðÖ“¹99HBxèçg`% ¥Åeɰ ¦PïÜ|«dvE­Äc¯°?†r8++$6·Ýì„Púò-­à|è´åƒ[},~ûP™5%8¿|ËâUg´Íñ/ìulÂ[ë»Å‚‹OmçÁMÐú­,‰kAoHC»¾{?ÕÌ ¤1:ÁqoÆaÆ;Z?l¹äM¨¿.ô;6œÊewÉooA‡ÞÁ+E^»lîI‘eëLjÖ¬Ùa­™#Ù'Ý}‰Êæ¨ÍÍí+¶ì³·ûÿðú!ßýg\?-W~º¿zHçìý¯_‚£Ï_Ä}a¿Íÿôçoÿ,°2i6tÊŠÚóè•¡cqÓ˜8 &æ:4ŽQ P6鳟v§üZÒž_1£673¶ˆ2d=™J_½Å)4Fç£Æ©¹ÊWÇI‚à5&kÿooç¤Ñv”rb’¡l›ÍVYZ“iödD¼(>«³íΛݦ¯˜’¢GåðƒÈru¶îßýj©»Á'zÝcP%v(SRnßq*ÈŒ–ÓIÅEØ7ãØû|ËM~ã ì¯\ozFû°ÆYó ïkøžýÅuÑ…غï¯ûãÔå]o_ìÇ©ÿàD-ésšÝA÷/Ò“úuÈ‘ŠcÜ_]™¥1ï1ïu'‘lBy˜BÙ "®­)¯z-<¶Ãñõ^¾“Û ›v&-Cgð°Žn¡jßÊñ`e¨ˆ1* û„El¨²“š¾2ëËía~âg\¦<>`ʾs•ü¨àu×I`tÞ†p<6"ðzbÔBݬ TØÆr\Pß‹¼ŒÑéœaUóaŒ6Ü“êÅOiï¶E訴•°-žŸ|6?J.FU¥Ý»ì*5ÛÊj3k­2¶ªJxÔÆ×jòQ~¦‘Ñ»Èw¤OÛKΙc™zfrvÙÿj-Äšo=äÄÖGwUÅ;O‰ÊÆö¶ ”n2<;â2ÙÂOï!sí„iîTˆ»RÂκNmt˽ÜUf|õ’yíÑyôß½z(˹¤r­PY‚÷)Ý/ÉŒ·?ÕŠîÏ_ÚŸ~ø4÷B—f1ûyÿŒÌùrðp½ âdý‹?+ÙþúõùȾˆ­ÛßȬŒN8p̉!0¼Ò«™S»ä¥+>`„t 2 ÉÍÛ‚¸jpÇL>?#Æj{+m¸µH;‹³P”!p„“WÔl¢Û~Ĥ=lÕÊ/ÞHi`dÙ3u‘z³ÐžµÒÀ4÷ixØX†=à“eHF¢Ú3@å–úOL˜c_TP®˜xäÜ›$³¥Ïõ~Êö::Å›üO@-“z7L†[s·t!ÉïìIÄWdV›p½—1Îú÷øPÏ3½ÂŠÅÿ`ä\¸¾’^@KßW 諭‹’I vc-ád”Ù=ƒ±uClÈj½Š÷Jh²³ßˆ$3È/¸vÔ5}WþW4P™¥†sÍ·þ ûÉ<€ê)¦ºÓ“øH}óþêïÝ9Š6.ƨPx¢Úò´ÿžg´˜ãêKšçÓ5@¢*úîÂŒvblNmýøBíõ¼à‹Ü?2æ—éÿ~æòJü@Ý¢êþ´·°¥ý—^øw®/Iàh~ Œ@3nt–ѧެN“¤èŠS€±Â3ãBÍ-’žJRéV©FN¡Ê ¥“ÜÊt,(Yä–©S‡ ª:œíc£•Lv)uÇ«±vj b5Â3L&ž{=& ùp\ÃXÉnY[[½tÓó#É>‹e3È´¹c_À7ì_Y–Š Ç`tÕ_oO‘(ý¨ ¢ƒ² ß¡¯ÉJwì W¯8È«õdÿ<¢äBé»wbà¨Vq[½ýÓœÁíäŒ@AÖQ¹!¢€-ÙÈtSS+bÒ›*„?o.—Æ~ÿׂÞjqL‚“Ë¡°¨ ¶`vÿbuQV-ÙÚ‚¥ú®¿É÷;crâÊIµ€“s„P${ˆj%)‹*R?Û`óáÊ]ðJÕ 0.VäªKsrYÇÒ5²õMq;/Y!’Oƒñ‚¬tT-¿k‰ŠþêŸü{ìYì{&‹w:ñ~:ŠsåŸ¥Þø_ n4"ûÌR ;I<é€úUV_ÊPƒt b¿‰e É9‹„–Œ´à«»Ý8bõÔ¯ÿÄ¢U]ðçáuf™ÕÅöÔIÅR×êÉ.ìÆ ÁGBÃ(sSäOpC<à/Ø¢‚æ“/m®ÌPeirZW¨¤€¸+Ì$ë5E…ÌÀ§}ÈóO^›ÒÕD‹†Ã¤ê‰ÿÚ4\çvSÚÇ%çåâ§T0ª® :îG+‘Ÿ#™o‘‘÷áþ³ ÉIΆšþLõB`^'š>7îøi›NÙÙϻڹÝ:ØeI?‡4éF¹ò±ÙæRDk,_þ™kr—o*Ú§]ø\¹­ü·TTNB%‹v+̓ÎÃLñËþhÉP,â´q)´™˜#o|êΔà 3QÀP±ë͸ƬY¡“ìj®ô„§ÍúÄ7ìKÒ3cç“ïd´ÃÆÂ?¤l*"Û°774>Ëx|bÍšcbˆâJ¥ õ¯lÕéós@J¯Ú?~c‰‡ý_£)ô«5S" Ô:2’Bw²ëá€Ç9 FÄOTíÌÿ¢]!=®AžîÒX &È:ê”ìÒÚ·Vµ¨8ÀâÍv q{KYÛ¬Ê5ñ¶;»§‚ m`OÌÆ‚-¦ ñ½Æš›À½¶Dt½ÒBƒ¾zâŸGivÙ_Ÿ±‹KZvÀš«JܰZ«+-Á1€­X.ï’‡ÀA£†Xˆ°a®²ÊWK­Í謟É~{4‡ÐêÒ¦q3¹ðO%q6.Ñ®–"72Ùk±Ó7pW¬ncÈà ±Ÿ|ùàr'Ü«< då¬r¡7µQÈÈí1æ×í‹­“ƒ”é5þ¶^gG²ÍÁ{…Ù“¿ûѤøY’Umj,ámpÈ_PÏçë_Èñ?¿I¶”]å7ü†J€SÐÂ7+§ºjcÒL £Óµ°õÉ.f֡̾™uAþØÜŸx>2œnÓZOÄ~6Æq±–óï´.`¼Ø‹‘~`ýƲàþÏ]€a]À¯˜ÿð â Æ‚%Á•åñå:¼mâÛÑ*ÛxO2²¤Iž²*iO ¡¿#G hâÁw¥zÊã•­ä,:ðîã±ý&ñÅßþ€prŒñOyo§š… ð–Ÿì„œâ@.šæ Û—Îøuˆ°2³r¹£t\'Úã€úš™ûYõê‹©+ä!5½°þk]䀠ªvykCÛ¡Ìv–°n¹œ„˜;×dÎ6ùÒKSðG;ô²u8ˆ‰½n¤÷SE[k?Œ,4árÙã:Á¤ïS…­P“põ¶=}¹~Eå¤ýoPê°··k× ×g»ómX†9ðÀõ wáAˆôãà/VáoÅÙKó8Ò¾ÅÛy#5«R¾ø÷ãÚo¿Ì³q¹¼”¯š8餶Õ›n±1€µàßàW £¼‡Ìk,/õ§ƒ«jázˆ`Xޱ€ #0µif,Ê»³€g`M\/Ì…°/ìÜX–*»û /Æ·à¦ÑA—)ñë¥áý‚ø+`{ÿÿ€‡&l3B£ C}¥9¸!Ó}¢†ZC,Öq«ç°ªJF6OZ® š,?œŽbHgªÚΟþm$jcbâ7‹SÓ*n²á÷/Qßã‹UŽi+>ëË1.ÄÈÁ]í'YgbH!¨ÿÚe±±×Áé=õÌð'‹rÿ‰ëM  Œ°1’Âö=ˆ• L¶2‰†v«ÌX4h;gc­U¬,p@m#ëÆ$b5t=~W- ¸w0½«¡JºÚç}švßZ‡­ó±w"wMTÕÆÛRX;ãø¢qž‰ IDAT¿Íâÿð*ÅzƒFs(ï §:-æ:—Ø #hÏ û;bÂ/¬_ðpÖ®Úñ¬ |p/ `›˜ œè;½»Y¡7÷ÔZÚËÓñªÄQ‡IË.»[lwìbGRßx½0¾Sª±ë/ؤŽñ$=¦zÊ+%Ù…±á kYùüÂüþÄ4gûwø?€ù7×ä‡Lò3&€Jên åÒÉŽù(Çp* %EBm,AÑœÊ+×0o×ψV¢Ña·bÒA£s~Å‹7iHQ@û'èªÜŠh²‡“‹¨à|,ŒïÀð_ŠKŒæ€QºSh´Ø „$–^r´„’‚šøÇå´{…M1£ŒâÛÒ3¶Ädbб™­™ÚÛ±ùmn„µ1œPCò«VeÉp¶P>èJÙ9ó©*O¨%MÚ¸(Eüu—C¿ÅÛï2„Ñê”Uç™X}ëQ[q@Ñ)óˆÜc@È]Q øQÖ:At˜ O<Ø^Žö¢¡’Ù¹ÚÝè¦$-·‹wã$¯‘Å0={¥;“ÙI¤·XÇ»[¹]÷‰øár~~+þ˯Ý,Å)ž7Ï•Kn%74iÊ\ƨó-ÔEdTá*~.Œ<º/Ù7´kÞ¼D!pã`À+Ë‹€t =¹Ãž´äîäû†ç óƒ~0¼ 0Œ*'°11þþØ?ÐÚ)ƒ8t… Ö\pÚì³Á$Žùï2M®,³ü”pÄ‚¿XÍ Öú¡)Ån’à8ï]Ý Yù˜jFŸ%õS^Lâ@ÈäR*ldЈ>Š~ÞòèxàÃá/:6„5#ËO:6˜¿yRÞü ?§Ü ЖJ­´£$*ÆA Yºðo2>×*måTä{H‚vшTñ “†¾‚ê·%±—2²$Êö1ÅLÒ@üùM(沬}ªkìÉ‘›ã• èlq®Ir†#.æº.ƒkÖ¹).{c2®$Ðúd× ŸMÛÝjÑ>ue¸…˜lÆçôæí¡ºH®¯G…ÔÐÞk•APY0­¶È[œ¸Ö\rU›56œÛ'‡» ´$Íp\ŠçËoåÓØ‚ØÕǾë+Ÿ–ɬýµ€DI¯/ï»K¼à*¤"C36÷ˆÀåñCGbÃÔØ'ºü<° û)'Ê¢jðx߀ʱ”V”¿:0?M(ýW™ïÓÐä78°ðêÍ+&k ±ñ¸ð!r2©™2CXS#áC%¢–„YzB^"ç8xþ'ëê,‡?¸¤y°ófpQžßæIdq™‰<ÞÈ£~Ù7ÎÕvÈ­­ÅX.`ÏétØÆ4<6¦³ür8®©Óg˜Y4m8C3ÇÄ÷!è½àâÙèµ¹©–ùÖpx• j©æÜ¨øJüè0@®eé!ž sYíb ÕvµÏ™]P6Ÿ¹¤äíîÉ%-k°±€ćÒ焆ò3oàLËE$—šU¬œ‘i¦´!-# 9Y€òÚpà•û•õYSçž\³šuÚ÷.ÅÙbC/¥XÀc²4Þσ³/HîÈþhgô^KUß­´:1tîuåø•™ED°K.äÁyæÛaèÊ"/ÉçD"4M4ñÓ™²Wí*Ê´Aèþpùïþúßíê «k£ù¬@äUi÷¹ÿåøØx>€‡c/YW“LK¾.†Ù8ðr|˜|û3€ÿü&ƒ¾„tÂü90‚‰d„ð€,þÁƒ:ÕÇÊ·~Ã~q0àÁVèÞëü)£•hpµ‰Nñfb…É1xUèM6za]¸+sy&F•mX¶±ÿ,€6Èn.Åóz°7ÝÀ“>€|ìøØª ’||Â^xý†oOB¶]ie@lŒHžXHmÒA]í´¶  $ý~Y˜kÀÒ˜sy{dž1‚ˆf_à üøˆ…|â2¬xÀ'?Ì%rG<€Ç‰ë8c8[„¯¯ÊÌ]ñE;dæÆÊª;ÒäŠ+}\ø%ð]øt>~Å·ÉÉ@»V}ß±‰S^Ž,HiÀsá?€‡áÙnîo°ã³r`¿óÛ¹nY/wØ8Ô…NMõÁDE¨HîœÃ[’Ên§²ËaQä[‚[Á18ä3Ê×+uØAÂ.)®€MÌ÷#;„N°ÏHkí%tÒæU0[úÙëñg4€ß¿nYWñÃý9 Õoè}oë [¿ùQ}ëg˜ðO1ê®@਄¡ú=ÿã9f:ïæÁÛ×:6ŸŠ¾g|‚òÇ“¶’mÅôíöÀþsåµ’›KŠðÆA5‚቞|bÆqý¥>á0ø +­.AV›¾Ü™¥n'™éëÃCý¼{p Ì.ÖÙ'3~Í øüšVÇËq%ÔǼžœ«Jn˜¿0{àRœÛæÄ·™øÔßàÙú#é Ø… ì,mòÂ|0b'm™)JüPôß${šv$q"ñ¦vž5£°áf?©×Pe± {à #ðçäö‘Ð6<ýCª´˜ªóe˜/Jš\mZÄž`âÄIŽM¹û‡‡ðË¿‰K*l°AÜ©†•ÁèþéÕu«ó7ÃûÇlM ³®ç3@ '<‰™nבO¥¾²2D)*d•*K…eOÙ,¼ºµUö’(à ÿ `ZËøã»¾¸ÞŒ$}+>{ŠþEœ¸´³ÿðú¼ ·\¥á¢ü]—Ì4]^•ÚÄ  »áË/ôð¯²å%ŒÀ Ìø]jwNŸšA¶F¥¤< fØe‰Î³—Ä}a-Ýé3Xöxþ|ȶžP<€øXø–Éì s4¶@,V¯Le?¬XÛ’+ò’ X~ˆx öå »,ŠOŒÀ+« üCã)ǘc¿†ýä7Î:¬r{J4žÝùÃëí„6xN›Ë6kÀÆ4\†¸Y¼sOŽjQ‰‘v¡_{bC‰EÎ6a)MW¢~Ç2`2/‰rtªd[Õü9N]óiŸÔ_ºÞ Gz雡;7ôªÜˆF,i“]µ›Êë@£H xIÊ¡I‚1`„¾•î[%Ð|À&®M*T #c®8r¨³áa´Ô­fìr¨`óŸmó{×?‹qÖþfÆ¿+`þú¥U~?JÿSDAÜ~ˆ2PæåOÓ!çt±õÄ4º.Q™CÁdj²qɈYjìÏ_\ZS±`§Ê×Orr4œ˜+²³úk‡X$;á©yHÞ? /Çý€¯ÆAâ…|¤3bJÎ10ƒ™¨yŸŽ9`ƒ!m¹˜ßsH8Õ™_ÌeåÙ F@¦)É÷I²r‚i™„árZP“)Ì'°_˜ÀÓ„ÔÜrñwÆ¿¶È„rö÷KØdîèÍ„z«–Î%ΑZ¶Üà*²„ݨÎ.À —ããÅR ¿:~KI¿ûUaâÀuÁrGd“© -Ö 7kßüé§¿xÝìqr¹*ª5¦XZyŠ}¸¶Ì‘UdZµàJúu)éPjm_½”ÍãX|QïL¾…W±ŸZ[.(ŽÃ¡Üº=±·r˜7ìú' €úõ“ìþs A]–ºø ›¿sݰ7€Ò9iªŒÑâÛUîë*]WÁ>˜qÓ:ÅîÓ|"£þêù2ÜÖ)ÑÕ° ¼Ó:À±Üßò+Í€]0£q6kELùÍvÀ_ X¬#±ö ±ˆ ó­sàœx;¬'ÏF ’ i*ûɵBžÆŒ%¿°+4ØBü†ÀãàzVÍÒj`¢ÀpÕp±ÂUÎhë©ö«—³7€Jž×j0‹Å1ÿLí¿¯î8­&ÊR§d¨“‡\q½¥DJ³ ‡ê9á#=X*pìs’®ÑeH[Û0¬Ff×x£fytM?ç¨'•¸ýÃùþÌÕ¼åGAÈk‹"««^ä ~Å ¾Otiéh—OÛýÌÍ5dȬ·§IíuÁÏ­Irø®ÂÔ‰ž#{8™Yõ墙Ø?Søç^j»èktÿ§ÍGÿåLë¥æ÷·+7}W“k×ýÚ1‚ë4ËŽãk:uZO¾MT9¸‚>ÀJ½Üê§fŸb1þYºÐ :æû^áêóóê¹{K¶£lSµdŽóä‡HèYH.s¼Šž;äJ½ø._x1¸é”K`%Ž× &ê̸Ҷc¥·y2Môʰ¢b—ù„`›>gWx~\*C_ ûdzó¶a~; f󨉇BÑ/ͺ¨¾$´k1 0¹sÀv)³»Õ73sõe9¬¬ î˜CkߘÆÖÜ>±_ˆk©nåÄpàõÿbüöÆÓ©Rð@8ûs¾ÙÏK:r‰¦k>ƒÂ?OÁ_~ƒ´ÚM=¡’RkÙ¡#™Î€4ÑQÙÑ×±aiÙO™'ኦÆÈ3¹b¶a„Ôk)õõ4Š–ÛzøŽÇE÷¾ØO6„ùï~5I{.ÿtÏï_ÿjƒÏçø¶dO-:а²Ö?XjØ„ÊCÆc¸À&Z‡Kdᯅ§1 {½X‡` ±™¨sË:±›eào®Ç¬µ©±š‚k¦Ñò;Y³¾oì_‘ øpÌx©QSŒ±ÔfË-ÄÌàivO¡8°åxCÓ¬‘Qä,Ï ÞÌlð [Õ)èMÝØ/\x\ÀoÏÐFÔÄ÷ñd¸cÏ­sž:xpx¬ÎFôçð'æÂÓOq¤Ì”þ6ðÁWeJ@õ–†ËÉd^º·"éµÓæÛ¶½µÛ¾ UïjÒâ§tó51ã••<6>€ð… ø?€Â0¶+'íæé1Þ†VÅOªM~)!k:Ý À¾»rÿqw(=™Ë{zQuÎ;éÜržÜÔf.© ‰T¬¬üS—Á“]tìlYáÅ}!6Á.Ç ô¡C޽16–ìºÉ=àØÿ ðq8Ïÿ|ðæ¸é×›Qìï\q‹Ã» ñéóRœ½}n7hÀu1H®â‹9^E@îRº÷Ѷ¨ê†ß%P- ÀÎú!Î* ¡<@\2©›ì›N† òÏ¿²,ï‚öÿcïÝ–,9r«ÍpØ;“lµ$ûÍæ æ5þ7›Ç‹±‘ÔjVæÞîÀ\ˆˆÌ*²d·(¶ÂhŬ¬}ˆƒ; —ãhj?*^ùŽ( ,e»-•Èšf'KÐ~¤Ú}Ãiµ£Üº¢Ê¾'R øŠ[öĦÂD5…ç{¦æÚ·=vG»ãû„ üÕ‘Ž||ëIÞ„¨{]w–jcÛÅ8Ø5ÊÆ‹*¨çìIêÞzéH³™Á @)B™¨% –у¾UßbƒíW^øóo>«WøyÑllû#; ‹x°zµãõ­„. "Ì(~ž ÒJñ^.¤€œY¿ n¯”Õ*/ÄíäJÁ М9ò4=3ÊXR©`Áéuþäüö9²ÓŸ84¡ ôNý,™±šfCP~ê8gJÇ9«2[Mïô3ZÏÐ,U0 D>ê«%·ös¨MÚv~l|ËfÜ…÷ Z¯ç=–%<`@õcÈÑ \ù~Îk ×~4H€ ÅÖz¨î§Y®®v–IbadÉd2{ªJЪ(:θbüÎx¬ÌÆêlû9%W Ò&¦xKL)ºvŸÂëXÏå’ ÇÚ½æ¯_ç²ÿz4F„&€FgƤO¬Á-]¤ ¸¸±äHä´ìZ-Ö=E84ÆóUyaîyK5ú“5kËóXB¡Ûrú¡#÷V>ù¹O‰Â××øÇ5ÚûÖ{µ–GÿÄáBZqu;1DuŸ –q¶à0ñ‰¶ì9—úÆÈ¶º«>J">¿!1e¡eRõ=~&„qØ8«9,Ô%ɂէu“¿‰·_ôuµ•Q˜…6ÌÄ|ªÀIì[ª„ëžô Q¹šzÁ/¤°e#yùóµ™Ë~»ò—vùáâ*âJsZr9$3Z°G–ºÉ‘ß8ŒŒ"Ã>†®NöLRoKö‡ÍÒ˜}zà Ûé@Ç=­öÙ:ß…’¿½,[X™Æ"LË!0AÌ?7×Ò†UÁ°ŠÆ!ƒMÈûQØN\"P¦£-Md,¤ãºñ”¤j0è]è'P¨QPgyy¢ ýž¡°ç¬l;ÂOɆ¯F~¦®Él鼿ðÝÛ3¤è–È¡>@N,%¬”üˆ'É—ÖV–¢iÊNúΈ¸µ3ŒÕ‹ÚK´UŽ&X‡ÁêlŠÌÄê:È‚ôlã0O¹M`6–H(‹õêÜqÓ.vÿŒÒÓ þïz?'u¨ÈïÓ‘jNäS;J:™½Õàn=°# °Ü˜èiú-n¯–¶´žºU'#Z/…æøš+ê·||˜Âaß{ó¸à6R8 àEá" ®ž¯—Ê4ݘ䄔ȢZ¢4¡j™ 3žO+–&ö 4DkÅkJÊ.„ðý ûp€Vh]ï´]Bï_òøéÀ¿Žk9‹cïÔ©œITœsCµªµµ¢ L†€2| ŠŒê°•21Uótr¾cÄAzÑêlËO‹è[´u­ ÝA¼›Ü'XXêäèPUæ`ØŠR²(ìÌ‚ ³ãœ#ØÑºb#g’xÅYM˜–S½FG`J²Æ"òmeßÝR ÷ãä¯þ—‡JŒ²€ ë¨)9¸±#rÛÒ°r·£¡ÆtšœËEd;®$ú‰0• ÷ƒþÒ ¯W°t¼Tú‘®5ldMr9zâzžëYÃ(Aü¶°­Ü{GŒ6Ù¯´ÈrÕ«±_•ˆ"÷WÖvÑX³—ítÞ†¾ãŸY·«UJ–+¨r0Vl°¾”<_¤­ŒÈýlÞB€úÿ‚ýï”·¿…¬츣=?gÜë‹údï©Ë’]Ó6µˆ‡%dÆÜ)ÊdJŸŒ­"\ÅVÆH×ÝÚ¦,QSæ1~ ëF~¯»é‡Ú¡¥Ó àYa’'¬˜ 7Zg*>²<+•.s°'ÙR4Mª'z–÷Ëý3²¯_®×Ï»¤Î×W^}–D[ƒ62Ç:´­Ä`cfjbÏDÒˆô®)ÊøÔ~üˆÌUKËóC>Wž<1À¨á‚‚‡ÌÓ’f…‹ªx„çrÈôs¢ ¡õè85± ¦ ­39‡øP‘¾Ÿ]sÌÐQJû¥gLÔÊüp Âüì¸ä>ŒÓSž¿áôµMJ½5nÒ-MÞª ßgSþR ÿLý¹°žÃ ›°‚ô ÃX8u˜žg±$å¾5}ª•ªÁȇKHk«é~ˆ |¬7tÇ´d®[B FķԲ&Ç!03Bß¹V<O¯ø·Ä…d)-"S0cÞY€-o]ôèÆ(ÈʹæHº²uclr†ªðþ;äŸxlÜw6Ãw6¸ ²ò®¬=iيݲEn‹è›ÁÏAæIjìñLoŒ[¢Ò÷Á;ËÄI5JÀLè1ËS¹Ã#˜¬µ/P6e]ñÉ«çh«1ºd¶È휶°V@ÐÉóÉz°6c5º ¥4ØÔSjPŽÁ™”¡(õéÓ%pF‡??Þ:püÏÇE©4j ¡jŠ´¤?£¿úØn¡‡Ñä¤+­È8>`ò+Î>¢Æåñ­O8ÍÑ¡z]:ÞrÈšF»Mð=´’µ0[ P¾£¤þeS¦œ] qÓÊ ¼±È‡ëËçäõù(?²ë¯à~ ¶¾Öºíç/À_ô8Îîsêee)âï3a´ü×𠇜ä¡;ávLÑÖkÀŽ¥hšk*ÁE1à&‰˜~tÝÙjÌ•6a¤ÂWÔçSÔIJx›-ÇÕw¸¨àB] À™IëìF÷œi¼ø}#:®%’z+æ9ZÀ í0±N}f©=lìp‡§raÄ‘1&ÀôÁ[çuB”Á7Z4ú V˜;ËVžJ[y~áõ‰¿b‚|áÅyvÖ…M³›×Þò‰DÐc›hÇÍ’³pÌd ôV"KžvÓ„,Âȃ £ «Eé¥Õ³»OƨK³ÓBKº5üà iØŒŽŸ g7Æ’9_"eîyÛĈ)¶¤ðÉ´’éD<tª¡$W,´ìSd¨Ž¼Ë^øY‡ä¾:zôPlIŸ|m¤AhxC[†¹ûjgýZÀÏ·þ@Ù y!/œÁh¸ý ̳²^¡·J(d±«]¤<Î[ŸSCÞóMvZ=+þâ©)M¡~ž&;­Õ—N+*–~H~~ɯèß‘(FqÝÐV&¥\Æ©&d‡„ïe)Z͇tBJÕ'À2…{AÔ(y’TšBÿ–ƒ Ôpó$G†(,Ì…›1•÷€GŒ›ð»Á.l‹1B¬meLîÆÖ³!ÙãI{áéE\…³õ”ò¾T^Ïæ´ÆãÎ÷Ž” ^„ CXÛàÇMe$¯a×ÖÑ-«_Rþ ;›'™u±£†LöNshÈÄ ×:Ñ_‘Î6r€h ‹ß—Ü8¶™<]™Â*;•ƒ€ò¤`³¶6”…ÑFü‰.ߎœÕË©„òù©øC "›ÙÚÒI'¿ëî|Š~þê}u¬dƒ<ˆ šÉ’v/DLQ`ÔÖ°_J ô×|¤Ýÿ”µÇ•Ì¡zij é“90…À¬ÑM— Ž„­<[v±#V š´Äšì£÷rF?±F~æþ›Ç‡b€e> "¯h ³\+÷Ð g#nZ§)Û€-¨³ nÊX*¯Š²ØH9Ïû^ϼÁ¨ÞHʈ×W¯¤*2” t–jNÖRÄKjèL¹P«º ›HD‘Ï ²j¼}­™颴ȋT qèlÔ4•6²,)åí^à±d6šíâ†uÖÁ³ó4Ö½g™@X®·€ƒtg(‹3¤ºŽ'ÍØ…›°>yvš06´a¢¬w–ÁF" Û‚ulÏ n¥gîÜv¶0î¡Ün4aë錣„Þ„]éë¬ÆÓê~þ‰»°Åxç‰;÷V¦dwá®b¾”p‡‡WÞ,úd× ZEs:1ô%È·ÖüTC7öÒ{°•®ìá'ëÌÆ= [ãõÉ»gš5VÔ’»LlÅ[¸Oá¾²ÞŸüKçÿsî76ã»ßñƒq¸°i6p™²†3WÖÁ>¸uÞŒ›²~ÇÛS⢛vešeMØVì6ؽi,(XwÆÕY.Ün|™¼zö»lOn+&ìVèÆ¬!ÅÈjtDöc¿ÐWžÜÒÜ-Aî;ÛŠµâ"GÿÊ?cƒ¾aŠµìª‰<^×ä›î5Äkô¹B£%‡L‘]/Øfžâ×ã/†Œ[Ô“qè'&Ç:¾Ö³+ I8&Ìß´øÆM<âP~Ò ûú#ä[ïýÊmü9ÈLþ¿Isÿé¸ô"#Ç‘º&õ%~»¦.Û¬sÞw~gl“M1Ç:«3‰·Ý5=§ IDATJçç¥òŸÉDÅòA´ >åñ¯a*'hŽÓ‹bŒ«%É¢MéΓ4ëIÙ<$ØÉ@Rne¿'³ÐìTŠÔ$*ºQi Žƒ]&DÆošà–ý>tFáñÊë#ÉÄQ¦¢ô“—ÁÖhz" )¶¥âi™æƒã×ï°Æc°vž¯ì#‡†‡0êQY„7ã6 aï‰Âß6,HDï, íßh°7zôš­<þ“ÿ£óŸ+ËdÞ0… ß²ð»lȽ¡OžÊï…¹Ó'{gÀ‹§ˆMðS÷ÔØÇE²ÛÚ2‰Â³Ñ<[ÛlpÛ˜#§«/uÛ_¾+mC{:{„¾cŠÜéÁÒ¶¼«É[Õlшy£± ñ³fæ‘}—M¬šÉ9‚ñë&zæ9ªáÛ Åqøå‡"_àØY æ¸ÌxŽ¡µ—ì»?cÿþ7?¾Ž±ñã/·âÿvÿz9O1èUPmneéâ†$;È’ï?•Ösˆ]äÔ‰üJj9DÌËH1Å€_MSMzV4”î'r Øcüœ•‚€ÖèZ@Cq¨&€Z/§Óa>«n\o k+4ÚÖÄ*ôgÚè£2©/‚wãŸü°r·Ä{Ï`6UÇ Ëv*U6øÎÙl ¼"j`¬$õˆÉ¢‰Ò:#”0Þ¸­ì ÷æíÖÁn;ëÎ[Æ”øH×ÝWÆÈRy_xS¾_1gÀ÷ÎÛ@ŸlkBüÜéÊ\›’ÿÎþ¯§þ‡à+ëÆ{£;cA'ͱEÁŸiÅšbRÿ…á|·ó”TÒÞ•UxNT²[ݲK!ëäΈ›?³…p4Ö(TkXÜÆf¨²w nÎî´(G×ôÌQ TèDèÌ®4¡¨1W^²üZð f/ê§Ã²½ËfÁ§ýb:R·JÒåÇ÷êvB‚Qˆ>&•æ›c"†OøÍÓ@??ýÏñ·<¾&}ð¦è…šEÔb¾^ìZ,ÞQÖ ¹X[M´7f®úšž€-õpÂ([•(’øAx<ø›Åë·â›évXÿh Þd5×+7²;ÿHt,hôÊü>ͽUظíü~ðv§k @c[¸õ`lÐщ}yÄ5q›ŒŽ)«³5º¡ î°ä™Òî¨ÐÀwìuvxXAÊùEð;ag]kž¥%l¥Îbl {¡ 8ÃY†bG`,üË¢ÿÏ×?2;»óÒùÒXÞ‘ÎÒ°7­ñî¼nì+ÝyÛymìÊû+úÀv4IVwÜZâ3»g¦¢1йšÉ£”½9ºAÏAbÅ}2[>z¨Ò:rtª÷Ä'ãom¡‘ÂP½¤\6RÃj¯RD`ŒÊEò,J+§WÎÚÀeF“W$óÑ#ѬZUW xàÅ#Ș¦BŠ Úé¬ôIÜY~½4Ð_ð8ìÍ5ø è·q\/öWs™_çTdt~R³Bð@ëØÀ  fO[ÆGq\†!ÎCK“Âjl«WwË/ÊCX;Óðžæ{™i²9º”jÇÆÞ‘Îa†q [°¦,èÑSr<Œ;9W=JÐí¨%m©ÿÞ{f9÷Îó{ú# Pd3mÐ-5…ìÙ³¸×`SV Ê’Õ •çÉT†%£4ä¦_nlQuXŠ>y L#3³€È” !5è˜ÑœÝxѹÛNï%gÿ`{Ò_ØHsyß±Ž¿ °Ýyù‚6Æ+7ã1X )Wþç¹³ $ˆ³ž†l^û‰Ñ{+5ï‰Í*¶•sUOŒh'NÒÑŠíY.ÖÆî˜²‹óÖЖ¶rÆG­iŒGøg9Át-ʯ>ñVbãÑ0S¨Î::?.Ë‹ê'Õ £àÇLÍ¢Ÿø1øÓò9²ÞGðÎbØ=?Ñž{ê°GaR' :<û§“Cõqèå¿8þèÐßç°ÿñ­‹ýuò­¿|&¶V ¾Tl¯³Z‡5‡P܆åϹŒ=ßQa¾þUKò,ù¾0– ʦYˆQ-{Q.ŽˆÐ ùÁÑ‘»:û½9u†ÓŽxmÅz¶²¹±ì…ñÀ:²à½"µ@œ¾ð˜¬RçѰk¶ÿ¨Áó¼qÉ&êôÁØwNϺ2[ÒÒz-¶/©Ö7æLy»ùä63MªmÈ€n0˜/ ó]¥;ûGÚ—l®ž vÞû+-¾´§Úͳ¾Ã  _^èùô …yƒ>åŸØ¼š8¯íçÓ{‰UP䎣þëÙìMÍ¡ ÄðÒ&³b©jH)hõÐÝÉzƒŒ¬üG†¤-G+GÒffUŒö ®U.=†@°ãGÞíõáÒxÐÒ:?õ’Jf¬]ß•!<àXÇ%Ï€½%)9g]ÌþUóx{µ¼„è¬sÁ¶Ð®ÌζÑ=›½‡²NÆÁïAïHÇ5 ž‘o…¢·kéˆÇIØ]Ž•¶²Úz³Ú*—w•˜`Žð;fЗ*êÙäe•Öpäž’I x€BÇ©ÝÕo Y~ï£ WÕœ8õlṙ[çvx‚–‰‡Þß%lý3—ý?^ àOÚÙ8ª¬7ûTïú›žÉO<6ûÖëC.!,×Á\„w‘+·Ù‰AunG$î‰S-ù·Ÿqß䫟œÄŽêqhÛ%Q/F™?RÀ2t„ŽÙñ sÐÖ âŒTŽ€ú‹Í¸){ðYWÆž£]:htÃÁ”Ól Õáeal)@}_ûîÆcå.àxgoÜÁ&¶'úŸõdcÜÙ'Ë ‡—!i‘[K ¥@þŽ1èÆøÂ¤zµuÙé[´ï>Qeé9Sçà¾`Ï ~‰›àY}Ý÷2µã&‚”ÕðB~4ŠÉžuM€.÷LÊ ÿ^°^h¤ ºf”-1gFjŽw<\MM*ªù#ÛJ ñ$õg2бfùF‰Ä¢gÞ@3ÔRýl§iM5éY’9\<ì=gšR^!Ôÿd2ý› ùé8 èO»Ç òó™ù^ùd;þLGB!ß<.‘ïùó‰>|<ÕO/¶§q}Î×_~ó¿²ã,M}, ãßB„¤Ès~êµEN}ˆ°ú¼[åsR5·‹üØMû Ï.†)‚Áøå¡eMUê..ê ²¢ŠÍd—Kô)=Äé4¹íRæØ7\SùŽÆ&, ÝÙ9›’ZU˜ØƒnìŠ ·»³=hà Ëäé¼4ž– ¬îà‰Ûhg3–Ámã+­±nðPx§9Ëa*4†r3²ØJ6y€ÓwöÚO‹14µ×/ e|ðrcJŠ÷ãvG-k¤!$·”¯ ï’1f+^Åzqd¦¤³øi£dê{â99›³r»Ur4 •m”°î{0†%]Ë4úÄ`i<¹„§ !ÔGì²×ÏšýŒjèšìËäÙE&Í…9¨[®ðÐÙn–cbck„z du—¥{Ø pl¾;ìÃÏ?j®¦\¿²ÝןüÇ_üÍs¸d¯ß8·¯OF/ßòéÜ>}õ¯ûøL ŠÝâ9T‡+A¨†ÞÅ‘Zl 0£¼IsáìYÂ¥ï&bpùæýyWqý@%÷ÞñÕ§Wñ&ÆT¸u6Kè`hÁDY±¸1: LÅ;mgô–@*Ì^PòŽo¬·•¶2&"´0è?°*®´gƹ4ü‘ãÒ¢‡vJÞÆîLa ·É͘’RÃâ´';‹Ã@4ÕŠ²¤±`ƒ=4”z¶Ñ:~HIG¾¤h+Ÿ½¢¤ÌÓ9{ÁÀkž J˜âÑcUÊø®ÈZíµ†4ëáæ-ˆü0ž±BxJT<–^§QôÊi>‚רüG…f^v™Ög€³f£bŽm¡”!:êÐò‹Ô`¤‚iÈ~DÈuø`LI  ‘ / ƒÑ'£Ó{Ö¥›çÕyC·R6¹UctèÛÿc8¾eý?EÓ?ýÆ#¶¼þ²]^vmºÐó‡3²Ô‹‰ÿæWþø£Á¨}ãÅŸ>>üÓuýù)Ë7¾øït|( k¢|¸gu{£© ©l &äY Т<[=Íx÷ŒÎ2r*Ç_ÔùçÏ¿®ãœ¯ì£Y’×Ä 3KŠ·c¿6$& Å<…A7ö;ýÁÖX—Œ‘ˆÓ·´#tä–t…‰ ÛÑŽÞx<ÐÃ.OAVåÑ`Ð[V;÷Tж`"5Þ¡ß žÁaç ÛÒýŒ¹¥¹¬'Ù—£Ã®ÜO®bÏn;B ?¨ME_ž7VØotƒ^M Û´dôh•8ÊõA¿é¹›áÑ“$?EÓLèÅP‚,3Ȩy™é]>Ì]»°Ät4œ6H3ZcT|à5ü2nÑ¢´cd}eº²+‹¥àUøÑèmvC%;ãDÎXã´L£æÀ(óW¡ô÷©^#ëOÆñSx~=±ã7 §¶Ç½ÖŽ(¿+PTk.ÂϬ¿:ÎÁ€L#ÿÈOú˜œü8íë%\~øàu¾¾®O÷äÓÏ_çÇñ·w GY8vËÁÜà˜ÜY\Î7ÖzŒàP’­=‡Ð[ºÔmçHŸ3Pª´éúµ~½™?vÆ-ΖŽûà%þ%9ö²ßs ´É¼1ŸôÎ\°Ì<º2æLAZIXÕË:w¤á Eï9Y>¾±+4¦";â™CˆÒ;O莻°À£.·¬ñ¾ÓÙþäUxµf×¾GG²æy;y핊yã‡VkåKRY¨éñÔÂXÃeœt©û€¿ƒUÙÎiñF¯±6³ÕgTJ•SŠ|lÌ^9ÊHÌÍ‹Mä >‹¡oFÉz;çGÙ>‘ç¹HÎÑÆœ¸éŸVxV^¨šõ­^Z°ƒ\â„ýD·‚…܃¦&R¡}(rޏœFSöA›?‹üíc{éÿw¼ìÏŒaý[ÿ}ýªH̯vSÎÿ\rž5õ§•¨$7 2ØÊF„·¹½cZUÖ Ë~Øö0ëa›z%Ñ“Ô#¼:')°ÛGßÀ‡¿žp××pS@Χü1¢ÿõëñçü÷3ŽÜóZ}˜!æõѼúÇ‹SÁL°mdÛ}ÜÞÛkÍ ŒÛhJ³ìüÕžs´ýãåg·ŸOŠcñ·[þÊ 7Ç'ÃC§÷†îŒØŽçcr¿1þö‚½ 7žOt2…³ÏèÛiTE‡ \Ø'2‹¿(´Ð™xãÞØb‘lÜö¤œú¨i<”P1’”ÈžÀ÷ì+ëÌÀVÍÐf9q7¤\ï­dynЖ:yKbg†C€9K¯iêCœõ7zg„„ÑÄB¡³¡KFúמ€Äm‰Èމ!Ì`LÉ©Ÿª9øŠ¢3±Pt*!~³9Ù7x0Ê4{T¡Àè° †<˜1)Zš%Ç_7ËÁ±ðbÅNÏØÅfÂt úóuÆŒDj§W¥dEGÖ3BØ#…lÿâûËÒ]CÔOÇm¶Ãð}ýᇇ¿TíÎ`³¬­ÁªŒ{®K«ÉŽ1~$‡Î\%=H€,@}J3öÉØD±¤ Ê8häÕ•6úˆS½aÐ76¥K6èGÇ©](}2,ÕÃAdÔ|ä7¦ˆÒgê)æ­Òl™ÉÐêk,ëÓÏŸ)ýøK>¦?VÿÉxùZŽûyý­$€ãe† ^•‡âkýSØõ†WgþÚró÷²Pp u…zè±U´$£Ãs„I–µ'¿†±ôË5—óéÒ¥òÌ+Öc(ùÀcáUyÌÒè sdg:íÙ¹5~ܾCæ&¢Œ—¤ ˆC:Þ˜;¾Ób¤AcUfÝßY4í>%Rï¿ÃžÜÛ‚¾27ÚžJq7¢FªNŸÈd¼a^̉ȶj‹[ZB7‡=Úš"¨-­çq"1 è\ë÷V«N„9rH‹iÇ,ÁÆ‹Å&f64r¿½­2Î|ÐáÍ%×@ä.‹×i;B—éÜCYbÊùÐ¥ÄeÛ12,¸¡–£ÅÝ™ ƒWÉô%®wWv§?XVq®Ñ* MyF½—Ì ¤ç’›díz·Õ^hžXÖñ$Š{BÝ“ü_z|ÓLÿØk¾¶#”ÿx ¶í4ß@Tjà”]ѤH8ß™Jÿx  “­ö‡÷stCa«Ñz~¤ö;[µ‰šÁ°×†wt2-~ È>FB!ÊbR€lh <Ù{ Ç $I¶ÙVjÆÒÁÐ&º³5: z­¡¤è!²öµ£ýê82'ùæ³»Y‡áþÚ[üÈÉ'7px¶O¢i/:Öñ­ÌJ¨ê·¬RNÎjʼÕ¤b½©)ÝÀ—gæm.Ÿ×wÍÉ[D¸ƒÙëêcJ I—ΆO·„kºê–î=L ÌY” ^o<`L䎂 ÄxNÖF¶ÿ„t"3EŠ2¿yÇ k´Ž ÝR²b Vƒ†¾ä)Ì-CBoȃ‡s7|§ Þ·55«wǾ3´v¥þeúN;Û¬v‹Lâ"³(Ó<ÆiÍ܇òX7PÉŠ;¡ñQ":ÖWH¶Åó’ Ès[¹ ¯óIXÿjo,i¦8ü¿ ­Ðœ¡ì(ÛJ›¨± ë Ú¸ŒdQDa(ëÆóž™YHI¯–5ƒùÂJd‚7š¢p®,#5¥á˜òŒVuWá6Ù<Ã…¾ÂK63GœcgÆú_宦Ü.FË“ü±Ÿ5ä l}Ø]ry„r}Ÿ2Bw—$‡ˆ1<Õ²ØÉÆŠ>Ñ'[å›~CÁž¨%Êül¬_ª‡;™Ž8»¥Ndh4=âq÷££‡J>¤%¥ÏËXHemá!Û'‘ŠVÙ‹ŽV;DfM¯¥†¥¼£F_1eÜ豄5 xg¶üdúÆ ¸Æd¨«±Q¦Á`¦ æ'îu‡å“_ÿ1îÚôñ8§çÿÇšð[P'«ã†CµQ™ÊìÀŒ÷ºŽ,—,°¦b’ ´‘îgµþZ©Î³Ú3ÿ5îðÈÂXé[â°*Ÿ—³‡‰.0X¶§ã™#ëf¥žmÃ_‹$jüáQÞcFqŒÿÞaŽzj'/Ê{c ݰwTqaߣêL“·sA vTY…©Ì™.S:cf7´£g$Á¬Uz©ô4Ò.-Ø ÅZ¢YéqÏùÊ$œ?>G2àæ¸Ðy=µö¤B®Àãä±Rò©{~˜‹•Še0´ä‰ª¿oX´jW½&K0÷Ö‘Éú†/)DjxfYØ…¹Ád õ'a}² !%<-G*IxA'åê -Øî©6ÖVD+1dtIx¹Oæƒ9i WŒ—|^2üþE+@¬»`— }|õ2M6‘zM(Ÿã%Õb•þÄÖÊÌq©á q&³Bõ–«s8ÞèàÏì…± ý’º»íñ@‡‹^›9pjÉ/Õ:ÏîX,«`“óÅÇ…[)±¾ipƒ%õÿ´§".‘êj¦Ò˜ ox oh«t!ÐÏLìIÿCÎh öñx²„™ïØwôwÆšØ)ŠÂÌèÌÃÜÞÏgÒ좆HU)~ìñ}s¹]á_XNˆÄ.m±eª[ :Öa-pãòöX'rÌ•­ð3œzNúµfyä@ݰ-Ý€‘=Pã [ŠÃnlûžîŒ/t°¥L~¡9ÛK2ˆ1…V GöŒé€v£OÔ¡_öŒ?"_ðÉ]³~È£¡“¶Ò{RAƒöÄÖäMŽPOs–†‡¦Â¸9æy9³CG-µ”=|¢D;ËSRKIMYj¹:DîÕò †±¶ÚÂY÷Žo© ñ¯^Ì–¼WzÚ†`VóO$¥“‹§ùL£ó+Ü6åœT‹çªŒk Ì`¤Ær|Q”â †'²ä™#¤ˆfÃ=‹ ÁW¶Îl,1 -ÄbWfå6qc®¬`¼QËigX¥¥š c3õ-Gª&Ý¢j÷çP‘™¥Ñ)'9ölG„Ñòcc¹H…ºq¦\”Ô‘Vè“'Ü+B\…“|縞8Ÿ†µ©[w$8=QËÈ.Šñdñ9âYíÌž#ãbí_Pcy°-,ÆI,¡¬ÙÒ(Ø1®V[’ '˜á+‹åò³#½tLt¢p 5ík—ðu:xµÙ_¥J ­˜²6†eÌ«V|BÔ0Ûån—‰d .¤•#¬£´B#ºwŒ…eeŸ™ç²aÊ«òn4£ß™#‹n° ;ÏÉï¾g*ó™]B½¥Ü±+¾@xC¦ø%‘Àbµ1i$+úDm¥ßYBØÙ !å‰wú?³Oì‰O0ÚÊìø“&´…=ºˆfØÂ\òk <ÐILÉÌ8g>¥y>šhò’*ðèIOG¶½¦Ú•ÔÖè…’_Ó÷\À$ÓJª³cÎâ0‹t=ã È\¯Î[ÀÒpû@BÌYRé!¿€U7I×Äë·–±¹…Ãîù2%«h.,±,æ$òüÈ3n°¤6ߺ3wX°ÛYŒçŠÆ¾ïxÏ¢7›èÀ¡õzº(ï kgsDX•M¹í)6wÐÉfG&bô,ð’ã¤ç3±s"Fûßÿûÿþj þBÇåÙÆôΈ^ЊÈÒÊ•$‹€c–êNF…àĉZC‘{:Umÿwp$µÆgrÚ²{æ“;ì¯Ô9ÇsD“<'…uÁ¤ÒO§ŠQáŸ]*!8ÌßÌ{¬9Š~Çå´ IDATÿy–é½:›¢;1¡aG=_OµƒÆ¥ek¨§ˆ›£%ö›É–uªHqBœ’º91§Åòl‚aÞèç¶â÷LiYðÄA”ÑèæB÷’M¾1Á;ˆl’W*xË‹JKQé‚P7…ZÇjðJûjEùñòܨQ®ñoÑù)ÍÙ[¶ÛÄ9á…*ûÂBÞ‡s‰ÆM0úÌ.!b´ìž«tqžÎÒÙ”Wç­óÒÙÒhÂpÚ F[¸ýާ2'*ìÆí;èÌ7n ?l¼ƒµáƒ¹ÁŽo4cwnÆ.)2,0WPMBg4…¸GtKYÔc½ 7ã špW:<ÙùNxºeØ;‚ˆdËÕÃô·üYÊé  Òð%»I,³UHóÔ$»‹C„2R©kš!t‚àßbÅ÷Jbª¹€5ë´Qk‰$ÃMÊDÐ’NêKޏ‰^*™tek¬“a™œ!GI£vw¬«(áƒ6®t©k”*¨ú˜…Ê’5ň·'·îD!Öwš02jÜ#4à KK…‰½ÑÝywÖ¨ÇäçxCÜù%å Õ™3ûBDØœuËß°#>óMþj ŸöK|—–  ^R-\b½£îq&5²•Ê+ëӌڜ×вÜ5š¥QãR?ìŸs‘°ÚH&Ýšâ óÔÿ9^Ï–kV*p€KÇ)ù½”?`Iÿ޶L0“ðs({@9äxU.`啸yJaCC*3ñãcIÕß` \·áI'ß5ÆK*ypgX®„¬N»ážÈOo„!l½eÁÙ;}â¿X'ðu×êçßKÜaq‚qñièëŸÂ’ƺÑëgÚåSk€²¥p=þH»ïŠÍ”u5NÛÁÏ\%¿ÂVˆ8nIWˆÍÅ´,¶4µP„N«EƒfÉ +þb-Ü”“¬~÷t!q÷b‰×y;«ÖlëaNÇn‰oRõùg5ÅÛÊO~êÕ ~áœ>óæ[œqôfã;ãyGw,&˜4úÎÞѹÐ'ãž;v}ðPºã 6Æ¢¼«³+kÏ<¾W3%÷õ 4ÖÉ qøŒ¥èƒ"0²¢_€l‚a{.èrÄ×hÂ9n~üÉ¢°`ž{È`™ØÂ4gÝÙ3mÚsÝ´† C²J™"—å½b}Ä2ˆø7ð™ØÆ¡‚`k•X½”> "„8éËK6:Mc=üD¯6«eà¹ûaô$/ö #›$\Hh£öØõzFåZÄУgêˆ9ÆÝJÇÞykÇt)ÞDlå ³„þgÙ b!¥D«ƒ2-‹«SrTdQh“/ÆËÄvtÅ…n<Éüã©Ù“…´¶1éÉ,ò]™–¼dÝØ…à’#Ñå¾#ˆ÷-‹ÞÝòÌ­† ¯0„MhÆý‰õL‹ÃøÈÏ,çr9úhâÏ£)••ˆ[Gõ#|€q*ª=£çc™Á‰$VÑ#(}Vé™tZȪÌB™/ýÐQˆÇ™ã=ý’ö¶„kò Ly =ng·T€Œ(=ÎJ’ÚAÌf3Ö™ÓÆµ bÇm2òõÝñ°ûƒ¾3Fg̬¼%;A†ÑgO˜çfŒh:Ûqªi6²ŠŠhbùD&@ŒÎ8’Œ–«ð›ÌzW¯@ìP) *ÛUoð€­bI’¸´ã;D½tÉÐg{c(µ,á¼GîÐé ¡Þ@èƒmà=WTd0˜¶wÌéàá|ÿZ= ž€Éê™´ X%-£Wü˜˜X\æÊ2Ð?"ÊX±z:é’{¢Zc¶ºW{úƒ¼¡°£žU÷ÌÊ ª?ƒÂµ²Òîiy£Ÿ(Ú¾|ACÞ‘ÁTÚÌ¥¤¦5ŠîL¡ÀÊWÍú(á]@f>è 5ä(á9Ž©ÈQ¶mU3S¬³–êÖ™ ƒFˉðÆŒõatCa³lA `À,<8}ˈ´$kD0N9*96I›á¬Ñ7«XϨué³nµWä¸L #1B:¢_˜¾ŠI=”‘Ig”3$EÙÔ9`´À¾‚å©[ÆOJlJ‹gá!,#ÍD«Í“¯’ÜY§;#¢ž‚}°5DÙàe&($à+Ë`ïYvêT7VŸ–*ÆdHa¹¼Ca-D:S ºó„ÅÑ[&sAø 0ä4l¤‰Pc³¼!#†Bç¼eBþ¯3VÖAŸì=3Ña,Gl'X§U 5S¸žmØy˰Æ2ôe*þcÁ;„ïì°ÓÑXIA¡©ÈÂÃøþù=„HTÏqÖûN/!€yØÀ),OÜQe¿Us«&æñaýµjÜã{Š‚rÖüÌ+ãHU눚G™økÈO¡„N/±§CŒZž×àŽëY :’¶Ä¹"-ì,ðÇ„}γDJ©Î57LJ=±/œÎGãÌ#šg;†r‘©±«¹‚‰úÄP¦Ý”uÃì…ý‘ZZ*èš:ïÖ0c±´A&ÙT f¡ç¹cZiäÞ‰Dgæ$ªv¹˜gªÔ”D*NŒd"ò¡ôy±i˖½¸Y‰]é¡Ù3V]©¡yÐ6l塼n¼Áªì óžv$Õq—¼mÛ;mÇë9«Ä2h¢Ùëïd1àë ¯9…¦,Â{Çöl|prŸˆ³Ýx<`í™I$^<3ê_f²DBÌ`¾©å`)@Xš¿lUÄhÂ&,+*™Pë|°Ûxâƒ{çÊwÂÛàÅQ™¸°jÖ±{¯ºE­¨Ø›­Wª]ñ8ÔF4Šm°´E8w߆h†k|ì¥Öp”7ç!¸°G"YÝ‚ÇúMn¹Çe²À#ò†IëlÆ­’8Óp9w˹¸aCZmÌ KTç<Æ+F¦«ÌA3èIĚβ`ÊܹY–|ÆF/mÊ鬃Ö3WHɸ°Å‚ÂÞ î†l‰Sé¡k9eéÙÙž¨C(ƒ…Ñ—Î*¤Ë@œîüpã>™#éIݘ†÷ÔÍ–;ûDž˜Ó4%%^n¼ýžõß;«2WpöwšÒoŒ²º£ª±Kršç“åÁ\b‘ýU@Â$ÀÙ‰Íb€EºQÔº?‘˽;ìù¯‘‰ëǯ›.Gk¸2"ZéIŒ‹'ï•Æ„½>V{$›³”g­ê“Ñ>d-f,Õò“1QAC!,«=5yº2{²ìà4É[Ì3“•|Wuñ5®4v’$Ô\ÐÁåçl‚Oì–¨‘ÝÀ1§ tgÍi“±T¶b"«¡Sy*ëÌKsrØ÷¬ß,Â…åž-£Ñ¶&˜hK@­oúpš¢í9–f.Ûߢ‡èUl¤ø”øXˆjÞ¾x¾qg]X!ÌWP:ì†NöÉÜŠ‹9s‚ösåµÓëàV½l-…?ƒ_°Â+ûžîA«q? YÑ9†² wa¡`C«ð6±FÓDÞV²ç6>G‚ŸÓY”9¢VÖX…½QQlY&‰®ï^º£ÔúÄ“x2]³Å#¦:³•vØŽË^™œœýP¢ÅÞ-0MPKZÒ ]Xªî*Π<…¨(ÒÔCFVD>îi´£¿º1k$S@çGßO¬·ž€A<ñƒ†ÿ8’à•Vnð‹¼h“&¼Ï:4¿?ñ¢¶ã {CotcQƤMö¿‚ê…ü4ej­§’µ6äV)ä(ŒHªDFþ 1É3°²/žBÙ YĶ 9´ïGLZRG¡ÔUûC%ã eEYJwüÕȦ.•ZƇ÷L(ÂŒr¯—9° ½µU£oˆLym’øÒÐlè%B‚à‰®Â.ˆWÿÔ¡X Dd‘´F›åä6ÙK©\;ÓóÓpì™ôüÔF.}y‹ÈZYæ0ñ€>aOÆwkéeS³¥•8¢ÕrÒKác&ƒÁ¤?‹ä×=ë½2QMZÛöÿs÷®K’$;’Þg03w̪ê9³»|ÿ×£;çtWe†»]þÌ#{fg8MRx Ii©Îªˆð‹9 P¨*–‚TåešÛR —Ád&d2ºÅÉ•wc-“S ÝñÜ:ã³Q+­b3F5%¨wÕ™?98Q‡ñøÔ\ +Ý y‡FéhETC/™9ÑÄL¤FÚÀÕÖJÙ¨‰I¶˜r>öòec ¬„ÃÇиìþ™^¬ÈƒQ(‰ #±{V¸vßý9šÝN]¦ÿ ðÕ/.f¬ÜÅ×›c)~0þ8h¦ÀP¶E€q‡]Ù’M~ÄÍ‚W;(Âyp´ðêqïÕ&e›Ò$`ýNȵtR'–BM õ² Pz)S44b޳ë úñ_]Ø)1’¥¬ßû”¥Ê–ÃYa;œn›ì¹©‘5'ó%ôõé [G—Ô¿$ÎIH¡X<.¤Šg“ac¬пßÄ4–S¾ NáȤDË” Æì õœ¬£¿ÈF OôI)Ê'Á0.‘¹R0PÒ3tȘËEÓª)ÏØ‡qÌ0·øË, àHÌ뱉Å;*Fî!¬°Õ|¿WŒ‡”‘"©ô·8b•Ö}Öûß§×ô>!ŒU}%Î5âyeØÈjÐë+-„5„Aãð›æÔ…ˆãéU£(MaŒ¾«eçt·µcÁKǥ䬺;Nüu|°¬¾^šH!èkÑK|AšAzFeOŒÛW‹UÐÿÆœä>%f–uÂheŒA6®DN¡xR<Ò QdÆñŠç~ðær÷ö®O\àüºìeÌ]š‹’öµ—dPº±eÌ}Ì@¿è‰ÍyG@<ÄL’œb.•Ûç"‘Ü¥L5tÐ`ï\{­Ÿ€¹o¾g ÍèÉÖ˜…<è9L¡ ´N3‡à4Eå䋈‘S@µ3$l_3¤DžÆîý•Ë@-\0†çº×9Ä™ ¶Â,Låíƒ~,—3×’»«{¹êzv,“c_[œýU$À(F÷i‚)›¶êÚ|«^o#Ib{H÷€*¯¦N( )ÁIþ”¨¿ïªÚúg%f.¡êÄ*çähAslÏŽ/‘×åY  Œõã ð€ˆ6þ{*¤A–];mlN×s´Ðjà Å'•¡ä‰‚nAjP!9/«¯ó%4ÿâ –!‰Tél…k€WK9è°’™ê]gÄ0ßËEc ÙØfä_íiùL¬sð$Ú­Òý{ÅhŠ Ê¡”åU©Ñô»[â^4ˆû5¬‡¼Û[ÙÚcPß¹lF¢T_ÑÁÍr­ÐÔÖæ±6*‡)ÃDènÕlh «“pÊ«‹åâ¤øŒdlýÁ­]XØ—$ƶf}»ö‹¥*Qks¡7’V# Š-—#?h²íÄ™ $èä¶~÷§_ÉDL¿Î s]ÕèŒÊ»ñËâúL‡.+’Ñä¸Í\ëp~ _¦n‹.œÃ®HÑh"]Ì ›KX``¤‹ÙHOxB§jŒOÑ ƒ9_~®«â-ò>ˆ2Žåîö'Œœ¨5š@á®/Ë îy„ê¼ÊÓa”†Ê2€$ˆ‰"°ÁŸÞ¸·„·—uR¹7ìe"mm[åH ±zQFao¨¯t.¨Âaré"|g诱 ©;³(á‰ïv/^=$É(Ô‹¤4aÁó¡Ð•´‘Á柒E–LŒå˜-Fõ “‘H²NsQªÜcÊWiÝ0Ÿÿ€ºV]7éRp¢„†Îcfò 9ø&óQ ì½´'ò±vSY#äŒQÐÆ»r s§ìÌ •âYQƒ”0oº¤Bò¢ðz"¬!ÿqÀÿ·/OÇÜÖÐ%-˜ï¬ßèŠûBäQ¦å“W¦©aÔãC8ùý#|§%a½[WèÈwdMlø‚ø{†›VDâ°Æ:ˆUî¹ÆŒ¶¾980–ÈE"¼£úˆ-:çG-:´r¯fM8.ºwý2Ȇ9›Å[)±*@Ä{WŒ:ñ9! æ ñRb u†'°*Ò(ÆHKj«Ñƒ5Â!àô»Ånrÿä‘))8µ“…ŸK@¡‹&˜öå7ç—f0ÇêÊz³Îƒ]^š†j€‘b|‰š°Ä¼ù]k-Õ‹fh¸l¤¨¥Fa•L(aÝKeå¼x[ÐzosU¥d¦b¥:éËPe¦e•ÚÜu)Ætt¥žÌ“7¢¨rÆs˜« Ë‹c+Ñ„hP6ò† Ò)WôÏJ¨@‹g$‡þàO¡Ê?ß¹••œ£ç ÆŸJO÷n~×XÛê¹­@[å¦Ãt:ùšÄ8H.4],µ©1&c¾˜ø¾Þn4Æ$>ú¢KZs¤‡òÜØ<Î:KÊÝ1…BàÃÛàJŽÝÔäËsx”ô}1¯é†[\%lƒBÚ‚­¤;@Y@Šß Xi½èª€éH'i ®æ³ÕAEj<2^Õ W³7Ôçç4:”…iÐFe‰ì¡ÃÈÆsywï•ñ©’Rôæ•ü r‰ýÞýø6‹>ýƒ6¨ÏU\jLjknDšWÚÏ«DTÔ ý1õ³ü+ÞÍÿÎËb°Ö1Sɬ;2£«X³¨t±xø-ØZ®—÷#ôôj6T-V»#éÞ¿ŠjÑ`\‘4{$àήuñ”Þe]] ýÓnÿ"±ØÂ@ï²`­3Ög²ø‚êæòå½,X¥Cäêh†J*QÕ:É,¸·ŽfÈkð€ç5£“½¢kô&y‡ 1Wçà ¿ÈóÍÚƒDá –Ù Ý°mIF·ÅOìÐæŠì¬“D–õøÕèXŠ®»(_b?ΡÏXŽ,#åÕ™”ÕG‘»³‚˜ÆÛgŠ¡Ѱqo¯Nþ$%r[Ù@BžÖÞoSÒˆômï+†Æ%Žr6ì_dÛî‡ì‚¯bKÖ_âöõ´¡‹€d³ÊÛ¢ú€¥¸zc"W”ôh¥`̺¨Ù±ƒî¶¾¡‰PÖFëR•°³žAéqrzL–x­¾ÊVI¤ØRª{r/xYJY%ìÝÝu(ÏõYH€é[ o¤9h QFA&z…N%dwia”¨œêµè.r.eL¶Ì(ØšŠU”¦”‹Dp(üI÷»·ôÝyÆnDAÀŠ3΀3 ÿsoÊ?Ái9¦ºD0I¨Ð$òèøðmM‰°xŠ¥E`™T‹lz8ç‚íØNz ;2Wè`ü@üá:FŠ<¬äPüÉÒߣÒ`¹cOPÚƒíÆ¢&ËK®3z8W IUÎÆÛÉ9à“íÚÕÐñü•— Êl‘þÛz,ÿ3פ䚗Y&k 9z éÏôò…79×[,‚‘­È%ð2¶Q@ØJ¸È€ˆ=Ó›É.¥•ì!õ{”_q5~/+¨º€Å ­/4Ã+kÊãE‰ñei 2ÒâÅתR´PåÙ¢ëêˆoœ9I} ‰HäʼnŒš#/$=aÂÖ_HQÊá1Û·Ùx ű<­4ŒW%xû›ÊJHSŒÖ{mêw·`éVбåUëpßknYm¡áP 1üº5Œ×áØ—ß? ÐÀ/Æ"ž±Àð>+±Ø„ÅM`‘Üê`ƒÝ( y0wÒŒD86gîOxÂ2ËqR&ÓbZä–™ƒy…£Ké茉Œâ:Œe•L"K¨|'öÝ=Nª¡-Ö•LtÄIi!´¸áO]ã¥|!$Äç¨H—|ÆÃ$ê î5¹ŒEýª–¥ütë´mE:ÍQº9¦ÔåÄ*T¦Ä¨Å2¢¯n° šs`ÛíñQÄ&ÔÞÖÕ¡Q'ͧPiô ¯ÂãBfÔA¼)­’&³G9ë·ŒÄ(l“™ÐZW«o-]îxÉë×Õ–ð}®]ÔŽ \Äíð÷V‘bÜEOˆQ2ì Tåô‹iä“0æ`‘é{–‘Ø‚¿@>‘ÁÈ¡•/ª~¡ ñ4.ÁŽÀ6cg œÖüÁêÂ\/ÚÌßi`%îlÈñžÔ'J¦$>mËv[Ép–‘ ƒóRÈ)ö°á•šÌ+5FCñ££k1 Qó‹]|ÛIâOÚ.!Ä#ÜWˆ ˆýóm6E <£™6•=Q…s|Ü%ðw–ï&.;ÔÙ=îϕۢÝ£u„Ü„…v„SÛ’/x¸—Jkèd[UQT=ë½²¶ŸØ›–ݹ¿‚è—â6O×€eÊîãôF«þæêém~ºhH”žØ #øNxLH&•(Éý¾´Ê7e¸¡£ï=è4®j)5zP÷2 tޏAó‹?—Oݺàû"øäd«‚ñ_Þtï(Øú3Q±ª"Ë1ÉõQEh²êÂûùñCòÎwïA‚áÔÎ)ha7òàwØe âJP¢Ù3£Û‘w¦"Î*V€flŽž­Ö½/T÷›óÄÜ7×*ñ‡JJ‚¾ çÚØ ý,$D¿,Î(1}. 2\Š%àëyí¸S(FíAtÎÂl²Fò (ª Yss%Q& ã§ôúָʫ~R—ze.(¯Ð56ØŒ?àoÂ%A£BUZ¡*Õ¸ ]¨:б¦’õÀwVhtŸ6S #¼~½«·˜XaNv¥õgØQ…‹R4x` IDAT›ðk² )s¹t"ŽÂ¯F®ŒFÖ€€Fã‘á-ïZÕúçm’+ftå—¬ÄÅñ€#"’(e2Á„QH^âØûå,O}õB´°µ˜ßà‹$¦1“Si”Öä o ä¯?N6ì;I° }²Ÿ;ÛwXnf:™o“gb·Á/AÙ˜Ê>9‰]í¯T xõ½ú3ºÌõ£«·êräȬ——€§á7’n+åT cY^ÊvÿËUÞs=Ù\ó¢t[MØ,Þ"0n ‚¬;w;̰‚—­Ð³ž:¯vU^qäFoü“ pTî`~_#­%-Rl.#ô¡TiUŽêªoþT—È@S¢W¶ŒîèVÈcö…Gjô™o`J3lQèÜ«ÑÏÚïδ@Òˆ÷¾î-è/hÃ~Gþ'ò ŸŒAiX‹êA /Q†Óývó¥~P§<)æÈ@‚D)_íº:Éwýä .ÉàÓT,¬•}™oÿ,ðGW曎*:cS™¼:"þ¬…bÃ׌e1’–mñ_weXøžÆJw[üÒOåûIKL°ÊÈôÆ£Ñå³P3V …ÀЙC¡ BvM\êMYãz2º±íñ ù1»ÃOZ•w¾ÐD‡’-ɉ2¸ÜøÈ³ÏÀli´‰<;›òÙ"sg#åÅ5øí³Q¯ØäÜ:0OìàÚØ:#¡•QÈA0¸Ê$¶¯ð5;ù¤LÌè™ÍÊ»bJî4£tr8Z˜Àõ­Çšk¤ºP>Ãù ¾1Þ18>áZ½´Î§ñnÔÄu2•q2L:iHG/Òdî\™ÜpPs¬üc4faŠ-Hö/ìiå°‘Ì­†›,¸FWS7)2»kØ»®¿ÿ? U£|%­w¼åfão1°ó%6ך»°0-$Zd/oñ²"‘¬ÅM ‹·øj{Á+cõÝ÷_øBì.ª”'µ…Ãk@™\ZÐ )±ÖÃõLBÃâð}¸ ìŠß¸Ñ0Gnä”)ÆFq™… QH% ™à•»ë2Ä÷Åõ‚¶ ìövür%¡t±HWÕEÀÇÖØD%X›äÕνo–E÷Boç%b_Ï’ØJR@kà¹QAØkï$Åh³ˆ· )z¦H<æjÓyá_Ö+”ºúð‰Y–~Â2­Rvð9V9nkòZ–à˜H06d5ulxÌhÓø.Ÿåd.à¼×Yp¦-elŠíMó÷S43œïï§ö^=qsЖذ‚rf%Ѽ¤ø*á› {šîYä~A>¡UЧ##x&w7Ø'H§ÌLÐRæðq(Qô£pBH W]/FÛ; ûEšaP<•} BË.ÐÈW²24ä ‹´’Ñ g¤M%…o„ƒfÎÙ­=Ùh>×¥ép@;·ÀÚ£ý3‰f[þ`\Ë>äB'‡q ˆr¹vÏ„$¬hf‚DµpS˜(ºQ·Õ5ÜÑvZF&ãƒã¢æAO”Þ®„pï¹T£€ðÒA2™gG”Ùœ"aÁÍú½™jüª|¿¸@2©‘ŸØ‰ü EÈ)”g™sGö¸êƒýÿìëõ´á[W¤Îwݪ_çL³ð"yeÿk™.‹e,ëËä6ðÁ‡ ”¡KB¹X§’¢»R0Ûêb°yÉ¥­ñ|Ì?ŒÈë¿ÜäËu(·æ(”&D u¡} €½Y×_1€ÂS~÷¥±¶:C¾$zžsåhD,—iH5¸Ã%‡1oèF*ËZÕ‰öJ7ú¤\K¿Ð€ )/òL>Ñ í¤+¦¾˜1*e©d³F`U×NOú@ÎP«©b‹–·â~Ò\ßA?£ýU% ›Ø)/…Ž:-lDŸ#6 ‰ÃŒRÌ–Yw¨Šz^aãÏüê®']Ÿœ#]ˆP».WÔC.ú[Ë4ÐH6÷hù$Ÿ»²ŠÚò1ʚȬS4Zý{%‡ôÚ·½tÓúY. U×ò³Áœˆgm«[‹FkÄ ¨€‡ÄtÿýHl=¿=­bbUÒ~"©½T¸ûWø’ÜZ—eÓMÈFRÆ&Þ:¿»¦L(OÆÅár§„¹Öt_Hý7®Ê›2ͤŒ háñ@7¦£ùk ÷P˜„r0Øláef´’9h…T˜5¦&ˆ éÂmL#Ϙ¥ µ|ŒîÒ\I’I3|mëÉ,L¢¸áD¡6$Ó”l ƒI½°¥è¾h¦¤àt„ÉùFûÎæ>}nÚz„Q‡ ê“q¡'ÇÐÜ6gz­ÃwxC'él“ŸO6‰æV7á}BæY˜5êÃàƒ¥*ÕU`ï<%:¸ÿÙWt–î49 p=ê® q(ò‘z¥Û9 ‚,a…•ª,pÀÿzõAãëÌͼZ 4·ÛšÜCýÒ­õ\WÐ\î¯÷™G ¢‹–Ê«ÚP!5táZÜÐíúõÍ£Ó!ŽØ´Rþò5N;«‹s©LÂi®, £øê/!/RoW?±OhÁ1ˆí¬¸ Cˆþg`Ùëûû—Lß³Îô„ :ûàlÁI- ]Ý!çnû\@ÿÛܰk1q¯0Aó)¦N–íèù ñ×0„ôÀvu’)‘Œ©$÷’›è†¥ÅP¬Hö¾j‰ôy.WÈwb›V}CÌA 8Ñ"?À¹€K˜æ×Ö ¤A™d ¼‚/ ¤6Ô–fÜŸ¥±Ðå_±ÆPk¡¦pyò¢Á‘ÿµhsÔ+áä>‚‘YþN©UøQÛ‚t,<0D8Kl·:°JÎLŸ$\ Q–!°.ÝQ||VÞ'ŸodaæÕ“Ptãȱ¡ŽÌ6 ƒVØJPNSbkôG¥;ÏL™Hâ„]¡púÎw"¿PáSxÿD„ge$Д³a”\2|æåµÂ2ˆM-BA9£%ëDçÔÀè&o‰¾1K”ï.ެKBdƒP•]xVlç¾è3®¤惙±Bùä)l†v²„o³n¤o4£K–ÚÙ Å\\×å Ói…Âõ l pH:ÃùYÊ‚˜µ/Ôx™dY’餻òEž^Ã.Ôgα¬;B/v3…<ï>Á"a!S•rÑ2ZØ6c¿qbŒ6¤-á»ÏØbÂ+Æ«±ås')d5Ñ<–‘‘§X$ò°†µ©S{¦yQZƒÑ›Wµ±xÉ!ûÊá0ª¶mÇJÚ÷kŒê"àß%—H¹CüêxYÀ¿wÄôp¯ê’’ÉÅheA¦ÞL^û DÐïœÜYÀƒ÷_aãs”ÌØx ºÄøøÍ-Œì“LO÷§ìd¡\<ެÚFN|fÞF8⟉7åó(Ç ¨lƒ!LcLC·0øê[Ìšç é¢Mê ¹‡X… R¹6L(3"Ù©têlà7ÛI÷Ú©®î%7”œIŸ”æ‰ÕPÿØ2#quÞ~Ñ¡fž‰Yø-ñù ÙIÂf AOä“î ¢j¸ç…þÎöI.È…~À/ä¢$r¿ÂͰƒùŽÕ@ç€'ÅbN\úý…=1ÈyÂ'Ø@RF§œaPšY÷:cƒ:#¡ûrÂð¬kÐe_!ý?ÿ²Õ\ò ­0Êj`qŽXE/—EΕ( ¸5ñT.yð\À…Gí¥˜Îʺf¤ürÿûV¼ª Œ¤«[º8o‹þ„)œ«~_-ë2õçŽ ‚,/Å“g·-¾ç¼‘ö:û;©lR†Ùbú+t¸°k¹ËzôwÙ—‘óKY µ¡B™kRŠ€¦5l¹ŽCþ¦Ðbì2ÝBÄëçîªô©‹Œx÷*Á|P€¾æ¼³ºÁQ&R%= -ϓɹ€E™AcE(T µ³*C¨ ®ÅJ‚í–U9C¯h…)ÔÄÜDqù˜DÆZÖŠ¢Ä¶äO¸úž×)Ø—V¶ÿݤƄ&*¼“k$Ëþ˜ùmrÁä½÷Wt€ÎäL®4] B«‡Q¶ ÿúrR%YéƒÌ«Qä[TIÑóÒVÚš\ÖS¶Å¼ñ§Ú"%÷'ÑÙ±²†¯ynÑ$¤3ý” ïWð<“„>h û^½×Z™‰–y›4È¿À- ;v²~&¾Á§óÜòdë˜rîì‰rð{åPì)¤¿1 £‘'I‘ÆdhôŒvQ-deeÒåbôp¨v’+ s7‹ò¾’kw¹pö½®Bp2LrAíþH¢t7ÐW*4!í¤ƒ}ÒÀ&#±Oìdf:lOÆ ™=cú3œÐ´2þ™Çßè+ä~0R ©JöAô'édìûlxÎQ#9³!d¯ÝØ1c%&ghŽÖÍzeŸt¥^håó ¶ëFpÐÿr@4öwèÏ%ÓBHIé¹ >^ã†DAâÛž‹½Ñ“t¯n€‘¨=|ó+ô®@â }¡Ei)Ýï^EÔ(ºëø]YæyÇâþG—;W‡eJ\Võz‚›³>¥Óµý0Ðs¥¥†Ús?—osZèy —¤€2Rœf!/Òû\¶5È0ƒRW3#MF ‰µu´lÝ…£ñ¹¨MÅPw-‘-ÎD—­yDó1Uâ²ÒtîÙâq<©A¢eT¨Ó(¹¼ë[VÛ@4dÉ,·,ŒØ…¿’°%ü]9¬Áü K {¯Ü¥=¼6u ê›Ë‚Ô­Ö$ÀOÒ}wU·èF’)Ä\ø0I]€•ËüF;KÇ×¥.u n«Ñî.~y;z‘;-™4°UJ~ ¬<šçm©^€­ ]ߨ›K\dõJz)$|B¡7-§†£€SŸmÉ̺&"<7‰]i…Kx|22RC¤¦NÙz²?£ë+ƒ4ƒ*]ŸÆÌ¯Ì18¿±åpLÚ7Zc3N7tzcnð  ÿõ#x)åï$ãd£ìƒÑ@(näU°Šô…|¾!Ë Ä]Ûøâ ¾)ƒ kªRpz|2:Ê 6j)´‘Ùr¸åÌÙ£/Ï(JbÖ¸³¹sÀUø€ãƒ<)£‚° sЮX 6°Æ·“6Ãùޤ¡¹±Al¾~ÄPŠ™"òÉ?V˜™:1Ø؉9‘#RB4‰’ÉãE[ ý¹¹Ð½P•¨Vû©ÑxÛ›ñ|#\•¢‘òþµ ºÆ¶z¶¼v#làpS3‰iZ(Ð\¼ [íG[Gáo¡GO5¹´r`àS¥|BÓd fsâÍb ¹¦#BY׿´¢&®p´” þœ$ ç߯ÈK3·ŽaE.YÈØ ÇëØôæÅß êñ½Ê)ÞÉÝ9^÷ø¬¥@–,þëÇàÔ—^‹¦œŸZ1Špmº"4#©÷ Ë2i‹\Ïn1°‡}¸\¶„3„ÖØh³?l. OÈ™™Ù:3aËlNrÕµ¹Îj¼g5WAæÕzhAKÐl¿˜3b)“gx©¢ƒì€L¢€Qfƒk¾úFdʌ΄MÊr÷óux‘Ýš¿Þê3sŠ.æeg›X!Fòûէ„ªÑ“}b@Ebå 3gÿF©”L)4É–h“š–FbLR¡ š÷0–M¥È0ÜÄg%– Võ1#þܲ›‡ç°®$n/3±†qHë¼}`™ƒï-¡ÊÞ‰q€ñý†ƒ‡gâÇ *´BÞØŸƒ:P!}0:oÆçä}ÒÇjw¿1„ýwÚDï³Îé­=Ó*T2 eûE”“A(ÿÇúí‘"/¡çÊ< =0è*û¤wPÞ2?áý‰ ØQc¶qi«Z©ðò OF#VÈ4¦a¿a“:I%¼¤ ÿÌ88„þàÜ8òä„o“Ë¢sc¾þkövPæ²Áði.ô¯SÃØ'ØádgläÓ'ÒÊ$yC® ;}G+bØ’ú‰!Xâ1™“<è%æÌØ_Ún"¹/¿,°•×LAGcE×äÕµm°ê¯ ìÞbq;4¬œ³ÜÌãÝíûÕEwý!±U8íÄ}{<(`äÑz ¿û¢ð:$6d»Ñ^‚£ì£ex ²"ˆ-%ÁîûSŽïñHg02ãê¥øaé•té.MîÖ·‚›ÝK4½]Tìÿ¬®¸£žnl#ŸŽ 8In`†VdGStq !(‹i Ýb-æær¢,{aÃ2[¦wº²5€RC´Ìñ×°’k•×–€’r˜Žù¨R¿¹al $£ º±O¦ñžxˆ3¸JL³rfˆf!¥ðò¦Ht "M”BÊ V&žb3ö…ËI%† ¸M˜ª,w<‡×œsµºÊø°°¹«OéêÈä;h…ªAGA˜…£Rt¡|›œîÔÝ)0‡q©Ô ¯xâJahˆþ¼£^ÊŒ±ÐÓ“†IF4–2í÷‹¡üÞåD‰Ü+±öãF9išyüÄ”³ι ºó¡üøÅ$¡¥ˆc§$†‘|ÐæD:M©' ÊΦœïdcïØ†ý`úhreÓ¼° ­ò˜1R,Èìvå)¸ùnR”O:aÐ6d!Ÿêd»¸6RÁ E ²í´üž•’ØŽèZ¢fòÆ5‘'òhh'=yÿà¹AÇI¸„ }c&ÔÛò…CirC>i-¨\ {çZÑ<²Á _ˆa_éÉhŒ†ü4PôŠ,Ö™r!Ÿ˜ƒÆ½‡•ÙLÔeèT;í'rR.F Tù¯Už– ‘=4)¸ßöÎ ó¥zeËwè W& Ã^YV é^Ç_IŒ&§ v®ìu®§1­>ðןIz’zlþÕÊŸ3ú[‘sL]h&²0_V ×VªH„ÑÔWn«k~€‚.e–ÃYË@"Nü> ÂH%ÒÌì “uM“°èBc:]ÀJNÑñÖÅ zÕ Z‰(-ÄÀ“4“>#Öû#dõJ>—E-°eIˆE£yËŠƒÓy™œ¢+wØ·RG-7Øâ—ŽÂ ˜›¼&o”×ZŽI³ Þ&i¤´0wR$¤9Ón‰Î4#s¸#ê¶pŒ©™™ÉÞÍîÑv²ÕËIËC˜5öVdMµ+$ ¶_ñÒdFd¹Ë¾²ìzbcN!ú+™:›(à ÖeQéÇ0&;ˆò9HI ÇÜëE}²&Ñè3LüÃÇb’RŒ„ ädA¾t¹iÒPåAfù_UÙã×oÈA1žFíT‰ëdOŒo”IÏ4áý¿“gä C8ž|J! ½†²³3Ÿ”ïèÆèÌÆ;ŒB_èñ687ª’;×ï¤ATO†£ß£ˆw3† ’¹jÌÉc(Z^”\ÑXÛµ¸—„V9„68Úò\ö‹Yh .ÒD?èÿBŽŽnèR#\ÆÛO6xš16r¦@KäÉþäùm¸&–y?ùõ¤œAö³ô:´FkÇYÿ™ #׉4²2ßhå +–áó ˜(òX:Ç Û¨•‘ÐÌæ%ÑNß)^:/ô"¥ „Œw¤’&e`•ºÿõ€Ç±¢Vëên…Fwm ‘S¤hî‡Ú…/%ÇêD¥¾¹E­7:¿ @ƒ¶ìÌ ¾”«üÉ—Õו{wñ‚ÈÀÈú'Ç{[U÷}+G"Ø*]™;bÔsyô¿sþc!¢ JðÆ©¼]´o”mÆ•£üäê £¾\Š=xT~eŽÉTZ昜•Gásc›´Nš!휬'ΨÂtD¡ËÊ`&Éвˆ§BÒÅÃñ$oÄ'84]®`Å48>н³\oäÿ†> “ÇälØÏÈ5GßÈŸÌOJÆ„¹ñþÎç;åÁÜØ•tÒ;*X^µˆaû†îÌÊ”uý%·&5N…RÂÓÌÙzc ¿#W˜Zðt[“`»ª¾ érñ«q¬ßkƒ'eÐ+I)B_Ð"“d”íëÜ(Èç_ß¼ðE _B¼,MoZc¦Ó—w½ —/xu’oØ{õT=e||5™}˜¢ç‰na–åËÇòeçÈ«,X!Ø›–ÜVš eЇ†LÆi×¢Kh£¯é¾i%ÈnðÒk¤ºçßñöéÕiˆ.ÖŒÄíkFïÃfœ[HÄßÍsË Zш/c£d¶D{Ðä~Aô ¿¯**…7 )l•V ’¨Äœ5§ Å6æ¶V¾“å8µKP¡ä8 5¶òe÷.Ž…‘zYÈuô`4 JŠmþvucjÛ¹2ÇÝ•©”J 0]öýmÐ7Êjvér&gÐXǹ€#ÏÊÆUèƒã"Mrbl¸»"WÜhýµ`"SÈ9ì¬ÝsÛïò„d4¨ÊUx(s«çEV)䌼C Èb«œ‰ê³Ôs¬•˜{S”^âŒb;÷}È‹T£ö‡k;é .í‹^½Ì…àá( ‰3q€$®“÷Oæ#"]v‘"Ol27Lc˜Œ 2øD <~ñŒF¢<3IÈûF?8ïƒ|1>©™¶‘ajŒ‡ÂCùÈÑÛ_ÚÚâ7ºÀbàI0n}.qZ–‚kºÙ6h>!uÐG[i;²±΂Vrf7Æ“yRç¤NæA5fÁÞ%ýD  #9{-CÂþÁþɘØàœìdw/Ìļȉ\°„=£5¾žÁgÇ–T¹8/¶ ùº1¾­É.t¨aÚQYøTŠRi'môy’däÌ|Yš(1˜>‡câù•x5î´ˆ; \Aü_¿¾þ›®_Ÿ¸ÀhJ ,~¥B7ÍßÑ(½¡Ø…¹ßÇ㻉ÊjK,ë—IWŸà–­¦ ª.„&`ÄÌ„XI†9²ŸâÃÓ]¦¬ÞF@aŽKà슭_¯Œ.3Þ@“À|DÌfFŠª“̬䄇0*#“I{ e…†POÚX‚ÃRȘ‘:H™±Qeñ\=·lu‹ mY]ŽÈ-Ç ûŽù€¤FøO…A±07’;Ñϰ "‡…eß6ÙŒÙ)FÊ\ '|"‚KBœS@z¬&QÆFQ¬SfHl¢½¡k¡ÖX~ƒÆ ëPZC„üÎóåèX[˜ÏÀzLhrDº×«…‚/Š)kJ”Eœå$‚âÒ„y¿çdÿŸ”“Ô¨-ÌK¶N›H n(1ŠK`¤—ü§dú¶RÝ£Ig 7ç³C˜x{› G„öΑé@eOèã7¶}) 5@¡¤ÁÔê“9Ùžä+”·Ý—÷Æ#‡ÞÅó›´Îá^R;iG\ßø1ù¥Ôí\•ïÏ ™õ“C—ÎÿGø:•¥*£ÐåWØ¥$§îtæ#6Ï·¶ƒ&¡çB*"T8á|\'M©îNQ¢µP”²p*”gfÿm|6’ñ}§WÊÉ„¶ñ=ÑŽ55¾ðíbžåLèÁ‘Éʳƒ±5†®Igy T(èF.¨0aV¶IÛɲ§G‹~¦#&ï–Aš¤Eh$ŠeòÏïP¡ÿ ¾¡éœ+Íï‰Lí<íKÿ¼^éµ ¼þ÷úÿÕßê¿ù™‹rsÿè—?¬m#ŠÌ4âˆGáôõ<ôK!¢_Žh}ÎÝ6¸Yá,„ÊaÒ›–‡/=jÞ*`µ|×çDïZ^iÚ &ÿó^åÑù¢Ù#Œˆ'ËËë}˜“íÜô"7¸¦R:¥Í\ëÌ ,˜[qºKLw±¨cÇ#½üÍ_w " LŸ­/Ù"¢89ǧÙDÝÍ,ESD—luH¨‚Õ{ FÜß~Ç= é™X]æw%êâ²hEö¹¤HÃg^”Ê´j޶T B±…¸ãMãòí “T™•6_nn2é™m0èsSãê”Æ&´Dõ5àºè÷IeT†Q ׸Úc€1wòŽfÒõ@uFûáæ,T[²á ÷”M®툩R¢$¥§Hk <'û`Ê‹×2Ü2çd›Bx1Ô„ãwÆßáŠö~ ©±û"ä }çsð_2üóg`n óƼؔt+]}†Ú…œŒ‹z@%’Ñ- #Ñ0bJ‰ìhÛ€AäÝøl¼}¢‚lÌ„(z‘:óñÆ>9/ê’é™”?ÐŽ½ñ|‡Á7z¢=)Ý"?Hö î$!èÎܰÌè䥢G"WåšRÜû3ô†%ÎÁ>Â'ãØ˜B®Ìeýkü¥ü Šú¿Rþ M¤…éïøgøÆy±%Ú€Ÿ”?l ?9âµË`ƒ’IoAç>µqÒ|ÌɆ}"•ú7:í&[&W憽ñÜØ+©¢‰¢´ì™>¡„…8%ªØxC#‡øÁë¸+¤ÄÿÝâßþüù“½!ñï}dT÷kD—£½¶Þ~;†ê‚õ_ÛÒbÙ¾Sü"U,¢¤ð2ÄÙMË×kõÍ@bf!cÍØ[‰¼f²SñÜÿ@_cÞ„P–ùŽŒOC¯o=ÖÁD0ÕeK»2qû–â—º:Ï>Ì¡ÑØw53-¸s™hÞþ96ûØÂBIœÂ#0}4Qåý‰mcóÁ­ö;éWÌÛÛ?fâ*|ïqÌÞ)ñ¦îNÌŒQ'il²®ºP'6àâr¼u2/ò¯µw†~ñ¦4ŸãÒJq>{Š¢m&ŽÌçdŸ Å ÓH•ªTá3Q2é o‘mL!7ÆŽ!ê‰$f`¶¤¹e e³…–Ð? å‰M´D9›” ƃ| ·®¼Ú*O5#ƒ­Ñ2G£yò»rî™Sxß9@ôù£rm0=y{ò¿üƒß .cr‘ÖcVÚÀ§ögì™O ³÷=qeä$ôo<ßø­1M(Qß–ŸãD/rãʼ+c0)ÅNï„÷’s°kVŠÑ5&ØT#CÚ 0ŒT¸Œí-lOÇ6ãòy’~rÏÞ'–ÑBQ®lÈÁü†ü7äŸÐïd£tÆïÌÌV™°ÿâÿ=3.ª‘þ ü3íoÌo°&Ú3?_LÁ è'v-Ý¥7ÛFð˽¨Ý7.CZ4BJÅ Ö°ß)?¹NRGzP›2PxJp+¼©6—®?íàõ_¶ƒþäõ5lÿÇ[Å¿Šñÿ¹üú[gÏ‚±¬Öë¾RnNÀíÈÈ*f؇½ú÷§ü|A”Ò#—ÔתkÌ¡.f}%Õâ£æˆ|Ü#²{mÞM›NŠMÈÑC<ëwɨak\”û4 &Ôg0—eõ·]ý0îmR‘‰M¦…è4QޏOõ=ÄmñgaL“QÉˌܢµÅø4þùlãÜ™F§ûú”ƒš°ŠÔ>äGè,‚™D‡_ 8ÉJ³ ?nʤ }fpÜCÑÉB¡ðèè?ÄÇ?ñ·ÊÇEžäÄ/å·D¯Á¦ðAâÓçÊ Ý‘}Ù=e>&{î„,4å‘xÀ5H *c¹Ý¥‚娤³b…ì¶B€"ÕùŽ…ë$Ö Aб´xè‘‹œ½1ˇPbØ‹³çíÅø•ÙÞAI®üö‹qÑ;Åíšã‰6Ä).3“~CÆE¾ÂNã1ùœZDŽ;È,&ÏÆ¨Wöuƒî!ZÅšéÂј„‡ÆØÐLýŸ)ÿ`"é-œt.Ò“Ih©†\·Îr—\‰™c$NY}õØÏ i§çŽ=Ø2ͨBOèÁ·Ä~ðÓ;×N:øaür·óJÊ1ð½_lN4z#}²ŸXæ#sdҠ路8¶hü‚$ÚIµPaؤ¯Ñê–Ñä㢴N.‹ï?âVšr½± –i[h5v¡Ë+kq)€SHUÙÜ?®‘FìFzÐ å@JO1ˆ¦ }ç½ó«ð6HÊ0¶„ìtw.[œœÁœÞŸo†ŒÊcáT°×Ø+³eª —2ÚÑ3•÷ð9Ð7êIúEí|nÌhõ™H® nÈ€wª1f<)é“Òh°R1 Íeª¡Q·UƒFî!?–)ŸÐÑLªÔŠffçÇ'Ÿ 5ÆÆ£ÓÿÎx¢¶zH•TÈ™Ù)ÿBÿò¤|`Ƚ0 ö@…ïÊ?á_0%ÃèlG •r­ðO|ü @ʤ+‘=^¼¹àD:¹1`;°ÉlŒ=8o•¼w˜&¹³uøÉ9IÒàD=‘m™¦Ô`¯9Vœÿ/èüÿå o—ÿ,½ñ«U ¯t>-3ŒÈñ]ÒìFo)Òdn" ߌOÉkÜñ ÌtWeF„»-j¼PµÈü‚ …LÉ驮ΌððE—£GÏYºü¦wk¹WÞïL!+ûƒ»yDB$žWd''‡Žë7áÈ(”?Ñÿ>©™}p&Â…<ˆ0wú;ýJH¤ ОÞÂn–­í4R ̘^“Ù‡úL¾d2zC­‰Œ>9kÝå ãÿô?ýÏÿ/C§¥Y»çæB½çüBX^PÊüö[ÿw Íÿ¯_V$Ú°w(1Å·šïï<™µS&&®°¼ýæ'ši°ûebóØìE7k®kˆ“™ßKXåù×›.Ã^–&> ¦8&¾ áŠÄºŒwäÛî_î»f ˆÓ-¿­_a„5jѵtfúò v* Lß݇5I¶ª<º»Óåtá9ƒlsǶ"Sp9ÒÜ©“mºØaÀ×·äVõêʯa2z`3°„Æ/=™efqÃ['«gßAèövf¤ì‰?ÿ&r· È*GˆÙg›÷îuAIw—“H|ã¹±Ù²˜™z¢ø9 Ô¨° g"u¤û^B ˜ÝCR I8ï‰ßƒ=¡A Ó‚r¥¢Ü•­øm ÀgcÇ_mÎÀ>¦15‰•¹ÑLdß´˜„˜“ÜZ ÂÝüø‡° žowA„mÐ DrpÓÝ’èJƒ2ÀçäͶs;üê¼ —„JÑ)ÃEizäoÊaáHäéÇßùI¤ tŒ¨ËXŠÒ…kF+í¤À ŒHé”8;?#5º6bè'}²+³ÓiÔDŽ.i¥øWbrb˜ÅîhÞæ‰Ë¤MjC–JG²G©¢ÂåäL¼u?7zô±\Hd˜ÊPâ\Èp¦ DÞàØÈ­„L;ȃq8j$«h+ƒ*‹Ƀܩ‰i›%'ù Mf!ߘ³Æ7 }²W†‘Ú'C]$íÜÈùÿ¡!Ìók©ûZqµáå„÷¢?†•ˆ~é=°”5}4º¾ÿ‹‰îäÛßÿðegÁÞ¸=c ß|þùªýYÐmÈ“¨mìOPzà)\ÌŽV·ÄOÊ"-yÍ«¾qÍ ¤Fß¹“L+̉$×QH;ª4!šDh„Ä(ˆá¤ƒqrû…6†Ð#{à \#!DjrlÚÔókrÑV£)gá)¤F„ÈiÚ^`–>’™‰Ü™=iŸpÌ$ý€N>˜v5B&e²oÝ‘"gak  u.rLȤ7¤•˜]MÌæ7‚Õç›ò€²vê¤7rå|ã6¨¶ ¡²XÿuòþÁ,œ…d´…F¸Ò³oœÈD7ÒjF­ókÑU—å$L%&Bá3²'ŽÄš£O¤ÃZ´DÙ+ŸJÌF©þyÍXInÔIlË’7y¸LŽÈÕlæ€Ì,Èæ¤îlÂöD2¿"¡sÜÉ2\˜ÆC³™ÓŽlÈ…¾ÃõD;Û¿ ÿéêƒm2#çt™Xï_ª´à‹c×>슶’¦ŒÊ¥SMÅ/3;—“& ë)7(KoõàòOF£ z$©»±o¼Àæ¢Üq0§/›ú®œÂTrᜤA”зeÒٔǛ/'O­Ì'ï&_x%ü 7r¥žîÕeË\(çdûÅù¤lÔ áo„n„Ù„&³,JH§Ru¹òV8"»ÅÈÎÛI‡K$<©´ŽB9™ÊÖéç­~pÿÛ"Lä;'äAÄt åÑ\ÍßÜTÂ7fQlë ­zÔQé>)¶AúRïèþ©a'#ù‡Š&ÙaЄd’JQ´ÙxdrK‘šÑ¿ÿ 'Œ„4bwºKÛQakÎ4í‰è“Í´Ò.þ$ØúñìPˆÁ×GíªÙ†]ßȉ4œ«Cåv§ÿÉó“½ÑM„ª›p­!ué˜H½%ììl‚$~)·+ 323’a'ÀOáŸJ¹"…lŒ„R¤«+èI)Mä U䉞 ¤H7ÕD/\Z…¹ÑÍ¡!#-‘äú›49ÛJÿÒ•¹“”rÐ.ÌDœñé2]È*N;h‰9” On‚&ôå³°+šH'­£fís§%ŠÒ oHg mpF¶< Ñ ûÉ1]U/Ô+ÛÉ6háÂ3’7æÆ`¾2#!ÓÙD4a3:’ÊÆüxr®•ÒÝS®ô7ôŠNnwº:¼qF6‰-r4öF»3H£oHãbæEJ‹lObç0ŽFu$gQÂöƒ¸Aà~qMu6—yÐ9`:•yD×>Jù9pÿÅüò“ „ߌߤɑ¹(˜wÈty¸ W,Ä·C!T’"}[³±¯bp–B½Ê—G#+^c¼‘WüZ‘4&/\+ÔT™¾½‚Fdƒm†™D§ñ™zÆXP@laB$-k*æ·Cúö:º„3¿r•þWë¿"~N¾ÌgäµÀ¥>UÜ%ÊÿîH”|ˋߒ­‚ö™êZ©µû:½súl@V^´”ilî/\ H‚‚JëÕlÑñ¥æ*¼º‘ù­{@\ö™äŸ‚UûÏîu“ ¢u’£3—ôyaºÐФ Ê¡ ×J‡ÜÀ ÂÞ«•*²“_X„®q·íå.™r¿ ‹³<68Í-d§äËIz0‚ËšÖ7.•˜ÙÅ«÷ƒ89þˆˆÕYvg š(ƒÚ‰BØèÉ…±ïfB¦çj§ì„ÌÙ˜'ò‹vg.?s.´;Ðî‹ÑQ’³¡úJ¨](Ùœ—žÄ˜^Íø †yÏ6².£…“i–X¸Ç¤d4²+§-.e‘ü¡{<ØÏ/£("Œ5lþ¼“##S.ÔÆ‘œ`C½Bäy¯Œ@Ën;O¤3&÷ÁõD³!ÇòBH„¸Qo'ýtbg̵n*Ú™°GšÐ.lÕËÕiBž\N*ôD‹JpPa¶H²B”±¸JÔ}=ßç²2Ô1&9ËLœ*ñ¦µÒ˜f¯x2>‰ƒ^oÄ “v’:% …±3¯h¡¸qœBßЃˇ/Ø· ©È ,}º˜œðvIôçoê?ùËšé&n–ÉSLžÞ‘¤LØÐÂv¢ÿ™ç'3SNŽÊµÒßo¤B5ˆ8z¥(/YqK /'¥oŒÆûÇêÂùž„ÃôáUÞ.°á®º„1¼ä_ÍŸ(]‰wêœi‹y•"5PÌ ¤óóÉ#Q%’¼|ãq!PÆddTx&nO.ÿ ¿Óv÷`éuÇJÿç ³q{òHlºD> (zGŸŒB(¤°y¶-t ÐHŠnílÃ#{Y}°gîD³{§wO¨=»|ÔNÂÝîlUø5ý3×0ôIì—étW©¸F>òN»p…jÇ3Hþp•›®lÚ&„0)ð{ò#ó™äz“­O„Déˆð{ãš`gÚðüJØ™爩ä‰Lžy§lÁµwZ ¦¡’âei외4†R'qrm<”(´DŒp¹{M"ÏäŠ6ÊÉSH'Û/æ•*p'žîûÖ S(¶'eÖ]ÐaÛ™Bhl•*ôÈãK`Ææ~Ô!úT?íÌ }goòäNï„Ý•HÂ/ÊRùÇ'oJoœ÷IÏÌì¤F ÔȹS¢Û¢Pу~'}¢'³Ñןô+ùí$S ÍèNƒ­ oÄ̹ *t’ßÞÏè[ÜáIz2Ÿnö`é¶èKg<ÑJ‚QPSkïp23#³#­¶Xð6_ö~ß„‹õå¼ø ýøŸ’kÎþ%E­I„´¢*KÛY—Õí\jVÆLÙª|NZЖUþˆû`XÐ|T¯ Ú}”ìQ\B’ö wò{$ä¶ð]Ùf.ÇùWŸaþ”VÖ¦a€Ì\"žÃ×|[Öòòca\+yh|AöËNGÍCJýW,†ÚÎÃPaù¼ÎÑzU«Ãƒ5ŸúÚaRÖcŵ¶¼´ÒË$kØu¹lGì“Gçvø¯X¸WH“:¸œÙãÝ€ØÈÕÓ†.i뫜%\žôî(â:q Êù“$ô„Ý/…9ØžŒ_„ßh#jZµpddúÎþQ(†-™,^ a/´IMä@zRÅ«ÈV—†kOë¢;7¨ š;ðœÌæ)Ctá£^Éê…ü ´ƒœÝÔir‡@Ïþ¡R¡’FGò·öÚ:-+"£0L<Ãp¤ÁL¤L7&Þ`¬aF~‡¿1Íd-ùÊYHvn߈ŠNž“”ÈÂØÜò¾+ñ¤L“X 2ÈÖ}‚˜ÇSB3Å&LåØ:áwôÁâ“ÛÉ¡.iŠžÆ(³d9.¼)瓱13;TeX•]¨‘pÒ+é¹è {¢+§"eí9/w SWlfk‘ ²…Ñx2'Þ&ç$tz '®æ“|OêIªÎ£i#òÈ0xû`û“çð@š&# “<¦ê‘‰ö8¦ù»E4„þŽ4† MÑý¡üeÐlûäÎyž$å(¼É2½jvÔ%š©´ {£ ÓF£! rå8\Ö7ßÑš™iYH&òNxðø EhyB@íÊm£â†ìTÚ2×q‹–iYRãÒ&)s&?ù4øpÃË‘IVó=¬êØ|þ^TB‹S,Ý1¾)hñ†”%Î7ç—è Õ†¯å·P…â*ó ¢¥Ò'àfOÓä|_õþ+\¨‹Ø0VÊYߪã¹F©º¢¬ÁDa~•‡à—…_ÓãÙ\SðÒÏÞ4'fq²ÊkÊj„½øæ²Ì,Wò:isºD¾Ï±»û¨|‰úIvMÓo ¦ºŽ_–ß IDATΞ«â3Æ`38üb€›|õ@š#9ºÜf G k³Ô8ìFM3îMR_þŠ‘ARóð ”IJ%(UÎÊ¡¼âP@MÜN:Þ ØLu†‰í‚YaŽmÈŸ |uH$ú$>Bˆj¢gRv~ª#K‰¹Xí2˜wú³ðÅì\Â\ŠIè~3 œ#qi<¬7²\µ¤›™èFN´‹FúÈ•~ó¦ÊÖµœÊr£èî&TT=Rkf¾opAÒéBy–„FY¾Á·=õüW²—¯"Ú¶yð™îR–ƒ ˜ÝËfý¶¼ÛXóR¾e2o ¦ã6Áz‹+ëZ7SëáÚtÕà,¶4èrž/{…•ä¢1-/V¸ƒEi¹w2ÔˆNg1É`<àŠËS|gÞ]Ø”–¨Â¶±e>ÛfMêPZM^Tš:ö•l gÝÞ„I:¿D¤žHê‹1è +2}©bˆ,êað‘Æ0UH›BêtÚ¾]…U¸B·›ÄŒXŸËOt§tš‰…Y­ÑÈœ¤IûÓÙaù…I¥ü'ôÓA Œâì#MìJ}:‹C ‹¨î^;Œ+ã%öw’OôD*Ò Œæ¨¤L›4¥$Fch§7¦QùÏ?ôeû¤s¿Ožw2\#UÝIwãÉ‘08`›èÁxÐ+±ºw)BÄθvæ ½ªÃ·æov†œÝI÷qºvˆÖ›{ÆÙªc‚šà ‹zåöËu›Ÿ *©2…fFl•M韴ƒpîŒØ+Å È;:û_ ›¢“~#ÙônC7z§?‘AÈŽ[ây¸±‚nÄJŒƒ48›.Γn¬K]šNÆIB±“„¾Œ‚q!%zå2hfüéImäI“g \9o\ldRHÂL‹^!ˆ-`šŸ:XdE¡‘khdB„áî†"b:y’È ¬´l)ë²-4ÃËS]ÑäÛ@V@‚Ow¿ù†¼`¤g$›7è·4ƒ‡r®¸ _pÉB*ÄíPÿ‚T¾ÌÂ4æ¢ÊHêûߢ~oÉ Ž³ús¥âû8éøâé¹6m^dMœ¯ýb9é…žGï*¬d“ÀܼËó¯èˆ—Ê›ý¼->mŽßæØ ¶i°€nkw,~e hgok¦Ûrm[8ª¯A3É'B.sÆRÚ"œ‘‹Áƒ™aŠ1  &ŠºkËÖ*\Ø‚sE|y­³ö“ÕgѦâ+ɉOÖ=èrøbUóÕ†®›jT_³q…FfB:á“Øè6öLý…«/Û-;CÉЄd œÆ’¡Ž™ƒxÿA¸3Ìi20’«ø¢ˆøm¢‚vʪ|ë:óñƒ¸!J¯ä§û'[ë³¶=‘Ì8B"rãl„å1 ¤2z%mTA#AÙ*ýÁ˜ÄĦøQIâ¹ þ\"íI<8OÞ6ÆU4’ŠSqÂûFœœ(ÉG&ŸÛ'u ƒýéB=³Ð„ÛtÎH›ÌF‡Y:7gâ»hG…‚ÓN¸U´ûá'üìt¡&.P$ÅR)Î$n;õÆ­!wfã(\ 6ˆÌÌÜ“žÙwZ&ldaFÚ…$ŒAMì¤2!Ãoåv¢‰zIº#ŸLè7Ò 6­“ŠWëv—Žw¶Ðù$4æÉì„Fš:D¬ä?Î1gGSê>™¿¨í@ý€@TôÎøMSFåÇ ŸOW)Ç!L1pê2ëNÁõQææáH3å‚ ÁòŸz“'Gd+Óñ54ß šÖÐJln-fÅé ùÂÖµQÅÊ@Vm‘Ú¿V>p¯ ‰³ˆ@pê䪿¼œôõ¶˜È¢$o`¯¡ …xá?V¤[p\IË ¼lÑ‚«MÉâO“Öéê‘QuQ}¬*/ëQœ„%Ý,ÌÆË]ÉêR‹¹3p÷#k)$uJx]Kyº®)Dèâ28Æ«)K$U#({@²Ã÷ùd6G6BJÄá»ÅÖ¾E¬BJŒè8Û1Ø2ýIšœ‚|úÎÁ8¸˜8s¢ë"‰¨ïÁ .6öØ‘‰~Rž^‘ŒO¶? 77߬#/ŒÈlOB#N‚lÌɵÒ'}aÐ NRàyC®Ä Ao•íJ”'g#½¡‡ÄIïäÂxþ…ç?!_ …ãoˆ°ïÄ.Ç$vÒ $îòAVB  fEND‘crý¤ —Îgârò©ãž'?±CˆÂmðGãZ™Ê(”Ì]ȦQqå8 \Ñ ³'}27†¥ó(\•ç ~ïôF5¬/ Þþä<™¦Za6Å“ØèH¥ôɵqûèÒ¨ÍÈ'ñ™8"%1 )gà¦ÌæÌútP+û…c.Y¸X}£uÊÉa…æß æDŸˆØVàþd>¸<ÐÀØÑBø“y'Þ Ì;±qØv”7³R1Pš½ÂŽü þ;xsÐ![X˜$!Fjó™|2vI²Nzú@¦Mb!]|kß°šÄ·L<Œ‡¥+ù(^ùá;ÆC·8–mϪ­ t$D7çS\TË–uI½y}%‚áÈùKÍJïWImå°Ï™ñˆãIB÷úðÕ$<²‡ÕH W„ÑŠÓ~Xp¿ ÊæÂ—0ÂÆph¼ð&TÃÓ:1Ó#ÛÉBr;ë|¢…49) ËR²³ÑÕ–(­ûeAM¡qéœÉSšíÓHÎ>*Ÿ•\©™^Ød:$aSJæù>ÿÊ5p&gˆu!vÈOÎH(ŒKG•º3v’#ò;Ï7ÆŽ<ˆ'¡;C/DÒÍkˆ¤H¢R UF Ja ñ$ŒÈ餤ÎY¶OêIÊpE~"ù$t†pÈèâ¹£;ýšyHt!m Åøô ´êñ6Bï̧ƒ´ýÁ¾8ñiЄŒ¹OÇŽm¹Ã(ºÞÙ„ÍŸÄŸ·—º¤|Þ½ønÀËñ•®îfùÁ$ á±—%t·= ¬¯Þ ØÝ“vý–É6„%æóJKé{²’Ä\ÉĬTÜ“Ë~¦û&ZXù@ÉÕRÖ>­|18C„ˆòeiÐDX°¾¿yd­Ã/€(¬÷ý/¾_±èÊYÁæøcuTÓ†žÌ¥Â$|kVÂ×ñËJƒgˆ89ÅÚ'a°)…#rUº¡4â³µ NåRéVûŸ´@’PÙ¤Œ3Ax&.ynhvüi¾ü+ Ò„AM~J„¯E6Û¤³ô3iÁ¡Ñ‡'3ä uöKX'GÔy\šÁö•ÎÅÑZÃpYªŠ²#â«O(é MúI:i†CFBÅ'±¶\Ò@úR÷ȴ߈MËq!OÁUKåÝ—Û³àP²Iì‰ïQ[ý‘ǃҩ™G&HÐØc£^˜7÷%®#s²t‹2J8aº0QOô‚¼±%T©…íί;?”C›o0ô t:äßÎR‹'óôÅÝÏÌm S‰¡‘vú;9rÂõIücðãÃÎjf˜ÁN¦n”@¨$ÓjH§*Ê 4q;ù•Èœ”ƒžÈYœº"©#wÇ™UÈv?wô‰ úÅuÇÆPÒëq2þÉõ?Ðîäá|Û?ïûož UDŒ>ÐÁv’+§2ÿd~ ý·è¿áz¡æe|­T ŠTz§Nr'˜;5â2]( *5gÜE’7t'\ Réwj#ë·:0p²=9æòB06—¢‘4é•P}‘ÂçìÃ"R3s#=ˆ‘g3Zx€&¸¾¥Ê/ÍqªÉ„P}¯ ¾1R–­Õ Òeͼ¡º×ÀÀÒƒõ¦Ê«Ó)}þóÓƒ¦SßV(5Å_‹Töšóõ¯ú 䙎>±üI«X$È©î-gczY[löR£Â¢ŠvßÄóüo€’I둹1m'(¬^¨úŠÎ6Ê_•ï©´myuÔyAfÖ¨Kw/¬F$¬óf%®—ò›@‰2yB«î6Õ FTÚFPúNTR'ç¾f9R©ÂHŽÔÌViVÆ.¦A´Ò»-s>ao4[{J÷n œœfi¹î?»1æk¾ à¤ò2Áå=ÌbLð6Ë~Ò¼ID\ÈZ!ßûµg]:Z"7Ÿ…¤Ž5Z©2*±»;Ø‘¡'²sšb»xf:+©Ò!Ùjñ$ ŠÐ“ï”ô+i-„Û©–N=¸FZ¥5èäÆTFp¨³‰?çŠg"sM\áØh‰Ô¸ü")D0zt¤LN!z¤ÜhBÞ9{B#a³Ñ©3””¨—B3ŠÁÜèOB"nŒ¿Pv´¸2Ç¥0VÝ-‘Þ)Âaú@~£•>Ø„ú$F®wî‰kæSÙ  öA èB#eêIl‰y£7½¨FIlÊ)¤“–üÙlæŸ!„ ›ePHÃã`ŸìUÎBN„I?aòxçòwÆŽFäAí®Õ.„BÞ2ü•Y¼RÑDÜù¼òÞ‰Šþ`ü$F¤þGâ͸Åt:'s‚TÐ Q¡Tª"(L¥Bsì·ؘÉmëß:ÏÁ,ðŽ\é‰)ÞjK7ŽBƒýÉ4´Oúo¶¾ìT‹ïij€äútÉÎf'vßí°C5똾ÆÑ4Ž¢_wËeÆùëÁÍgš¸|\÷Ñ|©gƒ,º›7:âì1}ƒ—¾PO䆯ÅÇ3&½"ë´™¶éÂoXWn@¨º*'Öîw˜‘@«”éIÝô2›åkq+.ï3 ¼1ŠÁQ¢Ò:{D òD#¥S ÚÁÖÐÊìÂù ž¤um{èfØ+(ÊçäÇÁ9ÐÈŒ\vŽÌžé‰äÚ˜óÿßyœ´!ùl󜔓¶‘6æÁóN1tô¤FÞur {ô=†KâWàÇ ›y†AsÁ¶“½sV:D!ÂäÞ) ¿™¥Ê9Ñàþ-up­¨0"RDL²»Ò¢ƒ¨š ïˆÝ“‰èI<~<©™^Ùáœ\+ÏH¼P®èruvƒÈúOÚ‰¶E=ªPÈŸÈÜ;r!F²0ÃÚ»äæÏ³¸uë4s‚“f+{øö¯6ΞF™´NŠô &½#ý7û?m˜KÇ£k®ôÊìÌ o‚k!ý@ñ˜  j}äp¿ß¡ÌŠtæ.©iŒŠˆO¸{M/_ÿ/V¶¿ìPLý*¼~fe‹Wß ë 7TT¿Åî/ä^¾…3 Ö/s+]®âÂè×òw7èÆ Ž.M†ÚÞÈ•pôë _ÈkSa7}c‹%±`¦E+a(¾C‘"‚Ï*ƒ•oKöÖÎ8¶ÞÙéÃßÑ’ 8’5lø†;éóf²U¯¹d‘‚ûØ™;‡‰Ç9Œ. Â'º–L±Ç¶U'0!‘„Ó|š2éI}t£f'âÊ:¢B„Üyöæl–Wv˜wJ¥'¦"®²8=÷ÄÅò4²³m¦ä3ùÄÛ.GQäHµFd2 d «RŠ2lAfz!¢f›#Î%}olß´u¯d¤¯vª¹'¢ÂÛÁ9” Í„ì¶J¬ómûö O7(îJiD˜'cjØè‰$ %+ÔŽ_‘ÎXuŒ©†È“Ñ)ÊÈôBÒ¶îŠBÝ 0ƒȰ!WT ‘büñw¶aògåg5è–»ºÕ‰(º£‰gçoŸ|*Û“¦ŒƒüËÕj`|ü[Ê müh<:Òà@}ã‡òÎHÎȤBg¶FOä õ‰DòäŸpNâ h”Æ)Gb`²¹J$ó\¼’vZgKÌ õ/\o<3±Zèo¤¸úô¥.);oŠ$ª2†A‚2÷w®GE®\:ÏÄž¨ƒõŽ|ЛcªÊÁ½1å$M¸2!³ÿàãÂö“G"íäñÆNˆlËMïÈë5;ãéI¿Ó"ØgçìÄùƒ™ÝÞ½´P郷õ`vº’ý ý/äOÒwœ“”“1\Ð `á¾°I$8„”`‡Éh´I䓨é'ó$4Â$l\»0%‹Ÿ¯Úy®H: B‡4=€ëp{ÃUÒWTw Äâ‘‘y¬¦³'R_ ¾úÓW!,«ô³0d€Ú”%c‡´,P Ù+=³BWN2ÂŒ.µ}‡ã×·MN^}À*¤=öyͲ^*¬ã·Hm9CÖçM/Eþ@XbD¯ ¤›XÑ:˜p.u–•üR‚ k}:Etóe[@Ëk1Õ€&ý†e‡•æ‚5u-a`YÖ6¶:1p$Ê༓ äöŒTôpÉ_ƒ¿ìlw;Ÿ‰®(›•Q8.>AÂ¥¢ƒº“ 8^s~ñ*8à‚‘ºä`« 2i`SjZÌ1umÞÚàÛOÂÚLë.…‰VÊ{Õv¾ÔJdÉðþ}cºBEm.“i¦bÛ9mDkH]F$j'FâNÇ9×¶Fdð‘â‹)Š›ú¦HìÁ“Ǚ˭LØ•c8(wTä$`s/õ³‘…ÚÐ@\Æ;ê?O"Ì‹ç5Oø“¬ôÈÞ¨…Û•ü•Ò á!ìo™':(Rù nyd[iÉfN'û'mpB§ Þ7Ž+{a¾ÑñäìÌBNØwŽÌ5ðÛæÏ¶Òu"ÉEØéҧðvpvú'é“®ì¿ÉƒzÀŸè>ˆKå1QÈ­ÌØìp§(À)l¿iÕq¼]]I">I¶Pu£¡¨nŸB$î.ߟNF#J ýôé}~rtJ£ÿAùà|€-XpçY‰Öâ?Ým¢)%ðØ]‘-ÝHoÄžé$Ì í'—”–ÉB½6×›«#z¸ôJKÎU“Jô ýF®¨ AOÜ”q%4ºqV‰YzÉÍÄo6ø [r¥¬¾®H‚N¯ÄŽLªÀ|áæòU¸‡nR\³ï“&_èXìW±o±uµáެˆG%NÚ’»aº3Ñ«ÊÆœ]moâ¥L·ºu]mÊ×_†/óE#È;‹U…|ÛD{éF¼¸­Žã³"Å7ž¨Ï™×Iñó4]úTñnÉÃÍú¼º”î Ë 6¿íÈn¿p-?ÕÕÍl‹ø5ð+”^Ÿ:ø4ÞÛ…è;½s’ÒRO Þî¸?‰)¸‰K2´ˆ˜î ´‚ˆ{ÃF%)5!fo}LW.4®…]>ƒ‰E‘FWÊ GT!áŒoãªÈc)½n Œâ¯VSâu}dšQøÚVY­ÏÂåzôím£l:Ó)¸ã‚T¦–5`Êê¨V"¸GVTè÷™ôµKlÀ´U É ¿è*W@Od(&® ŽJIpä¡+aÙ[è´>€î½ˆÀ”<Çp(#qiTÈœNî삌µL®ä5 Ç Á_ëßk>OßHH. dæ´’;RQv/OŽÀn~Ӹĝœ}0mŠ+¤¶\êÄ9¯%PÕãK¢ÑivH»ÍÒ9Qƒ¸BÜv BÏTK–‘)ÔÁûÁ# ¬ÔHÚƒ«pî ŒDL³´„^è‰wá‘¿Hh£#‘Tø½ñïsrÚ4âp‘>ŒÑWüÊ–Éi½{§ôÈ;û¤ÀˆÌàkƵpUb§ÌH˜4Û4îä tžVÌN΄¼Ó¯„͉^¾‘—¹MÂÏâj™Þú˜hÙh÷Djþ˜K#FÆN‹„æMö$1T Of£*¥žt¡Ä–Ðà" ÃÕNP†ÉY+s’ÍvÍ4î¨5J¥™©u¤N‹¡Cîô‚^;R˜wâ¤'4b Nd_>¦¹rnˆÒ~P:Tf‡N0Îßðb§_‘w°•º yP#çOÊrGÔÅCâÑ‘BØI;u£XieÛïïha7ûÕg'‘ìlOª@ YðéÌEà–°ÂâkŠû*§¦Å»ÿÀþ¿P_&^ÑÑá³Çô1àüb¶xÔýŽ·àyBÖû¶ätþ±_ÇèÌà¼iYZ&Ôº IDATøŽ_oä*í¶Ì•\ÓuíÙ¯ææÕFØNÖLËBá dÿ?ïI&&Y<{9ô¼àþ¹ xW`¶iŽ ©)Œëë_ÚÒËÄæË¥º>ãì¤ÿƒ¶w_Ž$KÎü~îç‘ TU7¹ÔJzqdû`ó´2ÉÈ%gº y‰8×î'™áÐVfZXY[ @f"»þ]ú§œ-CKä:ïÕbÀ¨¢85—…[*¥,Ï¢É”È ôk´}’ô#µÍÝÍævòP*0ÃÇÍOL«T¡ï¡MHì“6˜5~.¸‹RÑézfBW.žOîsPö0¯/ÊíƒN¸t ©°yD]Ì÷ᬱIб¬¢ âþ*#ØoY™c•ÆØ'÷ÊnÆ&!b¼c`'©qÍü.Qc6'fŽå¸§)f 3³M2ˆò¡¨ðþäq¥O®þwûàéáíàØéƒï…gŠ7o±µž“oÂoÆ/‰?ïìòTçOʯÊY¨uywì ;!u‚ûÁ%ŠqÂ&L û¦ªÈ•Gb÷\É®4áYø.<$‚¤Ì6x ²‘ Ú8J5¥P§›¼²q&&Œ;ÜIC¥h™žQ'h%(¤D-J*¼oüž&Þ”O±î¢q1žƒ –C3m‹lEqu}£B+tcS£ò†ipƒ-jÌÁ ¹ i¥ïdmæN‹ÍÖ£SSø µïèél•Y˜Fúˆ}$† lƒBrŸg£x¦·Wwc4Ô©Þ'½ÆûH¦ËPÜW¤bÙ¾Se1dp†ƒ­yœtÅB]ç§á;‹Ê’hE›Lx¦GöLR_J+§œÎh‡ýÉ;]šÅœ›+„ÖÏ/åG÷C?ÜuXcQYø1 x?ûÙž¨ú¢Î¬ à ¦¬«ŽhоFš´ àˆÿõ”tý~Iƒ(5—ãn –^˜¸ÍÐŲóPò ƒÚcÛì€[_ËdÜ3òºªkèü’¸ÓŽÿU×è¦78£lcýÆçòÆðü¯/—Â[þÜ™jœBYF°~‡NâÞ© àyi{[´IäÛt˜JimôWiì¨ð̼uÎ…C‚8éB±PäYZâd_WHäÑ«ÅïËs»’Ð6j‰©hÊŒ(`y1Á©’7nŠuö;óƒ|,€Hã7ØL²ƒr5†›møìšÑŽèñÆ™ŒÆ4JÃ,â.ògãâöAʽíƒNVÆ•ÚàÎxrýÉlá3‘;"ôޏžæ3L>Ž¿Þø7a/èɵ!7Ô‡¤ˆYÏl'³DÌìôs¿“l™NÈoç;óÊÈhæ=ÑÞ"+©MdÒÛã–Ðh&'nÊ6P…ÓI¤íÉcG”·Æxã¦l-¶;2¹Â£`;]ÃL"užóNv‹ÿ Œ6âÐp$Ùð$´oÈ/ÁôŸ‰±³nsÐôOæ“ù„;ûtÞù“}ɳ³ Å3ùBÏH"+ç“m |ž4© ”v„MòÉ9¨'-¡ÿBþÉÜ£Ð~RÒjc>ÐΓ­ÁÜ©“ z‡“š£oëƒoÿÆ9h•öÆüÁµ#0 ü#õãuhñ ½Ñ/È…TñöQwô}ry¾1&Tt'+ªÆyERX&QFÔ…—9,‚½‹ÑEÅósÙÑX±èÑÖY,ަxí}$;ª¤Å™‚y`±.(cÆ(114€¦×ÂpõýÃ÷h«u-Ч?¸|~Ùt£®%êLy“k¯¢â5fôÓ½×5bütqd?މÆÓ±¾˜âÅ›JbœŸ[Þàû³Ö•ó…t¹j£†‰kâËÇ57ze$f¤FrøÜ½¬“>ˤ2}[»¨úhp]f#Ì/W‚ü÷ª‚3“?·ì|ûò_sØ0©¼°Í…Ò肘”¯KåÛ+o-q(y pžôâzz-üW*º3k;\ÎpeÑâsËãÚ^Q àÕƒâÚwíŸBŸ\=‡±’¿ŠÔ°É‘‘ 3“*]Ør0NÈp!oIÔÄÙÙ=RØ3cLjKjhÜÁœ˜­ó4FÆŒoÂQ]F;rYS× )3S.<¯”†c'» á5 Y+Ìk}5“vöÄÍuRÇŽ^×"W!‘MÙ Œ»› )žÎŒ(ÍוÜÉFÃ„ÞØÆÚ¤­ îìÙ’|KÔé;va*å ™~¥ÉÈ0c² êŸé Ý%Îýþ‰|"m $'°âÎ Ö‘…¶ëÎÈôBÉ‹ü=ЃÙAQáѨ'ÒèF{’Ã-NÝ =3.äŠ ~¼UäÂ¥°½Ó*ƒpò1½_QE¤†%zæì”'¹17FA@wÎÚAÿ¼ÃŸÁ‡€Ü߸d¬ ;ýuã¸P®è…¶úžœÐkP<†‹æÞøñ±â»O$±MèÌ'íù‰ÞàNïØ“íßáþÆü Nº‚g°Oô1VÓ﫹h& U/_Ÿò†h&¤,×CÄ^Cý:*ì…½¼jÀêåY6p/T=LfÀ,i¹€yâ„®Šâ»‹™^ÎχÓõÄtéÈ^P¸·ØX`&~ž Hެ0íÑ/´œk÷mP±l>ñp¨×x`ÑÊÉšNdy£\~ÆÁ‹Ì³ v¯C¬A¦,)›.î}õ¼34¥^D£±QQh”3.¯`ƒ—{Ò\^I Ê‹i} .Ðä#¥žI™¤ŒËWØzzp¦ãó·0•:92f†ƒ'áQUg »Jƒè49!«côm)E&³³ßCÑÊkO}ðÖù€÷“§,ãÜ¿ƒýÎ|(¦l~…_OÏ«›†ÙÔ˜±°uæÑØà^©'œa=¾„¡ÊdX8f[ _¬MÑuú8×±²>‘ƒÑ¹‘ÿÚs M@š– Ê £åD.ÈF{ƒ+i ?¡3 ]Ø…ç¤ëþÉä'É—Û¡ìЗ»†y³3*}°wÎ+S¨‰~ ÅY6䎎ª¤‚œÌ Ué7¸Af¼‘àhðäýÁïɧp¿ßÞaG'Y¡¼už¾Ö:9Ÿœ÷0nâIý¹€; ¾CK‹­>i`I°{$Yr’;§qfö'sc|&k2ß-"…q… MÌ ñ»úÏÂüËOÒO882:)…¶£¤Aµ­¨)W Õ¥ŠÊŠ?ÕP„*ˆÑ]¼ãpÇ\¤{ Då•>è%$Úpû‹³I– C°é{Ä¶È Z!Ô¤–b_²â %VO/+±¯Êayy$øºµ/n¥/«‰=jGæåÁ‚¶&ÅôsùÌÀÑ¥Îå?즙–SÞk…>¾xVÚ¢óÅ( È`ëW«J&ç0ÛÑ…™xožh‰YWÂZ†²µ¹–5þcãwB8(ø…ò$¦”WEÉHƒ/Ú±öù[ð©ÂÇ7µö!ÉSFgŒ<6v#îÒ„gD)¸™vO8 û{æ„è|ÇήËg&sÖ¯ÚΦÜ=#·ÀÎH”Eu OôD$òî},›i9-aAð˜r´)£"¼Mî ¶åAR‚Ê2@nØ °¦ ‹=¹ßSHÞŒ»¿‚Óá•ves;<×åúæ¬Ç/Ý‹:Ò2ùè\Fa[ao4…´sîP©¿‡úaz®úàÙ¹ž´J‚3S™´(5sºÌa6æÉqbÏàDíH§=°'Ò _Œ6 ìIŸ”q›s#yÜE"ÃQª3B!J›È“ ¬”&h^ÃV¾¡*çÚçõ7ô;rPOžöÜ8y°óc¹ø g†DîÔÎù-ôzR¨OZÃIh©‘Db_É ¡¯t¥ai<'£rÍHf¾£Fnt‰ŒÝÉãÉžÀ°'û£sƒMùÖyJÙ™?Bý Éáx–S€¿¹üîéè­´TdÀ…ùÉhç<Ø:³aòÁ| SUf¥/“Äy‡I=ã>¤pù`þ{„•@6ò7ÎŒ(Œ‚(Ã7D°ïÌŠ¶FRúö„zŽ\¦Y9ÝìŸÿùy, ®ÀX\@¢!r`$›KŒ°×ö•à#JŠt´ñZÒ:¢bq¾;½]duÖ ¢1 «™ü•¬¹0}t «S ×0ǦeÕøÜUB`G.p?2ït5øÞ¬ÉZ‡ú:½è•^!4xÙþ<ý½Κk+‘шcȽ¾Uv]‚¿Y_ïKޱ‰ÏU¹b=h¡iØè:Ô¢­½\€|÷µZ 8Öed,ª«­ë³ÚÛ´²±Ü”É!—Ødc¬¼SpöË8ThÜ+¿6Ã2imð’,Pš‹q«¼MœÂ.ôÉ~ ~f®“6HЬN¡øþ ñýàÃÝbÕ+q_\¦’c†ò~³p«N3ŽÈèfÖýÓ3—;G£¸‚á•{*ü„ÿª|ÔXöεv΋1Y‘€Ô/£†a‘)³3š£r·Ì;œ…2x»ÇÍ“—NeÓ€/tƒƒ´‚61Šq›ì +teOá€=¶0ØacB5î¾êüSæ¿O¶ÆñÆ%3 Eyfv°Ìí["˜qŸ\žè`TD1áÛäOD¯ üfì'#S&ÇF!î7,¯™óÂÁ™h‰ä¥Úã"äÁ8¸œXÁvÆIºSk©¶¯{2!“çƒ÷ÓýàÞéWäÔÄá™zJQ´Ò Ã[ä»»¢“”H“¬ü>¹~ÐFМ2äFkqj)1%ZLÙã‰e¶ÄíÎzF'6H ®:¾"f¡GfG·²orB%Uú-óÜØ)1ªÁÃß™*Ø ï$£tF†‰ä(hÙ9w4!#Þà’`G*%Ñ7´`žÅvœox«ç§ñ.Ü+—MØë"nÈJ!ÒþðG?.Ç˪Œ…ü.zŒ#ª~ì¼v*ì玓 …µKHŸg–Úg¦Šæ–Æò¹æz˜ö~«¥¹&Œ¥²•-ì šˆ›'žÃ$¼KýLwÇ??ÝKy&² £þ¾¿‹zÜœ§¨‹’^L¡ˆÔuÚŽUÏü¤p]˜|Y-®²j®Ó!øHÁ¤’¸Ï|Ãá¼ò¯ì&[u"Ö¶¯½ëŒ-É×? ÷«è‰ÊÒm¥U-–¯Ž6P¢ÂÅdc±oÈ»è?|4ÆÌä“Êú]œ“:Ƀ§€’„Ôé…4ùþ±ñPð¸ÄÂ6¨\á¹xœû`(SI†L$A•g _x³œÉ`•™0O0mÁ‚÷ • ˨qúÌ!AÁJ6W ·É£ò£qÏØc1’…Cùep8,î÷êˆ_Á9ØË'—¡ip±0²û‚ º.º>cFªè“X†Ÿ$l™ß­1 K¤I:xB±Xe»ÓÀ‘PáÇÛŘ']ykÜ…Í8àÒù™Ø Û;Åø¿ÿeÀ†öú¸7Òd<³“½½’ ¢Ÿª·X<ÈN™äÉ­R•>Ùm"ж°ží5Ö6N‹˜:o?ùMø~ò(pÅ [eœèà£ð–Ì¥‘îŒIQÊ–˜¿põÁèäIú3ãß)…óüD$ñ,ä'é )ɸ÷ÆåÉ=³]Âs‡ÛNº°Õ@ÉLÉ‚Md‡á .®ða¤DM˜Ç阤II´né ”ÂßN4/²\I:ìè…œCÂ×ZxkX‚Â4jã ɤÂXÌu5ÎÂõ „Ãé:†8(^Îäâe¬!>:td0ì$÷eÇâÍúê~<p\B6d“6¢“•f˜þð‡?úâ7IܾøeåÞ‰ šüÌzy,¯Þ?Rý”_Gý*²Úa@H°:Æ»f—˜àÃGZ§ðëó¾;µp7óo‰\š/,sÒ‹3JãQ£úùÕˆkB$flŽ{hjy­F&C0%i¬ÈpÃZXk§óÙ\ÛôÌcÈ\ÐëÕ¥.w>.¼ f‘ì³OöÉGåb˜pÀ.LÏí3d Ëräèîˋ͌:âhk‰mp,¥3¯R£/Ø×øEÎAÎiBê໱ʰ`N›ÌÁ›ñçT÷Gå 4ólÌÄL£/{Ñä¤iá)\zÀJâq%F5c“áo­ I”“áÐbûqÛáIR®?%²±N!§y×?W·ÎI” ‡ãf-Cæhì‹à‘R!¹‘ÇÛ,E< cf’붷ƳÄJp*ׯ-Q|¾ó$yНßT'ïUlî >µÜHZ ÒN*œB¤AöÉH4a4zNî--ýRMxkÜûÀvÚDÜk´£6cÞÍž':#ez>I 6LÃ2ËyÛ‰qÇÉugndatlp<zZb}e¯7¸…5ƒøZ.“.Ì›!_×>?7Ü> ÇŽlh ‹õg"{?·ØêaH#«·Qûç:Xu†diøó>—%ýüÝ)˜}“ºU¡Aˆ‹DߦÝÓȘr ›£ %ü)_ÛÎ4—ߤ‚Ë”òªŽÓ_ !eñý}h²Pîø¶Ö?ÿÉ4ÌåYꭹ¹Ü6Ö³q& !7Ë1˜µTWfâU†¨|±5•Ï$ƒ4לA²ªÿ*3™ 8MC8ÉÚ½ÅG`/ÏL&`ŸòäPPj'=CØ{¼CžÉ–؉÷Ψ$¥ÏH¡ñ®jŸt£Ηqˆ,=WA µñ0*£ ©Ñ”³°˜Áñõ—æôâC–HAfH cw~N^ÕÑík*ÙA%<5óHè ömpž”ÖQå¨dèF]î>”T¥ўôA2ì`À¡\ÝhBe çÉ~Ðàí¤fãìžÆþ;óN†ñ†$rf(z… yG+gbÿÆ‘h'—IŠÐ7æ•!üïÒWÚˆ7¼uz§ \8%7ìø„uÝíÉÍ)/¨À“'4¸L¬Sá‘ûûÜØÇÓ›[D$ »cR…çNJd`™sã ŽLÞÑB/áh[¥íôBþ¯™1Ù-L˜;鬌FzÂäíà±ÓÚ£ê÷Jêàýƒóƒ‘™Bî´et÷æØèÂåƒÞbÕO’³Ÿˆ–øÙb1(Ì£“nl¿ÏÇ×ËVèßIûç^\ôUé‚Tdg›±C̓fª3Ü*ä˜*\evñîcpíô&ýƼ£OJ#Wæ7ZAŒ9é…r!=°–ÈnRH?èß±‚Mæ 'ãAý¿Ñ[IÚFjŒ ÛPÃzP–ÓþðGX€º­¶Ou•(¡[0ý k TºÇÁäÆ/èêÐgˆªCú´:ßá\u/k.üñ†¼D³¦|šKÛòòut8¶Æ‚¸¡}>¶;8ck•?Ç¢6øø£3v}~8¾~¦÷þ‹˜ß; #‡>|°Åòd)ÚÂÎ…+›5[p©¶®§„s¨ lÊÕöî0úš’…ݱok|FñSÖ‹R }LdÉßÓŒ•ûËaÔÅf_Î\°¾rc:é™N£*w£*©p*d0+EiŠ6jb6)“ç$ ãºÑÞÙ+rÉ‚+ä‰B‚£’ ÏÎã€gã-ó„´¸ÇɵðøÆ6Ãñ,œ•s8â¸ã©¹lÄ¥¦ ?P·öìÈòÆÜ¡“ãDê2¶Ó¨¾ ìƒy ƒQßÌïô7®kŒÉÅÄ(ëÈšˆ¼ À×à‹2@ʋٲÚï×îQVÁ°µ3ðÊQwÆws¥8…ýpž,ÿ9#V43…¡fô·úå¯Åæ:å_OIœ-£kƒ§ ööjñeÅÊWõïâ€Æ¡<£rÄÓ ¸:ÞøZ&2_Íþš×p²ö\ÕTCr,KH1VÑâeÿ”ÃÅZ-„£3/¡ÙŠvgy‡Ål mq¶µ"v£+tÕPíº!£ŸcáWQJ—Ä÷sñ°¼’š±IÔ~— !'ò仡#3„oÆÇd¡|vµ—u|3nJ©‘QÓ { AµºóñV7¥xæ¢b÷o“CB7¾/Ví´I´r®p®¥K6ÎLNŸJ-’¿\®9Býå÷MOWʤM.“§R¤`øLCr€ŸÃ”‹ðبWa*YÜÆÂ‰¨=¹Nz¢%.‰A,á ´¾˜¹“”–ؚɿ˜0£²%œï™Qè¿ ƒ*ŒA½1¿3½ÅÞ°Kh\—ò“‡EäÖeò¤ŽÂ£ðOð¯ƒ_&·NÞà_ÿp …»‘ ž…OnnÔ3yNöB»ò}ògØŒ“4£‘ô¥š Ê~!I¤Ð¨p^ys“"×HWª³w.ôJ™Œ6™úä(Ô"vu0J%gž["ON#Ã7E ï“{Ù]‘ØB´lšQ€†¶“2§3‚I¹fn ؈¹°>°FêÈ“ãŽ5¶à‘¨3!1dªòq£ »ð!¼ešar¡ôI·ø¥wa68—ã5æAœ…)Ôx„>´²P>rç0à `ˆ33“—·3V-‡éÖ§Ÿv# ´ÐÞÐùµ¬N6ÎJ FcÁ¾Ëêíˈ€|~£}ùQqz:&“‚ÙöJpµDþÚ†/d&5lD>¸ãXC²õ’ø«/­^x¼å·'u_èŠ[y ¼.û §rÆ*8ÅKóªä%7r\Þ7 ß(«ß·Evr¦“óD£œ¤X~Ø¢y¹Òůõ‡Œéqì˘õO1U¬@D‘|÷0íû[_¥’HƬ°B=}|-‰mÞ b1‹ÓH°)yÐÙeq,³rí Uí3óMxîácå+‡mɬS#‘áσ,ÆÖcRA¨pûXˆ\§¸(ÁÖcaáâ /¬ÝŒ#÷’J8£„Ù€hxÑ$¥ªç2B6ž†ŒÄ›r¶Êèá½¥#}·ªÆŸï'½SîôDº„[TodÂ÷¥ ÎI파jp"ÆI’þ?… ž•wx ¼S/¤ƒÈýÁ}ç‡q7ÊÁ4¬’á…ëÁóNÚáDz8Õ°_¨“Ç@öäÒ¹WöL*…_”I¼A7ÊÆœœƒë;Ò8 Z“ ú…D$wŽÊ®+Åa"‰\£”¶N™¦HE'íW¸29O¶N÷¥‘q€%öÛzGß !¾ºÐNc"ž IDATʹš˜ úÄ:¹q@ͰÂÈä¶ÎÂ( Û‘Ìlð`¹b MPh.Ü)XÁ õN[Ögþæ+Nc«à*–É,á‡j‰‘·û$[x¸³fÉHḱ_;¹¡™qrt¶„ úäbôK<è`df"mˬåŠn̆æ…­ÃBwÌèÞ ;£´CA5|GæÄ ybƒ1á­JoBfyvD 2,Ý*é¿¡é¯ Àë@g5¶_üsâ 2>Ç€µ€•×±eQ<>ØâŸ0c]KQ7r'BQ&ù€'ýˆ®™E•ñŸ©/Ä,žê"ã¤Æl+oݱ/X!õñLfÌ"&ÈÀ,hR¤§¨úò›ó¸‚uËË€®Ê'«­öB¥‚,K"¿ç¢ZhÀM°vÈs­m]mõ£dF$äµ"v Ì«á‹= È`LHäÁé£3†]t©aŸ\UÖê[¡wêät+éå­ö*–3Q‰±)ŒnÖb+% 2j<„Ëäžy÷&qÒrL ipx¨º…”ßlÞ0ú@МÊõ%ãAšè™ C*-÷53 =ü“‰³¯@ùAå“zP ¿g.•éÄCá?ˆÅé>8+ÏίFsܶҔ$˜°=™c'ùdÙhƒ«rŠð®ƒéT"Cü€Ÿ…ðP¬âü¨YIƒÞ¸TnÂ~Á~ ¿¥À¾|¤̱ŽËtþ§¿^å2xB5Øy\Ø32"ù:ø9)²’@”Qȃ麓Á8á Õ)ƒ6('Ýß›«û» T"–@{p›â7¶ÌÂèÐ6r§ zefª‘7NAýB$ ƒôQà{ÈV=«YŸ$adæ$O¸$L£b‰R8ÏØÄfA‡? <vP*CHÆvBÒ0†sw:9v²Ñž”§°e,ƒÑ{ä:è ÂéNŸôb4 “NF"ïè…– à<éwÄHI ¥LŽ'©¡'r  %=™‰QзpÁò¾Ù=r6C…Ã9JRf‹-¦G;ú<-%vÂÞ÷ÌdPŸ´gæ¦<6tCõ?,|vô¯ãU^=¾¿íË¿®Jÿ•¿ü9«[·…h³z繺l$¡ÏÁLO%Zcã>Ö _Ê«­]&¨¬Äö¹jÃâ,ú7E¢ËªO…/A™¼0¢WÀjÀ}ýðyŽ¿òÈ$ä?ÆçƒúOH“àðè’2ØËúŸ5N-B§OÎReÕ#ˆw¶à8YÔ£¹ ³¬ì04¯gy:% ëGǵ¦†jzº,žÏ}>ë .‚i¼[ÆKQô%¿tÊ)\'\áœlŸ°÷ðc ®~Ñ31á2¸®“S¨.Óc £žäË­‚’A©tï|d¶ Yõ¯L$Å2æ–Jn@=‚ºƒ2è Z…‡Å\² ‡»1g6ãé½!Øä·Âÿ¢ü®ìÎ̱à(J:àŽlœžô éŠ Nx‡c A¯ÓîçJg뱘é7Ž¿œœÊøÉn|t.7®7ŽÆPæ“-cwãz'î¶Ì0æàÚ8•±zç¶_,l "VÁUJ]x ÄW—Ѱή<qÌtw@ë‘ý—‹b=àÊü5dÛge©± gf(×;ǤºUQç[ã.(öTÞŒ‡K‹='Îèé`NžëˆEȨúDÿ̘셧Є™#¡M)u³„zÀi9—ÁÇFYürŸ¨Ø(®ÆïÆ>8vv >-ò×t­÷º¿v¦Þq$ŸËý3øóÉnÌyP„g#Ñi£c"ÙàBÞÀƒdžÊÆ0¬R@•Ç;9±ÌŽßIò ù­»Ñ'ò`oá:ÒØ;§!=ÜVÜú¿øjZ²-ŸföΣP&Ò£½èÕ½þÇeàK%ø‹bðõ}E¾|,­ªÜòõaV«ë'£o˜Cõ°(Mbº(ÿ«›|>Ä —¥ÛŠÍ„®?_žjü̯/íõb5j›~Íš‰×'WÇêEËø|]Q„-JKØS¨vî·%NL¶OñZüu-ŸýìN#à‘øW¢ÿuÂDŽÎÏ…¤IZûùùYMeYøÉ«^C½S$JˆÏ+Lj¢IlðÜmÔ]Õ|tz˜s7¯ÊÓ©“¦l…[æÛÉ=‘'VÙ2ç`Ÿü,\”¤¬=TãL”ÎXz‹B ØIÇ„*Ü…ë@à!ì“§p™ç}Ì)5w ‚‡” Ý¢¨‰Gá’ÉŽºœdá6¡À]‚Ï7 JÐñf8'uÄ„1#að>ù³àÒ™Ð]”Ø~V6Š# ,3:»äïØFú†]™û'.“ß[!oü–ø/Üÿò$?xu§¤µ¾VØ‘Fn ánüÚi1c"9'µÓ+›ñqrId÷(ôB-ïJ7®ÆÇß'Ân‹¼;…œÙý'§WÇI6²p»Q!eú ÓèëûŠ6Þè%xØn.m½ñ5ü6r¡]IFäsQ˜;óŠ)›'¯)Õ]KX=Ö(Pë\pybÄS'à©Ð:¢”Á°¸— \&Oßñ,ÛÂ âØº£jFr5‰2Œ©”-Œ,5cJ{Ð…=Ãw¬’Nx ŠìX ™Aõ³¡1Ÿô“™É“t0+2C?zP~Ò;­‘A¾1‰<;’±#ß—vJ°Q)) Rà ‰1cšÂp¡uã± ¥1wìÆ¦’þÏþã«ü»_Ïú/Åàó®.ØÖ×Ì/%ák…™ŸÕ"89þ Н!þI^ß®kžp'] R œê…`÷µ|þÌ¿zi)Öñ”åÀÞIþ´Ž/™Ñm¢] ¦kÕl_jaÔb¹ÊÒUxûÏZ¨°„ ¯úñR½ùç}sn98ò"ìƒ.ñt‰ïleËɺ°NÒ¯z]—z†BÖ|àQŽ^nÛäWå·:è–NvrƒÆÓÕ ep(b$oɽ‘T0Î̯»òTÞ\…›pœ%¨,S(–Éöiç*0ïè»aÊ ANÈ1—ß žÙ¢)«¾ÌƒÒcžpE• Å.¡.0ýÑHB…»²Môä˜Ø&‡Û‹.ÿhj XkóYIfô}£u0²[GÌÝlÂæsÒ$w¨dEn?iO®7úE8;Ù™K…Ü9 ÏÂ?ÝùyÅrˆ3Ê#¢<Ú`;ùØx3ÆAÚ1÷(¨P„ ¹3+#ó–8ŒÝh'Wã¡l ’paEú}†#¬df¡ 8K¼ï¢Ü6ZÇ6J¢´1ÑÒi•«‘·4zpNÒ }SWj“Ñ)w>Wá!0ø~òÑI Z" LØ•fX¶=潂RS ]¥*°Ÿ¨'mgH£¿}†¯1åï½H[9-GÄåwK±FŽpý„z^ç~ìÌýǧ˜“|fLº‘º»@_ÄYâ,¶Õþ;KÝ=îG¦žñ;CVÒY ŒèEÓÒ—Z[ȾLqï:Nå@ŠßXàcnÚq:ABÂt&~}òÛÊo)›ŒD5B%lÓûF–j8¿¾Lha7ýÍx&6¡)CC\¢„àËfpo< ÌYÅÃ#J”âoxÀ8áø¸:CqD4D|IžpæX =IX"¹3èŒ É—ÀL4“í óÎÒ8’éÊ”˜ÏÐlŠÌ‚ æˆ7ný4DØa¤€›J…•bý.<2s° ¦¯ âá?•~e\¨Ù[—“[æ2xNö pËü 77LNXŽS^ϰ¼ßàqeòÀ:µ3„3±¦0”¬ŒR,‡¿Ü”Cù_•ÿ¾ ÓÈÆ’+"­±£@#Íð¿8Âì“Y9¹(ZhI1£t¶+Ï+eǧ 'õäq (LýxM̃ÔÂ~J” ß”ÃÕÈÂT¶^˜Ý(…n-^)ᡊºcs§Zì«™"Ôå’°Æ|QNÎP"a`3pÉìÊïå´EÃw¿9O¼èä{[ãÛÁÏ\QÉPÏN­XÅ2òDãYÙ¯@$ß]'Ï+¥£D,ŠÍ´‘'ú ý[X鉅èg~åæ öJË1—¸ äìÌB6ŠÑ Ã(•žÉ&HŽÏ]fâlK<ëD) Í¢¶ç“iH]OU>[ëÿ u¾ëß|þï}ñعÿÿò‡/SÈ× ºªîp…“!A¯eYú,`:Céc+²Ø·²¬­_¹ÄÓ—ø€„ªÜ÷`ajG“˜<-g.yzÒ€AºYÜyèÌ)í¦±òáêå¶ýùꈇ^Õˆ Æ3E]Ƀ‡’Ý»ØÓÙ, ôk£Oò¤WÞ•‡ó2YbªþW·n‡‘ýç,Tan¨,¯§±²fð扞tb¦™KÜ•«ä&zBs|Šý¨þ*ÉNj̄ñŒïJ„òy*9‡rÛ6q>5’2§KR”©\ᙣž ÛÉLô±‘|_ÈʼQþ;°ÂÔ” ÏmôÆІkE::b_=&ºˆÝ_Ø@”ËÉ!ô‚]H ¹!ä5ò„ •ÇoQÆwÔ}%]ñëî ™¡¡o)†ûä÷ÉÕ÷oœ‹Mè,ˆ1`Ï I¤+¢ŒÁþäÐP™lÆØètò&ã_hOä;úF§d¦ÛBxãr8÷ÃÈ&:˜ý`Î+T.ÆG#OFÇ–‘ ¿ ßCtždÅ”}§UÚéªî†æ2FóA:ÐÉ M>KÝ©=ÜúœL5Zy^¸<LZêy>È?Ñ·Œü#¿lü\"Öò {'Œƒ18O.™ÜÂae|gîÈú¯Ø¤_å½2<ÒÓ Oì wæ@})ýU4sîdƒ2 tZA'zx;:vC;©0+½D<Æ”Lv3DÖžEîè3@ï¿ÃúÛ¹þû7õ\†þWù«vž¿üëßû#/FË—G|¡Fò—Ÿäo¾øüã?™iÐeêpM&¥•ð—Püú!ä‡E“ãz¥Ñ•žèË^IÈ Ô|Yì…*‘t)Ñl)ÝV™qÂåp0е-xý}ë‡#V s Ç^bg"!‹ÌªqÉÝ|Í:BlB½Üì>B™®\g¥zþ{â¡A¼ m}';Øí)` ½FÑ/™§³#|n5.Æ­pZæ:8–¡¼/Ï}¿ínùÓ7„Й¨•çÆ6¿®,´¡O¬R„Ó0„MA™ÆˆP7̘“)\ ÊÆ#E·è¿å¡d¡LîÆeç‘x»óH$!tð\”Ó˜W¾· <Ù…ö ÿŽuÞ G!'˜ô3®˜ Öx‡Ÿ—˜Ð·ÎêZùä“<éJ[ò½"P0¡ UöÎYI-Þwå}ò¸PݸƸlü̱*i-¨…á×Ìo'ûO²2*O·¦(d˜JÁ2š[ö\zò–ø-ñÖiFÉ0á-3O#ml‰#“ü^­“k¢¯Û^ ½s5~÷lgÔTÌ1ºA>±$è'¥’GB'åd”IëÌÂî´ÔŸÌG¬d²G6j–xú —Æèˆ[õ »p^Â~XZa6£I(1Ó2_c†ª\×VCé¤ß(.R›”Á,¤Â³P®”î“ËÆs’?Áœ”ݥá†ã7xÂÄ291x¿âø^—'ßIâ¬d£fžë´ñô÷Ž<Œœ%ˆ!…±£Í)ă¢!Úp{Ä^)ÚþÂþ?ûc%Ÿ<ùê©õ/ÚÉ8“^Û`ûË¿~=|å/+Ä«À¼þ¼>éÏñ+âÿúäþñWøÏ ñåá€ÂÔpïÓÆHH¦&R‚Ä\nH6×ë^ã•;ÙÍÅ§äˆ Á÷=DçÊ{ÛîI .X÷¦ ã wÆÍ R¢Òðšïü) ¤eùùâæ¦ðÉñÖý°|‰°Ï¿¼Âî Ä €5§ÚcH,03Þ¹v£ìá3‡‚pfÞG¦Nòöd›$GÆ'Ý¡ÏÍ쎘0Ý)Jâ c†¦ NC”Ë}Äý#ɃåLÖ1ÑN~SË£½½’Iï‘=ÅÛ“2DxÒûºs è“Aô§ :éVŠÑÃHNd,<*Eè5FáU8'ªÄEúœ0+I•”H–Ýè"e†bô'“r{;!r[dn“¯DˆÄNè`9{ º…ì@¿Ûu § ŠéœO:܆ÛHÆXž$¹¿Kƒ$ç‰cÐh¾!&3#“¤´H‡Ü!Ó3iЭ†hð?KÊ4ü:’Ï+®àeüB]ãÄù±Œ}…ieÊï‘w!G(ð- /þ¨M/]|_×û\øÒJ<þ«ßòÿ\_ó Á ú¼ªxÃ"ãú' ®ƒo IxÃúƒÇMZ`.u¹5Ú•µÁ`ãMcß_DÌK³^W~ +Xë· njŠT7w--ë%^}ÿ§ß6ôO—óºaÁAv)l\üú*Ôñ"Ku®") e*¹­ýûáî‰s¢“mR… .lgÖ§ðwøµóÂÏÉ,4–Ž´’'=±YAÝܶB©<7nÝ#‚"íLSèMhcS‹”¼qÉ“–|ú§¶}ÝdÊíÞ3 ÁçiQ ³6rˆû™Ü|ž<…÷D·š {¹S‚;ÙÕÉÀÇNJÄÀÛÁÿ¹ó>I‰£0?á¹#SØJâwä_àÀ-:™Ü¿ïgäíƒ32›Ñ`à :yüú‹Ÿ¶ãS€©L'èLSPÈl“O!šëœÐi§~*¿©y >?”§.­æÆ9é“ÑÈ-qŠ2o>h™ƒ¦lÐ"eðn ¹q DÙO¸WŽL.´w²U ðÎ>!ò.ŒvÒ;oÂcrèptÈ”qSgTä@m¦#™h&—ÌF‹ÄNl„„î\vµqc&ôƒíé±r<Ñ/æI Ì3²%¦"}Q'GãÞÐÀ°™ù!¡¹!šI ¶FüX"7_ÇK9ˆ™YHv8_.ê†db +ÙÍšØ8Ê\nBõý˜pͺXŠj0šËçéðFß–d ®ms Í¼¹´¿üznŒ@: ¦g*;i¹£ÿ?#ÿõŒ)¨/hÈkº4W 6++‡•×`Íþ~M5¿D•óbáö]NÂönÆ8žkhioèÂrDtÛq;™‰+>²Ž;Õ íW®Oë/“[¯×J™†˜HÍ‚øíëŸ@õÊÅ®ž©ñ¸ŠõðÉŠ;n.NŽúf$´^¬2ÓDʺKåBÑä5]°U,;¢˜âô$tOö òHBßI`åžÝµê#n˲8P *·'=8bV›÷Qé[„é3½ºQ3r$ö &dïÀ a0ë`[|›;}"Dêæ´<é/ž>ÝK`C«SóïѾ¬4˜&è¦ìZ¢CQ×@µpù8)6 &ôŠTP´xª{$rbtÂ$$Ò`LN…J:œèNW剀FF•íQŽÁ­sÆ5.RBä¼ñ¾ÖŽÂ~çK^ÒudÜŸ‘`Nå‰X˜wr`d†RçtòäÜ“ëâ¥Æsp‹Ô‰ì³)¤S\$£u .]0éÁÙxëœÊíÉè|)ùt£M=HÊ(ÐMKYHÊQ‘·Nÿ'òïðÅP›|tz…Ú(Êù$Á8HÝè³~!'³2Ç$ l¤7x_j+¦Y{²ÿ;2ô7ôN¨Ù£ÛÞrG¿óó‰ì‰ú%¡ŠÙcd×T·r8ÞÐwÂdT$C‡Nhhd6r J.ô%ÿƒYÐ þ`þEø_àßÐBû¢ÿbt¢i²ýF”ZIzó‰¸tqoŒ_ÄgNÖjØFHFÌîôöëw¿ª2\k™@ˆÌŒî°;í̓R_.ð_ ´ ©»'uýoj +@4aÚ !•ÉÁ]˜ 1ÆÊ¨¹vÏ^•xpÏÕK)ÈQŸèý€Û oX.¸¦%ÁïÎÜÝÍ&{–Ü‚w¹všb–J¾×þë$_Âr‚4oe§cêµÁ”€‰6«'ŒômcÖNÒ y3¿²ìu®‹ /y¢¹FÁv5âð€nö–3s£œÎ‰+ªN–üœ"&¢IÁálX¤R«g‡ëèõ~@ôµÝ®‹?êC 𕨕á"32 yážÆ%µqqÊôÙÆu0/¹dTKá-òbw7v#&i'wB£v2Èdw‘ ´@¶ˆé’džŠìôâ’`‚1œ‡£“$ôùbÙÊlgll « W Û„O¡˜LäÝäÛ@3Ð| | rr”¶ÂdK4_“(aðlÄHHÌÄ»ðqãvr$2ì™O“ÔWZFq#5¾"ïðˆì:á-¸¿Â4ó¿ŒLòÁ?'Yñ‘Ø„ÁÏ“ÏÄ.hp˜p8¨ø¼nž>™÷„H¹”!¤&éà9)•ª¼g>'· 0”¦ÈF1ÿ²Ä#òÞˆ“Ï7Fä¦î»—cÝ­­…™o.©ý¸±oÜc"³Sª«ÉFš<;wèwæÎrã¬Ô¶_ƒò¤ß¸ï„@SúAŒK:B8"¡ð“³ÐÚ½{+Ù%˜j@„}™’ÎÄv=w3‡§^¢Ón#1;a’"i¤æÑ ß;¡;Û¾È+Òˆ_Ô£7æ²-dõF*ŒÁŒÄ'T/p1ÕRZ&Úîˆ"Ë-Cå,¾d^·Š6ø˜*á10šõȪS“pF"NJì…[sX3ö0køKWኾGÃúxï© IDATäÆuY%í ¡¹âü î«àz½ãô_aõ—Y•v/KQ»ö´‡„‚’¼~hýļÐÿ¹4„¯ÉZ%µ¢É¤ß–) áàtI¼yûbŸË öôÃbPÉðWûy_…¶ç¶¹rϺ„îa`/¾ôG±{ÝÖ©j^¾%ËŠK¯9wzÁb×ü|oÈÌ3\ÝI¯hQE|¨ ×•_”g{åeÙ¦6ØHÞ Ls’éÐI 1–î=™&-‚8ÑÈÖýóBð'YÛ ˜ †‰v1Ñ“íp¢ôQB€oOJêÄîŸ7@6Û t!á~ôÎÉ^™ƒž‘ÞÉÆ§¶Eâè¼+›©›ÙÍf”† ™ÞYê`|޵0µ!‰<²ÛÚĵ¤¦Ð•PIOuÈ Ý¨IlÝ•ö€„ Ä(FÆ“yrk4{“I‡8(êš oð0}¢¶‚Fªr‹ôB˜H%tÎÂíFÎ4³0#áŽn¤Ad%+_Âm"çhµäà6øö|P²12zãí·¡|¤h'))ðùh2_™ÜßHGn<1ðÌü%´ÁPŠP"5²ÔNÞØ”:éùD#Ó4‘nH %âÎyûBÏ“ø¿Ñ~QýI~p¶Ÿd+:c03{¥EW{þ §pdnO4#™¾!›{½YÚÓf¼¬ˆ@]àNÈ“~’€7ú¿°ÃÃ×½’”ôÆø‰BÜÆFLÐý/äoÔ;º3 bB&áô:Œá= ¶Výü–èO8Œ-:j~\f±ù$~NÔœ…¬Á=H¤#݇#»b”u´ß9?#2ÉÍ%C¤oôL’Ÿß@˜ôFšî§Ì%<=àŠ[{½’ßH%s!-ºÐÕÿ–_†3!,æ‰ÍNY„“7„yõ"BŸî rI¼Yån~la„;œèëOòí.¦üõ‹°ïŸQ|sO¿M .”),zE¼õ&kþ‰®UÉ2˜F ¯¬`/ž„âôØgg2Ô5ݰj¡jh—ݤÜËNYaúƼ…{§„ãvf\M›ø.þ…Ž/ É/fŒeñÖíõÉTÓï”Á˜P:g".ÝféÔÁn ÆJןy{ò¸`( ËÂfBCÃMõ†8F7†22|ÕÀ²¸ ®M&´ÌÝxî‹z4×P§TÉ8§6 ½ûÜr öLÇzíÌÕt§³»ìfèJÉÌîùb'Á©lBoá(üCyÜy ñ‰Fd0+¡B`B&VZ¥(rgv¤Sa’u@âçä?ÿ«ò+”B%&vaFz§¶Â ›<2ÿÖ8*›pvòä>ùJ”Ìl¼>h•÷wŽ€tž~—ÎÃgWy’ÿF Œ’Èê@îxu£t÷5œ žh¢ÿ\ˆz‚À-úŽ›ž^g|œü xéæî@³Ð#û/xóBê(HF@]˜Â(Dˆ­^H ZÀôñyú·£Ùeú¤ÈŠÅ‘ª¤Oæ³óSéP?ɾ3aÃôެ H÷ ˜®¤Fú'±" ;²¿êÚ°jИŠ$ƦÌJoÎK”¸‚ïôø#Ó©:½¦“dàyB!vߘ;à ]:r’6ÆNÍìÝiË‚ñ̓cëQ|òé“Ò ©Çí±¦—×6,ÎMG`rt"ôÌÞ ƒçÁýƒ'0)ê6ôÕHu'¥zQbWR•b åôhnW>$ŽÈNU×&KÂQIÓ{T M¾¬_…˜èÂπ©Lsq9¨‘½­f¬~ý2P”!Œ¢Ô;5q4“²8¾­"'ª¸å8G«jcïH Ñ6ÆD6Ú×·ØÇFåJŒÄÉ33;E9vnÊH”7Îɹk²>þFØÐ;*.LFg<…MøTö™S‰=Ø+g&râOb÷UÇœ‡Ê/Ò€œwú|ç^Í%›Zæ½2”^Pøyò+úH;r#N¤ò,P‘{â̱îð޼3þÆ×Æ-‘†´R+}§t0‹ÙOÒAïþHʤœœæ—¹9útv ›žÚ@qBNUî•^_ÞVõ=| ï„Â~Àþ†ìð¹¯~]è‰r÷õCCªµ¿ ?é¹þÿJþ$Û_ô¨%™ž\Ñ34ô Òà˜)$Hö“,•{]×ÇR~kã·xü4P7 ô@££“™ OÒ?á?èÿEþóm ÊPb`.¨Á…?»_£¸ÞWÔãš] g¡L0¾KOÑfdMŒlƒútTYˆÒrœ«sÁ +ÞÅeÝ׳!®´5¿¡&—ò¥„W¬L‹â±øj, ]v+º*ë‹ácU0‡£L8Âïù8ã\‘k±{¶UÂãM9æ¾@í³Øô2¬Þ†sIM„%å&+ç[K$Kh:Ì5E/…"a)÷d)E›êƒ®K”e^—9y­°ìºìÊX“8ÍÄ̦•£p³Ô)j@¼…S¨•{G“O¥OòK!ƒ&žüœ®x¶áÙÂF6ÍŠz¢X!™È6ŠtuDøÍèàÇ&šgh꤈ žÉ!Í0ÑÈ’\&MôAª¨Ég6òÁ1IÚqÏ“3"‰=QW©›g£DŽÀ­òTîJ{C&]ÉЄ[àÏÉßáϤTbffšŽÉ[dÜ8Þo0Á‘H¤âYM )?áŸp·,8\;ï¦ÐùØg9C˜lÂ!l)&ë@I<•m2;3ÀOæ º³ î÷MUÉ”ïý¤Làåà9ȃ9x+üͺ+Kíihd$î“ß“[ò®k4öÆGáöÅŒ¤GcðäÉ-òl0)Y½.•QÑ Ä1/@¼ùÔP;!¸•Û P™ƒX˜“Ôyf¶ÈÜØLã'!#-yƒ>7Æ$*$Âê>“¢;º!}X P ø·c;,ëXÐLj´O¢oTHÝUukfËk§®| ÑCJ‰™Ðñ6dgncÊD¢ Š…f€Æ<0‡÷d²TêdÏsgdoDæÕÀ’"Š/ZÅ‹÷¨€Z·õª¬ÃJ¤¶h`ÌÖ(_o}•Ò8fºZ «k{“¥¹fµ¡H`Mq-Ökz•ÆzEx¦™òJסlB0¾£"W}-QH²Ú"}½Rׇ±ŽGŹV–ÃÌÛÖóy¢ß<Îz!°J~; }R]ï–`,r¿Ð$ñ t™y‘¾ ~V÷}‚ëóN`°NÎxñ€ttR&-®™ý»“‰š–Hö¶Éuê7L!ªP:ÏÄ6˜.®`ñ ä±0¡¡wdsæ¾I’H„#q[;,#Pº‹"ƒÐl’q~ Îè&ÀŸ‘û¾­­IòùDÍ„å4§ £LÓ¿¸¸ˆR®Þ¡”Îè¯[TßСÜ£ ÂL¤*ôŠDú;y 3³RirsðV©“¢œåÛ_\üùcãG¤&Êc­kù—G¸­%£;Ý-ä숊<9 i'ܨÙe÷ç$ g"Nv¥=eFNØ­ŒàÄÊÆ£“:¥KÍ„£Â“­:¿¨œªHH€ßèII®?sLnw4Rj§ìY9"GämM)Úƒ)¹‘~¢Â€(†af0Y-! ðzF7ZsM@9¨;ÛàþÁc#½C>H‘ÃîðÀö¤â;·A߉o.‹6žÌäæt$&”':èlwÔTÁ£!Oôé}sH¤7¦Ð*ùA=ˆ7\$†§½±¡9“Ù| ;2ó }G ="}'Y!_ýq0­ÿðNšÈ/¶“^¨…>)ôùD;¡ø010)#ïÌ»Ï/õþ7âO¶Ì“ÚÁ°ýÄŽNt0CÝUçHô‚$G2Ä Íè””Îy…õŠÕÌÙíÎé4G`k°Ðê¹ÊvðèÄÇqà;œ×Û*>³]hÿ‚V®è|!0®©‚¼Ø™{MCŠ-–𸉬wHþ[&eG¼†÷סy‚IëÖà)Û¹`ýúu¶àöA FèÉßÄåÇk‚jƳ‘™¢¬àæw¤È2Ÿ,*ËcÀÁ¨upÛïš®¡=ðvaÃZúu8HÆ›üæi£ƒÐü:'¥ãó’¬h§TÈBXá9œB£ L³fv3ºZcIŽê ƒ ÎIR*l‡Wú#¢÷Η¹ú±f6“žÉëšLavòôaF $E„ã8 —}¥'ÿNCrþÁÏ\ KHœ.lЉ–­íK4i­v£wvS´ïÈAPZb›„Ó/ucë^‰Ò ȦUƒm06ÂN H¥àw&ïs+4qUÑ2øýÅþÁö¤W×"}$d §Àfg*ñ©êÂ8r§wbä-Ð…¹Ñ1Ò— ý(ì•É&´ÎžŠ¶c'F46ôÝ[m»åþQRå1IÑ':=r <ÿ‰A(ï|¼ÿ°ÔÝ(ñ ýMnè`|!_”@íHg Dè“ÑÊŒR¨wÞwz¢Ož¿ýâhD% ÏŸ„š( MȆ †¸£@> CåñAÉ®p`¥gÈŽ Ú…ùäO—xÊ;ý_‰wZÀ pxB£šÈÚïîá% !3rÒÔd’'ñÁüBÌ6€E§ƒùÆø‰Ä%05ÐN·-âŽü'ûÂdÞ7dGy’ ¾³É 4úúƒé€'¡2"}ƒH‰^À¹`]ˆtZ%1qE {­bãDOâ Àrêµç‰°JN‡Âƒ½·OÕ{`;ëÀߦ/Ós—3ã刲Êë×aõ\ŽæŸX£Â‹õ¿>‘Eù” <,+Ѧ+ÉgŒaaòã[蟯¿ò:òŠŶ ºŸ§®ÿ «A‘áäH]ɃEÕË ]|]C›èc/À‰®!qÉ3)пõL×ûÛ•TÇõ삪V·Ÿå£f”e¼l­Éômc%7wα輓 Dñ[Üêe½z¯îîêÆøŽ_—qŠ‹p¥éæsiù×19­Ý7ɨp(Û% Ø•©½r(ûàk'u—N‘$<#é¤ý—AŒÀ¾ò™±N‡ê름ZxŠäAoÄ@ï$…DW ÔH錊žÌ;’Ñ“¼ñÌü˜ ¡&TØ;jªjfG=©•¿ðe_‰4Ð/Út82 NC´:z¦fvèGþÁH®¯Wb"ÌÂÜØU™¬‚«HAoƒ!œ7æ$<ÉðœÌ“$Ä íôN4£’I¬^[¤•aG•öEèìB‡ôI8Éü2‡“ÀfêF¹¡Jùà ±O¤2_ñþ„I‘G‚~gOôθ“Rùz’On‰ÔÍËO›6¡*ç|!¦\r§6ö_È?‘IIÇæÛ*@ܨ?¸ïô΀ñÉd¸Ò"ˆwf£î•gA2£‹¤Oäÿ ŽäƒB%u$‘Ö¶¿Z$9h_´Šœk‡ t¥&ÒNÊб‚a!}P~Óåö°Û(ý‹z'ð‹ô‹ù…vfF74@£=('¦’ÄU 5:6VÂÓ¡u3mV¨§û¨Ó‰'z¢ s’"ʢϘ.^ßAÈÃíÊ|‘Ì x¯Ímî|omNz ›EžR®àn«k†_§•m¬Jz%€«Ó°"׎¢‹Ã³ãÿØ“ØtÆçD–ΟýÊ„Ù=gôͱ#‹òé»s¤ÉâÛÖ7@ÉyŸW]A¼/£]Wåæ[GUYƒ𠇮½žØ™+e™xƒ=çú8ß.Å5…ž^´Kßp'åuÚöíxÔ ÔDêÌI6ì¥/Ê£ÂxÊ<ul ÷(·>·5RC¡ÒÕËižqµ3#Óñ´Õ¼dŠM!ÏÍ·…Qêdo<¦#E]I‡;PIþt+JQÓ3P&M¨‰©ó¥ì3¡…ˆ¯tuSo”¬~sǸ:êÃíYüNè‰ ·Î¹û.èØ ™­@à™‘Hé<”\‰êJàõdûò“A•ÈBÿ w¤S"SxÀfTëåO` +†R&¼·H¤'ZéBJ$øTï„Ì1‘Î6™;O+ŒÍm¾˜íÌà[¸áNœHC›ÇšÒJ±)5 ¡:ûäÏŽ»pó/âî:Õ6ÿáÏSøGâÜPz"g‚ O‚rþÅÛCÁ”£2ÃøN‰4a dCÞÈðø¢üFÙ"ÚIý¢?Qa[RWû4A ù'UHù¤À¸1 =ÑAüî¼¾¬nÖó= óaãhÜ*$Ó5Ê.´GȰQ7b ¼!‰>Q“6iä ‘Ó.]BÞH;* õ¶Ãœæ˜hwR¢åc §‘òô‰‘&È$óFhaÞèwÒNT™-¤;úFÇ'Ížt#Â$Ÿ¥Ë'á„I€±bBm8}J4Aƒ“â(ŒAìî’=ù‚f•hXÏÉ ^VfZWÂ$$—„ÜôUŒì`Ì«i¸Jw³y» ¦¹ìËÓ â axÄtiÌþ-"¯˜nU§ãTö…­ÙµDWO`ÖW¨¿-Ûk.´=]Qxz®²÷‰ \6„ÁóÁB·<÷^Cõ‘ç…,Íu¶kH`cû]+f6X6ʹ§¢ÎŒžfÌp& ¤—Ю5gÝDuXñ.’µJy,Štq J¶Ý]ñdfð×x •2;©ƒ‘;A}{`*¥£6]H>i÷ÑNB3q¶NêcîÓ° A ÔBÌôàZ@vŸ\¹ÙÀM“KLOTѲFdBRß7¬êŸW†Sýn…HB#(Üi‘0i ;»¡J‰~‡Dzò¥l†yòi¦áÁ1I ¨$Z$Vò~Vuc¿¾Yi”ܾJ™»Ð„œ\ .ìì™´wæOÕÌž¹5Zb$²õ^4éy]ÌD…ýî–;Sa,›!gæÈ¾ñ»òãIÈ“Ü:³“:žäwÊÆ£ñã“óFx#ºžTá]y Z¦œKö‰šFq%>]09j uR!ý®$Ø&™ÙoèO$²ïš„Œl¤ÈŸ?lQF¦ì<Þÿ‹c¸>ÏóD~ ÚA±ª!Ã]zêÛD•ö‰þBHC;Ú™Êø$ýAÖæ-wx‡ ~¸ÉU™MŸèA,°»ö_€Á oqTÜúÙ‘Ÿh!TRõ½bQêéK—6/Ô'\4NFs4ÃeTŒ aû%Â_ô;r÷Ø2ƒ#¥¯¥ffÚ ®»›Pjw]ú203ø&°úµra¡muÈBa˜ìÊ3úvk¼ÐžÅù!격Â8-â{¶ÊM7M–œ²=˜Æ…¿TkX¬{{™ï &R£GÇŒ$Ó!/Ã3û3ãÚðr@ŒÜkPÖ¯UXcŒXñeÒfsiõx^I£_݌‚sðVÛ³=+N]}a}ÿ[<ßÀ îÓiBº>¯ù¥\úK,¦Í‚hlþa«"¡;I#ü·üRļÉÉ‘‰k™.­ë–”–—„ ý’‚Kc b&Ô]*Î5*dyÖ b¥Gß„Œvªã‚ïIhF6Ít¸UW¥›ò™ySÜ'_B1oε‰–&-&er,‰ž5°Íµž\¹„¥ða5;Á·äw¨FM.ÞSÛŽO ŒÁmÒçà®´ÀÊXìR¡CØ|½`SÊvò”IsrS¾’ƒEïæi3Ø”ÏÍm¸ºJ£ eòhüHðDÊÉî¨ÓŸÊ= ƒaÚM“‰Ð\!ƒI†“ o‰Ãl³ gçÖxÚzQ‚F‹Ü ùùûäwâm2îŒLÎŒHKl pnÈ Bví¿8˜™¾,g¿'¶ÿa®&ëY6AanE™pø5i§Ì“>‘:H6PØ•Gg&f$F⤚©úà–9o¤ÈTÔL_¶¸ûÍÓŒÚÐy { vúdÔê Q™ƒ·N¢¢•üD”Q‘JÙéÿEú$ž0ë’¦/‘=:ûº±Ÿôê%£4#74²‹ $a ´Pòkh¯w8FáÖyüñŒhc©(l íˆpfzçoxLöÆ×o²EžO‚Ñ…™)ïÈOj!ì¾;?Ýh(Vædf~dÎÊø¢>@·œÿú¿Â…²1!íŒ@ˆ)?+:¢u£ :Žiš He6Ôȩ˶W'3°¾¾ vÀåÛ¬j153YM«0È D•ˆ˜CÙæšT %3’ó³{%6ø@?‰Ý;iÌ“yº´µ*áF€P¨† cÈÒö8›VœòaàŠVuF˜æÚjÁ…Ñ«C+šæ*õ¿å3=«ð  ú ‚¶35yáES]øÂêè°n&ÍèÜ]ü˶mYÓ‚ M’o2>`o馥+–Š3Y¹V‚WœujÁ’öäÒ{P§î–înΦ»íþú_Ÿ6ŸâÚ ûj#Œ i0ñ• fxù‹ÉÊ@×ö–¬/èú#k5Ìò·µnq  ÔÃÖ W*‹­ÔéÓ¾lH0…Ð9YèÇö#(ÁùšyRAMÝÁÔ‰#³¼N0*UÙ“­z"ŸJ„Aî8v¶Ê¡¾ô'c:³VÄ…Õª"Å•Èl}L:4ß ¶ûnY?yïhÈ»ÍïÌ„§éÄ ´ÄvÌ‚q %¸í¸ía*›òT¶¾øæî/âÀXHÎf+`ƒ4hÊ4G—xS矄“ð ?ÝÚ%F„¸1£'rYb/!17ßlO;ºÓ•­¡êuwZbF„N[Š&*Hfnn­cÀlmÄ–)0nÄà^ä=Ò'?¿ ?áùd$4#Ÿä² åG$“ ÏHé0‘­qF2¾|>ƒÏjGô@ÓüÓăV‘Néh§fRBCÑÄM˜ÎF¶È¡„é$)u# rç³!œPhfãŒßÛ1"çƒRýY Pï„DÌT%Jãù¿£Ÿ¤D‰ô%R:iå¥.éïHGm=Ðæ—_Äd Fû‰ppmo@Ñ/ÒIU×»´ŒüƒôwÆ vâ}CÞÿ ¿1—ì˜*’ :I‰˜Ðtw`N vÚ‰þ&w$Aqyvfòâ¸&/ÈìFaVhl¿` -P¼ õE0[ð30Ä ¬,µ xÊ’5¶I ×?øÖ·°‡å5Q¸œ°\{z°è6z¥ Ó·°¦Ââ#Q,~5bp»›ì5aô¹ôJãÊ1ÓxYhþ^]íϲRqçEæÀ˜~’!ú¥˜ßì×½ž \ÄÂX´¡@áuÝÌf/al:g˜rÃôVñ®à¿âAs}#/mg;\𻹭QI:™ÎŒˆ ØÚ:X°¾mÐە΃ۆD 1Y©™{£Zœ‚È“9|aËM¬‘®¼™m ûèXƒÐ±;’fj¤;©4··EB3ìÝ`THÓ!  lG$)Ò˜‘h‘—™® åÓI˜Œà߸ß6‚Dë±ÞƒqÀd<³ â©C•[ç‘eI¡á‚‹µ²g%ž î)#arBÙ™ÙY­gsµð”97 h§Â½Ñ;)¢…zpo<’+ÄõI™0‰“`T“É—pS’R'c²uf¥O¶¸´ Ò(ð€­SÍ7Ø–¤YÜ]΀Ùp2 ‰±ÏLÊ®Žîä÷ÀvÒ³/ŒQA6¿6YrXVó)äɸݽ÷ª$¸e>òÆ­»±C­°˜ô@ë”@èÌ7g ‘‘@]T” Œ7Æ@šÇk œ=Be˜‰S%ù­Q•òNÈ„èOS1ÉÁÇ0шÕ=Þˆê;Þ#²[¤Î(ÄY(&³¡ ;%1&) } _„ÿ$ÿvóíö€òýÅø$gº-`ÙÈ¡£’j[î1“”ãÁLÈ10¡1”¬K©~:üecÞ°Jdq IDAT„8m9…—–jXódYóxù<\–5ØkH/Wz|8Äuq¿öÑ6ß<ò¡ÓššÌDŒ¸²Ú’S êW̹(Óg›}1J_ .vdqÜ>Eßø¡<×@%š°uŽÉ[㸓RAÜ&ElýUyf²:ÙÌ”9âºq㢨©±}¦Ó‘£éÞÊà¸+5/Rk¶àùÕ;{+«H‚-û0鉨MœÁI™}ø¥¶Q„iJ‹Pàar1Õ]>¦ÁÍ4 ƒ:ù·ÆoqOö¡¤H(Hä1ÈÄ)ƒ ÛàÏÆÏÉaÖ(Çj¾æ‘FN£¤@+¤‰DÚF©®Ì•çÆß;¿éŒINDáÙIBj (9r&(ä!̃ЙwIœBh̉ fuŠýÖÝ(Ƽ:fâÈÜN4öÄiªGÊÚI8A3ÂS¹WFv¹‘8&· ‰ÚxW>–gˆ$å IUß¡ž„;5³Æ$þaFÒÜèw¦©·fš-!+cÒ#%:õl,a”ãü4Â@…g ïtgt×àû8<¦ÅÆ„™Pã(óîz2ƒ#6s23pß9+µ"‰ðFx#™ÏàFøfÂp'ÌZÓÑîÀLÈcÉúGR&F¾”lªéËí5df!'úŠ®~×Ã~OëQd¨ÑFY…8,þL¼L¦ðÖÏÇ’”.YB’ø°×9¡G‡ŒÃвð«pC_à ã·gÆPKÛyõv~ ÝÖS~a& '1Šº RroYH‚/Nß!꬞æ‚úâc‘²’ŠIDM¿ˆ}‹×V³Óün—â:1]Ý€¥O¾ÅwCâ,K½ ¶ÅU½D–^Œ#YHו*¦WÖr!K‹M­Jít¡©oî~g 6v1MtÁ¬ˆ3$±0v¥F˜ëPX‰ª'n ê“ÆÃ¸@êŸ i$Ñ72ÔäBðÏÒ‘3j!eD}oc*A‰ÐÔ-ˆÛQ¡'v¥‰tuÅ “®$ËÙø¤áêdm‘’oá³6¹Ê™È³A¤ ToìÓÈc÷ö´H‰GbÌái^Äù¶‘O˜ą̂Ò8²Ð3LÂÁMÐ6x;øÏÄ=0Âjí§+¬È¤Þ|@mÉ;w²R=¨Ñ—!B`Sþ ò)2¦.Q¼-fC:ú@žð‡ö‰ˆŸÂƘlÍ7´m¢nˆL ! 8Â^~Q¾øÊp‘ »ÇÍà0@¤‚NÊàÙ×n`E&‡² zgF'$ŸÒKDV‹œ'R8vØxD¸}ÀƒqRí/$ÃüÒ¿S~ÓO8 ƒ*N¼¾oœ…3ïK/6‘Þ`#lŒÍXä¨qu–­“mSš{ǾN8‚“ñ“­"Þ‘€|0žh@6_ÈWÛ$(ìÂã“qRa'/B"{G?=Lë¤gä'ü…Üœ$JoÎVÈ“ç“Ø}íuz·¯j®°pµa•˜DÛ-t­1…K¤ù5ði¨Ã¯6«”΄±¯È§çƒëW^Óܾä"¾…o¾ýd®è¦¼Ò€EŸž“M¼ðz?±é£6Mü[4^‡ÉÙN| ˆ•-Íõ- W KªNk>Œ‹ì‡K‡R†8,nÁÔÀkr 8n ËÅ×ÖžgtHÄ¢¶ñÃ.(<,Ý›ëóÚÑ%ôÏK¾B\æ¾kµëbF(daо7§pq[uœÌç‹™ê_ÕôjÑÒ ¥´¹¦&öQz}1kK@ ¶JÅaÓ©å[~Zñ2ßÈ?±Q#epÊZÑÂŒèI'Í•¢ÌÓÑö!&]¦syfî—Þg¢à+Ê,\1„µÁ—'è2 ´¾Í7„ûºD:ñé+òLÂà9xûÚ =¡0›ËXôÔ:Ñö½#Ù–çÂ!¹˜¥ ž‰6$K.3÷TJp‘¥÷Lý7z≛0nÔFlžŠˆôà’\VKá‘Bªð¤+Ô⛺ª¤'OYÇ$ejv6ˆ'ÁƒiƒÌ¹q›ôæÃÆI…ñ†RˆÚHÊ,(LáØù‘é3’Pç;ÎUV›òJLŒÈTÒF¿M'y‡ùCïÞWõ@>™:¼©’’‰ („‰š©“÷_hçbd¼ÄìÒx’ó ùƒÚ„¹yS+ ýƒ>HnôB¶Ua²¹ˆšWt*Ž{åKTG}uÅÞ§›ÚŒ¸@1êê¦ )0„|Qba-­}mÀ‚&—;Nßw¯R'ò ÐŽ·ÄÀÍÄhBW‘n¨Ž­†ÅAl=]&AW Ñåü®jM¬J¯wVŸ¬^ÂAV˜÷¦¯^Ç¯í »¡¿(CVèúŽ1®Ôî‰*-heõÕÞÓV´Ô ^ì6èBêôLŠT +òô²Ú*½š·eþ+¦ÐiBë[¶Q™tó‹£°>“÷U1Q‚ziøºF‚>‰Ðw¶µÍ`< ÔÉ6Ðä–™v¡ÔBÁlÍ›Þfö,õŵ¸%û]±™K¡zB7þ>9ÖZP˜hfÇÛ PLdÁ»Ã‘àk™±úGÈOá†cî&E0;½Eé•òOjeV¿ªÎø,PHÉà° §RžÌ'ñD ç…"*ÒIÍUWMÉ£$zF1 uÄž+‡£Rdód7‘¾äŒ•1‰À6«'Û=Ò<ÑÙ2þØÆ—ÇõEv"ºçÓ†“çN2•ÈTA21{YC€ÌÈ‹›Ó"c@wæ;˜÷º ÍLÛûý‹°³ íÁ1ÙQÑÍ7Ø¥ ?ÐHlqG ç ÆÆ0†[€JøOÒƒñ‰heVô }¹T”nŒÀìÎè7N£”ÊibúÉíyÛ;º“™”»;â±û^®>©_t»+ÊÂî £Vâ |qëNX8„$ßÿbmºøPs òAïî¹Vè0ÄR;uÙ¥ 奯‡ß㼊t»É,@·…K†ÕíÏŠ_¹†¬ˆi%°|?”Ï*û"Z‚²-\ö ÓÃç5ˆƒ®> ³èp§'ÏcÝk@]A]ìÕÍè’Èp€HPÛ0ˆ`®£)©Bs¦ÐŒ¯ó·(lmWI-‹D´¦µÌW¥oÕ¥eõÁtÔEË»,„%ûc ¸‹¬ëà§±Š»QÌÍžÏKÉÈÆÔº– äúá…}E$ Ñ3;g³âûbs§%äIÝ}j- në(ë{O6+û¿™{×%Éq#[÷ƒdDfwktl¿ÿŽÙÞÛ$uUe 8Î_Ž`V_FuŸ9´V)/‘  øeùòåÙ¨bŠÑË1ʼ–Æ=Ê?vð˜ÜNŠqì´"äŠ úIXá|2âV_täÉèÒü ºžáb9Y:0«MˆåjâÊW(·'êxÕ0Q3¸S*g£tÊ'åƒê9Û…ö¼¹³q/|¹±­pƼšF-øïìoŒÇ7ZÈtoP˜;3¦jß)lÆ™cž¬ã_)'7ü¦ óíïtÇ+£Òv0Ø)îtã§/<'ælðõ§:ûäãÖqïP°-¥j]†/–XßðÂ퉛v™T¯½á;·Ü(•¯“ÿ5_ª$–`,Ø O¶‚zg+J³Î’³#,[ô’eüè4NÀÕ¬qáÞ¹= ðÈêÄŸÌ‚?á m`•¯Ov‡ºQ7¼‹:a]S}Jå}ò|Öë!ôTñ Þñ¿RîØ;ìа;¾Kõ¨<2bûA}È’Rö¢úÀŸü?ÿÀ GFûÆyPNø#¤Anìo°Qíµ#j¡Ò³#ÁHycã‡9îœQ“Ü£J‰ïÏ vaýoµD¹¿zT_‡ËZÛš´u(†òšÞõ%ê dèýúžÄÊÀ‹\òˆ ‰é(CFjµ¹bŒ„1jd*KÈ>á¡j¤<^¤ù Á[ÚºäNd™©¯ë‰õoÂ`0^3["j&%šÃ[xØ‘–žf "6Õ»ì´Ò$dd9úR¼5.’³‹Q•´£ Á… $$Ì\ Þ‚8ÒðEýàúÃH§V¶QSÕÎ&Ç!eìcãVhÔ.þŒ×Œ_¦d#Þ».ï¨êŒ:[Жݹ9F;˜pZã£ðÖyìüðÐÕ¬„ÈètÛ;gò ÛÁ95¯-t=kÒëP'68cʘ½PKìkM~Ö˜IçѹEÈ<°W±Gg;è0OzåÇ7¾½c¶IÚ¡ zçýÄa¸JåÛ›Œuòup æÁ_y|¥|ÐÚdì¢S¤!t(¼MLë0¢òúàœ9”í]‚í Nçèlvòñ•Öé…¾óÀ;ÏA9±Ê¶3 禼ÇnXÅcJ²}2bÍt I*°›©[°ÉûÎ}ðåÄ6fÍÉÀ?à€Ikþ†ì1· )Ú™òbàC :O•ûcÃ*­SГÝÒà’­.®¥k?òÜágüàæ< µpT,æZ §´éŒ˜`3éÕ±mƒ¦˜µúÿfü'õ©êE˜ÃˆƒæjñÁ(M†…š¢R$A¿'Ùš_²]ƒÒ#x÷Œû>0"KKW–ÈÏS“ œO> LÉÌ@@J…FF%Z¥´W2ÑhYád‰‹Å»— ¼Þ(Gy«u¹"y´Ë‘c†‘ÃŒ´Ho¼^ŸÞÅRŽ4Ôü’îCÔ7™? ûëšuÙ…š 1I&(7$ ´À(yV²LÝ/F?_F6ÍÅ߆K^1~¼~9f’jèÉêÙtü Î?i6UŠÜè;-:Ñßð'ödsÆ{ÄäP¡=£¥ö5jÅzîÒU§Ð¦høÛ“Çž’?sÀÞèQx?y˜½è`ªB“´ u°M¼qFÙ +mšpLÞ:gªàŽÌs bT)Š[É}s>:V¨†ì¯olq¿ï˜ÁÁìôI븀G燡9´½‰Pt?±'GeÛé?2’¯=ƒgÙh0Úηƒ·ƒñÁ­óv2†ΙCþbÕFf¢ÑäÙ4Aóa¼ßä}÷‚ðìØ[ÁøZgEëã.ÝÊðâá ­RÇd?¦\\aLcdWJo€ V4{§†<ýÒ¤†rý¼1ß°NßÙ+~Ê¿ËPô¤OìÀ¿â‡ä›‚ÈÛ\Œ†¨> m@ŠHÆgi.ô„²§âW<2°AýÀ¼S <ÿ“Çÿ¡½SîêhIöó–^Çi&à!À–püÇdÂ~0Ni¦E#­ƒ…ÿ¢IðÁ‡c7¶]¾CôEq»'IDØ6©„êø“2ðSŠçÆýfSý&V¦¯{‚K+f-´ÆD†&*¹t—Ëw¢Kˆ?ŒFÕ{‹ª kz—þ´ÈˆX¢=­ƒ3•2³MÌ.–àƒÓ†(h=†4æ c*aïy•³j|ñ‹ê“®E“üZHät­Ë,ª‘@y¿âu…^•=…““ÜG½TPɨ9A•™žcÝý*!‚õ‘W€oé×ðš#Žy1Y!! ²ç9­ÚlRÃsˆèP§µ›þL¸Ð‰÷ôYjžEÚ&»7§ÇÞ '}ðó÷Béô·C‰YØ."Cd§Ãئ¬LöƒnŒ’ª&ŽUÆN3l`tÔ/¢iàÐ=UÕÒWQ4¼wÞŽ¡zoy9û×z>ß!ïë‘¿w¢Ã!7:û`üŒýÌíà±1'å!í0wÆ¡åóÆþNý‰ãFj¹íI,n”ÇÆïŒ˜0¾Ræ u†3ê´…[¥6üF½óœødoL8ºü•VñA´€¶ ¿K¬©VúMÄ<Œ#Z®NYÛØÈæôÉì’þù#sÊ©éð!y$}e«|™ÜMfî„&ÏFÀ³ZÈ'å™.$šþb½o nÆ6T ÷““T·ß5RqŽï‹®’oO7êiÁ!î ?9eãöŽ™¤_"YœÎ|H(eXL]ßE µÂYØ3¡ÒŒmÇß–x¥ýÄ(t#öàFm|œT&iEáW«2_O{íšyP"Ø5$ÞþK"bIÎú »œA1Ú wx0‡bP";öSÞ5æWÀ'WFÇ2€·÷•¶Ì‹5ÉWzš×œK$¯ÑŠ™à“ááÀÎKhi «ø‚-ÿ6./Äm"ks‡®x„àÿL]¤§¿ÑõÞeꪊI=ÃÓ©ˆ_òDõ•&M¾ KIÔevìP¿¥£«š-go0—=+·s©¹˜Psëkò"Ùš‘¦e¦)1˜Ô±N1b"DKÜ#e jÊG4ÄçÅÔŠâAdT°Gâ_ ¶YawüÎ3Fñ!¯|¨Ñ}ÀS2d@ߨã‹hòØpc4îOÃ*½ŠtèN›;oŒ!}é­óèÜ]]Nëf΢ªu(®<¸å¬ÊîÜ:”ž8“­[ˆªg‚DûÝ9&g¥ý@ÛéN«°É ÛŠeoy—rý0½• †¬f}b›ÿ¡A%­Óo<÷¤+øRÐNúûÂùÁ¸ó€ö¤ž8l&£°u>¾pvØÔ#ÚWòWhk”ÿ;ýÿØFïp²&0Ù6ß(S›™Œ¯Øß5È!Ä#V­C+Ç¡f{Ðâ8ŒÀÆ'}R‚ÿ¾qôÁ™mb³SChÏ)P£s‡#z9wØ"+µÔ.5Wíg Ú^KÍGƒãfÔCù=õ5œPbˆ¦œ ßð{‡;}Ò~†Â¸Snb|zLJ&2:ÐØ# »k°»¥š‹Yî´Ælœ;ü€¿QþþÎ ÁÝoš×ÆÐvZÃNžÃiF½17ZT桳3ª©ÏÅx4îà#KÆ>4qþwçñÆ{ç[aÛ%ïuÂ[ÌÝœ”®R¾½É ™?ãvÐ¥ƒËØ5}‡¾«‹gV̽SOf•Ö (“Ö“gçžì¨Ò?oÆéÔhf4Žœ´áð6vÍ© ö‡ñö¤:½Ñ·‡pH…¯›Ô¯“fŠ~FáåÉó 6jpBâ >&­Ðš‘ÆP9¯l`^Ù:­ðµR6“ƒrëàìÂl”FËÅVþŠÝÿàüJ-l÷ÆœšŠÕC¾¦ÒݰÊ1¹Ãÿø‘÷ß¾ò^(;Núpg‡/ÉÉžh`ªa§5΢~ŽW5ªÉ®„F‹í²kÀܰÅ8³†‚yÅÔ˜Tc4JhÓZœm0N&ìw(”;×ûdä˜ïºü¸¡ù¼\ÈÅüÊî¿^LÒ’²B€ûõ Ü8ïÔ‘d¤@HBgb&$N[”U¬[b—©XëeÉ´Í‘Vl¨&îêÏ`§È¯ËçEǬëjÉë7—À=™,‘"ØŠÈ=“D`f{}ü—o­:­§ãÌrH´È†x¬¡²ª9ĞÄÂJž…-в¡1¢ð'ê¤<é®Z ;vR*u×]Å4ÐmŒê«fû¢R¶v©½ŠD®ÝÙ¢¥ËÄ6Öå¹*F%wk?dgŠË²ùCƒeš1À:³ž üÏå/ {…ÿ¯ÿÚ¯}›»TGêwꋎC_㨦ÆIS°¯Üþ/,%&œyWÂ3åaŠ6‰Þ,/XšEþ‚àÝ_Ÿ"’zYã2“ ˆiZr:Bì_xënðzÓÕŒ¿&y-ç´ŠÕ1‡ëEµLS–ûŒ Æ%j%ÇåÜ•è£HšÿålL¸\Ÿ´ÐÞi9;s®4Ë‚þ{`'½27ZÏþ€FëJE1zÞÁ åÕcÜÁ¾ˆÀ°l¸&‰“Ò™ ;ñûƳa'íƒöÁcW+o©ôJ›•»ÓMÂ{ô—äMÖ¦°NOQ¦ÅÐ?7ÌØœ‘l±’yƒZÔü;tΓûƱSw¦qŸ `VÚ‰¯9Ò!xw" §é5ÁFhmMcÐöã–<…9ÄMð"‹Æ®RŠ9eòøà6SÛ´³…R#uº‹aé•7蓾c˜¬Cpê½ÃÁíÁó³Ð>øŠÚøû;»ÑïØFåƒ'5ôs6>ÔêÌÎF¢|‡ŠF1›,twÚ`û™6yz ü¹Q öÐ4«Û`œ˜Óœç†5ÝŒV5Œ¥ ¢ \6Ø~Ֆ㯑n¨Dvã‚#ü?ñ‡Ä9ú¹Uú`ž²ûƒãHZЧð¢QñÔÞU¨èñMMã‘ù5c8½ÁNý |ÀMý=·Ï/š<±=ᤜØÎ- Á 8ý‹šÌÃfÔgÓµLc#åÒìSV|ky£ìœE=¶¶DÔ¢#ØN&ž›8¬Þ˜ïÙoM™øJ è¿s”Ïÿ‘Å€ù2ˆß½RƒÎ›1‚"‘ú?%K^TãyƒB똿ˆ›lšÖþ.k£ÏäÈÏLºó¿Uâ.ËC^¯¶^®ýùoÑå­/Öô‚rF—?}‰þæ9L8ŒcÄ­%_–½iºþ™¨Ô”A/#{/âÁ×AÊ`!F˜EIçÙ¹/¶ewê‰+ª–BuA.š›hÂ!ÛSÞÎwÊÔ黋}ÍLÁ/nÌA‹È÷ä V_a4öÊñÆ­sNܸŸôÂxe7æÐˆ•2!Z’1"áûÖ›2¤Ã¸"Æ1`Ÿ9cJ7d…¢g°æ¬´Ð™†O¶Âaü{ò^À¤^Õ²f>³Ô´9g,yÿ,¦Â/nÂq…çÄnü8ø]2!Ñz)TDeµOARµBáüy(Ü‹=2œ²Ò•3'1n!Ä©:±Bpp›ÂÖÎÆ¾óèüðÆsÇ:V™»ø*uà“½2àé¼Ý÷‰Gù×^f‚©i0-ª”CO­TUCá*¼#'îLc7ÆH²ã¹kB=àè§æÓˆª)WESN•êÙèR'ĺ­rç±lØØîxãÙÙ7dСVFHý)úUh1Øát†S'¥)ÃkEÊÃô·[Ø]U÷n”Æv(¼±6ê&3=+ì””£æÔES£Ü„têÂE\`0;ÕeRB›ÒŒçP(æOy¯šyR §ÌTãHÿÙ¿d"G²­ªLŠ›DÒþ c™Ñ+FÇ5öÿÕŠBù|ðú²¹6Ä'ñeHcV0É’|YqtV~ñæ—c^~ñ[)PùŸÿò7ù¾š„œâþs Lɬv¹r)HpÅPÍ?Ý.ÝáB:%¬ÉP:ì@ª0ÍMùP4vçÍRfQ˜…õìšw‡G—‹ŠgÍ蕽$÷1Tþ7ºs?ñ–Œ:gÛÅ9+ïƒÓ9Œ[çÜð(c–Ôtê™ Á¾øC“#a°=è‡f<·ÁY(Hèo“¿žA|lbåzaW4Os!ž!á'hu§ºÐÆÊÕBrÇÁ&æ\L6Ç7ÝÛ¸WA› æè>¡Ó'žð#œFßÙéjþêV`ò˜ì^ÕˆK—ÆÜÔê¡ À;ç‰9»s¼³¹–ÓÙÙ’ r 쪄çÜ逕¬ÂdV†³ul@e‹v÷;c`‡ªe¨`6nìFwÎ'·7FêõŽÁ‘"¿k…ˆ~nžJ,=ÕD IDAT¿¬Ÿ'3$]‘1¡C•}XeÐ:g“HAºÄmÒÁrcwNWo©¡jÍìÔÆGÇŒÝ86ö§ìWtØÄñs¨òzMŒˆDªO¦Ó^ð.h•³]íµ!žqI rhð1Ò7g£Ö1EÕŠŽ {ʳZ{¦u6“ÎJ$çWèŒìV'Ю ”;j´Ç íUGñ…œÇªpz׼ȠóÌ÷]ð@î¾ÂèÖñ;5ƒïË|~}ÉßN„¥u™òc¾Ü ‚V^–ü·m÷§·þ­«úW…ð&5=ãV”¬„‹Ò¸jg%‘¬+•ÙúîÂÊ§ßÆ¼­9$xé‰*.LdT,@ÏÉû°CÕEÊMº4œ0Œ[4p5ilФ‡ÓaÚœÞØ^9"FÞhwÚ›fL?&wøRxk8NuWŵµ“ó”l . ´@žƒv¨É©á)»fÍ(!¾Ò˜tx¿ uô#«n hwt=%†ƒ>>9°èhYˆh œd-úyéʸ3¼E¤MQWÿÀwÇo™ãßw ~ñy-nIÿU#þOšõU-ø7¢9\!ÚáX„W)È!5+%QÀŒ–×8–Þg¨ D!÷fx¿”òx¥Ȭ¸lÒ7¶¡“cpÏö=KÊÓˆ¡t« ˜ƒJ)gÜäl+SñÀ“—5ÙTž:#Q ’û&ú“>ï—¦$Fawq,š¬Žgmjé ºÀœ£ª_èÆîjnˆ*H„¥ÃØ'ÑÐ0t¯Æ5CzA65ñÃPåÉrä€7Zç,øÎÓÄ,ó]Å? žI½¨U‰HGt£§óÞø¹°ulrVŘs±÷LÐãƒ-4×(W¶Î·“Ò“ýTSR?U¬ž¼çÉ^ø˜”(T4Þ+-l9OhZ–í„Fwv—=z:-”œ·É8é!ê¹3k*©,ð*êm1ºãO|í$KJò`¸æ®X¶÷¢ž‰˜ew¦äâœÆøÌÔ°A+šyPÚ+–'å"EÛF9ô•¬Ù ×cÒ´×}á–h_ ёݙ=[/;9Û±ªû_¢Ñð¡v™g—|8?ÂÙÎ÷¾1Q­<%/ƒÎ`!wèjݨE±oéâÚžÑí„dI&»nã½5|×4÷´Ÿ©:/MKU%ÌšpåüS2€òø/ÃïšòÂ¥yêzëÿÖ˜O ƒ˜å¦ü‘ ÒGͪ¤r\,îžê VÄH› &Ñf_—d‘Føík®[³ÏHÉŸM˜R°(Nq(a ®g/Ê¢_\ójvÂVZÊoL²B^Æ>Ô5Í䨹;õä¹Ñ&çmˆ×Ñï´ƒšÈÒ£°#îD Ò F}¶ƒqÃÖ±¦*C‰u§ftÖÑ,õöL(#3SK]6ôá"•ß&?7,ä “XÍ´‘ŠIq/ÔqRõ¦ £Õ,çœlhúëÙ¹….^¡ï‚tžS ©q©1àéjá…»¨±Û«Ôl¼Ëë´à•ˆÜ<Ì\Ãî I¬ÆB^Íi;˜”QÖ(Q]踳ßú¡)DZŒJÄ¿qªM7ÍRŸ#¢ãг3 ßy‡c`QsâÕ.×+mÉÉØëþWçiì¡¿bŽrü`ÒŠâ>zRéoÂSH¦lÌ`^ô„] b°šQô,),øêªYnÙp:ñl½ì¨V_Œã<å3s„ÆX¥ÇD—l1)w-^(õ5ÎÓÃñ)ªtÉ,¦A À¿@?Ù víAÏùïÎᔪf¦ûÓOÑX¦ßõOü ¶¡÷¤¡ÿñÇÈþ—߱οLþPSþ¯áÒmÝç’¹$B±¸Áµö<’SÇhÉ‚÷Ë9ƒhmßìÒ4>’×Déºë 8c)Âr*PIÔ¨€VÀd-SŸÉK¤À;£+ýtÄ._ª¥zã˜.â*ŠÆ 1ÅÕ©1rgcl_àÆüÆ9¤Ù·=8oÔ&³>›:lݤr¬²X§LŽÂÛ7¾ý@XÐü““¥è,ìHô`;µól´.Hpfj3SÙûiÜ]26acLnq%Y¢7R°3œA àÉÆll»þ[4Ìûƒ÷#of‚¢ÖW Ïʽsº°²£Q 4i È*>¹mŒÂß:·ÉxÆ3ü" ²VIÃŒžR”³@qƒ9nÙàécCE‚È1î;srvÚMök›¯Ì, WËh¦¥Rz9a-B”Ž5:jpeiU úePSB7ñgÑ{Q3xŠ€Æ7¥ÎáB€éXU™ÊSw/˜>ð®·Íap6Ø´z *× ¥aS8g”.TGåB1q‹g“”äý9@‰èåë?äø5÷¿z¾ÿ‚7Aoñ"²ßm$ùÄ‘öVËFå ?¿ÓR€Å2œ¹‚}³jfÅ„9Øc_6‚ô¹p¡dÍË.Lñ¥WÞh“Ó¶Ô)X`veÁkW¸@ɳF¯ÔS½lƒLV6!0Ñ;ܦðÜÖŽI7ö7¾‹slüøo›&Å—¬"DÙÓ¨Yi(ùÃќħ¼öLðg>/ÔUr#G 3]í]…ÑSø$wQ$^ö”A5¼1åÆ|n&1ÝêÐg€âjÓï{P ïÔ΀­1&4¶& ÛOn)šÝ7Í!ˆXØM'aà~Ù1Sª*Ÿ"¤~ê lA¥ Fwêä«sßIv !¿òdÖ¤ä›Ì´XçMë0Œ{8'ƒÑiM\KRYh|F´7f®¥f¸3NšÃ¦ùDpšKO]뢅4;¶3†P }ö»œG<\7fWw[<Ù±²„4G^4­ˆLï”&ºèʤ-“’&eæZ”£ŸM«×(Àj«q­º­0jetØØá9©U««DpÕ³ˆÝ¥Iº9Rç™WWi˜ïˆƒ¬1< òñqv2žoïÔšú:«h_^1“ƱLUJþLè4ýÿÿ8²*ù¹n=S:"hd•-ˆY3‘i6WBÉ»ZùýÓÙ"ŽSú¼pz—Ÿð´Ú}csµ·å¤Žl>Ì!kò¿)B·MclyU|hçÄHlàžÍñÉ`‘Ͳëd¦c*¡Ð^„5é³<±ÆÙÙxÍT\©•gðQK‡Ïœ¤ñTå¹–b19â>±ºg0g‚¹ßò }cç¥Vk™éze4Q¥¿>ÀªD.ã~iþ`׬éZ쎠¿wI©ƒÔÎ#xï‹õ€ž¸ÂÖDÌÔCZ´m£!Ö^üåÅWôœ7ý‰zíe¥Ã×Éܘ¤y²1ªñŒ²GN¥^pM\Ux‘AŸìPÐ|ÆÃ•‘ïwÛC&Pß –„ü—m¯|%Lÿçjÿ#Ç/“’üÉ2îq|÷­Ëë§±N›§ê!÷Ÿa£ê3ßå+± ûõ,X‹ƒókªä€ˆÀ¡§h¬.³)¶Ò¬óª“6ðPÿι°¿æÌD?Q¼´È¹&8’2gGº¨ƒÙ„\íU§öÆŽø3d~`;eÊ·T1ò†jDÐ…sÇ»¤¯¶ÊؘNåF ÑcùTàR– xIÆj,ÜM°†B¿ÁöÁÃ;rf:/ VuOT~/¸1ª|ppÕñO xCCq* hŽæ–š¸a͇T‰lÔ J9ö'™ ZQJ~:µgbì±T·YŤ0f6W3Yð˜_óép /,kªñ¦NÖKaÍ7•Óc¹{L‚*xgTnƒÃ$(¦0ÃûÔŠ59ƒ’xAVaÕ·2©Z¬Ê3¡˜x»ðgÒ׋6ÕAÛ8›:™Ã–Ù£‹W³"Ò~ÆÍø6E“·³Æ\ÏÎLu8KF\\#?[Ÿž:<‹¥]âSälŸ8ÿÚ•Ìly‘iÜŒ®n. 3iÆãî÷<¤ çMÝ©§cP“ãñ™n¶a‰#µøø]ÓçG ‘ÆVñWS=&÷Œþ|„šŽe3ìŸÂšŸ¿½Ìÿßc8þúRW‘Ö¿¤YGhË ¬›æ,%Ïà‰É®ÓÇžŸ»œí,Ò5z- Ü5ì|r@I:žË3C56ã™û3â… ~èI«ñ*‡:…±ñDikö©ÙE< .UЧAõ)œ3{ .} ~b ß)ßÙ¦ºa·µôÇ寿7Æ.£¦òCèÁfIô¹Û“ónôÊ-Ææ|«T²Ìh0w˜06ʉ;ûW¾Ý¤:QuÊ,Ø‹¶S8Wƒ™æµŒÔ6”0g-%´b3o*ÏF•Ï gg‘X¼R»H¨ `($¶“£&¦çxxG6I-‡0Íñ ÔÕ˜ê{ñ${ŽÉ›P†R+ìµ¢ƒßRÆ`@™l…¤ [FÖíàÑDäŸIŽlSU÷ :e#ÈÌKd ÀhS& ¿8væë"£…2j°5Ѓx«’¿rfЧÎtïV4™V ïç`9Á=±‡³0ëi¼‚É)m‹üñ†uÕ»‚’Üœ3‰¢ý ) àZx¢ø+Dw[—_; zWÁ³:£…|ô†o¢²ø“vŠè¶RïìÑð²AÔÏwö3/f×1¿×ºÎ1žÅP¼’{SïX(BÿµžÚÛwãÛ&‚à̲M1Î…f¡®ÚôìÜ^¹TÞ±¡ Ϫèh=7l0ÝÓÑV¼Óàh´CrÀX¼>of3}.ý ¶û‚ì N²ã(’‹®)ª£KNct¥’Þ˜oÉvØ©•Ù™'uÃwz‚NÓ3,Œ3ɬ'œ•YØ;‡©¾ET|$?±%“Çž@(”çgx£ŸÔμ¥’ãƒ=ƇM iÃ9”öó½S »ñuªFµßäæ—®0¿˜K©Ò9n§&SY{ ?Ê TÆÔô]%ÐæL—©’ÀLLöóÎVSνàw ¬kRt¨ž˜q|`¶lQŽ’ÉC1PY’6®ÒNKP¨ÇÀPÚ˜ê •Ãè« ˆ=‘’¶®£mqßÍÿú%:~Õ²Û¯½&+®q”ì¢þôúðÀv9±Qƒ ?…f¬×—õúø_‘5ðá¥j·Îì™(d™eyšxaÉ“ÀNÍ©µ,D¾^dJgjS{j¯‹øå¢Ê K;7¼¯\$Z<þ!Š[+Ì“Q¥‘«µZ˜ …B,=ƒž-TYy^JpmBèÍUÁ2ÍÅËŒ’ÑsŠÓòœÙ¥áØHzްέ¼á)R MïÇÆê•Æ—wì Â|ÝhvS»©åÄð:˜¡öîyÆŠ¥ØK\IYò¸uuÊ=d½€z0w=7w¶¢.Jæ 7àÌ.Öó’^WúI)pcÂæ<âq #š©¯Gg6î!ì“ãXgëŠ# ®OΦ)¸Ä‘Ô–Õ²Üݾ½H?§œzv¥ŠÂÛ&'´‡DùqZc<2«´Ê씡þG<ÝxšÜØŒo&Ó¸ÎF9¨N3Ž•.%ž{ˤ'>é ÎfŒÙ¸…d( nl¥Î,býz¨Z¡l cî ž‡ÆC³YÄ:ÐÙ§ å«Ûk…˜)ü÷è4|䔋ð Á225Ða OJÕeïGî¾,„®ðÒŽ`‰ãÏTìÙ&çCC1-“c3já8Ò’äÌð@¥‚ž€ít)ÅNTðz›ô®»'x#Ù´ »±~˜ØŸFå?­Ÿüþë×q\@.ôÓË.ºÞÊ2æAî·È$¾N2J"¤ÑÞ’O:N¬–ïáóu[ÊI”ÿ†¾PT²ÅÁ¨ƒ^4TËLÊÏDg gE.CÝ’2¡¼¨FÜ@<'§ iÚPO@¤/Ëï)H_^ĵÎBæÚ¡ F¸˦žëík8äŒ×™éô. L±•¢ö0ñ(FÃNìK¼Õi]à ŠKŸ pêûÉ|×:öHØ7¬ðñÆÿêôÂÜ9÷ÎýãùT…-RÝÈáFDC“GÜð$nz}"ÂÏæ/(Œ‰‹KήmVñ~MYѺQaµ#çã©™3äb¦ùhåõ”‡›‡Úöj¿rØ £È!dÃ.9ÊfÉÀ‰[W4ª®ç2À°Î°Œ;t ï„ a¬Ã€nd,räQÈ6Œ¢8bÑiW8û+ÇÕ5ò¾ ôh쑨XçŒü¬Ó ÏXE]…Üð¡L=3ú Û3ØNŽMˆkÝ8ŒÍ…ÑÅÀ“’SÇà ª+Þ•j‡{n0:^h–b´dÓ\WªÅ Q ?fËÙ±^³z?_á`œe•4È%~£Ia\ºLV ˜éÖ·~Jõºí‚R_’X„QjbÍnfœ1g8è^HawÞi!ì2DjÜô)¦SŠh„ÑK$mí©ø§IA\eà¿þòW ¯Ÿþ6vÅšánëÖ_þD€ÆÐ7c(I׋g^TWÑ•ŒÖ»¨ªŸv9\e]ÑÊ|½“åc¸À3_!ù–¦3ìÈ"“”¡IRä´Åèþi!é^Cú¦'ÅåâÃbëÆìå¥VGq8žÎ,Ø…ë‘ûš¸Ì¡X© ±fx„ŸH}‚ÈK¿i씽ƒë·HYL=-œC€€§O©‡†£Í&âÿYéûÉ··Îá¼ýÍ$™oøvìΗ‚?¸wæÎѨÆxòu|à•±Qr•Ýy%ûîlAÓLõ¡ÕxÆBŽpÐ6qGf]º¿.Myïª Ä¬ Ñé˜Æn7ªá“îÊØl—T*é6bd P&ý+p£ƒ¥H$U+¦á!á2ñÂ4ž.ÿêxÇHñúÁ˜Ó%YÜõ<åÎíàØ¨9AwÂöàñ…[ã[c@Ãvú_±f{ãke{²9ý”ÙŒãdl—i­mlA; Ì'†ŠTÍm.i^_MyCp ¨ÿžh†º‡qÚ}íðæóÌ»DN+ŒwlêÜ ÖG€!³Ñ z (¯ôuçY: ©úC}ª‚×ܳ1’x®ð°ÂêfzËJO¨— *ÃÙ»d$i`¹°CB<ä’Œa”AÛ5glRò°ˆ]6¼R÷ÎXe zçžj¬qWKWu}b¹©ãIѾ[™é9Ï¢ÒÈ9ƒ}c¬§„ߊ íµ¤‰2²q85[ë'· °ïR¤«5Ùî9©Ò8B]l¨ï¬®TûªÈÖŸÔb[ ¯/º@ž²‚È!VUÀeõ„Æ‘k8¦A¤ýà^ÔÿÕœó”´{FE¢®1S±~vãù•[…ñru+ðþûÓÀÂIHÜ3[.#ŠŒ«Ÿ¨#‰¬²~w„êKË:ÛEÊ&0–1µEÙ¶cözA·×©JtZSL±ž™%lw^2#_é‚etœºÓ–‘£°òÀ¬ómÊõÑ–•§èlOx;83Æ SÛ¿¦ÅQOSX±ò|Èm²É³‰ôrª«!s%X®;¢¸–°‰~ÄßýÑóšOç P6—G;’h‘gÂRƒ9zÞyë<+›Ãà4JfÄýÎÖÙ ïÌ(K†ú‰îìß8þÊÛà“(B̧Ý;_ŒÛ´ýÁÍøú`B»3Q î>°öRÿ^¾Ü¶l²wѽæXà’ÓxÂ_nyã’ÝëÙQL>‚øÿ¹á'›¢kÉ=ªÐ]ø kŒ £ã'?Ái\X±»TÁ(ïDÃ_ío1ݺtÆçÇ\úàø7úÁþ[nu$c…A3|g¢çÆð²9ÙŒs×Ý[ieØF¡u Ãs´'³r´L7lðDÚy±‚[K£éò K‹aÑSÔzÓÃúv°§D%¨R›fõÀ—$Âäà”Ȱk±È:2?ˆ\6À€š×Väç@4©É4¼²tã½ÐC’d€¿ë»;î«°d‰ $d4À*3swí—~`Uä–±šešõ>h;8;ÚÁð¡éãtKÕOl¸Ä‹:7ãÕ‹i$¤Tnu*/M(Ò"ð²³j1åeþÖúï±ñæ«Ë<ïhÞÓò¢ìp–Pœ†gõRB>W{yþpWÝðIÉ>xòe‹eU.KvÚài²æd7VˆŽ©«¥¥‹ ç7^O }ÄþC4!¼@Bõa³XVª˜CàÊÊ \1‚A-ÊÇ‚k.|áÞ±S¬çxE¬’øó¶qiˆÖSªåedžZ˜ô©I^ êLzyà2Ô6#ë&´/ ðÆÛ‡Ô:còmˆ|EÐМ’ÊÇF?eª‹jxY m€©üfLuÔìðʉ{Si.˜9}ÀÕ™Mb–-8àSa„ÁLÑͳHª(HöÁX§©fØ^¡ãDOõ÷ŸxŒÀÒ8éS²ûý S=D²8w²Pºàl¸)ê_(†çÀ½]ö"hù 1• UïIÕšWâ;4Çч .)0=ö€ŠÝž<2°#ô× Hþ¤+yP³±Å>xžÔÁ¾Ñv5F¬@?ðý¶X-±ž ÔÔ_ó¼ìej†/®ŒsÂìÊûkλÖ(•Æ‘ý'£%ľÖK¬·éb‚¿0¢«`dìHWgFp–ñ"Ù{˜U›/š¦íX¡Ÿ™©{Jc5ΩZ´u Ìi#)^q[äx*#{£âR¦šÝ"¯]Ê᱆[æŽ\þ¬cL…]ó”0Ù²Ò˲$Z‰ñÒ8Ý÷õÁV"VŸrÅa¬[6’Ϧ&<µûÞ,QŸÅóY•ñ5i3êÚBÚNŒìƒ É [‰Ôobp†ÍPÞh·| ™¬°º@[âÆ¡…¥—F›XdÁYû¢°ªÃP Ï …eɨ¬@2^nÌžÉr’óVÝÅ‹äÆºs+P˜Qp‹ZkPe²£*sŒKÿÑrö-GU¿KåÈfÈà#¶»3¾P+g£l»ám¢A&©½ðîÔª˜u~NÓh§R^™\ü_K›¹ð–ÐìݘkôÂÅe|ä5IæEɧ¤îtà*sS(=Nì+fô= øN;ñ§¨{­CÕx)Ï@5’úk‚„#…“î+“ 7VDðÏ Vªà”x²%÷KD¢ðfµÌò½fÒ|K‰V°àS‰HáŽkÇ}0 ˜³Wœ^úª/~*ÔÅ®_ýw±§ú¤6¼Q#·PáÂKUŒgçxQ3y„Ds2O-½Ãä˜_Ff1všvSïðT¨Pã)~Ú–¹X´F WÍTbÑSƒ¶û ƒqjÅrÊ“¢Ã‰z…ntiœ®3«CI`#°í™ÒñŠcÂð•ÔŸ—#7pðŒ0eI\ÄöŸëMŽä?êäè¼ïR©Îùâ´¶Ëp—dÍëC¤ zÙÜD3WC1²³-,È^7å“e‹e‘ƒÉ°¨„þÉ™›9^«ª¤R«I6«uè©R”ºi i§ IDATiëÇšˆž¬Þ•æþ%Z—K•–±HŸ\!… ·ldÙãìDé2J[#ûÜ2®vÄr±¯ü¦ÈÉ©W0m!‘œ©÷²|»ˆ›°,¬ Fe›ãâŽ9_ Ö¡2+uÊÿŦ­…ãú`ÛT‰ÒiwŽÂî|5þâp`Æù¶«¡61ðÆ-DŒe{5OµÂ£òÞyîòµGÈVOÍ ‰õ0šòôáð”Y7§T¬ópö¢Î粩§¯œ’º+MØ)Uóa¢±«7ÚI«B{»Ñ:Çì,úB6Ì)®Æf7zņœ ¹*¯ç¢çU^hFÉ•1/A.k‘Ø«×Wº¼ðFACÆ ÅàÌx+~x¾.FáÔR´ïöU^äT Åë;éµå.}íD}kÕ´ ­} Ê ` ZÄR9¯"4Æ_ ç”kŒU·WÖNbË °º‚<£OØÀ, jô8é¬ –T·Èòd7úy¹½A93I¦ÇOKl¨Ï˜wf%RB%ÒLG¤d’ÄÅÄ‘FÒvf”£æÅŽ4D^´WáÐ:sÇÁ:ã„“vK9OØüáôÁ½+š¯'œøF1•tÊZ!Šˆ%ëH‘¹ñò:±"Ó~/ò5Q߈‡’tÍÅDGAb‡m+¹C$wêF3Ï®Ô %?°g¾ý÷=e=ªj¡Rwè´&Éœm¤ sXgÏòFüm®•¸fÏ€Ýs¯Tc9~1î–öº´LçWNf$°¦ó°VD¼’›‰¤bŸK.R¤¹º0V6wu}™†¡±ãçþ ÓBÛ‹„Ì £F„>)1ÑwBh4ÎPØ7l§¿Óº†aÕIp„ÌPnµ‡ãTJB¼@£L©Â鹯“é˜IPÌþÊvÃú “r§Ý„éíÇ ´µ¡¦0[ϨS;õLf™l$áœÿºnô+~_¿²Ï_|þz=ØrýÖ^ß–k‰ËöY_ä)®ƒß´ïvyOôl~zIÓ>ýä·Îö[¿K&ð*eõØ Pœ>U`ø]£./ñoBÅÒ„ ã–¾VÂòßÙàÙvdÀ¬§ã‰×çIfn‡à¬,Ù³ÀèÙI:Ï'Þy‹=¾AeXÃ;#8 -U~/Å’>_â©Ñ ¥ ƒ2%Ób½Â!‚¬=Ÿ;‹©·4¤J&cê[.= ±xŽSøïVŒc‹‡ qXf¸§R‰ZñîB½÷_Pš/è¡PT¢)Ij$IcóÂÚŽŽÁ“×O꣣útb&ßÔ [R5®!²æ«û7ulúewlXå‡bεvßÔ(ãZbލu( #kά*»âé ×MÛm¼2§šKÅw‘ØúÒoÈ–…8@¡ä½¢ÂhøŠNæ€ãæËx‰O–ª[= 'Vé5å$M•Òfð¢é}±ßÚÞ@Dpx¡ÌÂ4šq>ðJÛð(ÚàÆa¼=9Œ;JÑVØh§ŠÉž½¦±ä‚¼X ûºøÁèp£UܨsÃþAÿÆ4ÆM“lçÏ2RHÕ]y¡Àñ¾Z¡±qÜ_èr|Z/¿k÷+ûþ‡+²EÌu)…H?¬‘#ƒ0ü±X5ÁR‘Jg:õاyë´gK>ñÔωÅoE¡k¬¢× ²RNåw>æwǯ‚WY8%ÂÒ®˜}¾9ßE¿©ÍÁ\['·×[š d–†÷S™z;øÉRs¬½gçnÆ]Éq¡ÝÔ«|vå[B¸fª ùåS8ìƒÇ¿5Ê’ƒõÏq}Ø„R™¯%ÊÅU“0RêXôŒ_Wñ MÜ%DUÇè¿{|¤Ä[4‘Ï(£Q˜7¶Ám0cJâ‰öK‹¯Ú”Ïß+W »¼‚‚øðÍ_-ú¡F½<ÝŒoló¥óC”¢å8 {£9c¨óä{óÕ™·Þd”õ„ªìi|ö×Å®lt pÉ'Œ©blôˆZÎ~óŒËozN›C£^žÀ3@(—\!žB¶,2‘…X)U…g*ƒ®(RT0ŒþÞ˜ vÉ ‡Æ§'Ù^È1¸ä’ˆûã7î;§ñ탷7pæsزÛó®bO4d•Ìaû;4ÀËóšcoÔÊ–r@c`“ºÓ]¶nFoœSO¹Ñ.ˆDˆ×».q.ÎàŸ°wóú‡å“Ýûþ«Ëûº©k¶Ë5ä[t {‘xG[‚Ï#)×Nmjz ) $§‹¡ÅåŠ6“1¡0 ôÎD;Ÿ“¶ø0ICÄS ãPcÚüq¬×þtËð•(Çq¹a—õý¦¼¾ºÜØëÍ¿ÞÆßxçO?Y9A‘úEË•\Mä²A4 n¸ãƒ>ÙžŒ¶ñìjÚèS«:뀤ù…p©­bL~®öÜø†h¯‹U7“9jk)^ýhTøÚ«-#ÞWF Ý[”ý» nòå¡|jÔ Ë[²ùë˜Ü6ø¸h#+íéÍb²Òàib‹ƒæa®¸Ešùº ÷0ˆv܉ @xtÄß“-KëV†&pŸ´#¥Zf!9¼­ó UÔ²&`Zü9n›KqX†>ÑUŸâR Æã³(“ò(ò£©ÀÃÌBH‘­ö”—XÏâSL¹PþõÓÒ1—@JPÙ¸ø³Óâ÷~ãBs1µ0ž'uþaÔÓÒŠãvjWžÎä½¢Œë üøg޵’ëø—SŒëXyž"kÁü¬¼'ÈèǤ†dÓÆæ&RiDoý‰9ucTºq‹üÄ3·Ž¬=ƒƒ(‚ø.ûãY Ô(fË´®õ­ì‹Æ eúØE®vè9÷nÿ7Žk*ƒ2GŸ¾œNqö‘TâÏW‹˜‰0ûÿ²÷fMr$¹–樚¹G̬íÞ+#ý0ÒóÿÔˆLKw×Ê%ÂÝL:Ô,‚deefUMV M(™Á /¶¨b988P¡J—…ˆ2fÔXÔßš±tvçüÆ.ìò´›ié"56lDà*ǾYSúQ|RÇ "Y)%QbŸ^'®Öa¨–1 †!ŽÀSŽBˆN”&oH¦yÕ¤šîÜiYpTJO¯œÃ{îTOp¯ÄRó÷úˆ±ù!Šäó4}ˆjú0šÖÍ™¦¾pÃ^K”O\йn´†mèå1¨ÏôOì·p\OxdbT¯´Ç¥óQyâD,/)7š è…â“=@„þ̸QzvÏJZMï>ÿ$Z0ò§áù[w±^• Œ«0J(MBŒÉDB7ɰ¶@‰é»~OtIÚß‚þî¤AC/¡¤ty¦5êŽFg7–7l…Åvj§5–ʽ±n˜°Áõ‘ûB3dE>,T/Âw.íjÔGn««¹UêÊÞY|=ôèÈ1o:}D*zc5vhzÁtÃ$¾Ëʾ@G:Ö¢ÁÉôûòq`z|vŸ_@4¿ÌÃ÷K Žòì)ëÂXX$h hDxu;j-zA”îÑw¥¾-”‚¹#qƒ£ÂH6yKRƒ› †¤<0+\áÖEꈄ…ñ-©[Ö'z®ÌŒrÇö<7É9q?3øÚt”fd¡Ì¹Ê‘ÅX¥wšqé<ÍkàÈïõ;4óÚà=\1Y¥§]€.=_Â’Æ¿L5MLf~§Q©¡¯‹ ÉPv‹'JB Têé½v>®úÔ¦?8¦×†·CpK-iþ}xH¼fÞ‰²OË\‰ ÞÒâ[~œßœù×üÕá•'Ûá—&¼×D*Ogˆ¾huMCæ’³ÅèS\PiƲ³/ ´ÂÕ5Ä­0ŒÚ¢]¶÷”ȆZÃÓžª) ¼¶ñZ:½OFpR-´ª,®ÉìÝa;û-ñ¼Jr3¦Ê‚f1Ô„FF[y¦s› àÔÔ >Ó›°›1 •¨ÇL\,V³@«‘O8Zå Áωî_U®Næm=ñ¼Á`Kk>ìÈ ã(™Ä¤4´MÏjœA\-èóNùˆ¯±^ý§zD‘HÆ~ƒ{Ò7‰¨H‡;ê¡“+MvºP.àì/E¯è…½Ñ=åÚiwt ¾®IÙ.È]B   ܱ5ŠD×nSúGúˉš"'ç‹§ôä‹Óòpžë–“f ­G|è ;ö‰Òi‘w«Jßb8-¬ær¡*ØÆ­q}‚…mem|ºS{Ô Kaoðg.Êý‘ <'=e׆P½q…}§UVEÖD¦â\|üì5(êZϬ ÔÆètò™ãÏ¡E#ƒ«÷ñ<¢Ê½ò÷J{ê4­ÀÎ¥Ó(ZA¸¯¬SË(t£,W“ i1ãl”`H¿H ~™‘‘eZR6hŒ¨ï¾!Ôm=H5qZ?4›ŸÌ¨—˜éû“¾³–ÌÑKž‡&Üïý[¢„S˜! (ÝgÔE}‘Hv#ZT+»Q å{ôáïÄ’Ó_4í~„SíG·KÈÚxÇÐ —Æmäp 9ê™ áúˆ±†SDÉI=99Ós‚{alÊ2¸g.âOQ +‡wñ3Œ)¦Ù5n.;CÚt]šA¢Z޹(cdOòxé}’Ó<€Ém°” ´ùj›ý·ù9ƒl ‘ìoèáç]ë\³ÄqÀ8ÖîáxŽÎ祡%î´FTânW¬ÄŽE³B5¢ÂYJ4¦—#tÑ鱆þ‡vÌpA–W} ](v9¤fÞêK¥†öZ–gÐÚèˆyÅcОè©Ôz<…yÇÙ³Ž¨^8NZReE„®•Ý¡ÒAk¬ÞlYYa· |”Tõr3z7Þ¬˜°Uºw´½Á<¨‘¯\WžwšR”ñ–n\vÚ†UêFW–+ý‰^àWôÆr£ leQè¬ÆÓ3e¥ÂÍS¢[ÒaW¤Q?1œF•B­×'ž¯z‹™ò†±!BШ+[cõ°áøàuÑ‹M(#ã—~¡ß©wô‘±Ç¬:»Cáቛ(™:+(ÒNS´ ÍÛšRBÎçR(ë+ðÏOŸÙ3švÜýÙ‚ú²ªt +g;BèŽ,dŽT…±Šv†0W¨I¥õK\S}Ëbqm?MÇÔr«èî§ŽìÌXé®áêzì/®átFg½`oY”Þè÷¿SøE&—„¿yÿ|ÚŽ?×i‰<°³‚ E³0bÛÛT¥÷±œ zÍDÌï‚nôU‹ôÜÉ OšÅÕ8^NÜ!‡·)ó/ÒLϙϒ<ÔWŸ¦‰KHdÄ]Ó‡(mYÓ…(9<$M³8Ö¤ù­/£•£áÓc­Ì‘8î ¼.$¨Á_†C4„ÌôÈ‚ô©“6S-/ÆŽyð{èЊGú)e5Z°Z¥+*Ô$nÖ΄{«3‹bИ»_Úö¦Dc¬´$YšPwî=¦ý11Ÿ—$ïoŠº± ÷+jçýà7Þ< }pì`oYvÆ‚>cÄsŠí´Ôhl•ëBó–ògÖ–pÿmì>&a䨙[D*Oðvðé™Ga7–©<½áÍÆøD+¬Â¾ƒPÝh øLé]Q¸­ô-n²† Ï™6´ÒZô‚øô(´jnUÙ…+ÝhÊ£ÒZôðÛ•‹±ìBí¨r¬DYÒvJ¥= {ÔÛDàmðîÚ ºm‰¥4ªqï¬Ð5Ç5[ˆU¨Å•دüÁ?ÅxE-”<ìE*®­OtñsËNÝ Z8¶ìÍL>›H ölÚpEÞ¤ÿûеvⳇ ÈÄ1èMâ܌֑֓+4ký•5¼TyW–+mÇ>q»CGÖ¿w#ØðI%Rõ‘ †)L7Ö³»‡P;[Í =û_$Ž*¹Vì0…sfÜ ÷»ým%ó!å{ÃpËiÍò×Ó'gøìNäÞŽ”½ÁaO¡Ï¢üùÃA½„ ¦/1á E‘³Ëšo˜°“ÆaÌæNú¦ã`®ß«“QÀ‘GǼûÙwüÓìx²ÜœÓ'yìŸLµ£Ç'l1…ùˆÇ5>gÜÑ=C¹%î•§,¶£w°ì;yS×–š‡ÉÐÅñtQØ0"G ¬Fc””–ÜGh 0èÙFXD(M‚)à24´sâá‚]1eé´F…¾QßqëŒÊþ‘wÆV iÑ ~o¬•¦A߇gZ¥=æ<²{öî—è-„2Ì]¹ J™b°ÝYïA§‰¤­ÓfdÔÁVÃiæg¯±y…ÌÙ+ÅhJ+\”Ͳ5´Q*¡¨¬ÛØ•‘ ¨° mŒ°lËí3ÀÂ}g-¡b]öá[Ï¥µ˜Ö·†f”>ÐÈ1A •ÞC+)vQFÜÌ΃ù€ÿ)‡ž”¸&à€³£ÃíøìdZ_žÞlÖ#v„¥~¸/àx' ºå¤6ô@Ñ5Eü íµ9ÌnqÌ|Ã!•‰Âð™ʸsÿ æê‡%øBïN`‡ø+Å6§CáL G3S©c´˜¢¥Ó¤ú›¬1íÄ¡´·Gt ^ n6z…}ÜÞmܧ*@"æóÕ <’GèsŠz“q$ü"§î³píÉ‘ó%f‹9Ĺ¹+›@¹&9l"õž©ØägûN|0Ýû˜ßîÿDæXd¯€Î<ÙÄe’YG&.™n‹*ÓëØJ|‹S’$;lÀ=²œšå®=žŠ¥™®‘Ÿö]½‹rÖ±÷ÅwÎIô¤0ZÌ*Ù;¢z°$ýÒÜÛ9;Ò”œéáJWØ éÔ…m°vzaÌ=nLJœ?#ceKa¼¥Âþá˜Õñ5¡ŽŸåÒ@E$î6Ý™9Õè)Ùć õ€øÝyuÈ*Ö‘qhBŒ´˜’Õ÷¥SG);$?MÏ=…Ï/îÍ«]ðO±þñÝgßs=9ýüƒ/àp?øâOáütfLyĤÇkf=ÀÍ + öÿ;ÃBY¿z‰>-ãï}þP:ÁËFƒ9c%Âõh.RêaHgdÈ3IHdyS¿!BË$ÐBj5ZRÓrÑBk¨ FE+µ-!r9,£M:WÞü9ÑUM‰ùàâÂ3A›o£|oiàŸÏf IDATøÂ†±´&/ÇLÕ"”°¨‚â<™TÍŸ7—SÌæ[úú´ÌÜ0¡’¨÷d$ÍêwTÚõ¸–bè¡â šyCÆ F1šÑìô]5#V§ÒZû™“{ÖxŽtÆÉBÅ ÔÌyZ¡¿¼çvÜ·yCM©N@Cmå¡sû âŽÿw\6nBùˆv¶w,…aȆ~àù‰7¿áùÊ2èÏØÆµòQ±ÊÚh¯d¡ÎßüEä¯Níùì‡/þëßò{ù^ó·|ÚO]~2TóoüçXÿùEúÙo^ýüƒ/ø±/öã¯<ƒ¿þ!ƒvC:RÑKN”/’ŒÁQTÿ;8ÉêÖ‹ßK§¥œ¬æY¶ Õ‰¨;e„攇lsÚIÄëš–¨L¤=rÁͪ$áIqh«¦t°´4Á4µý"íòŸÎ^šö2Nÿ=Ì Räœ$XÃÛÆ²Šécò%_9f’NÀŽÁ×ÌÀŠÎ[&ÝŽ³y&A·×£ª%±,<ï ¯9B¡s¤@•fè1æ='üº’Ãèw¸GcTWS¦&–ZÁìÑéK^Ðî±~†Wa5{lŠoSæzœÂËD;(t‚Áºp‡õta¹²½áÓŸønçS㡲ý ÙXï|Øù¾ð?ù_³=³Ã÷¿¬Ô ›Å lJi™ü‹s½ýÓ@õoÇ=~Ê3’l6&³0 Ýò1UÔ¦ $0êŸ{|~~áJŒÉ¶¬{È Ëî5ÛU8q(Ó*M[õI‰F B~No1d& šd䉼ûK±\/¯öõ…Ÿæ³C`ä©Êa4Žî¥yýiöåð¿ÍR°¸œôŠ=å’5PW/ y_x$%šÚGêm` Ê9 ”+抙iD[ƒbÞ-:9Hf›)ô©ñ2Cïô‚\ ±À^óê@³%™ŽÖù‹#%C¢•¨†9 ;k>;ÔÀŽÕ`G,ô+²qûøíÂ{åí¯ø¸²>Qw¶J½Ò7®Wög:\oÜåÂx -è-{ÿxÓ?´×™Íßø^¢Ç×?A‡ð…¾D°_üuüCÝÆg'ôW¾î‹'ÿ“}Û×>íóm>¾þt>¿oçpûO@^þ 3Ð8¡ü_]4dê¥x>ÃåaŒšâlŸð§7'*xëü,^û»'šƒ`1)sä€Äý‘Ä \?ÏÉ‹Ç4«ùœò«Ï˜Û\òç¾aB:¯~ÿßõC/Hüas@O6(;x:¶xZF ±ÉyV.}1r kܯŽÐ›Îá@*]¼ÌEK$ÿŒ¨ˆÖ²·CÑkÀ”Ý•.öòw¢ÏÞåÉ\ ¢5ƈ…éûÇYk³PtXÿ—wÉœÈo”†4ÔÇó>Òì‰7Ï|‚å ­¢ ö þÈÛZ‘Æ~aýK´‚ó@»Â'–gî{´æ¯%ÈÇC~´qyufÂC³Ù•Ïv?G>å)ü|vç_ÎàŽ—=çý™!ÖKS§/Ó)KæÂ<±èÐ|ù½¯JºH»å^{•Ñþ ç¼e$\“%Mæ Ÿ¿Q’vÁ1¦æ¯û¶/ž†¼|£ÌoiÎã—>YoBóÉÔœ_׉éðÌŒöt©6aÞÓojBó]»‡JQœYØ›sè&rðâ-¦½-Ô¨z‹p3”-¦›µÆ"/â?æH{ê}O~ ó—6/W3ßÏŨù{IF°õëÅQo™sÜiRe,[QüÏ!¬q ±·Áõ-7e½D ö‹f|ö×ùçø¥½øëÀä`q›¸óü·#.\R]ÜëöŸŸFÐ gÃy†x3iŽÕ}˜¥üASæˆ,¡Ï¦ÓöRÊouÐ ,'Lx¤u:­ÃŸý=GÍüt"G–Ÿí#~DÀ)¤W_n_Ãç`Ëâ$ÝyʬycÎ?¿XGùØ"A—"Œ† G*¤TÔHž¾ÎÓ~•ñ[„³þóq?O³t,Cä9¹ÌCÕIˆÕác“-—ÁËEæ/§GW—ÝÐVäÚ¼$Yéõ9ò8fb“ÙÀ É_‰Û–ìÕg|¾ê_?ÀS1Ž’|å×Lù¿Š‰ÿÚ1›'æ=‹GÞÑ…›RzjØ9M0…Ò4ãÍØ{Yˆ!#øµç4„åξb°ÜBj¾]vp ¦†j¹)µ„`†ÎM¾FA¸¹ôNQ:ÑjTʱ‘Zg´Ô‰â…EˆË÷°Ë¨ å[£û—Á.ße{Únl ÞpyæÓÊöÿ(ü^yø/¬Roôô+ì—úioX6ž:‹$Bø*&õÒ¦YÒ&PÆñµò÷zw´E;ñ¤ü1#§lŽVƒA©·Ü.’¤©ì}¬’~TSÌ\`’ÜS\¤öè˜ ã;[a¦‘>#±%~aí>„Õ³‡³ísCÍD5¢ŽÓîŽ)µù†AH=’y”1óJÊ éq>’Yì<áPÌt„ü='«2qìd.BŒKã´ç ¢'GëøzŽp¶p‡ëßi3oGìqd’dÿÌ삇b˜r±ãC\G`Qo˜9¢~%ò…‘o|ñ B­I}¬˜Q;Ûª4‹¾ÑZ¸yËç?b$äW“xqÊçÃNÿåå|õÆ¿åë~ì[þñÒ(…Ñ”§Ô -‡RZ´Ý9˜£Ò:±-stu™Ór_£[uZ¥ôX‘n;lÁ”2B{ÄrQF¶—Þº‡ª~J ëì UJE<ÀÑè òeÿ­/õØžQ-úÀ‹‹·|¤| )õ×tAx¸q>Q¹UV;·üÊø³òîWÜÖζñð‘fè5æ¾½âqM»ãÖ-b½”qã;WC\ÞÂXNåh9d8GÛ‹ldØn9-ÐÃ+øáýÛ=«bÑ2§?Ê!¬'åâE2Å,Û‰1vîþÊLrbSêˆöõØ\¾ ìä̈Õ")Büã%º“5°뢈&G` Â>¢è0—ë:Æ4†÷ÍÍy],OÜi ΨH å1Ë–·¹¶ñÝ×>q¡­pñqIÆ"¡¨z\d°å¿RãmjS¦‡XFî”äë#X‘î$zFþÑ'”Š2~ž#=èëÅ8b¬liìP•z§ ZsÀmGKøã<ôêÓd&þ|þ‚/¾ñk¯ù+ßõ¯äÿÕãó[Eæ•–iŒ‚$J@Í"ŠGŒ5v´Ó.Y¯:GÜÏôeÛ`ãÒ0£yÊÜãeePZdåsiú(.:VPÿü¨™pE;½#J©‡¨Ñ0öþ럷¦¥+ÂÞÑþ‰¥bW´PmG í¿Ác-ÜïÈÿ¢Üh o©nà\àVYßнQ?E6°*íW@XÿW€%ÓŽ¾ÁrÏÈÉSZŠ4#w²íD…–Ûf| %üÁìÂ3g»@«Ãæú·w¦e×®O¬µ5>¹Öc߇ ûŒ™z o‘½yGŽ‹J9 çºìY˜Q´DGŽ¿ÝW—{ú¶‡M ¯¡-»’ÃæNTPrnˆË“´…UhŽ*æ™Í’ÍNÌ({ L+5 ÇK,ÆfÉ.K=‚K£ùPIˆ¢ K°º‡Ï%.Á2ï “Ö£i1&±[ôTzIF³!Àˆ!kÔð^«e'fÞ R>ròJÂCHª¼M|ì´1,’*)Èáz—ð²Ã…ªJˆýýýÂü¸ãÇôoÇ<¶fE×L9Gd 3-®TÖQŽ¿æ‡àeØKl¶¢9Ô‰Õ&C? ¶;£GÔ¬oà’Aë[@@“]Ús Ûœx®Ùºñùºp@Ö»¾}äžc‡…^ßaO,Olu B}âÓ¸þž¶p½póq¬ö–O•‡ÿŽ-l¬7¶è¢\o±Gì«Û»Wgã3r?CÀ\q–š²\ )ûV£RÒ\°d@R?µD$Þ‰GèÉúH4ši£4ÌEVRZÀý‡c}:ó‹¶a#BH^¡5¦h ½²Q–øÕ¼-ÈÑí{3òtZ_8Ë.Ôê­9[öÍÑ8þ?uߎŸ}|õù tajãá†ú ÄÕBäpdxå¿’ -ÚßÑ 6l£¶j–Ô*Qô¤ÑBÀÃ6W|Eoðn°c{´ 2ûéFŒ”aÖ®„î¸Êç¶ ©/âB#Nv*Wš¡ÔfØ]±·èfØß+~K{d:·.èàáÛ{´¢O´Ny ðÑ”‡÷g Ü-¥>^î:çûŽNŸh@š3Mi–“¸‘£Â;ãÎð´Û©‹Ï»ÏbÃ.[Ø;Ÿ6a5¢¼Ù‡ï_áTˆrÏN”Dö:Ô–…t#,WŒJK€Žô8å9kIá? AÌæ›_?å.Ä9Ë‚jWd„Kœá ÷Óùá¤ÑÌ)¸ÕØA\E¼S¦€X{m°:èF” á'ÙÉûÕ+lõqèi¸BFrOFÍÁ,~í{:× ,°·ì)3þE%Ëìå Za-á6˜ ]õ` „_qí©áá›T~ŒuZ~çt}'×ApÏèdn«b àÛñO;Ütúú(ŒJi,ÑBd\hvôåfô’=Æ3MJ†ƒ; ¦ÄÞèǤ-Wu‰DvÊìÇöÒbAOsx|¸Ë9F/LP"^ò™¬¿‚Î÷u¾]«Ô ݨÛY·J…maýÄÞwßó´"‡Î‡ÿÅw+Û•ãé‘b¬7Zc«ÑÞ°4¶ú ­<ï<*OÖ5baù,ìò`9æ7ùÖj QÖ¼Ã6q|kÌk sï]ß T£×D¢-L§:ØöðÇýJ0Ê1±ë¸oŽÉøì#/¼ K‹owÃ]%êÌ›œâ3ׯŽÕPrT²Þ›×›q5ö5üY”É%åàeØùq§¼îÈׄ €GÖ>äUø;ª&ÆTØK”I¼¯³ÆÀéÀýÇFUZ öó”?1XŒ^2ßUÈoØÄ0e<Ãöû¥[ˆ9ã¨[cnàl@„fgÌCõÓÖÚØ*½Q•»R³°4k>ÕC½ü;o”²+k °Úi‚È\é®°óðy,uÚnߎ«c–…û@@]i+2(ïYÞ#;ØÒs‚ØQ‰™CšHí°7tK¸†lEº¤Õ3ØÐ†]ÐGú•$`t¬ä,Y¨XSß-kwcä^`–1^-Y(ŽŠhÔ9c0KÅ*} +íu¡tÚ3«ÑÞ1þ >P?`ù?à·…n¼ýÞ³4öÊ›·<ÿºB¡¿¥>ÐÞq}ƒ)zö}>¢à¹&àávMû5Bæz&4““Gîù‰iÞÿ^Pr!A¶@ZR,Öy·xz: O<÷—†m°CËØ9½B3سØ@®¥y¡!_¨¬–iG9ª—ÀHñ+1èl®ÕâZœ™=$°‘HìZÜï«ð¼Ó@h•¢ˆ2zth¦‘1”âƒü@¡Ujv¡p‡[¢žÑj*-ºª¡iÚ3‹²\`:SXeRbc z µWL1}Vç+²e„(ÞŒL)æ#ðm‰I¦js˜;Â9GÄŸ»Ž¸9^B;µW úé/\ÿ–üÛžÅ<à€cW®¾ VBþÁ×’ô ð}'Ìœp!c¸„ï=b-§ÊLp–[Œ@q©çfÈ (­F‹²ÓBŒØâ¦JM@ý¬Ðê‡s™l§Àh”Â&Œ·\¬ÛN1ve-ÜX7¬ñ鉺`P.´XEî¿­Ü.ŒËî\•?nüæÊû×GFçýƃÓ4—¸Ã/¿?9ë•90ržve·qâ–¸v Õ‹ÛBYÀMp°i{t¹:ü¥³ÖB(`Žø¤Ÿ§oÃY!&]ÛÆªì•+ì•eªCh9­ÏïI:ê9ºÊwÍxeÜ¿˜7íø»ˆÁ};~Y‡€Æ^Å+TŽ#Ó JÎÆJ“9ˆ1£Ñ©‰Rj¦w=~/…V(¨¡¥è‰Êª4b¢Ô¶Ú“‚\$¿Èov9²+M˜Î,JAæ^GaDP2‘¥ˆa%9 Kç\EN–+V*ÁLÛa-)„Þxæ4¸bCˆšæž£Ñ@{z?OvÁŒÎ©Æ2ð¨NŽIˆÇñ#1oàßðˆÙrÉÞó²¬'©¸‘ú?š2Ýdæ±C½Ñ‰>%ïݨö©ü®Ê¾Ä׆í¹â=)ñ}’K4 VÑ2] ?5^ã?¾1ì)¦Ø¢ucÜy^YÒ|ü™wžà· ø vg[i õ{Ï[ãyã |‚r…·47Ž7ÿ“~eüÜ6Œ¡ô/uÏKÆ}nCÝŽ¿àçiÐ4‡2FH‚o>EÊbÊ žü¨#>ûÁÅ'H!>6g´°ÑMX»O…ÉáÑh3òr<ø1‚Ô­sétÉÐܸ(OÆjXau#¥Ô޵äžTÍCÐIiF±8=ÀË:Óƒa5Æ8fX2 ™Â×yGÓAÆᔽš˜¡Î:_4j§¯Q'¯ÐFœxK°ƒìž³BvÒVzE2·hÛ±@‹±yàOà9c ¸)£–t&¿yž"xöä("³r˜i' ÇHTªñÂŽ{Í¿}D”6Œªìú:ý Ç·À¿Ûa€ÂŠÔÜܧpÆ9dÎì´õ‡ÆŒ_çb›i-^¢;*\à*ºb¿…ßaWÄGNg=ylpÃê F‰y¿~&Ã3…d¶´oé/®JÊ¥0Þ†fTmØàÚ¸­ô·\„Ý٨߳ *è‚Ý©.èB»Òož¹ýÞÝùsG)o¹ÿŠ+ܟЬïéêïè¿f‘`gø½„wÁ;tf”œpjK¼x>¯×Y&ØÙÔ$ ‹ˆ‡!6EÁR›/áõ «2JÀJëÆ ÁJªzôˆ7rKžÏ1ŽŠ$Òi^©¨$ 3ËËñ^‹׉nm'õ@;…‚ –N+ÐY¬ Ð-ðÀˆK¼ÃK¢4ꆾMí÷´æ¤^¬ϲ¼:ŸÙÙòŽEyKO£ M†ƒÚB'˜™+X¤¶6‰p[Є†²­QeÑœ[¦EyX´ªi?ºÉ\öJ²ââÌ1'•Eì凜d…wÕ]WÃ:ÍP¡ ¬%úŸy|sÿž‡“¦ÉvötÁ¢qè_’æÉì8y ½€ã[…AiȆ ,ØÆxFº²=Â]ƒÍæä¿‘Ô—q£Ý;Òèu  RévÁnô'§åŒ9’Ûn)÷Û‚''Î;ÜÐ{çò„ú†þ̶²(Ö¨wPÚÂZÑ…{瞌‡+Ÿ®\ØËúÄÞ@Ñ+÷ÿâbX£ÿžúžÿÌ›·l^}up<‡–ÀQ7l§Æºö]Ó"ZUGA!´öBÈed+†Fß¹‹ÐÁªl×è;­8Ö?„eâd@¶z9SÅj'f~ £æXÚ wY<#™® Ï·Œâ ²¯q‹/Zf [\ÄÇZHÚ}+èzETé •&Ô†õ¤?J܇ªèV[’ëÉ<©HŒñÑÌBƒ²éῤ$QI&4.—Û0(¡¡fïut«QŒQ³O~÷UBó(g ƒ6(ÁÓLvmNfMÏ­Ú2ý?ÝâÖiÇ:µEÂrèi-–ùÐu™Îyò‹ó·ß  ¯åvþRý¦e*팔Jìí1CýKºWÈ­Šp›CÎ}6¸žaÔ¸;|{â]“T†Q’ìÈPMœ§wxÔàÒ85V%:-fmÆìS¡)«¡•±"F3ªä#àx™•S—€n-Y“7P¶Á›Æ¶ÆÝv£lFŸTà¨WÑè¸öå[7Xá®T¯+LC_ãK-ɬaÄK¶æHÐpW;êd¾–\hÝË[ÍöÀŸwüR-Ù/áЗÎÇOpµÿ„cƃUöÔ-ðÙ{&É6+ÉNÚÀ NW:91+ƒè:0÷Q‘JKµg®ôBYƒ~ŽFa£¸§1”Úh qNÕ3\´N9E|@§‰qSâæŒÎÌ>þ¹aÏÁC—+ö–ò@ëÜvÞ½çéÆã#m¡ý'o+·jì—NHÁ>q¹Óî¬Æý è…7ïùt§Ž¬Š¿*NH`M³ÓövôèŒéž8ÍS(¥»*Y46²c6-£8n0§5øçg2ÞXÍ{r,¨kp;© ø×*5ê³y{3-kŠIê\ú;jü஢K¹‚BœIe¡!1zƼ¾‚,êLV3þ5ääÒ4wMb©ÔÙ22+Øý·CÏ»(|€së‡må+›Zª§µ7Dñoy¦y£¯ßØGÔ¢ç³. ˆ ®´¼æpì ¥z3ÜaHöŒP•h=OuäŒØšlýÙ‰:JFàrþ”úejµä#d~ü“oào>þŠ?ø îäë W=g(»‡cp5f' I“do5¡ ìð ·ƒ"+ã‚ Ø#«ÏhKkâ_|A•êSw¬£'ŠaH‰²àÏ Ë’Qži´ÞØ–=´÷úZ o” ÛC…TjÜÿÄå÷Üî¼<}GûŽ‹Ò…‡<û‡÷Üߢß3î#X.…§•T6xx¦ E)J8†rÌ# ÚvRzpÎ_êùŒ,.þÔ¦c4IkB¸IËŠkŒñ.ˆS>}UtMjvNÙ`¶±p¨¤%žî)Š4ƒ&HOUÇ@J”¬]ñFÁVl¥Vš†ˆiµÄš@K€¥E·­ËKȼ9ô{›g†ŸpE wëU“ÑÃκüQ„Ì äPµâ[Jx;ÉæÕäÈͶ,Ïš ÙîôdýëŽî´;6%Ê3tÆÔ#*!z:‰¶(ZìkbH‘ÿÜ›>‹ÿ–>ØÏ\‰Æ{÷Í£‡F…4L“üJg·õ'™¥_ž%ûvüøÃ8´À|ý»U—øý4(žA×Nq:ÐÈE–\I¡AK?çÖd< Wì;lGïðO(èŠTôí;˜,Gw:æ±ÞH‹VtÎÐ2ì—ˆ/²?“ý¦ &Ô…¶€`•n©[ùÞ`oX wáºóôÌúÈö=í{¾Ãžy¸óñÏ\ž°È#öß±'Ïý=W¸=°×÷wÔw”·Ü”ËŽýß,ðü–˯BY¬Þ°á²\o¸*ýû€ÝÛ=à‹W‡fŽ2o£Íç¼ò¢5=ù½´”p@ IDATÝár®V0èG(ÑY'Ó+ÚÁàb¾†tÄ9°¦Iwq»¬ù ¦ƒ}zŠ;‰Ç¶>¬Í›òª2xMdÃ0ñÕÀ.ù–NË¥¥iH2pÔT¢ükP"yŠ8wó‹¢Ð2„t£)%o¾/ŒXí^^Ê w*kZmtrj¡æ(ì )®ç Ì-Ý¡²Ì”®ÂÊBHaÔ~¸4—buò_²'"#3ªv‰5 s„çÀ4JÙÞ a=º¼bòGmв~£?Á꟎oEàíÜççß=G =8þãüR"Íœ«Ð=„ÿ:1è#B¤‡ÊcØ£„kÕWÂÖt=lWHF™ºZY)Ghß-Âó©­6,ø3cþUQWV0€êMÝó„Úaz<'ˆ{:@ÑTŠÇçH»amŠúÃ-Ášy¡÷Xòš<žðÙÚ]eœo’‘ð¯m yŠJ´³ÍD³, ° ëÿ™’gsa Ô‚¹¡tNöc/B.1Š Üì_ä<'›:ó­†·Á ¶°fzêNΛØ}IÛšêF.jÔJ®},™ÛfX|ž¡1ÿ§À*l>’O(ÉYªÂæì[g[Ô˜[à;±[Ä/ÒSØô úÿÝáìl·V{ìcéÛ§¤ÚQý›i£ó‚j„ça,Sιý4²Ô©£^鵈¶&’32<Ñqú À#j¡yB¹£à劆„°Ì‰¬5*iUÐÂîÙt‡;‹ÛýNo˜±v­ôGžWÞÚ)äyg´+µÒ?aÃ:ëšœŸy$£|FÜ–»×±`ߺÑiáfwfWd¾•)D!QSÀÀ­[C&€fq÷jG R³mù4-yAˆßXE½ØPg^x’è0 ~¤qÌF/率 ˆ1'ÉhöxêÓF Hd]7î™Õ‘cÖJË|Â?ÐhYŸ[d!%pø¼ÑT˜ª>áìòÓ«‚öìx(2—B/hÁJø hÐ7ð¯ztKÐÓb¢É¾º£Àëø@?ô¦:Qp„u® ,«mi¸O@$.™!§¬Õ`Ýù_ã(”œƒj¹7âë¿úÇ&ÑÁ³pqÑJÒd¬hG¯È[Æ®”wôBUtÅÞ †ëɱú—·´_q/\?ò¼ñvÐvdþr€DJ‰”“|F¦í€8âÚRÒ9(ÿ§ÈzšÑ‘b3ºš4’©Òja•Xûcå°§%ÇM)˜#YYFŒôу2uŸ l‰Nð=}‚S²bäiÇÓIé´¡tCö éªC#›ÏÒs–zbbn¦)TÁzÀ;³8ä·´eñ@öKvçi6dÛ¹›ïk&ötÄûdÿ„¾©x1ËøÆVc~§ËUYÖ„Û¶pIn®XÅZ–ú=%I.ð:áÂ<ý²”còüÉr‚‚i„ôËÒgÿäã[ à—wœíË×^’›Ð÷’÷ÅŒÔÙÿÜ­;ðêa iªxÍJ‰/¤Î#J€8©-h§»§Ÿé6ž¸ÅJ}| JÅFÌ?ÒI™˜ðêg !8Z•ûÊe£U˜+u †mˆ’Û eÁv´A¥ß)…í ÅA ýÆR¨›±>rD*õŽUìClÚ²ÑWteÔ÷W"[iиÞNWúòqM,ÛYžÎ}9ÙGžidyŸSqìô™âÊhƒ2=­vÆ.YˆÎ!­c¡øí§±äh4%‰’¡ïHôÜôŽx¸¨…ûýžêèí¥s{æjôJ«Ô7Üug{Ï»÷´oàÊö†U1Xÿ@¿££^Yûì”9ÊBÈÓÙôƒ fy,½}#» ÁÔŒ1“5ÏÃOŒ¸WŽ_IOåTWJÎZ±;˜#É(ÚK<Ÿc5X8ôì»5 Y T5מë1Ì\N§žk†#Zc†pÜ¢Nw¸Ü—îšJý©V“U÷44”Ѳ45„ÒâÄ ïÇ —<-Âɬ÷žG«Ô¸cE7†Òp3–JAÞ`ÇŒe`;ï ÛÂáÓKÅ6ê†=}tö•ò–½"X7žŒÇÆÖXÍMѽQÙ; ÞVž*kªüÂaqÉžYÞ(&ÅØðA œ¡Û×ÁÙ=HC Æ‹“yWÃâ×äFNÒ¡$È–Öæ¤O ¸¯&ݾ'-n 3x'aа„†µÆY©:¥Ófw•¾./Ïúö9i(-c¢‰LÉféyšD ºÂVXû¡'á×U·B!d÷E1¡ºô²æ}ÆN4!C+]©¦_r<² RR´´#½fø˜F Ò”Gc÷<†¨ÏÇÔ<‰†»ùè'Q…šýäÙgÐF4âyIÏSoÖóOöε‘Ù@OºI|ú9Ç7ð‹<¾nþ89ø@)±òºþHqP[  C¨ƒ&©'U(ãPEË".æåpvì“™ydS¿ŒDT}Qfdj ,Ÿ/×d1î¡ àp?ÞÞÊ–t4jaKf^T#œÅïîF‰q¯ã ÆÊµp7*È•Öx·ñç°l ÿT¢yxö*W·kBì’jšî&3ppá ï,ñó´™É1ì×}ZS®%§Á(eä "FËÄHGŒ0óJƒÐ…v)P¡²2ÉòpÜ'dà8L‹ÇøXÏ ‘ÙA= XÌÍ9ØyÛÑÐR„(ùÖÕ f\&âŸÀ—]û|)þØãô‹;Îò‡¯ÿ)-¾’˜C¡ÔØÞÝ`;mÑÙ&îºÿþ£Æu'0*ݵ±:"ŒŠÓì VS¥Ç2 ÍÑ’¡« £`„° %fÈ ‹øâÕŽH™»Å,F²ÉR„®¤àbĉ• ä¤CW÷ Ü Æ v¤³n<}âêPIG•ÍEîÜþÄ»Üw.+í7ȯ°+õÏ´'xv´`»`‡÷´÷,[XíWç?E–Ü}’ñû̱,ºãêÎò€³^´Ÿe”s˜Ù9=„/9¹°EàXC÷M³ÐêwšFuÿZ’)à6; ß#G6˜Íɹ œ9GŸC#ÈP@fÞcÁš^l=Ä |u)Ø’i㦊I~d’eRo¼"Û5ש T“­àõ‘TM@«pP+éjäeÈ3bûxFbŠj‰2¸ŒPq©ô—w¬Ñ<˱ˆ~Ðp$md7@Ff-_gÑ‚S  Qß&£3ÆQ7v„ðgßÀ/ëøëT&;£Ê¶µ7ö;ÚY;Z¥ž6¿XHAìpËN} ¡×Ü[$Å^Ãô.³¹ˆ}‹a’’†­€ÄÄ+ÚøWYò”GÚÊÓ@VjG[C÷,`Ìm xà è2,Ô„ƒ3ðíFð×Ô7<-Tåò ü†\¨ÿÉöŸ´+ë@þŒý‘ëö‰råþ+–ÿÄ~C«ÔÆhhç.”ó¾pøNŠŽÇø1ÕR¯b¥±iGúx‹»¤•ï™ú ÷Vj7ñ«×'‰&²gXwİT¬$ˆå#»®ü½ “fè)T¦/ñÈ&,c¡Tí°G  C’ìVÇtD–é®qŒ@Ø=€P£ç t‰ü˜17‚ïäõä‘yÇø:^ßš}j½]=íÎÿ¹“£²,sSoÓÇúNsæ>B÷n[ Gâw,ìû¤ÏÍ zó–jÐCýn»ÏŽ"¿u‘Aj4ÖÍQ®®ª3ðU¡YU’È“ÂáI0¼C’(ËŸs|ƒ€~‰Ç×j.?Ê’úð‚õÂÆÆòL{ ]Ñ-'{pÐ!žÖ01q÷+{,ÁˆCO˜oí01Fð5Ùã¬ær×y ‰VŸ©ŸçÃ-Z¾'¬Òĸ8}Æ8?Ü;PýêÅÇÇê{¬QÆ~IÞEGß³OeÝ‚½a“˜ÈªQØ«FwnWXâ¾Ù=[žŸëô¥¼hj…Ú©;ÛDÆ4Þ§IQwƒë’ŒÞ ^kâZi 3Š¡V‚‡:It §Œ„?#U×¼YÞtj9šÜ1C-ñkí+è`' PÍêdOiÖ_Õ=§•9Jf+L*s£´Ì·üõY´¯@P)YÇV,Ç—ŽqªœM®!Âϳå¥Få3D ÄD3ñ|Ív¼SП¬9xêrÏ¥_¨šTÝüaL8hú³Ÿz|Ë~qÇ× ‘øó%¼°Ô:ûÎz§TXè°/ØÂrc¹ÑÖÇ"u0´M%ðb‹o,F5ö c9õx+5„#€Õ¨ÍzµÖ’ï„ÅP3öoœì”í5!r^ÒÄ»\ÐÑÚ/ZI½£dÁÊ×±²ØZWøŽµpûVt3éBy„+|G+¬ÏlOèF¿S…&ÔÚ%ì¾£®SèíËOkÄÍ ó:è9¹0À9- &^dÉo šwϘ}ÌÝšÕÝf¹I‹bÐäôQÚÉ­Î?ƒhóñÓ‡ ÒšMUÚèä¬`Éb¾£)ïŒ9>L“5àú<ÙÞ5ǘ¨·³Ì'wŠ=uâβK=î¤ÇþÜjJƒ ƒJôoãvýdÄg̲óŒ72¸‰¥å²ES )ûo!n‹ï#‡}¹j"o®þ=1R2Ur‚¬+mPc |Õ¸Èw5Ûƒ”^¢Ra4¬E¤ÅìÃP¬dïÛÏ8¾9€™ÃòGi×1ÁŠU.ÏH£•€#ö1Þ§¹ïG6â = ÈÄöÝê.þe’!öÈšAÆõ&˜sÑäÀŽÝrI ¢EœôD?3ÖÊÄsÓT½X‘0ÓÀýÛ‘0O¹}?»YŠ [§ïÔ?RŸCƎʸ„M×'0vá*tMU‘…1BÅþÜQ5µ ^]ƒMÅÍô…6¢$8ßá<â”}§rß4I¨ÁçtešÌ¢±¦Õv" ¿WBó5î^ös·$Ñv8ªÊ¶æs!(íuŽ‹Ésîé8æó…x%Ié97G7øÀ\Ì`°jp„>÷g’_KŠ&â![Ž!ïá,“#ïmCÌl¯<ÙŠ=)˜–·NªÑ—2ñ“ÉŒò6Æ_—ÁûÜqºgrSÉ»*OÄ£S,µs+gYŽlÐó.¹¦”oš¾Á2åš‹ß}d€BgAªÏ–çßÀ¿ØýÐ{ § M±…²±lPèÂ(ì måúöGLY¨vìÿA´é«`®aâu³ðî,0j aw=Åq‡q/AÆÐAëÙ¿“fý‹ÃK=–|Ñ+{>¦ ´/ý~þã—ð2µº?ñø„UêohWÆ• ›¡O˜†ð½.Ž™9·À«#Ó#¾v†d¬—|¯FãFÄд Ì8Œ[¨È-²Ãàöbàí¾>9+cÉã-$š¡¡J€5™¥eºà6bLömÃòd¸Hp ÿßöÞuI²ÛÈÖüà@DV‘ºœË˜÷º1›±ž>R“beà8?Ü€,’«’ÝCJF•2##vì«_–/_ž.f‡eCÏK ñê=ŽæÈ"¿)rq ‰Z¬Ð[[‹H6H÷]¿&ñæiŸ$Ö–TI„ÃÚÈP.[;}™KÏd7±J×TÅ !æÀ”\‘‘ [àB¡¯Wt9Þh:ÕM¼ ³Â2ïG¢¬s–FÞ÷Û2¨þ﹡Pl‰•ÆùötcY6€'L¸kßö?s“þu9€ßÏ’-ø@’9øð³â7&ŒÆøÀË÷¼ü-á ¢’æžðz|ö–X¤Û®¢Ó ÜÞD|š©=gΙý¸±¼ÿD®*ùg÷§^:¼BF½?eråOŒÿÆ(Ø_x~ÇË_àã‹1ú:áI™çÔªã—å×6Þ$".í`j­RáκŽCÈ|%¬mgެ@ºôà¦1'U‘ã)¡š<–Ðg^àÇ7 Gíº¤¼6øô •#Þ/ úM¦çµˆÎ»8ón̪¬ÅÀRÄ´ÈúG3sNA(él†cJ‡˜ÇnD.W!äÒ’¨Œûðy·ä1°‘ÇëˆÄ›‰“m!zÎ&J#>3Æ¥ë æ‡ðÂÅ9Ù8š—™Eã’ˆüc¨rª÷ÌÜ¥2sC*r¾‡Ìô’‚]!­ÈݸýC¤S±y#•=Ùø=(Ðå~+@€¸MÍ;¶3²wÔ¿ãoþJíxÔ„×ðäÛgTz£Î BÓÍÄ "JéØ3ƒJ§âäPr»¥Ød´kÆ §xð,&šS£«YáùÏ!õ?¿V³ÌçÿËV†¡S´CÑ Úw|úޝüÐh ¤Ý™Fz¯D“Ã|ÿÔýƒl×…®Lu…`gŧ,]ø×¤vSb)3]C_‘£ ¥¯ºqKˆ?}M,``ÌÆ“#éî8uDEŒšÌ3È´ ¦‡ut§gš%Ä­:{¸ºf9$ Gµ=ß$1­í äɘ\LÍ(5Ù’Ù™Ù4PV!D=k‰§“ ±ÉN‰<ˆî9•Ú#wÝíÍ”)ßf`4ðÁý‘àçÞíxC=H e ´…G™êžÁ-wÞ*±‰Ÿ•¢™EÉM&.=‘USu‡ßgœÅ#_¡Ëëùžw¬Ëün–éa› ÄTˆ”V@tŽ×¼ü•Û_™7FaxãÿŽ™•Ѱ²»½L²ey³¾b¯2Ppg>x¸'1yêíxBtS¾øõ¥÷“÷æÏûƒý‰™Ô¼a°Vñ'¼âƒ"»³ð~…Ýÿ©¯Ž®4Šø‚)®Í¢¸´ó¶9·í„ ¬ê²®Ã™Â=H.Ú$>s/£EZ2Ä(š( ÃÒv]Q ¹,Ú¢kª°vØP1)¾%ìàg¶dõ j@0â.-•nÇ4ˆþÆ)šeÐ0[ž›äà‡žb Œ£9N`Q| R¥²² `¦tsp;žU”r#‰¡ë\u£UfËÙsYårI_L†«¥%²á~ú›agÞ±‡˜Ðz:†å(±\okÚ‘´7ìN»3$y—lÆ\ÌûîÛkýÖ×O_c¡ ¶Úz5…ñõ[êàãwŒ;³2¯/Œ;üÿhþ2¹¯˜§HVà?^™PšJi"n‡9؉›SŒÚ°*In|)$éù¼ßê—n@?èl”W¼cï½þgø¹ºî;Ö6IÇåñe‹&(Ì„ï"Ê‹£™Š¤”HwsÙ—tú*ü&O×3{À²e’u‚N—áάÁ¼Ò¦6ëy®6B¨EˆçHy-ö`]¹;™ãÌWȳšâx· ûE3,ÑÉ¢øŒòW]™'ËL¢bÛi5ÏøÞ°õE1ÐÒ=õ¥*Òsø•Zñš"wN•ÅðÉ «R¥Î$7—bZ‚ôÈú- Óìú€žÖ¤³ã0gZ|_„ÔÐùhyeSX´ ‹™Àž ±¼=$2úÎû÷r¿›•éù‚¤!µÿl)6†àõÏLçÿ–õ®Ùxý#ßÿoÿþðoŒþÂø‘nTMŒ¯ŠÖH™mϧ”lz§Ý39ˆ7…ÍJ‹ó íüØùå«ÿÅÖÜRÆ+‡Súç§ë×Z9 fYÃy\)¸õäqžõêMÉ?¬äD½Áv§ÄãÐÜðû>ìpi#曫•ÌÔwZEMdP;³Ó-Y¤KZÉ®‹Žç°*²–eYv@?əŽ‚Jx•„:º€þƒýÒgÊÍ£<’Y—ÖMÑp! ]ä’MŽN´‚CScÚ.OÍÎ\ñþÐdßa#õ1$¹õô19õ™-oæšÈ¸ê ¾iÌÃPE¡µL)J°­¾Åb&öS• ҾõmÀL‰ïå„î®ýo¸ÑTƈ’À9 à«×å~?Ër~)#=Å3½ÛµìØ+¯éøÓÿ‹}¢LÊàñ-ßý/ ¾ý¿©ß1¡‡Hç'èx£LÍ©x TˆÂtªQ_¨1qO€¸(ÿ üÿÑ|™þ÷ß’…(êÏ]Uè_;Þ_+žüVëA-ðlù´I‡Xæ’YÎ8®eíc˜ l¿¸Hý1a¼ˆ¶[pëþ ­¾.ËLùPƒèTOEØ(¼æÀzrÿíð—¥ ›BæoA/eÿêb%Å>ļICÕìÅC©C æLG7ï[Ѩ«2lJ†²EeS¹8(›ž?ñ±Gûšp[ósÆŠ3ìPLqc¾@€õÒæ »ßÖyÖé âP\ÁÖ¥ŸXÀéNslÐ:½3?åiLOotÇ-õ3ft@/Yïí‘"4ªpþuìL%÷¼¾× \À¿›”»¼b¡¸ÒòèF{ž–#“ÙÚy¾0·¿ðñÆw¦=•ïÿLé|ønŸèßò|Áö |J‚Ú¢ú ~Y*sRúPK¡þªua ?so¦ °=Ö¯sŠÖ——ó—ÿôˆMô(LèÊ9ŽBKæAˆ ›Ð‹ɰOyÌ/ p5î…ÚsÛ,PKsü&áI_œ®–d»óÂC‚™Ó¤Da1È⹊1’Z -³p ÕÀKŒ>ŽD6t»ß?›$ÇC‹)± K|f.ÞºFG„5´åò•* Ù&þ {fÿZ²Š]ÅQ×ä²qÔ‹„ŸŒ" ^¹Mбx¹¦S)¹ÓgþmpP*-brQ¤³E3†Ï$çµ­Aô”83*zŽ®œd¢ܸè9Tc‹V.¥v =Å}RغI8}¦^Å\^í‘R‰ÿ Ïþër¿«u`²¥a/ÇÌÒ‘–Wñ2{fÇ͹⇯ßòÍÿæþ)gõnðü†ç·Ü¾çå?°?óü¼ˆ|41up>Üùø‘×ÏOð wÊr£Ô¿ËöYáSŒ­oB´ÿî¾w?_µé§ñ% IDATЏ%31‡%ƒ1—²4öË)L)ÌÀ†z"Š®e[Õ®ø·/aYE\V»­“ïúwM“×Wä4›"ĺ ÇÙñvŒ y¢ô=vTeLÀ0¾ú¿¢(˜Ø4°L-mšÊp H¸&s°¿hà”Á²Ñ…[Ùn†óÍšÌüo¿濱ókP‰ bÚðº&ÇE³«i²aÇùŸæÒ/*9˜Tµ"ꇼq|« Fú-—ÙµÆãs4[6“ŠˆFNÖT†ÚLé5ÛÙº¥ÅÏDç–îF‘¶%ëwR½a=u Rp©3ÔNŸÙE˜Zß–÷Iü,.ž"¹ˆ'"Â}—¯^—ø=­Œ=|&)Øjb‹£Á“Å:þ!CªyãÞÁè/´'6øá[æä㿧؃= 1?òüÈ런F{äð{Â+ó•âÜ >}‡;!ÿ­©ýÍ®%rx5£l#ãÙBj å;[: Zc”` Åˆ×Ö1.øø|X¸ÐHË•%‡*•!Ël£õ„Cì°‚Í5 °Cmb]h8ží~ÈZáéá“=öÈ7Jâ)$ž@¼Á³¥ÝÃQ?@•§¡Ù–.ü…b±„05g8èøÅ˜¦T&vò­§‡ÐÔ»g,uX=Eè¢ z(sò=èLr¤éZÂ\Y¸p›hÓs«£Å·Kѯ‡×iycT2 q©YغλBø«Û<:'Þ—ó^EàßÕŠ¾M%,IÔ² ¯7îÆí•Û+?ü›ð)‡T¸å¯i¨£LüžCw½1ïô—4^ƒlG¬ÆíFï<;eþâ¨ÿ_f%4oÛj‡?žëtK|&KvóÈúI%ÄÚæÜ.·$ÊGßvøš£àñg†Þ³cÂ=àM.²[¬='v’ýP1{Œ£1vêÀLê_r³cïŠr‘Å£7ô=BØ×žxnÍB+Û·—Ê ñ.ϲ*ËwÊîǸ…Hˆã4&›¶ãps^£¬ªöÆaÜHòh´IÛBäª[}•d8³c£¤ð\¤2Yˆv9$0¨–RtÏ’{Ñb ¦6þ\\£Ž5¬¤‚l0¹]‰Ž-÷Ü·ÀF”©ƒG”^ókוüžÖ4˜z¸,y.å²Òyx$ù›¿bƒþGÆ óFuZgT¦qÿ ú·Œo(Ý)•úPõIxq½QnŒ…Ëú¾¬qŠ#ÏÎ,ZžLž’ œå0¦z¯ EßY²b2šœB½!p„ç5Á¯2ÓæŽMÉ;Kd&ìEÊüYîŒ)t§uA7®I;±ûÅt""_¡ðèÃi•eþ<û×Â/zÁk¦Uî®ÙviødLyj—<}OÓû;ûOq—Æà˜å'Ïîw"ï$)+ ìe•»¼¬³í#õ«ƒô‰ÄX•dÀ“*¿MSK—R¨em]¡÷Œ4½ÍÃ(8@'Ç2/É⊆ݛð·÷¬Ëü~ÖL$!8<‘q祑€àíFÿïð¯P¸ÿoþ¨<_èwfÍÇ{~Ä }bNÆ·p£ xaÖi‰£93J!ï~­Ÿ\E,û ´Ü™·ƒ¿x.§M'b=ÄÑ%iWqvŠ(¼‘L@îD_°æLÍQ䀀òo[" eX˜ÐVCífM.$k!«h$z`)a³:{¼hD»ktj@Àz¶qT)Áoz¯“³p¤¬£[B.NË}!ß)‘YNFË.\˜–HúrÀi^EÊÊU)´Ù©êîroÁ }¸šV.*0i7Ú ‡ôÛ)Ê–queU61g†xO°XWŽ˜ß"ÎØ\5yß7ÉW¯ËüN֢ዞñtþŸÍÛä%²Ë~gÜé7Šóí_¨ßá•þ¸ÀGbµÓxˆ:|‡}JÎÏR‹º)ß6þó®ÐºiÒ4wÜéS P‚‰Â€®©°iȲV"„mH€,F%—tðFޱ‘‘ÁŒËÝP$›ÛYx½LØp¬d)2Œõ°–ÚeêÙuDÝÜ$¶q_á¼/YP×_ue)bYp;þèé~šÞAÏ–å9—21ÍQųHàžÛ)§ñUª‘¿jpŸß87é.#qã­oOzU\—šèýl‚ï>j×¹Euþ•K‘@ÿÔGÜŽR¿ÎØ;=Àå~?ËR±=B‰'ÔÀO§ îw¬s2:OòQï7Få>yù”2Ÿó¿g7Àl¸cŸhÃãÏø·Ø {áÞè*p‰^9Àç+‚GÅžñ3 9ÂO"pÖ¤ÙXÁ‡ù\óGæ#å ˆX†¯ø"t% —žD½Æ,:üÙiePêŽR#aXÑå®,Z¸_¶E›_˜Œ£i#YbÍÃ~32SHO¦8&Êwóm*`¾Ù±ž›ÔèÃLÆÍ$À§]2Ö)ué85%Ænƒs˜ÙƒÆc¬iñ¶¶OQÈXœö²,á&{s>‰ÀN ¥¹î+Á>Q¨¾ä«ÞÁår¿£5À&³3À—ÊãÎ4ú å…oÿ;ÜðÉíMž/ÌJ™xÅ¡T^þÄ£3Ã3KµA}â•qƒÉ,xÜúàöµã5›Ë“8¡ä¤@&>r„ÅEöü{kß0´ÇJËn&Rfx3ÎõÏ,¢CªÅSݰeu! á!dIv)»¬†¹® ‰wÏÏ„)2„D4y˜ŠÐ7 qÀŤòyIÇ=K¸z§ 2éûsøË’uWgr8Â,{„èE¥kÊnwiÐD»Š~9€ßÊZ`ãÏ.§7ja~äù ^xéØ õFÿ[ +ΙaûœÔ=qèwFc(.ƒúÊíèŒ¿Š¤И%']Æÿ'×¾X–Š:þ vOkžæOø²ÙfkC<­“¥Y_6·¬¾ª…Ñ,HZ†Ï[ö.e¡¸KÊîF„"Ëè"¡zQgŸŒIا˜ˆ++»s QW#&H@_pP´/¥ÁRÆà·ÙúqÆžóú¤KÖ1š?#nB«‹¨;›Y¾þñkW”]BV“²)X]Cɯ.u¶´}QÅ­›'oé›^v@øCpöÀÆë#pð*­:bLwÉY4dâ½Jæâ; ÌA,ø´†G“­ ç誋øÜ.p ­šgRâ9¤§“›ÝWL„1YTp˜ŒBu5a¬Š‚Ó$ „þ*H7¬gÃZ8­ þ»²%¤\”–Ýú-±!âo(ú±ˆ¹M]âGÍŸ‚£­±ÓÁ}‘+´};å+ë&¼úþ9ÖßwæÓ©¡%9¹?y¿ótÆ ã#ó#4ædbÈHøF6÷NÃ?2^˜ ÿnÜ&e€cg<Ëúÿãµ¼ˆ"‹fÌz>ðKû¥—uŠ Ë4º=b½U5DÈFT&×´[VD|Çä¹ÝsUreÝ6L\V¯²ªÁ^¤.Ú#†cn×ê³]8UqƱ"¢QQ !4œÍ’Æb[FEÚí0ÙFi”(G'e•¤Ç¹Pµô»r YÞÐHÈüè —[b/©ßP€ì>såac]”•«Ý8®ÇÎç gÖU²nLôµ­ö´£¨ãò"+!XðŽ‘í;Ѹ·êSÕ”ª=d¢WWÁ_’~e¿•µH?픣è4iƒQÁ©ßx£’\ܰ?ð„ñÊˤœõx¥t¦z…˜a Þ¸7žàÏ$“Dcç;§Œþ+¬rü´Ùƒnb+ZQ§k¼×IØ6×–ÏAá(:ܸyjÈ”®úzq—ei“Q˜·M!5N’LIj¦ÖeíÕºï6[¿§`YŒPÎĤù£ÔÕ¥6nnN7zã¦M™ù#ÄOÛ·N °êŒ»íØÜMͽËt eM7ô¯Í$£†¼·3›™x¡ÎÄvêáW"%š0;¥äìXí|4CÖ[ˆm॑[DàdA»ð,ÛįLÍRµ=“Òcp4g¥¥ÄÓXØ×þUNq½ë=ër¿±õwR2Uk«gQ·,¤2Ôü'õFaÜy½qû }`OÚ‹J^Ѧ$+oüð`°¦êË*çyË··Ø¤æDÓ™ôt“ñ C)¦Y¬IŠ]g v/XöÓr<Έ3¦©÷—©yú†zä qÁ9:¶Ší‹÷‡‡nãštF6 ÄÊ*mUïóvZ½Ó Q(íׂn.ð›\7ˆ[;˜1wfû¨µðüĘØ„>]Öÿ—¯]°)IðWˆ(²2âø›oåœ`+ËòTøéËR7<‚þH•ùDêÈ7àšÖ`I‰™0c(Ø‚SV°l˜3,{qŸž9G€^h/yD7x¬šç¿'¤Ósk!?Ma…$žÎ–õÞ!ñËðU¾pÙÕU'ˆ¬×´×2mg{p¼Á ‚%Ž¿Þ&Bò^¸kº€â½ÁTw0ºe\UÙ©ùŽÚ×;±uD»y‚Z°éC3,4Hvb&ª†ˆI‡Ž#¥;bÖKœõžÀå~“ëïcAä&&3Ç;6iFªßh¬«Ô»ÂgÄFŒŠêí—õÿ¢åÇ϶j›žö.x8‹Ò­açš´î‰ò—NI9CÖ$Âíg£)þ'ŸÅ—¤µs–Rù!YÃxÐuÇÓ‚H¨]@ób4E˜¼O(ÞÄmc’´,y Ù¿æ2µ¸ŠbgWcðÒw[æ5]Ý:d½i2‹CÎoAêeIÅ 4G1wÛ­^‰¯‚¿LUŠ1Ú`ÄI€nÜÝë¼ð¦ !ºQ¼=\¶”M »~¿C†œôBÕ™\áÂò‹9S>Æ{Xæ4ÕxX^n_ü¥¯}x/ð[]?ÇS*ðæÆj 5îò£`Ê"Jƒ-ØZLóÂEöÿ²õÙÙêM¶O"øaïPठ^Sϵ¡ªRªÔ4c„È M;>©‹&¤ Æ,¶´>KÖÍðÆì´žFSaC"< ©ˆŒ¡ÁŠA£Ø&R¤)u2©<4*²QúFƇg›z !ècT\ªË& &¶¾­W„;¥üLÞÿNÊßk–£^ œ]HPW‹ZÆ\õ–±IOÛS[Ð\`rBfjl9¨=¤’à´v˜Ãâ+Ár( ^Ì+ŽÚÀJÈ&ÉHÒ‘¼f^OÔ.¿ 2¦âWµ_ ÍW¯_ JºÖùZ-Z "jôyѼ­Ïz¸V–ªw{#—õÇŠgRX¿ÎL6FË“—µHŸ ›¬Zâ¡õ¿Œ`sµ•–m>â±Ï©¶7f\pÕK#¤Cṯ‚ž‰¶…·ô°Ãñ~ÜYKÍR}!ĕ֨‘ýœØW…[–1<’µñ&òìï>S%gªìû¹ç®˜X@«w!?ÛŒï ÝU4ž©Õ³ò°츪‰Z ÀC¦?UY¸h4HcÊ3È]–ýmG.cø™sOKõY·rdúžô$ÏžðŒL¾·Šþ+Ø8»ÚÜûðëÏå~÷«¼5âro:ÊÖÃy8‰%ïs­w®$Ñûñmˆcû ›d§R>°†©‰ì| W`äOt…… :Öx†¹éïYކR_ Ñ%;ÓS[7º]œÙðmæp麢Zå¡m@¡Œ­ŽioÁîBÂáð\¨ø ôœš²ª²ËS†í+GZ=V«i€£"‡þ0ïøíãCíx“RSg?ØyúæÝç³.D]Š„r¬±68yšÄaN5û0 ãƒ¶&¬#ªpž·’ËîÉIe% Fö”ÐÒÔ¨²Æ;Žǃ|9€¢U~äbù)\ñþ |6p6ú¼S®õ9öŒì†Ø°˜Ë4™úŒbÕL¬ÄºmŠŸ_—]ëêƒíû«cOÂ,¢I)@Ó.¹Ò ÓÝ’cXHòRàc”gaÙæ– Mp<ººDœÔ©EdŒ|e} žÐÆQ}EùÞ§ÒÃÐ%°ci"×Q{Ô3Ï ¨jSÛ[{vrÅ$g‹ìD¨ºMU›çþ®“ñ5¶•úopg6`{ñà,R„©ü#’ª¢¶>!º!#‘°ÏÁˆMùî_c]àŸ}ýœW¸Ö×®yü¿î©ÖÏêØ}¾Ñpãîô’‚ÌË…ÙŠWê‘ÝïŸÉø4€ìœÜ"gÓe ‘¿±à•[ Ä{ú‘™Ôœ<ìB᧦¾ÌŠz9„íd­‚©‰âÙØùRßà]åð¹Ž_£« šæ‚ÔOµ5m'Vø’áËÇþàÛ¹Nu$ìã à&æ-Ç$PrÐñ\WÊò+¢xµ™6Õe¶vß$ú?tL–ê¡ñ§ôrHët…¹OÕ¦™Òÿq}gIWyäÌ/Zõ‰¼äòÊ÷>àç8¨_i;׺ֿÐz Û`ž&Àa]ÏXoùÝŸ§1Œ6Ó°N=ã9­Âë™· “óSP±‰‚²&0u<—˘–žÿ-Ù¦ˆÒVŒ¹„ÒÈ섲MyD¾ÃËb µ`ô>7ÖÑ迨¬½ÐöåCÔaôäM²9wìÀIÂj¯DaÅþ[sB1û”a]ßCí­ódsÂÒr•F¹ˆ(…æ6 üYÂ3ËKš)“¹¤ôаÿ;o‘3dˆ3\A}ñv¯™8–•.÷Ë„LûUP |çºÀµ®õÅëǵ·Ê³SS/!á" Å­©'¼d¢,;’–cQ¼ÀPvÊ8.„zi´½ý"´ež³G4%Q‡QbxVII¨´´gF¯NNYÉÑ`“¨r›§ßšª¦YA\. Çü°4ÇÖ|À“Rðû’årN.›“Í·ÁÔ4èÒDÛ×;c90"לaûg2Cíè`(9]Õ:Ó§ÿ¤ 7_²CÛ"”Ÿ Ñ,ÿ·.ƤìÍŸ¶òÏÚ­¥|7UÎ)X¡”œ)7LM6 xg‚òuër׺֗­Ï5=Ÿi;,µéƒjB=2‘÷™4Oòß‚€à0Öñï8aß-fÑxU”+RÜ<ÄÅà\ÈþB™Îj°+Ì·GÇÚÕ€,ü8ÎÍÚtºïÚuRK} ÖY½$>ÕTu¶@®š§zR~õÙ쪯(+MQIÜ4p-¼Q$S©:TÑÉÖH˜}‡á¹i2ÑèÍÕÕlËø/¦ÁL£uõ-ûaßgþã2è¦zx1”S_]é]Q/ŽŸ®zõßÅR%c_k]àZ×ú²õY  €w¼'rìÌÙ3úÞÓ4ô# ?þ Me€"#rš)ÚaG¦j¡×eáþ&ÿªau8†ˆø£*PZövMä´HײTÃÐ'èaɘdAùqBa¿§ŽúlÂ5käaXN-øMòseS3·ÀÙv ‰2ðByê'µ1¿9ôŸ «ó(i˜¥®ª!· ÓÂèW†20OÈʾ"îôŠ úÊ펴¢èÍ^çÑw±(Eõ UÚÜļ5mŸ£ôÝ7c¯æ{½Áå®u­/^ŸÕ"²6¨%v8JyEv3H„ò8¶ÌNRBÃPæ++‚"ãûçûÿºsŸiß'iwÆêCæ-bu:¤@Ÿµ¡eø‰‰¢h‚&x:þÞSÉÒ”L„a-“ù y kƒ z ÖZ Hq²fÆàk…]N«:3šŽIg…LALc¶Ú“òý™>pO±k”–£OÃŽ¯]Ê~]½?ú«Oi?8¢ur”ê¼ +>ø¼:žê,Ëy öà}Û¬ƒSÖl”œIA:üT‰a¢–lQë0Õjþ>fÇå®u­/^ŸÕ¢…5Ù÷ÚAÕHdßصq€$ñÃ2ÁR1[åÐ[ ʼnñ¨—#îË+f+ùN'û­âsÙ_¥ã\²Ea~}×QÅ6t¾$}ÂìH×iA6›è´,bû¸è•fo fˆ2*]$ÓŽ”m¤2æäáØÌ±ŽË†šìònÀ}Ö{KžØ¢; à–=Yk¶ûy¥ÍSZn¹·±r2¡OQ°’üÑ0Ù벦ë]•ö™ b„Ä^ìürðáÔ£ü`*¼`–›w®K âZ×ú²õYÈåšÕ³ zñÛz·8ò3ª²3gºF_XèÈû¯Ùv9sÿã›ÂB…³å`̉ÃýɃ@^lŸiâPš” žFdóÏÌ\å­ÊæîäÒf˜¿J¿oK$ Yð7ÞË–sòßÉ_¾9ÝÏýsþEêù-â¯OU °í´îÅÛœJ?)¤[覸@·7:ûÇî­•Y½kô®Úhš¦fš|06yÆ4ˆ™ _Ö&¦NéÁJ MÓÜô*üÑûå®u­/['èZ•Ð)FÃCœ¹Ê. ÀíÀ[&tã>ùÁRò©¶ „*lŒæÏ!9°ÍS” A6t:ÕŽ€õ –Š4¾—³A:;GY¿E¶áiOgWf &²mz&Ÿ¸`Nû$³ÃUuîoŠÌˆe”/XºÓ>„kœÚ|ž·©ø¹—˜Ž0•0i!–>rÌz†äCyUWNv@dá•åi}×ÙéÆq¸¾Æ¹œë­°]®Y$QK@Ç»eàZu«Œœ¿û0kʽù –„ÎB¼ºý À]ëZ_¾ì°•GË~Î~)TÑZʆ#ô9ʪ½$ÿR &@bS ¥lÄ`aô+ê_±ªO¦x;VÅe Yãx±¨®{ ÕKIm:Ö ¦ h@ùhIpJþQV.pp[µñÎQÕÖ\õŒ"‹ÀÈê¢"lè}³]AuÀæ0Ñ«ê.µŒ…É„ù®œq«‡Ø©J]d¯]® røaÇQå#xGHºË3äׂŸÒ…ɃŸ:Tî-§³Xø ú|éÔ¨¯hä…~IaŒà„¤Þ·® àZ×úâµÁ=äíì5P‹ÆŒ”…àsPˆ|ÓQl2»ÌTñˆæþ ä);ÅðA}d“m¶DÓÖÙM¦¯KÛM¾áYö¯ÑöƸ(Vw°‘³MÊÐAˆ~"ïJbf 4iªB‚-ïw‡­Ò¿‡–š/=Òñü@‡»å´™¶ÂíØš¥vólT^̨yZÕU$/\àJÚwáW™Ìty‚B5™TÓ¶öQå¥:³$^ê‘(x~Ǫ$Cò³'4„Ð$s(Tß³\ù òaïÔ‚æÊ®u­/]Ÿ÷Ì,ÆÚ+sÀ =Ò‚<T¸ˆQfö©vh…G¡uFԵݘ”Û‚xY‘àÚuÒQ*¯îÒk;‡F-†Ï*À(|¦å°§«!9þ©ÌI›`Ì»& ig–•4”(,„Ä2ÎuQ3˪¯:î´¿á]¦¶aMÊH#;«Wƃ†vÝÑ‚‰Í7b;Qï¥0+fþV²dú†n+G{\KÌáÁèªUè$æÁVx9©…Õˆ½ºä=\—)¨=½ NÕ© R ú4§ªš¿î.”¨÷>±ç‘[_½.p­k}Ù:›@(s{ƒ$D´¸bÏ¡ç|i0À0¾1>} Ü˜-ÒºdaB¾¸ä—9‡R&àXaˆ-“ú3…¹¨ô²q;°%·cg—*Ší)ÙýšÄüb™Å˜ ì…=.•4W²†J–‘i§Ði4IÌ)ÌÇR»Ôo ÙS± #Ñ—\~±$AfƒÂ ¼¤ûÉ¢È< ¹õc”FÔÑX2IDAT’»;¼l骆?.7uŠ"© ,.zâ˜MpPÈ1EKA™îv ᘫº±|«òvÐOÑ ÌÂvBY€ :o0zæp×äŸC£ûër׺Ö¯ÏÅõË^ìÞ"”³»80uGÖ·OÌGT{²Î–/¤UÚ<}y—¥UÉê× žøÀ‡†:ŒNg• JFÙ!…$‰Ü¨…Ø[66§Ÿ8Сù„‘àqF¾:ÆÌ'ì0ÈcøÄÂFÖŽ=sÚAŒ¶ÞŽJÇyTDsƒ!À9¡ ©´·ÍÉxÎÈÝ—Ftú¹M°‘'a9¹uiÇÑÆU–¢õ6²r³›·ë [‘4”;ã‹òb¹Î‡vlAOF™ò:Á_Ä6~ÁªÎïí¸j׺Ö/ûsˆ±'ââ©Q*õ›Ê¼1íËù¡á•{Ø ž&ÞÙ3–ýÝxŽæÌÒh[’–K¥R®(¢ã"{çN³Í Ψ ôÍ@_&lu#pÓüƒ 3uM"ÓŠ¹ZªÒØU‡­7œ£¶,#FvQsN|yÉ vÇÄ|-{“²ò%Fú´džØZOÅŽ)œg#3ÑcqXu¥cãÍèšD8~¨»QÉ€=Ž$ ZÚ@‰#ªšLp^Ð"פÁ³$ºeŠVpà—Ê{¿.ǵ®u­¯X»üf*´zxòI©4Û%Bòa4²+êî<*wç‘9ƒB×Ãb³(öÌvÓÚ 4_ògññõ“9„±Ž9£¥é¿¹‚Pòã(—ý‚˜¢tYaJÊ4Ê› LÓŒ š²MÿœiúW”ì,{ž´œtG«œ £˜à-sŽQsO¤ ”ô@‹Œ_žØ“&Õu½f£VFÉw.×u$léªÃ焆X}j]û«œÆ}K=§‘‰ÿjø¤ JÌV‹£«L“viìÿÄG*;e‡2?Z*¹逾›t9€k]ëË—ýèÉq£½f»SXÉ7ðÅL¬Ü+<5PØHÔýÚºÊú…žN)Y×4EÍ ¯x“h/Ë¿Q*~Ã&e&*Ù–Ö±j^˜Q$5«{ ¯¬›-¿‚ö\’m§’hÄËSDF#õ3æ*¨Š³Ì‘œëp ø¦ä»Ž1÷™õRWÄýlÂÓæ†Y&Psf}ŽP>Aåûê®ÉL‰ [ªÂÅÕN+é|‰,Ý“M´ÊÂDÓò·)—ŸèÓòN÷<]:ócüÍ}òÎu9€k]ëk–ÿè×[Dv/Y†=µ †B¼œm+à% þ({ç63F& ™x¥(T_A±«Ã–œßâYÒ´4Öó4XËÖš‚»w5Œi´¡ö$°®À ÐûîtÛz&šSæ3M|Ñ+}{-°­éauþé.Š‹¬çÖ³jŒ^åQåVȈ~£Aê‚Å¢W#°Èlbm=çu}ã:1e¤Ã‹HÉsV˜=Å||mJ-~Q:ÎAÕjý¿ëúF~¶ÞüäñL/¶ÞÑL·÷žu9€k]ë‹W<·› ¨äý¥§(PŒðypB¦ôL(øLæb47™SŸi_´Oàâ*)§Ìgæ)¶Ì™éð4YŸXÝ¿žo‹t5L%;Øt¼0jæ.ei?8 Ù‰­µªES\Aw9Ô° cÍ›\†øã”|&´øÓHCoNwü Ñô+l½pÀ ±o#ãz_°Õam×ld—_D˜{d!¾¸:Àx+«e޲!®ŽÇggù-ƒJO|lÚ¶Ò¦ŠE4ñšF,x¥Ô=«'ÙÀË·°¿á BGäÇyè—¯«|­k½wYUƒ•s{ò´,¥Òz.©Ÿð©¡<ÑšžÄ[†™uÐ*ý…Z%#=†á ˜,JÁrUÍíÊf1O…ƒ ՠУ›IýY”7«Umaú‡ÉŽÝ3+ÕeͳœÉŒ¬«JAŠà×¾1+3…籫®wª¤G´D.³``ð ú#ÅEL²‘;éA‘Nœ«)–³vó§)²µ=;¥9=w§ƒÊp²|§Ì,!šÚ2LFÃa*>·\¶žBœçRÑ)¬Kvçf÷©XLÕ2ƒÉø:’²y5î8$IÒÔºatÓî9Ðò¸b·¦ô$– Å›µŸ'½ÝžïèX<9Bñîrx”,¶× ­T—Ë™[Û5.¦Ãg6FTV\o°¼ˆòX[ixß¡s^Ž4Èœ§Qdžnܸ?ñ‘¹T v…ì=N2+”НùŽ«r£ƒÍœÏ¡RWÁü×hXçíZ׺Ö¬|ôfñRÌGì¶#DГµT ¹Õè›í˜Ó§”&¼JUxhĘœO‡1s¯ØÇ¬fé2 ß2QŠhRX‘¦ÔÊLôA8 )¡2)¼ Ù•ŒØ±HAle”Æ CR9qÐCuÎ)ÿí1)Q™è»—f®'㤬9s ñROK4Ind5=Í·™Ò¡+]íkºÆ XæRö`úBË]E£Üx‡žP»ô=“0Ú4Ü-§Ûk#4¸ÚÓP 1eôçâàZJÅë¾¼àÕp­kýW®7OœÌq<Ë¡Ñ]T¥×¾Ë¼ñ¾©>¯OÆ}hk2[ñTÇ‹ÏI…[§ ¸N™ê ógÔʼÑ{àš.’[5ªÓ;³o6a Õ™£„‘5:¼ô ?#Pí}Ï01˜U=SE±„ðU§b&ændQ:H/E‡QN”%ÝÇiø¹É‚‘êFvNXÓ4àÌ@=‰ó@)ù΀H¨G–ß•£¼åê$Ø•’ ¡.qà6¤w÷UJ!E8âH‡.«×œÇb¡WzÜKó(¥`[E.r¸ÌaB ¶'‹‰·_½.p­k}ÙúŒv…ÍV³hA™4x4™-@6%¬PëôƇ5Ö§¤ý Šg¹ ¬©˜š 5§8­Ó¿ÏAŒÉlY(Ð`Â0Ú=÷ÖV°,kk«òygÎäÔgLq\h¢¯Õ?ì¹Z–ggE¬ø™ó#­§WŒ/í€áN-;È:7èÌ&¼ é°ZŽ¡ÏÌG!|äÑ%7 Åñ§Ìú †À\ÉFô[Kâð «cŸŠu|3É»Koièªj8Õä}ß=VPÙHÿê Þ€Š#S±L ,U›’Hûnçr׺Ö¯´˜Ì’=ÀóIiôJy@£Èô¯>ÞNF$Þ -ÔoN¡…,ôÒyf]1†ÉDY8ßÇÄ /ƒ‡ƒ§‰ÜRñ%ûÑüT9žÂXKñ#67¦Ñgâ9sd¾úõ}°ìºe‚òj¦-%³ÞN+âÝ» _žTëÅJkE<ú€ò't n‡mÍÑf:ÐDKª³Bk¸1È1ô,­X­Å÷¸´Ã0ƒSžRÔ𒦙™Z€`‹’”—{¦¡!PZ2mª«óN…ŠþAèÓáÂDaÜ ½b1}(ê@ïî»Àµ®õÅk?ã¸{ð8;½Ñ>М' ¶Y{«íÃtž…ûà5”N†fƒ•4[^Ó ÄÄÄ6éF)pãSáÏ…×ÀlJ2ÚL Úâõ’{BÓa»sr$<ÉŽÓ´³–ú?C0Tš,¡ e †´m¤Â\fà¼æAZÛŠôÈØ<(q…íC½ù¹jˈ{Š+@6%,‚ ^„,)òpSUV G·³AÍ28®"‡®¥õ]æ ÿ“ Ò‘ÜêòXáB«Ùnr ÑlT(€A«»lT(×·i¦–åVß@d(iˆŠBž !W¹ÞQxw q­ký«®|î&u`¯ðÄ¡=v((ð`ÓºãO³Ðá†Ò…žâe«4ÌJùŠƨ9ÇîxÝ>бÏ$»kZº&°ÛÀʶž  s¹áoK ?Ê΋e?5²*ͽþ´ð›¨Ð†Ub  ¸ŸBgæ<¶ìûpc;¦Öß\Níèe JN%$•"k)#{¾Š0ôÀ^椯ÎÛîCéÇOÚHNgh-øÜéE&s•šÛ¤˜¶5&ô¼Þ ÜO|ih´p$–_¼ã7œLpµ/èIå÷%äé°açX_½.p­k}ñÜ @Ñ80²õ)„t¬h,AíF¸•þ1 6­¼‘è²›gÓ“ƒÒ±ýh¼©1XAŸ9 ^-2³ëÕ5“Ý–ñ ›òHyΨ ‡µZ¨QZa“á[òmA"á£|QàLÎD”-‹ü&d‘–P~¤8q¤:"ýtNbÑDñ3?îduÿZº„è)[ʼnªOùã¨7MÂàF¿1H™6o”ŠAQ®SÖY‚1RÔ3A˜EèGìYÉiËr ‡¯òνãC)yÚ§Ñt¬ãj»Ã°Fù [ðü²ÏûEër׺Ö׬7OÎH£ÍPQu¤$W}ôdˆ&‹±QØN^tϨ9HMm´¦IŠå´Å‘ZaÜ™Ú~¼ÃjÆà6‘X“6à°þëS±Nª”#ÊNÙ’o“«m­J_¾pP¦²ö.>e¬™LÓÜ`¡ Á(së?ÛJ°I¸Ãcêd™0˜ì GØÙ0‘éùÖŸ€¼FƒO"ŒÆfKÙD£h }¡3Lr§’)Ñnð4ÜL¦S¦Î©å‰ sãYvAÂ$¸ß³Š²mÙ$Ór05Í&5bê’¨WÑYj }>³t‡òK×È6ÅòÝ1ò:64dFf8âúTªRh H©)ýÜ c¯Û;Æ%¨k„Y×Àƒ•“½Å¿j׺ֻV"ûFsüÎ|ÙSj×Óå ®|°¦¡í1z·¤}iàwQæÃøAÀ]&~3ä”L-9Tƒ WѪö¡ÆÛ¼aÎ0µ§>)¯8ø•”Wí7ʪë‰8ÅWŒŽ´ƒ±U÷,ZÆ·ûÌÑí1«Ò_àvÐcb§Â®Ú@É2ìççÙs¸Ê”|©+ÛˆÏöÏêðÍð{J'u9VDœÏÀ-+ùIa ÷P˜#‹ù[ÉU½Í¹ý†EʯºLQÈ5}Í,T0£Ç?r›AcEJ±¥1opƒ[ê zÏë›2ÔâݾÓús9€k]ë+–€ËHü÷þÀ ÊñÅàVARl,d&ZÉ ê <è!sß±GBµìÈ46ˆG©Úr&S~"$‹‘ºÙRðŸ ôWZï¿ æ3[vSþa™Èh'~âQ2%™iD†PŽÆ<&ç–£,wŪN¯Qb:§17øTáM§±g è<¬zF©Ù=VâÒ)”-ˆá:³:²8ù¹IÎö²±'Ï´°L”— Ýž\¯’²?³ãk\VM8õÜ©–ž‰GȼmùÕP¹ˆ“_þ ܱªÌšxÚÉæWý¥ë‚€®u­÷-ƒ–ãJ¦ÓžzÚɇyN FŠ4kÖ„ÊéÍnÔ.Ósã‡oùøäA"'ÕyjºáM,xum-d äÜ+vqþi©ß,sÊ£i}ºÀ¨žýS!×Ü5‚8•ŽYpX=Ήkбbm—ù4AÛœ ‰fFÚÀ‹bçø„tR³”º¿!71-•õЬ®V“´Óª´ùæž6ɹŒe î¯âÃBTtóªEô=óL˜%á|ùÇ݈°)›»+Í'÷³á#Ñ›˜¹`\š€†ZǞЅ:èCÓßzV8£È”}Qwð•\ëZ_¼ì|rÂPj ciŠ’¯g‰ÕVä¸Ôÿã£ìËJöƸ1öÀ Ï–3„Q´¾° µ+®ªi™Ø¤æÚ“J±d.ѱ5òõØÏ%xýX$ôj9½À'Œ,fpT¿×Á„.’ÛD2¢¶ò€e÷ÑòãSª÷P|³Bó²ÑQâ¶‚5JÛéKdHñ¥e&¬ß;÷%ùYršîN2êuX(Áô¶­‚tZý¦ÿ VŠŸg¼¦<Ïë>½±µ¨Ø»Üª*Çו58HÈÞã…ö!Ï3$R´š0²/ze-ê ùôåIÀ•\ëZ_³ò¿(î 2OJ1—ÄUܸ{N©i'ñzL-¿³©)«P(%uŒûg®¥ª¡,90=ÃÕxO]Ñ`§Gðž9ˆ¬“çîÇWT ŒAEeK„¦xÙ$ Gn±„%»²…ÛdVsŸuÞ&Xƒß_Í꣔¥öS’«c“WÁßÉÏ™Ù^by^²Y7ôúKß&ëÀÇJ{tPvˆR¸êÀ9ÖæxýÍ©+̦ ½R.a_¦ÍöÕ’¦ÝNYV% qõ3Šéf-5š"ÙÚÄVKq@{Ê+8ßÿóô^¿`]àZ×ú²Uvl§u@e2KJ€¡Î  XB*`2 sfè:ka -’†‚U˜ K9è|ÈÉ ~YÏB ËŒÂtJ—vÿ”Ü9¦wNq`¦Ä£2T˜ß¢5(FÅÒX„ ™–Ê"ÝãÅ#~æ¹B#Ʋ`ænä™)XŒœ,‚\"‘,¼Nõå#’î)yyªKNÕ˜ÇþÐ4uw¶QrbLT5Â…Ÿ@'Ót}Q|oÂÜâëJœÉšC1ã4Fß'µd?Ÿ8ÿ“ý¶p]sµ’ÍlO›²ï¥äõ ZæmÃiÓûªCü¢¤¢F!ÙÍIEND®B`‚opensurgsim-0.7.0/Examples/Stapling/Data/Geometry/staple.mtl000066400000000000000000000002111277777236100241170ustar00rootroot00000000000000# Blender MTL File: 'None' # Material Count: 1 newmtl None Ns 0 Ka 0.000000 0.000000 0.000000 Kd 0.8 0.8 0.8 Ks 0.8 0.8 0.8 d 1 illum 2 opensurgsim-0.7.0/Examples/Stapling/Data/Geometry/staple.obj000066400000000000000000000121021277777236100240770ustar00rootroot00000000000000# Blender v2.69 (sub 0) OBJ File: '' # www.blender.org mtllib staple.mtl o staple.001 v 0.004801 0.002520 -0.000394 v 0.004801 0.002520 0.000394 v 0.003882 0.000105 -0.000000 v 0.003892 0.003619 -0.000391 v 0.003892 0.003619 0.000391 v 0.003596 0.004065 0.000404 v 0.003596 0.004065 -0.000404 v 0.004153 0.004621 -0.000404 v 0.004153 0.004621 0.000404 v 0.004592 0.003976 0.000391 v 0.004592 0.003976 -0.000391 v 0.003154 0.004379 0.000391 v 0.003154 0.004379 -0.000392 v 0.004002 0.003100 -0.000391 v 0.004002 0.003100 0.000391 v 0.002671 0.004518 0.000394 v 0.002671 0.004518 -0.000394 v 0.003468 0.005101 -0.000392 v 0.003468 0.005101 0.000391 v 0.002757 0.005300 -0.000394 v 0.002757 0.005300 0.000394 v 0.004783 0.003198 -0.000391 v 0.004783 0.003198 0.000391 v 0.004013 0.002520 -0.000394 v 0.004013 0.002520 0.000394 v -0.001127 -0.003682 -0.000391 v -0.000813 -0.004125 -0.000404 v -0.001369 -0.004681 -0.000404 v -0.001850 -0.003996 -0.000391 v -0.000367 -0.004420 -0.000391 v -0.000725 -0.005121 -0.000391 v 0.000053 -0.005311 -0.000391 v 0.000152 -0.004530 -0.000391 v -0.000813 -0.004125 0.000404 v -0.000367 -0.004420 0.000391 v -0.000725 -0.005121 0.000391 v -0.001369 -0.004681 0.000404 v -0.001127 -0.003682 0.000392 v 0.000152 -0.004530 0.000391 v -0.001266 -0.003200 -0.000394 v -0.001266 -0.003200 0.000394 v -0.001850 -0.003996 0.000392 v -0.002048 -0.003285 -0.000394 v -0.002048 -0.003285 0.000394 v 0.000053 -0.005311 0.000391 v -0.002077 0.002660 -0.000394 v -0.002077 0.002660 0.000394 v -0.002048 0.003285 0.000394 v -0.002048 0.003285 -0.000394 v 0.000053 0.005311 -0.000391 v -0.000725 0.005121 -0.000391 v -0.000725 0.005121 0.000391 v 0.000053 0.005311 0.000391 v -0.001850 0.003996 0.000391 v -0.001850 0.003996 -0.000392 v -0.001369 0.004681 0.000404 v -0.001369 0.004681 -0.000404 v -0.001127 0.003682 -0.000392 v -0.001127 0.003682 0.000391 v -0.001266 0.003200 0.000394 v -0.001266 0.003200 -0.000394 v -0.001289 -0.002660 -0.000394 v -0.001289 0.002660 -0.000394 v -0.001289 0.002660 0.000394 v -0.001289 -0.002660 0.000394 v -0.002077 -0.002660 -0.000394 v -0.002077 -0.002660 0.000394 v 0.000152 0.004530 -0.000391 v 0.000152 0.004530 0.000391 v -0.000367 0.004420 0.000391 v -0.000367 0.004420 -0.000391 v -0.000813 0.004125 -0.000404 v -0.000813 0.004125 0.000404 v 0.003892 -0.003619 -0.000391 v 0.003596 -0.004065 -0.000404 v 0.003596 -0.004065 0.000404 v 0.003892 -0.003619 0.000391 v 0.004153 -0.004621 -0.000404 v 0.004592 -0.003976 -0.000391 v 0.004592 -0.003976 0.000391 v 0.004153 -0.004621 0.000404 v 0.003154 -0.004379 -0.000391 v 0.003154 -0.004379 0.000392 v 0.004002 -0.003100 -0.000391 v 0.004002 -0.003100 0.000391 v 0.002671 -0.004518 -0.000394 v 0.002671 -0.004518 0.000394 v 0.003468 -0.005101 -0.000391 v 0.003468 -0.005101 0.000392 v 0.002757 -0.005300 -0.000394 v 0.002757 -0.005300 0.000394 v 0.004783 -0.003198 -0.000391 v 0.004783 -0.003198 0.000391 v 0.000732 -0.004541 -0.000394 v 0.002132 -0.004541 -0.000394 v 0.002132 -0.005329 -0.000394 v 0.000732 -0.005329 -0.000394 v 0.000732 -0.004541 0.000394 v 0.002132 -0.004541 0.000394 v 0.000732 -0.005329 0.000394 v 0.002132 -0.005329 0.000394 v 0.002132 0.004541 0.000394 v 0.002132 0.004541 -0.000394 v 0.002132 0.005329 -0.000394 v 0.002132 0.005329 0.000394 v 0.000732 0.004541 -0.000394 v 0.000732 0.005329 -0.000394 v 0.000732 0.004541 0.000394 v 0.000732 0.005329 0.000394 v 0.004801 -0.002520 -0.000394 v 0.004801 -0.002520 0.000394 v 0.004013 -0.002520 -0.000394 v 0.003882 -0.000105 0.000000 v 0.004013 -0.002520 0.000394 usemtl None s 1 f 1 2 3 f 4 5 6 7 f 8 9 10 11 f 7 6 12 13 f 14 15 5 4 f 13 12 16 17 f 18 19 9 8 f 20 21 19 18 f 22 11 10 23 f 24 25 15 14 f 22 14 4 11 f 7 8 11 4 f 13 18 8 7 f 17 20 18 13 f 21 16 12 19 f 6 9 19 12 f 5 10 9 6 f 15 23 10 5 f 26 27 28 29 f 27 30 31 28 f 32 31 30 33 f 30 27 34 35 f 28 31 36 37 f 27 26 38 34 f 33 30 35 39 f 26 40 41 38 f 29 28 37 42 f 43 29 42 44 f 32 45 36 31 f 40 26 29 43 f 44 42 38 41 f 34 38 42 37 f 35 34 37 36 f 39 35 36 45 f 46 47 48 49 f 50 51 52 53 f 49 48 54 55 f 55 54 56 57 f 58 59 60 61 f 62 63 64 65 f 46 66 67 47 f 65 64 47 67 f 66 46 63 62 f 68 69 70 71 f 72 73 59 58 f 57 56 52 51 f 71 70 73 72 f 61 60 64 63 f 50 68 71 51 f 72 57 51 71 f 58 55 57 72 f 61 49 55 58 f 61 63 46 49 f 48 47 64 60 f 48 60 59 54 f 73 56 54 59 f 70 52 56 73 f 69 53 52 70 f 40 62 65 41 f 40 43 66 62 f 44 41 65 67 f 66 43 44 67 f 74 75 76 77 f 78 79 80 81 f 75 82 83 76 f 84 74 77 85 f 82 86 87 83 f 88 78 81 89 f 90 88 89 91 f 92 93 80 79 f 92 79 74 84 f 75 74 79 78 f 82 75 78 88 f 86 82 88 90 f 91 89 83 87 f 76 83 89 81 f 77 76 81 80 f 85 77 80 93 f 94 95 96 97 f 95 94 98 99 f 99 98 100 101 f 97 96 101 100 f 24 1 3 f 3 25 24 f 3 2 25 f 17 16 102 103 f 1 22 23 2 f 104 105 21 20 f 1 24 14 22 f 17 103 104 20 f 21 105 102 16 f 25 2 23 15 f 106 107 104 103 f 103 102 108 106 f 102 105 109 108 f 107 109 105 104 f 94 33 39 98 f 33 94 97 32 f 97 100 45 32 f 45 100 98 39 f 106 108 69 68 f 107 50 53 109 f 68 50 107 106 f 53 69 108 109 f 86 95 99 87 f 110 111 93 92 f 96 90 91 101 f 84 112 110 92 f 86 90 96 95 f 91 87 99 101 f 113 110 112 f 113 112 114 f 114 111 113 f 111 110 113 f 112 84 85 114 f 93 111 114 85 opensurgsim-0.7.0/Examples/Stapling/Data/Geometry/staple_collision.ply000066400000000000000000000760741277777236100262260ustar00rootroot00000000000000ply format ascii 1.0 comment Created by Blender 2.69 (sub 0) - www.blender.org, source file: '' element vertex 504 property float x property float y property float z property float nx property float ny property float nz element face 224 property list uchar uint vertex_indices end_header 0.004801 0.000394 0.002520 0.934616 0.000000 -0.355657 0.004801 -0.000394 0.002520 0.934616 0.000000 -0.355657 0.003882 0.000000 0.000105 0.934616 0.000000 -0.355657 0.003892 0.000391 0.003619 -0.833198 0.000000 -0.552975 0.003892 -0.000391 0.003619 -0.833198 0.000000 -0.552975 0.003596 -0.000404 0.004065 -0.833198 0.000000 -0.552975 0.003596 0.000404 0.004065 -0.833198 -0.000000 -0.552975 0.004153 0.000404 0.004621 0.826688 -0.000000 0.562660 0.004153 -0.000404 0.004621 0.826688 -0.000000 0.562660 0.004592 -0.000391 0.003976 0.826688 -0.000000 0.562660 0.004592 0.000391 0.003976 0.826688 0.000000 0.562660 0.003596 0.000404 0.004065 -0.579143 0.000000 -0.815226 0.003596 -0.000404 0.004065 -0.579143 0.000000 -0.815226 0.003154 -0.000391 0.004379 -0.579143 0.000000 -0.815226 0.003154 0.000391 0.004379 -0.579143 -0.000000 -0.815226 0.004002 0.000391 0.003100 -0.978269 0.000000 -0.207340 0.004002 -0.000391 0.003100 -0.978269 0.000000 -0.207340 0.003892 -0.000391 0.003619 -0.978269 0.000000 -0.207340 0.003892 0.000391 0.003619 -0.978269 -0.000000 -0.207340 0.003154 0.000391 0.004379 -0.276560 0.000000 -0.960997 0.003154 -0.000391 0.004379 -0.276560 0.000000 -0.960997 0.002671 -0.000394 0.004518 -0.276560 0.000000 -0.960997 0.002671 0.000394 0.004518 -0.276560 -0.000000 -0.960997 0.003468 0.000391 0.005101 0.573863 -0.000000 0.818951 0.003468 -0.000391 0.005101 0.573863 -0.000000 0.818951 0.004153 -0.000404 0.004621 0.573863 -0.000000 0.818951 0.004153 0.000404 0.004621 0.573863 0.000000 0.818951 0.002757 0.000394 0.005300 0.269529 -0.000000 0.962992 0.002757 -0.000394 0.005300 0.269529 -0.000000 0.962992 0.003468 -0.000391 0.005101 0.269529 -0.000000 0.962992 0.003468 0.000391 0.005101 0.269529 0.000000 0.962992 0.004783 0.000391 0.003198 0.971162 -0.000000 0.238421 0.004592 0.000391 0.003976 0.971162 -0.000000 0.238421 0.004592 -0.000391 0.003976 0.971162 -0.000000 0.238421 0.004783 -0.000391 0.003198 0.971162 0.000000 0.238421 0.004013 0.000394 0.002520 -0.999820 0.000000 -0.018962 0.004013 -0.000394 0.002520 -0.999820 0.000000 -0.018962 0.004002 -0.000391 0.003100 -0.999820 0.000000 -0.018962 0.004002 0.000391 0.003100 -0.999820 -0.000000 -0.018962 0.004783 0.000391 0.003198 -0.000000 1.000000 0.000000 0.004002 0.000391 0.003100 -0.000000 1.000000 0.000000 0.003892 0.000391 0.003619 -0.000000 1.000000 0.000000 0.004592 0.000391 0.003976 0.000000 1.000000 0.000000 0.003596 0.000404 0.004065 0.011978 0.999856 -0.012000 0.004153 0.000404 0.004621 0.011978 0.999856 -0.012000 0.004592 0.000391 0.003976 0.011978 0.999856 -0.012000 0.003596 0.000404 0.004065 0.011103 0.999701 -0.021770 0.004592 0.000391 0.003976 0.011103 0.999701 -0.021770 0.003892 0.000391 0.003619 0.011103 0.999701 -0.021770 0.003154 0.000391 0.004379 -0.014544 0.999874 0.006325 0.003468 0.000391 0.005101 -0.014544 0.999874 0.006325 0.004153 0.000404 0.004621 -0.014544 0.999874 0.006325 0.003154 0.000391 0.004379 -0.017178 0.999704 0.017209 0.004153 0.000404 0.004621 -0.017178 0.999704 0.017209 0.003596 0.000404 0.004065 -0.017178 0.999704 0.017209 0.002671 0.000394 0.004518 0.004093 0.999992 -0.000450 0.002757 0.000394 0.005300 0.004093 0.999992 -0.000450 0.003468 0.000391 0.005101 0.004093 0.999992 -0.000450 0.002671 0.000394 0.004518 0.005520 0.999982 -0.002401 0.003468 0.000391 0.005101 0.005520 0.999982 -0.002401 0.003154 0.000391 0.004379 0.005520 0.999982 -0.002401 0.002757 -0.000394 0.005300 0.006021 -0.999982 -0.000662 0.002671 -0.000394 0.004518 0.006021 -0.999982 -0.000662 0.003154 -0.000391 0.004379 0.006021 -0.999982 -0.000662 0.002757 -0.000394 0.005300 0.003762 -0.999992 -0.001636 0.003154 -0.000391 0.004379 0.003762 -0.999992 -0.001636 0.003468 -0.000391 0.005101 0.003762 -0.999992 -0.001636 0.003596 -0.000404 0.004065 -0.011149 -0.999875 0.011169 0.004153 -0.000404 0.004621 -0.011149 -0.999875 0.011169 0.003468 -0.000391 0.005101 -0.011149 -0.999875 0.011169 0.003596 -0.000404 0.004065 -0.022463 -0.999700 0.009769 0.003468 -0.000391 0.005101 -0.022463 -0.999700 0.009769 0.003154 -0.000391 0.004379 -0.022463 -0.999700 0.009769 0.003892 -0.000391 0.003619 0.007629 -0.999859 -0.014959 0.004592 -0.000391 0.003976 0.007629 -0.999859 -0.014959 0.004153 -0.000404 0.004621 0.007629 -0.999859 -0.014959 0.003892 -0.000391 0.003619 0.017496 -0.999693 -0.017527 0.004153 -0.000404 0.004621 0.017496 -0.999693 -0.017527 0.003596 -0.000404 0.004065 0.017496 -0.999693 -0.017527 0.004002 -0.000391 0.003100 0.000000 -1.000000 -0.000000 0.004783 -0.000391 0.003198 0.000000 -1.000000 -0.000000 0.004592 -0.000391 0.003976 0.000000 -1.000000 -0.000000 0.003892 -0.000391 0.003619 0.000000 -1.000000 -0.000000 -0.001127 0.000391 -0.003682 -0.017168 0.999705 0.017168 -0.000813 0.000404 -0.004125 -0.017168 0.999705 0.017168 -0.001369 0.000404 -0.004681 -0.017168 0.999705 0.017168 -0.001127 0.000391 -0.003682 -0.006315 0.999874 0.014541 -0.001369 0.000404 -0.004681 -0.006315 0.999874 0.014541 -0.001850 0.000391 -0.003996 -0.006315 0.999874 0.014541 -0.000813 0.000404 -0.004125 0.021782 0.999701 -0.011124 -0.000367 0.000391 -0.004420 0.021782 0.999701 -0.011124 -0.000725 0.000391 -0.005121 0.021782 0.999701 -0.011124 -0.000813 0.000404 -0.004125 0.011991 0.999856 -0.011991 -0.000725 0.000391 -0.005121 0.011991 0.999856 -0.011991 -0.001369 0.000404 -0.004681 0.011991 0.999856 -0.011991 0.000053 0.000391 -0.005311 0.000000 1.000000 0.000000 -0.000725 0.000391 -0.005121 0.000000 1.000000 0.000000 -0.000367 0.000391 -0.004420 0.000000 1.000000 0.000000 0.000152 0.000391 -0.004530 0.000000 1.000000 0.000000 -0.000367 0.000391 -0.004420 0.551676 -0.000000 0.834059 -0.000813 0.000404 -0.004125 0.551676 -0.000000 0.834059 -0.000813 -0.000404 -0.004125 0.551676 -0.000000 0.834059 -0.000367 -0.000391 -0.004420 0.551676 0.000000 0.834059 -0.001369 0.000404 -0.004681 -0.564132 0.000000 -0.825684 -0.000725 0.000391 -0.005121 -0.564132 0.000000 -0.825684 -0.000725 -0.000391 -0.005121 -0.564132 0.000000 -0.825684 -0.001369 -0.000404 -0.004681 -0.564132 0.000000 -0.825684 -0.000813 0.000404 -0.004125 0.815843 -0.000000 0.578273 -0.001127 0.000391 -0.003682 0.815843 -0.000000 0.578273 -0.001127 -0.000391 -0.003682 0.815843 -0.000000 0.578273 -0.000813 -0.000404 -0.004125 0.815843 0.000000 0.578273 0.000152 0.000391 -0.004530 0.207340 -0.000000 0.978269 -0.000367 0.000391 -0.004420 0.207340 -0.000000 0.978269 -0.000367 -0.000391 -0.004420 0.207340 -0.000000 0.978269 0.000152 -0.000391 -0.004530 0.207340 0.000000 0.978269 -0.001127 0.000391 -0.003682 0.960844 -0.000000 0.277090 -0.001266 0.000394 -0.003200 0.960844 -0.000000 0.277090 -0.001266 -0.000394 -0.003200 0.960844 -0.000000 0.277090 -0.001127 -0.000391 -0.003682 0.960844 0.000000 0.277090 -0.001850 0.000391 -0.003996 -0.818389 0.000000 -0.574665 -0.001369 0.000404 -0.004681 -0.818389 0.000000 -0.574665 -0.001369 -0.000404 -0.004681 -0.818389 0.000000 -0.574665 -0.001850 -0.000391 -0.003996 -0.818389 0.000000 -0.574665 -0.002048 0.000394 -0.003285 -0.963343 0.000000 -0.268273 -0.001850 0.000391 -0.003996 -0.963343 0.000000 -0.268273 -0.001850 -0.000391 -0.003996 -0.963343 0.000000 -0.268273 -0.002048 -0.000394 -0.003285 -0.963343 0.000000 -0.268273 0.000053 0.000391 -0.005311 -0.237244 0.000000 -0.971450 0.000053 -0.000391 -0.005311 -0.237244 0.000000 -0.971450 -0.000725 -0.000391 -0.005121 -0.237244 0.000000 -0.971450 -0.000725 0.000391 -0.005121 -0.237244 -0.000000 -0.971450 -0.001266 0.000394 -0.003200 0.002402 0.999982 -0.005531 -0.001127 0.000391 -0.003682 0.002402 0.999982 -0.005531 -0.001850 0.000391 -0.003996 0.002402 0.999982 -0.005531 -0.001266 0.000394 -0.003200 0.000445 0.999992 -0.004095 -0.001850 0.000391 -0.003996 0.000445 0.999992 -0.004095 -0.002048 0.000394 -0.003285 0.000445 0.999992 -0.004095 -0.002048 -0.000394 -0.003285 0.001635 -0.999992 -0.003764 -0.001850 -0.000391 -0.003996 0.001635 -0.999992 -0.003764 -0.001127 -0.000391 -0.003682 0.001635 -0.999992 -0.003764 -0.002048 -0.000394 -0.003285 0.000656 -0.999982 -0.006035 -0.001127 -0.000391 -0.003682 0.000656 -0.999982 -0.006035 -0.001266 -0.000394 -0.003200 0.000656 -0.999982 -0.006035 -0.000813 -0.000404 -0.004125 -0.009742 -0.999701 0.022431 -0.001127 -0.000391 -0.003682 -0.009742 -0.999701 0.022431 -0.001850 -0.000391 -0.003996 -0.009742 -0.999701 0.022431 -0.000813 -0.000404 -0.004125 -0.011148 -0.999876 0.011148 -0.001850 -0.000391 -0.003996 -0.011148 -0.999876 0.011148 -0.001369 -0.000404 -0.004681 -0.011148 -0.999876 0.011148 -0.000367 -0.000391 -0.004420 0.017538 -0.999692 -0.017538 -0.000813 -0.000404 -0.004125 0.017538 -0.999692 -0.017538 -0.001369 -0.000404 -0.004681 0.017538 -0.999692 -0.017538 -0.000367 -0.000391 -0.004420 0.014963 -0.999859 -0.007641 -0.001369 -0.000404 -0.004681 0.014963 -0.999859 -0.007641 -0.000725 -0.000391 -0.005121 0.014963 -0.999859 -0.007641 0.000152 -0.000391 -0.004530 0.000000 -1.000000 0.000000 -0.000367 -0.000391 -0.004420 0.000000 -1.000000 0.000000 -0.000725 -0.000391 -0.005121 0.000000 -1.000000 0.000000 0.000053 -0.000391 -0.005311 0.000000 -1.000000 0.000000 -0.002077 0.000394 0.002660 -0.998925 0.000000 0.046350 -0.002077 -0.000394 0.002660 -0.998925 0.000000 0.046350 -0.002048 -0.000394 0.003285 -0.998925 0.000000 0.046350 -0.002048 0.000394 0.003285 -0.998925 0.000000 0.046350 0.000053 0.000391 0.005311 -0.237244 0.000000 0.971450 -0.000725 0.000391 0.005121 -0.237244 0.000000 0.971450 -0.000725 -0.000391 0.005121 -0.237244 0.000000 0.971450 0.000053 -0.000391 0.005311 -0.237244 0.000000 0.971450 -0.002048 0.000394 0.003285 -0.963343 0.000000 0.268273 -0.002048 -0.000394 0.003285 -0.963343 0.000000 0.268273 -0.001850 -0.000391 0.003996 -0.963343 0.000000 0.268273 -0.001850 0.000391 0.003996 -0.963343 0.000000 0.268273 -0.001850 0.000391 0.003996 -0.818389 0.000000 0.574665 -0.001850 -0.000391 0.003996 -0.818389 0.000000 0.574665 -0.001369 -0.000404 0.004681 -0.818389 0.000000 0.574665 -0.001369 0.000404 0.004681 -0.818389 0.000000 0.574665 -0.001127 0.000391 0.003682 0.960844 0.000000 -0.277090 -0.001127 -0.000391 0.003682 0.960844 0.000000 -0.277090 -0.001266 -0.000394 0.003200 0.960844 0.000000 -0.277090 -0.001266 0.000394 0.003200 0.960844 0.000000 -0.277090 -0.001289 0.000394 -0.002660 1.000000 -0.000000 0.000000 -0.001289 0.000394 0.002660 1.000000 -0.000000 0.000000 -0.001289 -0.000394 0.002660 1.000000 -0.000000 0.000000 -0.001289 -0.000394 -0.002660 1.000000 -0.000000 0.000000 -0.002077 0.000394 0.002660 -1.000000 0.000000 0.000000 -0.002077 0.000394 -0.002660 -1.000000 0.000000 0.000000 -0.002077 -0.000394 -0.002660 -1.000000 0.000000 0.000000 -0.002077 -0.000394 0.002660 -1.000000 0.000000 0.000000 -0.001289 -0.000394 -0.002660 0.000000 -1.000000 0.000000 -0.001289 -0.000394 0.002660 0.000000 -1.000000 0.000000 -0.002077 -0.000394 0.002660 0.000000 -1.000000 0.000000 -0.002077 -0.000394 -0.002660 0.000000 -1.000000 0.000000 -0.002077 0.000394 -0.002660 0.000000 1.000000 0.000000 -0.002077 0.000394 0.002660 0.000000 1.000000 0.000000 -0.001289 0.000394 0.002660 0.000000 1.000000 0.000000 -0.001289 0.000394 -0.002660 0.000000 1.000000 -0.000000 0.000152 0.000391 0.004530 0.207340 0.000000 -0.978269 0.000152 -0.000391 0.004530 0.207340 0.000000 -0.978269 -0.000367 -0.000391 0.004420 0.207340 0.000000 -0.978269 -0.000367 0.000391 0.004420 0.207340 0.000000 -0.978269 -0.000813 0.000404 0.004125 0.815843 0.000000 -0.578273 -0.000813 -0.000404 0.004125 0.815843 0.000000 -0.578273 -0.001127 -0.000391 0.003682 0.815843 0.000000 -0.578273 -0.001127 0.000391 0.003682 0.815843 0.000000 -0.578273 -0.001369 0.000404 0.004681 -0.564132 0.000000 0.825684 -0.001369 -0.000404 0.004681 -0.564132 0.000000 0.825684 -0.000725 -0.000391 0.005121 -0.564132 0.000000 0.825684 -0.000725 0.000391 0.005121 -0.564132 0.000000 0.825684 -0.000367 0.000391 0.004420 0.551676 0.000000 -0.834059 -0.000367 -0.000391 0.004420 0.551676 0.000000 -0.834059 -0.000813 -0.000404 0.004125 0.551676 0.000000 -0.834059 -0.000813 0.000404 0.004125 0.551676 0.000000 -0.834059 -0.001266 0.000394 0.003200 0.999094 0.000000 -0.042554 -0.001266 -0.000394 0.003200 0.999094 0.000000 -0.042554 -0.001289 -0.000394 0.002660 0.999094 0.000000 -0.042554 -0.001289 0.000394 0.002660 0.999094 0.000000 -0.042554 0.000053 0.000391 0.005311 0.000000 1.000000 -0.000000 0.000152 0.000391 0.004530 0.000000 1.000000 -0.000000 -0.000367 0.000391 0.004420 0.000000 1.000000 -0.000000 -0.000725 0.000391 0.005121 -0.000000 1.000000 0.000000 -0.000813 0.000404 0.004125 0.011991 0.999856 0.011991 -0.001369 0.000404 0.004681 0.011991 0.999856 0.011991 -0.000725 0.000391 0.005121 0.011991 0.999856 0.011991 -0.000813 0.000404 0.004125 0.021782 0.999701 0.011124 -0.000725 0.000391 0.005121 0.021782 0.999701 0.011124 -0.000367 0.000391 0.004420 0.021782 0.999701 0.011124 -0.001127 0.000391 0.003682 -0.006315 0.999874 -0.014541 -0.001850 0.000391 0.003996 -0.006315 0.999874 -0.014541 -0.001369 0.000404 0.004681 -0.006315 0.999874 -0.014541 -0.001127 0.000391 0.003682 -0.017168 0.999705 -0.017168 -0.001369 0.000404 0.004681 -0.017168 0.999705 -0.017168 -0.000813 0.000404 0.004125 -0.017168 0.999705 -0.017168 -0.001266 0.000394 0.003200 0.000445 0.999992 0.004095 -0.002048 0.000394 0.003285 0.000445 0.999992 0.004095 -0.001850 0.000391 0.003996 0.000445 0.999992 0.004095 -0.001266 0.000394 0.003200 0.002402 0.999982 0.005531 -0.001850 0.000391 0.003996 0.002402 0.999982 0.005531 -0.001127 0.000391 0.003682 0.002402 0.999982 0.005531 -0.001266 0.000394 0.003200 0.000000 1.000000 0.000000 -0.002048 0.000394 0.003285 -0.000000 1.000000 0.000000 -0.002048 -0.000394 0.003285 0.000000 -1.000000 0.000000 -0.001266 -0.000394 0.003200 -0.000000 -1.000000 0.000000 -0.002048 -0.000394 0.003285 0.000656 -0.999982 0.006035 -0.001266 -0.000394 0.003200 0.000656 -0.999982 0.006035 -0.001127 -0.000391 0.003682 0.000656 -0.999982 0.006035 -0.002048 -0.000394 0.003285 0.001635 -0.999992 0.003764 -0.001127 -0.000391 0.003682 0.001635 -0.999992 0.003764 -0.001850 -0.000391 0.003996 0.001635 -0.999992 0.003764 -0.000813 -0.000404 0.004125 -0.011148 -0.999876 -0.011148 -0.001369 -0.000404 0.004681 -0.011148 -0.999876 -0.011148 -0.001850 -0.000391 0.003996 -0.011148 -0.999876 -0.011148 -0.000813 -0.000404 0.004125 -0.009742 -0.999701 -0.022431 -0.001850 -0.000391 0.003996 -0.009742 -0.999701 -0.022431 -0.001127 -0.000391 0.003682 -0.009742 -0.999701 -0.022431 -0.000367 -0.000391 0.004420 0.014963 -0.999859 0.007641 -0.000725 -0.000391 0.005121 0.014963 -0.999859 0.007641 -0.001369 -0.000404 0.004681 0.014963 -0.999859 0.007641 -0.000367 -0.000391 0.004420 0.017538 -0.999692 0.017538 -0.001369 -0.000404 0.004681 0.017538 -0.999692 0.017538 -0.000813 -0.000404 0.004125 0.017538 -0.999692 0.017538 0.000152 -0.000391 0.004530 0.000000 -1.000000 0.000000 0.000053 -0.000391 0.005311 0.000000 -1.000000 0.000000 -0.000725 -0.000391 0.005121 0.000000 -1.000000 0.000000 -0.000367 -0.000391 0.004420 0.000000 -1.000000 0.000000 -0.001266 0.000394 -0.003200 0.999094 -0.000000 0.042554 -0.001289 0.000394 -0.002660 0.999094 -0.000000 0.042554 -0.001289 -0.000394 -0.002660 0.999094 -0.000000 0.042554 -0.001266 -0.000394 -0.003200 0.999094 0.000000 0.042554 -0.001266 0.000394 -0.003200 -0.000000 1.000000 0.000000 -0.002048 0.000394 -0.003285 -0.000000 1.000000 0.000000 -0.002048 -0.000394 -0.003285 0.000000 -1.000000 -0.000000 -0.001266 -0.000394 -0.003200 0.000000 -1.000000 -0.000000 -0.002077 0.000394 -0.002660 -0.998925 0.000000 -0.046350 -0.002048 0.000394 -0.003285 -0.998925 0.000000 -0.046350 -0.002048 -0.000394 -0.003285 -0.998925 0.000000 -0.046350 -0.002077 -0.000394 -0.002660 -0.998925 0.000000 -0.046350 0.003892 0.000391 -0.003619 -0.833198 0.000000 0.552975 0.003596 0.000404 -0.004065 -0.833198 0.000000 0.552975 0.003596 -0.000404 -0.004065 -0.833198 0.000000 0.552975 0.003892 -0.000391 -0.003619 -0.833198 0.000000 0.552975 0.004153 0.000404 -0.004621 0.826688 0.000000 -0.562660 0.004592 0.000391 -0.003976 0.826688 0.000000 -0.562660 0.004592 -0.000391 -0.003976 0.826688 0.000000 -0.562660 0.004153 -0.000404 -0.004621 0.826688 0.000000 -0.562660 0.003596 0.000404 -0.004065 -0.579143 0.000000 0.815226 0.003154 0.000391 -0.004379 -0.579143 0.000000 0.815226 0.003154 -0.000391 -0.004379 -0.579143 0.000000 0.815226 0.003596 -0.000404 -0.004065 -0.579143 0.000000 0.815226 0.004002 0.000391 -0.003100 -0.978269 0.000000 0.207340 0.003892 0.000391 -0.003619 -0.978269 0.000000 0.207340 0.003892 -0.000391 -0.003619 -0.978269 0.000000 0.207340 0.004002 -0.000391 -0.003100 -0.978269 0.000000 0.207340 0.003154 0.000391 -0.004379 -0.276560 0.000000 0.960997 0.002671 0.000394 -0.004518 -0.276560 0.000000 0.960997 0.002671 -0.000394 -0.004518 -0.276560 0.000000 0.960997 0.003154 -0.000391 -0.004379 -0.276560 0.000000 0.960997 0.003468 0.000391 -0.005101 0.573863 0.000000 -0.818951 0.004153 0.000404 -0.004621 0.573863 0.000000 -0.818951 0.004153 -0.000404 -0.004621 0.573863 0.000000 -0.818951 0.003468 -0.000391 -0.005101 0.573863 0.000000 -0.818951 0.002757 0.000394 -0.005300 0.269529 0.000000 -0.962992 0.003468 0.000391 -0.005101 0.269529 0.000000 -0.962992 0.003468 -0.000391 -0.005101 0.269529 0.000000 -0.962992 0.002757 -0.000394 -0.005300 0.269529 0.000000 -0.962992 0.004783 0.000391 -0.003198 0.971162 0.000000 -0.238421 0.004783 -0.000391 -0.003198 0.971162 0.000000 -0.238421 0.004592 -0.000391 -0.003976 0.971162 0.000000 -0.238421 0.004592 0.000391 -0.003976 0.971162 0.000000 -0.238421 0.004783 0.000391 -0.003198 -0.000000 1.000000 0.000000 0.004592 0.000391 -0.003976 -0.000000 1.000000 0.000000 0.003892 0.000391 -0.003619 -0.000000 1.000000 0.000000 0.004002 0.000391 -0.003100 -0.000000 1.000000 0.000000 0.003596 0.000404 -0.004065 0.011103 0.999701 0.021770 0.003892 0.000391 -0.003619 0.011103 0.999701 0.021770 0.004592 0.000391 -0.003976 0.011103 0.999701 0.021770 0.003596 0.000404 -0.004065 0.011978 0.999856 0.012000 0.004592 0.000391 -0.003976 0.011978 0.999856 0.012000 0.004153 0.000404 -0.004621 0.011978 0.999856 0.012000 0.003154 0.000391 -0.004379 -0.017178 0.999704 -0.017209 0.003596 0.000404 -0.004065 -0.017178 0.999704 -0.017209 0.004153 0.000404 -0.004621 -0.017178 0.999704 -0.017209 0.003154 0.000391 -0.004379 -0.014544 0.999874 -0.006325 0.004153 0.000404 -0.004621 -0.014544 0.999874 -0.006325 0.003468 0.000391 -0.005101 -0.014544 0.999874 -0.006325 0.002671 0.000394 -0.004518 0.005520 0.999982 0.002401 0.003154 0.000391 -0.004379 0.005520 0.999982 0.002401 0.003468 0.000391 -0.005101 0.005520 0.999982 0.002401 0.002671 0.000394 -0.004518 0.004093 0.999992 0.000450 0.003468 0.000391 -0.005101 0.004093 0.999992 0.000450 0.002757 0.000394 -0.005300 0.004093 0.999992 0.000450 0.002757 -0.000394 -0.005300 0.003761 -0.999992 0.001636 0.003468 -0.000391 -0.005101 0.003761 -0.999992 0.001636 0.003154 -0.000391 -0.004379 0.003761 -0.999992 0.001636 0.002757 -0.000394 -0.005300 0.006021 -0.999982 0.000662 0.003154 -0.000391 -0.004379 0.006021 -0.999982 0.000662 0.002671 -0.000394 -0.004518 0.006021 -0.999982 0.000662 0.003596 -0.000404 -0.004065 -0.022463 -0.999700 -0.009769 0.003154 -0.000391 -0.004379 -0.022463 -0.999700 -0.009769 0.003468 -0.000391 -0.005101 -0.022463 -0.999700 -0.009769 0.003596 -0.000404 -0.004065 -0.011149 -0.999875 -0.011169 0.003468 -0.000391 -0.005101 -0.011149 -0.999875 -0.011169 0.004153 -0.000404 -0.004621 -0.011149 -0.999875 -0.011169 0.003892 -0.000391 -0.003619 0.017496 -0.999693 0.017527 0.003596 -0.000404 -0.004065 0.017496 -0.999693 0.017527 0.004153 -0.000404 -0.004621 0.017496 -0.999693 0.017527 0.003892 -0.000391 -0.003619 0.007629 -0.999859 0.014959 0.004153 -0.000404 -0.004621 0.007629 -0.999859 0.014959 0.004592 -0.000391 -0.003976 0.007629 -0.999859 0.014959 0.004002 -0.000391 -0.003100 0.000000 -1.000000 0.000000 0.003892 -0.000391 -0.003619 0.000000 -1.000000 0.000000 0.004592 -0.000391 -0.003976 0.000000 -1.000000 0.000000 0.004783 -0.000391 -0.003198 -0.000000 -1.000000 0.000000 0.000732 0.000394 -0.004541 0.000000 1.000000 -0.000000 0.002132 0.000394 -0.004541 0.000000 1.000000 -0.000000 0.002132 0.000394 -0.005329 0.000000 1.000000 -0.000000 0.000732 0.000394 -0.005329 0.000000 1.000000 -0.000000 0.002132 0.000394 -0.004541 0.000000 0.000000 1.000000 0.000732 0.000394 -0.004541 0.000000 0.000000 1.000000 0.000732 -0.000394 -0.004541 0.000000 0.000000 1.000000 0.002132 -0.000394 -0.004541 0.000000 -0.000000 1.000000 0.002132 -0.000394 -0.004541 0.000000 -1.000000 0.000000 0.000732 -0.000394 -0.004541 0.000000 -1.000000 0.000000 0.000732 -0.000394 -0.005329 0.000000 -1.000000 0.000000 0.002132 -0.000394 -0.005329 0.000000 -1.000000 0.000000 0.000732 0.000394 -0.005329 0.000000 0.000000 -1.000000 0.002132 0.000394 -0.005329 0.000000 0.000000 -1.000000 0.002132 -0.000394 -0.005329 0.000000 0.000000 -1.000000 0.000732 -0.000394 -0.005329 0.000000 0.000000 -1.000000 0.004013 0.000394 0.002520 0.000000 0.986951 -0.161018 0.004801 0.000394 0.002520 0.000000 0.986951 -0.161018 0.003882 0.000000 0.000105 0.000000 0.986951 -0.161018 0.003882 0.000000 0.000105 -0.998532 0.000000 0.054165 0.004013 -0.000394 0.002520 -0.998532 0.000000 0.054165 0.004013 0.000394 0.002520 -0.998532 0.000000 0.054165 0.003882 0.000000 0.000105 0.000000 -0.986951 -0.161018 0.004801 -0.000394 0.002520 0.000000 -0.986951 -0.161018 0.004013 -0.000394 0.002520 0.000000 -0.986951 -0.161018 0.002671 0.000394 0.004518 -0.042633 0.000000 -0.999091 0.002671 -0.000394 0.004518 -0.042633 0.000000 -0.999091 0.002132 -0.000394 0.004541 -0.042633 0.000000 -0.999091 0.002132 0.000394 0.004541 -0.042633 -0.000000 -0.999091 0.004801 0.000394 0.002520 0.999648 -0.000000 0.026540 0.004783 0.000391 0.003198 0.999648 -0.000000 0.026540 0.004783 -0.000391 0.003198 0.999648 -0.000000 0.026540 0.004801 -0.000394 0.002520 0.999648 0.000000 0.026540 0.002132 0.000394 0.005329 0.046350 -0.000000 0.998925 0.002132 -0.000394 0.005329 0.046350 -0.000000 0.998925 0.002757 -0.000394 0.005300 0.046350 -0.000000 0.998925 0.002757 0.000394 0.005300 0.046350 0.000000 0.998925 0.004801 0.000394 0.002520 -0.000000 0.999987 0.005172 0.004013 0.000394 0.002520 -0.000000 0.999987 0.005172 0.004002 0.000391 0.003100 -0.000000 0.999987 0.005172 0.004801 0.000394 0.002520 -0.000553 0.999990 0.004410 0.004002 0.000391 0.003100 -0.000553 0.999990 0.004410 0.004783 0.000391 0.003198 -0.000553 0.999990 0.004410 0.002671 0.000394 0.004518 0.000000 1.000000 0.000000 0.002132 0.000394 0.004541 0.000000 1.000000 0.000000 0.002132 0.000394 0.005329 0.000000 1.000000 0.000000 0.002757 0.000394 0.005300 0.000000 1.000000 0.000000 0.002757 -0.000394 0.005300 0.000000 -1.000000 0.000000 0.002132 -0.000394 0.005329 0.000000 -1.000000 0.000000 0.002132 -0.000394 0.004541 0.000000 -1.000000 0.000000 0.002671 -0.000394 0.004518 0.000000 -1.000000 0.000000 0.004013 -0.000394 0.002520 0.000000 -0.999990 0.004425 0.004801 -0.000394 0.002520 0.000000 -0.999990 0.004425 0.004783 -0.000391 0.003198 0.000000 -0.999990 0.004425 0.004013 -0.000394 0.002520 -0.000647 -0.999986 0.005160 0.004783 -0.000391 0.003198 -0.000647 -0.999986 0.005160 0.004002 -0.000391 0.003100 -0.000647 -0.999986 0.005160 0.000732 0.000394 0.004541 0.000000 1.000000 0.000000 0.000732 0.000394 0.005329 0.000000 1.000000 0.000000 0.002132 0.000394 0.004541 0.000000 0.000000 -1.000000 0.002132 -0.000394 0.004541 0.000000 0.000000 -1.000000 0.000732 -0.000394 0.004541 0.000000 0.000000 -1.000000 0.000732 0.000394 0.004541 0.000000 0.000000 -1.000000 0.000732 -0.000394 0.005329 0.000000 -1.000000 0.000000 0.000732 -0.000394 0.004541 0.000000 -1.000000 0.000000 0.000732 0.000394 0.005329 0.000000 -0.000000 1.000000 0.000732 -0.000394 0.005329 0.000000 -0.000000 1.000000 0.002132 -0.000394 0.005329 0.000000 -0.000000 1.000000 0.002132 0.000394 0.005329 0.000000 0.000000 1.000000 0.000732 0.000394 -0.004541 0.018962 -0.000000 0.999820 0.000152 0.000391 -0.004530 0.018962 -0.000000 0.999820 0.000152 -0.000391 -0.004530 0.018962 -0.000000 0.999820 0.000732 -0.000394 -0.004541 0.018962 0.000000 0.999820 0.000152 0.000391 -0.004530 -0.005172 0.999987 0.000000 0.000732 0.000394 -0.004541 -0.005172 0.999987 0.000000 0.000732 0.000394 -0.005329 -0.005172 0.999987 0.000000 0.000152 0.000391 -0.004530 -0.004403 0.999990 0.000558 0.000732 0.000394 -0.005329 -0.004403 0.999990 0.000558 0.000053 0.000391 -0.005311 -0.004403 0.999990 0.000558 0.000732 0.000394 -0.005329 -0.026500 0.000000 -0.999649 0.000732 -0.000394 -0.005329 -0.026500 0.000000 -0.999649 0.000053 -0.000391 -0.005311 -0.026500 0.000000 -0.999649 0.000053 0.000391 -0.005311 -0.026500 -0.000000 -0.999649 0.000053 -0.000391 -0.005311 -0.004418 -0.999990 -0.000000 0.000732 -0.000394 -0.005329 -0.004418 -0.999990 -0.000000 0.000732 -0.000394 -0.004541 -0.004418 -0.999990 -0.000000 0.000053 -0.000391 -0.005311 -0.005160 -0.999986 0.000654 0.000732 -0.000394 -0.004541 -0.005160 -0.999986 0.000654 0.000152 -0.000391 -0.004530 -0.005160 -0.999986 0.000654 0.000732 0.000394 0.004541 0.018962 0.000000 -0.999820 0.000732 -0.000394 0.004541 0.018962 0.000000 -0.999820 0.000152 -0.000391 0.004530 0.018962 0.000000 -0.999820 0.000152 0.000391 0.004530 0.018962 0.000000 -0.999820 0.000732 0.000394 0.005329 -0.026500 0.000000 0.999649 0.000053 0.000391 0.005311 -0.026500 0.000000 0.999649 0.000053 -0.000391 0.005311 -0.026500 0.000000 0.999649 0.000732 -0.000394 0.005329 -0.026500 0.000000 0.999649 0.000152 0.000391 0.004530 -0.004403 0.999990 -0.000558 0.000053 0.000391 0.005311 -0.004403 0.999990 -0.000558 0.000732 0.000394 0.005329 -0.004403 0.999990 -0.000558 0.000152 0.000391 0.004530 -0.005172 0.999987 0.000000 0.000732 0.000394 0.005329 -0.005172 0.999987 0.000000 0.000732 0.000394 0.004541 -0.005172 0.999987 0.000000 0.000053 -0.000391 0.005311 -0.005160 -0.999986 -0.000654 0.000152 -0.000391 0.004530 -0.005160 -0.999986 -0.000654 0.000732 -0.000394 0.004541 -0.005160 -0.999986 -0.000654 0.000053 -0.000391 0.005311 -0.004418 -0.999990 -0.000000 0.000732 -0.000394 0.004541 -0.004418 -0.999990 -0.000000 0.000732 -0.000394 0.005329 -0.004418 -0.999990 -0.000000 0.002671 0.000394 -0.004518 -0.042633 0.000000 0.999091 0.002132 0.000394 -0.004541 -0.042633 0.000000 0.999091 0.002132 -0.000394 -0.004541 -0.042633 0.000000 0.999091 0.002671 -0.000394 -0.004518 -0.042633 0.000000 0.999091 0.004801 0.000394 -0.002520 0.999648 0.000000 -0.026540 0.004801 -0.000394 -0.002520 0.999648 0.000000 -0.026540 0.004783 -0.000391 -0.003198 0.999648 0.000000 -0.026540 0.004783 0.000391 -0.003198 0.999648 0.000000 -0.026540 0.002132 0.000394 -0.005329 0.046350 0.000000 -0.998925 0.002757 0.000394 -0.005300 0.046350 0.000000 -0.998925 0.002757 -0.000394 -0.005300 0.046350 0.000000 -0.998925 0.002132 -0.000394 -0.005329 0.046350 0.000000 -0.998925 0.004002 0.000391 -0.003100 0.000000 0.999987 -0.005172 0.004013 0.000394 -0.002520 0.000000 0.999987 -0.005172 0.004801 0.000394 -0.002520 0.000000 0.999987 -0.005172 0.004002 0.000391 -0.003100 -0.000553 0.999990 -0.004410 0.004801 0.000394 -0.002520 -0.000553 0.999990 -0.004410 0.004783 0.000391 -0.003198 -0.000553 0.999990 -0.004410 0.002671 0.000394 -0.004518 0.000000 1.000000 -0.000000 0.002757 0.000394 -0.005300 0.000000 1.000000 -0.000000 0.002757 -0.000394 -0.005300 0.000000 -1.000000 0.000000 0.002671 -0.000394 -0.004518 0.000000 -1.000000 0.000000 0.003882 0.000000 -0.000105 -0.000000 0.986951 0.161018 0.004801 0.000394 -0.002520 -0.000000 0.986951 0.161018 0.004013 0.000394 -0.002520 -0.000000 0.986951 0.161018 0.003882 0.000000 -0.000105 -0.998532 0.000000 -0.054165 0.004013 0.000394 -0.002520 -0.998532 0.000000 -0.054165 0.004013 -0.000394 -0.002520 -0.998532 0.000000 -0.054165 0.004013 -0.000394 -0.002520 0.000000 -0.986951 0.161018 0.004801 -0.000394 -0.002520 0.000000 -0.986951 0.161018 0.003882 0.000000 -0.000105 0.000000 -0.986951 0.161018 0.004801 -0.000394 -0.002520 0.934616 0.000000 0.355657 0.004801 0.000394 -0.002520 0.934616 0.000000 0.355657 0.003882 0.000000 -0.000105 0.934616 0.000000 0.355657 0.004013 0.000394 -0.002520 -0.999820 0.000000 0.018962 0.004002 0.000391 -0.003100 -0.999820 0.000000 0.018962 0.004002 -0.000391 -0.003100 -0.999820 0.000000 0.018962 0.004013 -0.000394 -0.002520 -0.999820 0.000000 0.018962 0.004783 -0.000391 -0.003198 0.000000 -0.999990 -0.004425 0.004801 -0.000394 -0.002520 0.000000 -0.999990 -0.004425 0.004013 -0.000394 -0.002520 0.000000 -0.999990 -0.004425 0.004783 -0.000391 -0.003198 -0.000647 -0.999986 -0.005160 0.004013 -0.000394 -0.002520 -0.000647 -0.999986 -0.005160 0.004002 -0.000391 -0.003100 -0.000647 -0.999986 -0.005160 3 0 1 2 3 3 4 5 3 3 5 6 3 7 8 9 3 7 9 10 3 11 12 13 3 11 13 14 3 15 16 17 3 15 17 18 3 19 20 21 3 19 21 22 3 23 24 25 3 23 25 26 3 27 28 29 3 27 29 30 3 31 32 33 3 31 33 34 3 35 36 37 3 35 37 38 3 39 40 41 3 39 41 42 3 43 44 45 3 46 47 48 3 49 50 51 3 52 53 54 3 55 56 57 3 58 59 60 3 61 62 63 3 64 65 66 3 67 68 69 3 70 71 72 3 73 74 75 3 76 77 78 3 79 80 81 3 79 81 82 3 83 84 85 3 86 87 88 3 89 90 91 3 92 93 94 3 95 96 97 3 95 97 98 3 99 100 101 3 99 101 102 3 103 104 105 3 103 105 106 3 107 108 109 3 107 109 110 3 111 112 113 3 111 113 114 3 115 116 117 3 115 117 118 3 119 120 121 3 119 121 122 3 123 124 125 3 123 125 126 3 127 128 129 3 127 129 130 3 131 132 133 3 134 135 136 3 137 138 139 3 140 141 142 3 143 144 145 3 146 147 148 3 149 150 151 3 152 153 154 3 155 156 157 3 155 157 158 3 159 160 161 3 159 161 162 3 163 164 165 3 163 165 166 3 167 168 169 3 167 169 170 3 171 172 173 3 171 173 174 3 175 176 177 3 175 177 178 3 179 180 181 3 179 181 182 3 183 184 185 3 183 185 186 3 187 188 189 3 187 189 190 3 191 192 193 3 191 193 194 3 195 196 197 3 195 197 198 3 199 200 201 3 199 201 202 3 203 204 205 3 203 205 206 3 207 208 209 3 207 209 210 3 211 212 213 3 211 213 214 3 215 216 217 3 215 217 218 3 219 220 221 3 222 223 224 3 225 226 227 3 228 229 230 3 231 232 233 3 234 235 236 3 237 193 192 3 237 192 238 3 239 189 188 3 239 188 240 3 241 242 243 3 244 245 246 3 247 248 249 3 250 251 252 3 253 254 255 3 256 257 258 3 259 260 261 3 259 261 262 3 263 264 265 3 263 265 266 3 267 268 191 3 267 191 194 3 269 270 187 3 269 187 190 3 271 272 273 3 271 273 274 3 275 276 277 3 275 277 278 3 279 280 281 3 279 281 282 3 283 284 285 3 283 285 286 3 287 288 289 3 287 289 290 3 291 292 293 3 291 293 294 3 295 296 297 3 295 297 298 3 299 300 301 3 299 301 302 3 303 304 305 3 303 305 306 3 307 308 309 3 307 309 310 3 311 312 313 3 314 315 316 3 317 318 319 3 320 321 322 3 323 324 325 3 326 327 328 3 329 330 331 3 332 333 334 3 335 336 337 3 338 339 340 3 341 342 343 3 344 345 346 3 347 348 349 3 347 349 350 3 351 352 353 3 351 353 354 3 355 356 357 3 355 357 358 3 359 360 361 3 359 361 362 3 363 364 365 3 363 365 366 3 367 368 369 3 370 371 372 3 373 374 375 3 376 377 378 3 376 378 379 3 380 381 382 3 380 382 383 3 384 385 386 3 384 386 387 3 388 389 390 3 391 392 393 3 394 395 396 3 394 396 397 3 398 399 400 3 398 400 401 3 402 403 404 3 405 406 407 3 408 409 396 3 408 396 395 3 410 411 412 3 410 412 413 3 400 399 414 3 400 414 415 3 416 417 418 3 416 418 419 3 420 421 422 3 420 422 423 3 424 425 426 3 427 428 429 3 430 431 432 3 430 432 433 3 434 435 436 3 437 438 439 3 440 441 442 3 440 442 443 3 444 445 446 3 444 446 447 3 448 449 450 3 451 452 453 3 454 455 456 3 457 458 459 3 460 461 462 3 460 462 463 3 464 465 466 3 464 466 467 3 468 469 470 3 468 470 471 3 472 473 474 3 475 476 477 3 478 479 353 3 478 353 352 3 480 481 359 3 480 359 362 3 482 483 484 3 485 486 487 3 488 489 490 3 491 492 493 3 494 495 496 3 494 496 497 3 498 499 500 3 501 502 503 opensurgsim-0.7.0/Examples/Stapling/Data/Geometry/stapler_collision.ply000066400000000000000000000740201277777236100263750ustar00rootroot00000000000000ply format ascii 1.0 comment Created by Blender 2.69 (sub 0) - www.blender.org, source file: '' element vertex 490 property float x property float y property float z property float nx property float ny property float nz element face 176 property list uchar uint vertex_indices end_header -0.047435 0.068225 -0.013055 -0.006463 0.004409 -0.999969 -0.084014 0.069053 -0.012815 -0.006463 0.004409 -0.999969 -0.051680 0.081963 -0.012967 -0.006463 0.004409 -0.999969 -0.090172 0.076305 -0.011796 -0.633821 0.000961 -0.773479 -0.093381 0.075029 -0.009168 -0.633821 0.000961 -0.773479 -0.093242 0.208561 -0.009116 -0.633821 0.000961 -0.773479 -0.037628 0.055414 -0.005132 0.819461 0.573135 -0.000001 -0.000021 0.001644 -0.005132 0.819461 0.573135 -0.000001 -0.000021 0.001644 -0.012973 0.819461 0.573135 -0.000001 -0.096996 0.074745 -0.002479 -0.985645 -0.168814 -0.002360 -0.096686 0.072935 -0.002479 -0.985645 -0.168814 -0.002360 -0.097007 0.074745 0.002114 -0.985645 -0.168814 -0.002360 -0.095624 0.072915 0.005665 -0.944198 -0.166653 0.284106 -0.095947 0.074745 0.005665 -0.944198 -0.166653 0.284106 -0.096695 0.072931 0.002115 -0.944198 -0.166653 0.284106 -0.000021 -0.001946 -0.012973 -0.000001 0.000000 -1.000000 -0.000906 -0.002426 -0.012973 -0.000001 0.000000 -1.000000 -0.001383 -0.001003 -0.012973 -0.000001 0.000000 -1.000000 -0.053247 0.095488 -0.000274 0.999942 0.008032 0.007209 -0.053158 0.095489 -0.012618 0.999942 0.008032 0.007209 -0.053770 0.171623 -0.012553 0.999942 0.008032 0.007209 -0.096317 0.208811 0.002055 0.000680 1.000000 -0.000203 -0.095269 0.208811 0.005558 0.000680 1.000000 -0.000203 -0.092877 0.208810 0.008646 0.000680 1.000000 -0.000203 -0.000021 0.001644 0.004864 1.000000 0.000000 -0.000001 -0.000021 0.001644 0.012973 1.000000 0.000000 -0.000001 -0.000021 -0.001946 0.012973 1.000000 0.000000 -0.000001 -0.041745 0.055505 0.006777 0.019748 0.999804 0.001563 -0.041857 0.055498 0.012671 0.019748 0.999804 0.001563 -0.037628 0.055414 0.012973 0.019748 0.999804 0.001563 -0.040193 0.003943 0.002075 -0.118445 -0.992961 -0.000095 -0.040181 0.003942 -0.002438 -0.118445 -0.992961 -0.000095 -0.031077 0.002857 -0.012547 -0.118445 -0.992961 -0.000095 -0.089963 0.208561 -0.011666 -0.392806 0.001038 -0.919621 -0.087273 0.208561 -0.012815 -0.392806 0.001038 -0.919621 -0.087618 0.078007 -0.012815 -0.392806 0.001038 -0.919621 -0.000021 -0.001946 0.012973 0.000001 -0.000000 1.000000 -0.001383 -0.001003 0.012973 0.000001 -0.000000 1.000000 -0.000906 -0.002426 0.012973 0.000001 -0.000000 1.000000 -0.000021 -0.001946 -0.005132 0.476763 -0.879032 -0.000001 -0.000906 -0.002426 -0.005132 0.476763 -0.879032 -0.000001 -0.000906 -0.002426 -0.012973 0.476763 -0.879032 -0.000001 -0.002554 0.000370 -0.005132 0.843460 0.537193 -0.000001 -0.002554 0.000370 0.004864 0.843460 0.537193 -0.000001 -0.001677 -0.001007 0.004864 0.843460 0.537193 -0.000001 -0.047435 0.068225 -0.013055 -0.006462 0.004444 -0.999969 -0.042150 0.055658 -0.013145 -0.006462 0.004444 -0.999969 -0.084014 0.069053 -0.012815 -0.006462 0.004444 -0.999969 -0.041773 0.200249 0.012553 0.920621 -0.390458 -0.000001 -0.053914 0.171623 -0.000315 0.920621 -0.390458 -0.000001 -0.041773 0.200249 -0.012553 0.920621 -0.390458 -0.000001 -0.000021 0.001644 0.004864 0.819461 0.573135 -0.000001 -0.037628 0.055414 0.004864 0.819461 0.573135 -0.000001 -0.037628 0.055414 0.012973 0.819461 0.573135 -0.000001 -0.000021 -0.001946 0.004864 -0.000001 -0.000000 -1.000000 -0.000906 -0.002426 0.004864 -0.000001 -0.000000 -1.000000 -0.001677 -0.001007 0.004864 -0.000001 -0.000000 -1.000000 -0.000021 -0.001946 -0.005132 0.000001 0.000000 1.000000 -0.001677 -0.001007 -0.005132 0.000001 0.000000 1.000000 -0.000906 -0.002426 -0.005132 0.000001 0.000000 1.000000 -0.000021 -0.001946 0.012973 0.476763 -0.879032 -0.000001 -0.000906 -0.002426 0.012973 0.476763 -0.879032 -0.000001 -0.000906 -0.002426 0.004864 0.476763 -0.879032 -0.000001 -0.041745 0.055505 0.006777 0.022098 0.999756 -0.000000 -0.037628 0.055414 0.004864 0.022098 0.999756 -0.000000 -0.041745 0.055505 -0.007044 0.022098 0.999756 -0.000000 -0.031072 0.002857 0.012547 -0.115579 -0.993289 -0.004287 -0.033488 0.003143 0.011418 -0.115579 -0.993289 -0.004287 -0.036794 0.003539 0.008797 -0.115579 -0.993289 -0.004287 -0.040193 0.003943 0.002075 -0.119150 -0.992876 0.000576 -0.036794 0.003539 0.008797 -0.119150 -0.992876 0.000576 -0.039168 0.003822 0.005534 -0.119150 -0.992876 0.000576 -0.092877 0.208810 0.008646 -0.000436 0.999998 0.001671 -0.089739 0.208807 0.011257 -0.000436 0.999998 0.001671 -0.087126 0.208806 0.012545 -0.000436 0.999998 0.001671 -0.039181 0.003824 -0.005801 -0.119055 -0.992887 -0.000563 -0.036639 0.003521 -0.008986 -0.119055 -0.992887 -0.000563 -0.040181 0.003942 -0.002438 -0.119055 -0.992887 -0.000563 -0.093381 0.075029 -0.009168 -0.782036 0.001951 -0.623230 -0.095959 0.074745 -0.005934 -0.782036 0.001951 -0.623230 -0.095606 0.208561 -0.005958 -0.782036 0.001951 -0.623230 -0.090172 0.076305 -0.011796 -0.617603 -0.061639 -0.784071 -0.089830 0.072891 -0.011797 -0.617603 -0.061639 -0.784071 -0.093381 0.075029 -0.009168 -0.617603 -0.061639 -0.784071 -0.093225 0.072915 0.008919 -0.802974 -0.069129 0.591992 -0.093407 0.075029 0.008919 -0.802974 -0.069129 0.591992 -0.095624 0.072915 0.005665 -0.802974 -0.069129 0.591992 -0.092240 0.071213 0.008919 -0.728036 -0.421338 0.540775 -0.093225 0.072915 0.008919 -0.728036 -0.421338 0.540775 -0.094701 0.071289 0.005665 -0.728036 -0.421338 0.540775 -0.094701 0.071289 0.005665 -0.841292 -0.477560 0.253306 -0.095624 0.072915 0.005665 -0.841292 -0.477560 0.253306 -0.095792 0.071328 0.002115 -0.841292 -0.477560 0.253306 -0.096686 0.072935 -0.002479 -0.871226 -0.490877 -0.002170 -0.095780 0.071327 -0.002479 -0.871226 -0.490877 -0.002170 -0.095792 0.071328 0.002115 -0.871226 -0.490877 -0.002170 -0.089830 0.072891 -0.011797 -0.577254 -0.341760 -0.741605 -0.088766 0.071096 -0.011798 -0.577254 -0.341760 -0.741605 -0.092211 0.071210 -0.009169 -0.577254 -0.341760 -0.741605 -0.087259 0.072864 0.012815 -0.415129 -0.028977 0.909301 -0.087618 0.078007 0.012815 -0.415129 -0.028977 0.909301 -0.090235 0.076305 0.011566 -0.415129 -0.028977 0.909301 -0.084028 0.069070 0.012815 -0.358101 -0.304962 0.882475 -0.087259 0.072864 0.012815 -0.358101 -0.304962 0.882475 -0.088845 0.071115 0.011567 -0.358101 -0.304962 0.882475 -0.088766 0.071096 -0.011798 -0.361377 -0.213704 -0.907600 -0.089830 0.072891 -0.011797 -0.361377 -0.213704 -0.907600 -0.087252 0.072855 -0.012815 -0.361377 -0.213704 -0.907600 -0.089830 0.072891 -0.011797 -0.367478 -0.036540 -0.929314 -0.090172 0.076305 -0.011796 -0.367478 -0.036540 -0.929314 -0.087252 0.072855 -0.012815 -0.367478 -0.036540 -0.929314 -0.095647 0.072931 -0.005934 -0.769381 -0.132330 -0.624934 -0.095959 0.074745 -0.005934 -0.769381 -0.132330 -0.624934 -0.093381 0.075029 -0.009168 -0.769381 -0.132330 -0.624934 -0.094712 0.071288 -0.005934 -0.726665 -0.413532 -0.548588 -0.095647 0.072931 -0.005934 -0.726665 -0.413532 -0.548588 -0.093182 0.072891 -0.009169 -0.726665 -0.413532 -0.548588 -0.095959 0.074745 -0.005934 -0.944955 -0.162528 -0.283979 -0.095647 0.072931 -0.005934 -0.944955 -0.162528 -0.283979 -0.096686 0.072935 -0.002479 -0.944955 -0.162528 -0.283979 -0.095647 0.072931 -0.005934 -0.840521 -0.478325 -0.254419 -0.094712 0.071288 -0.005934 -0.840521 -0.478325 -0.254419 -0.095780 0.071327 -0.002479 -0.840521 -0.478325 -0.254419 -0.093225 0.072915 0.008919 -0.586744 -0.339568 0.735136 -0.092240 0.071213 0.008919 -0.586744 -0.339568 0.735136 -0.089894 0.072892 0.011567 -0.586744 -0.339568 0.735136 -0.093407 0.075029 0.008919 -0.621618 -0.053516 0.781490 -0.093225 0.072915 0.008919 -0.621618 -0.053516 0.781490 -0.089894 0.072892 0.011567 -0.621618 -0.053516 0.781490 -0.000021 0.001644 -0.005132 1.000000 0.000000 -0.000001 -0.000021 -0.001946 -0.005132 1.000000 0.000000 -0.000001 -0.000021 -0.001946 -0.012973 1.000000 0.000000 -0.000001 -0.000021 0.001644 0.004864 -0.000001 0.000000 -1.000000 -0.002554 0.000370 -0.005132 0.000001 0.000000 1.000000 -0.000021 0.001644 -0.005132 0.000001 0.000000 1.000000 -0.000021 0.001644 0.012973 0.000001 0.000000 1.000000 -0.047135 0.068208 -0.000183 0.954222 0.298299 -0.021847 -0.047435 0.068225 -0.013055 0.954222 0.298299 -0.021847 -0.051432 0.081950 -0.000232 0.954222 0.298299 -0.021847 -0.088845 0.071115 0.011567 -0.353471 -0.289821 0.889417 -0.033488 0.003143 0.011418 -0.353471 -0.289821 0.889417 -0.084028 0.069070 0.012815 -0.353471 -0.289821 0.889417 -0.087259 0.072864 0.012815 0.003594 0.000251 0.999994 -0.051441 0.082047 0.012684 0.003594 0.000251 0.999994 -0.087618 0.078007 0.012815 0.003594 0.000251 0.999994 -0.087273 0.208561 -0.012815 0.007796 -0.000021 -0.999970 -0.053770 0.171623 -0.012553 0.007796 -0.000021 -0.999970 -0.087618 0.078007 -0.012815 0.007796 -0.000021 -0.999970 -0.087126 0.208806 0.012545 0.002054 0.002056 0.999996 -0.087618 0.078007 0.012815 0.002054 0.002056 0.999996 -0.053770 0.171623 0.012553 0.002054 0.002056 0.999996 -0.089739 0.208807 0.011257 -0.432689 0.003722 0.901535 -0.090235 0.076305 0.011566 -0.432689 0.003722 0.901535 -0.087618 0.078007 0.012815 -0.432689 0.003722 0.901535 -0.087273 0.208561 -0.012815 0.005347 -0.002242 -0.999983 -0.041773 0.200249 -0.012553 0.005347 -0.002242 -0.999983 -0.053770 0.171623 -0.012553 0.005347 -0.002242 -0.999983 -0.097007 0.074745 0.002114 -0.958206 0.005057 0.286034 -0.095947 0.074745 0.005665 -0.958206 0.005057 0.286034 -0.096317 0.208811 0.002055 -0.958206 0.005057 0.286034 -0.047135 0.068208 -0.000183 0.954420 0.298450 0.003133 -0.051432 0.081950 -0.000232 0.954420 0.298450 0.003133 -0.047180 0.068216 0.012760 0.954420 0.298450 0.003133 -0.088766 0.071096 -0.011798 -0.302794 -0.245934 -0.920778 -0.084014 0.069053 -0.012815 -0.302794 -0.245934 -0.920778 -0.033735 0.003342 -0.011798 -0.302794 -0.245934 -0.920778 -0.040193 0.003943 0.002075 -0.755943 -0.622619 0.202228 -0.039168 0.003822 0.005534 -0.755943 -0.622619 0.202228 -0.094701 0.071289 0.005665 -0.755943 -0.622619 0.202228 -0.031077 0.002857 -0.012547 -0.130308 -0.991474 0.000000 -0.001677 -0.001007 -0.005132 -0.130308 -0.991474 0.000000 -0.001677 -0.001007 0.004864 -0.130308 -0.991474 0.000000 -0.095959 0.074745 -0.005934 -0.957786 0.002475 -0.287473 -0.096996 0.074745 -0.002479 -0.957786 0.002475 -0.287473 -0.095606 0.208561 -0.005958 -0.957786 0.002475 -0.287473 -0.001677 -0.001007 0.004864 -0.878223 -0.477174 0.032077 -0.000906 -0.002426 0.004864 -0.878223 -0.477174 0.032077 -0.001383 -0.001003 0.012973 -0.878223 -0.477174 0.032077 -0.001383 -0.001003 -0.012973 -0.948149 -0.317826 0.000001 -0.000906 -0.002426 -0.012973 -0.948149 -0.317826 0.000001 -0.000906 -0.002426 -0.005132 -0.948149 -0.317826 0.000001 -0.095780 0.071327 -0.002479 -0.751442 -0.620148 -0.225282 -0.094712 0.071288 -0.005934 -0.751442 -0.620148 -0.225282 -0.040181 0.003942 -0.002438 -0.751442 -0.620148 -0.225282 -0.096996 0.074745 -0.002479 -0.999984 0.005146 -0.002394 -0.097007 0.074745 0.002114 -0.999984 0.005146 -0.002394 -0.096317 0.208811 0.002055 -0.999984 0.005146 -0.002394 -0.036794 0.003539 0.008797 -0.581021 -0.474638 0.661161 -0.033488 0.003143 0.011418 -0.581021 -0.474638 0.661161 -0.088845 0.071115 0.011567 -0.581021 -0.474638 0.661161 -0.036639 0.003521 -0.008986 -0.222806 -0.960106 -0.168978 -0.033735 0.003342 -0.011798 -0.222806 -0.960106 -0.168978 -0.031077 0.002857 -0.012547 -0.222806 -0.960106 -0.168978 -0.039168 0.003822 0.005534 -0.689399 -0.565648 0.452516 -0.036794 0.003539 0.008797 -0.689399 -0.565648 0.452516 -0.092240 0.071213 0.008919 -0.689399 -0.565648 0.452516 -0.087273 0.208561 -0.012815 0.027754 0.999615 0.000074 -0.096305 0.208811 -0.002418 0.027754 0.999615 0.000074 -0.096317 0.208811 0.002055 0.027754 0.999615 0.000074 -0.093242 0.208561 -0.009116 -0.126530 0.987430 -0.094717 -0.095606 0.208561 -0.005958 -0.126530 0.987430 -0.094717 -0.096305 0.208811 -0.002418 -0.126530 0.987430 -0.094717 -0.095792 0.071328 0.002115 -0.771337 -0.636425 -0.001877 -0.095780 0.071327 -0.002479 -0.771337 -0.636425 -0.001877 -0.040193 0.003943 0.002075 -0.771337 -0.636425 -0.001877 -0.087259 0.072864 0.012815 0.003003 0.002556 0.999992 -0.084028 0.069070 0.012815 0.003003 0.002556 0.999992 -0.051441 0.082047 0.012684 0.003003 0.002556 0.999992 -0.041773 0.200249 0.012553 0.922231 -0.386502 -0.010322 -0.053770 0.171623 0.012553 0.922231 -0.386502 -0.010322 -0.053914 0.171623 -0.000315 0.922231 -0.386502 -0.010322 -0.053247 0.095488 -0.000274 0.991104 0.132897 0.007155 -0.051432 0.081950 -0.000232 0.991104 0.132897 0.007155 -0.053158 0.095489 -0.012618 0.991104 0.132897 0.007155 -0.087252 0.072855 -0.012815 -0.004198 -0.000298 -0.999991 -0.087618 0.078007 -0.012815 -0.004198 -0.000298 -0.999991 -0.051680 0.081963 -0.012967 -0.004198 -0.000298 -0.999991 -0.087273 0.208561 -0.012815 0.179756 0.983655 -0.010545 -0.087126 0.208806 0.012545 0.179756 0.983655 -0.010545 -0.041773 0.200249 -0.012553 0.179756 0.983655 -0.010545 -0.041745 0.055505 -0.007044 0.022098 0.999756 -0.000000 -0.037628 0.055414 -0.005132 0.022098 0.999756 -0.000000 -0.037628 0.055414 -0.012973 0.022098 0.999756 -0.000000 -0.047135 0.068208 -0.000183 0.920560 0.390602 -0.000001 -0.041745 0.055505 0.006777 0.920560 0.390602 -0.000001 -0.041745 0.055505 -0.007044 0.920560 0.390602 -0.000001 -0.087126 0.208806 0.012545 -0.000162 0.000069 1.000000 -0.053770 0.171623 0.012553 -0.000162 0.000069 1.000000 -0.041773 0.200249 0.012553 -0.000162 0.000069 1.000000 -0.051432 0.081950 -0.000232 0.991112 0.132854 -0.006854 -0.053247 0.095488 -0.000274 0.991112 0.132854 -0.006854 -0.053158 0.095489 0.012618 0.991112 0.132854 -0.006854 -0.033735 0.003342 -0.011798 -0.617557 -0.501590 -0.605831 -0.036639 0.003521 -0.008986 -0.617557 -0.501590 -0.605831 -0.088766 0.071096 -0.011798 -0.617557 -0.501590 -0.605831 -0.042150 0.055658 -0.013145 0.039357 0.025286 -0.998905 -0.037628 0.055414 -0.012973 0.039357 0.025286 -0.998905 -0.001383 -0.001003 -0.012973 0.039357 0.025286 -0.998905 -0.000021 0.001644 -0.012973 -0.000001 0.000000 -1.000000 -0.002554 0.000370 -0.005132 0.843342 0.537377 -0.000001 -0.037628 0.055414 -0.005132 0.843342 0.537377 -0.000001 -0.037628 0.055414 0.004864 0.843342 0.537377 -0.000001 -0.002554 0.000370 0.004864 -0.000001 0.000000 -1.000000 -0.037628 0.055414 0.004864 -0.000001 0.000000 -1.000000 -0.037628 0.055414 -0.005132 0.000001 -0.000000 1.000000 -0.047135 0.068208 -0.000183 0.919972 0.391972 0.002955 -0.047180 0.068216 0.012760 0.919972 0.391972 0.002955 -0.041745 0.055505 0.006777 0.919972 0.391972 0.002955 -0.053914 0.171623 -0.000315 0.999899 0.008754 -0.011191 -0.053770 0.171623 0.012553 0.999899 0.008754 -0.011191 -0.053247 0.095488 -0.000274 0.999899 0.008754 -0.011191 -0.095947 0.074745 0.005665 -0.788462 0.004478 0.615067 -0.093407 0.075029 0.008919 -0.788462 0.004478 0.615067 -0.095269 0.208811 0.005558 -0.788462 0.004478 0.615067 -0.053914 0.171623 -0.000315 0.922226 -0.386500 0.010850 -0.053770 0.171623 -0.012553 0.922226 -0.386500 0.010850 -0.041773 0.200249 -0.012553 0.922226 -0.386500 0.010850 -0.084028 0.069070 0.012815 0.001345 -0.006436 0.999978 -0.041857 0.055498 0.012671 0.001345 -0.006436 0.999978 -0.047180 0.068216 0.012760 0.001345 -0.006436 0.999978 -0.087273 0.208561 -0.012815 0.000000 1.000000 0.000000 -0.089963 0.208561 -0.011666 0.000000 1.000000 0.000000 -0.093242 0.208561 -0.009116 0.000000 1.000000 0.000000 -0.031072 0.002857 0.012547 -0.129001 -0.991631 0.005166 -0.001677 -0.001007 0.004864 -0.129001 -0.991631 0.005166 -0.001383 -0.001003 0.012973 -0.129001 -0.991631 0.005166 -0.031077 0.002857 -0.012547 -0.128982 -0.991633 -0.005342 -0.001383 -0.001003 -0.012973 -0.128982 -0.991633 -0.005342 -0.001677 -0.001007 -0.005132 -0.128982 -0.991633 -0.005342 -0.093407 0.075029 0.008919 -0.641676 0.004107 0.766965 -0.090235 0.076305 0.011566 -0.641676 0.004107 0.766965 -0.092877 0.208810 0.008646 -0.641676 0.004107 0.766965 -0.036639 0.003521 -0.008986 -0.674910 -0.555408 -0.485818 -0.039181 0.003824 -0.005801 -0.674910 -0.555408 -0.485818 -0.092211 0.071210 -0.009169 -0.674910 -0.555408 -0.485818 -0.084028 0.069070 0.012815 0.002845 -0.001773 0.999994 -0.031072 0.002857 0.012547 0.002845 -0.001773 0.999994 -0.041857 0.055498 0.012671 0.002845 -0.001773 0.999994 -0.001383 -0.001003 -0.012973 -0.016259 -0.014732 -0.999759 -0.031077 0.002857 -0.012547 -0.016259 -0.014732 -0.999759 -0.042150 0.055658 -0.013145 -0.016259 -0.014732 -0.999759 -0.041745 0.055505 -0.007044 0.916266 0.400029 -0.020828 -0.047435 0.068225 -0.013055 0.916266 0.400029 -0.020828 -0.047135 0.068208 -0.000183 0.916266 0.400029 -0.020828 -0.037628 0.055414 0.012973 0.000001 0.000000 1.000000 -0.084014 0.069053 -0.012815 -0.003509 -0.002988 -0.999989 -0.087252 0.072855 -0.012815 -0.003509 -0.002988 -0.999989 -0.051680 0.081963 -0.012967 -0.003509 -0.002988 -0.999989 -0.089963 0.208561 -0.011666 -0.613890 0.001746 -0.789389 -0.090172 0.076305 -0.011796 -0.613890 0.001746 -0.789389 -0.093242 0.208561 -0.009116 -0.613890 0.001746 -0.789389 -0.037628 0.055414 -0.012973 0.819461 0.573135 -0.000001 -0.096686 0.072935 -0.002479 -0.985527 -0.169508 -0.002078 -0.096695 0.072931 0.002115 -0.985527 -0.169508 -0.002078 -0.097007 0.074745 0.002114 -0.985527 -0.169508 -0.002078 -0.095947 0.074745 0.005665 -0.945488 -0.162464 0.282238 -0.097007 0.074745 0.002114 -0.945488 -0.162464 0.282238 -0.096695 0.072931 0.002115 -0.945488 -0.162464 0.282238 -0.053914 0.171623 -0.000315 0.999892 0.008766 0.011764 -0.053247 0.095488 -0.000274 0.999892 0.008766 0.011764 -0.053770 0.171623 -0.012553 0.999892 0.008766 0.011764 -0.000021 -0.001946 0.004864 1.000000 0.000000 -0.000001 -0.037628 0.055414 0.012973 0.022098 0.999756 -0.000000 -0.031072 0.002857 0.012547 -0.118257 -0.992983 0.000024 -0.040193 0.003943 0.002075 -0.118257 -0.992983 0.000024 -0.031077 0.002857 -0.012547 -0.118257 -0.992983 0.000024 -0.090172 0.076305 -0.011796 -0.371438 0.001500 -0.928457 -0.089963 0.208561 -0.011666 -0.371438 0.001500 -0.928457 -0.087618 0.078007 -0.012815 -0.371438 0.001500 -0.928457 -0.000021 -0.001946 -0.012973 0.476763 -0.879032 -0.000001 -0.001677 -0.001007 -0.005132 0.843460 0.537193 -0.000001 -0.000021 0.001644 0.012973 0.819461 0.573135 -0.000001 -0.000021 -0.001946 0.004864 0.476763 -0.879032 -0.000001 -0.037628 0.055414 0.004864 0.022098 0.999756 -0.000000 -0.040193 0.003943 0.002075 -0.118512 -0.992953 0.000248 -0.031072 0.002857 0.012547 -0.118512 -0.992953 0.000248 -0.036794 0.003539 0.008797 -0.118512 -0.992953 0.000248 -0.096317 0.208811 0.002055 0.000920 1.000000 -0.000329 -0.092877 0.208810 0.008646 0.000920 1.000000 -0.000329 -0.087126 0.208806 0.012545 0.000920 1.000000 -0.000329 -0.093242 0.208561 -0.009116 -0.800548 0.001067 -0.599268 -0.093381 0.075029 -0.009168 -0.800548 0.001067 -0.599268 -0.095606 0.208561 -0.005958 -0.800548 0.001067 -0.599268 -0.089830 0.072891 -0.011797 -0.615991 -0.056968 -0.785691 -0.093182 0.072891 -0.009169 -0.615991 -0.056968 -0.785691 -0.093381 0.075029 -0.009168 -0.615991 -0.056968 -0.785691 -0.093407 0.075029 0.008919 -0.775043 -0.136797 0.616923 -0.095947 0.074745 0.005665 -0.775043 -0.136797 0.616923 -0.095624 0.072915 0.005665 -0.775043 -0.136797 0.616923 -0.093225 0.072915 0.008919 -0.732102 -0.415579 0.539741 -0.095624 0.072915 0.005665 -0.732102 -0.415579 0.539741 -0.094701 0.071289 0.005665 -0.732102 -0.415579 0.539741 -0.095624 0.072915 0.005665 -0.843104 -0.474934 0.252218 -0.096695 0.072931 0.002115 -0.843104 -0.474934 0.252218 -0.095792 0.071328 0.002115 -0.843104 -0.474934 0.252218 -0.096695 0.072931 0.002115 -0.871270 -0.490800 -0.002134 -0.096686 0.072935 -0.002479 -0.871270 -0.490800 -0.002134 -0.095792 0.071328 0.002115 -0.871270 -0.490800 -0.002134 -0.093182 0.072891 -0.009169 -0.581186 -0.335710 -0.741297 -0.089830 0.072891 -0.011797 -0.581186 -0.335710 -0.741297 -0.092211 0.071210 -0.009169 -0.581186 -0.335710 -0.741297 -0.089894 0.072892 0.011567 -0.428024 -0.042501 0.902768 -0.087259 0.072864 0.012815 -0.428024 -0.042501 0.902768 -0.090235 0.076305 0.011566 -0.428024 -0.042501 0.902768 -0.087259 0.072864 0.012815 -0.417005 -0.246167 0.874934 -0.089894 0.072892 0.011567 -0.417005 -0.246167 0.874934 -0.088845 0.071115 0.011567 -0.417005 -0.246167 0.874934 -0.084014 0.069053 -0.012815 -0.308650 -0.262863 -0.914132 -0.088766 0.071096 -0.011798 -0.308650 -0.262863 -0.914132 -0.087252 0.072855 -0.012815 -0.308650 -0.262863 -0.914132 -0.090172 0.076305 -0.011796 -0.355878 -0.025282 -0.934190 -0.087618 0.078007 -0.012815 -0.355878 -0.025282 -0.934190 -0.087252 0.072855 -0.012815 -0.355878 -0.025282 -0.934190 -0.093182 0.072891 -0.009169 -0.793686 -0.073593 -0.603860 -0.095647 0.072931 -0.005934 -0.793686 -0.073593 -0.603860 -0.093381 0.075029 -0.009168 -0.793686 -0.073593 -0.603860 -0.092211 0.071210 -0.009169 -0.723574 -0.417958 -0.549319 -0.094712 0.071288 -0.005934 -0.723574 -0.417958 -0.549319 -0.093182 0.072891 -0.009169 -0.723574 -0.417958 -0.549319 -0.096996 0.074745 -0.002479 -0.945156 -0.161879 -0.283682 -0.095959 0.074745 -0.005934 -0.945156 -0.161879 -0.283682 -0.096686 0.072935 -0.002479 -0.945156 -0.161879 -0.283682 -0.096686 0.072935 -0.002479 -0.842901 -0.474917 -0.252928 -0.095647 0.072931 -0.005934 -0.842901 -0.474917 -0.252928 -0.095780 0.071327 -0.002479 -0.842901 -0.474917 -0.252928 -0.092240 0.071213 0.008919 -0.583538 -0.344474 0.735406 -0.088845 0.071115 0.011567 -0.583538 -0.344474 0.735406 -0.089894 0.072892 0.011567 -0.583538 -0.344474 0.735406 -0.090235 0.076305 0.011566 -0.624605 -0.062178 0.778462 -0.093407 0.075029 0.008919 -0.624605 -0.062178 0.778462 -0.089894 0.072892 0.011567 -0.624605 -0.062178 0.778462 -0.000021 0.001644 -0.012973 1.000000 0.000000 -0.000001 -0.051432 0.081950 -0.000232 0.955235 0.295282 -0.018302 -0.047435 0.068225 -0.013055 0.955235 0.295282 -0.018302 -0.051680 0.081963 -0.012967 0.955235 0.295282 -0.018302 -0.033488 0.003143 0.011418 -0.430415 -0.347611 0.833012 -0.031072 0.002857 0.012547 -0.430415 -0.347611 0.833012 -0.084028 0.069070 0.012815 -0.430415 -0.347611 0.833012 -0.051441 0.082047 0.012684 0.003031 0.005297 0.999981 -0.053158 0.095489 0.012618 0.003031 0.005297 0.999981 -0.087618 0.078007 0.012815 0.003031 0.005297 0.999981 -0.053770 0.171623 -0.012553 0.005261 0.000896 -0.999986 -0.053158 0.095489 -0.012618 0.005261 0.000896 -0.999986 -0.087618 0.078007 -0.012815 0.005261 0.000896 -0.999986 -0.087618 0.078007 0.012815 0.005263 0.000896 0.999986 -0.053158 0.095489 0.012618 0.005263 0.000896 0.999986 -0.053770 0.171623 0.012553 0.005263 0.000896 0.999986 -0.087126 0.208806 0.012545 -0.442121 0.003515 0.896948 -0.089739 0.208807 0.011257 -0.442121 0.003515 0.896948 -0.087618 0.078007 0.012815 -0.442121 0.003515 0.896948 -0.095947 0.074745 0.005665 -0.958031 0.005074 0.286618 -0.095269 0.208811 0.005558 -0.958031 0.005074 0.286618 -0.096317 0.208811 0.002055 -0.958031 0.005074 0.286618 -0.051432 0.081950 -0.000232 0.955677 0.294413 -0.001546 -0.051441 0.082047 0.012684 0.955677 0.294413 -0.001546 -0.047180 0.068216 0.012760 0.955677 0.294413 -0.001546 -0.084014 0.069053 -0.012815 -0.304325 -0.247093 -0.919963 -0.031077 0.002857 -0.012547 -0.304325 -0.247093 -0.919963 -0.033735 0.003342 -0.011798 -0.304325 -0.247093 -0.919963 -0.095792 0.071328 0.002115 -0.751639 -0.620306 0.224186 -0.040193 0.003943 0.002075 -0.751639 -0.620306 0.224186 -0.094701 0.071289 0.005665 -0.751639 -0.620306 0.224186 -0.031072 0.002857 0.012547 -0.130323 -0.991472 0.000026 -0.031077 0.002857 -0.012547 -0.130323 -0.991472 0.000026 -0.001677 -0.001007 0.004864 -0.130323 -0.991472 0.000026 -0.096996 0.074745 -0.002479 -0.980976 0.005144 -0.194062 -0.096305 0.208811 -0.002418 -0.980976 0.005144 -0.194062 -0.095606 0.208561 -0.005958 -0.980976 0.005144 -0.194062 -0.000906 -0.002426 0.004864 -0.948149 -0.317826 0.000001 -0.000906 -0.002426 0.012973 -0.948149 -0.317826 0.000001 -0.001383 -0.001003 0.012973 -0.948149 -0.317826 0.000001 -0.001677 -0.001007 -0.005132 -0.878192 -0.477157 -0.033170 -0.001383 -0.001003 -0.012973 -0.878192 -0.477157 -0.033170 -0.000906 -0.002426 -0.005132 -0.878192 -0.477157 -0.033170 -0.094712 0.071288 -0.005934 -0.755829 -0.622538 -0.202904 -0.039181 0.003824 -0.005801 -0.755829 -0.622538 -0.202904 -0.040181 0.003942 -0.002438 -0.755829 -0.622538 -0.202904 -0.096305 0.208811 -0.002418 -0.999983 0.005155 -0.002683 -0.096996 0.074745 -0.002479 -0.999983 0.005155 -0.002683 -0.096317 0.208811 0.002055 -0.999983 0.005155 -0.002683 -0.092240 0.071213 0.008919 -0.555408 -0.456306 0.695203 -0.036794 0.003539 0.008797 -0.555408 -0.456306 0.695203 -0.088845 0.071115 0.011567 -0.555408 -0.456306 0.695203 -0.040181 0.003942 -0.002438 -0.118811 -0.992917 -0.000429 -0.036639 0.003521 -0.008986 -0.118811 -0.992917 -0.000429 -0.031077 0.002857 -0.012547 -0.118811 -0.992917 -0.000429 -0.094701 0.071289 0.005665 -0.670687 -0.553011 0.494326 -0.039168 0.003822 0.005534 -0.670687 -0.553011 0.494326 -0.092240 0.071213 0.008919 -0.670687 -0.553011 0.494326 -0.087126 0.208806 0.012545 0.011646 0.999885 -0.009727 -0.087273 0.208561 -0.012815 0.011646 0.999885 -0.009727 -0.096317 0.208811 0.002055 0.011646 0.999885 -0.009727 -0.095780 0.071327 -0.002479 -0.771336 -0.636426 -0.001909 -0.040181 0.003942 -0.002438 -0.771336 -0.636426 -0.001909 -0.040193 0.003943 0.002075 -0.771336 -0.636426 -0.001909 -0.084028 0.069070 0.012815 0.001633 0.005997 0.999981 -0.047180 0.068216 0.012760 0.001633 0.005997 0.999981 -0.051441 0.082047 0.012684 0.001633 0.005997 0.999981 -0.051432 0.081950 -0.000232 0.993845 0.109095 -0.019244 -0.051680 0.081963 -0.012967 0.993845 0.109095 -0.019244 -0.053158 0.095489 -0.012618 0.993845 0.109095 -0.019244 -0.087618 0.078007 -0.012815 -0.006985 0.025030 -0.999662 -0.053158 0.095489 -0.012618 -0.006985 0.025030 -0.999662 -0.051680 0.081963 -0.012967 -0.006985 0.025030 -0.999662 -0.087126 0.208806 0.012545 0.185404 0.982662 -0.000000 -0.041773 0.200249 0.012553 0.185404 0.982662 -0.000000 -0.041773 0.200249 -0.012553 0.185404 0.982662 -0.000000 -0.042150 0.055658 -0.013145 0.053052 0.998360 0.021515 -0.041745 0.055505 -0.007044 0.053052 0.998360 0.021515 -0.037628 0.055414 -0.012973 0.053052 0.998360 0.021515 -0.051441 0.082047 0.012684 0.991941 0.126703 -0.000262 -0.051432 0.081950 -0.000232 0.991941 0.126703 -0.000262 -0.053158 0.095489 0.012618 0.991941 0.126703 -0.000262 -0.036639 0.003521 -0.008986 -0.550116 -0.453535 -0.701197 -0.092211 0.071210 -0.009169 -0.550116 -0.453535 -0.701197 -0.088766 0.071096 -0.011798 -0.550116 -0.453535 -0.701197 -0.037628 0.055414 -0.012973 -0.000001 -0.000000 -1.000000 -0.002554 0.000370 0.004864 0.843342 0.537377 -0.000001 -0.002554 0.000370 -0.005132 0.843342 0.537377 -0.000001 -0.037628 0.055414 0.004864 0.843342 0.537377 -0.000001 -0.047180 0.068216 0.012760 0.922358 0.385918 0.017984 -0.041857 0.055498 0.012671 0.922358 0.385918 0.017984 -0.041745 0.055505 0.006777 0.922358 0.385918 0.017984 -0.053770 0.171623 0.012553 0.999944 0.008032 -0.006905 -0.053158 0.095489 0.012618 0.999944 0.008032 -0.006905 -0.053247 0.095488 -0.000274 0.999944 0.008032 -0.006905 -0.093407 0.075029 0.008919 -0.790554 0.004382 0.612377 -0.092877 0.208810 0.008646 -0.790554 0.004382 0.612377 -0.095269 0.208811 0.005558 -0.790554 0.004382 0.612377 -0.096305 0.208811 -0.002418 -0.032216 0.998128 -0.051987 -0.087273 0.208561 -0.012815 -0.032216 0.998128 -0.051987 -0.093242 0.208561 -0.009116 -0.032216 0.998128 -0.051987 -0.090235 0.076305 0.011566 -0.639598 0.004187 0.768699 -0.089739 0.208807 0.011257 -0.639598 0.004187 0.768699 -0.092877 0.208810 0.008646 -0.639598 0.004187 0.768699 -0.039181 0.003824 -0.005801 -0.667065 -0.550065 -0.502447 -0.094712 0.071288 -0.005934 -0.667065 -0.550065 -0.502447 -0.092211 0.071210 -0.009169 -0.667065 -0.550065 -0.502447 -0.031072 0.002857 0.012547 -0.015053 -0.005440 0.999872 -0.001383 -0.001003 0.012973 -0.015053 -0.005440 0.999872 -0.041857 0.055498 0.012671 -0.015053 -0.005440 0.999872 -0.031077 0.002857 -0.012547 -0.012333 -0.013910 -0.999827 -0.084014 0.069053 -0.012815 -0.012333 -0.013910 -0.999827 -0.042150 0.055658 -0.013145 -0.012333 -0.013910 -0.999827 -0.042150 0.055658 -0.013145 0.920453 0.387461 -0.051386 -0.047435 0.068225 -0.013055 0.920453 0.387461 -0.051386 -0.041745 0.055505 -0.007044 0.920453 0.387461 -0.051386 -0.041857 0.055498 0.012671 -0.072067 -0.046300 0.996325 -0.001383 -0.001003 0.012973 -0.072067 -0.046300 0.996325 -0.037628 0.055414 0.012973 -0.072067 -0.046300 0.996325 3 0 1 2 3 3 4 5 3 6 7 8 3 9 10 11 3 12 13 14 3 15 16 17 3 18 19 20 3 21 22 23 3 24 25 26 3 27 28 29 3 30 31 32 3 33 34 35 3 36 37 38 3 39 40 41 3 42 43 44 3 45 46 47 3 48 49 50 3 51 52 53 3 54 55 56 3 57 58 59 3 60 61 62 3 63 64 65 3 66 67 68 3 69 70 71 3 72 73 74 3 75 76 77 3 78 79 80 3 81 82 83 3 84 85 86 3 87 88 89 3 90 91 92 3 93 94 95 3 96 97 98 3 99 100 101 3 102 103 104 3 105 106 107 3 108 109 110 3 111 112 113 3 114 115 116 3 117 118 119 3 120 121 122 3 123 124 125 3 126 127 128 3 129 130 131 3 54 56 132 3 133 58 134 3 36 135 37 3 136 137 138 3 139 140 141 3 142 143 144 3 145 146 147 3 148 149 150 3 151 152 153 3 154 155 156 3 157 158 159 3 160 161 162 3 163 164 165 3 166 167 168 3 169 170 171 3 172 173 174 3 175 176 177 3 178 179 180 3 181 182 183 3 184 185 186 3 187 188 189 3 190 191 192 3 193 194 195 3 196 197 198 3 199 200 201 3 202 203 204 3 205 206 207 3 208 209 210 3 211 212 213 3 214 215 216 3 217 218 219 3 220 221 222 3 223 224 225 3 226 227 228 3 229 230 231 3 232 233 234 3 235 236 237 3 17 238 15 3 239 240 241 3 242 243 132 3 133 134 244 3 245 246 247 3 248 249 250 3 251 252 253 3 254 255 256 3 257 258 259 3 260 261 262 3 263 264 265 3 266 267 268 3 269 270 271 3 272 273 274 3 275 276 277 3 278 279 280 3 281 282 283 3 37 135 284 3 285 286 287 3 288 289 290 3 291 6 8 3 292 293 294 3 295 296 297 3 298 299 300 3 301 24 26 3 64 63 302 3 303 304 305 3 306 307 308 3 309 39 41 3 310 42 44 3 311 51 53 3 312 60 62 3 313 221 220 3 314 315 316 3 317 318 319 3 320 321 322 3 323 324 325 3 326 327 328 3 329 330 331 3 332 333 334 3 335 336 337 3 338 339 340 3 341 342 343 3 344 345 346 3 347 348 349 3 350 351 352 3 353 354 355 3 356 357 358 3 359 360 361 3 362 363 364 3 365 366 367 3 368 369 370 3 371 129 131 3 56 242 132 3 58 57 134 3 372 373 374 3 375 376 377 3 378 379 380 3 381 382 383 3 384 385 386 3 387 388 389 3 390 391 392 3 393 394 395 3 396 397 398 3 399 400 401 3 402 403 404 3 405 406 407 3 408 409 410 3 411 412 413 3 414 415 416 3 417 418 419 3 420 421 422 3 423 424 425 3 426 427 428 3 429 430 431 3 432 433 434 3 435 436 437 3 438 439 440 3 441 442 443 3 444 445 446 3 447 448 449 3 450 451 452 3 453 454 455 3 456 238 17 3 457 458 459 3 460 461 462 3 463 464 465 3 466 467 468 3 469 470 471 3 472 473 474 3 475 476 477 3 478 479 480 3 481 482 483 3 484 485 486 3 487 488 489 opensurgsim-0.7.0/Examples/Stapling/Data/Geometry/stapler_handle.mtl000066400000000000000000000003041277777236100256170ustar00rootroot00000000000000# Blender MTL File: 'None' # Material Count: 1 newmtl _Mat.1 Ns 45.098039 Ka 0.000000 0.000000 0.000000 Kd 0.640000 0.640000 0.640000 Ks 1.000000 1.000000 1.000000 Ni 1.000000 d 1.000000 illum 2 opensurgsim-0.7.0/Examples/Stapling/Data/Geometry/stapler_handle.obj000066400000000000000000000336451277777236100256130ustar00rootroot00000000000000# Blender v2.69 (sub 0) OBJ File: '' # www.blender.org mtllib stapler_handle.mtl o stapler_handle v -0.053356 -0.007044 -0.095488 v -0.072241 -0.007044 -0.067669 v -0.051508 -0.007044 -0.081950 v -0.043540 -0.007044 -0.196716 v -0.070629 -0.007044 -0.201035 v -0.054056 -0.007044 -0.171623 v -0.047435 -0.013055 -0.068225 v -0.084014 -0.012815 -0.069053 v -0.087252 -0.012815 -0.072855 v -0.051680 -0.012967 -0.081963 v -0.090172 -0.011796 -0.076305 v -0.093381 -0.009168 -0.075029 v -0.093242 -0.009116 -0.208561 v -0.089963 -0.011666 -0.208561 v -0.051355 -0.007240 -0.081950 v -0.047093 -0.007144 -0.068200 v -0.047180 -0.012760 -0.068216 v -0.051441 -0.012684 -0.082047 v -0.037628 -0.005132 -0.055414 v -0.000021 -0.005132 -0.001644 v -0.000021 -0.012973 -0.001644 v -0.037628 -0.012973 -0.055414 v -0.096996 -0.002479 -0.074745 v -0.096686 -0.002479 -0.072935 v -0.096695 0.002115 -0.072931 v -0.097007 0.002114 -0.074745 v -0.088845 0.011567 -0.071115 v -0.033798 0.011567 -0.003349 v -0.031201 0.012815 -0.003042 v -0.084028 0.012815 -0.069070 v -0.095624 0.005665 -0.072915 v -0.095947 0.005665 -0.074745 v -0.053771 -0.007406 -0.171623 v -0.043122 -0.007406 -0.197032 v -0.002554 0.004864 -0.000370 v -0.004178 0.004864 -0.002917 v -0.037628 0.004864 -0.055414 v -0.000021 0.004864 -0.001644 v -0.000021 -0.012973 0.001946 v -0.000906 -0.012973 0.002426 v -0.001383 -0.012973 0.001003 v -0.087259 0.012815 -0.072864 v -0.051680 0.012967 -0.081963 v -0.053440 0.012890 -0.095489 v -0.087618 0.012815 -0.078007 v -0.087273 -0.012815 -0.208561 v -0.054056 -0.012815 -0.171623 v -0.053440 -0.012890 -0.095489 v -0.087618 -0.012815 -0.078007 v -0.072241 0.006777 -0.067669 v -0.041745 0.006777 -0.055505 v -0.041745 -0.007044 -0.055505 v -0.053137 -0.007324 -0.095489 v -0.053158 -0.012618 -0.095489 v -0.053770 -0.012553 -0.171623 v -0.087273 0.012815 -0.208561 v -0.054056 0.012815 -0.171623 v -0.090015 0.011440 -0.208561 v -0.090235 0.011566 -0.076305 v -0.041927 -0.012815 -0.200565 v -0.054056 0.006777 -0.171623 v -0.070629 0.006777 -0.201035 v -0.043540 0.006777 -0.196716 v -0.096317 0.002055 -0.208811 v -0.095269 0.005558 -0.208811 v -0.092877 0.008646 -0.208810 v -0.041856 -0.012671 -0.055498 v -0.095595 0.005688 -0.208561 v -0.096670 0.002095 -0.208561 v -0.047093 0.006876 -0.068200 v -0.047180 0.012760 -0.068216 v -0.041857 0.012671 -0.055498 v -0.000021 0.012973 -0.001644 v -0.000021 0.012973 0.001946 v -0.000021 0.004864 0.001946 v -0.088766 -0.011798 -0.071096 v -0.031201 -0.012815 -0.003042 v -0.033735 -0.011798 -0.003342 v -0.037628 0.012973 -0.055414 v -0.040193 0.002075 -0.003943 v -0.040181 -0.002438 -0.003942 v -0.031077 -0.012547 -0.002857 v -0.031072 0.012547 -0.002857 v -0.053771 0.007139 -0.171623 v -0.053770 0.012553 -0.171623 v -0.053158 0.012618 -0.095489 v -0.053137 0.007057 -0.095489 v -0.043122 0.007139 -0.197032 v -0.041773 0.012553 -0.200249 v -0.001383 0.012973 0.001003 v -0.000906 0.012973 0.002426 v -0.000021 -0.005132 0.001946 v -0.000906 -0.005132 0.002426 v -0.040525 0.002115 -0.004145 v -0.039473 0.005665 -0.004021 v -0.094701 0.005665 -0.071289 v -0.095792 0.002115 -0.071328 v -0.002554 -0.005132 -0.000370 v -0.001677 0.004864 0.001007 v -0.001677 -0.005132 0.001007 v -0.093407 0.008918 -0.075029 v -0.093263 0.008868 -0.208561 v -0.041773 -0.012553 -0.200249 v -0.002026 -0.005132 0.001114 v -0.002026 0.004864 0.001114 v -0.001375 -0.012892 -0.000815 v -0.001275 -0.012884 -0.000923 v -0.003867 -0.005132 0.000450 v -0.005627 -0.005132 -0.000208 v -0.005627 0.004864 -0.000208 v -0.003867 0.004864 0.000450 v -0.095959 -0.005934 -0.074745 v -0.096659 -0.002459 -0.208561 v -0.095606 -0.005958 -0.208561 v -0.041927 0.012815 -0.200565 v -0.042150 -0.013145 -0.055658 v -0.053356 0.006777 -0.095488 v -0.051508 0.006777 -0.081950 v -0.047177 0.006777 -0.068215 v -0.000906 0.004864 0.002426 v -0.001677 0.012815 0.001007 v -0.001677 -0.012815 0.001007 v -0.087130 -0.012545 -0.208807 v -0.087126 0.012545 -0.208806 v -0.042275 0.012545 -0.200876 v -0.042275 -0.012545 -0.200876 v -0.010136 0.004864 -0.005870 v -0.009023 0.004864 -0.008214 v -0.004513 0.004864 -0.002552 v -0.042150 0.013145 -0.055658 v -0.047435 0.013055 -0.068225 v -0.095780 -0.002479 -0.071327 v -0.094712 -0.005934 -0.071288 v -0.039484 -0.005934 -0.004022 v -0.040513 -0.002479 -0.004144 v -0.089621 -0.011472 -0.208807 v -0.092935 -0.008969 -0.208809 v -0.096305 -0.002418 -0.208811 v -0.002026 0.012722 0.001114 v -0.002026 -0.012722 0.001114 v -0.002179 0.012874 0.001090 v -0.009023 -0.005132 -0.008214 v -0.004513 -0.005132 -0.002552 v -0.002179 -0.012874 0.001090 v -0.037089 0.008919 -0.003739 v -0.092240 0.008919 -0.071213 v -0.002010 -0.013145 0.000955 v -0.002010 0.013145 0.000955 v -0.033488 0.011418 -0.003143 v -0.036794 0.008797 -0.003539 v -0.039168 0.005534 -0.003822 v -0.089739 0.011257 -0.208807 v -0.037064 -0.009169 -0.003735 v -0.092211 -0.009169 -0.071210 v -0.039181 -0.005801 -0.003824 v -0.036639 -0.008986 -0.003521 v -0.033586 -0.011444 -0.003155 v -0.095282 -0.005826 -0.208811 v -0.047177 -0.007044 -0.068215 v -0.051355 0.006973 -0.081950 v -0.051441 0.012684 -0.082047 v -0.089830 -0.011797 -0.072891 v -0.093182 -0.009169 -0.072891 v -0.093225 0.008919 -0.072915 v -0.089894 0.011567 -0.072892 v -0.095647 -0.005934 -0.072931 v -0.038934 -0.012891 -0.054405 v -0.039462 -0.012853 -0.054407 v -0.001134 -0.012894 -0.001236 v -0.004178 -0.005132 -0.002917 v -0.010136 -0.005132 -0.005870 v -0.001138 0.012889 -0.001234 v -0.001275 0.012878 -0.000923 v -0.038933 0.012910 -0.054405 v -0.039461 0.012873 -0.054406 v -0.001375 0.012891 -0.000727 v -0.001111 -0.012277 -0.001252 v -0.001352 -0.012275 -0.000831 v -0.039439 -0.012236 -0.054423 v -0.038911 -0.012273 -0.054421 v -0.038914 0.012293 -0.054419 v -0.039442 0.012255 -0.054420 v -0.001356 0.012273 -0.000741 v -0.001119 0.012271 -0.001248 vt 0.000000 0.562083 vt 0.000000 0.781042 vt 0.000000 0.439738 vt 1.000000 0.866987 vt 1.000000 0.433493 vt 1.000000 0.000000 vt 0.921613 0.481195 vt 0.817866 0.000000 vt 0.000000 0.000000 vt 1.000000 1.000000 vt 0.000000 1.000000 vt 0.494783 0.000000 vt 0.494783 1.000000 vt 0.678493 0.494783 vt 0.679494 0.493006 vt 0.957235 0.494783 vt 0.245385 0.493650 vt 0.182134 0.000000 vt 0.325801 0.000000 vt 0.321507 1.000000 vt 0.321507 0.000000 vt 0.674199 0.000000 vt 0.495038 1.000000 vt 0.326114 0.494343 vt 0.326113 0.000437 vt 0.678177 0.000443 vt 0.678177 0.494339 vt 0.678493 1.000000 vt 0.325801 1.000000 vt 0.678493 0.000000 vt 0.678493 0.505217 vt 0.325801 0.505217 vt 0.182136 1.000000 vt 0.042765 0.000000 vt 0.000000 0.433493 vt 0.000000 0.866987 vt 0.747519 0.078780 vt 0.690647 0.020652 vt 0.997464 0.000268 vt 0.495038 0.000000 vt 0.183352 0.496682 vt 0.183351 0.998140 vt 0.002269 0.996481 vt 0.002321 0.498382 vt 0.675627 0.940242 vt 0.504884 0.994241 vt 0.497999 0.816695 vt 0.994331 0.841597 vt 0.678167 0.495250 vt 0.678167 0.999532 vt 0.326123 0.999539 vt 0.326125 0.495246 vt 0.953820 0.993809 vt 0.679526 0.998128 vt 0.679521 0.496646 vt 0.495038 0.953013 vt 1.000000 0.953013 vt 0.504962 0.866987 vt 0.499219 0.998487 vt 0.005678 0.998504 vt 0.499073 0.808825 vt 0.500029 0.008182 vt 0.994966 0.008253 vt 0.995946 0.833742 vt 1.000000 0.500000 vt 0.817864 1.000000 vt 0.957235 0.000000 vt 0.679499 0.001786 vt 0.953827 0.006050 vt 1.000000 0.562083 vt 0.497895 0.164692 vt 0.997109 0.164751 vt 0.995625 0.992722 vt 0.499413 0.992722 vt 0.162901 1.000000 vt 0.002696 0.158197 vt 0.015534 0.149902 vt 0.009494 0.006135 vt 0.489086 0.001282 vt 0.747391 0.914004 vt 0.500814 0.007325 vt 0.991045 0.010874 vt 0.247391 0.914199 vt 0.008801 0.010914 vt 0.488745 0.007487 vt 0.574360 0.998721 vt 1.000000 0.011644 vt 1.000000 0.006206 vt 1.000000 0.995065 vt 0.617511 0.001687 vt 0.000000 0.926841 vt 0.504962 0.000000 vt 0.504962 0.926837 vt 0.000000 0.997615 vt 0.000000 0.993794 vt 0.000000 0.023289 vt 0.333333 0.000000 vt 1.000000 0.005061 vt 1.000000 0.996164 vt 0.333333 1.000000 vt 0.995199 0.837799 vt 0.974701 0.080157 vt 0.646390 0.979032 vt 0.471913 0.995548 vt 0.736652 0.755759 vt 0.642611 0.359030 vt 0.809815 0.342694 vt 0.036877 0.021387 vt 0.936231 0.036984 vt 0.989220 0.162745 vt 0.007663 0.989118 vt 0.471828 0.694838 vt 0.416059 0.585638 vt 0.987395 0.504650 vt 0.018795 0.399015 vt 0.917102 0.061532 vt 0.005416 0.834443 vt 0.004017 0.992877 vt 0.501629 0.162899 vt 0.992725 0.019015 vt 0.992458 0.959969 vt 0.997835 0.162857 vt 0.005204 0.003469 vt 0.558785 0.294143 vt 0.500000 0.984423 vt 0.676200 0.942811 vt 1.000000 0.840593 vt 0.636293 1.000000 vt 0.735359 0.764641 vt 0.641124 0.358876 vt 0.415485 0.584515 vt 0.000000 0.386197 vt 0.000000 0.840593 vt 0.747519 0.079970 vt 0.495038 0.159940 vt 1.000000 0.159941 vt 0.000000 0.159939 vt 0.500000 1.000000 vt 0.183353 0.001806 vt 0.002261 0.003434 vt 0.183043 0.494010 vt 0.001158 0.493024 vt 0.182847 0.493709 vt 0.325801 0.494783 vt 0.183044 0.495574 vt 0.182842 0.495890 vt 0.001160 0.496582 vt 0.504962 1.000000 vt 0.957235 1.000000 vt 1.000000 0.439738 vt 1.000000 0.781042 vt 0.183356 0.492936 vt 0.002316 0.491266 vt 0.182134 1.000000 vt 0.837099 1.000000 usemtl _Mat.1 s 1 f 1/1 2/2 3/3 f 4/4 5/5 6/6 f 7/6 8/6 9/7 10/8 f 11/9 12/6 13/10 14/11 f 2/11 1/11 6/9 5/9 f 15/9 16/6 17/10 18/11 f 19/12 20/12 21/9 22/9 f 23/9 24/6 25/10 26/11 f 27/13 28/13 29/10 30/10 f 31/9 32/6 26/10 25/11 f 6/14 33/15 34/16 4/16 f 35/12 36/12 37/12 38/12 f 39/9 40/9 41/9 f 42/17 43/18 44/19 45/19 f 46/20 47/21 48/22 49/22 f 2/23 50/10 51/10 52/23 f 53/24 54/25 55/26 33/27 f 56/28 45/29 44/19 57/30 f 58/31 59/32 45/19 56/30 f 46/33 60/34 47/21 f 61/9 62/35 63/36 f 64/37 65/38 66/39 f 52/12 19/12 22/9 67/9 f 26/40 32/6 68/10 69/23 f 70/41 71/42 72/43 51/44 f 38/12 73/6 74/6 75/12 f 76/13 8/11 77/11 78/13 f 51/12 72/6 79/6 37/12 f 80/45 81/46 82/47 83/48 f 84/49 85/50 86/51 87/52 f 14/31 46/28 49/29 11/32 f 88/16 89/53 85/54 84/55 f 74/6 90/6 91/6 f 92/12 93/12 40/9 39/9 f 94/40 95/6 96/10 97/23 f 98/56 35/57 99/10 100/23 f 32/9 101/6 102/10 68/11 f 88/36 34/58 103/59 89/60 f 4/58 63/36 62/36 5/58 f 82/61 104/62 105/63 83/64 f 41/9 106/9 107/65 39/11 f 108/9 109/6 110/10 111/11 f 112/9 23/40 113/23 114/11 f 56/66 57/30 115/67 f 7/6 116/6 8/6 f 117/10 50/10 62/6 61/6 f 34/16 33/15 55/68 103/69 f 118/10 119/70 50/10 f 99/12 120/12 91/6 121/6 f 38/12 37/12 79/6 73/6 f 122/9 40/9 93/12 100/12 f 123/71 124/72 125/73 126/74 f 110/9 127/6 128/10 129/11 f 30/75 130/9 131/11 f 132/23 133/11 134/9 135/40 f 5/40 62/6 50/10 2/23 f 123/76 136/77 137/78 138/79 f 75/12 120/12 99/12 f 83/80 105/81 139/82 f 82/83 140/84 104/85 f 92/12 100/12 93/12 f 74/6 91/6 120/12 75/12 f 72/86 121/9 90/6 f 101/9 59/6 58/10 102/11 f 139/87 141/88 83/89 f 67/90 41/10 122/11 f 129/9 128/6 142/10 143/11 f 51/91 37/9 19/92 52/93 f 60/67 103/69 55/68 47/30 f 23/9 26/6 69/10 113/11 f 82/94 144/95 140/96 f 145/9 28/6 27/10 146/11 f 116/97 67/98 122/10 147/11 f 148/9 121/6 72/99 130/100 f 91/6 90/6 121/6 f 122/9 41/9 40/9 f 83/101 149/102 150/103 80/104 f 80/105 150/106 151/107 f 66/108 152/109 124/110 64/111 f 78/9 153/6 154/10 76/11 f 155/112 156/113 81/114 f 156/115 157/116 82/117 81/118 f 95/9 145/6 146/10 96/11 f 123/119 138/120 64/121 124/122 f 153/9 134/6 133/10 154/11 f 137/123 158/124 138/125 f 97/9 132/6 135/10 94/11 f 12/9 112/6 114/10 13/11 f 135/23 81/46 80/45 94/126 f 99/6 105/63 104/62 100/40 f 121/6 139/82 105/81 99/12 f 100/12 104/85 140/84 122/9 f 148/6 141/88 139/87 121/6 f 29/10 83/89 141/88 148/6 f 147/11 144/95 82/94 77/11 f 122/9 140/96 144/95 147/11 f 28/6 149/102 83/101 29/127 f 145/128 150/103 149/102 28/6 f 94/129 80/105 151/107 95/6 f 95/6 151/107 150/106 145/130 f 134/11 155/112 81/114 135/65 f 153/131 156/113 155/112 134/11 f 78/6 157/116 156/115 153/132 f 77/133 82/117 157/116 78/6 f 68/40 65/38 64/37 69/134 f 102/6 66/39 65/38 68/40 f 46/135 123/71 126/74 60/23 f 115/10 125/73 124/72 56/136 f 60/23 126/74 125/73 115/10 f 14/137 136/77 123/76 46/137 f 13/9 137/78 136/77 14/137 f 58/6 152/109 66/108 102/9 f 56/136 124/110 152/109 58/6 f 69/10 64/121 138/120 113/6 f 114/6 158/124 137/123 13/9 f 113/138 138/125 158/124 114/6 f 7/18 17/139 67/140 116/9 f 159/141 52/142 16/143 f 4/58 34/58 88/36 63/36 f 1/144 53/24 33/27 6/14 f 47/30 55/26 54/25 48/19 f 119/145 70/146 51/147 f 160/9 87/6 86/10 161/11 f 115/11 89/60 103/59 60/148 f 61/14 84/49 87/52 117/144 f 44/29 86/51 85/50 57/28 f 63/16 88/16 84/55 61/14 f 57/28 85/54 89/53 115/149 f 11/9 162/6 163/10 12/11 f 164/9 101/6 32/10 31/11 f 30/9 29/10 148/6 130/6 f 1/9 3/6 15/10 53/11 f 147/9 77/11 8/10 116/9 f 146/9 164/6 31/10 96/11 f 118/9 117/6 87/10 160/11 f 96/9 31/6 25/10 97/11 f 24/9 132/6 97/10 25/11 f 162/9 76/6 154/10 163/11 f 42/9 45/6 59/10 165/11 f 30/9 42/6 165/10 27/11 f 76/9 162/6 9/10 8/11 f 162/9 11/6 49/10 9/11 f 166/9 112/6 12/10 163/11 f 133/9 166/6 163/10 154/11 f 112/9 166/6 24/10 23/11 f 166/9 133/6 132/10 24/11 f 164/9 146/6 27/10 165/11 f 101/9 164/6 165/10 59/11 f 159/9 3/9 2/11 f 54/9 18/6 10/10 48/11 f 42/17 30/75 131/9 43/18 f 117/150 118/70 50/151 f 16/152 52/153 67/140 17/139 f 43/9 131/6 71/10 161/11 f 70/9 160/6 161/10 71/11 f 18/9 17/6 7/10 10/11 f 53/9 15/6 18/10 54/11 f 44/9 43/6 161/10 86/11 f 131/154 130/11 72/43 71/42 f 3/9 159/6 16/10 15/11 f 119/9 118/6 160/10 70/11 f 159/6 2/11 52/11 f 119/6 51/10 50/10 f 9/7 49/155 48/10 10/11 f 20/12 92/12 39/9 21/9 f 22/9 167/9 168/65 67/11 f 21/9 169/6 167/10 22/11 f 67/9 168/6 106/10 41/11 f 75/12 99/12 35/10 38/12 f 98/12 20/12 19/12 170/12 f 170/56 19/40 37/6 36/57 f 98/9 100/12 92/12 20/12 f 98/9 108/6 111/10 35/11 f 109/9 98/11 170/9 143/11 f 36/9 129/6 143/10 170/11 f 110/9 129/6 36/11 35/9 f 109/6 108/10 98/11 f 35/9 111/6 110/11 f 171/9 142/6 128/10 127/11 f 109/6 171/6 127/10 110/11 f 143/9 142/6 171/6 109/6 f 73/9 172/9 173/65 74/11 f 79/9 174/6 172/10 73/11 f 72/9 175/9 174/65 79/11 f 90/9 176/6 175/10 72/11 f 74/9 173/9 176/65 90/11 f 39/9 107/9 169/65 21/11 f 177/9 178/6 179/10 180/11 f 181/9 182/6 183/10 184/11 f 107/6 106/10 169/11 f 176/6 173/10 172/11 f 169/9 177/9 180/11 167/11 f 106/6 178/6 177/9 169/9 f 168/10 179/10 178/6 106/6 f 167/11 180/11 179/10 168/10 f 174/9 181/9 184/11 172/11 f 175/6 182/6 181/9 174/9 f 176/10 183/10 182/6 175/6 f 172/11 184/11 183/10 176/10 opensurgsim-0.7.0/Examples/Stapling/Data/Geometry/stapler_indicator.mtl000066400000000000000000000003021277777236100263360ustar00rootroot00000000000000# Blender MTL File: 'None' # Material Count: 1 newmtl _Mat Ns 45.098039 Ka 0.000000 0.000000 0.000000 Kd 0.000000 0.384000 0.640000 Ks 1.000000 1.000000 1.000000 Ni 1.000000 d 1.000000 illum 2 opensurgsim-0.7.0/Examples/Stapling/Data/Geometry/stapler_indicator.obj000066400000000000000000000014351277777236100263240ustar00rootroot00000000000000# Blender v2.69 (sub 0) OBJ File: '' # www.blender.org mtllib stapler_indicator.mtl o stapler_indicator v -0.028416 -0.013046 -0.036842 v -0.026082 -0.013046 -0.038503 v -0.027742 -0.013046 -0.040837 v -0.028416 -0.013615 -0.036842 v -0.026082 -0.013615 -0.038503 v -0.027742 -0.013615 -0.040837 v -0.028416 0.013547 -0.036842 v -0.026082 0.013547 -0.038503 v -0.027742 0.013547 -0.040837 v -0.028416 0.012978 -0.036842 v -0.026082 0.012978 -0.038503 v -0.027742 0.012978 -0.040837 vt 1.000000 0.000000 vt 1.000000 1.000000 vt 0.000000 0.500000 vt 0.000000 1.000000 vt 0.000000 0.000000 vt 1.000000 0.500000 usemtl _Mat s 1 f 1/1 2/2 3/3 f 2/4 1/5 4/1 5/2 f 6/6 5/4 4/5 f 4/1 1/2 3/4 6/5 f 2/1 5/2 6/4 3/5 f 7/1 8/2 9/3 f 10/1 11/2 8/4 7/5 f 12/6 11/4 10/5 f 10/1 7/2 9/4 12/5 f 8/1 11/2 12/4 9/5 opensurgsim-0.7.0/Examples/Stapling/Data/Geometry/stapler_markings.mtl000066400000000000000000000003061277777236100262010ustar00rootroot00000000000000# Blender MTL File: 'None' # Material Count: 1 newmtl _Mat.002 Ns 45.098039 Ka 0.000000 0.000000 0.000000 Kd 0.000000 0.384000 0.640000 Ks 1.000000 1.000000 1.000000 Ni 1.000000 d 1.000000 illum 2 opensurgsim-0.7.0/Examples/Stapling/Data/Geometry/stapler_markings.obj000066400000000000000000007127131277777236100261730ustar00rootroot00000000000000# Blender v2.69 (sub 0) OBJ File: '' # www.blender.org mtllib stapler_markings.mtl o stapler_markings v -0.026458 0.013011 -0.025189 v -0.026356 0.013011 -0.025390 v -0.021093 0.013011 -0.025268 v -0.021098 0.013011 -0.025065 v -0.026356 0.013214 -0.025390 v -0.021093 0.013214 -0.025268 v -0.026458 0.013214 -0.025189 v -0.021098 0.013214 -0.025065 v -0.029057 0.013011 -0.028617 v -0.028896 0.013011 -0.028740 v -0.028896 0.013214 -0.028740 v -0.029057 0.013214 -0.028617 v -0.021093 0.013011 -0.025268 v -0.021093 0.013214 -0.025268 v -0.021098 0.013214 -0.025065 v -0.021098 0.013011 -0.025065 v -0.028896 0.013214 -0.028740 v -0.028896 0.013011 -0.028740 v -0.029057 0.013011 -0.028617 v -0.029057 0.013214 -0.028617 v -0.024182 0.013232 -0.027209 v -0.024182 0.013002 -0.027209 v -0.023909 0.013002 -0.027409 v -0.023909 0.013232 -0.027409 v -0.024183 0.013232 -0.027308 v -0.024183 0.013002 -0.027308 v -0.024193 0.013232 -0.027404 v -0.024193 0.013002 -0.027404 v -0.024211 0.013232 -0.027497 v -0.024211 0.013002 -0.027497 v -0.024238 0.013232 -0.027587 v -0.024238 0.013002 -0.027587 v -0.024273 0.013232 -0.027675 v -0.024273 0.013002 -0.027675 v -0.024317 0.013232 -0.027759 v -0.024317 0.013002 -0.027759 v -0.024347 0.013232 -0.027807 v -0.024347 0.013002 -0.027807 v -0.024379 0.013232 -0.027853 v -0.024379 0.013002 -0.027853 v -0.024441 0.013232 -0.027930 v -0.024441 0.013002 -0.027930 v -0.024499 0.013232 -0.027990 v -0.024499 0.013002 -0.027990 v -0.024552 0.013232 -0.028034 v -0.024552 0.013002 -0.028034 v -0.024599 0.013232 -0.028066 v -0.024599 0.013002 -0.028066 v -0.024647 0.013232 -0.028094 v -0.024647 0.013002 -0.028094 v -0.024697 0.013232 -0.028116 v -0.024697 0.013002 -0.028116 v -0.024731 0.013232 -0.028128 v -0.024731 0.013002 -0.028128 v -0.024765 0.013232 -0.028138 v -0.024765 0.013002 -0.028138 v -0.024817 0.013232 -0.028148 v -0.024817 0.013002 -0.028148 v -0.024860 0.013232 -0.028152 v -0.024860 0.013002 -0.028152 v -0.024902 0.013232 -0.028152 v -0.024902 0.013002 -0.028152 v -0.024944 0.013232 -0.028148 v -0.024944 0.013002 -0.028148 v -0.024985 0.013232 -0.028140 v -0.024985 0.013002 -0.028140 v -0.025026 0.013232 -0.028128 v -0.025026 0.013002 -0.028128 v -0.025067 0.013232 -0.028112 v -0.025067 0.013002 -0.028112 v -0.025115 0.013232 -0.028088 v -0.025115 0.013002 -0.028088 v -0.025147 0.013232 -0.028069 v -0.025147 0.013002 -0.028069 v -0.025178 0.013232 -0.028047 v -0.025178 0.013002 -0.028047 v -0.025227 0.013232 -0.028008 v -0.025227 0.013002 -0.028008 v -0.025270 0.013232 -0.027967 v -0.025270 0.013002 -0.027967 v -0.025306 0.013232 -0.027923 v -0.025306 0.013002 -0.027923 v -0.025336 0.013232 -0.027878 v -0.025336 0.013002 -0.027878 v -0.025359 0.013232 -0.027830 v -0.025359 0.013002 -0.027830 v -0.025376 0.013232 -0.027780 v -0.025376 0.013002 -0.027780 v -0.025387 0.013232 -0.027728 v -0.025387 0.013002 -0.027728 v -0.025391 0.013232 -0.027674 v -0.025391 0.013002 -0.027674 v -0.025389 0.013232 -0.027617 v -0.025389 0.013002 -0.027617 v -0.025380 0.013232 -0.027559 v -0.025380 0.013002 -0.027559 v -0.025366 0.013232 -0.027498 v -0.025366 0.013002 -0.027498 v -0.025336 0.013232 -0.027414 v -0.025336 0.013002 -0.027414 v -0.025295 0.013232 -0.027326 v -0.025295 0.013002 -0.027326 v -0.025242 0.013232 -0.027234 v -0.025242 0.013002 -0.027234 v -0.025161 0.013232 -0.027114 v -0.025161 0.013002 -0.027114 v -0.025026 0.013232 -0.026930 v -0.025026 0.013002 -0.026930 v -0.025241 0.013232 -0.026773 v -0.025241 0.013002 -0.026773 v -0.025369 0.013232 -0.026947 v -0.025369 0.013002 -0.026947 v -0.025465 0.013232 -0.027067 v -0.025465 0.013002 -0.027067 v -0.025546 0.013232 -0.027147 v -0.025546 0.013002 -0.027147 v -0.025610 0.013232 -0.027200 v -0.025610 0.013002 -0.027200 v -0.025659 0.013232 -0.027232 v -0.025659 0.013002 -0.027232 v -0.025707 0.013232 -0.027258 v -0.025707 0.013002 -0.027258 v -0.025756 0.013232 -0.027278 v -0.025756 0.013002 -0.027278 v -0.025804 0.013232 -0.027292 v -0.025804 0.013002 -0.027292 v -0.025853 0.013232 -0.027300 v -0.025853 0.013002 -0.027300 v -0.025901 0.013232 -0.027302 v -0.025901 0.013002 -0.027302 v -0.025950 0.013232 -0.027298 v -0.025950 0.013002 -0.027298 v -0.025999 0.013232 -0.027287 v -0.025999 0.013002 -0.027287 v -0.026048 0.013232 -0.027271 v -0.026048 0.013002 -0.027271 v -0.026096 0.013232 -0.027248 v -0.026096 0.013002 -0.027248 v -0.026129 0.013232 -0.027230 v -0.026129 0.013002 -0.027230 v -0.026178 0.013232 -0.027197 v -0.026178 0.013002 -0.027197 v -0.026234 0.013232 -0.027152 v -0.026234 0.013002 -0.027152 v -0.026281 0.013232 -0.027105 v -0.026281 0.013002 -0.027105 v -0.026311 0.013232 -0.027068 v -0.026311 0.013002 -0.027068 v -0.026335 0.013232 -0.027031 v -0.026335 0.013002 -0.027031 v -0.026355 0.013232 -0.026993 v -0.026355 0.013002 -0.026993 v -0.026370 0.013232 -0.026953 v -0.026370 0.013002 -0.026953 v -0.026380 0.013232 -0.026913 v -0.026380 0.013002 -0.026913 v -0.026385 0.013232 -0.026871 v -0.026385 0.013002 -0.026871 v -0.026385 0.013232 -0.026829 v -0.026385 0.013002 -0.026829 v -0.026380 0.013232 -0.026785 v -0.026380 0.013002 -0.026785 v -0.026371 0.013232 -0.026741 v -0.026371 0.013002 -0.026741 v -0.026356 0.013232 -0.026695 v -0.026356 0.013002 -0.026695 v -0.026329 0.013232 -0.026633 v -0.026329 0.013002 -0.026633 v -0.026293 0.013232 -0.026568 v -0.026293 0.013002 -0.026568 v -0.026248 0.013232 -0.026502 v -0.026248 0.013002 -0.026502 v -0.026198 0.013232 -0.026440 v -0.026198 0.013002 -0.026440 v -0.026142 0.013232 -0.026383 v -0.026142 0.013002 -0.026383 v -0.026080 0.013232 -0.026332 v -0.026080 0.013002 -0.026332 v -0.026013 0.013232 -0.026286 v -0.026013 0.013002 -0.026286 v -0.025941 0.013232 -0.026246 v -0.025941 0.013002 -0.026246 v -0.025863 0.013232 -0.026211 v -0.025863 0.013002 -0.026211 v -0.025767 0.013232 -0.026179 v -0.025767 0.013002 -0.026179 v -0.026014 0.013232 -0.025998 v -0.026014 0.013002 -0.025998 v -0.026103 0.013232 -0.026041 v -0.026103 0.013002 -0.026041 v -0.026188 0.013232 -0.026092 v -0.026188 0.013002 -0.026092 v -0.026269 0.013232 -0.026153 v -0.026269 0.013002 -0.026153 v -0.026356 0.013232 -0.026231 v -0.026356 0.013002 -0.026231 v -0.026430 0.013232 -0.026310 v -0.026430 0.013002 -0.026310 v -0.026509 0.013232 -0.026409 v -0.026509 0.013002 -0.026409 v -0.026569 0.013232 -0.026498 v -0.026569 0.013002 -0.026498 v -0.026611 0.013232 -0.026576 v -0.026611 0.013002 -0.026576 v -0.026645 0.013232 -0.026654 v -0.026645 0.013002 -0.026654 v -0.026666 0.013232 -0.026721 v -0.026666 0.013002 -0.026721 v -0.026681 0.013232 -0.026787 v -0.026681 0.013002 -0.026787 v -0.026689 0.013232 -0.026853 v -0.026689 0.013002 -0.026853 v -0.026691 0.013232 -0.026909 v -0.026691 0.013002 -0.026909 v -0.026688 0.013232 -0.026964 v -0.026688 0.013002 -0.026964 v -0.026679 0.013232 -0.027029 v -0.026679 0.013002 -0.027029 v -0.026664 0.013232 -0.027091 v -0.026664 0.013002 -0.027091 v -0.026647 0.013232 -0.027140 v -0.026647 0.013002 -0.027140 v -0.026626 0.013232 -0.027186 v -0.026626 0.013002 -0.027186 v -0.026601 0.013232 -0.027231 v -0.026601 0.013002 -0.027231 v -0.026571 0.013232 -0.027274 v -0.026571 0.013002 -0.027274 v -0.026530 0.013232 -0.027322 v -0.026530 0.013002 -0.027322 v -0.026484 0.013232 -0.027368 v -0.026484 0.013002 -0.027368 v -0.026431 0.013232 -0.027410 v -0.026431 0.013002 -0.027410 v -0.026344 0.013232 -0.027467 v -0.026344 0.013002 -0.027467 v -0.026273 0.013232 -0.027503 v -0.026273 0.013002 -0.027503 v -0.026203 0.013232 -0.027531 v -0.026203 0.013002 -0.027531 v -0.026132 0.013232 -0.027550 v -0.026132 0.013002 -0.027550 v -0.026079 0.013232 -0.027558 v -0.026079 0.013002 -0.027558 v -0.026026 0.013232 -0.027562 v -0.026026 0.013002 -0.027562 v -0.025973 0.013232 -0.027561 v -0.025973 0.013002 -0.027561 v -0.025920 0.013232 -0.027555 v -0.025920 0.013002 -0.027555 v -0.025848 0.013232 -0.027539 v -0.025848 0.013002 -0.027539 v -0.025777 0.013232 -0.027515 v -0.025777 0.013002 -0.027515 v -0.025705 0.013232 -0.027482 v -0.025705 0.013002 -0.027482 v -0.025633 0.013232 -0.027441 v -0.025633 0.013002 -0.027441 v -0.025543 0.013232 -0.027377 v -0.025543 0.013002 -0.027377 v -0.025537 0.013232 -0.027381 v -0.025537 0.013002 -0.027381 v -0.025581 0.013232 -0.027463 v -0.025581 0.013002 -0.027463 v -0.025611 0.013232 -0.027534 v -0.025611 0.013002 -0.027534 v -0.025634 0.013232 -0.027605 v -0.025634 0.013002 -0.027605 v -0.025649 0.013232 -0.027675 v -0.025649 0.013002 -0.027675 v -0.025656 0.013232 -0.027735 v -0.025656 0.013002 -0.027735 v -0.025657 0.013232 -0.027795 v -0.025657 0.013002 -0.027795 v -0.025655 0.013232 -0.027835 v -0.025655 0.013002 -0.027835 v -0.025649 0.013232 -0.027885 v -0.025649 0.013002 -0.027885 v -0.025636 0.013232 -0.027943 v -0.025636 0.013002 -0.027943 v -0.025619 0.013232 -0.027998 v -0.025619 0.013002 -0.027998 v -0.025596 0.013232 -0.028051 v -0.025596 0.013002 -0.028051 v -0.025569 0.013232 -0.028101 v -0.025569 0.013002 -0.028101 v -0.025536 0.013232 -0.028149 v -0.025536 0.013002 -0.028149 v -0.025499 0.013232 -0.028194 v -0.025499 0.013002 -0.028194 v -0.025456 0.013232 -0.028237 v -0.025456 0.013002 -0.028237 v -0.025425 0.013232 -0.028264 v -0.025425 0.013002 -0.028264 v -0.025391 0.013232 -0.028290 v -0.025391 0.013002 -0.028290 v -0.025319 0.013232 -0.028338 v -0.025319 0.013002 -0.028338 v -0.025246 0.013232 -0.028378 v -0.025246 0.013002 -0.028378 v -0.025172 0.013232 -0.028408 v -0.025172 0.013002 -0.028408 v -0.025108 0.013232 -0.028428 v -0.025108 0.013002 -0.028428 v -0.025045 0.013232 -0.028441 v -0.025045 0.013002 -0.028441 v -0.024980 0.013232 -0.028448 v -0.024980 0.013002 -0.028448 v -0.024914 0.013232 -0.028449 v -0.024914 0.013002 -0.028449 v -0.024848 0.013232 -0.028445 v -0.024848 0.013002 -0.028445 v -0.024808 0.013232 -0.028439 v -0.024808 0.013002 -0.028439 v -0.024754 0.013232 -0.028428 v -0.024754 0.013002 -0.028428 v -0.024674 0.013232 -0.028405 v -0.024674 0.013002 -0.028405 v -0.024596 0.013232 -0.028374 v -0.024596 0.013002 -0.028374 v -0.024520 0.013232 -0.028336 v -0.024520 0.013002 -0.028336 v -0.024447 0.013232 -0.028289 v -0.024447 0.013002 -0.028289 v -0.024365 0.013232 -0.028225 v -0.024365 0.013002 -0.028225 v -0.024286 0.013232 -0.028151 v -0.024286 0.013002 -0.028151 v -0.024220 0.013232 -0.028078 v -0.024220 0.013002 -0.028078 v -0.024158 0.013232 -0.027998 v -0.024158 0.013002 -0.027998 v -0.024066 0.013232 -0.027861 v -0.024066 0.013002 -0.027861 v -0.024007 0.013232 -0.027753 v -0.024007 0.013002 -0.027753 v -0.023966 0.013232 -0.027658 v -0.023966 0.013002 -0.027658 v -0.023936 0.013232 -0.027566 v -0.023936 0.013002 -0.027566 v -0.023918 0.013232 -0.027487 v -0.023918 0.013002 -0.027487 v -0.023913 0.013232 -0.027453 v -0.023913 0.013002 -0.027453 v -0.025436 0.013232 -0.028988 v -0.025436 0.013002 -0.028988 v -0.025167 0.013002 -0.029185 v -0.025167 0.013232 -0.029185 v -0.025448 0.013232 -0.029105 v -0.025448 0.013002 -0.029105 v -0.025469 0.013232 -0.029216 v -0.025469 0.013002 -0.029216 v -0.025497 0.013232 -0.029309 v -0.025497 0.013002 -0.029309 v -0.025533 0.013232 -0.029397 v -0.025533 0.013002 -0.029397 v -0.025576 0.013232 -0.029480 v -0.025576 0.013002 -0.029480 v -0.025600 0.013232 -0.029519 v -0.025600 0.013002 -0.029519 v -0.025627 0.013232 -0.029557 v -0.025627 0.013002 -0.029557 v -0.025684 0.013232 -0.029628 v -0.025684 0.013002 -0.029628 v -0.025736 0.013232 -0.029681 v -0.025736 0.013002 -0.029681 v -0.025791 0.013232 -0.029727 v -0.025791 0.013002 -0.029727 v -0.025840 0.013232 -0.029761 v -0.025840 0.013002 -0.029761 v -0.025891 0.013232 -0.029789 v -0.025891 0.013002 -0.029789 v -0.025944 0.013232 -0.029812 v -0.025944 0.013002 -0.029812 v -0.025990 0.013232 -0.029827 v -0.025990 0.013002 -0.029827 v -0.026037 0.013232 -0.029838 v -0.026037 0.013002 -0.029838 v -0.026094 0.013232 -0.029846 v -0.026094 0.013002 -0.029846 v -0.026141 0.013232 -0.029849 v -0.026141 0.013002 -0.029849 v -0.026187 0.013232 -0.029847 v -0.026187 0.013002 -0.029847 v -0.026233 0.013232 -0.029841 v -0.026233 0.013002 -0.029841 v -0.026279 0.013232 -0.029831 v -0.026279 0.013002 -0.029831 v -0.026334 0.013232 -0.029813 v -0.026334 0.013002 -0.029813 v -0.026388 0.013232 -0.029789 v -0.026388 0.013002 -0.029789 v -0.026441 0.013232 -0.029760 v -0.026441 0.013002 -0.029760 v -0.026494 0.013232 -0.029724 v -0.026494 0.013002 -0.029724 v -0.026551 0.013232 -0.029678 v -0.026551 0.013002 -0.029678 v -0.026593 0.013232 -0.029636 v -0.026593 0.013002 -0.029636 v -0.026630 0.013232 -0.029592 v -0.026630 0.013002 -0.029592 v -0.026656 0.013232 -0.029553 v -0.026656 0.013002 -0.029553 v -0.026678 0.013232 -0.029513 v -0.026678 0.013002 -0.029513 v -0.026696 0.013232 -0.029472 v -0.026696 0.013002 -0.029472 v -0.026710 0.013232 -0.029429 v -0.026710 0.013002 -0.029429 v -0.026720 0.013232 -0.029384 v -0.026720 0.013002 -0.029384 v -0.026724 0.013232 -0.029357 v -0.026724 0.013002 -0.029357 v -0.026726 0.013232 -0.029329 v -0.026726 0.013002 -0.029329 v -0.026727 0.013232 -0.029281 v -0.026727 0.013002 -0.029281 v -0.026722 0.013232 -0.029223 v -0.026722 0.013002 -0.029223 v -0.026711 0.013232 -0.029164 v -0.026711 0.013002 -0.029164 v -0.026694 0.013232 -0.029104 v -0.026694 0.013002 -0.029104 v -0.026666 0.013232 -0.029032 v -0.026666 0.013002 -0.029032 v -0.026624 0.013232 -0.028948 v -0.026624 0.013002 -0.028948 v -0.026586 0.013232 -0.028884 v -0.026586 0.013002 -0.028884 v -0.026541 0.013232 -0.028819 v -0.026541 0.013002 -0.028819 v -0.026268 0.013232 -0.028485 v -0.026268 0.013002 -0.028485 v -0.027378 0.013232 -0.027672 v -0.027378 0.013002 -0.027672 v -0.028163 0.013232 -0.028744 v -0.028163 0.013002 -0.028744 v -0.027934 0.013232 -0.028911 v -0.027934 0.013002 -0.028911 v -0.027325 0.013232 -0.028079 v -0.027325 0.013002 -0.028079 v -0.026676 0.013232 -0.028554 v -0.026676 0.013002 -0.028554 v -0.026820 0.013232 -0.028738 v -0.026820 0.013002 -0.028738 v -0.026904 0.013232 -0.028865 v -0.026904 0.013002 -0.028865 v -0.026956 0.013232 -0.028962 v -0.026956 0.013002 -0.028962 v -0.026997 0.013232 -0.029058 v -0.026997 0.013002 -0.029058 v -0.027022 0.013232 -0.029140 v -0.027022 0.013002 -0.029140 v -0.027039 0.013232 -0.029220 v -0.027039 0.013002 -0.029220 v -0.027048 0.013232 -0.029300 v -0.027048 0.013002 -0.029300 v -0.027049 0.013232 -0.029353 v -0.027049 0.013002 -0.029353 v -0.027044 0.013232 -0.029418 v -0.027044 0.013002 -0.029418 v -0.027035 0.013232 -0.029482 v -0.027035 0.013002 -0.029482 v -0.027019 0.013232 -0.029544 v -0.027019 0.013002 -0.029544 v -0.026998 0.013232 -0.029604 v -0.026998 0.013002 -0.029604 v -0.026972 0.013232 -0.029663 v -0.026972 0.013002 -0.029663 v -0.026940 0.013232 -0.029719 v -0.026940 0.013002 -0.029719 v -0.026895 0.013232 -0.029784 v -0.026895 0.013002 -0.029784 v -0.026841 0.013232 -0.029846 v -0.026841 0.013002 -0.029846 v -0.026780 0.013232 -0.029905 v -0.026780 0.013002 -0.029905 v -0.026698 0.013232 -0.029971 v -0.026698 0.013002 -0.029971 v -0.026608 0.013232 -0.030031 v -0.026608 0.013002 -0.030031 v -0.026529 0.013232 -0.030073 v -0.026529 0.013002 -0.030073 v -0.026450 0.013232 -0.030106 v -0.026450 0.013002 -0.030106 v -0.026370 0.013232 -0.030131 v -0.026370 0.013002 -0.030131 v -0.026303 0.013232 -0.030145 v -0.026303 0.013002 -0.030145 v -0.026235 0.013232 -0.030152 v -0.026235 0.013002 -0.030152 v -0.026166 0.013232 -0.030154 v -0.026166 0.013002 -0.030154 v -0.026097 0.013232 -0.030150 v -0.026097 0.013002 -0.030150 v -0.026028 0.013232 -0.030140 v -0.026028 0.013002 -0.030140 v -0.025959 0.013232 -0.030124 v -0.025959 0.013002 -0.030124 v -0.025878 0.013232 -0.030097 v -0.025878 0.013002 -0.030097 v -0.025800 0.013232 -0.030061 v -0.025800 0.013002 -0.030061 v -0.025724 0.013232 -0.030017 v -0.025724 0.013002 -0.030017 v -0.025650 0.013232 -0.029964 v -0.025650 0.013002 -0.029964 v -0.025568 0.013232 -0.029891 v -0.025568 0.013002 -0.029891 v -0.025488 0.013232 -0.029806 v -0.025488 0.013002 -0.029806 v -0.025412 0.013232 -0.029710 v -0.025412 0.013002 -0.029710 v -0.025309 0.013232 -0.029556 v -0.025309 0.013002 -0.029556 v -0.025248 0.013232 -0.029446 v -0.025248 0.013002 -0.029446 v -0.025208 0.013232 -0.029353 v -0.025208 0.013002 -0.029353 v -0.025186 0.013232 -0.029285 v -0.025186 0.013002 -0.029285 v -0.025175 0.013232 -0.029239 v -0.025175 0.013002 -0.029239 v -0.020762 0.013011 -0.017321 v -0.020659 0.013011 -0.017522 v -0.015397 0.013011 -0.017399 v -0.015401 0.013011 -0.017197 v -0.020659 0.013214 -0.017522 v -0.015397 0.013214 -0.017399 v -0.020762 0.013214 -0.017321 v -0.015401 0.013214 -0.017197 v -0.023361 0.013011 -0.020749 v -0.023199 0.013011 -0.020872 v -0.023199 0.013214 -0.020872 v -0.023361 0.013214 -0.020749 v -0.015397 0.013011 -0.017399 v -0.015397 0.013214 -0.017399 v -0.015401 0.013214 -0.017197 v -0.015401 0.013011 -0.017197 v -0.023199 0.013214 -0.020872 v -0.023199 0.013011 -0.020872 v -0.023361 0.013011 -0.020749 v -0.023361 0.013214 -0.020749 v -0.018111 0.013232 -0.019574 v -0.018111 0.013002 -0.019574 v -0.019088 0.013002 -0.020908 v -0.019088 0.013232 -0.020908 v -0.018336 0.013232 -0.019409 v -0.018336 0.013002 -0.019409 v -0.019456 0.013232 -0.019580 v -0.019456 0.013002 -0.019580 v -0.019877 0.013232 -0.019629 v -0.019877 0.013002 -0.019629 v -0.020010 0.013232 -0.019634 v -0.020010 0.013002 -0.019634 v -0.020126 0.013232 -0.019632 v -0.020126 0.013002 -0.019632 v -0.020211 0.013232 -0.019623 v -0.020211 0.013002 -0.019623 v -0.020284 0.013232 -0.019608 v -0.020284 0.013002 -0.019608 v -0.020354 0.013232 -0.019587 v -0.020354 0.013002 -0.019587 v -0.020421 0.013232 -0.019559 v -0.020421 0.013002 -0.019559 v -0.020485 0.013232 -0.019526 v -0.020485 0.013002 -0.019526 v -0.020516 0.013232 -0.019507 v -0.020516 0.013002 -0.019507 v -0.020554 0.013232 -0.019480 v -0.020554 0.013002 -0.019480 v -0.020611 0.013232 -0.019434 v -0.020611 0.013002 -0.019434 v -0.020654 0.013232 -0.019392 v -0.020654 0.013002 -0.019392 v -0.020686 0.013232 -0.019355 v -0.020686 0.013002 -0.019355 v -0.020712 0.013232 -0.019315 v -0.020712 0.013002 -0.019315 v -0.020731 0.013232 -0.019282 v -0.020731 0.013002 -0.019282 v -0.020746 0.013232 -0.019248 v -0.020746 0.013002 -0.019248 v -0.020758 0.013232 -0.019212 v -0.020758 0.013002 -0.019212 v -0.020765 0.013232 -0.019183 v -0.020765 0.013002 -0.019183 v -0.020770 0.013232 -0.019154 v -0.020770 0.013002 -0.019154 v -0.020774 0.013232 -0.019116 v -0.020774 0.013002 -0.019116 v -0.020773 0.013232 -0.019078 v -0.020773 0.013002 -0.019078 v -0.020770 0.013232 -0.019040 v -0.020770 0.013002 -0.019040 v -0.020761 0.013232 -0.018994 v -0.020761 0.013002 -0.018994 v -0.020747 0.013232 -0.018948 v -0.020747 0.013002 -0.018948 v -0.020728 0.013232 -0.018901 v -0.020728 0.013002 -0.018901 v -0.020699 0.013232 -0.018845 v -0.020699 0.013002 -0.018845 v -0.020675 0.013232 -0.018805 v -0.020675 0.013002 -0.018805 v -0.020647 0.013232 -0.018765 v -0.020647 0.013002 -0.018765 v -0.020592 0.013232 -0.018697 v -0.020592 0.013002 -0.018697 v -0.020529 0.013232 -0.018635 v -0.020529 0.013002 -0.018635 v -0.020460 0.013232 -0.018579 v -0.020460 0.013002 -0.018579 v -0.020385 0.013232 -0.018529 v -0.020385 0.013002 -0.018529 v -0.020302 0.013232 -0.018485 v -0.020302 0.013002 -0.018485 v -0.020197 0.013232 -0.018441 v -0.020197 0.013002 -0.018441 v -0.020100 0.013232 -0.018411 v -0.020100 0.013002 -0.018411 v -0.019978 0.013232 -0.018382 v -0.019978 0.013002 -0.018382 v -0.020243 0.013232 -0.018188 v -0.020243 0.013002 -0.018188 v -0.020350 0.013232 -0.018223 v -0.020350 0.013002 -0.018223 v -0.020452 0.013232 -0.018268 v -0.020452 0.013002 -0.018268 v -0.020548 0.013232 -0.018322 v -0.020548 0.013002 -0.018322 v -0.020639 0.013232 -0.018385 v -0.020639 0.013002 -0.018385 v -0.020724 0.013232 -0.018458 v -0.020724 0.013002 -0.018458 v -0.020803 0.013232 -0.018539 v -0.020803 0.013002 -0.018539 v -0.020888 0.013232 -0.018643 v -0.020888 0.013002 -0.018643 v -0.020951 0.013232 -0.018738 v -0.020951 0.013002 -0.018738 v -0.020995 0.013232 -0.018820 v -0.020995 0.013002 -0.018820 v -0.021030 0.013232 -0.018902 v -0.021030 0.013002 -0.018902 v -0.021051 0.013232 -0.018972 v -0.021051 0.013002 -0.018972 v -0.021066 0.013232 -0.019042 v -0.021066 0.013002 -0.019042 v -0.021073 0.013232 -0.019112 v -0.021073 0.013002 -0.019112 v -0.021073 0.013232 -0.019170 v -0.021073 0.013002 -0.019170 v -0.021069 0.013232 -0.019227 v -0.021069 0.013002 -0.019227 v -0.021057 0.013232 -0.019295 v -0.021057 0.013002 -0.019295 v -0.021041 0.013232 -0.019349 v -0.021041 0.013002 -0.019349 v -0.021022 0.013232 -0.019402 v -0.021022 0.013002 -0.019402 v -0.020997 0.013232 -0.019453 v -0.020997 0.013002 -0.019453 v -0.020961 0.013232 -0.019511 v -0.020961 0.013002 -0.019511 v -0.020919 0.013232 -0.019568 v -0.020919 0.013002 -0.019568 v -0.020870 0.013232 -0.019621 v -0.020870 0.013002 -0.019621 v -0.020824 0.013232 -0.019664 v -0.020824 0.013002 -0.019664 v -0.020762 0.013232 -0.019712 v -0.020762 0.013002 -0.019712 v -0.020692 0.013232 -0.019759 v -0.020692 0.013002 -0.019759 v -0.020618 0.013232 -0.019800 v -0.020618 0.013002 -0.019800 v -0.020530 0.013232 -0.019837 v -0.020530 0.013002 -0.019837 v -0.020437 0.013232 -0.019867 v -0.020437 0.013002 -0.019867 v -0.020351 0.013232 -0.019887 v -0.020351 0.013002 -0.019887 v -0.020260 0.013232 -0.019900 v -0.020260 0.013002 -0.019900 v -0.020122 0.013232 -0.019908 v -0.020122 0.013002 -0.019908 v -0.019829 0.013232 -0.019896 v -0.019829 0.013002 -0.019896 v -0.019447 0.013232 -0.019848 v -0.019447 0.013002 -0.019848 v -0.018568 0.013232 -0.019706 v -0.018568 0.013002 -0.019706 v -0.018562 0.013232 -0.019711 v -0.018562 0.013002 -0.019711 v -0.019316 0.013232 -0.020741 v -0.019316 0.013002 -0.020741 v -0.019759 0.013232 -0.021147 v -0.019759 0.013002 -0.021147 v -0.019490 0.013002 -0.021344 v -0.019490 0.013232 -0.021344 v -0.019771 0.013232 -0.021264 v -0.019771 0.013002 -0.021264 v -0.019793 0.013232 -0.021375 v -0.019793 0.013002 -0.021375 v -0.019820 0.013232 -0.021468 v -0.019820 0.013002 -0.021468 v -0.019856 0.013232 -0.021556 v -0.019856 0.013002 -0.021556 v -0.019899 0.013232 -0.021639 v -0.019899 0.013002 -0.021639 v -0.019924 0.013232 -0.021678 v -0.019924 0.013002 -0.021678 v -0.019950 0.013232 -0.021716 v -0.019950 0.013002 -0.021716 v -0.020007 0.013232 -0.021787 v -0.020007 0.013002 -0.021787 v -0.020059 0.013232 -0.021840 v -0.020059 0.013002 -0.021840 v -0.020114 0.013232 -0.021886 v -0.020114 0.013002 -0.021886 v -0.020163 0.013232 -0.021920 v -0.020163 0.013002 -0.021920 v -0.020214 0.013232 -0.021948 v -0.020214 0.013002 -0.021948 v -0.020267 0.013232 -0.021971 v -0.020267 0.013002 -0.021971 v -0.020313 0.013232 -0.021986 v -0.020313 0.013002 -0.021986 v -0.020360 0.013232 -0.021997 v -0.020360 0.013002 -0.021997 v -0.020417 0.013232 -0.022006 v -0.020417 0.013002 -0.022006 v -0.020464 0.013232 -0.022008 v -0.020464 0.013002 -0.022008 v -0.020510 0.013232 -0.022006 v -0.020510 0.013002 -0.022006 v -0.020557 0.013232 -0.022000 v -0.020557 0.013002 -0.022000 v -0.020602 0.013232 -0.021990 v -0.020602 0.013002 -0.021990 v -0.020657 0.013232 -0.021972 v -0.020657 0.013002 -0.021972 v -0.020711 0.013232 -0.021948 v -0.020711 0.013002 -0.021948 v -0.020764 0.013232 -0.021919 v -0.020764 0.013002 -0.021919 v -0.020817 0.013232 -0.021883 v -0.020817 0.013002 -0.021883 v -0.020874 0.013232 -0.021837 v -0.020874 0.013002 -0.021837 v -0.020917 0.013232 -0.021795 v -0.020917 0.013002 -0.021795 v -0.020953 0.013232 -0.021751 v -0.020953 0.013002 -0.021751 v -0.020979 0.013232 -0.021712 v -0.020979 0.013002 -0.021712 v -0.021001 0.013232 -0.021672 v -0.021001 0.013002 -0.021672 v -0.021019 0.013232 -0.021631 v -0.021019 0.013002 -0.021631 v -0.021033 0.013232 -0.021588 v -0.021033 0.013002 -0.021588 v -0.021043 0.013232 -0.021543 v -0.021043 0.013002 -0.021543 v -0.021047 0.013232 -0.021516 v -0.021047 0.013002 -0.021516 v -0.021049 0.013232 -0.021488 v -0.021049 0.013002 -0.021488 v -0.021050 0.013232 -0.021440 v -0.021050 0.013002 -0.021440 v -0.021045 0.013232 -0.021382 v -0.021045 0.013002 -0.021382 v -0.021034 0.013232 -0.021323 v -0.021034 0.013002 -0.021323 v -0.021017 0.013232 -0.021263 v -0.021017 0.013002 -0.021263 v -0.020990 0.013232 -0.021191 v -0.020990 0.013002 -0.021191 v -0.020948 0.013232 -0.021107 v -0.020948 0.013002 -0.021107 v -0.020909 0.013232 -0.021043 v -0.020909 0.013002 -0.021043 v -0.020864 0.013232 -0.020978 v -0.020864 0.013002 -0.020978 v -0.020591 0.013232 -0.020645 v -0.020591 0.013002 -0.020645 v -0.021701 0.013232 -0.019831 v -0.021701 0.013002 -0.019831 v -0.022486 0.013232 -0.020903 v -0.022486 0.013002 -0.020903 v -0.022257 0.013232 -0.021070 v -0.022257 0.013002 -0.021070 v -0.021648 0.013232 -0.020238 v -0.021648 0.013002 -0.020238 v -0.020999 0.013232 -0.020713 v -0.020999 0.013002 -0.020713 v -0.021143 0.013232 -0.020897 v -0.021143 0.013002 -0.020897 v -0.021227 0.013232 -0.021024 v -0.021227 0.013002 -0.021024 v -0.021280 0.013232 -0.021121 v -0.021280 0.013002 -0.021121 v -0.021320 0.013232 -0.021217 v -0.021320 0.013002 -0.021217 v -0.021346 0.013232 -0.021299 v -0.021346 0.013002 -0.021299 v -0.021363 0.013232 -0.021379 v -0.021363 0.013002 -0.021379 v -0.021371 0.013232 -0.021459 v -0.021371 0.013002 -0.021459 v -0.021372 0.013232 -0.021512 v -0.021372 0.013002 -0.021512 v -0.021368 0.013232 -0.021577 v -0.021368 0.013002 -0.021577 v -0.021358 0.013232 -0.021641 v -0.021358 0.013002 -0.021641 v -0.021342 0.013232 -0.021703 v -0.021342 0.013002 -0.021703 v -0.021321 0.013232 -0.021764 v -0.021321 0.013002 -0.021764 v -0.021295 0.013232 -0.021822 v -0.021295 0.013002 -0.021822 v -0.021263 0.013232 -0.021878 v -0.021263 0.013002 -0.021878 v -0.021218 0.013232 -0.021943 v -0.021218 0.013002 -0.021943 v -0.021164 0.013232 -0.022005 v -0.021164 0.013002 -0.022005 v -0.021103 0.013232 -0.022064 v -0.021103 0.013002 -0.022064 v -0.021021 0.013232 -0.022130 v -0.021021 0.013002 -0.022130 v -0.020931 0.013232 -0.022190 v -0.020931 0.013002 -0.022190 v -0.020853 0.013232 -0.022232 v -0.020853 0.013002 -0.022232 v -0.020773 0.013232 -0.022265 v -0.020773 0.013002 -0.022265 v -0.020693 0.013232 -0.022290 v -0.020693 0.013002 -0.022290 v -0.020626 0.013232 -0.022304 v -0.020626 0.013002 -0.022304 v -0.020558 0.013232 -0.022312 v -0.020558 0.013002 -0.022312 v -0.020490 0.013232 -0.022313 v -0.020490 0.013002 -0.022313 v -0.020421 0.013232 -0.022309 v -0.020421 0.013002 -0.022309 v -0.020351 0.013232 -0.022299 v -0.020351 0.013002 -0.022299 v -0.020282 0.013232 -0.022283 v -0.020282 0.013002 -0.022283 v -0.020201 0.013232 -0.022256 v -0.020201 0.013002 -0.022256 v -0.020123 0.013232 -0.022220 v -0.020123 0.013002 -0.022220 v -0.020047 0.013232 -0.022176 v -0.020047 0.013002 -0.022176 v -0.019974 0.013232 -0.022123 v -0.019974 0.013002 -0.022123 v -0.019891 0.013232 -0.022050 v -0.019891 0.013002 -0.022050 v -0.019811 0.013232 -0.021965 v -0.019811 0.013002 -0.021965 v -0.019735 0.013232 -0.021869 v -0.019735 0.013002 -0.021869 v -0.019632 0.013232 -0.021716 v -0.019632 0.013002 -0.021716 v -0.019571 0.013232 -0.021605 v -0.019571 0.013002 -0.021605 v -0.019531 0.013232 -0.021513 v -0.019531 0.013002 -0.021513 v -0.019509 0.013232 -0.021444 v -0.019509 0.013002 -0.021444 v -0.019498 0.013232 -0.021398 v -0.019498 0.013002 -0.021398 v -0.014943 0.013011 -0.009212 v -0.014841 0.013011 -0.009412 v -0.009578 0.013011 -0.009290 v -0.009583 0.013011 -0.009087 v -0.014841 0.013214 -0.009412 v -0.009578 0.013214 -0.009290 v -0.014943 0.013214 -0.009212 v -0.009583 0.013214 -0.009087 v -0.017542 0.013011 -0.012640 v -0.017381 0.013011 -0.012762 v -0.017381 0.013214 -0.012762 v -0.017542 0.013214 -0.012640 v -0.009578 0.013011 -0.009290 v -0.009578 0.013214 -0.009290 v -0.009583 0.013214 -0.009087 v -0.009583 0.013011 -0.009087 v -0.017381 0.013214 -0.012762 v -0.017381 0.013011 -0.012762 v -0.017542 0.013011 -0.012640 v -0.017542 0.013214 -0.012640 v -0.012342 0.013232 -0.011532 v -0.012342 0.012840 -0.011532 v -0.013259 0.012840 -0.012784 v -0.013259 0.013232 -0.012784 v -0.012565 0.013232 -0.011369 v -0.012565 0.012840 -0.011369 v -0.012931 0.013232 -0.011870 v -0.012931 0.012840 -0.011870 v -0.014651 0.013232 -0.010610 v -0.014651 0.012840 -0.010610 v -0.014123 0.013232 -0.010209 v -0.014123 0.012840 -0.010209 v -0.014363 0.013232 -0.010033 v -0.014363 0.012840 -0.010033 v -0.015158 0.013232 -0.010628 v -0.015158 0.012840 -0.010628 v -0.013116 0.013232 -0.012123 v -0.013116 0.012840 -0.012123 v -0.013482 0.013232 -0.012622 v -0.013482 0.012840 -0.012622 v -0.013900 0.013232 -0.012982 v -0.013900 0.012840 -0.012982 v -0.013631 0.012840 -0.013179 v -0.013631 0.013232 -0.013179 v -0.013912 0.013232 -0.013099 v -0.013912 0.012840 -0.013099 v -0.013934 0.013232 -0.013210 v -0.013934 0.012840 -0.013210 v -0.013961 0.013232 -0.013303 v -0.013961 0.012840 -0.013303 v -0.013997 0.013232 -0.013391 v -0.013997 0.012840 -0.013391 v -0.014040 0.013232 -0.013473 v -0.014040 0.012840 -0.013473 v -0.014065 0.013232 -0.013513 v -0.014065 0.012840 -0.013513 v -0.014091 0.013232 -0.013551 v -0.014091 0.012840 -0.013551 v -0.014148 0.013232 -0.013621 v -0.014148 0.012840 -0.013621 v -0.014200 0.013232 -0.013675 v -0.014200 0.012840 -0.013675 v -0.014255 0.013232 -0.013721 v -0.014255 0.012840 -0.013721 v -0.014304 0.013232 -0.013755 v -0.014304 0.012840 -0.013755 v -0.014355 0.013232 -0.013783 v -0.014355 0.012840 -0.013783 v -0.014408 0.013232 -0.013806 v -0.014408 0.012840 -0.013806 v -0.014454 0.013232 -0.013821 v -0.014454 0.012840 -0.013821 v -0.014501 0.013232 -0.013832 v -0.014501 0.012840 -0.013832 v -0.014558 0.013232 -0.013840 v -0.014558 0.012840 -0.013840 v -0.014605 0.013232 -0.013842 v -0.014605 0.012840 -0.013842 v -0.014651 0.013232 -0.013841 v -0.014651 0.012840 -0.013841 v -0.014698 0.013232 -0.013835 v -0.014698 0.012840 -0.013835 v -0.014743 0.013232 -0.013824 v -0.014743 0.012840 -0.013824 v -0.014798 0.013232 -0.013807 v -0.014798 0.012840 -0.013807 v -0.014852 0.013232 -0.013783 v -0.014852 0.012840 -0.013783 v -0.014905 0.013232 -0.013753 v -0.014905 0.012840 -0.013753 v -0.014958 0.013232 -0.013718 v -0.014958 0.012840 -0.013718 v -0.015015 0.013232 -0.013672 v -0.015015 0.012840 -0.013672 v -0.015058 0.013232 -0.013630 v -0.015058 0.012840 -0.013630 v -0.015094 0.013232 -0.013586 v -0.015094 0.012840 -0.013586 v -0.015120 0.013232 -0.013547 v -0.015120 0.012840 -0.013547 v -0.015142 0.013232 -0.013507 v -0.015142 0.012840 -0.013507 v -0.015160 0.013232 -0.013466 v -0.015160 0.012840 -0.013466 v -0.015174 0.013232 -0.013423 v -0.015174 0.012840 -0.013423 v -0.015184 0.013232 -0.013378 v -0.015184 0.012840 -0.013378 v -0.015188 0.013232 -0.013351 v -0.015188 0.012840 -0.013351 v -0.015190 0.013232 -0.013322 v -0.015190 0.012840 -0.013322 v -0.015191 0.013232 -0.013275 v -0.015191 0.012840 -0.013275 v -0.015186 0.013232 -0.013217 v -0.015186 0.012840 -0.013217 v -0.015175 0.013232 -0.013158 v -0.015175 0.012840 -0.013158 v -0.015158 0.013232 -0.013097 v -0.015158 0.012840 -0.013097 v -0.015131 0.013232 -0.013026 v -0.015131 0.012840 -0.013026 v -0.015089 0.013232 -0.012942 v -0.015089 0.012840 -0.012942 v -0.015050 0.013232 -0.012878 v -0.015050 0.012840 -0.012878 v -0.015005 0.013232 -0.012813 v -0.015005 0.012840 -0.012813 v -0.014732 0.013232 -0.012479 v -0.014732 0.012840 -0.012479 v -0.015842 0.013232 -0.011666 v -0.015842 0.012840 -0.011666 v -0.016627 0.013232 -0.012738 v -0.016627 0.012840 -0.012738 v -0.016398 0.013232 -0.012905 v -0.016398 0.012840 -0.012905 v -0.015789 0.013232 -0.012073 v -0.015789 0.012840 -0.012073 v -0.015140 0.013232 -0.012548 v -0.015140 0.012840 -0.012548 v -0.015284 0.013232 -0.012732 v -0.015284 0.012840 -0.012732 v -0.015368 0.013232 -0.012859 v -0.015368 0.012840 -0.012859 v -0.015421 0.013232 -0.012956 v -0.015421 0.012840 -0.012956 v -0.015461 0.013232 -0.013052 v -0.015461 0.012840 -0.013052 v -0.015487 0.013232 -0.013134 v -0.015487 0.012840 -0.013134 v -0.015504 0.013232 -0.013214 v -0.015504 0.012840 -0.013214 v -0.015512 0.013232 -0.013294 v -0.015512 0.012840 -0.013294 v -0.015513 0.013232 -0.013347 v -0.015513 0.012840 -0.013347 v -0.015509 0.013232 -0.013412 v -0.015509 0.012840 -0.013412 v -0.015499 0.013232 -0.013476 v -0.015499 0.012840 -0.013476 v -0.015483 0.013232 -0.013538 v -0.015483 0.012840 -0.013538 v -0.015462 0.013232 -0.013598 v -0.015462 0.012840 -0.013598 v -0.015436 0.013232 -0.013656 v -0.015436 0.012840 -0.013656 v -0.015404 0.013232 -0.013713 v -0.015404 0.012840 -0.013713 v -0.015359 0.013232 -0.013778 v -0.015359 0.012840 -0.013778 v -0.015305 0.013232 -0.013840 v -0.015305 0.012840 -0.013840 v -0.015244 0.013232 -0.013899 v -0.015244 0.012840 -0.013899 v -0.015162 0.013232 -0.013964 v -0.015162 0.012840 -0.013964 v -0.015072 0.013232 -0.014024 v -0.015072 0.012840 -0.014024 v -0.014994 0.013232 -0.014066 v -0.014994 0.012840 -0.014066 v -0.014914 0.013232 -0.014100 v -0.014914 0.012840 -0.014100 v -0.014834 0.013232 -0.014125 v -0.014834 0.012840 -0.014125 v -0.014767 0.013232 -0.014138 v -0.014767 0.012840 -0.014138 v -0.014699 0.013232 -0.014146 v -0.014699 0.012840 -0.014146 v -0.014631 0.013232 -0.014148 v -0.014631 0.012840 -0.014148 v -0.014562 0.013232 -0.014144 v -0.014562 0.012840 -0.014144 v -0.014492 0.013232 -0.014134 v -0.014492 0.012840 -0.014134 v -0.014423 0.013232 -0.014118 v -0.014423 0.012840 -0.014118 v -0.014342 0.013232 -0.014091 v -0.014342 0.012840 -0.014091 v -0.014264 0.013232 -0.014055 v -0.014264 0.012840 -0.014055 v -0.014188 0.013232 -0.014010 v -0.014188 0.012840 -0.014010 v -0.014115 0.013232 -0.013957 v -0.014115 0.012840 -0.013957 v -0.014032 0.013232 -0.013885 v -0.014032 0.012840 -0.013885 v -0.013952 0.013232 -0.013800 v -0.013952 0.012840 -0.013800 v -0.013876 0.013232 -0.013704 v -0.013876 0.012840 -0.013704 v -0.013773 0.013232 -0.013550 v -0.013773 0.012840 -0.013550 v -0.013712 0.013232 -0.013440 v -0.013712 0.012840 -0.013440 v -0.013672 0.013232 -0.013347 v -0.013672 0.012840 -0.013347 v -0.013650 0.013232 -0.013279 v -0.013650 0.012840 -0.013279 v -0.013639 0.013232 -0.013232 v -0.013639 0.012840 -0.013232 v -0.026458 -0.013229 -0.025189 v -0.026356 -0.013229 -0.025390 v -0.021093 -0.013229 -0.025268 v -0.021098 -0.013229 -0.025065 v -0.026356 -0.013026 -0.025390 v -0.021093 -0.013026 -0.025268 v -0.026458 -0.013026 -0.025189 v -0.021098 -0.013026 -0.025065 v -0.029057 -0.013229 -0.028617 v -0.028896 -0.013229 -0.028740 v -0.028896 -0.013026 -0.028740 v -0.029057 -0.013026 -0.028617 v -0.021093 -0.013229 -0.025268 v -0.021093 -0.013026 -0.025268 v -0.021098 -0.013026 -0.025065 v -0.021098 -0.013229 -0.025065 v -0.028896 -0.013026 -0.028740 v -0.028896 -0.013229 -0.028740 v -0.029057 -0.013229 -0.028617 v -0.029057 -0.013026 -0.028617 v -0.026377 -0.013135 -0.030206 v -0.026377 -0.012905 -0.030206 v -0.026104 -0.012905 -0.030406 v -0.026104 -0.013135 -0.030406 v -0.026283 -0.013135 -0.030175 v -0.026283 -0.012905 -0.030175 v -0.026194 -0.013135 -0.030137 v -0.026194 -0.012905 -0.030137 v -0.026111 -0.013135 -0.030092 v -0.026111 -0.012905 -0.030092 v -0.026033 -0.013135 -0.030039 v -0.026033 -0.012905 -0.030039 v -0.025960 -0.013135 -0.029979 v -0.025960 -0.012905 -0.029979 v -0.025893 -0.013135 -0.029911 v -0.025893 -0.012905 -0.029911 v -0.025857 -0.013135 -0.029869 v -0.025857 -0.012905 -0.029869 v -0.025823 -0.013135 -0.029824 v -0.025823 -0.012905 -0.029824 v -0.025768 -0.013135 -0.029741 v -0.025768 -0.012905 -0.029741 v -0.025729 -0.013135 -0.029668 v -0.025729 -0.012905 -0.029668 v -0.025702 -0.013135 -0.029604 v -0.025702 -0.012905 -0.029604 v -0.025685 -0.013135 -0.029550 v -0.025685 -0.012905 -0.029550 v -0.025674 -0.013135 -0.029495 v -0.025674 -0.012905 -0.029495 v -0.025668 -0.013135 -0.029441 v -0.025668 -0.012905 -0.029441 v -0.025666 -0.013135 -0.029406 v -0.025666 -0.012905 -0.029406 v -0.025668 -0.013135 -0.029370 v -0.025668 -0.012905 -0.029370 v -0.025674 -0.013135 -0.029317 v -0.025674 -0.012905 -0.029317 v -0.025683 -0.013135 -0.029275 v -0.025683 -0.012905 -0.029275 v -0.025696 -0.013135 -0.029235 v -0.025696 -0.012905 -0.029235 v -0.025712 -0.013135 -0.029196 v -0.025712 -0.012905 -0.029196 v -0.025732 -0.013135 -0.029159 v -0.025732 -0.012905 -0.029159 v -0.025755 -0.013135 -0.029124 v -0.025755 -0.012905 -0.029124 v -0.025783 -0.013135 -0.029090 v -0.025783 -0.012905 -0.029090 v -0.025820 -0.013135 -0.029051 v -0.025820 -0.012905 -0.029051 v -0.025848 -0.013135 -0.029027 v -0.025848 -0.012905 -0.029027 v -0.025878 -0.013135 -0.029003 v -0.025878 -0.012905 -0.029003 v -0.025930 -0.013135 -0.028968 v -0.025930 -0.012905 -0.028968 v -0.025983 -0.013135 -0.028940 v -0.025983 -0.012905 -0.028940 v -0.026035 -0.013135 -0.028919 v -0.026035 -0.012905 -0.028919 v -0.026088 -0.013135 -0.028904 v -0.026088 -0.012905 -0.028904 v -0.026140 -0.013135 -0.028897 v -0.026140 -0.012905 -0.028897 v -0.026193 -0.013135 -0.028895 v -0.026193 -0.012905 -0.028895 v -0.026246 -0.013135 -0.028901 v -0.026246 -0.012905 -0.028901 v -0.026299 -0.013135 -0.028913 v -0.026299 -0.012905 -0.028913 v -0.026352 -0.013135 -0.028932 v -0.026352 -0.012905 -0.028932 v -0.026405 -0.013135 -0.028958 v -0.026405 -0.012905 -0.028958 v -0.026459 -0.013135 -0.028991 v -0.026459 -0.012905 -0.028991 v -0.026530 -0.013135 -0.029044 v -0.026530 -0.012905 -0.029044 v -0.026601 -0.013135 -0.029110 v -0.026601 -0.012905 -0.029110 v -0.026673 -0.013135 -0.029188 v -0.026673 -0.012905 -0.029188 v -0.026763 -0.013135 -0.029301 v -0.026763 -0.012905 -0.029301 v -0.026898 -0.013135 -0.029485 v -0.026898 -0.012905 -0.029485 v -0.027113 -0.013135 -0.029328 v -0.027113 -0.012905 -0.029328 v -0.026985 -0.013135 -0.029154 v -0.026985 -0.012905 -0.029154 v -0.026900 -0.013135 -0.029026 v -0.026900 -0.012905 -0.029026 v -0.026847 -0.013135 -0.028924 v -0.026847 -0.012905 -0.028924 v -0.026817 -0.013135 -0.028847 v -0.026817 -0.012905 -0.028847 v -0.026801 -0.013135 -0.028791 v -0.026801 -0.012905 -0.028791 v -0.026790 -0.013135 -0.028737 v -0.026790 -0.012905 -0.028737 v -0.026786 -0.013135 -0.028685 v -0.026786 -0.012905 -0.028685 v -0.026787 -0.013135 -0.028634 v -0.026787 -0.012905 -0.028634 v -0.026794 -0.013135 -0.028586 v -0.026794 -0.012905 -0.028586 v -0.026807 -0.013135 -0.028539 v -0.026807 -0.012905 -0.028539 v -0.026826 -0.013135 -0.028494 v -0.026826 -0.012905 -0.028494 v -0.026851 -0.013135 -0.028450 v -0.026851 -0.012905 -0.028450 v -0.026881 -0.013135 -0.028409 v -0.026881 -0.012905 -0.028409 v -0.026917 -0.013135 -0.028369 v -0.026917 -0.012905 -0.028369 v -0.026945 -0.013135 -0.028344 v -0.026945 -0.012905 -0.028344 v -0.026991 -0.013135 -0.028307 v -0.026991 -0.012905 -0.028307 v -0.027051 -0.013135 -0.028267 v -0.027051 -0.012905 -0.028267 v -0.027110 -0.013135 -0.028236 v -0.027110 -0.012905 -0.028236 v -0.027153 -0.013135 -0.028219 v -0.027153 -0.012905 -0.028219 v -0.027196 -0.013135 -0.028207 v -0.027196 -0.012905 -0.028207 v -0.027239 -0.013135 -0.028200 v -0.027239 -0.012905 -0.028200 v -0.027281 -0.013135 -0.028197 v -0.027281 -0.012905 -0.028197 v -0.027323 -0.013135 -0.028200 v -0.027323 -0.012905 -0.028200 v -0.027364 -0.013135 -0.028208 v -0.027364 -0.012905 -0.028208 v -0.027404 -0.013135 -0.028220 v -0.027404 -0.012905 -0.028220 v -0.027444 -0.013135 -0.028238 v -0.027444 -0.012905 -0.028238 v -0.027484 -0.013135 -0.028261 v -0.027484 -0.012905 -0.028261 v -0.027523 -0.013135 -0.028289 v -0.027523 -0.012905 -0.028289 v -0.027574 -0.013135 -0.028333 v -0.027574 -0.012905 -0.028333 v -0.027625 -0.013135 -0.028387 v -0.027625 -0.012905 -0.028387 v -0.027674 -0.013135 -0.028449 v -0.027674 -0.012905 -0.028449 v -0.027718 -0.013135 -0.028516 v -0.027718 -0.012905 -0.028516 v -0.027756 -0.013135 -0.028587 v -0.027756 -0.012905 -0.028587 v -0.027786 -0.013135 -0.028661 v -0.027786 -0.012905 -0.028661 v -0.027809 -0.013135 -0.028739 v -0.027809 -0.012905 -0.028739 v -0.027826 -0.013135 -0.028820 v -0.027826 -0.012905 -0.028820 v -0.027835 -0.013135 -0.028905 v -0.027835 -0.012905 -0.028905 v -0.027837 -0.013135 -0.029006 v -0.027837 -0.012905 -0.029006 v -0.028084 -0.013135 -0.028825 v -0.028084 -0.012905 -0.028825 v -0.028070 -0.013135 -0.028728 v -0.028070 -0.012905 -0.028728 v -0.028047 -0.013135 -0.028631 v -0.028047 -0.012905 -0.028631 v -0.028014 -0.013135 -0.028535 v -0.028014 -0.012905 -0.028535 v -0.027966 -0.013135 -0.028428 v -0.027966 -0.012905 -0.028428 v -0.027913 -0.013135 -0.028334 v -0.027913 -0.012905 -0.028334 v -0.027842 -0.013135 -0.028229 v -0.027842 -0.012905 -0.028229 v -0.027775 -0.013135 -0.028145 v -0.027775 -0.012905 -0.028145 v -0.027714 -0.013135 -0.028081 v -0.027714 -0.012905 -0.028081 v -0.027649 -0.013135 -0.028026 v -0.027649 -0.012905 -0.028026 v -0.027592 -0.013135 -0.027985 v -0.027592 -0.012905 -0.027985 v -0.027533 -0.013135 -0.027951 v -0.027533 -0.012905 -0.027951 v -0.027472 -0.013135 -0.027923 v -0.027472 -0.012905 -0.027923 v -0.027420 -0.013135 -0.027905 v -0.027420 -0.012905 -0.027905 v -0.027367 -0.013135 -0.027890 v -0.027367 -0.012905 -0.027890 v -0.027302 -0.013135 -0.027880 v -0.027302 -0.012905 -0.027880 v -0.027239 -0.013135 -0.027875 v -0.027239 -0.012905 -0.027875 v -0.027187 -0.013135 -0.027877 v -0.027187 -0.012905 -0.027877 v -0.027136 -0.013135 -0.027883 v -0.027136 -0.012905 -0.027883 v -0.027086 -0.013135 -0.027893 v -0.027086 -0.012905 -0.027893 v -0.027036 -0.013135 -0.027909 v -0.027036 -0.012905 -0.027909 v -0.026978 -0.013135 -0.027933 v -0.026978 -0.012905 -0.027933 v -0.026920 -0.013135 -0.027964 v -0.026920 -0.012905 -0.027964 v -0.026864 -0.013135 -0.028001 v -0.026864 -0.012905 -0.028001 v -0.026783 -0.013135 -0.028067 v -0.026783 -0.012905 -0.028067 v -0.026728 -0.013135 -0.028123 v -0.026728 -0.012905 -0.028123 v -0.026680 -0.013135 -0.028182 v -0.026680 -0.012905 -0.028182 v -0.026641 -0.013135 -0.028244 v -0.026641 -0.012905 -0.028244 v -0.026617 -0.013135 -0.028292 v -0.026617 -0.012905 -0.028292 v -0.026597 -0.013135 -0.028341 v -0.026597 -0.012905 -0.028341 v -0.026582 -0.013135 -0.028392 v -0.026582 -0.012905 -0.028392 v -0.026572 -0.013135 -0.028445 v -0.026572 -0.012905 -0.028445 v -0.026565 -0.013135 -0.028518 v -0.026565 -0.012905 -0.028518 v -0.026567 -0.013135 -0.028593 v -0.026567 -0.012905 -0.028593 v -0.026576 -0.013135 -0.028671 v -0.026576 -0.012905 -0.028671 v -0.026594 -0.013135 -0.028752 v -0.026594 -0.012905 -0.028752 v -0.026628 -0.013135 -0.028857 v -0.026628 -0.012905 -0.028857 v -0.026622 -0.013135 -0.028862 v -0.026622 -0.012905 -0.028862 v -0.026557 -0.013135 -0.028796 v -0.026557 -0.012905 -0.028796 v -0.026498 -0.013135 -0.028745 v -0.026498 -0.012905 -0.028745 v -0.026438 -0.013135 -0.028702 v -0.026438 -0.012905 -0.028702 v -0.026375 -0.013135 -0.028667 v -0.026375 -0.012905 -0.028667 v -0.026320 -0.013135 -0.028642 v -0.026320 -0.012905 -0.028642 v -0.026263 -0.013135 -0.028623 v -0.026263 -0.012905 -0.028623 v -0.026225 -0.013135 -0.028613 v -0.026225 -0.012905 -0.028613 v -0.026175 -0.013135 -0.028604 v -0.026175 -0.012905 -0.028604 v -0.026116 -0.013135 -0.028598 v -0.026116 -0.012905 -0.028598 v -0.026058 -0.013135 -0.028598 v -0.026058 -0.012905 -0.028598 v -0.026001 -0.013135 -0.028604 v -0.026001 -0.012905 -0.028604 v -0.025945 -0.013135 -0.028615 v -0.025945 -0.012905 -0.028615 v -0.025889 -0.013135 -0.028631 v -0.025889 -0.012905 -0.028631 v -0.025835 -0.013135 -0.028653 v -0.025835 -0.012905 -0.028653 v -0.025781 -0.013135 -0.028681 v -0.025781 -0.012905 -0.028681 v -0.025746 -0.013135 -0.028703 v -0.025746 -0.012905 -0.028703 v -0.025711 -0.013135 -0.028727 v -0.025711 -0.012905 -0.028727 v -0.025644 -0.013135 -0.028781 v -0.025644 -0.012905 -0.028781 v -0.025584 -0.013135 -0.028839 v -0.025584 -0.012905 -0.028839 v -0.025532 -0.013135 -0.028901 v -0.025532 -0.012905 -0.028901 v -0.025495 -0.013135 -0.028955 v -0.025495 -0.012905 -0.028955 v -0.025463 -0.013135 -0.029012 v -0.025463 -0.012905 -0.029012 v -0.025436 -0.013135 -0.029071 v -0.025436 -0.012905 -0.029071 v -0.025415 -0.013135 -0.029133 v -0.025415 -0.012905 -0.029133 v -0.025400 -0.013135 -0.029198 v -0.025400 -0.012905 -0.029198 v -0.025393 -0.013135 -0.029238 v -0.025393 -0.012905 -0.029238 v -0.025387 -0.013135 -0.029293 v -0.025387 -0.012905 -0.029293 v -0.025385 -0.013135 -0.029376 v -0.025385 -0.012905 -0.029376 v -0.025391 -0.013135 -0.029460 v -0.025391 -0.012905 -0.029460 v -0.025405 -0.013135 -0.029544 v -0.025405 -0.012905 -0.029544 v -0.025427 -0.013135 -0.029627 v -0.025427 -0.012905 -0.029627 v -0.025463 -0.013135 -0.029725 v -0.025463 -0.012905 -0.029725 v -0.025511 -0.013135 -0.029823 v -0.025511 -0.012905 -0.029823 v -0.025560 -0.013135 -0.029907 v -0.025560 -0.012905 -0.029907 v -0.025617 -0.013135 -0.029991 v -0.025617 -0.012905 -0.029991 v -0.025720 -0.013135 -0.030119 v -0.025720 -0.012905 -0.030119 v -0.025806 -0.013135 -0.030209 v -0.025806 -0.012905 -0.030209 v -0.025884 -0.013135 -0.030276 v -0.025884 -0.012905 -0.030276 v -0.025963 -0.013135 -0.030333 v -0.025963 -0.012905 -0.030333 v -0.026033 -0.013135 -0.030374 v -0.026033 -0.012905 -0.030374 v -0.026063 -0.013135 -0.030389 v -0.026063 -0.012905 -0.030389 v -0.025059 -0.013135 -0.028474 v -0.025059 -0.012905 -0.028474 v -0.024790 -0.012905 -0.028671 v -0.024790 -0.013135 -0.028671 v -0.024951 -0.013135 -0.028427 v -0.024951 -0.012905 -0.028427 v -0.024852 -0.013135 -0.028373 v -0.024852 -0.012905 -0.028373 v -0.024772 -0.013135 -0.028318 v -0.024772 -0.012905 -0.028318 v -0.024699 -0.013135 -0.028258 v -0.024699 -0.012905 -0.028258 v -0.024633 -0.013135 -0.028192 v -0.024633 -0.012905 -0.028192 v -0.024603 -0.013135 -0.028157 v -0.024603 -0.012905 -0.028157 v -0.024574 -0.013135 -0.028120 v -0.024574 -0.012905 -0.028120 v -0.024524 -0.013135 -0.028044 v -0.024524 -0.012905 -0.028044 v -0.024489 -0.013135 -0.027978 v -0.024489 -0.012905 -0.027978 v -0.024462 -0.013135 -0.027912 v -0.024462 -0.012905 -0.027912 v -0.024444 -0.013135 -0.027855 v -0.024444 -0.012905 -0.027855 v -0.024433 -0.013135 -0.027798 v -0.024433 -0.012905 -0.027798 v -0.024427 -0.013135 -0.027740 v -0.024427 -0.012905 -0.027740 v -0.024426 -0.013135 -0.027692 v -0.024426 -0.012905 -0.027692 v -0.024430 -0.013135 -0.027644 v -0.024430 -0.012905 -0.027644 v -0.024439 -0.013135 -0.027588 v -0.024439 -0.012905 -0.027588 v -0.024451 -0.013135 -0.027542 v -0.024451 -0.012905 -0.027542 v -0.024467 -0.013135 -0.027498 v -0.024467 -0.012905 -0.027498 v -0.024487 -0.013135 -0.027456 v -0.024487 -0.012905 -0.027456 v -0.024511 -0.013135 -0.027415 v -0.024511 -0.012905 -0.027415 v -0.024544 -0.013135 -0.027369 v -0.024544 -0.012905 -0.027369 v -0.024583 -0.013135 -0.027325 v -0.024583 -0.012905 -0.027325 v -0.024627 -0.013135 -0.027283 v -0.024627 -0.012905 -0.027283 v -0.024677 -0.013135 -0.027243 v -0.024677 -0.012905 -0.027243 v -0.024738 -0.013135 -0.027202 v -0.024738 -0.012905 -0.027202 v -0.024791 -0.013135 -0.027175 v -0.024791 -0.012905 -0.027175 v -0.024844 -0.013135 -0.027153 v -0.024844 -0.012905 -0.027153 v -0.024889 -0.013135 -0.027140 v -0.024889 -0.012905 -0.027140 v -0.024933 -0.013135 -0.027131 v -0.024933 -0.012905 -0.027131 v -0.024978 -0.013135 -0.027126 v -0.024978 -0.012905 -0.027126 v -0.025024 -0.013135 -0.027126 v -0.025024 -0.012905 -0.027126 v -0.025069 -0.013135 -0.027130 v -0.025069 -0.012905 -0.027130 v -0.025096 -0.013135 -0.027135 v -0.025096 -0.012905 -0.027135 v -0.025124 -0.013135 -0.027141 v -0.025124 -0.012905 -0.027141 v -0.025170 -0.013135 -0.027154 v -0.025170 -0.012905 -0.027154 v -0.025223 -0.013135 -0.027176 v -0.025223 -0.012905 -0.027176 v -0.025277 -0.013135 -0.027205 v -0.025277 -0.012905 -0.027205 v -0.025329 -0.013135 -0.027239 v -0.025329 -0.012905 -0.027239 v -0.025389 -0.013135 -0.027287 v -0.025389 -0.012905 -0.027287 v -0.025456 -0.013135 -0.027353 v -0.025456 -0.012905 -0.027353 v -0.025505 -0.013135 -0.027409 v -0.025505 -0.012905 -0.027409 v -0.025554 -0.013135 -0.027471 v -0.025554 -0.012905 -0.027471 v -0.025789 -0.013135 -0.027832 v -0.025789 -0.012905 -0.027832 v -0.026900 -0.013135 -0.027019 v -0.026900 -0.012905 -0.027019 v -0.026115 -0.013135 -0.025948 v -0.026115 -0.012905 -0.025948 v -0.025886 -0.013135 -0.026115 v -0.025886 -0.012905 -0.026115 v -0.026496 -0.013135 -0.026947 v -0.026496 -0.012905 -0.026947 v -0.025847 -0.013135 -0.027422 v -0.025847 -0.012905 -0.027422 v -0.025715 -0.013135 -0.027229 v -0.025715 -0.012905 -0.027229 v -0.025620 -0.013135 -0.027111 v -0.025620 -0.012905 -0.027111 v -0.025543 -0.013135 -0.027032 v -0.025543 -0.012905 -0.027032 v -0.025463 -0.013135 -0.026964 v -0.025463 -0.012905 -0.026964 v -0.025393 -0.013135 -0.026915 v -0.025393 -0.012905 -0.026915 v -0.025322 -0.013135 -0.026875 v -0.025322 -0.012905 -0.026875 v -0.025248 -0.013135 -0.026843 v -0.025248 -0.012905 -0.026843 v -0.025198 -0.013135 -0.026826 v -0.025198 -0.012905 -0.026826 v -0.025135 -0.013135 -0.026810 v -0.025135 -0.012905 -0.026810 v -0.025071 -0.013135 -0.026800 v -0.025071 -0.012905 -0.026800 v -0.025007 -0.013135 -0.026796 v -0.025007 -0.012905 -0.026796 v -0.024943 -0.013135 -0.026798 v -0.024943 -0.012905 -0.026798 v -0.024880 -0.013135 -0.026806 v -0.024880 -0.012905 -0.026806 v -0.024816 -0.013135 -0.026819 v -0.024816 -0.012905 -0.026819 v -0.024741 -0.013135 -0.026843 v -0.024741 -0.012905 -0.026843 v -0.024666 -0.013135 -0.026875 v -0.024666 -0.012905 -0.026875 v -0.024591 -0.013135 -0.026916 v -0.024591 -0.012905 -0.026916 v -0.024503 -0.013135 -0.026974 v -0.024503 -0.012905 -0.026974 v -0.024419 -0.013135 -0.027042 v -0.024419 -0.012905 -0.027042 v -0.024355 -0.013135 -0.027104 v -0.024355 -0.012905 -0.027104 v -0.024300 -0.013135 -0.027169 v -0.024300 -0.012905 -0.027169 v -0.024252 -0.013135 -0.027238 v -0.024252 -0.012905 -0.027238 v -0.024218 -0.013135 -0.027298 v -0.024218 -0.012905 -0.027298 v -0.024190 -0.013135 -0.027361 v -0.024190 -0.012905 -0.027361 v -0.024168 -0.013135 -0.027425 v -0.024168 -0.012905 -0.027425 v -0.024151 -0.013135 -0.027492 v -0.024151 -0.012905 -0.027492 v -0.024139 -0.013135 -0.027562 v -0.024139 -0.012905 -0.027562 v -0.024134 -0.013135 -0.027632 v -0.024134 -0.012905 -0.027632 v -0.024136 -0.013135 -0.027718 v -0.024136 -0.012905 -0.027718 v -0.024146 -0.013135 -0.027803 v -0.024146 -0.012905 -0.027803 v -0.024166 -0.013135 -0.027889 v -0.024166 -0.012905 -0.027889 v -0.024194 -0.013135 -0.027975 v -0.024194 -0.012905 -0.027975 v -0.024238 -0.013135 -0.028076 v -0.024238 -0.012905 -0.028076 v -0.024295 -0.013135 -0.028177 v -0.024295 -0.012905 -0.028177 v -0.024363 -0.013135 -0.028279 v -0.024363 -0.012905 -0.028279 v -0.024479 -0.013135 -0.028424 v -0.024479 -0.012905 -0.028424 v -0.024566 -0.013135 -0.028515 v -0.024566 -0.012905 -0.028515 v -0.024642 -0.013135 -0.028581 v -0.024642 -0.012905 -0.028581 v -0.024700 -0.013135 -0.028623 v -0.024700 -0.012905 -0.028623 v -0.024742 -0.013135 -0.028647 v -0.024742 -0.012905 -0.028647 v -0.020762 -0.013229 -0.017321 v -0.020659 -0.013229 -0.017522 v -0.015397 -0.013229 -0.017399 v -0.015401 -0.013229 -0.017197 v -0.020659 -0.013026 -0.017522 v -0.015397 -0.013026 -0.017399 v -0.020762 -0.013026 -0.017321 v -0.015401 -0.013026 -0.017197 v -0.023361 -0.013229 -0.020749 v -0.023199 -0.013229 -0.020872 v -0.023199 -0.013026 -0.020872 v -0.023361 -0.013026 -0.020749 v -0.015397 -0.013229 -0.017399 v -0.015397 -0.013026 -0.017399 v -0.015401 -0.013026 -0.017197 v -0.015401 -0.013229 -0.017197 v -0.023199 -0.013026 -0.020872 v -0.023199 -0.013229 -0.020872 v -0.023361 -0.013229 -0.020749 v -0.023361 -0.013026 -0.020749 v -0.020345 -0.013135 -0.022625 v -0.020345 -0.012905 -0.022625 v -0.019368 -0.012905 -0.021291 v -0.019368 -0.013135 -0.021291 v -0.020571 -0.013135 -0.022460 v -0.020571 -0.012905 -0.022460 v -0.020745 -0.013135 -0.021341 v -0.020745 -0.012905 -0.021341 v -0.020825 -0.013135 -0.020925 v -0.020825 -0.012905 -0.020925 v -0.020861 -0.013135 -0.020796 v -0.020861 -0.012905 -0.020796 v -0.020898 -0.013135 -0.020687 v -0.020898 -0.012905 -0.020687 v -0.020933 -0.013135 -0.020608 v -0.020933 -0.012905 -0.020608 v -0.020969 -0.013135 -0.020543 v -0.020969 -0.012905 -0.020543 v -0.021010 -0.013135 -0.020483 v -0.021010 -0.012905 -0.020483 v -0.021056 -0.013135 -0.020427 v -0.021056 -0.012905 -0.020427 v -0.021108 -0.013135 -0.020376 v -0.021108 -0.012905 -0.020376 v -0.021135 -0.013135 -0.020352 v -0.021135 -0.012905 -0.020352 v -0.021172 -0.013135 -0.020323 v -0.021172 -0.012905 -0.020323 v -0.021233 -0.013135 -0.020283 v -0.021233 -0.012905 -0.020283 v -0.021286 -0.013135 -0.020255 v -0.021286 -0.012905 -0.020255 v -0.021332 -0.013135 -0.020236 v -0.021332 -0.012905 -0.020236 v -0.021377 -0.013135 -0.020222 v -0.021377 -0.012905 -0.020222 v -0.021414 -0.013135 -0.020215 v -0.021414 -0.012905 -0.020215 v -0.021452 -0.013135 -0.020211 v -0.021452 -0.012905 -0.020211 v -0.021489 -0.013135 -0.020210 v -0.021489 -0.012905 -0.020210 v -0.021519 -0.013135 -0.020212 v -0.021519 -0.012905 -0.020212 v -0.021549 -0.013135 -0.020216 v -0.021549 -0.012905 -0.020216 v -0.021585 -0.013135 -0.020224 v -0.021585 -0.012905 -0.020224 v -0.021621 -0.013135 -0.020236 v -0.021621 -0.012905 -0.020236 v -0.021656 -0.013135 -0.020251 v -0.021656 -0.012905 -0.020251 v -0.021698 -0.013135 -0.020273 v -0.021698 -0.012905 -0.020273 v -0.021738 -0.013135 -0.020301 v -0.021738 -0.012905 -0.020301 v -0.021777 -0.013135 -0.020333 v -0.021777 -0.012905 -0.020333 v -0.021821 -0.013135 -0.020377 v -0.021821 -0.012905 -0.020377 v -0.021852 -0.013135 -0.020412 v -0.021852 -0.012905 -0.020412 v -0.021882 -0.013135 -0.020451 v -0.021882 -0.012905 -0.020451 v -0.021930 -0.013135 -0.020524 v -0.021930 -0.012905 -0.020524 v -0.021970 -0.013135 -0.020603 v -0.021970 -0.012905 -0.020603 v -0.022003 -0.013135 -0.020685 v -0.022003 -0.012905 -0.020685 v -0.022028 -0.013135 -0.020772 v -0.022028 -0.012905 -0.020772 v -0.022045 -0.013135 -0.020865 v -0.022045 -0.012905 -0.020865 v -0.022055 -0.013135 -0.020978 v -0.022055 -0.012905 -0.020978 v -0.022055 -0.013135 -0.021080 v -0.022055 -0.012905 -0.021080 v -0.022045 -0.013135 -0.021205 v -0.022045 -0.012905 -0.021205 v -0.022310 -0.013135 -0.021010 v -0.022310 -0.012905 -0.021010 v -0.022309 -0.013135 -0.020897 v -0.022309 -0.012905 -0.020897 v -0.022297 -0.013135 -0.020787 v -0.022297 -0.012905 -0.020787 v -0.022274 -0.013135 -0.020679 v -0.022274 -0.012905 -0.020679 v -0.022241 -0.013135 -0.020574 v -0.022241 -0.012905 -0.020574 v -0.022198 -0.013135 -0.020471 v -0.022198 -0.012905 -0.020471 v -0.022144 -0.013135 -0.020370 v -0.022144 -0.012905 -0.020370 v -0.022071 -0.013135 -0.020258 v -0.022071 -0.012905 -0.020258 v -0.021999 -0.013135 -0.020170 v -0.021999 -0.012905 -0.020170 v -0.021934 -0.013135 -0.020102 v -0.021934 -0.012905 -0.020102 v -0.021866 -0.013135 -0.020045 v -0.021866 -0.012905 -0.020045 v -0.021806 -0.013135 -0.020003 v -0.021806 -0.012905 -0.020003 v -0.021744 -0.013135 -0.019968 v -0.021744 -0.012905 -0.019968 v -0.021680 -0.013135 -0.019940 v -0.021680 -0.012905 -0.019940 v -0.021625 -0.013135 -0.019923 v -0.021625 -0.012905 -0.019923 v -0.021568 -0.013135 -0.019910 v -0.021568 -0.012905 -0.019910 v -0.021500 -0.013135 -0.019901 v -0.021500 -0.012905 -0.019901 v -0.021444 -0.013135 -0.019899 v -0.021444 -0.012905 -0.019899 v -0.021388 -0.013135 -0.019902 v -0.021388 -0.012905 -0.019902 v -0.021332 -0.013135 -0.019910 v -0.021332 -0.012905 -0.019910 v -0.021265 -0.013135 -0.019926 v -0.021265 -0.012905 -0.019926 v -0.021199 -0.013135 -0.019950 v -0.021199 -0.012905 -0.019950 v -0.021133 -0.013135 -0.019980 v -0.021133 -0.012905 -0.019980 v -0.021078 -0.013135 -0.020011 v -0.021078 -0.012905 -0.020011 v -0.021013 -0.013135 -0.020055 v -0.021013 -0.012905 -0.020055 v -0.020948 -0.013135 -0.020108 v -0.020948 -0.012905 -0.020108 v -0.020887 -0.013135 -0.020166 v -0.020887 -0.012905 -0.020166 v -0.020824 -0.013135 -0.020239 v -0.020824 -0.012905 -0.020239 v -0.020768 -0.013135 -0.020318 v -0.020768 -0.012905 -0.020318 v -0.020723 -0.013135 -0.020395 v -0.020723 -0.012905 -0.020395 v -0.020683 -0.013135 -0.020477 v -0.020683 -0.012905 -0.020477 v -0.020633 -0.013135 -0.020607 v -0.020633 -0.012905 -0.020607 v -0.020557 -0.013135 -0.020890 v -0.020557 -0.012905 -0.020890 v -0.020488 -0.013135 -0.021268 v -0.020488 -0.012905 -0.021268 v -0.020357 -0.013135 -0.022149 v -0.020357 -0.012905 -0.022149 v -0.020351 -0.013135 -0.022153 v -0.020351 -0.012905 -0.022153 v -0.019597 -0.013135 -0.021124 v -0.019597 -0.012905 -0.021124 v -0.019343 -0.013135 -0.020579 v -0.019343 -0.012905 -0.020579 v -0.019074 -0.012905 -0.020776 v -0.019074 -0.013135 -0.020776 v -0.019235 -0.013135 -0.020532 v -0.019235 -0.012905 -0.020532 v -0.019136 -0.013135 -0.020478 v -0.019136 -0.012905 -0.020478 v -0.019055 -0.013135 -0.020424 v -0.019055 -0.012905 -0.020424 v -0.018982 -0.013135 -0.020363 v -0.018982 -0.012905 -0.020363 v -0.018916 -0.013135 -0.020297 v -0.018916 -0.012905 -0.020297 v -0.018886 -0.013135 -0.020262 v -0.018886 -0.012905 -0.020262 v -0.018858 -0.013135 -0.020225 v -0.018858 -0.012905 -0.020225 v -0.018808 -0.013135 -0.020150 v -0.018808 -0.012905 -0.020150 v -0.018773 -0.013135 -0.020083 v -0.018773 -0.012905 -0.020083 v -0.018745 -0.013135 -0.020017 v -0.018745 -0.012905 -0.020017 v -0.018728 -0.013135 -0.019960 v -0.018728 -0.012905 -0.019960 v -0.018716 -0.013135 -0.019903 v -0.018716 -0.012905 -0.019903 v -0.018711 -0.013135 -0.019845 v -0.018711 -0.012905 -0.019845 v -0.018710 -0.013135 -0.019797 v -0.018710 -0.012905 -0.019797 v -0.018714 -0.013135 -0.019749 v -0.018714 -0.012905 -0.019749 v -0.018723 -0.013135 -0.019693 v -0.018723 -0.012905 -0.019693 v -0.018735 -0.013135 -0.019647 v -0.018735 -0.012905 -0.019647 v -0.018751 -0.013135 -0.019603 v -0.018751 -0.012905 -0.019603 v -0.018771 -0.013135 -0.019561 v -0.018771 -0.012905 -0.019561 v -0.018794 -0.013135 -0.019521 v -0.018794 -0.012905 -0.019521 v -0.018827 -0.013135 -0.019474 v -0.018827 -0.012905 -0.019474 v -0.018866 -0.013135 -0.019430 v -0.018866 -0.012905 -0.019430 v -0.018911 -0.013135 -0.019388 v -0.018911 -0.012905 -0.019388 v -0.018960 -0.013135 -0.019348 v -0.018960 -0.012905 -0.019348 v -0.019022 -0.013135 -0.019307 v -0.019022 -0.012905 -0.019307 v -0.019074 -0.013135 -0.019280 v -0.019074 -0.012905 -0.019280 v -0.019128 -0.013135 -0.019258 v -0.019128 -0.012905 -0.019258 v -0.019172 -0.013135 -0.019245 v -0.019172 -0.012905 -0.019245 v -0.019217 -0.013135 -0.019236 v -0.019217 -0.012905 -0.019236 v -0.019262 -0.013135 -0.019231 v -0.019262 -0.012905 -0.019231 v -0.019307 -0.013135 -0.019231 v -0.019307 -0.012905 -0.019231 v -0.019353 -0.013135 -0.019235 v -0.019353 -0.012905 -0.019235 v -0.019380 -0.013135 -0.019240 v -0.019380 -0.012905 -0.019240 v -0.019408 -0.013135 -0.019246 v -0.019408 -0.012905 -0.019246 v -0.019453 -0.013135 -0.019259 v -0.019453 -0.012905 -0.019259 v -0.019507 -0.013135 -0.019281 v -0.019507 -0.012905 -0.019281 v -0.019560 -0.013135 -0.019310 v -0.019560 -0.012905 -0.019310 v -0.019612 -0.013135 -0.019344 v -0.019612 -0.012905 -0.019344 v -0.019672 -0.013135 -0.019392 v -0.019672 -0.012905 -0.019392 v -0.019739 -0.013135 -0.019458 v -0.019739 -0.012905 -0.019458 v -0.019789 -0.013135 -0.019514 v -0.019789 -0.012905 -0.019514 v -0.019837 -0.013135 -0.019576 v -0.019837 -0.012905 -0.019576 v -0.020073 -0.013135 -0.019937 v -0.020073 -0.012905 -0.019937 v -0.021183 -0.013135 -0.019124 v -0.021183 -0.012905 -0.019124 v -0.020398 -0.013135 -0.018053 v -0.020398 -0.012905 -0.018053 v -0.020170 -0.013135 -0.018220 v -0.020170 -0.012905 -0.018220 v -0.020779 -0.013135 -0.019052 v -0.020779 -0.012905 -0.019052 v -0.020131 -0.013135 -0.019527 v -0.020131 -0.012905 -0.019527 v -0.019999 -0.013135 -0.019334 v -0.019999 -0.012905 -0.019334 v -0.019903 -0.013135 -0.019216 v -0.019903 -0.012905 -0.019216 v -0.019826 -0.013135 -0.019137 v -0.019826 -0.012905 -0.019137 v -0.019747 -0.013135 -0.019069 v -0.019747 -0.012905 -0.019069 v -0.019677 -0.013135 -0.019020 v -0.019677 -0.012905 -0.019020 v -0.019605 -0.013135 -0.018980 v -0.019605 -0.012905 -0.018980 v -0.019532 -0.013135 -0.018948 v -0.019532 -0.012905 -0.018948 v -0.019482 -0.013135 -0.018931 v -0.019482 -0.012905 -0.018931 v -0.019418 -0.013135 -0.018915 v -0.019418 -0.012905 -0.018915 v -0.019354 -0.013135 -0.018905 v -0.019354 -0.012905 -0.018905 v -0.019290 -0.013135 -0.018901 v -0.019290 -0.012905 -0.018901 v -0.019227 -0.013135 -0.018903 v -0.019227 -0.012905 -0.018903 v -0.019163 -0.013135 -0.018911 v -0.019163 -0.012905 -0.018911 v -0.019100 -0.013135 -0.018924 v -0.019100 -0.012905 -0.018924 v -0.019024 -0.013135 -0.018948 v -0.019024 -0.012905 -0.018948 v -0.018949 -0.013135 -0.018980 v -0.018949 -0.012905 -0.018980 v -0.018874 -0.013135 -0.019021 v -0.018874 -0.012905 -0.019021 v -0.018787 -0.013135 -0.019079 v -0.018787 -0.012905 -0.019079 v -0.018703 -0.013135 -0.019147 v -0.018703 -0.012905 -0.019147 v -0.018639 -0.013135 -0.019209 v -0.018639 -0.012905 -0.019209 v -0.018583 -0.013135 -0.019274 v -0.018583 -0.012905 -0.019274 v -0.018535 -0.013135 -0.019343 v -0.018535 -0.012905 -0.019343 v -0.018502 -0.013135 -0.019403 v -0.018502 -0.012905 -0.019403 v -0.018474 -0.013135 -0.019466 v -0.018474 -0.012905 -0.019466 v -0.018451 -0.013135 -0.019530 v -0.018451 -0.012905 -0.019530 v -0.018434 -0.013135 -0.019597 v -0.018434 -0.012905 -0.019597 v -0.018423 -0.013135 -0.019667 v -0.018423 -0.012905 -0.019667 v -0.018418 -0.013135 -0.019737 v -0.018418 -0.012905 -0.019737 v -0.018419 -0.013135 -0.019822 v -0.018419 -0.012905 -0.019822 v -0.018430 -0.013135 -0.019908 v -0.018430 -0.012905 -0.019908 v -0.018449 -0.013135 -0.019994 v -0.018449 -0.012905 -0.019994 v -0.018477 -0.013135 -0.020080 v -0.018477 -0.012905 -0.020080 v -0.018522 -0.013135 -0.020181 v -0.018522 -0.012905 -0.020181 v -0.018578 -0.013135 -0.020282 v -0.018578 -0.012905 -0.020282 v -0.018647 -0.013135 -0.020384 v -0.018647 -0.012905 -0.020384 v -0.018762 -0.013135 -0.020529 v -0.018762 -0.012905 -0.020529 v -0.018849 -0.013135 -0.020620 v -0.018849 -0.012905 -0.020620 v -0.018926 -0.013135 -0.020686 v -0.018926 -0.012905 -0.020686 v -0.018984 -0.013135 -0.020728 v -0.018984 -0.012905 -0.020728 v -0.019025 -0.013135 -0.020752 v -0.019025 -0.012905 -0.020752 v -0.014943 -0.013229 -0.009212 v -0.014841 -0.013229 -0.009412 v -0.009579 -0.013229 -0.009290 v -0.009583 -0.013229 -0.009087 v -0.014841 -0.013026 -0.009412 v -0.009579 -0.013026 -0.009290 v -0.014943 -0.013026 -0.009212 v -0.009583 -0.013026 -0.009087 v -0.017542 -0.013229 -0.012640 v -0.017381 -0.013229 -0.012762 v -0.017381 -0.013026 -0.012762 v -0.017542 -0.013026 -0.012640 v -0.009579 -0.013229 -0.009290 v -0.009579 -0.013026 -0.009290 v -0.009583 -0.013026 -0.009087 v -0.009583 -0.013229 -0.009087 v -0.017381 -0.013026 -0.012762 v -0.017381 -0.013229 -0.012762 v -0.017542 -0.013229 -0.012640 v -0.017542 -0.013026 -0.012640 v -0.014477 -0.013152 -0.014447 v -0.014477 -0.012760 -0.014447 v -0.013560 -0.012760 -0.013195 v -0.013560 -0.013152 -0.013195 v -0.014699 -0.013152 -0.014284 v -0.014699 -0.012760 -0.014284 v -0.014333 -0.013152 -0.013784 v -0.014333 -0.012760 -0.013784 v -0.016053 -0.013152 -0.012524 v -0.016053 -0.012760 -0.012524 v -0.016276 -0.013152 -0.013149 v -0.016276 -0.012760 -0.013149 v -0.016517 -0.013152 -0.012973 v -0.016517 -0.012760 -0.012973 v -0.016189 -0.013152 -0.012036 v -0.016189 -0.012760 -0.012036 v -0.014148 -0.013152 -0.013531 v -0.014148 -0.012760 -0.013531 v -0.013782 -0.013152 -0.013032 v -0.013782 -0.012760 -0.013032 v -0.013565 -0.013152 -0.012525 v -0.013565 -0.012760 -0.012525 v -0.013296 -0.012760 -0.012722 v -0.013296 -0.013152 -0.012722 v -0.013457 -0.013152 -0.012478 v -0.013457 -0.012760 -0.012478 v -0.013358 -0.013152 -0.012424 v -0.013358 -0.012760 -0.012424 v -0.013278 -0.013152 -0.012369 v -0.013278 -0.012760 -0.012369 v -0.013205 -0.013152 -0.012309 v -0.013205 -0.012760 -0.012309 v -0.013139 -0.013152 -0.012243 v -0.013139 -0.012760 -0.012243 v -0.013109 -0.013152 -0.012207 v -0.013109 -0.012760 -0.012207 v -0.013080 -0.013152 -0.012171 v -0.013080 -0.012760 -0.012171 v -0.013030 -0.013152 -0.012095 v -0.013030 -0.012760 -0.012095 v -0.012995 -0.013152 -0.012029 v -0.012995 -0.012760 -0.012029 v -0.012968 -0.013152 -0.011963 v -0.012968 -0.012760 -0.011963 v -0.012950 -0.013152 -0.011906 v -0.012950 -0.012760 -0.011906 v -0.012939 -0.013152 -0.011849 v -0.012939 -0.012760 -0.011849 v -0.012933 -0.013152 -0.011791 v -0.012933 -0.012760 -0.011791 v -0.012932 -0.013152 -0.011743 v -0.012932 -0.012760 -0.011743 v -0.012936 -0.013152 -0.011695 v -0.012936 -0.012760 -0.011695 v -0.012945 -0.013152 -0.011639 v -0.012945 -0.012760 -0.011639 v -0.012957 -0.013152 -0.011593 v -0.012957 -0.012760 -0.011593 v -0.012973 -0.013152 -0.011549 v -0.012973 -0.012760 -0.011549 v -0.012993 -0.013152 -0.011507 v -0.012993 -0.012760 -0.011507 v -0.013017 -0.013152 -0.011466 v -0.013017 -0.012760 -0.011466 v -0.013050 -0.013152 -0.011420 v -0.013050 -0.012760 -0.011420 v -0.013089 -0.013152 -0.011375 v -0.013089 -0.012760 -0.011375 v -0.013133 -0.013152 -0.011333 v -0.013133 -0.012760 -0.011333 v -0.013183 -0.013152 -0.011294 v -0.013183 -0.012760 -0.011294 v -0.013244 -0.013152 -0.011253 v -0.013244 -0.012760 -0.011253 v -0.013297 -0.013152 -0.011226 v -0.013297 -0.012760 -0.011226 v -0.013350 -0.013152 -0.011204 v -0.013350 -0.012760 -0.011204 v -0.013395 -0.013152 -0.011191 v -0.013395 -0.012760 -0.011191 v -0.013439 -0.013152 -0.011182 v -0.013439 -0.012760 -0.011182 v -0.013484 -0.013152 -0.011177 v -0.013484 -0.012760 -0.011177 v -0.013530 -0.013152 -0.011177 v -0.013530 -0.012760 -0.011177 v -0.013575 -0.013152 -0.011181 v -0.013575 -0.012760 -0.011181 v -0.013602 -0.013152 -0.011186 v -0.013602 -0.012760 -0.011186 v -0.013630 -0.013152 -0.011192 v -0.013630 -0.012760 -0.011192 v -0.013676 -0.013152 -0.011205 v -0.013676 -0.012760 -0.011205 v -0.013729 -0.013152 -0.011227 v -0.013729 -0.012760 -0.011227 v -0.013783 -0.013152 -0.011256 v -0.013783 -0.012760 -0.011256 v -0.013835 -0.013152 -0.011290 v -0.013835 -0.012760 -0.011290 v -0.013895 -0.013152 -0.011338 v -0.013895 -0.012760 -0.011338 v -0.013962 -0.013152 -0.011404 v -0.013962 -0.012760 -0.011404 v -0.014011 -0.013152 -0.011460 v -0.014011 -0.012760 -0.011460 v -0.014059 -0.013152 -0.011522 v -0.014059 -0.012760 -0.011522 v -0.014295 -0.013152 -0.011883 v -0.014295 -0.012760 -0.011883 v -0.015406 -0.013152 -0.011070 v -0.015406 -0.012760 -0.011070 v -0.014621 -0.013152 -0.009999 v -0.014621 -0.012760 -0.009999 v -0.014392 -0.013152 -0.010166 v -0.014392 -0.012760 -0.010166 v -0.015002 -0.013152 -0.010998 v -0.015002 -0.012760 -0.010998 v -0.014353 -0.013152 -0.011473 v -0.014353 -0.012760 -0.011473 v -0.014221 -0.013152 -0.011280 v -0.014221 -0.012760 -0.011280 v -0.014126 -0.013152 -0.011162 v -0.014126 -0.012760 -0.011162 v -0.014049 -0.013152 -0.011083 v -0.014049 -0.012760 -0.011083 v -0.013969 -0.013152 -0.011015 v -0.013969 -0.012760 -0.011015 v -0.013899 -0.013152 -0.010966 v -0.013899 -0.012760 -0.010966 v -0.013828 -0.013152 -0.010926 v -0.013828 -0.012760 -0.010926 v -0.013754 -0.013152 -0.010894 v -0.013754 -0.012760 -0.010894 v -0.013704 -0.013152 -0.010877 v -0.013704 -0.012760 -0.010877 v -0.013641 -0.013152 -0.010861 v -0.013641 -0.012760 -0.010861 v -0.013577 -0.013152 -0.010851 v -0.013577 -0.012760 -0.010851 v -0.013513 -0.013152 -0.010847 v -0.013513 -0.012760 -0.010847 v -0.013449 -0.013152 -0.010849 v -0.013449 -0.012760 -0.010849 v -0.013386 -0.013152 -0.010857 v -0.013386 -0.012760 -0.010857 v -0.013322 -0.013152 -0.010870 v -0.013322 -0.012760 -0.010870 v -0.013247 -0.013152 -0.010894 v -0.013247 -0.012760 -0.010894 v -0.013172 -0.013152 -0.010926 v -0.013172 -0.012760 -0.010926 v -0.013097 -0.013152 -0.010967 v -0.013097 -0.012760 -0.010967 v -0.013009 -0.013152 -0.011025 v -0.013009 -0.012760 -0.011025 v -0.012925 -0.013152 -0.011093 v -0.012925 -0.012760 -0.011093 v -0.012861 -0.013152 -0.011155 v -0.012861 -0.012760 -0.011155 v -0.012806 -0.013152 -0.011220 v -0.012806 -0.012760 -0.011220 v -0.012758 -0.013152 -0.011289 v -0.012758 -0.012760 -0.011289 v -0.012724 -0.013152 -0.011349 v -0.012724 -0.012760 -0.011349 v -0.012696 -0.013152 -0.011412 v -0.012696 -0.012760 -0.011412 v -0.012674 -0.013152 -0.011476 v -0.012674 -0.012760 -0.011476 v -0.012657 -0.013152 -0.011543 v -0.012657 -0.012760 -0.011543 v -0.012645 -0.013152 -0.011613 v -0.012645 -0.012760 -0.011613 v -0.012640 -0.013152 -0.011683 v -0.012640 -0.012760 -0.011683 v -0.012642 -0.013152 -0.011769 v -0.012642 -0.012760 -0.011769 v -0.012652 -0.013152 -0.011854 v -0.012652 -0.012760 -0.011854 v -0.012672 -0.013152 -0.011940 v -0.012672 -0.012760 -0.011940 v -0.012700 -0.013152 -0.012026 v -0.012700 -0.012760 -0.012026 v -0.012744 -0.013152 -0.012127 v -0.012744 -0.012760 -0.012127 v -0.012801 -0.013152 -0.012228 v -0.012801 -0.012760 -0.012228 v -0.012869 -0.013152 -0.012330 v -0.012869 -0.012760 -0.012330 v -0.012985 -0.013152 -0.012475 v -0.012985 -0.012760 -0.012475 v -0.013072 -0.013152 -0.012565 v -0.013072 -0.012760 -0.012565 v -0.013148 -0.013152 -0.012632 v -0.013148 -0.012760 -0.012632 v -0.013206 -0.013152 -0.012674 v -0.013206 -0.012760 -0.012674 v -0.013248 -0.013152 -0.012698 v -0.013248 -0.012760 -0.012698 v -0.012845 0.001552 -0.000351 v -0.002979 0.000002 0.001014 v -0.012845 -0.001549 -0.000351 v -0.012877 0.001552 -0.000121 v -0.003011 0.000002 0.001245 v -0.012877 -0.001549 -0.000121 v -0.015002 -0.012760 -0.010998 v -0.015406 -0.012760 -0.011070 v -0.014621 -0.012760 -0.009999 v -0.014295 -0.012760 -0.011883 v -0.014392 -0.012760 -0.010166 v -0.014353 -0.012760 -0.011473 v -0.014221 -0.012760 -0.011280 v -0.014059 -0.012760 -0.011522 v -0.014126 -0.012760 -0.011162 v -0.014049 -0.012760 -0.011083 v -0.014011 -0.012760 -0.011460 v -0.013969 -0.012760 -0.011015 v -0.013962 -0.012760 -0.011404 v -0.013899 -0.012760 -0.010966 v -0.013895 -0.012760 -0.011338 v -0.013828 -0.012760 -0.010926 v -0.013835 -0.012760 -0.011290 v -0.013783 -0.012760 -0.011256 v -0.013754 -0.012760 -0.010894 v -0.013729 -0.012760 -0.011227 v -0.013704 -0.012760 -0.010877 v -0.013676 -0.012760 -0.011205 v -0.013641 -0.012760 -0.010861 v -0.013630 -0.012760 -0.011192 v -0.013577 -0.012760 -0.010851 v -0.013602 -0.012760 -0.011186 v -0.013575 -0.012760 -0.011181 v -0.013513 -0.012760 -0.010847 v -0.013530 -0.012760 -0.011177 v -0.013296 -0.012760 -0.012722 v -0.013565 -0.012760 -0.012525 v -0.013457 -0.012760 -0.012478 v -0.013484 -0.012760 -0.011177 v -0.013449 -0.012760 -0.010849 v -0.013439 -0.012760 -0.011182 v -0.013358 -0.012760 -0.012424 v -0.013386 -0.012760 -0.010857 v -0.013395 -0.012760 -0.011191 v -0.013350 -0.012760 -0.011204 v -0.013322 -0.012760 -0.010870 v -0.013278 -0.012760 -0.012369 v -0.013297 -0.012760 -0.011226 v -0.013247 -0.012760 -0.010894 v -0.013244 -0.012760 -0.011253 v -0.013248 -0.012760 -0.012698 v -0.013205 -0.012760 -0.012309 v -0.013206 -0.012760 -0.012674 v -0.013172 -0.012760 -0.010926 v -0.013183 -0.012760 -0.011294 v -0.013148 -0.012760 -0.012632 v -0.013139 -0.012760 -0.012243 v -0.013133 -0.012760 -0.011333 v -0.013097 -0.012760 -0.010967 v -0.013072 -0.012760 -0.012565 v -0.013109 -0.012760 -0.012207 v -0.013089 -0.012760 -0.011375 v -0.013080 -0.012760 -0.012171 v -0.013009 -0.012760 -0.011025 v -0.013050 -0.012760 -0.011420 v -0.013030 -0.012760 -0.012095 v -0.012985 -0.012760 -0.012475 v -0.013017 -0.012760 -0.011466 v -0.012995 -0.012760 -0.012029 v -0.012993 -0.012760 -0.011507 v -0.012925 -0.012760 -0.011093 v -0.012968 -0.012760 -0.011963 v -0.012973 -0.012760 -0.011549 v -0.012869 -0.012760 -0.012330 v -0.012957 -0.012760 -0.011593 v -0.012950 -0.012760 -0.011906 v -0.012945 -0.012760 -0.011639 v -0.012939 -0.012760 -0.011849 v -0.012936 -0.012760 -0.011695 v -0.012933 -0.012760 -0.011791 v -0.012932 -0.012760 -0.011743 v -0.012861 -0.012760 -0.011155 v -0.012801 -0.012760 -0.012228 v -0.012806 -0.012760 -0.011220 v -0.012758 -0.012760 -0.011289 v -0.012744 -0.012760 -0.012127 v -0.012724 -0.012760 -0.011349 v -0.012700 -0.012760 -0.012026 v -0.012696 -0.012760 -0.011412 v -0.012672 -0.012760 -0.011940 v -0.012674 -0.012760 -0.011476 v -0.012657 -0.012760 -0.011543 v -0.012652 -0.012760 -0.011854 v -0.012645 -0.012760 -0.011613 v -0.012642 -0.012760 -0.011769 v -0.012640 -0.012760 -0.011683 v -0.016276 -0.012760 -0.013149 v -0.016517 -0.012760 -0.012973 v -0.016189 -0.012760 -0.012036 v -0.016053 -0.012760 -0.012524 v -0.014148 -0.012760 -0.013531 v -0.014333 -0.012760 -0.013784 v -0.014477 -0.012760 -0.014447 v -0.014699 -0.012760 -0.014284 v -0.013560 -0.012760 -0.013195 v -0.013782 -0.012760 -0.013032 v -0.014621 -0.013152 -0.009999 v -0.015406 -0.013152 -0.011070 v -0.015002 -0.013152 -0.010998 v -0.014295 -0.013152 -0.011883 v -0.014392 -0.013152 -0.010166 v -0.014353 -0.013152 -0.011473 v -0.014221 -0.013152 -0.011280 v -0.014059 -0.013152 -0.011522 v -0.014126 -0.013152 -0.011162 v -0.014049 -0.013152 -0.011083 v -0.014011 -0.013152 -0.011460 v -0.013969 -0.013152 -0.011015 v -0.013962 -0.013152 -0.011404 v -0.013899 -0.013152 -0.010966 v -0.013895 -0.013152 -0.011338 v -0.013828 -0.013152 -0.010926 v -0.013835 -0.013152 -0.011290 v -0.013783 -0.013152 -0.011256 v -0.013754 -0.013152 -0.010894 v -0.013729 -0.013152 -0.011227 v -0.013704 -0.013152 -0.010877 v -0.013676 -0.013152 -0.011205 v -0.013641 -0.013152 -0.010861 v -0.013630 -0.013152 -0.011192 v -0.013577 -0.013152 -0.010851 v -0.013602 -0.013152 -0.011186 v -0.013575 -0.013152 -0.011181 v -0.013513 -0.013152 -0.010847 v -0.013530 -0.013152 -0.011177 v -0.013457 -0.013152 -0.012478 v -0.013565 -0.013152 -0.012525 v -0.013296 -0.013152 -0.012722 v -0.013484 -0.013152 -0.011177 v -0.013449 -0.013152 -0.010849 v -0.013439 -0.013152 -0.011182 v -0.013358 -0.013152 -0.012424 v -0.013386 -0.013152 -0.010857 v -0.013395 -0.013152 -0.011191 v -0.013350 -0.013152 -0.011204 v -0.013322 -0.013152 -0.010870 v -0.013278 -0.013152 -0.012369 v -0.013297 -0.013152 -0.011226 v -0.013247 -0.013152 -0.010894 v -0.013244 -0.013152 -0.011253 v -0.013248 -0.013152 -0.012698 v -0.013205 -0.013152 -0.012309 v -0.013206 -0.013152 -0.012674 v -0.013172 -0.013152 -0.010926 v -0.013183 -0.013152 -0.011294 v -0.013148 -0.013152 -0.012632 v -0.013139 -0.013152 -0.012243 v -0.013133 -0.013152 -0.011333 v -0.013097 -0.013152 -0.010967 v -0.013072 -0.013152 -0.012565 v -0.013109 -0.013152 -0.012207 v -0.013089 -0.013152 -0.011375 v -0.013080 -0.013152 -0.012171 v -0.013009 -0.013152 -0.011025 v -0.013050 -0.013152 -0.011420 v -0.013030 -0.013152 -0.012095 v -0.012985 -0.013152 -0.012475 v -0.013017 -0.013152 -0.011466 v -0.012995 -0.013152 -0.012029 v -0.012993 -0.013152 -0.011507 v -0.012925 -0.013152 -0.011093 v -0.012968 -0.013152 -0.011963 v -0.012973 -0.013152 -0.011549 v -0.012869 -0.013152 -0.012330 v -0.012957 -0.013152 -0.011593 v -0.012950 -0.013152 -0.011906 v -0.012945 -0.013152 -0.011639 v -0.012939 -0.013152 -0.011849 v -0.012936 -0.013152 -0.011695 v -0.012933 -0.013152 -0.011791 v -0.012932 -0.013152 -0.011743 v -0.012861 -0.013152 -0.011155 v -0.012801 -0.013152 -0.012228 v -0.012806 -0.013152 -0.011220 v -0.012758 -0.013152 -0.011289 v -0.012744 -0.013152 -0.012127 v -0.012724 -0.013152 -0.011349 v -0.012700 -0.013152 -0.012026 v -0.012696 -0.013152 -0.011412 v -0.012672 -0.013152 -0.011940 v -0.012674 -0.013152 -0.011476 v -0.012657 -0.013152 -0.011543 v -0.012652 -0.013152 -0.011854 v -0.012645 -0.013152 -0.011613 v -0.012642 -0.013152 -0.011769 v -0.012640 -0.013152 -0.011683 v -0.016189 -0.013152 -0.012036 v -0.016517 -0.013152 -0.012973 v -0.016276 -0.013152 -0.013149 v -0.016053 -0.013152 -0.012524 v -0.014148 -0.013152 -0.013531 v -0.014333 -0.013152 -0.013784 v -0.014699 -0.013152 -0.014284 v -0.014477 -0.013152 -0.014447 v -0.013560 -0.013152 -0.013195 v -0.013782 -0.013152 -0.013032 v -0.020779 -0.012905 -0.019052 v -0.021183 -0.012905 -0.019124 v -0.020398 -0.012905 -0.018053 v -0.020073 -0.012905 -0.019937 v -0.020170 -0.012905 -0.018220 v -0.020131 -0.012905 -0.019527 v -0.019999 -0.012905 -0.019334 v -0.019837 -0.012905 -0.019576 v -0.019903 -0.012905 -0.019216 v -0.019826 -0.012905 -0.019137 v -0.019789 -0.012905 -0.019514 v -0.019747 -0.012905 -0.019069 v -0.019739 -0.012905 -0.019458 v -0.019677 -0.012905 -0.019020 v -0.019672 -0.012905 -0.019392 v -0.019605 -0.012905 -0.018980 v -0.019612 -0.012905 -0.019344 v -0.019560 -0.012905 -0.019310 v -0.019532 -0.012905 -0.018948 v -0.019507 -0.012905 -0.019281 v -0.019482 -0.012905 -0.018931 v -0.019453 -0.012905 -0.019259 v -0.019418 -0.012905 -0.018915 v -0.019408 -0.012905 -0.019246 v -0.019354 -0.012905 -0.018905 v -0.019380 -0.012905 -0.019240 v -0.019353 -0.012905 -0.019235 v -0.019290 -0.012905 -0.018901 v -0.019307 -0.012905 -0.019231 v -0.019074 -0.012905 -0.020776 v -0.019343 -0.012905 -0.020579 v -0.019235 -0.012905 -0.020532 v -0.019262 -0.012905 -0.019231 v -0.019227 -0.012905 -0.018903 v -0.019217 -0.012905 -0.019236 v -0.019136 -0.012905 -0.020478 v -0.019163 -0.012905 -0.018911 v -0.019172 -0.012905 -0.019245 v -0.019128 -0.012905 -0.019258 v -0.019100 -0.012905 -0.018924 v -0.019055 -0.012905 -0.020424 v -0.019074 -0.012905 -0.019280 v -0.019024 -0.012905 -0.018948 v -0.019022 -0.012905 -0.019307 v -0.019025 -0.012905 -0.020752 v -0.018982 -0.012905 -0.020363 v -0.018984 -0.012905 -0.020728 v -0.018949 -0.012905 -0.018980 v -0.018960 -0.012905 -0.019348 v -0.018926 -0.012905 -0.020686 v -0.018916 -0.012905 -0.020297 v -0.018911 -0.012905 -0.019388 v -0.018874 -0.012905 -0.019021 v -0.018849 -0.012905 -0.020620 v -0.018886 -0.012905 -0.020262 v -0.018866 -0.012905 -0.019430 v -0.018858 -0.012905 -0.020225 v -0.018787 -0.012905 -0.019079 v -0.018827 -0.012905 -0.019474 v -0.018808 -0.012905 -0.020150 v -0.018762 -0.012905 -0.020529 v -0.018794 -0.012905 -0.019521 v -0.018773 -0.012905 -0.020083 v -0.018771 -0.012905 -0.019561 v -0.018703 -0.012905 -0.019147 v -0.018745 -0.012905 -0.020017 v -0.018751 -0.012905 -0.019603 v -0.018647 -0.012905 -0.020384 v -0.018735 -0.012905 -0.019647 v -0.018728 -0.012905 -0.019960 v -0.018723 -0.012905 -0.019693 v -0.018716 -0.012905 -0.019903 v -0.018714 -0.012905 -0.019749 v -0.018711 -0.012905 -0.019845 v -0.018710 -0.012905 -0.019797 v -0.018639 -0.012905 -0.019209 v -0.018578 -0.012905 -0.020282 v -0.018583 -0.012905 -0.019274 v -0.018535 -0.012905 -0.019343 v -0.018522 -0.012905 -0.020181 v -0.018502 -0.012905 -0.019403 v -0.018477 -0.012905 -0.020080 v -0.018474 -0.012905 -0.019466 v -0.018449 -0.012905 -0.019994 v -0.018451 -0.012905 -0.019530 v -0.018434 -0.012905 -0.019597 v -0.018430 -0.012905 -0.019908 v -0.018423 -0.012905 -0.019667 v -0.018419 -0.012905 -0.019822 v -0.018418 -0.012905 -0.019737 v -0.022045 -0.012905 -0.021205 v -0.022310 -0.012905 -0.021010 v -0.022309 -0.012905 -0.020897 v -0.022297 -0.012905 -0.020787 v -0.022274 -0.012905 -0.020679 v -0.022241 -0.012905 -0.020574 v -0.022198 -0.012905 -0.020471 v -0.022144 -0.012905 -0.020370 v -0.022055 -0.012905 -0.021080 v -0.022071 -0.012905 -0.020258 v -0.022055 -0.012905 -0.020978 v -0.021999 -0.012905 -0.020170 v -0.022045 -0.012905 -0.020865 v -0.022028 -0.012905 -0.020772 v -0.022003 -0.012905 -0.020685 v -0.021970 -0.012905 -0.020603 v -0.021934 -0.012905 -0.020102 v -0.021930 -0.012905 -0.020524 v -0.021866 -0.012905 -0.020045 v -0.021882 -0.012905 -0.020451 v -0.021852 -0.012905 -0.020412 v -0.021806 -0.012905 -0.020003 v -0.021821 -0.012905 -0.020377 v -0.021777 -0.012905 -0.020333 v -0.021744 -0.012905 -0.019968 v -0.021738 -0.012905 -0.020301 v -0.021680 -0.012905 -0.019940 v -0.021698 -0.012905 -0.020273 v -0.021656 -0.012905 -0.020251 v -0.021625 -0.012905 -0.019923 v -0.021621 -0.012905 -0.020236 v -0.021568 -0.012905 -0.019910 v -0.021585 -0.012905 -0.020224 v -0.021549 -0.012905 -0.020216 v -0.021500 -0.012905 -0.019901 v -0.021519 -0.012905 -0.020212 v -0.021489 -0.012905 -0.020210 v -0.021444 -0.012905 -0.019899 v -0.021452 -0.012905 -0.020211 v -0.021414 -0.012905 -0.020215 v -0.021388 -0.012905 -0.019902 v -0.021377 -0.012905 -0.020222 v -0.021332 -0.012905 -0.019910 v -0.021332 -0.012905 -0.020236 v -0.021265 -0.012905 -0.019926 v -0.021286 -0.012905 -0.020255 v -0.021233 -0.012905 -0.020283 v -0.021199 -0.012905 -0.019950 v -0.021172 -0.012905 -0.020323 v -0.021133 -0.012905 -0.019980 v -0.021135 -0.012905 -0.020352 v -0.021108 -0.012905 -0.020376 v -0.021078 -0.012905 -0.020011 v -0.021056 -0.012905 -0.020427 v -0.021013 -0.012905 -0.020055 v -0.021010 -0.012905 -0.020483 v -0.020948 -0.012905 -0.020108 v -0.020969 -0.012905 -0.020543 v -0.020933 -0.012905 -0.020608 v -0.020887 -0.012905 -0.020166 v -0.020898 -0.012905 -0.020687 v -0.020861 -0.012905 -0.020796 v -0.020824 -0.012905 -0.020239 v -0.020825 -0.012905 -0.020925 v -0.020745 -0.012905 -0.021341 v -0.020768 -0.012905 -0.020318 v -0.020723 -0.012905 -0.020395 v -0.020571 -0.012905 -0.022460 v -0.020683 -0.012905 -0.020477 v -0.020633 -0.012905 -0.020607 v -0.020557 -0.012905 -0.020890 v -0.020345 -0.012905 -0.022625 v -0.020488 -0.012905 -0.021268 v -0.020357 -0.012905 -0.022149 v -0.020351 -0.012905 -0.022153 v -0.019597 -0.012905 -0.021124 v -0.019368 -0.012905 -0.021291 v -0.020398 -0.013135 -0.018053 v -0.021183 -0.013135 -0.019124 v -0.020779 -0.013135 -0.019052 v -0.020073 -0.013135 -0.019937 v -0.020170 -0.013135 -0.018220 v -0.020131 -0.013135 -0.019527 v -0.019999 -0.013135 -0.019334 v -0.019837 -0.013135 -0.019576 v -0.019903 -0.013135 -0.019216 v -0.019826 -0.013135 -0.019137 v -0.019789 -0.013135 -0.019514 v -0.019747 -0.013135 -0.019069 v -0.019739 -0.013135 -0.019458 v -0.019677 -0.013135 -0.019020 v -0.019672 -0.013135 -0.019392 v -0.019605 -0.013135 -0.018980 v -0.019612 -0.013135 -0.019344 v -0.019560 -0.013135 -0.019310 v -0.019532 -0.013135 -0.018948 v -0.019507 -0.013135 -0.019281 v -0.019482 -0.013135 -0.018931 v -0.019453 -0.013135 -0.019259 v -0.019418 -0.013135 -0.018915 v -0.019408 -0.013135 -0.019246 v -0.019354 -0.013135 -0.018905 v -0.019380 -0.013135 -0.019240 v -0.019353 -0.013135 -0.019235 v -0.019290 -0.013135 -0.018901 v -0.019307 -0.013135 -0.019231 v -0.019235 -0.013135 -0.020532 v -0.019343 -0.013135 -0.020579 v -0.019074 -0.013135 -0.020776 v -0.019262 -0.013135 -0.019231 v -0.019227 -0.013135 -0.018903 v -0.019217 -0.013135 -0.019236 v -0.019136 -0.013135 -0.020478 v -0.019163 -0.013135 -0.018911 v -0.019172 -0.013135 -0.019245 v -0.019128 -0.013135 -0.019258 v -0.019100 -0.013135 -0.018924 v -0.019055 -0.013135 -0.020424 v -0.019074 -0.013135 -0.019280 v -0.019024 -0.013135 -0.018948 v -0.019022 -0.013135 -0.019307 v -0.019025 -0.013135 -0.020752 v -0.018982 -0.013135 -0.020363 v -0.018984 -0.013135 -0.020728 v -0.018949 -0.013135 -0.018980 v -0.018960 -0.013135 -0.019348 v -0.018926 -0.013135 -0.020686 v -0.018916 -0.013135 -0.020297 v -0.018911 -0.013135 -0.019388 v -0.018874 -0.013135 -0.019021 v -0.018849 -0.013135 -0.020620 v -0.018886 -0.013135 -0.020262 v -0.018866 -0.013135 -0.019430 v -0.018858 -0.013135 -0.020225 v -0.018787 -0.013135 -0.019079 v -0.018827 -0.013135 -0.019474 v -0.018808 -0.013135 -0.020150 v -0.018762 -0.013135 -0.020529 v -0.018794 -0.013135 -0.019521 v -0.018773 -0.013135 -0.020083 v -0.018771 -0.013135 -0.019561 v -0.018703 -0.013135 -0.019147 v -0.018745 -0.013135 -0.020017 v -0.018751 -0.013135 -0.019603 v -0.018647 -0.013135 -0.020384 v -0.018735 -0.013135 -0.019647 v -0.018728 -0.013135 -0.019960 v -0.018723 -0.013135 -0.019693 v -0.018716 -0.013135 -0.019903 v -0.018714 -0.013135 -0.019749 v -0.018711 -0.013135 -0.019845 v -0.018710 -0.013135 -0.019797 v -0.018639 -0.013135 -0.019209 v -0.018578 -0.013135 -0.020282 v -0.018583 -0.013135 -0.019274 v -0.018535 -0.013135 -0.019343 v -0.018522 -0.013135 -0.020181 v -0.018502 -0.013135 -0.019403 v -0.018477 -0.013135 -0.020080 v -0.018474 -0.013135 -0.019466 v -0.018449 -0.013135 -0.019994 v -0.018451 -0.013135 -0.019530 v -0.018434 -0.013135 -0.019597 v -0.018430 -0.013135 -0.019908 v -0.018423 -0.013135 -0.019667 v -0.018419 -0.013135 -0.019822 v -0.018418 -0.013135 -0.019737 v -0.022309 -0.013135 -0.020897 v -0.022310 -0.013135 -0.021010 v -0.022045 -0.013135 -0.021205 v -0.022297 -0.013135 -0.020787 v -0.022274 -0.013135 -0.020679 v -0.022241 -0.013135 -0.020574 v -0.022198 -0.013135 -0.020471 v -0.022144 -0.013135 -0.020370 v -0.022071 -0.013135 -0.020258 v -0.022055 -0.013135 -0.021080 v -0.021999 -0.013135 -0.020170 v -0.022055 -0.013135 -0.020978 v -0.022045 -0.013135 -0.020865 v -0.022028 -0.013135 -0.020772 v -0.022003 -0.013135 -0.020685 v -0.021970 -0.013135 -0.020603 v -0.021934 -0.013135 -0.020102 v -0.021930 -0.013135 -0.020524 v -0.021866 -0.013135 -0.020045 v -0.021882 -0.013135 -0.020451 v -0.021852 -0.013135 -0.020412 v -0.021806 -0.013135 -0.020003 v -0.021821 -0.013135 -0.020377 v -0.021777 -0.013135 -0.020333 v -0.021744 -0.013135 -0.019968 v -0.021738 -0.013135 -0.020301 v -0.021680 -0.013135 -0.019940 v -0.021698 -0.013135 -0.020273 v -0.021656 -0.013135 -0.020251 v -0.021625 -0.013135 -0.019923 v -0.021621 -0.013135 -0.020236 v -0.021568 -0.013135 -0.019910 v -0.021585 -0.013135 -0.020224 v -0.021549 -0.013135 -0.020216 v -0.021500 -0.013135 -0.019901 v -0.021519 -0.013135 -0.020212 v -0.021489 -0.013135 -0.020210 v -0.021444 -0.013135 -0.019899 v -0.021452 -0.013135 -0.020211 v -0.021414 -0.013135 -0.020215 v -0.021388 -0.013135 -0.019902 v -0.021377 -0.013135 -0.020222 v -0.021332 -0.013135 -0.019910 v -0.021332 -0.013135 -0.020236 v -0.021265 -0.013135 -0.019926 v -0.021286 -0.013135 -0.020255 v -0.021233 -0.013135 -0.020283 v -0.021199 -0.013135 -0.019950 v -0.021172 -0.013135 -0.020323 v -0.021133 -0.013135 -0.019980 v -0.021135 -0.013135 -0.020352 v -0.021108 -0.013135 -0.020376 v -0.021078 -0.013135 -0.020011 v -0.021056 -0.013135 -0.020427 v -0.021013 -0.013135 -0.020055 v -0.021010 -0.013135 -0.020483 v -0.020948 -0.013135 -0.020108 v -0.020969 -0.013135 -0.020543 v -0.020933 -0.013135 -0.020608 v -0.020887 -0.013135 -0.020166 v -0.020898 -0.013135 -0.020687 v -0.020861 -0.013135 -0.020796 v -0.020824 -0.013135 -0.020239 v -0.020825 -0.013135 -0.020925 v -0.020745 -0.013135 -0.021341 v -0.020768 -0.013135 -0.020318 v -0.020723 -0.013135 -0.020395 v -0.020571 -0.013135 -0.022460 v -0.020683 -0.013135 -0.020477 v -0.020633 -0.013135 -0.020607 v -0.020557 -0.013135 -0.020890 v -0.020345 -0.013135 -0.022625 v -0.020488 -0.013135 -0.021268 v -0.020357 -0.013135 -0.022149 v -0.020351 -0.013135 -0.022153 v -0.019597 -0.013135 -0.021124 v -0.019368 -0.013135 -0.021291 v -0.026496 -0.012905 -0.026947 v -0.026900 -0.012905 -0.027019 v -0.026115 -0.012905 -0.025948 v -0.025789 -0.012905 -0.027832 v -0.025886 -0.012905 -0.026115 v -0.025847 -0.012905 -0.027422 v -0.025715 -0.012905 -0.027229 v -0.025554 -0.012905 -0.027471 v -0.025620 -0.012905 -0.027111 v -0.025543 -0.012905 -0.027032 v -0.025505 -0.012905 -0.027409 v -0.025463 -0.012905 -0.026964 v -0.025456 -0.012905 -0.027353 v -0.025393 -0.012905 -0.026915 v -0.025389 -0.012905 -0.027287 v -0.025322 -0.012905 -0.026875 v -0.025329 -0.012905 -0.027239 v -0.025277 -0.012905 -0.027205 v -0.025248 -0.012905 -0.026843 v -0.025223 -0.012905 -0.027176 v -0.025198 -0.012905 -0.026826 v -0.025170 -0.012905 -0.027154 v -0.025135 -0.012905 -0.026810 v -0.025124 -0.012905 -0.027141 v -0.025071 -0.012905 -0.026800 v -0.025096 -0.012905 -0.027135 v -0.025069 -0.012905 -0.027130 v -0.025007 -0.012905 -0.026796 v -0.025024 -0.012905 -0.027126 v -0.024790 -0.012905 -0.028671 v -0.025059 -0.012905 -0.028474 v -0.024951 -0.012905 -0.028427 v -0.024978 -0.012905 -0.027126 v -0.024943 -0.012905 -0.026798 v -0.024933 -0.012905 -0.027131 v -0.024852 -0.012905 -0.028373 v -0.024880 -0.012905 -0.026806 v -0.024889 -0.012905 -0.027140 v -0.024844 -0.012905 -0.027153 v -0.024816 -0.012905 -0.026819 v -0.024772 -0.012905 -0.028318 v -0.024791 -0.012905 -0.027175 v -0.024741 -0.012905 -0.026843 v -0.024738 -0.012905 -0.027202 v -0.024742 -0.012905 -0.028647 v -0.024699 -0.012905 -0.028258 v -0.024700 -0.012905 -0.028623 v -0.024666 -0.012905 -0.026875 v -0.024677 -0.012905 -0.027243 v -0.024642 -0.012905 -0.028581 v -0.024633 -0.012905 -0.028192 v -0.024627 -0.012905 -0.027283 v -0.024591 -0.012905 -0.026916 v -0.024566 -0.012905 -0.028515 v -0.024603 -0.012905 -0.028157 v -0.024583 -0.012905 -0.027325 v -0.024574 -0.012905 -0.028120 v -0.024503 -0.012905 -0.026974 v -0.024544 -0.012905 -0.027369 v -0.024524 -0.012905 -0.028044 v -0.024479 -0.012905 -0.028424 v -0.024511 -0.012905 -0.027415 v -0.024489 -0.012905 -0.027978 v -0.024487 -0.012905 -0.027456 v -0.024419 -0.012905 -0.027042 v -0.024462 -0.012905 -0.027912 v -0.024467 -0.012905 -0.027498 v -0.024363 -0.012905 -0.028279 v -0.024451 -0.012905 -0.027542 v -0.024444 -0.012905 -0.027855 v -0.024439 -0.012905 -0.027588 v -0.024433 -0.012905 -0.027798 v -0.024430 -0.012905 -0.027644 v -0.024427 -0.012905 -0.027740 v -0.024426 -0.012905 -0.027692 v -0.024355 -0.012905 -0.027104 v -0.024295 -0.012905 -0.028177 v -0.024300 -0.012905 -0.027169 v -0.024252 -0.012905 -0.027238 v -0.024238 -0.012905 -0.028076 v -0.024218 -0.012905 -0.027298 v -0.024194 -0.012905 -0.027975 v -0.024190 -0.012905 -0.027361 v -0.024166 -0.012905 -0.027889 v -0.024168 -0.012905 -0.027425 v -0.024151 -0.012905 -0.027492 v -0.024146 -0.012905 -0.027803 v -0.024139 -0.012905 -0.027562 v -0.024136 -0.012905 -0.027718 v -0.024134 -0.012905 -0.027632 v -0.027837 -0.012905 -0.029006 v -0.028084 -0.012905 -0.028825 v -0.028070 -0.012905 -0.028728 v -0.028047 -0.012905 -0.028631 v -0.028014 -0.012905 -0.028535 v -0.027966 -0.012905 -0.028428 v -0.027913 -0.012905 -0.028334 v -0.027842 -0.012905 -0.028229 v -0.027835 -0.012905 -0.028905 v -0.027775 -0.012905 -0.028145 v -0.027826 -0.012905 -0.028820 v -0.027809 -0.012905 -0.028739 v -0.027786 -0.012905 -0.028661 v -0.027756 -0.012905 -0.028587 v -0.027714 -0.012905 -0.028081 v -0.027718 -0.012905 -0.028516 v -0.027674 -0.012905 -0.028449 v -0.027649 -0.012905 -0.028026 v -0.027625 -0.012905 -0.028387 v -0.027592 -0.012905 -0.027985 v -0.027574 -0.012905 -0.028333 v -0.027533 -0.012905 -0.027951 v -0.027523 -0.012905 -0.028289 v -0.027472 -0.012905 -0.027923 v -0.027484 -0.012905 -0.028261 v -0.027444 -0.012905 -0.028238 v -0.027420 -0.012905 -0.027905 v -0.027404 -0.012905 -0.028220 v -0.027367 -0.012905 -0.027890 v -0.027364 -0.012905 -0.028208 v -0.027302 -0.012905 -0.027880 v -0.027323 -0.012905 -0.028200 v -0.027281 -0.012905 -0.028197 v -0.027239 -0.012905 -0.027875 v -0.027239 -0.012905 -0.028200 v -0.027187 -0.012905 -0.027877 v -0.027196 -0.012905 -0.028207 v -0.027153 -0.012905 -0.028219 v -0.027136 -0.012905 -0.027883 v -0.027110 -0.012905 -0.028236 v -0.027086 -0.012905 -0.027893 v -0.026898 -0.012905 -0.029485 v -0.027113 -0.012905 -0.029328 v -0.026985 -0.012905 -0.029154 v -0.027051 -0.012905 -0.028267 v -0.027036 -0.012905 -0.027909 v -0.026991 -0.012905 -0.028307 v -0.026978 -0.012905 -0.027933 v -0.026945 -0.012905 -0.028344 v -0.026900 -0.012905 -0.029026 v -0.026920 -0.012905 -0.027964 v -0.026917 -0.012905 -0.028369 v -0.026864 -0.012905 -0.028001 v -0.026881 -0.012905 -0.028409 v -0.026847 -0.012905 -0.028924 v -0.026763 -0.012905 -0.029301 v -0.026851 -0.012905 -0.028450 v -0.026783 -0.012905 -0.028067 v -0.026826 -0.012905 -0.028494 v -0.026817 -0.012905 -0.028847 v -0.026807 -0.012905 -0.028539 v -0.026801 -0.012905 -0.028791 v -0.026794 -0.012905 -0.028586 v -0.026790 -0.012905 -0.028737 v -0.026787 -0.012905 -0.028634 v -0.026786 -0.012905 -0.028685 v -0.026728 -0.012905 -0.028123 v -0.026673 -0.012905 -0.029188 v -0.026680 -0.012905 -0.028182 v -0.026641 -0.012905 -0.028244 v -0.026628 -0.012905 -0.028857 v -0.026601 -0.012905 -0.029110 v -0.026617 -0.012905 -0.028292 v -0.026594 -0.012905 -0.028752 v -0.026622 -0.012905 -0.028862 v -0.026557 -0.012905 -0.028796 v -0.026597 -0.012905 -0.028341 v -0.026530 -0.012905 -0.029044 v -0.026582 -0.012905 -0.028392 v -0.026576 -0.012905 -0.028671 v -0.026572 -0.012905 -0.028445 v -0.026567 -0.012905 -0.028593 v -0.026565 -0.012905 -0.028518 v -0.026498 -0.012905 -0.028745 v -0.026459 -0.012905 -0.028991 v -0.026438 -0.012905 -0.028702 v -0.026405 -0.012905 -0.028958 v -0.026375 -0.012905 -0.028667 v -0.026352 -0.012905 -0.028932 v -0.026104 -0.012905 -0.030406 v -0.026377 -0.012905 -0.030206 v -0.026283 -0.012905 -0.030175 v -0.026320 -0.012905 -0.028642 v -0.026299 -0.012905 -0.028913 v -0.026263 -0.012905 -0.028623 v -0.026246 -0.012905 -0.028901 v -0.026194 -0.012905 -0.030137 v -0.026225 -0.012905 -0.028613 v -0.026193 -0.012905 -0.028895 v -0.026175 -0.012905 -0.028604 v -0.026111 -0.012905 -0.030092 v -0.026140 -0.012905 -0.028897 v -0.026116 -0.012905 -0.028598 v -0.026088 -0.012905 -0.028904 v -0.026058 -0.012905 -0.028598 v -0.026033 -0.012905 -0.030039 v -0.026063 -0.012905 -0.030389 v -0.026035 -0.012905 -0.028919 v -0.026033 -0.012905 -0.030374 v -0.026001 -0.012905 -0.028604 v -0.025983 -0.012905 -0.028940 v -0.025960 -0.012905 -0.029979 v -0.025963 -0.012905 -0.030333 v -0.025945 -0.012905 -0.028615 v -0.025930 -0.012905 -0.028968 v -0.025884 -0.012905 -0.030276 v -0.025893 -0.012905 -0.029911 v -0.025889 -0.012905 -0.028631 v -0.025878 -0.012905 -0.029003 v -0.025857 -0.012905 -0.029869 v -0.025835 -0.012905 -0.028653 v -0.025806 -0.012905 -0.030209 v -0.025848 -0.012905 -0.029027 v -0.025823 -0.012905 -0.029824 v -0.025820 -0.012905 -0.029051 v -0.025781 -0.012905 -0.028681 v -0.025768 -0.012905 -0.029741 v -0.025783 -0.012905 -0.029090 v -0.025720 -0.012905 -0.030119 v -0.025755 -0.012905 -0.029124 v -0.025746 -0.012905 -0.028703 v -0.025729 -0.012905 -0.029668 v -0.025732 -0.012905 -0.029159 v -0.025711 -0.012905 -0.028727 v -0.025712 -0.012905 -0.029196 v -0.025702 -0.012905 -0.029604 v -0.025617 -0.012905 -0.029991 v -0.025696 -0.012905 -0.029235 v -0.025644 -0.012905 -0.028781 v -0.025685 -0.012905 -0.029550 v -0.025683 -0.012905 -0.029275 v -0.025674 -0.012905 -0.029495 v -0.025674 -0.012905 -0.029317 v -0.025668 -0.012905 -0.029441 v -0.025668 -0.012905 -0.029370 v -0.025666 -0.012905 -0.029406 v -0.025584 -0.012905 -0.028839 v -0.025560 -0.012905 -0.029907 v -0.025532 -0.012905 -0.028901 v -0.025511 -0.012905 -0.029823 v -0.025495 -0.012905 -0.028955 v -0.025463 -0.012905 -0.029725 v -0.025463 -0.012905 -0.029012 v -0.025427 -0.012905 -0.029627 v -0.025436 -0.012905 -0.029071 v -0.025415 -0.012905 -0.029133 v -0.025405 -0.012905 -0.029544 v -0.025400 -0.012905 -0.029198 v -0.025391 -0.012905 -0.029460 v -0.025393 -0.012905 -0.029238 v -0.025387 -0.012905 -0.029293 v -0.025385 -0.012905 -0.029376 v -0.026115 -0.013135 -0.025948 v -0.026900 -0.013135 -0.027019 v -0.026496 -0.013135 -0.026947 v -0.025789 -0.013135 -0.027832 v -0.025886 -0.013135 -0.026115 v -0.025847 -0.013135 -0.027422 v -0.025715 -0.013135 -0.027229 v -0.025554 -0.013135 -0.027471 v -0.025620 -0.013135 -0.027111 v -0.025543 -0.013135 -0.027032 v -0.025505 -0.013135 -0.027409 v -0.025463 -0.013135 -0.026964 v -0.025456 -0.013135 -0.027353 v -0.025393 -0.013135 -0.026915 v -0.025389 -0.013135 -0.027287 v -0.025322 -0.013135 -0.026875 v -0.025329 -0.013135 -0.027239 v -0.025277 -0.013135 -0.027205 v -0.025248 -0.013135 -0.026843 v -0.025223 -0.013135 -0.027176 v -0.025198 -0.013135 -0.026826 v -0.025170 -0.013135 -0.027154 v -0.025135 -0.013135 -0.026810 v -0.025124 -0.013135 -0.027141 v -0.025071 -0.013135 -0.026800 v -0.025096 -0.013135 -0.027135 v -0.025069 -0.013135 -0.027130 v -0.025007 -0.013135 -0.026796 v -0.025024 -0.013135 -0.027126 v -0.024951 -0.013135 -0.028427 v -0.025059 -0.013135 -0.028474 v -0.024790 -0.013135 -0.028671 v -0.024978 -0.013135 -0.027126 v -0.024943 -0.013135 -0.026798 v -0.024933 -0.013135 -0.027131 v -0.024852 -0.013135 -0.028373 v -0.024880 -0.013135 -0.026806 v -0.024889 -0.013135 -0.027140 v -0.024844 -0.013135 -0.027153 v -0.024816 -0.013135 -0.026819 v -0.024772 -0.013135 -0.028318 v -0.024791 -0.013135 -0.027175 v -0.024741 -0.013135 -0.026843 v -0.024738 -0.013135 -0.027202 v -0.024742 -0.013135 -0.028647 v -0.024699 -0.013135 -0.028258 v -0.024700 -0.013135 -0.028623 v -0.024666 -0.013135 -0.026875 v -0.024677 -0.013135 -0.027243 v -0.024642 -0.013135 -0.028581 v -0.024633 -0.013135 -0.028192 v -0.024627 -0.013135 -0.027283 v -0.024591 -0.013135 -0.026916 v -0.024566 -0.013135 -0.028515 v -0.024603 -0.013135 -0.028157 v -0.024583 -0.013135 -0.027325 v -0.024574 -0.013135 -0.028120 v -0.024503 -0.013135 -0.026974 v -0.024544 -0.013135 -0.027369 v -0.024524 -0.013135 -0.028044 v -0.024479 -0.013135 -0.028424 v -0.024511 -0.013135 -0.027415 v -0.024489 -0.013135 -0.027978 v -0.024487 -0.013135 -0.027456 v -0.024419 -0.013135 -0.027042 v -0.024462 -0.013135 -0.027912 v -0.024467 -0.013135 -0.027498 v -0.024363 -0.013135 -0.028279 v -0.024451 -0.013135 -0.027542 v -0.024444 -0.013135 -0.027855 v -0.024439 -0.013135 -0.027588 v -0.024433 -0.013135 -0.027798 v -0.024430 -0.013135 -0.027644 v -0.024427 -0.013135 -0.027740 v -0.024426 -0.013135 -0.027692 v -0.024355 -0.013135 -0.027104 v -0.024295 -0.013135 -0.028177 v -0.024300 -0.013135 -0.027169 v -0.024252 -0.013135 -0.027238 v -0.024238 -0.013135 -0.028076 v -0.024218 -0.013135 -0.027298 v -0.024194 -0.013135 -0.027975 v -0.024190 -0.013135 -0.027361 v -0.024166 -0.013135 -0.027889 v -0.024168 -0.013135 -0.027425 v -0.024151 -0.013135 -0.027492 v -0.024146 -0.013135 -0.027803 v -0.024139 -0.013135 -0.027562 v -0.024136 -0.013135 -0.027718 v -0.024134 -0.013135 -0.027632 v -0.028070 -0.013135 -0.028728 v -0.028084 -0.013135 -0.028825 v -0.027837 -0.013135 -0.029006 v -0.028047 -0.013135 -0.028631 v -0.028014 -0.013135 -0.028535 v -0.027966 -0.013135 -0.028428 v -0.027913 -0.013135 -0.028334 v -0.027842 -0.013135 -0.028229 v -0.027775 -0.013135 -0.028145 v -0.027835 -0.013135 -0.028905 v -0.027826 -0.013135 -0.028820 v -0.027809 -0.013135 -0.028739 v -0.027786 -0.013135 -0.028661 v -0.027756 -0.013135 -0.028587 v -0.027714 -0.013135 -0.028081 v -0.027718 -0.013135 -0.028516 v -0.027674 -0.013135 -0.028449 v -0.027649 -0.013135 -0.028026 v -0.027625 -0.013135 -0.028387 v -0.027592 -0.013135 -0.027985 v -0.027574 -0.013135 -0.028333 v -0.027533 -0.013135 -0.027951 v -0.027523 -0.013135 -0.028289 v -0.027472 -0.013135 -0.027923 v -0.027484 -0.013135 -0.028261 v -0.027444 -0.013135 -0.028238 v -0.027420 -0.013135 -0.027905 v -0.027404 -0.013135 -0.028220 v -0.027367 -0.013135 -0.027890 v -0.027364 -0.013135 -0.028208 v -0.027302 -0.013135 -0.027880 v -0.027323 -0.013135 -0.028200 v -0.027281 -0.013135 -0.028197 v -0.027239 -0.013135 -0.027875 v -0.027239 -0.013135 -0.028200 v -0.027187 -0.013135 -0.027877 v -0.027196 -0.013135 -0.028207 v -0.027153 -0.013135 -0.028219 v -0.027136 -0.013135 -0.027883 v -0.027110 -0.013135 -0.028236 v -0.027086 -0.013135 -0.027893 v -0.026985 -0.013135 -0.029154 v -0.027113 -0.013135 -0.029328 v -0.026898 -0.013135 -0.029485 v -0.027051 -0.013135 -0.028267 v -0.027036 -0.013135 -0.027909 v -0.026991 -0.013135 -0.028307 v -0.026978 -0.013135 -0.027933 v -0.026945 -0.013135 -0.028344 v -0.026900 -0.013135 -0.029026 v -0.026920 -0.013135 -0.027964 v -0.026917 -0.013135 -0.028369 v -0.026864 -0.013135 -0.028001 v -0.026881 -0.013135 -0.028409 v -0.026847 -0.013135 -0.028924 v -0.026763 -0.013135 -0.029301 v -0.026851 -0.013135 -0.028450 v -0.026783 -0.013135 -0.028067 v -0.026826 -0.013135 -0.028494 v -0.026817 -0.013135 -0.028847 v -0.026807 -0.013135 -0.028539 v -0.026801 -0.013135 -0.028791 v -0.026794 -0.013135 -0.028586 v -0.026790 -0.013135 -0.028737 v -0.026787 -0.013135 -0.028634 v -0.026786 -0.013135 -0.028685 v -0.026728 -0.013135 -0.028123 v -0.026673 -0.013135 -0.029188 v -0.026680 -0.013135 -0.028182 v -0.026641 -0.013135 -0.028244 v -0.026628 -0.013135 -0.028857 v -0.026601 -0.013135 -0.029110 v -0.026617 -0.013135 -0.028292 v -0.026594 -0.013135 -0.028752 v -0.026622 -0.013135 -0.028862 v -0.026557 -0.013135 -0.028796 v -0.026597 -0.013135 -0.028341 v -0.026530 -0.013135 -0.029044 v -0.026582 -0.013135 -0.028392 v -0.026576 -0.013135 -0.028671 v -0.026572 -0.013135 -0.028445 v -0.026567 -0.013135 -0.028593 v -0.026565 -0.013135 -0.028518 v -0.026498 -0.013135 -0.028745 v -0.026459 -0.013135 -0.028991 v -0.026438 -0.013135 -0.028702 v -0.026405 -0.013135 -0.028958 v -0.026375 -0.013135 -0.028667 v -0.026352 -0.013135 -0.028932 v -0.026283 -0.013135 -0.030175 v -0.026377 -0.013135 -0.030206 v -0.026104 -0.013135 -0.030406 v -0.026320 -0.013135 -0.028642 v -0.026299 -0.013135 -0.028913 v -0.026263 -0.013135 -0.028623 v -0.026246 -0.013135 -0.028901 v -0.026194 -0.013135 -0.030137 v -0.026225 -0.013135 -0.028613 v -0.026193 -0.013135 -0.028895 v -0.026175 -0.013135 -0.028604 v -0.026111 -0.013135 -0.030092 v -0.026140 -0.013135 -0.028897 v -0.026116 -0.013135 -0.028598 v -0.026088 -0.013135 -0.028904 v -0.026058 -0.013135 -0.028598 v -0.026033 -0.013135 -0.030039 v -0.026063 -0.013135 -0.030389 v -0.026035 -0.013135 -0.028919 v -0.026033 -0.013135 -0.030374 v -0.026001 -0.013135 -0.028604 v -0.025983 -0.013135 -0.028940 v -0.025960 -0.013135 -0.029979 v -0.025963 -0.013135 -0.030333 v -0.025945 -0.013135 -0.028615 v -0.025930 -0.013135 -0.028968 v -0.025884 -0.013135 -0.030276 v -0.025893 -0.013135 -0.029911 v -0.025889 -0.013135 -0.028631 v -0.025878 -0.013135 -0.029003 v -0.025857 -0.013135 -0.029869 v -0.025835 -0.013135 -0.028653 v -0.025806 -0.013135 -0.030209 v -0.025848 -0.013135 -0.029027 v -0.025823 -0.013135 -0.029824 v -0.025820 -0.013135 -0.029051 v -0.025781 -0.013135 -0.028681 v -0.025768 -0.013135 -0.029741 v -0.025783 -0.013135 -0.029090 v -0.025720 -0.013135 -0.030119 v -0.025755 -0.013135 -0.029124 v -0.025746 -0.013135 -0.028703 v -0.025729 -0.013135 -0.029668 v -0.025732 -0.013135 -0.029159 v -0.025711 -0.013135 -0.028727 v -0.025712 -0.013135 -0.029196 v -0.025702 -0.013135 -0.029604 v -0.025617 -0.013135 -0.029991 v -0.025696 -0.013135 -0.029235 v -0.025644 -0.013135 -0.028781 v -0.025685 -0.013135 -0.029550 v -0.025683 -0.013135 -0.029275 v -0.025674 -0.013135 -0.029495 v -0.025674 -0.013135 -0.029317 v -0.025668 -0.013135 -0.029441 v -0.025668 -0.013135 -0.029370 v -0.025666 -0.013135 -0.029406 v -0.025584 -0.013135 -0.028839 v -0.025560 -0.013135 -0.029907 v -0.025532 -0.013135 -0.028901 v -0.025511 -0.013135 -0.029823 v -0.025495 -0.013135 -0.028955 v -0.025463 -0.013135 -0.029725 v -0.025463 -0.013135 -0.029012 v -0.025427 -0.013135 -0.029627 v -0.025436 -0.013135 -0.029071 v -0.025415 -0.013135 -0.029133 v -0.025405 -0.013135 -0.029544 v -0.025400 -0.013135 -0.029198 v -0.025391 -0.013135 -0.029460 v -0.025393 -0.013135 -0.029238 v -0.025387 -0.013135 -0.029293 v -0.025385 -0.013135 -0.029376 v -0.015842 0.012840 -0.011666 v -0.016627 0.012840 -0.012738 v -0.016398 0.012840 -0.012905 v -0.015789 0.012840 -0.012073 v -0.014732 0.012840 -0.012479 v -0.015140 0.012840 -0.012548 v -0.015512 0.012840 -0.013294 v -0.015513 0.012840 -0.013347 v -0.015509 0.012840 -0.013412 v -0.015504 0.012840 -0.013214 v -0.015499 0.012840 -0.013476 v -0.015487 0.012840 -0.013134 v -0.015483 0.012840 -0.013538 v -0.015461 0.012840 -0.013052 v -0.015462 0.012840 -0.013598 v -0.015436 0.012840 -0.013656 v -0.015421 0.012840 -0.012956 v -0.015404 0.012840 -0.013713 v -0.015368 0.012840 -0.012859 v -0.015359 0.012840 -0.013778 v -0.015284 0.012840 -0.012732 v -0.015305 0.012840 -0.013840 v -0.015244 0.012840 -0.013899 v -0.015191 0.012840 -0.013275 v -0.015190 0.012840 -0.013322 v -0.015162 0.012840 -0.013964 v -0.015186 0.012840 -0.013217 v -0.015188 0.012840 -0.013351 v -0.015184 0.012840 -0.013378 v -0.015175 0.012840 -0.013158 v -0.015174 0.012840 -0.013423 v -0.015158 0.012840 -0.013097 v -0.015160 0.012840 -0.013466 v -0.015072 0.012840 -0.014024 v -0.015142 0.012840 -0.013507 v -0.015131 0.012840 -0.013026 v -0.015120 0.012840 -0.013547 v -0.015005 0.012840 -0.012813 v -0.015050 0.012840 -0.012878 v -0.015089 0.012840 -0.012942 v -0.015094 0.012840 -0.013586 v -0.015058 0.012840 -0.013630 v -0.014994 0.012840 -0.014066 v -0.015015 0.012840 -0.013672 v -0.014958 0.012840 -0.013718 v -0.014914 0.012840 -0.014100 v -0.014905 0.012840 -0.013753 v -0.014834 0.012840 -0.014125 v -0.014852 0.012840 -0.013783 v -0.014798 0.012840 -0.013807 v -0.014767 0.012840 -0.014138 v -0.014743 0.012840 -0.013824 v -0.014699 0.012840 -0.014146 v -0.014698 0.012840 -0.013835 v -0.014631 0.012840 -0.014148 v -0.014651 0.012840 -0.013841 v -0.014605 0.012840 -0.013842 v -0.014562 0.012840 -0.014144 v -0.014558 0.012840 -0.013840 v -0.014492 0.012840 -0.014134 v -0.014501 0.012840 -0.013832 v -0.014454 0.012840 -0.013821 v -0.014423 0.012840 -0.014118 v -0.014408 0.012840 -0.013806 v -0.014342 0.012840 -0.014091 v -0.014355 0.012840 -0.013783 v -0.014304 0.012840 -0.013755 v -0.014264 0.012840 -0.014055 v -0.014255 0.012840 -0.013721 v -0.014188 0.012840 -0.014010 v -0.014200 0.012840 -0.013675 v -0.014148 0.012840 -0.013621 v -0.014115 0.012840 -0.013957 v -0.014091 0.012840 -0.013551 v -0.014032 0.012840 -0.013885 v -0.014065 0.012840 -0.013513 v -0.014040 0.012840 -0.013473 v -0.013997 0.012840 -0.013391 v -0.013952 0.012840 -0.013800 v -0.013961 0.012840 -0.013303 v -0.013934 0.012840 -0.013210 v -0.013876 0.012840 -0.013704 v -0.013912 0.012840 -0.013099 v -0.013900 0.012840 -0.012982 v -0.013631 0.012840 -0.013179 v -0.013773 0.012840 -0.013550 v -0.013712 0.012840 -0.013440 v -0.013672 0.012840 -0.013347 v -0.013650 0.012840 -0.013279 v -0.013639 0.012840 -0.013232 v -0.014363 0.012840 -0.010033 v -0.015158 0.012840 -0.010628 v -0.014651 0.012840 -0.010610 v -0.013116 0.012840 -0.012123 v -0.014123 0.012840 -0.010209 v -0.012931 0.012840 -0.011870 v -0.013482 0.012840 -0.012622 v -0.013259 0.012840 -0.012784 v -0.012342 0.012840 -0.011532 v -0.012565 0.012840 -0.011369 v -0.016398 0.013232 -0.012905 v -0.016627 0.013232 -0.012738 v -0.015842 0.013232 -0.011666 v -0.015789 0.013232 -0.012073 v -0.014732 0.013232 -0.012479 v -0.015140 0.013232 -0.012548 v -0.015509 0.013232 -0.013412 v -0.015513 0.013232 -0.013347 v -0.015512 0.013232 -0.013294 v -0.015504 0.013232 -0.013214 v -0.015499 0.013232 -0.013476 v -0.015487 0.013232 -0.013134 v -0.015483 0.013232 -0.013538 v -0.015461 0.013232 -0.013052 v -0.015462 0.013232 -0.013598 v -0.015436 0.013232 -0.013656 v -0.015421 0.013232 -0.012956 v -0.015404 0.013232 -0.013713 v -0.015368 0.013232 -0.012859 v -0.015359 0.013232 -0.013778 v -0.015284 0.013232 -0.012732 v -0.015305 0.013232 -0.013840 v -0.015244 0.013232 -0.013899 v -0.015191 0.013232 -0.013275 v -0.015190 0.013232 -0.013322 v -0.015162 0.013232 -0.013964 v -0.015186 0.013232 -0.013217 v -0.015188 0.013232 -0.013351 v -0.015184 0.013232 -0.013378 v -0.015175 0.013232 -0.013158 v -0.015174 0.013232 -0.013423 v -0.015158 0.013232 -0.013097 v -0.015160 0.013232 -0.013466 v -0.015072 0.013232 -0.014024 v -0.015142 0.013232 -0.013507 v -0.015131 0.013232 -0.013026 v -0.015120 0.013232 -0.013547 v -0.015005 0.013232 -0.012813 v -0.015050 0.013232 -0.012878 v -0.015089 0.013232 -0.012942 v -0.015094 0.013232 -0.013586 v -0.015058 0.013232 -0.013630 v -0.014994 0.013232 -0.014066 v -0.015015 0.013232 -0.013672 v -0.014958 0.013232 -0.013718 v -0.014914 0.013232 -0.014100 v -0.014905 0.013232 -0.013753 v -0.014834 0.013232 -0.014125 v -0.014852 0.013232 -0.013783 v -0.014798 0.013232 -0.013807 v -0.014767 0.013232 -0.014138 v -0.014743 0.013232 -0.013824 v -0.014699 0.013232 -0.014146 v -0.014698 0.013232 -0.013835 v -0.014631 0.013232 -0.014148 v -0.014651 0.013232 -0.013841 v -0.014605 0.013232 -0.013842 v -0.014562 0.013232 -0.014144 v -0.014558 0.013232 -0.013840 v -0.014492 0.013232 -0.014134 v -0.014501 0.013232 -0.013832 v -0.014454 0.013232 -0.013821 v -0.014423 0.013232 -0.014118 v -0.014408 0.013232 -0.013806 v -0.014342 0.013232 -0.014091 v -0.014355 0.013232 -0.013783 v -0.014304 0.013232 -0.013755 v -0.014264 0.013232 -0.014055 v -0.014255 0.013232 -0.013721 v -0.014188 0.013232 -0.014010 v -0.014200 0.013232 -0.013675 v -0.014148 0.013232 -0.013621 v -0.014115 0.013232 -0.013957 v -0.014091 0.013232 -0.013551 v -0.014032 0.013232 -0.013885 v -0.014065 0.013232 -0.013513 v -0.014040 0.013232 -0.013473 v -0.013997 0.013232 -0.013391 v -0.013952 0.013232 -0.013800 v -0.013961 0.013232 -0.013303 v -0.013934 0.013232 -0.013210 v -0.013876 0.013232 -0.013704 v -0.013912 0.013232 -0.013099 v -0.013900 0.013232 -0.012982 v -0.013631 0.013232 -0.013179 v -0.013773 0.013232 -0.013550 v -0.013712 0.013232 -0.013440 v -0.013672 0.013232 -0.013347 v -0.013650 0.013232 -0.013279 v -0.013639 0.013232 -0.013232 v -0.014651 0.013232 -0.010610 v -0.015158 0.013232 -0.010628 v -0.014363 0.013232 -0.010033 v -0.013116 0.013232 -0.012123 v -0.014123 0.013232 -0.010209 v -0.012931 0.013232 -0.011870 v -0.013259 0.013232 -0.012784 v -0.013482 0.013232 -0.012622 v -0.012342 0.013232 -0.011532 v -0.012565 0.013232 -0.011369 v -0.021701 0.013002 -0.019831 v -0.022486 0.013002 -0.020903 v -0.022257 0.013002 -0.021070 v -0.021648 0.013002 -0.020238 v -0.020591 0.013002 -0.020645 v -0.020999 0.013002 -0.020713 v -0.021371 0.013002 -0.021459 v -0.021372 0.013002 -0.021512 v -0.021368 0.013002 -0.021577 v -0.021363 0.013002 -0.021379 v -0.021358 0.013002 -0.021641 v -0.021346 0.013002 -0.021299 v -0.021342 0.013002 -0.021703 v -0.021320 0.013002 -0.021217 v -0.021321 0.013002 -0.021764 v -0.021295 0.013002 -0.021822 v -0.021280 0.013002 -0.021121 v -0.021263 0.013002 -0.021878 v -0.021227 0.013002 -0.021024 v -0.021218 0.013002 -0.021943 v -0.021143 0.013002 -0.020897 v -0.021164 0.013002 -0.022005 v -0.021103 0.013002 -0.022064 v -0.021050 0.013002 -0.021440 v -0.021049 0.013002 -0.021488 v -0.021021 0.013002 -0.022130 v -0.021045 0.013002 -0.021382 v -0.021047 0.013002 -0.021516 v -0.021043 0.013002 -0.021543 v -0.021034 0.013002 -0.021323 v -0.021033 0.013002 -0.021588 v -0.021017 0.013002 -0.021263 v -0.021019 0.013002 -0.021631 v -0.020931 0.013002 -0.022190 v -0.021001 0.013002 -0.021672 v -0.020990 0.013002 -0.021191 v -0.020979 0.013002 -0.021712 v -0.020864 0.013002 -0.020978 v -0.020909 0.013002 -0.021043 v -0.020948 0.013002 -0.021107 v -0.020953 0.013002 -0.021751 v -0.020917 0.013002 -0.021795 v -0.020853 0.013002 -0.022232 v -0.020874 0.013002 -0.021837 v -0.020817 0.013002 -0.021883 v -0.020773 0.013002 -0.022265 v -0.020764 0.013002 -0.021919 v -0.020693 0.013002 -0.022290 v -0.020711 0.013002 -0.021948 v -0.020657 0.013002 -0.021972 v -0.020626 0.013002 -0.022304 v -0.020602 0.013002 -0.021990 v -0.020558 0.013002 -0.022312 v -0.020557 0.013002 -0.022000 v -0.020490 0.013002 -0.022313 v -0.020510 0.013002 -0.022006 v -0.020464 0.013002 -0.022008 v -0.020421 0.013002 -0.022309 v -0.020417 0.013002 -0.022006 v -0.020351 0.013002 -0.022299 v -0.020360 0.013002 -0.021997 v -0.020313 0.013002 -0.021986 v -0.020282 0.013002 -0.022283 v -0.020267 0.013002 -0.021971 v -0.020201 0.013002 -0.022256 v -0.020214 0.013002 -0.021948 v -0.020163 0.013002 -0.021920 v -0.020123 0.013002 -0.022220 v -0.020114 0.013002 -0.021886 v -0.020047 0.013002 -0.022176 v -0.020059 0.013002 -0.021840 v -0.020007 0.013002 -0.021787 v -0.019974 0.013002 -0.022123 v -0.019950 0.013002 -0.021716 v -0.019891 0.013002 -0.022050 v -0.019924 0.013002 -0.021678 v -0.019899 0.013002 -0.021639 v -0.019856 0.013002 -0.021556 v -0.019811 0.013002 -0.021965 v -0.019820 0.013002 -0.021468 v -0.019793 0.013002 -0.021375 v -0.019735 0.013002 -0.021869 v -0.019771 0.013002 -0.021264 v -0.019759 0.013002 -0.021147 v -0.019490 0.013002 -0.021344 v -0.019632 0.013002 -0.021716 v -0.019571 0.013002 -0.021605 v -0.019531 0.013002 -0.021513 v -0.019509 0.013002 -0.021444 v -0.019498 0.013002 -0.021398 v -0.021073 0.013002 -0.019112 v -0.021073 0.013002 -0.019170 v -0.021069 0.013002 -0.019227 v -0.021066 0.013002 -0.019042 v -0.021057 0.013002 -0.019295 v -0.021051 0.013002 -0.018972 v -0.021041 0.013002 -0.019349 v -0.021030 0.013002 -0.018902 v -0.021022 0.013002 -0.019402 v -0.020995 0.013002 -0.018820 v -0.020997 0.013002 -0.019453 v -0.020961 0.013002 -0.019511 v -0.020951 0.013002 -0.018738 v -0.020919 0.013002 -0.019568 v -0.020888 0.013002 -0.018643 v -0.020870 0.013002 -0.019621 v -0.020803 0.013002 -0.018539 v -0.020824 0.013002 -0.019664 v -0.020762 0.013002 -0.019712 v -0.020724 0.013002 -0.018458 v -0.020773 0.013002 -0.019078 v -0.020774 0.013002 -0.019116 v -0.020770 0.013002 -0.019154 v -0.020770 0.013002 -0.019040 v -0.020765 0.013002 -0.019183 v -0.020761 0.013002 -0.018994 v -0.020758 0.013002 -0.019212 v -0.020692 0.013002 -0.019759 v -0.020747 0.013002 -0.018948 v -0.020746 0.013002 -0.019248 v -0.020728 0.013002 -0.018901 v -0.020731 0.013002 -0.019282 v -0.020712 0.013002 -0.019315 v -0.020699 0.013002 -0.018845 v -0.020639 0.013002 -0.018385 v -0.020686 0.013002 -0.019355 v -0.020675 0.013002 -0.018805 v -0.020618 0.013002 -0.019800 v -0.020654 0.013002 -0.019392 v -0.020647 0.013002 -0.018765 v -0.020611 0.013002 -0.019434 v -0.020592 0.013002 -0.018697 v -0.020548 0.013002 -0.018322 v -0.020530 0.013002 -0.019837 v -0.020554 0.013002 -0.019480 v -0.020529 0.013002 -0.018635 v -0.020516 0.013002 -0.019507 v -0.020452 0.013002 -0.018268 v -0.020437 0.013002 -0.019867 v -0.020460 0.013002 -0.018579 v -0.020485 0.013002 -0.019526 v -0.020421 0.013002 -0.019559 v -0.020385 0.013002 -0.018529 v -0.020350 0.013002 -0.018223 v -0.020351 0.013002 -0.019887 v -0.020354 0.013002 -0.019587 v -0.020302 0.013002 -0.018485 v -0.020284 0.013002 -0.019608 v -0.020260 0.013002 -0.019900 v -0.020243 0.013002 -0.018188 v -0.020197 0.013002 -0.018441 v -0.020211 0.013002 -0.019623 v -0.020122 0.013002 -0.019908 v -0.019978 0.013002 -0.018382 v -0.020100 0.013002 -0.018411 v -0.020126 0.013002 -0.019632 v -0.020010 0.013002 -0.019634 v -0.019829 0.013002 -0.019896 v -0.019877 0.013002 -0.019629 v -0.019456 0.013002 -0.019580 v -0.019447 0.013002 -0.019848 v -0.018336 0.013002 -0.019409 v -0.018568 0.013002 -0.019706 v -0.018562 0.013002 -0.019711 v -0.019316 0.013002 -0.020741 v -0.019088 0.013002 -0.020908 v -0.018111 0.013002 -0.019574 v -0.022257 0.013232 -0.021070 v -0.022486 0.013232 -0.020903 v -0.021701 0.013232 -0.019831 v -0.021648 0.013232 -0.020238 v -0.020591 0.013232 -0.020645 v -0.020999 0.013232 -0.020713 v -0.021368 0.013232 -0.021577 v -0.021372 0.013232 -0.021512 v -0.021371 0.013232 -0.021459 v -0.021363 0.013232 -0.021379 v -0.021358 0.013232 -0.021641 v -0.021346 0.013232 -0.021299 v -0.021342 0.013232 -0.021703 v -0.021320 0.013232 -0.021217 v -0.021321 0.013232 -0.021764 v -0.021295 0.013232 -0.021822 v -0.021280 0.013232 -0.021121 v -0.021263 0.013232 -0.021878 v -0.021227 0.013232 -0.021024 v -0.021218 0.013232 -0.021943 v -0.021143 0.013232 -0.020897 v -0.021164 0.013232 -0.022005 v -0.021103 0.013232 -0.022064 v -0.021050 0.013232 -0.021440 v -0.021049 0.013232 -0.021488 v -0.021021 0.013232 -0.022130 v -0.021045 0.013232 -0.021382 v -0.021047 0.013232 -0.021516 v -0.021043 0.013232 -0.021543 v -0.021034 0.013232 -0.021323 v -0.021033 0.013232 -0.021588 v -0.021017 0.013232 -0.021263 v -0.021019 0.013232 -0.021631 v -0.020931 0.013232 -0.022190 v -0.021001 0.013232 -0.021672 v -0.020990 0.013232 -0.021191 v -0.020979 0.013232 -0.021712 v -0.020864 0.013232 -0.020978 v -0.020909 0.013232 -0.021043 v -0.020948 0.013232 -0.021107 v -0.020953 0.013232 -0.021751 v -0.020917 0.013232 -0.021795 v -0.020853 0.013232 -0.022232 v -0.020874 0.013232 -0.021837 v -0.020817 0.013232 -0.021883 v -0.020773 0.013232 -0.022265 v -0.020764 0.013232 -0.021919 v -0.020693 0.013232 -0.022290 v -0.020711 0.013232 -0.021948 v -0.020657 0.013232 -0.021972 v -0.020626 0.013232 -0.022304 v -0.020602 0.013232 -0.021990 v -0.020558 0.013232 -0.022312 v -0.020557 0.013232 -0.022000 v -0.020490 0.013232 -0.022313 v -0.020510 0.013232 -0.022006 v -0.020464 0.013232 -0.022008 v -0.020421 0.013232 -0.022309 v -0.020417 0.013232 -0.022006 v -0.020351 0.013232 -0.022299 v -0.020360 0.013232 -0.021997 v -0.020313 0.013232 -0.021986 v -0.020282 0.013232 -0.022283 v -0.020267 0.013232 -0.021971 v -0.020201 0.013232 -0.022256 v -0.020214 0.013232 -0.021948 v -0.020163 0.013232 -0.021920 v -0.020123 0.013232 -0.022220 v -0.020114 0.013232 -0.021886 v -0.020047 0.013232 -0.022176 v -0.020059 0.013232 -0.021840 v -0.020007 0.013232 -0.021787 v -0.019974 0.013232 -0.022123 v -0.019950 0.013232 -0.021716 v -0.019891 0.013232 -0.022050 v -0.019924 0.013232 -0.021678 v -0.019899 0.013232 -0.021639 v -0.019856 0.013232 -0.021556 v -0.019811 0.013232 -0.021965 v -0.019820 0.013232 -0.021468 v -0.019793 0.013232 -0.021375 v -0.019735 0.013232 -0.021869 v -0.019771 0.013232 -0.021264 v -0.019759 0.013232 -0.021147 v -0.019490 0.013232 -0.021344 v -0.019632 0.013232 -0.021716 v -0.019571 0.013232 -0.021605 v -0.019531 0.013232 -0.021513 v -0.019509 0.013232 -0.021444 v -0.019498 0.013232 -0.021398 v -0.021069 0.013232 -0.019227 v -0.021073 0.013232 -0.019170 v -0.021073 0.013232 -0.019112 v -0.021066 0.013232 -0.019042 v -0.021057 0.013232 -0.019295 v -0.021051 0.013232 -0.018972 v -0.021041 0.013232 -0.019349 v -0.021030 0.013232 -0.018902 v -0.021022 0.013232 -0.019402 v -0.020995 0.013232 -0.018820 v -0.020997 0.013232 -0.019453 v -0.020961 0.013232 -0.019511 v -0.020951 0.013232 -0.018738 v -0.020919 0.013232 -0.019568 v -0.020888 0.013232 -0.018643 v -0.020870 0.013232 -0.019621 v -0.020803 0.013232 -0.018539 v -0.020824 0.013232 -0.019664 v -0.020762 0.013232 -0.019712 v -0.020773 0.013232 -0.019078 v -0.020724 0.013232 -0.018458 v -0.020774 0.013232 -0.019116 v -0.020770 0.013232 -0.019154 v -0.020770 0.013232 -0.019040 v -0.020765 0.013232 -0.019183 v -0.020761 0.013232 -0.018994 v -0.020758 0.013232 -0.019212 v -0.020692 0.013232 -0.019759 v -0.020747 0.013232 -0.018948 v -0.020746 0.013232 -0.019248 v -0.020728 0.013232 -0.018901 v -0.020731 0.013232 -0.019282 v -0.020712 0.013232 -0.019315 v -0.020699 0.013232 -0.018845 v -0.020639 0.013232 -0.018385 v -0.020686 0.013232 -0.019355 v -0.020675 0.013232 -0.018805 v -0.020618 0.013232 -0.019800 v -0.020654 0.013232 -0.019392 v -0.020647 0.013232 -0.018765 v -0.020611 0.013232 -0.019434 v -0.020592 0.013232 -0.018697 v -0.020548 0.013232 -0.018322 v -0.020530 0.013232 -0.019837 v -0.020554 0.013232 -0.019480 v -0.020529 0.013232 -0.018635 v -0.020516 0.013232 -0.019507 v -0.020452 0.013232 -0.018268 v -0.020437 0.013232 -0.019867 v -0.020460 0.013232 -0.018579 v -0.020485 0.013232 -0.019526 v -0.020421 0.013232 -0.019559 v -0.020385 0.013232 -0.018529 v -0.020350 0.013232 -0.018223 v -0.020351 0.013232 -0.019887 v -0.020354 0.013232 -0.019587 v -0.020302 0.013232 -0.018485 v -0.020284 0.013232 -0.019608 v -0.020260 0.013232 -0.019900 v -0.020243 0.013232 -0.018188 v -0.020197 0.013232 -0.018441 v -0.020211 0.013232 -0.019623 v -0.020122 0.013232 -0.019908 v -0.020100 0.013232 -0.018411 v -0.019978 0.013232 -0.018382 v -0.020126 0.013232 -0.019632 v -0.020010 0.013232 -0.019634 v -0.019829 0.013232 -0.019896 v -0.019877 0.013232 -0.019629 v -0.019456 0.013232 -0.019580 v -0.019447 0.013232 -0.019848 v -0.018336 0.013232 -0.019409 v -0.018568 0.013232 -0.019706 v -0.019088 0.013232 -0.020908 v -0.019316 0.013232 -0.020741 v -0.018562 0.013232 -0.019711 v -0.018111 0.013232 -0.019574 v -0.027378 0.013002 -0.027672 v -0.028163 0.013002 -0.028744 v -0.027934 0.013002 -0.028911 v -0.027325 0.013002 -0.028079 v -0.026268 0.013002 -0.028485 v -0.026676 0.013002 -0.028554 v -0.027048 0.013002 -0.029300 v -0.027049 0.013002 -0.029353 v -0.027044 0.013002 -0.029418 v -0.027039 0.013002 -0.029220 v -0.027035 0.013002 -0.029482 v -0.027022 0.013002 -0.029140 v -0.027019 0.013002 -0.029544 v -0.026997 0.013002 -0.029058 v -0.026998 0.013002 -0.029604 v -0.026972 0.013002 -0.029663 v -0.026956 0.013002 -0.028962 v -0.026940 0.013002 -0.029719 v -0.026904 0.013002 -0.028865 v -0.026895 0.013002 -0.029784 v -0.026820 0.013002 -0.028738 v -0.026841 0.013002 -0.029846 v -0.026780 0.013002 -0.029905 v -0.026727 0.013002 -0.029281 v -0.026726 0.013002 -0.029329 v -0.026698 0.013002 -0.029971 v -0.026722 0.013002 -0.029223 v -0.026724 0.013002 -0.029357 v -0.026720 0.013002 -0.029384 v -0.026711 0.013002 -0.029164 v -0.026710 0.013002 -0.029429 v -0.026694 0.013002 -0.029104 v -0.026696 0.013002 -0.029472 v -0.026608 0.013002 -0.030031 v -0.026678 0.013002 -0.029513 v -0.026666 0.013002 -0.029032 v -0.026656 0.013002 -0.029553 v -0.026541 0.013002 -0.028819 v -0.026586 0.013002 -0.028884 v -0.026624 0.013002 -0.028948 v -0.026630 0.013002 -0.029592 v -0.026593 0.013002 -0.029636 v -0.026529 0.013002 -0.030073 v -0.026551 0.013002 -0.029678 v -0.026494 0.013002 -0.029724 v -0.026450 0.013002 -0.030106 v -0.026441 0.013002 -0.029760 v -0.026370 0.013002 -0.030131 v -0.026388 0.013002 -0.029789 v -0.026334 0.013002 -0.029813 v -0.026303 0.013002 -0.030145 v -0.026279 0.013002 -0.029831 v -0.026235 0.013002 -0.030152 v -0.026233 0.013002 -0.029841 v -0.026166 0.013002 -0.030154 v -0.026187 0.013002 -0.029847 v -0.026141 0.013002 -0.029849 v -0.026097 0.013002 -0.030150 v -0.026094 0.013002 -0.029846 v -0.026028 0.013002 -0.030140 v -0.026037 0.013002 -0.029838 v -0.025990 0.013002 -0.029827 v -0.025959 0.013002 -0.030124 v -0.025944 0.013002 -0.029812 v -0.025878 0.013002 -0.030097 v -0.025891 0.013002 -0.029789 v -0.025840 0.013002 -0.029761 v -0.025800 0.013002 -0.030061 v -0.025791 0.013002 -0.029727 v -0.025724 0.013002 -0.030017 v -0.025736 0.013002 -0.029681 v -0.025684 0.013002 -0.029628 v -0.025650 0.013002 -0.029964 v -0.025627 0.013002 -0.029557 v -0.025568 0.013002 -0.029891 v -0.025600 0.013002 -0.029519 v -0.025576 0.013002 -0.029480 v -0.025533 0.013002 -0.029397 v -0.025488 0.013002 -0.029806 v -0.025497 0.013002 -0.029309 v -0.025469 0.013002 -0.029216 v -0.025412 0.013002 -0.029710 v -0.025448 0.013002 -0.029105 v -0.025436 0.013002 -0.028988 v -0.025167 0.013002 -0.029185 v -0.025309 0.013002 -0.029556 v -0.025248 0.013002 -0.029446 v -0.025208 0.013002 -0.029353 v -0.025186 0.013002 -0.029285 v -0.025175 0.013002 -0.029239 v -0.026689 0.013002 -0.026853 v -0.026691 0.013002 -0.026909 v -0.026688 0.013002 -0.026964 v -0.026681 0.013002 -0.026787 v -0.026679 0.013002 -0.027029 v -0.026666 0.013002 -0.026721 v -0.026664 0.013002 -0.027091 v -0.026645 0.013002 -0.026654 v -0.026647 0.013002 -0.027140 v -0.026626 0.013002 -0.027186 v -0.026611 0.013002 -0.026576 v -0.026601 0.013002 -0.027231 v -0.026569 0.013002 -0.026498 v -0.026571 0.013002 -0.027274 v -0.026530 0.013002 -0.027322 v -0.026509 0.013002 -0.026409 v -0.026484 0.013002 -0.027368 v -0.026430 0.013002 -0.026310 v -0.026431 0.013002 -0.027410 v -0.026344 0.013002 -0.027467 v -0.026356 0.013002 -0.026231 v -0.026385 0.013002 -0.026829 v -0.026385 0.013002 -0.026871 v -0.026380 0.013002 -0.026785 v -0.026380 0.013002 -0.026913 v -0.026371 0.013002 -0.026741 v -0.026370 0.013002 -0.026953 v -0.026356 0.013002 -0.026695 v -0.026355 0.013002 -0.026993 v -0.026269 0.013002 -0.026153 v -0.026329 0.013002 -0.026633 v -0.026335 0.013002 -0.027031 v -0.026273 0.013002 -0.027503 v -0.026311 0.013002 -0.027068 v -0.026293 0.013002 -0.026568 v -0.026281 0.013002 -0.027105 v -0.026248 0.013002 -0.026502 v -0.026234 0.013002 -0.027152 v -0.026203 0.013002 -0.027531 v -0.026188 0.013002 -0.026092 v -0.026198 0.013002 -0.026440 v -0.026178 0.013002 -0.027197 v -0.026132 0.013002 -0.027550 v -0.026142 0.013002 -0.026383 v -0.026103 0.013002 -0.026041 v -0.026129 0.013002 -0.027230 v -0.026080 0.013002 -0.026332 v -0.026079 0.013002 -0.027558 v -0.026096 0.013002 -0.027248 v -0.026014 0.013002 -0.025998 v -0.026048 0.013002 -0.027271 v -0.026013 0.013002 -0.026286 v -0.026026 0.013002 -0.027562 v -0.025999 0.013002 -0.027287 v -0.025973 0.013002 -0.027561 v -0.025767 0.013002 -0.026179 v -0.025863 0.013002 -0.026211 v -0.025941 0.013002 -0.026246 v -0.025950 0.013002 -0.027298 v -0.025920 0.013002 -0.027555 v -0.025901 0.013002 -0.027302 v -0.025848 0.013002 -0.027539 v -0.025853 0.013002 -0.027300 v -0.025804 0.013002 -0.027292 v -0.025777 0.013002 -0.027515 v -0.025756 0.013002 -0.027278 v -0.025705 0.013002 -0.027482 v -0.025707 0.013002 -0.027258 v -0.025659 0.013002 -0.027232 v -0.025633 0.013002 -0.027441 v -0.025610 0.013002 -0.027200 v -0.025656 0.013002 -0.027735 v -0.025657 0.013002 -0.027795 v -0.025655 0.013002 -0.027835 v -0.025649 0.013002 -0.027675 v -0.025649 0.013002 -0.027885 v -0.025634 0.013002 -0.027605 v -0.025636 0.013002 -0.027943 v -0.025619 0.013002 -0.027998 v -0.025611 0.013002 -0.027534 v -0.025543 0.013002 -0.027377 v -0.025596 0.013002 -0.028051 v -0.025581 0.013002 -0.027463 v -0.025546 0.013002 -0.027147 v -0.025569 0.013002 -0.028101 v -0.025537 0.013002 -0.027381 v -0.025536 0.013002 -0.028149 v -0.025465 0.013002 -0.027067 v -0.025499 0.013002 -0.028194 v -0.025456 0.013002 -0.028237 v -0.025369 0.013002 -0.026947 v -0.025425 0.013002 -0.028264 v -0.025391 0.013002 -0.027674 v -0.025391 0.013002 -0.028290 v -0.025387 0.013002 -0.027728 v -0.025319 0.013002 -0.028338 v -0.025389 0.013002 -0.027617 v -0.025380 0.013002 -0.027559 v -0.025376 0.013002 -0.027780 v -0.025366 0.013002 -0.027498 v -0.025359 0.013002 -0.027830 v -0.025241 0.013002 -0.026773 v -0.025336 0.013002 -0.027414 v -0.025336 0.013002 -0.027878 v -0.025295 0.013002 -0.027326 v -0.025306 0.013002 -0.027923 v -0.025246 0.013002 -0.028378 v -0.025270 0.013002 -0.027967 v -0.025242 0.013002 -0.027234 v -0.025227 0.013002 -0.028008 v -0.025172 0.013002 -0.028408 v -0.025161 0.013002 -0.027114 v -0.025026 0.013002 -0.026930 v -0.025178 0.013002 -0.028047 v -0.025147 0.013002 -0.028069 v -0.025108 0.013002 -0.028428 v -0.025115 0.013002 -0.028088 v -0.025067 0.013002 -0.028112 v -0.025045 0.013002 -0.028441 v -0.025026 0.013002 -0.028128 v -0.024980 0.013002 -0.028448 v -0.024985 0.013002 -0.028140 v -0.024944 0.013002 -0.028148 v -0.024914 0.013002 -0.028449 v -0.024902 0.013002 -0.028152 v -0.024848 0.013002 -0.028445 v -0.024860 0.013002 -0.028152 v -0.024817 0.013002 -0.028148 v -0.024808 0.013002 -0.028439 v -0.024765 0.013002 -0.028138 v -0.024754 0.013002 -0.028428 v -0.024731 0.013002 -0.028128 v -0.024674 0.013002 -0.028405 v -0.024697 0.013002 -0.028116 v -0.024647 0.013002 -0.028094 v -0.024596 0.013002 -0.028374 v -0.024599 0.013002 -0.028066 v -0.024552 0.013002 -0.028034 v -0.024520 0.013002 -0.028336 v -0.024499 0.013002 -0.027990 v -0.024447 0.013002 -0.028289 v -0.024441 0.013002 -0.027930 v -0.024365 0.013002 -0.028225 v -0.024379 0.013002 -0.027853 v -0.024347 0.013002 -0.027807 v -0.024286 0.013002 -0.028151 v -0.024317 0.013002 -0.027759 v -0.024273 0.013002 -0.027675 v -0.024220 0.013002 -0.028078 v -0.024238 0.013002 -0.027587 v -0.024211 0.013002 -0.027497 v -0.024158 0.013002 -0.027998 v -0.024193 0.013002 -0.027404 v -0.024183 0.013002 -0.027308 v -0.024182 0.013002 -0.027209 v -0.023909 0.013002 -0.027409 v -0.024066 0.013002 -0.027861 v -0.024007 0.013002 -0.027753 v -0.023966 0.013002 -0.027658 v -0.023936 0.013002 -0.027566 v -0.023918 0.013002 -0.027487 v -0.023913 0.013002 -0.027453 v -0.027934 0.013232 -0.028911 v -0.028163 0.013232 -0.028744 v -0.027378 0.013232 -0.027672 v -0.027325 0.013232 -0.028079 v -0.026268 0.013232 -0.028485 v -0.026676 0.013232 -0.028554 v -0.027044 0.013232 -0.029418 v -0.027049 0.013232 -0.029353 v -0.027048 0.013232 -0.029300 v -0.027039 0.013232 -0.029220 v -0.027035 0.013232 -0.029482 v -0.027022 0.013232 -0.029140 v -0.027019 0.013232 -0.029544 v -0.026997 0.013232 -0.029058 v -0.026998 0.013232 -0.029604 v -0.026972 0.013232 -0.029663 v -0.026956 0.013232 -0.028962 v -0.026940 0.013232 -0.029719 v -0.026904 0.013232 -0.028865 v -0.026895 0.013232 -0.029784 v -0.026820 0.013232 -0.028738 v -0.026841 0.013232 -0.029846 v -0.026780 0.013232 -0.029905 v -0.026727 0.013232 -0.029281 v -0.026726 0.013232 -0.029329 v -0.026698 0.013232 -0.029971 v -0.026722 0.013232 -0.029223 v -0.026724 0.013232 -0.029357 v -0.026720 0.013232 -0.029384 v -0.026711 0.013232 -0.029164 v -0.026710 0.013232 -0.029429 v -0.026694 0.013232 -0.029104 v -0.026696 0.013232 -0.029472 v -0.026608 0.013232 -0.030031 v -0.026678 0.013232 -0.029513 v -0.026666 0.013232 -0.029032 v -0.026656 0.013232 -0.029553 v -0.026541 0.013232 -0.028819 v -0.026586 0.013232 -0.028884 v -0.026624 0.013232 -0.028948 v -0.026630 0.013232 -0.029592 v -0.026593 0.013232 -0.029636 v -0.026529 0.013232 -0.030073 v -0.026551 0.013232 -0.029678 v -0.026494 0.013232 -0.029724 v -0.026450 0.013232 -0.030106 v -0.026441 0.013232 -0.029760 v -0.026370 0.013232 -0.030131 v -0.026388 0.013232 -0.029789 v -0.026334 0.013232 -0.029813 v -0.026303 0.013232 -0.030145 v -0.026279 0.013232 -0.029831 v -0.026235 0.013232 -0.030152 v -0.026233 0.013232 -0.029841 v -0.026166 0.013232 -0.030154 v -0.026187 0.013232 -0.029847 v -0.026141 0.013232 -0.029849 v -0.026097 0.013232 -0.030150 v -0.026094 0.013232 -0.029846 v -0.026028 0.013232 -0.030140 v -0.026037 0.013232 -0.029838 v -0.025990 0.013232 -0.029827 v -0.025959 0.013232 -0.030124 v -0.025944 0.013232 -0.029812 v -0.025878 0.013232 -0.030097 v -0.025891 0.013232 -0.029789 v -0.025840 0.013232 -0.029761 v -0.025800 0.013232 -0.030061 v -0.025791 0.013232 -0.029727 v -0.025724 0.013232 -0.030017 v -0.025736 0.013232 -0.029681 v -0.025684 0.013232 -0.029628 v -0.025650 0.013232 -0.029964 v -0.025627 0.013232 -0.029557 v -0.025568 0.013232 -0.029891 v -0.025600 0.013232 -0.029519 v -0.025576 0.013232 -0.029480 v -0.025533 0.013232 -0.029397 v -0.025488 0.013232 -0.029806 v -0.025497 0.013232 -0.029309 v -0.025469 0.013232 -0.029216 v -0.025412 0.013232 -0.029710 v -0.025448 0.013232 -0.029105 v -0.025436 0.013232 -0.028988 v -0.025167 0.013232 -0.029185 v -0.025309 0.013232 -0.029556 v -0.025248 0.013232 -0.029446 v -0.025208 0.013232 -0.029353 v -0.025186 0.013232 -0.029285 v -0.025175 0.013232 -0.029239 v -0.026688 0.013232 -0.026964 v -0.026691 0.013232 -0.026909 v -0.026689 0.013232 -0.026853 v -0.026681 0.013232 -0.026787 v -0.026679 0.013232 -0.027029 v -0.026666 0.013232 -0.026721 v -0.026664 0.013232 -0.027091 v -0.026645 0.013232 -0.026654 v -0.026647 0.013232 -0.027140 v -0.026626 0.013232 -0.027186 v -0.026611 0.013232 -0.026576 v -0.026601 0.013232 -0.027231 v -0.026569 0.013232 -0.026498 v -0.026571 0.013232 -0.027274 v -0.026530 0.013232 -0.027322 v -0.026509 0.013232 -0.026409 v -0.026484 0.013232 -0.027368 v -0.026430 0.013232 -0.026310 v -0.026431 0.013232 -0.027410 v -0.026344 0.013232 -0.027467 v -0.026385 0.013232 -0.026829 v -0.026356 0.013232 -0.026231 v -0.026385 0.013232 -0.026871 v -0.026380 0.013232 -0.026785 v -0.026380 0.013232 -0.026913 v -0.026371 0.013232 -0.026741 v -0.026370 0.013232 -0.026953 v -0.026356 0.013232 -0.026695 v -0.026355 0.013232 -0.026993 v -0.026269 0.013232 -0.026153 v -0.026329 0.013232 -0.026633 v -0.026335 0.013232 -0.027031 v -0.026273 0.013232 -0.027503 v -0.026311 0.013232 -0.027068 v -0.026293 0.013232 -0.026568 v -0.026281 0.013232 -0.027105 v -0.026248 0.013232 -0.026502 v -0.026234 0.013232 -0.027152 v -0.026203 0.013232 -0.027531 v -0.026188 0.013232 -0.026092 v -0.026198 0.013232 -0.026440 v -0.026178 0.013232 -0.027197 v -0.026132 0.013232 -0.027550 v -0.026142 0.013232 -0.026383 v -0.026103 0.013232 -0.026041 v -0.026129 0.013232 -0.027230 v -0.026080 0.013232 -0.026332 v -0.026079 0.013232 -0.027558 v -0.026096 0.013232 -0.027248 v -0.026014 0.013232 -0.025998 v -0.026048 0.013232 -0.027271 v -0.026013 0.013232 -0.026286 v -0.026026 0.013232 -0.027562 v -0.025999 0.013232 -0.027287 v -0.025973 0.013232 -0.027561 v -0.025863 0.013232 -0.026211 v -0.025767 0.013232 -0.026179 v -0.025941 0.013232 -0.026246 v -0.025950 0.013232 -0.027298 v -0.025920 0.013232 -0.027555 v -0.025901 0.013232 -0.027302 v -0.025848 0.013232 -0.027539 v -0.025853 0.013232 -0.027300 v -0.025804 0.013232 -0.027292 v -0.025777 0.013232 -0.027515 v -0.025756 0.013232 -0.027278 v -0.025705 0.013232 -0.027482 v -0.025707 0.013232 -0.027258 v -0.025659 0.013232 -0.027232 v -0.025633 0.013232 -0.027441 v -0.025610 0.013232 -0.027200 v -0.025655 0.013232 -0.027835 v -0.025657 0.013232 -0.027795 v -0.025656 0.013232 -0.027735 v -0.025649 0.013232 -0.027675 v -0.025649 0.013232 -0.027885 v -0.025634 0.013232 -0.027605 v -0.025636 0.013232 -0.027943 v -0.025619 0.013232 -0.027998 v -0.025611 0.013232 -0.027534 v -0.025543 0.013232 -0.027377 v -0.025596 0.013232 -0.028051 v -0.025581 0.013232 -0.027463 v -0.025546 0.013232 -0.027147 v -0.025569 0.013232 -0.028101 v -0.025537 0.013232 -0.027381 v -0.025536 0.013232 -0.028149 v -0.025465 0.013232 -0.027067 v -0.025499 0.013232 -0.028194 v -0.025456 0.013232 -0.028237 v -0.025369 0.013232 -0.026947 v -0.025425 0.013232 -0.028264 v -0.025391 0.013232 -0.027674 v -0.025391 0.013232 -0.028290 v -0.025387 0.013232 -0.027728 v -0.025319 0.013232 -0.028338 v -0.025389 0.013232 -0.027617 v -0.025380 0.013232 -0.027559 v -0.025376 0.013232 -0.027780 v -0.025366 0.013232 -0.027498 v -0.025359 0.013232 -0.027830 v -0.025241 0.013232 -0.026773 v -0.025336 0.013232 -0.027414 v -0.025336 0.013232 -0.027878 v -0.025295 0.013232 -0.027326 v -0.025306 0.013232 -0.027923 v -0.025246 0.013232 -0.028378 v -0.025270 0.013232 -0.027967 v -0.025242 0.013232 -0.027234 v -0.025227 0.013232 -0.028008 v -0.025172 0.013232 -0.028408 v -0.025161 0.013232 -0.027114 v -0.025026 0.013232 -0.026930 v -0.025178 0.013232 -0.028047 v -0.025147 0.013232 -0.028069 v -0.025108 0.013232 -0.028428 v -0.025115 0.013232 -0.028088 v -0.025067 0.013232 -0.028112 v -0.025045 0.013232 -0.028441 v -0.025026 0.013232 -0.028128 v -0.024980 0.013232 -0.028448 v -0.024985 0.013232 -0.028140 v -0.024944 0.013232 -0.028148 v -0.024914 0.013232 -0.028449 v -0.024902 0.013232 -0.028152 v -0.024848 0.013232 -0.028445 v -0.024860 0.013232 -0.028152 v -0.024817 0.013232 -0.028148 v -0.024808 0.013232 -0.028439 v -0.024765 0.013232 -0.028138 v -0.024754 0.013232 -0.028428 v -0.024731 0.013232 -0.028128 v -0.024674 0.013232 -0.028405 v -0.024697 0.013232 -0.028116 v -0.024647 0.013232 -0.028094 v -0.024596 0.013232 -0.028374 v -0.024599 0.013232 -0.028066 v -0.024552 0.013232 -0.028034 v -0.024520 0.013232 -0.028336 v -0.024499 0.013232 -0.027990 v -0.024447 0.013232 -0.028289 v -0.024441 0.013232 -0.027930 v -0.024365 0.013232 -0.028225 v -0.024379 0.013232 -0.027853 v -0.024347 0.013232 -0.027807 v -0.024286 0.013232 -0.028151 v -0.024317 0.013232 -0.027759 v -0.024273 0.013232 -0.027675 v -0.024220 0.013232 -0.028078 v -0.024238 0.013232 -0.027587 v -0.024211 0.013232 -0.027497 v -0.024158 0.013232 -0.027998 v -0.024193 0.013232 -0.027404 v -0.024183 0.013232 -0.027308 v -0.024182 0.013232 -0.027209 v -0.023909 0.013232 -0.027409 v -0.024066 0.013232 -0.027861 v -0.024007 0.013232 -0.027753 v -0.023966 0.013232 -0.027658 v -0.023936 0.013232 -0.027566 v -0.023918 0.013232 -0.027487 v -0.023913 0.013232 -0.027453 vt 0.000000 0.444594 vt 0.250000 0.444594 vt 0.250000 1.000000 vt 0.000000 1.000000 vt 0.500000 0.444594 vt 0.500000 1.000000 vt 0.750000 0.444594 vt 0.750000 1.000000 vt 1.000000 0.444594 vt 1.000000 1.000000 vt 0.000000 0.000000 vt 0.250000 0.000000 vt 0.500000 0.000000 vt 0.750000 0.000000 vt 1.000000 0.000000 vt 0.027692 1.000000 vt 0.027692 0.000000 vt 0.035774 1.000000 vt 0.035774 0.000000 vt 0.043661 1.000000 vt 0.043661 0.000000 vt 0.051421 1.000000 vt 0.051421 0.000000 vt 0.059125 1.000000 vt 0.059125 0.000000 vt 0.066846 1.000000 vt 0.066846 0.000000 vt 0.074655 1.000000 vt 0.074655 0.000000 vt 0.079186 1.000000 vt 0.079186 0.000000 vt 0.083780 1.000000 vt 0.083780 0.000000 vt 0.091931 1.000000 vt 0.091931 0.000000 vt 0.098723 1.000000 vt 0.098723 0.000000 vt 0.104371 1.000000 vt 0.104371 0.000000 vt 0.109031 1.000000 vt 0.109031 0.000000 vt 0.113563 1.000000 vt 0.113563 0.000000 vt 0.118005 1.000000 vt 0.118005 0.000000 vt 0.120937 1.000000 vt 0.120937 0.000000 vt 0.123859 1.000000 vt 0.123859 0.000000 vt 0.128170 1.000000 vt 0.128170 0.000000 vt 0.131675 1.000000 vt 0.131675 0.000000 vt 0.135131 1.000000 vt 0.135131 0.000000 vt 0.138567 1.000000 vt 0.138567 0.000000 vt 0.142015 1.000000 vt 0.142015 0.000000 vt 0.145503 1.000000 vt 0.145503 0.000000 vt 0.149062 1.000000 vt 0.149062 0.000000 vt 0.153464 1.000000 vt 0.153464 0.000000 vt 0.156499 1.000000 vt 0.156499 0.000000 vt 0.159627 1.000000 vt 0.159627 0.000000 vt 0.164749 1.000000 vt 0.164749 0.000000 vt 0.169597 1.000000 vt 0.169597 0.000000 vt 0.174220 1.000000 vt 0.174220 0.000000 vt 0.178675 1.000000 vt 0.178675 0.000000 vt 0.183025 1.000000 vt 0.183025 0.000000 vt 0.187338 1.000000 vt 0.187338 0.000000 vt 0.191684 1.000000 vt 0.191684 0.000000 vt 0.196132 1.000000 vt 0.196132 0.000000 vt 0.200745 1.000000 vt 0.200745 0.000000 vt 0.205580 1.000000 vt 0.205580 0.000000 vt 0.210687 1.000000 vt 0.210687 0.000000 vt 0.217990 1.000000 vt 0.217990 0.000000 vt 0.225933 1.000000 vt 0.225933 0.000000 vt 0.234578 1.000000 vt 0.234578 0.000000 vt 0.246447 1.000000 vt 0.246447 0.000000 vt 0.265065 1.000000 vt 0.265065 0.000000 vt 0.286812 1.000000 vt 0.286812 0.000000 vt 0.304491 1.000000 vt 0.304491 0.000000 vt 0.317035 1.000000 vt 0.317035 0.000000 vt 0.326361 1.000000 vt 0.326361 0.000000 vt 0.333158 1.000000 vt 0.333158 0.000000 vt 0.337913 1.000000 vt 0.337913 0.000000 vt 0.342415 1.000000 vt 0.342415 0.000000 vt 0.346706 1.000000 vt 0.346706 0.000000 vt 0.350836 1.000000 vt 0.350836 0.000000 vt 0.354860 1.000000 vt 0.354860 0.000000 vt 0.358839 1.000000 vt 0.358839 0.000000 vt 0.362834 1.000000 vt 0.362834 0.000000 vt 0.366908 1.000000 vt 0.366908 0.000000 vt 0.371118 1.000000 vt 0.371118 0.000000 vt 0.375516 1.000000 vt 0.375516 0.000000 vt 0.378576 1.000000 vt 0.378576 0.000000 vt 0.383388 1.000000 vt 0.383388 0.000000 vt 0.389258 1.000000 vt 0.389258 0.000000 vt 0.394694 1.000000 vt 0.394694 0.000000 vt 0.398529 1.000000 vt 0.398529 0.000000 vt 0.402192 1.000000 vt 0.402192 0.000000 vt 0.405725 1.000000 vt 0.405725 0.000000 vt 0.409171 1.000000 vt 0.409171 0.000000 vt 0.412577 1.000000 vt 0.412577 0.000000 vt 0.415994 1.000000 vt 0.415994 0.000000 vt 0.419469 1.000000 vt 0.419469 0.000000 vt 0.423050 1.000000 vt 0.423050 0.000000 vt 0.426779 1.000000 vt 0.426779 0.000000 vt 0.430694 1.000000 vt 0.430694 0.000000 vt 0.436257 1.000000 vt 0.436257 0.000000 vt 0.442271 1.000000 vt 0.442271 0.000000 vt 0.448788 1.000000 vt 0.448788 0.000000 vt 0.455358 1.000000 vt 0.455358 0.000000 vt 0.461886 1.000000 vt 0.461886 0.000000 vt 0.468433 1.000000 vt 0.468433 0.000000 vt 0.475063 1.000000 vt 0.475063 0.000000 vt 0.481834 1.000000 vt 0.481834 0.000000 vt 0.488803 1.000000 vt 0.488803 0.000000 vt 0.497075 1.000000 vt 0.497075 0.000000 vt 0.522108 1.000000 vt 0.522108 0.000000 vt 0.530158 1.000000 vt 0.530158 0.000000 vt 0.538290 1.000000 vt 0.538290 0.000000 vt 0.546575 1.000000 vt 0.546575 0.000000 vt 0.556161 1.000000 vt 0.556161 0.000000 vt 0.564987 1.000000 vt 0.564987 0.000000 vt 0.575330 1.000000 vt 0.575330 0.000000 vt 0.584110 1.000000 vt 0.584110 0.000000 vt 0.591373 1.000000 vt 0.591373 0.000000 vt 0.598304 1.000000 vt 0.598304 0.000000 vt 0.604030 1.000000 vt 0.604030 0.000000 vt 0.609606 1.000000 vt 0.609606 0.000000 vt 0.615081 1.000000 vt 0.615081 0.000000 vt 0.619606 1.000000 vt 0.619606 0.000000 vt 0.624129 1.000000 vt 0.624129 0.000000 vt 0.629472 1.000000 vt 0.629472 0.000000 vt 0.634660 1.000000 vt 0.634660 0.000000 vt 0.638905 1.000000 vt 0.638905 0.000000 vt 0.643113 1.000000 vt 0.643113 0.000000 vt 0.647317 1.000000 vt 0.647317 0.000000 vt 0.651553 1.000000 vt 0.651553 0.000000 vt 0.656724 1.000000 vt 0.656724 0.000000 vt 0.662042 1.000000 vt 0.662042 0.000000 vt 0.667558 1.000000 vt 0.667558 0.000000 vt 0.676109 1.000000 vt 0.676109 0.000000 vt 0.682565 1.000000 vt 0.682565 0.000000 vt 0.688743 1.000000 vt 0.688743 0.000000 vt 0.694716 1.000000 vt 0.694716 0.000000 vt 0.699108 1.000000 vt 0.699108 0.000000 vt 0.703463 1.000000 vt 0.703463 0.000000 vt 0.707817 1.000000 vt 0.707817 0.000000 vt 0.712205 1.000000 vt 0.712205 0.000000 vt 0.718170 1.000000 vt 0.718170 0.000000 vt 0.724337 1.000000 vt 0.724337 0.000000 vt 0.730777 1.000000 vt 0.730777 0.000000 vt 0.737554 1.000000 vt 0.737554 0.000000 vt 0.746577 1.000000 vt 0.746577 0.000000 vt 0.747203 1.000000 vt 0.747203 0.000000 vt 0.754784 1.000000 vt 0.754784 0.000000 vt 0.761102 1.000000 vt 0.761102 0.000000 vt 0.767177 1.000000 vt 0.767177 0.000000 vt 0.773065 1.000000 vt 0.773065 0.000000 vt 0.778009 1.000000 vt 0.778009 0.000000 vt 0.782900 1.000000 vt 0.782900 0.000000 vt 0.786153 1.000000 vt 0.786153 0.000000 vt 0.790231 1.000000 vt 0.790231 0.000000 vt 0.795079 1.000000 vt 0.795079 0.000000 vt 0.799829 1.000000 vt 0.799829 0.000000 vt 0.804526 1.000000 vt 0.804526 0.000000 vt 0.809215 1.000000 vt 0.809215 0.000000 vt 0.813941 1.000000 vt 0.813941 0.000000 vt 0.818748 1.000000 vt 0.818748 0.000000 vt 0.823679 1.000000 vt 0.823679 0.000000 vt 0.827055 1.000000 vt 0.827055 0.000000 vt 0.830514 1.000000 vt 0.830514 0.000000 vt 0.837600 1.000000 vt 0.837600 0.000000 vt 0.844408 1.000000 vt 0.844408 0.000000 vt 0.851003 1.000000 vt 0.851003 0.000000 vt 0.856388 1.000000 vt 0.856388 0.000000 vt 0.861718 1.000000 vt 0.861718 0.000000 vt 0.867038 1.000000 vt 0.867038 0.000000 vt 0.872394 1.000000 vt 0.872394 0.000000 vt 0.877830 1.000000 vt 0.877830 0.000000 vt 0.881149 1.000000 vt 0.881149 0.000000 vt 0.885657 1.000000 vt 0.885657 0.000000 vt 0.892487 1.000000 vt 0.892487 0.000000 vt 0.899338 1.000000 vt 0.899338 0.000000 vt 0.906274 1.000000 vt 0.906274 0.000000 vt 0.913357 1.000000 vt 0.913357 0.000000 vt 0.921883 1.000000 vt 0.921883 0.000000 vt 0.930772 1.000000 vt 0.930772 0.000000 vt 0.938738 1.000000 vt 0.938738 0.000000 vt 0.947066 1.000000 vt 0.947066 0.000000 vt 0.960493 1.000000 vt 0.960493 0.000000 vt 0.970624 1.000000 vt 0.970624 0.000000 vt 0.979048 1.000000 vt 0.979048 0.000000 vt 0.986994 1.000000 vt 0.986994 0.000000 vt 0.993618 1.000000 vt 0.993618 0.000000 vt 0.996379 1.000000 vt 0.996379 0.000000 vt 0.027926 1.000000 vt 0.027926 0.000000 vt 0.037801 1.000000 vt 0.037801 0.000000 vt 0.047263 1.000000 vt 0.047263 0.000000 vt 0.055398 1.000000 vt 0.055398 0.000000 vt 0.063345 1.000000 vt 0.063345 0.000000 vt 0.071178 1.000000 vt 0.071178 0.000000 vt 0.075076 1.000000 vt 0.075076 0.000000 vt 0.078976 1.000000 vt 0.078976 0.000000 vt 0.086548 1.000000 vt 0.086548 0.000000 vt 0.092832 1.000000 vt 0.092832 0.000000 vt 0.098854 1.000000 vt 0.098854 0.000000 vt 0.103854 1.000000 vt 0.103854 0.000000 vt 0.108752 1.000000 vt 0.108752 0.000000 vt 0.113591 1.000000 vt 0.113591 0.000000 vt 0.117616 1.000000 vt 0.117616 0.000000 vt 0.121661 1.000000 vt 0.121661 0.000000 vt 0.126476 1.000000 vt 0.126476 0.000000 vt 0.130418 1.000000 vt 0.130418 0.000000 vt 0.134327 1.000000 vt 0.134327 0.000000 vt 0.138235 1.000000 vt 0.138235 0.000000 vt 0.142172 1.000000 vt 0.142172 0.000000 vt 0.146978 1.000000 vt 0.146978 0.000000 vt 0.151918 1.000000 vt 0.151918 0.000000 vt 0.157040 1.000000 vt 0.157040 0.000000 vt 0.162385 1.000000 vt 0.162385 0.000000 vt 0.168533 1.000000 vt 0.168533 0.000000 vt 0.173541 1.000000 vt 0.173541 0.000000 vt 0.178352 1.000000 vt 0.178352 0.000000 vt 0.182249 1.000000 vt 0.182249 0.000000 vt 0.186078 1.000000 vt 0.186078 0.000000 vt 0.189873 1.000000 vt 0.189873 0.000000 vt 0.193667 1.000000 vt 0.193667 0.000000 vt 0.197497 1.000000 vt 0.197497 0.000000 vt 0.199826 1.000000 vt 0.199826 0.000000 vt 0.202187 1.000000 vt 0.202187 0.000000 vt 0.206178 1.000000 vt 0.206178 0.000000 vt 0.211064 1.000000 vt 0.211064 0.000000 vt 0.216108 1.000000 vt 0.216108 0.000000 vt 0.221359 1.000000 vt 0.221359 0.000000 vt 0.227801 1.000000 vt 0.227801 0.000000 vt 0.235651 1.000000 vt 0.235651 0.000000 vt 0.241924 1.000000 vt 0.241924 0.000000 vt 0.248555 1.000000 vt 0.248555 0.000000 vt 0.284717 1.000000 vt 0.284717 0.000000 vt 0.400111 1.000000 vt 0.400111 0.000000 vt 0.511493 1.000000 vt 0.511493 0.000000 vt 0.535246 1.000000 vt 0.535246 0.000000 vt 0.621752 1.000000 vt 0.621752 0.000000 vt 0.689159 1.000000 vt 0.689159 0.000000 vt 0.708749 1.000000 vt 0.708749 0.000000 vt 0.721511 1.000000 vt 0.721511 0.000000 vt 0.730770 1.000000 vt 0.730770 0.000000 vt 0.739520 1.000000 vt 0.739520 0.000000 vt 0.746681 1.000000 vt 0.746681 0.000000 vt 0.753590 1.000000 vt 0.753590 0.000000 vt 0.760316 1.000000 vt 0.760316 0.000000 vt 0.764736 1.000000 vt 0.764736 0.000000 vt 0.770226 1.000000 vt 0.770226 0.000000 vt 0.775661 1.000000 vt 0.775661 0.000000 vt 0.781026 1.000000 vt 0.781026 0.000000 vt 0.786365 1.000000 vt 0.786365 0.000000 vt 0.791723 1.000000 vt 0.791723 0.000000 vt 0.797143 1.000000 vt 0.797143 0.000000 vt 0.803788 1.000000 vt 0.803788 0.000000 vt 0.810654 1.000000 vt 0.810654 0.000000 vt 0.817804 1.000000 vt 0.817804 0.000000 vt 0.826577 1.000000 vt 0.826577 0.000000 vt 0.835679 1.000000 vt 0.835679 0.000000 vt 0.843140 1.000000 vt 0.843140 0.000000 vt 0.850349 1.000000 vt 0.850349 0.000000 vt 0.857374 1.000000 vt 0.857374 0.000000 vt 0.863141 1.000000 vt 0.863141 0.000000 vt 0.868873 1.000000 vt 0.868873 0.000000 vt 0.874616 1.000000 vt 0.874616 0.000000 vt 0.880414 1.000000 vt 0.880414 0.000000 vt 0.886310 1.000000 vt 0.886310 0.000000 vt 0.892255 1.000000 vt 0.892255 0.000000 vt 0.899395 1.000000 vt 0.899395 0.000000 vt 0.906615 1.000000 vt 0.906615 0.000000 vt 0.913992 1.000000 vt 0.913992 0.000000 vt 0.921596 1.000000 vt 0.921596 0.000000 vt 0.930839 1.000000 vt 0.930839 0.000000 vt 0.940570 1.000000 vt 0.940570 0.000000 vt 0.950867 1.000000 vt 0.950867 0.000000 vt 0.966392 1.000000 vt 0.966392 0.000000 vt 0.976921 1.000000 vt 0.976921 0.000000 vt 0.985419 1.000000 vt 0.985419 0.000000 vt 0.991441 1.000000 vt 0.991441 0.000000 vt 0.995458 1.000000 vt 0.995458 0.000000 vt 0.138054 1.000000 vt 0.138054 0.000000 vt 0.161382 1.000000 vt 0.161382 0.000000 vt 0.255951 1.000000 vt 0.255951 0.000000 vt 0.291332 1.000000 vt 0.291332 0.000000 vt 0.302483 1.000000 vt 0.302483 0.000000 vt 0.312123 1.000000 vt 0.312123 0.000000 vt 0.319287 1.000000 vt 0.319287 0.000000 vt 0.325492 1.000000 vt 0.325492 0.000000 vt 0.331597 1.000000 vt 0.331597 0.000000 vt 0.337654 1.000000 vt 0.337654 0.000000 vt 0.343717 1.000000 vt 0.343717 0.000000 vt 0.346768 1.000000 vt 0.346768 0.000000 vt 0.350613 1.000000 vt 0.350613 0.000000 vt 0.356731 1.000000 vt 0.356731 0.000000 vt 0.361756 1.000000 vt 0.361756 0.000000 vt 0.365857 1.000000 vt 0.365857 0.000000 vt 0.369804 1.000000 vt 0.369804 0.000000 vt 0.373004 1.000000 vt 0.373004 0.000000 vt 0.376149 1.000000 vt 0.376149 0.000000 vt 0.379265 1.000000 vt 0.379265 0.000000 vt 0.381756 1.000000 vt 0.381756 0.000000 vt 0.384258 1.000000 vt 0.384258 0.000000 vt 0.387397 1.000000 vt 0.387397 0.000000 vt 0.390551 1.000000 vt 0.390551 0.000000 vt 0.393746 1.000000 vt 0.393746 0.000000 vt 0.397670 1.000000 vt 0.397670 0.000000 vt 0.401730 1.000000 vt 0.401730 0.000000 vt 0.405964 1.000000 vt 0.405964 0.000000 vt 0.411165 1.000000 vt 0.411165 0.000000 vt 0.415078 1.000000 vt 0.415078 0.000000 vt 0.419170 1.000000 vt 0.419170 0.000000 vt 0.426505 1.000000 vt 0.426505 0.000000 vt 0.433846 1.000000 vt 0.433846 0.000000 vt 0.441268 1.000000 vt 0.441268 0.000000 vt 0.448848 1.000000 vt 0.448848 0.000000 vt 0.456657 1.000000 vt 0.456657 0.000000 vt 0.466141 1.000000 vt 0.466141 0.000000 vt 0.474658 1.000000 vt 0.474658 0.000000 vt 0.485115 1.000000 vt 0.485115 0.000000 vt 0.512598 1.000000 vt 0.512598 0.000000 vt 0.522023 1.000000 vt 0.522023 0.000000 vt 0.531295 1.000000 vt 0.531295 0.000000 vt 0.540498 1.000000 vt 0.540498 0.000000 vt 0.549718 1.000000 vt 0.549718 0.000000 vt 0.559040 1.000000 vt 0.559040 0.000000 vt 0.568547 1.000000 vt 0.568547 0.000000 vt 0.579737 1.000000 vt 0.579737 0.000000 vt 0.589228 1.000000 vt 0.589228 0.000000 vt 0.597048 1.000000 vt 0.597048 0.000000 vt 0.604483 1.000000 vt 0.604483 0.000000 vt 0.610607 1.000000 vt 0.610607 0.000000 vt 0.616558 1.000000 vt 0.616558 0.000000 vt 0.622395 1.000000 vt 0.622395 0.000000 vt 0.627218 1.000000 vt 0.627218 0.000000 vt 0.632041 1.000000 vt 0.632041 0.000000 vt 0.637782 1.000000 vt 0.637782 0.000000 vt 0.642501 1.000000 vt 0.642501 0.000000 vt 0.647200 1.000000 vt 0.647200 0.000000 vt 0.651915 1.000000 vt 0.651915 0.000000 vt 0.657647 1.000000 vt 0.657647 0.000000 vt 0.663517 1.000000 vt 0.663517 0.000000 vt 0.669581 1.000000 vt 0.669581 0.000000 vt 0.674822 1.000000 vt 0.674822 0.000000 vt 0.681375 1.000000 vt 0.681375 0.000000 vt 0.688411 1.000000 vt 0.688411 0.000000 vt 0.695449 1.000000 vt 0.695449 0.000000 vt 0.703438 1.000000 vt 0.703438 0.000000 vt 0.711575 1.000000 vt 0.711575 0.000000 vt 0.718992 1.000000 vt 0.718992 0.000000 vt 0.726630 1.000000 vt 0.726630 0.000000 vt 0.738216 1.000000 vt 0.738216 0.000000 vt 0.762683 1.000000 vt 0.762683 0.000000 vt 0.794791 1.000000 vt 0.794791 0.000000 vt 0.869137 1.000000 vt 0.869137 0.000000 vt 0.869776 1.000000 vt 0.869776 0.000000 vt 0.976352 1.000000 vt 0.976352 0.000000 vt 0.155874 1.000000 vt 0.155874 0.000000 vt 0.183551 1.000000 vt 0.183551 0.000000 vt 0.245823 1.000000 vt 0.245823 0.000000 vt 0.459934 1.000000 vt 0.459934 0.000000 vt 0.526521 1.000000 vt 0.526521 0.000000 vt 0.556504 1.000000 vt 0.556504 0.000000 vt 0.656155 1.000000 vt 0.656155 0.000000 vt 0.910243 1.000000 vt 0.910243 0.000000 vt 0.972323 1.000000 vt 0.972323 0.000000 vt 0.000000 0.500000 vt 1.000000 0.500000 usemtl _Mat.002 s 1 f 1/1 2/2 3/3 4/4 f 2/2 5/5 6/6 3/3 f 5/5 7/7 8/8 6/6 f 7/7 1/9 4/10 8/8 f 2/2 1/1 9/11 10/12 f 10/12 11/13 5/5 2/2 f 11/13 12/14 7/7 5/5 f 1/9 7/7 12/14 9/15 f 13/4 14/4 15/4 f 16/4 13/4 15/4 f 17/4 18/4 19/4 f 20/4 17/4 19/4 f 21/16 22/17 23/11 24/4 f 25/18 26/19 22/17 21/16 f 27/20 28/21 26/19 25/18 f 29/22 30/23 28/21 27/20 f 31/24 32/25 30/23 29/22 f 33/26 34/27 32/25 31/24 f 35/28 36/29 34/27 33/26 f 37/30 38/31 36/29 35/28 f 39/32 40/33 38/31 37/30 f 41/34 42/35 40/33 39/32 f 43/36 44/37 42/35 41/34 f 45/38 46/39 44/37 43/36 f 47/40 48/41 46/39 45/38 f 49/42 50/43 48/41 47/40 f 51/44 52/45 50/43 49/42 f 53/46 54/47 52/45 51/44 f 55/48 56/49 54/47 53/46 f 57/50 58/51 56/49 55/48 f 59/52 60/53 58/51 57/50 f 61/54 62/55 60/53 59/52 f 63/56 64/57 62/55 61/54 f 65/58 66/59 64/57 63/56 f 67/60 68/61 66/59 65/58 f 69/62 70/63 68/61 67/60 f 71/64 72/65 70/63 69/62 f 73/66 74/67 72/65 71/64 f 75/68 76/69 74/67 73/66 f 77/70 78/71 76/69 75/68 f 79/72 80/73 78/71 77/70 f 81/74 82/75 80/73 79/72 f 83/76 84/77 82/75 81/74 f 85/78 86/79 84/77 83/76 f 87/80 88/81 86/79 85/78 f 89/82 90/83 88/81 87/80 f 91/84 92/85 90/83 89/82 f 93/86 94/87 92/85 91/84 f 95/88 96/89 94/87 93/86 f 97/90 98/91 96/89 95/88 f 99/92 100/93 98/91 97/90 f 101/94 102/95 100/93 99/92 f 103/96 104/97 102/95 101/94 f 105/98 106/99 104/97 103/96 f 107/100 108/101 106/99 105/98 f 109/102 110/103 108/101 107/100 f 111/104 112/105 110/103 109/102 f 113/106 114/107 112/105 111/104 f 115/108 116/109 114/107 113/106 f 117/110 118/111 116/109 115/108 f 119/112 120/113 118/111 117/110 f 121/114 122/115 120/113 119/112 f 123/116 124/117 122/115 121/114 f 125/118 126/119 124/117 123/116 f 127/120 128/121 126/119 125/118 f 129/122 130/123 128/121 127/120 f 131/124 132/125 130/123 129/122 f 133/126 134/127 132/125 131/124 f 135/128 136/129 134/127 133/126 f 137/130 138/131 136/129 135/128 f 139/132 140/133 138/131 137/130 f 141/134 142/135 140/133 139/132 f 143/136 144/137 142/135 141/134 f 145/138 146/139 144/137 143/136 f 147/140 148/141 146/139 145/138 f 149/142 150/143 148/141 147/140 f 151/144 152/145 150/143 149/142 f 153/146 154/147 152/145 151/144 f 155/148 156/149 154/147 153/146 f 157/150 158/151 156/149 155/148 f 159/152 160/153 158/151 157/150 f 161/154 162/155 160/153 159/152 f 163/156 164/157 162/155 161/154 f 165/158 166/159 164/157 163/156 f 167/160 168/161 166/159 165/158 f 169/162 170/163 168/161 167/160 f 171/164 172/165 170/163 169/162 f 173/166 174/167 172/165 171/164 f 175/168 176/169 174/167 173/166 f 177/170 178/171 176/169 175/168 f 179/172 180/173 178/171 177/170 f 181/174 182/175 180/173 179/172 f 183/176 184/177 182/175 181/174 f 185/178 186/179 184/177 183/176 f 187/180 188/181 186/179 185/178 f 189/182 190/183 188/181 187/180 f 191/184 192/185 190/183 189/182 f 193/186 194/187 192/185 191/184 f 195/188 196/189 194/187 193/186 f 197/190 198/191 196/189 195/188 f 199/192 200/193 198/191 197/190 f 201/194 202/195 200/193 199/192 f 203/196 204/197 202/195 201/194 f 205/198 206/199 204/197 203/196 f 207/200 208/201 206/199 205/198 f 209/202 210/203 208/201 207/200 f 211/204 212/205 210/203 209/202 f 213/206 214/207 212/205 211/204 f 215/208 216/209 214/207 213/206 f 217/210 218/211 216/209 215/208 f 219/212 220/213 218/211 217/210 f 221/214 222/215 220/213 219/212 f 223/216 224/217 222/215 221/214 f 225/218 226/219 224/217 223/216 f 227/220 228/221 226/219 225/218 f 229/222 230/223 228/221 227/220 f 231/224 232/225 230/223 229/222 f 233/226 234/227 232/225 231/224 f 235/228 236/229 234/227 233/226 f 237/230 238/231 236/229 235/228 f 239/232 240/233 238/231 237/230 f 241/234 242/235 240/233 239/232 f 243/236 244/237 242/235 241/234 f 245/238 246/239 244/237 243/236 f 247/240 248/241 246/239 245/238 f 249/242 250/243 248/241 247/240 f 251/244 252/245 250/243 249/242 f 253/246 254/247 252/245 251/244 f 255/248 256/249 254/247 253/246 f 257/250 258/251 256/249 255/248 f 259/252 260/253 258/251 257/250 f 261/254 262/255 260/253 259/252 f 263/256 264/257 262/255 261/254 f 265/258 266/259 264/257 263/256 f 267/260 268/261 266/259 265/258 f 269/262 270/263 268/261 267/260 f 271/264 272/265 270/263 269/262 f 273/266 274/267 272/265 271/264 f 275/268 276/269 274/267 273/266 f 277/270 278/271 276/269 275/268 f 279/272 280/273 278/271 277/270 f 281/274 282/275 280/273 279/272 f 283/276 284/277 282/275 281/274 f 285/278 286/279 284/277 283/276 f 287/280 288/281 286/279 285/278 f 289/282 290/283 288/281 287/280 f 291/284 292/285 290/283 289/282 f 293/286 294/287 292/285 291/284 f 295/288 296/289 294/287 293/286 f 297/290 298/291 296/289 295/288 f 299/292 300/293 298/291 297/290 f 301/294 302/295 300/293 299/292 f 303/296 304/297 302/295 301/294 f 305/298 306/299 304/297 303/296 f 307/300 308/301 306/299 305/298 f 309/302 310/303 308/301 307/300 f 311/304 312/305 310/303 309/302 f 313/306 314/307 312/305 311/304 f 315/308 316/309 314/307 313/306 f 317/310 318/311 316/309 315/308 f 319/312 320/313 318/311 317/310 f 321/314 322/315 320/313 319/312 f 323/316 324/317 322/315 321/314 f 325/318 326/319 324/317 323/316 f 327/320 328/321 326/319 325/318 f 329/322 330/323 328/321 327/320 f 331/324 332/325 330/323 329/322 f 333/326 334/327 332/325 331/324 f 335/328 336/329 334/327 333/326 f 337/330 338/331 336/329 335/328 f 339/332 340/333 338/331 337/330 f 341/334 342/335 340/333 339/332 f 343/336 344/337 342/335 341/334 f 24/10 23/15 344/337 343/336 f 345/338 346/339 347/11 348/4 f 349/340 350/341 346/339 345/338 f 351/342 352/343 350/341 349/340 f 353/344 354/345 352/343 351/342 f 355/346 356/347 354/345 353/344 f 357/348 358/349 356/347 355/346 f 359/350 360/351 358/349 357/348 f 361/352 362/353 360/351 359/350 f 363/354 364/355 362/353 361/352 f 365/356 366/357 364/355 363/354 f 367/358 368/359 366/357 365/356 f 369/360 370/361 368/359 367/358 f 371/362 372/363 370/361 369/360 f 373/364 374/365 372/363 371/362 f 375/366 376/367 374/365 373/364 f 377/368 378/369 376/367 375/366 f 379/370 380/371 378/369 377/368 f 381/372 382/373 380/371 379/370 f 383/374 384/375 382/373 381/372 f 385/376 386/377 384/375 383/374 f 387/378 388/379 386/377 385/376 f 389/380 390/381 388/379 387/378 f 391/382 392/383 390/381 389/380 f 393/384 394/385 392/383 391/382 f 395/386 396/387 394/385 393/384 f 397/388 398/389 396/387 395/386 f 399/390 400/391 398/389 397/388 f 401/392 402/393 400/391 399/390 f 403/394 404/395 402/393 401/392 f 405/396 406/397 404/395 403/394 f 407/398 408/399 406/397 405/396 f 409/400 410/401 408/399 407/398 f 411/402 412/403 410/401 409/400 f 413/404 414/405 412/403 411/402 f 415/406 416/407 414/405 413/404 f 417/408 418/409 416/407 415/406 f 419/410 420/411 418/409 417/408 f 421/412 422/413 420/411 419/410 f 423/414 424/415 422/413 421/412 f 425/416 426/417 424/415 423/414 f 427/418 428/419 426/417 425/416 f 429/420 430/421 428/419 427/418 f 431/422 432/423 430/421 429/420 f 433/424 434/425 432/423 431/422 f 435/426 436/427 434/425 433/424 f 437/428 438/429 436/427 435/426 f 439/430 440/431 438/429 437/428 f 441/432 442/433 440/431 439/430 f 443/434 444/435 442/433 441/432 f 445/436 446/437 444/435 443/434 f 447/438 448/439 446/437 445/436 f 449/440 450/441 448/439 447/438 f 451/442 452/443 450/441 449/440 f 453/444 454/445 452/443 451/442 f 455/446 456/447 454/445 453/444 f 457/448 458/449 456/447 455/446 f 459/450 460/451 458/449 457/448 f 461/452 462/453 460/451 459/450 f 463/454 464/455 462/453 461/452 f 465/456 466/457 464/455 463/454 f 467/458 468/459 466/457 465/456 f 469/460 470/461 468/459 467/458 f 471/462 472/463 470/461 469/460 f 473/464 474/465 472/463 471/462 f 475/466 476/467 474/465 473/464 f 477/468 478/469 476/467 475/466 f 479/470 480/471 478/469 477/468 f 481/472 482/473 480/471 479/470 f 483/474 484/475 482/473 481/472 f 485/476 486/477 484/475 483/474 f 487/478 488/479 486/477 485/476 f 489/480 490/481 488/479 487/478 f 491/482 492/483 490/481 489/480 f 493/484 494/485 492/483 491/482 f 495/486 496/487 494/485 493/484 f 497/488 498/489 496/487 495/486 f 499/490 500/491 498/489 497/488 f 501/492 502/493 500/491 499/490 f 503/494 504/495 502/493 501/492 f 505/496 506/497 504/495 503/494 f 507/498 508/499 506/497 505/496 f 509/500 510/501 508/499 507/498 f 511/502 512/503 510/501 509/500 f 513/504 514/505 512/503 511/502 f 515/506 516/507 514/505 513/504 f 517/508 518/509 516/507 515/506 f 519/510 520/511 518/509 517/508 f 521/512 522/513 520/511 519/510 f 523/514 524/515 522/513 521/512 f 348/10 347/15 524/515 523/514 f 525/1 526/2 527/3 528/4 f 526/2 529/5 530/6 527/3 f 529/5 531/7 532/8 530/6 f 531/7 525/9 528/10 532/8 f 533/11 534/12 526/2 525/1 f 534/12 535/13 529/5 526/2 f 535/13 536/14 531/7 529/5 f 536/14 533/15 525/9 531/7 f 537/4 538/4 539/4 f 540/4 537/4 539/4 f 541/4 542/4 543/4 f 544/4 541/4 543/4 f 545/516 546/517 547/11 548/4 f 549/518 550/519 546/517 545/516 f 551/520 552/521 550/519 549/518 f 553/522 554/523 552/521 551/520 f 555/524 556/525 554/523 553/522 f 557/526 558/527 556/525 555/524 f 559/528 560/529 558/527 557/526 f 561/530 562/531 560/529 559/528 f 563/532 564/533 562/531 561/530 f 565/534 566/535 564/533 563/532 f 567/536 568/537 566/535 565/534 f 569/538 570/539 568/537 567/536 f 571/540 572/541 570/539 569/538 f 573/542 574/543 572/541 571/540 f 575/544 576/545 574/543 573/542 f 577/546 578/547 576/545 575/544 f 579/548 580/549 578/547 577/546 f 581/550 582/551 580/549 579/548 f 583/552 584/553 582/551 581/550 f 585/554 586/555 584/553 583/552 f 587/556 588/557 586/555 585/554 f 589/558 590/559 588/557 587/556 f 591/560 592/561 590/559 589/558 f 593/562 594/563 592/561 591/560 f 595/564 596/565 594/563 593/562 f 597/566 598/567 596/565 595/564 f 599/568 600/569 598/567 597/566 f 601/570 602/571 600/569 599/568 f 603/572 604/573 602/571 601/570 f 605/574 606/575 604/573 603/572 f 607/576 608/577 606/575 605/574 f 609/578 610/579 608/577 607/576 f 611/580 612/581 610/579 609/578 f 613/582 614/583 612/581 611/580 f 615/584 616/585 614/583 613/582 f 617/586 618/587 616/585 615/584 f 619/588 620/589 618/587 617/586 f 621/590 622/591 620/589 619/588 f 623/592 624/593 622/591 621/590 f 625/594 626/595 624/593 623/592 f 627/596 628/597 626/595 625/594 f 629/598 630/599 628/597 627/596 f 631/600 632/601 630/599 629/598 f 633/602 634/603 632/601 631/600 f 635/604 636/605 634/603 633/602 f 637/606 638/607 636/605 635/604 f 639/608 640/609 638/607 637/606 f 641/610 642/611 640/609 639/608 f 643/612 644/613 642/611 641/610 f 645/614 646/615 644/613 643/612 f 647/616 648/617 646/615 645/614 f 649/618 650/619 648/617 647/616 f 651/620 652/621 650/619 649/618 f 653/622 654/623 652/621 651/620 f 655/624 656/625 654/623 653/622 f 657/626 658/627 656/625 655/624 f 659/628 660/629 658/627 657/626 f 661/630 662/631 660/629 659/628 f 663/632 664/633 662/631 661/630 f 665/634 666/635 664/633 663/632 f 667/636 668/637 666/635 665/634 f 669/638 670/639 668/637 667/636 f 671/640 672/641 670/639 669/638 f 673/642 674/643 672/641 671/640 f 675/644 676/645 674/643 673/642 f 677/646 678/647 676/645 675/644 f 679/648 680/649 678/647 677/646 f 681/650 682/651 680/649 679/648 f 683/652 684/653 682/651 681/650 f 685/654 686/655 684/653 683/652 f 687/656 688/657 686/655 685/654 f 689/658 690/659 688/657 687/656 f 691/660 692/661 690/659 689/658 f 693/662 694/663 692/661 691/660 f 695/664 696/665 694/663 693/662 f 697/666 698/667 696/665 695/664 f 548/10 547/15 698/667 697/666 f 699/338 700/339 701/11 702/4 f 703/340 704/341 700/339 699/338 f 705/342 706/343 704/341 703/340 f 707/344 708/345 706/343 705/342 f 709/346 710/347 708/345 707/344 f 711/348 712/349 710/347 709/346 f 713/350 714/351 712/349 711/348 f 715/352 716/353 714/351 713/350 f 717/354 718/355 716/353 715/352 f 719/356 720/357 718/355 717/354 f 721/358 722/359 720/357 719/356 f 723/360 724/361 722/359 721/358 f 725/362 726/363 724/361 723/360 f 727/364 728/365 726/363 725/362 f 729/366 730/367 728/365 727/364 f 731/368 732/369 730/367 729/366 f 733/370 734/371 732/369 731/368 f 735/372 736/373 734/371 733/370 f 737/374 738/375 736/373 735/372 f 739/376 740/377 738/375 737/374 f 741/378 742/379 740/377 739/376 f 743/380 744/381 742/379 741/378 f 745/382 746/383 744/381 743/380 f 747/384 748/385 746/383 745/382 f 749/386 750/387 748/385 747/384 f 751/388 752/389 750/387 749/386 f 753/390 754/391 752/389 751/388 f 755/392 756/393 754/391 753/390 f 757/394 758/395 756/393 755/392 f 759/396 760/397 758/395 757/394 f 761/398 762/399 760/397 759/396 f 763/400 764/401 762/399 761/398 f 765/402 766/403 764/401 763/400 f 767/404 768/405 766/403 765/402 f 769/406 770/407 768/405 767/404 f 771/408 772/409 770/407 769/406 f 773/410 774/411 772/409 771/408 f 775/412 776/413 774/411 773/410 f 777/414 778/415 776/413 775/412 f 779/416 780/417 778/415 777/414 f 781/418 782/419 780/417 779/416 f 783/420 784/421 782/419 781/418 f 785/422 786/423 784/421 783/420 f 787/424 788/425 786/423 785/422 f 789/426 790/427 788/425 787/424 f 791/428 792/429 790/427 789/426 f 793/430 794/431 792/429 791/428 f 795/432 796/433 794/431 793/430 f 797/434 798/435 796/433 795/432 f 799/436 800/437 798/435 797/434 f 801/438 802/439 800/437 799/436 f 803/440 804/441 802/439 801/438 f 805/442 806/443 804/441 803/440 f 807/444 808/445 806/443 805/442 f 809/446 810/447 808/445 807/444 f 811/448 812/449 810/447 809/446 f 813/450 814/451 812/449 811/448 f 815/452 816/453 814/451 813/450 f 817/454 818/455 816/453 815/452 f 819/456 820/457 818/455 817/454 f 821/458 822/459 820/457 819/456 f 823/460 824/461 822/459 821/458 f 825/462 826/463 824/461 823/460 f 827/464 828/465 826/463 825/462 f 829/466 830/467 828/465 827/464 f 831/468 832/469 830/467 829/466 f 833/470 834/471 832/469 831/468 f 835/472 836/473 834/471 833/470 f 837/474 838/475 836/473 835/472 f 839/476 840/477 838/475 837/474 f 841/478 842/479 840/477 839/476 f 843/480 844/481 842/479 841/478 f 845/482 846/483 844/481 843/480 f 847/484 848/485 846/483 845/482 f 849/486 850/487 848/485 847/484 f 851/488 852/489 850/487 849/486 f 853/490 854/491 852/489 851/488 f 855/492 856/493 854/491 853/490 f 857/494 858/495 856/493 855/492 f 859/496 860/497 858/495 857/494 f 861/498 862/499 860/497 859/496 f 863/500 864/501 862/499 861/498 f 865/502 866/503 864/501 863/500 f 867/504 868/505 866/503 865/502 f 869/506 870/507 868/505 867/504 f 871/508 872/509 870/507 869/506 f 873/510 874/511 872/509 871/508 f 875/512 876/513 874/511 873/510 f 877/514 878/515 876/513 875/512 f 702/10 701/15 878/515 877/514 f 879/1 880/2 881/3 882/4 f 880/2 883/5 884/6 881/3 f 883/5 885/7 886/8 884/6 f 885/7 879/9 882/10 886/8 f 887/11 888/12 880/2 879/1 f 888/12 889/13 883/5 880/2 f 889/13 890/14 885/7 883/5 f 890/14 887/15 879/9 885/7 f 891/4 892/4 893/4 f 894/4 891/4 893/4 f 895/4 896/4 897/4 f 898/4 895/4 897/4 f 899/668 900/669 901/11 902/4 f 903/670 904/671 900/669 899/668 f 905/672 906/673 904/671 903/670 f 907/674 908/675 906/673 905/672 f 909/676 910/677 908/675 907/674 f 911/678 912/679 910/677 909/676 f 913/680 914/681 912/679 911/678 f 915/682 916/683 914/681 913/680 f 917/684 918/685 916/683 915/682 f 902/10 901/15 918/685 917/684 f 919/338 920/339 921/11 922/4 f 923/340 924/341 920/339 919/338 f 925/342 926/343 924/341 923/340 f 927/344 928/345 926/343 925/342 f 929/346 930/347 928/345 927/344 f 931/348 932/349 930/347 929/346 f 933/350 934/351 932/349 931/348 f 935/352 936/353 934/351 933/350 f 937/354 938/355 936/353 935/352 f 939/356 940/357 938/355 937/354 f 941/358 942/359 940/357 939/356 f 943/360 944/361 942/359 941/358 f 945/362 946/363 944/361 943/360 f 947/364 948/365 946/363 945/362 f 949/366 950/367 948/365 947/364 f 951/368 952/369 950/367 949/366 f 953/370 954/371 952/369 951/368 f 955/372 956/373 954/371 953/370 f 957/374 958/375 956/373 955/372 f 959/376 960/377 958/375 957/374 f 961/378 962/379 960/377 959/376 f 963/380 964/381 962/379 961/378 f 965/382 966/383 964/381 963/380 f 967/384 968/385 966/383 965/382 f 969/386 970/387 968/385 967/384 f 971/388 972/389 970/387 969/386 f 973/390 974/391 972/389 971/388 f 975/392 976/393 974/391 973/390 f 977/394 978/395 976/393 975/392 f 979/396 980/397 978/395 977/394 f 981/398 982/399 980/397 979/396 f 983/400 984/401 982/399 981/398 f 985/402 986/403 984/401 983/400 f 987/404 988/405 986/403 985/402 f 989/406 990/407 988/405 987/404 f 991/408 992/409 990/407 989/406 f 993/410 994/411 992/409 991/408 f 995/412 996/413 994/411 993/410 f 997/414 998/415 996/413 995/412 f 999/416 1000/417 998/415 997/414 f 1001/418 1002/419 1000/417 999/416 f 1003/420 1004/421 1002/419 1001/418 f 1005/422 1006/423 1004/421 1003/420 f 1007/424 1008/425 1006/423 1005/422 f 1009/426 1010/427 1008/425 1007/424 f 1011/428 1012/429 1010/427 1009/426 f 1013/430 1014/431 1012/429 1011/428 f 1015/432 1016/433 1014/431 1013/430 f 1017/434 1018/435 1016/433 1015/432 f 1019/436 1020/437 1018/435 1017/434 f 1021/438 1022/439 1020/437 1019/436 f 1023/440 1024/441 1022/439 1021/438 f 1025/442 1026/443 1024/441 1023/440 f 1027/444 1028/445 1026/443 1025/442 f 1029/446 1030/447 1028/445 1027/444 f 1031/448 1032/449 1030/447 1029/446 f 1033/450 1034/451 1032/449 1031/448 f 1035/452 1036/453 1034/451 1033/450 f 1037/454 1038/455 1036/453 1035/452 f 1039/456 1040/457 1038/455 1037/454 f 1041/458 1042/459 1040/457 1039/456 f 1043/460 1044/461 1042/459 1041/458 f 1045/462 1046/463 1044/461 1043/460 f 1047/464 1048/465 1046/463 1045/462 f 1049/466 1050/467 1048/465 1047/464 f 1051/468 1052/469 1050/467 1049/466 f 1053/470 1054/471 1052/469 1051/468 f 1055/472 1056/473 1054/471 1053/470 f 1057/474 1058/475 1056/473 1055/472 f 1059/476 1060/477 1058/475 1057/474 f 1061/478 1062/479 1060/477 1059/476 f 1063/480 1064/481 1062/479 1061/478 f 1065/482 1066/483 1064/481 1063/480 f 1067/484 1068/485 1066/483 1065/482 f 1069/486 1070/487 1068/485 1067/484 f 1071/488 1072/489 1070/487 1069/486 f 1073/490 1074/491 1072/489 1071/488 f 1075/492 1076/493 1074/491 1073/490 f 1077/494 1078/495 1076/493 1075/492 f 1079/496 1080/497 1078/495 1077/494 f 1081/498 1082/499 1080/497 1079/496 f 1083/500 1084/501 1082/499 1081/498 f 1085/502 1086/503 1084/501 1083/500 f 1087/504 1088/505 1086/503 1085/502 f 1089/506 1090/507 1088/505 1087/504 f 1091/508 1092/509 1090/507 1089/506 f 1093/510 1094/511 1092/509 1091/508 f 1095/512 1096/513 1094/511 1093/510 f 1097/514 1098/515 1096/513 1095/512 f 922/10 921/15 1098/515 1097/514 f 1099/1 1100/2 1101/3 1102/4 f 1100/2 1103/5 1104/6 1101/3 f 1103/5 1105/7 1106/8 1104/6 f 1105/7 1099/9 1102/10 1106/8 f 1107/11 1108/12 1100/2 1099/1 f 1108/12 1109/13 1103/5 1100/2 f 1109/13 1110/14 1105/7 1103/5 f 1110/14 1107/15 1099/9 1105/7 f 1111/4 1112/4 1113/4 f 1114/4 1111/4 1113/4 f 1115/4 1116/4 1117/4 f 1118/4 1115/4 1117/4 f 1119/16 1120/17 1121/11 1122/4 f 1123/18 1124/19 1120/17 1119/16 f 1125/20 1126/21 1124/19 1123/18 f 1127/22 1128/23 1126/21 1125/20 f 1129/24 1130/25 1128/23 1127/22 f 1131/26 1132/27 1130/25 1129/24 f 1133/28 1134/29 1132/27 1131/26 f 1135/30 1136/31 1134/29 1133/28 f 1137/32 1138/33 1136/31 1135/30 f 1139/34 1140/35 1138/33 1137/32 f 1141/36 1142/37 1140/35 1139/34 f 1143/38 1144/39 1142/37 1141/36 f 1145/40 1146/41 1144/39 1143/38 f 1147/42 1148/43 1146/41 1145/40 f 1149/44 1150/45 1148/43 1147/42 f 1151/46 1152/47 1150/45 1149/44 f 1153/48 1154/49 1152/47 1151/46 f 1155/50 1156/51 1154/49 1153/48 f 1157/52 1158/53 1156/51 1155/50 f 1159/54 1160/55 1158/53 1157/52 f 1161/56 1162/57 1160/55 1159/54 f 1163/58 1164/59 1162/57 1161/56 f 1165/60 1166/61 1164/59 1163/58 f 1167/62 1168/63 1166/61 1165/60 f 1169/64 1170/65 1168/63 1167/62 f 1171/66 1172/67 1170/65 1169/64 f 1173/68 1174/69 1172/67 1171/66 f 1175/70 1176/71 1174/69 1173/68 f 1177/72 1178/73 1176/71 1175/70 f 1179/74 1180/75 1178/73 1177/72 f 1181/76 1182/77 1180/75 1179/74 f 1183/78 1184/79 1182/77 1181/76 f 1185/80 1186/81 1184/79 1183/78 f 1187/82 1188/83 1186/81 1185/80 f 1189/84 1190/85 1188/83 1187/82 f 1191/86 1192/87 1190/85 1189/84 f 1193/88 1194/89 1192/87 1191/86 f 1195/90 1196/91 1194/89 1193/88 f 1197/92 1198/93 1196/91 1195/90 f 1199/94 1200/95 1198/93 1197/92 f 1201/96 1202/97 1200/95 1199/94 f 1203/98 1204/99 1202/97 1201/96 f 1205/100 1206/101 1204/99 1203/98 f 1207/102 1208/103 1206/101 1205/100 f 1209/104 1210/105 1208/103 1207/102 f 1211/106 1212/107 1210/105 1209/104 f 1213/108 1214/109 1212/107 1211/106 f 1215/110 1216/111 1214/109 1213/108 f 1217/112 1218/113 1216/111 1215/110 f 1219/114 1220/115 1218/113 1217/112 f 1221/116 1222/117 1220/115 1219/114 f 1223/118 1224/119 1222/117 1221/116 f 1225/120 1226/121 1224/119 1223/118 f 1227/122 1228/123 1226/121 1225/120 f 1229/124 1230/125 1228/123 1227/122 f 1231/126 1232/127 1230/125 1229/124 f 1233/128 1234/129 1232/127 1231/126 f 1235/130 1236/131 1234/129 1233/128 f 1237/132 1238/133 1236/131 1235/130 f 1239/134 1240/135 1238/133 1237/132 f 1241/136 1242/137 1240/135 1239/134 f 1243/138 1244/139 1242/137 1241/136 f 1245/140 1246/141 1244/139 1243/138 f 1247/142 1248/143 1246/141 1245/140 f 1249/144 1250/145 1248/143 1247/142 f 1251/146 1252/147 1250/145 1249/144 f 1253/148 1254/149 1252/147 1251/146 f 1255/150 1256/151 1254/149 1253/148 f 1257/152 1258/153 1256/151 1255/150 f 1259/154 1260/155 1258/153 1257/152 f 1261/156 1262/157 1260/155 1259/154 f 1263/158 1264/159 1262/157 1261/156 f 1265/160 1266/161 1264/159 1263/158 f 1267/162 1268/163 1266/161 1265/160 f 1269/164 1270/165 1268/163 1267/162 f 1271/166 1272/167 1270/165 1269/164 f 1273/168 1274/169 1272/167 1271/166 f 1275/170 1276/171 1274/169 1273/168 f 1277/172 1278/173 1276/171 1275/170 f 1279/174 1280/175 1278/173 1277/172 f 1281/176 1282/177 1280/175 1279/174 f 1283/178 1284/179 1282/177 1281/176 f 1285/180 1286/181 1284/179 1283/178 f 1287/182 1288/183 1286/181 1285/180 f 1289/184 1290/185 1288/183 1287/182 f 1291/186 1292/187 1290/185 1289/184 f 1293/188 1294/189 1292/187 1291/186 f 1295/190 1296/191 1294/189 1293/188 f 1297/192 1298/193 1296/191 1295/190 f 1299/194 1300/195 1298/193 1297/192 f 1301/196 1302/197 1300/195 1299/194 f 1303/198 1304/199 1302/197 1301/196 f 1305/200 1306/201 1304/199 1303/198 f 1307/202 1308/203 1306/201 1305/200 f 1309/204 1310/205 1308/203 1307/202 f 1311/206 1312/207 1310/205 1309/204 f 1313/208 1314/209 1312/207 1311/206 f 1315/210 1316/211 1314/209 1313/208 f 1317/212 1318/213 1316/211 1315/210 f 1319/214 1320/215 1318/213 1317/212 f 1321/216 1322/217 1320/215 1319/214 f 1323/218 1324/219 1322/217 1321/216 f 1325/220 1326/221 1324/219 1323/218 f 1327/222 1328/223 1326/221 1325/220 f 1329/224 1330/225 1328/223 1327/222 f 1331/226 1332/227 1330/225 1329/224 f 1333/228 1334/229 1332/227 1331/226 f 1335/230 1336/231 1334/229 1333/228 f 1337/232 1338/233 1336/231 1335/230 f 1339/234 1340/235 1338/233 1337/232 f 1341/236 1342/237 1340/235 1339/234 f 1343/238 1344/239 1342/237 1341/236 f 1345/240 1346/241 1344/239 1343/238 f 1347/242 1348/243 1346/241 1345/240 f 1349/244 1350/245 1348/243 1347/242 f 1351/246 1352/247 1350/245 1349/244 f 1353/248 1354/249 1352/247 1351/246 f 1355/250 1356/251 1354/249 1353/248 f 1357/252 1358/253 1356/251 1355/250 f 1359/254 1360/255 1358/253 1357/252 f 1361/256 1362/257 1360/255 1359/254 f 1363/258 1364/259 1362/257 1361/256 f 1365/260 1366/261 1364/259 1363/258 f 1367/262 1368/263 1366/261 1365/260 f 1369/264 1370/265 1368/263 1367/262 f 1371/266 1372/267 1370/265 1369/264 f 1373/268 1374/269 1372/267 1371/266 f 1375/270 1376/271 1374/269 1373/268 f 1377/272 1378/273 1376/271 1375/270 f 1379/274 1380/275 1378/273 1377/272 f 1381/276 1382/277 1380/275 1379/274 f 1383/278 1384/279 1382/277 1381/276 f 1385/280 1386/281 1384/279 1383/278 f 1387/282 1388/283 1386/281 1385/280 f 1389/284 1390/285 1388/283 1387/282 f 1391/286 1392/287 1390/285 1389/284 f 1393/288 1394/289 1392/287 1391/286 f 1395/290 1396/291 1394/289 1393/288 f 1397/292 1398/293 1396/291 1395/290 f 1399/294 1400/295 1398/293 1397/292 f 1401/296 1402/297 1400/295 1399/294 f 1403/298 1404/299 1402/297 1401/296 f 1405/300 1406/301 1404/299 1403/298 f 1407/302 1408/303 1406/301 1405/300 f 1409/304 1410/305 1408/303 1407/302 f 1411/306 1412/307 1410/305 1409/304 f 1413/308 1414/309 1412/307 1411/306 f 1415/310 1416/311 1414/309 1413/308 f 1417/312 1418/313 1416/311 1415/310 f 1419/314 1420/315 1418/313 1417/312 f 1421/316 1422/317 1420/315 1419/314 f 1423/318 1424/319 1422/317 1421/316 f 1425/320 1426/321 1424/319 1423/318 f 1427/322 1428/323 1426/321 1425/320 f 1429/324 1430/325 1428/323 1427/322 f 1431/326 1432/327 1430/325 1429/324 f 1433/328 1434/329 1432/327 1431/326 f 1435/330 1436/331 1434/329 1433/328 f 1437/332 1438/333 1436/331 1435/330 f 1439/334 1440/335 1438/333 1437/332 f 1441/336 1442/337 1440/335 1439/334 f 1122/10 1121/15 1442/337 1441/336 f 1443/338 1444/339 1445/11 1446/4 f 1447/340 1448/341 1444/339 1443/338 f 1449/342 1450/343 1448/341 1447/340 f 1451/344 1452/345 1450/343 1449/342 f 1453/346 1454/347 1452/345 1451/344 f 1455/348 1456/349 1454/347 1453/346 f 1457/350 1458/351 1456/349 1455/348 f 1459/352 1460/353 1458/351 1457/350 f 1461/354 1462/355 1460/353 1459/352 f 1463/356 1464/357 1462/355 1461/354 f 1465/358 1466/359 1464/357 1463/356 f 1467/360 1468/361 1466/359 1465/358 f 1469/362 1470/363 1468/361 1467/360 f 1471/364 1472/365 1470/363 1469/362 f 1473/366 1474/367 1472/365 1471/364 f 1475/368 1476/369 1474/367 1473/366 f 1477/370 1478/371 1476/369 1475/368 f 1479/372 1480/373 1478/371 1477/370 f 1481/374 1482/375 1480/373 1479/372 f 1483/376 1484/377 1482/375 1481/374 f 1485/378 1486/379 1484/377 1483/376 f 1487/380 1488/381 1486/379 1485/378 f 1489/382 1490/383 1488/381 1487/380 f 1491/384 1492/385 1490/383 1489/382 f 1493/386 1494/387 1492/385 1491/384 f 1495/388 1496/389 1494/387 1493/386 f 1497/390 1498/391 1496/389 1495/388 f 1499/392 1500/393 1498/391 1497/390 f 1501/394 1502/395 1500/393 1499/392 f 1503/396 1504/397 1502/395 1501/394 f 1505/398 1506/399 1504/397 1503/396 f 1507/400 1508/401 1506/399 1505/398 f 1509/402 1510/403 1508/401 1507/400 f 1511/404 1512/405 1510/403 1509/402 f 1513/406 1514/407 1512/405 1511/404 f 1515/408 1516/409 1514/407 1513/406 f 1517/410 1518/411 1516/409 1515/408 f 1519/412 1520/413 1518/411 1517/410 f 1521/414 1522/415 1520/413 1519/412 f 1523/416 1524/417 1522/415 1521/414 f 1525/418 1526/419 1524/417 1523/416 f 1527/420 1528/421 1526/419 1525/418 f 1529/422 1530/423 1528/421 1527/420 f 1531/424 1532/425 1530/423 1529/422 f 1533/426 1534/427 1532/425 1531/424 f 1535/428 1536/429 1534/427 1533/426 f 1537/430 1538/431 1536/429 1535/428 f 1539/432 1540/433 1538/431 1537/430 f 1541/434 1542/435 1540/433 1539/432 f 1543/436 1544/437 1542/435 1541/434 f 1545/438 1546/439 1544/437 1543/436 f 1547/440 1548/441 1546/439 1545/438 f 1549/442 1550/443 1548/441 1547/440 f 1551/444 1552/445 1550/443 1549/442 f 1553/446 1554/447 1552/445 1551/444 f 1555/448 1556/449 1554/447 1553/446 f 1557/450 1558/451 1556/449 1555/448 f 1559/452 1560/453 1558/451 1557/450 f 1561/454 1562/455 1560/453 1559/452 f 1563/456 1564/457 1562/455 1561/454 f 1565/458 1566/459 1564/457 1563/456 f 1567/460 1568/461 1566/459 1565/458 f 1569/462 1570/463 1568/461 1567/460 f 1571/464 1572/465 1570/463 1569/462 f 1573/466 1574/467 1572/465 1571/464 f 1575/468 1576/469 1574/467 1573/466 f 1577/470 1578/471 1576/469 1575/468 f 1579/472 1580/473 1578/471 1577/470 f 1581/474 1582/475 1580/473 1579/472 f 1583/476 1584/477 1582/475 1581/474 f 1585/478 1586/479 1584/477 1583/476 f 1587/480 1588/481 1586/479 1585/478 f 1589/482 1590/483 1588/481 1587/480 f 1591/484 1592/485 1590/483 1589/482 f 1593/486 1594/487 1592/485 1591/484 f 1595/488 1596/489 1594/487 1593/486 f 1597/490 1598/491 1596/489 1595/488 f 1599/492 1600/493 1598/491 1597/490 f 1601/494 1602/495 1600/493 1599/492 f 1603/496 1604/497 1602/495 1601/494 f 1605/498 1606/499 1604/497 1603/496 f 1607/500 1608/501 1606/499 1605/498 f 1609/502 1610/503 1608/501 1607/500 f 1611/504 1612/505 1610/503 1609/502 f 1613/506 1614/507 1612/505 1611/504 f 1615/508 1616/509 1614/507 1613/506 f 1617/510 1618/511 1616/509 1615/508 f 1619/512 1620/513 1618/511 1617/510 f 1621/514 1622/515 1620/513 1619/512 f 1446/10 1445/15 1622/515 1621/514 f 1623/1 1624/2 1625/3 1626/4 f 1624/2 1627/5 1628/6 1625/3 f 1627/5 1629/7 1630/8 1628/6 f 1629/7 1623/9 1626/10 1630/8 f 1631/11 1632/12 1624/2 1623/1 f 1632/12 1633/13 1627/5 1624/2 f 1633/13 1634/14 1629/7 1627/5 f 1634/14 1631/15 1623/9 1629/7 f 1635/4 1636/4 1637/4 f 1638/4 1635/4 1637/4 f 1639/4 1640/4 1641/4 f 1642/4 1639/4 1641/4 f 1643/516 1644/517 1645/11 1646/4 f 1647/518 1648/519 1644/517 1643/516 f 1649/520 1650/521 1648/519 1647/518 f 1651/522 1652/523 1650/521 1649/520 f 1653/524 1654/525 1652/523 1651/522 f 1655/526 1656/527 1654/525 1653/524 f 1657/528 1658/529 1656/527 1655/526 f 1659/530 1660/531 1658/529 1657/528 f 1661/532 1662/533 1660/531 1659/530 f 1663/534 1664/535 1662/533 1661/532 f 1665/536 1666/537 1664/535 1663/534 f 1667/538 1668/539 1666/537 1665/536 f 1669/540 1670/541 1668/539 1667/538 f 1671/542 1672/543 1670/541 1669/540 f 1673/544 1674/545 1672/543 1671/542 f 1675/546 1676/547 1674/545 1673/544 f 1677/548 1678/549 1676/547 1675/546 f 1679/550 1680/551 1678/549 1677/548 f 1681/552 1682/553 1680/551 1679/550 f 1683/554 1684/555 1682/553 1681/552 f 1685/556 1686/557 1684/555 1683/554 f 1687/558 1688/559 1686/557 1685/556 f 1689/560 1690/561 1688/559 1687/558 f 1691/562 1692/563 1690/561 1689/560 f 1693/564 1694/565 1692/563 1691/562 f 1695/566 1696/567 1694/565 1693/564 f 1697/568 1698/569 1696/567 1695/566 f 1699/570 1700/571 1698/569 1697/568 f 1701/572 1702/573 1700/571 1699/570 f 1703/574 1704/575 1702/573 1701/572 f 1705/576 1706/577 1704/575 1703/574 f 1707/578 1708/579 1706/577 1705/576 f 1709/580 1710/581 1708/579 1707/578 f 1711/582 1712/583 1710/581 1709/580 f 1713/584 1714/585 1712/583 1711/582 f 1715/586 1716/587 1714/585 1713/584 f 1717/588 1718/589 1716/587 1715/586 f 1719/590 1720/591 1718/589 1717/588 f 1721/592 1722/593 1720/591 1719/590 f 1723/594 1724/595 1722/593 1721/592 f 1725/596 1726/597 1724/595 1723/594 f 1727/598 1728/599 1726/597 1725/596 f 1729/600 1730/601 1728/599 1727/598 f 1731/602 1732/603 1730/601 1729/600 f 1733/604 1734/605 1732/603 1731/602 f 1735/606 1736/607 1734/605 1733/604 f 1737/608 1738/609 1736/607 1735/606 f 1739/610 1740/611 1738/609 1737/608 f 1741/612 1742/613 1740/611 1739/610 f 1743/614 1744/615 1742/613 1741/612 f 1745/616 1746/617 1744/615 1743/614 f 1747/618 1748/619 1746/617 1745/616 f 1749/620 1750/621 1748/619 1747/618 f 1751/622 1752/623 1750/621 1749/620 f 1753/624 1754/625 1752/623 1751/622 f 1755/626 1756/627 1754/625 1753/624 f 1757/628 1758/629 1756/627 1755/626 f 1759/630 1760/631 1758/629 1757/628 f 1761/632 1762/633 1760/631 1759/630 f 1763/634 1764/635 1762/633 1761/632 f 1765/636 1766/637 1764/635 1763/634 f 1767/638 1768/639 1766/637 1765/636 f 1769/640 1770/641 1768/639 1767/638 f 1771/642 1772/643 1770/641 1769/640 f 1773/644 1774/645 1772/643 1771/642 f 1775/646 1776/647 1774/645 1773/644 f 1777/648 1778/649 1776/647 1775/646 f 1779/650 1780/651 1778/649 1777/648 f 1781/652 1782/653 1780/651 1779/650 f 1783/654 1784/655 1782/653 1781/652 f 1785/656 1786/657 1784/655 1783/654 f 1787/658 1788/659 1786/657 1785/656 f 1789/660 1790/661 1788/659 1787/658 f 1791/662 1792/663 1790/661 1789/660 f 1793/664 1794/665 1792/663 1791/662 f 1795/666 1796/667 1794/665 1793/664 f 1646/10 1645/15 1796/667 1795/666 f 1797/338 1798/339 1799/11 1800/4 f 1801/340 1802/341 1798/339 1797/338 f 1803/342 1804/343 1802/341 1801/340 f 1805/344 1806/345 1804/343 1803/342 f 1807/346 1808/347 1806/345 1805/344 f 1809/348 1810/349 1808/347 1807/346 f 1811/350 1812/351 1810/349 1809/348 f 1813/352 1814/353 1812/351 1811/350 f 1815/354 1816/355 1814/353 1813/352 f 1817/356 1818/357 1816/355 1815/354 f 1819/358 1820/359 1818/357 1817/356 f 1821/360 1822/361 1820/359 1819/358 f 1823/362 1824/363 1822/361 1821/360 f 1825/364 1826/365 1824/363 1823/362 f 1827/366 1828/367 1826/365 1825/364 f 1829/368 1830/369 1828/367 1827/366 f 1831/370 1832/371 1830/369 1829/368 f 1833/372 1834/373 1832/371 1831/370 f 1835/374 1836/375 1834/373 1833/372 f 1837/376 1838/377 1836/375 1835/374 f 1839/378 1840/379 1838/377 1837/376 f 1841/380 1842/381 1840/379 1839/378 f 1843/382 1844/383 1842/381 1841/380 f 1845/384 1846/385 1844/383 1843/382 f 1847/386 1848/387 1846/385 1845/384 f 1849/388 1850/389 1848/387 1847/386 f 1851/390 1852/391 1850/389 1849/388 f 1853/392 1854/393 1852/391 1851/390 f 1855/394 1856/395 1854/393 1853/392 f 1857/396 1858/397 1856/395 1855/394 f 1859/398 1860/399 1858/397 1857/396 f 1861/400 1862/401 1860/399 1859/398 f 1863/402 1864/403 1862/401 1861/400 f 1865/404 1866/405 1864/403 1863/402 f 1867/406 1868/407 1866/405 1865/404 f 1869/408 1870/409 1868/407 1867/406 f 1871/410 1872/411 1870/409 1869/408 f 1873/412 1874/413 1872/411 1871/410 f 1875/414 1876/415 1874/413 1873/412 f 1877/416 1878/417 1876/415 1875/414 f 1879/418 1880/419 1878/417 1877/416 f 1881/420 1882/421 1880/419 1879/418 f 1883/422 1884/423 1882/421 1881/420 f 1885/424 1886/425 1884/423 1883/422 f 1887/426 1888/427 1886/425 1885/424 f 1889/428 1890/429 1888/427 1887/426 f 1891/430 1892/431 1890/429 1889/428 f 1893/432 1894/433 1892/431 1891/430 f 1895/434 1896/435 1894/433 1893/432 f 1897/436 1898/437 1896/435 1895/434 f 1899/438 1900/439 1898/437 1897/436 f 1901/440 1902/441 1900/439 1899/438 f 1903/442 1904/443 1902/441 1901/440 f 1905/444 1906/445 1904/443 1903/442 f 1907/446 1908/447 1906/445 1905/444 f 1909/448 1910/449 1908/447 1907/446 f 1911/450 1912/451 1910/449 1909/448 f 1913/452 1914/453 1912/451 1911/450 f 1915/454 1916/455 1914/453 1913/452 f 1917/456 1918/457 1916/455 1915/454 f 1919/458 1920/459 1918/457 1917/456 f 1921/460 1922/461 1920/459 1919/458 f 1923/462 1924/463 1922/461 1921/460 f 1925/464 1926/465 1924/463 1923/462 f 1927/466 1928/467 1926/465 1925/464 f 1929/468 1930/469 1928/467 1927/466 f 1931/470 1932/471 1930/469 1929/468 f 1933/472 1934/473 1932/471 1931/470 f 1935/474 1936/475 1934/473 1933/472 f 1937/476 1938/477 1936/475 1935/474 f 1939/478 1940/479 1938/477 1937/476 f 1941/480 1942/481 1940/479 1939/478 f 1943/482 1944/483 1942/481 1941/480 f 1945/484 1946/485 1944/483 1943/482 f 1947/486 1948/487 1946/485 1945/484 f 1949/488 1950/489 1948/487 1947/486 f 1951/490 1952/491 1950/489 1949/488 f 1953/492 1954/493 1952/491 1951/490 f 1955/494 1956/495 1954/493 1953/492 f 1957/496 1958/497 1956/495 1955/494 f 1959/498 1960/499 1958/497 1957/496 f 1961/500 1962/501 1960/499 1959/498 f 1963/502 1964/503 1962/501 1961/500 f 1965/504 1966/505 1964/503 1963/502 f 1967/506 1968/507 1966/505 1965/504 f 1969/508 1970/509 1968/507 1967/506 f 1971/510 1972/511 1970/509 1969/508 f 1973/512 1974/513 1972/511 1971/510 f 1975/514 1976/515 1974/513 1973/512 f 1800/10 1799/15 1976/515 1975/514 f 1977/1 1978/2 1979/3 1980/4 f 1978/2 1981/5 1982/6 1979/3 f 1981/5 1983/7 1984/8 1982/6 f 1983/7 1977/9 1980/10 1984/8 f 1985/11 1986/12 1978/2 1977/1 f 1986/12 1987/13 1981/5 1978/2 f 1987/13 1988/14 1983/7 1981/5 f 1988/14 1985/15 1977/9 1983/7 f 1989/4 1990/4 1991/4 f 1992/4 1989/4 1991/4 f 1993/4 1994/4 1995/4 f 1996/4 1993/4 1995/4 f 1997/668 1998/669 1999/11 2000/4 f 2001/670 2002/671 1998/669 1997/668 f 2003/672 2004/673 2002/671 2001/670 f 2005/674 2006/675 2004/673 2003/672 f 2007/676 2008/677 2006/675 2005/674 f 2009/678 2010/679 2008/677 2007/676 f 2011/680 2012/681 2010/679 2009/678 f 2013/682 2014/683 2012/681 2011/680 f 2015/684 2016/685 2014/683 2013/682 f 2000/10 1999/15 2016/685 2015/684 f 2017/338 2018/339 2019/11 2020/4 f 2021/340 2022/341 2018/339 2017/338 f 2023/342 2024/343 2022/341 2021/340 f 2025/344 2026/345 2024/343 2023/342 f 2027/346 2028/347 2026/345 2025/344 f 2029/348 2030/349 2028/347 2027/346 f 2031/350 2032/351 2030/349 2029/348 f 2033/352 2034/353 2032/351 2031/350 f 2035/354 2036/355 2034/353 2033/352 f 2037/356 2038/357 2036/355 2035/354 f 2039/358 2040/359 2038/357 2037/356 f 2041/360 2042/361 2040/359 2039/358 f 2043/362 2044/363 2042/361 2041/360 f 2045/364 2046/365 2044/363 2043/362 f 2047/366 2048/367 2046/365 2045/364 f 2049/368 2050/369 2048/367 2047/366 f 2051/370 2052/371 2050/369 2049/368 f 2053/372 2054/373 2052/371 2051/370 f 2055/374 2056/375 2054/373 2053/372 f 2057/376 2058/377 2056/375 2055/374 f 2059/378 2060/379 2058/377 2057/376 f 2061/380 2062/381 2060/379 2059/378 f 2063/382 2064/383 2062/381 2061/380 f 2065/384 2066/385 2064/383 2063/382 f 2067/386 2068/387 2066/385 2065/384 f 2069/388 2070/389 2068/387 2067/386 f 2071/390 2072/391 2070/389 2069/388 f 2073/392 2074/393 2072/391 2071/390 f 2075/394 2076/395 2074/393 2073/392 f 2077/396 2078/397 2076/395 2075/394 f 2079/398 2080/399 2078/397 2077/396 f 2081/400 2082/401 2080/399 2079/398 f 2083/402 2084/403 2082/401 2081/400 f 2085/404 2086/405 2084/403 2083/402 f 2087/406 2088/407 2086/405 2085/404 f 2089/408 2090/409 2088/407 2087/406 f 2091/410 2092/411 2090/409 2089/408 f 2093/412 2094/413 2092/411 2091/410 f 2095/414 2096/415 2094/413 2093/412 f 2097/416 2098/417 2096/415 2095/414 f 2099/418 2100/419 2098/417 2097/416 f 2101/420 2102/421 2100/419 2099/418 f 2103/422 2104/423 2102/421 2101/420 f 2105/424 2106/425 2104/423 2103/422 f 2107/426 2108/427 2106/425 2105/424 f 2109/428 2110/429 2108/427 2107/426 f 2111/430 2112/431 2110/429 2109/428 f 2113/432 2114/433 2112/431 2111/430 f 2115/434 2116/435 2114/433 2113/432 f 2117/436 2118/437 2116/435 2115/434 f 2119/438 2120/439 2118/437 2117/436 f 2121/440 2122/441 2120/439 2119/438 f 2123/442 2124/443 2122/441 2121/440 f 2125/444 2126/445 2124/443 2123/442 f 2127/446 2128/447 2126/445 2125/444 f 2129/448 2130/449 2128/447 2127/446 f 2131/450 2132/451 2130/449 2129/448 f 2133/452 2134/453 2132/451 2131/450 f 2135/454 2136/455 2134/453 2133/452 f 2137/456 2138/457 2136/455 2135/454 f 2139/458 2140/459 2138/457 2137/456 f 2141/460 2142/461 2140/459 2139/458 f 2143/462 2144/463 2142/461 2141/460 f 2145/464 2146/465 2144/463 2143/462 f 2147/466 2148/467 2146/465 2145/464 f 2149/468 2150/469 2148/467 2147/466 f 2151/470 2152/471 2150/469 2149/468 f 2153/472 2154/473 2152/471 2151/470 f 2155/474 2156/475 2154/473 2153/472 f 2157/476 2158/477 2156/475 2155/474 f 2159/478 2160/479 2158/477 2157/476 f 2161/480 2162/481 2160/479 2159/478 f 2163/482 2164/483 2162/481 2161/480 f 2165/484 2166/485 2164/483 2163/482 f 2167/486 2168/487 2166/485 2165/484 f 2169/488 2170/489 2168/487 2167/486 f 2171/490 2172/491 2170/489 2169/488 f 2173/492 2174/493 2172/491 2171/490 f 2175/494 2176/495 2174/493 2173/492 f 2177/496 2178/497 2176/495 2175/494 f 2179/498 2180/499 2178/497 2177/496 f 2181/500 2182/501 2180/499 2179/498 f 2183/502 2184/503 2182/501 2181/500 f 2185/504 2186/505 2184/503 2183/502 f 2187/506 2188/507 2186/505 2185/504 f 2189/508 2190/509 2188/507 2187/506 f 2191/510 2192/511 2190/509 2189/508 f 2193/512 2194/513 2192/511 2191/510 f 2195/514 2196/515 2194/513 2193/512 f 2020/10 2019/15 2196/515 2195/514 f 2197/15 2198/10 2199/686 f 2200/15 2201/10 2198/4 2197/11 f 2202/687 2201/4 2200/11 f 2200/15 2197/10 2199/4 2202/11 f 2198/15 2201/10 2202/4 2199/11 f 2203/4 2204/4 2205/4 f 2206/4 2204/4 2203/4 f 2207/4 2203/4 2205/4 f 2206/4 2203/4 2208/4 f 2206/4 2208/4 2209/4 f 2210/4 2206/4 2209/4 f 2210/4 2209/4 2211/4 f 2210/4 2211/4 2212/4 f 2213/4 2210/4 2212/4 f 2213/4 2212/4 2214/4 f 2215/4 2213/4 2214/4 f 2215/4 2214/4 2216/4 f 2217/4 2215/4 2216/4 f 2217/4 2216/4 2218/4 f 2219/4 2217/4 2218/4 f 2220/4 2219/4 2218/4 f 2220/4 2218/4 2221/4 f 2222/4 2220/4 2221/4 f 2222/4 2221/4 2223/4 f 2224/4 2222/4 2223/4 f 2224/4 2223/4 2225/4 f 2226/4 2224/4 2225/4 f 2226/4 2225/4 2227/4 f 2228/4 2226/4 2227/4 f 2229/4 2228/4 2227/4 f 2229/4 2227/4 2230/4 f 2231/4 2229/4 2230/4 f 2232/4 2233/4 2234/4 f 2235/4 2231/4 2230/4 f 2235/4 2230/4 2236/4 f 2237/4 2235/4 2236/4 f 2232/4 2234/4 2238/4 f 2237/4 2236/4 2239/4 f 2240/4 2237/4 2239/4 f 2241/4 2240/4 2239/4 f 2241/4 2239/4 2242/4 f 2232/4 2238/4 2243/4 f 2244/4 2241/4 2242/4 f 2244/4 2242/4 2245/4 f 2246/4 2244/4 2245/4 f 2247/4 2232/4 2243/4 f 2247/4 2243/4 2248/4 f 2249/4 2247/4 2248/4 f 2246/4 2245/4 2250/4 f 2251/4 2246/4 2250/4 f 2252/4 2249/4 2248/4 f 2252/4 2248/4 2253/4 f 2254/4 2251/4 2250/4 f 2254/4 2250/4 2255/4 f 2256/4 2252/4 2253/4 f 2256/4 2253/4 2257/4 f 2258/4 2254/4 2255/4 f 2256/4 2257/4 2259/4 f 2258/4 2255/4 2260/4 f 2261/4 2258/4 2260/4 f 2256/4 2259/4 2262/4 f 2263/4 2256/4 2262/4 f 2264/4 2261/4 2260/4 f 2263/4 2262/4 2265/4 f 2266/4 2264/4 2260/4 f 2266/4 2260/4 2267/4 f 2263/4 2265/4 2268/4 f 2269/4 2266/4 2267/4 f 2270/4 2263/4 2268/4 f 2271/4 2269/4 2267/4 f 2270/4 2268/4 2272/4 f 2273/4 2271/4 2267/4 f 2270/4 2272/4 2274/4 f 2275/4 2273/4 2267/4 f 2270/4 2274/4 2276/4 f 2277/4 2275/4 2267/4 f 2270/4 2276/4 2277/4 f 2270/4 2277/4 2267/4 f 2270/4 2267/4 2278/4 f 2279/4 2270/4 2278/4 f 2279/4 2278/4 2280/4 f 2279/4 2280/4 2281/4 f 2282/4 2279/4 2281/4 f 2282/4 2281/4 2283/4 f 2284/4 2282/4 2283/4 f 2284/4 2283/4 2285/4 f 2286/4 2284/4 2285/4 f 2286/4 2285/4 2287/4 f 2286/4 2287/4 2288/4 f 2289/4 2286/4 2288/4 f 2289/4 2288/4 2290/4 f 2291/4 2289/4 2290/4 f 2291/4 2290/4 2292/4 f 2293/4 2294/4 2295/4 f 2296/4 2293/4 2295/4 f 2296/4 2295/4 2297/4 f 2298/4 2296/4 2297/4 f 2299/4 2300/4 2298/4 f 2301/4 2299/4 2298/4 f 2301/4 2298/4 2297/4 f 2301/4 2297/4 2302/4 f 2303/4 2304/4 2305/4 f 2305/4 2304/4 2306/4 f 2303/4 2305/4 2307/4 f 2308/4 2305/4 2306/4 f 2309/4 2308/4 2306/4 f 2309/4 2306/4 2310/4 f 2311/4 2309/4 2310/4 f 2312/4 2311/4 2310/4 f 2312/4 2310/4 2313/4 f 2314/4 2312/4 2313/4 f 2314/4 2313/4 2315/4 f 2316/4 2314/4 2315/4 f 2316/4 2315/4 2317/4 f 2318/4 2316/4 2317/4 f 2318/4 2317/4 2319/4 f 2318/4 2319/4 2320/4 f 2321/4 2318/4 2320/4 f 2321/4 2320/4 2322/4 f 2323/4 2321/4 2322/4 f 2323/4 2322/4 2324/4 f 2325/4 2323/4 2324/4 f 2325/4 2324/4 2326/4 f 2327/4 2325/4 2326/4 f 2327/4 2326/4 2328/4 f 2327/4 2328/4 2329/4 f 2330/4 2327/4 2329/4 f 2330/4 2329/4 2331/4 f 2332/4 2333/4 2334/4 f 2330/4 2331/4 2335/4 f 2336/4 2330/4 2335/4 f 2336/4 2335/4 2337/4 f 2338/4 2332/4 2334/4 f 2339/4 2336/4 2337/4 f 2339/4 2337/4 2340/4 f 2339/4 2340/4 2341/4 f 2342/4 2339/4 2341/4 f 2343/4 2338/4 2334/4 f 2342/4 2341/4 2344/4 f 2345/4 2342/4 2344/4 f 2345/4 2344/4 2346/4 f 2343/4 2334/4 2347/4 f 2348/4 2343/4 2347/4 f 2348/4 2347/4 2349/4 f 2350/4 2345/4 2346/4 f 2350/4 2346/4 2351/4 f 2348/4 2349/4 2352/4 f 2353/4 2348/4 2352/4 f 2350/4 2351/4 2354/4 f 2355/4 2350/4 2354/4 f 2353/4 2352/4 2356/4 f 2357/4 2353/4 2356/4 f 2355/4 2354/4 2358/4 f 2359/4 2357/4 2356/4 f 2360/4 2355/4 2358/4 f 2360/4 2358/4 2361/4 f 2362/4 2359/4 2356/4 f 2362/4 2356/4 2363/4 f 2360/4 2361/4 2364/4 f 2365/4 2362/4 2363/4 f 2360/4 2364/4 2366/4 f 2367/4 2360/4 2366/4 f 2368/4 2365/4 2363/4 f 2367/4 2366/4 2369/4 f 2368/4 2363/4 2370/4 f 2367/4 2369/4 2371/4 f 2372/4 2368/4 2370/4 f 2367/4 2371/4 2373/4 f 2374/4 2372/4 2370/4 f 2367/4 2373/4 2375/4 f 2376/4 2374/4 2370/4 f 2367/4 2375/4 2377/4 f 2377/4 2376/4 2370/4 f 2367/4 2377/4 2370/4 f 2378/4 2367/4 2370/4 f 2378/4 2370/4 2379/4 f 2380/4 2378/4 2379/4 f 2381/4 2380/4 2379/4 f 2381/4 2379/4 2382/4 f 2383/4 2381/4 2382/4 f 2383/4 2382/4 2384/4 f 2385/4 2383/4 2384/4 f 2385/4 2384/4 2386/4 f 2387/4 2385/4 2386/4 f 2388/4 2387/4 2386/4 f 2388/4 2386/4 2389/4 f 2390/4 2388/4 2389/4 f 2390/4 2389/4 2391/4 f 2392/4 2390/4 2391/4 f 2393/4 2394/4 2395/4 f 2393/4 2395/4 2396/4 f 2397/4 2393/4 2396/4 f 2397/4 2396/4 2398/4 f 2398/4 2399/4 2400/4 f 2398/4 2400/4 2401/4 f 2397/4 2398/4 2401/4 f 2402/4 2397/4 2401/4 f 2403/4 2404/4 2405/4 f 2406/4 2404/4 2403/4 f 2407/4 2403/4 2405/4 f 2406/4 2403/4 2408/4 f 2406/4 2408/4 2409/4 f 2410/4 2406/4 2409/4 f 2410/4 2409/4 2411/4 f 2410/4 2411/4 2412/4 f 2413/4 2410/4 2412/4 f 2413/4 2412/4 2414/4 f 2415/4 2413/4 2414/4 f 2415/4 2414/4 2416/4 f 2417/4 2415/4 2416/4 f 2417/4 2416/4 2418/4 f 2419/4 2417/4 2418/4 f 2420/4 2419/4 2418/4 f 2420/4 2418/4 2421/4 f 2422/4 2420/4 2421/4 f 2422/4 2421/4 2423/4 f 2424/4 2422/4 2423/4 f 2424/4 2423/4 2425/4 f 2426/4 2424/4 2425/4 f 2426/4 2425/4 2427/4 f 2428/4 2426/4 2427/4 f 2429/4 2428/4 2427/4 f 2429/4 2427/4 2430/4 f 2431/4 2429/4 2430/4 f 2432/4 2433/4 2434/4 f 2435/4 2431/4 2430/4 f 2435/4 2430/4 2436/4 f 2437/4 2435/4 2436/4 f 2432/4 2434/4 2438/4 f 2437/4 2436/4 2439/4 f 2440/4 2437/4 2439/4 f 2441/4 2440/4 2439/4 f 2441/4 2439/4 2442/4 f 2432/4 2438/4 2443/4 f 2444/4 2441/4 2442/4 f 2444/4 2442/4 2445/4 f 2446/4 2444/4 2445/4 f 2447/4 2432/4 2443/4 f 2447/4 2443/4 2448/4 f 2449/4 2447/4 2448/4 f 2446/4 2445/4 2450/4 f 2451/4 2446/4 2450/4 f 2452/4 2449/4 2448/4 f 2452/4 2448/4 2453/4 f 2454/4 2451/4 2450/4 f 2454/4 2450/4 2455/4 f 2456/4 2452/4 2453/4 f 2456/4 2453/4 2457/4 f 2458/4 2454/4 2455/4 f 2456/4 2457/4 2459/4 f 2458/4 2455/4 2460/4 f 2461/4 2458/4 2460/4 f 2456/4 2459/4 2462/4 f 2463/4 2456/4 2462/4 f 2464/4 2461/4 2460/4 f 2463/4 2462/4 2465/4 f 2466/4 2464/4 2460/4 f 2466/4 2460/4 2467/4 f 2463/4 2465/4 2468/4 f 2469/4 2466/4 2467/4 f 2470/4 2463/4 2468/4 f 2471/4 2469/4 2467/4 f 2470/4 2468/4 2472/4 f 2473/4 2471/4 2467/4 f 2470/4 2472/4 2474/4 f 2475/4 2473/4 2467/4 f 2470/4 2474/4 2476/4 f 2477/4 2475/4 2467/4 f 2470/4 2476/4 2477/4 f 2470/4 2477/4 2467/4 f 2470/4 2467/4 2478/4 f 2479/4 2470/4 2478/4 f 2479/4 2478/4 2480/4 f 2479/4 2480/4 2481/4 f 2482/4 2479/4 2481/4 f 2482/4 2481/4 2483/4 f 2484/4 2482/4 2483/4 f 2484/4 2483/4 2485/4 f 2486/4 2484/4 2485/4 f 2486/4 2485/4 2487/4 f 2486/4 2487/4 2488/4 f 2489/4 2486/4 2488/4 f 2489/4 2488/4 2490/4 f 2491/4 2489/4 2490/4 f 2491/4 2490/4 2492/4 f 2493/4 2494/4 2495/4 f 2493/4 2495/4 2496/4 f 2493/4 2496/4 2497/4 f 2493/4 2497/4 2498/4 f 2493/4 2498/4 2499/4 f 2493/4 2499/4 2500/4 f 2501/4 2500/4 2502/4 f 2493/4 2500/4 2501/4 f 2503/4 2502/4 2504/4 f 2501/4 2502/4 2503/4 f 2505/4 2503/4 2504/4 f 2506/4 2505/4 2504/4 f 2507/4 2506/4 2504/4 f 2508/4 2507/4 2504/4 f 2508/4 2504/4 2509/4 f 2510/4 2508/4 2509/4 f 2510/4 2509/4 2511/4 f 2512/4 2510/4 2511/4 f 2513/4 2512/4 2511/4 f 2513/4 2511/4 2514/4 f 2515/4 2513/4 2514/4 f 2516/4 2515/4 2514/4 f 2516/4 2514/4 2517/4 f 2518/4 2516/4 2517/4 f 2518/4 2517/4 2519/4 f 2520/4 2518/4 2519/4 f 2521/4 2520/4 2519/4 f 2521/4 2519/4 2522/4 f 2523/4 2521/4 2522/4 f 2523/4 2522/4 2524/4 f 2525/4 2523/4 2524/4 f 2526/4 2525/4 2524/4 f 2526/4 2524/4 2527/4 f 2528/4 2526/4 2527/4 f 2529/4 2528/4 2527/4 f 2529/4 2527/4 2530/4 f 2531/4 2529/4 2530/4 f 2532/4 2531/4 2530/4 f 2532/4 2530/4 2533/4 f 2534/4 2532/4 2533/4 f 2534/4 2533/4 2535/4 f 2536/4 2534/4 2535/4 f 2536/4 2535/4 2537/4 f 2538/4 2536/4 2537/4 f 2539/4 2538/4 2537/4 f 2539/4 2537/4 2540/4 f 2541/4 2539/4 2540/4 f 2541/4 2540/4 2542/4 f 2543/4 2541/4 2542/4 f 2544/4 2543/4 2542/4 f 2544/4 2542/4 2545/4 f 2546/4 2544/4 2545/4 f 2546/4 2545/4 2547/4 f 2548/4 2546/4 2547/4 f 2548/4 2547/4 2549/4 f 2550/4 2548/4 2549/4 f 2551/4 2550/4 2549/4 f 2551/4 2549/4 2552/4 f 2553/4 2551/4 2552/4 f 2554/4 2553/4 2552/4 f 2554/4 2552/4 2555/4 f 2556/4 2554/4 2555/4 f 2557/4 2556/4 2555/4 f 2557/4 2555/4 2558/4 f 2557/4 2558/4 2559/4 f 2560/4 2557/4 2559/4 f 2560/4 2559/4 2561/4 f 2560/4 2561/4 2562/4 f 2560/4 2562/4 2563/4 f 2564/4 2560/4 2563/4 f 2564/4 2563/4 2565/4 f 2564/4 2565/4 2566/4 f 2564/4 2566/4 2567/4 f 2564/4 2567/4 2568/4 f 2569/4 2564/4 2568/4 f 2570/4 2571/4 2572/4 f 2572/4 2571/4 2573/4 f 2570/4 2572/4 2574/4 f 2575/4 2572/4 2573/4 f 2576/4 2575/4 2573/4 f 2576/4 2573/4 2577/4 f 2578/4 2576/4 2577/4 f 2579/4 2578/4 2577/4 f 2579/4 2577/4 2580/4 f 2581/4 2579/4 2580/4 f 2581/4 2580/4 2582/4 f 2583/4 2581/4 2582/4 f 2583/4 2582/4 2584/4 f 2585/4 2583/4 2584/4 f 2585/4 2584/4 2586/4 f 2585/4 2586/4 2587/4 f 2588/4 2585/4 2587/4 f 2588/4 2587/4 2589/4 f 2590/4 2588/4 2589/4 f 2590/4 2589/4 2591/4 f 2592/4 2590/4 2591/4 f 2592/4 2591/4 2593/4 f 2594/4 2592/4 2593/4 f 2594/4 2593/4 2595/4 f 2594/4 2595/4 2596/4 f 2597/4 2594/4 2596/4 f 2597/4 2596/4 2598/4 f 2599/4 2600/4 2601/4 f 2597/4 2598/4 2602/4 f 2603/4 2597/4 2602/4 f 2603/4 2602/4 2604/4 f 2605/4 2599/4 2601/4 f 2606/4 2603/4 2604/4 f 2606/4 2604/4 2607/4 f 2606/4 2607/4 2608/4 f 2609/4 2606/4 2608/4 f 2610/4 2605/4 2601/4 f 2609/4 2608/4 2611/4 f 2612/4 2609/4 2611/4 f 2612/4 2611/4 2613/4 f 2610/4 2601/4 2614/4 f 2615/4 2610/4 2614/4 f 2615/4 2614/4 2616/4 f 2617/4 2612/4 2613/4 f 2617/4 2613/4 2618/4 f 2615/4 2616/4 2619/4 f 2620/4 2615/4 2619/4 f 2617/4 2618/4 2621/4 f 2622/4 2617/4 2621/4 f 2620/4 2619/4 2623/4 f 2624/4 2620/4 2623/4 f 2622/4 2621/4 2625/4 f 2626/4 2624/4 2623/4 f 2627/4 2622/4 2625/4 f 2627/4 2625/4 2628/4 f 2629/4 2626/4 2623/4 f 2629/4 2623/4 2630/4 f 2627/4 2628/4 2631/4 f 2632/4 2629/4 2630/4 f 2627/4 2631/4 2633/4 f 2634/4 2627/4 2633/4 f 2635/4 2632/4 2630/4 f 2634/4 2633/4 2636/4 f 2635/4 2630/4 2637/4 f 2634/4 2636/4 2638/4 f 2639/4 2635/4 2637/4 f 2634/4 2638/4 2640/4 f 2641/4 2639/4 2637/4 f 2634/4 2640/4 2642/4 f 2643/4 2641/4 2637/4 f 2634/4 2642/4 2644/4 f 2644/4 2643/4 2637/4 f 2634/4 2644/4 2637/4 f 2645/4 2634/4 2637/4 f 2645/4 2637/4 2646/4 f 2647/4 2645/4 2646/4 f 2648/4 2647/4 2646/4 f 2648/4 2646/4 2649/4 f 2650/4 2648/4 2649/4 f 2650/4 2649/4 2651/4 f 2652/4 2650/4 2651/4 f 2652/4 2651/4 2653/4 f 2654/4 2652/4 2653/4 f 2655/4 2654/4 2653/4 f 2655/4 2653/4 2656/4 f 2657/4 2655/4 2656/4 f 2657/4 2656/4 2658/4 f 2659/4 2657/4 2658/4 f 2660/4 2661/4 2662/4 f 2663/4 2660/4 2662/4 f 2664/4 2663/4 2662/4 f 2665/4 2664/4 2662/4 f 2666/4 2665/4 2662/4 f 2667/4 2666/4 2662/4 f 2668/4 2667/4 2669/4 f 2669/4 2667/4 2662/4 f 2670/4 2668/4 2671/4 f 2671/4 2668/4 2669/4 f 2670/4 2671/4 2672/4 f 2670/4 2672/4 2673/4 f 2670/4 2673/4 2674/4 f 2670/4 2674/4 2675/4 f 2676/4 2670/4 2675/4 f 2676/4 2675/4 2677/4 f 2678/4 2676/4 2677/4 f 2678/4 2677/4 2679/4 f 2678/4 2679/4 2680/4 f 2681/4 2678/4 2680/4 f 2681/4 2680/4 2682/4 f 2681/4 2682/4 2683/4 f 2684/4 2681/4 2683/4 f 2684/4 2683/4 2685/4 f 2686/4 2684/4 2685/4 f 2686/4 2685/4 2687/4 f 2686/4 2687/4 2688/4 f 2689/4 2686/4 2688/4 f 2689/4 2688/4 2690/4 f 2691/4 2689/4 2690/4 f 2691/4 2690/4 2692/4 f 2691/4 2692/4 2693/4 f 2694/4 2691/4 2693/4 f 2694/4 2693/4 2695/4 f 2694/4 2695/4 2696/4 f 2697/4 2694/4 2696/4 f 2697/4 2696/4 2698/4 f 2697/4 2698/4 2699/4 f 2700/4 2697/4 2699/4 f 2700/4 2699/4 2701/4 f 2702/4 2700/4 2701/4 f 2702/4 2701/4 2703/4 f 2704/4 2702/4 2703/4 f 2704/4 2703/4 2705/4 f 2704/4 2705/4 2706/4 f 2707/4 2704/4 2706/4 f 2707/4 2706/4 2708/4 f 2709/4 2707/4 2708/4 f 2709/4 2708/4 2710/4 f 2709/4 2710/4 2711/4 f 2712/4 2709/4 2711/4 f 2712/4 2711/4 2713/4 f 2714/4 2712/4 2713/4 f 2714/4 2713/4 2715/4 f 2716/4 2714/4 2715/4 f 2716/4 2715/4 2717/4 f 2716/4 2717/4 2718/4 f 2719/4 2716/4 2718/4 f 2719/4 2718/4 2720/4 f 2719/4 2720/4 2721/4 f 2722/4 2719/4 2721/4 f 2722/4 2721/4 2723/4 f 2722/4 2723/4 2724/4 f 2725/4 2722/4 2724/4 f 2726/4 2725/4 2724/4 f 2726/4 2724/4 2727/4 f 2728/4 2726/4 2727/4 f 2729/4 2728/4 2727/4 f 2730/4 2729/4 2727/4 f 2730/4 2727/4 2731/4 f 2732/4 2730/4 2731/4 f 2733/4 2732/4 2731/4 f 2734/4 2733/4 2731/4 f 2735/4 2734/4 2731/4 f 2735/4 2731/4 2736/4 f 2737/4 2738/4 2739/4 f 2740/4 2738/4 2737/4 f 2741/4 2737/4 2739/4 f 2740/4 2737/4 2742/4 f 2740/4 2742/4 2743/4 f 2744/4 2740/4 2743/4 f 2744/4 2743/4 2745/4 f 2744/4 2745/4 2746/4 f 2747/4 2744/4 2746/4 f 2747/4 2746/4 2748/4 f 2749/4 2747/4 2748/4 f 2749/4 2748/4 2750/4 f 2751/4 2749/4 2750/4 f 2751/4 2750/4 2752/4 f 2753/4 2751/4 2752/4 f 2754/4 2753/4 2752/4 f 2754/4 2752/4 2755/4 f 2756/4 2754/4 2755/4 f 2756/4 2755/4 2757/4 f 2758/4 2756/4 2757/4 f 2758/4 2757/4 2759/4 f 2760/4 2758/4 2759/4 f 2760/4 2759/4 2761/4 f 2762/4 2760/4 2761/4 f 2763/4 2762/4 2761/4 f 2763/4 2761/4 2764/4 f 2765/4 2763/4 2764/4 f 2766/4 2767/4 2768/4 f 2769/4 2765/4 2764/4 f 2769/4 2764/4 2770/4 f 2771/4 2769/4 2770/4 f 2766/4 2768/4 2772/4 f 2771/4 2770/4 2773/4 f 2774/4 2771/4 2773/4 f 2775/4 2774/4 2773/4 f 2775/4 2773/4 2776/4 f 2766/4 2772/4 2777/4 f 2778/4 2775/4 2776/4 f 2778/4 2776/4 2779/4 f 2780/4 2778/4 2779/4 f 2781/4 2766/4 2777/4 f 2781/4 2777/4 2782/4 f 2783/4 2781/4 2782/4 f 2780/4 2779/4 2784/4 f 2785/4 2780/4 2784/4 f 2786/4 2783/4 2782/4 f 2786/4 2782/4 2787/4 f 2788/4 2785/4 2784/4 f 2788/4 2784/4 2789/4 f 2790/4 2786/4 2787/4 f 2790/4 2787/4 2791/4 f 2792/4 2788/4 2789/4 f 2790/4 2791/4 2793/4 f 2792/4 2789/4 2794/4 f 2795/4 2792/4 2794/4 f 2790/4 2793/4 2796/4 f 2797/4 2790/4 2796/4 f 2798/4 2795/4 2794/4 f 2797/4 2796/4 2799/4 f 2800/4 2798/4 2794/4 f 2800/4 2794/4 2801/4 f 2797/4 2799/4 2802/4 f 2803/4 2800/4 2801/4 f 2804/4 2797/4 2802/4 f 2805/4 2803/4 2801/4 f 2804/4 2802/4 2806/4 f 2807/4 2805/4 2801/4 f 2804/4 2806/4 2808/4 f 2809/4 2807/4 2801/4 f 2804/4 2808/4 2810/4 f 2811/4 2809/4 2801/4 f 2804/4 2810/4 2811/4 f 2804/4 2811/4 2801/4 f 2804/4 2801/4 2812/4 f 2813/4 2804/4 2812/4 f 2813/4 2812/4 2814/4 f 2813/4 2814/4 2815/4 f 2816/4 2813/4 2815/4 f 2816/4 2815/4 2817/4 f 2818/4 2816/4 2817/4 f 2818/4 2817/4 2819/4 f 2820/4 2818/4 2819/4 f 2820/4 2819/4 2821/4 f 2820/4 2821/4 2822/4 f 2823/4 2820/4 2822/4 f 2823/4 2822/4 2824/4 f 2825/4 2823/4 2824/4 f 2825/4 2824/4 2826/4 f 2827/4 2828/4 2829/4 f 2827/4 2829/4 2830/4 f 2827/4 2830/4 2831/4 f 2827/4 2831/4 2832/4 f 2827/4 2832/4 2833/4 f 2827/4 2833/4 2834/4 f 2835/4 2834/4 2836/4 f 2827/4 2834/4 2835/4 f 2837/4 2835/4 2836/4 f 2838/4 2837/4 2836/4 f 2839/4 2838/4 2836/4 f 2840/4 2839/4 2836/4 f 2840/4 2836/4 2841/4 f 2842/4 2840/4 2841/4 f 2843/4 2842/4 2841/4 f 2843/4 2841/4 2844/4 f 2845/4 2843/4 2844/4 f 2845/4 2844/4 2846/4 f 2847/4 2845/4 2846/4 f 2847/4 2846/4 2848/4 f 2849/4 2847/4 2848/4 f 2849/4 2848/4 2850/4 f 2851/4 2849/4 2850/4 f 2852/4 2851/4 2850/4 f 2852/4 2850/4 2853/4 f 2854/4 2852/4 2853/4 f 2854/4 2853/4 2855/4 f 2856/4 2854/4 2855/4 f 2856/4 2855/4 2857/4 f 2858/4 2856/4 2857/4 f 2859/4 2858/4 2857/4 f 2859/4 2857/4 2860/4 f 2861/4 2859/4 2860/4 f 2861/4 2860/4 2862/4 f 2863/4 2861/4 2862/4 f 2864/4 2863/4 2862/4 f 2864/4 2862/4 2865/4 f 2866/4 2864/4 2865/4 f 2866/4 2865/4 2867/4 f 2868/4 2869/4 2870/4 f 2871/4 2866/4 2867/4 f 2871/4 2867/4 2872/4 f 2873/4 2871/4 2872/4 f 2873/4 2872/4 2874/4 f 2875/4 2873/4 2874/4 f 2868/4 2870/4 2876/4 f 2875/4 2874/4 2877/4 f 2878/4 2875/4 2877/4 f 2878/4 2877/4 2879/4 f 2880/4 2878/4 2879/4 f 2868/4 2876/4 2881/4 f 2882/4 2868/4 2881/4 f 2883/4 2880/4 2879/4 f 2883/4 2879/4 2884/4 f 2885/4 2883/4 2884/4 f 2882/4 2881/4 2886/4 f 2887/4 2885/4 2884/4 f 2882/4 2886/4 2888/4 f 2889/4 2887/4 2884/4 f 2882/4 2888/4 2890/4 f 2891/4 2889/4 2884/4 f 2882/4 2890/4 2892/4 f 2892/4 2891/4 2884/4 f 2882/4 2892/4 2884/4 f 2882/4 2884/4 2893/4 f 2894/4 2882/4 2893/4 f 2894/4 2893/4 2895/4 f 2894/4 2895/4 2896/4 f 2897/4 2894/4 2896/4 f 2898/4 2894/4 2897/4 f 2897/4 2896/4 2899/4 f 2900/4 2897/4 2899/4 f 2898/4 2897/4 2901/4 f 2898/4 2901/4 2902/4 f 2900/4 2899/4 2903/4 f 2904/4 2898/4 2902/4 f 2900/4 2903/4 2905/4 f 2906/4 2900/4 2905/4 f 2906/4 2905/4 2907/4 f 2908/4 2906/4 2907/4 f 2908/4 2907/4 2909/4 f 2904/4 2902/4 2910/4 f 2911/4 2904/4 2910/4 f 2911/4 2910/4 2912/4 f 2913/4 2911/4 2912/4 f 2913/4 2912/4 2914/4 f 2915/4 2913/4 2914/4 f 2916/4 2917/4 2918/4 f 2915/4 2914/4 2919/4 f 2920/4 2915/4 2919/4 f 2920/4 2919/4 2921/4 f 2922/4 2920/4 2921/4 f 2916/4 2918/4 2923/4 f 2922/4 2921/4 2924/4 f 2925/4 2922/4 2924/4 f 2925/4 2924/4 2926/4 f 2916/4 2923/4 2927/4 f 2928/4 2925/4 2926/4 f 2928/4 2926/4 2929/4 f 2930/4 2928/4 2929/4 f 2930/4 2929/4 2931/4 f 2916/4 2927/4 2932/4 f 2933/4 2916/4 2932/4 f 2934/4 2930/4 2931/4 f 2935/4 2933/4 2932/4 f 2934/4 2931/4 2936/4 f 2937/4 2934/4 2936/4 f 2935/4 2932/4 2938/4 f 2939/4 2935/4 2938/4 f 2937/4 2936/4 2940/4 f 2941/4 2937/4 2940/4 f 2942/4 2939/4 2938/4 f 2942/4 2938/4 2943/4 f 2941/4 2940/4 2944/4 f 2945/4 2941/4 2944/4 f 2942/4 2943/4 2946/4 f 2945/4 2944/4 2947/4 f 2948/4 2942/4 2946/4 f 2949/4 2945/4 2947/4 f 2948/4 2946/4 2950/4 f 2951/4 2949/4 2947/4 f 2951/4 2947/4 2952/4 f 2948/4 2950/4 2953/4 f 2954/4 2951/4 2952/4 f 2955/4 2948/4 2953/4 f 2956/4 2954/4 2952/4 f 2956/4 2952/4 2957/4 f 2955/4 2953/4 2958/4 f 2959/4 2956/4 2957/4 f 2959/4 2957/4 2960/4 f 2961/4 2959/4 2960/4 f 2955/4 2958/4 2962/4 f 2963/4 2955/4 2962/4 f 2964/4 2961/4 2960/4 f 2964/4 2960/4 2965/4 f 2963/4 2962/4 2966/4 f 2967/4 2964/4 2965/4 f 2963/4 2966/4 2968/4 f 2969/4 2967/4 2965/4 f 2963/4 2968/4 2970/4 f 2971/4 2969/4 2965/4 f 2963/4 2970/4 2972/4 f 2972/4 2971/4 2965/4 f 2963/4 2972/4 2965/4 f 2963/4 2965/4 2973/4 f 2974/4 2963/4 2973/4 f 2974/4 2973/4 2975/4 f 2976/4 2974/4 2975/4 f 2976/4 2975/4 2977/4 f 2978/4 2976/4 2977/4 f 2978/4 2977/4 2979/4 f 2980/4 2978/4 2979/4 f 2980/4 2979/4 2981/4 f 2980/4 2981/4 2982/4 f 2983/4 2980/4 2982/4 f 2983/4 2982/4 2984/4 f 2985/4 2983/4 2984/4 f 2985/4 2984/4 2986/4 f 2985/4 2986/4 2987/4 f 2988/4 2985/4 2987/4 f 2989/4 2990/4 2991/4 f 2991/4 2990/4 2992/4 f 2989/4 2991/4 2993/4 f 2994/4 2991/4 2992/4 f 2995/4 2994/4 2992/4 f 2995/4 2992/4 2996/4 f 2997/4 2995/4 2996/4 f 2998/4 2997/4 2996/4 f 2998/4 2996/4 2999/4 f 3000/4 2998/4 2999/4 f 3000/4 2999/4 3001/4 f 3002/4 3000/4 3001/4 f 3002/4 3001/4 3003/4 f 3004/4 3002/4 3003/4 f 3004/4 3003/4 3005/4 f 3004/4 3005/4 3006/4 f 3007/4 3004/4 3006/4 f 3007/4 3006/4 3008/4 f 3009/4 3007/4 3008/4 f 3009/4 3008/4 3010/4 f 3011/4 3009/4 3010/4 f 3011/4 3010/4 3012/4 f 3013/4 3011/4 3012/4 f 3013/4 3012/4 3014/4 f 3013/4 3014/4 3015/4 f 3016/4 3013/4 3015/4 f 3016/4 3015/4 3017/4 f 3018/4 3019/4 3020/4 f 3016/4 3017/4 3021/4 f 3022/4 3016/4 3021/4 f 3022/4 3021/4 3023/4 f 3024/4 3018/4 3020/4 f 3025/4 3022/4 3023/4 f 3025/4 3023/4 3026/4 f 3025/4 3026/4 3027/4 f 3028/4 3025/4 3027/4 f 3029/4 3024/4 3020/4 f 3028/4 3027/4 3030/4 f 3031/4 3028/4 3030/4 f 3031/4 3030/4 3032/4 f 3029/4 3020/4 3033/4 f 3034/4 3029/4 3033/4 f 3034/4 3033/4 3035/4 f 3036/4 3031/4 3032/4 f 3036/4 3032/4 3037/4 f 3034/4 3035/4 3038/4 f 3039/4 3034/4 3038/4 f 3036/4 3037/4 3040/4 f 3041/4 3036/4 3040/4 f 3039/4 3038/4 3042/4 f 3043/4 3039/4 3042/4 f 3041/4 3040/4 3044/4 f 3045/4 3043/4 3042/4 f 3046/4 3041/4 3044/4 f 3046/4 3044/4 3047/4 f 3048/4 3045/4 3042/4 f 3048/4 3042/4 3049/4 f 3046/4 3047/4 3050/4 f 3051/4 3048/4 3049/4 f 3046/4 3050/4 3052/4 f 3053/4 3046/4 3052/4 f 3054/4 3051/4 3049/4 f 3053/4 3052/4 3055/4 f 3054/4 3049/4 3056/4 f 3053/4 3055/4 3057/4 f 3058/4 3054/4 3056/4 f 3053/4 3057/4 3059/4 f 3060/4 3058/4 3056/4 f 3053/4 3059/4 3061/4 f 3062/4 3060/4 3056/4 f 3053/4 3061/4 3063/4 f 3063/4 3062/4 3056/4 f 3053/4 3063/4 3056/4 f 3064/4 3053/4 3056/4 f 3064/4 3056/4 3065/4 f 3066/4 3064/4 3065/4 f 3067/4 3066/4 3065/4 f 3067/4 3065/4 3068/4 f 3069/4 3067/4 3068/4 f 3069/4 3068/4 3070/4 f 3071/4 3069/4 3070/4 f 3071/4 3070/4 3072/4 f 3073/4 3071/4 3072/4 f 3074/4 3073/4 3072/4 f 3074/4 3072/4 3075/4 f 3076/4 3074/4 3075/4 f 3076/4 3075/4 3077/4 f 3078/4 3076/4 3077/4 f 3079/4 3080/4 3081/4 f 3082/4 3079/4 3081/4 f 3083/4 3082/4 3081/4 f 3084/4 3083/4 3081/4 f 3085/4 3084/4 3081/4 f 3086/4 3085/4 3081/4 f 3087/4 3086/4 3088/4 f 3088/4 3086/4 3081/4 f 3087/4 3088/4 3089/4 f 3087/4 3089/4 3090/4 f 3087/4 3090/4 3091/4 f 3087/4 3091/4 3092/4 f 3093/4 3087/4 3092/4 f 3093/4 3092/4 3094/4 f 3093/4 3094/4 3095/4 f 3096/4 3093/4 3095/4 f 3096/4 3095/4 3097/4 f 3098/4 3096/4 3097/4 f 3098/4 3097/4 3099/4 f 3100/4 3098/4 3099/4 f 3100/4 3099/4 3101/4 f 3102/4 3100/4 3101/4 f 3102/4 3101/4 3103/4 f 3102/4 3103/4 3104/4 f 3105/4 3102/4 3104/4 f 3105/4 3104/4 3106/4 f 3107/4 3105/4 3106/4 f 3107/4 3106/4 3108/4 f 3109/4 3107/4 3108/4 f 3109/4 3108/4 3110/4 f 3109/4 3110/4 3111/4 f 3112/4 3109/4 3111/4 f 3112/4 3111/4 3113/4 f 3114/4 3112/4 3113/4 f 3114/4 3113/4 3115/4 f 3114/4 3115/4 3116/4 f 3117/4 3114/4 3116/4 f 3117/4 3116/4 3118/4 f 3119/4 3117/4 3118/4 f 3120/4 3121/4 3122/4 f 3119/4 3118/4 3123/4 f 3124/4 3119/4 3123/4 f 3124/4 3123/4 3125/4 f 3126/4 3124/4 3125/4 f 3126/4 3125/4 3127/4 f 3128/4 3120/4 3122/4 f 3129/4 3126/4 3127/4 f 3129/4 3127/4 3130/4 f 3131/4 3129/4 3130/4 f 3131/4 3130/4 3132/4 f 3133/4 3128/4 3122/4 f 3133/4 3122/4 3134/4 f 3131/4 3132/4 3135/4 f 3136/4 3131/4 3135/4 f 3136/4 3135/4 3137/4 f 3138/4 3133/4 3134/4 f 3136/4 3137/4 3139/4 f 3140/4 3138/4 3134/4 f 3136/4 3139/4 3141/4 f 3142/4 3140/4 3134/4 f 3136/4 3141/4 3143/4 f 3144/4 3142/4 3134/4 f 3136/4 3143/4 3144/4 f 3136/4 3144/4 3134/4 f 3145/4 3136/4 3134/4 f 3145/4 3134/4 3146/4 f 3147/4 3145/4 3146/4 f 3148/4 3147/4 3146/4 f 3148/4 3146/4 3149/4 f 3149/4 3146/4 3150/4 f 3151/4 3148/4 3149/4 f 3151/4 3149/4 3152/4 f 3153/4 3149/4 3150/4 f 3154/4 3153/4 3150/4 f 3155/4 3151/4 3152/4 f 3154/4 3150/4 3156/4 f 3157/4 3155/4 3152/4 f 3157/4 3152/4 3158/4 f 3159/4 3157/4 3158/4 f 3159/4 3158/4 3160/4 f 3161/4 3159/4 3160/4 f 3162/4 3154/4 3156/4 f 3162/4 3156/4 3163/4 f 3164/4 3162/4 3163/4 f 3164/4 3163/4 3165/4 f 3166/4 3164/4 3165/4 f 3166/4 3165/4 3167/4 f 3168/4 3169/4 3170/4 f 3171/4 3166/4 3167/4 f 3171/4 3167/4 3172/4 f 3173/4 3171/4 3172/4 f 3173/4 3172/4 3174/4 f 3175/4 3168/4 3170/4 f 3176/4 3173/4 3174/4 f 3176/4 3174/4 3177/4 f 3178/4 3176/4 3177/4 f 3179/4 3175/4 3170/4 f 3178/4 3177/4 3180/4 f 3181/4 3178/4 3180/4 f 3181/4 3180/4 3182/4 f 3183/4 3181/4 3182/4 f 3184/4 3179/4 3170/4 f 3184/4 3170/4 3185/4 f 3183/4 3182/4 3186/4 f 3184/4 3185/4 3187/4 f 3188/4 3183/4 3186/4 f 3188/4 3186/4 3189/4 f 3190/4 3184/4 3187/4 f 3190/4 3187/4 3191/4 f 3192/4 3188/4 3189/4 f 3192/4 3189/4 3193/4 f 3190/4 3191/4 3194/4 f 3195/4 3190/4 3194/4 f 3196/4 3192/4 3193/4 f 3196/4 3193/4 3197/4 f 3198/4 3195/4 3194/4 f 3199/4 3196/4 3197/4 f 3198/4 3194/4 3200/4 f 3199/4 3197/4 3201/4 f 3202/4 3198/4 3200/4 f 3199/4 3201/4 3203/4 f 3204/4 3199/4 3203/4 f 3205/4 3202/4 3200/4 f 3204/4 3203/4 3206/4 f 3205/4 3200/4 3207/4 f 3204/4 3206/4 3208/4 f 3209/4 3204/4 3208/4 f 3210/4 3205/4 3207/4 f 3209/4 3208/4 3211/4 f 3212/4 3209/4 3211/4 f 3212/4 3211/4 3213/4 f 3214/4 3210/4 3207/4 f 3214/4 3207/4 3215/4 f 3212/4 3213/4 3216/4 f 3217/4 3212/4 3216/4 f 3218/4 3214/4 3215/4 f 3217/4 3216/4 3219/4 f 3220/4 3218/4 3215/4 f 3217/4 3219/4 3221/4 f 3222/4 3220/4 3215/4 f 3217/4 3221/4 3223/4 f 3224/4 3222/4 3215/4 f 3217/4 3223/4 3224/4 f 3217/4 3224/4 3215/4 f 3225/4 3217/4 3215/4 f 3225/4 3215/4 3226/4 f 3227/4 3225/4 3226/4 f 3227/4 3226/4 3228/4 f 3229/4 3227/4 3228/4 f 3229/4 3228/4 3230/4 f 3231/4 3229/4 3230/4 f 3231/4 3230/4 3232/4 f 3233/4 3231/4 3232/4 f 3234/4 3233/4 3232/4 f 3234/4 3232/4 3235/4 f 3236/4 3234/4 3235/4 f 3236/4 3235/4 3237/4 f 3238/4 3236/4 3237/4 f 3239/4 3238/4 3237/4 f 3239/4 3237/4 3240/4 f 3241/4 3242/4 3243/4 f 3241/4 3243/4 3244/4 f 3245/4 3241/4 3244/4 f 3245/4 3244/4 3246/4 f 3247/4 3248/4 3249/4 f 3250/4 3247/4 3249/4 f 3250/4 3249/4 3251/4 f 3252/4 3250/4 3251/4 f 3252/4 3251/4 3253/4 f 3254/4 3252/4 3253/4 f 3254/4 3253/4 3255/4 f 3254/4 3255/4 3256/4 f 3257/4 3254/4 3256/4 f 3257/4 3256/4 3258/4 f 3259/4 3257/4 3258/4 f 3259/4 3258/4 3260/4 f 3261/4 3259/4 3260/4 f 3261/4 3260/4 3262/4 f 3261/4 3262/4 3263/4 f 3246/4 3261/4 3263/4 f 3246/4 3263/4 3264/4 f 3264/4 3263/4 3265/4 f 3265/4 3263/4 3266/4 f 3246/4 3264/4 3267/4 f 3268/4 3265/4 3266/4 f 3269/4 3268/4 3266/4 f 3246/4 3267/4 3270/4 f 3271/4 3269/4 3266/4 f 3246/4 3270/4 3272/4 f 3273/4 3271/4 3266/4 f 3273/4 3266/4 3274/4 f 3275/4 3273/4 3274/4 f 3246/4 3272/4 3276/4 f 3277/4 3275/4 3274/4 f 3245/4 3246/4 3278/4 f 3278/4 3246/4 3279/4 f 3279/4 3246/4 3280/4 f 3280/4 3246/4 3276/4 f 3281/4 3277/4 3274/4 f 3282/4 3281/4 3274/4 f 3282/4 3274/4 3283/4 f 3284/4 3282/4 3283/4 f 3285/4 3284/4 3283/4 f 3285/4 3283/4 3286/4 f 3287/4 3285/4 3286/4 f 3287/4 3286/4 3288/4 f 3289/4 3287/4 3288/4 f 3290/4 3289/4 3288/4 f 3290/4 3288/4 3291/4 f 3292/4 3290/4 3291/4 f 3292/4 3291/4 3293/4 f 3294/4 3292/4 3293/4 f 3294/4 3293/4 3295/4 f 3296/4 3294/4 3295/4 f 3297/4 3296/4 3295/4 f 3297/4 3295/4 3298/4 f 3299/4 3297/4 3298/4 f 3299/4 3298/4 3300/4 f 3301/4 3299/4 3300/4 f 3302/4 3301/4 3300/4 f 3302/4 3300/4 3303/4 f 3304/4 3302/4 3303/4 f 3304/4 3303/4 3305/4 f 3306/4 3304/4 3305/4 f 3307/4 3306/4 3305/4 f 3307/4 3305/4 3308/4 f 3309/4 3307/4 3308/4 f 3309/4 3308/4 3310/4 f 3311/4 3309/4 3310/4 f 3312/4 3311/4 3310/4 f 3312/4 3310/4 3313/4 f 3314/4 3312/4 3313/4 f 3314/4 3313/4 3315/4 f 3316/4 3314/4 3315/4 f 3317/4 3316/4 3315/4 f 3318/4 3317/4 3315/4 f 3318/4 3315/4 3319/4 f 3320/4 3318/4 3319/4 f 3321/4 3320/4 3319/4 f 3321/4 3319/4 3322/4 f 3323/4 3321/4 3322/4 f 3324/4 3323/4 3322/4 f 3325/4 3324/4 3322/4 f 3325/4 3322/4 3326/4 f 3325/4 3326/4 3327/4 f 3325/4 3327/4 3328/4 f 3325/4 3328/4 3329/4 f 3325/4 3329/4 3330/4 f 3331/4 3332/4 3333/4 f 3333/4 3332/4 3334/4 f 3331/4 3333/4 3335/4 f 3336/4 3333/4 3334/4 f 3334/4 3337/4 3338/4 f 3334/4 3338/4 3339/4 f 3336/4 3334/4 3339/4 f 3340/4 3336/4 3339/4 f 3341/4 3342/4 3343/4 f 3344/4 3341/4 3343/4 f 3344/4 3343/4 3345/4 f 3346/4 3344/4 3345/4 f 3347/4 3348/4 3349/4 f 3347/4 3349/4 3350/4 f 3351/4 3347/4 3350/4 f 3351/4 3350/4 3352/4 f 3353/4 3351/4 3352/4 f 3353/4 3352/4 3354/4 f 3355/4 3353/4 3354/4 f 3356/4 3355/4 3354/4 f 3356/4 3354/4 3357/4 f 3358/4 3356/4 3357/4 f 3358/4 3357/4 3359/4 f 3360/4 3358/4 3359/4 f 3360/4 3359/4 3361/4 f 3362/4 3360/4 3361/4 f 3363/4 3362/4 3361/4 f 3363/4 3361/4 3346/4 f 3364/4 3363/4 3346/4 f 3365/4 3363/4 3364/4 f 3366/4 3363/4 3365/4 f 3367/4 3364/4 3346/4 f 3366/4 3365/4 3368/4 f 3366/4 3368/4 3369/4 f 3370/4 3367/4 3346/4 f 3366/4 3369/4 3371/4 f 3372/4 3370/4 3346/4 f 3366/4 3371/4 3373/4 f 3374/4 3366/4 3373/4 f 3374/4 3373/4 3375/4 f 3376/4 3372/4 3346/4 f 3374/4 3375/4 3377/4 f 3378/4 3346/4 3345/4 f 3379/4 3346/4 3378/4 f 3380/4 3346/4 3379/4 f 3376/4 3346/4 3380/4 f 3374/4 3377/4 3381/4 f 3374/4 3381/4 3382/4 f 3383/4 3374/4 3382/4 f 3383/4 3382/4 3384/4 f 3383/4 3384/4 3385/4 f 3386/4 3383/4 3385/4 f 3386/4 3385/4 3387/4 f 3388/4 3386/4 3387/4 f 3388/4 3387/4 3389/4 f 3388/4 3389/4 3390/4 f 3391/4 3388/4 3390/4 f 3391/4 3390/4 3392/4 f 3393/4 3391/4 3392/4 f 3393/4 3392/4 3394/4 f 3395/4 3393/4 3394/4 f 3395/4 3394/4 3396/4 f 3395/4 3396/4 3397/4 f 3398/4 3395/4 3397/4 f 3398/4 3397/4 3399/4 f 3400/4 3398/4 3399/4 f 3400/4 3399/4 3401/4 f 3400/4 3401/4 3402/4 f 3403/4 3400/4 3402/4 f 3403/4 3402/4 3404/4 f 3405/4 3403/4 3404/4 f 3405/4 3404/4 3406/4 f 3405/4 3406/4 3407/4 f 3408/4 3405/4 3407/4 f 3408/4 3407/4 3409/4 f 3410/4 3408/4 3409/4 f 3410/4 3409/4 3411/4 f 3410/4 3411/4 3412/4 f 3413/4 3410/4 3412/4 f 3413/4 3412/4 3414/4 f 3415/4 3413/4 3414/4 f 3415/4 3414/4 3416/4 f 3415/4 3416/4 3417/4 f 3415/4 3417/4 3418/4 f 3419/4 3415/4 3418/4 f 3419/4 3418/4 3420/4 f 3419/4 3420/4 3421/4 f 3422/4 3419/4 3421/4 f 3422/4 3421/4 3423/4 f 3422/4 3423/4 3424/4 f 3422/4 3424/4 3425/4 f 3426/4 3422/4 3425/4 f 3427/4 3426/4 3425/4 f 3428/4 3427/4 3425/4 f 3429/4 3428/4 3425/4 f 3430/4 3429/4 3425/4 f 3431/4 3432/4 3433/4 f 3434/4 3432/4 3431/4 f 3435/4 3431/4 3433/4 f 3434/4 3431/4 3436/4 f 3437/4 3438/4 3434/4 f 3439/4 3437/4 3434/4 f 3439/4 3434/4 3436/4 f 3439/4 3436/4 3440/4 f 3441/4 3442/4 3443/4 f 3441/4 3443/4 3444/4 f 3445/4 3441/4 3444/4 f 3445/4 3444/4 3446/4 f 3447/4 3448/4 3449/4 f 3450/4 3447/4 3449/4 f 3450/4 3449/4 3451/4 f 3452/4 3450/4 3451/4 f 3452/4 3451/4 3453/4 f 3454/4 3452/4 3453/4 f 3454/4 3453/4 3455/4 f 3454/4 3455/4 3456/4 f 3457/4 3454/4 3456/4 f 3457/4 3456/4 3458/4 f 3459/4 3457/4 3458/4 f 3459/4 3458/4 3460/4 f 3461/4 3459/4 3460/4 f 3461/4 3460/4 3462/4 f 3461/4 3462/4 3463/4 f 3446/4 3461/4 3463/4 f 3446/4 3463/4 3464/4 f 3464/4 3463/4 3465/4 f 3465/4 3463/4 3466/4 f 3446/4 3464/4 3467/4 f 3468/4 3465/4 3466/4 f 3469/4 3468/4 3466/4 f 3446/4 3467/4 3470/4 f 3471/4 3469/4 3466/4 f 3446/4 3470/4 3472/4 f 3473/4 3471/4 3466/4 f 3473/4 3466/4 3474/4 f 3475/4 3473/4 3474/4 f 3446/4 3472/4 3476/4 f 3477/4 3475/4 3474/4 f 3445/4 3446/4 3478/4 f 3478/4 3446/4 3479/4 f 3479/4 3446/4 3480/4 f 3480/4 3446/4 3476/4 f 3481/4 3477/4 3474/4 f 3482/4 3481/4 3474/4 f 3482/4 3474/4 3483/4 f 3484/4 3482/4 3483/4 f 3485/4 3484/4 3483/4 f 3485/4 3483/4 3486/4 f 3487/4 3485/4 3486/4 f 3487/4 3486/4 3488/4 f 3489/4 3487/4 3488/4 f 3490/4 3489/4 3488/4 f 3490/4 3488/4 3491/4 f 3492/4 3490/4 3491/4 f 3492/4 3491/4 3493/4 f 3494/4 3492/4 3493/4 f 3494/4 3493/4 3495/4 f 3496/4 3494/4 3495/4 f 3497/4 3496/4 3495/4 f 3497/4 3495/4 3498/4 f 3499/4 3497/4 3498/4 f 3499/4 3498/4 3500/4 f 3501/4 3499/4 3500/4 f 3502/4 3501/4 3500/4 f 3502/4 3500/4 3503/4 f 3504/4 3502/4 3503/4 f 3504/4 3503/4 3505/4 f 3506/4 3504/4 3505/4 f 3507/4 3506/4 3505/4 f 3507/4 3505/4 3508/4 f 3509/4 3507/4 3508/4 f 3509/4 3508/4 3510/4 f 3511/4 3509/4 3510/4 f 3512/4 3511/4 3510/4 f 3512/4 3510/4 3513/4 f 3514/4 3512/4 3513/4 f 3514/4 3513/4 3515/4 f 3516/4 3514/4 3515/4 f 3517/4 3516/4 3515/4 f 3518/4 3517/4 3515/4 f 3518/4 3515/4 3519/4 f 3520/4 3518/4 3519/4 f 3521/4 3520/4 3519/4 f 3521/4 3519/4 3522/4 f 3523/4 3521/4 3522/4 f 3524/4 3523/4 3522/4 f 3525/4 3524/4 3522/4 f 3525/4 3522/4 3526/4 f 3525/4 3526/4 3527/4 f 3525/4 3527/4 3528/4 f 3525/4 3528/4 3529/4 f 3525/4 3529/4 3530/4 f 3531/4 3532/4 3533/4 f 3534/4 3531/4 3533/4 f 3534/4 3533/4 3535/4 f 3536/4 3534/4 3535/4 f 3536/4 3535/4 3537/4 f 3538/4 3536/4 3537/4 f 3538/4 3537/4 3539/4 f 3540/4 3538/4 3539/4 f 3540/4 3539/4 3541/4 f 3540/4 3541/4 3542/4 f 3543/4 3540/4 3542/4 f 3543/4 3542/4 3544/4 f 3545/4 3543/4 3544/4 f 3545/4 3544/4 3546/4 f 3547/4 3545/4 3546/4 f 3547/4 3546/4 3548/4 f 3547/4 3548/4 3549/4 f 3550/4 3547/4 3551/4 f 3551/4 3547/4 3552/4 f 3552/4 3547/4 3549/4 f 3553/4 3552/4 3549/4 f 3550/4 3551/4 3554/4 f 3555/4 3553/4 3549/4 f 3550/4 3554/4 3556/4 f 3557/4 3555/4 3549/4 f 3557/4 3549/4 3558/4 f 3550/4 3556/4 3559/4 f 3560/4 3557/4 3558/4 f 3550/4 3559/4 3561/4 f 3562/4 3560/4 3558/4 f 3563/4 3562/4 3558/4 f 3550/4 3561/4 3564/4 f 3565/4 3550/4 3564/4 f 3566/4 3563/4 3558/4 f 3565/4 3564/4 3567/4 f 3566/4 3558/4 3568/4 f 3569/4 3566/4 3568/4 f 3565/4 3567/4 3570/4 f 3571/4 3569/4 3568/4 f 3565/4 3570/4 3572/4 f 3573/4 3565/4 3572/4 f 3571/4 3568/4 3574/4 f 3575/4 3571/4 3574/4 f 3573/4 3572/4 3576/4 f 3577/4 3575/4 3574/4 f 3578/4 3573/4 3576/4 f 3577/4 3574/4 3579/4 f 3578/4 3576/4 3580/4 f 3581/4 3577/4 3579/4 f 3582/4 3581/4 3579/4 f 3578/4 3580/4 3583/4 f 3584/4 3578/4 3583/4 f 3582/4 3579/4 3585/4 f 3586/4 3582/4 3585/4 f 3584/4 3583/4 3587/4 f 3588/4 3586/4 3585/4 f 3588/4 3585/4 3589/4 f 3590/4 3584/4 3587/4 f 3590/4 3587/4 3591/4 f 3592/4 3588/4 3589/4 f 3592/4 3589/4 3593/4 f 3594/4 3590/4 3595/4 f 3595/4 3590/4 3591/4 f 3596/4 3592/4 3593/4 f 3597/4 3596/4 3593/4 f 3597/4 3593/4 3598/4 f 3599/4 3597/4 3598/4 f 3600/4 3599/4 3598/4 f 3600/4 3598/4 3601/4 f 3602/4 3600/4 3601/4 f 3602/4 3601/4 3603/4 f 3604/4 3605/4 3606/4 f 3604/4 3606/4 3607/4 f 3602/4 3603/4 3604/4 f 3602/4 3604/4 3607/4 f 3608/4 3609/4 3610/4 f 3611/4 3608/4 3610/4 f 3611/4 3610/4 3612/4 f 3613/4 3611/4 3612/4 f 3614/4 3615/4 3616/4 f 3614/4 3616/4 3617/4 f 3618/4 3614/4 3617/4 f 3618/4 3617/4 3619/4 f 3620/4 3618/4 3619/4 f 3620/4 3619/4 3621/4 f 3622/4 3620/4 3621/4 f 3623/4 3622/4 3621/4 f 3623/4 3621/4 3624/4 f 3625/4 3623/4 3624/4 f 3625/4 3624/4 3626/4 f 3627/4 3625/4 3626/4 f 3627/4 3626/4 3628/4 f 3629/4 3627/4 3628/4 f 3630/4 3629/4 3628/4 f 3630/4 3628/4 3613/4 f 3631/4 3630/4 3613/4 f 3632/4 3630/4 3631/4 f 3633/4 3630/4 3632/4 f 3634/4 3631/4 3613/4 f 3633/4 3632/4 3635/4 f 3633/4 3635/4 3636/4 f 3637/4 3634/4 3613/4 f 3633/4 3636/4 3638/4 f 3639/4 3637/4 3613/4 f 3633/4 3638/4 3640/4 f 3641/4 3633/4 3640/4 f 3641/4 3640/4 3642/4 f 3643/4 3639/4 3613/4 f 3641/4 3642/4 3644/4 f 3645/4 3613/4 3612/4 f 3646/4 3613/4 3645/4 f 3647/4 3613/4 3646/4 f 3643/4 3613/4 3647/4 f 3641/4 3644/4 3648/4 f 3641/4 3648/4 3649/4 f 3650/4 3641/4 3649/4 f 3650/4 3649/4 3651/4 f 3650/4 3651/4 3652/4 f 3653/4 3650/4 3652/4 f 3653/4 3652/4 3654/4 f 3655/4 3653/4 3654/4 f 3655/4 3654/4 3656/4 f 3655/4 3656/4 3657/4 f 3658/4 3655/4 3657/4 f 3658/4 3657/4 3659/4 f 3660/4 3658/4 3659/4 f 3660/4 3659/4 3661/4 f 3662/4 3660/4 3661/4 f 3662/4 3661/4 3663/4 f 3662/4 3663/4 3664/4 f 3665/4 3662/4 3664/4 f 3665/4 3664/4 3666/4 f 3667/4 3665/4 3666/4 f 3667/4 3666/4 3668/4 f 3667/4 3668/4 3669/4 f 3670/4 3667/4 3669/4 f 3670/4 3669/4 3671/4 f 3672/4 3670/4 3671/4 f 3672/4 3671/4 3673/4 f 3672/4 3673/4 3674/4 f 3675/4 3672/4 3674/4 f 3675/4 3674/4 3676/4 f 3677/4 3675/4 3676/4 f 3677/4 3676/4 3678/4 f 3677/4 3678/4 3679/4 f 3680/4 3677/4 3679/4 f 3680/4 3679/4 3681/4 f 3682/4 3680/4 3681/4 f 3682/4 3681/4 3683/4 f 3682/4 3683/4 3684/4 f 3682/4 3684/4 3685/4 f 3686/4 3682/4 3685/4 f 3686/4 3685/4 3687/4 f 3686/4 3687/4 3688/4 f 3689/4 3686/4 3688/4 f 3689/4 3688/4 3690/4 f 3689/4 3690/4 3691/4 f 3689/4 3691/4 3692/4 f 3693/4 3689/4 3692/4 f 3694/4 3693/4 3692/4 f 3695/4 3694/4 3692/4 f 3696/4 3695/4 3692/4 f 3697/4 3696/4 3692/4 f 3698/4 3699/4 3700/4 f 3698/4 3700/4 3701/4 f 3702/4 3698/4 3701/4 f 3702/4 3701/4 3703/4 f 3704/4 3702/4 3703/4 f 3704/4 3703/4 3705/4 f 3706/4 3704/4 3705/4 f 3706/4 3705/4 3707/4 f 3708/4 3706/4 3707/4 f 3709/4 3708/4 3707/4 f 3709/4 3707/4 3710/4 f 3711/4 3709/4 3710/4 f 3711/4 3710/4 3712/4 f 3713/4 3711/4 3712/4 f 3713/4 3712/4 3714/4 f 3715/4 3713/4 3714/4 f 3716/4 3715/4 3714/4 f 3717/4 3714/4 3718/4 f 3719/4 3714/4 3717/4 f 3716/4 3714/4 3719/4 f 3716/4 3719/4 3720/4 f 3721/4 3717/4 3718/4 f 3716/4 3720/4 3722/4 f 3723/4 3721/4 3718/4 f 3716/4 3722/4 3724/4 f 3725/4 3716/4 3724/4 f 3726/4 3723/4 3718/4 f 3725/4 3724/4 3727/4 f 3728/4 3726/4 3718/4 f 3725/4 3727/4 3729/4 f 3725/4 3729/4 3730/4 f 3731/4 3728/4 3718/4 f 3731/4 3718/4 3732/4 f 3725/4 3730/4 3733/4 f 3734/4 3731/4 3732/4 f 3735/4 3725/4 3733/4 f 3735/4 3733/4 3736/4 f 3737/4 3734/4 3732/4 f 3735/4 3736/4 3738/4 f 3739/4 3737/4 3732/4 f 3739/4 3732/4 3740/4 f 3741/4 3735/4 3738/4 f 3741/4 3738/4 3742/4 f 3743/4 3739/4 3740/4 f 3741/4 3742/4 3744/4 f 3743/4 3740/4 3745/4 f 3746/4 3741/4 3744/4 f 3747/4 3743/4 3745/4 f 3746/4 3744/4 3748/4 f 3746/4 3748/4 3749/4 f 3750/4 3747/4 3745/4 f 3750/4 3745/4 3751/4 f 3752/4 3746/4 3749/4 f 3752/4 3749/4 3753/4 f 3754/4 3750/4 3751/4 f 3752/4 3753/4 3755/4 f 3756/4 3752/4 3755/4 f 3754/4 3751/4 3757/4 f 3758/4 3754/4 3757/4 f 3756/4 3755/4 3759/4 f 3760/4 3756/4 3759/4 f 3761/4 3757/4 3762/4 f 3758/4 3757/4 3761/4 f 3760/4 3759/4 3763/4 f 3760/4 3763/4 3764/4 f 3765/4 3760/4 3764/4 f 3765/4 3764/4 3766/4 f 3765/4 3766/4 3767/4 f 3768/4 3765/4 3767/4 f 3768/4 3767/4 3769/4 f 3770/4 3768/4 3769/4 f 3771/4 3772/4 3773/4 f 3774/4 3771/4 3773/4 f 3773/4 3770/4 3769/4 f 3774/4 3773/4 3769/4 f 3775/4 3776/4 3777/4 f 3775/4 3777/4 3778/4 f 3779/4 3775/4 3778/4 f 3779/4 3778/4 3780/4 f 3781/4 3782/4 3783/4 f 3784/4 3781/4 3783/4 f 3784/4 3783/4 3785/4 f 3786/4 3784/4 3785/4 f 3786/4 3785/4 3787/4 f 3788/4 3786/4 3787/4 f 3788/4 3787/4 3789/4 f 3788/4 3789/4 3790/4 f 3791/4 3788/4 3790/4 f 3791/4 3790/4 3792/4 f 3793/4 3791/4 3792/4 f 3793/4 3792/4 3794/4 f 3795/4 3793/4 3794/4 f 3795/4 3794/4 3796/4 f 3795/4 3796/4 3797/4 f 3780/4 3795/4 3797/4 f 3780/4 3797/4 3798/4 f 3798/4 3797/4 3799/4 f 3799/4 3797/4 3800/4 f 3780/4 3798/4 3801/4 f 3802/4 3799/4 3800/4 f 3803/4 3802/4 3800/4 f 3780/4 3801/4 3804/4 f 3805/4 3803/4 3800/4 f 3780/4 3804/4 3806/4 f 3807/4 3805/4 3800/4 f 3807/4 3800/4 3808/4 f 3809/4 3807/4 3808/4 f 3780/4 3806/4 3810/4 f 3811/4 3809/4 3808/4 f 3779/4 3780/4 3812/4 f 3812/4 3780/4 3813/4 f 3813/4 3780/4 3814/4 f 3814/4 3780/4 3810/4 f 3815/4 3811/4 3808/4 f 3816/4 3815/4 3808/4 f 3816/4 3808/4 3817/4 f 3818/4 3816/4 3817/4 f 3819/4 3818/4 3817/4 f 3819/4 3817/4 3820/4 f 3821/4 3819/4 3820/4 f 3821/4 3820/4 3822/4 f 3823/4 3821/4 3822/4 f 3824/4 3823/4 3822/4 f 3824/4 3822/4 3825/4 f 3826/4 3824/4 3825/4 f 3826/4 3825/4 3827/4 f 3828/4 3826/4 3827/4 f 3828/4 3827/4 3829/4 f 3830/4 3828/4 3829/4 f 3831/4 3830/4 3829/4 f 3831/4 3829/4 3832/4 f 3833/4 3831/4 3832/4 f 3833/4 3832/4 3834/4 f 3835/4 3833/4 3834/4 f 3836/4 3835/4 3834/4 f 3836/4 3834/4 3837/4 f 3838/4 3836/4 3837/4 f 3838/4 3837/4 3839/4 f 3840/4 3838/4 3839/4 f 3841/4 3840/4 3839/4 f 3841/4 3839/4 3842/4 f 3843/4 3841/4 3842/4 f 3843/4 3842/4 3844/4 f 3845/4 3843/4 3844/4 f 3846/4 3845/4 3844/4 f 3846/4 3844/4 3847/4 f 3848/4 3846/4 3847/4 f 3848/4 3847/4 3849/4 f 3850/4 3848/4 3849/4 f 3851/4 3850/4 3849/4 f 3852/4 3851/4 3849/4 f 3852/4 3849/4 3853/4 f 3854/4 3852/4 3853/4 f 3855/4 3854/4 3853/4 f 3855/4 3853/4 3856/4 f 3857/4 3855/4 3856/4 f 3858/4 3857/4 3856/4 f 3859/4 3858/4 3856/4 f 3859/4 3856/4 3860/4 f 3859/4 3860/4 3861/4 f 3859/4 3861/4 3862/4 f 3859/4 3862/4 3863/4 f 3859/4 3863/4 3864/4 f 3865/4 3866/4 3867/4 f 3868/4 3865/4 3867/4 f 3868/4 3867/4 3869/4 f 3870/4 3868/4 3869/4 f 3870/4 3869/4 3871/4 f 3872/4 3870/4 3871/4 f 3872/4 3871/4 3873/4 f 3872/4 3873/4 3874/4 f 3875/4 3872/4 3874/4 f 3875/4 3874/4 3876/4 f 3877/4 3875/4 3876/4 f 3877/4 3876/4 3878/4 f 3877/4 3878/4 3879/4 f 3880/4 3877/4 3879/4 f 3880/4 3879/4 3881/4 f 3882/4 3880/4 3881/4 f 3882/4 3881/4 3883/4 f 3882/4 3883/4 3884/4 f 3885/4 3882/4 3886/4 f 3886/4 3882/4 3887/4 f 3887/4 3882/4 3884/4 f 3885/4 3886/4 3888/4 f 3889/4 3887/4 3884/4 f 3885/4 3888/4 3890/4 f 3891/4 3889/4 3884/4 f 3885/4 3890/4 3892/4 f 3893/4 3891/4 3884/4 f 3894/4 3885/4 3892/4 f 3894/4 3892/4 3895/4 f 3896/4 3893/4 3884/4 f 3896/4 3884/4 3897/4 f 3898/4 3896/4 3897/4 f 3894/4 3895/4 3899/4 f 3900/4 3898/4 3897/4 f 3894/4 3899/4 3901/4 f 3902/4 3900/4 3897/4 f 3902/4 3897/4 3903/4 f 3904/4 3894/4 3901/4 f 3904/4 3901/4 3905/4 f 3906/4 3902/4 3903/4 f 3906/4 3903/4 3907/4 f 3904/4 3905/4 3908/4 f 3909/4 3904/4 3908/4 f 3910/4 3906/4 3907/4 f 3909/4 3908/4 3911/4 f 3910/4 3907/4 3912/4 f 3913/4 3910/4 3912/4 f 3914/4 3909/4 3911/4 f 3915/4 3913/4 3912/4 f 3914/4 3911/4 3916/4 f 3915/4 3912/4 3917/4 f 3918/4 3915/4 3917/4 f 3918/4 3917/4 3919/4 f 3920/4 3914/4 3921/4 f 3921/4 3914/4 3922/4 f 3922/4 3914/4 3916/4 f 3923/4 3918/4 3919/4 f 3923/4 3919/4 3924/4 f 3925/4 3923/4 3924/4 f 3925/4 3924/4 3926/4 f 3927/4 3925/4 3926/4 f 3928/4 3927/4 3926/4 f 3928/4 3926/4 3929/4 f 3930/4 3928/4 3929/4 f 3930/4 3929/4 3931/4 f 3932/4 3930/4 3931/4 f 3933/4 3932/4 3931/4 f 3933/4 3931/4 3934/4 f 3935/4 3933/4 3934/4 f 3936/4 3937/4 3938/4 f 3939/4 3936/4 3938/4 f 3939/4 3938/4 3940/4 f 3941/4 3939/4 3940/4 f 3941/4 3940/4 3942/4 f 3941/4 3942/4 3943/4 f 3944/4 3941/4 3943/4 f 3935/4 3934/4 3945/4 f 3944/4 3943/4 3946/4 f 3947/4 3944/4 3946/4 f 3948/4 3935/4 3945/4 f 3947/4 3946/4 3949/4 f 3950/4 3947/4 3949/4 f 3950/4 3949/4 3951/4 f 3952/4 3948/4 3945/4 f 3952/4 3945/4 3950/4 f 3952/4 3950/4 3951/4 f 3952/4 3951/4 3953/4 f 3952/4 3953/4 3954/4 f 3955/4 3952/4 3954/4 f 3955/4 3954/4 3956/4 f 3955/4 3956/4 3957/4 f 3957/4 3956/4 3958/4 f 3957/4 3958/4 3959/4 f 3959/4 3958/4 3960/4 f 3955/4 3957/4 3961/4 f 3955/4 3961/4 3962/4 f 3963/4 3959/4 3960/4 f 3955/4 3962/4 3964/4 f 3965/4 3963/4 3960/4 f 3966/4 3955/4 3964/4 f 3966/4 3964/4 3967/4 f 3968/4 3965/4 3960/4 f 3966/4 3967/4 3969/4 f 3970/4 3968/4 3960/4 f 3970/4 3960/4 3971/4 f 3972/4 3970/4 3971/4 f 3966/4 3969/4 3973/4 f 3974/4 3972/4 3971/4 f 3974/4 3971/4 3975/4 f 3966/4 3973/4 3976/4 f 3977/4 3966/4 3976/4 f 3978/4 3974/4 3975/4 f 3979/4 3978/4 3975/4 f 3979/4 3975/4 3980/4 f 3981/4 3979/4 3980/4 f 3982/4 3981/4 3980/4 f 3982/4 3980/4 3983/4 f 3984/4 3982/4 3983/4 f 3984/4 3983/4 3985/4 f 3986/4 3984/4 3985/4 f 3987/4 3986/4 3985/4 f 3987/4 3985/4 3988/4 f 3989/4 3987/4 3988/4 f 3989/4 3988/4 3990/4 f 3991/4 3989/4 3990/4 f 3992/4 3991/4 3990/4 f 3992/4 3990/4 3993/4 f 3994/4 3992/4 3993/4 f 3994/4 3993/4 3995/4 f 3996/4 3994/4 3995/4 f 3996/4 3995/4 3997/4 f 3998/4 3996/4 3997/4 f 3999/4 3998/4 3997/4 f 3999/4 3997/4 4000/4 f 4001/4 3999/4 4000/4 f 4002/4 4001/4 4000/4 f 4002/4 4000/4 4003/4 f 4004/4 4002/4 4003/4 f 4004/4 4003/4 4005/4 f 4006/4 4004/4 4005/4 f 4006/4 4005/4 4007/4 f 4008/4 4006/4 4007/4 f 4009/4 4008/4 4007/4 f 4009/4 4007/4 4010/4 f 4011/4 4009/4 4010/4 f 4012/4 4011/4 4010/4 f 4012/4 4010/4 4013/4 f 4014/4 4012/4 4013/4 f 4015/4 4014/4 4013/4 f 4015/4 4013/4 4016/4 f 4017/4 4015/4 4016/4 f 4018/4 4017/4 4016/4 f 4019/4 4018/4 4016/4 f 4020/4 4019/4 4016/4 f 4020/4 4016/4 4021/4 f 4020/4 4021/4 4022/4 f 4020/4 4022/4 4023/4 f 4020/4 4023/4 4024/4 f 4020/4 4024/4 4025/4 f 4020/4 4025/4 4026/4 f 4027/4 4028/4 4029/4 f 4030/4 4027/4 4029/4 f 4030/4 4029/4 4031/4 f 4032/4 4030/4 4031/4 f 4033/4 4034/4 4035/4 f 4033/4 4035/4 4036/4 f 4037/4 4033/4 4036/4 f 4037/4 4036/4 4038/4 f 4039/4 4037/4 4038/4 f 4039/4 4038/4 4040/4 f 4041/4 4039/4 4040/4 f 4042/4 4041/4 4040/4 f 4042/4 4040/4 4043/4 f 4044/4 4042/4 4043/4 f 4044/4 4043/4 4045/4 f 4046/4 4044/4 4045/4 f 4046/4 4045/4 4047/4 f 4048/4 4046/4 4047/4 f 4049/4 4048/4 4047/4 f 4049/4 4047/4 4032/4 f 4050/4 4049/4 4032/4 f 4051/4 4049/4 4050/4 f 4052/4 4049/4 4051/4 f 4053/4 4050/4 4032/4 f 4052/4 4051/4 4054/4 f 4052/4 4054/4 4055/4 f 4056/4 4053/4 4032/4 f 4052/4 4055/4 4057/4 f 4058/4 4056/4 4032/4 f 4052/4 4057/4 4059/4 f 4060/4 4052/4 4059/4 f 4060/4 4059/4 4061/4 f 4062/4 4058/4 4032/4 f 4060/4 4061/4 4063/4 f 4064/4 4032/4 4031/4 f 4065/4 4032/4 4064/4 f 4066/4 4032/4 4065/4 f 4062/4 4032/4 4066/4 f 4060/4 4063/4 4067/4 f 4060/4 4067/4 4068/4 f 4069/4 4060/4 4068/4 f 4069/4 4068/4 4070/4 f 4069/4 4070/4 4071/4 f 4072/4 4069/4 4071/4 f 4072/4 4071/4 4073/4 f 4074/4 4072/4 4073/4 f 4074/4 4073/4 4075/4 f 4074/4 4075/4 4076/4 f 4077/4 4074/4 4076/4 f 4077/4 4076/4 4078/4 f 4079/4 4077/4 4078/4 f 4079/4 4078/4 4080/4 f 4081/4 4079/4 4080/4 f 4081/4 4080/4 4082/4 f 4081/4 4082/4 4083/4 f 4084/4 4081/4 4083/4 f 4084/4 4083/4 4085/4 f 4086/4 4084/4 4085/4 f 4086/4 4085/4 4087/4 f 4086/4 4087/4 4088/4 f 4089/4 4086/4 4088/4 f 4089/4 4088/4 4090/4 f 4091/4 4089/4 4090/4 f 4091/4 4090/4 4092/4 f 4091/4 4092/4 4093/4 f 4094/4 4091/4 4093/4 f 4094/4 4093/4 4095/4 f 4096/4 4094/4 4095/4 f 4096/4 4095/4 4097/4 f 4096/4 4097/4 4098/4 f 4099/4 4096/4 4098/4 f 4099/4 4098/4 4100/4 f 4101/4 4099/4 4100/4 f 4101/4 4100/4 4102/4 f 4101/4 4102/4 4103/4 f 4101/4 4103/4 4104/4 f 4105/4 4101/4 4104/4 f 4105/4 4104/4 4106/4 f 4105/4 4106/4 4107/4 f 4108/4 4105/4 4107/4 f 4108/4 4107/4 4109/4 f 4108/4 4109/4 4110/4 f 4108/4 4110/4 4111/4 f 4112/4 4108/4 4111/4 f 4113/4 4112/4 4111/4 f 4114/4 4113/4 4111/4 f 4115/4 4114/4 4111/4 f 4116/4 4115/4 4111/4 f 4117/4 4118/4 4119/4 f 4117/4 4119/4 4120/4 f 4121/4 4117/4 4120/4 f 4121/4 4120/4 4122/4 f 4123/4 4121/4 4122/4 f 4123/4 4122/4 4124/4 f 4125/4 4123/4 4124/4 f 4126/4 4125/4 4124/4 f 4126/4 4124/4 4127/4 f 4128/4 4126/4 4127/4 f 4128/4 4127/4 4129/4 f 4130/4 4128/4 4129/4 f 4131/4 4130/4 4129/4 f 4131/4 4129/4 4132/4 f 4133/4 4131/4 4132/4 f 4133/4 4132/4 4134/4 f 4135/4 4133/4 4134/4 f 4136/4 4135/4 4134/4 f 4137/4 4134/4 4138/4 f 4139/4 4134/4 4137/4 f 4136/4 4134/4 4139/4 f 4140/4 4137/4 4138/4 f 4136/4 4139/4 4141/4 f 4142/4 4140/4 4138/4 f 4136/4 4141/4 4143/4 f 4144/4 4142/4 4138/4 f 4136/4 4143/4 4145/4 f 4144/4 4138/4 4146/4 f 4147/4 4144/4 4146/4 f 4136/4 4145/4 4148/4 f 4149/4 4136/4 4148/4 f 4149/4 4148/4 4150/4 f 4151/4 4147/4 4146/4 f 4149/4 4150/4 4152/4 f 4153/4 4151/4 4146/4 f 4149/4 4152/4 4154/4 f 4155/4 4149/4 4154/4 f 4153/4 4146/4 4156/4 f 4157/4 4153/4 4156/4 f 4155/4 4154/4 4158/4 f 4159/4 4155/4 4158/4 f 4160/4 4157/4 4156/4 f 4160/4 4156/4 4161/4 f 4159/4 4158/4 4162/4 f 4163/4 4160/4 4161/4 f 4164/4 4159/4 4162/4 f 4164/4 4162/4 4165/4 f 4163/4 4161/4 4166/4 f 4164/4 4165/4 4167/4 f 4168/4 4163/4 4166/4 f 4169/4 4164/4 4167/4 f 4169/4 4167/4 4170/4 f 4171/4 4169/4 4170/4 f 4172/4 4166/4 4173/4 f 4174/4 4166/4 4172/4 f 4168/4 4166/4 4174/4 f 4171/4 4170/4 4175/4 f 4176/4 4171/4 4175/4 f 4176/4 4175/4 4177/4 f 4178/4 4176/4 4177/4 f 4178/4 4177/4 4179/4 f 4178/4 4179/4 4180/4 f 4181/4 4178/4 4180/4 f 4181/4 4180/4 4182/4 f 4183/4 4181/4 4182/4 f 4183/4 4182/4 4184/4 f 4183/4 4184/4 4185/4 f 4186/4 4183/4 4185/4 f 4186/4 4185/4 4187/4 f 4188/4 4189/4 4190/4 f 4188/4 4190/4 4191/4 f 4192/4 4188/4 4191/4 f 4192/4 4191/4 4193/4 f 4194/4 4192/4 4193/4 f 4195/4 4194/4 4193/4 f 4195/4 4193/4 4196/4 f 4197/4 4186/4 4187/4 f 4198/4 4195/4 4196/4 f 4198/4 4196/4 4199/4 f 4197/4 4187/4 4200/4 f 4201/4 4198/4 4199/4 f 4201/4 4199/4 4202/4 f 4203/4 4201/4 4202/4 f 4197/4 4200/4 4204/4 f 4202/4 4197/4 4204/4 f 4203/4 4202/4 4204/4 f 4205/4 4203/4 4204/4 f 4206/4 4205/4 4204/4 f 4206/4 4204/4 4207/4 f 4208/4 4206/4 4207/4 f 4209/4 4208/4 4207/4 f 4210/4 4208/4 4209/4 f 4211/4 4210/4 4209/4 f 4212/4 4210/4 4211/4 f 4213/4 4209/4 4207/4 f 4214/4 4213/4 4207/4 f 4212/4 4211/4 4215/4 f 4216/4 4214/4 4207/4 f 4212/4 4215/4 4217/4 f 4216/4 4207/4 4218/4 f 4219/4 4216/4 4218/4 f 4212/4 4217/4 4220/4 f 4221/4 4219/4 4218/4 f 4212/4 4220/4 4222/4 f 4223/4 4212/4 4222/4 f 4223/4 4222/4 4224/4 f 4225/4 4221/4 4218/4 f 4223/4 4224/4 4226/4 f 4227/4 4223/4 4226/4 f 4228/4 4225/4 4218/4 f 4228/4 4218/4 4229/4 f 4227/4 4226/4 4230/4 f 4227/4 4230/4 4231/4 f 4232/4 4227/4 4231/4 f 4232/4 4231/4 4233/4 f 4232/4 4233/4 4234/4 f 4235/4 4232/4 4234/4 f 4235/4 4234/4 4236/4 f 4237/4 4235/4 4236/4 f 4237/4 4236/4 4238/4 f 4237/4 4238/4 4239/4 f 4240/4 4237/4 4239/4 f 4240/4 4239/4 4241/4 f 4242/4 4240/4 4241/4 f 4242/4 4241/4 4243/4 f 4242/4 4243/4 4244/4 f 4245/4 4242/4 4244/4 f 4245/4 4244/4 4246/4 f 4247/4 4245/4 4246/4 f 4247/4 4246/4 4248/4 f 4249/4 4247/4 4248/4 f 4249/4 4248/4 4250/4 f 4249/4 4250/4 4251/4 f 4252/4 4249/4 4251/4 f 4252/4 4251/4 4253/4 f 4252/4 4253/4 4254/4 f 4255/4 4252/4 4254/4 f 4255/4 4254/4 4256/4 f 4257/4 4255/4 4256/4 f 4257/4 4256/4 4258/4 f 4259/4 4257/4 4258/4 f 4259/4 4258/4 4260/4 f 4259/4 4260/4 4261/4 f 4262/4 4259/4 4261/4 f 4262/4 4261/4 4263/4 f 4262/4 4263/4 4264/4 f 4265/4 4262/4 4264/4 f 4265/4 4264/4 4266/4 f 4265/4 4266/4 4267/4 f 4268/4 4265/4 4267/4 f 4268/4 4267/4 4269/4 f 4268/4 4269/4 4270/4 f 4268/4 4270/4 4271/4 f 4268/4 4271/4 4272/4 f 4273/4 4268/4 4272/4 f 4274/4 4273/4 4272/4 f 4275/4 4274/4 4272/4 f 4276/4 4275/4 4272/4 f 4277/4 4276/4 4272/4 f 4278/4 4277/4 4272/4 opensurgsim-0.7.0/Examples/Stapling/Data/Geometry/stapler_trigger.mtl000066400000000000000000000003061277777236100260310ustar00rootroot00000000000000# Blender MTL File: 'None' # Material Count: 1 newmtl _Mat.003 Ns 45.098039 Ka 0.000000 0.000000 0.000000 Kd 0.640000 0.640000 0.640000 Ks 1.000000 1.000000 1.000000 Ni 1.000000 d 1.000000 illum 2 opensurgsim-0.7.0/Examples/Stapling/Data/Geometry/stapler_trigger.obj000066400000000000000000000224311277777236100260120ustar00rootroot00000000000000# Blender v2.69 (sub 0) OBJ File: '' # www.blender.org mtllib stapler_trigger.mtl o stapler_trigger v -0.042081 -0.006419 -0.111377 v -0.042081 0.006068 -0.111377 v -0.041799 0.006068 -0.057137 v -0.041799 -0.006419 -0.057137 v -0.036635 -0.006419 -0.168180 v -0.036635 0.006068 -0.168180 v -0.027803 0.006068 -0.189866 v -0.027803 -0.006419 -0.189866 v -0.083131 -0.002459 -0.108502 v -0.046824 -0.002459 -0.111552 v -0.046573 -0.002459 -0.063532 v -0.067945 -0.002459 -0.069992 v -0.067945 0.002108 -0.069992 v -0.046573 0.002108 -0.063532 v -0.046824 0.002108 -0.111552 v -0.083131 0.002108 -0.108502 v -0.071514 -0.006419 -0.066118 v -0.071514 0.006068 -0.066118 v -0.087436 -0.002459 -0.168619 v -0.041295 -0.002459 -0.169246 v -0.041295 0.002108 -0.169246 v -0.087436 0.002108 -0.168619 v -0.082674 0.006068 -0.190857 v -0.072338 0.006068 -0.194373 v -0.072338 -0.006419 -0.194373 v -0.082674 -0.006419 -0.190857 v -0.086930 0.002108 -0.169685 v -0.071873 0.002108 -0.189509 v -0.079279 0.002108 -0.186832 v -0.079279 -0.002459 -0.186832 v -0.071873 -0.002459 -0.189509 v -0.086930 -0.002459 -0.169685 v -0.060506 0.002108 -0.191317 v -0.060506 -0.002459 -0.191317 v -0.041190 -0.002459 -0.169479 v -0.039868 0.006068 -0.194198 v -0.039868 -0.006419 -0.194198 v -0.041158 0.002108 -0.169643 v -0.034244 0.002108 -0.186620 v -0.040456 0.002108 -0.189294 v -0.050472 0.002108 -0.191135 v -0.040377 -0.002459 -0.189270 v -0.034244 -0.002459 -0.186620 v -0.040961 -0.002459 -0.170128 v -0.061414 0.006068 -0.196034 v -0.050242 0.006068 -0.195907 v -0.050242 -0.006419 -0.195907 v -0.061414 -0.006419 -0.196034 v -0.087515 -0.006725 -0.107551 v -0.083745 -0.006725 -0.108407 v -0.068407 -0.006725 -0.069492 v -0.071284 -0.006725 -0.066369 v -0.042108 -0.006725 -0.057550 v -0.045956 -0.006725 -0.062706 v -0.046210 -0.006725 -0.111564 v -0.042387 -0.006725 -0.111391 v -0.091934 -0.006725 -0.169353 v -0.088053 -0.006725 -0.168670 v -0.040687 -0.006725 -0.169176 v -0.036936 -0.006725 -0.168254 v -0.082459 -0.006725 -0.190601 v -0.079719 -0.006725 -0.187332 v -0.072289 -0.006725 -0.194068 v -0.071666 -0.006725 -0.190196 v -0.050268 -0.006725 -0.195601 v -0.050592 -0.006725 -0.191765 v -0.060760 -0.006725 -0.191912 v -0.061365 -0.006725 -0.195729 v -0.028199 -0.006725 -0.189664 v -0.033461 -0.006725 -0.186980 v -0.040252 -0.006725 -0.189872 v -0.039896 -0.006725 -0.193888 v -0.071284 0.006374 -0.066369 v -0.068407 0.006374 -0.069492 v -0.083745 0.006374 -0.108407 v -0.087515 0.006374 -0.107551 v -0.042108 0.006374 -0.057550 v -0.045956 0.006374 -0.062706 v -0.042387 0.006374 -0.111391 v -0.046210 0.006374 -0.111564 v -0.088053 0.006374 -0.168670 v -0.091934 0.006374 -0.169353 v -0.036936 0.006374 -0.168254 v -0.040687 0.006374 -0.169176 v -0.079719 0.006374 -0.187332 v -0.082459 0.006374 -0.190601 v -0.071666 0.006374 -0.190196 v -0.072289 0.006374 -0.194068 v -0.061365 0.006374 -0.195729 v -0.060760 0.006374 -0.191912 v -0.050592 0.006374 -0.191765 v -0.050268 0.006374 -0.195601 v -0.028199 0.006374 -0.189664 v -0.033461 0.006374 -0.186980 v -0.039896 0.006374 -0.193888 v -0.040252 0.006374 -0.189872 v -0.083443 -0.006419 -0.108476 v -0.083443 -0.002765 -0.108476 v -0.068176 -0.002765 -0.069742 v -0.068176 -0.006419 -0.069742 v -0.046265 -0.006419 -0.063119 v -0.046265 -0.002765 -0.063119 v -0.046516 -0.002765 -0.111578 v -0.046516 -0.006419 -0.111578 v -0.087743 -0.006419 -0.168615 v -0.087743 -0.002765 -0.168615 v -0.040987 -0.002765 -0.169250 v -0.040987 -0.006419 -0.169250 v -0.079505 -0.006419 -0.187076 v -0.079505 -0.002765 -0.187076 v -0.071613 -0.006419 -0.189893 v -0.071573 -0.002765 -0.189907 v -0.050618 -0.006419 -0.191459 v -0.050612 -0.002765 -0.191459 v -0.060760 -0.002765 -0.191608 v -0.060715 -0.006419 -0.191607 v -0.033847 -0.006419 -0.186783 v -0.033847 -0.002765 -0.186783 v -0.040361 -0.002765 -0.189587 v -0.040286 -0.006419 -0.189560 v -0.068176 0.006068 -0.069742 v -0.068176 0.002415 -0.069742 v -0.083443 0.002415 -0.108476 v -0.083443 0.006068 -0.108476 v -0.046265 0.006068 -0.063119 v -0.046265 0.002415 -0.063119 v -0.046516 0.006068 -0.111578 v -0.046516 0.002415 -0.111578 v -0.087743 0.002415 -0.168615 v -0.087743 0.006068 -0.168615 v -0.040987 0.006068 -0.169250 v -0.040987 0.002415 -0.169250 v -0.079505 0.002414 -0.187076 v -0.079505 0.006068 -0.187076 v -0.071573 0.002414 -0.189907 v -0.071613 0.006068 -0.189893 v -0.060715 0.006068 -0.191607 v -0.060760 0.002414 -0.191608 v -0.050612 0.002414 -0.191459 v -0.050618 0.006068 -0.191459 v -0.033847 0.006068 -0.186783 v -0.033847 0.002414 -0.186783 v -0.040286 0.006068 -0.189560 v -0.040361 0.002414 -0.189587 v -0.092245 -0.006419 -0.169407 v -0.092245 0.006068 -0.169407 v -0.087817 -0.006419 -0.107482 v -0.087817 0.006068 -0.107482 v -0.041190 0.002108 -0.169479 v -0.050642 -0.002459 -0.191153 vt 0.000000 0.000000 vt 1.000000 0.000000 vt 1.000000 1.000000 vt 0.000000 1.000000 vt 0.000000 0.866987 vt 1.000000 0.866987 vt 0.000000 0.039759 vt 0.000000 0.038214 vt 0.000000 0.890896 vt 0.000000 0.892077 vt 1.000000 0.892077 vt 1.000000 0.890896 vt 1.000000 0.038214 vt 1.000000 0.039759 vt 0.000000 0.044141 vt 0.000000 0.027875 vt 0.000000 0.958666 vt 0.000000 0.956815 vt 1.000000 0.956815 vt 1.000000 0.958666 vt 1.000000 0.027875 vt 1.000000 0.044141 vt 0.000000 0.061429 vt 0.000000 0.448069 vt 0.000000 0.649313 vt 1.000000 0.649313 vt 1.000000 0.742011 vt 1.000000 0.061429 vt 0.000000 0.050673 vt 0.000000 0.064990 vt 0.000000 0.764868 vt 0.000000 0.726115 vt 1.000000 0.032495 vt 1.000000 0.025337 vt 0.000000 0.062837 vt 0.000000 0.732803 vt 0.000000 0.945155 vt 1.000000 0.041968 vt 1.000000 0.549985 vt 1.000000 0.029180 vt 1.000000 0.834708 vt 1.000000 0.713809 vt 1.000000 0.070436 vt 0.000000 0.834708 vt 1.000000 0.816038 vt 0.834403 0.000000 vt 0.338579 0.009244 vt 0.000000 0.414929 usemtl _Mat.003 s 1 f 1/1 2/2 3/3 4/4 f 2/3 1/4 5/1 6/2 f 7/5 6/1 5/2 8/6 f 9/7 10/8 11/9 12/10 f 13/11 14/12 15/13 16/14 f 17/4 4/4 3/3 18/3 f 19/15 20/16 10/17 9/18 f 16/19 15/20 21/21 22/22 f 23/5 24/5 25/6 26/6 f 27/23 28/24 29/25 f 30/26 31/27 32/28 f 27/29 21/30 33/31 28/32 f 34/33 35/34 20/33 f 36/5 7/5 8/6 37/6 f 38/35 39/36 40/36 41/37 f 42/38 43/39 44/40 f 45/1 46/2 47/3 48/4 f 49/1 50/7 51/10 52/4 f 53/4 54/9 55/8 56/1 f 52/4 51/10 54/9 53/4 f 57/1 58/15 50/18 49/4 f 56/4 55/17 59/16 60/1 f 61/6 62/26 58/28 57/2 f 63/6 64/41 62/26 61/6 f 65/6 66/42 67/43 68/2 f 69/6 70/39 71/38 72/2 f 60/2 59/40 70/39 69/6 f 73/3 74/11 75/14 76/2 f 77/3 78/12 74/11 73/3 f 79/2 80/13 78/12 77/3 f 76/3 75/19 81/22 82/2 f 83/2 84/21 80/20 79/3 f 82/1 81/23 85/25 86/5 f 86/5 85/25 87/44 88/5 f 89/5 90/32 91/31 92/5 f 93/5 94/36 84/35 83/1 f 95/4 96/37 94/36 93/5 f 97/7 98/7 99/10 100/10 f 101/9 102/9 103/8 104/8 f 100/10 99/10 102/9 101/9 f 105/15 106/15 98/18 97/18 f 104/17 103/17 107/16 108/16 f 109/26 110/26 106/28 105/28 f 111/41 112/41 110/26 109/26 f 113/42 114/42 115/43 116/43 f 117/39 118/39 119/38 120/38 f 108/40 107/40 118/39 117/39 f 121/11 122/11 123/14 124/14 f 125/12 126/12 122/11 121/11 f 127/13 128/13 126/12 125/12 f 124/19 123/19 129/22 130/22 f 131/21 132/21 128/20 127/20 f 130/23 129/23 133/25 134/25 f 134/25 133/25 135/44 136/44 f 137/32 138/32 139/31 140/31 f 141/36 142/36 132/35 131/35 f 143/37 144/37 142/36 141/36 f 23/45 26/45 145/46 146/46 f 145/46 147/47 148/47 146/46 f 147/47 17/4 18/4 148/47 f 149/30 38/30 41/48 33/4 f 150/42 44/42 35/33 34/4 f 24/1 45/2 48/3 25/4 f 87/1 90/2 89/3 88/4 f 63/1 68/2 67/3 64/4 f 111/1 116/2 115/3 112/4 f 135/1 138/2 137/3 136/4 f 139/1 144/2 143/3 140/4 f 113/1 120/2 119/3 114/4 f 37/1 47/2 46/3 36/4 f 91/1 96/2 95/3 92/4 f 65/1 72/2 71/3 66/4 f 21/2 149/3 33/4 f 27/2 22/3 21/4 f 32/1 31/2 34/3 20/4 f 19/2 32/3 20/4 f 150/2 42/3 44/4 f 26/1 61/2 57/3 145/4 f 61/1 26/2 25/3 63/4 f 86/1 23/2 146/3 82/4 f 23/1 86/2 88/3 24/4 f 148/1 76/2 82/3 146/4 f 18/1 73/2 76/3 148/4 f 52/1 17/2 147/3 49/4 f 53/1 4/2 17/3 52/4 f 3/1 77/2 73/3 18/4 f 145/1 57/2 49/3 147/4 f 5/1 60/2 69/3 8/4 f 8/1 69/2 72/3 37/4 f 83/1 6/2 7/3 93/4 f 93/1 7/2 36/3 95/4 f 79/1 2/2 6/3 83/4 f 77/1 3/2 2/3 79/4 f 56/3 1/4 4/1 53/2 f 1/3 56/4 60/1 5/2 f 48/1 68/2 63/3 25/4 f 65/1 47/2 37/3 72/4 f 95/1 36/2 46/3 92/4 f 89/1 45/2 24/3 88/4 f 105/1 58/2 62/3 109/4 f 109/1 62/2 64/3 111/4 f 100/1 51/2 50/3 97/4 f 101/1 54/2 51/3 100/4 f 97/1 50/2 58/3 105/4 f 117/1 70/2 59/3 108/4 f 120/1 71/2 70/3 117/4 f 104/1 55/2 54/3 101/4 f 108/1 59/2 55/3 104/4 f 141/1 94/2 96/3 143/4 f 91/1 140/2 143/3 96/4 f 133/1 29/2 28/3 135/4 f 33/1 138/2 135/3 28/4 f 81/1 130/2 134/3 85/4 f 136/1 87/2 85/3 134/4 f 75/1 124/2 130/3 81/4 f 74/1 121/2 124/3 75/4 f 78/1 125/2 121/3 74/4 f 131/1 84/2 94/3 141/4 f 127/1 80/2 84/3 131/4 f 125/1 78/2 80/3 127/4 f 140/1 91/2 90/3 137/4 f 144/1 40/2 39/3 142/4 f 40/1 144/2 139/3 41/4 f 110/1 30/2 32/3 106/4 f 30/1 110/2 112/3 31/4 f 98/1 9/2 12/3 99/4 f 11/1 102/2 99/3 12/4 f 9/1 98/2 106/3 19/4 f 107/1 44/2 43/3 118/4 f 42/1 119/2 118/3 43/4 f 10/1 103/2 102/3 11/4 f 103/1 10/2 20/3 107/4 f 119/1 42/2 150/3 114/4 f 114/1 150/2 34/3 115/4 f 129/1 27/2 29/3 133/4 f 123/1 16/2 22/3 129/4 f 122/1 13/2 16/3 123/4 f 126/1 14/2 13/3 122/4 f 142/1 39/2 38/3 132/4 f 15/1 128/2 132/3 21/4 f 14/1 126/2 128/3 15/4 f 115/1 34/2 31/3 112/4 f 138/1 33/2 41/3 139/4 f 68/1 48/2 47/3 65/4 f 92/1 46/2 45/3 89/4 f 67/1 116/2 111/3 64/4 f 66/1 113/2 116/3 67/4 f 137/1 90/2 87/3 136/4 f 113/1 66/2 71/3 120/4 f 106/2 32/3 19/4 f 20/1 35/2 44/3 107/4 f 129/2 22/3 27/4 f 21/1 132/2 38/3 149/4 opensurgsim-0.7.0/Examples/Stapling/Data/Geometry/upperarm.osgb000066400000000000000000000731421277777236100246350ustar00rootroot00000000000000¡‘lEEûP0 osg::Groupbody_upperarm.objÿÿÿÿ osg::Geodeupperarmÿÿÿÿ osg::Geometry osg::StateSet osg::Materialupperarm_mat_upperarm.png€?€?ÍÌL?ÍÌL?ÍÌL?€?ÍÌL?ÍÌL?ÍÌL?€?ÍÌÌ=ÍÌÌ=ÍÌÌ=€?ÍÌÌ=ÍÌÌ=ÍÌÌ=€?€?€?q=ŠAq=ŠAá osg::Texture2D)))'&€?  upperarm.png¯25   555 !"#$%&'5() *!+",#-%.'/5+0,1-2.3/456789:5/5;7<9=>?@ABCDEF59:>G@HBIDJFKLMN5 :OGPHQIRJSKTM5 OUPVQWRXSYT5 UZV[W\X]Y5Z^[_\`]5^a_b`5a^cdefghijklmnop5^Zdqfrhsjtlunvpw5ZUqxryszt{u|v}w~5UOxy€z{5 O:8€6‚|}5|{€5Œ‹Š\PTQURVSW=<;35 \[TZUYVXW<5 [_Z`YaX4<35_b`cad4,3+2*1)0(5becfdg,$+#*")!( 5ehfigj$#"! 5  5     5µª%©-¯5±>²5ÿþµ¢ª¨©§¯®±°²³5ÿüþû¢¡¨ §¦®­°¬³´5 ¬­¥¦Ÿ õøöù÷ú5÷ôöóõòŸž¥¤¬«´5 ôñóðò£«5 ñîðíï윣5 îëíêìéœ 5ëèêæé 5èçæåäã5 äæ5‹\^]5\][™˜5[˜_—–5_–b•”5b”e“’5e’h‘5hkŽ5 hkiljmnopq5onrml5rlstuv5swrxoyz5z{op5$´³5$&³²5²&F'/5/;F?>65.-&%5 ;@?76/.'&5 @870/(' 508192:3;58A9B:C;D=ESIRKQM5 DGEHIJKLMNO5H¼J·L¶N5¼¹·¸¶5¹¼½¿ÀÂLF5 LNÀ¾½»¹º¸5(í)î*Ã0ÄÑÐÕÔwp5 ÃÅÄÆÐÏÔÓpo5ÅÇÆÈÏÎÓÒoÖmÝkßiä5ÇÉÈÊÎÍÒ×ÖØÜÛÞàáâ5 ÉËÊÌÍê×ÙØÚÛ5ËÉëìíî5ÉÇìÅîÃ5ušs›w5FÂEÁGH5¿ÁH5w~Õ1Ñ051~2é345~}é‚465baèç5acçæ5æcåeägi5äáåãæ5äßáÞ5ßÝÞÜ5ŠPOM5ïÕÔÒÑÎÍÊÉÄý¼µ´­5ÕÓÒÏÎËÊÅľ½¶µ®­¡5ÓÐÏÌËÆÅ¿¾·¶¯®£¡¢5ÐÈÌÇÆÀ¿¸·°¯¥£¤¢N5ÇÁÀ¹¸±°§¥¦¤ONDKC5Áº¹²±©§¨¦POED?>75º³²«©ª¨QPFE9?87/5³W«UªRQHFG9È1É0Ë5WVUTRSHÇGÆÈÅÉÊË·5VÃTÁSÀǿƾŽʷ5ÃÂÁ¼À»¿º¾¹½¸·®­ª5 ÂÛ¼µ»³º±¹¯¸®5 ÛØµ´³²±°¯¡®ª5ØÖ´Ó²Ì° ¡Ÿª§©¦¨¥5ÖÔÓÎÌÍ žŸ§¤¦£¥¢5ÔÐÎÏÍÞžœ›¤™£—¢•5›š™˜—–•”êéèçæåäã5 äïæðèñêò•¢5 ï÷ðøñùòú¢¥5 ÷ÿøùú¥¨5 â᫨¬©­ª5 âá« ¬¶­·5  !¶Ë·5 *,!.0/1895/.-,+*)%($'#&"ij5 %$#"jz{5   ‡ˆ5   ‰Š5  ‹Œ5  Ž5 þýüû5 þöýõüôûó‘’5 öîõíôìóë’“5 îâíàìÞëÚÜÛ5 âáàßÞÝÚØÙ×2á5âîäï5îöï÷5öþ÷ÿ5 þÿ   5 5  â%*5  %5ÇÈÁº»³ZWXVYÃÄÂÜ5 ÂÜÛÚØÙÖ×ÔÕÐÒÑ5 ÐÑÏÝÞßœàš5´­¬ Ÿœ”’“‘tpqlm5­¡ ž–”•“wtuqrmn5•ywxuvrsnogihj}|5 yIx@v:s2o&i5 IA@;:32'&5A<;43('5<54)(5)5+6-7/5 65=<BAJILy–•5 –žLMJKBC=>675ž¢MNK5;<@A85<=AB5=?BC5?ACD5ACDG5}~hf5hfgenm5fdecml5 dbcalkp‘’›œ5 b`a_kŽš›5 `\_‹ŒŽ™š5\‰‹ŠŒ˜™5‰†Š—˜„5—†„…ƒ2…5†‰ˆ[5‰\[]5]\^`†…5`b…„5„bƒd‚5df€5lktŽv5q‰ˆ5ˆ‡5‡†… „ƒ5 ƒ ‚5  €5 ~}5}|55ÿ5ýÿü5ýúüùûø¡ 5?ž¡¢ÖרÙÛÚCD>{|jz‡‰ˆŠ‹ ŒŽû‘“ëÜš›œ!0ËCEGPQM²F>H¿¼+*0ÜÝÖáâãðãì ½m"®½¶¾ä,,½nö·½Ç& ¾í<;½fæ³½Ì^¾ê¼W½nJ¾½ðÞ¾âl_½o¾½Ñ¾u~€½m2Ľ¹†¾röƒ½kV½Ïf%¾n&½ifǽ¦¾sÆ–½s^Ƚ¸%¾qÖ¡½e:Ô½Æn¾sΩ½.’Ö½ö'¾sö®½¡Fá½çþ¾xÖ¹½/Úã½Õv#¾sf»½Ufê½ÉV¾t¶Ë½aÂè½Ëö!¾<öÓ½pÎè½Ùv¾íŒE½sZÁ½Ëž¾îæã½¶F¾äŒ\½r–ȽϾlV‚½‹.Ͻàž¾ov•½@Ö½Ô&¾Ýüp½0νž=÷½möŒ½"Ö½·v¾mÖŸ½Šݽض¾s&‚½¯Îѽs½í½vf—½OÆØ½imú½x檽tæÞ½Õv¾nvº½Szæ½ïæ ¾d&ѽ<Þ使 ¾‹f彄f×½Øî¾<öó½uÆ×½¶Ö¾OÆø½>®Í½ïƾ"‹¾72Ͻâ¾;þsfƽïn¾svŒ½böÒ½¢]å½t>¡½SÎ×½~ýð½t¶½[šÛ½ƒMý½w–Ž¡Fá½àö¾‡Ù½/j×½ó¾=ë½kR˽ò® ¾;æü½r²Ã½ÉŽ ¾$ ¾tbº½»–¾6νn6Ö½´Æ¾tæÞ½nȽƾ‰&ð½rú¿½ßÞ¾/öþ½k»½Ý–¾ ³¾iú±½áξR+ ¾n¤¬½ÈÎ ¾T‹¾qŠ£½Àv¾Y3¾k޽Áþ ¾2˾kB½Âf¾IK¾j‹½ÆÞ ¾O³¾Õ(z½É¾£¾jB¯½ÆN¾Û¾j\™½×Þ¾W˾n憽Çf¾Tã¾Ðès½»F ¾0 ¾Ô,k½·î¾W¾Õ†T½Óf ¾+ƒ¾ÉxO½í¾A+¾É†?½·Î¾Lû¾ÐŠ9½Ü¾Iƒ ¾Øh4½Ì¶¾/S¾Í:#½Á޾4ƒ¾ËÊ ½ÉV¾A+¾Ë¶X½Æ¾Xã ¾Ç<<½Æ¾¾"¾Åê*½ë6¾4K¾Ç$(½Äî ¾lVý½Éî½ôþ¾Tû¾Ô8 ½â¾¡Öô½×`½à¾ž–ÿ½¦Kõ¼Þ¦¾JC ¾Ì˜]½›=ð½N{ ¾Ð2<½©-õ½8»¾àÊ#½{½û½P£¾Íé½½n¾³&ö½Ï ½¿î¾¬¦ë½ÚÙ½ë ¾+¾Ëh?½Š­à½"£¾×l ½´­æ½`æû½Ó° ½½í½W¶ï½®çõ¼¸Íô½9ä½²cã¼å}ü½7S¾Öb!½²Ï½G6÷½Ï°½ÉÖ½5v齯¿Û¼¬ýݽeÆÛ½’SżŠýå½›vñ½Î7½©¹½DÆã½)”ż¦ýAÖÓ½$¤¼ý̽<۽˻¼«mŸ½w–ʽ©ƒ¼¦m­½³–â½Ík½¤ ‘½˜fú½Çp+½ªÍ´½°Ví½Ä¦D½®Ýœ½r6ý½Ó´U½§ý¶½C6ð½Ù”f½ªí¦½0Ö÷½àì{½«­¸½3öå½mÒƒ½«}¥½A¶ì½oª½§íº½iVÖ½k—½°¨½Oæß½kª½² Á½wǽk€¢½®Í°½©fÖ½o§½«-˽yƾ½kþ©½©=»½9vнi&®½lÍÖ½Ic¾ÅðG½­}˽V+¾Ï0p½§Ýɽc–ý½db‰½¤Mʽk¶ò½mŠ—½Ü}ν€Fé½on¢½²½Ö½fá½j(ª½ Ýá½`æÛ½j³½Ð=ë½8K ¾×ôe½î=ܽ- ¾gp…½¸Ú½Lþo|’½ì½Ø½XVú½k<½-à½=&ò½m,§½•=é½y6ë½fF¯½œ½ó½=¶å½i¢¹½©Mü½O; ¾fž½Ï í½<ƒ¾i攽g}ê½$ë¾kÒ¢½ƒ ï½;æü½f¬½Šù½I»A¾°Æú»V ”¾7Ã=¾[ϼvÇŠ¾0›@¾¦†ì»fM”¾;û:¾´6Ï»j‘¾Û;¾¹ÎÔ»_]•¾'7¾²†É»iq–¾25¾´^»n”¾ ³3¾¢ŽÔ»t%о=Ó+¾¤Ï»q‹¾;û*¾ þл^+¾(›"¾¥®Æ»_ ‚¾)³!¾œþÇ»ó’o¾Cã¾§fÞ»õ~s¾"Û¾Ww¼Ø–a¾Bë¾Oó¼»e¾2s¾>2¼ïnU¾73 ¾L÷¼ÔîW¾#ó¾f¿I¼ÏžK¾Ó¾\1¼ÛÞN¾2‹¾ ÏS¼ÛE¾9¾©6ö»Wо&k4¾Y× ¼w ‚¾J³)¾SK¼Ýæm¾'Û ¾N7?¼»Ö^¾;¾8Ùa¼¾FR¾BC¾e©u¼ÅvG¾?‹¾@k~¼·>¾fÖò½¦ˆ‚¼Õ65¾F“ ¾}៼äN9¾A+¾='¢¼Ü¶/¾\v轂«¼ÉV'¾3†Ù½@b ¼ëÆ+¾°¦Ò½UüÒÞ ¾ofĽÚÀ¼Ív%¾y&¿½À7ò¼´v¾tƱ½¹û÷¼Þ¦¾y©½¸ è¼Ð~¾qž›½ Yí¼ôÞ¾p¾’½·»â¼Þæ ¾r†½¹»ó¼Ëö¾é\v½ÀjÛ¼ßÆ¾H3¾¼Ǽ¶f+¾ŽVõ½žRʼ¾.#¾”Öß½¡­Ô¼ØF¾t̽˽¹Æ¾r†·½»¹ø¼ôþ¾qÆ ½ŽÅÛ¼ñÖ ¾oˆ½ ¸Ê¼Ö޾ì<[½™µ¼iõ½ž–ÿ½¦Kõ¼Þ¦¾GÆê½’ð¼Ôî¾IfÕ½Ôš½¶†¾p–½§Qí¼Ô~ ¾x®½!ȼö¾vΕ½žœ¼¼ ü½ï|u½’†¤¼‚ë½Þ|9½°÷‡¼¦Íؽ¡Öô½×`½à¾«á½£=ù¼În ¾8ö̽Œ!å¼Ùæ¾wv¸½)Bż·¶¾uþ¢½œ­¼Áô½u¾‰½2#—¼©mã½õÌW½&r¼ÅϽ¬¦ë½ÚÙ½ë ¾g&ؽ¥2à¼Ý^¾mý˜AƼ§ýö½n¦­½ÞA¢¼‹Më½pΘ½'¤¼ëÝß½oN€½l«Y¼°ǽ9ä½²cã¼å}ü½söν;¿¼æ=î½r6¸½Ù¼Š­à½mîž½7÷|¼¹ýÒ½eÆÛ½’SżŠýå½nÆÄ½©Œš¼uÖ½r«½7C`¼¯Íƽo½ó&¼®¶½AÖÓ½$¤¼ý̽xÖ¹½L`¼¯]º½o®›½I3¼°}§½w–ʽ©ƒ¼¦m­½r&¬½AŸ#¼®—½XS)¾«Žü½Y‰™¾Gs$¾ âø½j£š¾'ƒ#¾•šý½u•¾8+"¾¥òö½g'›¾Ks¾L÷½pw–¾Vó¾oîï½vQœ¾+ƒ¾J ì½ißœ¾1{¾cZû½l#޾G˾.®ñ½V¾J뾩úõ½[{‡¾T‹¾uVë½mu‰¾PÛ¾o‚ï½Z ¾%¾}ã½kÑ‚¾€Öü½‚âç½¹Šu¾RÖï½{NÚ½»žx¾†¦ì½…^ß½ç.i¾öß½[ÒѽÁþk¾76Û½OÖ½áî\¾LöϽp*È½Õæ_¾n–̽k̽¸vR¾n–Á½tz¾½Õ6U¾U¾3nê½n»˜¾Gà ¾Žªæ½fO’¾ó¾;RݽYQ‹¾E¶ó½UšÔ½d]„¾n¦â½.6ͽå{¾j†Ô½rnýáBn¾rfŽrê¹½éb¾m¦·½sZ±½Î6W¾JC ¾Û½t·›¾9Ó¾¯vÔ½VI”¾föù½sºÌ½fÁŒ¾ƒöê½nÆÄ½y…¾W&ܽo6¼½ÛŠ}¾p†Ì½jª²½Üžp¾t¼½sö©½ÉÆc¾n®½s£½¼ŽX¾'» ¾rȽv1¾7S¾gºÂ½pY•¾p–ò½iJ¼½oŸ¾g–ä½mº´½iq†¾L×½sÒ«½Ãê¾sÖǽs”½Ì"t¾p¦³½nè—½óŽc¾t¦½hZ’½äfX¾$#¾gú¶½Wž¾`æû½sj²½t땾‚Æì½k~¬½`ÿ¾F&à½sÞ¥½nû†¾|ÖÕ½rŒŸ½_—¾/†Ò½l”•½]¿€¾t¶Ë½iÌŠ½Áªz¾uÆ×½k‹½d“„¾°¦Ò½Ð(x½qU¾Jà½ÆX|½cµ‰¾›¾rþ¦½d[ž¾Wõ½p£½Y»•¾jè½rl½`“¾Lfܽfl˜½d‘†¾4K¾qB—½q¾ŒÖñ½i@“½uY”¾0Fä½qT޽b/Œ¾Ws¾h’ˆ½[Íš¾c&ñ½o8‚½iá’¾ ¾ÞÐj½^)›¾Efî½ÛÜ]½rþLfܽÒxX½p—…¾5–нÛèW½àFz¾o6Ç½ÊØu½¹6t¾m†Å½Ë„Z½Üöm¾w6º½ÕPo½Òþg¾r»½ÛŒN½¹Nc¾n–¬½ÜÔe½áî\¾vv­½ÙÆD½ÙÎW¾nN ½Ì˜]½á>R¾qÆ ½ÜB<½ò~L¾«æù½Êò:½t“¾ç½Ùô6½Wsˆ¾”†Ú½Þ¸6½ÏF~¾u̽ٸ9½çRl¾‰&ð½Ò^½pщ¾3¦à½Í8½o»€¾Wսʽ¼–p¾o–ǽϾ½Ìæa¾sf»½ÆÈ-½ÉŽ]¾nvº½Ïý½áÎU¾p¦®½Ý¼'½»fR¾mÖ¯½Õî½áL¾v¶¦½Êü#½½NJ¾xF¦½Ö¶½Ù>D¾mV½Ù*½àD¾p†œ½ÞÈ½ÅÆ<¾“Æè½½Þ¼uÉ€¾0&ݽ¬Pä¼áÒq¾gѽŒDè¼êÎc¾rŽ•Ûì¼àžW¾pfº½¡ü¼¼M¾n&°½Ù½½Ù>D¾xΦ½×ֽƞ=¾p~ž½Î½Ü.4¾=¶å½qž¼ïŠp¾xFÛ½¼¶­¼á&c¾‰&н/;º¼Î6W¾w–Ž”lмäÞL¾r»½¬!ç¼õ~C¾oƯ½Ý½îÎ:¾Žæè½°—¼¹¦`¾®fݽ"q¼ÀîT¾T†Ñ½fµ¥¼Ô–J¾xFƽ•ÚÁ¼·^C¾u½½•õѼ¾~8¾r&¬½â½ÁŽ/¾wŽ—½à…½éF(¾k~Œ½Òʽò–+¾qÞ„½Ç}½óæ ¾F–ì½&µa¼ÒÆQ¾Oæß½s€¼á¶F¾‰&н7`¡¼å¶=¾¶ñ½]ÓM¼Þ6C¾¢vß½”„„¼Ý®7¾xæÊ½ŠS­¼Îþ0¾r&·½žëÖ¼å+¾w¥½Éü½ÇÖ#¾mv½Ð„½Ü¾î¾ä¼D½¡мխþ½ï, ½;«Å¼ëMì½Øùí¼µ£ø¼Áô½äÜ!½9œ¼à½ã½*35¾¸nÒ»iÝ–¾6ë,¾VS¼Y»•¾) /¾[C¼p?˜¾'K-¾Ro¼i¥˜¾Mk#¾°vë»wIŒ¾ ›$¾aŸ%¼tÓ–¾.s¾W ¼_]¾Iƒ¾igb¼i¥˜¾G˾g“C¼]5¾B“¾·¥¼wi›¾9# ¾Ü–¼p]‘¾*㾜mî¼h‘¾“¾ª[â¼jM“¾4 ¾Ô²½i3ž¾+£¾Ór½m瓾W{¾Ý@½q9ž¾>¾«ŽÞ»feƒ¾.«¾¥6í»[•„¾[¾p>¼gy†¾S¾q޼vˆ¾OÆø½ÁÞ¼p“‰¾0ƒ¾›–õ»ç†v¾(Ó¾Tƒ¼ç.y¾2‹¾0X¼ê®|¾‰&ð½.'—¼Øî~¾? ¾L;¼å~g¾Bë¾ró2¼Çzj¾<öó½n·n¼Â¾m¾H£¾SW¼ôÞX¾4¶÷½oóF¼¹]¾xFû½=¼ÔO¾6[ ¾Ì k½n» ¾+ƒ ¾Ó¶K½_y ¾ ¾Í6A½[[ ¾%[ ¾Ñ&"½oÓŸ¾4Ó ¾Ðt½Z¹Ÿ¾&þ½—ñ¼kÕž¾&þ½—ñ¼kÕž¾>s¾÷§¹¼iǾ;k¾»Ñ¬¼h‘¾,+¾»Cм^Gœ¾&¾nýt¼n×›¾Dk%¾W+I¼rkš¾s'¾5Ã2¼r÷™¾6s¾kÒ‚½Vï ¾Ió¾i„ˆ½c ¡¾Yƒ¾g(޽W%¡¾,ó¾lœ˜½tE¡¾U£¾h⢽p¡¾&û¾m.¨½k ¡¾O“ ¾m³½`¯ ¾S[ ¾m.¸½^ ¾R+ ¾s6ým ¾Cs ¾i^ɽ_ÏŸ¾MÛ¾•>Ô½ZEŸ¾&«¾«ŽÜ½Y£ž¾'+¾sòâ½^Ù¾rF¾½n ŽïþH¾m´½rÊ·½ò–K¾p°½pZÀ½·¶@¾y楽mv´½ÇÖC¾n.£½pB¼½ò–;¾r6˜½m"³½ðf=¾sÖ—½sv¼½»&4¾l¦Œ½oʱ½áv8¾u„½r&·½×¾0¾w‚½kn¦½¸®8¾îÜj½rॽµ†2¾×Üq½iV–½Øž9¾ÕÌZ½h&“½ä3¾ÜŒi½dÞ„½í9¾m&ª½k²«½âÆM¾n–œ½gâ§½í~E¾nŽŽ½m¦½¾¶>¾n6¡½p²½»ÖN¾nÆ”½j®™½òFF¾vÞ†½c^—½ï6?¾t~š½iž½ÉvN¾lÆŽ½jò‰½¾ÖE¾pþ€½mЇ½êV?¾m–¡½ib€½Ð>V¾qv–½Ùy½õ^L¾yþ‰½×s½Ô^D¾åÌ{½Ôlo½ê–=¾Ü\f½Û1¾ê,i½Í(1½áv(¾×ÜQ½Ç%½¸æ¾á:½Þ¸½Ó†¾î ½Ôö%½äö ¾ç,½Ä ½î>¾ÇÙϼÊ:½°Ýý½qnˆ½Äˆ3½â¦6¾n¶ƒ½×†*½Ò6.¾æÜw½Üž ½î–$¾wö½Ó$"½µ.5¾uþ’½Ë.½Àæ<¾o&‹½Ýä<½Ü=¾t擽ـ>½ÙVC¾ê¼<½hv½Ï†,¾Õ\I½nl¡½Û6,¾Þ)½eìš½Ï~$¾ä|;½r𝽵n#¾Þl½jJ§½»F¾í<;½fæ³½Ì^¾ãì ½m"®½¶¾ì,½lp‡½Ü.$¾ï ½lÞ’½Í®¾Ë9ç¼n&›½Îþ¾ïì½nx€½Ç¾ÂYÛ¼gнÛn¾áùû¼Ýl]½Ñ>¾Ó™Å¼Ûps½¹ ¾¸™À¼ÎžP½ºž¾à ½Ý²>½Ç.¾¼yżÜ3½Âö¾âl_½o¾½Ñ¾àì`½n¢¶½ó®*¾röƒ½kV½Ïf%¾s޽nRÁ½ÇÎ+¾pö­½g脽Îþ`¾pæ¼½e˜‰½ÂÖl¾s޽nRÁ½ÇÎ+¾p^œ½mêǽón,¾sÖ—½sv¼½»&4¾pö¨½jjɽɮ4¾n.£½pB¼½ò–;¾p°½pZÀ½·¶@¾t·½aÚ½ð0¾xÖ¹½,ϽÞþ<¾rF¾½n ŽïþH¾m¶È½EÖڽݖ8¾uFʽböÒ½ÁÆE¾n–̽k̽¸vR¾¦Ú½4šÜ½ç6A¾¢&Ú½P2Ù½ï6O¾76Û½OÖ½áî\¾Œ¶ê½Púâ½×nK¾•vê½0 â½ÊþY¾†¦ì½…^ß½ç.i¾Lfü½ž^é½ÎNV¾ª¶û½‡Öê½ÞÞe¾€Öü½‚âç½¹Šu¾:“¾«ð½»fb¾1ë¾tvò½îîq¾PÛ¾o‚ï½Z ¾B[¾lø½Ò6n¾+¾•¶ø½Üö}¾J뾩úõ½[{‡¾0+¾-¾à†x¾)¾+‚ÿ½wg…¾1{¾cZû½l#޾/Û¾?­¾h“ƒ¾P‹!¾/¾g±Œ¾'ƒ#¾•šý½u•¾ ë)¾U¿¾h“‹¾3,¾>¾h=”¾XS)¾«Žü½Y‰™¾4ó4¾'G¾u;“¾;3¾)¾]݉¾={>¾;‡¾rÁ‘¾%s<¾P3¾oó†¾DûH¾V¹¾eý޾0ÓF¾ž–ÿ½iUƒ¾XS¾²ö÷½W—‹¾GãP¾kð½Þ:¾›]¾Œ*ã½]3‰¾Z¾OvÓ½¹.|¾0Óf¾aâϽmo‡¾$Óa¾k²¶½Ü}¾9³m¾mú½½o½†¾=³d¾r쪽ìÚ~¾T£'¾+Ÿ¾[¯¾;1¾.q¾Õª}¾Y;¾()¾ëNw¾N+E¾9Zõ½ÔÎp¾.N¾PÞ½¾öl¾WëT¾sÚýÔêk¾ûY¾i¬¨½Ð²n¾L3]¾iŠ•½Âºq¾£%¾AÓ¾Ýæm¾$+/¾¬úü½ávh¾IÛ8¾~úï½õ~c¾K«A¾sÞ½Þ¦_¾&ûG¾tvǽÜö]¾XûK¾s~¯½ën^¾F#O¾i†™½ân`¾"ûP¾jLˆ½Ü.d¾‹&¾|~ø½Þ\¾={.¾’ë½òX¾Mû6¾LúÛ½ÕvS¾.=¾kªÈ½óþO¾P£@¾ræ²½ÅnO¾!ËB¾nܽ½†P¾OE¾m’н¾.S¾R›H¾ËØp½õžZ¾X#¾/æ½ÜM¾G«*¾lrؽäfH¾+1¾köƽÂöC¾F[5¾pF³½µžA¾Yƒ7¾q> ½×¦A¾;;9¾l޽ô¦B¾+k;¾Òtq½ÅŽF¾I£B¾ÜP½½þT¾!;¾kš×½ç¦=¾M&¾mŽÈ½ë68¾$›+¾t2·½í¾3¾ƒ.¾s£½Ï¾2¾) /¾mæ½ðž3¾!;/¾Îø~½âæ4¾W³.¾Ê€]½å–6¾9{7¾ÐîK½ÂöC¾OË/¾É–@½ÛN;¾0c¾jÎË½Ýæ-¾+û¾tâ¼½Ë.(¾ã#¾p|¨½½þ$¾/û%¾dŠ“½ôN%¾VÓ%¾c‚½¼æ%¾"‹$¾Ûðe½×ö&¾<Û#¾Ü F½¸V+¾B#(¾Ð#½¾~8¾Q»¾pÎý½Æ¾2ã¾âp&½»F+¾S ¾Òj½Å69¾6[)¾Ó]½ÏfE¾=³$¾0ÎļÉVG¾“.¾Ô÷µ¼À®V¾.Ë'¾½ƒ„¼Á[¾R{1¾Lg¼ç¾l¾J³)¾SK¼Ýæm¾&k4¾Y× ¼w ‚¾>«<¾„3S¼k ¾B#8¾É8«¼îÎj¾E›3¾¢ãô¼µ.U¾"0¾Ó¸½é¶D¾E›C¾Ït¥¼g€¾Së=¾²Ûç¼Ïöh¾Dû8¾Î®½´VT¾@£4¾ÏÈ1½é¶D¾)#>¾âÐ1½çöR¾'ƒC¾ß’½Ý®g¾73J¾²iå¼Ôz¾D3O¾_tž¼_)‹¾kF¾B d¼WW¾Q¾4Ay¼c—¾*SL¾%oJ¼v©‘¾J#V¾°7ñ¼w+‹¾SP¾Ýé½·~¾=CH¾Ýh1½¼Îf¾Y»]¾ß.½W%‰¾KST¾Ôb0½éf¾"kM¾ÏSo¾k^Žqɉ¾8Ûl¾k”½r‰ƒ¾K;u¾k0ˆ½t!†¾N+u¾Ûäk½d‡¾NÓw¾Õ$s½]߇¾W“w¾à0l½[Cûx¾hT•½o‡¾KËx¾i›½]©‡¾4ƒx¾kÚ ½Z¹‡¾{v¾nÚ¬½Y-ˆ¾N+u¾iV±½_yˆ¾%s,¾Oªý½bÕ˜¾Gã0¾’’þ½^×—¾$c5¾T¾tÓ–¾$ó8¾Ÿ¾_–¾/Û>¾&¾g±”¾BëA¾PÁ¾`”¾CI¾y¾t[’¾<»L¾K!¾W‘‘¾ÃS¾€.ú½`ý¾+ÛW¾a2õ½s¾;‹^¾}è½h‘¾Lƒb¾~öã½W­Œ¾Eh¾0Ö×½nk‹¾PSk¾P¦Ñ½p±Š¾7Ã=¾[ϼvÇŠ¾ C¾[¯¼r¿“¾I»A¾°Æú»V ”¾8cH¾g3=¼e’¾J w¾Øøb½_ ˆ¾ƒu¾â¬H½seˆ¾NCt¾Õ>8½h­ˆ¾Bëq¾Ïx'½v5‰¾ACo¾Î6½_͉¾9Ël¾àú½l]о5[i¾»áí¼W#‹¾!se¾«nÚ¼WŒ¾Gã`¾³Zż[ ¾A›\¾2S¿¼`ÿ¾R›X¾ ¶¼i厾;«U¾»à‚¼i¾#óx¾m‡½fŸ‡¾Cûx¾oŒ½fŸ‡¾m¶È½`rã½Óf,¾‚6Ù½f*ä½¹64¾Bæê½g>ç½ïŽ<¾…¶ü½‹†ì½â¦F¾D¾JZñ½îîQ¾« ¾0šõ½Àv`¾B{¾5ý½ÕÆh¾§6ؽ/¾è½Å*¾ 6꽂Šê½â®.¾=–þ½xšì½êv6¾+¾ŽŽë½·¶@¾>#¾@Jì½òîH¾7¾j.÷½ë6X¾4+¾Š’ð½Ø–Q¾"k¾uRÿ½ëþa¾Šæá½,¶é½Âö#¾sfû½<Þä½Ç*¾#K¾‰"ä½óv4¾B[¾Œîà½Á;¾+¾|Fâ½·^C¾# ¾›>Û½Ô&.¾NC¾{ؽÏ~4¾JC ¾sžÑ½Åv'¾)³¾UÙ½Ûn"¾fì½eRã½é–¾6¾$]¾Þ6s¾'Û ¾N7?¼»Ö^¾( ¾'”¼ÙN¾;¾8Ùa¼¾FR¾Tã¾ë œ¼×fC¾BC¾e©u¼ÅvG¾F“ ¾}៼äN9¾GS¾LʼØî>¾#¾wȼàö4¾H3¾¼Ǽ¶f+¾*¾ãÛ½Ä>1¾ Ó ¾ª1ü¼éF(¾6s¾Òͽ¸V+¾?S¾ÇнóŽ#¾pö½½wNÓ½©-õ½uFŽnÊ˽®½ï½nV³½LNͽÓMâ½pV¹½iƽ…}Û½pæ§½p²È½½ÝÒ½pN¦½jÒ½­=ǽo•½knƽ°ýĽoνkâ¾½¤}²½æ¼u½gVÀ½¦-´½ð`½g¶¶½¦M›½r‰½kö¶½§ž½w椽k»½§m¸½rÆ»½f®½½Ë}Ò½s˽r^½rmè½”fÓ½iþȽy=ø½vF¥½oʱ½¯Ý§½oF½½p.´½¦ ǽ«vͽnV¸½¦íß½0Ö×½m‚¾½Â½ò½v¦¥½j¤¥½°—½qv†½o|­½¯íˆ½vÆ‚½hÒ¡½T›i½ïlO½j¦½Xû[½îO½n蜽]û=½ð¬s½gœ‘½U;9½nvš½fŽ›½P;w½r–¸½f›½¨]’½w–¥½dD½X;j½r¶Ê½bøˆ½¥-޽xf½É¬~½\;1½w–º½Âüp½U›_½pv›½Ò¸a½]û"½pF³½Þ°C½]»4½>ÆÜ½Éüh½©½fÖÒ½Ù8B½Jx½ræÂ½Æß½M;K½wǽ ÷ȼ`›h½y¶½½lõf¼¦…½;Æõ½iε½¸Ž¾ò U½n¯½«ý‚½u6‰½oúɽ¦=ʽtŸ½—ͽ{mÖ½wö•½d&ѽÄ]ݽxF«½núÓ½lè½y¶½½lõf¼¦…½ð'ƒ?‚;D¿&‘¾½Qã>¶¹]¿Ék¾ÿ!ý>­¡X¿›YK¾À%à>º÷`¿ŸYB¾º-á>Éb¿KY&¾X­>Ûûl¿l±+¾E¡>Ù_j¿ú|„¾§•Ú>Îc¿k¹3¾þ™ù>³ÏW¿½©h¾:­?†WB¿ˆ>¾+÷?©C¿‘…¾o? N¿†qG¾1Ï>ȵa¿ jx¾Æih>ø7x¿ˆñº½ç>û#|¿ó‘ô½XY¾ñ-|¿(a¦=²…à>¹‰^¿áyi¾¨©Õ>Á‘`¿Íér¾ÃÕÙ>¾k\¿޾#1?˜kI¿2y¾0»?‹oH¿cAA¾~Å>Ûl¿7á=‘š½üQ|¿1™>ºIܾ¸Z¿7©˜>‹É>Æßf¿r16¾Ð}á>¼É_¿¢aQ¾åíø>«]W¿ðùq¾uɸ>ßùm¿ ᘽ{õÁ>Þsl¿·Am½•)Î>ÒQj¿¥»]Ž>î[u¿4‚=Ðña>ðMw¿ó >™)=>ì3s¿þÔ€>FA0=åAr¿@ù£>|a¾®+V¿¥1Ê>"Á¿]á-¿ç‰ï>Ÿ¿tE=¿È™Þ>ºþ¾të5¿²þ>ìÙó¾‰)A¿Åç>÷û¾jM7¿ôQþ>ñ>óãw¿¸±Y>á=æ?t¿@i˜>ô¾¹«_¿çýï>/M‘¾¥/P¿ ? Ï¿RÓ&¿ ‘?Ÿ ¿U(¿e?õ¡ó¾lC5¿? ¿^G0¿k?¾Mß¾dw1¿ß?.Y¿:Ë¿! ?סò¾dË.¿!W?Óùè¾p?8¿;?ñ½÷¾mu9¿ÿYû>=c¿CY ¿ñeú>EÕ¿6Ë¿ë©õ>}ë?¿Â‰Ø¾K?¡»T¿M½¦¾ßáæ>§ËV¿hé:¾3?Ü j¿!#½ž]Î>Eõ¿µ ¿?‰ëD¿#-¾.?´!W¿Úáo½ï ?¹©]¿I¡¬=øqü>±ßW¿Ïu>äMö>Œ/J¿öíô>…Ä>k8¿!Y ?·ÑØ>&¿¡G?ÔIf>&á¿]1/?Ðaæ>íõî¾³aU?5]—>K¿hu2?ÿ@?^ý¾yë8?áE÷>Âd¿.Å>^½ª>v‰>¿Fë$?X94>M¿¼[?I…½¿Â£]? þ³»' ¿“K?=>¹qÛ¾“ÉI?» â>‰]˾Ãï^?79”>šÑǾoK?Ý î>ÞÇm¿Xá&>LUª>¡GT¿×?‰T>fÝ/¿{O9?Æà= ¿°V?5)%¾ó¿ª·V?dy'¾³™Ó¾Ö7h?b£½¼±`¿„¿>@Q™>ˆ¡A¿C$?"Á>Dý¿”£H?Lÿ’»ñõõ¾¾õ]?(I¾eq·¾Õ]i?°YN¾¦ñS¿ šþ>Å„>iÃ1¿n57?@Q™=a¿¹QX?>A¢½p•·¾Õ=j?—9=¾‰±H¿"Å?ƒ>2Y¿—‘J?½æ<£É;ÏIg?>y¾p™7¿M&? E‚>â‘ð¾Æ÷a?Ÿõ»©¿R¿èÙ|>Û?³#]¿ëÉ|>·Ñà>¢ëN¿y‘©½29?©ÝW¿è1ê½u?„GC¿0¡š¾)]?x›?¿£Yɾ ¯?[a*¿Bû¾(ó?J·!¿5a¿ßáö>y¿`Ç3¿Þö>ÿ=ø¾‰#G¿œ¥Ì>ľ«=X¿we¿>ˆÕǾ³EZ¿]ݱ>Ôñð¾Š?F¿¡Ø>{¿~ý<¿ËÕß>Ìíb¿*>ǽá>§P¿á)t¾û?du/¿‘¿ ?Á¿\1¿æ!ë>Á‘྘iO¿…Ç>‰Ì¾¡T¿ ýÈ>A ¿Su+¿u?ÉYd¿B!½¾Ùæ>†=E¿—Åľý0?CË¿8£¿?å¿yç8¿Ñ•ð>} ½¾šP¿¾Ùæ>w-Á¾Š¯F¿üT?g¿IK%¿,ƒ?¾Û`¿ªI`¾¿Ù>ZI/¿‘ ¿ãÝù>ýiû¾n6¿ Ã?§u˾“9F¿óü>Ä]å¾Ã+a?Añ#>ș޾Ëb?P‰+> оñw?p±¢=X.¾ûå{?»a[=A¾ú}?Xÿç»7ÿ¯»ù»?òa6½@1’=ÿ#?m!½°ñ½÷“}?K!=Ÿ!\=ûy?s ½ )¾þó|?Í!i=u/=ú·?o€™¼‡1©½üQ|?=¹>mq­=úÏ~?øÁ9=¢aѽïw?ın>P°<ù~?ßÁÏ=Qù¾ç«t?‚>(a&½}?8I>Ra¾èõs?ý…>à-9÷Ç{?l 9>±¡½óy?¨q_>A‡¾ã‰t?9>]¥³¾ÐEk?XÉ7>}¹¾Ñ•d?q‰>(™”¾Ìac?^M¶>%±”¾Åd?a³>Å‹¾Î§f?K‘¬>Ý f¾Ú«k?R£>C‘޽åcs?1™š>Hmª¾¹ÇZ?¢ Ì> 鈾Á^?ª¹Ô>zqÂ½Ì h?µ©Ò>Oy$>áEs?‘ˆ>ã8>ĵ^?ß1ô>Xá®>ͯf?­ˆ>×ÁA=èŸt?-í”>ü9u>ïox?qè<ž½ÿ?~?s¡²½ÊÁì=ì¿v?é¹u¾ñ ™=ì½x?Òqe¾ÊÁl>×£l?'M›¾=>Üj?Œ1À¾‘í̾~qA?¹?3Å”¾eR?ñÙú>k‚(<¯µ[?]?°&<æÍu?$íŽ>*©¾ð¿y?V™)¾ÎÁ³¼îÏu?$޾b¡=éIq?Hù©¾¡†=Ó3i?‘}оšÑǾoK?Ý î>‹á:¾×¿g?„eÄ>Ž=ù»?`Ì<#1!¾Þ9p?Jy¾€`½Õ—m?o¼¾O!W=å_o?du³¾Ø€ˆ<Õwn?iº¾YÁï<Ö‹m?=¾¾‰]˾Ãï^?79”> Âõ½÷é|?qȽ Áæ½Û¥q?9Ñž¾nù8¾ßq?%!‘¾.N¼âÉr?@1¢¾Ö¥<×Ko?y•µ¾yL;â!p?nm±¾³™Ó¾Ö7h?b£½_Ñ=¾ås?âz¾J 1¾à-p?)u™¾èÁݽâ?q?6¢¾ZôºÛ1q?a«¾Ç<åCp?X©°¾eq·¾Õ]i?°YN¾§AQ¾â!p?E¾b#¾å)o?F]£¾S!½ësq?Mù¨¾p•·¾Õ=j?—9=¾™‚¾ä1o?å¹~¾™ ¾èKs?¡Ž¾!½çßr?G­ ¾£É;ÏIg?>y¾•‹¾æ=r?G2¾Tq3¾ë‹x?M1'¾â‘ð¾Æ÷a?Ÿõ»"Q˜¾á_t?.x¼ˆ>>ìmw¿é4¾ åŒ>Þo¿¾‰a¾óY~>î—s¿y‘9¾[A³>Ækf¿Å„¾ÈAá>Áý\¿øQ}¾Üê>­ÛT¿Nñ ¾Ï?“ÿE¿V}®¾ mÍ>Ôµf¿a‰'¾ôü>°«Y¿mY>¾û­ý>¶[¿9™¾&ý?œMK¿7%¾_ ?«ÍS¿I ¾XS)?w:¿[ =¾0-?/I¿ÿx¾UÝ+?l{7¿mA¾H5 ?ãC¿O±¾ga3?`Ç/¿IF¾Pá(?t#<¿TÉ ¾r‰;?DÛ%¿Ë¡U¾W¯.?i3¿–ÑX¾x_9?O#%¿öÑy¾?‘·H¿YM§¾GÉ#?yy:¿îéz¾u=?CÇ"¿ºf¾‚=?@‰¿þÔ€¾ˆID?%y¿ „¾‡J?‰ ¿å…¾’­F?+¿ e‰¾|e>?0¹¿)Y–¾[Ï0?5µ¿¥IѾœÁO?ë­ù¾E¹¤¾›çP?ô‰ü¾.=š¾°‘T?àiê¾Q¡¢¾¸=Y?­mÒ¾U‰ª¾£“U?®ÕÖ¾s·¾šÑO?Ô}è¾sõ»¾—uK?ê•ò¾•-¾–wM? Ì¾ÓÁâ¾°V?‹‰Í¾} ½¾µkZ?›!;Eñª¾»'_?l ¹¾^i©¾¿ï_?F™¥¾y±¸¾À%`?Òh¾®eÚ¾®Y? z¾ÓÝí¾´W[?ªv¾Ãaé¾ kS?Q¡ª¾ÆÝè¾­¥X?y‘¹¾—áǾÊ3c?9™ ¾Sͬ¾Ïef?ýÀ…¾a¥²¾Òf?Ôae¾„ÕÀ¾Òj?»aû½]žÖi?Þ³¼°=Ó¾Ô·l?ªa?½~qÁ¾ÜIl?ÌAð=p™»¾Ì™i?;Q²=Œ¡Ì¾®IW?ôáy¾â=÷¾Å7d?¿¹O¾ªaϾÖýk?*‘$¾n‰´¾Îk?.¾jÁ»¾½]?ù»=¿Ïkh?õä<¸!Ö¾Úl?‡Áü¼‡5žµS[?Ké)>ðùù¾Àc?A>Êùâ¾½Å[?|9>Üõ¾» `?ØI]>¼•ݾǃe?õ‡>lyµ¾Çgb?I½Ÿ>S±±¾Êb?zE>ªñÚ¾§#T?aý¯>Ç)⾩¥Q?ÿX€>#¿ŒõE?n‰¼>!¿ž·M?ù‰> ׿ƒ‰C?›©È>E¿¥O?‰>¿v7??Ì]ë>âéõ¾²g[?-!>½Ý¾¼b?$–>vq»¾ÊOf?:=—>:•¤¾´ÉU?kñ±>³EÚ¾­5X?h=¼>AǾÍÍc?3¢>Z-¨¾ÃÕa?JAŸ>\µ¾§#P?ŽÉ>±ܾ„õC?­ùÑ>Úý¾†=A?y?Œ¹Ë¾£=?ûuÿ>ÕAæ¾hé2?Hý!?`­ª¾m97?'÷?š±È¾Hm&?n4?$ñ’¾XÉ/?6ç?Ž!Ⱦ,ó?mA?5 ’¾«ÑW?²ñØ>X‘©¾°ËX?ºeß>+¡›¾”3L?÷Íý>fݯ¾€'A?*?1•ž¾kI3?Z½+?Ý™y¾H§"?„+@?…A9¾¿ ?£P?v‰:¾É­é>À•\?æ!c¾o»8?W±(?Í!Y¾mW4?Qi,?Û1e¾a-?o/5?¤QQ¾S +?v:?`9"¾Tý&?wõ>?4¡ ¾!Y?¢µN?‘Ñá½óYþ>ÁW\?Õ‘ã½ã?¶/X?çì½)??ŸN?~Q½2É?—‹H?«Aؽ<ù?ŒÛH?5a»½¦ü>¾1\?)¾8½›>×Ùl?Î9h¾ý¡ù>™+O?I½§¾·%Ú>¬W?M¡«¾yyº>ãn?ÁáE½±‰Ü>Öãf?Šý¼ ‰?¾ÝZ?a½É>ñó{?®aÆ=7á–>çor?ê°>®eÚ>Ô)g?¢Q=‰ ?°9W?‡À‘< ˆ>àós?A¾þ,†>ÔÓk?+5“¾`‘·>³{Z?ˆÁ¾cA¹>³{Z?À¾wÙ·>¤§P?ÊÅè¾$ Ž>²½Z?ÆÝà¾q´>ƒÃC?; ¿ÂÁ^>ªñV?òÍþ¾s¹¹>€-??±¿¶1Þ>h[1?+k¿áA>¯±[?íEô¾sÙ(>ÿY{?“À½Á‘p>ðmv? Ù ¾y=¸>Û£k? ñ¾V}®>Ó‡j?´X¾taÄ=û­}?H1À½×1n>àõq?õ¹j¾„¹=>øÃw?Q1.¾o¼>¸­]?bM­¾ºÚ>¹\?‰¾w ?gc5?Õ%ã¾@£ ?[A/?må½¾a34??ý¾ŽJ?Ìíæ>® Õ¾ŸçK?xA¼>é¹õ¾¯µS?oÕ½>§Yؾ®EW?>ßùõ¾/Á‰=øO?‡Âç¼Ùéw>çw?¨QȽê±í>¼±\?¸éO¾XY+?Yû+?Hm¢¾«ËQ?ª)Ù>„Ež2é=öE~?±<<…¤>ãr?îAH½â!ì>»µ`?¹¾\2?YÁ+?=ƒ¾Q>ö]}?A€ŒÜp?Æà½Ñ±ë>Ä]a?µÁé½f:>ÿ—{?È`=fùº>áñm?ÊáS½d±=>ó{?Ö…=±¥[?F±>ûû¾±ÛW?u?>þ¿¥1R?ût„>?¿ž_P?)u™>ôÅþ¾œ‡K?vQ¼>Ýéö¾U‡,?Ÿ?Ó¿U‡,?Ÿ?Ó¿;7!?$Ó ?a ¿m ?\.?’ÿ¾ãQò>†«C?¾-྘ùÎ>¥U?†!¾l±³>½ýa?DÝŸ¾D…¢>Ù=i?†¾¯CY?Mù0> æÿ¾¶õW?Lq5>ÿµW?=¹>Û¿¯™X?V‚E<g¿²×W?q¾Ÿ¿¦U?ª™e¾¿¤Q?3ž¾zù¾½O?\ɦ¾û]ø¾§I?v῾ôMú¾„ C?³ ؾçû¾fõ2?y¿c¿*á?jõ1¿¹Uྩ?v‹<¿xAľM½*?PS+¿[±§¾UO*?T*¿`=®¾??Y-¿˜Áо6é?`«,¿Æ…ã¾ a ?|e:¿±MÚ¾ ?a-¿ þÿ¾Ýyò>‰ F¿µ×¾ƒ?\å)¿E ¿Ð á>z9<¿¿/ß?Âþ¾6¿;7?Ïõå¾K&¿Z¹/?*©“¾Pã*¿f÷4?Ï1p¾SÏ*¿n‹:?Ÿ!\½]Å.¿nß3?*¿…±Å¾^,?ƒ¿}¿D ?óYö¾9C¿•óI?«=ྀܾͭó>?n1·¾Ï¿WA(?Q½¥¾X;.¿· Y?IK¾ñ¹û¾‡3C?p™3¾Di¿e«3?åÑí½dé3¿¶M]?Þ = S¿¢³T?Õ =/¿ƒ£@?ÊÀ=OÏ'¿ni9?ÿAä=Z/.¿r5:?ÆiX>O!'¿m:?“ PU%¿w÷MÙ%¿‘ L?3Á>+M¿`?0?¡ ?ܽô¾ŒC? í—>&U¿g_1?—UÈ>9 ¿fƒ4?€ñ¼>;ÿ¿Mg'?!#?[¿ë©ý>S-?« ¿Æ‰ç>‚S??ì1ù¾Í?ŽÍB?†!ʾ3Å?Mõ$?Ýyê¾ó ?q‘µF?Û5ñ¾{ù½>©ÙW?€-Ǿž±Ï> ‰P?«=Ô¾‘?gE0?Âÿ¾¯•Ø>~É>?í¿W ?5E?3m¿7Å?nß7?huº¾¥ ?yé>?‰Ñþ±ýÜ> Q?Œ-ľy?›B?Cɤ¾>Y!?R',?•ƾ<?HQ#?Õ‘ë¾_µ.?µ ?*û¾y“;?'ù!¾To)¿^Û+?i­°¾Sé'¿z??¾:“¿S[&?Bé#¿§­Ñ¾cÓ2?.S¿¦µÙ¾ÿ!ý>­¡X¿›YK¾'ƒ?‚;D¿&‘¾ŒÛH?“ḽ:¿ŸåM?ˆ¡E¾ß¿š—O?‘¹Ê¾À•ܾ¨ßU?%Õ<… ¿´ÉY?Á­½Ç¿¡R?E‹>û®¿±OX?ÞÞ= ¿‡ýF?Y¥¤>k ¿W“+?1?æ­ò¾T+?î•ù> í¿º-á>Éb¿KY&¾û²?fÁ0¿ #¿E¡>Ù_j¿ú|„¾ˆ…Ê>±ÛW¿keº¾¯#Z?h!=»¿Ãe]?c<w¿ˆ…Ê>±ÛW¿keº¾ ?’F¿N)§¾Ýyò>‰ F¿µ×¾)—?oŸ5¿’­Æ¾ a ?|e:¿±MÚ¾??Y-¿˜Áоçý÷>O¿L¨¾*U?nM:¿y¾M½*?PS+¿[±§¾•Æ>´9^¿B™ž¾› ?•+L¿-ˆ¾W¯.?i3¿–ÑX¾¶Û>Ë×a¿AG¾c ?¢%S¿²÷½Pá(?t#<¿TÉ ¾¹qã>Ð_d¿Ѩ½û?Á‘\¿bg½H5 ?ãC¿O±¾‰™½>×Ám¿¢AмÊê>Ì›c¿Ö¥¼0-?/I¿ÿx¾\å±>à½o¿A@=´qÜ>Êýf¿m¡¼_ ?«ÍS¿I ¾–íË>Î3j¿HQ‡=àñ>½a¿-A†½û­ý>¶[¿9™¾¯}Ù>Ͻg¿«ö;¦¹Í>ÌAh¿Ðaþ½ mÍ>Ôµf¿a‰'¾}Œ>å³t¿§‘Ö½Ün>ëv¿3ù¾óY~>î—s¿y‘9¾ ù>íGz¿Uù¾Â¡×=ü«{¿Y¾ˆ>>ìmw¿é4¾~áµ=üm{¿V™)¾B‡<Ò~¿h!Á½qè¼ü~¿ÔÑñ½†qG¾üÃz¿!N=õ¾ë«w¿}@ ò%ô¾À ]¿^(>C$¿d=5¿¹•>1±¿‚=¿@Ùœ>ƒ/@¿ï¿´‘Ó>9Õ¿<¡¿Øó>†!F¿aQ©¾ = ?MÙ%¿ôÝõ¾-_?‰ÑC¿v>¾;å?Vñ¦=ù¿H¾¼7q"¾òíy¿=¹>)±“¾ÚSj¿%Í>ïÅï¾ÇH¿ªIÐ>hÍ/¿1¿ë?’YE¿Lq¾É?oK¿©¾6?¥ÛN¿\!l=+?Œɽë;w¿âu>@M¾Ç›`¿i©¼>ŒÙ¾– K¿Úqó>+Ý¿3m¿í ?t%:¿V²¾,c?‰CF¿TÉ ¾7ß?‘›I¿£¼C­?›uJ¿‚©F>)•?2{¾¸É\¿Æ¥â>vm¿¾MF¿“?å%÷¾U‡,¿$+?Re,¿Äà¾3‡?“SG¿¹G¾.«?™L¿NAž½,·?¤ýO¿s¡r=-y?¦Q¿×ùg> 5?NE¢¾“áL¿G?»ñÞ¾| ;¿?0ƒ¿!ç¿Ë?Š=D¿@Q™¾#k?¢aQ¿‘ܽ%­?¥Q¿Mƒ"¼)±?£yP¿!Y>? P¿A)¢>ç9ú>œùž—N¿¾¥ä>©¿[?1¿äø>nù4¿ðQï¾ ß?®)T¿Oɾý ?®IW¿‚c<w ?¡MR¿2ô=½?‰±H¿Óùp>(?™-I¿2—># ?s…7¿ñÕ>Û?ºIä¾ïC¿Ì™í>(·¿;q¿¯ ?q‘;¿_í¨¾9_?ªóT¿ï‚½! ?±o[¿€aÙ=?­§R¿+Ù‘>ò±û>r§8¿Ëé>c?=)¿6ç?³?úÕü¾dÉ4¿ß??S¿8M?ü9ý>(»¿N·$?ÿ?D‡ ¿0?šÿ>y ¿\/?óYö>DÝ¿Jµ'?¶¹Ù>´!ß¾š P?›Æ>á ¿ˆ¡E?Y‰©>}¹¾Ñ•d?q‰>]¥³¾ÐEk?XÉ7>#g¿‘{F? Y>T§+¿Aõ#?Ž­¿>[³-¿-w?Í•á>B“$¿.q?ø¥ö>@3$¿d0?NÕ­>gc1¿:?¤Ë>YÁ/¿+‡?ªñÚ>f4¿üŠ?ù…ÿ>…±A¿ëó>Ö9æ>d±5¿Û?¤QÑ>c)2¿>¯?‰AÀ>Í¿nm5?ëî>¶ß¾¸[?=>i1¾È'h?‹©Ä>ä1c¾Ý—k?<ù¤>-™“¾‡ûD?*å?Z -¿77?¶MÙ>›I¿Èyç>¶Ö>—qC¾~>?CU$?Fy&¿‹?u ?–ÏF¿ÍÍß>Þ=è>j¡´¾+÷?€'=?+û¿ƒ ?A-?{A¿‰AÀ>á ?¼Éß¾ä½ò>‡§C?8¿£Ô>T,?ŠUC¿E‰>*?«¿Í’>–yG?X9,¿=¹&>vÁ8?—ÇJ¿í¸>0Ù?‰ïD¿ –»?#?Q1&¿¡…¾iå6?1í¿ ‰¿,)?/‡¿='¿ï?B%¿ãÿ¼†¯C?/á¿áaZ=“áL?7û¿Ž‘<>˜‡H?=E¿9>Ž‘H?0¿h!1>Ž[H?1A¿Ú ½œÅO?!Í ¿#1¡½®×T?6¿¯!X¾B?L©#¿œù;HÁ'?BÍ¿ç5ö¾9™ ?~Q¢=ôù|¿¾@1’=öy|¿¾^¡¯=ôk{¿vq+¾@Q™=ýŸ{¿^,¾q!=÷?|¿JÑ*¾“QŽö—}¿nQƽ1ѾùM}¿WB÷¼ö˜€¾ðw¿B±•=¬qξÍYg¿1>¹ ¿ŸWP¿ÁÉV>Ói徸Y¿.U‘>æuô¾’wJ¿„ñÃ> ¿tA9¿»Õã>,ó¿Oy(¿ômù>ș޾Ëb?P‰+>†ü¾ªeW?É!b>Ä]å¾Ã+a?Añ#>Îáj¾à÷o?ÿ$†>+1¿ØI]>ŽG?0õ¿å¹~>ˆõF?ú ¿~ý¸>qI?›YÓ¾ê=í>»H?£ÍѾá}õ>‹§F?xAľÓ?Š;B?Ñéi¾N $?¡;?Ž‘Ì½g}2?cµ5?ÏÀ=s;?^.?ê°>t]Ó1k¿q†¾3ž>Ø·k¿t¾W]¯>Ù_n¿ÝÑÿ½á }>øýw¿ƒÁµ¼{IC>ï7z¿rÁ¹=S±©>á q¿©Át=e‰¶>ݵl¿-é>W!5>õey¿&Q¾Û0Š=ýi¿¨ƒ»tÑнþÑ{¿<¡>ʉf¾ëãq¿Ýas>q!/¾Ò‹j¿j…¹>Þþ=ð£v¿È s>4Ù¾É9a¿ÂÙå>VŽ=ëás¿—>¶1Ö½P}¿¦ñË=‚¼¾Ä]a¿Bµ™>É­á¾±ýT¿Pq¬>b³¾¶i\¿k ½>!¾ºÝ[¿ÁÝ>·íÓ¾¥÷U¿k¸>P‰«¾»\¿|}Å>¥MÕ¾˜ON¿½U×>ѕ𾔅K¿•aÄ>˜½Ì¾µ]¿9 > Ò>õ½v¿¬‘½=(™”¾Ìac?^M¶>mý¼¾±ÛW?È>%±”¾Åd?a³>paµ¾¬SY?˜ÁÈ>Å‹¾Î§f?K‘¬>Hmª¾¹ÇZ?¢ Ì>éí÷¾lÑ6? e?Í‘å¾s×:? ?‘í̾~qA?¹?ñ½ÿ¾`å0?¿?Þ=è¾€ñ Ù¿~ã;?ÑAç>É羌E?Åç>P¯¾’ÍI¿í?Ê1á¾uÉ8¿É?q=²¾£­N¿êéó>±¥ß¾ˆÕ?¿Êþ>/Ý”¾­…U¿Öð>UÁ¨¾¨ÿP¿ôÁò>5 ¾Íéb¿Éqß>ɾӃf¿¢AÒ>E¾¼Ñ!l¿]Å>Ö¼êq¿Qõ«>‚©6¾ÔEf¿Œ-Ì>xñ¾¾¢ïN¿Û5é> Å¿`É1¿³?"o ¿B“$¿ Ï?S¿81¿ƒ?Øaä¾÷B¿ß©ð>"ã ¿Z·-¿ãÁö>4׿?¿?:­¿%¯¿¥ ?š±Ð¾œMK¿Ó½æ>/M‘¾°¯U¿Ý™ñ>I¹«¾‰yF¿ý?¥II¾ÃÕ]¿ÏÙê>4i›¾kK¿™?·aÔ¾Vc-¿/‰?žíɾy];¿=?ºÙß¾v>¿ á?ÙÑè¾>? ¿A-"?g¿&Å¿1?Éqß¾I+&¿9? ¿]¿J_$?ôü¾/ ¿U1-?HÃ!¿0ž¾eß5?^0¿‹ý½¾;9?w…>¿–YD¾PÇ#?wŸ?¿U¡=X)?| =¿²ñà>í?· ¿œ‰M?Ïu>§u˾3=¿= ?8©½Ü×m¿m¸>ca½Ù?k¿™-É>[é5¾Âia¿Óùà>®€Â¼Þp¿T©±>µ©J¾Ãea¿ÁÜ>· ¿œ‰M?Ïu>€?€?€?€?ðá— >þ}?B]>Ãõø>{À<>ffö>Ù²<>ý î>X>¾õ>W>B"í>‰Dq>ð5ô>ˆÙk>Agê>‚>sÛî>e~> |å>ÔóŽ>h$ê>­Lˆ>‹ÂÞ>)u™>°â>ÐE“>ƒ¤×>(-¤>E€Û>ÊQ >RïÑ>¥j>½î>ÉU<>_{æ>àØS>^ ä>Ûf>á²â>?§p>Ù—Ü>T>ò{Ó>0öŽ>›WÍ>œ>'È>pB!>Ž å> #=>;‹Þ>ÿ•U>`éÜ>YÃ%>ó8Ü>øÃ?>­ÂÖ>d[>¿îÔ>¯?)>sfÓ>¥öB>âÉÎ>éÒ_>–íË>Êß}> ZÈ>˜QŒ>ù¿Ã>\˜>N¾>Êþ©>c}Ã>0¤>î?º>()¸>kÀ>V ¯>d¯·>v§+>Ñ=Ë>ÀD>âÉÆ> pa>O=Â>ɬ~>TpÀ>½ßˆ>»>{•>¥¡¶>TRŸ>襲>?¨«>Z¡°> ›q>ö¹> þƒ>ÅȲ>eþ‘>Åǯ>ò"›>u’­>›>­©>¬à§>–{©>Ü–>AG£>ƒm¬>mǤ>K˜>®×œ>þ›¯>*™>]–>Ò5Ã>„F°>GYÇ>úb§>W^Ê>ŽÈŸ>”/°>|—>ÏMË>#º—>ºe¯>¢™>·–É>£>Zg¬>¤â‡>7QÃ>h†>#»ª>>¯€>&áº>ÿ<}>*ȧ>>wr>zߘ>}–>Ö:™>®,‰>—Sš>ir>xò™>ct>‡N—>¤f>Öq¤> e>Q•>LY>(ñ¡>F²W>½á†>êy>?‹>¾¤‰>bLŠ>Ý(‚>ÔÔŠ>ž˜u>Í!‰>÷Ëg>¾Á‡>3SZ>›u>ùM‰>ox>a‚>¢cw>akv>Ûût>¤qh>QNt>ØòZ>ø\>ÿy‚>JC]>Ìaw>¶Z>‡Åh>—ýZ> ÌZ>|îD>L7y>ÓJA>l?i>eA>Z>@,>êØa,>`Y>sK+>l y>˜¤B>*„>·{)>_ …>•Ö?>_‹>p>%>¼W>èÙ<>jö>+N%>ä’>ùƒA>…@–>½7&>öî—>ðMC>3Ý›>¼(>ÐFž>ZD>E¡>¸#>Œ¼¤>ƒ2M>‡§>MLW>õŠ>jÀP>gð>¦¶T>í-•>n2Z>î$š>"‰^>jŸ><¼g>pÒ¤>ƒno>ò©>¨l>f„>²In>¢'•>—Êk>™™>Tþu>.ª>II>»í¢>šƒ>.§>.‡>A¬>P‡>øÅ•>)y…>#¾›>­‡>–¡>CÉŒ>_ì¥>(9?z?G“+?Ÿ~?×m8?½y?$ð/?Rºx?|6?êu?7ã4?ªÓq?ž@0?(Fr?Y4%?¤qx?½R"?Þr?· ?å x?¶H?.«p?@ ?°:v?Vf ?ëSn?ŸÇ?ILt?»Ðü>¹l?·~ê>CSr?hÍç>4¿j?&×> o?ÁÄ×>¦Ñh?›âÉ>quh?Îm&?q«|?¡?˜~?@ˆ?MN}?ˆ¾?žA{?Ä™ï>­öx?6‘Ù> §u?Á©Ç>+Ûo?EI¸>€ e?é)Ê>øv?x{¸>Þo?j¨>Oe?Õ¦>s0[?몘>ÞU[?hy–>•Q?MÙ‰>žyQ?‡>y"H?eŽu>±úG?Ó¥o>ß2??¢EV>±¢>?·ìP>ˆ6?ô5>Do5?Hp»><-w?Øcª>Ín?Ø ›>K?e?dŒ> v[?··{>¯˜Q?5š\>›®G?ж:>Rï=?<2>Ý\4?ÑÊ­>Ùyw?=›>÷çn?#>àœe?ÿÌ€>ù»[?+c>ÑyQ?xcA>_@G?ÎP>º‚=?é¹å=cÕ4?øü >]x?Bë‘>À\o?ñhƒ>Œõe?…&i>˜[?&4I>¾0Q?DP%>¹§G?ãõ=ÏÙ>?Ò¬”>ßÄx?0Ø…>h²o?üÈm>ž³e?B@N>ÇZ?¸=1>ëQ? ý>ÉËJ?zÿ‡>h@y?wq>"mo?GãP>±‰d?ôà.>Ÿ¬X?3Qt>Ügy?ÚVS>ɰn?üU0>íÖb?’u>ËöU?sLV>Csy?ÎU3>¹úm?¥  >"5a?À®6>ñy?†¯>UÀm?€ÒH?QM?–´N?ýÜ?¢BA?½Q?»€O?dç?õgC?÷Z?…°N?y¯?“ÇW??˽4?é› ?_î;?õ?h(?«” ?¦.?K“?È—?J( ?b„$?{…?î`?Õ‘?e?l?ð?NB?Õ¯?g` ?:uí>Ó?ùö>ºk ?\ÌÏ>¨Ç?k‚Ø>£X ?]ùP?Z¹?¥1>?‹þ?{M3?âæ?Ó*?¬s?,d?B–?"Ç?—Ê?FÎò>¶-?ùÑ>cÓ?Ë¢P?dÉ ?ÙH?Åu ?6[=?DÝ?š´1?ù?B“$?ÏØ?ü ?þH?–ëõ> n?"ŒÏ>Ò¨?xbV?À'?ÆûM?#/'?•,C?Ÿu%?øù3?ao"?Áæ$?!?¤7?FÓ!?sô>éÔ?ÃÔ>“þ?· Y?s*?QÚO?Š*?ŠB?‡1)?¾3?Mó&?0'?Þ%?š}&?Âi)?Âà ?Ö,?wL1?Xs0??à-?¼5?8ù=?ï©8?rZ?0?´rO?6x/?OçB?1ï-?E·2?÷°+?².Z?æ5?ÄM?LÇ4?OA?À"3?lW?˜:?L?yu:?mýT?²+A?#F?âW@?9Ö5?îî=?¤ú&?Æ:? P?½¬1??Æ16?„Ù?ª .?‚S? §4?Ãõð>;+?__ë>Ü‚1?Ò4Ø>º½(?37Ï>"ˆ/?wH?­QG?é:?’E?È™*?ïB?x?ÛàÇó9?9ä>г=?rmà>à7?•Ì>ãª:?XÊÊ>µ‹5?¯Z¹>.Ë7?®½>ˆK2?0*©>|¸4?HÀ ?‹ÃM?ge?ØbK?¢? ¨G?O]á>>ÏC?†’É>~@?á$µ>üû³9?–>É7?~T ?¡òO?½U÷> ýL?‚7Ü>ÄÍI?´èÅ>a¥F?öE²>»'C?}£>/Û>?² ì>?ãR?çS×>Å«P?cAÁ>M?7²>"9I?M÷¢>LŠG?„’>Ž??¬á‚>Ió7?·œƒ>g 1?ßáf>£0?°Ò>îAX?O°¿>BìT?3k±>rùO?Ô Ã>wÚ^?· ³>eoY?ð÷£>`#Q?b”>ôOH?‰`„>s ??B•j>J`7?BM>[{/?(K>ÊP)?/>å´'?Eó0>>.?ä¼>ª%?íÓ>±O,?­Õ=3$? 6Î=å? ß=Îÿ+?L4?qp?ã1?‚k?bƒ5?OLd?‰ïü>À%\?±ø?ñ¼T?F±ä>žb?èKç>À]Z?œ¢Ó>‹4a?†u[?ÒB?eÿX?ósG?PqX?5I?;U?×gN?ÔbT?UmO?ùhM?VT?“ŒL?×ÙT?lF?Ô Y?ÖRD?!!Z?Št??µÿ]?v¥=?Id_?´Ê8?‘™c?y7?° e?»\?þ™=?/‹]?¸¯;?òÎ]? ¶9?U†]?&S5?¬]?™~1?°\?ï:/?¥[?’•+?6[?¥Ü)?p}X?Îp'?t—X?Í?&?X?ê%"?œQW?ú?Z¸X?†?q¹>îz? ‰¼> Ã?6W¥>Kr?Ù­>Ž?Öš>ãÁ?ê>‰(þ>0g–>¨?†æz>¢ñ?ûæŽ>' ?÷¯|>~ ?¢ïŽ>@N?ÑÉr>óè?ŸªŠ>Xr?¸\½>Êß ?æ²±>þ ?· §>6 ?CÀ>ž–?Ÿ³>õ½?™g¥>ñ»?ÛýÂ>0¹?Kv´>™š?±j >1(?äNÙ>{"?XÄ>¬9 ?®e²>ãl?æéœ>ÐD?Ÿs‡>´X?uæn>Êá?ó m>[î?ÚSR>¨S?QjO>®?.=>cð?þž8>äh?dÂ>c_&?i©¬>ca$?¯°˜>Ý& ?&Œ†>Tq?Ék>ün?úAM>/?»&4>°W?ú˜>Ï%?#†…>üÿ$?ÿh>ßo$?ãŠK>VF#?nj0>ïâ!?T>¼?÷É>À ?¬¬Í=Έ?M ˜>üÇ*?¤m„>Ø×*?G¬e>’A*?p•>Œ¼0? )ª>öï.?[”©>Uß)?÷¸>¥¤+?F@U>Ç ?X’l>5A?;âP>†â?¬O>y­?>A2>Sv?d?;>xAü>ÊÅ>^¡?0A>²ö ?‰Ï->¼ê?$} >æÍ?e9)>ƒ ?œÀ>%@ ?$$>ŸÌ?°T÷=¹« ?Öå=_Ð?>¿,?|~Ø=>?À®V>Äíø>×Pj>eÆ?io>'„ö>hƒ>}êø>èõï>‚;$?py ?Æý'?íôƒ>Χö>v3‹>K=ó>Ç-Ž>›tû>¹¦˜>óVõ>©Û™>PÅý>-¦>=Ñý>(î >/Nì>#«>À]ö> ¹>7‹ÿ>A²>Úrî>Y0Á>yø>ÆÂÐ>ë?ŒgÈ>eÅð>nÙ>¦ û>Cí>kŸ?Rcâ>LŽó>Þ­ô>\þ>Ñ!?wI?Åü>§ö>"R?v¦?ôÃ?Ý?*ä ?‡ú>æ•?Y?&Ä?å_?Îm?•Dþ>¯`?_ ?!“(?m ?¯³!?ŠÈ?ƒ0+?×÷?¬©4?n ?Ä|-?þÒ?O@7?¡f?½A?Êú ?ˆ9?Öt?fJC?‰x ?ªšH?&9?JÎE?ô¿?†? %þ>aáL?´?ž#B?¾M÷>f-Q?ûÿ>„E?Îûï>ˆgU? Öø>.I?O$è>;VY?Páð>¤§L?÷ß>+]?çŒè>¢œP?YÜ×>š“/?<÷þ>\¯1?ué÷>÷3?ˆð>|6?AÕè>ŒK9?×à>J~¡j@?qÐ>©OF? ÀÇ>~ý$?:Aó>k€&?që>±0(?yYã>².*?ê Û>‡¦,?CÒ>ä×/?>èÉ>ø4?5 Á>6v9?þ·>ß¿? Þç>=š?ÿ]ß>·?.­Ö>ýL?`äÍ>\’?6Å>Ì"?@ù»>an'?•™²>ßá.?ÿê©>îÏ ?ÚÅÜ>4ö ?¥Ó>b†?XqÊ>ÿÍ?‹OÁ>ží?‘,¸>â?Ø®>Ò?•£>î—'?1&>—?ÆàÑ>Mf?#È>‚?r¾>h°?@µ>‡Œ?!¬>‰™?zq¢>Æ¥?- ˜>Úæ? ­–>…²?W³Ž>Ï„æ>·îÆ>4Úâ>F"¼>Ôcã>lx²>aŽæ>Rï©>gé>ç6¡>5 ê>}ç—>ˆöé>¦E>dû>‚ä…>ØÆ>Ú;»>?Ç×>™õ‚>¼è>LRy>u??ýˆ>þc?«Ío>tÓ?it>!­ ?B–e> Å?5h>ªî?CãY>œ¦+?V·Z>ÊT1?9ch>‚;$?üv>ÙÍ?eÈ>?ïŇ>o-7?¢Ïw>º)?ˆ€ƒ>ˆÖ?ÿω>¢{?C¬Ž>Mg#?‡’>3.?˜‡Œ>)";?8,…>O\J?ÅÊx>¢CH?²c> LS?ümo>ðýQ?0Úc>¥L?‡>bÛ>?h>w3?r¥–>óªN?Hm’>`!C?t™š>Q¾8?"O¢>b‚R?䃞>ò°H?³ë¦>p(@?®.¯>‘™W?~o«>¤ÞO?Pq´>~RI?$ï¼>D^?ž^¹>l•X?-´Ã>6WQ?DÈ>*ãS?ÆQÑ>¨`?|ß>Mb?ÚŒë>¤pa?Tî>n0\?ÖUÑ>d?S]Ð>Äe?†ÇÆ>d°f?¾‰É>¡¢f?ŸÇ>'3f?’æ×>ô£e?=IÚ>¬e?çÜ>Bíc?Æàá>†c??ä>:æH?Âû?´åH?¬< ?z¨I?âw ?3OJ?´= ?ûåK?{1?úL?¨V? òO? Œ?¬¬Q?ÅÊ?IU?ì3?t$W?~ü?ˆ×Y?ïtÿ>Lú[?/Ýü>å*^?1³÷>Ç_?“§ô>4g=?æY>‹àO?ƒÝP>—RO?ŠN>(ES?QkZ>„~f?Þ!Å>Üc?ÝÍ»>Š-è]?9}­>êÎ[?•G§>¯ZY?®g >©ÝW?ï7š>aàU?S”>ÉÿT?£=Ž>qWS?)<ˆ>ˆÖR?¾ƒ>Ú7S?{3z>\ªf?ÚÿÐ>•f? cÓ>óª>j¼ä>”i¼>2ç>—Ñ>5é>,ê>…éë>Eõ?:ï>ÏÙ?’Íõ>"6?0 ÷>ÄA²>I.ß>0Â>iß>`Ø>«•á>¤Äî>QÚã>€?¬Ää>QÜ ?Wî>XÇ ?y°å>ïþ? ð>ß3²>/Ã×>¤PÆ> %Ö>ôNÝ>3NÛ>|î>oÛ>õ?TqÛ>:×>+MÒ>]ë>^iÑ>È—Ð>”…Ç>ù»¿>Ò¦Ê>BC¯>ÑÊÍ>€~#?Áªú>¢B ?à¹W>Fú>Šb>;Šó>!XU>ÚtÜ>]>ŸX×>T5Q>4ÚÂ>iU>[aâ>Ii>LàÆ>µá`>u¯>2rV>¹nÊ>†sm>lx²>e7c>ŽxÊ>¤x>qtµ>—áo>ÚãU>fÙ»>}±W>±¶> ›A>ÇØ¹>@‰?>mâ´>ý».>ý2¸>~;)>J~´>Ù">h º>ŠÊ>)¯µ>Uð=2À>̶³=ôP»>;è=„õ¯>\r>é¯>ûÌ9>8÷¯>`;X>H±>so>Ð{³>V€><„©>(D0>T¬ª>Í”V>|)¬>Àr>ì¯>u:>?¡>ÊÀ=¸s©>±ú£=?¤> ·<= ì¬>È”=©Ú¦>©÷T=Oœ>AÊ=D¦œ>÷>ñ/š>eÌ=c{•>|ñ>Gé’>ƒÝ=Öá>Åî=[_Œ>Üc©=y±ˆ>¹UÐ= `‚> %>èŒ>q>y²ƒ> Ný=¡w>[{>z¦g>Ž>Á§Y>L>\èª>½ƒ=d´>æ>„½Á>å³,>= ½>µl->ùKÃ>ÓPC>ý£¿>Õ@>ƒj{?opensurgsim-0.7.0/Examples/Stapling/Data/Geometry/upperarm.png000066400000000000000000127707461277777236100245100ustar00rootroot00000000000000‰PNG  IHDR=ÅDgsRGB®Îé pHYs  šœtIMEÛ )6 qÖ*iTXtCommentImage converted using ifftoanyoº] IDATxÚì½Û’$IŽ%†¨™{dUWÏ Eæ‡øB‘%…ÂÛÃ,÷eEøÙ+n÷öeû^ÛÕ•n¦U…š™Gf•ìcøŒTgFz¸›©é888Ûïÿù‹…ˆH+±Ä/0½ó2‘ùÓˆÈÀˆ~ňˆ€é¯þR%²ÿûù73­{52 ¬ëR«h{l*¥™š€˜²öQ˜Y˜¨ª©2³©íû`Yʶm@æ×&U]ÖU˜ ™ˆˆHÕJ€""ÂF$ 0fffS}}}}<^µêº®e]„ÅLÉè~¿•Rv­†°½½¾xyyÙê¾=¶mÛŠ@¦*"ß|óͲ—R„™ Uf^)¥ˆH.¥0óí¶ú#(E–eñ‹Z„¥3û;9®Ì,ÂüÏD´ï{­ößÛÕö}73`>Â`ÓÚ‘ÖZEd]#Ú·ÍÒTU"25#ûëŸÿôÛÿò+­Ìh0@`d>[Àì3>¬ ´YþïÖ¿eßv"*¥ôOŽÉÊÌ ŸV baüÍŒÂ,‹ø}ÕªDFc’?ʇÈÌ|ú?¨™©™‘•Rˆ ¦º«j%"ƒÕ”ߨ¦ªº×ªU‰HŠ,¥0³)̇‹™Aàv­>ÏkÕªUÕÌü=â×ã×Ð*@Õü|Üü)›™1ÈEUý×·}ßëÎÀº¬>b>´f¦Z(.žLUU dd ò·Äˆˆùø˜õ%ÿØ·ºWZ–B"ŸöFDd¤f ˆÈº."BFUë¾ïUU«‚@éaÖZ«VfY—¥”âCéßž§\zøÂáŸ|ê˜ZmØÌÈÈ/2¬‘ZŒµö˜K¿G€@ý7Ú—ô)£jq ö=bß÷mÛÔüÊѯߗ€¶¯S­ñ DÌ`‘Žëñ Ïâm±‰ÂLkÕZ«?b´}¦MxêÞ§Ÿ¯µ}Ûüj­fæÛ…ÿ«€ýÂü_CäËÊ·ÖmßM-'·ïj3Íj­~‰ªj1=à[™‰HY–RJûX¨™¯_w¾ešÙc{ìµ–R–ea€Œ”Æ&oÔå7&‚&3¬]£/”mÛDøv»ùTµmß´ªùÿµOV3Õêó!Î añg›Ñt ™?5Í»?qŸE1Ù€ZwU‘ß ªúÜð·õëÞÆÍ²0‹0Õªm²ù®®ªFf6žu\Á™¿Ýw°1 >Œ}-÷ß­ZU•™ýªªVø²é+ÄÝ,ÞÆ,…E„ ªµê˜º ¨Å·ôl)`3Cq‚Äy¨êÛöPUaî[JYËâ×ßF€b÷4ª¦µVý˜óKõkàO0År³åSÀ/óC­j_ ûÉÛÇä07´]°_LþLf&ÀÚBóåí[Èx@~µÝ[DÔŒâT‚ˆÄÇš>›©.ka¢é¶ ’Úñá¿  _˜~ô”ö»¾?ûŸ«ª_Ò¶ï¾ù‘?ˆ¥½?‹ù±JDfÛ^Ó "ŒÓXùxúF”·»]ÕÌ„YÍM,ÒMŸuH+Î?Á·£½V3+" T‹Ïñ™ldšžK¬Þt\‘Ÿ ‘,…ˆügDæG­ªnÛîUŠx`Ö§Êã±½¾¾2cYÖvþ³”"µê¶m>E=ŒéS¥ï±i‹Q>|YDÌìñØú¯øaä²ï›ªù’ìÛOp¢ˆ¾”¥ˆˆo•þàÔȃäü Ú¶Oª1©LµÏ±Ø+j-¥ˆ Ððë©J~Íð9cã(éãï[åëÛÛãñX–å~[—e©µnû®ªè»àû¼‚ã„Jû¤(>ÔEdYbl÷½šELë[¨Ÿõ3ûQaªÕÃ`)bDµªªÆø ,ËBDÛ¶ð(ݯdßkßjbV«î{í“ÓèÛŽ™Ñ£ôZkUÝ»ïä‘›ô@®=}øjU3mkÎÈ Èák âðbfTU_/"â³NXúHæ%ìAoßžý£¨­èv±îü¾ü¤ðØÞ£Ùó”ÓñaDÇs›UÖ§ªy°£ÆÂ ø¡ßƒ±Ÿçm䜆øÍ¶Ï¶w²ØR@¸ýôéÏËgT$€üœ=% :/Ã9]0|ØýkêngD^}l|‘ú¶=…[yj¨4ý°OÈcÜÒÂrkŸr8½Æ¸¡ID¦ê#Òþjyæ$eúE³|†æm?ÿâ8›žùpBŠvp›åuÑ/¸o˜–ðŸÝ¿ý…ß:ÚEŸÈÅÄŒó-' 6¾Ìˆôãþ±°¾Øæß;ýyþqÿ°1ÂWiR»ûœµÌk$)¶è™ˆcëaŽÿÀ6þ?!\¸0ˆ‰Rˆ…¤L`’Ÿ&€¤@„ˆÉ·_01û.NF(BbÏÖ=sVÐ/Ÿ[hÍ­jó‰l‚°Ìˆ™Èˆ˜¤: /ô=„ñ~`¶Q£*_Á“×´/ŸDûÐOx!=ì/^ÃÇëãõñúxžØ•F#¤•È7DþÚçÛ8—ÚžæáR$Ô2¯Vøÿîÿr¦,ÅÓ!Ó*";âóx{«{]^îI7Ô °áZ«V \¾ÙffZ·}Sæ¥, 6@µ~úôi½Ýê¾ïû¶¬‹VÝ÷LïŸ^¾ùæñ¯µîûVk`¥•¥ø—.Ë Uõÿ¾>ªÊ,¦´oÛm]oëò¶m̼«¾þøf¾ß_Šgk{ùñCŸßÞZ×õå~ó,¢”RDJa.̇J™™—R˜a¦e)·u]—âiÿ"lD Z–ÅóO´¢rà L©‘1q£K¶Ѭֺm›š°,‹°XÓ£'—`qÏ]HÑ¢IÀiÊž¾2 ÀFª¦™ 4EˆÔqFK ‡[þ6X2ïˆIHD+ æC†¦ªû¾ïZ©a^‡Ô3magØ5L9šGÞËú<Õtbõ£Š/èž·ZWVNØâÈwÕ5š‘ $  >»T-åhA¶ZJtýû/’R«¼Ù(!=oxDçÆú-sÜMMi<îà³8CܯIÉJ«Ø9”ìwÎu¨1½géW飧ËÕZk­ÔèçþW§ŒŠà€{±d02§Íôvçô ·¹P½pñÜÛŸ«ªPï `ƒ‚ šò@b°~!Ýï“PÕ»TJI£šqg>vÐpÆ?”GŸ‰3Õ‚jÝzzt4…ØKk©ü6ašm¹Œ]z#—ïEOùdô#J>VkÊ~§Ð7øœfþZÑ‘JŸçìœO"«ê ç1'›5³|JF8 ûÄÌ`ÔZÕì —œ§D«@g*"5¢?úáõÎôf‘ \χ¡œ¦¯·eœ¡¬8o„c»­ ç+¨SËÙ«×ýÈh6xÙ@ VÀîçA¯ øÃxéÚÍu¹s°qÏK a(Õà8Ô|×2³ÖüaAæ zÑ\®®¦¤ƒÊ̤A€5ˆ™A½Æä;ï×äÖG8–¤*„˜}&97®jäWÊÄ£ð\¹125_7š°oæ ˜«QÍôdÁðð¨”â­~lؘ½s¦13­0Ò«-Ëú^š޳=˜IÕ¿wlz"ÜqTÕÇùœ½ò|Hçµw^nÚ¹Ôz•ׇ3jë¢`Ÿ½h—73K)y’®×léWÎŒZcЪçJOØ©ÖÓœð“ÚÙÍ¿òÚñÄ¿öà¡sê§V?…ɬ6>¸ÀKmªF &cfUbáZµí<æ5ÅñD2è¡'b·9UzŽlò™ó¤—2AM­c$Äh]½’í¼ˆ8[—À׳ÈÎahÓu„@=–º$6Ÿhg2ÄH:æ¢ß‚=9Ü=è¬à‚œ0à¹òÕœJÀ§Ig— .ÞÖ/Ñÿg?É#Ý3â‹0ÎìiùÂN×yUî¢'àãOùYág•Îß41ó¶Qâ‚Ü ãâÕì„âýn®L ÿeßI&MÙa­ê P?_ÃÕhŸÐÓé¨ÕŽÞ_Мõ‹A¿Î%N cSõ]ÏÔˆÒ¹BLŽi¤Pˆ”ü¤dP­Ææ;¨™‚@ÊÄÚž6BÂÔÀ¤BÚUR¿#â¾JâùÚ`EõÙÐ0ˆÄÚÃ<´$,Š…Ì)¬µ„G)Æ«€éÈýÞz™o~XH¡ržZséo<ï¯AÿÏO?oèÿÇëãõñúš˜®P§£P¯ô]õ„=Ñüßþ}ùÇ?~TU‘²m6yúôͧ———þþÃëë›oÇ{Ý·íÍÔ´î{­E¸ÖúýßþöËú§o¿ûÅÛÛ›îÕû©K)DTëàv»kT)°,åíí±=Þz÷ôþy_×Õ»ž÷ZMµ÷æWU}{<ÍC¸ævSÕ··70Šˆ+Ûxþa¦µÖ½V´–ðâI¦ ›VaƲˆÈý~w- Îs12f6­fú¶ï¸×U¤Ü¿aP)ËËË})âÀ½çúŽy1C˜YxYʺ/ ,¥°DúQNv33Fð¿<m¡ž<ÐèüNÀPt:Ymx}P™RÓh)ÅU•Èl7sÕŽ½VU#áE¤îú«ÿï?ýí¯ z8¨:€%Íž?0¡jí\ø~Y Ë\¹$­€~Ù®²WF T+—¶ÞÃ0ë0@Ck%¨.À¥žŒ‘Ár;¤ƒsd”UϹjÕ¥ÐÎ’f=vƒˆ¸…]룧»¡{CíÆ£›Ûõ73^DJ‘ÎOrT¶ÅàÕ¦ìÂ~n9!Z×ÑŸq+í‡h$­Î ®U=žËø¾—4"»KÔöÀèsVl†¨L3ò¥0RSod·V´8¨xõ|äí&IõÛ¾×½žGûÀÖÑ,ß1çÝaÎn­â¤Lû ÷ie½í׳ú®n‘º<w¡4ÑH&âÝᯛº°³ —y?)=ášù]ôΞsi4‘ì¼›JœGƒ¦Ps}¡—|·(¥TÝÙ­µH9箎ªžSÈ%´V¬ÑicÁ‹yiz/ Ù¡†Â¨ï'LsGíªL´«– QiÆ] ¢ˆ>›W%BèÃ%hˆco—׳#­}kÊ·×3ŒŒEªY]Ï›¢ùcßú©2@j!œȺc}ÖúrL[o²w«hž¹‰™BJ⠙Ŝ6û–"{­P`ðª2/8w{xÊif5+-C;¡'¨š¡@$ö[˜Øµ_|Úøüñû… d^÷fQ‘²ÙvøRÇ‹sS¿9~Í0OS“¢Ñ%×?ïÞ-·ôš›Vb#>b<TÓ8*»±7w1´ü»–Œemó§®AÕ[x« êv)ª&ÓR?qñ0ã)˃Ò2àâé U/¢ŒÕæjǸG(Û%:Ý'óNØå€2ºúu”üyM÷ì`ðsËÞë9yí Äó§ ‘Sˆöµ@uæyèi7Ž`Ç­¦áøÔ8|×¼>ƒ0Ñʽvú(Ëi]œ¿Ôüž_³ÊЇý˜aÄ÷íü×ç»ÖSPú‹ y6~åë²Zù._†ô¢ïäP´±¾žÂÙ±kj‘F=¾ËɹºÛB*S…•è¨dï31Su!¡Ï½Å]¢¯Ý¹”·öïR`Ó,¦F\‰@&Z+K«È{è)‚6x¦F¬¨D…ÍæÄ§j`TµÒ¢ÍlßQˆØÉø dÕw/ Hž½KÒBÑÇâ=†!éC)ªìS©íÃŒ˜hb^;½ ’˜ ”wr¤ÖH6LMФÖŠçn‹jD|rО÷áœÄ‚ Qô¼RøÁýÿx}¼>^__¸ýg¡¦]>•L‰ðÿ×ãÂûc7"×ívnàÛÛ3¯ëjFÛ¶ï{]׵˛ŠÈç_µêr[×eùüãç,jÝuYʧO/ ¼¾½íû&̯¯¯FÄÂ˲TUשïô®Ç¾¹fâ¾ïŸßh-Ëíþ¢uß¶ Ì·uqÑíZ«0£"«-šîÑR)å~¹ÝÖu]?Ý·ÇöØ\s¶RŠ0„¥H)"VÈ{ut>4—«>Þ^™y)"ë­¬Kn [–²,Ka‘e-·u oïê%+¥,EJqØÂìe‰ÈRÊRd)EŠˆ°Ä X0ûIA¼u©»F³ÓZIu°ÎSõ›ÔŒƒŒO-ý{` ÆTXœcX÷Ýñ2"ûÛ_þòÛ_ÿç}{Ün7?×u yÖÔwoªM" Â)oÎÐpSN®·(7^J#1SB”ZúÒ{ž+;ÆäãàÝ )E!0À ä1j¢…¦PSÎ!i3ÍxŠÁØy€Õ Ä¡_Ú¨”€‘¥”Çc{'ý ¤þ9Ä1zW~¦@¦ÄÒ§DeѺ®…EDœ­G3lÑà4N0œÍê«.—ÜÑ 3UŠæP w¦˜¨Uþü]­%ÄšŒœÞ¨ÚËvH=³ÿsIôæd %f¦IoAši=ÕŽ SzÚœYf~›JvÒÊÀeQ¡ëg–Uƒÿ}!DrÕÆ»ÕØ¢ë4ð,H•Ñÿƒ‚Ó9[˜H&IÍ)x!³“Ä.ÙQ(Î7¡•;dœ%¸hf{›*•©{nî)“s9O¼‹ÈÔDØ÷èhX6`Bÿ;¸ƒáGB'=‡xœÑf0-ꔵ…:™éãñU4ㆠµ<íiÓ XN*7ž§\š™Ðùõ±Œ”„®ÞÞ(›ñuJ½nŠsP/¡ÔŸéD³@¬ªóÞ™ MâĤ3¼Ûû2·ïT©¬Å|Þ*/Ùy‰,iÐÁè=ýe%£y' í „.vß?Qw—¡¹iL;ÃËái äI°¥`:°º„‘‡+á/Ô!Âê"fq¦ðmÙkF¨ª9'eBºo™f¶WwkœzŒ"á䱘¢Ò£J­`ÖåçúE«GËzCAËGJaf4‘ØâÈÛkÆL`@…¡L5£M´Úßã øÌ¬étÀ›Fº«’ XŠÜõ lj§‘Ò#cO¦¡qA&5i«Æ4߀s7aL€Y€ ªªgú‹¹ì™¡‘¦£›­©úÄ*7«–H F–À3%âÑzöQî³e}ãõ&6&°wIªu±~×Si–މ^ʏ £!^8'ÞkƒÆ 12ÂYUëø9UUiVNÐù •Á¥4¦<ÐÞe[õbHcøœiÛ‘+.ž¿¨uTB焱9øŽa¶·†3¿«Ö%pµQk"kኯ_jmX^ñ¥è£Êtr\vE÷ JŠ´Èʰ =ma@l}ûn“®©q#ŸG‡‘º#‹ìs1&ïä‡:ýa+âSoëGó–qZ)h==ØÈmˆ‡²}jŒëj“ùìp®ŒŸÈ©£Ÿ'ûãÛ•} ÖŸ9ûÙ2æâ<ïâÀIeÐtûzè#镼3—n6uÕÏÑ{l’|œùé+0ÍKNÚq]óÏàþiËH× üT†ÿù4Ï› ¾îÑ~© àl=ÐðÖùwˆï1·©Ø™é?íBžÌÍÕ— îà§]Cú_@üÓç 4„D˜O´]þº³áÉ´Aë¡¥ÃÎÜ7%0úI ?ik…@µ²³Š  ÝT"3êæq¤0"SÈt1?F£ …ÎÞdàdâ&ÚÓÚ‘ý„i÷48«¥¦D:åZW?¦ÆÖ`GHØ·A„¢QKm4¬€üz0ûšËÑWKˆ²rO_ˆý.ßwŒ?€×Çëãõ3 gÁŸ—ü?ÿûøû?~2Û¶½”r»ß‰èõÇ·ªº, …¢;1³#ž0;è¼m3a€Ë²D=`ÛßT—eqùñÏ?~~}ý¼=Þ·R‚1‹š‰0Lõa»»ÓÖºën¥”ªµîÕ“É"¢ªÇÃAñ.5#[n·) ÚÇãA„ÛíVJ1U­êšíû¦ê¥°ÜÖ W3«ê¶ï‹ˆˆ,ËRJñÀ=Twê¾ßnËz[_î÷õ¶V÷ÝívEøÛo?Ý–µ”"Œu]—ÛêªçMFw9¼9=X?ìžl-GäèG/~8{‘ÙKØ¥A ‡ô Á7£×ºä‚¤£RúŸc}c‘ǶýñüõþÿÛ÷ëéÙ§—OKqj˜¡ÍLÍ©ÍuÛ\<( ›Þ½›ÎH˜­ÔÏk¦™9gð˜€Á$ÂÖ{Á NÈ•’Àñ¸¿‘Q kÕþ{/£*gF^êÉô\­O’"% ¾"Þ#[ºð:u‰ŽÔ+ ,ëºúš’RœÉÚ9fêâéÜ5);jÇ€™‹†ô§]ñs½ë‚&;¤æ*”Ò‰7¤Ãë,â®Ö[’ð\8°¥û^1 ²Júˆ ‹£8©¹mð3òWkC·y"M&iÑù5à©?o3o—4‚0k‹ÚìTi 2W°é…ˆÔ´{ œLõ±gÔLÎòϳE­iì´çä ÍCPƒÿàuš¦ußßÊ1-âìÀ IDAT˵VÕL .¥xGNæ»$î”±°ƒþÙ`¶îU«2¯Y  9 ðBü‚Bá ,۔ǜ¯p2ª£±@ ç‰cýÃç››‰Pµªjj¥ažúâ;ºVë§ã¡{*`Þ xt×JD+÷Úèu:ʧŽ:ÐQ& -Àur@p vµj3øî¿­Nl·Tè²=ÐsöÔãL]bh¨»\ÁQ}Bö‰w NÉ÷I²ÖÅ:¢ˆ;h `Õå‘ò³ÁuîtÉÂ`vÏ 4Ï™¬ev¼ #S…8¥ C²&ìI|¶è®ZܺM¾ëž‹sn>ôeÆÛ²ƒEPõ‹oSïéÃtºÚ¨³&TÔšza˘mWõà†ÁÊ­PSIŽy®v#J;nÙzV®íݬ$ìTeåÄ7U2ò ™‹nbq®0áË­hçÍRvéq^èm’4r®Ë"Ç,ê³±¦áeFsú/¤N3U0uÕ2½øúwµ™Ö]»i’…q©ZÕýŸcóeJª#É]¢T:@96TX¬¯ƒîf †Õ¬|b½%×î&‰è¡¦Òe€Ä7iÿ{F ûz÷aóîÏ*Æix€†‹\ðyA&¡3@ØwÆ”.ˆ4Ùž mø»Umî/Q¼lÝNm6÷jôm®Â“öHÒÓ“M‰@5Ì?l¸¡G»\ko³0UÊZy,™9=(º£ºÝz.†äÑ*=‚€ªIåd:ŽŠŒïÏBŽÖЙÁÐíŸõÃÙçX£Óy S%£Ÿ7ôé¢çÊw)OKõ Íï1Üg¹¿!¯jy†&=¢/)=ÒÅ&Óå3`}œ¤Gÿt›Ï°Cïì9N8ÖÞ¾ÇÿìòÀa½ŸkϺ®l±®úÓZþ4ëÅœLcºªOJžSqëj‚MÃül'Ÿ`‡©‰Ô:Z麀…¹­+uõí}°.FJ| º…’+.º1@TBÀ‡ƒ¸cFðVU…‰SRÌ*”ˆ*9J¸×IP7’ÅT¾zm=³È‹5X0POfDÒÎS­í ç(TÄ9‹vƒÜJÛ”:!ÆaÙ\…5µ…÷⇾Yk ϽՋÙÝzµòä<+ÿD‚uÒÒˆqOAÓ{•ËÃ>ü÷£ðñúx}¼¾Xð“åßþ§ÿ£¥ÐØ÷}Y‹ËB,eÝUýôé“™mG¤U­ó½™˜ )½e]îëÝ%ö‰H–¥îû¶=ö}÷^ÇÛCDX…̪ûýÖZÁ\Jaaÿ"x¢àºJUë¶ídÆŒûýnfooÏ‘#µS%`])EµþøùUuç^UÝ÷Z«‚hß7e)‹Óâ‚¶L.1ìÎÃ¥”ûýþ‹_|£µþý‡o¯ŽÔ¼.…!ÙÏÌÌ÷Ûúé›OÞIÀžv›Þï·ûË­” &,KY—Å RÄï‚áqê$`æèé øU» ¨°ØÀX#ó(0YÏ1Ѱ•£ÄüÅèÚFwÏ£#Ìþø»ßþé¨Û£ÖúöxlÛÖÕK)¥H·C5œ4%ŠÞ܃MÖ¤x‚•éy×12s.a7” @“!âÈÒNjÌ£Zµß ˆD}ì‰P¸*/BÚiƒ”…pYÅyp<†Ü¼ó‡K*Bü‘™ ËR–¼©éBðs°ÛX‹ç£Û[?(´§ØÂ,Žz·G¥NJ,S2è?ðÜcbUk¨wÐÁÉ lNò5MF±‹aFsð²1f&uH¸¦ ‰~;ÔK¼ÎÕS}—™ÄLÝëîs¾HÉIT0sC‡D…̤5+6N“€oCC/ÅS/?»ÚÞ„Í“¢G͌ڲŸ `WWEO¦ oªƒ~,Û´·RÔ8ªÿ[RŒ\Šô[ ³JäMn÷r‰ý¹ž`Íœ &¹¸çí©@8ðÁú¶?£ÆÂŒã/E¹þæã2yx\—@S3J×N2õóëÀópÔ»‰óèŒæ‹8N!üõ»è?3Ôqû¹Ðsb”L£ x.¾ŽH¹¯î†~=TÛ[ILU ÖµC"ÚÌxœaƒáát5MU¿IÓD‡MòPÍ(û'©™áòL èI#)ü{/?߮άé U5¹q„# ¿OŸ¿¬“zø‘Á~øÅ$ÁúΤü"yÿ¿‹E¯=±nþb©£K4} eákîkXÔÌxrêµIàÇô+ ÿSÃî3¾þ³ªÁ%‘àJ+è½GsƇ3“-¨JS³cw-><¨ÖU˜i…-S׊02R­LQ O!-°#^ ]2R¸ª1i5fX%”&ÊTw’BæÝ†F\Æ% O¹H<$¸ã–½v­GÑ8Ü[Ój+H­7LŽvq7ÅŒ~…T°ä»;Ê/Q6öšz„C#Òh5NóSžÃ˜ójM‰3z ~ʪ:¯òJÀÇëãõñz^ø÷ÿó¿‰ðã± s·™Z–e)åíímßIDßß¶Íñ#À^__]1–S|êÛ·ýõó벬¥"Û.ò¶m›Gbº«maq!iU«ÌBf¯o¯dD¡“Z ZJ¹Ý–ºïû¾oÛàeY÷][QÁ~Ôån˜yÛ¶ÏŸ?»n¾”òx<Ì*³€ÀlêÄíR–¥´ØDЇÕî3¸mZ·ÇÛ·?}zùåwß’}ºÝV?V óRdY–ûmeff”¥ÜnK)‹ˆó „uY^^îe)âµ÷ ##2§Œ»ålh°"¶}´æ_Uuؽµ¹ÏŒø¦¢ß¤HiêÈ ‡\L„¥.›Ð@‡sÜ£uÿÃï~û‡ßÿÖž¼\ÇiY–eY‚×ß,(nx^é`Wƒ ¿ –;JÐX©ßmÁ™ÝðÖ§\×Å€Û¶žWáo&I²9¾šI„‹_CoÑo`Vb™$wœ^7‰K$¶fôˆd^(´«ÙÙ´êàÆÔ·°iM¢ÕÒímç 0ɼ"·g–¿™Òäð<K-þÉñÖ˜„…›$‹žå§?D¦Üü!ˆ V)©ÂX§H #´¾ljÜ ®´/’ÞÉwþOjÖÕê|ôG j{Ý·}™Ž«ÁO‹e¼ 'ºø-Ô-#Ë'° ³Þ ðׯÒ9=.ÏŽvá:>ïùnsÝÀƒf¯»ëdi¢Ô‘Y×:ë C}ñÒD­%»¦C( &ᆊ-kbæ`[7߈>QuäT˜šúÚ•·ÙÔi®fäPi£¹Sqy ”Oµ™¦ܬb]z­'ÍéÈN8¶ÔZ«c @&“à W½+è¼+öøW 1`Œ€wù¶²]]ªaØà‘ê±õ›yÒå×%ë¬ÐDd‚8ô§~idzg#w”¢G’ ôS¶µuœyæ8¥øâ»èûOvøý‰Ï+ulü̼ÓßeLj®ÅævdYhñì‘K—óñÉ)oÏ ¶ÑÂ÷%ËïÌ_×ýÅŽò0é¹u–;CÐ1èñ«¾ãZN‚%¤îj£¦ªä¬?Õ†¡ÃÔ\ µ’€” \Ã7טÔBqÖQ.ÔU³Î©7”â¿f5z|)¡™Ž€‰z££—øè„œqŽõÿ´.{4`úá°>ä³ÂÒƒ»D±™"L’ÚÙÐî75Ûc/º`è\Æöçf €×ÇëãõñzRpYöÐãÚ¶Ý¥“]{Äa’  ™iSüt>š‹8*Z –uqK€Z+„K­õv»•¥<Þ{Ý–² ivZpB½rlëºÜnKƒ±ªã¬û^ýß÷ÝÌT÷Ƕ½Üï·û}QÛ·GÃÌɌ꾛i]½-Ũ¨uw€—ûýv[ß^_ëf·ûí~¿ÏX–e]Kˆö,ËËË]„—Â¥”ÛºÞÖÅåz„YŠÜnëm]×uq|@ ˜µV-K¹ßî¥pkÜ38vN7Lj‚n·í{­lžGF(_ðáÅ,hœ¤r™…%+/‹cpêÌë§­—)Ùà—ZNÕ†³£58[Ê—ù‡' tSlBÿ݆š’⻂pб=ÓíDS3Ö Fò3š ÃÙ‰²EŽƒ™Ù '?Y"ßu¥Ñœ ê9c¥E;æî [kÝ뮪 dºÐpŸ †Ö4ßDÛ[¼ëA'“¸&eïò]¸ 'Qi„ò6™wT8ÅWÓ¼ö“Ö-zbé¶Þƒ(]k}FÞô®ÛôÀÑýöˆz?,]¨'èÖå¡TWNx–œ4Å›p2,E\ÃÀ7†«¶e?C䌑™·ÇcßvçïQ)Ü·lÜ×:6Gº‡ü®„væsy‘Ë÷SÓDíqጘª¦?kbî¦j?Ô\íZÚÕ3†Ø}ã ²ûѲ;Ÿ]¨BÏ÷x!7µ4ä:V\Crl`vÇÞaž}wwx|ϼJ¹G¾Ía£:{¤ÛH† 4ùæ XÉwÙ“BWWcCèé Š—dÌL]fJ˜Ú,ÊUµîP:î¥ãNÛS3ªê‚9])¨_$St—{)hŸl72ÒÝQzë¥×š^‡©Ì\{ˆü@ÌJú90ò’íØËœ^`îŸÖAjHô@Q¢ìeÁ‘(ž5ô¿îáAÝHïŽYŠó¼­s«§)‘Apưcz4Ÿäš4=º¿(3jO‰=f`v­EnÛ NZ.äG&iÜ2³J*Ñ À;²œ@ÿ®XrþÄñåÓÌTÍŽ]zÑ¥áë«VÌ–Ú‹=­0ã2HÙĬªU%Ày&µ’‘6Ü”¬V·+4p4tvÚAP´š¦©Â„Ö$IÝþÁOL·kJ{ìYÿÌhœ¤fû¾wéÎPßr©@ê‹% ŠûlGI€=X½d†kž°eb¨½ÏwdöiU¡P¢8U%3B™M.öÕ'œ}á•yݵVïždƹŽEÖeýz©ãÚ¥F£+QÃÆ™©ÿº¸ÚƒhœÅv§Q Í!£¥ºæñ,Oþ‹fOuÒ{GòÄиÂgS›ÔT§-¨ú×ådß8 Êìèm"I´Ã~âŒñšŒUS¬2y Mžt.Œ6Ï΂f8r˜îˆHs´nªÇsF^_*0‹ã³~p þ˜¥q5‰æêªÛ¶•R˜Ã µª²j)Ì]…ß]Eä_ÿõ_ßÞÞþü׿®R¿ûç~¼½½~~US‘‚æ®Ùó)Õºï{)åííñúú–£7/:P–£Õ@Ìôóç×Zë²\̈>}zùåwßíûþx¼9B$|gæºoÇC„×uýÅ/~ñÝwß®ëZ÷ mÛŠ€¥”ûm½ßoËRnër»­ë²a)â vŒÀ²ÈRÊí~f PŠY¯V3-¥Üï7”bÛÖ@(Su*®!‘ÜЀ¿ƒZ¨+Þ‘Ö݈öª-×¾a££kõÀ¡Ë¼Ë¿ÿýï~ó«¿ÿ7NDȦØC‰ë ˽Ccþæ¸sgéò”GyŽêòx!UÜ1)³ÓàõŽÆZW7îBLý©5·[:°]¾Gã#ÜJgxXø«pPMIÀŠ‚¦Fò-hªÃPŒH«êPæé…‹ ݘ>’!f:²‹FªÂ`NáT 0묺àq€òã ë ;_ mòU"bú¿–4šãîì`KyÈf@»àrJ†5´kÍ‹.s¤îJSʘü ½¶¡ªvÜ· è€#³1’:ÔR½&âM'ÝÕ£N§I#·i"GÙ‡&ÖÀ5 ­k$á”(jUvùìVÈ °Óe,€¿ÀJØ+%ƒ‹v™·¤Ïafuå+ÕpÁÌc8a£ŽnŸ “Ý »ƒàçãaô<ƒ'Ý!m—WRëŠÉÉ¿¢»yûÌ‘}ßÕ,Šdê¾å"R슳æûÍ ¸¸L/A¤¹×z¸,г0ﵦÒK*¤Ý‚»ƒ¤ë×À|Y•Ô^›3Éì¡»•ðÂKõ’mZ_Ô:4TªF°>o/Ý‘2áàïeÞf“äòÿ!‹:ý¹ï–þsµ(·T„¼²¥³O°£®LÜáøðY9å<Ä4|WͲâUUƒT{)ÏLó>ì¾Ýìf,b yÏV%<e>Ð)¬û„äרau-&2ÓŸ» ŸÚ/\d&oKrbšŸy‰Sª$bÕöº;kÀÍlª),9ç0ØØ›8¥0ÀL#rBD¥×&A×M7ù»¥7Ô7ðSÀêÍ•aCí½TާÛiX¢‹Âgánû*°ŽÍ[v—FìNÚÙlCrOfj>©ˆ©×DúÆÂRâ£ëU+Ò„#ÔºÅN×_j Ͳiئ;¼ÉÕTƒ,p¥DK÷Š`à½Ö¢¼kå¦H ªþ†¶"hP˽pŸô|b×Yå¾ûÙzÞÕ ò"©¹ŠLëʼnőZè4¯#rÁŸÖâ×Åp2^ÁâZÓ?™YõHÚ,¹‚•«· Ñ$ÿüاGY®Öü'f$}s–&^µEø¨K6öRv 2cõà­—%’ð|X0‡vé§~…Žx7ÙºìÈÚ•'“ ÁQ~Ð&­B»t|‡”OÓƒ#ÂeÙÛ.ÀîK¤›Žž¨3!)Ž×ûMÏšÓ±–L¿MÜz|å=Î?“ þ¬„0”¯Œ®¼4"ˆíøÑÍØ.Ê$—ÓrP[èºè~x#KC}ÙÍ“= è¬{Ÿ]Ww§¤Sž÷Oê[m/àé0öÚð¡>ð¬Ôý•èd¥2‘-rèuP)|ÿƒŸ•!Ò2²ÊLò?gĤd³&ÿÓ“Ó.¶ Kþï]äuIèxkxn z§Á€&¸zv`ö}£7köçÙ=†Úúd÷wi>ÀZÁîw’70ƒURí.°Gu‡,¾‚%xúU‰9˜cÑÏÄÎ hîwÒ¶¬¶·Êöí÷=°Tb"S ÑÌz]åâÛ¨LR´×÷³f.œ"𽯻P2z¡÷ 4ï½ï\^ºòøÐúx}¼>^ç€Çã±®ëm]k­Û¶¹øì¾¿½½™Ãý=X–Ŷíq¿ß¿ýôéñx˜Ym:t„€¡„ú|¹±åÖ úÿèΦ0Ð1—ˆwüÜÔ#+%3â{Ò*.#£ªÊ"ÔY§›ñÀÂüxW÷)rB¨Ò§qöÚRpväY13 Õ“·9l-ÔXTªJZk­¦ ŽÛ‡¤8ƒ’Ëh+gû«YÿÝ\v ÓS`ïK ØmTÿ¹ 1™ÙNÕ%~Í5wkeïS¡‰g!ëXµ¡’Ï­aÅýŽ%Y«#NU«07þ £שqƺ3ª%‡®9h¸$ñYSTX”uƒõ‡·ŠA!²<5ò”ä@âjï}Š;ƒ4ô‚!çP{ž;£¬†O)ŸÚ‰¨Òp³xNÚØDÉß[DÓZÈøfÃYtÙ){fôém¹QG‚bÇs›©V;#&o‹Ù+gDT"º<½-†NÕ‹sF9 Ûn€x2Zì´h¯ŽØss¬ö‘ÍŸå–xYHå¦ýÐ q ü´÷šÐ{2Ã4o”Fv(,M—ÌIì TÉ”u¶EdÓýjǺâœ:~íF`›|õ‘©±À²k_Àʬæš0<´wl*hOw“ ?a¶ãèö{.Dãv8ÇEáø?#wºØR;C'EÓIõìñ؈ˆ…µÚ¾ï]WÄȘ=äôXÊ 'o¤¢“ë̃K)f(*ÀT›š„9™0ãÀóUM;LBöTíT ‘(NtÔZ=kˆk8|QFjr©ÀSñjcçù@93Л%/.¡miF5…h¯þèctÜ<ãJtæ[3ŠÃE0j3`A÷Jàƒš¤žËY­ Oöæ<ãÿCjÉ.›ÿòf6ãõ8kÜåüü¯tr¸í$Ë…ßô^ïܘWU?þìL8s|ÀÙ··µ,ëzC­úãŸ{¤]ˆÜC P)Ëz¿ƒèñضÇÃ; ¾ÿëßœž¹íû¶mZîJ*âŠ"N½|{}Ý·Í=¥°Ë}ˆÈ7Ÿ>•eY­{¤E@¤º3¯÷ûm] ‘1ˆ /Ër[Y–²,²,‹0ßoëí¶–"¥È²x¢¬ëâtÑe‘u]E\‘ƒš¶pHG óRJ¹Ý'xY›ºœK$•Ä,, ±îÑæÖQrnœbfb&ªMŠ™†/h¨Gp ×t0WqÈÎlfùýo~ó§ÿúÛm{¤¶€xM±rk( „ ¥Ðñçf^à€¬,ÜrkÙ½.JA­W!¸M*¥ÇC:qŒÒ›…;“ŽÊ9äyjDu¤¾Y÷6£'Uµ¸”~$ë¨OPkèvÄ >p6 Íz>?sö\èÓŽצ™òŠ‹ IDATÞàËDH8Ù95Åßæ¬³âêÁ”)y€ –²u{ ÚNœÁ‘åâÑ>”ù{ïˆ &h·“›/‚¶G$ÿe{LëVíÈ${œVò•¶®í÷¥`cŒ¾RSí4k›õ‰*D;¸ÐÅ…t)mdwÉþ,ZäæÎ~Y<Á1 Ûk^³f¶í›cÕÊ#= ;' ^{ £Û¶Í!!iŠXh~‰T«Ö½&údÏ?%ç'X³èÃu/²ê_ÇTɧ1%ó a!2ib¸‘Q«)¶n/Â4i…žóðfÎÅ`#UtaSälV­R­¦ s7ÿóD<<ØáÎÉ1JXmdæ•ái\„ಫ|¼/àJ­‹ /tLÚÄáf–ÊèÈTê|è,hðe!‡ï}ƒ¦Ž‡.þÖ(SöT ½™tÐ|x ¢”¼,Âॷ¸¯ºkÕÞèSU»ì…v÷õ2,4úG‹5£‘q26ÆtØ,£j5¸JŸžmÔÇlµvû‹Ü‹àªp·I€¶¾†ÞÙÆ@mýµió¤Ëú‹Qš8ÈvC&ØD¥ŽLùî׊©×úðhû;ϪeéÔ,¨CY|ÓÌ̶º‡Ž‰6ßûë²¼ 1Ï÷J³FYn+Ëñ爣•‡’õxžlÎOøà8Ôahf„Oh.†Zæ×àÎp£;¦ÍjÒ\4;o,Í«E'"l:;:üXøùøã¥úâûæXÏAÒKÂÆ³ìêýOì{ÿ!<ýŸ— .ù„ïøÜvx/¾tU¸ÀþZ5‡ªÏpýõÆóè¶Ì®iÃIÆ2žˆ©“iSäwµ§É3Y°B+ lß±,ÄMÜòP­Q#Tòn À´ªDJXlÖ%}ÛÌ*EÄÎdŠ&ÚcT½`¤‘‰qtRiM¶z–úu¼ßZ©;ÅÀ©K,wÜhþ}îá˜ú€{Ë—M-—§Rúh¯{¢íªVv˜5€×Çëã5–eÈ…€ö}¯uoœÛ¶ÈÁÑ*PUa¦•ðþ€pwlò5Ú’´­*ÑÖ( ð~aafaß½öÐf \„Éàæ“",R¼'[D— $ÝJ¹-KYÿ1ßnËËíVŠ0<åd—˜.¥ˆðí¶Þn«ˆ¸”¿ÿR) )Åå"Xþ¯pY@0u§A!–³D}8dž ˆc°M©°¡>¬îV«5 &p e€Oб¡:­e~t§©Z‰·ƒùgR€}<Þ~ÿ_~ý»ßüÊw{wÀ€„©#èo ì-§ žeYœÖçÙ=ÕáWv€&5¬~©Rí©Îiè°þÈ N¢¥‡ ?}Kõr95»-̈@ü—׋PS4ŽhCI{¡Â¡"É\ÈFè$ è÷ ˆ3«#"‚Îzaö‰¢.Àyí¨LÚº™ö •;CÝê-µA°€»Ïp¿Œ$¢ŠA­jÔ Hñ†zöeDnqØòÊcªM§˜¿·´÷œîäï:÷$´e­S+\ü2Â裢v¦§Qb §,´Cx’]_tÔ6Ñ'o•8=ŸØ±P{(u²*˜ç¨F´kÕ]Ñ…ŒõÕÙäiÇ`ôGƒàÄ’Ž6 4s×¶›q­ªº×Zø%5ñ°ð¥Ûí¥#\€¤U‰‚üØ[”z%©‰F—º÷„Y(ò›ƒã¸¯3¶Ù”AËQl6é‡ MT½^³èšT³÷×\KˆÅ(ƒŠÞnLk%W —,iÕ0šE«f?I¿‘ýÔÚo'Þå”|ÑSÏáö+§4®ÞäSF^k‡ÒÎT*¾¤¿ei#²ic±¯Mã‡j|ÓºP™?ÝD­ê‚""FD¬Ø‹nÛÖµ†¾è‘ب¾}r ³kWs´CÃM|š"ŸkJ-¡GW/„bLc†PsÁ™yžÞЃþÉþ`ÏÆ§j&Pk¢>ÁV¼ïGûNg7àZ•Ôº£E>EB ØHýŠO:[d®!–w#bïK‹ÙŸ‚+ídàÆi­*³Kª¦£€ Ë; SÂ<[I ¡ŠÔ+‡M†$JDzŠC2pÙ…$‚ܰ+LëÞZ¸Æ‡È ԇÆJuÐ@UU÷J ÝÜ$–îƒÄOûxº-3ŠÌ…œ3‡ÀÚÙÁ”GæˆÈ*7ôþªf1n]&ÌÔ'ÃIHÜ—š—É|”„Qup TÍÝnš‰Í´ˆ¼‹µÓÿû©äkÍž««xYeaÚ‘žAÝjû¼±´ûRTàzŠ˜¥p: N©ÝÏ 5µZó°ë®W*#ÖûMÝY:ÏÍcŸs†ó–ŽAø /YæNl†*ž€°S’2 ijŽœ[]5€ ÇkZ8Mr[·]óyê!ô…/Èq®¿ ŸŠy¹KìªÕ&k|_O»^ 1³¬ߣöhM%€áú’Èý“à;àÀu·¯{Öú§)Fj!‘åN”lÒlÏ䢾ò§·÷/·½«ovYø¼* $óž£(“ö^»º4;nöÖÿUWkgiÿ§< ûŠÅ…¤Ì•ÿqÊP² @Tü»À@w $÷tN‡0 `ß`ÃÃLR*‚þɪÄÅÝwL<7D€a¬JM¥Õeú±¬ÔôâÂ-°ZGJØbM·TÛ(~½‰³›:Ä¡ÊÒš4Ð:xÛfŸ8÷hÝ;ÞLý˜Úç«g3MtëÜ·©L÷ÔåèY é\øx}¼>^¯Tð-ëííÍL—e]×õñxÔªnÚòw툭ÃOµV"ìû[·móuYfþñÇ”²,‹dÙ™ÛÜï7à…È꾃ùv[ËRT•ÌŠH)ÿ‡.<3/¥¬k)‹‘ûm]oëmYœª¿®Ëí¶“{¯"²®¥xu,@ÿ¤v2s+K)âÞ›ž~ÃÍ X¦²0˜X¨>TwæB¡þÉ£ŠKîMVFwAÐEš:ãÚö-ZÃXà…€¬™y†”~u–ⱺSËõ@ÕRDõý_ÿò‡ßÿîOø]ˆV;uJ†àæ$ˆ?Cð”ZP-ôi­®#,ýuçÞ¬üpèQgár#ªð±!Õ•F„9éžs „fÄ÷lÇß|èAFwìØ: QšXÌH„ì‘"œ­~qD±S<”Tãº2HÜüu1Ú$g0:ÈÆ:‚»³ük‹wíÄB½R×ÄDçjÚÍuíÄáBŽìl"¶4¸¹94PÇ')ü&<Pgðýð Bûhh¹Ú[íÀTŠÞñö¦»ïá¸oSJÊvAãKžÈÄ=· J»õa¡ä× ¶9rÖj}1Ê­ä ÄIéZUMý#ífŸ,õ hã~˜ #áÂÊm&L\Ƴb­G±0ÔKÐk9`gNûﻘrPa›…f`å'NT^BQ€1U3­Õ’X¿0™Õ®¬ße—Z­%DùKkÇ: ÌÌ’Ë8èÚ4ÈqšWðÑäªNLmó¾í¤A£¯ožº®C¢¬IEú73{ïÎeç}(•ÛÈp¢ÛEl;E¹ …>KÙ‘K¹]­›ì … –ŒÒ|Ù6¥×à+X€©çäð‡çr2ǹ”?§îª‹™›‹îµJ ëˆxÞÂŽªŸá¤3ŸûÖqaR¸cÆ„¥¦kïF‚+§] >ZÖÏŽÞì¥OÖŽé g¯k)KqúêËíú<ÂNÕ_×e]Š›ó.EÀ|¿­Ë"Îã_)Žï‘Þ¸p[ ‹`Y}²º£¬,â¥`B™aqÍ\åê6lâa,©ï×:ÞY!ý# hô'7Ù%‰ÒÕH‘¤Ù¼®”ùðš´stìÀ?ÿñ¿þõOøÛ_þ<3ZGíÝFó"Ô?šÍ©:dzÿ¤,‹—pŽç ƒ•§ÆÿNsä´Ùã€ÙKÞ®T}5Ÿ0îç×·ï¨5YŠÍÌ÷ ¶èI·^€i+†¯…â¤äJê•fa Óã#å§Û”Ù»ÒAJ¯{ãwY87HœÓȈˆZ‘f¦¢ÓÌ(i‚ÖP>²£æÜØÓ6m Ñœdß$OÂ1$gº1%‚y‚Ö˜›kcoWP3­Úl_ãvº a îgÁË’M¸F7ûŒã E k è 5gjÍ¥œÿµ?Ò–£?A$s1€ì OìTwÅÈdt¯/dðbhuÔÑÿ>Ô9ÿlæ·³Ü9ú/Q!ŽM«Îƒª­7<À™K)¾`8±þ¹ˆ·+uÑ/ êzÄ‘Òu•4'ÏÖk—;ó“~# BxCT.ð 7Ô Aµ?ˆXP 6»ó|ózŽÑäÀFW¶mdGë$èú¿6UÄr2xù9"ª6ïï€G?±„Ip²éHe&SÓºW*ìFBîÝ2ŒßÁ†ù¢ Œ³v­HÛŒÖcçO(•ênÝTòÿgï]{dK’#17÷“u{8©R(A?_€> ÐoÐî‚$ˆÚ%çÙl¾v–\,3Ó•á®þ8'³ªš³â] sûު̓çánfnfP¦‹ÜäþzŸ±éqcoöà\ŸeŒ‹}q0­G¾:9Þ»jñÉçõ}½ö_Ë'ÉÙ‘B4‘(ñÇ®M¨ðÁE [‰ÝVÊ*íl ;- þRvÝèm.a$7zŸë´‘7Vû•¡êÿòד5ÌÒÉdž©¸1×|½lÊ‹Ü!&~LôˆèàxO0†Cÿ ´“„#1ÃÈ4B•ލ÷qžS‘˜€ÀÁL\ssËLdß&{‚Ò% £jròHò\§Ë‘®ÊíFS.\áh®CçîÇhrtb6T$Ô—Váp ¢d\|§Ñ1äˆLo_£PŠ8GèÛ>ž53]˜cÑtôT˜1ÕûÐs\js1?™l»:½ý^²S†jÍœW{ ÔÞN–}s…ðóòjê ¤Ñò¹Ýo6Éý],âW¶˜âÝüçJŽ];hDƒ,ö-öcÝC¤OÓÃþp•P&ôI«i¸ªE Xî¾Ëw÷[bÞ´–Óë'n1¤EðÉûÐ'ÓV™ÌŠ8?‚þ{i…¿«þ74'ü¹³×h“Ó —õÊ;@£÷üÎÉ•ÆÞ`.ÏK Ë>NÁy‚>>—íÖ¿ÎO¾º¯Ñjl*}ÿÔHÛòþ,ü?‡*Yßÿ²ç۽ܽô³3¦ÿÜù§ÿLSôSw8Å~Éb›#%§º´G *‡ZÓ™LÍÃbÒgÍL¡¹¼Þ|”âÞÛ8ì>H‚Kr]û!©'LcÐqXèy»¢c0‹³éu-ãû2Ç`r@ìL¦ð¿Œt§f)ª\D~»Ý~øÃ¾¼Ü²hS×Þ»SPXî°Êóívc@·ÛͽøãH(ÿ¸ÝŽ/_n·ã‘Û!·›ùç|õr‡Gr‰È!–õ""Û’ð*MŒÐì3L®ýåzä˜A‰Cí~WËø=—b œð–…¨j¦¤ÃÆLiŒd "àÂÄ72%¾Ü[Fd¡âŸ ÷j€___ÿê›?ÿåßüå?üý*7ö3únIQVË3Z`yÑš7èÒ³—————£Ir2.ÕˆHñ„€èÒèagqKú?¡W AµÜm]ùKDÇ·G‰1iBwÙ%©Çæþë×@W«@+ì/.«÷Ÿ¤ÈÁ`ZÇ©šsÑ÷¤ÌTÓ —UG7Ãë*ª—ÈîÃd*ŒÐKSÿaS²p±§up镺h4,ã—Ì:(YH›cZGH#ꋱ`Üi/JÅEÖ…Ÿ3€™Ý5Ù}•(nR:ŒLX,©Ê?­Z¦|€&„ó”úU5ß&:¨’,QXÛj3ÂɦX+ãm¾Ï{?>×µ$SS#ç.ÉÏßÜ_Ÿ¯$DŽ4ýq×1˜ù¸Ìlª}ùê‹iÀÙÇáÆ<0³ÛíxyñNŒÒ¾úꫯ¾¼ø®é¶"|°/\€Ü—//_^n`9r·ã¸½Ün‡øùr{y¹)ù?Âч‰èvn/`&·ëafïo àÛ*„7aúR¢æ¦¢r{¡ãF¯ß¶ÚËVÆ5-zoò•ÞFÇ«é Ãy°p¸ƒsÅS†S€Q—µÄl¯¯ÿôÿðWß|ý×ùÍýõÛ^×f³6g2 V32ÓÜ[¦_ÓÔ¯#Z24/·Ûívóħ‰peù^NÐqp²MR··"Ì2:FçÿWñ§GøFU«CYjÓÀÓ Y—— m¼ÞYXÊRÜå<íΑs Þl8<¤5a¸šQ5-ñçðxôü°Œðî.lßëSÈ" tøß#€†ÐBÖ¤àÀùÅ<Š­ÙÁ)QW)ç1×=æC;d6VðJ·ó žI9¸Œ¥¤)ãî®P fSS5n§0ëP5a0Àý^Ï”zMjíZu1¹ÏÓ):™3A¦N"ƒ²õ>†0O° Åb)6´S £?ì ¨yeaD¼ÃÐ,²äʨš’1• !ÉÛÕ¶ {W QN€{±Ö¡sZ8<·JòSÂÌÎc6úÁš]{׌‡0Æbâ†çTS§±&>ÍÃŒŠçûx¶}»y¼â¨Ú6穬q”ó$ êŽé‚Äs^ÜÿÖ §÷‚Ÿ@²'¯¤ª¥ôz±Ýxr¸X(ÃÆ‘lâŒ:ž;maC—ËODê,9Ð(…~Â[ÈÈÂÝ–²g®«H¾Ž"Ÿ_<Á‚°‚æN=Õ?Ë÷ÊX+êö9i‚râû@ËÌ$«•³8€mž½äúÕô úŠÃ[x—µ±÷€ÑÖ×ö®o¨s´ïõgNeËεÒýLÕÿ”‰§^ý¾ ý_íàO޶3~ƒ£kÎËêoïõ¡$€÷@óxˆþÛyÛùçÜãël˨¦]2—°gñŒ]3ávÞÂíQFÁú•ªK I¤ *-ÙJ¯ªÌ¡‚2Õô·„ÑƸÛqCÔfᦑ¬D¤8®`0S""6#õV¦ƒÝ-ÿF‰˜|JÀóöÔÈíOŒî® ðÎ)¦ÉãHrï4êÙ9.Þwm@ÀDÙÁsj?Gsêg¦# –² «ìÌ“Ÿ¹“'¸Ê~x7õ{å ?_Ÿ¯Ï×÷‚0³ã8TõõÛWGcåvsGP·ÎOÿeÆW_}uܬ¾|yñQIÈ•/·ãË—/Ž×»Þ?³vo³Áxy¹Ýä8nâXíËí¸Ýn/7q˜ÿ¸Ý^n""r8n8nÛ"ÒfÁqs99É1k_&—¶¦ù•e¤©¹Íïƒä 3Áe¨ÐõØf<Ò“OÉ4—cÛ÷~UÓ»ëug‹ˆ_Ü÷›ø¶lÀÌ4t[Ðÿã/ÿæ/þüýÍ×{‰¿fK s:Ñc‚ti‹ŠÎQZÑí8¡ÎÃÙM5w À5GºÕ}qî™:êªë0AÒôŸ; [–ÈÌ@`*iÌ6Fÿî~+ª)ÃÆæc;1b"Uõ¬*€H„z¼aóR¦Á_h“Ž„6+m¼s*e±Pq=Ù€ªÙ} 6ð-\zÓoÇÄM‘ ÐÉfA‘^ÀÕäuKœ·´è‹¢®á&¸Þ㜊C ¥XLðÄá‹LAÖÈAPžnø-ü0zza"£áN¡œ†8ZÝ|zKNW“¹›Õ©ˆ§N¾`õ*éÈEÍžÓªoæê=Bµ9˪õÂ`4N˜¯&¼›"Ço¡Pâ«M1²æP° IDATß˦æêNÄ÷ÈôZ/ˆ}±t=ieSsø%‡ GN¸l è·¨€U¢Ëî?¦‘ÊÐäÅ…%kHf,uï‰@X 6¡ –._!Š´ôä3¶«\¦[ãÀ¼Ÿ'®àw\i’¶Æß_¶˜‰‚-—DPSÊñùÍ»¤OJy¶¼“Zs¾»Âç"y±ø7:x˜5ÆÝ‘)ï3Î õZ‡‹¾]E³Ð‡–%ÌæØFeø@;´uV€øŠ§ÁhX˜í]Ýíþ€_QãpFŠ5Â`@Lœ ½ê·ß¾ « Ï‹¶Š±)ÚÏïHÃàw&zWùC! " ƒÏ95,úè@`èëÉ‹³QÙ0é#¯ªÃ†6¿-?2\q2nÃÌ€‰Œ¨ î¿Ÿ[fpzÎd¾èè69‘ Ì¦*rˆ!t(\‡SrȆ]D§>´+0±±‰t Sû4†©˜ ÿ߈,olÞöÑ-; R$\[u:àU‚Cì>IØpóÊ¡5ÙÉäú™™$ƒZ7*ÌÑó]öN†UË\€¹Òyà-é]ÍÍ!™A#Ô ÈMl¨)ùø$Dôµ$¾Œ6ã.á¸áL}-Ĩ•íÕ[R³R>§{X]è@Ž1KÎëEp.AU… §Æh Z±.'Çaæ²5KÎL[î…EâRü_ꩍǿ‡4ì;”L8ÛúÐæ>t±¤çžðd@á’öóK3Æ ˆOàç~€öZh’z¦VR­Ô ÌÓØŸµ˜[ZÍ º9MMÔi°ª§-.³›ÚÇ÷fæh›žçŠE£eóíQ%:ÉiË…š1'§~9N5ç[¨lÁ›ÜàáEíÖþö~ëÉ…ľ ×}r¶6^öjÝÙV£7o¶'L@dAùÖvE=½gîá#À%8~õUñÀîiÛÀ3ôß¾ó¥Ø<ìâßÖ´sÏòè?ãþg’`û×w}zàf?“ô*g ßÿâ ܧEàø”­i,ƤɨBbÏÃ1ŸŒà >ÇX€ƒ9%e‚äÁ$ ÐŒõCV✹[ÌÕºº¨xØ2.|Î7d'ROòP?™ƒpœ\œÂ A¥ ™çiĘ!Û[²Ëì€è4öÏ™€Ï×çëóÕ €ñí·w†üàw¾¸!‹ ðƒüÎïüà8äõõ•LEøv·›Û³—[ÏÍùo7OÜeá—Ûí«//ÞQ8 ÂÞ‘ºŸžò¸Â_¾ðñ9ÀîáÃD‘Êz(.·iL÷Šæ}©ä’ÿ¹Ö¹LSÙ¬rpw(q­Ü×Mfã’7#}{ÖÔ‘í§GÙXHrðqK^·¥ŒAˆ€ÿç?û˯ñ·¿ü›^j’¾U“„Ë Æ‘œ¨êíå6ó†à†©ãúª!íJ+oŸ¦ú¾á©Ñ4uvè_›§Çø_ÿ_÷*á﬛Šù*º.œb™ID\&9\C˜ö²›ïªRK~Që6—ÿ)x¨¼„Y Yy?µ31±î®^Ïk®øFX"h£CzÖ. G³²qµ…f’9þ_ÿ¸õíPya‘bÅ‘°š.®ü ÖØ85b5wm€k!D‰0Á= ö¥”ƒŽS5+ªª/)5Wéר{«Ö5N‹'¦mB{­ŠZ¶[Ú⯯a³9èÇãi7¸8<þ†=…Ÿ*œ9OÍ3“U‰eîyÝ9€¦NjPOÝûÜÙâÇ€ çlz–5tx¤áç¹G}Ð>œ-Œ—“ ¨š° _ÙyD[¶<~ëÆvÓÍ Üj¤“ã>÷q?øà“ý‘;n#R°¥3À"±÷å”×E'½eMgHøEð_€yŒ3±ädÖ@üí€I!Ò©_wMqѳª»e÷Òà‘³SÃȆ9ËâIüØÇùN²]d†˜ ÒÈ„†ö5Óà•µj'Cÿ¹YXçñÌhåűÍßXŸÔ 9‰Ò‹õ‚ÐÄBxÉ#Vâ‘ëÚñ(c¦1êÁB¸±I‚ q±CMIM "zÈ}¨©¹…€»,úU\»u8ý€X„Ó‘Fµ*¸‡®gzÉ)°ã8ƪÚ\åqÞ¤‡ªp^­Z(ów·ª_¬5Ò¾;þ¾iž¯¶HªÒ˜-¤cÌš#2oÏÝСö€EÞ„“OŒƒüÑCûüë†íBüÍ{-׫Éàk‚–Ñ2rüè §ý\‰W:Jmsï±û°‹BÅêÓ¯²©ì|[nå.ŒÓåkVEv±Ô‘™íöw˲-N5‚¹³Œñ+½nœ»R3G¿‚å—ø«¡´-z†¶èø¥î2Úaûân.jÏcЬ±ÿÀ“ü׃þ*lo?ô®Áˆ7Ô nl‘=g¿>ýãDþæE¸dVì Å[ÂÿwŒb|ôßð€> •çÀ²½íXÿåÇ´w®TŒ5“*$h WW ]ÌSºË¨z ™y0_”T9ño6ÇßuÀH¡Lî¬çU"aWΓ“°¦|){ükQxJ> ¤Šßˆà~# ´od!±‚‘–y™ès‡–œ¥´ÿSœð‘SµÆ¥Ü™ü…P “­Ã]Ìwz]Þ´ÚF}¾>_Ÿ¯ï7ðßüè¿6ÓCŽ——ÛËË‹ãò,8ùêåÅ3¾ëg3^^^n·›ñ; p»Ý^^n"ÌŒCä8äªàHÇÿ0øå,`†Ü ß^ 9Œãæ6ñÕØ»ÊU¥"‘ÍBDeôÖgÒ¼æf™ób˜^×FDCAr éXíÒÚvvðlŽ,¹ÜRÐjl»ŽÞpÜl 7žÃí ŽƒˆL1skýßüì'õõÏþáïÿSî+8¾›Š|yyIU8BK5eG€°ûò£ûN4q“¥}ÁСª=í²·IæÔï¢îÙÕ #Ön·½aÝ}*y­¤‹Ã,gþÏöA”stÀótÈ@5Uufú!q›Ò¤dB\5íXJ놰YÔ2l™Úú²J,WÏSI˜ ɦ¤Äîl+¢N¾Ø`H”¾}¢9üg0ï*Õ½¨mŽ·«j)€ãs#UiawÂAé©«õMÉÀÉ8&FfiO¤ý!â³oS&šÃJÌ‘x¾2»¨óº9Š¥Ôn¥d´Ž3jï\Îø_;të¥[ÚÝØÚF :Ü­Ù‘‘–š9§æÒ\—y s©U¾Ú¿s.ÔäeeâBˆ;adC›ÄQ­ |Ò23ÿ;üÎiÄÏê|[» k½.ìÒ·Äc ªl«UÏ@Ì‚àüe¤”ÓµÔèÊ5 ¤˜¾²«\µØDñ[:dæ˜r‹*ïØÛ¥jñÐÔ÷µÈí‡é;”™ MƒHî7y¬ŸÝD(ÖO5Õû°¡ªCÉàClÌÇ•ð“"2Þý9˜È®û¹ºˆ÷1ñÊl¹¡97à{‘Sà«olý}pÄ Blt¾ÿÀ5ŽŸ‡äX"S÷ ISÂóžã ˦éyÅΫ/tÌBéÍD#à%J/¨ÿf°/ ¸„÷ô®™™Á .¦V9³T‚˜]œÎ"‡ÈÀ¶†àá0JSš[jZ YŒ.£ÝǬÄϱøäÇJw®[×4jÓ‰¾s©Ú›;‰pŒ\Cí¤¦6ŒzØ8r|ûiË¡¥«›gšöøõÑqù,¬¹ uÖÚ>‚7-sc•OÔ|…©* ÙÙ0=}ZäÊkT$7ÒË)€¬ÝJ` €ÃãŇ<ã1ß‚˜i™LðUãiwàˆñÄ0RXL[êÇNU:…ž-Töåç/Ú¯ c=C˜™1†®ŠwêY1^é‡* "˜W¶ênÈæG´Ý3h'!9`ÜÆïðÌš“J&mÓÜȱq3²kÙ®p“¬ ö ÈfãG ] >cŒ}³øéY`Ú&ë »>~¤å'Ëðá"Xß2óN ’nÎâr¶æÛS Ô½ ŠVN¡¬þ¿éC•·M\D³{¨1¸ø,¢šHÞ>iï,^¸556Y#ƒÕøŸŽó¼êaÿ×ksr O€5ÛöÐ=5&©a‚Öb ÛÕ©©Ðø;7Tí¿‚vŸ>Óë®ö 1Bzß¿=[åYüWaÈoAÿÛ•¹TöÛ;ßö]g Τ¿¼»ŸU•vU ½þÿ<€p‘Îpú<†wíê<ØóÛ/€í_tMX•ãÕˆÒ ˆ,n%‹#Xõ4æuˆ]ן›ž¥gÿ€^G|bS$D\0(X_ñˆ\pé½òÁ‡Ü3 -m‘2·¯U7Y)íÄù·›éè­__Iü·ôž {»Çq‡¼·Ûí¸ÇívÜn·¯Âç ¤|_„=¶Wn·¸Çቾ/7ˆ@^ ’ƒ]Å/äÈ”]&ä SdÿO}L°”þDä]}õá{\ ·ES:¨NÝMLWc·HSc˜’[f“=2jnæ ¨§‡3inB§¬qÀî¯`!°ôoþî—ßüü'ñõÏï¯ß.üf?ü᎓ªûÃs<{ølÐt’ا8ÝJœûÈð©Þª–iOaç—ãßÙãU]o;=m²ôæ>dQPveNUnš)TA«ÝJ–FĴΊ9õb9Ŭ®_ ‘k©J ®=š Ï2>RSDÀqäÊžŽ<·Õ”Џâ,ÿÙЫãˆo¹YÄý>˜Md÷Û.ŸžJj £ $â³(ÈnpQò¤F´ì®ÒåƒQ¹ù˜„„2 Äž f-}Và†IO0³’ÂÝøi›ª¶æ€HìÚ†LÊœÞÙÍ ÏËÿr‡ªßRS:üá±%{ÇbdÔý¬'õÙŒû&jù³wb82¼›´^>dŽ%¼^ý6ì!jªFjAVQQ¸Å¼ŽaÍÊ\D4•ÙC±ˆA:¾U~ž¬È–ùsÅRSgUüöžÚJh[ š0Ö?Á¥üNHVÒˆ\Èb0IX+¹œÏ©Dÿya–{:C{oyÕÆ¥O/‹gâôÅ ÂÒC‚ˆ""F‡Nê †ªc=’j¦iÍf¢açû~Þ«Ž`1 ±¹—мBeÜ]áT¦g,`ä´™n×îc×S²×lÞ"? ÔôO‘4aÂÇõª«´Ö®1¸K«çа2$õïÇqÄT4“Âín\=ãÊîLx÷¡Ê"îßâXbD1÷ƒ4º»®|÷]‰Ó 6(e6£T¨H í)™Ç«™ÇÀw:}'®¥´QQÎ(ñ)vD¾·n+ 2ìuÃ?€ÕE]M$Ÿ|@þŸ+x™Ø.ÞhH·wëµÄÎma™ÂÁ¶Íå;äL,P‘çôZð i½N5÷p~|Ô¬yÄr4B`p@ƒ{.E®‹ŒC„|Zqb ñØ/pí –Q5t°/‡œáý÷=k‘ÍŸJ5šžT!¨¡Ìë)Ýç{Τu?÷(L™SØew£j‰H€µl¿LŠlgïù•¬E ïhHNú¨àÉÎûÔ·j»ãÁ¹”¹3ƒˆÆë}Œñz¿[øÉ§ÈÍ–•eáÕà • ¼R˜ÙÝ·<¤Á±àÂBÏjðzÒ¬L Ò®È(œ\(ôég¥6/iÉ`WËö1MD»Ö~„9ÐÈŒUl2›+{Јå@y˜õW£>õeê”o¨FÅséxmFf¯Ëâ°óH‡"L?wkéÏd&]¨Oe‹ct¨*QÍH}ÅëO“åH…»a‰ˆ¨Ç” >–a#Ÿé>å´Ð„Û=êÀ #gT•ˆã0˜#Àk…_æ²ìø²í35%må„pˆAƒAŽíZ­]ÎU™ª©©‹I’Y‘e°ÍS¸ÏY93Ú–q2JžL°ªq7×0ÆÙwL 眒K·@lÖ@á™ÁtÃù“Sté“Ä™˜ð•è;μªòIø¬ª`H­ ª~_=™s*àYkéc›ÙÂØÍ’WÜ¡§…ê ðÅä °Xµ¤kÿ#|6𸠌s¤ÒÁÚL¡º² ›*à~É–ÜNß+Cì?A7€tÄgòìuOt A$xû8w¿÷–„ _Õµy®ÇàB´©=ʳj—ß#›¦&"<5;æ _b¯i“’)â?7MŒÐ-õË=Œ…!Ôf÷¬[n&ª¥ß–{Ë:~ ÿÆ|r¾cš¿?W؃©£Ë±{qxÔ„(ÀmBÂ:µ‰,—Â`äû"åóó,Ì:t~3‘±0ÙÈjÓ¥í­ztßy9Äêi‡'˜KÍ$&$¦ó! ˆi˜ž“Ì¡õa>¾÷A½°ká( &PsoDäkcÔ- ÍWÊÝ1²[|ÿo™¸– —–ç&H¸Ùƒ8M@] ±Åܪ¦Ë_㺚×ÖfT³ÕÌÒž*³Ê®ë7ëiág 5Ò·[q-ЇØÇí$ĬÁÁ( ‡âðŒqÐêÊòí¯3/GJÝËÐX‡>àY{Ò¯m È–„‘Îlë®?|&Ãf¦q]Ó Vï‹6·´m£f“?_¸bÕ”™m\ýÛ|·ï£ÚF"œÔ_Kê+;žk;(LKÖÌ­§èN_ªèmjÂáR¦õg1AÃ&/XG–ûyú }ÚÜ;]t}K|¤ßqÉÆ[œÙ¦çlÍ6‰ÒVøá˜íµ«œÞà-ôÿ»€«ÏS|Ÿ³Wv’x”žØ®fwç2—Ú@mN´§ÿ+ëÙ3‹—R_s ¨ âsúDf|סµ0¢Ñ¬v»°‰6#9ÈS!ê1ƒH”S6§…%Œ8gö‘Ýt‡fn‘Ø¥?`F g–ºùh üö5|Aÿ-šŸZµ•rA΄ƒ £@ËÆó+û ÷¾>_Ÿ¯+àüã?rÿq;‘——ãvÜ9ä8äy¹"‚Û Žˆ°‹úÅÿÿ-Dúîês®±¤~¿Ó—IÄ ¦¸½œÙ˃œÁº’)1jB+#ÕÇEýá0§Ã® võbŽ—Ò^°rûƒ‚Åt$¾2‹ùƒJ¦)ÿ›ÿíñ~cŒñí·ßz‡éù½µèuUï±Ýy­Š-“n0(ìG³8 ¤,d|L %Á$‡Qk‡Ýõ½Œhi¦4Ú¥¾Õ5-ú詼žÇ¿ Eåž=­¨”ˆIà³vôÉvuõs¨ÀÞ[ˆT¿ézL·aT­öÍ៦­yºùA8~Má&:ÌZφÝUe³® áËãŒç‚€r˜éeÆÏK^Vdž‰H•óà÷OII €¬Wp“ƒµœ[ËlÝàûÄ¿þã”ù)u<å«9ÕíÎ[MÍŽ ä¬/)U<,.± B’´<èi9 %péq0µ/ø%Çl‹@÷ùÍcȸ.Q§ zy{¸Hâþ‚é+e-Z˜·¶3'-@ «øÁIøŽ³é´âF=vÜŸŸex…pÎëàñ©…Ÿ{S³ëFßȈ1S.EP&ö´³åd‰ûœDÛ9KQ;Í”jC º°Ûj¥wÃP%…!,Y¶-¦nrÃÌè©-Œ¯á¦*"ì¾í!aô-X&ôßQœ/¬7¿ß­–€‡±ÎÉ1ØÉÙïòÇä8Æ} ñU¼ ‘y”ÂqS}}½;ŒxšqÜŽ¢–t(ut¨ãAJ|2î3j%ô° ¾r@BãØ´!Ñ9Q2ŽŸ&7f¼ìòG›9p~ŒB¢ã!¯ÛªX—26¹bĶ@” pî>‡ñt/ßPÝR‹ªæ¡–K“Y5‰§ÛäÉ$HccX7x:tXD(F™ÌF:I>„†ryØ×‹^M=Á’ê¬aµÄ¾”ÆCª&j÷û=bo[äuãe„#M÷í9W³±ÃìkµD^Μ¤²:—ëkΨ«3rˆ vÕöä1ö ¶¨!²˜ãSVÚÿð~LýMeØZ{0)‰%„\}¿šše¸qI®/ào~õ«XÒAãõ•–¢‘°î¶ÛDÚõZ·Ôżîi@“Õ°…•ì|m'¹'˜n³P±Ý¦­¶ÞÖe›ušô¡Y§Y¡]&œ*U´Aº6kÎÌOF‹*õ-š™éDÊ^¤7ÏgxÕV;²l“¿xdò€bXgkÐÃHúpZ/{×t¼±FÿÌ»‹<¤ð·ì„aþ8·¸V¶áÄOÉn#ÅË;}×@7”þÏþk¹&ßåO×ÑGñú~ÇáƒÌÁ“<€Æ•á1£S’¢å«lÆôs%«¨ªœO·â~U•…i ;˜hÀ[8:ošüW†ç@¨éè8Ðç\= ÂÉŒÀ6€ùOO5"¸*4 F<›1Ž AðÊâ©F\0rh¾æ/USázy½y]­O¼^WãÔªº³B6'ªè9Àvºá¶ €OnàóõùúüÇè¶ÿÇ!ËqÈq»áöÜ^ÀŽƒyG,‡[÷¸k—™ˆpTÈ[zûdsu¹{ó¾×Âýæª6tÛ“¶V§—[ 1W0ƒT¢¤¡q÷<Þ÷}zé¿ú_ÿgõ¶$̶â‰PâA­Ó@-Cëáj Æt¯l–‘8I¶ÆÒ6ÈÑLM…ÀÍóÙç'É“sè&dR÷hCÈçöï\䵺™z&a c‘ý@üý,ÅP-Ä+‡áè€Мˆ˜ö ª” †wÊ" ¿VóÃÂU§Zäí„Í 6ñ»rcÐP<Z‘Ÿj?ª‘Þ¯«ålpWä,¨´íåo6áõŠEÉië]4+Žœ°‰Éh²aîۓ׌A’ƒÁ¬÷ñ|ÿ·i(-¼|†B<™¡:ÀÄnþË¡=Ít€†mµ0³gùêuA°ºX5P$øLˆ»þ‚èh(ºÎÑá!†äc‹Ö8MݶR¬Rùßžà±ÿ4³WD9+)™ŽƒñŽçvÐâÂÊqÓ´G©?Q¾ßëĬ‹EØÌI1TÃé‚ÁÔò¥ÕÔþd‰HhÌÐp¥ž ‚ÍhÂiÖì "žºß! »¡ð©­ (S ¨ç”Ù/NÅ\G®»DÖçjön'Wôuµºmªù³‚™ªµVÃŽC5ÄÓЮIi³¨X|¨X8˜!¦2UOú`NM-Ù†qJ¦sLÜfc0óTvDxÌ.ö0mØç)µ7&©vK ?BœÑ=B†zHÆ ]õ…@”É/$MÁ{]bãjtÀ‰¦ì¼)à5ƒw{«Ðo~¨^YѪ®•ÂEÌxh˜]Ì%Ì$`5:üQ47-0?VD.ä6UR Ÿá 4‰¥ßÚÌLGH¨ìÝÞ½‹»ýTU9ÄÇ \\‡Ç­‰ÍB) ºÉÛ=ø}èAÍPÉ"ƒk9HA8i>OŠZ{‚r#(Í>IC ö9 ""ca66£pæIH±G•ÞU_Ž ÓÙl-u)m´QÌ IDAT»3¿šs—|ìâb tM¬•~ðf1&€„Š`¤ òÝßòŽb!Ÿ×ôuFÕtøFæ6†7¿[Ü‹fûèÃ¥M|ÆâÚéæ3¸ß§ÒTËñOUǨI¦*Û÷$öXÉu¼"Œ‡g¼† —©©‚>OÂá+ûþš6X~6Í“àûã,_‚Õ°rwñÙÙ &âÊ ÅRŒ¦»Þªý÷4¥ I|žµ¿~ó«_×8Ë·¯¯í2²ui²Eá~@Ó¦5ÛÚ‚&—X\}lyFæC=…¢+¬®þ’Z™]Mû£þŸ½h¬û6Oÿ¾ÎDQ_ßoàÿ艅åÆÇ9H>n3n7Ï—p- è·ûÝÿ¼Á4®¬û@iòˆm¾ü°+ŠšcO*)zÌËD)ÌìN”^ÿ,À€0¡SÂÿZµË LúJ5  J¦û³?ùñŸüŸ¯¿ùµ5ç‡Ø'š!@î=VöÔ[q£ª‚°ÏNëlV ;n(]ÙúO@˜¡­:o®”<`æêÛ·ièRxm¬ÀÖOvCáê:zç¹øžR»ý4ZCØ3`#Bj¸õ6±¸¿lèÑctn ©vô?&¯[|CD–µû«äHã>L2ÏÁól½OŒp?6 ÓäNUyÁ¢¦ÞO»ý42¡ÎàfpÙ¦¸¥I)ÐɘØ5€³V^Ì^Ã?: Ï4Æ)GÍ#{ë,¨× jQ9Ml¬F…ºZ ;¨UÄeê¢éŠÝó#bEÊ»Ý+;™0pÛ r’µ4ýÀÕí¢\›WߌԢ±5¸CŠUSšÐT©à<™I„Íq§÷ŠÌª ›F5ÓPËZ+ùuG#|Ó¬ÞÓÔA“@f'üÖÖ/–0¡öqö+™­…Gû†uZd!n+b§ÑÔ·¦Kièˆv‘ZÐuÇ%Ï“tÀ Zì=Ð ÄÊÔWMUU–ÐÑ`^'S–ëïRáN…f¹µ°ÑPåSãz00¾ÍþwW+4­X.×1 á0Φ/$”ÏÚÆ èj?|‰‡“ͼãiFdf"”爴0-8Gh„© ØúA<›j7«)(¶ÂÈÀ²|™A# ¿…vºO}oT%c2^Nkw`ªµbù55žä­Üüt– b¸/_Ñÿë-ô˜þXÎ"E•@Ì‘|Bòã;ô§Ò  1“Q–PÍTÏI$Ä[/¢ÕözòAÚ༞÷&€–ò5ž5#UFGL¼´[‹œ@X€žôžÞnÅè¸@ÀŒäpXþ™Ëm±º— N{ðºí‰©9/1m¦ˆ†åÄùïS°…íَϲˆØŒqæÃÜ +Óva¦˜¦\®!ðO#rÊõ‘Ù4‰j‹qÆ5K‚Ü·Æ¥>ö)ƒÒ$$3‡ÜR f6îƒ_8¸ rÊ뉡nß´¶ý[°`wÿŸ“s뫈W†Ÿ±9'«¨hðÉ®=æ8‹á6ß8EÛÀ»+\dPeì÷ôEl'òn¼IOܤ gõbÔlÈIà›B¬€í«DLxL4gR“eÚAæ£ÅpXÄß”Âãì™Y4N:ÐN}ÌÍÍze5Çx–í`6神ÑKìùxáõ+ü€±ò«If”XL ¬ÎÔ§†“tœ5­Ú-³öJ!­;®½¢®¥î¨]ÏN€µ™=Ùal­cú§`åZÚµ˜$:;}´~®ô¿Œµ…0{Ûåï\ à1B¿Æ~Pæß6Ç€ô´&-àÿNt€½õƒ ÇQüèË5lJ°ÓÛžS‚Ÿïò¸9œ÷å æ×Zöý¾æÕvÈ©‘PD+ª±„*Ÿ8&¾‡‘ ÃcD.ü'q|¬)©;ŒÚ‚©—¢Ê#LòÏ©u21­¯¬áÒœ˜ŽÍ¡JÏêF¨Õùg±§ûûÌb9: ‹¡„ &@b…Ô9Dm™d¶“O{:Ñ{îöOàóõùú_þà¿3± ‹Äº† å©îOcèýÿèËÑóD…i“ðï±KD`¢³êæ²µ{bi¶ÔÓΫ%‹Ð>ºÍ{Úë·¦ªÿñoþâ§ÿö/¿þÅë¯þÁ%F]\òlÚs`¥§G•VØÊµ5Ë=i k‘Ð_¯n ­€õa\ÿ3 ‰º>Éûj¦ç}OYPøsÌã9ø@Üxh ‡Ê<¹g»ô/ÌîÛ=fØÝ£tŸªp*,’"E°{àx6†V0¯ïvàxÙp]›{º bsN3“r/ÍÐ 3b³«ÏÆHÔHÀÆÌ,‡x²_y¹`ŸBÜßpÓú6?î#€WFW³¸ðÔ ¨Ë³Ýq † ѱ¬ÝNÁôþ¯jÊí”ÿO€7 Ó¯$áRä=Á Í–ËÍsÑàô1dºê؇ÙÁIºeÜMµžß2Âây Ý›þIÍ+n@—6uä!‡Bfw‡N¢ûëÝÌü\Ï0Ov0Ÿ˜·*CÇÆ*™Ž bÍžîÓff£§Ï–Ñ™× "8pØâ§k ßSÅ^æ»ñâ'4ˆòêSt sÊbû¡CͨåD-‘Γ p²ÅoŒ{~W犬žÙŠ/Üjäa*Æäò£‚jÌÖ|ÇívS €>1Õay¿€Ö™ƒ¶ÕýHDé…­¦Ãé¨üVŽw Õ.{Ô¡rL¯™%ÞÌ•8,÷3ÿÐ*ÚÑO B Þã°}îÖÈï^g,auÝ¢Ëú*¢4Jˆ:Òm !Â뇚WÏ4È<v¾2x›.lúÐ%Ë!ãÒÓªøÝ6Ù“ m§qjó{Þ;·/=±%ç¼Ç.zØ´9‘¦6r}^çRÞyNÍ]üOxBó‹îÓWx °QÅ„ y4\ZŽ+Õ0J Ì`ñ­Ôf?53sºBjCÇ4­ül„t˜Ié49|ú&ôD3Ô ßÞáÂSî㮟ëhi‘/€Ç6k?3K2ùS+È%ô9Yp Ä•}{wÒíç§{Ý•Ÿ{¿èaÆ7ÌÔ°Š_â5ÈÕZ›:!\˜ìy(ÿ‚ï{ôKŠ%0Sņݼé\ÆN'Ì—"‰×—ž:6nŽÿˆê (ƒ8àîYJùäúÝôä~žµ Ñ} žä4ouêŽOÄ…(>ê ‚—FDèh±yì…·CAézßwS´åŽS…yS™ž1¦¤CãšI"È­ äE¤çâN{b²M·qÉWÍÉ2Å‹¥öÿÛ!¼ÎT™é†l\Êf}\ì|$=A¦EP›ïz³Ý×b:é9µÜ‚ öogf÷ûbšJ¦ `F\ϬLîw»ÝfæqZ3#šÆì5¿¥>SžWéq`ÙžQ<¡`XÖM¶üðV0§ÙŽuÛ§ËhΆ^|÷iŽ:W–¥åÉ«j¤Sr³Ý"[GÓg¦îÄåï⃺O˜ßÕ˜›]ÒáÞÿ#¿å®[ÃÛ¤æ™Kjûù#€ûýôñ›8üGÅû¿ÅW¯†Îž?vì¿Íà‚°˜öÂW·M=P…`X¥³ Ù£T2"ˆeô‚$ÂÄ÷IJ¯MòøÜøù0‘¶áiÇ 1ÓAâúÜdÀåÑ-,E"?`ÉÌÁ˜˜5CéPª‘ °æA |бwQ)0ýóãY×LA±e•\-ôm½ë׉Ÿw=›ö€ú¤>_Ÿ¯ï€ãÀu_;D¨ Ÿ‘ú>˜÷1>ñª`ϲ+ÝÃwÿí ØÌýàÒ €°ç·,{^¬“¹_%—QÈi‰ïDd÷ûßþÉ¿úÅOÿ웟ÿÄ;ÀýèGÂôÃþ°P²‚OÔµƒ¡çÅíëvŸÜlQ¦6gm]¦#ÍbeôX±‹(&fÈr꿨L/Ô1ÔÌp§Í[9ÇJõ–ºô)fÜ_NÌáUæfîY-ôÖ•µ0¢¤Uš·8\гN„:O¢æ‰B=©@ëN›³\6ðJr;êþèãÀ¼µ­M¦º&¶eùågÉuÚ|°C!Íà¢0q wp9‡›æÔ¶rèáž9³·põXL­¼”¶_ šÝ–eËÉ #¦´méå3; ã=X—´‡±HKÕë2B×#ãA‡0­ä§²¹C¢{Qž–©Þùc†ð†;Í…ÌšJR*ïÕY“k™LP¸O¥zê@—ÈtmZ“Ó&¹Ð&=‹+%Xf ®Of5.o×X;Ÿùy·Ì”‚Ðó'1»¶9ýÑH I]Ùîg3T}]Í¿ç8Jh†#¼Â~ó¢Ule(Ò‘s 3¿ˆ¡[Í<जQYÌÎRx–—ãeÍí+ÿÜRgÚ@=UºVÐÛÑô•P^¸çÕÍæÎ`£6³J†¨$÷‡–ëÏxsT^å)^ž™5'߬TüøZtC<}Šb™&ÑîóU‹Ãdˆ§åT¬Å]ä>1ßXù–K;»ñ˜™ëÆ‚Œ‹ôE`¨ú•ÿâ·ß¾ú­«¦a‡åj± Þ@)D3h7˜¶æ,á«Å£±ÂãIÌ äHq”32=$  Ø½³šCHw¦n6$ȰØef¥ÆËô˜zRHgôO’XëœtQÌm(ž™Žû¸qˆ°pauçß2²ömÖ, ÀN9¡±ƒ›énäVo8ÆXÒ¤I¹™ÁûtL‹ˆÉ – )v"<8[ ¦ãpü×-‹“ù°|Ž¦Î™" Uò0S3Î(  ‹UEø&ƽ#“¬q= weÕÂ"p¢¥èОÕ aŒ÷^߇ =xóoœk–YRÅ.D¶Ïc=#‰h2‚±@ ó9ÇeýIr`!›ÓªÈŸÑíÆ©©ß*fS¨^Ä¡×ÃMÑ÷Ò!G!Îz3‹¾Ž-µûód×ZJ –6läa–N‡´Ü‹a,²+>ëø‘ù"k…|•ÚŠ3ºD4_ÐØªu; ÝÏðÌPAV9ùé<£œá“ãâ,bZ$TÂcñ/Ÿ—5u Úi­¹o.N…E]€ý¶ÔÜ=B Ëzr-­m àúùn?–'ØžÁº›d~{Ûê=s™—anÐüq`6Iÿ2YSþvÚßÁœ=܈®vôw‚Þß[ÿgâïvu©ðÛ†õ¿Ã»/X褫_y ³Á5IÔ›WÖ·7ùüTãå>Ž™*ž‹‰™eñFc˜:ÇŸÙ¿ ƒDbàÕ•ac€Y(œ‚ÌX¦\¨Gq—Ø"4-:†Ó Û’G Ø•BÌ̱q7efUtŒ»ªâjü¸ó`tËl3k~E¤6ò¢ëä ’æ¡ñd{X´3X ðZ½¡Šû%‡B^¢Ãs€Õ”˜7J7ç®w…¹Ô䎌ZcÚéÚÂ4†{*/×-Áý4Ϙ×EM_ïw3–CŒ[ÙsmÀ\–U±úe¿—ÀeÜuͧxå·¦ÔFÉÕÐ8äØ(„Êsêŧ‹ÁdBº:éÜÅ¡Ür;¨2†‘9u,ý„¢2)$RO™~8hv7룽Å~¾Ç8”f“é<íÔ0¦ °m²H¦ªÄ±L{«ÉäˆüÅ%s'™ßìõU‡j>bªš`»«ÙzpÊàá-½ÆHmÜ $º]DúŽE6C1F›¹ö•‚3–!fÏ™Õ,`Bæì¸!$¹™G§·pA«0ðhYóóë$®§7Œì»ù0ô’oŒ1Æ ³ƒnn{¦æžPnÙ4ÛÚLƒÕ¾ï¹nZ–euÔCý^µ$o ª÷18øá.Ðë‹™%?ï©6~ÒËE¤l‘˜ùörÃ눅²q÷fiü |ˆ8Oï?p°Œu¦Ã… 5Óãv€9©9}ö\ú!þVÌ#WìÄÓçn»Y&. î2ÁÙFfá2=X’™lÞøª„oai»uJ¯Ë´g*Ðöàr¡ªPËS6V†£±ãåëcªVÛÙœ˜1cÜÇ ¢£BËZüÕW_}©Ä`ž{P,-±_Ð4FŸs“›˜eê²øê%®ù˜[D8vCÕiŽÑ‰‡Õõk^šB×Ïïö—õŸSÙblûª¾ÄYðQ¼ªAxÝnúà*£¿“’qSoÌOYØÝ‰Vx¬m¼ÈÖŒd}·9ÿ\„cÛÌ%¾.Ëì¬èÑ „¦ã°+äÍ®°þbÉx_ƒÝ Šåg¶’íÖ"T”Õ{ÇñçǬv¶q7œÒ§/ñýç¤àCÊá»CÿôÛ‚àJ¨¡¯FÿrèÿJ–í7){ýÛczàCg?H¶T˜w ‹Kcr6Ø7c%aøŠª0<2ƒªÑ8¢aõ²­R²s¶ØldŒ€?á#Ǫ=‘ N aŽ÷æA–ø FÌ3Ø“Ø]鯒?`‹Ç’SAªyxwó0á *”WJ@–>¦':ÓæÔj»ÿ’fþ°Û3^z|]ß6çĈÏQ€Ï×çë{FO&Aå7\£ROÿ1Ož9]5/8s7¶]OŽÆ[åîÆRØw,é=Ì‘5ÇDtwÕ°‹Î¥G÷v}ŒÑEdQ4o©bDÔ\•KIW~EÌá£Û«eT9 fѯŠHZªæDz {¨i˜V¤u>Ãéwxt`è3H™™eÇ[3˜ æ¯‘HJ`ß,ì^FHÃ%ÁÌ¢ê;3‡‚\•qÊ?auK\]ã<6me eƒÈ‘Ø­ÀaZ˰»ß5 W‹B»*!rlhš–¬ó —µâ |‡÷‘hYÙÛïŒaÃT|ZbvÑ5”b-|8lñç:7Cys‹f + z)²6ÄnÚžÆ#ñæÈLf‡·tÜǨN´‰©Œ€¦NLªmVÝA_wyÒ°˜!Õ9_K< J]ÄSìFû61½34j¸ç¢L·þ aUR#aÛñO‹HRaéÝêçI,X_͈ŒEB‰ iPƒ,p‚™Ô‹s#»1Æðc¨cžûE³5œ™–¹kê ¹mŽª…"úAqœ—¦Û³ÐŒ•OFg%±i™íšÓÛ±çA?0Zú´Åc˜k7ƒ w­uÜ,eû5ðtvGK™ÔEë4d_ÉkV·q`¸ò:v.ÚqœŠZɸ Õ}ÜýVމ%…Â0Ÿ²æ=¦ ‚>È^¿} ÉûÎ »Q³‚W+!‹Ñff4tŒ%ÃÔ" ¥ÒO2†ælJŽâù[ŒchƒFS ja9¿‡žÛn 5;D¶‡Ï÷•ä» c> ÝX#Ϋé4ÜÈ»zµŒŸ<ÙùÍY¸8ª.ÉWR6V·/ƒ–™«[2ÿæ…]·„¦,‰>™Qëó«3N“Ahh”߸G>\÷1@z»ÝÜk¤ý3t W6Ì¢(sybÌfD±ð•ɘ» `‘Dæ°-ùê b…í€Ó"A-䊈l@4.8ôÓŠ¦”˜M†¬íVöD³ÿàßšÛ¿Ù: Û¶¦­Zf¡ì2"å4NA×¾ÿ”ÀÏ2P­öÝ7}Û †Œ9{ ¡áÙ¯WŸëºpŒèlf|'ðnë»l›°ë{“ø¤ÿ>Τiäð8ào}fÞÄÿÿÿ²«xîø§¿Û~ ”õÔL(¾DT‹åT™þOÂÈà{›—è:ŒUR'JE"³óYÍÀ0îtÜr ¾Õt¦n >È󽄽0`!uaè´L0Ä|ºÒV27"¤>µÛâI5ÇF-@ÓVðàÜ'cíæê ýã$Á1]™›GÍQy®W1P®û3 ™R€ °÷Se[zÄæ¦õÉ|¾>_ßà­ n‘ð¼þ÷Á¨êŠY–ù¬í}ðŽÏ­…ðœ PÀ–?,¾Úòýïþêï~ü}ó³Ÿ|ýÓ¿¾~k¥àüÞïý]EÝÖÞÖõÈû„m)¾A:«ë¡›èÿÔgTÌZaÞç«jqïKBZbm´Þ>áû~³ X“µ:³Å ‡‘qŒA\µkd—e€Ç§Þ ÷\\ÏXÀÖrƒ&À¼&SÅ5i‚#DÙÐÁˆhÑ{y³¤¾È-œLÓõH¹iÃ%FÞ[hE~4˜É…r:ÔµQPsÛŸ²2z£UL IDATWŽb&™z€Åý¾s$ÙêBkÊ® ‘‰­I@–ªŠÙ࡟ðV³ù„:gxrørï'#‚¡÷œ†’b0€4 "esz[Ÿ‚yG¥b*@Ò„ ²­e¦¦ãøòÅê«ß/O+a¨q3Êê¸â~‹º™PÅ¥ú»y#"ÄF/í!f[}²šL Jªw5r“bž¨.m°DݯÌ-m<—XMÝ·ÀŒT‡^w¡¡˜Q31±Çw5%Ÿk»^ÔÏ2Ó£†3†qŒáØŸHþÇÐ1”…=É Ù¾7ZÜ= IÓlÄ4$FÈÝ.wêå™Ò92KÅæifá=ÔŠ­yÔ45ÖÝê$ß’]ÜÏgÓešXvŸgbv8IîÜSZì@ÍÖ ‰ç#à'äæ•<Û‰\‰HXžìã—v.…¹oøN7¾hd<ç:ÐmÙj±U·ªc0sn ˜RÜ~öuŒà nÇN‰´ ÚTGMÎ0…]䇎û0"R‹ïÃåÁž£»Qä.}j}Çt'뎕Zºx5¡·m?YÀ™ˆ0#ÜÙ»ëN·ŸŒHT Cõ9<Ä`ãëßÎóÅKrvAÀ™Ì¼`µÃ‡Ì‚§¸X\Í($×è#y@˜Â«Ž¡f˃sý>É-ù‘Üï.FO‚g”Í.ò0c&@x ÷á5[fK¬,` ¿ë`à®z°L«¤ƒ9Iå5YÛ˜%^IÜ†ÌÆÏrö~¿g­fHú¹™Þ­ìí‚6¼Äï@4†Î¤ñ63‡ÄQ/Hô*`TmJC"W†vr/_ÁêKKçêŠ-ƪ«YÕ|õÕP=ŽãË—/ç<¢€á9~;Ý,+±½ ¼¨&Ö¯™4Os’´3”Ü0ñT[rªZ“é6K鈿âûûÍß¶†ÓÏ,åwÍOTÒºµ=ÜÿÓÉ*~‡™©’irË»’ØOΛ®8°>’Â9™Š¦—º´X%×GøTÇÎùòžÖüƲ4b¶ymïUWÊœÏ×´ÁjVÖÂ'ÖõÖ§‰¯¾Ãƒ©úàÖçK6óö)„­¡ûÏŽUàÉ鴳ʛXÿG8‰ßjxÀoót؃¿Á•ÿ­ùÃvýcÁ¶-Àð(ûýœk'ÍÔ\“ú‰Œ °|[Dp_a\A%='óÀIÖ*›ò»þ}¸n®îÔ­0Œ$ýcñizŽ"¶0=Sª©ÃròÜYZïäÚÖ÷(;g=ŽxkôøÔNU ±ùìD[œõïÿåúW¼? À®î¢Áûùóõùú|ý—@l³Õ×fŽonOíMjn`ã 1ðö®ö¤XÉ™¬öK¿úwÿû7?ýñ7?ÿÉßý‡¿A†ÞÇEËïþî}.اŒ 1·®)Fk»è»ô˜™®GT–Ó­H- gâݤ÷áwñ}ód¡Sq•}5Ý0çÞŒ¬/B*÷BÕ¡m¸Ö¦ò."xí²öN>ûÃeõÐ<6’ iÚË9å&ê§é¼ém¶™ŽhÏìñœén¬çªê¸e5û2Ì|r\Êû•½nH÷ë²B‚ àá}‹ï"¬‚ò"Œ‘iâ&>! wEöY@(‡ Ÿ«cŸ%{ÓPØŠßµG"üÔ4k‹7kFÁÌà!§ ô¨çŒâ$½ª[?_3ïÈAí˜þ=DmW04| gF¼58`¶vEQ=©¦ÍcúD˜‡Žfé™Î"RÒxM=·èºÓØU.fu.ž¬=!sƒ+‘9ô€­V4]bã³g 0á~;g—N2 êz£“·–ºq¶‘¡+·\Jצ˜àÉ—€G’UÙáÌ®µ®¦¦•:#;ާ³ˆ2Ûn›Çü+ô[ÈÖç§ýÀvz]ªlnQe€*n7îpó¦…WEâàL¹öùÚ<4ž3;=2Ãl˜q¨{+ïÃÊ'¶¤£î"~wªÐì`:J³ŸHdJõÝ Ýd,ÿ@s–N€aq¡ó?==B‰y¨f„u¯.pßrD—ÎûJ˜Å¶èÇÙöå¢"%-GõòˆÖ»¾u²pÃA3]Ù1NŽÙš²L-BÂãšpr®wÒþÑù“û­ 0ÿMcŠŒ“ì~qaVž ]"Ñ}è!< ± k¿Äùj”ñ-CÇ`Ÿ‰Lã ÑÆA< ÂTYDí°b£jªC§wáÈ6ªä bôMm;f§3ò)*Ê/©Б;Ûâç2Íž £ª¯¯«—”Ï‘¥q1ä:ù@U&( §ÒI)b—ùí¾k˜-S²ë¦.4·ã¸ÝŽœ¸kþîXJôðŠ.Þq[ý²Ú˧['óžgVXSq™V6V]cSag¶)Ž3¥щ0Èâá:ƒ­—©ÎÉô\Lít¬xóUÅÂ\Àš>ÉlÆ…QÎC`"sóê·%GdÑõç÷³2™AšnoiÆÍn~ûúÓ)1³Ö{; †ªj±ý¿¦"×È¥eûžî¦íû=‚ÕðÈ]åŒR¯QÎØ/Ú虫ÀÞ“ÔèöÛÚõËÝå î®—TìØ˜: ÿaÄâôæÿ¥Â¡—Gfî;œNÜ“LàëÛ„Ó}WÀqì-Ñ}v4!}˜ëK1¡Fjž<§òx— Äg„oJé}ƒ„Ê (ýF# ¦èÓÙÇîEl HŽ€áͲ›¡ø+‹…‡!Ç8B0 9Ê]™äD{½I?ÅîÀ¡ËsâªgÚe.‘S#Y?¯ y°ô4ëÿ±L`llãç(Àçëóõý úJ¡J²ú]ëÏldw Ÿß7€F迶кÒÂO˜ˆÆßýõßþ¿ÿúëŸþé×?ù³ûý5ÖhGïÍ÷ð÷ûÝ=mÜÖ?» yKÙã`:Øe¹òÕÝ‚gd@oE¸!¼—¹=¶ôKr×CUÝO Ã([NÄ9ƒ\F¨cŒÐæ&DÈÙ~?(:ýw___GŽÉ£eÙQo“Ó/eoWìJo‹æK®8 =ÎuúŒ;>«ÄòŸT•‰‡«™ÇðüCš©P“7j 5$ñ.Œ¶ žìm'®,ËH¥Ás‡½CÝQßÌHÃìÐR)v.n,ƒþ©Ô=Ëw>FÞ};øåY ÷ޱq×ÖÍλQX\i®QxMëËra?"­ù›ýºø8¸Qkr|ƒÓ£ˆhîŠï¨!áuÜÎ  ›Hcfã€BR¥—^:TéˆDÚ\›Ï+\})dW=îÑ ‚`¶öAîçäéÌÂkÓå³ÑE÷·ªØ°ÚÑPó  ?vžfýP¶z7]åSO¾‚ú£¤ª`‚±Ÿn?¤²¯áxá„ÎC7eúÙ@Ô9EØ\6„ª23s·ªF> ávArTrÕtÔi%ºßo­FhiÂ;«(W^ã|­0ïB½SIð@r70¦r‚f‚ÔƒåŽfTÆæõýþÉ»ôä­£·5¶<ùû;j;ä Ðe=œ¢é‡üo});Í SÏŽ:Ä)«Îl\cdöó¢69§©²+í¿1mÑb'Õð¶ø¤sñ\óÜozûtôÿÍVš&ídk$/Ñ#UöE½û`<<Ö=\’Oó·?â=ÇhOÿ“ÞDÿ? êÛ[8ü¿K`¯Õà>!R.s(¾ÓoÙ2ƒXõ|…©‘”ž2 |Ú¯¶LIt廹ç{9ëNrBDFƒ]tï¥ÝP“#ü…\柹¾- $Ìÿ½wk²-;®órd®Ý& €d…¡°#üâŸè¡Ÿã'¿ÙéŲRH› ‚w%Skfú!/3ç\kשÓl‚T;tiœSg×Þë2×Ì‘#¿¤ ¹{H'Ó†º‚KOžfŽz6#3Ø‚ÿ³l„}ØvÞÛA¢žÏ;K¤ÏâõJ£'Lc›ÞNo·ÆfÃÃúúã͘µ¹øZk¢€½áÞ_¿Y €ûç÷GXÿÿ•Y²`Ë}Yÿ‡¶¤ú2® gÈÇuO²?ÿ/ÿöG?øÏ?þò?ý«?;Ž£èŸ¸çßÿÞ÷ÊúºâC&'?¥ÿÜÙrz©¨ÁÆU݇I«2 àÄI-r‰U¦Å_uÿÝlFá¡[–ÜÈŸØ~šŠ?Mãÿ•gRæÛ¢·Ó]®ãRHÀ1)ã|9_Γȑ; GÐÍJ¥‚Tµ: +/1µ·jvj¦C£ÎÈ!;1`—z1ˆ¸<•¸K9ÍàM 0‹(ÿ>ŒÆ<Ë’Op™Ø 3˜u ”óÝå•Ò ,{ "œ\—N ‚“±Í8÷;˜ÚGmOl™ÒX?g½í_‡³¯Æ…‰÷~8g6;IÙ›î²HÓðšÝtŠ‹*ËïFî{f*òâwž'(£—lN5¸_B3dƒŒ"S–n–¿~݈pôSþ¬LŒPU„Ɉ†¿+®çs²Ë·}3¦pÙ½ÍV:Öår¡N¥Ò•¾ºýU¥€‘УµÅuÌŸÇÛ«Óú‡ìq«-Á"|S†gMncm›FÏ„gi´Ëe6ón({Ëöò'ýNéú>‘1¸&´ú‘§K†05"žÇ^^Î3àZs ëÁE*Õlõ«¨C•|Åð2Æyž:†çù¼Eæðh\ï”Ϙ‡¯ÝþÛÕû9ÌÍøËC¶ÛÝ`|[®÷£¤¦ ¨Æ¦:ˆ VÒæ¢¥Žq‹dxS3Œsà±ä Íé´HÌç†'L k묦ˆ"Ø}ïjÏì¥B“y`¸˜¬k!…9Ž#ó5åËkŽEóù[‹MJâ¢K˜c‡>¦àÿÍ™@k¦•xsŠîq—52wîûb:N5Ÿ,Éct+Ý” É >Ä7]ùa›¥º#86ñ2&ZŒ` 90á>¨ª /;Ϋ&ÜíðÍûS¿ªž¡N‡[fÿÌzGã1ÕRuúíÀm!Ê ¸¬'ŸyxC®[þs]PžjñáååÚð«½è š.üïÜÖä\0aëÅÍ—Lùn‹¬r?a5ÓpCêmÈ Ä³Kk# L›ùå£éÐÛ"ÿ|z ܯӗƒèÏ·•áT`¤²¥Ã*'fÕ¦QoëÓ……&ÙÖ‹Ø‹£Ä®aöÐ-'MI²&"`›‰X×Ò½o†ð2¦*<Í|Ð+ªúõ[ÐëOú-öMèÑÏ/¬ë%ôÍL|cVcûT•ÿ¦¬yãØ×k*|#¯gp<ÏþÅEؽLÌ«¯|·}4§eÌe7Ô&±¹ @Ùi63Ä>ݪz#òòÔ%gú3±)Aòâ m¼€…ø˜P=ä0ˆ†ínLk?- ìÄ ó‰ë³¥´!UfgŒ^ DSu ö¶‹’Qôxöù Æäó VËm…ÌN@nPm.g ;‡þµÇ“2–ƒ(c?ÞFºB¢nçBÞ§Þ_ï¯ß¸À­Ô¸ -ƒvKIÚFBãjªcV %ýWñe3Qæ&}ü9‹×ø¯ý—ÿáÿùÑïý—}ù»¾úŠ9$p/5K¦)!é{¿ó;‹_;gHÃ.”Cú[ìÚ/brr|Û켺n57uh»^"ˆÈT´©B5Û¦½zéUS•ë%¹§]sèÌŸ,A`ˆÝÐM§¦†â2§[Ÿ‘ÇCkT Æ&Ý5·ÒI¶¹iÝjLŽ­ÛÜÄsëpäŽÚqpeèÃ4ß±ÑHg³¦:.†^­O"Ì,¹‹YÕΗ᪣s£ -pš±Çñ2h+zÁæ…„Yq½…W âS Ô8Q`Œ¡l¡Ús™ó -ØX«Ë/ÿ –¤žD„øÆDÉ8…‹ˆ© ªÝR-ž  d3ò²q×¢š`hSIðsÇbl"¯I[÷¥¤9‚‹™3Tq‡ô4NqpŒ©ò¥ØfG"k²´ÂKky¸I$ßÀ#dܹQ Ɇ °ˆÖ MÀLÉ+9½†ÔÑKyÁ87Ç/È’\ ?Ç™ùºêß8âV—`íWýÞ4°˜ÙyFìEgð‚;ý͸f!ªjä «™(¬wÒ‚Ò­f¼sÝ_l‚Ùêp, Õs«Ò ‡Ö¬3ˆ«;(ÄD¤ÀÈÆ@³;ßeø½ì}Ö1´ÚK3 5 1†©ždOví¬“øî¶G£ÐdfBÓÚ Â=„KµhTå6‚È!щèÛ\ëí׊ê+ !@­¶pcÌŒSŠ}R4Z…aÜ—•¼ã›o#5—h;õÞ‚Ð Z§Äè‰5›.¼uÏJ¡;~i¥9 à.‚ófÿ·pþn€x3FÌÖ£ÿ ¿€Ç5ó$uí>¼¼¼XNèŒíR¶RW¨ªrþ€/gŸ¹!2!6³3lÈÃÙcxÑÀ! šs.þdS3:tóöêÿ— UËÜ“`;­à¡ñíÃqa¯XS'PÈ×_%ãøLþçOM¸^…9­8cR§öe‹qòžWWø‹ Õ~ìóy¸õD»>Ñ_‹´ÍÌ•2½?O­yÊŠƒ^ôbUó~j2Ý^ÆiqOXrc Ét¹/,:% ŠéÀR'Ïó|æ„ï=Ÿ)«ûÜ„OPÝ…y0»á’bzhíì7•|Ê£2¤ª¹› äïͧ¸§!vƒžÀÀØG-c¥=‡f\ñ‚Çôß2†šÌpõÿ<‡_%š¬¼m=©GçŸá’YxýѼiP¬œ™¨“n ^ìäÖ#aX8Ï 6o¹3,˜_(ÚCÅòÐmèø{6J»âþ·ÕõöM:-ç"à6ÅÜ"y‚&Ë8q>£=“£5¶Œǫ̈¬¼]É6ó4Ðe뵦Ÿ»Š{P Gu|-䳩-ý¡,ËgÂÕC„VÌ€7r†™Cnc0Æ9®ò23œsè%KœŸ¸TÇs|Ü–IÂâ)fÉçí®9¸ÔÖøÊ`TdĨ†F›;^7ôõ7ºÍ‘¶ŽÓœÀ˜¹¥iä [=ƒê"; ýŠu%±õìªw±tI«›Yn,5U^/ IjJ­c1ç)n1–nñÚädt¤ÛQÑ£2ö.G.HJÄÔÆZ©v—‚Þ=¶ªÞ ""U1 6¨¶Þáª}†^•I…êè’(ÃsnfÌY2cÐdL¹Þ9^]·.¦Îr¸ëÆÑ•¸„F™—´=˜dy„‹+×Ô<C٪ƮŸKf=0ÃÀ¬:Äzêõ„˜çÒ'(C/é–Pÿʇ6ŠèbãÖ®»T¹óV y‚›öDEz;W™óIø!`l.‚/†e´$á -Ú¨îër›Rè³ìâÞ€¾ÊO5È5)­›hB7m‰Fe{ƒGÞªQxñÔ£!³ÓM?Mаê½!AjæžýT'ë0 š )“2²œë¬dŽÞÔ´S¨+ÆV=õ—Y[8ƒƒe°fSKÎ+”òåM)Ínœ™Q'›a±?ûOÓP®»…áxÁ!@Ù‰øjÉöIiu)tûŠåáTuçùd†é0Ïð=˜7Ë(méÕ[çðÖÌŸºp„îtF›Ëkãõûó‚3êÖû‘DÔEø1¢¥dk¿¡' !â!úM  ‘D Ùš²欖tŸÛŸŸ7T„8/§2k^`3äYDbFÊ—¿SÛ é‰Ö˜-Þ¶…Â%˽!ãIÇ@Å«æCÁ¢û廈¸xÆy8a áÁ¶¨Ã]µã„Õø–XD<-¹†±Z 3m¤Zw»Àvµ˜™g/?Ú ˆå8Îì%¡ªÇq”AÇoßñÎECçÆx#’ùâMß1Æyž!Ô†!Ò¬ù¹WÏ}WÙƒêT[. þ{«sãôê:¢‘Ä|™Šm¼Íº)æ0ÖãïÈÜ–bÕ[Ö"Ñ]LËæî¿If&Ë1:7U—í‡æÜ ­óyñà| WÍvu!ö'7ùáýð¶ÑjtÿÄ{@ÑÞw¡Öhë^!”´ûéFѼ¶×Yñê-5Ì>¢@_Í›öüÏ>pÑk±'¼Yæû¨•oPÿ‘$—g4™·éç†_ª°hŸðáÞòïAßÌÈÅ×û";ªÖžµÛÃñªþ¯¤ŠmýG/ª64eYìÏgéWÖ¸a<°”ˆaé럭ge>HÍhàxƒˆÓÐ<×Gb6S›žàƒªy©ƒÀ1“âY/dÞoÏþåtõ¹£ÆÔ;IËkójÛ¼0µ!bÍňL‚êdÀ»‡Ï1˜È.Nzš?Öë+3„c°8íiËTÆÒßÌ¡#ô†-qþ¿Ÿ¸>\n€kÀû4ÀûëýõѸÿãq.m€¾ð4gy)]âÔ|¢ŸÁJlÒÀg RÚçô¿ýìoþÃÿõãþî~ùƒ—¿¨]r©º!KyÈbÃúOÿé÷ºK¨‚­VfËu2]è8µ#‡‡€õ¾‚?WX¥™1/ûìæHÁÖŽí3¿±éÍmÏ”8cJv‰­É#Ë"")µ£cOºüÏ)ö2±’I²‰ZM=Ůڦ“)³|‚iïi?1æ<‹ÌvKîÜdU°¿U„•UŠ&O¼5¢Ø²e —yÉBDÁ€4mØ‹ðø„¢ê5ä8ém• ªŸøÞe3Ë74t-4w^9‹;Â"×T¶átf‰¡òÌÿðÏÿ “‘ëï}ûCE=ß”ÿ]DÝðÜô ò±Ývâ·ÂÓÆÿ×Â?¶-ÁSØàÛTÆ_UqÚ³®M‹'½Œ_æk “ÀÞ-è8tªÏ5wðþ>·œë ÙÒj¨áþËBTÅ¡õ ¡hÅ›±dä½*D|2š"–N#Ž-¨°šz}<\i`Å ˆ.‚¿?óÆ é 7õ©O!"ÒˆeÑ;ÈËO®õã¢ø÷Û{J>iðSÃDª€X|‘H»3Ø"nÛežÃÌ][ CØ›Ž_¿5u¥½Ëýï¯÷×oh Õ½ ©’4ÆþȹÙõÌ x«Ð½öàLEöb"ýâ÷ÿÝÿç÷£üî_üÙO\è/dÿ¦’sÄÎIy¾ÿýï»(¤¦i<å.Þ6{`±ïӞˀr‘lÓ¨µ;Gù±>:_º<]Ftt%ŸÉ/¦¡zLkmî5_.4?9Äq@5—]uWcÿ±s®H t+âÔšÕØÚ3(K-IŒ l-Ô« $ºŒÛ2ø7$§1Á>ÌL¤T½–M…Yæ_gQ”–ìøœéÄÆƒÍtü\{­±“›<*Ä×Mó$šÇsÖº\ëJ=‹Ã=lè`M¬|~Î¥~éüå_´Á#¢ŸüéO SM†Ñ¿øgßõ¯´ó–rJ nV8˾Ñabf³±æS¹LÈ€5ÊÇ„«4õëáñ²lRæl/¡6F ú¯LZŒ£q¹¡gf(À 0Ì–¤Êí¾së¹°Çá7KAÔ²ÑØ£†³(›°ã¡¼Q´…ÎÍjÚH õ»-‡lñž~ìáeü"{:Fê…qý­jöƒ}Ù¾. … 6Ʀ7.A¨’ŒKˆ -w¤Ü8¼ˆxóKQØÁÿéÏ ”·B3Íø‚µ%¥ ~ =™èðNÆe¾„ˆU«òkW¡CÞ‘ç`ÕðË™ ]J´€ Œì„¡4buÕ¯þS‡êžËÞL«¢EP‰eŠºJªZ=ÏcÎN]kyìë.>qEl×­åг1ã”ÖsÐRÒÚ|µ©YOC$h‰p¼•æëëWÃÌË¡EÃb‚;„‹ä”²\OjEêƒqtG4ڸ˂¯c‘±H¦]‡Àâ6ó¸5óÁLDrH-Þw ý4ämWfµš”N†Ù÷ÜXsK‡fn lË'ÈœwGø0ƒ¶ ¶¼,×^qó¯Í'fɶ+z[Z¢/Ùãøøõµ—0>&ð6±Ì³(Œl;é%ælÎ=êäÖŸîQ<¶v×ΩéP=_N¡ƒjŠf¹tÝ)àa¿CÃ8rÙÐúÄWï^CÀº9¯yŽ sH¢òÁ’;"O‰®t\UÕaÙJ¼ë‰óÙ”j£wyÁvU()ß›,Œ3çãŒLðbãªÑÀlÔП5ÕÛ|°ÏVzü¼åuEØ:aXyî¿?Uãwÿ] è|l]–ûDsÌ• … »j¹‘ÚIXVõ™¯MÓU6Bæu‚&‘Ôo-ÄöTðk_½uç¯^ÓËP\ÿÒ'éžá•ìcê.£¢9i€=ÐÙ)pe¬>jÐÿtjÿúÿJÄÛ¥ÿO• [–Ý'óAð u!¾ù¾ÆÓ£ò)Çø—П°;5¿ÚÐ+Üß¶$ ¼Aðÿb>žõkòŒŸ×Ü®æÏq4(´jÇÒ]ƒ&kÁÓAiáw[[÷}01f³ŽÃt@$x÷Ö,<‘`õé¦v?Sîsÿæ?l¶÷¤Rñw(jö~Ï.!ù‘ÓíåÓ+ŸHà{%2I¼›³üÛ)5f×ý/ÉÏåd{FÈ'HÿÛ=õuÓ¾¿Þ_ﯼÀNÿÏ;|eéÒœ|½,EÓ£‰èüÛ¿ø›ÿøo~ü?øÃßûÁ/¾ú;UÕ¡`~<g“‘’räûÍ2 cÜßÿÞoì ÓÅ{OÚ6‘4»ò;~ð#Ûè_ýOß›ç ¨Žk ãOÇ£Ô)Ñ@4›D¥Óï^‰Ý‘~¹¬ªkFî‘Ô÷dfh€æ±F¡j›ß¿V¤LPZìù…„Ž‹‡xÞüê쟣¿Â`0ýïëÈÚÖ­% æÇãñù矙Ò|ÐÕ›¹\"Ù\wãšqºÎ4+Ýc¨q܆„¯ƒCî00$c˜r8õP'ŽSvçéR&ã3:ŽšF-Œæ”WÆï•d #]jÔuٌّnl1wyêÄïáÛyÕ…””†t¹ l-(fªGÝîðçL«™°ç;ŠA‰É•»Øäs‰W0›º)žs!sðâÔ‘—bâè^ ŸÊoKÖ2[ΦÖûѹ®G£ {•lf¯Õ#tùÔÕ/ëR»‰ŒÂóˆrJÒj±¶ì¦2Vº¹lYÄ7¬>Áf£ ÊLØÇ§6„ž€‰öö€•j()Ù&ÖýFRl±s‘Ì>þÂÝ«¾}"bžh½äjÎÖQLÛY ÖÚ•cC¡Ã ÁÂ[NĪª1_Â̧—ÚA8uô\f– B8/Hz§+ÛaivõÑMå6’O[O½un®|É+_MÙøçÕ¡¶#Üå+Ô¹[~è*%d™5ÉÛ+t^Õ¡z¬{ј¤13²óà 5®ŽÖ˜ÙKó¯prž#nDj æ£RÎâÎç%ÿÊeùsŒ&€#¢$îòq=tŒázgáp̘Îa8KA½d_&`k?fðƒŽCìEs=Q{9%P½–w7dSfä°€º«3UNkÀßó$`òéC‡t˜{ãÓoÆÖ%°ö°ƒšqQÇãðνÿ,3²ug•j5W›®C4˜'iáYò¯ê®œMÙÆnc¨Ú6²ÉÙ·¦¥ö{Ad<Ôr‘ù¿–™mŃ3'éùPÔÍUOÞ´Ù]VS÷ïÏ-Fr+l1v¬[‚K¶]Ñ™ºyˆqÜ=D—õ¦F£ÝÈÇUò„]Ròšb»• f:ÙùsóôYƒ‚¼×Ò[ƒújOà?·ê¿]R£·¦#²Ã°ØíW§­Ó7â<Ð ³ †ùl±µ×…`|<èoÈñÊàR|=ý»]e¿Ò¯‹jWvmž_òç[Ïsðܓ̻‹5ON¸k;]¾ëÍÜu¼AýD ÏyI<ÕzOßb³¿½5»ÿÆ1Qê±8Ìd:'ˆs=ן=ƒÇ×k(1–À$Ó€ 5Â<ÛÍ#ìµ”?Á44Ús ©´a¦¾4ņA‰xþ¼mS1:Õè{u2ô齨âË߯ ³»uw±Ã÷í‹÷×ûëýõkÕ "9hœ7ÀŸ¾Þ¡¯tíù÷_À-윈þîßÿŸ?þá—?ùáïÿùŸü¸QT¸´¼œ/Öð²úž †ñw¾ûOrܼhÔffûíUÓ©~Û N^±ÑIèÉ…³Ü=jE1)¥BK(³mÉÇ Vª˜¡noh}Ço1óî•Ï‚ÕcÞ ¢9{#_6d«íÎÂê>&.®¶²Âšb>w®h)»c "—`|ïΚ#Ûþªr ¢myêPá îLNaö£7ÆP›&åjŸÔ Ènù>ײŸ­Xëü<ò6çL¥l¼fB˜ªvÛš*7¬ËØkm½ù†ÜT§%ø†‚ÈXå8ˆHÀ½G#tCY ï;E Bæc›”ËD'™œç8Žc¡üiI– Ú„;H³.">¯93r²Yx Š}3'ëÛ8BŽæ¬!.·>\³ûºQD\%'æ33fŠÉ6^`6LA8Vã0fz;Øçpù¦/fì;Àõš|F¢ðÜŽú`5‹P³–š“{+T…p0ƒÎ—ÓÌ^Ɖ%c7n^ß_Õ‰Ós U÷y‹§öXÍ ô©—ÞÐÁCUM ™ÓKÄ,‡0–$[J¾pGêÎÜWµ÷Åô‹çÁ¿oøç_Wü¿<Ç¿¦d}Êùe)ˆöý[ëíüãÛ¢›ûèzÉlJðå­)Áè™]½uxذ»|P&™½nDY3Šþ´e”.÷Ž:`Ñ! Ø8I u†©“£HrIªƒ ‘ WÑçjÒææ¯³6Gm –¸ý—ïö|ó¯¡0%>Ü5)@õ±çò)1 À9ÐÍ™ \h¾wf¶^\5O DBؘKÔ247Ež[xöÆÿÕ×™ í4k»À¦¾Nðýõþzý*5œPöºúO›ib×Â6åßÿ¿¯~üŸþüwÿ¿ŸüÁ—?þáï½|øÐ·³‘læƒ`“ðcÇ#™@ã ðCv’ÈanÔ6å4MË™²¸‘æ>o1ÕpŽ2€8Ûù¤˜»fdx­‡ U‰Åƒet&Ϥ¨ÊÍ ;ÅÏ*"Ömn~ºPˆÇ‡Î(*ë «“ÒÆ™D”€æƒH›%]Q¹·OvD¸Šîõ—Ao–Rê€ óZÁ²PP5ÉÔbD\*,rêh4FïóÈ ªÊ¹ÇhÑÍ׌…&îæ£ŠCÄ÷0zñx^wuªZáø¢Öwxuñ–8­ª‘;GaW«£k”d >uœ6Ó°\ Y5Iâ•%ˆˆD™†Ñ ÿÓ—?ù³¢#¥Éÿõ_ý ˆ×æ°ÌTüäš\|Hp:ª ;–ôž¾Ý÷•)OÀËyŽTÍl4-Àý­"B ¥j˜õ\½›äÔFÌá+­y›ÛÔ>l•²Üõž2Í“ ¼«ÂP;ÏSßKdJê“)"-äãºKêI’ç[ Ç ôè°:Ù¦¹3 mûœ×Ï!fˆ0ð2ÑÑIôýPB„unUçß΀¾m!¥•û¿iÐ[AïQ€ê-h@†ó8ûB.*Ôet,šx 'æoöX í  A1C‹Ô&© “d>'‡øšãg5bÃ"Ô"¾_©u!‰O_qmÏÔIÂbŠÄbÂ¥©XyÈÿ m‚]ä€.s©Í8M×ÿsíÍ'jþßÈ^%žÖÞžu_]½sâ88¾­S4ÖõâzÚÎDÍ·© q«d*ÊÆÂ"úD7ÎåBG¤)ûù‰sWïSôή¤½´MN'‚¢¹°‡ªª0Ç%·'–ä¤x¦Ø8Ç scõ’ÇPÇÄsÓtÍõ‘75a>ÏS3 €#øE£ÑW  «¬í¼¨AÇØI õŒdËÑ€º/xE²–ÜS —®»ÛúäÙˆà=€>ÐX5ß¾Á0S"Ó¡ú|>VæSÕÛgãx˜IDE%òè™&[ õlÜrp„†™ïʘ0° nÜQ.ÃLÇ©C‡ 5±'å‰Èó®‘rOê¦?ćâð|%òû€Ô{E!;‡¼’,âAd°at0Q8Þ}("ƒ†å\àç_|ëñ8\€.­{wC. …ÑTáŠF$Õ@@$¦gœD‘SÓ0ÂýO®QZ v˜Cpeò¨Æ2¼Äu}úí àÈäªÿHË|~À{S¾ôV Vá+Ñc½|áölÿÞŠ¦Ë¨å !ãÞeBö¦ß¿m<–½ :šœ§[Q8š÷ÑÉ'ft¾ÜR+%-pÒ~Öä uX“úfÌT)æTçü-øQª†%Ù½<]Q[׫PÿÖíÖ.Ý ¢½Ö½Îù>[Àë{™¼õgšÍ:âvóæOºçz¡]½¥§qEôØ«‚7JÿôI‘¿ xÄž={~DÛÚ\¿ôßÞC žÅ´fé¹ô ìî­rÀՖȽ5,l·ÈµÐí”V`ÝV^"XÎ&ªÆj¦ÎµÁ¼l}ÊW’£¤0Œ™c9ní "îè73ÀAéw ebÚ[ÁíQ"6 ¦@ES‚,™C`þi„K5Í‚K=½@£ÓÐYp:k­À/‡³«MŽ,¹Å§7%·œ²O¸0§ÙôzK¾QúÇÝdÀ;èýõþú h¼&åZ³Pÿë_ýÍü7ô£ßÿ“?üƒ¿ýÙO}€»ž%U=X›/þöw¾ýÙgŸ£Â|N–œ~ñùç^UOz™½»l›¦MÞêNoìlC_XÏåAêÈ»®Ñ‚à[‰¨™ÃîÅ ÄÂ9Æýi³DŸÓjØl;ÅÒ‰\öœYµY %¡œÑ³1Ûç^ÕÔÂÇÍ}îaí ó`ºÏ×O;ó…Ñclŀ뼦ê…`a½m|ÐÄËФ¡êæ7 ìè–ÙK fÔ®{˜éaÈŠGI­ëƒ]+ËÛÔ†¢Ø”*Brä%“ókZ2FxÖ@WÅø°òZ6«*+Ó ©oÒzÞFlBNÊŠHA»fèY}ÿßÿÉŸFËÄ%æï~ç‹U¬$öwÙé-¥õ>r”ó†&°VÿÄdæ›Ç;ä=^2ºRæ]Çú”ȹ5{bhyɺxÏ)qEb³ó<æ ­°h\3èˆðm™ã|ôáåÃcúpÍH5L‚q»L³Hæ—×ìÉPÿô!b/,]„—ºq^Õ ÐqÑqÈãʬ†Xš0Y[Hr#ü`ò‰Ëbÿ„Ä=+ñ zzñ­g¢ ¨üô€ã†”ô8Ĉ„7³ž›JÕ6LŪóÁœŽé®î™0\X9‡šâÂÐg§®ÑîÉ[.Ë™þ¾’ ßB<Çzr}QuL Møour´Bo-"rðÑA|Ä­É’cØ0=!w,ºf'äÈ5‹)ìJ"+ëŒàÊDdzBvŽæ}Ïiþj,­ÌxNGù’¡ÛÆüs>œtAÄó´¶~J1G­í梪šÿÞ žv Ø[Ôº ‹<»fðŽz½¿~¯î{æM^ÞÌ`þùú¿ÿè÷÷Ç_þÞŸÿé ÀyæÙzÝöBÀ?ùîwݦê{ÄœHa†²ßúÖgþßCkA܃"}£„ÿjddOÕ)=»§ÕZÚÒpÑù$d­j“꩜>±6¿uŒx­E ©iêÙÙÆè”ùPhŽËéZZDC›Lšêÿu ç¨Ìž²Vh`ÿ«€'Ì´ïÛ˜YDÒí5›Ö€5ý;.9½˜\{´å^ØÌd6P•se§Õ5܃”cÿÌÉîV´n¶ZĸÞüد„F‹žÙ´QÀ÷Üf&BT2¦DjžSMŽˆé!f„<·t R#©ÖWМ lNòat,R×Ëóÿ§Uñä*l4“Ž6aé;n”®Ÿý÷¯:³ÖÌþù÷¾3¡ çÈÔ\#" Š÷žä*s÷Y‰sJ}n ®Oï†1KzðÈÌFnaŠ•ßŠ¬ q*òFïåÿ8UÝÈQñ}šê’€õŠ?BŒæ¸ë_ǪÔÒÁDNg_?Ï} ¶ôÕ`‹aþ>Õ¯ûÏAK6o­9)zʧ˜± œ#R,CNË&ÏØ@ëžêK`Ý} yÿ·áxvÉÞ¨ä¨1øáË{onïµ–'ì”ÿZœ™ ë)v=ûªªœL1C¤vgÿÄäwÑÿyçÉSRMºæbN½b^‚Mš í˲j˽T1Ye¾°<Ç矦¿û»Ÿ{N§÷hõÙV{´iÝ7ÊV[§m×]ÂÐe„Š®ãÌìÍìb°bô—Y:äz6ƒZŽžòUú)˜†MšãG’ì»u ¦°8*§P3ýÉ’ÇbHËÜU5øÂtŽÜÆÜ}0[ã®2‡1̽ûÀ!L¹5‡ÓϾ0½åh×/y«“ ÁÆ"¹f:ìjÎUÕ1T„•T‡WzPž¹¡ñÌà‹Xÿ¤½ÁP2zY~FÕ®'ô‰°k½M|—~ßÒÐóqjHx–¯)ˆ†B¢ðž4ºbÕæ€‚7 ú}i‹^J© ÇÅÄÌrHØ5ЯyRC#ˆ©½ .Z’éyšúäA`¦ügÒhŸK6âd*‡ s…²Öqc˜ÈOG¤Â¢ª€Ùð4_ˬ^ë^~FÀûu( éP¢=p…eÏÔi \ðÈÆ9pÄÿâ‹oõQeó&þ|BÝBA¦Éú¿Ña7A×=""5áÁÌþ†©Y@ÿj€Û¨Óe(ÊÑšú?xîçèmäŠy}1ÆP=Žã«[bsÊÁH5ì –näon‡I¾®8¨¶,Yµf¬¦Ko¢šaëdžk05÷fÏõë2œÔK­æT¨¢ÑB޹ƒy9żòŒ«‰ûå ò)´\[Õ/9¶4/j­lm¨[ï;•ng˜7Ù*6×,‚µêj.Î÷ùät»«»0y¶¶jovö?L>^û¾¸èñUcÖ¼QÆ5÷¿‡27üóOüë€)-ÙÎÿ¿ýC¾ù?bK#‹ÀEÙ_½üO»¸^Ýë7½‡þ¯ò ?3ím]ÔŒ“M‰`þ˜ª![ÿÀ'Êñxäè Ò‰é è ‚©•ˆí|3q!è _Ós¨Ÿ×Æ›cyx¦ˆ‡JêV|þlåšOX Ó+f IDATr›“Õï¬V' !³³jkéT]ÌÂ…îÄ2ª°¬zSÆyµƒ›?(%ë­€m°Ë;ßμwÞ_ï¯_£À¶Wy¾4¼üñïýÙþýÿè÷ÿè¾|yùO ³9ž¡@ûþ[Žãóo}+1ÆìÌÓÚáÔ°ˆè»ßù­NÂÑÙ5[DajË„keª¾ÕTÕ…vÙA¬E¢ï›æšÆm T ¶›jv>Pj@[ða¾™n©‡N#%Õ÷ñZuͰ¾ÕÛ™=xÀéC«¶vÓÓô³F2õ9kk#É3MÆR¯¯@³œJÎ8´Å;?wäá ·’¦{ËÈ754=…¤1¨•6ŽD@j¸e’¯ ¨! ÅH+qÔK1´oiéV‹§zÆK,¤5l^ƒx–3uH}ÂÁºj r|MÂÓ­èÑÆ€c|_ÊJ¶Ž€„‰”N@Ì`Ëp2W¶-ÒY<"åÐøùrÄ­Âáòm5¬mö×ÿ­²£AËoqT¬¨&E¤§¿ÈñvA87ãy°þÏ1ÜjDÇJ±ææÃÊÉšS;O jel›?ÝèhF¦VPŽ&@uK˜íqøPˆŽ@w9Dˆ>nN9ç*˜ØòZ VÁ™Ò]!"rH3©ƒÁƒÆtGÇ,`ãáUA»ûH¦FZW ?¿ºkÇò:ª›šÚïüÎwgˆn>ꦹÕ)t÷ÆC¤ba˜exGdSŸWˆ¬HxÿkƒšæPc¶4¬ÿlb–åÈô#Ž8sŸÂÔIÞ}oÀd‰û‘on¥¢¤çÕbª4³óçyzIýï±ÔOÞüiDÄ?'p ¤ùÔî Ð&½±‹K«·ÒïÛ¡WM¹§€Ì†ÝvC%Èö²•lLȈI´NÝnâØdv·ÈDl ››ŽÄJÛ=gNË/ƒ%-c;Q|t`O5ŽÙ¢(u ,D¤:ØgÜÞ6íwZÛÿ¥P·L¬N9ºß)­Â2RD"^Ĥu‘s"Óˆy²q™‹úˆÉ˜¤k#uÿŸ¸QægVÛe úxKÀV4Ð~ó?¹üÞ_ï¯÷ׯxà¹ú¯÷³Ÿý§û“}ù“~ùÓŸþU7,úx=¤ÉˆpÇq.¦;賋^8¼›ˆ¾ó[_TzÓÜ=_ ÎåÑm2Iù.}¿q´Ê‚¦aÆCà5o¢ÓUÆ QÕ`+ÅÏOÌã8tè‰"N€Uâz…٢ͥSv¤: ˆ!b2õËb®û3V·F¡*ÂÒ]…r…_5®ÄÿúÕI®ûÌ` þ½o$§R}&“!½‚[É-Μ  ñ -E5¾³àÑœ]dÎm,`Â9cdd _›Úô¢¼#‹Ì„€WÕf¦C¯;e\jHÿ:U¬"M…Za7q«eÀÎ_z}´™턟FÏàÓ ÿ% »Dn§Žˆ1êˆI[7â’ìÑNMËc—Ù0¥-tç8Ú*7Ò|©j"AÝíŠF,€ìMa¸qsadå½ã;öRþ"©Ô•àÒ²9ÔV N}ý"¨…åÐU †˜³d÷c@}ýÜ€…*Öj-AþåúÎUbO™ÈEµ’ãQcOföòò⺘kÁ+ äæ*ð”rõ´Yž–-¢ÖÔ½lÛlÛâ§7>¡Nî´6 :’ÿm´¥·Î(w—ñÖG™@2? ™h=IÙu´0°ªËÒð2–F9>ûüáÊ”rþbl Ʋb6"5ÅðF2ÝÑ]êF˜É”º^'{/jSÏU™Ä1Dýî—ÅG ¸y|Ó-[M_F$ÃH›’¡&Â/ξiÙû”ô1(ÓôÌ]µó~¬\ëC7q @Šu·¥D6pSU+C\\6tË*V=‡Jëp2XC8Xׇ²J>6$`#:Æp7i¢ýªCº‡Ãæì™)éù2üÍû›óŸ=_ùŽãðuiØúUÊÖm™fM‡1,÷`}|söi„kÆ®º>"⌻²ÑSLÄ–ò;ßùv3©Ç¼{š‹ânExMlï*éV‹¶ßbã]H§KUºIR¼ Ò1|z‹"ï)º0¹i,ô¹x@!oÿ %»¿Ô÷Z &¬à°0_%êZjÃœŠ™¬0iøö#ò½(Ü^fZoO„jNôUBgpŒÃ#eÛs2P Ð5ê8]Mœih\¡Ž[_Qä“—µàs¶ÅÑçéAµLE‘ˆZ´-5KÐŒR©ûºáC_ä×A‹}‹”y%”ªØëÅù»‰Ä-B|{"“MÑ—›Úol]·Ý‡Ô÷y´wÃeÔ¼ ¸ˆÖx²mý‰­­bzb”–‹{õm/,>E»nЕ·ô¬¤ýâþ¯Ýý–O±o#†·û1õÿYÈío¤ú#‰¬«À5àöë]]íÙA?^‘†ió€æT)Z)¾”KoŸY0/h²)U{˜Ù¼Þ ”°ä›„截b¢^³AJ`ø>¬eĸS\óC êfÕøÌÑÒŽ` ¡™•Ò:îΛm…«:ڌĠ‰^äh'Ç !ÝØn‘›SÀÙ¢ð¹ÜôªJ¨µ{íî>¿¡¶¼ÞF|Ÿx½¿~McP'áDôwÿùßüñï'?üòOò#dg(ºËªfßúÖ·ê ­ª¾‰gæ…>¼ŠPƒÇ#åò/c‚Z4ÝÀ™5ªÁµ÷p¹éIuÔbÉ<ÕU-g½—•«ãïWâÐôIqáË˨©pÿ~þ­m4rÝŸRðw{Žëhëc;Dÿ‹ìÖ;úÚVÄàsœ>ö.,$>6±#³½¾ªgKc»êÚžTû Ø ¯4›Cá¾šÆ ²äº»YtðK|Ô9ïöpNŽ— ra¸2׎ÆõºÌÉqS¿’ê:>D¬#ñÝvÓv1"ƒßÕ´á8È5Ç:ݼ.ÞÃHêøû4t„Ëçx_Â_Pò}ÈÖLî†v:fÊ̘ÏGu–mfè 3 MþXásqæã [é Hç0^¥Ø>‰•=¡-ó ýâ‹oå<Ê<ÁË=˜j! ]Õ ò¹â\mo{ûjîa!•ß›YÙñ‡CÕ'Õà ÌI §ú¤"_á>yßz>_S÷1f‰bŽ(ÌÌ` }9O÷gøˆX2râ·ÄÛl3`Â"©þWD­R5µl­~ÀëaÊÓ[UȈ™mfžL}î2²ÞâÀ Ez©ùò.V0¢ù¯œ)çßÎ'Ò ;Eì%1ˆ¦•׋´ÙeI±R½æß·¸f£ž ™Ìü( ­«\mh»Õ§™‰vF_•–šÊbÿëå„¢o Â 0¥Å¨jð ÿTœ³ƒ«Ž Þd0܉¬sˆ¶ÕÃÛ7ÚÞóëËâï?1°%l¿þ“ÏVLàíŸö“|ý²ÿãµáVŠùÓ†>gKOfWnÿçJ纪¼Ft „^>N¬o–”æÌLse •)@fUâ*¿‘Ûw$¾ÀË;>s«¢çíøƒÊÀP#( ³ã€id¸.Ϝ̀($àÏ|áìxl€Ò ås פ?Ü£9Í @ð"}aͤJ%õ·åeQˆ©ÙlBÄ¡¨Âsœ®eÇÚ1¨þÖ‘Kö\ö HWbö^À:ðMËÀø³kckzÚÚ`¸štñÞ x½¿~DDô‹?ùò/ðïò_þñþð_ýÜ“3¹‘@ ÅŠ0¸ÝÚ_;-W];þ~–Ä`ÏÂ2³Ï?;ˆ¦-·ÄƒÎUthqQ·ðûÒ­AV[mJÃMíÿ¦fcM(3Gµ™k/_1¿lÄa1³ê¥ÍßVö™èG_óËKb–Dˆ°–cî™Jßò®Ú(÷ÞJ©Ir›ÖÂ0Ój†±r”P7ÛtiYù?® àel”Zÿà›púÆîQ/ÆÿúDgdß•ž:#rJ—dLÎÐòÄ)3&%2¥rä<$"Ê’%/·ÛWK©¹à>/Pï"¨›Çª½ZzTCé‰×äÈvµ$P.Œ>$Ïm@ØÏgfD3› ù‡ ¦„nµZž|xó4ÑFžfº ´•K-,×A‚ƈþòç„ad Rbfù®ÐpšÉÀ» 3ˆŽãp™¸ìáÞ´¤â­ÉàKÍ0Õsf€"0ƒ-ŸP¹¤25/ó´©fžm ®P÷éã8Øïž¼›šeÌÃRA µ­ùFL ¦ƒå8 (ËL¸ž7DÓ,D“\>{ô³>~n¡d¾Òæà) 2T ô2ÎeÏ~§þÇâÐtÉìe ȃmÍáPC°vƇa&¢s =¼TIpÒÆ=¤7Ôî}Ÿ¤ãx®À¡mùÝi™{¡¢æãx˜:n=¨¢QÜ‚¨³´÷¹_Û†`¦™’KI¹¡Õ9=Kþ[]¥U3‚®ùÿš"GtÚhŒc(ÈÓlí0$Ï«}ãàG¤7Ѭ¯©èñªÐÜ ÌŽêÆábEù³Ž¢—¶XCL”9 Â|b®ýA¡¤`œD~5å°Ô`p?8yŸ>âg˜{Ëv‹÷`pÿ“#÷EÈñ¾š¶|zqQù Ñ<0¤ý_×€ídêØ 3ƒˆDø8˜]>é¹·±¼ Jï·HËñç+Óöcc¨ÑF´°kŽ‘ªlBGÿM!Ϲ'!ÁŒm&à`;N›Ã hKˆu0ÕY¾~ÅCØÓàÏ1œixžcŒÓw]ÃÔÔ<¹“y|t­‚[P“ÇÙ¨(–ލ/úûWâ@Îjcæj_ó©kjôjÛ eÇûËgŸaq7'U;ö‡ÖŪ¢) ‰3]'-1€ÊܰMæõÅS[K$\ùj¦:Îs¨i5©}¿äÁ²–$" žgtÁÉ6vPkuÚjM§¾œ/,¯¹2V‚1@cèBis:Ç Oþš¸Š´Y0f6Ÿ:ñjI§…õé£X…^8¸0N#*1«5­åÝ&ʱ—`hܾ žù ™]–¼LŽÝhÛŽí±˜ÄžÍH4­ꢒåÙ±¢3=¸†¼iZÏàŽ;QØlÏë¡À°Zò…ÜÄ3·=\ÍñY­Õe+Æ/úÈKR±-…˜­b*ž ¨+k´þÃV  wD¬»ƒ/Ù¿Ÿ¨ ÛÓ?|"Ç}!ýéÿmý‰ÝXöÚײmXâ âø7+µÿ ¾0 ·Øl¢c®ÿði£jÉŸ-¯i,±¥ÇPaµ¶ØÒ|{ Ú†Dã@˹5˜™ås©ùÀ½*``!= ÒÓø€))™Ë&Ì4ŒfºoÑx˜ˆMBå÷+í$0Q¦÷­=Ô@€ Aùa§)ÇEŠ˜ÿ¨9Šdc"‚„Xo–ª=­i ­kˆ$ 7¥-ßÓ‚p˜E:Å(BnnÈo{ÛñÆ"±4ž]ÞO¥{ÜÝÏÐÿïêÿûëýõ+Üø?þõÿþ³Ÿþe•ÜLïVÈ¢ÇãQSÿ5LZº¹3=§Ý;w­zéóÌËZ’F[ƒ Ea×e9Zw3zØj„mÈÔÚJT¤Î4LRT;èãe¿ˆáåpLqǦ•ë¤ôý* @ EgSeÚä•ÍÙÌ #Âjš€rõ‚Ô`5-ç+¬­qȬ0ú¦:)Zq2µ°ª7#'¶Õöü™þzÛH©] âòv‘ëHÓ¬†¯uÎêR}ÇÜ#‚ˆmHu¨:1³—$FТÞW»<Òá˜V×f]Ì%1xF'‡³ÉK{>HDÌìô Œð/9Ùï¥ÜBÃïb{ì#TJño)kÎèöÑë×2x©ú]®ÅÈíס2õa6œJšvã€<úÂäV…›Õ¢ÿ68jaFdïB›ÀcQl3¤«—™h\°¡‹Ë;ìÕe H=Õ± ù~7~}ñ1ÔgABà3+Œ~ߢ0p„ºÁÖÛÀÏg™“ Y˜Î}f0ベƒ2Ñ–ÇÙ™ R)aÉK—r¡I_°&ßéÐ!ˆè[›“öÔÆ9ÌΗQH«Ûº«J~ï¬Tï6ÀαE<\ÂãŠr/g÷ãb­.C5Õ¥ÌðM¸ ÓüækŽjØz÷Z…‰6ð°a6r^ FFw‰¥¹ÌÚ5Ò–ˆ:I¡/}ù¤°Ëa ÿ«*+¶-Ô!ž|c‘Íá%7ŠøãAðXWžžW 6iª9fjúòrÙqH¹H ´ÝÅk¦‹Œ‹¥DHªˆ6ø’=¾ê:»í³Ìxg–ë³#É{F7‚>Ëûz»·™àªý9†ûÄÏãq¼¼Œ9šã'ºV>€ ùTÍ€K§z§©_óç9DJ¾ói᫳§ëëƒðƒujj•R³‚t)ÝDm«On;Ó F’©`.\”óq›™o“Æå?||vÑyŽ¢Á‘žJ˜KÍ5ßLÃ7á« þއC×µzÒœÖ "ÛUq+ûí2b† ¨k¿_…ø„pç_sAÝÌÆ0žCùåðáå|ùpš©ùfUì²½ñÏ5L/™L쥹µ´'GYJ…›1ø¨ºý÷ü«%µÒAO·ÄªãóÏí ¦ã™£všå6ž«à É} —CŒ^M$×Üÿ¯ŠÕû?çpmœçP“Eƒ ïõ6v­IéÿÉ9Ò\Y›7+£“ 3[–»^;Ç0³CÄÃÕ¤/5‹Æ\7¢I#¾îh÷¼bÛ(NÖ|zÜ}fy%§¹aTÆê3¤X¹ge¢L·¦VÂð'âÜùùœ8‹€|7@Ü2 ÑNFîó6gÜTÔ"Ø %D÷`1Fåà˜û RgG‰Ãc»V%=P~¶üJ Gì\n|µ È*SzÛÇ&Ûn¹kJ6¥U µ½#}+¶Ùв¥kksÙž§ý‡ñ÷VËž%ù½eýy†üvéÿíjß§úý·êò×J¦ÿîØ*õ¢åk=qíÉ»`®Ìº‡êîÙ;ošÞYÛÞÜÉ 6£AŒˆÁn`3cJXô…Po:ˆ!¬Wf¡¯µDç É#ÌuŽcŽL«‚šVR÷ÐHâó}®)\P˜² žöçn¹ÙÖõw0¥ G¹6Øô õß·äÕFÍ`HêZ€‰ÙHliÊ–æ‡Ù­¨á9Ü–ÿÍON(Èî=wÑ x† Ã+—Í+Á¿‰~½¿Þ_¿B €Ÿýô/Cvôg{8ñÅ)¤F@JÊúQh› —·Îóô*¨÷ ˆè;ßþ¢ø¿´(ñÔÑŒY6h×sáfÿÄA¶£¬rÚ“/„7nïõ]›D‡ªÊL<Ûç\;.3wk›xd¥ëU¬V jTÆÿ}-\JÊΓoOq[ÿvÁ 6ã*R•K`È]5ÈÂÉE£e´ZÔ6=K¶(¿ºˆY[Êv ØfK q8+ÓUÄE,ØÌ[½Šë¤UŽáª@ÕXÀ¦àgm|êÕàÚã fXñøó0™â >˜ ÇÁŸ³|õ·7Š’Gõ&æAÞP1Ç=7“…ÝóÄ; »KFÚÌn¢ï÷d]'u]µÂ•œ>ï‚#Â0uËñIÑ!‘}2> #ãl³ù6/?²él…+ÁA¬chælg¿ äÒgÊgÈ©¦ƒÔ†ž®Y`mÂmd›¶ ®]=o¦ìµÊËŒûZ.ü2í ~¸&¡¦ç9DvåGÍptWÁƒ£+ÞCD¦ÔóSˆØXa€"ï‘kæR,"sD\¹VÛ‡Õžm|k†£B¹|¥b‚×"–¾r¬}ÏrŹZ:jÆMØèŒ©påê§ s¨‹Úl¼¼œ/'1ôȱ³šëÍ Za-ÙµÊ?~ª{97sÐö½^±ïuªRSù­úÏÈB£$Ëi(c|ŒX¹ºÊ=G—ELÍHJ¬ªl¯iX‘ǵ½±»àOFlbÑý“2Å2ÿvúñ\Yt­`à‡ˆf.޲šÚ*`µ¤ÓºS‚‘ :jjv~þù£z{u–)ññ5*G ²Ìl]n;âÙsžŒëVçÙkœ#§Hû Ú=Z‰zË»@½¯Ló¢rH›ƒ!fà!i݃ª'â­ÀdƒˆQ¾÷~pâÜ ½ÙMñÜ%çpT@ÛÏ—“G+Æš/âk©’EºrH34D¦×½%óï~7ÕùPè Jy£c^LuŸrÛYÙgжb渨êâë6R3Iý(Ê@¢è˜ѧiËó!É9p¦¾7íÂÓŸ !¢Íµ“íOÌæNÇŒw’{­’þ±[çɲvðmÃ`f9Äœ¼`¤47œÑ ÉéO®*2~7ìÔø×2¦£ƒôÓjF¸¤>‡Åƃ}’+Ãn±€¦Z*uþ.Kþ-,5±CÏzX3úôñåL¢Wh³Á¸… yàÊáÙ; f6«¿ J^|\©}-0xY"– »lÑ_iRÒ:x¢7p#^g W‚]Q¨·"»¨ê7ÏÍÚæîûë¥å~’dÿlãcŸôþŸ¨ðmËÔ[úÀ'w4¾¡×¯v_a‚æ±{)ÿ®QõêW¾ñãþ<ÛÒo0´ ´„ªæŠ€0ÅkÐ{¸`”nøS3À@"'c¨©2…×Ð6¢ˆÒÔƒ„MX²À”7 ØjÜÿº ‹ÞcäL^õÞ€$è<¶>z…Ú¯cJ)óŠô’ðð91:Õv*Jˆ„¬#uHušçÕLU %Ã̰Ȗέê¿iÕ@@oµ=½Úná?vCýõÖ†÷×ûëýõKl°¾z ËãñH#jø`›¡»•p¾y#Ò ™Ù;¼ÿäÛß6UJœeZ–-†ždÎÍbI„Šú¹&dƒž*­F´­3Uqé 2lzDZåkb˜»q¸Ä«³Z@ŒÎ½‰2ÌÃ0Çè |·VõŠhÏí͇™ÎgÉ yáZ=ómÑT‹ì”€»v°â/Þ/‡¢NI„OõmßÖwŒ»xWÀsxúYºŒ’{=!7Á`U›¾Lt+ôb+/uÖ.Tž¢½ì IDAT¦?Ì69ÉåüÍa»ú~ÝDé_ÀÁ\67â:;¢Ë=,lf"¬T“}‰ -鄿 "rB„A£b‡Ë\ÌÌ>¤9†Ýw™1™”@s€uµŒ`¸nÍЈʨ+½ ±rJKÓ^ ÇܬS„BáºJQÌ{:š Œ%&Ó¸;}Èes½2·ïÎÕCr~þA "Ø€X6ÃÁj†A‚|þùùÕ¶i.Nܘ³J¥»ûÉþá’)½îjæùÊŸ "MÓ†(.î¢í\ï´ué¼.`‘9>•—9Çïevó±:Õ½÷ù2tX7‘·Ð6ªæá罡ÕoêêxY“_d)S å"ÉÕׯ…N‚i%…xˆLŸqS¾û=+·Ñ÷ l¦ÝRmXxLùõ™F¬jŽ`ÒXôª,œ™Ó7Š~êÕ¦ÝxØ'Ëm9F&wû¦¬BiaD"ì#“Aq㙉‡?tÈÑë†Õ-Hµí>* û`Ë)ˆÇçËùòòâ Ê4ÖìûPÅ­X?X¤(g_¶t"aa3~àè& kªÖùØ>ꤷ9pÊZË®©ÿ œ„hÙt¯¿ÿåÃLô?]u´4qú¦þ—*™]ç­ìk¼Ã7þ©î: ÏGßPüï¯Ó«!y–¢pß”=ox}´íQ,6`á}ÌÓýDDŽ[Í"Ø®6°\]-z¹Æ1IU:Ž(šÍÌ{¾ÆÀ9þÂQýú¯öl˼¥LÕÁmž3Ê IðZå}UZg{šWÊ ÃûÖ Øùû^#3h3zä.ž5žbNŽ>T¼0² €ô L‚Å­µA^WË>£`ûÃ’àÛ“3hÏ/¡+œøýõþzýÊ7\ôgàñÙg"ÒáÇ®O¹fŒ1F¨uEí÷¬Û^<šïw~û·ÙÅÍTÑ—ŸnÞ‰zA©qü:â½àša7£4Fí–™´ü–^o𦤲ÈÕr¥ þÅ%g°Ú˜ïI½¼Zv;p[ÿÝËÿôŠ13thÉ”øÍÓÿTv`L-†ZNB{ºû›ô!€-ÝSà§BX0;Ýj·;§tƒ;ï ŠœFìj¸Áìtêj:ÏX2ÛéÙ…vÆw4íA¼p]¬è+•EG &VX‡^!º 7ú~^J bµA9 F╨ÍLLÐ7Ÿî9ÑÂÌ6T%JÕtY¦†k¦f‡HMŸÈÓýVŽ V6£í¹“š˜üߨ¦ŒL„‰µth1Y€`³‡ÕJõ• ©š©Ôõ'q^a¿Ø&F!QܬUV²!+š»ô“ÛèÂhÎ22)ƒàŦ ÓÜ<öBR$ÔYÁÈHc;“+f_ß ÇðBàÔ‘•‚«Í჈Iÿû߸¼›_•Ü Èt3Ï^îìuG³«ºåEv­¤ÁÌêoÍ…­Çñ Š²ŒV¬:ZEÌDƸ§Xd“Ã"¡±b0ÜÌI)U$­÷OúrtUµZSª»9¢Ù6A¶õ²?H{ÛÒ÷v ‹¨•þ\¦\<278K©‰šàë>Ñä7ež¿[À¡Òžçi¦"šFc¬»Oìrõy¦`ñϱý”U¨„9w€fèåTFüè‡øº­zg‘ÆDe¨Ú‡—Ê!¿*ð°\Ó…\ëºFçÑóE4tŒó<ÕtfsûÈ?J@gTÖEhFþˆ‘ChŒ» ü¢¼zY›»¢rëü=–•ah©‡(d}ß r%§ò+"·OŒá¡—®`¤áÝØP±-L)„º‡@ä{Ú9TKüå;9z¡a³X¯]%yž§Cœ|’ãY´¡2\dG^›.š[ó \ Þnvy¦#î…%öÎû©S!„_`)á—ˆDX;¥zn{¾ Wñ±ê`Í&* +/z‹€š´ô$Í,¢Öy`6£ö8Íì¨ò¨ÜFŽ˜D\mÖë™ÛÂÐÍë9~ÿt|Dû>NÄÈ!P•C1`!ìŒÎ,ê(1U8BsG‘¿ÿËÿxÙÕœfòý÷~¾©:ÐÖò4{ÇcR³EM?Lð¯§ÄŒ¿ß ù—8lÜVZ«Añ ñ`aAf¶õú—”‰†HùJ4„9À™añN›Π‚Ô?&ë”_m®ma]Œ+NçÌ eqUí]’u”á=²-C3„8ºch¤7Ä״ƯeüºÛúÍö¬põ-ŠÃ±&FÕ1†ã8=¬%¹ïÓ<Ï>V·?¦Y "ß]ŸÉQßKiÙ ×cZîùüWzéñ_Rn Ó¨mc@ƒ;]Õ,ÀÓ÷¡ïˆ¤ovÚ šYª˜-u©WHSÏŠqg€4Ù¹ŽÈsŠr`Uî5•õÀŽb÷l5“¶¦²V©|¹K´ÅžTÉ𨭠 ½F%ïk&äxž“f"Cmç,Ë`¨hÍUjfÞòx¥å) —®+T:]¹%…¶(¦Vw†bve[s<Þnm4€ªÖˆÌ £ã¿#K®~‘¬²ßMÑö1Éi2t,% C½z¤­Ê׋·ãx?Oáö܃Bì#– oG‰Ç™4‡m¢Ñ©µê—\ÏP8-a²GG¶A­_¾k(÷øoUê²'%jœ7„«k¿1ÆÐZ¢k½ö`FIÔÚE?ç4šÕâ«Y‘íVE÷{ÊüPÝ«eȧ®U=†ª€fTàd1µ×¾×–¡'XmG¡y©º²(saiÓœÐBƒrý«Ï9i9ÞF–²¢ÔmTý+ÛÀíRa"ðá¼qQìõtB*BžÐgÿ"9H^I«ª¡$ó›æÁãsB‚¯áxhh›/#çû¬ôÿlÞi6”i›MAÍÉ8=tˆ:Ðëýæ£mes•_„]ȦaèÖúÇ‘tƒäÇ&Ãý@’& É›…ºkÿmÚ8F‘†$ôwŠÂÊÕ¡(üÚEßÚ„É-7²kPzšJÚv<‹`w…ºº? ÆyI¡c¸¾r™ÊÄ”qS1©z€›™§åEP>®éÈpóÀºŽþëÕÞŽ“= Ë/Tï…òp<UqNv½§©–V=‘_—Å[Û¢L¦™æ3w†'5;2bÓª‹Â)"§¯azŒžJ!(Å}8I5º„çËZëZ‰•‡–4±“e7µÿ´kG"ë’ií š#kïWt¯>FôG rGé‹@ßLÜsxÁ–2 ³¬º!uÊŽíã¢Hè…jqí·]^ÊÈŠ;‰[»VŒ-ˆõÑõØhȘ®ñ²È¨þTt^<–šCB*9ö¢WçÍ—ÀýK¦zv%.] ²§ÿˆþÏiôoXïöüþ4þã#x›.÷××'êÛÏîà½Á÷À>3áËòK/Ší÷ÐÝ Äïäß>Æî/X´áJ³çWw:˜½æ¡¨ˆ¥Lй{ѱ'¨•²¿s AžÐ¯9ßE‡”5›'¡2Þò¦3ì7Êœ¹/“L{†Ðd4J ¥‰óudò´Ö(ÂiðÚ’øjúÐÇÜb[Öãï5z¹q,ŠÍÓùÊÜxœÕ6tÉÎr–¥Ñ?¼žÎú?e}ݽüªåúÿíçÛÏO’˜ÓÐ0l¯hó¹À=QÚþÍïýnŸê ‚Ï]v‚ËÅÁF×™ïŒÆÂ}ÂÂ8Ïse˘ùZøpåf•âRr2fLÕ<Ésdhº«Wµ‚QõØcG0§‡9dB @©èot.›ÄֽаP–9¡‘ɦWÛé˧ ŒæûBâLÒ9od d"g% ÷È#¶‡Mì_P³¨$t‚oW¨=¢oÑñ`å‰ö­­¹G[+·Žux Ô÷Ìà ÊîP'ïË¥Ýw1ÒR@Á3ŠÍ-¦2ÛÖïð£+U2êjÛŸ˜ñ<')óì’»5t§Í~ðìa ÑÀüÊÓP>ÎŒÓÔïFåŒ9ú¯ºÔ RèÖÕæ8íŸüfÔÈÛÁB³ÙûäÇÇÐ!‡Ë•‘ýêmáÓš†œ2+ˆqÏ6§Ùœª>ÎDÄB^·–³w„%‡ïVµF“Bÿ—ü?ã)§I%ºª¿_Qqˆs—·{¯/W rþ½Ò”„;ÁX6i¦V×±Xù ŠU0ò9èèšrÚ=œ€©Ø´îú€g(—· µz4Ê–fé– ÛJ¥÷Ÿ<J…=#‹ªÙÖQ#¸ÐÒ¼9·š^w˜‡;ÐÜÃêÌ£å@U0.Ôr™€ù$q¿< ïÕ¿ò 2]&[a6‚æÃ~iâÙ¬±AÜZå’bŽÂ¬XÍÔÃdO×V!öYþþDU¡ñ‹ ý%Ûçë9\3Ä$<_d>ýó)忇ò¿)?÷$öØávÚíÑ1{rÐŒû”¿Å oCß&To+Yy¡JŸbÖž’Bša rЉËb—8H¯t?M 01ªˆ ш$F˜þ'LÅÉ}ïWC\E¥?¸ÅÔ„`ªU¬E,}9ŽêLâ-ë:ü/«’ù¥R]NÁíîŽ?šP¼> Çhüd1ýõ•«¸æZcÏå$d37óåMwøâ†úÚ™·®iüЗýöóùµàÛýöóƒ€JØ-)})*YÒ‡ÑËVRA阘Y7,GòeίÒÓN«ú,® 3'tºBßd¨ÉsšCÌ>‹kBò‰—DœFšÇç9ßÞ@D ró60ŠÚœ!øÒÁœ–ih18¹ì#ëUW=ðöÜ#ý5Û+,Àb’£Õ_±´ë{Häl´vâ|qkÓf Y\ÄHE -äݪ±Š­Ð éfCx»­á¢ãgJ/¯eMk„M ‡òý•sÃ.vA«¤»¼õ.mpŒjÄ"ÔÕ²Ú£Õ·6Ý‘·bˆd«ã[ú Õõ©‡ãDÓ3¦–*ÃAþÚ©•»Â?•cPŠ"µ]31Ïuɽ·FÏPɯtéÙÀ¿¨b¼ú²A÷ŸEYš?9ÿÚ@âuC.Ø÷B·]k¢h ,ô”!Aˆ½,!1v±¤žˆ:¦xžÛê'")‹ÊùéœÞ¡û$IaZ…dÉsN´Ë0š#K£âc—Í:¡)Mè?@p#ÕÑ ª¶}5S™^)­whˆê­$Ðŵ8 c°^žG#¦¸z}w·T‚(ž¨RÍ ²ØQãUl.^+€QFÊœc "±¼×6{­é´e ´…{­sNç×Ë•KôV ˆÃý²šW§ˆˆüüç?‡ŽsN³IÊÛ1ü/»@µ¾ï?ýã?n¾±¶9OÀN8ç™ {4«_“¦ÏT„Û¾i^̶)È–¶u5Ù`&ê1Snè'¹¯fU5Œº»t?è Yž‰ñ–¼ìEd.Dõ¸U±3ËœqÈ[RØÏ?E yí{uö‹ Ÿ~ÑN›Z ½‹{’—@àfui=- xêS9ͪ‰óªné4€"*›•…¹Vk¬.Þ_ZǤPwCä«‚Æï¬9¯_3týÍ‹P+¸îéOÏš…® »Ké““ 5-3£ç‚žE'ŽIc(të$×Ä+ïÂõÎuå¸)­vð眣Å/¨B¡¢æúFQŽ ×{ˆ%?a&Âã;E>Ø–œÂ÷ŒsÎ¥¤.9p­žÞeœ7rŒ>)ÉËÚ‰Fw<¿$‡­ÛÌÎiÚ„­ñ¢ ]6€ûÞ+”ÚPô»¿ÿ{e`J¯é^UJ 9Hk±Šˆ˜t²öb YHN½#Ü†í¨ ŽÐÿ1Ž1Ž¡Î L³X„³¿ýBâÆ€—×íÐuN¯™æ/;Æ(J$é!ò²´# ý_ž’–¤yñW\^ä*d7‰ö3£§¨{’Þf å‚ÿ²FñÁ Ç1¢îƒ'¼€s`~²ð>†Ä±½U ©¶YOovxOÑö[N—»—B3.öOÆzVºi & “etÉ»µÕk%­Áš ýjφ*Ó\µ¾ö bÛËTN[–£´RS,哵âøÐÕæ¬Ûž9¿Fáó·–¿0I݇¿¬ÍMxßÅܾâõ‘ñôÖq¯«\«P•Ñ`¾øè=áZ¨íe绬¥¸xŠ½ë ¥|:þ?+zôù}]&øÀ |Iøÿ…à ¯xçß<‡{5ïŠp‘‹{æC¢ãÚ~~(ÃÞlÒéçÉ̶›—=ÁË=áÐlj†þ“=’VðgÉ÷/&’RHÚ =’c09ß*£ÏŽS R‰Ž tžr9㛞±õTìp¥F”d§TO€¯¿qÉÎP0ÿByåÍDUÌVž•MÔÀ¾+íûúbYØðŒ-pû‘ÝÁ=Ù)pò—¸ øH)Ü^çHýc¡ù´Ê7®åÛÏ×^·°ãðúÝÛ€È9-Ç¿K¤U¤Jdb”ê§â+ÓDŸÈ‘Æj©FQõ :§* 0Æ€lÒÅ¢+4|³öÝ›×¹¹\F]fYÿ%"f3?ŒVscKÞ]'œ` ì]Sbfé°·Q’PK?²´@ÿ[ö·]lw`}¹ZøO‡È{¸P”Îí Ø“êERP<¹/7•PÿTñ.¶* »ž¸.ž£)¼§6ÿä—Ó‚ò¤Wb°ˆ`ÚtµþšÛ…$b¼"rß´YÜa=Ôyw„ߎcZbüb’T½´Ùµ 7Ì9{7Ñgç£ÐOÞž‰p¸=S›·HÂ1–ÞªU÷:q‘/­¢^¡5âI,(%ñHh…ëé<ÚäWöGá¨[Mп2ÖƒXJFn IDATü…hê•ð™,ÚbEòHăeû“HTÕB¬ {ev“ÉâqAÔì˜N„ÕþÐÐà'rVÏC­Í‹K'²*"@ йJ}Œ#j·íÕ€µQ þ¥[¥Xu½y±-ÎÍ@»µ¾èCŸG£9ˆŽ &NuHº¹Î‘‹ƒ3h à¶Êô2¦_eO¤Ùå‡ÛrWwn›¬\ßiV W$ƒªÉk:ã#.Úð»þÿè6„”<ç<Æ8~ö3!mžfœÓþñïþVÊ8ÕKör`÷¸÷xÙ´)4ÇþZpA-5«<Âß)2Ð4¶ñèÑèèÁtÛç:€ŽâuV \/=²w‡²ÇÝpß´9Ö6Í̆êÐÃRaíßM÷5¶£¾ÕÁëyÑEx˜Ñ$ÊH1Üç|éeIžæ£—ÅêÁ\9*€ŒãXTÁk`@\«éa/a®ÐŸ juܳ,hc ¿ùŽá@ Ï%Ý{ùj#ši­P³HFÒä¶bÇ7Ù‚‰êJð—ªD¸NŸÏs6@~¡Z– l¤H*æ¢u`¹t¨3â0ò{[j®ík&Bí’)–yEô¥Ä -#‚LµŒ,ŠnU•ÐD›‚?ñ¡¶·wZ¯NÒ³L2îÌ“¾ô%zÆŒ·Zcé— 8†ÎÓ^°qè0-t˜È\"o?4“–™Ñh·¬ºÓònÕêÚVç0Zö+*1t.| ½3±0ÿ¾f”\ÞnXÖæ8EPå-~ïXæBª–3ƒïçyž^ïìîîÔÒXÚÓêÂ×`ÅjžžˆÔÖ…2f`=žjw¡Il^¤Í¹ É™lqè‡rÅÞézkÇKŒÑ­ìÅîNkë3K¸ÉLåÀIçx‡Ùž³¶TþŒæÖ¢FЪ Ïî„°&·I¾?ÁÖƒ55m¥¸*¸ ¬n^VhƒþrÒKå/·Ó¬kîà´­TÃoÆ„JÚòò”ÎÜœÝ×19Ò“;Êì«Û‡»bÌØ«\ÈŽ¤?³¿/Ðü;¸Ï^bG¼ûù±ÕŠÐ›Ý@Ði¾ b½JnöDÓíìXÍ5ôþL‡AMåÖÜŸé%þJ<êú€_´ÔËd¯â{…?þ+û©Kµàx‘ô¯ ¹WÅݲþ;.¼UÔ v&³Óé¥FßÚ/w2ËD Éšh#5ë>ܸ™‹Xd O‘áò²r˜ -TNþÆÈjFL¿d[/5$'e8¯0RéŸ2|ߪkFê1Ö¦È±Öøs9§a¬ M&Óžql.Ñ]N9¬­~ޝ¥œjkNGÿÛüB«&ܺøPø@.òr"^€Åwù?ð5$ßåBÚ¯¥¯Ãµ¿ÁýòÃõ€Ë=þW<(>w¾ @ÆK«C‰ò¨êïüì Ýq,µ×H£"Û•àYÛ1Ýf·ªkÛ³T6ä*Ɔbúiï¾{#å8@f€tý˜f^MË®ËÁ!$çyj"ö»)PŻͮž]+û¶¥í*Á»*{ðQŸ)}CU7-$ÀlZC4^BZ÷Aê"Çfèî!¥$nÚÛž¡ël¼„x^Ñ™…O¢g`+Zkƒo„3ÕÁa?>·úwÃ~Qº'~lñ¾ª¶„“²o„ë¼ TgöŽ¢jx ·\¸h6(ª6U`ñöÝwzžïçiÆ®—à 5Î>ƒ8éþàŸ Ê¬¿,.•ˆÊ@‘"‰^WŽb`%®ÿÏ R˜Í¹eš©]ÙÊÛEÝ)–h‘$dXÛ™nE@µK×b* È+‹çÈЬH_-Ù+Í£RM Í¥ê_PȉD¸…¸7-<žUˆF ,¾ªX¢1~昴TÿruÛ@lLLþ͸mìVË1™‰çŒä^¦š¬m7| 3Y¶Ñd ­iOâ"r¾¿{[á§æIÜ º\ªïÙ5^·Þ|9içÍ3ØÑ‡þGF0sšY¨z’x^'((6á^0Ë 1öç-¾3#ŠkÉ7j´!Ïóô1¦q9Ûƒ~UOs÷À)¦•¡²[2þ¾-˪bàˆø±iµ” å´dNMè@C$ÊT<„×'WïLä¡ó“«©|ªÁºº¸$™ÛÒ®ïãn³ÑgXÚ©ºU…Þ®âcO€Z æžüÃgma¾´eó0T—Çb Ze-i׉v A2¦ñ¦V6G|E”ÍQîÑ~7Ä‚Ïå°x„þ;©°ßq¼ÿîíË즪ºs­ÊâCíûþîï|—ÕJ1·9Ь8iù±é²™THóû’“r=W–™fC#¯m(Hzï1„f¹ÅÕ-2é4ŸÕC%µälÚ¨ô×ÜÞˆ6×B3ºš™:Ð!¾Ë ÙÒýÍ èsG‚î×]ßæTQÅ…h&–½^RÙlj.JOêì³cÓãËê—\RYƒý Ô†Þù†íu~‡ÝüûjÛæ TÉÐR0µôM¥ÛçÓ˜‹›R&¦ûµµË=·¤ˆK£} Suˆ÷û÷w#¡cŒL'Çt¬›R ÄÌcÕ‚UTÝê 2[­ŸëÊC¤”~×¢—&]jǦÂÊ¡¨EtЊ­ „ Ò­¡\XÏ­à,•R+-)^’z§è †Œ {ªð©d^¾`òv%ôlæ¨x¡l8-!Cè85Ü$c.„"1€¾…ü?zBòó4^HÓy°T\õ_CñÁ&Ì©n¶Jmû–)Ó SªÆ«uÙ»Dt&tß}&BÄïû°—k^_! ‡Hùw\ÈÙ¥:¾Üͨ4væcD˲l.œ®:¯Ž‘ ûö3MÆÐ·7y/dÍìÕ Üo|ß ½Z’y2\­C†œRm Úk«‹£èêŒÙõE¤* Bøm3Xm/¼ú÷¿øÏ÷óœ^üèÉQk:ŸçßÿÍßPdÎp68›Ü€ì]€ßúïãZ»Ž×JîÿÇW‰¯Ø¨äæGÄ›/¢ØH¯cA®‡Øù¾öEhZe4À €C<+ß1Ä:ƒc¨‹;³Þ™6Ž@¶¢û§T®÷ù¨ª'D{À !B¢­çÅ„ºý™4—{ÅCÙpeºÜ œ)—tˆœÓ82¤Ý”ÝltKŽí彋"!§Ù9çèf‹/––9Ðÿ¨«•1ÂŽ‘!»ˆÂž°“ÕŒá‘PWX†Wˆ;8Ü!æÓ¦M™"2§‡\XïZñÎpÏ>¡@£ûŽò.2>·OÊ‹KÁŠb¸Óååéyçà+œÇïJo-ÊAïW`$¼/â<²_6Ë#7@ÏDtÇ!Ù~±õ+¦žoÜ- ¡ùl*2n“<Äq Ü83’ÿüýûyž½ˆ%$Qœ•$=g“œfgÄc²‘^¹jXºÐ°r]ÏÌÕŒ‹M³^X.Iì¼Êr=(?”=–åÀ-÷ äóéYêõz²hÛ‡dpÐñÑ#z(FË­í“ôê*"”q¸š`ëQ‘½fá 5ãÖ)$2¼b!šâ‘¢@ÄåEa¬ôHÍuI'³ÈœG™Oh² †öÜÑb˜s˜söq0Ó¥ÔÔi È©1õÌ¥äúD Á•³oæ-ñaÍ&ºíWQhšöÛÚ"„<ƒ=I‹/_:Ö§ÈrtLó*¶¿ðî`2é½&á?H—>ÃQ!H½à÷Ê0\ö]ëI¼0¹µ1ü¥ ¥v²ÛÞà#?˜! ?ýǧÑùëßüVüûò(q‘Hë¸qWñãz_Þ4Ú÷¸˜"°Ñø" zá¤ú/¤G7uTL¬ë*#OÝð ùe5¡ŠfWPó‰2[’?¦@E|¼”DÏ#™‡äŒÙ­6)6#ì€÷ ²òüe)B¼³ÑÄ|¹t%–u»Ër¶2¥:¤)°2­7¦!¥µÑÏ÷¸{4cÓá‘H‡ÿ§K²hŸWÒnl…!¬Íí}­>¦¿ää°­¿mÐó‹h¬Äû¯î—ÃÕoÃÏ¿ãg4þ·¿|i}ø­!l¾ý4ÀæÔá*jüÞïþìúÔEgײàIÙCà=>2L­Cn"/³PA”4:ã©CÍfûÕ „퉓ȉ‚Œ§Ñ¦IZ QD–’îU:·î¶s3³9çqKø"š ‚÷ÿÐj]š‘.¨¿lê.VÞT·÷¼ l±‡-XmV[Á@?uä%~ÇæÚ.¿ËWsph¯¹_«°¾]q‹qF-±›ˆëM,Nî#x¯ümRêð ˜ä. ô%bcj‚ðKÑ™é¡x uSýD/ ÂáÁ¯Óœjš8©+DS¡ ¹0,›\&J-=æÏˆHj®3äȯSEÛH¢˜z‘•®ÈÕgÛêÉ<èÖ<™GbÖ~U¨ÄüS[m–«À$¥ˆ!+±3áÆüY½ÄÈ|ÚŠ™¤›¸0R|Ž…_ï¿5©¤©¤mœcÉ‘,æ6”«¢µÙƧ$D0IqÉþÒÍæ¶›= 3­î·F°ô@€)̘} ¥] !šL:¾œ/,ŽÎ¨²b 2hÙZ+l̾’ô@ÜÛEtªÖÏ_d™H ÞƹüTµL0æMÒW·ˆkh®#´çÒºqƒké-çÝÁcs+'(˜)ú­¯»•«‰1EŽàô”qr û‚r¨œ“¹y샳ÀAÙ¶Vmß‚-߬BùüX5'c(Æ!ótʧ@É?úùÏ/2ÿ¼ÿóúOeg¶ì¨÷׳ýЉ¡­¶/·Ò{¡/;ó’ðѰåh²Ðh0ï˜uuæÛwÇ›Y Ì›À„Iç›n 7{}b=J<ç-,)ali'݃:VüªùùÌ|XQÝ 5ØJA= WŸâÒ>Ï ¬_°)À¼ö×ãð¸8X~cmÚ¢YÔ!T@¦èÐG@¥0eWq¶¿)fçûi$†zV¸k,úÓ¹Kdñôj*ÊfèÅŒûÉhxðžX‰¨z WýF,Ô{˜¢gø ¿®FÆôä¡(ô?£]ÖâžÓ/ž²T•Ѥäá1®ø{¿ÏiÓ“À¬2¯ÆšˆÄœ–¡^Á+»°†Œ:×-VÓoEêbÇ7½á&XÈù9«¶K­ÒU¥F"6ff)“ב@ùªžJº¥eaìñœk–£@³h÷Š@¢ƒ×p.›º”™X¨²$"“‘Ѭm宊cg)âŽ2b®Ù•eÙ¼δ}Cÿ¥WP0«z hîÒÞÖOCO_¬2ŽÆGìMÅ+îF¸Oãh*…âê “p®Ë3 TAv $ü+(–Ió îoÚ,”>ͱ]TQ±ÆÇ˜ÅK¡úóÓïÅK¨ê'ùË®Ö/lµg>Uúò‘¾¦¬Š®;:¾‰¬ñâºiñP-#Tø Vz ôÿ4ÄÁ+"ÿãÇü/äCÿ¿À’,ÏÇÜnšþå>ÄÓïs¿¿¯£=‘þùNb¦¶X äÈÃAØ@† IŸx³K–G-Ø3 Ïâõ:s¾§öŽ \›%3ô±¶ÔÝ9}¤ƒú:Ä,3ciBuÇÙ([ˆ’ÌSÆ‹ÕÊôwíÞȶïìwdq»‚øW^^ôGg Jµ¬‚ ïØÚ•K­:Ú蟺×L¾Àh^¼2XJr‹ê‰N_Ùòb1û-©¬8Æ—¾ì+v„¯µM¼²|ÈÃ< ÿùaQÊý»àÃ7ú†þÿPýþû?¸ÌÜm¬ÐÝá§>à[sìVîTsØ]Xá—Ì eE˜¾rsoED‡Ê k,Ì”XkêÕ :^hßš6#²à®v¿(ÓÝ-"®ºª-JÂ[0Ö– .L:z2¾¤ßÙÜ}мàûòB)ß°¹uëùn* Âbî§]™ ÅÃXܼçh»R8± *¥¼êÜ…üµ/Z%Ÿ»Õ9Îï±;³Hè˜15~zÃÒS¡Uy+æµÈ¢¶Õ±·ÃR1Dwp 75cd¨E‹Ãäã^¿+&P°œ áQõ3£)ºÐtÄà÷¶W>sU$¯»L°m=…ɬD¤6;mÑ Œ ™¡)µã™ö¨ÇA3ι6WØ!Þf!ïG…©UûÙp OÚ± ,w{MæHÖK^’gƈå U'MCï×ÝZ²IzöBFx£å_£’‰Û]#‹ÁÒU ú#?8ßç´r$4F!ÎñÿòÇœ{+½’#ÿøÿðb*Ê ŠÌâ¿—ÇÜ÷öµ÷j7 ×1YT¨wY#Ð%5’-Í-wVÓSò¢á¨Zã~¸yß.Ø JCIEy˜ìûšßÿ 2VCvÚGª=³õÚiæèÒŒ™H{­žìȈ+×&[s¢³/®Ó:5³qª§]¹sOÖÙ–TÞª?â@„8D0¶›È?ÉØý"ݺSñ"š aCÇ–ý“÷rDq@¦øˆbÕÿ¥šðZ—x$6M†¾…ÈmŒ‰"PÇÁûÏêÔÊ£·1F‘ h} Ù‡–!ŠXÉÜ‚ÎÙÚqŒú6ª^Õoš²§Þ—-T4/Ów³šXü9œ²tMB‚—6ÝŽ}wÈŽ©…”=ô¤akÞ"7JtŸçûûÙóý›æ“Œµ-3zNÌeüÕ \J²› €]õÒ{ƒ=’4øz>`ä¶¡g+ÆåæV„*whZóúŽùEÓ‡i6ÃòêáÑ ²v õðy{;ÌL¿Úr…1B¥úlÒ{Ñö²Í˜»Œ°+ì`9Kˆ#Éû=ÌÍ)´Š½AºI\ö1«y Ü€R¤H’Úzh¢$ tzŒÕr_Ym¤´ÎûÕyµ 6/媊¾¿}ÐJLJ/)æ4Qëâ&w £ ¥ÝhÕÓó¢Òê8Ùž—ã_»‰„;¿Ü”‹Õë¹´ÿüÔ’üÁ_}εÛ”Ý-íô q5U.Âç†ÏRWsù×$x-Âǧ½_Pÿpˆ_þ¿ ¾ùú·ý Á!{ÌvÍx¡6K]Î]ù{ÿ7ÿØðÁ/ŸÍˆÊéƒÀJªÙEY39›#ÚbRލ_WåœT‘&˜ÖÀ4¥D§.<\hTOÀïã›Nìr~ï¢1™3ÊR–Ar“‘E@”p‰/£+˜!Ž€d’UÒ&%á &@/&)ŠU·»R]ã¿m Ú¨F6e \¢ü¡Ê5]ØÃ¸<ctA‹ÀWÝÔ|øÿ¦€ÈXpía¾W+?ð|¤?jð¿H9<.t¯°þÇW»Ÿ—Wg÷ñùöíç·…pôÿŽGû¶ƒ¤ˆ¾½ ç9#N—[åÈôx3F—Š¡D­\r˜–ú“Ê;-h çœFäHð*Ó¤7ð··.࿇9ç´ª ôe¦Ð¢.JsZy• Ïž=­>pº]'Ý6QnªÐ“u£¾Su{'vŒì*qß‚5^Ô¤»±ÞZ€{¶f¥‘WŽ¡:"ŒŠ„(€ÈƒSu¡½tÚÌiÕÎPÃq’ìy>²Lßáï.´i0Ù6Hišîr Q¨‰5…oWÆ´xÎü- ñqƒ´°§ô S :‡^àŒ‹ÒÁ¯÷Ø sA?Hq·í«séEQÙz /F ù–|ÌÓD@[n¿å0–Õ"Ü„À"°¶%À#©ëƒÅÙ²Š"ëÖßÙMdÉòvÖ+‰¦ŠV t¥èr H–0”] ‘~[€”,S‹ \=ÎÊü…”[•ä›v {©PU´)Ç÷¢Pˆ‰ÛEŒ7O,OC8`\ÚAŠeVB̸(³¼úh8;**Jvº.oXv <ãZ´ ž÷Ù·²Ú›É=cÚ/š™5Úë ÞãȰ($í3{O‡$ú/úΪ×'E{ÍòTµˆ³*Ôu`ÑŽ¢¹*8.™W¹¡«—¹„-í²ùX e-~frhTeû:§GÉæÂ?ć[ä¢v½÷Á ìÁŸüéŸö_w Ð?ë?ýÃ?,8lËU·×JºžµÞíšu®†ªýŒô¹ã8J>lKÓM“ÞPŸ-Í‘ û§pšrzî¿ßqNÁŒ¡=^/i9ÍÂr9¼—?CE9dÙ¹âά´"Ù6®Æ­GÚ¯¥Ä€‰91#|Ö\ ~9æ÷Ì+, “7V&ì\ëÁð5+Q*ìBU§w©?z4YÃÖi¾ê _Oiz¥mE‡Jøg8iRï²®þU¡"vXI-TN6-ºDë,Õ\~U0È‚S- ûÑBMœ½bv¥;Q¯TÈ`©³Êo1½—Û÷ɧ¡¤d»È¿†_DX¢[B…¥$ÿþ}ÆçÒô#:"OfE.4§);Yè.XÛqç*ҨɓÒE"·@6™ÎótìªCõ8FŸEÍÂÊ™gV‹¦ ²·ñ+åËœAâIhùÛŒY–:¦¾lEžT¦ …à=îŸz1m…IJ–7D=ixj.÷{ÅáÍ伿ÛqD™ù´ÌŠW{;†¹þ¡.  VÁ‰Ì5¯èX åòÙã˜(Ò]MW51çë?„¼'ŸJ´&ßœâ’üZ…À[“ÕkY-ÊŠöðƒsž'Ç[°Ì¸ÈçÁ^QÆìAâj÷&Üá½Þë_¿·ñUX7>ÿ÷ø‚Wà×¾!ÿ´ÿøÍáÐÒu¸Å"·V´û /@XÞ`Á[êHï’“½cøé"/îóá/® ÜΑñýôI›¡|smOC=B‰¢"6‚}"&vŠJœ3äD’5ñHÅZýaoY–çÍ€ÁøætffµBLÆaúb©€ÿ:rèô’á~Á“Kç×@Ö8B”»ºÈ[ 2$M•fÐA›¾åç:ªútÑRö, >ñdH_B?W´X~’)|d(¿‰ó¼»ä{¼XV? t?“ÏóÁ_拳ùê§,¦;É÷øøÂ‹À×<Ç·Ÿß@àâÜE¼½¾ÿ}{Çq,—@¡ÿSŒ&bª§i)ñØõ4ÛC=D‘Ré1Þé sŠ[Y‰«[¬À%w>&¦] òˆ~ÂÂÄØöÿ.“ŒL¥*›E÷@Ëâ‚P‚ÍÀÓõm©jññ{º.{ç¶?ì¸JQ~,`—Ñ-.¢Ÿ‹º¡ÅªÑZŸ6ÓÈkOºÃU× ^o@ÞJé nè¿¿Ú‘éÂßD©ã$Ëy²öSÒçQ;¥*i€ÄÒz’fs@¯TѤ‚OdP5ZÝHË}ÇP½O­ÙÌd&ÊÜ*”¤E¬lè?—è0 „\b處›¤{\%è°†¿—L©¿lñ®>(@OïðŒyˆ.`­¯.×ôU(±;%JáÞ•‘ðZüS_R·Lo¸õjEyhN¯‘W_«?15%£$ÍÃ6• Ò¶ñîgDºÍ…YÞu“¨ûuB¨Uªsń悽 j"'Ú`ÄÄÐi5ç"° M6¨$6r Õ1"¨h8áÆt ­+Ë2â·ìPQˆd†zœP?C÷MµkÏZ@¹ÜÊu{®ýe»GcΉ†Waß*@dß ûKÇoß IDAT€ó<+DÈÁ+µyGÓTœû vxwPiw}µ&¼´y“.km~Ï” S‹Ë—3C÷\8¬«4ò¼4ü±GøÃ?ùëyjÉ|ÿç¿ÿ¹¯Ñ»Žr…edJ§<ÄúŽ·C5-âýa·ôžd¶ëíö@Z¬v<Ð4)TKt»lŠY·€øA]DŸÇUí}×È»ìã©ø£Ü4µ-¤~i¾<ä%]R§.<¨¥{¢iã®Üm­-+ÃÓ§Ùˆ{Š@­ÒüŠë,Ȭ™âÊ—ºf³izhH̲”UÀcÒ|ÉŽ Å™é›¼j ZóÃÍ É8p¼yŠQLf¿éc”<"ォ/À“Sòq6*hÚ8†?äˆë8¡ ›•c.«îXUH…ö‚«`“}»¢ý³iØn:jùó—Ð?ÿ>Žã´€h]cž<´[jÖ<.ÏÔþ[Õ›º§¬ÍNÅÞ+}ÞEÊüe¦E¬Iøƒu+Ü·~kdÒTŠÿ]àü­ø•9çÜM`Ɉ!%ÝÖ©b^R@•Èn1:cîe- Dªõ#ÏéSh¯—~еÒN.­DþH0Ê<.§ÓôÖ›ž×¹œž„å¸Äž° ‘ÖHt„t“VmLr¾¡¬[w”³ÊQ®ËŽ…ÁÊî§´âñ°8æ ÈyžfvŒ7¨vQþ‚el»®hs`ˆPQôÃáäë­ð£öóï3{ÛÑ(zú}êÏ¥q•¢åT¼ÊÂÅÅ+°~ ‹íŒBdM³ªŠÚƒ€ø°©ùÿæ?ØOùc0yKaÚ ×ü3ÿÁùlžÏg±î¯Fÿoi}ßr|~ü¶pÿ‰âžPõx_&ßaÄ ÒÈK2åCцh¡Dã ²™e _;¤¨Ï3e'dTñû²Dù§FúSÇ£¨Ep2À½©¤Å¿±ÉPû´.Ç@íIóUH—¥ ̈,C‡ÝU*{AtgRmd=¼´¢Æ©:ziä*êèA¡•ÞVsâÐz:åÉ͵Å’K‰ 7#XõxšO˜é =Ëä†ï‚Ñ"ZÙ?ä‹ÞËŸ]¤¾„tøê~ÀE·Òªä>`'ºÁV°ù^1úÚW¬ÎQZ×;4GÂþô^;„KˆÞ–½8bô.+ZØe˜¦¯åcR–…zÛ£{©ò®¾ß°€¥VcÏ—F=^Üÿ®•F¿¸kR{Y,=¦³%VE¢ð{Åfþ»ãm ’|gÆ]Ö­üŽƒ7ôm@)µá1cŸ·üÌÐf áu`ö<’µì†8³%ûFxÄ“VKj&b—±6`þµÝø²ÞuT?Wýo‚ל2$!É®9ÏßÑV€ËÆ PÊz©üKu±ú½ž°.¡Úg‰RüRt°66EºK‘$ÂÀ¯„²›+AT:çÖ¯©‹6‚•<@ŸËzáƪ%š¯†}CÊ$¬2]’ÁŠÐÒ8Ï¡C‘ˆ9ôEÒ²·³mªÇ¥”H¤Ñ~‹fª!ë6*ZHQ»qŒˆÊF»” öoÖ‚|©,Q5¦øÿºüÏÁÁBq ¿NÛ“ÓõˆIyR½ÝCt¯„4º— ¾ø*ã2³HAõ²">Âɻ­-#ñ”´ö„éM²ñ{}Ño ÝI/P¦§jøÏÿôGØ"P–Óß¿ÿ7»^PDF™.È]uÇz¼Cõ»ïÞ 8Ï“ruË…H7¾þ<0M›Fî¹ÉÂ@TÔwŠå¾"òã=|=OÊЊҭ  zÍ´i•æùIüh ÅýgŠÈËÒÖ»ÀIq[Ž?ïçyÚI xk¸+Ó{@Tè­ÆªUÏ‚_£÷ÊŽ[`´®Ì~UK ²O¨ÒÑû¿™6ß¿?Eäc¼©9eÙŸ\”«u†—Ù î-4SÐFŸûÇCÕäœÈ C6;ämb }ûîÈe\/tøå"/@ðÂ5ÆIz'~Z Ëz¶'¾Yýè7”½ÓU¥Þw›&Qs—Ñõòªà“’ôÿýÿþÓ³éD¿+É—{¾¾ l|qú¸Ðÿ<¾¦uÝÃêàU´Œ³z¼#µÔ]dÀPþ'\þwò%ÊáµVÚæ$`+Óš9§\'Ëǰ÷¼^*x (ý")`Œ¨=ÿ:ÈŒÃâ²)=ÉÞÎ@¦½À˜æù2\q\c¨ýêí1È-hÅ’iLð¹%ýUM¸%\=ªg¸l{Lœß\Ö*æ¿ÓIÌ-¯ÊMYzŠëª[Kšä¬ªzñ¡êpÊ%ö] ªêI§y³;Æ­À¬ ÓåÌX³PÊŒìè?¹­ò=ˆ&JHÄïᙉök½ôk‡p°d>¢ö›“¯’&oµ+û–Dí×ÄŒsŒŽmÂ[©Ï3Fÿ:¿¡èxþOs¯jÇWý¥GZâ×ýÿc|qþj^öWZ^ðUé¹:h=Ÿ½/¢´Ø iezyeXç6É\ŽŠØwTd~V#\¹¦±b¨cþQÿ»–.o7ø“ÈEñÞˆ‡bˆÓÈwx °KIh¢G3(ÍLÊõyAËÀ@› ™39ô¯ç/$Êü\µš]†«Ý×kí|·J7•ªŠ!‚£*úæ"iš÷óm P÷Tõ ꜰŸÐé>^&Û"Ö¼&?DùýSË‘ç lý7 O 8_ß™xQ¯ýê·pKã‘×¹I»àôúy_êmp§øâc¿:8¯r¾1¿ €È‚}}Ï :t¨M÷g1#ì[ÂL@·»îœ¢ž.ÀpM¥q]Á 9åã¢QD*ÄÄÄ{U¸–K1rzFsIò¹’E¶gX(f³p-Ç8wW«]QæØ$Çž|Å’®èSôääÐe —½Ý·vàå;ëJ¢"!| TZql{ÆB)ÀEZ­óñmtÂÆaDnroûD…`‰™»!½bÆ_Á’ á%D›§au“›2‘ËæØ%Ì> "öøÔ欯,™HÑY0S¤»Ç8Ž!Y1#ê^ŒTÛùÿ•¡Û&-²zï6¨:!æ˜ÅšãYáÝÚ¬I’9Ežìä;Ö1ĶR”±ió3-}ʦ/câµU‰-Çm·¶R-öde³”À¿ê`\æšI#£I¸­øšaYþ_=-§TËxº%¢°Ú†Ñ knD†SäÒË6WeRR^ª ¬3Ñ#]¸_ÎA¬^¡¶»¼óIÒÆi³øÈÂ>ý÷[dn6”èÉŒýY…nìh¸ Cù-¯9g¬Š*sŒ§M¶ÁkgD!3'BXVš´#½E¶¬GRÞ#Ëk]U›0$«V¢¶xµÙ¿¿³†Wˆ|™ºDV£x\{ v$Á»r$«·ok§“}?æ®ê-o Ü¿Èf?„mn´qçÎï¼éc…Àð諒L^ØPMŸF¸ñÄlP nGúW²|ºàÇü¿tôìcðS¶/à²/ù Vëò þãÓöäkšçzݶ½4íR4³‚Ø”é™CXëm% ÔÓÍT¬µºEÉ„º!B“ê{2€cÀ(G1ïná>=»ÍËÀ<|5H߈˜MÇp8©ºË)^RˆÁ91Žø›1C«û½pÿZÍB{ÄU@ã'.L&K$Ú4Rä.'ßHêu1Xb£yK®.L"'_}·èž=Vî~üÝD¯Ò‡cúåµàƒy÷ù¥' _`ýè?ž$h÷yÇñïq@¯’ ^Q¯(Š/2ßÐÿßÀ7EÀpon·,XË㛽%¬TE±Óí}·ˆô¬3ñ€xPÇ0ÊhƒP×׬ˆÊJv‘†tJLá=CÔ/ÐP`{ Lì|Z¢e)êm2U÷Z3˜+û® †¬nXæ¢Aá¤÷’–®¿ß­©êÙëÎì{E3î€ÑrtÑIÊEÙL«Å”+‰4a² Í!M¢?ì‰(:¡ùä¡#—0ðà¡­Req¡zæIËrt;Bì±ÂݽYsß™"îØéÎP5ë`á2åÌoº †Ž)&A¡[~y ÿŠ Ç‘|3¦Õ•ê´PHv=µ}ë…Àc%r<ªdª¾B[û"eß©Kn¤jV˜Å¾º’ÜèNÑ"ª/˜K¼RLC }%áåÞ.)ˆkÆ{PТ S`Ȭý…Teq¶+tæmƒ PÂlMd•€C›È;œ]ž{'(bÛ’íï…÷$Ó®uý•Î"¦èµ†…”ÉF†#î[ÿ:Ô°Š™GÆŒ'‘BéhŒ!rF\dŽ™?`{IŸ'5£¬“2BÐÊ®ð)~j(˜‰Öôük&øn Jm§Ù¸‘Pƒªj¤·–=Ç¿ŠlH“@[\þœStŒ=ée‹ñ«=:Zvu°S|}YFÛHo‹‹cf}Ó˜÷få7çÓbg›i¤í£×2øÂ^Õ+7ÿc«ò Â@JhMàÕЋË^±³%¸yNkøÅ/~Ñ%Æ¡ß]Èÿîoþv¨ú½à%ÉŽ¯û}„Ç1×—´òÞ"@ ¦*c¨Gëø“iÎ)ÃÍÆhؽd‹^!,1¥`¯:ù™–6ëÕp¿:9qEKhfb‘s8dÐhd¨Ø“xYcV.lBÃBGN¸:YÒò²ã„d–ȹFÕ’ßi眤ðˆKbι1gÛü\õ¶’Áaq™ÏiUâ½;óõ,…`§A-NÒææŸXáN»ñ®‡Ý{ª deûÔý2ù¼Ú!ªBD9WO@ÞıVÖ{yY®×}ÓÄli·EþDyrë,½–-yÉPJäe RW Û ÖÈÅ­O•fl£Q¨RÌÚ&Ï€ÅùYÉV^¢lDœNOlУÿkzHI¦óm +zM”7ÛÀ¶‹Jq7ó«s{>ßÔØ¹|¯Ä*š¡¹vj½jóÚ:£Zt·peÕ çZòœ“4O;ªñ·€cU8Ïyž§ˆŒ1¤‡Bÿ[œ5ïŽÕðXïlÁÊY”© Õï¢Ù”ë Ùå#ÌV¬ñŽU© ãÌf2‰íÏ1Ƙ^"ÍT&HµS¤/i…4ßéŽø`ñŒÕ!wuÇþ$3ú²l½H14kŽ>ଛ"8vL6YÁP|‚Ò+Ò[=ë¯_û;Û¾½ùò>í—“<éÉ¥Ÿ€¬ðŠ@}¤?_|â½ø ¬zøžøµ!køì~-ýj ð—ÿŒàßÄŸµ&.ó¦P¶p˜—z¹a ¯:_üê3œÙ1Äe’IæÑ„•ÆÀ%a\éVæï4*h&×.£fz+bg8U†Øt…©’¹¯2§Œƒ6¡*úï¹ 2Oéq¦™®ïVåØRæ³?ûºQ/a°|GЉ!úí¬/WY€ûAün]ÁþäôoQÍÃ{dt+ÖH,½²Nš­Í{• —½K§Í2(ˆ^·K¯Ö,|^í/!ò¿:¼ø3%ë/Œ/ÏßO‹>¤Ö>ÆÓû„?æ¢ï€;ñð >o|Æ+î/VŒs>8nß~~€cø0:Æáó£D$SçÖ&K´“ÞŦz)ø¢í£‡{<`’M·×Ç‹'üUߺIŒã;¦™Á--’© ë¾$7š¤„nÒ²û½¤ÚÑéØ&‰ŒŒý-6h¨R䟨þª@  ±ùdáÞKFóÈ‹¢[f öÕ“Y[5v¿æ¹lõ­ÀÀn„©x.\e* ¶ú6¤¼>HDbñðŠÕ ¾ž;u”­°óªÏSÔpRñ½I|ÁsxÚD †`Æ>ü‚z–A‡4räj¶=·øhÆô`î1êbœ”H`öŒô*Œ#­ ó‚ÿfÒdYóÅ.=–õ]+°8“yj- èY<ôÉÉÚ¡ÕhôzÇYÔJ¯òKPÑõ9×ʆ êqq=KøŒYVkxÝäÓÌ&Mù¦*Ç ‰¨øì¼âɧ`ßuÆi}ýÚ*U¼'¬tùÙßÕt-Ö,²Zlv(.¤_m‰•6WìÕ"ÑsÉzÂmt¤¦mo … /ŠÂ]v]å[Ê*®ä>°ýéÿúgW…õb^ñ×ùWÙ­ñb­÷ì¾@ò™ï«P÷à dŒ9—Ž; +Ä0M*ÖÄÖiÕÈé^ÅŒ¸ÖĽ†:6S³ÏsNÑñs j0š¯+ ˆÊ¡G\oÅWyÊØþµbÏò$èÉ|€b&—¤fÈÎU#–s ‹Žè×™³,’•¤í1«8Þ³T¿¦¶ÀüÀ ë´£sG1›gd½W">âôÄòš!]Ï-Ó}¨îZ{IÝ4¶`Ò÷èþ]`àe§±*H6ï3 .I ÒÑþÈF?ŽC„çiÞ”’òR"{òÞ®'Ábイ©âŠ4–Ôy_ ºàrÄJÑ·\ùo¨:ü¨ …ÑcÆÂèfÐ-fGÕí"î—]eÅx…“1EÙlë'ä!Ž­UÑj¿à#ó'3»êV"_s'¢Ñ1œ6£“F–ÒãGHL=«dÈ —šÍWc†à¹™Ø›³E}âEãõ7æ-j9lÎyž“´cž¸—ÅÜ.é}-î/)ΣfCÖ‡Á¿”…>†Û€ã½Â7Ë’Û¾ÙÉÅæ"Ý4ldÔ™K »xÑxJ]H)aô[êí7¯ Ž^9œÎSaxŒ†øÂ>Rêe ÔÏ·—Ë -0.k ÚAÙŸQ—èйº–Äçí-Ük‹W@£ì˜¶.ßøƒÉ*¸z*ïùÁPtÍ ƺ:xÇÕñŒ¿‡ }>7çGȹ+¼ŸÅ­¯Ûgo¿òãeý¸èÿO™K¨6“'€~yíùabÉ#ä÷ÿ5ðn3?Á·´5aâÕõº¨Â•Ìê4[$ EU³·6ÿwBÔ‘*}™ˆä=—Õ+I±é÷5ÃÌÓèD»QÆp7eIr®Ub ÇpLB„‚Ñ»¤[´qHËb¼¸ÊµMÁÕmàv'Hbú\ÔZ£//f³‘Äv8ºˆÙÜ颹rõHãE‰ìʘ*cñLjîo"üj{ý» Þ ¬tøðù´~òsðUg_ÿù$àëá‡_ù‘,ÁZøàtË ú%<1ÂÃFÃó»·?µÌh2šYLê ÆÀðî”^¸ä: iŽšZª„‘C *Æxt@äûi/+%š[çá«,Â)æŠcFº¢Ckm,Ö&7 l¬O“1´|×r‹«Îàb¦¿<2"& î¨ “"ûs²"y"û\‘Ûní#æâêp)6BåžÁ6«6ØþBg¬/RJÿ¼q¹Rœæaª¿Ä¡Fos󃎡Û‚ÛÃG,êÞ`äÑŠìb7²Üm¡ÊE—;|Ðæà!Î×WÂh¢ùX¼æêÛÏùç33 ›<ªvsç¾wíd"ù)yã Ö*½V0¤[Ó°ÒgPÈÿáû­²4}½—ð%B\¯‡AÈVæ¹Ú~…Ó/“˜ÂW‚-dU8.à³€¥…&¥’ }´Ü}Öµµ’%32€µíï[#g}Ô °»È©‹HHçeŸN]W¢Ä@ˆ4pn[f©o-ÁK‡VnÃcìÛwj!·´Tºù‰WxÆPô¨6'©ÓDJ챫“–Ó¬)£ Û ¶~¯ˆÈ¨ö“È~:’“²6/†y$’]"µ«©†Ähº¢bÖż~ïÐ.h°›ôWî¿1 2*z³y§Výxëªók£¯ÿ×ᳯm‹O @}%hØÜtGš.þŸ*L¹D—-†[ÛZ‘6}Ó– TâýÞ¡´©Ýßu…M+Ì»u©Tw,øö¡HÍw¸$ýû?ÿw"òþ~úñ÷¨–1ÔõÝcèùDzÓWèT¢Ã-PJ1u9¸Ê-Í+ƒžgQ§Q÷ÏI3!ÔzØ‘ª®±û üÀTgö™´ì6Õ9'YßtD¾‹Ù5qqL¸ð–¾â èñ¶ÉÀQRZŸl®m¡>Ž1ç´™î±Òî·,Ä··c`œ6߯á»óœ ÁOÓmåî7ˆˆÑl¶¢ÿj  öÑ8âdá­–BHÎÓthev¹úÁ±Ôéº}ãКpGÐ*ôÿBölÈõ®“x`|"䊨ӪBb°YÕÁQÍãm˜Á¬]|šn¥˜Îñ¼ÆL‘uÌ‹Ã_dG~”9gI¹ý X¯$¹¢ˆÝ°ßí•­.¸·™×j‚[Qöþ¢ eYûjˆKpdçTò˜.lŸ¥D6©ÊõÌ€ÐÑ´ êr~Òk8(´@óáÈxÊSÖ|k½š"؈ðG+CärU’÷ìP#vžçû9…¶ZêBaQ2GÌÚîF!F¿eƒÉk²ÊÒ* ™•uï—B„䫎çvâôÚvÃQ9J­Æ•Œç¶ïCöU1m¸›%ƒíÁ‚FËUsµlUdMOPmÂ%J 1/„\f¢”¬5ä½°l}ýÝ4O>@ýMò~'jÎ-âµ¥¾„ëì<¯·Õýùd»'ï­p-X©?­µÿ”ðS~-ÂõKÿn\/¿´]|ª|„ýdaz¾þ¨?ŸÁƒªƒþ—­>c?û¥p5¿©^rS²¯:-~̽i‰Oò)éô¢âS:M2çÓ½˜.Id˜‰úös8¸U,"cˆYàû3Ópô ‹ý×zh¹ õìeÿ®J!\:; ”)kF3Á`…1HÊ]{JscM·« ‰x¢°Ãõ:('×µû¹l w~NQj«ËŒR Sr{ô'ÌÕ[SWnèÓK˯ðýø½ðº¦ø‹â}¾Îëÿ ¸ÿª€÷c²_Â÷?¿0~ÐÏŒ‡ZïéxáZøbçð·Ÿ_/[to#Ábw›ÌDYÝkÓ¦ЧÝq(µgÇGv0 ­«4!&TعÇç·ŒüPAœ—›†·h™ï[–u6]õb&Çð)ß?9ÌlÚLýflȇ»Z=rÒ7óc¹±#¨O˜>ÆÓ g=šN¶Ë¶É¡ˆ1,£ç«ì¡\ÉløG s,êO±ÝëHL •áúßÅ{§¨¹ÇŠli®ŠTSÝÞàšB—©ÞC$0”+Qd±I+K=`jèhÍÀÖÓJ}éŸvî1L©;–¹Ä÷!~ry=6 ­2³~R%$™âÍzžøÎ<×—§díaRG5ko‘€CÐ!$ò“žŒ¿ÐìP5&£O…]¨â_ý—ÿêÙZÞ‚Ä"û[°?¦W!E~=[„¨"Ó¹‡'Öo'w·(B•œ‰±•Ý…`‘yæ|êŒ,¨\qX¶ýÞû*‘¹Ï¡òB°´€©ÜJô‹>%Ó%¦ïæ361ú`s£…O}UºÆ¯‹I¦?øFÿR>¨ŽŸß½Û ï_}?ÏC†Gëpr*žµ¡»€ÕæRªÜ]5ï]–Ž…D·Þ&”ÕvIósTØôû±¥Ø¹—‡`š“µýŒ Eáx܇éáËÈF÷üTVü2lAÅ)ÿ;ðßý¾ŸÌ9½¬aƒóü⧬ÜN‚©Qd›P¦P}$sV£†±å±Eu–6JRš,Us’˜i=¡ ªkÂä282“úý@„à&uâìý’:²Š ªŒ¤Ì,_3bÞÏ3wv™m3gkáªZx™6ýÇOëÛñ¦C#3¬R¥+…³¡ÿØZ¶[–¦nIS $Ç†Öæ8Ô:l‹c{’ÿ7p3¬øb)¬QµÄõ˜³¾z”ŠÔ„V`”™Ük&r£Àô-OÀc÷l–lç ½é’·*ÍÖ÷ÊwƾåØ=)²DBžÛóüà‡ ÍÖ®snœ÷RÈUë'ëj¹=Ùî)I¯â¾ýüÚ ¯‡õÝš r%äšyÌ(£{6Ƶiáðdèêää¢:ÚœÒàhe¸b—›bÅwšª$ êªµ ÊŸBÅP¡³ þ¤Ö8 ß~§õØ_>²ÒB‘,ÎŒ.Wà>?f¦´Ô?Wíðƒh+ƒÞ¼‚ñJ o¥kÍ[mv´Ü-¬´Ìšã+F^ÆÀEÏOÜhû¥‰E(gÓÃÈ*Ä·~so ð³WW *åÉmÃ)]Ú%©ëhJæ©[©éÚö¯ýh˜T?^“Ù§ñe9Äcá&`º¦< óÝeÎÓø¢h’ûÚæØ›‘bg–c·¨W)ä琢.£ùp<|í¯tTùO¥Î†¾ÐS¼G¹ §>¶×N—PÓ˜ï¢AÿÛõȯPŒmÖJÿynÝS‡œÇ›ž‚h‚Vf÷¦ϸÔˆ%m²°Lnè1r¡S‡«,‚©0-OI6.Ap–$8Ε/ì¿cŠ…&¹±ö‚üNëûO\\¹ÀˆÆÀv³'öa7íÀ’ªÆr“ Óx ¨¢ð¢#çDG?,±ÈÔ9Î91üãym›œ¿Ùó«7zåK,‰âBR®¾û-©|Lj÷ÎÉUý± £w«øb«r-!TªÐÓŒ¢jó ¨—¾&<ôôz£dÚ¸Y*àââúñ¢Ñ¼éFZ-ÓÛ(¤ŽÁ¥*¯0y8ö¡dy@ŠÆ¶ÖN¼8§¶¡êä%[¹ñU6XNë³]0g ü¯~Oj–ןÂå¶2–=ˆŒÔg.¹ámÿ‡Æ¹€ºGè¸Y*‚0l -)4 õ÷ÿí¿û·íòy$Ö#ß âvkÝÿóýß~Y@„‚MŬÌ À¸Io®9UÅP1ª‘Cªö»ü~W§wb˜Ùzb…ýÐkkš žI ’ ]ØÐ§=·æå3CUCö³ïÆFž§¯(f3ÛQôÖ£Ðõ¤7ñ@"sœÞ’2åD¹Iqxæ~ì¶s(Y±MlmæÎÅ:ôï‡ÂÌä!c#¼?ÙHcl~?'”ÅN]ÞIo8ç‘ßùî»KÝP¸"Œ½9Éÿ¿ynA„Õbëm±Þý£ªU¸ÚõŽþ±Þ&jç—ù'âX‹³¸‚h–r"«T1­§0­®Í-šäÉÅ?°]˜´½ VZ(¬°Â(­o7»´¨=Õò3ù}lM~½ùÂqk$$ÑÿåžJs™X¨‹t¨H·‰B&÷xlPâuæ§p\û?ÊÚfä¶Y÷?Á¤¼dÞ= ή“ÉfÐmKœÄ¤P ÍáQ'Bš#7°im$:ŸU 6íÌ¢‘ØmY Uàžd3Oí§ª¢7²|=mkbX­÷¯$M)yƒ‰1Õ=Øâ¨«x ‹ß®&ùþ—„>Høu•Ò¿ÄZPûvÞÏ&KU…Çßc¤æ@äac÷©Eéfùúºy þ \Ùû—¨ØrJ“_@å¯À‹~ swk=©\Ÿå_ýÿ‚6V¾’ûuýÜqûÖNuƒôù:ÙãkgÛ«íÞ«›·eà`'«ê–¶m›pÀH57ÁUj¡OVbj>È)á@Ø#):"¨ÖE–:„BËÖ(UÎSƑ͇.l±d(DÂÐ%QZÝL~l[º‘[­1ù:ÝÐ*ŸÚ«X2ÇYÿ—C SøÏÿí{oÇx«€¸Ũ撋è’5I)Ÿ+°=f·Vwß^"-‘3ê]•#†½ÀÝq Þ1Œ£²­Ÿö±j#åðZ!+/Ñ÷›·Cé}RNÒÅ›HŠ[%®õН¯Þ¹ÄÂzm—E§*PJÓ,]zNÀýÞÆz ‘å°p¶C×þÚú­O±n¢– Z1D…~uy Ÿ/bˆªÊiU¹\öäÅ« 9ßÏsžsÚãRˆ$2vÂAŒB‰åJ^Ƕ¹ö‹ŽL/„Xå;½T~'3‡õ ˜À¥Ç®,¨M­zU¥p¹?æ(ÌòÙû“8Ɇ:%Èí»;Rî^XèfÖã•=¦/óÐЛk†mÀÇ:ŸïPQF&Â`Љj„¼þÿì½éšIr-fÇ<ª9¼ZÞÿõîèÇ•Äî©t;úa‹›Ç’Uz†#²ñqA…ªÌÈwó³I°u¨Ijdl˜2é0š®C<3 ¨êò‘R­FZÞQšç2¦es‚ÓÝ ¾€)DªÃãÏŒsF®°®¬¬,VA%Â=A&~—‚늸f†µ@’‚'Ü,S™ûŒ©³åƒJ’g™R]9ÁCçJ‰¢qÎÄGT2¿bE*7Á`ü”×+48BÎ9†²¥‹T}pÝ~%\ ÷¬aíëB¢QºŠ\ð,Õë%9¯Ä®šÙ´âªkyÁʱY¥ ¥]¦ê”ô©gİÏmüÙ R[LØ:ÿàt˳’ŽÛ>12œ»Õ·¬ÀãE çKkkµc…Ôk&O‘è‡súW¢ wâ¶µz_Æ€z8 =Hþïÿçÿáßd´¸ž¾rö4†×ëõzÍ€Ï4Ý„‚ÏßÿðØt)iÓìclçObŽXo ëÏ &DešaJg€ý-ÜÅlÇ1ªF612x‰/Ÿ{Kh!w7 VÀÁÓ„’qúhOVøÞýÿøŸŸÓ9€˜êqÒÑ"¥ÄÁíÚÃ)„£Þ²™dÀÊ?©Ý\œÝ4 m’ÇæLb\ÌVš˜.d¯´ÛòÚl!­‡ö4Rþñ÷—4}I+Ý-yŒćœA÷Ö«•V7ìŒ^þ_™f»{ÆÃå=SNÛš«Xtý´Ni¶:•òŸÙ^LUêÔþ[bÄ÷›s™KÀ@ö«$­%x×Ö666 7¼z^ÏÖ/Õ1SÄr̾éÂm‘ê"nÜ4›sFš,K,½>Š"aó3y“—Üøˆa®X$ÌAáCu õ'9¥L dz¨T™Tñ³AÅЧ*ÇÒ?÷ö~ÐDª*ìw¬ä7“14Š¯Âœ·à0¿eü[8âïCr5{×ý7<ÚK¶ Ôf6Òw©aUŒàÐ-×p ¦ljýdÜ×[á;-NP¶º ò=ð%‡7X»¥K?nÞTNHûµ¡íÔ üTÞ»3"gà›>§Žô:˜tÝÖSpP›Ïi,•(—šÎ3ø±ËSú›#‘ìBÞ/…²?ˆxóáõ¾ƒ–~6ñÿ_D¨ÿŸþ2pƒ%r‚)ç’ËUÐàQlÀÿWQðMQãÈ GëØ l$Ôe¾äØ4ª„˜ ¤ý4bF‹#Tù†kàB©T8ªP)Ä8²<ÇÁô"3°Ô“œQ‰Ä¡à)¼x2õ"©%uJn<©©ŒWU¥˜`ôȲœQsPc“ú*‰ ^½ùžL ÈyãÒÂj²Œø] ß3J‰ÞÄw©Ô7rS2ñCÀý¯@ºxKªâ.óê©Þö¹ïú—gÙ>déà\­_áfÿ„ËûÆ„NRž³}ð–¤ys;ý…þÿcð“s¹ƒ{UYžˆ,'­¡Z^ê¦A¯…±s;¹¦Kaž"¢ HHŸ.Wãb?ðùùéßéããÃ÷™‘Ù²©xN ?%Ë\%l¾Ý-7aig§š¯¢ÎËãuB=¨àÅ$‡Ç9;X_CáU剜ûEh¯Ðú'[²vœ Ëó,ÅhêO¶z, ¹ª•žGQ—6ÊÛ¢í •vÆËÆÔN}ÂØk9KõéWUÕñn½¡®¯ð–ºW°Œ\S}Rú_²´µDeŽDn† ‡`@©~&Œƒ¡Š.Io¤øN³9ÍñÓ¾ôtiaß實5cî¦ì„³U„q󯿈›XH¦'盩@€!¨W8D,o;´Ÿ¸(pLíÄV²"{¥ê|DÌÛú€r‡qx9 ôè"Ú,R— 1 óOåz ŒòŠ:s©Ø2Ö=Û›Y­)¦ê%ÆJZ´þj†õ¦^²Ya«É„X½‰‰º÷«@HꈂfÐ,'YR u–v(Nw)\i¿4’6ÉÔœ΀&ìÌ<"§Á¦àˆŒ–ò]ajrFfW•béR¹ð)–Þ[éñe_Ýú#UE=DhŸ¯ Ü£$BUšhZ·s»V¬ó0£M@Z¡H½*OÖrôWóD­ªRi›5;¨Fmõªnð»£v¥\en»2üVåwÍü•vúú™´ñuÀéŒHt’f@GòèÖ–‘-ÝÏ –›o½r[?zívM§^ `G¬Ÿ^HÍ*Ø\9PŠ‹3ÏjUÔPÆ“!#Ïûåù‹ó™kèE‰òQFSs5øÖöçkËßþ·WU3ªŽßx}qÏÇ8²—]Èã8uº:^üz½þþ÷• /"Çqüþûï¾[9UÀ˜P°’‰|ÎYé%Ì®¤ºZeî‰ú‰üJTH¸6m¾øñÊBYX'‰ãc|~r¨ªêLJüñ‡Ù4ùÈS§Y2OØ–*Ìô„ÅËîݤºçöpÔËqiN«ˆiU Í#X$MÚDÙø—;=[S6rN¦PZ®ýÕßJn§^®pùêKÀCU'&:|܃^M éQibfsÎiÅ•öE÷o¶^’èfnëh9)Ž&WV{Tb. fæñX7›¹Ôf]Þå×+‘„”Ä_öiòIT(Ö³ìÈÆB“#^¬É¢,ÀôŒû®:+“¨Ð1ú oÊK³C5ß–š¸10Ã6)AÉu¤/£‡—[ïé[¢cÐld±MÀ4;ï˜?šÙ¸­‘6ÝZL…­J†¾{¢q °>664r†“ y«™ßrˆŠ¬9£å^ÓÍ`ˆvêˆ;S(3wNÿ¡ÆÜ,O¥/k]Á”3 Þ#BÙÔ@-¨:OÿåZ]\G‚JíÁ㮿:6·ê‘N†›µŠ¤ê‚×Ó;U½A¦Î‘Bqþòaq;ù]\¤qº‡é=`*xú¦·ú3.‹Ç¿Ü[ž¿@³pýþ˜òv“o¯áä^ ÏFðÓ»ü‰ê„–è×áùÿßåÿ¼‘çî÷Å„‡™ó÷ÉŸíñ½B7=Øö€fâ±öj} w ¢IiNš×¬*‚áò±øn3Uša@æ\éxˆ¢JL‘ÃÕEÎgÎèÒ#díÈ mÒpD9ô]qF«ql†òªPßa"• +bÒ®™Èx77ä«ѦøöÈŠ:ô·¥÷- ز[3B Æ0c½!–ÒΗ/ìé1ÌÓ6mðµhû ÇãÛÏþ›Åì 7ãaÝèý•OæƒÛ'êKÀ/?Îxü@¾€ó™¿À¯¬‰ß¬ 9ñx»zî¹fæ¯_¿Bı`ý»‚RD&mé€ë (㪠ψe¤º}¦– Í=×%RÞÎó¹Öׄ=Ææcq ²•¤Å_ýœi¾D;ÊçýÜäãf_R"ÝŽU•²WdE¸‚½u°'Vß36˜ädŒˆ¸zI…¨dá%²^L/,‚Kè iÖ©Ï27‚azÛ_I*¡:wу<ÓšMøñ˜iNïí—äûUʤ53þEæ¦+±©n{þÀ‹O”8 õ¼Q¯g¬Ðvžút¹ BMX´6µTió3RW ‹Å¡Ð4Bu6×X…/£aÂE½˜ÊVÆÛ:Ywæ7©ŒÌ!ÒLæuö•A…¨êˆè˜¸/ ÙŸ·Ç¥¶#”25 œgÚÉjEŠÐ/Í|Nf©ov¯K¤@$ÎÆ€Ôås rݺÖügb23Qò,FµÄlÙ>¯ú'÷Hö_ñá«Qi@±Þ7ès–ùÛ"ã3D,ŽÈUìX±×m ®ÆaÛrV!®Eñeg ãCü:ÎèI\:I+. ^¨*(ÃlnrÝÄ{"Ë+ü ¾"­cwÕod !'vv×y_ÎQg-àƒr ¹W«›·UUªÇe«g u³ÿ´×§ä§å9ÅÕŸñ²£Þ}â`´Y4>YD0†¼æú l:c±*Ä3Ô i—A!©‹®–u}¨eG*w|dûÊþf[P~Nâsê½ …§SŸi´«ølœå¾b§ý.šªyÑZæ"xêVíT4ü´5­$Ü“v!ôì4`-¨Ke#³ï†0Äùg‹M’S(×›ˆÒnåGª8>>2¨º­Å =ÙÕêªh¬äWÍÊ’Ý’.j__û·¿ýÍ?å@ްh»W 0¾>_þo¼¸~„‰ÓeËâ„ý¯Ïÿ÷ÿþÿðyæoÿö·º²ûÁ(—œq¹¡P#Öÿ’Q§ØÂ9 •3¥Ó¯ðôf„r":TX›ûúY4£ ´xMIç[ "âЩ“}€Œ#TΗãZúV :/Ó=åõiW=±GmîÊö”¬ÿfS1gJ¢ê]DÑï2"ðÑÕåËùòe?’¥WÈÖàÆª&Ÿfo/j6}$7’W ,¶U­$I\y襵G½Œ¡'ì2¶ŠDÿySû׸çvÃ×ê1i4ñˆ³i¦)ÁHP%å®ùÊõ"u+#6ÓÑÕ9±‘I$› r÷ì*ÁàB+ñ&²æc8QÿÁñØžqú÷PÓC@÷0£×ô׫êm&pµ‰35lüÜšBkÛé‘òMßmP…ßcáõÓµWk(&Î|Œ1ÄåÿÆzžu {B/5ö=Ä^ÞÞ—çmÔY-2M×Ñ>žÈ¹ßøå/v^oªÙå± xK mùwý îXmíÕ¼{dñæq¾þæ›Àöíw“ÿs÷ÿž\Ä3m&ßHιûK|ïYÆóKûÒ5_`~•$CÆ-UÀ·HêÛ®æ¿Ðÿ_&,»Gb–·P°T§ÆÑeùßYÊŸzî-ÞâEê13šÊ{°()z¨lNŸ×KXÝu9%ã,íÇÚ×ëUµÈ&ݘåÒȘ&[Àg”´ù^ý]µ'9ú M×~©¢·q „«c ¤ê¦õ³0¥Cêî èVÖö=O_¹E4D¹¹º› ÍϱԷ<ÿBÂEzjh<ã<•¢ÑÕ¸^>š½ƒÍ^áaW)œQ ëŠÔ@ñó¦jçÖPd„0/û¥3ÕK–ZUÔÚœ 1!lâ%zŒ0«ÄäÄ¢°G¼wäÛ»dÓ2µ! aÙ`²…¥è®•GTmËì²³åÈ£ª£¬VmüÖòBm9-ÞᬠU± u—<Þrš!ñ©í`ßSÊS×j½dw§{ƒFlšûØãšKºÎœ€Ž£S#­ˆ<1é%n„sf ±Œ-Úq–¦Ò1ôåX¥«B™ÒX¬Ì8Š´© ©4ŠרXž‘”K¼~“îÞNbX¤æÕ¨7U¸jâQÛ]Ô‚–ëôÑ6ÙÐÿ•ð€*Q«¥J ’a—öô¶2¡²˜ž¤‚>‡ÌH#<X ÊOá:tºÂ]ÁY< mÁUgkßÙÓ$J`\á6Þ¶¯\BT~ÿýüÿñ·q ÿñ¿ÿþ÷SF÷Ž×TÙô­¾ÍN]ºNÂb—q SGŠ$’tÒ‘T$õëý˜Žs]•6›ffÇ8üÚŒ1J±iÓƒ˜vpëQ¹‰Ìù`3:Z¼K@²PÚOΞôX¹.©]IºÐÌ‹Ì5‡ËG&ú“UÇ1b®:„ô 6¯Ã…ÆÏ¡7¿t½ÆÇíBî NÈÒ¹åXÆËûUßgÍEc> æŽáÝ˾ÁW“y9. §žXæ»No nÒtˆc@Õ¼Ö>­äq1 IDATåQ¥}ª¡×3Z»Ã¦EfÉ´Yõ:T ÐQ°y¡À¹î¨*røv‹…e’O«Îlôç§Žôz-§‘S”oß8MÛ*fm… ÉQ âáY6ˆ=× 5¥'d…TMavEµjN‰Xöʰ¡‘éa¸ˆÁ¹Ûñâ{®šr3Ô*àh­.8ìæ¾ŒÑáQÂù¯Jcß¡£žà¼­Î7âDÎÍÒׄ„–:4Íæf_’^*cI‚Å‚¢Ñ¶z‰±í¿•_wMmN­«â|BIØšjbÑan§Þ¹žJáÖÓÝßùLõ-¿ýí·>çëÏÏÿíßI<÷ŒÏñq8ˆü2Sn|u¼SÅÚëc€…»¼µYSv«-ë´oÓ^ó…ø’¡_€§oÔJÞÿÚ™©Œ/ÓÏ¿¿ÆáKÐ…‚V‚ûq ’“QOMrhÄÊ—E2„á-Ô$ £é›ðµ"̆©Ñ¢‹²³Ú¥ÕßÚn%ìxžôÂ>aö8µjvÍBy)¾¯×«¬i’ÓÎÄX\b3¦§~Xû‰çGLÃz™QN-Ë1Z/VÒË’ØC­'/j^€|ã#“ÆÁXdùô^IYðÄ7V÷g«ÄJ¬¬`Äó£>N«ä™ ª)|±Îá9^xŸÛWlWÇ’4ò”*I®'âÖ¼ä;^1Ãü¿¿Ÿi»ÃÌ{ŒmÞŠ:Ý8’­ïÈÒ¬ú¼,s–|#q1¤#÷—TŸÁ΢º¾ªË¦2_ŒH3ÑF6¬´¼ˆê¶]´}`xßý&w‚AÓïv"ÇOŠ'('@ÚvãBùÛ.9þ?,}ÜÿÕÕ[Ðõðu¥ð]‰ë=Öÿ–ý3@ïgå.׈·CÅ÷¿Æ‰ ¸íò=ûöÉ_¸ÿ²¿Ø*Xz±ÄÚäsÇŸrA.÷Ê»&€ZJºåhYøW°±ô$‰µˆCÒ–©#c¤°vŤ'ø¯Ú`BŒ"‚á!²Jï™A§4ÎÓ„ˆOʪ€n[u›ÆîãSÀ÷Ó§òú¹RøMx—À¦>ár3ᾇL¡ ×m ÁÌU©@ŠPÜdÿÙï–j›,ÔD)o}G{©Ù U8Áåësû †~·îà+dwsW…7Kå7(1¾»¾XÜAù_®·ý+q·Ì¿að¼|â0¿õ<<½YüãÖÒï­ß~âø’'þë××À ÿ¯×l+ ‰Ú¸`fD¿—Øòpz@E¤eÆ«VHÿwÜì5I¿}¸×­ÅÃ^3›Ÿ¾²©Bu8‰:çô“ŸfÍIã„ UHѶ“*¶t}–­ÃÆvL*W; ÞÒErf n[hÚ¡KWVGœs¤õ\®1wFÖi«<˜r• C½L8åc ÏÉê…:¼5øF•è÷Ùz{p͈ƸE@ùÜ—ìx&ÆÊ9T¥ó\HÐOqßé=‘™FŒCÝLmFÓ¡—Á£¶¿)$L}s[è¢e îýl_+Mdf¿›À5V/)5fŽ&÷òLäø¨ýå}Ú\+ñöˆAb¯6Ã?úÔ”²ìY5Ïu1™¯ÏyÇ€ûUóßùEš¯9çôWU¸Ã÷N¡9sgos|ÛòÆC3äÄ-Ž$n'+)Ì6r}º"|ü&·lîõ¼4¨‚FˆØœÉ=4R–>þé2¹š› Š0èµ ÕÈŽ+Ææÿž`FSȶÜP(­™¹Å'B`f“¯êªã=´„M·2ØŒ>[ÇÿKÕÑ”.òû˜œœ]zî<®M7§‘à Ÿ¥®zl„JéŸ2¦Æ=ŒØ¨üÐ FYÍf—5a[Åc€{xPJv3<²R{Zßò=ø[‹Ó“×b­t·: Hè=£‚U¼¦" 9[‘F4»øFkÔAú¯ÎÜ.h*Öù¨z‘âëBüãnŠàGâQÒ‚=Ûè‚÷ÂøûFÊ“Z52Áµ™G7®îLl?£ù_BÿÜSínû’ùÃoÀß0.%äMßÔsÿ8ôͽUøË¯< ˆ¿þ±×-˜?ŠDýWÇ„ÐúZ±8þs˜ ܈ÿ¥¦¼CO¹Î+ÅNÆii`_ÇLßÔ0Æ–Ã0‰ÁÂÖS®E"&6¢VŠ.±R×Z%Ån˜"åz4?gŠˆÈëSÆG"马&@›´™ò;ó¶=ш$”6éGýÀÇ<T li;‡ŠMÁØý[?rĤu5>‡ârJÀµ Ø#¿jcð\KRwWÆ(û x\ pKÆ7o¤7¼¾z ñ@Pñî ø“²ˆäî—Ý{À·Bvyëx¢ðl¸^³'Æäö5<ù(þ>à‰ás1¾÷qÿ• ÷S€»óÛTaÓL0ç482OÌczpgh”ÈÈ»t€s¶Ç<¾-qö§ˆºc¼ªLª[ìeSæKDÔýê)/ÝÒÂËõÉÂ/‹ïu){<ãvCd7æŠ9Rí,+wÿï&ºJmÇ’8¥X_]ãkæÁÃ-q@‚]ês¼EŒ~Il*3^ψò=š˜'æD%ÎWßEÿ næ8#Ú´ºŽpw³Z#wp¼VI]®Ï·„ÈËñД@aáË>Q˜‰Žå' ˦®­x½¶Hïm(3L>“µ¡­pÀcg³kz!d’¡:A8Nduû/?—%Á ÖºJ Iô8á®ypóU~Öfc¤dõ¨ýÞ`¡ËÁÖƒ(Uqå|”ÿFWcZðms¬?å¸AèXCEžáÊŸˆ’¶"DŽnUXTHê Ý  Y9ßTkBd [г‹ÇG 4ÉŸ½+ÃßI ñÔx—o\¬€,ìâÎemIré3vÈß­ß‹ÂÕ ÔåkF*ˆªŒðK@]¥)i‰Ç&’l7Í#1ÎÀiz£`Ë¡øÍfþmfe(C»Çî7 ¶žÖ„f6]BKbYÈ)*—ž4C ßq¿èpÜp$×2¦Í5áê£`“ w%ì¶xÒ\dTV—Å&X×f>‘enèV&é‹zT /šM\‡&U‰ö¿ô@˜õ5)!¼ö¸0Ý]+YÊ?]fh-سhZ22v¢´\>X¡¨Žd=^5ã°n£…Ò`qƒpmd‡Ø¯Ír•Åbqʳ[½ÆSxB=€¶à¡›é«oiø[·ÊIˆ_{nªª[ô„èõ”¹æEó.N¿9­ÜU¨wyDrŠ<½‹§¯o®iµî¢¨H©S€±n,æ¦Uãì£y¤óÏ VòFõ¨{þýïŸÓ¦¾ôã8Æh[é¼rû¼к¤}áìÀKOăÖN=«Š,úYøiôŽ¢<\åããÙ;ß×£E|] Œ ¥b*{M{QVâMÌ_žãb– ù¥£7ˆý ®8Ž1Æ==„¶j¿Cnìé‰?-5ý¯‹þßElš&ÏM›x·Ïyx†½D÷í˜ÅmÜ¿†‹á2L« Ö–ÊÍ5JTÌs÷QÌè&ENÒ™ùUª Jh"£F/rÖ®Âä¤E4Àº˜c«'!dZÕ›oh¥ÍèBš74ûÃŒ%ÞWB6·<Æw^¦Ìø¶Ð‘!·™ ŸˆÞß%×ßù^ÎõJºH´æûsãxã¾~pŸšuñv#wB÷Sñ¬ÜûðÇnê7-³§ï}M¬Áå?ßäÉ3mq5ð!ÿ=ßp뎸&îà<cæà[ÇÀÏÐ|ˆº¾”o&+ý…þƒ°ŠààO@LjÈN¨Ö9Ú#´g$¯©€Q·œËsDsÖswªÆ’=¼†”×|ùéxëœ/ΗÖ)®a43œˆ†ÊdТ!È,Ù·Æ™‰ÒŠ­9¤zÕÙjuѺ ^ÒBöŒ‚r x|9¾Ù‹u)•AÚž4WÔ’dXký æ"Ï_¿@ðž‡í]÷þÔs u±•fðJ‰-À‚ÙTÜgþüàÖ1FVHÁ©Æ`åÃúQ¹™¬­Àä.nlZ¼Uã›Îp6—‡'”ÉM«õQ^Ç"°sˬÒQ]DD|ÌΔ)gµÁ€Ck±¦Qlëø»1«ЈÜáºÐ¬ `g² Ž-ðG“Þ³–áV[ƒSáºg¯¾äLð8) »òPB£Ü±³:ÀФQöÂú¥ªìì50o²kT€‘»ÑÌ­2e£V:ZƒÁyOž¢–h\Y@_…WýtîYãZ×›™=aA­S§§d,’-Ìß°ÏÜÜa°«à©ÜøtÖH r9ÑãêF¶XVMI°Æ¸ÑE@,Ïš¯ÒaŒ©JdOXˆpZDñP>_¯ã8ž0὚æš· ޏ¢P’CçtQž´¹×?×1ŽãðÅ0سn.ñzxĤª_äkÚ´)ÍZ¢À8FÄiïÀê0H‡¨ÛÃ4Ðc(%;[Κ j‹òèrÓ"ã!>é8Z¸êÒ˜Wµ¯d•®œ²éÍêQµd»íbð÷!\ˆ¯{Ÿs9w-ýjùDDR~1Å^ñÅA¸Vmx…Ê‹Æ9©ã”Xгïõù‡­¤?Ý>)ÕÒ½20m ˆÖÝi´ìkÏê(«ÖÎÛ­Ñ.‰Ô[Z]óTÂ=µ²»d܉•za7ê°Ö¢RFÔåâVÈÞËfj\^ƒºÂ]Šq OOWKºó‹Ï[®ÊG}Àò'M(ºÅ‹äCÀU×aZ)!€ôZÞœC[_lÛ?7§›\+[Úý¶ÁÉ”2þVVjöؼsîŸ]ïÿvÛ&ðà}åˆN~ê „ÿ°u~³Dò[˜Çm2ðçÃ%øJDû¼¶ü$Zý¥Zø'ˆ„7äÍÒ¯ ö>¢´òOÏz~=hÆÏ¯oÙ³h¦Š¼,F6ù»Ë #ûÞ(‚A3(BbSq03 E‡ (Ä^Ô^ ¼zÑdŠ Š@§ÈhŸ/©Ã•‰4“ÈÛmR¶hú ˆ#]õ „ ÔRtvÙÊEPì‚ {iàøNQ8&?=a¦¼Œ6ŵ·gð”w rgd¶Î–µaáŠì‹”ó`¹ŒyÃ7¾sŸDßÜ7½r÷Z~\þíÏÞíxû´ñâ¿~¾]øn%üòð&ð½+q½ò\Ç‹¯ ü[«ÁíjÎg4þÇ, òlj¸ý¬¿ÜOþr|ƒÈ3rN‹ì’fª˜ž•ží”Ù-éaj°LZÍì?—-XR'ó…ÆL{ÍWTpaxˆªÑ Dý|g\¸ºnöB‡¦U×Ä-Xª-Ï èñ¢—J3–tXn=K7€.¬#¡ºFÀaˆ“P4w— eOoCaë8÷’5‘ŸLYÂä8ªäѺ$·t ϱÐ1*É´€çǬs B~(KÞ’ûc{a[êVX)]'[˜~¤Ð1ÊÊ´ŸN³ÿ pÛ£?Wv5ö:O¿CZO±Qà›k¶KO§Ï1™²±2%½\z±¢ œ~ét¯€ûþ`%§ÙkÏG•ö¥E…eA¥e"¬ß0ìv]˜'\#û þ9)†* ")äPÃ{îPµY‡ÕŸªÁ©s(óÏSh±Nû¨s2M¶Ð™qå!¬“×¥]°ÒÂ7^|-¤llÄ•¾­\¬•SWÕÄ pÜ 5EGËžR/Ö“™a_õ@˜Ù£õ˯†¶éý7Vq1íq÷ sU[oëœß#M•­Ê¢þUOX59R¾*¶t†Ú/ë`߬ÓU™ÀUE•ww v© b·jJUì3«ÄÄŽÒ‡%:Ž'lNƒˆYN>Ω²¥À‡oJðùú´ ÏÝÛÁÇ¿Å\‘"h×Wû¨´Ðÿ¼]Ï~þ˜è†~üvxàŒVRS_›6.mËZÒ‡šy]ž¨Œð}Nr¾^¯×œ6ýg«@GºGã]ÄʃKcŽ¡ªz Ò$Ó4zS šé¾ÞZ ·5sr³Ð<ÖÝ´ ‚ÚËJ’«‚ÙFñi’QÅÜÅ ZæCžÁˆ@¥bY/;–wÎ3O2’ÖäÔ[»f-wï–Aîó5çËÌ& CÇU<†•HˆÂÚDÇ•“½þ¬:c‘±|¡Q<Ý Jšâ@)#"µËÿí1†ïh½ý8d ËžºÇø,`: ³´™m`Û;Fvî§±Ÿ™yÅ}qè18è9k¢ E&o&°,1nª‘ÓÈÓ‰ÝØ7”ZfÝÌáåò%‰½d›«ê ˯´†õ•%òPeI:!ªu°¸ùœr!W_J°">è ËÔb½õëTÊ“˜Ý3ŠmŸ¨;yÒhÓ¡ò Ƚ"Ý'òþñ¢ëý³Áö|Ú`ú_žäßÏx_)Œ_ÑaÞIþÿLb€?¦Él*~ó»ó{©D_¢ýwèÿ¿n³w´n /«Ü‰Áý2z…»í›¥ˆh4Ój4ä*X½©=’,òõóûPTn¾hlfZõ’&2„S,¥B®µçu ÿ=ÃdN†±^®êòÖµ—öåÎýž‘e=ÀôcðÖ¢ÞÕK™Åz•DG[õì¨Þ ¸Úôª€Àà–ýw°{ËãÝ“ï>¦rÌ.ª{IÏOÊ·r»÷õÏôN¹ÿÔ+ûÔÜû'1^xÆñ¯¶>>ߢáð–Éä[B•wyFÿo׃+´~[«‚g¾?ºóy9æÃkåÃßÞÞçýzKø>3õº ó(Û–JRÈ8}I&:(üÌ!õÀZWU·¡|š½>ÿîÿ*ÒmŒT53È£—ÜJ=“ÛA5¶ì…˜¤]‹¶‹Rûâ0‡ÍlÎ;§ê©Ê2BM21IBäm’Ê.7›‘Ic´lè] 8îKŸÖHh»Z*Tªf^ù¨ç…Žc‘Ðb¶Ž—ªÓ—–¦ÕÑI¬Iõdz,Õ:—Å>Y‡kÒÀÚ¦åÛ²;Ð2Z·‹k—þ†•Ο*P…ê @l2› ¦y”ëÈXñ:Ô~å<\&b˶¾$ KIKÍ ˆH¯áõ¦SOwU. 7]RN­cLÛ%&^Á?it|…Ñ«j0rÒT¸Q/ÚœáZ8Ž”ËŠ©B ¢j-:``:DéOSù·´>:“laФ¯T®Ã‹›Í(ºáwIˇÙ/ü¡`ô”w\¤Ü¤6YC€‹l6¥ BÓ·ÝÂGTµ_ó¾^>¡¥h×¹‚æÖžá›/t)\7_ã岌yADöè0*pVÔä€[œ[|ó¡Az’"¯o¦â ¹HÍ¥·$w³‹,oj}:Úã ·Éømòäí!ûz§ñ‹÷š"^×õM¤ûzBù.ôÖ°š¨€¯¿ZnbqNBó7>¸ùÍ= WàWQêocqTßQèþ3~ýkõ ì£Ü $w™Úò³ïß{IçOè‚À™÷ ö¾ìãsGùML§r,–ž™Ùo„RÌDasúI<„söâ8Q:‡¹8oNõ}Fü¯”^“ùoÀŽkžÊ &U#Ü_‘j¢—­¡àœê¦ÿƒƒ2ŒhÍlÙ:@b š*bíµ,/ézéNÇÂ.džËýx剒[ãv{Ç  ïACR“ÂOwééî²·ÚíÔýþæäwuáoþòü¾„¿yGO\spÇÐɃ“á;œŸ¡õkðíÿ-ðt1ùðçøE@ÏÌå“â ;ñ%pG„ÐL—<ÇË}£½%,»J ôÇH%¾£ûîw): Áå[¢m;P§=…^ !¤•œÖ7ôºNÙª¾Ø¢ÃYÑl©Bm#)ê§r w¤„ð¶¼ÜÌ#˜cfs¾Z]|i‹hSÎúµþ–&1"Shâ¼qìcøªÖÁÒ ÝO l×6«K‘;ß²Y™­×ê-— ×eiÛI2$?׿÷ÚBÑ *j‘PóÀút¨|þÝS¤Z¬gîµ;¨–+MÉÀ„ЖƋ¨Ð\» #Àh`èðXm[ÜÌW©=•oHüÈ]J|Ól;ñîÝïÝñ~ñ¾ ä%B¨(-¨º¨vS+%¢ö¨ÁTùhøL" ×†º;vkµ¬f Ä¡ÖÂÁèß$°{`”Ó"8-SËËO]5HSÅ% ¿5¡­Ìõˆå0×Ð;mˆÔ¨Ñø96R%Ä`´ÓB{l4NÃ1âRÔQ$ò‡"MAYyÌ…"塟 IDATš’“PêYረb1sæu”ÆÜƒªÇ¯H ¯“¼l]§}4úÃQáìµ&: ©H¥Næ± •w3T¡Ó¦‹Otµ}·¼ïèùÈ[ïT‡[¹K!~ÎzØ4íV! c7U6m—áfÒ|ùiTA³°Q [gGŠªV§Ç -Y¿­ÒÚ’½[^MÕa6F9uŠê™x«îš']ßnw»ÿéâz÷v)öl™ÔmKCXFî@ÿµ¯%ƒÝ6óÞ€|›êH Â~z<¥¢C¯Yá¸ü9éG¬S>RûÞÔ3åûÖpŠ7o?1k~ZöŠÕ sÉÙãž2âÚ@!„FºzÉî?#Ü}ˆ­Ü8Øn uƒ›xt!K>Ê4Y@èî ’Kcž'·†ßËT²NÅs‡Q E"\úˆXôÚ9>ûýïØ4@Æq(À9ûíãËyQb Ts±TdCôPÿ®fŒl²ÁA1o¡Oò¾Ê ¢1V1t¨Êëåj›Ó¢w rè8ŽÒ4bfl¸£Íé(º#)’ p¬0™ÐvXj&\sÌr…4ÙÁišŒL×ÿÇËë÷ÞÄ“çÜg˜ô,®s&À²ÙE“‹(÷…OŒHcÚЕIîpг&:†_Ñ v%>™«i5‰ˆ ŒF‘Ž$8îϹÀµã¼µŠež³¯—ñ:«ÃÀ5:4äsbBNfÍÚd‚¾  ¢ºxSÔš,Ë?„ÅôÓa5xµ¡ÆéÙ¬•áy^½Ûßvˆ¶ûÈÅ,1æEšJ¡¹ÆêÁÉ Ÿ²Ž.Éh…éG‚Þ2"ENbÔ>n=Å鸠l¶´lS`±;íTlT‹)»!ïe90ÐB%Šˆí›MÖYQwaS™Ê’ÑÇ />…_ï[—Ûé7_BÞçÂ/b ;bvýÉZ¨ÿ{0ëÛÁG—K±^!¿ÙÐù ȇÿøÛ BâUzóÞþÓu˜í»!QêOÿ†–ùĈ¶  <`t¼PX)/QL0U±²~NŽ#¾í4qÝay¬ï±ôH>Àô@6Ú¢"#ÜñaïLÆ"âw"6IÁˆ² ɺ2)z·Ý]Š*°îi¢²©ôâ$«fr7•fýM¼~F¡1u¶úN– îö±pÏnóÍÏöŒ †ã‚M·øî¾¦ÝãN0 ™ÿøùžVxBžo+yñœ6Ä·O¸„ÛÞb~½D>þЧêà+HŽ›pü'øýÍ»“·å ÷/ý–¥yß«€·ßDþÄâ‚ÿ: ³¬ç\pÎÈÓãÒÁLSwg¸ˆOºàT¨MsWò8ŽqŒƒGE}[ ±!£›f ¥Ì9m QU1¿ùY-»eó¢‡~CÅ—Xx¡Ô³b¼Zli‚#™¶FRãÆÒ@¬èJ”U?ÃÐçHëÅ%$ì2æÆ6”¯bâ8ÜÖyØ(ÚŒb:ß쌫;4Úm={Ãh:šÐ2<æBé˜võaÔ{ɳ7C6—@+¬Œ´%÷“•;yWµš*-Î6~2Ô̦M0òý*´œûTZ xÐ8¬·chD°úë!âþ}[´Î–ìÌØô,Y¤p£dV®”\~4úÃåŒ`à-6x÷|Ôç_¾îOÝ5ÁÒõÓ,à= 䩨Ïo˜ ×ûòªßü…¹û׫P³o[2–ÿο{ÈjÉ RóL™B1ÑC²°\x’¬«ƒ$Ã+„ˆãÄ:ŵt~y]”—cTÃçᑇy§i¬Ý•œš–ú¸ÀçQÒé•ÌÜ¥xïA±~ÝBîVˆI±iï(´b%Æø7ŸfC…ÀkÚ‡ÆŠÄÆ"",—) ²LŠ01H9cuõZÅá@­÷Y#"ÀjfFÁˆPU ñ°Vks.ôHnRŽ:¼A`˜¿çðY<ÑÛÉÂÈ Ž?¬Ì^3®Ch:4£'PÒ·À¼ž«&e ö‡~‰cm‹_sYPDÑ„$³+[O9ªU^![KìÒÕôqƒ=ò$ÂãeKgj ~Ñ|]²,;_²• V%cÒ6²ÇRw»î ,ÍhæöÞÛcÖ Ù³’iÖò„6Ö›9¬r!AU‡¼Â¼òI)ho1{Ðöz¿ŒvS÷J7/·Öâ®ßÏÝ9–A§…ú+¼=ÝsÑk7 ·A¶Íèºð$cl\(ãWÌih4LåAYo³Èì–nÌ£cæt¦Óh**‹µN9YŸFü×Ärå¸[Ñæ”píMňÕ`e©ëP¼8_sj» J¼¼â¶á% ëðWy^FÚmþR‚þsJ§Ò]T* äó59M2Žm ÷W=´Y@¢\ØÖÚ´ÓJ˜8vº0{k £8¡†$çaX!1”*´íéË;22÷«Ûc…GÅà¨"«ÐÙõf‘¿'vÛéÕÆrø?N3©OÌ’ÌEämrG¢G=ŒbžD(ÅRM ÓV$˜ŸóÅYBçÄîk›sŽh-T˜¡ªn€dŠ}šwÕÙùþòòéX³Ýë5ÈÅJØ3Ó Ú®RÊd¦ãDÔMïÇn’Uø2r‘mg8 ŒV/"OËr@©–éæjÍèR£™áC£Šqòêaoí‘J ùí}GÒR×mŽ)ër#ä®Að"ÛÅ ÂÊŽCwô=Œë3¤4ÝA»`½çþÞA™žÄ’1rÛv›ªÃÅ‘òr×þ‰á?' aámK…o®ÜZ6ûéö¹à‡‘Üh5øA`\Î߅ݾ£l¿UÖ¾ÁûþpοPÎÿ²7×à{úá?Š*>—\#bX4ÅRd°Êþb 22…ÿ1æ{,O$í84Æð>z船×LTÉ)ðd / H@HcNöÇÖ&ôˆ.ÄæÿF-q®[]­oœ¯O@EË<™S†ŠUe¾0Ž8ü¢éÕDã¨zE9Ù–Ó0ÁW/¡øØNJ¶äàø7º ÏŸX(ky®iœMð9u1\ŸZìkàöæ®8´^nTÝïg»ôãræ1o< '<¾†u!Pî—9~¾ÿ!âßá&Ï´Ç›&äÓµ¿]`®e½ox—ë…‚<×9<å=™,¾äþú%‡È‚_¢gŽT—+éþNõ¡ÌÎAéj`§>†I…X¡áÊ÷ G!4›Sf 0_¯W& a ~|ŒÄC‘‰©¨ÆÓ +â…hMš#ÜÁXÊ<vÎ嫪!ÕL¹8zR‘ÙR2yaëBÐ?†ô°þŽ•TºqJ„Ö<1_ÓÌTa8k$u·7ÄÊnŒPšG欳(,µ ·ÐP?” ï øKV7½Ã€Ö³ªt®Ž©>òû} -*. ¬„}óô¥LÅæ,Ov‚¿~L3#U¶s‹Pt¨ËÖû´(V,OÇêÞËrV]—¼¶ù‹fÁ]ªsùœ‘èÛ@ …|||€et¤‘ÜOãÙÇš;§‡Æ&zŒŠu ĬdŒUÖ¹†]Ážð™þ™8oÝ3ã˜èZóL¬Y穈U)MU ‘&¢LŠ({B~ÐÓÂaEcA\U¿ÑiVÈ;Óž {•ª®eë2&TrÀY€i™ypý®% —D¹ðjâÞgæ­,F¤X °*ùI“ˆ%©åŸé眇Æ¡Àäëe.ðe((£ æ±þ:Í¥y¢VN®œ)â%˜/aägÑQlI?Ó:ûû"`Éf Ìgâ\nŠ* Bëšð® Í ñüED`R”Ùa iǘ¯)ªŸŸ/#iaÄQl©Ö–ûCWx,»ÉªôE2?'œ/—á{¾°@«ÛQYáPWÜKR_H¶pªêêš@jÒˆcÈ´ÔyGO™ ò8×[máá-ð9²ž« ¾—hWtÈ‚ïc¹ÑþýVŠzù`ž#Ý6»þÎaë‘6²|/wõMÏ“Œ±¸íâp É͵tšíE®;7 mÿÍØÌìÒ»µ}›Û{âªß’‹XYåÒeF.’Æœ$9§9j™O>@”LF]uBrRBþ®êåUlÿ —` ›Ó¹{ó¬}¥Æ=›Ò€%óêÇô|7wÝ5¡ªVˆiÜòÆ×kH÷‰íÜšUw-X#f§¢‡»å$5 žY _`¬›ÓSÉ(/³ã?>ÇÇPÅœŸÃoföiÂùÒ²9©²˜V4MÆÙ唲rí*Dr½€ªž²ÖG^ÀE5ãC=Ý5g5$béþ#ÚÈÿÊ%ñ"—.iF¨&H&J{Äp%¥æÎrZ´ÖVÓâ}b ÜmZÄ÷«ÊÌâ­b]ñ4”¹gN3Œ(iK:Åeþ¯m€Êq’ÒÿÜuŠ¡Õ(˜1à5_)ãA%.ºžèi‘`{"‰zæZHOÅ5.gJÙhÓDC3¤Î7ô Y…HrƒŠMÑyt å¾Qœ’©Mù°¸OKm* N’¾]-ßUð]Aù5Á„Š›±‰‘âuJcã"æC×RHôze “áú:­<Š yW•§¡¸:ruê„KQÐOk¥ZჄ ¹®’ÐJyÁÖý`²}î ßï«ë›Âf)èz öùM—S’®"ná߯P»Ø²÷`ÒÇóD§âN õÎÜãôW§Êƒ·Zv^¾OˆÖO!Ñ7ÁzßÔþ 0Ì]Þ”\þáÜ#mÄJ½ýB?üý°›K6kËs,¯Yê…VÉ Ž—äé9¼°y+„œÓBDƒ¡&æ9¸ vaM‡“êA‰Ž´XRÌ¥ú"qTVþÊ*ŠÌœ§ˆBùÁÐþûHඃNB´T5ºµyU¡ÒJ€]TiU™Æ@BÄÅ/…­g ›/ñ ºY¡4"3áuœ³õÖσ¹;φ.ÄÃù‘O4@þçMMEòUaPUͰyxæÎO¶]¨¬/‘uÞ‹Ðå1¾ÊÇù¦ó!|Hîê‡o%ÿ¸[ÈøkOÿíò\y°#¼¡^ßèé¯4Àwha|É]<ý9¾ú«[æ¯_rX@9÷Í85ö®ÚÎØS?QÌ%M„ß“ƒhQélêÂ5`$fäº¤Ø ~z{}ÎÀÓÇ!s íEA&0±Ì4ðÿ2BX…ˆ×seV³’“Be%_—× K–&«`؃FƒVÍZ3Éôÿ¶¯Eͨ…¹LÂ,Ô†Íë8gZÌCÏ9M$ºe†j¢lHùu”oE”mÄz´.IHOó‘ŠSç¤NÐ ÒäoîPÐÁŠä=ñZÝãôã(Ï(}f—1bsøBU2ª3Ñ–jQ^'ÿ„ .sc\krs\"+7\®$ò­KÇZ‹ñaP6P“Kɹ}Ç½Ìæ4EâB'™Tq @‡¼^Eù)غ÷ݹ+Àb ɾÆÍÙÂO›Œ‹4³‰D>ohúô"X=˜Òbk…”ws}S8Lp‡&½ Ü,1w•/#ì/«ì4`8 ±ÁA­1lÓzirBðÿœ*GŠD_cr¶yÑæQ?wWiD–P¡’—陸þA³±IVýlÙ—rÀŒËÚ„ºå Èöåš<áoàEr>°i­nt£€M›Ã1& w¿ÐêyPK[RP2zªZìï:ü&8•Õ@Ba(V´í§,¶6Ä¢yÉTcpô»Ù4ð÷äse0ŠÈøøáü4m.…zØçç²STLt9æDóÈVV|ÞÖ[r”ÇÏU×Ö."rñþ¦©™µ’3y‚êÊ*¯™_³)=ÓõÅó‘˜Mœ^,¼´¥I\ôà LÑMá„ c!¶ Q³Ð¤¾g%D½y¹ìrIGC« =¿d¬/>h%ïßyLÒ*ž°…N ¯o——¥Gf`gÚ³y—º +ûõ]¼B‡¤«ø±€¤K à™z°÷›6îµwùÆWþ¡öòx/õÃþÛöé2?‰aIì…‚wÓÂi[w°ª:ŽJ4`_׺¨ êÂ"K‡‘˜c)ÜêƒŰ+>‰ÙCêïö£, Ð ¨ÙZH!:Æ¡ÃÄ ø#zæœ#\±©*µVèÖ}YJ|OeÒ ŽbÄÝä^™ FIêC§6ýëŒqã¥þWø¿`tPŒFÿ–.Hà9¬~S(3L™…ùruµzv0"¾ˆ4VG ÎkÛ^5¬Xrõ%AHm®IVIèžH(2‚È¡º"˜=°ðk³ïç”RaYu슌ÐX{¡B اQ„#>>ÜÊa—>’T…ÍÖÝ^ºCÿ¾â>iœ¤« ¦¡•SdÃZÝÊaÑËWÓd™œÃîÝÛ“’S¬“ë„<~j£0}°÷q…z{bîeiÚ›Fúßo€aj7Z-$Óh¦%|8S‡P™8Ú< BÉ(ªÝ$°¢-UjH«—Ç4¢Ž¼‹S+ü_‰FyoZ ²7yÞ ÿ;O·aи͞nèÃ'nXù«D›˜¡^tÁN-~¡dÇcî .©eµ|^×»Üîy×än8-d#yÞ ìüŽxÿO—°ÿ㲉x'`Ò¶Bø+ÂÙ/i“zþSש–ä³röuy.xak—}Äú2Á¤ëÅQkn …‰‰ŒëE«­"WTóz˜*Úž†¡Dï4„Eœk-€˜Œ# f":/·¤k8‹ÅÁŠçdγ*C¢RX(sÊ2M†¶!)ÎÜÆ—V1›OEî2Õ™L‹e•c‹:h¾+²B—‰qU—©"Kë@©µÓ¡ùýÉKu0VþÙ:vyçÈ/A7Jûº—lâõN¾#îWYú—XóSnÏ{à„|/¬ÿ'Á~ü’›çø6ÌçËõÔ-,w‰÷‰ýÎ…Â…Ãù ú?ziU U£L¯5CT¨EL¿ÈœÓhs¾^¯Yj/%…³ª®ê,Ä}¸™, I Ø4N{Mr:²4T,*4ª‘sšŸ¯T!ÔUˆÊúæƉ*ªçMUHÅ0›|eè#2?îê…–»½Î,QœŠ>CÕ©« XtàìI©ÖðÞ4º¡Ø\ñ·Õ9Æ€ê «qP 7|Ä3eòjœ”ù=5‰. Íšjy¬Ÿ ,c  lo¸ª˜Š’k…N] ªƒÁ UVÙò¹ç«jëÆÐ¡À\æa–œÇÙ¶&®´î©¨ºT»œp­ÁË4¼ŒwXÂKª|:¤U :4á’;4… ÕHŽ‘ïõþ_ÿK 0Ê·‘¯Y¢Èc‘4]õ ·Òøˆ6¼“ïXqðp¬0ªÇŒ!½);à…¥±NV i¹Ž[Ü2é>Op/OvBû ç1697Ö›r'› ¨ ´8 ÇÐÆoõ°Ú½¸“Ua좫ÜPÏpàƒEoTEeçñA×·Ô$ÏeÃ1tÎé©“¯ÉöìÜR¸ò”‚`6Ké9 zî±&¯0ÎU·šb¬VÜX”AD`2UÀ¡ÌÜ FÌ :¦ÍîW0VÀ‚*2žEJZªnkYˆ¡ÖWÑ1t†ƒfZ‰KÜ›2·MÚ¼T™@—bµö}™)V` º?Ë·ÄHOâ¢Ɇn\© ÄHz_|©fŠ‚sË´r=¼Fß,=BÆ^‘q(Dޱø‡Œçk €#¯¿-Ôu^—8 ŠdZõ#~¾¦ {YD7:Méã†Ç–Óá3 •CÄhAþ‰z"d‹{aþ©Ë·góE¨ÀDǪAI!,­{1h!—‰ì¶„e˰¸;1£í ò^Ô»ãH9GW9sÐëŽ9'ôzO`a©ž¤éJ9TW²\ïÆð,örÐÄļGÆ-„~¸áp“QËzvYëUÒ.r›CLfq}ŒžŽÀOèB@朡 €¼“ÐÝÒÄÝ[¬SÙ_Õ%œrJþiwiŒ.é @þU’Ì%òh)K$ÜýÅõü½¸<µXÛxEŠp“@dìLY®É%mi¢%ƒê a?Õhn×¶é}ë]Jù¢ŠÌäD]Èxýâ„ôÜ•Q6…´©xÿúVÛZŠ bŠò ƒ]ãŒ]Âׯ¼KCÊA¢Ü7RúG4øqGóHçúnè=—áî;‡¸ùw|Gi\!i:7àüûÇJ)qÍ{D™oÀÿ0„ŒÏ\Ç¿ ú=iç =ó?>Ü_ɦ‚y¸¦í†eŠ Sì_šÉ|dY(¨*‡©ÙtÐ0ÂÜ@™¯ÉõbCmÈ…'ædº‰Khe Ç2ÌÏu"ȣ¡1cj-×MózxuÍ Òb¢t>•hqô؊棂I·G=!|ƒZÙÌî÷˜ ?£f5šÏÓAJHìâ;a*"5»®ðh&â:“hÈMN%ñ‘ŸÇ]…‡èYí*Àºšâ mWï8Íò„æ GÆ­¨YôyRÏ)ÒJ 2l}˜rI·ˆS î¦]­PÈ€2­Žï²ÀLÐÉÃê}Ųß4R®eÆÏ¥ ÕJ=¦f‚üHxC¢óµ™b;¥¨êÑHѱ,!EFqlÚtµ%¢b8U“ºy€€.—÷sKåǸØÍy‡4ìUKeÖòy,„)ýÏßdÈŠ¦ÆrÖ@)PpäeqØÚ¥øˆu(Í —m½«;$®N±îp®·ÚU—á>й2!µ,ð`¶&È¢šD*8 ˜f/³J!¡÷'gd#ý¡K¼Ø(¦m0ȘôL¢ªR…{AÅ—!3õjH,L1ÂlTt:Ø¥j6¦ lZõEëG5…ú\8d´xð„†ÖÂâiÑ&s¦õKªú’0:·=vÜ ûª€›³ÄˆW5Söjã`ˆç JŒ…aBDµ÷®ŠwúƒÐWËdæbvÖ0ý?çpš2¤¶|ó¢!ŠKG'³S(és)"4$öUóš‰^åßÁÚƒ„[‘k¼ *§˜Y½&k/n¡ëÏoÕŽ‘8·A?ËiR‹²åµNL³´Ø® kðv\m¹IËuý^ŽÑº ¿þÊŒ"³g©±w›ü½Šâ‰¾Œ„÷öÝ?‘Q' cs͘#µí¥bY™)QÅ(Lz¨K‘ëîí¬%^@g,O¯á Ç1¸eÎ8{Škä\éæÜ?ÊT¾Fg–æ@Ç*‘ &‹¡!‹w‰÷jBÐÑ£z¨bÞ÷›³ J Ò#<Êæ.MŒl3±ò±Ì'öÅEë¥øÎ<·Å™“~üסÙu+YòKÂsw3!!£nô¡@GÐÅ(¡D©?O®,”à®·X« 6*i SS‘™C²põŠóŸ)ûO‡ï,>qÎè×2©Å|hÅô$Ó[ÃŒˆ`rµ¬Xô$w‹UR¬—)Ϧ‰ Ì™4¬f¬d.eñ±èä)sNˆŽi~T —÷$ÒPX‚\XX£úßVæ ùao‹‹YÑb¾ÌäÜJ~d·ÕèdY™ƒŠV°UÜ6Ž0‚¹›Äµ2–£H%R1Rƒ2diwÞÿœ§ébBb[\`wÙI¶?²Q³½Ø Ì´Ä Ù¯6€&Û‚¶V4Ñ<ƒœ7t5ªÛþr©\·å}ð=¤»H¥òË®$B1ô€ÜÑ®r ÿ¹ŠG!݉+&ÚË9¯hÊ?ˆæ†õcù’ž^J7àý—/ üˆv?­Ïçw€¤©€vQîP7> q¿ œýÜkº\y—ù¿=1 ù¿òeª'"ânR5—´ †Ù²/ZM𸈚؀&éaBGáÀ Mñ8 1ÁˆžuŸ\£@ÈV€žG¨îy‘ñJBº×3%Mfü!âÜ©ýú¸J8"ËHž í1)M_„éG¤RßSNY•%NÄj{QÐ÷È~nÍÞËØÉÔç´ì­jÝüð(ê]ñîÉÔ²ÿÀÆûô›'Ðÿ=¦+c—ç@ÿ–«í~êá•ohÞß[¾±ònûRõ¦Ä·ÕÊwsä7ˆŒ[òéEüÞûïGlµ2‰þwf”˜EÖJ×t˺žØ% »â”h,Tõ8ìõÂPCab°푞F$"Ó¦ETŒ÷I §AèZW…Ç@T¸æl¡QƇ‹s…lRã¦pdž èÒ¹jbìÊNF–+R“‹ë³\õxUŽkYÐ’155çy×& £äŠóõÊ2Ò% ‰ IDATrìhSáP•bÛ­õõJÊ- :CÚBí¯];¹¤.]û€(û7YûnB*ZÛó.~>°Ê m¦êN«¸ÍÊP÷õ‹Š&ÚììŽÅo´J@ëVAÖ€hÜòÜŽåXo)`gÌLµkX¬áÐòøADkÛ‰¾Ü€qB –1~ £Ê@ï%¦40R‘.¢'§¤K[^Š0ÒuVkŽÃ?ȶgçÓL)‰rVTöpð÷”Ãã·b×NL‹æöl¥U|!êÆz¶¦FÆS°°þõ<Ö…Ytk¾¡û+µ¿²jéâu·˜Ÿº&X–[¨æC!ÔÐÞ¦Po<òÂb‘ b¢|½ìãH+J›BE‡JÞK¢Ø[ápÕ@öãf§Á\mª–»0N Ñ;ôð¢c€šÍÀî½ÐðƒðP•ˆ“”j^˜¡Œ.˜ ée$T™2:$#²©Yv<+)+ÑW;Iè‘’LjQYç!ªóõꂲˆ0V‘™ÚT#†*M‡JòˆÛ ðŶà¦W‚>±¬«ïÌ‘ÈnÿŠˆo.K¾î è’Þ@—-õa¹š“ZÄÆ=¬¹æ««¢MÐd™™z^‰ñã:Xm5Òr@°œTDS†ž•zW}rV’ç·ŽúKœÇÙrá:_R=Ì…¾]8€%¤ì{׉®=1¸3ZߣT‚âÐ,½«ûÂŽÉcðY#ȆŒ2¯Âù@uÎÒÈiÑNW¯=ìt—ˆ‹'r2ÂýÖjÅ:_¥ÙêIUÖ|-á0HÒ©ÒLGUõø8ª?@N3;Ƙ©³€¹ñÝ$rwlZ6*¸l¢”È’aÓæ5ÝWzGÉ´‹wÊ^n”ÀVÊÌ‚[“ïÒ(¼ÎH#X {gë5ZZ©â› ÍkF …¶#ãfüçúï­¶òUÖª’6AF«‡­D*ëiÚ›f›­”ÉE¯Ú©uÝÖDOáô'#‡ˆŽá7Ó§ U¾^QQ aÒe¾æÚ}Nñ¨IÂåÓfæ)dQWïè„ [^_ã, ¬´D/¹%8Uêû¢*vÈXJïdH|#^uº¼Á}Á×ÕÄX¹ÿ`Ë©´í$ËõóªG>¢ŸŠX§³hod±ŠÐq×߆þ7SŠIÂfM[P>+ùMäÔ©‡¨ôã4Ÿ7bÀÚa­ÎH² pq‰ÉBÓ*”Z©†Ût¶h¬%¶Áê¶:(qüMV²Lµ§D—°þ3ç½ÄqZo[¿3I ¤_ò Ð÷ïoéżÕî÷ü½¶õÌC<¢dÀN[)ÝÏ‹ÎO‰©mä[²ßÂöï1'Þ@•bý£—ï¡âó?ã¿gñûWûÏ34ˆÿAÕü0V­ª)0—C^Ö%’bq.‹MÃw½Þ÷ëy ƒFG^éÐ8EGRºDAœâ_\'¼ G5g.‘ÅAדE+Fꮚ EXõô0L?5{¾âédf`K½$*df µäöY—M‡Ò(0›Ac{椒9c£Hë>bWïÏɈ€f2À%Áì zï]C·*ñ{iûZ>”¿>!Ñ×·ÿfeyóW|/eç7^|Õ«{e9øÕÓ‡T~ü¤òýÚ1ð¾Xî²÷oë…¿ÜÞ}²o®¿ñAÈ]>Ñ/&àhr4µE1ÌÈB]K¡úA¾¼|¯ëÓ}Â^ ».;âeW(PFΈˆðh{P§þÕºÊÐá«/‰"KQ24âé1§ùL«ŠOL ‚Ñ—E:PZ7\bTÑÇÝ]­Åaâ±—™ueUvÈ8Íq{nü0hQ¬y  ¼æœf=#§Â÷+*ÛÛ¹«Þ¤9£³5—Ç¿ò>^`ŒÁîà&)òùzM›.HDsêv™Pyœ›,nè¡ S_2g ½™¹âA¬Õ ùÑËK+N tӀ串V¼z[vºÊ¡e }X¹jvç·   žWÝ.CÕªšqÈ«àdÐ 2<*ÏÌžf29áþS ¡ÆÍhGIN« UˆWùÊ4S@½ØŠQØÎ QǪ´&¹îãè´Œ‰ÖÌH³1©ñëàìÊG?Ƈ`fÃóÙDd¿%FÁP)Öh)t6n¥f½fU/ÈñQ0K"}vŸÒkô5šõ8PÅ•™ìäE„X^ôŒõ· ‹c̈MˆX­ìXKsNÉ¡ÈÚ‚/ÛrÔ‡l•ž¼†"îXkâ¾ÆCÂvæß9º‹kE§,«ÂzâoòTÖF±ð±Ø1·oØáÐ3£iëÒ ,M«-ªZÙÒ0Nnìí¾-WA ÚŽ§ˆô¥¤ãôç®Î÷ [¶IÛïª7È¿> Tl ¥.h•ÛrȆþÔ^fή©ª¯óf&æ”2^64§#¤sZ ŽiúkkaáQä“•î± ËðrÝH®Cë"Ýì¢×‹øo”¾À±=¨âPýœ)®uhé@lè¿Ê;áÝË­’4,èO7eBÆm‰ôüDiȫϊ ‡ô «Í÷äõ¯#BðýÚõVÏ%·Ï;Áæìy&"œÙ.{¸ýA±½$òf¤¿GÍÆTî”[_ÌÌ«c‘Íï=cÍ_Ïpf·IjƒUUdËz;º´bØÊ×r™ÿ4;Ètö‚TcL±ùzùuñFç «ûäÿ#ïͲ$I’$1&õlÜÿ|8>ñ‰I7a¯¢¶„GvVUNOàM#+Â35UZ1æÄ¾)TŒÄÈÈI䬓L+^Á-›ýË|„ØŸ‹óâ–N o.4VC–G3[‘ •¸XK¨öøÝîŠóž_’1W\oÎÅU˜‰†zÚÝ*‹ìÀˆ³Æj X±xY€²{Ƴ£zÅéøß{èÝ¥YØYä8ým7½ϯû¥‘äÿ8€`VM]C9Ç«m­eÆïïÇCD®µ u,Ñ êÅèb‚êʲ²-]—¤Œ.Rñ#€š©ê×u­”•1âþë¨o4î‡çÀR®À4¿ÍÖC×µPj ‘0¨‡Ôê²À‰h;ípÖ‡ÿ=ü¸$ ³ÇŸß߀~]>!ÕÙRŒüfYy4XêжTZ©"õâiƒç³n$ý¯ ”QŸÂRB( ¹wÁ<ï€e,…z§ßMÕ ]Ëú’ý¶bHø$EIïóê2ºPv'Ícêe | `’”¥Èv›tT7z½Zºã'ÿ_âV’Ü”Y~7L÷;C⡪´ÝE–2îê#Ä™'n²7…Õ?ÜŠ¢KåJWÊÄ*õÃ9°qgàIOW˜Áÿ`{qU_dÓ0è"LÓÁD>j9æîúÿ¢´@“ªÛ{+p]"bHIkÅ mFbP$Z„§ÂE/.{Y ΆîñH ÈÇ}Nd%)¶–’615¡ì¤°ª lŒÓ‡E]¢IЛ¼Vþ_û[ôŠ‹µdxb iý8æ-îP”翉lÜ­GŽ#f“›‰úÅ$dþ/²%œ·=EnØw>œM‰W—Äkák>b|2¨),#ÏSP…Ë%ŒR¥à%­,òpûöçÀ.÷Ä)ÛiÎ~Täž7·ÅÂYaÈâã£ÃpÆæ#Ã9nØÍ3FÃÊÐhÏô¸ƒŠç(nñ‹s¿Švó/ãŽt+ªfÚÑŸ±³ãXЦÝË@»ÂÇ#ÜfÀ5Ö$ T±·YÆûTUO¨ÚžŠ‚ƒÊ‰û$ù!霋…Ë[%ý¥zY9^“pöjY¦ÖZeBYºDäûñ˜7võ_˜™— ;£lHUÛ9«’@`Þˆ¢b”¯´ÛЯ¤SºTÌL,ë×cð„.DL‡fnû˜ITÕB¤¢XÑtÃ6«)H{ØÞÛýºôº®CªV5"Û My`…ji¾—©¢Øf8e&½Õ]ôØ{UÕ-$aÔjø°ääañÊ$\-ÎÍøGÙ˜¼!ºñHœ×j1aåËæa쨲C¨³P ºDV£3Û×›o¬o÷gª»njeãô… ËòZX%úä<Ì´T`Žxÿ²T%ðˆUL>F~R¸:FØ}ÚãÒfö÷Þn•ëÔºÎCÀ“º9~Í ý¯$59ju-# G;WÒdcwôQ‡M±'@ßË”Ðç+…zëò”Œ˜)(f9‡äÿ«'oôÙàêÚñâ+Ÿf› (¥gÇ*ZZ"¾TÇ·œ/…'¼„wòÏ)©ïþ‡_«Ü¡ø "úløø²?¿`~’­'/Y9!þþö÷ ü_Ðþ–ÁŸc¸cï{•ªÀ[º2>ÿdvòêùÃîA /c6ø ü÷àîÿŒ?ä«(>å\ó#V÷¯¦ð+å£ÌÕƒUrºÕcQH½¿7ÿ+ljJÂú¦ ?æc_hB !BÏíü<ÞS ¬2]¬DŒQßÐvİ’"›Û€„ï ‘¯‘Èÿðc#«Ùñè·X-]áùu¾•xq%Ͻ|˜C¥PÄvnÓ]Wc͘“W‘±9› ^¯!1±0Ff}™TÒaíy$®Ÿð"//þ£šrÏ딞gZá%Í÷„á_¯ÍæG£Á‡%ësAÁ;~ðK?-xø¿\=ðöíÌSã‡Ò—wJ|U­ŒWaAøµóšà+2‰¯X ¼q(ü§® XîþËšFÜ®—./¾¿¿×Zr]ªªPƒ‹åˆíVôªRÚ ‡©e›=ö.ÊÒПº†Ël»0ª²ƒÛvøÎmË7¿½“@×õe—ª®‡\‰äÜSê§m)¨t}ôªÂ£5„ܶiÿõçƒ4U¯=™'3—ÓõÍäþy ªq}h– a_¨e£‹=C‹³Ír$Æ&Kªy¦_kq>.ºyê•‘¯µ’Æ}PŸÇ$È '¯&Ò¶ê:š õªçOQ%9ôˆôhY]«ð<"Û=~²€µV¨Ø‚à@3×RÍ0¦(áŸâBQ8ˆ–ÐÛ²9â­A—ª(,šèÁi”bš•¥ùȋȜ@?¸{•¢ÛM"TÖl#C„x,¸h#>ðd9Ê\ì©[Ív$Ob}…¬ŽÃ¡o½j¨D¹Í–dô¸x¸wÍÛ}EB…ìÂÔdŽBqgRÿ/Á=MèHöò¦ï<’ µN‡L]t)OcJˆmF­úÁºK;o«âmM‰¤ g.$k´“5@õR;».rÿéE¹»po+ñ ãLrŠå f$¼;¨èpUÍR¼ì…øÝ<ÙzÊN]ÿ½7UuyÄv°#F!º3CÄp7³˜³0Ó<Ë{ƺ¥r^ÐëKýË4ÿÐôÑLäA.vÁld Í i“/l—wR’iþðªò<”ÆÏ!Åv¢;C?ŽAü t‚f˜¡*„*lou£®™ËÔ•¨ÛÈuøMÂeëÇgPCT²ä!þð=L2cbÞìzÈ1üÀq ?ã{ Žá465I)ªúØvê­fr³g›ÂÌ”°ñÞ(Óß×G±~?8ÒHäŽ`Pî5ÉÒM£Ÿõœ=;T´³¶§ô„:©ç#/,¹ 9xt²úÄîK;<ß”¼È”¸ë+«I'?Ž›‰ÁA×eÜŒ²2?Ö¡ºÊ77³‡×çB¯+Cͼh;eÍ”)…óß2‘ê®Öˆªã0êD¾ùÌÆñiÏof½wÈ\—Nô*2p›”mæ!.Û'°šÌ\u`[F$”âÌKéJ?ºFg+Éw–0­µÌʾ‰0KP°<ÏZÚÆtû£‘JT|¤­B#In3×õ¯ëjª)•žñ¹WI#ò‘]p„KãO­ÓYÒãÏšîú¦L?÷ÛÈr"ö( .#ú­Ì”³È;fPol†Þ)eÛ¸mÇž¡ò¤µÂÄ!ÙGu£8Åä ”²y‚7…,º¤ö¹mµâÙÒEû‡›£\½2*-ÖÚqºÍby3ßÏÓ8Ù'ÙÈåßšµäfÜÛöÞãq9•,…ÉŽ•éÔåOž9síNÌÿ`A»½¶Òì´×T­…س¨¿<‰€ï¨áè™þ0@`ÖÜßÃÓùô´!rL…÷0#–âÚð„û=$½ä]¥ûÜÂËÑ“ö‡nBÇÓ´ßÝ 1]Å´Pû+Œô3hþ ÷¼5Ê^äq×I?™0~ x¸7?¿á~,Ÿä' Œ·ëý—aå—HøÄð¼oÜüwIòÿ)Àxz%|xýûßþȬ[?FŠ«óI²l+ŽØÔ…ÜdC²Žž©@{DÆF_ly‘LhóÓæ—–_zm¯PcÀpÕ¦ ×vÛè‘aê[Ž6¦”†7ï bÝq¤=b1ÒîÖÊâ4/,ˆßÛ„ú¦\:r}pcVÜäD³pÏÅ0×ç,ºU©¼¾9„½~Ž Ur€‘÷i£mxL •ÖR¡Þ ?Eì“ÃÛvʉ䕆û'‰8ò ~çoIû¢„—7Uxõ—üèxÉ.ð‰:ýüžSòomòFøó%¼§E?T"^^®[ºô±ðW î§ÿ#â€"v葘(ÀJî^ 0fk-‡ø»jPÉs<š6m×Ý#¤²’éó÷Æ3ÕMÖtHéÎ?DÖÌö~H ¹Ü×õUj’¼.kH.³gUk"ldïíC¤ÊëZª.Ç‹ÞäDák›s]åÈ„éY£´Ó2)ØWj¹9:³¾­¼Æù·X‡Â&û&ëÑ­@‰È’áq Ï]#+ÉÆ'8JëȇŸ”ÖRÅ’©ÓG] é1ò0Ö7QÁºK…k$w }³ÚFŠN¼E®ãHÉníàQV¶.µÍÖ¼eþÀmV‚-@×¥ŽMØ]Ì,FnšE.¿ª¶÷ dqÒ7“¥ˆ7%§rX+:JÄ£žÛ1?-r‘Ä€y¦MìC™8D4AÀYÑÑKNh½œ®Þ4Qÿq8±ë±¤ï W\D¦¿Oqßjnè(Y4Baé¢tFQ=™U’¿×oÛv¼ÓQ¨I!¢¨”$°£ýÚǶ”rè7»"§ádjxDa¢à•Œ$2@ØÁç<ÚÑÀ¾ðËaïpt²ê帼,›Åáé |ˆzgqÀGü3‹7Ïõ»J|Z8r„÷’¾Í«ÍøéåHazYððºý*ð3Vॠo(œÿY€/9ú"SšÃ&; ˜ÙcoéJ`Ûªí½4V=›eúFG3ÚKæ ºŽÉ:ªÄµ bïÙÓ/¨i¤†º·€³iÙ÷Ç0õ^ëªé¿jÍü3 X¿]{[æP•m"|ì]íÇY×¥^‹YK»®Ù3Îz]¥B‹]ÇR%dW×PhãÌ7}£ùø8=-—¦¨Šªºm"ýÂÕ‰::VÓ­~’PÝ{O-ª¤r³_C"O~ÁoÅ›®¥k­HÌ·8 6¦­žÐ°á52¡ RU íY—šÛÝMÅuhå„6´K€&ã2 AŽP¨ £ ïõÏÃKåëÛ~ÈØ¦2Ÿa?¾÷å™ #ÙV^Ú^Y:ÙgâxgÜK¯5«…ðIeõ§>PY‰jè&%0 ~™¾‘;³€ aéX0º•›+µ´ÄÂÞÞœ¡Bƒ‘ª~C[ HU8\¥˜; µ« cÏöÑÊ ¾uÖ4‚×D<Ã'ÀýôI¨ŽüÐvd&Ý)ýfµúóËœà„Ù4ÍAÝtm"ê©5û±s¾ ¾Ñ }ÛûA¨.¬HˆÄ£;s=óV¯¥5ûŒ€šøÎâB¬¥…ó.ç!æh'ؘÂfºzÑÁé@[æ–y ©,=ž*ÖW(Ùßø3¹Ïòë`-PT±–YÙ仞9 „“]×%#S«‘çFq±¶2Ñ2òΧ£ˆ9Ëú‘,pHu·‘Pæ:i'#Ï9!ar,È3ée>Ñ^2m*Ψ%lq"ŽÑÅY(¸0ÕàGðÔýÍüúSïBKÀºº7ì`|™Ø f·‹ÃJk©Œ,8él®8î‚ÜW!9q3íc6£B¨f…x ôB‘1'™gs°?ó¾ÐQ]3‘ºæ QS«|ðd\Îp’9®ˆů•Õ܃ð$)ÖRˆba-Á)-﬛š1"HGrWWÙJêôlI–c{®"HFË®R/T)."­1$YÑ}GÛ"ž;TC%:F~¯z:åñØ××B=#³G¡*ÛƒzJù! ýóñ½·EL€· Óûr"Û¤¡º³h ”Óy±Líq?ˆŸc_ŠT:/Ësö³Àd†¸;S°‚|¦Èš%¯¹scƒ·#YË_¼Åÿµa Ñ}Šp Dm]« é㦊‚oÃd8O3½y1Th5äLâ&„,k%—ƤáÛ…C£=·‰…äÏÿøä<ȼ#ºƒh€xÈ Ý® ;匴ù•°æ¡&HpÓbǰ­Q}£’7ó<–jeÔµD‚Ö6ªŽ…+  HÙú´ïôUÊûgïÇ÷cWoÄxiÒ¯“}*ìè&ÿï@ȱä:k¤æÙh—¬Þ¥²¬&œ0tÕCSª©š¶ˆnÓÐX¦.D¯´Ÿì°9¼w³Ø«œ±ÈE~9äßÕëe”stöÿeg(@YÞæ„A¿Ñ??ÚÇê-}k‰x©—? ~ÕÕñÆ$!ïäöñøôš* <’îýíX{Q IDATÖûµrÿ)ð~…~Ìðh†þeœÒïÊñoÙNMxù7¡ð/~ÌOò‘ðïÂÓ?^ð’Tÿ"êçßÏXðEÝ(~ùåqPÛ½RoYɱzf¿F¨«_ãü8žk4u–潡ü&X^²Ä½±„P1.G؃^g5IvU5>¹p—ÿ×EiPJ¸Ôû‹m†“<òm…"+SöøÍ9ÃHCø”=±{ )¦`E¡¢ _(& £ì‡Sò*z©è Ó¬qåêž…¢„9éî ¹.uJKeåiöÉ|ž“ûtèßQÛ¾¤7aÑÒ ‡÷ëd/™¨“¼ß;t)èÃŒ‘ƦˆÐIÔØnø›Ydä…Πòjô¼c-q'ÚŸ¹üÇb©žâôS :G:…¯™‹íÀiG <®‹Zé#°Ê…{1C%–‘¢×`.P)¦¡5B|whJ>|Õ5»_,‰îßê%îÏ×L<ý¯Uœ€Q«ýô½MÉéM//£0ùF¨µPû­ƒrbL9‚=æöí’´òžì]…¦¸V§&Z¤ÖÞP$™AæŽVMihŸÇ4ᛦî‰XUCPþýÒAs­ƒ1õhêĤT¾û‡bªúÇ×W¥;>lÿùýˆ£§ÿ%4[Ž1•E^ËùcqftñFŽyc7wùÚLQ?5²¬¬=‘hÖU}ìíÍÆ¡|Ÿñ•Is­ ¼w}½S±)W¡S2ýÈ1‚åÕ¯&à(G–,ÓÖ¥Ù¸`±d, £mVÁ†¤?#‡2?h¯ ž'ÌñúÁ„i¤Ì!B"…ê=Ça„`V|Cq® pOØäLsºÀ¥ëÝõ(šmб8Mdͦt¶*ÄyзvY_¼ÅN84‚çr^R­r&t¨#ìP#©÷hÙ™œ¶\v1œA£hIÎ:!—_…PqÄ éð_Úl3M¡ÿVÅ©öI$ ¾Y9 2B¢˜¿«û”X:ÌHkðåFI³í‚„MÅ“© ÈXò¤ÍFý‚ëºE½PÝ*žpÕ …r‰aFHÆ®h¥º£nœÝÒCá”nœz†JºágÓws|ƒûË$~Gn-»³æõ†¨UHžýv—]¾r¸Íðæ p³¶‹œÌÞ¾ÿÅó³\þÿ>Ôý[øÿ˜ƒ¿ò’Ÿ[ny¸õqÿ[0ëŸÿò½÷ßügd¼ÌKÊÏ⿟8á:VbØ ¢¥€æÎIkP$kH-²ï7'+²‹Ã?àˆ?n£T?¹EÒŽëÛCshS«‹$ö†j¸­ÝcŠ»R¶ÐcYs£1Çý-KÄÄóPO»’•\𤴸+[°Å/poÞp9¿ù^[hïù¬XÝïR~‰ÜIÝÁ@1¡Ê¹ªq¤8Ðä2rÒòæsñipÞzZÂêû@ªoâqðé‰;BáÇÒñ®L—ïñÞ_S˜/ÃyðFó7÷Ëð&äG~ç 勪…_Pš|ƒ€Ë›zá—žDÎ;Q¼<Å0ý˜øÐWòËOI^‘=øárÿ!. ïyþ´\ÓMOÔìíºò>D #¡k}ý¡ëRh”µ¹œ4Š1–r{£-,9F¨½t› Ö4;„ÿןî½QJ»Ä]ŒŽzØRÇw ¾ëQE=À;î¬öå¶êö¢÷¶¨ÿ°”é„5r"€HÔh®‚6R3¨GUi¶ãü©^hV z· WE6hf!tLûìK äx¥X/µT‡Ô¦ˆ¡ç=Ó<9YF§oz]Q™ÈÑ4à§™¦ÓØa'”Ñ<-^¸Cq­ú•@u`å.±:ïx>‚½ãôXx D ×ÂÎSÍR‘mæZÄS¬׸éŠ&_ÛŽîÄö_mþ²óÇòL–·áù[—ªh•.>Å}bŽûÄqðÖMËÁàäyWÇŽÿäèkpΩ ¬çóϦõÛLÌlé“ÏÑnÇÿ¬ B+x…4%MÒƒ@¶‰®D<%Ê™‘ˆ•"ËD‚ø©º3IÝZÔ¸Vl£‹#÷w­Ò[^ªkþýZX*>£Qn "%Ì1WeœPå¼-pRï·Ð‰Ä¹p‰<¤JTéÏ®gE¹0d™Ûñ[³^oª¶MÝßI³M‘…HìÏî‘H Ñ®?}Úân dql6I;UžÄ„·ü"¬µó79JÛÚ%PXv§_‹×—Ÿ†íÐж!ÁÅL²EV„üTL5ÖòÛÊ}(ô7ç͸°1ÚŽõnVr‹¬>:ûôLf×ðÌj«¶ÙøÀW²†Ù9lQÇ1ȹ fŽðèYç{lùGb}û@¶j·sF¦?z &íI®°LNbƵœ¹dý®^U §¼±'uÿLðFíØ”üä/¯9“8£%¬~·PÈæ³V…?Õÿñæé€­û¾K=0¦)¼}1mQ½~Kø9­<¤ÿã}©ÎËLŒVUÜ–mU¼SJÞœp©Ü—)#äñçVÕÿú¯ÿª (>œîòN‘5Ž<çvÆÜ%]`^ ¥ƒcÁ’´pæ 0ÁkÜ4~*43èPè¿9ÖHiqQ óÖâ™jzÉÌ=(,±‹†E4O¿’ޱhã¨ýEd/3{<&² Õ BO ªQ¡e(™…Ù^˜¸e¦ “ „+Z+˜¶Mq§sRÃŒ°Šb wÍ3H±‚¬K/»ßß>‚ª¶yÀ̶Ù­‹õœ²õæä=·>È'´«€þj¦™9ÐTl4¨W޶*d…ÕhXr˜ƒRô1{ösÕ‘ÃÿþÃTo2ön|ð»ÂnmÀçÒ¤CU_ôA&BM,ǘôèΫª 3{|HŽÞG}­ä½ÙÖ yú Ÿe.#µcž±«ƒïw? á8ÂÁ¸?ýYÙ4wÚk»À³ ðY8õcmù]æÿÜÿ_ Ú¾u ð'ßÇßåð9Eg†þ°¦øßHœ=çÿù?8+(ù‰Ežÿ‹_0Þ\»wÍ¢Õ©e^¥[Sª÷äú:ê ÷å© ,„ÝJb05”Nª†m*®ÞSñqCnUQeº–bA0ˆá$Ð*h“Uƒ4DŸ^¾‰[ôÿªíM”+Â…P­Jbl4ܽ "¢Úž«ÇÇR¼uhÅR!šs§èN<ÁuŒL@É^-¥®á’ç~o9ÿ( yws÷ÇÍ^“Àƒþ,¾Ç\ýMà]çì/µáø•ÿ—ëÆˆwg{CðW¯íóBÁ7ü˼yŸ˜ô†(|ɤàÕ.ÿòs“¿†ÉßšðþAþ‡Y®-FúÄL#R¨ÓˆhšëºÖiU¬ =‚GDì×Dêßøx<¶¸¦ÑÑÿÄM<’U)3§ÂoÔ(t…l’f—vq4æª÷ÐÞ¨´CµàI Ч½=RySÅP bq°hjái›ÀÃt‚â~*„‘ ——Á-ŒÑüìmÙ\H?z^S€Jþã5Æí1‚„‹˜AË{?¡çBœM¸ {ª t»’c„A2îL¼õÈ ÃÑ$("H´F!"ׂ¬„¾A ƒÅõ0]ÄΡ¸®…ÍÈ’.=ò‚Ž~#Ü@z¬G]·ÎCîS:ríÚÅx#1´¾>ÞiIBüúCåºj£ÍÅhµjc-Ùn Ã*ߊ%& :¤k”ñ[رøR‹¼ƒiFC æO5šˆ–Ûsf}¤®R‘1$½Å(´oªÂ(‡¿…-¸ÙŠ‹¨<ÂG½VC^+·G‡Æç÷¿“–ózƸ[pIi-qëO˜9†œxR‰É‹$Þ„©sey+üsÏ!Fp,°zå:ücÙ–ëŸ!ø«BZ 4‚òG؈’ʈ¢OÄýΫ Ô‰þwT=N "òØœ ×²¡JI•òedb5ù.€àff<ÖqŸÌSÏØ£dtï8–äÇýÈGcbš¨z¥Úqtòý{çot9¿É6ȵ{“ŽÿC¡„û2ÎîM½6ÀsQª€V®K÷£ºp] Á¦aªKuo«zóvŒxÉœµôûñ-"üñG1k­Çc›™ÝRw8﹬3> }Ãè¾PØaPs®bÚÁcwÝHÔŸ»›!ƒÝ¶¹eyŒŒÂÜümÄ-êÃTNY/-ªeÏ FLh{»³3ÝCÙzn?÷õGbë⌕ߌ¾Vóç¸ÓD*,Î"ß/=fT#|CqªÉŸ€ù Wh\IY7 Ò9þ?¾®ýx˜Ý?šÓ^—Viˆ„H:¹õõÇ—™Ù6¤Z¼ldܰœRš’šäžMA9tÕ ”Ùø”jš8ÀÙ&&‡Â²ê™¢×ÚhþWvÎtøôJ™ÀZ:hx!ZiKƒ«…¸ˆAƒïÍP,N—pÆVÄž¨è8Ñ’VIµŠŒ0ý©+wÞß(]EŽÛhõ6yÒBœëX:ŽnöZ û1.cIö6Ëa&›†ª>8ÇèjÂ'˜ â×RxÔ܇'y¤d¤ÒýŒúŒÅóÎ4ÿê|KüüsÞs |¦—Þüþ‹€pü ýÿ©òÁÅñCÕñ³ÈùGA=SÛôCÌìŸòªECÍ1{ÜõÙ6ÒTqhç#%Ç(€^½ÖÇ ƨjÌ¡jŒÞ°T0-L×EGx"'ÐûWÒ WÌôÎ4¸‡ÀLt‘[D±wä O÷Š ZÌ„¾Y,)~Às{ÀzQãÈ)\\/'[EÍ¡‚Ì2 =>ôh‡ó¿®ïS±¹FV]‰3H)rd) 娮ÒÑ|ðb~Qñ”ÛÒ0ì­6`V?=“|õ¼]W~‚øó•œoV‡¿áû¬ñ¿WcÌ0Õ|å/w Þr'^3¼üØõ‚Ÿ- ï–¾ uäMIÄ3ˉ¿e}~.]ó®À?yKøï4?µïQ6#Dª(ÄÏ{6Rt½]Êd+¼Q³cAK2ã%¬æWÏÃ}|×QÜÌ̶wKôÇAZ5gåì4+Àc©ÂäOW€òÚF‘½ôK×E>,gXë jG¦¦¦To†„GS?R¨[e½TLuê:~N´<0Ã"¾õ¨i•¼V›´½«mæ¦;ñ‹h=Û+yeQOÛ{ˆºŠ ÔÖ¿Ñç¢óu7>ÏóP%}FëáHÜ—î ÓÄžx>N”_¬Êè¶Pd¯BøKÂj•y:2v³ÿ,áe“½·ŸÊZ?ÀuAÄÍzÌ[Òm¤p“j‚ùØ(4Qª9'3XâôæðˆÈw¿²?%èɃ;&æ«<™‹3]á&èÅ®µa~¡ü2æ8+> h#|ÏÄM'FdJW~±I ìÁv“$¨¨ÛôI!T(KUrެqq-ÿî¹Ì?rBÜ? f¥þMЍè˜îøð—N3*›Åø§ÎJi™bƒø·FO kŒìg5ók™IUhçšÁ¡gŽúßÂ&¦ªšú) S`{Šø*q-@`f¯e"×p¨êµÖZº£|KÅŸÿßw&Òhû9€ÍMÚu]ôŠò4Û‰ˆ^—[¯ë’”-8ùm d×jQfͤ|2sß½zU¢¥‹ðüˆ ªÀœ›0Ê5®5 —gÝ%~_æÌ³×¦‚ 9XªêHáBá!Ñ5Ǿ4ao·½C^ÐÒóRò‹)÷6{˜.\fY•ã¤E—ŒK}⦩_VÕMóY—æ¦O9­‰ËÌÿÉ­†aU” cõµ¦üºp]ןßmû?®¦$mÖ3ýƨK—ßZj4nÙ·h2Å8cÅx‘¡è¦(c7 çAK´ºw7ŸLF®1+`§íÕGëâT ýÏè*D)Uç|=á°8äwZ/>ÔÄFš~Å-ßVÇ‹Ÿ¶WœR غÞw†~ÞCš•ÂŽ:û~S°E9òg8iÞÄW¦ ÌíD@OXGèò‹¡²ØX³8ؚ̬zgI‹ò[{ýÒp®‚óÓN)+‡ /—òÂË{oˆyµmÿ tþÙ1ð7ÿ–#¡ ý ™ÿm\™³ùóåë„Ï¿ ¹ÿ¹^öï}«ÿ4ý'ÚÈè ûÇk>cªNócAÕ{D-:ø—ÕNT:§«^+Ikƒ;Ú—£ÿ ÒÔCÿÃm{BNÏš.§“Âbð’Ô0^EJªà©ã(.á¢ÖÞ>ê—š·,ç²7>ÖezQ^š<2™'ºöïùŽŒã*ÃðœC¼•f"ÛÂjE®ñáìb‹—tÈBA@7%¸½BmqÜmõ8Û FGØåø:7ìPÿ©.–Oõ¼øØ¬{‹ùs@ÿ— üË#Ô;¤~¢üó_Ÿ¿ýùÅtöž_ß“üH¾¬±ùe.^ÿf¾j7þ×wUò±Ãøõ¯|i*yþôo_ö¿½Àχòƒ8̟Ήê%­¸Á©,Q§Ÿ3¿þøcéê"ßT‡9rãâWíà—­™ ®Eӗ΂ٔX´ ¼:òS3‚#^Øu]×u‡`³þx[¬dìLÜÙºÆ×k^Ͱœén7vc¼fq¡œ_·az÷rH¤zíZà9€KaJŒêÝ"H$ò{*¹¬ÒÈw±Hõ)jfæÖmP¦þ줒jK2ÏŠ¾°ü¾È#LÁhraæâþã™:µ¥#Uß/¿–Úý—A$´8VK<Ëý03Oo‰P ZføÆ£õ}…Êù7oÚ~v] Ç­x;'驵ðô³‘é™ÎGÉ!û”²t2 ŽÌ IÙF±¬ Ö2Ð5¨cµ‹YR<€úÒ)³¸·öRSŸto·aÖ‚Ù‰Õ˜=1GA% 2¬¤xéØŸ´uœÈ?^ýùÚïÕˆ@7Lž…·|úÞÆŸ螘®d¡ƒžå½ý®i6OƒpèM»f´õž?q´P άè©Á¿´&üÁؽép~Tñ0ƒ–¥2ˆ…¼Á©”\2ÅÜÀ‹ v&š—j¤)¦Ä¶–þë`âIŽK¿–fF!·íwJçäÔha5fäSŸi9†¨—„‹ˆ|}]ëŠØ1ͤ±Ç÷#"FÊØ76,UÅR3[е–¦«êr1B=sèÿ•žµw¥A>cÓ}zôÏ£™Ê.•°[(rת;ˆ&¾¯K•2=¥Z¢}…ÎOÜafÓô‰f3ë ¬‚$FqÕžWWiÓÕ)bFnrsïm1u<Ž¿›ëkèHØü–™='ŒS®êÖR(®K×R¨ù½÷ãñ˜›ëÏ âŸžú7Wµ“£»–B¡Ë]YǩկçÓ‘K±Öºªz]ëúZBe¼3£wœò í0ö³ë´FW­R”³ ÝšVâð tªOÊŽ‘ëpRd C3 ªð (TùÐ òz,¹ýo½S >\Šn—œŸ¬P÷¤ ÊêUÅ9 §†§³.nG]ç¿i½UÏžââÓØ&n»¥íKÃCùØ|SùÂÇëé,†°C–­% áù2NøxcG«žM”2ý_4ç†s|C¾Ö½ ïBO_Ï"_b(¸w½*þ¡Ãà_ÛpZø'þU«ëo"ïò*Íáå?óo{³üÍÆ €;&¼J@ÿ·ñ7¿¤w¯s¼€_çyñx«⌱lZ @© "ÝFÙ;|å{z«Õ×Eƒ¤J“$mËÞµ¡gî¨e6‚ö=«Ê9WÛB“½)Öx¹£˜ùüívdæ´;.¢Íé‚RÛ;ú#Kn?/P •®Æ¡+HVFj±?­¦µJNÔ>}o†3Û »)²¼‰þwÿpþ¨I °ÖÞHß‘M¨ˆÌ&Ç—¨ñ,y”"ڷŇopèw?íííŒ'ªèù/oÿúò{çrë˜èÿ!x†õç·Üø€‘7ûÕï–Âó¬ÕyIùÛ„*ßžü•Ÿ¯øþü÷ݨ¬R¿ ­ÿ÷ÿsÕì캡֟R¤‹’r:cÉëd²mÆ·È•byÏÿ9b …t-wÄ—6Þ’žîÇΛ8½ëe\ð¿Üf›Fš.õLO#]Hõõõ¥ªßßß·ˆçDÉmþœç™ÓÊäÛè:–ŒcFœoÍá€1܃‡—ßµ„Å Ô¯ËK^ˆ! öT%3•Îþ•ó4ak0ÛKUTÇ)©²Þâ“Í n™X,#*ŽÜ:Ϊ¥ïÉ6U’è\ –*'ðnÍHHJÚ‚5ª쩆«Ê{;H=˜!›2Ëä ›®£V@a1ÜÛ¨"ó`¤x$‰F×´¹Ú,<ç €ågiy~´óY`î›˜ß Õí7«Ï!:v•Ôþ‡€.PÖ<[>ií9§ k®@#ô$¾·A„—hî, ÅÆeQAËÙBdÑœtKdõº±?PØÎÞ¿ "Ê!Ì$ÌFî¹<3&N×ì‹@wKÝXÇ®¶ƒ½FÛ<¡Hi´­Å.É´mõ¢CõØ­€æMâù„x “cK=Œ*zcBž˜ý'¹)Þ{¾¼ÕÇD…L €Q¶íTNϱ»`ß¼dýÒk4BYf8K«BTe]"JYï÷üÞvéƒnW°-,‹Š“•[uݼŸXNùê¡æVSlâýùJüƨO°ÁÙŒ¸IÀ¶úiÞeê«ÑM"L»¸õÌÏ"ýÝÜzÙ çç´:ôUºp”ÎÉ`î<€#Òš«æ nsíYâþßyŽáÞ¬[È”5›r2¬úÔ”;úZ¯oï}»ý½)|ìò1󸲓'ÎÒÝwk³O…šå~4PbðŽ^eO¿ne§C IDATÛ{?æ¡nÝ‹‘£.U2ŠËT×÷®k­µ¢¬§Uº÷NoœžH\Ô EE7Âp£®–PpÛ˜Žà+Œ°»â”Æ`mX UQB[%ìc˜Èªdô¹G3Û^Hë1A(›áv×¾‹OÎ.7l[Eò!;KT¼Ælruhl! T9·u¬oR1œæÈR]—âO܆€HÊ“{ D"Ê 4[º#±KH‹ôƒˆñ‹ì¶ÐI"SuF0>ÒHj2#È(ê¸ÜÕƒÔê‡Ë5DHR/yq¿HÝD3GÂIHæªì{_xé$¹cÝd©,yf”“þQ™0 {󉤚uPÃ×E¨ÓÏIJ­``1þó»é™ §Œfù¡t°<áÑñiÄÅjÞ–r'FRסµ§õCоVˆ)d¦DWG¿ÖÙ‰óCšLgzb°ì¹7ßèÉ¿ Äç(Vy/ö|)ðÏûsÅþTÿKè÷/ÉÃ)¯:%ÿÌÊÇ_ëÐÈUü>³§bRÊß}Áþ»”Î+ðHý¤Î~&¦2k2aöŸ¨y‹oМ>“¯×|)°8Ó’ÈG͸[ <'G#ʬâõã<‚öI‹ŸXµ?ˆ¥b;êÇ`Èß× 9Xb[tä`•£¹Œ†Êg¢Ä€ãI3{ÂÁ0‚ÿÍÞa¤ö·ÚÊgì\…å6ìsP$”vš.£Œ&2*|9]G‰[ž²\Ú–mD¯øª~˨îF·9g|Ð}ysÞàò[ÞÓø €õ ‘¿IõŸ –xý†ÈßäüOådw2`þŠùO8€ßðü•¯ÌÏ`¼¼‚þù&šçÆù¼ûÆ7 Âóß½$z^ï×òæÞ™E~üÊÿá›|t)Æüšo„|E¾et»B¾Ä²-ªÐY˜‚õÖ´“”åj=UKóêªêZût¶ö]=Ú,°[ŠíûÏïâ¿Þ4n¢ª´ËHàík†jñÐ]*pTž1Ó~)d…|d·Ÿ‘©+½‘ê $]öZ¯˜G…ÉAÓà_îÀË)–Bdžx_a?{ „7³E`t‘Ø‹ÐÔ{Œæ§~ 5VÏXQæ¥òôÈH‡ˆwä΄¡ð:È'3Òï€i(cñëñq¿Õ㌇ÂtމÒå·1f’‡íGè¤tÐæ2<ŒÏÂ1«ZKTñnö4¬ÕY"e|Œòã$ñ­ºNvk¨ÅÏry/«£Ù©åÕŠ]0B½(Ûvõ xÐb7¼ œ>—a#Ï­' ql׉ioqW•–"¬ö‚xl#²ï6ºwΑºb‚1fnÖj(…zÜiV­wíDé^åM’ qZ7§Kr?L–ºìÙ+€ÀSpmAKHt>‡AuÜÀXkE,¡‡¨ÔVÿôèV–ß¼"¡X² 4xq³­3QDÃS<¨jÈë4ÇNQ…ØÊ ²XƒŒ’IÊã{ßt<=Àž'½ÈþÜîaÔEÙÉÓ.À$*²¥2ô{¤q‰ÅÊaD '# õÀZŠê¡j!×t×'Q—{¥U¸a,³dÈò³~øØñÒõŸóø¶¨€ôWîyÒ>Œ, Ú0ÑÿTµÒ±t íOYdöc’¯ÔõóàzësÉ,´ãAõæâéÙ£K&Gï1êrœs‚˜ÕbIÇ`èkÇ2Ľ?ÏŸ¢«¥ Á™4¡g=]iiŠ‘ÝÄ×ìø;ý&ø+2àc ÏÁ¾oþÁË87¾ÿ Šû—àü'–àãO?CžÞã(a™’µßdfþq$À«w€÷å§ÿ)b€¿qŸ¼ü«„}}È=ÔwfÙ¯äR@¿úXÎjˆUœ‚ÞÅ`¡k,ó 5X€ô1Â1pPbÈ̲)K{ÇJé=‚kc½è\ÔTdÎÃH6žž­´ Àå’‰j„)‘Õ¼b*0¿ž€ôÃÔÜ!^-ô¸¼f¢KÌ9Y‡º3gäÑ7&à%LO¾õÈ“OñCÐó‹™_v3|¨%xÕð’ø%‹ù2¦¿þÖwã;+?SÖ|EQðãšö|wýïê ¸ªH’yðôÃvâ]jz«†IöÞ¤CBRð öÁÐBJFσäÞ Ïø¡/•}ãçG.¿÷ $„B$1ðwÉ€#¯ëŠbºwï½×u­uå”IWë8Ñ^¨<á7RÑ·1Ðv„Âá}òè~E'p7…{­u»£M«Ór Ùİ3EôéñfECÆÀû–g›g&ÌO£V ŸÈ]—œ9¡qAìhñÓ—.ê™·2Uyư sNÞl€dV:¯‚WòtQq|ïZ—oBþ•Ö蛚sÊJºÄÄYÑðe„XkÉ®ÎP ÇS†Å -À 1 ã0Ki¨ öjQTr‹È¥áƒù¿ÿŸÿ74îþãhGy+z(Ì._¢N|H5íÞq•*ßGfI¯cá–„AÅ9 ?p6‚2«Øðy¦ H0™€QûìBxK '9+/¡rYiòý‘ÞÌ#@Ý1¯P+.€¸"““¼/A »Î’UÑ!Œà׿¦APë6u/BiÓR;jÞLÈ,¤Ü{_¸TÁÐfêØDaÛDå^ëª,˼™£OñØI*7×—¡¡S›z7Oé GüZ\øB˜úpT\ﯮ„ªpbŒz a?^Š×Ú‹“7ÞèÆŒ@¸¢Ë ‹rvÇÐuÂÅY<ݹ—B ÆI+0StÔ f0¢ 8ÖI#+ßÈH%á 5ïÞE­´PT² È/‘FN*rtΰBG¤Rb‹çPÐ1/ŽJb#¡,£Ûùné~ù#šâ _ º=ªÜÈôÚ7«öì.Žî0:Ë«qÒÑ[mäR”ª@Až@Í}H½Çv š\™ú JN¥=)–j?¢]N°ÖÆÀ¬¹žøËø4&ÄzHŠvÔ…/:2¯m$¶+…¶3å±ñîmÂNÇØ#™ý7Mn=vDê{î°Í¾…¯Ô©éˆ^½aõb´€(ôúº†l·×è‰E;ÚéG»ŠÑõÇÜh{¬H×µjm¾O¿'Ș–ŽJ©è÷µ ‡>µæèÊòm›©59(8$ºYm]-ÞH´h~xzä…–%)ŠÌº•cÍÈq70DÛæªÎj[rõ‘-ÁÎÌÅRcÓt¹_BnysnºÜH¯|éwùñab¬ñTòž»Zdg¡)½&øG¤*îbÌ¥Ã7ÒûJ¢¬y0,¨ÑŽ2k«t)‡ò-ÜÇ”A£ È­Ò ¥“ØŸ£yF ¹tMec*>Ùk~Il§)FÜiã®mQ¹0dâL¶tŠE»%ö ßËG´ûµV õû5€ KPý•óálœ8ö­ùyH ü붨÷R“—¢d`)Ï8¾õohßEÛ8„O#î ·cgÙnòä;K?üÎO(!^ AI  mƒÏ±þeò«ÛàöôݱÕqÃü–ôÊüåÿÝýÚÏÅ¿¼ÁjáÇ çOýMl¿’ÿ"¨ýÄòÿÏ»¬jy•ŽÁÊ›¾9>ÝÝø{®å)k•¯²¨Ûõ#è*ß' Ú6?%;ðM,ì‡`É:eÏE+ÇZ©ƒIÊù™*{Gà—@ý8$¯e£”Ü…¹¤ÑYï<â6pùRc¹­<²`Ô*QE ¸÷y«¨Û‡=ØÁÕ¹@׋ZVô g(GƒzVŒ9QÊ S×oãž"?tø‚² Fµð«@~¾˜¿ÔeóUÍïgÕùnÛçÀ}Òû™÷ßôíä%[ðá>×˯¿ý÷íÔöŽlxoø¼^Ýbûù&üí#?ûÜÅð®øù`ò«âì,ï¼}øÅ°òþ£³Ùu­EÏâ7“0ö®°ŸºË O¬Á5ך£™i0(/3Ü@:Ù3%°ËuýÇãñxÌ£ˆU|•Áô®èYº–.Ï&]z °·íÇŽ0Ë Ú] Çù—êJ´ºÏ®%gIG¶Ö±¹€•Còñª*kÁëTŸs"™vø±Ÿ©zÛÛªd'Áر¬TzæòˆY yÉ'\ƒ<ŠU×8 …IßÄñ9]‰z„ûf’-;R¦µ¦Ã»üÝKo¶N˜e¨½2>ŠmóÃ]WUæo÷‹}u%Ôj·ñÈxÈ-1²$ÒiÄòÄRM׊ ç0K¤1 '30¸™8nK¡p;˜`Û¤tƒ±¢ 3¯:ðA%ÀãÉêΟY|Ižù5ö4ÔµycÊß 6èÏÊR¨È4 ?÷‘„×:“µˆÄ€ªJðäø¸'Œ+ŸZM!+¨s‰ü}×'ôVaD°PÈôãà‘\•-'y] ÷c;p¿,¾}¡ Àõ^%À¾€šn0nh3³7É K—£ùì‰IáÁJ@Ù²6zØâ<#÷–ýïÿ%ï䬶}m§{\²‰Î’´ýêÎö¢ãx(fÁFaqƒ»j­âÆÄ–úйÖBTM)sÏÛ,>»±^¥ýcEĪøøòCœNû¯+~ûWü 5Ú¿ UÆ“"÷Âw€Íëä}Ÿó þÍoþ³?|“Uýëûð?ÄUÈ˲Nü‚ŽšCÁmÉgúÂ{œŒ`îªøeŽ'àC=4¼®nÉ]–ñß^µÄ²N“FÛõ»(Bhl4¯ï«ˆAÌ ƒ!ˆ=#…wãí…ÄÉêô4^e,m¾‘ýÈf(VÈQK8Põ¶ýZ·þÖ`ĪZöAHýļ †ïõ;ä+‘—Á UíÁ(˜Þ²}â Š=ó~èCÎqóè—÷€òKbì‡ý+ŸØÜa½ý¾ÿ«•ž?þûÕÒõË÷%ò"¿èÇ -_ã/k„ñ«ËK”/ʧÄ6¿} øØ-òì‹ÿÉŸ«‡ªèòÛp‡ mŒ[Ñ­÷>·†S¹†ÊyN½¤G^$’î¿ôñx<Ûh ýúúZk}»l)›2Í„³>éçU]ëZ+ wýËü‡1ñ.²\.3Î%yÃ@@yÃL‹ìmWE|æy~ûYçZð Ïyx©ƒñˆ‚iÒ××—ãîOA“o(±wëmš^gŵÜfÛJ@:Ú8ŠÀ¢*Í…öý±§H§t4!ž4j±5íAÀYJÃÓ‚ 8î$¹Š5$‘Ðñ n¶¨–á:Æ‘ŽƒtãßA26 Ñé^  N0UUœ †*Ô5hyg8tŸÓŒ‚u”žD5 (ïÊI‚:¶/)žÃI–÷ìh.¸ ᣘu­RðæÏC#†Ç]Æu“«/L’ e•5 J¿ETÔãrÒ¨ºyKbç,PÌß“%`sÁfØó•€aŒàBV£og¬$é2uÙ‚[ìå]ý\Ñö`G¿‡ãÞ®fêŒ`¡€ÆËS»gþPóŠåšS éU,ãjðË„ IùcÉ8¡Tßß›_"r…Z£`PÃ_¯®ýKôÛ\«R‰7žáP’Nõn‡ˆß_X_××Þ{ßèŒoUóìþ°öc'@¥­ò7~¹ùØn’`öILݺd~=N=ßÒþø¯ÌsÕä`¦–$³rz@N£ê@óÚràðô9É®[»¨PË~¤éºÈ|kýxù¶tJíî=œ w¼:«—C¬Y3,nt·ø"lްÇ"¸<¸JT³@"‹™3ÈL*T%ï÷+Û=b2@{kÑœ~ó¤„çÀÊÒ’é+¸IHExì€7ëG˜U÷dSlyŒ¤\ÀXŸ *Îkdè!>ËQŽôLŠhzQ¤òm: ŠÏy Ï:Ÿ»ˆSÉžï[Ûw-gɧ`\Þ–”’Ž{b:KðôŒì…¢`RÈŠ:ÕcÊÚFßt øãºþøZö ´4Ž‹–°Z ®`tLï8=–™+Ì¢³'nj´"²ÝÌv*0 òÇ×¥ ³ Ì<1 é —œy ÙêÒ£OÖÕüäKTÍŠÀ!ý‡3=:Ù‚ãHtA‚ê§/罓x>Œtõö¼ŒVýlv$'W |{dz¥ŠE¸–¯šéðÇ¡ æñf¡Ü V4CŧÄí_I7¸¶1r/ëö0Z6&¬Kt3ÊÕ=)«w…iÇ’±œÈX¢DqMª–4ÛåÔÀël§ßšH&O£e¼û—F•€òpvû«/peTЃŸ‡‚‘ê5œí.Ša2´(¹ÿx»šÇô_CI¶#ùrô/åÙ=ÄŒmEWh RÔŠªIÝè ñlñ‘GnT8Æá‰þ?G”ù‘s;HÇåCV:U¤’ÉÙÎw—*šsn6=Ž´XÂÙ%K£°ñþX`u+Kˆ""òÒ^`Æ”'hÃ[ЙIÝRÃq$§à¨Œ|Àü<ÿÿ@Óˆ§4¡ÿV6Ï1Àï*ÓÇüögá—ï‹oÀ›wyÍ×[ýëž&²ƒ7ÀçLóÛkã ½.ßõG·ûüƒ>÷ +í?Ýâ,—¿HS?f¶\æ£F.²Ž°«{ ó  ÕC„mp~S tIeŠ øQ1Lè £x€/RÁ¥¤Uÿ°ÿ43?žõ Íž'Ì¿}ƒü²þc)†´ËHs1Ø_2,«< lpó:Ó;ˆŠ~3—þÕ-Ä„ÿy—ÚÝruAŒ†•WC‚碨Jâqó÷4Ás ~]³¸Å$„™©—é”Ápñ»Òœ?JÍû$ K™‰{;B„¦ØôP¹"òå0… ªñF3Óìþ-R–VS¥¿o]uËVðN2¹zP‰IŒØLðâT^ágõm#~cwèaà@6_+{[ô;¿ ›$o\¹ÝZãÑ8áî+ë˜ò{œ´?_”ƒò½½DòFØg{mÖxU¥TDV¢‡1××õÇ—&úy#Éo³}j¯µCöÔ¯TÊX:̳å˜rÑÊÇ®ùÇ„5“ÕñÛ9Ü‘ò„ô Ô^;Oð…S‹5eÕ§btø™“5†ž#¡Ma—ñÍ SJ?ú²'y CŽÇù¼g2jfÿù½Íh·j¨c[7¸áåQv*K×’ˆÐÉÝ€&4 ÷jÜ?W°#( „â§ws9ݵÁñ‘e_€ÒÛ d-¸tã 9QßÇžbæ=²‚[àä `Ƚ'øR ‚ Ó.‡ ©YyøW;gÃgzÕÓ›LTöf5`åSÉg£Õ8«M@Z&õ(Ѩ‰ªbŒµVí3¡:"– I{ßa§ð{Õõ3ûPË'ß)ŠÃ«ÙÉcö«RhÉÝà…p|º¤2¤SÁogRÙ$ rÆBeãs¤×…§a°y_n­Aµ…b$Œf;¦ä^†¬¶ž‚;Üzc;SÈ­È›‡YàVúÂ7hžýñ%†wƒF®nãËc}Ñ·fü]þ$^+ €ý“4åQ¥_Âßýxü¼Bùþ ö·aÖ¯¹ ùÏAç?Îø8“Øÿ¶[ê–Äñ{xäŒØ,ueÇeÖHŠjŸ ω}—PÉQÓ‚ÇôÞ)ƒ´Ûp‹-—c¥r,{þ\cîÄô]s5f²'ÇЯ`L­ôIþß[œ¢€F´1˜?­—êc—ùÁÙ…ÿ)Ù4ä«f€OöD–!kµ%ÏjZ_î­{Dü˜ÿW²©!“-²Hƒÿ«ÿ ª Xj¸ò»nAÆ•ÉÖÚ¾ý³ñ¯À<Ã¥àpfø|0È©ýæÇ<÷_€àÏ8ò3Ù{Aoûc?Þùæù 4óÜøpA^^¢ç:„<û»íOÜ!^µúþæ.Á7õçêñ×<öó½ô¼“ýŠÆü%Ë  žÎöpd~‰xt³0®È°üÃRà¡ê;Ü@Èë¾k­ŒµÕ¡¶Ð»HIW^ç™ÍlKaî#³¨îKUõ@!üáM†Ûqe¶'2ÿ3ûÊÄc«0¢Dêµq„–=2ÉÓÇ6U«e‹iëI£À»kÒåðŒqœ:Å6å†D-ÿÿº–® Þ‚£+Øqz?kùçìDFz)Ñ1#žR¦òvËV=OÅu¸r¢¼G¹!ãb›½&)ÃÖå8^põ˜Ùž¹Éhu5Šjoxί€Í’ÜŽ0%a±dŒ4añ@vâZIúûå(jÝmëyTÅ+ƒ“÷7¢IÈ늃‹6.Ò5<¨C˜†8¬èñ8Ø/rò托ÉH ¹Å4wä¹ z·â—\H t•¥è+P€š~pgq¬/%ŒžDl÷ÿ5œìw¼G1鎂U©(ñæ¹f;àø’™œñ#ßðT¢ r~hcäIü‹ÉëT%%uB|žC²­Ë:tä-UÕÅxŠ£/ÙŸvBKòÜïK3ÿùiù‡¬]W­®JÛÌbÏŒþGÝñŠ‚Ic¸1¤©š}?:ñà ½àø=/ú™>¡ÛÌ(‹Tl IDAT4rùãc[§–îtmn¬eF¶’Ȩò;¾fMD{G"¨=³@ʈâ9ÓŽErBÿ™ã|èÐzÿº¯P>¿ê¬Ç˜uºôþDÿeL{”ó 5ñH™¼Ôýótx\òY‰Â½#lÙÚÖŸO¬ Vü2Ò̶’{CÌ3a Ú 2ª°‘ù4ëF(¢ü÷èYŸx vÙs1"•Oy×`žgü]‰…Þh5®Ä@c¨êñãïWß4b´Vâl(Ìg<*mMV‘]Ø_'Jù TøŠßò±¡³{½²qFM‹þë˜[ÿú03(k­ÿ뿾–Âq+äqËɧݞÅóÑ{×Û¿ñTÉyv2ÎÙ´— Àu]k­”üçD–±ò.¦GÏ+ ‘dàÛ®9Ðiå$TRy¯"Ø®` ôʽv Õݨiýme²;é’V mÝéGVHR°]|<¦Ç”ÆÇc›Ùu]á6> ó]_×¥KmÛæ'ÙwfdËÒš'Ã\•*x­J^Ì(€Ÿu r¡tïб#èyÍg^äiuSž^RB¾¾–ƒ‘3%É ýÊÿõðxÃUJÑ ½‰sÇY«ìªC¤2b6ïÚÿ|³ÉeNýÚ |‹”0¯¸¨j¥ Nct¯Û1y™Ñì2}Kù€l–Ú‘`êg˜Ý´´išôRvJçVʵPŽ-‡§I-YêíL2,mciè ô[õ5®rhÅRΧ4]Â]yg•J)kÑç|ž·çþ3«ìrÐ3ÊJõ„®´&$G°·¬UÙΠºùžXŸÈ6ðÑzo—D¼O§&+f7ÕRà9màÝ-¡ú‹­Óá I£·‡!iÐõë¤ÚÚŽ8T¸Ë´å^E÷”R†7Þ‡ø¿MhݧÈ9ÐG“–ª2N>Ë=n±œ‘>ae¥YROÜÃá-£ÎšÝ¡3ênpâŽIÍþ€>#ÕN/ÄÄ«oˆàd]¹mË£¸çèZ…ªK4ŸZörÊ#Cn-ˆ‘%5Ø#³0@PnÕg±ä¦Ð2ö–À¼Uë´¬!-, Φ¾OSE?rVî­âÓªÁ¨Sj¬µHz©Ù”.QVdP`­ÌÌ a€‹ÄŒ"_rVGÊÜó [¨9521òÔºž»b`¬ä¬Á(+rïbÔî4s_‚5Œ÷;þ]Ç_ÎØ>w* Eñ%"ºT ‰¼¤­¥ÖÈæ*üòu¶Oš†œ,ˆ1¾Tp;½v|2D+ƒîUûD#X@Þ*²µ,•ˆ€/ƒ¨Ëtä’Ô]6Ñì@ö{›²ú©ïOÔѺ‚41ø‚dc©ŽàìHÍ;Ä™‹äH¼׿WsÕ=­IÈnaYB‹™Î€Ê#¿¿’Û7ìIÊr›Ì÷–˜tº2ÐKTd'Šš ƒ—–ûííQ†C…#ÛS%ÊÅԃ߇ˆ#9q £ƒš#˜ÉÂs@1¹ª;âzüÉvwËqJ—=Ž|¼€töÙä‡?Ê%±mGô}Öl3ÛËòž†T¨Aéh³ä ¡ó“ÀèCÎ|yHÃLH¬òEÅØEí7#\C=‡ ?{ëÒ—spÊê¬ÏË|„PðÉ‚ߺg92P@Èi!­%Ï_ÉÙ ŠþY2ø¹·¢ êñXßaæCù¢çÄêÙZê„Èc‹¥——h’÷d’ššÞ ² Åõ¥—Â(è«`‹]pw#mßõ®þ9fZ½Ú¶u-œaVÅóûg°òZÙ6¨zt˜Ë׺ʆ¢Áá–ì An „Ì$œm.–]ZaüYÛê©„ØÞžvóµb}QÕv•³Y¢Hþ4;\ºŠÚJZÅ1$Àr ¥Ù£‹Ocƒ„¤Û…„¨Ý 3_Gi×µÖWxæì²ùqüÿÔ½ËvI’-jÛ¼gK.ÆY)—µô>øÙ%°+OzOëR¦u;$¥ãÆã!¼—½i¹7U!{#¬_¯¤½•®:“j {’iϪ;f‹Ò€¹óþ9Ö§H0]·J¥_eÚ_ÂßGìß½’=ÿ—ÀØ×ÇO}gä1 C¸ûšâOðßá˰…òÏÚóIÉ8óí‡ OèÿçÔüåŽyüyðí£9áþ<¤™ÏŠüˆ¬ÓvfÑ;žGP“ÈmM%•"ÍAªùN¶K‰’íjÍrPžÂ8ï ó$–JJeðG-ðÐE‡//Õb)ç¿âCÜ&+]ÅHÈ÷Iƒ^c׃‹ñKŒ6LZĨΒV3q$dz€TÐJQœ qUêé€ù5ªÊ4ÌÅ·*ô7OW÷ircu¯¤Þ†¬MžÍ´oX‚gÞ‹Ÿcý7•z¿R¾îé}•ŠóIÆÎ'àõ;Пïñ/ ¶OÞò \žþü{q<ÐÿI™|Ãð|•ž‹iø­=ƒï¯Nrävkãû‹(žÚMžÝøî þ Uu<O¯ÕeÙñ8¨†ÁævsåZ+‚àsR¿›øBžà(.ìý0fÙÝZXkœÑ5¦AÕŠÇA–…yXëžíKˆfkIõ3îÀ &f‰öÙˆ,Ž´ÍÆ¬…êV¹5FNªãUTt¸F¿ +—à^oPÊœ] …“„pÌã¢NK›¢HÉM'Ç-¨ºÑ;âvHÑ䉽ÈA1GÁ£N³[ª7­¬ a5}ÛÌÌgø’ïÎ)(/µ®—²ÛÌÏívêøhŽ­´êÇåÔCp¶é¢pÓ$ º°–¢ìB»F”²¯ìü*iP5Û{«ÁŽ[i9’<<ð.+àè}qns(¦-bòAáŠÌñx`yE…ôÞ\È–‡Ö%â‘Ï Ôw|Þ©[,oÍL¤0ðŠñŸš¢ôjþÉì40¬ó*Ñ6ÜótL™sD€ó˜d~* 'T²ùo!:ñ?ùhîæÍ é¼Ï#­>J AB¢½£^_Y ‚iÌ?ûR®ûOQiBËu‚dM3£q¹€ ±R¸ªj82s(€‰)•åiMmy±b›™¾6A‘Ÿ¬B Û %é~Fª  ºàP‚só¤¯MŒÕΓè;…ÅXqûÖ¢£Á2BÁÀE]•‚ëm°lN¶´Ýô‰Hƒcï •GG~1ýÌ1ßlÝQç\ÓcªÅ=›mï= Ñ#ß:2ÔF—àˆÜ EŸÖyÍÞŽžK²/¯§goh^Q‹¶ v`Y¼À>§âÖÁš•õõ²±øœ1êïT;KßKIL ý÷Ñpˆiá`¿Ž~`é<‘xÙ)Ù(Qlñäq—H¼.Š/•›óJ;Y»gØ_Æû:®[\Sè câ=Ôí7+R…\ܲBÃù‰½n<ÉçC9ô²÷Cte1Û"Ð÷£l3,QYеԿ¿ÙžWº%&TÕýØšòê[?„B3­ºñ¬XüÊiÔÕĺ.$?å¹l§:» ®9ÆI-Y²Û’$òÍ}€·mf¦¢ë#"íKøÐK°·Ñ²ùE÷=ܽ€^’1¶£(o± ³€¬%²‘ ¼AåÒÕÇãKY¦í}¢Ìï¾T²aQ†DŠ6úÄý°-¢ ºÔ·}çËŠ½ZxNœÔ­˜tBºVE`cÓ´S@p]ÙmÞ•!IÿáMÍnSDÎEMˆ/Ty8s×ZvôËu'D:‡ƒ´«ìɤ·µ6ï©›Ž˜)væ>Z-‰^PÌuôãëor©Jv#ûÒîâ¢ÒEŒ˜QFÄÎÊgkTò›‹°£"’µÝKÕ%Á‡.Íá3ãŒÚ#? †#¾™ÕZí{Í=®5&|i;x£ Ùô¥Rn (ø,uä{ "å èÁo`-Ì(ôy'ÿ$1?¯¯âÕðF{ù¹XuæÃ7Ì·Pžß Oç©ÊÜM5¿Å{Á›Xv|ä«‚Š ‡Ó¾¦È†.²m7‘ˆÎè_yrú¤ˆe}ˆ¨pÑLW0ĬÐ;€0ŠZjµe.m%6Tª§ŸtÒvV0åzX ã,r‚\3ŒKdŸu.&ÝqV ƒ•"Ø"ÊtÙ&Ñ©Ž‰òWðÔF#ä›Oÿ¶Ša¨ ì Í}ujÂ×hµ|·Øö]|Í—Ï~åÿ•»Á÷¨¼)Wø6¥Ì;ãòy%2ðÉKÅË ñ7´ÄØžß[ñœô+þæù{áÝÖûÛ«}BÏòl ¼ÙrO‰ß -iß!‡? ˜Ý¸Âe©7ûyX´÷tÅ­¥^Áv ä![k9ca5KU°ÖeÆmûǪXër1Kæëxa½¨W Áó?BrN“fá˜è„ÄKÕ£À$9J’<.dA?†˜xWì$³-T¤=ýQ¾ÔµV½)·™³³§Ï{?sˆ½˜·g-„تÚnq³c'ÔBÊ:űˆpÓ®vÒXp(Z1e*Íd ¡þ#ºmV½ÄÅ4\Û¢¤BW4òEZK+\4èYz(ÑkAU…›Æ-æÑàrddž(a—ŽÛÁÛ·E ÌjPFÆK@¸Èú^aÁë…"¢õïÕñ+YÝ["ÿ…U‰’/•°¤´µ?„¨+XÁãˆ@ï`à„GŽn.ö’¦”›DQ8Jêx‹r9]40m"¡âZ§P+YžñRö_G(T‚Äc‡ï3ˆe(Èó^ŽÖ–ÁG©Õ%·q]bž­¶!ü~`Hÿ¸i(;¦tÔp–­7ÿžŒüŸ¹›PÌì–"…lµqRþÉç‡&*Ë9?t­ZZü œùá”ê¢ÔBd<ÔÆªîQK‹G34´luƒç¤*ŠdÍ9>ýZ™£2PŠPqÒƒ¢OÛÐì žŽÎDÐÖ]áø"Û7J,±rlÉ­ÁeE‰¢Né@3PÇÎñ›c渭±î»ˆ&v.ŠB*×ÓK}îuŸXÿ³„0ßîY’Q}”·qu4JüÏÊ‘0°+ä8"žU]éî‹Q°²å>8ë™1ìzi=ÓÂòêƒrjm„)åuQºá¨ “ï·AÍt©Sw ¯ e‚+æÎþÛÙÀŒµá㔎§;äØz-5y¸@^doK)1iÞë¶Uá)^îiO'JƒÌl“Ñ™ ×RŒwê`±_¦=Õ\,sÞ‘ä¿Í®kI¦á åJÊ;VwdB +¡\æ¶‹î;•Žœáf𝄔hönK5–¯¬Ð0Γ`x›êü‡ÞpG8T€â|«äÅ* f<ëË…Ínø ²®]–X¿fØ"n×£¶òwdN½@px€ÿy]aÞ&o¼Äæo#Ûm²û¦æñ™yþçlº…_÷ßFæ¿̾Gð ܨ´Š•¢¿[P`rNëoú*?ùó¿ m|áň½ùÓð–W•n暎lä^ bͲb[=)Ðw̲¼8ØFîC¡X¢£mq{oÊš«Èâጢ$ÔºÊâ&hÙ©EK·T<¬Ïø åe¹mYíkâ1×;BŠš±Îˆ„p„½=Þ1ßR?d© €yï&v€­Üù¹YsN2ùõ3ý\AÓ0tí±üçÉÍ“]GJ‚¸&Öº3à­…oJ~þø?‹ýoKô·×ÔO´üò&ôìw^L¾ä_|‚kòšôMJæ=EO×~|aV¸± /+“¿A(|ú¾d,^ÒE¿ +8;îac¼)Å·ª<ÚGšifÇã±÷v ÿ˜/*vÊ÷â\z-]ªËaë?~\k­ëŠZ6fƨ#Ã1Û­¥k D`6ßš´˜]„²÷þãìä|›ŠèLøŸóF_ƒ—êÂLºKEpˆ@:˺”Rcã8Þü èD(õ°!ø¢›¤@\Ô:Êú‡bf{ïýx˜Ùœ£ú ÔÕèR³~š9‰åMoǘŠq0óPUJxÌCðwæMx/Î=WÊw³LØ£T‰¨¾•dú‹ÿ“íè͉/"óSà ­YÅ f9M$ûögÓþÂ(*ˆgFÐ%K‡`¶.Ñ‹;$)~ãŠUî@¤ëÜ›$‰~¡Ì¬U&³nNû0€®ð àøBÇUTwÚ!³Tà}|Æp9¹0*y@À’º?Y‘r¾¬5ÑþÁ6ÊM«U´Ð°AŒ@–‚W7RFçi7oºÑGÛ\e$Cäé9:…o®*PYgpV÷ÈNb$Í*ª¤îÔÕR7z¬r‘Ó º@fæ5³<ié–3ÃüÆ«uBôH52Ä„–u g\©¾5}ÏàÌX/~ahÛ|´fjOÃa› ʈÛ7Áèm2ìVs7`êŽãq0;4iî]²míÙ9Sç‡ê [GDÃÚ×Ñͼ+¶;úIj†ìp\n6q–8V" [6ʱ{-ŠbÌíuÊH¹ü’m¶½9álGHâ7â~YËÞu“ø½ùÿ‹ÍŸâ3XŠÌg4\#¬½CÞ[ †²¨tÝ£®³˜ÇÕç c…2 Ë d§Í‹C”pZI!èЦ±ûï[ð”%ààbÆÓ™BÑ“ª~"g‘hÈØC°j9+©x׎ïêÙ¶½××Ìö6Ò21þW–'å<µ’Ûìañ(©®H“ŠÎyJM¯uA_6ã~‰¨ªWž¬¬kiW@‡BÙJy tÏ}šâX–]è,ÌxºÊ#¹<Ö‰mdžªB×RË ÁýxØ- Î-(ù¹ë‘õ€÷“ÁpÞ»œnX#kÁT­ë㺮«ö®zz¨çâöˆùÛ|Ø6kZ%+]란§mF?:ʦ|Óï÷RÅX"{sƒ5÷U]ªli ÿóˆÞjòLJ‘ºBG©O£É0•@e\½ùšýV¢øñ/v&ë3¶èÙ9ušk™[qí÷Â’è²¹s({ F¦¼¿´µ–<å¿ÏƒöÄã§GFBÛ|Û”ltpš:ª ItÓUÞíI“çR̃xD]-"„$Zw d"÷cÝGí+2ÜùŽëÂó`qÄo¦I h4ø+ÈÃÕ ?ÐǹÙgPL<ŽÝí 2΀¯núDsLFêdªHÚ ô`°ôoQŸçåñ´ôÒ.ðr“^?¾ï¼zïÐùëY@üÂlÀŸáúqx«†Å[ÿÀý¿þ¼ /ß%æ-~öõøýu^= o3²ÿqÌñ åËçþ QóüÁôÙŽrØMy”œ'ªÐ'GvØ’s_ù}(b¬,)U냯…C“2‚dyàl³1¤Ñû)ÍzçˆR±ÍìƒÕ ñ„œCò0é+mjc$_FÚv°qø$Á2¡¸ÃáVnòñôÙ º'3ÇÍ#üÛ2§ÈÍ_–Ä™xiíµÖµ– Øÿøãß(´ÖÇ4sZˆÚ‚“0[k]ëŠaMu­]ìôဟ$²Ñìñøá“ùX·d¼ÑÎ.•9 •wüßì+žDÈü“ñ~±–Î?ygªxq&ã2æšÛó×€Dôàiœ(‰¢>±øŸAÁn˜HÉ$&’²gP†L[`[™¦”¸ÁÐx¦ñ®á±h™g!Ì‚F@–Ã}Z{ïÉ1~K?¶ Aºü,bÅ„Xxƒ»Õžùöib¥~§y‚ô™ü±·ã:ÎLÕ°f„;"'BÕÑÆ3¨ÒKyè¡wNàËï[“©–Ô!¹[wZ©”]&Ίì@`*¢ YÝl<[ió !’)éN6v~GH*+†eÆîª: *( V¶Ò‰TáT_Œ2’¼Ýß…½Úb9h–Hí"”!(ŠÔ1U&^̈À@7³þ$+2’;Nšañ9ÝŽêA† ÿ8£ Îǯ¶@›g“­'e{Uf¼•¥z]ËÿJÊd“é&qj‚މ¼X‚X”½´YE«LÁ¤tèŠ8P$¬Uñô›g·”-`bôèÏCûF©”¹žËŒò0³½¹TóZƒ¹RÑø°}ià@þN”GnjýSÐÒ¨[ÁÙ'=¦Œ¦ÝPÏç;– ÐÌIÍÏ1l=Î YèÉGO}†àÐwÁMæ?c¸kCOqVf‹KdzÇÐ#6@©\ÃÙ”ååèæ7Ê‘ÛÄnÅ ˜,Â^…@',…¶.ÏeI‡-§ É:{]Xa‚N@ÕVþªò‘ƒaœð†¦ÀWò<¹ îÕ¢ë*Û=íR¬Šo}ƒ*à4W.–äèš™@®ëc­·È(¾Øf?¶'ö¨Œ_Ìh²Í ú¯uè·–8— Y´I@þõqÍewA3¥ŽûQÇ›lbYN£G´tÁFü¶½»;{üvÊq¹'oYŠå[é»=6¥Ë¢cƒ =wþ8˜¼·Í{ßIyuìù)ùâVKJ{-ÅÇZëZtqКÆ8íE‚N¯Ø‚ÊÊAƒñl´®Ú•qyóŽœnÍhuUt/šñ¼çòð»Óåv€/ÞrËðß,=d s<Ûþ`ŸPy?­‘öÉÊÏŒQà8—Iw·´ÑsI¿¹OMùééýá­iÞM¹Lr¥¾f÷ïÈa;àÿÐ ´Ãå(>Y6`ÖÖ­ÊŒF–¨'ñY 2 RG@\‡ÿ¸Lg¯Äx“Ë mÁh widz${dWêæ¿f@åSGH§çU†C÷4dÈdTOö!Û 1 <^MØ9*µøŽ>ä:À·úÏiÅ;õLÅü<߭˯ !ç½ú%VO¾ÅãSë!¢ø÷st‡ŸÄdx>t,*?Ótðm܉Ÿf&}:ÁÏ@[ÿ=5ÏÑÿï’з÷t¢´üf å¢ÕÀá¡çsOCF¬«›ûÑ#e_žz˜ÿzKÀït‰V(¼8Ç“Jè·ÔmÅ0ÇRËÚö&%±-<§&bNƒíQÉ‹’:³šš–/O£µ mÏ/Ž“:ÔþÉYõ -]üËâ3þ2§Ž¥jc®»;QupvUÅÂÝy¤*yÐ*Ž£.ªè2ºÆ·š­’éñP4jV¯<“Dº5aÑTEõ–“M£yjJ¥‡üºÅÖRFô^Ášuævèáý0^±úT¯Î_I•@¦ì®[Wg;Áñ–… ÙFÔ*”"zF²(DÓäÖ9–4³'Ý‚•$PT Ig¾Sm1pB™EÇG IDAT!³õ„ÜüïxO¡k´üwtÞK¬#OJÝ­.yß’cÊÁƒgšRiåS¡€Xå Š£c¶sórÚÏý ÓÆoÒÕÌJ1$‚^í¤¢„uq¦Ú™EÂ',æ(7Vçªrä-‚=2‚CyÂ%b ¶ ˜u‘$š4,Ê¢¢0‡•övD<º±Tšg>’¶¢29Ù2„UZ‹ˆaqÄë<!ýÕQªç˜D¯í—t+•P‚írx¿¥Ü~< ÊÝY_ªxÞæ:ÎBuêãŽx¦±‹ÒFÑÛǃ¥Øæû£°ó…ŸÝc,–@؆å³Vñ%‡‰ÂwYÂÊ¡#Nóè$RÍQðÈ3h +¹Âp6÷<“ûS¥1*ÎUÔBŽV„GA`ÆXôéâgûåÞŽŒáHAœe³mâº5’ø™ÑžC™(‡±-#22pÞ 5š}ˆG#xîÉmª¬V×ø)¶·®å§ $éNI?Â,/‚Æ€zn›=ÌhÈМÑÒlÁg¬‚Φ£ Z¨Ñmð¶nr©ÆtΪР_’Q™¬ópgFqìlçsÿÄ•´ö_CAZ‘xE,°2)ylÝÆ¥‡À~6!Þ|¾}€} zEG:£,5‡7¢G#ç­‘}3/äà8çßrðFfwÒ,ȨOq¼í÷•ØÍ%¶ŽÌ›ÜØø±ï6l@Ñmž¶ñ)Þì8åj™Ì2|Zµè}yŠÖyÇÞiŸ¤·°¬—Ð-Þ¿ ì÷˜Éȯ{‡~}‘N0ê?ãÿI¿ðý^ˆßËöËÎLþÓ/ï%Šzž‹¿@é¹XruÁ5ÙU$ôÞÇÇc™2±q¾‰ÒÈÕeè‘Û&3„–¾+ ¹%š<ÔuùŽ 9¨…©£·QôŽ%ýgÙC ¾g J8k qqL£åû¡ŸEÓñÕ‚úu†?ßìþÏßåeñ·vÛÿ8°Ö µNÆòŒêuuµ2ïÙh·¬±i ù¡Mž×Æ[õŽ#à)A:R]¤“:©½ÝB•áîCàå©¶÷Ö,üõÃq¼—Ž÷9úÅêÎéak½½BÒcé¦se,óŒìíÖ줞–vêb0ø©Dýú/õxiÊ©Ó,x&†¤¥X *ó‹Ñ®¿ù,ji;jùü¹ÈÝhÔ/D} ©êu v0¸Å][¶­E1i>¶ŽÃìà­Qð £T:žúÜ aªµ&÷¤zˆx¤¨Ç>ã—š•tS=4YÉ‘Û +ÑÌ%ɼ (hö0Û)ÝÜ01YXÙYËgùáz^Sb*+²¥$¤S ᚨíÄ ãTÄR‰¨õ›Âhªeï¹XCö®¸|G[¶Åµ°¿¸‚Ž™¤u¼evÓžsËÒ ù²Xó”½Cª¡Q\aÈÊ·ÀÓ– …ÆŠˆù …ÁT¤–¸E "Êí¸_¯åÄçm¦o.Ž?Ê^1ADÉ–FÏ{ƒ¡¢T1>¼' Ðî‰ÿ^)7”)U¥gÔî(ÈÜœu Š¡èÔÉjGœg÷`ÑþNw˜8úã¶;ëŒï¬ 6`9û'?ÙãÇôRP!ÛdF»¤å=öÕê ®í›tPU5W­…kÓ«Õ|!En±–¯o%q3 œÃ}•Œ­Ñ2%Üd°ò”}71 œê4‰–ØUå=¥A¹Jï»,•.`fõÌùnÞWxŠ•"–;ZÔÿÎÖrÎJ*9Fý •>c^(Ýœ$¨‘©ÇÅX䃒ÛźæíŠ…@±Û+­{8ã#{Lô¢¨8 ÉTÖ§Mn°ÔbfE¹;Ëu¹'Þa ¹7±öö.IyÞË^LÀhŠüæ“;ä“ñ^íŒ}ÌÞŽ:U)²Fœò"|èYœ ΋’†³¡› ž§m‹fmŽóò¡úJ䯔ÅiýÀP˜ñÛMª·¯œè§ÆŽþ  Ò'È>‰bù,_—èò×é"ù¶Æo›Z’ó»¡oâW—ëoÃ.¿a#ù¢“£–GéúÙ¬ʲö)0£.T¡ŠÐ ‹E Ä,å-ÃÏSAgÑÌÎl#Á m¨y?\Áúž·KoÇJ8äiÀ%fÉCH¿h3Y fŒquÁoIæQÈ•½ZF¢5l·b I°Vù¨QEˆV£úŒÉ‡G°ò(„Çü@b#ëTŠ,áÖ§&|žJÿÑ!ÒÚ½ÆFM2Ý5†Øª–ºçkÈùLBþFòÏ7õçøªÅä×>1¯"Šæ^rK2ºáâÏÿüóoþ÷=øÏ¶$ɯ/>¬Woâ¥.â%úéòlÀSÑÃÏíKŸP°x¿8ÿ“¿®<˜Ú¼ä˜EV;úÓn™¸Y9þÝ9¾ƒ#ò1*»%ÛuF9p2=XÖc½@—`¯ëZ_ìy9l×4¤®€#íÇ?fWÅë›ÉÈ#²3I@2-ìîŽ`¦D½=½+©FL4¿LÓÏ'åP~§sidKx†óÊ3I|Üv+§ +™d&wCÕ'ËŠÌÄ£@ʨ¬C%ZQrš¤ÃÑE¾¤¦Ûã¯5¦K‡ÿ8êèÜ{{a… ÙÞåÓcNeFÕ|q-looü[Sk ö.ÙîxÓ|Í%ëÈÝãà¬GÈ<(ÇÐeqy¡2Ϧl¨Ztõˆëx¥#MXkÑ"Oj‡È¾4hF;*r9R~‰Mji2T\ÅÅ·š£jª\…´RéçqUë©MÍ÷j¾ß¿£äÕ'õôðÓʱ({¤U°KƒFVÜì!d÷@œ‹rÕz ’ºÎI¡Ëò¾È䱩.4Ÿ_`ˆŠëÀ% ©ï"l¦}§ô€qÓ³š€ôn¿cç ©XAÖ- qØŒÓ[Hm£R…´mk¡ù¦þ2êZGMxeB†¬aäL»“‡X9­C±i†÷tLÅeÇxÄRµêtÆåvÖ†÷U¯µÁxÖëbyØjkQ¡TÛìÖUXŵðö‡Êréç0ß\ØÝ¿ HßÄÅŒ%èËžÐm¦"¤íúM oFR†Kn“m²x–¨\v?ôþ–Ïä‰%U7µ"¿ÿˆ´ ¸ÓMÝr#Îq$à7ñ@ÁºÇ6”Cº¢l:o‚ÈsŸQ+Ÿ¡7íÿx<ÿ|lEcA°ò>/…Ølºè‚ãɦÌÔ¤Ê<šÜCí)]Ž–{­ð¾D½"êâù¨‡d—Aójë`ĵ0¦šÁŸ86ô¤-™AsótûC§6ÝMF—n“Bçy<¶¸¼Êœ€/N:ÁÏÉHβC®µ<Ìð€#Üæp¤ª(|‘÷&à.Ŧ¬k}yls»Eïˆ:àZ7vèXz±5DjQ&0 +aå¡WxÅDadLôESvt"sŠHš="ÂQªKDö¦¢®êÏÇRtÝäfT…èòz–]Ï-L5ͳ` –¨%?r¦bá@óHs¬E¥²¹ ù.y€Ñ¦‰}>‚îdž®uE‘Ñêt‘nM&K¯LîGT—Ú6‘7‡ºÖ±ÎŒžDd¦ž<>tñŽÕæÓS‰ñ­ZRÇÜÃ~<z] —¸ŸÃÓ¢$êí=Û}A´‚ƒ‚ fvÙšEpÌ‘ShUãPÝ‚~ôåA駳ǞBäc¡MÒÙ²leÃÂò©ôy¢Å NLX²‹œŠ,œÝ ˆW܃±0¨ŠÆ§)ki6ýP±Ò`”ƒÅá`…¬óBÙZÑÓB0ê?Ý¿å<&ÉvË$‘¤xŠ9*¥—= ÛÓ“!£x˜ó€<âÈ rc¸ë*}èJ²¬{*½½†¶¿Î*æ:¥{ÙÊäþié˜{E9¦ès»z—ÿóýø—õ¿ßèŸ_úKt|Z¿¤nÝôó§ülj—<Ê;SÅë=ñù­¿y½xõãžÛ~?eùmúœ²özËx¦ðŠjzWžüÏX®áë9Ü $@Έä^ŽKe©šKAÄ‹8éx²‘äïb2á“¥ V)½ÖUACÛöÞ̶ø¨ØÁJŠÙ¶mÛN´ú$é¹Cráºrª=×h-Ê„t{à«ýlªCy§ïÛ,]0)ÀˆÒcU:ÊO*¨!¾c ÷F’|@Ù v‡íÝÉÓ<‚AnP” ,®‡k“jHóØ\×Õv¿¨FæÊ,ˆ²d— *„K•±`ŽÚH¿K;¹ËÁhÔ+«pnI OÛB†Š·5Ð!òòÈYµLª’—µ‚QÛ %3ïÃA›Š-GSaBÛ”ÝÁA]ãÕù~DcG-°P2ûªŸ#è¼·¯â™dfëG»p9\Ê>²ý¤²âªhê¯UÔ £’4ŒÛÑ!'uHeªŒËã4ð°}«Ï 0|1s±¯„± $‰Ž§â®ƒË]6.¦™•Ÿ„ !|æÛ‹ßïj±($®áÎ15‡8t^(»¹„–)zŽ¿Ó:Rä˜ï¯0ÎXäÚ," ›`ˆ—+·Ç¸·¬+ÖÉ|bŽ`<%~³jœÃPÜ ­K©ÑËGçŒs2¬¡ÄçШU(nk ˜ÎæžüqáD±µãñWJŽ‘„v(û Q±G¼Ï ‰¨ºlz.à)Ã(pp¿œ{½ ,.ÞV"ÔÇ—Åê 0Vƒ¶‰D7®ha«}½6BÔÖU%b‡CëpkBÎB»HfŠWg{ÛÅu; st¦$;aÖQFÓÁ(*uÔ±;`S$á]¾+Í…"X:[âO:ŠàZ†Åu]mâ~©3ô5&GQŠXÏ‹åÒ#ÕÝ› m;»i®l¨˜3Éìo 7o‹Ä…)”úä¶TD5ºÆƒob~r[+‚CT±-‡FPGiFuÙäqgA¶ˆ Œ¦ÞãWÃKé5Œ8&ªÂ¼CÛ6… z#±J—™ªõfVÆAžƒÇzöêÌx-'«& ·llï4j„·öÐ-ÈB Û¾DñuߪÉ‹ªPè#m…ýRƒ B@}¯p£o⨪×r&[2ÈŸÐmbmª¥…‰åDD®BÙœö^ÂÆIy‘DÖ»‘/]<6!ÎÜ(Ûc•r<'D_ǵŨân—Ò¢a(Ál@`ã´¥r+p¯xJ¶bRtåV³ð$gÏ]ãí„„¦ÜoÙ…:¨Q´lñ´&Ä ªê¹‰|*5òÙÈ'¤O›MÑòÞ…HÈSB¯»=¿ŽäÁÅ&Ü’š’“K0æ¡¥8Qëw¬œ#Rûàd†šµ¢3õ"(?N(f߀",-Grk"ö[SÎç˜;NûÚç@ñhóO?wLþJà%ÒõF‰82Ãøžˆ°;7%Ë0Ïß8󽟺-¾ÂÄ~ŸœÙ)/¥¯üúÉø[½za î§ÌÓ‹&wÓÑ*ň•>tuQ‘M¬D±LD°Áe’61¡ššJêÒòe¨™((„mÁ 1>Mh„fbqÜ&µ”“®°-pË{ù¯4Ú‘ÃË£–z ¢JÛ‘ù†LˉÓ¢=M!_“Ÿç\M„3u'‚…ƒ†K9Ò;Zæ„ØzË)‘û¡ •G€-5QßîÍdARô<Ö•TõH*g€F4%ŒŸ£¨|ÿ8ÿêæÞOüdäݰ0aú—àþKtüË•ëýŸ‚W!;¿ô‘Ç« ËOåð÷Ë0m¯Z?ÿÔ~² …¯ûùÆÌð5‹7ôÞÿ3dó%ãÈ[ªœPAŽÐ€T`YÀÐgô¼B’u+.—¦™ùÌ«p¼ž|L‹j@æ±2Îåk}Øõ¿ÿþ>VýxüXºÜIhÞ'ؽ{·.] Šó9!ùسxS~h3Û AHàtéìÈÇ/ø- ÙCœ>ZyëQ›ùžÑÊ;åÙ$tf#´'#_;eG­è®x—(´)þ5%î·ÑÐHEº "ª#µ£€j&*•8(ÏêËUêjP̳¡Ë+P·õèxè¬!ƒó¬ô}ä%­—¢¤v<¢þºv²!¤)Ö{˜ Šk´fAe%ÄléÂ,VãÚñ‹×>ÈŒÛ̽£&†MÏJFJƒé²Q'zh§Ÿ¯Dvu²½n]qúˆ˜V‹ ‡ð©.QRv‰ƒA/0Î-Øâ}D>ÿЕªe$ÕzL¤Î30«PÁ›ðBIÉâUx‰1(j±¬EÌ6aü#”+©RÐ=Œ8ap‚î½4:hšÖ›@΂> …+ÆKªRR•Ž’áHm–Ô¼ êÙ~è”cÔ÷“žV,Jpša.Ť#¤¬Ù!,3³=ÃCtV­gRýHÌÛaÚˆE¢9‡”$ûÌfFÁöü©lMÈXJ¯ßdœ)Ä1b ©{ï”l ’ÔÊŸ@é,Øa ¶^º÷6£¦?%ˆ)æÄ°fÄN$]kl «ˆœt7ÝÄÑõÀ=7 vîÿ z®ˆÚ‘$Rj3º(ÓiâB˧‹^ýbs(ýhX©îJKø%2ŠŸ%ºyhF. m½¾-ÚC-µïHŸr‚ÝÒÞ1S>„£ò†•Â$™ü„²PÕîqÙùRÊñ"0Áiϳ’Uu^üÚ§Žòÿ`ÚHKÔ|Û#Õã¸r¦!Í„§bŽs?b¬"ãZÔ~C;û ÈÞ„ê  üÖí`E ?T¥6p­¥ª4s1ƒÅŽ䥖e-¬-/ç±*I²¬bٛȧ7W!º âh%=D%€xá6‘K%íY.ŽÏÁËhw‡Á£‘ÍŽyjcÆ`û<‰7²äQÏ$bGÒ‹/+Q˜aû‡­¹ôå ”|)–./A(«àÓ=)ÈfݼbÒØ½ˆ^Ë̸mˆêKÍÛñ8€¢ @5¦ña–öH¹üclÂ!ÕŒÖÑ›–ÅÓ$¾¨à9þåË`M«^üÜÝ7Âc›>6®<.›r©éµˆgËÐÙcGM'{‚Õ\È>¥¢µ+ö2ê7´¥ŸDõ:(d´&Gæ â†\›·Ž—“G¦-ìÌáâÈÔ¹ c1éÀåL{ž@¯Þ+l€º|4$çÝåJŠì‡‚EyEÇ!çJœÉ8ãŸS&Æsæ˜É Žì¸Üê89Lïg}3ÿ³Û¶ šañ¸™÷OüaÒ'¢ûdÍMõÎÓgÏ!{š;ugªÖ‘"qØõyœ¯š!…f¯¶˜ „ýËG¦N}/áš±Iuñù‚ŒgÃćyÿžÊÚŸýæ|î]˜Œ“L;ï/x'ü<Ï_‹æ½¯ ý'~ñ@…7pØß,óÿ„À9߆¥o· Á ùGΨCßas¸EHNà,êaÊJ×á¨TÎffãbcú©T„¾X 6ÖB•øî;èŠg=" MLEK:cd[àóX’h>Ì´=r5‚U%Ç,{‚¥§ GrI9V6Îż‘ä³Qd>URÙ2 Úp½ÆÖ@ÓúVÊà꣉aêú²Q:úì#î!`ÂHê"çY4ö«huù*â¿÷†ï_ªøŸøçß|eaxñ•Ÿüó—€ÿ¬3€ŸâãòNöþæŒñýÈ7ì÷§|ÀÄúo%ë7ÿ3€ï=¼¯_lÒ#PVúCþÇCïàY®rŠà4S/™‡ˆì½]h¶·mr E½âÜ"è–3‘!U ½†wªþ¿ÿýßÿñoÕe´%KUÕ“i\јٿüû?Dø±>>þõ/]«j„oŸ¿Æ@òïçãÚ f±T´§’!b.ýf¤g# ¾F0ÆCå¶3êŽÇ0])ÿé°fb½4­2õìÅwT§‘§z¼É€×ŒlºV×0eÐI„þäi"šß[VçkÑ@ÂÕ9zFíàBjÙFU;ø'±ÉK²Æn$Ÿ†°t¸$ 1A3àB^¸€qhP‚…rë½b$Òkæ!xY EeEfðT¬³eñ¤bT'Õ ÛøÿýŸÿ©UùyyZÅÔ »Mî*É·ÿ&ÛêXI}Y +ÊŒI!A¶.C í¥n²×`Uã·å­ÄÌ:î|eEÉ«ò2ð¯Ò=²«8Ûrƒ¨h‘'MÊó0 &TEØqDey:c L<GÆ©bΣYѡ䇸 èçxuNâ1W ÄTŽÜ¼Ùý1¥Çì°õÊüCÅèÒ'ÅÑ'+%{L:HDPá®´†+ä¾±”TdudpVô¦?)ñkW 3±à±••;*‡ö¢j°³®ÙsÆDÕÏÒÍ•MŒ„mÿ@gÓ²z´Ï¿‚&±M¢¢eä•‘{&]%N!kÔx:Égü*£–¶ÓS~è¯ÍU@û.9/ÏmþüJ« Ö–m»=»¨s-d—^¸~<÷ Ð+‰áh²CkæìEŨo±ÚòØx‚Œ†ºtÅOÛ°FU]05m{H¼c‹)øÿL|š°{`¥-Í7?çtžxt(ÖR'~ÆGÓëĽÃ`¬¬Æ¢TA“°—úI¬z!v `{0¨ìþOÏ”¤Æeœ"¶YªÌÛÇÞ)†u°|I¹­^bVHVÑÞL  s©BÕK³µ31²DõIÍÓ,Œöûv¬"qCS¼(ÉÕS±Ç¨â1ãÓÜ^¶‘äZ+¬ñ£K`¯¼Nr]ÚAê4 ùm¦òˈXšý §±dêô6>k{À®™5ÆN'· µêîR€b˜“/Ê¡3ýÌ)Q~è2U5“.RÎäÜ Þ!à/c71 ÆÍÄ…™=.±aÂYäGÃàµûàá0^/7¯á~?x>Nuó6.àa&"{%Ç/#Ë©ŽÚƒL1’z]ª.4¨óÊM‡Í‚”—â£JÄÂljÉS(‰L¬¸V²¡ šÌxÆj™W©Ö9;â Ù=¨ ‚RÞxïÅÍ)ÿ07êZë¾ïƒM–b‡¨£¾¦:¥Rõº•ZÕ¢ÑËoµ¾ÉŒŽÀ|MÃ+—\øá]EäÛÏë2LL.8 {Ü‹”Ð'Žs”îèÿcbO}ÃìŠË5»øÂº„SX6¾Y·’á×wm¾Ô^/gXç Îà¦:†ò3$ö+ÑýùÀɱ’œp?¿X¼ûË“ƒçÏ£²Où/Àð2ä|*xýu˜>—·cêþÊÛøƒòÏs·[ÿ¯ÿ•e¿¯ù›ûå×@OcHàÑö^Ò¨LÑîMñ…G¸ßB-g-Ã?ï³a­<}p´ûR¶‰®XBÌ|ÅÊR¾¨"¶szÑÎL‹ÀPª'ŸCÖÕÀ‡?&fÔU˜l02ß?=Ú~~Ù"8jj|D¥<Üà`ØËV€$™PÄ# IDAT„xSŸ—®¶;ãÖq{™Á›aŠpFþº¸8³àׯ‹“Àèpáñ–‚gɈ  쵄Ï`ëK):¾q£~Ùÿ\Ú?‘ýOpü¿™V|©«æ&3ñ‹ý?kTº;êê~ 4ûx!ï¨Æ3 ù³E nàûìVü“f…_Hx`n®7#mŒÁf|ìýãÇ]ëº.¼hÔ˜Fž‰/†>>>Ì<šÿáylyÈùÛ‚J•îÒ(ÜÖºŒÊ?þøñÉëZŠœX¦ìÿûx<þøãßK×u]©Ö3©è3õ#-= …E]<Ö5 –•~Yÿ‹çû³Fî8kˆKØëÝ2e‘®ÁÒ–æ´¬Q³Y‹«VÔÿÒaGoý5ŽcPšUªY,¦×ÛX¸"BTe[›Àb;yE–2; îRIåFDRsaË‘íõ¿é¦cx¿‚{ù-À6Çhä=µH·“yl )Ä>Žöþñµ‘û&ñ.デ 냺ή!ʾñɹ몑¤¿Í<~ÁJÉ ,Áš1êçTq]}C‚#oÍ-¿S\M©ãΨwÑ:6efu”Ȉ¿¤gÚ âeiðÝìˆF†åõž©Ä¢ÉZ@>2nrMo¶CüÝÀpÆ>qz/Whl'!*²#Î08K7§¥Â·ÇËvM6ÏΞNOç¯L’ñük×…€ô 'µ3§Í2 ÂÝ“ÒïÈó=D«¡ÁUà nSþüQ™›Mq¾ž1&‹±ÕaŸR/¯¸Yf”/ªæj› WI£6\›…‰°ú®ò,Ó„ ˜.¹m#À¶M¯Õe³Oê‘×ÜÛ9~Bó.Åü™?¯ˆ4©Ä¢˜²ˆÁ´³›ï?ÎÀ¬¦ BÍ–8þ’ÅÃH,h˜EIc‰xéLÒP¯øz,vÈÃG±§-õû"¢W8‘Y7ÃVµXÖÀ¤E>Ô›j´nF—\'±%A±·xDŠs˜ÌRsÞSz“íØ´¼©fT¥$¦õÆ#Ñ%‘ªB™ÄÀUª²¢º$ˆL]ººÛ¥0qäkÉ-À"žª«¶Í‰½ß¨‚:S’˜Ÿèè‡lT®îú±hwÒú¬Êôÿy©æ§ªì®Îø¡ÛÌcú5Ñ6@×záɵÀ»h—Úc{ü<‡RQžë~ï3ü*Ágú3Ïkž¦×‰¢"– ¹Ø‚r]K¡æÙ‰ÈcF–+ ~+©„ýØFÊå`¦j…2ÇZ¾Â¯0“yÁw' 5Ç‘PZ.ôœ³Ã*¡rž Lˆ¶Œˆ$ûPø¬Vvç­cù1Ó¦i®o³ðÀ+d³jêS›¯è¹™Ð6õB°GÛ¥Âmû`¹³„ ޝh¶wNw¥Í›p ÊÛŒì{>Õ˜¿k¯ÜO¦™…^’‘^n‰É¾šæ=L¨b›QöMX5œUŽ–˜}ñ:Ì$v?3Gv\Î@dW5,Ò½EÚéX æñö(€Y(02N§£ á:ó $lï^sЪïˆIÈŸ¨ª|®š-Uò9Š¥®ïÚŒ4Ò~x–w 6¨(·³8€•­€ÉH¨ÀôÌ~H¯qUãØ¡Qj,Ç(+.$?®›ÜY‹¹Ü×Ó§îC¿¡=˜¨RÎKC”6dO™¯.ë,,’ZVB:Üš]Éí0»Â4! Ðk-.òÁ‡ I ׇ®…Âu „RÿìU|EK”ô•~Ôh̓%KÞD¾Ù»NŸÒ …‰9;#GÄ:;‰OEvBÑ µ Œ‡ç?Z´_êÕ@#MYÉ„‘ɦƒ’TDOôNW 0GP(òý³e%?С./]·œ[¶/ÁŒž3_ÑBõ¨®YxPi4/,åé4–,°©ƒ§ÿr(x,Ra–65ÿì®G¦0%Y§)¶•OrT£,•ŒšñÇ$joEK€(kÑ Aæ67ÈX«`óØÎW‚Žœ ç7kªtÚm‘aŠŽrí>SQE|`¢"|<¶y]Zw±ß=Š’iŠ©˜»›Tà6÷ ë‹„f„R6pé 7|9Õ]Y¡q¼ºYÆ­§ÜÛoûåQ29õà²ã‘¡'ôc(äý¡4âh¸ÖB^}<µÙnºƒ‘„Tž ÿæ—®‡_S›T«‚¼hêÙ—ãñu‰¦gåŽÃæó×ÿ»à=Ш[Èßî}­k}(>Ô´PÉ='³ ôÛÍîk† §¬ÆgNËèwÐ}O±ŸÎmoQi]½@¨?“ÇP%y]¹ÆñàâÇÞbHœ©b‡ÝÝl7}z£ñÒëS5$ÚcÁvxá”/@Ë 6¬x¿¸,LgC£ŽèH¯XÍÒì½63b¥ñ’†.Ÿs8Ü#-^\š–¤ nOÎMryèôºã)Ž2\žg©øû¾Nþô­q0jì Yd§nïøU5 —Õ{n¢ìR]ÁÕ6ew¢¸:̧ÝØDµ²<óPÙ&PñHaÛЫdþ½ö´dÅÓùï©FîY¦= ˜kã÷\£¥‰q]+ ¡1A¥ÐqÝ6 ®Ž vÉ‹ÿÜf c+õ¸™€JÏ r¢b§}S+ͤÆÞ†§õŸá_—êì¥Ê¨U©Þ1x4RСL—“ÑÐnƒï ¿°=W·ß²û¿ƒ§ÿ×ýš(ÿ4~Oÿg©Á/òõùÊUö½ƒ[Ÿ ß3©oè‰çÛê%ñú­ðåsKú[™€+ÿQÚ¶SOW6ù.* iúZ.è›søÌÇõ3ñZê@µ‹þ–.mu{»šî Ÿg6C«X~b†—\W²¼{ðÇ@/U•ëãRú°Y¾z¨¿ÑµWê§Aÿ¶·‡xîÇ•ÌK;á/ÙÌEëÜQmFw Ä—F[ÃQŽC2âgÐoPÉÆÙ³“ÃÀ~ ÈAäŒw Î<Â;BD å°–fníà±¶±Œ²~^Š6­[‰ñ´š7¤S;‘ýš6 ø ­eÐÆ´çGÈOÍuPUÙ¡÷ òPí á “¦ ºaêÂt º%û|¼Ï^ÉU‰µTfVÓ¨yX\ŠìP§ìíÊÈHGF EˆÑÍÝG3Iœ7W—wÌ·3‰a]¾”ˆ%¢5·rs%¹Ô$AD€x±¤P:Nd†åÀ:]¿ˆhN³©â®Ýphe†²_t£/>±¸´Þj.• ‡Ùû¨íIî\:>ŒÕeÝkÔDSØ5¤ƒ6Z:ñ2¤ˆ8˜Nõó ú"³ëA¨²Ü}X²[2÷ #5ÙnJön@õ[b\GPeiwVoÖ»Tö‘¯-nðiGÏ(ê.¼b̽P…Þ †ÚîQ`æ°—è°/[ ÑažduH×;eÂm±êO»ÙM%†Ú*pœ%ÙŽÎw×ô+)ý‹Ç\Ð-ˆK÷ƒ®liÖq*©=JÍÓãíQáŽÅ":þ}~ô%ŽàsƒýŠºº©D—JZjuZ¡¹÷^k1ªŸ®¥ OÁª)s5ä£+±ÄÝrÛ6ª:vœxÓ-5[Ï¡*¶™Ôc$ŠÅÚ^lTaïdÉPØž*f _ñ¶ ´×x§lòa²ÆÛ÷?lâêJ^+BT¾È6ƒÂݽV•‘É<­8bu„W€¼‡=$kQ‡eÈ¢Ÿãï Iãû™ÉÏ4®!ÈM,¢Õ1d¤”ÊГèáz=RìÄÖ)>øZX€ŸÈâ nIR³ÖÎkØ@usiŠôÇ6϶S¸Àä£ü8­%Ç!ÅñxŽäÎ0õÏMB¹³{¥Žõ;!™yvsb¤S½À×8æ |Â£ÕØoxÐd¿0èåÁPN ÿ™¡K)Oå×y™0œšW: ¾F08«¼$¤“åmñëäy¯›~”s¼Ì€z 8§‘£iåSûf†þiùÿ«×B| ¬àwàøw™þ8fïÞéÿ¤ñ6ßãùª8»w¿]ÚÏwØ~C¿ú¿úÛá+­Ÿÿö>ƱÓFÂiœ\#Ý…ö³LäO>¶"a‚ñ Ÿ.‚_ð±0š"·Ä%°È-\)ܱC{>Yz¸,Er03ˆŠîlߵĔÜã`^\±½£Z¾ÄI«om‘›[ʧ¬g¼Mïó D:\ˆA˜„»[ ‚ÌÁºmMt[®»á0” } ýñ×úƤ2z­AÊø¸U ’Àmã ÷Þ§”ØÏCÿï¤ñ'ÿeèК WE¯ä÷êõ|YOÿië.^¸ž“¯úî³kèþŠða‰o¯tñò}ýÝ;ÐU¦N€ðjJt>`­Uù¹Ç™†Gu åu}|\¯NÉÔS\ëŠäè蓽•û!µ–•™™´¿ÝëÅlWr °B-E›æ~ü¡Nèz„æ<ªZ‚-% I™¨*ÓëFÕþmŠ€c@Ø© 3L#6¦i…„™WÒM\Ô“¿„A›©O¯“\`LÕ%Tó"i‡th³ºlV¾+¾±Ù¹Bù¾ã0ª"]“¦PÇ\Žõ"ãªMÑSU“sȸW›Ög©ŒZi¼ÒÁèñï;£ÒËŸw‘¡¯Ú0n»XZ3Ý5ê=Ôžþn¿þÀxd±òòÁtŒcT×l9C ]Ò²wreµ¸Í1zg ½[åÍdWPŸúþÞ]’íD†¢©4Ùy<Ìk¹.§C… BÉÉÈ1JXDõý·»LŽðA?ñJOP*rãăªM£ÈŽx`æ\±Ä¾ÕëXÇŒXV‰¬Q¢k¶1¢“2*2Ã"û/TW«5ŽU;ç™Zžt¬-<¯µÅ_¦fôŒ VÕ9Ì1õpf’G±‚“‡86Þ¹©â8 ñÚmÊ\ptùá2öÌmþæ´|PÒâw¡˜3¬ÜÖPþÞv¤zfBCfà™ÕuFÆ%±ÎTé÷™=’·ÔöP~ñPæ‘%AÈHµàtËrD Æ—óa[º›’ëCÈJ²¥q¿¯SfÇîàO \Ÿ.¬;è%ÁvÆHI_î¹¾±Öv*PÔ¼‚‡Ñ’©7ª:éêÐä„­àæ§éïÌ|KÜÖLF.: 4¤Åš,ºŒÀßù9xÜŠÈö¯V( «™'–Çá C¡i¤ø¸·¨Cp@EïgºBÍCMü»‹©«k©†g&Å9LX}8âÛ-›Ïªþ4÷eNóFVI.Ÿ¯L°Pºï.œôB‡—)òÊ`4¤]¼6d¶^ g¼¤mHoVP+ 1Úˆë( !µÃN,X®¸¥üÉaŒe;Õîž…¾úÃh¶u¥Q/ÚµÖôA/:ØGíšZ9Ç2¬r³2?·(†¤¯I±È ¿…¢ûK½$xŸnÈPo›-OþiáÏ3­˜¥ÈAÒ³ÕGFJ Å]­F˜z>Rtb+6cóçk‰¦¸Rƒb[,Š^+[†ÊÖØçÏ( JŸ™¥+*žDȃ¶FãoŸëxŸ_ é´Ò:Ú‹Rn ¨€ͺ„G$Üû¤€ê¾mEáŒ@9åŽÏBm›æÀÊe™^F?g. =Hv©ùÙ‡I´=¯5‡Ù Ìf£@òKù”E3crO>5xÁCG£3BÊ%5+ŠyÈd¶Nºp,:8z%÷K³Ác–mGÐMVà~ÞÝM/GZÍ®oI™4ä;•çfv>#f.s`aàA¹HùS¹lï=>‰îÑÕ#ïœø´*à[›Õç¶€ øJ<•mz,¸ø]—*×µV[mÇ’À×l¶–þÏ¿þgï½mûés­µt9åÏëõщ;k-¡üxü ¹t}\×ÒõTóU¥jd•5_8-b”gˆ†ãºÍ qˆ7»æˆ0«47Zú:ïQU»®™IœZàŽ § c6ð‘o“èèöTçàþàüœœ¢3Z4ÑVOVÚÛC{U—#‰%“Í”¼]-^Ó†{4‡V]Kh”™¨+ÔQR¼;Š…‰º;»Tõ©z®¼Ý¬Ì/êï I0U}€e×bΑ!¨_P,F}Üi8FtLG•­sçöÙZC1`‰xsPщ ”Àœ¶Æm¶².q<®‚ Ž Ub”‚‚ÄrÞžCA4*"®N6"Rö˜‚»j1.¬9h$iLlÑN«mˇdk]¨w¹Ý<¢Òá‡sºVn×½•‚8؇ô(x]Ã\Ùæ ÿÊÏÈ?í¶Ö…˜ØJÑ@0P†:PÝ`„Ý^.‘-Ç÷ë&¡0ODÌ£Ô’Píz嬸$@¶E`«æL×^,ßY7~LÉ ;€Cce°OôYG8`ñÐ@OMG•#'Íþ›F˜éb³UÞfÕ•\\åö˜q‰<ÌÌxSRdï](z¬}*Å%fVdX>gAa-F®ú‹†”£ìi&Ƚ<½Ë§zÞËqð¬røy¸E ÝWÅy»Ë%BÁÞ;:1ÜüÅ ¥Vô1Àµ/te`»ôü€*8ÑÖ!v s‰/oA%žÚÌqäH§V É¾Œ×ç¾c¨ÉŠ ÆWÆþ»-Ð䬠àè>í×%OÿŒË‘)S¡ÛïBÕgÙX·Å‰.Êÿõ}Ó¦U¯*mžÊBË7ãUeŒV u»ýÚË ñT–Z·ÃbFqg´i<åRèÿ/RÞÕ>¤Kÿ&rQéLN„²þ©âD(ÔÔÄ *ÛÒÔÒfÔÒ­0B¢ÝÎå×HÆÍ–ÿ"ó¾ªóF€q†ªóÔˆçšæ GÚYƒÄÈÞêRû|Ò9áT¼Å|{‰xMöG¬Ý­ Ša¬Ôk£/"ø4Äwx:,±ïYvš›Š˜çS?v ã5ÊÛt÷`ÝU,yŒÉŽœâS½_”oAHåÁ§¤&°ÁµÒÊ~1Æ'"ù+¡Ù×Ôȧ?ãÞÿ5ïf”¾¼ôã óÆŸº¿F«~SCÀ'oîwÎy¹¾p&޼…”M¹Õ],pýN¦ °z ŽeiF,aë"&~3qp$vÑhîBŒYΑº"½è¡„]ëAØÂ$åž¾9. ADö#ê|³o§ëÜ}©%eÇaH&ÌUµ¼¶% ¡X(áîyOc &¡G+×ÿ¶lM©´šò’Q‚aàóžCm£¾QŽ˜ˬ艤¥?Î tV7ÌŒ¢ÒnPŠ)@Æ1Ñ;?ÿÐÎØ¥èÿyÎÏŸýßUäÙŸ( ~þÏgD^Þ¸Þý«ŸBíoìÈ|›¿xÑàƒˆg>âWò=Øý©<àóî€?οëhy>àü™Œ¡?IÌ0\©ÐÕ¦áø;Ýšíé–Çc?œ‹Èµ.ùñx¹ÖZ×Uûƒ[²é ræ•$¼.?cSøøñØ{Cp­µ¼ÐÉ:}špu|&DD—úË`5ôŽáªã &`œ3Mh²á7/QGäÿ¦×¸EA}ŽmÔ1÷”†ûé&€Eô„l#„f[eueãÙ™%ƒ!iH°f8k“õöv”@S]f´=*tô|¢@!”™Ìëh4ÄÓf\ŠA“ظñ£ŠÕ(h'®„ÞŒ(ŠÔØ¢!ñÁp'·Hô´jisÁ@…óÊuQý›ç5n'Çwà|˜Ò${WÑØåã±E~o­Áù›LÏöû.+æ°4êä"! Rl¤µthŒ'eeÄÄ`ÈdÖ›JH¥ÓGˆƒo°A4Ù𓈮¸2l¨{ô-Á ˜¯P 'C7.T¢ˆKü³éuŸ’)Ž|勜uŸwµ'"—QÅ8N¡–ð^®1—`¨øQ®C~;'©Âôm´ê¯l™™Ad"«ÈDB`PͦZ&S({Òn5ŒÕba´«Ö)¨"k,@Õ¶i¶÷öõÄÇÇ”,0çáZìb+òAÛîo(Áé¼Ã=Ùáu.•a²©Q˜"´ª¥~ñ7®#vÆOkÖú˜¨>´ÛÆ1ÑRD«TýYôJ^‹6 @V`S-:iȼ*³¯%ÎeÑ-!’“Œ•vs+g’ÃM§Fï~ˆ£¥òÃbúµ¦2¿¢‰‘Ïc¶h€Ì8£2ÒåÒÕÀŒÎ8ï€#/?{ìK «š“ö Gtfzê‘”èÐläè$GÓÀ/ê}ór'uÒ?C&?NyY $ñ×Ûn G¨Ž =rû’Ge…•e–kÔ ¨3Y¨P×µFÎïjÕ¼žž„¶]{+rwiVµy®Ühììä“<›éˆ@æêÁëä-Ã’Wª³ZB1ØÆýö)#WôÅGU…, Ξ²·ÜR/ IDATÅ´êéºÓsY–¸ä¬5ÇÔ³u âÔÑ…éag:6YÀºÔ?Ú§oyÚ‰=;]À²=åci"Â÷bÚ›f³sNÄ;™U±÷\‰ü+²Ø`Åb .GeÛ×5®…—ް—ˆÇÝÞ¹ñÒLöbAÿý”/W³r$m¸-9éÒ”Wdi,¼‹Â] &ª+#Í4\@*îøþ°í®810aýÀãªuDFÜY¦/”öÏà†¸Hºò|´×BmZ=cÛ³¿ÝÊÆýkCÕ’ÅÌâ¤t)ˆè2ÀË @ŸTŽxÉ.¬:E¬Ùû’k¯vˆh0Þ=#$ÃQÇ’nŒ©î›xÏ¿Š ³sš&TÓ±ŠYôë¬*å³NžÝñ:}…O ¸}Ú_*þ3…E•À‘á\§}nðv¯õS`Üî8U]›½á ôûÔo4V2¯´‰ž­n\à ¡z·UâXíK’uÿ©S>ôÿ}q¡y/#8­7@Ÿ£‹^|åŸÁ pæsÿ Ùûgˆø¯Ç¿_DýeVÅïùŠoŸÏ ü ßä&•:Và’R‹CuR &XIÒ±WæÑ{‘×Ñì¢gIÖÈ-º¼¨¡Þ ÈcpÖðw/w‰›ˆzŽD,fÐ%áKÔ¯!f²–ó="Fõ‹=…) ëÀSWÊÔøV³„ìß–\& |Çûýª9ìZþr—1;Ìá(³¬MêPI´TN"ÞV²`.ÛQõmF\FÊ)*`o ªàäjãjàÀ…³$yŒöŸk®¿!lÿ‹êø—ýÀŸÿˆÏè÷ÿöÝW¾c&ñÐí§öß~ÊtüÕ¥ã%ÉûúÂû§=ß*_5ÇãÇÃö0–þˆŠ`‘µ–Cüf¶ÛvûôÌã1>KÖ23ÛÈŸ]ªú±Öò¬Š½·‡ï‚P-š$]Òå)œ¡‡Ç³Ê1Tµ³jVºæÊâŠN]¢çH ¼ªjU¼åè¸ùlövÖë ‰–>®voõ¥g†T˜LŽ_5CªÆy®*)IPV_pÕÜ.]1Á¶N.‹\jbëèPúh·h8F Q7 à²è› ¬ÅÆôÐáRçM™Œäîš(SGÂæåúZ–k¦…­¿iÇà@WÖnîà>8¼¸ŒÉRBl^HƒEù-(½éÙÌla޾ZMØPŸ„[ÑvùC †‚Cþš»U]mUÏòž‰êeÍÃÀÅj:MÙfë¼´ §üˆ"ø'@ˆlÀdA1H»ˆÂI›ÐfÎÀi”#FI¥{ L–:ÏšÖ*H© ¹Z)ž#R_£Åà.BPfÁFÏ“!à°¦ì(wR kUÃ7áRwï’mDÓ™ïÈD°Å\KgÅ”²c‚ŠUQ^Ð|™¡ƒÈ6ÓËÐß!öÎÓgöëÓ° Lýtc•mh™‹)4{ü±ÿýx@ø/ûøŸÿA빈@3)âÎ>¬ú9ðA_‹®v­]‚*#½`”P–Õ‰}y:¦ÐR)›Wš½¼ï·-µñ†?*Ä·-§î4ùMÎÊ÷ܸâse‰P¸Cdå:ÄŽ¢ÕÙŒmæÁî%R̨™ hÊ@3‘Ç8å`*}⨮Fû—‘=Èú†§ã%µ@;ÓÂÌüBÆ)¯Óª;3£‹,ÂLg 3†OA ˜¶TcM]dŒ“}w·¦v bÁLðvÖ­N•k‘má*s_Œ|Ô|D“àßÒnRLÔË_1FÀê:SÜgßdBÖ‹&!û äœÈ{nu¯„ÍõFDÖu™Ñl—–Ý"ҢMœž·-äµ.DÊÃQh¦N°Áàž…á?ÓÉ ˆûÈ3I›Eçßh¹ãxåiIA¤¡+—)@ºHó(›ÿŸº7Év$I’™X`U÷?b ½è×n¦Zð( ÅÌ,"<½*3}°ÿ(TE„i41Vçá»ͼ¥¾ºépü0”À?Z_f²+¬`o+)^-ñ^¿ä[z|Ú-7ƒF&Øø¦R6~ âkàÇÇùÚpÆ+×dQת ˜æ ½‡€ ’´ˆH#{]H8:2~üÑég¥U?@È"åHî]î(ï° .GGr#<€¿`úp£é­!Œã 2xn[+‚ñâ/bbŽÒ¦¢ŽIpÁJÙûu5ÍK„ Ш‘ž¯›@i´ hë#4˜Xé“a(ðo£¦:¡v–ÖÍÏZà’”Uˆ·«àE`›ý1µMêÈòkò¥9ÀÒ™çÉ,Ž È¶®X×Gq.p…³Y-@ì¹óGù*‘†jøŒô³ N ÌäÏ Š$ë»<,ƒ•UéÅíwK»Š”Ý!™JºJ9â~ó|æñ}œ'fK ¿:íg™Æ±w¼‡5îqöî/yÒ‰ÜÎξ¶ìzî‚G„}‰E ߸/nS“O¾D†&æ4‘üœøØàÅ¿ÿ|ñ?½‹nþ^ зÔöÿM)½¼xp>V¥þw?ß¼“‘mó¥[¥b«?,»Ë õ8Òõ>:²»×\6î+Qø´„0pÕ[!ÄÃÇÎä}DÍ̧(_BiÛ‹Ç(ÛÁ ?Õa›¬E£` –›í`‘KìÖxÚ!âí›Ø±º"°p?ÆG¯¯ óV‡ùÔg'eiš®u ,¶<ÝuM!lGøEï± àš£ÿ"Z-2þ¶º(8ŽÚ©'$$ìü¾ÙZn‰}MŠÀó‚Út Û¼Ršù¹h»?šm¨²ž>¼•>VÄÿ¦Æÿ•týã9B¿ÿn_óËeù#þW¯7ð%¸ŸwQ|WvãÃOs[-óyñ±€]ÂüùusäÆÖÆ» ëÿ н¬ ìÉ¡ªº–í½iûù”Çcí­©dTÕjºuWÄ·{¬$Ó µyî§ü-kyÚš¿wÌik-8 @Î>!ÃñÐÕJsÒ"×¶¢su©{rG̸d)î*íÒž3tÖ‘SÙ¡KGc§wšóRªáT¯·Kx&æÃó3NYrt‡Ê‚ÈzèZ+Uç1Ž•Š1Mù{iY+^Û ÆTRüƒ(oÀ¢È˜áŒ ©‹ËÏ:ƒ“°† ¹G²¨eãÐ>VIA(æÐ.Œú«ò»3¶,Ü:?ÂÀ•;[4ä¤"k}ðu<<æ:¿&¢‘¤¯¹+jSOÒ/ìl@“™€dqɸ߶ÈÕD×u~ 5Ãû‰PrXŸ÷¢·@²À¡²ñüÐá'’-G‹Ë\—k ÌD–(ý(Õ:.z”_ÖíU׬˙Í$¸&¬çú%—c·Ûëø•V„/sÿÖì )ßǹ*"K™®æª‘@ŸIJõÀ 7») Š)E…›Ô™Nc¢Gi}a~ËŠ±Ï"{ËC3U€àÑUåÂUz¬c¦vëEÃeGÌœqÃñâvˆ9ó‡ÄbŸÛþ~îKV]K[-ê'ż +SØ‘ºÉûܼózT–g|£G+º2Ø×!…ìˆ×Ô ¿ç°µ±Ú¾°‡%!©fÌúZ;ÏÜÐöˆtó%½’¯–"o›‘”Ö1­e_zíF>ÅHM}U{²P™­LEéßêÒ ¬Â!!¯¤ä@ZTazH5¼F³C®ã²Ws¸´_j¿´Jl ;‚ÏÉo$h×qàaV!6Y(‚HC$R)Î"E¹dÇô;í:ÃfF,ô²lãÄ–¢Ÿìÿ€®…vxŒ¢ax![KW*]«`¸Œ½æz‹é°Rù²CX¦ÚÈÕ`H)Ùë9¬›Ð†ê€?éçp…8e›VV ¹T—ƒi±+å·¹C÷*ªbDÆý \ožÏCå×):Œ« Îíi5mÎbìªÆ°î’B2×ÒíŠàx ¨f×xÎ÷,kù1Îrõ4ÊGX?Ãqž•Åq<³¬x(6ŸÛ.Sœ*b[÷“Žú²j5·#>Rñ€ ÄT£rã|Åèî9óÅH™ÓGFw5N™Î͇ÒOô§|ÓVÄœMó:yàŠl‘½-C$Å·~¨Š‚f[ÌÌ6‰ôŠÈ, 9oƒ1ÆhtcA¤úá*M®V?΂„[9T¥“m꺖ë”î €·µ–5¶ÄÌ\Y30ž;ÿ*—.Vî\¤öu¼P{UÏz•lWŠê˜ºm%×m'mܨUMS'±YQ.©Û8‚Ý4Ú!?RbËaÙÅ~mÉpÏög¡‡#îIÈk´ØDÛ„LJÝ–Ä8sÑ Kßb~­t5¥ ø°ÉËúp"HßK~¹­„,­Û÷2ï‹[^A¾«ÍŸ³‰Oò‚þ_¸‘ãëýHý¿’Ž|UrbµßHðø§ÿÅ7ÖWožÿ*ð5º©Ÿ4ŽˆæSûÏ\*!•d(PiÄ|”ñHïM¿žDd*z²ª#F+’Ôƒ!ÿ×-,×±‰@,Èõ#bÖ·v g<…ËYV0öYîÃr²Fˆå=ÈZo0¿^£Ãžܽy/-à7²n¾³ßEüßà| Éÿg.&ÄèÜZ~ÿU~ñ·]ês¿D~ÔÀÛ=ð'àû¥íö.= í×7óo#:¬&"z¢L£‚•%Ú ŸÏç"¦ËÌt­P3­¥[—­I@‡™9P…P{ïHªv§ÀZ¤lÛÏgÉüé¼ ZÀ¹Ž1?WïÊêŒ@ÚLÜÈêó>Ž÷@åu) „fµ–™VYjÌ èr Vg|ƒÞÇRÿý6Ǹü?VÓ]N(9Ä*–&@(r Ù HˆR]çÈ‘Ö÷u76²'iSª£uZ⥮WG¨¯{†ì…¬C‚®KÖxô0¯Ï™°¬8W¦éNQè¹ã¸oÛŒª®Þ÷NÇþÍ•û×i¤ïyTzUÇ¥º¬¶ÃR` =„‡¢î½[dµ"Ör¼­ÌŽb™Ù~ñ ë¡5YÏþ‰**¦fŠdEÊO1 î#ÛBË"ßB½Æ=ê!’ªavT:¾¤Ùõ<¼/C¥w¤ ω ßÙ7Ò}µ)Äcbc0x’lÉjC”ï R=Ö‡̲ÈdG@Ó‘:rªðz-FÅ™0t¿Ùç «Å#¬«w4ÿe‹¬œÜf½1ÄyÙ£åZ4I£˜W’HhuEÄŒ^æÿ≮^’´õœ ¶nÅÿ#dœ#p¶ŸÖ¼c]»÷ܛϧPöò 5ïΠ̴ÛkQ*6©´ø) ©v· h¡dÈ“»ël‰fMäCãì´säghM0uϨbe¡0] uÂaÃKR²ôÀû!tÎá9dñµu†¶fÑ6æƒq@†~{Ýx&ŵ°„Šœ_œ§§§v9–¥B|dì2yGè‹_Ûet¥‘úRÇ—¼7¼—ÛßéÍÆµøfsÌq†(hitøZ›èrü¿XÇlQ$À´ÃèÿµfÛ™»mE÷Yö¨W }ƹ:”Hß½°’àÐ$âVpa8òÛAÝŠW¼¸“®Ã{œÂ©0DríÁÕM¥öºéƒQ×,PµÈ»õD—î¿zOÈRl3ÅZ+cK žŒ7Ô% ÎÕ˜)X¤Öqúò´íßÝãñŒÑ´q™Y4oJESG¨ žÝ[ ÂmÔ%Œr/Ĥ¨¸BÎsBUBxU—/`'Øv•V£?%ïÃ¥XPÁ2ØÌbÿÎ Ø,oàƒ×ÍÙo´O8~²€,Q*´}mÑåðið;Üña‹B¿¯L=ˆ|6DŽ< ã%ïÍ( FSêýóJ–K“žLK±bƒ“YЭæÊÿ€ª-rõÃ6rÖ³©Žâ»["ØÑ7æµô±¾;=KéMà´ØÏ^½(n‘¹Ä͘™Ç2«Îú®gÉBÃè¢'bË17çöRÙœ|Àø" ²Öò­cŸ/“G³Ôaº“¥Ð??y)î.ã)åÂ$·º‡÷€³aQÛ;Ž+<ÈéC·®À–3ŽK"Õ*À+áH¤eÆ D—VYËU±v@íSžQL¯'¶Íõ1žQ)×þƒVÐ/ÒáüçC†I“¿œ1¯MéòæOò ¤É DW™ÝÉo1Ù7†x~ó’2-waFÐ4–\ õYVŒaܼáTµw(óç°{Âò‰¦¼önä˜&òüæ—çÿÜ¿ð‚‹ýóß4îè§1[}ž$—ZLsöÐhd'-ê°iµ„”ÈcVw—xI+–&&¢š5Œ®ó‡Æ 3 6eY¨,§Î¨êX ¶!ª:Ë.ž?Û" .iñM¾þÞâÕ›We ‘jo2 \´”9?ÁÅOªÂ׈`Q¶ÊÊó˜¥'W; CÙºÓ_"’ 4èù6¤Ñ¦„@a4‹ÒYê§tËkoãk·ª¶:n›,';­¼³t Tþ¯ñ¯øþänpþ0ivPõó?°^ý%üßñ_‘_)àðv͸´8¿yï|Ã29?êò^ðF»°wË!Ìø?dxøÈ½ç%”ÕÌŠ63š=ŸÏ½÷Þû±–ÑÌ̤HT;•ÈQS]kµH[—ª>÷Ó¶"òçß?³Ô±FÜq¨†*X Â…¹9!08ó¶Ûúq˜moÇjž@ÿ‡öMJjéEǨ“).§F̰g2‹Ê÷‘':®½b¦¡k +ÛªS.™dƒ) PäoaÐÑâW×®-Ê0L¾Hì”ò,n ø¤3|yù)[¥–xxÔx†d}ä››Xî¿y.ΘÓWÕ!¢>e,,mèÐ!‘Áé"è,Ñ£×lʈŠ/÷]Ý㤵$’P$œ#™Æ¦j,"Ž´Ù Ý@¹…ƒ‡Qçb7Òi$0£ãÞ.+RÞ…³ý*+!º¾ÁÈs2èly3Z$6 d­r¢8‘ƒ*ÔÁ,¾ÅCl´3|£»ÏD·Eº Vº>$’j¨Ê°zkÏ4ïÎÝ~ªª¤µ&¬%Ìèõx`=§*x¿@jäFeDs¦qe&;+šºZÓ*Qt˜/óë ™mÅ'šmѵ"o©Ö¼x¶­j2É=n¾ÆûS#œé+7‰w#‚g*C‹¨R§àM»™ƒbžþ_¿NQµJâ™7Ä‘^ssB¼^]®Ò@+²ÅD¼‘8<\iT‘ ‚ï-ÚÊÝ;é»4È•evôó1JÉÙ_]e“úÉ’Í3OéÎWgk„j"º)ÛŒÌèžY=D/D¾n\ °|(b)²ŽÔà2ü4¶Îæ1 Ç‚m K³5w•gk“;ÓäŒ ,ê¸=6Œz 0´)‹Ë”¸HñHÖô4T|>{tš}A5yJľÕÒ#]N4»Ú©‚®3/éT;­²áJÈe"µëª‹a¿p^ß¼_Æ ,Tˆà‘»?Ƕåî »C‡Xu(Ž-ŽM'A=·GÈ#޹Bb©ø¡iºtG!ÅD–×ÑS(ª°Í*÷Mà4ú*kg4«‰!"Ïçþi[¤%³óëÛi¦&„ÉKânLø>cD²,@¡qĪ:ñ2_À¶m!Á¼?/vU\÷:¸è Fë5Çæ¶*òPË%&?`½ Œwø(Ô`ƒ¶ÑmÛùºôúEH>PéIþK÷¥nZ˜[Öq¨·.Í`k Döv-!ä±|az†7å’”ÒF)_™·Ù!RŒ—éè’7~ˆ¼W;D1ºhÍžzÑÍ5$Ü­è}­£Äؼ¸½;rJWáa?¶3ZÒ+¦„ÆN„·ð_†aTqžf%¢œbŽa]`Á Q;É5Ù+8 ;!CPŒÏt3_'³ÚDÐjø”ï+¢v…XÄHrîþ‚+kÁL¥ê¾[T¹ÿ¸BÏ“Dѱ?Ue€"Îl<ù¹ìÁ¹|4ÆŒE™Èkr¤û”«ÖÉY¡+ZR†y>~/Æûò´VZËN‚GWËèÔ÷]T8Ý'xGú“g¸Ö+ìfYÞ!ª³ï²ƒ|äÐódàÐZ|„,ãMœÒçj{£?ƒ (_F8pWéüÒ„3’èË?“zžoõ#:¯r^®þîÞic¿Á¾üWßs¹Ç`÷¥ m„â‘ù<æ™Î­z¨š_ Ù¾ŒjÝ É\3@Sÿ•ZzŒÆRâ,d¬XüNym×O(ì½·D5Bz@QÏ"ʬ8§*/tù‘,-h}²× Ee‰à€™ 1¯O_ËNº–>õ§<ýwêZŽ^<÷³Ê$ÓÔržqÖ‡UÿeeÒD°>ø¥ë¹ Ñ¦:}yñ…÷oÌB:; ‡Ù_Ðq–)JFd"  êÉæ¢Úz¯a躎ø~ɹEg|­d2r´kŽfNåŽEáz^Õ‰stAœª¯×b¡-–´k4ó胙Œ«Rf—ô¶âÆ0èå,¢ÐP Oô™n?‰–x‹v•m ÍŒ&ºÜŸgÊÄ™ *°›Åb ƒØ¸©UTH}Ç㜵¡:±ƒcøŒWÍ»äЫú°‹tjOò3„™a­#¡Deç§¢ôb#O­+b¡`Vê†ÛŸs()Crlíh¤2µºVµ›c\¬tÐÚͱEÒ]‘¸ÜB9*MTÄ\$Ü¢¯Vr5V‘ª4›íTκ5©k"ªãÈL7ZU!€$³˜ónJC"ó÷|‰LÒ<@‰BlKÔÂR*1FŽý™™&Äkã*TófIi¤n´Ñ $îDLøc¬tB—’:€”MïÂúë± ê½#ò¢œ5_¯4ØNó×RL²§"À…Œ¥1’å´UX7 ܉Jšråy~›l Ö3–’Ž:ž†³=)ýšCð]Ù:!ÙAä3YûBÏ?w¬UÅ(RÑÈⵯrÖ.h-¦­ˆ¨ï¾HyšS}{ÑÓ9¦â|F)ç¾#˜»Žùò„0ƒ`¹;"ÇÃæ…ñnæ2ņ1ˆJLÔ‚Ò¸vfÀ]·“T`T¤¸û¡½bVFí­±b|=Ák–4Ød{+Y»>s|Ê£ÜRÌeš vJdz¬²NãZ•¹Í`ë±Fç6‹HlNgi# äzRX·gSßÚ4ÍmŽ)›pSÿõ—ýýÿAD=óý¹u-˜xE¼ÑªÃ@ #àìÕÍP@ÕB'¥Ù¥ŠØÞÛvà§XÑ‘êVn?ôþ¹ßS0ËŽr3Ї.áÞ^j½·@U\$­Ì´–ˆ]¹ûÅÏ ¤zPžÂ @ÂÄ'ºü(ežâè߸.ý%-Lµ¾¶=i•ªra:Ÿ ¸ç”êÿFú,7Oån¥Xp?ËFrËlfbûzd4À^X¢01˜¨ï Œ–È!Ý@†}¦z>ÔÌP/€@ö9yÁC`¾£g®/Ò…HicÓ{´Ï¥9ÝmQ¡;§xt•Iæ Ï’Ô ý­3V)ÊZ>°«¬(­!p¨~õ¼ý}¿ošxoxœ’œz~ymgxÏÈÍŸÆè™d“à%¡ møâjûm`òÉ{â!ç/iŸò¿†ã‚ þ–«àêuƒxɾæk+åì@©óàÁ¶þïÃŒHn`¥óÛAjs³¦së‚¡y‡ˆm§>ˆ‡ÝG)/½R]`&÷Æ‚@äù}ˆ>Â<ó' Ed»:! „Eèä0Ë)Ñ$Ì”ùK–±§`è± ,†±ÎªÓ‹ªÃïmyÖùq7ÂÃÏKÅúDôBL¢Qƒ®4;“óü1Û;Îú¨,VʰÇ-ÂgmÊfâM‘4†n¦äqÔ‘ý~¯ïoÝëœP>[cp õ¯¸9_oZM®¿|¨?oøƒwtÂW¯ÆÅñ;A¿ÕÌ;‰Ñi ÁW ~êH—óÍêˆIÀgŸâƒô6ü›L½÷]qm;Lãéüöx< Xëáúe· Ì3ú8m`ïm´€€Ti\K—þ•Ð<=¹ùˆ›çiM\޼–¨bïTÕ,¨ íË›Û!WúªÂ™tµÂcÜéÜ–Ü‘T^¢'–öùª¦¹ûe*ThʈruÊÀ„óñnš|‚Úù`ðf^dŸð:‰‡–ílÓ°â÷ü©Í’Á©ž?sö’´rgò• 6’Àºµ*ßs ¸¨-ünî`‡\üÎÃ{Ö£e/õv1/—D|‡zš ÃrH^Yþq-1§¥Y#ënçª9ÙÜM<÷]FÐÚ“y!e‹-»Í§wý IDAT+XÊŽ(fnmÑeýo,Ì–ȮNjmö§Î¢Ó­r¼*"° ž}õ ú†A¤k2ÿA(òè£4sÁƒ)ägºê¹]ÒÊP<1U1¾~ô‘DƒB3‘voEM º‹,K…±Áa'Öÿ¿¦ù“.R8ë‘‘_nD¤‚;ɇ³p·ðÂ8•æ™(‚å Ñ-£šÑ %NQW¢ Ç ÕX’¼Nšîã¬VäÃÖ  Tàd#”¥K•d7µÎ‡3ôÐJ#ÐJîHÜÊõRw­ø·À}Píªé@TPÈ”® ¿Àƒ[£–Âm‘Æ‹¿!ìJ³H²²#OªY}‘AòÞd*æÀ– AÍØáÑß"Û-ì-gëk£¬ÎîuÖ!;D%*"ZªÈC‹Ûg_NÁ\̘x†ì)ÏÆ™ë¬.%ÄžFD±=ÍÄ+g)ê÷  ‚¬>‡È0±_Dÿu½é* ý€ŽX§ø„Æ2$'¯&;þ%»;KúhuWò à w.ÂXt¯g@Løìtäï}“*ò4SÓóXg%Ùäò •%ºi¼A`ãf_wA+É"xàlp±Í‡êþù4³¥KuíŸÏ¥!²Øæý,b504Yž喇‹ \œáŒ*TD6moÛ¤uil…šLPèˆ ¡í¼Ù:yåè,E;d˜ÞÇcõŒ,m$¸‹Cu¹-€ö A™Ñ`0±°1Ь2Iõ,ÍvÊ;<É}ð=ÕH£,@ dŒÆ =;"ûëöŠB9qÉ ,"K“]8’!ç‘ÊO›yÁ–óg­bñ ²wa©Ÿý{÷,‹m¡çs†ñ¹÷ëYž´…‡ïhfû^nì[œ ¤â[‰8bøÿ2U i|P¹·¨ª¨ÒB ÈÕUW5ëY"›o4W,uCYy©z­Š–ô“ï,`^¢#PÒdg%`éBŽ8/+4ÕH„€ÍI•J‡t˜˜T…½ó¾Òh_ ±Ê}@÷Ôá°ô£Þvf…!Ž©I$¤<7TÐòqnÈSèIØO±ôèã[ΧÚ"ºQê}(¸äá4N>…ZèøFþS‰–•îÃØh ½CP†l%â•¡Yz35ãÄšä,AŸåmƒ#É;Q'r÷ë…W÷Åç<†oùl} ¼T2Ù.8­ ,ÙNßú-Úàsx˜oç‹FŸ#3oŸ*<ÿáèÿ˜«à÷ßÞ-c_½y.Ï^aþ#ò«¦ÄÝ:.]Õhë *Ñ=>þ”ýÝ,¨Z3qøÞË}×L¥öÝU•F, õ›®Úë<ƒÛ}p„â`³ƒUµQpȇÌà¤ñX‡Rªüu)íE î4ê‹EÝL°ô!c‹–¢æ¡ý"µE·Ñ#ºt<ú@VjÿUÊ¡iºÊòÄWb‡s~Žr(=ñVBM¦R_È¢ Bž¾í_Ìù¹äûÿè?¡ù ¾_þ$…—7ÀÛuz¶œ²öÙ•XËñ*ôSß{ôÿK±B¯Aï$÷¿@*übWð=ÿ}¡>|kü­ÝŒ·üó×›ùŠÈ·~þWùkYi‰µìtï±V`ÇPtƒo5ëvæ E¼6,Ûã×,Åz„ß ªk-3Óí÷LuÅxÈ=j舢QØ•}žwšÁx‚3yrD:R{,VS ^±F×Òb“j£E%':{‘¸¥§QÔVdœ¶ÒÔ!sÈx÷*9\!Õ¹iv² ím¦ßAÑêúÁ|Ø9[T“ieÎP(–ö¹Gþ+ã‘-A^rºwØÝí·Vô&1¨/«Ú³ÇÂÊy¸ò\žs½Õbk‹º¸M]ðÍ`çNME´Y­Î4öÚ>UÝ41‚჈ŠZjvüÞ\S‡'G-©{—W¾Öë´P;+$Òü½·€®B°+ ¦¢W1†Ìvxƒ•KÁÜ!% *‰Zþ·aÖÆ©c.ž$°K„T[ÄQÅÌjqñÂðâøIÊÕÉÿl à)è~Hšsˆ )(`† ¹ýÛ}ñªL i4h¬ß抮1\_xÂÀÛYÕ°œ$ýª:Ô±K@¤¸¡‹oÕ¥inŽ|ÀC£Â7ê‡Ü$‚²ë[ÁÁyÌ´³ÒM‰p2“2m}Uaµˆåäø“Ùz¬.4Ž:Ã£ÏØx‡vßfuIn  .–ÉæŠÐOd)1ò® *hHíó:ç›sšg›»FèòÿLßÎU] RLãL=ê»NÀÜæ”æŸTܲ.—)IyŽD‡¹8Æß1ÄÙ½™é—”TøvµˆvƒÆµ¤B*pKFê~Öv #ŽLçÁY£˜êÈ€¦D_Žú•Bt³—J1].“ÐÄE% eò&óM9*F¥÷ÔÓž\Å9JÙÁ<òìу´²‚Vð}&05drB'þ°ÅùØÃ üª?Ö —›¶YÄAÙå(§L¾G‹è©ˆ±HZªªò”jå%Þå ƒnØ«rÕS•¿îµôÇzü|>—ˆGÿ›Ñex@ Z:[0K(˜‰Ø[›|€mfÛ6MÌà^4ëµÚñ ]€MЇ‡\x´š/«ŽâÓlGúâGQ]ißÞ}Àóåm›@ÖZ÷Wn —ñ™£…m²©ÃÕ ZÇ”B´¹Óˆ~â5bzuqÞç"¼qýl‡¯ä_­š(ˆÈÓ:P-¸Ïó1Vnó¤›@ÿg¢ ’ãŠ;¢r¼+£®å®ž¾EkPƺÇM;²å\½ r G…Ÿå3ïe^.døùÓÇïÓkJ÷­ÕçYX²^çνØ)ôцkÇg㈀ºX޳§7li†qzYîsüN6«š…e”·³áÐJ°?‡*IJր1×pþZªnÅÊè!…*<*{£ü§sž·¹<Ö—@ï£\FþÜÉö;c7Æót)&­1èWvXnë­i/÷Àðd´ ý3T5 "¤9wX–[%û4"ã jϳ]w"ùµ…HOГz¶iv¨²œ”¥¶€±º¶rqÈ—uêõÞph‹’ðËï[¯ÏñûªÞú´s´ÄO$`„qžø¿¼¨úoŠ;d•#ìC­¦åi®/ɘ\®þÆg×È÷ÙòRîq`X/;¯\bá¿Q%wÿ`À?<úŸ_{ÏßçêlÒÌTã´‰5#È 1Šçh¤.”óª5ã®icD ¹‘Âõ€¹Rq¨Šs¢R6LäviUÉ3ŸÇ!åHÑãø¡"&f¢?œ†ÇÙh”S-õ¡ùѶ…÷*{‹G 9=>£Í}¹Y«¥{FÚCc÷³+Ô쩺$/[öi%„‚xa!Ø™S½œ Ä‚e$YR—q.º4ŽÜŽÅ}å®ó¹gÚªú¸Šeâ[³Ìz]®ß¯IüúËèÿ-P~ÙŒîÿñÙ𮆷 ëËŸ|m¥Ÿ ÷ìÃ%ió†¹Ý:!ï¶ ¼F]×òï®ßbð1\N~ë^aû÷•øLÁ»uíf»ˆ ðQcÊŸ¡ÚEà53‘=ät¨ ËeUuyöòÌ…j·rÆqÇ(XºÙÛÜIÐÙѪ\-wRÕÇcñ)’gtXYdŒ5«»ÍkÁ;Q4gQ ÇÞÇ/fFc´ä@éÖ0Æ‘>%®hu¬¹\,nC²‘XÀ‘…MU©þÉŒÓ)œ'tÅÒƒ}.W¡àF†b£Uü¤t&3½û±ÏšU¯yAªªka´¥6H•óCïCdNI Y3'`×çÉ #˜YælHil}ZXºXrÞú8$“¦òyP8en‚Pà=äBéGøH}CÝ$Æ®Nã8GûÔ€^2—h¥zð_6âÌžSé|§AÁ˜‹AIXhïS~F-$œ€¹ø g½êîð Ì”¤¹cXº1ƒé €£Ò6ÀÇÍÔ=»ü÷¥'¥`ÿ<ëÄÕ1¢Ãô‹iH(Îü¥3J7sdÃÏè/É£¢×¼T¸bªÊè±ÑÏGuÝRÔƒ ŽZ¦ÈÔÁ!`öuÖÐAYw¤þu¡­½ ó egV bêõhÑHEV†^-à‹&dèZ^ðÜ<µÂJêˆÖ¹ŒA m2ã•"]æâðX\ £É6“my@ýPòïç†cÙÉD™Ý‚`ÐÏÿq®KÓ™)m àplr´5YxN¡5ÁRȤ©šìªr b™±PÑœuú$8ÆtÐçÏMc<’PÒ½D ›P̵8”ˆR‘Ö§—^ÈZÑY‚*ʉEΘ ¦$¢¼6–C¯Þ·g»j öQ¥¼j˜)cm] Ý4›ñm{§ÌùmÅˆåªø\†«'Íb‡‚þPèÊÙÚÈñdž„|ºiý\õ? fZ[AP²Þd~3{-™¬„®Sn†Åia¡ÁnÓfs`P?¡€2žKW2\±£…ýå#ùþˆŒû¥<¦‰7øp½XV:f¥nÚÒØk¿¶Gƒ,¿ ¹É½·ÿÄϸ'Üá Í;€ú8(•^gQ–k”]ê,»»¬%:œâXBõX½FYû¦ Y[&ž±3º h_göŽ…ºËr›ˆ2ÚéBÜndT…²…ö$ÕíK‘é'6ö’`›ÈÓöc­ÂŠIÚÓðÐÂfT†¼/ŽXHM²TÉDÁau’®ŒÑЖ×bSPrõO5™˜gIÏ ó*Ú¥Ê*ØÝå©„_PèCÕÕÅýýÐe´Ÿ²oñ(÷¤¨¡†:Ž,Àe(BÒ¶UëÒt6-•- 5Ђ›öü¹üëQk´±=™*tåá5^{ÓV¶Iä±Ôwùÿ Ê¡Œÿ“ûˆ‚fµt¨ËøWøÞÜùQz9byÔ-Í믈h}L#èE ƒÔOž¤»x%Ý·ªXº¼Àøôg£é·î¶n±}3[ ©áÆOhJÂ̳Ԓ‡ž ³k„(òQåË÷“Ú›5^€µX$ÑK¹¤Âj„#{2ø·þ”Šäœø"O+BÆ‚ ÅE@zý’y–—pç›0ŸÂ²‡³9·ï‘IÙåõ–®k„Bî “¡pÓù»<Ÿá x º¼ç÷z}á[ˆin°/ñCüDvš&™ÂwÀyQí¨7Ðæ%o)ÛIí|øTÀ—aü/iî'±t§/-®èKÊû÷þæòâ ß?ý¯xNÑÇßÐHǾÍd•â°<9—ò¹=wÏÒIÖ²LEÙÅäQVíEæOÇpq«hóš˜^oÛ£üsvðj “*c©R¤°ûKØfõn2ò‰õ£/¹ñxDZAàëäÞñË·Ë%ܺg (¨/áP5{B׿veE^Ï£î’MÌàb ‹"󌒸PB6"Â$`Ók†’È¢9l¤âpÌé>!ÙC¸K.:‚:€„UòÿÖÚõ®‚ö‚Ý€Lßþͧˆù»Ÿ}í.¾e pF Ѫ­ñƒ"âû÷ð LÀ·>ï[f‘/Hz§xï^xO¼¢ÿ_&:? ðâë;¼y|þùæýü½é!"{oRÖZk­épß^'ºË2ªy3$‡b^–ˆ<Öƒ"Û~šç ©úé$„3ží᪫ª™=÷3<Ähudfuâæ–g¢¶{·‘¦`r©jF7T¶¤¥ŒÎ‘uWôLî\Ží#¥Ç]Måx¶ŸÀXC©Ü#çÚÙ[kâ¡RR«bf}ZèÔ¹öabÊ„fͼ`„þ:ñ=¬©§«ý¯rÖÄ#>\ÛÕ‘ µ%x¦C“ï'Í_%eÔ 5ýHê,²ëNvAÕsœ¹«|rV7k"‘ß¹TÎ6š¤wÂt0A¿ˆŒŒ‘ƒ6Æ1ó8Ê¢ÏCcÃÿ”…Iw%ú’ °Ûä¡PÈŽS…IÛ¥’)y åúN} 2²¢1¨§Àl-Ï3ÙM@ ¯­&Yt!’»ôWÆõnGMÞcަzýh…E¦ ›’VhRL0UøxÚáÐΓË+‚[kŠ© ·|ÝÊÌñÄ]Ú\“ÍÒ 8“Ck®st0½‘ÙEyVQwœÉüçÐnzpNœN¼ÕÓ¡r¨¶ Ýû¯gôH:ªMð•Ófó”oFUÏÒ;ÈÛaê2ØÓ:âŸÌÄ ê¥Ò ÛÂvÁ£#ZW°…XQf®£Õ©¾Up_ÜI1eæiªS™„æv]ꮯ§ª5 P.áÓ„iöò¿Y"{soï_w Rj­Q'Û .E6·–"ì…M§ˆE•\ÆþH)`e‘õJâǸâ*Š´YZÜøEõŒ !¬„@ºÝʦqL •·É:á\æO@ÖRUH¹büÈc-¸¿ÊªÉ6ÄV$¥™VU–ˆÑöÞ"\xø“l,H3Q5£ŸÓ Pñ:"e¾[6ÓÅýÄzÛƒƒ±~ˆeǼ]¯AGë¦îæ¦*"rשlÙULØGZV…;ód{å0m½tÄ-s–©âò0Ub€IÌï„,ƒî•,Þå|Ä÷+_\¯Žõ1]Ž—{Š&Ð_}ÞŽTý ì¹—}ÓXð‡ÖÎ7ÿõÕ4pR4Ÿ¯E_Ùª>‡þ?å¾ÄÄ;Zô^¿‰"ßÑ·…ÃrÔãM^dý_e­å¥û–$ø-Àƒ´ç~.òñxèZ¸3#*Æä£KÂÿ!‘D×ã¿V9°K;À᫊B·@˜uBÛ¸«hvÊá+,2¢×!÷^¨;‹d õ¼Ù‰k@—Çùb)t=ìýÌö®rG—) úÄ7Æ$µc"c2Çþ–ƒ¥kÄd@¯±,‚v—«™%­=-¿qÿ†ýØkd2Í@N>» 7ì!ºËåM}{;ÜÈÇă|–.ô[”·X¶ûÐ#"еÖRUÖzx<ë±VDp03ÊçtP&¾Ú™êOgŠÚêÜlbÛëJrÕR¦ü«þKím+c‰¤ +ò~"ó’z.?>ª UG)H‹®°´UâzxNÐÐâ×Ñ<ÙwÀ9>”‡ ,g=ÈÌ—7kfåøÖùŠªÈ§0ç^Ú('ˆÒ…GUÄKU¤ôùTFQƒI×çn!3TÞ¥Å8­Qƪ듦s3…–ÂA¡Ë —»öY¢¶­á÷U¹>ÕodˆL° ÀGšœ¥(œ ¢ß"ªÎ¾h‡Î÷0™°ãš0cˆ•˜X2öZÏch1ƒ‹d‰¥R¯âHzÊ‹L)^d¶hÐ¥ê¾Bo` TšÛª '™$S ǘˆ§õ ,›•¤eÊÈ’Šøò·CÕq' ŸÆÝ•°ìú­ò¶(HŠ|“ˆ’‰NT13±-4o—ð”éÚ@åcÙVÏéG«úPþÄÜš:Bž„uéþMÐ̞ǞÅtš¨Æ›d©ò±,!}… :͈%ÜCn>g]E” W@nÉì"æN¦Eub¬‹º³á¹–Ryª?D¶Æ8O_ñ•’è:/¾iJËH•‘ÐlTgÙœ ³×2f3¨M»æ±ZdÑø ½‚‚›Ž‰çt¾¦+ú¸‰¥lT26žÁfÕ€QØ@ëÞ¼•™G8"<ç¶"]lxh:hx3¾ËƒŽgÃF¨@;=]Uýû¹¥-aóe::_Ã#—ôföÖLv‚¤íí9{±7š½&vSø*F!‡á­ú * $?¯‚¶ÚBܬzÖ3™*aCÈÌ÷Κª*æ«æ…ò®sÜvï›u”±ÀÌlïXl ôî–íDÒ ùa‰¸%0A;¸sgÐùVÆé ½‚¼àJA…â6N¶%gâ¸*ÉŽÕU.³ý%.Q¶óˆÊRQ«dÛªF^3ýCÅ·¯ç)e)CЭ·‡®˜>£ÒVDhÛ6uy÷ ãú,×£ªìçÆ×°yvLŸø×Bö¯‹‰yy=abð#ÑÄãœVEék}sº¿:¶ueï‘Mõ¢Åa¢Ä4ÿÆÓKà,zØŽP¿`D ÔþbæÕj—†®ÌíRã‚—„£àXiº@%nÿr™ÑøÚïƒñî#÷b¤8¨~ÈÛ– ‹Yåqù#öNïø!ŒÙ6ƒ_…ªñF?$t~ Aù¥ ÿx+À¿õÓ}PTÀ+Öú+ïúÈýéñ¯Rís”ò¹®³i{¡Ú:§ÒH´µ0si˜…!y¸aÃe„3B}Ä€ú¡Ø†ÿÍP{ô³•©º›MÞb«®ì(R²ÝºƒZR‘ë·|V†J@V„ªÅ0¿<®Þ¸ó¬~{îp²ÐÆ„ÏL¯6fë­ BÊc”Rž‰ƒhò9’$ÎÓVµ=Õ¶-Lª´."¬Çؘd`~¹ÑÇðÆÆÇWvXþÇlFËðdwqL Ðm¡2'ÚÉm×àš©/™Þ“Ä•ví¾Ê<!£™‡¨4ey þÒ5ÑÈB@%-5KF뤜7[82ªRÜÃ$X*ô¾Š( Wá¶‚X4d56D³‘øÔ¹æžÍ]䯟RLŒ«ò…Œæß® ‘—r;ô±F†±ƒì¶iÑ®©° z ÷)r߯åE¤è´Ú^Š©( Vræè¤s´ÔgÁ¼"sÈh‡ UŠÀ”D}ê«,˜õçðjpBqïy†É"Î!£)ˆÎåÝÛb{—‰Œ"¾7¾”¯ÉÏt¯hñ *>¥t°iR#•u‘›Ss㙉¥†M¿´×ä7­ÀÜ”‡ïÒ^6Ï-®,p:SÕÖ±%YnMþk÷ÞÛ ±ÁÐ\˜ˆÔ‡à)ND±¼5à …£\ æýÍoÛjšá'Ô»E$Ò»d#Ó[m“* h‰âˆHY)R,S†þú׿l[ðp4Z¨îIn1QìŸ&à*Éžšqï-£ý´åš!'iäìJuW‘Ýð?°=IÚóÉŸÏ翦*"‹þð:žhË` YKlû@·˜ˆ,‘ça}+eS°y–1CE].WØ¡Âã‚‚Ðç8Э÷">¹³=”Aâ% ˆa‹qP¹è:gb­ÐKMÊ×`e£â6ÒLW:]ªZ)ý‘ô¾UÕ•…ÃRYCj&.ígTuYž“z”¨*É©ÚÂ^ y<¶í"#ž[_În]~4èsZaü+€o¥ù@ÖløaÄ‚Iu‹H€q|v½6¢ÕqméÍÌRjœSø0UȼhÊnÊ>l‘NFÅ‘ü7毫1Óe.ur`dE¸ô±ÜM$3P4ç©"ô"A­9‘F<ú=ûŠà?¹Ö  Ý:Ð!ëˆ1\§“5é…yí ~/Ü‚š—Åá†%Î5MGÈˤÈPî§!í—ôê_qj²IQ/´ˆ—ÉÎYÃhYÇA´†wew''}Ä&Öö}Z»x“½ÛtÍå*H &ïX§Åâ[e4…“¯÷[øÔVå4o0‚5zyŽxSúø!41Ú4xü¡xqt ¨Ÿ/œÅÍïà7p…Y¬®<Ø/t ã;¿uOÍ—™·…Ÿ^=ù‚àŸðþœàßçQø2“G~âSˆl´Ÿ·î0½!Ã8cå¼.©õÌtR[_}ˆâª–Z C`qÜpT>EçO¨ •éÎ/eF¼¯óuà@WÞБLJguÛ1AÑÚ®Òé,'ñDdñ3Š‚Iˆ‰;Þ¶AW ]´gIÅ¢ø¤–U‡ŒÆ‚Ô[u½¸TC2Í YCV· ÒD}#´@á0xˆ¶UΛr™6tý5ê–& ïï/Jü‚­ßvöÊ›(ÿÏAØSøÏÑ?ái(i+ø‚-³¦˜Wìú%bžg”ék7Ý|SøÄ—ðAíp^ËvŒòvåí“~¹¤_]Q~!ˆg…\‾ö.xϲ‘HÅw‰ìÚ„å÷ÂXkMqÖØ ÕåÝ¿®]ÝRý¶3wò¼ýRp„xÊPÑÌ2„í½mÊkfK8 àÊ&f²ä@hä‚êÑ¿ —>ÍPÖûäE]­ê+Ë–Å¡ wpçÒC†r½X¤× ÜL–>VÞ±'ìëªðc›2¶HvžÁkˆ"ÃJ°¨b°:ÇN7D#-¡Kð?Ùò%æ˜àg~¨e,HMèÙ1.ûfôüu/ÂB¬Çø-+¦Fpè€pPyb¢ÞÝiÎh€Ù{ÔËØ;1¾°2VçgPR8tòE>ÖvÒæ©ú:Ðÿ‰/˜Ïà¡l{ªRÝKÀ¤ÛBb(U=1·šÅkñ4S¬Á­0z˜3 "kq± m’mØ2üV«Îa+Ò:_Cü<@Êý~)g ¾È¥?%Uÿ+¥jV¯mè¶Pß,ÁD #w÷;Ù±åÒ%Ã+3!Öד:K¬9[¢Ø¹÷)²KC Ó%Y±Ë,û;_Œx"Ò6²þ/ï§vMnriB÷å>ºô¸Wò8º‹»ÚŽ óƒàå“„êÃÝ'p„>¤†-±"¿ -bQœm¢øéU«f GSOòbŽà–ào"e$ V RÉÒñzÔ¨„Ö‚N™™Ÿæ(B£žE™Ž"ÏÚ2>7÷6]*P~ÔCA”Ë#º’ŠvW¡æYO.Z©CýN÷EŠÒ½R•fî?ÒÓy,™×àIj)¨½Œé.£dïq¥^Ö×ëöx|£3‡ãÌáë‰È¿xïd-?šOƒƒ‘½÷sï¼²¶%"¢jйˆ-¹Í5ˆUcËhú­Ò„k|B`+q¨£jð9ÒÅŒIcEL‡ÿ'Eå–\¸¤£Š3øÏiB`G,¶·<Ò7Ÿï£J=ã¤B]Ð]„–8Zú\Ãt³X}õ^! ׋ьæp¡Åw¹j3ò†y·¶` ïAˆ¡Š >„ê.Äc㯼®©’’Œ  N+#» ];¦Ø ŽÀg’ä01Ü’í-ÚϽd7´´­Tèh@³‘âpéÅÚªåy{Ÿ8ûâ4F±£ŠKDÐírï1¶`6c׈‰b¨0QèÆ.½¡m:"¼…ŒŠ¿mo³nr‡×ªŽ*Ø4×CÝ£]®µ¿î%Ĩ²AÜP¼“{ù#­ ‘EuÔ%%åÁñ¬Í¨i‡Šb=öܪÝqòšm¢wÊÝ\ôâÞY£|Ô,ò EWœ4³]>¾ŽÄ§/å¥{NÖô9bjA#¤ Ã1Ën訄8áÕÜm›bòŠ@ˆ§m7O2Ÿ2]¾”Â%Dý°§£´[OÔQ”öûÿR Kåì¶â ú)›¦¥¦ž» ˜–ö äaÂEúI—š'N/£®Æn^Ì%,—ŽKr+ìst¥"é]·œyeœ*"¦";7õÀ^fû¡Á¾nÀY ¹¡ûð‡R=4 ±I¥Ï[ìÒëS¨$ÒV?žc?/`/>B_£x?Wáf¥{?4>S3^ ^~¤`=rÑna‡ë¿ã—Ôˆ÷îÉ»êäÔþ•x8ÿÛÍÛûæO>Õ—~?,ü§ ìø éŸGà#Aë‹QåC¡¶·¿êà$4‹dRŸÅÒ£N#²˜hÅì«QccܪËçh—ÖQØ /¥}”ê NÖ¿<˜®rÏÓ²¦ïŽ< •ÎTnÓ‡æŠP ¢Í/r êùE+_Ú]ý¬ˆÿÂiÞd”ß ùkåvOÁ—ň¥Ú(6š7xë¦ öIÁ¢OVìˆÓÊå> Ÿ¬œ·¸ƒ¡‰ô<áų CˆÁ æ‰×g3Áæfí½Tæ¾EŸßµ§óE¿Ï´ô¬Ý=}ì”™ÂthÇ^ÑG7dxvûÌqj$øqtþ͹áLæA$ö"ë 8™•Jƒ§øúÿ†àÕ„!sGºúÌð©Éàn‹¾½Mø >€ïyY>!T—ÇŒÆrØúýL)_X®g˜ÇîÐÔky÷HB ý»CáYR•u¡£:×ZEŸÓÞ?ÿ~>Ÿ?~üõ¯¿þ—KV¹ ŠŽ1r4²2ê…Kñ1NÇäN¸*Å…ºa–Gf$ ª¸µ*2¾`ªðÀR?$¶ˆS¸TW_Í©Ëû‹¥wÅå˜Ã¼šŒ Õ„³p, cp>`ҸĬšÍɈdÑ0³´È#9Îâµ[©'  H厖Qã)E’KK1u$ˆ i-[•RúoÈTúPâ½8ãŽ(ùƒ­o¸ ðï8´›ê2—µM Ky/:;Nl.µKÕÂýaê¾¼Ì×>…ABS–~™Xa#þa;Á=SßI¯}3_di˸ U›ŠF²`„ ÅÝ€ ùýÆÕ4”¨ð©‘ÊD´”!Î FªDImù~HšÀsõµl?V7xN²ƒX#•ÍÀ{^ÓÂégwe^u¸ùéûFÕ;ôá%Iw$*Dœxñ[J‹Ú¢ÊmAð˜Ò:¿†=ï{÷”±*DC§íêlמlʲA ß‹›‘БӅÇ€ìçÞÛ-§ êR—ˆä qL®|u-ê ‰ªìí­.½‹;^‘À¸Í 6úÚpáR3Ó B±ã€pâ·½§l1¸W1Í‹/!ª}îmÇ)$óK÷@—½> ÏÆÌ¦ù–ðGj U"œ]¼ÈÙÔüùaW Wî¿Ã®ÇÌçüUÞåØÖáåg,G°×31I¨P¡•ÑaÎ@¨÷IüD)ܶƒôÜ›¥aÄß9sì7H™avZŠúGes¥˜½&í) “U¥ÅN)'ôºúRP±J$BüŸ™LCi`BdA—©ªb?cƒÁZTÍÎqYRžf+mš™sLý†)xî§ÿòm$¶bᢺñrw[®ã鈮Œ*tð’Qî ,‰æX‘ÇCUôɬG’Í܃ΚZ¶Gyd†L8(„ñøx÷{D¥aÖ!n¨Ó¼+™qKo3K Zj3Ûfµú캹…*E®f‰ˆ.¢×† Ä_e=å#Á¥¾„Ü×uäñ$ ªÆ},DÆ,0k³Àeº$Jk®~„Då `S2†ëåì¨îmÜýÂÛhÇœ‹TY²ø½z1B\œµò…m+5zˆè#m œ‚™¦2wx§kž ?òT» .Däi“lêLE ™­„ ˜ËܪŠ(PåYñÒ‘å•qj‰‡ÐÌ´ÏÉþåUxHvX¹˜”Ù]"Òw‚§9K°8Ò©8‚°Ž™5RÿæV­Ò(3¶1KÓã,럘$Œe5в÷ÜU%T.ƒhî9Ë?êc4»ÜYX«c"l‹®øí%ò+‰ ¾AF®°IT@ùÈèúwíûQ©¬S‰ü´±Nó_†ÁqŒÏß,Û}' 4F}š4@ò*‚TÓÄkš%òý¤ V@ºT„®*ÍG€ˆD¨8 ãžõz+@¨5‡ i­Hý±´iRµÞ–×YfŸŸÃV ?ý¯ÿý¿…Üûù|>¦€®u‘#¹Î.ÄnyDŽh‚”¿›×V†D‹=z/÷ Ú)¨WÕíqÃÝ“!õéjZ¤ƒ>žVfU¥ªRh¦!GòÉ%GÖ®etÎ"S¾ÍLD×*ü—-?EZÙ;Ÿ¢K\Q‹ŠºPÄä‘òG%©¢²¤½Ì¹N´%‹Íów3ÙM3àX†”RÂHy¥…Z¨ rçíŨ™¹1?|¸°ŠæÈ´çì ®LßÞgæÌ¥|ï¢ëÁÑL‚ÿÇh¨Þ ƒ4Âò ú·™móë–¯˜“. 4[U&P¨šÒÞE¨ƒ)!]%¯´,ÛåËôp.™Í9-}óŠfdªDc8"åÒµ÷TÌòZ B›3xÈØÅ‹ 9Oj¬º‹Sh> ¹ãh‚ÌéJê®ÈÞ±düqÊ‚ÃÄGžl8:ó-!QpÖ,ÆFQ5~…ÜX!é%Ô%4r³&ksÀ1OBn]…biHFŠƒ€zÛ(åißÁœàUÁ͈æ–ä)à°7SÞ¼–¸…RˆëQY:áYÙS.äÑv%ào¤!ÚüŒ¢¢Yõ'§ ?É„ÍK{ˆÎ4F·—–Ì;ŸW¦;¤âö® 7t´å²Š@7²mÞªUŒ"kB¨¡cÅíºFç ÎÇ›bS)¨+:Ì7‡Ì Èç³0†uŒat@ïÊʾe79a#"{_üü©VJC–æã¸·ËÉì=è º°\ ¢Q3WW(a;i™gø&Jæv]ªÐ‡Áàäf& ¢ÝAo¨÷6ˆ¨›å¢Þ®¥À)9v,Ëk}­Ã‘äÓ664rƒÄÅÑó¬åQ}‡ý.öã˜ätA¶PÃ&eÆt e/»q˜ —Ú®UFl Ñ™†%P`ëscÖuþ‚S÷jb·‰«à½T­zXñö<ÕÀ¥Îý"I>·=–cÂèÌAÆØT7‡¨býXËkxÂí%ÓC™ÈBÛóÀJ}*±©ŽŸ—,<ú_m¦š„ËcáEžþÎÍ.à æÇ»4z5!WHç”Sô‘$q´J‹Ç ùú;j3´jÖ®”b –ÐÀXP|„gHÎÈÓ#ÞMIíŸ ‚`G¡må ⩳èyßIT2墾²‹÷¡±æw•,QÍ£˜ +k!3Æ<ï~öGWDžŽàÇb^2Im¶ ! ¶à%¼-bÏ ºÔÄÄ0d×帥í›Ipû±@)i7LéL“"ï ir0ÌmʼyˆÊµVιûè $c<¢¹r1AUhvW]]¡ÆÙ=ÍÓ¯xfþT96æc{5.4ÍwÚ¿ô7­ÄÖ¡ü À;A?›ÿ9aùw ñ¿å¢™¼´;ðDù¡í f¿T)ü»¸ögWè«ð j™ùâìßÌØù§¼aþISÅ«q+µvfhAwÎÄèKlý‹~Zeü*I!£Î»›£ñ«Â 8‰¡ã­vlÁ89q^†_Å‘,qaq·?Œx»Ô<•.ϹáˆYŒô-uÿ­÷ì㕌ürÛ ß—à#®ó–Øüˆ¸í±á·ö®Ï €yJdµõIñQUº÷Ӷɼ±Z-ï‡Û ã`cÊžÂ#/u-ÙFÙ€KæíÇãÇã±hf¦&4šËj0ý™L¹e=‘ÉPVŸ„@GÞÑ>Ri9Þò’¶Íõ<æmªÛTA÷Ÿ÷ÖCQJbC|L õ[(SÎ$z9jy$*Übæ2¿þž,”™ª(h˜f_ Já‡@:°M3‡Æ×êßÎB8Ÿƒ;86 1š*'3J•ç\{f«f Ðõ5s£$[;“5g^¡íJíîêÙ £©~åÈ:—ÎQ …’/@çn¾¸Àà¥Áì’´tʿ̧‚¯UåᲦ¨˜Èvsº=<ŒZ‹tpÚ¡á0чÃåvÙŠXTîZÚxýÉÙçáZÈšòª£Rü !+ãµ3UwÜ›nIj$L`k)ô¹gÖ÷;#(dÅ~êñ£¬`j•‘„;»n¥f5Ž®¿Acì…ëûó¡’°¢„€¸°þ¿ ‡â¹ãsóð‰)Í”­ÛžÎtަ˜Ïµö>g¦ÖÞÚ¨…†ð¶fªãK#šA•"¶½ãÄ@7éyÝbq°q¯F˜ò¯9e©,!õhÄ`þ‡h¼¶ãy[„{ËC'é[É%®¬4ÎmÓ3¬£cÀƒË͸ ºê¤æðúsgIkvxWe[P {z12É­z¡¤ O®QÜžã”Ç"UØ—è„Y°’·ŽÿÛ‹ Ùæl q5./hi¬çadB¶E¯È¬£Ñ[Ål[f oSÇÅÇÜ›Û Í¥Pîóø,ŽÊoÁXéX’²ZÔy¹¹ÞC3Sß.eÓ*k¨l¥>›¬%¤=f2:Ú¿Õ +°2Û²ÁîâgµKl°/žÒ“4FVߢ=~ôA¡‚å ê¦FbM-y–`Ä“n (¸½öòª& m´ßø͸t}§kÁ‹±ÂaúÔà¹Íhwajz%ÅÊ4!åªùõkë&LU±z:ãJ’f[«õ%ŽK¾ÃššQWŽëÃ÷Ù~ÛzýòXmb;ØIâ-Ál—›åqÐkdèæ¡N‡º¨Ë ÇF%âÉvmI•B†Ê!‡ÈCŽ,øÎ¤’Cçß¾^!<ÈJTzÓ¢1hÐçÛ¿Š)8G§'‚FÚ4¡> ¢&µÓŠy—ÂË´‚F?1¦ÈZKÁ3VÖ·›%X*?ž²­Yʑԭó¼7n£móésX”°£,ª‡Ëû‰ëÙ¼œ…HÊOáPJ´©€æëªUÐÂÈTvÞËm–„³Nöí2òÉ›‡¢ax9eâ¬8bg›wLÛ±ˆ`»Ï,=^•ÙèÕFÙ±géÑ8’;ÃySÅØ9B« ³À[ÌÛ )¤,ÅXÉÄ]¶ºb¿üÅvâóêÁÖKºtJ8Úš7[QƒÖ…í–¬Aã–êñ˃î òR£›¸ôì'·3N¶SW<7¶ï?Ã<{Ìî73-%+d^!ƒv©‘€ìJ_d[.Æâg }¹– –ñ¡úžÞÚ^º™þ<ÀÞü ø5 b‚¤süìßÇÈ3å[˜‚=I_Ýßþ~ûƒˆÿ¯HÑ¿üŸñåþ+Wï×/ì>.1Ÿ—„|{”³ìH%.î„ÛYcÑ3R…u»‚-²ÒõeÁ—y¨†–Ÿ¥~Ž3Oä»Ú––aV¾»d×QÍ]ˆ™‰ ñ†ßĵøÝBöWF4ƒ²åÅÞ”åŽkƒjÀU•…ÝÙdgŸ@pÆ ·Ó»Ðzïè@ð-›‡]Öhr¯î=­6Ö0gEX“é~¨éÕk"G4¿Ø@†¦Œƒ¨è¾{õëO~&Ÿ7ùm^ÎüŒ¼‘×P3*rÌòY¿ó·3´ar’Ù˜?Ëq¾k¦êÍVµ/d@ÿ›×b—©i7Ûq%}Çû, ÛMú5éÓ?ü9À;ÒT.!åŸY^¯î¯\'î@ÿw] o,€/¿…w^„¯}ªàȧ”è «@ˆˆ®µÖs?m”E^f¦?”ÝCšä1Ö;{'E×Z?þúk­µY¹›ÑÎ[¤j•eO¨DœÂ¹·=mCðX‹¤ªÆàÅ8À×ÄÄÌÔõ¢î|'¡ë¨>‚Ø IDATÃsC{ÄkÐ:6sÔ²Dˆ­uÚÛ¢#ÊKÒ¯¥Ä¤×Ê:„®Í$sØd4îú·L6×% qJ`†KÕ‹ñJk:oyït4ÂÊÄæ¤Oã+‹qAb´MFý]ü ͤ¼76 jO%MZÒ´ú©€ó½Gddû«TXle1I'±b>ê.8÷e›{èû{å¹È÷j€jɼ€"O³mfO“ч. ~ o9­È}…j"ºÁEõES8¢eRÄÇÐÎãû}DsS?ÒO)º2Ò©`{ÒßZ”SÖŠì¯âAÂÌE´°lä5ΰÇ- ©ý±«àÿr÷nK¶$G’©yäÁ ÿÿ+ùL¡°+·›òÁ®û’YL ¤R¨:•¹/îjªKÇé-~gîÿýG»k^U¶Õ£ à[Ê|Úeþ9Ž:Oß)ô(#™~eáTBÍ"®kÒc¶ë·Â·y^9¤ k¡z ‰`©˜~ÆMÿêýƒÓb¨­ÀðŽZñœ¬:cAF…‘£æy–€2å±xHÊbð0¶^ -ÜqOó‰çwµ¯<¡—ä&RaÝqç–=À±'³›7Ʋ¾²xiô˜.2GT@¯k›/n8ãrr ö${ɯe xÃôÝ '"5,¾A´B×ñ=$ÑæúXÞ6ÞO»dQ1ut/÷@¹Ã«a^’ñSömíÚ¯-äcÛZŠëÂãall€ÀKhS(T6w¸mäʤˆ¯%³7×ÝÜî?ÓzS8,2ÈözÍž^ÄôÂÝ6ÿb&¨yÛ“F§…÷(ˆœüOyk±Œ˜H¡~íí %A?[{c E&á…aðʈCoU³½E.‹'ˆ.8uŠÛ:îª-vÉÚ4Ãþ‚c$ëêKñ°è ióy‰¼^R'EŒÛ¨Ü1Ìö ´ª˜è×ZÛâª0ͶÛÿ3…© ZMŒfË)F…[¶‰0*øL³A~ƒbQ(ãÙmöe!ëćµ¢åè ò[Â;FètH«‰9ÕK¥—ZÛë‚ܸ£îÝۋŶPMTÑ$ÊÎEoM\½ž”bëýIrð¡'K]ñc„¿Ås¢–¥‹Ü¶«0²\Ì'#Í6ÜÖ®}yµ ÄZ%Ò?¼YÏq±PW@DþèõÞ3_×Ú¦úA[(öm;)ó¼*wçFI.ãè@Ã;¼me={«Ÿ‘·n´a­¢nD03rs9¾šØMŒ囃›ßŠ[ú¸ñænF\«<P|¼UÉ[ç/ƒ¥Y…ª±J[Ëâ‰]Âö&ÄŒW_ùR!H¬ØÏƒ‚g†ê Ðð©Nb&MTQ›yᦼÜ=X&¦i¤?n‘†imIÕ Ußr"(TàÙtÐ:Ìt*p`׬ZZfïâ}œUOú)ŒªªPD'iì&Õ=W3ËíÌÏ*”¯ð˜EWÇ@jÏ £²c­¿«Ev=Ûßv!÷ëXâfðßæÉóYÅ¿Ll蹭Ƴ:ÏêÿÓ‘ß 7†’‡Ìàÿ"øþà…œ^ÍŸZn?ÿQ¬÷9^Û¨ç÷3ýÜ?Ïê†c?kº…nôä1õî–YJ÷?n1’† 7dSªÐ¨.^q¶³²váy6 ¶Nuî1Î5ÝñŸ²¤|ø.ÆoÝÅù̽½oQW»£$Ñ [à$Íè3(mˆ¶ázÓ;2 ~Ú7Z¾2 ðGå|“Æ@n !›a·”s.yK¤ÊoûäÍâggÿ øö²Ùøo¤®[–¢Å„‘þ¨KÏÍíõÏÌŒ: m̽T,CPákáeØÑ º½.¹ö~l³¥ëúZªx¸¾.|§Á„êºV%°×rZiooýÐmÛö½÷7dù‘ÝÛ¶ëJ»ã± †ì°âå4!U.rqc„;n÷+§êásäÈq™mƒ‚Ä튭›Su4­·ñ% ÙšUÆi¹<Ä·Eá oI¹[S©“ñôF-gê¼Óƒi}µ/Ó„åE{üàŸ%qEó›Ä&7šFPÊ{ŽyÆïƒ¹Èj¹éRýÕn¨i‚É8ƒöÕŒ8ìé€nâ[z¿KƒÂàz»‹6Ò?¹N·LWVp š›\ãØ¯Æô¾…‚P†ÿ¹‡L3¯è¬ á³L yMdíC ²…À¯¥åÀÄóxãq ™°=ž8kÛmýÂ1Ve<Ô.·NcQÛúã®™‡Êí•‚""Û¨W•’nÔgÓÛn=#q]$+–¢÷°’䢀²¯îâ ÂÕ>gÀA=ïEÉiBŠ»š3©³P—ò/ÛY”Ý]‰ñ©3\aMw|DÉŠdåpê! ïéloÇaç×KUá2«Ý¬Û«kƒ ’†M7nõ–Ñ6[-¯¯\ýR̹c œ9:ÄÛPÅß;*ì, –À6“‡ t>盾 ø/´ô‘`ÚÀ¥½ýÒ˜ŒÖlÊèù‹dƒk’¯•@—wL×Þp©™‰RöqìÉY¹<,Â&"±®ÆÏä¡ìý9Ïâ·ÃÞú6ÝM^Ê4±Ô ¿ÊhîY®èªð U¬f1Î',Jââ¤îîÍ·Hñº< T“¯§s ‚[P…)Ó6½ÓÛƒˆÒfh•úÖž3wjy•V¨’žñk†´dfJ‰ŠÒY^7]*”›±Æ›'ò›†÷fÿç¬Äßë–w8 ù“€uýW–þÛË7cn|Þe Ê ‡ÏØ Õ_:§ºÂò̃–Ÿ–]"1Û™¦DRk4m‡ Å2Û"‚µÔ¸·ˆðÏõÕ "@õëÏ×ô´ °ÖštS™ô¬ìú£ÈÚ*r)VuF\×´Q{—.¹É–‘VŸeÃhÂ˲Z ¸DöÞ5}ͳ„ç¦ëÈö/ï¨væˆhmª c*¬5è6tf¤µefEŒ%X…º[y gu´üZ6‚FÞ"/¶3’ëÑTä¿8æ’¹7Ëy¹l³3:mû¡ÍçI@qM9\š3Òjþ /7Ë:Êi£B%§c|¯pG£\£@4½{LËòš”Ö¿î7 Ë9;¸Ô HSÆí-¨‡KxU¼ÏèJy/%‘^qŒHT…NT‡b6½¹7Í“|+Jùt4tI¶ìù‡âŸÈ¸›Ô.)Ƨ°jÔZSY¡x‹“òÈøašuÔî¼¢¦L@ß eÇð_Íå‘!þ:–C:ífùƨ30Qj-Pôx冼‚¦ÿÖá>ù@Ö‰+„ðWkW.n3ãïˇi D2ŠaË&eÛf"—ªyð [Ï}2õ¸Û ø2-Tüµ¤"Ä n™ÑËA% g|'Ó*Õd5ò-aUEU :œw5êwÂäµ:‹%,4¬¤‰tc˜—›&€ÓÌlóèÈ­Ž€qAU5ªF‰‹Ãô¥Ápi»®Ûtÿäõ¨ Z†w­¹Rßu43[Iøf&]{PYé˜Þ£/Çþ'ïw&†Œe©¦–'½Î³™ÏêyxÕ•¸´ucS/,eUø¸Â„w®0[;–€ÕKG2àzÍ‚ìÑ3p¤^#ó’?3?I–㙩k?¶K=óÒlsH–:Ö PÊvÍÕ“ ð³îN‘Íîžé>Y¿ ÌhûÜŠ{>l{n ”… ·ÄØI²‘µeµ{Ð5‚³]/Þ0Knž]Ç'FN„fêZ0zb¡æ»¤Ðöþ~lB.¾¯øF²ŒnHü]ÏbÝÕIÉ|þ’Žðæ{[KÞptÓVêM5-Ó† ÷‡BUÛ[œøgÕ ,b‚¯8ð]×23GÅdoL4g®|§:‰ x Þ…ß¶·PxL€Ü Öþ\Ô9?Ãu­lpN㜤öš5hrí‡à¹YíÐn)sQ£lË~,ÒŸUeïò¿ZçVþ’õð›ÆbÔä»Ûb;PO¦…yØ’š¼éoá[AM¨åÓÇä2šmâÝ›¸¼dB[]8Ž'`¡Ûþ¦ÐµÖZQÛ!Û XK‹k7{_‡V1³2ž&`cŸ~mô (Ž­Ë¹¤È ½¦‚+)Í)û«‹TÕÓá[«µ+¿üÙD}²Rß ü­ÎŒ@ú¶pþ¬Sÿþλµd|T›þÖœäÿ7ü·)ÎÈ˨ú堉µ®`"™òKno€ê½8ðTc1ö)ÔÔF+l.“‹n;Ùt[˜dšKêå{ò-ôÓ˜›ê,2¤!m[c1Y“ÿðu2¾XYäã1èÆÐúÒ¹ÅE™agw»+m‰k±Ñæ9ZéÈTVþzÈÝm-‰š°bç«õƒc‡ œêèÅE ÌD©h«ª¸rµ[”•¦sTÔf½¨C ºà¬UñÚ¿ÑÞ¶O˜½òùšmymt³çäæIYÎü.†v73†ÏÄ9þÂ[þá½|–chÛí­/ŸY,ê{û1ÇxÈî|߯þ´ÐâOz=NâÓoZ‚«þ¿þÏ×xüH¾‘¿D=©ó”þ?køø©;x†~‘¨{)AÔ,¥¶Ÿá]CHgñ—ÏãúŽd¸ÏÛ Xd^†\ªÍQ׺¾þütï½ [º°V{*í¶'€h@c=Á×ן尅´•‡O„Ô’°­ýŠ(y¯ÇÎr„~¥Gf釫ـw©²ì±äˆðå5c ‹ìý&ݛߜê/ÍG‰´=æ„s“'°JãŸÖ¥l£ 7¨¥2RêðÞMM¸4Ðn;ï†XþÉÃR”Mâ.ÇXR…õ̹W¤¢JLNîЛ"¿ÝÐ.‚ðTÿÑ'|ûÏÊðB"³¥àǰ÷IOP­ q_•Ñ Ñ"þ,È-²¬+iYë ýk©?T—ÙÑ“¨¡•ú?ÀKA¤A´~b )w®ål¢„QŒæÝD VµªÜÒŽïy¼aLü²vÝt.Ù!ˆ@ ÜÝœ®52î¨d“9$Õ«Üá2ÖÅ‹1‘F1£2¡À»ùð˜cj.ž¡°Ø”'oLCx SÓA¯¤…Ø ú Xaƒ›–—Ï$¹¥b®ïÊXbý]¹3ׇˆeãД<¾ô¸|Èi êdó9i_³0§œåSÀNÙ5õlÉ–”éŠèSCKòaY o¢GN5u_äqÆûêµú@}£¼­²tÖ€çU=ŽFUt¾.š˜Õ ¨d“Ñ›é½X9Þo±Ì#¡çîø`…kÒUÚÆ*M­*$}™‚+ÎåÆçöwG¬9¢ÀCÄļÍVò!D–Àê_sjš†é<[âÇN¦¯®m„Êú‹òG]QúÞ‘¬@t—wuWúÔ€ká°CÈ΃‡ &rQDuyFÍ:÷ß”ŠÈÎi;¾²ÖÅhªöp¸ äaÛhK#Óà|ò•%*Š)¿½–b'¨:’s†…£h-·7^â«Pü¨'Df°ïrS3,o…¥ÓÆÄ%äßn‹7оS|ÈüWp3ºâØlR!ï”oÏm£‡ìÄdÿEý’­>rzñ{=#›´u‡zïJ‡T>ÄØêpÞ>gï‹GˆÊ‚"ã›$QZ|¹˜cFˆ¯ÎkÞß(`ˆw.,‘-²-¯4NÒÎ![2+2ÔGÞ]ÝqÛj™?"YFk„cRÃÕ?sc~âb«gz/ý‰©ªkEÍG¤„™¤Èî[) Zm{zꛬ畉óu(±¡t)¥åmŸm©hÈo&m…+U^hæ~y÷YÔ)ʶxüfÇÍ÷øÎ Vƒ¬g‘ÂfeTÆgù8l€Ì‚ôÛWæ‰áÔÉC¾ÝvéS^³Í õf¶º%8¿ŽÞ07ÜÙDŠíM)ó(ÌLçˆPÞ}Uâ3±$2úsq ’‡Æ’JŸRpoâx7ø$;¤Òrºÿ¢oùÈO^(îw&ó{Uþ…*ò·íç;ÃÓÓáI‹xÇ#xÑÃù ©æ_R}ˆ_ÿ©§¼½Lÿ³ÿóÿIÀ¿¸üVÎJiÌýú•¦¯ë8C»FSÑ£ÙÐÓäþSøm ¤ÿÛ¦†ç'’=ðçÏŸýØì&p(Ÿó.jvF$è‡\×™Ïïæu}-Ù¶-ìó.á¹Ê&F>ö^mêßo`Üݳâ,ÔŽ bÃ`î-QX€xCàòI0¨úòºšõmb“ljUUÚˆßèå—ž¼š#@¤Í'㦳ÄÚ–¢Ñ„æÍPÔÜJúTê<86Ô•Hs¸¢x ¹¶"$\´;ÇȡԧK{[s°‘JiMG4×–K¬9—µdKÉã¨2„”Ç6ÛÁs0 ΋k»CZG«Ç¢ åÊ «&€8å©”Y¿7ÝQœŽ&3IÀBhÃþ-\ëËðø~Pâ; [´ÉÊà„Ð ³Ò#»“/c' Ý ŸÛ÷ ¦k_¹ú(Ý/€^ÿ›½ ¨œº˜¹ï!oXÛ$%1Dèˆ2jü|'µ,ü¢©7WÂvæ®mjF#êùÏ SÇCgDç!9¦DØãÉpĸ{ur¹GžÈWy7¨ï/œâ 3jÒç‹™iÍ[’µ¥×¦ið@ ºTk‹#ª‹>Ü"B,Q8Ì&“ô_¹´ÔIR·ímæ‘&ŽcÒJôG×UÈö«äòÓn~¦™U©e Hœš@ÝMÒÖÒ›æ[&•D³YÕÍ(ÁÙ€ƒÌâ$ Äq‰*‡-€ i0¬ÓÕ+®IJÐbô(±’ðïQ»Î^)‹á9¬Þ%äþóù@œ~f‘DGàqúNk§#ñEX=%•¾%z«CîÜ %ö­ˆÍå*ÊræÄ %YèH±,›œCçîÕ•HË â8Ñ•‹ž™§|T±4œç|µ-aM0º ¸HêºÖõеð§iÐ:7…ÈÖ‘Æ? “@·õ&ªüŸ!ÕÈmåȇ:•!&À [°ÌôÚ„M[¦”GÉßþvß> _Kʰ*Vá«M.,šÕ<À¥sBÍÔ—Óÿ°T°EàŸ[BÑV|ÚšŠÚc‡^ƒ{lQÐォûƒðK]·bÅsÀÃ{–Üö8?ºÂcÂ$¼w ü²Hðo8êñ4KæÏ–ðjü¬yü8«y÷ü¾'ñUð–­þ?11€—ãßÚœt4’<„ÿ±°˜˜FP¼„ ¯æB“«6ƒ¥ãhÚ„éȆ@¸ºËÑ-†Pz1„âVŸÂñwSôl{™’»àj*¥é/µŠ3ËÞ²TpIqJý6£GÆE1”Y ÷¤08Z•ß=Õ#×b«(œxjõøÜ¢ Vò¹Ší\yˆc·×_†ÅƒpS ) é1}ïy’kívb‡‡-&;ÓøÛm3khþ™›ô0£t"[¼z¯÷µèÚĉé¯^¤žgS~JEñí$ö¦Ü}V®§~T“ž•ȧ¶þI.ùš)£·ôõ†á¨R8Ÿ„÷bÚ÷C¼ˆmãb:?±G,î‡w÷JªÿÝ$à9qÿÈ?þÈçAÂSxNžÃqOß|Y樂M´À|ôMœŸr C$Ufè~:pC{ÁÙ»›kôÿUýšÓI× ·´;}䱪¦™H‚ª€{ï´¶_›c†HÁƮֵd a2ó@‚˜kªBÄ“SÌ}s»ÛÔÔyŸŠ•…y<ªd|lžù副§!ýôY¢šq±Yº¨¿“‘UK¶¸¥‚çJ{û9±’¾u>IÍk ¢XÙh…bhâÝ]œ‰VEœD’²±G2M‚ýì‡?î]%uÃÞü[ŽÂ|Èø²Å·Ž“U3¡¡b -µ…lö „ö»Wµ@Àu†Õ~â)R›Â€ØÕ9µ\OA~*|€W~GV3©ËdL¦E»DýÖÀ™VedÃr·d[¡/†^;ð`:ºRû±M—½@tVžîªØÕˆˆ¡“¯þy´Æú‡ÎÂùG‹#æJZk¬”ç#Ó"9f˜OLèò>Ußm¬xÍÁ²JnTQÍ ~ =jt9r¦Ý(<©“õ‘Å5We-1–þñÇSŽÕp¶k~ì«„9° ɳŽx›Ú y±¢Ù@#§3ŠUÕÈ…D*%umê,õ?Û¯9‰T|KÓ•dLœE³ IDAT`:²Û¥/{á—¦h›ø˜|ž¥ ^]fpÃ’Ä ÈO䶤ÌAp§@Š ‡™ŠÈƒ&Æ ›¾îr^^_‹ýdä>-ÕeÚA¦žÃ¸\“ó}=ܱoÆà‹>‚÷¥jtmÞ>Òˆ%nâ"…߇*TW‹î Ž«Ø`Ü}ÜÛª¤çÝÖÓ_ôµüäYP Àƒ½¸ÊZP`êƒxÕ:YÙ¶CMŸ4òD·ÿøp{ÕWùl¦ÝQºò NÔ?ï*äçï´Ó‘ûnj“®5÷Þ•ó‡¦wK].¼ ÎÓð[&\"‚½åÒó7#æ–ÎP‘¶Ï‡%"áY/Ž>÷i†›¦—’¸€çóˆgo7²Ã‡²c®tš¬v%} !‰H¢8úìR9n‡x)d{ù«¸í·aAE³gP}ÕÞ>1~-)aF/®xc謃"ŽÑQ\¹§ÀÒP¶8AŠ ê;¨¨yT¬…¥‹O${ Ì›ÎõŠÝ(;+uÃãkצ¨·°x7Aîd´±ƒ§ÎHš³üÏã€(÷^FÛ·És3´Hn^³t{ó€—¬"÷ô”2³·¶hæpXü:1YWT˜$7왈slD8¦c8!Çô+³KyiåÜ}s{%QäµÅZÙÇMÒyW•WÝÁÏ÷û|”ÝçÓ‡9³,w”ïYÐS›ú6˜œrCæ­ÉWúŒß4ã04†oÙGôìÿç©!.ÉçÁLlJ)OѨ7\òåe ùkX_|%÷~,Fü¤{ÿóüÅ¿ü:ñðvð;<ùï=àßü„ñ’oòïøžþÞ  Šycù-‰R+`m™ã"èî±~SÂD4ž…‹y¶UᆮTË ª1kU Äx„0,Qš3#ut«€q†tÕË_&çQIƒ€wSý7‘µ‡FšžýÍ*v„ï±C…ˆë{¯R`†–·x}ã±´]1[”FqpD<$6R´ÙÂ+rª£ÊæÄÀ!Àv[µ¢x Œ5"¥wÙ{»ž%®È>ˆ&8Pé\DDÑïì2%áGE•ã©`7`âX­sW;89¿h x·òþâo¾üëwqûŸãùÖXéŸ_ÿí!ŒçuõÖì[Y·ƒY<¯Åoîã;bÿ˜ ýöcüôø_†þºioJ~ßÿÙßÜžò±õ÷Ó’yÅü¿Ç’’¦Âjj½—˜ eÛ~<ö×—·|Å9Ë¿v&á°Æ#ýÒ%:Üõªè6Šì½YQnr/]’í¸ƹÖÞé ¯ ñ¢v{ÈZ)•5`Ö£­~XL4k-¦ÿÆ%×yìýpÕ¨ÿ•s-_&+¿î±ÔŒû…)p̨S<6« Ém:{ü úˆ$BK‚NHºm]Zk‘|îÄÙ¸×õhƒðÍõëÖBaÛú“§”JS7ýúúÍ ¶F`å  K‚$|×ñ©N‰rVX X³0Yß…éNiŠmçAm’´¥ºÒåTäÛáaìÓ+ÚRìªD)À’E·¡‰ˆ_9mÏHFDíkH?ž.ÆíŸ‹ê çuhUÑB¡hF¬Ñ(Lß@Lµœ1â‰sGãÀC‹1a1íÊeb”µ‚°QB‡G“Àö³v.eáÂÍI…é¯bÙ·q2ðܨúýx¨Àwnµ/ e†¶ΨTÆk¶2)A“H½ôuå)«2¹½›¥¤@¡€bAT¥·÷Q  ˆbqoƒ7‘-9Ñò·¢Å`{ç¢àQ|÷ZvuÓ ßPm>GQ÷J§Zà œšz¨7žW•(¢ ìÔn7!Ú¼ˆòœ¡}t'¢²7¤mu¾Y ¼³žGü}ð´¦|̇ٿÈjõ4¯g)Í.Ñ-˜‚Œñ#ìÇh‡ zØ–n]bP:Çv…s0î×Úd)ÐzóJ.Ê=‚±ÅÂp;/¿_©é•=u²ëUýÃÈ8$÷>Kb?‚ìÍÚ”ÍÌÖ¥óë.#ÂKâŒhÎÊÐW+ú²Ïçtì%h£:ùÃÉþ8þa"ß*Hûü¯ÛñEð“|ý4-`Rf?Kwÿ«Kðîeìb¿aºÿ(Ñ0ô/¡½P€þ#ÿƒŸ ÿ~’ÿß´žïÚù/Àrc»Àµdiä~%„þäë„­ A¨w¼~yÉ9zSƒYK¯Ö¹bSà _H¨S[—S ·AWnâWpxö1œfz°òý}° O&B˜P­¡œ·Aª °ül½x"àÃY6ËŒ[¨Å?D' Œ)¨u]˜ËŽû\œÔ¾K©èmiÍ=5uDù€ö®KçôcF’þGTQÝ­'¨VÓY©Ã÷0ýÏÖòO пøQ¤í²©?¯TŸÿç§{Ï:D¾½ÃrFìÇs T™cÓr/ݽO,æ©ò‰T–µ·±‰—yˆß~Ÿ&Á})þ*ðщÿÎô+"^­ê‡Óâ7‹å5ÜÓi˃?÷pg΂\Òö¶¥ú¥EÃ9  D`0ÚÞ®„zv¾ˆÁ,…+‘ú"æqr((*Û6M±´Lñ$€ëë2ûïn—ÉhþÆdA& ª×ª!àˆÜŠJÚ¥±š9¢à1 ÉE£}ËóË'Àí¼Î¥†NÙJ窳YZ`MHðíŸ_F`Ç jNÝu}%¥ÃhëÊíÛÆaš&«|úƒâÔ’Ô„Ùa¶Š1ØË²ü©jÛ*Ô<\1ñÈ¥<*u-èJg]¹G1ËÏ0I¯¨Ïæ§`%š~35ðüöãû±ÅþÇן±©Õ(š´ÝÛ÷ÐÁTuåÑ&ؤÿJÅÚbî{Õää&…9('Ç©=™èAàãUe:àœ¿nî“Ø,ù ŸníY4»9ü9k 5™Öî&s‚B% K”Ë/‚‡ˆYMØMÃsieÕF 3C~X‹Ò±˜Û¬Úç`Fì<Õ®è9A¿-ƒæVÆäFä­ˆQrdÌóõ:†Û®|h ÑŽo²Œ§¿6ܓ̚ Uè‚jU6N—80ët!õÉ¢åÂÅØ‰~]*k¥þr"¸É›O9zK‡ˆÅ’e›ùò¨í!øê‘^ÝÜIÕX0èürÈÎ1›”È£°æ¸\ôF&R4e%·j–ç‚õ‹hÚ¿L¦Znƒ{ œ“0pÉêýffŒÐèáá”[†±R[Öœ£(·?3®U•ùl :|Åãù0*>µâ ®¿oVmûø9˜·kBoܪ†õVs±Œ›«>ã1W’_â?Éåê˜6Mw—âÀLwêyj.3nV SeV²ÉM^¤þ»»2¢VyjÄp2eZµyüŽP9Ñè3P4Ï °Î¡ã«*Ô²¾À%ÊËY!bùSŃܴ+Õ.¦èü0£ð‚ÎÝKËIÃ^ÎÍ}e}M݃ ïþ²ïmVÜX Å>òK®ª"÷+V2+ëÃ#‹cS}?)ìíêUÕu-ÙÛVÄÆ¸!ÜtÖÒc7EÈ¥Ëñ**ÑÅ< }žNŽ*.D1…”/èCë,Eî8SDUiæ™ íþ ÙÉ:#iÛ¸89¯ d ŽÈz° ßFºk¼ü³N{ÐðNá½éþ™Šﵕ79ãCó¿y)ó5D«.5ß?Ðà$z;ŽÜ¤ìŒ¶iv#û dfFå›v™bs_u¿rZ¬ë¿rËJ‘˜FUWÿc-°á°¨gfšKÚõìãï|€¦™ÜAUɇ¬xek¦_6áõÐŒx«úÛ§;:`„Ûq=GÁÉZšÝN™9s*)Èh©sŒýljoéRÇm‰|›åÐØ¥V±éð·LBXë—¥å'1>Ï1¨ž8ÌúAg¦Ë8k-kQõafI)g$Z™¨Ìêˆ2XHz=c½Úb0×Ó&÷Ñ6A1ǃç´Ú¹÷÷‘ãœóiήÜ'àÃ?ôU̹o‹§©UWOlÍF/ù‹5­×a¨r[r®P¦ˆøŸÛxUiöV[ŒÏ^'²®C$g›íܼì—>ü Ï ÎÅè ½InCŸÂÿ!³žóùkýÅCäó8æ© ’oÃwú©ºž_¿ƒñó’ú\òOÏ(ÿö ½ ÿD|á¿óÍâíkþ•œõô6½ &ÄU›‚ÃdãqiO‰…ß÷îgA1ý¥Œ€xPm =¿8X–F¨…æn ­ §¥Q~' °\$(<@Ùüܸ%Þ¸™ŽÀPtÖP !õ¤(lhð'OšUC±ª^ö|âèNñw{ú!b›¡í*}^æO/n¤yh4œž¨›1åœxI&^EçEFËò˳òuÔ“3½ D:œãÒªü­óM7nŒ¨ç’Ve|£Eé}}ýË•öfŒÿEýi|ýÃâtÈÏþžÜøŸÉ˜ÿrxùùïàsÝ}‡‡ŠzÖèq€ïZð¯¿úô8|TҽϯX<7Nÿs`â·, ·ŸÊ3±ééGâ©Z¿Z­ßÑ}^,}|  ¼,"þáÍ^2?¨I,¿[Ô¦$øúA`c •Rië]~wôûúÀöÞ{»žîª¯»“-šÅ¤E?'+ úçëÏ~ì½1ÝKÖê”]™K÷´UuE¶²tužú"yÍ‘. ÷)! …²E›Hs7ívÆå¿µ{ (í-¥©Çu7szlFÕÆ¢:SÑasÎÚƒ ÅÈÛ¶~ØJ†ÌyÂŒŸ‡UÕ(W,SªŸ‰6Ës„µt(/¨ýDCÎQhtffYÃ¥cÒZè|k€¬/h­™KB^ËS‘>Í_4yzVPcGåZ6ÈBy° ¢qЇ5³¥9¬¬ƒ™¦ÒÂOe]×µ–B)Û)çF— U ê:g„ÞþÏÿû¿úîN¶o@ö%ë(j2Ö£-n"÷¾,uRÙB —U¢»ÜÚe¼O>‘ƒ•é‹€ˆ4ÕÇw)ªô‡¶jÐB$ù\ ¸ ¨¢c7#3®ý¹ÊXl^¼ìGg/öas°Lÿœùá»[ÆPÿ3Ö몰µƒ¦5öLbDA•·®o¨yœ.¥oc$ÒçŽscF=û*TÊR@¾€(tRÑ ã&Õ«=2[”‚©§ŒmYˆË°£ΈW&IѧìP~Žòt^Æqþk ¢¥¶ÆãûLUÆœ4<å4Ûå[BsS;FÖ´JXh³e0e›,ÈõÂ"êóÓÍ9A ‘q#¬ç.ùû‚}!>BTÇ%ôÓùŸéQ)5×ã•ïCÇ«––‚ã`Ã.öòx>$€».G¨CþžÒí”>È"SÿŸã’©ìòq´”Ï61pϼ²ÜZòƒÚƒg6ÿGƒ;Ç/™ž|cªÓ;Á‚¿TK>)?Œ>ð“ÿ}÷ñ?áÿ…üÛ'ø¿ðO3Eøß7à kð$Œã÷_├ëxP÷Uïfóˆä¨*/ÃMµF[#àmµtè_N™mCW~æNy Ưa©‘ðÓ¯{ÊÝÈéM „ã\ýxgî ðdP/¢Í)cÛFQж¨¢¼ixžX¼|ƒ¿iYxÿg ù!;Á‘ü°ó½Ëþͧê¦_,“×Óçó”1H ßpSÂwí ‘D.~­u|_©§«âº.Weùxô÷k´mýõ×coþñõ¥^Jî»\ Ž‘²7œQî:¬ëZÛ k[¸ ËK¬˜Wÿ®p“RTÕ¸ƒL鸵½Úïš•.¤jÿᮽÄ#ZÓ]?av©ï:…ÌGšÁäbx”Bí’j$Ò0ú½º`Öïd u ã˜MŒ1¿ ÑÆ2áÃê0”bY<ÑTª˜˜É6%V¨ìœšMœ©\pµ¿ ÁrÈ= e' ðÒ­ qvT‰$mÙêÃgbͩ΋͈‚¿’J<çR.y Jä‚.œx“éáѨ^ +™^×eo¯aˆ§‹ÉRÌEϱ$<å·-šêå`·ç¹E¯¥º.QÓ{ÅBé…Þ(¢ñùç`¼ÏQ*²RBŒ‰2©—°ïÙ&s# ô$¹„Lf‘ÕU˜“w­B^4>±‹xf}S¯ÕMo’Äô9E¿²Úƒ³îÄÚvnÇ92ƒâc\4ìL ~¯§.ÀVŽðb(qž€%ã—p‰z7†rfN|“–þ‰2M‡RàÉ •• DÁ‹ò@œª·>]Iºæ=;PóÈù…ú³T‡-ŽÃ±@€ÌÂB©Ðp‹p[gÂ)G8%æ2À ùéÚPKjˆÙE*Õæ=Z ZS›G«u±ï†VÆÖÒ“Y¬Yj&]"¸cYFíJUlj¼ *[, ¢Ù]ß›„¾f§3ŒƒÉSöîáp•š»ôo¥Ìí1o ÒHð©ÄXNˆ¾+c·'U¹†™Qれ#J{Qñ­Òˆ9Ÿwˆ ¥ÉÓ‡A%Ux-<\ÕðÜ›úr'ýÄ~àXâÒ“‡¡ÄÏý#ë~F+øˆ`Çw¸g7dþWSìÆ5ç#¼´=V² .z,Ú· ÷V…®ì2 Àñþ„8Ÿ¬GiAýäµtöÒ<Œ›[ˆoò–ØÐ¤Ö¥k-Öôä,/S]º =øˆOp÷ž¾µæ˜l›$w…÷]œâYGðu);.¾æéa‰x'o] î¼\4#¯˜<\î±J¢H|. Ëù\Žü€’¥ô&n°£ð±­ôWTñú×òê»ýØd— uIœ‘¡±ø¨:GÕ½÷óé`)Žm}rº|« KVL£ä‡{[Pd÷rêî Ý]F!™B^—üBIn/ùQÐrÒö))‰ö_ŽŠ›¼rS¶ æ ÏÁã±À.Ö§c=HÈeÜÔ½ѸÌèQ¨°me-neBï>ΰî€>ù³±#àļs;k¿ÂŽ¢Û¶Šo«b·Ñ,ÙfãŒW7—'IÙí$%¡N‡xµÀˆ‰MÙ·´êÁÃX~eI±¬úþ׆2;8´ÛcÁ1ºK™¬JÕŽ‘¿Œf/¿2õ<¤*’~Õv¨Ë© œd|VŸˆcÀÞD ›¦\ìMOM&0wAævr7õ7÷õìáhO) qƒF£+:?¼iÌ?W:Ñó˾˜û¹žG¹ÊÍÞŠwŠüퟯ–ŸtŽÏšÊ«¿ýÖ/‰¿2[Mÿ¾@þ¿Àæøw/þW¼`þKÿØ?ý{ùNûÅ—8h]ùÐ(Þ~†ý蛾ù´ Ý-×òÚ= =gï'¯-¸¯Ä#¨n2X+6ý¤6QÕÊíײb›eœÌ'pÈ1ü¡Þ…¶UWèë Š¢ãlüQ@Œ¦"ŽpŸ¦¬æÍ=îÎ-çá-ª‡Ox‰Æ´±WK 1©XÍ¢P,>¡NÅ(K¿èq<Ü~µËT©xï¡ÈŒDµ²¶(V Ã8k’ôèBýUÚjçµKö Ú´àµÿƒOÿY$ÀÊœ6=/y.ÌÄ}&vDËòó¼dŽû?ª­Þ틾½Úgí6ØžÖí/ÍòGŽ’óÑÏ_ÞÖÙyßÜ¡@÷+ùèç4À …ç)ÉÇkýWkós Μ·ÿòý3ýå¤[yž–}îrsµÄÒ̶Ñhi°–ªÊ=ÿs(t-½Öµ–úÿ¹&Uuš†ªbA|¯åž c˜q›ËôzßÜ×uýùÇOM,]ÛŠn,³‚4)»¿:&? ™ñIÔuTìøÉºº(›avŒ¿²Ë³Bá~béñ+'$btþÖbÛ¤JœŸù|ã¡ ŠÏÈÛ†5ù„™mæ‘ò¤AŽ9ÇroHKÂiƒ \ÓÊÿ›ï¨sÛU+檔Ä9A’ƒÒTµ q…Y.žõ3ή–ó @T•ÐqA"A~àÒ<óD&úZëZzà ¥Ž6ÿ:ý¨IÈÃÙÈiº÷'/w‡„¬¯‰ƒ"¢Tn‡íÖˆ¡ó箽SÙ²š3)òº€+|ÜÛrJ‘d°(À‹ºX'€§wÛŸàÈD»žZzgγ’”ºr_¡™ls‹\x§@s‘¢çdõq[óÆÁƒ<›È2¶,k~ƒÖ¬¼bˆ¨^Ä8ë®jv;t ½zš'ëV1("k¹%#çYÞˆ+.„ ) 'n(¿ª-°ü삇梹[aB½½^ dßc°ÉßsH[æ=‚Ql µÇ“bÆb©GçJƒu.Ÿž&PÁò¸éØ‚®TwÒIˆ £‡Þ¬IáδjƒopÚÔˆú;…A°·OWu!'¬;iæ¥ ñäIÿïìXoÆLÝçáó,ÚF¿Üý-ÕIÞŸ@ˆ„0׆4u™Êï:¥“QíPŒ3Mùß1!BéÔ†OÔ:¹UÝ¿õq¡Ú%ðƒ¦`Ìý Oý¥>wÌÔ×ퟞVÃ(ýFÈ^¯3Ú#qá¨ÌNqyÆÚûÓC%„W›¿³;æ'p¨7ú‰Fõvjë€\×r¹ß–ÖToÔÿñøfm]ºUù‰ßÇ^ô£Ví„x³žÈÐÂÿÍÌUáY_è(½×Ÿ„*æß1­xç®ÇÄ{z¦ÿZ–ÅùÏÓƒŸ“?·ù¦ÃkþÆ ÷Âï>YüsÿÚF&àßü5ó±â® IDATc²Êæô·?dJ¯½—)¯óöÀ|ž‰ð‡¢zþf{mëÿ´HòÍ–¿M è¿–ùƒîÁ·°|/mrôh£#ÓxL=c7¸°RÔvð…(Ú‡«ªºô’kAu­šÃæ•㣓è«û±ÿúëûÿøÇÿ\_aàÚÛ­TJqÐûÎn.H"Lèm&‚ôžŠ¶‰§nͯ9hóŸ=Ý®ô:Ù£0>(‡¨Ûíb‰Ã^qiÐtýA%RPŽ*ìvøs-¿/B˜HõVI¹:¤Ü¼<”Øñ:»·a&ýµê,7ÕÌfK°~£1ç«P¡æ´_ Põ#n¯Ì4šíü0¶÷j åû{oÚö¥“•3¦VV@ =HBªCÀ€=£Û}}ŽO­Ô<>eŒÿ…,-êX@™tƒ´Ë Gˆ°±ïy.Þ%3ºö&¢P¡™¹›<§ÏœØÌ3›ÙÑ“1oEšÆû¦±šIhêM‚ÀvàT¦‘Ù⡛߫Oü)Ó›d‚£‡ ÆÙå;ýCIdE/¡\ÆG™b^;©*Ýsâ¿X3g’·#q .–l€Ê5"zè*ÂiK3¸ða r´æ¤~ĘÜH˜5z9¥ÉªW B]IãCžz©º²Äî)jÞ"Q*Üî„ÂÛ ²¨<Áû1gˆr Ÿ°E¯x|æbY‡U¼ÇÕrr6&ÉȜƒcá¢ÛfÚs‚Jòú`ÉŽï5ëÅÇÆŠSKKET×ç8 ¿ÉVûmƒ]ÈÛ‘ÛA¹ÊÇ^¢uìLÚΧã)™_C³'Ñ-!¨=\È&Ž=k!ÿ)Ôä…C8†6ZÜ[Njp÷5 ø5ì¶_kkhUô Ì¢P÷´µ° ¹‚­‘8ÒÙñ.#€ÈžøZ=—b|ÐU)éÿ½TAhÑÛ*ú?þ|=ÈËmöŠ´ßêMê1¡ï`Š•ò$¿”ãÒ×ü ¨˜-u‹“hE*ÖÒÇÃö¶ëZ ºi$›Åáz±^__+à?ˆÙѨjˆ3ÀŽ!«ÌêK|$ÞNÙd 5{¶¯–Ÿ›ˆb!j¿7®¯‹]×ú³ÖÃÑbð¯BÕûoè'Js?‚k3{Ãxå*°£ƒ9îG$„-þïM„–|}]þmGë_¶í±<̃.XºÜjï?¯æ•¢¹ùS×y £wôîÖ›ûÞÛK¨Œ  Éï£PEò½ä É3†4ÙL‚µÖRµüEÍ@$œñxpÁ#Òé:DêÚÞrólœž£èp™I€ÝÖ¦GmÞØEV)׿/CR¯pMß`u46våJEYÅ@:LÎÛò¦Š ©Ú{GuæÙÞ1TD×$%P M6u"_ ܾ´Ñê•ðXã=´baº”sËüÊȾ;4·Pó,ÙuƒOãRŠÔVsôt3_zÊ™˜H¤ð ëb)û›Ù[»fë6©Ò..Õ¦ÛnßpSN¡U•Y‹Ê]º<°µÛ2jäŠò30•R’×ÇY~>3ƒ>µâ©Œ(Pam1­'¤O/kÿý/Æ” Ï Cg=0P¸dpÒªy¦Ž†p$ øQ2;Æ»h—ÂÈÙ/lý<?õ0¿³bÏÏ“¿ú!(ËÊ<#ßÿ™Jø·÷ÿßp€W4~isµ„ KïÊ~3'Ù›3èn¨7-'yoô×JŸŠ'’:Yp¬0Ô¢:ûjÒ`Uü)è%‹×•{[…‚ÃZy[;ºæ €è”ß4¯Íž%;5UÆž™~?'T; ,ð¢j¶«ßP1“Èz¦ÝEøg8\5–X>8Ô›Êú½pèY ‚]ƒ“  Ô"`f¡qM[úÿüÙ>no›TÌ]E€Š,äáôN»ÒŽcLokèK›å Ï ÷ôÃóÖ•8]¼Cæ›iƒd7¿gŸ,zÑ{ÖßÁ‹Æ•As–Ñ1à[™ç®ÝwE|y6ŽxÓRÜAäùÒŠ¯2Ìf|+Ê7ªÇÚÿöVåÿЖ ü0*¸û/~]Br/ú…¨Ï7S¿1x^óñù_¾ GE¥®»¹‰H ^*ë`ÿqùrÆÒy+±ìF ¨Æ&äºkE·jï ){Ûöoï|ƒ¿m‹É_ßßž) kI"ô™¶ìkV ª¦„®‹š†m7ÅÎ.{B"T¨mn‘^€Ñ[ Ñý§ãÆ@’g×$ÍIfâ×ÔŽ6#äyòû׬4µƒJýl[sìûð¾øßÜ¢Zø@2žª™°ÍVD°DïÝR§êvÑFs ʽSý÷©4hzLY1åÜ®›ƒ”ÿ¸¾àWNN–O·ãÚP•ñ¢6æ¾Û¼Mú mfUJPZQS,n33škÊz?m†vŸ¤5Ê@ï‹¿T¢´LëÞšš–òåèËâOa-v†)b–Â|æU.iÎn”*P PêOvVÖÌksOvn€³Òmm Ú€DÑ€íßSPû˜Ü»¤5³ AD5 ´GÁ›BuCè&ÝŽ2 ñêì¦%ç•£ó5öÀú2XÕ› ìáãÖ%‰—ö•O`Bè"„&9Is!Nû ®„êÜ ‹ × bI’•%MÚR,7áÝË7´Ýöº·k B½Y^(ÁMjŽ/w!¢e‚8|Ô£YˆÅº…;™Aœâb07¿„$gÛd€ÑžÔÊl<VÁPçÌ9Õ¡:Ôf5ž…$Jlš•RŽëza™wÓ¨K|ÕQøÎk9@pƒ»mF¦“~2M¹­Õy8N:Μ޷=ÿŽW\ñȼi[5˜A‡š¸|}}} ï°?%/ïŸÈ7¨ù¼!ÀÄÇ÷.Cc ľ.mSx߈/È}P®%Í¿v&÷þËliÌQžë%»s}œ‰âù=¥qÁ*#Œº÷ƪ¡,ø“Nòª¹œÿŸ÷¯‘Z÷aÊ<8دúuFA:&¡{?ÖHxx Qn{ ÀÂÕ›){V~ë8ªIØ’úˆŽQÆý‰%ÅÖQeFëý¥[,àˆ1µÏŠÚiwIŒGGf¾L:23áXªQ“p°¼£E7nŒ#µ÷×]·~wâ :‡äMÀ²]ø´×A˜¢Šå‘¤ γ: {§ƒÝK7´¥ÙÉÎíjwÒ!ç§L£<±(Ç 7ÿË»£df`ĸnç(àPÿ³e9ú©êñØÊ«"ž© ¬šæ°žx>ï;LJÄyÞ|>Μ¨cy¹]á/Nü¼3ßgÀÑ }¾Âà –Í?}jûE%aOdš1ûƒ1ÕÿôÚPxNR†˜†_‘±$~œ¾Xvp\ò¿¯À‡´ûÎxKƒÿ,uÿ²!àWúÿ€yâWü;Ï ð õó¬ÌvGˆðïöD…Úq)Õù'düâÿH—¹|Óš~•dÅP³ÁˆåÉÁ¢mß4ø$_\û‘–:iÛ±²âŒ^,Ú6]"\rW©€KoÙ—k&¢étïBrZEŠC>ðhµÃ„ƒ×Ÿ˜Ï±`›È’:›"¦Þà¦nwâØÆ(¼ÿØDqD“›S,úÀe4ˆ³J¶åî§QV—…É@htcJNoÆ‘¥æù&ÒáujøõmgÍÖ«ÿ® xþI9Îo÷ÊÙiˆ”"rß¶ÛL¼q#Ë¢ü°½óyßþºþ ~±võÈ_Y´ÙÚxV®Ô@²ÀàÝ'P:ðQpÜ×$žÚkñ4;‘WC_>aMÝÀäùT6?±[òKÿÏD ·ÌýçÞâz~ÍçÁ«Ü~ÿ°zþ]ø”x»»ÈU!÷ãsö ž‰À86¸Y* 9Y¯¹÷‚Š è@UFèµhž<07©¿¿aºÖýõ}]FòZ×z|›¹ùØ8|Õ¹ð{#Iµ ¤§ (Ëxݳ1tcaœÐ#4"ÑGÒ³¬®ÓZA¬D‹c«D¥PŸŒN9ˆ× ±(u„Þ*Wy98 \PYu’FK¢M–VŽê40åQ-z,[V†gôjý°ÃÅK¥#/Tå˜gÆ ¸Yù!Κó›¯Öò‘Çû-ÅN-€Ã"ž3¡ iäJ¿\p Ô{ç¢þ(Þ^¹–\PÈrt>c! ´Lã‡Wó°Õ¢<€:¾N¢ƒjŒþÇùÈÉÜ_2dÙPë¸(5fõÿ°ìñ„P¼´;3ÞÌ Wt Å5ÆxxF;oFdçlu¦/5Æ?°iÞ c`ÝØyh¢Fæ¢oCÿŸ{;–%ÝvZ"ëyë& ·Îüì½ó!äs*nmªK–ŠBö†pÙ4IvÃÔê-„ &Ë럹¹Wp½0Ñò˜à@Úû©*žrB®_JšâIi$¦¡¾¬\šoR0ôñRѶř¾ˆe;Žö$ +%Fo ©×7’“QU)pŒCV7qÛ)q!Öù"TÇC§—Îy\îTVK“LFÜ i&T±øÉq©¯‘ÙÅíÜŒì6D•"æW†}}ã^kÎRïa¢*œ-Qç1Šeú‰±MNw~À½ñΖ9¢YqÄjnŸ1ôØô±¬š}'AXˆ/4͌ŜÖ㘓ûÉeDÔ–ãðqpøgk›àŽÓªrxa4žÄ劀Þ–wÝWÌÚH)ÛÐõ>E.U—ò8¥®; k¥ò¼—¯¡ÛÌÌ…AæBzðÔA9€‰©É×…6ä6 ÛÉKT]_\ÅÙ½ÝÉIçÏ>½Û‡XŒu35ÖxànzÅ]7S…ïšò™vßÎeæºÝÄ’ë˜Ð™l³K P|Q7áóE`ÀºAȱº¯»”“µ–êaøµH‚· ‹§y“Fnº7‹yuS /—º–=D`›¼ø0ÙKöÃtõCÈ}Üv‹ýØíš:˜¥ôs©boK>>Ìø™Û ²–ÊZÂéƤ‰– ié±Cæùv´S ž=ÞÁuW§ùG´#Q±Ãd· ¸À¶ùæ]¡Æ®hÏŒè½ø8©å5çS 5­³¼:“%{LãüÁ£µcêºÍ©pÄzúBóÇ—G-ý‘GÉœçPÜô1ªs©ÚS§ùˆ9roëXw^dVóô¨Pó9%ž ì©0>ŠƒÃ{¿,XÕÜ,Ü¿ú…a‹íPŸžqߨoáªÞãˆ>½EÛÙMI8Ž¡àQgýü]ߎã^$ù™†#™ßç]’ãiE’'Y<.,ÂOpþœ²D?qü79ï,¾“hó«mGR­6ÈgÇñÒ<|±îMèGõ¿‡ò*ñV/ÅK`$ÏC1¦‹…w{è+3þSPà·JõÓ$äXsôÅÓGÝóå<ân|(ÇÏ“?²k‘å#~çï¸úù–Ï_j(ø$)½«üŒø76Îÿ^^ú]ã¿ã¥òé¿qïþ±wúC@ç÷^|Z%z»d³ëçØÒ‹†?9ÒþæD ” ªB¸¬hwt‹eÕœJm;´YßÐù¨:]áBÙAí÷‚…ŒKkßÎm¸ûn?˜Êª(Xˆ9²ÃÊá ª•»ºÚáB?‹A/äcÕáÒ€†ÁÐ͆‘”MÙ§<»õ¤-&Ä­Ú—Á"&"§’¡H éVtß ©žÇ½>Y}aoûf¼¤âðiå÷²Aya/ëûóÏñaÒ»&Û—S‡g¨ý;cûø;©íÁ=Â(•ô8þ¢k÷þÂn‘’…­x-5]k®4Ïù}seÓ>po¾} ïf?Žâ?’>½ã§ÉÃ÷ünÝz™‚øUœ•Ï?ÿE,àj*x™ÞZQ½R§3S¨fa(›p· RÚMÂ:ìhîâÇŠ’_t°h¬¶¡koÛýô{ïÇÃ(þÇ×µ®ÿËì±·0½ƒŸ¾_àæÁDµaK ZQʤ/80RÌ𠹟‚Z ON¹M0„IR¦É‰&@× ?¥ÝJ5`Ñ£âœc Ûv-'¸äÍ·× «Å±'¸2õ…j ¯ÇbmXd• t`ª>+„^•îÓiäÈZ†È÷ sxÐZ¤íæaõQùhÛK‹°Xé¨'fÚu0Ä ¼ÒÔâõÎÑ¢¼ÜWG3fzcÊÃO7‹&*ÂY—ŠboÏ2PU/]_ëÈNÛuÇW,@€ ÅÒõȇŸˆ‚ž¶êŽBÃ1ô”Á:ö¼M“‡Øiè =RÓÇ%óBh«ræ(ʼn@TrŒâö8Ӟ¸©== élÙ7+ŠàÓ³¼ä Å3ú‚¥o%pØx…Æ%+¦ ljù|« ]ØQj·½Z¶£”¨b‘‚lçÃÀÔ**–b\Tq©‘¹883!ÂŽ>2¬¾gì)ͶŠbÄ‚Q”jjpÉüQk Õ˜–!«PM”„ËPQSáÃjÕê3zT䊃8úo¶¬ù ƒ ìŒ'6¬ à, ë\h9TA”9$„¹ Û+І<]w<¨O$' j³hûAµô2g¥…­€Î‚ñÑó7£Ã¬^å8nÔ¾ØZ¯Èû! _.`fuø,ë’Æ¨*ÜZû²Ga”sö#8¯„`Š6[ ¢Òɘñس3(/ÌNÝ'“JN|K ó¡¦%k;£À‰ß ¯P¨q ñÞóí%\ùÓ·Øê¡ ¨Î`ÑÚUýoò e¼zê;«üáðVpï<ޏ°Ãî4Ð` cŒfmà-@±‡"ëRR|FìO„G'¹OYjî$GÓìYJ)°E­õCÆŸ/îÿMÄ1z®o}'žÉ,¿“íÁ‚| €+ªÅÞ9~R’}Ðkýy³±Îõªõ÷ã?Ûõ<•¼ÚÅAT/¸TŒ²Õ)Aõÿ•1 qÊFn¹–º=ú±4‡~éRÛ\áYA¤`;óg'Mäøh<ŸgµRˆ‰,¨\‚¿¾;o‚Ã5i¤?ñÈmºªbÑ!í¯mÇ…¡Kzn"R9ºq ØÏÑåý«‘ ?õÛi~›wôva!4ÄÊÛ—M9–…XmÌPäOÇ#k´Eùr Ñ]yÛN"g»ÍÞ{o£7@HªPÈ¡#û+¬pÙZ+'¬j޵ŠÄ³I³=¯ìoš,½¯ûUT%%U[ót²«¤f\CR&MT¸Á¼ß9ãµ ­ Ÿ4àŒx©µBq¿T]vÃjÌp %ÇóG;w8”¥H¤ý$”.¿°·’D²¸æÎSêommšL Ý_8Äúˆ†©Tö\ ¿_NËo5&Öx'Lâ4Pâu®êÅšóTò yUÐöJ×>¾(ã/å‰ç2À'áò:=.|Dȧå*bxúþÆ ¯?ÔO<~üëó£D¿!‡ó? êÿ¿s<ðÙWU•ÿ /uÈgxÝ>ý‹‚aÔ–qúžÖí>/Çè–®Î{M®‰³“¹r£lBÍÊDErâì”`9;¨‚lI¹ªRÒzjÜŒ\‚&gŸI›]=VçëÆŽ/¶øenߥ%%Œ´ePÆwG€°‡;œ{z”€ØšŒ–GÜá%Fª;ñý“Ï4«^Ú) 6 glƒ:*‘{̃«rRŠ9au|#ÇòIl=—ÛþÇe{ŸðÕÛølÌ·´9Üû+Ûõp ½”õorö³Æ}û×ßåÞ5Ä€„Ïe<8Ú ò#òPä³àmö^o0Á0•ðæÙÁù¬äÜê3N×þ õß`GoG/ŒüÏßÛÓ¸á9€ Õ‹¯~ù‹G׋ìÅ»•òt0ÙáM©2ÍtaE×n™ ¾§&!ó8Ši¾>4‚œÒøv­/ €» ô¼ï·—™Ð½ð5ÇS|}ýùÇ?Œòÿü×_ߘŒn©²Y¦$—±R5åSÿH1fÀB£¬jw?cƒ‰1âp™;OÓ‡k äò‚¸_0‰0ãB=ÛÑC V6éÈ[êù¼ËSwµ¡ƒS¬rùÚúÃm[gj3SYZ“#^„¸Š@/h§®ÉÜÍ›ug¢Áw^7;¹–ÌúþÌ݆¥Y¹™–Ã,¥%në6gÂuÈ/â‡lÕÐG¨$„oÁè>ÈO9O.¬_X~ŒZº Xý>ªk]K/1‹Ì… ’·S¤ Ë“6Z’F¶ÒÏÝ=Ä (xz5!ç}I¥ÉzúÊýíòÞÇ?ÊVl®ôþTM¼—4ûv Ïnñ«ð|í[Èi¢Ìf…ÑÀŒâ7HºÛ%Ø2ãʬ†õmU o¦ºõ¢›q _cî$P'íé›ïÓn«` cB‘3 Ú°„øÕg²Ö´†Åæ#7_’9ŒL!’îþÐ$N ¤ªQÌìÒ$ á\hî׸çb„5äÐCQ@¿IF“3ÖŠ^&Ÿ¤Ò2æTSë¯4dn¨jb‰EÈöãÌÕ#ò¾; TAõJÐ4-¾5×¹.Y*ØéÒ_•G%Ed§ Q»bU Ôª7:®`*…ÞÕ1Ć›-ÊJ¤=2$íx@(Ôyé`®¢QNKÎ.Ϧ=à|Lç̘ÓûGfßrµdóâQ¤5—J–;ãÕ¯¬ k¦æÄ`Õ5x‘-â¤ÅÂFí¼ñ>ã¬YÚ,ã}ááó½s—P*ñѤ]µÞ%"È\Š'Ô[ÕºPbðYu(û±j€UÁ‹É’TÿÈ¡†û·³ÙhêÆì”y‰4¨ú4öÓ9ߤÖ À¼@T•–¶‚•}Ô>Žõÿ»V[m°–¢ex+d×ÉÂÎ Tên…x@ä6ï:ç7FxqÄ·áKã ‘R~M ðàÿKÞ»n9Gšn(ræýßrï9;b!Üö‡_#‘@U“¢DjZGÙ]\‘æfŸÁ^¢¼úÞ<ìW¥ *VÞŠxãG%ù)!êàøz M¶®Òh )¦¾e ®7ú¾·û÷i£¯ U$Ó{£œþf{~JjëFš˜*k>ÁPåýO4.wWOÜO<jy9Çó}è냗â¹1+u»SÁŒ\8“ÈG¹˜lV{( u4oqÖЙ!†7Zÿm5ؘt׸2ýû:ÍY¶éIw™)©(h[T ?Ÿ!ÿûm]ý´€9Y«²–¨Ï]—Tºeƒõ])"Íëñ*/TØÞuçø¸{'uîÂóäÑ%ájSdHG² |¾ºËކ^³ás*»zˆŠ=n×&m’¢—¾æà ,Ô*©ÃDœU#C<ÄëIUXúikÏà‹H€Ü‡eŠ·ŠñüÆþü¾t±·×F/ùiÞkä½1¢ß¼“—®<œ«t3Í~[Ÿ"¦¸¼÷ßÄÄ>Hݼ]¥çÏ.¯ÞÉ çÝ o|x¯ªLQdÞ‹ùw«öøE¸àï0üOÀëËû7ý³7_þþ×ñ}´/ïõ­×ëevp3 (Z{d­`«‹þ>Yõjêðä£ð-B9œó‡Þq%4Y&\!2ÄáÈ¿»°¥}¡:åvÓ·ºþ£h…‘ö-µO×Er —èD¸ú¯?eßQŒÞoãG7ÏI1^ ÁMúhìÏðk —Àß$„×ÃküÔ çˆ])H"{pÀ4òX?äüš¥KsKW,áJû³t¡qD:îDv™†¿®Ü&GãåƒÈ«ÙÿÕ>Çò‘ö3eÒ³’›ô›uœgHí ëæöoÞÕáΛÚAµgÆ aÓi÷Ñbÿj1ÁÝïÄ~»ð÷{ÁÖL÷€âþ›‰Èß12þØ>À7~þË“úÅÜŸg¥ŸŒÿc0‹¹^\fãÄ ²’~ vÚÍ™Úy˜Ag'ôëV“ àôMÇ}zó€RUáe àZ¬µ  `ÛÞ¶ÿòõeÜûÛ7¥²ÏRœP^ÅRMœúä˜à:öªÚÜ—¢S×$~1L»†Ãy²HãJ-ΰhOTÓcwãh É‚Á„áOðJ ›,Q-H”©Ï<êQ¡»‰ I9øž ÊŽ /rÛMIGÚÓ}šçu6Ë¿=÷­9Î¥Uû‹=$äG¯¿ _]˜~˜æÕ*C?ƒ2•²d¬binHÐHÛ†‡+ -jkôõóµ ò4—­¹Ã%ïc2˜ñùÔCYˆ[Ç3æ1õ'A¦ IDATDÑ]Àk‡XøÏd)aµ°"Í÷6ÎOF[P6gã{¶¦:^±'Å TÊ&E]îd Žz‹, áùø¬ iÁ¬|@¸HÉï§[È1xŠñ~/#ÕÁZs*j¶œ€¬ï±µ$kêøø$š] „X×qˆéº¯qlB2á6G-+ºkU%SŒ†¥Ãï!&IDd«PðîœÄ.È/ª$¡ä[¶úË ¶G=œÕ£a±J"³’AÛðŽ(¼vW²ˆ Ÿ¹ýÉVH”Ù¬[Xˆ>ÞÆÎúû†ÐšÏïK‡† ^Úb”ôbe£jz)}B½Ñ ±•ÝÄ_y•Au®áFXZ»µ ¾âBCòš3Ní[ºá·†¿]ŸÞÞEgfHÎ2²—\h9+«V~s lêf{ sX¿Ã·ÁÜÌQyÕ”i†\Dë#N¼2YåY„H÷å~xHÆCjxÕ:Àûóçä{øI´éð´I{hª V¶¡v)h(˜Ötq;¹²,ÇOåc»~Ú~â…ŽÌ"éà1œn$N¹û¥‡‘AÙ" !Ûs©+“4Ÿ[ÎWŸÛË»oŸ;OX âá“5Þ°¬ ô“5L<UÌ&ŠlÛ]¾ÕÁcÛ÷F,®ªýtê¦@zB¢7l5w{¾3FÎ:÷-a÷‡`Ëî* :-B. y®{¨Úȸ@EöUt-€F‘'7Äê4!*Üa×6ˆzÖöE]‰„§…ß«âPþÒÈ…Wx ÊL!|ž‹Î·Š¶Ëõžh_©ŒFù~îçs{…ìã9Öé54<çÆ‰9 Ô•6  ¤:G%<^’MùþfqÈ0ˆE0{b/es¶> ZàÅïu(¡U_+ÝÁ Zª•7ê7p_Î므j Ëi¿ÖÌÞ1Òc¨(ë8ßjc’x9fÛnæ²4WsÀà½ãjnNQ¹±ºã(Tr‚U©S¢éÎm}ёǷj§ûIÇütsÁ{i¹œß*Å×»O¯ýÙºï~'>ÒxøÚžö‹?:¼þÇ$I/u­¿×wÿ“Ôå¿ý—îÿÕÅÿß?>þá·ÿ7>s¼mãäïéØa€¾Ó²•ôüºº|ßEºª}è¹—HÉ Y‘ز ð!¥º‰`ë¢úÚ²*‘B}8,O ¢+}KÐŽUCþ1Kêuš‘º½K D„U7\TG…@Ýà›ùÂÈÞz¾JÊö„?ñµhôœ1ƒOú¸(UWàé<\õA ƒÃœäÒN¼LY˜5ì2 šÚx‘q£m€^Ü[« û‘/uc¦W>ªq›½`üÞÄ œ¾Èo%þ‹þ-ÓßîäûWSwWÞɸÆÌã¨VFÑ_™¾oÔÿKˆ¡¼`ÓË/¥ŽE‰M“.±€Ï)àݘyìyp|`çÏç>§uê€Üã€n½ú2¢¯Q€¿kpg§ãGEŸ†òïˆA÷ö~¼µò‚úaç“­^Ç)<š›PÖZªa׋£Š ˆ—V41²¬ Y*2ÎåvdŠ(ÕÌ|ÀößÙ÷6ùÛüï¿ü¯‡O)»¢6²G¼x|{ËšSe¹-q8½x<Ü(¹­ª>V8OÖÒLñüi™ÏÔ­ñÄR5Ê­ÇõMÆÕó`©ØR@TÀvV›«_ˆš!¡M^Ç (§è¹1 øxm#  ©R­rˆy”'ޤl€Uª4|60’h;å [E}æá˜Rd$ëu,h;Hd8Ú·™õVëKÁo†ÏŒæ rU<·‰9ùêt"U‡ÿä-yÏEWSÚçCJƒîãhÓË~Žå,¢N‹¨ª…ˆiåÝ&` HpŽž›YVFA1+RôZºƒdVÏ»Sxêú”GQ!p¶1ªÚ¸-Èê@= ;¢å;Ž+H9SU¨X´véõg;¾CuÞ›’U±³sU7IÝQ«"¡øP•Ñÿá½[ྠ§ùôxÏÅÆà‡1ðæ ´ _ªbÑ"ý„ȹ)kk©ˆÉ#ðgî = ž¸"Aq£h¯QÓâY0vÒJÆêðg2¼Q'€œð9ÊYdõì³Æ`V^ýÜŠFÔ`¡ª¦$pAf5]•¤¬Pr!ÍEÞ¡í|̱¨åèBŠ÷°µÃà¡[)ìù‡¿ËÈ7’­·/$“w@÷Ö(ÛïòrÆG…X“ùMá5Ý(EÏí5Š©Fóãc“Ôè±ç‘®~+hv…Km窜zçøâÕhào+2Æj¿-9¸qOß%”w¶z¤ðà”ê|ƒ2ÀTo¢z“Ô^KÛ‰e0>"E¨ºj~–nZX†]${ܘI~ï§J(¿1X#ká„f›BÕõå§E@ù¤‡¸ô¹o·àXðÌ}lXµM_'€ˆCeÙ—Œ;k¸×u'q¿)lo­6VbÛti­mË‘qE~ìU6«-^² û ©ÈˆÓ¬ FŸ‚½?a=IïXÞÛ–¨ö¾îøP:ïr¥NÈMn·ìùǬË6±¥ëKW=N^·‘Ó¹[s&ÿí¡öô€t5SŽU@&>#(OX>\|U KEøØô"CS>Ÿ[²H}) ?”\ús[ ì?Î]F‹ÊÀ3D½×eÐU_œ½ïÙãUÛœ,iñÑ àAR#pT=’²-ðhþÙ1¾_ÃBÛtðÒZ ]Ô®©ã*º)OwyjÇÊ6Á¤Åv±@@dápa #¿Ekv,Š«}R;CºMPëÓñdëçÇf(î]{NyU'I§Ð|Sw;TÎÙ;¤ï€³ÄMjWʶû”¯óVŸÜ@„‹"ˆlé[®üö4#ˆÞ-;#×|ÕÆÖ¾#m¤àÖ÷uÀ»Ò^6x©õzž÷yz¥ñà—:éHtâ yŸüG¥ÒX€qhUZOXÀïÕs)þQ-ÆÝ*Ǽ«¿Nÿ^ß8¯“†Ÿ;m?‹ÓüøtþŒô¯nýÿýãÃûæÇLÀË“º„…ð'…ÀÐEà‹µ Ô@´…¿<£ŒF5"‡_>GØ€v"•43ĆC5o’D‚@cKîo‰ Õ MÃÞ¡EBÖ0¢{iàj3¦m†³1o|ˆôq즫ן¯oYU šÕ¼B®ÚÖEMqø# 9EN•jÈð ¡Qà–;ËóŒ&#Æ ÊžQÈxM|¡ÓNL—eÞ]Ó^[êê §|×ý)Y=tÞÊéèÊúW‹‚n!·ß‡f»©ŒNŠˆá˜‰™ DÜ4—‰§¿ÇxƒF-ÀQ¡M9ÛûWI¬µÌ|9{è¢rÛŒ>ô°\#£®€Vˆ¬)]o¯šðód¶W5.€M¢ÈH&¹Ïéb“hTË­Oéô!ø¦½hi¼ª4ãY‘ÜQ ¬v@j m•¯l¦ÏÁMÔ‘ë¸z‰g[ôcË"+¯&¢5ÛËI¿’6dF®¬2…zèíDϯÜF܉ï1Ës÷x¼D‘î·Qÿ ó†`š»òL¨&Ð@­˜ð ]¡¨‚Ô‡¿bÁÞDööøÐN3Â’!»oòÑ€]ÕöPSÄé5VÁSd›(55Q÷¾ªM• ΪçÙœé·SÕm;ÑBØ[hÜë74¼ôîû6ãfÜ T#¬:6u™C¸&ÉãCœ2üìù*·ÏÀÿ G„BðZ¼'GÛ`ýt¹ „ËdcXrv ýá«¡µ¨f!6.S*¶ÓJœ|x^CG #*·–@ÞS]’…bu£‰¯:ëY‘N%fõ‘œÊž³‚Ê^Ôö,æáó|9lçOà­eþ¶>÷ » @Ѫžd¼oÂd|ý½˜ÉU3È“ã±í;‹)‘Éà¯,îW~k=gý½à ¹¥þØî}0Ô^ IbÜ¿AOCàúóÁÀÏÏî@ ýÛŽ þ¥0ŽXèo›€ÆõÕ…À#,\3€Ñ¤S3!(Óœ1z€o}—Žð¼Ë‚Â<0à¬lwñ FÖK#w«†÷±Q¹Ã Ù:[¨ˆ‹'hŠ‘DF²BsŸâÃïœ׭Å^«A>eiЊL "é$ 5©¾ÃJ $HAÑ›¸þô—¼?èÀÕ8Xäv×"<ï÷òÐwêÞwnc'Õ]9«ã³•5U©&Åý°'ç£iø7êð‹ßü´šÌ¿<ÚcNa÷Ò_ EÜû›ìŠ+Êò; ¼¤Á3 vâtd–6ßM¾?ôœu&Ä¡úViðoFÊ/x=à+êÇ–¤_€ç÷…îwÿšx7¼y—“øùÎð6ðpNx¸Ãø½s&\Q;¯7p¼ü-^Z/â;/.&†_{‚?t”úžÉ`fßϧbéÿ‚ªfzèìcBPû³š@ìÔªU]‡ƒt!H¼5——‘ÒRU#íû¹÷^‡‘"ÿŸV¢8=í]6@ÔOS…™*¸ÓW2X>èÚb²ø‘ìèh86œ> ög„é+uý-ŒÚ/8Òâ9쬧Y‚¨Ê>Yïä µ|Rcƒix ¸zï¡2Ô0X1Ðöèž!²µÇ(ÄæŒ4œMww0úADt¤ç¥éÁ·&\,Jp.¬ÙiLM'[ç¢õaUHCGÜC»cö¾ÅsQõ.XÝjìm²ý¯ÂLiø'3Zµ%õªÀ»ykbå´¿òc²U qVþš”0Í¡°/U÷êUº^‚fàâ“ðÑ¢×èdðÎÓ*µ¼&ßXz½äå6%_S‹Óô€Èš\WN¸á±tw&`'›?pœ |áw5d ó<¶‘èêUòÖæ’»µYz<^Œt(›è*Ð jô$ÎxŒ’æp`“¢y¯82›±UcŒ¨†AÜ?x‹>ò[s>ñ*C"™ ¹pšœÝ)º³ šO^c&€‰9Ý šk†I”­|£TY1©ñ ì.w6ÊöÔAb b«åÚ!EgrÁbbJàŒXð€¢·Uµ8| e²hþSÒ_«+Gf'TR%®½vyÉK¦WUñæ ‘5ÏL Ft€zÐGTa;;2µS8ø,¡Š¿Ž·F»Z0Ÿ,TuS€ƒš(=ÊMqΤv¿";ì¥pÛ»TFÊØ"Ë"3öKvMLßüU{âµÙËSO‹Š…õ²˜R ¯´âY_ˆzá+‘Äôšƒy¥å—&¦‘)«-³:Çr¾”Àcœýß´©%+–þƒYHÜq‚`r·™³'·ÙC4»š»$).‰¨k&%AUž}¤(hòyú,:1‡D,áwL£ÞÌž{®¿®‹%ù üñ,Õ7UQ;ç:)²Bt@¤&ì¤T(ÜN_YÀ&—ß•ƒ˜¸º%¾r‹alêÈiË} ÜÕ ,F>TçY`ï­P]ÎLJªf1ûôN §Ä»‡ë\ÀÌÜ-¨£;„›„ÙR¿vããõZ–íS- Fk7°¢8“-þ}am?ÍG?ƒ’9N%E[›@öªéB 3 ~©ã„°Cÿó˜ÚÓ5ÍÏ!“ø”Û õ×8äLWÂ_#u4ß¡FbZà߬P“ÜYú nŒÈ¤¯Nžéý Ûž{‚c÷U{– …ÆÇŸØVÏI:¡ä•Ëz´@_¤j…¨Ö­Ž}8ª&æüúÌö\ô+ÿr´«(n’þoüøoßODµq#Pß]ô0vÞ3xÔœôÍh 9åëqò¨¾VùA^£¯Ew^¾#M(”!¯ aŒeº)?ˆ2|/wM‰®ÝdÃáÍ”?é!¯/þÔÃñÙ~y_+øâÖØˆËHãþhŒ>^Kã)˜ÜEDîIÆ#ºôbö­òñãìáW3€¿˜ôïûç_ó™¶¿þcULõœÊ+¥l5 Ã)½ÕÏIú••ŠãâÄÄ›€M%Kýh]NÝó \ûîÛ’yŒÀâ—PE³lÌOxð¢0áI«?ävÊ¡0V»6 ɺ¤¨ZôÊ©IЕškÜ÷eã ! QbG±¦… ³‘Z[l;5B½Ìò¸¤˜˜ãvŸ`é†)¹øk‘úOðoæ“×2Ï:T‚Œt‚«Ëc«YŒÜÖ?9¬oµbÝüyñ¼Ÿ%ǾÈ.Ò|Ÿ@Ç´=IÄk¯g˪/îþa˜?ðRYøp‘»:Þ,óü)%Ä¥6+§2×µA¬ž×™Ê„]@âãfØÂ'10>”ᎇ÷ñŽ~áÿ\b ÷Ø¢n—:ay[ Ÿ›yîÍ?žx$¼yœxL~Áð£µãüÂáõ„º+â{ï§>]â0òV˜ L8Sœ—’´4ÈKÄûm^©~*RK-]ä¹÷óùôíØÈ·&óÒ=öª©(ºœêœ\+fLòÖˆTäh,ݼî5/.‡`Z^ÿ¬““%PÅàÒd Ó% '^ Nƒn%.7êøËr—‰L2Äø˜[ŽƒïL·I\’w¸kdÌÑ͆™Äí5Qµƒ5Ê€rf ±IE¶PäI~9¶Ý„‘ž›ƒM&Zh4KñvJ#qÂ¥ÑM¥Žomõ¿ã,× %jº îTW‘ýÜmâ’0îÎÈJ=Ã8ŒúéÎ×P7NÛºVû\î29:u=(7®Jx™C΃Àjn56 ¡ê%| ö[¸U¯0„¦cŠ®œþ\(m׈i¢ØÁ9nÖOÖj$VQ‚ŽËª‚ F¿N%á‚ ®¾E:ãˆàxÇRÑèGN¬*u#¨­9™ˆ¢ÇiÞBÏÕLmòsê¢ÊñÉí“"ÃTIãzhæ'ó‰‹X|G$"ºs8± j ýÌÅ<ú¤[JrHï¢ÂÚû‹ª®¬0&>\²0¾;5~[m –vP°ŠòtÊÐ8‡ùGø›²Ð F+²s½ÈTfL߯®;!ÜBå— ÄY•à9£/OEµ§•¹GVè‚~}E¦ÎÙÈ•¬ÎÜá`éV_êfiž7­©°*>¸(2J×gж«TçAÜm.e!íàCbE£ªª¥7Û#Éke,ó&™î¨[y“ùt-^µZXR^“.xÅ jÅáqfÇ1,B|±ê×Öã’(;±c„ŒÖGpFøò¤»Ò¨8ùJ„_È1E«i”ôϾaÜhnøÄÕD?2|Wù×gªr¾æ²Ù7hÜùÛqÿÇçÂÊÝS;^þ?õ†iáD+|ú)·¾ü¡èb4‘ž€]žŸoR_ °Ÿr<»ø3Iüÿ†ÀQþk ï>=¿°>!¢hŽçìa˜Ó^hŠèiMk”Ú­²î“2Ä €Ã’'b[–$'Ü9ò7gÕiñQÉ-ÄOd{S<àì5‰È]¿Y“¾ÕX~¦15‡Üù¾€éx©ãŒ?·Wiby+!·döSºMµ@°]vm2­œÎ¨Rœ>Ì4ƒó~*kv3¼ë…P·¹À0ƒ˜xÕ\³ÔmÐdrOo „U)»Uýë¬æêoôïêâë…vèã”Ê‚œú¾µ-’½.Î5/•gwíé|€ÏŒÄ±ÁãÈ‹gÖΣåÄ*hSÆ»Ö ÞStpdO ]±?ð^Ñ@ñÁ>›ì•›ôº×: ߀„~xF䧯¼¿$~úÚ›û,hx÷{î' üiVHÜ<ÁñŸ¢JއËÒ=h˜%$Ô ]ÐyÓ*Ü øa]—NS2¤Ià§åÏ ˆ`­¥ ºà'eI‡cuRŠj܈ˆ;¾N1ƶjð:Ê‘šðV}°¡¬Ä¥(2ùu¢TÏ2Ä×\ÓÃÔ„ÊØÛ¡%lÏzÇx=Ã“Ô H©•/VÅò1y#@¨7b6Ÿˆƒ>µ_ÓïMkÖ;èÎÇ|ûÓ·`GÙ $PÔ1L¡@°I­>Vt!Âl!VHê›\tÊ8~ç)]Æ^‡J£¸|ZWµ…^TG ìÒšùòa®I€®åùÁ”X%^3ØøâfÃ_ XäÿùÿO ý(¼f¨Ý¡CÔ èçÇk…Yþñ€~«Å j0Íõøbd¡[¢RmyQ±†ã8 ÊquúŽ• €q§Õÿd,ÊôWÖ*˾SÆÉK.7Ú'Óa=”Q(s+Ç!©t¸:5Ï.}8!x´%u¼+ÐÄ!Âý qŽ ‹^ç*ü4†¢A<‡"-l‹WYx?3',èÜñÑhØ0õÚjVq^Oþè¼X>žÀWîÇjÈT3ò…ú¥Ÿ _keK ‚4ZŽç\FÃÓß4¨õ‡Éï…µW7ÓM¼‘ŦžMãq Å4"q¬·1ü y›@U1óïî Ž=ŠÁu 2ÌËwt%7`öj)`qÉå¥5¥Pö‘aq–>û»r IDAT­(¯^¿ä k©Uu-7éy#·D^íóòÄ¢4ÊN>Ò& À¡ ¥2˜MUf8²¡Ç˜4^‰hˆè˜~8{¿òO‘ã]p—X£ÓÕ¹Õîõž \è‹×Ý•Ði”“WUØÉÊl CüáΦ™mø„/nžÛ|n©P‹±Ò æâ®-£MbáùARì~³ 匈J;þÑ5x¤Kåx% 7PðëˆÿÇ&å,¢Ìêª8M ^¼ð”Ê¥ r!G½ôoäX4ûžûNœ¸É.q8Ž”zC:$Ÿ*x9&¿rm¶üiÁ¯>†þ9Zô¿µúy?M¹SÛù/ð8yg‹ýX•ùó÷uPe_m“zçB©0@½"W a0w¤ h1‰ƒg¦ n¿å»lÍK©iZû–ÿŽŒ–cˆÊŒ  –Š‘îr´G¼ÛŠìHÙº,ž‚䆃a·ºo©0¾€‚%NL!ŸBÁz…¶[¼‹Ç=YÆo÷ójð´^·•M¿]Û‹zXjÆ••1©V¹Y–sšs€(âC%³ÇÂÁÀNF*/4W\´ì7ˆ˜G„LÏQ0«©döt­§Pœ@BU–x)ÿT—"–ÈwpAžD€"?Çl„"Ü ±!ß_MæY1ësçã> „< ÏÄ“´ˆÖ^±‹' K¬ðRCVö)T¥Sïº7N Ô#(;p<7½šPy¨À` ¬¢‹ AKw¡Ï§–Ûžòôâ^ —¢†Ÿ^d¨&^PLG°›ù]ŽAt–¸ZêŽÑò¢W^Ô¹Ýã•,~Ä¢(à3DqA,¤f»$¬Æ’,‰‰ÜTJÕ"Œ­‡ x˜\-™ˆ>*ê%hÒŽœ"X€f$ 8æ0]Ô8Z"¤¶ÙIŒû,0‘añÎDqbàËü.« )¾•›”œ;ßȱ;õõ BÁÊqr‹(/’nÆjè3Žjc«Ý[éZàM*ǽ^ðÌÈÐfRl²^‘I ï¼æ‡°^‘F{øÂÑ~YºªNÌ÷Ç“%ta™"JIåÚÅŽ4&,ø¸ª¶rþ(ÄÄÁ ë¡4š)7×ÌO‹~Ûæ c;úõÌþ2,ýyr4Ù½Sì°ð”ý_FCÃs‹ªLÑj'šˆCŒf¤¯4{ 4Ò"÷£iÔ¸qórDà!Þäî ÀÂJ¸ Q\|¢›yq°ÚöKÌ×çÈyœÑ ’^7¥"ÂE%õ¡* v'ÎÐÅëëFëäOÏü`³zËâa³çÞØÀ_„Þz·À¾´óðBsð’ªî½ÏsM¬Ýü{·%¯{Ï —Wóå&ÅSSO³‡® ó}úí3t2~|? ¤ë3$yØ|ÆytÇq~iP®Â{"|¯eNFY™½ÓÏË Ev~/.ÑLbNU³Ú];«QâWœ^4ŠcÄI7hþ[©çQ¢w^0žµå<Æ‚‘d85o!lhgëú<2åÖ“vñäS¡/Ñ"Ǹ‰MžfXÑIæ›À³f {Üç!‡F/Ä´D½£1ÄÞÞ†m/^Ë‘¤?rÿu5˜±‚‹O·ê˜šPœªû\_§eu œL!¤¼„éôt\&OǸ©@õæ?W‚̽½‚F·‚'1 ɃoýïSn¼ÄCÈ—÷âW÷“„p§2\土=‰-ú\Ö|ÜZ©ýèf ¼\Áòù z7.Àk'ö¦Jþ ÿIpàß7pK“z'ýWÏV~zÃxsYò‡iÒ½]·Jíïr#—¶ôá.2P£¥,nÙ[dED<œùiüçbÎ0³¾Ð×g/ 0Á ¿ŠÈvr4ÆmÞÈø]+,ûe°¯ò-7ý×=Ó¢–87*Ü"0pedÏ|Þ˽C‰Í¾Ek_ÊG,¢=Ç”é+«ˆ:r`,;Þ­†è†‰´Ýb||­¹¦ôãïÊs‚káÝ ý»º<³NìÑZÌ~¸d¸»%x(¼fwþt~Z.YíDãöÖË’ Ó î gl÷Óm_Ï+z¨ý¼®yÝ1g¦¼ž‚61ÎÕ -3¿ö®´ö^äÎT¦µ<õ q㻲ûÜä¤ìÙôѬÉ3gЇûa p‘û_ÈûYÅ|AðúÝwßÇÏ· ›…ö2 ø@z‡ š_‡yL7º§"fFÉ* [ø‹áS?Æk¤°$àsÈ¢X]*#~q€Žâà`rÇ5w0цŒb2çì{œƳÇV%½W•Ü>)˜“Â*Ò鈇$£©*ÙYìÁý‡#M˽ò‰·Ûöan+…oc_iüZN#1½tCR&µÊòñØ‹ÃÆýå ÝæºØ²0ªeê´ŒÚhÄ'ZÖ¬Q!ÔŠ†ì.m*;PeþLs_qu¨ðME¼iXa}Y¤nLaÛ†›§ßH {Ϙøkn®ï¼Ôsn™·ÀE˜´û}ŸF¦~R™ª‚¿.äÆy$’.îD8 µØ}9JË~‹ÊDº¥ôÙé—ß²¯i—‘+•™±éŠh›®!µèò˜ìå#WÁ¶ÐsIOÉ a BØWÒžÒz4³ Tcøã(.!Rg´„ܛϽ÷¶Ø‹ªWô*½! .>Íþ«€ïÐi ~A¦‘ôÍæîUMúu®îfýÆÁu%XM»1kÑhOÉ îâ¢xH™f•#¸.L;ŽùiÙû’'g¶-5ûÐ]j‰+“S¡Ë¥ìÑ#¼ 1I–ÌqYª¯*m{ç辇Xɑ붩ôþ3ì¤}ó rO&äÈåLb'ÿ9Ê‹ûŽÕ+ãÅpÌAŽ»s/ÉýàÙQ9FnM7’éü÷ðAŽ—X%R~O`˜¡“HŸ4§¥Jï ¹¶ì°ß‡RîFç½96ûïÆc}`-ÝÕÇ\–j‰¤¬‡.膭„€›™ÑÜ)OPUª–%ZC§/V¥iéwAüsÉo›,ládéCä¹·L¸êåi|ï-ä#ù<Š~Ü^ ŠÇzŒ]ŸL¾=!~ÑËDŒ²7·Lí¹mŒì…ÓLJ¢á1Jsù$¿Ì¨ª Ãf|~ýíXY,.מ˜q§­X±æ†!GF¿… <"²ÇbÝzþ8ïiÖªcsyf}Áx¾ø!Áì1©3üE¬œ~í²ù›9 ïâÁm¤X.sÚ ‚jËST¿¶™å­üó”jo< ÏLXŒˆ>ëëk¨ÅÕÙó7„UŠ;RW É”. bäö]l-k,[=R\ËC[Ά…p{=TºøjT†¤¸_>¾¨F õ³–,z¯Ç»g =ÒÃô±”“G¼«ñª$õú”Øm›P°Ôl˜àLɳÚÐHE×1Ík³0 ~E¥2âÛq!õ" KVUèȰÒ!Ó%ðÙ”1ëâßi²Æ£u–Óʳ’¹lUõ°Zm¹RXÉ<u¬-Á{³d³OkÆŸ9¿9׺ÕŠ·gˆW³\ÔêôÙ8ÇWo篟äN‘¿ÁO×8ïÔêã‡Æ¼w ý÷â–8EÎc?~Q‹û*Dœ‘¯9Eäží§–@äž qóí­ãòÆ É—ÐÀ?M½ÿ7jÆ‹zþËÙß þ¥&¸ìŠšãTo9ŽB iKþá6­Ù<Ä™øq÷d´z‰“hÆ\¼Þ1ˆ5Ù¸“a~;£ú ’Xºr_¸‚â Û"Ë „ýЀí;Ñ|Ts[BçëxæMF3GÎr„³×´ýÙx1㟡4Þ›f`yÉ L!Ÿ£³ìÐt^kðI¯ðÍ0/ýÁ¼uX½ ð!¸Ýèà%t~}¼KñøzìmFÊ޽݀œî›óìçÕ(V“8 äò¥È²N ËEÍø©[i3_»‘úRYlPŽ 'ǼèZz–}_,ò~|ªfÖ«L<‡Þƒ`Þ‡²»Ò*² ¢ºòä¯ËmÓd…”$[® WD„ò¤Yr´e`£¬€³²¥4=xÍtˆ©O³Ä”GÁ !SÏl€óK6”îh9žqä9\Eœ¶UèÃ#kÌ´E ÁH›ÕÉàßàžOf¢ÂÉ,º”f.EÔïÊ1±‹è[ó4@Ãؼ²,Ò:þcËÑ¢ùÀ’ÆÞ#›ÜN !!co+Îç« Ý{îïSvä Ý«2…LÓ¿¤(o¶–.¨{œ.Ç×?Û<õ¸à•eYJ—ì'Tuù|ªQðP›wF÷ÊÉoÛ_[»³ç,ö¬$J\º KÖ3lT–.Ì­ª§‚§êŸ‚Ë!Äó¾4LŠb3ò^6®‰6'iÏ­~¨ëÊ^ª'³J’¼í.´ò¸=S€Uˆû­¶[ÀPø'~ô4L( ^Ÿ—¦ðÜvÏ´wä𼑅¸¤À¢Ká(PVF j§AêCy>÷h‡ñ3·Í€…O糺`ëZ3àu ¾æ«ªŠÆpÔ2òân·“«¬-ßX¶ÎŽýQ+Bë–-q£Î aÍÂíÓ°•ŒyGø·G075Šq³î†ÕÝ l&,.´ >–èZªj{×ÍÒ}9¯ ¬4¡Œ+&V*U‡¹m£ãºRË9~Tö¸#î¦6ý'0g2r—Ø™ÇoßͩퟲgáQZÌ|k5TÒàÔnˆCû¿Å"4YÈ&XîÀ_p†k$&>êmÑGÙì~Y«û–ܦiæË.ˆÎ¸äÓðX4j Øö¤w™÷ƒoäùË´Ð!V®.h¥ˆp#Š#gç˯m‹¨–Ö ¡$P ®væ"E–0þVŸó«Ä­÷™)d»Ï ¹s„2¢ÞW‚9ÖñT9ý.¾÷3Q3€ éG@Y6"üóŒ¹ÎŠ—T qdƪƒ :êÖ6i®ƒË¸qxèÇϼM næ¬o¢ï~ÛMáv>=W9<Ò¶ƒµÒÝ ä•Ù4¨ªº³@p «_¢t[!d6ï¹Ù?ÚÎÕý,lEvlj™ÐkGZ7ú…@#ù;?ëÑVÁDÄÏÔ´Ö·£~-ªw¥Œ¨È>QcètKbö<Õ·„‘ß\T€Ðó÷‘ûåêOš?!Ä©oxß«'.‚ð³øHïA’•¼3Á“W¯B‘Ìl3 ú·NE·Õ‘Þ±â”›Ü ÈzhsžeÈ´TÚ°Ç–%\4iöß—íþci°flËÌÖG’ r=–*°Ýó¢m| =îãÇŒáúú+ÔròÏŽˆ 6ºQöûËÀÙœ'áäæ-Ä﮽cP6Ã^㇠{$“kã­þiùÈ~°é³Ías¸;Óë„’D¥nÁ’ª?t9Þ6ý0mK³ÆÓ{Å,ou±‚ÍÇ¡¿ž¿6c ÷úy£ñ“™ì´üopQݤK,I÷—ÛÆ¡w(6º‹4†ì&1¢k4Srœ;ÒE¸Mà^ šŽ––Üöu7 8¶\NÐs@и¤ƒ@Wê?;,5¿ Tã<âái¼ÊSÝÝó’$¼rãr·6¡2[(n¡Ïý2a%¯ Ü%•]cí s&¢‡Ö^³z^}g1™¡˜ã âÐ¥’árï(`TøÈ'ÎþÏ»Y¶±O/3àí¢>ÔTÿoúÞÿ彜ϛ†’ñ;ßWÈË Ì7Ãî7­(ò™t3x”¾=ä~”Õš£­ŽU_™žz…2eý! õöºÞ$3:aÝLf ™ë(:¤™ìçì·íW`:â¨"tÞ#pt£Ù?:?q¹·bi€Mª Ã~{ÖhZŒ¤)„¦–®Ÿ]ÝÞE-°os–£p³ ,e?Úû¬ ´mf¦X éaŽÂZP&–WÆ2bÉ9uÙ;…uÿï9TÂid•^ìu40‘«-Íí¨î/>°7õ)§ñÆOLžGLºN¶Œ·®%"1£)(®xœ&\2l¢äS`f²ÄÈçs¯rã–Ó®ÝÍTJ§•—;"ç.; ÙꜴ9x,¾Õé1ò…B!0m‹<9´Ç.Yp‡•R6TH[+Äm_'ͬ`|´SÐèÁ˜Aç૞›²Ã$^…¾)AÕÚ€H­-ºâ\ÉòjÍ7µKʇQ]YíšAWÝvz*,ÆN7çpi¾”&Ol¨´.Hh0ƒÑ•'"æ¤Õ ù(`QˆÏz-¦wvúöÛ¨O‚¯kÅtœI’ÌB€„ì¤iSb“êo"ÃchÒƒ/0IRWºü‰ÆHAårSŽÚFÓµÕÎQ†¿š ‰ØyûûÁQŸs¢­ï…[Èê°ýçšY†ŒoHŠ%ú´5w(+ÕYñq_ëôÂGô!It?GÁák>œ+*qv!½~G23‹A{ï²`Ì»Ws³æ6q„SG&î ï`Ç‘¤‡–$çæóHú$°CìÛªÅÀCÍä(w­FqÚ¹÷dÚaæý"ÍÂE æ4´xåûü4Ø6O#rîývÉmÕÔ{hôpgPÌÉÚ$·!â#4‰¢___k‘‚m,YxÍžùUââ51lübqˆ‘ÑþãI#÷s?ëb²VD?ðõ<ã“Å_ÿú—Çcu©ù `èÒ¯µ¾m/Å6x¥- fF_â!ß{o36°ä½Äƒ›ÎN#u›,-çj?5ùÕ[õiq>Íá]Þ\‚=œt…[\ÍÕÊzèZ¹3™È Vö|W¡e÷!½î£‰;øDq¹m/Så2P„|ˈŠTˆŠXt«@wÅïe¬pºTyž28a"µbKEǼÎVb¬†_ï×Ôý_wûtËœê4ˆ˜ÀÐLèǰ½ËhØV‘ýL«:fPà ÷ºÈ¯ë™c÷,&ŽÎ퀲 *í9\d®‡Lb'³–(@2~Ú‹ˆê” @¿Ð¿pr€Áüã˽8ýO&m|»SKE|gA# |1kyŒ>yÏwÙq¦õ’ð$/Í$Ðíis¾V¹šøõÃt‰nßï4¸ ˆœ!¶—™Ùù;ù“Pƒ½‘Õî À=½."XßuœÖ¯kyŽ?£W©RþÆ{“bJŠóÕxwäæ„-|нùBªAî0oƸ'Μ“B}ÿvˆžSý¹Õ?^GW$ÿ[éôZøs‘.Ý?“ªc/b7ÀŸËè÷7—à?K”þwÿówÿú!(ðG=Àÿ¼×æƒ@ÆÃÝ\ZŠüf ðÒš"S*OâŠ[.jÕj,þØpÏiÎÖÃÂè[PêuhÒ`y}ŠmêÊÆÇ.¿Í@ŒŠ.¯ª,ú>9¡ï}-‡©•ÒvdÍÖÊ|Ʋ4íÒ Ëçô¢õr ½Y^€|¬7Yp Š’óUñJÂH3ZîØTJ+‚Ê®CwLO$~æ þ¼eÌV_äKàÏŽÍÁaŒ—ó†}RÝéQG–Ðã䱘I`¢õ˜<ñÞÍ«¥àh¡#ß~¬Rí,½0m¤Ë.9ùÒõr“GÅãz P_Ãq7Áä2I¶LŽÛºÏ¹×q+p–s‰ŠS- à¥÷€o”÷+è þ¸©½¹Ÿågü>0/KÀ»ÙÆÍ ¯#ƒSqÞ©ûøT pÅñƒÖ IDATxmwz Å×=N#õõ÷÷.txõÃsYòcg¢àüj7Kííäa­—M«n÷ –êÈpp‘¤ÿDKúä'Œ– à~Ôn÷$›ø£ó=wki»-ÜŸ€Höô©J?jU©6 ª‹äÞÛ¶­…Š;¤Vº|2Zx^ãy”ª’[š%Ù<”…XO/ýÐV¸Zò÷þúvfÏu–µlÝÍØÜÆvÞ·P×ëKïªM:оËR,ȧô?~Ë7ÆSÆ‘†Ë…¨œàáyW¬µ@ÂŒ ³i±ÿvÂpÓTâÖ³iß›ßÏïõ׿jvÿÆd3S-gþV×pÐ úؼõ¼üR)¯4Ã\ýFe˜D ¯ÎËï@y<*›ÍyAÌjÅ‚bé"÷vÆ#׺Ž|¦Ì¤ÕùËõÌ=óJëJ`ù™&h¡ˆ.Ï$¸é2›‘1 Á°hб1 r:66Oz>o ³K ü²ë+ùjBkAÍ-ø€Ø«Än.¶8Œ‡ì —h®@l-×<èѲ7Çœ1º¡¦V*á½d¼P¿G3*¢ÇÁÄcýYg8° Á¾1– ÀÚ6Ã;ûV“dV}QÂÉË©X®‰ª‹·/j• ™"ŽáEbžß¤âR/ìë570ÖÒ>Í3‹È²yò’fN˜ÎMŒ‚¬¡Mca!+À9˜›à}í7EøbŸÆ4ݨ$8N©—ÀËïUV¸˜ßy "?åôñVæ<Èwà‹BùÚÝ-œž6€µ^÷²(MŽómîJì#B¾gÈK\¯ }¼«‡ý½âû–ç´ö\‹gÃòg:r¿jðX?.þþóoú,ùæ]¼ÓÃðG©Ž!ÍåÚD¼†»Å7«¥¦©.UÂ=*MG†Ñ›| à,w_E¤la õâB¶”;[ÇM^ù¨ÓO¡wðõq= í ¯ 4p$䤨yø¥·u®ŸˆÈúªN¾Øœîgîé<À%b†$;C^ sŽCùÝ$doF¦O!QŠ`¡Ç„æ…ÎI$ßG‚ùYoHæïH ‹Á¢zYT®Ty{"¢¼Hèvd¼[3Ö[cdýwµi¯hﯩyßÁ‹á !(¯…·77þ"IõNT¾þ@Þ)Ô“€ÎñÐ÷˜ƒÂ—Œ QÍ;lÍ2›®Y±2úÅÂ|ëúߥû’–8¡@ø8q>(.y3ràÇ9ÁÍ£ºÉ\¾éMÔwÏ/…èoŸõÍðÀÙIŒëÁñÊ—((ž/‘2éõýåÞÛèØè:Œ€Ë¶>QðYÕWÀkX¾4÷8´ @g]yþ®èñü #Š —Xð…Ãê?Yu©–Ú¤Þ0?÷𚣙>(¹/4R”Õ(fTe/Å7Ù%¯M W2™âE$ØÏ˘+R2Ý ,9Z;äœ ¼¶csd£CMÂÕº¨¶ëVÑÉ¥˜{ñ»TÀy]¤Ì:ÄòÛp J]—I3‹ƒ<ñý»Þœ‡Ec¾êTtKŠ&!€³}°Zž5Ýj5f[ÞÞâY}í㨢þâ+óÄRLÜöYìݲóȦ¤ió²êǾJ^<Ú‘mòþèï U},ñ°_&^ö[’ßßûX[·ø<(ŠO5»X™§æ Ô‡ ~Œ²¿=uétï eo®uüvóŒ•íÖãŒûi;#KðtPÆ¿7«‡fíÛ“m› ¹|”תû‚˜‹ì"‚g ½Ï06ù§Ø4†õ°7mIt1Û§t¹ÕˆçEÂ6£Ç5N›KWå¼TzÅáÑñº…‡ÊÓèQªÂ–á¢öª²m¦73â³ÎwÙæy âlòÍ _l5†°Ò´®ôÚfÒ9weX‘M:J;g‰pA`ᡞ>2j,>*"ò$ƒ%î£kŠ(T=ŽâþxP:Þ)3_(²|Hª í!F:Fö¦LÆdn¤}¼m›×QH·m]˜»‹5Hü3¾w´Ì™ûÍŽ] RÌ §[gv@g‹qk8Ì)š-,ÍÌ›"Û“yÚ1«¬Ö†‘·ê—¿‹e.ãìÄËé‹Vk|Zå‘ÚæÈµûGÞ˜&Ò˹0oB¢¾N]Ãö¶ê´§™2±¼{8WI£‘L¯¿FVµ»lÆà"†Î÷À·±¤•ª–’C¤–Mžš¾d!Ve•«øíºª§4_¾|±êàD¨`O!ãÖó†bD?‹‚?çä3)Ù~ó7 Îj³\•a£QÔ>r{CÇûrJŸ¼¿›uùSºà¼u\•”)K\~5>49ÿ±þüw‰ÔúHÚøO}tÿÞþI@ÿÿJøÏÇhÂ9$~Í"Î';*ŽFùmÌíë“ïŸ'ƒhu"þ¦zDvÚIÔÜ.Êy”fZð\Ù—Gý? $¤vU1¡Ü€·"ý&ˆ¨3oÝmïkO ìÞ¯ryº°ÃfÏÊÍ™mõp¯é~NðŽ)ÿ!Ïàø#zŒ—07 {Ò¡KXLzoUxý§–ÙCŽq ÐˆH+¬º‰»ÇxTìv1"ƒç0Ç¿¦äÖü;Š`%A²õçõªÃ Ã;ÿõ‘ùIâ¿™ÞÞå½~c9¿ ÞÍJ¼ø¸ãŽ|/»àõëb'zlÃ/ù#—~]Œc\¾’¼WÞq –Λø‹’}¼DWHÏŽ¨ûË«ÊÿŽt x¿»ãW2=~XÂ_¹ÿ|7öœ¯Eä†úIïÉ »ÓëPØ«A+M|e”ÁÅã?|Ó³ì_¦\f­UÍjÅÝ<¬]”£zN¦÷¿¼™U\èÊëOÀŽú’}bƒ¨B—*à<œÃò®]…,ghîõ1R?U¥H2»Î ÏËl§¹™ˆŠ|™Ìªˆ;òñnǯB·×»™»^ãì×ìL%k4°²>À#amòÈ3¬ÚÉ€s6«8D@9ŒQ5h‰Â¯@®pR^Î G?{ð_¹éÙ¤ -2¹´¬xÝL]µIY ©Y”ëÌpV¸Çîÿ Ò{™¤×dÏÑt0©“£+¯ö¾pEø¨G‡ðIï!5ÐéòÃ0Ú_ÿ2%×H«f8Á³ŠºÃ/ÅõœΕ§‰—ë>hf¸R,Q¹nçd ^â`[MIÚöÎ<åHæb¥Ó^e§ß"K,#H-fQ”ÁÈݶ¥šP2W‘… 4)›1¢uÖ¢—å#W±:é­h+®šo ‡YRλ a +†ß8àˆ$x¦;ÐDV¶¡†Š®Ž©IÂvOŠŒ=Êν2Kh[uÅ¥æUtü‰¥ßš$¡âÈÿˆ°€”GP–,2-.ö"6•oß"kR–ÈÎT–Pã« tp{sAb¥¨±eo‘T)4]åÝÁSy‡*-&UĪåõ è®L"iî;ë*~Y`;Ów*>ñ_dàUÌ8ó9<µÉ WN9O±a²h3­r.Ø8©æ8é=ŸˆÿÐøeíîÛ¯ù;_¼ãµ¿h±—7ü·oçÅÿwxêÿA¦?îÏÿº(ÀÇÁÀÐ(2À!kŽ™föµº^%º0P9¦áMŠ£¹s(²b¬8C×Íó{{ŽH —¡;²Š‘ÞøçØ“ëáN‡˜òÒÄ­îõáG_ óWÝû#3í½ãÑâ‹8þ9šA¤×[d V –Ä„S£UN¼C õÒî ]²*­þgµ2¥:2PPÙF1AšúÇ&EƉïöæáÞ•¼™åIY&š[R~)%·Ž„}h¡œï6öSà¬Ö«.Í“¥wå±ì¢ìÏ1GîëáÖEÄyßÂ+¨èˆ/“ýËH¸5¯ãØ{]É80£)¼}¿;µõ9PIÂP2S˸góÓ„·žáçqáí½‰€ïûû$çu÷•¸û¼›\îyx\w“h½¿Û¸Ò æÖ|7ÊÿEñ‘½7âˆ+7udxÙs_ìÛÆaÅi÷TŸ½Ò’SH-þ<«¿ØÑü×w7ê|ÝÞªšâ=%”ö¤Ö+å[/ ÊzÙ*‚î4ÜÚÞãØT£«äÚë¶X‹ì‚Ê,ë¬Rx¢þ3èæ¬^Åp iu›ì#/‰e—Īÿ ¸ã¼€|é»/ÀJæ©P-ûO-Ê5*ª A`ªyær;Å›Û3°dð—\\Í#±zw‚Bž›“ãYš<®{ 7ko™Å“dÝZÙ«ù¨‘Ââõ5÷Í©ÀÝjþ¬m?£ß6/l»`x aº*¥ª®|zceï:RŸG×Õõ5>sÑ8Áf9ŸWg+Ã9é@–¸Fm4Y+ÃIU)Ñ7±Vvå SÂóÀ²üQ(fQ/ŠôÚ‰ŠßÈ£ÁµÎx–ú²ºa"žqV…%ì1àw@àç`L“rt£IÏš×ïhý ¥](\É~ O"IŠÑ äÿuR]©Äi_^ÐC–DÍÑÃýVUn%8„ï¤%1Yró¢ õ¾çúJ‚4±¹Uñ²XÁXâcg”g¬¬j#ŒºÂêÈßÖe„IZ£¼qßæaY÷]¡_+O޽nHp{'jpj¢U(]úrô;©¦>R³ðJªU´¸Á¬êÆ´bã1䀂¥ûžeùó6Tè0$n{§*rÁUg·È,DéRrn¢¡6Gááë‡ñ©žD 6–DòZf=õ5a†E¾n[òX×¢~2ýþ ¬,6ÀÐÈ"ˆÂþÌm…>WQYÐbè§Ùs[—Ã1-Ö£åó¸Æ .–ŠDý°ò c¼­ìŠVž¸ûØFìŠÔŸ+šEÿv˜ÓË߀±ízÒ5²K %› ëÖ+š&¦ôÆ‚hµöÿ³ê?Ç*§­ª4øä\ÄÐå|¿ZõÔá<.Ô”°ÌãºM޹#"Œ‡ô»V¯÷ñânŠhøå[:Ž]ŸMs<·–ñ¸ÿä•»K¡"ÏmÏí·˜{õã×HŒáÞÞ;6y©?Ÿûëá°°*E·m±å®Œ[ ͸–™™‰]©ûˈ^7õ1b¹=FX~Ô-Tá© X<±î©Fu˜ø§3•ÞŠcÚØ“’Ñï¸uz[¡ÑpGˆõòåE¢ìû“i² 4™3ŽD„Ž>Tzˆ.P™y‹˜ãƒyäf® ø$-¹ÆC´ÄŽ'‹¡ÿ¡ÑÖòi=F‡put‰÷ÞQèHæî4—`‘šóg÷ÆèP±Ë¡\Ë7>ît mcÔ^ Ûe ή‰˜qÞþ.TIrnÒNw»¸—,8“Ÿ;h)ó6*·ÝwR y“tÍW©¦‹6€¦öN힣ࣾywŠÊÖ¾¨ŒÁÞúµ¸úM€?–Úÿ\uææû{ åÏã@ÿÈÜå¿{rþÞr_–ŸøýBùÿ³÷&Û’K’ Š"ëÿ¿³W}zQ}ÝTz¡£ðˆ “YùXÕ<9p¸áט©Éx¿,m ˜ÿ8°L3¨:îï.3F¦]°ÕΈ*¯ú*Þ½_ Ô§TËM*f\Z$OjݨgEÂDóê^“öPÍ‚œ 0Š#³ë?ð¥-XàÀ—A Èh¬)SF:nH¨RÍ“Õwšhï!t­¬;,ÐòàAF^´DTy^ç4£”‚Ù¬è“O0M`öµ”y½Y‚a£LÙ:VFwÆ;ÏWyl üͲœÀ$m_…áäûwþë®ÎÔ^©Ãa”Þ CsÑ5º’bIn”i4Q`ÍŽÐ×I†ß‚zfÕ¨r{fK00jœg#:ˆMw"ßß(i)«L<€/±<7ç~ö9;7Ïmù½3àŽõÏi9~§à·×UübézH¿õ{x‘‡`?‚2F û¨ßn¨EUU±–šq—°ýenˆ Ae¡ÿÛrwzÚÞF›ï-©WT‰ä âó·—à.‚\ðxgã”®®(¬ÛTBɈþ©üˆh ²Ì+€¨bjà;œœ¡£Y:~¯œ…,$¾q(DêtjÁ=@ ¨K­3jlîÔœ•UÙ/_¸Õ’ÇȈ³hp @¨èOàbÙýˆdv™í½Ý)#}Ø"Ø…#Ån¢Þ?0GÐöRMCÝ ÊéGÁFê;[sÓÜÀ È,ŸÈ·ç¨â<ƒ™‡¨z"»s7]œVÎí"²Œ°·Õƒä5Õ÷XUdGÏîUráß‘º‘»ÂÛý„ï IýpîOœO&âÎ5ž÷ÈBˆ‹Iev‹÷¦X.Øãñ¸ gQ< „€Es¶l‡ƒ| f÷‚W÷*´i~uWÆ™?¡©YU¡œ:Ê®™Íhë]œKÄ_.¨é³Ïc5gþÏqêîq óëL… g <•%ÕôèxflÆ]Ϫd\ý‘ñä×Á“‘˜Mé™2±Eâ¿ÏØ÷ö;„*=ÇÅo7ú˜Üãk*Û»‚&¸’£þ\L §)±¨çB…a4)ÇK+ C¬ _¡©Æ‘|\7ìý¼Ï¨¿ˆØ–šbàÉvÈéMlgÍI93L*Ô­·îˆ•ÈŽÅ,ÙÑþðḛ̀{“£¸Däú|"¿É*¸Ó–MYÜtdÉÙARÈ&ícн´È=Øæ¿öGDþãBÚÂ:½qÇ»=W4Ïx p¦ˆ{­†ÿ©@/wÏún‘ä'R`HR!rAÿ%[È *”©ñµãã_ŸÏ`IwAD~àÚ—­t|;üŒÏžÁø?»ô 1Ͼ«ëï63ƒ(ðc©Pþh_Eaá.àWãnRÙ¥Ÿ~µ?´ˆLs·Ó±¥oÞaªeè(`œ÷«…[p]Ú³^Cô7`ð»lrŽ[õ„ˆªÀ}€¶)Tdo.Ó|&ü´ÊìÍŠÔþHÙ›Ô|¿Šm³¤²dQ3àQL67„”ëBJ¸;”ìeÂVüâ$Aží·ŒèC¨ŠYªÔ>›šÅd_¢z$Oä¹€bù<ºÓǃÃäv™d}ŸcüMï\LõÿTÊeäÇ&Uç1Ë`¹Ü‚œ0#öV§¤­œGåÉ u‰ Í­%G'~S †ëÒMS^ ŸÖÑx{FÓÞë7VøWñ%:r[cŽ‘ °Ï à4â|ðn‰º(~¿5x3B%fÂÓ$…™E“3+*'ñ wîwÉ,Í5G¿N¹˜cœðx~üàøÇVylBÏÕcªžWò7[ò!ŸãM’?<>ïÞý»ïEH‡(óíŠÖ æ 2pb ý­Pøgà‡Ÿ"¬øZûŸøè3ÝϾ–/¿¹…‹Ç•ü? èOúü;^äù›?œiø»¨ç‰®Ã€D%fÄ|pΛˆÆ!È)Á,YñsGÔ@2üÂiêÍ™0Šë!!§°²³L39›æ¬mðî5nè¢mßÑi1[QsQñPz¦Ðð±g« ú ¢´¬ÃM•¾è *ÁMÔLŠ€u €%!éC³ë@b¹té™ ÷Ž4ñÂG0qlîqv4)ŸX…½E¢1²ÛHBÁ`#&¤JQ‚æ!˜Š@î/`¬àgH̱%à§@ÿË=ÉÈcâl0Ne+2Ù°Ô%;¸wš\r ó 9hƒA¯P¿ÿý±àHâí"ä?vˆÁxЊ ÐÛ×ÚÎÞóf,ÏÙ²ûäì9(îß ìë,újKü—Âä3çg6³¾}År7"ÜÞÞ‹µî¸Îä¦à/ljwYÿý›ü²äA„×Û̧XÅÝ5îÁ”þB×u™¥ž=GN@*ú54ñîÐ¥0‘ò²™gRWQ­c– ³ªu¹ãŒR[^(¤~]Ö̇-‚4$éBЦ­/ÜʱëG¯§‰WslÊU¨q§Hƒµ —d¿pÔIû`o·x17¥e*U*y‹=íp¨(_aUÕÍ C–^&\’ñÒ$5®";…ôU‰ {5 @oÎgnÁªª?‘%²·øbAö,­G—Óà¯zA$UÄ ñõpqIIþªŠ%›9PãðnVÄGA²b>ÍÅœRJDó'îXðJHaªRYÌJ¨!ùÞ§[뤴³Ïy;V…Æ+XÆ<"ò&Äq~Ÿ¢;o'R§…å¬hÒ×ïóF)*³E >­@¾2lªŠ¢˜‘gSSØ”g»ç]f˜ÍÄŒJ3Lb “.òŠ3A1eÑ IDAT{fÖeÝöÒ£íÀ»‘3a…¯vFœQ{¾$X¶È2޾Û°Ý%d§}pï-"zéJåVšaifqã9îf毡µ“¹J]± v&M.#‡"âãÌó㹃©Ögókÿµ²‘„[pE¹,a~˨®â§«3©rR€kXv™øòµÅU°oäÝ«Çø|hWÊ|nGœD‹×Òm‘ êW}‹\ G:û»s娧läåÈ윒ÌBŠÃY×Y•s8ü~ÆÇ—ÜûÉÂdo©kö1Ûb I]¸tùÙ¹Døoçi"åC^M·ÑÆóS%V¡½ûXðvÛ¨GôåSÀâ¹@ÔëH±f6Ç$çœÃma°ÐÚÁ=¸šGJ³mF×¥ºÇÂ’¡pÞnÄÊÀ™lBÎèMo`Z —jaÞ’Êý¥~3ôJrÇÀ`€v#bA‹YÇh‡U?ú&„ÜŸ í9?'òPWEmÒ©_ÕјR8PkëúÏÜPÀh0´Ìˆ÷~¸"G#'ç(© ýÄNŸ°ÖÀô|_zƒ‚ñµÉT Y¾ý8Uj»8Ä8oÖñ£ðõ±bPE_åxCHD1 kF¥Âª-‡ô&"Sà`pàålw~‚+óKª¯ðí­ÇþÌ#_á~Enzã]áh`ya7»Ýò–ÛŒ1±ò¼o…}JÂWX c²åùøÕñbŽá+vŽ3è/C·¿×Yphù{„ÿõß ÿY@ø;ôûø/ëø¯pà÷ÐÿùÀN #¾åÈÜŸ ,:ËLD¡GÏ-` ´ðÝE£¬r ‹ûzF½\j*]ÔOPdCH®T §H܃k­Ì¼¶\-EPZ®3R6Ø(õ£ÿ W×X.Ý¿Bçglu¿0 bôŸ“03G(-ƒðWõd¡Ì ¿¬&Û/)£ì ú.bæü„‡ y’RV pÕ-t‘oݲ mÀJu£É ; ¢‹j´4€2Ï?Áœ9lc¼h#šwGö®†¡¦yÇ/n}õØ"ß>I‚¦ ˜c† Bó>cŽNHƒ¼¯÷ð/Ã@1ÙƒÖ3žÜáßã½>N©v“ä·:06×,}˜ûÆÙÁÛÏ1ÕwºúV}{|Ìòa¼œŸ´ÁÏì|¥^Ù‡ïVyO’÷vƒŸâ?\?GU –`ÖÏØ€ OºG # !õ– þ«¬—¸m´ (±I5SRÜw9#m'3\Q#%Œ u†Î`ƒêà¬yS|mǘÆú£PB ©`ýv§KÂÅ †¬ý;sQé@ìãsÓ`V NÊ¿Èˉ”D Œñš."0"ÊéG*„ÀÀejWE©†½|çna»fV’s4ðÑ qõGz€«˜{.`7Ü!õ¼íõAÒ$CvW!\‘Ο)/Ϭ±P &ƒ8 ð2†=ïG‡ü®ÝÉXÉO%¤-M;Çd¡8£ÚÁEÔ9­h órk»õ§_³zX}u³°½Æ2I£ÔP(ÉΖd —hé^}ô3a¡:þJFшž¬PLòðãÐø&\+xŒCâápÚJ"º^ "fÕoa‘ç“ÙÂueIY2¹+Í`¢kWm ÇÖÓõ$¬jfŒÎ WÍìͪÎéc ?ÛKoq 7ƒÇÇ‘CÍ·f7NiÖ ÓkÉGŒ®?G„´‰úY Ó¾êWÆõU\&Åÿˆä—½o†RO1B®D˜56¨°d¼'9@\K?ÛFd6ÅKChÐï(Ÿ$¹ ÍÕoòòŒ {ÁáÖZ $Ê«'ò ÈŒeÏ#+s»¤Z± "×ÖcÒsÎýz©û¹õ>Ï2úiI1ã²ëó¿Kr,–#ðÞ!ïò w&Ùf&^qGœÎý¢OùRÌ•:’ö‡iÈÃ$Ì „Í[“öxÎMÎHÀ¼°þí^-Ƀ»:@j*êÜ ³÷¸%ÒH¹Tü àƒyÞónÛþ˜ #2CGp&ŸÏv]‚¢%*0hH½xAT-ò¶l›Ø6äü¡º.…ªvê]º Þ¬LëqCiJ¾,ÏPg‰wœMP «;Ô)TWSzPï=o=2ñâëW-ðuÌ¢G»\– L¡uÄ–ic·!mB¬ÓšETQaÁh-Oð¼E‹0 “Ž ‰Lw´/:÷tÇܸøÝ§ž„´õ˜9'WÆneÉ„ z.nÉï^ï|¿‚a¬,ÏFi1ÇyÒUg± îT~š¸Û8ÍÁãMñ3Ì6ŸËöçG™ gIk±Øû¹|îO)‡´#6âûÉ{xÁ‰jûGòäþáC@¨o\6ílQîàâØáP¿Á;‰XõÂ~`S¶dª`$•MQW»x ÷'ŽÔ—Šmb‰™ùxbQ]€ªÅ©¡çœ*‹´hLß/«v³< <— ë0_—Qº! w!¶@„#ü§°þ‚§Hú:¢œþb‰¡w|KXôù<<`tÜ)ƒ£@SÚyË};¹8‡[nB–äPz%¦ºæ‰}O™üržL;'s–ũĩ,£‘µõ|«Ã½7Á}ò­ ùíùmŸ‰5Ãw6ý }Cÿ'õ|uüŒÔæ+úÿ^Ñ?ù¤Þ!ßV´ÛíñNÄÛ¸ÐÝÆh‰VÌ”Z» ìóùX=Àq­úÛm‰Óüd„áNC€‹ý‘ÊÅ”†sˆÌRi~gKƒ´–ô|U5Ûû³c _Ò’±Ìòƒú¶@ÿIóPÖRÌEGZÖ%wK †ØihD‚~ÐjüÄ%N€LaÌÌ´Î;¥Áâºu jí¨_—ó>îŠÒ·F)ÅŒª%QiŸ–Gñ„QÝ“y"F#¾~©ßîÆÆw´Ïš<9Œ•Ï÷z›ÓÌ{Q øÇimnCMùø˜'ôsë/¸/ªä›]ð¨Î/ò¤9]}Â#A~>‰¼@IûxŸ±œ4ð=Êß:‘7smi‰?+FÃ-jÅÊ…qß¿áí¯˜–D‚[äšm¡kŠ#Ë䜎EÏl°@Xëæ~šrQÿtuº\bþêŒ0â€:SzšQ{ãÈäËŠŽ1,,·9¹—„!Å×uƒŒXü¡ýJ=•›ï`ìOç1ðp]þqÐ4q‹ÉRèVxB$2†Ú!ï,exÁ#Ó0óxL˜áä%åÒ à7‚ÇW)Tâ,œ 2r¯Œ^’M1PMÄhKFšßÊ=GËÎã-i€$$<ª>ÏF% ¼9!X7qr7JV `ÅÜÁýdÕ'Jž%º vÓ–B/u¸#”Ykû(2QwYúnÀ›‡Xô|7ÛâÙÎÑÑÏiS:o±ª°­]žþOV@u¹(ÉÍZbY¼çµÅg°>¥VÅd#r5Œ{/S XÕ"—ÉÑ“R­û)莻”éjåÈÉ Ê•»Ô9—æ‘FroÜŽxp¬²å/ãÙë(”öO£ÞÀ&+ÂŽ‡_â©°Œ-ý˜™F²ƒOa˜H`cýw#[½“y~ªð¼htßG½n“%Ÿ (¬3TEjPWÊÎ&f •vwN„pâZ›ºBì ×%Üp;Víž4~2‘3éÉýj"úCc |`)‹)±?_FÝ#¬)Õ•<„®ÅÑ6ŒÉ›¿® žŠŠÈfúÙLO±ðËiß_e ?qª‹ 0+©p×¥úèçÑi+[©FRxúù_rI4ɽöá{JZˆã\r‰â”þ…+z·Ç; ‘±«Ùüüá¨=xmÿ*·k1+.qOën¦Ùä•D·ùìC¨¬ku}zx¥d{ò‘Ó«ï,õ-G¨eÝ69<¢ƒ).UxòŸ”šE£wA¥¶œô忏ܬª#¯<Ì®€aE<Èh1L ™ñ1µÿq Çç€<üÂ<Žw·XÞά–á˜{cA£}‡Œ«@ªIŠr;ë¸@'Ç6\ã©h§0>ŽxŒ!¦`ç$½ %\¼O·´p$à,¦~ªZ3:+s± еš¼>¯*#–”ƒæ.kpëá(9ã•öÈlvv‹˜˜‹p•L‹}Ñ^›ÇûÌÈ-Û/üwKü‹Fš¼'ð°M)ê`Èh"ü=Hs^ȧW· ¯6¦_Ôÿ§õ«OàO®¤œš®¿Š“ã èòVùüŠì¿*ÿ³h4·òOlóý‹ßÀþÓòoÂëÿ‹~{èÿL'ðDWëß4{›½LÚ@.Jsã*ÑËKQ‘¡òÓ[ ÛS'‡(ö¥K dÝ)à–v4–Ÿ>#þ…d$ !â¡+žÅcp!Aöý¸ !eã1¬i P¶õÙ ©¡# •4û.OùÄÛ€@–˜Íci“I/’ƒ>Ë 4®C¡÷r¶Ý:ž¾V˜ÈÝ–f_3<ôÌÿõÑ@;Æ;¾Â,f=ƒR™É™œ'ÖoóÅÓqŠ;–é[Oû”œûfg‡}L:©ú¡úŸK;³é¹ˆò–S„¾AFîБ>{´`Œsîø— ”É6¬Yé¾oœV…—|ñ¢dƒŒa®/\DèÌý•…Gûìx³E¾ÖÑß:Á{Ë^ßÏw”_ÞÄò†èógnùò‡ÞÞâu³qixïpª™y|KdFOHÖÅ UGçòöêÈ,ºrŽÎŽŒ…˜ã8ÚÏRÐÂð&g¢6‡G|ôœQN?óâpîŽøJQs¤Ø5]ò0"<6N”©Ir›¿ƒxs9™Tû|ï+-âä6&kgn¬±ãwÆŠêY#)«7¨€7)ž5' üÁF܌ȳ§ODEíèbv‰ŸšÞ²/º2˜…‰)õJ[›ï«ªËõºx>w^“C@èÙÄ_Ê'f)e^ãØ6f¦.c·TXÞŒa=Yß2]ëZ‘-ât…4{‰oÖH[|óæCå(…fœëü` Èvã_xãU²sÔ¿ÈX™éè+A*d›XÔÞxp:J‰0¤Mj®·®#À'SA¨é[)K¬¸÷ ôž´mÐ [%bŽ~ í)xÉ©y¼ŒÑ £+//¦õž‡¿Ð÷G³ô¬DªíÍ/Ú|¶“¤ºð»¤ñÐKDÍ¡×?YGÓ£Mg¬±¶Ä"­4‘Š¢\éÿÉ&#[²ŒF‰m¿VkïSÅvâI`޲ê†e„êˆ5øÌef«²D•²#Òµkê<. ñLTÝHF[“5+¥Sñ¨µPvñêg;Ðc²Ô ¬ô5`ßÔ Q¢êb" H~†•$$Óõec¢"©¹$M`1qZIß)ÊIÉ^ówÎq%çÔÝ/©ŽaA”ÂÝye2T–ï•TF;ó'險0zÚFú)¡q.°ûa™n„Ò©º«6ì ©¼¾)ë†[ ¥Š°êñ’† l´a:¹Ž#zIâÆd‰©zÊ9¼‰~lŠ#A®¶8Î0pi\g:‰ŸæpL%8¨áÑZB^Pc }ÜÝ´°pÉ2‘m¶D¶ìe¶år§—tS÷V4m”ï:$Kñò.Î]X^eü‡BŒ{S«+܃XpºÎ6ýX@rEŒ^3Ú¬†L¡ýÎ`”4JöäôåŽ4‹Öœ`F°åKÌD,l>cYù_ À:äöüh¶é% $‚ùð( +ÝÇøã¬Sç*}„‡¤ ÖŠ—ç§Ýnž£"À%7T嘮3©•íuëÀ);“æ‡Oþ±´rµ^ˆ\6Y¹JAîWR•Óªdjo)ÆG~ø6p’–^b?GhÜBdì]ÙÄ~,`-ÔAy›ÞÖST…Šì˜²t¥Oé#a›t y$¹Ç¶:(fQ0µÙJóT«Àbô´x:1C>ì¬%ïvŽXs‰I(dlqûM;i.´˜ä?P2ÿýºægœt{*Âèf¡>Ö“œÜ€WµrDƒ=EoWQÎQ–‚þÒ—¢ÎC¯Ç<*‹á88(*•aÈÿo'[ÝÙ¢Ç)öùQµ±¯GV9Tò˜'Ễ23ÆPlϦùˆ[ÖŠØæºP~~Í-yü=¿¾ ðȼa‰àfm`îZ™ÍyFž ›o=¾'·Éƒ¸ |Y[ßö·o±>/†<ÊÓ¾Aå7äë/æ†x!—~ò—>iޝð‰ü~ñ bÏ¿Y±þßòÞÿ ÿòÓý»}vܽ)rïþ­BàÄlI¦[ÁÒImtÍ ÓdN³­ÐIa¥×&T±°¸·P¢ÞèÆ,›îÏíï–\’ko†øûšcªaXŸò˜È 0D Ãgá§ÛÀ *¬ö4?æ­ˆèž3ÏÎ b{›\é­Ý#Ô GŽ:º²mÛIj*i°©Ö'“®ðÒ…˜¢öÎRž@Wü¥b‘Wø1Ú¼r¹Ì\±AU:©¤jp ÍŽ†¢xfÑÔ¾Åïpæ\Ü›xNó²³÷þ[–¯™7í¼œ†Â禂 Iã8š€;ùˆ¿¢àËþÐÝ'™$#WF‚†~[­ºs^hõ§LÛ3çöBEÄ¡+lÇñA°€·ðT‘‘D~‹-ÿ.á¤õ}é!^¨£¯üë¡'ÿiÞmóÅ/ö~ù%MÏ«¡·Ô=‡Š2Â^²+2™Çô½^ˆHòhêz,Õ³û×Á'­paJ;ZÞ8 aÑ™›žÆÅ‘W„ èŠ_šye¦V«K™Ü©àD.<3³˳ÔaÖ ÔìC®¹÷óYNúýè§ ~2Œ›'Á9:brÌ„¹ôúU®{´>t­ŠÍvJÛN5Ó@ÿÇXWIèÓŒ\AŸ‚¼ÐÒ5gœç‹Œì6£j¸.\oÚ n™˜‘Ô š·c>ÝOnR&Ùw"Rd£¸×ë[-6<&²þ%±Mª,L޲‚Ö%Œç§¯Æ$KÊ•úH¡mçÕU´Ò`>â Å2R£@u7Á˜M¢À.$•Þ[dª·20þkTÔd·&MÂAð_NwTuൻõêÓ)57;kOûŸR;—PÈá‡NkH§çù7¤êÞ‡øcf‚üNïÓµv]Ìý S˜Êzªí a¥ØÅ¸EŠgr±¤uLð°šµªÑò2²›¿lyZZ,6iƒ›¯Ö*4»;î‚Õ9ÈÙžêŸÅ±éÍUµ9ÎâÙŒVêrk‚ H4XË£ÃÍdšhüümpÉ£_ðêD$˜êåyëÆK} ² Y …Î?,R,SûJ-C{m”Å’"éÑ+b&Tó숅˜ƒý6^ÆpDB›/~ m$&–5Kók`BJù­¦÷Äé‘\Ö mR”r×s«ï}Zg{›”;Ë${_}jTIaUÏxÓÕ (Á¿+iYáD@uÜ‘$¶ÜB9a…‚ÎÁ ëˆÆta/ÒŠ¢Ê¦„Y¢Ž,6ë {¢œrHO,ͨŒª¥0Y[¯îRP=ö ú;ˆ|Æà’1P†óðOª/vi”QÞJ.ãÖqɵùŠ*ÉuJ¿‰Î,&»ÏGk­t$‹,¨ÑTݬHò¹œ€—Ñiò8 OYîN›bò‰NžGìÕ‘€`ü #”±˜ºÎzŒôu{ɇf´‘ ÝýÕd”AuÙ~·îmFþ€Š‰©áì }†Â_oo+¹ïº Ž˜Ì´ìm×¥FB¨ÎëD&ÆëÔÚ¿¯È·ÒÙP“ Ã¼à×ûR|‹µi‹ìïEIy¤jÆë/Äž»Éñ±eð ‰·ñZTDd¢Ri£óñàø»ò~ Èº]¢;œµãÙB‡aë*/U?Nh?l‰½5Ë7ÍZ·À׿ҘFU`ÔS¶úž¸E¸®SowZ–ŒžçÁY‰¿CÜ#† ×…»¼¬¤årà Tp`êò‚eGôNE+Xª÷KnÃörŽ&C™ x¶¦ªú˜”QvÇzÈqìF…±!2Š+p×eÿ©¬‡j.¸µ2ÈZÉoU‘Ëã߇q¼¢Äã!VQ [ÕÍ`ÿý¼H(´¥óyl—'¹pãH1¥¾ç’Æ‘‚-üqwáqÍ8e£è Oû40m8¢Èà#V«È <[¬Ësá¡>(¤>YH4^ì ]fHR{MSÉwd=5jsléâß°žö7uR·zä£Xø½œ¹í[@^áþÔ¯6…èçMżï™SôåO@î&~¶úþ^Æ™ˆ\çøvøkµEn™`“cž}ßRw`–|æëŒXœ'XKÕ¬nó,Àˆ›ÕkŠxQ¶ë좚2yש¸J‡•°£|>»ê4‹s½%ÛD«$?¶7¬Ð'ìÔúñ%Àgó:Ëè€0Ê…”0¬ ©™jdÊĸJ¥r8˜3ŸA5ÕÊ|˜í3ÌÓ¯°¯ãˆSÅ+ItºfpN¤©$Ô·2uCÈYA*.FTt[õ‚ô†·yþFĈxWM脓လlêr(Ë5°óF¯´o_FP‚·'†÷€Ù¥àgi dent˜‹KÞ¨ã•!ä6Ù²3¿ÁÁ¹•9ž›aJÜ1 i&^_Oi…ÛhR¹å¥¾øIÎÀá/O“ˆÙËS²:jótQQQ“sÎÉÃV ·+Îç-ŒÌu`‰ˆB oÙ´Dýìf®*3‘…êqs/A, >D0ƒ~r¬Ét•côPMزì>–MÅà b5ƒ6åÞ&ή-€Êä‚02¢×@½²Ç–©BGºæ©~k@¥ö13 eimÃ!%’ŒÜt„&XÚñy)D¥º8Ÿ•òc¶NÔÛÍ‘S"½!:W›Œ\ñ-(aJ3ééúT¼™ x©l˘"„&B|·yUì_|;‘ymÐý1]a'òXx…Ö'¿Û\…Dpæ.RÂ0®xÒNÁ ®U{† &˜KcöÂìã°4J‹ÄŠ*€±ý"@š}œ«Þ©0ºDrÌq¿(‰éЀP£ÁÄ!«<úÐ0¤­"FV¤s[hÚÇβÊH+¥ž*BʱðSÙüC {éCùo#2~†>rˆº[õÈ?ˆv ò@Ǫˆ`˜SêŒ$Š‚\eJÎcCelØ%º Ë×ÂgéuTvÊ[^}í·û5R%*9)¤Q*â…("{‹.SÞbIî˜HW“eüŠ3€ìíc~3+y¸¹µœOC.¥ ·ÙB@§± Z;PŽg —`缪S"&Ÿ]—¯”Ëü™íæL›‰K¸R_®%²,åG®Kªª$ KÀ~Ä¥Ê(d“£›=erD×nÖh4˜Gëh·áÉ ÀõË® ¹zÕ\A¬²¼zóÃ1Qô{Iy ÃâObü²/Á¶(ÄKA{æp-õð¹fÜœÓâÚ4U½4Ûq2m¸IÙ üØªŠ˜|¥U‚”ZIœ{Ù^¥Œ¶#•F’ô!µê¿óÞ,*3¡Ù![‰âȈ©‡´-çGW³p8|‘.þõ÷è*„â^Ëg‰ŠPi7b“ƒ¶—Y hËæ¶eP œg©a4¿Ç_+|GYÑy(¬ÜhFÃÒ<Á2v ¾JÏ‹¿ðQbá–YCÇ %´ìB²:èc+ `¦¶y†²“É0GÑÂ6|Dg.€¼a×Ò³IÄVt ´Ýñ‘c—zuÝØÿç½w9û Þô”xǵù8ÔOÌ+NP™aßøŸÔç?*q~¥{þ“hþ3æâçÐÿ·xŠ_`ÏÞƒ2êÿŸ¿ Íÿ³ýÏMHN IDATãƒøoü©_þö§pÚùôO¶aUBT0&*T;·EQŒå>úU‘](l3»pûä²$d¬¤¶½4yÒKÛK³Y…¨´¨J˜TŒ‚51šàœ‹'#™'AÙÜÈ·y„€kS‡xÕsšû¬QCé[#EÈÊèÞQˆBS 6[pío[;goO–NUQêÜbí²öHNÄLÇ©º¦îMAš5wÊâ·u6sÊÉňµbÖJe:f¶LpÑ;ËØfgˆ+Þr¤2$™/µ,陾7SŽó{B΋à}¼ÚÊ¡ñÇ ’QZÛuO¬„F‰q %zAh ›ç44™†½;Þä½1÷!uOøwî©,@pðzÍÚ®9ßásïÀ+ÿSoòkzàKß0E“ãÀ8&ø9 Ïñ%0Bdˆw„Ý1æÛ/•²/% y#º? ^ý°ÍV(ˆ©‘ûÈ>ål|Â1,¨êR1î¢%n´Î¿êŒ´)µ’ Â’®¡Ñ«´ ¤”Êü…)—†4Eq(‹ð3³0án„þ©ãÎîpÇ8XE㯵dhÅê¿´J†‡Ê/ ÖúAÓW;ˆã@JÓJ°e– ü˜í é(oî(¸j7ä4ÛŽµñÝF`+]Âþ–ŠuEŸéoè ›êÌ „³|Wø$àØ¢’jŸÉ¢;À;wòä3*ùò›ðx1ç"ßÕ1йtæy²èNWx»Âlv.-ât³ì¸w¥zF¥ø¤oãýù¶“JgWæ¼±òFÍANg)µ <«të>f¸¼Íwº¤ª^Qùd_0ŒK±~èÐDñ(DŸz…nÝáý9/Œ1GÃßQBÒcä„T!?®f¶T»¦¥£cb\`’~Ñ´Õ´ŵ”#EÁ)q&9±øùÈbU|Åm„(VTK„£îðØl7„.•ûÚÒ]/ÎLô4ˆšäê!YF“GU ´&j<숳~ÙÐFöEÛjѲê™Ó=éðá; ƒ;öõ\ó[2…r~:r'Sx#öV1¯YoL¨£Øæ ª˜-½ª·¨³µrAú€éýN™ÇÞ+GQ]V:´tTØQfú­<¶Î5‹!=Ù†ÀÔ…0iGªyBH`ìMØžz€äáókÜ#Šƒ¶r/'í‡Ó¸Åq¬;¢*Ûùþ§•Ñx‹RËró+ÀCPzÈûÁïØü{ ôxW1?¾½,Þx Å?d;п‡"ÿ‰ò¿ÚSðWþÜ?ÆÀ_AK?‡õÿB|п Õ1¡üÛÒósÎi4O%«sïó&"‘åÕN¾³ =ÜÔq‰@¢*ÍRídæYup‹ºÿ$F ©,œŸq>š„d,"G“ÈÿÃÄ"Ïèš”§”šafå”ÞqéÝ#Ŷ, ¨E2ËÈy±fÏ-(&¸G’*;ODÀ‹m¸^s‹/ÐMÚ(U¥k"함¬aO:›ÄMÏ-°*moôâÂ{Dó€TÇ&{ È ‘[þÍ®ÐLD€æ—Lu÷Ý‘ýÄ‹ƒÌ°:È?Ow¥¹Ì"´û-”§à&ë4;ð82¼nˆvMã3Ÿ?vËâÇs…–eÞ¶DÈw4ÿ(8‹”1% ·¾¾ö•ö4ðµo‡¥°Ö ÈQQðòU>=?µ8Üü«Ê—d@9—p<Ì‹¸YÞÝ‘†³8¯Äs·¾³)%ãèæšk3ó“ôZzø+DªdEávsza{b¶îzü«Ôô~Ül!ž®¼¬6oÌ«ZÅÐv°«14/Ìl–þEy5­\’…ãóI ÓgVúØØj¶e­%Vu“uêˆ&”ˆ_J´ „Š™3޹‰e 5Úü·,.$Ÿ Õ‘Xå6‰Ãf€#‰©#ƆYñç!Y)ÐkEÆŠš,ÚLÝaß©[ÎsA&ü‘ÁM{B]Ÿ²Ïm¥”Å"`Ï×ÿHiÞ`çŸiåFÑmö9vQ2I± ]2šÁ½týÁ×, ñ€»¨aE«†€5mhî]`jÉFK·“ ¸·@€í-ŒÆê8̼(&-TàdÐl*ÊtAHétûz+,ò–âJùY€O: q1ÆæUƒUBìLJJìfô1(Xñ©"JÊãˆk^)ô?Ö ö¾iXðvº«dt’Öy$E4°Å  ŠÉSkv9Ë*ëÇ‚^¾‹¨?œn\"V»¸À€åK×6Wónóx4—Z˜Ür]Tå‡]1Ñõ§N$šªjÚ†iHs¥ ÿ£ƒ ~ÃÐ ²"föHU%×2]§— úi·x_Õ*lMÜ:}æöHܽ¡ê9Wœk1ß½“ß2YšÇ° ŠzݘË?¢ÏÃu¤Ð´Li¿oÈT˜ù80Þëw]·Ï”êq{aXñ”¾ƒTŽámˆR#Uùf†à€Ò³”3ÅAÆ>ò+àÇþx+{—þã¯xœÐyD<}ƒùUújÞ§Žž£Ôí LúU2ùM±øåU ULþgÙ‹¶ðo%þ&Äùá·´œ_~ÆÿOúêTàkGˆüæmr¯„e¨Ù³D7B1Ûp#”ÅEô™{ƒÔqsiPâGc }JQnNáݽ´‘mk¤z¢DŽP–G`’ƒ@Ea4…š™VªYâ+ZÖ°T zk ê°lí xÖ”ºWÞNàï‹Þ=?>Ø]9[äžèë}Ä8˜@i;³\R¼åÙýÀ!1 t¡ãYeÙÙªÙ }À`‹“+pjÿkäæÄFlQý^½$Ó©Ð1A(„ͯDšWP¾mG¬ÿå î>óú‹8}˜ùJ}ß î¸vO˜' ÝYÍ:à^€2þóÕÎñ¥÷`"yÉØ'Úï(ü¹+œlŽU îå¼\ó O ?ÝÆÜ÷Ž/¬Í4,ñ·Ø„Ûóø®’ùûŒk#—¨nW˜í›o}@°ˆ\ì‰ÙôLÍØ®UÔ åïp´3GB’D,¦%çÏ7K¶c]¾§m7+¦jªáUÅUQ@{qð‘ÓˆBÍs!É»´ôXŽw{¸Ú|Âý2˜qï?l­ú«[3©—£ð°¨ÈÈog¥Ÿw`iÿ€$J;Ú êÈcó¼1¯ªœ2eCÆÑmÊ®8¯xš:M®?ŸØfWd5wÄ4^h[°ÝI>JÜYÉïm¨èµY Nüw4Ä[T÷ˉíÄV€³å>Á”KaÎ@Äm‘…3æŒÖô‹§›hz,„ u~±q+R%^ æM.g¡(ží”]ÉéÏÓ$HÀ+uzI H¸­E]³©#gN@!ÃðŒ#™ÎËi+hH¨Z¶x¹%ˆN1ñ0øÝ± [Ä<Ì— ±¿£ö®àNGú#$@wÈ!°ÖÙµÞÂcó£^Á2öÎ["<`“ò7îÃh84¨ZpN?(ÂÑ«í"bü¤"›"J˪\ˆ<‹4¥CÌ´»ºð)Ò”,,7¶·3²êè’H„ U3s!åô·¤Ê\Vi±Î {þHf ŽÃÉËlw§HDŒF…=Dsr ¿|-á+òAšNÿCöã\½ÉD.D]£$Õ—È%?ôÚÞ™D/G†·Å@æ#ª¶î0Aÿ.ÙH×);ë1{f)$jÔ™Â5’ϲíÔEð¨.õ¨T˜¡h\åªØõ êÀ’&¬­,”º®ÒŽ‹ùî!„´môOŸ*LMªB8ê—Á‘.ÒÁçu *R» ]£/V²çËßó(ûáMEVÁ3³³¢·BØ*RHù³µ8úIJ“AY½.ê¡RÅíäAdi^½)b—# e ¢×A‰«ˆ¨2]í° vÏe:7H Oˆ!¢V–¬J ¬ŸÎüRT!N°ÛÙ¼Š'D.ègYl_Q?ûððàW:‡‹W¡æ«€†×ì#qõoQ±wÔ%&¶w”c¡ÿ¯ñFv:< ‘×D6Ûº>éë4³ÔÈËââ5\kQ„K ¶ —¯ï&"²ÏÏ)5¬xw 8œ¶FôgP¾ý -UÎáÇgõLUÙNçc~·4¼¨Lé]UÁÊ–(7±ÙK[#ÙFØb{{œ|ö&ù?øc]Ë­èN) ¶rSÀKU׺ [iBÙ;I§²DÊÂKÔ{Š\w3­ÓDÙ”dK ÉtÈ^gó‡Fqúã¢w*œ@"K#Ó0V ‹Ê¡JÎõë i»Í¬svÂrÄovÓQÌ€ªBnx"¥P¸¡Wvæäg-,Zþði¯WšÃ^0ÈQκy¸‹µCê3ùÃ<¾ªg.Xn‹>`š…ÔN´1ËQØÆ99sS[v@‰£|(LEоIWµÁi&‘=¥kÚåƒÁpq¿͵ šq9ü«¯É¡¦ôΞ u:IÄNoÔ²©¨·(²S°xBoO›Cá#ùXŠ×hÆÞ¸G?O—úÌî4äÂ3‹²G1¯ÜRŒ Mâ½ã17÷ã.>ö^·Ó<~7Ùÿ&Ú|C«-“ïE/…¿|UÛA¾7ÿ†oÌoWèiEÀ²_áå|œÊnìÆëó‹žën§]øÏâþl~›'ø÷ùh|¿¹Î¼‘ßë~öœÑÿÓYZa‹PÛœÍ#ÆŽ\?TÄŸò$ÇT£bêJÂÍ8Ö©ü,&×Kø¹úùs0"Xn®ŽϽQ]"©y* )}¢ê5ÄèÕŠì&•4žKåBI“œDœªZgûÑô6¦’œäS»}«A9EKåg÷@Œ1øI߃¹Cçk °Ø‘¢ù´TæJÐZÞ ay.¤ÂãWÙ§_1Ûé½=° lk"ƒz–zf|Û¼?:’_ÁÏÞÔ#o4-ÀKç½.c—¡âHV¨¥š›ðïHSli#G{Œ…áfP3Ž6Œ`0£ôÑ£ƒ,B,,bY‚[`ÇÃR(‘]ü"MɃ#¶°]CÝ.“N­Â‰ŒŽcQ éºí⯢f*’Xõ°‹tIhÈ aÕÄZMmõjz<ŒoÑU@—zÓ›dKèÂRù”ƒ—¢±3Fú^=:STÙkT)¶duºBìŽ0šƒˆQŽW YWÕiÜú)dv'8´Ûòž ¦Î¤OÓýˆì)NêjdO̶ÖP£WƒÌ>pg\4\KõV(å!2m3je$Ð)ë•F~V*³1VÓàHvõ#Å™<ªV©ÄÖѹê2{Bd)ÂP |ÂÝŒ9ø)D™à&Â,©i,t|åZ—=ÝŠÃ݆ÒH©Bu›Ñ„k¿Mä)+Ÿ¢ÏG®e(Z5mûÏÒ+‹eÀ ¼ÎQFÀÈM¿a€¥A¯i·ió3ù}µr2N<Ôt —•„Ä<è2‚!º°€½C—â9Kc{,>·Òp*uÊ×.‹´`?ë“Ñ,dð7¾tù¹Í.Ÿ&UÍTfØNÞFІ¸©É"Þ„Õ*Mq/¬§«7µ2 F‚²sÀÛäÂBO@Aeû•3:¦¼3•î¬Ãô;Q­íyí¹và¢Ñ É²x´|WEÍ ä}C׈"*Ðcó~&b”yž1’ÓÐ;WЈÝÈí,lÁ9¡¦é^Ê*쵚œ›öcË5Gõ*séQÇ⛃"k$‰ ! v)€PtYqŸ… …¯OOOY Ú‰OH–Êïh-ŒOãý_9F固¼3&¬‹b"?"€OTõ:=¿Ñk \¸wA†Ú«œqov(Ý®ˆ®œf&} ~k‰ðZª§Zv¦ ]ßɪJÁÒ-#Ð-¨^òƒËÔ¢#î€?o%­yd¶Ä·è±?DZOÇÝc) *;;™UØ;„â ¹-³ÎŽ)˜YNšÆ½ÕFä2qëÈî%‘;°Œ\²*öT–èÇëq…¬Kt-QÿL–(…žìs§‰™}”—S–éyL±ÆÀ´ºNßÔ½`=yæ¹~RúÔ¹;¹P]˜>góÉwÇØ Ï}[SŒîæä-iò*‹í8†ã1º÷>ñˆvêG ™Nçnð ªm ÙÞ.Òó(†ûYwjâäìI‘V|%—uG-‡a:¿ä‹e·¯•uÊA„…¥ãÛôRȧ.ú ò?7æ¬1s†QG(Ð|ÏV–ÆœUæ¬ØR·Û=p+é•{5+;>ð„æ ¤xÛä=DÐ2#€~Géÿ°_ÈwÚf4ê¾Ò¿j.Ç£ûüKk€¶N¼Ž£@gÞö¦è£ñ\@«Ñ,”Æ#ÄvdtKt´Å÷MYÏøõ0<Ñœz·0.3•”U”¤þ;ª´¤üª#A_Uu©vJÕÝ6XË.(žêžý‘$ŽÒêì$ WÍ‚t d˜Å¦ÉY*þœú OFÆäNe{2‘Fzf°G3°Ê‹sС»¸ ¼–¨b .ÁEâ&3&똊F9‹ŒãŒÉÑ$½IÛ1ÂZ;QiæK„,dáÆ¤ ×V©|³^ âE.Aëæ®oÎ5†S)"$"ô‹ÊJ»Æìѵ)GDÍ3sÂÛ›g>wkáMHKãn¨ê3k>Sì鉛Žï>ÛÌ̶ÑZÈ?*G+‡O‡.ƒÃ›È¢Mfõ“MÆÞ—‚ýc#Ó\Ì¿1Î!W3>%Ã䦱$ù2iU!eÞµÆÄwþ°tVèµÙŽ/u|U±çÍÄbd{Æœõ@{î® ÷ǣʘ§c¬÷sU\KUUTK´?¦mWßΗã7qÎs1 ô„ _7®Û[÷VŒ÷|>¥§[u|ú`ä}Ê ‘K×¥ëò†8õmw¦õo1£íÊ,Š>×úT;ËAÇ6í•^×ʸLIÂe8a‡÷n¬À¡5Û$CÎXTŠbšéa%Wè ãÇöfE¸HNúË‚<,~©oòÏ)} 0õo¶Øûl¿5GÉ¥íwõ´æÑëÃÍÎÝrΖ¾ÉÇó˜“Æ0w(ºÂ&žª4ÝÁ"Ÿ\–?´í£ªÄÒ¹ÕõÇ¡Ègºc°4r ÃùÅB ²¼\K•!£§÷ÊF¥kç[ E)b»cÊn/æòo«âS1VUŸ*ÍSü˜°T!ÍNæy•³™ ÌLQÕp±"||ó…êÒ¦Ú<Š[Tظ«‘ªt!Xb'"ô°ŽNY©IÈj ÿºsÓ¾kTÍŸl•GbN!ÍñËj'ÕOâŸNÑ Õ¹‚èŒÏñëU[ñ¡¶w»6iUbÑ„Ük,Ÿ»,æVv´ƒ]¶p&ÕÆØ¾¼P©·ïé+ÂÎCùã?iMøãÖ"s ƒ¦±æ¥ðÖÂýrˆç Ч.ÌMêˆLæâ—¤ßNüøÙ?Úïü‘_þûŸ¹ðKÆà7MÃyø3P}\4þÞ ÿÿý¹/âW$ÿ9ßd³çG&Nz<˜Þ_µO¬ž=WêÕ¦ð»]œ«œŸ„c•VS:euOÂg4áv㹷ȱ:þr–Ø‚Ÿ30+Ôhž¡¹î˜{é&Oàˆf›¿é!Ÿuƒéçÿ·Kiô …bY,æ5Ùt·÷LR¢ÆðÝ1 ’jcBžÇ ËOçýnø¬Î$PŠ&¯o¬#};½´™gMl³ÛÀŠ `B>l<2޹§Žþ¦©¯/¥^ /Î-’Œ÷VïÿõæÌ=ëö_çjvãNWDRw§Býñ4ôµBÐoÓ´V™£/áxÃcD{“‰g‚+NkE|µ) Ë·}t3¼AüÏð}¾þ0åDØ[†Zî~ò“/ƒÇÓùÁŸ2ëÀÛFwkNæ:þV{ÿ¼ ß×õs»: ©jµ]ºi0‘P4Ž—Ŭ¢m¸¶ I:”_PÈ|tá~çE&Su°œÿõ`àš4R]j\6¾ØUz??(.?—F¢Ñ&L!s ®ñyŽ;…*^_p³7ÞbbÍ%‹¹93.«pʼÙ}/ápôX†ƒÔfPO²ùÑî*ïÌѰU‡Û†2„Û8«°‹R ô?¿•Œœ­g{’L^QxPà”BV¬ÔˆS…̆TMžÔ9&O¢øø&)Š®êëövOhPIm.È<÷JXZB»xœÉ´â"?ö˜§Õ›K%¬ IDAT§Dðá&©Q‹¬È¤(`H;{&åÒ¯ÔRD!j}[aÔn0'úæœr÷ãœ))0Zò0 TxÏ^| ›w-DŒq~@¼jfºôÜFú›µ¤(VÖ3Ž’$ÛˆElލt€`¨‰B@C͵åúj¨òa¸Ã­²ç2ÑAÓ÷´\eè{V{·Ý}4Z2NÉ'dsâm%j\),¦ƒgü F"×&ñ0Œ¸ð´9œ±£‰iÍXÎÑ(²áš„­©%øËÇ;ÿ¬‹µÚKl —R• ™5ºÅL‹âL?mû¢°€uÁ“ìˆìóÙFÒ|ÞÛ¨²`†(§b5øÆoÙ9¢ê«¶mFÌOÅde¸é„+©&D°ûBlgºd-w‰ „aÀªÆ7€‰§ATäÌ,¶Ôqv>ñì6€ÊÙè¤AX®ªw²*&&„‰ÀM¢âíOMµ¥e®FÔF5¦o†¤W˜¨·}SÚªª¥RÈ‹‹ÎS…‘:~ôÒK¸±A¢$Ò(iñÉúG²Ü!}Y–V¶C&Õ¹ÉÄÂb$…ùnV…Ûöï “™Å‰¥7µžㆦUĶ¿rµ¶¹ ™˜½æh#ó-:7×dY(©]þ2d D¸ cS ‚Ò¯ï^¿†HE*z±äñ鄦/ OÍ#æÛö1š±ì-Þ˜¶t® o°joPÕ\SdUp]Z#ˆ¯íÛLÿ¿è?ÌvWÞ&•Ûî‘»h„SÐM;˜Èäy–`íχrË­"" nÞ’È–n“KÁËsücþ¡kéúPÖÿ6#LÈ˧E£:Šrú3ZìN›T^Á]Üçíòñøâà©GRÅövø~Ãô&ØšßõNÞ®¨îùÈ+hY5×CÛܽ;umÝBv¦÷Z½OÙ}Œdú²M§šž ½^è2çªÃa³ r=ƒNX&^ÕÒ¸¿jáÂÂRÉÊÇqˆÓËÄ)u†kÿUWU|M{\«½Ïhýêí=´aV–=Ù¾±tØ/#$ÓoË(4fÏãeqÎ¯Ûæ‘ršÔ¥éxRV’‘é‡ê[bÈ$ÅÒ¿QE»ú=‘MÄ«Z¦>„ï’Z¹•×ßzA¦£Ž­È;üÿÕ!|œ±C¼•cÈ+ð 0¾güòvèç¨8{ Ùo޽ÿq~?:–ë0&˜“M߇S,_ʵ‹d¸Óí¿ÐN~ljoïÂîÇû»ÔÁìÿÂð;¾IÛGíüŸ’пæ5ýÓLø‡þ¼!à4²ð8üú¦á édΊ ŒÐÿˆ—ƒ'ðûtI°ôr"õ®Ãàn3t6a&wª²ß Atn0¯J$mgõ³¿?,FÀ{V*ê—¶!* FÓ`ižtC5ÓÍp"ê ÄŽ$ÀÜô¢ã i‹õÇœ ]_?AI;7Cõ§"{SDlúñž|ó‹ò>‡‰¡~‚*¬ËåŸtŸ†ì8#Exñ.Æœ,vìYùA™a¡×œš—ÈDÅèxb›“«oÅúI´XþÔ*› gì~Âf=:­²’ÃpprY=ØÙãÕú»*`" ÏØDrn¥k­¶åœnŸ[A?ïeÛ–›•göt¿óß¾êp¢‡ó`Ö'@Þâžðf¸…DÚ·5 ß>è¹Vã«Ý÷¼¢3UµOgýÔJ>=&qÎy”U?Êzg…‡w )'oÕ¤g8d›˜U˜fÆÔGXÙMb¡®¥"ë_¶ $ UáÇ*ãÎàÕÌãï{#ñÙo@£¬oCS,. #Z!ó „ó$̃AÎî÷˜uÚ×{8W¬êıe‰rUÚLT¹xØÝX(t¤ô8éå—Èâï>Òêh¿Œ«Ì˜U•³» DE¦¼­†uŒ\ŠÑñÂA%n¾´@•¼¨­ç—±iö¡*­Ì í¶šìˆ- VŽ–cœ_•jšÐÒy¬ E-2òDø¯ÊÃÒÑ‚ÀˆÇáš!™G2âð!Î÷¬Ý°@„Öô“H¨(‘ Õ=ð&é¨(mÛ±k ¯6ÓÔÈòçnañ{8{K*<¾x(t é!¡LU^G9…fUS1"Ž,¿f!m£òãc¬˜¤X×$ž«qÔoÑšçΠn[‹cÂ6¹´cÍC–ʬ8òl¼N{ËG¶‡˜'U 5”ØǤ/Ù–ÉËALxž0)Øg Ë%×Û`¤R.¿Ü޳ºÅU=Užj^HNOúlʵ˜9ø8Ñà *‡,p™ŠÈ‡¬±ì&Jó>PWUZÀeÙSú Ÿv‹‹¬€½Î•À¸‰"K¥/6èÙJb•ÅŠ ´Ö¿³LRÈÅ VÞñšyÙÔŠ°He2ç ¿Ì—‰£´MXá'¢àËe%(!`Ü›¶Ó8d𕆱VÒxqÃÔ|’˜½eGi@ÝùÈr›iýÐE’êàĉþ§n»a° ;VÜð°5Øqz‰¹”£Ú;Ž¿=Y|l&Öy”ŸóSÞOî‘>m‰=Æi3·e#¬^üjÀ´Òcÿ‹¢­Êö{ïMè>Ïg€ÈÇìó¡§è…‚Ž[ZÝ!* ½–&Ôy&ÐrøIJÚà]…x41W$•/rqù²Ýfön‹ÈšQ¡–Š/«¥¾øC JÖeþ Y+ `­¥= ð@âXyÓüõ¬I´©è,Si;ª„'¹—¡·ðÌÊ¥]W‡lÁõTèh ŠnyÐ÷ ”ƒÏÇ(›ÚòÌ #gTmMɘ"',“¤4pÅ‚@å³eoŸû–)ˆ˜¬¶Å630Ú—0úÀ9âÎú<[«ÀÔã:Ù…yÔjˆH‹†æp8ÊÖ¼¨Hòzg‡Þ°ÕR‡UAxR ôˆ?|ë3ìj7ZG%TàÀMö–9Sl!ù÷â°„OéÑÄë·ïŠè“Ã/1ó3ÏŒ îú["ÑW|’7Jå°Ô[²¯üü=¸wWþН¬~óâísüœ§ø{TçOæ? €ÿ#ñó“ýø_J9ü·þöÿ•(ÿb¤\Jæ¢dy ³aÓÓìÌ$f?ƆåQþêüúF\¸ðቊp 4Üe#tqT†zÃŒ ¡Â¼/ƒ\¼f¿¼Ë*ó:èbå‡<°ÎŒÙdÃni¬T–Ø)ð. ES™“\—½¤‘.ê‚uB1 ýgŠ = ¤œqqû™ pé!!KÞ4dŽ’(! )˜õ'›é ÷E2ΚZ+Ô2ƒø9} Ÿ!á†Æ¹ú}'£;òìǪ†ˆ–Ó³{…²³|Æb(“Sÿ©Ôf]DJºŠµ†A‹]­ƒSÚp&Mò, ›õÌð•{{ìýíIë¦ëRߺ»o9<½ˆ¿*õí¯/Y@o:€ãop³üó{tÝÍŽñŸ¯Ÿx¼$^¢û.#µBB3ëfô.ÒíêHmÌqÐêù’”Ï ›²º˜™£ðnuª3’…†d óPÚM:Dúc˜Ò™“Åñü·Ê:~4ðRe–)iÈ3\[åuNbù‰.*lßîŠ!ªË,aÔ•eˆ÷du§yêB˜¦sKUOúÎ6áQžez–2|²ŠÔlÆ]cIê)À{nà›©m ñ*&êX`uaKfªf´nÞub*™Ê#§ xªLlÜô2²4Dډ߲ûàê"Êí‘{^Ä›—·{DÙù®Yx3Eþ¹„Ñ ªŽdž“ç#ðŒ""ÿ÷ÿû?+®†ñ™{ÕRÒ£*/ìvÃËuÐÊH¼ª²yQ 7„;(›¼¹-ƒq ˜ÑŸ1ºZŒ ÑD(T3œ}dëÄ!â†Åíf… ü¢¾7‰¥-öÄø‡mš ±¥ë› ûx”Øwg}Æ:³£jzSÔ"î§p;£Sª`íx M£6SÕ§ÿ]Ùu¯é·PME¨mCù¼&KûW”ÿ¸Ðm33R£0¢‘ʘÔ•Ï;mD­`ÔrLÂÌ79oƒÏà¾D—MUžÿ3º«ÕHF€N府{—‰jÔ%ÕЛlM¤I\"ÿù¥?ÓM¯¨‡9ÃÁ,^ ã—ðp.ŸL²Â3œR¦ýÀýÛÓfqw¿«ŒŽ¶³÷w,,¸ý±QEÕ¤s€ÁsƃÒ8õúšu–m.ŠDýÐC¾Ú÷_.µºô¥Nô©aÄ/ÏSJ8â¶ï\lœ ‰ðæUï5ï0|v}© äO9€¯LÄ(Z;X‡/׆ö$CÒOw*Z^‰ÿn ý?àú¿!F¶(ø÷ø“ÏŽÛ¿ø½2ˆ³‡<Z¶J±dÙÝ£ä.êç]6êQ,³TUUŒ £b©Ñ£u°þ&ah7-R0‚t¢?q‡—ØÔÒ©;ª[]TjjXJäb´„œŸðÆ*bö¢°ÚÇÌ «jÀD`ö®ª†ˆÙö=@âJOÒ—`¹»:2-,®.Ú”Æè’™µ”ë¹þY@Ûp(’ÀsÌ6¨o¯Dwƒ2g‹C)óAuí8ªî^ð,õÆAñ…™=SV…/ÈõøO<ÿàÝè£HªsÏz «92h0Úž§4pÔðÑœGú¹W£’çYõÑ[b¼P;Ÿ•B!Ò™vϘž#®øeGËó­t\o’§³8®Às{•_eãýºx†ˆÈ£íùÕ¿†ûÿÞÚ~™mSüÐvñÙÛï©PÑ‘"¦9XU©T  „Eæü°xÈí³? Ö³ô•Æé·6À ižÀ³-V7#Åk8ƒtXLöDÞ'ØùëJ†Ã„²– U[BÄñG=DqlÎó„ŠP•ÛRkðmè®YøyFá¸Ýˆ}´£”*b”Ì“ʈ“î^Ä£œRRwî áµvnå*qh\¡3}1ÕZSj@"dýä½Ë–äH’dÉÄËþÿÏœÍÌºÓ L³à§@aî™YÕ3qªòDøÃLMˆ]BøƒØ¥“ü¬wN¨Šmÿ­:[¸ðÜ¡kl>ă8«ì¸-6ÍGÆjQ¯jhZÛb ‰Ï²ºþ@ƒÅ ˆ&ÂDèààD»ÌNV5JÉ3†ÂÈ.—¥X‹iŽóC_†óÁÈcÏÚ,LÚlN¤Z–cõ:”ùaiz6óÿ×¼~ 9Co†¿ßM\ÀI¦{ b›v­CUµ¤û¡ç÷ñ‰¨h†¢ çð4ÿjÚ4.ò{Ì"p[oÖr-Ðð?çÈH£u¯A_{ƱÂ'¡Û\9Yq>Öq0V簾|~©Öb{ðô,SuåŸ0—K»••1¡m±%רê”Æ-¦]0l kÃÒTxᎠ7º*(zdè‡ÚÇjàÓ÷B3Þˆ\uŠu34êeÖiŸ-åÒ®R”w¹5JW‡lŸIú(.€˜± ××z€~Ê©„‹ÕYî\ %¥Ú Õ{²Â¢X‹rê7jGÄ æGÕœgýpAĪI6àÞ›­Ô1‡KÛ«·{ǘvÇ0æäAu,¶¤wçëóBã~Xúy?Ò§™¦ñ=ÐM+–2ªÂ&9§V<Ç8 ë'û¢ïsýA2´Æz<²©Èßɧ6š³m‚9ÅÑF®ps¯-*(n”Â3Àµ^Rµ÷61Ñ• á6± îÃa ¨äE°½§É"¤Ê-¼žóC²ÏLžáÛ1‹®#9Åý‡bv©~›½Yð±ÔËtGÉtnÖQ&©‰A±Î*Ѝ?žb´Ws-bíÑvÏz èÒ®ˆO±Þ·,fÍXuÞºº‚)&Ü9Èû%S›ð…öÁ×õC‚—8õ„áðÏAREòjÿ¾ÕüÊ›O—‡¦ @^°ºíº,ó“ü6è56"›åó*O Üü5¾K§xkoýË2,ÏÊ?/^´‡ó‹Œ7‘&ôóã’`A=sñŸ] ÿ!ÿFõ¿×à‡šÜãã•¿'è×ć³ éNjÐsÊ£³tî1‹µ–ÝøÈÜÝ•ïY%¶:Z)­¨‘ u :˜õ„+M[ &h0òèÇsжË]®ÛâÈ%ÔTCÓEN“y4¡œÄÉÁù®¼É'Dz-Ž……õUùTi7D u’Hº¢†_Ž@†[¤ÆXÃðb±ï÷¦%ò§„šøžçrPXH·$¬ÆhÀåæ<x„vÔÌ·™Ûw¿ÿ³÷ÐÁëw£Ü8ð‹â~ ¦?û‡¦|»kÇUV‚1; Ìñ¢S÷²Úªöç²_ŒኂÂý)sש" œUl½ÁЦáË$à¨5ÂxáeWgº¡òŽû·Uþ2†7ûÉ\Âcß>¾ÆûzÆÚB‡éOðIùÕý}<€)Ÿ£widNHÝψ¼Î2ò›\Nä·Œ#™YKÿ#êFM‹àŸå¢Idƹ¯ò8yuçm[Pç« €æEè¢ À˜©zÙ½&sk}„#@0—à²s}6lÌ ÁôÎkª3æ3ðã-ì ëøY ¦RXäæÄhAÓ¥U¯ P(¼MT¡tHw¥PY‡4‚º–ÿºËϬžð4å{ ¹f;!"&»´ œÒ{âŒëó0àb6”LÚ Ö•0¹Îá,Õò¶:œ&ž†¸–hÑQáˆfówëN—##°]Zw½ÁÏtêÏ&¶2:-kmy˜AÌžýºñÎOŒAìOu)·ì Úˆ"Ëåk¯wÚëZ®Îìˆ[ͨØlovˆqãl:œ0‘án·Â@«‚ã­ Î{'  ÿ~ÈÈ&IìuT8ä–#%ž'x?Vk(K.¿ª† ‰”2<˜¶×—i‹âÃü–€R†°Åc_Ú³jh‹­IÈ6™×z_ý?yˆŸ´\GT¸ã€U¥ÙÉÿ=·ôܤ¾rêGŠê#Sî,/ÁI^#_*€Ûáçš#¡Ü‹%Dø“jîWÏÄÌ!f:`×(cd¾å17Û']bChcÁ°:­ÌÔqmššÏ(²n…ïs}~ÓǸ£Yà³)s¡œ&Lü$^ãW’öåø Óþäùª§ž¢ÔXÉõÓ‚?²‚ÿ"^ñV£ñëÄÄ¿ ;ÿífŸ—ÿމ†Oퟵϙџö›+ât9Ç pÅ@ ¢i uV%Ú­êy ÛºÒÂDx=œ+¹&²ŠÃȰÆÇ±Z‘ÆmÀ±¾žlßìÒ r#<4þc»Yb‰{ùꪤßWÌègá™ÎÞÑsà98µÂÚX2/¶dŒ02N R–ëgõ[—ÁÖ_¼çò,ðL~ïjÊ¿ Q~Py@*¹ã)TŸòÅ¥¹nXàsÊò¸g~…ì7Ü9’!÷»Â±z~Næ­Óè1ðÒ”ã«4ÿ®Lí CYí›ÞìÐÊóìÌ' !¦|âwf€€ã™¹©Œ?Éøc@_»íI°î£áórh‘Gs~Ÿwü|òøÖxÎzÂW•¡ã-:)@Çþ4À[ßÇb†4ž¿üó#&ñ@ù¶iÛÎ-qW榞R÷Ͷ«ú©U®¬ ß>?È‚ím‰kQƶ‘²V w¬2x{£4uó½· ¼€uLÊ÷˜ŸyZ:ƃüZuÀ¨Ú±¶TFË’Ÿ—døxBú96/ƒ®¨ÑtÜsBöw}[o½® ºÈý½}òÀEq¸LÔ?pÔÔåz:ºŒDÆGö*Ð%ÄêÃaTø¸BA‹tê¨I«&%+°zR9úNíûe`=—¯‚VMoV«a?ô²uóm ˜Ã+»JµƒõG¤+Ëý_Îg«> ßûÎbŠEü¯;\«Ô÷Mâ£z_Cáï­2_Iº6ƒoÁ½‹M=²n©NÅr—{ÔPƒÛ–²EŠƒ¯iîÇ1ŽœC¨æ¼g×rm³ÂÁÏ*s ý33ï:­·ì …þŸKA¿s1ñ”¢d¹±Wz« vqKD}7ûödŽYN6½#µ,Þ#!Y³Ájé.È,‹ìD 6aëÕÊCµÃ¸Nð¸¹)‚Š üúÈim<€ IDAT˜Ë‹oµ/G4 U10ê=Œœ¯g;Tªt¦s§ª;²ÉmM`uEšûé¼êÆÿðͨxÕZã¬áe6šs¿nÛ^‡<y‹´õ¨%“ŠÁ’*½Ñа›]RgßËh>O5ÎS,¹¢¥Â|÷á)t©håfÔשÑîëø .‘;‡…ÉÅÈPæSp­‹XŠè×Þ­9âÛDÅþ×Z—`KÖê@8òÎEq1ó¡‘2c,sN–|nÈxúy*W~ml[  ½7Œ¶Œñ~uK\Esù¦-êÝÖ©yªò>w—mI1n½R,]" ·cü†?ÃY\Iý"¢Ì‹RTÙÀÁ@EIZäökó Í]Gcü‘+ƒÛá(Qe›+Velô‰ér³Æ,¼ííe…%j±ÅÜ言êò´bÒ©~Õ‰ íÞ3êònð4çeMRår§µ+Oïî|ì:ò™âþÈåCsNß:ó ab*–ÙÒêE“Ú&ªÐ¥ö$¦ph:Å…£ĪQŽ+ð~Ä=Å"«P÷ÂÍâjö1”Vº£Äþ8Öü¸HþXK—»‰¢U:ŠŒoœxþ¨/÷t ¥ûÿàŒ| #pBYLÔõòëXkAê>|(°ª( Z|;°BJE¨fέËɸ‘…°U˜â*¼wÊ÷i—‡*½R¡Àï‘ÑŠ5ÞW|³nQî×ã?ÞR÷±Á˜óè qáIÇ„pN˜.䍯2È:‡_Vº!âp¬lµá”^úW´†Ç´ $ÍXüÄd©Í’ë$IÁsf#‚Iå!7”†þt/´±5épü¾ŸXÛÃÍ'mUÀ`÷eD¹ÖR½þqqóŽt>/Q)çªB,©¤+ö¸[˜7ì³ÕÒ¦Q?(UŸ…tííH*äNÐI´>ª m âÖ pšƒ°šÃg˜Ð¥1ÓPÇ%pá~ºñ†áòòDÑ{aʵ“( æDŠTm˜QCP¡K¥ËöFò¨”H Ž7o¤áªùG³0OhÛL£ÿæèç(Þ}’T‚÷£*{‡]#Òæ˜§Ë‹Ð%‰òǘ¾t÷´KR‚âN§¶ ƒ²s½½DE·&SÚ£.!¡³©­;j¾9ˆÕÚýLq¿ç`¿‚ÔÝŠòàr5TrÚ%Å8ÊǘÕäÐ|oûùÝw{{žˆ‘ò[ ùMY¹Eõ§IYÛQÙä õvÀ­ì#“Ò7¤jpk“%Úå~QéT2Óõ—¿o½É®-ã—ÀG ²rÝB~öB*J†lÒeª-“lšÖXË›*vçg­]¨Î|õNöµ€½x• »&YÖ§âUh, Ú¢ÞŽÜVVÙÇ‘ßsg™ìµøpF2>Ú]õnU¦ðEÙÞø¥‡‹³ëƒÊsú´¼@hZˆÉ…[pùë^VE÷–ïm*ÐŒîÇß9iÜß&_ñÕïI3&™9(„b¥ç—[¨tà ÷Þ"—ˆau´Iä~%“=œ ;ÛêöÿP–é(ˆM’à»oJ÷ñ«Ï„&Œ´9ÿs!ÆË$f*«9à ?ßœX4\Ð"ê|dßô8 ˜•ÖnWaÞªÊ>grˆ ̷ÑAaÜQ°!M.à<Ùª®åïgFßâØ. Sro³ÍµÐÓ¢:røAà p"gA.uJ ÂcNfW|ܵ«ŠŸ+"eÎÈöÆ$¯‡‡¬g;~ȯ§]ëÕX)ÊßÄ„¦=Àös\|oÅ6±b‹'ÊÚç2˜&è”hf±Vù<4SDÅÞ$24|Y_¡ïèŸ/<Ž þñÈQó&ÑÊ@ ‹î5f®K·Æô;îKÈ¥;QŽù\ä£ þãsÈ7ï2‰AS ‹€? µ·%._ã^¨qÛ¢~Pó‘@0\B‹í€q 2†çô\õ&!ˆˆ,sç<‚¶Z6ÖáõsÚd6˜‚on&¸#B— ‡a4Cæâ?J*bÊê&“œOÓDZ<MQÕjiy\‡5'óä¹·–Tä¨`,ý ·ƒ!¢ÔÚ<üqZNÐÇ\>ÕÑÿPïÀÞã}˜¢¶Ÿ]M*ô0Æ“þ4DŸ òì=ý…“éyÁóuÙ>Æc­ÄóÑR{|…³*@G¡ññâÙÏÃÓ0…ïs\öy.cÅ;€Õ‰Å©|{P|ö07éss|ñ?pÿñ«˜Ø¬vÀã­øõäõwÊ~N\Rü~ðmÀùñC|ì®ëº˜ãÅÌw E[æíáVÎЩ</ÇlG£`J?ŸV?pº±ÖRU‘!”í¿â¿åÊxèÁ4ä.]ÛökÃçÈ&ië5øqú¿:L#Á­±ön±i›Hsþê§n8 !f†sÚd#ßçg–2¦±*êþÌB# ­åó!d’ÜÖŒOãdù­Å­V.ÿc´þ'…Fý˜eÜR˜'“–YF¸y\šâÕsÊšTLW¸WÓ†«²pÞlŸ¬iQ3\.H°qÕ$<—ÿeƒi#çk=Pˆ¨Fü7m\*ýD9ž¡{óú‡<å=~¯k)îB¬˜?Y,ì4Z\a!ͶC=¼oqUÑœ<¡ N^”¸\“GDKÃòió ÷°¯1¢¡ºrKZü½ºåc:qdJÎ[M…[È£mCœêª´^ÃÉëX (ÕjT›ðäêe_Q¦j ê >”¸ŸGó8Â6|í 'ͳØ(º2€!‘' È£×¢O)B´å¥xÎR7Þ&— ˜ú Sjr_u2³Eä†]r@'+ÅǽJŒŠ8ßHrû³8Ômíf×—ç}nÁ&NoTµ×ØSV¬9Ý.VT/ÒÒ5"Éôqçdb¸)³Ô%f!(ô"n3_ïÔà·>àvWI\ž¢ AeøTRD«òÍ$Tºœ"ôd©Æ÷Áæ5ÖboЛŒ†ZL’Í´À×{-ެ*nÑšBÁm ”dŽÈSÄ%G`Ñ«IÊ‹››Fý©‡*è&·a•Ð Fš3ÿÐÐ?ÛeŽÚe6€<¶¤û(p2Þ'Fº£”«z,[6!³ÓUHþÈ<–e¸Ô"nÇÊÁéÛ3Žú)€Dl¨@Œo–ó@-ñ®1/U…JdŠÍï"Ù¶®e?@¥_Ü|æ·q«ÅL6'ëòqRŒ%-µ^NLÄ9køRu‡„ÿòm{A7p¡”@Vã»øA¶Ñ1= ¥«WŸV’ÙwµŽ)sÇpŠFmIü¾OÕ|œQ&.‘Û7|Ï€s(Œ¬n(Ÿñ›ÁaM&NýºÜG`aê'äò,Ngó,õ„÷¿¶ÂKð æØ {þÐPGÆî¦‹{d· âÓ࿵»w|Òá¯ö#¡A †[L(ûat|ì8¤iL¿åù.¯GZ¥`Èäô¸rb¿·yFÌëQuäæLH¾äcšRSÔê.Ä<êQ©Æ6A…õpf,%‘Sg²tŽ_ ·YÖGL¶k“áþ}ÍGæ n³HEV-Ã?çÏUÅÒH?©fÍ·šÛ—éˆBnr éËTáÿ=F’ΛÓïà/öV‹1AM#Ó\‡[Ÿ"lrlæKq^,šáé ]ŒÝÐ…üLTÅ}mÙŠ Gæ~­è]Šåcÿ5“ŽÛyT«9&Y›íF¡šm]ÓyÕ¦#à™^6 ½Ì¦>4Èí®-¶ÞXÑÏ­‚Lj¾=³Q ÞβÉM.ËÖhàÔÎêñ÷G|¬Q1Êê‹AíL‹‚ÙåÛ1dØ»!Våè't=ÇšñÛ´¾Á2«¶‰©üW6Ï>î„Òåôß=<ñ87WLƦ§dР߇YŠ"+–,ÁK}Ù9å"ƒAˆ‰*òw“ÚÉÕA ãAèð}hwBŠ˜`‰Ý¹Ã›OD+OëÐGkjú8FÏ»ÕVpÔ…N¡Öª¬2ÎLÎÕÁ‰Þä|V ë}xþùótã³RŸ¦ÐÛÌ—|»õ~”û‹?jÎÓ`ŽY/‘BŒðÞ¬Æåtú[£Ò;é‡Ä9P&½•cû3ò»½7:ï¦úºeBÃy› ÃÀ‹1¿Ï’”¤(/“ü¢û÷‡ÐãC<‡-QÄýSJ€ü¡1øxV¿u.¼.­?]óÜ”ÇÕm¡ªŠR:Ú‹/2Éú#ûHá6Û¶·Q¶Ý÷¾¿ï½÷Þç™Ôäü½Xº–F^m£ÃV( fF.hähÙôÏp^‘^S¥ªK²®ª"nC(FØvyÁ€ $~Þ0ÌC®¦#}ØíÏÓ€ãÿá†á ³Ö½Þ`tu E˜‹Ó‰#$eïŠèD•LE\—.©ãÚlK¹Çk(Ã\K¿®å§œ²dêxEµ ùqB‰¢ôJƒaQ4Ã6Z…ÐL+°4ݵóU­ s,ùîïz’+çÛŒ1Žàà•ÌàØqÆåÑ [½B¿Ѝ§+‹ß8!G 2Ç„L;t¹ì= ‡d5­íцCˆ‰ Ë6½ž`±­ò¨©UæDÕåÔó½ÁŠ¡–*Þ ±Ã eÓ*®ãŠòè•Þ¨S[øÖô†ÃA`fÏ¥ '1æÊÓU~D–•)ÙK´ç40Ä[êbÛ€Ó'Ö™*Ç!3ï|?5KeAÑ1 ó–rQx@ò•Eç¹ü ±â ”èq(‡f~¡Ã2ÒÇfà67pú~‡YÞAÖö‹÷.•ؘVÛ¸x5+0×WxbÿóÇó9àk›B¾T¿´Z_ XFÙ•`ÒˆìKÊóPl‹‘·YìIh±õ¸é4K3?¹RÏ4KÁ à踹vưô:&üÑ·‘»Êbëì~•áLY-ÆEYÌ!5¹ ñ›™r•6¡ÄŠ|ÒVäßò¶¢ÑXA°j1ÒÚüA+ë`ðLd‹™”E½ÛžùòÝmØ] fÀh¾ˆî ßMÆžðÿ·É§H­Ñg_³¼Lm•% ÙG ®™>ucÚ„bŸ›KfZn¶§Ø%ŠŒ»àD›¸=ÉÌèž›}Kk¶Ð_ººÝý«ÐÐ5‹h¡B-|ø”z›ÿúvÉ’;–q¾Þbo§HuÚ*‡8eeÎ)ƒGß¾Š]u;C ùª¬Ùèç šÙ}~=®×UθÒp¼¢><Õ1@CÔÔÇz“{s߯Ýë5:>yJ¾wº¡áìNôÈÇ×y}¤.„”ÛÇ~&f4ò®YÚ hÌ=á S:(FÛ´}ïûÞ/6Syµí5ßšG¿te2bp~›WÁìÒË`)–bE*Ò¶ï­ŸZá‰-½~Xtj^×Q¿({ˆOþœÓ‚c,(¾©È΃|Ի߯Ë輂'.fWóg”˜2Þßï*Ç®<7YŒÃæûrñLÒœÞ(0ºà-¹9ô笃¡½ªÆ'Ã&ü.2;ÈI/ta­¥H’¡U£’oŽ–jl>”=fô‡*-ÆQiùɇŠ?“5ç •s &S>drÏj ³¬¿o$¦àßI2Îì²{ÉÏ%N~Æù9ä±²ýQCN»ªIê×ûÇwbK…ÿ̸÷D}B£`8ñÓ½5ekò¥Kåx%ã+šâ³'•A÷8† 6umÊxÖ7þ¨ ö…[ï†ß­ã1çç¿[ Ÿø˜ðY¥–·ŒÙÛØwÞ·õVË8w¿:ÁðŒïÔ¬ o1ø3s'óžø`%U¯ÆïÖL´€|ÖNÿ+6¡\i Õ43BKvè-¯ƒs éS.mWÁÂÓ¿®å@¡bþè¿=Lx~]tâ_ª…,@:iúµ¢I9¶XÛ‚ï_R50ûD5$³qØ6Ëh8Ù™p)2I&gþ2<]Ò¶Çú|¶î™î8ÛYö3æÿ§ñ¹T‰02š†%ŒQÙóŲŜÔÌ,†D¾'ZxrŽ„S»ÿ¡mõíÄ "CÁåà]êZ{›Ÿ jy´)hÏqÑD8iXQç’Žl¦F“®Yeë4!%G|ð¾£{^ó„ÞGüAù7‰öRƒðl5­šTM¶0Ȱ@)ˆ€^—Év½`ÍDz¿Zo=Ôi0ÄÙ¾5á·Ýq ¯¬åšz6ûÓ'ÇGk™àé²i±æêV¸WÎ?¿—:SßO04ó™Ïõ5Ï6ü4æø¾`!kfíØµ3TF÷¨'¯ñ=Ñ7ÙÄI7µ8ª,`q®¼C–8a <2ØÙ¾˜K&˜u)0“ìœ,¬+]¾Ð¢ÿè¨0‰a…_ìuÐg*lš·Iüá‡ÁÔà%†Kt­®Â³PœMÎÔ̳eÝ+#h¢_áV›&ËzÀ‚X[MEv±pU*Û‚ÙP%ìÇы傓O"…0iùX)smÔÿÉú˜{k©À®×zä%½–ØÇ´åû¢ã%TþãÓmïh„ª,§è¸üäH&äFàuÚâ(EÉÅšžØc¹—Ÿa¨èNÛã²i²%¦w þxýuVUpæs’9îeâ+ÿ s¦÷æø†5³ªá‹Éî“D"ööˇCO˜|Ì åŠ)êºâ"hl6P¢æˆFš }ìé¢ý‘ñ.ÅÙ¥iÜÏ /(.ß. mG©@éÞ`o kEÏsM-Õñ ‡³%Khüç4špYªVäíøNF?1-—\±å+Iõddaýã*Þ×34óViÙç6óâðÿ¥î*½Imš_ Ñe™XØØÈ×q/Ý´k\I#·oòû¾/…¬ÕQŒÜíÔ¿L¶˜¬­‡Ï·ûäé/4˜öu.º£†—¾cÌu²~E*åÝљݹM.Ù²°ªþÆï ÆÌHÄ„ÿ4û6M>!Þx.忏ÞÉ-›ÄÖŠ²€QA Zäÿr`yibt,Öfº#glwF\ ·éÞa×¶Mb#v0è–_.ö˜ÿ¶H0G¡Ô`ƒh®ºE˜U/’öCp„Ñg K*t¼OKÕöÊ7÷2E¾õ*0Q£å¶Ò<Äåö{‹ä)wqQî\äFD]å3ñŠî`¸¹j<84Û\~aÙ÷®Z]C‚xÛ”— eíÇMP{K¯)”àä9¸fè'¿·tyß’D‹4=CŒ¨¨&€§è7ie ²µ]T#ðIcõ3r›OTÀ+QLÌ_xA²×ÁYÕ…V!ùä©â4w=¡¥¢C‚ "σ6¼'áÇr c²·[ÅØùŸ±¸õra/ÉAfkƪU’XæãÌ/¨ªËˆqê´*⼡Apž¼ðÑJ%‡­'ätT¦ü}`}Œ”ð¼èxfsa1g`ßnÚy¸à‹¢È̠׸Ïð“kŸºÿɤ;äÏÃòÔðs%ÎZÃÕ€0Ê(Å~VnÿµØC-rx…ëÿ«}ül'ÿ½Íü? úC£ûß–ÓjùÙnŒ_öÿGFÞ•°·J~ÜÉ’(ïÿG6"ŸšŒ,#&TË'„o~£%“ô“£’ºÀÏwÌÞ`«÷6±‘¡ØŽÆ4äÖÏ1Ž‹ ác»ÇTÌO$°½±ª ™’iއz%3¸5Åà E&¼Õ[Ÿ›JPºò7*—,(㵌G¥T"Uª*£Ú•1tL©õÀï ÿ»ÿ†ýÕK6 Êì$|hÍÅù{Ðwý¨ðàŒ"üð ë›Å†Ë ¿)~œ¯\]]Ø9Á3øÌiýÁâ7–ó+>­l §«£‡|Ùþ8”¦T¸ÁR•²Öõü£\u-±$™»äTü6˧Šb¥8ØÞ¥xÍÙÑ€}r¸»G”PUÇðÐ+m†@ É”BÉ.=3¯Ë3Ûy 3´[Þ¥‡ªDä&üügý§Ê5Ï&R‹t‘ÄŒÜáö¼€b%û@7ð/2%—B·Uª`¦ã&@%Ÿü.ÕÛ ÎëuIDÕ½>]!ÎŽ8éV`ÙÃ;`C1!o‚ ¶•RkQöÊ쀕âOÄÖÜ›Ù?L¶Å6>òœ¬—ºÒ6Ÿ%—M^ìk˜k©ßr¾bÞ·aaéå Ö&—™ÿERnqˆ˜l÷wo„sçnQš¡R:¹ ,®ÇíBí0¢ÖBí‹øR753kˆ¡½ŽpÐ~a¯bœq‹¥›÷&ÔúÓyÙÿ¹ÝVe¤˜ŠRÅL¸_ê(A§€^à?ÓÒ±+ È·ím²ÍÄìÞv-UU¹ Q•ÎSd¥ —ª.€*{ï[xù•hT…,ê†ådÔWP[ÀÎ-ÐòyQaQ»•¨-WþÛfÝ…åi/J_/%#—`­uy9Åwl¹3Á2&7äkRfTcÿRÄ.ÀCU å‚ó¸ç+gJÙ®,š…y¢”¡à®`£zÛ[½­"‘U7fídˆM³CCÑÀ¢8‘ÇÞ Bãm[—ºÙas‡—Æ[µ,bºªÈ$§Úáøèæz¯vŠè^“FïÅ0eä¢rœYgßn,Ó8sÚb £ÌÂ-ù8u‡e”ÙuM IDATANŸÃ#Hý‰öŸírJí|xqh4Šéãù.}è›ú@'?m­%¹²FÑdKoúa‡Ç©)0!z"ï=À8çé“6&Šù™ä¡õµ /ËÒ[Ûü©sLÜäéô}3Ûý‚<Çg]OøóaÏgã­¦ÿ†[ü7›Î… ôŽ{þÝ Ä_ùޝñߥ$þóó¿Û €ü…ýÛ‡¿üèññóÅ®½)nâc…?2ØrŽáj,}F[hLˆOÕ—mºNű%JšsuŒ…xDÖóŽx«EFôõ1.íñžõæ'.³‚ö ážÝ™y 6G¥äQÕ0^\o˜0ÎÙÚÙÍ0ç"Ã86ѱ­D[,cN`Ù×µÖµÌÌö.·]ž‘'/ºó½t{ŒçréûÇ)~ „?ÖZŒóbý™PZy7M¢pe”—–”’Z3|Á!õ†•É)(f\õŠ¿éliEÊY¥‚lŬfÀÌĻіùBÐkš‰xòÙ2"„q0`'o²:UÓˆÜyÑ/ÇÓ¨ÒlG»¦{ÊÆ•/rÓ@\ŠÁ‘÷¿10ˤzÒ©V4vš<Éq5ѳ£ñ¹ªÉ&al(*‡ÃÅ# ,Úº0Œ«9qHš‡ŠØŠU/Ñ yü2 £‘Æ(#¤#„Û§/™§ÕÝ÷4FEŸª~]‘½ãxæ³ö²î×Ï‹ ßù³Ô>På ^,ˆK;Ed‡-=Ô/Võ§jú¾]àQ‡'dõ{T`ŽÈ‘ÆéŽßO?zš¥Ç#ås‹sÎCëL”¢ÑXê xÀX°ë2k`ŽjÍw—Âá×…ˆf,D¸®èÏÙ&;K#§ÿx WÖ“z¸œ<‘³CAêt‰^ýªN¯Ž •Œ I.Ä4ËeuL`€í&Alš˜,HºÒƒ³Í°4Çþ¹Û½·˜mY¸V±Ð¶E”a;(Ì[ÁÛœ( ©‰—Oæt)°A/›n’ÔÛ¸¤K=WÞò·ôúåoµÒýõÜ{¯è;¨:ÁÔRl¸àZyâfµÊ ’S³Ä ÷*àJ±ÒŠíÔœeÃ%¯›L«j–Q —|MœÛnPëy.Ãy‰è ÍÒ`›ÕaYÏAt‡wÍÂÓÛ$h ‹Š˜6…2m)îeo°Š vºG¢Wø¢göé„ÖqPác»–Æsé"o?ŒÌ~`Zo¢zc“28Õ+C– ‘4­G¨Æ33š[¬c³‡3uÚv‘*ö÷Û²=’+E®Úšå3b Ô5ô7#"§U'¿írÌÚ—ÒðýÏS;–ɽö$&rå›5—Ãbñ•Ư{óºâS@¾–&{ÜîM»7¿âOßâÎM„ÎþºÏVÍ0+Ì@ë‹ñÛäKÇɇ)Bs×$Dr3:¹Ï%,·4JB°–Ü&KãP¸É+tÖÞ uyƒ‹Ù—@mÙ3MCáhÈ|gÖe!5l}ð©Ñ7®ÑìÞ÷Þ>³õ=œ#ir{J`g·ò¥$±öî0ã¹ÝpÝø’õ}eèP1U|ŽBæYe­wY‚ õˆÅÁ«äã¤;ó^e¹Éýª¸ÉЋ÷h§•Ý=çÌ`÷ÎäZ]¢j·¶wÓwìÖíÈ™˜·W\óñs®*Ð °û˜®¦€,Õö¼ _‚#ÂJ3Ò÷D1ZRQûô\µÏP…»†ê$z¹bÃĨ [WÑÁûaÖ3™Þáûv×Ôä,ÏUKÛ_·»SÄz‹Bûy\){Lwi´õâÃS¤Ê×°b¡ Ì=Ò‡àûþt§‡Q¢×Ö³ÍOL{n¡æ3~oü•í5äIz9<ù%ù;aÉ1®zÁ€/ÞqÎ~rÆÃY÷=AÁ?ZÕ=$­cÕ­aW0ÐAAW§zr÷¨ ×8«·ñ`—Ô†¢²†¼çŽnuâEþHHàuàò©Kþ%Dû‡Ã?<ÿú àß—Ø'À«ãxðOB‹¼Uþ‚6ýÑð÷òÿ]Ö?;L?ñQ€?üÐÿç¼Sè5ýÝ{l0?,.IþÏ£"„Ü =¶Ê¸Ç?A5Q¾; ‹4¾“H…‹ßá Ê‚÷ \Z)¿^Ÿã—ìøuc‘:¨Á /1-€º/.ó¢¤#ÙF~ÄQU•k"ˆç@‚„w@fÍŠ_mÃæ¶À¤„Ërc};j7V輸!Õ}úêi– [(³ ¶¹ä ©²7 DoËÕ¶sÛͪüê§ y(érö²¦I kϧœrȺ<†x±ó·”ÇR>žÔV'k (3.N‘3`wØÌ›`s4ðôjhß´œ^˜2§!·¸kNêØ‰{˯ǃ²v2b}ðÓ$©ñ1{ FÕÌ­QGxÎ.жˆñ ÉÞ7Oô—®; GÛÿí¢TùœP¥ÈJð˜ú*ÕÓ6T/`#zY öylN|,iþqšÙ"nÎÿ*e )²Ò•Voó6ƒàKÔÜÊA¹ ;HU\ųŽÜc\tÌçœ7tÖ±á¤éÙk÷|êE.BåR˪³Êj*é&aÅè½…KÂ’I„*E·:/ÜW+ËÉÛ5®šk©1&@”Ô§ÕÕ¹Òš! P «®K±ÂA1ì {âÃMÓÞ§^f¢Ë»}½½€ ’k®Q9ÖKvx­ïCœF@L– pö΄ø% „SQp3÷b† bI(cˆ~ÌBI?0*‰4îß³Çÿæö(õùöÇ!Å:½[[°Áâh0›?b§»¦a»§Ç¬Cjõù=]êu*r¡%ß1UÄvÐT£Ùã|+ek«Wú+³È6ÇnNf9&–,¨,áõNZtkm1|åÉr2EÚ”å,Núž‹€_kÝy6`¶p¶¤å x[ÌÚ#B=B´sIãH2ÏíBŽ©²Žü“Γ»?bu­µèyF_[þ`ž¥™b´•G Þ›—È6YŸñU En¯Q8îóEiNê=t…h®’X3»·§èµ¼å=› ’Êäö@UW¿?UÀÉOèr²MœÅôÌ7¾ÙNP\¢"òOnŽyS„;!úX´ßU.]#L j1÷û“È“Ÿi}²˜39©¬aÙ–À"šÇ.u8&¬rZæ¤Ó Ë›¸âq^`ïÛí›ËY»Ö›D‡E^ÐEæîÀåóØ“ÿ®nôñÙ–É‹aWJ¹0’VÍ aÿÓyyÜã-É‚mé–)Ëõ+s,oÇÅ(ŸåˆB‚a'Ï‘sfЇ06ñ°[àTíq÷óÙ »#ÔéA¢"³y7êºsûwÛOª%gn`Æk+I´óÙ1óº0™íïÁ§Î3Ê'ƒÛ=†ÏÀûÙsN ú †²a ïE*8ršU Â5Çvå"‡Óœ8q4#ªQʼnðyÐ_UFIÇ$´öè>¼¾.NfŠ7¡†Õ8{¿*ÔÿHØ+ƒ"¾0%Ì%ïk•Î4nB‰ATÁš=µ\ª¸ï›Õ9’ƒÖù­kÊÝÄуWª¿I¯mQ`—µ_­ãY²¿n~]GÁw×û5)?~â“¢©¦â~Lh÷¦ŸZQS=: ØNƒo)r€eRqmܯ¥š’f*յ侥'_ÉBÑ^!¾´Õ¢VÌŽ*րܶ¹ÖÂp)öFß¶?ÙÔÃ×Õ ¬]oH¯"„ƒÓ¼àZÝ~½Ëw ®â¨ÌÊéµ²ÎbêáDK×+ØÃ¸ÔΔ̑\.?þY|ã:>žážñµõÜ?=¿Asúâ½¥ÈQ%nR$J–Ywá VéYTQÄ"i@š.‘­»¨zœ”ŸTs1½«Üýœ/–_‘–]â F/.ä rMß/Îí t<¶±2þs§å¼†_&ÙGb-ŸÅt‹\Ùa· GìWo%wKUÓŽjV¿kžô¬ãþ)/RøRõ iﻫ\X× j†( ¸ä Y0Y«^àyQÀñËüÞf†©…j¹]ÏSçäl­êë”—q¥»šÓ 4ǶLDDCÍéˆ[æÓ‡ŠAºq#=‹qnÎÉÌ~å:-gc5àôüT´”-åÉ]0÷™ƒ=øÌ&Ñ\t.}Cs¼í‚ziÈGÝËPškø†m“ â€$Wçü%µQ!BBaÄ…&¨=þ¡ñµ—e´ ¾‘°›sBš2Àá¤ÚQ†73FxáF‚®²$¢®¢"ÉÙÓî(!áœÓq¾€›*KdÊÆIÞû'¹&Íøe/ËBgb™ý/‚ÞB^/*¸â®˜¦‚]›iÿ”%•°ižø°²º¼ï’fzöÄÀJÅk¬¥c;ŠT½©êU´±z¼úq.ÄÚ¥ðyÏd¿M54·ñ \¾[¾_TSÄ×Â7Õé¨ YkÝ÷¶cÿÉ{S€b÷Ôž**Ÿ2ªÎA€GDĦÜF1óÁ¼Ù·™m’¼Fñ”Èf7&ÔÆŸof$v”81É–<¨”=ËîŠEˆ²©ˆhP¹ú¦vŸcIìs€¼åÈgÊ®vOîÉÈ|žjGvõGËß󅆋qõzÚ@—eD¨Þàãñlo–óœ‘)ó>ä$éÇ2ë—åZšèõ¼ŒÙòCˆ` -èùÖñ[—šù<—oÉ=@©+þô¬©tLÐÓ/ê[T!ºTÚà߆=m`ZßDlïsWš/Ì `̇å¯Â~¶¦?¿n‘¯®ÏE={æ§­ù|ò\m\,ûuìÈÌË(ÃöÖ§|†è!Ép‚œSÎʪ.ûÏ>Så³$ñ!$ªÖ…4SïF±ÕüÕ¡håa²Ý9ÙÂ…%àÿVÝfÊåµá̬»Q¶mw…¯µX"«8Š‘#烊‰¥?¬NÀ]6Kk“ÿ]îäQ]Ô,ÆI!ÏâtEuf…¹5}Šíc¥3T<#h³ÈÝ„«ïOP:ቻ*NDYÔ ®Úioù’*¦Íl¸üóZÓJ…ÁiÛ×þíÔmµŠ½Ÿ†Ь ˜k ¾¸b«´”Àr ‡ÛªòD*ŠÝ“U&0'(K‰©Ž?„¦É]ˆ£ Æ †ó‚ž\¤žÓù°, +؃Ò(ò…å[ßaª£b½kå(³-*n§¶HÔÑ»XCý•Æ¿…·»–_°„^9$žQ1úDFBvòádZ »Sº<ɼˆbÜÆËÍ¢—Û|iÞ¶²vrù¨Ðøm÷¦,Tðd ØXõÌ%}óö)ɂږkù{«¬¿íÝX¬Z8º€Ù·`9knUC^Â]½Óéi >Òá8/î /|Ô^Õ¿_íŽ&]o™ýwZCòD–ÝÛ¼«Ñºç;6„\¸)WØLˆ ÷ INZ–Õ¨“MÇ%|Ò4ÿ±–ÅÏ¤Ìø‘Õ.û`¬FÕ£D[«¡dk€³•*0¨[¶ëZ6‹ûò ¨ùÔÚùbVÔzÐ,6º朊SjÌ\SU.þÄ6"¨œ!ùFÚ©ÇX‡Ò„î¸IËö;Ç´ÞÖü4ÓÅÃЄт:ªEÌ$žý10'ÍÓ峬'öåG€(H„ªãi-ÕhÞÆ¶('õog›rÆz+&P¥”ä6ó’ïJѹÝj ÕçÓàÍ^lP.J_]P íð ÅO Ê÷`,H]E¶°ãb~ûg °{òŒ]fã-D×ZÑ´ /r.iÞLt¥BLÜ-áÉδS©¹ŒöE“oÛˆ.ý¬Òâ8/8‹¢ºt ¿÷Ø1>ðt¢69KP>_ý"pÈoòËÄLö>:Š4vûTæ–mfÛrrÜ'òZt']l˜¨z©.ÀàÏ«À§™Îy„¤¯æ'?PÉS;â ØOÃÉdBÜTæÆà0žæ4ëÛ“3‰MØ)H²}x,Ã.ÈÛ†4x-¹—8dËQ¸8¼ÇÇÃö°q"•1<`þ£M<Ò»ŒÜUÄð›.]È.Ã( òFÔHTÖ»v¹å1–;'™q 'ÏÕÚŸD~®œˆ±ˆfç²Ò†)²Œ²@Ùƒ1“®¼Þæ¨.x×p³à3CU¹%.s -øYì$õfxr³.÷§l ýÕ3}ÍkŠÅ¹×=­L9> «º^Êr™ $ðó.—Ñç/Òã xŒ:Ó4 šµ<¿¨½tobÒ ç“;#Ã!˜÷ÁPøKÈ?¦©€0Ì»šÌ±Ú 7g¾ŸãÕH•;s$‹šª„OŒ?~påãM£¥îÝ‹þ¤ó÷úöË'Š ’ñÑ4øƒŠð¯‰Ý®ó €}~_¼¾&=F%øT\øAúåùûwòÿ›ÿð1Cyœ„¿ÄLñoøŽñÝHË“Nþ Iz½|8„×° ¹šï·X ×Hë}kzœ™"x‰Â%…ÓJ±,YQ!\LÙ%Th d¥î2 í°CÛñ¨*øÒ_/–ûMËŽ/x[E™!ú8ЛwÄ5ï"œ£ÞVØÞª*vc­€ Reg/ÂÎX•§N …ÊÞÙb$bÆG3×Þ¢ŸÝ²CM‰óÎW®‘Ø'[;RÈÎ’°"uÐvh˜YzK)œX<9‘Ý*_s„áP¹Œ7goc°~9cühßmëgü;\:GðC‰|ò‚†ÉýœawŸ¨>OÎÕÄÃÿ#Lpþ|ÓóÎ2pN÷½¥»˜ã;¾ù¸ü¢%fŽõ Æ™R{ð4é¿/HA¿Ž£SG^¾þÁûŸ9€®Àçþᱎá3€KèÞTõC¹ksÀCsXÆ::v‹(3[ÑKü=Ê9³±ïr›Ü{À¢u#»Û¬f6/¦#[rc½fmŠj ™a\̪ª¢Fsò¬ ç^Ήóf´]# ÎÁ ¼É‹®I· ÙŠr¼ jV¥’½®µƒ"Ÿ“% ¦{ovëwyïÐb-š_¥U3êA…ë —›nœó Ö:Û›^X/f>ÒKsÆ_5²9Âõ¥>ãAÑ€"ˆÏ ,¬fl–ÝSï|8"£y=zþ›i,­Yùåj\@Ï¥ç1|îÜ'°†©Ö‡ø4žVôòð€‹’XÀ‹Oò¸?…¥ R\fÆ,¨²òýßÿÏõõEÛŲHOh¼›©†¹Õ‹›>Ÿi;ö˜Tæ¦iYB@%…)2|ÃæRŒn/š¨‹n*¾ÓH×]ì(hƒšÀÉz€Ö¼bn’s۟݉æB‡âPéÙ{“¥QD£¶mR38'¿ælµ.ÀöE{°‘ VÎa¨{GÌ‹Ù1㥸CÙˆz î8ØÿÓ"Ø6,P¸iÞµlÊåv Eô…Ú^q¦f:>;7ª QUÕ%€ŠÝ¶i›²¸QSEÈRQ·y:aq)¸åTwf(v`£ÌÕÄŒ¦b÷6Ù…}ËX=›¢>ÁâÑ¢ô™ÞõMã~;§S,'ùlK7øã±ŸèbØtMõÖ¨xˆŒ«ÿæAܹ9¾D/8:&’…À ãVÌZeÙݤ:LíÑÞœÇQ˜c–/2\A–ôÿ¦I¦‰)Õ· ²ï]x¬¶e$Äü0èz¾)øé9oF=DétÁAq‡ˆCuªi¢Âó’Ê ë Ûµ¢KÌG ŠõÆ(%Î÷ßÊIs³>&ŸòèÓYÿRÿå¾äSqá[M0IÂ"þê}qâþÿ"0Ǭ½ýaÀÀ|Lë1ȼ)ñ›iØË  4avçVúß=´ ›1ãg”€üøÓ0· €-áë I´â¹^Ä>‡º¦òTm§ö©ó ÜfˆjùO]ÉŠC·Q–’˜íû1nQE¨J~F³Ø ‚LFœ-š‹å6U?ˆxwÞ†qwáÅ𜎃6ƒfÆÛŸávÀå\F´5>°ólc!߇àž"Aæ 3Ëöäš@‘wš!ü þÛµÃðD÷‹á IDATHù¹Ž)š÷6—ŠôÔ÷šü€ºÔÿêªÿ¤Â‹ü0!€ìç³²*G,‡wæáë›òaf™cöÙÐ >yjî‡[q!ê Lªþ1™Á¼*6 G°`úAx$¬çz6¿7QÛÿqpæÃøÀu'ðˆëÿßFîð¹·:£3Éôñ÷Æ/_¬¼whL‘r†IÅùÅÔø2äž;äJw†‹Yæ‡_˜öÇýåxÅ©p"òÉ—g¡/Ì ÆdÔ×qn|îî·øýOù¾ÿùÏï/UíƒØX#˜|…»{Õ™çYûž; a‚‹¶ßŽLU¡ŸõÍÌImk—*©ení¿–.î4¤+&…±,Rf[‹6²² Íß)B‘Xmàë®;B¼óO‚áÓò‘Ë.“¹.+dHîÝËìêÐW …c,T>éf³˜E¬Eyý ì –ÏüÈjÙà÷Ó½;rñ¸þ)G§õ‘XŒÇ,znDe·õ0<á îbÅZÿðÊfó<ž ÂOê—´mÜ{ctÅéX6h1fôdŒùºÖž1ONß¡JÇøý8Á¢¤ÓGä1‹/® #pãj²—¬¢<®XõÚyÌÑ# æNAíC¢I•mv|HÄä;3¹B-ÎêÕ²ªo1$…Ï×}gîc²)üª(R³U ŠL,P de¸4%08Æò… ™X2Ê"oó;|'‰K`X>dÑmþsZ^¢"‚K„¢÷¤öTß.¶œ@EÂ4c¢¢Û;X]UCí¯DqÓ–«ªËvÜfÞíK„Ö›‡¸nÛ+üh¢ª—ÂH\—$åákém¾0ãù Q&|œòƒ$Õv ‘K¥‚u.ýš¿}"¶¹4I‘â„®Ò=«‘HÀÆÒ`¶±WÌL [Û6ë©™¢ù[ ÈV ƒ£oùˆÚtdù8À à“µôfRÙœÑű›É¯Éô›ÇÒSå…7a`6¿xsŸÁÜ„.žOØ–©Œf[oÙ×̉ŽDs>Ȥ.]¶š1¼Û@Nmçœ-fgÑö(µˆŠ\_À½ñ æ’蚢-óÄm[ÊZ.¢z†-(n L$tÎÑj%®´‰_¸)Ûö½IÚ÷ÕÍU<¹¼[ŒâIì \¯ef \ŠoK!’\ÍBŒjÝ|&Á/ö" Q«òÍ]QœX&‘RfGk §o)Q}…œZ¤1Qèë½D ­˜í;)‡˜s÷7Å +t:£y”™ä0+Jª„jËb¶õ0BòÝΟ§€@ÿ…å g²¥@æ›-2%Eh{¼ªÓ •´ Clùê">Ïdµ“†¯û„ÉH‚¶uG8pЂ‘C¾'RÍT„{Zv”Gqt§cXP'pTË{—;nì>Lõò4¥mN£{¡š™6Õè†JÜSv-•5£Ë„X§x6xcæ‚r…DËÀ»kšˆa#$å†üz]Prw¾ÁJúµŽEn©VŒ}$BÆÊ«r´U!uú„X¹Cû}Œ€{Û„HHÌ"çmKÂyÆ1‰Š¤¹Ô~ÞˆÌö/L{ÚѽØêv×y×&p¢O]ÿCëÃ(3|Èß|“¡q”ÿäoþLnýỞ}üü`ÿ›ôé¿k Žÿtôó^Á¿ø&f­+~ŸˆyŸŽ´+¶ýøcB×çþËæg¤t£‘N»[Ä3ËS„~¶Ž3A¼bsmFñd –ÝóÞN\hÌ6usFfI‰²Ôõ&¥–§ƒYyFZša’)%¼Àéà„ܹùÖ\ûQ¹6ŸÐêG`à; ©_&…òžç¹ÄR» ÿâYÚ6žù>o Ø‡¨‚iXs_‚™þY–­°/joÐ?b>’?BŸId­1¥K’í˜b¹­©¶Ÿ’´Èl›ƒ ô›ìŒêÅk®û£Œ·6»Î°m“þì¿ Yõù,g5Sg|Aækžc“g…QsÎ0ÊE¥}3•Ö{¹kŒÂÿ8Úu?WÅú†çíþ138}W•ç vìhMÃ|4%GA¬bÕJ4^thŽöD Ûi'ähÈ3§H;JíVfók¯õ]ƒWUaFšmµ)àý:M>q—BÌ6i;¼@/-¤T¡ÑVîâ%!â5MËÓ&Å¥Î܈ ̦]î™ô‰¶ØŒ·[¿iª‹’ ª¼Uo£Ù–]ŠOLÜ•ã> 9–=ȉ)ÏRÐ s­¦(3ºåÏM‘ßܮ֌Ä#›Â½mï€t@—ôž vÑD‰dLúzxóHlP5Ǥ¨Ra…†U‡/õ_ÄhþÑiµÖѽ½4:Ó¡Là¶r7·1í¢Éþ©`WçO¦¥°É⎩âôSä†gíÛgM[F©½„b–oŸz4‹ÝÑÒ3'ÚÿÜñô /óä öp°O$[aì˜üçTý«Ô´,+QÅ1O7²ƒ¤hz“š1 H«¹JNO‰²êGN0°D¶?3Tº-ÊÿÙác÷˜¢™‰'}“kóG¿æíýÞ²ÔD±«3t¼Ÿ´Ýè7.Ã{)2?ã0yåÍÁF¶R Üæý(¢X¸8vóç{áG¤ÈOòÛ†?\Rìf×É-ˆ»Ô™nDç½ÐÈÞûû.‡®Ø6…ÛÂc"Û ’jaT@Wýh¤Äšüä %‰Ø¶íh¦«–û’cXÚEÊ{¢,+ãÓ2&GDR îNs4ùŽò À>å|¿±VõÕ%ê*=>VF¿›e¡ˆmÌwŠæ7ž˜×Žxk#“ÇÙ#*3Á6ù©{·åH’i sÖȾÿ³î®tÒ º8šGɬî¶«dd:+‹‡w3 úéZ´72دNšÁ­ê PQSUpo¯K´#òKؑʧá'ŠÇÅ·´‘0,·jexl'Ì.MPçKËiÍU\Æjö‹äÔÁ+¨Ã^¡+몺ÕA F¤¶aµîùd:§«À3–«eNè ‚´(¦þÙ€jd糄÷¹µCs™5y…ÁäÍŒ¼Xb[$˜Rœ}ÛºDôºÖ’…Ï}/sÜÓ>´wçª@6tÊ ‘ˆi”_²ü¶Õ'ݤ'-‚gáà{õPâW¯¥Woä$å©ï£ÑP3‘yŸ¬Èœý|?èàWG6S€xªÚÉïºãg‹ç7ê<ü™W ÿ»m oµûòÌ%å׿€·D;þ o~üÍ*æ,Èþ†XúÛ¯øY,B#ûð:aù²ÂüÆ/ºË¯æÏÚÏÇD‚üMÿ` <Þ|v‡-àO áO üï¾<øÂÂ.Éð'^Ç$¨P˜ŸyM!õYÜR¶Õ‘ÆiØ›Æê@ü =DyG°ú©/¨’¬uìmœÓ‘ñ¬!L¬~.²´I‡ÿÉŠÜ…¢nlˆ†(¹è¢Þ; lwƬʺŒ÷©Ú#1šmŠS»—j,Aö¦ZV$Tî¤pÛ—®ù«™éýޏs²”u ã“¢ýY&Å[ìpK†F‰mãg0/Ÿã@Ý$‡k_m9&T³`~Aþæ(-¦3ÁÎ7t ºož™|¬¨RW¶=Ž<îêe8®Í Âq¤G`v ŠÇ/f3¨§Xù´C4Dîù„u= Æ*‹¤*òáß}ãçtK莎àŠ;">µ@çu¬–xÖìÍ$ç'ý^kuï/1ÕΖI‚kó@`ŠF^¼0vùl9§F`@B·¢õó0 'ÎÇ4.̧ˆqv¶_0ÍÔ—åÉ©BÅ÷©\Ÿ8r À¯QÂõ•Û›zIå®ú^på;¸(wN¦-{×ç²àžì’ð”˜sÏ‚Žã¸|u¤ Ìî¢ÙsÔÔAuN/<ã7k|¥¯±–x§ga¸M¶ñ×ç½·¥¢K>Í>¨[¸LL;±<£ÌB*E’k-€ê+پסc'iF¨Î]Ÿ…'È¡…îvFQdÆ®êD¯ËcÇK·V€oW„ñJ¹Ï2šrZQ0._•ÔÏÇŒ}Ž“°¹Ç¢\*ô0ôvå8ÔÊ Ó¼4îå³Dmizéóx¤ô-e¨‚b`òíp¶ü×xš5ÐÒÍÈJ§+­ƒ»®®”Pø$Ù†P°ÌÒþ£1œçeàŒû3viTDÕ¶p›$+)e“©âÈHàÉÏl2‡‚uˆß}yp@Ÿ ™)Ý1¡ôÔEÑȈa››jô›:ÆnðlH €bXÒ[¹€ù¬µ‚#ÈÚ ‹ÎmÑ®¥÷“P6ˆG¢¹8f&¢K9%)‰v†©Ìœty=zÿpJx6‚*A!Ž,Åä eJ‰®r?ôáiõKø¶Å÷ÏËãx~ا²søÚ´ü’¦"<QÞ­Üm_É.Ž‹ÓòÕÈût|ÙÖÆK{öeÇ O= m¤;@:À_Çóëö1Ž…¯fø*}™³©÷åØà͈à•ÄsT ßìÇ϶—]ôoþ¡ž|m‘oxªMù“1ÀÿªûâßxË!­¼äÿÖóò1Ù©sÀ#žÝÿÇè–H×àc…Êýðad–€Qmé-‹1+¨]_wg‡û‰Þ³e4þ Â`Õ;ahùi¶Õ¤3ïíE*‹ùgɃ´Ë‹K'Ýk™h5¹…kv;d§["Ñ}œŸÙöäÎMØs«Ž„÷:,N`÷ø¨)¯)ö)=CàîØ¡4ÛŽ¥; ’ß(ýÕ☤ ¾¢’_Ÿ×œ²ñŸ¢ó~ªVÚ@pú‰Kü¸½«^:–Ë`ÃZç¿÷x´¶™òÙn€!ùŠ8¬"ú"wØÈ͹ x4ÜG·0µË* Fœ·ýšáëå*ÉÙµÇ?¸h6& Ñk(/ŒkèÆV³°.Ù© µØ9üh_.o "v-@Å¡ºéÎgÐËbqEIæ-óí!.Êå/gQÍÀÅå¯5Í\ŽHŠ@õåÞ#ÔŒB‚p‰ŠÛåd!Ægœâ2 ½=RÓÛÑ™DÂVx‡»n >½ÉÅÄäÜ"Qѵ]SThiÏØÉAwgêsO­®ª%œ…ÇñgADh+ØðàØisìaáæºPæ«qu€ŒaSX³jr˜õ£ù:êPdÀM‹Xªžô{ò¥=kôm£¤[ rMbÕ ŠÕÉÉE[Pr ?IÝb¤jø‡|±ýÜ¥{îNcÓ9\ÇS-&‰Ò ãy”¦L%FÆ2PÈØ¢ÁÚ—y8$U…æÓ“±85™YÊRýò:zÃ-Ìö¾›sbvúUŒùIñOÒ"×=Á7ÛWzÛ10á%PÕÛ«O`T£[¶ˆØöLäˆö©ü‰F¡uìKdmt«¹ŸÀZÜ'oÈAžWÒ]…°Èí‚áwñ“Ö4ˆÄÀˆý¼÷8Žõ•Wñ¹‡íq¥yFùL¸yì™ç€Ùk‘Mú¬ÉŸcÕ:˜>ÆññàÈSöþüÜŸ$üý:8ëצv‹²øI®íÆÌAÜädœ¯æ¤;Ö×-ÎCÛxÕC‡“ £Øž #¶Ž8bÜî.îÁºýXKE.Ï\AÜHî(¼ãºêRà˜~÷éÄ5F [RÌóÿt<þxmÒ@3³Y!I†;¯%äƒzûÝϦ—!³[ú[XD©{¢MêÁWúÖ§ )…S÷†o¹Ífš ³(Ι-Ðnȳ„ETR)‡A ‚4}}]!»©V÷ hѱ„PUlWBT} Ѝ!ÉD!ºO‡ úôÐâ¼yëÀ­?¨½Ôme/‡{ÃK<åÔ0Z‘ÞöjiÈsB&çlžÞæ0¤1’üP1ë̼¦[¸z›ñÃÎK†øLÄŽ"B†2ÃÌ”•‚ìàå.äU`‡r<'˜8B~§æðá+çc棇uåÅ©fw*&^/% ôöÐz½Ïq‚4½‡ñ`jâÊ•ÎJcö|ôMB^A\µ$wÁ…ŸŒhª—¶'Îåk„‡r Ö¾Qµ¿ÚŽïÂcÔðHÆk{âø.¼oUž}Þ¿¯ž~×ÿÃî÷ fqú8Þõ`ñ›WðüOMÿêE½Á'ùÁü7.Îù àÝ0ÀâOÈGwÍtþsÞøë´Hz®Ä/‚¢ßÞJ”Ù°zNLFg~ ô hCŠÀ ËbO¦B[ÿöЪ˜T‹.qÕ"!ÞËRMEÙÊÉrZ€2KÒD°#€+ÛôÒãóÌÏÎ-ÜYÃλžëf¶Ùh èÿ¸Úæ8‚« “"ºf~²_/~)Eƒ >ÂTAv† ÐÚÔij8û±Ïvãž,̽ÒÚÑÍñ–ãœvB¢øÒañ¥AÎÙ«·ØÆ˜g†íœ]ßäp [[¥Î×Á5O˲Öü«§ž!¡Ÿ¹k—½¢?à×lj–ñYØõq´Åýþ|3ZvÌËKº@ý'áÈ—`7QQ6ó>¢Í:ô°Í‡®·ú·Mú‡¥@¾#û'¢âœ÷ϼ·ño&/[úÈÒüâ»t©BÓs XªEØA\d1\0>ÐÒ@Š@u]¢kµéœˆU¨Æ ä‰?ÊZù»÷È9Éiý`¼HOF³ò$X¦8ˆŸ•DÔY¾þ™1¶ U—¨b[C²B§žS„Ç;%. ¹Àmæç¤îÇ=rÔä.gF°SÒ±eÔ®ÛËf i±w?ªóÑí"#¯Mål˜Ï úƒg¨.4‹"šË%š"w(E`q²[u$ZºÛÇÄ$]ŠFQYã—WËÿ$£aÖ‡G?ÉFÒš«€%¾o"@]_dÉÞˆ–µRhÛß»«V(nó¨¬n“X…„›¦û>J`¾2Ôw׋×ÑG†4óU:“`ÁµÂÕ"ª…#2 ÉðPÿát­k|œ]òic替ŒÉÞñK¥5QLÖÁÒf[E>^Hð1h. :aFþ)²³*¤êô|cmÞ±eÜdQ×Ëß…hkHË‘]Ò’˜ºè¥²–(Ü~ïh/,ÖœYè·¡©ºª!ÎÆž(·¤‰,ªjï+Aþ®a5Í9Úƒg…šx(€¥ËaK7 1—þ‚r§cBA®+Ù¨N¼QnsPaò/Ù %iЩñJêN£ìÔ¢&~ ?V4ë”ϤT¨¥²›Ý†‘CË"Ã>¿Y/@(wgc@ô ªv›-%ÄŠŠ)ë©mžUl¾¿¬¼aÖ™Õͼ‡wbF¢ q}¦‡°UÛú#³ÈlAGòÓ£Ôzéü&7Ñ1R°gž7âÊŬ¦²Âðl-ñoâxzUëåÉ›Ïi1þÉ8Ó9¢rÂqEYYU2 -¤T”g…žœóîLj“n& &WbëÁâ©õðUÁeõÈMaŽ"€Ó¶]Zå47%QdŒHx»>’)¥q~vF¦‡o,.EòÕÜžh¿ïÑ"òW§H¤0DŸûYg»ÑŸíyž[Õµ€Üôб ×-KqF@ÒoÊ¢‘¡bvå^4˜-DÉ6³mÜ‚ÿÙÛ9ke>‰’‘-N©Á+ž‘….éù‹ðð²†ाA²fñïÄDÍ%ºï¬Ä¢gƒ)i·„´¶¬›|„erùU}ùÇ(·ðÚî#ƒ€KáR¨5]PÉmYz¦×«-]z”½¼þŠøpõ“[”ÄЩ7÷¼%UØÆÐmÇ­¶$rË;.(gѶóó‹mÍx|Q÷ÈN}eÅ(E¼DÜôx’ð%1Ô¢úk¹{¬xºDDsxh5Ødd÷)’PªCx½åX(s¦´8~¢¡ìí{‡m‘F[ÙÙÙŽaî>ïË“W渴Ÿ#èVs{óYÔò;YÕ'·îÕ3‚0=èL½uz"Ò‚tåçjÈn>¦]äðLب¨cqRˆEÚS7ã¦Í ïê^ ä‹pPÇFùð€ó –erÈsYyQ…šÜñ Gœ1œÚ'÷çÆÇ¢ÉmÁpQ`P-ý VÄÈ–n>N๠hhc 4ÓâEÆÆ*Òæ«QéÊ[¾¿¢wë Ý|IŒåñ¯<»¥õ¨RŽÀÝ/òoù] •/¯² غÇï968ÞÌo˜B_å W5qÆ‘‚ïæ'À«ò»kÿ÷&!ÿ?ˆß_þ†2Î9cÃà7ß…w­óÿfòð__L0ø‰P÷uPê,­5;%yó£p†¹ÍÍ@õô$Yê5QÉ–³ž4¸*ÜS%ÕGð+´ÛQÑ \ n(¥ˆ–&Sur㢚¤~¦ëJÓÛM[DÞ'Tžd t"·Kéjn9Xo³éo%Ç>öÒ´M,’…~!'31¢_š±SІ §öÆ„ãÏyõé»ÚÏÔmúyy™ÞQ=ypPþ{ÐÒ0 Ë D€‰ “Ë’?ìÊÖ§¿¸Í˜½”îÈ5µ½u-.G|û<5²…ÛŸs纞UèkBŽ=ïzÜ¢6d‡/í¦]",'®(?IE€. ݲfZÔ‚þ4ÐUºšØ[zR]*€‰‰™â«žÓMà D÷±+°U‘6Ip–œ¤¬H~GµœrÞΨPͨUul¾ú›©ÄzŸöži¢Š9 õ¶¨ªÊR¹·(–!Ç AÓþæD´©Çßj Ýb$‚BÿH·³>¨"Ÿœ:0ˆÐÛÎ;)=‘¼íŒ^³c#UQÖDŸ"ebqlÂ_—¬¥[ÁË¥àŠv¹#—4CÙ‘V.aT(èi“tÀwP––L }GjƧ ÝO×Ìï-ªÉ¢n5JlSš1R‘sn^Dûî±% -¤Qi ät°ù»/;ò”¬©SŒǪ3ûhÚ&ö–nÉD.r8œF†zU2úŸYD!aÇxÞæmˆ-ë¾LÛÝ 6ÇÇ™s¡Ö¤)¢Æ ³Å¡ƒ#’=h#•„vòË(Ë^„Ú®Aº{´;52‡ý³‰]x1&k S¦DÖåNãá@ô…,5ò9#è|ŽU(D—šÙgþF{§I¨=P)7ms¥ ‚ uIe®‰É–Ï¥Žì“Ç&žcÓA›¡t®Zöôdwú·wí¶õYÅ·à‰¬аX õ‚ˆˆ\ 7µµ!Å“½+Rz-r[–0¾¹?«Jv”L¾êˆÈð!½³ðZO]‰|š-O)2Þ±>½]Eo¸r"º}-óÚ«Ã&°³|•V'XÜ R Ø‘ ¹GR=+Œ”è‚í!LU‰nÄíêWùÑ)¼¹±UU[”SÙii²¬Ðôyœ„öÊþ¡K(\{ `ç½2b.㼫ºLv€~¼0ž5‰:Ü}ñQ×E_­Ù*žŸÄIŠù¾äÊÊé>{Œ˜å©¶+‹ÞÌ=ÕŒU´/æZpUOs©ò íSˆxmtÓ¼c>(ÕYÔ––lþ`xÇ Š'Á!-‚4Ì´“ðÖì™ìÑfGJΫì§8cí é5ÁNM\Á ¢nô°wy£Ÿ´_Üʲ †šE´-–––8ÑUÉ0röŠ1¹ªXÎH¼R;eäç¬EF73ÿvvöç<娨ߓëUÝŠ tö¾eйsA‘×òÞCS–™ß^@ÜqÒ+ ^çß6ƒ[ÁÖè¡ æ;QùÔŠž‚ÃbÀK´§\t¤¥9h¿oès>BïzÀ_ åù2ðïõÒ9~™4/Ç¢ÌoDψã³w+0ø›&€~ÀëøJi‚2¿h”?þ柘„üjÖyÔš¿½ûùÌä|d´|/geSé± ИQ¾>p¹¤S.µÛ3ñøX”îpš{BÂ+àÊXšàòò'BÄ@ÿ{¨EWŠ$AÞ€;„‚µêM¥¦ÇÃf\—ˆQÿ!Qx§Á WÙ—çcRé߃v‘ØÜe„í6WfHn(…~þ‹Ù¨@K“cƒ¶]›˜%"qŽyä’Å4ôÝ™°ôÛ2qØ9(Ž|͇Èò戌‡±ÜUhð¹»Dç‡SU‰Ñ'•¾³cNˆÎ`òYM±ç¨YúL12c ŠLú…Ì$áñT7¿cå‹¶û j oc9NU7O‡@x´‹–)ÆñˆÊ“% €®°ÓzbYåHQ1t2e÷ ©™ÁÉù±ªDõœPšÌ áæ@àÊűIf4Ñ6pÀ5;SAÓ¯U™œ+fþmvüK^?Nõióï$kb“##‹„MíVB$왩&3h´mÐU5ž™y¼„Ê«!¸[ÁD"´ àR Ä’µ ÷{ºª*Ï]ƒ<h¡c¶ÐÁîV ˆ–|¥³zêØcQÕJŠö65›0SŸõbw‹¢íEoÄúgàé‹:kŠ»ÇË61¡B@ìüË#6·uo~J¿Ü °ñ휅–@U ”3Ò}ƒ¼St†ÉCˆ-r)T•4Í|j¯N4B¨#¸t%:=aµd~¡ù–ŒEB¢U ²(Fš˜¦(Á‹L'Hi /ÂÅÚ#¯šù Ñö–µ¶ÉšŽºP‚£#É® (ÐR<ö2 ¹V€QˆhÌ TAƒb'ZÀ¶™–æ}k”ëJ3ŒœNà ÑpC"‘æ‡zŠÉf±›!QE6Bݯr RùØaÄaO5zÁH8 }Å‚¸A\¢T…ÄLÊÞån8Û>»ÙÞrbF“4 1—×Jm¡‚2bŒ Ô)W, yÍx$†2+!^´-Ô`!0xc ‹ns–’ ËõQH1²ÈüíÄégn4·²ÍD¡>œ0UW3³·m"W¬ùAe «<›æa²^žŽ°!“£þãpx•žœ›à8×ùGÞ²5÷M ¹…Û§pÊ= X<ωqû~í1ÙuÕç0¥Íj+~Èu‰ˆ|néØrÕœsJ'„~ÿ’åíҲòXË·P¨Ký’…fb×â¦}ðØÓ!‚=½¼<Ø"A"ù‚ÛŸãòcB2µŽ’ Àœ¬;)ÞÌT™„Žqp†ÉB‚¹_N ìCe%Ä £zCe2U" ð¾=Ê\!¦*X òCäÛZ´ÌêM‹ÙqOè|çØ„^XiŒ}´9C²¹—\AõC`Þ†³,\÷C•ŽŠ=O:¦ ¥§DÉ|--…O '8•¡^ /Bàè+ÝÒ|ˆ­Ô… Ϲ›ì؃tƒ ;=*Î…Š¶„·DŽY©úâqöó7)‚u‰Üb÷ÞkÝÆR¢ž´<;U4ÏU.yÇRÝŠm~Fóª‘æ#fº íà’¯î È-šPê8Hù†qÎ7¢néCÝÂz—^÷å0àèúÓlâ‰/—Bž¡}¤ˆæTFu4w¾‡Qüè‡Q#ù”8O‰ÖÎ?mù5à/"ö³Ax¦µïFôƒÆåSŽÍßöÿF×úUl8ÿÄ¿e$À ËÿÕ‚ñÝÏúÝDoøÜÿ&€ò`¦a\¦N{ÉðÍBõ¹o_*ÏÀ)ôÿêçŒnÍCªÌ4•e´Qþk4¡¤p=!Æ‹åÛûÈh0Ž#E°o‰‹sè\ü®a6 i¶64¾})yG@ùÜb‚«ÑŠgI‹´ô¯Ã poh4+DË‹·â˜†£/Ù¨¡íØIˆark§º°VÑ•üʆנ."v Vªî]dgÈžmŸÄ¡)(($õcŒk^n8¶þ q0W[Ã5ªÉôDÔOÛÝô—3(Øì™Fû¸'‰ñEÜ`%¥É2 ¯Íƒh×ßFTÍ‚Çuh»FnA}¯_ä‘ûS£-LÜ14r‡öºò*²k?rG‡Ð=gûþÒÅëÎYÚ©PxíÑKÚÀÓú€7Œ/·´T‚ƒobðÎ 0åœÒ´QëœÓÇ»H†u9ˆ™îR­†BÄÅÜÁ›Ñ{ÿTâkçgŽñdøbdy¢»c´„B[V2ôä–4Ö±Ö é{k캮 ¸GÁÀNÁ ‘í=;´ÞÈs4™¡EAÏŽq–Ò¥‚wî'X"¤m¥_ XIƒ’‘vèmí½-µos 3²WEf/@²õ›}^«~‘·ðÐú¨z˜ØP a›Ÿˆ4ü}d;Ñžd]:ëÚêa:Â= ÎÜÜl˜&‰Åq¨Ì‰DŤîy†lJ¬à§¼D"Zû U òI¼ùúaFQ (=û¨šÈÚŒ¬÷ðeSÕœ¾ã²K]hZ“ÀR¹7D¸–J2xTÝSñ²Ò”›<â BñpF3Yú´­æÁuižðì™+Û(Öb„d‡ ª‰ÇÀŽÃü”ßOO! ](Z g+'?KÍüu§w´¹5§!Sðˆ.8N£¶l ¨kD™×ÜzêX‚½+DdÒb½½€{‡#"šâè CÏÄïÀmY¼ós$†eˆÓb­ ‰-µ™PIÛÛ¿¸õÍÂÐÕb·(ïmžñªšWjiíìÖ™ldzƒw~@¹ÖZÐí¼³Ø˜U5ÎóÖJg´æ‘n6ª\‚,"nìQ\@3AÌù@øC™T¿ð‡iF¸/‘;„£‰•J'Rg³ªÊ;éQ޲Î{:tZ³â¨Cøl’Æ…èÌkQpb }FØœ‚D q¸¨Lœh¿ É¹â ÔDEl‡‡0ð•´Â²:ku›ªù-ë ²q_N/3Q€™xΤþøŸ/×ɘÉQC6Afü5ncÇÆŒmÂ'J)¥ž•I¥Ú]¥‘àmÆa¼OëT›43 «2c’D†…‡”/((–ÈýNïP «Ùà~€—J¥MB°.• †M1æàˆ¥n­ð]Bn›}©²-S¨”Üù$Ç’ïËÛŽ–·ýÕ}0³—affro‹¥}öˆÊ9cãv×'¹£ÌÚÓº;š"-ypÒç Ñu­…‹ø¼«3’ \—²GÒ*KÖÆ[({ Ä ¹É'··+ã¡ÞNìµO"Ì÷­c‘g¢"ï0æå“5=þ`(°IÞ»ZŠé˜ïY>»¶ÎB#ªhÅ(·‚O ü}Ö:JTjõ=/ßSûSƒ{D¶»nÙª®K…\Æ5š®BÒk¦ÌTBt{Ö4&ŸÝëHˆ:ʰÍ\VGý E×µRæ"ñ5°ˆáCƒ[Œ¢­°KRƒˆñv‹Û8­Me^¥¸Á* ·)ïZ1–e„8b‰ ¾]„g]òhϳè<µC¦,¿Ç¨­\çL4[ÚžDéD€(× )F„Áfè¬Æ RÙtÍÊ-û<ËAÆ™vŸ]“+™Š"¼w,™ ٜѡÀnå6®Í¡ÅNl?NF~˜¡<ö÷ò%d-Íäqϵ06©Â·¤Mœ¢éÃÈÞqnç‚ÚŠuûæ,«\•¿)yY,ã{4|ÛÍZ-¤U¯'ꊘðµ¨{4:¾xOÒœïaÈ-_šŸ§º¼7Þ¤êÎöÊ”sïsmÃu#þYÂ×7Àïãh[GõP+ƒï»ø¶ñþsZÐW»¼Æþ;Y?nÉs÷Cöí=ò£ßñÏMÆÛ·„nm¿Îä!>ýþCÿïþ¿õ?¯¿¿/ùþ†%÷¯1 é@Ô Gñ®‹ Ã@(¦É~V`uãÐÉ9’U±¶P|×4e‹5îBÇX&PuÌÑ]˜ZJÙQ¢¸?mêQ9‡‡55¨Ù{’ù3‹˜ ™í¹ç0y.÷Vk"‚”eÒOV͘¦ú¹ MWNéP/šioóIÑêÛPEMüáùŒN=‰ÐH¢':O¹30b*½‘[êc=¸äئv\÷QŸ#×Jj šÖ‡sÄ­Ÿ6eÏ[Îó9ïÙ$cÀ^ʵ©Ub«Ï†ÇþòLÀÑÎ7ŽÇÕÏW^ù#÷x“5®y&k ûBÊ©ŸîÆã‘NÙ´&"*uPþ+@ù§3€ßÊ#0siçwëØ£ºö8ORšùH“FÇpfM­ñVC4A1ÛÎÛÁÒì#ËKi$ƒÅX~Ì©¤v8@AQƨµe§½”Þs=®Ñt­u¾s]k]W ê™y4†GéqÙQƒ?KNç•ôžT¯%|¦´†Þì¡™Á1 a­>ni.ó¸‘LÖ8BRõIWiG+?€ ÝÉ+7q+¼mS¼Ï„ˆo‰eЇ•í§Z¡õ¡.A  šA„Ó1ë·:3†1ÖÐniœ¢â'.IãˆLd3…h-O<÷ä€ô¹×ÁÆ3‹ q¬WÈÍv17ŽôÝXv€A3Bda¶ÅIÛXRŸòä¦nF=²µk·á†ì&k( vHä]®ÊP©S„¶·ˆâbªòÁkÊ@~û4Ø7þ øh@¢ÄÆH›ókaá7ñôî¬8%Ò‘=Ù"¼¯ê¢ÓÉÇš ™”’tA”…`b€F WÕk^3c¦j ï !ߴĿ㠨Q`ÔˆG‰Ëît÷m¦ÞΚûz´g—/âÕ®9–%Ÿ˜ðfC×eÆ=儈Úý=<ÐÌ•UX‰²ºß+Sã꧘¹»’q›ää)K(r•&€oËð«7_Lžõã,YŸ¯”i9|t›Ó€:âù~L–/õˆ€‹@‰¹i`ÛÅsM˜%›nkB.Ã}ÚNéQºcûÛ±ãb\N!w¹/%°¸|ró·Ψè=A²ÄÝÜÞiìM*õºRQÀYArÅC¡¿Ý=וW4ˆ=<šTǪ ½ ¾x1eµ?7‡1Ùí½Šƒþ–!ÒèþÇh…H%%ôIÄÆô(‚y+´¥ýÞ…ΰÞSe_ž ˆ·ñt{Kó‹ðÄáÏÄÙ3ùêTOê~œ‘Á1²/Úñx\¯÷i™Ýñ“Šå‡8 çp¤ôÕx·ø\Þ†ïSGsd‚åÝîÉmeÞ¢ÚÞ÷Þ{Cÿ*I:ægLä÷ÉPLêsOnR;71”£W1JZÝY8Lz] ªþ§‘°Â¬9iÊ•}çQc¥LÍ:·mÃÉ«‰\6qY¾ÜlÖX–àáéXÀ¿—¶¬H0ìû…›ØM›Á‘ ê_õW§ñÖR9ÇfÔ¤Ž4±tŒLÝ^ORSVøw ìɶï!äã½h¢¼É²pCøËv‹Cv††Ï­R5ï‘!ã#I/ø<‘SºñÊÜ®)ß›­X ’âA7Äú•fv(ôŠÉ1ç)Ùû¶…ÝÎM5fÐŒßíüÈ8ê¶*î7+'SGbäð¹þÕ¡ž±‰ðäÃÔ$8iÎ^ÉÌʆ,3‘/ ¹¢jÉû>•?±ÝFN&¹Ôs‚ ÒâGÈ*?J^òô JŽm=2v)ï`Z#¹µ•YÝÚ­‚ß©z> ¾®¸,{΋Øf£S"¡Až4v2'H0ùPON¬s~gª6RÐoEx›,ej0¸IZ6[btýºS³Ï{oiBèãXOT® ðIöÄ)úÅ»×ÛHZЈÇp’‰¿†mæ±Hv ¸ƒ£ßv"Í\"‘›âðhMtŒ¤T+©Q‹.ˆ™?ì2Ïh²LCZ3)ƒf¶@ Û £FSo¹XÑ6\uÿC/!ËMO£ѪaŠN7™ïçt1f!ÕÖ¹tæ¸SÆ0Ä­a,×Sq)ÐêC1MRC'Œù’QɸÁÌñŸb´‹5PV<ãÑI" T>³ð0§Ÿ™À%¥oÉî’ä·i~ mBÍ4’:%ã–IJ¡ áBÂñ–,ê¶±ûçdqk¨õ"y°9xV«Î´¢(Pó¹ÁEc厰5¡9¦èNž#Ì#Ÿ[„¼ËÉ£òŽ‘¡ÕG‰LzG¬K¹¶Ø¯íõ¡&/ ^‹›ÙráB½zé+™` ÍÒóÐí¬Ø§È§‘Užx«I {ÉÿÃ’°±®…KõCñ¯axà )P•ûvÿž]ךmÁ^÷4w¶%Þs]6ʸ͖1Û²@Ï0âR9ʼ(Z´bµë¬ˆð ™ã™×èvSÅ„—v_ Ký -¢Û6,3H$K¼Üp}SóŽz,*xZ‡UçVëñGRnƒÐ4ãš–`&—¾§U¸kÒÑy¡Wâ£Õš? n™Àr7õÛµ|B­D¾}ÿ’aÅî`<¤ïKêY¬Šˆ ©¦ËPMl½twðÔðú¾ö¡*‚ ÙôÙ’Õ·+´„ê*zXÀ}ÅU!Ü ÇC¹:![ÁƒM¥é~‹M†ÚlEÍŦ÷2¡†J¦Ÿ×óa$Ýdz Š¥ÁŠçÛ- ”Øgök<%ükb'§2u ”U"°ƒÃ&Û†:`¸§Ö¶ñ#FäX ”\ÊêˆâUä!P¬rߦ”îå¤Z®;9ížœŠœ>Î;A?^‰-زü¬½Ç~ÀåòIÈDº8)–SJ䈼´QÀrÄ×ÖW­F¾è»W#o„ñGêãßšsÛŸá?ì¨ÿšåŒ÷RþšSªþ³IÅ}ÁßLxŠæåŸéàÛdåi9ÌR†øºûÏæ ä«wñLðÀ÷  ܺél¡¤ÕÅ*±@¶EÛÑF;u§ÈÚ(K,öEÉa´ˆRF/¤i"ª}Ù´ݲ{9ƒƒ !µO{¦ÚJs—7ú ¾¶s2Tñ’¡d§jæuûqq •0¸yÜOP9 ÷êw‹ˆð»Gšã,÷µBÖýZ*“`Hw¡·Öû0oG3¡6Ú€®fÃ])&î„ü"“Ä{@¦ÊÖr_ò?ѽ{É Átç“a'"±‹vëìó˜· Rî¬{Œ‰Gí¨Î/¸i6Š~›&~…ÈCƒ?~ý”¨×»(nŒU0¬Ú–¼ú$©çCÇ„5°-®ÞÍ4ÁžA& H†ÝD1d‚35ÆZMyfé>Q?#{à©Öo@?ãƒGûHcæ7‹ÞÃPîùÔYÓñçÇ ÄûhwÁ5i¸E ­³xpe ðΙ£žG­‡œ:m«Ÿ-‘"ÉKÅ30ôSÐgÜ{{H¯Žwî­Sì¾u­Ê+扣3Ù÷MRu11ö  .¸§ÆQ£Ã€»rÑèçæÒ}ìÛyOd-_F]@’­´Y^…9".\Âc¦#WD[DФ¥‹ffÛÖZóyqBÃÒz&`fÖv¶F,xÅ𺠃Ò^J`͹p-6Þ—¾üòœñ"¢¢ˆÝmT¤þÇ™§'+¼Ó¨‚’à[ú¯[€@3Ô™–êà …«€ušk±‚ÛhеtaïL¿ Y´ÀñãÝ¥Lî°ÎÚ%‚3c¡þã-¤d1“_!5Lüw¸NrèÌqU½íÓns%¦c£Ä žÍ \>§Ú©Ê‘öË¢*ؤïÍ IDAT |,Ÿ‚o>Ÿ7æHý´ë‰Â,ŽŸqïsèxäQ£§á µ:-åÙ9óܰ%%ÝF„×Åns€›¶H3Ï]òíŒÔq(õaX¶É!ûQ—+ÔÉ?WÜ.n‘ë\M'å @ñi÷En‘+ßR(©Æìy€ëZ0õ’/, ªˆvd?Iƒ<¶ûâ½ë‡ ‡ž¸ÁmÛo•:…–ôÁƒVÞìxX}+Ÿ\#ÁRFiR·b9ÅðPÁì&{Ñ£ SÓ€,2V( H,’3¶ØÙ¡f b'2™4qAóígwxD”[F9Ö Nø ž™ãœÍ…þ)%öœ^0Ï› /:¯(£ë­NáŒþ¢ÑÔT€Kq w,rRñÂ4Àƒrk4€#±£^F©ÿ`°©ßGõµxbÿFç&£¦Gÿˆ³t‡ž+ý±·”½g¦tb …‘”è¾oqî*iÿc<õÊš¨E_û¬À2R*Ä6kð«e‘É„e@;â)ÂOi¢&ýjV‹-"É—wÿø>óIºà诣¿jsŸ^J½F¬õ3ì#1Û÷¬C=ñÈsêÉã·wM×y)h(ÆÁ°5oH-%`ºN(,uZ¬š0v´aÕ°%fš“rÌ@Äû —ó±EÝÿW¦·2Ò@.Ÿ­p`ÇQA³M‚Δ!ÜŒ!¾ÖªoQl8(O}lî4È` ázöˆÊ‰*?X‚±xnq^pÜC›g'fÐ…%Ô(ÏtiŒv|&²DCØ[Q3&ÎÞä1Bˆ…HÒƒÈèžmŠl±ß¡Ýüã~\ê–ZÞ;µùˆªÆäç½´•/«¡c‹>ÀyËiïRuŸŸA:¤ä"g'â(/b/µ.Ážgá–+Î#KB¼ïøóU×~P_ßa3¾eZ]:¬]Ô•¹fŒ ìÏ^OvG7bh¨¿^þŸq.c¯À—ÇO5Éߥ¿dØŸöŽŠ›q¸~,ÞÇüaúoÌ~òÛø{%Þw«ÿèïºþ+ÿ½‚ôÏÖ?O`Ôœ¡}5Vù§f# #Ωþ+ ¯’îÕñg!r%÷ª^©7ï-r±l}Ñ921P]kà}mé„á¿.èM„ó¦¤â2EŽJW-d¤ºb«JEm°+TŽÃè Y¨¡n÷aƒ;ÍBÄh³zÅü1•H#u Xi0µ Ó$°¡ý¤£Ðxf‘V:¤°ò\krÍè¥?38'wJd4 +:ºÃÇMÙ£œÜÂ"†ˆRrDЫmKGvîܵy¦suÖH` ØÖ4¦ÒvÜfƒv@9H]ðláÑøxqÈ—p,ç `'ÊÐP,db\s0pæmàí¼|œ0O Ó~(gîñªÞxy†:´SÊ^{úòU€<*ò&Õ÷¥v{´¸ñš¦û²&AD.ÊÙÙ?78„ZÌ<ŒNSÒ.¥¦¯`Üh dÚl´Ò.ôÿ,È‚9°ÏLÄÌlo¶ôÂUšA ©V*¿¼&K »Gc¤®úÛÙ{o£™]¾›®íŠ.%DÎ>¤+}Œ÷~G,÷Ù^(ã¥MÁ®-è•Ý\ÏXV3)öÈÈÐH˜X††GEÚ/ÿ1ú`®µècóI>ˆÈ–BOä`†0ÈN=‰tàñ4"  uüFuï̆< Å$ö[AÓxá{‚3[ºÁQùPdLßõHRD2Æî˜‰:@Í@´Ž)ù û6ÖºôæA¥è0^ŽLƸÃbÿïÿçÿU^çaÛÐèbXXAª3¶ÏéªX€ÝûÞvÁsÜ•G«.½§ Їç}B*d¹ßbérñu Ñ“Uœ-4²üÙ‘ÛÃüvØÅýºíx.bÿ_«â™aBÕÌ=–L2‘½,/á#¼Œ Û ýt'¾ÎǺ´ðóº6é=N´~k’››¶„"KÈÛ\°€{3Ó‰á‰‹Û 2ˆø¤ŽPK«VÎDMkŒî–ð Šyñ§>q×6Kâui%øPü2jTMÎüÊlXUßË}^·mßF3»·…¤‹H ‹Kà‘䢨a-#|CævÅ1êwcŒãè|¨rJ Ü·`¼œ»­HR1kçªá^§b'«ML”4B4é8VîL]g<à8âö’ð£^ö¹8VS—Þ)L[xÅìƒE$Vz™!Õpd4OAý‚>šà 2KÂY4ò> 4•%C—mÒKsŠ©ãÕ˜¶‰›ˆÉ Ç„0ò¾¹t˜°Ã¢‰‡k}@õ§3s3¢}ä³TE7޵)zâô ´±‚(Zü’8üa~T l¦ÁKŽ‘˜Û˜(ò¹©Øî²ú¹?ôcžT¦"Ž 8è¢Qö‘ª¥¹ïYÐK5x±êiTøZ]¦µV˰H*°7lÉC2ˆ<õ0KêäEdû~´Ð)àí{ËyJ4¬›‹¢˜¹‚ôRÇ?ë1ŸÖR˜5ö:ú¼ÍòD8%6©Œéª{§6ƒ>ŠFêsð„ÑšYŸ/;JÜUXÖ ×$ø'zèD[j\·=!+d#Q¦¸c‹²s‘`¯î_ôíÜÃÎ$¾*U& ÇmÌí-Õ=Úg:ˆUv¬êæ ¶§ˆàŠ’ØÐCÙÃÕ¾ÒÓ†“duÛ³dqïÝë[Ëo»r}:Â?¼¨b•‘C·] úÎàYÿ{=ÄNym#E-<ÊCT¦Íý“Þ ï<¼›):Ž×§½˜}<¶¼ßüஉžüá¹aµ3¯ñ x75~é,òÍàm§ðóÔkÿqku$|óí|sM _i:9xó ø§¬¾äcÿmýÿ»5þ3 <“'þ9Bø3½‚/ÔŽÇìúxãü£Ï`ûÿîúp¤«~w§ˆ G€Ø@›ê#Ï;ü±,)GË©\æ)DwÑŽðN°¡÷ÆŠÆXØzÕJ¡ùlAãÏ#µTÛ+PÕ;vø»·b¢ÜΛ;‘$Èrâ²)¢»Žé¤n1+NRyP1Û³Âi‹ðî¡cšÍ´:Y‘i dìjæ¨ä‘ pJ°‹ÂY1"«RÈçLj’2Ͼüé*Ë_DË8§\EÙ+Gm‰Ö‘}ÂÉå­ Ô¹ÔÚˆw Ú³ë Ú±,åuèj[º³Q­u}5"¶¡ßL)Í‘¤‘!<éø‡nU>ÛèÃõÞÿ;F ßU œ±i|¾LªO.@›áÑ–Àc?íUwc3ïZùƒtÀL^ C¡fîõâ‘3ü~Éy1%¼lÈôò•EàõG^~}­„~óäÖmn¹ï;ÎÐZ‚ ÍOØik’/ñ²·š#Aú±½W²“Ô=¸o”"EצJ2d„H8RMÏJ éÚÕ¸e#ð²+~TœÍ×BöCýæõ‰e„Œ%^Ò‡_@WåÔyŸË`F;p¿‘)0£¨Šúi®b8µ­¹¨ÛJ1F-y†_)Q’Ñ£«3ÈzÊgüði²{q ÆÆÌb_*>uRzœl*(ß+ó8â­`+9µŸTªí˜·ñÁ0+­sÆ=V0od—§+æ\e4óý´¼íŒÖ¥ÆZŽòvsCr–¥„ü—»áj&‚ bòA üµ@WK%drÓ2Ïr– Œxã°)ŒGi¤0:éËz~6•1YëZ¢b¶ô¢"k]€xD-:×[”L|^Xì 箄ÃäÇ 5'2ÿ”j5—Š—ãS¶`)–ªu%•£ö³>g8p‘½’5Au”h¤R~}ÆÔ]ç„9;ÆKe2zjXÓ—€+,ý!žŠÈ'ÅÝ|îhûVDÇíEŽ*l{P³:õ°¸:€Ô¼É½ÆŒæ4$N3[+¶Ã~!´¢‰³ekœ£'/¡Ô۶*€¥kamìÏÏÀšQï%—™?=¹õ¡aq3¬à?CTl,õ{- Ê!~X.œ$Ó"Ÿ¤–·Óþ×Çã&ºì׆Ä΄Ë!°œÇï8ÉG"…l’!$§« ÿ 7Íï©ÂçŠ5b¼>Ñ6:ûB2bÔ­‚%ÅËt1¦{t¡S”Ô=qäPÓÚ ø»¤j²Ü™ˆÐÄÔ§sLdÀŒ)Pl9Eoæ‹ýhïÜ{Cýl¸)f±<ÙÍK‹ÿÚ‘‰µJ¡mùq§‰U†ÀÈøÞBÇz`DnW‰œOeܦª;uÏeî’ñ¸j›’m3æ_¿iû¾>®ÜÌ|†7y>µ4r9™¥uï •?ã¾Ìý²mæp¼û¾U¯ÕñA_`…Ë”ŽÎÒ©Û‰jY¬šEïvÂ1* *3B&`Ì—q+Å„Ç/ ì]¢šÃÙ,Ô ñE|Sø;ò±DÌ[•¶Ì¥ FT< FG9xfHM!ôRñ;êì±;á ¹íMÂBÜ×Vg “_Øÿ¯;f”v—V§ âN5~QÒ¡&îG•–ªøœ¨mD“½l±¨Þ{Ï–ÁÐ]™“¹°ˆ-;ÃLà¨þœcø?Û ² ¸· =ÖÖL€¾‰ùµÞ1pŸ©Ç2¦z‰m¿tÃçÍÿEÝLëY3JI¯çóîZ–ºêLQ˜Q—L$QÔÛc•Ç!÷D-S·M’&ËÓ’±‚ˆ¥ÍClwv1ÿJKï³yþ‘iy½Ë  S=]Ê ºÜB”ŠgkÙ$GÏ~‘ÖÂÞFÁ%GÞ_=Ÿg×·ÖvŽw#Žs¢>Oši\q}â!'grKHI'c±Nò™G0*Š,Dñl÷‹Kàô"ø3[6z ôb/Tyç¦Ï|ànÎáµ7‹F–Œ°ºïzÅü}'üÑ™/¯óCù˜e¿ø/^ç1_·ÍùöÇü¨ûÿíW´±ú…ÚóìþóËnè·wñU¸ê¸‡ý“—Uv×ÊþwMÿ¡QÂÁ àí­(ΫÌ×ùÙ÷&|ûÿ%ŽÇS.¹iáGAÀÇOˆÿm·kpp‡ñ¤'ùÒÙhwªû9œ0iÊRºínY‰c‰¡¬²ç¼¡Ü393@™ j{ÿHZ·OžÙlübŸ?@äiÈ4àgÇýMº/å¤'=¦çxÚ¿µ<{]SÜ|~S\‹+§SïÉ}­bGý× ;Ÿ¨6=_.Ô¬<^™s·'ÃoÜ¢™9.HuAí‡uNL<ôù£È{÷Âîû×½å×§®u]ËߎÒœæYÇpr9”ÕHÈd`† XUUH]ëRrÍE2]”Þä¥LÈŒ‘ó_ç¤ëâD0õF‹æàsèâŸ÷BiÇýÏ5Ž/„rÐâ>e¤Ò9-ÉÉ%¼œøq$sSäY½gB\útú~êóÞ¹®¼ÚÅÀöX›ŒŒÞ´±N±˜MHùÛˆ,‹ ¦ÙAí kt©.5!7¹ô’Pêë‡êµô¾¸ïèMygÀÒèÑG\­ S® ‡ný’¹s:Ù&d«”„/ØŠ¥`fQ8T lZÁbcÇu˜‰Gãê¶-¶òÛÖ ¯Â§b!º_ËsgíïiÞµ¢Sž‘);âvŸù V —âÄbó€ÒªÃŸv «7 ÂÅEÛw‹ =ÙÒÿÅ/+S®NÕÈøÔðê…ÙßÌ“9ÁGReå£à‡tѦÁGË5&áïøµîcHâYð5p-b”Û"çâSΖ|X>¿¬£|#ÉA uô•&õtò¸…OÀ¶@DW8zlW<ÐXÔ 8û÷j°Kõ3PfÞ`)9¸I†œf×;$Þ³j ¼W¸À›bê€]Dm¥Yàõ°›‰Jä9›¾åËàŽ‡©50cQír4:LVµ9K&AQ8aÅUÌ÷bmVÐMҭܸ‰íRÁ&TeºeÆ¢÷‘<5K·ÙLÜÊëãÙ”ˆ,NUsZ7šs-½ÅÜa5äÚÌS4òc•Tö8ieö/rô)æ6«¹… Ê¥ ÖGIæv§€¡y**u¢[ PêmFó0 š=9 èå~]ëC¡ª´0 ™·&·2ˆÈfÈ©‘KhMDWëú!ÀR¡9“^´óØý[å£ ÕÇȵVåqìXI}W{Ýä~J¿á¶Ùý¯}ß·9‹Gt]¸¯çàã’[‘ N²ÍÁR9®jðÕ®pŽtøøÙÔºª@¨´HvÊö§6.*Ö¸‘t;ÓLšØK=³|üµ- üF•"$·YYÃi"Pq?# ^)‡<Œ`ÏŠ¿GÅD;¯Ž­p;Td_³Ô”íZ­Å4Óå³~¯ õ9`q­Â¢¤&w>Ã.õ¾–¬Ñ AtÔëWEŸ˜ª`,Di?"—˜ª@`“Ê …Ã?S&Üê‚ Ûò”í.{UÍR£KšJ¹uɇªç©x%é®Э<åO-Г”<²z+"šíU½­µWV” ­A‡ „”ûÒ0¡ùKéäLÉo U‘Æv’û˜ sD½ô0Є0ÜdwOýµ›m×=Î^.(éÄB] rÈÆŸá¡ƒÞûúUšU:ûDž(FzÂ7ýÔ<¥rúMg‹Ãé}j¶Ð½bØãuØÙŒæ”û†ëèYJÉÍëœ?Ï}ƒ®Ñyd#ÔDD¼â6wyóE×åø•>=‹9>:¯Õ½y‰¬{Bo!"ߣ_;¨Ygßònwx¼ügH›IÂô÷ß›ø›f+S´ð¦)a¯¿æu”ð“ˆ?•çÿì}ñKÍùϺÉÿ‡:÷ßјþ93¼<€C^õî#|êÍàÙ¥#áG >U ZÒÍDi¥†¤”[ÉŽ)ik| %p:8¡6PÑñ­Þc¦X9Ѳ¡J“Œ–OÁ•P7(tm™¡ +BáJ”çh0”E;-¾dŠMD ˜¹«NÔ'Þߨp t ·(˜ ê-e&ð¹Khëÿ1ôï Çéø¯Ò4 ÊÐÔq¶’%’?S[´ÃÝn›ÛìŒã”c;iKvê#Ò9¹„¯Ñ-ˆh{_a}Ïüç7ƒæè¤CõØæ8Uà >þ  Ÿ,‹8nñ¸Ã{ Àƒƒg@}Æ `BÐ{ð~zŒê/sPí´‚0G¡“NÜH>öá´êbš¥µ\eG36-fæ’½‘ù'Ä«`öüJ4?„\g?þ8ÂV€7c†¯ýçÚRi>£+à À+ûÌðž±Hqûô µ·êS«×‘¥ºJŸÎŠ$¨„»ß^Óð0²Nãjùðµý· 0*Í‚§7HÚ{í…;í§¬yVä­þÆQˆÂêUý8·©Æ b5̃_aJ8°)y¨*ï $°7xhuÖåLT‹. íÞRâRëâ²ÎF•¤°“ø+îÛÕœC†õØOϺD?–^ªŽpª…ŠbÍÍZÃVfY ¬½Jþ»#Цj“CA>¢JÐÀiÅÊ–>¶ÙÏÃhˆù‰XPq ÙO â¶dºt-%m© õp lA,…jÙ„€ž+Ч»PÙ…[€DŽ{žÅkÄ®ušÑö[n¥ Û¿Ÿo=i„5;q%møÂ³! T†4lo`ňAE¹PsK¯ÜàG^ …êÒ:ÍÕònšn|¨‚mY^9Ž(ò&—éõW5®Ü8>ã£q¶o¦²)VzÄÒ™5L¨€º77žlGZÞÆæINf̰\ðpÕŽfz…pÙ¾›êyîÌÒRÖVQ¹Á«Z5_Nr,=Rœº˜á³÷Aîû¾÷¯mvÐÏϽ®ë/¼Å'ÌVB½(OZ¿–ZÆò¹åCÌUèî‰Ös†çpAvÝX ʽ·›c{TwИz)ˆb›Øm~©ôŠŽmI+XEóÏš3,Nïú)Pm™¯¦+¬˜8'UKï$ùŒwWFVtå’K±?rŸš[ã½m©üº?¯µ¶uX±«ó Íý+·xÞƒ'ÛU= 6×\êibj˜“’”êéß">vðÄ*ÉÐw;é± ðdô ¨°J-Ùô¶¥æü…%7ιLпôú ¶±5ãwZi»l²–„51pù›Ô¢´úª“`K£zɽ í8Ñ(êO1ÓF/nb›µ’;|jæoX#m`;dBr­aÃÖSš§ÚfçMîúýÈo¯îvk9N=߾ͯð’ÙZ>³æ w9Æí`‰lHÉl¼p©PDvï%°u&|g½¯önI·$)¦;̆N™¾tmýÞ1«6ž­í—#(æÌo‘ù8FKâr=Ž|ùfó>ª#§LüVÈîVM·¶z«+T'¹òo¤G>”zó¬\™Øý5Y¿§ôdÿªø×éÃבëñl†¼(ìùM'¾áOôÑüs5=~#—盖ųÏwùÈÿÛõßô›ÿ\½ÿ2üשÚþÚóDŠ—Ûóÿ“ ÇûÂ?g.‚—›îÁÿâ&=šþ£ŠŸlèC-rÈZdc Å6¸¨t:žÁëG«;½g…ãú–¨~;–âê:õ8?x&ŽUJé^%x[’G-…ÙiHTôãhIפÑo£1*’CMò6mG;Y}_3êBöy¢âö v(ÓLÑ…VÝ~<{»ñ¯wvÆKŸbÞõ–0³ ù²í!BޝT›¦~;*€LèHۥϲã~ØrÏæØ¹1f)Ì-`Ç?FÞZkä{5í®ÒÆo#Z9v¶æÝÈÄxó“åŠdÉ@]ä[eí˜IÅ"úÇ™÷;‰LF¶6ȃ‰t²zfe∀cñ ª- ”Ôã];~¹dÚ1Ÿr­Q[ê°JÄ…o(@òe ð(5Ÿ;r5äë¯.…Ri4¨¨&îæ´£¤ëR¥sfw·/)žuê«böÿÇÕx÷~:•ŒÌ>è{k$I×ÖèZ4ÔJñÍ#:0ß—K"-¶Öÿ¬ˆ®R!qËí7 ñ°·y[ÎB9Ü7¡Fô>¥ìäE]-?’.Ÿ±(f%0ôÂy JiÝ:ÄÓ'ˆŽ"žOqeßÍH-u‚¸€]H^©âxzÇS¨ÿ(‚¡+¶(š3I%gÐiÙÝê‡åIáÇ7òì’Òäž2—˜µ'@&™òa=FGnñŒyjk§ögÁmIh2TU/,ÕKá‹.×µ¼3«ygeËÛ(*ÓK¢_kÝŒ6tj‘g"|ïCX BךIyƒƒæ‚æ”e*h²<ðq›»H»z[6-õÆ* æ•hÖ®¥ª}ð×=ò仹 ó ÓóÀûS¹…JøOFjý…žŽë£±\P[´°þ©JUß:Ïþ¢iø —ŒZI!·¿”u-w~Ä·ÏÅA¡¸TU·íð4°†òÜÂåÞ˜)–ö/*œ˜ïËö"Üjú•æ~¤J­Cµ ñˆ‰uÖLKy –°’~DNGFnÊGqŸ|–³´IòÊ•^,€ "ðtV’Þb£„•"_` žm²ó2-PqW§G9œ)%‰ “k§#î½¥C/_ÉÍÐ-T¼ä€çÖ,”yÔ(ú3 IDATg¸Q=ð)¿Þ9~5دÛ( ‹©ßð?>ŽÞÆ1#ÕM‡• èŘ¡DóÉ'jà™èèõ]•Ow1ÐâÁÛ2«¯ªs%Åp^•æ39Š…‚jÔÔp¬’ôz;]90¿mbÙæè¼„þaçû± G#»üôTÁcÊ(‘ê[Ù[Ì(G7œ™¶ b²ÍðŸöðRyoÇÂÕ[ëâ!fý Ÿ8pH?V¬CûÝBÔ× |š' ˆ.½Üû—œ×ð®ÜRà ²¤¦Æ²µÃxøÌ±åUŸº2Ýåkœß¦žñ’g˜Ôv6¥©öhðYgÖÆÓúkˇ/) ‘ó‚lcPǬF/Žu&(G¶9—UÝÛÌ T.o)c›íûþ4~(ð?ZÞ©lÉù’ 1º7"$GC,©3“ù« Óì;W¥ßð¦$Z=ÏÃ9M¶°©hyêsŒ+jK~nF1uÈ‚¥ø2&_t&^ûB‹£lt4G~@~01‡¿ß°+ŒV4‘õ.Ôtü&|]X©Ù‡C”µÎ¨‡H$þØ;J§Oˆ Ê9§#8Î:YÊhm­4ŠÚé=‚BéJ#7% ‡RI)“…"5Û TÄ“?"ZÚak•©%¤R\b–˜¤)8ü+½õá,ë]µ*A“ …d»³l³*7~è̌ۨ²oxb~§äQ[7—Õä€PÏ'èÃŒ_d Ú.HÍ‹má¢ã‡¬â\Êk™èQUƒqó†U IJ XÊ—DÅÏ¿éZÙ}¯—¦¬`$Y3¹qqºïÃ"«¦Ü„„i&² »Ê%F’hIô‡Èa-œ0Õ¯Xä=3zªÛbnÏ­÷5·}0ø®oÍ/5ýo®;^Œûן(é¿Àü—eý'#†/¿ ÿƒý'âåEvþwzòßu{ÿ?î¾e;’cIÎÍ#ÁûÿŸ©£…–ÒnZø3² ðq$r¸˜áe7 UY™öüKØô¿6ˆo¾5ž‰†óSñÕÚÁ—ÛiZ…ð·~Sÿý8þýG7ŸÖ) ׸²ä®Q\’ÿ"s@Û0 +tlíÖáüF·ûºš+_dKÇ›ú– PÂôáü:Ô„þ½çL…”m¢1Š• ^Ó*ÛTœt"É'3| Dð££ë,x×ÓŽH¸HçÜ[lçRdËl@%¬gR ú\–aá U}± ÓðÓ!YçnÊê3ø,&=¬µ©ØˆŠœÃ&_Dz<µzzq’ì6n ð‘™< )ÑÍ’Us¦eœÍ@ó9àòßfd¼ŽT¤žÞPØ%9 I~W–Fžö¨#-¬“!×£ò·¸.Ú‘¿Ï£ød"O NÝÒx@÷òèhzB»B™à9>~%ØðvC8€Žë|ÆõQV䟂WÁ»eƒß™ŽÎ`–qæ|W ­õ <´k´úYŒïúwGõ&|þSïÃ’ášý~í;'{6ânÍÄJó1Ý’]Ð[|ý,„ÿÃiƒß0oíŒÊ²TÛ:T©³ð©[‚+ð‚)uÈ·#‡˜… ÑÄŠˆJðæ¼7ê¬w˜:ì\O¯v­œÒP#3»N¼/}©Ç³% ƒ-ë·_Û‹ëI½#²Z}a%JªôU—jpZùÕP–B%oagW´yá$Žªªwt—Oq½¤›8J³^r$´{˜ ÆÏ¦]ÜãEm6cz¯êí™®ÒÆ"‹­,SWкg|«{SŠ|p%f¹K ž‰érš}G/L¤š¢¼î|ŽG`‹7ãEEóR˜GýBíÁåx³iµfÌìøaD<«—,Áî; Qbü^ºKÕòIòÝJH•1 žMäMÂÛÑ;ˆè†i ­»Š¤ö>ÍŒZæZ¯Ð5ãJîàÆ±T9£ñIÇÓt§ÈüPq†ÕÆû†nyWaRë’º¶»k\ª˜ ©ó{×j°ÉŸˆ+ïÒ^r ×ޣĔ™ Ñe¼Ê=ˆmº^Õo?¯A2ÊŽ ~¦ZÜÞñüêR\À«–ƒÌ5pÃÄv†,ÄèG¦÷#ÔÛŸ¬•Å"Au†sT¿Íܧd{J‚¢y‰g[ +ŠåÆH(EË?ÏfÖᥠ[H„OFßøçIœ2R3¦8™ÂÙ÷‰UiU&‘å‰XÙV_ð MTEµˆáX]3à>L3š´uex0{fCæqEÖMà@h_cê#¯[1s9lˆÙ 3ЄȦ®écŒ_Þ:çv¢14‹óÈ@i²Íö'×µôìH³Pìß?m¤}}tÎê‡#]ºïÝ_³Éí…»Ž%­‘Òñ*ÔLPl-¹Öº*„›|šWQ‘3kºß9MÌ8¬’µ‡;é}.­¥Á¡DL¢£Ï“ƒ —*§8IZ¦ç¯o4O«iÞhtݧ”øÀÕ¬ýYpÞ62Kç Ø‰Ø+Èi×£yGUèàùÑF©à)DshAÎp¾‰Rù*}ƒ}òa²ø%kð‡AÍÃŒ¯ÂýãÇÙ²õb¬/œ>¾ú«¿ýÇ{Éúqíz!¦Aä¯Óÿ¾2 ãŽo¯+¨0±Âw\üãwì¿Å$·eà¿úLÓæŸûg%RüQrD7ÅÎaá ùÓ:•ûë$éï)+Q¾åÖM¬™PM´„&=Úl\B[ OzáHOK=‘£y΢ŽÞž-PÒDq1eç^­ÑÀíŸ,Q+Gg6–Ò¼‰_q’§Ý)ñ«<²ÐÍ,ô¨ŒÒcáP Päà3Yn”ú–œ‚1û˜mA0@¦mdñÎ3ç€ûG´`(¾æ"—Ž "ôéùŒä°Q@6›Äž3ië\2›ÂgÉÞ¾ÙŸ[ZE´”Ö£z²@ãWõS4À,»æ0ûÉÓWÙ1sãƒQqÂüä:£H‡õþ€ÖAq¸¯ù3 ³aøº' _¯{ò(~Roì£gô›’esß6^¥‹%—ª“õ™þr­‹ÛÌhfoF–  {e3¿·;{sQ+[{ö0þ’H`ÅѦ£Ùb¡ñ„Ò6GnNìTazw´H{Y®rɨz®Y éϼjÝ'™8ïÖ¦KëúÆ/sýc„'ôZ•¹’oD”œd]åK÷®Z¢èîØ±1²¢N¨6‚ÎòEÙuzi³8Gûߨ°x‚ýRq-q­B  #ö[ÇôÎ{›T—3&…Ä21¼®«7½µMA¦WŹäI¹*.,š¢=:ùsY$›³¬Ct&XQënÆuyÌ DÀm„CœyÚË4?Òß âOýþ© ¡msÀ?ÝV#‘}* ]ªoÙ ³m /wWH]u^Z ˜_nu?‰&s³D¸m+ü±‘Kuo´;ÕÔŽ¼@‘Íï“G$o“ÒÍË_±‰í-uþ¾"qXcUÂR&ïÕвœ|€,GÓ6'em a0®ª¿1Î4“\Ëö–ŒËPUÈÅGˆªj/¤š¼riüôšÈ'ƒÊÉZE<Õù]iÑûXžPI&F\ŠKä÷¸DQ6¢8ÝÇ4‘'í `Ò Cl¤“µPi i?híÍñÒÙ”Žz7;…êÞHµOÁ,S‰­¤|—Wqùò/ Ø:TÕ~ Y%c*)Þ1Wåܪ‹‰ÿ—(ó€‚ ýí¶$'Çé"ë[ꃇ\ÆC«yHTÚ–èñ±N %m/h´mɾõ©-Ü ´ßæ½÷õ±Z¨<ûÓlßqÃkW¼¨K½Vœ4Ú½y­†’ÏñÇ€Š,]ÝΓ«KÁúë}67eu¡„¬(£Ô .,ÔxÍ&äº7¯ÿ,’Û¶ô#†²jPqޝARÇÖ–c榗Á= pRö;wÐ2“-3'nÚœ–O¥–8žÑ”Ä.uŽcå Q_£§¨<ý¯ˆ ˜u‹ŒÙ§}î}ÛMÑß>7>t$ÀÁ$^ÊDîÍ´)ÒóÿY¹W*"² º.@r7ÖbRYpÊ{;ê\p¨é5ŸíIkdÌQçf¡l±Eèã»ûº^kç9x7~èQÉŠ’x 4_,‚Œ»ýã«}ú>Ç<öý`¶É-FÑÅ—,Ðf²n·‹û¡í ÿ¦|¬šýóÀ¦ñ­]ºn3R­0ngêUuA¨B‘½³¡Ýh$üÑûË °|€c=«ÀüŽÐ—’u½†\~f¨ÏªJ»S%…Ú¹§%Š£Ô>‘"|IFËÉÍÞ¡»c©Ü6¿Ê$oÕf? 7X¦éb`À —¹×J|?„æÀ›DùJz67)•';¦Žxæ´Õ®MêQ-äÕÆçàÝâ#çm0¬«/¯¬Æ‹L­Zjš ³Úä*ÿÕöº¿Åµ"¦Äž ΡAB•¬IŽbC¥ámþ;å`,ú4$äîp’v€b,|”´9fȟ̤wå/*~~ó÷7òƒÐ•?*þž¾ÁÚÏHîU’óÂ|S¶œËZjÿ¸ugúíÏøþ¡kñ/éû*² ðÒút»à0âp,RíÃyý®øo$C^@=eøÉ­:h’'P…ÀR¾ÛÄ#<ÓÀ„Yªá¿2Ñ•l;Ê›œ¹hA!0†¡œø…n×§ì#‡ Ù_a°DÖúºBÂOÏ«G?:2̈óK ž²3 ùN²r^ªì0%T~GT^¹çV òöLkO† v¿ÐB ¥;ÒM"Äõš.¾ËŒkÛžy\5ÅkÅòOBZ—ŒS”Ìòµ¾zH6h+ü2ÿ'7Ï`P¶×&·»<%¬aÂg†´rj9ûfS Á~˜6F¤OêæÛä]q¬ª A–4b óƒ(¾!ÝŠð® 8&Z…³+;î·x^Tf˜Õ#yŒe"N}_J €ˆ¦ÊšÇןeA]J<@>SùBiLFrðÐÜó, þ† ˜Z)à[âzÕ“Í¥¼|¤«—}m ‡f ×ÔÁtÏcícÎ+¯g·¥ñù#Ä{¦)1\j&Ë{Ÿ¹ø`Ȱöx4øx0Î}Ö1Î"‘4Bíóå=¿_¥¤õ>2®¥­i’"ÍfD<\OŸmFy(JemßMIù²@ÙeŒ9°²eR. M_]ƒÌ0fëY›I»²ÛR¦Ã|mÛŸÛ„\—÷ ¢P¼%Øê8¹¤V(‡üQ®ÉCA ¼ÍÄôÙ\~¿,˜.h_‘Câ*tk+jã51‘•ô†[OÎ0å< c!\$Ðs…E-0žÍa.rà<ÉoÛ¯Kƒ™Y¶°#µæê‘€†Æöa5éj"Ñ ÎgQ‘]c9gw"Ÿ@K÷;ôÊÄ8†ÈF·ñÑZÁ‡KÒQ¼p¹h7ªÁaŒ/ ¤¾ÑW‰]GùÈÖf ·TÂõà÷'El-u|Å>+öEù/ÙÂe²™‘[7Ûÿù”m¶…áîÈôö×,¯ô%´]äTxq‹ŒB*Tgº ¦c'Š<œg),™7ææwBn#©¥îá€jÈÇS?Ñ:Å>d@Õ‘/¥RzŽi8qsaH_yè|˯û³›”/æÕ<ñà(Oð½‡6Ú©ÇjIAUJòrœ¥¼´þB^âM¾óK< ‰·[zÙvq ºñ¤\löj¤ŽŸ;æ1³½wêò\QìG%Íš´8›e¤IÂë’µœòMA+#/%1ùBÿuôj»8Ø[€ÿ<¤p)™‡B_›“ߨFóA•–w(ÛÊ«LaP¬f–0NȱvnxY)›ˆ$Ð?7ŸÖÆÅí«Ο‘è¨2Œ'˜§ûµx®rwÉŒE îÒ<_‹½«´ËÔÇ2äYú€c»–Î Xð ä•,O3| £Ï}ÚT^Fº R‰8=.¹Üz‘ø¿{ÅŸw– Ð}*øå÷%— émD|ª7Ð~|¯…ÈÒ¥pì-u_ŒVjŸ&,’Ö EÉí‚éÙW´èšßõq„cíxUo<’&ÖϹ?9šÍGžÔ•{‘ádVe´¤™ésÍcŠBdQªñ$NÔ6íÇZÁLi ü¸]äŠ%XÀfú8ÒÙit¼ÝQñ=¬×‘7èM™”—*€¥jù¼í¦€WDFÚæZ²óiPÈ"MADn1iŠè¬±R9„Jš~È8M+®˜7…ì®ì3i˜É³r`‚TÑÕlôƒâD#S+÷ª+ÁCcoe ˆXî›ÄÒ³pOÿ50îÄ=!] CFϢεÐï!›!ã«Êàz³Ë1£C:³‚Ù<Ò¦¾Î%(-›­Ç…I4p4é“BE*ídRŽéëCÀáü#ù‘Ñ™UYG¦‚]}›=r“¤Ý–¼mÓ¸ƒŸÅÍöGQ·×¬^S9*§¶YëêØa+++¡§"Œ2*#1`ÕÂ]ÿE—ßö—`g¸œG¶ywûˆ€Í¨âÀ܂܀BÅoÛó>£?i”/h&Î}k©?CŒ\ñY´áµ‘s¥òïÙ8qRÃT(ØsüØŠÓ*cömfóà›QÆP—·Åò´cœ-1/ÊgËPÙ1szùv¦®ÝK"ÌŒ÷ÞË• e[&Ìì3ªzj¾;“ý8¾ tþ/$ þfÛ©BÉËã–㲦²ˆ{œù¡ª>±ÑoÈí23÷ ¸a-CçÄàGˆb…ÔÁ„°~( K#H¡Rká¬Y“Ѹ33%PãœÝ´µýƒæªáK­ÐèVR`P+ ( ˆ£‚®¤)‘l禈‚®cÓp ÄIÆ;–"ª×‡ØÝ*x—,áNßÃìÅ$KT—Åc*b²œ€¼Ãpfñµm÷…Øé»ÁXÛ³k5lÇÃûd¤šÈ>æ' =Ç4Çz&ò>Üõmbwqî$§ƒ×{CªÌÞ—»ñPw›ö¤ä¨¢T3sÛd³z-E†šÅÑ“{Ô7Æ‚ wjÞ¦ÒHÜE&9*âÍÕA ³|f|O/þi>Iù"a)Øð¤§yÆ·u#N?AÔùÖ‹¤7²¼Ì&‰l:–B âÄ¡™¤êtJýúAõ¸”š¦óR‰‘ižJ¬&Äåôž*Õ¼K¢ÏT§ªZòF¡—¬‰¹¢ÒšU’pnÇŒ­Ï;œ¨cÞÉßh˜tmЇèg¤…Ãv¨JŠˆ<€§ÎøËë¥^Ý"{‡¨XÆD™Þoû-ðL¶L–>ohË8SëV3¿f¼ïlÜ£Yð¢J9_•x½#µÚ£’½7…É9Gõî QFynauŒZ;"k]Äýñ)u¿+bU2•KüÒQȽéHgLùSÝ¤Ž«‚Ûó ššhá©Vám¨ô½ÖlÔ†LWÙ= i•Aµå"`Mp¹¶“}š,‘f¹ydx÷ïüf¢3Ë›±’2ü^Tµº÷jÍ3f^ã¢ûåP'Æ,RôkÑOL ÷³ xð"ÚI~mLÑÀÕWÉ•&y©Ý€'áï‡.ˆ¨e`‘,@õr dõ1x¤èµ4”ްxÁ´?—{Ìñs”Õ…ãÆ-bûH%\­€ÃcûŠ“D6ç Ê.Á»°~˜ð’÷ÌV |ÀÌÆ£ì+úÔ¼… °½™”\KËFm±É“æžÁ8 'Ãæà/ÑGšm$ÝuÈY`š.¦1ãV‚jò"±–\ ™WeÇœ ’”¨5Û¸“éߊ‘H=ê$§¿È„X^CR@•q{ -TiÆ!t; sÜ»b‡ü¶®›&›b[ô¨ u€¯{OªH@x¤¼«O –"´Ûí"ó›ñ*}r^@Ó®±Š¹ðRØ IDATa@ô»¼*<öø´gvGᥜnªX^ò\Þ«ælÄÒ"º–¯8©ì±ª6Õ èCÉxÿczÙt†/ ÙIùÀ¹Ä ¬Ë«)›Æmòn>Êi"(RdA½m½f"²–þ†Å%{S4 Ï“¥g¤Ÿ fAé©.hôRCË·õ|S,z”Y«ÙM]Ó:§<·þ¦(_bJ¬1º®Äb{Òëð¾„XJÊ2Üå=}“3ÔÂ",ªêœ±Tíº¶Ùç½õc•y:†‹³Jáл¨ˆ€\Ã[µ~+Ç€’#“KYYHîïnšz‰;îâäF•ô¶ÕÞj©ß7©‚ñìNWÐ#…r±Í:æS÷Œ’º…½\¡96wF/RLö6ˆ^×°†kËðàÆGª¶ÂêIóé¡c+¬Ñ¯j¢%êeÚVDiv²D¸ ׎ix3ˆ\ž†Ô.=«ÕÐ%F®X „sÈh‰./1ÿ­®¦Sb'4„bQ¯Óš§Îò!Ísípdvdf¯êvhªªPgtŒ‡--Pƒ–÷ ùÆ0ÀSk43õ3󯈕@×AÌŒ²xŽw…Iâø¯Ìsžó§?Ä£®±?Ü/BíP’â–ä‹jýe7#4óùK­´ýÀ( ¿Ú¿ù£¯ …‘“ Oà×P5¾âøÆàøÎU!Ù(¡ä¸Ç1˜ŒË[\Bæ_žÌ?;8Êr{2Æïò¾e$)âÉÄÐyó œ>ÄA¼1G–QVì4^v€ÂëËöTA홓yªí]•¶EUø(OHùuh‡5y¦Hu§ Ãß §À˜ù&3â?ßCçòGA…d'˜fuT ã,pxnê°88€¡ÿ©Vƒú>òïÞÚˆÓîóB åæoŠ›^úw߇(ÊÙWs8ŸDxUÚ<0ú–Ë8gƒÀÜÍla1…•S¸­: HyA\ºÿ (bDÕ uÍš1÷Â[ˆ;p¹GCÎj¾×ä\铨d›cácþàð¹;ЃB"'ÖP€} è¬ÆÛB}òàoÝt!ÕlœbéÇÚ$ë eMp&´qLn€ý¡ê13Šb>cÉëÕ£ÕÔÑÿÕñ2i™‡—¥¤ö®%Õ2¸•ÑÐE3ïlM=ÝÁÒ¨b- D5SWâòh«súî*>˜Ì3a†æŒžÅ²[¤]i6ŠÍ©;­åÕ˜@"îIl&Da•†üÉáº%Ó'%_2òc¼„MÛÐÌÁÉU¡C”‰äÍ {k-„*4¤³R¶7_^Œâ€µÕÉ"â3FõY)Í(Xô rvJF31‹ëXž…&xc_“p>ÑÚ”k‚å’zh¡&æfhø®§Iÿ Sœ¿AS«´sMrB[‘nh0¶È® Ç¡w²z"ÄfÄ~5peB™Ñš×É¢j‡qpÍšf?êR}L˜L³ú×{›]‘yŒDÿ¡[”KFÊ>ûìSu\•É“˜›ŒÞ]°1­ŠÄ¹Jõ‹",‡¤ßLè¿ïrkwÖ§ P‰ëc‰¡˜ h’cùˆ,KR8ú„Á%QþzWÐ #»GçJ+²1ЕĭˆèR¶Ý²­ô„lnÞF*>`¼¨ö0º3Ä;üÛÖ¥"¸C÷Rr± 4½f‘ë’Á&G·kÜfGéÝ!|ƒµ¿+t{â–·%ØKzÁ!#1šQÕ»/)C÷¿i" šÚ9j&uò¾j4寘5ÎIõ˧t¯ ×ZÎâ䞥——°•¥/6¡^õÖñi­ÍSÒkw×GuTõ¶±› RîÐ/ÑOl!öÎÇÓºð<¨Ã"¢…F«,é| ‚k!ÚP9¤ã˜ÿÓÑä_O •·B-Y¡Ñ™–I‘-äŒ/®{Èóý¹”wå-´óx3é72ɤÁ# Ó™¶ÂXÔ¶¹ÒÚ[„ù´léjpâP­ «)]Òà9f~ËѦ£G#¾‰íƒY‚Ç‚hU@¨½Š¥Ø&Xªkù]ŠÄä)´ÍuÅkQÿþ7¿ÁU[Ð?™íŠ!¢b¹å(ÏD©CDé|óÉ#Û:ÆZš5ƒ:3fßÔ^XÐ`ªpÇK­[J>c3+52Zm™BLÖ%¹q¦WÅN­L½!õÓ¢oXÑí­F£‰)5’äE+“ü'7dY¦ººSéÝðÉ…Xºg|®Ë§”q0‹Ö z$5Ñ QŒ<';Ô8w vOyxÞ”HÆóh°K¾n%ÐÃXìn™‡â¬ýÆpJ\8jGWs«¡Lš96Ü1¤3†x€TÀHžŠfƈ6ôß×£ÃÂCäÍÜ¡prÎ5©F‰V¸# JOÝS-Ì’c=®ŠZ¾zY&ÌgC KóÀ²ñ;y+Í$ß,3ï­¾dkxðåÕqúŒ=å§d^»¾ yíL ʉÁ§ÿ¥Cwœ¿St›ñ¨Æ9¼H®±³B^Â{ebÿS1q*A9ÐÑóP¾ü_9~þ?ÿäÕ$05c϶ŽóqûFúï¡…©ÿÁÏy|$þ]ÞÛŸ ·ÉÆìÿß„øðÍžd¿ð=(~4ÐìÖûý1%0“Ba]· „H×tH½ÃÏ•—4¨flº…1œUn•ŠW©ey®B6ü@îR¬¬V2Ö /©3¯T”ìϲrŒ3ð½Ãñ9Ãüï~¸®Ì#i?ó“8öP ™i•Ù–„kWÖkî5ÅbÆuúw‰WbU2 Ÿg %Íûجu(éε¢GÖ…2¾fÊC«µOÙÑ«»'ãþ‘s­n üQ†>ç—˜¬€önÝ”dšiƒC?Ã÷c¶1Ø_zšqàÖ8#ô­ü†’¢eG]g¬¾ïÓŠmÑÕ!?cÞBÍß‘;Oåàz® õÊ!moÁäè9C{ÎvJŽºÏÑ$À›>ÞÀv”|é*x±<)|m$  VfeAšs4’C5“¥‡eu›F»š#šC)]¥¤Z9YÑCè&r’¶·ŒóOƒÌÌ3º]ÑhªÀKøOÞšN:šÌ”×׌‡ÃØþ»PDãüUyѪê$£ê[O½æ[N3³°Ö‹ü­Ü7€™AÔƒoÿ÷Ι£¹uÕAJ„R± 7mÃ̦nHœXÀQÒ„¼ðÏU‡ð^xij\PcŒ½ý–¦ Ö¶p™{ÅÝÊÔ”ëÉŠ{Q÷r+JÛd_ÌzàµP‹‹‡¸40¦ª+¦9¿Ì.–oe| ÀlS#´(È'W’ .ײU6è8ß¶7bëhÄ’¾o‹î>¹ÙºøÄåQXÒZ¶oWŽÇ -ÑØ&‹Kkj4«Ž¬ôhDjöð"ŧ~”¦ô¢ÕbcCQÇ$ŒqDYz|#šÌ—¨€¸JOb@0 r’¶ ß×ú ‘ ûì×Å•ª3/+_BRÆ jø¹r¾ˆ߸4ÒÞ.¤F¹7?tìÖš¹šD¨¡¢¡ÊÞ¶ÉßȨ-À8÷·s¿eI —¬…¬:RÑýŽ7myò€9eq‹ 2£€Íˆñõ²Åõ.‰mÒŠC¥¬µŒ‚…¥º"S'Bƒ¬¦htdX˃x(¡À΀uá‚GµðÓ“ŒjaE·Uø4ÚÇ–m0sDÙ O¥•M´L©.!ѶnYK°·¹©S+:<ê„ÝÞ‘•¡d´LIê 6G‚”‹ÞñÀý¾AôòÛv ü, h"—ê§Å&U~7Ó!¡(t˜ª=Ú|8z*cáÛ“åp€YÎ`+V{ŽâŒ ÕC8‡³‚qV8Zmú hJøúÀ2×mÆÁm3ùùãÌãŸ! SŒ³‚7# ¼¥\ÌÔq¤høqܳ—çKg²Œ¯$êðÛHcoOø)/HVMû!ËãòYs!ݺ.^³Ñòçð1Å"ù›¤ÔÚ úNï™bàJùÚ"‹ÜCEëX¡¦Ñ>Ñ BL,¸~Õk]"æ­/Ó©Ìv’² ·ñQRK3ÿwPAaÝ]}¡t*¤s·'X˜B@` 0V«“f´£Iã­JÅ¥Hõ,+VWz)FÒN-„ë!JŸQ=$ ˜|Ò<¸oÖÞÐ$«æ=0ŽÕb+¢Pz\–Ïž T:í@OGJºäHœ-ÉF([$Có{ hõ=ù3$Úx„§ª—;Zé˜Õ‡™kKÜÎà-Byñ« z¦›Ö ´NRjdT ÞA¦úضÜáQ·¾Ë‘*ƒ.ìàÄÀÑÿŸÒò#›hœhÌìÞ{¡ö%Ér/âT™qD£({êòâ¥l'5˜‹sŽmà OÏPb®¿¿B¼,ï\•œ'êbÉ=±ôd8NrèêÈÊÅy€‹Ÿê¸ú¡tBêô‡oá5ä®9¥x‰cÈ3n’@¿@ü.ÆŽ†c§Mèñ9[«BälÁwØý±Åò Äþ U&€ŸA—øBÿÄ$~ùzoÞÿz’¿Œ;V¿ 8¾ûÉä?÷‚€þûÈ#Üÿ@ÁrßÄ(€š@Xÿ÷¯Mÿè+óõ‡Ÿ`ÿ£¼Ú@¨“Ã(ËðC¥Q¯¿ÄRîB*#8Æ÷`x6ÎUP…F-¬„9Ý©ˆÏÍ‘n¡”ÈÝ+6|“dES_VÑ’D¸Ðù(˜tÞµm|Þ` žÞÎÀñ=¤(ø ƒOˆ¦S³‚êï Úß²êµU¬Ž;˜D÷Y(&˜{U*ñí”Ä3Ûƒ§#‡>ñ²üËà3 ~ü5‰‘ÖJ‚Y Oœ¹¶a¶L©þàlß`ËþK=éë”W²“WÏ%¹ŸÅj*vœÇà0¡¦–•h %SšvøZ ÔDY©Dõ¿†o{êì8E܈Øèù‹rR±Œ¼Àノ•Šá ÁäÞD >W¶ó±æñnÏ% ˜þGÞW>§Lh®ÇÆÑüü—/­o†×6«Šf‘€®ªû÷Mµr²ÂNoÆ–¾a2%ðÇiï=M¬FŠ±Ú ¥›) Ô½·×ÞëÅúÀŨÑÖvvGLí÷s÷™^iŽ",¾(iªêÉÏ–ÆA‡¡ÿ}ä± ÍÖ² 1œfðÀ_Ì"P-ØÙ>:dexœ«Ÿ‰’} EÁ42X4"Zõ²¿€b Jå[‘³kRU3ô2gž­´G WTb&꣪‘=çt¯ˆ7”Ë<Þž"ÂJ ó“§k¹Ot}c’BxHòbötÿ\©xÏRtMšSæÁ¿x/¾Gv?³@T–‰îBZ¬)ª(`¼.4)%]1 /¼\7}»Uã) 53ïÃÕ\{ÌÔ6òÎ(Û¢O­ªSa¼]ßÌÞÜÁ¡«p®¼p?=…X¿›,/ÓÍÙû1Ei'»Öm0 QWƒifý³Nšb檦ÀÞ™Y“ÂOÕ©¢V¥Ÿâ~!¡m]”¹(®½"›ž™|D™Uªb;nüÌm.)åúôDm‘Ûè)æþ’ÛØÿÁÇ¥rî-Û=#Ü5 YGE³_ÙÌT,Æ8¹.\KED7~—;VBsgÞJ=ô©fYQX‰ÐÌ*Ë'6<ED‰â7¦w±Nåè°Îl †OáGp³éz#Ed1$˜ ü†Z–¢ôáH”Ƕݪrsc›¥Ÿ\$D6rÄmuØø@£(ÕàåMá~ ãÊþªƒ²c¨Au*锵ʂz5úÊlÌÑ®r„KÄõÚ1J`JðXÔx63Þ¢`Þð,´å/´ûYŠ+ˆÐ‘ÇY˜9Êt=¼Œ¨çhOþÕÿ`X€À,ƒ¾ñ@‚–•$él‹ÁÕ†ÒJÕÿ²íŒ³»pØ9×Ǩ_j;`œð&/£ªµü¯´M€¸(J¿J rg:cTf4dß}C;›œëVâmý=×Ö·åM"BûåKƒŸ–E ¸™)dGC&ZJ€ÊÏém˜hc®b2Ó††–§¨ØÍ6­ìþª·­ê¾"­òÉb›.Õõùãòè2vKÜ3&S΃b¹³ß+£0#ÝOf8ål‚›¥V2xN”YTq`n™YÅVá:#²–?;«;ü&éXÅLKEGÙˆh;DX¬ØÑÏIÛ´ƒù™´j:0ýÐíÓ–‘”­Ì”àô±Ì÷aM—1'qœ»Fõ2œ7røë¨ùŠr¶­§[Ë]y¶½>5}q#4¥‘–ÙXþˆÞÛ(÷}çý«S½ì“ؘUjñPÑ’Íuz eDpf[« dT44KŠÒó¹bËÃq|áÚ¤0àûk]!TÓ=‡e‘uæx×öÝ9$—˜ aÈ¥ `fô‘ØYæ„I)Âg¦Y©(é|1©PÐK/ì㈩ʛâ e)ËÂÌ:ýı?ÝB3‚®®O«ïŠBÊ}ÛÇo«ÇÇ-To®¯@Ù´¨´9ÁÍ Pm_6N8ªzå3È£Žœ^EŠ xsŒùÇü_u<¢qb•<{¯Ž°wèÕ³XqÐÎjK›º˜¥Mš[<ƒ´Ž¼á¯¡ëÁÃà™hvƒˆÖ L§Ažõ*€í\”>ÁÿÍ6Ug<†#1å@Û‘‹H×µ®¥²–RöÞ¥úrqzt«`Ñòè[Û8t–¼j=ë!+|š¡ôŽ„«`˜{8ñï7å‚uˆ6¡*‰Äÿ^rï#jqŸh¼RŒfûS…ª²)0¨®ÈGm>/Òsz(º–êÊ?f}b÷ǨƸàYLM}!»ÚÇ.j!€ G¶«'A1åÐ!†õ„’æþÁŠ#yo[ Y+nÃ…Lâ×,lÌœ vó‘(á©bF š”"û^,2B<É«Ñ-ǘhÛn $÷Š”CG;ý()®Ñ*zGÌÕ½ùñq¦™{çªü¼{TŠjôî¿ÙÌŒÈqXS½i"¼·é¥»É9‡cCê"¡™}f½‡Fí>–IÀ»7¹yªÅ~Ò ²°.ŠüƒTÞå‚äà×ÄQ£ÀÈE"šžHRGfÏ3ÕÜU Çût¦qçÎîÖC¢+Ón뜔µ„&–âÿí®†Þƒü–Ѿl;‰ÉQ$§Ty$õu¹èȺdÅKùG»Vë'â ²~£‰g‡Û¬š^˜OJ:2Ÿã«€ªÑTðK†Ë•’Ú"šÊ¶Ý¾<û[\=¶úDrßr]ê ø®l¼Û†ñ¹¿§¾Hj(®jE?–ÇG›‰Â…uRÚ9‹v:´Ó¥m¸¼Fé$\#¡ºÄÙLDìj)ôVúšŒ¡ƒ¢9Ï!.Fi»J­DA²ë<¹ŠÊejåýö3uðq{©·v'†VH¸ OòGöó£Û^3 °£ëH{-.0sv,™ÒLA¹Ò¡] ¦áƒ±æuÝV陃º5qƒc˜è·™.ů³RDGx¹‡/ÄCk4;0‚#%!k‚œ«[ÏùOSÕ;Å`(ýÑ‘èßµ»% wÎ[l„ÙN¨ z ð £í§8ËN€BðßšÞã±RÑG‰nÛûŽ€äšÙÛ=µÏ6ÜSW=ÍíUÐ2¤mT¹ïç)8À 6òp²Lù#ì¤øj<ÌʇäCg°.ߢå8yõó„4”€|‰C¾5ï?„ô8? &-ç[0õ˜Ãƒ@·_”|ÿò3úàù­ÿàÿóg7Àì·€SýB™J¤IWd¦c«U©œŠÜéô€Ë1cHw a=í©…·«'¿é;#Jx4•©{—J–0ìÄg!i l„¨yB«lÁ‚€q0W¦ß€¡Ýe—qÔÈX´hú¤du~³‚…Y)•k¾‘¨°uUˆ×'šDñÐyrR|?ÑZˆ±œËµ´pwtä1œ(OsÖÈqÃjã/cØDÒ%PôKâU¨›HæQV<4Îi©(n>ö4Vç+j«G¹FŠÝ°ªŸ>³}õþ»ö‚Gãngòª><O€¥;ñîê ýl%-yª¾£ `H ž“ÊÔæcHLÙí9ÖsÖ=Çâ±ÿ9iÉ[üËÍ/mêOŠá’ 6[´•JÆõ¨ ¶knäytÔ{àø&R&¿hX04zoSX‡…¾ ÿãTœ`¾•á…‘¢qÜ~5˃û”†uÇ ¥ª™a<ϱõ—g¼@t$À²Ã×sßJÑìkdžà›¢Ëê3ƒK-¡Kwt!ŽÀ¹@t“x¨“XUÿéïÓ„Ku‹£¡©7<º²Xå¢Í=¦}UQ½ØeÀé_‘<¥m6º=>q\–»·l u¼2õZå(İgC?PZ椃ÅË@UÓ˜NÖŸ;ú&îú´Œj–åJ6²â–7»'@£–ß(©š5UVCm5{ZàÑYLJàG3jæÔj2÷½ÍüCxtß0:4U‘+; ¢¥pbYMÈrf5Ìæ¦Ñ%6‡¨2Ðÿ¼7=j®ñ«V¢¬ÞipU‡•Fæyè™úŒ :·YWgÔKM´?•É# W‡€ÅÓ¤‘j“ÑQY»a”µ ך9Ñ~Æ^£!¬V‹ÝdÈMiÕúÓnÆËçÆfàÓnG¿þS½£!g…èJd—"]Þ­”ê¸Xñl&ܨ«œëƒ¿M"3¼1± ˜”`d¢TDèl8Yàf¢/“ãÌïwÊlS¬ù*ïH¯xàbçW]#P½Ÿi 55ŒY¹mÓT¨Â{4䦆ƒ¶‚òc•Âj^#Dgxyc©˜Ý–L1=T/š ÌЕ…ÒKtï£aLÙ^÷ŠéPÇs"ºî'Ku»Â}iü²Ð³Û‚ZKÈÏ£K?Qµ€X Í…GçG±—¨Sè%e<-…xÎBK±œd§wưOgPnpÓ>?¹„òáA\5»C.ÅÓé4‘ÐDõ-â+-›úÑÒ¥ÙôÓ☕X>ª üåLçÑC)‚{çq}G[ä›~ ÞJ³˜K7h$·Ý{«èRïD•*ïRghGE%{5wÂ÷‘9˜Ù©¨É–ù„Ve­O+‡@a:N)÷ž-ŽY…¶÷½E„ׂê2Þ%ÐV‰X¡29 ” ÷—!äHm—„„Ç×|“²ñ”³ð<|³ðh0̈vn’ÆëCýp©±Ï{¯”¶ :Ê?ÏnÙ.ÔÑ…X¸†½ª‹4«hüÞ¸íÓ¶¯r¾zÊ©ªâÞ_”ìlï©ðö‰ê+õNˆìד©*áë eOmEw«×<¯ÇK±Aׯú¬ñÁEp©Ü².¡ØJµH•t½ƒI83/‘•å »Û€3M¶Á…;µ¼( IDATj!i§Š,ê܆‡?Ùk)ÙC»Ç¡‹š94OEKúõÃGˆ¥F;´·((¬¨Ã"â JÞ”[äªÉ&ºTzÄMLM»2Å| D¾öŽA¹`n˜nOáƒ{€1.¢±Li÷ nsSë>¨^ëç®=Å7Ögy$dAe¨ozºÑ!§¬ˆÂQæäTÅ”»xÈõŸN`ÛiÙ&å'£íT}*`N Ø«Õ+©˜Œ3:K™§¨õ(_øÒÛÞI¼Fé—XÇ™p+eçeñ¬¹m’—ß“_¯xŠ!!ä¡Õ“fKžòþ7`>KHËÿ«¨îM®ÞBã§ñÿ§¸(¿„Ý߀–Þ–Eà¿záNÐûšøEWï+Þû×8üŒƒàŸäþ¤ÿòÿ.RO†S²Poˆ¬“{á›[÷G­×?ç”þ?zð^ûí‡äÔ w?p«ni™l9èE˜PGŒŒççhÌ¥ˆèÓrØ.3îß+sUk‰ïq\Ÿ“ýh½Õt²/$·ØscãYгöDÞ !/{Xñ8@åy­V6Ãõ"ñ)¬¾H‹pyÍDž šçr´¨°òFÍrŒÞ;²„(-À÷LVÜyœªñ´l¸·¡M¶¯íiòÂÙPÀ{ a´=$w+Fùñ uîÎ8õ÷@tÍv5@M[3ó´Ì…¹£7®V‹×Ü®µ«Ÿˆ"R÷V/„~uRRŽ`ájÌLQF$¥vÝVm¥‰Bg*ç‘ ±5šog(«Éý·©<¿Ti¥ÿDÓó.À3¼ï±@¡Ï _ÜÇôYç¹okNFäUàøÈ @D–ë¼ZÑ)^²Åu-]ëÞw¤ü·Ð˜YÅУƒ˜¿Â>MVw÷†èyª – œ’‘ç#Õÿ5ˇӓSÚ†®dšGfP@1bQN‚ùÊ/E4p€©‚ˆäLö‘™)éÇí„S˜A„ªÕÉY’Bi-Ô¸¯Ó±˜òGhã,”Õߊfì©cœ¦XÎ,=û2dˆ\ò]VñBºC0©9 ‹äÆÄœb•Sö.¼¼n—~lô pÁU~óˆÄ¬ô¤ç÷#…ˆY߷޵CCJìMzݵV€¡p¤‚µ§ÓÑ¥ÃÚP]P'q?Ä⛺¸3ª0w x¢äá-~ó«öÝ é°ÏÚrDL¸ô€þM¢3•cfÆL<.¡$FeµŒD©.£Ìë­¨-+NÙÙg)OBXûÖã‰{¥!®%v?ó¸¬Üïçód¿$+$æÒýEÕ2f©õÕ•ZºÇx…Qeé?–ÏÚ¼&ÝA!Qµ·òá0rÛ .YP…‰Êv+™k÷㡪ñ@3“(6e±2ÌeA·Ð#â‘ñð ÝbPQë#q,ÄLþvô7úïŸms Ú? d±FOTÇ äô,©^“Ê<(—§÷-íÜ69œ¼ [Bì¼¢f0:lHîM`ÝÁûÈmv­è-á/¶…Ù P@™aëˆaW°Àãn<ÍBàŸÚÕYz•¤U{eK`ô>õÛì÷€ÌÞÌõ€c vy ×Ùžê· ¶-§´Tg–¢{Ñ2Þ«\ ½S‰Y¨Ž4á’-ªˆ|š˜‰™inc<]‡eî‹?ŠMXT¹ucϼˆ}då1Ó̃Rå‚` Ýäš]ŽÑan’´Ö4p §¤«¬¤|ù4Ú*8oË"UÄ,8£k˜”{‡â!ø\i·™zT£t¥³'}{’=Ens’W3MÍê¹3¹Á·QÁòpù§p-#j­¦ x\,I(Í)´˜BL¶ÄLB'xıµþ×Mƒ5=Û`šY+*Uo‹ûŽJ¶ÕüÄp€/A A73š—(;r·ܤzJ.ÞKi| Ä“éFûh0U^¾¬è‰œ]öÐ'Àº «SÁÜt?7½.‹òʽŒÐMv;Ò굳ʤèÅblo!WÏþ‚ðƒ ‘Ôûä-š)&r©?ÈcÂNìÿ5b‰~(n‹([[l\:ƱÓ9Œd<\ NÁ°Öƒ—…ṶέNµ„ìæh´«AÖ"§‰²TÄ\I´Þ†´H…È‚|Ý$D“{s­À|¾R„ÆQ¦á‘Êê=ìóèáÿW¡ª¢Yìæì“Ö졨°Ý¨p\i{BoåõÃÆˆzh Ÿ¡öúùß+š³Í6öL÷ä§HÓ²ÿñWT3¼|®»pŸKhȯUGž¤I¥Xdr„ï<âXÞ=ótüø«òCõ=¦C¿¿F“§ “‡–°É±Gñ«¤ú—Ð2ß⨃š¨ºÎ_ÃÈšz‡²Oëí‹ÌßaÝ_vüY`>~÷•Ô¿€Ýß¼GHùÖð×üŸ#€ßˆàßèSqØÞðX¯bÿ·ßÛ?ðb½u.$¾oâ~õŒZ¬Ì©‹müHœæ@G¿ÉèCÛ²ã×âÑe%ôœãT‡zþIB†…²ôï¨T rSÂRàâF‹L½ð–—îv³e¬°ZÈÚP8tjj c%éX©‚Ä_Ø[3ì®7Ƭ»Ì@‘ôZ✺ˆ60vÁ£‹-†µ1„Ä –X~`ñ'/Ìì7zTä´ ‚)õ#½EÐvåœå“ÝÙTêõ'­£a»›ï=AïéCÈ’WxJÈó,À€î%—Y¦0놅N Z'ŒèÚIÅ<”UC#†‡ý<‡L•gÔù¡ï!ÖZD’¢ò€ðåõdúÕfüF„‹<Áó^<¤ h….Õµ”„™=\ 4š™tû ™Þ\Îß”R bŸ¨AAv˜Äs[wß‘?ñßáJúH&â9µæJ9û¸›ÆáW´ŠÝàꙨΧÏlpÆÿôÍM‘ë`Þ{PU†àtipÈ'¢^ŠM.T¨ fJ˜8‹Ð«+ëg•#øÙ_l£™ UŸÂz#Ÿ»,pø%Œßp<‘óï)#È2¶ªfµ‡\È„"kAE)4Õôb%½±QhûŽÎfE"jõ„fÈÓh¶¤@U—GTd°8×Ò…åÚ*ºr–žá1•,YT\éãýR\P,¨ªÍæF ûn_‚¼„rC/¸&ÁxÜdªk¢Ú4ƒˆIx4Éð¼ô±©ù;‹Àgk%Ed…ÕÊËÃÜ/xÆ.U1ù/»ôÆƒÌ S>w)5æˆ|’k\ÎúL¨Ù¶!+ÀQ’$´½½,ü3[é½™\ ŽXhvhû¤„x+2x–´Ï…žÈuKgûg$yo\#˜b÷ˆ»mŒÞÔÇqÕBíw† o©^'¯L':A„êÛÛÏÈK#æ8ZƒKC„gUFÎIœµ1G@W¦ïç:&Gnpmf2jÎUg:Y™.An`%¡"Ùw§\F»i€G\É6Òàeßñ¸0Š&R  Ô…%¼ïˆÒLéËzí¨èN"«¸ßÀó4 ˾¸µÈ\î®ÖúsW6V•Cüc©QYÕ‘žÒ¥²¼Å¶ H%Ã\JXѾ  Ëé´äŒ/­òs’²]WŸ¢½p¥š9ó:2ì½i™g°M6Ýžó±Ô͆ÚBD²w÷¶$*–¦ÄD ‹Ð¯ÆW¯ËiÔ5R£ T r¥^ ,ÐN©"C©^“Ï.£o{ióë{AÝçgÊEámÙQÕÞHâ¶°§(2Œ©¦+ vñš@.•OÊ¥wTKÍ•6²PýO¬Iæq©AP.‚ªX—ÈMàCåw_X½ßÇ”fŽâûçÚ9üécŠP°dTr¥ÿÎ¥Æ5â‘tR“Aú?E.‘­]c­u°S}y¨Û.¢C·êøa¸ŽoÌ;¹. eÈ]´`»ÎN£…½IÈäI‡ÉŠlßÃ…|õ d„º»çíoc,ñéZqô-"W/9 Ù»¥Ã‘“ë“×Ú{®@»]}"¥Sï"Ä‚š¦ö§3‡"a~ŵÊÜË¿DËÔ2ê«"Ë<.Ê&2œ&z7-¿wîÌ|ʰ«i÷F'V‡ðfW•QúÎ-P53UD±-N¸Úcú>.~Þ]-ôž¨¹ò–ò‹ƒãDÞSaFvk_¹GU#S(žb¯gh?®Ç¨ŠR¼ˆËvÛh)/B}”Ô Q¤“‹­ôŒô.“ˆ™&8ÆÙÆ9ŽiË©M$U£­|žuÝe‹G‚P­;E–ÀÝ)Åñ¤î8W@Þ´œŠ±3û=S‚G±:vÀßB'þ `Ž0 yy_§æïPý d AAv–/Ö­÷Fqø=ˆZcC%X‰/‘ûôù¥Œžßùü”üe™ßÏQj~ÓýûbÉ™OÀŽ-ê‡Wò;Šâ eü¯ügÜk¨(­™½à]ì^ž#|‘$ïØ†ÿtÈ™Pô² üÌÍR ßô”;YFÞHjŸ=hô6E¸?¦¯ÒÇDu$òr`okL]B¨áªÀ™š@ÔD „Á0 P ½ZiSš¯Ý—Я¡ö Ä,wØÐ5æo?`t·Íö—JÀ±™DïLÆwKG U&u—îΆaçüªåØc±›P(s¢Üyä*OÀ4伕&¤5Ñ•ƒPð7A²W™¯õ³<¤^ÍâV^%qÁù»{†h^#²c¿CQLYwü6R7r—+Œjúø&úB¶ÏáPNM±ž>´ø:³9Ì,å¾Ûg\p-WANBÚ’¦Ì>ž©NH^!©Ë©”(Áz*5ë"Þ˜Ù»Íû¼jWº Ï2€¹ â $”‡ó•z7{ez̼;R‚X9ÖÒ¥K¯K ÛlÖ(dm@7kfVfú¹ 2ð•¥I~³ý©í©å9õ— ÙkÈ BUÕ`4{MCžßèÿ¬«`ŸÏ]Ë•ºèâõ";7£3K| _•>÷'ÂÓmýMò&-ZÚÁÛ|!И¢nnÛb3;2¥…•Oå·?«Ü\ mÍ`r*­Q3!Í‹gYU&pÄ%™vïí˜KØYà™”{¹G˜ÏŽz•Öèq¨ñ%J1ª ŒÒDdòòh“öç@BÓ{i±ŠóïðºÃ&.gà¼6C †ÀáMS©ÀzGØ•ìöû²ƒz=æÞ^KÕåH¸±PgÚħ)ÞûÖ¥£ñ:R×]¦ïÁ踠Ðú{TóÞ 5þp~KU*p˜K`ÒŒfâ{s²~YöÂ,QáAÔÒ: ”Æ*|¡³¶·7væ6#³ªÊ Èo€sjKhwÄð1®¼Ã³úõ¡¨Ë‹É û«ìÆhOdçXHªÌÄç•›kÄ å¦ËV-®ì¤*ö(eBÅ?e;JˆƒtÉñ>'j´Ð_a†‡Q±¨[Œ;Á@ŽâúLŒñ+òi3^=š'N~墼•¡"%Ò¸—¦ Yé/®ôº[@˜k2û.ç=@Wô²J¯Ò’î),4XRí8Ra<–awfÊj D\aj;ÔĈ  ÓGw¢Š‡Á2Ùæê·å¨;Ö,@BÄ»D&²s{2ÌÁã‹{¿°Z³æoËs‰¼§‰º)‚]Κã!„¥"Ê{‹ß„1汃ºÞÂsuº_€¨„Ç-ï‘Ï"øL.…˜<ðáKäs$ñ¥ÎqÆÐìKjŠät|ft¢û¨@©›hE ±|RŒž.j‚Y+FÞ¤æ"ŠÄ8Ô²™±Ë<›Eêí,¦téù¬©«¥%ÑŠ8÷g±ÈÐUB°TUuïûcëVX®ëUpt FÚ#˜hËZ‡–Èy|?yïœÉÏ«f¿xɸÅEÿ3ÇF0cò_VFV,ÉÓBL›×‘Ï-C]È7Bt䬚úE0>©Ï«qLH($f еë_`¿1Üq8„JjÔÒV¾ÖL<­Úʇ›~ *ã -<<ïžy{·6}¢~àžç÷ªóŸÈ÷9mì§÷â„`ÿVÊ'Ó~·+âžo™?ûçüýÊðÀ‰ñã—Á7¾„ð·*ù§Ïæ_ʼ oâk†ÿ /yiþõæ?òƒÏa˜¾ç²Fê4Het²Œ›£ým4Iƒæb•rg:¾Q½ÑWs¨k"!…GüºE­CûX¤C þyV4˜ù‰!¦¶ŸW8߃ٯ5ZjUg´ãrbaÖR—Á-Ž7*í=çÍÄz„ ·E§NØLN;à`lDÀëNÑXc[ ÍèÎGZ>°,ÝlCáü¬‹¦½œ3zÅwrÊÅØ=;'+o¼ÕëøŽP*9nîÙM6 »éímrüÎt•´¬·ÃÊ´£…âqãlBNoùhXµÂëçI®_ ‡h+¹¢:ϯg˜]•°É"òÍÅcG8VC'îοs6ô²©‘Ñ ¬ÏjäíÆf:Rì…^•qˆˆ_ã€$ú¥EàQä(ÍŒ²KŸãà§¡kF‰UÍÌö¶µÀå©4$_”ã/Çûé&• ð=—€3GÎGÑ 33rN¢¤€ž½0¤¤Gvÿë!¸ép6¡ ‡_ Ø«¢À6£ˆ­µT=Íb^‘òœA=e#}Lk@ Bã['GËpÿT•=>þ°vLbEX¥-#·ÌªÅH­<"4ô—¢yŒ¯OciÔ©¿ËšX¯¥aâú‘¨ë©ß²ª& ]•™Ÿdw²ŽÉ¹.SEOÿ+VýÁĵTU ÇâºTHnƒob²)Ûèç/4–»éÃK¸De :±¦«ˆ`iˆ‹58Jˆ)-ÃC Qo¹˜|Þ"¿}„6Î3Ÿüd‹ [OïÞRPD¡$·vÙ @Q{ã\ÈΦBÛÔKÑîíws}ýÂò¨[‡õ$åÛ~èOí^Ô׃ܵ×2\Õ¡¨Uƒªk}©Œ^ †Û8Ì¥P«ÖŒ›\™ÍÛÎæð©[îW1{ 5Á’½yW帣BÕõ± *Ûà¤Úub;¸IŹ}Ùž[‡ñW(K°¬+UªÀ\´ªX·R³0_V£³’å?q_€ï¦&vÓ;×`E¼Kùª‚–J¦g†øñ¿Û鳃Ù]ÉX(]0SùÑqrÛÎ)Í›¨~V*“2‰%r›kÌMŽ4³–[Œ)D{·˜ÃàæRQ쑉~­ëcá¶]{¥³hÔHz.‘iÏGÔŽ'ƒ¢‘*,U¸žtzθ·Q\Kœ#IÔu‰Þ²i"†ðåbI¡ÙV}rú Р¸ÿ.˲ßáË œÌø´ð)8eÍþÙ̸O¬”a`…t&U–ãŒS•SÁþ0™dÀƒ¼„ÜûŸHXìú¯œbTz亜…YS1/&䎆 ííã(‹B§-FåÈrœ¹µ8ŸO$g¬¬ƒÅA]pe±Œšð¦}˜R™;O¸TyTEu=¯@–๫ ˆLðƒD ¢dp;‡ª†/™¯³m+͵&fžØÃ§8D \vùôÖ;¯ ¬zÀzÚÔPœÅŽìƒÉJ„_!aUE8Û’mÄTû„£–UPj(¼‡jÅAW.YRmۮ îT`j¤.oØÐÃ$pêre¥|ÜŸèíåÕùÐÝlSGê ®S¸-‚;=ð SCÓO¹N(4}éÏ¡Š 7¡YƒNmÍ[éß=+goÁöm=,ኪØëG¦‰+t½-7º‚Ù„ ­nydÏåùUQ<$C›Vžp™ùy“‰UôC¢[L,ó0ÍÛ€¡Ú§Ë‚}u|±gŽˆÌÓzé œ•¹¥ŸÁ±|éò„€ °óGÂGØM_˜hð¬øÂ~øðÚ.Ë#îœï?…?Q»ØpEüÿ•tý‘ÉÎ'ªëÓdÔÛÄü߀¥ß3?ÁN¿þÑVBÿø=¾f*ɯ8€¿ye”þ½ú–|û4rw¸äOÞRÿ@^|GòwüÆÈz^ž|Ø}­Ô©±;©ý¦íL,hÉÛé2”¡6w*iy L”V4J¸½ S%,¤  ká$‰5Ÿ²—&gj¹ÁE—pSVf¡;ìK|½"‹}cß®£Êqì@Ûi†Hùßy˜¶†‡^/§ ¡8ƒÂ¢cF€MBØ,ÔÁK½¥’x|c.÷éß–ç¼mÅJô2ÒÏ~:u(Çwãй?A¤Õ|Š~Ùé2cSà ,’‘ɃŽ7à¸ÿ:ò@ÂM,££´¼Žˆ_1«>‡jž‰Ð¡R³†(u×y³[Ží¨‘®Ñüá”gæTå¿Æè—y:ŽÇúÉËãY}¤ž†0ÏfÉÄž‡3cxþ˜p„ˆ¼Î\¥D¤½{Ïoê¯ÿç4/u©®Î{9Cåi.½ÇIUô6ÛfWâ,Ŷüÿ@ Ø2Ó.×MX…Òü[SZà.Gùòå3ËD]®<iÆ•}¿Y3·€¿"20¯òù!§»;ëÒ›ª~ÎF²âÛæ_ ˆÀbÈ+–9e ´f PUYáÿr÷nYŽK’ ˆš«÷¿Ã™ŸÙÂ4ÃM¥?ôaê"“ä­êêÛ<§xn%3€ÃÝLMž–‘ò-üLI5E?é]z,y¼Ñ£”Ì šêÖ†.‡'®R=>KâY³ºjµ~õû Û»+ÛÛÙ˲çƒ#•þ¦(¨ÂU**¬ŠòXºn`Ū}ì[N f‹¼K¶Ýep¸»ö·Û\ïà†Ö`…q€Ç-?¥3­ÄŠ»!|ÆËót7³ä1Ûcf:÷u<Ÿqc@¸®•×Àóå¬ౕ=GNYúÍ3 ¶Â’bp9·g#ó$Õ&ÁËÙ7ÜÀE¾ÌÕ7œ‡ãíÄhì8¬1ÑT„çSkç'}àH1{›‘?.^ vÆ¢ÇBgã[b •QËcÐ?_™_ƒm8/Ú}µù¨¾U^ˆ Rçðj+—Í 4ãZøXònÏyFp×í›¶Ö²¯ q­EÜ÷ö­‰ ·»Àe ìÛÝIîpOVgc¸'“*«’phj½:ãSû²(wÁâÖHXXî®U.½ [ù¹kOâ¾-õL’+=KÃnµÓ}¯ô†Ï‘®±Æìãà`Ýè,ÍÊ\\öµ–¢¼5ûH‚É cw!RÆxU¹ÜŸcžÕ]Ð4Šss°YVÊ9v4L¶Á‹%Í5#wKÓZþZÌÚÍ÷HŽ-SX”éêD 5u â<Ò5zúøˆCbL­YP§„¡¹óq]±Kò?÷­Ã2"ò¤ª'CÉ–þÞ¬¨³@µ¶³z³3¡ä®k3ìˆ@Òv§­5|Ëã}kGÌýÔJ/6Æî¶ÄH€™>Â"POç(—öÖ×ÊÁQv“Ú;´€+î6I›g8­°zjÑ8íµG¯@Wbÿº·°÷u…««P‰kÅèžG¥XÑ®"_góü””e*³p».9*'êKºKÆÔ ¼÷nßxÏBZd¬zå”p»]³G䚢!£Só<_bUeÛN„ïüš7Ã"𙕋&¬v"”:7 ,Äø ôgr‡$­¬5°=3}‘•%Ä¡bµ¢=ššLð­ †%l¤ï©Ïn»Èf¯8uSâÖÙ<[ÑgÇbûêç@7¤ø2næA[U|tâçîÖÛJ9R²G|‚ŠÞ §ÑÆL$wRª¯{ïÄ뉙ËgÖyÕ $'¾·—ÜÎÙMÃÏà —QÛ|ÈË丷¯E^ªޤË1 w."½Œÿù]3Á#˜®­åy+I;‡yÞOaŽ´ûžwÙYT'ƒŸ#+ˆ-­ÃçÀÁŽ(¡Âr¢´£…S©ºÔ¼É¢Ï¹ÿLûÙÿˆ‚Fs|Û;I§<±Ýðu2o¨/—.ûŸV‹zå‘TÍÆ"§vúQ‘Îhè¨Õ;: |¤8Û8d ašl?GZò¨¦_ IDATá=ïet×¼žó‡½ÐóIŒˆ?k.?yv¾ÑïàçŸ8O? 'OøöõƒúøÕÕ0“hGDüA$÷ïyŠ_ º¥¥WŸ9€ŸY|¢Cþ¡{@¿àЉuÿRЄÀ¿iÐK’óŒ+ù ßç  >ý{]g,8øn•ÑïÛ€_á§ú&LÃH/iùhùxiH?ª³ß»ºRYŠè¬ÓÿDEZn„Þ?°ê4‹"#/NL&8òQ™æ ¥M['“G3 =F÷Ýûieìø‰Ë«·ÕŠSÓóNÓ£zº÷83&/l?Íaâ(6”_ZÏ <=šÒZ Q°PoÒK'¤QýÛ)ä¯ë½¸äœƒO([s$‹H™Þžçr,Žh9ù=ÛdÏ˪’-“¢¬o߯”>˜†°t" 8¤N…§«%ºãœÆá*¦*2Ëfà8XÝR³_™Ý-6›“üÈåïhdŒïÄŒø|:Ýq Ö ÁÏКGÓÈe:Âü6˜\W­cfÏ1|¼wD=¥çø4ˆ<§‰G'öÇ­ôñË/[é* sCsy’^Yèé~öt«*Ý+–ùAüó°Ã÷{ÿƒX¢T }ïòùñ ½Ù<Ú÷ƶßq:Ä‘xø¤CÒ!©ÖošÊWA/ L`Ý£×û–ÑRQÊ×nÔñfÄ)Ÿ éfyœëá#H›©zyFß²Ôš+ !?%oá‚z*æÄÇÁct?¿ <ã#¤ˆ,¼«Esµ8æ·lCý£ŠÚ5í×{^4c„l×´Y±Ì%èï‡/ ý12qMNY|%E™‹±žZ¶œ@ZEŽI–êÂ] [ñ(]­pÑâ|ëÀV6{®Š`]§ÿ=ãÚ«â2Á˜‘ÂP'7M´¢eh4ønùûñ;DC2ï¶™*¯Æ5´£JÒCRO—õ¾™ r¥ 1Û θ`3 üU´Ë^`•Š vj† ¿š!:NÝi¤ÄQÖår¸sÅÉ6¿*á4žDÓ³? ç’ç®êë¬!ÌÞÓ´œPÇå„ä°×Š@l/p»)Zp³˜à‘-ôÒ×5u4~-Í—.ÜÿtºéNO6ü?°‚«ŒõíÏï›uå\ mw1ÃúýhH™¶mb¥>„.cLyßðG´qÁ”f+€ÿí.8³œשּׂ€“«6:LW‚»ï€æý ‹F\ÄN»G*c¯…(»F•ÁãVƒõzpÜÂ"·æ^‘XÕ™ÂÙE‘™çžÒÆ×+`éz3¶Š‹Ål{Õ„À"œ,r}oà:º÷´qL/Ôã+?Qð'ܘ+-Š–aëUÇ% Tñôxâi°$2+-uÕ•â¹Ê³çF´ÕŒÞC¶œ5S™Ã5{f2BîJKsbYðµ ëkQ ÷qqÕÄàñþ=©[땸±—œ O@wO›yÒax< ¾ AÇ펵xÙü.%{‡Íø€ÑkÈ©)Ô«ì«×8/ ðzœMÜŽËå”ä·ŽC£ûä¡aÕ¡â-וŒ%dµ´ ŠÊï'cAIÎFÉPpì92cØŒ^×h+þùvW“ô<˘fySQÿbЮÊÅ5«héœ<Éœà9£UáÖAãÞú¾õõf•mX£03¾?&Ôñõ ö.@Ì"l _›.ÝsÂÉVaU:À¶‡¤*!Sóá²ËæYÓóÿdËDEÛx²·¢z9;ÞÓÚ!âÇñ>6¬Ž;f@ËåÉàœ²šÈÏ£ÍJ1]Å­‡d$Þþ–_ 5Ž)‚uz ÍYŽÜøãCvây%/Ç0íƒ@Ä ÜÊÅUòfL W…ÂAߎ’uŠ4,\Â{Xƒ8qnÛ³Ž™G1ÁX5â©'÷H„GeùË~«µ ¬‹Mr1 ÃÍ2å-ˆô®Ö¿{LPÚáËV¿“|1OVßkGg¦÷òHµO·ÊÞ÷æuý‘5ñÌŸd²˜T‡¨Å ÎR!\{×þgkô6·3îpVicn»ä  =ó4> N†ç\÷’×¼<ºžVýê$‹j®ãEÌÉ­«øF鮸8‹ê-…_tüxI¹«;g€jC)ñzDúLÞ)B¿ÑÄÏ7HþSóCjûóàó9áyž€ŠÎ~àÃçÒçð YýøÄºð!¥èoPoòí¥­>€Ñ"ì Õ×?·¿Æ¤ØÏ)òßãK­Š*ãý°ð寸g˜ñüÿÿ}ƒ€p*£^õ*x¥˜ôDñ^‹¶ù»[‰'Xê¿åÿ y4þý—|,SD<âÙÎcPs±W¤y$ Òª (”î!šwÀ"{]©úwÀè;T;¯=’×Õø–YÑ¢ìð«™ô²ƒ¨ÏЊ´Qy*=S¦F?ß £Äï9mùñáT7WÔqjÙ ”\ÀæZyó¸ºý'ÊÔ)f’Wެ^v¶õ­^4»…®ìÁ'dF>nÎýà hnß|l݇5™:¡=#QŽƒˆÊßî°Ú ý)#EãM-¾˜Ò$=Ír%põ´]bd—¼š$ã§²¥@ri"ç À%&ï§ÊŒ59ÿœ%oiú¶·¼…îÙù´ä}Pǯp<öâ¦i§±`({óTçUŒäC)ƒ¤ðÙÐû0>æÙ$£BôÀáý;wçYSü¶$¦­;?òx3&~¸>|9¿\¹‡<ÛÕ²wtŽäj¦s´’‚^lÈf†ç¯÷rà©•¨_È™o׈H—dÓq.jw@ÂçîO c1`Q°9fÔþ›îî® BðÚ%ÚwZúZo˜äæIòQ][…Œ¨ƒÊÑ=ÊúØ¢ƒ¤+-[/åŒPÿ:EE¨lÆ7gºhW4‘š,/ÓãŸ!9bœ;ÒÆG$hcŒë(?eÙÕq8N%±x¸ÊÅèœÑ¨ÍËøèÁm¸UÈÙ[˜o_×¾è»Rçãy°\œáòú‚ïŽÿÝK Ü ÙÌG1 _Ä{jËG‚ü§ï–6æÅĵbª8ÖŒ¿Zå+íø2ÿW ðÕ NkY-<Ïãsü;ˆU0š‘Yã­Fµ0IÃ/1”þ•X"nØ:êÊ~—N»²ðUæ£~e<¬6•ÂÒCGX1ç>tbÅkC—t‹_i‹wöŸŒ9*x>àÕlÿc‡ò¸ÁåŽ?³Ðç˜Q£ï½ÿùÅåîýÈ/‹ð€êè®KB)ß·§N{õí+åÕ* tŠ‘µk…»Þ ‘®Sïè ÄßÜ# >^&»ÜS ”§'Æ'¹DØ}á"ýiwÈ{• Ù./UÕy:¹B”b‚9ö£·‡(:ð½7-ËØ= ´òÒESn6HEÕõÎ[ì{;O™§U2¥.cjU-3„P~ÆnyÀmäKnQ*%²ÓÁ° ‹‘C¤vkmÁÂ!ÑuÑ%§´g‘·q¹K¹*âˆP2§(‚-ÒÑ©S•ípè'ß?‘[©_À]æG€‹‹”›û~Ø–—á*«»HgöµƒÜ,‚6ÛÛÕUçygµ5¶¢&ýs []6æé¦¸gìÄcSŒ&öec0úx¿ÎBÕ*m ÖÞ÷ö½u]c2®F5½EÒ¦F!3·Ø!éövÒÓË*÷B½7Å’òìšûw÷ô2¸+®{æ…f…üiÚ­qd†È+mÿÕLáõQª8Á{üÇS[ßY‡¸Óíù<·³íît- ¸Z5«LåóÔ]™¬3ƒ›€"ùgÑ®(³é•ôZ.ÕD`FÐ¥}çV „<d|ÖÂE»ítäYí-[$¶ïôf¼”Ã×áôË:û®è‚ÔgÐ|ÐÓ ‘Ë Ffb‚a,´ÛuÅÄk .‡5æ<•ç&\ÄŸ)Á`¶"í&ø¾­¿%—þÈêx¹{Ñc7ß;ne+Þ.ÏùÅì²ò?È蜌vܽ!q§Ý™)™j"Ë ~Ѩ-]Ã’S51Q˜…òʨ߼oÃÁÓæ8¹ïíi¥-í΃‘E!"Å8ƒÐ†ù‰ îlNÝÛÿüóϸr%9¨4üçì£N5{æˆJJEÿÃÉN"‚³„í€Ù‚Wš%½›Ü[ÖZ‚ûõ¬{¢¤/`R ~ؽ¶ÙšÛäp»·Rj´é&A{ôˆÔXóxLOà’‡5>Ut‰ 3Oá7>â0µç-Ï/ëOpAÂuègIÝß„3UðÐo€SzUùþµÑ;׊ôÖe£ß‚žúÔ™Nï'ZýM̯l’ÞQݯ“I:XûÏxìëw£ÏNþŒÚ“pø[mÝx O´>þx«S?ï«ÿ ðïÞ üþ ÿ;—6É€÷‚~ýõßq•ô>ð“Hâ_ïî  ià9 µ¼¼9€Œ¨µ‡zÓ­V¯þ³ƒ-„Ž‘`¨á2$ÅSVc~ ëB¥ÆÅjcóMŸ*#Ý;|'"Y=¦ã5v ÒÛUëËieW×ËÃtßq†ê9$º¸÷ÖˆlîÀ™6r¶Ùb”Ïä¾Ìg5PeδÍÍB¦9CS:šwŸL熱+¹Æ5ó vÝ›)ǃÝ3j•»~v×Q¥MÐHï†Nò`®Óója8;‘%ÄpÔ33X+mbÈT.aöƒÖ«©­Ï *5„Ίudr8ù1]딇™Œbâ-)oõÓÛÅ*îñtÂ阃ùéÇî7Êéø˜ûE|ÝuJÑ?úOše ªe˜g¨dÀc){¸ ^1údUL/ø->5¼üù‡ÿúº _GP—ÃGjÄ`~Bï3U÷„Ühñ9œ§d9~q%Þg¶~ŽË皟¸j¦¢(…ÛÒ«˜bê)X¯¡<„¨ÓÙVå£Kkmr;v€¹ –s”;©b³ì|³—o½—2l–¾e‹Ë®:€gò³„ºM>b{´YSd€š=Qõ$1ËÄ^Nf•‚¿Ï¨÷\åŽl…Í·½ŽV©à'Ø%3òß§%öóØAŽ)µ¹XVøn Ô¸ªã·J·|‘2Õ‘ìh3Ÿ»}¯ö©øZ!‘-ž.žŠ¾Þf‹_\–ÄÓ`D í×míHHò·’æµs G‹E[a&W‰YˆñHùès]ß÷÷u}­FCl¼ ê_¹™«]®aSÐÅ„{‘©$õ«Š4i¾ž ó]ËÝuû}­¯gŸ{tÿ-™û;!œuÑÀ¦äò+l£Î³ÜÒŠëÁ_2b¥VüOïVÆ……µ­Ú9|‘Ñ?Ç:Ò÷Ñßò/ÇMfžtêí9þ‰’“úKÿ=3o-¼~÷D@È‹Vt{h›¹ÝÃtÂE‘ŸÌ[gK”[ñô±·œ»¡´¬Z‰Þ¦ÒªÅ ê …L >å 63&qê^ó³Üûf5 ºrž5ÓóMµÜo¥¢³ÖEöÐ^U|˜­¸uK˜où-&m-Ëê_uÝ-ã3dèý @QTˆ½ºÑ¤E¦>ÝãgJ¾£UÊa¦bÈ|ß.F+fêV/Œ*ïÓU›çâxž £XâV=Ýô²"vܱF*ºÑÀ-¥á|îd:þJæM¶óÕ,Tró2í¦œåh6xä ¶q·˜Xuååp\Ä ¶wøu›0ƒëÁðŸà¿ó 4Ø~k:ø tÂL™ñ_|?ÀÏÏk\À¿\¼)àÿÝ;Ïz?%ÿïtÊËs¡Oœ žp¿þýÈ?Þ}zEgþ¢ÿe^Ãêwæ:F»ôÑýeì+ç'+§•46)H$´0e%`¥&=…rU|hpœ+Õï©ÀºÌ7íYÕ')ù(‹NûÝq©Õ±aß™e ÇÄ3ß&öÔ}n*RîVñÈ·E$÷°»PbÈ®ÆQK¡Ì„‰@¢§íìd3 ×Ú(ãh<çNó ñÌp1¨;^³ã"gŽérIL°Ü é«DÔ‹®c.à_'Êrt =))ëqà Rå…Ú¿¨éOtañy|(rWê0¢TªZˆíaxb”6ïîÕ·Õ=Tó°=EM;:;±çXòÝI›Îg‘ÍhŠòUº{•´`')9'[¯ŸG5ôpàÒº×Î6ÇM\H^Òx³êÞjFÀáK¯ºB½ªÚVBs¬ÕØ#=è'uóUeé$»W½©YÍS­HZ†­÷Ó=dñ!\ é—;×Òó0kf!ñ7uÜ s{¥˜ÅÙÎ’ü¿G3r/Ê!¢‹[oT1´Ë¿,ã^‹ªu9\F¿sÔðXm—ÃøÃGP£ªK¾ŠÅANœ:|»"Ý E†ìÄ6ÁŽ.£BÎs._"Í:¾ÿ ŸåDc|K—ö­YLM·‡ ¬¾¼JûÜÛãA¬ðªZÛ’*0³E%ó˜û{޵å÷½øò-KýZRŒ©šóÐvw¿Ée\²t·ðC̃>zž`ýp™Ùº(ß{‹oó|z‹kÒt/Gà¨Hû׌ÿA\fXÛùÆŸŠ ÷Ûª9õ–­³n ®ÇîïÒÁ;(©E£méÞ~-Þœ=¨y‡´ÚðÌp.™ÙZˆì.™–2šÚœîî±édL”±FĺJȰ½ÁßJÖ}ž;Æ"9Á£Ôªk±ŠC¾B|ï{oXka­e°ìh /§à €‚o9tYgÝ‘Q’ôº÷V%>:ÉÊÎÉÁÓ»/Lõ­:žrò´*›˜œqL:î÷p”ik%H·uo†¥2“>qé!J'žþû'6òÀ˶ð#~{v×­˜È˜”†å·Ç)fžBŸö17͓қHÝfܪř¶C½|ôŸAôgTO/*‘ÄÀ!¹ÿ)ÃGÓÃý÷ÄÊ¿ÇÝϦúØ­zÎj÷ߨï1ì7–â3ÀÇÿ€?¡ö¯ù¥¿&mðä¯_Sêþšÿö’ýÿ2?IäG¦ù¯n–ßµçþiyx2‹|ø~ô’¸åè::F~–à G¨o•}|$ÐoSõ°¤¬ÍÇá¢ÏW®ÈM»·×QÀUhÖÿ„âd]{¾;0;´zcðSSËI Ä ^XzÄà´sáQöÔ­J©1¢=•"{¿ VªO¯êÞ‡–b˜4íê ¦—™òý°bœH=ž¢3ŽWÏt µƒ#¡•øŒµ¦OŸ³Ž‚'Ïò^—öE–;û ‚¨ûדּíOPÅ—?ÕË¥Ùï ‘¹ )s¥úÓÑF½ãü¾s8˜GÔȤšàxæõÏ¢£ÂÐG€\~$¶DïÛyÖëf„ä)Ì#©yÕÒö‘)2g5QµIÌð‰Â› 5™~ÁÉŸ˜DÍUà¥=O7Ïï8€ˆüuãJÐæŠ$pŸyµ/½Éãàak‘ܾýÞv­Jõ²¥ëãr­‰ˆ·Ò–å 0yÐÆe¶ã!ýlጓsóv Xw8,N¯tÝ-‰Ð‡Ò½RqÙqÁä쬂)!†‹ßB5‹fëÖq¼vç¶Ú߆›.먖BcÅý§ç9ì;^!@éâIE¨J8V{‡Ïvœ(â¸D—ä¢E¶rÔóísÄ3S_#æ!âIîBRy(YusNYžÓgƒ`Uê»,ÄP%;Ž$>£²'?Äg`' ÝF¤©’]Ô18)TWQÓœ›ÞZ séZÖ¶æð·X«Ju¤¦qç\Ð]áT$-îѶYE¹˜”þÔa]=wâûäQÚ)»SER‚GoÁÊà%·ìŽ/Õ† °g,3.(û_æÉÉkô,¬·ëëb0;~ù *85g}aRê„•ÅÇ ìØ[y’¯SeÄŽ§=$4à.݌ϙ_©Põòn(¤¢¼ãŒÝg,&Ž™â²£MàçäÕÆç9VÜè[^¿^æ›Y Üž‹‚]’ÓI[ÁH»k ,J •úió‰´¥HB¡£Ý¹]"”âÿKØf£eù˜Œ :KÍUüX%¾$mÑšž¡0BFòË”âÒŸÊà„F±ƒ'G¡O”Ë3íñ¡ËÖ©CÍ-•N´À¶\tVœâ§•_hÈ,,‹1U™`]g[r@šqg2d)R‹ÑÏ‹w†ïàif†‚¸·ùÞYcoe˜« ˜ÀPñŠaš€­DÎUǦ’훰ĘРrDÂ~ <²ks·ØŸ˜ƒ÷—ëß|½þ˜^šô3ùÄ̾ïï{ßW+‚XµÎª±“Å!1ÀØRÏz]žH“ܬhmµŠ²(=z7Y­,^è“ lׂFï|Ý"|8"CŠZ[d9tì)E8ÆÕ’Ì€áì»B—QiG'î¨:âÙI‹I ›ðQ†a¡™.4+4³À•‹qž²›A-aÎ#/îÙ½úb`Kz3 ÂTÁò\5*JnYÁCà­e ¬Ì;Š-˜8ø—tW¸; CYeSž·ˆA€­èŸ0êM S sm(>|‚…£;LúH Zv…Ý­Ó`‚Mï±#•×¾"šñÔ¹óºûÿóÿþ:ݎөɺÊ+æõxAXýöHÔu*”‹–>A .åÙtnh8è€ÃuÖ]¿€ þâ±1^\NÝ÷9Ú·úHÂ'‚šf¦Ip›%êŽIÓÖ­¾î·qm*îx®}»¶o ZÆf³àä¸+~DO@e[Z ¨g›$—3C{™6O3K§ò´y»@}(Þ€äl¡â¢?ë‚QîiêDu3/Rg8X`)‚‹KÀe6 „{`S‚– ˰ 7¬×t¯E³ÓÞp‘÷ÎŵU6`;õØv™ÅUK_BÌN^¨$–C3ErV8ÌQÔ%²L`–œ O³cÉóëJB3XèL’H­>ª€òýí0[Us­zç|à2å‹6± C7$XHšK4ÏwIÞÐÃXïz¤C¡¼#ÚiÛ`ÎöÕ$ö»h¢·(%…ã¾O–iŸŠG]Ðw¯IDË€¯òi-‹ì–uõ®‡c;I¯sV£µ†ÚFªh+nìä«äͳ‘Eçk"pÑ´ô ß[ícÊ?qaêÃZݹž \—Ì‹Gè¦wÇãˆKGÇî•nlï[vÑW‰¿–5å˜ZZ3@ô:ÇMÍ"M6ls»Òì™ã|ž¼NÑO¹<“ZëŒB{cDœ"×Qc,íTMé.䪑D^„ë(ßâZ&øvù†¢ý9¦sœ}ØÐ/ÚZ¶ø»kê¡Uàjï„[ÛýÞ{­àz¸|1f ¢j³4 ]­YË"èd"1æÄ†o¶*Ðg<`§ò”}cÛ3Ç~ª½±ùM^÷&i׆üþÞ•û|ÛÏxÒ’ˆó£n)¤éFüaìî#÷· Apg’ŸÚ§,>š¹ïŒ±y-AI¯ 2èCåMVÖo° ¶àáøäÛ5–mPÄ– KÖªB ¢wƒ¦—Ò¼ó^DšœX¾÷˜<X³k ‰ÀÀúØRæ}Mäa;;^0¨ë Åïðe ‚ˉA=Ý$¿ã#ÉÌXªÆ©Ô™¯ŸÞ*D‰QÖkÏ}w8dç§ŸàžøàÇß Å‡É…÷úôOØ-U”ÇÂ6ê*q 1|¹³ß²øA¨¯wqæ‡øîøƒ~Ù0Z{Þñî¿$šŸCIù¯ßa£ü{® `-§ú¿€æÿm›‚CöìTû›Ð,cÊÐûÝñw€n'í?¹ à¿ËþÏFÆ5È|^å±õ½8>9Ž>¥¡Šã/ €×÷É_§vüš ã’$ÔyÊŒB€oµ_1¡q6³”WGÐÎ[Ãö-Á2Äßâ¦ì­ÿÂfYÚäÆUR¯q`WGd²âìUêz¶ãxQôªYý¾<”0Õ þ9ç‘~"úPyð˜Žý5öäk|¨VQ»ès>`G|{sXŸ† QõÆÃàGZç¹%F&48£¢ÊkD341_½|”ð™;ÛP¾ÆÎ|ø§#c?.Íg¯ï)ê5>|b`÷e(©gÙ«©X#ó\! Aù‚%N=@ÕF¨¡~LåþY7>‘‹´n f§Ïp5³/ÀlÈNˆØ_=çŸ aý3‡¨©ˆÀõö)p~âòE|#î»·–|¸Ûg{0ùÙdð£@@Z«©þv›Ä95b¯¯k-ûó[{ûµ¼ƒÿ†zÝæÔ=õÍ—šmžvÌ ¬0ÛÚ6NL/™þ]î'eøOü'«ŽÖ üÌl|¨3f‘[çÝ8ÁiuVŸ6ˆúÊñô}?œžÊ¶X¼è²â¥‰µ¬e‰MÚØùÝE ©´¥œ# ‰ìJŸW~kç4^PD|¦ÉQŸú©q–m*í@¡UÄÑ$M!œGBf¡sr\33J@¨<Ó›oìþ…žN§–Nš­Z6órìÔ˜V+3´ëüNfeŒéIuÄ /Ah9­%‡Gàø²ÅÅ,m[8ÝuÆÒvX6Œ ù®¼¥X[”•w"O]XX_öíg•ëY(²Ô_Jlxâà˜ÒOÂf„t¤ÐÍdX\•o¼R©X‚Qpw(rtÀšQXÄ"nla%æ|²X¡s³òØ‚ .·üM¸à·oíô ^Æ;rÛ3=³ùKÇò{8 ùò=Æ›¶vœV,ä äJÎn5Ǩþa#C‹M\Âwèÿkåí£íÚ^©º™h†qï}ù[‰;b…ËLÒí¡H¤†S*¤ñ„ë2| ‚íNQ'ùÓ [îå:àÈ®‹hpÎ}n˜$%+0k€]ÄmÐŽAÑA³Ë‰V»:pØÕ€uk8a:¥…Nl&XºÝ#Æê:X¢lFÉK p"2txBJ½rP–’tžVFÏuŒ\—eê æ«b‘{b ˆÝph‘‹¼V€8¨¹G;%á¾÷V§Ê/.’ËöÎÌɼ¸·o¸R‹yTƒ.·Ì³Li·õÔ.+Ld¶¨¬º×O•R©mËfRr«ËåêñÜ´DRB%N…dvÊ+iž ý¦ÌÀžÝÑ[‰3pYü”NsŽ&müM²èÀdçÍ­íΕr‡_9—]„äwJ$Ú%#§—z#Ò„ÕÔØ™ñXºiÑ~™EÎ×ÊÄõ®ŒxÓòL™‘ÄYX¡)¥YĤ(4¥;a WÙøÄþΨQõ©´§% 8›‚‹Û[k+aÄyæ¬h»_i.<;¾Ü÷&—:@ähøŸ`Ç£¸å_3};´`c' ˜òŒ“ëèD>hü·[b±@½ w¾ÜV6ÞAÌWZ”[¶¶c…µÒ°µ·jŠ .æñƒÍøµ2Om÷i¹yÀê·¹«|Á‚ ‹­Bm•ö\sæf¸¢Ã.k[bÔ± <äv‰¿ß,]c82ëor!3zó‰nÉ·´hCñ<°^ ÐÖm›—tÇ]Y‚ïZX¢ öÀãȇ—-üÒº.£-Öærc¥ù?tv‡u¾ì¨±ñ÷Æy,5 QN&n™3âÏTì@&…&Ë×@¡Ô_¬š8îNPëqD^öœãËŒOŸ¿JO£ ‹¼–äiȵ¬Õµ%«Áþ•Mb:Õƒp]Mäæ3üx¨úH¯?:n0¸oßÛµ`— ‚©ƒèS¿d¤‰K97˜ˆO²µËPÆÃy‚ˆØ+aZmý]ó VöR]¦ O¼2Õ³X!HÏôœÇF¢7’>‚†ÒoÁê. €ð Á#_’ô;‰ù_…ƒÿà=°‡#á·ØèI8ŸMõ y‚0iÓ îïo‡ÿWkÀžÿ ŽåÛµýÇ­ úHÄüX"ý7MŸ:ÿý9ŒZÎæÈ?èañŠˆ}ˆ {_]øæ„ùï½h|}·ÂSÔÿW²ô¡$;·èúc49ÄSXÿYI%-ži&\ZÍšÚ|R«Å– [“·Mu’ª@cáM±biöYÑ(N®øó€o²õ '-'w¶êÅvw%éÙ!VH;;GTRLÞžcJÆÐNeˆ¿¹îñÎ jŸ¯fÛ½ ®9ï³qù¬ V±9VkûOný}ÁÒc+9ÔQÕ/c2gz‚9ã_|â¢pôóˆ9GÔ~—gŽ ÁÑ7«i5ˆsO×û´¸¾CösC?Vý¯Ô–¬8ÎlUyÀDÞgX$FƒÖÇ5x¦÷x÷ˆ„Jدݼox~_kÖ™=öUNN zp…ÃÒßþ@iü"êç§¿CþnýÑõÜú>7Ÿ†f3³Ð}N­éƒœÿ>b±ŒƒH¯OõäÖÄNO›y¿÷¶¾Äzh“βÆÔv¡Ee'¹¯`ÁäVÏ#q ÃHrY®ôæ©J Ïy²ÉÈ«ìÈ~|ÞxtùÃSoö"J’Z›Êay$õ‡ýV·˜´±–”ϽLÂâÉžo®Ê]¶ø ?¬â„•š÷—ÌèA{¤akx ÒŸSÆ(®C»x#êWÞs‚¦àâ0¾ìIƒoPf«[}/Rd$×ÑÌÁ‹”™n?&°k­hp¹ÕòMð²û—¿Ä …ÕçI;Ìÿñ¢#:/Чà?¢¯!ºe[Ñå€Eˆdk¢Ý}öud4òËð§Ñ· ­…ekžÙÇŰ v›Üwõ|œŸ®Y\™úS¼ä†ˆß ¶¢—Yj2ßÎÂÂ7z[miG÷RmºVBv\GË|È>\0½èù¡Ó¡íDmF­V5LÒ•í2@<Ù‘\I^cYAOî™4Ë¢%ƒÄË.3˜'ÓÁ[úŠÀq»Ÿ²Vv$ /òNôÛ†û~”Øí=œG¥´¼X ¾:š®¬Z`„hÖ0yä 9‘-••ž¦ì mÜí¹'d Dô(äøL€¶¢SÒ\gšs«zÜ3ƒ+ìÂQ“ë.JÁˆ -“`¾Ûbð>­–uæ(œ,UåØàÐeÌÎë3OøèW0`ÞÓ1…Ûæ|®KüxZ?#™E3—s×4kúüþY‚)àøã©¹ÖA®Ž6”õÐÙt¼NÙñ]e¥þ|X ΫÚÓ®USk«›£ŸÅõDèøðõú Öåð5j^>£ ~:43#¸&ÅÔîï1¶•—pT Ä$¤DsOAÆK®ø®ƒÌ®Òìz€ïf¶ì¸MÒΡê)³‹êe ë6«Où%™)özqºT`麔§íØ m唇3;_«-[d”#x§¯¯Ect|]Y¿>•Bái“ä¶ßÆ‹Á…hÅ,”…Xré¸Ý=C䌀| Ï;OöÒ›ZË÷uÅ¿W˜q¿þX±3|cc“æ9iŸéÙ= Wxêº?t˹qu!á‚ÝÏ/n»ß¾ Ó2Yì›'·ÑàJxв^€ïðé ñùkÆ~Ô“²eÜð®äÓc±µ²-"°€flwÁ¶cY§Èääæíó±eéŽèÒçú›þxŒ„&dÑWL\•o6ƒ{R;` ~ÿ ò¶®ÌJùBÿO~Ü_ÓNüÔÇzõëšV ßjŠàƒG8¾û lz}Óar¢Ÿ~ƒÝ~Rü¿Ðãm|†põá£ü¾¿÷—¿g˜>Îð—öϯûTÉë¿<=]ƒYÐ>]ÓÿäŠ<¯èûEy+ø×µÙö/[!ð ÂÀ?Ä ù¶ÿ_„ü¿?ÑÀÙqÅ3Upå'Rì#Яdø/º¶ú±àBÏväßþ= Hu[êÌŒžp–òÜ1C±™Í¶'\>ýüÖ{€ø°Ý~!µªhO¡râ1žÆa¢¦”n©ùÈÁä¢c–ÍÍÖwU5üÈ,TcëC¡.zÅÉ(-¡÷p~ô ìe³%KÇ󔆿>¶#zƒFlÓä vö‰gÞ¡ Ü™Q“™DQ¨ÑP*ëó¸1*J~ +zÞ>¬zÀŽìðƒÑiX´u´í:YI•çQB¨ßå]™¶Ùç²j`”RÔ@VÙ›çfTEpW-pu• ÀTÈë†2H{‰-£,ã}@㙃¯“¯0„UÐ à>1t¦ŒªÂéc-@ãsƒrüØÄ—\ëòp È/áñÞüS-í/y‚ÏM¢ôzѧ*ÜA-ç{KÅ¥wI@j¢½éú&à°•Úå™Ð¿ãB†¨Ó"“Ñ)1=UYCðhW«Ø””‡ §O•ˆXd–áðaÙ6š­ø¦åa(¬ÃŒÕ[ûæ1IAв•ÒïÌ6N('‚cÞ°Žì‡êqã;ðg–BÌŠ7¶-±=¾‘¼¦6¥ÔЪ4 ØDd¤[‡ä>‡ä^·ŒÀ-KÜ–_¤<þœ,ƒ4»6ã U:’]­uQ¾Œ7ÌÝÍžƒ„@³9x‚|÷-ȧß7qçó4q=X/8#Qü\ã#¿Ÿ'VH§à—ôã4±=º$ž HŸ¥Èü!™?gËÿMYþèPï‚~ï|äeøò¯¨øÃë.BŽ”_¿þ+úÏ¿÷™ÿÛ5í€çƒõOÀeýHñü›Ó£Sî¡b>$ÚÆ-‡áö7ù_}è½pZ/9ÿ‰À£W– IÎèQã%¹®Kµ Ì"$?ާ$gþT_p¹2nXU8ld½ umk ®›´4ðp™Ç_ßè4Ÿ¬ÃãFxåfþTçÿ<zÇÅ<Ý>š‘ˆ‡ïov¨|¿ŠÓUÓñ®ö@Umi…\%V?Š NňI:™6Æ™‘>ßÒ³Ë6Ó1¼Ï‡<ɧ6"àU?bÿnÍä‹ óðZ…|Ìd³Æ}Ë×ÀxK‘ ÂÖ’v&*2ß²|n˜r|ßwrÆç ÝŒÂjüðpâËM¶ò2[‡!=~ò…û©´–YžOßÇœ?K>X298a;4å鵪i”„‰8ö)Õ=õ¼™*|äWöÅ2£OZêÈ>®ä´hÁ†9&>dÞeÕÐPV2”¨ýXÂÃy}Ìhkzni6º¨ÊvOuY&])«ÚÐF~ ½·_+í ÆvÀÎï²Ø¾9+§ÉOÚ]VNNÌ–’D‹T=6‘â’ñ´ìœ¤Þr?¹2ôÄoqaãû ëZ´À»D…«Sc-ñUMÅG5Œ´áZF ÷ˆŽ×0ìÖoT–fËR¹é‰ïïš„/,3ÇÞxléT3”PJI#°Ýˆˆ|†ÁÌ.†@«[·ò;} G¦§Kf\vÇf!N…çº=¹õºi†ë"6BQ·b{;ó‹·…¤\‹tïȘȻ§òð±÷§ª yÍø‡}múÆã0‹ Ùñ¡¤Áh‹÷âÌbûîžc6iZ ¹jZ(J+VÐߢJ¥q…îPD÷ï=ÄøvÂkâèoжlvq‹(y—sçÛÊ-3B®"õ¸›€£X%L—±zmò;Zñ…‘ÍÌý¦ƒfëZ»w÷‘ÄßÛýÚ¾ ÃÝXõ­îÛýŽœçSÉ‹U,ò Þ‚kU²|¸¸^cVÆVó”ÛÖ‚9" èÌ4ÁÈU;RŒÌA²-ùØvI¦øÃVy0kcý9tQ²ôl?bêhëE‹ë@õ1¬hnõTGð‰äk*yÝ3• Ù™ÔlâJN#u󄃽Æôh‹ŠûÙÌàΙÂ÷–"iǾMÙQç~À(£­á[~qê¨o)¸È ì-€[~] 7ù&ßð5&Á·´”B "Ú= Âí3Ziu[²sYÀ‘¹hx·æc‘ûm¯!Õ!iZ+Tç‚ÓMÖ‡„¶,[ÙÄZÊ&¾©t"¯g¥xµÞ»äföÅ>_>"2gbdì÷÷ÖäGÍBp¯c­=‰x„Æ>›‚ ff×eì!–,€M@ÜÛC/"¹‚¥Û~K¸ ^°ÎÞ t>Fù Œ«%¾µò„—áüT E’e¾ªÅ¼ö"ÃÂÃ߈e'‘6›º· ŸRtü¹´öíî;®Í&/ø=(pðƒ¡¯<¯g¨Ô ¦…WÆ!‚\kYTìÀìk}IÚ&—i{„€—jíãJá ¼ÇsúFÖVRÊÓCå'“ ¶1§Ò6Ìò¦JiYÚ~qG‡V.Ïe@Qä‚Ö°Ñ^É“‹²u}ïíMÇ:‘Õôž›)„Ü>ù·Øîp˜™/¨x,U„b\wùö?7´ÄU—l/aY,h”KgOZ)|èØHþ¨ÿîMÓÄlC’Ÿuo“Œ z²ÿãg-k£YzÃÐ,Â)ŽPqœ™óù›÷¯£N4¸#÷××þHüQ¨Ï7x>Úeº‚rá°‹ñÄz~w=Â"R+©~ªÀŸÁZýNÆÿWuË/ÐÃoÎúeÿï8€>ų¬õˆ{‡¢ö¯}@¾¨þ•ò¿ƒøµ—åï0*ÿ¤ à üû›Æ­2ëEÌ1Hï x€ÑŸëvK“üo£O>špÿv÷þeàùH•ôª€Ì8€¥@DB?Îsk]21'±Hî€z2dzŸzÖR-F{Aˆî…#W‡ïiÎ¥•-œD½wk)@äQ&&#BbE!­ë:Í‚ñÌ+?ªéÖª[˜»4™fgò#F¦SMóœQÀôü6½›=å¡ê” IDAT*k²lÏ£N¾ä£1Œ8Áæ\Þ°å#Á ±WaÅ)[õ%Ö³§RÎêàò*±^)joyÙ] ‰¼{¶>à)®×3 -åê(ÿQ(ܬ‡=n~žÛµ´ÌuÞoŒú1å<¸À3…öfÜÔ ·h þmT5|Ói:—äùàd:_äSž¯ÁðÔM³;ŠKÍ4¾×Y°ü7œã/=ïj¾IqFŨEN§™Å <Y‡”¤:$- zj ówIž³Ä¼íbý9ò(TMrß;LþA9”JÃ2Ƀ¤jú 1Qh-é«\‰Þ¦“d!0ä³%¶u4Íj*¢N½TWÌ¢SÒE}%¼}{rw^eUÏÅBAŒé*B7œ_ý4è<^¯%zieF°r”aŹd«¨2P ÅË‹t¦«GæA¢é¤G³¶ñ©7=¶°ì3߀ÿ=HÈÃ$H[mH·RDæ•Hd¶n‰®â.+ƒ(i‹&8á&¬í6°): æ'qã¡ô+‡’$VŠÛ#˜X[xUoVÖóYÔ³ÇÕ w™H‡/ °³]<䪜’MM¹ûÖ–²pûKÛd½òe.3Qv­ä‘ÇÑêÊ ô t8‰ÖL)¾L‚,m é¦ƒ{NÈrx„l¹£ù÷ã¤-]e5ʤ[ Q»µY©¼ÃC<Êi]X&2j{“ è‰$¯{@ÖJJå ¾ZÎòò•:UGeöŸð¶.¦:ð1ön:sû^fAîX¼ÚJ×ûëœ+Ò·çòµš L¨³y’¦¶}Á=ù-LñD1ÏŒ¶´xPN™WÞÜßH@¦¥y›V=Q1}Ø‚ÜðÌà‘î]Kb‰Bj¤Š„ÓBÍ·Üx;Lм/OçØ>L…mH9 [uóÛCô“3ŒNÎ`&¤RfÄ­Uõ#XXbBÈë^ÏËìGS9W&é´Û0§½kFÿ˜“æÃâ‚ßw4båó—›IX‹·Ç2(Vü+QÝof[½ 6ä.wliE¿ÕµüÙ­5^G«(Ÿê{û®ƒa~|Qõu`®R1nc¨.ª,?¾Õ§3™Rôy$3jP·rtøùòH~ñÚ&]þ½sÃÝ®Ë8Ã2o³y"Õ°è`ò \\nµ¤xV´ñãrØ £¤¸8>¾†|;hTs• —k¤aäuÖ:Îvß‘gÌ‹¤ÌH]Îû|ŒLãÌŒÁ¤”cLÆ61͵̦œjoG4ãùín€A6K{»¾|UFÚ4ÎÇÝúî%‰‹í´]‹‚ùŽAª‰¹Ì<–q·@­fCþž•‹I$ßk­åÙ½ý|(4E`ϳ¦ÞK;³u€wÖ/øÂ[PEDðˆ™žmx©þ“ë#ä6%wÁåynYç !UúQ§ÿ@^‰çv%¼0+šÍ)l'•^Ÿ"X‰&>·¼§õ%—ÞE>¹¸Ü~6¼ ÷ZbÞ)Û?ã›úˆþÿä8Çó¿÷IþîËŸˆý5À/ÿ#ÿ¯Àîÿó|œËÂ×OWoâ}|{þ¶±æ¿˜äøxi<þ|¹Mþ¶@<éð=ˆ3Dí°âÃÁ×Üýäé4ÍaBPÔÕÒ19#ñÅ7¢‘LІœJLa 5k˜FÍoÌm{†GÖþj¹UU/YP±}vl@><3~2¸?»}9›}{Ûô¦Ù‹Gé8%Æ“2ê ´uÂŒàÝÔÆ$BTÉ®eÉ0=8î¹/<²û{]× …úYƒëû6”tªªòŽñ¡…§= TêÈr¸¿ â‡è |ËU­ÀŸ©¾'F¤O•Fäù”m/Ìœ©#4ï“T§kÀß}kWJê°G Aµ!¨z^í<G­ßP´¡½œ>ŽUê¤:ÏMQ¼4À%ã{?Ç“ ç$ê€ÙÍA Ï~à—žð—}¼ç¿^oìʶC0TIj#wzºK§]ŠHk™;FÀ)VLº¨ô†<•¶MX¤O—o»úéÀséu}äƒð/´È'æ!=n¿HØ ò\ñ dÐnWEwe‘ÙK ð|£ç$Ó½¯!8 œuü Þ(úMHm#¤E°@C>|"o€ÚÈ[¡UC>›†³öžxg©kWí´QÐ!Ë^k³“™ò«qRèæ>f’ô¡… ˜šÂ‡È×TŽz“z:nƒ^µsAò{[k%RÐsq4Žó±«XÔX¸Ê#¤Æó[ÛÙ\¯+Ãyh­}gd0ØZk-3÷?ãMXÂìR'>Õˆ.Y$áQœÎAÃG‰½þ(rÕmdþøª§¦;*Ö µ`îî–>’ë»ÙuÙˆîÛ½[é_E”Xî°¸Š²5Ff¶|û9ÙùBÓ$QÏ3K™ŸW K—l;¶âžÒôpM tìlÍÕSŠ`<°C¦|ñkš=9pÎ˜Õ ÆZÌ¢c')¨ÈBù²ñèKÆ.ãérÈu7^˜X‡ E)(õR.§Î+t'ú¯éŸŒð“­,¡¥¥,jÉF P«k­?®‹Kú6ãv™»4Š3$HÒÝ7Y »¢Uy3…Jºu˜´:<;ò5ˆ\4eÅålÔZ‹¤{¿­•‰âˆ¼Ù²¼4rT ÕtE,pgbwQ-™c™ÀC´1w`]a4¼¥uÀBОŒ)ãõ;ôž4šþ‡øÍÍEØ8“ŠFÊ 4wY¨dXð½û“Þò FÚE? BøÏjò4v¬ÃIWÓH!WÐuœ= f¬6­ÛsÜÉ^ÎmzŽê´ötõE»íHaú–®¨ç”ñ禼'‘úsW\p™Ý‹Y”ZDåe’ö»û²àýsT¡7yTjk¶Žô4ê–7$®á,»ÄvC¼©¯ƒŽ‰ôðô Ê“G,r'Y “E@šÑ°,>Tâï™—åÊ•6E;Q~`§Í8«P‘wÙÿ oé*È+$ç°}Y³šÐ¸:ûÜ¥t–ÄÕòh'Öøíþe‘gÂì6‹Äå¨ ÈÀ“ðàGul_¼ˆ?½EåyÔ:ÛxWˆïP<éîîù‹[¸ !çííá³rJ* 4Ò•÷(BÑ/»pÅaËìÔÃ6Kr:·„[î´³?Ý·i¶ÉëBדÈAî‡ä9“ûÎá!kéË>(× ,ÏñX.œ$Am/ïa4Ð:•å{9~ QcÓ¸mdÁGÀܹì×?φ êlÀ_Ò3?%ƒxHÏ;ÙZД߷‡i!m2ÞQÆïœg1fc{I^'£hH_KÄÚÜoÏî!ËÈ5æî1yÛb<„šâÚôÕiWt–gÀ4=Ƽ­i¶è›¯nu Ò·Ö•[ÞòϢЯ›‘£‹)ܔɊѹR{âßÛÎ3*´V}©{o—ñ›Äu­×€h†´¿ŠÁø°ö°‰µFÃóÎqΑÆžJ«<¢G/òØJ\€¯˜-‹ÓÞa_vOB×/¦Ìá¡P|W4bÀ€—\š„ð81DP†œïU¼æÇŽg%ñ竾3¨$ž‚1³"ëŸ^TØzXð±l¤ªl²°zÃûõþp¼¦¡ë58ü#P­_êÇõOpKþ¥rÒŸfYo¶ô©•â÷¸ø´+|6ü%À„„íYñO”ø?{øáýKN…×W'ÿo1ÌHO2y¼ÿòíª*È}³üÚyóßùÙõùvùý“w”m˜ð2è³Ep­1eøù3¬ØÎ›mEêYÇ#úÂs ± }¬æqŽñÎ١šÙr—2 $ðæ,q…·òã‘äØù?çh3§–6 {ÉÕ”Öú§Órëå\Èͪ™c¿\8ËøÓìs löpÊÇšåÕ=¥DöÑDœ3óUs²:Öõâf d\# £RÅ&gíÉ= ž çb8£’DÔ$&ÀãÉ“J¯„ŽÎ®‡Â·ªÛ *ª$Uôáš9pXùxàþ¢gZaV…~X¬@ù• Ð<ÚGXÿ)4 |+'ˆª.…fãmJ(wJEÂvi«~ z[QñV5ÙÙç£Ò¡÷tœÝjNkj313\Žé†ÏÕ@4?I¤72àüÍKYB™‰Ã ŸivÞ¨–8Œ0UÓ‡š~ð»ÍŸ:õ»Q§ŸÐŸƒ'h¤±Ó ²c²> ¹ïM³µ²¬µÓà f»×Ú,1½J-ë¡7N›6ê¤GGsßÞÏOÀ²RtrÄ8aZ:/„íÃh~Bœ2Ø% ‰›u³]XÚ›D-‘X±ôtè{‹¨Š4AÅ©cV£úA½1 Úm›w«øP¸ZËvP8òô¿î·BWúÖyÇj¤“©Í°¥ËÊ´ÇMþ•FÄ*d©ß—ØTÍ*Àé±8¯ˆò]Ád$½' §7±z,n³µ¼ðWÍ ­B¡o,ÒyâOšìVlõ-b5Mî{ïŒ#nbÑÄüg´(›•yl‡ÃzmµJ?zëG ž©å¸FÏvQލ³Ý`éc6ó¨éÕaH%H¯8pžézÈäS€7³¨8êW ØrÜñpÔµŒØtàãmƉ3Ñ$·’tdzx¼4¼Æà›) _ïÖ[ú[u÷Q«ð“‡Üù/ûïTEœ ótó¤ý¤ `¹¡¹wàtŒ?yóÁý‰œþªãå~ßý‡3|ùæþŽBàÿœÿ ü1ðÅ“ŸÃ¼³$@ä3>(?%ýÿõ6»¿ýèÞ›;»ÿF‹zøv[Í{:z jN’¤°6Wñ‘¸uÁ[ûÅ9×µ²½$[0¥ŒýxíåX …džXx‚5dq<̽™Œþh;wúOª¨Û•Ê÷?§ÀÏÅßßâádÊQSvûÞ“ƒQ¨œêûsÛyL‰3—[!›Ï•úùîþžiªåtªÉ»Lu Òi)>oi 0²ZÎòžkøú«͵®dKæOc9k[µã‡Äõ`>,bãèž~ÔzýW÷Ì‘Î*‡©ëq¦ëñÃ:¶5¹ åseHnO°Æóšå-ÓŸ}6y ’ÃÄÖÀŸJ*¼WEߨ¿Å™ƒ„¶âþ$S5àü'û•â;Ÿµ<…rî°4juÃi›Q€BñŒ~`ôF[aæÖ$IpÏ X•G‘½™r„V“F&Âyùaã'¹¦¤§ }0R­7Ïí[ž5U—.w?¹¾ézÈYˆÝ“÷Ì-húÔPq†ÚSªª)4;~)Ä~ì…êûQä!X-º#G€Lƹ˜éêëÂpþJÚáW6+¤Æ>š@u”vÏWůˆŠìú’¶·b¥‚Õ6ú’ßX8‘–(`€bQG?‚#Íéœ%bKç=®…{à $Å‹€¡Qªàø·!‹,G»f„ÁBK»,ºµ¬ŸVhV‰@ rɺT×u%bƒ1–[äÐt=WQmÕÿ’IŸf!oõ"•©ªOUþÅÙHê»|JK𘣷 ×å¿Q4q¡¬¥ÁSg :Ü‹ÙÎÍv•WKÕ­dñ0e§œ–|”¶™Ì~HˆÈÞ~Ïp[tmú‡aþݘê‚ÛG |“ꥑÛRÀÌûFðý\–çèÁwvµre6 9ÛrKØ6¯¸$!b%à™ÌpV(¤œí6áæ31Û¦ú¨}ËFhÉЈܤÔ(.lÏõ¹»ó¦Š;¢½Ø=U2î{Ãh¶-¶#F*C°.P¹Þ{û‹A1×ÇÝ !+¯Åu ÒêhOm˵ró†(Bò…ì&¯À]'ʶؾ]ÉX•PîÁ÷·ü8¶ÂçU C¸W¿«,Í‘…wY6œªbNDÈŒ–H\ NË Þ_ÀKÕœº ùÐ%ÂÏBÕÍTž5’¹·¬Õ>›ÏÚzJ{;”¨\ŠOQ8Ÿ:@Ò‹j:‚ßéôÅÖÒW`B1¹ôŠe„ ³‰5&}ºÌÔ,hþºYñNy-ds‡þCzñjèDß7bþm:¥bóƒ—-ƒ9[&}ÍgÍ×A(¬Û¶Íp«ûÄU•²y“[dQ±Ü6Ü“ÔQ.È‚l¶Þáx®è YÓ0 ;_ÏÅ5­ôŒV!Y—.]ÛvLÁ3즱÷ym\!åRªG@™ ýÖ]*ôþît ˜qß{}¬[qåæý„f•É–Ýá`Y\O(r_$Y!Ä²èæ±ˆfÎ×ëý¢™3¤Ö•«eŽBî5à ´äe˜\µð+ÈÞ†¬™†”-Õ²ãm(ÞòLqvQí+HªÊÞõ¦T¢’…1E¢Ï°^ uÝÞAÚºê èZ¹û$×7´Q*J“ïM¥qSs¯Ë®"õ¶Ž‡1&¢›ÑÖ#7×…L}á2 /‰o*¦wVµòeeÐ\—ýÑõÀ 8™îžžÑÎÿT¿Bµ©$™h±Ž´xéËUëlGÚáU>'añÛbË«nÚ¶MäÒ88.•-zÅÎ…õt;ŽI1ÿ‰(¡Žú^Ïv¨Ü¶ç´&üZ]Ã¥Áö¦¢#üí‘éÙy±FåÑ lêèÓžÙ Ð%z«íê(J¹ÁÄzºW3@cçêDM›yHMì¼%¨¶ÃZcíQò€HGMK:ô²ÄÛM=:‡LóÄÌõ+–ˆ¶§òë[Fáê4C8…Ê O?”5H¤ïˆãG Z<„î yÆ ÇÎ?½£rôãVeN)aJÚgR¨ÌIm×¶×Ò EÑ’ɉîáÁä'Éå}(µ¼ÜœÄøÎ›ü ÿ,nyX¾+Ç7¢>¾ å\åç~ùÆÒ.öEáùoÆp#k¨éÊoGßçøSWýß^€YQn¬Ä¿¨D·„ó¿}(À¾\9ó ¯îÿ³ŠVNFГ»ðMàßò¹ñeô†à%øóÀ!GÊpÐ ¸lûÏûS¦ù±µ)®:YÂ2žêNn GÂ\ü,—VÈܸøI=@ÀRE8§ì¹6q1 å±vu°Ï3 ƒk`ùN¬@îà‘˜Jh‚ïæÊhg<–bu®„S³ÈÖ2¿dM®!Ï}QÝÍ5¬pužûÂ>Ÿ˜£Ì4”‚zbNìåÑšÝ|á«IØ¡Õq½lW2F³·´`›çê`ó;%_>G::¶Èù,5¯>Fñ\BywÒ Üì¤ÑfglÙ(€k”BtÄæH(Yù[”é³._¤ögU¯ô[®~ËÊ{záÄóï?p:<½0ìVáj”| »ª^zú€øÚ‹”7ÆÈûào÷FŽÏ<ÁkðW €S¨2Õ]TVÈS£ÆÖg)© $¹­ë#ö0ýìÓº/>Gè9îËì~XÝfÓÝœ U…mV\@Õ÷¤ßm çÑÅRþoCâ™z©˜²*,¾5öØnÊî³%n¾UªPU'h‡ô 6F™fJc³Ý¹·™ð•ª‘Z&Œ’Ø0SBƒç˜[X:UÈ¢3_™wu…ŠÎS:HQV­X–´òPãJÏQš®b@3‚çÑkç k´ÏG*î«1Fc`-E5×ÚS°/žÁŠÓ$´ƒ:*"×rwÖ8aõŽØ¾ )K—¯[¢ŸØ"ÄZ9¯@˜æ`ÓÂd7t%%>T?.½;ëGëI•= Ù.‘Ó¦´q9(Žz×…ÏÖÛ(—~ð:üœwK3¶u5]Æê¢Wl!)—.r.ðw·ª•5..\žo–ªÏ .„^„+uG×2^$­<_Úd#¹µMrÊ´|©´’û€Ä5^¾^ûKÒ¼ÚÉÃ.™ÎìH×ðÖÁÿÅíeˆ]E*Í9sCüøÍÔÚãíð2 åèèÕôUJÎ^/ÁŽr_qo‰PÁ[)0eA4½‡>Pç¼ !WÔ°çpÔë"– ¹³ K!ÃX’Dž®øŠ®ƒ\vmÒ?8¤p²5ëD¬Ø9™áC1úÉÿºo,ù¸>ð½ ôÖLŽt%@÷¨$7·9}šTdû»KP7¦y€Óü. ?R½êboŒ 0Þä5ôÒkº}ü%âu{NûŒ?Þ â¡Áh»µ@cî# ù$΂k}×; È®%”mÛnº¤ÍÍÈ]~Ôp’Ëá "·ö储G6/Ú²IÖƒ3'®­ÏûâtÓKW.@?Ì+åc~¢¶p™6ÞÒ8Êå—p€›‡5KÌ¢WÍ &ú±Æ™›·õiv›oí6ïsÙZË |²xÇ?a¬%§ÑùfR²ø”]ÚŒ’§UbjFO®ŒÑ¸-­7-Óe–®6õ ×U(,¤Ö17ðbM4Òú7)¼!—l]Êâúµ¸“Ç ÝXÔ.9ãØt1¦91Ž¢æ­(.àN‡Âi&`öµ„ì^ö€Àú™Ý‰†ôkŽ"Æm”O•êw%#\é¨5ê„á“;'TQ[®±ÔâO®–^xX5¥Á]”c~vˆœe 23Õ].Á¬¿üž¾]CvÃòQki^ÆFß\ŽùB¥º@”ÜföÉëC–êqvÉË(:½‘qy3¶‰\ã¯ÏâPhöÑ^]ËÏÁã„Y·e=UEw‚öÞŒG9ÌXØ*¦i^ÓƒN´Œ´$9Ìœ‡:¿Ë„º7£ ¹ é”v¿ËS©þ=±¢‰·ú"P˜ÈeåòÊeÏ_©P£ÝUšë5}‘%Ï ¨d†*¶œí ¤Pl›¬|xkàiãî`ífX>:©áM³L{lÚáhgqPgthvLef[E™Œ nå |P-OõHÏ(QDùun—áXJ!ñÇKÉ[.š6,u»E X[L‘š½«-RÓ/ÊÍÀ²lïEÞÛÔ’¶®ºövµ6fÐpµf”߸I33]g*NÛ¨­ë–ðÍ+ÔÄrG4£I––Šãh ø,#>õX¡ºÄn‰¬P]AØŒx‹ÙØÁG¨Q‡ßCžrˆ^f@öÞ"½´ zþèð çÒ±õ•6íÿá˜2w ó<EÍv>sÔyÙ,èv´ó”÷#›É¶cS*ÏÓwþá!£Ðýý< 9y@1ò¿î-¢×ǵTv¶ëZíÑ“%·Þ&Ù\j3 ˜ŸçÎØ0§&2½PÈ{\å"©MeáhS«pHB¶Ùr/¹Bç\ãÆ~fr6et5[±3Õká?yâA~ÊOt›\>*ÕbÉì«Ý`ôÅo` oRP·¹I¸y—Èg±"l‘™C¡mÞ›ÛL(XPg¨emñ%…kUÃ[`)¥VVÓxΆ‘{ËZNw3bɰ3½¸_Ø}îÌѵ…+‚„Q4ï¤:íÒMñšôÚqÉ1 læT³[NúÜÿp~çéaÊí¥¾kœÖêfõÕr l@L>ªð"Õÿ•:Wš—íƒÄòØp«ª]’•ªáñÿÈ*ïÌÛÄQšêú(ˆÃ¯üú‡á ,=ß›Àÿ¦ÿ¸GúO,O£ü›y1þóOrøó2ˆ¿qŠÄwÿðL?ü®\ZÆß›3€™èurÖT:½>2®­yF˜ošâ³¶ñ<`,LËéå².Õb,Ä,s=^…55åñT¯1)a§¡ÒS퉣 %À˜sŽDöPØnJà t‡Ðœù¸túÕwÁn­Ö bº» ™ãØ7Ü‚] œ~|v]p:€ƒà=¬}-h¦cì[ŠR"¥­£˜ 3ÆažÉ7Èvècvó™È™F?RsŽaN·”œ ˜Ò9ôaŠïÈfÇUª¾nfÊå•E϶‹÷ATï¤ õ'S©’ô™=õvƧ8»êžÊJ¥c"ÜpšEV{<´çÄ2³oÔüz½òHŸ4ëp-øuàýŸójUÝ$¥õ÷øxy\2a]s•­Q{ë€`ž «ÒÖ+­Îý௔ бq°ì™žˆñJ†MÕüÉlÄH¨¡î1¶Ç./rJ}N./r.~‰™.§ÛZàÜz– í Y{‹ò#’ÙZÅá~ÆFc}r4ԥػéÞÍNM”ƒ¯o©˜dD+…p,µ Zm-q«dÜ‚¹$¹ýÞIÁ-[jæ•Ú±L~ ÁUãýÂù:Hõ^E8|˜Îs^¨è‚ÇÙYÓ3 .HÔWŠžDQYB^êÿE˜!=l’S laF ˆÏˆ°{ú.¬k-× ÍAHð‰}ÖÀ4" Ö‚÷…ºùÝòúK/|Ì‹mûÕ>š´³Š='ºTPïÀrŽè3¤Ö˜r|"¯}X·q1¿¨Ö?–B‰½³ó:ÐLÜî&ÿrš»ñ¥ý¬#êl —" òxc:–QH\ ~A¯Ìãiýƒˆ¹e Ԙݔµ¯Œ2—ÒˆÒ{Ú^IÈê´Tyëó ÍLXúÅMÚmÁeYUQ¨™˜ƒìÄXÝ{‰†0ù„tˆüÓ‘ÄÃ2F©Éãè׳¨‚ÛÇKZnú9´tI˜9¯Þè ²q4A ÑÆB~Àoƒ¡ŠÛ1"·íuAÃãjáfc7s´±ÔáݦT°€¥b&ŸWëµòq>–“h3/Û=ÔÑLÅ f¾þa‡su¿ƒ©Ë†¾ò£€E³©úse3ØðIÜöÖ¥•e$½³vê&k]õ4ñ@@Y]ÞZiW‰m®Ñ|kÉ&—mš™ù†¤òJ‚ •[\Ö<Ì%™h-iJéw)7“e+æ±ÈÕN‡p¦óhx€úªæH9Ó-^a&æÖÞy).b“Ü·Ù2gl_ÿF~nPdáÂú´€H%d[æ`¸4†ü&OË¥{hŒNlóLœß*HLN¥¤"„œÑÛxÀ·DH+¯ `)–ÈFï:^±P¥m…l Bcà¬ÓƒHëF#U‰ž ®Ò$ÉÏáò ZðZ1õ¤YÚ6 ‰^ ¦Úî×âæ¶mBÛúñ‘=æÁ´R”U¢”hKõ5›×k_À^Jß,©*•‹Ñ\Äjuá-¢Q<ø‘sEïv·È[¹áU‡¦àØB3¢¶Æúª..³É …a™¶º=AeEöE4zÑ ÞéÖüvc¦Îæâj±}S/Åê”b6û «Á4Té§Oþ·cºh¨^nîß¹¦[šcS{8~ãrÃ]›a ‰Aò‰s§×5­¶PÐÞáÀgüùèéѵŸ74–:ÀwÌ*ètVqìeÁŸ6é±²Š^ûˆeFÏ ZDy“]BÌáQd€ŸµaùµÆø9b¸³ã%_ŸÈTEŠµÚ‚oV9‘&¦ì@IZñÕ·zËÇÿÙ4¶Ó“;”'Ö/ìö~S<=.CªÂ‰ýDáõNÛýQ)¿)€c±§Çà9¥x¯Jõÿ®ÃýÀ -c›Xô°ŽWŠÇ7¢Fîm ˆ.ºcá:vÒíÜOµš=€‹z š#bã|[¤â¦ýs4ÚÂP3͵±pñÔ„ZÎ?<í *JäÎ4‰ð”OÀQ=ŠUŽ vð\-ä`ü}{üiI´äpƒH»ÉQ’AyeS‹tçp¥‘úÂ<âr7ºï;åšÂ¢'·'£“ˆ½´Ž¸„w¼AÌÅ–únw|hQ(µ]TY/Û§\Õ×Ü3€c°_Þ¥ÕÓ Zõ1  (ŠÍïžtÕµ´(t‹b²…²7øðbhq$ÛòK§ .´>‘7^ø¹Nq“jñ8 ƈ‰ˆüßÿÏÿ[ôQº]–ŽÎ]Ô¨¦N™¾.è(ˆ EcÑdxÈeÂÄ~¥vá_Î"À´j’%Æ­¼ƒ\°üݵFØ6Y‰¢N+R[1àìéI^ã>®TËTu]«?PØÝ%ïå3Î-k>ñxo‘-×йª¬l:^‚ífUnhl÷±ê£ð­±Øî·>Hª5«)†X-C¨üyúê¹–²kÓ`܃.÷³šSNÜTÎU±ì—C Î&1ʇFzï¦ììÀ½`º.ì¶X -’ÇÀڑת|–;†:C2F¹ £Œð6šò±Ü§+©òQäóæÇ…}‘ü-ò¨åª‡±†®ÅÁuD¼ÁXzÇ5Æ«ý¡B¡âÒ1+ºr±¸X#Å¥"e †œ1 Dƒ }?²ûà~×SûŠ K…Ñ•ä•ºŠ†yÐLî{“& ÊaòFBž?J´Rr —ÿáüWi|µja¡AoõÀ>à¡ä?O"i ŒûÛ3†Öˈ4(Í‚gqon)/r[— ‚ëò‚+®l†€-î9uÅ…o~¼¯^UL°2øŽÿlJ‡ÊZzéã^[¤ËåccÐe7%#']j‹Ñv %K“ǸòèAÉxìdð$YªNÊRÔ~<- ±Óà¶xæ‡#!¾/_B%Äd[S…чS*ù©+qt.ÄÏl)ÀÔ–‡Å¦7Ké¨S(Ô0õ«xb¡vAæÓ´3™TŸzJJ7Ð+”š³¨ñùÛC’7Òv"‰:‹õ°ÛÚ¬Ó¡¼ZS1ÊqJ”Gûȸ•yL;àRÍÖl_ÐÁ0Púx€5 xðšhZC„jèÜ\"rK…¿˜Eʤȧ´îSК™ˆÌŒ·‘í‰ÃÑ„åÌ:sø}yæ45ši'q® fôÏY_+ÀiàzJW|˜*KŒ¶·rTÈg^6Óþ¿é’(×çFÖÚÖµæÇÊæ²Î˜"Ë]£$b€×"ütùÍâÇ%Œ­G?"²£JZT‘}  *—¨ã-µ²[yyÇlZÔÝî*ê^Â`Sè×PÊVÐ<4Øi&.»Úºà®Ä‡ëŒR63$ÏlÎ)#sš¼Ž>œyÌèÉm}òìHÊau²ô´IÕoʺþÒ ÿÍOÛ¤HÔh.±ÀCY%¹*ë¼p0è#Þ¼dü¥âœaãÒØ7¬¥º·ÝPDäÓƒ ÔÂ=¹Z³Hƒ,Q.IU©rbÄ(áÖ+àåAuŠ¨Öœs)VÌ$WWr‡mˆêS£l*•.pi§ .«w "âcYÓ—ýBø xØé’4TÀÝÏ5»ÍvýB vwg@u°2|ƒ9ÉÂãúá– jl\UŸ/&ñÖbßo¾Ï!rXn¤$órHW™}Ú¾r@Ê_K=•Á_¿¸W8^z¹ïn ZÝ!÷ôåIHj Czùíƒ×cò€$*±…ê#5çço!e­ž‹e(tçðúXÔˆÇ ÍÏ Ub£QÞ•Û¤iaˆÍŒÉB9e…G)'‹—.@hê#ÓÛÇZ—¯Âj9±‹2ø8‡Ñîà~û R% >qS/¿[]!_Lyß&¶@ÄÒðÁOÒ›¹Ö˜l÷ ÷¥E¹µÛ”Œðp,ƒkõ܃@£™3ÈÜLb®{ÃD•¢Â-EkNó¾Ñx¶ü6{'>ªŠt¶Ñ‚S3›âÌ£P“yÎõ‡ì¹ã'Œ Š“ 4äïaX˜ñT™4òðgN¡, §yÄžcÕ/{e{ãÅî”#ð[ ’H/k»E‹G1‡Çãm íºä€ôcUy³ÁÏ~¼|ÅàÿR˜ü†ä35èi|ßDøEuò?ïãþÿðoËQýÞýÇqàO­ÿ/ŸØ\€/+‹|u)?tü“…ÂoÌþÿÆÀë•ö²1þ#ÿÿ(:Ÿä­‘è D‘9§«ºFêj¨rÚxŠ«CU!ïœ6`Ø}ËäïV«NÔ³™8´x¡{âØep/bɶV§}ÿv=|OŽ|¦.îàêÄIc¥ÈU…‘ÖÏnÌóf†qô"‹ŽûÝòpôÏî ýìô¹älùX;¥ÐIÖO 0¨ æ0à$ß H?&Ìï ½ÌA™±NÏF©¯ˆœÅ«þ¯b?¢Ò»]åœ_·“jM”UÝcŽ(±çæ»HU¤4>ÇK÷ß-Á¯ p¶‹*Ž#åÇ1Zâmýͨ8•÷£%Wf¹öÑ1 %éê.%½lÆ”žOUˆòý/Å|üᥪžãA¿|UéB!;9;Tfßš×ãI—{1Í #‚A©þ+‘^¯çýà"n+Dùå(®·ŽÇD'ôÕYuÀÃë9þ+É’9?£{[æ¢Þ¯™ÍÝ%Êâ’}éu´ä9¹ Ô}’gH¥ÿ]«š‰ã0Á2¡pöÈ£VšGðý!g+ɤ/̺®m%F”/SÝÍCD…DzLåRoÿ¬â) ”B²):æÁ=Ò³TyÛö¶&ÿ±—-³hú§ÃFÔ¥r[]Cyd…S¬¥ …ðØvqe½¨.ñ@ GråûFm Lu9—ˆZö…*—ŸW,½ eO„Ð…u©ÙVóȽÍèù‰1ຄ|D)#µ 8dNAªÃ‹ÂØÓu5H¡fÃty ÁŒÂxXs"ìNϱdq**¸3Š£µdÈZúñMîOˆJê‹Á£ÇZÕ*θpDÔ1G à æŒlvÄ xUŠNâNC^®¥.ºÐÚNÌÎÈ•tcy™>ÊpÿGáB>®½™Ñ|´Fãñ6®¬¹wÔ-bÞÑLnÆ>Bf¨ X[Ìj]ÐûzD³ü=%è3-ˆPÉ[<íR Š¸1ÐZ–•8K±©¾y^«–¨…ׯ}º\ýtc›çr]ˆ0=èôŒ‘bõ³DW,7“öçÁ2£¡æ€ó´°)_ßÌ Ô9cjGs0C­ŽW1ˆKí­yÖu9¯üÑ,ºòw¶¾°Ýÿ6ýµÞ7…çÔ}­¹”¶ýõ2ÑE]‹f8/Ù'f«ÒEø8Ã%r¢3º~ìѳÉR»Çˆ¿†Ì4Ai`ìJ€IW­r%(žsQ?œ‚òÈ_!F½†{(牣|+¤ÐQïÑÃÐ{²´ÔKÎCS髳¤âLrò˜¸YnŸ'«rNô‘‰„"~×U9~#z€±NíŠìjÜlWí‘uhÚå Óà ÿ`ã='õ@VP[&ͻϪcÒ`ØW4,FÕud5ül²èÅ^a铽ÝL6¨¦ÈÌ`͇w)*€&Ã$ȘŒ‚[f©§¯pf}½U]²·÷Gûaƒ¼\$CÙpíY¡È«äGi*®@P±¢¨´*ÆJZT1]üŒAÎÁBŠ6MeI>ãL¸£® æxԮ난³M,Í([Ð °.%Å$y@Œ²$ ®y=«ê¨ãØ&k)8’B¶ñžþgâí’â§Ë’Ý€I÷ÔÛ6¤Á—Ó}ÚÀ1Î;Y}VGÅz³8Ê‚|– kh/`‹|‚^†®~‹†_I˜~cwNýƒ%IJB„–˜ X^ mâ|zå7´Ï½§c´€õi·ÝûV$ù {<eS–s‰YpÒl›Zã¥B¨ Å4ž±Tÿî„» ©ýâ'}s83 Íö¹#ÔP+@ë<ÀÐ ^„ëãÔèY—¡(Æ6€/0 ¶XxÅ7mKôŠë rG *žÊ¶éÝàš›•]iñ8\Š¢¢·³¼È79äì¢ÄºòSU…™¦9}[’“ítÔqKÝØš4¦Ïhq—, h•Ÿ¾u D¤âpW65-wÍ©h•²ŠPTHn¯BYñF¶™7˜xuyGn!—Ê^ {c ã‹ omx¬Vø5ýiºB^¿wƒ!š pý7\Ö-è“Ï}o öªéÓW!M®HÐ}j+ẺjÔ˜2™Ù¯Ì:ú ¸—myS,‡C¨:¬8¶.ª˜ ®Þ¨tÔÅfÎEÓȼyÏu;H-?¯uuXóþ$–`ÉãtøÄ€Ç¡»0\¸°lG‚åÛ4ðó$ÚGEÌÎÐG¨U`}¬ý¹ÅÊKâå·^eÆ8Zú¡[K¨Õ¿Šô¬’$l¢xÆÕ9,w`(Ž·¤’ŽK×çÞ‘ZP»w\йÊ&5ŠÉºÒCFd¤ç Êéµ¾_tÛ­ôSÓ¼.DcbA†‹Ù«ø<ƲÏ4l{õz¡D„/^Çö¤\J7¸.\ºÚäAÀà/ŠÜ7mï_µ#Íx,z‚TùˆŒ;~š&J¿ÛÚT?b›üº÷_W¤\Å®)ÑÕO»"PÑ(ƹ9Ç‚nšyÒ’…,½Ìv>XúaX‡e¿F÷ôI ±— Që¯+õeÖïo®Ó„er„Ëg‹P)EäS!ÔG>n%ù"B5ÈFs­8øS~yí0 ò1ô,b“ý<85¹ù 7ܸýa¬æ©>€g)  hTp“ž†ÿÃÉyû£‡YO ô<Øû0B¦Çá;ù›2ëØÆn]z‡„QhßO¼¸{bzHÀ/’]+;Mwhô9ÄšÏ šÑl¾•åÏX4»OþD×õˆ­éü¡ùâ<ŋ皿wKãYݦäáp~™<ž²ä×3‹'î_yêÿy•ý97Á¸Lå}ûÂo¦oþÅWö& ð7˜W2ϯöQ €—¿ð&ÀÿãÞàq¥>Þߎøn„…383]É㨈ޟ÷yÙÞCu@ˆÇPÅ «2ZrsVI¥Ôž$—tÄ*CõI'uÙ3Ãûpä*éþ X"ŸÒêJÍ8AÝ~ö4Ò {¬B?)`bÔv|´É„úŸÉNrØÒF“[O=- &ƒK+ Û„ˆ)Œ={´€‘ÓªO¬j·×>çÖCrŠ…¦ë"9ÁsΔúÐë:(yÔ (×»àGÊAD„£K B133[A-)‹ëiºÆdU53£ÝŸ7Tm[`Œ…"T,„Ó¹­[meÔ¤hmdQTæÆš%ÞáÙaã͆ ÐYæ–Ã¥5hòOä¡ÿ…&Â+|xYd:!<©ê–ÛwöD˜i•»Â2ÈR€Eœ0±4Q¼±Jª¿)ŠKâg!ØŽÖR·È•k°É_9ñvË(¸Ë*ÚÕ}MŠã8OgF!ÛÃnévE]ZÍiUÀPîÎ^¥:j™}ˆ;4ex«Vf`úc…ìŽd×™¡ÖH·/Úb5yHéx* ˜¡†¬Qõ«ÄöWñ|ÎÆyç Ôå²mFê¥lh¤-ep …š e¡qjLsÛ ×ü`7»úpÂWtã±ùÜDÐÁkc‹Â4«„ô’߃mì¿¢C/váE`Á ´&v×vnXyÉÜ¥¬ šA”Šp¾«ö"ÕP8÷d׎kÇ2t‡%ãœ#.¿´®-&]\lY¬‡ól0å5–_IôûS_Õ×ðΈŒ—M§ì“Žøw*‚¶ +÷_cX$oÿj“¶«ÐZ)|Èâ½vR×¶`UÒD‚{'€¿(Θ¦¨c?¬:|ŽYgÖt(jŽïtÙñÐŽ›]!XðyïÜŒ¥H‘NÑ56–&¢xrß®ôÀ™óKˆ@yDe)bŸÖ?R}w±ÃA2LàmÐÆŽ:c”¥®nÞ´½ÍÌ>®UºÑLVÄÆÏ"T]kî:ÊJ²ÙZì/žº ¶.ÈmQ;éNуBÇÏ·CJ;•®…úG4KE†.“)q‘[äbzÎÃñŸÞ¤#„j]4»Jkg¥KD>í6¡B&TM¶e/+!£³¾+1Í$ÌòG L âjÒJÍ·}ÌOí8¯gó{bêZ­**É5œ•H¡¾oCGÀmâ;NqÖáîW€Ô)X|’ÖüQÚq2£œ{`8ÈüçQÿ C—[ ~=ûže»žÙ³×ò ¢æ­~ØÃµ0>Ó7›†fÛ±‡á]ÿ«/mD‡ýH¾ö&ªã›åö®zÎBœ'/£ôÝúÇ4ýä èþeÞ/s†5-!9D)õÁ?Åw¾ƒã·IçóšcõHçïx"vÒ>Ôüú-9”òýÀ\RâkÅn} =8{ådè>YY綆ƒé4 ^ç„`ì{ ïùî‡H–iÏ͋ݚ‡/¢„_úñ¡ê!€m[ÉmaWµß¯“¢Û8¦ð†#¼›«ÌçÙ&yn Þý4@ËøîÀÑmý濌 #¸^Ÿ:ÓôÄ7Z®d†‰‡…dnÅ?U±"úމáØ8¥ópdm'Ð6” F—qµ¤ÂD°Öê«ÀkMkÒ˜[Ý¥šÃ:Ä,n¸Rý©ÒCÉX{îñkþÓ‘í"½^Oœjº%…¡Á;§KôJ’¼6+ê“ÀR\ºê}gò(3ñUÁ²7ÁUP{¿TŒ—êm[Â+©R–v[Éyä#HG¬\ *ªPóšxY>¶YrGX‰€`áž )›™ Q՘߼ػhC B%-dÈt1‹6ªO9ް²Ý •wë#\§*G”ƒ¹#ìvAñþ2šy¦‡L)ÞEÙ4üuÇs\µºÛ§Üyؤ¥ìx÷ƹuIÑØÐÔãáQpk®hEf ;1w”FO;Q¹É}ÀϪò#ÔäñµòQ4—ÏÀ|2B[8,Ÿ§È,G_Y523K%Ì¡åÑÞýÙ¾’Fá~ˆ¥åßrÙ¼E>Å›"Ø&LVª¢ªžìÞÃärpNzzŠaä#€KäöÁ ¹7×2(€e²Í[†³’¡Ö´ÍqIxÚƒ3M”ÄCà²IžÖÙ˜@,ÇcùÄÈ š¥3T¾gèÔøIS¿É‹Ó¡@‘fûÞæ¦ëu]½¢¸²±Ê/Ý´ÐÆwfƽYNgyóPXö¨ Ç´ 1™iÇ#Kž·Èn¨[mHcòSš;Oá"E®Kå—7ïAò¢ 7Â[Tz„☻±j3~]Žó1R¶yümÁb0ÅΤìH5,/–88Qï-¤P}سMwÇnn%¹Ý+å½½™¬–¨32uéVæsQ»ý»$ìh&>wØq=.U3YiÍšp¿5ÄÛ¬êG¥K͆{î¡QopÄÐÇNÉ‹yËößP)Ûü%öìÆ8åèÒK[hn@?a¯0R΀œÌHqÉÜO&ùXÃêmb6R3ö…é3Ñh#Íöø1EÉjŽÄn“«áÉõ‹&š yU¡úŠ-±À»C£µ §— øìÑ%äC±©Å·1¶a‡B» i WÈ'³Ñ{/6vÄåt}‰ÈÂì(xJiÄ43yA¡º’éæî±@*úN®8BcôLûÔÐËg‚Y½@Rì ¾È" òûJ‹p1ÆÙåÔYQ*³^;([EcŒXGõ¶pëà   û“wä q™ê¥¹lÚÂS“ÒŒÇÈaÅxðIt<†+4à˽5Ù¿ô«Íý WŽ—ÊÞ!GÜ4UWZI´¾,óJU?þb¸uÈ/ÈæÁX‰˜¬y° ý'y°¿z¨3À%k©öúsÞ§Ý"HR DHGžçqY”ƒÞxó+ˆ¦ñè=X'ÃcÎÁ–x#¼Ž<ÿvû2;Há†Å´œÔs4K¾tÃA5ÿÈÛ^t6Œþæq.{ù (/ìJΩ§ýòMT¿ ²r”mœ¥ˆ} rivÛ¼5äóBŽ·#÷·@‰/äÉgMîYop¯ò{ü,"z+}V«Éóìÿíù·ÿî_iå7áü ?›ïéø;_韂ïÿO¼´c¼í¶„?¹*øò«ïÿ½ã«·OÈÖ®1Í›¼áe' -‡Ö™ïªkEÕ]Ê/«x d”aåuo›&ÖÚRàÞÉI…¨•}’Pë[ËÙZG-âñ,˜ˆf…ü2×ÈzAmU8[óÿcõâtžaèáA®éB]‘£LNŠzÓÛò²:]Çv’‚^ù|Tb`™ø|ÜbÑ”DÖ°…£! ØN€ Âhû­¥ 7…næˆÓ¾öØàuïB¡j>@-¬(Zos¶ ³Ç™½Ë¡N9·Ï¾™´©º3’1Àx*Ü”ÄOñxÜá@–çâÈ ŒLÖYGÃÓ¨ÔŠW¥*Þfüì °°Vv÷y$äeüpPãǨ Ð@ù7¯'½ˆc¦Ct… œÕµéÅ_k™ÙÞ¶Åݨ ²$ P¹ª$ãŒÑÔþJµ´,º®b9ÿ‹4DÿÎxâu¤?hb¥†8ËGò½hqy0ùÜ´úlC:ÑZ๋rÓ…ß ­4@¤TU¡UN=§n¤S_-´ë§ƒð „>Ìïíä@yÙZ/D•àÏzBêR9*/óݱÛ²|,}¼öƒÊÔÏ_2Ð¥ÿÉ•‰¢#‹hZ ó¥e?HaC5&‚ 2ÄŠ“§¿ù¡,`ï-Ésß&@œ+-r¼&1û®¡NZÇ2~ÀÞ¢)tɺõ—…ÆW[sVƒs­ôŽ0rVy.+}aå 3MH¤I&öI1[·—Û&Ü:LT«:eN˜…âÁ¯²³© Æ4í&?Œ^GYõ¸ZmÎÃz5ôÈåÝ}&€ü¥øoÓ`R‡!=ñ¦.¬µlUAT fÛ‰ŸÒËægtÖ¸ÕÇ_·ñ …Ÿf—œáí¨b®E¶‰j‚Úv‹®S‰¾a]] yW¨“×9™ßq•/%3e‹WÏ¢M¸Lpé•i'Â,¸oüP.iªßüž]ÈÔó,ÝU£PX ·Ùr‹âÐ_ǺÜpz^? ¤ÜÑæ-"kS¸p‰lÇ)‡iBr“”›Tõjå˜f»Û7”®r±Æ Ðt.£!ÏDv]ßa‡–Lu¬¼+LŽÍiΡl¥“þŒ›FxñwJ ìªQ¥,C2ÊÙc襼÷ŽþÆ!ë“·%z†390x¾ùLsr´´Z”zT8Éo²-Mé5îº{!Ðí꺫;ÑcÌžj7QXýïözâd}Š Ìå:ãÜ´L(G¿„Êmâ©››÷Þ²÷–œeöNã©¢º·µÐ©!/ì©-D±ËºXÅ/ª¤îWÉÀûà µ—Vˆ…§¼ñÃN—8"/Þ¦ä„Öd¹ÎÀn eQÈHã=ÅíÊ °Éãc‹Ã‰¥¡ã™|.[@^0i#ˆDn©hÆí¥6ŠØaÔÑ;äe[,ƒ^ß³PÉ"XÅÔ Šjn·Æ¥roÙR@Pm€¾9^Sîœt-ÕÞ½@£×˜‘BÙb—€‚ìvf=VWm0€-üà[Vz7V¤jãZÊ÷߸eS°Æ¨$•ç®c L·¢ˆÕ‹ë5~ûn´ŽÐLÌó}S™lwTc™™‰,] Àd#ÌÓ¡¯ã²eN³%?z-`eêöýø|\€è¯ò’AxÓ´jLâXtAªYÀ¥¸=Ð×Ἤœ´Šòܤ6ð¡K¸û{¶\ ýÛ#Mx™ïÄÔŸòMÅÓü¬7é·™l»V&Ê^t›ñgײÉ'H3Âaú¹½…¥3[YK^kˆª °»Xyº=ŠMÚº"¢ª¶ÍÈ[~+ ¥ÝKÜoõر°ù?³Õì¸ÜR‚ÝK»CÑ4ükãkN´¼¯¬~^´ ®1݈Ÿyá’öëv =êÅ‚*ónìØˆÎŽ5ÒåxMHC×à gó.ÇBLgˆ¹Ùª§q½*pü·c²©ihWU¦Šw¸;@¶ÑGݪ §á8#tƒÀ–æòĶp ‡•-Òà *›šD¤æH¨J{Êv“;+×$ª¸üpF®ø{žg¹ž¨å6&nÉyá¶­Ócã®Tê£à(ÈT@j_ƒjY—¸yy&–kyµž»V£Ù#±w=7·øÄ,>ÒØå_œÅI›z¡ÂÍyáĉ;žç–ü7Eç‚Ta‚µŽuŸF0Ô/ÛFÚ.¹ðé ”òV‘¿¤¬Ûô‹ßüaì¿.-·šu+ù%”m&ûÓôŠ WHÅ¥*³~4\ ›Ç:ÿˆ€DªúŠ˜™ÿIΤ l²É/*>LÄänÛý‡É,`Û¸ †Í¤‰,@îO3“{áJ¥ÚÈÛŒÂKרÀE ¥²-¾åJjî¼ô´²W^qì)`‰.Øvô°­¬R¡ÉöŠŠìît²yHs'¹áÓôb½æÕ­Ë•áÎý¨¥ˆg¤÷ÇÛ6í¾zþãV^1…ð§|þ3Du™œ=\aÓ下D¹ý34£¬HoŒò²;]ªê@7z\¾(UšÞY yræ<Çð6seYE>mÛ¤bE.ÂÆ9Ÿ·Ø2Ýã7UMZiäU…¢Â-f[£ eý3ãvÌòý¶íÞ÷ççþXXz!Ç4nËÀ[ ÆË˜U~îÂÈ‘¢Ž\PêÚì×ÞqPÙM¸ªàŸ¦Ô+Í Á7œ€nààqÑ[‚ýÒPÖJ˜þ˜êñ¾ % 5µ·ïßo–©Êmi‚RvÍV}&­¡‘XÕI/ýl®ËUå¨H|¤ÓS×l¢3+f­=ÐÂ?ì&Ë9&¸4óÄ9->}Éx7âŒU…˜ýEVÞ¬ïìÿ}éÖ¡Äè7”’©å{ïíéç%ÔñÕ7ŸÛO…ÉEî‘*ßEžê9+^Sž¹w’(ßd;þHýÿ©<úO ¼üŸ |oÿ;fòŸU pøaçýÅ“À»!ÙÑü ð‹ïú_üôøOð õÓ¡ Ï)À‘°êçB•˜¨ÃRé­“bçœoÍøî(/jøZ£ª2×´Ú²Ï~(Bñð鮌“}ø=rŒáœC˜n5¼º}qHXQþR׉ í~E­éÂÛá:áÙšëFŸ.ƒœ5ÎÇÿ›ÿÖÎkÙR|]ä){š÷§µ±úA÷Àõœy‘"r¤­ì”Er_Ú­ËšÑ{6´aKªV)r[ËT«@&Öꃖªgé·©¶S0(¶MÑÓ.ÆÅlô}¾åÑýûfÕŠfSXšNȵþñ¸ï2ãÁÆC6ÌüÁ(mzȼ1òŸ¥ ÐîtÄv¹nº1ÿœã äO»D¦Ü?@òm–yr$îcrà\‰ùLiñQûÕ‚(Á ~ ä.«åüÉé–ÞíÕ¬ü­AÁÉ®‡¼æ(Ѿ¡äÅZæ†Þ/ÇÆgbV„¤ J³Ð‘¥~œ=¯}cfÇ¿\‘[…{—ÊT…[‹‚ ¹‡“¸-[Ò”™Ö5‘•-¿=Ó‡”îÙèYe%ŽˆŒ¿{2U“#îN5šh°ýµ÷ªËÁ dRÅ €±QwY)€…“Ôoêµò_q—8"fLJiVNÖi[È–îjb$”—‹ü· YN@ÙÌq«$~íÛŒiT8ÉëþʽeZñ”.™9U<|'),‡i×BSé>Â$.dÉ•ã ÛF פŸ©ƒßZCho–ÀMT•Ì‚¶+¢-T €W/»‚ÛT`o :²Ž<£ Ïå“0¼YR‚( I%Þ²…‰>áp_nmø3gÇÁX ›c;p/“g‡çPÞ˜ÇBEñx¹´h¼E®@q€f¼¦¡3¸\©Ü»GÑÈBñ­u©™kÚÞ¶ëº2ê8¼ÆƒÀ¿e,HìMóqJtÉ,ŒyÉ€Ççä=]pÛÝÍÿt{¹’ðfißñÀOXam„¼)=þ¡®X¢Í“öǦ8úLä Ö¹³,î^‡Q¶â^½%JX€´~ˆæ#ùfXfw£¨Å0ð—³Ó|m"äž ®?ª:“ʧ"&ÞšÏêøª»-y0]êöÛØDF<÷ˆN„kXñY¥¤8ì‡ÌÖT(hž’±|õT7…(aµç( :¤¦Ÿ;‹U6HáG{ð×63®ejÚîgObv‡%(˜?•Bð:‰4@º-´ãÓ„;w¢#¥ìØššŽ‚¯-†6.-mº¤¬¤™P)º´|ïcs’VÛœÖòl«IŒúhííÖ±­oGS,޵¡·ñ¡6#UÃ6nÿ…%Kd“Æ€“µÍf>/L¸mì)AÔÛr`¾|ÊÔ{ÆÚˆ;ã«€Þõ(ÔsJìñ˜8©V~‡Þ*ùœÚf Êxîñ.2ÊH¬À${4=b%`¤Q–b[D CŸçŠªWˆq~}HgÖÛ¹ÞSY4=pš|Ý æ3S¦ðëlz‡ì (‘ËK5TiŠÏáæIxžƒ‹¿ý1™'oÂ\@£;¼¥&wey£P[a¢€?,_utÚ™I ¶’¥O2Yý„Bt©‚r¡3!~Ç»»¡àØ«˜Pi¶ƒ(Ãâ1õ;nï„n3Æ™O׺„ͨôHë sX¸íÑ-v›ýׯ½ïO³ëÿú+®¯ÿ»·Ù’$In5¢æÙ|ÿg¼‹YÎjÎe…©`ò«æ™YÕÕ$›ÅC6;+2ÂÃÝLM|@p(Ïàa RÁÂ2¯üÍ! ?¨®$Œ4 fà*#‰N¬/à ÂÖ…aomm4ˆÒ,BÓÃmÌ‹ê<³_ €‘*±­º<¨Ð–ÙÕyÊ>îx” I4ÓhZH›Že#ä‘kæüèÐ2Î/ŒÍDP¥ßwˆÒÔªû:´ $<ºü˜œ‰‚À<7õ gªþȃùüÜúb®ÎÁoªD='Üáq=ŸÜ‡·â ÇhŽ7ƒw~¦ü<&3Ÿ«~y~Ù·üð™Æ:Í8o??×ЉŸHœBåïèòüpÀóUÿKp:OEðŸŽðóñ[@Þ®½Vöñ31ýC$?UüÿÕïÛ¯ZE¾¹ ~—ô)ßÐ2ýpA× vJc×ìR~w½¶²—0t8¿)µ‡ p‚aì²EAK@PÉ”e/y•ó3åxÏ;ÿ«ÕÙ#²é$(PùvÝòoƒ0]•ªþä#8^;žrÊqB‘aNó~쬊cl>8 ù÷‡þA<”l©i9†ÌÉþ¶a—ÐäïÏI Æ)Ì$I¥C„îu˜…†…¿'%hÉD„sfIëí¬é¬¼BK‚OµàÑ‚sÏ f³ENI»H¤¢Ù/ÝÎóœ4L»=¥ŠCëã=(ÙyS;B| ÏTÎÀ±ÕÑG¯¯cØSˆsf©[í‘IM'ˆ€còÍ=Lï¾Õ€†mÆ,²ÉÑlA/ëBµ-©§“˜ÿUr€@@# ZYU+U`rôúÊ£çè0ì7÷€M!xàz†¹sTO a¬OÊñø‹Ñ¾¶Ð é:ô8<ãâJÛ1ý¥¬_æøPà4=Á\ÅÓ`ÎY¡ì^žz•f–wBLp"ÛHH£Áß-É®µ[t\…ÿ‡±{mä-œtß„µ„fÄTQ•­^jbG¸¹Úˆ²GûBrM¼zf ‰MËÍM%,ä <° Nú¹:™–ô®ŽÉ9ȧ®yõ1 õ©P—.R±¨¢ñh»dvA­u½ÖåÊ­xë¼¼C ýtŸ§ ÂÀ+¯·?ër JåS³Z¹Ã–²­õ¸„Åò‰¶îñ$‡¶.ÁÎSÆÀ±õé¥Û!(·˜Bp©K¨(ü¢\¤9.lÓ@o¡$'³ÇÕmS?óJNn§ ÒQa%ë< Yq;ËÀEáAÌoc‹¨í)Ê2Þ(a\ƒ_ä\^àøØ÷­, öl´-¢’jŒVcÝnüÑXifÛ¤"41ÁÊÝ3<[Â,À²g–èŽ3þ)Fã&_OßÚX•9N_êRÁÐKy” W—[x$  Çn-#øY‡}òt#Ndû¹þ@žÿø zŒq–ý¶…åQ[pöWû =fý«œ»z˜YõÒ*ô»5dÒéK‚7LΑmfÜÞU;Ñ@t•4tÁq %¹oŽ· éÅã·«!pÐ}/ކ"—¹¯¶Ž¶}†§ˆOTóyN†žM¥U<0ð–Õ]¤_D½“ϧœåç àØ= RÁx¿º-œ5è™+F3:«P¡62µöf<÷˜z£°¥j~"tz³öÀ\øÏZ$´©Ï. 1·ê´ú¥H$=Û!Û?¤äuáb‘‘µ¸ôR”+Šzš‹ÿšÿ!Å"X^ëÝmìk‘½o]í“[ fZB¾Dd%S.8CIÕéÚ±<øJ厴|’’¿¾–ѲjÐVz_­ØâÖP}IP¨r;!‹4t°¤ º5ë$󬺇£ÛQYx'‰†·JÖÆÙ8ÎHÜä Ž´Eóטּo;Ëå0 ºp˵G3tú¡Êj5ËeãÐ8‚&|KÓ®¥žöʘ¯={ý”¿Öü`¬7’o>íä3(ç]Vz³½7e›Q­tΘB„@Oñá(‰Û¢E2ÄB@±2Ç;̘´ ;=–û ä Ät¢ªùulÏòåczxPþÌ|OãzbJc*€hß-Ð@/š({=éµ£WQï D›ˆqŽýX«„š†ÔÙ52kÿ‚maõVo—Å X²4¸U>I‚¤ÝÑ4œï~uß^¾lúmü…Z==T%LýÑ¥ÆÝÓw…÷VgÃ÷&—êu­½aÜP®¥‘Œa”žÑy@µ–¥¢7dØ$"%ª¤éŠ¥ˆÆM-àðËji@1 Ŷ÷vï J¹h›fn¼chšØ•=Í6‘¥abšâÍ'fR³2‘­£é;çDUÌ(`õ'Dê!£¸Å¾»…²3<cêäJÕr6èÒKh IlÁ¯/Ÿ2r8Wo«ŽŠÚçÉð(‹z ©ÆZ ±_.ðiøqèc  —Ÿ¦pof)Hd#'æó- ÷1Í8Er–w#Ê|ž;‡ÈØÐ¤úb{—WœƒÄôcìzcì‚›öbd®„òǾ•g¶rFÙʸ›Š.]j°7s³O°›[¶\+äbL8â†ÃGÙÆ)t^ŠØÎs™Í:ÑÙ6,¡£Â6˜C;È.[)‚½‰½ø×R•jƒc¢ÞÒÍ&–Sw(&…N**çwì–]¶OO‰-7öÄD«+}NR‘õþÔò€ˆ?¨ïí£©QVçCß´øRí<µ@q'Y4‚_L‘fíðͨ¡°Ì=ÁûMK“¯m?0œ†–^¸¢}¢ËžEŸ½A`b_÷ÞÛhV ܽWÈn¡kAdéýÇV߸Ö6ˆÎ›z¹|;ûI#ëŽûCö(&Ë ›–n±E%…0æm° zþÎ)usG=øõ{ÀÁ´Qœ8†Å´¬Ã”eÄBíœ^9š%¦`1&j ÝõhHWœ/˾ïËO—qÃ}Çø¤áír!ñA4~¯iK“'¦·2”£ÀÚ•<þ†zŸ\¶JŒþD…æO ÁiðâOÄ@;àˆßù¯Ûˆ(ÏØÿ¯Ø”"Ç¿2—ÇÇÓñ+Êñ[öù_©áÇ%ø­ýŸ$jÿœâú­ªÿœþ¿@ÙýgÃ?5€üÙwöß' €çÜ ä¿Ö¿úìþµ$Ê?wðs¦å­È€¿YPÓÅáNxŽppÒxšfá9{jºWB°‘p‡é{¥ -æÛîh£ÅñO&c¬…ÇØNç*ĪóŒ%®Gߣ´úHD1€õ¦5²˜æ4O›’'„%ö`®ÚÂßÿ”òœJÏ)CŽd9Κxyþ-$ıƒ™„¯c¤ñ„‡‚\?"v"€ØïúÌ0Ù†ŒÔ ! uu¸sÞÐîâæô3€’=Ùtús±.¤¨4«(Ë,VÙ‚‚ž᡹Uÿ’=w2ýœ×ù˜´ÄQo ÝØÚBúÀøHF >‹ø'‰K¤¾8+çìž?ö¡… ŸÄï¿z>]ô§KN˜T¸µÏîßf‡¦0úTPx°ÙÞ__BsK½ŽªTu ­Ëµ å çܨØZ…¢9L»ZŦåÖÕBÝX:Ëò¯é2-Cö[hj¶E¿ì>“¹Ü¦à…™¡‰c¾¦]nLΠPƒY‹`IóHwÇΚ))—z¥>ƒ¢Ã„;ŒïpÎ- Úƒ}N£ålgì?Kˆ×…,gAžX£7·k ;œZä ÐA€šÉ•j¿ ×ydÂÒÐÓ¹²\4TU­3¿9ó½WÛ5@Ï…¥1ø Z=†’úÝI6;v¡~iÆ’•FÈ-òºô%bÛ„1+b,/ñ»Jù”«@2:Ò'rÍeJ­ÎHŒ‘MàÏBs:oôªéŽî?îZSlV€aÙÞùìñOcûø}y–@º`;j~ ‘˽qF¨\G¶X\C¢q§Z]¿ ¢h†aÐCž¢´) ² _7_«¶ 6.ò¶`ˆË ‰Û fªKœŸü6˜\¥õ š_¬÷~$7‹¿]¯Ñܘîà(g?Ü fóad”/£ÑnW]LT= éÓœá‚óô%ù<;Ž€L.µÂaîÙßÀúätF,ªÅÌ\‚ÅWú -Dª’£§4V¸5Ú,çTf¢ ¸Í †G‹Ö?ÔXôìÿeL‚‚36÷ idóLÄ‘å8¶6‘«ðЉ}ûØ®2"§‘”húñ¨X^Zî_Z…S¥³9þÎlúGJ@¾î[<Îc²D¢P›ä]³ÞæßÇãטŸ_øu½3ã6¯ËGÚÞWlu9iÓÝ}ëSÐúrš À’¿¼~lê©Ëï\"ÜÜ415÷â„–(b&·Ù%ZA:¿ÚskánBΠáQo/>biưàç6¥‚FÙÕèŽ^°\6.š0Z±KÅbîN4‚ Îb =Ð"’œÕxØf z„yÓìÝ@×#²FŒµ_±àøb'Þ1¾UJ&•¦jÇudÉ1ÙKW”JxËõAl®zÏTvô‡Î%_{GXÎrÊhù@µž ²´3à)÷»]×CJµRq¡®l. ’ž%ñíVš•KÊYE_zS"}@.‘/‘æ} {KG·XVº4{ DìÊT„úµŒÿ÷ëËLê7'÷°p:‚ÛùñØGd-¤yãXœ”³-BÐ4ê+ûºù5žç¯F†­>`)ƒ;„ÀñÅM¥ñDŒ“tžH)J(®™M6Ú¹ `JèøÚû… ªËù\‡|JÁ‚,MœÛ†…±ž!“QeÌîÝ–öB»s ÄÆÉøY^bVAˆ×•oê—êI_˜Ž,—Mÿ°Ö`ÿ¥WŒhqA²ŽÏb×¼}"òà®.¿Xïmݨ‡ñÂ9o%qÔ W§Œåk+ë9Ÿßõ¨eövKÈÑNj¹‰«ƒv~:rÖù–Ã]l4ñާªŽH©(qŸ%=­nH¬@·²²_*ëìäG¬tÈRÒp!ÊÊáŽèÃHÌß½ø9AªMGŠK2Eü‡×º‹ýü æ_o&5JAW¿ŠWnjÉúc¬¬êr1Œn¬ù¨:¢¸3è7þ:>}4+ÿá³8ù?\qÍvÇïQö+' hÚï‹áãDcùõõå5evQŠì€ôÇOscr¨Î …Ö‚†àSŠ6ÇG0h43ž<¨°ËÉ8b®%.5æes–tÅ5°–vmÅÁó*ó2 ²g¸³,£«sŽVIT8ÿ|`f²Ã_ QÙÛª~„YëæCMÒÌùÎç•à„ö`Ö/ ¾XT£‹uláÝÕ\ež‘‘­’îb÷YÈ‘ ’F³Ÿ—ê É‰¥WÔÍ€0„hr°«Ò±+Eðu¢£Pš«XåšC#È ^ÊÛ…FO3hÞçN;ÚM{ »°ÑØ(>²…6ÁxÛ[ø!ƒ—–d ÜØµ›ÙÎí%÷ÈûpœØ²k©çes¹Ì̯^b-ƒQ¨ú _Ü.Æ®šVò£ñö;„”k‰jÜ%ïŠ/ï^ (,†«¡Å©ŸHC;L Æ%æQ˜µ¹c?}Jª’Eˆ ߄䱘T⫌vuù±ãGvc]tµ²ªð ôÏoÚCÛ8çéŽ /§ºo3íIïÞ¦]C¬_ Ïû .&ÖßdyiiÌNó)ËÞ7\Ûso»†u/u˜®¯éåŒy÷ï6¡nù¢]–îm®# ÄKq]z‹Ù†ÙnmÚ*ôLSIË©Ñ<»ó‹¥ÖÌ7”[6äµpù€É¤…¡ü\£ˆTWª!ÞâЪ¸8“i½KC?¢-ÜUb‹ë1ÊhDÅ—ÝßOjV霾k4>PÛÜ4ÕMáÒEá¾÷¾iy ¢-niG#Aü„ë–VÕ‘$)0Z2à}ï‹¶ë(F¹ÍlÛ—È«àEÑÝ…ExÇwN@U±–B—ê)3R  Zx)3Qáæ6EÓ¨ ^¾3Ѥx®º¶‹y:HGôÑó[†áåùÐɪ >äËâÑ ïnõpDûj ãÙÁƒ|iïΙԒåÕ9Þðµ‘ànS4³ùl‚Ý>zÃÂê8Šúá³ ËÙö”i%ž±º@ŠÜ²)Ã]º ù¦¯ ÙRès…ì€Ìû¶Áî— ¯1#ÔDn¶%<Ìn“ù IDATßq6ð'²yv<Ro¯õè .,¼TE_û^[î{ða®k{qôUc•GÙ߬Ќ ã.§Kp(í¾mš"âø î›ˆ¬•ž2ìRp7·×Ú—§ŠÄË¥R󌥪VK$LL§Ù* «,XÇV滋׿⣞‹1ï€s·Ó]âs[nÆ7Ër½ŠHøú«> ×Û(¹ÁÇÀ­^‚ J4%ð©ó1ò1²„7GB§,kW@»o»SÈäÞ\Kºé,v Ôdº²ŠœV?>”Åó1¼3ÖKÍh·q3û¸k¶‚SJÁ¸âXv'¢uæfÁÄž‰zyñ^×IŒ…j“êÒýª‹EȇÛ+îí}[âøl„ÐûÍ59„nrÆÀdzÍoǸ!ÇüĦ^˜²\.,–}~‰k›VªâRè³úÓSþHwÄn f­Ogû¸**-×]8óTŸƒ ÒÎXGð0žs,pŠ< öî)9Çš¿)Éò3Ùñ óüÙÏË1åÂ/ ÈŸ¾“ñ¸}Ô`ý®ˆ}ÈßÀ,Ÿôß1>ÿE‹<ŸcÈÇbäBÿ3Q‰¿bù~ÿÿa𿯠X>dHÞ¦Çò˜ J_æ<ñK¿£ÈÿüÝûÛßÛOÅPì­y¹í0¢rjsX‰„¯Ä/Ö0¯6Dd>SJÓ“Õ™ªkAwj`ã?>MÕäÌÄ÷IQWå,Q>Ì´—³ín@Åñ£4ªÅ„HâGã˜ûX0•ÛòÌÂ**ä&Õ|ô˜;‹ÉîÖÍ-vɧœ‰,ÁB8#ÜP\Oª]ËC×_vWM˜¢Œ¿lç¡êJ+´ ÿÏÿóÿj÷a ÌÂÏÚ~8¡)×SO„ZÔ-¯ÆÌAcŽ<2שŠEX Ê¢2Xf«œx‹‘K±6~@Un¯q ]dÒ ¨PõÚmÙ¦ŒN:‰âëx[Öò_0¬‘.‚ ¹L——,ù=¿»†Ÿå~­Cv‚>vÚa:ÁPaoµƒÌIˆDTLgöcûgÖäã}¥hè½*Ë“L7 I*$åÞûº#U$·a°Ò¹càpe©ÄµØRêÿ\ó9¬BŠ)ÔŽƒ2ôÂfÅ%È鎔@ð@œá~åhV!º{™µè¦ýgè.ñ˜©Õî¦z_TE,fs|êëiŸ“{†(ÿÞ^/9 ýº^ª²±¹Y¨œÑç·èò]fæüƒˆªÉŽ~R_¤¢ä¿ü&÷ÎW¥UÄJÿ|Eäåj*°Ö1“í}Áܶ$²i‰¶ð÷’brç´”ƒ°_¢dÕÂõv[˜P‰Mj Pp¹•9¥˜ÙÞ\b·÷{+ÒË@³uA‹ôE—^ªÁ¿¶¬$6³ÇÔŠí„Á M€]LËÆGKc¤(;~~€%¤¸8Ù|ʨgÖ§ý2Ó@¦ˆ:ƒŠ^$`*6b·E| Þ´4G/ëîMBi†6ûÌœdŒXD`fú:64 ';£íVë"dT¹7îí¹@¬&~̼–Sr3LÜ|§>ôÆBºðª¶BøX¿å† ÃÇB1 vŸl9y:|'2£lÑvÍ";ÍäUrxd9Ñô²ã¥ªŠ¥*?Do•/gƒõÃ|oóx ªçÎj¤ìà¸qjPæä/;XRˆ’z¹w ´Œ[™ªNÕGccOf;¤çÝ'2ç©ÕÛ̺•*›å„(Î b¢dAyR]ÙHì@1?“æÉŒAõ˜ð’BêzL-Ïî¥:‘ì?µëΊ6] ÚmJôÚ_C³ ãIŒužÄ&³“[¶˜ÃÁRû²û¦.ë.a¸ñFâˆ|’4ìR²ץ䵼›¸oZåö4 5*€ìM]A>Ê£\ˆÚûçÙ_pðq8fÎÊÃÓòD0]Þ*¨ã=Çf@è[2ö~®üpÛÃÜÍ©pÕ$0Ì‘­‚‘Bêý¤yôèÂ|†u²¬9?š(…‡‰´ºPúgEMnûñôø”íèWñ(“Á³V–Ç!öñàZ1CCçñ¿]îåYTi>Sœ©uº® ÞtçC‰`³:¿?ßÚßèÙ‡|Rû? ^>ªÚÓ}tmóM`>TÒ!ƒ§åYÑ0þL„ÆOÄsüöøá×c€¹æ>]ÓooÐï+ìøûtÿŸˆÇø;rÿKÅþïGmßYÝä¼Þ¼>JƒùMà7¼ùó›=oC>‡?þ‹oW¯AŽ„µZ†ƒDª:µŠkE@Q‘aªŠT¼òÇ‹3sÔ ŒÃ ý_,MÖêf³.6 ¾&ݺ(Ih咽çâ²ËŸ›¸q…xöïD·ÎÁ¹D!0³r½GLÞèšc¦ò¨™9®:-{X€æ£öø¼†b¼#8Ñ@’֌ÛÈA<93 ôž¼1AŽg"=à:~[ç¦[½íÿskÝ3 î˜KšŸªbYz¬©‚ñ³|fÓ,ÃÜ£÷¦ ?a\© /ªDá´ç?qVæ±ý,x/¤=\· õÿmïfëvâ¶íã¨æ·³ÿ”èˆÙ*<¿[ÒXªß¶.ÎÁ}9sõÙèš›cU¬…µ®k½^?~\?0:놳#ör§ÙÿSápˆLªîjÖPGÅÝ©€ù±kú4µ­¼ƒ³@8Ÿè4¨KDó·v¸ ÒÃm?*Š0¿b8·¤¬ÜVðh阚½ÁÔÇs«ªAÔ‘T‚¢S=,„ÕÛÌ_KFp‡-4;ö­Yë4G"i­ Kë'•ùøÉöD‹ø®‡šxù³+bºT¤qÒ™ýÏ—Æ8`¸Ú‘¦:Q)ÜfB®|3¯µ.]ž ËN’²©öÙ[·È¶>§aÉÕ,‘íU™þŠøá†ókÓ[ òT—Ósž’fþyç•7Åñ>ÞDP³D ú67š Ù,.!Ô!­qùj/+4¹!øú&.äÒAvƒ(N,Jª«ý±½°eþcS¼mò“Ob66ÿÿ¿Ü­œ*­ÑÂXÃ|õâ$kav›”Ѽ&ˆÝz³’'lÎ?ß¡ì›E³÷hë¯,1 3¸k;/z(^—^—߈¸ÖZý6ìYÀ ]8刋5*{µ“i­×bD}¬‚=d¸Ò\¦.ÁqóŽ™í*Yoi䮸*à‚¾tùÕ½tÕ—Œ‰¸ƒL?'z~d×ÇÞ]"êÌë±t{™dNt4ài° >Òl E—¯Ãn¢ÌŠ‘Œì »LÎù×~ú=ô$ÔP‹‰ñŸbf~{ÕG7o-_”~.]kåÛ°ç– YÂ1²J`=Ãì‰+6‡Í.=k¨ÉMOb½BåšL¹s‘Ü{œùµÑ ¾á»²<Ê‘´€i c€'U la’áA‰Èx”Wz­¸¬x¡‰ÙøJóüˆxüé˜)hdP>|ðeµŸÀ€ÅO‰k¦ßçù¬ï©%¹·9ºÈÈ–IÖ”ÃçƒèUŸÅ³B3Ö+÷6›m#8â2Û7¡œÑF‡^;Jd[îÛî¯\@e,mÊbdëùŽ9dOF%+­ Œm c„ª\/Õ XÙkSœƒüÆÌÊÙUÁ-ß!¨\KËíÂ(ÞA¯çˆ]…•º†[‰V©g¿ÉÛøµ÷}[ Ÿ¾twx±=ëhGÁá´@­^ ïm¶m;öϲ˺ÜB@Sο4îQË8y–+ö']À_ó¶‘ö”Zº9éZXk-ÀÈýµÿsï½oZvðœ~ÝMÛÆ{›OYxDJÐdÖ˜¦Æ„Ïh7ä=vn̨+cú!),­Íâx1”ö›ä~bo³ªl9W è@Ä’FÞBõB{ˆ÷¿QEx<±¸æe^v‡wG^ëõãZW ðý]½7M)v\rcKw§·üh¼«»®h…)xÐËøZ]y@ð4mÌ µèY›KA¬Âïö.I"±Ç*“î)9ìüI‹üŠY¯uü }·æïØ8Ž_©-<ö½ÑržF%9 òœr/£¸‹Ó‘>uòP÷OuÈ.x—Ù˜Íïp4ó´6 IQ8«ó:P“Üo ÍüWΆ°4Yí=òu~½ïÿŠNšõIÇ·ý«|ú0ǼõøõÅÿY_Ÿüì»Ò>ñ Løv¯~†òÁoÈ–ø3Ò&ò/~aÞþsš-¦›ç_ábÿøÊþ‡î}Äߘ[ø™xêøÏÛé˜À›šþȄ߸2ÿÞ‹‚ßÿɇøß¸0ø‹´\í´·¸­T¡ØÜÖ·r puÌž5¹ÌÿµÚO3i6Ãd?Vy¦~?G˜ï…mA˲X.{"Ÿ¤5÷Žö¦±Õuʈob2‰"Ìgp<„Ùãag[ê®ì/ÎãAþL,zýahÖ¸j©1ëÄVg›æÓ¹#õšûmg"‘ã+Oàß]Æ9¢\õ'ãäÕr+˜rѬ™‹dzr«Å¾ræ¯?²õ|Ö);âÐæ‹ïsÈšë4Dé~æ¶9ôcÔÛj ýþ4?6ýPGÇäc¤Ä“ 5þV//ö¸ \þø‰Ð·ÍÅlD’³òQ­Ÿ>ÕÏ­É5ÉyÑa¯èxõ€rH¹¬î€×kýøñÃöFŸÿ?ôfYC~’UDªj­>“ˆ—qC¡Œó‰p–:.]QÂqªZÌ&yãe¦<‹<Áºû³ƒW-C«”¿Q)É£:ªó}(ÙwDüw€c©°¨>÷:GH”ç RxjÀŒÓýnøŠ28uDL'D±²ŽÓµøÐU/£Ÿ®/c´úôbò\¤ï‡ÏÆ Œe U}¨º㮲–Š7àBó˜µhV08Y"wà™ÇT°ØusD°j!bN¢„‰^KU—È—íÄïFÌŒa„ë5¦P?Z{ÃO] ¸üÛ#ò´\õ€—¬/Ù¦áfÕŠ†N ‚n™–sÕ8{‡˜õ)€3ÇDÈb))+™{#çF„“/æ@ªIëŽ@6ï|A~D$,.¦YK±Yò¸x~¨eßfƒÈ–—BDn3»o»mEǦÀQÅ$øˆz÷?û6Q¨~®3ûrd€­î»“ý+c²Ö( -° ϳ!p¥ßûŒ  t¿NóœšRÚWç| Û–w?i4»%&=p=—†õÏN°•Lµ¿ÆÆ|N{y;[¡æl* X§éfáé…€op©Š :`J£YÉë‡iFƒïf*X¬=Q#b¹ôz]ëº.¿îm‚Ηe)4‚°†Âý£ç…¥ ‚Ûv¨šÃ7p•Û &|„Ÿ ±ÖÒ\1×0…ï(›¦ñZz1#^Û’õN?F£ù¬ a×DT6œVVðŠþ –5Ö5pz~&ó#ßÉßÀ;eç@6ÿ=¶xù†ÕŽ_ ŸŸàMþU?þßeÞÿg£ýañß0$ðÓü!𱦹®/Á§‹ç8á¯`þ¢w⯛$†ëê1)ÑŽF“ÑáD.™j<Uû’<"ÆNÃú|ŽÑæ‹éLY$¢5Ø.2g7<ðe枪JÆ¥©‰åAæU,äO%”ÅŽfÞ©ú21­§}`uj‹”¥2óÕÒGióc1ŽSÐ4ýkÆ1ô˜l¯"Æ'/k)1.!ºƒÓ€ˆÑœOí³< B~P ¬Ž|Àƒq4¢¤EñgÄBsGv‹ÒÓVhÿ)ßl$b3âQ à»-ÏÇÇ1ß:ñ<×Wƒ›ûf¾ü¦»$l½nþék]º~üøáïε®a…–ú„wƒ{„eå3RÙöÿ._}ֶБÓi'©OœÓÒl.g/e¤KÓjJ­>F4û9YE-Ë–à³!ù©šLrˆ—Òîfæ!`×Múvo8Qóƒ~—9Ë®u9‹)œ°±tÑÌÖ꽕8¡é0 ¨z³€ºhH*j⣻iÆÛxå]©WX««=ïëö†hŒ5TCÚ$нï3+çG:%þD/Ï,Ÿ8ŒÜ’zAèlé›vN/ÌŒ¹Âk©SW¨°m¶-0Ròxáº×í®c¶‹l Eä®fà2ê†Âãä5ÓÒL ¨ú©½í·ê)ïì ‰È\ú z>X =42qˆR”-¼X­“ á4Õ$õ“Ž¿¥îÂVjR¦\ó•¥êÊìÛíÿƒé ïo/žµxZZùÅÊ—ætÌB®XÑNÆê6ʵªÃÏ×PÅ6¶³GªÊá ¡åÃÎÐÍs¥|TÍ„½ãÌÜž¸MÏ^8ÖJ+£’/(5 F½®WZ¿J\¨zÚâÕô-_¿„e¼ŽùeHSKÙö©â¥z—h-($òŸôÞØdlR-€¯¥_eß:©I¼R²÷—q‰ð¾w\áŠÐCƹ’ŽY§õȵ¸<ŸÊìb2ˆ˜æÅg4‘\k]W(õ±» I]®Žrtm6>Éõ´[¶A°!Ð3ðËdöAAaÐʈš„7Œ<ÀD@[ÄR½¹ãwŒ-ŒÖg›Ø=5:Pè_§AiÓÀ͹|ÇÒmNàKAÑ£ wÔ¢¤Ìô¨!ys#ce‹Q¨hM[¤(1à_T½.‘-›Æ½µ¤m&x—I: •IÇ•°Ö+_ÛçCŒç ßζ}Ó ¢”KÔ·™ ©k]Ã^àC¿Ù ®ÜÿÅÿ*T—X&óþ N–ŒöåL CNåžBÙ;¦”nÿÉý¯±šÞÒÛû<ÏðM÷½ÌS9í–EGd„­G ª«<Z:3ºu^ËFðæ¥œà\I3‰B’` Æ ]U.±àY7C1S;Î\1¼´ŒÐdÜ 31ŒFVÝt:Œ•,È£s”¹…ž©¹ "v½K4üÝ÷Þ´—BxUZÍwÆ ØiŒ¦ÙÆÊ$•ˆ<œo>ÏU’p]²MõHuƒÓÖ%&K¹i+<éµRëRß/­åÚtU²\’Þ¥úÐå~•Íg6ÓQF£ï?¾T¡¸š§@*÷¹o[Àþ5ˆ§>ÕÍ ‹Ø¾À(\ÿ÷®u 7q–sùï¸lÛáä>dS_ؤ$¢ƒ„2Ù®iž(º`¬dbàr^•ƒ+½}TÖ²'—Ù(ï]›s` : E.ˆÏIEd,,î£(ûÐ¥ž\¬De¼Ç›PÑ¥÷.á<·¥Ð×ZBšc÷ßAêñp3RLL©[d…䯊jq ên–X"î0ÍS±2r\ŽVVL[….¹ˆ/T …®ëxî ›}\õ8væ–ÖrÒü´|ãÍ^¦Ž¡ò~³}¶§fÿ½éo¸›ÃŠq È™2ø`æ§G†;ÏfÄ"yL¼0ÅùOÇmŽ/ZùÔþüÌÆ‹#”öp;Li}$ð|ÿž·pÁø3íï¼Áñk±?“Þ¿ÿkø M|3øHßÿî;ÿDèÿSâõÛÿE!÷Oó×ÿI8ÿ&Ðó¤!äßmÀ¿ô5x›”¾ Ë>à§åJ?¹êþkÞC>—£ùx4…ÿΫÛ}ãà'Ÿ·@Ÿ¡N°xBZHT™îv­5ËŒž¸c‡ÿ¦ÙŒ.JÁ «T<¾GÌhù 4Ä\³ÜfÂoœÙÌã3ÕW–ÿ¡/4(Vf•ðø í4š¤[†[Ž–ÓµÝEÅ~w1óœ‘<î<.Úà3¶…%¸=]nŒi±P¤|xXøp{Fž¿Cçn6>õú>hšÿ,%o¥61nrC¥ÎªÂa-P×bñ_.Èí©Î"ï;Þ;¶4Ý-\ïžJ9Á°oÕ¸ÿ*^ž;¢ƒòs”ë–“žÅqÎ PìØ’_{âuÔUáTþîçÑaxR¹ùvwqÖ9<^6®ÙÓø/k©êrò8ûW{d1­º  ŽIÿøñO_¯ C*ü°vgWúý){;;Ò"FГðýÈ2Áš`j‹ŒÉY Û]¿cš4‚õ—6çÆŠÿ`qM¶qÙ1Zg“Êù¦7òEe6áâBkÍ…¢H[ýO­Úa9¥6ï#CQÎWÖ2ŸªBãøjÞ ×Jk,¨GÌqZÒFÓ_}ÀQ<8t‰ó†TCè2s´~ù5}_ŽðÉF¼Á|*H¤™Cê(Ô™Óë-–CK‘Œw¯€3É¢M“6é„B]Ë‚ŽäŸ{¦<Yà.ã ˆrQö²>HÉ}ÎÝ{9|ênY×kî5N°Uݯçl[„QVÕ-FDæxônº¡v¿›få|ºýeiœÆƒI»UÞ»Kj)—¶ñÌëUë_ý±Í„>MªÕhufX†Ïõ%ƒB¶W…ð‘Åé @£šx~žü¶ÏôA\s­ÁÅ‘KýµÓœf½‚¹|æßdo3¡˯q³Ô ˜vuÓæ 3ÛF§©˜ñ¥ºCH?Òð9àJÓ}þÂf"`Øüy>Z4@=à˜O·<ÍôA/À/g5ŠŠÙsOëÁŽ^qScâáy"šSLpÉz-!ÄI2´ð‹ÖvHüªP,—#·½ÅJ²+–X^eñüÍ pÃ.àz]ÿñRšl‹°\ËóŽF8°e·„BÙâc™˜\^+@fT,nzHX&F[¯k * ­¹ Œ®•ƒæXßZj^¹ìâŽJsÏ$¹Q2p·R†>ׯ”†4²†¯ÞÛ&VoÛWH\ttøuP\r&bFq391·ˆ¾N-Ê2ýâmFUÐô:û#˜ÿ‘¡¯Ê³$îþ¸ò("àF·`5~±/V@ õõV¹C>FK ä^¨¸?šun¥ÏïêLŒ”d*îñ@ÁZ¸4IÁç=KfÓ†i‡‘ÀÙãÊ ÄîŽwØí7AÇ„£Ô/Ù¶‰.Z—Ä‘@„þ€kiU´Ð§ùš=12ª·"[ÚÆæü=ÚÄŽYi7¡DBíBeO9¡# Á€B–ðK¼:tô°Õ¤¿ÌK¨átmƒŠ—¾.Ú6ÇðyÞzï{oUß‘ç½/yù€O»¾ó€F‚^«0¼JøV’ KÞï}HRÖ–fèþ±­%^׫»b+{ÌZnË"à©•‰#E™[x›A³@§~ÍmÂmÛ [#Ì™Es>ìËpðŠùȯJäP(zulu†¬Çþ¸qDÏ ÷楶´ykûÇ„l¦ñ.ºŒ‰±ÏY~}øV_â&E<‚!Ûg•ÉŒÁ¨+0fÚÉ2ãÆ$«’&›ÛâÉà;Æ¥ðÈ•*îí™)·Å OUÄÖÆ³†ÞتÚBrß±k*!ºµ«8¼¶©+æºká¾IrAeÁh¶Ùž‹—Œ“­Ö™bdo’µòòÑëhø`ÃNs¢¾)<|(íÃý3þº×Ì kq¼H3ÔÊ£õ_ð8wÊ4JñJ-\9óxê4Íñ¡‘GÒA½fïêNî$ФNîÅ4: ß{cù¨¢¨¦E VŽ­ IDAT£á#ód©)´&wÜó[Ë䧤›ßÒôFýžyàyÇcz_kòßðøù¡mø/·–Ÿ«—øÅ´áÏ8¨ÿØÿ &¿Íü„‚Â_þºNâ) èxóðil÷]ÛÄ{KCèçÏõÂ3?ô[Æ,ÏÃɇ¦Õsýh6žÚÝRÕ_9ÝÇLÓœDè`×BhÄ£8vÃ,áU0>¾T7s#Îè!ŽÇ–qçÆîqn{&ûÈ_¹qøÖå=Üð–œðþ5d±0fwÙi÷ç1Ç~°ÿùvÍMdA„F‘r‹Â|“|0¤!}Î¥YN®O® Å|+Èl„Ö1VV(¹&DqÙxY`$¼Ó,¤ÏnHqÿŸÏCŽäFw2¯–q•J(˜AÒ Hÿ¦pÕ10¯/…èDD¶eó½V&)=lðæøþ-”<ªG8*å\Ó§z6 ÿo~cò oB\i’,cÖùf^0|™ÙZË'ƒÏó̼©Fo¬ª*ôµ:×xn’Ê0ªi’±ÔÆ™BÙ4Ùû£3!áøSVˆ©b왕oƳîà€¦õÞÖ&+ºirn ›î|˜©Q¯žÓaxKô—°m¡7‹ÝfU Ýá¦pŽÙ˜AºN X9ãÉúîp‘eÈ:$ÒQèBŽÖˆ€#“s„®±Xªˆ¹BÄ0DDuS Ûï׸ Í}ˆœDblÍ¥I·/üœ™™ÞÛõ•"ëzY…3„ó'uT%Ü´›“ŸL<‘üOF}\Æàü­Vʦ™hð®÷Û¶ O8¶Õ@ÉBg@k-Õœæ4l©P¨Ü¡y&ªX}Hê›Ké$QÞú¶Åˆ<Ç‹0¡Æà^$KïmB †F=ÄuÓ<û™"HñF °ÏŸí&¶ÈQźšî‘Û!:~ѪÜÍû•ñRÜTÃRµz×ÙÄG\ wómoFÓ±äUîßADgÔ:rãh›ƒ úDI€åÒžò *!_æð±¡£h³ºÚçÆ_©Œiûþä\µFK¡FûÉšäom‘‹¼”å:PM¬4?꜋WFšDÕ‘‰>Xb´. Œü‡\ÿ±|/7Míö—ùeôôÇþ+ch µÉµ8D@°Eö.µ7‹-T 0¬ øÇR½^û»WG˜®IŒT +QN 7wM*uoá½Ü6"Ñãâ7êzyß¹9IÞÜrz ÷ œª—)u3£Žúî¸EÄöÖµºTh~µ¥«„•4âTñ‚nçé³duZT§Nb17MDÖ…&aáÄ%òàé%×­·ÒKÏgŠØL¶Œë—™ÅhK”Ã^£ýˆdmÓJš'=­BQ].˪R»ì§arCaÛ °‹ªÂ-€\P]dva`°E/U‚·”¨;-­ÛÕ_LŽý¶1ÊR5R³d h84»t›²@1›ÝZ;&Ç?\íFç}WÐij-öñˆN©LBÔ7+¸i÷æK;cÑ^Ó£lŠì íKµxb¸ŸtÌE-SÖŽçk({æ*ÑØC Ä›‚Æ›\ÄÕì1ôUhB»n" ˆâÚØ[’ÑlIvžº@ìTš–bA7-ŒºDn‡BmÛm¼Ô!jX€yž¹Šê7àí48że†1¦°ªJÈâÞ=›‹GŒŠa–è½m:žê(ä‹¶„Ë3‡"&¼)Š6žÓ–H˜ t~ÍmÙ}”+; )¼óFÛ~Åú·.BÞ4µ°Ot:>{ÕŠäÆFBÑ·šòø,ß Ä˃RN © ¬ó¤ÍÃûN^nš:2äœ]2qÿæ»iQ-J©`¡hL…¼Íœ†¯bo¥hãü”Y,ƶTäö·;'Dr­Äï?<~ÈŽwèµ›uùÔÖ+ïò¬$~¼æÄ*0+ÁÛ1ŠISl»ƒ>?ù'cm(£¡Ö¶+Á0²1A›c˜ÜÁ*7M ­s0Ã\Ž$éŸh^ñ)PƤGf‘džèäÞJᦇ?ÇŽþY/U½^Ë Ký4EXѠñ‘;úÓÁñØ@Ê3¨……5Þ@ˆ€ØÙX··©bA½wSD®K‘¢ Š…•²Å2Ö‘Uµ8 ©947ÛQù*yÐWê[u>V™a”Ü >É웓¶Ä ì/,K­™QŠ$øS—$oJ á @äËc÷15‹ Ôš0Ùv´7w¨'ñX‚pç û2ù±b¿óóÿR=V‰ k›Ϭ!én;&#Eªùt÷‡¥Ø„.¨¬(ƒ<,–,ˆ¬|}Ùè¶k¼õ’1;o/Sܶ-ƒƒXO÷›lïb­)-g…øs¾È‚|§» œ”D¿·_ׂ8¾ˆFBBOýò›Ü&¶·÷Iº‚±Õû3Rö5b騉‰Þð%rwÃfèã—¨Àó ;Ús=•ÙÏý¡²Tò¿Çþd­¡ «D‹˜?¸Õfs¦7·ªÂô6ÒÌÛ3*@G KCUÝ6/z-,]ëõƒK¯Kö} é¾|_‰Uu)¼,Õï‡KUU·@n»»1$ ÚÛèÃÈÏ$ºÆìO7ã—ì½ÍŸt%›ù38 ƒ‹]uª[¼ Y`¢ÐmÛ5¾xN*ä¿fʦ ›É•‡1YmÃj¿u•Ö0Zlf}Ü¡¯K¼½²¤K#‡/!Í 8Ÿ¡v £t¤,˜_{—Šcàòº—P©Š˜]´“zv#üØ“<šÒj¤ÌR®zsç5­X sƒ >ZÒÍÄËÔs$°¢©E& ëÐéPØVG—¯»SAˆlóÔ¤*vÍô·ÃÒ½k‡s­7 ìz£Ì«÷B>¨G2Ph.B©Kõ^~ÝP &ft V Ï*õC#² Û›Œ J˜ÜÈßB§q“+2aÈÑ8õ°lgRÖH“%>¦ “Ž?€­úÅL.!/ŸÄÆŒ_eÓ¼˜‰QnÚKVNEEÀ¥â¼gW„K6K+ S‹¡60·ËÄ¥ÃΆÑJ%mm†SI–È–ê{§{KU|mCã¬IOô¸¢z-±û’n,N‘ŒÓ˜Ê¸ôM‘1Ž&—ÌÚîÌÁÄ,.0¿Tí"x©JØ(–é'Å·^Üy‹Ø½™ÀÜ0¡ÆT¡nnö„-ðsÀݤÞøÉ‡/~†mßÌ\Š7«3”‰W€ÚBÊÅ£AˆÙ„‰ÒÝ ÔmK“×DÖŠóIˆÉf"\K¶ÁkÀWxÓŒ{"i[̈•[k5å¤èÈpÑÅ1ÝáMYÑ»ý°ÜGZÅô¡¬…K. ~Š„Ö?Ѷù›™%æLOû,C1³yhw O¤í˜sr°cTç©Q~@#ttc÷j§É@@»áй÷V^Í3°þ´á3£,íßvÊÙòJÍ…§ðƒsöp ¦IŒÒÄZÔꬊáwÎqÈà#äÄ‘”ßjŽ­#é"íEsöZ©½‡·µ(ïÚÿ˜dŒšˆÁMžcšO>Í;ø[^ûÏ‚9þ¥zúï‹©ü3_,'Sô_­ì>~ÒÇ/ø§¢‡èÿI2÷ßûŽò§£~Ðá9¦úÉ€ê¿æç*`ŒÊü™€öÿãÿ<–v¸G’2vž£­ý¢+ËöÅÌ>;›GbFï~L°¯À‚·=ýÓ!<»“er³´±ò˜€vlÃ’¸S&wt<Ž0žE-…:(S/JòxJÌââ!îsZþùAáŸeýÒ¦å`ý¦?jðîÔÆÛð 2ȃVl8‘¶ÁóaÑš†éàRÿðw[ehK¬®N=Ã*\?yú™5Ѷ¯z¨"¢ï±ã‹S%m7ᵓ'D+=­ÎÉ8ÒtŽGb9¾õöêጊ¡HDµ šÞóFÚ”ÎRÙλuÿž_|‚€ã÷žô3ƒïf ®&%Ø­:$žßÌïù\7ÐÐzU…™Ûzll9wKí7G!¿&¥°·î5W¥Ê°­•ešIDžóÝÀªÔÆ7@¡oqícqÅÙð¨(J‹<‘âÀHVLܱù‘5‘nõ; ¥šÀ¢ç”v{¸%;’çü¢¤ý¬6VëB©¢?ŒB^W}Ñ åSBÌ[Wµ6ª¯ŠÊ5÷îyÕ™C#\åŒ@2gàç™ßÈy.FÁ;ÛÔÑ'§å«…²–˜­ Çj¥Êœ'äåõô䶪‰™K¹qøƒ|}ù霮Ða`UY°Yï'f²Œ‚réàݹ]€Ÿ(&§&mdÜ0¿T„z‡ûV.¬¯½Ë‡>l¬‚¯¾ÔFµ4ÄÍ}ÌÆkè9~,ýÚÎJ\"\žQÐ+ }Ä7r…çnëÒIþ)Z½V£õ(ý£Jœ²sé¾(÷8|©ÈU÷Ø¥ª`}ò&Õ(ºpQ¾öq¶*Áî}_Ïò{—nÀjb»7E.^Pˆ\­êêHNXÀŽui©¾“AéM#õm&¶÷½íºbüd¾mÚ"˃ ÂEbÅ[§1"¢e ]󬧌¹¥MI6ãdmÝ_íä~»Ù%b^Éší´²1 ²Z¯8¾Ô\‚-°Îs''2AìRMÔpQ³qZ|$RB(º º®¼<¤d—ã’sœzï[¶,èò °NCÛþ?7ü`Øž·í½qiàÆýÌ$G“YÕ]C.n—XÖ²ÖÀ<»¡Y¢à]³¿›å|9_Æ5Z±ñLOÆÿÔe4º$1ö‡ höÇÒ² «Aî;î/CJ;rÁ¥X›µ/ÁW“FD[õR\Ô/ÔçÞ¸5dŸ6ÜÀ€J@}¨¶§Xâ=Õœ¸ãeig1+Yîò‡{CŽ¥¸p…†ªÛHYAÔŸ,Q‹ŒKmý>æcºFÝùkfÂkâJ—Êà¶ëÛ»—¥gh¨ÁØwÙi3’¶E.ïè˜ÐÇôÂáÓÍÑf.©+ÊB ‡¡x&Åõªx-P'jBùõE£ºáZ=¹dÒ3€ZmE®J=„ìïmí‰sC,8Êp„Ú°@m’½Ã9e›K)zaÁǃÄ£›ò¶è&í¸Æ^Kÿ¸wê«{{[±ZÏ{q<°CöTTE–VæÎädcWHSÐ[šÄ›Ÿ:Ý"à Ë®â 6Mº[€:zOTb€yïwË,ß|Ú]Ö³øõ }‹zÑ4§1ÿ”Úý :˜ŸÁR@®[²VV§:À”ŸáÝyIiN}Ó`É­Cè*¹6$Æ·GrœfýøwbVTRQÌn€5Ð1R¢]+°>ŠºdRU5b$ƒ$f¹¿Q¿Hºn0በáäP@Y¬@Wò†\æi€=:±H‘½i_¦/ž'ǧÁ$íF•·eŸ÷©Ø}¤PmœÞÌ÷‹ ©&{ÙÊómîú?ñ;ç^½ó…ÀG¹ð„–þ’ ¨õ!Îâ,à–óÙFÉaxËœX½rÅY‚xtKAæ &è¡iu N™Oâ5àøõø¶Bƒ4ÊÛHòX!Z0=8ЫÝl̃Á®Š½©oÊi'Éäymnn9sxbFø#rOýÁ÷Ê…GôåÍ#ÊG2Ï Ás¥ÁïyÖ¿àtËαû;èÿo0¡ÿ¯ô—=ä¿ôÝÿ5@?~[²ÿ[ú‡?Qš'þ‹ÿÆ3¿€~ôý>ÚÄùi(õ;¯ÿ²…÷ˆÆ¹RT´?ûÓ_§9q1¨ŽÓfÛרÄÔÿ‘‘˜Dm6²'j_$Ñv‰bá ³Ëi©Eð~8óe Ê‘(½ŽΔšTAîˆç zs<'õÇ ;àzÉ!:LmQÇöõø*+ÿl õòvòT‘ANÎQ|7&‡ƒR¿Cµ|¹f=¢r°ìQÅ; ÒFöĵ¸ž¾HÙw xQ8‹rH§[W³abŒÌ'Þù45<Ë«Ù=T8eâ}ªƒšx\ùÕ ,ŒtÅs,Ž·XŸx'$Æöú€1Ý™ÓB=/òo8¿ ó‘×ç$P£¶ÙÌ:Ȅ懸`évJÏ$af2ú»? ë;L°¢:Bõ›È1æÉf mš*F6ç½!ààE?ñç÷ÎÑ6†"’ƒWÙÜC?cYàJã*ßIÀÙÍ2 ¬I‹²©=q’Ô«#õ=† MüŽfšŒ‹Õ|Zî-W©ïŸtÎj7æç1ât˜Jù/éåµñu1µ­T‚ŠÛ ™h µ;Xýu­¥.1¬±«–h‰FKæVP_<¢ /£&t¿1]+Õ-¿Éwv¿%Õ:Ö-³{«BÖ!h²M.˜¼ äÞÉñ"( ;ʅTlŽøÙÞa‘MXþ¬ÓšC,—‰= P`»>|?ä&äç¹ÉBWWXßÁ´¤Éqø¨x—/‘‹ž HèðŠ@¨ËKátƒ// Ne]ÕëA*—(—?a!”[do›Õ^{N ÀUÈÂ:*Jß·^!Ø"— W=÷KÙÏ¥ãNrÌ„ÅÑØ’lDxi—ñ$¥:j’W(3b抒ú=¼Æžji]@È A"X*PÝŽ”àv§6BGÂlßf ®ßLwê4™ÄóžE|/…"˜ø ˜û"Åâ–¼ ÌËS*Ü3©ƒáÚK5z­ÜE‰´o3—ÝŠüÇÞëÆZ+оKHSÅpdeFXhö/±¨_JDvè!,G~Ç’î ý˜9"*V%G€€º?5ÓÉ5vß{ïÛŒ—VŠÜäu›ÑlÝTØ´”öØàJå¸(l(B{±<ÔQ½K°E”KW¬²ôI×Ä0'¤QÙâ¹a®É¹!—ÒÅEV´¿r KU [¬ê`žƒ+Ô.è—ì2Vw=ˆ÷më¥Mf·¶æç7‚vøëˆúbb™gŒg ¨ÁÞþ)»’»“ØgK®ÂEk0Dì`ÇS£÷7©.H÷‰áv½}¤Q}ÐùÔÛÉ|kž~b2¥ÝAA_‹g©TQèŒíï´îLÛ¶˜<‡ýÁÔû3¸¨­>îƒÈåfgõ /Pã¦-ÈÒ a/QQÁ¦FNÙw³)Åqà^yTVù”ûw–Àhž‹ðò’íu®D€œJ4J‚3î =|¬õË‹Ù#ÖGŠx.ðpscË—™™û¸ËÉ<ÚDL0•Æz~4ŽÖNŒ×ÛÉk×”SÓá܉YoäŒe>ó);§Åðë\w¬z[ka%Þ@dRÃi´}TVÀÂíæÓ&;ê¯TV~”+v N ã ‹™ƒÎJùXrU3‡kÄSòàÆaòh‘Eå¥3€Øé ‘(ÏòïZa¥}£¿# =°ì} 1=íûæ6^/ï1êlÌ–4ñy ²˜¶ò{Ä5 Tbž›¦5ÊŽ@¥Åbìï!­NBŠáÞ¶ÉWö©'’“÷××ͽo½0Åýßûë%¦âEOøqoô‘ãÆ½¹”41nBÓ9˜1‘©GÆCg6䂹};ëÕ¾ÁŽõeCÍâÙ| +~WßãÇúcž#–˜6Nͯ¤çßÓ>?CìñmïÀ¿ÐCý\ÿò}ñŸš üÎ €ÿzi¿x{~:û·ÍðÓ{ÌOfÿ_E„ÿÝ3¾M)ð˜¼ïf¿ý>Ä!ÆÆYH}Ž N¡ÇuG9ê°âÝ*Š«?J¤ý†!šµ€zÀ‚ÚU_«cs_vl{ƒúèpÖó“Ÿ\u)iÏYGfüX«e žùëú€Žó¹Îuœ3Qò›Ïùa5k†ÔÈÃ><ìÏÙá*[=Çôƒþ÷ŽßZòÿblP{æÃöî64¹á9ó»Oüøñå™Á˜3ã¾ô4{"ª„¯¢$U~åó³×·¤4Œ9ô@¸—º”)zü$½Cè&€îÁye—BQä[cƒ!ãÙÍÉ9;1KáÏ„+ ž•æc³Rw Þðš gí²v(fhëÉÙŸƒ¥£C¬´`Ò>†ž/yXnʯ!ð«†ÆfÆD÷Ì zŸ—Œ°Á{J7v+ÏF,Ç p3ÍPeTÇ|nÜ+ÙšŒÈ§3ÁÄ‘¤8/¯1àÁè ÀÉ×<ªFMâ1i9ö- —Ñ9/[â"÷ КºóÞÑ VÀÜ,õÞ¼±¡wij¹¨Yê¤pω¢:YEþ‘mÚ ºzÕ{²ã¼)“rÄê+±’Eµ½ò ŒŸÇI¹÷V³ëµ.`)n‘}›¨þÃû Iã> ÞM,ÂÜÉØ7›1¹ìí´Õ yj3œŽ{ Í̇Øw‹3}KÓ 7Î"Û¶/;êXû8 ­„E®IñÜ‘·¬¿zA‚§·ì")¨ââÚ’süO(|þ ­¥¼C ô>™’SR¿ü²òD‹eƒPlï£w^DDîž›CÜ;oÞèpm1“€¾c‡Vy%:ûâZêƒÅxSDäÒ3Q\4<÷@e½t£ýTàmÇE¹Ãè¸ÓœõÔL²7í¼<æ3¡cÛÜeï·Æl!€Ñ°pC^hÝI3; áÅß¿ Å/"‚]œ/GpHh<åæpÙEœ¶¿TîMÊýµÿ?þÀ?t} &Y¢ÔÍŽQÄÀÚ+Û# wâïhÆÍZËê+K!€yýã6ÜñŒ„*·Yñö¥°àßDq¤ÿz·_êÒ;D@¥Gζʽ·‰KŽ6˜Œ6ybiù%™ä~«á¹éÒ¥¶M—ªêa™OÓ<È]¨!ÆzÏ ºK:ºhä‡fÆÖ64àWBUß¾xàf±ð’QvªÝ¾¹iT)Ë·ƒÎº Ì9ҙ׊íI¾Ö¥ÈÊ,仇·“¯Ï»ùˆ´à”—P’®Yi æ"Z<Šã›®(r‘%zËÖ, ñѵ¯–P®3Ýëyšà:sÎ ­¬g6Rv#ÔHN*i„Üœ›p¼ïÀ9"N+lòÑ•#¥96¡NŽ×Ïê¿ ðZB}™ýÑ·Ti)„ª ä2ÜwL ¹Uh¹þpÖáîlÃæ¥*>Ÿô»CÍÿÐySÅeAe õÝ(²é#;i.Lô ÇaÌÅJ³zm€xKPN×\7R¶)^#áLÙšîú /®7ßæ…¥¬ óð…Íõ2S\+|þ±xA7)Æ¥0@U¶‰$r&úFòyµ½ È;]ÄWÁÑÈJ!MŒ¦¶Ü ùÒ¨¨¦è<Šûét±ÿŸ½·Ù’ä8–4UÔ<ÑïÿŒ³éí솕n*½Ð_óˆ¨*ä\Îðœ¾MU‘‘îæf¢"ŸÄö+î +âQÐãÙ=¼d5¡qªσòˆ‰xN-lJ^ ‚Äÿx·…ùÛDùËóÚ \dÈâÄçY"”ûkÖ¢Ê#¨Á<"2ædÚü–x•È8ŽÍ°Þq†-WI…¦”QÏ•b¼4â·o[ÔŠRö½÷¶¼ŠÄ70¦1û¾eAþðÁy?ð´1¤±kc–T)„Kf{ø!LÔ_B×":ašmÌ磈¶Í×篶iËüqù ÖªT=[­,J.ʆ™‹rè͸‰ªm!×)NGTaƶ°-ó#x´@ýL4Ï¡I£…Æ6ìxÓã5ñݹø »v3ÀGð⋯óFŒ´î¾Ïô ÈÓcÿF_å‘vø<ý$âò<¨ïÝÎü‰ÍsZðé üøNްà°,>‰|ÿÌÊÇW²ß ௽ôßx¿9à/.þßš7 ~÷o9ðœÖ= ^Çx7 ø'¤"Þâ€/ío‹¯UÀ}—?ÊT§m¹†°~eÓæ¶œ·ˆ9ÂsÓr”Óò1"åa )ÔûàB•×¾¦õ:“dRö¶b¨¨‘8ðýìgüS+´1qÿ‚§ñ''‘6ð/'ʆ/õ'üô8ÿ0F®”)>j]»B¡žê.þ·â:kㆾ÷±¥Ù7Ë[´F IDAT„Gfj¬ŒêQ]^ª®ÒòÔ+ÌËuQ–ôQÑB´R•…K0@ìù{W Ð~è&èW¬y ê×lÕ{‚kJbžÖ¹ùæƒc//@žÔL_ýËãäQDü sã£6挾æ#IóÎþï íŸMvsoXbùèÆôpyŪ$¹¢«eÏͼü°Ï*mÚ+Û3ðnD,&ûŠá Ì—ÀÉHB9¼"²€cÿ…¸õRóJ®ýÉÙ²€J§º\¾J6MÆŠ¦Ø[¿œúq:,©¤º®-¤U·œKÁêSÆç†,Ëòÿ§03’êçdŽB髞óJWT:³ÂÎoÕ É„ø¡(h}<*j©JTÏ$†4 ’üAÕO´påÒ¿êºTïm5þA¿ž_y\JBËÙáÞ´E]º €»“½°ÍøãÞ•Í^Ìù‘äˆs}°à%í}1L¨}UôémŒË9þÉ¥u5ËO§ÈT°AHUÄ\!Ü´ULo×ÀV¥N@B¡Äµä¶:eQu±üΡ-¹‚ˆ]gWÙ4«/Ƚkñ¸4´9T(‚ýd£tò¨tˆy€ÚÜLøhôù`ëçÌ—.£ýˆ±s·Ö-Š½Í‡(%¹]æÓö]åº%PŒÚÎc|ê_ŽU+wTjj¥b“JLxïªÇ‚›[»`f@ª{¢ifß¶IYºTà¨qEHב¹‘˜–È-üuÓ…ï'Vâ»Q-á1ܱ3MîÛµq_t´‚“±ãqC¶/&ÜßvaÿñÇ2 7]¼u9õªzŽ~viÍÁç°ôr澂¾TŽLqƒÐ…è‚̯m. ¼LL-(bÀÖ4jvÍË¢î@#Ð1Fí_œ¢¤A”¥z-ÁG#¹…WqFt(œe1«÷žÛ(°Ûú*%Xo2Þˆ˜[ÛÝÁéTútR@æ`å™pqŸBQŠÍ,;¶ðH—:DüŽ•³vAØ9Ú6 B«l*1­°1›ËˆÙîö6 ‹ÑZ ûFÏMU9ñŽÜ{«“O¢o!£C*Ñ?,2zK³ w¿ŸÂ½ÅX+r?ºÌ,Ê7D"¸ª.Ó±›:‹¸úø¥Øný&¶•ÝX¢B¡LÔµ9‘ðx¥ORìÂã~O}ùˆ4Ò%Ë¢—Q(°/\vmãòeNìgW¶ÙRUájÏÿ´º9} n‘t» ¼R}«1£Æ-Üæ<–Y6o¤tx2)úwT ÌnééjB%“*Mm$ÍŽÓzô¡ñá~ˆAñ(™=ÿ;ó¡9‰¯Nú÷ga”äÀyü˜2—À¨Ü•ò(•“žJóЯ†kÕ~üÈ9ç'œ87àÍÁþ´V¾ùœúS9¾S¾ @ž™ ùûb(Žkám·ðtmþûÅõ߀þó7à?©ø· ç¿ù{ÿå/]ã:ú¯ÿÌ[ScþÌú燈|€B=œ¹ÿéiÁç×?íÿ7©Ç’"Ãp=r^Ý­šÅQóå*Ÿ¸|:FJq†ñxÏážžp¦²DóªÌ «Ýx–tkl•¤úÿ˜(>¿ÓTl‘q_9 ä+¶F>Àìßÿg@Ÿ‡oä…‡–ÅRgdîÝ,õeVû˜xr/5°m¥‘ÔÑ·ÐË}aðj''j`÷ƒ=Ê*ЇóT, ³†:û„‘e%îSîV̲h—ÕXö—NãÏŒð„s :üø&¢å=g`‘}·"#­á¼>ª›èÁŽ9‹v¶©¼sÆç…è§>ëÀóŠuyá‘ï9»ÑÊTÎùS®8ØÿnüèÝ«q]Ëmp½Q<+¤Ê•æx–´$Ý,o<øC{n)ÑAmB¬þ`ºVûº¹´wýôÚ:†–ŽñLöKÏq Ìb\„O·_¢v,c¤¹;ô¦KœªÔ|ËË]ý­ÖùS\3Í4º_5Zxí“M€1‰->úrh9 ìöÁÖŽc¶Wè–½ƒƒcb_¶§3¿¡šF”^Möä¡MK]É ª²QF0ÏóŽŸ%  êõ·nƹž\yï45"e\ïÐ¥l6ôKuÑnD﾿ï½™[¸*?5=1Iq ¨Lv‚h5ÆFŸžV«öòþ^ÕPTl#L¡%b Ù)ŽQÌ3›7ðµôÙ"—ʆwÁq \—­ÞhÄÈ•a zDÚÀ˃ZÙTñ½ù¦YŒª‘B1Úq«xüw×é\“äù^(}3.J~Û¾‚ÒAï ¸;³°€ªØ Î/´êoÉmwÑ|¦8Ù£Ü}Ê]äÎBf­Æ–KDö&·¹zµTUÕlSø½íkÍÃÏ 5¸´Ð ›Åd«2N­îsM@Y œ䥩XKÅÀêL ùV§uG!äb&% B'n`Y¨72±áEÍéä3á½åǶ?Ö¶œI¨ÈRݤ­ ~c’ui&/YÆù¯(N ÈBá¶XY Šå ˆ· ^´¯­ÎºnÄ {½íX̙Ɇyˆ÷RbUsQ¯zòR„Üaµ¥ºÖåµÅ·U µ{ÖRWždª &ÂÊÕ)#C›eŸŒÃÊUL âÞÿ˜ LÖU{ì*ƒºÓ  ´¬Ñ…¬¨aOÕá¾~Øx~©Ê v†+¹ׄ,ï-¬q,tµÅ £»ô9ä|“€ÅI »Ê-mÄæËœŸ) Íá?Ü4ÅØcVÅ®,B€wµìØüšXA«ó!²JËS)qÌ2]‰© ¯ž‘]ŠPT ÛóQÐLÓ`æœh^¢fµÊÍ5J£hFJn•…e)D—èm›&XKd-@){ËÞ*kî}P‘2X½ë%-zù÷³T÷ÞFõg=n—Ö%ÕiYˆa঩ƒÏr]¶økt‘·Ÿ›Ôƒó}\ú,,KuÛ#­EåäØYõ"w’{6tÆFÂà! ÛT­÷yŠAZ#¶uZ¤B¿æ6ó¶´äÄ^íÞµÑEö`$½ùŠé×`YB»nÂèDœ­¤FY´ìó9jÄ-¼LnqÃU‹é°Ùe©,‘o¶ûÂ/à½ÍTód€¥‘·Â¨•—17xÍ“’÷—€KÁ{ïxúÏÊ«ðÃsïmxTò`nʶž€K£\Mš\W‘¤º€—@ Fë›÷Œ·©®k%»4£y4?eN¶|æ÷É F“`qÝéã£V'üPy©ÀŽ•E]èß˵Ô"ùÔX(¶Qüy4µü ÕÛ@HÏe†1àƒÅ3Ç[»µÚ}×ô·$˃ŸmsDþDiу>h›¢so“(9Õ þ­pÚ‚¬’Îâû£&µ«¨ßª°) ñüIµ¶Kê¸cU>8ì¢x+ŠÏ§jŠzÊãaÇp ¸®|44ÊÏTï×íôïµcÊ “•·?—r N>Ùú^? ¾4Q~õÆ®<ãWl–¼Î+ì,ñ,ô_S£ïßþ”þÝOü7zãùîGÿN½ì+–žÃgÆðæ`õß18còaÈ%ïìÿ?Qóq†äê´ý9þêÏNbvêÚ8ÚÝÁvÙ³öN© Zñ eEÑfk“ê hþ ¦ü=Sùo ’YÈÚTïVéC9PvQE óMž€º’ògçúh»'žŸ1 ý¦ÄtZþ'þ£9 /‘‹óTøXåÇAœ=Íšt “3áÇ3‚mo×m¶sï'¹’XkpÓéfà¨Ñ<ò 9ð¦#;bÀQä–Î:kó\åZü$~‚zpŒ°Ž©K°d¡ †z¢ügnQ:0šF×Z<Ú€yX²Êà?+ƒG‰6îôõÏcÛ€AR=Ÿx.c8«07ü¯S¢«÷LmäŒË,ŒdIàýHinGüß¹ÄDU¥ q® Ë9ø/nbfšø‚ì}?,NX9‡Kýj*m)Ãók '{À½»7£$-3úpU¢ô#P…Ü–ŒWÛ"Û€‡3¹É鎚‘ÁÀbˆñO¤h”±^Âï¥rqtànc`áé‹Ú%ºÕ¾¾`÷påpàR½°ù¯o³mpXSSJáú»k8—dMzyü_iðÓk"ªPfë ª‰RôæÒ•؈(‘Žç!k¹ÎEѵÔ쇊Û÷®åRª·,ƒ4‰ˆ˜€~(50RB/%t¤ËÚ{ËZc˜ˆ\ñŒÆÖ=”x\cPé÷ÝríP_Ȩ®µHóé(mÒ-©ŽëÆœxÛmüC—./2u€ˆÈ¥îγêNØþ1‰|gìfSV&ÆÎþ“l––‰Ü‚E>f±yB„7¹oê:;WÜP`%NKÁ£« õ|¿2Q±xÙ²Óõ©šÏ¶F·à u%Á¼–®/RMz:nQ€ÀÄ¢"‰VÿÍâÈ;~ž"‹È/Fn“›æx+Q„¬ùœínÏ %‚í±6 ƒBªÈv¥I¿4['ã#Þ{C¸ÈPP]ªAjÆ@¢ Y7^“Ê ²©ZB[Ú­ÈKìÎC±VÔU޵ö¯µÒ/"w1ñÈ6țݑ;)« µÉ¦Éb›Üá~YÓ® š˜™Q–èÒÕ*÷2fŠ6Š=SÐÿZKµ^*:s-0Ú]CÁ¬Rc¾B…q@Eî*Îñ®H$Ÿ0òÝQAi…v¤ÒL¨³ÕÑbW‹§£±Àõ‘žÒáM¢þ›ˆ˜9Ü¢¼›Çè>õï” UÞ;1sôÛç63ÚB”ñRÄEꥲ€"¢fs«N>xA¤‘nÒjî$ä‚ZT‰ðÒå)’brïoPö-ÿߨÝNê¼{r ~´‡c8½õ9úfâÕÌ÷ÍBá¶P&£z‰ÜtD|ç›ó¼ì5 —`û8ÝAäËxRòÛrÃ?´/öܲ;„ê/ñWMâ"DáSÛÃÃÛÅ ñÊ_ ¾WȶFf1˜þµm<ÎzTvö뎞ŒýTÈÈ)S6©"·p¼®âåw§·J3+¡À”búÐÏç“ðû5Œ*°ÃÃ}_ªŸEÈå±iT•må0ú‚·ÿz*{qõ³§¦ž½{Íà»÷jÀ¼#bgx r=ês>Ï% $C:ú¬¶^—^¦ÙǨ®Õ\:¶éJœ”_ël•‹Ž{°lÚ¬kã<†Ä×HèÊkšYa‚ܸçŒp-µmWÏÙ¢üdàëQã´:´'õÎ’o™éŒ?àþµð?=t@C4Î+Ú™a:H7Ÿî/ ŒAÇzd NÎÈËwVG³ëÙÞMÍ|ü^xæØ,‡ô’ZZê ½' N³áqðÈD`O*ê~ðårȽûTJÞ8Šx+8êaoB ‹(0Ù@Ç=•¾9/?g …Òx{<ÇÏf¿P¼;ÛE¼  þ ÷ã'âæ­8>Àw´EaùŸÍûüÓ¿ÿþÇaï¤üÑÿ®àç%þùÀóÃ/èg› œßÆãÆÏÃþÃ~—#ðwî)2‰lãΕÑ7Ð õ`îÃ*E?IÉDRæiiÄ–<[(ºœ4MßoéH,µ‡ª_ù»Úà×¾Tút®‹ÃAÏq®ªýŸMqïs!ÓhȧéÿQˆˆ7__¸Î)£3z桇í–~H½ã15‰æÇœŒfSΡL'jä=Ç€?8¥¸ÕÞXM—rmÙ­³2<Ò4ÿææçßÅ sc}íy‘rû0=*õØgX$%møñ¶5í]œƒuuXÓÈ ä¢Ñ)Ó%‰Gµoi©s#ÓÆç3àø=Ó‡DWH´/˜K€!S…÷ÀZK5q2l?~¦à¥óá§µžÁèöX}r^€s~~pF;:Å¥2‚ºOIšÿÈü†Ò‘³ Óeéç&œQQ>ö`¹lÓçoI«ùàèù…"Ž1 ¬ k4ôhµ†;õ¤Ð†Â»ž­•Ãt’M˜>Oqð¶æA±qÀªÊ©¡››%Î^…ªùT%êG? E7öDWCáaIï ÄÞž™ð-²æ™ô‰ªŽ!®úߥ¡Ü) iL£¹Ír%ôðJ—ê¦ÉÂÅ%—PéT|¨èÒ/RÛÌlŸbwŸ¸Ìùâ SSºóD èÒÀ• œý3€kA@B×frrUpr ̨þ¡ÐnbéµÖwà´ý§êJZºdÅB ÐÛs våZVð™¢Ü}‡˜ 5ò½–ëãk—VöŠÇ`úK]ý×B—_p;Ùd^W⥟ØJÿÜ–^“èxÄ(.˜Å”.×ÁÌì[böá4ÿ]cpÕ¾š‡ÀaƒdÌäÃg(/ ‚;[ ¼´Š_²²øR½ÓôwÌPw0ž K¡+WµN)’ÄvQ&k"€å÷/܃ϛZ¢Um¨â}K9ɺ‰à/ɦ×e,îÍ ¡ 5•Ñât]êƒ _·óšŽ&^’KDTº º–™™q©¨ÂÒ•¬3¹£FCÌã!¬øùùÏ¿U®½EÌv2ÀÔð©¿»žgÉi+×xtCÄ7£tsúÁGuU¸ ž£r9sHzp©,èZÚñ)¹Ì¶Ù-1[É@]’¨DË·wu÷ɱT…›@ÙŒfß9êüºÐ vÔ>Ò¼Š¢!M¥¢•º‘WÍR7©Y¨ "Œw4Ëw!cꉡÎWR1LF~[Ù“SE¡vL³JíËÞÁR‡ 9iî·ß«ÆnF>Ï[1$ܹˆE‘‰¨ˆ)Ôhr¦²žþ3Óì .¶‚™$âÌÌxËþªhï,º`åjššžb,}8ºbC¹Ýkù(a__KD¿â&F44‹‹ÅÆ-Ô2ãšÕç,*bþÌ]ÐM.¯Ic÷M¬ZE-æŽnJWÛŒWW-X 1,F™A)Í™ä¾í›{­‰¾ùSa­*è­~GCJ˜„¢é(¿f]ÞÇ’MA„U’Œ+‹±q°A‘•ë³FwLccÊI6 ’§®†wJž‡~@Ëd¯_ù‰™ –æ 43Å‚í©ÀÖåñ ‰c»Ò}Ûué¾MGb7D(‹ƒ,t‹9„§|±Oª«=Šo|m”‚@VînÜÁò842<â[á9§i)€™«°f¤ãÔ–JU^"5ìCœÖ(UøLJ¦IO&Pw›ˆŠªà9«£©j àëûSPËœœ½F…±HÆ~É7¶t:èêϸ٧‚*PpÛP£¦XîXð)•låñ/Gé}I./µFL=3ìbþaD{”†7·€£GÌ{2fju~±I{wÊŒðdàýs Ùï„ÊŸ˜ÃO“ï<Š® a:¢â²óçw‡¶_ÕsÈç\…¼Á¼óÕ¢ÛZ‘öŠï— eÖÕ½ÕêºæÙåv2~ù9PÀWýoƒé·¥ |ñŠý9‘ÿ/Ižx~ð/…̳¥jƒäŸüio%õ7è?¯èÿ{ùøéåû)Ío½çOà¿3ðÐ~øNô½ÆÅü÷„þ¿¦Tñ[×í³:u,†Ï@iô:èjÕ3¦¿ýÌÔžy…ú<ôè9ýµñùw6`~–E§ñ=7œ‘³—jsN@YŽç“朲gßð°ÑÛýÊŸM¯1šã"áëÁ‡µ o=Ãðš<1!Í(íçyÎ FΓeÞ~¬õ%ž…¼îfíî=óËVÎ}ˆªÇU\±ƒž\X“¦ˆFC)ªê+à¡ 4ä'a@¯Ê;¸íw¼a¯Ôõ1)Äí«•²PsܪT]ò„@ÑÜ7ýôxT"7Ù#É!I{{Ô {À½-k ÐD©Ò6Oªÿ×ÿþ¿UæÔ´ò™˜ÐÈŽ«ª·¨`©„Íd‰júcþ=«¿ ?¨ŽÊQp‘7°äZ¸wÎHàM )­D§A¢9ªÊ%M­™1á·“š(€’Œ•¨Â¢1MĪ«Ô@ÙÛT»?۫ݺâ>Xw"°¯¯.U¸ã^K,¹RX›×¼¬ó#õé…ÒnkÂCl„¼-1Õ¡¤Äò{“—HÄœìHú2óí↊ˆÜ"Kb°8¿nOk|›|}Å:ã4ªp.ê˳½âYfÝO‘I‹ä½¹"S¢×à*¹^b»×9’Üæzöâ@'^Ṫh²Ýaµcí³’—M^ÞìMø8ecu­ü8·¥ŸÙêǶhü⥚:¾Œ \’÷ þ#.0+Ï›\Pã-½—•þrP3—rz ýÑo©y4AÁhÅ&ÆþðL<(>G›ÎM.Ÿ9…­åÿ±´ÉÐ{Í89«oòV¹7t-:“;[­Hïp†èŒ³ù;+lÄó ÍH53µ0,#Ðþš äú”—XDªòò© ;ÄŒ¦.¥ª^{æeqtZ×âm¤Út®x´Z1!…НHf€ßë¾·VH´*‰вgq£&±|È!7 Tk^[_ì¢YL“Š ×<uRQFò€¨oü=­Á¿·¼ˆqRªÂk° 3LÅWAc‚©™¥&‰õD\€‡¥¶µV¬¨Ìö_ÀñJéÒÞN£ƒ5³¹Çö žÖ©Ê)J—쎩Ž=>#CÕŠÞýÎã/Kg™)šº‚”>ïMY»üãUê„-*Öˆ!{—HP+žå"–;èïmJ@AÂK8.€H[mXšŽÏMáƒØ ãÀD2'ü~Õþgºäï“!ZCyÓ±ÌÄ8ŸE«æ³Îm5×$_âùÏ}“ú{i‹åP¼ÐfðêuFJešýë”;/«ÈI¾ ¯Þxõ+óEÞþW¥µœÀ>L^3>˜õÛÄOâ;ñò¹ðc™ï9 {G j­ëY4ÌOؘǿ@ª./²k Þ„þÞ€³üc.ðzÉ¥~øçÔU¹ñßnÒ¶iø/Ì“@ÿ—_¿ò´ÿÿ3€—"ùytòÊxýïÛÿ÷‡Cþ—A{Ï«£ÕZjogaÊGưhðA2¨²œJpaT¿P¹³ò¥¼±2Ã> þZˆço÷²¦ör -8çŽ<&–ÏwU|>ÜÿrÖ?wÅofN °çŒ–ó a¨µ'LfüÖéç8øò1ÿ2Æ §U¿÷cÙ*E(ÿY¤ÿ¡vR¹ˆšÜÛêi ¥¯ÐÕ Ð_Xö'Ïê`²¥ªÎ‘¬ íçŒHÅ]D²ö×®£êõüXÕý£Ï'þ0ÚñX]c8+Ç‹|ä&†WãÃkÓòA-œÕÎ?-lï_†•l¸^׺òþÁç7gÌÀH7Y5%û –p¤/”0näço.lµÕ¢¨¢uCôg€j2{¹0£:.M´CïM³4¾ºe™]²hPg[kP^"{€j߈+ªå6ÒbXÎHwà©*²JîÐð BÓºQà€ŽÄ G¤Š}UU­[Õ9ƒ [px õ5N·ÅÜŽ•óÆKW4êÞôóiRËÇMf‡V]î˹(K¸ÇPËœîÈÜ´á•õƒ5%XªÜ[N å‚Ðíž@׳MlÕ ’¯®1[éwíM¾˜ÛéïzŒ²!6‚8’E¸ê 1R wúÁx‚(`¢PFÞÀQt¨–ÈRäëº(bÀW^+"²NlAÝǯ‚û e EE-iƒÔò´»ö‚ªÕß-Ep]+êp‡M³mœ©ó<Ô-½ÔRê€jÆÛcÉ5Íd…‚jšƒ .àÒõ-÷U5>—å‡Ðö†¬k|Å;ÄÝg•ú IDAT§ü-ÎŒâš;„”D n*%@`…¥m|ݸT™BÍX(ž¡Û•À4»w-…B‚[ü!õ(Gèþ$ŽÓ7aVêøË¿}šæ²Ï!s0!Ìöqø•Èw9ÖRÕÈÁÙ1éSÆ„\WQÒT¥>j’»ª<©Î‹+äÝ6Iúsw¥DÅ&eï-X—Å4»›³ä&ÍYJ€‹UziV@)¶ù"Wßa—¹ø¼Ouߛ侷?•Öõ¥{›l£,…z *Õ¢X¿M ›Õ—#XÖQkžG¬¥€ÂÂj€PuWo/ë¬`RÌ•ŽTÕ=éYò `pç8 ¿2ŽžÿÕ_ÙööÌ I4æ(èU·´‘ÌHƒÏ!ÓÄc"‹OÍ ój”K91(_`øµk›6ÏPI“?DÃŸŠ‰iœ\úôLó™×8cyUËÌ aE;—§\1ظ”OçGˆæÅ6ÎÎ?ü¢•Ú ä ˶Î& æ'©¹­‹ÁDÔˆ%kÇ%à¤#ÿì̧ù9âì„‘[ââ‚Q–‰\šA³Ç¹Ï'Ú°¶ðhàê­ûNzFIŠÁdoóV5™Í¶*úF|íÖ/ß{ûñÁ4F­*‘rgh_¿WþÈ€ÔqÒóßÇ'ú›0“ +É!Tâã£.M´•PFq¤_ÅúìÝô/[ÓÌXhé!u×kDrouÌÒo´šdÆH ³´–Sä:t}|Çyêx¡¤TXÀ*‚ŸIäxYcð^I|Î#xh?ôèy7¹òò2;ˆÑÊ$×yòäll|ãP|`?~ªnþ®Î˜˜6x5A#Ø¡ º¹&êPºÈðÑõЉqw,Ohep‘Ip©7ÐÓ‚~&2̆Τ¿Z üAšEÁÇ#(çãí1¨­:¾Å9D +dÜ/‚òfå¼z¶õó½:#“|½ž_GÕAG oÜLP2½3Ž«»<éaØáéîPOÎᮘy9ì \îµ£ÇDl›9:Ì_Q à«:Æ3 0{‘ùÒµtÙ%NÀö»"réJÕ ³¼¦|SFm3["_׺¾¾¾¾þ0»õ{}›Ð®…åÆÍýäbŒ*šN`”!R¨’ô¾˜XmI|߸K­µ½Å`J½²„;µ¶é,¬Qð%º€k)-/_È´€ú¥±†Ãdýì ¤˜1"/U½:¶l-œFå–)Ö2…ZÔƒŠ—ß]'öOÐr[8Jh|ô¨KŒ{ß*vz9ŒäÇö%ÚñUÖd¼äu›n#t¯ànÄVJ‡u…£3Ö„fÙké£åи·˜_?ã—áç{ÿ\ó5¥-\ÐkaS¸D²!¶ €Î™XDàxî°Ÿ€¢he¨y}-šÞÛnÛÊ:0ÔéÆƒ%&ýååŠrÛ^ºÔ;±ƒª4Ðgä"¶xÄG/Áí&ý(xˆÛ…C¸Ü©Ü&ÛK‡‡óÖç v< .…W†·›c„{?á_àŽl ÇÌ@V¤(k¸ZÍst^ŠÆ\+~_© †Éמ˜û¬w-¯I¨fÛáÌ8ìÿ"Ösò>þ ápÌe¢…AJ>èB@6mUã@ä9+÷9Ô6òÞ¢ˆº_ß’ïZ½ëL•1ba™rÈh›·÷lYaòD †aîFµcs!û 0©è@ö=-¤¡iÌÃCÊÃx KžDD–BlÙºexœ,c|Jgä}&g%g”Þ þÿ е°ï6ŸD 0(€@-2§@Ë’”A>ö"bWçðˆ¼E½hb¬!*0§×&MF2ý¡>¶K(Άž”*hÞDöoR ¬|êû6´Uó!G_`º(ð""Ž›æôþŠQµÕ Oi<LG’AJ<ñÓmJ<&O•q>ôWYô0T-$fyJì 3éTËK=tÇn$z¤è:J„šYË‘n<ì¥ïÞ#ŽTæcu Š>Õæª /à›-i.^¤2ΡÎûÓû{õÿø§ª‡µœÜß5Vþž«/nuþLÀ~-Xþ‹ü¿#²ã·‡¿te¾Õ¤ÿ‚þû®`©ÿµÿÁ/®—C®žî/¯²ì8lÿÎu=ƒ£u Î ÷¨>å u‚]?ÀÖ%d®îzÊBiDíÙîK>«â1úRÆ@9­”SÔî ï9vcqŸ9Ÿ! }¼ìÖ¿FBó%Vp¨üz0{ß±1#–Çð†íX~ö9ÅÂ)©‹ôÆ9Š`«`¼Éò’ 4-cõã)Áv¤‡ùø¨ öó$@¯ˆ‹}G&!Ãq[ßV(û`‰{ýS¬+Àºƒ;¤|]ú”þ=ä™(ÿsãé»*c¹Z Ú5¿ÀJ®Ü›EÎúéfþd£@_xcÏ3P4ÙP7ù˜³‚uD2ÏįdŒ›lFŽ˜ä8¨t À%ùÕA覻èOýQR´Žà{y03?²V@NqàzËö²~FmaXÒ’2œ@/ ¡Êï4CL)€ ±äˆ¤Ë…L?{!£óÃÖ"\gB¹Ú—Ÿ8&;ŒT²½€…(ÎcuÊ%Þ––Áa·#ݳÝ\}®ö=§ªjh˜B¸µº+T‡Û*”BXA£j*RTžx‰N„Í ¨So®›ÇÍøçW¸†Vq[ãš F–™*Ô¡8ƒè¼6ûå$†*0m€fm¯ÞÖHÊn_„|P$ì%ÅHÑö¦ÑžØä øT &”Û%5-õ`ìëKa„Âbž#~ý ]\ ›¢K~&,‡¹Fp!êJ£mB÷6 @¼3òírk= ÄN{ù‚JuV¯‚¦Á]U/•½oÂxS(òoyÅ.•{g#šÅ°)ÁD~Ͻnž_˜£uZÈžúÛbf"øúCäŽïèZb¦V]ëé¾sâ(·H´›¦üœ¢×mÛ¶}aÝ$ëÜŽ"íbB¹ß¾Ž\¹=h_òKsx^ÖåA\%-´ Ï”&F„g»x¦ÄDaÇ­±Do±¯ÈG²µ óÒlQ—¸2šK–w?BU­îØüW¾Z…=ÓÆc Ã?4‹³ÅôêK—軀 õ hìÓ„&X.SÕ¨RFÂJê‡~v翵¶x0££wHd›í½¯µx]}¬s -àgsgf<Èv˜9;Pš-­Û‰Û†sˆÆN`„4+z)*ºY™A—‘Íb]¢UžÌf ?¡+Z„ÛŒ;ÝÑzªÒ†;¿L´uò6µ×X©Þ1¨@a–,þÐ{•$y±aȱ'K¯eÌcâ>ª¾£ÃF% ¶ 'm2o{’µØ ÙÖgÒv£7›ŽB±M½Tta å3û¾¿™+ µÃ.4¤%Å«Ë-‡×ÏÞŒ Ìè /Óž7ŒhF'›dZ¤q›ÕÌl í?®¦("Øæ[G%`Q±i+}Ÿ®ë-`KÂö†ôS¼ICÖŸ97 K0nÞ7Wj„´íßXÄÀ‡ C“ S.B¼v7Šz…ÜvǪ́þ d@ÙäF»…+Ñâ ÝS˜htgÜîn"5,ÔŒŒRͺô=@#k"µSXªøòödœ½Z­TTqd)D.³»MW8Ç3ô’4ÄÛñÑejôå`KäCAÝ ÷’er ù¶”VëÕÓ´hú¶³Foûx;~x;.ºwãn T%ÊWe§ZÍÚd6 ‰J•\ù÷Sª“ëœsHr衲\ßýr$•'?™ÓZž4'± :J ©zoýYWû¿Ž‘¬¦ l‘= Nªj¤bo..ëRU8œµÈ^8‘S‹f9d}Gzø#Ô§¸2°ìãmyÏOkôAPh䊹rl@óèA>슟‹Xr¦__¯s@ŠÑX˜ví’-zGórƒ§ÄH™)×çPôE㘙áSa?ïZéùñx?ü…”<íQ³üŒ9I¨$ åDwžÒÓèò•éópXÐpü­àɇþdNË=™ÏŸüÏáÈ´ðóUm^O`ä;ÏŽá×\&O*Î0æáa»?dþ ùú-à‡ï ö#ÏÇ©Ø%nWÈwsIA;*GVæO ß¿;Àß¡ý…yƒ|Îð÷þúŸ›L½žÿ½8 ÷Dþ4["ŸÿŒð6æòëN`âÍ*$<(a-~ò Ìi›Ž›D ¬˜>Fjì ý+ã^Â8 +ðåΊl8èsù Ûí)'ë¿¶QV,‹)æ¾—sæ e¾›¿ÿS²çã9sðõ6Æ^ÌÁ‡š?)óãÙŸÙüVŽ?_¿ ÎçÎ8Uâ8½†ñÞ'\OCF‘ïûRÜÇÊ•É"pð\ÊyLÙHhUF„bå¡ùzì»E¹+¢¸8vTÑœa©}ØGÒ¥zƒÃ^bmïˆá¶ÊYW “US ÿcÑU9M‡€þyQ?2€‘Gž7g8'j~Á÷¥x÷éæáw\ ƒÔ=ÎÚ^]e½vî#-Ó>©ª©ÆÃP+Úm™$Ò§Å#T§ÃžoÛ º´$»säRZâ{ÁÓq¤BÁ s\ª‚ wè¹hа諚«ÊÖ% ïXY’Œ‰, RÙA>úÌ$éìÛܸíx±±ŽáÄ_Œ‘…).S´jäe®x²é,~éùÑ.¾ˆŒë£¹¦Rb•Êiß!ýúº).G;¶ÿˆ*KJ3ßÂÆ\ØN, ¦,èŽV²À¾§"`q÷C—È-{„ͼ7˜"÷æ6Ã,‹­›R©²|íЀ®Tã=ÇŒs9È/hB¨Ô“1³SݸÕDt©^S2 ÐÒ¾ù ¢k•ëÕ/0®B'P½DDù r;½Ïz¶åŠ%ÝdaùñíLx‹­q¹š£¸.íŽG)¼™j8@á½Õ|±aßÔ÷½9ñ®Fª.×EhÅ{p½} fç +(UÅwA%J½Pq­%¥9ô㹺zw§OeG~:ü§^öéšE,µô†jz(²¶²Í̶béÊæÎ~HÐè  ®èýæCbšSjÂx@ üèÇ-е¸D‹ßk`u9¨ßØ5\R]åI¥©¸ÿã)œ“Z‡¼wÄ', =±7'Z>xCzªSA¬ù˜[£þ]&›´4+P(ÕSŸ’Ž^«ItìúxÙ¶÷]÷ía©ýýÃÕ9[nd†Ù¶hН‚ÒÜ•hcÙïX³{O§Gˆ˜å€ð¤”FgÕT•…;uç€üXŒ£¦$nÄ Œ=@dn'K¦š—üûï™Ú1ÛÝQ¤Kx'¤QËÂÖuÇ5—AN«ášSEÈ[oSÔÖ¥Ðö@n’{gˆpx…UÔKH’òßÛÑÈ"À’.²(†):ÇbÖ· ‹ÈûÐ`ªDBS£A󂘨ˆfÈçˈ±˜Q!b­ÕF.Ê’ zGArÑ’ŠØo5…•Ü~“ÂÍŒåÑnîm"xc|ú†¢îL×ÑÔ’H ¼7Õ»– F‡t9›ïwH‹ëCT—Ö]¨ÑC’ùU³oŠì ¹d!ùgµaôÉú⣳M‘µ¶ÞßIPcÛ»1lM8ÉÚþQ¬ØŽj¢tâý±ÅH²>!©3à¡Ì‚¥±Í>8Sµ«R˜7Ú”5iÂY%ï’¿A‘Ý3÷” I%ˆºõ ,›ˆçz²ÙTÍ{l%ú¯èw–M¨¬ù _]ÝhÿJ’²·ßÇNEÒ+IBÔ=#Eذ0©˜™ËšŠú[¶ñöâI&ésÏC½åë|¶¼ ñÍUÈI¯s:1ó-ñ+;£0쉱¦o§Eƒ¦ŒS, ÏVå7u­SŸS!÷rnˆe½¾âc‹ec¶7̦ÓNÊÙ /jVL»øÙ_„‰2|½Qøº.±XÔ…å{+zÏ–²÷®ËZëü2=û=Îéx±ÙÅHçÔâD Óoôñ÷5ÕJÄÅ_UØÿìÔá—/þoo0ƳcPò?h ÀßíkêãáýÿG~&gugm®ø'f ÄÌ`,pcê[&$èS†Ó´N¢ÍñŸÔ¢“¨ÿq¨Öç@¢×˜‚ã¢öòÔ¹¬´*ÀîÇÚUúþ£ù øs‚ʉù¦øèâ’ï’B/Ë#FùîBz0‰*vþ„ðÈx6Thû˜#zèó‡Ì¶aR°Ša38ùH”êÔU8#!WÄh¼`ØŸ#7ÀéJG8pÊEAÛÐõri'{g¶Ú!ù?‚ÀP@i¼£n(¯DUû$#ÿСrä"P¶}ÊaÂßò¸eêÄÐÓyœx¥ BfPN–Ñô¡S ³·ãá€h²ßÌ—¥ÍÜõúiÿW­¨=5“³Å-5N€1ö4‰Ìs€JöÞu²Òh¤’qÐòSTÕLœ>ÎGT5Ζ~$]Ú¢‰ýÎy†*Tt6é•}µ>ÓÊV¨(EqI{Ö‘Ï­ðaüOéò“vžzOM>£0>% ì(çƒuIAóæ ÎsñMÃå±ÁuœŽÊТý¨Ý½ëÑŒÙoN—Öeà§Që ϹJ¦utés"vZÕMŒF(°ÖªžããPuµËû’±D¿–jÇdošm¿¯µJ¤ZE2¸VF“Ã:P <9NØM#÷Š>Û˜%1pßt‹÷ÞnxNÇbŒÇ a!4¹%30q2.sâõ"Cd„ :ÇcZQ¬ ?ÑÁl®Êdª¢¢[î,(TYšçÃK —Šb‰Ð©þâäBT¹Å$“ÿþ¬ë¢JÓv¹ðŽ)oÉuÛ\ŒÇÅÁúxô—K]n33êÒk°öo3á-´ÛøµÄx‡½.e—^¤j) E¾÷ U5qJC{!h@­ÎgSÕµö}‡ùÏ‘`ß÷^È^e)oj?.—&ÐŒ5j Ù™,Aèƒû ¨ˆ–í5ãð| 5jòµ!r ÷íq ¶ˆ.,À¸@ù*ܼÌÅôZÄB$ªŒÎÂü)£ËÜÙÇj¸ÆNÊ6c¾Wß«ÖMPY" ,ç{“ÛËEE8Ú-‡ý¹ÿ šY€'@bªvßD d×µÖ°O“´,k]8¶N¨µ†!Õ)t9…B¥(g^:íÌâE¶Í¤PÛ~ø^þ_ªô^¬§ôï=iñ·Ć|!„èµ–¨,ªDÅùÔ¸b¬è³LÁ™‡¨¹É-²’þ<}Ëy8kˆX ¾EÌì-„ ý6Ëš‡Í† vëgK#J%Ð×>žTƒ·-¶§è^E "q]Õ6¹ö%u‹š…L¥XK„ÀR¥x˜µSО®:ù ÷ROâãR&°ÄUïü4O£À/5«ˆAX¿½•›u=²DnŸ]y—…saü£ªê Ì[T` õš)ù¥ÂsÒw߸ôRå6»T4ÒN ˆEGí{Çô†¬”°€¦`6J¨fªj&Æ]°.ã虩"ˆ?œn›öQni“©1áZˆŠ¶Ú(ûð©·µðvpòÇ>Ž&p<ʦÉÖ¥5i£m£B uÊâ¡>ùê$; ™DDœÒvùÐÇ ähek9-Gz– ³2€2—bU"7\ÎàÐÑÝé_V¤ÂV¢Ýû|!Øbm P½pÝ{‹ƒãéc•›OE˜ŽÏ4Úá(íÑþye› QÕSXÓyí—uS9L¯• O¦ËÅI4&„´S \nÜÒö¦eT7`|˜›BáŠá2ÇÖ¶™‘ëõí£öŠ45ÎaöÊú˜”Ãq–ߢêU!+ 6¯ ‘ä8“çéYý.ïJD–S¹ívÈäú쾨ŽÜ´ƒó‰â‹b”ɶÌèdæúÄÚ,vMµõôœ !¥ ¦N;šs+å[g±ÙN\ZDm ÚÖš·xíþ‚]&³jç|ôæŸPD_¤ù¨á[²{ÄÚøÉqüç]4‡´‡g4ùžßáxžÈ›ÂºX¥UfIü£ïòS…ñÍ„½©ó‚®± ªßþ#ñêæóÝ•—‰/nÌ7"6>È¿RFsÛôÎá>•V+åa}xü•q)ðiyþ„ÝÇß¶ÿºûûïÏþ”ùü¯WÌ•ÿOµàÜÿûÈ ÒàÏ^äâšw¿ |-Ã|’ã}æ>äù40J@}ó̸‡Ç?¯´dä¶"7ôûc>àÉj$KF 3+È2¼C›=>¢“(ÇÇ:ÏS›?_àEýïÕé1¥É!VÂômtãÓÿsRƒïÊr÷„1iyJÛ'a¦g²ar§dß‘‘›”áúy¼ÈKò˜î”^ÿˆ}•Gþ Úg/#}Äõ¯Ãôõ8wû±ÉYë#Õ|@©©€+¡$g|ƒ+L U™,&š‹qÏõ5+OQ§ÁÑ<ìÒÒ})§£ÿyc>y´ôœ?ãÜ €ò_‡ã^ »¯2’ý.´è5Ô‘¿fSûÇ wØ›µ'SØ©ø?©ÅE³Q`-Í?3:âF丵›ÐÀðéÃРº£ú2ZgX¨8륛'?$&¡û.ºaN.§ø2"d/Që|F">t¸*5÷/Q<;#¼›2½“ÊšÓD.AU“Ý1j™ûí…ÅÆ‹ EÕÞjÛ[†E3 î_è¥0R¬ˆäÉ"'ɨ,½¼9AãÑ ®È«"„þÕ1N’Þ·`ž£–š™,è-›çÎ76ÜaŽsE)ô>ÏQèr›œçýë*+ufpÎfbCžrc¾ÏÇh¶7%€ 9†¨¢„,oOQ¨açœa©R r ¤* ÞÇIˆ‡ ÃË(BïqGs¬LV .‘ b¸V\jÞ6¤ñ•A¹>P‹£½ùþ™ƒ–Äþµmï½sÁº¸ÅËŒýŸlÊ÷-·Y%øsÛº›"fpÞò‰ûtaX¯’-Á ¦^ÐvÅ¥Šm†,Y ™õe¨ÈKdWf'a7©"Y›.õ¼zdtN¢ÇÎu,B$ NOBò€²A±½s-ª+7“í³yg˜ÜòY»éEBFù ëùbÛçgy›%n‚ÛÖX´/ ®µò¦ué\Kð!st˜_úêïÎæ„¼Ïþ~rè±5цc¬ff¶tÆÇ׎‚J’ö½ñ*g)-“ETY2 IDAT€Ê•×gý¤tàÌ?f#Õiö¡«¿o»÷6³øù¥Æ¢hÆ/[Ûk’:,înÜ÷êHÍÆþ*ת¹W ;4häå“eŸïk¶Én;N\°º˜s¯,ÚÙ^{µÏQÚp›3_œY‡˜JGÂÒ·#>9_]ÛÌ-"³Ò+dÉÌ¢¶Žld¯‰¹*5l‡Ÿ=6G"S?Sj'ÈŽåSÏh*°åÓ¯lkŽŸ¾©s¤ZG¢cJÞ_nIµkÕ ^%{ò¯P‹…ønü9äÑÄmÒmìCÎð ŸouâQÀ|”ÆŒJpé´OiÄ„~âVtÕI À|ãä1¯– Ä­Yàq\‰‡H×D¶Ä\?ã{¾×D.r&ibÉͲzý ‘¨yL»2¢Ri‚„±:È7€êÇ6‘-¶¸jÙµíP¸i*ÖùÐÚ0­íy1[MØåu97”O_‚ ÆEʤõÉj‘ s:pýÌy/òçñ“$X¶~0ñxczÅüÅF´š%µ&}¤9b/Y$¾OaˆòõÏÌÒ;9ýEÁou¢˜’1Fäg®`ƒíÜéJiF–LžžW™áXR€heÅúÕVŒg=ùÂâCïÆ„%/q"Ô@9ëš(Gã<‡G ìÂ/4yTPtÔá1šÅ~'! ÕÙ8űûiÇæ'‹l÷„þ ²?Þ¡nþÓýl)ýŽ䃂ÿ§Dèߌ<ßÉ”ÿú€|Èð’úÿÓ1~÷2yÌÆqò8f5ÆúréÓì³ \ÔŠö>Ób±Ï±~:üh;~mõÆã ]Ø‹ÄLOv»w­ëÖùøõít3œìT>Íõ|<ãdÅHÖÂrüóCñ÷ÿ›ÐŽÖú²<ØA­Âó‘a˜åUùjvðë¥2Sþlf¾“ âx¬,BÐöûyÖÊ9À±}š<èûùjG—ÛµUÊYϬKg Ò,vxÄÖ­¼sŸH„þIGƒq8S2p¼©„<Α€`ð“ªø—cN4¨á]Í÷.ñÚOÞW#ÎDë”ÕBDøÙ z}ÃVÈx§4 HȽ·@Ö×µ® àTž0{M âüVãT{vÂGOpýÁ±¯{=ZâFŸdýaÒW áy:éFç(iX43çfÅGéà[U×åÿKì ³¾OÕµTµÈ$K5·ú jGª—صEëOnFí†ÌÜÔÄÆžjÌܨèek~½ÅÄLöäŠWÌ–òo/Õµ.Õçg+°³³O¤=hx¿Üæ:ºH3"ÜŒøèÌŒ¦Š/Õ:·ºR¶?b-ïñ~FÑôšûQ5ÿ¢j}uÎÕ‰ÈC–UŒá—¸ÏÏs¹Æï¤ˆ\\êA¨ÈBþ¤o±o7Ôwcè1ÅRO(DýkhIÐûLá¾IUB=ÔoF3ûÞ·íÛ'ܽ#o§@UõYFEpÓö·ýø¾ÿõ¯÷¶mtñ ÇüqïûÞßÝù `-]ЪÓë;l–&ð+ly=SˆÞƒ&úÒU_…'!ާt´™Æ­¶J‡o¢ZvJ>zªS´žümQœÞÇ2pbÔ«.øòìg5 —j=8²ÖRUñÏÕ¾^ÏÎÌpup?'?¡ÇM3ì+\½Líl ̵Ý4«+ÉkyÝ[;KHÒȱˆÄ U#m·É Š4¹X%Dó¤N¬ñl 7¦;$H§Ù<O"ºÎîb»ãÁ ]K×Â…¥c½ˆ!³êZË­žapûSáoK'§ÃÑ­Æ ~jí|UŒÖ{¿Ö# Ö-a¼MlzÖE~Ô“*^ª½™ímÛ+“û™b û¦Ý£B1[mÃÀ==2˜]˜®QäÛk€ÃqU¥‹|3'g@?I1Xo_~Jr÷w?íÊè—¬Xá—`<-Pê}£]ƒ£•^xÛÞÛl3kqâ–è/ÙÕ óAÜ`“b,f¾AñEU¼Z°­F3’ðêÔŠùʹ÷ÞÙ‰LÊfõu´¨¤¶Âþ‘y¼È^[Û,û·ÅÓÐNJt9:L„1™H?€ 4¸–Gý6¥Ku¾ÞUwf1e:T4à”¦Šl#ï`—l³m̾á¾LìÅï\š˜Š,Å×å)8Õ¥©va Óʯ‘6ð©Äz†ì0ªô8'n=öp©“°WäCì¼"ÊiÞgµYùó?Z`â±?1< íÀÏô³ª7Àÿ:“ãY·®=ÊÙòôFñå±øóКø;â1ŽWz~.¿ÀY…ù&­€·fs´Ë³9‘ù=¢ïȳგOíñ­à#·è—ù?_™ÎYn÷ûj>~ϘÏwÇ_+"þ[¢5ûpõ¤^üCÿƒ¿ýó‹ýÇäÊÎ_^&…“m"êF²í‡ãnè•÷å n£>%õb]ùÞÜ3_óØtVí ´õ_7éƒgëðe97‘|L4¥K>Œ_~­¡1D)ïõëp­_ä·†jo CiÇy)4§%h^ ä8Å¿þRñÈ´ããüÖñüñÝfMVî ƒ_%Ÿ¦ô¶3ºËŒßWTè=|2ôÂgR‚Éñ¹³ßg²Ìž÷mPê0¾Û@Ëàø“ 3Ûtò„ÇôxŒøfD7íÿCfmyó²>÷ÙOÉn^nð/a¥Ü¡EÝ9¹@¹1¢S8ô±Ð×_ùZ kqôZHÏFÂŽUÁÞú‰®C»L™¶ngPcšfd| Ãîíò,dqs“‹¨Ž‘˜>Föt¦>—ì5:k7äÂâ=×6ÞUªšƒ.ìê<&z8Ý—#'þœrÈH;=ØeíRr–†i³×øZ‘~–f^ÆÇç)Õ!8â&fÜÛ€¥Y¢*—D³Œ¢ØÛQ+H`9Òý8Ø.§ !‹Mí }Bµp±” ‰oŠ£oá\ifb·ÝH¶ß›ù㺠²loc7îÅŸ6Èzœ‡VÆ«P\VÔÙä–¼JI„ýTŽf8öŒtªêP^†Ùá½LnªŠ®Ë“ z„i@=›@Ô"iV†t€zTÁ¸b[.] ý¦p›pï›\ør1ZpÜÓéŠ+аÿžŽQ^ǹ‡{{µ§]QÓ;4Äm÷÷}Å‘åä ‘?òeW…+DDeYìÙonëò‚í¨ž¾©B›ƒ§„¤§k\¡íBÛ´>ë°iŽ.‘î¬ÙFŸoÆ4"EV8kvLäÞf9‘ÿ.˜úãɬê€q”½:’4%Ü;d„‰ì~Ý÷#TËÑäáft¡É½ì _5íõj“ .æ³À)Ðàé!ùé  ©É+a¢Î& ÝQÜâ¡]ôê"O|5A[5>• ÿ¦a¿ÈϹÚ]uüKi($\ÃÙì]tå+BR5|õOE'IsT‘߯ Ý _@,ÃPõáj³=ü†Žfn‘û1¿!}>ï©%*ÅÛ8]-“ús‹Sp&órépügð,½äÕc ˆÈwŒ«‹².3œƒ"oß–\Vɺ _„‹²“Ÿ>’ûvę٢x©Xw½öLJÑ;nšp±Šzœ_¤"Ë™æã|BŒ[¹ ÌÖ˜Å7£%ÅbÜb{32héΰÒyHGÔ,¬cÑE-ö%Š£Œ´ãºÚE/{Ò’ã“Ƙ¯¹æmžî|­Mê¹dÆsY¬Ÿ˜§ä¡Ki&¦Ï4uR½âGçiÄkCÒ/ Å‚°+\Ïr­x°™‰.’XX»qO&P)Z·8rGÞœa åðŽ±¸¨®•­]¯¶17°ä‡/X—’$¯…Ù³e$¢¿MÃJ ¸Ïýa;®©5É«úê½JÒo/Árþ)/„«…›&¤Æü+¯„%²!@ ð*Ùnù"£î‚Q-C¨¦0Δ¨oÇ7Mºr¾ç§Q¥gOë4ÕÈ"Û$wÙuÎôû¥5ÏÚ•ÆR.\f·Ù¢ü×Ä{êSƒÑÒÞ£S^¬mq<’°äY"ÛÛp–ãÉ´ýÚWaMJI³ˆ…ÎýÙ<ú³ol¹:f¤–ÿ‚¸XÎÞ묒_\ïÙœÞÇ®8Ï8oVØm`u:i¯lnn¾>¿ùX¢§Zrðx¸+2ž€¨QÍâf‘LÖnÍ'uDû§k:‹äN¦³‹‰‘cÅ5EÔƒh|Ùc~ÄÐþÊ‹þ¾açA¯•-|—m2ì ?YÇxó1!¬/0ý÷ ç@|:*§åcþÑá–Œ‡vÄâà èlâ”WS5§„.“WðŽ¢ƒ‰¸à2yŽñ‹!ˆ×¨Þps^m¿üá÷ÿNÑGí1["?«ñÏW®%çÁayó(ú Ъ ¦p…3Û‚_)¤üPÃû›iž“´ºí…;ƒ·l± ýÛÂ~ž[ü~à}àL¿ÿ7Í;øÎæ—Oÿƒ>‹·KÒ/.ÒG °<ÀýÝùz4ÚöB¢­Qú|JKõ|JJÌ™©o)’ ÿ.A°”¼ŸÈ7ßÚįO >óÜqúãᡆŸ;—÷èŸc‰ãù"x™¢½L4л¯2@ö¯ÂgdV[z»ÐŸ9Šab‚f€`f€‚S¿úÃz-öÚ^yXæcËK›b„’;Ú™×ÙE—‹f:ÙÏŸ>/ÈÜ——ø FaÅåh/¿ÇkSd!–§ú•ç&ö„Ǧp9ÑOA¾š|qi˜ÃÐüxhÆ”b\!WŸ»\´i€¶•“:ùË$êNóÆã”Jx]××{[X% H§“¯ßöKß,?L'ذ¶Ú:Pé䞉×ñHùD0óíÌ=K}…¡!¸Ðü]ZX¶(G;¸ Üú%5'ºÔ`²±›´ úËr¿ð²ÍªÔ… ¹þÝ?(A‹f¾ó°¶µ„Ý#/Û²åÌ­%m¦K’ vŠ=§ŠÁ|öÎ]¿ÈúfQ&Š$:þM\ µgË$ÍGVŒéÝä*“XÔZÔeÅM™`™!W*üZKzËñ>Ñ(e A‡g†ð¢–Û¯íMæ/$€h¬É9À¬v·ÿËŽÌ‹ÑûÊ},¶|H¦«êvQé“ßË٠娶éWÅ[—"r‰¾U„Ý£…K¦þ8ÖYKIÃÉ)y=Âk³ÇzhÍŠy!£¾-Usý7¦S—òÿ¹¹sõ Ñ?„S`‹.L JˆmZM©q€kÑ*^/ »ï–!¿³Œ˜§Qäveý˜æŽzAÇØÊ—ám\@n¢3ÀH[DrßæÛfí…³œç•â›Õ¨3…ø„tµy¡¾‘9‚Ñ]*”‘#}jGE ´%>Àëœínã ¨ª«r¬³›íé Ñ9‡¨¶¾8;¬>éI|~þÌÜç1¾Þw)Ö1cÜeîÆ è“)š“sü|aõÑ6Ž2)ÇÉäUÊD’|ÿaF(%|LaóçŒKH\J˜®|Ë*ÇÑ,3†ÛæÕ³œ¦EVðÕ¤ŽÏÎãÿCÞÛmIrKºfŽÈÞïÿ”ç~î¦+à6î8"³šMŠ¢¶Ö™5K[j6«ò'"˜›}&>(ðdãØàíg_òSí¢ÃóÕÐÞJ²Ãñ-¢WÏ8õA·Îm¥„oNK¡è){>û8ÿ©àïP}Ü~³÷iâÅÙ*$Њf cQÖ1y*·Ëß×%,þ¦ÆâK[ }X7åÇ|[¿„áyŠÇ_΄3&Á7Ga'X}ĺóù›ßü½ñ¯~ñ1ê`…m²ùø(>‚þ?Ó»~CöÖ_Ê |.MÞBêÿùûßÇäùNåçoüÉÿÖ(-±Ç Ͳʔ¤&•Rë%5ãT ÕÔíÒëɤ5($ŸÐ³\"YÕ[äsOмɋœ®Öóåå}šÞá?ûï<þʇ››G}̧§ù/D|jñíJù¹*”Zq|’m’Ñxƒ ´Væ5h¡•Jü¸·™=¸Go+‚Þ®×èõmÌýªÌáæ&®þ6´~¢d‚¯nË‘l¢½Ëbaç6ÛÔꙄ¾­öâ:åÎ ûe|¨¹ðá¥zw¶ò”ÚÕB~v(9«‚ÕÁ°Ñ\«9ÖžÏóG¹Bs¦‹k[A¹a†ë8tåñаEƒýd!ÕrzRR98B¼rc\ã2 WEjB¿£Ù·m;Ú×Tˆã®e&²a2íA©½¡èa&6¾ iæ;×™Ttêv=ôx§É‡ÈV´•Ò 6ä^XÌì61ž>ÝÕúħá{Œ{¾‹V›ÞãÏøú@ò;‘8¨=³Y¦,͘&ñ•ÕnÑNƒTGÜÛ7¯´×3#ê -• Kªx½ße„•×DÇÔ”4h9 ‡ñž;A`ºç½Ùe^ä Г˅Øft¶@‘Ë_´¯µ[3¼†QøòÅÓ„× _^†9òïšM¿F_ ¼ÒCïêV¡ÕäàÅW4¸î{re ¼Q¤o¸gÊ€'™ X\Xƒ÷ôLžÛ²ÏÐ&éî_š/У à¬Þî;K="§>Qä‹"×Ë¢ÇrI5÷t›" ·Êµæ9³f‚4ËO)¹Ë,* Ö¾>`F튧ýx½Æà1¶%Ù¥é·ã˧»hÈI™¯Tµ `žûa>Jèr"iÄœúj݈rÝ>2ƒÓ}¼QS“ý_Ê9½˜¸"/îpûìU#Kè0 O¨Ã¼ŸÞ~¿|Ê$é5Œƒw³¼­Ði>WÅ|4!óþßÀåBÿûœ¾Eæ³e$¶ªƒpAÓŠiŠ>¡0BÚ‰¹uJT…(£D$½Œ÷ô”ñ|n`°Ëx ÐS³‡á4¶QNÍŒwDÛÃ\„&ŽÊ6ÌbÆ?j´ÁS6(ñx‰yÍfY˜£OràrÞ²·\ÙP,˜lÞ>“¯òúqå8qBWàò—òh`°‘Ù£ܼ¦•G¶i1âsTëíÈžˆlŽ˜+Âò{_ߎ+r?e€§ØÇýóÌs5ÌþŒx*Þ>[7f­×»X葎 Á°C²å‘Ð7Û>ÙAƒijÖŠyÔ{•S3(Z¾å6Ž“†Œ|ñšô¥µ{Ü‚»Íð4RîÛo'kã!óŸ%\ÅÔ†žÒÝ>DbÙ%Á§'€´Ö´¥9J¥®€h¶ÓÁéc3õÈŸÊ—öÍ®„°ò× ÝŒa…Ψ€e(þ¸•uv½®•…kCI³|~ÎU—Û4%}S9Å h6bj0ʃUì±SÜÀÅÒãµ3ßÉÅxX¨)3¯ áÃt‹Û Нoüè­_ý°ãh·ݳë_»]mw]¥˜jyÊtm¯HüºQDI“‹fdà¼ðî×x …ôO¸-«€×L¤ìÀ æ 8vÖƒº=aùù4©>©sO/¬Bç,iŪ.“Ó-0wk—ë·Wš'ÒzrEâõ\`cO“Û{•ÿà×J‘1€O§q”­ÌÞx=9OU°‚ ŽÆ¢,€MZ³Bƒ†1HZå`8"2äQ…ĵ ¶ŒÊÔÇàådú¶‚Ë¥gQyÑŒdºöjy5{k²Ô`‚°íä°–” "¸âzˆ¯¶Â©gÝšÃê €ïÛâû+íV-Rᾇ1ˆ*Dnud›Ë©'ˆæ{KKå<º¶Ï\U8®]=Ÿîj Ÿîgt»ž^S¤ 3è»<ÂZàâ ¬§I~Ù+CÌåì}`zSKóçZ …¥‘^ÎPº¶¸~ûïöÃÿÝ=×TÿÇ–¹]ʿУߵkòMÙû#?ó;ü×b‚(ùY\ì;>¢x×Þ[ ÷CDãøÎ = ÛÜs}´ÌóûÁ¾·ÕÿB9æÛÐâCíÃãÑú––øCƒú/þü»ìŸGýÃâû?`öÿß©·ÄÅw‘ÿõŸüõ0é—3tÀúsðþtÛm´kÓìÛ¥±þ \hO|»[±&Ñû'?uyáàòêYÃâ0¡ºiàhWëf½Obõù ÑÇ™„_uÊÌýb®÷6èžñ=†ðgw‹>夺Ü__Ò7sneŽvG®m®rö©ÀPoÿÞµ‡Z¸6ZÔôð‡z¼ÇH«N W·Ë¸ëãë?Í¢E­~ã8?оoyŸl©–“¶ÿqÖº¦ £»ùàµæá_Žôj“™û̆'Ãnˆ|? ©³·Ö¹ï ‘äZ$sosáAõv »{éÒ»€nÁÛ‘çë6€BÚ8-Ð4ìYŸÞ.Uó$ë¹Ò燌&a¹lXÍ-d–ßJø‹CC>o˜òIœÐ£+x×WÇ‹ºöÆÊ/뫉¬‘Jru°Û•5ˆ']‚98Û±mQ‰!-ÝD¢§C¡,Ç #åeü_Ò\²þac½þ(DÅ_S{ƒÙÈ£“@“aŒaÊO¥#€hÃVb=,1w»Õ€¬„q°„ÿ$ºÁ²¶.<Ñf£ÒÔ5V‰ÒMlSj·ißçœ3üy›ùNʸËé AüNA…Ê`š ‘yZ6šc®®a”}2Ìqˆb2s¢z‹1½ÝjZ@„I: ž3RŸŽpGxîS¿ý¾ý2Ðq Þô(ª»é\ZܺD&îÝN8ŒÄ˜3•þ\üú"_l° +{f_¾$—<špU:‹»U¬mÎÖ¬CAæ¹ì"†ë5Üqß÷í~‘÷ƒ)|¯&†/®N¾ÕC›Ã/ºIøš ôÞkp¿\vëÇËoŸ?§ÿÈÓ +<¶NAvK¥bÀ÷…4ïmãtÝŽ«Eò-Biºûtã(I2É>ÒÁuœvYÚWј€Ýñ*'ItËËên;ýmkÂ\7ò.V¥é_S{K]cX>­ð…è3ô·Avµšç…aš×òMjÞ«MÙ#îå*´TaâÞÃÃb¬ðê‡ÿv5Úk5L/Šu+&±rç¥Å’à+ÆN‰) È™ >|ÑR.év,KƒM*R?0= ÏM—üK·ÏË5E¦“Z 0Lí?g=·‘ŠRTJG¹°:hwuÂ礄—,¡aÆdŽ91ÛãûâE¸(\(ü„Ò^}Îè{—à^ûœ,d!䦨{¿Oª •w¤Y˜ùçÔ¬µ «Y}1Ì¡Ý,¬åÎñF[k$çsΡ£# þM#}í›2ï.ÂiüÂF‹·ê'Ë‘rsúE9¼v 2µÚ1r…¿åš€W'·V´Wê ‹Í²ÏäÙŒºâ1m5ƒÈË„+·¤«­Ièt$=þôøi©øÓ# œô!ÓZ׈ƒúŠ{>DQå0€F¹Üʈ/Ä>²ïj=Ë`äß>åývË:G„µsZÈ–/fAoÑuø»#éq@)NßJá™f*Úhgì†õ½BG]°Ã >‚‘Åž‡Ïì†O—ÄÄ«íRWDÉö~ÊZ>{,™D ú³ŒÃªuÁVÇz]µ[FT6ßn@´køŒ’äæÉFt[0~þˆãi&]êqáK„ ´¸_‚åÕbâ¤à0‹‚3 ñæ”ùÔ‹¸¡­úzä~Ü–Î%Gé|1½°ú¹ê4³&Bv]º§º0`¿ú6&o˜•{%ôŸ´ ׆Çòì{á  6V³O¬é£šˆÃÇÖîj¶œ IDAT¾/^okyòD-«ËÚ©}o=³µ9«£èæÈ0/71W < ±‘Xõ…ÕÇ»k½q•¬/—d†ì‡ˆIÎÃò eÀj“\Êå¥Ôìé YT74T,V^ßëpT«øl,¥‡þÅyJ‰P?[W`~­Fº£Ç¾ï>xOœ|™šÛ—hÄ­þ '7wž›™½º =Øfqµ¤Þ„<å!®óÔcÄâý <@½ÐÜïÎõïë­»ø-§ð(Ö7±ŸÌ«O.ÏÜ)Ï3®_ü5›>ŸÆþmªüF“|ùãGY#O7‹ ¥ù&»ÿZìþCÝ¿ÿÿþÃyÇòðœ"ëüœûû·ïó‡9€ß”䆅¿N¯?.Žÿø àßúôi$ðßY†,½?Žþè½ó|RutIv5v=L—k¹Mô¬ëX,3öEbA ¶ì ¬ýÇðó1 >÷jëļ!¿ï„ÿ7ÿÇ¡~aÝÇS‚+{ÉS§þpóÓ òíFï¡÷yÀÐ›ÜØ<ý[ZPš8›:ÏG¸mãÁT£}2°Ÿ›¼J,vÐ’9Äfì)ÀtÛ%ï¨6ìÑ?¼P¾:ˆ;‰uURëÄò´âÜè"\Q'#õ˜B,ffÏj¿†r¦síÑ÷¯Æ~èŽüeìÓwñ~Òz“’2a º–²–êt{¤H-Í9G@ZMؼïÐÎÒrZ%áí¥C‹ÚsRÁØ’,ÍWëW·jÛè¶µ([àÝògp}ø>%¹ÙÔÔòƒ­mùÆçœæê’Ý_u@lfÁžŸ¼u/ˆ%sþ.ÕE+ÙãAŒÙ™Íæì6Ë9ÇÎF­¯QUæ^ŸÀ:Ÿž¸¶|°´ëüØÚ¢\h¬,ñ]×¢‘WttÖQÉŒ(ñ[íy>Ì®1Fì¸2he´é3U‚¸ó˜m–i ÊP/+°Ò¢ÆŠF¤ë~9ãkðÌ]€À• {£¹Ç¬žæP Sš÷—jˆøaöãÍåÿH$‡™Ì5ëE7[ÏÞR2Iâù²µ ±^?®âȸ¨Ä¨ÈGGbãMÄ÷59”†&¸d‘Q‡®&Œ±4(F!ä¼l1É"ú­h˱<‰Äß}8åÈÛ à‡Éäw3¸›jα0­©Ä5ö2^׸^¯—ñçOÿ’n—S?æä4¾Ìf•c¼ 7Ü…ÛýB9¿Ü¼ÆDŒD‚Lµ¬™šú²yOüüŠúg RÆ*[jí$4§«ã†Ð›*÷Êiän÷A¸çÏdk u»Gô%i¡ý‰pdŒŽLMwÈçŒþ\#.Z_¼¸€å÷Lt:q%í\pÊ,'9lÚó ÝŠ¦%ŸS·û¼cÚ:¸^F ~KCœà ­kŸ«º“‡pMÇŒW»Ê'IÐó¤=ã_‡Ì¯!»}¢‚z‘¹Ï¹T¾]‰Â”üJSÎÿÎafÕà1ýæ*‰å–»|È® &ÉÃñìvÅM 9'iâŒô…–¤ßR¥‹ì÷‹Ãí»âGk÷á M](”aA hŽ)p;&yƒô¦+Qi2šÉò§¸d7±y÷JÀâv£w43™TÄliÒáG4«Ú›øÄM__ZÛÊ•m$ÉÖm}¶ƒpoO"£¥y‘&m/\ëï\K`¡ce”¸rA“²Pà8šc{?yÜ÷è+‹ÁR‘YŒ0¶ÀÚžÊ _Åbì6åU ³—ÛÍËmœ-kDzFÄæ¤ÑßÛ23‡°DQ`Qª$⃪»"ƒƒÄpÓÜ6Û\¼¶²ÁGšÆ¬érÙ0tüÐr§C®ŸQù:FS}Gø’cä{ÿa˘³¶÷k]¼`ØÆ1Æ€Ó÷÷H|{ÐÛX,qA?ÝÊŽQ‹ÜòmbS\m”ô©B±F=+³:1L9†åžA¬>â*cØw ¶4ÉçÂÕXk¾‰Xvð Õí CRMªâ£Ã;€kàÎ{c1YWmIò3»²zÅ–ê\اe´èÞ¶È–ÚH¸f;ïØÛùDZÈl¾ÄáúÒ„ÆÅ¾cÿ|Þå'õêWª/õq¦Ža$+$_ûâ“ånmÄF)‹ëIØ Ã"ߦ=¶ºøLæJ ÜΖӬv?½=kÞSj]D\Ž­ŸFÕQz=æ e}1îG #*<²°Q;ïöö<59+¯"‰6úÌ`§ÓËçKfHÕ‚qv åk¶¿.íJo„õ[uí\¸·w9¬/\Yȃ?rˆP§÷ùÿ%Ù`EŸ ÖÚ³96"ÉCzÏ+ܶnW·\I´"ïR6×Äá;7¦ú[f{Gu,åGéýø¼¥]üÖ¯S çûáiZoòSëgY“ôßñ½Û~KD&>ô…45Q¿Ru0ßω÷7ñ½²¯oŒí¶Swš?M@ô‰"ÿ ÅZo |{³¿~µJ–ÖŸœð»÷udNþS²ø?ó{ýÿ¯ ü¹1À[ÍÏÛÍ$4•jëÑ L¶2fýyª^ÙÙ»LxZ×õ(¿àÊŒ>Ñ n©^ÀŠãû·35éÃ:I… Aôö:œ}dòèØ?6-^ïœÿ Ô%æyŽ®þ¯ÂËe_q·Ó ½Os+¹-Y‡°XöG{Žjí©RèÕg508¡ÿç£mñwJ`¥× K˜ä•ú`óD㋵Òßušªêøö¡ý§¶ E§oÙMتˆ>»Aä©…c`Åz ™û4lüßîŒ5ưf|ÈjÊæSïþÝ*º|gV{Æb(á¬zDä¤]­S¶Y.¸Å÷l}yáf Dmµ³%¯VKbžô€s,^ü敵gMÜbv’[µf¤‹Ïw[o@TùxëGwÂêí­Ï@@žpŒ­ðÊë£HþTtÜá\ŠüÀN¿×çbUþËv‡ÇhsîQ §Óy! ½†„:JIóDÆÁë,´]3JÂ~®Ð.˜ËéU-g ,¨Bv óì}ÔÇI“K0^4.»ž\f´ž³ª=°Ù1ç[P왦Õf5ªéSjpž&£Úž¥%_ˆäwá¶Å;ÈÈ)ÇÛíncpNÞS_3u±é€Ã† üÀu›÷ö¬P^Š+ç4ÜÒäŽáºlÉ4|Û‘³ìfQà!÷8sÙr˜¥?z˜ÉS=º†mËUSh?«¬¹ÝXù %IÆk˜›Ëí^•nÆ‹E¨u»«ôÖWõåÜ ö†¥éQ˜Òó<_”nÉoÙàXqW}ovñ ™zJ_.MM@æÂPʨ5›´‹ø™“¸›05áxg O­V«©ßúùsfg58`# ù¤1pˤy‡¶¬ìýqOËqÙ0~ šó‹3/ÞܸÌÒ—JT+¯ÁMÈ,Ë9’›H@fƒ˜šžßÛ Í†êP)Já®è÷uls€eÀªÚÉFHùýn)…9Ðï©ÿ{OBÿóâ%ÜÓ¯am3hwlÉ&1–¢Ä஘&º`t'¿»»nŸ/´ Be'pÅÊŠ³HW ƒ$ðq–W¿å ŒyOU³k¥‚˜3ãš™ÍA ¿<݉˜ÎyÝ’ó2àj™·Ð£±æ œC#AÏîî2a¶¼ˆk\Ä—*å6ÖyËy~czë¼Ì¾E(ŒñžJKË;²þ6Ft áK·d³{Í2Ôe¹}-!EÓ±ZÚµfQôâ3›"Õ[3«Ñ#|'gi´aöãºf|0X€‹˜–ð˜ÅÎ'Jei 8±!æ õÚÇu«éÞÛn'†Ï^„ 5¤|N\V 1‹÷œ —ÁoQtfEû„§Ñ8{Äçv–¤£½–ßÔá"4Æœ>S ÙHâJðe7d÷&V6©²zû  °P§óvĪʇÀRä4Ãté Àh'wa:.–5zˆNr ƒ~S_ró9 œÃX‡Žé‚¦­Ï³«Q§s’ñ”‘Ñ`f㣴³¸öÄ@Fçt9Ù™„ë§df—õö³š›T“TJ‡ñäN¼üš1T¥ÑJB$é¥Vwš%¨t~ô9-#03Ü‘ý U„–©˜lB´øˆ¼`7"ö¼2îzÜ–°Õަ-¤v $tndÏÒ ÏÊ™8aÄ|B¶,dëpÚ°¸¢ÚC6Âó”C/&ÕE#Ž»…sVÖÏ+¹C½„{ë4ïf[Ey|µoÕ|qÆ%Â.{-‡»œ:ÄÜfŠ>k󊡸խˆ¶¬‰§âT¼€ ÎÅÁiŽO¼;±Æ\îVí”6C‹,97å¹%`mç]•+2r<_7+=Øà¦H0ã5Èiw<–½ T*ä2«Ï=*‚åkG‹Ø€Æf|—Û׸ipÌã° À$0÷YFÀÎh0V¶½g[:µ¹`+8æË3£OÅ<ÎÊÏgO²åç:bœ@‚E(:ÎÉ[Þç'5–'ËŠ'r¡‘e>–ÿîèoÿð{Ú Ÿ©ŸOÑ'â}Ís?O¾];4-qöóì]eÞÍêÕ»öªs:‚‡nq#ðƬ{^+è-…ëûëÏ®?<Ÿ4{âÇØ˜ÏîýBI×g[½Ž%œ<»|ò±úÎçùÍ:ß_HÀúDþÁiö·ïÙA8UOy}Ìáü%Õœrì¡? Æü3Rø/êyÿScý­ïèßúá}HÛá7û>äÖ~¬Ïðö(züös¬z˜²‹‹r<ÕŽ{"¶í;i&ž6„$)ì7×Í€« ›^ƒï>xïÜ}üWé[û¿>)õk²Ü‚Oä¡ï7mÍ0>é–‡Ðö ãóüÃÌ|‹WUœ]¥ðº§Òʪ^µ©þ9¢<+ÏÞªÓ³ïW\²TzÖE–&ú (•ÿ˜­é…$.\F¨2!ÞÆIm½ÇÝaw#r0PÆ©ýÏ…$Ÿ\™4ï+ë÷ZY¦3ÑnzL`ÂföéKŒ»[ý?GC©Õ›µÖÆÇ% 4WŸK¼-´ËåÎ>(^¾\Ξ߉Cio>2 qZ!njóƒaÚê” ac¹ðä¾ÜöÍ‘ƒ±òÇúvÅ—¹.–$s´ñ0–òŒ2%QtÛ[Îøe¶Dw›tZR`ø¡)}êQÁ£ [aâ4[)ŠF Iè‘ÉXÙšÌ8ZÉÿV ô0ZmÊ•â€ò`ª7E*Hw_Ü”Ö+ SÒ‘7×L¼ãÔ.ªÆ8®™’'9feíG€ª´Ýâ¾zÜÂû’„"¯R~Í1(àÑq¶ºÓÖkÜC6@Â×Lz’Òg`pÍ(âåö5½E²Ö|© )‚zñÿýŸ¹×á\Z›Úäa’yE”ØÈ@4D©g<®~˜ñºb`S­é—³¼ßë$Í é >R»†ýÏe¤ÁeÄ‹˜À«r,,x:ÓàˆÚ=û-{Å¥ÞÔô˜½†¾êS·æ%@f^Z‘|Üòqs÷ýÕÈJŸÛ ¦nùþE#çÖ~B.w÷Ÿ^æôcuõ˜Â Çz&;P³}Dõ4jüXóh¸lT!ªcš›,07iêN»gf­=mÈ©â×à=W7Q 6Àa4â>ŒS‚!‹$ëi© æ=èm)ΞUôGO]ŒÕ7…£&äŸ9ï·›k„Ú^ö½u³øt~ü‹ê‚¯)—¨ˆªT C[ ª4`Sµû5°‚|¸9!&‹¥Æš(cûŠ)`Áî t»ÿœSÒËØã¡}æ%è®Ej(‘Mc– 3¾.Ú4e¦…bزh@ÌšÒVÚ±¥.÷šüB&~ “fí,KbÁÁ€RÓCŒô‚ÃÚ2AË2ãÈiEá£öÎ3S)à~Ö±Z*«"Væ‹ã§îÖj €Ãì—¡qÒ}Š)ôâõAãòæ¬ ÜjŸçdZ¢jÓ—Uª1²sóŠä·öm7\À2Vs}k:¾,“Z®o/Œöj¶Þ˜½÷€<:nrä|aö3tLjhSvòÓýºl±|28°dªHº6‰» ªð)©.˽•f]<³â¢~ V×fÚbã4}úmJÔVfcîGwÎDWÿd¯¬¼@߯Åü7öA/“kp\㲋~ûrº´Ÿq 1¢Ÿ¶+Ù¢ø9®\ÐmG¦»j3i0”4p¤5!Ó.<Ñ®"êë˜nlK+µLæýDj{<“F Ecãz 7J~VÛÌ p\f7ô)Þ$ó*Mw‚1ìf®{îó8|ê)aÕqXd=37t‘÷ÇfÅsbÃó~Ô4˜0§­›€Ñ©þ~hýxNßìùp}]À4 ¼î6b¨)£h^OðŠ-ë£Ñ§Vð¡l6AOUôÐOË-Ÿ¸kN»ª.RÕIG˜Ñ׸@£ ùego~éIôÕã_eÜõ¦´þ£Àxÿ-;Ã Ì XÄš®½i~2Õ¶˜&xEЕ¡öIÛ=,GqœÚåÇf…ª;HiÕ!\°ó¿º0œWþ£V“úà2®KíT #£Sêÿ Î¬%K´65á“\ÌoÄFÄúVÒç1Ù?Çs”pª6Ú->øò¿‚âÚ=ñ‘ ñ6êÕ/ý¾ü,Ó²q—»öiŒëú>=¦?¾>!~­1:ôöˆoÿ#:½9„?p·í”ÔÛŸð|ûÿç“MÿKwáÁç7“6œˆ.|šü¾¢ü€üs|Ÿà'ëô? ÄÿÃöÿï>àEÄÿÓ{îû¶ù;WÊ÷µÀþ³G™Gÿ¤¡Kn„/Ò¶¢ð«C„ö ô˜P6R˜àT>Ôù›Ïyâ§iH?ïtû¿ÃúÛ}ŒøúxàùÓKa¶?ù©ûcyQ¾ßk§Ê;rŽÒÊMÏþ¬¾6ém…×*¹k[ ;Vµ6¡j:Ú–Ç…!Ú_Д ,Ùä_WÛÃÈbäѵ»’ Äù–K0e'ðèØåŸÆÊ³§úˆ­Do¢SýU=¡FˆPíxt/ )¶½üñIjŸU2d ã»ûðå¶xþÞõàTAq|û/Õ5”*Sjûj:æ1iéîãsž°ï˜Õ([ÒtÈ‹ó¾ñ…Çé7\•©*á-†ÕÝFãîl2Öð ÜŠí¥­¤t¬5S­|ˆÈžÿ4 ŒV0e¬² ë P…QAYÒýoÕpWó¨tjŸ)ŒÃÆn#"¸È2¿‚á¤^'=Á.[Û³¤.•¾ßÎȬÆ,:(‰dLq• <îìšÎ0« T“‰ªÍ?ð¤kTyµ'²J?êOË*ÛQfô&lí~Šë'ÆgWœe=%6=­•Þ1LK~ŽîXŸÀ0›sÞ·_ÃRméA½Ð¾ä’W©oßÂ8€‹v?p†~kYLxx\*«æ:,\]mÖƒAUØx™]׈ºGxÕ ?S’h¸Ø7´š.?ÌB* ŒÄD\@ô:¤kÐåFM}¹û§’´"GcN‘`‘l}ú—á¾§$˜CĬ`B¡h¦¦OQÔN»Èå­50óÁ-Ú%—•›ØÆðÛC¡ððI×Sn wðvO}M¼ ÍëHn»£{Éñ-—‘ƒ„Á÷꤀;[Å|T¥¶;^ çÿ8D­‘—Ü)»ë¢ &Ú-µ¿ˆ¸Í†ÅÃ)åè-b¶â˜')ËeÉnUµ‘C[\­¦Ú*Òné7Í€0Œ>N“r"óp!',—e²*ÄíeGs¹&gHHy²–YØ×C[ÝB>5¯zDÛ‹+åGÆì‘~j}r‰Ü2™Å’jJ÷{¸q‰+æ¾æ‹#)%˦88°+\ÖHoý/3àv9üžëʘ’Yí!,ùéƒæð¨ öµ¼zö Äx!í·ñâ/Z²¥éšð=™Ó†·ÕÞ†‚È»ý€Õ>›Ñ.Ë·kB—´ìÕ2 dB…Okr‰{p wDÿfvçÐx§£ß#1vD,ÐóF£kŠWâhk[ùœ6YŠh{Ã&+ÉíÖ4XZµkDB_š—.Hk»â³È@O>Êüʆ—w)´Ã欌§6¬Ò‘‹–UŽÛ0Áå·¬¨ á° ýœ~RBAÏDOЉíHQ{À*´1ƒ;ªé¡,Ë[oU›s7ƒjÔp> 1LÀÈy 33ã²(/§iÕu.†LÛ·bè(ÚèDbÔÔeÔ­gù1åmî~s È€™ —„)Ü1 #ÌqK]f ”w¨ÁAÜé%€×|Vbd=€±ö‡?uØÄ£­Ü㊠ÞIÌ˜Öæ²•^©¹ÆÊeŸÓdÓcM¬þcŽnq•ecïœSå-_¡ØŒaæ{Àƒ2 ¼U¥r‰•èÓÆÈg1àr×0<·0£cWɈ‹vûÜ)ÛŒP¸mDývj‘ôMÙm {8¶é#G,$Fí"3FÈC+資ÓùG¶Zbi2ž£Ê’gR¦PS©Ìy¨6ø£^Û¢'Ü,¢’„›¥¦ÖTì¶çõTM¡Ôýèr_á,‹Ñ5ú#/úÛ#õÃDèßÁtç7ÿóOÙíù{?ö(þþ[þÔ0à_±ÿ³  ÷ÔŸo¿ãvû/au”|S£ÿµ@m"%òªð|—YYùiBèBÿEž½Mf;—[!p_+Þ†RÍKÓÊbôµôø³Í½{cŽÉsÐòøõ:ìûGÿp›Œ¨CS?ï§øÙéßåòož=M N52¹¨Ç+ë+«5‘‡…d­~î´±"çû{1ÀnN{¾Ò/ØýþÇšŠ;° ?Zië²X'­¾Š³ž\Î#èíÈ®NnkNч\½‚ª\×5 “¥Û;=›l<äÇÑѳgÉÏLXm᪚5KŪÁUï%9Ìü¼w[±B?÷/ׇ¯”æ®G®o ä³úÖb @š¹¦z>¨¤ðÎÀ¬9f¸9]Ã0ÌRäÒè GÊz}‡ 4}³f‹.½s[ïÓR­vw†úr•E¡šYS\©`•¸;šÓ¦5ÜiË=<7šîFÃ×]Ñ{X‡µôϪ»\wGΉ×k%Ê‚X…²õ7¹”4ý[ÙçêTaÌ2ß…-£ÇEp’¦¡â*—Y´ ·c”q2f n€tcA´ a äϯù庺Ùöm •Šó“VjE÷â?8]¸o7æ‚j¹i’“ëüúcpØjŒÖ(0ã%0ƸŒw]×=RñåâöŽ(Ð 7ÀÁa&èž ˜ ™šg HÙ8ª£_Ílˆ˜rw¯m Âí¤\ƒ#-· Ù`5&ç•Çéµ›ÄvÒ¢¿¶h!áÐŒc?©ªÙ\ã2¹nW€[ÿšú‘y–$a¨ëFÐà–)Æ/i J­£Ú<Ÿ@ËÿŽ£ŠeOÏóÅ™$ƒïŒVgÑq¸¢ÕžlSŽñ¦Œxa˜-~Ö.{åø nÁˆ…3Í¡‹vŸn³¤Cúœà-…1Ø5„­˜D«¥)9¾Š1ÒB›ëèhtowrÉi€ ZÌv2wàÚÌᆫÇ3èHjÃgj¹ë³rEyi0ÂÆ›¥°ïK(”vwù^Ý%—qÈdó’Ÿ!øhñ†¾¹£ÛbÉ£æv׊Q®H-«/sFÕ†3æ\½Á¨æÉ]b¼«uö®Dp®K®+ñÅ4÷Mþ+~äô'%‡,°bçÖD˜.p^ÛËKÐ}M"ò7BäZ¼ðp’rî– qõ›[ðW•OäbU5Ø ÇoJ,Ù:Y•*ÿ>4dl12%2å@&4Öˆ (dÔœ.»g¶­{wæÆªiƽî! çX>ØÌf@f3žÜcXHÀ¤™q7à_1ÖB62ãN®´jÈÏ+Ø3 ªßú¾ ÅvõÆÆ¶‹-ÆsN lû/*_Ïr!ŒÁ— À1=X‚‘=تèŒéï€ÍŸ•³Vû©ìX“‹LíL÷ dd;˜:‚‹µíåÙG™l² ¯#‹¸ŠÂÂ.ºûî ªg¿­Â2˜ Þš#€þáp0>=Úþ8&õIp$r%ïäfÒ±÷ê•­ÞÖé.¦œéKGÅ'•ÄüØxD÷„ÃÝ!Ü¡7öc.XÜU–5®ùŒe(…Fc,q{ÆÅ}AHUÍÍ YåãÍËN›ê®õ®SDH¼IVt£jYá’èã›5\ó¥3äs;ÓÜkÆO­>ƒÍY‚G?}n,=SËK‰ ðÒ8È-ÂV)jH”À²Ù.±Ÿ•ðå;˜¨6^ 7y·©öŠ#Ä·¦áÃ/¸fÐۊ껌ü°$v`LGç“ßÛlWÎ2{Û:”×ëlh’Í~ü[Pz®£ú»}÷åRNÌØÄˆ¤l‚æG6û“£ÜóÆè}G¹e5ŠH|L}æ’ú£Æ(èú<¿.ùæ9ýÎÈžŸê:~ñª7…â-¨Á#òžãxkÌ}ÆH¾µÕŸÉ„Së@å'éþ/Yÿû¹Ãõ IDAT?ç~­éÿ+âû»(ø]Ä*Óêe|ÎlüÓê÷û{ýg’ Oÿÿ–À‡ÌWùrÏÆ»izãçúÓZ^w®S'Ãg–eöÜè=‰üz€HïO}À‰é÷ˆÏiß>„µŸ+ œð6ƒPu¶g@¹ñ²~î›S´óVáñ˜7ìIESû÷èMßõꢀü.’0€ Ï a3+W¯‡Ç|QWï,È Ö¹ÁåÑž÷hUïSÍ5°F;—­Ð× ,R˜Éÿ¬|<†–!…£LÝXryÆÓÜê•}1Ø ¢ý59‘ˆ ·ôõ5uÙ«zÎ8{˜IMß>½ò…#¤‘Yð(Ô‰š Êö} ­ UÙr›AÀ¼u¿ô?Ä€Íñ"q Æu6ŒÞšªw Fƒ/(ZñlŸË€ Â+–`ÔtÍ·àoüåavÑ€ÛÓ×§2Í\èòe˜Ù{y8ÅÃúçQf«êa\Ï…º7se=ûo°ëIbÕ°—1QuÊ0PèónNÏ%Å!¬$Èi3 P‡?8”Ï´zþæ×9À0ù*±k“°òƒ«À£¢Qù`Á}ž•ÔÈ,‰X( Ã8k³âÌr,”!µ½î“6lŒ×à]6c Ã8±S!Ü‹¬öÝœâÓ0Nm.ñËr`öBª@I3Šjh%Üû´z¥×€„¦× @BªUÌ9~f,‰M;QG“f ÂNãvX°ZÊ e°ƒŒIŽƒs_  êg]mŒ:ii‘좆_ ŒêC(ý° SU[Îwœ¤llV•ƒXj¸„ܧ4¸¶zW&‚aä¯d‰ZG‰OgоtûÒŸÚûvoáŰ{2¦N®úÞñL‡l®lj&X)Û³aªJmX1f0N¸ƒ§L¢è’!bŽz ô!^iù&÷Ķ,øhmzS,½duˆ¿c¤‡QþC§í­fÝ|nƒWžêýqÔ'5eÎe;ʧ¶ù&¦±NEì’|*³Ü‚ï¾°Ó—Ðà"«Ë–Œá¸Æ6ÊMI¹èIM¦KóŽ-wxðc+‚»õѵé°`M >mC´3€œÁQS%˜äŒM ÞÓ©)®ýˆžL„pM€²‘c:åcpWo¡z´ed¡`Ë^^òÂql±¬x‰z¨ÊqÇyíÑIÍjZÉ©0W´‰21g£é(ò*jˆ¨Æe‰{f†F \$¼º»¸Ÿ§ZÑuð_Uê8zÐ}¥{žºÓ*Φð×ûóþžÙn+¤ÁícWç‡é[­ó˜eViZd¶ªýø#D=G$ãvúDí;hˆË{¯o´/í¦ó"¯Ò¾tóP¹ÞX.zTý®ÐߤžÀꨱÿk–nžÃ{Ö„áø(n­/G/ç3âpB6ÖüúJéxvæzg¤ñQ ]~~Tnñxßä‡ÔŸqëÿ˪/ñ7üý†qý";²ø·¼›ô7àó÷"%ÿ{ƒ¿1ÀçLKŸ¬Ïá$(uéx\ðx œ·jüÌ“SÏþn¥iÖ£®– ñŸÞ‡Ëï{>=õÜâxR¿ßÙo“ƒÇTãÒÒXôåF®÷±‹BO%š›M©L§O}ïîÕ@@L÷aJ;{0w®*LzõEE«wïBf¬w+7ëûñèÈnf4yëÄ«É"uÉòæ $7è£~º-…•¼,M¥ÓƒdÉj°@ ³+ñRô¤Lw¼º >=(0ÅOH¹h—Gî$ƒ£§ëI•#ÁZîÒ¥6B’|†›~Xtkg±BUE  6Ë÷¸Fko˳úÑXºj6•Þ>¯É1Ø=TK†TûRûžÍ3—>¼†ªv¾…_Dç¼ ù §¤n~߉˹g .ðkÞÀ K³ûÒBwb?bBÖØÞ-”Þ^ŸY§Ž»Â¥ø¶äº€a#à•Ðu¼ÌÆË¢9~Ø—Ïb=¤[<œ.hê®>^3¼FbŸ´F‰a½sÒì*TV}þÙ{=B¾žÓÌötkÝ¥)îìø·r¥⬉Pr™h†šÍ˜IÍÍP›¨¬eÀ…/ðK˸jþmÒþÔÜw cM ËYoŒQ4UHÃ.r 4¿œ3»^¯×¸²šxúÏûž>“tN@¸ç”×´ž&`Xö|ÖÚB©ÌÃ_© ^¹‹°k¤?4”k <"®Ç’¡é¡JÉ倦Ûo_üàÎúcwnæõšÓo';5R¯á°ár‡ÃÌ”ä+Ыè ZS—|ª z;ô{ hJ|¬­ŠP÷œ0³Ÿžx–9ÄÊ h§„´Ë6¸Ú¢Þt£Ð9Ò¦2Ä<Ó=,°L~Ÿ ÃLD€mèêډή<Ô:;ÄHÔ›kÆ×6®ž…ÎØ¢Wn®‚-F_nïCô•² C>'÷8¬ªgŠž§wqòåÛ±÷€Í—dÄ\ÖT7¨Ü§'$o¿1ÐÕY4³ª‹g”·È_[î(Í^íÌ>yØîoÿ’¢(h+Ÿ§‡Þ3‰œk¾$Íò`¯…IÉ’Kȃ§nsz sä5Î!‰ÍQÃV˜p«éšÄí±¿I¡ª?)Ú hÌl/¤EæjeH«úÔ›µ§úÊ#7ÕÊ!Ù·oÔ¡˜?@v¬ììàÇlmüñ®> ˹¯”U²O‚±-KQ‹/´ã¢vr¨ºë÷3³”Z@q/¤_¨®|{)Â[SÂÃ]ZÐÜð-<ò%´/@ý wðØ–ÈO4Ò§TÆ“Õÿ‚äÇyÈÃŒÍG›¸>‹gï¯ê¿Gÿ ô`ü²ê©ýÞ›ÔoEþ5\Ç$å¯ Þ=àÿæ‘Ñßö>>WüÖGým-ðÙ»»ä½G¦Î„<[U3€uëê$¹7 ªtŒ“·©°iÓoZóIçoÄy=;§>úñ¾ 4ñýA¥GâûFß>*nsè_å99ŸùËhÏ‚0à÷9CÒA•‰e¾©ÿ‚äE±os f=  ôTéIšh¶=§ÉißѲü‡›öm+Ù¤ÕKØx~G™E8é=5„@n 2Ù ×oï—æôß½_gC•sWiý.E”Ù¶‚°_OïCQ€"ÉíûD£]€x%µQćí+« VÕt‘‰šÆ„ZáªéNµ'ëÚŒ3g"<Æ;Ù¥áS¥æÔSº¯`„#Ø2)ŒíØ÷ WM¼\ò™Pޤs< n>ûÙÀÀ‹¸ó{Éã‘FÜѹ ¤{U˜[ak§öc­c§Šuæã·]ÅÏ&ý2›e&_ó-rá5˜âÞc5u|aÓ·N¨Ö‘~­©Òš˜ÒFL¢p#nã2Üš®Õ½Pd%ÐKbHQÑŸ¡Íùt 3‰ó¾­j×QìZ3Öj­½>qñ‡]ÈŸ²¡™;žò®x}s墂g¿+Ë-õÚé_¸CA-ÎUè/胅 ©Fè}ò1زxŠíX‹•KX´BEËtÜ ”íN3Ë&è=L 9~~Ýqã8¤[s&ÁÌ™ó›Àd¡$¨6›ß\ÌiZ­Æ,O@rî¤e€wIf#Ɖ Ì€Û´úBózd5ƒÕ-—Á /™R ìôŽ­aÕHymD—ù#&ÊEû6U…Œ»û”àw”ó¬Í`û „‚«ÁbÍ¡É𠦧fá}O/¾Rû.ßd‘Õ¸H‡9‡Í;½†ýÕã°@D®YÃú½5OÈHü. F÷Úz§x$Ì¥öß+‘’ c7Ü’ª%×U‹ Û/$³½'°"(:ÝóõøµmêA4¯[Í*ÙÁÍû+p› N“ ·˜$ï°¿sýkûòðT[ñæ6МÇj¤¥Ý­ª7Ý>áš*¼ÍþHË+^@éƒ14G¦b –Gšazçf (ók€WïÂרh:†í’ÛåÁ).4=<ŠC„›|ÕX¹`á¢^ÈnŸÍ‚:CˆžRD ¤Á1Ãû#|Iüúš®{jpmÍüÄ þȰ»tgƒ…­qÌV© ³ϪËlJpÜòË“ÿ–mÆ»œ=\˜>cå#µæSe2–Üó_"Ë+¤ÀîºÉóQøPy…òòW¿Ra„b¥†^E;Û0C‰Š*Ijð¢í`4™FÉÑžk¸q™ÏûX£ymhkÏÑ+x\Ïî$ ?,/ !êX.ÂOoÒ²Ò.Y-­9gUîu©í fiAñ'<þFÀÊj‡;x/ì+•¥Äì`Ÿ¶{ê,iCœ¹µŠ²ñð¥¸^ãþ©ã¾À'Gr¼W²™Áó«hÜÈ‚ÒÑ!ÈY;Kµœ« ¼Vú=ƒÜöþx­&Ójù}‡s°Õ‘49íô)P÷ôí/IE¿•‹¸|•¯O_ùá¥ìbøÁ•o„~nÓw÷ù9=3k¹ŽÇ÷jyåôÆ?çBÁp}0s>5Ô­SèÂÂn’SÇá ´£¶¡¶[þ¬š6ø{,%^oÂx»š.¦F˜ëÁ'µéYMœ µšiÏÀ¾©ó3µž¿¡Aÿj°TnÀF¡ìw ùÿ%LþËÆx}ºó÷¾™’õË Áwüœ¿wò›füÿßÿ¿‡¿øw³/ï•Ëñ°-Ï{¦»ž‡5ÀÓïèüöäÜzñ£­£X‡ïþÿ]ÉÉ @Ÿè˜òi¡f×öºEæôq¨£o¼ÿŸ`MÞ|È5ûθìòJ«&%ÖÒduz®{3Š,WÆ{íÎh wZ 3û6è# >„L£¯wªý,9?HAË ™žD.‘–í ªý#Qƒv¹øm/Y†K_€û 6óŒ,û9ìªÀïæò¯¢ô#ˆ1ôÜÕ¯ØÚ÷52ýaôaqšÉ¢ÕîNÏ£E˜ Y $ )®JŸ*ueÀhÔÔínÎ@c{ªØ®LBsMâ’;ÿàï¸P²Àóiz­ @^ê‰Ü 9/ïMi¬jcŒ®º¶æÉVê9àmĪmP..~ÐÜn!%_í j”VóRÀ—±$ꛆá…Íœ»=ÛShŠéŒ='N[¼zLHÙ+Qåµ!1Õk Á,å¤ËŒ¦t×Ëg@Îü¡¼e]9 *!Ô˜PèÌü˜3£\qÆ9€¯ ¸b ýí g{îêOv ïëäýóë`(8ÌLk|ë‚ÏŸ·>K`¤9zŽÕ)N—Eµ§û׉Ac„ÈËö"2¶¸¹* QbjrQ¥#˜Rÿ˜œ†úšádˆ4A®Š+Ú,Ÿe·û(J•ú`pJJ#Œ&•º¾g¼W¶Øã±¥®å?r—YaIâÖef ÓÊŸ PòŸ_î†»Æ5âçp××t‡^âk×Ù3cTMоI/ã=k朲l¾> Ó§©¤àT°j¶à•ìÊ_ã.醯u­TUAðF4`Zïút¥$«©vd\óµz%bMŸÒàfæÕ/ccñŽ,ñsÙŠé à³ è{¤•ÌÁ ׄng9nVc}èÓV¿†ÌGE*n’lO¹¡^= é–Îê鳸¿ÜKªg|‹Þ$JÛæª6®xâq¡Ñ,Cbª½à$U»z3«u@Š‚f£€éÁÉ'ÂH‹¢Z’„É"÷F³a\ýí{®¬†ÝQDÏÞ((dz!Aé 6Õˆ –»Ç×]$6wêú?ì‹·¹ÌQž9·¬¦åtí4Ķ^ÔšoM,u/ˆ|#‚ƒfVâŠ3ÈCsŽXJ.Tå-ÏÙ/n}H9Ä·cŠÄ`ÂHË"ì§mévÍ< 1ý®ò’¤"%‚¸¿nÔß'r$~K#/E÷ðÛF¿¯(JeL› E €aúfñÔpcÊ¡¦ ¶Õ†#±­>§Û`ÞÌ;ËŸ^0=!fT$ûíW«jë•+ƒ;1Ó—.#ݸÆŽ["hƒÃ8Ýcø;ESš•v\UJmÚ¦’m6Jý_îž½åKܨ±üûëQ—3æYƽèÉØÞt€fŽŸv½¢ž¹FÈ™œÍ&;æë#Í1 vt朮VUÝ ‘ïCõFímë1Ÿo“2sãíÀp®ÂžùsWÀB `$ ±Í»’ìÅ5xÛóËìΡò¬×`ÈøGfs›Á]Qeåu¼íp©¡ò X«Vk]ûülýѵKXñ&ž¡„ mÞñž=äñ¡m“Û&VXÕ˜í#eŒ~Y°8úÚšJÇ-û¨RjœU6ûc¼„%½ûøOÙ‚‡Éü@ÔB¿§©+ýéÑ|“;[ÝÞôóæÇo“o6H1 ³ùFãò‘=u(® pV óÔ¢>!|É‹ã[Y@öTø8=áß~)Bo=ìCÃðûÿúE³ó/t^¶³ÚþûSaÀïO~K[þGÑøüåoýS/â÷sŸ4O~ûû#ôߥο7ð3þ?6øï?<6ßb  Ãàÿ1X€N]Àƒ‚¶…{%ÜeíŸ7'1ž=y …{:kÞÌâ*ah³&Ÿ¥ì«¯ ßL°ôDUo‹ ãÛÃlOÁ‚OzœŽC#ÏäaëCT ç!€£„™ŸŸtZws—¿GÖs›å°sÂ]\’Þš[®¡Ó´ïö:ËNÕ›¡ê5UŒ£lñ=ZRk0á<åÙ.q÷Ïê˜y,œHÛ9rƒ€öþtKäëï‡u »' ÔÝñRjm-Œ¡-—`ë9Y/XP…RÑÐò‹'¸ó…\L¬¿Ÿ§™ç³°3÷Ç®Y+ãþ&_œ€…åM ÞÓæéºÙ«–*½ílÛ”áPžâ LÙHG|sø¾êI`µQ\dä=*™V½Ž9Ô²ÍÞÉ?°LDTŸm9q­®ÂD=’—Ó_ÐÝ^¶Q÷fˆ›åÞËh“« 0>‡ƒ‚èŠÓ–`2–ù«‚Cq(v¤>’_ Î-dç!i™ÂˆŒ£<ª³ðYš²m¦ÕNrºjbÉÿO×½S„q«AoÅáo»lVdᯢ„™I`µÒ<*ÝÕõºg›çî|&ïhGKÜç²N¥–Œ¶ßÞܹë{ôñÛ]› èëŠOš<Ü5 \îRãFr|É+Ìšh¹˜HXŒ_8ï­uЦÔæ³ló;Fœ†[PöôÖ;f* ñ±]fû0QK—,D™Àf¢«ŽEu© 0\;´·k¶¤Ê>B1<…¸]îzU† £6Sئ1ww‡ û1†€ÛQßZö"Ìå’Ï9×¶ GÛ5D[=óØ ^Å”nÉÏ‘’n ^N_½%ÊÒHir¦?9Îò1U–«Ô>¯^™\ׇGònãqofæznõZ¤Æà^Ÿ|fÏD-ÐÑáÆW6¦&þ§º9ñ婘Û~ú‡x'9ÇkXÕ&׺¢°ˆ1š6äaÆg`4f,$HV2&‹v îF8cDôzÕX>{hq»3ƒc\×0hÎé¨eÜq⹎èa8¥Ì g–¹{™¸¥Ü#÷ù8ÌÈr‰‘³»Ë`7}ˆ–0+)OºË«ž´2 3j>Rò0ôRf”4‘]’¬‰-7]1°øºãuM¼ïTëfÉÂdÕažÓ‘¥¼[} ¶ U£6_(QJŽ ¯¾MkÛwÿšNÊ8`»Ö+ÑfX¬¦´î½Ë°5‚¾Ý/Z™-Œ×Ÿ3UPç×ôi@îQ„mméCøÌȘ Úr®ÄÉȳdÞSLnÍ(‚èí:ûÆt«‡¯uLÍ ¸5…!ׯ‘‘[í)y6±_‹6«ÖŒÙò•SÛJGŠš¾faIiqDŸ†ýÐÚø7z§¶nº8Û6‡aHŸ~¶•k½ p‹ú¹qt#äÍr¼]!žEW\­+q‰ÆÐ¼&=Ë5Ÿ—~Œ$¢‰aièð©Mº©!;aªR¾Š?Ij§íÅ6£Ö6^k¯i¹÷ò ³¼[ó ]b–~Ó•q臇¤“'Èîe>À'|ðë÷JÅwýô%»wC¿›èCmy©Å¢jê[&¹ >6ßæý«šßëNÝÊÓí»­bìœWªðAìlÑÓ%xºQñ]ï/ßR*±Pƒú•Lýke·3j¿U½u\,v¶‡ê}¤ßðÌÿV\à?Öû/ Ø•[þóQ€'Ɖۮý÷{ÿõ zô‰ô‰òúg Šÿ¦(À#ógßîãÀyšnðnd—`±Û,±)xâ Î2ήӖÕh'0÷rq@+÷óUŸ‡!úƒºuöµè»A¤Îc&Ïò—÷OÏ©oïÎâw£´Ãèêpÿý<ƒa¾à’«ÅRÛg¹XqKáµ®«iά^/ÎZ.åÙû•³&Bë³µ•î\g—³ ï4¤ˆ)däùù¯$oÓ“‚Á®ïû¶Pp¥X”ƒu°|—ô†u:iBRç†h5¾ÙN¹ã0ëƒ=+ˆàç` —uæ$vŸ]sømªSúÇÚ´$„=Ë“tô.©I MÊУ` ‘õÑ8@ë$° ø{o¡¼¬KÛk4O‡í4>Ñ?YµdK]Ä/·xkHØ}:½i!~È=XÚ¶ÎJ3«ZY€Ê{Á5i£°Š  & Ea”Ó¶é{vS  ,ÍÊô‹ÛÞ„–2±» IDATi5±Nߊ5iJQQ ­ÖjÁ·½<®BÏ`ãÈžD¯¥šÑ]^Àžñ ¸0­A)ßÄw»K‡§?; ˜}‘Î1†"F´ÇaäI©]™Öœ¡! Ç_à …Ó/dÍA{°®ê…U¶ž¢Ì8‰»læÑù™ŸC”%ˆ¦»%:âhœâ¶sM—#ŸÚ¤~L—Ñob¬‡ˆµM-„æ}ŒãvÃÉ^c\è8¦éáñOãÛLÂQÚ®åÔ*­¯KwwÏPÅ‹×ùQßÀÕHqc]‘Ô qs™ÝUÜÝÌ$_á*œ\aéc- ?nªiU,@šî~;^öâJIìI„Q†mÓf Èùº†÷¯{äšî®yÝrM&„a€sB B á긂'¢ø6þ€$Ÿ·»å±î§3"¡ZVë§ìÀ0¹‹ V®…5…—¹OÜ÷mä5Œ#¾ÞÈ ù¬ý‡äpÚ̧°-ã‚QªDQíHCïf(IqANøtðÊZ >¸×íõYW½4úJʱª£é”íLã9Ú5æu§Å\ÑÊe°YxÕ²Nø‚åïÌ )ï_¬»‹ ×ÀN‹KøQ@ÉMÂÝæœá¯ß1;î&{íL.7[¨¿'Í¢äyú\>çêÍIHÞæuUqG[ËÑœJ]¬1o}¼¼q^ÓMàö°…3½fãz mPhnûÞ¿‹Q+£°œÀk´1Ößp×tèö É©ÐjF: Ê.›>©fL¨M°^g]Ó®¿9ÄëDLóXîÌ‚%˜ìuÀ$[ÓúäÛÚ_ì9åMo“[í,žËŒuMÚ)IC Ð+Ã9kk­õ%i†a‡fIK—‚»ŽÎMPAõ‰>ìÊ ‚:û¤SS0ƒÏšƒG.'»RpKW†Öâê4Xt‚iNÁ16±DãYzä‡#þu¨Ýf–gàíóíæð®w³š+dnŸâØtŸwÜòÈü6 «žzX­"AgR­`^¸Â5ú*´K½/ƒê`¶*=ÖF<ÛäókµRFÊÇs3PC»â€­«QX”].€­ÖÙÇÆ„;wæ‹í¸#—ëë߸qR'¶·b¸ LäjÃ*17•';ëò8úµÐŽ©5QCôßDùü¿U?¢#¢úp˜PüLt tíÐÖcÜ*´7«þéQcÛ6Ç;“*6ŸÄÃRÞÿ§8Öë< ¥Oáöˆ ¡³–ÐëæãA­ªE8üœoÆÇ–¼:}^Â[¡ìSkíøê± ~VÃNäŽ=ñ ü#slaë¸? .·üÂG•@Ñ;Þ òð½·ïû$L°Š£ÐæˆßI“Ä7J*>†ùM(²Í„—©L GõõG±ë5ã5ªü}myc*q#ÿéóüô×#£üü—=߆ÊöÛ¿Tï?‚­GôIù7 î¿?ücBüä—þkQ€7íXŸËÛ?]k'ˬ¼>'=mvŒ€Ÿ¥éç'–YÐþ¬þþ¤½Ÿ‚VÌø$ÿ$'ûý®X'ãOc@=&ÍÒÇ{ëÛǵ>Jÿïè*>ßhÃÁwÌñ|šâç}÷]ëC/(3w•7èˆÓ®«ƒŸgD1Ú8’ßÔì‹Ä¬—´QÁ!Ù/ÜÆá|/–‡ï¡È·±«Å'Ôh!k›¿tàtÕïWµyd[œ×†læ:5ÈÚÐ¥“—>Ô?0Ï:<' gƒR&¯Wr9#÷¾"ÌlÎgøa»y“u5ö©}§"6…æfœjºKž¨ó­Ä3PBtõ X›•cûïÀ™ßVŒ£-å.?àïœö P¢,ûqÃý¯œh7¬7^žÅU{X<Ççl±Í PQV׈:øß5¦—%µdŒÚ¨¦_‡l•9— P[°7) ÊÌ"Ú KK†Å”ƒG§zSƒ;,-!üq9”ã0°èàP«€›]½k–Ÿãù=Ƙ³uµ$U‰ÊÓJçÓÍ,ºME àgI[=?w§ý¤óG¾„ ½Øò5ýôÌc®i5sY´®gûù„v¼ Û·8wáhøP ýÒqHC˜~»Æef&Û$b÷Z(ÈÖs*œ3ªê~á.ÿt£¦âpx˜QÜ?pëæ ¡>M§ŠŠb";ªÜ"ŒÆ¶zô(9_ƒàµèäqd7dqÓÉAã‘1¤¸5•€fÅ;.##¯P×å-¼à38ØX¡þ|£a_¥óŽHp»l?c™dŸsNOÉ}˜~·ëv\±à]TŸlÖ8'cÚ¥¯¯(L¸O|ég ‡³Œ¢„œvv“ü– Æ á“^'ä"8‘´Ñ3vÂ*J żîrdnÇõÌ•Øå˜J „ÝUŸÌ¯nú2¯¢QŽ,R«Q•5¡Eò%D[#±ÅHHM­-‡÷«Š˜” Ù¥ê'ÏW¦ª>ŽLÒ=Ò=}DFëé§e¾,}M3y¹Ä»ÒìjëV"óàjD|$^&s^Å…—Ò¡Õþ$‚Emüf#†DÅrMº÷àØÑ·òü?öÎnË’\ÇÍÙóþïé[¯5® ¾ )Q±wfýtŸ±=í Ÿé®ÊÜ? >#†‘ä*¬Û\¤,>'âùå-ËuÍ´€OÄGèĨâú¾ÜY® yû¸Ì=Šc}?¸–6³æU^6سÅ=µ¯éb勊3h‚Ýút×e&Z¨ë뱚fU3†‘£o´¥é²XÕëŒx ^ÃîEºµtÔÊæe2ËÉ’»Ç}ÍaWŽXõ–¼Ùë»Å‚4§¢„yJCp¸©€î›ï€˜4)9JO§ÅøˆK±V³wGñ Þ~Ø=¬+¯ˆÕ T>ȧ3òš8ÆÆ1M—O2W4ö)„yÙ¨BùjˆÂ6\(ÜVï„RS„cVIóba[D6²BÊ?MŸiÿÂ0yѲ½5Õm^\Ê5Ï)ÎU™ŒÓÔ³J~%àÝç(±LǰøT,·Ä–‹@Õk_±K4vñQä3‹²ãÊõÑÛéÐKWGʼ‰å9*¾'äÐô95²ëžž{<¾1ƾ÷/mÆöéÄLs̨À©ú¯ª¶‚cú Ê™ÑDwP—\˜ÓÇEFÒ14Uû´ ¾òZĦebï¹Yžq}’ªÅÐ`âêhZr%@/cFÛoTJ÷l5¸ýöáLÙLŸ£Ý,ÊÐd  È ÷œ/ÅûÜ.¦ÌnàJ ¹ÃÎÿ0FAç`ËsP€É¶*ׯÚ;#a»È³Òm§íid´Ñ8l#…(¿qkÑTuœÎ¾ƒ~ ç§a³#™õ¦¡4vÉäaðÚ¥}>”kG§FëI~h@ïKJ¹5Þü‰*MyAÎ/ý@úÉà]{/IˉE¦~j½K,è[ú{Ó:ëo]ôêV¾§ßµIs|Óåþ®pážóô5ã; 2š5œ¿þ|‡Ç ì7tåw Ù!$ýªnûë¯ûÿÜ à·4]’í{Ý‚¦5µ9´µ]›°žÕ¸­âjf÷M—aŠ”mV"ÙõðJôÖŸ5œèl'‰ctîq>’Ø)QúáñßS0®ºN./ÏÚVMG¹Öm1¶ßøqO¯JùŒúÉhr˜ÅøÖj›¾R# 7qµÿ5p‹>pMð²ëŠ.áÁOìHŠÙˆéN;}„a›Ãàæ~ÇŸýt;‡GPÚ€N½–ù_£® ¬yb`ªîþL83§17üsú” ‹¥¯|{äÀ¸—¼SÏt×&;L¿åc1ÆÖÂjÁV½A¹²˜ð€zÉ —•™«ÒËl™ÚÁ؉»å”Ã<\„”E'×wœØïÙy4ø9¦QÏ•Á#^£rEªç×ÎB(¬øøH›3o%¹Í®#I ?¿]W;l@® XÌ;/rÄp YD•fÊÃí©–;.[•õQë9[N"°çåJ^{æM0`A¤é37 ò»:£y°ö¶ ÊÖ; ¦àžÓçÁ¤ @ù§Ôý’jŒ•åâ°ìOª%v03ô“¸@Y¸wydV‡`P;ÍÑà1ÙÖ¹ü A6wÌ$ËÕôÄs¡ˆb‚ÚÍlÁ.•öª„Y2§R•ãAꪛQ¹{™îñ¹pO¹EÉx1äëCJœž-ÑCšé²(N÷¨ÎÙoa:C[ŽOÇt‰ÆÁ%Ä«Ñ$—ÇÊÿ`;^d \›c#Ñsƒ¿Åf-×ffƒ’Ç0J}8¾Þg5l@>hã/c眞NLî@¥Õ6Ò'G<¿\ʪ⨬­öãø0ãÒÜ)A,6Ю͎0œa¬]A,nÊyr¤lT»h#ÙðòZòhFNšä3*ar²`׸¦Ç½ÅØäܨ¦¢©Œ*Çš œ›(ïÛWʨhòyqÞCøÌ¼åÈ^+[iQåfzÕÀ̾bÛô,*g 2Ðhò07®¨Q‡…©ã鉯Ã6+¹|ú=Ò¡)‡ÅXº©¿ 'KÖi·E¨šË{èMk)‘2s‹ÙþÅåØWíÚ¬ÉÍlëéî÷=±Bn‰5ñ ~xñŠU‰7Ëöq>•Zc™Åkæ-Ý#=ÊñËÁÍožŸ¢~œIæÙ(B– š‰£½ô« ßáëo³ 6nKX¡‹å3‰QùR¯—tàÈ FŒŸ}¢EPOLy¸P¢Obï“ s¨ãû L4?y+¿Ðñ™}$"£Қ4ÏäzÈj]¢é‰Úlœ¶oß­]\rËSÁÅvsíÕÎÖõM4ùXMs^c¼§ðÝð.çzˆ]ûȾñõ»eð¡ìôŠ—É›¾<»ì´¤Oó!¹£MgKÁQ3xJ_ÉP<³ؼÝHW;56Óךn&·ÔÔ#>ºMê!ïwŠ÷2•Ž‹[?U;ÈéÁ=^{"}åÿõ!~Ó¥®ZÓþÓø.ÕÂ_VÄß~ô¿U üówÏïÌ?ì»ÿ¦á-MêŸüûÞõœü|ð²’5æ/Ô6õIÃîBé5ñkÞýÂS㱚·-õzöP¯M)k|­-q³“Ð^ú$ä=‡/¨F}ÆN¾,=¦ÿq)êëÜë°xßÜ­ @§¿£©É¯fÿíçššoþqý£ ˜ûžµÝ«V ŽVûMÇ@Ò DöJË”ŸFûØ«Û~J–7¸¹ùÅÖMÚtþ6¥7ëÅ »1¸ÞÐ1êÈG–m¸Z>ˆ·©*DÓÀLìAÔ#âðÚZQþî Mjß’œQ½ÉLÞ lÕï¾ë†/ XfV Æx’ÌÌ}Êpyk…Ùiƒåð^õ‹›ôƒ—׬j¬? ÎÊþÍ¢ÿ”4š‡®ÚÄ5랇ÕkšEy9£z™Žäl`³pØ'„VøýôŸM^„ÅÏ}É·ÈC¹j#îÉF¡©í3\?a¶ùÏt–l4’…&ì3>ýaFàö™9êc¾ÎêKÔj‘ÄÂ-²ÍþO!¯…dY=ŸQ{Ð.ãén›wÔ¿ÑØ!ÈŽÖ{–”`~ç‰nÁ‡$–Ù-5z1Åò€ëâÕîj”ð9QS;©ãÙ*0U9Ïøô[âñê×)MÃ1FH‡Þšú…ŽÃl›µ4k§ˆëÀq².1¥²<‘æäÌý†?N”[ËÂÆ6‘ kš®IÃP힇!“%H"’ö±ÁŒav¾Œ‘ Ú3ž½×eHÅH wùƒ÷îÛÈAÔ#'@tÓ âƒf¸S•º„€Â#S"ÛÃX¦N1ìÉ‚;îáãNªØ.í<Ÿ•$†²Ýá¯]jÎè–˜1ª-Ã(¢»ßs¦Áß:¯1ì"†Àe,>»Ü'³‹6¯?>ÿóÇüqmÁ¾•­*pFqçÂÜ¥>W§ýóÁ¬eÇà s…ž— '-$ª_z+¸7‚rŽ{Šä5.—|j&hCëRÚþâæH¸b¤º…Up\”“t8†ÀŠ×Â:ýÓå Û°™õA˜þvz 2èCòYJÔÒR«3¨Ö†Ú@x”r´š‰YèCÜ,•Aó¨o‡nò|@Ï' öMf1¬J#š]–õéŽR„‚èR\©HÂ$hΖ1ëyAƒÀK4cA Ó#p ¹Û97pm©3Â#ïØ(“±®fCôvŒ*ÌýkZ&ñð‹ïzûMàYRW×îsèU*׳ÒÍ܆¦'ËÑy;·ýÄŽ°l½h;“{¦‘ªy~l^³ô0÷—¾v •ÎÆ—ì°'rq½Ï/y–D¡œòð§¿`/`d-ûÖËO«qVé l{»Œøsæ~²ÿE§E4I¾¡/‹?Ñ3µêµNk=Ï(ÏËáóE’ìEçDz&ž^S‚“°÷êx{ìŠÃœ>; š›îñªžÊ/¿P[;«¢£(âéᯊIŒ}…3ä Ý,x|ðÇ[y+î¾#©ÿŒ>»YÒįéÙü(~Eüþ/’†ùõïþÝÀC¿°ßy—ɘÁ§¡_øØùµêú0þmgyÉÆ‘ÿåÀ“í“QB×_ó:ð¸m‹÷OÿâÇíÎÕSëÇyÜiE¬ê¿è YNï¾J½Œ"Ÿÿê ûæÓ9•Gyüð{ÿFº›^O Î5vK·ûs#O=ûâ‹]ŒÕõ˜õ-KÓÓ]²ý‡S˜=+ö…ßÿøÆ%¼þõÄÖvñî»kþ1Y­ZrŒýâh~NP°àÃÜ5–/ø˜m|ãKѬmFS™€šžnoB”ýÙÛhWøà{îs<ÛéåìZâHü>Û ûh·ó¾WÙNumóJ ÏÚÐÔãé_gCùÔ鎅I2£!9¨6²z”Ø´švì&bG0¤}F0½¹#V7ï»j àQ'ò!¬ëÒ‘5êwáÂ,ìù)d¶€Â²NKØS~ãØa ÓŠ‘J^YòÄAÉ‚I| ¤Ð 3Ä(94{NécŒO ÚM3fÎu@’qdDB‡Icê]©ºÝž½<a#bÞìMÓ߆§¦ÁÚøe_ÓC,„™YŠ)ZJ˜þÊ~÷j Þ¯{63º/[9Pÿ¦®:Hv)è(DºÙrÆS!Îù WÞjš‹ÓÅí ¤>ãpž«)™}±5ÀèáßâYHÂí« vხ´:c£|Ì™D÷^Æ¢N8‰óß–•ªq¿Ìǘ|Oµª#z0©}/æ’¶ÂÆÅOÜÀ_9I~óU5Òó¾”p l_P¼œûÓuÙ‡ã áCMp?^…Åj‘þ 0ÜççÌ«"ÖÀQiwÝÓ+¨ïÓmºÌ0ïû= †Ëì¯k 4o|†BR­5î”cN'9¸ˆ/EÙV7ãòıñÈ=d•*! ¯¿4ªzôæœeËÇø…M.21LwøÐ™¹Ä™…a«Åd¹xcƒc˜»ë®jؽå"ðøôÄÖEssêö)ù>®sP®;+Æq}Œa>†ÅÌ]÷\6„ü€¦4¢/U˜rÂ,óMÀ™Ï/—?·®¹Ÿh|_õ®¡îÓÀ¢;ï0N,ÎÓ+?¨–Ì!Á Ž./o~–ñ¦ ê*•eÃó—E¥Œîej‰°Ó « ÷¼ÙVä\‰K›i~kÝî1“Ûå>ûKJ˺MªBY 2‡0|x+ìÙ“ûÕ÷®¥Ç³¼ð·»Ë¦Y—‚÷5F SÌ)¹n—¹'+)ÕîçFZ\’hbv{2öD‘Æóx_q­†ÒÖª‰´íDÉYÁ¸ØàùІ®î°iv3öÎëmâx?&dõIÌÑc®A½Ý’NR#‘7bX)*?Â,”‰aºçÈ|xõȬז-¦waœ:Žæ^–Ê9Ͻ ë'ÐàŸÁw2´Næ’ìUMX‚ËÁ9ýâ®iË;U«BxÛQ¦¬Fib¶g.˜'Ð ÙW·[FKÖµ’^,m“ˆÂ¨Ñ øÁ½•vIÉ¢x݈*óE“õ0›xñHŽ<ÆVÿv·}Ô4ò¤‡ÔÁ"‹VC˜ C+Bµ}zýÇläÔ‰vÉ?gä[ WüÎ< ‘XÍ ëüF1ül-èu=ÅèÜÔÔ-¾²\]„¹}|@ÎY«nD=6ý¢7žäuýPÌÜÊRÏ8ÙŒîºc'›{úá1 ;‚\QI9Wùp†¼[Üjãµ sy·äÁ†mb³jrÅ Net¢ Êw5·×|äÔ *‚cÀØÖƪŸ>ÍY¤IÖJÞŽŠÍÁÖZØBN‹>£þLn˾—«Ž¹zÜN_óÂF>æV£k4‰tñŒŽð•F‡Û‘ʲ×Ðë¸oŽHç«ý¼× ´O[üÒq¼Ùû1£wâèYL°Å“·µ•Ô¡v¼„ ~&(óøbû·ýòšôø‘zl~QZy]±<»w°K=ÜgÙÖy„7“=>/ºÖÑOÞakÉ;”:Aïdb²e“ø|„yøµäÍ6héì™ï¾)½ûXÿ ð/Ñ”ÿùˆÀ7ù7Œ_|9xþ ?±üÆì£ŸYþ+É?ú·Ï¼˜Ça€'À§÷“ª?£–"]bà) ?Pb÷"Ù×âä‡5 ïÐÓgáuˆpâßÝÈí9øº¨= Ò#¸ ¯‡ªï¦Vb{©üâRçWßÝ‹Bý€E”Ьý×c$Ë̓ª§€ö45ó\ð{§ãkYÌö¼€$¥n¯ÝB›qÄRÀlO³è˜¢=ß¹tî?ð´óÃK%îøÐȨ³åIkã,"ñ¢Å´#Û¢ìôÒùÚ‰YínßÞwíèÀÔX«"ä18‘.w'Œ YOY÷é>ݽ¼/.¯Zæ?uÎËÂ/5/eT¼>¥»µ¢®¬0Q-òbmƒ}ä’ö:¥ÁæM€ÏŒ Ã¹Œ2É(°/ KŠ;¾c;6±’­’4p¶bt®ZæuÌÍ7Ì|ZóQÛYý¼%¶öU-\hXòcå ‚²CîÓ8Ð@4-Áh×N±Ä‘voKgýºa¶ñõ)•‡Á0Ú§ ,iî.Œ8ð«¯ü´n…O,§…4ü½KwsŸfQ°lÛõµÖŸ„oÄŠv혖N\jtLÝ¢àÎàY>\å™PR˜W>žF$a=ÚlýÃÑ3E‰—g’j€÷v&²\‘Ú¶ì—1ƒÊ(C¢Ê´F ýJˆ›èFjD‚?Hæ²W66f Bº·C„\ŸóRüåJ¯Ìy‡ÿÜöZ¸Å;Öo”‘.Áó†ÆvG o"L¬ïŸíª¯ê‘“CuÃÇñx–Á§d“60uBXÒæ³¨c={²ªïvwLJñ"e¸ïY&Èa ®I7¾9ìL6 ½å4pBsÞ•=âhBpª F£…ÐŒ㺆qºÜgöo{vï^c—0 ÛOfòYx‘ÓÜcÞòï+Ò.Œ¶?âA|Ý9€¤ä¯“{Æ8òzšÐH;0m —{´—«:=¢3ã\sÞnÐ] š.ã]eïgËiÑHŸž/¡Xý8Ýi íG³ Áïé4zMÜ£ÜÔ㜮´K[‡ IDAT¸Ë‚nSo³Þ±O¬r"š‰$@¸å6릌±üÖm•'IT£ºq¤åHº>TQ§ŠõÅÐ`Aäǰh@ÄÍeÞÈɪz¬é=HF%M¡m˜+ä Ç ;yñ†0IhVµbÚ)j¾òg€bñ1XMÃh7惹QJZ¼¦!FeÄJ»Ô>Ã+ €VdôX…Äóòâȇ¤ñ² äüô÷­Õß‹M…K÷qÝ #6Ÿ†Ц¬¥Þd/öaIôÈÏyJ»ßº~Ëfì6§ =k-]ú5Vi±èbº® †Ä)«½ ‹²%¸†×_—¾y7¹žK¨‡î2ÑÏ”Á ¢ÝŽº÷*†’ oÍ(Âó ùÒuÊÎÅçá ™#ä`UíAy£Ù0~{üßi fF}èLƒ}Ð3×ô%ªQ)æò›U±]¿áZ»y_;¢4üÞî‘™0Ý[mwízÖ>D(ó\õ°]½H;©•J}vHÕàîÝ0²Ô>>ŒÜ•®+߆-Léç*îÜq9=Vð~‰ŸŠl¥{5¾…ói{"ê»b6[öv)Tç*­^³’[vµ¿cZòžÈ!LiÊA†~¿c‡½Ž·MsbªO?²ƒ“™z²[å ÍȘ–Å…%-—óŠà.ÒÏË’9ÆuÔA¹c³g#‡³µÛñ´&gyLjó±æ5XèŸ}bG3”N¸grÒg>,ð #á<WÌÛI wÄçj_^#ÛõÙ§/~9Ë)Ouóv¡ex˜Ge’›…gi¸ìë<±3{”ÂîÄ?‹¦°àPØÓ‡ï+A*0/Ä5‚y`Ú¹\O1í?â»;ëÙë1í=eHë:ÞÈ1o×í”çÝ›Ä#Më_r"Ô°½§%_o{ƒ¡¦üš ÷õ_>Ô½q†·ÑÁq~ l|§¹¤ØšC«>dªõm¼íî}êßÒk—Éoí¿¥èMP„üù¥öo!ê~l×·²îW÷ÏßMüÃQ€×‘ÐWC"½yüë¾àhè¿0ðã=CjoP3€ýhîa'‚oçrod©*«\ù‘nûµ_xÓJ},À/O½j¤Ç£üb!Ò¯Ì_áTx“®8‹žMï±?”|Ñx^¾O#éõ ŒÅDðö:­ý|¥Zî®G~y¤¶“¦DƱ½ÍYzXû‚¼¤²vylCz<ܸv‰Â~¦³å8™Œ·`gÈ Áu7„'>ÃðÚÞu‘'s½Q™Ï”VÛœúvG*ªí‘]àãËEÇïv´…+:§z-²«!-›¡/8r‰Î{ÕnüƒÀ㸰(¬Çu*Y4-‚Oq0LÚ2ÊV¥š®›sxËŠËÖD3´ÈË©ÂüæfÑWEÁ6°´y@IÐõ;†ö«<@¡Bñ”­GÜŒî–ê­¿µ[jÃâDi4~κզÞ4Çž™­Ýº÷¤¡#Ô}`yåšÈ -üƤ‘*²9gèJ¦BqaÀ"ò–ÛMdì ­üm )dFŽña¨bJ‚µRÓŒ6,>2æ'°®®õüQ¿©%Œ!–廨ë0T_Ljš8áéPóö†¸ú—ÕQÈE%Ê_œÂ’%ºbÎÛú­”ÓVšaœ'Œ°š’°‹8xÀÒ5ŒÀøÇŽÍ?_k¼ˆD`ƒ“#~ÓpL鯼¤[Ä'>/ù-#‚Ïàº}.‡ ·Ç` yZH¦ä8È„ÖøHé.¸t%Øô9KB´æ›¶ºù¿ªL›£]±hDmEä€ j£#Ü.Úçe#`¶Äe>Ðj†*—äÏ9 Œz|rSYòÀ ØÛ¤(‰÷j9L! žŽUÓäK!¨dèAáP¾Œæ¼³º äû˜-‹YýÀj£8Bò–h¦GǪ̂9C¢”ܨ¬Q°ÌRp›ÓÖ¸aCJ®H0©£ÕµzY¾ò`¹x@)ìÜ赘~T˜ÖêeÕãò8FÌ…rDÎOlÛ'aFkô¹=’-~ K]³.åÔ¿lÑ–4§oÜV—òÞc™òì®ô¬&@ùŸ’îpÌõ²L­)¶ÕÉSZ‰¡˜Ócv’¬¬xév7­,Ëæ9T"@~ÂÜ÷ÁÔ¨¶N±>ãé>2™•ù.“E´‘G c:cb/½bæ¥#fvqu':ì#í{.‡Ê.¸œ iNÿáÓçm †QËâº8…¡ü£ÑÊ3MŒ†a.#ÿ@Œk«ñX„4Ý;‹T™^!mТ“"0N1ÝKO‘»~C¤ù¤L6h [¹<¥V¡ÑÕ‰”ËÊKFZÛòr@Rq-c2ñ’í^|ͨ¬7ifº¥‡l¿¶ËØ\Óò\Ckzçpesù"Ðä|D<5ËR<{æDCp¹Ã­…©µzÊêñ•% Å(g±eìfƒýCã¸.÷ÏR©óÏzûØî:¨îÃ&–Y§¼D«ŒÉüÜïAšþ2cl‡Ø½ç Î-í\mŸžLž/wÝPF{<ó8glÁ‘E9*¦\£/Wl¨ 6¯,»0Ïç–2†=õÁŠä"'^†ý³·ŸyÐX Y•ožµ6Ôʾ ‘¶Øšå2J'Jæ%+d¶ ÍyïvºxÔ½£W#oa´öM»ˆ­Î¡öÖòÈ:CŸ]Ȇ£‘­ Û•ÿ'_˜ËµŠca[_ì”™µ(y·¸=lÓÕíÓß*Mlãµ9{8çñi¡¦zãL2,›ž=Ýrœø:Ã6Žu=–¸üâ|í.ÙÈšõV±!K±µõ8Z·¾û[a_¾³äãÈ'+S8¢ êÀ¬¢Áö9ÚמÕÖûYš€—_ó‘ÕPÅp[å@£o+¿ÙŸÔV–¥¾¿Üßé•{“f‘ÛÕÚQÿ]? 6†•ÂtÎ7ÞML Šr¤ žkÈ ìcW¿—Ò]´”tÏÜ-ìk✅Q¨Ü><AÛ%×6DÛ®R~ÚÁÞF–ÄR€Û•‰YoÑÌ®1 ™͂ 1¸R÷_öía˺_­Y8_³ 2lïÈJ&1 ïi†Ä8ŠÖw×Ë1|ÝÍó{5% {»MBvãªfÁ—¥wÇî×&2§FV‚1™ˆU*ÒßË*× ["[”¤´U›UÓ·˜alu•½”Þçõï/òSa„Ì G éÿ"9ÔÛÏw ¤œg€ýºk"ô?þç<üƒ [¦*OL|ðA.¯¶U)ß²Å=mÀ'V…ññ˜ë‡\—µh5qmfŸÌ‘mY=†_ÝqÝxÕÿýøÀaôv<ÝËaèŽcŸ‹fÒ\€ŸS.kZ)psê?©¿nAŸ·û=K…˜ïFá¾Ì¸û¹ÀE³1˜ÎE­ì—Ïõ˜{îñ–‚ûz6… ãKâ%àÑo,Íâ'ûÒœÀ`ÄϚØ0Dt'`1­ZuÀpµ“Êþع‡Ö³ˆÒ{f˜¯ãÖÙN§*¦kPUS­®©Íp§EÝ,™,”*zМsá*צ5 f¸žÃ2Ë}n ‹¯d°ÝBÂÕxgˆzêäÅ+y&ÌÜ”­ñõqú¯|UÝ™lRÒ¼=ªø” jú.‰1Òuâ´Py±Élæ³ iâÞb®AïžÂæL˜¤àÛÙØNÏË‘Lyþ¾a»Õý2PÍÔ*DQDDŸ>§ÿ¯ûž>ÍŒ!oV‰K®Ë¿¶ÈAÞh2£gqo–ºÇÒnÕo®;û£<{ ¡ö|YÅÀy!xø-öœ¢©r¾G¨HÍ9Ær}Î;†X÷Ô4c@–ÂTßHÓ|JIÆÊ™+ºéî&Ó¨n$УF%‚ 웡Úgz ƒ ]©¹B€c,t|®Ð!MšÒíêËfÃÍ`€+¹-+×vß·ÙÈ©á¼E^™ð” æ&ÛÑžÕ Z½ËrOÁ?–¨)ˆ„ ³”J#<ƒ0`S_¤0”,¤E‡òO—[{ôœ SÄ­,cŽgä‡lz¦Þb„Q+´líÃlðMĽ,±+î»k‚Ú…›÷¡Z¦{A/O*t‡s*ß7!ÌjL#Z¤sZZ· è.ŸR»Ö¬p?ÛC®•8Ò OâËS™Kö8,î ¨·¡GüÉ­§á¬ÄB…aããVÌškGdoýsäWHXvÕ.JãžÛh›ÝÊͽUðØžÕ‡œ‹ŸG+øœ!àç¼.¦Í%7uçk°•&yá1mŒØÏo—eì±ÿ¨ï>öù+2cÙ ¯‚…‰f(H{tW†Z²ì~¶ ð.Ô¶¦µIo=Es"bÔóa¶¼P>~ÜÒ2_ß t4 pÈ£º4µž}íw¹‚,¶eÝw┥+ø³')•ôˆ$Ý®MÝ^úµ½kD—˜mç/ŽG|ÄËš·ƒ ;ÃSÓ­ðyöï­¾äÏѱ“ù‚±rŒd ™Ï‡ô¼‘+â Zéζƒ¯ÿÚd™V=ùˆ¼0—_%CýçºÐ¨d:R‹/ÿòø{õQ/!½m}ù™ðú&–qîõñ’~¨Å’UçÇðèî}ÃÛçñµ¡óê'û'Ejí˜øf–ñÍüc»!ßê¿©ÎrÍrþ®üüëÒò+“^OSî?©@Uû=šä[¡÷o̾»”þAßýOçÿêÿ¿ç?!ð㟟TPIqCÜœêg_MšëýäõÑÝÚ>èÿ‡϶Ưc“=XïJªù²`>ƒ©køÛÀªz×ü+cB¾>>ŸŸ®ú¸ù¼àó¾.¤GË]µoêúøþxº=§Ý<`öòªøy7éD@ĸô\-AûP–Ý Õü†8Öøû8È·×W„ošz(l½UÛXÑî,ÂÖZÑClÂn­Zºåˆ[%qüna•Z}ÂÒÀ%<´9Jþk?õwÑÂÞÍt¥›Æòðä yÍâJ A“ÕµÛj——ÍQ“n[ â°÷ÃIÓr¶‚»þ±.ÀÌsoœûmÂåÐéD ×íÜØ…ƒǯó;lܪì£ -ld>¸,Áû54Q¬0?ÅÔbÁj³7¤„c\Í€« {u0®æ:¤È`fÙ@p™ÕÛN¢@8¥pq.8žõ^¡öoÞPKfËîΪ 3©Ð¥ËrX£¡ïv®@¶lÐ\~…@É’ì„Ѷ×Ü^¹³¤žmÆpF—QÓ ŠS<Óg·sõ›‡næécŒW(ó³[›M÷p_û ¶¦¤égYï1ì¼1õ1ÓV¾é¨¦ûžsÒ)SyÀdá"Ò` œ›TÅò&ãÅlTgé@$+Ô®©5à ¹y—“\Ä]õˆ³ÎäŸL=´o Ÿ“À‡ÑŒ÷ŒNBÈ3ƒ¬ÿÌâWÜpg½RíÔR1ñaæ:ä:¹Äª˜úAšc ‡J oß`€¤¦§Vÿmœ3£¹œÄÅkIûðéDÓÝÍ>&î*G`;ý|Ê£;᪦ð|¶¸N¯Ã¶!& ½ßTÛd›ã2ÙwïXÖVø¬fìÅ{*¢‰±Ri vZüžmF;i‡RãÁ5C#k`£>}—$/£ÁÝQÞjaÑT¸Í’6p‰c\®Ï>m Úˆ»#ŸC¾‘,$5h‚OåW–Z Ä5èŸÖ›•>TËa—¬¨&±Ã–Mv‘Û6.Úá1 OK~ŒbKÖu“ùž‚‚nqD'®®á·g+‰+ñEpU¬}I£7'S¦²w>=”úh@õ醈™‡û¼§ÄÖ$l´¹qÑ”˜>]ª{e"¡ŽÚW¸'ÑŒñ¼Ê<[ jÀ]¯œß_ƒU Ũn0)/r K¡>|Šù‘¼<Ñ£N#”àÚ8É·%EæØÊRÐõ±¯íêX­â‘f±…ƒ.²òùÄB%æö(ãbqÿº$gÄSæå#ø^ŽÛæåV*Z¹£×À,¦Š¬°§'K¥È‚` æêÐjv˜8s†žžçŠïeº›ÇmÊÝÃÀÚhL ›RèS–bŸ\Š]{–81U“¦æð];†ÚÞE;BëåNB„¹˜„¹w胬/X™Ž|†ÑP•í¯ÈjÈm m3gãÙÂðˆ¹SWapBÑ7$Ÿ*Z¸†±YiFÿi.¿a—/7”@™Øï-6”Ét`øB»Àªv -Œ7®xAƒîC®4ôŸªÌ:m9®KîŒ:nEDHÁ~ ÜÌ®ØQ6+,Inª/ŒÈ£CÓcü‡ÏiæNpÊG4rð,ø$â¿¢›F¸Á¬òSYI ­@Å>kF",á0ÖÞÕXFÑÅh/·BbÁËÍÈ™EÛ¹jÅÉÌV·r¿Ã5[%XÓÑa.ËáÕBúT{rŒ‡1By±è.”å"tam~˜.Š8Ry"PÖRµÎÅÏUV‰ñ£™«uÔE¼8ü1³K–Ûa·i;Q“N€z¼ôÀ֌ƀSšo ¾A¬6…˜“ÚcdÛë­š’K6†óq®âöùb¬Š¤Þ)uy:à«“;ý·-Ðx¼®æÕqà^Cé%°Ü`÷M˜j§Ö–`Ôáõ|ü û‰‚ÚÀsís Ïè¨Z[ÉWâÒÞ?tO‰yøN^ܶOS¾~¦ñ¾ÑußÄ5^뾓ÉwiŽý…âu ô®]ó—åé?R¤ù§6ùoŒöúçÆ:´·_’½ú1èoÎðž½õ7â _rß¿~Éüwüÿñ$àÅñ7j;DZ ûR÷d?ºŽU÷ë¥bCZõ½17gz|¾Ç²½½êú¦‘»ìñ0žK¿pËòÍ`ðˆíQo—ÒWPk5{üü£ò¹3ëWl [ÐÜs`ðôñ>ý½lü¥e'ެw(!ý)öfÚpŒ¬<¢«~¯5u3Æ kº°S fÇ[Ðc¸RïË>GLyiq´„`lÅPa±Œ´=ˆÇGºš2—PpŽU½PDÑ“íÇ«|×=³Oð±5wý"ºfW «¹+­`Çß{ $¢i[=ŽkFìˆ=ƒBÏ,ʩ˲e) ì sKŠ ³o—(Ú;0 „æw4sOԹÒp6!ŸOçÞŽª‡Zc‡²TÓ‘¸ƽ:‹tj‘b;Wké5F¨r»)Jm',¹uÒ_â13(Y«@nŠ¡œ›+‡\–É3°cf>g} –bëˆÝ2YIJñ„ =8p1&ré2È)rÈçç„Ù‡,z°ÞÚÚòº\Ža:ŸŸ'¥»8 >0Žwqœ8r‡üê®]Vg‹ˆ, ðÒÌŒ×äýyÍŒ4Ý‘M“y`3ÐÀè}˜Ðõ1`›\>8BÎ2£‹;Yll8ØGy·ÿpoT­ÚÛúôéZ”»ALå `4]>º‚qÑÈ!γÿ®¨'ü°Û83Ìâå¯?~iÊÅ%½E±ù™K^œ¬ªÏ×H¹äÛ¨ÐHóÀÒÄd©¬–Qù–[TUGñ§‚¯œ¥Ü®HHx¼æ$ ÎìM±XÒ5Îú=Šûê7³ò “cM☲'y]}”cuÝ¿¸—朡|Ç'âšHIy&<¥nòx—iÁ-C÷zîäx`-nvDÃëžbÈvÞDËéݪ]`cTnDµÉª0A*î1læ"ª¥Â4—De¿«Y´åóµh{ÜúœîaÝ'®ëúàH£c¬Îá^'ƒaÆ …ds3ï¥u3%)››KÐ梗Öx`|kê–jEwÖ¼¶HÀfZUhæ³ÐèâeÁ‰²rîÆ`À”RÛ'².¼˜ž¸reÑíI“¾%ŸB’Gðn9Vñ‹âF*˜ä°ê+iƒ9i4Â\®TÆD¶Ñ®"èø®§«šDüÇFÂ}늊RÔÊû˜KÌÖu#gB5jº¦Ë†j1]F€˜EdZ¾[í>pÁ’îHذa£v³”{\:5Ëæ§ ÍTܵØÅh7ŸîFÚ>B±c¯-ÌîÚáÈåmÖ_ãC±«{°vĆۧ+æ½ë–ÓuÂWËúÚÚZJMs">߈²UBÑ岘q¤vc3 Ûºâ™ð Úá´:`1X¸û[òÅ(`UfmÙnä¡Û€Q¼d²Bן‡h¯4î qh2–úmÊft'är«AN‡¦c˜gcL~Ç)¦IfqW:-gœ÷¼F¹ûÈB¬â\­V¤Ve°a®9Àù¨ÞÀeG…•å¤ÔǺ¥÷´[e5E&­·ü/3ˆæ™f:eÏ –')M_Ôp|sðÛº`¾:›ßºøÏáÍëƒøNzaÍ¿ìw«/N»,²“.w‚û@Œ¾ë£yŽØy.ç(bŸÞš[¡T=øó{Ò_N ôç2¶©ÿ¹·h/æ+µÏÐTŠš©èÔÏpFSbC±ïÊ_#~â90y~‰Ë6¸U¿*}àtƒ¡cC?Rý^6ü ¾ÜŸ7€ë×%¼„)’ž~µ‚Jp»+ö½Ä¸r‡Ö†ië÷계øâ¬¾õÔf÷œÇÆg÷è–»/b¢Þ-u)qƒ&J«ÄY½Ä€aX2[8àa0ؽp.¹ž„JáæWÉà6i×°{ƒµ û‹§ŒeSÊO·¾ ¸k° ù6i) «‘“m]ÕêÁJO”êd¾Z… ¯ïêÂìý,q¸g«ÓS'YÕt«—¦-JIDñû£î»b%Yô½ìÑ×X*—¸à Q”Z‘ö;#-aþÔ¬]fœ«~>=5Æ5*ë_qÖE WŒL’€Žô°A›ÿ*¦.¾j>GâIO9ݵèÞØ‘{Z ™Óv<ó,H+®Õ=?Ìé>ÂÝo#è÷Äàº%ÂxštרŽn©ê' ÆHÊ~@9Nk—âz/ñ¿ï©%¸$øš¾! +öƒµÁü“×_4÷jΨ=·P#ìiæ„›ßî¦&aWFb²2†ÁÅ S’Íñ\‘x Í:’…•nÞ?dfœÒ};>Š{ ^dC5I €x¾ßO/0î&ð»Š3åî) +°^Æ€OŒ O¹xí‡á,atŠCyü¯î2“-,÷²†÷£qøð”ªàÔݲ°ÀBaôbìg=xBöUbãnèpwÝ’q ™ôCSŽÛâCKM!1âÂ……#pÎÔq–írÀã·¨¡õ޲G4;?ìàQ¾Å¬•6-´ë–Gu‹É hƒˆf(fwotË)UÎ Sõ^¯i0öc¯ ƒ>½»×õ¿«IþØG¤2â^즡¼á›Óv'„ªÙ˜AØöe+°AQC¥ÎãÅâöâŒæälͱ]ÁÇm^‘;_RÅ@)GªòzÀi cÝ$1…DÏïÄX‹léÕØù£#Ìw2Mß1käÓ½GžA$Iøô9ú”{YßÂåY9! ÄSÌ+ÚÁ,-ä’˯ß©¶>F]n c\À]hxÍû&sþ9ì‘O׺c—:ß²…….k IDATð'dÃc.94‹¶¹©W9ÄÎnó¨Ô…íѽP_¢üÎë%‡Y¬•Ÿ²Y㡌y}UU0¬>‘o„Ö£vùEZ…îXî®~|9Ï= ï©:Ɖ\왦‰–g"ç6åx‡ëi8g‹‘Q>b’Žìá‹óÏ"øhuÝT¹Ú>…ÛNHïRZŸØ©ÔT%Ê~ ,<íné‹“ŽV¿rý;ZÖìü§L}ŽÓ˜ˆG©‡¿b`Ö €4µ8su­s_¯{®ÌSîùª; yË·u£É#Z¾3XÌÕŒáh¨Ã×b¾X½Õ„¬·5¿P‹¾PQ;¸éÅÕß½°kâ¬MFXAs‡”e”8ŠÑYUÏ4Q+­øeçý«vWkC­ªå&,¼ûYé·å±¯AÇð@g'üZ Úvþe¼ÔJ†^wýrkò”?öwŸI‰£måíýôÍeÏ7Ô·—PE“NÏ?ôM%À/þ5ÐÓ %×îÆ8’±ÏËϟúÍÖ9³Ï¬ýûàü´´&ZŒT_;óE„Ô®6Ô×áKé/AÁ숾Yö!OUeTСíåW…FÛOôúX†h¥™6âð£¥E»=›»¹²Gý;·%-´Â³°‡¸6ÍFg(4;5ç}ÿøtùãrãU›èÚ¼mƒqãëìCã&sãïÛß㑯ɭþÆ5²ÃƒVØÃl•W¹Rýn³…7=§5û£ÌQÁtÎTÐ߯¦3/4i–#¤qj¿†U9TWý¿ˆŒèŽË‚ée3äÐÀÀêsTÈa:CÊ.UÞÔpJpw7Y‹"õ^?ÇQ`ŸbìÄL0Q<ѯ›i¿Ÿ§õ†™Ùªùè×pšÂ±ì¸!d˜Í9Í¢W®HxýŒUTHãX“¡Ðv•’E—²\-WNQËŸÒ7³Ä޲TûC)¥º.ã $Úȸv´þ¹4ű])Ʋøœf£î …¦¤Äü×P„™x(l¾ÕÈÄÂúm;5| IèòxÃâE>çty|Œ g02²±Êôyò2®™-ØÓQoNmãæç”\QlÛWúÁÞ½ŽÕ è2Ây/úvÕrdØå2“èËc#&ŸÒµ|*©Ðyxg+ž\c§>Æ€Ùúg¼‰³Ox -$0ïöн]ÃÝÁÓ—ÛŒ:ëu&óÂ_K« %+€v…aÑ’-œMª€OñèLîN¿þ2£}ÊË}zïjA­Æ‹ ni ú0Ú¸ XˆeòŠ*¸«ùÒÃÇAÚÐtLøbº‡ §O.𡦱X«ç ±¯Ð óÖ=çm€y[Æ2yA TÙ_ 8BÅ”jäþC2aX2×ãò\H5Ö#íú¦¯ZŽJƒˆP®å´{:¢¸ì±ꘒ—0mf˜J0\¼ŽšøÂUïxU£TÐ ‚®p ›S0³¿þúøñéþ¿æ§»»ÛÌvÛEB %"C(ïðc_„UÈ!±úê%×ÌAoØà³:IJYˆÜ†Œp­j ©Ø‚f–<µKܨ4åW'M©Å®”î¡ïmˆ8ˆÛ“°äÚ¨[£ fÖjOòÞq¹Åuè+^çÓ7Å ¨°P 1}^4ß@`ˆ3Íé²xóo³è¢µD4ÅœóˆøÖràS´;g!kJM[ø½ì‘Y’ÛýâXC¡ —xŸÆÉLÏkX–§*3«€0FÅ€3677d4-çJv\kÒ ƒ+Üi›æ¢)*ù{:§ b. ×"þm Eô §ŸrB³¦Q.hú5²ë˜9”F.°ÄJ—Ýwf@-â(Îò[Òãí”ϾuJAgq×îÝŽ‘§OÊS£*Q²ðÒÛ‘LëMÅC6F‚ró’øg»¢#W$¸ËÌõ¦í©®â›ÉtQåSuvŒQ{RF½³¢nl†Ü GÕNvÜÊ_N´o»+Ú¿˜u!NÜÊ–X—û§eŠh]x]/‹ý!GçnSNÃxúª6‘#ñ1Ír¶f*3 ÁÖÁÁá‘7ár̸#ã>NäNØÖDãÃæ§+ªX„¸§Ã8.ÖšÌæ0‰VÜKç­;w~‹Ä¸ÌåŠISÌé¹ë͵f‹{mˆØf¾iš9ÖÌϵLjƒž<9oàJŒ¡ë™…æÃÛ³^DAE»Š‘•¾*b à¡Ó©šÃÌ•=Õ^„ܪçCMV£¦p µñFüÉ™Ym°©jÜñ°\j“ù{ås9Žeg[ =»¸…ô!ì—@°ª\Ç‘§Õqˆ?e¾Ü9m~‚Õ=ä…n“ÞÙwcp”‡x3Ënù¥™¼ê=IjÊ/¦o›_Ý’8ëašK›õd¤·*`¾Jå§<õoÈžÍ\ù0žJ²žØ^Ñx|Â/ÚV[sôx‰|Vók%,î|Ãê¹ö°ˆz;ê¿eáP/#ˆ­z½^hÓ¶ôUàO4Û_tùþç\=cñ;éŸÉŠ_¾€¯”ýï=É¿–h÷ëC¦ü‡Åq}aöýfˆÿKLöÿ×üóR úËáñ¼ü÷ðø¨òlé×z<±så—M#Gkz ðuù’{y÷"ùZv€×ø¤Ç‡tÂóõ³‘¦~a-ÁÑx|ïJÖþ—Wv.ƒ[Lí`Y&÷Ý‘àŽ}Üf‹ïêå§‚M&ÎôÈ„è^ÃÊs—zˆº{ ç~ŠPÛJßå~ äøõÛÁžXP›T]·娕ßUÀeGŒWxÐúAoæ+<ý»¬†Ï„AAðÜíÚmîcXõ'oeýð+„ªefçKo’\÷¼]ú˜:÷ƒýÑÊš=$\“t±íÿ¶´¾·©5w¤bÍsQ mŸVð½Q"LœZMª#RJ%¥ï}'d×´TÝVªqìçœèð#"ŸÌ°Â!SŸûtŸÓW„©ZÙ×—Œ´8pÎfÝ]`§Å.Hùy{AXKKËŽ~R—ÇQÍ“jäHds`G“h—ñeƒ;â™Ajɉ›‘²kŒäÃ,ÅÆÔ¦­ZÆ {RUˆ)é°þzó–óÜJ+_ŸºÒäuª,]‹ÍÍ3ÝöÏÔ}fzlÍFíêˆô.qä†`å·"ïàQ£|s† 6·¾» 6L¶½<†=¸ø¬…xÉ;mŒ‘•¿uñ»#XêÆcòóöéúëãÃÆÀ‡l2Á^#¤|Û™LCfpP9ŒNGÂÆuÁ1ucfP~ìÉШ;N b=WÏK¸=ýÝš”†º+þÔ*ä’ÁþôƦäÒ]™’A~Œ„*Äsæ2^×€x™Í†>~˜øœ(r 1ó"þtEÑ_VÁB.‡(׸¸yw¦/µâ2Þ3ÊgÀU’—f¹›¤[º\wö8Ç@'t-^ÆÏÁ ×ëÜ2u¼³à°´D_ƒÀr¹n÷é*Þu‰Ñû(غ©W9b¬èsYÉGqÌânø€ÝµªÄ{0*6r~fA­2ð‡f(hC×uÅÆ„{¤²ÂÁÖ½€kŠà…×ÄßH0µ°X¥b,˜êRNÎhBk3ÃÆ¶šX3¥@JÏå¸ÚfM$ÞîZGÌ HˆÍÙh~X÷´šCA‚ƒ=6_èLf•£Æ ^ו À='4 Ù¨’>cŒ‘Z»e¸@‰°0„`he£MùÀÙdz¥+ENXÌ£j7 µ*nFžfå@<÷Í*!én*øZ¸ï©²&=?ÐäàîsútFû ˆÛ]ò9H0¾bЦå< .}º"¿ƒ¯ÚV(ŸÅÞªµ¶Â`-Ö³¨½u=OÚäXrðÓý#ú-Æ2¨³Weä iŒ®pžrÚÞUÈêŲ¤h䌭LÕœ!J’f£ü Ó'W€ŒMˆšaå—í-A,PhÌ(L£X"¥ïK¿]#«»aŽh-2´­tmUª,ØÓæs»@¹ûçç4Ú5òúòUè²1›˜Rô¼Ì€§É4v&·o‹z#oÏ;e¬ì’i±‹Â”ׯzNk7q1ƪ˜„7Ø¢KE _Žø 1ª`+)¹(êóqI°¾ùþù*€”@ZCðgØ8®¡{‚†¿†ˆ¡—’6_œ)BùÝËãÚëó,rȦ+ý«©"_+°L û˜ò ›Ó’àCš‡LËÖ#ÆH»XÔ°+e”ûØ@Éá£î2äó,×áÅÛY5 2fïví iÄÌ£à4y Sðx­®0{©”±[ÏSª•ƒcoW‡Í–|á†VƒL«ð†Ê÷&‰¯åÂ×pí‚›”S¼É”($u¥¡ÏW±|Ÿ–Ó  Q ƒjZH}ùì›jAt(À»þµ¹Í­”“³{CõÇ·‰?Ç´«š†U´·º¾Ú½ùÆ#ÉV¸ð Òa~-`죃w\‡èn¤÷h&ÞïZ“­®¨xêK[ÖãÞ_Ijd‘üÁN¨žîÊâ†N=­´Ý ø×öDœŸDœˆK<`‰½{ï… ZÇ›õ$n¬~§ÑCoÍ&]—izÕ!Ø”K½¤[¯mßÖ­ˆíÏ´»-ÙˆÝúbÐM¾ßkq¿ãÃæ—æè7v÷?›ý1ü}þ/·í/þ ¾ à÷‰@O‰YߨÆÿ¦5ž_Œ?¾íÿÝ ð‹ü—‹£ÏÕâ1 8äz½y¼Í^JxÕ0¬ˆQ`–]3̾$_´ôf$÷mÕú»¢PÔœ/?šÎªzÓ6ú²H´»£´žàð/.×—&ç=CáÄ׿·ùCìÄ ŠÈb:§×nØ^j‚Ãs§çxIzŒ‰Öy_ás„¡ýmŠÄš'u¤·âªðÚ¢þ¶×”zHÐgEá UÄÖ§ý­éÑœEN¬@W¼|¯?`/)“mÄÞ‘5„(¼¢öÂ2Áºôp¼¡Ãc>ç¼§\ fÛ‚’ûIþà§ì'÷ƒ—cÛÚ²KšÐ˪‚þÒºyq Z¸ÃÐ{ J1’Â&¹ÌJV ó£aµéÖ8b}ÄègyºýÓ‚©"äÑÂȪ-uG_и(©+•Q6øå”ÌÝÓâC¯P^'Û`ÃgPC#cË®¾ÐGÄœ­5.\Éoמgûh¼¸ô fùãÞe´ÅüÕr ;±YÛù]ÄÑ #¿ó!MmŠv‰ÙËRb ¡ïøH‹ aJ—­}jžêÙs(Æb’§§·|º_°¬SÂo×É Ø=1`?yR7_µ …H8tý¿<99 MÒªH÷Z˜œ&ƒQsÞ~v} !Œ˜DÌ•´ˆT{ø„¸3Çàeúºt ©Ð †Ï,°Œ‘¼èã9ú‘cÎÅH\äîºtŒà§ösuÂGüV«JŒ€ˆši `#ê#-` פˆkp*Q y¯»FÈ¿€ºêÚivNÑk¨kÀÊ=£ß°YƒðaÕÁcÏ\ý—.Ý«š€Mx¥Þ®ðíÅ!Ní¸H\£0ÌzpÌéÍ÷oŽ”q?ÖÞÙpÃÅÒêò©@¬Þl£ýž¶JuxÝueí¤ƒcðÃqÓh—î¹jKHÚAÎâ`Þkfc\’Æ {:¡ç”ûţòE¾‹ÀްV{‡ÊÒŽ¼J—Lak÷”¤ô”Ùžø)!—zh‘ï9ü;2ؼ[qÌxÎL]ÇbÁ´1Æ0cø¸Ìå ˆú~`Íkgïº1˜Í“‹ìôÝê oÍ9Óåý¨|nem$m=ǘqËG ¬g6Ì·£0_’Š›_¹LQ<­mS¯ÇŽaØ_ÃîHǬ¶”ÌeUø}OHvÁóú ·‡;d”A„%‡HÝ«QB™Mšùœ¾¢‰Nó»@…š°'. ç=[G1:ïsíþÊ.ÛƒÇ?érP¼§ ¶vÙÐÓ(¹O²íŠÈç¦$£]WZ®r ›™‡Ge@'èMeƒv¨ìñ$¼å—Æò8ç—½ÀM9:ªÃW´K÷R'¹œ©»4}á©hez'rkÞЂ­ëyç‚á48î‡èfÛR˘CF—º»lI‹-ä[Ï™0ç ÄVñõWy~AXÏ×È$Ióžy'$H7Ã®Ü ~QŒw$ŽÝ-t¨n¹ô°”iäú•±ÜMðè´G%÷©d`³¾e,³•ÖhaoŸ‡¢ìbצHÚ³oò¾årsjXµ®$Ò3.©m‘×€\%ÐæÊç]×6÷~wwËz3I¤®1˜ÅnòÃFL¤fÔo%OûÚÑJއ›šrlÃÍj±ÛÁmÇlãÕØ({–Ës:mò³¢< 11ˆ2¨‘SrÕ dX‹gzqÙ|×÷eŒ!sÌr®Ïy·€Q€·Z¿dõ¬W;).oÊj¾ž9ÿ.W#‹¦(sZØEÓsø–ÙlU=ZïõªÎG^Ç$hsê8y8Ê´\s ¾[ ñ5Š©Ní^/è–4£ 5…¾ÞBlò¦¿Wq¾äìÓù+|ø­¤¹–ú†Û.Àõ¢ªLÞŸN³ÂËN™êÀÂÆåœí/x¯,Z‘zóÂÐl¾ã5mµÖû9Èûÿ±,õå0‰Ë#‡êcœ]p\Ûy5=ñL¼ôÇõz`ñ©0oÙÚ£ñ]êñ¡½—ãRµãw—ÏÓþJ ùVÖ·ðœ—rÚ÷͈úM¥Ù¿ž|ãî__¿Poù3Åÿg.åß(.æk†G«ÊÃòõ¥þÓON¿@¬á×íÿó§q§šÉ¯~ʱÜ÷r\ 1©‡°·]ù±5ìÛÎlêëó÷·¦J—ñÕ#Iç¸/t÷ç}£/¦_½‚ªÑCÃ?Z{òdΟ˗iàþèÉÔ^?¤…Õžì£w ½e{GU׊¢ŸôüE,åéU‡m ×ìÀølù¾q{RűjðËð2Éç¸âˆM$ûz?û­Û zî_‰]Øg»—g~a‰ß•“×Þaÿ´¹yý%@ׄ<4§\¥P[^"ýâçÀ•æ°,K¼7i&÷²¢³6úDÂËa“{¸ ÁÐÔ»Ãwc,à œ`ÙgšrŸíYà "Dz=mjF“nLXôLqšN‹VÚZx³ŒPÆ#ŸÍªKò4ªq7{W×p«ÛíO¬ãÞnCÌ…ÌXU * «ã·}uY¸Eït%{ŸÛ¾*!KrWî„g8žÎ<“‡Ù ŒõŽæäÐ7ò. µa¢'j¥õ\GŠgwòJ¸Ï¥š»É¸Ü©lÇÙÝi§¾¸gØU¢ÆÖmŒ]XIº MÛŽ%¯—‡¤ùs–6O7Ä2`Æá?‘´‹A™îÌnX˜¨™ŸTVH¦§’ð#}õY<ãHr °ëv!|éžÌvGZ8¯‹Ã*&ñ_9Ù»IôU›°çãÍ6X¼¥Fð¯}Üz˜­&‹8¿ðyö\RéÿõÿœÂô«'›ü‰Û¶ÐÅ_*¢ý¯=WÝ }7:–Ű­£ˆ’ZD/nBÜ‹&Η ÉãËRg%འöSͱËníwx½rûÞü}8óϯàg3€‡šÏ_Ö½ñ§iÿ5Ðj_ï‘/"ÿÔô®/þǯã€ôôè?úW¿ÿ„ô;¯ôÝ—ó~ñßÿ| NýW,_ü÷ÇfMì~ün瞊ö‘[¤öulЛ•¾|I„?˜•X½kÅÐÔw‹ÄËù¦˜û¬ÏÑ=6ßÔà«tÅz8/¸¿¿ v_ü’UÛÌ]‚¦Ü]Ý|búŸc¹’y—\JŒÜèùF”²[7Ý?R£á†ÚÃ(=‚›üÒ“¼º 21~ÿµu{ÂiŠÎ~¶öU9¼*ý¿æ¯¯×_3ntàñ]¬+i}€"™…¥V—sTç«—V1£÷K ¼ÙeC—›uIÛÖû÷>cYÛ™¦ó±Hï²PÎ(ckJXØŸ Ùh}ƒ¯×¼ÊJ_2(ëÚοµç@c$ܾŸò–åÙgH÷ɆåYf^i3ND¹³^ZÒ yޱò&—Ïu×åÚêa^ÕÆBm'L¥>5¼¯kš*F,ÃÒo™Lþò7YÕëüµi’ë…dÙiø¿F€<ÆÚ¾.û‰pŽ…|3ŠúªPø¡fa[&Ç܃䛱Ò|jX•¾oÜRÚÉY¨àc1 qÔ¤´­ìÒ;’˜âÇ~ÈèYe!³†ªy÷~ÜC6(£ñóÎcѳÙ$ÞZIÌ &¿€…[ŽK(þvq ³rGÆ;c¯Q ŽK“¡ÉÅ#$÷6ªV¥`ë0Âí T ßѧ×xM_ƒ˜k¥&ı &ä¡SÍÊj˜î0óõ±DTj×÷ÿ°áÂEèÿ›½·Y²$Gr5¥yTÈ}ÿ'œÝìFdd:ʻВvŽ{DFU÷]t墤;3Âýü˜ÑH(ða¸¦OO×k<¬sì®ætcH&yYM+·^ \R,ï©ÿ\³·œÕÓÓ²G.Ãøt9i¦Ï N‘–Ä5›Nqƒ”Os/eŽ´q#ÛßâšØc+y%¿Þ³ˆÅ'Í8ŒŸ1NóZdž]UHÐáQ …+A@é7þH˨ÏJœ_2Žô½M‘16ž„t+QÚu—.Ø–¤ûþyO/™uM0òÊ‘Ü83NV :Í"”WˑϒæBCgÍ÷Ðÿç-|˜ b siN¿ƒ8½&¡l…N5nÝCýˆ–ÉG;{ëKÊ~eŸ“U·cž¤UGêf N™™}Ð>.ÒìÿñÒ¼???ç-¯ÑN>V¹Ët5ÞÎŒ4»,R1&hêŽìÝfNñ{:%³ã$,¹Ücâ|¥x°¥0N§C6°µ°ßÑÕ a& 5)‡vU³iîÒ%>ᦛOX|’±ìœîSYÎÛ[ºöùf_N޽ÓZ ©æ\AòéGmW#$-H,Rë]G¶çCùðo“Œ—½7dB&Ë\ å=Ø K‹÷í ¬õ>°ß[kϳ[7v™ÏÉÐ^e 1Åô(ð PÜ7¸4Ìs_û¯è¹ðì¨QL¬bÞ;Ï#q̱‚($PJg6»‹aö_%A¢»G æ;í82mJIÒëò™-d îUmªTc‰l),•Ë~µAKhòËv¶ŠôŒ ‹Êœ¼x{V–Ÿ´¯Ôæ;§Ï+ ]â±KCòÚÚc{v|·È"aK¬Ã…wlðY„GÛËŦý²É8ml24¥ñ´‘‹'Ÿs¡ã›ü·|Üî>²G<æöóž}gçø¼±ûåŸ|‘l’i»O@ŸdCøLÃT~§ås‰ÍmYǹÞñܯƒ_áìQÌËÊꑊ<ÐL`([¥ãÍnå ‡G—%CÀ˜5@.ÙÊÅ62J¤klh­ ú‡«gí+äáà€Ôî Õåºvºª·oÕõ›z¢Ñ”ûßX/òíÙ©…å0¸¶^]œ“÷‹­H´Cãð llšµÁ«}¦õÔ)† \Z³z÷–—t Ñ«Ùx§­-òDVÑŠú¨yœ®×ˆbhuç³ IDATQdôj¾ä‘EÐ!D¾¸7ghÍ Þ+[ÚO«YílÉZáõÖ£XþƒÅ8µŽ%FÕ rIª¾TVß^mi¿Rhu”~ñßùs_Å÷›ž‹¯¥RÑ‘}“z ´Ç°ùþô°»öåäÛÿ²Áe7gl`ð¶ŽÅ¿!£ïÿ¥ó@[úƒ.ñUý^™ä‹Ÿ_¾Éè(Þû’7¤?‚ÚüÄ-µ£w¿Ž¿Aÿ8þ, p”L?þ÷ŸgòðW„·‘³€pÌû¾lNÿí0‹ñÞŠrFÖP~ º‡¾ÏÎ×SÄ_‡\çÃc[\_£CgZµõ½ï/^ýñÄ1nàÓÈÿ> ñõ°¯ùmÏ‘W åÙÌÊ•ÆSX7w_'(oÅ».ÍÆþ¾·æ1¥×BêƒK‹ëŸÐ2¶¶²›ž‘íîON™œ›ŠªÚéIÏÅ="@ËA…OÙhV/ÛÔß´znBÿ–-Í-ô¾±ì™D–;iµ)àØ_A€È!`ÁÖiðóŒÃo·$û)M˜¯]Òú¨ÂìÀø¸è´ãe!ÅgWÒž{)Ý>ÊHlÖÏýQb°• Ó"u_V‡jS Zèé"º  ffi+ܶ7ÅtQÄJðµG1Š}ï"99’³¹UUÏ!œ±=NÒ@k…H]ÊPÅf¼ïw1ÝÓÜÝ»äŠpÛ¢ô¾j áY~a}–\€Fñ.LpŠ>azï0v½föÊI^ÀgpöëŒS ¬©Ø,ØyP²âPaq®m R(,ck‰Îvj_è [¡†l­Ú’e­^qWT…,'KCéswR”9øaµLUò$j•ølÕÔîVµÁÙ¶ÕJ”{&Ú#å„ WrzÔYç©ÑWCþwŽœm !:¢ ’Ï0“£åäk]!ÓS}¹4›uw?:ˆ `U ÈËóÖûº1ûØñRë4ÛŽÖd6Â=J†×s8Jrç­)^v]æÐüŒ/ÉC½ûô´ÈFMö£îmåì ¶Ç©ipß ühˆ|ñºzÞ6ÒX³=ÊÄ Dµ¹‘:I€ÁRj(÷ÏÀ‘QàpƒOM×5lôR¢LW¯P‹Ï9 yï]ägT±_¤×Ÿ È’™”Ä/w'¢¾"{ÀiA­%XBú^ Œüˆ¢Uʆ \Am’¦„ 7Ñ­) ž }ý,”Ì ]Á9™Bâ:ÁfËnº¡«¼vJÒ?I@÷L,B¥% YS€8À뺮a÷ÔíŸ÷=G²qàÇÆ=ÑŒî23¹ßóN‘1Aö9IÁ%0èÞnê±uüE“9«±¢Ë×ýo$¯1>.Ð`öã?Ü}||ðç_ŸÿùéËÝÖKJTÈΪ¦ˆm†¹pÏy¯²ßxyñ™NŸF/»u…«áH•À‹üL*Uï±ÔŒRa„–Š€·„£#w–ÊìF¤ÃmÔöè§ôiØåò‘7 B\C£Èb™…8BŒÎ…-ʾQÖƒéKNVø6§­’֘ǯ½: jÐhãÒÈÚùÇa±ÃÚR0F×üxjüØ@8ŽYë|+Ͳª°èT«)»õÁ, Û-ºZ‘´µ­;iôÛw€šð“y³Ëb’Ý.îéŽAM *Ó)ý0„9:ÑÖ)¬Uvç¢YרJƒp‡W§@³a\¤¬ âqâòXg$¿oÑ!@c°×îv©pØe69‰XíÖ7øÿ¦Aô¥~ï;7?7å½°UF(= =Îß2â+ѱOšª€cùjWó˜-¢Å^Ë÷é~îÏ-¢²]‚ŒqDBuJp§5¸Í`–îÓØô†ƒÞîDÁ”¸ÁziTÁ Ý4¯ojÄJG ¢6b’g W‰vV¸ý.8e£T¹›S=lð±¬-ÖÃ6õÌÅŽ³W8( Ÿ „¾dJôû1ò>ŸŸ\³lbõ´Š÷WÞ%9Œ³ö™R†j,©IuÓa5!—~ÆýãhÌŒN¬ ¬ø.ê¡ÖÁ,{;8Ëòœn¡Å\ZbQv_{îžtv&É'Ö6æ›­ÉwêjaÚY§­(8[]7ÆqU±ˆþØ¥ ÷ÂÖ0¥v´u•Àrî¡Â `]3Xj‡#°ÎåÍÝÎ;ÜܽK 行¾³i^õÚVû_ú^ubíæ¿­AfU–ˆêzæöýë¿Pü^ßܦË5®SJ?¦Aîå_+¨§ióWæjžº¯(›h¼«Âz'Oc<µ!¬| ÞÛ«7§Ö)\KÏ}wiàtƒóŸñdw~…w_*¿W¦mÐéœó(òøw|Wý‡zö÷^âï&ßþy‰]xü[ž±˜Ðñ·Gz+Ñ÷‰ü[ýã%ÿÃ{ò-åÿ˜Z­‰€N½SÛöpAùY¨PvRüsDõöØü½ü²ÎgîašÿòfÐÛKPïmç_9Öî­åL_šû_†è8ÕcÐns×*ÜÛù܉+9óèØ › p*j¶Òæà,®Jwçid2¬ýÐ ÎÒ™Ýõ•?Õº xûÄœ ÕÀ^íJ¨u'ó鬊-¹½ß¶ tô¡§§:þ:bõÎvî;¢ùÜÏDÉv5’gè¤/m^-£“®ô °½¨áº™TÖ›¤H3ãPòtY”W¯0ûÄÍŠŸ{¶›p£a¤}>}ôæþHP‚Yà0ê¤Ú¢NåÛÊÊpnå¯äF‰Ï$ÇQL¼^L„ £µukz#%zãÂ2*gÈ˲XCªÀ&„è_&²ç†‡ ±r¼Ww—Ï ÚèÓ)†™%@ÉÄ5Áh P¼Ýø&vÃ|}Kˆ”æ=]WÓ„ÓC­Ÿ)ôõÀÇY=‹'òƒJÉ8n‘º÷ÃׯD ÈJ“;µÑhßš…4–þ$TSvÅ‘ŽÅ_aw»hpÉ'F›  JX¾>ÖSmìûMÔí³Lm ~ˆ‰Ïj•ú2›ÄáìLÓ¾ª&Ÿ&ôêºZ#…JÕCrrîš“1®aÆ4v^sü×\aŽÒ°zRXþL$%Èn”¿tKöóadqÒóÊpXd!‚ÿ“ÅÁq¢)<¤¦>§ú€oÄY(q½ø6H·1~S¬N·t»_DÌb]0ÏF~Ê4`±ž>Êùì`––1Q}À`…7‘‘QqŽðò…Vçnö㣚™CpïzW±2þÌ=ó"jœEY"Óe+¬ÎTƒE……IøÕGÇÖ$9·Ö’އػæ”m"E&[Œú WÖ1fÃæmb0†I˜‚A,LDUy©—®'p<Íø‹vœò© 6{ì:]Á˯t‹Ï9K] ®—ù‘ç°aæ’ûÌHÉœ.ÝsÆ4G®õ¡Í´å›Áldè#?x›>ÙÝ%rî>!†™IwP€²êÕççOˆ“tè?>~ü¸|ÞŸü¹ÙÂòí„îå‹ #wøt4ý'–ïÒb("÷¿àˆöš¨(w·Æß—ÿ³Eé4ùNÉ\³0¾ø«¡î‡Üöñ1>?眛r#w1¢E1x`Œ©>™Q†5†7nƒ\VCs|SqÙŒÚEÔ7å~®ÝöÅKô¨ßáû³€€92/RZÛúsP’¥tB+©6h§Uߪez8Ee1-§×\ÇòÅq8¸¸|`FŸŠY=^U"?]Ñâ]QpÚfê‰q”!Ë.n5iƒU!Uq9,íßaüŸ˜­Ÿ¹ 僌ìé-øª†Ü¸*ˆ[ì™Ì¹*Xxƒ9ÀŽÊ ôfí{ ݃{Yí¬Ù‚´ªC[T·äÐêžíÇC¹×Ö&¯úlíæóe)k»ˆÉ®Ô ¸iní±Öw«WÅ“ÏÜ©å·\žŸE× )ºæRô•)Õƒêh\÷ù”Ð>Q ­ó:×qb@·³gª&Z[R[Ÿ¡G“Ä4ÆV\ü_ωÜ6=©]Ī&e‰ ¸–豜ÍDð™ÀCú×r¹mææÅòXÖùeSÇ˱ƒyQÆVICýGYÚ´ãPUôh4ä ÏTƒIo"|Ñ_Ùæø%Å'y¿Æ· ˜õwø°ÞaAˆ=ú¢ãí¨_=ñ¿Éó|­ÇVy=ª'N»`?7¯Åíðlÿ¶Q¶£z¨ñø#j̃-´!²7DÏÒ]ßI£ûjl/)¾ÕuûAÙ|»*o_ß[µåo…ÿo˃Œ_VJè[øWã•¿óâôˆ]<¦¿i¼{™þRçûwBÿbê¾a½ÿ­(ÀCvüHñ|I|/˾ý2ÿؾç—qÀo]Ko²=/˜u<°rë,VùÑIÖÑûHØ×3fæýס+¾èÐë¶áËÕæjÒ»Ëìû¥ôѰÎvù/ÅàäѬtBú¡^޹UâV\š/óô|i ’ܳíßóŽ õ†JÄõm§ûßvfÎKíyçÚ‰›ÛCÚâ]Õ‹—¶a³ƒÐ“oÍiãåÏs…Rè_'øÜÕTÊv[¾BýØs M…üúÝ#ý~¼Ç6ê×[¹–ÑyÛ“°‹e(ŽðóV6¥J]=mµ(*GºÕUá'BÄ-ýpM¸»¦Ë…Bú†%3cú”|úœQ€a´!‹„ö8µqÞ‘ ŸI âM*‰ÒŒ¸gXE§›·€¾ˆ¡ØVyeÛfÂ}~Þš>ÂÁ_ðeÈ.AIszOMs~~~~||Dñ¬$oz„ã„{Îü Ö Š-¸fäQ¦ï©QØA/=ëlç=oŸ˜Òüü¼ÿãÇ1þúë¯ùóW´Ûš™F'Gά#©S©qˆèÑ›@,»…ë—k×½f`ËŠÏó¨EÚ²ñÚx:–ÇÔ Ð#´ý†Í©c׌šÝß’¨¡%ñНzÞ£7Ÿ ÝçÕ rÊ iÁ†+[…*¾QG_•Ë*ï×èµ#*\RS<ã…¿D¹Ya6‚¿–¥ˆ-ƒËßPmõÞ®‡‚}$éw’Ó¦¸é -OØã:öâtÕ«ƒ•Zu–sê %"pÏqõ„î·4éwsŸ¯Çÿ´€»Eú½J‚=ïè5ò«'”ÿ})ÿíkûþmÿÍôÖÁüQ}é¼þû9€w%ÍüƒhÇ¿ÿÑ»ŽÓ?½–v¥òˆwÍYVPxOŽf"­ê+ ;døiÃèU=ZtéEwsé;ƒLš-skzÌTu—]À¬Jã鹯°ÇóGm:ÖšÖD€c˜àfÔ€“¸ÕâˆñGŒÁÜSaÜï¸V0€žÌòc%‹Ðçý9}\ÆU z$®ŠÈøD2Òî†s¸Š Œð^Ç””©Ö B¤w_Šq`èöOÁäGô;Þ’…³Ö—1Úƒ íýÂÖóÖg¾Š)Aº†õ ;i6‚ O×€>=ë"R/„XàõóBõãIý°¸%ùZ03‹›¼ ¯š;ѰnÙ&C¯n9 ˆ~Ž˜Âûï0–£¹œÏrI³`dX}&ßhÆo”Y6LèsN‚sĆËA¸˜q€™1¬2¹í̯íÁ^Lº¨“¹² ”hüÇõsø_Ÿ÷¼çÏÿÿ/ìµ= ³õ¨ºŒ %3G÷œ,}òvû1´Ì½Ð' áðèÙ=ó$êÇßLf ³ÏwÒŒÊVÔX¦š²F™‹w‡%^cu¸k&!µ¼v”Õ8® ƒ6F¨y#8†ëöjs û'KÞñ ­YGË2BQé.g´mÞÅ®YÝIÙ j^ÞÝÞ¥*[Ýwm¡Ä ”½õaÉÐaKPÖ W³g×ðð2»Þ3±‰Ü °×Åt±/‹eÅþó8 ¦@åÑÌ ÃŠmá.`Ê5í…¨]Ÿ×ZCÕÛÍÕf#<Æ‡í¡«×,O^;¶hr®'· å@™eËb¢â2”™R-T™ Ú1p.â"oT¢8W.a| ÇxêHù-ǯ4Œî°ñ+&b¨ºCòw( «›(úÆË±žÖè­}gÿ@ݧÎ2´w­ïzìæ4"y†ñhr7™qäÞM°ü–Mqª«AÙÂkëÍ3?aÀ1¯ÛaîÒ;cÙ ¨r™:4`·¯<æ.ÆØîFcK뻯Q äø°ÆeƨŠZ~ô¬¶…QŠj ŠšžÛçP¢aÌxŽ´p,h+™-Eëoü{Wƒ¼på­î£ÂÅ9˜-õ|³b6¥í„¥…ï½ðv†-%‚¦+iÌDòÑó -šûJ‡Çz/øíµfåÙÁ€Ý½¿+ÚÍûÙ:Ž©Ûjö¹`çZ¨â‘ ˜—±ïòq^UqJžl“·6_å0¢á\«Í¨¶ùúZµ®ô¯¬íÿ|*°›#{ë‚zª&¯¿ã)í^së M§”U¸ô¸¹€|—jŽÂýnEõõq/’BÁ¶á6G}3+øÚr­7oýý¸@§ø¿´*QxCÈè™ÙW‚Ókl€kyÙ¦ŸB›€“ó]²ßb½£yHsð\Í­iã·ÿÒIPúA¼ÿ€½ŒNú9Éùö}Ÿ3ø× Ûo¥ÿ?'=åå?›â¼°V¾aüÂQqža6}-¿È‚†mÖ׬;h躡{•úD¥WKG­ѱñâlGß[(w£‡+U’?ÝéSýù,Õ0^£dh'È2pÛ OEÈÅ cìvVéGÝn¤Wt‚ÿ#âá¤@!„ x6$sn+Çâ -ap§éœ=÷">ËNKÊ~οî;Zý!4…M·CÂýØÃoC~£™Ù­»ôÿãIx»~~ÞÓ…q¯F‚aäY­«H˜ã^ãè ¦œä¨»Òœ™ŸŽË0Fîσ !‡ Uî~»›Í+ê Ɔ–-]××ІÅ'íäÑm«­{j»é{µuxB†(ÐÚ½huNwξ“lݱJÔÅ›ƒ·¬K\Œƒ@¸"(T}€¹¥ëH­¼ff.Ú¼½NΑ33Tâ,VÜŠÑè3n•ì5÷=oŸ—ÙŒ›Zºì®ï» Ð- ϨˆkßRußf&äBuøÇ¸þñññS38:.šÌ¦Ú C‚<6V FTŒ‡†>;ÜüvŽ“ŽLZ8g«¾]"¬8l¡´vý(¢ØFî "œi4Ÿó†~B×5®ñ!ˆUë² 6ñ!Upƒ$‰Ï)«nV¿Ö[ ùsF Å`ЀåN!ZGÀ)ØØö)©kø·6m“¼–ü™4hÈÐçCÞ6õ•cdC-ö6 äûM»Šß…D]…:ërßÝ5†`Rã«)0Ê<òÄΧ5{‚l•×b³Ëü X]3Oˆ,ÛeiÔä¹iŽÂ‡Ì“xéÙëÌâÓqŸÞâAÎÐË’“(S=wmÝñ˳ Akú«![Å ëÛ’Ä…AÜ[gÏÃs.&åÍ„Œ"„M´Þû!{'ŸŽì‹t`RÓŽÜ9åÑôo¯àÎ2ót<¬Çf6ö.`¹{‚:üZEmðŠB«¾&=‹tº­ß) ±Ò‚}ò¹=“U÷äéjQ_Rä1`:˜$Áå¯. IŽü„I"†ƒdÆÏ­Ròk6'Y(>´@éíÂp|ðŒGN‘LÁ¬f0ч¹º#MbEšžÂm…fVŸZ¾bTK± 0h ßâÛè¦)™ö}e'wÞÕªcŽŒŠfž_ax”²nz©‘qî›ÅÂÑE€öP~ýýÕj73Dq‰¶zª6î‘¿•ä¡üh+ò"61û¡:­Ê1ÃÍñ~²°bs {ÂdËõOU|7·»{ÍüQ@µjzASævHÛù§¸UÀ¾S@œUIî)ë69&\0mÉñIêüÉùCWãt×~wLV_dj.­Ç3¥VGhIû Àª¥{Ž:‡Ø<ùË8d')–ÌFT¿¼q¾ô°êxY¶Ùö;!¸jËO·íaR<~öúVßZñ÷„PÆ^¾R­6ŽACzK½ö!ÿ¢œ÷ìü;Þd}õãÕÅO ù÷¹E_餯ÿÞ¾ö]¿eÕÿYà_øÏo¶üŸ ç¥ô/H&èëAÚûùÿÇc ðÛúof™üÕ ù( ñ7ÿ©´žw/Lç ì…®ØêZ¤Á÷“å/´÷ƒD·ËméÛ§Öë"ùÌÃ-)øi$;%jÍa©øížùC£/¸ÛÁÑÑ‘É ßüåm̰W>ì-Øúÿx IDATö3%ØØö­y=¢Žg[©#‚ m*a"Ùùx†žÁ³“ãÇ2¤XñxÌTÚ/—!.ø,7Ó/.ílå›Û£ÿ™õà×q•ž¼f˜ˆBIjÎfÐ@ÔÞ®Ïp`Åýçü*¨ÂE´h´õ>YHÿ9h¡êµÍ}¹#ŸØY¥ÚÏm”BFY¹[ág{hÔ<‚9«Lx;õ¡ÝaŠ,JlÁ˜¥ p·Ì‡xUÓBcp¥Ëû$vAtá•ó˜\òN]ú Â¨Ž¾,àˆNÓ@ÈéJZ°ºÔ8è=†Ý80©‘€€Œ¦LTÞØL^"Îè¸ èö4|P†A~Îu–ªi›ÄÑÍÑ ïPïª6¥¬¤÷Z¶s¸&rH (Až])/0ÖÖ\¿o×¼ï¿>ÿúëç ðÇ5ì‡ٔÝaÈŸƒwÏdÉl$¼Ö6¤.:½tKÒ“õŸ>ëœ?À›ÈoÏÉËö1:ËrX5Ô¤¯èLy}k6“ £î>Eç~"´%9dÉ^ƒ¦OOQ À0R#iüáú³d_Ö€¾¤Q¦r¤†X•à9]FŸ¾„ûˆé„Èe¥ÐV¶¥fQQKât £²6D¹E zɺl˜‘ò;€ÊQX, æ<~ŠœÉZ‰e$l¿J *3 ‘ñIIÝ—‡¢YA9?]é«Þò‘¤ !ל>!QÚeÑyƒ€ IÅòÊHZÜr#mŒÏûþëó¯ûó¦a\´Ë|:¼¾©òy?T{eiM5ÀÛ>oßâË5E>”–dE‡è£×Ê?Ó¿\„„Å`÷ª•ñ ôXòYU(©So1uÍòævmËñ”Õ_•AP¥DA6² GÈöÚ²­©Jœ hÉkcònÿ¿WüB¯…vË–Öî^¹[°²¶n43c\q®žáä&´‹¨‚©.=bmýdËË;±D¥c°ÆF™›#䌎kÅaáxîŒÆx F5­b¡]2VÜ–$hlÃZc>R'ÓMS)—û@PÝ-šWsfßsþÞ÷"c~pYi¢K#nž šžuÏÑ9Osx„Í„I*ý á{.k„8GúÈdùó*Á¨Õû¬-’Yüž]W]ºO$ÚÌʽAÐî$! ´ÅjZ£^²ïÚ뙉Éõßg†³?ßžÐ=XåÐܺñ¢k?’É‘È%Éó™/w2¯ÇÏUL#ÐR“üY+èÆË r÷Ò€·ñ0»m8žÏ¬ÐüÈY¤U—ïÙ{Ë5ì£WTü‘ùÜço˜Æn+ï»ÔƇ)ÖSŸ4é /ÄÚ@òÑ•6ËÀ’†ô~îÅ %¦îq${41aM|{:1‹¼ƒ·j¯C`ÏU´Ô1³Ó‰««$úí!XÔØcsH+TÞäF5\GÈ )vRüz\t@]i$¨¹)JµW&Ç7b›C»ÖëOˆkàp8 ¸e¡â÷ZµXU ƒZZ‘vŸ:²É,2iÒï¼›½œ¯[‚_¿8ìuc»''ÊC®Ñ!¼WG·”²Þ‹¶²žÿ}Ÿ‘^ãɲSo¤ž¤Ðñ)ÉîÍ^‡tÍ­¸AOï¬ÎQÁù:nëØËoüÌ»Ïð]Œá”õë9luåézðݼâ‹ß~äâÒ°­>QÇ9ý´Í/öþªø\Y~+Ëò«èÄo+¹úµDÍoßüëßùåïæoüW~kM÷/fÿ6ÏéÈ”ñÒÿy^ßaøÏ] ÿ“ÕÿÃIõÛÞ·…ÀO¥x-œÇ“ämÎémÄIkñÕÆÙÛ‡¦a|_éÏÀß¿ôR±ÔƒºööéÀ7wé{¶wŸý6Ð2xßâ['íÔ`eÓðBÌ÷3 ¸‹îâ£f÷ì·'۬:{ `MP[ßÔöòbï¦6]DµY;!EpÙ=ÓÛWÌáÁ ¨,üþÚâGÐ+ }$p4´7$×;bmbûïÍ®)ù¨Öà+SËU™·…€MﲤËåôÀ³™Vi³ôø¬ÛÍmÝíEý—%½5Üå_ÜlgÝ.½Ûß%™<1¾uòÔó)fÙ(å]›ñðzM’¦×làqahÍ¡h›*ô¼µ•ì#÷ûã¸sd‰Œ3ç*UݧNð‹òâ¶$@ÔlE™Ôí'M¼ìéN`˜1nw÷o¼O™›mrù*OTyÃÑ|‡vâ3PÍ{©()á–G›³'–±Bó„)]·*ƒˆ«©j¾ª›J!I*¹dÄ âüOBÁÍ™GIh£¶Uç»(¦RéPÌÚÕ©É ~ cÉÕ1Ýrä‘Éã²ÎK†JpbFèaMHhclY¤U¨¹üÓ‚U½9\¥i3ñÐJüi|à+ y Þ>ÆÈt„Ïò¸A︂rÙ°«" 4pŠÃÉçœ6®¾[’øÂqz0àöAñ¥‹­vcÃ.nâûz¹!MÅ#ãG†‰Š|]º;ÒÎOPãbDsüö¿>§»Ü'iáž5«xCoæìÌÖãð HV—OxÀ|¢éÏõª™iðºÌ>l|¶À™p‘²oÉiæu³»ž‹1²‚áé@N(ÄXª àÓ'Š¹Ì¶hFèh¼kÐzÐ(!ú\n$4re+“edÒ<úÓ»l%"DËq·Gth›£ø0ÜQ¶ÊräÔÖ1 ± äRC- Ê Àä3×°Šß·_1åøô©«H|Ær2µ[ Ý!u…øo–û…•Œ¨»!Pø·ßÝéœ3àøhlÛ  ]׸®ëãç=Cùëósº†T+pŠJ”_<é3E:[(ÅP»íDÔîÈ$EwÑPVîÚŠÄzûH"KáãoAv$¸BÚ6pR6â©Â1†!ÚÝÝ'h Äjï¬íi˜ÍG´€ÀBnTïNlU.‚îZæÖêOxwMe:w–2BnÌd5Þ6ŽåkN‡4†ùlºtÄËTNÜÚu•~§ÞþmÇÂ$–ÏUê“Öb£„1vÚ0¶kÎ’<%×ÍZÙ^m)~ÈJAD”ÊLî1Aý¼ý2•Æe¦l±oxBA›EfÄ f´ËìOƒ8õÖ'ì!¼£ì ÜЇ²þ¦•ž\ˆÃn@ÉôOðî¤Rƒîúœ7i×0 j®h…G%wß~}Q‰~LY+C&éùHpÙpçqèâÑý…œB™Ì"‰T ë³aWØjÃ.›8×Ä¢Z¾ÔNWmÑãØWµz¹faDÆìyÙ3çãðó0ìœÉkzŒ•  æ¬ßÞ̤ DñDŨXÌHÿåçu+±7—m/5!™5Q1´PÒTÙ›}¾K²ûx ¶ÜÙôóä±ù“Sb֞цÑFD‹‘‹yÖ 98úÜE à3 ‚Æ#=yÎ’I» —îó¡/9“RýŒG¹[ºßg~v]?ÆÿõÃxÿ´ S¶DEK¿ÃŒóÆD”{gF']ÆêÁR~×3ª Zu 1AL£ Q¿ëÆ,:<Ð.ÓeUÁqWõÈ0ØBŸâSšsf½­›n=¬ MÓ<ò ÃÙn÷aŸSF7¬òœ$xä3s ê³òSú°,A%÷¸Tªí#M 94ÙÒ•’sQ +¾&kV´û7’LÒ†Ú Ý2™í©¯“oN露I”àˆÄ´— ‰”˜°æømzµ‰Ê1éÅÕi^\4³F ¥ËMñS7à®ÿoþç}ßÃÌ„{ÞÅF™ «Ói4Ó6PÂú~Ôq#}-÷ýÞÊ·ÁºÜUÙ¸Û[¯@G©¼([ãð¼ëe…3Ê1kHÛt·T"š¤ŽÙ%¾Ù6x ŽÕWIüí¸Qµ¨,jML|NË-FG˜Ö÷ ª1¦æY›ë7¹’U›9™êmÕ‹ ¬ó¹)³¡Ä%q*bL4F#O¬ÄcÔÐ8½Ñ/ƒÀHÀ<ëƒXâeí6#§¹¦»}f¹|9LÅB™`^÷£õ⓾܀‹°hx4+…ô pŸ««¶•&¿1®=B ÈÅÁaœ#ÄU .Sï‚ Æ+ŽâaÏÇ¢b6·­éÑ„F<+mDw19¶²Ö˜ãyYºãN1æ&3nDÎV„¹©kŠ)ˆU1¶zÈ“ÖÔÞY‰9kG³Š–Ò•ƒ8¶’T]±ê½ö^Ñ™ÅÇåMV«âY¤u$º««@ù0µägy{ÈGH·‡wjÕÜ<ê㸆kµËƒMÝEv)wr£Qãè ÷¥öí·iŒ}^ªÝ{S¬‰vyPǤ’[¶ç]mX_ñëLä6b%NÖ—É9îÆ +­“h ‡EËwTqÉ®.†Ã ¶ð÷kKm ùœQJ$„Ó ¦T©¬Wú­íÅG¼)¤ØŽJF¶c3~Ńºþ]«MÜvÓùæã•áÁö CVe¾¬yÖôN Ò¿òÓ*ÂVÏ‹î^{zÃòãe‹Â¿™¯Õq×5ƒÚ€\» 8ì¥jl˜`66 OP9Æ÷‡%µc¶z¿­ËàKwõ{¥—OF§°R4¤ÎÆsw•0wýÀï”{xWÚøí 8 ú~(ž…i-£;ˆ+´r~fï ´[ÝÐK_îž•Â;HNiñN‚¾@ðý°)­ÁU@ðÔ§6·8» O_KÜëÏëy-¼ioý×›¹OÄóïŠø¯Gößõþû»´¿è‹û߬^ó[­ÿOÌüúãïï-òŸ/ÿ‰ï^ÿøãÀ/úKô«6 n’ãkîn™ç÷7¹Vþtÿ¯¾ÿýù"ã¬â%ïa|òÞ_nŸ¯V/Š?ŸƒØ3±=É›êÿz¿>ö^Õ¾8Ö[íý—˜Î7Ùm-o:D5?x;‡Ø÷áhÎ*¨ÓVÄnŒæQ;¼¥TkLñj•ª·Üí;ÛTã¹Js›1ˆ{p$liN¡fã® Xa®äñr¨/äQÇb½—|Íî O}Tb,Õ;Þâ…³”ä6µš1£âÛUZsVþŽ4˜Ù¤x™³R¯nÊÚ^’ÁækÞ~2ÓS³.rn<"t/Sˆ÷¼mê&-=‹|;¾ 6÷®‹ÈÅ»³¥R:sz×ðÖ÷ÂR01ásëÉ:_ß 7xY_³™OÊAãq iPL¬aØfcØ’ãAæSÂAÔ¹½tcjvt,˜¿«»Wåóøþ 1¹'´¡ '@1™wÚë „U I¶•ÓŒÊT®FÂI"Ý1ï)K×ÿHÊîɲ{ü•ÐK¤yOÑù×ÏÏû¾¯ËÓ'-­{ÊBO Mg Oàá9`ËH±ðŒáífÀ£B ¯7+Úï_´HÒXökòåQŸû0Ï‘ôNµßèæù-UMm˜Ë$U2kñ2© \,¯mûLK]0dÐ’ÇÌ«dÂN-alµ´ÖÿUÑ4÷`ñÓÓó_.Ð&¼>àÕFÝw§A·»Üp­ís²r¸¶»ŒË›ÅZ}]©/=ó'frÑH.È1¡ûBéfðe¸VÕÇ[¬ÊÇ&"¡™ 8FU¯£‡r÷°q_6h¼=« *ÿóз@ãÌ2apæä`Ÿºj¹«§G=× šh´›Fë\¹Æ5çd-¾[ï2”ãg€%öO¶ù\cçô2y5pksëï»ÊÞ(3;t§b‡`ÛDÕ­‚ýï>á£tŒpŸ‘-Ù°RVµ>ñẎ )—pAð^³ÖxªÑ>AÒX1 q¯ªåìã&§ ë¨Än¤uh šUéÓ¯+b‘ëÑO¥~†Z§Ø¬M®›€&üï¤y§BXöÖ²¼µ›n½*fcÙ¶Ð¥ÛÈcæ<+$e1óaÉ*Ýé.,mÙŒXív”Ž®"ÕU=Ø©íþò4ÕÙ¾ƒk‰Çc}³A+ $ݪ]­ñ@ƒYŒñø/¼êDG„—‹ûø´)±$OkÉ]ö–Úo æ¶d³møI <ø3[Oð¦•jÍòaKò[ûl¬e›Ïð{´ðÖdªv˾íZ·!ÙI›#R^вÆósuëä"£Ãe±0>ÜúúÊÆOB_ xÈ6éÙö!†v,tqS· ^=Wªœ}q½ :8´ûÀ"‘r”VÞÚŠöÕ¬ $¿–‘;üò%“ý•±3¢V5ò.·hßTì…F‡Žvzäϱ}…À¾çõûÒc‹žêø¯ôå¿¥‡-eóìøZéÖ©iá7*ðâN×fõ·5¿¯T¬ïÛ€ÿå’0¿}w¿ЛÿçÏ^ ¾N#ð‹_ËæwÿOš¼¨Ð¿ž¼ û/Âüæ'éw›!¾ñ9Æ{÷Û·>š_r¾¸[x7…÷««oÿ :gºG/WÓÁɧÿõmô`Ö‰:ÓÞ#Ï+ÿYí»AÙVÎ0Ÿ—Åß÷Íü»­^->>Xùùw‹¼ÿüÎ=ŸÒ¯¡#}»u&,·ˆr¾QÒ.ŸÎqâì:~yXvËS{êlÅòZÎ-õa¶”%n-|*ŠBΖ¾S•Z:±B=aá>Züs œ¹Höwºî~¡ÙŒŽ ,õp ˜æMÇÈþ°pÚ“ÓÎÁ糚$9ƨ…3@uBžsöŒ!n}N™ªRx{#åÔfYk¨“§JìOÞ®Y _]ˆ;V„Šè¿faÝÎc{'m¦uszCÍÌ8²PŽ6 3íUÊ£‘i¸jP1Ë –KÔÌšæ¾Á4 ú æ¬( !‚ÂFò¤>[·ƒmz6”’ˆêZ–³Õ-±-«0ðί9ïfð{Ýiî‰ùúbô)1'»•v˜æ pó§‹àØu,æ|˜ó~.aÖŠFFZ`yRAA(ìŸSc »Õ-£cÙÂ#T‰!¼gÅ-Wjc˜ñžžÖæA6̆Y,¶7üRPÙ9È;ä,r?Qegfð.¯Ë£Eù²«a!dX;;Š!ž#mFt;Xw&§tEm õKWe-]'iX¬ÎMMr4ö:p Ë~l!êÅu3ã)–7VѨ˖n¥­Vª‘µçO<‰œñ%m&I6˾Ȋ"«3¨æ‘ºêuÆw̴ͰŸ’åªÛn‹eížpw ÚEe»53P]Þ‘¯ôEO¥–™õÀžˆn”½Ž/¹$цõž"ÿ®¢ÿs5â Š;Åsäу½F³ž`«¶P\\µYÕN‘Á”*È5Œ›¦°ºKÊ{eVÇNöJô©$²’Å/Š+Áê¹Ó‘ÍÅÊ´­âJÑMÀv ^•çè$Kì,êò*OÜÂsºßÒå6> B&ا3“èæ‰ØrŒµ µ·ÃÕÝà Ð`N—^wÚÒÌ€‚1ö%©Ú÷¾i6€–£ƒ~þ m¦Àˆ™7ŠÓµpTuµ £C 1²ª[\ñØBQ¹j²Ÿù¬Wîè£^·ßÀMfz€3‡ÿí‹(_F§T„¾ýÇü©“:ŠD»<2†•ÆÙÕí\Rª{а=1T€uXURûú‘g.ﲈ£aáåhÌœnŸ6 cð4€×UÃQ +x½f¼4îm â=(vmå›úêÚ«Tµ«ëD_—kAQïçr—`Vrøúf„G#—„À Ò BîC·r„8Ÿ6y‚žÅ =u­Õî¡s«ø£ö¡NFÑ‹„Ótž‰è”Ò7-æà¬pWkß1lÁí¶“·”2‹Šãl÷¢gª‚¤†07`ABºZjkX-£¦Ò7ƒ^‚OñšÄÐÌÓ¿1B6†Uh?ª[ï¹0[]9\ʺpUïc‚û*Þ IDATTx€tè¦_gÓ¦·½÷}«n¥­yk',¶ývóûëOh ^ …5¹ë-A#ÕÖ6Ûy×Рg¡õ<9óWJŒ‚¹ì¢Q9œ ‚Â32³—ç»tm H>—¥pÌ9¯7<Äh/ž‹…bûOÛž&S2.+bT ÈýžÝc¦wÑ‚Tëñ¸høñ1ýžv» NÎÄEd‹òóاn¿ŠÆÅkâ§ub4~üøàeÚJ r÷©¸(ú Ä»±ÍRÀÊêÇ©ÙÉèSëv¨ U„^í©‹‡†¥EžÁPªk± èÚm7aÎʤA®[¢¹i˜”xí‚Á-\F—>Ì|¦ûÒäšÒX!Aï,u< ¯@ÀEl08Òóž$§¢ÊÙ²ò.‹a÷S¸$ó¢I/ÈÙªô±Ï© ¤ Wb×6ÝÓõyO÷¸qÔrC šÖ „RìJÆ; ‹Úé…»Haõ¨Õf»úP«x˜A~Ï ˆË¨/aNF¿»¼®Ñ—ß·4ð¡žúCeÔ=쀻Á>¾Â(Xï!ÁX°ŒlY]ÊèXîNPBYçZß©dFÎz¨;¯¼%N¨¶@RÓ‰W³Éæµz–…>ÆÊ9 žÃïgÇ@¬0¦Aìmb«KeÔÁ_âXšaƒª±ºçC·J‹ì6 iUA%>’me1·¨.H&IÔg’O— J²B£¤ÖtÝ ä#¯fˆîÕߨbÁü sçÖÜ¥Ÿsöåšs“ö¼Ö#¾O úÛ¡ñN‡aÐb®ÝF^pm”L%ÂY÷Nº "£°D ná–ÿMp0ĸM·+qy&{§(AÚ9,¥ªòîAN‘â‡e ¦… ÏU?£˜²ÁXl €P”­è:6›C#LVXÈײ£2ëí©%{jy—•©d5ù²<ò´èy’v}GŽiË£rÞV¯³ó=m€ðaüé¹¥®*ŽÕ›µY|I¤Lr;Ö&l3ƒam›7h^aÁ‚Ìt[ò_<{Kë®H‚`ð‹T>¥¾wFêõ^ì¦YËÛ(Ó`ü¬aÅ«( ™EPð¸õmpÊ™gƒÒ‘h›wô[àszÙ?—½‰ñ5}æKCÛþjQöám¨kˆr¬!à2Ü`‚Ѱ‰E¡»9íÒœ¾Ô½e7³ø"ñYœ„íÖ]sdØuS>0…& Ê&<üÎ’¬†‡¨ôB²¥bÈHï$|Ô“—‚V"b-¡íiB¦‰è 'á^e½ Uå ç²ö#0_k¨,MiÞ3ì{v1im®)]€P¼mÀ>ýöéq×y'qÜr ˜+:&àp€cpÀh×`}ÝŸêIJŠqlãCô#Š0Ë—F²ø¥m¦¹n ø6˜º¡Ç`6B~¼Ã©¼Eë|Þ)šr¿ïûó×Ç5\ú¼??ˆ;Ÿ2ùpíF‘¯AÆÑ|áVä0Â-òX>Eòä6g’jOKÏ(Â6h2ÝÓ#^’Û~ZÃéÑö gïçØÞnâ#fÄ©Ê+9k5årŸàf3\ʦ„¬ûÝÅ/'®˜M—–  EϧXµb_V]ËFó‚( p@á òm§ÚÑ$¿ä°ø*†™׫¾‡.¦cH·ª³³1h%¤jÔWþXù( Ä.åí¾mY;Pº¤øB1Å×þñ£•CuœÀø9,£Èi¸å(kplPž>%ôýc"ô?Ò\2…+¬ó¬@Üf·@xf˜M¹Ž‡èqåªq•(+?Ì ÐuÍΖEF!–ÿ“„w©/6«DB9¿,(J4«‘6 Å"ŒpÏèï3ƒÄ\eј„åÔ?O)S‚¦Ïxˆ²*¥ {ýÀUe Àcìl|’3ŠLˆ&z61§ `|•{1»9Hp *ÚtÜýÀžv¾æëûF†”@:Ö@½õm•Ï\ðsoÒ&'wN9ä a?MG6Î2ÔWïBϹ}P+¶¹‘°‰-?²5w‡+•´£uåQCsæYOa;mÞ±Ÿ‹§=¤•^( .¢{8Í—„àûå­C>Õÿž ذöãŸbý{‰é¡Þl¤ÝüQ¾ãyÊEþɼs¬yãO-»×aæ>ÀOŸ¾ïÞb9i€o9‹‡ ù®_Õoy&5¼ß>'Oú4q¾€R6„ïAÚ§_9¾´Ò M†/™,oÌÚ|y©Ðr¾ó;õÿÏ .ú-åòý9þæ·wòó¯=Êï€5¬ÀWH{m¿Úÿ+míúèoÉó«ãæ½mÿõ;}ô4èe£ßû¢ÿÝðwÿ Dó4’¿‘øxžÅIyýY|‡‰N øwwÕ±§ÒkGñ·1•—ø–¸ÿöž#Ÿ£:ê¡Âó»œÃ»eã~Ué¤Ê½¶93ÿƸ«Êäqg‡í7ìY,6êÉ¥À·fgß·Ñvmµ:O€Õ©ÊãipXãÕž³ÅJ_0­Té‰Ý?{ ·¥Å‘§´~%Üö ê |wëŽVÒ!iZÎþ]j[>ÛëÏ(T¹Þ9 ÆaVŒâž3dϼêJ¼¯f>gŠÉ®aØ¢ÿ¿Ìó×Z§/ò‚Ì:SV fÞÌçc˜.Ît3ÆIslˬu!Ÿ÷ôd UBÙ*ÝÎîZÈS{±ºÌ¬\ÞiÂçõÖ‘kØ/¤°ûù £ývdkš]ÝÒV^ ’êC&ÒóÚrÍ.,g˜l@³Óß×¾Ò86Lâ.FªÑúà1šØwWÛ»Ò¶H…–2+‚㺢!{žñà‹ƒF» k­(ÍfCÂ{ëwf ½}žauÏøèP}•|"BS¢²*ÅRÁ ?24ë™ËÜ'Õ1hŸAï%(K4íêÅÝÈ'+­c =ï>Â(hºÃhÉÓòé8Ü4Nì»fƒ6Æ›‰XTëGG•¹M«xº›54Á£{·iyRX’ ”OPÈ4|ˆ8*ë{>cgâ3޳vAB”çj’òaN’Š|ý×ES}ov˜ñ‡6Ýáù9Sø"af,sªòA½)™à¶jÖʱžþve›„Ð^¨LEÕcX±ëày% øOÎxØçœ×¼!G,$}ª¹uЇš_i8¥Ï,8j—Uè^YŠiokP ‚^N‚ kc¼Ý„ñóZÓöÌüĆngþ²gXm‹ÈøUXàÒRš×æQܰ8 g´ñéo·d@b«"æVýÜêªÞ^1mä•^å’©‡`Õ‰‚“¯£Wd€š@øÎ4ÿ¨ fß’›ÌǽF[ßhvÇH‡³3?fÏn†œ´½{Ákû©uôß<^µm¯šO©4ù©~ðÜùz óO(ÜYOÍèà\_Á‹;{Ñ öfMÁ~!"ê 6᥺™Ü»tLyìnÿ¥n>†:jÚ¿»Æ¾ùý'i[|çÖ(éq‚}-—óì ~Åié¿XØæK€‚¿%'þjðõý,GÏ‘Í{ÈÏW¿J_¤Hþ= ø œŸôË«äåÏï½ý'¼I¿9|z…ýë‹ùËB™g îkOúÿfïm–$IŽe=Uó(òýß’+îÈ;nÊ…ý¸EfVwBî9G€™îªü‰ðpWSýôg•ðàÑŸ úØõ ì_ÙÇAùñ{yêñÃ#6 „fò5€'&èmÑÒx.¼?•Ü?õ ¼¼Ôêø…ŸË!4˜%83£0ÑD£¶eW8€?Mq6ŸaUam&æúåóïx¾b="Í#îCQô ÀÓ!€ÒV]òm¤W­B‰hÌ (s†"HËö¦`¤Ô˜ÄR½mˆ_×Ê­²¥¸á©ç&ÛY†«î„ˆ4·kgÙh’Œ¾Ø8ô6^x )²I´tCFÎ¥x»ËðÚtºd§P—ÁK¡›G^êQâx+êµ]sh«Q‚ÎsT» @h•”†„a«)ð*Û–+ÞW%ÃÝCƒm€%ºb"S€ #³±1®ž+γÐÙ-i˜¼·„­ÛµÞHlójY=¼X :Àv,éN§Lˆ8ÀâʸþëÌï+ù¬]Þl[péûÖÖ–´l™ÙUÒœ=ÁéÙóœ˜îY_¹“Lòu€¾³_\ ¾}zžÊߺ¢v2FRå½nwüå·ä¾CÛr×2#hc®`\ .[2Ý~Òe”·ì‹ft¹õ½„ (à.p{qp1Î%ñAX݉f„¶k…ÙQ™q 9²¸£p‡DcºþB,û¾ýZˆ!/7‰ ëZ{û,f‰´k]__¶·ó{·ÃòËB¡Ä²=¼B?`Tp“ öÞúK¶\¾^6k1°Hñ¹™Ù"c4y ÿ¢n!“9Ô¼·öíc‘7)…:Z:~ËnÃÞÚ[ &‰çÂYˆ¸* 6¹«â“ú¢µyQjɆ ¶;%CÔJp:Š—ç®ê4,çw—Ò”Æîcø­tío—<*]¬äT4;~Œó•3ªÍÖÃ+W”¬·}Ë)b™–™ÙŠþ†] à2lO í-yŸ«–ïí€/,‰Kãüs#¤Q–S0³ˆ%Qˆô6¼4(íLÜ]ÛTyE!-N˜¬ŒÃ¬²ÞçúìGÇÞ4÷Li©–—'À˜Œ{ƒã6iÃåî(ÁH®B_×ö%ÌÏ\–cû{dz:÷µ¶u¾â)M¨ sq9=•v–Ã+TáÏÁß©ŽÓ™«ñMŸù¬,6÷®¬ü"`ýB1ªŸc* >N°^ðWæPd¥Åi_æCgªAÏÀ&^úAñà¯qÐø -½Eösg >ˆiS‚J­ù¡»Ìn¨Á®ž_Quü /Ü…õì-ÛD|@”òÀÁ¥ýU4môpâÎvæÓnÿ&Bÿªü'r6FóõqJðÓ,_ßɧ@À¹Õzº£qµþâ%úó÷ðÏRÿy7û¿«rás*äã?â 죠¯ßæ<þ81ðßÿ|”³?òüùëY¤wyù± êŒ.àúö#8üü?–?Iúg]Ö¯¯¼íúÙêø±Àû©˜S/ºâØ'ŠÃ¨>>ßËàÒÓ=ª‘’-†¡~ÊèóÜ“»0/ùëoe£yñÿí5¨¹¤sö ÇoŒ=·œ²Ú¨ØÉ§õY¢”rœ’›žïtjd®Îö:2у#5¸Íæ¬(Y±ÅøÜÔOÑfL¼ É^û¨ÇuªAèéƒß˜¥Äçz=W«É§9¤þu]Ü»ÖL0§¶ äB ‰"¨›²ø‹po…ÀèÃU÷÷ö..˜(‘f t¾C{oJ@ÙIÀ9„h†rùgiN˜ëµÖ_߬š-¸«Õ’+J>ãWì}O  Ö¹[öÈ(ZºÒ£x»èR&K£ª?ރƹT¿£~ªÎÁãÔÛX†G£Ã9:g‡™uVÀ€­ðÉi04ä`q ì¹´uÝÓ–·JšnLZëÉuäÚæ:w¼TÉ^™تƔ`Ô~d{w$ïsÇ2Ðè%õ¢†¸Òí¥ö%x1®ûNókí;CÖkíŽ[€ð]ÛÒ„ZjÜî&qÙjã­ã¤ó_æÉÓnNYßR¡Ž»ýv_\€ß;»=ó9tnÇ+§ñ}b+L Õñ€vn1åûìõ62¯P°2­ÁÚcc¿ˆ]L’^‹nèr¿o+¤[4ÂØ­{ñ²µÕ,‡î0p¤¤µu»{ôù]AH1,³YVÙ÷ÇlûÆ `­u™ñ]áµ®-×-¢¸Ni±Ô7p†ÚKkISòbÚ·Üîpµ§h ¾ßZW[_ ½Õ…y,®.îK¶é}'mie¿h¾ÌîuéÕËJ#xE«‚ÙEn ÷â§[G]ƒO[©ª2ˆ›ûÞñµ° ‰ ³èldµµ¦$HHÈRíÜŽ2oÒÌ._¶ã†@3Ö­Ê¢Mr0º&¢O8>Òí–‘FÝM»‘Î-m9„+È#fV“<÷}û¾»Š°¢ï~XZ$á{‡»ùŠ1£œÉ"É;îˆ(íò)3»OgêY)áh‘÷5K ½:i©z<ý®$ÂhKKÔ´ÉñpxŽÀ’dÒ·DEü«J ÊPN°]ÑëQÜ,/ } b{\¾|¹;¤Û=ý¼–«±K÷l>D¾*<È]ˆl(­w‚­tŽðÎáíÍgâÖŽíó8‰ º»AôåsõϽ3ÈÉ]UUÓܰ¶ÙrÊöÖqXZ[Âô‹sø šÿ_†#¬ßRó\…0^0˜ÃµÍLÐÊíJ,{‡V·søgbvH #zÊk7z;²0¿Â4VigiÚI"pdÏñ}Âî|;í°ËÔž¯IÂcVIÊFI\PÑßm¢ª¸#ºÓ¹­»È­Æ#=³~øåAä¥liUÛžI÷|´#ÿÞG°»Œ]¤0©^ÛË%¦š ŠSz&WnMŸ ` eN—]'ˆºeU­ÒÍÌLÇO«öïìÇ ÐP±›(¢“–X˜wˆ—“§?z‡9îôwJ’seŒÍæöîM¯Ëm5(ÇÃ'Å\ÇÁœquX ÚY&Pè³Oo‰„oæí!"¹©»©?³¹ÇÓôôÃ)R?¦ · ²vÃ_×%h3Ò>›{*+G#b0;§p)úwž‚ýAé4çÙׯ‚cv´#¾-Eçèÿ€ôp$½ÊSb‚‹Ý ý.Ÿ`¤)2ùñQ¾yd‰'Šæ){Ï•0Æ¡O=øð™ëŸ}7x{Úýw$𻑙~Ýðû'# ÷½Å‡¿¯g Ÿ_“>%¾ø«Õ€o‰3èW`­µ÷3>xþÛRÀ>ÏDØôÎñü{šFštþ1ÝÂÏ!Œn{ãÛ§õø,¬D-þ83ø âŸç9Ž? ú•œ›‰Ú“{äë‹·ynÖðþùZrðŒS¨ÀÇ¡UíÇñ<˜þýqŠv#ºú âKœƒY–pÀ-Ã×ÉöÐ#9Pþé v@bÇS|ù̃ð8Ë2€VÃ50;úŽýŸ.³Ý~gbÚàφ±ÖmKOJõPÿ9råÛý…Ý÷Þf„™Ù2Dwî æÈT¬u_VÊøã?Ūh„»¯ë¤Öçý ÚrŠ#Q'Žû¾Öš#•ÌgÕ¡¸]WïjOÁoonÒrãã¶!;|NQgÌ3y:¡ør"M-FõxÚÀ t…Ò³À«j¸ ê1%¢Ï…ÈÈLËH;Ð:µ™»–Ýî)¯ÔI!öÏ«ÒBž¹HϸÁÍïñÐ#dÈ•í`9Ò07oÍIxmÌåà½ööe+´Åª•È_rßv а¡KÉ7ÚeŽËÎ9'rf¥&ëŒ„Ø <¸ãÕ˜]ËÊi4Œ¸µŽîÇÖrF.ÑÍV…`ÆœÑávcû}ïÿYKs> ´‘X ¸hßy¼ cK×¢]†H}V˜£„ IDATìVŒÂ¶œ·/n¹ÿ¯½£¡ ‰•¾¿D× ú”Sö&á›! HÞÔ/†ÄH|t~¶sƒpŸg ÓânDL „ 9ti,‹59 í{oÿ#™]víè³- .ð›gõ¯æMΙñÍä¡Aåýb˜ý”;Z¢ÃšŽüÓÔÜÓjÕ£(þ¤¾°`ôç¬1›Ñ´–-]îá<\”¡-h1 fÖ™6²(r–Lg¸åšùZ¬¦Çi÷ã(lsk9&’7ꬹh¶v4zŠÔ*•# /3àh_HR`U‰ê–¶ïœÓ®µ®Å­½Ý}GT¥{iãA¶˜ÁŒ(²$— ¾·kCcΕñô(ï ”MJ•W²SÃÛ¬RÇãÄ©B—í(T§üÍ)w,K?tòùC´ƒÖ2-¤~ˆøywæô+šaâ™`A7=t¯ê½º~Ï}æ@¹Í©]D”뺷+ÈCCea&p¢?ÍÛ«)ÈPq?í]5º]0io›è[àú²[ÒÖ·ï¯4ÛÙ‚[è†võg©¶ye½‰dK«¡1®;1 ¢rT Š®´py]ÇåaéskUkb¼MOêPA­úÐ’Cq†]"ÖŠ&>Ýj5:nêFå ûUdÍ®ëîäÇiÌ‹<¢µ5N°ÂÌñõ|i"ç'QS…‡4Ä9-`¹¿_8Oªÿ'Ò5§ÄüÁ­«WõîEt8O}À4pLýMÿйùú¯ø¶ñ²Yf—dŒˆöLžË°C¼?:ÉÿÙÇ´/þ«ñ1ÆšÕŸÈÊŸP)çpÞž?ôû/›„ùƒ˜ýŸ™ü+¢ûï£ï9ˆéÊø}oð¯?ÿªÿòåóï|³ú¼Fÿæ_aÖ~š/ëðßû{Jæ5utœé/«9ÜÔO®úöéÙü…>øÂÇâôû¾Iîœÿ½$ã7ÀOÉ ½­%3ð˜lé¿óiOÆ“¥ÃÇø¥\‹á_{<,j× Ï¼°œ5O@Ÿ»^x;ÏU ¡ü'‘™êÌS™{ N›GâÔJ´è¯"ͽä-zêp.Äzñz|ÆÙj0Á3 ~Ot¨Rz‰hd ðã 14»x¤DJ4šø˜P³Ô¹ÖŠs¥í»¬ß85q}²Kš»óGrw®Âëa€k«þ°:ŸH•½®BxóDÐÖ2ƒ`˺*³1-š8Àš³•7ÉôÜ@5„Aåï ´ÍÃO€]›©ô´¦ ,ò¨¥ƒ:~nýìboü ‰ù5뽦'ÒŸm+þƪÀáJëC>ÔÑs‘Ä¢mzswË¥áQ´±¤ºÇU—¯Íâ«ïãoº$_dh¶žºk tÍ^ÛbN™Ð2¢ì¬"Ùò0Éfqª°ƒ]CûÇ–wTcpo‰ø ê mqßÞ1¢Óƒ‰G{¦ _[+L ëúŠšcËÌd™ä¦xürÐV8šSxRº¿¡½‘J“Õ¹ùß2]M扵 ¹($Aƒ9îlZ¤dÿc¸„o¹´î-‡v„"®X‹ÖϑҪm¸W’ï®û¢`—™-à¯`DѬø¼'.ò"·]Æo€q‘Œ6ïã£[3S,1lY.ú÷Þ‰Ž½L²µ¼o$!ºöò’±PåÛ¤:0çj”ˆ ™À,>d€º6O19ëÓÎ9‰n\ZÆ‹Ã6OA.. ¿™—P—÷v„ŠÍãÂóœÃì-ß6Œ‰fô+!ÇdŽàН¯Þñ¸¸wQ1hFÜfò$¬vM†5I“ÂÊo¤ÈËJÊ@þãZ·<þY@'¬Âë¢ÀÕ‚‹Œà†Ñ6î ?tË¿¼”$ãµl-3³ ˜ø¦VóÙ¥‘ÔˤÏ@Ï·»ö X‚%]ô³C; TÍ£‰}€Æ~­•kñ–àQ­£4OÝ'©aA07Òº²dƒ–qÛ¹»/}®Š…’¥@¯C(ˆqdd~’;RkÉ:èP£vŒ¸²šrÜ÷Ž÷ûíÛ]FÈž0â6ÿŽzî’õ´7DVP í>.]; @X€âaAŠñXwóâWG’Àj¼%sƒåýYˆ¢Ù.{²x(ŒR¬hœŸÂƒ¶|%û)|èläÒ Ûh´¯u”ï™ÅLí[½–˜êx„‰;‡iL:—'¬)ŸûqµÍCÕíÇ.“Óuo§¾¾.·a´qTh€÷í–Ñ -æòW—åXŽâo»Mql·k¦~\ãÉxGÇbF˜óNÎ躴6/dßçÕSE 5Æ*ÈÙÄX;¥']s«BX’±7cD†ÚMõèöD#jQî¾²º|Rûk  OÒ Ñ‚-Öܬw8èñ[P‰·±ýÂÜPíóår%\€ÏC“ÚzŸ7Ñ,ö½ÝÌ0¦Úýí·Aé£ m•m7¶…U†áô&›1-øE°òv`DFa¢E…"F ³§½†:Îäø“§ƒU/‘í\œÃž¿,w×QG¿ {ç§ô,6îÖØI Òŧôú<å%àp¥¼Ö;ä®о‰XþMÛSµª#?ác¯X&)we×›ñ‘LI÷žGEdX,2+Lh¢5ÒÁÓB\Š`¢î`:¸»sYY„;žš5˜©Ì ‘°Ì÷bsdLÏÜNÖ4Q>Í7v Jžùã˜7ôÑÏñdwXÌôîW×e?«g uËUëK|ÒçfÀÿô—Þûbô \Éé±ÖG]ˆŸeŸCðâ ¹ŒÙ£N$…OB‹Æ ¢Sµ­¶ÇKЙѢö2Š ÜîæñÂu,ý’ò‹VÄñ@¸%FÑÛD £)§ðMû¯Ô¿öLx‚ø¹¨öŬ_æúüªŸõÞ¯VéÄ篺gOzØèÉŸ$ä¿§ ócÇhCÞœø¿«¡˜CÚwñé­žbá/J ôkñõ£BþŸð·0õ. ð.> ŸÐ+.ýÿWèÿÿ+ ð¾ÏŸþ«W"÷׼ÞñJâ»)RôöÛÞÌ¿L–ðåÞÆp½åÆ»ü…Jóɪÿþ)´ŠýüZžTÿ3Í8°Óߌ?¿IÿÓ‚âò?Ôÿgáùzò‹õê ž›TÕ3Û:YåLÏwÒ¾›Ððœ\‰óœ?ÃûaXò<é·06§O˜¡˜ZNGV¯=Yã}>|U2üü".ÌêãуÓS94`sºžuJ¬š¤¥7Üûöˆ¯$Ë6;L€Õt(†@¸ßc4"˜ÉKeíScöó¹$ßÙµ˜ÉÝmeùž›…˜çÜ~‡?ô &XÓ××Âwm9¿zskfØ¼Ñ ›Û± õ? SIxH¨fD†àd7ƒBÆOY¼Áµ}ïëºhy…t¹Vn9ŸÁ×E[\4¦‚˜2Ö´—.-«s¢kÔ]{`<¥£kœõf]·wlðkEƒ(ñ-¸´áßÛé ­ÀîuÓñ2Ыsxä ãmIðЯË6ˆo<*âu\5—àñ¸@¸£Ñ”A•á"ÅE÷o¢à´á{»ËÖˆ´ÎHµð½Ý·}™ [n  ¶ÍÒ5èÔHRb.⯼µòuÑ쪖‹kÜ®;q;v|øñ±ÓCQ/¶N[ß81É÷2š/X\…÷M—Å àmspN/:âb7øŽ¾ÃXorî¾å«!m9ò .²[=謳ž ¯œ–äýçf‹Û×ÌöÞÁõ?ýëf\´M7¨•Žk- ×¾3Áã!¬i ÁzÞ.O: ¿ö¾/Ú†¾ï Œ®mé)&C…æí¾·G4?¨#(±ÈÝÿ׫¿bÊ“[X0%ß¾ö÷öô82cñp5¿'b€;žÌ¥éâZËÓL³$]ð½µÖJ\•´ÈÝ“ª\ÙÒÆÛ“!¯aL=ȳD¦W{Œ.‚ÔqHÁoД䂥´_*sÅ $ÏVk8‡×ÕSß233KÀÄ·,ìÔ*ÐJ{¸+kZ9Gm €UÇýeÌ" 6üÖ^9'®!ˆÄîÓ`w¯³;D¾VUV¶÷+ÑŽÉeÛ–‰GvP¡UfåDntr¿I=¶.ß¾ãi”È+÷½kß.É UÌàà’-»•¹·jVæ½9gôV®XT—ÚBÅ”›5þÑ„'ðyˆQT„ø®»BYÈs{iv:„ ÏÞvÖsÌ/³s —ÅÀ›‘4nïlAF[ï2ËìLj%t ~sŽXÌz2‘/>­‡£• EÀt‡ßÂ÷é K<ã•ÖïŒp;¸ž¹¶²:5Ù¨žöéðÈõÚjð£´+×Ê3É~åô&¾ ªf¬¦y‰ž äIlÙéé–4µBf£v^Oƒ+í!ÂW•JÎÝk?¹…"çÇíml€1bYYynÎ~‹¹Íˆ¶ŠÒj—ÁF IUóŸˆ23$ {Ô­v‚ }U`aÉšÅv’BÐޤ©Âò„祈xçÝž5Ù¼5ϨI4Ç œÃŒX@±SPŸåÞ9‹KaBÕ·bÐU³!:ƒ=+9goV<¼¡cÝ?Tt‹ _’=›55´á²Ý¨2½ÞizÒò›yÈ2Ô[¶7Κ>½ÚÿñèÉ}áÞïŠL?Õîº!qÚmžþèþ[g*ª1-©¤ÔAž$„¸ROb÷ädZªØÿÕ#ŧ9òC]v4|Q8Ùn4W°ÿ:ʳ&xpX{ŠsRî5–í¦–Ãʆ§€CÒÖ«*+”W§R¢/bŽ}&Z êñO 4•<}ÌG}XlFåÏ/O?(‹z›ð_3æÿg8~Ñ/eNþøÈùÛ „•ù¿ÿùûß¼ô:!~Êö?ÿÅ÷os Éøó$àg=üøø˜ÿxêôq ½ã€^¸@föÇÚ©ÝñøTøÚ” Ï'/úm:’,>4õvý8Çà‡1Æa¤á~@„AÿÃ`A/mÃÞM˜Ç:/õtÝ=†%_O¬œ?–U÷ÙŸ€¶qà#_ Ïž7TxÇÎý’HàC3ŸßܘÛ„b ×3Xçg×êµ:¬ÿAÈÀ¯¦¢±¿Ñ‚¸SQ5 “nýÚ;cP ß¼ztÍ,-öíyÏk2HUÜÖ³áè§±{än´¢9=î’Üç½µ`ÍÊÓŠGýo"÷ƒ€îžõµÄevË#6Qý’q¢šè϶¦F­™1c¹ç-‡Â‡-k%ÝùxSõéy4vsX%"/Ñæ—@ºï:9oéBwKK>WGãùM*ÇãEd¶ew[œZâíX4?°‘CeËKÉDVmr‚Ëiù÷Už kT^ê¿Ü]SX6Õw\Rýw oúµôTФô ßûN¾²†×Ú(µœ“¤ÞÔ*ÐÇfyÔŽë2³åô°$?K–îR¹o@R%‡ÄhˆvU$Í£ä$fuÔ)[p¿»u”(ž‚åû¾_v5Ê>f嘲Ú!ŒÞ¨ß £‡•y£Ë('hä"@ß^²1T¹Ôðp]0J†-ß÷í¶ûÃ$ßÒ¾÷J}µ›ü ¿:¸‹jŒU¹[KiCiÏpG˜wxN«„#L%×l™É«d¶´ˆÆêÈãscIŽð꽎ÞaÒŒÖÊK¼Ò¹X)Iâö}€mÑ.Â…MË.À¼D? 1b´`ÔVÖ‡ô!W€î WäSŠ+ÿ.ù4[ÿÇn@Å}ëv¸V¼ ÛßSž¬žØiOº¹ îïû»«bÂùJGBœDI; ¢·+|úf¾h2ãOØû.ŸCÆ8b^ãÅ+Ï¡‰àôbö >«M¾Ó[)qÚö.ã­TÐz²c$V⨴&ßžÍçYIÏ3ì’äªâDŤ%”OìëBŒ Í«çf‘Í™Ÿ2ëŒE¹î½£ß¢¡¯pm¨ÅuAä2îðè˜Ì'HïH¢EÌòÛõ݆µ\ÃùÜsÿvÆòJ5à°ÝM$–-KPŽ÷ÉE¼v,¡ùeÅRvïí];§Æò¼Øå>ÀŸ&Dˆ‚7£æaÚ¡VZÜbOI;y æ²€‚TºkKàn L’E–´nè8ROpsXϤó½Lo(3ç{È‘5ò†»Üc¸EãÎWM‹T-7Qí#ï’Æ¢†»¦4Mâ ÎRv2¼ã¨ ÒqÕxX¶«Ä’¯ äDU—qoÁ¸hÎz8³¤cÎõ*lð¶Óª>åÚ5Ðzv,E›=:ו̫7ÙÀr¡ÞuUlwËJ®*Rç ̘u¦«cdm—nç ~í|ÕfûÕlä¶šú-8)I{ˆsŲÆL2öþ.Ûö݅ÇKΑ«Ù]¹B(Á¾(]•>gãtœ¸´e–G9L§À­,£HTµr`9Ò6‚®Á_õ})"ˆ¦(@•± åÞÃ!«A2¶o9äÚwÌB˜-äN/}õ^Þûݹ#Ƽµõ<®d á-mg×ìz²ÆÙîö¢ÈF8Zò½p>î K<†‰ª®‘¤Yc“Áª¢B˜G“ ¿ÌbÝ·M>ŸlɾVüÓÛrÚ‹øÐH¬œf~°F<§7t9Æxe:—ë™RóyuÞæÉbˆ'½MU²ÙÁ•?ù+Z‡Ï£ ð‰gÙRujÏç´þ‰j®wïAèTñêH,xdþÏñepÚoƒC >NûVh;ùÿqÖ kJôLëì/$ŽL»£úÖút‰Âï¿÷èÿßï§ ßþî‡@ ¾±5Ó‹×\³º^ª£áÑÙóßÇÌ ôD#>³L8ÈÕIê5£ð²7B®3ÆÐó‘NÃúõ'¯5]ÄËïš™•ÜØÔ÷²”ûR¤õ¸nøÚ–€¼æü<€õÅ]ª*/p»?7^ççòBßÊÊ·¯ ¶u²8ÿIý[f;Ž y>HTk5\¥S×½¦…ú1 BDËÇÁ4þ{ƒë¿§½îtš)0&u‡„ÖZ!h)&Ñö2m~Ä>PÏθèüsHs—GƒPÇ)ñ‚¾AîÔÝev.%#l™—¢Z©úGº##èàÇW¬æ‡êµªöÒÊþQÀ_˜·>…cNƒÔdȹYõ<úå®V&?û`%³‚Òvæ{£,«rƒz°-g°Ù$÷Áí² ƒè´?°g‹ÐZP8]=úñ—Ú>)®3Ǽ7ýƒDÆà®›Â÷ŽVÖøÀþ¯ÿûÿ ?ó²ð¯à]«üj(é#YœöLù÷§e—­õÑä›[°h.ŽËÌRUM7ŽNrÓ½s4¶hS&®½3­r•Cnêüýe|žÈÀo ÓÕ‰êhЍeÚ62 ØÛoé–û¤¬¼¿°'ZìÎZ¸ývBwjÙ~»¾ï{»ß;±É¥ëö¾w¢vó%í褠ÇlM—a§Ê ]|4˜‡ç4F™ít‰wTš.ÃM«‚Ž3*Ž4 )ÿ:7LѼʒýí÷ö]2Ããvɘ]»=mé´NèýȲîÕ7ýÂv]aÒשÓAä B¥JîÈe4[kÓ^l.×z•0'X4ÒlHp¿^W´kj»7BÀo¶)ÄòuÑÀ|]¶øÿþ¯ïï¿n¦¼s·ƒôïXg#6äp»ûÞäµ–G'r^&£ð0Í’1¨Vˆt!gx5vÅ|#äôwï­RvSñ ¿“…evçã0¹D¤âçµ–´¿ï}npe×´1À<£îVL‰:÷P„Ûµ­ +ÒÞÂ×µ¢.ÅëÎ:ºiúõÝí›ìX6ºÚº¢/½ñ‰c#°"T¸øäf¹ŒÔª>È’ƒâ+X톋¦ð䡃ç†Ç‡‚OÒmú"íËÌ,®ïûŽ ¡ Ktf-QLÚù2¼8Ö°k⑦lâwŠOŸ»¦L•¥ !# Lb|)_¯‘0†¯óÚcF¶,Ê¢šTèÇàÄ-¿d£±õuÓŒJ+ó»æF“8 ;\çBR¬ÊãLbå—Õ"Tª//Ãmlz,õ.»,(”ñq¸²ù©¥Y²ÍáÖ:õC|…œ‡ZŠ!7Ʀ¥lÞ~º…QàŸÌñœZl;犼qx1ôRd#µúeÕ!÷±g (1q㥣çVr±~}\Ä>(,,”´¬[nCýü-¾ YœÀjåÿˆ‰o0ó(Ì­ZÔ§—õ&$t¹äûÖ¦Ï&ç©¥™‹·Åªvœeriä8zV[9!áÌy¬\ºæn4WµâŠúœtš´W5¹/jÓ—}Ö¤º·ž;èøŒ”Oœb{[=&Ä•‰ÇåSnªÎÈ*Ù°™×ž·_ŸfM8ƒîåû׈-;S—^ñ§~ÙàÒÙÀxvžâ9¿%ìÇ,avœ¹‹ž¯&ÃF¥kŸíÓá-9>¢þe$ÆÀs‚eê™wkï{ÎW£‡¢M¾x»Ò3Âþï§4Ö å'ã ëMj¸ö ZaÞJÙ%¥GÊaÒðœ¼ICŒ]Óþ?;Yµ!Oó/F½?ØmGm èx">[Úç ¾Žš¡•WÈy £ê Ç¥¥Ÿ5?þ7·íû—ôg.ä²òÏ$«l»þèNþ»L¯6ÁÿÌ à=¯À¿¯ÿ6 ð³N¯9öð_õÿßñýë5žùóó»¯ìßú•êc–æÃMÅO=úyú8•+g¿çïߨ4ôóñtøts„¿âAðÿ‘”n2›ƒËSxëÃÁ9øŒY‚íc/ ýÇd™/¿üiûn^2Qü{~©§ÓŸOÖZºÞ¼dÑñ‘ª})oSšÖT8Æ?ðÌç‡JÏÌ%<¾5ÃÃ<ÝÁìUâ¨2þñ’P5ÎÇÎ7G©¶§«1!©ÅD)ÛÏe&àÞ;Ï]Œ‰°Nç|¢|S¡%ìÃÏÓœ,Ä®C…ÇÉI¡èöæTzƒ‰¢LA ÎD¦ª‰.¦”ëvßß΋õXyèOÏžX‚®*å-t'ÍbÃ+‚_L¿aY£q´¿PH_iÖv‡î{»ëÞº,Õ,Óá<'…)¨: .jû·û}o¤¨Åk­ ”ô½=îJA€€!§µVÛ•”!„O‚Vä|—1úœ_R3\Ä\OrÛæ„iº Œ²‰Ja˜Áà_J•é IDAT:®9K—Ÿè2ü—Yð­$qWÎ÷zÂÓ¡‹˜;~{jÈŸþ÷ñÝ-Qúãm0.ðÞ‚GÄwÆtZ]Ó9Ž0p÷eëk]÷}“þ}û÷vö½ÖÂÞiǾ¬2C]ˆN—/®k]¢¨@,¸ßBŒ€µ²Ò‚ï›+D³Œ$ ¹¹†Æ²S½»2€‹kE<³½]žÿ2a¹ÌÍç*LC©…Érb»®*BéÈøöÉ0pÉÏæ€ ÄÔl§ÌdíÏÔ’f.?£ Ò®eke‰‚«RÕ3›ÁHÄx¹qó'[œBy*~AƆ¼PñTÌÇDºŒSÙMÕÚâ"—)' ½K öòë4³&GÚl]>úîw±°iÁt p›JÎIbÉ=Rà‰4Ä”¢:ù·¶ÂñèÕÛñœöqR¯Iǘ‰@„óÂ!@ ˜N>»kŠyYµÎ¦Ë;ª_e…þŽÔ:ñÍ4‰«˜CXÏ¡ÚZG dî(I®¨“I·ßw< RŽÏQÅ›NXŸ4A¤<›ÔG9N±†-ð(Å/Ÿ©\¸ãìßã´¥› 3%Ú§³‘ó\#ߑТš´ ZLqRn’mE¢âƒm²A¬^[AZw’׺b$êžì¡µúZÓQ+Ò<HÓzw·OÎ}8hg=ìqÀÄš» ñ#g¯†Ûø*cRæÝŒIšJà<'°#œ8q~(èŽèp¿|½[É ­CCÈ£ÿ“ 6Ê&· QR~˜@jcßEc1LTfP⎌B ŽT Y[vì+ua>Ò­`qéU o^Î.¶T…d.³z²¹ßù”°«:Œy]t ‡ §3»½|¸e3ô¢W›¨z—W- ñ/î"4Šs•™Œ‚Šæ(* •3úf6åY¤›´3°y¤aÌþÒʬF ¬Š»€¨`V¹Þê_)ʳç¨Ycƒ©ëæ’96\“*+•‘9ÇŒaŽZˆý¤tDBêqÜ>3ͳéƈpž÷úì¢Qg¢1! ¥7àÃË7dèæúÖ®¿Ù:zÈÕ¨ôÌÃ?š5úHUx¯?ÓÝÆìNäSg[äõ¤z$!ª§í»¥±Jg3óª ¯¾­Ç àÀ”ù6GɃ^2<§’Ãb¯#idÃòsŠñiÅåSÃú$Çsø(žC°þZølfø”™l¬ò¢Ž›[ŸÅ¶Ÿ,ù®‡÷#QfTHö±þ!Ô Ÿù?ÿœ09rzß¿&þî=þôa6éÏÿÖ?ç„×/gü;ÕÄnðØÿú÷ÿ÷ɼ"z~9À8 ß]Òð¸(øœ}þ¢’üµ/÷·¿ü…‚÷òÏøù¯ù¶©ûÏjÍ—úk3Éœº¿7î’?ÎUN°Þrèz…оÜnç‡ÿAhÂÑ'®'ñÍOéŒÝŸ½ãÞ¬ñ6,/ídžnò Dš«¼ÊÑ?C#|6 ôƒ-Äe§V75ò!—-·XûÏVêù¡5©¾Ê«v»Ãi®ŽckÎ@Üó‡|ÖϦåªèDîéÈˇ¬^d-](YëUÅeîN¯ËèºÖ«743fל†‘­„úÚ3;ûªƒèu]‘î÷ç¹4Ëܸ‚Òí{ƒtyÔ·¾¦kÚÐYbG4¬Y¢*rÑ|-OŒLM1ЂüJ³ž·uyÃN Ή¼Ü8ð2K b‡jãmâˆEí^YÅ<•/ðZ¸÷éé¹7ŒÜUn|R¶“¢“‰Ã™ —_¶à¢‹V­‘×nÖ©QU„µ«ÏºŽ­o\·á‹]ùùˆ9î­ëkEìe"ÅâQF³ôÚQº]_—Ñ áÜcª-±jmø½÷·ïÿ“ÿÈûÔ8 tš žæø³.sÐÿß(%ñɘ,&H¨7rFHÝ;))Éõ€»ß·¼ÔÒ]-y2.ÞO/)݈¿O®¿¶þºÿÚ¾ã£Xk}ÊÑò8hfF_â_Á„ƒœ/n‘X!¾§–L‚Ë´·Ü7£Ü+¬¼V‘«÷×<®ôœ; ý³äÏe0BP¾÷--ÒÝ—™ÈÂd%™+a¤—œ +`1°8„K24°dE5ƒê²~ ι2 Åní‹Ðºg…ÓðÞDĺž F*«9ÏhöÔ%¦L•@È7\[^Ñ"w_cérsÛÚj XVÚ–*Ö0{f_‹fàŸ ë!Ppó-âv¿oçââºìúÆw-îH6É£á!<ï‘£9Q52É]Kñ¦ am&ß'Ÿ Î`í+Á8Uo?c1pçcTIx‰Úå c¨0‹­C~ð«Sô—-&†¯«â ü—®' Ì|ÉÜ导Z(–‚$ ZKO…„ûÞ¶ÊCápg;vzJÑs—s@fN²DûöX¬‚Â¸Æø?×™e$¯e¶§bÆÁÔîž5H:eqÍ8dÉÊ¢Ã÷Î Ø O¤=úÎ#Ég™Sü¤Åµrâ—©m±J EIùîµ±F«r¸2%Æ Ø„èU; Î3B]9ªë{û¾o2CQ5+ËÞ‡Œ‚äžnD#³ª ´©bz>Ú»œü>zubÚ™J±©à"Y !ä,SrzÆtcųӄ»´€p×—óX Q‰Uw¬>c—î¨qbjšQÙUJ–<̨50¯Æ?•u® ð‚1;xUû宯ºÆÞ òà ×âiϤÎV€|ÙZHE_™Å/ò*àÈçB®HåJóÈÉÚ0±›©©±ç•(jEqÄ1­©¯9aÆDÀÆþÛæ¥]B¢Œ':j„õö¾ïƒ³¤çs|Tþ=ìýc¯ß§]âìˆTd /öõ˜g>{µž#þöµäðºÈWöòÝÍö—{kyWœ§¬)}Ð3ø ]ØóŠá/EÎaîâ«+òÈ5ö’vvœãÀáÈùºÏhvÿè†çÝ£ênt~›ª ^ŸxleÏ 1vVVÁaþ Èöÿï?9ú<-5ó¯t2bt äö¬‚H£A©£$9N®lä#]ç\$9ò/<ѯðÝ3…ñIôÒ#°ð^H9¾[Îíù¿(Žÿ-™û‘úÁ"üOЇþ<@ðoÔÑõ¬%Ðßquÿrà™pùïà“À?çæMŽüRåÿſާ¥šËÇÝú…Oÿ'Åû—É=—^¾Ì >êöÓÜÿ©d˜Ÿ?×Yü6ÙœhœYüb\o:p ^áøjLÎ8†Žþ[rŒš=0™<ò}¿–\~û‘ö¨n¬í#IPûwé°+:LÅçÚâ׼„ÕòïNÚá ú?ôN^!þË aðÅX{$ÂFA?"LÉƃµÐ²G°gLECÍ&¼“7ž3×2KáxDŠÊV†PWòs_ñ][£‚â7š!†)ò(R6ÃÅ@Ý´HâÍ-𬬝ìΫàiÄHÌŒöfúýAB†(%µ3ˆa\d*Ø$‹±h;†“¤»þº·÷ÍìŽG|ì]¢“ ø ='„:?¬ &Ù")Ò÷‡k=´v@·Óäî]•à`þÏgm=„@ÀÄÍe\Ë`4áö[{ïoíi®öŒ“Ø—E¿ƒE)à2/™½üŒÂê?ÊQ8ø=}Zø²j5s 9´w7a`Õc“á>]‰{:M˜6‚Ê \‹7-.ÜÛkÄ w 6(Y¥M{¨9ªÄd ˆ^Àrƒx¸3„YTkF=1V.h#ï^È-¥À³ƒ-Òݯá9Ý™yÙÛýöû2k…Dg-×);HŒr­mÕrÇÀv·þvì¦àZQ*“:Õ–ÇgèQ6›1”$òì¢Fi!0èÚØÞ»qÓŽ˜3<Fža‹xaR°ñq—CZ§MR eÿv¿.{¥~ñx+wZ ëÈÊsf‘ŽM£»2ÇA:¡hüpÝÆo9å;€HråìiM¼[È1vºþäùNöÞÙÛI:u÷ƒ¬¶‰ÛïË®Gº;ÍÇÄRpæ¿®•bè¥EæW™ä|Vêœfv”Þ?·³>|¤ 4·Ÿ¹kY¥£yÆ{¯à½ô[Fý23·ÁeMPå5î>[›KcL+ß0ÓWØì» ‚}Ãõµ7Û™·Q’¯ªÊ#wž¾%n !O\O‚ô?»l%OVIÇÓ‚ÝÅåñÓî‹«€ßz5µÊ¯e&“v)Ÿê©JGUs<Å!ÆI¦q&Í—º +8Œùuû¾·j[• }«RdM¡-Úb«ô)·ˆ½ÅŽ‹*ÑA„Ü™ÝgF”wh»‡—_”oÇAít÷׊¹$6b­6|Ùböí(ñÛZ›:< {ž,Einw¹°xé‘©r+B±~*»Í³"ÄÆXèœy"f™m¦ E¬"ÔHAòÒÑ÷s[{€ñ“Ï©Š5̰]‘kê­|„0@Ùˆ3«`3¥©è>;är4‘±¦Q£î ’Ñc(w¹BÏßî Ý`¨¶cˇy+¸Êó¸q!Ú;ŠÖ/˜oEn±Hæ6ÐêϨ7Ç9‘ƒÕ{£®ªè™_B%y03ð•.uðÐjæŠ~ÜçiΪK"-ph «1 ±\46¾({Áó¦â#aÏ(úx½”J’Óáûr’{ˆOK'Ï @úÈuç«÷σ¾¦|~°çv¡W 3gw8Ûgå1Ê¢ÀÜh”4Aë‘€øQÂÓa<` O'e Ȇþdêêñ1‡YÚä¥GŸ€Ï感Ô]ygð6ÿ¾ZÞíùúm YØoUÀï·öû\ò5Ið> ùÃ$»CUúH&"C ¯º}|9|Ôü–¯ÙTà9)ÏŸùòCdS^Ù>§U˜à;Ïg ej»ÝÀ™¿ÈÃ6*Znbºd)AB4{^4­ðÝ7ð€}15•×ÖtÎÒ5d?ú›>„Næô6Թƻâè 8ŒÑnÈÔ 0ž¹ïí¾¼ƒÞÛ=\û?.ùQg'ði¦L@çú»9pÇ%Oí­]Îûp Õ àì"â²¶Uÿ6r÷=Ñ&6ãu]ÈšD†Ý–{¨Úâ±:înî×Z³:OнN«^Fs·%'õmKÛדÚçýWîVGÆ×ˆÊÍŸý ³b­^>½îIÚ€ ¾4|žº=©#¾§m±é¬oíɨsĵ,Ê G}rº]<àÙ1ú­½eL»f&Nz“+ß2Sªo˃ú‚h\Å|=mUÅ|þtާ%¢þ€ëëËH~e%°¶w0cNGOr@oñ!™]Ùš¶-ÈÉ•þO—à´hkãa‡aƒðí~¡VÍv|)ú*ð×¾¿Ö²s)y õZY~ ×Ëó„¼Èï:~sE¯"Ïfà’ÉÛ¼k´ö˜\–¾R9 çÊKÒݳüZ¦(ĵ¨ey»+*ÊퟯÀ·o"«5{)¼å‹¶Ö}ßq‚X”SðÝ_cpB ÊS=ñuÄ>Ãt9™eôBg6IIƧE‹³~ȦÍJ!h£O.»Ìþ’<ðZ¬NTÄ0Lf½ á$«Þq}W´Ä$ê5ðîpˆ¥:+9>¾L¾+Äcråè•¶‰ê„:æ„îí¾7¼ «ñéüåúŸ,RdØS®3hr—ÍŽfy«rÒé­µÖÅ(ëðØÑð(Ê2\íã,îüù§8Áǵýî;¿¦]uÀoÊë4qtÉÚ$´ÛºŒ`¹MU’_~Ek… ÏbO )yúÝõ ,)—臢÷h@GÆÀ+î³|ñ\)ÝS{ë:Ž—Í(•›Í)¤ÝI:x®¤yÔóPö1¨ùuNi˜þPçõbýä«Ès`r£bðÜb<5ô@÷“«§wŸïÂ߆=|÷N~'é¸çQçÏ È‡“•(_ÍaùÙÍ+¼›ùsS„þyÅøsƒŸf=QÀ߇*¿yÿµûOš[ÿî Ð/goéˆÿÎþ·žàO*^–dýèºü½wÈ¿ž æL ¿éçyÀÏcˆ'è§+±4jNtáÉÖRMéÏ>¼_ü¦Ž>žÄH^¿®Êzxv>Z¸8Vþ+÷¿4ý—ÄÄc6R>¨ƒÍ'5»È÷¤õi4E±ç^‹?æ!ŽÍàœ…Û¢=ÊÃg¼;-'K†xƒ5)9k–P¢ãrüû˜.øN蔫ö€ÁV|tW¨ç“™áÁè ¡Œ0ØZKªj¿z&ZýÂo¥MîLî?üÁuŒÕÄZ‹¤;#ÚÜt~K5¬é1±5’Çdþ¨±›WvvÚfD€fa–šüœñw cÔCÙ2»÷Ý_•Yä ³íŽäΧQWØñ •º¦á N·çi_!ÑÙ™èé_)å ïìÙAÅã…pi•Gî¤C²«7°@#n6B”3Ô¢ 3¤ ˜NÉ“ô¢¨©ìMcTGË1Nˆ3T÷JÖ™. ½v±sO5G#5av,¬ÿ-«"³B5NußJAø /’¯I©ÜOîªÙõ-Ñõµ&4ÜW-§Oø ‡º§A‘Iü'<‰© _Xù¶Î!¿}P9æ2V-d‡T°Ö\в4¤.êfç ÒíÛÝoãÈSàk-hkëvm±¿.Ôö;ÆO¬F§‘®^LJq©÷;Ï) ûy¸…F$d¿üâÜ£~~;®/cÄÅ•eÓÛ£þ_€|±?ë©KÍ"kʱ÷N·ù€±R[{íøê’Ľñl¼u'µ˜ò*«Ì+H¯†© Z—wyߺéÌ“C•]yí&M6»sûô!³ ^É+C5Õç¥Ê¬ v¶•)`b€Eøí¾‚„àNZÌ‚‚—¼q«‰Ýâ2l¥㻵÷üR/–Ý VÞÐó<ÆÇhÁÝïû»Ú+S%sß{ƒv™QzžŽx<)«¹Û‡rÅê_4[ú–øZàŽÊ `»VáƒÊ_Zi×Q)RÿL\fW ÏÒRWîùü>ßñH]W*ÄÕ¿lÕlQMEެS Õ„žš5)/Ù¶àÍVÚ«cr·‚¿e‘û‘S~ÅóJ†;Þo¶Ï °+êg ʼå,ÃdU(êYt;½²\I‰¶XBs™¬'~ùb%xþƒœ/åt£¾¦Ø‡Å|«¹ÀlÑ8äìòÕ{vËGhê\«Vö„Xý‡\c£æœæ$ ‹WªscêY …Ä ">uˆ¼F¬j  x8–Ù!ÿ°gˆª[oø˜X”í?½6 =Má@$eÿw¯´ÑE½£ ÷¡vªx5 3¼P80FVÉۜ=p;Zµ ²6¶2ZØ6æ¢dÒƒºg'Tîeœ§éKIx\ݲ€Ý;Ì®‘72~o7K4VÔÐô¯x·¥neGàÔ²ûÃÅ'‹ôZËb'ß„­üˆ3 â:.ÀcLÛ–‘P÷CÑ$cï`‚ŸµëŒ8½ÐcbTCc0гBà ÃSs±hÏ‘ìºÖQœêüà+r ðëµ·Å]ÔuAÔKyeÕ)w63Z”ç±(+ª…•_˜ñ¾s3˜-+¹÷O& ö>öòÓΕÇl„ «ŠéãfжX2ÏÆò\D¡s ¨¥e­/zÔ€zøÎÈ‚€tÑ{F 5æ¾|Tñjœ?mŸÔ>=¦ºBpHRÅÁåè´œ¢–X•3>FÞŽ†:¤iÿ¥9¸3äMIÐ0Yê]£&~=„xŒšß£™éCàERž#ˆ—ÉŸ(¾êYmýñXY_ucØ/$¹ø]¯*âGw<>1§> ÷úøoþ%Y£ûÕVÚ/Ç_¯éQ3ýZÕæŸH˜ÿ>ïÿŸD ~ûbÞ©Pø—ýK3€ÿJÿÿÑÀ¬øéoê¾Oée¹úã‰ÝkùôGDϧKOv§ÁùÁ«¸zBvâë䯒s˜0ÍãœÏë·o <ÿà+4Ì ¯/Le¾™ xþ‚áÁÏ6µGðø9ç¥öÎëΰŠÍAèÌ6ø¾”‚mSÓ‘îëétõì?xíàÍ2€_DZ·=v6òvœ~ºh£Ž®B 3ÐpÆø:ˆ!éú°âú=‘Ƶ‚~3=õÙm÷»NkÙ²E³d¤Æ­Ác9LS>I#f‘OÝey8P„Ž_±þ$ß{_kÿêXƒ::_C€ekïï"¡×,Ppk"í佡•±û‚CÓœ3 àÇëîÛ°†Ã÷?ê½w±Y2M¼š^^6ZσéØß…•–õh}޵³ ËV:Á¢1'ží#ò“¦ÙÐóêPÁVú§ø 1–_p\Õ±hf‚õGuÚHC^9ž>5@éð, …£¥déžµ>oU2À„WÍÝg’¥[E-]\6ît×N9H¬„pl‹¿·óðÆ%D?¤ü°©:fìeU4ަMœJßPøÌ€PíåéPGáÒ .˜“°µ´]´c÷}#`lÿ2—}mÀ 'nùr~ûNAœÛ•#ï×Ãôn‚ Z¶¸·Zåñ a;»GõñR-z 2l6˰“äžÖ|î½Q±“jŠœ7õ”}=o3»¤ï˜:’·66 ¶N=¯œäÞ€x”ŒøZ9ìÐ#H+»P`•RY¨»R çäîÚ-f»¶°H‚{‹tbù´S,r\¤Ë·ö·c‘kYß~+Íà mû–GåL6ßæº²¬%.Ü₲ÒÎÄXbUèE¸9VÌ~Á¥A©Ú þöj¨¸£ézKaþ×6·ÿ÷¯¿uß{ï]Ymé«ËÈSGCéÈãŸôÛ³Œù­Ä3¤Ø„Óß·ka‘vïÝE- ±Æ5†ÈE;dÆœ /s÷ÅóÛ£G0ßQ´3›ôà]¦[¹³üÂ-±CÀ2s9Æ+C™9Xf´E:²¸ÃXžôƧékÙúº†"âÛÝ7}ë{™‚!Aª½DL!ŒæÒ޾̢ËZÛÕUä÷‚ƒä·z˜Î0”È!@Ë0Kg¦©8Jû$´¢}ºF€‘¨0X•TLó½‚ IDAT³}˜É@o'ª „¬3vð¶Ð·Ä§õªïYHÞppˆÚ”±ÀµÝõt-¼Øy™ÆóNœÖsV¯cE U-¹n¶÷^|áºÄ¾.!oÁÖ.ÕâŸ!Üó|84ó¼–ÓZfV,']ÛoÈdÙoÍE»Œ4ï­Ë=V\Ér^­ÑítlAÝSækVÙûaM#7]²µ"?©DÀu^!¯%º;ä{󌇪za‹Wùà»dâ à>MœãRÞJÀ2’ø¾Ã·BrŸŒÝ»±ŠX„œ[’ô}o6¨2ÃŽY`þs¬×>ŽÄw–Ÿ#øm¤Ou¹EÎ=ß9‹žÈ‘¿#¯S¥M À)SÖcå –áX~’yªŠ¸×:{ ô(ï@Ek ¬¨îŠIwÌžò3eó!½#ºÆöÜV¸ ªcj]:ìz.Ź=ˆp›\¢]”, ÌÜ#Á÷âÔÊ´5Úb¨µp±¶Ö¾—NZajø°6;è„XâgeïRqaÏv™g;ÍŒq×ËÂàîèz> y¶>3Î Ìëap~A⨽Ú9nÈA}Áðôæî+ ù“§ ™`q>ÌLGÿZ½ ÖŸý£{7×"Þ£Ðû—%Žso&øóÕ÷:è# à¤!OÙ)mýya©ÿ}ü´_>žæú)<¾…¯ž?Í*F¢a|sç¹vFï8Ûi¾þÌÇ­®O)§%Ö'þ÷¡‘J%§ÂøöÆu~ÚÙmõóüÉrZ±Ï)f:ÔV‰"$–¢lÔË×sò|Ã[Pcðb™d[¯ÄÿÖ×Ä¥Gæ³  [·+|¶¤íïv‡*$ÃÚ4ÕW{@OªHòÞ·“ñ Ð ]Iu°òä®T!Wš¬+và-F”kk­¯µ¾¿ÓgñÞÛŒÆ@¸;×ê/¾Ô€¤v·†B€¶Â•Y³Y»Ø‚×i;TÑÆY´Ë~”Hx`‘Ï-{²õÓ-ó¸ñ²a—\7`¾xYkÓ"{®-#¾« JÂ"ã< wo #YÆÙpºNóXÄɱhÞhíx† í³”u8T†¬M¨ÓK8â©3¡¡G/Äí¦ˆÈtç=¹UR$_0’Q&P¨ìÀJ[Ò-\Û \Ä·ŒHbœD.¬¼€-¸%¨ºÌ>Þ˜ +A Ý”xdFåÇŸÍqåËcháx«Å<6²|ÙÆå¸Ý¥;.9,˜‡+‹ææ¾9KGýÿcïͶIr¤M`ž5óþ/ûWº2XFÒ#¢z™SyútgG2ÜI£-ª‘O< 4·hzkÅû¶ÖÛ}˜•ªÃOÛŽíDÈ¥yÉW²;Ì}:&uj—)<Žk)^3‰œ/ÿê}û××,Mæ22p).U!=(p…b”wû#è.ªD Š3°ï–D,b&kWB´âð>[.4ýbÏÕ€R¢p7c5~!.GM¢¦YŸ@⃙٥ö=·b-5ŠKñ3 ¡¦ÏRdžü7»%¤¥³ÚJ»þQÖô2Eœ+íÏíM®ì>7EWQ«jÅfÆäJî)Âä&_¼?²jç–£-6y ^'SÓ¤¦‰šÁTÜ ‹O‰E»™»iøR©€ªŠxôP(.NÂÄÝk[±ŠF¤³MÁŠž%Ôžr*X¸(ú¨À­Ôýžq8b³VúÒîŠü[%*Ä‘ËQ ¯{1ZFEAOk¼Ó»¡Éá°^-æ÷ÆBDEµ‰õhh®<Ɔܜ堡ÊS’R6XV:e’E\†+Pª²©º½'Þ“?‡ €|Â)(8õWSk+A5gçáX(T¹ÿŽlt©¹Ü˜² zT+ÌBW²† ¨9(úþju˜wLÖ:¦»Ð‡ßhÏD«FŒ'»P¡ ®¬Ï'qãMœî‘óøß¹Ûµw@_ƒ™–éÑÊa0^•Ù†öcÖç¶å}´ÛÍwDœ[ãÙØ=ÑPÑË¥Ö7&N¼8ÏŸóúÜ;FËu#?§¿'}W4ÑvU·,þÒyè·×¿G0lªãª¶žYË“ pb|ò~xäó#}n8,¡m Þt&ÈcŒ²òxÑwØSßw®uʳšâØX—δÛ ÿ"Ïþݫˈ çøfù‰ø’@y/Sæï­ìësÿXMœ?þHÆÌðÿn¯ûf ÁŒÐ?ã€øCfååçý{ ðß÷m$ˆýâD}SÉ·}€¿›ºá·oçIüŠ,öëy>|îðú«Ò)+°eü˜6ÿm€û2ú>*i ÝÕùÕø›"ßG Ç–°Ûã^¾ë#ÑM:½‰Ò}E‹;¤½ö{{òS‡œvßs¿”ϳ¥ek;ÛÛ+û7ÊLä×mx4ø©iG_Oë{Â!D>¿…ýþ§ªL†t: º{N’{Ø_ŸÐÈõi9}p9òiA5µ"Ir"8 졪Lè\Ë9¿¤Ü|{jal€ªªêIˆ³)$7(ð¬½dןv‡ãYk6<ˆºRPÊh5…¾™gE’:Nµ—Cwþ]F„Tü„VׯºÕñ¤ðȬÊqºœ—ï½…~íu>G‘îwW} phXy[”Q©$6º,(h;œ”B!Ÿ;3YÆÅ‹?(‘Ô8vµp{5¦ Cè|àQs€QnÊlF,ʺ|U°—!º+÷tþîy6Œ¦ ý ½%iG£|×"0ùòä †¯¦P8µ:áü®{Ê_Ì* jä]Mõ(­wÞžLäï÷˜ª›¬Á¤<–&"S—¡\ê*Z@žiiéX\r]¡’¬LD¦ËD«N›ª pޤBBµ”­áVOUɆÞK!£²!õ-¢W°p§¸´7å;A«Dëdª±K¢ ¸™õZ¼:O£äǹŽË–ÌúRl;Ðܸª©§ @OnêÀ§sy24Eü~V¢ÜµI…'zqMš…äŽhLLaU…H¶(Çè¹h‹ÝâðØŸpÿ—óK?*–ÝËÒ¥¶û¿éS yìÀÁƒ³‘ÓKó“LTœ-4“ŽòlN_rЛNüD+c¹ÿ_ú™eïaþlIGŸjnÇ=öRÛÎüŒ|Üðý`ª=µ·³ä¨6ø`=ýzåH*8çÏgö¤S>Iæ'ðAñíüÞõüÜI{ª‹1k×Þÿécéè‡}b8 #õ.t¾–#ÌŒí—J>þ$œ€ß¿Íÿ.‰ÿ½±”øWC?SðDÓüGkþýÏ]*ägûaÄ·+ú'ÒÿpŠ$Ÿ˜6¿B }ìÜøIòÁ³øÑ+»bÊœW’þ"~Éêy ìKàôçâ§dÀ¶ÍË£sµûMðÑ©û¨¶áQüßGÓ,ˆ8:øö¢¢ÿÖ!üd²Õ~8ú|tü΀á1Ÿ9Œ¼^œï<"›¬·%¢õ&Ù­ãÖyùú_PKØO6B–²ÿ˜ÙŸ™ÊE¼/S®cÿœÝåjùI×bê>íÃB¯nS£L·ì┼Ba”‰¯½…CzZâÜQXžh£Yþø|E9°:ŠQÛn h é);¨ï–„¤6xÄ/xøí®ªž¨cŽM'x‰ºwxŽLuøÒÚxU9þ¸ª¿dÊÛh£S½8íì4VðZ±oÌ C¼È}늂V©Á±`à¨ç§åL$ í„¶ã/Ÿ0é2édÑÞY°mà´¶_cÇ\³l^šI(Vöï ‚³ŒÆ¤¤gEY›Ë£µö@6yùüý‚Gfvn^熗}¡",ÊÎõ× $_–û²26~5Ï®àMNÌ¿®¨H¨e“A—¨µ»?óÅ[NÆ* שHyÊתSA¦£î!)ýXï•R’|<@*Ì0-Ð*ª®V©h¹ÅEL=¨úPÜhÕe¥Üä…ç­C³Gµ´ŠÔTDÌÔ——jnBW^Í:tésN·\.~ ^XðÏ`x-³’×2Íã’I~„}«ê_šÅ†Éƒ(Lã z3œÇÐ˲!* A¿ŽJÝ% Ý yÙ±h·! ÍF5¬²ÓO ËÏîU²ýyœS/Ñ0F¤2 žþÚ<£½sâ^à H8¹æg 1(í°àsï^<…U-6´šE@€A ºò”»‡Î~¿A Uûº4WÅ}÷>ì j_ÖVm*ÕûZKÆX`³W6‹åúë¯ÿûÿú‡Bï ß~ß÷?Ý› Q›ó|‹•³ïDë‰5åQ©ž‘5¾&[ÍóŒÈIˆ•* JSNa‹ö¬f!ÝÔØä#B²@>«ž­8ï·ûtCp»ËßÿŒ¸.0Ó-N{^T^­¯ˆ–Çö×±w×J*%±_+§"+,„q¡ÆéÌ£ÖòÏñlt£BžTʳSï _¬zv2‚j5d0< â\1ü<‘M¿.‹ð‘3²Ûè¨ í3Èõ`DX3R*åÐ w*ÄŒÐÃÎÇîk?—+±ÑÌ܇¿ûBmö-aƒÄñV|`Í=>y@—¦w`ásVªïsô/ÌÖ Å1»y…ì ®9í0tÖ sš#´Í2+®xn@ƒw¦gòƒ©ˆ/ú¹†£Ëše?— Å#Ec€ ÜŸgÌÒX;j6ö )ü·^» ù\/7LÞáñôD¼Æf½* Òþ«£ìå» –J<M"\)FVËp”e’ù®³Öz¬«_çô)‹:â$C8s²N.ê‘iº–ZSþåÄ¢ƒÂœÈ6 áÍI/Ÿ4Üî<;ötÝ—ÑåâÎüR=3d=GšùE¸÷ã̤fãÊð‡wVÆÍÓ©æ…$è‰h·Wf[“‡V²†Zíχ¢?D™ì$CˆP%¢dLfâÕ• ÈŽì¾úlçmíº÷g>à6{;õw=åù©üøÊ0vô‡òì½è°ø?9~,ÆóàŽÙ#ð¢=~D¶6þR´çÉä¼ ”ÿ«þö3þ—Îä-‰ñv2ñqâíˆ<ÿêÿ‡‡¿ËÈoJ?T³ü8TøÅ°ù¥Üéó[~œ7½œSÕü‡óH pt·Ù4?ìKîìdÏ‘4ø*Áõ(ã 6†'û<º=ÅܳÎOmœùzKü'ȆlÔÆÌ ¬ô“žà£`a f¾³Cøï©“ÝÜÌÌ—Ž®øªà“÷l®¤Æ®!“÷âÞR¶ßÿðPÎL½›& Æ "&„ÙßÀ1ã—ÍQR7Ù lúÒ¦Ûz8T䎠“ú4­kâÚÏ&®—GY‹âi¯•éí·f;Xr<*ž%oJcb?¤†´êß®‰Ù@3úPªÌ÷@µÒë… ¨o»-‹¡¦Ù°×äZU R‚LR"–õ°4»C0Ù&‘ë¿öX¥öó h`uoËîmöY3C¶h•æò9-ðc$,~²Ü^tmîÚ åu¡<^å6e.®UÿWÆMï^G[Ý cvÏùD«øý§Q­¿ 4ÖÆ¼>V:©#$7ĸª Æb‡N÷÷墲@½‘VÚ}ÛÕ¹ °Ì2Å€* :ð@BR¢ÚÎ@Ï!†*Ü›,™²ÉŸ¢«ãÆÝ+Ôçê*UâmŒ’1Õ|d¾i…¨h ÎE”J‹K|ݳ¿&³vÙ±»­Ï•9ÔjCýeˆÎæÌ Y' °Ù¶äù&W­qɤ Á »GÔáŒãªåœÄC®éƒ”î?íãa¨Ü 1SU˜ÙûK¡Zjÿwin½)Dœò% Õ1w¯rŒOëd4W‰]Ê™_BØ%ˆ´¨ÚA¶\ºèmî¿9\‘£•¯ê%7û\?Å›dv|’‚ËÓ‚¹Ñù›zwp:Φ¦0OC«2f=O¾TÑŒyÈ{¢™Ü³;Ê8W–Q½ìaØÛ â¦ö¥jwü-vdb.ÞË^÷þÔLâw'´ Ž «ë§!:–_vP(!w ì]áÀ¢/´Ö™ó-¦² ˜i3 êæSO®ÙÍöÙœ­ljG ~ôVxLo»ùª*ƒ’u0dO·V|´Ä©’“@=óQ±$~1螪wá.êD ¯ËLQ5 E€w$+‰_¨ß–M¤ Ú*U›AaÔc¦ro3›ÏQãž²c¾M8h™f QGˆÈw¸PÉ0hkXâá¸ÝïâcÔ÷¬'‚R6ŒÃÝTUí<º±$÷•’­¶6‡§ø!èdüª›±» ¸jR‰‘…8OíËÿfÂ3iƒ˜¨)¾€¿qˆ ‡A½‚»-iC›ò1Šët«"g‚ÒªNä$yF.i¼yw:kÿ;f‰NløNŒˆ$5*W@u?]‚Þú[žäá ­oÓÅ -PÑú¼fú»b©S¼zYý`8»šê¡ÍÆ\žY$VK©àçÖÑ˵ …†ì ` ‡¤U9 Jëcu3.râPìÕ«:£ÕáŘ®{orÂZDÝ|©Š$íÒˆ˜CO–œ¿7 ÑS†“Å@ 1%ö€á˜„Í"&ˆ„xVê!Qw.øñ¦ç¤,9©‰Ó£d§³#ªR«/E…Aïïð¾È@ ón;3°½™‚´åžÞN°¥xÅôT‘¡4!E«»hEý a1 ÅÔë³ô`L«.U€ X=#}…K= ©È|yò[òþU¬Kí™p¢2[¿lâbPÌkCœšµ ¬ìrN”µÚY;’ÉȽšÇzI÷{Ï&|ÂéueDM¨5Yîjé2¯cÏàñšUº­rUSìÜð˜Û£N®ÖÞ„ð‚¯.äµîz#ú˜ƒŒX/*áò9· YS‹ší:^ä5w¶ÿ#Uœ’µjÔŠUtdÝñ±¢öhП¦ºØ„gFܼçÓÝñ˜u‚«.x›©ð”¢”ï:1¦k/3¼ \¯EÎkšÙ‘ùž?ÍÍ6^ô­gt`|l»õ÷IXzZï?©ëSûýÙÚ«ÓäeÆóœ½dïÂ[~~À9>= ˆg žžháæÑ 0>…¢QòåÁ±öÀÇiGç*«g]L5!¬¿ža¬ÌœÎ×q½º 0ž-zˆ¨g&öÞzý, â<ºn¶¬l~î¸9þÍ2Û&ü:K{\ußw±Dƒ)µ_jª°Ht9-‚EU~)Ü}O(pjC¥…—ê•é몣¸®ËÌ#êWðY¼ñüS’¯ÍV“£ø$>%º‘Üq× Zª<îfÖ Œ\£¼Šì{à|[ëãå„V†±§SÒ›a­22(^'eþ Õô•¡¥’hòYëœÂ38©S¥A›¸òT‰E Ê±V!Ud *Fkm8jŒth­ú˜æ9©Ç@*"¸TXª_]ñ–š•CÜÏJ蜶}–E)ÇuJdº.g•™¡¨Uç[ºÅ¥+‘û*h ?Ô¡ÓCÐÜ}©)tXS•ôÙ¨yÐ%‘Öå¥ú÷¬³{/#÷wîhIÞAe7ùu•Ÿª~©}óv…©èˆ˜IÙúHñýÀÊ»ö—ÙÙˆqp69Œ‰C+p¹ƒÒè¡jFa©V0‚~éÄõˆ©š E.SƒÂ˜À•î¶M8€^jv)TM-K/ƒ¡B]Ï‘`òŽ„Ù“À—†Dk©þ‡Àµ/‰ïOåŠâ*Y´=4ð¼Ë+=Õým—L}n6(!ÔÛ½tØ<½³žÿ‹BÏ<Äz2t„‹Ü|5`¾GÜW–»¦”jÚH“ukQ¬Ígd…s}imGÉÒ7Å핈ÌBˆ˜]³ÃN±¢Ý‡I‡Fmzª0¿?F$—!d5ÀOg7ÂéB^__ŠßYÞ£fwwñÔ#òr{ëYvרë;C@œ;*Œõ9ç¶Ü\ÛG'f%z=$ò•"8yØ¥¥ã„0;¦7U¶‰9*Ή_ž™W GDÜ ]©5VòÉå;?*CÌÌ.)½4¥ª€ZúÎ}G¿.S(Ýïp¡\—Ùuˆ`ÜwÞ\¿=ÂýR›âË™jŸ?oEyÀ ê@• Ó‚»•D»ý“ä}GÓ‹Æa*wÞ¢º©§79ÈïïïûþîÐîWó›¼_AaáÌÍuÙEjFU]<%Ù3Äc&^D.ž´t(d› ‚r] ÿNMÅQ%p_´c5n#kûý¢Gû‘)Œ^—S@ ¡zLw‚†Òx¨ü÷(™ª=)Íx˜É ÄïLfKµU怘6v+vÞ÷ÃÉ5Típy,aƒGÙQ`ö.¢ð̨ú׳êóªšRŸ5 IDATLèp Ä)3kjÙëáDAMxT|‰ò .“Þ,Ÿ,8"L[„YÝÃóc‚ ªiã0˜H–ȼx•Ô³„öÅ_)DMô~*o!̬,µZÌV˜8úÔÙ:Ô˜¿¦Ðß·8Jâku.‡?"Áâ{£¾ùÊ$åã´âÕbžD‘b¿ó!e‘â9·¸Î  Îͺ͡›âHL™1ëŽ ïp›ydå« ”“\xW+¸g=Sþ/‡‘S{Nÿ0´rµâ9ŠÒ¤îRVóBª’ Q;þœ,âÚ!¦hø=òþ{ CsjʲräwT]9µg§PHë³dê—Í¢"€±÷7 ¨DkgCªÀsÒETŒS\<ï—p©Ž:†–­¿ßT!£§ /(s³™VN‘iï„àö¤¶·bõç¢æ?[ͤvÂéðƒpºCö_:_"­®Ç…¼]÷²rBóòšÙU]•¤!埙+ å_#¦L¶ä aµ¦Þ9ü“En iV\¼©Ÿ4žˆóˆW~ûX;z'«0‹æ3¯Ç£TdZiä˜ëk ½ôˆ®o¸nÝ:±žMNx%ý/ÿæü_>mΚðßKrOâ(RCy³ÏJ÷9œ,ÚGýìQ+Ì?Q‚ùìù­Ëâ YñsÁ3øº¿V¾ñîF'diGç›|êÈ=hájÊ~Y{Êk¤œFíg/écÁúœ!üÔ”ºÛï ÿ­ñK¯770ø=å¤ÜOür<øïþëÿÿ±ÜÇ›sŸø|¼O‚h‡øôó-F·[þo:zÛ%Ÿ<ûòC@÷ýª(ÁLFŽ~oþ\½+òñ¥Ï§Ê«äÿãÑCšˆ<êuŸO¾1v"ÖÆííæÖ"ÃIß»Êj¨Š¶•\åTW<¢öB}§øw£8åñzécZ›½ ·ŸŸv\üû³J’Õª xˆðÝÙ¸ÂN“âËY{¼Xi¤ŸÔyœtõeõ“"¸fÝ}>L¸eé&)^g¶q÷ý® €%2á<9¦OH¹aÜ÷íßÓs$XÙ[“®WªhõÑI)ízR¨ª¶ÍŒ3(Œ‘jNq„¢C?z_]‘À#ÁÓŠ0œ}uáŒþ¡€'ë\N/ä˸òlG@Œˆ*Ëå™ ­•…M…ß»^8¥:‡[ië0%›:¸ˆ¹¤-ƒ¬%BbÈI¨aC¶Õ5ÜN/Sí%*.ü~WÂÆwwiS4Ÿª¹Ä%Ñ¡a#Å0’îIâö©ìS€—„ĸb’v`²Ü/d+¿â~Þ²‹|¥xž‹$H$6‡ª m르I•Zćü`Úñ×Áü¬Ò·ñ÷tå=o+UUšŒ~î%vëζB$Ü} 4wâ.]ÈÌ‚jnH `D ÞWÿE;eÍr ܈|Ü"ENì@u`F"¥…”«‡[¡&ÎÛ"‡"|>\¨˜ˆ œÓÒŠi®Œb[îäõJ~Þ œâ¹+.R¿ªª™~µcw4¹v€.š¶ÂÉ«˜´±Q‡”"ô˜ˆÉE@U„§ B"¾E® V—ÏJDP<{ë8Ø]pÍî †{´¨«)ˆ.½¤³5Iq×О®„´45Fetpå­^Ó.—³õù›ñ8Åïï®Sf75¢ Á Þ9ùqë<{žWƒX^eÑ(>ƒ c’åÄÃoø`¥ŒÒ„=´6æÐbõ­ˆ TáÅÝõC`c‘Î0 ˜u×"ˆŠÜiñÖÄä¨8Ž÷µ³¯#Ör`Hh$õ«0Òµ¦(Ï!)TL¯ñ¨(zä‡hGÉô”ŽzÎî°mE¬ÖÑš.$²¤ç2ÂçÒÈ õ¦iƒˆèÊ(9&¾,¹©0’•a˜µÛ1UÕ´ùÿ–¢Ú'B2å-‘V2ȹ*.ɬò†s§Œª&ÎX€#¡ *AXE4±ÜaìIwæT-Û Û…/,3Bw1+Cö£½¡Î«ü8DNwoµz«—"eûòóžäÊè-4yéƒ3êje’èfÜIñÖ õÔ\åŠ(©’P’D˜@@Ï]FuKÕÙcoíó8°öÝm³OäN¦2Ti’¤}ͧlχx„x#iºÄ—aªý€ÊÑBz=G±˜áܘxÞ–í”MûXl0·_-ßN0™sŽ-øøyÚ×WÛÍ"Ò×øšp×m¯²ݪ<üxÏ»/^Ë+öÞ™çj¢çŽ@°Sö‡R¿ZˆÛŠÎçô¦ÿ•»]÷5‘qú£Â­ž“ƒqÿl¢Â]‚÷ð.¯‚HŒ‡žï¶Çpæ£Vû¹‡âƒÎ¸žéâqéLµ™<{ ßýåO}çñ¢8²q|/_*a o6öTÙ±û?´èbßïøI÷_MÊÎã‘âÙLP5-{ð4cŽøsìy¶²²7hÓé’ “LõÂÜÕ°N-ùLÿ,ÕÏmñyŒñ³‘]¬þ#þÿ¢â‹ÞÜOgÿ¿K>£Fþä'ã¿"ðïþ8 ò±å÷_˜ü6jðÓÿësðg Яß\?^$ûÕ,?ôq|¾I®N¯¶§ÿ“÷ÿ%Œð«/ÏÂ~xo›ñ×(ùgWDþê×߸6¼„~¨ùðWß(@=ŽËKp§i¹kSõy¨Yz2Tðó˜²Ôã~Š)VJ@?&o€ ‘—C·ù}36x fŽKµ')P<–<û‘çxçHö:-¾XØÅr£Ú¿#þÖ•éÄÜ:³âLŠYÜ‹Y ¡™)€ð”ÕÆ¾ÖŠ)šˆÓEº8Ê’dVæ¢ 7ªf¦ßßmÕHR¶ˆxDš4a†›p7 [Eî&™™¬) ¶)M½3Ë0MÆÄ–iÒ”߬NH2U¨n6h­ë„1ˈP©uq´`§« ¶Ú¹ÇKýÒnéÅâz¥;ªÿ(êß׈ 6pØþùnûš÷<íxUý£Aô¡nŸ¡TI–öÂ3R¾ ðÐà­C~œ”$˜,‹)œ•æR±ýqyÒ8“TòvÓ*'vœÙ)ºTP$(ßáåSS‰ׂR­’ÊÌùdž¢ ¼._¬&1YÇÚ4ú¥?%ã^‰jé P¹¿[—Pšœ²á©~[8íš–Ø®#„ˆÈ¥ª—BqeæÀÂÎB÷&Ð^å¾™ðq©xû /‘|·²GS÷vj’MäæY5±`ÖJ)ãƒÖd.d¸ .𥥇«©VÃU*>Ù½YÊ\ðÒ`ïçõ_fyf°Â/ƒåÞ¬óú\!x4<å–8–™%gZ¹8§V†,-˜ ?Ç0g¿]_…\ª!p¹!¶÷y12´=±­H7øÙG‰™Yù}{VÍ&ÐA„]ɺ¥7¾ôÈæx^ŸU˜8öu7èJæo@¾Lˆ»ÍW¬­i[ŸÇÖ&á5+ Æ aPG£®iBˆ ™K«¨VnR}@ö^gà—"’¸ñ 'î ÂKéé2PDÆŽdqj§5¯Lò41Wõ©"ªÉN;(¨¸T÷;ŸNQ±ëR­BLuZ7½ +5ÈÁǘ©]×e ™~QB¾þñƒÿûI]ƒîAh,´oê9½9g¤›X°›7Yø U;–´àÖ 8Æm)a,A¼7W‘kë^~Ùœ t™*÷G¡‡›^uÛÐp¿ï»È Aˆ„YTÔ("²SB0s$Õĺ$k´ÓÀ£ZÍÇGôÚãé&ù/Î9«~XÛåLåà0 ðˆË¬Ë|k© Ð?ŸŠ7®É6¦å>_™¿©$"%©IÏ 8x«÷z8”8Ž{-.Ù/†µAC"j픘 ZÆàVñŽVÎÇÒ^¸²pÉÐ:\5íåè©ÌåS·Ú_UodJ™7 ‘Zh3Û”¨Ò\ˆÜAÓãl'y©¡u`¦¸ŒÁ;î!¿¢¢µ¾èÐ’ Çð çY§F{üÍ:&ÓÕÂM@*ÆÅ‡Ê‡g•°ÞM_4½R>`—] ‰êœ§Nû`˜×úúæMXëïƒÐ/DpDtINûÅëä=„ý@+o˜Q.r31¢X_ϧ ¹?GzD2&ÉXõ¶½NêÎH¨—OÇëÔ¢:“yâÆ4¡öÃ}UèeÐZ1]AL3gÑpòIr7,oÕìöøÎ{úÓÖ7U‰È‡±3üöÚae;v{áGÍËÔ5½­Ž—\žÏàj!g¹r®L((šÆ^Kû‡“!—3éÂÞÿÎÍkÄ‘˜ O9^ÌÍ‹ «ð„¯½µXé^ù3Çx±ÌO>uZgŽù%¢-kLTÝU›…ò£ó+Xš/êÿèêçÏã uÓñ‚ÜíÆC˜þÚ¨˜ÐY®—¼tüaJ¢·ª± k§QæUÂiœ¥lŒô6–ÏÐ/êŸêòìcêè㙳ØóÛeÇüÉ\+‚{ŽôZù.ïô$ëgr4KAY]>€ßŸk—ßNõïäþ—Dóþ÷ü.àC0äwšá[Û1O×Àž<$HÔîL.ÿßéºåê¿ü§;þUøå6ñv˜!ÿþçâ\xñXþj„óK‡>~d”üVKþ1ò©ò÷Ç¢î×qù‹ùž¯?¾ÍŽ@ú*yWäg©t¸:Q;›Æuf÷+«ï.ªÖX‘! ¹dÊ|ɲYZ©ÜΦ¶úEÓPÄÉ’«ä¨ª‰U•Ä«I¡¾PÒlù&EâVÍiFUC;yqÂÓ }‚}HÞ;9ší²Š«ov–ý¦ÀÕVúÄ\R5¿œÚùpêl‰õýËí.Éf'iÌÊö€’ÑC\Ÿ:HJ5ì³%lmôè ƒÖO¸Ó\Õœ%?=f´úŽ÷´€^‡ê/ëz?'wpyóÉÃï ‚;{8J«Ž‹.¡q)3?äKM áM¹‘xž@ì˜kˆÄí*â©å­åÛ#âþÛ´Ïç¶Ô)Õß×¬í½ ,ÁtÔŽãw®è]öußâ¸Cªë!!9…¡ÓÝÝ’ª&V¹j¦¨Æ†úHßž¹î<¼œG0&C£…šÂJxÅÔ`âTj ‘i È¥€+)šxŸlU©4 ö ‘ÈF…ûÿ¸GPíJÀ¼'׀ĠЈ0³ 8ÄÒ8›­‰3|%‰8„ÚI óIÁøû;ýÜÝrZ‰l"7‚Û‹ÎŒš!ÔÐH=½ÉŽv8æ”"ç%ÎìKž#  —SPñê ˜¡(cXµy4Žé êZè¾W宋’4) äñÿï¹ä åʅöÑŠ¬*在Yº•“æ‘ô&‰JNè®»‡áôÔ¡´î›øº.#ÿùÏ¿owYI^˜²K宯™^{«²z$_¬v¬ËÄ#Âùu™šŠžó;g]„Ì( {}æÆ‘>Ý,È„Êd @¢Ú5F^r÷þŸÆíž'xD|ßZuá‡NjQã0{íÄ«¡Ñÿ)-½È™½»õµ Ç6^߸&t}·x¡kK×èFÃWD>Á‰°Šã^£ù²š«?K{åÀ;q‹vóýpö¼rúÉÉ; ÿà‡¼ô$¬ïøùA~èÒæŸÈ¯û¹Àÿ «ûÿŒÄÎ?ù6ñÓ˜âß!€ÿÁ³ÿªÕŸoW4~ýÿÄßÄhöC¿zoºÿC…_*¿¼ü òå1£É£%ñáeÄ ¢ÿö.R¿>Þ_ «ˆx<+|~8ÒøÝ½ç±iâi/¨£ÖüRÆ»û´ò>9²Ÿ¿µÚ&¸Kzg²=ùß3óÆge¿·-ú)kô„ÚùÃäõw ý´¾^)Lj.°Š5bñIQÁ8$WÛ‰6?R2‹?ÞÙ' ÐÕ±åIý€Cilá7ˆ°ñÎIÌS@« F5ª}7šT‚-¿wš¾„àè¨}ËýªÂ#Áøë4”‘‰à³kÐDãÀ—ŽN*¢WÐæµ?fb Á]6É"/·E!Ƈ <ŸüÐÂt¢Ë*÷Ä~cw§·! F-噓ºpf»ÍžJ`ôa9Äñ‚w޾]³ó•aÖ­ó<¬¤b»çQÃBŽ´®\ó8št ¤’ë&½Â;åºÝÿ­·AžUgD³SlmBñ÷UZ^’ m¢+ÃÏW¯ ºGµ‡¶Ï':Õ=Õãç·š± );µHN díÓ@±„®§p›!v®¹4öÞI{© †gääÿL¨ô¾¿†-Y‘±o=½¾´÷<ú‰‘bHH|K|…©âR4ßfVÊ•Ñ>GœÑÆR«á zhHÆØ«í[e §âA‰oBv!Ü¿ýûo†Ça‘ü&Íó ã]5‡)˜7 YØ~øª­È½¹GY€L¡j_—AäFD]ɹqVZþï”ØBhµ¯ÝxÒ]8W<Ï*JXƒ¼Ò[œVYm Aq»R÷(_š~Éã<ß…XËIˆ@LŒPÆ-‚+Ç CàS ©ÏË(K¤xÕƒ·‡jžìƒüR¹™å«d« š'AOð·b¾‰Þ2Á ²NâM”`µJ1VÑê\Êh‰r$úJDÌÕ»¬!õ«Œ[…x8µÝçÞ>ù@ë<9,, Xrà9‘Ž$–±Ö õ`­xÆmÒù)yÀXëÖãK‘;…l͚ǨŠ×BìÂÌ´Êž!郖O\`@Uªo¸`àFÂû¾I\jI?¿ÿζä,½ïO„/¢I%`ô“Ý«4‰’Zõ+zÁÐÎH½éÄbòa=~Ç6œÕTÇŠ\_ž6OãpŸ°·ØÑ•Uåþ ÞÈyƒ¨ç ÇÉqÿ¤|{œJÃ=¯?KUjÓñ,×tó÷2Ø×j¬–e^Poš§Jò§£ÔB†¢yq¦ÈGX®' êtTÈ@Ú³{”¼åÇj±å©ùìß§ýåg¼Æ|zŸeXÚ8p÷ÊiÈzæI­¯NÅB ×~b6{Ôwoª-ºTv(¦Ï•ü)^•9<]O*tó½žô†lƒÀÑž„7ÓÎ.jš Ù,+N{~ 8 E‰œŠª%<Ñ+­µlv%˜…G¯ÆŠ™ï¡¤™G=ã ´Ó‘S¨êq¤/ŽN‘³ˆ0S¤^Pzx³#¹Öy”iÆTEÚ–LÔ„á+rv‡L$µ†ˆÒ}éÑf⨠ƒÊÏ~óx=jš'`Ž—ëÙqâ4ÐÕå%ØnÝÓ#¼”¯Éq.‰šñb.pJ?Ù…Ïfª#)&d‘…wDNš:°0Æ%‰æöI. •™2ΞÕ5S¢,^ÎÁgÕçÌúœÉu«Ô H1XHhTX¹²¦œÔÞ Óµ.65]‘5¨’ccý±®+9ºñù×H§Cdé'à[6€9wmä9‡›°‘à™+®NÚú‘“hèÙA«úsô0¿£¸Ù‡ƒsÙwR|°Ÿà´”(ÁW¤À1=O¬*ñõ%®àЫ©?ï?È ?´¡¢Â«¦yÕá¾pù¡woö<×Çe1¨†õNßêÜÐ.?vÅB,§Ð±—ÍÞïå·óXâ…ÏÁI›&5pâ,§š`B@{|R\{¿øæÌ}-Õ}ÎðAQ~t¿«Ù}ÖqàNÝÂßbáñ.£ï:œVw¼V Ï^•BxН×Ïò%MˆÏ‚ÿ'é/Ö/|¥ßÇüIIå/ŽÕ'ÕjüqÿzŒà?éýþf¿óƒÿ§ÆÄ„ÿ÷?ÿ]çÂûë?œôøI~§îàŒ>yóùªŸ&¼ÿOõ½ü0Q]ÓÔµ¿Ýºü ìî)ί£A¾æÖK§'ìí ¾ìÌø2É8M¯cÅQ¿ßzMNY.×o8æéµîÎDÁåÎÆ×M}tU&?*dPBy5K§jY:^°ûÉï; 4˜^z™Ê›Õ9Pm–}SqÕr/’Øi¯'¡î·täÛL €Gtƒ04…¡·1Ø·5³¸o.î§@>fŽêÙÄbúõ6Øôºþ²ŠÅ´¦ ‘ð¬ í§J•F0XL0© !N"‚ÁЗ¦³hž~u¥FÐ4-‹ÌŽ„ºgöDi\ê²DO¦S»âM*B±®DÇ8bµ]ÊŒìc)O cjNœÝÚ˜êVÃé¯çp¨BÄkø#ä¾=›qÂ`N5E"µô¡õ8i˵x[æÔük &Ó†¯3ŠN÷CöQž:=b˜[;»·¢6?œ ÛŸµÖ†â—.óâ›Jû„vÏÞi È%xØ„ú€8sŒÅVØ ÿW P{ΰ*E>ˆèìshð¢Wcù‘Hßò[ìžY¾õì'Ä|=ÈÏ^úbx¯è‚-FM„†#=ª ·3ÿqàñÔ@~-,ŸÓwTü,ÅâÁƒ:“•Õ‰€w÷ýgPуÛOüþé"øÍÏù,+ãÙ¡Ay.eöù:!:ÿåmºðbìýC•úO^¶¯i~¨=øoVñ#ü2Tñ¯êÄ:ø÷$à4¤ÁŸª»ñ/ÿ´ß þˆþ?:~~Àc9óUrî`ø4_~¦ O$Ûû0ëÜ€÷>g^=íŸþëYL÷Ù€–ÄÉœ»q)ãk« üxÔº½ ³~Ô©¯÷4{?fÏ>Ÿ†¨Td¹ï%Ub¦‚ Ðá¹-×󰟽Ÿ|ù{À²½¾Z0#˧KÍ9WÚÚÓ-ºç«¨~/¼ ÓòøAÄ !ðc  ¼U»{â¸Ðº÷¢¥B¿hÛi•Ùiw¬v¾ÑC ±^Lx·=¡¤ßeÏxZÔ?!BQ qf ucÔ`PMv³ qGZPƒa´|ã=TeŒë²C95¢òµTOCEeòúéd^ ?‚‡É 9ˆA´êCñ Ë-" ‹¼!d•¸ ëÿ@AAÄzB¾²ìR«®%EUÕ|Z?ÁºÈÅSy¨õøž.Å@Ö:R %7uìÍ{Ƶòm;ç6z~bW ˆ€Û½Orôg¨N¬…ùü¼Süû?Z›<õ¨GFÅvš½ÐË3U]–¼M1Îk©2Ž.§„2øxeÕ4u`4òZ±?âH¡ :QÓﮞ¢§“±U>‘â®înÂè±N弩æ»D¶:Ù¬’‰Å(Ÿ‡€.÷ꎬ¶—§ èœxAx –+.’A±/¹óÀÇÉm £°ÞÒ2i®¯‡ÈÙð£å$Îâ‚Õȧîº8[­™.D_ŒóysH"V¼ÒÕµAã"ªWµ½Èóm>åªÚW¤°Ùü%äÐ"Ž×9sWås?‰ŽâççÅ¡³ÏÁjl} -Gz}r«ó®Æ@ë^«}¿þÈF¸8¦œkíĪ!¤fMÔ%v‰h¢¦(kŸ—C¥Že§«ªè`–½r,ð(¯ÌxÐ8Ct7‚t¯ÇaÞN!sq´øªP§ÞÕÿLz½>¦wAjM<ù g²3³®-š®8#J)–ÇÆqõ™¯ée?BtIºTH;˜jÂÃC—ù¨²t\§ÇZ«ÿßo®^Æ9ÿf³<íµcšä'…é5¼H‚ÏVåR>±þDšäJj¿}¢|Ä‘ÌÔÉÕþcáýï¾Dð³Gúÿ†ó_Lq^Qíç|ÿ÷(à¿ ðR{ñ/\h/‹2 ð»^ß390Kx}ùþE?Eöàø‘Àzéˆy¿qvÛ×Oà­í`F¾?“ëŸÕ¹?·²o‡oàü³Ê'åQ‹ór€‘W6^«€äø ¯{0S×&ó¬Ï…cÀÝr¦eöêpüó¢å\ýé ¡‚º³ Œçé9GÄçºãnS!ç²$í¬–X” É%xû„<"É+F ^žfNÏw~ü(QÚj»æ)—©ªöêfZ€ËL„¦ˆûô ¦¶Ø9θÚÔâDz'6’rY'¤uûœùäÏúî‡'rKfsg‚È}ýN&'$9q»«õ `Jâ•ËïdrO0Ì,¼"ÜE¿‰-‚/|å8.›¿TŽáÞÜ@$¡(,z!/š+?ÄŒiØ*i¨kÖI §(UTUÜ“Y¼Û¯!*QuÇŠšÆ0[¥wÜ ÊõyPÀHZÑ^9‘Ï*ÚæI„PK¥(£8…3Ë®fÉvР3î¤?EæÛÕ %|%&| ªá˺Ýpúˆ»eQã²¼™À$$gc³ÿ@†i’m“çi~XË.µrtQÏ|$G K“@å‹Hºˆic% ¹oÕV"} ';ZÇ”*›–f =ÑPµ+o‰•72Ìܤd+ÔT=¹¶Py–Ô4,v©Á¿ ~ÜVµ,Êy³óˆ+ÉpÔ.-â6²Ô³v¾º©÷÷ßßþí.ä_ª¾ ¡u`EäÔåäYƒÆìÕªÖò®Ew|‹«V!;?ÔL5]ø,SuâcL¿È;²{S„q . ¿+Û’:WÖr µ†N£yg†òÙ“ ãäÈ´ÉÕ*¾Ÿ—«×e1 á%ÌIŽ @ÃÂh·1u…ë/0K½¢Ñ4’7+‘øëëØ'€gÇèUØb÷Ꞩ¼×*;cµ˜än_Ý#ÂWX uÛˆŒ%<Ãdù[ 4E @¹…¡ûöüìNÂétÂ(Ôƒ|zJL%(ôÈ>Ž<©)`Àþ2Î[R_$/»™–é(Ù ¢‚œÙ H<çSä W„•ZŽ nÍzL¶"UbAÞ÷}Ï#ƒ£Þî©•U?h^fMaÑ¿š½#¤(4{°L•=Q°àçÚ‚‡Æ($µ{;û.Vm†Yú\nÿ)†Àã®`ŠêÄU²Eªª ÜÌ»¼n:ñqóþƒFÖ¯˜*‚a%f׿äp IGyaÏCD˜uŠGAã³ëŒf'(UÂù:ŒNùjHõèm1 âV ÏÁu«ËÿøÇ?.Õ.+B/[‹¤Ãmæhõw`Ê]\ßBâÑ>1Ñ€Õˆsí/ÿÝvµËùxìÒ¢é"uÜC2 î³¥xv8³þ WÁMªæÑ??¥Í“.äcUb*‰'õǪü¢*¥#×ÞŸœº JùAò01-•΃AqºnUEsÁµ´£ŠÅ«dTî· ®Ï]6¸ªle5%€žM$ä©®÷B¼ˆg iòL.¥ÂL¾Àç“"ìõaä¥[ó "ôÉԀϪãŽrf£+šÉV¨I1hÜåÂξZv9ïëNSE‡¾:-aåÎÛÿ!ˆÕª([Ç^]Z@¦*:ìu]…ìVÀsÂH+;~Í+cÖý\M°qú2Y¬³uèOTû”¼¡±Öuy¿V*òIÀ†ÿ+.,ï4 Оñ@YA.IäˆhÀ»{G˜ ªiGüñØÃv)Éyß8wîvt¯û TÈ@Ø@‚Nkbw…†j§äÈ|Í4™ñBÆû* ÌÚ,‘GÚï³ç^É—ïŸzR?›´-ÝÁ3•2á}qb=s5ºéÝ|òéðÒ‚#?6ÿîÄÀ‹¯`ÌOT{ÊçÝâ 'ÄŸyà[ôÃÏ`ñm¿Ç#buvà+M¾Ù®c<ïñ‰›?É /´”?Bÿ+yþŽãþŸï þõOÀû|æq0þ=øß™ÑüÙ÷þäËAþŒ57àOcžC„·?Á/Ãã¦ñxcÏéÛkw žåÃüp3\~–p'oe³?¼•'ÓŸ[Ç~ÔêôȾxžž³„~Rè»ÿý KÁøTËÜ)Yæ>gC5ÏÛ=”gâz~ž+ȸûø&èËVçUÎ2^_´þ)•Góº3Sø¢±—°¢Ï É{òcöÚ`i¾IruqÕ\Ÿå…LÍïýtFù.Ì×* =Ât93Ú§Hq þ»™‰¸ÁLõðIÛ£Faúñ³EXj¹¤m+œ0ßS‘f Ù 4/m Ë¾JUs÷Q£,ÙǤÞ ¶¹Ð3³4½`–e-Í÷j ³ŒOP D“ÊŒ†ÿô¡ÀŽ_Cðe×·Ü®]ôé~ÿÞÊÎÔüÖž?—_#F—19(0u2‚z™N \ÚUëåš¿.¡HÎ ò†ák?ñ÷íí—ç‘<޼ûù-‡Oc'˜©PÔJ¨–;¯«›ŒˆHÜ·¨^w0G5_¦__kDõ²)Í[à°E¡0 ¥G|ÏîÊ݃!Yª*ˆ2Ï3Þ+0UêùòÏõl7)Hg7ÙiÐ@\Ð[#ù죊æ=0r…Î;c" N;z²2а°e"fÁƒJ×)r—ì>E‹ ž–_øj÷áÌJƒZûn;Ez¢ËS½ 9ŸŽÙ×°ñ±Ba–š $Œu;×jqÆnÅ©GlG⺓h±`ΠÇê¨.Ó(éÓð™¿k×Pj3î¤+½”áu0³ë²™A£—CÂŒLE*kÍ2Æê VÖAÆ+z,óå ƒLrÊqðÿÜM}<÷³(É¢ž»ÜÔåÝMZê–ŽÀ†ˆßÔ+­î¬Zƒ%ìÏ6$ŠË?3ÉþßÓQÐô– S\†Ò)2Ð4`Ÿ†½Uº³í¹4UˆÆúu2%ª¦Z©–à;pšyj•…Â;ª÷µ7ƒëGÊøÂÙ¢»¼’L0?eÀè Í#Üt1Œ,4~Þƒbi~ÜÜ;Àz7*ôŽ'«hŒ|°^urPûR¢©ƒ9›MJ–rô¬Wñý‰ÖnYX{]'œ,jùtráÒ+^?œ”è'Ìšö\ ¨:šÉ‰¡Y2’ƒ`ZÜqÂuGMQÝÿ0\k5Þ›wœÔÎ ºÁšéfèŒÊÀ—æ„Ì z5ÐæÍH#Bý7¨Áb•ýç”Úç5DÕØ CY ©Ì S!b9øÀP³rš$*º}€<|¡*W±È)píÃÝóAŸ(H<´…½³­Ô-»N¤æ²Ý$E,jØ$<Ú6áæFƒI?Ñgìâ×½×hrSd°½ÍüY9ŸW¡¥ŠåHMÓ×£höAjŸ[yôæ¹ ¿%0C¿!“"¯ô².ß×$AÆ›^]û£z'që€åù.žËN„ðUð[ýG×Þž]œ¾`Kͳ‘;xÀMr­Qâª>ùklƒ|æë3~@~®ƒÜ «?RZ™yÓ­ÙϽæ¥Öéǘtß®¼Y@l|6Âc½zÌ–Xó‚ý÷â9G3ðkù?ž¾µ¬_ñÌUõ†ì84Ïüè4'þÐvúkïÿþ.Óûï~έ÷û7é?êýãÙÀogò~ZPþ=øðW=6—éÛy?ýœ ùÅŸü¡ôÿ˜¼ŒL×Cfì ä‡TÙËü´â¹|ynâûÙ.û½{~@êOôh6(Ÿy>/j2qªk³ìŠ z~ËË_ísÇŠàõ¸+F X¯ïüi>ˆ¡3ø.ÑuŸ;ppÞ`:caið|ñ[Eå ¬~Qøžë‡—û£Õ`ášÛ×Í=¢è50úå%ÇŠ,ŸÀÎ{ÐzW9ïG¢äõš…{hÊѪ©0濬ZˆWSS33ûþþN(«Gh`×F!)ÿÁÝr=?êáÍ“A£‡ô°å;]°¦+9sÐY7ãåZî¶­1Ç`औmÚ{P³é+‚‘"ÁL)xbø\ žO5ï¬k6F¦SÑ\ÁKÈsˆ4Ìs¹4+{Fð†l™ÌÏæ,I*NïtËL N Ø uíëùYY%Y4'ÊŒ³EgË>}ÇJ¯ý¥7ç·ø}3"<™Ø.zL ¦j»=¸nûn1dqÍÔŸ—ÍçAâ³ Ì*ÖThÈÓÀ˜)lÌÕTTö1NÕp+y;ª¤‡¨Fvƾ1ª-Ô³# uóöH[£(JÉNDÈi>Íë›gÜÜ©ªãê£mW^à}åœ"OË/Å})_éÑ«3,×óeöódÜSÌä ‡õò.ްÐåËâŽ[Å,glë:`eHªž¾ºq„à‚Ù%ü.«ãë3’*zm¤m7 3ñ»ŠÙ_rƒW%æë±™gøýíiÏá“H„Î[x¨ ˆ·fg]"‚ù‚µæ…ª¦ÖÆ;S2Ë›öÝÉ"¨‰‚÷±rB·ŽÇH½4¿(FNT»dá ò›R\QòDj67 7j¬hÈÄQÈQ$%cdªÕК±“Ku,Ørgö¦ö××u»ëTž´‰¯º3¥Šq³ F&"í±.q$”ááÊЩî¦-9å*™¡uNmÇiBhfÔôR "¾ïPüýí÷ý}à r©A8A\,´ÄÀýãºìK…HÒ]Ü÷÷÷íÕiœ%|±ËÞÌu·!)ÞàíÇjõµ&δU®ÖR£ŽÒB@¤£àÿaï]—c9’$MUó{fßÿMWfwxfº?ìâ™ ’USµsiR¤[N‘8@"3ÂÃ]MõSõ›7)>9TsÑŒFµ¹éõ0ãíaÃŽ¡_W~¨:á§¶gf5>‡ïåÓìk]ê7þ÷_¿bËÚ•rëç)Ò4m­³™È•l­ FHíé|ï>¼CWúnçÑcÚ#m™<'[¸|Ù˜Ÿmƒšóð´ÎrÏh¹ÈQ¼ø ’BQdd£š~ŽIo® ³ûq»pß G¸nŸÁ-‘¼ÌŽB®s•é»r¶—•°¯û©ú±Xç3g¶±‡Íê/9°¹ì‡GTF.záYÌ=Øúöô¬PYõp Ðg£§‰[&_öÜPímq-Œ¡ÄSÔ;hƒT&Õ°>Ñ$nc@„”l¬3ü±oÎÜ&…ìÌäŠ/„éݼ{§H~{;µc%úWÂ)8'p´„•ý8|¶k››ëx¥Ó¬kEU*Îz¿¯¶Ïnª~—œR‚«Þýn´µé¢W(eÐIì{þ<êRÊgåaš Q=ËB¨Ñu&'²^½-ƲÖgWגϵT:5 ¨?€&Æd÷_ÛBB°žVµQÿ´í† ‹È-ȰMûwîÝLUté°ª¼j@[DshÕCží'ùФÒèÜ:¤YªÖX>E“²Vóª*€ïa§±|X ¢œ¤vÒîG… ޾Üþ3{ÂaÏ ˜Õ/aÝÈ}¨œcöë½­Èyù0]3<âG™T5ŒH‡&ÐT2Ž-~ˆÏÒö¿´³NË_ž±ÕÙœ§ ï¦mNõ¦ü´dm“Å òxŽ‚óÚai±Çð­ƒ ÕÿQé]¨ÂF[µ?©/ˆú{ÿèmäYÔ¨A¬çpkc[ŸR rXGº…oêÁÃϯWbðœ3ä½F}±×±³]€k€Ýù¢ñó?ˆ`üYöÕSÌ*­Ïîq"þ¨Ñ¾ÈeúAÎ;Œžúîóþè£Zs×άÂãŒüœqÄ3òRÌdÆw3þÉÁ~y?_~Ä;dÿ©góÓTà|?¿9ÿSþá_lÿzWð?$ø†x‰^àïÆ€ñ@øË¼kßxMѼÌøóøó”Š~n0Öø­_ dà3E=j`?_W: vàTqéuŽ{hÇ|]¤_8<™Œ{ÞHþ³Ï›BÇ~åüÑuh\ó}¶LŸ*ùK À9ôգDZL&· ˜ƒ §êp-sS€ê×ö^¾‹ŽVÁ×ß’Ï×jïG7À£¸´ÑLÍöÝßäå]¬SÝž ?åt¹„U†¾ú²Ç8ho姃JSçËsD££´© Û>…We—™Ù¤j{fINæJkšM\ýàçοȡ·•?iNÔCÉ,Ô€5<ßD+½›fY+ÛMi)ëçuuxÕÛt$eÏázÌÚŸ©¤úŒG~Je˳ ¿o_8N(;\}FtªÞ`¥ÜÛȃm|Ì 1 ®3î;n±ØÖæx¹›%òL €eæîBЮe6ã<§&Õú"QM}ŠÐÕÛb´ï>ÕTšoU­z4k{ÉvcîÂךòKf ­_𰤽6¶k/OîfÕ„aÛ¢.Ù^*]!š„‹$/£·Àm¸xwdQ–1œ•{ßj‚‘\bW}TÜP\&0¤šÂä¨ÁÀøö¸M¿Yž{;mÙN“iá7`¶Œ0 ¸…;LÀ6/Y¯JóÊ=²IQ^—0Ý¡ É»×´dÜ"dج0<šJðÛÿ»³­”y­Ð8•¤¯[¨ýLfz"5©WkÛrÝܹ4@ üŠÀ´˜ØØjFK*&m¡SóÂ1}æ0\àï ViÆì ̦ 9e¼öüIÃR¼°Ì–ẻ÷¡?ã,cè"-R}É’MTõ“u¦›5ïÙz¤k2P,<<œ¹Å„Ì¥+U zUÞ97ÈAƒ\ Éï;ÁO7ܬNŸÌ\Ťµ‚¸Ç¼%í·‹U j1ôñ«( ¡äÒÌ:™w'Ì0Þ^ãʾÙÅ•µþns9¹ÿþë÷†Ý÷=¡.___!DÄ7ZÙêgd„û‹;î‰cúP–K®ÑÜ¡ÙX-Åm;K)‡cfˆH”s¡©•×XVgoí¿ b9yEȺ–Ç|7,…H*uÏ2Âö%õ]PŒlAî:ö£%†¥"\ÛîÊêRòk] ÇŽƒE"+‹6"£¹ ívϱ\ÂöÇû+u&%oÐEF¦®0ëÔöÅö4…µV/n6wc²kéSö˜²W…È Â"‹:•œÀ˜¢€ãm﹜>Œ¯dšU%‹\Í•J© 2™a@ªˆ’`‡hãËn+ÆÑª-_¹§O˜kõÓÐêþ-buä ú64g‹DBaÓõõek%¸<ïÿxp >ßÎåZd²&é¡^ÄÕ =öëyåÔ±ÿ-@[gY¬SM7BÏo`Þ#9ÆX Ãì*Hœ‹ãÆ+|ÐãìÃcD‘kèÀ Ý}•°iãrQÉÓóSxr õ&†-rbÅ çŽ[Ùõ-h=e·âcð] w*Ò‹·nNE˜æ‘W½+ åÕ7UΔ‘ðºµëgU IDAT’ËòÆ×•=õsvb9²V[aœ3h®ˆŒÊT§i° TRÒ’œ‚ž…¨¨<>Å8ÜYÀL3å|yJ ¹F„ Ï(CŸdËŽÌ;²] ì”Jgòå¡5LÂÙÍ0íAK>ÚWûxò“7-®´æÍÑlL;ígšeMCÅPXMn«Ï:µ™V÷¨€[¼Ÿž,Lã­NQ—µÎq{³…8ÊJoà,(ËßšG“v[x{ÊØQo±á'¡ÂÊÿÇ Ž˜`C¨öéê%é4}· ÙœxÆ.ñlE<92ƒgØ5\Eef¢7®¥Ç#U¥-«IWú… «"¯Sà"®Ã£h|PØùI…ÑA“P ŽÒÝžµ”ýþŒ)ŒQñEïágC·z·½… ¾0™^ʃÐÉ£Z]±»kø¡µ–/¦üêjI£ šÐYjû˜Pâ#©ÿ¬qÀ³Iùq(ÐW:õ‡ÊíÿiÿwâmXðìxJû|ûWg·ó[‰(ŸÞ¿.>Ÿ¾>}Ml­îñöI=ׯf=‡éÿ3­îP­¿üwÿsú“«ê¯%.þþçŸðýRýGnŸƒ’Åç ôA·×Ÿß„ï­º‚CGîËüLèÌoð(Ö³3Ex){yi»áç7Cúãd?,!ÏyÀ”½~ÿ=Ý}±úV]ÝK\ïùÖó²?ž…|Ä´UÍðŸ»l‡Rûuîa‰µ 96¸¨*à‡ôÿ2ç ÁszQ {|=¬žcV±¦-”Tûè®PŽ m¯xšÅWL΂x|ÚÂ'ÐéíB”\óŸ_;ë÷®mo”QÖáØÐRÍ7£¥u¥%u {É¼Û ¢îÛe†³¿Yçk¶¹»ßwºXJÿ]r?g0R±¦ùm—ø¥ýLê·eu^s–ý€&ËÛ ÀljµÑ¨óê†1ùÀ¾·´Ãnw~ß×uM¾À‰²NsÁ9F´ãõ±I'5ÌSåO¸z3^·âᙳ.qšèšš鎴׭Ynv-½åÙiM7ÔŽDp^·QAÊ`.DB¥‹®ß5pES²Tk!Ëd½í¯ên×eÆ*5ve3ÒìXV[[ò޽pÝ}hS½&(qjx¡²²·Å:šÏgÈÕùo&º¦e”-ÝA F­¼Ã¬[:­Ûzš(dÆ`úa£8^†k] D䇪Õ%zçÖ.£ U¨w…Yºå.a¸‚àÊÁæ××åò»±mvfÑrpå“Y…ÊÃæC|G¤Só’±®#t×ûÉ'’–¿B1ÊñíZYâ­ÈwwÑd‘]x]p©8‡Cš<&] ljÐ}KrŠÑ»ü”«E «'WvÆj÷¦,³K ‹òÝmÙ­ù^]˜l*¶‹4ÛÂkZ°ÆÚcÇ(Èó5U¸GíG#Éu™¹¤øåˆU€;þ\PŠˆp­/b™D!®#M³¸%UŒb§œ‚D“ÓCÊ®aÁïªÐ‘êVךîèÆxh-ËYãµò¦$´ÖJù&;&ªVÒ̼ƛÃ9× ÀU E9R3òUË`^uŠi-™Eܼoÿõ}GÄo_—¦'¾Öfº{~.ÏÏUÒ¯ïûwhYI¡Öå*øí7îÛÙä¯Êä[L²RK¼C¼Vš>µÉ8œÑPª„Ã…C]i¨ï¢ä(eJ«m·†Œ#!<*­pN"IQ—Q`ªÑC‰Ë§a^‚q:ä|^.G¹{ºí V£ñÌ%„\.éæZ×£ÚŽIØ"d2§­F;¢X}ÎsȬg ¼QV‡Ç¸šh›]¤§WFc-œzWÔâ…þ_ÓR'r ž(#$Ýb@¸%+/ĘV÷«o7 ÝW®Õ…ù—åŬ’Ô#'ÔïÓnÐÄ: Ž[|W>tZQ<ç•\ÕÉ ;yµx12Õ'Ù< c9þ‘¡oe¥;¦A·yñÚC~Á¦ dz¸r[ŒU=½˜YßâÁ²Œ‘5>‰þ ¸Kõz_©[²¨-Ö<årˆå ŒmVî² Wé€CI92 ‚×.«¥Â¶Øi^;ßÏ‚r÷Æöž!0$c.¨¡]éºø€9>ãH¬ -2#A˜­hé´Õ¢ªee’¤ [Š“%Èê.ɉO×K½Ú¼ ¹Ÿ)Þøxù¯JÚê½úA€¶—yÀòa-ñZR­O¿ë;²Ÿ¯—å6é?~ÿïÅ˧ð³®ÿumýýÝã /1þÅ¿ñ÷?ÿªñpè§¹÷šÍ?,üøzBxð¦Åÿ*zyq|k-ÿãYÇ 0ÿ¹²ž(û?†¾+ãµ[°7½~3uðBàù8yðDùÌxÀ~˜Øªœ½ÏžáÖô+0O[u†4î äéµIm½\öò[—[‡ööÊs¿Ø€%R—fÃ3À ¦ü÷7°¨µf¿Wã¸[øaÎÕ 9_‚H]ÉpäývÒ¦ÿŒ·{H—YY_¸¹µƒêìaî&-£5îx;<òù"¨¯®sÑ)…$À="4mºÜÏÎÚR®é.hó@ 7¤¼{«§Zñ¨ Xk­eá*5> ûhcæ®"ÊËadwOïü³ÿz7ám§pn’£ë) Ý÷½ÖZ–®îá°;pº"––Éuv±•ýz9EÉF lÕô­b÷„ŽÑEáp%÷3Å™¼ ¬;jS²äb4%tÂ-×r›U{v9R/†ÄêôkŸÓagÑî,›mBDrÒêðâ1]Œêºmç›|•³ßQJ^O\ E}ef7ôœâ¤…_ßÒlêeªÖ|¸K6]SÜ Y<²’3}Qw r&'òäµÔ¥eyÏ$˜v<6–½ žYµ×ŒWc³ªq^yÜ·;Œg\ gõ• +È™-6áTþíö›ˆ‹Ö£Œ¯U Š· ‹ÏŒÌÓ®õÁ;–ÊübKQ‚/£V–©ó8ŸŸ `²‘i4ËÃ0»\¡ÐH9ÀáEŒ1­˜ÇÙ'=ºœyˆrÈWŸdÿCzýºøu’4B±¨ˆ€Œ´¯ßÁ«`UŠÜÇ2MÀV-¶5KZwN(ƒEIBBF´VÞÍÕ­QS4ÉÌþËoÿñu}Ù"Àÿ÷×ï¿Ç÷¯¼CY- Ó§^w¨‡¾,«Aܹ"‚Ó [ŽzNcGxTuÌÙCÆìaÜòÈÝŠPK5ù‰›®ËRJ†áZF³qըܬ¢2 ¾=¦3f*VÓ9MYȾþ}{D°ÜúЇ§óÓÃÂýûþþõ}“üuÃ6…´£‡yf¹ µìâò~ÔÙ²‹f¶„¸²N9µÙíª’;F™IðKï ­)ˆQ¸­PÒ²ÿ{@\Ú­ª%†&&.ïÔ[úê/3;ºAÑ•ŸÉÿ*F=ðcbÌÕ¹œÝ Û‰³ Ìcùûìª,G­äo§ØÅ•ðf÷¨Ag°ÙûyÕ£D¨Ê]Õ3ä”]2…SW]áw@š3VNDGÜq¸³Y˜›†M§ª$\‘½Ç5lÓq°uø¼§óR¡æ;ÕóÇÐÄGÂn«BXXvú¾ï²-.²±•Å󦌸§BXcÆß‘êÙÐÛO•½5«èªËhÃñâJÃxÑ¿F¿ÝM‡eâÌ!˜+Æ ,µ¬…¢àèò€F5X'C¸¯¤VŠégl*¶Ö¶¾Ô 4,«§Ibíþ¦h¯?‡>êô\µÑ¸® ŽÉ帲˜ãðÈhÊÚ®õ‘_³¶§Ìš¡·¡'äé$ƒW§he›g_Ž=ažøì€Ls–Ö¾=œÊ<ÍÚ<óÞHZýªßâGº‚µ¡CÐÊÉY?9IU] Ó0ÑÑÎ$¯Ùyש%?Œ¨õ”³I³NŒjz¯¢&åŽïñÞÖõ¸-]´=g5|Xçœ_ŽÁû¸lÕEÁ}W–J½+#¨ Õ8¡s¶ãIã/aßò"qÞ¹œwD͈Êp¾‹5­Zƒõ¼fùhÓŽ†`9¢z.k·Çw€F¸m ·?7R³ÿY_—͹ 1ŽtVwÅSöò}lŽê Î\mÙ¶£ÃõŒw¨ƒQ¢{jòÛTPw|1N}¸ÚÛ5êˆ8£00^õx=ô艩÷$ÙÞ5¡O~w½ý´Oô~âüF£êR‰F9¦g‡óïgw¿€×šÜÏÃ|B"ö+¶×o£býýø{óCÃðƒ/ô¼øãÈv ío9[ªßþá÷Ooæßc€ÿ¦- ðCd‹Ç˜’ÿ`Çô㛜cEþa°ÞJ}Ÿÿ…?àýõiÉHDxZÆÿàÝÒóaúzÙ½…m?÷›ìg@.M±UþýÄ}«HOªþc¤ÜKÙAË™¹)«Ô9ò=Ú¶lÜÞçK«CîÀÚ²²{Ÿ0ƒ„ Ûì~¾ò6D鬰|'®½ H&ᑲøF-Y§F´ÍÛçidÃò*(p…ÂÚcLø'Ìl­µÌ|¼©òcÕ\‘Ö`.[Ó›ðG2ãßßác¬9eq¾•XG´CöÐ Ûí¦p‡Ò-ubýqÚý×z/®þ·ƒëWq½<Ö1k­öÙ¯«¢J·„"’G´ J˜P~lj­ÚåïQ‡®Ak£PyÈ œ¾vÎ<•õãw·*õÒ&?R‘\k)TÛc+”’’ÎHPú®š[öP÷T›ôúVY¶ê‚×pCv¿_DxVVæl#Üb-Jµ‹UQÙñH»ZúmEƒ‰Y˜Ñ°‰b$%Ä3k+GØ/÷(² FÄ-3×2„tß!ƒE.ª"°ÃèÊ7)ÅéBăâwu šF *ÐD‰l÷«é4 …•š4×.)*kÜ6f´¸ð.¥ » ÕÚTýKlÔnϘNQž–­ KMi©±)ÆÅäjí"ëºH|]öe¶£!…ƒ@XßÎ+Q4»°©Pù+ÏäéåIàG«L=t, ~á ;v:eÔƒI‹j.å¸} ª‚®EÁlf=$ ´owĺý(û%¬óGû5smÖ*§×å‹Y²¬•³1ñ*‹¸ÉsY¨óQêþ]¾\$fÆE‹šqFM=½ÞÅéñG•p&kk]ÿõÿú¯¿}ýFÂÿýþŽˆLÛ"¨ˆÅk-#øZ†ü1F-²ÔgP¤euÚS¸“Ù:b#¨P|)цìÛ,°Œ_fhfË.ãZŒ@„_׺ÖW]i_‚G°uµ`yG/ ÖC‹hpiáåÎðïÆ­*'¦\’ ‹«j^«˜pwMG±ÈüÙy媬á ¢'ÜÕnÆe w¢­<…PDŽÄº<¡žk÷³ŒÌFåÊã/×[«šlåÝš¯9ßU–«àºj>8¼“ag¯¯Xk» :½Åè5grÿ5îÉ»,¤p,Ù€C©x-ùޏÌÀ5;w Î(ÛmŒYA¤,”­ßÐó‘—3bã~=¬óVŽ®3ñcL‹S—­{ä\3ÍÚTU©Ä¢ÕÐ0íí‚Ø=0™=qçä9ÏIõ±Ê½Ekð á[×2[¤ðK’ÂÌlYq³5¨’ñÝ¢ºMYÁ™E Âl†'G>*óæ³1Ú³r €…’„¢“¡]ü¼Œ:Á‡«QÍ6yF]¾bà2êá?+»,"ÌdÖ1êfy„™,ØŒÁ"0y]m6côðrŽÏßÞdÑ®¦xºyMéf4º½?É©[†jÏz‰JØ)˜.“Iì·3OÞ›¥é+­I/–Éý‘œ-›í„÷S¿™ñF¨GhîöÚØã€ÊÄj&u/éµé‰~Æ5¥[ž©qIgeŒé_{ÓÞ›=L©­wY¥$w¯ÄÀ=EWß⋃´Åev_ ,@É0(;Q2æ‰*mñU¯1KckRëïeïÄBgõVi,‹4[¶ ëCMl¶¡† ,+PJ#äcJú$ç.[ Jp~–£•kì ç”Ô(gM÷Ãx¯Ô£ÌÀö^Wù÷Ã(WÛãÕ×;@iuÞ¢†s¬,o]c]7šoG.­j'Ñç„>‘Wq¸ŸÑ°¥X›Ïú¬Cç€KÆ®îFñ­ß—Ár–mÙÚi¸»ÍÙÔ±ŽÊã[jkÓq¶J¶æ‰&γԹçËô^¯†ƒCƒ8¼ -Œó…M|tþHwI?èRú,>Âaì'ô©¥øð´é“U[ÁN)½ú#K­·#>Ò‚ÎÞæž?àñédê«+>Ggã*9½Q»– ¯};e <ÌGÐodõýÖëƒ7Ÿ?I¯zòØ?ê²§ÀuêøF"ú3áv»øôÿ‰lùÙÞÿ9Bðž|µúþô³^•hý¹¡^Ïï³{þPÿ?¦7øO9ÊùS±„ÞÝæÿó¯“ÿøxþZ€r½ë/_ |å}½ vaî)¥GĠ?|xUÚ™çŠy~7½Èôo¡„eäº|?»Ñ§Ï‡ïŽþ]UúòûfÄtþî$7’Ã^~"ßÞëwÌQ…¸™î³ó”‚ÿhÞoN=£>Až¢tÖÁ*XôèÊa¹ƒ4§çøAÇ8zÓÆ5G4³· ¼n8ò]m}‘×”>,[Ë,Ïškåÿ2÷DÏÛD/s°Œ!½P“ç]ªlZÿvEm*;C¤É£À$/Ó˜aÓñØxþÔ~/ÆîV=3ûp{%3»Ù´ã×O–‹‘Ë–l[Wv<¦àh2²Îë´Á\ò5Tp3³:cBËõó+LΊ²wòÙÄ}Ã÷é|TF•γÿZûèPaö¶¡WÍYþ¼$$nlÖçi´}:Ž5 å Ô©Ö8šj>Y1+"¾ïH—«ßi¨õä!•ñ\ŒéÇÊVOn ] ­ð€å6²2.ö$Êg¡q¿ÿòÛSX5á–Üeß S½x9ªS·ã7L¡Wy¥§ý+É<ÊnæÕ)çÆYÕ¹ƒ6ƒ¾Aíý½ê·èŽJz9æ@` ¥øÙ´^ð¹¡$Mib­Ÿ&æÊJ„‰„rIðHY!^n”ãó*ƒýok}%~hh@žå˜½¾ ^™|Q4ØBT­åc6Ý™)¾´V—Fd¬š½ç=ÌáÆ×É—/[îz~X}Z1t-ƒ,)z¨wÛ¸2;J ?AbI.T”ÿ•>ÁB Õþu‘ª}Jaù ìýyµ.çÅ3sÂùOó›v:b¬ÜéžœBvl´b]*$°ö .…ëê@IŸù2;c,öÊFž_ ¥¸ٹݛIkŒçl²0\h¾§¦“©b3&k#ÿÁ·i^šº„ú! W 4ÖãŠ%žœ§“xŸÝU=W¢Ÿ²cCçùÉÌj;þòÜÄF‰&}óé.ŸSøzpª­S¨·¦oºDúÏößÃT¸Í¡§z³™ù§Ï¿g={Ç3Äô*,><úOçè8ä±Díágç æmã?ÿËFñÄqóñÚë«9…×îäwzÿ‰‡Ð)Áó…’½_~ÂilÕ`—8¼¾ª?ü7ÿ‡ÛÊÿÔQÎ?šð¸.þnø7|\ŸZvÿr€òõn¦÷áæqªx>ÞroÃŒ³EVüWôBÿ¡€?L¨ô#riþlˆr†Ãö_ßðŒ!ãóH¿=:Š_ßá©vì,c!ô¯÷)Å1W~a¼)6Çþ9m9K˜‡€žF{¼DìùaTº| ý“ð/ZQÏ-lí Ä«ëÿxHî_ÿ©pNkgžh ¯×ʉI›®rÓ—nÒvûQð ¸õ04´l:r™¾¦E­\ò«Myñæ!ØЙܫé.+• NOQÿÉÌ~[_CM g)†2ydžYs¨<½/³µ,¼&´ÒMuZ»g—­ož¥I]'fy‰ðÂézrÒÉef¼‘Œ– ²Äñ„AáI3ô=Çà\H|‚xð;Žã¢¾A›ÀªuYdš7ì~ B›ÑA|Cÿ»t;K+ ü~ßáâ¾ãë· Írà] W²¦êŸ¡\Îöœ°”o²ÑTmá“­î~¹°€Y´¼•‘t+šQÉl`è&”°‹Ñr«œønE:/Uuƒv‘fë2Þî dÉs(l-yß÷ýµ ËÜ#Ñ Q]¯±ÖÚK‰ÁVÙAG”F”¿zñÝþ¯Y7Ã"ü¶ŠûKU¾Ô» Ái½Rj« v®e6@ K7U“ªv02ªbôFI–¥bqÎûíØ™‹îª ;±—”›#g|¨âÊYXêØ`°Î“+˜*o8p*2‰YËÈè».ÕÉÖEuº’ t)ñLß¿~}ã»o˜ÑŠ´’·6ïÜ~ËýŽlC½®k]¶Öo$×b(¾¿¿©B¡Ï›øz$ൔþYì?>a‚ƒºBÚ¢…ˆï¸³8pÛ}»²ßå"tñÛȾƯµ¾‹4Ÿ+ÙÊò¹³ŒwkŠ©¼­Þtf+‡WˆÒµ¢Æz .ßüÚÌòÄ€(A˜×Ñ1£MQ²µg”ïï}»}YxøC!ë8ß9+Ń,§ÉÍʼ¦Z¾q´ógÉvõ5ÕÁb:Á¶ojÍ[Ã,ÿU®z]ôv@Û¦íŒSöì€ÇUsškQZgrŸÛSQø³ã­‘u×.T†Œœ9öc7,´Pó¢=C=ýéGX¯É¤£ÁŸ^æ1­‘»Ï}š· ‡¿¡¬§ç©Í‚&Ø‚¿`Aé»Y­ äøç¨ß0à{Gâ¥â]Òíc‡N®Í©$tùÇ!´ÚÜ,<Úæ¶aý½zmN<”î—¾Y¾F¦Üáø !lV~v8G Ý ¶Y´¹_óÌœûhžC¢Ø[f-Ï[m7œ50,ðZDû¢â°8 ÛyNvÙ4> ^ÇŸ|À\W›š7ËþCÒIŒüLâø$ßz»âx ò´4­Œ/f]c¼³&>çΡÖ_ü§¯jòà_ùðþè?ÿûç'þ×û >ÏþÚG¦?Oüõd~ü·ú“4_“G‚ó¢+/“8mêäÛíþš,*#W鸟ާ—èÛYœk·øžˆüG1o;~ºnÌžíÁ…/{Øë_€ëñSsêÐ[‰ö©GãÞæ0ïÒ¡4Ÿç»ãuk?IߊÎvb)È•8S•­Š3Y×îB8³…‰ |gDûNî?/Ãý»‹ò|ö&\µì™|›ÿTEÀZ¡i~ãI›Ë-;{ÄÒ,ìªDì@yô¡Îkm$Þ–]@X às„pª`h«¹ cº[Ò-Pl{#SLY\x»í˜Ž›µV x‚‰Ä2»=‘"û³+û¢ÜQ±R gmBî¶HUx¢öðŠ4‡ÖfW•ÿSí!irÄûGÕ‹1«:}êÇmÇ,S“ÝÁ˜]÷‡H/¾ƒ"®X–øî¬_ Å‹Àl¯-Õ‹Ú©>T™È)Y9ŸºA9"Â¥çDTö¾†%ßÎìIDHî~×Z0 „…¾#üŽûŽŠÝŸNp—™í”ëg­ ÅÉ%hfìúºèJ­AÕe´Y;KMÓ;E°52VÙšöʲ®U É B50ŠO–’_„­d¤Ã½/¥Ûµ®´^º1’Á#Ñ`y •G€KWO2í?¨ûœÆ«â?¼åB`=€ x%÷¤|¢ó¡íx×P­IS'6V¾ ²ØV鵨Î++y4‡ ;)ñø€‹íúÇ#x*WÕÝò0‚¶pU{ ®e÷­ë\øú¬â]V^ß+JâNÖ5nxHn¼Ì¸‘·ªqzPîGžÛ.Z”w¯Ûýâ÷ððž÷÷·;Sj^Æd=‡‡„œT0£;–IrÉ=hòÄ1¤õ—kµ.ÙÔ•çB— c8{,]ã¶Ëä¥x„Âg(ö)€‹f—!êŸ6tÓ*MÁµ.[öÛ2‘îñûï¿§døu]¶r¨PŒŸ»öµ{ÅÃ![ƈE.«|ÙrÕA}h¯……åó—Ù•F_1Ô?"£r ÞaÝ.¶òážÏЈH+¢»'k-Ü>¶Ð #`Õó˜%ÀÌyýþié5Ú:³óµ ÙPe¾÷ÕÝ”Á³\ĺ0YÊ0“hZ@„¬ÂEu#ôÀ3m9ó‚â.“~ª®Cró(fV̧ ˜Œ,‚-"³MÐ9™ÉwÄ}ßCææÖ;Fç­°]%xÄ-šÑo…Ëñe+õv92›2îxøIuPHz—Åä@Tø¬!ÚQÆlˆðˆ»,嫵40’Ç•#e™-Âm2…hÙ¢<6Þ½½êŠ&pºku`¸Êµ@)zÈ6T .çÍV¦z \½<ÊFwÞÏö>%£¹!/Q³ wI÷0þF÷|E ÊN`ýl2>b,ÊHˆòQºÂd Êù7*‘†ýz‘|¶:2ŒÑ¢ô¾{ÕLó.àÄ= r_ºgóǽé,"wqÆë/`“×û ù ²c»¢ê°½7œM]WÙe¶ÊËc=eËÇãLšŠ_„ª:ºkN%Âãá« ÀæŽ8™;œ¢O±µ;Íjµ GÐC‰Ï zqŽrèü&ÃAÕLÌ •¢\@¨á¨›4ô¦•ž9‘©õ.„ à 5ÃbLª¡C|ú¦[£žÔH‹ýÔÃG‰WÂrçÁ:ºÛ5­Ì ìÛ¹®ç­]o+ŽâA&m1C{¹þ·ÞÆúèö¡m’gæB»´¤^J•ÅÑì7^“O%þáXÁ† e)ùvúqj;¨ü°#lÇ‘MŽ&‰;s;QðIÊ>ã/Èûç$¡Ž{9>*|OUð`"èüÇ?Påÿß<›ýTØ£yY£:§Nöªfñ裯]ÿÈKûOd]ד?‚=W²¿gÿŽꟛ௃þ`4ôGßéAõRþ¡“Â?Y1ŽkðEVãä§ï:³_<ºÒÎÇùéբ͟g+þ2}­Ã} !ŒIœñÖ÷)a¡§\þ:ý8úoÍvÞBÏòÞš[ð w¼ÿ°éþÌίif¦Æ\ÿòµãùî×^³C?t7KH¡ÿáœÛ7Ý¢äö¥f]t ª8¾®uyxz¢¼`&Çù9ã®2{~âœÖ—áyÿcÜ#€ÁI¦àžÃk­_î´,•ôóÍTWf²Š*V³' PF®ÃÍ·üåÑMáªòôfi¿ÞÝ¿Ãó9³ÿSO̪€Üî†ý¨e+›Ep­eã¥yŽ´H@f¶®Å£iró¢l{¡WÌu6!J¬3f6û\7î¹`‚ö¡¡ÿ²¡×E€2¹%„9öõo}&n|@t™ƒreóc«—b¸Òl'Y¿˜ÇM=2ò·EÚHøìˆî€Dœ&¢TR–™-ãM)ºlyYzª"Vi¯Ísaõanb Ä3-ÊžB‘nék=š½Ÿ»zwd‰v:y¨yD,èS$®ˆ«¹â-¹”¥^eû†£bÔÚñåÇí`¶hK×…¸é ð{DxÞX„]4ã…<“Y›pˆb6x†ÒEá%õJ`!9¹Ç\Ï¡µÍfK/˜¼­£»ÆÂe×êy›aú+zBlåsÌ»k}]"¢2ðØEk#.=½ç€Ì|Xþ£…L«l Ù´Er󪛂ó? r°ewDÓ­µ°r–ÂÖ×u‰›C žç꺖eW@0ú¾ÝooHG„´—æ:…Ùí1&Íd¸!Ṉ̃£Pï¾=˜<6¬Þ~£¼Ÿ¸×.ÀLM0EGü!tÇào_59÷Ðe‰AŽ_ïtdÎPOŽtÓZ†*šzp]—‡ÉnêZ&ÐtÕÐ'"ñÐBj“]™ 1ëô+Fçä>Ž:ÅñBm%NÇPõ˜Ps\äì”ì0}ç%¿ãZ ¸–™Ñ–Ga×…„q ­Ë/ÌÚ‘™Üf‹&úظ.â>NíðêŠðjS¬‚VH'S$ß(—VÿÆ=! Nƒ îZk­k•Zºƒ%râ2aÝ×ÞÃÙé>¢{_-9-›sã°"Z3«’Ÿêšúå¤lkñÆéZÓ¬¨:H^\V—ê¦Ý8TûÞ„Ý”s”þUìi)n~Q§”)•¶Žpœ¢…Ê\`øö«Zéïá£Gšgk¡WÆÚKô *ÎQ0g¡ ]œòèŸv§•²¨v¬6·´Ä£lTcÅÌÐÅ å5FìD^ý— axnªÉ¡ŠdGÀÞÝ’9)dKç5tµµ{À`ë*Õi3Õ›zÄÝóÄ.˜œ¬lk©5)]†ì@G*S¡)ð¹ a° Bñí7ƒ¦ëúbMÅ­ÏósrK+#ÔÈ“qÁôR'–õÏÕ&ë{ÐÖú»jÆvsÙ)ÃÈl=a¯-þhF`OJ4;ÿ5 8AEÍVBó&ï[@ÇF—™1G¿Ö²æÈ´ÄÎ~×:ml±X:@—bO“£¶§ó$ßŬǹíÐÜwìò*m[]‘X£¼Íbz:øÚÕ |…HÞU|]Ú²íø/"¯ú tÖ±WŸ¬¢e§ŸûwKÜ_<20‚hX+êÛ•µ×•R8¥æJ±?[Náô“ò:6 ØÑPk's~`äY ®Õ§†ÙÙ²—óc¥Ç0‡†W GUM%vmO%W­3ŒZriÒ•fªa²ò¸a˜&àª.ö(à<×7M§žz5‘=vD£ÍL´*. ÞÕÒ•pÆ¥×ìQþ?¯zŒPŸúÎù½âlN=÷ü/ðê.ØÈ=ų{vC¤f‡·úðÐN¾ÝùÃz ßCi#ú9ô´Çq/¶É³ óâÔ©oe’x· èíãYúÒ“ÛÇtè)RîŸTnž£„'êæ¥,˜¯— ~øÂÇ0ç½\àŸÐÿPÐÜ÷æáÏ;/8㱇cMÏ7…b:~ØMÿ–¥ÿø#á?¦)’ùÿ~›ÿ}ÑY}ó¯‰|üS_«÷²îÞÿ>ƒ¼%uô§a›Ó±þBÝy«OÑSL9ºyz ñQLŽ?Ÿ­»Ÿ;oø„ù?/4!òÑ|𠔃×ßKy³jú«0<—"ˆf @íö_çšàöGÌÔ厜 ǤÛ‚*°m w±Ó3ðÑÛ»z=-ÜïƒÚ1ûàSß_–fØFíà9Æ—¤Þ¥m‡I¾þk­}6L-—ËêÐ éUìD=\gLèÞvl?¯ƒµß„§åD"p­õ] ýxi®©Í;ÎÓ-Ê3V´Y’¸ïÜMÌv^!â̳ŒŠ·ç9E(õHe›T79vwd @«ëjwfä×UóTË’~émRž/£öÞE‡r掀sHXíëÄQžÌrÛS²‰„Tâò#ë:· ›*PÖ¨{ow˜ú`t±=¶w;ݱI¦ÅÏÒÓQxÓúäÖ-lëYS¨c¯5 P$Z‡'‚:û/Ê!rq™úT¯xªõ* (,2dMš>JËJc+ò˖› /Ä^â,g!Ð÷³jz.ßyÌX<î4ão¢®’ý‘ÖK“{îð³òÎÚN”|`Ý"aføm/ýß÷-)hi‹öz˜à)™ðj”]mÒwî2Êׂ’·qî‘€]hAÿ½\W» £½Ž.y ‰CFL„(UKÝþ©û\ —~…3¯g,#×Z=L{â{ž÷éh[†{|â³L&¾+K”£@_Ë΀s[éJm@Ü Ü-Ó-³’^ŒŒÕýåjbîÔ2UQ¥Z¾á‚Üó®¢$¿o‡j‘»nÏéká…ÖZ©žGx@î7óu¡)Û•b*¶=N øîÙN²t)NL+Oü~{ׯvãA~Ži<õE[,Q »Lîˆ)ÅìÔQVWX˜.Õ ,†€ZmÍ.™˜v}™‘‹IjNhA¹ê·£üaûøª‹Wx¸»‘“|:îX¶$*<ö2Q`„{rðáÀ® À²+×Ð;ô[„qE Ó= &ÓêÈx—¹ üƘø=ÚE}+æÚ1åH½8s$ƒ IÉŨèZUÑhMá¬Æ³˜¹€ú¸ðØ­•M¾ø™=–ËV2Öº{iZI3î´BB6%7,Ó ¥M¶Y-•cFNx69Uüj9KÈÕÈŒ ŒµV¡ë(Ïýrª vçz:ÎlyHêÚÞ½²Ûa1±M&e™¾;"•2Œwð²³Uûv'½ -ðžGç–áAËE*ŒüZ+ŸþÁê‚è`S·$nÌÔFkY •¡Óꙅߢ ¨Äƒ*o,ÂLƒJ¶tÔ4‹tlBŸg¤’‹q(¦1‚6 E¶VUÖ«±nÆnÄj9”ÈYšÞDpŒO¥~ñFªT˜&vŽR¤L:ñHI¾ æ¯ï8Ûë”eȉ§‡zS€X `7†íI0ñQ›ƒëIÈÝs…q^è¤Èä é•áÓú{3Ѭý“§d8ç³3žÏËo]­hô†Ó? ê#-¸ÒêQ(j<ˆ½Ãa‹ªÐ´=å »=uhæÛ)êâ±Dý„6¡•fËf4¡¬j8‡Ncf9ăá‰kU<x/}­4FTò"]Ææò¼ õ8R3]Y vàŠ~\óé[rÌ ðê´‹lg6DððÀTR~ßE2‘°w›JNoF%v¹’ô/ ÉÿÒŒ­ræD:ù‚Až¹}>o´p†>ÝÓ™†hY }È(‰&o6TÖWn¬à)˜W×ôhk.2ë:âÚž¥é/¶:l¹ë¼¿ÇðÕ di&ª×7ñÊ@À"Eø¶WÕ–©u:‚ $ Àu-@ÁHîCeö @×ZUÑv¨'ü®óº:˃þeuñ™™mëPåË\'ëµ ZÍÅNUħó.U¸¸î/ ¾3¹ÐÁ¢}z#°²5¼=±¸ªåB n}ßZæéÊ®ïæ•„H÷ÿreÁ°Ý„/yÄÕXµ× é»GxfyÆ«cc¸àºM_uaǯ _f)ÚŸ}(¬ã®GV“Hå<[%3\¶„‡¤•ûnY¢Öe‘}š ÍïöÈY†@ ÈŠ^Q0%ßÛ³’)ù\”‡"(¬”Œ¨‹ëÎ\Î:ÖVý'ÉÞ‰¼} „¬ÎÀuêá]Xf·0÷ÎøDÔ@¶ƒU5®È’Þ,X¹ZºhÅ^Y½/²YÚ}óZ\ã¨fÏ¥“4ã}×·äîw¬kÕ ¥zìÉSp)nš:”±ÖˆÖ¬'Ç¿ó…ìêiVˆa!¼Èn ³(¢Ìõè¸ÐRÐPµ·e²ò¬EÛ`¬gÑ“ûIÓòzón4ån­ÞI¤NÓõ¡—ÝÙ0[¦Ùøºr>—ÌŠµ²$FŒÅêñY|\‹…ç³ôŒ÷Fb û¡+§ S‘œŽèĪ÷–s&¯Çš µûYåŒrq¨2-~Ô2Wª´­"¶ôƒËVzekàÜBSò•ÒÝ)\ÖGç„iöÄèèJD­¹£š7G˜‹ öM5ºNRÞ®xm°ˆ‚ÆY oià‚\GsÛ²T›äÔÅ&"ÊZ ÛFÂ@ãµ$_A«×7Ï©û¾Áefýï˜5Ógª1§)ùÕ¹ç!¼­þ43Њûñ‹^/´•ýº¹åu?Û¾uCIãІ¿®•J…¦v6¥¶ÓH[¡€ç»:Gè½OUw…žýd'£8üGcSFL´¿ebjïìÑ#%¬ ¬ ¬×“¢%oÑTý6œrSKìH„ˆøêõ~~Þ_H"¿±jQmÛÛK¶VWC]]nk­²ÕŠaD“íM5͸TKv_Ö ˆcóc:£ÒÛ•˜ŽÚ¼õ›®Ù •eÌÈ8RSãÿÄwÝ÷QÞVR­õþÝ p ÅÅ4ÄŒU9w³Ôýl´\Äa§³êa·¿V['d3×Kmc´®.©Ï'ªTžý”°-@ZõØòIŸ‹bcup¬É9È!U¾±1ž‘tìGÅ8ÒC¡zè'º®f²¹Eª¦ö_7ZmdY:ØÛç—¬ÙíÈ×ú]½†žäŸ# ;6& €ã>*p’|ΡAM¬_ùCߎ…ø…ރÆßåf?_ ûõ~üS&9ú¾°ù.q¸ø‰tÇtûý‰ýç©ÿ}0‘Îr…Éß5gáѪر†"é1Ì öŸ®öR;ŽJÇ׳Ío÷²¶–ÖSä³$礳fîžíŒçåkÓ$¸«yć…÷AáØÃM¢ö–¤¯úì*ÐÑ–}ŽXŠU´€µ饿§¯ÿYÒ8ï2$ã¹ñL[¶ùíŠ0²¡¼Qìúüx=a* EY‰N;a½rxžŸ­Ü!“2ÙtÆÚ”Øô=¥êÔë02MV %s #¹Èê[ZªÎy¬:“¹ßŽ®4à"möåè3?úãÎõÁ=|­:øôÅ€lÌc)ÝÕ|lಅbžÍ\Æ<nÓg@¡tåkîuîÑÂtÂ4É÷ÌeDd”¦3!7«!ðuUo…»pøV\àjßs0ZéI q1»cÙe´/8š6ŽŸ*|¶g¨ Ólý1GQªÞ(kЈ«Â"ìú²&¸zŠaIEç«ØO-nàëhŒKý™«ƒíPV2¤8¤.«­Á¬–³²†Â» îɉ‰JqÓÔ­ˆÖV@#.’Àeä É2©ó-¹´Ò™ˆ• ¢KôJƒ'á5 Øíw.áQððòÉÖ[geFwŸØZë²%Òï0Sì†BúÕ—k]fšóa/D ¦>IVeGdf¨Rûµ›Ò°›SÏ;¸Â.ÒÕéxà–Ü}tSa‰\ŠP®Q9ð[,“­¡Ý¨9ÕÈsuÏ0ð“·‰Kr}ûí¿î¼i=DjÑDŠÝDÜhõ¨|E A¸x¨ùUÈïêÔ]×’®‰ˆ¥ÜçäokÑä>áŽ÷q?³ˆ8CîʰĜë+M°eÜéÁ¡„To.;c< ¹À%9 ßõ•…îUjZû†~ŠH0£ ÷å‘}(½Û¤ÙmYg"-:´ƒM€>—ް°ÛÄ ž—{Mh¦9B[{Õ·¦–Ñð¸+ÇçùÌ]èÝ&z8´£Â„×>é'éðG®û[4â'½—YÄüLçÏß…»-àUv|Q?ñ3ÀœG€Sÿ°6ýŸWËŽ~¬þ©D¬oùß9€OàŸŸLé/ݰŸ k? }t¾¦·/<ÅqÑ|^üy1ùáçß}¨ú»¹w'èNN›ºˆó~ý3„Ä÷…‘‡µŸ§ëäó7Ýõ»ƒ}jÜMÝ]g°àÙÀRN²˜ö¢×~]¾:*î]>Wu/ØÀÀ³L8Àu6úˆx ‘Î;÷×gÐxwóQª¼G]ß4â)!x k©ª°å#Дd¡¡5CºÊ|Êv×úl½š Q?±ÒâÍɵeþ.e çüjŸœçY‡¨°vud·WD3ÿ¹Á8oÛÛ ó‡'VÄ»Ê0¹FÈq…KÇèÿ¹—IZq’…šÒcfîÙm›d‹á·|[ãce§§[ûHÓŠÚÙ“ÉEι']fPÈÑB­H¦‡Ùåc˜‹¶ä/+˶ª7VSÕˆŒS'¹± ü`.»H¹QJâÁc,˜žÇ. .³·ŠüMcÍéeàüîùz:*àUAv/|5 ¢­àefíýÉÄ¥œÓT»®7£Ïu¡Õ[µ€{›=·ß4šûú•jxfx"‚ãk7èrðcW½Oj G:#É´;èS’s*"c ê>\Ò€ËêXž¼œêµ(€ayd¾Ñzy^¬«ÁžÙëÝcüüö5éøµ ¸Ì¾Èc®¼5.À»³:º!àFY,¿-{4¡*\¨a“²éô‹»-»á+Á$M’ h\ÿ±Šn|Gt{Vw«;÷MÒ% [,:A±È¨¡ž™%R÷·ßß“‘²ë‚ÿþíÊ]Žñ|2+)UB^Ö©íªtx¸ÞóËE$úÛ\4——ˆôuœÄÚ^í…eé¾L³|Ê£]G×Ãe\—Uuí¥Û#Ó ¦]û.FxâÄÜ3Á@:ÕqÕ‘æ2þrîzÒ-¥…i¼×ÕHôÔ#ÚUÖ„ò–ªŸôèɸ•¢š ^¸õ†ÉMÔ®X8™©¤Þ}dîu%Êýjç¹/÷Géd´t·4Jñ&¹,‰U"p™eÑÍêG;„ ¶_SžkMÏw‘uŽÚ6Œ ED(LrX:ÔËB*ÐÕö}8.„Û=?¾4&Caf¹ÊEêW#yk£ƒòmy¤È¬µ€?WrÄkÙ×׺Ö×í7I¹apâƒ"sBQl}Á˘|t¢‚VÕ”%ͧ*êt]—¼›–.\€n9»‚ÀZç«°Ó¯±Ï—šÇŽ?6’¹âºPÜKÑÓ1a-ÁºjŠ3ï9—yeÔª“òÃ1¤B4(Qõ8yß`5«Ñ”—§ª”­Œ`(¦©Ë V$¶ìgûpªšîyX/êHÚž°ˆ‘kElâð€#®‚”=ö=M&Ëž^$Þƒä¼'䡯ÂZ‹¤q!¯þ½ù+«NáAÅ}L;~Â÷f©¢˜s 4–W{Ž·5-n0ŒUÔ²5FŸpU’¦‰@µƒíél`"S4‘ÆPd[,Ÿìë~ŠqS¹}³‰õjNÊ @Q/Æ 4–̺2V%i¢YŸý¼ËKo”͹¦ÂsûÜtT{ÉÚ ¶kThå7ž•ÕöŠ÷Lƒ;'EfŒ/ç]àeÔ-˜ø–°þ6–ìzóCydZFì^›IYýdUqÏ@¥Ó¸”Õ®–[̨lX9¿€Y˜O,…\19¹ëÄj‘Cîëб9ì[‘¹ü[ù_4¡¬n£n×ò>ÖÆÔ»Æ!ß\ïÒç¡ÂÛ©wö(ªŸ-»€|€hóRîX|M¬+0ÓÝ™=€@ÔÁíØéÛôB (?UV+&Sß~á|eï…hÛ¸(^™Õˆi‚2DÞÕP ñ(T#ˆÛ ^šqHmê&@õMu’ó׸5,hWóbÎ?Ú7K?êsÚ‡â­Õo÷#Bÿ©ž¬ÊÍáIøÔO8·è^r‹ÿUÇh iŒobàÁ®±žÒL€à“äpÒszÎÙV;c‚AÔØ¨ßÜ®xœõ‹£ã‚ÿ€\‰xΣÃ;‡ õ±ô³Ãö3K*Þ:.¹WS‰ÂCË?_ÔB‚ét:lÈÃéæ_õOÁîeoþøS›÷_уêßûB?wø˜<ÐÀ§ùB{ÌrÖ¡¿˜Gҧ߉På/Æáÿ|Z¶p¶¬ÿµ €þí!€Dì¿øXšýrðÓ½,à§Üs©}Þóîz¦°ÿëí¦ä§iò}ä'.ûæáŸ¡’^2xÛ?Æö×<³/µì€.¨× ubGÚ40žýÀûÏÒQ9>Îù¿J}qŒ+Ž>Æýš=g²ácw1sÏWÞÿó©>}äFô5Ÿñ’˜ cìXCý¬#…­¿8øK´Äá¾çÐZ²vQ5·¨_¾x÷ _·$ò΢+^ Qq"å3C†Pí[›Åvè’xœu‡üÏ:C<›{¢"¨ÄüŽ ·"»OfCžÝÂȱEÚPl¦9j/߀<ª9 â®×nÅ>v‰!Úž©YõíZ—:t¥R‹ÞžKƒbÈ,ùIÚ%bûÚÉzÏ4ÞGE0&ýh̘½&Äb(Š3„[MJÐñígãç‚ÁhÙ¶U l'3éÖ°rQM ™ë²ajL2E duPff{³¥¬²Ëkñ¢}KåÛB%:¯'4~îøQ£“”ÿ-KÀº± ”êÚÇ®ˆD®@N& Ž8X‰ †õñ‡öµL²u¦‰Å5í™;àÚíÇ}ξV_‹HU™^À áÖes-ú½yYy¾ f×Zyo´ïº']ªj¸,|H/u£F’Ç_µ/ÿâArÎ÷|&cÅêÂEøBøÑÄ𬈠¢Šqï[·ûZ ËÁ¼ƒi—®EÞª"ÒÆ •7©Ùu­ëZ.¹ßÒM­Ò‘똞ü²õ+<Í©­±…¤Â‚CRìùÎ&RäI>˜ Ó”Ciá×áLê½K+ ßsN#ºzÊ:\ÉlÕˆ†-äËÌ&ÈÔÙ˜ðôˆð0à/S˜a·ÏŠ3*\ZR¸— Rr)‚vÕGÏÅ«h:4˜9+%„^çJÄìòÝe˜ìvÏDÊ2˜oP&‹FÞº•FÚ™_íÄG¥¬úªOÓc4Á´ŸÆèÑAŽ&x‘k-èÎí)†ªJϧ|V°®¥÷ÍGì@še»û\¿‹p¥&Ò{…loÕd>J¾ý¾½[.(âîæ u©15Så`¥YÖ Î»ÈÛ¹}~óp8´VX|»ß~G$ë'Z´i†ŽBÛq˜÷Çšhjs.{‹ì~ìVC^sGGëD×E‰”9ãþþVèV¬¶q¶ÔI‡Â÷´¥/•ug6VÏ΀¨qäeÔ9ÂQÆ#˧¯Üìi ¨ÝJ k#Vjù~{vŽÚÑqÀ“sÕ^nŒn/ãÒH«-;žš£êC=ÎRÞh†¿ÐóÚkÚ1ªzÝÅ'z-œûBu+3ì·)"¯²š®’´ulµú휢„ùèJýÿØ{·%KŽÙ xÝgdþÿCGN7™á€Î.ß±#™U]ݧf¤R¤ŠdFì‹»¹™BuiH ¥@Y³+m Ì#$XB®*¶f’æ'‘!°11ôiBWÒa ™Æ•&Áûé<Ì Ê¦†NÚôL–rmEÐÇZt8#¥sEy(³j݆;#±Bуr ·ÁvB¼g×–0}ôkñùM¶…MÉ@·—£¶÷8[Ê®ÙW°J)ÔŒ"cbɇÿÕŸ…fíyhY&œ‘hÂÚÛh­…‡ÖdÙz’U/µO»£ž©wx: ù¨9æ.]y¨X>JQËyF^kAgÀ¹å‹`v F5V B®ÌÕpÑ›æf U ¥žé©ñÏÝ<¯¼óº” ,gk(ƒ^w´6ÜT¢¹u9*ÖXàÇèrôژŃ{g8³cèF³ÇÚCuZµN›UÏ*Ú§°j´µÝ ºC,k§Ó|¸œ¢Ìæœ8r{À„T‰1½LÝyÇ€NkœKÖ$`Ù×a‘XeÕ,§ÅeZhWßÞ‹®p*weôŒXÑ+§¬›•Z'd~+lwg_ _dÓ+>oòŒMO×=×ÜÿŒòù¿n´ûL/ÐßɲBò¡ï±_†ñ{WºUŒáp† ÅU:áïcäl+†si1#¸³Û;ÏÀÉO¥ˆÕp]W¯ç¥.áP6vI¼°·üðVŸçѨøÓA›üÖwÌW3¿˜|ùøwS“ñNÝãs ÀWyò§Z/ùzÏ}o†|£þ_ÖÿUµ˜}ÀÏ¢oºˆï<äÿúó_þòþëßíË(îKçÍàŠÿ^øå6åûµFäK'¾6âËr±ÓZ_ îw¼’wðFôÿBbïsÍpö×’4(ÓWq|¹àñRöûìrÁd†ËË/”ÿf˜šéý7µ¯Œ>Þ€Q{êûë“™ë@O‹Ðóóç”ÚWžó@~ø¦ÔXB¬ÚùÇ'Æc5í|¥g{ ¸CûÁ (ö!Mè)s$=;Ç•òøóåƒîÂ·Ä ä90øH>Ë€XJÄþ#;w(’ ¡wOБ¤Æ«vÚ‰æÖP¤—ьؿJöäp…»`¶Ùm=)ørD4úì RUÚð>Uæ‡YäÑöêÙÞõVIÙfL™ÜtcÈ \VnÍDíbÍ.ØdI”ʸªÚ½”Óëú«î¹ä8ɯ‘²è£uïÈNøàÑWÂÔ:UÍjGî­ñ&¬¨šmÇD¹ÉpùEÂÏ3{ I53:“' Ì U޹‚ªÎ­¤ö'§€x6¦)»}Òi…¿êÜ`^4öš=PœáŸ~ßá"Öôy¡©~¤GZ\gtN¢Äui?\ˆOZ“ëÚPl \œÞâTùɯâýǸÕ-QU :»,ϲÛTÔ %ö£˜*B±êÜ“O1Ý݃ X9-ú¼ÇC`ÍܨÖJ ¼þñyCUü&…qW¥×éU$‰0!ÄH|·Ð£od”'³VQ?úi•®¶ ­Ýmèä‡1i3l}®öÈë!CÚ¸ç\ª>Éï¾:™4B*øP|FŽìÝ6ï.é­ëpôåäÇ«éðF˜Ràã]€}$$ä´¢0[UjÍ‘Ó €q)÷Š^+ ѯÈTþ!Šüp&°•^컕 í‚â®ÀéGY #¸=<ÈÀòùéàRÝ{ÔdÔxTÍK$% :'µ²ébÄpE13p`&D‰zdEÜ„VëªáÚ7CP#ý’ZÌãÏœO×Ç€¶:—ÚÀß' ðî7È7Vbù +‰ÿ?Ðøÿ’Ão¾|ÿÉ­ò³(À›> þKúÿo›|ÿ]óo¾b~‘ëõ×ó"¼™ðÝOúÅá7¢ÿÛµáݣ굀†_þ¿˜ <…l<°þîMÙ WNfeâvÅɤœë'wk._óI!xŽ+‡È/¾ßÓ¼-ùس7c å埬)t.£7[–¥‚êõT`— ïÈ®.8ÍózFýõö§%˜ãnË?w¬r¥V[~‘ñê·ZÝ*a¶tàïn:‰ÁÝ šãÝÔFw¿³tu}Žîί4ÿ³›=;Û8ÿ™b´—Ãÿ;¢}…™ŸGÊ$®®hÂJ:¶ò=œÀÁyv¶§ãâh;‘§6ß•aðFïÇ—íY¥[/ˆô(ņÌšSo&Ú "¦jȆq£QŸÎöÿæGöýî·›]ÉÝúø¸D Ë¿q¦f½Dæ gÊ›eKV¸ž¸ªzB‚Ú|!§h6ñðQ‚3DL5J¡-V—>BIîî(Ïp$r?˜dÿÈeM€hz“ôC"áös´K9z¢Ú]-½¹Ì¢wá‚Ãtë§TQ°ªHXH $GHRX‘Û¡ !•r,8³uãտïꢆ(ágŸ™ æýéW•ƒuw·i“MénÔQëZ‘ëð[P¢*–+¬ìDʧ^v•27'Æ;:v'" ,|FÈÔ{dn#±*fËž[o<ÌIñj ÏéBàæCA\Wí æQªÅ²¯f+nÉVûêK®s†®é­Öcã ÆVWD¹b*ù¢â5 ®»q8i2œ.©¡ÎÄŽ“i\ýâ}µ§p¯Í·¨qçjo95­Ù ÀjºÊújßEÏmƒÄÃÎY0Ûá¬jÕê;h°|Öfd—±N kΙ2»ì¸3UTß¶ˆKÌÀ݃V¡¬@ˆˆšH&>…’åäýpÄ‘Œk‘Ét'rgÞF£Ô‚·W9øÙï×#qu£ˆkU†:~ü 毓”tUÀHó•è´Ûqµ{w1‹€ˆéœe1ͱGÿëÑHsëkÞ]mˆ{¦ÊÓíœ Ï«Ë<þî—;X‘,'8ŸÃ³åõ4ÊWÃÄ1­VÙZŸÿç—yž‡Ã?Iæ÷¸¬¼O3âò}×xYkkeìËs^ÇÁs“}5}B”Œ­~×¾J¦$|¶x‡l•,áÐ7²Ò’W^z]±•ñÅ—Ú-²ë—Ôkñà³lFû"šn_—Kí&ñ­ºvÆB1›ƒ)|iŠá‹'o¼ð|*Y­Å·º×31÷|ñÚ‚ïÝ÷ïeðoÙ9wòå¼¶ð5nñ^Cä—ÀÔ¼|}Ó|iøVùÆ·ïñçÿâŸPËæß8À7Z+¿Ã2½þ‰=Žük=ïæ,ÿúóõðg¹›¿«)`-Jù[«>×#닾p&t“IÂ79€ï.|3:\ñ•T³S#~~‚¾‹¬~] å%iõö£}Té8Ù*?¨z³ZñßÝ¿õ×3gØšm³ûÕ¢ïˇû=˜:[„uhÍ`S*0Û±á—ö0DA Ô5¿sæü>oqÔü¬ ×å3sŽ&Àòô¼áñܺ´q·N8iÙ  ª†¬´m™€Ë¿¿Í¯¶ƒXâx½ÛÅþyßcœO³cÕüåÃIK‹É©€™éº¤RñoDÿK¢¦CZ€¡©œ4ÕÄj–p¦¼T ºŒ§®MUª_R<Ëäò<<$ù3§GœF(Š3ƒÂ,».£1¸Ãçróu&Ô#=´"*½·ÏÈbÂÆKÄ/_Y”S» ©¸¬­E9WÊž´53›1™”¯Ÿ‹~^Ь #X‡½‘DsÛ^úpÞwšSÄT¡ârJ™ÏxÇ`€GL¡çb+ "D,o¶ûì§‹OUZiuŠFÇGJ)¾"Låñ«:r èCŸ’gûâ/E X&¯L¬‹MDT,Òœ™=ð^¹UTÓ£Å-âƒWÈëÞ²ûL®Be«t1ZðAu~¹U=(*k Q "äN“ïsñ¡rS³Îý¼ÝÆYVª¹$o'ïø ±ÃæGÙcKçï—ò / ¤P°* ÜÎÔ‘§cùRuQšzày¸ÖÎxõÍÔ9™.¸úÙPèö¾†XÖ½Ñ •Óâ•mÝuªOõJgyÔQʆ‹ã Íèg¸ÇÌ}RiPªµ„ž—âÇÌÐG:gsx¤3ôXkè ˆGÁ"x‹˜IÐN/þúþ<È SMÚCØj=‡Xräkž2¾h é!OƒŠÇŽf4P 3'‘¨k”s@¡—1t>1ëª|× 1)6xüÄÒ:çÔÛãèê鵤`ŸžƒßÀÍÁÎt¸dàVqú¤£\ïèËšÒt4äEÁЃ­©W'Ý…VÝS5_|ÈËi× ?6ïfÉíû2©©ù5SõbÇjá^ö9æÛgqÞ£G¯Ï¨}/(_«d\ºûõN¢Ã“7ÿ„Õ$],Q<€ý}Í7°„»s¤ïSYt’z§O…øÑ3ü€>zH_w IDAT!à‹Ÿ¾°MW§vU ù-ç«à½tÏHJšAµ²ŸË ÎNJ!‘ª"5Ík"5¨˜DRIÊIÃxNå(¼)¿MÚ¯Ë_,‹%Ý…·÷RXÙCãå1éAù0<*_NgÝ„“8T¿þ&o‘+è güð[œúa—i†;”ȵPï"O”6ªe3܃TwÉ’@”Ÿ§¨š \ZÒ¶ëC>?yâü̦ P׃Rƒ¨8£¶¼­º£c|.6ŠŒÔg@òÙäšì5mØ)hÐtHÄM½4y/&JpêÖŽEKEƒŒÛa0ù͆ãËc9 ¦¼{ŠùѰ¬=§ ÕMU¹´¶Š‘ì j6âjvVb!'jªz]¦f"ò§'›.]z™m"AP<ë–'ä„©LÍh ê[-F&ŠÒ¼ŸÅ‘Ç !Åš6ÃÑð2fêÂv«š¿;«{àFºëÓÄ©jbQ$Þ—~˜êõññï¿ÿûïÿöoÿùÇÿñÿüoüñÇŸ?>È!áDr­ Òú)®Iêæ ÔLÕ="ÜVò Õ8 ¶L/ô¿oix¹¸N¥9HLgnÙ|óñßTŽLhE‰dU¢*†œkT½Êž«é× ü@Yû§!·¹ò!P[%&uwsõ×' °žAœÇ½ &JO7á f%SzÒ3âšÝÚ%Àå§cZH…ˆÈ’ÐyONfJòœl›/gh²¸.H´ÄgôÀ,R™g1÷hŒ v09NªîÎH±ó%N‚ª;Hv±¯äg¸ˆ˜'õ*w ­­0$‡=õ•e(£`>ç™6ÙÏÖ•ú__`™ïg¶\¶˜"‹혩ܞÝ>¥zs”¥ÞòKžÝ&Áíî]—¨\㩵ðšZ&­«6’ãÐÆ4VÝRU°j˜@FoÛìTOªÀ‹qDÕc—Id»«j4KŸ{÷»Ñ)]qɺ¢p#zz±H4¯«‘Ù¡ÀŽ‚@l…q³F©—£ðÝÿÖyãÕ4û„G»;½Æ"¹=Ó8Èí\ÜA˜(†Ì1Ž‘%Êü®Ú,¹äbm¯URpÊ '˦ÉAª,]`1…Ý]—RëJ•ª#Ç ö»¢"ï!6õI 9øNú&TéA®§ˆÊ™Oû˸$ú|–ƒš ÓH5½Ö‚—©ÙÊίtc„Èâ¦uÀ­×»˜=È—*ÇBÏÃPwN!"ÁIü.ÍuüÃ:K¬ÏDzyºZåÝìVÔ\Ê /mYš\”Y¾§¨;^s"9­Å§‰¯ºŽG-9%¯Ò›ª1‰T+ǽ¢\fñOõa{ÈÊ}^}Ëo^ДNÚOú Àg»ïd=lí¹EüãÞ:Úõ-Ä(ö?[¿€;™´^<ΔåÙQ«Œ`€ƒ­[œéæ©!ôã×·LS¤«¶Ta£¨ú¾/Ó ‘© ˜¨ÉúæzDËÇ…9O¼„Hv¦¡†z(n+oó<5}nm»‡ _¹,«€Ϫ¢w:¿gòlQ0Íx7øKYòKòƒfôÅg+ò@à[àÐ÷ú÷÷¨ÿ”ê?¿Qyù}àáïûÉßÿùyߥe^ÞýùïÍü®-þR<æoùFß&P~rÿäûN€|ƒ½ÀùvW¼B\ôù}Âë׺¹U£ÇÏ9¼Ö>ýX›–ˆgýê»ÿYxþ2¢€<Ư8y“xð¤å$gëCHÊêÛÀÄÆðš89.acÁ›e$2°“•ä8ü:äK¨OüÒûD„•êà•[-Õ˼³¥š‰3C)ús Xªš<…üÄt2«”—.ßèðÅjÿ[åeÏì.¨MÃn<ãV\Ï”YœÙ]Ä“ `â顈æÒ¬L ¶™=Îx ?^ƒÌ¢Q…x0*zËÄbõœð˜ŠÇf Ÿ_†"öGlÊlî›[nlÔ Q}Þ/ŸÜ)dÖ2µJ46Ž¡Dc¹|5:¡ãme—vɧµåëäA÷Òp ®a‹t¶:\;H]~rDb`i"wÍ€¡’ýžÿ íË Å¿””UE¨ *ÅDEñÁpMqYr HµkÊ1q†8âA ä£++¤‘;ºrÎBw\UYì"Ÿä%…ù¦—Q3‡…sØTUÃ|ºPùÁt§Þ Î9<âž ‰‚ȶa´ 4JõK^Væ±’ÊfJ\ëƒlFN JA›ˆˆÄh…~†‡‡]2” ^ƒ„@TEq˜ïÃGÞ\9Áã‘§f@äóþ ˆ¸Ãg`|ß¡Èèƒ(Õªév¯lS†'œâ¥@Uâgµ^‹OÌ.ˆ¸ú½[jYi4pž|£Šñ ûH¹Ë A=\‚öa×¥ª?~üyß?þüóÇŸþ‘¥§ˆ»L{ìô,:è{ŸÈät« O°ë „ÄÌE)šã CYEëm~ŠÔ lÈ3Ãã„Å’èãRUÃép(.ÚG* Yû±*¸‡hbÁ´«V¥^‡lØ+ð 3°öÁ âF1û!¨(Ýj°Á1ÖdøRÕ®«îWhÙ4JœåYw¸·õ˜$¡È† ÓÜ,Řiƒ!!ª«&ú¬Sîªíyö3(E²9*ÎÈ…}¹,cNEk£·èuX%Ì—ã½U|žwÂÌIx-À.°Ú,à >€G#Qq]î”ßb¢gÁx_EB„B¡:Ÿ“()¼fu=X9e]–Ü/Ʊň„¨šáD«¸"T‘ˆãj®` !×ÁûG…s«¬ˆ 3B8[ß’ìgŽ%—/\*#'‚R{ü¼ƒ”\õ §®tÈ8¾;£uÄÈןcä°¨¿÷Š)ˆÊê%ïQ} ‡œIvB~Ý×ÕÑZÕ®ù©|âšú®HÀ#´gQ¹þMþ5oÑ…=Á¬é‹=í5sã1zQ¢ù庯¿˜«Øe½•‹™­F‡‰#þ?#«§‘¢vÙÆM6DçaæžÞly Ù<öïÑDwh©ý[ä‹•üÁ,ÂZ»pœáxèïý4+:cˆ#‹P¸ùÉ»Yö¡ >ÆE‡:—Àd– ;‹ÿÎ>ºŒá”9æOÉÊΜíÙZMã,[ù2ÈŸ ] ›'|ö/(Ó´YœOž+ç>óÕÁ®Ž,ËÙÌ‹î¦ò·ºÏBá·=œéZ÷`Í^¾WqyëAÿøNçã±} ÑŽ¿ÿ1aßw+Þ”–ný¿Ž5ßl&þÚÐàÿüü Jý_ü\¡•¿ü¼€ï¿„m*ÿןÿ¶Àsx‹¿ÿ û‹ÛâìÿεϷ Ë/äM^ý¯ïéY ~±É¿6È5üô‘/õ¶oúqö_üÊZíó#d.­­Áའsb{n«ØŸ@{û—.lY>Ù¯„ï²8¿¸Íû/‹ëJ ¼>ûÙ>m{ÍK,z>ŽëhoÀóMM,ø!÷Ìf9̈́מKMMé­ûr× õHŽ1†áE~Ï,0ƒav‘Œð¦éÔ.<Ï´g°Ú ­${ÙU½ûœÿ0¼‘ ì1\WGq1ò—µ¹ •‰È”òân’‡vOnúNµªçJ=ÇFõ¾­4°(¨­³4¨wÖTIÿÙ’%€¸ô¼%…í¢§æ>D/½h2^Í8½šÒ›k2BÌ šçÛyDè@¥ ¯°²éVšAå:†ç6[{ª‘ô¤²¶ž [A•AÄvXˆT.DN=Ó²S¯zŽ„3(Fñ‡˜\êDD;§0^¬D5µV Âg]ÅÏâÍ[$B~×ÕY•j¾GuF$?*ß,'·rx§o¢!(—XžõÜ&0 aÀ!¥ÖÞj ®,8Žn¡8W;S B4õÿÈ;ÓoàA¨(~»®;xAIùáþã>ÎYqÒ¿¥ ¸L JõjAÞY0ųŒnHÀDçKÚ¯˜LvMÇ$§n Ÿ÷T¥ðS]ëbh%Rm¹.Ý¥,Ñ:¸U©†ÖªE²1ËDÐó%ùÍ/ËÝaš-Ô¢)lå2¯¢oa‹ —ˆãp­.~?©ô`Gók]"-8µ“¨^”ØEÚQÏ%víoO~þhÏ¥SEir+,$bºa@¬j]ÄÀÂlϾ$Fñ¬ñ>¬QË¢Œ\?Ûãßbž!+©+p’©Ö©ö¦¶Åú®)Y*PR{xÖÜV·ÃQ#²ùvZ%<´âu)Bðº>.Ó¸ýó¾Ãïc£ŽÄªÂ?~Üî•×RHK§eeƒò"=Ι^ÔÁ[ì«)\WI£)îIÓ/á7 ö4Ñ‹­ªÍÞêN£T¯³ 710|\×ÇoûñãÏÿøß¤q[*æ1g^àDt j>oœ¢äøy7De|$ýj’ h¤v+ÁìK½ îÑM®“¬ÆòA˜‹³-°=¿ν³žY’S;$d\¦hg¡HÄí1½ëÇ“ pÆ$xø òŒú°=Î{ÖëñaÎÊchŽÂŸ‡ˆ(­áªõ¼ƒ»¹YED§¢3u`&ÃÖ8‡˜=…Œ ¬äªŒLäîØ[™—£æ4騴Âdjk»ZUˆÜAµó‰$Rg»@ ›ªÂš×F´[XT¥ÉMÙ¼…V sþr›GP5‡.‰=GáìCv+®œ«»•²7'º#ÂP jëN1^ ~†‰¢á5Ù­„P*OgËf=.y=åTYQ°bDmÛCËlÙ„²¿¡‡ ¯´‰¨ÔVÛ¦qº"ërA¼.z •w¿m~\Vãª#±Œut•2HJ8!„™´º©íhzмŸ¥Y÷ ôCšÑ¸,Eië•Ì\ð4ÈžžNÌÜê˜O«ƒêÜ÷%w+"  #"jI#e°*7(jçñÞ#mMvA»ÛBއ¶lß'€Ü«wó¬â?kê×[“9 Q(§LMÓÈDÎ}†3ÕñÅ— gŒî'ërôHm?' &ˆÀѳ„e×Hþ‰, zú»²O¦Ê´ÃìXÐÚ9h][\6éqÃÅÁ³ªLdØ`ËuȘ]\i¢é˜à!e¿zŽ€æ7ýêU&”Žó@+ÖØyjt%RE0öæ‰]Ï*8%äô…rAñ/«à}ÙÂÁ™3<Žð]|°Ú²ëAÇj׋ºy†/ùFòåÖÓÚš‹W; +§K<Å\yÚØ°ø©+ر€È öN4O§£Òœnø=…Ìk„2¹¼å?Úï®QêIx)…”AvLþ˜á_ë¬eQü¸õfžç.¯®ƒ}FÖÜíN`ð\ß*¶)ì=`½'î’ç¿”Û—‰ïÂ&ÏX,!ê;¦öÏ]䜪ž·š#^ì¿ý‹âùúb› >Ûù÷kçÿƒ’/ÿýü¿í­üe€ßGükð½éº}¹Xð7_aòE ÿ‹Àë˜`ëóü9êçç?“ï.â/£Êy²öþr&ó`þÙÔä©þW»ÛCjgW°-­~†ÃÕÛÔ;âiíÈÅKÀφOa· <‡6$MJu²-òXe¼{Gf¡öøuÂÃ+\mÃ'^-kãQsÇË(¢GA<é2~)sÆÊloVÿù®T!›ïÚOƵÎé8ÓlÜ,ˆ·É6$ݬF¸ˆÁ´Êìòç{ÆÅ£ŠñTsܟ줌ho¾öê>Yìs`>¦,U z¸Gvt WÔ(ì~HÉÓ½«”>Û sõV‰¸“R˜¤“"jîáíbrY:öå3Dƒª0Õ  D¹w\\IDDäH㪡žªÖWë^Šë ( ò•è,”X7KÖu¡Ð#Ë/ ‹§Ø±ñH>;Àë7ÚQÏxA0Ð[Ò-çd~–“:²çÌ%óyjõýe°©Nwi<Ì:IíO…áy{ä"y‡·©´–=¿ƒt55S?QUFüpWâ†X6OV«h€ôˆŠéoBFd4K’`îîUѡ≠Š}R`‰Á[ÒS\•æ’¸D;x+Ð>ÜTñ´§A¹#$ KFSSÓ I¥¬È\£(DM룰#Pé&RÁK¯äY…Ö`ÂTS›`gQ.³f6ŒU·qC =S$q&Œù¼ô›Áø0f£MãT»¶¼dÃ^ögl.cï:DžæV–†•s=£=¬×r‘ÑkÜ^ÂKô!Ò´ò>ì æ­ƒS¾TRîÉ$¦,orç·¡í8È"zY9±ìó£2ç+5$SJ9“Ëí͉Q®¶©zÖ=2’9¸jù¤¡ˇ”–;‹áŠŒaR—F'›!+‰rŠYUCKqk5\ ÈRøâÙ­1•­Úå«*£+ÚñNjžÄŽ%«ªx° \Yúª¥PXH¿›vaBy›LtD ®S#Dfz ›,ˆO¨Z"êYùWæ4x Ÿ &bí$pÌ®¹ëLÙµ‚†Ùi¶Á®ÖëÒœ"Ó+i""Gà|ºcw>xpçPðÙ’Üö¢I¿êñЦ]½âÃvgwrªÙ„^Ê[h¨ àšöÑ,øÁs«šSv´N¹µï;XæV«Ø^ÿ£™<ç²wµù, O7ØlÖÚfí¼S Ť¢ÇÀ¬zÆ* :÷š,tL^IÑ7@ÃU\ÕÚ+EžBÎ…‡ü ÊÃ¥7 3Ç* fÄq’Øðî¼A’;Ë?œ4XõI÷ˆšØá*œPòºžó¯Æü󶯣¢Ñ½<nbæÄãÅBÎ…}DzºVÒÜ[—©{Xt¾j@ŠŠsòýFçû˽ñU©©­¼‚â_:¹ýŒ«òÔÔ›<CÝš0|Òwìu€¯ãLâ‘4xé$˜E‘{X²Uúãºê\‰p ò·1tXíõr0N»¬îQÒ;SÅ’BVý@]w Ä+›fê—óp&îQçAµ•Žg—$Þó—^ ÿø‰ëW;s—®ö ü‚ñý{ýö÷x¹of¿¤EsÕcyߺÕ÷¯^õÎß¾;ü’ëùŸ’ÿÿëuñ§ríaBð½þü+3€¿1wð¯?ß}©ßøüÿ Ñ–_ ›àkà±´|WÍ_ûê¿ÓãÝ@ìe ˆõØüf¼8«ÿ¾‚_#…Æ»9ÄOo˜S)|Òé/]¾²±/ÌŸ¯½¾|é9À뤥-à qÙM¯Æ³4¢»ÈXgÅz©UvV4¯vÑv ÀètïfÉÖšµôCy9P9ù‰Ö9¯‚­ÌñkÎQqžsqJg{ •CGÊ}vÊ7omzƒ³kX¾S´Ÿ(BͰŽ-¯y˜#"Y½Rÿ#¥â©ª~'ú" Õ$œw;C·šÀ1Ñq’á•È“¸ª2ʉ^ülŠP̃øü]mÏÆQ òÄ‹UÌÁ€C…ª˜·Ÿ4¢xÙÒ„q¡í–;Ùx±vœ=;éÈ T$'¸¨´ò`: ­³qcà7ÏyŒÝ 1¬¡8Ë;4Jz^€©çÑKnçœK+×,þMðAá>ƒ“%ÎB¹ÓIÖ’P˜ªA˜)T ‰ Ä îc Émø-j*¸4+¨x»üfxV0øéévÆo¦é‹n6õ›§õð$$‚˜Îߪ¢s%²(B)„å0Gk¢¡¢Éy]à‰rE«ðRT×k–³=" ’ ŠÜ䇈(~ùÔ дü…}³§ð.våAA…Þ k´Öðëâ`-'ŠK)èôôÁ¼YnViÃõ…~Dü™-ÙõÝuŠ $ÿiþìœ×0¢ V—Ê]\‘¼õRË6Å5K™&óTf€ÆÐÃùé¿]VgØœ\^ZUÀ$B„OÒœQ `»USZ¬_4«D¥¡ë“ñƒÃêÎñ TÝ&]© ßáC)ê—ŽíPÅŠ~Ça7C«©õîæ!ΠE-3×bVƒ÷§§Ý+¿’£Ê¡Iô U+Q+R ‰·S• ýüôûó·™*pµÕtA¦–Œ¬Óõjõ’J@ˆDÄ} A1X« ¥„ßÿùMÚC¡x„û}ß7³WšOÓ¾½l¯-+O£·@ ŠàOL|t=Íí]bŠ&eišø)0xÇ ri Ž )ô1î ! H.¸9kè!dý÷ùöµ`þÇ0hã:Ý¢%çª÷z-V¶`¾µ‰ñëU¸:#nz‡óè÷¹%³DÒeåD¿ôºTEÈÛÅ3Û!Ù äS‰Ì§‰t­u#@sŽ®G——®vX½=¥ðJ;ÓQ^iq¡å{¬•b,Ë-r¶ž»h§YcÓ Ð¶s¥kµ”":E!ˆæ4©ÚWÍ{Š0„}¥ýåkf-T00BÄòÀ×FN@³ìO0´jå3ð² çFë&FE„°ñ:™ì‡,”:WÍuõ’"@ Bs” ]îÛ«@ôDt¾¦) ë'üjQåeO¹…ݲ¨¶ Ëí¡CÎìHк&“Åä#ýÙ‚-L3€ÙÒ"¸öýa/ë±/‹bKQ ]ô:0%YG‹ôY›šæP›PÀ©»†ÆÃøDÛq^/#–¿8“‰1›mV˜ªÂz¨HF÷y C²zæ4Rõ?ïþëš>TóLG{æËÐ% OiÃÃVW[WJtœ&JÊà©Ò¾®SÕà}cVÑÁ³T>oœ‚T™~«†­xÀô L;(–«K p²4àˆ2'uCU¾Óìpž&ÓjZHNO=¯Î•›SenÄ«q;‹9Æ<昦òŽÛ̹Pnx– ã]c5×3Ò)õÈÄLahEyüc†ù,ªš«ùFŽ|e}Dvãø@ä«ZÑŽ|¾pJc“Ó£žŸÃ8gÞÁ…ËÅl N{mw°Wœ4ó‰ö‹â(Ôeø 8Fþ§1$Q¨ˆÜ¤†½ð%é—¥œut…!IRì£'%©²1†\J@rÐaB:/‡·ð'™§—HK¤ª}€~»S¥M¤ÉÝw…θôè1Ž-Ž|J' GÐY„á)©~yÌÔUšŒ^Ó\@LÅÔ ðøÌ¤¡+(¾¢Þ!è!åÿdž(OêiÁ¾Ì*^Aè%qƒô?IHhx¨2@¹[ÏÀµÎuŸAú=‰ªìdÎɃDdu¡Rî ²Åò0ª¤‹K“¦5±mâNψ„̸–“ÏꓶߟTæ>òa‰G‡]:£"P#à$oÏÛÁ,bvDZk°qÙ œG{UÔ¤)x»ÿð‚˘{¤‘>‹Gë”ÅÖA2>??³ÞÀƒ°Št#H0²‰7@„;%Ü#ëÝïX1Õ.ý¸ì·ßWÓHè˜0(W­Qé)ö,¯Av{»c\ä9æpWœªæTÊrYD gؤۚvD€I¹Éêî|€‡û°Ù(¢3GŽ.p(ÜKŒ;è}2+IÞãÂg3ñ;4°Šn«A5¯p7NÕJgÔÃÀ´»p¤ÁéDM&NID;³sÎð(áÅ«;ùøÚeW¯ Ŧ¿éò˜n|ßKX3¨´ Öˆœô„ üxTvöùE"Àjb3忈8ëÒA Ô&^Ï|¾ýŒÝo0€|Ðèw+î퇸ÿlW”ÊpècË „7¡fñ‹êò¾Êíó®Lšp^~üÕÝö^°ì2*÷a°p /ü§¬:q<Ñ[+iØhÀÒácPýó3¢ÓoçðÙVF9†™0_¥Ûíþ†VóŠª?Û—.Š·"ë÷È.½ßD¦×?ñØ^^›ÐËÝx´¾q~içü¢“í+êüäøÚã¹J¬ÿ>q_˜#_>#òŸÓïÿ‘y¿ù'£iü/[Þýª€þq_!ñóoï%ß™óñ ÊßX Ì/ü_üêñ—æë ð+¹èéªÿ¹ßOqûK{þ_=…wÇØòèq°¼™,rѳ–`5IaM ðôéãËaÌkÿµÔá)÷Ð `Øu" Ϫ˜ã¹/°h–úÎË èLÝ'û%îÀèþâ/¡¤A@‹zW*æ.ÓHA]Rö!~rÜyì¶yoéG‰h KñÇAF¦­~:Ÿ]Á“HÀcsù‡b¼.Ò°"ã[‡ôZX¡ˆ¤ ·´ƒã•ªú‘2Ö¥*”¶HÅ > ‡$ýÁ~ßs¢  L"¶ûå‰T‚”Ö=É@$/|i¬ Ü}¨‰Oª€1D,X9ó’|«=޳©?ÙÞT1 ¦äãÆÂNpy9ÚõgE0îpnºã«*3¥ L™6UUHÏ.„Æö$9†!é[ÍüsŸUÆ oSÀìx’ š3Ò3L±ó÷öÿºˆBÂEDô#CÚU–¸ãd³ßäZIRÆ(þ2vµZ®bE³NWo1RÙ~´%iïÅÓÿÀ.Eiï %ªjµo%…Gëã >}†3EIh‰gmꢹíÀÇUSâ&åQ—ÙôVù ‘ß“Ëä3÷Ù©“‰B.ƒÚºË;¿OF„ š š#!„Ÿ‘Ó¢æQ÷¨èä=μ)Ÿ‰Øi=4\`C&:4ól >¡3’…3Ï®än_œ8 j¢€»üðÛÉߎáUª¶!Ű›DX+·‡©Îç?ØK£t…$R6¯‰Y^+wº¶Õ [2ŸÝqµn&Ôv2KpéyA@nІdy*&>‰ú”Ò$­j—ú=©%V*¿Üô\@¡z]ö›™©©Id‡€¸¸Ÿñ‹ èÌyY„@>Ì®ËÔ¬´‡Ô—ÒaŠ^ÓÀ²|Õ`:½Ø•ëò3šÚïÿöo ¸;~ÞáŸ0P"0”?š'£–ËlüeP«*]SxŒI¬þ_D?hU†)Ÿ‹$ZÀ}SóÂ| GŠ\mlŒ‘Ó  ÈnÑ|¤)æÌ³»£Þ BTƒ÷³ Ê·¬ú‘«JòAj¨4Žv]i<¯ªv’¢/èÖtDU²)VNAbæÏH*+•PíÂŒE­iÛ/P¾ãaè×4ÿ×>Á6Ï%¤ÅÅ$~´&áI©þ÷lõtB;Ž)ÕôÒÀõÚE¨Ùí>É3nÒ8N1¥.ÍF]úT“pZVÑß&7{ó€/ó…ĆÇ-êù0u”q²[mI•×80kEFôD¶¹‚È&¦§g…#&~—,¦ìPÿ¸>Æ{1Öo¢‘–s±åZ«jŒôÑGèe’wˆ–Ÿ ›IÛ¥—LÄ/l…v7!c:9†ú™‹+<¸ÙÕû7…%䨂ªB³Í¥ º©vºè£WrâœÒE¥®ª th&Äö¸çȘ”]MÒÝ‹»UÄzç³É»`wÜÖ( ¶EW¯ÛÖ~wMWt ­3ñ)ôêñð#ÄìÑÙËŽér>² i`èM½àÌ]Á& ™Ï2´2‰ 0´­\3ÄyU¡N ‡³_žlÍ$;û†èÃ’÷¯aJ¨Ê…6s©f{€öÂÅŽEUk½ ÁóuUgnÕMooíñuMöýJù*$¤Í@h465Aüž+æì[ŠíŸƒ%Aœ^÷#/OƒªR+J Že[Ó“¡ÉüjÞL;~î¥ož*³IÈ¢ãÆ'SÕWsžÃr|7Éç…Òsœé‘ö¹Ôõ”Èùð‘×ó‰-˜‹ Ðú®KL쩌ÞV@iô OÞH–nŠfç þaªîÕ)[ˆŽöZÝ}13ÿ–¼3A0}»„@¦Tw{Ò![5v±pÀ…-Ñ*]K6¡AÚ™F/×›Ÿ·¼y‹+#ò¯?ÿµ?ø‡ü×ß|üÕÔÁ ˆ_W¥¯õ//~3EúrâÛ)_K]¾ýñÓI"õHùx „ð:2x6ù&EXYë}å$«öæ…þ?lK}šõ»ïç¾R€Ž?”WöV¦3ùc™jß´ð÷Qøumæ×Ïêë×Þ>é—y+#æÕÜ#/ÍygL]FÉ«kV¢%úöT”R>“j¯ó¹²X ÇœÂF ܽ±™%åÄ`v">>.FšÎ^KBäZ™åøÃþ›à ‚Û.Ÿh 2"®ë2³p—ÖqwñP+ sê¹å5Y-¯—*G ¦ªâr´˜FL/3'SPìÐñ*áâÓÌ\¸˜If¬Ù×DcŒ‘ŠªåQÑÖíÙ7MŒ²*ÚΧ$U6`›-«?Åz9c„ŠÙ­’΄8ËŠØã ydjO"Ò°jóý-C–¶Õp«“SQúÒ*O¯ ýÍzï©ëâWˆ{”á8`õw¢mc•X˜7fˆ‹\¨¶ÃÛ\°À}HÕ]ÑS«©·¶¾Æ]}%º0WDÆú7…_/Û7.…J|: díë‹éã«ã®ö%~{0ùPý¸Šg+ I4L«>Å ГÇ|HêüT'ù¡*ˆœà\(D}b)7㹂îõ¨ä‚ÒC®f'yCôÂÇ2ŸÙ>¡buMëKC×wŒOWÃÓøRLª £¿GS£@ÜÅÃ=¿úlµ0ò8Í,zèö”[JDS@5<Ð5A‰;(åˆÌ6Ñy^†§¢ˆ\¸5ê<h_[ÆãADU#"Ihý4ªS¤JF¬ÐŸ¨ÖPg¸³ BÎH(xÉ3|h—(Ž™öa !A>þØ„Ã@…bªÕͨª0½Ì.5½"Üo¿5òW ²#4 ¢f0 ϯB?>>€Í)"§¡Îò¨š^ú›‚¢ffw´®®s¿ÝIþçü‡îq]&wj |T{| ,fœ«ªbÈit‘²,øB›ï×>(g¤šÍr±yåL"a)Ef_½¸ÁÜ£ÛRµO­õè2»®ËLõ¾ýÓ½‘V‘h©+ckCÑÊ,RBíŠüþqeZ㾓 SË&ƒ½m#éô¬â~M!é»A ž[ÜW+™6a^E¼c£‘¶ Z<`Æ„­âåp;>oïYNØ2«UÙÂð([°‚‹.3úÎ<ÊÍ.-³ºÅDT›©ù§¢§Y# ‘Sº…c9 ¯Up¢}™ðÄ· ¶>‘üµñÕy‘ä£KR¡JCS`VºÇA¬K±”J‘Õ錚ß\f×Õ!†DL)&˜(xYì—qHhÉˈHWç&ï郜qŽW’f¯ !°\È5ù)Œ°= .04¤ðn²ŒŠÂ §¢ZOé­çh‰a|lq5çþâáîü°Ë>>>D¨2s¸¼(‘ 0‰XŽ#PˆÚaL¬$ Qµ¡šäW韼.ªk' HãÍíÒ¤t7DJÜš›<ùÄ-Y0²ÛäQúŒÐ[ˆJMzÊ€=N¢œel‚Yr½ùO B÷ö\Ô®¡Žg{ÀqHP¼½'Ê0*¦t'ÆÖ¶ñ-±Œ ùC÷%û|«_DõÌ{Œ‚RVúÜpÒ)Ys{Ž#:ÄïÚ¥±W˜BöìòÎŽw2" (Hñ ÉÝJŽjV65­sH63–€b_=b©õªÕDºý%«ò•ƒ¬ÊOÓR®'òx2Š¥’G‹ª˜hqV‰˜BìžJ¿Û}\ÅtdMÅTäN¼cÕÕˆ/—,}æ7 «I´L€ˆoO潓ãÌ›åyø;§S‚GçÆ¢Ah“qêâÍ*˜ùàÐsy`ãfؼ\ªþ‹uùØéOÂ`bgý)Ö˜ªƒ´±x¬‹0$³k' 0ùI«9u1å9ù‚IA¨¬ ác‡ÚÑ‚s£•nN`µOF•ÛŸú'ÖþDê¹ÞqÁΡ,à Ñø¸ãdëäQ#° VlPÈAµ}s/ ’ݰޓYý’'²åáBoý«¨5=¸¾RÈêâ]ááù"°þËgyb£»åˆÖ%Ôx¡¯2;. SU½ïÛƒ@˜WØ8Ü2{ d–Øá¿—R,ÇÙlê£|î_“÷Ž¿ ¤á*›Ó~£ÖJÐÃEqô‚ ¾ìiF &#^NçU]ÃÑÚäb³Ï“+ÇI)€7\œÛ¿ðxkLh¾¥ÀÓSߘ"£f¥p¬ Ë8ê"†FVEm;qÈV‘Rf8iBð>WÿdêêdfÌ3ÅLÀ‚Q÷Ž´]6SÛ>qKR5d?z?œï6 V;ý XÛ¬¼fd0JŠÔ²SÜZrˆÒÃ?½Læyq_¦Þ芡ÇÜÝ7‚TÝ‘t²ÆùTô²Û×p^ù¼zM… ¯ô•Íß ² =ýZÌÑNҸЦOø4µO)]‚N¬Jç V7~4¡)åAF¸xõ 󬥪\¿éjr.¼÷V}\GûÙÁFcÜ?üuƒÆç‡nl¢´Å8ºƒÂø°Ë“pû}ß¿ÙÇuŽeeˬ"“ǘ0õq§‡wøøÔ\÷}wGj¯w9 ëškÕ T¹¥€$Ûk,Å«ÿãU_K‘ìÓ¬ÿ0‡Ð*IHÆ‚¥²ñÖ—ê§G~¯uäŽP+A°NøÙ(Kq¿…"•Iˆòj Ö^’YàÔ²:š—VÀÓ 0¨>.ƒBMxˆÃI¹#ÔÇ¥Å;¯¥ªj×u™htÿÌÏ[Ínf)°BMO•tÌÕô#…³ ·¸’TÑ\]3R€ê^öHl]Cï¸ÃCTêˆkáSŠëºˆ-ðÀÝøH\ÜÑψf Ô›«PkcBz`!ˆ )KîS‚‘¢e/©^)¶ŠL/Ë<À]ëb=Z)‡÷¸U¡3ð¡EÂkò}©]P*Á4ÇPÕP9’ÏÛÍ0(® *Åx+αxì¹SôzPDUS‚«‡QäÑЧÅéb„\ Uõ²+)€~þ¯¨ƒ´e+É?÷l>^Ü=Ü àÒ3ïO óöÄÀµºÕbNÍpU™¾ùH™¬fxYwÑû† 5ƒ œ–£ÖjgÀ²‚ˆìöÓæ w}”šæµ-…ωl°¨ðBŽ‘Ò­cƒûí‘ÚcªÂjmL¦Çé_‡»*3 $d÷8ÇÊP™N™s©–ÙlA}g¦&r`¦–Ü›HϽöö›ÝÏ ×$Ìç‹ZežSb),0˃´óõdï@³I¢;0jÛUŽS÷+~ËÃVÙ›ÎL͘ӪõLÇcÕmר1Ú&ž$wÕdCτΔœIêkó5+2ø’O]"v:÷ Æ«É$¦wsLÐÍBY@†ãªø„Qí}@fŒ$hPj”ã«Xì(Œå×Ï7o¬Â˜ê¥Ò‰ŸÂ—åy%?«è¯@¹vBÖs †ªvùrËÕÈ‚ñ‚f E4Ä3&a‘¾‚Zðkre5Û;-¢»zÕ‰áGÒþòc!¡å8ÝiKÖ`Î:´“ Ç_Æìä¤gW˜øÎ±;g©<%”Jµ z0ÐÖúDÓÈ"SÙ¡U׃”pØ‡Š© ÅáɘtÑ ç÷Ÿy–`'wk†[ô6å×Q ?>„Í£êãTÒαŒUa½cäÄ3•½#ÅùÐc1@é÷z·yU0Îø¥Ïm1™og7|sU!.¿·p&G¿…ËÊeÖÅj’£H)ý´8bLטÈ~AÏVz>*IÓEe¬&«6Äó´í_5@¹ñÀ3aB7/á¤ÑÔä”÷èÄ—óЇ¤ÛòÏngùbO©…x`– ó’úâYg¶,ÁõЉ/ͲK¯üowV÷K~¸õc'yXàqCôá‹5È×—¬è 7Ïj`”GÃ\äxA¿·íbÏ$^´|Ù?ô hãÜÙÏDsõwýôÚÍ_ÖäùNMüK ¯;ÆÿöÿfœòKÑ¿ø—çÿâûúé¿ü•»ãï‘Ïù…ñ×F¾gNñû;„ß¿.¾'­…ÀÏÐ>+ª÷¢q—¤Æ®û9!€wc” ¦Iº??äD´^›€¸ççƒmÛóþ ­ù4#-18ZÖ0뾌Tg¸±GàXâý±|Ôÿë Ú<òÏÏâŸ3€”²Éã;ËÀÁú«ÂÞT‰Î…{yˆi³ØÑŠû›Å(EžÌì¸ÒXÓ5’0Ó¥§‡=˜‰ÖñðWÕ¯"þñh=ßpe¢Ki“–*†œj÷é K¨þNúDN`£=æšáZ-Ç(óˆR$žHÍ 8<áíQý†«ÆA–Ñ#éçyö°¦TuŽB8Ÿ¤#c¢aÇ5ìä•Ì_ÀQObêt$‚´³}°sO¦KSÇ–‚Ò†öG'Ä&¿thžý¡s-?YûI´£ð=NÒ9id\BºVz¤–³Ñ}r$Û“òx^çîJQÿõKÀÉÏXUŽš'êÞñqºàT$² "s-ìÕIQÃGvªÉsÐЭ)WÛ5ëE±ŽK)«éef%,t³%%/hÓäÛÂ`ù0uÜrìåug¨iˆ$­+.ž7‚ª¥iþÒ#ÑD– F}²îÌúÇÚójˆh~)á®jYvKð‡ˆ¥×ù‰‰\¨j\Y^æót¦·œè³HŸîBÜT>Ÿ.—ˆAi‚\’Æà¤óÇ}û¹„M*¥Sp‘w&ÓÿÏÞ5©MÏl„.µñðrlFâzSZ4oB¥»ƒ(•­.Îâ•w„©Å>†0-ùYè|çèͽGD,7^_ÑY>›“7ƒ˜(š[Ñðá£*Xƒ×ÓGEqßqIõa* fF¹#äPEÚ0îÞ?šÌŒ*š?ìR âö;\® ¿/ùñãS"§1×%¹ ªÊ‡Ù¿ÉÄò›]¦Èzb¿ÝAG³Ù׃®I›û§ßI?¾‰O¿ü¸I~|En÷ð‰¶&º*ÌNçžJÕ}‡@.»Ô4Û<ûZC8@€KÕƒBªjfb>²›·ùq%svÁü,± qÊ{3Ehq˜Ù>žç °šª ×Œ¢¢19urJ  [•ŠB)P3ƒ~\ j:î¾}r÷ª@ÐìjµD<™yRUš)Ý7 ¢öLD©6&~æåuÞŽÌ HM¶¤²NòP‰ÈDÆzraH ÷T;LÕ[¤æ¤š¢‡Ó­$ëPûdê%‘ÝQ%ö¢,r—V«Yê¦æí¡šL÷Sƒ™[&výXº÷ZžH…Daþ¢‹-»9ä¹+^F•±}"çÎ÷}Ó,篹"4’§-H\Hql9köâåÕžªŸ|Râ(±»«I!¨Áx‰øÝ# ÞY$ºEOs}?˜:u‹¬ÔÔùç#ÏÂ’¥3ØŒ;{Ûÿ_öÞ­IŽäHÒU5‹{VÎÿÿ™GŽÈ.nzìâY4H93Üî¨Kfd\ÜÕT?5uåÀ¯ )ÙO”¡lùžó©C˜bµ˜£au¾[)uD‰›Lµ-²^šm.Þâ h$-–´jdg:νÌDjné |©ª×¢¬¤=DSñzÞß³y{ᩲ±K–¢e7kÀU¯UƒÑŒ.\ߊXL°l/ àYDÚáXµÛ9Š¿tPE…°î“­j‡`ä°âÃH1QËä.ˆê-ìLÓÂèv ‘Z=)9–§¸îO+BT m.‡E9§A"–’Ø#ÛñÚL õüÄ,¼;-§³¾-ç:#ƒL–ÍšX°T €©J†÷»®•h®*k²’]»;ÄF%õ~:. ¹(WÖafQ®éߪfð§Õæ –B'ÁÆ…ÆÏ„·ÉZ™°¹Ë¼s½êxT´á $pS~šlCÖ7YVGÆ€@t‹o]k&*FTæSóx0åuáG÷µ¾òÐAä8îù3Xo©’AàÙÒ7jŽm5…ðËô ìPÿ¤Ÿ¸Š‡Ûÿ€½ï@'¾J!Ý4vy‹Û^}:¤½¼6Õ&æÝÛ¶§8šçü™~ÀŽ%ƒÅºoÑ¥7öi°‚ IDATfÑaA¯?[ Ùy Ðìâç Ï÷º„yݱ0<…ÿ§zÂ>jøÔpV~åÃåsf»# oH è7Ïð~ KÀ¼±€>Q?¾àüü€üÃêóÿ€®ÎR*ê–þ§hü7Ó_ŽWü$ ð' è¿pðó1̯n¾€‡}᯾¦_úø\1òŽz×<µý¯^ÉO(@äç ÙvîS:çW÷±' ÿ+áþÁ\Ï8ìñe:½ùç­¹}ÉÛ¥+ì¾o Ju󞣒ú©ÿIŒ|„ ùj½½Âögt ö½Øpò~GÏ3Im!β)â ¥ej§0A^LE âXY”u³[©b)–Ö%?ÆUœ›(i$F›¶÷6µo®ƒ’!Zwt‘]m ÿ~†z@ÐòÀTæê±®¨™ûæÜœÆ{­Hí½)cy"üÊÀâÊYéuù·oqc"†¸¤}?.þ‘Ù3Üà}ûu~ÐÍÒ^ÝùšŽ¯Yá«î{Ýk¬~­ Æ._B‘·ÌªHuÔæHðEå VHgÊ›íŠaW\nTu+'°ã3Ç:åÖ«°;“38rç;¯P%žìO6oÍnnWÍ—;ÁWÉ“´¼ÕlžÍ ®½ôKÌEß«Zœë^Ý]Ô²—˜»°”boÏ„_æI¸•±É*Á|ñ,3œŒf\+ ž<„ˆÐÕ° NOpT @ÇKq42оd9Ÿf¬Dššc „•OÛKß¹öLzæg1 "ÖÉ`´H6ÉCÄ’ã—lH÷¸e ÎjD^Y®ñÂîHàÑáµk2g=½-„ªÎ^E–cïªãª‡w¶D%Dœ>˜Ä‘[ŸÌyó[€%æ¿—Á+B+šŠ8é³ :%Íÿ³Š Ð1pôê˜Uv3볉ÇR]·c·”CSw±ØÒ›wrÆISWMZŸ¸ZþSä‰ÒƬ#ûuµjx˜£ñæN–}õr¤éƒj)cuFüy½7^ŠO®‰~Žzm I·q ñùÁ.ZãÆHsyzJBt­îyùi‰Ì˜¼3.ì voäXçoª}†¨¹L=8ÃÓ nµsaÖÃuvuKÅ.?ZFê8¢ “Xšg]W[Âlg2 ä©’ ÿðͤot~¦…9wׇE©Ýé©feèrRi½{Û+³.e}H„çμ.¥”5rx7—Õ§? 8w iRQµçœ±â14­Q‘¢fÒ“œn˜XM©·:¤ùMœ]K¹Ð,Ê6EïV,ŸƒŽEíPæû“œ6ì“2¤q3}g:IòÆÜOéé¶'Ðæd»RÏ]'š4ƒµëuÙ/„ÇŸšËÿ0o[ÑÙÅ—z4+?yD¸ïñ¢ë 2"¶]ž»bO+êvÅ.­7<<ûÇtôÈ?ô¶pî¼ê*:ìÉ8ßîénÄ@×Ó= ‚«ß¹Š-„3"ÿ¥^ö( p–TœõüCÖÇ{O€²×cîÀó3çW gÀ_q†Þs(Y÷Ô¶~ãg@¾žüÓZÞ éÿÖóÏ£üºø¿yâʬ†?ù€ô¼HÿîÀ³Êû :÷™§Å/ÿö×FŸGxO‚òêøãŸ†C"Þ÷¿Î ¼Axðµûòîñyï~£úð=‘0TPr*SL!òL)Þü^æ§d_¶ú'·g£hô? ¾±þ÷¤cÛ ½¦ª-"¾.˜ïãmÖ³¶°´œ.–Gr$ƒÇüHÒ5¢*< 'f_̤ée7Î&†½/53(±>k (“u ÞµmcW13= @Ûp’’JÑ…÷ü§ÔRNƒ9qëhl„öHâÊŽ9 @³ÚQV$¿™ûÜÔWë¶ÌŒ‚%šm^lô6Tš†âM‹Ÿ‹:%8ÎL ÕÃQX"î×v½#HcŠgSÝw0ƽdWݦ´áÛcÝÝ™EÈ5$y¬˜Ó`³I¾-ƒÛ‰ ^çJ4Úz½d·@m¤c“th®uŸ\¥'k NÜkåIjÜvv¶^OþŠêKþjí4A²€5§kŸ«£Í޼J^˜]–•›+µ+³‹R“éfÌ–6Õ'"/¼aà^šÚÁüh­ÓF4*@gö,'q&B±¨ø„së‡IÖ¼Ÿ…ûÖ£~£kòŽå…°$Ý+„õi¸Ûû}¸K‡U¶3騧ðúu!‚·"ÖËRżâûÍXðì"$>Ü×Ò_¾’>W0ÓÿF»Ø9öR»ò¿.J¸_#_æÌ c0Eú©µê›C€n!Vù9ýdÏi­mMÎ’®e¯Ê-Óâ´†@ áX+¸‰¬9¥ååÐ-¨k=ÒâÚ‰O§¶\r‹Þ0ŽW,Ëíéô¥(í1™!De’T®ìÞgÞ+o%.({ÑwšÝyˆµJ Nw·hb,ƒ1VÞoªö>€µÖ«ÆG­\òàªWhÖ [¾žPÐøññ øž(‰FäðÊRn Úwï#+íÛÇÇËÍè7.Åú?0˜»ÕèFÆ(×Yäáˆ÷} øíºÂ²PW«Z:Ù=;qŸ¢Ì¨ÐLJGÂÈ Ë‘Èi°*FÚ%:ý½9_Hz§*cçq4ágÓë~fD¼^/ß¾}»ÜÖZüÊ·ç K”ºp¨lG(R9×|:g0këÿ0·PW³‡ÍµœbËÛ‰ÒN–Õ£>hÙÞK2ûË_þòü¸ï{!¤ =Æ»ÕïÞ0zµ€PÈÂPËÆÏ¼aÕµwó»‘ ènY#,è‡V‹«¤Ü÷ EB®êûõ0þÍ«Y‹ÑL‚Ð’qU#tὃìûë.lñfž%5T/(\/0óUÅŠjf(};V’“䬊TñŒ×=H­ŒkŒõº05I^Eré¹^Y\h’™¶l¢ŽxŽ:zÕ -²=þÇ&¡A|yìÀñ$2’5Z²õ¯>*v¦½bû}³k:çW6c¤ì’Fä[‘d¬HV‘ö“+u$6_uÚÏÎ$í 6í<æÈTDdoÊ.Àʦßq7ó´'»5IÌêý²Í殞ð ‹…÷éÿÜ™^iD[ÂîùO¾hELmÈ£è«Ö=ìšðƒË‘¸Ûµ»Áß§…{Ðã"l5.KsgóUËF“‚ÈÂ2’Ö«qû«Ê¶%^} »¸!ÑE)tE-ˆN‚w Zs×[Š™%žž™ƒÉKõbï,T››Õ -û²ÓZ>-ë,ÒfÎ2‚ƒ»:vy¶ïBc¯®«ݰµèÅ Ú:Q±yýYßÔŒÛÁ—a‚"æôË·}cº”ë˜ñwÔº7Ƙ•·¾™låÈ0ãWùT²zìÞ1½NÖ ƒ\E}æÉ#=tlj~|byk™e3G'?;z¼pÎÕÊc—¯j¨¤§W»4æë?(õN”W7tnéÖÜÃ-ÎÞÛRCœgc`oRyàø—ð…e´»UöÙU(¬ÔqPë,ã1îíŽä™Úé 'sªÍ»b°jÌÑ5æÚ-BsÙÚ‡öàx³Ðv~u+U:Ÿ¬3µœ¿ÜÝx5dNT~Y"|â´0=òŸäS õ}>&hGéÅ;7›üÂæ¿/w꫈À>‹Î¾ JŸgŸÔý_!ÿFÝ\Oô“}%þxxñÏwÓÿ{Äþhð£(ÀãÃä¿×Áùï=¤ùõÀÏ}øïð~~þhOØûÔžËÆ_››=ï‰ïMÏ…ý¶ÿàèü˜Tëð½Çý\,Ìô™©òϽCüGÂ׉¸Ý&ò6ð}¨£Ù|÷‹Œ³ex#ïï¬îîb=Œj{5‚§´¯Ç `öFï3€ÇQý4@Çcõ £žÏnd Fw½ÎŸÈLgV{m©í8äù@Ú-¹ÊÜåu‘4‰ˆ[Ó{:¬žb“î=i¶ÆWóç³ò·ìcgÇ^1$­Ø¹É¼èüg4‘ ­¯yÅvër:jg5²`¢|ßýý’$—Ù+”µRlw‰Þ.ÒcÁ1Lïk±Þ¹C µûžfT)R­Ö,ÍMÚŸµL%BK»YqŸï¡r­V0%Z£$,¦ü¡1Ü2®÷žÛ]70¸™÷•smñ)‹ÐDWG:¨]ƒáS•U:¡<%3ÄT–ÜùçinHâ\¤²1Eî»;ëî[îÙ»«è&â"o{ˆ}Ä2?ämÔž eJÓdK6G%eo/ wW°ƒŒ6§6ó"éÿ–CÚ¿ºë d\eôHQɃ«å¼* £÷ÎR«¬Â¼’&½ýµ{|’Àô|"(9{+p~Ž…°¡ø1¾H·æ¬‡Awè #¯‹ñÝâñ¢ˆ»~»üûW@±nfLCöqÙý=îô[k z¬dâøï÷+Eÿ¿Ök-ÀŒ\±Vж«°_¾, 7‹LŽ [¼†?x­è̶·µ¢ÆŸº™_Ž E†;³&Ks/€«Ø.ÓORø—ìûˆU×–¼ }ZŒ6Öîî8=s!;–!?ÂyM÷¯*3>DN\¤gä„‘e(ñZ¯ˆ€.zW®HнnÄ]*ùÄi~ù嬳ÀXÕo‘CŒÕ×ɺï—»_ׇ9/j‰‹’>ì¢6Á?ÖZ‘‰üÙZvÙüö›_~¿¾'¦ªN#3Ä=¹XNÒë~¹YQ‘WX7™f½j4ŒJèÍU9.…&ÔSÏX±, ë^"äÆ|B‰ÅÚf_åû’ñÍÚ›×P‚ Œ­wd°®7sŒ[Æâ T†Ü Xœíö ïÖZ–~ÖÐZuï3Xj[4õ;Ï¼Ë ð^’­žÖsŠÈû¡ÀߘÑKX~ÿœþ°-Sk¹zÔÝxÕÃ) gb­˜žy N“aÝ™Lê¾Ô˜˶á2„ÕÌ"Ýq¾OÝã<ÒyJ3 ,&žÖ¾<¢*Ü=ߥ[‹×Á~.¦N¤±-ÏÕÒÄpÎŽÅÍ/~ø\í¬V]¶u}aE=Hç”tí%™¶˜»Û9ípELÕCýj6f¾ÛPÕ\ë ü³&×m›Án‰Øa8Ìâï)žLÅE‡Ð¶¥–sbx™i†crVÒçñ‹z„zUæƒUOµ(5ßCº¹C»ÓµR>Ä:l– …UÄs÷7Ž—ïb¡»×‰8p¸]Å:cÛ€mÌÇÎ<ì Å¡?õcÛÀ]êÀÂôÛ,:C}œÌˆ¨ÒìZäMÒª]H9á3r~oËÅINŽY§uäò³º}6óh0?»=ˆò³hÃ!›ü% 2 ÚåˆÑÀLO'RΉúWÜ Ö²…þT·Y™!`bú¹wëD™jWaÜÜÕ#¾®mÕ˜Ì1D)«ì1~µb6&èŠW²R(½W(WZo’4*ï¼ä cÏŠN½‚{Y2̼™]ÉŸ³«‹G7“¿¨Ö¿Ö·Þ ­¤†û¦LÇšUóÈ4á,x=—ÿ„ :Û¼•l>D0îÒ¶ùÇ®ÔÝ?vX©ûúoQ–{–ûèWÝ»}e’Þ,Ö§Áð]ª›ßÈ£ÛwPÀ½ßŸø¤ÑO'õÑXp¼£´aÆ„gñsB;7!jVžgŸÈ¶‰ WèèHÙy¯~¹51íúú¹‡’€ÎÏŠ‡tÂë”»gp"¢øHJðdBñ!ðA_×çNL=·¨{^Ã#G©·'Ü;ëÿ-Âýlœ­ŽÍó—–|žZ’¾ÐŠÏ´Âs<ò3óï߯s×øíÀ!ƒ~‰úçHÑÿ–2÷/@~Þ ðéøü9 ø—4~a>õ“ôã²}§Ó%<ôãáÞ9¿ûé=á Ðá%orõ¶ùá+|?~øÿ~þ›”^ïñí»>͸Ϟà~e†“»…nÎî©­?Ü&| ìúu> L =ÆüTýÕD¤žŽŒ53 {¼ø&ßôf¨]b;ê+žöª“€ÒBšcœ"€k2¹-23´"p ×Ëc1ð“°âÃ;ýîçVÄbDDê/{·-ý+”_†¦á(1K ÑçÇb(üSC÷9Q0£»MB° ²»á æ¹,Lͱ–9Øf‹Î\Mê¯ÊÚ§\I;)–÷%­2Ò?tfîÉÔ«b ¤Û`eJîÏW= y»È;±€÷ykí‰ÈES -W<®*ÉX‘=aÆrRÞ¡XrÍ.+H¶ußud_t„™eâ{·¨2Ûkã™ÐÒÖºo±ÔÓòïW¡pºÿÜ^½Ø~…bM 3;1©`n¨’VU“'ìU¾„…Úú†u.¿zû›&ÁÑü¥¦än j ·mXÊpqyéœc«Fÿ M W;îu¼Ü4#-Ìu•n*Âd1L}ËÆ¸Õla—‡‰®ÕSÏ;*u~z|?ÉnËÞ÷ãÉuÉ©Îʃ‹}攟(æÐPÀ+\„>Üh¼]ž~MƒÁ>>ìãÛGñ/ÞwÖSF€æ´TI|xMJ.«¡$ÈV"NÇ&Ðê»ÚR´[ÇhžÄ¸qÁÛÒiˆ{åõfÉdx…nCܱւYÌr¿>ÊBgX ÄHpFÄ’r¸h»Ø#ï«pº€LcÛ6ÙóD†ÜÙ=8JÁzKÔJ‚BZ± ^2®nÓ+…3Oið{ݯ|­³·©9q”\Bùe0¬¬êU„çêWaÅ“2âk¤ø„Óìòà·o¿ý怙­{ ¸.»üºuǪÛnß²«'u+3Яo„€ûû÷n¤dEër£G ¯µðÁË? ˆX\k­%á;„oñÑIœæ@õœ…– ‹­Å’4wÌx]—›­LÒ4KÜŠW¾Þ¶kÓÍÌ,^Åáäk*Â9ˆˆšír XùÎÜߌٽÑL䵿×eòØõû÷ï¿ÿÀÇÇe´:Ÿ‹÷UÓöMÖƒû¼XÑ KĈZŒîk´r£#°$C |ªô Wëðû3˜yz°_ûÏŸž*ðÁ­Ò™mj,B}Tˆ¤QæIg¤r£fHõîÅ\Ñ‹®¬ÃÙ¶_ÈL€¶¡'k@šYŠé5JÒüü¨*3Ú§fô; ø\só›38{\m·†ÖýÐÕR®’q_ô.@\ˆo‡œ»¤ Ū\+3ZÐUaŽÞA™Äº—UU4³øàXUDî,àÖ_yŒsÒD-6k Q‡¬¹WìEc‹çŠ]ž=¾(äøsö9šVc` ™ë®ëÁX;´çM è$ç8’à }Ð@ºãÔ9«ÚÝÒ3,Ï€S8U™ŸæfœMj`rºjV¼gZÏÞÞ“*¯eœ6‚ cI–cæÂ"U:;Qú±Ù,$%ÁfÓßä•iÝ©{³vëç×v¶þɺ~ˆà zúHí°”áDqçÔv»ö¡Ë¼ój˜Þ¾2SBŒN*k53¡Ù.ÑŠY kŽÇ…qàº$†û<É…ÓN1bc·ªQ~& gk-XÚ÷œŸHL÷ñ|ŽgÿãžéY£¨/=µÇlb?Gâï@‰ÏžûKwz„¶€Ç¯í»?a‰ ´“ûô1賤öð/G>á^ñÖâhSäóÏ#ÿü½/þd àÇ:íç(ÀO?å?[þáÀOC_ ÚSÀϾxkÙ'¿ÜóÁ¯^ÚîY_ͲŸŒ¢!2¾· Ÿ#ŠQ€V÷c¸AEóoÅç<Ñü§3_Wèë …qUà°ü3Ç+ÙX·«ÞHú›°/½Uï­šôÈ:œœ"³‘i6úp(žO–ŸéÙ+§c²{€p$åo(¸‹Ãì¥47»cqlï»8¢bý‘ÎR—[ì:ÏE¯Pcs‚ª4ÛÁ&›^Am;ÛîõmX‚ŽÅ΀f{ó!7ý.5¨~y.F²Ê4£èj:³Ò£X ‹°ŠÜ¾Í«´eaë­Ÿ ‹¬F¯-¾×n¡­á“ ¶î àöõóYZÁ]Hת Ñ.«&åæŸÎ=Ûƒ"Ï€2„…MQ"ÎÅZÙ+Œæ9Ãj ÒÐ%­[EÆà«.8ýø‰È}î¢ÁqôF *+h–3畤'¬ˆ´½±.H(lÌì"O€«¶•4 h×õ#Òå¬([|CdèÓÉùºWT1‹нª8¿™|ÍÖ÷ï‹pr­ÈÁÈJZ_ æþ!Ýe¨Ï+=îÕ £VÜlÊ–ºûZ‹æ0¿ÖúýûïZZ¸!1p]W¡3À(ŠîWÒ¸¸g²ŒŠìžžT.3^É2§Y„Ö÷@÷G†°ÚÎ{Ã#’"2}Ù)²s«]V:ÌÃTi\"ž›™9  ­ûéõZ‚¬Î*ZQxmAKËZ‰JÉw5MÏÐäé(Æu@ËÌ[9ßûÕ©À}ÅÊI˜œ©L×™ õ=îù”\ç|¼¸#œ$ÍiÉbϯ¹×â‚G6äÓ*ߨÁ¿6ò2ˉo¨[ºZÀñ.®ôŠ*tëïÌÿÚŠ–Ï?s®¥û^ \×Ç.îÞ²¬5f5c[qp *ÈP†]T²§ÛYðìn†H0z±±4IEã@KY½Ø–PæÀ|<Ã'Ì Á uéåIÒ^:¢ÊÒ{0ž‘H`MÄœ“¥qƒŽÙp‹›}9š!ö¢,çfªÜOŸ¬hi‹È9GCé7¼ÆÆYp“ÉnίG]ªpCÈ¢ˆÑì ªGÝ(=¼ü½œ«)¶a¢®(”‘«7iG0y|½Ì±¤]ÐüÃMyh‹ùÛÕ‘<µùOô©pŽ^ßMà*ZW¼ž1ߎó–(ÛZ`û¶n¦X ¡Ôìì²ÎëÙ:䚇ÄjµYñ–ᔠɱƒºá.vùŠlŒ(Ÿÿ{ÃJKAÙ´»ØaÐs%¾–dˆ˜±É$†i3«½î˜jT}C$—™ÍOÞ[µ‚Hå“Ê=]'öXò1u°ŒLa!9;@£Ý+ÍüùØÒR …æbšÈ\ŠÒ`$VUØ7Êòçn3æÞD·¡¤ºƒvhEÚ²hÃÜݳUÿ´:äŠÔúÓ™U°ŠB©c (t”'?ÜÊ©2蛚™OM³ê‡¸áé<bYb“‹®Z¥ðS¡/ÌŸçV•±ò]vhv -{¶*áYù#ƒø¶Ù°·)y7öKŸˆ<;‘>[}ð,2È3Z_Ô¿žb ÷#d%*“¶]€“Sׯå°#b3&ß¿èS‰ý¬`ÎxLo6’躅­¶Ï›«—g`tn¸ÓóE&,t Õ§6èÓÀGzŸ^ãîÖUuu]¡Έ_(aúäÊ×=|N A~ÉÀ×CÅÒDþ>\?TtßÞê$n IDAT¯eøƒ2‚¿á¿8Òòÿeêóÿ w}=øø¢xfHþüï˜ào»tùãñÀ»¿ÿó‰üFëá^ƒ}þ·Oîþ/é\úú7¿©Üó¯|Ëp×Üüü=‘? ¼ŸŸ?š«TW¿Æ éè~›¾MEŸc EÃÀ<Î?›þPž7ùq·ì–Xúl x„ÂG“p`³gº«j‰Þ>Žœô±6AMT¤í'{€Ïò1¶Ûç’t¾Ä«=ãP¬ôÑ{ÝÞ~|)RJWt9m½kº{â|º‹)F3´XG¿/3N‰>žrBýðB¾Î@2ÇÖP짃êE5†¥M£©¶Ç¨4í å´Ñv¸ñÇ—åo¶ۈ΂µá”îåWJi¨6Õ6zëÑË”þ„¥y)I¤p·“,ɾ]þI?8HÅïT·Wqä¨ðмJ½]Yù>VìpøÑ…3ŒkITW¬X¼ÔœmVˆ­'I·B”W•¡•OIµ‡“ê0–Þ[Þm|°tåq§z¹~0³¸nøæXeÉTdñ´Âí,ßHšpÙö&R°ëjÅ—DÄG´„ZDDl¬¬2°\‰êüÛ¼Ð)íÞÒ v0$ÞŠŒBÜ*ù„ñËñж•AÁ~|§E ž`\šwÝÆÜHK.jÏ5B²<Ó ºoD ¾‘4­ˆX‰Ù;W£Àì"‹aš Ìéìå×m%ì—½¹v4 ò:³ßïçF||¸e‰ w¢gåVàÚû5C܉¼b`wæ9âì(ÏÐl_¡d¢#åÖ2é#FT‰_uú]Z·b%"eÉ/Jv]X·“«>K§èöжƒV-J‚¬¤»øÏâåíçvûï´òc+ëFÿMù;ÙD¹ÉhHש“tzMZk‘È>’U´hźï5½¹ŸŒˆû^‚"q]ɉ"Ý,â•Õh‘/ýõ~Y|ï;¶Wç!ÂhZŠZ_Né2Z¨Â¶D}G|_·¤Jq¯Ûn3’î›oÓµ«³- é^„‹u«›«=#%鎈wû0‡ô}(’ˆ[‹ä‡qÚƒ­˜NtaAVæv¥$ .è»TÕ”þõ¯u»Ì,çÇ6±ê^xÙ’¹9Ä×ZkEbê”÷¢PHk…Õ…'FЛ'^Œ%M¬ p3Z}æÉÜkêZ¡ê\š™™ÿåúKöاÞ{öÒ{ ¶m"ÒrŸyvÜŸg´=ôga©Òx©]×] ŒM.Q%Æ#ìl;÷¶­Ó-×uÇZw0P†uݲY'—!Âa‰–U{UÍ:7ØSh·yyeLd2NN1t3ÙU€åÚ†°òê™1ãUû‰^h ÒUÄÂG´QååÏ“ AVµaTQ¯’F]ÑÖì¶FúÕsRY‡Y°¤Îžxšz_h±†ÉŒ²¼`fêx¨5}®á=Å7\ˆôU§"ò$63Éçi¡–²k—§¾A÷)Öíe9 W:ŒÕ‘“øW•4©Û7Ù!' v*ç*†+æáòAsfSÿXk¢,í|Ò(»‡ÒŠä]ÕsòÔ…€Eˆg>¬•træ2És›ºß¯l}Ÿ4#qx!Ö¡Y!Ù+%:;•Ýô(MRb_ʈH]©Qç÷èQã4™,›œ²·¹Îü°N.Ì8¢ œB­dfCYJ²ÂZ|ŽÞΰˡÜïÈÙ f¬ +„!Vøe,!DhA3¶>î*¼˜âàL5wßÛ¹æ¢ÕÓÁBû¨WtmMjvý¦\Šr.Äz$ écÑžqÁšêÒŽèÈÓvërM[z˜”X•bÚkSâÏÚR)²­ ݘ8WÎÍ…ˆcÕÐÝ/—!䬡Î\ÖŒŒÐf³œJ5=gWuÄ©•רÉgdˆ{(66š/&ßÒ'æArûc>Ñì!³ó“j[CŠS Þ{Õk ½çŸZd<Ô^}Õþ¤¬L]ô=€Óxv+Îç¿Ú#èYtq6â=˜ò¨ŠSÿ9ˆÿm–(g¾½ƒµ1Ñ0À'X}ÑúÞ ’Á ™¼n*"yÅÕ1ƒF `äXx$ß`í›C̯>MMðä$ΦÞI‚žƒ³ûçé©<~ü:ˆ»† ÀSIéK½ï!ÂéR}ÚYéµògq€~dÜÕß2 x?íÿ¾ÿâÝxû‡†ö?ÿûÏ™”@þÁ¼…Îþó>€?ßé§Ì¿Òüõ5üÅd@¿0.|“ï§NOÿ®çË=Óßød½×á Ç¯ªÿ8{€?Á|žõ¿_§1¯stÿ{²q†,49/›ïµÝüȼ ¯oçâ'R[áßbig àñ +(ì§H‰ógà€fÏN*(¡ó5<¾+Dýžêó¾’f0âÚüG«õ½³ˆÀZ‚_—Ý\Ò=†ûNîFЪ;ré8-Nwÿ~q%ÒÅyç x1œžÜxdQA¬–µ­/§)÷ZÚ2< OÑvUa¼Ò7éôÞËWäQñˆîLaq|iDä £KîF"®Åèo Òš¢!×trê ÙamŒ%ÝŠ:´1ù¹ý !]Bc®Ï5æ’lƒî[xr(SåI¥¾$Ô0"d1ábl‰!Wÿù?¬ÜcÞs˜c—£yÌoíØ© Ü“Uúh¥›he!ÒØW.ÂÜɆhv‘/J1ÂǾ¸{é ?¼Å“ØyŒ£5DO_…g•ñÓšÃÍ€L±çYfÂ#^úX ¢;-I¶%9d`‚r,ðÜ×v$3[ù×Ü©¥(7d$»ÝÜ ÐÜ.ÏÚ¼´Ìðú¾$yNž[Ërñ&Ö½VȦ »%—:È„·79"þµÌÎót\ ;±é,8î;_U¿éZ3|¸›—.£"Ö}¿î;„ërŠk倌{ at¼üJɸ„Ž•Êt7 Ù}ÐH¹}Ê››ëEéò}‰Àa…õòëC¢ËIr)ô]B˜°o ¡j‡(§œÆ‚—%@§€b› ’÷ŠÖq9'T"jçb-)Vô¯$ŽX9X>ëk›m…V±ëâÉko5¥9/^UÁº½Ód)êfžçEíªï{2wšEM©¨;[3ý"òtµš°3Eu$ô… ÅêSûhàM܈. f%O™\mäØWtÛ.k'£=äù„ ÑmûQ¼£ °ÒîG'"ü1Œèè–w‹D{PMI lG+Jfͳ"ª¶o©.õtcÆ<)5=b% r@Ï#‹–KÁ"òíÈOkäOß¶¯«éØV­ –q.Í„U‡“xkÓ‰¨z®`KÀd)¤Õ=‚o…9ÿ`65am“ …Y*Î9X:Jº „g³ûŸùðàí‹9÷âF±#˜e=Åv­š©nåì‰ ¬+o¾Ÿ5ÊÙ—¶"WW™:¿Ð¬NDÐêž_A†#KÍM«ÖÈðÜXù~cY˜âlºw•ÌŽá8¦T¸$³Ž!' ¨ÓAe. ëÐh=-_.1À÷,ÐN…®ÎÔ|bC#êo½Cج{Ô­ÈU¬UÄèØî5¬uLÜ«°¥`põø< Pqd„UˆF}@WÎrêš—ûèwÈuó>º¥mSÖ󯜿Ôe4úv¾aQ+ íÆÜûTž Av"Ôÿ¼ùxèŠý|¨'o¥S“Ýܹ˼½×)—ˆ›elÔT±ðîyKìAA¤bØ›³¸JVµäˆ]Å]¸Q¸¯Ì|ÄÚx’)´ëä›uç\õÏÃxÝ ¹54ÛqØAÔ"C]¨}øî0“¤:UÊ>‡}h¤7òÀC:Nô»Ò¡ïáç.|Ø-õغϺ\ï0—¦±í rMdöXƒz×—ûöþ}¥íoãî¬î=•¸Ïõ-xžQíщ5}?|Šl?¤Ú®:ﱇa²–Öh‚b¶Ðþ÷ÞpÕר=Žglj†¥7Ž_ÂQxhÿâ› õžp™)ùÑ¿ð.‚K'8ì³'–ꤶ>K÷ Æ“dñ¦’ oúË<<ÀOàúu—òß,‰ê§¿ç_¢8ó_Ô:ü_/A1Ìi(4ù³PÄyíþ9ø—Ì ôË×ߥôçí˜o?—Ï¡~@z5ž¡¯Æ‚Ÿo?zãÿt-äÇ“_éûÇqÛó÷Ãâhc'¾êÖX;ÞUôOø»Çô$òkbëçØãÙô{xB4]Agïïc,<:À>Ï+tæúÚ¦ú+š­*kõfP^„çôÄý?W|LYö;>ðªgΰËÜ2í{À{­\»™zo»Yô}š˜c—úÞ÷]OÀÀ.•;Êï2gÐÙ³ªì öüïŠøØB‰ÒÄWr·ª w&cí^aæ.µîL†—]¡|oRy—cÓÜLO±Œ\ª’¹S„(ÇÙQÁ¬éJš V­é’ììî–àçƒ-™SŽUÒNní½mk{XùIÂòm ¢ynöº5kÕ›ÍÍ~ÌÞt7ø>Ñ®BVÈ÷2ž+¢›3Y»ÞŠ#Ksgjã´ò¸–¼b]“ioì$hcìêBí9·Õ>Ù9­*+BWÓ ÖÚgxÆ÷³ý”æm ;®=\˜+Þì¼VŲûE¬ßR)™Qn,}˳ùsGñë“7ìî;ÛòLÇU¢yD¦.ºÌ“ÍLÕ«Üß!Dƒ‘ʃ‘•Ýy£‹…ßoéæYÝmÂ.L;šAJéó,gµz9Ÿ«¸f÷‹ «ŠÒa¯«Íeö]¸8†êF£Ç œ¥Wu†EïŸïÀ7§gäþ‘+Ì©› Ý+Z1™4]à--!Ö‚™L±bÝ2GÄ2—Ïb± ‰ÉÕbÄ´*Ô j”Ì3|á©›Fƒ¬Y_A•uö^ÐÊWÛòGð²6[…¦¥›4ÂÜŒŒjRîæfF|_u ¿L±Ê ÕFñ$ ‚FŒËæ€\–%Ïaú€}|ûÈcBáµd±¼«Vò¥$7mIF\×E7 ùëÇÏZ»j›í’öÚ;k­kA2^Š¥%Ì\Ð}sÐ,9%@Hnn¾᯿_qGë¤$ÖZ««w«Ö!…<ÙÉ6€Bá`Wf%Ü.gd¸¤4 ƒ,®XºªY¦Ç†xK .ÊtF‚º–tC²­DÀ½F\Æ['µ!¡KQ͸:‘ lï€Å‹1è&â6 »²b«Öâ.&DÜ÷Š•r¯Uß7»²Ý¿~L³0D.Œ: YÙ‚ËtDzü‰V'$€×ëuGä£Êh°ˆ…{Åd»ÌM¡2Qãqc$Sx"]ݳ6bÞ§à uëõz™™»åa¨>Õ~‚Ԝؘ©µÌÝk¸Ü³µböúæS²£c£åJ‹¹| i—Dsº"¯á¬Öì„W»{!]ßÜuÏ«9±f% ãúÏ@1”Uù“r?hEX‡©stúqêdêɽ 7«-×9Ý ÕUÝÉ®i¤UäÝÔ¼™+YÿC›‡[Îa¬±ZG’Žth¡YF-mèŸÎ Aº•ûêߘ ˜M 2 Yº ™D¨*s†µ[$‹õ5ç¸æ;Èòñm{–VfO!“ÇpÂõShÔIÅé÷Í ÝÒƒžN’ ´ÚXkN_T'W`Š*˾W·š‚0êÜÿµç^"½àÜ2Ц÷J»…wŒùZ-}ì‚bÝt·^°vÄÉÖ¦õPÆYçFÓlJbKy¾„rÞÏ÷‡šÏNWÉ3P@ƒÀ»És¢¤Ÿ˜wuNd~êþ: ðæß_—Ïõw‰œÿͤdþš7úß0 À_àÄèþ9øg…7Å_k~óß¡oës €_5ü¤øØ`úôëøß²qó_²€ôƒJôçÁ8i<_|)ùÕG‘ j«E„u;?|ÍÏ"VmÏUÃ|NÔOž§½=‡Ð<¤ÇðMõ©DûÛ±ªe™=uüOcl´ý†6¡ÁÚöâèÀàéHôâΞoh%•ÖÀŸ”ÚCÒå43§­N´ðÒê2ö^‹äë¾Wí|ŽÝ¬Î>¨Ç§NÞÈšocý÷ÄaÚy#©C¾KËòïµVB/Ê)ÝcMìÙ¼ôÑWÙ¯8&—£i é|ú¹MN£ôI„ˆ”ß½cýô¨Ír~oe Á~ÍÜÌF¢ú`S Çh ù™f¨½p£÷ÿ!æeK¸$7?\Ej¨åŠiè‚7n“I§ñ»——³-vu¤ ¬ÛÕˆ˜ªz 1ëЮ’-Ø‚–7S²8$%XäçÕ€Š4€²¼8Œ^‰}³²ûÍPðÖî¸Ê°&q¹ 2£OI4¥»çÒ{(% ë"Xµ™ºIÐqä²w›4‰Þwúµ´Ÿ®ÍÄf†ñƒ|‘À2Z8®¼òBZk-]—ÍÊx¼"hÈåt »ûå$ø×ÕÆê.~‚,äÒäËïãźùlJElzÌ7ðÕè›Á>/Ådã#`.­x½b­YèÓXºˆ!Å3¾ »Û@vá‹2R ºŒ’˜™=§g(&ÅÞ@¢«ÍŒ5¬çûÎH§Ûº_¡Œ&˜9=“ø¢Á”-¹à/[ëk´abE`©p)qc{÷^ŸÛ¯tëw±_õ9L ³“À‡›UqkH£« ~KXôâ.šLfv¾‡èn0s÷Kk)ܼ¥¼8ÝV±vßÈÁ$Y„’¬Ú°2²;K´I?w9 ¯ëºüJ4Íëu¯ð<Éï95ñêˆêâ£H3wIßïW¢?VâÌÜýúö‘×Àëõý¾W ŠÅƒJ‚°kÀõqùåZu75bmÿ!àa°”Åâ·-õ<:Ç@+Ä%ÑÌÁPiF9&FyÍÿ0^îÓ™l‘²”-$HG©tgƒ]–t ݰ´Öêõj2GéM4—VQü{«®öh<w1º”¦å`Q>ä¾­™Qn>ÃÒýºŒ’î×½"3„œyvçï4÷±Šr\k½*)–×_ŠX²}Ut „‡i¤,ŠÐ-…ü2©`>`–ŽìÖÙÌæá³È[ñZ †ˆ²ÈT¹jÄ¢ˆ{…™Y^¢Ìò^—Ë ®!MœÃ£š&gÀ ÚÊN ‹£äI;å¹{PžÆÕº%×e*,ë ˜=„–ц¼ÓZÍ.{¾!‰—×R€³j­‘«x |6ë5´%@€»Ã@tñv ¤Ë@*›Q Ït64$>ô¥-N(¥v‘ɪû•aÔ}µï®Q¢8u¯úpjììǽÀh±º{ᤕ×úPì™Üä# á–®ÈçŒm0DqŒRÎ.$‡‰Ö-»ÖpìüXYi*mЇŽYËÉw}­PÔ:ècíÑ)„ã$wo Ç<¬ ½ŒíŸ…rÏ·¢Üå Ö£(׆é(?È)¶EÞ™vŸí^ËÌ­^xûNì>²ǫ̈"4¡ÂÝÌ@Z§rJË/Ø… %£™{Ò𢣡ÂÀÙtÇÐ*ŽÂ4zsǼ·>¶ño2€`–;¹9û1·ÏÜ2íæ…&ô³MU6|^;N‰ùwí’lò¡)o%‚ÜÝħº¿› vþit¾oÙg®ñ•m^ý/ýÖªKæ0WÎ03ì‘&hBûå7äé6žR{à,{t¼ KvMúÖ=Ž•¾0‘>”Îín¿L±…­0êØ(Îlâ`‘´¢óç‡4¹SäÈUPMt÷ W_ËJ=Ñ1ú9;—Ÿq/¸;GÕ “Âg`݆‚ç4÷øg=hâgúüDBý‚¬í¢êtÏtá¿TƒçOõÏó(~) €?‰@ÿÉã—_LÇüâ à WýçŽÇ|û'_ýåLŒü¢øU·ý×ß»$_«í_Þ[¶‹ŸÔÞ{°C—ïiA|ùmÁívì.Oà­q·È˜³•àŽoïhõÎ2ó-Z¨m zˆÚoDí ýÄ;„ñ÷^b~Š®™ñÏï=àD=ú˜=ØA|þ4 ÐUZ1 ,®Âeö*­¤7D….78ÍW„5 «€½„ù”6²·)N öó ¬È¿ÇVuìÕ,ë1 >Z`UÄÔÉJH`­•Ü3&¢mÏJ¶Hˆí-+zòQã´Ýàb§Q§çаíýé9‚J’BÅúq® k‹‰ô9KÅ+tI jóFV®R¾C ÈM'{WfÛ 8F÷]EÈØç ÙA“Ü-ÚMÍÕwc úÇòÈÉ|½ùv'¡t9c'aš„Ϩ£½-°vUw°h±`y:étwDÀ ÐnÁÏc“•$‹¢ù‡¼~LÙ¤_ô¥Ü€eÙm…«Ê‘½w’YZ¦µVÐÜÝ`KKRz{ò¯%Bæîê Sü%å®u;¯˜YWi¶–£å>Ü´:_b¸ÌÝ´@“hu¼ï¬ûÜ̳›t…°^Ë.çuy˜½î—Ö ‰t7±H¾XIëI]?D¿èæî…•2³Ä$•(ØõŒÉÙUŠ-¸>¾}||˜ÿý×ÿóûïŠX¤±Bù®/w÷ß.îR·ÀäMµ¬îv]×õ‘wuwûý÷ßó6îdÀ «æ‡~}\þZ A»ëÓ†êYÊç‰Âݳ­E{Ø0qv'|³;/’| ?&Vu¯ÅŠ[áº.YèŽ*~Bº³â "ÞsûdΘ™“2êÞí³Ã76B¦¤ŽzXÕœJ5 ¾²tý¸+!«'ÉÁöŽF¼“~¾òµÍ“`ëûÄá¸Í®¾ÿ Rš Ù‡µ0=²ÜLÅ«Ê5CÁAGÿ‹ì´îÈajŽÎ iâ^k§¤ ±ªV#+˜ˆ*£ôíGCŠéU8ŒõÅ)~;9«Èû¾×& 3IPh[x +Tnk>„¨*ÒtU`'”½J4GÐ µ7~ï½Î¬û¬ï "q#„«æ¼t·ûŽ•›ºyXT£Má­óŽã¼6n}¬^±ià83$I=ƒÍº‡ýt2f^¤@Ir³ðÎW;BE ‹5…ØTƒáOmå0‚V¤%‹¹¢ÈO*Û§…©—9樤T:ôëØ6¯¤qþy{ËßÑ‹]ˆ^ß× l’°FÖˆX*«—Ù;ÕÜP!ïPØ{:²;*ÙÔž4l¸IØË¦–c/Úम[õLpšž¦W˜xˆÌ"Â`q’3•-!´tdNtÕ÷6Ôˆ4Eлù*›l>¬@z娩Œ%#ƒ„V©ñ ÄU?}/‚S]¶g©få‹ ,Ñ:C¥kx¼y zxÕ¥ÜÃXDUk å³SË›õòéû`gÃIËË;×á Ø*Fú®F‚‡Šmè ²ªn¸Û>¶ÝéÈ‘VÎø7"*Ž-rJÀnX8Šº¶ÒšSŒ|Mef·FÃç@cƒYrÒo„¹Ör&¡Õ[NCTËJÝO¢£cÌ‘PwòÓÕØy“жÃ=)EqmFâ¼êµõÂ[¨ %ÒõÓm½±hÚ°œùz&TÕ7ª8$Q@›Ùõ£„ǧ|˜wd¶ws¢ò”íDP¨e€t¯ÈQˆ<0ücÜ ƒPüÞ™CÐf¯vÓÇ6*òQ¡"R*oȧm^z7ÙëÝv-´næeCö1Ü—c=».ÞTŸ=)ØÑ’iÇ8÷Ú‡¨d#Œ=‚úJ í±Å=*“÷®¹Ë*0cïO²ØÕZõ×Z‡{¾’úôƒÀO½Å'˜ïÒ¼ù7ÎþPíü/••ùŸ4ùŸªEóÏV€Åqÿ…B`ý—Ÿ­ " IDATâNi¼qœ>Ã[dàBį‡ÇŸÉ÷l?ÏÓôYÜþâD|¸ì¿ªð=}¿Õ“‹Ó€ZO?S›Ëòþ>žâøž¿=6ù Uöbâ]¬Ÿ&áYýïµÛ›¯’ïϨiâ?qŸÂSHöišÃ~FµAÅγã{µÙDOb•ØuôðJÿÈLJg¸¾6ÿîjl•š^|Ë}Q††k§”q¯Õ¾äáÈj÷?KFT‚¶u­ô¥Ü!M‰í8Œ«w“\kå/]K Æ©Q5x¡wò½ ‰ópq·ÀŸJ‘U#¤XK4š v´ìº{ .ÎN17÷i7ž•_*Õ4û0XaaÂMj¶h©D„¥ú=Zÿv'‰tCy£ÚØåÌ)¿*!0ýïv`+Í8í_¶}L@ü'@6ó°‡`nå½_DñHÄɾ¤Ù9ž9h™UÉèZéÇ„ÌV›s­¹iÇ2³ôo­Øµ±kh Wö·G¬/Ñ£1Á²Ûb/Uë³/g-úp·ëJk³àÔX­qèÿù_¿ý¿ÿß_Y·öy‰Mû™“y£¦°›¸ŽALå4"5\7£g*ý2³––7Î@Âj"ç³7¸ùLJߺÂÈÁ!·ñÛ»ÔÒþí2Emi÷!3ÏáXk0==q…>šêÒêPô þ®-»¬Lþëuaå Sºëhô:Vd8*ôÄe,ÒðA+³ i>3èk Ð‹pãGní—Âd ‘ˆWà›„»àÊöî"ÆçH墻—ôWÝhA;bn²ÉÓ6­Ä’¬•ñ(Ä›ˆB`ià *¿ªY2µº4ðr{•g±„Sϳ\qÖ@•$nÐ,sE¨^âo[9Œ³’v nžaûtè™ Æd+KJS®vùuu—7í²L%ÞÄj<Æ”]×efZ‘¬0[ëûï¿ÿþý÷µâŽ Þ¬×º«>‰r07+ÖzÕÝ´DÑ*³GÄZˆü!¡ÕB†®å2`­¥õºÄÇË@¬µÜ,L©®ÈQ¦' ( [‘œÿv]d–HqpYÒÌJÄQ¬Ð‡™93Õ–»¾ ¼ÕÙˆ¨1ÀÚ¼´ð‡hÙm[~êPŒ*šÃí1à[Æ&L˜YEþœšu»Y·²aƒ¹È‰áÑ…››{Ä=+’¨fLJ/X¬%ƒ3ßJ“ÇçéŸgñ‘©ÖñЯ+ͱX¤#O9i%AOçÍüºò-¾ÖÊÅMNù[OÍD¥ê’9ò„º!wOéõu߯×kî{)²ë¼çE¬±f“yµ×6»!¶fÉÑCÔ…€Ï#p¨þ±dþðôG·!@þá¿}ûíã[fà×ýû÷—°bŠ+Á5 ¥¡ôõ ŠjKªÓ¬u¿M¹îCœÃ]P+šÝX¶i·‚Élä „ì‘˜cìNᜡ)À$sðH… ˜Úí]ס]¹œøš&æZßÛŽ÷IÆT3w‡ºžÛÞ¾ÍÕÙ•T}Ë]Ö^kÖäÇsü.´è&.›î†±­XÞü£,Ø;€ÐnýÑ4󰃃R’= ÅbOB^œÑ6sŒoö1¿b_w,5? IXõàše gúHè0yWÂ6:i›¡ˆ}š¯¬¦È°Íª§â&Ö‡¨˜ÕÙÿÞÇq!X«:zÇh.w‘’Ö½ô@phà;S£*îdH;„Ë>–„#U0¤½û„L½T‡Nÿ`=ú™;@ûnnâŠÎz‹±{ ™?&B²ØûGî¨5<žMý«ìT™Á«²x²}-æfÄ¢‹®b#‡b3˜òn‡àD}`uMäapç(åyíl*×QÇG£tÑjJê”r ;Ì4“ÛA¿“eïÁ[ØZ€Íjˆ¯mr=v(cʱÅ[í9ÏFÞ©LÔV8)ÇÚ ±çDA†e7Kï7¿«Äwž[ â¶Ã³²³[²9+ßz˺]p®ÒÓQ?>¬†¸ê°xUˆÛÂxàüûÌÎ[=Û[:bÎ>+W契FŽõ)œ3'ž»Ÿ:pÜ@º¥x3翆2€»K]¦ßæ ÷< p¶©î˜÷üÈþz’:¨4~~<ψ8Ü{÷yÚ¼Þ=k¹éüt?è7øÛÔÂ’û¥DùßOGæ‹aÄ¿( €7l~µàÏÀ? ðF Þ?¯¯|ú_Òðÿàc}3ó>-þú‚7ô©ñéäú‘ÄÿgÿØãWS žw寎î<½òê)ôYóûéõ(£¬EÓØ·‡"¯]äË6é'j$‰°¹?Ø Íùå'ñ˜.lÞQ?1vÉðð>í8H±a9³L¤øf6•–x ƒÞ‹”‡䀮Á»Y7Ë™C÷nªÅ€¢¹_îø¸®ß™þÃ̓)Ø›¸Šm¨ËÕð6‹¥>•yëHS…$¹Qå£'»5ƒ·!QÁô+äÀjpfMÊ_·Š³Â-†À }KÖà+üû€›±s›‡v`ÖçÃ0îíG~4ÄAäoÔI™b_ˆ¹µ^’‰âEÊLÑ—œuQÒ±.»ß.æ–h%¾CA}8{qíò¼¾UF9¶ëx‹To^e\hfDÌÁµ¿$¥¾Ð°£3ê`YtF@¾—“fü¸®“^4Øžð+m^UIkß.û¸ìugý/ôÕ3èA•UU.+°6Da«YFf;¯¹!"¢“YKRÜ[‚CÁ;B«á_H€ó1]œ—ák{ºý½t6Ÿ–=•» š"Íüo&$‹&D)ÖZw)Ǹ…«\gp£ä~™'"#[êW—ðz@Q”™"VñÅÓ,fÅ+<—3Êu9×÷ïÿû¯¿; äjÒSù©K‰Ìм^÷kÝù¨K>%Ž‹îê=ŒˆïwÖ7.éJÛ?î4K–pÇÂÍ‘<—*“–p‡‚y]ÑÊ£’3/ȳ´;ÿyYSÎê†h277«rûö{JºÜ”~ÌÂÒÃÍês‰x­»†ºVÖ7ðÓÈפ|ì@­c"Ì“3"%¡¦« ñþí/¿]øëïyâÙÞ®'ÚªoW‚5ƒ( {÷@ã*Æ´®—„¾‘ºÙüö›_D‚¢"VžÃ0sî²Ãôä¤D&Tõ— Ú)¢\µµH ܳb"Ï|Ïw§šd*ú]¬ºWd‚Û {Z”p÷½œd£ÍBáôû^ë^F7çªH6W†R¡”+½΀ø5x{¹w"C:Ìhæ¹êYÏÎ8YEˆkÀ Œúýûï÷²¦ d}HN*’X®JIaEq7Ë*—Aɇ™; ió-{{RÓÅ=cÉìHÆ jX›cM9C†`Uº!ò¼\Z^_é6LZ—]F-4Át€IÂ1UDKm\™1[žSûqðÎ;(sJ5«“’fL¤!zup:*R>P¢Å‡Ôðç`PXg:µú;ÆÄP¾ƒ*ê6UŽä¯Ã ÎAmól†¶A„8JO“t=WÚô¹öb¦MU­Si¤õ¬Ç‡‚œ¤Á; Ûã6Y©sqà6˜‰ŸIm• ¤~öëÉ­C½×8íg©Ú «`DØeC+Ràþ€©IÚÆ Ús•麡¯â0&O† e9q‘VÉÝóÕ41p hèÁHÖÌŒOvÍ­v]2†&4  ‚2qîŒãðâéöÅ·=¾Çfû«³»ÇÍy’”uÂYBƒê7БƒAn(X½l!˜eðù¥žÙÏa’û(+ˆEÄ€K±=ÒV>ªš[Œ:Ý<ˬNÂÑ,Õz=§[Ó°#Ó—MÕ¬Rj˜Á™×èKm‰žyW£q×Ä»ãå]û!ð±=„Î.ê¶¹s*Ç寓‹„m1ÃcÆ=Û£N1k79|µ1x(áÓpü0ey‹Ó'4%Û±IÖŽÀ†ÕgÃüDì´Á[Êf÷St‡£a…ÎG±™ >iýJÏ õV"ƒÇ9Áÿç–_hûÄyŠ~ù%¿(þg©·üeÑòŸýJþ9i€ÿ;äè·Ïâ£ÎþÁÈ˳¥åŸua¶Ox­ûÎuu¾Â \w5€%bµTŲ˜0Úg:‚3Š!šÝ„W—9ä§¥à[3 í°ªƒ9U{Z¯x×@J#rËÙéæk¼P‰¢qÔ”PÊ|Z+ ø‡ÓÌV¬ôÑ•Ìm49qÇŽ¿ä¦:¤z¹É­ã’‰£¡‰è…ø¦TX[¯aùâ#ªãùI†ÅR|§X–©Cý¯½A`›ïrÞwʼ—×Ò±Ó0aåõ ÷ùi[ÏÒ¢ÞH¦"Zä\Fs¿®`¦KRN›æU@ì¼w&5‚æØSŠ30tÓ (V–.«YVÄn-b¼h/+gä÷n°R„ M ]à‚xÙEI¹©·+Š ÿùæ—€ï÷ ŠèNqÿÿÙ{×-GŽ# ÓÌ#Ñœ}ÿwÝénûÃ/‰ª¦(J3£sVýc†¤ºP@"/æfŸ‘WV¥{ú…-©;÷hÙ¨Qkí>Œ?®ëZë÷·_KËV(² €‹YŸ‘pö< ×ÂíIÏ•–A ù# Š—á‚EYÈ8н¡®YÚcUï¡êx§Œ²Þ:|~…é6 Þáy¸®ôÚâö¨útæLñºÖëZüt…{É’©hF SYÒ{¬z·f°’”Ú»Á1­ûá÷Z-ì²å E¤¼p¿ß®ÛVí /ƒ·§8oÉ©Ûi4Éïû¾CïûÒ*±¥-2€÷ûpýx-ÖÙ{¿ïRo/WYdðÜè®e±Ì@»®K=_~ßš½@®Bÿ@ŠÛåw¤ž'–Y1¯:KÍ7¬›cªÀÇÌÙ2³•™Õh5ÇIµÏçB¼oû}gwjžÆeûÙ]ã\òºVe²‹Õ;`EÅ!‰xß‘wª¼¬µÖZ^7¼1D—]ØhïðÔd ¶C=SCX‚‰ leTÁÖ‘ ÿÛ’ ’`ë}­u½w¼=R›3~yÄ—²Ÿ"Ç*WCâ‡2‘pý¸Ær]¼a Ýr‚KV..˜ä9ËÕû΢èxKÿýóçÿƒß’€s³B4?8ºŠ3úVõÅ׿2ëü~{H5[L۾ƣ©íð­8*Ó¦0±Aî¥a 9f-[™ï{¼k­ä]c«é‡ungèŠðŽpg{gí±Áè'TÚZ+,Z‘”•ðJŽæƒ¿êAº¸HÏbêü*£S¡ùm¶¿ù½Fé^ IÄ¡ºN¼nãerLU1«fÄó äs)oÉÁ×Tt‰BÙ=£õY°€„uu7ïÛÁ™úwEo¡+üŠ3È[ž_Šˆ(Õ2T„•ŽETG‰æÊ,ô]®TY½4+„]ÖÑyä¼uø\ûù¥) ÝÊê‘uv¬jÓ8beÓÐ…­:¼¹Ý´r¦ÓrVÚˆÿ½¯HóÇèƒoÏu¡-#»µ#Ñ”©ûij³òìßR–€+Þ·O! ¦QxÔ2s¢ÜyÖ‰Ûûd2žÝ5i¥w!ŠÒ“·@î"©2IŸRÊãs´˜b×£Ó!ØTô¥‡÷:ư¡CÌõúæ¬ûø-¸·{è œëyÖ@´oè9-­-™u¾¡îõ?®Üçä¡ìLƒ°0S\• ‚ÏVkR*jš!Ši•Rw &­W¿:Œ|Ο½×žaN¹5¬¶ñ‰ÝîÔ5#ÕýGè#nåd°ÓþÜêý4óô7qÔ‹ˆ{'ñÜX—«0ÔJmÜiµ¨Çoå§`ÆiwF¢cúN~ëÌø.Ð QÏ¿ŸßpsÅš¨¶ƒ–‹CÊboGƒÇPL6ñ\pÂÖéõPf2;²›ž¤‡BÑÞ‚=¬ëÂrñª°^›>¥Þz²s%=ðè¨wc¡¢ÝQ/n î<|uLYç]b0µvz2¬Ïjã/dméã{ý4gë)7õÍg,òSzû“"ü?¯1êÏ1sþ¸ÐôßUGæÿ¯fÿò·Q€o@óúÏ à/…/¾Hßÿ|€_ùU_u{øZ /rü/~ÃHˆ§´ýÉ">ICüÎâÿÝ/ú ÁK_î5ø|¼meôÛ×ùP’¿GäŸæþº§’8j7¡é¬ù”¥ã?‹”xruvs€}“` r¥÷<\À ýç´<^dz€{Ûv`uò”Ž+Ï<Áù¯;+‹=9ø‘IÀñÀs…Baš1 3¼ÐÍÐ.Od.Ò4ëÑLÓÙÞ6óñeGÈb›Ä“ÍûÎÉíYûs£Á¯–ªŠÑ‡œö²e&ƒnLGCQÈËÌ×À‘ lÙÕrJõ^fy¥·ã VÉÄ–ãƒïdfëRÜY—Š-G„—‘03ÜT–oÝsQï¦;Y^î‹Fzè]˜wî'Ä™ÝyÛ ÝŒˆGvKqß7–ýXã¿ëûætÝÍ’žeÙ5ä0NS89[z1{Y Ä~'¥HÆ0áÅ1ÐR«9¨óÝm%ûB¶NMœøëæ˜$ÔÔ#¤¸# Ÿo°–Ù"Íj5­³ßÒöó«ÇOqM@id¤ Øød*¼=vË¥D°xŒY>aj¾‰LÝÊT>êL@FÒúsj؈Æô»·JÖ‰˜¦¾œÉÓ[ÍR:mOvKÙá(í°Å^…–e^¿eT Ñ»ûUœÔ½ëT£¡ÚÂ2¦Ûl/³á&Ü¡L•14F g,È™½¬S½É9uE×âG ãÓ°öp}'-Íû%ühAx¶½Õ¶loþ¦G,7”"xe_÷Œ¦Ò©ST»ÌÊ3Ôž›î~h×Mqjr˜M þš*G”L:DÑÕah)Ú:Šàc3$¸æIˆ~ì,o¯¨Qù—Ä!J!Ëäæ&Ï#gΔ1Z;ž36foÇòG à¶ÖÚw)†& ó,¿SSr3U§óN4µjmŒ®ÎÈ6ª´¦Áئcãbf(óÉ>OBŸ°Í³§m ×HèI3Ñ}Þtð­ÑŒ¨r»,»û ý¸7Ëå6yÂ瞊Rž—sjÃľ¸ïZ›ïQ‡>埡7< @‚rûG7¯VkÇSZÕ²À«­ Ä„r0”¡mÆsüRQ*ÃLã¨3ôAœ„H³Îš¹>çdQï6ñ†<û¸•BGFâ[Õï8¾ñéþ‚ñ~Šÿ*äWfùXæ_&šüçÏÿÊ _£¿þ’ÿ3ø‹ƒ€?8ýõO|“ß~NÓú££…¿nác =øÔúâõçyzŒ$ººõœüáµ? ¯óLŸ=ò18¬¯ß¼à#¿¸i!Ç[ýXÌ út»~eãè³»³w<&µ§Âû‘rPLq[Û8ZŽ¿)a~. fXéÇÄŠ°²º|'ð˜s$ï¡;ι‹¶µ÷Ô*3€ˆ¸o¼ï[˜&Džw3Ëíbo××ZîÅ…ê Åa){Äš]p"YŸ&Áó(´­>—íŽç)JœõXÛ[ÒE&¾<«xS·^ …tö ç¤!+‹<•i”âªNyÛ,_WͲaRÔ¨½g—-·½#αÇaCx$Wä kÌbR_4öŸÚÃõŽ*eb¯¯%O=Žb±ÎWÊ!w%Ó˜·½¹:Ô×Ç+2| „Ëò÷Ì–YWá'÷З«\-;*£Nrۃňiecâ³Ñ Ž%|*…ª°•ºM¡a˜–óL£ 0Y-WnÄ¢¤Ð»f{£Ú®Ý@„<ò´Q„ìý–"…Ðò¼Wø¡ [;ÙÉ3˜ÅéÏzÍþ†ráÙï —|%Œ‹‹V¾Ï›\BFPBYh*r bË…{·÷Ö˼¨<[àq÷aüã5ÝÆŽ•1/½sŸ?˜êëZ opS¥úõ°¾bÚ–¥«Ýá†uÜCLó•PïE£vI²ˆÐÏ÷õÛ)<íá©ÚÚ\·¤ݸá.£âlêÖeüÙò¬cì=dÈ).-š–V´Ir¯ì  ðZF)Zºû˜’×îa0Üsk,ÞÊY\l@wxš¼K£¬9T™)K¸=~¾ã¿Öâµhëõañ3ªùöõZ÷÷ûöð¬U÷LâµBéC?[`!UqeÚ@±Vo¯ëÛ¥Õ%‚Ñ”•h®EF%2‡rBv­eЏo÷ðÛå¾®4%‹Ÿ4³ûövŸÄõzµJÝŽN3­°lé¢]/xßï÷ïo¿çÎ÷}+‚k½˜NÊIK›êµ.3ºÇûýNÉáv2Ë/P<••ÓvÞH\®Õçs]àŹ V!«"E9ű—¢‰ùªba?Ü9³ ¯‰‚5j#a;gY|ÞùFDºìº¾7Å.pÜÞ];»åQAQÅË”G^³$ôFÉ!c•&»;Èk]~߄ۢÁfÓÄLUÏ0’ª¤¹¸)´‘î÷ûöHóëV$Ë~* «†¡õb¢X$Ú*â¿»›1Âô"•µ4 ef„ [ë•mƒöƒˆ•"ÑZÙÒì^÷“b#^ÅxVŒ ‘˜¹x?s» ·!mߌãŽb^ÐÃñb‘*÷µLáîºHÒóº}!uI½â˜€ch»cò+ÝwÜÿ”ôöÊÂÒÇ‚0õœøG˜§m)M­h ?1â#×ZZ.i]qät÷ø¾{³_:­ì³?6N°$ì6/ªÇžìGZ)zI{bçq?Su0«ª/“8åáÁ§ð誛e»©5(¬nÝbØM{ýMÂÃC„xu{BÝT#eÙLÙSì!YD,ò$˜yO7V^GJ(ÿ_ÈÓË’Ù…hWí"Â,Óf)õêʆ×vÕXþHìÒ%í4 ù"b–üèûÁé¦g•ܹã}.ih<š'ét©3ñŠÈa¡²;иœlR½J‹bhÛéø¶“PœsÌ@ì¸E¯ž£¶|Z÷d 2jÆšê¶à÷Ý8­Õ+ä]xˆ'€ä±µÚÊÿœù³ˆ¸Á5aîv¹,/ʸ‰LŒ3P’O¯“èâåJ+U—£û’*6 Û!wôi^w‹,âNÄO»R5Ç%4’:¬æµ‡«äj^£–ºÙë¥ÙDÒv8‚¹šm s°¢zG%0kßÑ׿tÀÎl µÇô]¦À6ª£ê¢p¤û¿‰·ocý®ªEÆ€5'7þ¢N`ñ†üìã‡>ôŒ³ôbcŠs¶[ëtMθlØNzì{zÖÐOÃùĹ'®±ñC(¶2å IDATô8œÍÓÃMÂÄèÒäø¨zˆª×ÂÌùsÑ’c4Óq'9MœšoC–‡]­Q¡ ›Ÿ’Š´û,6îú…†º·‹"ÿ§Òó49’Ùß¶ò~3¢ùöWþ£æ_û›z„þâOþ pÍÀíÛã—Ã|¤*ãúÍ¡þv"ÃÒ+úçïûö÷ÉÜ»˜ÊÉd½‡kDduž"á´J^gc9Ëe_ø?¡ òÞ3È8ËQõBlÛUòî‰Ôçu]÷}#!í%ôO®²)„f$Ã=Â{¯ÄõÑŸQv“>ÂS"\)€;K¬?Ìz\ …ÂŒk1kà¨øyUW‚Y^­*²Ç4•·¡%½+=ÍKïÙÁ,Ðx?S¾·]­FÄ*ªî¶}õ½`w8‰Í°\£ëTM¢|'±ÓAy$ :‰æµí.tzuë5CÇ캌è·3ŽÑ,‚xŒÎÊZ×^EFqþaeÄŒüdŠÝüÚc9`YI\ZÑ2[+{°ákUójòŽgô´w[j¿Lq§xf6·7%Бv^«69Ö¨SYˆÉ‚Û‹%-dk6[ 1|ãS-{–½·€?dúev]·<ÂÛžD^;¬ ht1¿sîr”Bç6a•=·Šàš4iB+%¹I¬p!á_‘¾ÂìÙX¦ìZö¦.¼~µYŠ¿oAq¯6[ÕzÛEÈõ¾=§j4“¨¸1›tq &ž>8wÈÈE^Xñ’Ý<ºLE¬·ÂšEÃEƒ¹40#:KQ UpŒ\ëÀ¦‘&yrÖJñ…$ÇÆ%eJÀï”/°.pßñþùó}gÕ®†Å–qÑî´[K·<é¾Á7HÊpFòî72y-ÞÓÊyÒe—ôö—n­GåÚoxøµ.f l«‰Cè–ôZÈÛÁµÈc{ĺƒdÐf]¨ð(]\SÃ*¼Ýo¿£%¬k­ÝЙQZòÙ—Ù Ï@™û.w]+ŒÀ*YÐ#îû&?xíkV(¬úÁ·p+îôÁ^™d¦zlm=¦Zâ'aÐÀtÊâ¾ß¥Æ¦Ñ[J6ù±Áª˜^‘èÇÐÚßׂ6­¥Qu5ó¬áÞîÈ[µí %0 Z1šÈ¬= [b#C²šC«NÑwX~®&S;–·YÅÖ°‡-u-Ï)fÄ}Çï¿ÿôð,gNJÉe«òdÓŽÔ®Fv)ÉuÙ¢p]W¥¸ fÿ3 ¸û-·×+qÖ1P•=UJR{mvp`ÁoÍ„7îvª[9Iu?mÀˆ6†ó -ô"‰gP3Ÿ³f[¸žn x¹Šm­ë‚ôógõ›Þ×âà®Ïæ^õŠH‘œ“NŒe±j¨eÀùÔÙ¤#:ZOÛ¶:”ÙÖÙpîØˆúä?Z—OWÓæÎ¾Õ”Ý“S*ÞØA¢]ÚÖpû.:,7ÜZ[^s±ÊѪ5´&zbÁ3î¼ÃaYØ^lóËF–%òQ;Y½CÊ' x:äó«qaj5¶¯»›$y´Qm1NOëSà­þÊÊ¢ åZOº¡†‰3ì_—“»å´ìJ`ÙJ‚vvµ¸•Á9ÈXçâ»ûhë¡Ó«›Š¶qAiŸ!L·ö‚±EÎlu¯ý3-¨6Xàyï‚þ\Vu1Ðe‹µ¦è{xÖâ6 hó_Úê‘é—>°†ØE'S¤:ᕦ½8‡ÚÀ‚~Ñ$ŸMµõœÂP:æÝÛDH^B«`–Ò{2á±X­ëÁ¤îg{9÷`côVKibT'<{ýúܦS­_ ¹>WF»SßÔ|¾®òF Ÿ u’צn&žýƒÖÍ^Gt=ä3 ÒÇ=ÑQõ«n a™$Ø¡½íÍŸÔy“\ýY_ú•y·çÑßšŽhlH=øãaÀªíÒ1ëañm¸sFÍt¢1iy²w†r·Ìqƒ>uLd8Ä >› 0õ=Õu”íú„‰ët{Æ¡ªàÑÜË«=1}ôâñ4à†Ï´J§zÌ©±÷”‡FôØæGØÈ"dÙ^ŽR†s #ØS3Ûƒ:n –Nv0§… •Yc[Ñ&kQ5"Ͱ7!”Ÿ”ýAÓšƒöå›ýÚž|ttsêß¿¾Â»´ÙŽCì{nšþ¬¸ÿ‹:ÐÀüüL ⻾Òÿ…Àÿû·sÀ_Ì’þóç¯îè›ëêã/ e÷Çòå¬Ä¯óü¼ÙœÊÕ/ "g+ñPãy}°€ŽMI.·7ˆ#™…³è›r_Žxû.K ~)hYœÇËè‹ã>cîç$þI@R´:˜«Ç”AÐi)b»QNÿ™ôaLUNDóOÓùbíH9KÇL¥÷Lvšï!\%nFéØ,öHníÀînʨü¨s·{פ„C­c¹Ò@V Àû>tž2;Ûƒª“H†Pìn9§*‚ºã¾ –”§¥pÇJ±Þäk¥Ü…Òûi•º´£©a–óÛ Q«åÖ[´;Ÿ›D8Ù[®Upg÷°‰¥ ¡X²•`G Û;Y.Hë͆kº•K{‚ƒ¿,á –tÖÛø\+/0jKӂĢñ“Ô”+n1shähV4[b‹—Ñs%(gCž°X|óð3{ûIE±±/K@ùætfA%C‘×h”§q¼ o=d¶‘¾Õ·Ç²úÉ9Ý«¢¶¤Ð’Y^‹nö#+š.ùíñ_†Ðe×ze4äL¬nNWþëyüÜ’Zk—äŠÜQd’ß ‹nøãEÂf¯)Ï]вl]%tÃ3sݳD& Ü@Å £3Žì y(nAEÑ@yì¬÷Í@„§]:!WKüŽHˆmîwwŠ ¡Ü.Ž#f™°dŠ[x Ï./ZÃu‡qK¿•è+Aïœ1œTWšÖE¼Íx¿ÌêWÑâí7°H^x6ãµ,„°€è+¤¸Xöº¿e+À‹X×¥è´.É̺s³u]fN܈:m("íÜpˆ!š½Ö¡ŸYz[Ð}zn@ù"Üxƒ p £­e×2)𮑠¬:å#†—­¦¸(Âkõèîh‘ äà 0[ë’ß%}y½~„]øÛïÓXŽªÔPŒÕ–lýó‚YWeª.3˜ý¶j@ÐE&N«½á=†´Õ—{á™Ä·˜"-øS4Ò¦àŒÂ˜ˆˆkC¨´Ñî( „K£oÃŒ—®ƒ7Á*M øûîF8™µeá±C4„GãVî{]¯•€8iŠOÒÜæÂ"$d'Lxp-žåcõ•x”Úû©ƒÕoqn5s5±11,µæ§s§Ò?÷É©…gQdQ SÕóznïHôˆ?â¥FV¤Œt4E_ ˜Rn÷ÈÖݵl-úq0_ËÜ•™´ïôÈ0›9;/—©ºUp‰­…ªœ½Ì’Ê"èY–X¤­ ñ–ýä=rêx m_J_ƒ*aP†×.%ì’Ëì '¯kqW‡}ô0m/H/ž*»£ÃƒI3Ëñ¿Õœ°nÆÛ—¼{—XhA3|ßä)f·Zm[-ŠŠ™0G;Â}l"‹c&*t]/ÉýNA91´d¡U„‚íDG Ìí¿{åØspÑÕzd]Â2 S% *c®¸÷:lK9ÖÇÖqÕ,XÖrï–tžç¤A ÉÞ²em2–Ccv>²ÙÉý9ºÎòLøÉ <|¬mÀ”-=á§zø™ŽÐî¶!£¼êZi§3Ì 8`˜b~—D_JÕ-UG§ó‘IÊä+©BÈY¸B1’‚·2DeðÖ0Ç*$ÄÊKÆgB×k¢, wWG‡Wžù)æfÂ2c™i879h½¸Þ¥4gÏ<>r÷b{_1š)qËžÛZçŒ}—,` AË´ô©Ž(ãŒÚùRù9ÈVGO4K>0CQ Ñ /kfuu°vª!i[[õÈåŸB,Ðc÷‰Èª‹|F]`Ì¥EŒ­ÌD|ІiC©üôœØ›žn…´Öpœž±ò(鎹ÒFh:¶5QjhWí_+zɶq«ÿ{ª­Ë‘Fª] àçd0¥Ý®-=õùþk<¶cÒA1þOPÞl´(Ž{ÛS¼™ôÑÜ ¼Àáá;”‡m<ôw=l’šêÜ5¸/ž=þ,øÔþV's  n~îƒA×'£žØŸ§w_>â3áP(vˆ«{ÓgW{J"x²Wâ`“÷.Lûf6®ÑU“xmŠßqFo‹'ü^jŽqÕõ­—†÷Y‚õDFú‡¨ ÇXsΗà/Dt}N|Ká×?(Bþëtgý¡´É ›þÿØ—¸Âÿè¼á_}hÿÊwñ$ûwX@üOÀ¿ÅŸo¾ƒoÇWç7©ÇåQPü«Ÿýz>º+¿4”û¡þtãÏ„ðYcû¨yìGàÙ!qÆó!Öï†Á |ûV UòÙÁÖª«`] ÀGñ{Í ìœ+#g<¨A8Xü»Û¸¹ÜÆMó2K¿©m>Öô{–¿¿~‡fBPss‚¸ŒÔ²â:ôB¸-lDK$FÓ¥d±C,‹Y#€Ñ ¦É>QÕc4ù,?*ÀqgÿÍl¯GÆ>xÐóÒ‰½L€·èÐL)")‘B³¥p– ®¤ýd„?Õw³Ë,Ê¢)Ia´'GôX!ÍDD2³Es¸BåxNíÃQ€ÝœÍ,3_Lñ7¡õµC.›él¨ôuq•ΩüK뺮µîÄpwý×äRXsÙfud– î3bC›ú—ç@iìÈĽåJ-©‹«fEÕâWœì6W£J°ÚøSÅ À¢—p„Bë2¶IÐ(‡Báä ÒvÀÝŽÛUþ<Ã=šê_”l¤5Qât9ÖgööÈçYñÛÅŸëVÀÌqÀ´E/mžmæ¹y‹Ä¥ .ØBFæïÂù–ÁP]“^8ÄEIw ì`ñHR\Ëì2ÜA¾gówK—ŠÛŠ;ÊÐï!3F¬Ü¯BèQs`‡8¡çܸv6¸­šœÆ6%ê7xßžÁùûý¾ãÜT¸pK·ðÚ7ÁŠœçøÃã]ê9r2ì2‚þvÊ^¶^¯•¥±‹üï÷ýóý–ð_¿ý¸–¥æ˜‘•Ë•¶ÞËfyˆµÌƒ¤’À•û¿%^°;UÕ(Gúª2Ìk]µw¡‰†ÁE¯$ÂKY‡²Öú±^v®åïû÷w„âñnø@%!ZyŒV·‹ cff×ÅHhxøM^Q5ÖAÀî·ß·¿á¢* SU›ÜÄ™œûæ­|ue½öððp¿E½ÖZ¶¦ûEâB«íy7Ûªk}õÖæÎEÞy®¿ˆŠØÄ<]½Üäðd¯IsµÏ3*Øo¬ê©-7·Ë¨¥ûŽ¡Ud¦AR¸“X¯K&z2”×ZÆ®mŒ[…Óü"B÷ífË̲`¼ GñÅn›`? Y.<.ÙÙ£>ÃD.³ïVùG,®9FV)€Ì Ì£×FÕ7³[Œr÷œÃ‰Šzvo¸}ÞìóÔìŒ\í¦CjßD»ÒÔ­@Vxü@Drùs*ã!eL&Ò¦oCÞûr³_WÕ´yÙÕ?‹©7Vyèò”ên‰*A8ÄšëZ‹¥êt{ÂŒ\iˆ˜oè0 ¶²®¢×÷¬a×3“™†â€-c¡0I÷bûé~`]UåˆïÜB”<…¸^v^ÕÞöclq“MfÆ*Á^×T§kJ‹Úlb„¼eÏ„Éìd2=ò¯²uåäß9ºƒ½ 2{É×N pGÞb–=]«;–dk"r–›úw2¤Ø àF ¹+°À€Áß5þˆ*{Žm(|ø½Ë¨l±Õ¦§Sù°¨ÎQM+4°;*Q¶Û¹ “xýE¡žø :¾•á¨Z#öh“Z±ºUÁsÎ&*UnÜ™av’Ë*vnd°\#Bç$/ Ù0f„ нòå,¢ÂÙ{ä˱›FØ ¨î¨m‚]=ÛÊ[N•œŒqd<…!in¨l/•Á†¦ë§ ýìM( §¡óyJN~¨2{a­2› JôŒšÝ#£+”ŠÚC¤­¸J‘àù4£Y C",Á¾ûh« ùÐæ«DZ|Š5q@ŽŸõO¯ãvoãC}Z}šžZþ¾ÿW$dÇ»1OÕ=™ÎÇC6ñð0Èc““ð £¼w«0[VøbŸäÑÎ’°ß·ÒhÝ#¿ ¯k"=õ dî Bë¹y©~ùžhéäDLbûimQèkfv¤'½ç1gâqJO_&Çdìö%ê9:újòý;Cþ[•Ú«oÞÚy þ¶ð+ÅöXýÇÿ)ƒHOø»qÄ/føÏà/è¿tVý!~gŒÿœBòY«‚,.~Ÿýö}êœí[ýGI‡í ñO|æofü¦ ˜çcó¸ÿ ßጩGù­ôIªÕy°!$ýÏßÖQû<=Þõ¨Ý»»ÓÚ9Cq¿anîðI:úFßÏÍ…ïaÏÚ'`‹–ãoʦ±|ð ®y,umÖ-©"Êò“½ˆèæÞç47wI6;™ÊœaÆÅsÓ "êÞÛôj}”± ŸA)VJ‹MÙBm»‡3šÃ4Ñ–ÎoŠ0Mr@á y„ÛºÚ›cÁh¡±?ýÆÕhïvz\ñÙ5Óã‹;ì0u˜cH73kÈÍ'¿¥ÆãoûÀL{BŠ–ÛBÏ<™>ÝVàGlJ¨ùâdGTÉ®âQ.¦ `ß”¥Çú¸24]œ“±áyT’t̺B%7jVÑÅ“êî¤Ð•$¡Œ˜ÀŒÃäKd›ðœ!÷R4à”‘V·ŽèxaÍS½Üè•§¹oÏÔZäWs âA)º¾¢õûI׊*‰âÉša¡}Útð“¬"] ç³!NNõ@¹ÊÅáz¦{<±Bd>Žu{΀c$ß- ÷Yæõýzî—¡ ƺʜg[Í öá4[žaì·_úØUr“¹Ú‘ÜåhÒ;JQº¯ä©‘H;Uß@ñxr=ZAÖÝÔ¥ ÿ‡a@ðHŽÔ¨.–ˆF G$dÅFÍ"³"åü,€¹x=ä΃R»7 Å:å.”Èò무±–:݉:›ËÏÓ¦jž·6§fŒí‰‰ÚÀT†ÿ¦øžê¾¨¾ë R÷(6BkR·àéóG<×Þµå¡ Ë\nŸv¸-ÃÝu yÉðèa¨GêS ©Ó# \¨]‰¸o»œçÇ—º]µ¾Psú£Û—G±{f2<€¶CjO5>º‹¨»áÉï߃©¢áÓµÖûƒ„CfŸ<Õ)Á<‚ }£ý´ª`;&ðY¯»³êÇæ§o­uUœ°f==ƒsÝcßÚÇéô±ÏÒ¯²ê®É<Òw˜œ?ÛÞû%‹Ð· ]^ü ù‹¤~ã>ÔŸ²&ÿ‘Ï]O-óWçÿ±¹ú_š3øw“Í?0¿–|ƒúøÿÏ/þÕ¯§?8“?<ü°Î£‚gc°™<ÇÒ·¿’»•æs³¢à[¹ÿáåeŸçÎWÆPkÔ[.ßOÈç[=¹ùöà£ÑN²¿0îãBªÎ™Ò6•è =)´È5]•ÊØã@¥¾Ç³¼Ç#ôŸ±Œ”òù«ûæ~>|?hsÏgâ\ÿáÚ vrô‰œ‡Â¢°?Èí‰Kí©µ=Yãè<ÝUèf`‚ûÈŸµÑ;˜Æ|÷]ÂÃ^‹¤Ü#¦[±ÄcŒø@CÙô0@á„f£jrü<ÛòD¥4¢»§Rxç>¢í ¶q„<"<|uÊØ!„Ÿ_¯‡, Âêó""ë؈´×µÌ€w³ƒr·+èR2ÿh\ÁBvƒXÏ-Ƥ—Ìeñ>0[•ƒ £D£™ë°JíV~v8„=ú0¹®•†«ðÔ„ð^½Û Æ6ôt<&«¥isbÇÏXaˆ¼r°–)Á&š †.ÐV(DÓ%:T„TÀḰ7È“!wÙf\®[áX–Ù;ѬÈ‹ÅÙÍM‚•ˆ_GËä­eW–Ò…a†ËL6e °ÌlJÏoêL\Ëàp­ÇÌï-X ™ Ü• _uw°}z(IJ> ÄýöŸvÿ×s« ¶Éºb’ìuO¸³{V(R2Ü·ÿX’#¾Ã;¸¢ŸîFC•s¸Ü;(/_=' ¿C‹ºÕ¦?K„‹ ·Ђié}ÿ|¿ÆZ?peå/XÀ«.É舻Ìä¢d † ªäÍÒ`Z¤z]9!ã"X‡×URjR\ÖEHîI~ Ùëuý¸.‡..(^Ë—RŠV+¬f)®´†c@í—­¼åÆÎÏöòË.‡[D0h¸d7°¬º6 ·¬µWøÏ"dKÙ}g×Âû¾SRJ¢DÞå=CyÙ÷e.…¿úñiȪ„ ºkÑlÉ­È+ÛCƆ䬜ngP® Ñï(Á'ò´&±Æúp¿Ý#‚GÍåÞPë±.‰Î’ܶøÐ°— æxx)"X\[A)¼Ù5"mªã· z´m’‡S ª˜ˆŸ•ng»Š)(ÞOÜmI­¨«Ý{ˆYC5ÞI:²µ]ÂýÄŽÌ7«Ã®eYќծÎÎäÍ*PPš…£º* ÝSvÜúÚ¢QH3A^EК™®yq´cÿÜZ€,„Ô•0•{›o´GϽæšg¡òê»ÂÆ5‚­b£áûÖ@!­måà2.«é~ì¶XKŽ]ƒÅûÁ]Ñ»Úuzœg]CK=Tõ¸­jƶ 7ó?ßÏ|‡Íoõ°ÆlÔeWÔü­¦f;ÓQg ÉJâëÊá5k]âè8ⱬ>¤Y Z98†»ø0³ÔFNÙ¾÷Úš9†ËèÓ¨Q&ÓÁv`‡&üíìîc¦ê†Ìöб!@ªYåHÓ-–77[@)ïÀšRKœ0(«ë`6$'ÌÙÅnBEÔ¶dŠ8zD¤ Ò4¬¹™{j­MºÙ{FV½R«í\)1öŽF =z0Ëu’E2Å’±zip´BÕ“¤Ã•9Š }eîªa=›ä_&ñZòæ)× Ù+a% Té«D£Áìw2¥'E\Èž¯Ày8’é=šÍv!‹!c†ü¦X[q«QSŒM-/r•E¨ª9S抹¢F¼[+|J l­dRV´&C¶ ¾†Û4†ç:y t@Û2# ÐËù¿-ËŽ²\¢HYѳ2¾Ð¾©–Æ;þSzîì[Ž»CžOŠ#ÌÒ@À#ÈT¦¸L^däã¡Ip¬Öãk㘲CøÑ]®ufˆ½uxü]nñœ/Ô°»ê IDATËmoï&XI1|m‚U  k<é)äòHÏÒç½ðkEçcÓ$ÂG–®¦õ_V3Lí lìÀØX»ºé"p”² zB§‘ÛïžÕã#Žð‰Ééõb'÷³‡•u¼fsí:ªÓ3 ÜûÆqÎÖþ‘ô˜ãè MíýÆ [Øþ/öx>À>ÒìiÕ r:çJ'ŒVá¿ FþC?%ü¡æÿýõðìÖŸ¨Ð¾qâS‘øøÙÿ}iûÿ\LÿüJø' ÿ3ø'ŽòŸïýaýA°†¿H á°{ò«¯_]8ünùaÄÿx’ñSýÿ˜ènýyšð#/wvðHÿ+Õî»…t¦©?+i?'GJàë«í.:êAØ©M\?tÌ'އ)9<Ë#ÝÆçƒF»~y>5ñÍ¡Øóˆg\ºëžj?Ÿ„äõh@P‘?u¨äêÛ³¤3¹ïO½\év¹²F H½¥ßøÚÜK,³IìwzÔxÐc‹yÚ{Úe¼É4ïÕ¦Ðè©}[B-§¦H^ Cøèb-Ú–fÛýP5¡Œv J‹2òÖŽRæ‘3b‘º@ïÖ7XF…¥ ]o i÷¬7 …ä¯×¥`áQr ‚G¼®cEUŒ‰@s9g)¥­“#ºñ-åèN%‘ûŒ{šßrm\q%W¢—DYsƒ4ž¨«C¡á¨¨± ²™0j„žÛ¶BÕ”%;ÕåÇXDœÛÉöŽôëfZ¨vúõ’ƒ­‚Ò£. ")NGÓ±&RÛLVt_û³øß-ê{£""5®§3)ë¶± y¥;‰™æµÂn ¶Å}7£³Ù>o¶ïˆpƒÀJ¿ýG¦µFIaÙ»@û±šÅ™mÙµ(á§ûiéh›ªç»Yf<’Î}[RD¤~öjTÞæ‘f a†U÷ú¹"Ù~»_ÖC̦?ì_dŠðˆÿ÷çï†õÛewÔ%,ÅíTÖ•ŒË4"k+ÂîE-SŠMg'h|-úÛos„9teÓEô }ÕÜ™C‘š©.Bq»/S1ýC¼PSÁC· ÔuÅ;…ÅÔ—!"úBÖŒ|Âbn÷ eÉB2íÓ)¸’9Ò•âI¾1[Fº¿+Äb¥<ØÒ-\¸H{ý¸ív'D3M¤#[ {Ö™¶dEÆ_ë•»÷¬™&éî©\-ã©qÖí%çe 0ÃhkÙZf`ÍB·’&2aIq¸Êd×µ° °Lþ„'«-mŠrh·Kh-ÍhU;÷¬ÒæÆ‘_"}BgŒKÛ¹I¿žç€‡ €IZ–¯ò·{&[ºåÏpæÎæNI„œ7ĵV¶ ˆÒí£&ed¬nÃégb"±<œŠ¤'¥Úk´Ñÿ·T­`Ã59#î[A™²2Rˆxûݱ>³©RîÙ5ÍnIÖTe£ê½¬µÔ®yBy{62UV)“ Ó"ª£"­ø9zEÉ×QÓûAõ%´-—ƒ‰!¢bHÇÜJA]µ—Ùëõƒ÷-w$©¬è•ûÂ0Ø¢œø|°„ªÜBÌ#­ˆóÄ îm®`uÒJ¥µ#Àå…»Œf敘ZŸ€#g!NÃ,ö>f q ëh‰¥“WÏ–&‰Ì¹{B‰HFWMط΂ÝëXž:’ë#1ƒ×ƒ.Ú"ß®¶¬MìXA¹2Ó*±Q6T Ø£·ùôyÏÊðžíî­ÉXT 6”gÀc0•†“Ê_|ï¼JA¬e={;qÆòEìÓ åØLõ¹Ü“ê®%λo5sj«Xy‚`÷Üös†çÖbdÑÝ0-¬š*º£@—˜y•Äe’–Q‹)•¨ž(m1=óÈ䂃ÃÉÏgLwžôõ6Jr®Ùòpâ3Ð9‹Ê\;dÆvÏŠ³ož‹®6Ž–[5T×"çæÐ;-8»Ë)AU¯‡ ”Ê´Î]³NÆ9[É-G³§5‰./™“Â%+èÛe¦Ó{¡N xZá3Ð6(Y3"Mî*'%ÔÙ\㮜7æâeWgçš;Ÿ‹ÊXæcG•ÇtÅFúÖ.ï^ã6ý…ˆ¨;2{v‘«qþßK{3T¿ÑÎ¥oí:".§`ôOÍþØI®Jµ/ºâׂ?Oõ'Dvýâ-ó^ýçw§‡?ßLrÈ/Þ> ý[}Œÿ?üç/°x„Ä_\šgS ¾ÌؾþÃ÷-Ùúöm>G–ßÿƒ÷½ú¿çßß&€QÕ¿êàsÃ䇄~x °ï¬ÄW¸ÐŒÐŸyŠ/£ ~Oˆ@ ôyÔçÅOúФ0x„ž|M>îÉ7í#I´u°*mr»{¬>”UoÛŸ+¡õ|òš1‚í«o~o/$Æî¤ÜËŸy7Q ßÜbp;`k•¥å´ü÷¶ø»»’±%7æVâíáéá͘§´k™_/Xnw§ÒIkSÔ€ùà{ÚâVÅw>Z+4/´ýd’FÝ=ðÉ6Ú†ß$é(¦ÿÙøPÇ$vUì!tÔ¦ÖS ‹øa+~å;žm`ÇN7L…C“oœlë½ê&é¨lÂvƒž_õR2Æ4’+ìÜùP®Âú?Š®{*qµ^4‘Â#vÈcuÚ#áëø²¼Š…¬PI0:€Ã,6G¤ºžp…6®½z´FˤŒ¯„­¯(ó£pÀaåÅ(;:«·Õ´Òè*Ñãþ¤Ž×ÎâW•§¶ôšàÅìc«=‰A"Fš$Ì,N,(KliX}_Í„†-F7V4÷"dþ?mã@×µ®×Êr]w¸X¤²ÃüR „¡x{ÂÍËÇ âèiJöøÁ`á™pk%tEÐÅ,”ÏéMu÷ïYF XlŽ’“¯÷;.ê¾~dòª8Þ YÎý±’!ùÛeK×Zyª^ ÀCEB!¸®LÞ+ç!mgu…ÝiŽ5DøÑòš[ÀÕDˆmœe¶zÛF†{Ù2Ü…²ÎvßÚïyrtéú‚yÞTj,©µÊ}%ã"»L?ï0Øë·ßjÏýîôUh-´l)‰øùûûwSÜþ¾ãZÄõ:„ˆ(ÒÐt4$üøí·×€øý}ÿüýwÉs8’ψ5 †€LEë"_Ë""FH/³×÷íuçÔÛ½¦©bÐTî;¦²ºÖ²ëbNžŒ¶ÖE®µº€ŽiO”î;¿ñE £<›BUR8©$ÃW0³)®Åu]˘×r\×mºy…Þ~ç5º¬½í‘ÁüVIòÎyW¶orÓHªV‡ÂZvãaižs99×–)/òÎÓ8Pà­½Œ¬ÔØ€#¿Ù[Ö+_4À \$ÆM/]éyà9ölWq9·ÅˆL$èá«ÈCT;ÄÝ`ß½Ÿ!ÌN6æ`\Ži@Ù;>–‰ 5cT§Kv— ”ô!š©.‹‘ýÄB‘ì­9kJ!a…¼Ø9J‹ÒÈË¿)øç‡ØKàoªŒŒ{°Ÿ6jë§F.š4}“Š(É]Cäî§¿õl;ÐgÆáÌÃsäbE‡ÚÈZÎ'âh ÂF& çÙ‡µ%¶I?•Ÿ¤Ž· xVqéïus-ÝIÁÇá>ät* Ùíž%-Í[©Œ[æ5a™nm€`¿3ÜÄj¿…Yox «Q%- ž(¤ƒ!Úuãi-"²¸×΃ÜÁ³¥ãW”µ¿ØŒiÔëéR+¥KÏ•õzNÝCÞ 6é'éÊK—v€h–X¬ÔØ&YK>ôü<ØÖˆ|f.Ëy¦ûX¸Ò’ÞÓTtBÓ‘fR2`,¿Dn%kt/;Pæµ4Ü n9FÆ;œ&½ôÒ]Û7^÷ =üâŽSÍvOÇzõr¨P_äÑ”™ŽÅö«»pÄâ‡vH²Üz 5ã‹é§k¸UÙf²¸KLP¾%ÒQVí{35jjµ°ò¢lÄé`7yXÊÃbUߕ߼!bß>’™ ƒI†ÕÅ­u±꪿J‘+×Ý+&/r`c šýÉ3ÚSW¡×'Xf9©ÎI‚èè(ÒY‘;›èìªîx@ý{­S1êüÉfik—¢Ujš;ö:‹ˆz¿ú‚.ž¥=P‹g'jþü±^ÔÍqöɾ¿Ÿ®ÿæŽ*Ý#ÂqVN43Ó`J ºãNFChu D ûøðzé{3¨žê+O˜Ü'ÜúƒàðϿѵ©ÇVþt5Íâc±c$Ú½#%xø9¿8z¿(ö:’ß'ܪ#çGå1¾c=~á1ƒöj³ …g‰äªŽÿœ£ÿùfÿÎK_ÔçŸøs2©>AÿÓß _ç ÿsj¶þÀ³ýïøçïÏþó篅~]‹ûfÿá/²5øÃF þ™¯üûÀßóôÿ½6`éQG¥Ç“: ë’âw¡sûñ14% =ÿþx]@Ãóîê7þyý™ÛÁú÷oœþa³ï¿äHðî/²_ÓâËÏËLúÃöï-%ŸQ,MP€ÉÌ0vᨠWl½*%ÙãéZ-6½¸i‹Ð>­6a_“*=XkYÅÍz:0ÛX¡é,ƈ|Ø :‡›gÚ¬¸–½®ëýó-Ýéüg‡«! º/=G±[mÙ ‹'@DDToãH‹ç› ð4m%þ ¦@Y”Ç}Ú÷î³aI¨ E7ò'c3íÑK[ {½súö—\e³¨`°6‹bKûžÏb©S$Íõ(ƒg‚,­ šuún]´beÕ×¶¹$€xG¼(Ä1¶£Añ²Vj³Ôµ #}ZÕFë°Ëœçèá”±Äôô ±ïr›-.èQÀ˜- P™þ箘ꡀ,b~SåO `‹½5ÁŸ2KØÑ%,f)ÌÍ;§½²sD$»#탅v[|ñ~»kÔÞ¢ÁÈUÈ­xŸÞbhÛoW$Ê9Ë® »|ñÊà -˜'ì‚e2æŽpýX«¬ˆÀ½ó? Ñã­ÀM,5à²ú/ò©i­EÜ¡ø[ø…ø/{ZvѬͨ34â ÈCï(¸KÝí¡4›­"x•Щ¸˜ãŠíMŠdä‹FE¼ïû·?†,_‘¦öMmG`GÍüÎ œV´‚œ8#b÷FÒÖZKæò×uýøíG…3$DÜîBà–.fÐ;‚ÀÔ÷}{q¤-}› ¶Q㳋¼¾ßï;Þ5DÈé§¿dßÁ³ÖØ`åc/ÁÐ .Kþ‘vñ¯Ùu½ü}{©8~°Å¹ák®Ë ´ž~TÙ;Ã2Ó½*³dÚÐI‹p—%•É^ËVÖ“SÃÉñ.l]£Âªu8 È‹ô/zso8sœS¶4,[M"°kÙóF÷÷]Ãfî‹¶±%dM%fù4o¿ý¶/Òu¨}å*F}‘î‘‹“µ–1ñþùóMÒýæêqjÅñBÝÊ×>üþo¥r2‚¢fŠˆFó…©H"§¡/#\E&nõö¹ k|­µ\‘6åüÚ8u¶§7ð0/°Õ…ýœŠÐ…gìÇz½Tsu˜(îA?ì7=O½‚CN¨Ž§4ÐÀ¨Ôvm¦¿Ñ‰dE H’Ù R!]‘8©!ý—I¡™Î£ê6Î á%7ÛuAÀ¹zªÎeè)çíbéA°¤ñ<ôyÇQ[BTsξᰯªÿÅHÁ3Ê&šMûw>õa9ÔᲘÔÚBáãÇæ,ëÕp«¸m‰¶„‡cÛq1Ëft 7Ù9m¼ڗߌõ†AvÞZ‚t7I›åÙß¾Œž*o@K]o’oËbT*áì´eKkY¸š' ø´Ød¤H[ÍÈð ÒcRF3»Ì,*pc BÎV²ÁJ˜Ô "q®¹aÖh÷„œ³°¾ @ž£ÛH5´Ná>ír3„ócϱ±ý½¿I‹¿ضØV–ÿ*=w|M8+G ¿6ïþq {D±Mdì©SÝÇeTN"Ÿ;9è]صWëm@žÔóLqæJ˜¨Eú&TS©à>“q@|Ð!u’‚ Îý™Ñ}iÆÓš•‘YMàçWwÞ¨¡,`de[ô˜Ç ii ±JO¢UÛM€µbõ0ög%¸òÆ`M~ôØ=I1:d‡ñ‘Càá¤Wx”]±Ž©C®áb® Vñx “‡Úß׈¿æ^m¯>äŠceT™‘¶¦ð‹z¢'AíœÁRŽÅ žBtÂ4ƒí™ytùÝá#UŸ½=ÃÚ¹¿ëüÔà|H[1MÛÏ›ÖA@îÍò³®¦7îäg4ÎHÝv!îJ=ksL›4vù£„OçüVßuØâXáMìcèAö¡ýJÐ;C¶M hOßW*‡N´íYc1_Õ— ÿj%ÀÇ}+~AýI Yÿ´&úw=Êÿ’_ý¿êÿþÖ¥ù|}ï"ÿÏhàOîÓ“þ/ –üÑ…õõû} ´ø0¼Ÿw³mr?$xþñ™-ì„ð©¥ÿ‚ŸóÇ ‡×þ ¥ÿ>m+ãÛæGïîןå1ï_À£+xw›àOÙý‘PÀ—!ý9 ˆ-ý£¸"ímž¼+¦íf· Hœ¶¶|¨qÜ»‡÷Tð‰fÊ¿|qÀŒ• Ÿõ$Ǫ'7ÿkzKá%‹=O3ž"8ºn-æ.¦Ñ¥JЇ&ÌSÊÿ¸qv¿–³…c¶ÎtûjùMûÛ†Ð46†_Û”Ãe6Tã;üÊ]…AÙ-Eý¶yQç§æn·ì\µ¡1=¹µí_d*ãáIC'û½w{— p  YÕ«}6cUÑÛ°s í„ òÇq¶/O½´©µŒÒ ¡${mŽ=OØüÁ2¯Ùç»y]ÖÁøÑhòä]´ áOãô|Ëv‰9ã¹°|dóTv,*<_@“\°WMV"ø+}1PRw(ðS–ûŽìf`—™E`R:=æðT¹z³¤¥«·Ç@¨ì šn“ ª°¬ ¦ºÎ’tRžü‹“œ£ñ#¹Õ ¬êì¢5+ã^ýUû˜ý¥Ø³H^Ì\F’—QDAÌ ø»@¯S˜ ¾,Q²P„7iðKá9óˆþT¬èËRÑ: ’6i÷‘u€®Û´.®_oËL"`Æu-‹ö2$’i¸®¯Š‰´#2"LXS­˜ нߧ³+pK0¾^ˆokH¶½­ui îÃeðð’–mEܹ¯¯]Vܼ0·Q[öB©æ*–éÓ«]1[.¹hw)guºïHWêmœ-;  «JÞsìcf©Q¥$˜÷ké¾ïõ»‚Æejî8Ø ^\Xp‰L’²­……”Œ`‹ =7[hò{„JîáÑ… .˜8‰Í³Ÿf–}Æy‡I“`P²k‡SJtVÌ(p™¸RoîÂÕ*"Fõ÷À‘¶,&@—ò²q§aÂ#suáî¡X¶@­UD8¬e×âw¸{ôÓ²Ì¹Ë ™"¼Ÿ¿‹è·ß×Zu…¦Î”G&‚äµÖ]€ Ú²KY¨‘DõðÚ«ŒÈ»1EÎÜ>H£Cïû¾#.[Ã3áF~¶¨Ëþª W»<™*¢0ö|$«…Û¿^<Ò`ÖîÓÝI‘Zºyn}clYªæ|9]Ðv‚÷gγܰŰ>2b¥Âg³³„<›ÝWÀ`4½ðÄ?ÒŠih0ÅÖ÷¢Û C/"Âj†Q“Q5žežuÝûdf"NûïiY˜s¶›'Òª‹.ø¤ªÚ.çç3ž}…X½·³–¹Õî4¡¸¯Úþ˜è¢ŠXn$àÈ%Ì:÷´€Xg6ê¼:ƒVbM¼Ø´?E‹×8º+'‘”Ӕ궼€A{KÃÁ:s¹ÚõýõØ­&Š\V×îN¨ì)/6Îeùpò”¹¬Ú"æHmá¬2­ ë8*G­;[Ó·ï„Î$Yåѧͬú­K!Òm–÷µë-@:Íñš­õþ•ñÚâFí1F~GV…&Š^DkÏNð»Ms'phÍõºëYê ×ƒæá"§`å8sy¶“çÍ8¶Ê³;(vµö§ ¾ˆ¶9:;7æ§´!S{Cô¸·5nM8Ǥ˜ŽG°æZQì7Ð+ÆGxØ,gÕ¡]Àûµfñ£…Ó$U[˜§ó­ž—Ýô!òð6Î<«œ$û¹z6Ös–*žóÙäIõ«Û3øð4j}ªtÎlôL‚ì–á§œ¦Éê­2œe´ƒÃïùY"\Œ§ ˜Kÿ¨Âûêâúš·þG$b}q7ÿ£!ýIóÿ†Rù/Žá×À?•!ùÏŸ¿pÿ¹aÍß·é㋯ŸÇHrsßÎ ßô•|þËßýüþzû»=À_Ç'üòKŸMüHìòny}ÀvQý^®m“~ô3…8Ë¿Ìø÷Òl4ûïÏÄ÷û‚øÿ„þãp46´çyÒ(CóÔîªÚ¿Ñv‘Ô.i,1Škíà¬42lS\cäÍP/Š­£µI!8FÎaCvì6l,SäØ>hžù mòn»ÓyÞà | û©§(œ»Ðb¹ï[é2³µ–»Ïz'["Z;²¤’~Ç,Sî¬ÂÉ¡Ÿ¤ñœtÑÃWвF›âƒP¤Ã,ß fò”©üಜ0Ö2%œ`ˆALýbWÊ¥)˜)ýÅâšS/´³l—y™6iâ ¦`šóm'è«50¢-]Gª&aLçm%´PÊê­•"å¨\¸Å Ú>™6íÌUw‚:sýQS‹²?v4–5;sä* Ünj F.³;×E±µã¾]=êÉÑÆJ¥zUÈTNÜ~XeÔßwr9BBР…ÙzíªD ‘ … x+\{ÿQ'®‘aØà±>íÏt++°]iX9@³:Ðj¨2•ˆä¨FõÇ[©þ Ç8¦.®À¨5Iþ̽œ~Q›Túp¾ÄÖ˜‘Î@Tfù#ìuåžËo÷;ž€NÐØd²€^äeüLÃõˆæ"ïÜÁª&+·´f=ԃѳ长Iáà2þ¬Í‡m­¹¢ŠýÐ-½?^/pv…æ‘GÆlÑÌå׉ –íÇÊ^ÚEz^!˜âÝ:œ™Ñ;”R×þÛýjE•Y³ à¢Ý Ýô¨lP_¿5Óeöº.—< ¡‘ôü"“œ;N•1T/À Qp0yçq‡¼–½.»»r·¾bEÞ ß®ËÖìQ–-¥ñ6¢Ë³ÛH/Ù"qó­ Û«òZ+…d—ßì-uÈhaJöF9ûÃ?–û;)‘êÚΪrp›Ìà´VáBHçcW –Ç\âµêö˜œqL]|ôǬµX–«=וA\f•·È©BŸ¤ve\&õe;Þ¡Ét¿Ñ®ÂŽ´uÎÍ= p3’÷ ·»ßQ­n´È¹h\ËÒ½–]Ëj˜áÙ nù¾s ÁÝ áÆIç£:;@£5w‹3i÷$?²ƒÐ—Í2*º•ÿõº®UnÝÑ©@>GC|žmxù"oC‚ <¶\Ó«˜âNÂd§‹rÀ8‡•¿2S¡ÍƒP«/£ ¬1ä<¸4¨]õ`¬;Gž6Q°­6–1³Ó?«›«”'Ôsªq²Ôò„ò:ÖùÄÜ^ž!lQk<¥Ûêø¼Ÿ_bNd¼^¨ Ÿ?<“%è‡méoÍžÏQÃ3ŽKL›£2e˜¡YžöWmI̶ėrµ·-¶ì]+#rS*Z“,9ÍÊüM2:–-š¹Ëø¬‹2¾WVCpœåwy‹Ç/«‰„ç{nÖA«A‹ì¥ø &Ô%Ïl]*'Z\6ÔªF–lµ¨ ’öÿ±÷¦[r$9²&jÁºïÿ²·‹a€Ì¬æܲªkjæ$ûtw&“ôp7·EU ò ʉ’tVñCÁ¯<ÕΠœÅƒ|.@ *k2*+PÒÕ6ÛËK•*_C†Â+Ž{ Ý"zrMÐ÷ì]@ÏÒpÃ")! x,è;˵»ð_ Á¡‡ù?—náraÍh ”hÅõG+yž_¨ŽÄ^jâx¼+jAÙ[I¬NÁÐ8ÌG9†ê°0›Æ&Å„ŠšmVì…ÅB?cc¡^¥-làŒ²c—•Æ ²gq’í¹žlŸU½!Ï6i9â® Ânª±H¸NèÀ¾Ï¦±µÑ˜*§õ]Ëï­Žé,† Ç]Ã\ÌâšO } £(JÙ„wÊA¡¨N|ùŽ*H‚#òÓ*òäwÕ½ˆeR.·–Z¸BÃ"P4\Ä™p2 IDAT©)RÂq­P`Ú'‹‚F§ýÈHm:_sõ÷ô¥Úí&îüð‘ËhûÔ²¬ìáEÂÃJÚ±ªúá‚Ê-É~V’¾ºTøÆÙ€{vÍÌÆ<2M÷|à àÙ¿Þ͉xöÚ²Åù%tçÇÁnFz §f·®§xˆhÍò$ÊÝ^Ãüæ°Å}YëÓW¿8g"» ÉúØ<¡!5ky9Q¸jÓ!øðoPC»!â‡Í·éÁ€œ§Ä„_z›µEg5ô—šÚcn÷#>=~úÕùmIÿjSÀÅð÷„ÔÿŒ„ÍÿâÀáo”È—±›¿ýî©ðïhæŸþd<ï]²:^ÈWÐc/÷ó«ñYÁûÐáp†ágD ß døÅØ_?ŸFxÙ&ü}?|E½¾ÁGÊ`)†µ©ÇnÁt*ÐÿµÉþ¥MÓ˹ Ò^cúðžU¸§ë~æZ_Å޾ˇuðÖùp !Ÿý%LëcBíÆ”rËÛø¢#žQ¢Ð“U$,‰îîŠ-._=ÅÇûöbüí£‹ÅK˜ú±~¶ÕÓaù\»ßfåD‚j¦äYºa]ƒß>Î*Ttšò…*7 ÝéÔ“NɶP"hHÑ^ëô(Àl±"…6ÄúY;Ù?Æ•U;è”´tøzЧcýº>Î9öy'6êÅÊLúˆü×[’…øOÉÝ™ìd¤ª=ûÂqº›'î&öóMÚ]Ð"Á@ÏŸh%z„ÿ¾ês™mÇu­­ï9«•ÝÏ9-”y1Ï[·ÛHëúÄ¡xœE3 sÒ5û+ÃÁÈïr›‰çx2Ärí2_sOŠÄ:ï!žP,vòÊ€…–uʪê9uî·|* …1˹ËšåˆáL‹Ê¥‰û9Ñž†Oš>„_B6ñÖHð"+MnÉ~Jûªâ´;-.7Rü¶ÏÛ~¸®P a;Ó%­Ùå&0Óå µ7 ¬“Ðn;ÂÈë¸ÜEOŒ‡@¡Üä9ªÐoÐë W[DÆÅïÁ—ÇÇõ®cf7NãœÍ\— Í -ùìòñá™ø´Øâ†•»Öô9ãׄñ&òÞ(¢!}’Ö{é**íPÎgôß®~~Þ·ñ#ݧÍAßÎÒÚ£ nû¸ƒ³ëR¹T!*~ß–éŠ4uâêÄ‹|u’Ÿ47‹@4S>Ô˜Óâß4âV/BOW¦ïÀYS­öìk ˜²µFr¼i­Lͫ銋0@ÅUÃͬC¦§©½,e¡0ú´©×¡Så6ε™ðU Ï~ÿ`߯)8K¸»TÚIãa¨±*—Üv›¹RŒb0ˆšEG†š3†Ñt¯FAœ0×€¸®RØ¥çþ41q1¨ ìe!¦¢cmÎaÞ¹®ãnõd‰G@#¿Á·”Ì·D æiU~Qeþ­T÷B™I'+¹ OZÞ‹„©©jTGÖ>zœç¬BÈsúß;w”ú?·t.b7°;}…BÜîgõá>vØôý€`» H èz¨ÞYÛ!Þ‚}w­¦@ÊUe•U8m(¹iXÀƒïMδó"“P5Ê^æÂ4Kœ/¹Èz&pîCcK?h[J „–¡ßKN«è!guH™IJBã:µš¿±ª‹’’«äGoeÊcã}æD­²!%q”&m®Ó«»8)3c‡,ÇVÌaï4%°„Œº†…1ªZ úd”µ>ÍÚpôzŸm-G:¢[tr¨_Ž^ÕFÄÔØéT ¬œ¸å¯‰ò"—Å®Ëò€Ã*HZ·ÇòÝûr(“”¨Ò¨V ÷º»j'ùˆÛ"gm]ˆ\ß9ìî PLâiš:˜8—Þ%M—J—y”Q•BuÛuþºˆð¨KvàLAgÕéÒ\ëÖMÝÀ¾ÐÝ …%ËP»åyBæ¢O—¿¹ÿêù)Ú³g›`Éæ”>eÙTòÅé.ÐÍ ¢VוÔÊYÄ ªã Ž×C< ò@ûÂÐt~ ×­¥ÂG-¼ü%øR³y;Ö~V¯kORYÌÊÕq§€çg1®ç0ÍmF°*€„9Aå6©¿ÔöÕ ü)äçs+®M€f—Ø0ô´n¶¹)çZ4&Xé±DÁla{åz•-ÈÞ¡\è{˲ñOâ¹æÂd©Åx·Åc×¾¦‰7g“±û«e˜äú+p“{]ßýÖSi ™õq¬}ʮ®;€‚•–ÛÄ™5Wù…¯"N“ÞĹë×d½1É[o‰Õª#×5I(Ÿ„÷3FXrx mýYsÿ7nI—wŒÆâ ±¡¤–àʩͮl£5¦9i(~¬öáQý,„óKoEK°“; øSÒ¿t?_Ÿü©ß˜3ýúMéý/CðñÃ2Ñ/„Áßxñ¿&ºþ%Óöÿçx?ƒþÿÿS_óOþÆ/¾þÆ+òu2ýÓ2€ÝÞò¼óf~øö7fyT3yR€êþZ¨…Wä^_§ÛÝûoÊs@0hmY²)òÖBSüí ._“øF¹ ížö´e„X¡R”•ìÆ\bÄó©*¤=ÏáÄÞ½|¹ª±Z/E#RbñZºÎŽdG´—ØËív¥™fË…/Iíïý^ŠÁ,</2IÚú“Ý‘» mKšó9÷ëf"9šü\!ïÛâ©êÑAŠ›ëQV…£È@вªb$Ìäá娾± ]ðÔ6¹Í¿©ªÆwQm4Ó–ÊÅÜåÈUÀT3pÍÇ*+(ã:)õ1FÄè6ûXÂBq™Fæòws¾cw׬ÍE4€Ò¡ê d(й“§O$ [—M”ч°U\k}…N¸yKܨı<Ú¡‚‹Ë>::ÅMDŹF…5ðeÖ mù(’ì’n ¿ÙË}{¯¯´2Þªjðøà5±+àµü:KŒz¸½aYU.ÛþÎÁwÇ<GÎir™>ˆ”ȉ].Ä×é Â\rÁiÅÕ.Òø5ž!.ú³Cš Óì¹>ê6{•íÚÃ`§b²â1]cv‚{àíÅÇ¥çRùž>ïbŽª1 ÃcOvÕ@ÅÜ¡›Ó ê„W«îwâ † Ì=È t‚îG×ÇÇ7½ô°R œˆRQÜCÁ^lècŽ$Õ¼Øm¼ô‡V>kêFéæ)NÑ4¦R äÎÌ#äEm"\¹T3;zy»‰; —*GH+ÏdtYŸc´Ä7Õ#ÍK³lESs$Ý3 ¥6ů UG<õ|j¨*裰³æDPe#I8h²ÿ9ÐsŽ[ÓÌÝÝhrà–—TªÎ„Gk‘Ç‘mHŽV`¨ªPz´¨åÚ@®>•~ó=#Þ1ʨœ¡íÍæsFžvWe< |/»†ó­Ñ¦”ùXlNÍo*‘C€°Ÿxõ”Ä+K$ÍCêAŒ¼¼i±xÔîi÷AXÛÆŸLŽ)¡m‹ Q¯ÔQQ¯;„–ˆÙT–2ÚrøŒ­5TËhÛ) æ ;S$wÖM(:4âh˜Çm•,€\@¶‰ÔÔ,;(jÙ㔣#ùdOu^¿ràÐFªÌÂ;Ý%^ÑÒ˜Åhõ­–º$Óû. l+"Ñ‚‰ËaÕèìDœÀz6 6•PÙÐÞÓ*6gÄ1É%Ë&èrœª1~˜Ä$3!‚·%ȊІ»ÖdfCôÈÜò¿j‘/ëQY°ÿ‡øÞÓ0¬02^LdÍÉœîÊj| /8‹Ÿ0Æj‹S^o}$¹ÏÅAgñMy¡ÝŽƒº. á-ÿ‡T„UÕä\9Ø`B6xzÒ&êWªÎ1Vªëœ&<;C‹ºù @?ñVdA<ÇÕ_Zꊑ‘ «K·WÚôׯœ–éÌþxÕwI¼—·¾¡%³ÃD}€^1U|=8g‡W!‡R¤ûVŠ,«|öñLfŠSW•K²R¸Â7G`~ˆÏ$)n;¤~¨ô=îUÂá ¢Ði‡‘§hg3Æ š\h¹žòÉ:1M¡¬²åg/T㣟`döÀŒ•‰oÄ»Ô:lzââJÔmBËô_–ŽQœ«( þõ]ä3ÉK¢\÷goíKÍ-–àŸðQ1Ûmäo€…% ÷šÃ)íSâÑaݯƒ¶¡ud>ÿøÚ‰ç~)7 у¦©'‡20½Ð楗¿¹¼çKÏ%r€Tä¢ü#þ¼Õ.ˆ k-Jz¤ÚAèÂR¸¢óÙÖz E»2_š“ÒxSF3燂¤ß.Q® ýÐóqUÇw´ÐèRãøv@PƒÚQ³Á.%5§»‹*WUœ»5=h>*4*ôÛÇÇ|œ‹¢×‡ÂùÏÏïŸ÷½èP¡œ„&ãÈ1¿[i …žÈ¯¸](”^g T’>Ûùê¸áÞæâ¢rô²zà6óèK§×–ª#øÇ·S®íG¿5ÝÝ(G\Äìvwˆž f÷:F ª …P£™0„gÜåõŽ#áîQÐ #Ú$o½÷qÕ §Å»ü®(›5÷+=мËöš(p‹–¼Õl—.ùÍoBŒ<8s Å©ëŸéÆ-¤¿ÌcVãët–€Yë1_W)jËA "‰\Á¦te»¡Ãy4œÜî“A¨Ä_®O©ÿ„À_–ôº_óa²NÅP´¨)Ft‘¯ûøä†]æÜø˜CßKhf'°Qÿàâñfõ(½Ë±*BóºLðµ^©g‡Ó³;Ç<9^Ôƒø.B"ïûmµ ºq ïðùQ4þ§qdM’„~òûnúÂâ6Í”G!7…%#U F_ô:’¹|ÞíÎå%Њ “63æŒÛÅOŽÐÊ…ŸˆíÆ(¬±KM±†Ž6ìét\"ïx[Ñ9 Û³@½^@@Q Q[Rðâ,|Á¶uäéèt-Â¥l³+cj׆{f0T&Ä@º £WGµwçV%yERÍT‰¢‚ª94ñÊ<Å3rW-cy-0šË~Ër{SW§‹|R4;vRÌ2ò$—§+&]„ࣚƃ®' 4¡‚ž¬8‘ÊÊtv‹ò³z2–Bš‹¶QŸkÓ.¨jZ/Å7x§fòf©|VŽWûhnâ¼"ßx«4ñiäÇLIŽ˜†<ë&P™ŽškÜ•s¬™¼Hܬ(,›Xï“—&Ѳ¾L{™×Œ‹À{,÷,§Øi(»ŒaE.²k-çsq·^*¤ˆ9J  á&‡Óe"˵µ»Ì5.KÏÉ7+mþx¨)VEð`t„èÇSpÅÌÏžä%Ëøð>(WèHÆØþ„¾pXB6.ë¶ö¿£3è]~myî I\¿è6æ±Oí| W1ÆÕ¼²‡/¯ Ê_kÆ—€300l§#êÂc»ãcr‚¢MÒ™í†ÚAmñĬ_=ç)Šî^Yx°^PŽß,£Ž¢À‹MžµœKãþcÆšEx½ºˆ&pm¢J9ÀsŒAyL~JRyB~ÊT¹A>F­|hxx%ëo‰à·,ø2 À¯¢ of؎ýYˆß$yþLÅäoKž²úã™!øê•ß[ñ¯i±¿["ðŽ÷ú“WþOÆþHþA!ðß3€?<ÊÿÂ÷ú¯ϻȗW0ó<ýb¬7ê÷c¾ý{ïúKÍUD¼pÁ£ù?ÊœðŽ÷iPÏ£Ï_|ïÖø·÷Ð2©¾p‘žFíG³îÎÑrñÀ€ƒ'™,ý…‚¸2*éÊLLÔµ?ø¼~W¯Üûï?òõ›×ˆíh®T`ooTÕ<|íâ ¤Ÿfé Ëxö¥<”« pj†À¦Ï’倽TD¾Öã¥|d…ZâRÌ­&±þ:G/½ êL\òXßãmeÛlI$™?…U„ºßáÈ=ªNª{VT­Çy°º=+ªÂã£GTÏ}_0x˜‘Pæ†J*2`îž~RDßÊu^9|Ïý^†s%oOž‹yZï]G´kÚ|ÜûôŒדނ¦=°cjÄŠ—ðPlP=ÂGë$Œ«_ ÿ’lÐ×¾&ᧆV.v¼Ïð'll.­œKy—…ÖÉX-lïÊ^šóZÛs༦*°¤Iô|»ð=}B.ü6$½U(×@çG›xÌ_ÂŽTX—àVh‡˜¡ÓS’îÿX F]€&R9/;¹ ‚Ó±4Åá¼ô« ‘E·]ä$ì¹B GT¡r$@øiÌzx‰ÂŒ”CÏh¨¡˜«‹|ÌýñR¸\Ž€Æ0]Š‚ë)ö)†Æøg±xÒ||§ÝðA“¸îb0Ã;‰ìŸŸÿyé!D¯#‰"‰[…_Pž£fgæG/ºñô"Û{„Ô}|v;©8eØ•´NЧVqôÄ6 éÐÌÅ .à3.X—O3Utò^ç¨êu©ÄD5KºSFD޹UŒÎƒ£­§È“D$D5UTŸoî´3 3³û.Õû6#íV˜››KLh ×Õçé?,ëÙ.÷EœÂZÄe§í•ãæî~þEF8j³è% {¯×ºp8eÃl©…ê¥zÛí;+'„^°ûSˆs]ªçpLóµ–N]¨V¬3”Û¨Õ_z3†‹jS𡈛¹Y¦]Vü#lã¨êØç¥ X¡E‹æSÃnêb%¢2¹jv[t ÄÜoœN`d·ßë.²°É‹¦w zÞƒsâ;§X9hò)ê‹'jÞÓrp-‚bž–h<–EZII²rR2U÷A5^rÛI˜~BåIo.ÑîòErùÊÁ +íÅi\Ÿ—ËZ(­d—%å  œ.å©îvw<‰Áº½–ÐðÂiãêÿªi-Y!r3·iªÈŽY‘ÌÈŒ²Zæ'7*tòBä½282?•ËHr×]Ó<´Ñ²ã´A'!\xRî7ÊqÔ#HK˜æJT¡>ÁÍ:[ó!íEQæØTÛ2Ï~Žgûmº9¼\EŽê‰E’è½ÞÞXD⬠4å‰;”VnFˆ ÅK§/.ÕNJT{vÜdz<ß)Ò(F–¨wÁ&Sç CGÓ”YGf5äáÏȉK+$ª±æÌ!`"zNÍ?N-©é³¿e)tüuÒ¹± îO•H¾ªwpŠÃ=Y¤šð&ðI¨o›Vœ›iZ´•ÊëÂ+á4NQn•,íÀÓE&Òüì¸Öí‰ÂáˆÖš7YTr¹ˆWµ\o×9Š˜… †&rËRœ±£b~Iwœc–‡½× „$²ÿ5«}ضj$y°,Ã.ùj¶ª°"$KMf%é\T™+º`áFqð ÷ÈÕÎxq—¨fY‹åNå>\Ðàæ¬5žçFš0= ºí¹\c4»ÿ=<ó"kiN¸´gS¨àTrF˜Oœí©ìÈ¡+x¥?]\YÉÎdäëtÆ2y¬ù0p¾h±'g¹È9½‹|¬õKLÞ³TÍÑ.ûá1>>òézÉà 6Ÿÿ1(ÚaÝ;(©Ф<drž<'!38eÕF×$’pºÜîÒá¶|#èV2NñÓS‰áù8“—¦hzÖ#\LŸK%Îd6]xè§5£¦ð+*>›ÅºÅöAŠ=:^d&}«)QE‹÷Ùp.¼ÞÊxFö¬9oÁ‹>5ct< «d£ßÔrñ{¢Ø³û§-—/ð¦/(«¿ ÿRñÇ×’?:ð÷oþÉûú÷jô88øwüz ïü4ð÷ à¿ ðõ,Št9á§Q›_¼Û÷ŒÀ# \Fç!»ü࿇üÅñztê¼àƒšYø|K#²cà@—À|ÿ­õ÷)ßsúgºéª_żQá-ý€—‚>Tþpúµ‚I¢6KAž‡j}î‡À²Ô×Ý<¼Ã3à~~¼z‡?€õ¯ñ‘®sHºÙ|XÐÞCQúÁ ¡ ú§I£“Šßt¸›GŠ'[vOO+z¿™—û|üIEÊêÌ…L’XRY¾.´ç½_Í×?3a¼y#Œ¾HƒžÀ9« MÑ¿†Ú†iEîTá71Šïí3±r¹Ë'"îb֞ݚ`4,¯ŒÅ9ïõ1 BQto9ªV;Ôƒ²`¦Ç'}ëKú§rx˜,~·*µ¯/÷ˆºé{¢§«¶ìèΨe1dêâôK.(ÌmoeE¥²ÁqqN‰‡ÉRBarBqнG„dEU¢£ùR¤yZz¯P– 3?ªrD|38Tâ/&ß.Õs>èß¿G#*NJöå Ê|9YÆ™“…ÚLõ9 ¿Ð$#”ñIÖ³™âD RN¬ù\'r*Ê jŸæ~Tƒ%pFP_ܣ͗¨‚cOÈ㢽•¸·Ï){.\Š;à¸^lx‘“½î2ÒðŒCDqßt³s zÒC.‘ë«ç/ëkõ|„=õ~[¨‡¾ŠÿT†Ý!òùý–`\änôÜ¡ßÂÏ;\ö~>Î7®û½.-C<%AöáÈÎ(IN°„Gá×±»­Èhâ8#8/Õs]аЅ©Y+vPѨ,Òƒê¹H^—™›ñVšº;¿!„G‹ÃôœõJ }¼×ÜN@õr'ŒÂ[Däãã@q]—âÔ¾TúŒVÀyåX@Ĝ添‰ÙmBúGá­£©²°"Žh„e€… 4;9ˆeõD}ãrøÚ÷ǽÈó°ˆBãN‘‰,.7Îj3#ã¡:â°~\²§„·Ý¨>ÛùE F-AºÅ=ZÜ•{VÁ6Tæ“=øi]k-"n¤›\'Æ4¶Ÿº` –O}é#Pd1Ê,{9’EõÄ­nát¼xÌn!¢Ö)ÛOeSƒ‡l0/yAC®âÝ„ˆqmDË©Šn\¡ï¸_EÿJN¼¢Z²i ïÎë>×}ˆñ5z gÒHDÿvI©SK‡ @Ÿ(r×zƒÚÚÊ:‚´;q’]ª9ã겆Õ6jæá.t ·™¥“Z' ‰züE‚ÍspUC_Ô0Ž“Û¨Ðþq;—ŠŠ $â¥ÙD÷6û'‚Êal8j¼âë”H¾{>ú‹‰ï£R¬ ØÌhU¨B¬OƆÈú_vG®(Ncµ¤i_î"°è‡Ùš“Ó©ð‰tKZÈCΉž‘’8‹ØSëŸR•§Í`F±ÊsiëfõÑÈnã^œmló©»ôâ{=n€Î9®´n^&|x8+ ª’8MÕ°cŒ—ѼR¤ú|)–b«T5![ƒŠgù„“Ìé|uŠÚ4ºRw€õ‘̶§ì¨ ]™yó/]Ë[Ï‘Yój||Tk¦š>hG΢¢©ð;Kæ ÞûJI OdQÖê#UèµR…‚‡ê8›Åî†@êôU¤NÛ¤¹qÜá¹æ„p;ð$¸THEWwEÓNù²ù+Êòqˆ‡K„bU‰ÒƒZ“5•š4ÐEp4ÙPyCÉ…vÖKW3Q'}´(ItB,üÖßy¬ÈîÀæ¢]nÀé Ùɇ Žæò;iA1ŸSxí…½ÎG5¥-]ì§UÌTÕó{g®Ðs_¤ ŠP¼µ)÷ýEÅ""®ª3–|¾E¨³i[ØsLQ‰€˜Ú¹È©iòÛ<)Gtß6O^ ¢/TÃ:;o‚Õ Ë0Vûwmùªu¿˜ )›ñSÙ&%»ïŒä¹ïRÙ÷Â%lCÒ^ L<"3ºnv IDAT^Å1­ŒCßÒ›o_lЮ²Ê›5{òd䯓®škn²pÎìÊ¥šëÖ—é[¸ÅW$ ÊÆ÷”ЮÔ93¦ž¾?2¸'uå]àœéù•;5Æ ÔóFÑψè™zo̹‡oÒ¥Vh€â›}=—˜ Ùn8¼»úÿPqÜJ}‰ Ä6È~­~í³ÿñ»Àä’~×mþc2~WõüQ¡€üoXìÿü%|þï«ÿ_ýŒßA~ªÛþýëßö}R~| þþÕÀwÑþ7Nà÷â_=;ðŒ^í ¿.*ÿùúòý‘¯Júûï¼{ù7Øg×0Êw¬üÙ_lͶr5ŸòE„€½‘†ÜL’³5}‰ÞûÍäY´† ⑚Ä#šÙEô«`×MÆÓˆ³â]Y”Ž¢2rÎùüü$ùË`>x]—¾~ïun,"½p"¬~Q€zÅ’Gù5Ëû_ôþ‹{<Ó…Ìe:4%lVM\Ê>H9*ûJ$”•&|$îîæ Õ‰ÿë–+Eß=…07=GªT¡ªð~·)LMƒ&‰Hr]\>Þ Ýt§€§…YÚàæá¬ÑŒr@à>qñAI«ÐX. ¨¹ÔþÚ£üØ|ÐH­Å^-kÆH¢³T÷¨ 8§,Wá@TŽF]Ï É\H£•fÙ#aä8™<:%>aNß8[ÐôRv^R!pä•ÈmúíÈÚ‚"HFCvc¡b“t®´_®|üŽªB.øgöS¨c-!l¢1ø?+¤$„êºOþHE©íñÊÉUÑâñ !×%â4 ßÒ´çµ%T€ Ìi.fT±OÞL¾³Ÿ‚Š1pƸbnqk~á2˜ãðÉ]â.b^Ù(…2>›xWg®_G5Þù¬1R¬îDàþ’Kñ…8*Wî`p©~?JÊgü~™Ôdȸ³š&ü~ù•¦¾é'€ÈùNÞ·ÉuŽt,W4m0ù¶æ=Ó¤|’uÖ ™Sx]B*«…ùN ÎËl¦zÎÇÇÇQù4êDïÃçðçˆy\PGõãœïŸŸÿó?ÿ´û3M„§R&h­ !ú\Ñ,zi‚üo!LÎq(j÷M³K¿}û àœ ª‚û¼²êÌœ@ÜèJ·œù ôCkd‘(fuõáõƒ"ñ5< s6x]Ui¼Ñ†¾xVõÀ%ÄF§'‚à&?Ü??½âqÖIvµ‹ªÝ·Ñ!ˆ›Uh¡Àýv§r¿J×u’.]WÞ¹.HDÍ)LŒNàªå ºˆõ„u=¿Jcb×åÌþ,ËXûá ¦…’®™9 \̦URê7FNæ¤Ý½öH‘|D(4Ñ|wUhõìðI«:aš]×ÖwÍ-¡ªçÜv›Y ÌìÓÎJÏÄÄš=9^­|ÙMê1¨[ Rƒ ë6t¤‡h.¹NAü™Á5»Î5óß•6ÌÃ–í¬ 9²Û• =Ì–lˆ“ðú¸#0Œ=_‹V_ö}ç¤óU«'·äá–ø81zܬaEŠH²£×syƒY|cÖ! q&ë[ÑõŽ –³š91öíC•DÉL^j'fIVYž Ì”‚Æž(M2¤OCF£Æ¹þÞ€VL0Ÿ’@º6ToVá»d´ަ(+ªP*é–k@›Q¼jv=†}3ˆÀJÊmuõ•l¦ïóKË.4ä¨\º¾Ø¥Îa:.í™”ÛnKuQ‚޶ ÕÜÀuŽ×ºð%uW¾0æ³½{A/#×TM]a)y(®ˆàÍêg=ÈÇ•‚ê‹]þ…î ÑFÍj£2H(„Ç„.-N ZzVõ¤‹ÐݨԥkB‹‚£ÎE—[X(w/#Ú¨Ý ¬â&VÝT61áÕåG.AÑ»¢c¸+çðìÕ _¼Ëfªoá Uêìé¢'Y3SrÍâë¿=w‰ý0€]rä +‚ËG…ºz<´G° éÅyÌì²"îH€ËZîÌíPâIÖ‚¨3!œÅÄJcÎ"£Sʾ5eR¨ªB©µx†šuä8’ÄîYw @qñi2®»bñ¥A”M.|¤cXO/TÞ»ý¹¶vËÔžëä¡(Ž ÜN·È{¤HøåKîA‡¸zÖ £„Y/Rò?_¢þ’D5™ªUI Ó²ZgØ©\®ólè”å'5™²+9]dÕ¶;j°’ U/ÍÇŒÛÙ®ìæ‘Š­"È“%/îý¯Þ°°×Ö*ãû¬j uPwQÁ×ä«ÿ˜[L@n–Wýô®¾@WË;wá©Æ?Žã±PU¦-/8 ¾©X56b!åÈ1¢¼Wé:{š%S+òSIð%ÃóÓ‘ºì¿0ÍO¬çGÍ¡_é÷¿iÇW/ó2SÅŸ:Ÿ6ø-Ê¿òÃþké?ï*xŽãåïÀ+ùÿŽÙÎï2©¾4ûãíÛÿ* òzÝâý‚Ä­ü?®Ïx/ GîWjúWãàÿ%îΤ›O“Ͱ å%Ÿ°—.»Vw°<-µûšl?G#Ëúÿ@ Ìðm´Âî<Úˆ–GR|·Ï½Ò~âœ(µW)RÐÌýðüú.Qè9Ç‚XŸ?u(áªQ¼¨¹îÎ#«{–„õâb9¿j Ú  ü ³fàû›F¸Ôè7YñÊ"Àž£‰~ïw¬¹Uêç 0WqŲáÜ×.i‹»8;]ÛiîÇýh‰Šºë%ù=ªRD ²¶ÕSÊõϽ/Ê5Né°N¶Y)»k/;ؤ0źÖÜ£.³Gc™››ÊÜõ‘˜-cˆu.]lÛsÇð ë°)Ñ».¶íC±3(ƒô}ò­bQZ°·ùb¹Ž%Õ9lc`…UP¦f`š'ÍbŒ“cëxéë7úÒ«Qöÿ1/A/‘ïÐ2š¨Öœ-öI®¢z€Ün_šŽæŰ1†Jz.ø¨¹bgä»% 䜞RD…föRô¸‘ÓcvÉù4ï œ™Amv4ŠÙ§ˆØ}ß>4âgÂ6XGy |Îö[ÑS †U·þ2ö×â¦iÇiG®4ùìR㦑%ZÙv§ñS.Iü \>>o™CNhmŸÑÍî•ü¦|äü^‚C•¾Úm zÇ¡ÙMÑ&Í@{™ùu¦fœ(v2„ŽKÅ{YÍ%xÚ٧ȔûwçI†DOyx‚ÏÓùøðñåó6·‰"Ä­ã|0mñª“‚¨{ )¿qž¨ÆPø](„=—ê9GõÿøðÏ›ÿüü¼ ÕG=Ä.‰Õ®á.N¸:“å3r””ý^:Ô5éP…¹G³.@÷¸« ÄÓ圭>:ŠEd¥-®QÇ9 ŹNá÷‡í]cÒ‰¿ÍÎõq!†±"Ñ 0–å|{ç.m‘K½#®gÉ¡ðzœéZ•{—ÔOg¶’þô«’z@+Žâ­`6¡Ûz” kCj¨ì¨ H\¹èÚEÓÍÚ[ºGóÆ®Ó/™‰ ö&?Ê@®ëÜÿüç÷ÿû?ÿ×M(žÔúz|µœ» ~2þxº'÷!jE„áì\…tÜiDN—æ°ð{ÂxDo§¨»ïÈÈÀMææç ïUÿ|¶ÉåÈ3ÜÚ›ÿµiÈÄ"0Ê%õM¾šek)|(™ö«?¯z ¾"}ÊÕ9œðŠú “2„<Ù3 (ÀQEa»u°%–Ⱥq¼®[ºdª:{] e_¬$ÐÌŸB÷¦)Œ$ƒ'¬AoÙÐ0 L¥þ7î!׬V¥Zî”g]÷ÝDìÄqÇåsfÁæVǨ•‰ƒ[ô¿Yʇ›~V •{,û=O[rº8¶~®Ì-¦ß µ(R·rŽÈÝöý´±(»[Yµæ•Þæ´`†6œæCv”¾ Xˆ¥¦{O‚'¹EÞðð‡4§qM§”xÔ“}W}ÌEªà^éuâ\Y«+ÙÊP}Ð8Ñgžžóé¹i.ˆÁQ\HÑÆ÷ç<ˇ7ýßÁÇ>©¦v+=Ýöé½ÌÎbî[–b¾­AöÊjUDÔIÚ_V^‘·¨7Ïæ˜3DúÌ„0°Xy5¾ïuk`KQeíÅàSÕÌo¨<Œfð&Æ…_¡³8Å*gg‰q2ÕŒ¤'4è*XPë;ªR„,’1á‚bf@t‡Pà9¡–M¯ÖñDÂN@¾cI}÷—Ù Qc&ÒÀ–°éc"û±øAM26u ªbî="[@¬‡P‡ÕÁ[ѰU}ûêá[w½9'¥ûLXÃÅ3Uk àÌLèRÝúxÕÓ;ïRï5ŠÛeî}ÎΕ×*žÅµs)Pž]AèÓzn°&}»\3»]4¬­šÇ‘pœ.@,ÃØ®¯\ŒçÛîPæÀó$}\r5jh:Š=V»žoŒãùï>•” º¹~ÏnØõì]…»i8Ÿ…¥"ß4±Ÿ»ËÜŸrÒ‹ô8ÍëYŸÍ?Òß¹Â_ð\ÞÞŽVù9~U úuÿù6~ŽÁ¯œÏ?úþ«*ê_“±ÿ-íÿ+¦ñ?È_n–¿A@ÿo•?6þÿñ¡ÇÛÿå/¿F~õ¯/>ù/!øúêýÒìÿj~ß¿|1µx¡=_d øÕvÿ££¹Ðo?ú1¶i*ÏËοv ì'2ZpÔ¬‰2)û·ÃÇÑî×¾2= ÔeVûæB}Ó~òœG áamöQ~\áä}Þé‡ ØoO¶±•k(ç|Ê3æÅ¸/è ™^ ¬Œi_Š:ßëèzôë©ÔæúÙci >çíN«Çáô\ êÁÜÓÿ¾ÂÜC+ŠeuöÕ*ù6ú@= ÷1689N€ÊÁ°_H@ŒµØ}.®ÐµuBËQQ9Í£§øuTDîYd C/]py€œ(˜Þþýä´”LoÄéÁ[I÷`Õaá)Q§©ñ‰¦¶>êÅmxy6€¤j1Xn ®pؼ¥ªÅ”¥«›ÎŠÊq?c‚ÊED„á =oU«Ì!€ 󪡉&Ú˜šI*qò$GO ¥àM™3î’ñiЀ D¹DV‹2KiÙ=D°LT™cÛÕžJν7üÔHärð–)$ïO7ÒQKsÏœêGWEW : GÙW\ªB¹?y]Jɨˆýº‚þ²ˆŠQ˜‹…XE&$Dý•ùP("yââ{ÔKGëá©Á´Â,ë0JË»½ÄUr®x|rôR´[me+(¹&l¢rè@eîRÂÃ`¥€Ó¤†JWV($xÚ,îf$ æW­Âo ŠÐƒoßDE…ß>??cÃkF BéyÉçV´`~@¯Ká…m¡™»ÓâÿÑ»p4;R“/Ý€íӭ릩Ö=¤=úG!=G_ö9aî |6=Ð.ÁÅÀÓ# Y=žøË×¥éÌ$T•*¢aÕ¯Wñ¼žTé®nRÍIh= óÄnÐÞ†Ö¶'{âøµÑ…wé}S’Ö+,ç<Ÿ3tro­²»5nåYÏ’YòÚ³F‹ι¨8YÏ^êˆ':~ºÓÜ>Ý|¤²7Ï”>õ8Y}Ðó+n§ØÈgN5|\P1ó‚DÇjF¿}|ûøÇ?,Ðì)2\ª–Ü3E_¦¨áÈ:ÆH2J^¿©ëkäz(ñ)Hä:Ù8)†\ÆhME0Ó§Í”"…uJä]i=aµ4HN~¸¹¨¨ËF.—‚œTm_8¥µ…‹Y t&N}®i$Á½••5ýȖݶoSàiŸæd PsýMàj¶¨Õq '¬ ¾ûŒH†¿L"×ì`ÛËb®è_³iT9FkŠ|ÅVó|ZLCL 6Ä7MO©þƒªvÉï; ÀÎ TÆS^6ÿ£à5Ÿ¨14šåó¯yoÉgó±þÇÐ C¸x¡TI¾X`šÝ9ÖˆK²7¹X’ ùk‚>Õ/Ýg†ºnYu™M+ÄœŒ‰%2%¾iM>ˆHàÆ¤(߆®‰5Ç!aèØÒô"¸3µægÍŠF:^há£$tÁ3D䊻+L´¾%ÏÄC †^E;„t’d;c&z©+Àh+ñåxëUÄ Žê9WI |އJ‹Ó}å=(ptQRB†¼Š¿P9l-wáTwÕSÏm§¼îÏ <üpeV° me¸ª??%5áÃÿ=參NVG‹,ÐTtiû4 ß¿B0ù@¬Ê—±Ñ?]ì1"¬¿|ÒçÈ%vwcmdº8vAo©ÇœEB•"‘ßQž6£<8FO…‹E4†ÑÌB=A Ùp¤UFý®Òùtäÿ¾Qvžún[l¡›OÈþ!]ýZøÅ¯‘=¿I.ÇW/€7 3þbÆàßèÝçWó€ß±iÿW¨æ¿Ùð£#üwÀ¿ø÷uÿÞðƒ¾ìŸÌØä]êðåšä^^<®€_}Ô1½?r]9èO _áŠ*(ÈÅúÙ˜qÿg>Ä:Çn«}„ÜB€ðÒß9>û— G«ð4ùþO|‘ê_?*~tÜ–ñ¿žzÞþÌÛ- *ä’Týf€]SW'kÆzoƽÆHÛß ¨Ö1͵{¨ç± ‘wª^Üêî hkB½‡:­Ü£27µ›ç‰­€ èîf<ëîT ÷aþ\×$ÕB$±Bi„Ð}÷ø4JÊ:åĤ[,¡e¡¸âNǰ,z—u{sR•Çè„ü]u[‰â™9–] œÜ¶ <%žN|'BZ¹@}Ý>¥ ko­¼ßX®c{Õ³R½wblÄÙѹ3ø£`ªkŸ3Îû¢H†w¸kÀÓÊIc¼—[sŸÒ彵γ¥—úkЫêÇèfNU= ëý‡Ò>ãôH½}‡¡äÄ´=ŸÚV¹å$¦oJ±H¬“ §ãäL*Uˆ¨€„¢ÈWËŸwM7’ …” NS3£K*Y+ ¿-§w1±›9ªuçÙä‰!ÔÜ*w–Ï5[ÝUDŽŠàó“pÅ¥aÓ•›Þªò;z`¢JsƒÇT{ qüKõó@=¤9=GØŸŠg½ìÁ‘nˆœ»mÞ?òžx°N§ÈWL]•¾ÛåYfÆ¢œË\ª u¯óÊ݃¸ΊÔa }÷þå?! ªEeE/ ù¦j9ߣxƒƒ9îÆV×E“»Í Ö=ªBšÙm^ÂQú7£°Â)³ùkWŠh•,¯bUS ëñ# œS%%sÞ&ÓéÉ(—‹¤‚æ „Tñ4³®ñoP¦ §ÀÇ¡Ž‰¸›™™(¿va‘°di”Þ€<àŠªóˆA³_§òqëYwŠE9§0Ã@)Ǩæ3 +î˜@r1òÈ‚[ œ´;¨GùM¦Mcj-3ܹzÑs > ch¨G5ØÎ"b´ïfî¼Î1M]Ò«uN"îíJ:ï º©^ç@à 9Úñ¤SÃ,áÝÐì3RuBüóŸ!¿ÞnpœÊ­° x°ž³Ñz ßv÷@Â)¶ Œr(N¢îZäbïIý M21ÂèâžÇxä ë,‰'ÂâÒ•Ý>¢,e3ß ôÍN•¨ X‡Ú©‚Ô¥£zer ©Š·]‚Aæ©GiˆÈÕ¨…kObf—–ÖÅB­aZzá˼« ³ª=õ‰CîõVÇ׉šèBGL8mZcpÎBQº8Æ~ÐzR¢Å¥¸(xJ~VÍFêº/SNÁhnŸá¾"šXlÎv™îÄÌžäiLͳ ³oÏÃSÜ*‹,w@ZÑÒ^‚f=˜£ý¡2TWˆ¸(ªH¬¾ôZÚ5ÇŽÜ“ê„ Fu©Ý>rÕht½/SodkRà ²ãDRŒWy7lÖx¾G°¸ò•)ºúCžZÓ¢Fe'/¼/âp­ S_R½À:-ÑŸhRó¤œ:QÖPOãU…ÍL3éiÌj•ØŠdO”K·{ìjÛÏÝ,£üûžÑ®4ÓàYãŠVþâ¼wÂÊîré8/0öüj´b] ·ë‰bÜšwÆÍ ËY¦ %j‰U(œ)/ëçÛv¯K±Ü(ŒGq‹œ?7eJ.wºBeLf+ÐFÈA÷⫈".íxÖYˆ,˜šÔ¤¤¾…`dÅI@{ë4Û¹¼”Çâd)IÎîÙŒ\[k¬ à‰§õN(nëÍîñ곡ïw˜}ožÚH&:]1Á—Äd…órœ (k($«Ôo®Œ7š¡ GÃï@˜<´|‘GbO Y±Ôl¹âÕËw/Y?)¶pŒá`Æ¥?š ¶Ô>ÓAÒånXèG9_”Ë¥U·Z™²…/ou^ìf”io5ÙN4ž_¨ž+¯æ¡¹ÆRM³çíÕ—ÊÕþƒJܧ=~V<¶ûÏ?ÇM{ÍÓéÁ—ÉåsnÓ3Ú7$Ðý¿éÇOÿÐèœß–"³àËŸÅÿ^G:¾øƒñÇOÆÿ[¿Þ¢¿ø[üÿ$øUBæws|ÿó7ñ«·´—ø%NèMpþòs~Q›þÓ€¯ßÛ“ïÿeºšâqýïÐ'Þ‘Û{|ÕÐ2æºë5KúçpOgÀ 0wV9ðÜ ¿xÜæ+êëÈ„»}hi³’cr’K"{éK¸&gÇ1„á%i•Q«qÊÌŸA.Ð}é*%ówþpVR3:°é3|XØw«l³ƒû¨& ÓÄÒb\s,Ÿþ GŒÛÄ#·Ð ±Úâca Ó‰ù/ŒDLî®IKQf±ÖUÈ ƒwŒ[5Mô=AYƬ´†Šxœ¹ì“œ_%®åzÞDeýéé7KA.ó¹ øcEU9„dÙã„/‚ÁaT‡adª³ì.mÑ)PžÿbkØ €Êm«mhL ÙUZZ˜h’÷ƒ ´¸Ç?i´".ž;`›ºœœÌ4ô  _à|ò»bÇÏI9„ÂïžFdn¿çdv ¢8¬¶ÆÞoF¾U¨åW¬ýIvÖ‚x}˜išƒ$¡‘"Ž&Û·£ƒUÅBæ’sÄLž¶Ÿ5nˆà*P|Ušýò)äfçH(FWØ+•ñzœt¹ãeÁ‹Ç!qöù-z°©ŒW5Lªñ™"0âÕjVÀU‘*³µˆ¢ÅHr_DõŠ||¿íè9çä 2Luuš‰óÔщ·¥Y¾¶N×Ìb èÚnMSu‡U“¿®j` ¡5Ñ€‹žÔ‘µ l];¡…ûÂ¥‚¥xY“Pêy^,zp›Óýv¹äªÆÈ ¥e"!ÆiQ“°žpõõð„zæÙâ›Í·¾>—G?M9Ћ6›À’Ɔ¤ç®ØaEê5Ê·jkŒÉÊuÄ* à Äas§ÓÂNm}²©ÀÈ8±½¦S=i¾µ¸'(½;·¨Ñæ#¸Ÿ¨)®i˜$㎶€À~É !ÍÊlÖ 5ˆœ¨Šey<{U°øt:8…õ9êF±ÁÞ¢¶5íy«]ïÙœê£+#ty!up7Y_¢*’·|UuZtóôƒ¿w•úÞŸ·‡äÊî#Ïÿýóþ~ß•¸Ó3Óá FJ¹ËIY€ŸîèŒöEÚoFŒ*ø·:`·¹ ‡=s¿=ÝÅ_ÉÝ3mÀŤ拪Ý1Å4*«Ìü1×L7êzóžÙˆy‘À˨æ¹Ý0Áª´çÊÓÌH$ërV t–*kW¬z¾¥_»äÏVHØÈÕd䙨ÊõAQ‚XÙÓµÞQˆÓ¬¼7uoJ„n*sùjâ^™ÔýYb£çŠ)QCY…*qßrVÛÏòÍ,‘*½žykuˆxŽˆåª¤Z^k\Jc"YºÐ»$õü·ì.¡Sx GÕÍØ‰ƒ¬¾îÒZ}öTæjÑ Òï.wk 6Ó õØ1Qç¹£ÉI*à÷’òœ+#.>1(vŠÕp¤:^Ä·eèŸä±`ª=Cƒ¶¹ãå’®—ÓŽxÔÎ'j·E.ÑF¨*½˜3ÇÓ}Éÿ%-ë´wUꜮkú²Œ•é}£ñY}ÍÐMgˆa¬ÁaGav€+Fþ%RÎä˜ófâàØ‹g2–µéM[ oAOŸÑY>Äb§/Ô-Ø5ž€8ÆíÈt‘›h´¨øjãêÀª‚©C´Yš”0Œ­<ÞYèê)” w‹Ykø8¼ËN7Pˆ 'žSG —ºˆ›oÛOʆ6gS,‚ÞMœyÚŸj‚éëË¡Ñò¤×7ã«5Ö¯`+n­æ|²fäKg§Öå×1¿sŠŠïµ{T„³ªp¹Fj»üœ9=æx;PÞ£éqx=FÃ’– ï“m¿"2U&0È´ ¤ï•ÁüCäµ¾v:?Ô@~­æôº×æol²M¦ûc/ôP߀X2JÌ]0s=ÌߘT+W‚ïqÉ9Z7Vï:´'{”>£˜=AcÉFXçú³ˆ~ü)x8©¸Æ»Ý•_ºÎ75êk"ЫöJÈÿòÏõ#Þ¹äò+¤Þ$öÿ>õ™¿!ÆþŽlÎßgÿÍoú÷@@ø‚¡™‘ IDATâôù{ð¿>øò[àï_‘"/XÊ_\\ørrð#ÌÞ•ùá›~.øeëïW Qù¿ü£K‘ÇÛ¶Ët;w}yüÍ/"R°sÈŽþ¿˜ý'Šjñ= ¨g‚.m¹Šˆ[O‡žz‡Z>ºnBO5½ª£ò³%`.D程}„+Lyìää-Û·Í 9jÿ°Þw&ªx4\y” ÷ý,êxfø‚ËÚÎà'¡>áiÙ‹ ê7«7Óm­½€¨B<+:«òvjgÙf)j´– n&zÂׯ÷‡ê#C–U£½ù²:Ã&èä…BzµxkƒÊQ‘fÌÙÜRÊ‚ïKÐ̲g®_ãï6 ºûÌN"Êø’í@Þ‹,-äú ;´Âî6^·}•®.™ˆA 3Úõ®#Ïi<§÷õ`-jµyC;„,”UŸ£—Š%â7Ïí*£F¼X[>kÁMàä˜Ís¬BÕøÜÁøMûÿìÓ´Kà­æ†*åæZ«¤):Ñ! ÖZ5ó¸žÝfÔyKèÇ a¼ªyEö?¼rÑÊW ¬~TYœ¹ˆðèüÀq'Á‘{¦§o—LªSœ©á4æ# Ç+ZBçíüvAbÉJ(Ì”¸»DYèñ¬øûˆ¾ÓÉ– ×CàÓŸ yò¾‡«‡ô:Õ£š¥“Lž™T»8+ƒ}%“¶GiòvqȧDVkS(çÂèÜXÒ«86¨lš§qÅJŽ´@P{$ bÈGW®[Ê6.ÞZ T? NtÊÌK½jÏIŸ9‡”ñì ¯Ì–ûívAÂ5>ƒØqº“·[`Íš ¤À§'>¼‰â~²ó¼'¯øP1=fw6ô¨{Ø÷“ã•pª‡Ùœ¨¢nfYSO7÷²ÿQë ¬¨}r^À™ë¢ðG+ iÎé“X†ã£âãÃU=YÖ.&aÁ·î†´$ uDÜDµet­ëC1V:ÇI7ýâClk­”ÂÜiº{eæ²ë[TÉnrÔ—–£«G%¹çœë’YòR‘lh¨§ŸÇ¤.Trç2fnkAêós$»!£ýÖËvÌAø6%Zh Lï*9OR§+¡*UšÕŒ@rddª*jþ ÕXú]ET\x¡ƒ Óä …ˆïßãh¨.ùîçYQHw0Ì"VVÉÒº4ÑfåX‘ÌiâWe~ÃwòqµÇP/ž×—Vå«[¶ýÂÂNÍ0[W¤§8ÿ»M1îd^ºÔ & ½™_ÌsÀEQ¾ ä³\ æ4™nôº5ÏŸô[¸å©¥ '´ÅÐ ´Â½J­2¸Ùµ¸ê‘×ë#‰8 ½¢›C¿¢¶“Ù°ÔúA𸕜?ûµž‘[Ý)ç"¨Ët»Xb‘wfL•b¥¹W)NZrÝg™ ¨E.͘ E5±¬Õ7–¨YÞ›i fDWºlÞ>½©•¦Š¦ëCÞqö0ç·\lÔ\w–'™žvò^㜨Òjn}0ˆG3ÏbyO¥=1¾H¢aá¨Ðã Q^uçõÈU…p-TM›Vê¹ñ<­Mv¬o)UWÔÍ3¦ºþ`gcÛ•S÷æ³?ÔnxN]˼ŶÀi]Ê*&½|¿µ_n¤ýªVÕM^wAùHÉU¤ƒµW`vm+gÌj A–’j:æ{«+TƒÀ1Ikö›»FpÚÛqžV5Ïg¿PU­VEtÃx¼înQ¶Ö¡dÉ:ò£b÷!˜ ¢0Dè’Aá)vã"^›sˆ-£2—¯’5)¥£‡vÓçê9jg¼û°2cÌ”¢Í{00.ýÎ ð™ëˆ@«Webª<·í¸bÃKw;°O2ËUiQwè¥xØüïØGYÚm/©/@ˆÅ_ó¥½kÏáJ^ýONåúu‡8á§È ªÙ:E•ÖPÇo~špP¯hp‹¦Íפ4˜7úù=æÒ„z9ø¸))8Þø1ê•F¬2&W ˆ¸Ëu¡+Rz‚ŽðÈŽöŠP>’w¢øw3ç \±-UU(è¡Ý!ª?,ým±õ1§î~ ˜7j¡K€@TEŽ‹>cE˜÷àNU¹ „|wÓƒ¼Åûmón=ùu&^¾ ‡ŽßCÔ–<¸DDï;´¼ÞØg©¹QÞc­ZšDˆ¹jXdIêGÖYb_ì.—:#)¯(n‰PÌ»”1ÿó®iÌŽÍê)MàB6ý { ¸6|*êÝ¥‘=Ù Èrã S ÎÙŒæL«i ´HG°ÿ$ xv›OUyt•ºESHåç bê&.r]êÑ–»“C‚ܲª2/YŸ½>v— =eCŒpTy]·Ý$Ãá)%¯gŽù9 Õ»ºßCTŸED ‹ZÁD†‘ö†4ñwḎBõ¨™×7¢}÷Q€¢¬~Q¦>%:ðê.×4ršØ\ÁRcFÇŠ3!oˆžý(OŒd•–÷y`¨Û¬úa; ä8Xô÷G%eù¿}Rî„îÑ= óÅVÞï\È KÉ-áÆŒ ºD÷åJTÒëõª>ÆA¯Ê<â9ÌRXVÛó: Þ·W!Ú uЖõ¨¢W°‰ÅKÚ–(N¸àÉh¢PaTiØT¸Yå( ô—¬Öft£¥öÐ;hî.5ìÊ€IÒÑ¥Æi›­Œ“´=¥Ú¸˜X /–GØöþ¤ú6Úã3dÁ ˆô¢&k$ÆàÑ:QŽ—úȃ½v Ú×ZµqØ:­`‰¯Ê¾ ­êëÒ£4GLòY‰&‘¥OÄbeu»Ú¾«v)n¬UÇTŠ¢(GqãKFeb‚‡s:ÉQžùÖ6Œ5Ÿ(?ƘϘÂ]ª¬—똼>&Ú}ˆñòѶ×c‚­üåð^ªúùý3$°ÓÑùd°Ì£@õCf&,ڌ٧çòm¸ ¹Uå™^_îˆúAVö1¼·?ºPª)m$_º;*¾°À8ÒÆì¨ï2.h9› *·/ãcÛÛûñç.3«Hl˲Wgî½ùï"z‚ Þ½›8ª–õ[!c꣫‡'ª‘žïydÀ³Û¶öQV€6oЙLjeg´FVCVÜa¹îb=èu= ˆY8'¨×T͘‚Uš@Ù e@•®^óp¢ʼèšv¢/Îá©rÌÆ@:ÆÿrÑ,Ûá.7w XénÍ"¨„­Š:™UÃH«‰û'E6ž²³*1ýN7-J,ˆ…Òw “à÷ø»^‚I¥ìDz<ù‘RµÈâGÅL‹C¯¡¯5ˆ±d8V­¶Çl"r­.D]y2Ò›Ú5M&‘&yÞfÌ[‰_;㪉nØ;ÓeD Yvd¤B†ßT|´Àü䲨/¾B×Ì9…nt“¡ž#¹ ^ó™±K©ÐÚ2"ïQ‡#Ø2 ‹ ®DíâÝRH»S\ЮYe_sIü$O6ILò¢B ^™¼¹J¶ y£sÛSWÁ%'V8ÞÎ.–fE¹óDˆ{«S ¢RŽº|J4„Qž ¿œ~ò½¦”Gwá8äèÕ0²èO\²÷ú½2ÛP…¦×.¤–êÑfŸ7_…d|:+E²ÕÌGød8{ð%¶{¾ ²XƒM7LªÌBòê¸Ü6£'g¿IkDE=z÷<ï@¸3œ«Wj¯?eÖ'h–‡.@^¨û9wÙñþ§b'wh¤GFóOzcH©ò–)ø™þŒ³>ž@‰ßRÜ£øG3~ -ù[5nMþY*ó×<ü¿­4ÿ]ðÿrÚâW†þ/Ã;üù°íý´ÂWQ¾ÿëóGÍï¬uæNþâàG!îš®/'Žm $ÞØCK‘´ï>Vþ£’?~\ºäú­;Ôé?ËdEAçgWæúñ~äõƒä\@÷¦qé‡ÃVV¿zcR†f‘ËË”tÊ(i\v ³þíÙù õh¿° šÖ˜,å KÓi{P¯Ñ\TÏ)ˆ}»5ë§qBìÖpKÄB’æ AšmhÐ+Â5âxPXs®o¤ßŸwÖPÉÀñK®Gè8ŠÃÓ!Êò4 ä)|Ôü¦¥~†òîä!Óúóm&LH³ýpì[å«Ñ½Œ¡5íAë¿åI]Zr+4Ê:ýóö€<:cEMäDÊC»(Ëí˜Fxæýt÷tìHËÂËЧÿöÞuËŽ#IÎ5óÈBOÖyÿÍ9áv~ø-rWÈî‘f©%‰M…}ÉŒŒ07û Ú[VGcH3S®8¬$À¥Ílå¼€[ÍæE5ÈZšê'8_“™)YÏÂÞàÇ2/<¶@áóHes[[âGrs¸‚LµÏâërü_h¶š¶¬ò(öàA¦?«ãÃåQsug@„Ê¥½Íˆ+C¹oj¥gÄèܬã°Ïë2ØQÉ(¬ŠXDSæUºkS¾õat×í~ ¡wˆÂ,_3;KôŠÛ" —®Š_äIłگråöØÕ-ÄÚw–Ü’»¾Iúø˜>I÷¼ìoß<È?‹|m÷í·»\D°_´=j'僻Bya÷Ðô0HkT.hïX(¾xX.c”Øô8föí#ªöúø¸ïWt&W3+¾Qĉ :Ì`Ñ¢¿4¦¾\ËÌ,Çoyn…Fám&ª¡Ü|)‘¸Ö’ÀL[â§<úQÚöd„"†AíÍðŒËKöP8dÓW¼s©õžÃ°ë 4ƒƒËn«„Ï1#†Xe sg퓌ðZb\ÜUíä.Y·ÔU©€2¬jDU·¤Õ€àÛÓÃÞ3q—·ì™À”…7çðÍÛ‘´ÖB²”<¾¢°!oø%CÕÄÆRjk¥¯£@ô|:&XÀ_ûF•äÝÏÉT?+pžÉ&Óƒ+âSPéjç·Üû.«˜—Ü…ÝOJNÉH8© yyü©ÃÂ@˜´çcÇÎîÒ‚X‹ÃÄø/ƒ-#-JÂ2@³e†Š$²ˆžfî4Ç RñÙŠG\·)×½_&»®k¼éVJïØñÎh†‘N˜Õ2„4‡ºÚ5gäªB~ÈÚo:P]üï'°n\-ýG]nÿšÐþÒéÙî2c,vË6ñþàw²´v/cZaÊ(¦ÃŸžÑ£:¥Báai}ñÜ×àc£œû^ÚkW†ÔD‡ÿ‡ç'?FŽo3ŸÒÐ XH´ÆjXùEà–k×~­¬–÷±Âz¯š-PÌI@†ªÀ{ÅõÙ‚z‡íxy ƒ"ÍÄ,§Ew1ä¾¥Á_ !<ØŒ†ótëÖP)ÐíQ×ó@®‹nµü¬0‘±J–€Cĉÿõ2|Øß‡5ë ð¸ó½ k«­%9v‚vO,ÜôÛu…ôß[/,Ê1zâ3æâSÕmìÉï3©»‡ýl<Ö™I^¸wÂ'h#&†{f$Ì,c2˜£¬¸äËRï'rÄ`Ð'%Ô1'ìÜáCдµ¥®[`§§ï£evr™Ý NÁ:‚”qBÅGX9а_øÛÁJ,„d\KžØXÇ¢7‡Áöñ¼=›gÃõ”“EerÞ·fÁªôPÛ“›¢“íÌÔã0®ÙÂ+£–×.¶†A±>ÏŶN{@gÕðªtjÕ3ó0‘K±™ßrÛ„íX¬èŒQzQ…\¶Ê#Ø·‚­d<‰÷F«(Æ5vœv iåïK¾¶ÂÈM@\ü11ωl§H&<ï ó鱕_¦ÝýÆn™Ï|Æ|æyÆð(—Í:&Tê4ô?bÓ̼ÛC]á{ÀwdžÎH ê²Ô#©wfý©›ëtͧ²QOWá+"QKGÐFGò&¦Ÿ†ô5o •@z“½ô¨?æèçH ™¥š‹S|Š"âŠ7‘ùœLý’ž¢¯9É2¯95…üzJt¤K0 _Ñ+õtËÏø’çÛÿüÉ‘ÄÿHïòš%õåð_"Póë.‰¿F¿®âÿ鯈?˜úÝZ‰·!ºõù~û¢ùA À©¦þö'Eü"Äßý;ŸÑе4¾ŠOD¤BóÓ˜ÿz –9ÄòM?€«M;i”ï?éQ ©ç{?Ÿ)ó ç°=}‡#†ýt{ŽO†kÏ/9K—Ü#~ “:-³òhÿûÞ®IxÌÃêlf©±Ô™à»wí·­lÄŽVÜÊXgQcÙÇ ËŠÿÕ&¶' éÌ0N«AŸÃk¿m4³8¨„R¶w„à&æ±k­oß>öÞß_/+¾i‡Däwvz3£·€,”‹Ú±}ìV6eôщhÝ‘<²Zú"Ë[§‰Öæ·nAv&ŒÜÕ²`E^Zä!K¸&/ÀÌÑæÕb˜m³KßiáSBÿ—QY2B4QïÕQI[-ª3nK¡+¢ùv™­™)Àñ L¢4€èš.Künó+Ïù‡»¤ ¸¹>Œ9uÙü€¬¤XIÏ™Ÿe5#øÍ Çwí#`V‰ÐÇD®IÄó1í´qÒG«Vüß"ëÂ)«CUs$èðÐb ^X´`ï„:µÊx…ïÙ±Çyt‘ éŽ5ÍìR:Ž.ËI£¯­ì”îÞ9DYm/Þ¹ZÚÅ1rYè–_âö£ Íض-´îåF[(2èÆËw€Áâj¹aÿNÐlo†B)Ü~_¸,š üö—»¶Ûev§ §AìíîJÒÔ¡ò#u['¶Òá%Ç6\ͼ­5'pÔQiQÎzeáSò#7t§Â_çWL€¾ËWʪÆZ f—™k™-jw'€—Ï‚(ÙI›¸HÚ¿E¡1ˆõa !¶¢KË0¥î©hÓ¡Ϧ`RŠ$ˆï݇ÕÎ\¹Äe0`GgC«­4.ØÁ@XÊ!“„}ðwÍèÌ š¨µÖµà0òÞÛ»=¸ò©ð1›Œyg€žL£îrˆ¿eÖ=;,býšB㤖¶UØ æwêÒí’üoÄ·o[ëúþúþúþ=:ÛWYŠM¹,æÑÚÿ¥¥áÀ£¡´Â|¬¬^Î~„q:DákŽ•½™·e—‘¼ï½+¦4ê~ªÉX3qÇ B EXñá®e€íÀï»Üw :Nï_Ê”QÈ|ïbæPäG‰X_OÞà{ßÁ8òˆ»1ëÚK‘x{Ô]\3÷W)ølßv6>æ^¸>+Ã=‰Å{[³à!ÝG:©·=ûÒ¡;U±¥“Kƒ>v"T{;Y§«aí„àq^Ä0œú1ÜFѺ ž£A–ˆèé)ÂÌ@“‰Zƒœ[zq¢¦xaà'Ôáõ(lÑàžr]p<}#½ïXí]¶Î-èÁ|I#lû1Ôà)1N×#y*z#‚´ýËáò+ê=í4zË‹iðPÙÌ<…ДݼKyè yF(`¥éX¦âÊ®|4…ÁØÉâRòæBÚÛüïŸ)›jÓ£M–:O+ Ìï­\¾~u­=EZ½|Êodú«ìh9-\}_.=C葨îwg)”ª6=àÄQ³ï‡-¾njé6C»Ö„cÁÀÁ‘úp¡Yžµ´$ôã nŸNÄ‚ÕZz¬gMÚí ù‘Pâ›~[½/šSJ*Æ*ÙÅÆõe–‡ìøñ_*¾RŒw?BVë}8NßU’ã¥+kyj*^ xå'8¹øa“i8›?q@=³yd§úLÀ„N*ç}I¯*`Qw ôsàûh²êOÿëü†Çóž¡xë¾%ÎF„ªSx‹Ÿe?RȾ"¹€|¯&Ò6>üXÚÔÏN øãù]ýôò ÀWØüœ8ã(^`þYÐ_A€?ðùþb@?¸Q~¡ øÄß»߸@³é+ ½ŸLü‘Ëÿ‹Àa[Æiu§=¥ðCrÿ\ú^—Ï!àîüqÝÓ;^¹/…ñe‹m˜Ym–ÇÃÐÎ#•Ö¿z$)9%Ó;ý°ûÚpìì1»>úœ¾ZE<Ç[kË͵ïTúÀÝC)p¥Õ97X…q‡»‘Q癆«šE IDAT~cõ›X¬ø}ËÖ2ó²¡÷¶nΰíÛ3˸ìð1KIÖ œñkùuŒ9ÉFf+d£"ðš´Ýwm%œ5I[Wz$ó8MWþóüJ#áî¾ýZËÌÜ cbi”yºŠªP-£w;A!$?l bJÑvæ½íZk¯JNddéòóÅjú«Šd=u ƒˆqû2ÄP¬´Ý Ñ­êy|¯mQb¼À„‡<îýC#(ªC*î>x ⦇¤Jo9¢Ž…\¸–­E=˜éÝ•‚m΂õ÷(³-áÞ$oá"l±`[>»ÕÇ9’5+‰0`S)Åd‰³ÞeÐÉìÌ_Ø›E)Î:—ѾJãââs´XÞkIâΧ÷V9èãN >üó³V^’V!—8j­ßnpç†.pÙâ·&ßvõ[|*å‚©ñ¶zÃ>“RÔ—a€½âÏXF€ï­mú/×JÔÍÛïâ“€#¯ø>Öú~ï _Ûï¥ϼºß.€ß®õÚw×niõ¬)A4X—͈ÐuE[A)›u={Lñ]"t•ê=$±Jd­Ã:ªÆÇª~³+œFÜ;ÁÅ䢻¯ÄûBU<”€Mi»_·ý_¹(Ê+ÃA.Àižêç"oïÖ÷l6#±hîÍ¡Ûe¯ÊÃ+Ž0ݳA$U‹Ôø§QsH4éN>ªF‹ˆ½»K»èDþ¢Ž8"_æ->ã”tK——絓Xe%9\Ëâ½Äš“¨ÂÃú„tSt×s¼¾r3Ûw 6Á‚›¹‹´u}üíßþþïÿëïûþ÷Þ‚¢g¥:<9U|).ËânÎE{ÓBòS¤•Œ(¡5)AEÅB«†=Bqø’‚ÑëÕi-º6Ëæë‡`a+`GЦaRŠ¢ø€àYßœS×™¢!-¹n™Õ0³e‹0zo_§úçgúå@½· ®ƒé Ÿµ‡ž³˜d•‹3 Û2,³$ÂxQ%‚!Ÿ@yLÊ‘úh{Bçàâ)æÇ‹Ó8 ÎAaú}i<Ø\ ZTÍ €QÒ­§µrl ¨öЙvø²¢ 1>¨C§Â¡"6 + ¡J·Ä\Œbœí’Q©@R,Ô á·×0£³)ý™xoú3óu ™jðø¡çNÔ1Åxp¸ ,Ì>ÔDóº~¶fÅbw1töÀ¦´”M·”®þˆa(ìKÑ·žX¦ƒò]G6>Z*ÛŠp*K6=\ïIÚ¼äz¿zÔêÄÂcüç1‡­,YNz1Ñ3’r¼Ô# ;÷UˆEÖ‹?X€‰»€Y«˜qÎy3V¹QÙ´Ǧ#KuεŠåáÊýG Ö =5=tý&̦¥´ÛÅ-·eÐñ#"çØãgN„'?ãðÑá›Y Ì¼ƒ<‹ ù ï•żÉ™« G•#aW¨N8‘+‚ 2,â “‚2vä&utb#;Ø{ Ÿ,]òìPÂÆõÓù­sn^('ZÄ8ýÔ+³-î‚jáU(\GbÞªÈU¢Õ>THvæF]T¿ý³Q½Æ@<Ã+±Tæ€o‹Evø½ï½ƒæüæ Øxí{ï "GQÈk®9afË× ¯”ÃòðýAÚǺöþX;º­›I¼®êReVû:Q,ûqZªŠ É.wÀnµ„‹¸©`⇠g1I]‹·Û|*g¸@÷} KÚ‡öF’Ú¼oQîÛÏð–ºã¤›Þ´7Ìl-3–²0M—»ÛÎe¥p”—_rûvëš@ÅÜwv¼”E)þ.ØÊpRlÏ©ráÆú£’S«¬üäçÏé^M~ÿOþcñÐÿ”Ñ€~æ—ù;¿åӢ߲ ðwšþ²ýÿYí_–ôË3<‡ªo É:¯úpŠ|5Xhý«Wú•àþõ[õfÉŽŸO>Ôô¼³ò¯>ñ÷¿èY6õ|îàáIãòÚqÿ “Áãó;ÿ—³+ØbE3ÕŽëÝh3Á?CÁ#ô?>™Ä£2¡~ÕùçÂÝÒÚ±Úípo_ÀytŸ¸‡• òhBв¾É„Lãë.AYAs§XÆjß.¢€5ÞÅká ª=@8CÉ·…Öº”¾Þ4ÂÒÚ+¦ªÁe,(Ì2F«=ìcŒYŸlë´^ÜÁùÉÕˆF®Ëî*d½=ïÒqyeX^Sk­øœê`,›ýj«WŒjBÊñÌ«JA·éÚ[¼v‰ââó¤ÖÊáA\^Z´½Åâ\ ñ úóŽ3—çÛ¬óÒÇ»Ÿ(öoÞí oûãcÏf1I°F)ª¥K)?jtžã"^ž}К@h5äGšç+ ߆µÕì©É×ç^M¹~×¼$˜ºéâÌk®û»Žšˆ¹AZ q8‹Lu¨;ââñ£R5#jVjvˆ×'‡˜øš/—°Ë°žwÁÞ’‰ßŒëúàþ¾·ß®uÑÌö›Ï"á ½6-}ý9‘Ø ¿ö*Ëó&¯VÜ|Qí&Àï½Ë“ ÖÈ)”-Ð3¶K3|ÈÜîŒË>`ÚìGLpH>H\öaëc]´×m­ÕÖ°3EŸöQÖO°‘aÿJéP¢ƒÑ9HžëЧ²i½O£]à^~Ç4Ä·ÌDs¹n-›;£-Õðp߯—ãv‡ËµŒkÎp$µ¢Ûµú ²2ÖܽuC ÐÖ½·»/­~X©r¶V Xi¾wßeIi´Þ¤ãùu]£ÚÓÝ‘ÌzVx'{ÛúQ&y©U9`N]ITc.)½¡¨ÌIoñŸÂèìµOÜý竜$òîˆFs4i2­H¶Èv4KYå‘m­x ‡ðÆ0Í›N… †U ò”å)$ß-jö’\|×e´}×ψõ5þºh¨÷í~ï|9à7‡îÛ¡n·Vÿq¦8—o ñÑbœiÉó`8¹µ1I®xZêñ¼d:º¢MéW³”43Âò°ôLœùÏÑW[®íêè ˆŽU®8ÖéªzNžZÌÜLGMÁÇ5$]¥ÇFóMËòã ã©áãÁËððc q¤BõI ì¤T²Μ€Î¤J%ÚÑA¬ÖEŽÙÌ´­”i¢l0Ïb—ci®-H»;9§éSý«+ñDó¦MÈþ`‚R̬‹„)U›œ‚g*îKEzSg ðjð»‚öý’¨Èß0ÿõúðËOÿ{jÓý~üçëOèÃüåû§þù…6à¿ÿåÿü©†~uEèÓÿËÜhħßznÕ>[ùùU˜àGô÷O, (þà=Û^ôüãÝŸÇLXÂÇ€¸góŒá‘dŸ x)î9óP ßÛ¤ão‰í‚}Ýš"æäò_N=G³ÜÅ 0‰fF÷·Sekc÷`€`Ж|­:¹´kƒpì ÀqxÿãÃ|8¬!¸ŸRèóIy»ö:ž uú~™…MÿÖ‰wh.t) ¶ç‘À–¹+ª²<öyZ#G}àeT– ØiÕiÉ@=#0a³ ÊݼÝ% Ö;;3“:¶ýÃcôši[>ënßšÖWÏ-º»Gÿg:=meHvÁ`+ÎTIPèžÅ0pqÐÿ)Ý!5?#mðÊ„Á„^KÅ;¹ªÙ·!|Ægj²eDdi½»È;éÂe<ê•âǯ|k»/÷G°à¤FK3ôtåá"n¬8¦,d<¦„žÓ,®tfo1΢Ê¥ÕrmÕ5ä'hóc%  ðJèIæð-4•Ç(öá—-Z¡lËÖ>OºuZ1bç¿7€×u­{ßoßr÷×½×Ò…ËV„3—žYɰ÷J3¶Ù"–éÎ>åêû˜w^—qñê÷ë¼î˜€ù}ãú  Z¨àßEfüXA­¨ÛµÂWÈ‚[qY ‰“¸Ë –VêZЗÙJ, èöø ÂÙ*[¦ºv­e”_r装6øVMªŒ„¸Ѧ[~¿Ü·_×ÇeañÔËÉ%¤°&CloÿÇízæÁíe¢ýaäúø°KQÈûò¬ø£™’PKÚMóGÁ‰Xq,på’¦ \é]_ {äØÑ˜gIÛ30ÒýV.®0íšÙU™ƒtþVahpcÊ`é·ÃÈeô *µoëU©ß[zy‹ØrTÓpYê îÛwžvq rNrïûÿïÿðïÿð½9…) ˜Ô|ÍAØ_²VÐòdž¶X»êQ#Ïài{ä|'mÍZß—ÀÎPPÉ,ªGfí–à”-”Í“¡¤ª«£šÝÝm-…ÓW÷½ƒxS9Ct ßÝCíŽÇ%‚OV>YvI7‚^à÷½c©äBÄ1qßÀe6…³ïÝ)‘ˆòSís|û–“ˆXÒÞεò¥~Ňþúà/®]£Š„Ã4‘0Ö¦é·H{¦7TŠ?k†Ù[‘7e`:Y(ö7J* =ÏV%±®¿ÿýïñ¹_÷Þûví³j€³'¬<@S-`â­GZ±«¡Ò_MÇ%fï#L–£RbU†@¢Fâôn§àž N9ikM²„!Uû4“lñ(ûŒk\ÆU ?4NËôØÎ^(¹ƒØQÎ$váîc‰·$Z?oö,½TvÞés=¬–×Þ¦,$¯MigŽ ä^Žà{ YC•´|Ò§É}W_d9Ò-jEø§T««Hó‰¯vÿâè­Œ†Ûòˆ¥!êvm¿:“ScçE܇ãQt´©\ÚÔ)èÞ«å>DàM誒óжd“ÎsoV ZëmONÆuߨWø„J¬¸ÂìsÌfV8M͜֌At£¹ÅA¼¤‚.VÑNiÛYPŒ"×ujt=ƒéé#©¯ê²Qµvó-t|÷@Q#c}HÜp)­ªð 탈úÑÕl€ÛgÆ6˜Ëàµ.§, 5ÎÖñèI¼CüЭȔF`ìCÑa“Š”ŒæÌö½u‰S „,j,'‚¢Ø xkZ–çmãp~Õ­Ñ©«¸;ì#  ¡h§•Õ:½Š7@&L¦\Fºá`ÎÎ{åhW›[ØC¯ÝE÷°¤£ŠøTð‹QéQáWri*OU_Vo´Ë²TÿïüùEî<óÃ| ÆJðHÙ.XùX a#">¢9×øzáÞÞœÆÈÿæ¡ð“Ëï*Á]éqJ;n»ñ•²¬Ñ™:/ Tº³ ªHÈkiGAé²Ú Éb“4i×Ê>ð‚²Ýaï‹ïíYcûÍøíãú¸ çÞ%‰Á˜’ô=°7¯ nmßwôJs™a9oÀ–]ײZÑÂö»±ÑNM³¨ÜMÛœ­aUÜî4\7þ!IÎU)kùýº_7µìâÇZ9ñÙòû&pm™[Üu´¢˜5]T!0×°¬%‘É6&£†\¸c2WgjÉy°ìV­4DN·E=xþxg0ú´- î–îhQ¦N‡¦«ÕC½ð¢ õhü¦µ)ù†C‹R$š”wýí.iÝ÷_¤»k»J-1×4uVè $fªãê± ( 7ÒÝ’?¤p –Ÿô0Pµ£ºÕÑíº.3àE¹ËÂD.ò ·äë¾ã£œuÌ:ÂI[‚[çÊâu°ºç©`8ÉûQ> ‹ßÊ%ùþþ݈×úM?ì„Ë +߯1ÌÝ í†–¥‚Íš§ã¥màŠ 0!bX ËS¥ï´ÚrÅ7Õ2‘$›ÃyêªDJótè퇘þjq¦g8€N!‰jøRðí²å¤1?{ñbiàÛW-â!mäwuø,ZZœ»šw“(£YÄ­X›œ§^ÈìeFmo;$6ÇmY;Ÿj5L-~Ø$)Q¿•@–Á[‹EæÏ–±æP5`²TÏ^£˜?mfŒãÈŒMÌqöG†¾³F‚ÇÚím<åTwzݯ˜Ã¹ûv—ïÄܜޜ\`t÷w÷y„±ÐSæ4ƸLE¥©o}ûŽêäu]!U·¬Êô€í—Ʋvß0I'¬eÞ»”-c ½•ããL€Õï›p4xŽG@¶7hX@'ºìÅ1/CzÌTù”òîÆ„5œâ(õ/zž¨ª‚6”㣼1ŸôŒbØ*\UE¼ÔÙ:+âJá’¢G<7Iî2âDÊŠ,$õ­Œ–E„¨qõ§á¶×æJõ¢]:¶iî¿l†=ÇÓ!^=¸?ë:Ö?WAE#Œõß½šöÌþİàËÁÿýW}×üUÐWÞï_TÿÏ ßÏ?BŸ¾T~uUê«åèq!hÌ,,ú—CƒÕà‡MÇãèPüŸ†©#W5Úþ׊_ÄTûþógö¹d¦¾ý¾5)Þ¢!|þ3)(½~âlòÌ®ç†î-. |fjœã´5ŸOxtúžCk~š{G@ψcºœŸafIaQ¦Xû+ˆòÃÍÜÆÅ8ÖÆNlœ<7ù8iÿš"Ì#Ò˜NÞh ´ÐbÂåZ*WZ ­Ñ/åIç«}ÕV'´.;"Dêt°Šs7袴å/pÐ;³eH‹eXfç×›Œ™št·¿ÔhÕœÆÈm(˜’ó˜•Ó¡ãËJú?–Y 9rèd˜úº¡ IDAT _ºÝ÷½Ýýº,g‹Œ‘‹§ÇlÁîd•Gä¾–ú» į†þ81x~eFÛÜ·ïo5ÂTn—ööf/CŸsL•D€;^ÂÞÎa/Vì‘ëÈ-÷ÓqiCÜQ†8†½ŠŽÑ[èqÛT•°ëÉ«]-Bë†?M+v¾^†Žù^|²Aaˆ±ÖëÓhVÉ“û–|Q0r1Àëᔳȕþ¸JIôí»ä¿ºow×½ýÞ÷+^¿},0BI[ˆ2 ×Ô"WÎìöÞ>o/b,k]‰3¶¿¶»ôà‘|7vÙ ƒ²<¬^V?Åýv¨;ÄKàvçâ"^þ}{peÿ¾>r¾åº}¿·$[+ÅÊ¥|×Þ÷º®o—er¥£?Y‰Ø VþÚ¦f]mtÍ=ø:Ê· Z¡»ÌÃ%a«F £2:H3äé¡A-QkIFuæ£a»= H¸Cõ;ÆŠi {ãÌ*$wäP®ÁUðûÞ’.[Yz,‰8n‹øãà«×Þ÷Þ—t™ÅBP¢M–æØ.ÛeW {;žSMQH&o™¦%aÉè4ÍÃ*:×ÑèpDÏ6™ÅÅ!niï|ì¤Bs4ïÅ}!˜?ºÖ³ØP¾ÝÉE³Ë,>™Ë–Kæq3æ5é[aä7ð¥¢×›³Ì²^Êã\ž?•?ÝêloŸYŸÕØHxLkkøE'Ê|V›1\7Ú0ŸÒÆ<¨Ú'™¹ú{'^hÛœç{±;Üï"F1ð@ÚÐJÃjg1ª ÈìcÙ½±].¿ªà€q蜤i×~¾3e Ýãs¾wvDÆ’é¾ïl>®U· –m BôI‰v»£ïüd+¦xbÑõ-{>)  £#Ù{²U[—|-mçf׌ŒL go” Í¿ß9¿û¾ËüP}È8RY®«Þfg 2™•&„ ÖL£($™Fʺa1d­ƒE”áƒÏ$زœ6 –¬PyÃ,CŒ|¸¢èÂåÎOÐÓ…úcòÝÇÈ[FGiLbÉ®ý,Smô¯båc×F³#O;‘NÂNÓe¼w¯Õ$át(õbéÒPp’qžî\À½&qGr¡sãiì^ËB­W²ØcSq`„ð<.Døq¢J) ÆÑîâ:0?¦G¯õG—9ɳ€¹ïˆÂ€õÁQ´ù`R4¡±o#;`ù<Ë/VÙ~ݳŒµÚ,¦/´,PºM*WªlwQn2ä,›‡ÑÎiÑY/Wòœ^f¾ÈLÈl”½OJŒÕN!^¾ Ìœ²”ÿ‘ý•á)7ðôþ„Îô€j—«žÐœ_Ê $g(k@&Œ& æ;™FéE–Ÿ,ªâüYÞýÝQÒ·ãOFVl˜ïÛoøZn ßùWy`wNqeÞÁö ™­>ËÐ[ÞØ¸iûg…-3Sš¼ø—1,_„h2䛉ƒ0UAî\=|HQjN`ó¤'nõØéÀ1õÿ?OžÌ ùqÆn¹¹¾„Öp×'¬‡GÑ÷_ŽÀ*%N n´‹ãÇ©GîæuÍÂ7SÅãôÝíÓgGï)÷ð o"AÕîž}üyºòž1}ˆÖ£ ‘³æ=rzŸ > é8L“¼‘ŸøHhä]~J6wÔ9¾8#šÍγ¢Î Ù6Uæo;ŒÓ«ñÝl›n&ó{âN$õËGw™~¨x?pEŸ[!~_HÔÓ±Ýÿåó @ïOmÀ?]üOýçËÈɳ€þüküaýWG(¿õë¿úk(ðÏøäzŽÇŸ)Ž ûþ àóH€?9ÈÓ—ãïçÚýi¦øò³zA†ŒÍGîàx¤ž’û{]ðÓ‡ÿàÙLõ¹sÆL0Ï<>²8Ö=™?)ÖÛcjú©+¸/í>)¤Ï¹ÇxöçI‹©jóÊ[;õ„«öêÀ»¦…×qœÛKäü’ ¦£1 (*±™âøE»0 ÿ±gõFU%‹ó˜kf­$~ÓrßÖdÓ9f¦’VhOTJÖ:¢yèúÍ#18Gý€ƒÖÇXjêŒn“e±0î g¿‡‡”SI‡67{_åÛ±Ö²(°|»-š™ªIxöœ•ÿˆcܹgr×Þ~…/'ö‡/ÚÈÐgóš“Ë=ìu0˜HŸ“X:,Òù™†÷aáÛnRØî«ýßž`©$É´WAžoüôÁ2ªÄí´ŽÂ&îzÏTÀ‹p+x?Ϋt#\ÿè¨v·2)1v1gÃÑ”°±M&-³¹{ ¾oy»¯¦ hškôlÏòè+×,™ê.€[æâ`YmOa¹X\¡†!£Óäî„§^Á¾¿¾Ç¿ß1ÙŠ"æ ~§6épJ{@ ,òš>m‹Pr±h¡üØü·½áŠXCTèjÍuXÀâá¥w8°´öº3»H¾ˆ}ËµÍø·ˆgöA¥*tÝ/ß& qoË—~ УÔy”Б¢‡™¾·D[ü¸ bU°Ó%/Ù¨Y¯…R Ã-‹†æŒ7`—Eß¶<&ŒË.òÆêÅÇúÔ^Z…—ú’¾¹j¦ªä2â2{ùvø…Õ˽닇@S£í|A>Þác½â“­×ö˜›"Z‚¥.åp/5€Ï™B%’¶ìÞ»ŠÑ§Â­äÛô‘ÔJ˜ÅÀéÄà)Is®uXWv;dùUÃCRæÊxÊ)Tf¾¤(`6ãïB<˜‡mÞØËX*ß2{¦Jƒq©¿üÃævn]äÚÀr8½»·ëº¬[f© ¬Ð"päl+iDÛ[6Èx{ÓǪmï,~Ï4|ŒFigù–3øVò¶×•7£Ð剾¢.Ò… S¦ÙÝ Quƒžb'U§ªi5‘ä´cŽÌS¨ªB’¼Öåòe‹&ð¦Ä ‡˜â%ìVƒ^=- u,_0Hp-9l9êÓΕoÓ²üŸ¾×ŠŸ¿ŒÛGµp<ˆ}ç'¾«–éÑ@œÔ¨à×éTã&ÒHa–,Ð`“±«ÖLp—k2|ÌÞ¢z«Býü=l˜µ+%BOD ½m‹[1%mªÈââo6™¶ò JcYc$^×õq(×¾·›[µ#„“ÂúÕå-r‹ÓæG˜÷½Ë+çO¶…T+€Jå´ÃÛR:Ï«®`ÑÍ›Pv¯¾žXÀ¼«GºË3‡Xµ/Œ˜ED"bÖéUÂEYß(;výue 9 #½Mi˜ª½•C§â5ycïí1 FÊÚãN E9 XEe])\hïÞ6€hÄHÎB~häû]ëyFq{ârä>sÓ2œg œÑ†X-×#G°ë©Pqk9E8„¹¸±9øió1,8=ãYÊÊ”hßH%”ž¤ý–Y+h’Ö×$ÝÓê=dŒsòÛˆû$™9‚ˆ5âêì‘=»F»'5ŸnR2.D ²zS8ªÀ,e•Šª †pì5c·‚M…ÅÈlJs«¨e룜![4¢Žœ Ã Eƒ€W (<þ9@Zû÷v#Öâ¸kú Ã'”¡Ó…“kßZ™Ç®qée¾#Ç!I›†í>˘r—Ÿ§{T+@Z¾pªù °Ò‚ÓSËI}üš+ûÄÔj1ϾM;D®ªé:6Ëéà±W÷†Ø`—;4O©ÚYº[VŽ´U¯ÇfÅcCÐ+Í]RýaåsÖ¹šÅ,ÂÙ¡Œ¿I†oºÂÜæ–=FªgÓÓÙ.z>ÜáÂ'0þîoJRÅ䘡 û¼¦3 ljøÁC©WÇ ‘´âó øtléa¨äŒŽ!âcqXT#F ‡NêA8 ¸Ôr?ÙZéÒ Û?øïG6P¿)Óþ’^ÿPÊx¢¦9mðO¢Ä|Ö«ŸûK* þoÔ¤uÜpÿÅóþX‰þô~O©~ý¥þÿË&_ÁüÌÇͯ¾Xþ\æD¿9àïßòz3Áÿð/zßüó««´Š1hük•ÿí`¡©æ™þ¢÷ú{Ræ1¿.œÃ‡ÇšcÍNŒf ×1-àêòŨºC…O³£«›ç«ÑÉc W¿Ç@vT'Ž2q?áÙMÆé×äLxÄÉëÕsGmƒ ¡p€ç:sN2F2nŸ4Õ>å6(YØ&Žrť〙^¯FË=…GÆo]ç<_gG8•ÅÈãVvc·g45qäܶLJ•®¾Õ¬!+2u•›gM¡ÈD…Ã5TtÜ4ºËVz]û{¡'YY_<þ>ÀŸùܼ}/˜Ù àg^wªËäI€*C½W”áÜ^…8¥…›ÔFpß,'ÐLÜZ(‹wR*z3{ôí>v¶º $E©QÞüizÆíËÆ“x›ÜÕ»2_2óE×ËýÃ] d×½¢ÖÒó)Ä«#kŒò/ÉD™ˆ 3ð}T*ÈärÄv6ÅÄXÍŸ²hw>R&” ýòí¸2¥dÂîÙ’CßwØŠ“¯ýaü¸.,ɱÛÔµÝ];ªWò„ª"ˆ½_Û!Fðõ±>jÐ*L*HUúôk‡Ò“Ýæ¼ÊÕËÀµ¸ýJ[}ž,ö½ýòŒt@¸å/Ïj\"b¿Çsþèà¥Ú‡×u¥S¢—Uo`8×ö½_µ–šO2F BHíµ¶yÍðrð³Öõo·ä/§é8cgùéʖ݇io‘ïÂ.,ÒhßYý™{G‰km}­…R~{p˜÷}ˆÉ ¿P³Ô·Öþû˜Eé9g ;ξÚëBé|¥HôÂVS¾«¼X€cÑvˆkGð¢~«Ë÷ãIVé %¨ú<ÛÍþÜ‘ØZkí0Ò:°’›b1¢%Ë—–c­µÝµìcÍ’N½‚®-ѱ,íÞ1Çââ%ð½ã÷ÚT ¤Ô½š5½0‹å_ %j†Ã®Û­ØÅV…àªp¹§q T-2ïЄG3^5è•å:6?A/\¶ŠÔwñ•»øÜr8¦ÔÇ:jU;I¾£CV ùWûÞò˜ $q·AêÌ)yòÏ'¦UHŸÜLjæÐƒy€¸0=c>‹"Ã’?)V·*ˆEK7<Žl²0Zò´¿¡Å“_ŽÜÚÔšY~M>Ÿ0Î2»ÜëBµrP±´£ù#m„é-9vBcÇ‘„Ûh°¸ v™¶ƒI¬mïﮨÌÈH|œ¶¸{.Ù)2›‰Pòd>­6Sàóy8´TˆÆ#öãµZZí³uÅŒ †ËýŽ¡u®üÎÎuw³‘^r3³á•S£™rOþ¯¸Î9É™Éivd3÷ÐÀH¨6J«F|Ï6YdanÚ“kø£îü©9ZÈÓYCf Õ47*iksõ8e¤« ¶"{¤—¬Ù5õÙÉQûÊ*S>ʺÒê4ÑžSŸCx#rA>ªŠMauså1*ñ )ÛÅ“[ÇsûØgOÁâb÷tÚ*>RwšÅÍX»0j|뙹Èœ±¼JÉ4ú3=uA—Ïm‹s\ŠöJWò’IR1¯)ãü:}/IëÒ4M¶¬?>‚!WñSdùmC†lÑžÓ±Q 'Öý8ÇL¼x€¶vöô³îÐn±cš½T·@W‚|Hˆá°§–˜†èaÌh#Ué§½Èê›Íû€¶´âîg>—ÐíØ±cyÌb³Uï(¶Ÿfœ¤d‹›ð K_—ŽÔê« `ø„¬"§Ðªþ¡<í¡fÔÑUѤ"ZcòYá Š@r!;û¬"ÇÀ©x0¹úÌ=W$¨±ºh±4àÀÇöe‘»ãÓ%o®Ô5Y3°GÆsø‘³´\34Úí<¯TÁSMÖQGWµïºj—0ÏÂj5ˆk>ÏŽWÈcèŸÑ2qCÕ” +¦ã›Ïof¹þìlÍ|Xgîºò1üxVC·^N Ãd ÷Ö¡¾rÆ5î¡Iš>ÄšÁp:Ð5êÕ)â±oò ~vã׆òšý‘ù1€¾ﲩXoá¡ã=pË¿'ìñ_ÅúüWÚoèþúÒίÑßÊŸ}mú ô6 |üº‡Ùú×¼éýósßÛA¸þÃùŸúèýùŸ»Ž>ýÄ÷•â³è֜ϨÃmûIëÿR²g¬ŸK 4¾¶÷Ñ×ï¾õp$Õ#åËO¦¸Î lÝN˜N3>%1(á‹—W9Œ^Åå0µQû°º¦›Fx—{ÛQÀ•Ëšc¤z.ußï[AZ0³àï"HIq͵Ðï—ãõ µâ§Ýyõb…ðîÔÚRFSœØ©’ß®EÚ2¡­»ìQ€!ße†ëy½—+0êÞZ¶+ÚAë-lN•¿}@„ Û³ï2˜a·´¤e Ñ8 Æ1Fµä˜X"!$ìÑ*Ê"mx ¤xéÄV`—ÑhP²öN­§±./±¼²iš[îî{ïÛ}¿n,^eüR‡N*¸Á• J·¿\fv…þd9Ì{eõ´©¸6§÷AKÊPº¬§—Ò]#¸´k;Œûαiä´’qáY«gG¶ÜŒ¡Ã›%º:¾‡W´ˆ·>?¤ `eŒ`ªK8¸7uSyÑ9m¡éص Ò[xÓ²éÚÁKØiÚÛ¾÷Þ´U\¶,ðuÚ·‹;/6§‡¼Õ‚‡ƒgb—åT ÷¹³7&Õg3j¤ÒpÁ_Û®¼N2ß)‹Ž;J%в6&#&(xô©â%3eB&K=¿övHn°È©@Y|:ž‡‚R[†yÇ™X˜ì|`¸ËWN;²ÈÜ’m‰Ñ©©¤x¬CSÒøp¬ãçQ<ϲ¢ªôNÏþí›d7àNOÀ´.”s3j$s–ØLbíÒÔs²Cs©¿—¢Ùº3;Y3\5¢S‰¥_µÔ̼ó™í#/÷»ãq‹Bªƒ‚ÚêÁBÐëáÌÐr 2±Õ¦‡0èV–Ëg8²:qÙ5Ti9HЙwÁ5‡xxñ‡:ܯªQÁjp]#‡Ûw|7{ï±$¹ÚÊÑPÊ3,;™ 5ä0¨›´Z¢â –RÒ9xWÃ#gãJd>% ¥áÞÂÖø¬ÜÙŸFM{4²z§Ÿ)W°¥Ö±CÜ=R†@íP`Q®%¡×Ÿ.Úæjƒ’u!)'z|4iÆ8'…*÷wY2Bç€Åž—³ã7uîCDîšôj¼nŸOæÜ²˜Ý8Õº€âÛÎËÊeñ‹­ò X|vXÇH"y«\ØÐAvÖ¦Uí<ÿ”áGTí8›«Ÿ&8g–OÚù®¾ÒPm³¹¦>ýx›}dž™!aÌÐeÜ«89vèæ=+Ñ@C˜–„þØ:fOæß³¹b[.;1dg¤Ø‹Ö‚þþ¬BP±M¯Jä¼Vo•çÆX ÎkŽMOaÑüdäUµóf½ü—ÐË<8Díï`—‹é‹Hâv_»Ãòæ9v‘ºpoEípdšÙÊò8ÒièÆ1¯bôô€Çh`®Mhä´HäÔg™{ÆÕg"T¨pÒÏgäÖWºNP~s6:ýÙ?Œi/· í俍Ëh·Ð"¢áˆ`Î [ä·g7lˆÔGƒ®$ï(Ç= óñ½pª1R“ÏaÍ ¨ýDÌÒ‡†êë´uÌŽ$;tF‰tð¦ eŠ0ŽöŠ$µP_ãËGù쨜ÉÊ+£“\P¬ƒÇÔâ|¨Ó~÷ç@¯ LZE¿¦ãž5cÓS«ñô‘úŠ°Ù¡‡{ó‘¨8¦ÏÒ•?ãÀß¹Ú¿¢òþö àŸ§ÿß";ëÇà ÿ''!þÈ à7~ïg˜¿öóI”ú럟ý Àëg¿ýØøÿS·ñÏ¥ð9Rò^ð•Îϲå‘!;ÿØôþsÈ/¼ÿgŒŽ¤åç:“ùÙ~ùgôúoóÑ[¬@ø¢Œ÷iÑy¾qÀûööu‚ûk`€Cgù—j]ñ`2DNšÇBÕ=évr®*Q;ô€„µ²ígooë‹Ùû”jú( 9OHf¥ʉ\Pà*4<ÖU>ÕîA= ¿-IÛÁóÊ®·Ì螪™û³£]@šÇ c—« ƒeËU‹æÅØr­µ™6PöLxÔÍbü#s䡤DR‚‡ò(¼~Y3Ñ@˜cÍ¿fTh#퇿›ÔÞÆt_ͱÞeËçÊþw'm™¶«š?û.ׯ6#×:‘¨ŒrÚãÇ<Cìø­7c0ƾ8Ð5’•§Or/·‰î´Î™ŽÛRÔãìfémÔHgãV)‚>AÏn@¡êYo÷o¶®V箾‘/Yœ)vB’Š™ßž ½ÕfØITß'èØÛzFÊëo:vA÷½·ãï×·eëãb£¬ÀK2["³]Tò[þz…ÉsËà¶RÌEо?»V4[IJ»®jBNO·—ÁG²eëZeÃö—ï(oËž€ð²mM{†Z_¬&&ÃòŒX$ÖÖ·CÜ û‡+Àc¸Eጲe»²úr—œX»lYUYg‰s‹e¨›Ô^liXW’Ì ßaäâêª]2•šCS7šÍRGkZ™ÖÊØ»ñ¢9"zÃ`w¿ïûµ÷÷×ý±/}‡\-•àÙ)ùèGÍØWžbá¾×ZÀëεB½Ê(Nðv-Ë–†Àl<ØÂ%¸CiÚ(4¾@×@ÛãÄÜ[¥!Ù•N”úDá&¨E:Â%‡–Î’¸JÊ A“"›àð‹ Àª³­SË#FFq¥øvWX)÷½÷G|æ¾=MXÆË*šŒI´ôH£-£„˲;b›Û–TÝ‚+6ö©WÞ¼¶ªéì~X÷mF[ ŽZ=ÆâàÈ:â‚_옰 sJ‡÷1޶BÑ…^{çl€QrãJÆôö´Y°i(ï}AârÀϘ,µµ¯»òÉàoߤ¹ä[uÒ͇hÔC„òÔô¤Ã9v0Kй=ë…g)¡3y8U“óc¯AV–¿íX£ùÃ÷ÊvÞɶ®{Ám³ñÚ°•;Т2+[ ‡0Ú¿â*lUúPÔ±ù»mFæ\~ªêiK­tÌšyE~çÔÖƒ‹Þ!™¬¥îž®»s¦½}-PJ(á¹™ ÑÕï[°œê´‘1iI†I‘%24pß{£š b Õ ZI;:áÕ×l Lw:ìMx(WñUWeŒ\¦.©ÔÁ{-K:LȦc£rdØ/ Pù¤H±”­¸y§1Ýi-J~·QädéG÷!GÔc [1ñéãÌ4KE¥UšŽÚ~ܽ©TÀ##v2—8‡-­0UÆ¿™ÿf'ÑGA¶ïY^s»Ž¶#k!Om„wú1®H?´Á$AóíºRZSKšò?ÔZW3ã'l—ÞHovzXË#pievFP@Ø·nNiÄM>ÍÚ›ô-àh⊫º²$õÅSM3y˜Bãg£gê[*Jaú<š\¦Bï¤Üè]uòé­Š'FAìÄœz£ÝÅìS³‹G„t6›q ÒUÔ(7Xœ ÝVjŠXUUãèhNù‹ËÆ4}ã´t_éÞ^NqfàµÔ öÓCÇ!ä@ÊdžÜáž…Ž0:à»Ç°%cÜ¡W”ž¤Vv"ƪÊbLÝ3ß•g]Ÿ~ܵÕ•ws³þ Ï “áà¼â<Ô/ ¯ýòÂú§S`we‚©$òÓÁT²Â˜"ý£)ìz Žʾó¤¹uR†Uzx6€÷ŠÁ¶yiÊ»Ua‚O¼RµèÑú£Ç8ðl*9›ˆ›¸Û¹üüç™nͼÑu ½N󰪋¯Ï°‡ðÙ®ünzX‡™<û*§vB<“o¦ûGôBïJÞ³\ô'•Û/8=Ÿ»š‰W9Hø ò‡<üúgªá¿)hþëeiýÞ@å_>¬øg̾þ=î?økð/þÚ~áú]–~ýõñÝ_pN×yÓzø3ïVÇîmp‚úŸOúOÈ 7ŸŸTø€ÿîxJü?I)iÜŽêøÌóÓ9ðýï¿Úq·²n¼Y¤Õt ƒ£ÿxyÈ?[hÌy×|" üQ¼H÷îæõ£¬ÏÒî¤<ŸÏLˆyGõÈš<(àiSW´¯²ÛU/»˜Føc§r¶Ÿ†-ÉÝÝ7´ML.tbB ŒCì€3`k´înE¡É2îÎ8J†ÓåîÆ5fÜôU¶µ!¼š©ÈÁ—lYÙlËD™‡C‹½‰Glxo£.( žäRt»Ù#0n¡(^Äkü—µKñácÏjm/¡B’%L¿3Ëo`—(asåV­_§3T€­íaøUØK¹ø{Èw^¸ÚC–ÝÒhŒðvœÔåØ -9â6³ŠÍ3 !è&²ó2ûîéÐ(óPo&ó¥Ê~/»|G‡Elz–²ŸÓÊSU£;v—\\Éf†#–^jÆ¢´‰Q\ IDATÒ6½61›é´7¾}Ð>`«¤ÅÀâ`}ƒ>Lß=R¦÷ë–o¥îjxBLhf0ë~Ǭî¦ñ­­ìªsð2¾\”.r›ôzéuëZ^ìéTùÝ7özôV¨(}b´X.œ/dEP}¸ó àÏ5F¿ýÿØÛõñÁE3Úffh×a&~ŽÝ·A·o‰´±œ·f×3Û:ä2¡ ᆛâ}ÙõÖ0h8æÏðÚзÐÈGÄ)±ðv’·ü›/ײ¸¦ÕÅÂmß±”ºåQÖª¨M§Çœ†î2Üè~ÚHŽøâEš­…íhô†ieµ†âKïÔ€WŸˆ³-¶ž˜”MÄhSHò™»lUiãÓÎõ·û¸r^·`¤5“ÁÀ`£PÍ­Ê#%Â*‹)½âÙ{ûVôt2Jí Ø ýÖ«÷5nü—7.1èa e1¯[r­rc¨E“ö®MCPnh4º;3ZÇ0TR^ÅTð\›¸XĆ V÷É¢qšAvÑ·³Má]y|nu mÛ^2–õÅ•Íëf¯|z#’\qgsHÒCÊV ûCˆ‹ÌÌ¢}1#Õë#ºŸ ý0’ùYõ‹gö¯³ÁʱB õÔr·µj G­Çä¹'‘Ôˆæú /¥ñ6g;=Ôˆ5oçSXIfñ9šYÑÊ|Ü¡1y§€(V Ûíq@æloÒÄÏÙ“ô¦1³™]›ô˜Ʋ٘ŽB&&©Ë2>ö†Fºo×” b¾>©UGNа(}‰kß_¶jD¡¬âÄè”dËYÒ-I¾_¯œœ-³kµ#AP4Xr阞‘ùõÄðÇk¿˜`í^æ¦JHÃÂHž3aGØZí.M°Ýùs ÞX˜‹îÿ8•Gâ’ 19âÊœÀÔÊVdW@E_T–knEºÓó˜âšÕ½”ÆüÓê+#›éÅ®®ÏGí×@ë[ .ë¬S„É ?~‡BVÝF^wê"•–"'¢ý9ÿ’ÕïÝJÒåÆMZdµæÐÍPÑ©8gÇXEÇ™7“ËJŸË›²QY­õ8mø…\X wi›ƒ^;/½*=àÊcõÝÆkŸFô*ˆˆA:M–G­ó¼9®pò8´ç¬©Â:‡¾:#61žä3æ\?Õ€i(Ïʇ¼#½w¸Ö î9åé«gU%§ê¨ (®ÖAŠ:Ù<=X/1™M³Ós(q9yÛs¤ Gµ0¬¿´Q³9/¼xkÞ>¿'m¢K¾Oì¡õáí`¨Q{ýmtM>#vF²©ÛÆX¸YÕ«g=MjÄ8 G€Wÿ¾é#xªøÎ  Û(åC¯z·YÏ3ášu›üƒ",¿²õžç£w¿ÿÿe"¸ÿX”üS럜èÿ”þ+î}}Òt#ð[3¾_"‰ú¿žÐO}m'Üïg€êžûœ"â¯é,báo(æ?ziïÅ»?rñ?!ßOcþW²½Þ`ÿoá‡VNñ)ˆ}£Î¯â8Ã~ñûý¾·½ØG>{¨ÇŠ®6‘¨ŸlušŸÐ£úLÀ.é“â?þ‹'A÷˜`0cp¹kÙùé•7¥Sêå‰?Õüî7kõ?Ú2«­žÍöh?­¡ÒxQT*ÌœJNw_9$ë£Ó{l¤ñ÷.×NzÍÖ K’1¤;îç¨cv^©.m¿‰©ë„G—™h îõ•»Óc?—òœ]T¾ƒ)Ã,q´£lr6[ìL‰1„²éÇ7R}«MUQ{ZÄaÇëLY…Rz”ägéSвCÓfOkZŃYaJW â:ŠëöÛ¥+ê„]{ïÀéç®ÞÒ€^ÉE®äŸèìñN3æúô¤ª4Â*y.©¯­ð±QI¢9†o˶{Ÿfÿ%áåúÛòªm@dš“÷¦‘áÛÅôÖå[7ëá!MËw,?êî½î=åw¦¨P:å¶è÷o 07஺¬´‡#+&ÒÅE~˜­e}ŸíJŒ­€½ï;Œç4Úu­ûõª«84âÛoßÛ¹¶Ç ãQ¤¶%zô‰Ÿ†§¶»ÜåZÜ„tÒËó w<9Š3³¸öö·€o×·âŽ{Âßwé÷ý ·o¯k>ØéqsqqmÐÂæõ9Ö…¬»µ4Ì'‘¬Í•ô®ËØ* ºÌ’2Ðî ‡lá#G1é”'•ïõo;¡ìã"I§2 >X©<_‹ c¼Y)ø8ôÓáñ¬¸ŒÜîÑÔm¡øí}ïvVQ]ˆ/-\ð{ß]D?ÚXªG4éöl¯mŠé¢Ýš4Uxóײ˲{|ŸŒµúÒ]NÑÌ®Ë@ÜÛ³µ{{—³y¨/îŒÂ͸îTžÌV™_¶ï®{¿ 'îóK¬ú©ÒìyÕ‘>|b•WM~Dý³Ú~2%´¿0裚f‚êðÿ³÷vK²G’¦ªyÔáû?çÞŒŒŒì’¨pÓ½°·ÈÊ:8 ‰f÷ #=$X™áᮦúiœ·#ñMÝ®™µ¡G¹WÛ­¥2uêüç6‰‰h9ÄóÄRôAÒR>“™¥Hwަ&ȵ:mjE=Ù¾ÝmqÑ÷®je©5Çá¾ Ó·P²X,xñähŠJîÏz„³13¾°ñK8LßBÞç6Š„3ƒ‚£æëëƒñ+s°ž^ªºÍƒ gOEN3`ac‚ˆ•]õ> ¶Jÿ ïßVó´†AÔcàG£éêÔOìLV&H%F²-ÐÖB“bö.@Uç.Ë ©¤•ÅòÅ+•çè­ñîH<îƒBÁAKÚi-³}Ì![Œ2¦dJØí=@¢bÎÇ îIÉîìØÙÀ{ög3w…àùZ7Ç)È‚x´ThÊT¥ñðV¶ÚØIžâe¡qq j‹GfŒãú kMÂàN«®œ8ì&ýGŽÚÖ9ÁhüU^jSü—Þ7ýé¤x<°“ý¯x„u 2­Â¨qwsù¨7ƒ*È )_{XóŸx×l-ˆœÑÞì”Ïñ;Ëi›šXa`Ĥ¡&œû"kŸU%ÐD1ì©ÿM5Ýœú ɪöƒ%Dþ0°Ùh©>[{HUö;G_®¬°m±¸;GàIßKRZK’ ª”HUŠçø8=5.XäñÔŸè$Cl¬×ÊÝœ„•·¹ÏÁ^ dz+0w´š»q”É12΀‘¶>|»o‘²z÷¬²/Vyc¹2 ÷s½Ó3‡ôZÖéÚ{ô âtñe8sÑ‘½!p¾z¡ƒ!IH&ÀJN=ïÝÖìé{‡ÙÈ"ÁZºO-³1æðH˜¥} §)>Ûˆs¶¢ufòM´dyÙ|6ÌÅ貊µ©‚Ôăì%¢ø!Û@ÃÿÞYmNY°~ÐäÜDû^3;»¦W¯8§Eù¬ŽÈQ ©ÔuWÖðh¢%3¿ÿ‹'_“ÜsÞJ]J¢*ØÙIJWÏ;_ç/=:ƒ|ù]Ceàw÷ëÄùÀÈ/âè®ÔSË~–Gà—C¾üku¦/M×ÚŸ2¥ÿÿ¤ þG¦úòùü5øã!ý»ßß_¼|îüBú*ÜóÕøÿÒ!3Ž„¿¿T|ѯ¿Œô¦Î˜oVÍ7oÁ«yþ¨Ç/*wÚ,ò=¹>ß–L6ügâ 4–.+nqÿlû»õ·«Nã|ØT=×ÊÈ_zèà×V¶ kÓ'`ÏáÄ×ù%¿ê”cºÓù›² ,V ; 4ZG’ú×4+3¹ffz t«±Gà Xfž†áCðé¿ÀË9äQø)—V z$—ïö*ÜûÄQz¼-øÑ:ëòŒÌ#%×ÄÁ†MÈÆ¾¥Õ%Á}Äízô,Žô"Ñs[Z™y>Ñ?¢#è8­Â餮7-ECΣDvÇ¿Tï5!㨧MüA8{›!>†våƳ–ÚïÆñ +ƒùØh0C¤ÕqLWˆznw(ô–®‰Ñôj\¶LôÙDɰ³9Uokf]³Äú?WŽ“+D§‹0[¿ùqÜ-ïvHIÚ÷}fAŽ‘™öö½m-˜þŸÿó›dˉàšÄ%^{ RïÒ(Q¶3ÞaêV°ü‘!p^”å±,>Û3¿ «#iý»ò{ßÀçí–k-û¸ ¾PðWI÷Ö¾÷-çôŽÅ1zûÖ®ç”S¸®uoÁ̲ÐÓi;.ر†YvY 9@g¼Óú±ìǵ`äg’êüÏÂ-Ø}Ç[sukV½+7¶ ]í¹=Œ=þfà†MUxøãÒ§k=ZVšéÀ3wD«µÈ3£‹Ú7º/nÃ?dF‹šËÐ+òf̪89dIåÆÇ‡­œM–á^tâºÌwž÷=íuâ&v\„N½úPòø`8Á=,z^1ŸÐŠKraÉîð×CÎÝí”l²´nÈ¥í×e¥ðrg±ƒ¹ùÞtÙe×úe#>?}oOÏfz<±}çùÕê‰ÏRw®¢t‰õ8ƒPûÎJdײ„€\1@?®«±¹’¶ïˆu½ÙR\¨ÃÝVõ‚$nZyÓZ*¶÷Òžw3 zHBË̇±éÚÑ$Ø7¼=Ø–…&êž‚óíø° _$wN‹GH~ˆ»Ï&ÞŠiÞ 5#–‘ˆu¯zCoü¾Eíd§ô£8:Çp÷ÏÏûZëãº"=´Ý厵ä›té£z”Q DŽ'¦/î.*²š2§Å²ãƒ‡Énå¡<5I¸,#ÖäeCÑŒjËjJY*"©ê»`0·ý4l¥|T=ºj `*éÂ<ÕãúþÓÎûÚk¸á0¨/ˉ‚ôxRð9y;ÕhÇ›áJ<Üæ¿»ŠÍ«I†)·Ž÷ƒè8›\ÓOWø¹ƒ fi§DÖÆ Wµ½·aCãùã$oëñºÆÖ-Á>M=<åÁáÙw|ÁA¹n\Y9Èg‰® ¤ÜØgRQˆX·<¨¶–™i¨ò;Q3»r§˜¢ÌþUÙg:&"УŽtm2}Q'XÎIº¥ÕŒpÝè|œ¸ì±`hFÜxÉÛúÓÁœ)‚FC\±k¹ÓÂA?ÚÒçQRVÉÙ§_÷QçÉ7+NžŸÚº9ŒoèºÏ„þ;aPªÍ¥ËìÖ2t$cl¦<„Žú»v À8©ò‘EÅp`Xí™â‰·ºgÁ‡Á·/3_$ñ›C® û#¹ÿx-«¨OäÜØ5á‘ý©Þ«U…[ú…S)Sœv3Ï+H»Á·[9ojÂF³+´ß;*¯ƒNkø0›$Oň·àºëD\×õÛ'ÎäÐ#€Žµàåc5M«ìLuõ±’4ž»vR!¤Å&’o—KÚµ®ËnOK8 kjZÛÊ«W²h |zÐv’—ªØ_¼DC~¨ˆ}MË“l‚^FÁB Ýáâú¸– ä ÂBRU)U,v~ø– Š—. Àí"ppƒ¼®«œŸAr*Àê¢Q~'4ÆÀšXI£%ŽF³UÓVíí9²"–™Ë´à#¯þJ+âf Û½jٽı>ÜñTy¤¼K@Û»ÄpÐo?®+rúÛz¶ˆ÷JØ)Æ6N ‹¸ëº+°EQb;îÛ·vBLd¡=omëÛ9seö'aü°„ؼ,Èäî{¶ìo?>,\r`"#lÅ`f-ºgaCÀb}_vå«ó-0š’ÈSy‘–ìåW»uF+*mÜ£ÍWÒ ÉÕÁ«}D€‡Tßa,Úµ8gü3‹æÑ-¡'$åÃh¾=1Yc º½Á‘§áu]‚~û {ß?>.3d;Íä‹ÓxöJ€~ýÍéh2˜Ö›*Š>VF‡GqÊuä™òȺ"òå~]ÆíÂzç—YCÞÓËÜs‡ÞäD…€SC,~MG*×Gúh¿É"ë8)9Šz‡…¶Pl§mY Ä]N«‘³'®Ì/ƒ·ÙÊçÔúã=74¹å´´u¤3h<ûì¢Òeñ_{úêÑ7lÂÁX¨þ²‰ ɉ¡ÉØ>öò¤r¼`Ý! ° ÃOC›‰L;yì}$ÅáŽ?T“YÈ’Œ§¦  ^kmuÆ‘t/ÃÖAàL<–·±?»Ò9AWõAs„³ ìŒ+~³½*b'¶px{RÕ‰ZY#,_+h£ñ›c <#J‡"Ï ÒQCKŸ±<ñûó–³éo¨Öò*›(ÈV’æ ²Ú= Ÿ›‰±Œò܇Ì>ŠéŠ«WopÕ?|¤o‡ÒðÊMðC$ê@Ÿž‚ÓWòÁ+œ9pcßò=uå@§Éù tê“ç”`.lÞ]Ëu]Žåi¶M1çMø"k=§ _Ôÿ)<©Ÿ_ÿüÏÏÿú¸ƒõ(ûM‹Áqí<_oØa¼úxŶÿ™À©Ah£Ü8ê÷¬ØêtÏç²ý|ßþÍ£‚éÓ—±^Ôš]åÛNÖ|úxÈ€öFè~lx’]ÜýâÞÖN»3¸]«7­lÌBg &ô éË ]Jñv>ÿPž|š N_XMB9†•âߎ0‡<Î!Z82‚jùÙÝz­eke’@LÅ< A­”­´¹¥ „OÌ$²7ññØõ††ïwIãr÷L5Ûêê¾ ~ÛckÀ®Ïlîj¸Ó´T¸³JÒž£ôDÌ“ËcYXu­|±MXÅAMßF:tÐ(q`å§dáMOÎÊ«Ôï¿hyîL Üg[…‘J9hÄô~ºÖZvÄÒ-¤® ©7HçãàC#Í/¬ÕgÖ]вr–õصo·ë±~IϦç¾*€ÔEªåŠÂÌ E Æª ¯æÙ§é.¿]ŸŸ÷¢ÙE­œ‰||„ÎÝÃf ®e 溷™üüσч)ÉÇq™­<5'13úÞ"wó¼{5Œ®ÒÝ-ŒÒÀ½wjx–U«4b»ò˜&|DK»œ‚-^°«.“„¹›¥@ñáÂYpÐr~hWé_»J­¹áÞ<3TžÎõJ œA©·Þ•€$Ü7@Ü=Õãpôm•XÔÑ"lxï/´Ø¦Cï‘ »,z'´}—#îéãÖ†®,˜LIb—R±ÖB0Ê£¿÷oÚøãâ2ºY( ¼J/{¢ÅÒj$–Ѩ]æ+¯vÃVs,ÈefÀÀåáÓdk#i­¢èËL˶k™­hÍ–…•¾ (Û8?Ò , m¼V'Jè='(40„[2㲕Z¼;ˆuYðÇ‚v¨y‚[¸lýøñc-»ï[÷F™ÌctÍ׆AzlˆÜ÷Þì?`ðKX«©’) °ìÈe ÚGŸ`³ƒÓC™7[L‡Î‚c\õîÙ°gJxDÈ.™`ä ý ?lËs¢Üû#ãu­úI10ø–£d: >KZC‰ðd´Àè¡í¬µ o­š„[ŸeÂŒP›6' lD®È%Ú8µ¦ô-¼l} CÉ}íö7<’äƒXŸÚÏa7'¢•W¤:Ä¢p„ì;”Ú2¸ÄU›žÑ…¤a1ì'ŸŠGÿy8 ÕV¾ÌrdäÇ[I³®ä ³»ª,bƒØUäï¸y¿ðÁMÎël6>ö†n¸C¹`žOº®˜ HÈYqúù•%¹X%£Ü)öÇû·³5díí‚W -Uγ`Êzmâ…vv¾ŠÎº1Ä+ÅÑoM°Zÿ7¶”<Þ¦nC8<\UcFÍNÜ®ú ù+Xzžû9«”‡- ÿø(ܲ"j3ç9qTís_nÔꥭ݊ëÙ Üäã› Š_ ÃYÏŠÌñ +ÿ +–ò0Ýc8U¼'Svâ5Р‘ô—^v©åpÊ–w™åk‘fÄnhiV;ì;ÓqRÎOa} f*Õ øàE:u9î}£°…cšÕ-_Îˈø9hô[^ÒYþñ±V¶øfAó³-ÈëâuÕ-\½uw)·ùµÑý¥Úµ,Òæ[Ql€‚IyZeÉe ×Ç¢¨Û•^͘âq‚ IDAT·O˜¹ˆÎH±ö$•¯‰­çË‹wÑd,³ð¿9ü–ûíàæÖÝÛ~BÏ%U.cù‘[*ìþäS@¹Cè•ïêaÑ­½·WÜC銗vnÖ$6×!÷u­©î¢ W ô™Š†eÓ<„ÎãTÍójIõ´µ>D—¶|9ìÇë²û¦ )?2’~ádîU’ÄÁUmÈIüJF‚×$ìžc¿²X­ü¡§º£Ûb¾–9øÁå”|· | ©p±Ïhé¶TÀ´¬F Ë}+XI‡ftŽñfA¿öêÀI–£â°‚n° ÄlG‡¹õ!žmð«Ä鎊•fÒzJ§V’5Që»Nµ×âA‘仳Q–YyÂk!þD5Äéiò¦I(Ñ=™1ŠÜ 'E¹ã­ÊMd´u/hmkΙ³”ô7™=4=§v56Árpȳ›•·÷Ü ÑX~¯­\€Ñ]EʼnÏ:HnÛµ(Œªõº¨D,†ìç!LÚ M$¶WD!Ï«ûzc]Ków5DW%†.Ñ Hyô )jKí(ì™S<¶õ´¤†÷X¥ 3KrVKÂet÷ö<¥Ð±bŽ¡/4êȵâÈi5Õ®Ñ{dPÀ؃yô˜•·Óév!3xÔÔ/ö8ïd‚s¬·Ž*ÄÁ6a-vñüPZ•Â!À´à{%Xs–;‰‘®¾Åá¤Çž3c[¶Œ·ÇŽPáQAYâ +çð˜ãTz9;ŸA¯jÒ{ßd|pàÅëÝr`¹g¥÷cS¯Mõ«9EuF{öÈÃøÈÆ ÍáÉn®áu®µ6M4*V}ò<Û{Ρ„YÕ‚hò{m˜Ò{­½øòqáZ q£ü\æòL£ztœ'‹g™u\ÉáòªÆÑ!µžý¤ª†;»ÕNj9~@·Û×¶©¨lûõHM c_V@¹:öëŒcó9IH',ô†/3O ‘ç`7NBí:Ð䶸±Aö@ÉÌCuÔ‰|ˆ¯Ð0&L]å7ÞTÑ…qùÕ6’íþQ\ËvNŒŽ¢. *]ï6ïcìš$N„R͡԰ËÏÕìôŒè­Ýµª(ªG3S‚óÃuòñ"| ã9¾à`_QކJS N”ö }区®×¿<ž€ö|‚yXdޝwã—Ÿ‰„«ü))é¼Yy¿wòl„‰³•ØŽ[q&—fyþÓªqX`‘±ÑuÏ•p þ¤"„@îý†Û9èä±?I‡4°Û]?þéVã‚öÖ67pIZViÜø=ËŠ¦Ôñ|¹d)uY8)]0)eÈOÚ²Ül¹oãÚáÜvO„q@Pû ,¹çÕÌÌåºã7néªV‡ :7ïµtÿÒ¹„òÌE?jFÂl¶R§÷.á­Ö>U¾n«=žƒ¸<:E †}”8-&ñó(colíª$pRqËI,G<ÃiÝì]îŒÒ¿*\Âø‰¹¥ñfVÚ)“@üíZ·ósw€UYÁ…Þ-× /õ ü¯ßn¢<>ÏÜDsSòÊá¨;ÌPA|Wb ,«üô:eÕž6<ÀÇ¢¸Â ­thP|€ÙŠ’À×Kïk]óù¼Ž7HràãZæZ‹×^w·dÓ3Þ׊Rj`$áÉòrËø~øüô›ûÇXËò­èƒø¿í"nÀq;|¬ †Û£l,Bö3!wmAa¤¤¹ßU´ÕËlùòÌ$*ð”cŸòêTAVjýñPøoû®Uµm¶¤'–ã£9b]iÿ„õm[Kwìí+î\}VoÔsµËGÏzZ§ðÊ}ï(þÞ£K–ÅJèÞ·ï}».š]+)£è3½¬©‘¤‡R†D9†I!qUµ(§ØyH¾–mÏÙLb C|9´NsÂ2iƒÕi^ñ/ïÓä|°¨±ÇyŸ»ñÂ`o‚¿nÝûþû?þ¿}]× Y}­Œ O¯hã]½Ôw%ï(ùÉl –Ø}ó=Ô—$Æd9]½fQ7‚â‘xªŸñVÒ|S«UþðG6 za¶ªfÙʇ{¢÷ëæ±éU‘OæÕ²±9~iPà–pWÙµ>¸÷6£*¹r+× „öxNÄÝ,b…œ¡hY<,_´Eìnÿ«$b‚6¼Š £[ƒ¼bã!}*;.˜öz; ü²>UNIŽ'LÒ†ïüú ²Dƒ¥-n¸|úìír1?ÌœY$aù7åZÜjëÉ:Ñ—>ß×eÒ2IîG?r²ÓµýTZšJ!³¤¼ÁìzY5Çë’hãLúX=L1Ó‚Nχ§’” »†ê0UÿX³èU/Õ³»áðe\,‘÷5Èû`m>̦å.MïTlŒ±Jå·ê}¯x>|ÙÖÜt˜3‡‡ÙÆzüʈªzj¢à‘Ô%wú”u&+ðæ õ|cœ‘^Ì{×öó%M*Ê·2hÇ*c¬È™Û8Фà<‘žäëQR}³I#–<.…ÜÌ £y©r¼:aÆG 1©?Ê×émBõ¯7ª<+ ¨2ÆÆgéOñM8ܯ’ó†D[~e„JÃgzèÓ)ŽXYèüúûEW|4ž?ß:iqQ(wÙÌ;$QbÆÛj”´gª§¼ÏǵàG«Vv· ŸŒuaVýÍS®ôd­ÙŠ’‰In:V BFûkØ ²7¦]È ¨bà•>«Ø]|g]ðgRƒÓ¦þXiãäA¨*g7F¡Ý V5æ3gy‹û­òö0¹'¨»hOùl< W §ƒ[Ë[™õ¬„IQaKëúóJ+˜‘N¹ïaªRòîÙ­ù*sWl¹då‹vàlÄ»ÿÇY¾Ûþ†^¾*q‚9îíÁàÓOÊŠDeê]2èÆQ¼ Nž®båUð1|˜‡ºÃðލ©˜4ÎgÏ×ÞâQù0Ðsð碯9[ê€[-c(|£+£ôÚ¾)zù“óÄß‘ÒëXvÊÆ¦¨1L{mzáÕ~¼îs+ÕOf¶÷fÑŽ£?Àúó-D‚§||IÌ–UËaÈji‚‘Ël»ÿî¹ ÊvR ÛXAË­.ëPgfpWÙWݵ¬òìÀØ ÅÎÑå!Ì¥Ul( ‡u’" U=q ªSërìph-¶Æ--‡[YÙO¾"Þ‡ØÊ—‚P/ª²×~ac˜ÇaY!üW(åV¡ ˆ°‹¼¡­=ÉW®g¯8:ܹ–ØÎmdfÍB(P×Z‹—]÷ÞÁ¤„Ó& §lìûkô×3ùQíÒ° )ç»À³eKIwmÙÕÛHž-zðv?>–oœ§q Ü©ALÎCÑÝmå eûÒíŸè0<¥ Ó‰I'3?lU‚Ýò%˜Œv•D liïOAòÌhóåfd{Áî}­R \[Xçy`â­¨ràÓC¶ÇÀ€m¶Ì ߎínk]¶¤L¡¤—½bðF\Wç“çÍÁ¼ÍéÎÿS«•‡B½Ë¢øÇ}ÿ¿¿}BúÛkí½¸BŸ%Cm-¹.V™‹^h™&0¢1*È)&„íþyß—%RŒf´€ aßûºÖqñõWÕ¸]UÛ‚J—®PµVMª´=ýõ¥JÅÿ´Ö‚´(£Y£ž«" NyÊO[•¹äZÀ2挤fNU4X Nƒ{Ç]¢Âp»l]\ùmmyO¶ûÙ£#¹l»´÷¨u~Ò á-)Tè¤tuú*kØ÷Õ Ì&û–É•ZîƒÈÔ§LAFÓG`qÜïÍOÿ,A…iìc¨I§¸·‡Ô{ê2Ö\0“ü…QÎÉÒ²ãêo~€|T쵪o³ë¸Ën9Uº˜§âЂg7G¡Ÿ FË$MY\»`VÕHà5¢¥™­%éZ©B®>"oªE^άVbwÅÀWðÜHˆ7¹ÈUdW¸´Ì]aÅC`!þÛïשGÎÝÃV(ÏÜKåºo·V‚G^Âê¥,15N§CÓm²·T¦áÀ*!ù€NíˆåÏ8ìù;kÚÍA‹9d¿31bjý“l Î¥§lðP Ô ¥Òàó†8óó`ö­xð JŒïl·¡è©”'v/ñqìÓ˜ž`ì÷ΜŠs½±½öŒå!·õÏ«fkNSž\ q7ñëoéÀ‹«?—Ñ÷R6ÆT|&7 oº#xÊ.¦XüV€ä›bòUïk&é;½ðJÀP 毋 ¿.¹þQiûÉðzßð_ÑŸ£þÿòXA?}™™ÁÜ_ÒûÿRÿÿåTÉ?ñ±ê%\?ù5üf¥w%Âüi€à»+‚_‰ýaâÑ_ÇÆ1'‘= ÿfÚÐŽø„{) n=üØX¾mÌhARÙõØûu±ºæ y4HLš ¸ú“Þ†“\wäÿ:q.òsHÉwéÚûùG}zÇ?åR‹Ã¿-îÔxÜÝò°áˆÞÂ2¦–]³­µ–¬ö®.¾ñØ7½{M¥Ò\ÏY§Y÷ $ªÍ(Ä7 “ù`+Zt]eV +Qº(€ß©rr`…ì…í;Rç!ƒ†ÇÀgG J»•8'Â>Zó:`>Ì­®¬NDŒû*ÈŠþ¯Dh°*K­·lLžÏyv›êÓ”¬ûZE¢Ð$u»‰À`ºì$˜½I¸4vVñ^u´¡íÄ$€×ZÅKdÇ!’0µ½²¨£å’Ž]qá¹——3ħcóëŒë‹Åálõ»t8ÿýªSŠû¾É+`Ûöx¹»nˆ•/”¶`^Úmc7µ`=½ˆžO\Åì ŽáÕÅ5‡x1ž`’¯Ììãºty•>³½ôiøAèúê«ó„è{”Êô²hHvÝÒÞú¼Þ9 óžÜ^Eé´Xk]×r72êdS@¾Ö© º÷=x@;Š?ge;ýóÞF8¶!È øg#Â.»…ä2˦G#mÃÍ|k—"À"×ÊsI6ŒZʤãSÝ„êÓe–4hjU9R´ði»¶»ï iïuß»@ZËì2nâÞ' ‘åι^õv;â)‡Æå´áþy…Ûµˆ)0í÷ÎËm KzÙ|Ëq{õXD¿íÂÇZ$>®µÙ÷ÎôÔf®¹= XÉË²Ô V1VÏc¬õ¬ß´NÝv]°.\ù(´ÒÜÌ¥½$CÒíX”ÇŠÇœeh´D™„™­µ¬Öa÷˜áFËKЖhœ’Þ¶L+ÙZ5Vuˆô)ª{ç°ßöxm äˆÙ£r]?>®ËŒþñ÷¿o÷qHÏáŸÅ=täØ ´ÎY0˜>Ñ©SUÙf/ßv]Y»Ëµ;öŠÝ9û5a†À½@÷ñ¤Õ·{ ÌÓcWм~©~½×[Ø*ŒN~ˆHŽ¢¢¡ÝÝwŠl ͲØã¸#SÏZË®‹4.ÿ¼ïPÝá!é×€¾ “x‡¯e›¾½ŠUÒ?¦6[Œ³J„º[”C«'©\á®°c̫ڢ¡ç“t-» ¾Á½[L­mܘ ¹×'a«¶Á Ê\ a9242¹õ©ƒÇuêMù³~Bña¿óUÓv±*⧈Õ9 ñáƒêëY¢‡Þ]œ9 ³4(ÇÛH›;LîN#¸Ú€k×¢ûzŸ®PLG #h<*‰1‰Y“u+&‹ìÝAEË>Þt*؉1Œ„Q¾l³´>;ëú8´£—DoÏ ‚i_SzÌ^–’ž^2&-vãåÒØxNq|d’î}'õ³:²š=ÂRÁ¬\z™ Än•“mø¬zpúX¬¯ G¶àqþè$°jû Ü«_†t˜Y!§¡hðbõpĘ*Ha+åSv—w€Aç°‹J/iN‹ÇM‡^i+æ?Ø:Á“ý·’‰Þ‘—òê¥ÍiÙl&ÉûjÄ‹ºœ`tÇZ›èë%èÓ®ò¥£¹ò†Äاïž`޹ïäj™]\{—-„¥â6ÌgÚ©UZ"%nË­X´K ‚ï®Ìu/èIÿu~²ÿ0r×ù¡³sqù=q õ6O»ÕJrl6U!x¯LQLI]]PNñþ»:åvÒ@®SV\Ÿ—å$5«ÚôÞxÓI«}œÐs`…/]ZC®fô§Á:ßÍõ;Ƭ&ü5õfUèG/2'`9•ÊqNçµ ™tRÌR²®,Fþ bëêø•ßÚ5½‡«~}¹Uv Ô5;¡Sww86à7G`¥ýÄ.!,T¬Z¤¥ ¢œqÏ)Ó#w’—ê±nTܸ^…iïŸL‰î-yh>ωˆ†£Tzñ³ª;FN·‘ô|g;&ÀgWÀD‰­îä첚ɾŸà« ÷í—‹¿?ø×Mâß4ë÷¥ÔŸŠÚþ.SÀßûa/Z¿þ=>÷ÿpàýã®ßŸŒ‚¿&ÿ΋àç_¥oâ?û¶¯uúémÄ×$’¾»4<–ß –¾v»¿ÿ¯/Úú»—=g úî+ßýðGÑǽÆ8ÿþ9_PÍæ×ëõ‘6×ðíŒSå`{®=zÌeòøÓ9¶.½Ãz\]ôÆeÀ)‚›Ìd3K¬?°·¯ÕÇ—³D·Ú IK-â#‹‘ÄŠˆ²ûöô«t¤ù¸-ÕÁ§¸w{Y¸Ø»ðp+18‰„® AÄõåÒA6lD;HýHÎO§ÜcâÉfE¦|Yðp-šÑÂÎÚÌDL‘Ø‹·Eà²Àôo¨³i÷f)mõ­Ì†fFŒtpïêHuÌì v€§Œ %xRMt}ØìmÌ·¸Røá0 Žg¥¡…T4Bv,ýö `™-3»8¡ö–äÖ9Ž: äñp×%R †´kVn¡Îl4£o4° •UzÜ#€,ýÛeÜ[Ñœ‚fU8—ð–´8ðƒT§:lýXø_ÿH¼u:\ *ww¯&uÚsÿæ-[¹†Ò8HÙÃàÒÇZà‚\ά"’¾ÂR¹o¸Öuåx©‡ñÒGÅÊ7ª!ª/¶ûv,Ü[:@ÞÚn,nN`Ëp]l¸KŒYõQjI¾Ý›ÕJò2\ Žâ¾ÝÛ¯íSr¯©‰ƒëÃV¼ÞÛ£„¬"$ȳ?ˆk°Owwkx»>.^Æ=V h-«LI¿:W¥ná*i¢'ÃÞâD¸ã3T6ŒGã®ÙB8.ë£$ak]—E>ꊨI¡ P1üðŠYG~oa;1…€Œªº²ÄÐmùÞ4» Û,ûH îìÇu-³¤ä“?´ü  Óî€}žuýÞlQÎzÁÕ VɧÅÌ<¡>Ö}ùöÛ=Ò?ù‡xS÷”{4ÇÄâãVG˜íž¾p÷½7Ì–<2 D€ÜSó"6¸cKn€ºíîû;ê²õx?Šà{ï . F‚Vût+[ÔnrF»’?ѳë¾ïzlÛ(Ýk"’ïí÷}ã¾—E›‡íû&q­åõçw9Ét] ÇõÓ:Ð<6å˜-®Ì…X nëQÕð˜ðã[YW]XVÃáŒ^ÕÜ”;îpÉQÍ7‹ô½cð ÷]swƒ·+mqb)Þ¾%·B…]×2Ô§ëvÿt7‹®Ú* pmúéEP$ܲ^z» Zë(|_ö”M ¾E£™]†[€ë"?ÙH~ï'Z,èe/ó‚©mÆ9S›Z´´˜¿æõ?ø5¸P-Û0³†k%)Wì€F±×Õ±òÄ@]ÔÑDt¼ýÇkXÙ!ÎfÉP˜§Ó"À˜ÿ¶b’®KÖ7NwArÔ«oÕŠ~ˆ©ò!\õ[UÍ~ ¢™¬rµ¡ó´F tÅY‡—2kf¦ª„°œñ‚%A™òÔÛÔÍ«§Â3%™hÕàHæ),41OÇ­ Áš$SqçÙ1ñ/m§<¶‘€ýáèi¼O™èõ![Ýz'¤r2÷è ºMóÆ1m¸“ðö8àÐ$r9ˆiY¯<ñšÔŸDîH¢d”_ªâ'ˆü‚æXÚFr&T¹ßöHÜ*þˆÃÌÝD$Ô ­fâÖ:¢ƒ¥êÀv­ Õzcs3JœMñ}+ŽšåÇa’<…·NNÁ}Ò,¶?Grts²Ö9&D9 ´j{¥÷è¹²ǯ,:F2š§`/³éÅÀ·!¤ç‘ЧcBh7þ–²'¨‘¹©š©}^‰ =aȇd_HµuaW²7Óþ$z²¾áhÇSG9“'T¸ç5Eÿ—at΋à£Ä9þ«£Ø°³ú·s'@O³RÇ1†¶4dížË¸ï Ðú¯›ø¨‰$ªœ¾Î÷>$ü^Y’ÐÙéó|:çoè~‡¹S?õ…©¬AX{jG|ý+†7ÔOðïÿû¿<øçüé¿/¼óÛ€¾ˆøx‡òÿÝ?ãß÷Zÿûªÿÿ£Fÿ¨ÿo}ö_.ýn DojÞxÞ¶þþ¼æãû˜ß~Ë áø:eüöy’>u\Ö?ý¶/5u­ËãßµLªþkð "ª`²H`Ÿ*ßä¨4öªóµ•™®ëkÞ½Wg4 è ‡ÚWp?¢0úýÛ¯fcL[ÜyŒfß-×Z¾ãœO2J–¿8Š^Þœ¬—* ËÏ€=Ô«D먥#çÈJEv¯â(3ãÞ©â…)4=ÖfËÌCôt·Q^–w&d¶eÙÒ$mßr@í®Êö5§gÜɶfn9«w3;è¹¹1Ï@€n÷…ΤáW4óIwM.äiíím:q:ÿš×Ú‰á0-fI ™{îhU ËE\0.OèÈ’“`Oq\ b=»FÐèÛ,~\ø±Ö§G}k V|Ëå¨ê°kßë’?œ£Ê*–ôÉ. K´׆%¸½QÔÐ)P¶A#Û£H ^+$´<…Ýyt­BQ–0c„-ö¦iXîgP\^¨ôltv—9©}]ò-ÎÔÀOINDpÀ±l-î›w"}E‚ù¼7‰¿wBœè.E˜Æ ¤¶Nzt뎓i—}˜}BÜÙ#¼ò`£ËHÒ·;`1#q'ÞvC¦"¬˜WÑ©˜¾½ÓHkfÆ…°l)|’ÈÄG×G9'}o»/AX4Ema1ÝýÜÎÖgj‘¿EÉ·ïë¾·Ù:-#ñV¯¤mœ-ÿ“Y)á–ÇäÈ+5[q¥&yÔÈ00èäÇuU€×>Ö† Æ ›GL€äUâ¼÷óRñ[$Ù"¹§åZž§‡;:ß;ü0ÿM¶Š·°7¯«^¬C†J|üøñq]Q­àòµn­ûö9\ãèÐ>„|³°öн»ï¢ ÆIß!ºPbk€R Ó«œ¶!ßËï›Q-M¬üüm#3/0Ë4Ü IDAT^¬Â„å &„¦kí¨Ýá¾K ¦žñ§ËÌBÒã`©K‡.•|Åý²|Þ]×ǽ·äˆ‰/²„$å1!Þ’ÿcßÜv­ ä²Ëòy„½Њ,ˆƒE¯`R RõR}šk¼Æy:ƒw¶–ÑÛH,Õ©VÁº Ù›Ê2ˆÓowQØ<%¶T>‡‡ÌX½è9YÌOÙ¼]Õù [æîi'Eõ›fÁ£[íþ¸ì@dŠÓ»Ý??o2Æ“ê²3îM`ÕÀC1JþZÝÑ/«&dЋ+ÌJÁ&ðPÌ‹Õxö¤e˜Œ(YväÄ-𑦌)zx G÷G•‹T,#¿7e.Îú¼£ÆÚÄ‘Ï:¹D×ÞP~A‚·Š'j”é–ÎÇélN¸`¹Zýx"½{«OBÚó»”÷¼c½_¶!»X¾ÁÞ5 ÃÚzª\‰vv:àÄ¢³b¹q?•¾+ŒZ\â‰ñÕîòíœ"b¼ðRݬ\ECRI¿Ýú9Ilá‘ñŠ: VW«ä…d{$ÆR•Õ9ò"-QºÓtÕž´U¸):il]Ö-‡‚™=¿ÁjZ=šÒÔ%ž£.GrpÉݺ®#ÛF÷ÐñxBA4Zp¸•Q¨6b±¡0Ó©p˽ OÖMcÇpŒãîZVœ¤9¥ji £…‘ŽG–$°ù';„tE'œ€ôJð`Ø1C¿ VíÝÓÖZ¨~z0ˆua«º¶YwãaQ•ôhqÿGùK&e/ž+³…A^‚ Ém<"Šù«+ûÊQ ÂØ'ØÁ “ÜzÄ_Š…ªCfÖê Í;ƒ•3$0r+©ƒT$®ÇˆÒ \¼j0Õ7ÍGB[g=h*ñIX(ª÷[Ó©®®[ §¯¾Õ³™îW}RÔ™6Ãçå‡hx<¿ŠaâqIÖŽÖŸ¡†ýîÅŠ«ç@wŽ’Ÿ¿£+Œ{®ÄßUçN}’ð3ÏŸ6ø'm÷?ù6ýTΗä_úø/†ðW Àè—¡Mü'.C}¯Üëûa¿”ëaÄÖ—üÁ£ò—_dy½wâ¿þÖ§†þÝëOå}"ƒæÏ÷’žôÀýUöò”ú†â¢W/b}5Q_ZÀ7ËÅ%ô¤º=cçqv–ÖÜ\Û73U%g?rg^¼“Æ£¸äúKÃxÞ&»ƒÂö aH±Râ(œ@θ{’Æs®ØÇ; K^w÷Ìv%ª|¶þ #E¹÷™QÃÞѽ‘iƒ‘{´s-ö±³õ-4sèæV%Æò(ïu­k…Ù¡÷õ.§ÃÖR¾íÉ<¡d“AÙ&‡ñä âMŽZ­ù<–œ–‰—Ižy.²fv­•—ª<Îq" Ñ SµÅ‡©&‚ÌAê¸(.ãot$©ô‹ÞR!€:€uºöq†)ÐÝMíhá(4Œ³Jø˜êK‚‹¶CÐZ]š«.mhõßcëµ YƸ¤ín¾pµÁòÐ¥RÖ$¢®¬´j[Å­]0Š UçäZൂrÍ`‰ÐŒ"6ic;š‰Žƒs L”d_d3UÙ'§Ëoá D5Öb€çuo m6¨n¹ |.¾Û —½2&ë˜l‹—-š]Ú^‰G³˜ݬ ‹æù*ë6'—ÌñÓf(ßêË|fQ³Z‰•õÑßîËÖe‰|¹Ý×çµIÊL&î U‡¸¸áP¨oŠ!ÒEÿ ®¸Iòíy0T „–]f¶˜Uì"6“6¤ 3Ovü›âÄ$D—°°¥ûv9öÖÇZQÏo‘A^ý•®ÀÒ¯e=}5`+ÏTŒê‚ÏOOz-ÎÇ‚‡Ë± b×¢Eûv},.ò–\j²:¸opÙºH:|ç%¾#%>ê¬ð=òÏI•è¾}ÇËëZ’pî{ F¹…Y*í“î²šîÆšl¶Ö¢¤Í¨/ñàn]Ë®ëƒü ·ûþíï÷µ.>Øú©ž–äºÖv×γR:¡{{ÁÕ¸N/ FNŒæpzz²]ŽY¢Ûˆ˜¡TƲÅ-ª7JŒ™T6%p_tÇl,`O@äBZ2[Fì (#ÒZËá.·Í†Ð8ö¿ÌÔO8»ùìsW×m)£èÀjÍLE*ï”™˜Q´}oŸÚaAo ¦+ÉñÛ{¹lÙ"onßÁÂ+qßZ×°¦©6§à­ÏY ¨©Ca"ä‡u "e ‹·­ÚµQŠuéͪ¹Ý .6öã(>Œ-ÈÊ ·Æ¡ey: -´[AýÿE£BEÕ/Tg÷ܥƃYj˜Â3vÍà¸(Œwåxü¦‡ ¥†¬Uw:;NŠh¬øŒºÒVLÂNÆz›L9É™Ö6òО»À u¦Q?>ü¥† zK‹"…`9<á‹\–#””²×˜ÝЉ©xm‰a,Îe8¸äzp™*Æpl•Ó 2±.•HÂUõ³ç{¦Ú÷mݳþN#¨=ë©öÑÃN“;õ>Ö™ªÀŸ×ôj–Iá9f¹—Šº‹b»M¸Ø¨!A[Í¢8ÐÚÊ]ký¸<çpfJ½Äé,°2O´„&vp[†X•‹“«WŒg?3&̺x‡zK' ÅUÜÏPIƒÁ mŸ­ í¼:&÷,ç­Â`ǦG {ÖÈ*ÖHyoüü(.ëðŸ°&²Æ>>¶m°-ÇC…$Âåƒ<·žþ0^µà†bµi†Äˆ@ª6˸傔7zî·;IÛgª×þeo§RL Ë‚};ŒëŠct>‚½;ꮎÍÄí¸bë᱕k9úk&å,Éœ§ÊÀEƸO-pó©q>nLvOž,i”óˆÃ…²R´dW…ÎHÐËñ? d¬QÕhS˜åšÊŸ€ZL@|J¿5z*7ìzZ°‡}í¦jÔîyU§BV‰½bÁ›4¨5 Ôî"ǰ&šgfü˜äŒçz¡ç[Á¡Ú]œ]ÿ~q=–‡Ù =ÑÃÕÎÁù˜ÐßK=–÷zxcæì#”¥ãÚçÈS|h<¼›x8矗xõ_ë‰ò>¢ó/M$ÕçHí§˜!·_u­ÿ‚#ÿßí.ÿSôå¯r¦ýô×èü`þ¦ÿòoû×~Àw… ýó“÷Y¿÷Þóˠ廯óu_#/ïzeßM¿ôð $¼‹ð{ÿg3€·ÿr`ô-£lrxF1Бói¯£oàBúBªùæâͯß5ŒˆhY{îïr{c'IÀÙ¾`õùîà ª ‘v6ëœ>$¥ÔNœÜUÝ3cÜ„ù¯ j/©ëlÙ{ö BÎÝ<91ÈCx2& \3ž7ã×Ҝͮž~@U“6zê‚¢žRþvw­Õ§ÉGöuð¶µÖZ‘ŒÜžhiÍVEÆ.å¢,¨ ðN´$ g;é‹v¬ÀPCÓÿÜ·’'M ãÎQ¼¦}åÝËÐÿN壼Êv —ÛÆó¨ PskTFëBÔÜfÖ¼ÈÊDÒ…ŽÇÞE;Fö69*Û”ïíÊ“"$Ý;·¡[nn¨?i-³e”>}£Z³ÔmO)å3»\7çÖ® —å´2âcZ¤{yå¾ï½Ï'kÇïW¦ZšÁà÷vþ÷ßÃ^nÞpyrÄ5 z J "#{,ƒ²Ü…:HÁ¯¦yÐTÝ•²=ËHÎØþˆ[s#`ýíÍ"¤ÍP)W»(óÐpÔˆ¤±[lJ;ät¬£íë“âóÞ’¯µ¢¡G:ªÈºõRµÌþGÐÒWÙDã¥Ô癆͞ß"Ìá+\MÛôð˲R6ì¶m+#-Ÿ¹v}ú´pþBÀ•é}».¸Û²(wW¶ ´Ð¥´”tûÞ·ƒvýøñ·ëÞþù¹32•eÖQ¶,,\fV¤TG1G¿Â7w`=VŒ˜Ž<Íc¹`0Ù. Å3ø'Á½å¾Ý=ž÷½i®íý1ºà÷Nl³50,qáë•a»õ©(ùúшnVw±A¹‡q»»õ’–?j]8˜ÖfDÃÌ({ïí÷ç}³zš×bpÃÂV½Vƹ!ɱV’<“' kËçÀ×ñûµlSÑq{Ìër•XR÷rN`71¼yx"Íå¾CôÀí“•Õ¼5÷ 0ú½SûÌÛ?¢!{ïøyHTÆ™9¬‡ƒ-zò¿QS™¾¿ä‰NÁ²âËv» H,ÛxtS‰8ízÃ)Ÿ 8DÊhá™7òã2¸‘=Ð!‡I[0u!ýÈÁ—u\k­‹v'ΞöLõ`¾Ìfp?}¾u哈x_³nî½W—w16 –ƒLás3QØ| GNd7¡LÛÆá¢Õ3Æ£½ºh:2Ð`rKmcö«žu‹,>“¢Št¸,$ ïâ_ÍO_<®¡êrìk#ƒg=ËÆç©£ú¹Õ 3×ûb65°ãðÏÚŸîq­©HJµê.×Ç.CðJíÕ:öksÐîL+â«T“´bï¤eÄ,ŸþUÂ@Æ„§<{”ÐïjAÐߌPñ5ýèþô¨Q9îó*7^ž£M;ùÖ (êØÓ¯¼¸ùÛ ”ѶE«¸zcW Œ%³.7ûUûë‰r&¼ÏÕ#ê.nO¤¥õötvek®Ÿá‹„Ù~È3Ó {0-YI桜??Š<ã. € &.‡„Cå2VøÆôE¥u%B_MfQ9tæ!™jq79‚–÷ˆg÷iº-Ê¢šÒ3$ˆÜAåR;»Éó[êæ—‚c«‚O L÷¡«ovzâ4tœÑ¦÷ªË†™Õ§tGãÞ"³z(óÎÑ·ü¢É[ŒÆLåÚBÌòÓá¤Ûײ~Ú2¿EW%³ç…vÙGÈEõ#hÞôUd’é=éôµžY£5¿®P‡µXlí¬ž“ßhõù+J¥LÛ­ íglÕ ,gÍk½9˜™›¡Ä‹´|JÌS·nÆz‚¥tðþÓ/™›³e¯±-"”˜ÔêÕáK$\m4¢X§íx°)(Þ?}Þ#.‰ï-Oâ`†ç¾u*:®ö¬sïñ3zŠg±ÄW=ÿõWó¥-ï[…^X=ÿίÿçjËźûw¥¾›ðO|üs~ÌOBÿe³šÿËÇ?ÿº·¢ù×ÊÞ³D ÕþÍ=øÝàwã2|ý1øÚ€r”ýXøøÍk좜qêøù,aˆüo GÒ;°Ï×îgFò9¾Ë‘€ž}é‰ â0ú½ý-ãQÔamž5ÂÏ·åµfœ\§pî7‰—ûñà‰Îçr©@ûõÿ;)têdÞÄÆt~H£ûóœHNGÄx|‡²€–žïÂY”Cå‰è¹Ø­š¥áï¼’’°JYާ—¥,Fím Qx—-Z1äÛCÿ_äÿøaAö_•fír1X¼2¹|o_f–‰1wGÃìtäÑä«úc¼Ö«‘§H×½MˆÜ¡jóWàʳ/º­·§ÆÑ‘‡5eižö¹N[¯Ô'VÅ5OU”åoo+R¶Ê”‚azr§ÎµèŽkeÃõŠ–¤™z®Bñg¡ÑåIÌçUo—Nþ—åé‹TGtùÞŸ^ îØøÜ;´8O­ÙoUºD£…ɻݠک×-¢tMÆU²ÃæIhc ^ŽÚŽ0‰Uo±½§mít༟ й'O²´fÏ=WÞ,„\´ë"~»oîNü îv—¤{ƒæ‚ÑcD²‚®Ñðó(0Þ3ŒÄ #YÐ@äuÓEð²%ávË,è´è;ôh",ŽíAò £|Mø.Wá Š$ì½ÍãÕj$Ð<@è¤.$…­pù®V„Ô]×%*ø3] ×µl}|èó6÷..ŒSñ–¤õ±‚S‘¹Eó¤Åñ;@O¸,[Vå²R bέÊKÞµ48´ÆÓ§æä™ÆÂ"îÈÖ•X`qaDç­fä€E¢yxÓW¶g7ÀŠ?æ²µ)‘« ðFîäâ¨Ë’ðL,[k5çŽq/'– O‹tˆN#mŸãÑ2ÄW N{Ó\!xøöm¾hn÷Áƒ¯’ï,í«+÷à= ÐaÔ®Û€•9|PFZ´䲋>ý‰xP˜,1ŒýG#ªiž–yöÞø’Ñg—ť܅ǘ…¡WâC5‹q“ð²µöÞ·vv5Ѫ‹;Z#O˜oìÙ‡Ð?hZ±!³”$ü€ùã&øh§¬ŒÇu€¹Î•Õ›Uc'Ý)n…Œ\»¶€a±²:8‹x:{ÐsNZÎÎÊEr§¯¿ñ‹ M&c1ÒO*B| ó´Óö}–˜®A®9Ûõxê²:σV­÷\R%šâ½‹kkCmh^Äwv“äßàUzP]A\ªËÖóu@OuG§zºõ×yü&L¤±âGƹ#õ(ÌKyŒ|ÅŠÜO¡8ž¹À†›+Æ"b$¤ÍÙói± ¥yáZiøm‚gUw  XïkX+øÜ%iL®c¶CËÑ¡5®ó¼ü˜p%`_$4ì<;qŠ-‚Ò%5Њ ;ñ<›OYƒ\Z¹6ðm´­{;ÀÒs&NåÙê²ciÃñãͨœC²Ûu±ƒ ´#þæ4ãl×í²5J}kŸsoŽÀN*&?ý™äJÒ銶ö-sŽMy´m„oü4ãæ­æLJÙ¦-É™¬Š<ˆf©ßU+wþ<9§¨ß\ö†¼äåí9ü#‡ï°œ92Ù<áÍáëpk)!ü†™eªüOGÑr¥€EìãOL` Ó7¡*nnìNÂjïÇŒPƒôŒ(Îù¡ûœ¾j!Ï£‘{$H#—fv8q½·ÔX}†Y°{žƒÖ,¤X‚#“ýH´û³]žK‚î3Œ½(ÝÏÌ%7ÍúݰÅb)k4¬g¦dWû†~qì(Oÿv]Ð*ÇÈ«v§7Šbg¢æÞ¥w²ž¾´xžº¾?¢êþtðï‚Î,ùo¨Dë§äóÿ$¡7 ßÍ^‘P‰ÿèM~©Ð7ᙟ\1¯ ¿$Pþ‰ ËÛb½¿’¿ùÓ>ñßK¼1Öå÷ gÿU;šåñ€æ‹‚? ¾ŠïƒÝxm¿SÂ,œª4½ë ½™ÃÖþ?]Ý"¥—•·X„Œ¦Ûgo0‹É*rǨ>¨!úõc7$ƒ³½oŽÆ9T¡ˆôf¦Óù¨SnCÜ´ºÕQÕÚìÎx ãôÚ[’ùæyGÒKŸÅÙÕÏ|è€é‡ç±uf¿ 0ËVä¦Ãuº}m­Z¨™ƒ y à:n„@¶åçU¤¦°/oÁÀE3»»w.·õ.^zbh'áÓïùXô÷Ží>üVîçcAú2w}VD«ßÒœwã¾ÿíó¾}uñºƒFò¦bFiœ+¢­hÀâ¾ÁÝÔh|ij —û 5­ìyÃ+~ð¸{<©d ±È;/^´ ’ƵHÚ²u¢0Ù´AÀ¹V6´TBmD傇L²wˆáqÞL‹à](TfðvߪâÆqzQë6]›¸3غ>ͳ–-f¹³äÀÕÖõ¡¸h+-j+dËèFp™Q[î’é4×Å(2:YIì›ãDerHØÆlÏQt4.¤ëÉ«ˆjaq4/KGbejÚÌ£±ÁeövwY-ÍéÊMc^(N\Õ_{|Â>|²Î þ¬§4® Ý`ë2-“òÄTÇóª»HÊSp\ˆ»£ÝxÛ=ž[àâÚ4rYyÃmùMc.´wžXI^×ÂNµÆ*Å‚WsùcGØòaª¶mš·.Ýå]-t—+O6qo€o–’GêôéÉkŽ\¤xÑhõÀ¹%TÍz§_I¦]´«Spª®IGs^ñ‘=2M<6ÇGxÔãÆZVZüåÄcjˆ_Ì”Òc¯yÊ:Šf_šdðèq¼†–6J<.»šˆãgj<óªædaÌaáæeæ8Äé%>qyùéévÎrø·¾ÍÍ"?é4T| €…¡;f®eÂe··´ ô¥ãáðþ §ŽI½ð<õÛÛ€Z%†yéÄ/p¦†rzÏûxqÕýÜý–wFƒ¸€Ïp‹Kñ‰[Û½#Æçš#öÏQˆ ¼íªÏQ;ÿóVe*Wµ 9š|¥ì÷ª½“U·ûîQ1Ï-Pé‹)¾å2]`¤e&Á©CËa窩éáˆÌ†uÍy=¥F†W¤yOéæé¹v Œ ‰Ð>Sb~ã1Ân4’;H?å"&h¹áª¡*ƒ¬77µjp¢>á'l»Ó‹W“r¯Ðd†8±–x©íl¥Ü·fiÅ)Ó?>õBä^4Íù:ÌÝÑëÙ"Oܾ¦SQToÙÓ–éG/ºï83ø‘$™ØzÇl(«pïb¸ó‰Ê:¾Ð}ž ÿ¾F¬Œ^ePçè'è^úZjÝ=ï}¦/“eìÛÓF›Š˜Î –ŒÓ>ÛÔ[íMÄ­ñö(ñƒËjÁèú÷Áû?hBÕꦎÒõ¹± Á‹·ÏCÔS OúäA êüÆk>­Oð}ÄN>dËÙɪÜùÈpÆÅÎ3ò„ pR#Y¬w—kx/ÈpïC›Ù±Ç|¬­h-aåøE†››„‡À‘›uåÙ×dØ}<ôµñÆ*;Ǥ÷úî3 ó뵸ÿeb¯þ§)Ëÿ¹?õß:\øg`óýóßc=Ð:?ys¿o þ…äw¯H~ÓÀ/$ß ¨oþÊ/¿šüµ[ƒ&Ä—o|Å U‘ØÓÑ<Žëo‡+9û „ôb¿þ2ÐýÀïšYKäs¤þ(~ _“Æ”stqp²ä£QéüÀÂw’#ÀõaC§/d•ç)•È%¸ç¹£cô ´è‹Š‰bi&­mÉGÍË]Iâ¼/†yîC_®ÞÝ8µÚ—€ õ Aâÿgïív,9’$M5ì}ÿwÜ›`ÝÅ,¦n*{¡?¦~âD2IVWW¬Á4ªÈ̈óãnn&*òI9ºõ1½[‘Œ^fw%¬N{.íôŒ{àHÙ-›ã¸ÔúÛâ©Ïµ +nQ¶ï¾%ó×Åô¯Ltüùÿ®d˜¨—ýçs·#ß 1Í‚1C£ó"+/=@ŸQ? ã5ô,i|ð±È«9ú![à€à ¶72)­vùÑ-¦¸ÜdgÄc!6e­o쭣߮GŸ\Çß->*ÆSO¡ÿ\`ñ½=u5=|jLùaï]UÉø>-Ú¡ƒUã§ `2a³*EÍŒö¬'-æc8ñÓ’ù™¨îc 1-Ÿk©-³¦ÆŽQ¦YÝu«b-Ø.îÀco·k]ä§-ÂCßÚù!ÇØa Žo}~Þ¸ƒÞÚº>l-kÜK5†¾®Øq5š-np_ë#‚ 0ríØí»qµ_ ‹”ã\°,Ü߀ãZ·Ö3Ÿ¨ºÖ‡}|ËGÛËÁÏ67¬ë"Ez|ó Ñh!P`”;¶o-\¨µ•ÚcEZ²45EØ$V¤‘·¾óÚᇵ֒·a1´uyŽ<žV¹¯5êéÃÇP«+Oaî+h¬—¹28&ß®˜ó¡*Ü#þo ÏúŽ G¥èÉþšZ’He-‘ؤÑ­Ï ³Ð‚x“½%¡çg戄‚U©";1¶#ãVvÙÚ’Ùrß®H©æÍôÛ6v€ÝÝHì [x‘0.ø.åcs‘5õ”C®rk;Ñ®Îľår[WÂÌ]®¥Y[M¬?°Œ{KØé],³g~KõMWÅ$kžôˆr+m¾¤M*„̬‘3¿µT†WMkp°f ù朲b‘£Að2¼í Ï§³ IDAT„ƒPÒò^[–Åæ,òº¬Ÿa®~^¡†l,‚Êò6"wKœ=*¿‹¦wFéí½w^dÛÏK4m SU·-oöð)w{—Þ0¬±:ºc–K1‰œ™Ç"¬ätåìCi…{èk6öá ØÁ¢šh•©|Ê£±46;b õÖtówRãä'îQ@ÉÈÀÞt&Ÿ¸«ªÇ‘é(ö6•y7«I•q«G²ˆ'^U­Útô˜´5WÓÏjI—u ¨Á…(’ðVuÃ"©{8h,ë·xÌññаua­±©_y=å–õã•gâ¢&Ú±v†Å„N ´C]Â.£.¦±Eù‰E'A`UIÅ ßÀój2(ãlõ¦¡[~짤·\θ}=ÆË^Fá°Ó¯C∙zØûs<ÆÏõcÕ³çu QÜ`¯6V‹A†ùKS@žeÐ(в¥€V4ùüTòŽŠ¤ÛÊàîì!ãIþ£r‰ÈL³k¤@ÆMîˆ/ú¤UÒ”ã&D™ÙÞ~«œ¡õEÅ}jø‹S•Αvjÿ)ŠÆ;u[mŠcH+äËŒ‚mÕW¿x°ùd=ZýàŸX%hëuݽ›<Š8?‡ÖGÍæ¸Q¼?œB_N½†èþp¤ÿ®/H‹CD²G[îhV )=BgßÃjM™}ÆÂ˜›” >­-×ÞÊ 6±ÏCpŸ¨‚¼Ï”5—LuÈ{s€‘ÙøyD«wRÕ¹¡8C¶‘­ÒPé«_Ü{4“ Iç u¸8±)²*zT ‰¢0R,x’rOo󡸾ÈwO½žÃÛŠ/õÑ tûÁEâ,é==¬µš…W)ë§Þ»ù½qùŸFíuPuÿOVâõSG6~ZBüŸÖ𯟼 ðïÑÀ›ñ÷$þ?ÐLñsúÿÛ›âWê²ùþ…ñý\ƒÛ7 €Ië/Aö(æÃòÿüŸx3LO³ï¯?ç«y¿$\´õž_K«5•Ï‘Cï>?{M6œl-«UÂ<Ëe–FIôÜÎ=ßlAt}} ùˆBÖU®¡úêܺێønx 7®ûö²Ë»œìÎ݇ý·º+M]Û½(ð`Æ„ (˜ÐcB‚sÆ+Öѱô —\ÅᔥœÍ=3#µP{5—ö"½S%ÀÑëÍÌOãÝœl%d™f¶¾#[:ìcÆ `ÙŠËÖ^…ñïÁáUw]à(;?Š2“½|*ÿ?ýc\":toW|Dý'bžÛ©ŽÊöÚ¥u»_Ib¡Uü¢5Tλ»ù"–Ù†èàevî5+ÕcˆÓý–îÔºy߯.­²}žæéìaJÞúÛ%*ý}áÕéÝ“„˜qšÊ½5Üwù§oøBÃÚtÉ$-[ø,…Å ËÓÏXxHž|„¿®°A¯[Ý»¬ê S¨Y¶b?¹,Œm{„§â-•dõºP%El‘·÷s/ù1^¹ïOIÐÅu‘ÿëÞ’ÌVj';ëÓcjôusxYG‚£å÷Æ+ÀÔJ7±ë٤ º7×ã)[혮LÀЋ{œ5ik…Ñ=HßgÄè*üÕÆ^× Ë¶Û¢nóK\¸†ë²kÙMø§}~îrúÚõa”¯ˆéûí[ì²·¹îÛ%é2{úm±›o$¹ƒÆ?¼Ê}ÓŸs(Š”’­13(ó³…”œë…µÖr˜¹ÜvU ÇçÁ<ìfQêñÈ÷zìÐí¾"”²$àn6™0ÒUˆÇ¢qEñïZÆMì½ëOdxߊâe\4`ßéÌ ÛrÜéjTpÅ–]—­íŸ·Ãa?ÖõqÙ‚h¦Û¢6Æc‹ÒêéfL÷O†Ä–¼–Ü^å<€@yGô›âŠï)·‡]=kqgÁå&›Ù–²HE‚éüxz ê¢Ñ,Šì©¶áó=¶æyœðœ¼šlËrÂÉÛ/§Ê+ì*çŠðŠš·Ç~†±Ðè | vX´M'ä®ß>·gH «ÿ–k–ÜÊ3ÓÔDZ€Ng‹Yà—Ù¬ïV=^ÊvjX@Ö§rXuÞÅì5.¥™œÐ¡—7ÀRÿ-xxI ‰¯¶|¹5 >T iTÚ—1wliÂCPÕ3piš.ÃIÏ!¬2gÇy«‹áMNyÈ_ÛeéˆYŸÊ¨Š˜¡äӜΤšÒF÷`1k®B«wwGŠÙÛ=l²rØ*pG—uVÂNS·~g]|o¦ªRSªjÍ¢ô0ëVDqR­ä¢|ˆá %l ¨ë¨"B”VÔO(ëÿuXC¯­ï‘ ñµ¸ÆgáN2Vîûó:vuUdsÔÎ>=eÜ,.9ŸÎ7WkõØ$«@èªèKªZ§|޼íÅ.«hB|p4î!9aFŠLé…vusqQcþ×A]y]dQVai3'’Å4ºjâÈC-Ô”¨²C™_Ù!X-°™&‰ÀFÀß³¡¹åúÒá&ú½%†"€/czg˜›¼Ðµ™õÊö‚)ì7Oo¦+bu\Ëî=ü½Â>¸w2™»Dœ–eaÖ¬J:ÆçTÏ÷*:˜nÅPŠÒ=ÎþRñÙûpVl5yO팃¨Wz°YMîtØife¯5³²¶iYç„pî !ìh/‹Çû²{ï ¿–½Ì!øîÙ sè räÔœ¨¢€8E¼}ónwSƒ‘:yo…¸ó<ÉÖ­V¬°—RDkº?²h§ 1¸ug^WOáO€Ê(ÀH ¶ä÷ßÐK߬Ú"{’‘ 2™ÜaÑ$Þ«ü\B"ÿlIŽ¥æ;s.³›‚û«o³o é Ö2Ư­°rß«:“Óíü6ÚåóÓÌZVþŽ 2&gö2ÆÙ®ðEYˆØw7ñJí§lå/\ˆ¹¼«[‚Oíh¦×|Oñw ‰;sÈõjH„~¬ÿV(<¿´Uþ¶H¾Z¦c”cfðSÉW˜`ÇnüæþÏÐßÿHƒÀ;Õù×^ƒ~â§þƒ¾wý‘¿ÎÿÀùÏløû?äÒ¸·~½Bûû¥åK=øÛ+ï/DZô2øS—ò‹„Í/óÑoï™Þ’ô[^½òΤèÃzÿEeO¯UïÌúØø@áµ–_&6¢Z¢ÙãÏÐ^ƒß±¡ØS‡<ÙÅf*öëWØ0ΨDînYeš»(z…óñØ0µ¶ 2zwEpÔÌ0òõ’f–ݪ·àîëº*¤ŸÚmja.^a„fk:Ÿ¬®ÆO”íí~~«\¾¢—«t’kÙÞ;Ý%†ß{û†"»zÖVÀÜ_ÆñL꼂÷Þå&IïÁb­%¾íââ±Ïå3æ  aeï¼Ne!ÕÅÜb»/­ØÌl¼+:½ ÑPŠsZMUËééöäÕ0n§„µ®Ê-Jîñ~à †G F‚x.¯±Á8,óÙÔ¥Ì-´l‘¥|ñCÃ:¾ÀÇ„áY›î‡C©2š×ås¦` ©žXgjG‡Ÿž —µ²“/7çÉ\É¡¯jµÚ/±y[©ØøI#ŸþioXT X*;×È¢^—qKÀµ Àå“ý¥¹¸0ñT».Òg”“ðÁð6ŠÖËÛºóÝ@ÀþXËVÎÆÒ<žT‘×k[øÙÍ®‹ü p îð ×ԉеC&ò2yž‡Zƒ‚ ß]³;~hxñºünËÖdS§ú_ÿ5_z¸niiCkÑhæ×Æçnm¹;3§€†ºü¸Qpk3Š^É¥¨˜ã–áWÒÄ\û³FpÅ@ÏCˆÎÙŽXg¹ÖYF¢q$2:¥>O¾*& ?ÌH @PÂ}äiÍt Üž–âÅ5¢Òñ¹IÚŽ{G+-/£[^§æóí¸»‰’–Y\D"–q-ö³Ðh^Ô[Àw@Æc%!®¸‹âÞÐÚÜ, º»Cû?®ÿø¸þ7¿Ý–“Â¥ÝÛ@˜G_0¶–S.ѵEɉ5ÊÔ“ÒS4yé\Ìû¢?12d³~J˜Ý~Ü[*‡Z¸£Å¤"N2ËÚ¡ëˆ%,Xúb«…¤¶«}øÖÀºYÍÆA›Ak•?Ú½JîŽe­í,À9–­? ?çø ‡])HQ œv…Ùn;–™심2š¬÷6t—ìf=Î4§ê&+šÇLá¹·êEÙ™·Ëa'‹ýÕâ™2§+ùý)9QÚ³Y¯G,yU°GÔª~BËjغk½©20Šyº;ÈwI¨ÕÚfלë`zvéx€ãÖôbåK®½‰Õ_åˆ4žï³âý]ئޒ%qb|)P˜5Ì&VWË…š.0‡j9Ú®«:I‰Qɼ¼óÙ*ŒÊ8…£Ÿ]§Ê¶”»¶2LO yø=ê9[¯ºÓ³ÁÅ\ÏrŽöàFЍ ^êCœÎ`ùÚ##(:k ‘©åŽ.¾¶×øÃEd„œO<+ça'î$bMºŠ†sÔA®2?ĈÀ[Þ”Š@u2U²>ƧE¼ìý’ÙS•0d þøÕ“Ä|D!°C×µéîróiÜt@Ç–lò¸ îc㌟O™Qj~+нzrÄf*nën%­5šUô<ûè!?Õ@]£Œ(÷î2íI9êëåR¬öá1›ŠÅÉkCØ¢I>§Û‹†7šÉÆw¶ž|‡…£…¨°™ç@IêúhŒ.k‰¢Çïqh‹CÍc-Ýîüt`5ï5X)æ[@ c9AÆÃ˜c&¯¼AæŸgð@ã~ça“unF]máÚ­Îg‘’[ìäêÎ=B;êŸiŽ@d½Éè¾§y”ª°êáu½û˜ÕðiXM’X™ý&wògFYXÙÂúNãåHkqCœGÍDÉùzN|tjÞ©Nëzã&(æ˜'®<…üø8æz´~O+ÚHÞŽÓqÚÁþ†ºÿÿ ?èˆp|§ÂñQË<“òO¿ë3~• ¤©ý1íàcAÒ;ï/¿Ó4ñÇ…õ™ôÊwA†_µÿû‹üWu{8ù÷þÀçÅß¹ô._ÂïTú—Œ‰þÚ•§_àÏ(yöþÎlàùçž×Lï9ù¼¼|»‚<ºyïä§â¯’Ñß½ò~ÀË=Lñ®Û {¤/¼ gò«xµ `¹±è¾D"¦ï~|¤™›&/cO½OekˆSãóõBUReåJ(ŠT‘z€Â‹E¶æ~ä}ö´E‚ÎÞ!•ymøú¥Qôp8LžeœdAò±¬iÕ<øÐ᳸6L:ñþÝã»¶ôIמ¾,˜µ3²2ÿcg^)=Ôfº+€º×7övß[v•ÿÁ÷d¢d‚ZžgÝF$¥·ìWAð¾÷}ùâB»ž•€¤4GÌ;½œ~ˆ÷£!©*“t"À·lM6üiP³j„ëLûU<'\ÙW)p ÎDgÌÈNêC®í»ON*¿æÛýO£¡Ã,v1[¢ƒ1hýxO³QDˆcCI Zº@,Ç>ù±1n2D‘«hÇ©8D÷:®n XHZ¾Y–¼eÀ\ n:g5€™áêYâöÄŠø—^-R!ug-ÀÅr¾ik¹üÞú@F¶?ÈE^?.\Ë.Û÷nñÉ÷&p­Ø··ä*›ãõ4Smè·Û“ ;n±ín;¬Û‹L‚ªBòd°w]æÑ0œ N€Ë®µ*ò@H‹Œêcàaú(¦%ºMæÜrsø:MâþÔÉŒëŽ3ƒk Â킸֢ {zˆQ²¼a™-[ d×Jæ¹Ì"D˜Ëµ£g”.ØŠrb*»¾Búñ»Î_Yô–[Ùo©Ï½MX¦k-,ó\ÄáräLÇ}<Â$ŠÖ·qi™á®ì/wïzMA;:j ;N¤Vìê˜ñ«Ú¹»ï½— N19H½ ØI³Nø=>÷†ãº®ßöî)gdÊÜuÙ²µ¸˜!ÃÓÆ,ÖÿëºR’oç²e6!Öa“”³ÚµF¡lÙ†YˆÝ-ÊÞÅ7*ìÌ©9Ï“ÊðNÈä!ØnÏêàe¶·#`HdFivb¡ŸîžéDYVŒŸªþÙÚÖ>×ÃÛwNðg‰·a…#±ìúUkI…ü+ÇZ1"M kGO9ø±,Äb}~nXÊ^¶àEbÃ)ΞY4õÖ“¶kS¹„$S•K9#ñM,š/J®…íñ)CDôl3‹…ï{WÖâÔ†°ÄÅv€SÒ> ËÀŠ'µN‚+\šA,ÆpáQ½§ãD©*OkpÌi‚)ä³§ù6›â«Q3eô}lüH@–M_rÆãY À]» ]‡d’ouÒ÷ö˜u»ìZ×zÍH„Iº¡b´…¼©ÙàÌRF»ç£`Ö˜¿-§èÙÿ¹Ž™—Yª€î×ZËR¯aÊàäê~G‚f·f³ûuS?÷Ô†DJ+2‚!§—´žävä—ÖskX,욺åäŠÙÛÊ xå¬Èàɯ÷ºñRË+Êw¦¹VÑSjûÛõ[jaŽòКR7Ä,`ÏIëe6· 5 WóOágLšcó4¸-{ ª[u=j›êg#xÕWž3Tç`MdßW·¬ˆ k¤c”ÕfaÊßõ´NAˆ¾íÒÖ0ŸŒ¢²Cz¥`»©‡ãDžó^¾åô;äÇÁ„è<9ZYÞ .h ¼Fƒ÷89 2T?„ 0tœ·†Áɳ#Ö•Õ?¡Wy!Vï3íëÇ6PûÚéÏþj ÊÅOÇY£®:ªÓúryãÃ!äþ8žk„!âŽá4ÂwâA>l4že`ç¢ÌÊ|gäSŒ¢'L^Çÿ‘F;nz®q5N¤L½«h ¾Ê…Å÷ª÷\‡YzÎãî¸À`4OœVÖO^ÍO‚%‰ýõ€ç l.—€'TÞï@xDí“é¢-šg@Å31às?ñõu¸W|üÉ&uwù{¬6¡]6€ªvCŽ/ZA®‰­²Æ¤S/Däª{›2”F®‹lJ8à³™¢ÿ–Çô,igèÊ“i_Œö/?pN¬€Žµ/Ο•qÞ {G½‚î6kšß³Õ`¾·g{¸žŽ3<ó…çSê3·&*yzêyµ@á,Ç[ö%VŒÖtÓm8¹_äø(·—©wE¨R«8xÖë³GkóüOלð29¬}ññÔåØÈÖ<@j¢atjî™ûì#:„h°%½s;cqöäðr°@½½UןFã^öYÈ„ø?[îÛ}¹$ßÕðét ÷laº¦‡-^› R©ÜÝo÷e/ôãÌ‚K ä²c—Hô·‘é†Àóð0ÌM ýQÞu|EÆæz †}úf«?"yûæºúœ¡ˆéòYnyÆq•Ùr¼kŒûž^‡TB%=ÆÍ X IÜÛ/~ì*àøÃÐÖÿõÿÝ×¢I eŠƒ.Q{+£)å? w—Pbz¹°ef˜ø¬–ÁÍr6„<óD^v˜Ú&-Á}_4³†5ËÚŽIQ¶êÁh—Ù}ã–.Ϻ-¯éÌ"]pßà‚ÙúqáÇZø?>°hë÷Ã#ïãÅ/ˆWl9öŒƒ¹ÃúV%\¤ï½7®ëzn8¸·X¶Â¤íÑÁÁø žýîîmšà¶è"”ö±„~ùÊ.wY©0#®Åí+ÌòîúÄ^Z·ºª IÄÞn¸}kû¾å©„w3^¨E‚¹¶w‹ºë{KZ—‘Qœ ¾±–­µöÞʛծ…yƒÔÙ:ðÇ{x”ö±) à˜A“¶è <ÂJfï|»$"Ž8+äBb-ã2¹bü°·Þ?ðù»-Ð[ZK§•@ð˜XÁrNwÉ·3ŽÁUîÝ(¦½äÀàæâ9 f1Šs7ÚÇúoùÆ­D.‹dU6¸¹Œ¸ÖJ)T‚îûŽ–Kp™-0†+Ìzô¶ž™qU}˜›-7ª¬APè¢{-³í¬R¯ O/µ¶¨½®µ–…°4ŠM‘;iœ•gfkYÌ<ÒÒWFNßÙgW »ä("ïÇ+âÇ(¯]NC\òWXôÒ‘‰S2ŽÐ9‘öù1ÚaÊ4É=#†lWï"V—»» ,„)ïQ«;󉌦ë–È£-^æ1"[‚‡=?]íñkÄŸSÐPóÅ7þ{iæIþí!Ù2•ÈKI/Iì¼L>Íí„Ø4¶ÁI”°±ù>’Æ*X7è%ÎÌ‚E•=EÝfÞ[‡¶a>NÞ*Ÿ± @'IA1€*¦v ˜=qL¯c^ $1QæC±>Šâ)S—‘I(Ç#¡zhHLQïèˆT‘djñ!W^‡Õ9|ˆIf™)Ð×.±ÒvXÚbFiÃJãí}í'zy¢3ÅRÄ~°4Öfy¯U,6>,¹IƒÜ’ßI2ýÒ¹£»¸^„,/«{áý¼èÒŠ`DgœÉBuOt™Ê`ÜÈ0B£ÌÉcþ¡H7Ùe1pÉ.ùǶXq¢B{Áe0]€À[Z…³n+wlY÷.LØîɱ‘¦•ÕtÕÜŠèt'péôÇ…4~cpJ“Ò­§‹ÇŸÎ£äCØý#Ï?ÌRöœÓ3…mN,ÒÛúžs;Àˆ•=Ƭ(¢ã*Ù0“–¥BÞÍ_#7U¤”1‡qi¦•”ûãGæiä%ão ÀŠüÌ.§îx"êgw›£º¼9íÑ·–Ï‘ïÌ­ûY<ú¨žÚNø ×Ϩ³*hp'N=j¡(»Ôàœ’{`1(öGŒ¦b‘/¨"ó²w‡ƒÖ¸§:ÖƒF—·Û£Àœç¸>f OçY1ãf_gŒÀùÇï¿g$ ßÁoýÒµª¯÷ñW©þW²/sÀç üu:ðdäuÀ»i#ߘ廽v ­\}¾Ÿ¼û^Áû_ÖÇI÷¬üm¦9ŸžFûc³è¬aíi$²ÉG p`Îýað×—>ßÜ£š¸>‹’AŸI-ö/íŸrÑ mÞ÷¬Žì÷ÑóÚ}çqr÷§Â©QXÛ,0ŒiþK«~Z«é5 ßBŸÕõhìu‚¹ ç'å{WRý¸ë|eKÌ9šqÉO•*tH,[ý5$†ü=YË2ædµ£+¶‹‡Ó͹a@ÌÿguÃsï é˜ÓÜZ?$DˆeýÁ¥9+Ž žˆfÙž¼„33Îè„ÜNM^è$àA…óxʤí` hÔañì€ZðäY–á ”ÕÈ ‰ŸfË Åp/õßw1uõÎñ0=€û ~€w:O™xàcQ⧦o ëém ‹Ã—hU#Þ¦œò0#¼‘é éñÙF®Õ¶™(ΤY…Q¬€ÕcÕXM¹¶Ëà;fDyÑ« µáÈŽ0±ã£¿®uMØ7¶ãj\ŽÔÞ™Çë¿øC—‘X ÀõaûÓ<ý^ˆ_ÞÒT¡7¬\d˲ÙÃAøîx`§ÑÑ#Þ³,¯‡ˆZ˜›~Eul[$ãpmÞGtÀ2».ÞŸîQª§÷%ì¬Y¼Œk‘‹÷§ß¾]ûÃLyÌ¿&^8W:wìÛm $W›ÝÄíðíŽÒ™ÃWX’ÝUGòøŸ)ņ /CGO‹ô±×=º·Ê—[a„‚Y¬@ð/˵ޠëZa«¦­À…¹«YK±2}XúžíZ!._´OmŸŸûóóÞîîÕ¡W#b7¯þiÕZQ–U™Ãó_:óc‰‹»gaaôwz`\Ñèžb› ÚÛc¾jå»-ùzpØë^ŒÎÙË–Q0n—ïµÇÎ…—ðèWåêç2í˜{¢xÕ1 ´‡ÑݳÔ8¨‡¬³òÉc™EaªyK9Ò„dFí²‹vEé;¸˜OÖ\ƒCÒHÑÛ’? ^ðöÚ*É|D IB«ÈF‡ǘ¾öcÑHÛeÇÎ1¶Õö&ùý)JWoòb²Q!º¼õ·Ô–ÊÃËÌOøÑ”B‚X‹’V¬y%º–@O™a»^£ìˆNW| e ÏúâvgUz}iÖ!|ö%å ÇÑO  ÁYì,1³oá…$žc\_ÞHWŤ4ïœÆU„èª×óA IDAT4K#€côÇñÕŽ':úÁ+QWSrų;›,ëuÄÀÚã KäÛ ‚lLƒèØO 2J”¬ŽNhx5ñ—i$õ|éMRÙ?Ž››µr±:0}«Õk1‹ªå0ž—MæfÖi‡>Ý+ÍBP–Ø@ÙqæhŽNê‰á5«QA‚ 4bמ¿ž +f9(ÅqcýlTú!Õ…¼ÄÈ'¥Bñ)#e øÓÎ!‰^L{Gý`n¹*qâ›¹ÇØ}ë©j8ŽÕz Îq²ÓÌ®ÈñØ3£d£2¹b“¹NÕ‚4¥J&b£ï׈8”)ÄñäÒ×e3ÒÑM€J|Æ'¬-ÄA&EÞÅ4šPÙÓ›5ÒöÐQ³v&þXõ£ ‚F» rx ô¹{§9œ ÚC>aÑZd.”þµ©ÚéATtE<ó<]ïcÈ 1O÷Í ó²ë’k„ï[æáãä@cK¼VÎZ”a’æN¤gä 6£Ø-ù;+ôâî({ûhc‹-šE€äL«Ü9Úžê xÂì«x©Ñ©Ë1~æq`ëÉ·ÁDªžÕ xxØÇñ®—ˆ˜ÉÇZÖˆ‡í²%ޱªÕ`N}Ák¶ë=Ü–Ѥó*'‰7¿èŠ·þ]7]Ö#¶aÕGçF›h;¡­'™ãí ?t÷NÝŠ ^…íÌ’¹n9…(<¸À^!Þˆ¦z"}øF¶#ù:ä×£wý,] §èzÈ?ž÷†pñdPÇÕþœ2¼ªƒSÄzãžMÏ_ðÏóþ¿± T óÏ¥~gNðsÿ>ÿ˜ †ÒÏkþÖûÿêØ„ß7Kÿ$ ï.å_¿£¾Ëè]2àY.ÀŸÑ}~ý_èµÂ÷‹ŽÿýEm½Û<ãÏïœ/ˆ²·})¼Ÿ³…#ï7˜ Ñ€ü¬+(‚˜›ÛÙw\'vÙÀ›Ë¥7N2aŸ¢Æ;Öл{‰¯áúd·½^ 8:kH*Ñ@3¾|qé@¯¬Fó““¾4üXÌfG Õå r‡cuAìÅsPýŽÞ[ÿЕŒQäåŸ{»ûÇÇ€¤÷Ÿ]"Æî'Þc JS2ïáP=ºqô¶ä1u¿4Ú =ü> 2£ãa>&Ö`Ëð¥>‘ưBâuQ•å>­y³Ä)‚ín¬{Ê`Î] Ü@ŸüÍÂY~¶”À‚µ Ùí[W{àÓ%Ñ¿S콜‡Ò[lã§ípgñ> ›Ndå¬ûS7M$ËóœY€üôeÄG^Eám3†‚Ìö.09ÛÄ lþ) ^13CàÊÖEyqà±SÇX°h eÝáƒ]„]F˜»oñʳ¨ØÇ3K–$ݾWõ"0\ÑÙX§C ö>±¡£Ùº »µ)zX‘øópru.çsGÏý’vl,8äו_ä]cÉ^Äŵ%®êyÉ>ÝÉuV¯w¸rNƒ—ÍWïBï9§]¼þaŸy†k¥Š¸¹µWNá0`|û&¯ÓÉ­e†ã:µ‹‚xGg©‰jéc *€EøÌ•'˜¼rÃG‚<éû»;Ñ03¯ò¼rœA¢¸RŽ'pÑ`ÚlÀ<­ és<ÐÜ]osùŠAf2ba R,cCŸ®W’ËŒ¶L·»¯Ë(^Y S]Mø%©škµü§öojk»X˜ï”ÊŒY€b!sSÉR—òÈ’Ièós»t]‹¹Wݾ}ËÝwDp™Ÿ^f¶µ#¡@ÝÕD_pïȲø[À½ÆmX©éä˜t{¦ù´+{4Aƒß;‘ÑòNaïß„Îræ†Î̲K†Ïñ·.®×Ê%¥Å2‹¹öç+ØZ‹…¸Ï‡2¹Ë„D‘1¹˜Í“8µz–B«´Uížõ¯+'±^…Ц74¡Úqç»°³¥o'éÀ–äÍÏ–4ˆN½èpÍÛa†*LØV$¢òThµ5¸žo]{}Ó§WêÔ1cÂÈC ¡w‹Ü¹(÷ KLô –W[C£3b‰HûR\ºÖâyhÀYmkÜ §?]Þƒ~Žþµ±âÅ”ƒY¨¬1lœ[ÏcvɨtÈúzlGõiÉò²3g ‚]ìCG,Ý¢ö£;ž™mcç‹^Å~Te(ÌÓ^mZF¸EeK Ù”[yÓÆøwT\ňDÏøìÜ÷<´ÆÅù¤èFª8Jl"ÖO6ÏËåO‚úúøŽ{ûï&¿ÒŒG¸àk(üý¾Û›©/µÅÏ‘_¾Q›£†ÚlÛó·õž$×èÚIIT:5t…®SZ©È —zpççä˜@Ú×ÉËMTË?øûCÙ/# ¦KK‡@¯V¼}V~¼ªÁå¸öü~;Nã°š†éÓŒf+úm]ûÇÇe4`ß÷žXzÕêÆ‹©¦„ÙId´ø “]H÷ÑÝÅS߆e´r]Y™8¬Í8õþ¼{Â4|ðL%û)öÍN±´¬×€†™Ûì2Æâ0µÙá„Ðv­‹)5ÖìF=?«¡@¢Ùq¢ÚZI‡¦SžùBýÏy@'‡ÃJ\Š~îvÁUmQ×k‰ÙÂpUÅ¥ìeZÕZ{ñê(óeÙÔy1¯ïN6xeìÿüŸÿï?bV”˜V§3ë? 7ó’‹u«NœÈCyMÓ¢ƒk]×ÇÅû–ÜQ4’ŠIÌ’Ñ+øöÛ ÄŠC×*Tya¹lÁ*2͸Ì21~Å©Çã0çN;™V³Ð_náú¼áŽð8—³2zŸ]ð7;õÇÙ$ÑjkññÐ[¸ÝY2hà)Â6hàE º*™Bk²~ã긷̆ Öús·ª1îÇ‚f†í$?.lñ–$ÿàeQG,d]1cv ¸”Hz­GÌÍ;m¼xbôAÏ /S !\º®}ßñYí:þ°ŸŒæôµ©Uî?C\ú´³ ~˜ê$8®…RöiMB#ÃÛ3<*¾¹åî~Á.[î»âíGÇ¿÷^Ðí~¥¨vÅD3@AåÎdp'I&½Ç.#äV¬‡¤4GŒ ;Hól)®u™í·;þåŽ++® —²„Cì6î[>zPò¤>Ì´.k}dàè?ÖZ×Úî{ïLŸìÍe³fö…ðP³F\fö¨‹­ÇE|ûvåm]Öæw{ßàÊ5W0«2>Á0›X´;ã:¸¶³a˺ú„…ή•€f’[š9E–RYiƒ–«r¥”¼xœ¸]ØÀ/QÍD—Y$Qî& ƒû0©YLf¹W…cØS{{‹‡zl;SùI+àP/ÃÒ—Âl–U"ãk)&lewKÇ7V)õˆƒ#¶&ûÄ`½AÏ}ìL¯4˜Äñìt¤a 8âGÚ­{UÌ=ÁLbèh¡ì'Ñ$Q)0puû3º²±.»ê»¦ æO\½­ @ŠàmL3AŒ‚ A…â {t7bàŽ0ÑÇ\êµõo­‘DªÄÞR¬ ñOÌþìÂn›{CÉ;AÔ'ÌKÔ¥®ÖØlTð²Ú¦#_–>…ÞŽ–šÝ&X——üO§K«KfÓ»|+ËUº3¦TJ-X,oW€¶båAOxÆç[€—ll&¯}êNÓüj2îAy²áaˆñd˜ w^×é!¾ë¬MµŸ6èŽgÍì“eÕuþì¹Gd4qa¥+'ÊÜ¥MpGÒŒ] üBÓñ|l 5…#°‰1òÂZº"‹uñhZe7!†ŒÄí<,¸Ëõ¢ ´o°Bm§qgsñ¥õy%òÜ’°C¯¨nõG—¡* µêX{p¼DU^¦÷Ø3B²¨q•Û0˜çRÜóŠô جò×®½.ñU3]àŸÉ©É¨¯ÛG½`6«éi3“ºS´Ü—Z¬úɆ:©}QÈrÙuRxßOôÛOçmLXæ?\3¡‘oÁk«Êi×ì4_fÊ=gG]ÈÞ³¹†Ã² R§øÕ½D9:SòíjìÀ çë Ú±ÜÅÕE;U SäqæHŽé4mãã'{.’ƒÝ€AÞy¨MB¨h6e¨Êq´ ë¡ç«Ši‡“5pGcçÓ¹šà­(X/ËJ¿Ò‰ªõâ„?µnœÓ®0‡}Kð!ËQ¯œŽóQ¨K †4uãù2ãx̨w3ýÄÿµb—ÑÏw¿ "ÿôoØ Ðé¿"üguxýW5ü=ø3_Ô7_ŸÑ™ŸðmÞ[øçxN¿7ø&HÔkŒ¾»Â~ù‹žóGì˜ï„øçÃí9XxmøÉ§8ësëèHÚ—&Þi ビÚ^l‰ÇÄúð »5¡AGñû€dü¦Yó¨üãMâ„×çç0Ê9÷Ûpu Ò%ƒ9<|‰fÑÔÕúu´Ü´@¢ÐÅiµ›„¢¡èy¹´®—çw9Ã;÷ÞOT]Ô„ !>û‡Ë!  ‰ùóÁ`Œ ’ÜîÑFµ®kÇþÚW£”p5DaùÝ”{/ô;õÅ&³bcgúÁË'jæÖÇx~Ý”ëî*»p/*Z áö(¡0ÖVâßÚÖ쌳ÁC beÁ³Ã*i3×É(—½ZÅ ‘™<*Õ'w«vÊ-{ R(Ø–Ær¬‚®"9DÂöífyZ5xªn 4r>lYÌ mußS! ëÊ÷½i\k%³¥¨«,Ofå ëÁ IKâyÏâCžF©ŽÅŽi^A^ 4·T¤W£Wîz·t¡2Ò(ée’‘ÛnÝ{oìË™ ²¢á¦þ°]æÀµ~,}®µ…eü0$¨›YF°çì07ê’Bªõß>ol¿® Þ0’“àrx°«°³$æ«Î´bÁÀëŠa mùòXUp­u-»Ì<njɎ‡´Ž |05ÝI–U© ûÜï‡>“Xd&jÇ3Ïä"?®µ.RŒbbf?¢m*²õwœ]nÝæ6èÒ0Ãã\¾¬óí*(­ö.vZ‹ ¤¨S¦ñ.»èéÌ â¶b¹Ž•,'Îñn–ãÕ°5ó¸O¸oåÐ/kW>̲´<Œwg˜7é‚ñºøiVð‡&¡æ'e nŠQI߯¾°ɃÔĨòöÜü§P¾VöÇø3™ìœza^[–ɤ¦„k\Øðûö„A˱™5Â]mw¬ÑQm¢l1)vò]H4{_,˜rFŽ?JUnѵB½â…•‡çêyŽïÞ帱c±òiݽ®cÊ]Ñê@Á,fÁmª¬¡¾•P½vŠË|ûZ«Í\Fz´P§—–w£/¦nÊ{>ù3j‡j1ÖpgÖ‚Ïñ¤ sk4íüzºj±jVW¦Jè¡ pÙ™æ·o<v9 >Ãí“È_ë  &X-[Žå;§ÑÞèÙ6Ôu¯Ã¤7ê Û£ïýÄS³àìhuÓ+zB lÃøð v}£N„ãÌ{êt,wt^EÄZoM°µ_5jÕK&u‹ ¢·.ŸK­w m!<šõ¼:;çý¹*AŒ“2htËI{@¤’¬êKº$Nd´”ŽÚnFÎÁäÃÎ R<» pÈ'‰˜ò^NQãs/›žúÂÊ7££ñÕ,¯€Ž‘e‚§™ó¥m­jÕÉH© V cNzó–óÜ (*¢M¡³¹ò'ZÆŠAÓë³:©ôfÕãh(*ý’?ÁÇ®ÞTòfÝćñ˜q¬#»{®IbÊY®å¹jàœð b`TǦNRGñ˜M=Hnˆ;ÝFÒ)–8VãiÑf+©9Cp·ïhÆŠšyxÒoõÙs¶’båæÔèiOt®ž1íS’qNjìZôRí<‚"QUSÁ ßgZUŒÈ°4ëPÎb³–Ü?ÂÖÒÞ(ˆÑ)—öôÛ@Z¹\ÅP±È¹zZz˜N¶ ÍÈ{6{÷âl Œ§_ OEÑ6AïÄK Ôç´Sâ¶kôXìäÓ·c!S]¼žæ>W[?»wƒ§BÙ½ç¼zÌøzEcsµWx ‰碚­xl-6ºvTWo ¨ØNwCïFUí³Ú¹¢5êudwù™B–8Þ–ŽÈÕ89‰ROÞpc‡8“9Ç—^ _%íR#Ôb­gKÈ)ï$,û«}Üuè²|• N¯oÿ-# oà”¬à¸³HÇfX×5Ç`¤Å˜ ù\<&~Ÿïf §ÔöP¸O±ÿ §gT1ê žÖ—3{L8xZ”Ÿi U²ƒ¿§Åµ’mgâ OamƾӪõÏw4rû^úÿé`á/ÐM•þ׳w~÷7þÌ~Nú[üÿË”ßUöŸàkeÇkt¯Ý0¯F¿vñ}N€¿nåûŽ¿„–&1¿G ï†|™Ÿð œåìQ'ü¦^`†”AkƒB³è_ßÿK[ñ‰*xïÍ:nâ"ÛËK)Qxª¯­·;½­ÉTzwû˜ àuž0á u>‹ºÕÎý¬¥MËžQI;Á­}%R—êå‡èåêJ6zékF³µh‡®ÛC3ô•ìO„UáRþX?ýKq4õ#{ûÀgê¼>m¹ia .ÃgþØ9üHf*ó¥]:a¦AI³Eó‡G(ÿ}´¼Éìîuô³£éDÑ›»•Ç;X±ô°(zw´US¾±ÊœjíáÚ vS(žN 4€{R>Ãm¿r}ÉÏt5ƒÐÑøÁPnr‚à´k™¶ï6˜Q5&m'’Ô]¶1ëìŠ4üYgB~Œ0ÇZº2]PB¤í]b[¿Ý]Bd–ñ¦›EvT ¿—ôCÄŽÕEó8è³=ªq" Tyé/¥ÌŽÞòÀÑÔI v§7 ´EHØñ«»ÆUDéJŠÏ¡¥à¢É¤…ËÎîØ¸àÁl(üE$´ÖðèRÂ}ß03ã]ër Zãóˆ~± !x9ã‰ÿ[Î:¯À6š¸ÀMš}\öñ±êÄ Ë QÎÃuF®l½Ž7x‘aïÅ.œUNïÎ=½¹èé“¶~ó};>>ìÇÇGèPÑðÙ’é°#bT  »’]a@üÒ• ½EJ n©•1ÝÂݦ¸§†BA ø”"Qذ°Ø[´€nºD.Æ·}Æ{{#ƒ?o%sª<_VM– Ýi`'‰µr,bd4.F5µ»xÑ–AÚ®µÖ¢-ûüÜD¨Üê{mÇ0r£ía­Ìw¸ÈK,/€Ý­1@P·ªèk™o?þƒ:‘æcÒÄA/y¬ˆe2= ‚î}ׄ¿ ÌtiÖLáœîâ/ãB?ØD”f)qtpùªŸu…tÞоæþ¸ä¥jÌѼÖÁ$%¼ßT ép )Z¨=÷Z!ýY!ù=#Û<~œ9V³1Q]Âé'OA}Þü=¡ëÛ´¬|­KS?áS¢l|ÒDÕ¤Lô¨´ˆëaa?Lâã©oSÕ½#‡cÉ/ øFD=u}8êw"ßôB8½v“;$ÿ‰¥u¼ú-5O~Sô¦ªL͇^èª=ñ,žhWâùíéàÛp*yºG*øZÝVÚ8®r•¢4®ï®ÓòæíO"ß™8=¬¤y‚_açöŽ™<ÏôÐ||²gœBhjø-Í´ÛíÅçzn¾Àí©³%z•`‰‰šù¢sã¾±êâq4k?Ñ韔o Çþ …Àz#"ë×`ûú}õßRœÖ¯"ø·M|óE¼AFýýŸŸ»ø¾äÍ•Í_ÿfø‡_ÆklçµþñÚT@þ ëÚk ðû0ßå¿öûÑ„ÐUMß·O ß%®|u”NLQþ݈Fúòw‡ÕZ¹9zóUØÛÛÇU>_L€‘Ù ¹)õZí"cÓì䪄r‡¬wViÅ8õ·íÌ= ž—‰Éôì›Ù–­òxHÝ2TØeöZÙÖ»–áÀsÔ¸ÛRøòmZY1ŽTaܻϕÚ{hÃÌî;üž˜$¢áÇïCúi.xäN‰œbnÑ^EuÇg™_ÜÝŠRnÅ\Nٵ辒Ø ¢r P½ùª6BÆM2ÇöhæÀÕŠ¼ÍwÙé–£­eì៙®›Úzˆö£ÿ¸µ^C$3¥(c‘lÎ2ù"Ýèwü,›¡›þ±tÈ×Pó2W†Ë-bïe£^fk±X¬ŸÛe0³ÅÿýÛŽéÆ Új}<+AS <³Øÿÿ÷ÿ:_"0ûÔºêU‹m—*ëÊ“È_Üp—¯B°\HgÓÚ¾·ç½îÀ†?]ÀíaäÍÿñÑkH   irÝÂGÏk±º³£°^ Ž×1È:«—_'¥ÓžªÅVêíeQŽ_€W~G–§qa…®jÙéwR¬äv)%ËT  `ĬªôKÂ.Èë–°ã`i?Ö%ù§û£Üª;¾÷¨¤ÒWɦ-¬¸m Áô ,–$éÞ¢Üègð;Æ_a8óü4žþ#V£Ý8WÐòº¶VZCÀõ!„’CO%îüiZV%à9ˆ±“ìpÁDÃN^—¥OOéaÓž-Ù°Ï7!¨±DÙæzº`P¥Ã6fëÃÅ'r*Ò©“`»Ê®„Ù8;,éì@RC×Ú[çC?üY}µEöä¢WY^;\ë"TÓï4ÉÿÏN`¨óL®ÙX=A¸#tÞŒÕÎ\ÁzM'ÙáÔßêàP̲£lñÌ×'H ³Éå„kp]ý/NÒ'Z]"]#ßña×|å”-ŒöŽ.'ïç4Ÿ>Kõ•¼Pÿà<&ß«„ÄRÏ[9pfðòòsõ3Rßxœùça÷ÿÙnìÿ)øß%—ð÷þ•ל~á’Зj ¾Ÿ–ýÂMø2IÐûî¯ø{¾üýìÎùÖÈ?günv¤øæ·…NRª±·gá~½‡•;ÿIÝá‹{é1œø2ÖÌ|òOçU\§—Ž7t¸—ÁÀ£—û7_â5ùÑ+ylÝvÿyÐg$VÚ»âÞéó¹iHLË–ũޱ€eQL¹¦WªÀ²LÝŸµ_Ñó«ÖAü?÷'SÜ¢vVÏ…á©È€aTäÞ{G#–;×u&¶uvä±^yC„MQñÕ¤ÎdõJ}¬Œ7­Œ|„Usf«S–H_ÿ±¿hñ9ÿhìêo7«œ{c-lÕ‚ŒfÄîÈÖg|äŒf335(3Å$«Ò÷Ïö2D­åi2/óYXŸ6àò%ƒ]IÔË-Ê â‡Q¹Ýe¾·€ÛÝýnЀoh WäNÔ3hJ×—ÇI:4¦r[Þk1²‹F»?7:[´àe¶ÊÜ3A|\–Fý7xÇÀåcFS¾“ädì]‡€:’ ©â1Eíé9„òåùqE<ÉÆÞÚ²ÓLf¸÷tii rßÅ×…KÿðˆžÔ Ny@ì1“l#±Ä¬j´ä# ä² Œ ÞTù½Ç« ·l2‡ûÒôŇ¡9æ<~¼_îp¸vÔc˜mºTð¨è“NÜ àÒÖ¢ï^ømqv‚%OÀ%Ý·›éºlË}Çk }¯rïUý—šNÐv%æ Í”°EÚµ.æ‡+׎Çe„«fYBeut{"VåívO @2D¨ÊŒ2XÔüzB‡|GÏmú÷Ý«Ëæ¶&Åbô†½ã„ +ÈLU–+a]Ái3ƒnݾ÷µ~غîÏ,ÓÞº·Û½c`GÈŒkàDì=pFåÊž]q'é‚Ýmß<Åž­‹2èB^Æ»êG­$JY•XƒZöëÊy cœÝ<ßä‹ÕŠŠTY¸½V>•›"ŸS/J@<s¥¶ÕË­œü‘œž"вÕuÉ6Ù®RâyãrãÀÚ$í]0øVûÛ6¤ŒœRrÉÊÞßLíq(ÏëEyi¤†Ø#eIº#¹s8¦Ò£‰ÆºàžŠwi ¨_Jà“âP€òø½öÉóyìïGƒÓA/3+ñ†‹šöÿ·65[vï½÷¶ô†W"Ôq;ÁJ¤™ˆº¶‹ŠÎ›xp­£‹(ÅŒóp`4•xyâ[{švPÊUÑ`€3Mžx©"²ùé÷î.ÚVÔA§š¼9ÐRöxó¤@~É —— gRŠ”º_ªêžê½cA§ˆ ç΄ËäXß,»5Øìê–áFUè®&S‡xÚx³±‰À2s÷Í„cÀY*n7F"PfÙ|Á®}=ùÒ‹ÛîŽp#>rѲžòsMLk£X…Ú`¤ ¶”7µ2£ŽØŒE³¼ªð®7Æ B¦ÕG=Ú†Uχ§šÛ/?äˬ"­z‘Âoñµ6‚ßÉß‹ÞÓñ„Çuû0-çqÇØýŸ–å¶Ê¨F~®Cçì³æ,¯¦Ò;/±ÍM5UǨm RQrIãïí'fô¢Cî7«š·h€Õ fٌСôXÔ·i=s¬)oé XY¤ÐøˆÀ´M¿£i12B¬›ZU°Ò¸ó·•L{Åjr—‘é!ÚêáŒ+øÕ¤<ÁÍÛ¯›¨BEÒX+®ä5;õçÏ#âÐ2tôÌöÂOƒÙ±Lè' Gú£D°‰Ç§ç>Š :®4<i”çiAmÊŽÊmUëŸ.Å:ŠuñA7˜myóÅ¥*z 'ø 1<ìîé9ä‘hò+èbµ«Tr.·ã9ÅRÂÄwÅ×x¿³Aªó˜/®×'µ¸~¾=û‘U±ž’‰Ù5ñè4‹¨ŸSž¯â 6³|¤T¢°EŸDVަúg›ô$ä8â ,úsBw®¾_@áŸø’xmè¶Ë·s ã,_¾Ž?©™ÿŠUýßÍþ­Pù§:“ÿI-Ë5Ðúu Ð÷jñßÿùýïê«Ð¯·bú¯|À/^þ—V¯–þß è'%ØúR ûå¯óM'pqÿôÒ£ûå-à-¾ÏâÇ›é_~ÇN¢E¤fõä £Ùù|:þvñ ª:ߣ¶òÍ-ýÒHܧ;ù<±V®y¼»/Ó@—»Â3ÜÿÁ%¬Õ.³PÌCÙ7i—ŽŸæž¢¶ž²ßþÅ/M¿sÝþŒe#kʺö¤öŸ,¬×³ËªV²b¬UÄÚmnÇ{Ži­Ðqì×cF~Þ÷Þ{ûöYI¬nfÓÈ{¯Öô`¦UcnøóÓ'DPÍPdÅÇI{ìrå¦ •Øo"\·¢´÷îÞ÷ bÊ‘\¼ªòn~®Æ‹m¶Ã×°øð MÁu?yò~%’—ÙçàÖ-‹I錀7VÈ$ÜÛm™-³Pjš,fUÝê2;DáZ3*ÅúY@ß1$uO=,Y ù4¸?MuG¿:]~ßNâ ÕÛórÛ.0\ÿ0[ë#à3÷¾o÷åöCM{OSh •‡ã.Õ(¢ü‡aL ³Ð4&7<Ç›…xçã¬Ùòã@4 D/tiûŒ;=Å­3äe”(÷-‡s­ì"¥™eë¬Ü1Ãy$ÖZ÷ÞÙìxÜ}JôUh¯ß"³æ¡ƒ*ŽROOuÎê±âçb?£1¡?´Z]ŒšåF*œœ'b£Ü5‰äidX®No´t 'fÕ§ˆEÓ:Õ¹£˜0åoâ4Gðãu ü|÷„1i`U(Ró¸C®gQûâ°? ï½1ààwã`È(«®‡-[k9Ìr[áH»q*º`1êž½çÍØ@Ù–UZ4!é×QëÛ×Ú…±˜€ Ò°3©“ŸPÝ¡ÝÈSŸ¡¹œUÏÇȺ#3q7ƶ«±ÌyòòÔ$^¯·¹níÞ[³fÔÑ­?qKl­Hìÿ/ˆ[Iy#öV«U΀®´y½ :}°Úi8wÌýãèc§dðí0 `G¦úbv_ÂΖ¯Ø.«‘õ1zòÓä©ÑX›øL¬FÎ^É‹M«YJýú!},u}vòª»ˆ> ŸõÔ÷š¹Ù‰üv½0ü÷¢œE[ð¼ L«¿YfyZbªM̂֊¢Pg"¨XªôU<ÿ§9´Õ:^8—N}ÄÇ´ugU³ÅY.ó'dŒ+éG– ­y–³šÔ£;«¦é¨ÎRì'gV-‡ éd>俏."q‚Ü\ä£KýÇÎ~÷Dp«â˜ ªŽ/Åu»Å^G²&Í3.p»¯•ë ÕFþC ï>\åí/¦f˜¦Í¯5]&Ij1¿]:¨Ä1ÌFÆÑa´¶r~Œ®—q-CÀgܾFìj'SA(Îq.w5ùGÖZ“Ï“‡ 5Ͷ½Vÿ5§.!áYµËzº)¾ûñ<šÿø_9ùÁ£Éç8Åå®íûº>>®ë·µöÞûˆÿ}öò@…Ö|3\Îr¿v[An‘Ë·—n„³´‰Ý5÷´ÉnM)¬²“}nOÑi*ÂœŽ¬ežùs¥ò\…›m,‰BΗR„Œô¾|s‡ýar⯯ì€à|:ÜúÌZîžqÛ“OÿKÅ#i0š'ÔÃý¯còËéY%Z£ÈkeK+(°èE­Â¸“ÒRÉ [ðå7ùÀ®Ë³âàÑ HÎÃZ©=ŸåñΙ2Ñ:£ oDó0–‰êæâ*ÍH¾ñ¹øçÞ¾[~12LÔĪSXÀÏséZí‰!±£¾Ñ {sˆªvèc¶»»JÕmÐØÌ˜•mub»L¯Ý$i¾Ãv-óø±[X £õ–c$}þæ„>£Ó59õ¡£m¹mãdÅ…SŸpWB ‚ê)@ÛH,[ÝfÍ@JâÒv™»ïŒ±ÃÒúaI¥X9L´pÆU,E’f΃7¸ KUÖy$hwhîö€Kì"“h£2SÆ5µÃåX7ª£ío'ÁÏ·sB÷ÆŽÁ™Î:"zÀO‘£Îì´\Œà–|;ä\¦„ÍÐy®ÊanÝ1œ7YœÝ½ðkv^!n%½5þÆÝC|¾®õã?~|˜ úÇ?þqï½#73™$ý‚à޾˻OcTÆunÜ›®Ú“-Þ ‘„ž8e–XF» ùiÇ&4?þj6¨-Õµë²k]ˆë[ž£ Ö›à–ëPÿ‹Œ¦HÑ’¡*d 3oëÚ¡oÚJZ}d3ÅÓí”8[[ÎÃû‘¨ÞHjÉÛçñ×–áØÍK`ˆ×•-~žÞ©ílðª!V†äìÔ¤M’Ø[1~ØîÚîÀe F3kdD|84ëªF%Ï0›×{š±# ˜‹’³Ó––éÀ“%® WD¿­»mætkDaÅ*×”¢ÛÏóT^»c{¾ça5Þ¡Øàiç½b9%/¡3c(˜u…„Z¿–f(]ܡH‚²dðÀh6Ê5ÊœŽ\dµÙª.ì²ðˆ˜ 9’ÈåRŽ=R¸UÆráŠqåè8Íš 6x‰²”§ªLög†OTŠ÷Æ"ë#“W/e¦)œ–  Í‘U¶ Öîþ¸g!ÙJ2â íìVgÊUÞ;O:1‘p5!À¨àð—¿(˜õ5ýjǘäE–ëÚTç^Zy9þqœ:ˆJÞÙCÉ ×¶†¤‡U»½O¢içü§„£W·ú¿’8•¥ërGä| ¥ÉOØ[v”ä<1v'$¢ÎZƒí³+"GaɾJà>‡}šÝRÏùaÍŸIù`je¶¥cÊþ™³Þ!ìñÛqúëù» Ú?¨þé7’_ ×øZÕd×ð/3þómøð· ülX󯑖ÿªŸÄÿ[òÿ·Œøk&~œáëÍW8/üä·üìÔ<…ú_=sð>·è^¥ÉÜç[QίÝC d _‚&Ç_åM·ç¡oÖ“S;(p<[Ï×ó:¨P>‡Êzbˆ*‚ÐU@DaÙ¡¹²ðV^ÖÎÃ×n^”äœL¯Kº–šíFÉK~g¹Ñ´ÃËpÈÇóû  xµÂ§çtt_m¾ÍÈTÀò$ªO8ä‚òdñãÝ,,—{â\cñ @ÕÕBa©–Ê6fæÑ.ôRýçœkâ3k-çÀä>ç…Î÷¶æa7w®! ^ºÜ|w‡Z“F èŠ]Ž33à<¾ûº» p­Ø´"øéEU(hTñçA5F¿j È5>e,›:§D ±sc ¡jõ®½²j |Ã(Gƒif7ðÍ)9a’îó,@>åÆõ1‚Èwð¿rŸÙÿuAôÂÿûÏÓÞ3Ó™[«ü›Ã"*Î"˜I-ÏG`¨=•îÏ•®5–çî¾}»ÃÄsxK5„«í&©5%Ó¨þ‰ãº¹Û/á¥^ïš·*O ØÞb¼Õ¾mÝ~õiöhq5÷Éœ­Oû¾Mß_´o§.™™¨R3ÆDª×ÂÓ¸·AŒrAp)¼SUÉM¯)>FÜ^UéL'l@¶Ý"×ež0«ïr™ÆTD®K¡*~c#oãc[nG(»iÆ;k8‰ìA÷©-v› E/ÏíÐE}^ª€Üv;hYåæy…Ô>°Md»ÞFÇ\ª¥>’·fNY×åÛ,\4MßwÍ×ÊÀ¼93\P69òÅûiɵ~–Põ¨–¬G–HšÙ­ (i«sŠDÀÜ{ßÛ/䞊oštåd”" ÞÎì[g3»Ÿ·ªúP@¼@˜Ø2U0nÚÞ›ÐÃæõÎ~7_Š¥²»c ÄÏg}T"HƒÖs] YjV%©0–SÛ!N*ºTè3@Ö}Ó3fö¼oº^—û²¯`tÁ†óš€¿L·Ð¢ºYü,‰VIi‡eŒSz”J'`X\é96âÒ˜{/Ò²bPÂUˆ%²5$.wÊy½-[m"5¸f+ªqFŠp²-¤@éĽZJ¥~VkŽôšdœa‘5R€%¹Àµªì'š™/.Xþ¦ã!¢Ù'¯Z$xëLÜwôò` INщ%œ4f¹Öb*KÄLk66èåÙ₺…98Å-Œð’ÿ•JÛ2(S͉ŒMÞ%B¹ ÈQXiûEuS`hÚ<fGˆ«Í–üu×”W QLZNqÍ¡^q”n¼™L€ì#s—øÃˆbºQB¼E£ß6Û%Rh¨ ¡'–˲Á É^h”ÛbDï2‘ãð­ZŠtAUJôAAýËS¡ˆt‡Ï7Th]èÐú¬ŒÕ¬Ðã±Xiߣ¹šGç´Œœàfrjráã"c©¬4†Ã:'Ù®wm‘zlR8D•‰ÏßO_=°Eô8¸6ô©ZÉ×é ÊòH£¿ƒ`ùÝž†è ÁY®ÞkçY)3ÝL#Wä˜XÚ—ßÅã¬Ðä´t=È0ˆ "¢{WªrÝq—†’Œ)9±zÑ8ó·á@üX\™Ãë2PÌÚ£‡¢+Ú ¾n†Q• ©’2t-V†8Yß+Ñ«µ'ˆNäi†¤*&¡í(gÉ|È4‰Û˜ÈM‹k­ëË_bñ—hÉ‘š°~,­)g¥J$íAEê9‚l,j~LìÆpD‰æ hÄâ9 ½Gol†AÒo‘Ó£Dž5ýÊ2V¤/1åóÕ–óÓI VѪš¥ êl~ëmÓžL™þôß1ÄÀù nÚÃ}'åC*’ I­íRtÎ[=ßÇUãë( x! £Â9'lj¿ô0I¤«ÌFÕ‡ŒùE= Mj\j‡^4ûí¥Ð`xAÓÍ´yX>HjŠ0£¹¤9Ñö–ÐÜZ«Àã&ꪜ¹ð­5—ï” Vî$ÎðjŽF?mýlÀá=mðøñ}pujp±þÁ¯¨Ü¹ ­ï|Çy|Ý@ú"ò‡zâ‡@Ï:8´³’¹øfDÖqÿY/úßÄ<ÿ –ß÷Žøoœ¸Cì' ügðgŽ0Þ+v¿–à_@¯‚Ö¯ŒiðuèfLC¿šàMb'Þìÿ_w_ôBBf@ë±1Y7_‡!¦ ^á}ù˜38>½“÷A%Ç`¢fÇ·¤+Üg ÜûÃÏ2XC}pø (ôe¼Â—ÍÄ…cÌÂO¦ÛmÓGãE»t§tpvkK??]uÇ"ëʨ€o[|þË%f¿eýE’÷¨å ¼O‰Ë¹Éúþ1QqG)üe'£wÔ"V‹À¨,ìÈ4µ¡±0ñD¯f]¢ "‚"òи¨á»d+iͺóð(í: sCu õsÞMÙ‡®CMbÛµV:›ÌÝUªÑçîKf©’¶t[ÕÂW‚šù<¼Ë7õÁO•ÁM­‚åÉËl$ó(¼ß2ÀêÉï…<žæÀpá¹J«¥ûåjΙõSeK•R¤ÓV¬ÕÞÛ½³øÎr .BÚܲ$°¤á+@ûµý}=ÕòRe˜Š1¡3"“n¢™Ø]h=a²14pã`~7£xá–ûÂCWÜ 6@ábÕ=JüØ^^ªˆÜôRb¡Q)rADn3Þä–k2¡,.‹F?Þu|å–'·ŸúÏmJ½.Þ¤?cñ„`9a©s¨®%rGc‡,¿fÜöWpúÂŽ(QÊxVàRPtËÞß4uIsì}Žè_ ãŬÂN¶!ªzyy¸·8Þh›Ï-Ke¹’xV!ÀÍ «{½ ýòK¨LùòT%]çW‰fq Ò¥¶å6G!éµÔDÖÃ˹÷½íÞ;¦bWd|Ôä¦ð‘ÕÐq©ÒGP…Qž·{Ç¡ê;MŸ±RIQ,8(•¸ãF¹÷Ímv-Í>vßPB;\ÀnÞ&*.k« o³Áõx¬o×·Uí·ïðž(–Û«r·Tè8¡Ñ4jJÔl ©ƒV7ùz„-\kéóÞÿüïíÒÔM ·Ñ~û.k=TñÀZD]öm›â·ì+÷ løC³Ç¥Ñøè]rñÌÐQ“ÓFmé£àƒð‹¼A ¤R(· JB–fÓƒ9ŠœâÄÒ†WRCAª%mVíul&)Ã^«¦!Áýó4ÒcMš¦]ˆŠn'{˜µ¢XbP¹lG"'€N€RèÝF=“YºŠ«YÓ˜ùV}ùE³ø²2‡‡¤°¹Ö¢s÷…K(0«D‡Hü´9=TȧV™Üý‚²¸ UHoNS·Ûi ­CkÏÀ[ŸO2û*¸SѪ(¿É(L5 6® ²ÓUÊÔjÞŒN_ïXLž`®ƒ+cs|péÖqò¶el/ŽÈ6õQ»K‰ ñyH ¾â"âcÆ\N[”­Çɲ…2º¤Ÿ>›Ï=o¤IaaE”n’ˆ#-Âû$QdÔ!/øbb`Õ€ “%v Tåi#{ ±œ¿qêZãFÈvg)—+žÃZMaR¸Î˜i5#]iEëB]ù1«¨7‚Vñ87~2c»õ™ùÌÓÿtIšÛ3ôerje_bè+º…ý IDATpÛ>º¶Í21Ž˜kG×iõ‹ ¨+`Z}ngem¦Ì<]tô õ ¯[RZÖ»¾ VífAU˜84œÅ~èqF¤i=#åK˜J“ˆzKÒðb:¦ËþÎõõºŽFóÜÚ#›/Škb R³H(:T6½UÃFÿy¶R[¬Ÿ£€ Ô¥ã#!!{½PÞJ k.\³9Jå¸dˆ”Ñ*Òl™ÃAï§ë‹…ñ%3ÔÆF)7T}]N¿ê_TfCñá°óM«æ³:<à©D©ê[V s>Ft°nZN?£á$ª¡…zªAVÁ¸…Y9ü²­ù´„Çò‚µò_Ön}3…Š’Fµˆ´@kò+2;oQ}í„?÷Ì{”(“á¯ɽHeÄ«Eοí$|aÅbLî_>j–y ˜J©Ï¡qèóü¤óƒ>W˜²aj3AŸ ¯?{êb¯Áº‰ÙïÿþÕwð4¥Ïžþ•smú{$ê?AÖ‘ƒýC?1`1Žù[ËØgÈä×àQÿ±ÿŸâ/|â{¾<Ò_•à‹³_‘>OÓX\÷ûþhš÷&!â½x‘û„:^ø諃ìåî„·Ãÿ¥Rÿ‚ ÿ8yè[Û¬ˆ™Øà8š!úéð«ƒC7ø¿Í¦Èï’«v‘Q¦*Ã%-Ù—(+jVu‘·飼´iËE›AKüÃs=›Ž×j4˜ím´0õkò£ 0XÛÌøfDþ⡱b,tXŽ…ú¥î Yk¹pï«dK%M2Ðî+¡q¤6¨êÀÜr{dR ¥Z邬>R5ÒöVÕµVÀrÃ|m¹TK² VK*.³ªíXNšX êm¥°·Ãkíü‰º‚²M¨»Zn#-ø'‘t²op# Ÿ“¦5pÞ!"yÙ  DÜw\[Ô€£æKÕâ°J5ù õå‚p*7„²²Â®6F[Þ¿›Ð(ÂU¾‚ÛµT³tQèýŠh@I]ë[©v+Ë®±Úz¶(õ–Ù]Ì)ùk­‡Ã Õ)å•´%„šPcÃ7N0‰4ªe:¶ «é]±ñâ(¶cŠðŠª,íò6Z­±Å¯#è‘w‡NÚn“oÊÍ;ÓÝUæ€7HowYºr{ÍÃâjC 3| áÕ⢨bY÷Ü”+?jÏ ¸(íù}/ŽƒuEå¤Ü7¹E\×}IB×%â½¥ ì…õ^>B¤ùûqç¢*K@k• ¨è-Ûh{!ªvKxš;RF®/è-©9Jg_n㲪¸ ŒŽÑ=C9ŽÍáBŠûÑÍ7ŸŠŽu¿§O×ÂZºJuõy¸‹¾J`KDä¹Íe*]AØ eAاò†#ªØU›Ër1Ãn¸¿[}MÄ(ÎN!C-u+©ª~Sw¶+9Å!ÓÈ61Û뺜rŸG6¹ÌnïíõñØ}ÇD•{ûÏ[àÜâ*=Á€¡D;=¹tiļVœñXPCdEj‡fÀ°ïû~~¿m›* ušßFQ¤^"P,Y ÏÛBnsFލ®Ĩڧ㋲iêVLV›87ªV:ªñ!äl5£ÞŒ˜‡Lº ¼ÛIˆ?k­4‹î½ FQôð5`ª-”c@«ššn/(²ÈDz_s-95ü—‚A¤#]4ô_.gDÞÒ"‡Ë4˜V6}†ñ`È›ª+Y‹ , B<{%˜ ö;¢×e—h<ÖZ ’ ozBœ}f6|â XëŽ@zTÚÏ>þKà]+É êî4;üDèñ²¤ð™ì’’LdÄõÔWL/­e ¤è‰5AÉPjšßܰ;žtÅ‘RõöîRTƒ­×19?ŒÉ_ªàiÙDü¤Ú¥WÆ@>¾­*PùĶÁfk’&È™H%sJâ@~öߤ™#É‚6]­ˆ‚!“.næxÀbü¸çŒ!ÅJÆÐˆ%‹Ñ[p™ð/9ŽDȵN9¦P¨›b÷À¾xîT ÷R ®L|m¨€äL£S288:}–h¿ß/П˜""rõPWù¢Øæ™Ü¢©%mDr¢h:%Z¦Á(1YÀÂHùöÊ1#¡o6õ ¹ûŽ‹Áå¬wéEhYå*áNQJ£þxë±Q±ÂVtG¼5-ê½ ÄY+É*>Kñ,Ûðá‘®?‘BØõv®{Äû„‘¬%².Ø®ÆqÆ…Ç<×8ûtûŠªˆáTg¦Õ7h^¿ƒ˜»a*å~)jðíƒZåµ,¹”e–»'ßPÂÁÝŒ®‚æYÔ ûûª½º†ƒKKüï[«V]+#˜=²’ÝE^ÉÑè!O7ÍÀ`Ýú"#./Q߬\ÕèŒn!·‰Ž8Ý¡‰YÀHT­xj³%ƒƒ%ÈqÒ×îUïÒ‘«î޹0ºM±œs!yÊDÞÑFw‰‚æäðÉÏy“F@ 1î®hkk¼mÍ"¹W„}£Ë‹Êí9²çxšçHÁ©Ùq@?Ü(YöpÉÂQ.HÛ>ç¬0»è¥ÇÕ"]‰\GlÓ¢x ǽòÂÛb—Xòe’Àîí> :*túû»Þ †©Å× à£N¾›ß«g¨axId¼:müý\Fð§ÿ<£ü°íà_,íþžÀÀ_—øËC"¤ ø?þ¢¡J»6ð¥þüòÅJ{ù©‹ƒ?:G>Ö¬|¯9@üIøæ¥€JçE+Ÿù€ŸÏø<Èx/4žE›"£ÄàMçÇ©¿äž9Îï4+ø¤wÓIŒT}-i @õý°gM—NÕú‚5êV#£IÚ×—B»¶íùÞy(Þj;˜òg7@*'¿¿¸Ýí{{wiü 3£¥ì¡Ð¥ÎÔ.]ÞŒÅI~©Ä‹™‘WQKÝEKQ]È¥Eœ]|å2>6ɳÐÇ×oF£LoQhI®u)°Í-Ã(ù)}šÄe·g[Ìù¡Åžä,/pE€ÝiË=|CGt(¶zÏ#Ã^`10,¾Ÿåê¨Wú>*Ë•hlg†÷Ñ¢ÑZ㤢 I¤KÆf",ü«QÖÕ@ á!rùÞJEˆå$†ÃêÞŽ¾hyÑDäiáÃt¦Á `,ìÃDÁ¤p߯ÓL„ÿû¿™~[ðÅX’Nlpú!ê¸R°“£ ©VŸ4¡V"·o$v©’Üáh Þ‚@—2Ò6·Ë²Üß´ `Ä8D¹d î;˜åšh…onûò{]Xp*>m!š~}—³ïÛ¬Ý4HÚOZòliÓ>Ä™<¸\+_*®§ÑÌí÷7mݲ!f^?®)5ÉÍî ©fB]ê-n<_aˆ³P¢¿éªè T”JåÃmù4øm‘ÜžÛp,y¸*Mî½)²·¸·mºq³ "×RÞ·ØŽªÅuA±¸-²MôtLœf ¼zZj"È-Û<'Ñ·äîCtqš¡Ã‹ÖRÛùs£_^î*'W<Â<ŸZFúã~eƽ±Ÿ*ÀöF3Á{g.©6”Þò`¼®% ¸ãU—ûÍÌ)Œà°ÁÚÐïTAãN“‚ºÖª¸mlbÙ6írÒî¨WäVÊQJ›ÆíÐ9]ÊÛh¦\qööjOuLXÐëv¤24o¥—,Öëyî­ûÞ¶]Ö÷˜CÜò­Ã€Þm›·µ®‡ÞÏÛYp¤ì˜Ð·ÄmÒêþøI®OÖ¼Vµ]E­mÛ.‰$L<î=,ŒíåŒæ=(á<é^·@°Ì°éˆ±½§H#ßQß?̲2SEvŽõüã¹ÓRçi¯@(b!d!æHéî'àè¶äd0{¯¡^Ú|‰œ“S³¤—i\p ù•ö ó‚éH 7ŠSÁL›5ÿxPÝ ²¦´°vše eLñˆ6O¸„ÎZ,ú3=ž7ÁqÛàÖê˜(³>çPÄêûýÓ›ïQFî°NKŠÎp¹Žk¬OIKP£`t>ìrUÆEª‘Ü®”¹åa‹Á?b9 öCUDVJeK*:½¡A“ñª‚…xúm‘*ÈԱÄé`jŒ÷é‡%«C£Ÿ# ")Š×—H'-ÜŸPKÝV5m㽩yyfUn™²"†4Ôö¸§xo­úP$V ºi­°ÐÃÁkgSfL=à2Q®©¿€ÕbN Pó;Q ßNÅ3qŒ"å4²ÈGsk°Œ¤GJi0Ï  r®‚²=bƪË" C‹«O zz6 ɱ&ª×ÇX¦e>¦þÈ@¿éiJ9³²¨¶o¤L74ãü3·œ{ð$ôæî<–¥ºGìŒeb±hêØO>3KÊðL ]¦ü©¼?…*n*¯f§¾và&Þ õc•$KÍ×Óh”ž´ÖŸ‹ä70’ãºsë‘ênE¤káFµr<,¤Æk@ÄcŽ%d—‡‰yO˜ÁºÊÃeU˯C»¬‘ÓÑd< }3ˆþ9-éºùŽÛ[®¤Å¼{‹Ã‹4x¼èö?t–#]h©›äˆaÞ™›Q5NŸ¨­>,ÉG*q쮇{½qG9`èÑØ|¸¯vHtš ^’ø •,JÛë⎽0­q:G(º{ÛÇ}¼¦†éÌ¡,ÈÆ`òœ÷•< þ^@ß27Z$ïINìøÉp™Q‘5‹¼VlC|]>¥Ãa°Žæ…›¼›•͇«£ówšößuöj{‰á!ijç c5\ uã<|HŸ*Dÿ°žý%UÄš_MŽý’üß¾Í>™¢ßAéÿ¿Ï>¾–ßøûXÔuøðŸÀŸ;W~<´Á—³Àøås ⊟)ó ž¿èßÇ/à­µ—løÝü‚ùùrðP[²W.еŸHáŒÕvmÕÉÖ#k­óúÞçAyý˜x”ùôe¡Y-“(¹Ÿeñ9FW2O-?õqº–Hî?£‰ÑÌ]u/©‹Ð¿FÞìÿ©£Ý{¯k­Ü{íAJO–s-¢ý3ÙžÒ1þ4±u­ÁËm…˜£J7‹ ÝYKEÈßnUÕÍ=;ˆ-ÌL ÂÄPVkÒH^Šr{hÌÈÁÙ Q3€Ê̦"Ö£ü,{G›äÚ9è")ÇÆÎ=uÖuP-ñ›SÃEüÕ'Ûž®£Í"©AHJÓú>F’ÇöPJiωg>Ä›K—ÀÔI>ŠÅõ\®‡Ü–ï[ІߥªäíFþáø{¿!$;Bø4³-Y,¡ª“£·§{"Õ'±Ç¿ÆQ ó&–¶w…eíðA—/Ál\î1{@-°EwœÖ¢ ªƒšÅÌß¡‰\yÛP‘ b€¬¼Û³. ×OoWVŸ/™kv×Òì(æq[×PeTdC¯ "·Ÿ´Ï°®‡3~±ÛF“uéuáŽðĨIÕ¶bâoß1#=±l¯õ ¹mzì!Ê®½døá“GS.q…T‘ábE$á–fªk)F¯¢¸ •â¸m?oƒ&ce zÕËs‡(yï'¡x<Öµ"Ï©£¥(7†#“r»0Ši¬q—‚²htùg0Hj·‰BÖ ‹ò‚¿wáó&¹±²©4vAN÷êdÛ²€…e—Ü[Öc…Ó†Dhy¯‹!â–4F÷|°wcbup8 šº‡K^²É‘%â‘© Àœ$óBïÆÃ°ÅH(ÔúLׄbǰ…áÝ œr˜:/Õ¨ucÜkõ…r c¼$ ~ݬQÍÍ'òLº–Z¹‹Ð)<&Ïßµ@¯âLŒ3ÁpýÃhf[uæn‚®«Z3r÷néÎô± TÌ Š‚ ¬¥>¨ÎÁ-Ktk·™Ä £$-XK×½}Ak¬FÇ{P—ŠudNªMGFt‰ñÉøô(’lÙc’ê甓§5]Ç V#fP9øs"}4º…o£«‹™Ÿ8r¹3¡I™sê:ÓÊ…íá­Ò"\L «ªøÀ=m„6¹ÊÖ™b|®"„íÐJï[a§ ü¸ÏAÆÎÜ]É<™÷PÄsS «­)ÒDAåa PEÊ—)Óæ£þ¦\Ǧ‚$ȉö‰Fò…3”çNƒ6Ÿ—Å9 ¸«ý9×ìö$t@V±FA£CÕ/6¦!ºLéA(D2plx`ÍÙI‰ù¶ôRûçBr)ç목#ÂØ! `ˆÈçN¶fE¥![X2iLUˆ”lŽÁ∠[˜‚ÈEe4¿”SÃá:Õ±œoÓK±ú÷S‹m.Ӧϩ´Xðl3+²w:NÍf²£’^¬Ç}¯ò+RŸÈY,{àÒQmÛºÙ1_¨h4S‹ Ý `ÚûP'Sªx€Òïv´¨ó§UU¸³ZĘfÕ&I¡¹,ùˆ³š`ø¶èÃPíÜЄé8”D¸:´¥>Ï9Å 5NÀVÛJâ>dÑßÔ…äì¥`n檴Ƀ œ»¶î$ª%‡¤®÷ª"G5Þ¹‘A_B…q€¹yîvÁì£B†WëÒÖb¿F?u>—ocÏwÊöqÚ '»®Qk“+ýS‘Îõ…©lf²W"jâ–üœyù7Ž´²Ö~û Kú€±ä@/àtG…ÅÜØâ¸,g÷ÝsL?)$xD-|‹Œ~•jjKe#jfh:[*ðêÀœÉ„êÖјØ!’|`³Š¬OCWÜgë¶LªŒ$¨0ï»UˆLUpôË&ÿU\[ÂdTwëÜ´Ÿl¼Œ|XnŽÜ‡ç,ƒóu$xÍò™ê‰J­»ˆ"ôðÕ÷ت‹äKì9-ü™}d·›¿(L^䢦¹{ŽDerÙ0*iþ]¸½ ë™ Æ hVw¡Ãkâ_&É6Šãm@Á×Þeáï}Q_á}øgÝøÿ"÷Ÿ±ÿÿ9?ÿ¿3ðñÿÏD?8†MçøÁÀ _ù÷”<øÉ×ÎJоèO5·î`|12˜IÏñ«1†^&2a}(¥þG¿J@ùVPüú‹Ð¹Ñwôñ†¯£ œo˜2Òl;éø™èma­rév lsº3´zdÇGîLʸofZ>–Œ®Î€™!ÝÑÇ{xeÓùDÁîm›ûLý³ +÷í1~X*/epÒÈGw|V©èѲĩ]dV±3p½„Âm›fº–.%Ív:1‚jO3Û{C Yq Rtu¤½ÃÙgäˆõÅ@x›]èšCõYÄù®Š´ÊV±÷C? fOO¢‘H«¯W;X@tg/ßË|ê†ê5Z/2ç ùˆ½Ê ¬£ SÊ,0s‹åiïp©\€¨nb;Ò]­»wòÜ)¼…pN”±ªDäÒ“/ŸdáúÀe!ÎDzí<Â=[&Þ´5Ö¹7ù‡H†”ó%œÓsloæKqåÛ’fI{Õ%”,Ìø¼^}i°4h¼IÕKäþÈ *¼½ôZn4”a…Ѐkû[Òd@¼ÜŽVGQ,‘¥ØºÜ%ïÿ¾.]À¤§áŠâ[}»Ó¯k)΀ömÆEƒ£]ê–›XuyÓƒºOØö¾s­¯Ÿ^WsPü"ª(¼}?¿ÒÆj{TU2¾Áeñ’×no¿Toz©ïß¾#[LÕK ˆ½VÈ”)Ó¬(L…@t‰Ùæ&"À%¸i4n?¶·CxœMdÆ- вcn–^cš8à›j4UYKÀàº.à‹!¶Ò™;zH{aIY«;ÛÀo‰@@5Y„ËÓáÌåZäI‹zRRÈ—d_¹ø®y»3òör`o¾˜•‚ó½ðiƒ1Îñˆ`ßßÏP´6‘ê&ïd£ñ¢YÔØoI Ÿ7ODF -mÛéEô {]zò†ãÅØRévéçf¢ý’ÊWju”Ʀ™;K®à5Ä×ûn3‹pfkkð $ZFlé?Ä.^›hïåËÚŶ¥2P]н1ˆÛq¯PÈBŠ2È›œÆ´¯7&ÏÕ WÐÛ~ÌÁc‚.o+JÊœ戅-4;—8^¿ºkÑÉC nžk(eôdfÊßX¢±lÛËÁNà6¦$«E×瀦:³Ä£tÌi[ÛŠŸ²a“ŠQ¥iÕÍÈœ8Ç¢îæL^áq–æÓvÕ“6SžÂ)5Vi¯ÅmM‘8'h‚5悪ˆ>ªj5?u@ t¹+F³i3{P6 åÒ&5õ4+!N£ð cAofv‰¤³§¦îáÝÙ‹ÀQ} b0e4$/,µCŒžeÕ’ö|&À"X¢U€R…®TÝvë‰ÅQ1|%?/¼¾=Ù.±ÆL¢–÷`‡ðç¶ã }J*ÏÚ’¹¢b-‚j§QNâ¿g)HžÛ°„MÆ¡äÿûdš˜ ý®?ªU|¬S‡±§¦L7:E`x¥ÛׯÇW;»8ëº1¦”z&–œîË‘Æoq®­1!`탧›Àéc (-+j‡“Áª4JÃj¹hLûÌ-÷~¤Qc€9m‰á"©†šê'_éò-øVvxg*¢Ú ø¬8KÕ>¸?‘ÐJ&J{Å[ŒŽøxm¨~a Xt#X;ÔsaB}"+ÕÂtÃóÙ> Ê ¸{Ý2ýåj­·nLS:«%Í/z 7uÄMD¬À+ÐPôÕ¦ÅÛå2ñCþ¤²Ä¯©a_ÍöŒ7Ÿ 1 àEøE«l <Ðþ9É(p\æ´œÿÖ íZã>±lQ1ž>¬rÖ =®XµG¼zï«F1Gˆf\š N-9à§½;$x 3Bæw¹üñ” ¡Ê¿kµ/9?*'&3BÒN§U W–f‡õ&›ùÖ¸£ÄÌmÜE5˜ñ¯ ´Âƒi@°'M}ò©¬¦ Ž˜[ýÊWñ*G ½ €wGÁ¼>ç }þõœÙü«4ZÎEß©ÈáäÍ¿ù=j)íËþNú¿¯ÀüÿŒ—5Çþü•Gøã—|…ÛáWßó3>|Âþà'Ñ#ÄþÌÏ? N=³üáÛg—£5u§ŠÕ{ï ®=;ôëŸÍ´¦Ù ÜGp€ôÞŽ g·M¶¾áLj°(¤hdô0üñÖ ëøáªí`Sˆ\P$ÊÞ-¤†ùXâëO×Ú{§;¾âà­wwö7%çì×mÅ$QþÁ‹_k¡TZ›@BOï^ÜfŒ2-ÒÆºâf×çaQÜ ö–°ItŽPJŸk­¨L 瘙TÔ\w@E3š™í Õ^éú`b¥•QÎù¢mÛ ÖªÖ"Ó°4¤±ª;.ܽsM‚ÄžJ€†v–¯JÝnXŵZZbÛX³öü©ÌÒd‹©ê"ç<+."‹i–™M_!ž›Ä'†Æ9Á†‘[—:˜| õ`NÌT<о£ìŠ–Îè¸8u‹Â44§S%NÌ´ÆNß lUȘ„G=§N?â'˜[{#ß’CnÑ]Ÿà¦…´¥£ÙQÍšÍ@³Ü©¸YKÒνEoò-3Õ“’Ïpÿ‹¿[øp8åv¯œÐÄÞë{Ú6š¹|÷޼/@ÈÛíÒÒmØeœqWT±ì~ưi…¤­ÙZÉRuçºS|8"¢t Þ! Š‹ ¶À¸¼ÈÁ;góu*péÚ®„l£ð›·òš{ =è‘”ZdÀ]G³Û¸UMžÕMÚ–{ÛÂò¾Ù;¢¥†¾7i½ä‹&÷ýüíù SµWCIQ.Gu $D©bd’}jp§äÍeAìd·m/uÝf¢VÅ:Øtwa°Æ [¾ï¸·,%õ°¦‰WÕªRpoó͹ c¸›Øm‹³+.wšðb«ªÍ“Qõdëëˆ Ü›Ï§ù#IýëÁvÃæ¤Ö& ÙŽ\1BåRXu‰'JäVßÏ;–_/åvÎXÞ³¶¤¨w.’OPÎÓ1! ÝØgw–»wdÍ«lÏzç@k¢ë÷jT;¼xÎÇgè¶8f Àòy»çZD–.a·tÈdÚ:¡Âmëh‡µ'v\6#3ì'Qy"Ñ$ì‘§) Xº2;3õvdÃ0“ вL452ZÖ\êÕ+Qpø CÙm]az\ý»Åô•ç=Z9£{§UuG÷Õh$šqKfz)ÍKNÄŽ9ÒU«¤æX€>¡ìwA§*¼@’4Èúà qO‹”vŽŽ¬Óø¨aPö2”¶†  ¤¸fËêoŠäÆL ½BDµÐzQƒßµ´Lš8D¨k;µÀ, Íx°âŒfæèÍRŠNcX ca–>üìUGŽÕ}gÓ9ɳ “¬M" ¬²€‰Š“ÎPò3¤ É@§EØq Æf.F c|C3&C§ÌÿuQÕ\Çùò®‘ B­a·‘X52Ô âKÉpõÝKVý‚v™`ÓT¼R"&ºê†…^÷I z·!³ùtÜcXíR1ËPI7U‘™Æ"CÊ»ç£<ÕÞÎT}²ñC ®ÑJ)øp]ŠüÊ©ñºÈ-ú^@ï¥ʼnA±+À^æ%Ãf t˜¬G´q®ˆ+L¾š»F’{o`E(„áw5s,3fn½Ð]*Î@"×ð•‚µöîs™Õ°p0ÿSFó*Ð]ª =EhŒí£ÊRˆ)uHL¹‡ÈZà–í åÆÛ;! æjbÜ6”ò¯ ‹ía9KÜJͼ…UÍr²‹ŽªÎ ª“kÞöj-á£#‘Å‹¨$ ð–úœC6¹4ÄN§BìYÏ8uÄ(,jÏÁéCઓngáØóšq‹¨<ÈdrÎÐbR&ñôKóZƒiþO¤#ŸÃx’V GbcÕ#V×àaÇ{Ë #L›kjàyö³!;$ã“HĤÖW„ÂΙT1|<Ÿׯ„B²<þYH”`ÈVÉóRŽQ,Õ oÅá‘ädZ×ó>\ôC®5°"rºóÙ”F¨‹ ®ç5ìØœÉ5JÚ³—X’Ñ–ÍŽKt)rù"¼õˆ°!‹ÌB^©‡Õ÷dØA!úS …^ª¥€¤?} QI\¹”\¬•”ÈÚ§É×ʰ*Gè¦ɦHm§ê ¯­‰<°:ÕÖ.ä,f°Ç'ó£Î;oŸQ‘— rˤŽÓrlX(Ù0˜>å\óæd8Ïg3Ñåʨ·Ÿlu$³byG–&…ÇžZËxwå¯ïæîlÒû”^o¹¼‘Ž@I *Ûsê-2N™cÊkˆz°`Ò¥ƒžXî-¨}‡YãÔ“0’¯PŠ f½– i9ÖE“Ÿ—!Æ]‘ïh ôÍDã÷a†BƒÌn–rOÀyu€%™LÙÊxo±KWEÖ€Bÿ9Íó¸åØ¿4‰vbø£¶‡˜P?˽Øó4+¡K¶ÒÕŸ o~@–V<’¡¬+ˆŽáàþ·P$Û su œuжܧ¥¢º]Ç6ª z½¶ADÔh膘·ZK2˜õ·ýß4É1åÕÄ+x\!Z¶1Š®×\¸¼ÌœSl†Ñ ]ÿY“PíÁ”“ &óÖQ¹Ž2ᓎÍÃŽÁŠ’ú‰on7gT·wmis }æÍÔÄØìµÇ©»½év}ÂñÇJ#Na_êÔü„ycŽœÿÂ#u0Ϋ—1_½Ã‘ýÿï§þÿOÐÀÿP௟ü¶ÿÿÉã„O3ü àu¹ñú>¨ÿŸ_"0þøÂÂ÷4À+‹‡ñ 5ÂǯÃPP!:‡VþÓ±Ä[pÙÿu\1Í'é(ÝÄ-OŸf«Ú¡Joß>w¾ Т†™¨’¼:€a!¸‹ S'µÀÞÛ™ø×uy@ÕF½¡YÓV ñÑö˂丽>~…ª®µ49±#È]ìØ™vYÏ˼:Då Zª4sU2Áà ãáì4Dó_Ëz_ ‹— g‘oø5¡NªK‘)hP"ÀI°PVoª5 Jwlõc«ªPªÐvhf„¸3XfÇšN`Elt;¨ï¨ç©›É]’;iòª¸T!É{o]r„µ3âÑ-ºeȕŜÜ]É{6Ü©ÜH¯W8Ræ‹ N‡È~¼h@ö¦mB•êv?yBHnòlŠœ]R4s`©.ØÓjy`5d# ²™Ýþ¯\f•íó=®1)£t34RaQŠwÖª‰‘tt‰™mÓ%¸– v8œMÃǵt[:ÛÓ’ìö©ü‘ÛèÝ¡ÜÞdëÿ¬î1¹o|{¸ösCÖm"QWkÆï÷¶½òm‰×r‹áÜgo„ôF[£Ý¦¥+£9„)á¶ýÛ¶¡KmD›}¼(šÚÍ;|[󿻆ƒ`é2Ù¸%ã>Ñs¸ŵò+Ú+™\qoóv˜Ì6I` EpEzÅ7ãâ°ík)á´i{?i»ê/„4̦ºXÁˆßm+¹<*cUÅg«o/×L£Ó?8 •Ê?}·-\/ ô…{ I\v©qÍ6 Ê,››¢—bILâΠ9® ”ÝLĹ(“],mFf‚Øíí Ð¥Ü;š.LÈ­.•½ïÍQóÊʇ™YæÊõSTTUô,ˆ!0C’7ád:PŒ&&jêó J×øœ‹”õ£ºt©+! ܼwTi»ÙÑ«zc.¡ÂGóæ÷Ö³Ó/MÁ§ÍÓcį̈9]ŒkIÂÕZ2ˆŽ\ê‡Æ7†‘8T*Î\Û°À8äã@»Eð$‹S,¬eµ÷oÀ9sÇ@9`h 3(`~ß¾T©(s`Wû”ìªQˆ4k ‡êAé»ýH%²O,J1K8½ÍÂZAöýðêlPÂïKæqLAR–võØq S“os¢_"Y¹Êè™uÐ75š+=–Hðv·zžÜá Š^’dnÅM" è(Cˆb6¼:1DêÔ’ô‚¦e‘Á\ »Öƒ’ ËVƒz±ìv»ðPV‘Zw¦@%£z1…²,Ž„ÙŒx«&)ù"e6áŽð¢œDC2ž¡•„å"ùqöº'Ø£¹§Õet%…|ȧµç"ªÂ˜c´ñ…¨.„Ûœ(×F«;e2*åµ%¦x ½F{(2±¡Dû“#Ä€©˜Ðt¢×\Р¢Œ¯®§J€¤· ÀìfúÛF]÷$AE‚Ô/{æWÊï.‘‘a޲Z ?@„ʪ£“¹=/Œç^,6EÃßa…>ÝÎQ’qJUÉGÑŽYŠóÞºÌ(Ž[Pe¥D²4˜B¿O—+\Ô—UÒ$R»€8 JnÎVŒNÌøEE_¶‘y׎‘^º¶4ìÒgfK[E˜)0ŠN2Ë "«’ª¶-uZd«A5*0ou"gûŠÃ#ãT1)ÿi®3†q!ŠRˆ°0Ö FŽöPÚ;;P‘ú´m£íýŠ5»ÅÂc4ã½æÜ0§<Áæòÿcáú€5nc½è½êÁJG´ ï"³,&‰f]F2eØY0pp™°ÜŸ€U9f&ÐQV[‹ ‹(Z€ÏãÓdWqˆ™–ᘬøtòh>‰»V:BI+™TçDóLßT{sÍž´Éõã¹zÞäF•p‡ˆº$¢r~Phš­f±=:ÈŽdŽGi¥Ù±'Nõå Wƒ7RFÆÑL’QˆÖã~ÔÀë={ZO«ø²Üw¿ h¢ò°ç~ÛãNÉ÷×ã07ëk/ºI‡ùæxIü½éÀÌ¿Á ÿ'¼Ýwñþ/üGüÿ]ŸñO¤’=þè‡ü’98´h~|Aù(ùúÒ> ëŸ^äC¡îç÷ÿ#œ^´Ê× _|¾š7¨°ìÿ#IðjL×óƒÉ ƒ[½)Ó$I”É#ñ—/ÀÎrª')è²ê© ä…y_6÷²7Ò¤™]×¥º Üì‰,¾8”è5燔ÀTá¯ëZɪhC‚}ÒŠ¨Ê ÆŽ%-ë—ðýsüPݼ­û Uuå)°§ÅŒ4[ªª^IgM/r­uïâU³3Ê.=ÛñŒHlï!†» ¬† 2´ÿš“»k“q5½i©«–UªÂ¶Ipc°tiÝë,(Ó7ɪ}ŸQ|£Ù–ÇR,¤’ùŠv¾7×x QL ´Y`æ‰ù$âç±ÿø½ `éâQÿeóªÐ¼»öŠÉ»Õ¾%¨>h7åÞû]Ti´ÿð\°²ÎV6ÌX¨Áš Ü\HOKí¼rÙX´KÔ¦CT°]ñRÊv Å7¿»©‡B° bö”`r+ÞÊ£]¨Ø²·PL¶eÌ«AÉu{zåu­Ï{ÛÞ·ñRlá\kÉÂMz‘@êÄ‘XÙÆ«¸¾yNŠðŠ»žÙíÒ9.Êö¾rÖ"öü*.¨ˆF%W¼¶m´}¯µboÅáµÎ‹[U2f"XÐ¥¼·¤+ÓƒôRÇ€KÖRH} ¹Åÿ~J€—:šG"{O„¯÷(Ë’ÇãÂói{Sä­º|J§"ß·y +}ÕÛáu…·ß™æfÔâ¢v´$÷2F žT*Ëb…`†}›ï=E ¡”™Ï÷¶0ãÅk­+?2«ÑÎQªb[¦ãÅ„œÀ?bK>"S¼ŸfË(q5{Œ`uöÞºcävÉïpb+Ò¦Þ®‡Ö_]>§Bí-¬ÞRÄå}S-±'ñYÅ1‹Qr1«)¶·ØŽ£K6ó_£ù#/ÌÖŽXimg4c¸]EQ§XLšµÔý”EriVþ<%ü$u8‚/z\º¢]Dâý‡ –ÇcâË™1»307o¬Û&pîÁk=à ´„–ΜZ„²-Õ¿ö Ì:áJ/ fæU¿cÛ°¥Z”íå/*HYµ¨ [Ëj.ÛèŽvH¢F•ZjÎÃÀÁ¦=EHØ3Žª öáÈ.+³©¾°¡yi‰Ï› ±†j*‰ê¯þ·£Ú¬^ídéms7n;\/ùŰ dÛ Å´IcÐ(#9O"ªNkŒÏLÌd-ìY[O+ ²oÞÑëbÚ;\ÿg™Ä€õäü'n66ÊÝ“Þûå9Ä¥¡CÐÒÒzûð¤)^ð`F9}î—㸥ûeà«›¬ì«Å¼Ëtˆ$v.•à4ÌcÌPÈϰ;Žë‘Õ¨qVV%½jCàŽíÆ»>ñÒÝ':=;¦¥%Äú+Õ =Ruéšx1Tâºj„jìR>ö2‚”vÍîâ”ÄÌ DT¶ÛÑxùFù¦?rO""s1äÿ’îë¹a¹šDÝÎrÅ>¡ëNÊ"¤%;úÀĽÙá6º_9‚{~‘ù´¶,‘u;µ#85~äMÞ:×YïÖß÷xÀ»Ðÿû„Y¼œeg à‹î ~úùü³æf~ 7ðo$³ÿLŸý·Jánð''ÿ™ü‹?E|Û}˜Qþrhàå_ñóYĩꪌýJôùWʘ‹OAÌäkŽÿû =¨6B¼¾™R†œ¹?‘2?6tg& ¯ãKœòzbÐÜ4€—>äðß\q‹@WÄÁe¶±ÐhJýO$o4›ª ­ÙúÞgeú· '‘ÖXÅö¨#I^×õX×½wŠÓ6Â2¨ƒðûD4²Õ—fùí¡ª;ÿ§ä¾îGäȦæJîÞ›Î!ÑŒHΧÿZkÛ^›„ 羊¬€i–@ìøjx:Æ*¤[‡%ïHÄ9˜IO*ôlˆ=5%W¥vná­ ð£¶FHÚ6]ÇC?凨—ÜNã•¢Œ ÉûïAíÅTg9Vúºm‘áEÙ‰ƒXÀí¯ÖL T>Éï·]k­E)»cJU™to x± -„fÔ%§WBùžI†ï›ÿk‰Ó»·{éóh¡¥Iä•Ç*•’“€vjPõvóÞ'¬ÞO–ö*”ËÒŠÌçŽ5i”(šÜÏû¹ ß|•§\z©ˆxá*^àʼ‰ˆWgú!^º®+ðÉ~•íŠÚ=Qì·{Ó(¥]z]zµ#öEÄl›=ŸÜä åyäÍÒ|wxùæ+3ùn[4f_>[\´Ë¥)f[Ä;4Šn쥈nI£ÝÉÀ\¢ÛÝÌ —p‹j$¢Ùnó’µ¼{_ºêBN W lªÝ¥ërµ{UÃŒ]Ö’ Ñ@[øÖŠxÍtc1(Îp·4w9s®ìîqLuŒ}ÍëcÙi¹µ”A†šƒ˜<dš %QUVè€1 7;y“J¼PdÕéKãÁ(^¶:óBS áfTü #·ÍD¼,æ(ÖŒ’kÆ"}Žƒ•"oi`cÚœš‰\s£Šà2<]¤¯ílP1½tâÓ²&±wñ±d@ î‡ÍzÅ•qŒ Ùó‹Ü) ·¥­ý˜e?eñæØ¶Îdeå£-|Ê‘),7=¾9Þ].ÈÔŸÛ΂Æèq6Ò`ÀtCÕÈvʪã†ôÑUî¹…QÎÐK/CÉ Ñk;=¡ÊÙ.ɉ£úgnï Æ“b×ë?”¯ÆÉðYŠ‚IF“v/²èÝáEp~f\…£u"J$ª¾Ù=œ´Hp¼_'ËÓT%³Õp: B¼+vˆêìÆ]…õÁÐÂUÚ%µu¡ZW&ÔÆöÀši†‹˜ˆB„àê»P¯ËUòpÔXÝ7•s´Q $§SBª~IX_i&J!rSb³£€D±T£ ÙGP]$¬if0P¨mÙibÊÖþR¼©¼Ç¸û#YtÒ;‘¢SfªÎãQπɘ¨Ï@³>žõ^D´Z9˜Fg•â@19úÝÛ™Û vUÓ¤Yd”É‚MôËø8¬ú©c‰]™g÷â¾ym…UFIn'#â9jÉ÷wö/f}¡ž ÆÚBxŠqXª<˜­ð#äõ\M'tŽÕØ€ÕÅÛˆ2Òe{QŒygþ§@^1Sd×ÌÒ‹²³nTÑ´®ºÔøD…æ~"?!‚|¬Ø+«vÒŒ‚·ûSúÔ׿ç§$²¤’í]Ÿ‘Ü&¼hÙU®Ò9à#tUqœ:A0KF0À-K5ŠnjÐªÌ Þ¤Ê|VÔÍSˆÈ0x9æ{úAáKWO9ädëpç[ÅŒ%PýNÙ]o¶þwàéç•w(uïkÐÞÐÕHžyДÀ¥Æ$©î£¿êÑè¼´¡ªc~±; ž£ŒØ%rÈØ¤¹ª|ÅY#Ì$ÝgÒÉ1 œ` žH²@ÕÉQ<Ð"ùL0g[Ú,îža6/߈#X¡¶Â²²?í˜d ì0™ñ6cÏ¢*ª1>_LWsÚþó)÷ÞÐw» fxÑâñö½2Ù²ø#:íÏX6èOéõUýkõ_5ÿBü²úŽôz“áaùiàíµÿÏ/zø‹£"ì<æ§ñܧ1åç_ô‚øú¬þãã7ÿ¤WüEýë=ÿ¥ö€S7/ÓÌHPþ´FøÍã?ûï3‰±ýžV¸zû½xݶ…s­ðaÁùLm;T`t¡½È̱A½žkß›ÂooæöÑPÏÕÍYÓ¤ïÔ㥠øÉ€"§\ry©ï§cK1 ‰•VþRRU¯ÇÃlÇ"Jižw(Ý|¼Û)ð¡[N:PÛ/ÉÈm¦:Jz"Y?EÈ{o\ªºV0âkëÆù½-C2Ê…¹¯¨r9Æ!|E ÄŲá0kå’µ7¥Ü.o³[œ‹Y‰Ø¥j©Ó’9‚ÝL¥ˆ½#¥˜®šÙµ\ËJWT±wLv\0Ï5 Ͱ‘ Gíæ‰áNôoÓ8~ÖY²‹ÊyÀh·á¡:âÄyñZ‰ÓhÒ+G8f„Á}y^€,·ðZdXP¸ºÃÊ‚üãzÀYíEª÷¦JS´1Ú€ûL,ÿ¸_k 0/ÅP˜Úì¹|â°TLÄö¾ÉËõÎçþíyß´ËÖzøµãŽÆc¹©}çÿU]ÿõàóÆãR}襋äsœ4!.©¬7Ûæ½7D–\u]—ºrÊí¦01¡9’ ²|pµƒò»mÞö4Å7EàbDÛÊ ‹”ÛX8å\ûÚmBòAs3¹“ª<épAo×ÉïÏ­ŠKa*®—-(—9xV©Û;GE:ˆ\XÞ¦ºT„ßoÙÛÖz¡ÎŠzE9ªee –ˆ ‹ ™É}Ëuá¡ß¾]rC×úv-£í{7Œƒq›Û{ÛR](ãÖMÛ›Û¸,•¬¶R‘•äì™ÐÐT 4ëüút¡_!ªª•ý4ßh…ùí¦| ‰M)QØ4ÊŠ‘·‡6Ò5ïeª÷†÷™ ¨¨©j{§+B“Ú÷Æ&±U—OJnŸC$‘B„׊Òª›]öÁæÊ*ùæÂ7Ã@'Q’ìþZójÃ=zvEk£¨¨òQFäÅÍU¶¥²X異™@õu wqÆ ³7XFƒÁ¥NdgT¨Šo‘v~Òá1Øf¶m=VûÍ–b-½™¶6!¦4•Ñöò:m¡"bq@íEnPQ©ä¡rÖ‚ªé§tSó—¸sæ|*^—Adµù°bìYQžzÅÊl3\˜.±Qý P³§6îϑə« b ‡É7$&GnG&ÛúضûjÈUjVDß´`x™áÓfÕRÒLAšôh‘ö¹æ2¥ºPµ¥±zj®GH“­Á)šˆƒ0èzÿP<“ì= ŸÜ. 43n…v‚gzM²úm“L#ÕDVÙi*sÌüâƒÆQG[x~/øÍãüÆjxÁÊ×HóÕˆ5鶘Ý}™4ttÿç 4b¡íþËf–IªsËŸLð祉é4F ˜l†â°ÝŽri¾>½ùôÑÅ—¿&!¿ö㤡¢½þÆ×a“z8ý^“ûïÔ9Òð7˜ù‡DyþþÁÀ¿ÒÃÿ¯˜üçχ ñÏ pðéGòwžŸ/“´*÷‡YÛ¸aøtÆÿ©­¿ÕÔ"òV@|®/Æø–Ÿøî±ÓŠÏÖ³üêÅBWöš&†äwMMÿÃÇX†7ÿÞåäîTŽ_zAûu^Ñ>•u|ƒ0DËkv'<´äZ ¢N}q-Œú–Á¿EDöÞªz]×ó»ÖÒ©~)ç<ýóÄ n…µ1Ó¥B­žˆ~å¹ýúÐØx*ûsZ IDATß ú×ðÂÚܱ_b•Î1Iâ¡À%h¥ë¼$:@Ã&¡¹Ò Š3{‹¶Íd´‡¡ òÄ¢¬a´â—ׂB)!¯“¿mÍk8‘Ã!ï$¨õŽ#>ŒAÀøþ¼½-ַѾ»Wm…ysp‚’Ey.¬ÊqÞÌߨ‡¢°-bÙË)â³ËŠ3_"•§‚ÁÇÌðD¤ ÂKå6ˆ{sxˆ8Ft~Œ/àÉ`¸'‡ºÒ}°ªç⯠ÀÒ5Üo×âèÛÐÙ ai§Õ0YnôKE¼•Û4î€ëÜÏç÷}“ríð úŽ%Iº]L~(þñX›×ÿùí7ÉãÈ%rïTÿcaŠU`hº@£ ¬+´$“0S{Hݑ̺T 5n¡Š‚ŒOÛ4¹Ÿöí«xH¼Ã×=ë×Ëul"·qoáxPL;­ºTU€¥r›(ÄîmkEËèm÷c/¹êÝȪh'nˆŠvW‡XðÎdŒh¼\ÜJDgn³[äò‹HñíZÁ½MdãŽÒî¥íŻ͹ˆ­vWçézø gÓl‹ˆ^—B³Ük­o"ÿ4ñÚïÜLëR¸ähµQóòãaµi½þ L˜zoj5ˆ’1 ñ»,ÐŒb6Çõ/ˆç"¼çÏÕ#ÚåYzócYHáû¶½)Àu­ëZše¼˜7âD®¥'SCöm{M•{›,D'3 ¤ÙÞ´m½µˆò•%² pÁ½7Ö’¿šY˜«ÌT\² ú£Íl[>-f«u?,cl­ §ÔÜ&ÐÀó{—ï5-°ì¥ÜyAÖZ¿=][ã}ß{o¡ÍIy³c€ØâòSLÀB ÿÁ¯Ñ4¿¼œ¥pÃÊB ,*i²Hã Ñ%f©å«vºp”UZç•ɶ[u‰hŽýç¶sºLI‚.Ã$†\¤–b;ëhB¸äàiÐëO*“–eÕB§¨´Š“ŒxD·l¡»shÇô-ëYU.aF }ÜûHÜûÖ0OÓÁ…îÀ7#@sªzÉ—ÃsØsõ$*ÆA3È`âa; ¬aP ýâ§®¥"ï¿1î¬ÛeÌÝtiæ•ÜáZ0¸°êç»ß&[à¬=…zE×sJE-‡iÆ)ÓÈYÿ VýhŠÃ!¤EìRÆRhF©Í‘ €¶þ׿ÒYë Åèbñè1@6b4œun ±ìïmˆÐÛF±ÜÌ+¨ñ‰¨‡ÇæuŠäfYžEZt?©v®o‹|koáëå˜WEet»äÒjp?35òg{bÞ3áVÞÛ¯kÕ"šÀ:æë†¹»YCh²rbÚŸÔ±³ rM:“1ŽÞÜ 5A>@Ž‹Š|[Ë¥{Áîb‚ÙZËl‰½÷öí#äåyUxRGfÞèÔØ@ÒŠÉq-7¾™É ;ŸG¯nJ€ùé<*Øz…½òN¹o?YºÀõ3»gÌÒõ\Nf&¸šÍ»êŠÕ6JÖ$…Zâ(µoÕ-Gæ–ÕˆiåÛŠaPÙéë!^[uí-Vœã÷œ^üsD•ŒÔ¢WὟþÄ Ý¨¼Æ¾Èî¬¤Š€IãGw„.óIÒ¶û² ”¼ÂVÀK‰cÙg?ø¢?>=ƒ5Èérid~NH-4??mIÕnÐ £gô6žzÛ%ߨÖv[‹f1¯š2h‹ Gg„¬š™ „YùËó’U«Š&ŽŒPyª±êT8‹sÛ2:ÖŒÚúQ½ý4’x‚“ríní(Å\?Ou}š?ˆ¶‡ŒYg>Õ¥Á)hVAoÄs~¢h—õl§÷ã'ÎK,J†S‚—Ë*T늀ŨVœTãêFI,-byÔ ¨ˆQ­Œóð$÷%ŸQmf×ð¾×¡Öúw¼:ïÓ#T,œ- ŽE8º¢%Õ”PyúL+Œ¾¸ÚàëÀá–³b²§,?V<>3iôs<’uœÓ¢]c¦Òö5¬ùå½ð^Hœks&k¦3M=á˜Òõ5ZCzû}‚½*·ƒQ:ž8 gÛÔcLןGŸÅÎkp¢Ô9 V—Ðk‹.O}bM¨®‹CUn›9Ža’#eÒÛyN…'ŸÎ÷Ù»n£Gªô“ÎÛQaØ4¨zaç é=¬†ÅÎ?Ð@:ù¿: §KmôÔÏN&hˆë|Qò4ÀRüJ ã'9ž’㎱ó'J6?΄§}–Ÿ%þ²a_‚^ÿ>3ø¿Ðø\þØþë¢ëŸ;Ìkó›UÀÿ$þ`PóéÆßü"üþ‹Ô¿PœOxAæ|%|ÿΠê6E糿þݪá˜iý—óÚâûëS°‡.ÿ!ÖÀO~X¤jns?~ïã5ž¬OÏòóÅ—:ø•˜§Á3¬0³µÖù›fõ@ëM®hfÆËÖ.¿Š_< …ທNò½}­Ë.3k N­±Ji‡9Y@›¤µÅÿ¼Eœ×ŽT#¤ÕÑ?4 Tg€* ÐlÉíšEVÁßPz±91Ìgœr­¶>b4!7¢Õ'â¿4¢8Ë…nf×2}¢ŽÎ,“Çj@•g9[3‹]Ø®`ï$½Á¥U‰éè˜Y~°M‹>³õ×Ë>VSÖ} ;ÔÒâe”¬r»ø–—zvíqÃqjª¶š®‹Â·· À.àÔ1Š^!€€Þ„à²]VlXø× Mî'µ‹eáÈÏ}b^¨‰ Æl£´_˜ÌVºJOòõl¿eô¤ogeInqëÆ.ìh±Ìûú+§2WoÖÌÖ²ÜÛGo]ÄŠ}®‘#aÖL—ø.¿¿Ë¸¾}[†-óˆ²%8\þí23ûþ¾A¤ú¿,Áðs[F¸Ë»¸Hï[÷vÝ›`\kE»í»o#n߯…ßû¬¹Á•Iñg̼Å{;ö†áZ¬PÝãyÒÚÒí²t‘T—»ïÍý¨2s»VVRÇÁ™©8Åm_Ý.×­Ý£¨xU¦‹ßJûöïßo’ïîھɋU¹%È©o×’KnïžR{ “*ÒumÙJaÃâ&Ü æऽ³<äa³ví-"RìwžÓkhDж²ðR1—«¥È72r×€`W0†2×LOøL0’kqóíÂv¼pmíœ"äG3È< ;èÂíUPøgßn‡ýt`Àüö{Ùµ²á:žB¤ùýîîуsŽ. lžõéh ÆÔñNª*¸{èÂIÜ d’gX«êÊ«äóh#˜—¥úü„}\6#¥Ý6–ë³y"þ{ŽoÆ]&×jÀóìNææ¦lNÏjØ8D«­§„³$§°‹bE?±ð.!xžY=M£è”Õô¾¸byóÀ{ÄÞÂwL“ZÊCš­ŽpQÜhöL]Y£$g™ æóÞ˜v‚ð¬S[ñl zpj÷sœqʃq°‘ã û£¢1wý¡¯c"N)ÑýÖ}̬qAžÚy–|Z[L¿-¨Þ¥¬"lÐð}Ú–G¦is½+”Àw^<F\>‡á2¶:n.aY¥n¢Bê£Ëåp´av(ÒéJè„Ùe éóhvO@»<²í˜ê]hEÎy”σâÓXLðß‹KÎ bóq¢ŽÒ¾RH™.P&fd~o¹¼L¥J¥åYIè·•ˆó¿¦•˜­½µ©ÚžËÉ 3EÜÿfK‘2õ(*Ý¡±š”úv*ÂDÑOiæ¸ùJÒWùD*k 9}^©af‡v¶Éc~•~ûÛÔòZOF{–Àv=«c]MBÍ{“Žø ¬:&¨%¸ 77’mcæ»àÕbbà>§:t™2‘´×j~t¶ÕÙ ßñ#3N‡{í§ºw÷pACÖ¢¢À™ÖžåXpòœáßäŸf/ÀòØà«^µ!s ±êÍ‹;–Ê2 ÏaZÄ$²š@YÉÒñ8)DV#žÔÍÉœâÖØÿž³´‡ªæ"9|êˆW«:kTmE7`5,A[§ÎbÔà”žôpetÇQrrBg^ÏÛy6÷z×ái”Ÿdœcÿ6;Þ¢qà·ò÷xy®-Þ9—ˆO³C*ƒBŸç”L™2T¶£«øC¹ùãñ4žU»°üÀ {(¾_ãËIaºÉŠózƒ¼nx›Ë½Z>hP8ÇàŽÓå+gæ”Ù-ÇÀ\Ãyøó<}.H¸j“¦g׈z•sjèGå‰= Šj_ÁUW^Œ‘K3œØN‚evaÊT»>â‹…Ï + ðÌíÆƒGç0t’(#¹PX<˜)ÁËC­ps8K¬ÑÓëùD+8᜿|¥œž¨Óé"úÔǪ«²:÷0> i¾T²?j‰ÔŸ[½Y›þm!ùÿ†J€¯\׿1Bøkú—üþ¡½âŸ9À/Ìhôó ú—.¡@}È|òô}þ:ÀâòþËr÷–-™ø‡œŸñ÷?™^霿¼^ä{hãõŒ7!ͧÖÑŒH£g‹À§ßz< $¥vÜò•8)„Bu¥Ú©íeBän%vVÍe‘î½ ::TŸc”¥"}\Ú{¯µZðî(žè¸éÝQÓ½»v)ù‘ÿõ^S"?5†-€žyA;Öu.»þ‰ÎÜ$±þ@·ìFkëܼæÆT4Êx/Óª –±ÿøAz§qœl—¥ýÃ]– ™LjSYF(à 5 ÚX(â¬n„‘ܾé‹VmÌi9ÏCÎ2 ´=pSLÝO 'Ñ'Ÿ‚}…-ZZ»çYnï)—ƒƒlz¸¸ÖZ¶C7JÜô ¶ó¼htÛN[±áKe_Øt`±ó=Ç›ÁódRdÑÛÐV”çN›6SÖy @³U²e.^ E¢Q4wmåV}¢ñ3 Ј·o ï P2mú±Œ0§/àÍ–-slGàtš®‹÷ï7¤oÆooÿRd´-Á€î-9®µÌ †eë›­+é~Ëí¹ñ]£d lëÆ­}oF,ÞwöÓF"ÅHƒÝ”Œ!ª_ k•ÃJ.ÊV´ùâÛ2÷í.-¾ÅóŽE&dq£Ñ -òþî^§lÍõUp î½Í´ìÊ?l%[ Þå¾¥;o­ë2¾…HÇËq%¾¿ßï{¯4­«y8¡ó;av-º›ÊíÍÿ" .«® Æ÷Ú÷¾¡©›q]Uc.÷ñWʼnHÝ›!Ðoïkq½™ßÍxxy=Œ\—‰íþ~Çñ?:«-_OܵûÓBu(>&]4pÃQnRáÖ6Y¯»!Æ#H O´Ëû¸%ªô…Üåû̸8Ž”Y×Ç5:9j¢ûû‡ªåNg’EŠŒ´}FƒQÐ8g«˜»Í€™´£ÅC§¯62Vò*}Sî´¨‹n×3 á*””òpï½#îfÄ2³Ánz».Øú׿¾…:qßï÷}«Ê½sÅ"åbv„ÔŠ×aZ 4Á‡9ÜŠ˜ŽÎ—›á<"r¬X¡J‡¸w:½Ìš”1‘åYƒ,×ö=:ìr»™-b{O`{zZÙ ê2žù’d~T1•ÈSµøã11cûú¡‚2R tÝ}¯¦wö˜(ž¡¤ù˜yƒû £Y^k‡ïäÙ»‘Ô.RYÀÃ#ÈJm¬Î耩:ŒS9m‹6÷v>‹«Í¦u÷~°f±F„œLµ¥QA‘€Ex¬5 0]½m$£­Cõpæ¶®ù§ü8ßõHR8’5£Š±…§[®lC°&Œ„qÝ€«ç’.—‡7õáÍîà,‰ˆ¯ç"Wð•5Ì2Ç…­âU„ÊWûÓ&Oz‰Ê^u©µ%§ w¯ »3ŠfßÒ°¼o•®±:œY¢ÝIʃäÎî„ð7´:\+ ³lÖó6ÈŒ‡7¥x/k.å¡t=º="‡’h¨ã{9 5×Úýº¬qØ£Ñ룽Ö·ˆùñi¯a•&eÕ²,„?6ù¾§ÙIZTž HÍ*0ÏVÏ ûv»Wu1zh‘Æ YÍUcÀiœˆÏ¸Â%À-#PÌ{¬˜õZ&ûóšnêñߨë n =y\ª–óæi`y¶ˆx¯a_A?$ß©(89šHpõPNçA¡—2Q¥áœ]9ŽøÖŽ9+ÈéP- YÏ0€+É;éàRÓávà¢W ^º]†çÍÖèééùrgÜÕ%B£‘&*§]uš¥yJ&r¢¬Zñ)ôÏp^aØ“F*õû8 ·ˆÛÞÿÒI¦xªþ2¼±bDîãó¡t>5ŒÒ¦Ù ;5ŠcûcgUTš…ÌŽäYáz @õ¿Ä“O3ضu-Äp"Æ ùzý@ˆ:ágH‡1|š"xç ÕS æŒ^GªßÙ~|¬²Ôܪš]»7"/:ÐÌUàQÌÃF?ˆmV‹³ø±»$5–(5ÝötNë©‚ !UýNy“iýAtåHî =Šå¨iä×gzš>$°2ã‘þàþ¿lŠÿ?cÿ×gÒâG÷GD _ýsÿǦ ú“€ðúÿ«‘$gøªÏëçNúŸ¹û?M|ù¥?à7Æ32ð[üÏ:>4üôøðÇøñß?~©ÞÙo…jí&ãš*OÞH)¾„tΓOÒQ D;Aýò¦_ÓÿeqzÖ£8×Ì$ݾCuJ“Á‘Ý£ à!ië,Ó(…JZ∠ͩèÇ€À;±ƒ^SÏöÇc)Ý~´uÎv…Ï€8™/¹aÙ BÖñ”Ä;RÏèjYdm°#Òàů(3l°«ˆ5”/3 ÷ÝAÉè¤#OÑ+ýÈ[ÍÑMQÝú\ïîpÜy¾²Š:2jGÝåñÆ…‚±¢’/jÊs¡ù¶ÌóJÈP¥š5$¼°¬$?¤ ÙgÓü—ìûŠ”o¼ß0^×òBÉ÷Gà§Ð€/6º“\\ ¶Ñ ]Ý›ýªŸÝ..úŸÿÏ¿[FÉêˆs=yp‚Óp¤ÓܶbçÒ€eöþv³õ«°Xç;4†XB4Ñ©í®¹äZl¡™}£o7Ǿ÷[ôQ®Ëß7$pñ2½]ö]vã‰Dß~ß·o9Þ]ï·ÞÞ^[Ø=`â\qº®u]Fî·Ü·Üt™]ä a÷ŽŸ.¶½ñGS/ ¶–\÷ÖÞ7@»bd²n÷½ý۵ޮŶg1{íþµh° v×=|Þ*Ÿtï0ȰN`€Ëý¾Å‹f‘‚xÏÖeo˶ôþݯ {Õôt×ôµ`¹¸MœBÖŠ^X çvï.‹uì¡Ïš™Ñ÷¿!w\+?öe¦«Žâ!„.9ÑŒÃVæ,þý€!×™Re]l6sPâE ÄSG!­jâbÊ“‡òŠZ° Êi¯Ý%ûÅrذŒvY^°Þ’÷~ß‘Uö˜l†ù{»gœ(—Á7ŵF Œ×ÖN‰‚‰¯Cp­Å‚Ε2[×u…|ü=zC™_&f`%³Ã·ßÛ¿ïûÛõF,.¨ø8±šrYÄÚ÷n`ÒÌ‚Mnt˜{WŽ'9¤›p¹nØ¢Œùå<‚宋”wœ&)0€ïê2ˆÎó÷ïïne*Ö踺ÚJ—s0Aq|ˆ°²-ÈqÃ×ñä¶Ø¨ºj‹U­çѽ´9ÛF™Z…9 ®} fðâ©ñ ™ËÔ«ñÆ–\]‚³ÑF½¤O‰·eæ³û9 ¾Yik}€¥­¶g¡%^t†Ü)7'n°•J%çér:yÍÔ÷k‚ˆÕW‹H\>{”³®”/ü3Z’jâšòOý¨ÝvŸM ‘N‘ãñI¬-CÄI… Z¯gÕìô–u<",œ=‡:<ñS0ËùµwÜ!ÍÈGK)ž]ðÁ¼Àú‹ÈöŽúã6Í¥Pøôf»§wö 3_Ð.•ûés™eßx˸՟]æùœe—ÎÑó‚ rZõgS´¢{EˆŽu£«ãÂOlC­Ub.Ö'îRãÅÚ¤ÄÖ?‚¡ž$sgå“ÀCК½rÒ]R¶X…Q†dœú¡í ×Ú£Ñõ¹MæÁƒ/1´°yŠ'I,Ý d;JôòJ‘ë4œFޱIzjMX§}Å›¶ØµºH›”&=[™Ò´Ÿ½ó”j½¥KP²ê)Ù‡3«GD¯ŽbYÎàíÿÎsF`¹†q[½|Æÿl”[H°*9‡¸uz†…\í9ËO­Åöƒß hÂ=ÝmµŽ×lÌ`{$…ò¸rÍÜuãEª¼¬|Ó:¤‘úígJ/°åŒÖÌMÔº Œ¢…š·DÐà~©ÙW¦¯æ>;PXÕ6ËÁ¤'±§õºN–ÐZ°trS` «»€sÁ/fjóžZìãRíýÊÓMèÇÇ¢… IgDÙ'ʘÖÈž§z3æ«—ÿˆ¦¬HÎp¾U,­#6Ö„øÑœ‚q#h˜''›Ö:Ñ]·u4kc(Ü~>NöÜ©qVuIŒ&æqOýä탸 ÷I!MäqÒÖžú©yvåö’%aCgîV7ÓijÆk3 g!Áã×™-Ý1¼ãe (“—œ†] ü«”A¬¸¦OÍû`]Ûãaü"°‚!ÏRʧf×¼4|TO~æ×±QOQ/BÿDûßâw æ-í ÑÓüR’ÿ.l~d™þôMá8²ðß?(ùÇýÿ˜èßùüܾº²>f«¾~a¿ŽúÕ?ùÙLáƒ@ù,!ûl:ÀO_€ÊÂò VàQHgãWŽó!­Òsu­!°0 ®Æ\„ϨÒ=Dù® –hv¡¶Ì¬Jɨ]-r —q;|oˆäͳr¥Í¦FŸÇB×'Z||A/­ÿŒÊÙÒ¢9‰ @Uý/qŸãK=\‚»×{{,A¼Ä9Èl˜Cš½H¶ÿT-–ìêù¨é9o’à0´ªþ:’X>Ècè VÒê9N—#˜Ó‚ÊÁЭ´]—)Ü%^Á½}û^F‘wæd¤?ú+àˆŠ–Ð19Ì0&›¢«ƒÊÄ~ IDATžf¸šåDÆg¼C•иÊá06ŒA =ÔËvÉ‘Fîí{»î›×…µìÞy…8µŸ´§sA ‚2ÞrÔD°Ý¦çæ½Ý—{·jÅ<&š'õš‘Ì*´°wD+°Ê†WNü#?¸¿ûZk~ĉÇåK¤<Š-c TŠ-¢]  ½]o—ñ¢uYªAX Mëʽ­Œ\ÄÛEص¾bÄáq뙯ôê:¹ŽrqñZ |3{».’·ª Ö˜+X6ö-\ºÒ¼Ž+é‚ËH7¾¿ßÂÛZ×¢ƒF7Úµ°.–ù÷èok™­t{o'»-î†=8ä›¶d Á#.¹ö­uµ­ ñA…Hg‹‹F˜ï÷­ ×Öº”è†laÛª23é»¶oHJ$ŽQòÛ±%w.–&ž—!%›tß;€$Ý[¹Üæ‡;Œ\ "Üq»gwÔ;A:1;Çêÿ Æ‘áŽ>XéN§>„‰*uÈÒò(T¶h-Èu,JÉrY ¡ì È0|o/…•Ûõ”‚ƒVD‰+°(?[T4Å„Y_1®ó“ññ\ žÁ²RÓûi•ÖUì}/^vØ}2Ùxµ[ïÐû½ßï_HX»Æ!eáŽå¼óÇVâ¾G<ÈR’wŸé±_µ…QËÈ3ß®\wÚ•G3j«x%d¿ •ûÞ7ö½·»ÖZ+)«fÖ"“#€À­á²Ôy„ÂáÚrpq.‘9·ZXf!1¾»8ý"bÖJM>@uPÅ ->!Ñ4y\ڀܜ¶úSö6y’ÖCŠÞçäðŽ ÙËŒ’œW<Œ`­•9ÄÃ{,±‹ê åÀ(,æÉömÂñuðØ?¥øK‘딄pÈUžA.^èzax¶}´³YIn‰_ºeÃî^ÞÕ‚:øÑb–JkVÄʘ_Óƒ½üÄzQZ‹£ýǼê<ØÛ™á©B•;Nˆ™Ëjã°tˆÊqeWMPÐÞŽ"â nÊѰƒ+…*q$v8uÜèÍ–²ÖŠ`kDd½GVéLlr3&Ÿæ»É5;›ñ4c]FøHæ—³#çAQElùspºRj$…î%­­ÚôÅãÁ‰DgkH£¾´E—´7s®°µÐ÷PG›4ëÃŽ­¢¹>1K.¾žRÄ9Óœª‹ô~«>9J' Ú]$#IàˆáN”_³x:J [ï‘Ù…®Ûí3ê©–|œy¬Fh“µvm»Ï¾:)¯3œŒÁ›pä$ØX’X±«?÷Ñ«‚•I’#Ú§σ¡cV.7³p÷Œ.Ïì I«QqÕSGƪ«÷´š³†Á}À<èè®·r?×[lËe}õW÷ô`Ëóä–ÉTíDœ(óKšº;.Å3b\æÝHž+^.ûØñœ€œ•)íóCXe9b&ré98Îr•ú. óʉ^Ší 0‹'!Œîâ>‡UÞ*g­èŠÑ©Ó­Ñw:zzES]EÓŸN¡ ÏJ¬fìPO œ¡P×±´Ë x6ËÛÃ%â!±æ1ù×uÐM:O©1˜ý›‚è¿Æž£-ëQ†ÎqHÏzf:ã vDíéÄÈW‘o«,DsZ4•úYÊzæ #ÜO™Æ˜k<ÄdU¨= è†1ñK ÑÔ‹*¹3¦‹¨g‡¦aìÉ­L¾^Ϊ5ÆX§ñƒÁÔ'`îî²à ¸>I@3"ð3z„~ õá€V´ÝñsQ¤oò|8?<`2þ3ÍùoË¿øU©Ìß~ýeü}?V~ûß ü3øù-8–¿å3Óg À/Ó6}9ÐgÓÓ_ ¡ð'®ÿG¯¯ž=À^ÄKFéË~ÝrÚ(-šç‡œ°"e!ÞgßT?y'?‚Ï2úlùí5"Xc¢ŸmѪ„¢çŽwíù»9ZŽ¡ý¼¬H¸¢¡Ê®eÕ¬{ï¤jenÈ1ÂÝ7Ù:o’+JOÁe™¥¥« P‚‘N½rÖ“n8aq½>‰; úÐWùÅd¹X¡!Õè4¢ñ‹O¯, –U_µåh9M¹]>ÔáeQö)­N˜\_âÊ4zfŒ.ñ"‰Ã£Ì}C{לãªéD4ºÚùßñ»Ä1ªjÚ­Àà‡ñP(÷µ®ëºvþãfÖ/#™m˜z„V!z2qU&ÉAEI[ ÜëœóYýÔÎ3ÆTL¶U ‘ îTL?ÇÖÑðÐ RÚŒyRŒØm­N\ÆÐš¾G;±ûaѵ¯´H*¯6Ió[~Å,È(sÐìc{FrYe·RÀß`ø±Jµ3„ Š¡°tS.uÁ(ƒ;(-eìI™j¼©Èr^ü±f?â°ÄZòÚvÏî‹”^ª#‰È =[yB©ËBdöèªSPeò©ñ »KSýbÆþ´”§Äå0êXÂÚY,¢÷ëÐf²9a}˜,5±þ}åÄÄöÞ‚iÆ”„ó(á›Çw¬áèÉéö¹²ƒ2ÃáY[ôYPÉỀ ÇU~ÐKSÝ$iú,^È”­÷îªdãLºœ%Å«½*®†˜ÕÝÝR5@µ½ôG|ÁÎëOeR4Ø×S\8ÞøúR¯UÍZì^<…|œüb|jÐérÏíY44 ‚l;oÕ9œ«$ãƒóÓQÝÙ^mQšÇãòÿ:N•‚Ä ºøÜ˜[¢›zä/]MuÔmê!:{ë„5ÿ<¶âh刌èœk Ó–æó:ÑAm¢ûÐe®EÚÓqmëU‘|Æ@F‰K[ÊFut^0Œk`ªô˜÷p.£YJ#Ýy»|˜TEÞ献“ÆÌQp Ò•­:êe†æ¬†“­_»á}©=kV»ÉîÌër]eŒå<ûæšyrbKö¼êªí<ÕR Á_çzQÖ?—r~DèÃ^cU4ÂtÀwgÜp³[Ý›ac³ @uœÂG `´3ç"ROtµ¹§RØO5§ô¸À}ªLU>¨cu±%7¹wü|Öd¼êz5Ð’^¾R2£ÆàÙú=ó.5Ý_ø¿½Ê1úEÉ‘s¦5%ú¯Ãüqð×8nýÜ_ÿ…þ” ýMýÞoò ûß>«ø“ø‹èŸ€ßø8Å_¼–ðAÃÿÑâgf-þò$–ýqÀÇ¿Ë_uû“/û&¾ô‘®¶ÿŠTö‚ÚØÞÖ„Šéü*߶ܼt0mÍ-Îæ*=´]“Á´Öœ©Á¡*3ùŽäŠI†iodXšá°úK¶A ¹ýMgo}@`šSê°ò±Ÿú>>7¼Yw9¶·¶0©Æ4¼öÞ÷ß9–æ]¾²Ï0E4^D¨Y_7ú™Ë'"È÷æµjÃZ÷U²q“kÜ»çžn¤“ á4,ª¯ ßðØ©oê²Å0ËÙѾå•5¬iÏwsm,,/—µñ¿¾]f¸ïMX€HOÌXäXñ¨÷ÄÚµæ>õÝð Ä\Á£~Ôµ²´(eRÁª¯Oq™ÅÛH¼׿w‘¾-Û‚€ûݯ·\%]ã—í¦Yg“SçN.«fà=Ï á©é’ªý»ÜiM#Nû[‰òô+ ÞäÛµà×÷½Ó XÏÆwíkÃÿ¢qÉ%3îªÓNÕŽc>iyÊÏJIâ²EäyîaešÒÒfq~[cÜ—‘«”( tß®-Ñ×öýþ¾)9ÜÖZv¡ôâ ¢™a-:D äþ~ïµZW I·•™»fë$V§‘ÊÇY$Þ´'7;µ”ƒè–”ÒŽ²äÍ• ^×›\®½wC†A“;ÜÞ¥‚§SR’wXXÄQ2ÄÓcP´Üq“i·FoÆñô=ƒúšƒ0Ú-íöh\t/ò{¶9VÅEzÕL ú–üÞw\¼»ÈIHw­4ˆÇRÀÑÄ ˜™ §L¶zX4 ”±ªèÅmkvüýÕCŒ‡·ù‘me6¿jÕWZ 11ž"LA +šƒƒ¢œµ@´[ç퀛{ÒÕÂqé¤1©€P²Ä~ÇšmQ€öX‘¥d©g˜B;oëäÑSU’¬<+àèNÞÌkXëtÅÓï’eÀ"_õ«¯7¹&n8O¥á6­Ëƒ[µ${#Ó8;•Á1®"㸓gs§dÖül¶f™çÔ#‚ühЬUæ‘LÏ“PtÌœJ„'ƒ²wæ:ÙˆBbNz» NYÔņQ‰G¦óÝÂfá~cTÝ;ùY±òú©ubßÑóh(Ùhƒîge›Nͺ²,–&«‡¼Y7ëX+U¡ýÄz$†\~D׎_—ÞV+yãÄN hÒÒ[{Œ*Vï`¡àÀ´†×ÃÈó¤PÖÿ(ý“æ9¶è—sÀFy”*¨6f¹µ3ÑPiö'#™¡Ÿ‰Ýa»wû݈‚ŸiW*Ýþ0ŠiÚË+[S -¥Æ4}»*ƒ¹qRÝÃsÃLA£­Ã-g²8L§L7‡n™÷ö÷÷-W¯Bƒ×Óù‚Ì‚º&Ù-;.s½ÎT°¯ÐJ¨å&ÖûŽÉÈU@*/3w[ÿùè¯ûDA¬$WÝΘOOÜ_¦ªu2‹ÜgÌrãAÎ3ÛO[€È3ìóú´âÈ—§ÑIl–N€R³ÿ·[›½Z˜_¬ò“ÍÓK¿>ªb“Å?Cœ0,)ž*Ÿj­{|¯†Ð”¬®cJâ¡T¥î~ƒSU¥Ú<ãÈËÝ—õKá¼–Åhï]hÝŒô‰û?½»å¯w÷9yˆ_\k­kͪÞôE2Y9(‘\¶¼´ìart8ÍkgÀµÀÄ© «<ƒfŸ›:‘†IÌý·7ÁT2¹ûZ«SîÙ­5 X©FŒ/R´÷¶­´Çü{pLë_1t”þ@]{óŒ-™ï8[8€ ¬Ò:‡+ÿ±uóŸØî#`=©ÑˆV\ f‘25ÈìTÂ)…¬óƲÂú)ѬL5yŒaÍö!GOà¢}7¹»ï˜3™aûFh”y1/CŒ¦šÊ-ÞîW;VÆy¯e UWöÿû~zÈZáÔâ·îhç4¨í½ŒÉ;v„yØéé' œ0ZeéàÞ¹Ö“"&i÷»åÛi’ "³W³°½ã#`ØYÓz»Û­ôšaOÇäµþE^4 ûQ6ÐS¼•2àÌå!üî(ý`}-ëÀËä»À•À"ÞŒx 3+"MÎË´jüžÆ$^饫ه,kvëûv—Övš9´!Jì µX…"†Œ;Ø¢‘˲d±ðu'õ½¿jI¡{øå ò™2ÓÝ ¤qQÞ·¼n¿{{o³}ËÍø[Å¡bTQ Zp6:Á°.òZŒÞeÏÐ}µú­Åc<Î0æš-ùí ¸K"Þ{§ð}¯ÿz[¡z;`ù!ÍÝ™ùJçr¬)ÛOchißo7 )Û á´: fpŸ³´¸xÌ20b´u•m3[IÏÊ„3Áº„¹kth¶¸Ì-:Ê>}¬zÊQì.†,攢-ÀÔ„"ó Óálw“ã aã¥ÜeC'’óB[^Ù¯¨üó+ËlÍ©ö7o×x†4>®ÈÜзW3«X!ºC2ÊhW¥ôpD®µò)¶½YvÒVMõ‰k|«ŒµAMY2iA³"ßÍ©ÊÇ„¥(ì‹-‚5‰¨ërÎ_«V¶Wê*»cÖ²µÖ÷÷ ™¦3>~á¾ïu­·ë ˜Ý÷í{G?sû ÌèÌ CæùtŠdOmu¼«)ߦŒB §!4ßó¸yƒ“ÅŽ»µÏDÄ B¡nky¤,Ë\Ûl‰e”™–-w¯êP³â•Ú] A-íÕ5Óð} }ø÷ rcô–ÿ@–[ŸŠ¹¹SDVlG͉v@Ç9î‚UM’…}ä°8Ò|i€žå†™ze ‘ŸHKèƒáÈáÀU_;x¢£7ÒyvPÁ¤¦W‡†ëaý‚Tv5rž0µ?‚4×0l¤*eMÓ `={‹²‘Duȸ9:cT˜/¤ªˆžxÂÑщ*SKlá0ì˜ ”¼á+f]¦•»(ÚÕ™C»X²ú¿|3ê4>×eÌGBKÁlÍ2†nÍ'›%ÀÁ@‰>­l•ÎDG|³þ+9>{Fú:Ð7ßd_èìíèmæ ã<Ÿ®~vë³Ø•Ei® §@Ècoìþ T诣0<ê%ù€Ë?‹Lk‰³³Áô”°ÑY]¡1¦êUf~òÆø¥ynèµ_8ÔÄ9â(¨°N.Ý3OZëŽ(€ùdvO‹éx íMêpÒÃ%zÊP2 >˜D¯š®ÕXÿÌÍúš´ãnž6L¯õ–XHÈÙ÷hŒ¶*­™|ÀœÕ“ÏÄÁÙ8Ú0çW£&èT™w¢·V“Ä^lf&S4¯FTÍ‚.ΙÎÖŸM¹ŸñO3ý‹gŸ?Ô¡+]ÑD¢‡jÿ̾¨Ï…8¾*ç.êrœú•KB×˧_ ¦¿òøÛN÷¿AšÿU™^ôÚþ“3€¿+!ñÏ?¿5ÓúCDЧ®~V”˧߿™^Ä÷a^û­w?:äƒÆ>|õõÚ“U…øØn =3œ¼”Îxs€Fð ªÔÑ4A þù+nÝW§Cò<É£þ‘/÷8JÄŠ‘°Ð½÷&bpÇ4cã¸è“á RXY¨ ÔF>Iýf¾·gQœ —Vq`9¿§¼í~-å áí®½Ú¦Ñ,°¶ã8µ×²)Ú™»Tbò‘ž(§§ÂA–ÉÄþ’5 CqañàádVÀG»ð(žüÃ^Æm¼2ÎËÊ´?Y6+˜«Cæ;ÞArwã’—c—coþ¸†*ÏÁ› nÞ`õWa]cþ?±BÜYÞgÏzÖÔfšT S⻢Á¶ö»ï2càF9zÆë¿h·%Í™fëÒ}ï{«”/T‰ôÉG@ ûfçQh)ìôF‘|é¦-wm±S#HaÉŵ–VMuº0í^ˆBaXØ<¥Ðñp;hnZq$òÀÇGy߇Šx\oû­÷Ïvh¾+,Ñð[pŽU«½½°0‰ÃQ%hX+.w¢e%²SÀÊtÔ5q-ÂŒ·½1WzøÆý]·6²6Èä×¹Rg¼Ýµ7$¬+UAkt2júe)0…è„ú{i2fQ¯‡|1„í{­%îßb¶e‹{# ½\;:‡Ëöjkq™ùÖ»>ÙEb]Õù£ ؾ¨Š2ÁØMéÇæ$´žofk½Á@…°6›pïÔ”=DûŽq q¹® ž §i´ËÖÞ®eë’e=FîQvçdËÉFèUv]殽3νO9|ùòè14îV#Ú€ïÞ d»LxÈÅEhï‡8Úlõ¿fÍ °àçaÊT XX€üw´sÂÀ÷ž´“Ö¸S×´6´fÒ…µ’̕ɂeh´õŒ³eƒ§råa#t0œÑÕ›y ³´[º(ÆÀ2æ([;™<Ö/´éFâîÇœ*ƒfI®Nç[”}xüŽÅ_ç»W±A2ZN´(Üå~²½cšÁ|ù±¾¦•æ¾ëìŽÑo÷¡˜ýË Åk7p§j‰±U(áÊEìí¢‰Z«kc‹kÞ™,ûlNå!ußïfë´U†:y‹p[ƒï ÐŽÀJæQëFÇåhmZfƼÍ[¢n4¹´fÞ¦¢(‚÷ä¶¿;qE̺@ÖÕ ù‡56Eyo4­¼6}Ã’~›Æ“ã®l!\g¥eíçë¸3)´˜y–šzL\÷Å v}yù‡uZDOÿ­²x Ç3®i,W_°)*yÙÓÈ>J«%ûÛ2¼™ÃäÖqŨj97Jl*"ʇƒJ§ì•÷`ÎäÓ§nGJ9ï÷òXwIƒµé¦Ê"M•“HK¿ÏéÑÔ €·Cõä}d‹àæñ3 ´AyzHN“: ìɸtœ$]Œå¼Í÷µ ·>f³PL}ꖧѳ£ÉÚ³ÖÑÅÝã<K·Ç¬²æ$^"ÿâÙ>‰µ¥ìŠ˜ÀµÐi¤±zã–¹è)f$e`.FYF¶ü\V­<ü5ö§O›õPNp‡GÔ$.¢…õ¾2¬È{nÛ€û>F…›Êâtœ£^ŒÐ›ž‹NÐYFš¨Ûê˜NOpP)È“½þ¡m<¯¥}´óÖi7$ÁÏëWÕß}M&Èã¼²cO4º«“3¦É¥V¼^NäÐ JŽ˜S[ëx,låP¼0>´4/k^—x ní± Õ’Ö!¶?ep˜f ïSn?‘ƒJ—œ‰÷Sب>“O·ë“ÿ/ˆ§eL:þŠþY„à—íÿ¿&F~)˜>iOò¥ù—änýΔ⯠þUÀ¿Ñ0Ù`ÿüóéÄß[ýê»Ér¹>‹ð³! ËÏèÒ‹Òþ¹âÿ¹°~~—?¾fh5Ò¾¼êùŠjãQ?ô¨mÞó]{þ€e,}¼T¶½¬Â³žœð€üHN.<˜|8{Œ4ØP´q½Çh²“qfíxl8ãüðCy]Ë}!{|è|I"<ÄåµÌ·ái4=[x[V;÷,£#FÚ·‹»-ØÑñÆW IDATã›ß.ߢÚ×uYH‡„¼>¹0°3 òŒåºïij£,®;È>4Ó-¬ÐÛºÖeéî-¿-ö0iKo´ËŒulÀì–Ìâw#A²‚œ„Ÿ-w÷oë”§go+è>ÀÎË!ÛVHóË¡eæÐBb?Cg©µ¨ ë¸n7‹lu<,–Âý­Ûµõývó¬N™œ†ì-ð2‡ÒCx-é+oCãŠ5(fÑØ+ÝòÅ™î7 “9io$×¥q”‡KËLg›¡ô\pß.çŽóZ§@}¸€òX$iÎ8+Fd‡Y»ëéàâÊÎ’Npè¾ãr!î-šÑÝh^òe™FÞê)×õZ‰ è®ï{GMáË?>f¯ šwDÙË@nœrÓ AYÖ‚œAM’Ç 3»,@d+>ǵŒÒûxfŒ¢œˆÉ‘°,çNX…-¢ù³,ù÷ý¾ß}ïýh‰Ë·’ý¸Ðâǽ„…—ƒžE9„»åz qBªÊÁÈSfX“pB6º^«&uûÖ–($¶<‡Ã]ˆ,4â£üI7×Û··˜69w¶YÄXº…­ eßô€p=žUß(Õ¡>AõN"gÜ¡Ä;aŽõ¸„Ò~ý8I{ÍiG[J`‘qb ‘õêa±SN6’5ž›[ç‘íV;.½‡$:¸Öîzqˆ‚Yy-(ÊÇ=›óòY¯ê5ï­&¡Ä¹%zë›eC'w) ý|lU´“­=CÊÇPqÓ¹Çìý=“‡™`q{Y>,SÁ-*Îûapt31 ä:ë˜ÏEÆð,4>ؤ3ÈCMš!að£ÌÉ Ã9œö™Jžóié¦\ÕàœïHˆ5^C9÷Cˆß„1,RÈÒ3 MùîcñÌ@çšs…:éâÔÇšŠxeœªŽ¹&¥ä²ùd¶¥÷xYè8Àè;u$à(ž¹/òÏ=ë¹^4Œg£Û‘8¢>ûa§Óa õóqFÓ#!‰ÈÎÁ9ú[*õBj§§Š‘õÁѧÙ3ñÒ>„·×+£ƒú¨¯d;ü›ø‚Îÿñ_ùE ð/êá•þ¬¡_Ó;¿–ãù+ò¨~Ók­ÏßþÂ+åë‡ôË¢8ÿcZþ&ðáóûçŸ_¸K~ö)ëçUO>ÙëêW[ø¼Ùô¤EþÞkÔ×õ­¿|#O×€Ž&VÛ€ÇâÁçùø¥?ÜðÿúШ0=í‚x a^™†: ~±vF8@®Ôj‡Æ9yžOF1¯´ùKoåRôžç³ÒƒÕ3-gÍŽúÐÿúÏîsßWÿ„j@£…ôBF¶ÀýШI±€y+B§Âuƹ¦I€LByušÝ1î•3t¶GëZt [˜>þã.Ý{Û3®’VÐlXaùi!ch0D;ç ØZÆØ:W^v\H ; ¢:º_ ¦S# p=1ýY›ê7àÚ«½Zà6‹öÖâI y9©ÍÃÿ¾Ùñö)f$ÔÆ:¾ŠM¥Ʈ¦"ç®(¤éÝÊ j?ÍÙ;ê’Œ~F„†7ðÜnrEÕo¦JÈ8 ¨µ.“%…´Ð[±-ö8|‡z’½“ØQ|‰®ë«„]ˆD m`ƒyœ‘î  |Hêž&>¹Ca›‡Œ¡8ÛÛ›±–N7¬ºêîxEAsÉÝoã7t牿“$0ù&û&õÅíänf³$#³Gqt,Ô,x+=/moƒ=Ø›*CîÊÐv m«ÝÒ‡Y¨|§1^`)çæl7VãJªcÒhv]‹¤Üï{¿»‡ð:›«qr…åRŸ F~Þú ¯¼Ô)̧E¶¯ìM¸ü²®oȸ Øñ®e ªKñ^ÐÚÇ.!Ca›\®iÌ­Tó^(7Öí ‘­ÐÀãG‹ÎÎv>s¼‹·YU¤Á·.0EÿËVt5—l-µ§X4§ãÄÊšh‘¯3;Bˆ·ƒ/ÖF@~_g²b8q(Š÷Qéfhâ¹OÛàÿ²w*’ôð{ØñmŸ4`u5w½éá ˆÚåoH‰ÁƒÃž =+0|Ä·]Õ¥I SjŽm¨Їè:ÜÍáHƒ²€õ qHŸiÆn†ˆr8Ñx™ -ùh†®rõäAYÀ»ž]Üd3&G‚9[26þ+{aè¬½ŽæŽ<øaé(Žü—ûôÍ;B‰MA%L,Jé§ÁÂ%¿»%{¦—ÒôåªíñÆlù< S®s]UdoªÇYIQ ÕqÃS>á¦Ú_6ÖäÀ¿AÙè êq‰u­ªøZݹÔ^M–çº §´š˜Ÿóbv›mx‘]½—H^+íþjsàs¸³L‹È˸Æà¬}J?ÀD[U0ºx=«<µðâ¥TM¬‡ÏÎcèt!DŸ£½D––ü™˜PÞšq­¸”~W7*]‚¹î§ÖåÉ'6¾ ÿ±„Sf¦†CÉç+·ÍñÊ÷˜* =¬éP¸Ç-#ASÅâx¢º§.XýÇ=\L [Ì—Qát8`ö0ÛõÏÕãn3%žeqÑÝòzI_N—ô¨RÖñQéF‘¥¼mñIv¤š\<ly¾Få§v"4[6Ì×Y§ARqµèôôÖ"ožÜe?üÝœæ°jø¶èU`7ãúT¦_´%œ#m~Þ³dN¬ã{Û™¤oß“^ÖK{VH„-ÞÇiöMxœDóùűøT$çSˆ öì!Ö2Ïâ Ô“k˜Ãq²ýÑg€íˆ~(¦«ƒ£ ýnãíì—rÌ9„Î!7œLýüxøíŒÏòœÑ¢V.o"“º2·ËZd85}8ÞÿîN8ßSxp•xD¦É_=ƒ–ÓfLçémAϰûIöølñÿ±Ë«¥É(è u8ŠçÙßN¼Öƒ†{N rTf/Ì‹Å÷e¿÷_ÿ¼9XŸ ÑO9S’HØ¿ÿáç þªXÿÿô¾¿øD÷ÿéÏ̯‡?Mÿü'ù{{€#ð20û'ð£Ïç×!ø‹·Örúâ~Ö0>|½†¨ÈO‡Sÿ,ø Gf ÈO„ûŽbã¤ûÙÏ_û¹øwÒàÚ¿|Qç3Z;3a;ǺzF1›Óʾ\sôè÷M×qr÷wH ®_k%´'Öv"§qó!Úö@ÓÝž¢°Œk]é›ð>~ŠäEe!Ÿ5èùºÔ83î]|›:Y”ôEmá%a‚ ¤A¨§.Ï\‰K1©éaîËPŠ…|om³Ú Ž^&;D×C×À—“:»»Ëïýžþr[Ë✇ê“AãgEÕÉHÉ'#Þc€T{«ÛÚN´Óß³ÕÕ{ñ+.yíöû’Õ‡;WÒ¾÷ÁVú8«ºÎŽ‹ÜÐrìnúŠŸ`7ö? ‚T&Ñã¶Y<ìËÌÙ;°jdvè‰%òàµ}é²Ê»6y#ºÓ¡´³•©üzÜ=‡3[·ûePñí—Lo%(0/ÝKÜØ.¬›0®ü„fÁ’zŸÀ ] Œ7Rbî2…´‰Ö)HûÃ.u…H×o^–~dòá\7Å©pÝYTê.•ËÌU÷Û¬TŽtpàæEØ¢ü=6Ûa kaûí~ßNÃe–3%´O‹”Y(ñ¾8a€…qñ(•„p»ï½¯7rÀ Ìì’oZx´CÞºŒÛÍ »hÔVIJýåuÞ3boYcn»Ö.Òëv9×õfœi^F0Y;ô£Y™`Û•çc_¶þeº%SfëfÁÉuãeÊPáN/Ë eßÝ#!×®|‡…;ëcsÁõ{3°N9' #´;¡eaÙ?œ¥¯ÅŸJ1Ã2aÜí6iÏÊîéVu vÇI“O]£[4İhµÏºc!šŸA;Èâ˜|$¾Íe\ä¿· pwÛñœrUí³ÅØKG‡$வhåà‚½šàÒÔ¦¾qÂ-Óm+šÚBnoWNaW˜Ù¾}<CéHJ^¬„ÖO÷XLxÙZ ®wßÖé­«Ñ+ßÙÌHdg²çhÏÄ-׎ÙyÍíðMú¡ÙÙµðÍן¥ï×[Ë:ü¾RúÏAsï S;•ÐÕÈl$ø"mÑv>^¶¬Ë ݪ^;zEÖê¡{Q; B¥Ö”êœéK1ö•ÛÝÊC:ÙãÞ® ´œÏ!áNCmI@:¬²aËÉgBðá'W![ë#4¤§áYÜ-ùLôµ;ÍZx‚¬³’ÝŠ™R´³ó2zV¾Lã•£˜˜…!Ê3ÍÌÖSpg">Ù´Š«Z‘”t¸ˆÅyÂgOýƒ§§-•ŽŽ öN öêbj…'¯Våf:í ± Än‚éíbκ¤4'B$œÂ s…ê3I)\ƒhˇtlXËTrHÓŒ&#®`+M‹SÍÞu3äÌVTÉ*9¯ÀVlF>éŒÖâRÞu~°Ò«Ìì͸ãÁÄc 8LêþžÆ—ìvʆ,á[½m´eòHÔùμu¨ìž¹Â  w±ÛÉÆ%fWUUÂÃÒ)ÏtþÄq%RÑkºX±Œ¸Ìòúöœïr]ò\-§Eã.»G€—\yJÑk…oÀel0 <˜Ry‡B2uïæƒZ™?†( ϹEÏ0ú->qªÉïWõ¥‘˜mICQå:“ÊC®#1ß|œqKŠ kæ§ò¸žògVc´IÙ¼' h&,‰o¦«Z–ÎF±ûê«Q'ÄXeX£¯&صÑì"c ÖXàÚ4d&;‘Ň j§¬žøHÕÓ’ŸØÿV­Æ¸8T ~>Ï&”~}“ÖÓÀ:%XžIº ¤w,M{åÌ"Ö '¸Á„]®‚˜ýaž› /ÐQóþpÇšƒØðø(Å”OÃzØ¿iÔ8ñ¥º‡øÉ>jÛ+W º›ÔQËLÈgÅQ#x×5ë܆FþªúD¶U÷‚ðûs:Ñc¢€âÌ^ûØsæÚÕü ¾ØE.ÿIýáÄæ¹/˜ jE~™@è0}º‡`/ž©ýT{ÿ\ågƒ>x(p¿¦ðÿÆ·ÿ,yð…™^¿!ÐÍ?¯ô”êgÓ…Ïj¡õû~‘1ø …ÿ/¨øúo7áÿú-™þ— ýüãaÀWÿ®/¢0ü"üòê°ÿÈÒù¼ Ëo?]{¦sìã_¯¶°ÏCšcv~RK€y}·?–|Dþô ûµ;vN…iöUÏò° ØsÂ90è #èã{x…ðºØéòq = >÷?,í×äKBf²óØi­DèGc­œ·w̓MìzdÎÈç0$áéQrد0»¯LÇÉÝ»F¼Ðk†|Ë;É>MâZ–L‰êoóLØÚƒ|u ù4‹¸šñí'GyÈB!ez?½O'è^^C3€ŒbÉÈ›q­øå S&¤¹òÀt—‡½¤'¡€ì6 Tß)º^XffÙÚyÅ.›ò2iå;œhi PUªà[Z¥ˆx‘¸Òò¤“)Ç<Šø‘kWaî…éÞïô¶l tßçï{UJ$"rÑñIU¦!´6?¤ ¹nÀßÖq—L–T$ûCöj³«2¡í³ô•Z-ù¿€ ïßo@y{õÊÊܵ]0¬šG¹pY•f.Ã;î­e§”8!^©Ñ&ªì²{@À ºçNÀÜï÷½™íÑÚ!wà[1œ1­¢×­rÀ^f”ÉS¯ñ‚$iûŸ^¶\Êò ×m¸Þ=ýÂËV(‚›Ç À*ò/Òl½-kœm|"±i ±‡½…|Ô}pÑ æßÿ½oß.CŸù°Œ¾IâZkhg‡ ¿T—Ö߸R±a¯G1f]‰{{æA¢ïnѼ­aB'«OűåÛ=ÎÒ«yS!mß‚‰î‹ËÌùr ìypÚ™h)ƬP©éÆé“ Àu-Øöh70»l ñ©jû^ÁKàT¬ƒk 7Q‰k–ç¢t­PÉý–ûŽ–äî5ï£M R²v9®Çmoï²Ú»Ý3V/§¤az¬xz9‡¿:]¾³¬ìÒÓïʨ_­‹æÖ¶e”¶ä{×{¨nɧ¥=û<Û]µjiHRšþdN¼]¸on¿=Lð½e¹’wAN£ðh Ëš8—•ÚÊ×.í𼛄 j©Y &›–™—*’z$ã&âA;+¾¢Äظ…e™x ×+¬Ö"½Z Âξ¢Þºe_£i> ´´8ý›•v¿ß…'ÎàMsª²²:3‚ —^Ãáð.H¶Âi” ¯@\w\·¬g Í„‰º-¯7Ê,n®Ç1ïàØý·=ÀèŠ@Ð<ù!ƒÀ_L>Gø…Ò‰Ò Å°£ÊêÒó»âhøS·Ù‡‚`å7ÅÌ‚Æ3gÝßÑ%Ó§ãêÐW†Rµ2)‰¢ÚÿJ•M²uHæ+®ÖT.ùP'Ž áãA|à<´lr 3ŒÂY¦Y”tUDCŽH5-uѵ3…âñ0pÅ4þŽ QZ(æt¹µ˜™Snøb´œb”167È„[öŒŸÐ bNO¦)Ç Ç7¬ ååœSôôšT S@n¼«¼2¤0>cÆa,uËyôñkÏ*Ôø÷”4ßx.›aŒ¯±=·ùÄ œ—‡‚ïkq‹ ð(ëèK ä\X2n/fŠX¸rHÒ—CL{*|úÇ["VnwïÑP´“6$Ë|I7&ä}R"­gÿ¸Ì\ 3™—¸ªü*q¤²óŽöh±î'h¢Æ¼Ž rñèÚÙCŽãJ=Óh‘CÖ–¥çZ#R¢×´É›ÝAê»V«çÊΦ{´ãI_no¥›=iv*À‘夰†p€°“í.ùC¾ ´`DÙ­¤Å¡s%Œ]‚¦>o<¬É¦$­Ö+±h³X+ôhdÈñ/¯€‚²Â'/pµý‡G2×<Ôs‚ÙM¦£ŸºšY¤®Of5œ‡€Ê×`Lo|NioFQ:R¯Žá£¨q\5¼­Ž=Víì׃."xNí4cä‘ÏÝ“Úô)ö½S"9jcxJ’xó85µÈJ?ñlبúLë6 (ÿÓ:£ôNÓ¸NW§H’F=u{D†ÇÆ3ú©|é¤éúá>Ð=_©;u¨W²ÓàXùÚUÕÐÀŠíúÌ -VžG^Ô¨—ÑÄ‹àaÛ=¨_œ^„t<”|&æk„"?Äø_Ä¿/@=Ÿåß |­½ÿ‘Rü…&ú QüÀŠÿs7ûëÄâÕØú¾~Wá×ÿßQ:ÿ¨ÿõóý¡×o}åO¯Q}–ÀçêúWWë³¾>å?¦®v ý‹ÀxxàØUí‹wð³9¿ª%à§ÅÃOÈ‘ô|ö1ÜSDD{c8~ò×?¦%^¿¾WWCÚ?mwŸ­ô¯0¼·µV™_&.cK’NñCÞè¾Å<®G!p=» ¬ÜeÉ[5«Š‚QLÐ(U÷wðí:T†ÔÎeξêæé7× t›L7˜aï)~wf?´ˆð%áø¶¬{÷G3RÆui]ÍöC¥¬oÝ4qÜ•ÖϘù„²×;–Ç¡ PšG"‰V–@—7,1!þF¥/Û‹«§u Áq]y‘Oµdð8“\‹ ¯^NQ°õJÇ ³á{ ¹ãµ÷öo ¡hJmÇea0qǹÆ2q î;ÖA’ÿëïuYíÎs ²ÃÐf+w†f¹©ìNã=B#ÈÑÖFuh[þå) ¯<Í@[Ú‡ÉYO†u:¬%ÞuKf®¢y·XzcJþqëî¾ÓÎ\g÷}¿û»üíÊ=ø–°ê™ÐÿÛ=í“æy™TìÃ)Õ±¾Yî©WÏrÄ7»`~Î&¬ˆã¨o}ß¾=Xÿ—-TêT’}ÒF’{û¾·¯eË*B’@oÃ+é[÷í\zÃ&- ~û»)»L·ûÞ¡AÝ€7ãµÖö ¿»ÜHÕLI9³âä©=&‰^T‹e mœ·t»±‡ÙBÂö½Ýòn1Зp×)Pèdq Ém™ ö"b8üLRTµf‰Ã±)æ™^îØ¾‰÷¸™¯µ®ëº,ç²Þ`k™‘÷¾¹Ìb•ÆBäEÒh\!Êäf’/{ºî*ÿ~Öìf«Ê·k›§ç³Ž p,*&ª²^ æ_ Íw/fwq½E¤¥±õ0¸´Ñk—rÕÅ÷1]Žpb­ßÀHÄšOq[aIVííž·L(ÁÄË,ÄŽc[pØ\NüWŠ“q©£Iˆ!eóíZ;ÛSΣ6mí3ªßä‚y³>ò‡Ý¾£g·—£àOÀJ왲›ÙÝ`ûr»³y±y„˹£ŸYwÎ6ò2¬|¸‹ù9Ù0 Ê+®ânÕä)×”|÷ÂÕÆý].§AXhÔŽLȰz~°[›+¬µÇÆ¡äueêô= Ûú™«FŸ»(X`ñ ˆ+¶{¹×S Je-á„Ðô“*اõüc=žï¦v…¶‹ÍE”X“Tïj‚ÊåŽcêèü¥…QõDÔB'_òZ˜j€$¯¦¨ÈlU·eäUO…ü Èüî·kgz-f*(z”#ôÞ¡ 9-#>Á1kG 4©¨^ßvR_Ä oæ-“,ñS0 ‰žš2†Ï¶Ô`Êoýì½k³É‘´Y îÿÿ’™L³te¸>Ä5»ûÈå+Íì®-‰púR••éáþx£\â‰{@)Ó˜u8!ª.€Ð+7ÇUË­AñSxŒsÒ_ìÊÌão]δ ™ *S[`¶eš m.Ç®Ìg„IFw4{­ÉÝwçâ£<ÝüO>š)¶ñi—·¸CsLf- ¾‰ÐcQR ûJ:êËÏœ@Sïw²*Î!„Œ@Ÿ²T†=Û=4UDÌ0ö€êÏá;è3E_‡Æ!¨¢Ý€‹Ñ(|ËÔ·ÑgÈZ41ù$=°u)kLøT´\ôÑ­ZѱžŠ®$žðDZ³ê-ÓåyÉŠ£°ÆJc+Ùöó.P”¾ÜJ/Gª…³‰9ÌÐø5öåV`Õ³¢ýäÄîÔ·ó>îKöÖ@é0R¬”wUfËÑÛÇÓ?=b=q(¬€qû”ÑQM±7ÅE¾3’yÕ—¡Ðȼón0 ž¥çé|Œ‡íq¶ SZÿý%ø2²8ÊC>ùðßøJ)ä€.üçdÏ_Ò†Q@þÅ ÀàüÔ½ÏÏ÷¯‚~«þ1H7ïS€¤—±¿Ç¿åËýMø4°úq’¿È¥Â9«þô÷~Ñ|"€ä¥°òs ×^S?y­ìÌ ¼‡¾ÐÙ‘þÁnn’ÎØ×|Bf)äL•¸»^r8»o³ø‚{ý< 8Js&p>ÆZ9w;vkM`iÙÔÜé-ýî=•êô–ª…õUê¯2çXΊE@‡,àøó{î×6C4'ïÛ!×É™<»*ˆ`é™—föÕV¯Û9†@j&èÓdŒô\2ÿ 3…`F±Í¦Íä·i£¨¶éóÂ*‚y9ò§¤T æç@«èxæ +$ÌMQ‡!¢^AÙvÌÜœ©ÌZjŒÍÆÝÈ3›ÔæÎ$ŽŽÏ9>ÕÅëz¨BÕ5!°!:j "²Dnˆmý u×ïýë[—Ay±€y“渰´Æ#^Ÿ%8À=nÖ–꘤e%eŽ©|K˜sBíq“Ï”S1¬5²Q ¬°D¸ÛQó [ª3ŒNn‘šRžÑßó~öeÈpkæuò'µ<)h¬Æ`4ŽD¢Ö¥f%±Ac2dfӀ諜Rø»ö]´ÓÆÂ…[•­H&bñ{¸ÛdžK!iÀÍ…Ò}"Á’FwX 3¨K4bYŽ¼Ä ÌJ˜FöwDÁ°mfÎC4ŠÇúš–1#7,S j97ÂÞ¤ôwQuÖÀ•d$’ ’‹9Ó³!¥ª›ŒTͧ›æÕ,FÑw”8IuD{‡€ª~Š()‘éOÎÍìX•M"I]žÓâF^Îs,Vz˜V8Ë`ò{õé~–“ø›Õ:êúÃ^rŒ˜ìJFû€džÀϳ‰{ÕÉ-ñLòH»T* ñ6LÊÛVž,‹Ê¯HÔ$@KÔkx¶õ¨…½P÷xVæé"0w{éyYæÙæ^K‹Âë PŠ ß©Æ³yõ³ó ´ïQ¨`HãÝ=i4«þ¡)§†=ãXµÙÕ|Í–Ý8ÔÄbÙ³0*ˆÝµF¾Áîß½„Åg ƒš¿4± ‡º1áàöÛÁÅi½hN5åôjæø&²žñR5r§ŠÃ†^!¿¢ñØú€ÕÕØYŠ<»–å¥Ù‘c>^B”HÍØê!Ñõ|XõÐÏð\øJöþ‘L‡¯Þß곺gä^üÉÏÃgà>ºƒÁæÃÉQ3 ¿AýÇ'7ý¿Ûþ5y‡óSøµÀ/жøgÿø_QÿÿSÿóg’+¿y’ôJØË ðㆀ·köMäLJ9+ ñâÅ™=2u§‹ÿC…onéªz÷G·_ ×1g ÓAß^LeÊ€óÓÄÔxŽ&ÐÓ…iÙ`PªN1Q‡„\kE'‡„9RÈF#_’ã‹æÒu­ëïÏÐ+S6âóÕÎ@9ÓS4ÁDúÌI…ÉHõ£C± 6'Ѽ~DÕ(0 %‡ùˆe¿Šºã¬ ›CÈÆu(¥z‘4 ƒ¢(‡úÌB)Ù”è161•»nÇ žvxe˜nšO†oŽj—l{o¨ö›%´Dg9$ØL@jñnò$âêÍ(++êÕ~‰~çf‰ã:v4ˆU÷TÛˤŒœ§j#r­v¾õÿE²˜1^qï}]*[Äö­¦é¡ä¸>rGXþ^¶HêmqE)ŽÃ¤48BiX9~:Å¢·Ñj‚~ éǸ%Ü"&43…>º.M­ÉôR.d`<>@Ìý*í¦ps©ˆ,\°’{Âÿz(€íÉ3†¿\ˆæ0[¨øäMÛ>“¹a*Þ£ }Ó: ÝmÀ‡»Ø¿OYñú/Þ·Ïm¬Þ~³]ïKxnÓiÄwó BzRM2âtP¢ }}ç¹ïým­½–’²á€\(ì¶§Þùæfq;Ïß4•-.ö¨¨ŠìACõª€ øÛ^²GÊ–XjÊ`C åN²½b+ø GîFƒÅ§yrJ”²š§ÕÉÉÖ Â-;0òŠùˆ³aß.@¯¥ÛŒ¶‘gÑç¶{—ï°pºvcÒ¥|Öµ—jô3§Üä}ÔæâµÍHŠÔø@ zÁ!2q¡èÉRÍkÕôb‰x¦ZšL¡Yé®G FVÙC(SŽAO‡I”²Tî¡j—ÍID¸ÖæAír½àÈ—0‹H_yÿð½ÍÅûGô- kP“ˆà•€Çò2άáVÙäå±jÚ>ÛiBâ2ÃB¶$»Y="P]Ð\2&ÛÌ ³!r©>}ÞV½(ÒQ–÷ÎÕ)“ ˜Ui.c1˜}VªM rëÁ”:_{-c5AtÑCÎùfPv–Žê¢”{ }‰Kužcó§‚…_AîüÈâEç‰y9÷-†QHâˆQÝÛV}ÿŤœwY”ÿ; ŠL,“ULaÁPF^w ÖRòJ ðMJ ä (ìÃ`kuÅVŽêÃÑÁ:<…ƒ4Ü<§Ä¿ø¤2¥õ§ ÕP½© ò •ªŠ¨,d5®/‘‘6üÿÀù?wãüé©>¬€?ù¹ÙUxO àœœ—󧀌»é«F¯oˆù3pþ N€ðE+8.€_ýŒ#ÂŽáS;}ŠøèÖO&^!)§óñe&/ãs¶çÎGÙÈG®¥Ë‰½f¶Ö’0°;Ç0,(°Eðt-½®ËŒÎíQÕ€kÙ’By9>Æ,ŽÜøêªæ—~„Cå7š:b¨6¤@ìÄFb NIží]èÐxì‹YEYx)—§\ÿÙmb˜M}Ït§(˜Ý¹¥ó—i)ÓY–¯Vf;ûc&fµ_í‘f£œ˜m ÁPjŸ_ߪ¹D˜ÍÍ þ¸ Ktýö³cO.‚mÒ“Ë£v"Î!Kå±TT³÷2C$)·pñ!Øà6·n¥«]IgѲºèR+oº;U^aí<âÈIÜF]ǨÅwÔ·d¯æX©B¡ÒFŒ›ÕHèŠÕŠæNÞD~‡ûËe)ËYV ‹¢²Ÿæ•TK1K^@q ½ p­´‹ˆìíýÇæð|qšÉöûËÖŠEPi÷m·ñRè•G²Ô ]:÷^ðȯ©ï¶4²J5¯Z¿¹Ü5ŠØ§Šl)«µÈpeÅvñI{xÿ@†Y|©ùþÜ÷M…lÐi÷K€ì^Ñ|Ô(yo_;Œ—ª¨Š®¥æ‚·eݱ MÉ]*·¥j¬×â¶Ñ@à–Ò=¾P]¢Ûv*´•¥{“ØÆ*Ò"»™ª–â!*ÐwF®l:sg E£`M/otÖº­âšô¼‚„í2‡ Œð³4èÂu©@AjÔ¥Šýñ‡¦¸·x&A׺ [h><³½ÍüDÜÙªÜ1×¢½iäR…¸ÊìRÜ Y*¸Ì¶äá6Zd£Æ\|z©†—PKÕvü+ÏnvBÙ÷]‹ Ä<Ö¿im¤, Â…Óm1pîþµ&N\&1¨>wÀÇ*·ï‡÷:b…î¼Ùô \ÇE®ïžD²mæmöažTQ “iH¼ð(˜ŒfÈ¥ðÇ­Q>¿ÀŠ&¶%ó=Œópi2ú¨¾Tf‘L¥Ðn fŶ½òI1'ë){h•ôÄ5ÓÔ*ŒË0Å’Á¬Çµž¤îâ'FW}üãñ"`¨%Ú³‡§dLõÕÆž(ÅÊ€) ¹Í€NÉFê ¤Ì-…ž1XÉ­¢Ú5žääó¼¤1)ÌÕ_Èñd…ª! F;r~o™“„ u…ŽL§TÈ4ÍÞ¡³»‹+ÚçÊ…0É|p¸hóU‡ Äá©uxdù¹UR 1rãv¯erSÊ©Ûô—ÇsÙmD!l3ð:ñÅU?BĘzS´Éb{©¯‰¨8¤É3CáSÉù'b`4~ÄÕJ Mè°p=•«ëä°óyásTŠH@q‰[«ùíøÉ™K´î #ÏVÛ\£¬£§(zUÌ1-A¡½zGò†"ùZúIw]Ä}-E±4Då{ÔªÓ~Áj Ï]uy/·_!–ÁÒøý£ÚÛÊZÛ¥¿ÊîŒÎ†t킊™×B·y'æB£¹xGô`UDë´ºF  „ðáU]u£9|É’Øj†‚P@-Z®¬H}Çä{7‰2˜q¥£A~z^¤®•ô»»s&$Z6hy©%Ê|´€YTµˆx #npÛ]Õö ¤™Šª<‡Ùm¤+0øA ™œë´U§Äžˆ¡̤÷¨£RÁ{B/f]ºÕh Û­åÌ]I͈‡FÚ+¤xãHaÝrÎç¿ß2žºÈÖÿ•zžK¢w÷bXãÿÂŽED2(Øô_Cm,4¾ c”xX´]öõ¿9j‘#ÒÝ&†­ê‰‚ÝÔn÷ØÜ'-ãyŠ!̶ªÃzjÎ}Y=Žãw´ñ€©dÁn!ìçˆeøÙsÉÚ>eþ«VçÙ~ ²1;r¢^µYf¨k}𔫎 ëÈyÉIb•†¼ÇWÕ­§*Ç¢I(o¼p~ДñÁªËCj:‡ ?Ô ùA/üÐÉûúwðO©–Æ6çÄâÈŒüf‘õŸñ©ÿÅñŸ£{ÿ¾1Ã_tsÿ=øôaòOÏþ™/ÿT‘Åg.þÊKCþ§%©Ó÷JnÅé1@<ë*,6Ê™†‘_ß" " S|0zc“X‹¬Î¿‚&mf7‰‘±ZõôB›}Q„÷²$ó“•)$CωY@7ÍR_Ë 'Ÿ4ç‹ÕÐy¡µÛ"38ÂÒÞÊDï×oÀ$sÒUáZIvLaÂ1XsˆuiðÐÜ’†êïÉFs{—söºT×›J6Lôú;\S#iŠÖpÛòا±·ü`â.5nªC¢Pîÿ4V—Üë¡ '#¼™”)ºG‹9j‹ŽçĤbþh2y²^)¯wJr=ãøá~h/k‰‘€cד$ŸoîRÄhèæƒ£béå1ƒÏ>R&™9Ævæí·,ø 3_¼n˜ž¾qeúÒ6å‡W£Ó2ï8-G`¤½aOÿ¾È¦Ìv;ö¸µ–ƒV€1dX¢G$œÍKSå< V)ÏFÔÓq”L‘û[÷,¦Ö¦Œè5«Mæå³•ÅÃ&UWØðÏåÃ5Ÿ&¨Œ ‡R5ñt÷Õ®yPÕ/Ò—àE gWØúH¼_~SØÚÅùr=š¿;Ô¸]øªïÖž4²8eÖEÄCH—y@þd¯>®Æt€q¾™þƒ'†‰/ÔýwH=øü˜R5æÀéÑÈ6;(²|ñö¿ºq9窽«®O!ùiž!æ›dÅ: œ:ýgw;ZÖí¾Súã?ÓÖKyÁFýàçÍ9âÌÉüfAÿn½þ·ýô¯%ü8ðöÆñwà7NUø‹Ÿ&¾þ­/D¯¯f?z…ï, /J€?ù¿bõ©ZÏ~¾uö¾¡ómÊ™7þgx³ä碫ÿª¯ÛËPÁÝú†ÊÏñÂŽWˆ-Äïïñ|Y/¤›Qìø X`pùŽÌ:BzOV  ªämf€@—l#¹·½ìÛóœÖ¾ú3g¯)Žã™Ç³„¶…FrVL8¼]D"ƒ»¡tßµÃIú«H„8RwKP]+‡þP3F?UBNkkš¸ˆ8Ú .´/3ß–Ù8•6öÔÌÝÜé­NÌÏ$F !?ò¨¾(~L„*„è,ò,È}ž »©íl-"¢NÀäÂ[ÆLäI5˸*eC(ÞNp,1?G˜Üþ-jÙ†åRú]x\J.iט—Ù-`û ”´mKW"ÔE.fx"¾[Åý·øÏ&mÛ ´)â^þØëûy®v_ÉvwçÑZ"¶²8O‹bþzDLdÓ6×]°`zÐÊ—‚ÇþìCÃÌuÉÍk^Á÷²$ùäÅ)—ÐÇÒU§#¼¹+K¬|ׯbˆNi¿BÂý´â *‹º·ŠØÈ‚l¨Èñ::Î(ÔŒon d{²üºyoš;¾}cj›FÞ¶W0Œâx½dAö½åi;öµVm  ³_u馡‹ÚV]Bé³~拪r1ø¨Sf‡Vž¥¹¥›Æ75:²vPÈ6ûãi×ÒëZ¹¾…ϺÌêÛ¸"dl–vª:<Ýg¤Ö’>Ú}G-†êZ0#÷6¨|úÀÆ¢˜"^ëRí¸ýã\^ ŽåYg›aç' ØÂ¥kBù~ôêõu«^º4:zͼTXðEŠ{ÎxÅÂÆêk£&Ê®Á8LùmÍ,Æ‹ÇÈîI±”{O ºÖZ¾êÞ (ÌìZ ­lg­ ˜8ï+d¹†bv“—Èu]×µž"w”²ä–•Û6@—êæîFÀªžVQ/8IíðØØä3ÉE…¾9Ö‡ö'™MÑÇ[Ÿ¢fH|“mû!‹ Gî>6VŒÂánZ<ŒB¼²˜þü®P'×ZËϲ;XPÑ‘b”UvTgõ·t ›¢'ÊÁ¤›ìSò÷§Ç-,g “"À“œÃÌ fµ‹ 1¦ –£´2úIÜÉ" fš¯È[NêØÈ(–S ªã& úv>/•éP^,UÁÁE"Xüát­£‘qðÆÿõ\íïœTÖÞ Ñ—%(’M–5&sÞ"£ãÖ0Î[6èÅ®sc˜õhÆHZuCæëð¤—e ýmÁ¤H t¥‘Ù{ßí=nQטèQôìš„åÐ3JÚývµKfà=˜öÒhxm[±TéÍ»[ÐxMMŽ–×Ò×$­êI~¶èkMà¾+bJš»SÖ³«ÆU3Êãì8zÕ¸_<<¼šÔj"EX`ü¹f£?ô%Zb-æ\2DDßs3ß;cúè«ÓKT2¯Ø6Œûž 5â˱¥*òúÊZrðó>áC¾"¿–c›¥ê3>ç˜!yìí‡ezÅ£§·¼afW¨Ñ¶™®‡^—ìíËFZµ‰¤x"‘ô‡eǤ<öÉ*¾¡ j¿,¾ÐåÀ‡ð>‹p„ Ѿcå1ü}ÕÂsÊ@ö )‡1•H¨g`3ïAÍRƒQm Šgñº¢UjæQó\ÿÀÙ;^UFÝÞ pÓe½$†yŠc2Ðå¨,ðwÇds†•c-\DšñZ®øH¹YÂ.p/7xéZ~Á‘< @»­€Ä‘õvé‡ã<îoÜ6¿ßOÊu=f¶e_Âäœ;ÁfßG"I¬BÛ¢*"K°£q"¢d« “Bší e)ž=~ö6Zîç–‡ºè;âÅJ®Èù;†‘ÂQ¬µè$îœl3`C;Õa7ÒzŸgP{Ò\i×´¼_qóh@}ãò…¹Ó :ìšfglüD·¢TŸBŒH) z¹»jgö† Ti}—{y®à~Þ œXhôK5…'Gk ‚3µòá™¶IÏX\ÿXÞ¯¬Ò¹qY9¿ ÁW|°ê¥ÐkϘzø IDAT!iÛª±f@ áÀýðÙjW Õc+Š_LX*j8êéÆI%-°Fä DEb^V¼„ÂÑŒ ×SãÀîÕ¦·Q÷Íš›:sƒlï¦4l×b8ôŒÀ“?ô4 žb;p옒´-º8½n}ÖËñ;6¯K² ‡Õg»c­ó(Í–†Õ•)kÖqŽ|hÞç.^ìNyÞã ¶ÉRx²{_1 ’äM^èöŒ®Üq»'±ÒŸ@ÕÎ Áæ±üYX!£2¾«Ñ †Ï!Tä¢ÅH ºLÊñ¢”@½öÁ!¨ O©8üí4ÌIH¹ÌÅrOÛ‰6ÁQ’?(é}]îJŸb Fi1Rw“訶Xñc ­§‹nÄX(#¦þ …ÆÁ1OOI¼„°…¬¼ÏXÞ,–-ºª4‚H(ç†K]…÷±i“Ö¢J³ ر#¼ª77™J4Ê·&Ê!Œ!Í]<#bذt¤‘׆ ´Êl0ð¬ë“£Y¤R5I6DuJ'ŒÑ%qׂ?§r¤´î otñÀˆåÈ)IEhSšy*ÓSƒ7ߦ6™ÝK>TÙhußÇÆ5\M¾Qª­Åâñ”?õ²þ­V)Žã˜`òX Ð…®È‰aòƬE4ª'1ëBй¦šèW‡å«œO!!îA˜Žðrþ–ˆzÍ1ŽNqZìq}š£SáôÙ9‚LÝõMQŒá'Á†‘PÑúš¬Sq‰¥E>g90_\£µ¦)¬þ(©îð¤–AY@Öb«v·û°œ³y2ËyQ`@dýÇ `õYI2©eðŠ¸œó‡¡KÀm³ú«÷IÛŠÖ ®ÏºCÁÐ1â)#;’‹éÑNö¡Ë€=mšýòC‰áòü  åArLo%¯˜»ÒÆyÝCEgèé@]3­‚j_a0åWÒeŸÀ»²þMý—YíÍ*ΖÐWÍã—LD-‘¹›± v»AQÿ]¾”õÊ= k² Ÿ^ÏñÉùÐwx)? ÷5 .пè…8FC¿fÝ~‹'üHÜ<×=¾M¢ñVfðO–üºöý[2ø4øOP¾»úoö¡Wõó‡ù·úÿ{ç9¿RðiX/ø¡÷ÿ?FÞûuçúW»~ñA|ùx´éöÏÅQ=:Ç Ìy{,j›¶˜þºáÂÏï•£rgAñü<úoz;§ó;èV©ñG²LûùvLJ{t½¼ÈðZÚæünßaq¶ C·ŠˆíÝ-uun#·¹ØAØóÌ€Ï F.Óïi†AÝÃhhDc•ý°Å•¯¼DLt ¥Œ‘Sˆ6Ñ:üç.–\×ÚfŒlÃÀ0  ±Š×åáf¸•ªêµ/ÐlÖ‰VIØÖùÿìÿLÇB(ɰvo6Ù þ*È Ã98âšé—TŠæ©•«vÚÚƒ¦ù±/€.±-‰Ö¿ö‹ðö4Ò“Íd‘aJRŒ[6Q%uÚ@åF]0§›¶œ -Q‰Â½E.(—B±.}|Órg<|u¨¾ˆláŠs¡>÷ýÍð¿ÿßß«5UOúJïXÃ[ïÍ¥JÙFQ3ªÛÅ,W)¹…ܶ.õ]Ú‚îpNËõPÊCUTlæ¨t-ÇñXIÍööúSÊê¾Zœ¶ùUv .U¯‰n©×"Z›¦â5‡„‰ÏÝ&0Ù;‹Ÿ+¦D’Û¶ ûʃ©|Ó^/@ŽN¿j‰ÊÚzgy×óFD<Àcyýè:ͼŠD<ø¡méZ v„i”ëÝÕ!ÜžÎDdAUù]xß·åHÓc.&|\¾­u[8øŒŒ“ fCˆÔ»téÃéï1Öd 4ȇê} ¨[ !¹ikß”‡n’Û8°Ü=·f›xDLl×tW̼b³ v ’ÛŒØâ ×Z‘:Ú”+Î~ªÀºF!˜ËðÖpl3®U¨(=2EʲÖúöx"ÄTŒª ,Úm–A òŠ#§¨¼m+4< £p‡š½RÊYϺ` ÅÀª•¤m–*æ=ƨD“œ“aJÇ1R¹D…r‹ÑâC‚&ß®ËBWÕÇò>Ò½·ù1n©êʛà f©w­Kå¾÷-{ïÑÆz‘"U´~¹ÿi‹-'莲†ˆÕ7¨:ÜD$M¨ŽD—íæõ"Ü{o‘MÕaªª—¥Û#š?xbémoAÏíC”B³Í½¹ðÒ!ÀR…ò"j"Û R‘°ú="·Ü›Q<}*’¾~ u›^q+Äu˜éQÕª?¼ í¾é)ã+Òï|YC.Àˆ}oƒ=pMpØx‰Ûv컃ž^^_ç_ò°U·ý¢›bÜ{K+3‹ÌÃɳ*ýe¹hMOŠQû± Bl ‰ÄWPÂU€ ü%Å£BÙ~E¯ rëÖ |ÂȰn eÅe—Ê©{³3ÌëZq3š/Ì,šz;4ã·Òdkª"ä“&P—êI¹Ý]¸)¡Yh™ôѬF‡ºl¶CÊ]ö4rß·@äÂu]±®´U¹€õXËÅëm1é\X\[ÅŒ]3?ß¼ã@ÜíN®¥ë¡{ßž;`AÊHÑ(M:vöÇÒ¸ù¤ªÛñU¸`¶é_³úíáèè@wH® ,r¾R؆dÓc V#àV ;fÔ+¬¢¢FÛ.AñºQÏ ¾»q!®,oÏ…êMâ *¦i±í`ô¶cUPÌö.ª÷Ð ¥ ³–Æó9þeÈ¢º(bA3£Âk(T™û˜–³0µ·ÅÃhïØ˜¨ËØL°¶¡ÇÛL¶ eW[^qãb íE¯›²Zn‹çÎ6Ö¤[Iõú5s„à}Ÿ²µ,ìm¢Í̃[æMU9 âáq9ožÍ¾úóAšgc÷©&©ä ¥º/*èÜÌõù9<HmPÄè·ê{ 1à­”±t³ÛTxá/©O@Áòö¢í‘<³ö©L)l‹‚Ù7+Uù®KvqrH~²,uýW:ìÂ'síÒM^E’‰\†·RB‹Ÿ3’¾UІV—"ší þ2´ Iáð…§1\³Ä` hR*fÙù“Uæòï¯V°ìôÛ¬¢¾Å«s¡H “ÜY½Yi º]¸>´huÖ˜Nq¯YN71»ßs˜=AªÚ$4/ñAãý|&‰pT>¶-¦'92²st韸á¬j(g);’%6eE|Ž^–*zhRùàÊ“6Cœ…É¢eƒÒ¨n•°5ˆ½S€ø|ˆ©ª9VÓÓÚ ªd…iWbt 8 Ϥìç6³hE—Žú1gPÁ&¨€Ð?—Ù¿-UƒîÛiÏN[æ=Û%¬Z¥>ýÊÊ`1E|ˆÐFõNœÀ´|áPö¦­â—kÍ8›k£8« ¬TïŽQzïÏôôTcÔÎÍ WNy´.ܲ{D%ʨĩhKXNj&ÓÙ•î,зàÃÔæA ¸yß¿žÑDÔ'Ï8S\ÌF=Xg÷J‹%»»[­º « ìÍm—㌱–.‘gtb·-ËŸªG¥f­j|³VËšN?Ó ¡\VDð¦z`ÕŽ Ldè.ã³äWÂM?æÇl:#°V< æÁª:vol%å4¼weöV¢Lò9)ƒÇÅ/5²¾"ºB²Æ£ÃL-"UGóng˜ÜÁuÛFmÑ^-ëSŒª;ï4ˆM‘/2Û ¿ÆP<•·|ŽŽë»¦¤¥A A@ ƒâþ³^ç8/¾9+þåâ9‡XúÛs¿AþËey‚€3ð£&€¿‡¿1•Á÷šŽ?õ‘SþÒuó ›?®Só> øà>oà~½u~ð-ó Ãk¯£U8ª¦³£ýèíÕ¦}“ƒ½Ó£}¯?*å! ?GÅØxkÎíÁ€[ÜD¡åÕ3O†¯¦^Ky|”õ0ëŽÝ Ëã®™=ï'³åÞ ìf®u‘b¶¨Ïñu,;†Ùkú€fNèx¹SŽgO€Q‚¹Tw¥ªR»~H¯îÈ¿¨òÇ÷(;ÊÚÁåß#Tu׎#aE.ËHh@á+¯9«ÒŽÇ $dذ`ö|ª¡ñúãžqqÒà^æŽ×½vâÎ3O3X0€XU>I4-֩ʉD°*ÌNw˜ycv3Ö!N:¾›è.Û=µc{Yçoÿ¢nÛ‹ ÅK,Ñdªz·tmŒ÷ãÝ4¤gò° Fe«¦¨ ßcÀciܹ½ã¨@ ÐFZWV£#@—ʽÍî{?ÖâÃñ)Ðê¸7¤ b“ ñJV1›C<³ðŠÈ[ô›Ö@ï—ÝkÓ·ÔåðN¦\.Û÷q›Û¶F5“[ìb¢n‘e/0õ˜cÍ=´9¥¦6ÅKt«fxÙ¬®-²HÚ2¹w4{‹Y‰,+ßÛîÛÄ? íÓJ¼:•µª0ù^N\¿L"ÜÛdµÀävHïú³]²¨Øwê(*²Þ U˜b¢­ ‹X+7±E.Ÿ³Ä÷(æ2¨‚Àê,— yUˆÄN*J]NžY*Ûú•™‰ã‰J—Ø&)^oÖ#Df&K!ÔMîM‘ç^Ëtn­8KêPFry‚ ¨Ðˆ[(Å>„ Ukß÷óû÷½÷¾¿?÷µÖµ°mÆb¨Ð(Aa#zó‹Í[¶¶íx 8¸ˆŽ –ð{¹œd¦lëT¦,HYˆÓ›ÙÒ¸ÃJ_mòYÒL¿Õ/w.5£©Šl±½)|š™mRô‘tú²œ"¨‰b´h× ~¢âý)¬X1R4˺©:7/•¿Muè:Þ#XhÞA£¹ýÒ÷ö…ÀıØÛ`¶U•"—"冬”ÃòžMÇ¹ÆÆ¨Â{/–pt¢6¶ÚUyá{Íp‚,7àF;©k㵞õ‹æza$%éÆ3Šöz: tG§1_ØmR“À +xÏ}Ö|éQ”Ëè Hó`äÉPù̶UλWÉ Ew¯Z7w¬‹‡=Õ/c\Ðß-[ør`;¥ÆŒ¿8 )öP)Ëø£Ä¤;ü̯† rC¶j¶×@Œ±òf”óh¿âTÞ&™ûÞ %´xõÛånç¥s§A7ÿx»Pz·ÜÖÒvNÌÍĂЅYÍ*ÜôÏ{‚J‘‰Ônï£|¬Þ¥LÙšP‘п£(BGAyg4P¦ œ‡ ЬI¶Î-)áã|dWêÉ`R%+MîHå7¼å¶—4†KQÄÝ8B}Á‘¿RÀµ¬¢8¶Ý]„P¹Ô6EÈbó²¢ á„fû[’Ju Њ]R¸ñN„‘yj¦)d×[,Ó©èѳÁ:D§TBD5}=d{ì j,O§ˆN`ižJAåá°A£½éÖc)Z•œþHì}²gäü|ÈI¿’ÀÇ­éàÅq,ËLRfRªc¼ü^qdæèâ|3=n¼ÐŠi‹³yÑèJ`…ÂÈ ˆ5s”ä$;‡/4˜¾Pa%V½MG„G¾{¼j¤+MdûÞXFk´¸ Kª¯—¹äÁo»#ð/Å™s‹%]\èô!»ÙrÃb×ðEKœqû2o‹p¶˜v콨\5À;δí”MÙv§o ÃÏÍól¥”!ßç§ÍŽ  O° ³ ®Ïcš.u»Or0åù¤¶ø´ð¡D…5Žë ò¼ûi2“¼èÔ“}Ã2°Y4tûTvÕÔ‰8##^õò–ÀÙÙ£¼Ý'J†­Žo”ìÜ®ÿYí /ŤJ}m#+Ì‘»ì±¾8gÇ\àU|#ß*UË;ÞÿÅûIrÿpøOé¶/Êã§ÃIÿy1ÿG<Æ¿ø/ç_ÿ¡ÿÃ9€ÿá6¿ÿùÓwþÔã§àóß¼Ë&«æ«†ï/|÷£¨u ÝDŽiÓ>ü»¤vr_މç0::d!Ð?.5~Þu•0@.»ú®Ôçao>h‡=¡ņ*ö–yzUÌäAÁpêQx…g:4ÖB%tn­ŸÍÑ ‹×ÿ ÷î?è;h…êZj&"KÁåÛ"”óó%ÃŒo*-Ø<}½ÛÄ8!®µÒalézséXŽZ«”p¢þ^¨ Ô,¡‘µ… fº·¥¡/µÙ•ŒÁ]ÊL!3ñàÄ=Íåy‡E2MÎuMš N½f:,ÚâÔ—Ù6:že';y­Ö³t¸Òx]×Þ°‹yœ²8,t—ÆPsƒ¬áîÒÞ[fÚ4|“BÛÆµ"À×ÑT†¾QèÞ¥ŽÍGŽšïYoÊ÷Û䥸+.},‘­âØÿRVTõû¿þе¢D“îÔ][2Ý>:Ù[Ãø€Aéð’§¢±Óö}S¾ÅÍõ éÊi¡hé²ÑBûzâaëܺDlÎ6¢Þ/ëXêcÚœ¿Òh¼Õ^Öpψë+€õ‹ -ãR5m¯lÿo_GBYRl>i"ò *WL¢Sà–Ë·Á[Ì ò\*¤Ü¤3ÄU6EM ”€³hOÛ•K×vik[4¢úéHÕý€·Ù±J6í¹} é}YÛDÌ#)K”š‡¯l\puÞ0 kQ)(gI§¥P*p<\ì§ð¦ùóáÒ:ij`¶!ÙfK‘Y«€¥eŸŸr[»šË¸ÙFÚhøã1ã}o.\XXzùû0oÆxqmƒ`‹gŽúX…Àߟ7ÌôûýÜ۳귭 rAÌÀU'ÆÀVc"÷Óž{+”f·Qݺ«òi¯Üb¼Í¼ZüºèB¹—:›ËµªBÜVæ®bÌ'?«ß-­–ðrgŸ÷¶ø¾ú%¤Zçò‘ÿ$ƒ€ºÙ%-6œ½ 5F´]„Û6n®z,mFX:ê-mÇœÞ5‹tWHkYÀ!·ñJáΗ/_æ£ø;žAk°å|TÕ;'À‡?9þ0P©aÈD5kº£<À6ªº­™oÙú¾cM(g\%í ªKAr§ %‚Ëwq½ÄãlAœa¾£·CëfÞ94!Ù¡‚ù(˜tCÙå‹NIȱ85%gqIBË-,æÃ*òdc“]4g´Ugk{/KˆPƒh+Äh¥kñeô™E£Õ£àÛ†¥° ’EÐÉò…È8†ÕYììX¸g ·hE`z¨_æAØÆÈ=f ʇŒk­CÉ |y†Py  JéÝhm· 4X˜k„ô–á”ü´=îEìs3y•Bçʽ¯¥9Ôj:ò¥Ð]c÷›DËÛ}¡MW§x%ü%i,‘CÝ4½ùÎ ·”•ÐÞXiéSÚ ‚üT †îëæõ5ź”ÍQ3b³0(§§hö¥ 1¿Â4¢n UÔ‘K¾¨h´x7¡:sŒg–žm²¼ °JнëãÕ1<Ãð슼'޼ÊûŠ52:ëYûR©†#N2%z·ön3Ut§êã((ð2¥3*¾½¨ ¼L;ˆ¯´¼´Yï0}e™Pû¹ÎôXÁýl¶'È¥Ð^ CW´¡öEDi±2Ñä`z`‘UÿsäÐô´Þhçn•i•‘©ÓW©u–õTÇhNVuÎÜÞÊÌjÒ,+îS>·ÿ—g¬pVÑeâ¿“(ï4NˆCS艹ˆF§lQvPòl@3ؘ¬¾qŠOÍ"x‚Uº€!Ïæe–a+OI…ùLøtCÖp/ñ“²Ššæl¤4[§PUy2œ>§v@MdŽä…ÅãdW_Õȸ×X€D\¶êX¼ ;§XùôÒœ:ê¼*‡ÆËC+çõY­¡ÞåMØ„ý‰ ÉXµÀy8²ÁL9AF>é,éåQKÜ öã&ÍýEŸ¦^ØÐ£Ï£àg«.8`kÓWZWô»á—sŽ€u­l«³ÍáÍòÓöÏcò¯ÆðQäððâkY¿8!øO“®ÿ”JÏÿ•õ_ T¦æïÀÿÈ ¿’àg@ÍOæT<[yÿ©{r>¯0朇øŽñfì µTëP—ÝS^#òš,9þ’ VmÀ±þ”+ªå~¼7Ç_|f‡ó(³ôò9â$Â0[x•fºÍÕ´Z4ÁãLóóI>ŸÏ’hm/®<á0ƒ}¿{_«\·Cý©G{®?þ-ßç-ƒ,8ë‚9¢ þò]þ·(ú½tµ#kb Ä« ¢‹y^Ì•MN*LSºD•û¤öù%Ôæü¢ÑSUÍèqÚ Ç¼Ã}$é%éC#IP©Ýþç[ý£š£7V2@[ ËMgx3£ÒW¬[ª@0ÊåÐþIÔÿäeÀ"3ÆyRfë*Ñ*_àò_›¸Ü(E;o¯Z âº6zR¾£¹fö…¢—¦…¢ºë ºÆÛ¬éÎ…b€jŸ -ršR³–.µp–{TMç7p#9е ÷Qšáû»•ÿÅL^-ˆy- ,5( ôVn#Ь£Ð¿fFÃY⤽ÔEl÷D&Úa_¡`‹ËsN9aí¤U Š…u=Âîý„9H„®•Õx£Fà “o²d%}Hâ¥hc€c|d-îMèºÝ·m˜¨šH1?²£]Ãj§qU¹kM/U—`NÇgæFJQèó¥o“ Ä‚oÊ}#\À‹Ûà"ÒÝàOÚ}ï¥Ë™(²Še6÷sP¶¿0»¦iN¬‚—ºŠ9ÐZEU%Ц¹c½QT5î(‚ò”{s›­oËmá¶-‹áª•æ‘÷åm¤¾\éÌEÉ¥*Cÿ ç[œ}Qt#¿ÂEnÛû¶›Â§ðÎú†cÎô~M3–(B^åi!àD†Å°ÁÇŠº]_¾6ÅgÉ+ùðwZ”ÑÂ!KEdéòêÀ\¤+2Cýk$ȺåL–8“4>i¾è.ªŸÒoò1‹¤ÑáÆbUtln3O‚8•ªÌÒu w4w¸Ñ£z='ëf™\CÎß-éF`º2Á5òFnYn T}¯q¹ûuÛ, i¹5aÄÄØ'Ï`Жɉ6ϾlB’C¦¯Õ‡¾²%ˆ¹–ú›³h2 Ë£«?Ö"?RLݲŸ{±vÚ•3 KdEÃ…¹:§á~^3)Âzn›¢ÒáU GèMÜ  Z1K­Õ"ùæoÊ•)s²çs–ˆàlÕå ®X¾»yó6Ôfj6=;]aܽ=²n‰É‘Í}XÕ­q72.=줈9Ôæe•b*ÍY¼^øà²h&ª<¬©'lÒ¹Cs´š%¸Gª±¼Öo %ºà\êDô î\BÞ Pw· ^ÙÑb¬Ín& IDATåNPDd1º´.²$ hr¦ØzŽf…A:ù¥qê@”³åT¤Hå±<è(ÔmÁm0ÆòJg‚IC«D.Eõ)rí¶li÷-±÷—Á¾`¬¹ª‘M ½d› Ì4z©e÷Ï‘aÚòûw[ìn8!Ì»‹€7­c"ð&hUçuŒVYîü¾NbÕÌìgJ£ØùnôQx”r¼~%|1û³©óð ÷ã¥ïøPU?”t¾»ýÏÎÃÏ×I·ÖT—²üŠ‚øY÷çO¥ÄºüÉó7É5ä_Ó–]¥üWÿô¯ýÕIÀ_ýÛ† G=Ëßÿü Ò&?©¬8ƒuŸüû¯¾e€¾ À*>]àgm+lcyàS¡ÂR*'§ýúë'@ü6›"ó“Á»® ÞBnÜ?€„Hðɪ.â9»ç©ïó½Þ¶Ÿ ¯(òÓDÿ»·.‰ÿêÜžÙ÷Þ((Ò´É#+ffa\¯l™eˆ"3uww:4’ÞPQ„h´ï²¶™JŠšRÕî¦låÇlý+“‚=ÚD´™ÀÏÿGŠ"O31ªJyDäˆF÷¯eª‡F[nŸo ¨?@kòÎÌupǾ¥ÑX™·ÓÆË–+ÁÍx›½³^ æKU(‹ÂÛ¨YH±FiLzÌLýðÝ¢¬µ /£dÅ%ý®¿í)AöO*^—† ~Ƴ랃 ¦ç9fÓbù°T+èGÛ›]D4ÆÌl u´¡õpïK¡¨(küP5Êl'¥ŒqD^­dÇì¡uIÔ߃ù#p>‘€›ÂÄ.gŽ€nì`á7ÉK—,u…KÕhµÜí‚P±DáW>%ÄaŒ ¯ªV˰XÈë¤åŽïÖR—ßÆÐ’‹„€0ƒç„ônÞ²*—iŸ ÷ˆ””OÑÌR&,3@`dN50« Ûb¥[µ‡qÙܺ`ZUk@„š9|§ÞäÞðû ¨1Á®²ÓzÙ§Žcéë.'¼w8ýµgò‘Lji¨ÏÕvÀZ Ë·A¨ù‚–Ÿu(,>Ž<@høm#³åC!æ¤èyÐgÔœ¹Nš¶tþŽÈ”ш.tBïIJƒ¶ÃahÐAüÈćìòÔ÷yÁÈÑòŠgºÀ€àÉ €X˜x£¬¥>,qDÝçñ¹k5­¦*M_E͈|\›—è*˜¦öx%~™ÕdÍçèì5cgKÉÊÊzTS,[¯õPáTÂ//bAøÉ8k©Op-ºÊ‚c/‘à÷!O#ígô‰w„&8FcªÕ< ågµbj™*Í—Ì/ß/æ¹ÌåÄ2:oo‘Ε›G6ΊHÚµw°‹¾_^åèÆ@Ñè¤äÝ–/m¾ßÉŠ°é‡.Nr“OÍûªì”gê´Ô‡¿,cBeGû1’Õ;äg—&ç6nÔº1NìÔÒz=Qºyì<&F‘aGx™}q{d?7݉öÙ÷ŸaÿÕ­ÿ¿úAG³†´ŽÖGŠV‹‰ß«à€3‘sŽeYï™=W±½V¸T”éÔ`-ªƒKÁ—wP­ÚäÔ>§6òZ°;{Ôßb2ïLyeí¼ÿö/4ùOÕ?Sªù§åÉ/Ã_™ýKa¾T$›Fÿo˜¼¿áw®ùÿMÿðoQÿ?ä³ä¯_Á”¯¯Ç7í‡YêÏ^-á¶Â/cF©p¢ø?5®”·ÝÐôaèñ tð?_‰ñ^,|ºûc«ÿanqâƒð².ŸjþüoŸÍ(x‚ªo>ëe\Bª*û„E¯Cú'_£‡5¼ýѹÉH¹žå¶3³HÈ$W‰MŸÿþ½m-EŽýs³îFÈù…b²ÄK ÎϨT}}j!xÙ^[iŒlpq0BÄö³¼ïç­ÀÅÀ9Å™Jë|^¾…üqåԿءޕ{sòZÛ¬ümo,Gp¦GƉ ÀaB QÈF¥.+âûÛ¤¼J6Ëå(¢KWO¢<šÖl ̆eáƒ| ¿]àÆåE§‚‹üލßR1÷UËR,ÍžbÂ"F»7Õ1â~pUš™Xgº ~ĉwlàêˆ`ͯîp)DÖZø¯Çõ}›=¿;·]€+]Y>{`O‘&¼G8R¸T½–ª*7³…Â\²QùìåËœ—šGx)äE±ŸáNU\°Á;Ê 4ü ýN»Í”Àåkœ+½0ó…Áîm"òíÛº­³dX» •Ó ë¯÷•·áyU1»{ï¥Ø~÷n“®`‹:ˆìN#D—¦Ðñ Ó·o‚å,O ù³q©æTêZ B•“QËz`ð{¨âòÈàV©¨psï0–}éò¦s…šÿøZÌÌèÄky05™s ÜûæÞª²wù¦Ü Oˆ\$ª'^îc^qBÉ{#’Ÿã8­pP9Tÿk-_ÍØ}ª$d‡fÈfâIÃ…fËhûÉ“¤BóãaΈµ7oûÞ\Â]eÀ+¨ÚKlr}×¶¢ka-¡™îl©Xˆ•gUR|‚Ußðu“‚8-:eÝpÌê¨ñö/E  Fôá~3ƵÔKa;`Ÿû­í†ÑÙâû½÷Þf¾t¯Uâ3„7Gõ1ù¶ø³­2ذsäÓ6ùà,"¯ó>o†sÙ<‘šºÛòúvžÉl¤¯“Ñ´;$ßÄN.Šy¤ÝFµh>°ìƒ%¥–¼\ÛôN’93ê«b½"Û̇=µ ‹g¿”;óÚïξFž»Æ27xçqovC (ò «+!²n5öã‹oUý3\­èG^“Û6m-À65lä¨c¡.]™I\@7,B!²®UÑÒ-±Àò*:náuäÒ“áWǸ>Q(ìÚÒ,[ ä‹ îrº»ðœ“hµ‚,h£r¯  ^uéáµöÞ´žù˜máÚÜ*R»åbkë:ìÜJÎm—jP}J=1“ÇÊ4Lƒ¹“ER´Í•]5Qã!kbi,ØZ¡þëÛÒ<äñÍ j²¿—[X°OT’Öt*É ‰ÍgzM\Š$\hЧ²z)Ïò©a‰!¦ØJ Ëeg)L‰Ðb³±—%LQ=èü¦ÐRr^¯[Âáz”EvD4¥c k bjÑG›>ŽŽ«/‰‡EEKêÔÁþˆºb5éþ,_t,À(§½¿9d4¨â§€,VsÑlÙóûÎx-Ó f)úÕ’¤Ñ\:-¥l ÊXˇA˜,˜1K.“ï¦(†N}ü;öºè9pª\©6ãËΕC·àö–.ÙR¥qBY.6;'º`sÀµÕfr¿Ú{©ƒ£-ã]Ô ],ù~1ò"ÍÌéÞ–-³…â(‡Ém¬oæ£È, :2›Mƒœc'š>Fsó8×qËÍÕéõe1½ðRz¶«Aåù‹­š’3én„­¯K{o¾}¯~²™:Ûã~H„Ñ™á,t½íµ°òì‡év»_ÎÂðcouÛ¾]Ñз‹A»¸âeA¢o9ü®ÿ}ûí·ÁÆsÊÝÆµðÛ×T⬥׆foÆw¸É0*^%~‡È,³ë²¯5m¸©Ã6F*§eÖnÛÈFØój_Œ#xºÝ6¸¸.3Ð]~ûþ_?~¸ö·Û:Í(ŠÞjúfÕù"J #”fÌxhÅPà;hËì·B{­ß¸}opÉõ0/ÚAÌÎD¼AÒ–nßîÚôßìBŠî}ûvÃʧZÐ|ï½w],}¢q˜°·¤%p™C¸ “,³ïˆ¡ün%á>çç…Ô”Ú‡;N÷.ú®df_¿-#××òûþqß$Z‹«Çá…嬕7,~€"ÿš‘^ìípmÑl­‹+ k­‚|hooÐo¯ï°Ò³~{7½ô7¾k×ú¥½‘Ø9ÿ¨æ[>^ÕõÐöpÇKó2+íôgZöAŸ-©¥‡Ö|KŒ KªÚÆ}º¥Á•…˜ Ì¢IÛ–™K[‘oY°ÀN䇱W>âK`Py.Ô} 4sf +›{\,*5qtsnnw?~]Ð@¼ùsÚ£ µñû¬­J| <É,æN:ä¾#ARU«O–¨²*ñpÅy„wÖ`V7²ýEExêUúP•ˆ¥—4ññÁ·Š3ÇÔþ*;táÊ<%˰ÑØœvón.“,‘*¾&ËOçÕ1]–± ¬UÐé–DY ßN»óÖuù WõÔ/§ù×\ :æhK£ ²yˆ,ŽÀ*JÚFô0o}Šò€u¼áY å’°¦e–§oÅx×ä%Þc»¬Gáê°…W`+?fÙfO뱺(NÉË Kæ'åamõœaÅ83‚4Wõõä½å–‡óI1ÕyôãB•9qæz˜X,&[ àÅè Ê¢§ÑŒ~WÞ"Ò ;|°›³tбtÇM¸«$!¿ðäÎGÙDCÒ³C¼‹YLUXùÁ£§G ˜»àñ(^PžºeáÌN߈儠DàLê΂ØR êëw9qýSçGÙ9Êë0L‡™_î¤O¾oj3|F£8¶ÝuùãÕ30ާÛûˆú©=ÄÄ·±jÞ”¸Guz!|6›IuÒø<§ïü)ƒÏ–\¾HÿOg;×pL½³œ9NöÃ.ñèHÄk»@¼6»…ºNDC‰4ƆÕ‘xÎL0º´2™Ëù ή’»üXïLòþùö¼æ¬^F åÓýxŠÿ™BcvÞ$;~û¨™Ç::ß0üS>L\<‚µŽº\|ƒPdº=*ÿIM®µrƒŸ¤ ¿Q¢ƒØ;a„î{ûv÷õˆ*ŒZÒ ?¼L¦ûšƒb­ìå¢4ƒ¾<âx˜ÝK‘ÞgO îhƒÇ}›’x)|ã¾wpŠMƒ n GMgVŸëÞ^îÆÂzx¢(?Ó`”^Ë4,ØÄp&ž”x‡í›äu-š¹ßmÉw»äƒð¨ž«qÒ èrÈ¡~œ†î²áíÊÌeòiÜäcìîØ:‘iCŒö{™«¹£½þµÛ)µ²²¢\0X¬ë3½•”©¨¦0®eñÍâÜEÏûò:ÛKïÿ¶‹“‰Y¶hnL-l–YdWìd?,ã2ø=/í$"×åRÞ“>.ײԣ°¡¨mXËv%6dî\ §¾R>øó }c»ƒ¡õ=n¯ è1ÜBÈÃÀ–6(w¿Å…/#×è—®ñBc|Ä–å~ß32 1 ´i–Žt9u8ÄxÜLîÒ-Pv-3"n„íIO2ÚÈï¨É¾Òk]!ú£Ÿ‹ÇƒðRøÆ&ðw]V÷zªšeH–ï½]ZÑâÀ 6í{»k]—Õ‘î‡:—••—eÄÄœ‘¡ÈˆëÂÇäþcGi ð½¬ËbÓ,ù÷½·ï[öµ=„ÞÐësï±¢û’‰ûp·µB¨Ùr“A´e4Hæ÷[žwPä¨j/ExŒ Tã)ïkeÑĵ÷­íîξKØ{x•å˺9z–#®–´¶´Q3ãÀ²lþ­’ž"ÍY`*`­+X²Q3*l×/?Ô6#.£ÜÊ„ H¾÷ gôŸÚªÎî{2žŠÎ# ÛQ!âÒð¹ÉŽwlSàH±0*1Ð[j`ÈåQëÀì´ì¦”ÚÈÙ¢â7r®2”ýVÜZ1b°¶â¨³ck«ÐMñ¸Ìn9ü ü$Þ“q[ ~QvƒÖoãgŒ4âNÌDÓ€©@šìœBKâÞßû¦ÈS,uò÷‘º¬÷ø…h\ëZ×Þùìep¼Ù2[Z2ÞÁü Ÿ ‡”÷ø9½gÊí9àŠï½,ÆlyxÖxüð…súLJsôãi×´r<”Pà®-Ž82Æ­<•°Àc-ÊœòÕ²5—(ŽÁ¨Ê®Ë™†µ÷^eîí7¿½nøÙ˜°²zíFjí̆ÇìÔj㽌vcGG2.ÕÈṵ̀ŒUZ¶DÞKPÇsÁ²F‡Œ¯¤w3äÎ~þ0c9ù!+8\½6ñ%â°e× N˜5±$¬`£bO…3¦SS$£d ~êôÐ?¸ÉE‹?T kNNqSžìíÉl‹Å d¡T¶ÎLÒU<ƒRS—ãT¾ýTŸµƒ½)V$"2èB(åÕà/Òßñ·GS#kÕRï¾bW1§€/>é²Wª¦üà]W?ÈûƒðŸ8µ6>ÜéŒp‰¥ë>¯¸Eß*{I IDATÙ·Q±X[VLâQW?Ì*`Bʉætøé#&µOéwí¼i‘wêó2*‹Ã!V'$oh­ÚNÚ®N´Ð3»Šu!Fõüô¨HÑ%sÒƒãzDÝj»àu³Flc|2†´T´ƒâ²Ùa¯™:¦WÔÓôÞ³a=]ïÏê[<*£6êNମ֛†qFãµÙ4*> gï99›¥ç×C~ÌU0ÇŃU…‡>Ìwƒj…¹eoõ¸/ÕgàDËIéÀ™ÙÌö‹ÂþòŒô+Π* ÆSu<>ºd‡xÅ\2ó¾Ú«š 1/~ÀÊþ„PühÊæŸvkëc9èïáíõSYóLŒk3ì?ûHVöÿÏÊæú#õ?ò ÿ+¶ÿÿÏùÿñOë××™þ` D?¿{qÍž^í1õ¦Œóñð÷ŸµíhÈÄÿ>Ðøùm@>Ÿ™4»—HÁüð<3ᳩ}–óñåÇ>ÆÑÏâÔóg“ÒŠ(Sgô|Dóó_ý®.Àã1°»oi]kE”òap9õzµ k|p'}{8Ðák-È @V³=£ÚZËÆ˜$­â¹ckÀÌnX•Ðkm™=LT¸ðk¾#·kÙüáŽn¨ãé¬Ï|ºï™Kèžâv±7*’ÍkfURVíÀø‚i2=P<⬉Ä&yúõmìØ¡9ÌbgÑ­Êm­p^3{?âµl‹f@HB´˜P eM¬&ìí }ÉÀÉãÃ,`ÙºhñÂÞNJŨ9-O-"2ß·W^cÓ—‚COÀÍ Ûí]:+¤^`/~-®ð€'_±Œr]5+ŒõjÐÓ¿¥+D‹ödój³vÛE‰¥ÙŠüÈöM~»»ãZ9>1éËùíûxâ¦ûj¸ý¾ŒüZ•õÏ®Ñe¼…Û·¶¸øeWí¸œ1#ØrÀsø¾ý–I9Z|7à;Ž¢ ÁsÏy evÙÚ Ÿ¢~û2[&éËüï¬IiŽâ@™ûE’¾ï–ñzXò1Þ©¬K5°{#*ûÀMVî’lnɀ˖ˆÛ}a¯ë KtÑ»ü›qïWàß`ÆÒèkÙvU7`>?¨,P™jƒ6aù¸Ûîî¾éÉîZw úº¿g¡¦ä¤¶l­åföu]¶ŠuC31äÝh—Ù{Gå»E8t!ïi/’ýªÒ˜íÛ%ãº,+2Œüq·û?-ð±i÷­µ¢+!ž”¶o/>ÎùµÖZ–9ï‹T‘·J5p®&ˆ*eh“g=m Ÿ4lµv¦»v•‘V`qÈoßÈbÑ£õx»÷ü B•ÆàÙù¥ù+o˜]ÂñqïbdÍlÑ@nåá†Ýap^po÷ä¾CWïåø¢n¦ÈnX‰¹#€‹©ÅÆL+•OëîUUÕ(»î}]×e&è[º³yð"ZÜ)`àÉq²SgHi#Þ|±¬àtÈ’ÕmšO:ï-½ŒQßéûÏï"±Ó¹L²€ ÊÉ9‡÷kO†Ã1RFpµ¡2VV~s΂ìWnͳé/~hñ’¬U" çüàÉ ÊTÖг·âgY5Î\•@¢ÛNÈö\_K>²jjÆT… ¬kbÒÀ½ÁÎz®+uò~zJUù߇™³¼F9MÃ0b˜<•D;‘±B6‹¨^.”Òã©D¶Hѱ»¢|Úi'¥ááªåQ§ŠÑ‡sÊX¢xъĹ׫º„‡æ2v’s@1ã¹+¬xJ©«=ÞX(UUV¶×Õ~ IXm7×TÀƒóÕCqZ¦ YS"£±´DvºÆ€bŽ+æ((íîhþUŽÖ=SfGg‚:ù‡º…¼üÜ^©‹äŒg9O²0~Bn@¢ñ¨{q§I-¨6ûÇP©ÕskJÞs»8ðÌBQTÆ÷»Na(ñÉK<ÔuLâmTøÄ‚Àu>Ï9´ÏbÚ#ò•ù T]@½{{<ÜÙz¾ôó¤ºêZÍÕ+õ_E>‹nªœ#.Mtê©U©èw§nPËþj£•Cøø‹Þ7~Ž1Ÿ/Šî¯7¡ç0¦ú¯‰ýäk&¸ù™–óñµéÍ>UTF÷84ì¡ÑzÉ¡bOG§ž›6ÕÑÎjø)³Ë}áy¼Uñ;"—^“WÝcϤϕµÄ„Éš‚n6J!:\3?í¼ŠS5Sj8$öœÓ¿!‚4¾ŸjþÖÁÉέržâò8Óöúèo" <[»ÿA©ó=«àBîÿháý§ýÙU´@¿òTÿžÿ¹Ÿô߀éçóåÏš³ñÅŸ¿šÇ½<Þ?ÿ¦O_ŠŸ±hxćIa eŸ×Ø‹tÞϸIµÎô39»ñ†èðUįb|NžUȇ^Îó§>-ÿz‰2Øs>Ñ+"ëÓi$_Ø´KéÑ;àÜåÝÝå‹ÄµþþÃåŽCÆ×Y&Ö/333ºoÁ¬×:CôoúYP¸b <Ñ£ò*7.UPi¨ä»Ênïò idÂÜÃÖy¼í¹ºˆ¹€ü=ÇÆDý ýêÚ{Ô€åÇïÒ‚ê<Î!º~ÊËqã.±C`­\LÙ ™õhP”ÙÂÚåaé)Mžî ¥Šë~¤0‹§_±Þâ©’}À%Tµn>P ÌÂXÍWÙ3yd .DÚ$Ìa2@0aDiÇsÖÁƨ),–úŸ¦qJN*!öÑ ¡Ñv•·ÝX™T\³¿úluØU©—Jc>pà*g\y~£Å}ꧪ‰¡t[\ѱFîî ©ÒSÛó]ç'ÎÈÆlš¨Z7ó5|øÊc»â'¬…ÃDŠÑ„%'©Ÿz¹[È{ƒ“´6²²¸[ ÖšÄ%ǦÎu(`úŒ‰Nkù ÝU9Ñ-îÔÜ?T¬¥ ÙF§Û{x̘uVE Žóü™±3[B/jx€>úš3fwzEÊ4ìk#Öð|¹½¨ÿíª?m0³væv0ÄøÙ0+±ó‘Û<¤£yN–땇3ù‰(2³·» ‹ph³÷Ql(=$Üú ßÜî=T‹÷zÊÙ#õÂmÆKAÃTù˽ÏÙ1|ó³Ðw*ù¨CnGO Ò4ÞËJÊ{ðp|¦µs˜";Øú;›ÇV$¼S^´Î‡~¯ß—ÕÚiúüÜ'%·@#¨ßŸF bÍ–¹0Ïp V]±—VbŒ°JŽÒ&Éè:ôâšOÜŸ8vkpS“~7LïõSåŸ\>¼¿ÏNbÿµÐËß„ùA=äÏ¥ÉQ] ?‘xÇxðâ à/Páõ cþÚïô‡)@ÿüG2)gbüÄõ¦µæ_|±pm?“È?^ Ôïv ”‡+zžMV8þ9šŸÙ©6‹=ï<êí©TXÿ‡áÙ÷;GÓP ‡ñ¦÷|ûîgoŧã}¾zç‰ðMê‰äÕÐUK«½wÄêÉû„pc}¾=÷¨›N/Èí‘Epì?‘Ay–oÜæ¿Ù‡!dö6{»ƒ°Eûú áy4WÔV„¢êî/Û«t“ x]Ù Á±é4×rää½q ÛAwf¥–S»ÒÑWÒQã½®ûÖ×W^âõ׊0¾̰…}:' Þ« º_KÒv [[_ I=5.èâeDÝÛ/³‹Â‚ɾYåðÞ±&Ö ‚(‚¢ׂ¸è¢w=’ûÛe—]²{›‡§¾,‹Aóí—¥i1ÁÚc"\ÏOÀ²±øvwiYxyM¾}‡;~S‹‚™éÛüøáÛ¯¿ý–UºîDô™û±FWlqök8š(ÁþºÝ¯ÁÛ‹ñË*Þ¨ÀÁa|Y4§„\Þ†üD âH¢!]-®ãµsû­ß ß¾¾ÌhFãr×¾o‹‹Ïå…CŠΗp3XDXäý»K_ oÝûþþö}ï±É+¡ÔpÍ7W <¸¥®.ãµÎ°â#.O“ìâGœªÉÒ>BлuÑhÆûû~Yd;`þh}ïøê­Æa.ŽkåÛÕ³!¶´œpg¢û¢IpÔ+Ø$¹öX¶é4 ›1VPÊúê”S|Ú2ß>„Ž´Þûƹ11XpÓÂѲrÛøj¿Ì/{Eó0º…híàcj/|ˆã‹nFÁ¨ ¾¤&¯'$»úCIÆ[³Ô)­eÕA¼Ò~ݨ ÊΗɷ‰ˆÎZŽèÂÃÙuŽ®Õ5Ú®èÚ*>¤å"KGœ²¼\:2P|ã颦ˆ"ŽhÄâªÜXtæÂ£K‚Ó@slV³öx°EÕN/ê˜YÀblð¨Ôf"Ù³…Øè(‡ÕCÅâ ÌLcXD%Pm?ì¿ÌéM…Ò´ÍH=‚Ñk‘¾ ùÌ}0‰q'ΛåÉGùÉÛ.3hùd¯ßîíÉËÃpR.ù*8eâÍœDܵͲPGwŸ;C^»=nKY{•Ht>}ÑÃB~ÒMxÚ}ç@JUQh¸É “º[4»¦ñ©ÆòHìUͰH—]VTfRµ&qžïK?€ÿîL>U{ˆÂeß³o\2ÇŠ *] \²PõþÎ'4Bhz cJ°|Ö,4t ':Ä©}Ç]´Ë•R¹Ö‚ò?Î!lv‘óñq÷ïKÄã¡lÏæ¥âÚï¹l qÉg!|Ì‘›ÚÙÝGrCîïÁÍÐa©‡~«3níS¹ŠQ~\³^¶$½\ÜÃëví€æóÊÅ(>ùp\ù.t5iøL¬É©YÈO&+fé¯òv™ë‘ÃǨ,Õ‹~ÎG)-…§×ú 2>˜[éÑ\猖ÜnÇe“ñèØÞ]‰˜1ŸÌàb…qã~Ž>Ô þu¡N=#4¤ DÈéáww %àXÂNB±Ÿ²,îËþŒÝØŸÒÔ^ë8D˜ñGìÈéb9QSgG…Sæw†9Íà™cáÑÊÀ9_ÏØö'‰N?qç’–jé¹s>á¢ÏڢΘã™o}üzý)±V¿Tçõ–¬ø_\C!ÿ¸“Ÿoû¿QpþS¿ç/|ÿ áø/Õœù'ÌÕÿË…÷šh⟹{?þWþ± éß»¸ø>£ûÙ¨à­7˜gKý¦Ñ¢ÝãÆ©9†'Y¨ß›<†ýÑd”ã†åÓÕì'e-Ùè^U ?z–;yïÜ)ê¹È;ç´þ7³Þ—v‘rRhäpÛå šl…2C&¨ƒçZ}ëå’<ü†±Evä‘©ò(žµ !²Çѳ&A%Å7º_fi“ž>t¢Y…ú<¼È»mé3Ñ{.‹Óãÿþ_f ÌU¬uª9¦ò…þ· :hüsn½¬CËØ g·ÓÎí¨ÚÓ3Í(º‡-ƒÜáî¿ìŠ{Ä2_&>hˆ‰å+ÄÊ@ËÄ5ÊÂýZȨcu§mú£òÏss­êš;kh°Åºèc-»@raËbw(–`6cŠ»k~‘XW”ä~ÿž1$—SàZ•ëŽZ[5, wü³ôh[œÉ¾ØiñÅFõÅv£]ƬŒ[†“å NÃÃŽÄq\NFÇ·Ž©Ý8÷[¤ñ·ßŒ†{»+8ú4×…¥µ!Ü{ûÖ×2%ÜÛ¿–nÆ §]½ÆÌiP–oíXû4û²¯{ß*Çq_}Ø7y…Oæ.аÎ{tsG”‹ç¡$ç6v<Ç®ëZq|ö®Bކ´”v[º¼$Ø>Þt[×…›QŒT‘ µ§Ø,y½NÃøV“@|{V!—­ÐèVä6ÿá·ûvßÛÍl•ÓÝ}ß?îíûÞßßkÙâZ¦eYÞ 1¢p§%ºç7ç½YªiÀ¨ý7LxL~rÅpÝ2EX"& òjþ-¡´„øÌYžˆ‡qAl³ïÑÇ(—53ÞW±Dl‘ê‡ÝÝ^ŒTµTùÕq®BTöD³B^ÔÇâïAOcoÚ¥Ãÿ„SG9=ž2ƒˆaBV4áE¬¬Ÿí—J¿s(}-öƒ¯Gy U}Kšâ+o“‘¼J\™4L—ª÷¦†ò`ªÕk“Ê{Öm4ñI¼ªŠUÈë² F°…8Ý£³ã€X…ÑÍ­ž„m´™÷¡Ê½õQàüŒÈ{HY§ŽBð~‡°ªµFÕqëÆÄ1ï–Ñ-¯,‹su*Œ”S¾•*ÞIØÆ{F–ÌãÙ¢ÞùòÙÇ9‘§Òè: È3UÛ¾h=ºüÆxE‘¸êæšÉÉG»X¬†•}…£ÐŠ3ùó3ô ÇAž3êÑБWEÏ?µTk×S,7TÈ ŒØ'rS£»Me]Ô•µ|ê_Ã0ù Á¿yÿ{53*©jM~¤m}aìUCåø‘Â«*[ÏaÕ-›ùsæ¾.Ì&¬¿Þöã¦Ó©l–Àþ‰X Ûs‡OÔ‡8è#øý¥ÑzÈ:/ª÷›á5'úýPÇìgà#txôè|P¨§g£§¯ž¤S°ž9 ¾jÚUsRmÊïâù³µ`«üTgVCØ^>ü[Xäê_Þ;|„ßý¾ÆÈß õvõç~Åïµüò÷ùÎú3³‰ÿ¸düs°“càøßaÀ_s~u»éײþÁË_/PÕ?5{çÑñ'—ç ç‡ÏÁù£Âw4Ô”¹þh™ü‚¯Ý)Lû¬5qx”m^³RÙîödL´·4a¾soþêñÖ‡ß3q¥v7¬—vÆù’ƒ =;3Üø¦QAHÑpØ÷ÓÛõòú]ërßÕC€2hgI€¶Ÿa——ê‚yñ'o‘èZ¦œdx9³¬Ûœ!ªq£ÑÜ•Ú2ºãI’ì1U좗iXò8gË–{Už^$zââAò:â¶Z§Á…®¥«äúÆK±W™-`gIõ³LIW•´Ê>BU§yÛ*Ï72ks„Ž¢{s,MÏ.wÜVáã/mT6 ÈQ¡ÅEË`ºöþönïJlÀyd倘[6¸¶ü®²im4ZI½BàqP˜”ètñŠJ[¥~=f­[âÆo+6˜Ù†Gù/ð¾Œ_W´€@w4Ç™_ß"0Hÿ÷î­„I½ß-sG η²8$nðŒR¸–]Q9»ýàGCã éf—ü[Øróö–ßÔ…pˆÓ«®ïZöÛu¸÷7ô™f°[戵èfÑqr»Ó˜«ûx†Ô¨1n‚Û}')x–ŒkÑo]fAæ©Ò Iú¿ŠC·¬ÏÅ» gf§´…3Ht£›‘¸®ËÖZF¬‰B;.KY°‹ºÒ½[°‹it:lÙ—]½¦¶~>z ©•tÙ~\Çã×ÈÛ=Œ«Ê7¯efôWy•ú÷Þ{ë·H3”ÓÍh—9¤{ïíþÛ‚„ûÞ’;–kA2¹ÜÝŠïÄ—E¥­X­Çå¬Ôö½=F¥X|´Ÿ­œcd*qÉ=†6Þê§Ù¥1/™øñ?ñi8ä 0Ý{{Fâç­ …ÆoÓj×›Uò'äɰ9õ°¨„âoUܹÝ10ÑËžÆÀr¸š‘¶´åÁ8Šº!~•À³,?Mÿ»* §Uþ€4I(¾ÿ (SgÞ^¸IÖV!ßã sc-ܼë›ì0×G[E¿ID¼C{mÖôâ‡/‘%`ã̇zæpuN_ªeÄÎ|óˆÇ†ÞUl ‹É4{Ö^è[4ŠŠõlú;â¨xÒ‹ „Rm£¬¾`ÑTV„°~§ãž}D‹9O•"꽦¢6¢ü >ð6ñ[R%/ûÝ] ‡R¨8e—¢à«AP’7æ:*T"¾d%&ð:›OO„üv'È:ý¿Up›þ•¾Qfo)å6İdxÈ]ÝÅš¹ µ§ö¢t³äÜŸ†€–»Ó¹“§¶´ü£-éá.‡ª.÷Èãõ d UØvd›¹jî5Ä«\ë'(NYœÊiu0 ÖÉ?´ø)4ë/.î~'z£µÙA(hý¿lhè: £cŽ( ÁXmF.SîGÚ¢shð^[œô.L¼[Í£ 1Uš³ ÉÈ}Ýø>g·³5ö±ƒ{§Í³RYµdígŠ×L&íÔûºhä[–eêªç9ª¥+,“Å9Žç¨õÏ$ÓVP6B ÚÞÑûaŽlšFŽÇfBÕ¬·F^6Aí麆ÔY齕6(è.à`ñaæ£NŒ#\c†1 yt)ãM\>X¯YÞÇÜ« ¯‹_ö6¸ &`t ]ÓìžOºÌ˜Îºð!3MÈò¨iäü/Ÿ4%>³|Ò-Þ&J!TKÐïYû IDATý|Y;L*õÓØ>0ü£[ú1¤êç2žÅLXÌ%Š-"R"êFCøj³ a=¥Â§*[u+ýêþ=ûg4‘çhæ÷”ÂÑ‹ø6Êû Õâ?%Zëßþÿ£?ôß6øï¿þôùûÿ‚þÒÏ©®}éº×?õ®q¿¶ä66‡wüi¤Õ¹æ‘;üÔñboPñ•[õ¡«÷¥²à´™á‰øü{ý¾¢Üñþb;"Ú€qÜáϾ¬‘à?%6Ö†(ÜGè|žUC©¤ž^Îè¢4Z,#ha<.\ࢽ¼8ôÓ)Ô‘¹J²â™&³!K16û Ӽȃe/†_û¦¤=®b÷‡?ÊÝ”ž (Wm +)•áÑéýMoœl_ç—û6»œ£a€Æë²ûÎöK¹–e\ýukQÊÎv‹\ÃLГ¥±R«ºÅª%³R r0ð¸¹j+ë-ÇÕ¤gE†ÆåŽ[©½{^¸é˜-sÃSRû™t glérwü¹[þ÷{þÏÄ£«öEÕ)7oÓ}Xµwñî;ª›Íùqçø'ç[ l7«º2UÐ6KÖöS] _ I¾µµÌ~ûÒ}£\1¤°·§0ü•±`ß{ÿøÖo_V+UëÌÜðÓÌdî»Ã~cI¢Âè¶!V³[ غª7&±CrÂâú¿œ·\ZÛ \·ºlù*ÄÀ2D†ÄÓèðÛcNµHÑt 7Œçp)æ÷­ë‹Ç\Y&Á¾Ìp-42«ƒäâ2Ú¥këGX’‡…>§1‰’Õ”! Òe¼=ØOöµ°÷ÆNØÌxÙâºÝìí ¤S¶÷ \õxŒ}ÆêÁ^HœÞ~±ˆM-£çXOÜZ¤s¾}+ã7F[=zcc¦e.„S<ú ¨/g‡žÙ²eKÐŽ²Õx1_ŒÙ©çd†`ÅÌÏ=tkö%iÈìz~ZãÜß¾.@üö;»›¹Œ__Ë®ßß÷ÖJdÉë¾ï­´®Ócz$‘k-3:(ß?îo3ƒïÚO‹ÀZ¶}÷-cŸV·¢ý…׳ʅôvš°5dĬ¨]¤ÌT|ÔŒ‡YÓ­§Ý‘qiŠM½¼¥â¼9Cr-T’6ãña‘Á±%³¾SQŒÎ/3[¶ï‡tÄ †ï2èû%,VáæCà4¡å™ÍÇÁI#‹3T†êÔ÷Þ;I8A–ÉQVAÚCixpZµ5±k‚2Ò§k ™ `þI+eª¼¿m-µwA°tP÷†5€S]tù†Ö³m~E¯…YÌÞ"cA‹•R×á¤k¤<Ô¢ü§ñ°#3/¦Z¸Ñ¦”ÝGcPŠ PJz?xÍÂåhÛï¤"»%«˜ÛµZ¬ËöHxû’Ë.oq¶ïÁ;P뾎®Dhjò_…£ÓžÕ4MƒK£âC>MÊ$DBc×S ?<¬Àäzu˜çšeÍ͇ÀÖ RBœè¡Ä*Ä:ã‡1žÂ˜ëd1kjéeÊ!!ÕߎšHyycG3ø€{stB¶§MÕÉ)d¦ \‰T¹Ó5I§¿Û{Ê Ç*€tv—´jò}´¥õx£6AҗŰDÁ9å³g¶7ShÞg•·ÊßÐ+BÓ¹U&âl)t´Þc >pÝÕ¬ºBâGöFÉ«ÉÚg—wäêâO†×)lm7¯Î–¬ìKyɞ΋:Yuß¹4ZêtÝð©‘[Òa#e{sÆû‰å¸åYi<º—aÄX‚óvCÀJˆ÷d<›Ò{£©Çf³2³¡íhÉÕÿ7åýHyÃ’ü°ެ€FüÏü€‡ž‹øcö>³ ZñƫĪGx$bV×ý£†ãöðt èÿ#¯Î9:hþY¦K²U?§BQÊÊS[äî/_¯aײûö”Æj‹‹“PTÝ}ïÝ‚yá÷Ùß™(³ü%¬µFp©Ë~aç?pVÖÙåœ:¦Úm>Ïèv¡A«óϤ€ûÞ€›áo׺]þŸ;/ aIùr[áå"åA²]SÙÒd¡(¥¡µD˜¼^bßè¾ÜDyÂê´’F]™É%qáûÞ¤mº¶–]×Åÿå?¾ÝáŽí{'îbÓÛæ«‡‹þ÷oñ²¯¹p¶dr¸ußCQ €¾È”Ät;yƒ:x×ñŒžÃ››¥ -ù­ Øå_q§ø‰ +#;3•‡;ç“Òë‹ÚJ»·t•î´÷Š?,<‰»:1"jd'ë£èZLkÿ‚ ßî‹¿„À†u奥pÔÑÀíÈñ¬u}]¤óǾ ]4/ÓßÝS —|: ¸Ú—¬‹ÓW´¥‰.1?Ð^f²h®³fdÖ¾aK­|à\”+Ä­aŒË}ßY¾MãeyoçËfô¸÷ݳ,;l%ì`µ5]!§>£82ãŒÞimjŒè-pi·;*0p›&áF¸¸VlÎ7ÀhF]fä××…/Ó½+î1•HéÄ}'õk¶bÎA/÷} õ}GŸ\¸¸!$SÛ,_ï2Ñ­#¤–Š:Í`1`¸ƒyç4³Å*>È™^ÎÙIC”=j;ª]ÅLœ×»Òìx ºËÃõ&¹.ËÖcæë÷Î~äÓ£öŒŽ¬’µ9ÔnO}è<¿cP|™{ßßQ\¬ÃÌIݰÚ,<9\ÃC•î)T½BôwKÑgÛƒñd†×›tnêtâñ£ZVÇ“i.è–.£Læ‘Dð-€XÃ1¼kŽlk­58ryÖOƈºön—m+Ÿ‡w÷v@w‰ë#ÆÏéwÏAg#Sw$"ÃÁ‘S B‹Þ­óõÂÛÄÒ"tϳ*€…ÞÃiZúP=ÛRw@+GqÕ³ „£ÿ9nˆÒcöyâ·BÈWû%ÇtšV•dâí ° æË+›k¦ñÙbØ9„ýÀÎé}š×®ŸÍWR¹¨ãÒ(¬âª¡}J¿©]Ÿíäj¤¸÷ÝQݳÐ0[(½ŒLië—§«23´Ixf}ðTºwÏ[ëfoxc­©¹)@v:J[?¤¡ºäЍÓ™#ˆx˼u[bò,Ø¡ÊHú¸/ÕØ²ëQOAÅI€ÿ NH㣲ˆ1e‹ˆ½Òg#UÑÜ‹áŠ=Í[þøÔmÃ…uçríí…ıÍä «!4Ö©¶9{ˆÄ•ô-å÷à²Òa#’.ŽCÂÓe{6jDŠ‘SÚ®¯È„*5é½VíÏuÝ«:@Ø¢zq"m,¹*’+!{G©Ô¾ 5#‰£Ó{ ŸÜëðO>nx{\à^o)†2\ cwÕR±W9U½¤z†ÔÁk¯ôu·ÂmÕÔz[PW«ÿ³û˜À„zekX“ZM7¥ï¨ cbØ-ÕE;¼÷º‘Jª°H O6Úe_Ù“µÇ€O©¦g¨è¢Ô4*^w­˜¶øÊåþTÓ2þAž.y6”jK:«õÁæÜ½3#´“¿«#¼/C¿eÛØÚÃ4_pÖ_ëPͪççíà͛霜·vîŸ*¼Ï°ÉHRŒ?KáÄ™Žè_$‘þAüŸ‘¨ùÓ’ƒÿ)  ç}ìB&í¿cþ?@¿hÀ[¢ìWÿùó$úõBþ•rýa,pCzþl‡ÝEƇIŸM¸,UÙÊr´^ÊÇ’œV}ÌYø$À¼àga:ºŸé½á ¿{J_ælðëuÀ/óÛ$S Ètί5½ó¹º¶ÀûèaÕ‰Á€ï­Ÿ‡tŠÿ×süü+aƒjäýTiÏo•¢ÿ1}É+K$1'Ñ–\++sƒF„’7ÉȦù7b˜ Põø _ë¡™ÎúX,Jn*T%) ¼¸p–Cõ5i4¯¾éØ+³mä¦"VgÂù (¶¡. ©EÛŠ6Q3Ð]\Éáßµ%9lãÞ¼„f9— ç‘NzP™|H<Ѿs—KÊ€•Ê~Ì-ÌL%a~ƒÁÒ‰Áßle”šfä÷öý½ wÞF@u»“ ³„| Dáªmj'ËÚô¯žI)_îr“ö~!ˆºq‰;y&ø‚b©¾}ëÇ¢t}]º®uï?Ü·–ü[{•œº-€D¸]7t®%‡ÍKZ[‚nèë0šlò´*‘ÃÖ[ÄÿZÙ“àâ#á2s¹à¸åÄ&/Oç³×e]!l¤Xz<»ZéïÊ2†°~c¥:Çhe¸r]9K•þíÆ@^Ƶø.Íleð"èúqï艱åv_iz”Ëï…åð¸D¬G²ËL¸jhÄ®§ßv×Þ¡†Ç†\з dÖٗEOÆP#så»bØ8'‘—YŠ‘!PŠÜñ»tÓ¿n6H7ú-â±e°k-¶‰2ì–•~ðì½°Ž‡­¡TW2Ìh§í6ô‡“é‚bf1[ tÆ;x6Pãüåý×øÃ)p<=zlU”NJ?ÇnîI´x´_²™IG±â ¨=Êâì(ûq»´")Ÿ™ÂRŒÅã [‡f÷zK³+6‡%1Êì1VkÝ:fg"‹&†,\õÒDˆË:»¹3x •–òzFp*¢„æq!åb76餛çN³‚ÊAÄÈt>hé‘j`ZDDŠ–4+=Ù$F=e¸Ñ“•‘uŽ:ÛÌ{ÕYj:m¾DÒÂ6¥ûŒ²Gmò5rñóÚIWcúÊñ$ŠtÏwï·¢ºf"}ÖiÈHï#‡½ÄÕ·/‡»8o^ï¸Á<•L›gM ¯§lÀ¬¥Ó–’ƒ¾ Vžfs@¢û«GZç¢2ù´9ˆ3À®S-‡?wlê½.™€~jüägzüx‹Ô²ô4žÏn½¹’{§½ºþ”ŒñÄhmê„X§ˆzº9žbcÇ=zwœû€->nÀÑ„2Šsã>q}¢YÞÊ>%z&ýÊ÷M<*³ßÄ0Î׺Îqú(ù½¦7>Ñîùõß rÿˆ;ÇL/yŠ×áÆt`òíÇöŒáeã}6ñ4Ëÿo§ëWó‘Nþ+$ãÿÜTå¯ËVüCø×¿ò„ê#Éæœ~@®}øIÄÏà=äË$`̦ߛ~åÿõϚ┨ñÅßcqÚÌ Ø¨ÛåÙzŽç-fOÀaÁ6ÞËÓŠìõÿóIØK~žrà¢?Ä|ë%æ?LY×,¿‡Åõxðsñ ­ +Øq½ŒÀ4Ÿ0¦ –z z©âgxÈ“ƒÐôœ‚„6PßÔà(EÅâ2^ç(½Øa¯c`}œç½SùÞ‚0Vq­, Ïæ dŒ†,d«S¬ç§Í Ìàw¹3Ù  e¬”Y›4ëhkìaápsk¥Áà;· ¯2k˜]f_ëvUÄÿÛÆ5ü­’Ç?J9ß2.wÁI¡HOÈ#ôI3nu“]Tú¦wdö= Úù®c·¥%¸ÌÙ§Ýo€ ,é†LZQwà³ÞCw¤²Î!,F~'¢v޳Œ×2ëËø>Эü®q«zŒ:H[°¸6³S‚~ì&òð°dä•ÖጇÄM´¥Å—Ç›ÔvwŒ}c4÷bq‰âþ8ÃN–Þ™“ú ×,¹.+¥¤üV:HÍ{ûoÚØ¸ÝµÝ˜-Ñ:£Ÿ:6k¯ rÀé[ëÞþ•¥ ü–nw¥Ù:æe£èã…@’Zé•bœ£m/àihUÅaËWÊzÊ©¸h[€b@CTMŒï};¾tÇÔ+[IA;¦ ¤ [éo´»º«Ñ¸š xP­B»åßî1ºà“b¯¦«v»– ËPY,\¤}-í½ð• Ýúë˜h­ºfL¤çé€P¹g»K¾»Òé¹å÷þKj†O‡¯’äb’ÃÃ4­Ði1ÖÊ¿@¤£Áu C5U^ýbiSo¬+Üe{üaÁص¼¯Í,Ò‰¡Àv_–˜¨Ø<­A†É¶à-~{Ì„;ëÀÁ̰ëµáFšYÀy6¼@Øå§­'î? -^{òLf´Å¸]~‹[q5³aìœÞÚâÙii¦Õäî»ç¯{çí¬Ê žÖh¨€Ò?µ-ÒVÐß¿]®@õ×›Õ[Ôꃂ_ïÿlzÇ1ÛJÚaí>/–PWŒÉÓw ?ëˆpÃ4€ã|g‹½{ êC¦›]g’ŒÆH¨YK¨Jš1 éuúcÒî!-)açYܽ+pÍæ(VzÕ`y4¿¤i”d§9|îSJ·a >Ý¿-’“ÏZЉ±×úƒ jFamßÑv®jHÀl[ êUZÒPž…@—wUÕ]åEÅ9>ÛZ¤°l-fÒrž×ø”amªðAµåª‘F±TŒÂœp?°ÛBè.¸w¬²’o~ºä‰9yÒ²Åð܇Æ‘ —ÝEÉç/TN1bärêKÇæQGç9øEB½Ë=z«ÒVN¥¶†°ˆ©Së°mZÑT^=Q)*ÄK­êY+Ù&tZ*±»xXuÁ+“>ú‰z>ÃÔÁ8„1ìÎ.sR /ƒÅb[}5ËcÅfäÖ±™VÇY<¸ÏèB*Ë6¥ÇEæ¸{ÄòÙëo–ƒƒ´Yò±ðÀo°<$qOïþ|ÿ):ÑODÏ6 ¢Ðtï¤bE>$h&Èh›Ë£l{²ÆY—3F)r]ö𜡎ÉÑq8wÙ2¢ƒ=eY=zq VÏÆ¸yÀS9‚Ic6_Uußæèÿ0lúàŒ† kÖë¡!¡rub¯¯Ú% Îa ñÒ[§ŠS<勚 >üá•R=c²¾°;IŽèL>2º_¸…ˆÿXK>ç”`Þ˜S’Ñ‹i³``(Æ'Êÿs?çë);gn“œÏYxh!ú0¹¨é^Ð0äG_>>7ئ铄þdãùºvx£óav9sxÓ_ðOšçƒþþŸ3;uµ/3Tiv¦|–ÿÇ„CœÓ~¥þ½ê|ꓯ_Ñ@µîŸð=úÐúƒüË`ã­3áß«Ñþå ý³Âù¿_ªÿÿú£ ÿþë÷@PêÚÓ èýQù{¿M":?7þ /ã>þú·<—&Ss?ˆÇ®ŸÍ=§÷ÅÅò½¸œ1<¯¬g ðø“oÆ|> ÿŸ*Tµ±g7vZÊú`·AŸxG½K»Èn"µF´FŸeäøþ¾Ÿ\š£ž‡ Ýj~ÖÒFd\]²eŽ€-ýÎЬ˜W'è®ÿ¡u£˜¼Ö˜K:&hBn?=6ÃW•hJÜAÀ¯V\šÍ·]œ£5:þ 4L¬çV„p}«:cŒÞ9¿¿:‚‡XŸB|ð{¬l¢$÷–k«â­U ™ð£î$¤@Ú´{Ï„Ocø½á-#ƉSÐ'$pW+sÕÊF[b\,½Õs?æš‹¸§Ž­ÛÆê#ÒÌYY¢¬ŠÅ]§à"¶°«ÅÁ"ͺ°.þÍ®ev™mß›¡ÈõF¿–œ{)),°1 Z[X»cÍ.a‘4ºlAž™~¼-Çz=êhË­.®e¡%…ßù_ý€‰S´8`\wš·¸Ë·šlÈptŽËÆ-´½3DcCšÈßoÀ·.ÃUB% 0p‹X*êW€_9ó{ÜGû9¬Ú!l’¢»2P%"G‹'nÉ[ತºkï¸Ò|ùŠM•É|…5P÷Þñ)–-@ß{Ëu]?–_?¾7¤¯«>£K«ÄÊGV¤‘«ç.iûÊf·²#Å‚Ôït{g„‡¼’쮦«-|0|ÙJ+´¼ áô–#»é$PnD´.»Ü`…ÛÄò"‰Ú©`³‹øNáî~›]à ©nœûÞ{ïuýV€|ŒDDF‰_“wì)ªêÌÖ²ÿã·¿QmóÛ¿g¢Æ³%OºÅÚt¦Ä–9¤7Íè²k9Q¨56˜r#6×€ /¸z¯˯ǣUD…/›kÝÔ´Þ7z*«Ëp]‹Q@¼óg¶?ÑŠ=½]0˜®;R ŠoÕf¢ÚŠÞñë\^<뇸S&VWh‚‹ò9ÃB•Ì%¶ëzd±“Ca‹—ãÛ6îò½I.£¶wèÅy‡k€†_íñlTÔÂïS^W2+Dw—k¼µÐŠ‚ì½,ùJÌ ûÞNàëºú-^ªD¼òG]6xô:››~y׺TbG¤ôù¨W¦×‹3ÁõEô˜‚|0»Cßur ÃìJ†Šv› ó ®eÔwiÔ°y¾?UR1¿MxØÓƒªa!¶ Ÿ*jŸú‡~¦Bògpˆ> z 1Ëø)²ƒ»÷¡MzJ*ÖÕ :ùÕË~²tŒÀA¶áí/ÎÈ€z±1w?·Á¾ÀõF©ÿdêOp?–föö~’»êû?ô“'Äc$ Þ5ººª~ôŸh†‡ù!|ZB0?¹û/Á‡†Öñáœ}“1OÊ]’¯Qˆ™hyw¿~{ýSjê¿UÇ/¿>ÿgÌþGØßÿøëæOŸèk‚æg ýÒþÿö¿ð÷¾Î;-ÿ8ßõ¡€o™€—gñ§‡kæÀW€Ï1þãéº/HµÜáYUÃ7"?†žÚÁ~”^‹Ø¿âA¨0àx$x–“¡t^Ç•g–°iÕÃôéãÇ,;[óúîß/ºØ¶zóüúó ë½ëaCžVªCn¬½»»ßI?pül`ÓC è²y¶®3zWHBó¨ö` Có«?V;: Y«–Ýœ‚à$©ouLwŒØ1+zN ³¦n¢½&«œÎ IDAT{MÎGùëødô|±á‡¥Wܶˬ·g],Ö ã—Û˜³-6`ÿñ[ÖZ®«G 9—^a‚eK°øáí#%Ü¡ ÙN6èH/ŠÇlâÉWȆróÃyö·µ°ªÑëÛþ¯{Çþ®÷¨ãidˆ~Û²W v}ðÐ×W®­!ÏQ™ñBtÂVªÃÊ¿[·K°<‹fKÚ}P/b-߀î½[]ÒM|]¼ìÂ÷·»ü{G^ÙÖ"L®íØ’-Õ"û`S“‰]£À㨗¾6ðr*RÚ·soÿ²\ ۉŬ‹ß7v•üÆ]çÀÅBF»îøGFWÃð#òª‹Y5!ÊoÝ LIò2ÞHðÖö{C¼®%š°Y€ØÊ¸to}äpr·å¡ôÊòGÂÛí‡}}æÞ<=eøZ+faIó˜‘oÉuËÎ ¿è»gÖwËoWê8Æ+쓼ÒÞºŒ~×°£2_¤È{gpxGgƒËÝïb×¹‚Ulû †œ§B2F—8,)_Ìn;^s„Åè>)F¨À£À/ŸŸî¾( ,_¾·‘ÛƒÆ#+·n5v°µ¼ç˜ð!çW4F‘@ÝôÄ•VMÚ¥4,x–‡.[ò{«ê9bŒZËâÕñ]éc:TèçÂÝh²P€ÕŒšŒ‘â]øª£çÆ"¸»ÝÑ)Щq&Kª6d)¢ ™ñÔ'»¶¶Ù²V‡ã•qWƒj|…í»¡çAAqÏ!‡ÇÓÒ¢ü†ÛACŒÂ®e&nì3^÷Aþîu0ƒ!Þrgo-Wº‚óŠ —èU‰°Ã¤‘nw¨{eãƒá–_ùT-“¶ ‚Æ!ç#6Þ9Ç:^ÊŒr{Yà0ýa 5÷ ™Fà"îÛ>¥ªõ[feÞî®Dm4³©Þž.®¡À+1;m©t5± E?¬zTI»¬wuÜ0â+ž\ÊÅ4®1¤hSe'Qh å}—ΊPúm´¾±ÉI,’ à¾}K5¡+©Ç¥ Íœb ‚‘ïä¼™Ólü ÉT¡;ŒûxÙãY©`È3ùÌž¡Óö”å“­ÁV(&=œ(A35~#ÙELÊÚ)€ÈäîÍ`·½²µ)k—O^ÊÂͺtäê»=üö°,S)Ç#`¶² ÇkV—°ó\ýÇ¡^Ü»^;-´VŒõT+„ŠàU 3Y•¾†3Hq?`16!ãªÉj¼VCxÍiKŽ£:j–JÐÊU¬×ø¥J;Ú‹¤¡&×dØÛ;¥ ’ê©§µ²ÎÑàpª}‡*oð±÷j_6›±³ç ¶æ”È5è+,5ÎòKá„ Å`©‚ÒÌïfUÏŠUPÜì>lbéΩnlìœÕõ2qט ²Ü(¶ÌĺCîÙuCø9Èòž\áX½6«·Z#¨ß/eu¦¹O·ü·ÜÓþßP¤Rÿp9fM=;ë eE„ff¾!FšÎÞa†ËþÑ–5Dþ˜ðçþ¨:¥ºg¾nÉx|Z÷5Ï4k»—ú§«ÙD/ú!òzíÓk‘¬mq3O;µxä]ÏGf÷Ɖyó)¹†…¢ö£1¹iHïËQÄ+§àEK~Ówô(x–¿ò)PŽ¢¸“+pÔ&=N/ƒÆ£¯y 'šo«Odòåû瓞!{LFßOäá¼±Ksy¸¨æ£s®@õ°¦ç8KÄgÇ#€þêÿWA(ñV©ý™×­O>qi*oê„^uïwPxR~P¨õv}@Vܬ^õ¹ÒOÕøÇ¤@ où;Ùï?èÕ×ÿ¸À»jªøÃŸG4ÿЗù×|wýU–öÿNþ±ŸÁŸ¾!¦G¿£òÿâD}ˆRýòì“¿ü°ŸFÐøÃÞr|>XüNhÜ%O&îPbÎ2ôgó0ÞÆ |Ž^¾Ÿµ2í5è¬ÀÓÑÏñ\&_†!£vï’°A.“Í`§¸JŒæÒÛÒT˳pâ&&|å„>e¿ã¯çW‹õ:M]3mÉÄ÷¾¬¶ç¿be]è½Z4 B¾—ØÑ³Â=ÕŸåñžljY$,:_oúÞ¢•UWcF¯íNòº®ø„6W¹q«’'â”Ý–öܦåß6;Ú}AŠ5Ç-G‡Wй«2{ï'¥3ä¿JÉyMÔ^bbT‰Â‡“BÒ$l(:îÂõoyUØt˜'èñb®˜§÷´¥c½zÔ)R¡ êåE5×|_œÝcÈ©D0E«65e¶|{Ÿœü“éÔíeÅN·ïA+øFBüÿeï]—,IŽM@Í#»ßÿQWvF¦ë¸)ö‡^Lýœˆb’Cvs…,™¡TWfFž‹»¹ø 8‰\QŸœæÛAF&ÀÞøK‰µ fî®—àØÒ:LrüqKº ·pß"ôëËìËL¶oÿãÞ¿®õµ¢ò@~o‡Å+½ ž{›µb5ò¬g[<¾##¾€Mø¦Ë·;,š 󉑅@|-þ±Œ;dÚìú»ºW:\ìþvd5"ç^;¤SÉá—Ìh×ú%^f¶ûkoÃu™‰¼}@‹Í°,ÞÄÞ~o!¨ö^qZ×mX Arݯû Õ§ãLfëH†ªÅ'Ç4’¶‚¡¥[¸V“h20ù.àR\o¶BÉõk[NQƒáÙ.ÈËr!p½^¾Ãez¿ä_ `0 ñxÜvÇã¯Ùk\gÄH6ø½„- u‹ó íc R¬Y»ìtYr§ÿd¸,Ó0о_;-Š¢x]Ë,‡r©¬1ÙŠ Á-9Ì‹Íèû>RW ”.mq•Ò'›x;íƒ!ÙKûxÂ1#î„ —Áäa³·`Ȕ€Ùµ¤×ëÞyâ 2NE ¸µ¬kõ(;ÞÂöÐòÐçuÊLª¿¥Ù²n:]ríÔÇâÎØ»W[ÆhO“ÿ´Ì¶T ¸œ°Rj,æÃÕRÑ¢§#*«)3ø¬ÿ=4†zfe¯k-}-õ5’`4¤·²m‡zýØB´ïyœõ’¡Ô–;š7JþQÔ¤n\Ì¡ÏmÞ©&Ò è|8Æf‰øZVý¨¨Fôóå$g"}•îvlWÝ:yKE!ò%«o]ÛÉ®u(Z‡7C9¼º–Úóq °Ú‡»aôÔNèÀ»ýäŽ5ã3çMýš«Ä>jTjç%0Z—{ªö¾eÌñݽçD·›ŠÍ©lû*!YmÊÆè¸]¼1)FÕ`RÔj×^m’z¨((·V<”oŸaú£½¾UšiÁuÔt ª%bÖRÈÄ£½î<–ácý®¾ œÝÛù€Cè7<¥—£)”Ç–›Í/µÚÖ¾žÅ€×˜^Ìi\ÞçÈÄjQfÒ8ÿ©©YúJœ·p·RÑŒ¬ÍaHðœÖÅUæ)gÆÍ¯fÙ÷‘ÎOÞH:)¥¨a(Ì_3Óñ½‹À¦f$ÆsÞß|Ä'õ!˜†‡»ÙŸ#F}üIs><îûHçAÐ’J+MyÎFtÉ5É]Þ‹Û©?Ço¿çÎö]‹˜üI|?ÿœ‚ûX™[åçXøœMO:ò½ÿ™>€ ·wô(êý ÿk<ú4 ®Þ}ü>Ƕç@gfñæï_¡?²hCèÒsÞðýñ*‚-Õ]€åQOMùí^2Ó€¶ª˜6å“ÜÛú? íúTÀÉ|eGnK Žþ>Tó\"­åæýO»7TZŒ¿=N4½ ~þƒL®k›kûæNÍ^)Á1@-ƒ‚_fk™»í½ÃÝi‡úé'EÈBîg5¡Ü-øHWÅœˆp쫳>š7ʰ¦Q¯0³ì›H!™Üe Ýø¥r}–%>OÞã(Ÿ?8¶¿k\Q;À;bƒ”Ìâï8 KyàŠU·’¼ÆIϱ–,•,ýZ¶Ò²Ìc»Šÿ})z£jŸ ¥9¯ÃÞ‹lç¼·¥í7]Nf¦à´ÈºÊ"7š’}”†™Z˃·Æ˜%,gÊ;GÈ¡x6äȘ´Ü9ºíºlÐ-fÉ\ÅÍò”G€ÌO!.Ú7—ƒ8QÆXwúѳs¸k»ìJøz*ã gÐ,c­•U›·¥ˆ_þŠ+*³fyéº@i©3©DòùhŽR uóâ éØËI^C÷¨g4a‡dœRÍúÇšô—¼ï˜èi¤/Þªù&Ç9Ç:(AüJ7îÃýêÕ𶓪ZÐŒ¨yª‘ÈÅ„zÁ]NŸ&;¾¥XtqËœ\¢E ÛQ1yÖ0”'Ú«X‡ g‚¤­ ß”ª¤.Åx'¥HoÏlfËh§û¨ f@£C)G&f*È ¾¦¨y Á/5ô=ƒ %òž¥”]<çÿÑ ÃÊÕLŽ$Ú 9®s„NC»ÖF{%1#$iÖ-Hî/M@+¥öT(¡‹#äÓ—3r‚4*ˆšÇ ÏŠ‰¤_uˆp t1¶+Ý(S—¶‘ª “éBÕX‰3L xGº‰ª¶Âi“¬xÈØ[ÍifPúƒa7|­ÆBFõX =áª)š‹ñhë ¢ kzp–¡Þ–æ–üòàà” g:NG@]Ïq4[fîNáNÓ-Ï~€ù:¡è1Bº›£*#sê«£„:ÓØ’â³±h&%:zo7—,€\άŪ^„ôNôĈQѰ (žätj¥†SôÇ uCS‚hJäP³ÏBqžù‡_C‡Õ?Fc«#^}ü >›ŠŸX˜£ÓŽgOt.Ôi°aŸiFýDjðƒ¨;íƒ-œòù翟Õj‘1?ã0>#™˜éêHjÕýÿ(«o6èlgÿ˜]Ìp`Ð}º5ªÆEùî¢èƒ>+l«"¤kÈýlÞšµ>> ÔifÊ¥ˆ ßÜß+?‚ßZÆêó㇤§ÛwÞq§«­å?H"¿ºŠûü."§SeÒÛ®®¿h§ÃäÐôõJü$1¦yFØÁDÒ‡[=$>@£DC‡y³×jÔmèz’–rÂnmêzâŸè{úç}öÃ'ÒÆùŒ(ÆÁ·²ã'Ÿ?uÿž˜ñg㔺ô×jæüû+úá~:‡õÛRð+äbpñ׿תbüýæ_6ðýÕÿç—ߟó?~šß¬üüyv¤ßó&à÷÷㱡Òüø“ß5o½·…ðY3±³æó{Z³‰î!¦þ€ sqWijÍaÓFóQŒ¡Š€vÊlù-¼ˆ} ?ˆþÉ \±± GU€™iZã9yjÑzg;ÈÂ;µm’fË·’Kî…˜…Œ– 37_ Ï0š™ï= ûîþ½öÕÚIËëIÆ Ë–Í.IHùfÀU|ÊÊÐW£€o‰³&ImÖ™N]k¹t߯Sü™”ɸm„r>Ðåk…S.+·k °iJµ.íÑè{D~ª–2\vÊ-”ªJzIÓçx]ŽÞRŸ¥ÙÿÅ–PæË/Pr~UxšäE ³£¿],ÿpâ`”¡ÙØœÐÅÔÓx+•Yµþ:Ü]f’óúµÚ|¯‘W¨ŽÍh7Qde­A‡Ž-1$CM­Ýª(½ (‰¯ëFí2¹—ZWÌ;÷ˆÎ³sʧñ>×hCîáÕ ^£‘hCA,OËL!²Ús[,ȶ‡ÐšÞ6ætP¬ªLŽ­îq~È™q²Öy™š·r°%]±7<‡8 JYæòØæÍ›}ô ”ghŒõˆ1ÔቲQ“¯Ðs#<»,}–ÂVN¦JMò çd®^$­gÞCrˆG•?˜ñJ¹ÆCç©IïUtšaÏÓˆ=ÆÁÌêt$ÏxÄðÈqÐk¿ÑßÜÖãI+|ª'ê‘Yqt?G¦oꓢƥ÷¡þ?,ýçoª/îŒ`ªZrÕ•Xãåž«ñ˜ú“¦É³Ÿô 0èMêÒq;ê³]øÄ1šÇÇæe|´|õK#Ù\ÿ£ß3Ñwjéü¾Qý'‰”ßvü,~"Bðù­öÐßóW3ª¿Eþ›”ä?•—`ý`´þŸõôÿôïØÿî_Ã_nþ‘=öM;ÜÐßqq'1õÍúmÀOà òcÝyªáäûÚ•íôÿqqô÷!v¨ªèðœf<±;ÅóÉòø]³‡v/úZŸÓàm4Ø‹f¼Öõ2ËA–àÜï› ZÀyÂ…­°d”gú¶1»Ç"òØp™1{ž%n‚ÂòI*•÷\ŒéSíŒã°ä\3 SýþÚ‰ä(&ĺ’`à™FHŒÄ²@éçÏS´•.‰>‡F’„ Ðü´=€Õ£Šm9NX´í§û$ŽÕ/´gDË¥eÖtb<Âéã²î¿2Ðñr­mßöÝ0ÚexÃÂ`ì®mZà¯Å¶éšÕ”ˆ ϯrÑ®<»Fò×ï¹H`+f÷öµè.÷­ÀÍÐ2FÀ¨®×XøÍÌ62G’2*CÙ »ËBC2cl„¢0ÊiìWyƒg¶uÂj¼`[[]©ªJ·òœJGÈ\èLM.È®!o<Â9º[Q»€ãðw¤¿ˆ«Ãa hTÜöHj%èÎH«o#8 Í€µ7b¦ZÈÊ-dãÅ™b‡ WŒ¬˜ByI}D^Æx˜îí.-w®+Š­s¥(c@‹.d `Ìš [¼`Kåœ]5ÈË<*j:âŒæP-ÂòZa£ ¡øVSÓ¯E'b5ƒÎJ4@×Ög¾žö&F¯”µ'½ öI{ Ýú±×’¢ ¦®œÈåôc–œB¦Ä¶Ãåi™€`L]Ù• €gÅ…ºÜ¡U}ŒÙæeË}O.¾j>&voù@aï »ØcƒÍ·©´*'©cçtdqìSÛNŒ'#‘, {©Q;å…vlQ8±ñíĨ9‚‘`6G¿‡nW“‹!%t*@,Ve§Ñs@3£[Û%šI³ÈžƒŒAL¶Äé 3ó1Àæûµž èôïæMîFR::AÛ7óŠ‹$MŠ7+C2ÉM£Gys¢ìNA5kèüßÊ/5m5‘ñ ü:°3ç¡*ZœL ×éÀ,.}H›ÕZàHÊ]Ã1+Lå>€à[kÕÛæ•ræZ‹ÕM¶,m_©²§ÏIw€â*ð`ô:í`™ ØN[ê´ÜãöB"jÐ¸ÇØ™ eðê€j@LýËêšbeP«äc‰™^¤¢éª €"Dšß{„ªYX4ãNΣEº‹èK”õR{pc©Ì²ÙLx°zˇ¸ÁÇ|¢ú0¼5äÂäFáZçE&‚ãT6`Š¡zÐøE x:#Ÿsa=«pè9gxûœàsðöyßdj¾{™ÈÙÿV\?ëП3€ï‰÷üÇÛõÿÞ?ò“·ò÷iÀýÿaqð2 ¿z/Ào\^ÕÕò—óäìûð¼Tõm7øI¿ÿV¸ÿ1Ü2¥~ÞÞ|LÄy\(6§É‡±ÆCôËÚØxB–8óhâåÇÜ}¾Å´¿ÚqÛ‘ïo϶^Gõ3Æaôçù=˜F…ï² Àã·)*9Qâû9¸h–w·Ë‹Ø”ËÎdÎ’ëpLqˆ{˜Á‚ùКŸ ÉQž±ròïw ¾Â1d.YA„0pk O6ŽFÊR‰9g’lÆñ12íœõé_+˜ÇwclFUSìËâÞiq‹2݉r´øáÎÁ,‚—3F…ZåÕ3Zö7t¢Ü(нd¬ŒH'I§½™o§€¸¬Î1¤nŸßLæ#\§ÏÚ‚TŒÇ$Jõ*ù<N÷¢Ý!“xfaû/Øî–ÁØY †‹éŽ M8MÐáñ®½ùíÚÚ$ïMk¤ æ†4jÔáO‘žJ’›ÑìòHГ–œ×Ît‚¥ ­?1m/¬„nwø¶uf+‘–|èž/é%aË÷†ßZ_ëëâºÞøö×⯯Ë^aÜvѰ@c8=DÛµ*W IDAT÷³;ü¶ƒX‘a½­Œ××…¯ÕÞ¹lmð–®: _ä]gÔ6+Ø‚¾ý2®–…šÞLR\fT— ØÆÝª“¹ îzI·vÔ`FðeLÚ‰'ZŒ ÙQI@2OìFÐ6bl_ñ–ö³¬Ç¢ºÒ€ßœÜ0“ÌìZ†[·ÜB6J7–hÖ‡<¢íÇ9h³‚†óÆâ¸Ìˆe­"Ç·¸ÁóÛ3½µ¾né‘J_SžŠ©eŠA–‘Â_nÇì¹H­s|6\Rwa†óÊígdb‚âÏåߨeã!”Ý·$­x«.,ºÄøj™~ζíTÐÞm¬ÁÚéP´~”xRN|gp,,õwC¤-âŽQ= ®et¿ ¹l¸áV…¢QÑ+n–»Àv ™«ßýrGG2Ç·Ì,Æ¡¶ç¼6Jr·;ªPRR¶&[FÙ@ìÐ[î`<$'íº²i2ǯñ ÷ÕËxoÝ~74.A¾1&§k„[)9§µ„ÚnUÍ>ǤlΕÊ÷Ö0ÊQýÒ` G‹+bò” ÀCFòÜô1®†;Al׊&̳ƒ³ò÷ÂÅ­A‘ò”|¢Ë–e9)ôj úÖc»Ê*|0ìeQ7À» „ ­jhe͇«"¿<¨h=ü‡Gäê?à圧ÙB&rJÁöe§Š£>œÜoœJoÏ$BÛW0h’-G[1¨öGåN@G¼&~6™¶Jš†–kßq‰ 'ræP¦­‡v5(©ÍZ}PõW&Y˜J¨¹kszI"ºÊ„$¹½bœçõâä@üS, øXÏÀ’VnØöHž¬×SÜ:µ°Q½Ë&××nÏÆã}œ¢'lYIƒ(üµ}¤pè3ÔË™·ˆ”Rš)¬]…ñ€rÅ^O2Uáz?båá·Š@õP#n«ª™ÿŒµEºcV͵eä2ŠNißQw†×iI ΞJò©jÜÛwSYVöëzõµÇ*¨n…ª/ªªäƒåÓlÓa1kW‚ÿñ G”Ý jˆˆaŠŠ¯Møa—ľ²½µRQ”ɼºQp¶éØ­\.½ÖwYËÐù–\‡õÁ>Æ¿óðð²\ù- OE㛬“.tÌèTp®§‚Øžõc8æ)úԕ®Y1O³Ê8/w±±Åô¯÷X/vWPUYoFîf–{Ù ø‰ л`!=kMõÇ·`ã&O‡¾#„N·ê†;s˜äXõ'p ±Rø1,£Šø)P롲>‡ÖŠmëÔs:AžÝC>ºn¤~ÐëgV{Íl²ùó„ØgÿÙ'tÄmv™ø‘wøÄÖÿW»õÄ èê~v=ðQS«Ò›ãŸßkÇ߈oÔ¬kÄüv¦KôÝE¯§ô¦1?Ÿ1x˜‘ùûž|ýÊ8ÿTTÿ»Ì~ú—Ÿ,ÿ¿Õ ü=$ø ÜõÛ í~ï ø.?þé¼í»_û¡¿WŸ?Uµg¿wr†žù5ŒJ€ï¬òoùµ|ÔðõžŠÙÙ©uG£ÆkZ0üì›ãª·MÿC¯ç_låæ)€ŸhBñ´ ¼}ö6âÛœËî…ŽW[ocŠs¤=´Ö½rµòc€K ôá)tЗÅGôoÓÀCg÷°fó¡N÷ɬÿöµÖì6ì½æ„ü?¯%²Lk*$Þ¨czôWÖM ²È®Ü°ä²eßÍ4…½”­5¾@wç2ÂÌì¾ýÓ,÷+}UCcu…Õ®@!c¦€•É÷Ç4Å J¥#³pšÂåÑ,`IfiN—Ü±Ì îe¯vÙ!&Ž‹ÿ”9èC㪗5ÛÇ=Ù ûJnw!lcHyh` pö ¯@†ÓÔ¬ÝNÿÛ«Ù=ݬï—î¹ÅTךÅU݇¡ª ¥™Ý< ˜´¦¾þãõùêÈåÀýÒvý§ ¼À{™1"êѼõÚûõÚ{ï0ûþŸ?ö¯¯/-šsomí—ë?Èðkß,³@î8ò§q•þŸÇ‰qùtCðû k…¡ßq-Ü;°åyï¯eÿgñÔ?æOvÝÛ;–“޾m’¾¦‘Ç íî^Æfý–¾ö¦¬ˆá`g¨¨’oªÊÚÁfªž¼,â%‡¸ÝÿxmCÇh}Þ¥\ eŽÐVø÷™WÁh#)s‘ø2»®+`¼IZ#² Øj˜ Ú[kÑÈËø‡ã#+C`fZi­ÍJÇ:™ÞÞ¥²IgNP tØÉd»ãüÏ$DàËþcÿÚpdÏ}º¬çµáú7xÕsÆüßqKÛ·{¼æì&ïèäVL[)Çv·‚A¥Rì¸L2+{v|ô¡ó؇¤ûÞîŒ</@Öâ8(nß¼x•ÈÓXâIÚXÌïZ",&>´+:g >’CFú9ë¨Ý¨‹eÈT¡z@Ñ&ŒDG]Ý X W>¥´ÖŠ3{E;Vð>dŽåÓÛ´Ó¨Vî©€óœù²Ò P-ä´)WÞ&>)u¸¸(ï¨}À´•ux '‡þ6¹Õw†¾ÔqÆiÄfªš§+9n§è[éd ôQ™¿\EZ·<ÔË+%ÑýA|ˆÃa"BÓ“ŒOÕ[Ý'NÄáYÁßxï@xqrH_¥éi üšZéàQVtÚ”Þxõ½N¤ÃO§øCYywµ §„GßîŸ5`Çß–UN9ºÝ¢Å1\~\:Ë–œ¥ÚÓPªo´´Q°ò Õr8xþzWìгÍAçùYD< î£y¸ö6vÇßɃÓA¦1ãx¨…œ=À®2vm Kø|äüSôü´Ïÿƒìúÿ Ñú ª¢¿46ÁwÀ®¿B;~yÿ»³úG~–ÿ¢9?üô ü¿¾dù6aíÜèOÚðû+x—öùñdžÔoŒð¥|hñßw ?ÂÁK¿Ï5]{›¯cÿIˆ‘”´óûùqgñm ‹Çà!û`ì»Ëc6Ò‹¾ÓVÿÙdhót³NN<2ÚêøíùÇÌH«òͲŸTp3˜yÓ’Z%˜[¶rŽÆÁ™YkÓåó{dÖ²áaɯÁã1–Œ‹wVjC™Aö잨C…ÚúÔÄ@¢Ej>‚aüŒÝ›ÈGLá\‚‡øš‡}£Ïü꧉bb îøÅ]Vþ¶ò­îˆ£™ª¬š¤[«8ø:уFBÙܛ¸ A‘à°ÂßC~ØÞ­½«Î!ƒOpeÕñƒÞwç_ŽƒØÐÞÁÁ(1%(J¯ö"vßâÝ Ü °3 Î4’ƒœ@Výå¡ÍcB¢-q­•ñ‘®vô:T×e…ÛÍ(®Ð‚Ëùt<š‹Ìþ‹·'£HZiµ÷ ’Ã!,.ÀWºÃy»^„²ívo÷¨ ·½ïp¾ï:<šå(ò¢Dƒ.Ì !õÙ¦äØþt1x/òN΃…ë¹fYÒaWÐ_% íÿ^òöe0[îpm½pÇtîme¨"™;võ_¾á~å»È“¼×¥ ­•wÎÁ‘¿¶Ä­€Ÿ'–²Ê÷úÞîÛaË-pæò-§ëV£b•ÓÀÂí;®¶ˆ‚å}³Â‘íî"ä„y5¬Ð»šÔ:($z3xü£‘¾eÄí~Šë¤½ÉR^ö!—yíéœíÅìCQïÌËõsYœ¨ ¾–ÆÛõu)Úió°fØN Xä(øB ™%z\to×–eá³n$÷!(J½Ô›í2óXuW H,QÙþ²V,Q–: ävßeîžÔñKª4òŠì¬±5žÇVÇ©û,1ë‹~ßûL;Vc´˜tÜžßE hà.c8ŠN]D«1ø ñj}}]MuÛÚýƒ-YjsGho,ƒ-ƒ—@è¾q‡Îe\‹D4UyHú†;î×}o}­Å¯üv¶âá¯í4 ‚Qq""ºãñ¶bJz¦­­c¯ÏÑP«š5·ï{û×Zž#¸¡‰¸{„cÝkuÕ)ý– åï“™e¶,fk„‘‘b(ùQñûH}ˆ;@Ñé{°6Dž ÁÕ^кê‘GŽ$G^Ëሎwæ9+ˆÿ›"£N¹Rù›+_ðîóEs¿ypüã é1í„£Zá9ܤ¨MUå5BéµÜ[øÍš4D"çÂÎdOîöÞ\ÈÈ0Ñ¯É /½B|Éù J_ dñ;ª¬\ð?‚°oIVí7ûïi¡2f^u:K%s³\9 ñøúÝÛ€ ׃ì‚ã¥ÏFõÄFÎ.Kgk̘h[àž‰«’œ…BÝ+«Ì·ÂàŸpxp¢°tª ¿9ùÌùF¶ñî)Ðäg-ßþÈSj¬çe¢ÜÆÛâ3kpv¦¬¯oKq9FÐu×ÍSoEåI3:ýL¹áñÎ9—“*<×|go¿ù»\Å30Ó÷çª~Xd®…QÈ õÑB¿µyãO;asÑÿÇ«Ùú ô×X¹ÿŸ|ïü‹2ï?F²þ÷?ÿƒ±Ï«hÈøÝ`íÇ ?zÑ¿û¢è-7ôžåÛœà-.ð8ñ? ìš8¦JÔÿó&[èÆ7Ã'™ç „æ‡m¿çéšøðÇ,Á¿í-1þ:ÚqaCàâ3¡t±ÊÐJ_·¤‘£¿wò“¶¨€:{´¥"¶Ðffò“F5ÚæÉS5ñ¾Òpc»»¥ÔrhBÞ]¬¶:Ë‘WxÔ-ç! þǾ‡AM–¾:);HF@”¸´”"{K'v(¯ºoæèøxbWÒebw»·ª‚±œ+y’çÙÌ!\Ëý1X£ÙFëôDŠ—A‡D¾Õc¢W³`ÅãËJ±€Ó”‚T±It.àr«;ÄÓç§|+Úèñà”û\õv4Ý‚œ`/MÛ{IŒª7÷Û¿ ÷²N‘©3`(¼§“8ÞVŒGLÒ²—ïäÈ7ðk-šmwÛïà­×8Kîpì0>{@ÒOžÐ"VzœY´#Ê8 rÑF©À¤¨‡âw'ž(µ6÷,Ï0!ðM¶,¢²rÙ`áEûDŸ-å 2äåçlÖË`Îo)íçì‡T–S¸ŸÈÀíÚÏ0fÙ`AxRïûŒOä]DßB„4B×6 S8\TÄ9r%6w·µVÅW²,Þà;FÍ(·|ö¹*¯t\>lé'~§óR*6y5~H®²)¿ÑAßûõÇýÇu-“Ë­ÊB·`ˆFD^mK8±2©dsZ7¤ÀRþ­Ñ)×:Ÿr›Ñ÷ÝOî€:ÕÐ=ÛƒoÇÅÞÅ úo5+‡b„lz8ºÌÆ0•©½S%‰Ý„ë$ 쓺4òÍœêj›§Ð–Lœ»ê@YÎ¥%…¼Iý°|2’˜o´®\l0Ÿ- m¾oØF-:K&d-ªKƒÆêçÉxN{ŠQ]“áöæHiÚ‰R•YChÄaª=^&”"ÿ)&.½oWChsÏBhØ.ÿˆ;ä±îNGÍ Ni›K®ýrèµ÷–ïÞ’%A'ÁÉõ8vÞê©­¸8…†Ð9z­&ÉÜe¶¥]lk¨N¶¸ÓÃY¬¯ªæÌ ELÅÈ´Ôm+?Â}ÙÏ1 1Í«ˆRÊ{⢣f)ð8|ã`œÞËL –úÍ^ÑCŸÎw¯«hôªˆBЯÚ"x×ãx¿0Z2k,õ¸¸™’×J~±Š¿HpÔ\Ô&ë€DuA¸˜™³ÈÀ%ý°å0+}‰ä~Xxˆ(í¸o–ªkCLŽ ‹U22pt—.³FD;ªìdî”òXÊÞ‡˜uŠL\;ïõQÀ[†Þ³D¦­<²Wž¦–¶§#eIµ™7Ðàºq2q†x«ñÑ u±ªfþЇvß”ÅèFRùw¹„ÒÖSn%ýШ‡P¡âðMó”~€òv²¯'4æªæ»3\‹tb`ÛˆØ%"ìÜ5ŽI&¼ökê –U©W(kz… œøDôœhfí×T%õ¤@¤»A}§1êùí ñQÛûª÷fW'l$?º5ƒïÂíÐ|GŠâÁzÕúW84â9z¨JÁ·¬ƒšQ€‡sô¡]µëòs¨Á§n}fÓ­Z]O|ø‹ñmbtU? 1:ìߺmõñÅÍàÅœªŒ¿ä\CÝv 7#¿º#îù¦ŸÀoNÖÔóšÐ÷úŽ\¤Óž!~7¦iÁ@Ÿßà78¿“Ç©ŸÔoý¥eýŒðøûêãüíÀ_«öþm/ý¿ÀÏF™ÿó{É[áîwO¿ð£>R=oc~Øß¿{¿7æykxröùÝ$ßÚÿûaÇþÏ¿âí‚?ÏøÇÌ ¼í6tÞ~Å¿ F½ïHYÖé‡ë°ƒÎ¶â‡_eô?Ÿ§ëNµë³÷Çù³¹D_3Ü…ôü¯‘·<çs+]w—±vi çVýÀx4„ÉK&o§Cõ×zSW\²zÏͬÌ*ÝG ùØÿÇÃ8].N½D”z/GT¶ôA>,1ßifkÕ¶î´KIÚ{[©Õë›ÂŸq¶\Ÿ®I=À»:Ô¨ˆh™„/#Æ¡µI(‚ŸYš5i˰Ìܼ_[ž#™z .lùU׫K+ m¹1µþþÕÖ_tvþY TZ#‘Zßt\ϲ†(¡Å┑ >‡Æš$Q_Qò\"Û—ñ¿òzÕ±Ò"oA[{¹ÉØMïyF3¡íôh«¶EÒ´w¸¶ÃK$®I.YZÉêè,E—Dí¢¬'FãºXåÕȸtãkÁà2åÇèŽWø¡-3çÊ)ĵ–Ìöëå1¡²·¶Tù~ɾÌðu‘ôW6)ÚÅŠ!U6[áÎf¸û“ßïKo•nǽß';* ÍWÜ]Ù÷wGE'œ°ß[»˜`k8Süó`&aï-ÙZ¸ð¼6¦õžÝð9눾Å+”wS°®kå'Vö¸˜1ÖP¹ƒ—†•?nÝÊõj™è&+´HãWß…â¹AãUW?{œ\_Û¿h·'àÞµiA‹Ë®µVô>W'ZØ ½z:c4áòûvº¿&¬Ë.šù¨JvÓl|½Ûù!w™bÆ­É!!Í}CÐ÷… ؾƒïhÅÝ·}óÌCËãf„¸‚bƒPÚwFBâ®§<Æœ13ñ[úâðñ)|Q°þf£x`é"Þò{ïåTÍiXåðe¦´VõTÐH®eQ" [1@ðöÊ‘ ÙŠ‘r¦F|ÆAÄ2ƒ‡ ÂGtÛåÛ7‚ÛO¾ðGßVÇÖøºwwÙxëÎ$…um÷WÑ N:x|ögÔç)øc*†7>.'©°¬åš(Ùn§[²Ñ3¥%Àèt8nÇÞî.ĽRjg3¼çêy¬‚$` 8…;ad5»ÈAËØ¤ÙìžLÉ.jI­žÊ“û¥ÏŽ} = QK·<;b˜7š'“"¿]Ë´ "âçHÌÎ̶Cºäº·‹ºl™½ã#¸¾È{§[³©’uI¡¬þZí‡H)TS‚øòL† ÅgqmÔÕƒ¨¼Æý8ÈÇÍa:äãÙ{X_>tI–‘|H²vqYURÖãÑyv$,¨S9­A³bò·_\‰‡:Qº³}u÷«¤&t|Ø:ISà[N4J—Ón+3ìm|(J¤ëSR¶¿ô_÷mJÖxš*lŒÎ¼ö X¡ç¿ŒNÍÒ¦Q *cÜy ªL#ëy¯ ]\Ï­öÚªÿs*­yg•2c®Þ¨…¶O†MÚ ¢exs{Zš÷@»Õ—ÎázBëÔ›Öœ{xrÜ`•ÉHLÄÝa­Œ>ÔÓøYÂ4 ,²"±œ÷:#€ò™ ¨} ¬ÞmÜyu%€Z)íÂdŒÚ³CBaV7ÃUïj¯ûÊN\uÚ¶¨­?nmyµÃ9šÍr–…qÞ⤳リ[¬((ãt1j• v~}&Ä£0}äòr9`Ìç†0,mE^·^Ýw:hûƒåb‘ªˆÖQƒw­·n£uMrQw³¾Ôÿ„LZØü8<'bêAEMŸT3Ž|†žðÁŸ @\ø«;YÀ‡øÊáYžÓÎŒÏõ=?.ÆxZÆpbçÏFr:« ˆ¹IøÿÁÒfx¹¾~Ä'*ZçÒù¾ÞÅÜ!1s˜cXi¥Äk¤„>}èŸ=“ô©¶v/dµø)G’ÿ˜?@|ûËÙ²ÏÑG 銞›Ÿ‘ô­š¤¡’¿ãžÞì·2à77ê,0þSvÆ™—ý3RéÂú§ç ô•÷*h ØÜÃõëð9ê±Ö¯÷‰Ý›y—ø0ø¿kÈú¦š“WQ]9?xðÿÏBÏ©þÏËDø¸ò·ÙO*4¸*t?‘ßh;'çþ§úÿW8¾úþu£’@ ½S¿ñqðߣ€ßþ^ø ßí7fxèý¿™Öx/®&þc¼Áßð¬ xô’Û'Ðçƒ÷WEUýX$I>§ ½ek¿èМÒ|¸ÜbƒfVÏG;A=K-Ì3<Ÿoñ»¶äoñ>-úÏ1s9pßÿ{Æa¸Z ê­nP, *ž§ìÐc}WåiðCy£q÷lãŽè]‡â¹_Edf»x¹AöMËöZqMàïA”º@’Õ_hfÒ®™A) 8# öÇw!Øæî$Š|yJíC ¦yîôÆ´QE­­b¾Wï×-ÙâD@eA®"z|\û)¦_©Ä¥”¤†·~ÑÖe;óîI:—.ärwbO³Â‘ôJï)ˆ(y½¼ZôNc„£Þò¬¼šcR±ºû:Ý›2³Q0ºSžÌn -§ôƒ’©‚)íq(åÆKøÚJK0p{©ÈÆËìmåLÚº3=R)öÁÿÉJ}{÷×åoG%ØW{ÂÆ¼äŠìBéBÁÑÆvÁw¨ò.À_/w­ðú^@l÷½÷ù[üœïmöe ðºp¿ü 1M\´‘íC§ç¨+R‹_Y” _faÉ¿¸q­ÃÏ…p߸.«“,«™(ÎÛ%˜$XéiÌ };®…¬s¶xƒq1:Û0åÞIÚ @Øß÷ž½‘I$jA8·ðRq ´‘Ê‘³€‡³ Ðs"ŒÑ´Úí§uP\@;Œ|Z03Û;ëi]¨_æ£ IDAT³·üK¶ËØ/êµ·ö ð?ø•Dü X´;Œ¢,šc¿*4q{Ô»äW“ÔÉ¥b7„ëuq"Šœ,;#î—mwè/€†4¤ Þ¶?MŽižÔèv¤ŒV®E]\¼—]Ä—YPrrÔ+kg$S_ZÂãÖ a-[–´_#o9-]¶`\/½¤Ûµ®Q Zï×qRzyïÇ CÉW׺ša‹ãËJ¶ePõdø™ëZ~ê-cð¿Zô܇ðuo@ˬLѪ/³¾³z¬"¿ÕX]¯Ë"г›{S£ñ@ Ç÷ÓA»L¬Æ:ãe–ùòBgûíš{«ÖvœPØ8“ƒeÈö€eGÁ‡£Š·Ã]êNc¤«6²±·m›þ¬¬+S[Xè@ ÛÁf=¼éàÌ‚°Ë_·hUK®Ì…Uïh6à°«æïT þß¾(wß^ìl ˜gÖ`@G¥­Nwco´rÅ2b;›Xè‡_ò¬K/³…a6u+ßqXú†°W•õŠÙ¹?^s÷§éü´DûjàLÞEÉTo/KÕšÀ²wù±õ¥ŸAÛC¸jKÃËìc$E»¡¨iÐ'˻и 6.Z<ëñxÐ{ýø÷áÓÈ™_”²ÿXhrAš°[¾D6?¹v&-`×x~<—;áiDë g×óF`1ÝÈíéUÇ-¾ MD6ÜÇ£líý>I‚Úê<<žÄi{ñs„Èåµ$ì <=Î:ûQ5þ©*:j¹;s­7ƒj»l‚ÛûÌ °Æ !g&®ÊuµÀ;óDú<ŸE‹­3óÇìW"Ïé¶é¹`$Ö.I÷~¹sq [Ù2ÇÁ+HÖÑ«BÚçÔœQ„¾¦LRuŒ+Óž—ÙZäèŸøŸ”ù¼ô­iÅ2Ó©rí+IóóìOù”wßÐ{«¼ó þ;­ÂháÜʾkZ.p8±¦ØôeÔùüüšõΡÄ$LM‹§[[…û’køøCŽOöõ!•Š5ÜéÿäÑ]Ï#×Í´Á§ÚYñð_Êë,›Þ!{Æ8dÛyæ?ÄöoÝmÓzº!óʈ֊²Iû;©â8_ƒäÛ£ïd&´š“] °õÔÛ Þyõ|ÎwàFžþ‡DÉwY»E uÅPÛØR¿ÃyÍ?©ÑcôòN¶èçxnÍø³MáiʧW^Mß`ôÇØeÞ…,N/Ç(ïUGsr¢1¢¡QþÐ'Wê™NGþ³áÙs>ëÇÖê[²¥*þ›¡Ó¸ø»ÿϤõïç5óGoæ/`Fÿ?ço#蟋ǣ¿ËHä_ ð{ÌoÍ~îù]¹Æ÷,··¡é_œ%<»v‘8=~t²“Ÿ%“UØbççr–Ë£ é<ǾöØ4Øú(38üU}v?^ásZÎg0Ÿ›7çþAõ!¦€—ÿ^oocJÂVëÙ‘vw¬Dúðô ä®´88%Ü{ÛZk™‘îÝ0ö"Õ­zŠõ,ýž>mióñcNðµ¾þ¬ã.üc»U³”yì´™6%÷6íê$VÏ<>=o´T?£j{e5Xñ¯‰Öq$¦k¸DN™¿zW£áà"_Uƒ]ý¸j:[ú½s ¶i1°dù4úªÎþÙÞ-ñ³R;2ô.^q‘ì”ØTýÆv~VÅk=8äåŠ[.C¥c]ˆtEHjÙoj¥oÈá4(8Aí$2ž Am×úBêÞ{ÐRXzâ¼õ™p"Íá5¥òÑ BMË|[›0lÕþˆ@Ÿê`µÕÄÔ•’{1ƒ‡S‡IÌ;ï„ÌHtXú\Õ¢83{ªC«#¢hoáÂN¾äŒŠ-ô\°b‹ZqÚê¤Ä°N+'Ô•‘8 Åüz¢Á ¶yñÕW°QÕÅâÉí‰D“Ä ®  ƒ9Ç~ÐøPÅ#4Ö+´£µŽÖˆDVò(æB͸Ð×ßej¥àÓÙôð&™ˆöùa¬hîC{}ˆ-Þéyºžˆ÷ƒQ©¯4×f¯cgò#UÉAžçÊÒg}á\ß1&{[cRaWÖÏéé Eûi:܆ìó3êÿVáVZ»'ýFŽAž½ò¤øVgPØÑ\ÜZ>¦Š®æöD¨'j'¸tªnp~ÊU\Ç7õ‡ºªñIªeÀöwrôÛlh˜ÐõÑbú.UàÌnüŒSŸß^AœzЂ'Íé1Bú®ÿW:ý¸®™{l Ðü1ó%VÎG£‰€ßÈt<ÍÁl]¢QP]¬>­žɾ¡Sg¤2ü|6Z¿O¸ô¬Óm® Î…ógþúQGñšÐÐÊ)’Š0òp ?uÄîKàŸÉ›ú>ÈpØ_Ä7 ¤þ>Nû¿tÝþúÁ[ß×ÿÌàä/+Ö¿'¿÷•ε›¿càÿÌYÌÆçÅÎúÏ7º?‰ß¡ýüB¾­õßuó¶¢÷í_ÍQ{<þ½Åa:rξ:æg8”þ¾ ¬Y’k2 =‹fx„þÄ­Û£ Ï›Mö'Àä•)ïrg×önŽb³d)5!TZ3[ZcZò|Š<ooØCÆ/=Ó>‚¥c¾û @re,¯™ÛNû|B΃šµ¿RVüZœÃ¢ í‰ã/·t—%’típŸsg™h¸öÞ'¦Ì®$(kWæ:]QÃ(q¸ÙÛpmh»“¾wÞûÞî’Œ¶ìÀ‚ZB R×n§:2òÐî»!« ­6B!„œ¥˜Õ?¦Ã—åië· EñdX†.ùÃÞÀÈEÞQ×l)®Ô/†ŽïÉ~ÝÄ®)CôSÄ»ÚÔ%°Ùå^)`^ëÜí;·N3Í —¸K‰¶…jñ²ÃÆìð:*hSé@É:Â+„±ôëð™†Îä½áÀ¯kŠñ“mÉ7à÷Ò²ý8²e_†u‘wȶÒízZ.â _Há/'ãàì›ËðED™²c–äÌì8~ÏHpë WõwÒ_÷ínke}ñ¤Õ,Ò³Eã°÷øH&ë?Jþ¨[rí‡Õ âô†žye¯㯵|EMrx‚½ûÃÎZN¬e‹ë ¯çy*Ç.Äí»»GqÊ ¼kOA$A×ÞAò(æ™ȸƌˆböW4¦;ìWؾä7¸\Y:­ŠÜÜrÝ;•|¿½¬F‡u@ë#ðŠïá·Ç‚V2qüÅDDLrõ7žéTŒìí~ûºø~FwÆÀH®Å×ñÆ0¯p Yã‚AÇB¯Œ¾µp̶I ßûòÑ•x¾_ê$¬4FO¸7õ‹ÁÞŠ÷X §ì£‘6töUÀ’îGH×/ÃNýö #a‹¸“|„»¬W³ˆƒ‹ŠAYáì¥<õž.͘@.£ÙÚ1ò9ÑAùl°" ž×›ä1÷L‚7‘Ãhâ]šS®;ò8HFí¤0S÷Eªök[hÊWí–En$ÛœœÁµ<îÇ5ÿ•›…*d=¤_µ×âržŠ;ŒÆšÆOò!ö /”£¨rI¶Ö]÷R:-¦3ÙGú -®fŒØÉòJëooËå§ôváïn=V9!¼\„³³ÖŒLc­âùS#e‘)ÅsŽÏ’÷á©ÊËç4Äoòµ8"¶J²MöDçmõ%² yÈæ¡ÄÜUB”(ë°ú¤®ptÉñù#„|7˜Bf¼ÜÕ4C¬ÇWDÂbîÍò` 0„´ej_OL><~Þs£Á ÿOg沫ó Vi‚¨zTvú4Ë·»u}lîÓž†gcÇì½ÕÓ+¦['déááG†C|l ðÖÓ¬Ï*UŒ]´Ò¦~µ¥;­1·. <„b/5œ|8>k;‹!ªò„ /ANQ¾ƒVXpüÑZƒÖ·ªïfê)ÍÌ.ÇŠó4‹«ÓñÁyÅÿrX©–7UàXT­sFx8¦jîÑg¤‘kò³ËU6ýVmõ‰çÖ.æ©‘§‹’­Ó¹|J®(3&ߔ而æu梊­™®j¬+Û@têY€ù©À4&šÒëù²ÄÓU¡ÓüÀ÷ëâ©;WÃÊ£†”o6~ëîá3„AáüF€Ý ôØ@z'µšüù4ÈÕ>,ÿ&+¢Q·XhÐèõN‹>]©ø¢ö¬è)rB|jþtÕD®ƒDÍß˶ñ³÷Û¨Š8<PhXt߃ç;}÷=ø¨íh.³Ð ©p˜[] M¢ó†ÙÊñLu‡,ÇZ0GßS—ÎL(Ù«‚,,ðúB ÊÚÜ»êY¼ŽƒîúðXV˱M²Í饗?¼÷'3 }jóh­½ü TŒ ž³ͨgíhû;™•Šúg$à1Xy4wNKÃ<÷}±,G@ã¡ýu‰d\w—ôÚyãp*ùæûåœD´ÚÆ8o*פN‚?ÞÞ ð¶‹)2ù( *Y#¹pý9Ì µ£ïÃÇ­ñ×éù9ˆÿ˜=juz?Ø€µq¬¿<Ö¢öã'ÍÀëß¹;ÍâÿÁýhú¥õow“Æ]^u‚¨îŠLy&c›òÏÑv ²ø4¾£DÉBÕÜÛ{؇ïš+ˆôÄdªÉ<öçDKw΢F ñºs(xÜO„¦h+UCÛ[æ{ß÷ žùLívYBAVT–úQr†i0DÍ ýÿn/DÕÌÁxÌ™ò¢&…mLähç¡„°GY@€¼€WT@]<ýDžž±°û%ÌçúªádÖ†`Ü]³×z§›Z– •;´ ¯Ðîi0¾4ÚVŒ"ü«´É—t%*`q9ö \Ë.ã4Üé€mXô×kp`¸7î×mK—™­c"ú‚1dqm#wœ?W`FÝ‘íˆ*‰n£’öí>±`DwÝò XØÝGSl—i}}-n×}#ø$yV¶´:fI*aÙ PÓ2tÁrÙÅ”«9¹Î!%×¶÷ívE»B43§“f‰׊Z8Ü¢² ÆÇev-{F?æ™;Æ0–øŠ¹¢=<8"u]Õ» Å×jqEÙéI£Ô<‹£(»?¦›ÅS¬°*àVnÐ ‹Ö%™¸! K9éÛ=1 1u´Ä=í:Pt+§Æ±êç%(³@´óh!Póùü йK&ÎÉDv÷ÏŠÙ¢ ƒ}QFqaCƬ޸" &m[gòT¸°z™¶¸´Ý³"Λ¶®ËîíðkUo"åN›{¶Ê²¯í6j YRB‚—%Ñ®e/m“Œ\ëÚ,y¤ÚJ\#¶'eC "&_¤“Œ¶ŠÞ¶{ió)(ðËWlm:E–$G?s* ð­›øÚG_*PüêÑWÝþL¬l±˜Œi4¡(Sõì\1[†¶®CÂö]ÞÉX¼ÍÌÛÇOÓÓ~r 塞¯ZÑ zg¶Î‡/½m5lFwx^.’z†|Š ÜÓvXY@#«à o`qÉÍ:…Ïš¾º´¶†ª$tÕŽ™e¾ °‰õš§ëóh|YÅ”rz:b^nñþäžâóG×ïŽóÿ¹ÀÒJhÞЩe®4R¢™Aû ï+’õ<¢Xo§eÔÞ‚GŸ®ZåC‡ ²rï{þ9ƒÆb”hÇ%{&•ÍÍhŸ²c£œ*áïIKŸ[ó ·}¿šHyÐÔð«¬o¯kÁó¾¡H~îðå͉vñ êíÁU6§V3k} ¨½ÒÆ\i§šTI3̽wêò$bŒ)ÂáNJ®B‹V–µ>‘i2Ó€ô»1b7–+ÂN9?f¼‘>Yvư¦3µeo•uB}S´vi¤O¶çèÆe"ﹿNUñ4Ôgš,ÿ"«9ÃÎ÷Ÿ½måÛßY5¿ èrÅ:È3†ìÐ%SÊÜòùq‚=í”õk™(áùø@|L\Ô%ØŸÀ©í Ÿ9ßQôÐ3jòá‰;Çâºð+ÔųuãÍžüàŽÕýõo=ˆè:v¤ºz'µ~FOfÑk^¥òê,Û5•ïË“·çÃzÆß{?÷¨ìä)Ð=õïc6HO£F£ðDÙBž·’góЧ¸|2Üh/|ÿ¾óÚx>¾éO1šÏ‹ÀÑæ›89ÚH®ÖõûvFï‹A“_ÄGOî§¥{‘ž{iG¶õíw?´¢4‰Q´Ìåãç72Û ª1´Ò™n¾,c>Äë®={*ßÒÄ`¸T“áw0½¹ƒèò²±pþâw˜÷~â~üÂÓïùíGÄêzÄ1u¢ gÓŸ¹ïùþøQÙßö³?‡O^Ößâ™ÿ+]êÿüðo†þ ç"ú—§ñw~‘å%Ëﮌ÷{’|ÿé)ƒÿùk埄øQ/ü)jµò¹_ùˆ#ðí¿LZŒ}<$¦¯×žR{/™†G©–)˫տôŒ>ð½ð€|›ç6êçýÝo¡ ÇR«km-ø¨©9ùQ»ºJ)-ØõX©³Ö8Úòè{ï__ÖeªñFBwñ…8÷ªÕwo#Éç‚?Çôîì Ùª´‡,jÍ}º…Jî ¡Nˆv‘hÓM[r¯¯‹¥ë3~ÉGËq5"Àö22*7ZгßJFG³r<¦ #y!ùvúúšö>%åñx‘2{íû¾q}¦„ÎTŸO—”;ʶ~Ü0(>ðçªWTðxU»†²“ÿï 4N©æÕÒ‡'Ê®ÇNõM‡Ež% gû:ö‹6£.ùz·sçÖ:uyýÞ4æé°N­µî悬ݠáàz%‚!`çÛ– K®eÊ,[´äºœËO¥œ(5µ‚è‚Ѱîr—”|˜½q7àÀ½÷×µ²¨3 0áºÞp˜Ñ~ñ×ZÍâ½Ò—™€{oyF˜3no ®ÿºo£]+¢x_æ7ysJ~K—ÌÀ/‘;$Ù¯ÖItüqc-¿ÊægÄíþe4®> á´YÒmÀ–;bòâòң璓ÀJv9ݾ£? p`Î, »h4{íí·ã×§ ´Æ² .Ürßpg¡ò ´eÈ>g,€ _kUÚ÷>Ó¯äÔ:/ΗA_N-7îòʧh°Ûkz¬­*F'c÷‡d0zÌ7Ëâï$}¥¼3­Bri4ÉT–æØÛ­GYwüÝÙÞÞ÷Gç²îÛi«/6:B3š¸©+±ÊiÖv×ÑÍsNÀª@ôî’£ªüRÑ3„ÒÇÃ@ž„ÜíZršewü*ʬ͓¡"–¥,dŽØ“‰§c%jÒË}–ç ŵVŒ¢\VÐwÝۥǯªÙB‚Ub°“ŒÁÅ@ØY[JMè[U¤Ñh‹sß°hñÞ^'LÄEXRŽr3ÊÆld\¯i>Lƒ*8çQטVÓ¨wÉSwÒÒ€z|A¼Ü=(þáÞG¡šÙb~ŽÀ-{,²mÆÛs°O× H§Å;áî)óZûܺ:ø±C0ÄÜÑlýìÛ¶#GrdÝ<¥ÿÿÔYkÔ… ·yðk$N«)²IM7%-u³êà‰¼D˜›mƒWK¸Û[Ý1/¶=ÜÕ»kDÇ»ÜLRlÓ6­˜FT Í|]àïÌ¢ XÊðÌð~|ay¤9#Òš’bNöjЫ”ÛU™¥±*k :8]·Z°jÃ<4: ü90¨HK$ Ö=ÄEƒ¨UEÞѽ$Ó¶¯ÀV`ýÙ†ÅJ×ê%‡9aZGei‹ òvZ¢ø· ³˜eZš¹«Û cxB¨ú20ÚC«vÝ?š¤æÍ)ÑXGšõ…TPæ‡NÒ:ŽàXq#¤"‚Ú l‰F–òˉSñä e™J”€Æµá£aË+„'ì†c U Àø*²p `è|ªb[·;:–¬åFA'rî08HÃÂ^Í÷;&”rÞí¦È6 º .1?H;}µžVáFŠÛƒ{:©tPQ¸ò>|Nœ©Ù®$ýB ïQ´@"+¿rô€ì(]¹å¦6º…ÎOW-F z ‹wÙŠËø ŒÃpÜ[žÒ,¡úÙá·ÄåÁ×nhö ^N8⦳ˆ 6…õ{³åqkJ;xJˆåAè¨ûÜs&×fq|úÑœ…U zŒ^w©,1ê:"/õÀòS;ûu:€,¬´ÝÓ]e¿³Ìlñ•Þ“:Ý*Yƒ ¢y œ1wxÁàOAá˜EHô«'¾*cg}¯[]/‚qúd>^>@Íáˆê˘å‰c¿BËúÙ•E~ ¯£ý”ŸOç9!§î^}9 Æ|¸  `mãX´|Œ9®‡ÿý¨`e/`ž”eÁ±<ÆÃ²|ÆNž0…ÇG?ó_`b¾òÆxëÌsGw húuWqÎçK¼̱hc€ï‰HjAÑ,ÆèìÌ÷gŸ=Èý¼$Ì ==î ¿ØHÈóÓÐ äs×9l”(`á [ ¶O¥—s¦ò³¦^þÊ0ç×´ãÿÞý7Ñ¥‰Üƒ?äUþÂtÂBÿü·ûÕ ôã(âùùoúé?Ëßà()‰EÈO‚Ÿ=>v|fŒNʾbµà ]å_50°ž €Uvš¢?>æ:üØsý<‚¹Ä ÀƒÒ“W?^GU}£Œ•ÂK†½Îähs};Ùaêw,>uÇ`ºþ­ÔuÇög5]¯)ë—XÂ+½$¨5öAm¬y”E··™Ia¼Ïm»Õðü$ ,…Þ¼Ç{–~áQ/ `ßÛŸ”¶·©¶g°ìK´m7e©¼§BDè!}šröZöu¶t½ý£ K[Ê«‰ë8Š ¼•¢žµ(Opˆ ~ ª ]ÞÜk*¡¬÷¢–kHŠÆkÖoÏ1‹³ù—C'Œ6Üh°R'ÁÓI×ýv&TÛÑÂZŒ`ŒîbåÚ««Îæðjõ¶‡KäîÜ•¸Ón+§`2P¡”lãŽ9A,î5÷!1û5=± \*Å­&殼¦$‘ßï-›v]^]/.¥ ÌsíëZ¢Ðk95_ÅÊm¬Ë7œæ{ÏX-à6Òö†y{(Ž(´Ÿ™ò6ÙßÖUQ…lfQ_좽Z¸ðÈPÒ+Š˜_ké‚å–è¦Ý¼A]FÅyCE¨ ÿµ–¨î·½{>ÉòãJl‰¬µ^KݤL“½¹…4ÛT»X›m†Ði›Ûb›ºÂغú¼dÊ%´ PT± ªz›\Yùœ`!¸¹}ü å«á1*²Ý·¯¢kÅ0ÒK€žÆ P`½4ê’%ªdÀ\C o³åTî… ‡ŒG8³ùÜ^‡ ÕÝÇhÙ©‘úÂoÞ¥×Û"+7›x©Ã±@d#kNË“¤"0ší÷Þ>vPUÕ9¥*îÚpÞÐâWæÑ'stê|*²…&0«ýüª {Œ¹]+ÅZªh”8«;§yo°Œf·Ðl/½Ì7·ƒ³ö63H‹þF"+©7}⥠䦶™)ýâuRs¸ÈÅ‚@շ¶¹@(6*ÿCNÝVnËÁte&´…iw IDAT¬+ŒQÝÛ%A>Ô­·ìØï©xµzeЄUã7„:~æR{©<‘¨ôÆwéc¡Èt=.×nT.¯ÕAHÁ |½RnuOyä½4ŸÆ›&ÁT #~Xoc0ï}7ªË§fžk(‚P»Ðti’±F)¢kçõ¾-ð. š?-nS±K%,ÖË¢±²7ó¹1VU,Õ$”Dெ©yÕ3«Ö…æ*†z`L™D2Ò.U@¡vß:@ ΊˆÞeÑ.Âä/C¡a ö®ê¤ 9í$°&b[ª²”F™h‹èºŠtÎ:K[ ×qÌgB¼0&”?„– ]Ò6½RÞ¯E_¯~ç(5ׄ¬•Ï•&%E½zälâ̱ηj»d¬‰ÙF…õ”yÓò`qŽf\oj†Ìus/èæ‹Ó2OÇ‹=FQú!#V–å$ 1Š2ú Ë Û.ø¤Ñp‡eÒð‹!VUUf˜ò~ö+KŽ=¬Ð‡C´•õ5Ÿœ£ýwìÓâ_TSJÌ©]üÑîv" #ªfu¼<"FK9pg¬QÔ[¨5‹z}"! i‘7AUãÖ–…W!7sŒÝQÕìT38ª0Ó7e?GkâÀ%+Œñùó{S‘Š9¾ÕX³›CY[BðÀ]ÕÌM­:ŽØáõìÛ.éZ£ÌørÎy0 9•5^ãK©±áÀRæiæ6œ8óhÚë™,—¶Ø7³ç´ã÷ls”8g£wGŒegÏ\NÍŸÝf_%óûÉÛî.i„`&\ˆf5Qgc†LÕ¶C’™ë?µh­n#s`ö¡“N¥¸+ˆZ·eZ1F|†Ĩý}Ѽ54^œ1¶öé >Dñ æígÆ4â£ÚañÖÁˆŠ¥ F½Ï§~èþRl”SLÔ/ùùU52*.*`Þàb8& ?‰y.~z„oš<ŽÜH) =£aCN "»È##R‚¼œp>÷ÇO›?ðuóÃß*¼y- ÏŒÑÇ™s•¼òñLä˜ ðüMG5ÁèÆÏßíÏ4ß߃Züû?H-üÅyùCÔ{üÓÿO—ýå¼–þóÏïOü¼\ƒ‡'àI¨9þŸÙÌðŽÚá#d0¶¦?ªAÊ#Ð{ý­[Q,w¯„íÏŠ;™¹ýòu1TìX «â’uß·ÿ¥°ÝàÁ’z«¤÷ºeï¤ÂÐ.2•ãÝÌ1ÃÏ)tÔAÕˆ;|±äì2ûC©h³ëì&¡Ç~:™B¨V©±ê‹±D¬j4i1î(1ÉÂçyœK.í=Ýåå+vîªSv{ãh8[çšØIú5öÃc 1¡Y¢T_´Ø«ŽqYù*PÜv—Ö87Â!5\‘i£fŸ˜áî3µožëv±}A ¡¦zÕl¹–Ë•t×.Ø4‘m>Ä º”óW—@ùVЉ ¸‹Û@³qqXïCSÕ æbÏ´XKQØ…RxA Dm¸.Ã1¶…²ßË4ØþŠË°É6L–Ê’%+K³Õ–`G’—ÖË’  À{ï·ñµp-¼ToÙº‹±HQ¨"b~¨¯KŒ²Í„6j碘x©ú­æ¦¹¾E® k½ÓoÚý¾ß÷w,ý¶®ëZnî•%*xéµ.7> ¹Ø\׬™ˆàZ€àÊ¿‚ö¦qoÅÆ~yj?Me‘ì¹·‰‹œq¡Æ=m›ÒV’{–ˆB¡Q–Æuû°4Ž)îm¶&¸”ã¾Þ§‡é&-¨\=œ ÙfEþq½4ÞøÒe²–^[ó.jJ肨؆”äwÛ¯%Kæ¨-×Á,r iNsÍ,¥yÙ”¥aé5×ܽG8.ôDtwf˜>‘ÙÛ®µÎ,p†‚T°œÜ Ûƒ´µå-¼ß›ÜnïÔÏåX>M³>4»„ZPkõÙdXR$}šA?¿]ާ¡.—êvÙȧ³^,,زÄhbXPû¦­-JŠmÃÊZO,]æ}OîDq¨S†€ ëÒ×R{o ·¹›Ï,=ßîÓßÒÌ%ß›ˆKœ†ÏÛœT|¡‘©JÏ· îòï¦O6uµx„[`¼Rˆ÷ÞÁÍè³R ÎÈNº:˜Ë(Žõ«‹×Ïɤ@!‡ï Öu)t›Ýt—óýØõ5n3Ÿ~’+jkÅ'ÐÕó¡Pgšù©I»mïíåÕ{o#u™ú¸5: ˆ•¹t"&»§åÑW­£9‘ßÂâîMЋŠÜ4Ù1S $ˆ#tìõc¶a¬ .×ýýYg¡@ÕÀ°T’ ¯r1ƒŽá@ÑqRsb™Sy{5‘íâŠC ItnËhÑdÌ!NM¢ µàÕd7ŸÿA,[}‰ˆïéÅQ¹d ®øÀù4‰%’ίøl¼YmáM&²Jb€Ât0Í~F˜åÜNe;0Ç‘‰#–±– ‚LtÖ´§2øWíd¬ ¤­,åÒ¼N“ãYÂ`rË}«s™>ñgÖ¾V—¥Ó×Ê.ºmFMõx,ÎPÑ Š¨º cMâ(xŒª^•uu3³šKLе—¹VŠ­ZlÀηdy€ç€<(f*âë>˾Rôø O³ÒÖ÷J+ÂVîÓL V‚±v!ð]>-Ž6c,–AIY6¢É1ŒéÁv(¨âr3 ê$g6#øæ%Ã.¢î÷@N/XY®ÈeŤÈ@Z‹ji>Hcå”/Ï?3ú`æ…äY±à—Œ¯ÈÜ—äàîyªTT½FþÏ,h&–ü~[Oyïýª `æøD½³Ÿ>çÜJ0N§,1޾…ï¬UŒ BÉ™´[L'VUä¤a¸%êÓ‰“V)‚£d£õts Wž—ÖµÀ ”i•ƼODP×âp¶­pèÊ8øËäÁU®Rc„[žO˜û ­dø4‡}ÌeäŠp*²ct–ñÉl`Q¥\ëaÖä>÷ãäéy‡vC]Nn*sÇKÙ²úÒŒ¶È£¹÷‹™Eõ]cÞh{¿ŒÑáÑ ¿§´#¢þ>FWo¹ÊŽ 5†¥þ£ê㾘·úxNÍžOR2ù„}Øü:P{J•žê8QŠàŽÒó« ŸŽc ÷üƒ®àã/ñ”qü\ªÇ uþ/§ÿ a÷ÏPÿ»à‡ºõ¿“Žÿ»ÿÆ—Gî™þ¯Öþ‰ó'‹ µÌ9ÿê'Ìçá•ïÛùå϶«éÍ$F££HÛîji–ôêÕc¨€Áô‡ï°ÂÉ<±<ç¢ ûó•:ÄÇWÊLjøªØA<®VcI«…^6´SŸ‡ô,PM}XkíÌÞTÛWTviØCØ6xE®Ùèðí½ªZ•Ö[—§Nn4] éÁ^ödç0SÏh d2|<õoq„°óIÙ`rÕo6ĹaZH›•ͲÎ: cbŠ%êž7×x-­DùµTuí}»"¼ºcÏÍŸ¾f"tåo^‘`ðˆëb )¢Õ4¨êv.WŒ¼ ê ˆ~ðW”nrYCgÚnTYUÑò Õ.ƒ2ŽË—£ˆæ¾°`C‰½¥[­iÀ*D¿»Ö*’‘ðÞLŠ@þï[o•”U€ &î"sÃí \ØÍøöœ …F$ómaCï"²V1#‚ÚÇùÖ| þá­1ˆ2¹{Ùíí±vó~¿·ðZ×k/o0Ùf (ä&ý†\¡è äR\ŠÍð/RõZáþ[À¥ëM“m›¼ªŒå¤F jàHöBÞÈw!ˆÈZ+ Ú™¯Q1ÏÜ}»ü¬[zg“®¥©|%ÄŒ”µ–Î1òÞôÛ±kˆ½˜m³¼o!WxÿiF]+P;©-4!U—´ô ÷~G³ Mä†Moé¢ÚAÕ YkÔÔ;¯ü%Q@,‡°MϲpÕ…¼i—ÁŒ÷¶¥¸^äõ#3ͤñ˜]ûpß{/—SUTUÛÛ#⧈?"‘hÖTÑ`Û6ò¼,ÞC”›&6 {½f”cÉsÄQ:¡Ì# ›¼« ,7n;«ý­¢ ,|[ËŸà÷ÞûÞ{ßf¦k™®ÃË6†ëÖFZg`ËNMÔ|L{¯ròTŠ®tþOdÎÌôÚ ˆŸa¬ÎÊÛ’H,ñþ&ôò‘xMafeD3¸²-»ÍYhh×ÜZ»4ÆÛXÔí‹|r™>Ú>Ï:3‡\j—n–ûؼaÅ×TL.ër íeÍØ¾_Z®–™ë¨ÙxdwñVœ%¬z88%C¬P%xÔûIw¸ûkGFM¼=I³þQ)IJ¨j¡Ç¸R8ÊVe6Œ9(ŽP,ÀùM1WõyÙ0–gÀáá/ˆff;ÎŽZÐ-‰«CyVÚSFH2¤XÓÌI4‚È5úŠsÇw»«x1c[};£°Ý9`œœ‡J4³r÷Nò‰£”´-ªÝ¦Aº°40e kbç{SÀ{'€Ûê*A$5Td'þª¥©YDVFÈ<|~9øË[ʘI ïò®VÒbÇëd-¢S±·ºPžnaÌo$‰àdÆo°ªON#IT´w$§Â,?ñü—Á6qynÉ* GkfÁsQ‘µ´‰ñ¶öƒíÍ~òú‹v•š¿xìYü®ZÞü<}Xî&’ DoÐ"j»êFS¡¸€“qF àÓ÷Üè^Žfon®ŠB8ºóÅ39½c%ÎÍùoŠCö…Ú[fÎ&a㼿Вw+ÒùÔó[eâ³YñþlÒ¬ûˆL ŽIMP÷ÌæÛZqôü{Ö>9ºa·×¼w»'ØÏìÔͳ×G>qóäÜ­Þcñ»½£"±É²ø?¥úÿè:Á¯Õ¦Êð—¿• ]û:÷ÕSýofý§úÿÔС‰w(í²?Úbñì+À*æSóuÎÁø£S×ñ»Žß²ð1] ŽOñä(–±Dÿþñ¼š°:ˆÈå5yÛÞ¶·¬+MDQ{RÂ+>…»Ñ}çLm'HdP€O4u½ƒ4½”½:0fï{+îëõàöD#«…1ê"«ßaÆ Âhb¶ÒâJröNá1ç4£m[¯«Æ ëºЩXÔYû8z«cQ‹à°ÛüS+Fß²¢}ù~àU±·˜ñº–ª–{×uȨ¤s›]×Ò¡ILëœK†ºô’ëÍ·Ñ”š„ëð³ø¯[ËÛi¹÷v ãΧ¿†þëuŠÈÕõ\Iú—%Tj/%òÒ21Ó1ÅPA¨ïT¢;Åü/o@l#Ø ô!ŒóxTÒ$äþ-ìhaO€¸;8$£ÑóÔe¢PLy˜L 0£¨‹þKnYÙ}çˆÛÍUU_ŒÎݥƜÁn‚².,Õ «ˆMi&jÍ“xÜå*¯¸~qÆ¦Ø þ"—âZòZKTT°Ì·a YºD–q—Ëh1—ºø+ê;³K!ä½9}£×r\¬ØmFÞä?ȼ÷kaA¯e*Z`ws¹¥86tGõºV«° ¹ÊšËdcªæî ÅH[¢[D ºÔJ,Ñ™bb·½•º–ãDü”»o[kåA] ›ämÐ蜂Ka¹©ñ« a­7šláÞ¼–ìínÙ ½šiI(^ÐàÄCVŒuMHŸžHÎ;¿]ªPO£¸)WÓ$³È^xW°ë•Þ·î~ŸØ¹à·º‚3\#ÅM7Rûûf…Ò½·¹ÖçÇlC{ì  íŽB¹.ÕµT¡f·l—<ÊÚª»*É¥¨ š1ã |¶ÅC7(p!Ø›xͪÐv|FY>ä²p¥k–ïùG¯u‚Ñ ” ñþâo×õÞÛSF¹TÞ»oÞ›>j•ÚìúYa#6uEŒj¶p¦üz“·‘‘ì÷¶{o™ŠÓÿÍì¾"Q‰‘óïu­H˜Æ¬æ ™¢ ì. 6¹R ‰—ó9ü­öA´7p­•<ªˆ˜²Ð5 Pö¢hõæ‘>RÓ…ªKéRp@¶Pϵ&¹mï·Aq»þ¿Æ|iï~ÍLÐT"‚CNcz>³¼3øÃá(tU¾ª ½Ä¾Æ$M^š… `¹Ž¥9²˜žÈ ¤TËQû™@³hÎIA'ˆ»ÒR… W©%û¸pŸuŽ2DêÚñMú }1×`a*NYºªb<8‰ >c—&ø@+2ϤEÌ‚ùå"r/9µ°Dæ±ï#5çã4‰†ˆì:#óH U$7­™V[bZÝÁñ–sHuQÊÏ~:4¥-ªR®XZ1Æ=,@Oh‡ÍcŒ³yÚ„ºl½‰˜âjb»B]§ßÓRc1å‚F8K¼ ¼ŠâPÒ߉€K€ËÑ.@)}Ê8M®ì™ Ûsxá ˆ¦C#=áê~±Žb8ð(æT^ÐàIB3ÁNñ1Ûº˜9ðj  ›Ö5ûÒóh7¤ã)Ê $K bÔ(€š 鈺…±÷AUsr. £ô1!Ç,°C•œG¹Ã`¥;ÏJ—³Ù4e)”†A¬ç/ ¢i£*³Q>2ãhSqZ[ª"QŸá·HôX4KǵaGqN2"FŒÃk}œ´)¬{‘‡r}-l£Ê;㰠׿.xŒ´ëƉÖî™ifРª¢o§JY2¯¦ß²yÚc:$¤vª~FM˜9F•)OrvüMõ_úÐÄ ˜ù+@-ù3·x–©¤£&ç= % ˯³èj÷@åQAë5Ev<)µômI/N N_7ºT'žLmýn{^õ`˜æ'«Q1RŸ–Sühñü†ù)mJxΙ†”5Tj>j‚çÛCÑ yV ‡#bJ?Ýú À©kÑÂ>,8+hVÆ8Œk7Mä'‡Ý0ÃùþxÁr<çgà‹…òÈ_4š¡¿ä^ÊG#0 Q)°g2£ÿ‡à?asþsåëÿñ«ÿ…5åCðorœþ£ùÿGüWû~å«ÂǬà =š)¶ÏÒ€ŸŒSôA€ÏªîüçIòÁ§þÐåñõ˜“€#ðø™jHmÔ¿¦‹wdm“\Y~¯~MÎ2k0ª‰yÖ¨Êh.ú¢*¹€øÁwwüÒ z%%Ï,UrãcŠàû›‡ÓÌiu~ƒRìxvÍL$lÉ#~YÔó1Np[ãC€¯ø|Ž U€ ›ü|Ê¿š–1_„Ðð²ÔïZ«G¥–:û:µ·ˆ .Çöpª+’Iéß¿/š@—b!J1rÓKÈmö@6ûA²E1& …s_ªÎ™±`¼Èr˜q5{ 3ª’Ì5­÷Fö²,Ø€êijçp‘+V(î £¶_7ÖårAœFË¿!áÍ÷‹!R.!×áúðç4˜!¾5QÌèá™§í›æ‰[­—ׇB®̨¤*‹Ö U0€> ú娸…šâk0c|½Æ€kÀ›âj>–˜b¼/ˆÖZ•˜0¡‰©,déåÍú˜Å4Ú a÷°µ%VÀË_FT°«ÓCÝcbk¹®p{°óúiFuy +W ]Ü ~‰ØŠ¶jwç3à¤<’H_ÕgFƒ·›q[Tî…/ÝIðHš^€ÉÞQˆfÄÜ)£¹6ÂÛ–ào37ŠªlbÙm÷¶+*q©lU¡¹çò•î¤ÛìÛK=¡™Wú¦„žÏ‡Š™»àeoR6œC ‹°ç‚ŸÈñ ¦ºZT°…ËÒ¤…¤y5£GÀw²"TÖbn/XKÍõ^ÊëZ$¿ß!×ú7ñPã6ÁÒõZ¼³o#LpgùòÚÃ3º!w_GfÑT‘y¯Gß ¨‚°-•{ʶ¶K—"k"[ÌoÛ’Õ½&ÜÛ¡çe–½TSY{‡ÙÙL¨ÔGXJ{¡Díïl p4ì°K$/$;Ad:¾Uö\Û¾XªYXls–Åñº3zdMlÂèÄKU–§ Bå¶}oøô)믑­ëy#7Ó  âRVéùís³9¾ÙxÃdˆÇ7|°*K—a¯85Qq›ÓTXª&€¥êMÇ ,çz‰Üw|H¿µ¨‚ºTF4R€9k0êŠ‡Ì¢ÜÆ{s¹8UM¶ÿö±”{º.ZÄ'ÛlWd<Ý$C”÷ðJ¶@ä§4¹ô¹öÁLEe§ìçEXéJ!‹’ðLÕW:½C]¬úÿ©aä SÖR b—­S¸3ïSáE¡lZqÊýý9ëÈ'èBÜûËÏ ’ŠÖÐ¥–Q0–à(ÆuÁGœ¶Òp„NàOȵ¹,@ÑWZåñ©!# ¤ ñÂ/Ðý„ù“yÒ&V¢!¤Å§2´¥Þë„„Ýa!šcP ~ógNÜ‚y1‡3×P{Ä ÆXs¤\-†µxW©·ß†¬ª d‹Ëº^Ô$¼­ËVcœšH ÑæãþÇ&?Õ’SûÝ#[&B: â /p¿ymŠâaʬ­ÆèÝT úZ!b-Œþ€Ég)“•…ä$Qº.*¹¢©ÖgÍ“£'.µ°A¾L‘8{v‡—ŒˆpÀå –Ô¯ÓÈ<J5ÈV!Öå‰ O’ÆE¾™R]µ€0£ (/üä^)êÄpO?Ç‘k°¨ù¶©mÊŠªê¤öH,´S˜ŠšLÂÏ$'“–諸×z-µî«=ÄT0‹uɲ"ÜrÜ󢃮!$± Þ+„¬I™Ÿ¯FF(ÃZ&×¢.4 ÿc7Z 휢1ÈDV™ö¥ÏQíN¶Ò1"Qkt†ÅÔ‹&âîÎó̾ÌòCBVˆy?‹FÕÓöGŸa-Në[ñy 3,¾ÖáÂ*e˜³¯ +¥ADlˆ‚/•ß©¾w>1î—¦rà È 3jç·%"YßZ-+_?³µ7øTÿù•kCo~ÔJŸ¿¡›qΟÀcÁQóØR‘Ó¶^з!óÏŒC3ÒªtoNɆ˜M¾’ ÇúFÎ!Fuï5GîkO;3ïöqJ Õo™x™‘!Ñ~Å”üÅcõk…º°»èýù¯)ÊøµNß?Ügý7¬ñƒÆjyžÔÿ+ÿù’ôõÿ÷Œa~©ú³?ýy|eêÇ/]H_ƒkädøœBÿó§ÐMDO üWÁñŠOƒÿÙOÜ® Ç!þ=Nð÷Ñl?ÈrM`Êçó)èÿèmU0ð5E Ÿ¢ÿ¿píJÅTøLUJ/LÀN]‡Ûh¾3v·•…k«kÈMÊxfoûM©-]K÷Þ®97(5×PguJRòhëÆ–NðvÃpZ3|,ñÞ[Ëê_j¯þã±B(¨‘;¼ü¦ÃÁwÉ³Ú¢Ž±ž¥éôWõu¾…áµi=sÕl7˜¨ß¹þ”nU]('ˆË²áC‡&Gg I‘k麱Ãw#%&bd_©PËyÃÞPU—ÆTf»K%SÛV3á¶M—¨Üq_”%_¹+!¶m›-Q}9§bÕËM4bƒ$Dmž+”%ØBªŠ—†ÆHD—ÈÛ8¬-MDуªÂÌ[ „æKqõÏåKc,¶=¼‹áÉôï/â2Œ=¹DwêõÞ Ò>Rç>Æ£…)Ø4@®@vÄž÷D°T­¼Sº®¤ÃCä¥Ë„æµäM3ª‰˜‡DÂcÄßëòwÉ{ãZvÞö qUò‘¥Ø/¨*¼ø¶ ?ŸÛÖê>dÅÒù3ÊàgÞMÙê[D]Ê-Ã×ʆ¨%&BÅÌae¸³ÃC6ËOŸf^$ù¾-C"K\>Øãw‘•£ ú"(|“êZ››±ËWß P,dSoìôQ±£è…\;$"@¨‹Â½E`ê2±÷‘*|1Ú[¸ƒÖÐóV ŸE¡¶AVÎíl9JrÃl¨—Ƚè~AEtÛ¨®¼ÂhqvÕ>ËRS2Ýd2Éä‘ò8i¸Î_ê=aË4ÛÀZ:á¡ÈºÖP¹±^BʽI·ä/½– ±m+·Yv&³ R’)ÒQßN;s€ ÜRÅ(}.-Èh*ÉßiQS;MŽɶè|Ï×Â†àŽ©†É^Ô'¥n݈hÜ1æ’·Qö­¢—F¨ŠšØ‚Zž@Í —öŽº³or-Q3ç„>ùíÑOȵ,FÈqw -vÁl~—ß \.g9]zGU¨óRK—:°NX¿y‡Õ;‚R¾m]Šb˜†áo)ÊŸtÕL2³26×K5U‰ë ˆF‡£Áދ☑T IDAT%QNy?•uém´½$X(DzóW"$Ë6iKým‘.=f›êc_n‚zºhç86KŸv5#÷*ÚTÖEQЗtÎ2¨Ò€b¸ÉØÊp`ó–0¾“’ ³_ÀúŠû¤:21qÑnhÈø)îäÚ¯”cHµÆfzŸ=°jK¶Ÿ€VAQsóߎuò†ˆ9ç.Š9òPOvä¤Ðë:Ÿ£ 7·£$!êÄ#wTcT-õ 2*>¼&ÅTl©KÇKYô¸&JYŠï®{쀌ûê+–>;k2Œâì1^v yÊ¡~ò+°iÖŽ|"¥#: Õ04TmÎiÄMá§à$*³Œ!jFK{ÑÅq–JióŒÖ´É½¸}˜rÝåhé$YÍ0nÛñ)*œHªêu-¯NH“l3ªÉ9Îuɯj0b1T¦R¨°°fc)–j0[#ãsß%ÆBäÒ·Ÿµ*aX©*UñÛ¼•WÈD”9ƒñs%2ÑӀ޳Pª•qo©X‚ø,À¸ÕVôñÉ0)`ú¯Ñ ´äɉÂYËW<­©ˆÐ§^eK”™EÚ/ -I¼2…ù±½M±¤½,¸DÞ•¹77)K\NÊK x-M>^Š›¼ÂØ¡PïœÆX#çÇRYn3vè’ö¾·mîEo³×Ù+âRvY ß;®ÜKÁ×¢P!êˆx‘-•. ©®°ô¯¨òi ñýyÆóU<“Õmá­¥³8ÎVá=ÆK‚v«ŠÅÐ÷H¡a œšµTî»(®|ogyûjø-·™‰7ÂS+5ÚfnÁt“àºô¿øòžsmÇ—j‚K‡#ÚU i»6 dB´b*¡K5ìß1½ÄˆÚ•\Wš‘\ÑҌ±Ÿè*}¤¾‚ °[IÙ´ ‘tQYÛn(–‡n£æpšém\JmASsÚIgàk  ˆXè)²¼UŠq˜øT`)b™m‹?]P¬ð)&¹Å³cл–Ö¥âšÂïA`.šs•åè«ÌÇïÊ›€ßÓŒ] Úó¼¢ÊX£¿«/ÈÊPÒä^¸€ z›™QÕj»·_׎’‡ÁtAtŸÚý‰• ’E.x3 –á€!·Ñ2¢øŽ/p©ÐÔt…¶Šœö¾+¿á‰ðq” –®¥ëZ @ov+¼u“ßÃZzW lAÅxר>Í6Òãíºpt·L‹âÁÛ ¥;‹²÷nA§ð×^PëŽÛ…ë–kE¶î=ºòÎoiÜôƒèà[ÞǼ7¼Ñîõ´‚¨ÿ"Œ˜>> ?6Zƒ¾SütOì0‡b›¦äìMMCQE9^+Ó_èNwFpŒ²ä|G#²Žûàï‘ÝÿIšÿ*ñúÏÓ¬ÂùùWŠòåäã1Fý÷Rê-òK‡ç³‘å7Ç_!Ó¾þ üx$ð¸Þ¿î/xNÆ’óÈ  Ú> çø¡)ŽŸ¯Ö¿ïÙÊ‹£]àœL 'µIä`|5‰Çu‰ûòÔë˹?²|•Ñ>¾µ ¿ýŒŒ¯øb{B5eãmwÔÙaOʽMS¬ÝÁ ß!¾ji€ˆªZ (­¿¨®µ–î{¤f1F^ Ì´¦RÌuˆXj·J^i~$#éÓj‚¦=0ß¡„†­ß¾­½û§ÞT;÷ÌøÚ–u‘QrâèK J¬'dô·Y¨ja;e‡JãCæÑkDàºÔÑGÖ6J­0ߢÿ„÷¾¯jùY…‹89†Ým¶ Y§°BLMx‘œ³m›pq]#Ê-º"ƒëç‘I $Ä@eÍÌì 2¨Þ¹ÓÛ3æ©X䶬L˜Ûîi½DÔaÀÕ*®,õM̾í6^©µ.EŠA®íƉÝ™i¯% ƨµÕÚú#nkiw…,Å!º|&Îúwn7ïe#ˆlˆP6q·K'Oõ¯q‡£?Ť¸ÃËTu¡n£•4  àºôuémka¯K×Zâ§YŒLѼáЗ¬“ÕÇ6Úmb¡(>KØY€-Ô Ðè%®óRÐàa~¿·ß®½Œ› ¼YÛå ï-µâiÐŒô}sæžLÝÜÌ0 »à©• º$’ 7m©ïE½sZg’Q¼cö¾.%ù~mó®×µ Ë…{óvøø¥—,ŠÝ^ãê¯Õ×åÒŸ4{\EZˆ{™Ñߨêâ•) îí0àðÑiÏ=cÜ`Åž¨®äT]õ™5K–´­”Bí§cp¡¢Ÿ<ŸÙ¾7…¼T$àóÏÔÒr¢O/#M}í›i×ßÛH®¥ŽÐ¾-ÞECáå÷Ϋ°˜iÁ†Þé°«*fWr´|Ö…ÁAí¥AÐðb4»k\qÝʱûѰ‹12ñéj¹´š¯‹ÖHòkL!™: ×Z·ƒ•ÄDz»Ù’L”ê)G3uä©3GýŠ»¦]a­³Ç¬ž÷!^lR„ò ›`YXýýv¬¤?”¹Y>Å¥´è3ÍÂoXqÿ‡úêàäºJ©Ø¶ýUp/€—ؼUYZ¬»@£,ñ•\}0ßXõÑȺM~2¦€6VE–])Z•EÝsÊóµÏ·²3×±™˜wTb"~Jö¢ìp»Öfñ*–V-]¼F'ÒÒ é¾oòWÕ§Îê-‡œÌ"" °‘£ÜA§Iö¯b‹¬*á)‰Ä=Zè)L¥(ËBÐW†V÷7Oö:v&Ü ßÖ7à²k¶#£#ݸ飅¬+<ª [ ´a­,j{¬a×4U¦¹©¦·«7ýߓ݄žû¨Âb³^ ¨¤ÙJaY¤ƒô/ž­,–à´eÚ$œžLR!+œ0=>fá¿·D&Ã6\¡ëíhðCó–ꥦòŸ…¯Ð俨•{6´÷Ú­1³ÁðGVû’ÍœŽW[.Š?Ž+›ãí2Èo¶©þ7=o¶Ý» U±Uë®äí¶ø抜+K4IwqT¾Íé–òx¥j1ðS:¹uÝÁbžUñV´[ÕC“~ËkÌ‹ƒ"‰\黉 © åÎÊ{UòîЦi´×E*¥ÇíÅ>ØF2¨èþG*³­>÷bÉÃÉÿPïâãásžÛ0Úçí"ï IñµâAæ$JŽ›cÆó -!44ßÒËm LrxÌ|Å\ l ÛL -ú“Ÿ;…E9iö^ãÒq0‰Ëß""ÏÀ†&ÌÙ*ëƒÜLvMO¿f{-!7 æŠ{ÛuDK3Zç¦ð4\xš¾ëÞØå y¹8í¼¤F›µŸ…œæÏÊïå……-OÃ;'4jTÑ<‘Fz'‹`~ urîImÓ Š­)r—™ ŽGI/"úƒ`ŠÅ~Gã r²mçºÿ˜v¯7øOE¹k:YŽüAoì8ã£[÷àõâvŽš1ÇOÎøo+àü½‚ôï­ÿnbó'šý/ÑâÿÒôÿ[$à6¿>?þ˜Ká'šþ‡ôßÂ? |Âmñý¼%IÃmžêËÇME)ˆÈ  Ôÿ„öhË»ñGîÝõ,ùç¡·åNÇý špÿÓÚÿ8ÃÝ%'ˆ‡ ?Ÿ ¸dN:|ú‘Ê°í©˜Ms)$}˜:w_/Ëæº÷¡ºrTdþFºŒº~$«ùqº(S¾Ž¨ðëÛBÔHÑ¥ÅX¸Ç@œ·ßí»UªƒïDE¯“O¤ñˆgº¥Ý9áŽWuŠ ônV71w(;{"D/V™ƒµ.u‘ÖÌ£1¡UÕa°óŪWÓ•9…šFõɲüXþÂ[U÷_ó˜ÃÐÓö¡"¤{ ¢ðc˜úö¦Œ–›åIXÒv3ìÍäZyþ³ ¾¼?€“”øÞ;ûç:Ûú#ðþû UoQ[Ìê@&K7Z…×µÈó•– šÞuL:ÿÐ3¡ê+g?¸ ø^$ÿôf†…+hΤð’ôƒ|›mÙ"—(.‡Í›˜låòD{(!#ï+è>&ArÑŽ†5â¶ž.hõ"@¶\ŠÛºÊÉ Ú^àùKÖ÷-îõ.çêU]×+öªzAîµ÷»n—ï ,ã¿[D¯XÊÙQóFÞæï¶¶Œ|“|´ K¥È Šo×å‰y½„»h‘X ké‚~¿7ªNÖ;u«»ê¦Õ.‚ZŒzÕ¸©,ÈKU27]qºø8æn‹*Õ.HŸÎHNGͶðå6wõ¸wgØSárç z oÙ·ÑveY¼Ú±Þd  ‡çêÛj…zö¿ Ö*jE’öºIRüÈö¯ÞïºÛïä¦k]KofN­ï£¡ý©ôXU%×ISÍH}Ì"«QÛ›|tø¿#$×î—º4 ép¤’ibUKÜ»:Zð̆ÜfÇVâã¾5'€@.]·ÑK,(ðï(D 4/=«qÌrT •¸÷çÆÒÌÄbpRƒùŽm°í4ò¾·k«o×VRÑÈ5‹–À1æÃ@rZ î×SÄ \Â¥úNHTÍ#ÅOÙÀOñQ…"oÛ4êZyY…zìwoÿ&½[à¬4WÒEôêu¿\<9`F£.õÆÞ7ÛQéêÕUô)³ô©÷¦•mk)ZUD°ˆ{‹ì{‹CÌ¢÷¢C ËëI‹û.©é:4«¤ùµIe*\}èÜ,Æ9KÂKÓGÜcÁ–ã^oÇŠ˜‰†¨™ ¥ú‡Ò´qfãP˺Þeѧ}?f$ýPº¢ Ü©ˆÁi,ãk ÕCæR7-íÿ1€@©¬hE¥0DhÍPÚiÁH{Ïå½QïˆI6jãg¤xcR~á1ȧ8·žé‚UÝr¨‰ŠœB¬ÊùB+`ám¯BzzEÈDÖÓÈ]"h»Ë\à3Ý7Ñú-U?îço+Òý.‚-#¹Òɹ0¤DFÙ§„ÚÖ¯5æ[eúñ³kDqIoFˆ|ƒj/¦)è5f¹Ln›qdãW«ÇìœByçÑá›×µÝÏ-1 Ç-¨&åÕCЄ4vßx¶ ê?ûe™cöBÅeáɰسÂ-RÆ$1)A%¡Ó›ßý.˜W[n¸ûÖpä P§fÕ*Ž·Ù-ïž"‘êBÃñ ÙÚà´BM+jT›d¦®ÉL8q$‚Cå§ŒQ¨<¨Ý,\P=Nɘ=­a潤²/Zâ>Y†Ð§h©O‘]è!=ÒîÖ)¾Ôœ ãäÍmPI¢‘OpçEÄqêcæ„Ã&?Ç#ÕytìYA· N>[¾€Ä?Jß—~ždÄjÓ_zWôÕ+?TÜb…øè‡æ/*œÏWç?¡‘þÙš¿ëÿÔþú—ø³þù²à“Póï8ø•o ¿ò½þ -â«f‰ªCûQùïC¼™ü ðe—ñÐÁfÝ‘õ,}âÌÛ¥5Y@SÖÿá<0é:gÔ`ýŽ÷\ÕÇô¢g þ&q¸j¤õ‘Bž/;•}ÈçÃþ„œê¢Ï»jUXãÄ™6i h]`¾t³¹æ#Qo&îI—¦®È4kÄ réuWd)oÛƒ–ã;,Ô©ÇoÀ÷KTõß땨½DKRðXõž=„뢿\3µ}‡§Ê¶™ `n:Ny¥¥{ï,(wªàÞ½ÿ‰3ª1&]ç̤ ŒgKØ íFrWeÉÞ6¬a¹ÀÍÀ•KC£Â¡Kî0Ó»?Ka&‘ƒüRö¦ñºÖ ‚§¡Cåá´f<3óc“MŠSè}G¨Päb”3×V¦Öü±ÈÓ%Â{;‚·pivæš'§g–²®‰.:›"¼”0KÈ«SÃéï£HK„ªVt\__*ù=IHÈÍ/­É†8ÜÅx]k‡ª‡#"¡Ò¶ÝŠkEaؽyÛhÀ%lpoêryí +ÞîÛ½e»žê"Ä&·o=–Ò· ÷ûÞ¤¼0Ê2_P,‘{L­B'”íý£¼×aà÷ËX¹¶½ÓÂhXÉýÛbêu­„ãô2Ô_ÿ03ðe+äÆb‡m3‹vG:B})\¡öwc¶lÑ\³ìhËÝ›^Sìµ–*ŒÄͽÍÚø–î‡ß†™M 3YZ˜6›O"ÝÀ0Ç™T`@dlY‘:(\;–èZ©'îhsdþ·‹K#{´g“r£±ôE˜™móÉ`ˆê‘äZ×£߾㈠o‘ÍûŒFY¾*®ã³‹£ýs¸tÜåì¼,(¹‡ÄÚ,1 YÊ’›{F¬0áé ÑÒå px+õž[P6¹ï;#ŠM¹KSËõ‹›^šhÝ}{̹ÇêOÓL[ÒÞfb`Ô)±^ª@US”Nul¿Ë% Í0©nƒÞIÛ¡5ª' \%ð½s"µsqóyHz…ÉÏ:q¨RUiß®™ke#è½ìì]\`»¼+^H±Í·ÚKu3ÆfÞè®bu’ƒq'mÆ“ZÑáMs¨‰» ²‡FH®°ÏÐb.Ú•‰¸°ÒáUÈÌkQ–7ÒÑbã†æµÊ®?ž‹€*T¡­ÃÝ9ŠY¢f¶7––'¦¾‚YNDry–+ì›ynYÆkU äuÏ^Íáq¢'N8´6»wcÓë±™ê`û~!Gq\0½³qœN̨!o{@‡­äÊ̯f¹©Ïï}£n(6Æ&¾RÕP³Ôb´â/±´â£ô§„òš¸Ží(DÔ)‘~`¡Õ_ŽéCÏza±ÓÒ„91ãÑi È)2bbÅJXÑ·i<ù à¡I–läS‡RþSo¨ß •·Šºgh¾ñ<Ý*ù„TÛ“oï³Ü`唂ýçÅwËGmÄÌè™Læ• !dy….©ôÞ­òøÌÁ%bÍ`/H8Ò³j³99>C%•G&'{ás÷ÉjÞ‡ ³¬“9š‹Lά»AµYf&À§$hÎ;*·á·¸&¼<4ËݘÕ@‹ÒkY9ù1Ú­~æºÎiu {¿rìÉA )2º"á*†\¨‡–šéŒ5§²j²YB5$M©{Eím”¨Ql­YOMâ#“iU\z‰ˆq—¸¯@¸fiŽý†£(©xV§Îˆt‰91œEuÕ&ˆî´;W<»"iÑÊ•Ê|>Œxª*#3cy¡£yðÕ§m_˜>7›£dB)!¬µgEeâ‡;yªüàWþåôªƒmåã;|îÙ{1'41sÍÂfÏk™Ïl…o_áøã~7×Å_K£ K®³Ô¸Ò—‚}tqÇ_­™WKç<`NY1÷±™êt…S—fû:¾³[Ò)™±Æ§ÀmÇ @Æ›œŒës ?OõŸ)Þ?–.Ù ¿ù㿤uR>0´Ñþ"3ÿ3€¿UÓï¿ìmðß=€?(΂'¨ëË¿phëæY m3~Pûç;WLïÿŒ,4@HçøáÈDöèg¸Ïã3Çü2½Ÿõ-ëA¨¨ö›úók0Ž4 Y¿ðr›9Åø ˜3€ÕöÆ‘ 3‡ƒGaÔ}¿9št­Äßm[n©þ(4`?Ü‘ $qÖÄ• ]U—ZöëºcºêáVýšPÖ¦YkE$Ÿê«õ(V­D“|Ée9&ÊrÂt—äƒQ1«yÆr­;Z |D€‚—îÙh'åê¬jG£ Ñ­”Z8‡M½"Ç¢8ˆyaéZ÷?¾[÷Aj^`,šñ;dÿYLáÿÉŒ«f¦ë¼y„'9kÈÛ»|»4sîê¬×Éuº°ïÖCâKÝ"K5Á£Ûx]QZÊ…w®^DÔQ#=Št‚1wo3Üfk—zbs%ºÀ;Ô1™Ùp͈”¶™BŒ*Þ*âc‰Eô&F-¤ÝRIoˆð¶8º7y™¢¥í½ùÍLó7àïÈöûÞßoºÒż.…Q.…›Z|”%{oÚmTÈ…ø brq›ëz¹kv•Ð;ûÀY!…0½Ç¹²$*Š+I Û²=Ém94Ñ¥ká¾·m~ç½ /`oB K/gü[ÄY¡(•¶ÉÍ3}ûMÉD¶luÍ1в?v©|7H[¶'¡òM¨ß7¬þ° äx¿ë.,‹/3•H ¨‹Ÿ„–æÞK±}°°bWŒèv0bx)Uáͯï©Ö`œÒ¨kOKÜ{äÀi$^ÀŒ9Ï(WuÐÀ 7ˆ<Ž‘€^ÌŠ—êmܾW­a~O#yÜU—Ü”üþ&T–sÒ“¶ÊZ~ްî+ÌÎ;óI[3@ÌE½!Y¼¤Ôh÷æ¥D ÷,n¹ß¦‰åqÈšb2bÏ{¾À{SKÈòyxÝbö£ /s¨D——U°¸>¢€Ý¡g;‹ sèbsOü¨Îòvö-°*â>–™qF]ˆS q™~qCmZÅ}¼3ú{jòÒ5ã7M¸Ã+ëE©“Ñ%TÍC]uö®ƒuù×ÒïUCœ¨ù˜ï(¼X¤ymÞºÖpÚ-žö@jntƒK±@dN¶Jr©âΙ¬"蕦4MdLðc’¤À”çlºq%{L1* SKN8ÕÓlG‹›ÈŠÌ<=̧Ζ)…bˆšÌ6KÊ-–²ÔÆ¢tô7æÒ؉ ØlÊ3Š ËÞ ÇøÕuZÅU^úº5êÓ3è7Ãbz–²ÿÒ¡ÜcÓ{i5´êÒaè­hT0ÑLfÄxEzòŸC¸ zl"éõI¢¸WÊÈÆfµû3œY?ëE ¬YÎë:ÕaT£ELò«· IDATràQœokR| T ½!=û 8<Á£+ϸJ`Ä×”ðLf7j)¬Li@>úÍ)“¹Ï1·¹wûµ§>Ó'“iúÿJ\:X ÂüJw d‘‡Õ'«¼4Kiʉ"®dÀËPNí²QgN!ÆtR—x`ï”Ê?`•W”€ÉhÜ´  ¥I8üž±mœ†ÿÍNÑÒ‡ž7“òÕôGPdt)AW‡¶œMKS$­Âé¤]Ñà>f[eŠˆ.àZK¡¾®¨õA޾fsÝ’‡.s•9N¡‰E+AΣ»‡Ñ€Ôêâ0ÿ§…HfáœÀÄ,Ë™ssIÏchyºó'Œ£p›y¾bêE‚”áÜ,fˆ™9­6…þx’ªR±<´ñ(eyÓ*#’YyŒŸ{ÀðI”Äü…"‚QŠfSa‹ÏYÎpð”…s ô»;)ÂÖ+‚CÞxYÛ¤èí–Ã"Íw4o:Æ$ר_4ç4»æLpÌ08çÌåɰo'9?Ed aÆZHu_z“ÿ0Ç-}ŒÉ³çz^ïU>ì¥^}óþ §-p,šPÙÏü°+ŽþŒnÎè‰Ôð|³ ŒÇ{ÿ1¿F`(\Ø”fÙÅZýÑîýiÒ>°@_p…(Ÿ'~(ùžcx°¿µlýÇhî+ûþ¿zñïØÌÏ¢Úßûeàǹž—æWw üè~ðއ{ /'8ÔŒ äˆCŽøñ#(o锩pØôÎpÀXh¡ôˆD÷ÔH …üLë1@ͽùÑx xØøûEÚÍ\¹A.êWcƒq¸¾¶¹WðÈò^•T”wÕŒ÷P#¸Öªf]+Âs *Ü. Ú(s3 UW0ü(óøvñÎŽ¢Çæ:V%JE^k©™Î7Õκø;zdÁb…˜ÐŠiý‰ÐÃÎì·u©®™Bç)êÍd3sïÞ£PÅ™Ùö7Ͷ¥ 㣖rAÐL6¨.‹jê«-3ÛŽuHÚ¥OŽPg×X¦íÚÜêpR¢\Mt¯ô ë —Ô¶ÄÆÑl¤DÇ–7zt±¤è†¨rËNI#c„£árÜbÑ`\‘ÊÛ¸ É>§Ñ{M Ìv Î À<+U\¢›$miVÆŽÁ]®e°ij»ƒ2!âl¡CÞ%Å&ßûÞ\¯Õ7 “QÈ‚ŒÎoÖj×ócaÜîBY5úðƒ;³(p«•*”¢mÏ]µÜBèײ÷¨œ¼@n³ïÛÌöµ^¾Mº^Pì6½ )`>€¡È¹]ò2}·=º44žº&Èѱƒ’7íJ˜~=;l›™¬ ÌÆœ“U5‚W>ÊC»hnX,Š®Pê qTîmY¢BÒÛLLlå¸losŽx”s WTáâTh²i¤\ásƒE¡¯VÞQß”Þ7¯“È›\¹íM';Ý«kqÛòfÈm&ÄËïç+-©cÐÝrP¬,…,­é9+çÀÂx/B•—ÛÖúRia{3ôú7°NëRjŠN–⃱@ñÆmiE¢;×.ô“Fº©v‹‘ptÆP/rìoüd‘íAìð½Ç“|e9ƒJt~Xú§÷‰È°Qƒ#"GÈ*?£J]·±+ q«úG9¨ê¥z/Ùû»‘>]–ê^ÎkÞ¯äu)Dö¶=D =AhŽA:‹¹©»¨äAº| ݽ¿Ê,€f‹: X‚ä{0_–˼4ʆ³N&žE~ +dssËͺ&TaÄ¥+7¡²IÒdzÜÆânà¿{Ç;þ<í>f<2¡¹`KðŠQ>qr‘’-§¥}h9èU ?ú꺷¶f3¥¨$‹¡mPÅö9¢MBA¼©Q,]íÜéwn•H–( ‹1¢%£(gÓxúï°†K ÀQqæÛ ‰2fªZ©D°ŒŒ£úC<æ¸bŠÛ•Cä*dˆ  7ĉ¾Oµ\¥m¥iî§ ]êHçx HÙ«ÔmL”?”Áƒd¯4,”ç̘ x4t ½vb¢:ì‚IŠÌ;fËVð¦æ–›•îßó¼ÐfŽœ¸Èg=WºHª ~pGê‹ãlÿ¨7K‰žT€2Ýù¼‹:²$êÁt àeÖu†o#'OùçÉ™¦˜b©Î‰k.k”HLmÛË–¸æ7bùš $Åì¢(çTܘâflýÈÍe«'ñ |(5Ù’†.› õ¿ Ñ(ݤ^þ£¸W› ƒ!Œêh„+ {“#ýÆy±¼œÒØ”ÓwÝV—Œ¯¿P¹]ôž ÇÙY§›JOá´rÄKí´Ãj9ÝàŒ5‚vp¿&gd)jh'G ¥PÐà±ocµÊ0s1~¡ ÿEîï#ÐÃŽ¼*å?ÇÇ‘y]s´ËOÀ +ÔÂB–µ$/“m9¯9 lë– Þ2;ñ%#®$Ï0ÆåïK­(gÁ×xÖ¯ŽÒv[ÀݾpÇT‘øøð¿#[u8Ή£Å¯' xP9æd…xªsøäíó¦÷ySžÀžGX€·í×òäWýxóª”óÿuŽæúKjóߨó[ÌËü±ÿ|R€ OTØ¿Ù?ø^?êßýºFà7ÎòQá ™!¾ÓãTýWòlÄ&GGÕì,èÿêæÉÕ?ŽÁCœ–üúýÀôËÓ×…“àpÿñ§¨•@PÝñŽdÀÁ5ô5b[û3ù›ådY>¬Ç·ØÏ–âAD®y©†}yÆÉɳ>\ í<®½‹;ÒénSA’¤mâÇ Àh®£œª~KO?9siˆµ®×õº·ÉÞµgØpú8…í£ýsÎðß´râ{[„×WÅ} fÛ•Ùm¦Ê•ΈtcGbªNÒKݳ¸–,í>»iI‘ˆÅ—¾ 0õEz–-E£op³½«¾2üÿ»ÉpB2»Ã/¼.œ-Å6Q`[ÐY6ù‚»_ÅŒ·íKTëº\Bª3Ó×…+<¹ÉBfgÙ¢ô„rÕ Ø6ª"Ú ÂM]½«¹Zb´û¶oKkmß—JÙ¼¬gÙûË^ UšS¬¨¢4ÝØ 28õ–›™Ê8¤’¸âü—ª½×Jå:ØhSd˺0u ±4Õ†6:Š‚Ž Ø”EÙ!¶›@·ù[Ußp©ÓÐð¶m\ë\;¹ÓšÔ-¶Ý·‹ËMzDÖ“„Œq®Ê<ã"º£ó3—XáØ•›uS¨\òÍì6:`©`áóùê5·Ø…»°\ºügBD¤ñôÍønÞ÷‡«ñ7yß¡¶g„HƒéÍiÉJçgй>ÿŠÈf–±Æ™ë`ÞµmG›JÞ¥·PlúÁÁIAÎÝ0º%×¥ÈòôÑ{›Š`­í®´T4DI ,R_.õ¥°’_JDa¶kQ·`A¸ÖÛÛo >áTˆn5W§3õ ¢q-q¨Zµ¹ÈwGªƒæZ%ž üUൠKÝùZKái˜Ú;a9Î^QD­,WÐí”1¡Ãµ4/hB.O0d/@=7Ú^†}ˆ÷˜–SRKd>UPôž6ñ›ŽŸñ 6çáeÖtÛ V#@ÄÔÏîm §,(ÝÞ۾륹ø³= £1ßìþØ‘‹ q2 $ÀڙεƒÿqÎv‚ÕÀSyÌQIPÜ‚ÔLýôÏ·¾^~ž?êܤepPñÁ(ïäC“RdKòPÛÜ£Gì½›K·“àìmï1¤[î-\¢õ Šé< >U7m&€ß¤;K5;,»p,®›B?ó¢n5›‹¯Ú†÷3{‹qGÚeT¬!@me¯i¦"ý¥Õ‹Ú1¿Ü·x<9j/?ÁûL(Æn}‰/yPžx Ôyÿv'‚O«…ô´kÞÀr€2‚2*YV'Ýu=j® 9˜M –­Nl3ÛLk{€{ú>É@Y;ñÂ݃½gŸÆ«NŒí>уƒ¡«zS[ÎaY6“Í~¥±n|‡ÐzÒ-ŠïìÄ‘²Û±ƒSÎ=`¼“¸ûPN;xÎw؇ÄY!8_Œû¹”ãIXéd(àC§¢Ä,8½Ð±¦ jëDëH~.vXŽqÞpŸNgó +”T ¢»:âMròÀdÝðÁŠèà!E”“gõî®kfUŸÂýÙN#£ð8kw>²ŸSoút¨WÛs„ž:¸%Y fC&-ÕÄ«û„wŸðXßóæ*Ú¹»ƒ[wH=Æ}º{gA:júÄü!дNÈI鿉‘åÅÈ’ÙKŸÿÇÞ»-f’·º@dq´Öû?꺰լ ì‹8dT‘=iä=¶ìºÙäÏ:f"€:xÏÙãÍ/º¸þäŽèw)ãúi}ÀwcýÊ7ù—Ìþü_]©þï7µø·ý¿rÆÄß:ñ/~ÃÌÿÍO˜”‡†¶†‡ÿžð1!8ÓñéýŸ•zsZp¬÷=V`×úñ1TH¯Ì7i<žÈ]çÏ{Ã{=¹/< ÀYG<Œü‡ dGñ<Æø2¤Y~cÿçd"uÔ^‘Ði™:eš†¤³˜šÝ–)LœóÒ¥rºwÚü‡Ïæàã…Ñ@ö¸<žÉ²ªßÜÅüYË>.ûÏUû5[‹ÕþC8™AWœòŸàÌœ–8O]06wÉVdQÙ~„ ï„W×ìèìF33OþNî`:—X/à»"ì\8–rkf©EÒÃcÍ´Ć{ÑW ï¯ÏCçHc•¸ả3Rôa"<Û[r÷[ p]\öé-a—iÁ}«u ®Žb®ËݹûC¹ÀyÁ²ðgj±ZÒÌk¸8,ÍiæŠZT¹üS°wð™)SÝyepû\pÄ}&•:ŸÈ‰[žM' + ©çAd¦æÄ24õøÀ—¸†ÙhmÒ…zât¹fÇ—›Sýl{„†%ì²:žAíãcÉ L±à «·Ý6ìû¾ïâ÷Ò@[æ ¡’Y€X賈JY™´±¡ Ö«Êž詟Äá2«ÕÛ`é‡oäT(D¨Ü†pñ¢ýØû?î;€ œæõ Ê“ OxÛe¡= ˜Ñ mùÖ®mBn¾œnH>Óþü”­ð¡jÁd¡q×Üëöýcï_̰"Œl]f²·¶ôAÉa-î­íø¬äô/¯°rùNƒØ-ºB..É™b_Èb[Yଜ î[A`˜Ìƒ>¿÷Þ‘?9‹w[ ×.h—?µ>¾e«§Õ([[»Ãò•äÎ$%Fòm­ö«L’‚t» Ñ™LÏ&#;&‚¬Ÿý‚EÜøñÐV=Œ¯U£•$ Ù•ù¤‚u¹¨G6èÀÎ×"ÁË"†c–´¨(íà¾EÛ»÷oZdT)¯ËRrí½­]ÀŒRȼ.VïÈ,¶—!ÃWqøÔÎÙ£’9€/µ¼Óúr¦h#bUó.i”J`ôúâL¾#ã!RY,?Œ5>(þ]ßéHË šÄb¥GÚ:¤Ý¨Muë퀭­ †©þ|èJ› y¶“4´€(¾…åzàœ®Yð{·µü' —ÕiŽ*ª‹ žÊTJ­žÕ{JOŒ¬FÄd¶ç¼õ´û.ÓË· ’ÊÊÞ ¾#fß-ŽÐüp¦“ìÿ@öÔ¿òT><Ã9¢<Äûs¨bË­½ó-2$wå<à®`úÎݾUáÚç/"‰3Ë´F !Âm`;ižfþaç¼ÓyòÚ;±ôŸWŽÜÀsðr<¾jöèêóçàt”tõÎ×Ëá¡þ?+—ž?GORØL>éWeø×¸î9z=pþ žý¿ºOýÏ; úñüÀÿþß?8xa·ê!ò<´<‹)ÜÿÊ7þIuíÏÒß«ÿCï~½$òN·/§¸ßÄžçˆyºìGðñÍãeÿ/§=lø|ç:ìàmBÁÃ&‡Ö äËå«Ó¥è¦Žöävö’Ê3–ãÎ(‚©MmÞãÝzþ"ç‹kè1crßmíQöÖÁ /ËÆì™Zäm+U&írw»V¼ÝÍk@§'& ¿šcS‡D×·¥É¶Âi¥t(šÑí¬Ê—¤©à€I<žP+¹¡ÑR¥¡sÕ"­zWAPî^¼!#œFzÈýrp©*ZI"J†ãSl—»«  Ï=rˆ­gVA³u Í;ÜUKZuyyš¡ò ªa}t€FÏ– üˆœO{dk7P”ܰàV,7ÁIVŒgÒΚ}¤‹à,Éò€Zætp•ž5¬%;ÖzÚ¥ Ÿõÿc6Õ z ÆîB'͇ãGHÙç¸^y5:ðY{t+³§'l½?ýÞ¦jU—ÈCÀ ”‹Å£S ?©K|)-ÎyO™³'~åÊ[âÔBêÌÉäˆJûcE7‰z¸0@˧ëÉ„½11Re7Jìë55N,‡3˜Iˆ\F¥Åf¥ä™"TdSmãÎ]‹vÁ™¸ù"N–„žs«xN¸ ô\ß»»K¦äÀ )uWÆpÀ»wWr’·Fƒ²„ÕXyžŸTÿY•Oª± •Æ —žŽ´8ºF¬þ$§kKë;®Ej¢‰ä;äõqÆ*v3aI,2¬x|î>zèû kva磯žTéŠU±Fí³FÙjnòXm££«Å»‡ÌZ¤še`Ñ;ˆÅ¤×’X0ÏñÛl]ÎcÞ–ëÓ;^ «îl+”Q•ƒ4Åo QY³ÉÄýL‹‹Ápá/·¾Q`¿$ØÞ»ßQÀQ ´õà¨_1E+§ý˜õ$£ÿ4çÖÊ1ÊPpf‡GyH%^ê¸öçã¼dÇ#ö‹î RÉ¿gKâa¹¡+m /¥·=Æ}(èó6Ϭx²ðçd·Ïxb蜶ä>ò4aLazà*¯6õºÑ¶ŸË‹“RÿP_Ø·=|žãÙ=Ò{.u„˜é—x«óßàös¥ú þçY κûSᨬ|]³üz†Õ’Öã—úN(ÿ&ªù¾†‰ƒ?Wõ?ÜÛþ§ý~üït¬þÕÿßßÌŸÿ ßo}) %[àoE¾a3Q_Á}'ó/ì_>û÷Å>¿êÀý¿þvvÜ+|N´M›ÚýŽ’€ÒëǼ¡I|N3Ó³¡è÷±”æÁlæJ{ŒfkÀ÷g~Öè¥*¨SJ<þÕu|?­æ÷ç¨4ÁZKÂ}ßùús·ÄÜ«Çqî¯P±{:§‡—Y>†s~ÐÿáIY8)„þ'9à3ûI:KÂiž”9¥È€0ƈDÀèkÙ{6qyÎì”äþ]\Μ^¸½öà@O§9©ˆ:µQu -ÛgQeûäýð,;µer…Áh°íÛÝÓ9 !wÉû“qè­N¥»¯µÖ2‚¾u6´µt Ýéc]ˆxÁv˜™Á²M£Mñ„Wo³‹<ŸÇŽèå “Èsv']Âbo™›€‹0#ÉA’ß÷!'&è`KÓ‰îÙÐ˜É ¯2¼3,LoM´]Zn² rÕ ›Ïj~ù– —²s™1=>*­/x„™/»äðc¼(vlA-¦.„FE‘-íÇúÙ¸ß÷ MQ« ¥µ]Ú¯u‘‹4åÀ*ÐðØñ§M"ç—Ahútw0p7}wlh©‹IÏSÃP—»tK0]Ë>qÖqoyŽóÚöP€ÀðÆÇ“ÈøÃµ?·C¿ü²~ùe”ï²äÈÖõ±õŸ~ïh.Ý››÷v×&Öµp;.¨…åíð¾,fÙ€·áSé”éRÏG[Ø;NÍ ÷½>}W2ßd€Ë ˜.$¿¥Õ†ŸiRTÜð¬}a»Û pSuØ–|§¡såŠÈgÁ-ÀƒÔ½¼öÈ)Ÿ’‰ÛÒ\ë^b1dfÐtï÷¹Bt¸"ÓÐãšhŠCóͧØ%î×Z$h¼Š9“ºfÍXey±m¿}ßû“äÇeÂbÓ÷öµN+äAt ƒt—¶á‰@±e…x.Ò(‘ ¶zwÖ7M?5<ï XG·&š;ÐKÞ1ž¼]8lŒÓ0͸œËdÈ»ùò6 áÃŽ©‘‚YºOã9³ñ` ”­ùܵ°¹,ËÇ nRÒðֵL¿||,ãçç§ß»ççe× 6¶ç,Þ}´½´rÐÞý‡.q»‘ëri™Éó)I4Ÿ¸‘nçÝæ ºº¥<-Å®Ž\nùvçÆZ Â9æŒgtÕÂ¥x>{ÿ£0Ù¶ûéûä=å‡Ïx%“VÃæœ×òÙ¸5S–(hDvs–Æk®@ÞÍ¿+_É ~)…RaEž 9|:R"t÷,:oB„²*ù`š•CŽœh÷ú0œ¹]Ï+MY:.JçñŠzÕ5äø­T”…Ñm{„jˆ®¥ª!×¹\Ò|-ªïËóÃûÏxÛ €‡(¹…@‰%øöô-+[–2»Ã’ªÚJÀä„5 ;¥ìH ·Rªb§Ìp€/sºšcj¨âvE§šOÇ ¤žÆýü8”BC—FÐRñ^ 2ŒîÔÉëðx’ÍT7Uy­³&ê饆ŠBæ#oܰÞó!P–e±Y˜ì%ÛôxátŽLjÑ @«ÉÁËSáM´9¹¨O?Ÿ6«8Øù†mÏ IDATöh׬ C+Ç¡«›žÕ§*KþsƒÃVö.£‹i;X¤»ÚÁ¬HåËÖ< +Òü5vCÂ0EǺ‰YM³5òìc§ÄÜDà 'šñÑ÷ÙA¦Sc’øªÀþÖÔr˜k°Ð+ɬè­V^®­ÊŸïµa·¸f4ìñ',Œœg±ØÓ¡ÖÎþ¬ÒøbÇ Ÿ«K¾àCx0RÅh¨ÿµŠg#lÂÿM#ž—™6¹†÷žÐØLö£¡’^¹7M gÚ¾J…îÄXEžƒ¯š¦Ç‹ôˆÍi4ƒÀç°n:H9åÊ]ÕD#^ÑÍ Ol~ÂfóÅDz3ÔìŒ5f›Ú©;;U.ðä7+ßEêo‡eòŒí=–ì~'MëécTÒšÒ±>FP£ÕâYt{šäÑ#µòÅLîz8+{€êp(ü3¯.bæ\ú) •C ̪$³Zëú£9ñ)»Íã§9¡á·z´¾û3ì¾Aÿ™„Í_Q¢¿è׌Éÿ àþŸÖÄÿÕRõŸ¦Øÿ©ô_ø÷öþÿÎCË/_Î_ ð{/ÿx©òyoO€Ï¸Áøå3ˆc:Örç­Û¦ƒÍ{ká”÷òQðÇi§¡·6ã#»Šw#ÝÁõÏñÀ´~§ñ©›ã‘…igꎑIZ|×›ês&*ã2¯¯ùã9Fï'X /Ýý•| q./B:ª}WG÷D)æ8› X%v^©5øÒý“ÁÙ¡é’¤¥W‘@'Nã]îî2;uÁÍÙk}?Úõ4ɘƒSÄ×\eŒ%z# bð(Ì ©½¨ü%šöÒ3Lmf„hX–:B{|L©´Ý”E%"ÞÒ®VO›vsP‘Q¡—¿T¬’ü̹HÝ6'rQ·L÷Ÿ%=¹Ý後¾Ö}ïÙÏ<Ë }|¿gCïNT{6ÅÓYt˜;—åö”¦Õ¯lÚÁÅ.ߪw´7Ü}ßk-xÔ’¹jﻺºBÕoìÔ±8œ¾•nÎ(Dì }ü~\gM=PV,}µ“×,(Ë]Ç,HsHd¯¸ÓÄiyÀ\ÓÏUn£‚ºªj‘€oŽí¾¡uÒ8¹qR×X&33³ 7#y¯ F­+±îùÒ¼ÃἌ¼òwäò~·"hŸmÂF|,³8Pu#ßÂrô8í2ý3›,+"C2˜Áån‚¶Üïí·Ç!vè^O#dö±`+z³»-RÑêiý˜Å`D¿ùëjž>Ü·¢-~Kºh÷‚íŠëÖ‹`-šqÛ䎽sËfÇÄ•˜èÈUÙ(¹p­ë²µ®UØ ßŵ¨÷K¸Ã¹ ÇÎ9´Ù wvÖ?ÐÖÞøb;¤,oïþ€RQÓ}ÌDûÈ q†}šrßòA¡73ä;ˆ]Z™®mèí½ŸmsL ¸+t¬3{Išm”×»¢9W Ëllñb‡˜¡*B­TUƒ±ñò|iATXfˆ¢ì]©Í–Y<›é~ß;»wÆ~8ŸŠF¹Ó£àÁµ]©ªY”r0A2صüÇíãõzÂjÑëš0¯¨º¿† kYþn¢·´:¢ðýnuRßÛ?ŒŠœIÚ®“‘ôò¬HÚñJnu¸Ôn¨ãU¹Ýmõ’¢îq–äµÈô³ Õ^—ˆ[ÁX éF ™t`ráÎz†¤ ¹0RŒ‰/J{sÌÍã¹¤ÆØq~»N-”wIÂf‡Ú(/v÷Ý£¦¥˜'®®‘M–Q”aÛªZõÄ1!w‹Ù×À¯4Y~ŒdY[ª ‚±[š½¹IL@T‚Í<ùVñ¬Ð8^ä£Ñ÷úaK.Aƒ‚ŽÄ'ò$m_ŒÇHæ¸K‘• E1¨ï)gš²çµô#r™Ø{%ž®$ewÁY¤ÈV©9ú›Îá´czPY¢»¶~ih¸ÊÂÝe¿g>ð.“üàî4£'ÆÛ¶`f±­ÎLÏÚ)ém×M°ìðºG±X>mr– ¾˜»h ffºÈÛ¥œQžTå<š¥É§1´<»õà*aº=Ê1t¯~d—¶÷e[»õ¿Ù¨Áɧ¯:YŠÁnYÇÝÀ CÅs¦HÓ—ñµoà «~U*Õ—Ìõ½ùø0Öÿ«õ࿚wŸÿâoþ¿3€ôLðÛÀÇ׌ٌþü›^ôgg ßà3¸¯äÎüÍoÌGÐðªxIé§4uûîB*,íå¬Çá³ÚS‚bFõбÿ_Tš Êñ Î#[–ÌâØœ´ÁãÔÌiMà]m*­l÷M3‚¾Ô óYdûX«Ô/x•æÌZ9I­ìµ}ïŽÜú2 ‘¥æÞp¢±dOœw+æf]Zø&¡å¯7MoT‡ídü¦F¹ß÷-í^‡I~u™lù*"?gaBõ”=Z‚]‹ðž-Äç¸Iy…¹u*j¸Õy%™…ISÓ\577Çþ{² ÇÚ¿¶;Oª…JRkäè VžƒÞ)\²ÏEd Œ]ÀpÝî¶.³¿÷ëÞGÀ… ³o”ÔN´Æ4ØÛí½úÔKø4!0¸öYëQ¡À¼ÆNåFüŠî9$qhßf¸Ð·nIØ• *:Cm·œ¢c­Z”¸¸-R¯Ky¨TŒ|‚–Þw„ \ ÍÙe݆ú:ô j<6n¿ÑõãÒ‚"굘^„AŸÅ©¡ 4rC2~·NP£„åéÚ.‚f+ åŠu?âCú`åŽ,ÞÆµZQ,›V3Çñ¥ëz™(hä3êÝ‘ ¥CÌ`&³åô–¤O¾Öu\kAv-çZÿ÷o¿|,ÃödøvÝ;Š$´]—wý2cŒëVÀÙ:Ñ,’ýŸwåcj›hF“¹„H!È=”Ýu›äGVù%Vd+²[î0ž3ZbͲöùÌŠkuÃošu•?—.[¶2f&`~^®:°»öç?ä™bT¹‚l¼'j¸Vs[Úî4[÷ÎYVì]j{݇k…o}Áá¾=pðÍÈÇËÞÑÅmqŒ¾s“¥~^2AÒÞ‘úÀÞÛ@ƒ­uÅȪ^oµMÌk>öÙ”­µ%j}úÖ0ÑLQH3ã¢Ë a¡Žåƒ—¥-G ¸ƒIî’ïÜÓÝC™ i¼é€ í¾¢}Å[õ‹¾Ã¼°ûL¿Ç]Ö®dïÚËzƒl9¤;}ýñÜtW0s–f…ÇbœMBæPTñz¸ÑäG0³uí½|þxqfuÌzôDŸçl¦_nª¾ÄG©% *Be ôMeÇç’Ѿ[o†Í*ñeÇ1Ü»ª…´,‡1TñîwábòwãYXà£ÖÖ•·xäbÕBë4'O:xå¢-“ŽÀîM}jÒŒêæEVfM¯‹»»+ôBFæ†gæ°ð¸Gåy˜:X#ÃÓ)¶²Àˆ­ÎÄj´ô!¶ê6H¸GƒÊê*bU…˜ÚY¯:ºßCÀ¢Ñ–"s”®G‰ìP_NdÊG¿EºÄ­cA½½Š0²–ÙË QË"^ËÊËb›yâTÍÌ|tj2uìYfvwfO—Ôõ–’Ö¥š5ôd„‹:=W¯¾=ÉhÙdË.¼du,„wÃ5»Ëd,0[y¤œTêœQ8zÊ ^Ç6|;òª® o§·åGém@÷ÓÖ¥ªQ hM0zñŽòy•L9Öú•—CDó.#hù›ª *­1Ÿæ1–9™oàű{áÊY]¥Ð–ªclH”X½ã°Å‰ €Sþ2ƃzœ€’Îe;½ßà$ªqJâΊt¥³¥§i‚‡wžíîàáßÌGÛþunY¶|‚yWÛ1…ÏaÒc£ØØ@Í¢°Ô&G m¡Z9¸|lßyR£·eå«…6zÔQZv¦Îá°DJ_›Õ[üÓNTÒ½»ï*ŒBÑ‚ º66aäim> wµ]þ¿ÊðÙÄ¡†³SFsääþýqý´DŸy Îs¶¶vxPéñh^=ͺ5x>BMUóÈä²C‘ŧí,3@ÍQŽ«LT£ÙeƒÃ7ùqIÂát˜¿zÓ'Ùù ñgÖë±Ü=4êfÞO§‡tqmTH™`7à”lSoAO"ŠA Óø8Æ0c6™YwR4(8G@x·Œc‹3¹?㔲 ÔŽ¾eàÌéÅ«Ìh†½Ï½ÿSë;¿ÓŒ{ÁðÅÂO9`2Ú‹¢õ1ÿ–^;ñQ1&†ðŽÈ¼pxRa³Øø7TR~Sð½OúÿÛ?«ÑþÌþj²½þäï÷ë3€·qÿø…øeõ“Û¿_Ð?Ô|%Òüˆ|ûÖ³³Ð;ŽýG:)^ÚÆ9' ¤9,ùÛ†úŸp؃s<œ;³ó ¨P% ȶ;œ7YN&ì±ì9ÜÝΈ¶Öo|;úY«±Ë8ý3zðˆÞÉeëÀ<˜ÏGz¥ Æ…Ø{O¿ýƒÒÉÄÑ™“’™e«dáÏ;è±Ô”=Ë”[Œî½=ïS•6eÆìpÀ¡µJÞ$¢½c•5ß§/á*"ï F3³µˆ°ˆ‡ŠÍòí[Û–­µŒôìñ¨“í¹µãßÛåž[ÍÄDk&ií÷vë’—QÃPEíÑfý>®u]‚þþ÷?>?·š ÷½hÞ‚XM9i‘§=ÖG뛫làÁŒsž"ÔÒ¬ûVŒ ]¥8¸_“uMÕ”Gk:@ñ"hf¶n¹ßáR=ñjJ:º©”.+ Z[ˆSöZ¥‘ËB.¬–ÐSŠÎ±^ Oûô±¨[x†ý:,Ð8˜^õëSvV#\Å$T¨ry˜ï®!ñ- &¶ºÑ¶?ôé öÍã×W6Ã+×2aò_¢éœÒ ‹=³îÅÞ8ä¹ °D‡òGî¶â˜g&Fg}“æèö¹BÊ[r“4cÊÙP«A²Y¤Ðøüî(Ëæä§çéàbд™¶ÃrWï´Î•R Iâ¥!ÅÏíÙãp¢äC °Hžæ>jYÖÛ9œ¶~«ö¤VÌQ]âœo<[RŽ¿ImÜι”!ç©™á¼òpÖO[X‡$Ær+3Á¶x¦ã”»z£›\s“³=³Ü_‡yžFÐ.WÙ%z-2=|$Ö+ØjY %6¡ ÷P‘7&äãü"ÅÆ‰€rÑÈú£&L³é©äÓ×7øµ×˜´Õz9†‰™NTÇã|Ô5rÒ,}âì¶FõÒÛÓÙWÃu0; ŽÖvÌ+gãÚ­Æý͉§ª1z²T»Õÿ†p”(©öÏ’Õ2i÷ÀuÂ:¶d=÷–“˘ >m^=áʧ²2òpÌ]ÿ\ó⯦`1”òv‡ÛCvÉ0·ºY™Ü"Ͼ]Ô3>W šÕÊüVÛ,>Ñ€ôjØù‰Çjs” å²/4½-©ãõø‰ e»Xéyáùzñq¶ÈtÔè‰Ͱýi4=2ElmY=2Çy9Ó)¼Fð1¬ …æS¥›ßj7ù°ï• ÇõSÍ[ÂÔ\°“º˜¹­G¿ãx7íc\È’ÓMüÚâ ü®¶Ý‡ÿýåz æ¨àùñ¾ê¾cÍ÷•*¾šrþ¨ŽªÐxýßR™þSsºú_–â¯ö+~êø+Úý—Àéj)Q>³3ó^åw78µzºöŸÿ­‘ÅYĽ]ýëõ]'O 0­³6ØåfF àk# = Fx”ä÷>[‘90@šþßHéÏ*óg¿Ìç×<úù ôôԟ;p•:®Bî·>˜}sýžŠVhÝY~yöBd^ˆ#«°Â”åøþz¨¯×ô4#˜V†ì'¸ŒŸf ñ´:9pNÑàœ˜e€YȪvüú‹Agù2mìs–¿i·õ öîD_çÕ†³jݯšëg+(ò¬Ð÷èêãqs2º™,êçÕq–euvÁŒË`ÎÝ/õ{»°£Øx(Œ¸Eíƒ7¼²º–©^£ {o žá{ß÷–îV„i¨Ò¬&}ßÙ…6+…ý3xôÑpV]‚€#@Ò®uV£îÛw{HJÛplµ,„D'­‘0¬æ+>êGWvò+· îF.[çR ñ¬;”ülh¾ý‡ï*‡¨ÖÑñœ´öô¸ûö}oëBÓQRºçv;:IE£™€­›ú`…*ztëÂþŒîeú R2ØÇ²?tr% ö¸uß{»ko‘Ž}‘1àر9vøÇç›õÀ  ™<[ŠÝ‘ ¡Ù’_\[¶„ý¹÷íª‹U¾?…ËȨû6l™ ¾;ŒR¸Ö²eˆÄÀxŒoñÞ¾µS5 H¸™fæpÚÒ}+—'ÌrÏõä¢Mànt E,rÑbp’3*Ãu¥hXëJÒ"Þ?&—7Hºù½=á553^pÃq,T8$ouo_÷8ž÷Õ¨lH§i?Ùâ®Û7¶H˜’E»Ïøµä¡iß¾3fcýòŒ½rÄo¸¥eµéTÛ .¬dÙe¢bH~!.saï½¥£€‹Ü&+%Ë?âc¶ÅD<ÊÓ¼×-àÃéñÖÊÉt²"‹D.%Ç`0ËM{¶=ºŽÙ Š3˜ŸÄ@bKÛ·²Â$‚ѹ¼‘CÅœK«[õ,9^Æ[‰¦¹¤ÆÂPäKÚJP4.§Wed€Ð%ø}ûvèïÛ÷ŽÑ–3ZlXŠ|‘Ó%MüŽ—Jжë”A§­¹ð¶\ñ»š!îlÏNß.hK¼>H¸’8¯ ºÇàºL¦ øvQŒYÄ –'Y§ýîµ²,)Gî ”‰­Ä4gío<ý­e}ÁŒc«íÅs?ðhÅp¥È#.†Hm ½·‡3…Ñi\ÉòN3R½#CP®a(Œ.°”Ψ4œ4q@‹“ÍDï,^3­;ï—µ£"aq>ÀTa%ÜpF,íéÞRëñ”Ã9pAÕZÚ©czÞlÊ‘HŸÆŠ&ÄÀ¼ßÖãêÉ^Ýn›Í¿…Þª©Ouʲ_¾ñTra²]È% Ë2#&éÑE-Ubu„·‘»UñEfOE_:–ïòcù×Ðßë–‰%ŽìJÆc¬bå‰}I¶¹ô´§KEg­:Æ•öí¬+‡uWUKÚ=d“Hó(YÃ#/A¬¸`<Š>üôë˜Q㔬xœ¬€SSDOÄ܉Çy㽩qÔˆðWr"‘Ÿ7ÈQ%ˆ>-Àô&3UxK#¢\T*‡Ü¢­ÌñßÐ !Ñ<¿'))£d}•ãkïÈqe{7#}8³˜Bmbª‰œè.;¯³Ý'ËOÇÀkÈ©É>•ÚöåuÄXœµCºIÖ)s—Røò%4AãÁ’7þì# H£)ÌI]½Ÿç‹yn'¿ê¼çßBÝã¦×lJ©êÝ~˜é´ðPq¾!Å\ã7¨¦ =Ÿ›/c<¹ îãíÏßÓ±Û´Y£‰ºžæ9¤Ø J¹ŠÐ ‚TcŒ3VÑ ÒÑÅÜu¼N2äØöRåúFåØ'þ„íñžpÚkbQ*|UàÙÖýEÌÒø¿Œ%~üÿúã:èwVgýCê÷Wÿÿ•éÿéíË­Cûõ—r<ÕßyÿSÀC¿:î…ïÇ óŒlþD¡ž©½÷'™Jä)*yØäçþ Ò”–¸|r…Úkß  ze³øyì§D—þs|œL«|íûáã˜4µÃöÿ)¶žÿnôŒ= E_˽2Ÿ’z»È÷T6¤™¿˜ôŸÄ: Ré yZ}\kÍÏ£¼åAcOHýÞ{»¯Ãë*¿÷»•ä@ßrðLÐh×Eò¾w[ï;gÑ@ÚPÆCá#Â=‚!©dóDšRñ ÿ˜Ù¾ïö›Ä®#f.ÛÀÕÔž4(“וè8S8×᪺¤à¥ü’Xü‘W7Ã!bVOQE"ʶìH~ &º¢·¼¦-ªt݃´{îÅÁZ•“éü®Ü]4.[Û=覈ïH³Ë²ó6¼¥·»€ Xë"ƒ]šíâJ¥3°¬žg2ç4, –K¬4wV#Þœå×qôˆêÜ~×AØhÄB8×ÛîÚZ\sqa+‡€üíÆú0ƒµÄï‡gS­ ãÙzÊŽ»hÆÍ¿ŒO·ƒØÛ?÷ÉÝwôzœÂ­-­–^½%àƒŽ@§¡—Ó¦q6°ŸrÀµŒ—Åîüñùø¶ÿǧö¾åKܸ.cÅ#RþܸlÇç¹h²p±[âÎñL«*áJ—ZS>dVHçúÏÏ[Ɇ*È9ðoË:´ŒË×½¸µ!¯x ,vùؾU†äØ«¹ÇZiYuÙDßH1qéG|ïÚÒa"Ë-èµénàµì2Þ!‡,.W’*¢i1J ª<ѹMÏHcà•/<ëZÆþãϰ~ÀO® ñÆd¶”=¤¹Y]fº%úJ®mù†‚XG¢‚ðÇm‘ôô´±í”=LîîPüuxÚ¯LΛ4Ê2 #µpmæÁ]v‚Ò¾}»,k…9$à|¤ËÐlØU/Ä”XBíÍ,ìZ¸Ûñ ]¤è¨¨]vxû%’¯€­‡<øЄ"ýU0;C3¬šÑÔsûo<ÞÛ芋ËÈEݰµˆE~š­ôÆ@$¢iûnàYo‚³52ÚÈ‹¨¥/rýã¡°ÜòûÞ{cm±Ú"ÃÝm!Ô‘¼Ö*ÿŸ?:ûTSZâ –oúÞ l©î¸vôcJvh39ìˆq›WàÃú:n‰V¹4cÎÚY<«½å4!W·ÍÞˆÊt‘A=+þXÅ é¬[.¯ÿ@}ùö¤ÔÔ2zzhµS*èÚGéS²ã¦4‹JðÉ€H”»9Ó`¶ÈµÜ?c.ÒrY¹LÚðí¸½ì» ÁÎÛƒ$w¶æÈ|iø½ZˆÊýÏj·ŒøAëýáмl„¥2Y‡âyúP‡Ù…Í9K¿#q)ͽ`VryJWÉÙ@&uüßzÞj  2:½DA U;IŒ;Ç—cÒžÝhMíÑ`ÑHà(då€yh`ÃkV9:L-NC«9©dU»I¼‘GÙx-ýÅ)0#ƒÏ‘œïG(;„Y †%E˜{ŽA2ït¼£ ,$… ÃÏO“nzJÞƒÆWû‘µDžêcßÖÑ;{¶ÕÃâŽ(!Û}þ¼¯év´U·¨ IDATªXɘ:Å"£W^e­- üZ^ôL I‘ëâîcm¸_b\=Z}–p”s õ‹Ï€ñ#®Þ,–WSéa峎I•˜çðüFƒ(’ûh(­0{ÿUŽ÷]¥Ó¥>Á‹RØë¿n)ÊÜi‡¨S¿UWÔF¹óмgwìQØ{¿ë"Ø"ØòÌ5„Õs)åüØ8KÇ?‹ÀïPÐtZq¬žRæð¹ãÁvž ‡m›Ã“Ÿ»¾Æñöœm„Ï©ÉÓz+Æ…7=òÏèËõœ¢á»8ë¹¾haõêG–àðµ- P#±¡9ÆÊ_ l|Nñæ„cäÃ$™­A÷¯dŒø6ïê9uéSÌŸYíÇóþQãñnß%G:nX‘àÒ¹ô+Þý_µÒëÉ£{Ï^‚¡¾û¢¿ž ý_¬þëS÷ÿ4Ù¾Cÿ‹úã_Ï/²ÿ£‡þûo<ÞN5û_wûW]ŸsÞýíÈñùhmÏûxâµÇÎÖ¯„©ø<±_æ#+ùqýq(zœðB=ýeß$'Aèì’òÏÃRÍ  ×oüzÎÖzÍìg·ä)@æœgð›ÌÀtçê•ÿ¶ Ng¼alÉ=¾BîMà‰ÙïG=08©Ò* NóA0ê릸(¾{”™™§gÎe+)@ ¶>~|n’¡ÝÇ·ŽâaË©Cíðzt#t‡ø³ý·:´ü禪»M½Åóm%›Dcs×'µ²ž‚xkf1(ØàîÖ[3r+î6¬1c9ݸywDòh«/àDZz;s6ƒjqÖ¸®ÈTo5Àë7¡`-ÞaÝLBÁ–Yê}ÐÉ7˜Ùâú¸(äM’ûÞ y8ÊEOlÆ:{ÓÏ?üÇX “r_¡J$/b ùËææü<5‚i³i©šé<ëUF°z9»·Âý‚1@hÑ>Ýø6­‹ë¢í6b—Ö¿J0òvTÖ¹]× }-°(Ä@/·dÈ.ÖeD¸Ë)hËö?3$€»ëÇæº×õaËþ“Ô,ƒ.RËî]IúEÑøý=·‡ß)¸ rÓ2šÁ°"\Ëÿ(ÿZ×VþïÑŠ‡oE½1„µP+Wûܹ–Ùî>_²ÝìF,3@×B´ Ô‚É´×ÇZ–-‚WAdGvxúÂ@j¢ßîà¾Bs —a‹v-ô¹Ýt‹-²6NÕ-pö·øÒ0ó“c%í‹V€ !^DŸ7¹ßÛ}÷‰0Ñ÷e;£öèˆÇ5#wcIÉ–°Ö€(–½3Cé²ä<†Kþé!¬JNh1šêa­…ðVXSöè;ÍWÐâ Œ²ÕÖå÷öí¾â-D,³ÏŠQLJ'ÅeË{NF¾“òõyß÷ç°â9ŸWµu®‹w÷Mƒü–Ë£4^n¶®Å¦Rl]òˆ¤lÁˆÿð`/ÖÅÈ”ÓKß៻"#IåñØ.™ä[ϰ\•=„¥³éGž¥0¼òqßJ9köƒñÎÛ‹-dÅé•´(À•ÓƒÁ%ÌuKÌJ¬M#Þ†ÌëµêrÖ|œI„ßͨhç°µ9Šþîô ÃÀ9fÖŠˆ<{oÜ{Ïîγöα@{^\ñ£º¨ Ùï'=¢·V)ëJh8£7 éǰÓ^Ø©P#ÄU÷­±»`ªšE™ Æcží¢åi;(g+§!ÛrøÖ½oæ ÍJ²Ÿ´“¸Sm¨t]äŠxª©áÌúàÓÔ›÷ª†aIS~•j~,ÿ&"Õ¿çN$ÅQɱV7k'ÇôØU»,Uµ*ΪP{0Gø€°?¶ºõINÃUVr°¦Ë"k»qí?à 2Y rš9œÀzuê`äXNhÛ{0lrt3Ì¥ù äG7–T:±°ñp‹èm]–Æå–£n ×H±÷+ăyzï<äf¤àÎÑÙcµW|PâO"ÖÃ.;u°=MŸÉ‹<5ËtÈWA)óB;Ç5µÊ¯vÄ8[÷?´ýèé%;'îB…lÊ—ÅC,TQärÂ`'Ò£¡LN()Ö§á¼7<ÕqÓCK÷j"{m²†Kmä]Fà ?é2¸¡˜ùØÏq¸£ª¼¢‹£ÏÈ C=eML4Dó˜Åô«eâÅË3ÝèÐÁÊE¢YUzü–MÍòù<˜šŠ¾”œ~ÚC³ëž©¡-ÎêdÖ5iŸÖZò<ßø¾ƒ5['žq¶Äê|È/bã©Æ÷°ç“ßí zâ_;sNÊ‚õ&OMù+ÕÚÔ´îWŠô”ëž:ö§‰ˆ`ñ³ù‚Ûóªq¸mƒ=a¯âèA6¹‡×ÌÎd¨~¯·ÎN)ß ‡ó[mR[¨¥Óñå¾cxôõÂu¼ë7x¢hÅy·BñžSg÷ÆñNáoøâ9ÈuüÊæ·¾úŸkíü–tþiÜPÿ¯—¥ùëþ×} }sRÿMÆ¿çôò·þ’/Çÿ—[ïoS”T|‘O_Þ÷¶aïñ<Ú þ!‡ýJÞ|51ÿüx6¢zî´G?<ÿLªM¿=’_üJ ”'¾ÒvüÉsŒ#3¯ç[E§£fh¿¢Äd‚c:úÌpÌ/¾\Z„½:è'm“•¥æò/&¤ÞlÕ)Ë©Ø}sñìû !Ü %›Ž%C¬@`Íó$O~»i\ÑŸnâ8ð ÊËᡚ½öx-QHÍ TjÁÌ|ïVS²Á©°=¬€¦kWÿ †úvз,^uÁš\†ÑVUü–‰èYQDÍAï­·|§b‡T mY[yl„MÞÒîÞE\Öp:}ì–¦æXF˜­+x+u,´e—-£Õ”„‚¶°Ý—g0'd’lÁ³œu$'k±râÒÎ¥ ‡SkS >ÌìãZ3eÄÈ'ÊÂ掕Ë>Æ3`0EÁñ#1ÇH®‡oІoÇ/¡Åú0®r@ÐO‡K\ÆU“$af5ƒÌéZäbZ™×ZˈíÛÚÂ…‹ÇÓÔmîÛ—‰fW-ínaYmWs¶3"}Xð¼-ÈvËŽå y¯Q®k›ÛÑí[43ûX€¿#×çȹ¿·»#xùf0ÚZX? íÛB¤g§6üÃ,øè4[f¡;]\¡—šñ––si¶–-ðv¿£Œuqe4¤;]Â$H ÛeÒ6±žÓ+%|årÙŠCámg·tûV”3t«ëáÚßÖc“:Äør',(:÷–»¸’®Kz×V<ÏK×*<…£ƒ´’G1÷¹RÎJÑ"ÜbdàŽeIjvz†ÓHR·ü‚­~»BšÂmײã…#X[pè’_¼¢IXl3œ>FR5xRÔÀC›0r-‹ÁV<æV(·GïFc†ö„¾È]Yðë2éÊq*çظ¬¦ mwV§-ËÔŒŸãmßqƒ¢WtÙûèeW¿’{ 1Ç AÚŠâ×â ,¸ð´…rL³:y#¥ãoð ˜×41n öT9Ÿ×„æŸÍ=IÛÀvOOo³°âçÛʰM©ŒÁ$>ù³Ê4Œœ})ƒ;DÒN^ƒF{a¯ 4µ¼š~¢ÀÈqÁì<<ê9~À,Dü‹?÷¿.uΫÓÛŽWšvij€e¶‘ò§(4;@,ÞÖ-E);»{¤ˆ¼qŸ ­‰®c‹LŸGsKvbz–ÙªœÛ!vq×û%mƒ§À¾Ì”=Õð\Y‹gâL©LŒE+‚ºJ¨ß€h¨J5Z·êD¯Òê]¬­2CSU1mùZeW<ý`‘ éÖë¶ø¾wX³üi§””‘b?“"¨ƒ§™˜ p=²a—u±åC~xh½Ë;Ûu•${ýø¼9DйUÝS˜;B–$g^3å>>x¤ááqÏov'V<6<í: tM›«úh‚ÒS¦}x‡c·²ÖÁšBä! úƒÞÞbnœëx·7»ÈhGŸ­Žé£l¥©=Þ¬'2¬ÎaÒØóS  w{ËD£yóÀkÐ…’Ô뮞„ÛÑ~“ú¸iÒÆ4à'lænÅé“Ó÷ÚbWµÓ:ìÏ|,±¢RYµììr ºë9-õÊâ ¤q> D;Òq¿@bh×-Òv.5êxíPƒgÉ–Í2%Zxf /®j¤5’Ô­vƒÿª!+}úÑËÉ¢õ„Ãß0ÿº±½;•VöÕf¨ØÜZݬÕì±FÄDÏÐÀ‰öȃâ?â°:ƒ¾4‡l>.ŠÒR¿ ΃Mœ ž: gÚU# W¿œémîJ>|7è·ZK_#NQ†oü™Æ.£•méC)žÿ˜ÉŠûæ£cϦoÔ–ó :XƒÓ~4ôñÚîÓó ÎÄ =‹3òwYä¦QAïÌÙ¶‹O²†:†ÞíÅÊY‘g¼µ#*ê®â+K¦çs¤&8ßhœ®Ï_“Aù}÷¿èŠg]Òr˜NsŸ˜óÐ~ð…ª³@ϯþ^·ï2øßž¯ÙÃT¡ÿGƒiþèПwˆø/ùýþHWüw› èmiŸ¯ Ÿ¯ƒçHtÂ|¦€بŸúýùú#N¼þE|-¼ýšxÆŽjP­~àØµà~Œîõµ« ’¬=î‡Yc€²ä{>xT¾(üSÓ^®3Z ߃rÕ_éÙý«”¬^Ïë~&“õÿûZóüfz¥TNüi\?Žsz[0Ïàûì’ý@<>þc­BüKÂÄ‹²FöÊ×ôÜ,i´†M‰¶ôtA{ïk…aLß¶ß÷½°î½# r²„zVJ¿ÉšiôE Tû³ts%®'3ï2m&™`;”ñ Y’lé)@œÍ¹Š™Y"~ìÄýD%2K<' ôTÊ2vÈÄeâ¡<½¶]1/É AHAT+ûÑìJõ¬2Žóân¡€ÈP‘ˆpÑÁ‚îŸ(ùøq—™$»?à‰—‰ >Uô«“'èÓWŽÛoˆÄZ/³»j,ƒ~ü%rýãeÿï?±˜•Ôg ÝWqV<¦ñÎ%‡[Þ]†dÄzÁ/ër´£Õ–­s¿}ÿ¸±>®µ u€‚í3E§fÕ·kWÍfºNý¨â[¶¢€×ßìc­e;–æË®u‘LæÂþÌâu1¤Ql9yá2l¹¶CØ\Ÿ›0Èúá›Nþf F³hvwÁì¢]/Ìṉ,ÄÛ@÷³Œù=Ãv™ý²®ËøôåØmïõ¹¸Ïeתè4™D WB)èS!‘ó*;³­[ômU¦’åä( ?-Ìf{ÇUaéY"—ECá© +ð„[õ\jf]\»rù‡#TFË<ÃÙ¬é\_cÃ<†Æîb2l2u†Í¯OæŒPË I¡ð•í$k;î°Òiæ–Z$>û7YHi>w0…M—ïyŽ8¼žÌ]†!wÁ¥‹•S"Gb’/*|·¾¡èt #…Ëä4/#:OA%¯øQfUä›ÒãµÖÊfÀ–Öh×dݼ²kôpÓBwvwm¦q$Ñ,šªþ¢]—y 4¶oh‘ך擅Šçº|{þO¬ünô‚_aR¶S}Ú+"3@vx¹ø(ÇBC- ¶–Ù’ïöf«ðñ GÔ “‰ìÁ$…µ.íÏS1RÑìÓíhX Ëx»¼Æ«¡Í ’û¾ÖÇ2«‹\–g¤Çï¨[’¶rAèˆZ %&IÛå½÷Œu²Í…µu,å¿)56jÑõ’R·$úSéãÂèm›“I6êIL„ûæ(2†‘ÁÉò µÜ=j›#ß••1öŒORim& XH643«W]2ã"ºBBj”rH=Õ¬îåê<Ž¾ÂŸ¤}>R:‘È+Ø»«¦öÃÛøšº„½×õ$³QÌÛ1þFóLç )äua+^L-ãQ­ƒGwmÅCFSv¦x•Ë,Âõô”ríªzÝ8M°mO+â+Ò¢ Ì)¤ßY §£º–EÊnäY¹.R ÀÖ#KrVzÉ_Ðb§¸;(Ø'¼A9†Ñ'zâ¸HðhÏæÓlß 3ņk2x›WìWÓN›ãâ°°D8ÒiwVwNѼ¦Ð+Äù ½ã;¼—Ã@‚WEn êöd&m´wjP=Æ)HhòyNªcWvÔªF•·;§ÍQå–Ö1JEÖÁÕeÏ vaI 6m¯T9翳¼Ât]mÜxPLXœ“¦·¯nóÞS ŒL eÙôÑñ'Ūtûs1“ç¢ÓôØásèžLJÙáÝÔ'õ‡zÐS°ŒS«<ù5ÓeÍl¼·X<—y[`´õ“i˜]Õ@ÏÈœÞHõ|‚ãÙqp&fÃúPª¢ ¯"ñi6®íB ì"ðœÍqïò )¬‡‡±¸ï6×Cgt;*E¹aOÿS翇UüÕÍ?«ê!ö| Ëxt¾ÉéÆñ)æ´¾¨=³õ\z¡û1óÚRkÊÀ†4Dn{<¦Ô)õõìÂ9äíê òÏ®è_<+™z/¦(o±jTUe‰>5ö›ö‰y¾¡:¬†ïRÁJy’\k™ÙÞ»§ê #>¯BO¶Œx]=jadBúo3–'³{ˆõE½¿ªaFŠ˜2¤òB7ßîW3üS+¯^„êCM€J ×βZv)XF•ÇØ–‹ø<Â;aùãâ€Gú!Iëi8áΞ잎À ]mÏßN®ZÝ=FQÍgµå[ÆíÚ{{˜Î‡5©N’G4?¯bœÐe —g!p£Pð9’¡Á6\Ò¾A¿ñ‹RÚÐ-IË —„\úÜ7‰È Ø2[éöÌ¢ª“‡*º—²=• ‹|™—nÎj%XÔÝ|äZÖÿ°ìC®™ ›ÚÞN3S Ìêö¼Líö6¦»­vôÞ]-\ðÎ2#ÒÞžM[+.²|ÄDÚ n¡­D0å Ë¢ó6ªzí± Ì£ä<ðÜËËÞ¼‰ðŸ‘jØ?†{ç¢åf•¸å×—… A&¼í5SJúԎЂ˕’²8fT?CîØ´$ÔdW²€eè”übÍC«Š¹` á*ŽÍèÚ—ùöìI¯m“[+®ëkò¤Óe8ÊÉ\’mÔöĸë+EFbÙ¾Ó‘ ÓÖç¾%†Oì®wçî‚1ÙBð(k73ß~J E„б_Nã°_G½KiÚ Ž(aHUÏ“¯¹ê.õrMò|±Ûnž¼rÐÞò†bÄSü)¾_€кÌ>—a;v‹&íí ´.3£t{£9w¼Kº6ÓËÌçVMÝ™“׸w·D¼q—Ek8ik+¬üë¤ —JRâ[rxìmc8r{„¢ÐÅØ½½F›Hƒ9‰ÉŠ>$ó*ÌàùŽ23™Gs§¦ØZÎ;±~oRÙ‘¾ê¾µu%ÙEv˜ü,6ù=¸e<ÕSÓZ°³.u¼~b•z`Nêz ÔÑ·c¯ôŽk™Ñ $tÿ·vÀ\zZ¡~‡Í6Ò¨%cvß/g²À†ë9/ÄÕ;¢Úcu*Á8ôôʉ¬ú/ö(U/kiaxÖ\mëd§ÿ1>ÜŽG¨L‰!§¦UÔ@e–;÷ÜvJ$ úW¥ éö–´Ñþnå,hˆ(É <ä 4µþ¥}´,y pñ½™‡zæq(õ‘§µ6ÖcÞ‹Ó›¹˜“AÓ¶ÔU“î—ôqFLAž»&Å|i:EÙݼñXä3¸QgkYö™¯Ôp®„•D,êPò=!çæ×êÈÈDy u¢£÷L6¨¤ê‰5iÓêgÈúxÖ …‡Ô1ŒwGÚ•ãmk?E88ùA¨¼V'ªF†5·*¥ï"×?åYÖ…„\iöDL¥W3U-e±ˆ o²eÈó ÔÔ'3f2Å×:ŠÏ hüâ³tÔ^†æQm¥éN«Ý\{õG—QWvW¼Þ/='FU_elþV=/zà_˪ƒeê Ç]«£¼êÝ×15êÉGÏ “=·ÂÓõÿ´:ÿÚÏ£Ô‹‰”‹r"ó8+N6›9Ÿ!|jé•êy™Òçdc&\ÈGMð‘àg1ªWøTµÕSŒ†Žø+'Þl*ÌàÓ|âR/ˆYìYu5íê×°_œ©¢‘»§P7˜@ s0ê…yš{Ìà»!>§QÂOq_\o·ÿ˜$é6À7NÛ¯}d«/ŠßC5žÙau ÆA6ëu>B½&§ÒWÇ>fbþ üíãÏQÓŽ9yx}š}4öï¡zz õ“Ÿ ¸þ³Ôh'q-à,\´…ÓqË›gTí„+8 »Â½ýBÏ®_o2^r’»-ˆðaSÏ¿ÅJ÷Q ù.míi]´J¸ûkó>—6¿{ÙÌã×ÙÛ³²V'RÑ­_&Ò’;VVÉyëVƒéž¶>cCæLRTþ&¼·“IN³iŠ^̦êeÿdˆ¤tÏØàZKîIß‹äa©'[)¿ê™w$±Œv­ƒ­ˆÄ>ƒmx.Ü»1vMÑGX»wëĈàcðÏËÖÅ›(8»«NSÄäÆ=,Xž³#¥#UcÁ ßn\^E¤YÜæ{KkŒZUzî)öVÂÔ Õü[‘Ãm­^öÖ„®Ù_QÒ€í"¸ÿ±—DÈxÁ’³ï™¡Àñxù˜÷ö{Eâ‹Fèö}ï’ê)ºÌ®‹?>±½ràµpu׊ Iü,9¸.ó›ûý„0ÇÖíø ä+…K×J Ø-_\Ë ‹ááŒþæëÃ…ë## [ØNÃZUˆ³8¶Êް[èÆÝ¿t¬Ó»ÍHÇî­$r#'PËLËCü4]¾ËP‡Û¹L²žîí-;0¢w£KÖ Ea´Å<á_lmàóóÆÖ ¡¹†a-^ë8¸Vx[Y©šemºÀ$dÅþ–mY4ìÑ4Y›Aµ02®†ŽóF(Ù «{»\˰¸Rˆ«†ŒtBßÃ:¾´*í xY1*rbìòÐs¸Ôµk-1uá¸2öÞµjÇ®DNm"và‡f9ý” æ4M=tµé<†*^pÀœ5~ÊeÂÊ'sE ‘ÁÁGj›-a¨ ³„ Nççˆy»=vo°iÊ~9Åø ·÷뉴 `P³óÓB¦Úf¡ƒPžî²Ùå0b‘z¿UÛ 6ÖçèŠÜw\Z ¬2o%ÐÚ˜`ôXUD0¿á9†Ó¡üX8>®º‡×¹žŠIšHz¿zºÝ ñÙ~iޱ•: ÓOá˜6þŠgFs&5…©Š¹¥²NÕö¹ Â<›‡sÁÐãê*p¾é¨ IDATŸJþ£.Âðøž©$¢â¨‹g<¼G¹ð¨çÿÙ|0Í:úèïx#ç<ÕþwgìS=~Û¥ùRîjÇØ^ºS2=´íšNMg;ÏÒãˤ¢QóÜÇáÈß–ì‡r‘­üxëz¸ § Tƒ®ØQ£îÀÎ ©#SúÙì6bV©iP­¼ÉÎ]¸Ào’sÚ¡æfh„²æ¢ìéÞÉü7zéTù¤çH3XóøÿœV(ñ‘Áà»Vâm±'¾~KþÂ5§Eàù7âórüŽôûSaíüÙÿõëbò_4 €QüïŠâ—±ß¯‡øõFùé,ák †Oùžz"ßð¤ãòS§tE~uÜ¿ÿõ£9úÄ®(.?‘üZQú ÍgGKý¶Í¨Ç¾,ºÏü€ec<øè)3Ï™Aî«<àÁðIý•?(Kß—ãS¼ ‰~1ûæ¤Îï#v­µrOÈtuíêRºdµ=ŸïÒçø «J.<;Û]ÚËÉHÙÏ¢~¨Xyyu(¡ÓîZÑS) Ö|žú-g…ÌÓ'º§Y<2÷/+$‚§sµEµkùÞÙÌéHàÙ¸ˇµFQ=ËI€Ñ6}Ò+Ï?Ü»ÞpFÏ+ˆ`\H¢QY¦ëˆÖÍ)Š*ÑŽtK¯.K_²d ¡‰.tWÒ™B¶£ ²Ä16ôþËDåÁéjPlÙj¶IØþÿ±w.ë’$Ç6˜GgÞÿAg9be¸avõȬf‘"õQêÑBjuW“—wðâ2ÿezŒ!H¨fDØV2° ñCÜ“‹º½àž:¡³J€[.ngd öœ–yJDÝ`žüSqü÷­•Ä º°¤iˆ‚ÉÇ%z‹Ý·­µýÇêbòd˜®Wt ÔÍKò6y¥  þö—ÏÞ‚è/7¸-ÛîøÞ·íûúñã ¸¨GE¦œ b?îšÈ{ËýVæIYDUcÚþÊlºwï ɸ3–Î^U³p9¿a3®4Úµté%üyûX‡Õ\øDDäõZ~âj¹9?ÇE¦Œ¡Dc'iµÊlÙºõD” à¢Ü~ƒ-ÕÈíÆÕ·kã«,ÔˆD²´Hw‹)W¬³»é–Ü"zç Õ™—ê;䇨ù0!Î)5èÉË„±:ŠÝNY¶{ï‹Zwˆ‰&Äz˜éŸ*t›®¹¶Ã»d›¼.¸hÿUSV¢/[põÉ:¼‘MU—{Ë6á¶®'÷_C3X˜ºSpÉò¥Æxl+Šæ+Œ=ÒÈUZ)0õa€lÓÀW[_ü*ÀíêkÃà2Q–^XI3YË ÑC#e>eÊ—È{!…Öf2Ýâ…EÖH–—¬ÊóWäá¾CÏPUM¶Aó1vù©§É*Vh…èç†Mï F•BÅÛ+Ø&wU¹Ö UÙ:¦ža gÕÍzËq‚ŒÿQídô1ͤe¼u1aËS¸_ÓÛöm¼ M\|ªýé"\ŸF¨Â,ú|Ì“½zU]4·É‚½Ó‹ªŠÛ_Gºà*’FbˆeŒMöŸëUòJªèø`}Ì0°çÈVîÄÐX9Pí¶¶púeBQ1¡FË)Èɪ©Œ·dáíG—°ês„¤·ÇxÞÊîíœðtôÔ†ÍUîµ4¿¶¨¢pG_)?¡DÏn*,qÑkõt¦’ݻÄKâËL³—"!ÁØ^öZjÎ[›’LÜá›h7 Óº<¹8qÒ¨AS k²©ÈJ5f`êSÈ7_†#‰Þi­àöjwh_öY!/l7§DèÓS~ÀÏ4 Q3Vâô¹×ë'£ú]"¥Äу›ƒßR\팬ŒÄLªI8*X:4oçÏÉÙÈrØâí8ÂÅHsž*ßÇ5žð[º¤ó)?ìÿÅ囚8AE‰oû*4ågo¶WUßqtÈ9ßÛ79•à`ºfÍ©ŸÞ·\×·Ý.€hÊ–5Ž;ª‚8³ïÛgÃŽ’ÉãK‰Gü1„Ç ‹†Ì~÷I»ŸãrÇ®}ã#@B3±ˆ(âØqÌ‹?¾è¦Gd±v ËÙr\3Ì|Á<}ã†p>=æWqÚËùE˜…o¬ Åö%À0Å˯²å?èõ˜ßDþ‡›ø«DýdVýŽ|þ,tù·µ†?Æü’øsþ¿6CýíËadÎð]ýÿ0ó¶û2ñqBüÕ Ô§`]÷èÓ}ÿÄ áø»s¾ ¹¼)fC@(.Ó¿?+Pz¾cº€S.×éôo¡¿C§ŸõG-MnŠòÅÐL+qdæ°á9$ Ï¿‚a æ}.©î´^k­"Ý«7mÉ2Äp¨á¨. ¥MEwß399(ˆ!8úÀ[Äî»ÛŽg6ѸÚtVæ` Ýý!ýÁ½¿5Ùý«q¼Í¹Ê¸úof{o§ùkXkmÏÈJ»ÜüÜû¾ðZº b¶IYªõ¢$O3sï—G?fW¡vº¨/Æ…‰DŒª#»5”ù‘§Cf4lÑfï³PÍC¶ËÜWÀ\m iËÚŽª –ôT*ÑD{LØ#—G¡6d³Íîòmi4¥¡bÈsžÜüÊXþuÇFº¶zY\•gûÈ `Ç»qoµ%ïW,ÔAû\¿n>0]XÀûvÒNÆyÓ•%!î-Âm¦ÕNèêœm—…k¥"²D× £ý6 &"¯ b›&&+'ØÛüŠmïÞ ñk‰˜ì½oÓW諾¹…¯m%G¯…›´7ÿÃöÿƺþr­¥›öKÓDí.÷íŸê‚^K&¦ê»ÙhiŒ7xA-':YZ±ê¡ŒPqäÎvd5Ià¢,Ÿr˜ý´m¤¼;ä‹iY~Íì6»÷ÞŠmðê?·®©Æ›$,«ì·âwÈy?GM®L«†$UFQ¿¡KUÕcfÛ¶ÅÚ»´ŒKÖç!#ÕÑs—zõ²a©³-ÀTºA¹s^iªYôVtI›‰ªnÚûÞ¤m o Ín³}›.,]ªZ£à6*ÅLö–û¾±..ÅŒûŽ•|ç:f~ÚYh‹ß,ÇÓq ÛÅq nFѪ£‹çjǸ»á/Þ9ìæRU(iþÔ\¶!X¢;zÕ÷AÝ‚Øo\Ù¥+•ïµÄà–|nPÖÙ‹îÐzX‘ÌnÊúQ–˜Ùb>‰¬ý¨Œzžô} À2NÛ¨WA–m×™+ùx1Ä Oº Rz¥³)o ¯•UuKõÞ<@ n£(`"›Ûl_PzáH´-UˆO B:¹ è”T;¢?Ù+EÇ~0«ð KUÌEd(CäHîˆÀxŠÌs%‹"ºÄ›r,º»E×ò¿£Þ‚m¨Ê%ÕlÕx3z £¨_<áB¾Sè]‘§Él¼í†Æž0f’ŒÛ“BÀÆâ:3R*aBf™„œ‰²õ<‡õ/K9 ÷Z=4rô˜ 2éZÀj:- øpA‡ c£§qË9o"ËÐZáa÷ñÆlPšÙïŇbÈ=±vWÈŠ¨œcé0ð.ãSã‡âT|•‚˜ »hðùÖŸÛeë?cã]uk'2h£.AƉ­”sºèãŽñÓ?,”¾kJRp£¤Ý¨ƒtÜ;5ŒÖ_ùH·SG;Ǧ³5à z¸Mc`ÐèÖ˜bùJ]Ìôßù[‰Á´%cÚôNy¹ƒW{yãs“Ø’xåÔd ¨a‡£QZº3 RrDeVH•qýˆɢòäi"í ®°Åǹã3]Pb1O”‰óP¬åå–ߥ¥¾4h3ÉÀŠÈÔýÝ«‡ÐZFw@IP£ü¥KqQÐ)Xz¸Û¯Ÿ´$08gþÑíl‰Þh®DAHäHHÓïoÙUÓ­¹3olU9ÜI¶îd%¯³´úÓžR½·U$8Êfóý‘uÆ™üCöÔdŒœJ×uTd—0eËZyXÎjþΆ–™üœ ã}>Ÿ,c­ËëàúŒÏ’rú²}úx<…£¹ožÍÏÂOF–‘Ê)zPê!•ú}Ží¼OtˆÊÅò%«™C­n|^%Œ´ú\}ŽâçšÚrªÏ|ŸÇ÷WPû€©¡%Êôüã”Nj¬Ã&ŠÉ˜ña·¦Åœ<| X,Ë´ã##-@¡V—znâ>°\S¾N7† }|Cß Þ¥Qøqä?Ö›ß@!šþTñ¿*e)8 ›Oñò[€¿ø•ÜÉAYü:Ú0ºú¾ÿè¿Ëiÿ¸ÿ Dtü:À?|¯ß_þ?ãMý >•ãúýöMÿ)2ÿðßů¾Ý¡Ž(>ÿrõ"òŒâëwÔñåóiù?DíBØÏoõIê OÊ´CVnXêøåçh•ô?¼']¢åõ’áþ¯C?©óÊã8*ü³û·€Eǀê¡ì?Á:>ðÈÂH|ãÊ ¼ou-eû`'ó¦£ÕªeAÍíÞ@ÜÏ®`·ä× 6vþŽï½¨ùlZð¤ÃÕCíiu‡¨BU½U¸ô÷dƒ&ûCƒóƒœjx`a­•T’½÷633®S !÷+¸UY"ÒTW™l“u0‹h‘—WXM² ¸eýCf]m_kjt¹¿¢¯f›IûöèùH]Ò±[DÒî¦LGEùŽç*jƒºÓÁ}•ûfézrÁC5­H˜[§1y‘©Œ‚J·ì»ä± :cèuª\¢îSU³ð:^|¥»Âÿó7!n`DÅLÔÒ:öU¨m9³ÛKݺWž‘4»/â Wºíô‡zNÂq˜µ˜Ü¶÷Û굦'DD/5£ iÔ‡ÄŬû¯ÿñs ®Ùö¶·™ÛTeóë´Ûö Y4ÙrÇ8g¹Ü/fïPæ)À%jË‹¤z5ö}D„\œ\§;mÛÛÔèúõëµ¶ñ{²ÛÈmNÑ6Y[ óË–¦@‚v.ÕuaåMî ¡éºos7¹Iró^|å‹ð½óD/³{›¨Ý­°RÙÛnî¼&Au‘Ò{ß®—êO¹ ƒ,´3 ´s¹oƒF…¯¯^PÅ2ÿ}ë.Xê®"Ù¾µç(UËWMÓ nËNWr`ôÍâÂä¶×…M3s7ºª¨ªS†eo&„ÈÅ:øêE¡mBdé«ÓbF3»);mÈÊkyyt$ÇC*æÑL›UäWNW¯1Ù*fÖ˜„,,_]!·@|\’À{·óoO˜Du!´Xš1ú¥-ZsŸ{Ó˜¡ÊÁ³³x ËÞ[p-6!‹êw­Ql»iŸþ@‘•‡[P•ÅÅ}ï09W¡}\m¶5É/K_\¡›ò…BCXŒcéR÷¤:(ÀöV£O]E-RJöÓ¦W=ªTm dAöM\^R˜zbVãV¡DR¸ŸzápÚ%'H4ï€î(~×ÀÒ†VaB#^`0»¹rK2zãÊ Õë•(íÒj·´ç}Êæ–1f-Ÿå1Öñ’$uÃ:`]ÒØ:~RÀ2h'ÙOÆÍ’¶ÜFëq¢·™ˆ\Ì£Çhu2—; ²¶tú³;%ÃôZK»k½Ü|ƒ9H‡lÄ>ˆ\u©‘—¸½"FDe=S—y $6mõSŒRN½«´(³”Ó~‰tt ¦K`{÷ÙÐCˆ§;ü6ñhDXÒ«|@hèC}ixiœš’åaÂâ1Æœtt¬·2ZqCTm*©¥ÙwQ,>W‡Xte`•vˆì#4Í‚ lù²×ÆÆr<ÐâMI¼N>œb!“Ì9õ³¾y8™³ÍQþ¡,$^”=Oà´þæ[]À^ e6õââÐlY{ÆÁö…ÅYXµ±ˆ©ÂÜÔ,ƒÊÏ¥Y³&"0;_Ì´¤Z¡ÍÙgÄVI% ãnÕÒ¤²Å|’Uf~<ÍOùÙ¼VÙL<ÿºBL”† ÆÄI¤'<*ޤËwAý /~袆GÍf¿£ …„o-Ñ$*?âëæÎ×P“âlxͶ/‰þ¡„L–n!H•;§@9‡)é¾Eîб!èw±E«ô§jól¯w;ÊRgQÖïI}£ú5®7kWXÆÖ£Ð¨-"l-øìð-¹ßú¬+‰NÌ™ÔÚ(}á’NMvز1ÍØGºHÀ7ßî¯qÎXó¨¼à\ZŽ]nAV£€Šéu,ÝýÑO[M¥¿ªyH;ÇÙ5§O{ÑÆPê¶}ºj0a<1þiH%ÏÉŠÌd@Ù8¨9RÉ1´6¨N—½ï½²½/W¬, |ŽBª2(Åÿ¼F £¸ãâ ,•l¥ÞsHß“sàßM×—ŠXàñ)vïH°ÁO!ðùƒS{«XX§ÛÏ‹íÃjÎöÓîŠßSAÏ”ßõæ£Ø)OüR÷†ü–Ô¹ ü;$ð‹TÃïO7þé3ü½×?—ø”§|ÿ–ðÏø~ðç1:@á5@9ÓPqÍ=Øÿùá «Amžñ¥‰w¢ö§Ú®iJh£—˜IwÏ©ˆÚQòl®H±Û[ZÞWŠ[õh£,$ègÚðÈ|RÆ€“ ù™xüy9â˜ÚH}DúñÝá¸:¹Òׯs>[uî•IÞ½–£ï„”‰nÌe=¢¢N`ô,ÁÅvD òÀ#¾Œ4æk°¸³ˆ¸]¹íæàÒV@ÀËÎ~ЭªZ£»ï;; ?ª¡;kÇ0Å Œ7nf¯úäÁ¾p ÅÕK‘'œ5Ö˜tœžP(TUl ðë‘Üààúd#ÃÈnÿbÉ3‹Ý`ìf|òãç¸tÍÆ%Ǫcdó0ÓÅ^"qL"·™nçs`i£œ,¥Ûì‚c¥rDÄå_Ÿ¢ jŽrã9òÚ5ú¥&ãR½±U¾m œÒˆº)À&Ñ…ƒ ¨x&\CxqÑnUéPíf=R '+/,.¹·™q]M:Ú?÷Ͻ_×Jɲ¿x[rqmá5m&Kùã%ý)x{·öº\–پ߼ö$”}\?÷vgy,´Ç²êl ‰RDa/ãÛ‰H³°Ÿ´ß еTô’Ûö¶Ÿ{/‘P,UƒíÍÀBÜÛîm®ÈÉ^×%¼åvw,E¨m“˜äÙm÷m?Í ¼ir¹à¿Tmßff²ÖK/“Ûh{‡ˆ}  ro6XÐ?ÇþÈm›vß{é…@¯vTŠ‘Ëͦá˜í­ó6 äeêõ†FÂD®S A‚aIì¹Il‘EÁ1ãKÃG8Ô,º³ }ù‘ÌR¨Ü’õƒäö‡O¨JÙ¤l‘+¿â$UG#ƒÜÒžôXmãëØ²·Pƒå"/Õµt åý4£Ú¦€XË;³Gcî÷¦fzŠK¯@('*ã)1µ‰{>À÷º೜‹Á¯¢ ™?x)²!WÊ#°1Ò¹í>K lšŸ ×};‡¥Ë$Ëroz! „voe&°mRÛhb ðé–n¸êðuª jBÛæ.ÙýÓÌ„ÞPë/­nÌD«m€£$J˜(ë¸h=Иs•dÞÑl­+÷^ÀBIê(Ÿ5eó&cÉj«!‚fÅ}­µ|èfu¯.ªPåc4€‹­êk>¬¢†Áz[èW‡z)qðó:©&"÷ÞLAE PR)¾Ä.Aö3»9öh­SjåhÌÀH”µåѵT.UU½÷vglH— ÏÓfÚ“Ãdb<(qzU Ý2Lf­ÿnO»A}Ôž6ÿlRi``ÀRÇìéÖÍJ°pÊ8{ µ]%Ÿ ŽRÆ4®IMà¡Vpµ°åœŒ-\7÷6X¾“´þס²\Ƶìí:øƒ <² œd¹Âjï#ü¸‘t´Ñ'/%MÙäfa–CY&Ü?õt­ŸÖ¦ì™ ÂxIÇÏ×|ÉësÊù–Ë]?zƒ>—¶íO•qýº.á@³>Ï3=pþÕ¸#x$>zt^<ý9y>\ÿÞPÖ¡Ñsï]3ƒz¾³ð¯3ubfr-dÍ’0à'L·møO“Šºžâ¸4ß©ÕCO»¾ØR¥F¨º­Ûg±Á©²é6-Î#B„…B!;H‹XK÷»¾[Ü•ÜõY±DUöŽ-¢q |£ã­‡c¤I82kx°„¿*-b8PLö¶Ÿ4 o3 TIT¬ß˜¯ ßúöàv!©ñ¼ôZoÞ ðŵ–ãöE]ºùE¼ ow:½Á/{Ë Ô¥µ -,·˜(áÞüqc¦öR¹Âþl¶·Ñ‰3¹ä̪÷M\ÜfÜû†þåG°²U`ñÞÓ""7 `%xl›ëØ>ƒàƒiVË.'C1;3࣒·í%ÈBHy¿L"w›¤ÙÏûöz¸+ë—}@Ã턨ÀØø©¸VGŠ™aØÜÆM‚²¬X"y³=g`¶]ót"Ï–+œíäâÕéEާ– i·‰_K¡$–ÝLË´7­^0nØM#·ŠEÖèh‘¨lîZ¡Íj‡Skî¾Dâê|õƒ|zÚ4'Á%Ä:²D{3=u¢ªBÓ¨—³È‚³ÜïDÛ{[|„VÖÇ,GµMs3‘Q€×rªF8Ý Oµ8ÁÞì ¼­ìŒþp‰"ˆF0Cu‰8i¹xgfÙ¶ßï­/]?° ÞBîÅÖ5NŽ^ú˜ ªKd;¥Ì|,Áóké{»…¬yåyíØ‘=lªŽeóB`-,¬ ]• ®»_Vu  ><;Bñ&T¦§*…hÆøÐ4D‰JGA±ÖuýXúÂRÙ®?ÑVúÈkbÑ”E…MÁ”=|D-G^Õȇ¦Üåæ~Ìî+Û” WÑ¢˜Û*Ñpir/²9ÇiSRMõ.àövÝlzp@‰?PºCé߯Àë'`ÍÃ@U•X’A rSü„ù¸åÒ£:Ϋéà˜3ä€Ð½iN"j!¸ …ƒàØÖ±u°5J®!ôËN|ˆdõvM” Z§møræúE²º>à2è1ª¡‡ŒÝEè¾'B¥è §½° DdÂܺ•¢Å%çÊéÒ¡µ‰V8²Àô‘Ê õ+Öt~Ùɪ†<ÜÚÏ™,ç07WE@ØÃa|Ö8³ÎU²P‚2äYóöa¼”,™‘SNœZÆ1ŠËdîæóª ÆR¦2ç¥ÜSvªÏ#®q¦šQÖÙª>·•M.Én[PÙF¤Fó=ØéÎ.§Œ$ÙÉÛ!ú†áŽD*iÈçFvÆê «Š*û ÑŠ!£RDxºqKjdE×jonƒƒ!cŠlS†–iOw Z»ó“9z¬Y¯(c>• ý´][3x2•càÔiºc6>w_ÅÆb#°šJÊþD¦Û°>œ©œîrŒúkñB­¼¾ÈžUYÎ]«îa©"Ù°¥É;ç›5äT94t–¸ÊWpŒB€ós?©%}2ønÁÅ3€>º ¿¼ŠÌOµéñ!sǵ”sDã1+(W™+a—ÚoÒ0Ƨì~n;Ì4æÂ˜Ý8† äS¬šr>ÆcÈ#Ï`SöZO–?amæ}Uèä IDAT\|@/XBµ<ȱXÎÉñh7òÉ“lZS!æ­ÁÊÑ¡DzP™Ý‡3¨Ô³«\l²X…Fðaeñ>ñ69U•šZÿº¥aüª™ðü&*f„žèÎõÊmçõ>†ùL¾«¾ŽòkJé·Ôüânû¢‘Öþ¿` ñï4òÿ;Ñÿ¿b™øýœÿeòÀó«Âï}Àßüc•™•c¿.OjÿDíÈá.4£~ÿùÝ·…Éù‘C Ÿ®´øÞ¯`´7WgÝé|(²N³¯iüê*¯ôûWénõ•±¸á½eoÛø°ü£ôơĿ4èš#üOmÉxä7:Qæ‡6BYå’È;äJ{—Ù‡÷>ZàÒu^F¯ï`”§­¤Õd¡\<¬öÞ?¯¿7¥3t­þšòëºmØü1cê`n.:¬þ¬©ZÜÙEÜ:»Ý U1›æ·$×R‰—LŠv#ÂQQp7”kÀã¬R¯ËlÐd1vm&BÜËã$£ êë:Å–‚N3éî‚¶mât‡TXµÄl«=zîýÉúð!ŽYÚ~¬í$wšyÇ#TJ÷Þf"KjÄâF,uÍB•^àœ@*sUòZ ¹QhÔ ÔÕ(KÕ_2Q9Þ®PÀ 4¹TTRIl=Ã#A$䥿#†å1s3žK•˜ÉVY9¶:¶èi­5³[׋N°ð„º…ÁÞÂø3˜2QÊ®¥ªî Õ’•uɶÞ°Ö¢½w.X¢9ðÛcÓ+¸sS]¼ŽK„ Ûõ–w‚̲Ð¥ŠIäUØ'y“Ë·¡*rƒÂMÓ7xïM^Ç•úƪôTË{¸#"›xéÜuÓÍ{ï×Ú ©ªˆàº<³a²5Ìÿ*Üv{`#‘çBã-{[ö6¼b bäÞr-R¯8hnÛ”¨¬{tø5REi¶ÉÛÌGžNÀ· Ic‹X&~"²’Ì =·ͽŽãÁáòþ«wœ´Íñ&Žx²ðm–U}9£‹Æí¡dz‰Ž ~:Òàw¥ª.¸N- X R= ÃmË=Ow]ÌÞVPà`Ac“k‚{J¤øtÖÛhãögt8œÜfqs/Ŷɵ¤(ø†jö[stNR"zÊŠm[k9)Îa>¼z­×¥ºTDiÛË)Ö1ùÎE:nw¨â»#XPòÓrpDˆlí“þ—_Ÿ;·›·9Åo{¡È6ª…¥´^Æ7Ìî0–:®ÁÆ^4-ÊœžgV««Š:ÊÇÌdï["g¤?0°1]¸¦*F…z‰Dwžöº‚<“Û“SM@! T±P]5¤BA"1Tv_Q’¶Ÿ¨3·ØaX·ç6oê˜aWÂÎôî¼fé~ŸòfƉ¤»'‰Ù Ô8SØû@Ðo"†2\prÌsÍšÄTdf}ßpD6;æ0DU²J9‡)tË‚DÏU‹ê ‘L9ÙÚņ!Í””E¯)q’]Sú#ä“ý›=Îý÷úÚPã/À ™Ô2;5•¿’c˜“™xR}k˜qs„kO·‰íþä³ô²díº…z‡ |O° úü<˜`øõ!#8Ú Z¯É„æèVi¦f¿ŠšNÕË5:Úß³Ù8'H³Œ4c·èaqP™š9y£®Gôu‚<ÃÛÊYQÐøèÞ¬¢ÙpEçÚÝÌ ”gì~2›&)%ÈxHI95¢š.4¨ŸîÚ3M#=g˜Ëƒ›âž!4…I¨Q:>ôÁÂ`«t Sƒcv¯QšÁZÅâÈÆê ?†Nc†l©oÕ!=ýÄ)dz?ëv«¡ŸçÓ•4RBæOžÒ/‘T´ªàûÔ[˜ÆïÃYŒàT©¦ïŸ[èùõÿìpÁ-W0¯µî/#G‰´MÀ/ï1ÍÒàþ5Z¨?¿€ [þ¥ òeìU$c~ò¬ReÃâx$M)ß>Ìg¡{Œ¸MTÎýñI¬±qÎãå¨å>Ù«¢J³ƒ'•-0yÏs-Ù[Œó«)\ΰ>¥ä ­ŽdžH×–üÒY§‚ýé? e·ûGgÌΈÀø¡üC¥Õ{ ¯ ëähÿ³.[ï>/ªÏ¿Ãh ðï+ÿÓ$ñ»±À ®þTC€?ÖûŸWçßj×0r@ÞŸzÛ˜å3j"G½íhŒj ü\X‹’2ôî)ýËìÈç¸â9 ¨îº¡ïGkFÂc æÊ8ϬDpyºÑ„ò,þ2ŸÚÂÏÕ¢M_—újÑÿ? ~c0?ú„{Ÿ=ŽxµwÿøëÇ¡àrËÃiú0Óƒ êÓ'ÿµª/ ¤ñ¬tCœºåK1Àxò¹AÞŒº$ `÷Ž3|n9 °ÛÂkœ•³‰VõÞß½w´ÈoGU÷X×8ˆ’û«÷À}¹ÒóŠJ‰K¼÷…,NmÊé¶×°ôº-«öv†Äi±Q6š†÷7ör*² WsB5ê„K8sÚš¨¨=+ªÊ!bFíæNÒ„ÞÆi¶¶D‡Ûƒ5û¹ [ó=¤S Bå€êÒ:çø+û_ïA±7W>ëg)÷m’ŽEʾ7-/Rjþ‘Ë7=>¦è£ ib²d¹:|Ø÷d©^Àß½5}ÓzÔ¦ém²n¡²–ºSn‰è’û‚l-ï­ï™_ŸKä'k³Ö¥P.]¶¶¿SU/•M¡Ù¦¨+¢LÁ Þcéæ%¸nžGI\ƒ‡”ŒQW`–Ïu3¨ mßûÞt'òížaÍd-…·ôˆø潂]™QnϦÄS&QíD÷°UDó¡ï_>n15béë‡.Q»ï-mTÇY,]W"z\ÁI/¬Ém‰¸žm•Üÿc¨§¶kEí–ÖÝRé£rÉB ôï‘pÙ†ˆÁ5nËQ•Oe|"¢Ùl´…Ã8¿)p)¨‹"Ë;lœÐ Å.·Åç$?ÇìßSˆ Ö º#’1ô•Ck¤@.š»‹]º±#4êT³uQÇá‹4nl¹q­*¥/ÿéïÈÞ•-ƒ!àëÃrK^úÀã+IP%$»G½*´…I7™t‡d…¤­5,̹½Ëݤ¤¸E¯F¯/Y9’VË[Ÿ]¨“8«úfª:²däÑâžÓûê0Ðqª 3HĤKFëú­ý…Ñ\_X[Ãìdq¤S"¨ôV0IóLÆt¢ä§yTö«?&ÎJaΣÁ××)þá?Éw/Ó]Ÿ¿“§HÙ i(«‰¨A8Í(u³»nW-£n\‘e+p•{ÞQ§9Ž@©áð„iÔp=¥þñªN{íØþëé°Ô>‘,D?e3g®åè]Ž´ã UTûÔ Š@Œ!PÍ]ªl “±Ž#¯1|(¡sóŒ£f™fÀÅÊúã ¹èÈl4«y9‡gJÛ^C® ëÙKAÀ,®«É³91Êö{œ9œá<­uù²(‡6Š™1¯‚—dcãÎ Oø¿YL rø\c´>Y3h`çLª«+SZÒåä'z)òóÓ׆´åºîcŒR0N"ë³Á¿….º«”Õzk=\Â)^fº²œMlj†ã¦!b3IZUqà‹€uFu[èˆ{9ÙêqŒñµ‰$¾…'ù87d:ÓÙ±,È7NÒ¯­ø‚gÓh#o™£ß9»Ê÷ÁÎjœ‹ËÐ)úBs SûGáî³µ¾XÅTŒá9NíòéÉy‘ÆOtLå,: ×]z~@#‘ÑNÄÒ±DàpˆÇîÑß¡…ôSKŽi¶ˆp)ÜfĶýÅ2oUP¸Ûþpôb|ƒßçBrKccuR/ºûIh{µÜÖC5<?zxàdÜvcÎð…³óyô=¿!ÎVÊiàƒôª3ÿÈžÏoÓº¿SÊæªéÿ®nù? þ§îþ{Çø:±Ã13zÄUñi0Ÿ#{VWIîQKž€™ú5àû~²¸¾›8:pòûúÀøèhoSÿ¿±iU­ÿàÂÒ˜à˜7Ä`Ðu 'åÏŽÁž‘LºC—Ì]ØLRËçÄtœ°S‡¯áÁÑðøÃÇ×„Ó ׬ªKvHÛUÀ»™²C@¤Aù5Pht¦VU€¥…üH»§Ö¦ª…ˆ™(\]9vuˆmòœ@ÿÚo!à`:VnTXËÒªÉ Ç@`d!æø|˜_.ø,ˆ"3@5#.½ó @VŸÑIÇ=´ï{ÄCªìÓ¦¿…6ÑdÚ` {×Ô£)U•ââƒ]XÅ®üÓ¼/ì/5?P#ý2ßbÎ5£¨©€»ö?½ùwø‰s&ŒìÉÁœŽù†^¥pû§!iZQ@ݹj ¶EÁÌ"‹â.ïWø™…F0¢G6a´r蔋ûÑLHp*}ß´xnnWå‘»-†¼bŠ¢cˆ±K hLpÉì6ÜÞº»PnÚ%rÁ¥Wñ)މøªs­U[¡ x# "7åò-¯¯KÆÊ £\þ•Šð¦- ð¥xÓÿ¼ÃçÅÛA/]zé%êeÆÛy‹yû.n·k,²¤­ê¼ÛDäZ—PÞfÒQÐÄî·¥vh¹éRèZñ˜ä—ú@t –ph¶7T¹m­%”}¹Z gKkM_žÑïh€)}´)%ÿGÓ—êÛ‰S©¦2J ò®Ú¥1[Ò±xMvÀy]ñ_1^;4ÇÊõôÄŠ/v›kß+-,fÝÍžOiwÔ–†MV¤©±Tob[¹GOu €‰ð%áËŽ7jVUÕsþLù9§Lœê†Û'ÈúßÂ蘆 ÚKY5« #ìŸÄ!²‰ÑÜw]ÙLŠ08þ´m…Fô§§o;¼M¥Ì/ÍTLv7¤†c¥»áä¹Ì¹s5 I†°Ò½‘}¡µb¢7CPR“$!·gù̾cÒ9Xaô@xǃ¶u¹"câ$W)ÚëËæ & ;¸“q áA‘`sÇÏÕ1oà„Æs‰yì¡ð§ZÄ:2…m¸r©ÌJÀçë@óaEZ¯r«’•܇‹Â¦3dFôè2•Vj“ÙSPT¯ ÎÛ Ö ü‹„?â ’I³ ÍĤBEt1§Ä)&¹?Í^v0Qòª¥×P½ª‹¢¨5`.4ã<jåŒ8=ñ øQÔ}çñ:Û J/ó'õ ÒiŒF"ëií>“þFرÝàÇŒ¶ ÝíÎÕÂŽH’Ǧï§3KþL5ñ=JH+•>¤ Í´q=NqÒöð¸7j+5Ôw1Aî _ýª*,ÕˆÚf ªÏ¡ãnƒt’‹OÒF˜Dò=ÛQ&ÜÊx„7ØÝk£hàwD¼Ùà cbÏô•…· ¡Ñü—€Öx¬·lŽL(;WtÊðýo‰ÑÐ;Òø­IÌa¼DuT,Ê/ÔÚiÿŸ ÙH7#÷ÙPá¨T'ÇÜ¿_þ¬ÖhñY#Ð%áãp~ü£(°9ä­Æ-ágFb¼âOBÔ§šsôÏÚ¹*|*}…ýmÑç8é™^O~ Ç#øÅåú¨õ?mDà3^ð¾ø»ª&g|[þO¹ªù{¾ë?¬.ø3ºÓÿeù\ÿéþ÷ŸúU¬¿õ‡ÿ©y°ŽGAú5޶ò£ ìœcóKýï )–/þúõ×µ/~`ÈÿhS×2¢6§_KÙÏPr º¢`TÄO:ÿ DÖh¡Ž«O2òŒ-Ñì;.%yt WkqÕÿâsŸÿõkžê¿<†½—E‡Ò$^²<ðt0r2RËŽôIƒ¿ËCn€ß{O¦†-ΟæÑŸŸ†Áªbû¾ïmVLžËTհ‘©¯yƒwEJ·êÎ-u„|»ý¶ÎR˜Þ©Û¸÷]FObÏPGæÓŒë¸Hn×8æ ƒU_Úþk•È:š¡™1LC]~5â(‰1MÂÙÃ!ÁÓ]råc£€‰±Ýyž2¯íR?‰±*œ &\šzå$e‹Q—†Äk)©÷Þ•åpõ…*/š]a^Z>TÍÌ4y„”Òÿ»å€p+x¶]åqá¯v20–pù¢Å©Ú€{Ë¥Tu‘ßwŒŽøß h´Zæ’TÅ xÏ0‡{ÑLÄøØL¾ÍŒFxm”#Žb²dQ¹.¡…2‡‡pðìm+J5‚o±EŒ²ß=7oã+LÞqþºÂí·De ß7I^/•á,Vo;&,Z"í.àR˜ÁI#E˜Ø6³Íë%?®e›Êm^â]Ipï4£ËP æl(Érï´Jb;wñŸ! GØ]‚lr…7òÚ^$þïˆ1û‡Õ4·T[|:¥*ôVÂsÞu+Ó1Ζím# »ÒíÔèï+½PVó,oM_nàÅ-'S„öQ ®.õyDd˜˜¹‚D¼–*4+^c½ ¼¢¹g--‚§ªˆéö+“Æ$zùµìÅ¢iwÃ)ÒÌÊOçÁ¸§\nR¶[~û¹¤(¶y|Ƨ¹!Ú¨‡JÕ òÅRV]!a(…þQ…EÊ!ùî1ÌA7åZô€Ù¶¤›± (½¢ÀIŽM63¥Õ1ôõ™lp¶Ê7ˆûƒSæE³o¼²q´@j^Ê]Cs?wÎ^ÿLׂ»iï<“î•pEXÄñ¾R ED°#h›* ñm[¶ùüâZ0'Ê-¦X0è-Õíuz7µoÒ±A]˧D»ât#^&8¯U7ÍEÒÇÐPäeB¿ëðMŠB©»e¢œïV•¨O-j‰½IGYHeûÈÁòyãçS£ÁÊWl²`k¸ ZUÅea¸ZÓìâcj +HI=•(}€QIàRDN¶âN"²JÃÙÔî‚`§GÔ­ÉÆ–»Ž‰aOÆÍ`„Gn§,þÿö™2ñ©ìBfIoJ6Ñ2RT{—ftt ›,G28îî*PÂó˜KœÃž3<˜[LŽ:ÂcZ^¬Mòp‰&†'/O1}¤líLáÞfoa<ˆ5?K4k3BZ­–‰) ëÕágÐ…_yˆ¥°Üµ w—ƒù¿HqR޳s^@¥-é ÿœÕ|¶ç…‚šð \Á’8^Ž{ƒ4†l !g'žQ±¹ûÐàp( ˬ½QÞÁN³ø¬Ù[ˬßl‚SuGš€bš™ÖÒÍt¤€]¤ÞbÑ7Âöçg)4o ’Œ©èæn~€Ó³ùþûkÒ¶°‡´Õß›'æ£@–‘Pä`LJVŽdwF­ø6ëݪ«ØÝå†/—¹ w3¤ŒhoÍÛN ~级3Uc‚…Øå! É¿tÆóÃu5F!5TÈÈMäs†$ÀžWik0Ý>“¨4i£¯ßÈ+VÎÞÕô,ìÁ1žJÓ!{ž:ýQjþÔµlèÊQ–Ti¤òŠçh±êù÷K½@GN9ž¥“œöÊIPªÂå1ymêÑ‘"fB'i¼Ò)ñV‰G[q[#hº_ P>ÌÕ|ŒFáñxýÙÎ „y®­Wdc½t̽Óh­ …Š´ FpžgŒYSìk9Ý’6zÆÒ`æ{<šéðøbç ö™nÄh L«áñh=cò7éBQ$õU±æß´˜×A>Ð>sôÀ_ªÃi&ÆwÒÓ‡\ù(4Á¿Ìÿ(øcÿí]ùüw7üÿ±Ê?o¤BNzÌãúòœêF>ŽþÇ—aås²OTÁ€ïöýméѶ*Œð\!Ü<ŠŠþ¢± Ž­U F­;á˜P”Í?Ëáfh­gÙÔsàõ:t+6 i{­à9#ýÂ8GSà1¿w?/37 Äè<˜¢À<@tTn8móÀu­eÀ¾ï:»1ÕuŸüyt CUt­ÃeïšWtK†÷2É‘H[Ü®iDÏ9Îq4æÞßpðùã]3ŽîôÙÀè­çóÉIÛ†ç¦(­.Á—ƒrv_D½á°ˆLÔµ „SÁ{ÚhØ#ý”H²0™¯¥TˆQ~§ñq¡ÓÒâ€Ë(£ÇËýîLú‘yÚË”ç¹v…=ÙÙâ¹ ®·£ž1¬¥elfB¹–Þ¦Âûc €ëº(¼ßÛÏn.æ¤xªú¸;"˜_›2-roÂGB¬h«9¿TVžÐdn§X†¶Êœ‡\ê˜Zs{®ú˜!·1ÈÈôWBw·ý ;]î^÷m¤­HÚ„>òÎóMìǶØÂšI"?…Ø^å 3BæšË{7“ÐM¬?K¸¼TÚö_÷&Í^Yóª©pzò¶Àï\ª}ë‚Ýù•J…Ñõ–-"º–®¥ÆKíÞ¼ yôY±—ÝT‘•·q!‰ª*n_ZйßXo Â׊JËq¡½É.q·7LÄäCc)ð‚ñ”¥cêj™¼~Ó^‚¥¼^/ÇŠ¿UD±.Í€]oš*³ÐØîbÔ+ÀVw¦jV¼k'ÕèàÚⲘæàþ÷K±E”ضµ»á•“õ³a!¶ “1­qz‹JT;j^òµ‘Ò¶Ãר ¡nR 1×êÇu·›,MÆtÎ2®…Ù³·Å¥F³¦H‹p…g u±´yû…£"w¹¿ý{r Y=Ý‹¯ÔiB»o¨.@×bN³»¤Ã[Lü¤F{¿·|òu,®lôŽ!°̸÷ÆäOtI­å„•CjÉ'<ÄÌ–Š½Y᥊ˆ\ªÔÖÚ¹$, / Ãô­ÆÛrlÆ¸Ž«²Áe®ó`AÝÐ8˜ÉÚ½¹i”fvÛÞûR ,‡ÿv0ût"â.ä¦È¦ú Br8Y.ˆxÔÓegh¼©¢Šj{kí/ˆà&/‘½¢–=tnv¸@>D'“éPd¦cRH ¯µöðcËç]Vój&3s˜ØZ/7ËÆ«V½M­vF,ô¼9]‡UVÙI—£ +nRþúüÖ‘ò>¿M“kÌ‘R“Îçsén)‘aÖÖ„9¹4–z×4Ç>œÍ+Q³ÁL‹*g~c‚®Œiõ=HtÜ@“±åÝïÕ‘[`׸}œ{¶ú኶u¢ýχ¹ÿ0ëiÌ(k¢7hç3à .Òè.á®t¥n½_`pÈÑj ¦å8¢ žŸH;AR¬N[Hßa¹rê¼æÿÆyžVWJ€{µcÂѹÖì<1:l£ê8Ìå'«€‘Ãvú²%~ž=[RÜÆð„Œn•ŽXnh4tQÌ#>Û'6~kä4r‚]<™ßY2Y(ƒ‰Oœ‰‰ÁfbûÄǽ4ÛQóQxW•>ÂÄ£©»KÃŮѥ¡Òc*óy7òˆ€ –ŒÏcdÂ0‘Ó,Z©·i‚¿Í‘n™°©<»¿¥ #e´%bp D÷eÊÊupz—ãrSNÚoËÆ(ÀW»ý§[åVÇ3÷ðq˜;°{PF²›åâ©ïÃýÒ£«.nØ÷”3µ½ì™ÂÎ<“?=þYçvô|áàÉ1í]£öTN˜4ûã:ðémø´ QŽYËéò3ÿÊs<Æ2zqà“+@KÜsk²OuxØë;4ÁQO€9œßÊA÷Ï–Ÿ4xI?F¾ wcåÂ# ÀA8 ÇèIàŨý™É¸-+JÆi{«:Ûÿ9Fi=»ép•Ì·Ž¢ïΚ0L|yÎëJ™]픓Ä4å°ÃÎï3N÷+ºÂæ9)fÉrö¨ ç€ý_Н£‘™ø²Hu&ÈtþDŽ@Žï3«2þÄ"ü.‡òWºûßPOñ ³ÿçøoR˜û¯4™ÿÎ.þÇp°¶þ ? ò1¹ý¤Égf»cøÇ‰ ‡àÞ ΆxEÕ95lÒŸù¿ÌûÝG,eá?tð1~hã5R?}äÄÁÛ èÿXcg…ô ¢pLž IDAT³×ù«£º*gÚ«®ÖûkŒ1CãÿE£0¤ ⊑j¡¨#Úu-\®5fê>^Ó}³ŠÙ•âxn`‘X¸×Z¤.‡Ü¸0{‹Ëã ·•EÙïm†ŽŠç]òh|]×u©B7‰ÍzD@cΧ”-ûm¤mQ±…‹Í.^²ášÇq¢ðþ-¸rÆ&VÎdnÛÛ¶yo¹@UÕ¢{ÙÞ›<¡qˆYX ýñzýõÞ"÷{óµ¤[ì¼§™ÓZ£Ì£Ï‹ÊwÕR†_=/ãPfý1E¹€í ™–‹¹ÛWÇÆ$ÂhÛ¶m\Eí²>¬Ø®h)êyÃd`„œeâ÷¸kÄwY´;$Y*<¦éõC—¡"¸Æfb ÈíѰu>÷—"B/¡D¯x¾¯X$[[üìéê'{jùŒŠáùmªÊÜÆm–¶ÖÆîG»³E .QY+K¯½…›æX8FØOF‚TƘ’Å5O÷Ÿµy²· k-–>úµ,2ò¥5Š`”g§°îX-ƒ®|zH Œ†mÒì_üyi½¯•ﱡ¹)ÉíéQ ¥’˜Äð—‡yËÌËwüž.éœR9ë²ÝDŽž©¸Á àеîé*ù=ëàºüYh‚å\©ìËÆ¿Ãå@ãi¢åf/#F£#Ü  ƒbùSÕ‚ £,´þå½aÅâ±|ûGc™Y0¥OØë›Âð‚?4äb›Í­^Ä¢>Á;Mùø+2t-WKlìÄJÍ({ïzË£eÕoDËûI&‰cAgDÐÝê,âûLJ‹|éæm«T 5²‡äh9UõíÍʇ–K§hÖωIÁ—´ª,ÿ ÃîÁ~Ú˜½³P]êŸeÛ9ŸOüüN)M‘©Ï ^ÙB:ÿ¦úÿ.Ò¥HBž õ %nøüÓê—]ülj•T‡3~w¸5ó([—Ñh>úrpG‘Õ„ƒ~S»ÆncFðưåင(ÅÎ.J("’oƒ`_ >ÿ&¦¢1Vkwƒ³’Ü&DåPU Žœ¹šJ³¬üÒìl-pèššVóªƒæéÄ>„|áTœ¦k‘¶°#˜ÃñÜžŸÛdÖ³îšþðqÉãû%zþ'Ô}ñϰ~¡1óåD^|üðиž ðYqðûÒ6)Ÿ]Þb·ù7müü—ÄÞ|ŸkbWôqšÊŸúûYæS{ÓÞï··§‘'ý ¿©$ÃçäþŒ×€SñŸ;çòˆkî6%˜þòIDt¢~d „3 Bó·« ¯z˜ñ9š¶1/I=k~Ÿ#M4i®¿qxò¾ÚÿŸÃt_\"\Jflc1FljY¦ÃµK/QÞÍ€"²÷Ö¥h"»gÿý~¿^WÀ÷¥ÛŠÌØIˆ:dGp|¢À®CtTc– ÒÑ”óÑR=~õƒ*6ÒчÉ!®Ôn³™k3sú{üzýÒ( ´é¢wuÔ“¤c×ų4…Ü:·£:²iýûÝ[›ëÄ…°YVãq¬AžËçul\"Ð%B3MwÏÀ²4Þ’æf&²ë/þyetÅÈk-ˆÜÛÞûÁë'T%šC-öûÝÎQGK4{&j`tS.ãRv–6ôS£¬¨–ȸnnÙ& ËÏxŸ´›ëR$1Á‹d‡%)O> ¼IUfp;m*³>bAEÚ"WnÌTG_–üœ²à*TtörÈõO%¸>[œ—"0Ú…us»cMØöÎÑ…BÝrke)éÌu|OÚCIÜæK¢êJÈǰ‰a×ÂO£O}^K-Û-¹÷máÏy]^FÌ¿ªR¸KºÆ™ZÃ5Èá‹{/ ú¬ˆˆlš2*Ú=bò¦]àZ«4 €ë†åˆˆb›ÀöÞ€¶¶\Hâu´MÂ[ìy=t޶-ÊrEšR@lÙB³ÛèÓ’Ï•ª|Û¾oó‚U…EÑz“ÝoÒå~ý±( —¯%ŠìÐó”¯Ö[nnt߇ ~\Ü,ËG(þ*Ùm… t¼¯§ïûv[·*Tõ‚*–?4—#ÚÞ"P¬~ÞG‡¨÷¸ ´})_æ+Ê EÍ%Ôb— j1\\ªÞâ×]J÷½d›96E*bÊ\ºÎGA”øb©.]¹ð^—a×Ãß²¢OSëf}kT¶B-²³©LÜPÜ.t”IÀJæÔU­”­7ª*UxÈdI#ï¯tÓ¢#Þ¨ˆjŽhÇñn‰l#tî —BãÕŽc^[ç˜$»=HbmPM¹,/Ì*¤!¶y‹kî–lºãòWŸ¦³€A’ª‘H+ˆá¢oÿbª;ÙØ#ƒ¬òM¡ÄUQ](ÖRšñm»Xè£ "Ýòéî#¼³ZuŨÞÉr“{À÷äìrŒKi8L„Ò§´°«Ñeƒa6š»Ï£S42÷äPgÐx>W;Y;pËODéXÏצˆL.P@Ãk8±UFü×ÈR(·µQ/Z€k­z-±œXMÚ˜(ŒÀ«¯´bõÝKýRÖæ'Ç64Ö+ +#·àLì¶i4J²Ä3åÜØöŒúèÅ›<²:Ž^\™ M“Z¨ .jr˜wœ£äC… ³Ç ®p½Ë[¿b”ÜÜd•¹å?‹•ÃЬ­Eé…DV00/ÄdCÉDw'¢žÈÄd)|gâŸÜÊ—¯ƒ¹,w§¹ ÛAÏ*Ñ´6µ“KÒN´Hj"³3æ~ K8xÞ"Ö¬ £@MËs•/‡ƒb2q‘ýÝYÔȹë„ûÉgBŽ÷‘"¦"ÆZëT¼}Øà­'9FãÁý61¡V:‡C?‚†–§¶»â{#è9ÚÏGJ®^>$®yŽHtá*ÖŽ*ùr‹TÖ+³‚†HjŒJ3{•DŽÌ¡©JÌp’ýF„{‡ê¸í}ï´w'Êìh¼¨»)f¾x€;[‘O»/âb'cðq¾? ìßõ;Nøåa`yüGr§ÄQÞ3(›ÜÂÄãÊäɘ§< DØ sU2ja–º ›¿/ ex¶—Ö¹摤G\L}5«Ï܇-Ïjö”>@̆~~‡ý¼îëçV²1õLªgn´KÝeì£v›!eÅ·F Å¿r™c|Ú2ê3™¨^'›ù é=têY0†tY†bŸ®bÈHÌÏzJê|à䳃EBí°U)‚çèåqþÊÖ|°0‚y<§D,ÉïN×~ñûNuôSxý¯üëã÷åé?÷{ù_“*øS$¾|øã?†ßø3Ò>Ê·\Ñ—²Ù!áO¯CÞ›|dJ“zÞŵFà²üàÛ/¾çô( Ïž^™Ó‚Vÿ›þ‹1!;>(üù«ôœvŒ*‚–׎bל¡à™¸s¾€óžf(6ò£à1ê8Ò8ÇcÁ„¿ëd8ÎqjëݯÓì…< ìò|í]ÕyÓ³ï³Ëœ¥7Ÿ7,§e’ý­Ô›QÝuÙD‰$ì;j”62qá 2Ûô&Láœ7¤!—›Ö_Cn$ý‰Ýæý,H¸‚ñ½:$+ ¢ÃTÕ¶šS¦6÷C.YôѽÓZGf?óJw/.ÚZbá.“°K‘ô2d{(Õ*6`§èy-(ƒ$ÂM»dzב þóýç1˜¥p“³ìÝß%”¥‹>J…ñÞvï½Eti‚š@õÍ…ì]Å‘a°êµ¥˜Eki †oéÐÌO¯Õƒ¨Š‰r-Åx›’®þS䞆Éd‡^„Ü›Úu#žw`´,ÿ3·(ÛÙÍÂ\BèÖ—úQ«(q“jÑÀVôC˜W®t©Á™m`‰˜l‰0à .¶Dcï·Šß]o3P^‹¯Ë=2žzgLæDÄxgžZu½ B„³m&”å¡–=yà8'{ »üⲦüÇÍ}ß{Ûk‰‚BÅ Êm÷¶hø´+ÎÃAíõ-æB$’¤»•;k&tˆÅ¶Û¨n'õÄ„$ÍÌMrS^/š`ŒŽðh˜*öÅ_Mø~»SŒÀ°QûÌMIÞo¯ @ΟM}ØÁ)Ô°ŸÖùãZð¸÷íKþ$…\²„üi´mPUYDÜmÞìÔ/ÿÐ,+¢I ×ðõøéØÒa~VTΟå½ßf[óVšO/ ËMf‘Ͷ%¢Ýó(ÈÈ@0a|Õq+¯C.(Pºd) +ñ éá.õɨ(Ã&EÔŒõƒ™ñAV…È{ÛíϬµÔªÅ¾d$Ó,åÔ&,ŽÎÛQÑ[*á$côJ³¥Ð« ¸{D(u”9>ëÒ^èê7¬”ƒ4©Û胥|zÊ¥Ä[× Ý~¾õb_*VÄ:JÀAF›å º÷ö‘#˜°é~ã¦uíÄá×ﯵÓ¡>·$K×KÕh²y Wð„ÍžÙ˜ýÂùµA¡­©kBÞBÕ q)pSk­àZëRìŸ?cÞá¯UÙy~Ââ¾ø×±T¬fX—À¯ÉëBp£of1õôĦ„G?KÞÜ‘=p “08YêZØÛrFñ¨êëJJÄ,õè¯O«†ä˜-*/bGíÚëÐ9Wt=üe4rùM¥Mgg*‰a…ñå͵v«¥@Ëh™±íÚVíKc 0Jmòdð¹Qs±ìùÔ4~rè¶t´¦ «kTöFî)9Ææ¸˜JÌ+{â`÷$ “'¸8UGô`¦GÌÈ$5Ó¦¶ŸmÙe¢oûp„RœC”~RT!YRãËU¥y›t[¬øwL­%vñ(3«¿nk“VK_¥cÔˆÙÑàÐÊ‘Á1¥ˆA©Q*‘ÕÉxE3éÛXβjÁÏ ¾iq-nÓ÷º¤Å…¥ C‹ã˜Ší šÈf_U%‰o}.X~uïlÒØ÷¤6Ƥç4CÊ£¦êÓ™ÏS›@–×däYAÌÍÙ½à¹ëk$=?Ü̸õ“ö%V1Ìãd¥Zç#IÓ4Ï Ð¡¢rdøÇ$³Gúì%ùÕÅû$Û´8'Eõãò>x6:ȉÌôÙ+,CäV—*¢¦Ìx#xH¿QÔäì× «v£jP¦gë—zÉȉËY¼ƒlßsã/Šô·XŽ|’NÜ+•Á*³j1B L IêÌFUs¶ÆD ™Èlóå°‹« 摲ŸÍ|ˆµÃ{Î2#C9c\Ùä¬TËDå󄜈ùóK‰)VDš½øûLZŒTÃÓÞÝá-ßLÛN³Í±Fî»w®ê½ÅÇ}lnzÕs®ª—ØßãÊ à—Rx®á6‡¿1==ìMÚQ΋Ãå~LÑ'£j”ðˆ»Ì•ošxVÌ TW8| |¬)ÀÇ÷öp7>±B¿¡gÿ†ÊþYSÌ?Eà—Rÿzöð/^ü)ÿËQaöËgf gˆü½!yŽ>2dCøFÇãæt¶Êvë÷/ ©ÞÖÐÝxw)ØLëéýc0Èÿ¢úÐÉ´sEÑu¨øñ.´ ä‹L?¥ö¨öZ™{›cA‰¾[iu}f ¦èŸ-%ɽ:}¦½CaæQÔú™ê×½ÿÀ0»0ZÛ,\™å)oðëê˺™Ý{¯µ|FîZ›k­åñx"vÝß°n­'„ß×ZºBuYºj¿#TÅ ·ËPýžù‰:áž_’õo•½o³WXD½§÷ìÖ©¿®q˜G>°Ú¡â]š§á¦î x¦a“KD–êíPT‘QH´±˜t¼µY‘tìŽmc„Š%ª^“"00î°Up ä]W䌱ª^®4²®´{îŠ MÃÇáÒ°@!Á÷š€èöj_.öؿ ky½´TӰРؼo³¥j¡BÌîÛ òµn·™›¯õá¥Ëƒ¢¡&Ì6;\‚[=äá9bìfïxÚ¶[ ÔÌ~Ú^¤^KWôa[¹oF¼J±Ö2ÒöÞ’}HXtZ™µ.õ-ë±UÑXr©"Ax E;ŽIbBezŒù 6âöêu-¿zUñóçN¥Ö¶ƒ©Â/XHt§ÏÓâ8b4ÝâË“.\v]‰Þñ“¬×l4v.…ê#n³<ë¿$b±Æ\kˆ‰£\*¥þêД„O\õRʶgbZ%k<êMµÃr.ÍØ°å5)»« ‚åÊ®–O/†ªK)TÕ½Í(KñÒ©bù 6âSÈéf'üKæÞZQF¿„)nŸk¶íæþùó¾Ö²M£‰èRµä¬„¡>|¸F/@•û}D=¦P½„”›¶þ{gº]É‘#i<.ÕgæýŸµZ¼ØüÀâð SJIUÕ‹F3§¥Ê…¼ŒÕÝ`ö™*I]¡’V8›â—›ÃÓ…ª4×ÅLw¤7î4pÅ‹ùiN4Zkx MádôÝÇX¶Hô€‚6àñQ†‡8'ºÅEP!®ÔOrp/3 :gîÍØ»až§£n1º«±–ŠÓ‚M(`š2jzJÞ–fì.ÖŶyñˆ5!Éå²`æÛÌWRx±¯Æz`Fìªz]—#7< }h«b—Š ~?¿åЄ«d'gt¢ÕZBEv£C Û P¨œÔ8-EÁvFkÊ…ŸˆÖƒálPl~DI5UÕ#ʆ½ùjL{4¹WDä²³OÈ‚ŽÚþSÞùG÷‘Ò«Û ÎsLç¹YfåxÎuµäºð%ƒbÕå‘ ô%èbÐ!ç·.šiÜÝðìqiÔxB…úp €.·4ƒéJBn«¬T“z†7¹|«ì×JÓS oWcLSärZ6koÏ&ö¿ÛgÊYÚêò—@àüùG°€s'ÂSú’*Rs9êßKê« ä“XÁGÔ|·€º{,¯J«Cçú..…tÊwÉÅ7K®ŸŒÕs_ó”ª%ÖÚt5%QÇ At%ìJæjJi$Twš¤-Ëâ!NÄš­¯®áÎ/ãÐi1ö÷‘(À  SÁ¤`hÍcÊf"0¬ª{{Í&rÝíÄ:ŒÆëO…œladåÅäÛ޳[œ~õVл¹júŒË¦^„É<—®+ÁX§c‡éc›«£F¹Ìh,T êõ­=žBpE_hjÍç8ö”5žÐ9¸ ?-~µBŸ¬•^o¤CM'Õ¯E›¨JrX§ù`HTù·AnXÚ›S–o£Ótª¹³ Yo1†-+øvÐõ4YK¸Ÿ”<Ä($’‰’G«ín'î<ÁðSjÐÀÆôèxþàáòžq7J0„EUEußd³¾ÀüÝ"Ãâ&ºieœdgò1J:Ï÷Pã(ÆØµ1Ê9·Ù.Œ‚>ÎÄô9:ï>t9$Ø@8ÈV_SØ(†ï»®9sxãâoñEýÿrQæ;ì7„yþYMõqÿÜÅGˆãßkþþŸ"BÿKþq§êÿÞ†Ÿ>Úøz•àw¯™áë›3Œ•/{Šô˜W[‡û\¿USNš™–©^Þ°oz—ƒsß÷µÖºVÓÈTèA|#JU¢bxYˆ_‹­]uƒ39¡‹ù¦æQh“ sÿ¸–B—î¤>´o³Cc =0%Åru…"CÔ¡C#RÜvŽæàÚ%N®]¯=ïR sI TUJ£í¢X¡‡W0σªžŠv¬œo·Û ±ºøyH·5 ÙÌâz+Š@ø¸Žæ,2[‘;„]ŠÝ­­»LÎR˜ð– ï†VÞ5f‰q;^ZáØØ"ß4‘¥¤¸ª²íËrÁib‘ +²£pZYàTE%¦ ´1Ò轌'¦Ø\^k/÷T”¤y«;€Ê+9ÕRÒår¡“ÆéÈ}{ÍR\x;CqçZú±V½2•4qZÌ!ÆLñ¼³k[D`31ÈÛÜo¦Ž}ÇJßtqùЉüäí¼TõZ×ZîþIй@LîÚ—û¹ÍŠŸÇ"ý£¸ˆÛ}JZáòÉ{~E“uß_8ƒ m¼tzô ,‰A©ªYŠƒÌKôº–7³ËR/…B¨n.Í®§ŽÅ݈›ò¡XP¼¤ÑÍ­ìòZ­hò݃“ äÅv¾¹Y6««®%U ´ðÄS$Gt̆Vz~ËQœŸ·Õä*B©–]£©7¿,Z¡˜v@œT£PãÉ´þÇTð;2%4g©t×·jL=ÀxsKÓÑ“QÑTpC5ñÐD…=Û ãžI+¼ßosšÝtâÒµ–Z޵PÏ“–e3¯°¡XÝ·(€Aòu$qºÅQ §èŠÐØ^1°«»iI3f¥ ¤Ë»ð素Ɖ& |÷Ž4uîî9ªô°>«P["¡º ßì+Le?I²ÈºÛæ‡ï*>aLóÿ»PD<:žËI ”y1.¡‰ XªÖ­†›ra?z—DñÌ“S[Ù5©ßÄá|íY®Tœ{SÜïìÛ"´°©Ö!0ÊKd]ëÕý¶fBêðb“ÕïšDùìÃIÙB5Zñ$ŸûКsi¬&U$ÞÚ±Ô<6SØ+ð4ƒ4ˆ8£e÷Ü‚gÇ 7@ ²Tä6ËS bÍVv”Í×e´å¥'™$”uÂÜDï”â®ÓOVO'Cý®›,Ã|tÁª«]ú¢^„}b%Ì ¾‹“ã=ª-Z⑎Õs*Û¥Ô;×cÕ m f•z*œµ¢¨YÇ~Œbd¨ìèn‡> {G‘ƒØš(&ØJ›åÐÈ«\õ±6\í=nc*Š?í•)‘âÆsçˆí£–]•BYX|7´} àˆÏ¤4¼ïµl€õƒÍƒ_®0´h#UëQ´g÷]+1Y]4Ú°¢\Žâ€B¦ê T;fæ!Ï•XŒ¼zGDô‹þÈÞ’vK]D¨á<¸ñb,ׯñÌ« 2CR¿›„ãWAáߥ⊛ªSHº,  bœ,è°7?ãí‡æLx“ñshÂ,U&FÆ“_Öƒ£ÔzN62lt+[¬®û½Û‡ÏÕlG-8;àèNUcûŽz4²Ë¼÷ý°%Þ²¤C°Ç¾Ý½âÙ¤“ ɘÍqA%¶,ò< ÎMž¯y~o¼üvŽ‘8ˆ%îŒBŒü]èž;ß* ß;FÖ_Yc8ñ(ï˜ÁˆÍ™„Ì¥àÁ¯9„h·xÿòhSëÖ);åÖ< Ø>ÉÚSö‡páìâ•ØåÆýÈ&Ž–ËÓØ—õºS³*¢‡û]Úv|ëIÁçÃæV.ZpfAž Óì*Ãk¸¡lȷŨ²žÝ†ãäu ¾¹«ln*û£í"Å~a'Í`<–[çá;J¿ ȽÉO¹ó˜jq<Üfda£“~øy±ò»yüÛ7ÿžþäÏóï> áæ|;Šú»›þùí,êÇ à9 IDAT€p4r§í@ªº–Þs37ÍlºìWêø;ög¯¿°»p÷bž4ry~ýk­v8Šlì§-î’ÄæNÈþ¨[EèArü²WúœŒOµºæ†³5W5·¥5ÌÈ:»àûhh!¹ÇAV-†ôš}²ètìPéÑì!Œ®Û÷"V‰Ýc<Ã4BîW·æ… øò„jf{aoÞÆN H(ÅÁB ;_«¹²VuˆÜÕ<Ë¥Œ”éH(f¼o_ê7îô¸®P*EU…âîZ"9'Å”Çb_$`Š Á Oƒ «ÒËD^FE›&Ýž^‹Àl™”’|ÐwfÚšƒ¹²O[ñáU‹"'TTHÅZÑÛ¼õá.s’ð]e”\b3„éN^¥¨ÊÂ2†hf~Æ]57oxHB¥K˜%-Ük%~ ÀV…‡ Tè".ºæs§hWNs®ÛÞÆÀ¢f£gŒ” ëŠAˆPøvwÊíñ Y|¼j‹M¡Èûö×3ÜÂ4Sôu)©îü47 üºBÓ”¹:>œØîz,·½h¤¹,MÔÒg.[SÒš¸º0j]×X!04äí7nfÀU/”ZMê%Ð Žõöû¢Ü€™€Ü> iîQÅ•UÍÙäáN¨æØ,»"¸_UÈ4ËrOÞ›|ߦº ú‚B£G"Œ”EM‚\<&U>lT쮎֒¥jÞNÊ”SöàX>\߈—1µÐÄK²–2šÛ£œ#ÏåJ~ÓE#Ä©×ò¥‡ ¸Ž 3&¶»]¯á8¾t9p›™{ŒB3ð©p×Ö½†7š~»‹¬\àèp¨MËÉôÂÈàš¡êCÓW''â!ÑGܺfÖ¢D÷0„—9³f÷¬åKäÚãynÏ]fžxµê㤰º9t«Æ2Õ%´{ä 6búÚÄô'@zšÙK€ sìM½Óè¹·Ð¥Â4Xä]»J7’"1“t}vžºlsïÔ²,bB‰Ç,(Úó°j½Mù=ˆ[ø¬q[ ^Uaßb+fçbãZJ$Ád´¹jìÌlTŸgò“£üáØU4ç±î³‘ÚÚè¶N=¤ n {µCwJY;7Ù^ðJ—Dçµ€‘ú Y¶[õŒƒ]Ù¹/Èl)ÙtM•ÑÑZ=µ.ÏÒNgTTð1gë*Øx@ù|ýKɹ]Ǭë’\+ñ¾Û‹Ámx— ñc˜…{ŸÎÒM÷nú¬ùT*òNÅìÚ+Ö 6t%"ìž™n(«5±‹¨Ç’®<r©á7B­„9ôy.q¼6Y3y™ðf¾¯ TI¸ù!½öÝÖ]éÄŽÂì«t’\èB8‚å®c6ñ æÝç@4’lyí¸ùZRI¿–€kȱyla<Þ«šÏñ™ÍŒS ÷r8$÷nÎ#î7}”’Ù¤óÁspZD¾ÁŠ<}ê5^-²)0Ba«ÿ2&Fù±ytžLÏt“ÊVUÓ¨(U˜÷Æÿ3å¤}'FíQãCª˜ÿ::Rá¯×U×àðšó;õkg!dâÊêˆ-Q ÄÝÂ/FØp™íÿM@ãIžD…ì$Uì%Q˜¨ ”ÅP²Æ  þ›Óa󆃛Çߣ#Ê„8Í@øi‚ûGc}jp(èâyãÝ=í>:ÏñÆê(¼9ÂŇêß1y ȾöJŸÃš¯&g>¬Ð£œòû}ÛDgý¾ºAF:þKŒðÿ>iù7~ïçÎú¿öðü@êJ;B˜ýÈ9†’˜Zežq¡Þò4ísþƒn;_ßiÜçgxüÖÆó4~´2¢Í–[YÅ©þ·0ŒÁzÔöæÿ è1]RZ clø»@§úCý×qXä›?V[åãh|è§Ãýi/À\à7Cž1©ùrT@nªeD9ÊJŽûmºtËòîTuŽüC]×û¾§— Cº5’³Î'ðÆå›6÷½·¬PteÚäo¾{}¡êî÷mi« Ǭbélãô·O%]U7óÖVÎÅg£û¶ ?‡AP5«øbÏ7=¶Gjø³¡LUT)øöЩ®YÁçü~ÅB}8òy@‚ûÇr±Ô­¤*à+~1Rø)4«°ª 6á×¼ÕöÒ+‰"u@îÛbзÖµ‚ ®ÐtÓéZ¡]êw°¾Ë]—ÝO™¾¾‹óÞ¦¡Õª‰KVÆê’vaÁpß&ÜŽbΊÇ@eh+vK m" Ü »qqU!4D:'a„Š.´eÏÉÅrå¼)pÅ`)öµXNí5Öo{䄌çX›.¹…6Š˜~|\x]jQaÌ×’OûzÛ¿T¼“à qkømeŒ ÉŸïûÓœäǵrBèNÅZ=n<;rÅÄÃÿZKqeRç´Š¼c õR~Ò|£ Â.7£ú˜uÜz…mpÄN7ŸG"XäoV–RÄx߾ %‹0£[ÁÐÔ°ÜÝhQ \+d6^ ¨˜‚ÛÝð,6Ç®³sŵ–’Ô´5™K° kÁ©·¿xÁߡ륢+VÛfÕëna]ÙTá-j‚ª4 ÿ O&ÝM ‚+H. ßnlRŒŠãä,–ŒUÙ~Þf1–|ïjºóuÉ}¡®èÚ±½ÝØ*.ktݳ1ù¡ó[Âûöû6(®u‰"®–dB¨¼Öz]/€÷[MÂȨ˅[Y,U =³ŠtW½(RQJ”ÑønsÆøù¿vgzÍ1XËîˆ\·-Iƒ,@u!¿V¾¾°âXÝv»S•¯Œòi‡­;!õô%ÍE J*Hªèæ(^#iŽ5¡@5ç ÈÚ€xàBQó•TWÜ'+‘ßàášë,-u¿T!¶wÑÈÌ@O¾å¦TD®j–˜Ãx°•Ä™¾THÜÍáe†˜™\.1)/—à¦gÍÌX3a—<”z©X¢¢‚Z‡©Ò]XØ5«â¶q¾ÇIyg‡®k}ÈÇmïx¸íÜn#Š+‘û6¿MuEåÅ pN7ÿnLªæ’øpe×÷(¦.¿ajñUz‹”¢{^2Z°Ù‹‰W®TÚ´Ä·øIöÂ0{P\e74Ñ*R  R·T…-ƯTT8}óTð°EʬUǼ>«bš2k£%›¾‘vÍÏÙ}.L. RC>ÊïÁ–0óãPç’)YŠºŠ¸”­ÑB2mÃãµ\–Ç,¼Í±d¶¼T±î\Ùý¬àèånnXÄu yímïlN òÐm~y>›tn»ëB÷¹°æjeUG÷û¡{­³‰;æÆÑø»·Yœ~ø*º­,­£“ºõ¦*•V´6}¸ pOìr— ØxñŠ-D¶åß ^•ʨ³z“óÊÔ'–~MšÓXa9®K׊U ËRÂj@©|lÐQ½c»«´à`Îä è·<Ø÷S·â|:1–aýûÉÏ*ü|žæR>»°·I&õ§Ü¤)@œZµ7ÿ³;¯bé´Rk÷‡ìÛ§ÍçY<ŠáÖrO2]Êx²ÈCC–}pj³ãís<±k¹ÈGNÿíÇN«˜—4ŸƒìQ€»Oä$ºnqS÷ª ï®ÉïûP¦˜G0Wf_QÔ³Œ‡œûÇı9ýÛê?v'AajDÑ=³¥IÙSNúä‹63Kštµ69Ú¸~rt¡ôyÅ·)vIãÐ…7lÇÓûÎ9R;P0›ßÔ0AœêWVILÖð¶¤+HŒ>l:ÕT”Õ½:Ro÷W6Zå[Ô]Vu'ϲc_øŽ^ÜÉÐÜ»“xˆÔ”sÎçÜwù9D«Î¥—ähÜr+êÄïÞ{L²Ò³b[žHý•ä›PØë°“@ü­^ß/îäÇŒñKÑîw5'ß{ô!?ìòøé*`œ›óÊËü_”ø¯ô®ÿ•ÈÂÿOüŽ×ÿ‡_¬¬â[Ï?«áÛè°AC°Rœ~†ö?%¾ñ˜ûn(mKüçžae3n\xþŘ.èvÉé›8°?gYÊh¹Êv·…¹m«é l`¾Z‹³ @/‘À‚@ÿ'ÚB‡?¹ýœ¯†\ž0Æïûz½®@^è?’³ñ“EºÁºÚ!°/¹CÌÍÚÐXtõ; kGp.•Ùh—ÓsÉíâ1“+¸¾mDpÕµÎÊ<'¾½b: "~­eb‘x™C»Ûs{nNGr<ÜóXº3A):4Zp1\¤] ãR{‡^fÇ×R¡|šÅBnxš°7Û˜4v‘[üC6œUèþvs®kAcOšŽ¬¦^v·xh‰*TÁ•MÈ\xYzßIe’µWA©9i²fDämrF_®·ðv»®×ú¸‘³0UëÂUÛ͸Я¨ù»ôM»Dòiæ·éëõ¡KAq÷÷=bœþB¸€»"£qPT‹¿ðñºœ¼ð› +$2.ð–Ï÷ýZï×/+Î{dgºg$¶íæNr]K¢#@äÒ¾N³Â"iY¡üz»™ªëÊ'½y¢·T=£ÔªÙU"üX dÈò¯+LË¢ªkÑnÐÜÌkÚT–i•è±tÅ_[!Àº° oî¼á„~E=kTäÆÈÒ(+¯V^ª÷½a£™f§ÜFgÂÊ„r»½-a¶²tACñz{¢Øó §”KQ v9Î[ý‚Bp›ß·_k °@£©Ó±\r»¡ÃE@×Bã–xè¤ B¸%'‰*t£»™em<~Ñ+,G"Œ¹¯©¾kÕˆ=:¹š¸ö3óqA×¥ sn¯Dó¨d¶ Þ·'{Ïã7=ɨü·Œ·Ìnb‡ÈBjë”ÒKTbÎÛƒ•O©jV»ímæŽqêðéFâÆéÎÛ}º¬–;¡EB‘· hm “®(kT§C±„t¿Ií” ÜJœõ”ì4ôz\žRYˆøK/à…‚ä(_ ½™×ñhI$Ftè@ÑÏ…ðRÙ†p¯ùŠláp ¢"$yYê@ï,;ªåv¿ÂíMVk,‹œ÷`Ç$JÞÁ+Öºý+EœXkV©îÀƒŒWñ ÁUÃp.Ì‹Î%_½æq§Ýž9p¼ ´ñø‹I ÌUŒ1W“¢•éœ<òšog0úšöªárýc’|^€ûruß Ï¢]ìXMʼüÕ´Ãñ¾Å·B-ƒêwö‚ùñ>jðÍ—ÆŸÐX¤þÿ­JgÿᎾˆÿ& €Ÿx•à» ?ž;ãVF ‘Z÷Ðiÿß±Éñ…5ŸÚý™;Y•aèoÚ„ŸÔx{*ªÕ10ÍØª'§FŸ»‹úºKbÏŸ  ƒ¯Ý•[áÄèá´Çô â.þÅ”×OtÆZýÇÆ`O8äùuúÅùeZƒ§îÎä½’JìÞìPÓ[-S0RCÜO¤ÇžY9ÀIe½çñbÝÛÝü˜1QèU/7Aa1-9x­îFC‘X[ÓÞÍ<²A³ejʆ"íwà QÇÌt´ûa»þ¾*fË©{ÜúÒJ>4|‚žm‡–§b IëuQÅQDÜAˆâî]5â2¹—5»Y0"U ƒ¡Þ¢v 4ì€Û•:.ÈŽ‘öÂ$=‚æ‘çQa[’"°OÞ‰PÍæ¿PXö‡T]54‚Š:ãþJúhÄŒftçRº•ŸP!ëZö&"•ƒ…Ø—¨ ®K–¬%wDJí~‹Ø>Œ—b­´¿÷.).˜óEŠ5 ZdE€ìjÁàbüz›‹ü‡§Ó&\°ìrç*6"Ö­·»æõ¿¥ú/%àâѤ ….à3Éî&×u¥óÎÝI…/]€b]‹ª{æ¤!kÜíˆkAœ/— ¶¼oûõóý¼>ठ®Ä[ q!ålóé%·Ó•Àjzýà–­¦,Y 75ó_ï·¾×/o_Q?öÚ,_ C¨)ü¼})5ÛV/YPÕˆÿ(¼£"bæn+£Å6_T„F[!é§s;ѺŸî$_j®b$Ín¬š(rA°TÌ+#Q]Ò(~7î’Vp)³O°õš0‡+L©Q ‰ØH&ÖæQDÌ’îW^H7á#5ãt¬(˜XšjÝ\Þg@-ÚVœ—€ùŠÚÞn.]“Ú&lÌÍ›êν¨i©yÖÄé FÚ}ÿz›»ý—×G\£ænäµ–êî:œ¨Þ€,$÷ ÅÊ—®×¥滺4s"ž7h•c²{Œ p©†1ßöæ.ˆ7ZfA\ÁªSqßò^uüZŒX4 ¿î÷íp-¡D&Bî›Á[ã /•æ"ÄÂÎÜ÷ 8Cêk]×%âæºß¹ü@»r+[ ºV¹h J„\‚7²Þ×¥HÿDä(,gEÝŠéT†‹k}xUQÅ‚Š*Ç‹½Éa5Êuîî¾´» ½ýÓ1¸ Ñž’Ú#êZµ®‡L;-'pèʺi ]³2ŽR÷îÍ@_[û[åI»íÓî÷ûŽþ!LF8Trò|DWdŠªkeÛ½£ ˜ª–f6…‹Dæ¡–¬]©K6§&…“œ1?DEÉîÇà„Dk£³Å2Ú˜(¸êpR‹ž 7M÷t£¤±Å& ¶Ó^ ˆ Ÿ×Z|ð–oú° z‰ÞBoﮌ\²ºpÔÝ€mèõ¨P–TöÙæR–m²È)({sœËOhˆä¡µýe0&éòy=4kÄ!°.¥-‚É]ê–ÊÓ‹¨õD×R+‹qV 6¡+Ë?J‹­˜‹•QÙŒ  , ¯ÑÌoïÓ+™/Úç$ž†²u÷ôÄ9.8 #%B.µ|èÛÐKúª”h<Ú4®Ó–È9v ¹{»Iíâ%ݯÝL¡&»îñöèK,•¥uBüF4ƃvS !Å/ÍÎ0ò….åA”ÎDuƒ²c/Ã)EìYM*ž¬–„L­¾îŸ}*<ó«?è9!¢²I=ÈAÊ÷s ÃÙ©ÂÎ4é˜Yù.ÛÝý¹u’]£k‹#`]í6FmM/§õña ›«™=ãÁ÷mÇÜÇÖˆ»Ì¹àPÓ¢.;Ï»gU™Ì".M¢qÌÐëûpÖrt=øÙÐJî‘ÝÜçÍÜ%s×…üEup6;D€™-xf@7jŽ'lá¼´Ò¡èÏÿØ1¾~†S«Î).2·´Ó–å'µ§SÛqŽüi}éU>þE òÅs¼6>B벯 ¨ŸÂfôˆ®|“Æ4’Å® ö™ìN(bt†ø+÷c\»Í§3dÒ7ÑŽ±ÍÀ&4.ÇNõÇeï ~…äË7©`¶ÂóP9»I:yút">’ÂY!ÑoÏ##îUGyõcЮotÍŸpŒTšÔ-þ¡¯Z÷Zùé¢ÿîÿàO<¨ðWþþ?/ðwù?¢üER¿“â1À9ØNø FFª³y|pË´_Ç#®ƒAÕi’OÙ½z<á î¿­=)À™Œ :Rm³µØ“5´«ß6­fدÓþj„¬Á5:¨Ae£ãŽì=R4¾üಗÍñ*Q­‹NaøÛîß“¤t„ ~ç®ECÉj4éÉ"“Û¬Ïß-3CûΗ˜3ž —ÊÂ@wºgYU¹ð£&NTj?™ 5—ÑŒæžn¹®VåNkèa1œ›*$ìX?˜hUßlç Bk.‹}ü®™­u)t—Ó–O-F vÛ6V øþK—3ïŸlP%³P&ŒÄÃð» )ThÄ#Œ;=PéüØcê“¶Ï<ªGˆWhî÷mKùzi¨ÿ!y8wùVò¥U-ÀÒ©ªU‹TxF‘“ç¶¥® T–Ó|Ú‘}˜ _ªhHÑ;a!—.ˤNG{4P'Ÿ•ÉœjÄåÑ*Ñz]~¿y;~¡RLÔk1U˜ tˆšˆÜî®X\xŽKiIáìúH2=pôt¿kÉs»}¬+ý\éX—ð¯sK·X–îNƮĊ啂¥j+…`õm˜ f-ˆbq™QDpáµôvê; •Qð]€wº‹hõ™DØ'ìÐ*æ]7ÚÛn3yÛ'„&£p †kKXÔ¿„r»Pœ® ¸@Šzô~ A\ÀÝ`Œ½˜ôÛ쟼ýåý®…¸îÛŒ§D]0¢ëRèBvÒ†,É ö/ ß’º9DÈå<ø¢KU/…@¬ÜdîF¾ÝÄ”fµ1DÔ€Oă« ë½Ù<’Uk-/ç¹uín>E×+÷)+i$nÉÂòh XÉZ]†.TéÎìÀ¶hrÎbêªÜÁ$-•kb”âX7èfæ\a…/2®æÀÞr‰šD˜§Š-ªêÂ…äþë l”™EiªðiŸ·ÿç¯w¶I¾eâ–9:ÀPâ”ÅÏca U@¢úºbré8çä?L¥Ž¯Ç³-Ìšñð¥’A¼©=IM>L<^@q½¯ŽRdêË…‹Œ²ô(Xª÷j¸†*- ²Aà ªê‚á}©*Ô¤)Õ¢*–î±J#zCRéî´ÜJe\M'¤ ¸°nEÕ¸dE×]KëC!ä›NÏ~ùlá‰Ý÷*ÎÝ^7¾Fô%êÂ%:}<³M¨N,ˆÓÜ€¨M¢ùYŒ¶D¸EòÝq¾¿I±**E7ýöaŠ_+ÐWýo„Þf™{Z4ÈÑEð4v]=¨vÀ+[K »ý'\’±Ór{ÆBäÞàq˲N ©ñœCÞ—y³›ËcÚ©Œ×k‘±´ä_)…˜5±Á~¹í¾úO¢/Hõ§¨í2$9˜¨jQ–c¯ ½M³íbé0µ :âÔ:O½fŽ(—o:!÷¼grxcA2èñžcÐ],Ø^t´ò½méíB0²œ>£³r˜3EÄSŽJ§D¥$g¿¦W¥*F_çÉ·[{;xÈ\ÌÒ»’|˜šåQ1ÐÝ»í°œÂbîÒÏ(έµÑ±FLÒ wák­²¨²gtØþæPdûJØÎçZDò¤³•iÀ¾@·÷`2ç›¨Ì 5„¨›¾[< àæÀ¤v™ÕéRÁ'5Œ… ’¨^º¡’ÒØiŒ¥øÀÊR«SýŒØŽt/mòNÕÄ÷` @·pì*LȽ¹L <¦—œé(-,ïÑ.Š^k`TZÉž¬H¾¼!°Ÿ üÏ!9wõ|eb)G@&wÉ’Å÷57JöNµ9sÊx¹'ªÈÌàã%²ßHñ±F0N$.Ï;ü{³² snVMÒœF+/º/fÍ7Û¥#‡ëYxŒŠK…¦k2ÖIÃ1{zk‚X;—ýô}/{ÿ$òbמ)ôë6ŸÝÞ(Én5ë Ô1O`åtÐO¼”°ÆçóªFŠ|VD¦zž ÆLÁìv–c<(ƒÂ*ÀÌY•=švyòM†ÿä“Ôf ˜Á™»ò.šó8œóö­‡kÇ…:(#^A˜z!×áߎ¿ÓX“w\­¶SØh~àXQUSö›-qÜý`µ±nâó¨nÈÚwši§ÇŽÎí“«ÒíÈGטÛ`w¸` x°FèAöáØÎQ~=äÏÜc?.8ûšoZð¿J†ÔÏ{ IDATýÿy8’<”^þû?ìß.€ñí•ûMVè(â˜ Ë ú(¾ä¤°»>ö[V÷(TtWÆû…ã‹ö ¤ù¢"ÑUù«r‚|Ø«ø±¼Î!ozâ6†¿Œÿ2¾ì般¶hªû- ÀìÍFþ?ë¶jÝöÿ´JJŒXõäæ=Ê„ñå©Ò Š=rxøÄå˜@¿¹IE®£}ª—å_L×½ªº™ó6[¬½ªÐ½:R‹–ˆ» ì›KÍÍ» ˜C)E{­5ú˜8b×ò×”x‰Gëp’¦Q­U:“΋êYu·ÐÉÍŽ1»b©ê-ö}Ì‹l“8¿«poºâø*è¹o×ÄåÃôYÌÛ¨—¤zmå¶]½ Ô•ò,mGBÞfôp[¯±>ˆ€K× +¤O/ÒŠ› ¨tÚ‰%<ƒÏÕ”ê¿ÓÝZ…ª,U¡‡˜W h_ªk©ÜŒm5ºî0.wË5¦ŸÇ™Ô¾Î!t¬)w»4šh]àpAP³ýX`mÜŠuÉ+¬™ ®»^¢E¶æzŽtŠûzñ&ŠÒÈ«jm%UÂÜÁ;W&‹!.¾¸<ì¼´› ‘+½¯pÍ9Ø,YŽ÷íVènâʇε`†µVTk¾„ÄýÒðu2EÜå¶ÃQÑ kL˜òRøí÷mnîbŸ—íD–êŠZ`†úßþ=Â2ùáÔ@áô·ãCWzRuaœâ·¿|ß¿Bþñëû—×ÇÒ ö{2vEnqšß’zt6ˆçNè4nj½ sîx)ÞUÖh~ ä@mƒ‰¹Y®Ü\_1·[mß7?.¨Â$!'*º.ì™B .ÁZ (ô›¥µ¹kéZªé°á¨¿‹–IÈjÓNÒ%rÁ«òÂâíeŠ¥šÈ¢pŒáþ[šDõòò)ƒ‚^µÍqÜŒÏîœýOlë&NneDrL'îȹ­ eÕ $•M » 1ccêÆû¾A'ˆl"vÆØt·©&ƒZÀÓ]ë©.YY œåùþ‘œE @/À*ÙdÝ Oφóýt»ý¶}Q³°ØÐÅû.*ÄZám9Óõq%·'ÉëšFBñÀÔep¹Ã€éºR{6&/±gBk¥XZ;2–”,ð€í¾œ·ûKF£ Š_®uAÌyoÚ‚\Kb2¥øÙænBÅÔGc p%Ö¯Ý&\i§XLë}ÚFAÒðé·?E® #Þ]>ñ\¨rA½pw ’¡¥ —ƒ°Øº[u{Jñ›´T+¾¥ÐŠ]iÑmÍ0Ÿ·»™å´u<ÚµB Ù§-1&PÒÅy'$g»+FºÓcI«•óvIt]lÊÖFÑUYª Ž˜¿FsLV: (3Ü„„’þJyƒ«—¯vÔŒ@;Û«Müî–ךW“¡ ÐiÒë¶Æ\.—f—}8íƒDûhK@BŸ”'ßk¡u rlXB6÷ 5 ’ªýe©üøÞºm}W/õ™½˜óÎÞH›½+`Û¼]DÁù®<¦ÜZU<Ù0˨º1v8IŠn+gJþ¹Óe7@ºJvQiu°F--•g r³s|µ‡‰=`e~6 {a;èÍ­éÌhŸ–§¶-¼ú$rŽ&E«?Uj3¡¥(²‘EÙ“j\’ãØëá8Vc3¡9 *±r¶¹£տʦw#[Ì)²xCv[ÆÔ£Úv¦»š!ŸõÜÌuNøyÈÊ@Þ"h$×F’1ÀÚ$¥ljiÙ ‘A^"ŸE}&îÞ€p¥Xœ‚,¶N{PuÈqÛ54>v.ÐL9l¼UÒÝž:ÄzA’n_¨BÊ¿T*…ûÇçÓèÕÍ­T³ÛqOm"ØFæCû»ªY7›õ/=´›vûÿðû>½ß–v8Ê}¿û¤Ð1Åò~*Îi´ý~íIÍ'>7Øì”39êF1m»W¤;Ur= >Sn¥†Ge¿¥²zå‡ Ö2)~=|oªjÇäÁÏaBî_ò…û­œÜ-èúúÅ £U?ò¬á­QÀ„õŒLBÆÔ&Yº^]¢€§ |œ…µŠûjÐ3*Ô±¢þ+¨lìgD¾~ý›ˆ@¹‘8‰]hêØNÜL¥žõSÄÙ>ñÄÉãïÑ-ñ(ÛþéYÀãÏp¾oþ¨<ü „¿‡ÒŒŸüCßp~ê„ýóF%ü®çüï ÀOÒŸ¹oÆn6ëâkÇc¼Ö%dÒZó4Âg¹Øð†Ò”wy|bŽöúÀEÖ¶ós*íû¢ I#¹¨Ø”žÃéjë/¨gŽb€~Š•Ò+¿ÚZn¹½†˜Gºpo”pÜÔÃÔÕL.¾ó|{ªñeíÑÈÀ\Ûâ±®ùxæ¦ì ~~"qîî\ª“óãfUç«@…ÜI@×ÒYœQ î2!fL~–/Yâô©õ½È£Sëñ‚ ¸›ñº†ž>„ò®!ÚKÇA£ ©Ìüº‚Ô9„4þÅ'Ñ=Ðß_KûF¼ý[…Jeû1³[:…pëöpvÄž€{¨´)©Koè]æ rÔYpBüÈ.ÿ¹Ý_-ÖæŠasb¥‰þB7s育še[Ô×Íõn;i{n»8ªhhƒ²³Ù¹rni¤À"–Ç\¢ )>^ZÑŸ½ݱˆ|‹ŠûÊ ùb”J>åSÁtÊ sN:{( æz~.-Æ»GSwÃÛ©iÌý–—‡BswØð@™È©5Ù«r†ä;2 Ê(+éáMÇf&丢»ß.hð–š„=m}éoV$/,EÍäÔü¶MŽïLqY»çÏÀa¼ž³€žä²YN²ó×ÝiÝ<ªîB‘]½> Çýžcíb 4ð!HLOÔ^^ô^xÈ Ápª‘dìôœ_…«§×qɱêÜçüfVá|§þa#êtoÙcŠïæ>X)€³;:23ŸÙ¨5hÝCöÅ Ÿ}ÎIù¦³Šu„þ°qŒ¼#Ü@òà|qoïÒûh AAÀ‡65N>Oô º‚U€ˆTsV´{«÷Æz¦ü0zs÷!Õî"@çqÌ÷|gÁ†ëâ8ùؤ…Í,ŒÏž]÷=îMÌù¤¬}Ä¥Qæz5÷ëÓ~±™ Üçè9âzr†üøÝAQÃŽ#Íšåo5ûïe.à]_Nýóú‹Ò*þ°˜ú'Œöÿótÿ¯Àÿgëß/ðý›‚?ò;•…Aº‘ƒªÞ„_ší¿ùoA´LNó>Ÿ|•ÝÜŸ*“Í5J3ç5v³»«Éëg¢Oe,Ë Ö<«#<Ù¼)Û,å^À¶WÃÈPÙH2ôL÷zê‰ÉG°YOQ¨Ò:(¡;5%]_.f\gá_–U¸½·¿¹~aúšsåt{¦ƒ)üÌ­”¶ç)š>Í>ÝõV.UM-W`)Gââ~»\ ÅŠ]ž‰.ÂC„آܠi@Dø6B¹âA¸Tw{1b<—.) ×¼o‘—¸!)mÙÓ> /àé;B:ärúÛãgéJU· |Á„~o‡ÞK‘Uz‚+r>º KÅœ.Ž7Ö+}ZNª˜H4oë¥úz©½ùù~ÿç{}¼^Aº…WU²^}¡jÆ.¾nøKÕs|ÅÙÎ_^—.||¨;]¢Ú£ä(i bFY<\¯#wS€ñ‹óɃ¿‰UºëÈ«ˆ.UÞí ¿ˆ‰\+jqóvˆ«K/\Àµ°–ˆ »­ ~â¨JÎx^˜býJÿu|NŠ®¾;19á’á–˜uÂJ.ݵ8}#,Õ+Ò *^ *€3ÞÅò ŠD9 ÄPm*qÖ@:/¼þããz]ט¯C/…êâ½(Q¡JÊKvëÈÀ4N}›^îBnå‰åÃø‚╬••šÆŽLéDzT@åò¾ÍH˜ç$SqÉŠÈNxiU5: j†“Ÿv½Ö%ONŠè‚:<¼Ü»©H/ÑÐ0˜&t‡®zeH¾ÒÊ!!qÍ=¢e¥MíÚ¼ûâ÷‹<_2QÁ/·3CõDX•¹½Ó[ðŒ‡«ß×Q›š*NÈ 9Þ©És×Á­înwÛÛl_ö1ãË¡záoÈ<ÛúL®fÿf†óúõ2ñ²Šì¼)ÔR¶¥0&‘ù¢\ÝÊžª¯PsXÝM¦.¾D£j÷Ò+j]˜]§ÉÑ63'uÇšŠ¥¨;Ñ™’¨h«¬šâœ|£ìèUTo~Eœ•dp‡Z&‰¹Ù5ÒÕY˜¥Â’uŒ©Jo çaõÛt ˜¢&£36¸µtlÓ£ÌöD¶–çŽ`å—Q·È‰™d#'ÔðÜ¥Rƒ)Š*O{_7Ñîl+Ú0à á'ÎùÖfÔ [‡‰ìÁ{ÙžÙb9KMv8µ­Zpåq,ftÄZª°4ØÌ€@ÝMÙ×ãŠw™3‘8œòuŽÃN(Búâ>ï=ˆïVGÏZñzÎæ.¥VÇh„‰nŠ;ÛÅ!ÊXc‹¾RÝ¿SÁKŒÍ0¬CÒ]Ó_Ýw͸Nh$ W±;¾p¡p/]Å÷•gÒŠ !hžRhtòHÖ×"gHèöâj‘Ê~u0·¯'Fþˆ2‡äÙ»ÂíNÑ•òF÷ƒö¾kÌäp±h»:a¯ÿ¶29{9†žø •VâYnáT~Gngëë­s²[~EÔ|˾uj6–'ÊEtMÄÊ!ÑÆ¯™XÜEíÙë–éd'ÔëTú¸Ì€2m`k=lÐÜsUB%Ë(&îqŸ¸œÉ=ßC÷-q7Kè4äe6üI2~Â1ZÖûp´!2rñÙ¶·›Qø•öRýÖ8 Y§¨0¦Z!4»®™<ô#™½B9eØÚÐfBí„ìä­ì g_p~ðxÞ9Ô}5ìˆmßw…½j+\˜^:¹×.½æìñˆáŽœ®ÄJøDuÏxu€=ïMy˃™WØ‚;f*2{þbí71ØU 0/eÊ1ºÚ i»Úœ»ãIõàÈÜOrü?Pï7ŸŽ»§æt®<¾^ƒ£¸zfA¿K‰àw=Ï?+ãwÅë'ë/˳ÿƒÕÿ¿0Á¿`š"_ÇøÿËg?YÄü»¯›ÉéÁ7úýU0^M<Ši§M¾Íôa÷¨}Ÿ­gÊî¨öݾ¹eÄ\¾#ܺ†Ç’ ‰û³)½†[…O}D÷;p@¥At¤¡s6ñƒ¿Ì!÷,è9>̬k/(;mÀ/îþ&á»õG]ðÑ$¿Ç*xžŒã. äÃ&ðt°®é 9^¢!™‡d㤘…šÕæýx¯™ÙåWYìÛrz:¦•YŽ)ã#±†Ýœ*—mâ‰æU¡Y6|×_v›ÀCOIºü%äîS3ww×J©<>ù®Ià,È›Ót]¸Q9F=«¯âÔÞZ©øðì“ôêüKÀBÉ.lgX{ýá½Èx#°–¶=¥Iy”l4æØÃ+(ñoÂ>$åYåNìŒ-¼®gÁB¤ âÇ\s]{«_£øVÉõH!,O3¯ªf­XjÕ|¾/¬wN>†B:•Õ*ˆÎkYaA>r6Wù¡ ¨©ñ«Kž‡…‹òyÒ:bPáé× H kDÞÆ QQ qe¿´õK4íFÂEÔ—¿$´íDœþéöq—-F¤¤P® týXHºÉ¸\ÒÛ"î7]¢>×í.Z­–Ç:°Z7CE4¹+ª/"„çˆä ábntߎåAówv ‚¥¯õ²ûýŸŸÿxÿC×/ׯ¯ëeÎû6¹¸b¶•ìÐlß4ÊX²¿ 7 Bñu-…ªÁ™PRè&•Ó» bxAäZ.ÆÏ·’f·ªç–À?_X1î }׊tH Ški(à9Ösq¢Þµ X1>UÅ ëãu]+tK}¬«ã\A$¢ A^U|µzÜëJÚ± ãÆÇ pyìÓÀµª¤bÀÖR³j²NA[²RÒWUd‡‹ÂÃÿ®ÙR¹²¹—tóû¾ßfá¸ß%«k­WårJ]PÕs=îT1YëRÕ‹ K„&ÈŠZšòÒ]9ˆ(RS"jjIº‹šGL,´{ Ëß#\–ɇTð£ÍþFÒ zFïJ Ï6 ÅÂê ¼Å_«³q‰XaYŽ èôLq1 6„ÂÛ¦ ”Îï]¾RFÈ+K]¿r9Ë1\úˆö’+Þ‘|ifR+÷°ÁiuÂW¢¯«Ú3ñ¸¥òµ?Q‚AbЮã“LyD%Ï]‚ —®xíe>ÌyÚKµdj .³Óõez/ìÆ:; ¡'Œ M´î )ÿTYXšc ¸UInóÔ„êNÀ„bв ªEi÷Z²àâ"X€ÝiªÓt¨K°J·ã&OÏxKŽ•Ñ´¤ò¨€Wœ Z+/›RuÉFÓÔãâýÙ¶`ìõYXHƒÀM$W‰5Zh¸žGIò•Ûk`©¦ß1téém'0'4Hq{.‡mQdó [P(w[zX…­Ï¬‘öHÈDÓ”"¸ø°‰ø¤ÙÕù‹ÑÙ,…SÉØÞ|gJì:áÝÕ ãÚMé'ŠiC=t ªû–ó-ìU}\²L,Êœ—ífZÇq¢B{Ö·¡,°NtªH.…-»ðè2ªëe@¡ z ÍQ[)Þ9 `‰r‡‚{—¹“¸oÿ™Rø“À_ÕâÿÈŽMBϺ뿑Éÿ*NÒOÓêOßÕ&êóÛ|[ cHÛÃIè±®ù¦R±çã4±ù:»î'ì^¹BgOt·Ä*k˜:I|ÿ·¦_qÐ?h–“‚…¦ü³Ú0b8—¨¹øÙ<½Î#“jM8GýÙš¦t|µ1çÌkòü1‚~åýìÓ²!…w1‰XxwÊ+ ÙŠ+ܽW5k©±9—Tì#Ÿöú~ªaq¥»/Õpdœ÷ãJïÂa(Tu .”TèP6Ü\ q·Ýг¾³N^Cxš„d0êv‹›¯<¨Ú¬y€nÐQUßn­Ž2¯ÌC!tWS¸9'\‹÷ö†2þj޼š“/F‹ðô)DZ¯hPˆ¨·g¸Ã”)§p# w"åÀÞÂÛè’§Ïݹ´ÿ1úrÎÒ¨X\²|%^Y²Ì Ê ˜E®çÖì8@q‡7Lu£¿Â–ï¹³h.­š$: %±¤õ;Í›÷mr)ànÔ¼ 1Ò±Þ1‘5ìkPUb nº‹é|ÝhôbKÓ‚´4˜*B•Û¹8m,uª¡M<#ïP¸œªx]«cŸŸ·|àc­î¥ á쥢(B’ó“’_†\܉77E…Fs.…^1ÑPgÒB>-FI×V×ðÊsâZBQÜNêVÎèJU¸CE?®õëÒ_ï÷?þñŸ¿ürêA qY‹®Ì ÁgâIñæ|Çñ7¡¸IÄ£d>ªÝóŽ¥ ÊK¯è½5‰¢¾é+Jù~\ r]â\ŸÎª]F‹D½7+’JÌ ¹ ·3qFQ£.õ*6u’ftýv=Å…I?¯ 5çÊÁÅ©Çt •Q­ 1k0J¨™úZQn½-f‘1Zù2®à “,׃¯ëŠáZºQ"otί îî׊œÜMféZMÂv¾—o8)¤ª¼°d¹Ñé0Ò]-NYº; #ù¤(\î@.˜_êÆn+—7õeØH]Y ïnŸæªrô¯ôìt0¤â'Úd§«—Æ–:*qu¡ôá¿s¿ɇlÔ¦.ÕýDP`Ôæð5_“ÊIÉm«¦Æ›ÎµNèŠÄX¶—æÕ;JE/'áS#%oO"VøèÝé(U+¾¢ ò½î%D#Gr­Ie‹@,ÆÔ’•'q¡¸QWt]xTyrã <£Ûæû‹¤mEjRBCÍÅðí¬A²üvÚƒuÓ¤•á0$ý#*X5w¯Ãƒ¯Ÿfb?Ä/%d3ÆÍ5Ì»²O€ƒ\ÕO:VnŠZTí³˜\ìõ8¼ªÀ¶S¶ÌõÅq¨GmfÈÈ‘0ãÑ”Yú¸×ŠÒ?û~=þ†i7¡ìË(ç… ÍvñݢƮ¦”‚âOwWÜu¢ZìíÆŸ4œÏðp¡%ÊUP©|leO0:ñäJB^-…æYm}7HcˆSØ ÑXüS6eHzÝóüþ%{¡˜ãUAývã17ä† FÕæ.¢¬`h@Å„êÿ8Ú¬»It€±‘ß'ê5ŠQ0Óì\öÜLš—Îdƒ`w—ç>8ª”zÿèÙ¹ƒ æŠgÖƒ5 '#ds>_ʶ‰8oÕ²óÚ«]û’Ī­¿È©ö_Âô#Ǧ³„Ì/ÍŠ†1³€ƒdÔpbg%ºÚ»*\ñ¥t¸8Ç®m*=`àˆÛ89FìêÑ,DõÆ8=žî³Ð¸¿mŽ6(¶ŒÒ òA‹G&ç)™êÿoº7ÃŒ©˜ï»Eëá<—^ÒMOÏÉñ0ȈwÔ·Ef=@d¶ÓmW©ÖlW©w"fïN3aÿÕÛ– ù û×û‚9é@gÚå[(E/ø…"œ3õªž ‰k.Ÿ6ÈmÇ ºà¤˜q_»x!À‡‰ÍÎçq w'±ßHê9 ZΈžp”@ov¾ª¾ª„º“2|ŽQ¤T“ IDAT¾ñ8SÄþÉå‡×üâÞ?a=çýŽƒà÷S'þ€Búã¿OÁQ¦ñÏìñÍQùŸ¦þÿ!?ú¿Úûÿ÷ùç¯4N×óy%¾;7ò­Ìw¼®MÖ*çòçо1êþr½v¬'ŸF h5UÅ“V 25= §ÖHôDŠ2ú¥/¥5|í(·Î?–¶ÎlútÉ*„ÈTˆ¤^ŠÍb|éØc†öà€û× Z¾«ÑØê¿ˆŒÙÉ704lï=ŽÀè=\!Ÿ¾ö>šî8 +û¯Wº×Z"9óUÿ=Ù?SxI(ÝU`™O«ô:“,{éã(¸øÑ³Ã•NF³Ðµ©hD¾(ävîÞáY@Ì‘îM¥À9m!!GÅLBÊ]ÓI¿¸‡ÜÒ‹xtÅUÇàäpWU~’í"÷¦pÖö4ÿ¥áeXº¨Œ Wµ"g”¶‘{ù”Ã;z&ìx¢“™‡¸¼£~qvŠŸx…æM,QQ‡Õ'Ô¥‘0Úò’>B@öÈlÓgºUÌ‚~jM‚²a²DÞiÜ›{¼ ÜchÈpäߤÈÇ¥Xo±|\*Þá ¢y‹Ûí¤¿!W0˪ â4’TúR¸Ó —ñ-4ó³ /oW£Ó¹ˆKV<úT ÔИ.È›P•U‡››øåz§˜Ê›.âø”×¤3<{êM!¼3óŽ–@Œîô›T§öWõ˜š5¥¾¹%ß7½ .U Ä‹¸Çr;` *‹Ú=Syµ¯ñ^¹.Pôãz}~F°ÿ²î~šÅ9]ÚöØz–:*V’ZL§ô?ïŸz]à^•k=„õ²Èâ.,)ò¹e…Ü@Rœ1‰Ÿe©èŠO’•¨}ó6¬K÷XuÇÈÐí#$ý6Bu €5 PUV½ í6r½T¦a–¬²Å,k£×Xp˜‚fxli #TÎn1ÚE@p·ΖowwΪ“ÌÇd]¤.ýpò¾Í!ß ]tmNŒU6ƒ] /Ré¢_ïÛM_Wž f „·¹ù]Þê… JÕ#åÎ÷„{êS1‚Å´ù*êf±5S]EûóhE„QâÍæÕf¢qHÆR<ʃ @ÖZª1€ÍËÿRòãbåY¢wcÂJº²l@Y€5褈è¿Å)Y  ª»õ=8^áyÖR`Õ·)3êŠ@–:h<ÎSÆÊŸh|M‰ç’·åéN9WÄÉwT{Ç)&â¥&P=^v7=P/1)éK½Ê<Ÿò]\ž´-,ùTXÜY¯Õ- fd§’Ç ;`™)¥ŠÊrxS”=mL"ä€AWƒC†ÑZŽ\Ñí,•A8ÿ²%>|n;¹X3:]J º ª+o>u¦ÀÝꎥ,‘Èó pQf“=Ãö±ý§(  —V¦FË8zuÐJpÔ¯‡ÈHÌôˆÒÃ\{,÷W)_Já‡Úb…oLœ"l-|(]M¯Ûäó³æàqo6€l K|¼ì| j+F&õSyb­ˆ1âÎA]J ßÁ‘(ûÍÂÕ 9(ÚU]ìiëbgî›âÞÚÛÁÝagO™Î1f¬(QàùMöd wNy½Y¹éµ˜i«ƒÖ>s*¾ C x£pYÍ<;Ñ~€’ß[è!ö¡Bòm®5uÜ´Î%0HO¼Ø°}󃥒IéÖþµ:·º]c²•@µÜýè²…LçéCÜŒGŠ6ÕTúÞ¦doG.‚é\ë>JSžÅE\c Ç8ö«e-8·Ñümõ¿ëU¦vûÍž_·Î‚šèÆ#Û+øÒX¦4QÐÝI’ßppJ'š«¢²T¢%nŒrðü>ÕÞþªª[žwl¡tÔAïé|=eØ¿÷…3Fâr$ž°;*¶*³s*ý8WŠ Ži §ÄŽžG"ªÄ¸gzŽ )m þyÊÑŒ9 w‚ηîøÞð£iû­°‰ ð(m>8@ÌÑÀ7 â¾ AThLžà0 îñ8j‚Ÿõâ Fѷͺ¿+ ÿ$.æœGü´³òxÿ%ñúÏ’pþKÔüÅö¿µ8þ7ðA‰ù£çøAP;4ë=¹.n¶q¾V©E'Á {Î*€Ý¸«‡Ã]1¼·5MUt eW5¥~²âÉÜ?ÞìàÍ]FF PPlU‘áÙÏÿÖ «%p×Tÿ]¦7ÏR¶b({§˜»ÒþZrò‘Þg§ä8òÓ›¡x †|MjLÒQûVóHΉLýõ«ör zLô¦Þ ¦Z‡„×>Ä)'W•/U/hOhU¹—HhÏÄ£åFPqþÝ;ªênÿ£[ª‰Ÿˆ-eñûד«4 1ͨAûmÇûK޽3ÞSÿö‹2v>N3KBwy`—^µµ­Ï4%Ã1$@¤6˜ô‰Ùrr•ø¢ª÷}GFEÎ,Hˆ­ÿ½w[’äHŽ6MÍ#\ʾÿs®ÈÊ¿BT†›î…=*»ÌpÈáä Q]••áᮦú點Āu]Yw?Þ'ý)¿> r®‚S¬YmqDéq×3Æ ·T—F$_º{:œÀZk›{ã#Œ<ÕLdí!ÁVîúŒX"PÞ&ÄV¢W‘bo¥yºŒk›Ûn@p-¼€7¿mKÅ î7¹Mt‰lûúÚ_ïÛ±?r¥Õ^»"=„²%äö‹]}29÷5 ./áGÌ2’¯î ß±zÅpj—7ëp×ÕçÅØ“m³7M¶ˆ£Bm·™#¤.§˜)ämo3 lÓ¯xc­5ú¿ÞÞEwìÒY‚ ÐëÊ}íûëmÜf—[),`C#)Å%þòá[²Ü·za½MÌì6`]úR”±=7„„ßÛ%Q„sÑÈ›†ûv$ÆöÜÉ]‚š¦·Îª”<`Z©Du;™ l1~6XY£(·‰À~ˆz·6€ë¶H…@ͱΨÞÂ%&Ôë‚mÝ¢,PÅÈM¯´ƒZ·’ÌK9Â.—ÓÄ­@¨¹î[œ;B³ˆ®uüýëÂmÁ:ðG¢³€?–¢‡Œr r—^ˆm[È·qiÌÞ<³Ãtí9Š˜}î{¿ï½×‘×µ<›”ÍŒ&Ã8³.…ß÷&™@bF°‹zM9Œ‰£‡ À‚êJ¯* *KKÁ:Œbyû†ÁsÛ6ñ_à­ïÆ ªë•Jq K| eÕûŽ3åËm²ù°îµSowØ"—p‰ÊZoÉŽßØL¶‚BÙæ«ï~*T{d©s@|ZëØzÝŒëU[W.›– qáv·JÖ›‰èö»ç×-»hÒ#ΞÛ;ô–Û,“nѺ“¢¶²J-?Bƒøe<ÃUÇݵ“"ÜNýVlÈr&‘Bo÷5 «…w¦¬n÷䜬—RÆ{ÇeXÒqL–ëâ± ‹ó”Š#ò Š €.\âmÞÈ­$²)Q”âãe ‡](Q&mü®cm÷¸û;‰QÌ9ëyÒGí>i‰öé~rµß~Ó#®^k¬FüÈsǃ]#xƒx‘a¹v#7­g]ýùÆC±XŽ 9;A|ÆÑ¸¨rÊœlIÛ_ÃÚVáöS¢ð«1Ó¬­®… †6ÉP¨/½hUbÍ;ÌQu\­Wv<w} ¡4ã-²îoþ„Š£©9‡Šñ 缄y³éÉv*-/Vƒ¬ŠÐg1mh|ÅD!ßë®É‡E7Ƥ—‚ÎÚEÛPyŒIá:]÷3ŒÊŽ+—úöh2©Sן2Š–/^ÀY¶  =\É93³_Ë-ší$ßdÙCkúnqæyÝþY­ñ³å“”~"œ’­ŸË¨ 11RŽJq{@ì[s¯Æ1ŽBç.c‰¹ÏÑt]µÖZ¸ý’DÄWH…>xˆÖVȹMÓÞaÂ+OáL2°ˆ»bÕ¨1j>õ¬ÞÕÕ§âí8F’ל 1ÛqùmÊ: ëƒthøüŽàîM ¿•B²0JŸLÕ8´¤2ò¡b:ÀÏkÑOl§×3¸ôMîJŠé˜,µ½á»jŒsò2Š…?ʳß; >˜’ý™ŸÕNˆ<˜h¿ªþµûªü{%óN…ýýªð{Ùç¿üÀÛáó§öíOÇWZWª½K¦ÍýQf̰;TømÔäÊØ£Nñ]ä`ûÄßá€:bÔÈçlGˆM¹æ÷Ý^ØÊû¤ëPzÈà/i¾àXÂtæÂ¸–O*ð”Åly΃fî±Ô¯F€rfúëÙ|Î|$.}.žc6.š' R€+ó€Iñ“q$\ñOz.¿_Tª*fs¡w/™wî} X5¡®…Ýyî<ºÊûïvÔ í½“y)îȵ”Ay€†QTµg;ªíÓ®.1fX¾n„ª·í”eSq¼zéAo9öAOSQ€Õƒ¨ø‹"›Ž‰w6|ù[#k-ÀÒàêRÝzÛmæ¿£bý¸™·;Í„€*Üm·á¶pcg·!’v¾«RáÐNj!ä6{Å'¢¯…ûݶfs®Šl÷}ËM»oÛûÞäußK_šÜÎ;Á²ÌDLŽtTÜ|* !që×:ž×A‹N˜W[Û —diÎ*½…ZsNx_ÉÏÚFPW¦®üĶiû6…ÈK "ÆÔ*ò•KucÐ6‹Šä"Ÿ]TöÆ'‚¯õ訽¬äNÁ…Ë@¹<ô ¢k‰möãÇõ¯ü—÷¾…|ßöºÖµ4*Ú·™™x&Ãú–8¯\¸^ÊÛÜÕꬊñØp_+Íå:uûhüFÆ• 4šÂ ŽþÖÄЙ« ¶Í ü]yÁUc ìíÃ3‰ÔÁo“^Wu»¹zsß7Ü÷û}ßëu=ÁÑq«òæÖ@•£iÓ*>B¬ÅWB_KT#ÆvKGk=²ÖåDhL—Œ‚½¹qï}ß·»„½Íb)Â&íc² &Ñz[ÔÒ"  fÜQcþ?ÅòŠ ÷×ëZª—g€hFj e ¢½“á,÷áÜ¥1™ööÌø‘—@C;„@ÔD— e£Õ 5O¬Aª Fغ~ÕùÓE{øoˆ: KéŽvß6tfoÄ»ƒæ7Gš2¶e‹§½êh«mW*Å,Ô§vg†NL°ðz­mt¨1M;II¶Í_*ºZ©•øèú4äÏ‘K/ÏV¼ˆ­Î)s_xZ)Çpä^Xú£Ùö°¼Æ…œ]žA?£¹ÏÎ÷¶e #-æÿøŸ00ó!§Ê%ÌHÀG>•›_À.s6ÖF0*@|Z?ŠèåAEch@ñjWá@Ê'MÒìÖH)“Ã=Ñþ †â/¡­*NQ‘Àš×†¶>9w8a€ÊžŸ¥“%õBbªå’ð·e>³ò¥ä¨·£kˆçeœñ®>‰®ráxükÓ·™Õ[~Iû#ZsKOÆÒ=°¾þ¢Èì%¬Ý™Ë3‡}^¦×(Q'“z¨¥—rH:U­¤ÕÄ’¿]@·š›ZΩÚÕ©”àŠ'³Þûp© Fç%ªûÔ•á×ö.çI¥ì³Qô~X7eæ`Ø J3×x!«•@ª­Î 5(`wìNF­íáÖêBrñN‚fN±iñkqSx‹][Ç ÒGI~X¨\«™ÔÞ*š¨9!E\~]J% Y;'v^«ï&)´¸éœk£•vlåx)6Ó!¤[’¿xÔ¶êÜ÷5]šÎÊ3)Ä~s[ ÊÑG‹)Ûš=*ÇGo+GyffÚKe÷Ë‘ú¯¨ÙÔ4k¶ÙT°Á‹›ŽòͺEá˱vN¦çL£Y*ÜMžµ€Îõ0²’/ñ‹ÄCS²›ÞŸ–V›|ÌA ú¯×³-ƒÒX¾µFyL"ãx3iéù™ÚFaêrå§lé:ŒÇ<à@¼?™4ü$!þ5Áp‚ñû3â(•@©úJbLÊTfKò‘ÄŸHs¤C±«e1Ë8X”²º1PwÝaž=mv¬J*çóêXøãü1¸©w%­0>Ç?ÓRóÝRÎÚføCɨ§*äeºî"$7"olN¾5ÇĆŸà8<‰§Àƒã{BíQÂã½ç©ì¿ø Í?=ùtÙ9Cÿ.­zvß3 |HS‚QlþY¥ý8Àɶø³j5~.Ìc¬?Fùñõýä‹ñË_á¯Ïþs½ÿü´FýiœÏß2Cø ŽâD 0þ8‚ï7fsüo|û¾Èi$N=ý° ýÀU#Ü«Xn»{F "£[úJ@º=i)Ös~DqùëÜÙXµ›kL£P±ƒ¦I Wž–££Æ Iÿo“ï?FWÁ@Mw7"¨>g™S?Sýö‡Í ¯’Ž*º…À7¢S~(WÄR¹"ͨ*cà^ÕDÆÄG´TSÞª,ª\eS¦ il¯¯lsë|¦—uE±ÖÚ{'¶ÅÆË SúÙ~ˆé6ÓAŽWh¹añ­IurÅÑb,ÿ%Ôõm4Ûfß§ª¦]Õh Ç­Åþ:šô_³Ôÿȸ÷ޏgŽÝŽö›¦ªÞ™b·×øÕ£ºBUe½·»ûU£1‡exìHêâµêK ¢P¨ygCk #s‚²5A?EÃP‰¯]ê§ 5ËøNTJ`Ú·„Šû6÷9©`A/Åÿlo~›¡Ez¡'Á’ðPÒ=ÑÀbUP±ç.íÒ˜ îÛ¾ömŒØ.Jú÷Ô}4^àt,³¨Ë‹K é‹Œ „aû Õí™Y±FU˜û}CD5šO)Æñ2gD4áÞû¶m.·j~uÙ;ó»4}…guMøÚÿ¶ ‘@®Ìôh4cq챤™Ë£_æ>` ¤8¶Xt¶R?Tõ_^÷^÷íe¼ -›ÛîM¡ÜËkc…>˜Œ°¼B—ŠÈ«º5ý“]À–Ûxo®8Zæý¦ã^4HQjM¨¹—&å6»üB‡Æg­"[Ì ¶oî½oÛb³Æ*F.àÒ%½Û?šµ.ªÝ¶…¤Ý¼eCä}{ó€•þPXP„#س[ mï}qy1Âh0g@pwʤ•"ÊQì×ÚùÝŽÿ)›,ðòÒZ=5¼9vo]ê ž÷Öná6R¸òÖ©ý¡Á€YQà“[¾¾oL%—n»ü€¤ªëz] Q£‰˜æ±b0F±»sƒNÕùÐÒyØŒ¾q·‘&–¢Ú=ç ëð,‹lnRC'–UÏŠ‰Ð|þë«ÔÜcïÈUƹ¨Ú¥ …Þ0å–à­±g%˜PUnî2µy³ñ3þ¦¸®kÃ| qhÔö¶eºdSüT䥨º.5[†.4¨ÖCN2{mç.±ÁõO¹ð<Õ™ãÐ ŒRÇh–ày”F4fè:BUš}ð¤l'ä¸iF˜Ñî-׊íâ®)^2u2ÈTÂ-næ½)£xƒí8 …«Û½{½:S;¼PåÔu%¬ö!yl@‚ò“VýD ŠeÕûéÍDr¢­1˜í™–Œ]kr›¢çT7Yú›Õ£¦4¬&óªÌÉNåꘑhFL6Í’þLõa:2“[®7Ýæ¶LeP [¬Âè¬? ^A,x“šÌ&Ux¹ö€‰·Úˆd¤g;ÍŸæîùŒØ ®?žÒ)+g$æ-¸ENS«8ñØÛZU¼¥D¹òo >g̓sº€Q˜<¡8ÈœL­ÆþD{’˜¤p8pêõç)XÊSõ”WØq늊bFl¤‚žÃ ,šÏ%Ëä[÷”9Q@±eš½qcDĆ*†ƒh¤Zl˜g¹:ÀÕ¦&t-3$ÓÖb9ôU%Œ[§ƒ¿S»œ%umzm7–¸X%GƒyYs!±BÖ¦ÎÃ4¸BM =–c¯@@umˆE…}¯AÆõkq† §üù!{aÆÜ L%¢Ì1VÌ1*ᤙâäà–"œF∩çÝᇎïÆOØÞÙ]™¹Œ“Î3ÿoO›äCvc.ÿ‚ VŸg,Ê »Å2æ-jMga`óÑŸ!ÚOìär%¡ôÏá<šÌ'Ê: Ї93‰£’fzsÜS?‡ÿJýÿ2þÿƒ>É¿çcø¦õãì슴&yD…ÒÁ1xAé›å´Sê”Ö‹2::q;9!ÐnZ¯ð©ö9…¸ð,…Ø:›ç±Üÿúœ¥"ÀG¨³Œ¤ë³DšEÇÚe¢R2Äc€ñ˜á~RóË» KFeìaµéãôØÒŸi‹‡£ÿP60f0Gü>*¢„Wóàc>õ NtCǾù¬:ßbÐ;"Ñ€Ú¹ÊnÖ?ÛÙ½¸T Óâ‘uŽ )G 2ÆN£ù¸9Ü=‡á¡ªÆÖ®®[L£ Ë»EsAƒšÙB•&]¤ } ¹-ö¹æveXÂk\ÕBË4Ä‘,Âè^Û!ßGÎÀUž®fïÛ7mï€ÿË %d\’¿Éä {ÔàRèÒØZÐnòÅ%qrG)ÏZøG÷ÏÖö11¿5ÀÙ$öf$‚Ž8“k¬žÏ5¯…œ µÇ YKu;À4âäÂ0RìȬ¹“‰t@_Šr[â«"ÜBy]×uéZëRÜþ«˜í¬§ñmÔm]„bòeüí¼ÙîGQ¼T¿¾„FUqüSD(Œø¾±Ns¼ xwÄ%p¦t-köörWÛÁòâû6—ãß&‘¡pE´ìR¸j©Jâë·€w»Ê(·…<È4paoÛÛ£H©‰úHu oñK0€¹*?®ÿ÷µ¾Þ÷ÿóþí÷¯7–^Þñ vo gœÉö"?JYµ• D®Kï­ÜïÀQzá`ˆKb;•uMg‹ºD»Äøm1äÞ™yŠ#<["²S_oâÕÉ"”½ïßÃ{Îß-K&$—.]6· X$DeÝ¼Í óoð÷·©ÊÕªËh‹wëºÓ÷Á>K…è£ì-OÚhÖ:e½[UÓkĦÉ\5IhÑû)ΉÚù^ª@õºäõZ¶u- ·Q!‰¥©Î‹Ág¬.T\Þô½˜yûšªk@ ñμ°1ÁZUè%³yÌö‘!S’“¸¯µµÁ<Áå}Íݽñá›çt 6oÞdƒËÉ"T[”}WWJÈd;›ä2®é·]êjš<²™€ênöµÓ=꬗â6ªÊµ–óâ׌"Îzû¢d€¾V86·C-ÿ°tå4*x6[I‘K—ê~¿2;ždE6F~8b£F¢ŽŠùß«l ZÖº¢W%m ÏûÆjœdAB|ÈQ~Õ@Ú´1Ãt›ÎkG‰Ðlß÷]QŸš¸}Ñ´´u T`+Iõœâ9J‹>¢í2žõVû°–ÚDiJ¥ºxé‹¡yQøu9ȇ‹á@F5‚::&‹ºã&ͼ‹±á–~ií@¡';› ÇÂL !{MGdFc[ ÑªU§ aKª5»ø¤~0¹Í¼’Ü}ÃÝ䙤ÊrÕZ…øÓ‡o PA¹JÑ0aËÕ ÆJ-JµrS¨­½›8= éÜéè©æ42 ﵊ԄÎÜc'Ÿco 4„x7·–E{Ôõ`K—yÇj`‘Ñ€ŠN|çÿT ªãõÐúƒT`ÊÏܰL]ã †®[˜þ’¢:NÏ\v?ìfG–HÇb_Ây«û€ÑÌlûä ‹4‘ÎúB–ß0:l¸—ïp¬w@nDW¦ÍkDÖg]t ºLT“J‘LÙù¾ÞœN1h”>$Ð:·ÒÏs¨bQö@´ÿ}¬ ðÍ}-µ˜žc 6zuO½=X¥v13sF¢3(Ñ›~p>šMý}Î_Ta…yA»¬}çoÃáa(™&°J£•?ò(ƒ³1kNã²]"S•è3ZåXî±ç®D¹êy×¼Ød&I‚=¡Jw)¡ý\Yp.”ØH k‘7rù‡8# Q+}ЇxN½ŸR"å0æ.òçÂðϵš¶~t€]<꘿+Œ´à͹$†’ÓAÍwT³ †…V Æí]ð4T¾‰ÁR`­âå!¥ÖôÊ´ÛÅF?{ówëÚÀ€Û7¤è±|É€½µêÅÇ”AFÞçùÌ—gtìÄûÌÅ(º)«TóÃüÏYœ’ /ZV'âÕàIÏj †MóLJ|0ÝŒÅd?ŒBdž8gýký o:«ìþ¡Ù4ç¾- IDAT€‘Cº|ü/鯳’äÑ¡qRëÎ Åù=úŠú‰VúÈ…üIÃüj«ÿ”ò7>)Çüå«þ‰ÿpϽªþÏ|¸Èðg'QøüGG6‡mkÿj çù»ç¨vþÚ‚<]c#‹)ç×Ö×ÄÇõÂ'›Ý½$Bby¼h ºQ­t|þúÓwð¨ä=ezŠ8¼€õ‹cDpûmi?¿ÿ¨ýÀr<9G ‚¶““8øg8ÕÿFŸw7~‚ÿd\7ÝÒ€x… øN¢ÐhŒ@%˜¥4œà$7çZõ²¦Ï4³¢ŒðsùÍ·g¢»$3aဠ“ê<ìú/ xÜÿf³OïÑ1<ô¡÷Ë ¥_úÚ쇑 è׺T››äZBæM‚Ô Ôœ<¡z:!€òÅBT°Êvf¹+íˌǀ¢ßû}Ctí/ÌÇàZ«Ü¡Ùû¾£`-Ï7–¯«Ù¶[d‰\z9…)¯is>5#hc&nØfXZkBg€Ÿ;/Qƒx(–Õ®ÝFËYA„-Ü:B\qƒ0u"¿C–"Òý=Šu0-1WÐ_—Wð m›¸Ž9‹eÅSÀþN\¯ë· Ìæ +ìÒÂEý}o³½K—ÿ¶_vÏÇ+DT±þñ.S,]J–_… 1b™šÑ›»{Ûö×½déÂ7÷Ð3VXø½ ÜcܲMhÛÝŠ¿ûëké;e'þ«¤{¬r[ô2Ãí(굜ξt¿7!öº4ÐïMFA DñÅìS … ÊÞÌEùR¼~\ò¯¿ýöÞ¯ßÿÿÏ[D^ÿ yo+Íóá­öý¾´.ð,ÓD¬4f·m‘u‰;SSÊ¡˜Érï9½È3záÌdS–43ÄUm{ûÈR±p{›ýÐâ¶í:$ê\N‡¼“ØV’ë÷U;Æ-¡îÊ…òT7°7ï’ìþc`Ó¾¹5Nbä‚OB¢6ÌW{dW@Z#éî×Û¸.ÑëzímJ6t©)Ä6ŒâpùhÏÇÖ¾Ù ½°”½ DžáòZ×E«ž-3»¢†A‡†¹Þå˜q€û%@]PJÔ²éòb!úÂé©Õ ò9N.;á 4’‚›;r=BxwoÈ3GR*óbDçð»1,S®8gD? X—¶³r)Ìõøº6c®Á™<°Ökqo“»ŽÉéz5§™„ê\Xò–¸þ ^'@×X3BQH{0T\'’tΊÈM¾Œ„A™¥bvûņ©´‰ã|TáëmÖð0žtZÈhÙgºJ’ äK¸Åª!MÊ0{šÄ€†Ñ ÖÃ>|Ée#÷ýÌò_-èš,YUp#Ðuˆ Ìíª‹Š§4K;bR,„ŽÐh¬T¸È ¤7ùQǤ@Årµ@ ’Ö»"ÔŽ%ÇX &™ö„øhÝÍBp¥Èk½Í÷mOyª£y%ÇPÕ—âà‘8IXâŒØœ¡YVT‚ÐäàÁ<ÛûýÛ:S¾~V!õ7~dGÒ‘;—S&Ù=<ˆÖàÁ‰ä1|£~Š0iFÕH,0øjiFF<ªÖ` ³TŸÜ cL\›öf„šK%ì«r¼zØ2Qîv‘Ù™),jXæY+q“ õQNE³ùlÎþ eéEàÑ ©.¨8;Ø´G¶‹ùÀ<‘·E»¬0=)¥w#º§€äÃI¨Y „0Hÿ’Æ ©ë}ó"æ†*~¿Æ+g-À– “‹wcC '¦ôB#{Æ¥ËØ÷jËüžò1ˆ»dz,”ã¸Í-0äÂoÓÞo Æ¦äè ÓoÒU{«çéÕ¾Ú.X©ˆ¤`ÂWïZ¬œãí|q-«`†cÖDè4µh%ž”—!Ô²my¾.VXƒsÙ¯1YKs6«´ë«˜Åõi¼Ž“Q-û!E˜p´D¡®/Í$ù”|¸óŸôé:|è,'–¿pwN¿îÙ@Š¢«$PQhãÏ Ëjt¦Ÿ,—õî ïÉç|)7Jl›µø®ò!¶˜=Žœª}ºªyx¤Rz±ÊW%<ÉHîr2Æe2V©Qið9dq*Ö¾¤sàp^S‹šobj*zª+§ÇC^eKžÂx8VÎñË¡žOu²F²îgs?20s3ÇDiÆe~.bãøù‚_bðåü¡Ÿ¢?þ?CßpSúÿX¶ËïßóS=Ç']¿¶bÿSÎ(¿*`øGI÷ÿYoÅþÿóå¯"0¿¸÷ðá6S<ÊF柴~S›®-FøtX¹ ë1n(NõéaÏXªÏ|À£I=?MæN®ñÓ%é©\£#pZ&ÐT¡ñŨ)ˆjÛ-åìQŠÇÛî6£|â ãÿ±àë\Ê ?ûžÏ5ñ¨®É´þôS®¿y9Y#ÞÏ8WÕ2i¹Ö©÷vuN”ÑpÙe'ü=÷йMké¥ÓÎÍ™íÍÓî_ o§ å–¼R'£­@Íì$´ŒoÔŒmÈ¥:‡î梮*‘ÖéÃ3Ãç¹ä¿º´Z“‚­ xMBZŠò( ìõȸ„áÔTªÔŽé§ø7ÎŽ;U̶ÉRÈêACˆSŽ×ç¦Ç$È{þôÒ˨ƒ˜Ë¨¾‹ˆjŽÃ"œ•ZôÞH*t…üM5›97?ä¯äï…–¬Î_rClóKn‰¼^¸.ßÃØÞ¡‰¡ h»L|w¼§Þꉜ‹”‘esO:©Ë$ŠÁÅÜÂÚ¼myøHRM³°xU­ø=› ÿ¤¶N²ë‘ zÁçš²ÉmÆíïr¸[¢¤4™}¸[ˆ‡kô~jÍâѤ{eØÛM¸Ò™ZI‰å…=ôÄ›U˜”M{á0•$³ µ « 9é .^Ê#¼ö† @ìK Y%Þu @WÀ÷ü©¹E¹1©ÈæÅ5ušA³×dÜ¿®ö'ë?g`VñL"‚3x*à‚McÉtÎÔÇÑæQÏåVÍK•I:DoR}zÏõÀgL7Ç×>·´ESÁItÔ0¼M(Ï÷ÇWÊÔou´™$uꢮæÏqQÉ9r¼Ê¤N³[ycæíÃ$íršNj€]SäŸÓ„_ûˆVmPC¸î·IH½­ž©³{oÞɽU ÚM®21[¿­c@ë»SB–B³R%FÆŒ²¶}.:ûýhÍ”ŽÔºQ>,$.ÈÌ€ªor£ÇL±—¼e¿ËˆS ¶8B g*Ž[•åÄXWÑ)1H؇Ô:5ê©rp矄7ü$]Ó˜e‰,/;ÇUÑ¿{¤ŸbÀŠÀ°é™‡ëÒÚÁŽïz• >÷¸ ¬Ãv6|œHv EÀù@Ë,úYM 6ÔlB‹ýõƒžðŽ·Mk7äÐÍ“DÅü$Ë©Ÿ („·LëÌžßú{>TFüÄ*/Ç êƒ©¿{ôº^X¦àÏãyÙçár4CætÝY’uçò}¢óc<ެÆ}‡@ωòž(¸þE#üDFš<+5ðS£³|£Lzàó‹[hà©ÛÄÏ29ÞfþÏJÀÇ¿Ÿ3þÅ?úŠÿ­ øwüéÒå‡(|yy]=3ç!&TµmÓ:õ[ï‹'G‹@;$Ìí‰]ï…†\Na”¦ª„k(,ÃêB­òÞþæ+6}GMÐ8`¸…ÞŒ‹q*(†ú êwª ]ÕÏV€²=ª`àñéœÝ¬q^-€Þ$Õ¸ÔiL#|H®Á(Ç£6ޤ™¨2fpY³™nrVƒBn­)~AÃi0¾Æê7Mùx gä.sÚR­%‰úÃÃ*Ž8ÝÇY»è«£æ~¬'‘b‰f—åý¹ª” ü¹;á…UNÚx%cf\NÀ§þ½Þ)dqŽ6 B¥iî§ 3JO±©!©"úè'޹7Ǭk¶iâ¤ðŠjµ_„((2þ®äRÈ(§NÓöºʼn ­We¨€× }¼©<6¿Û.*.;w‹YìiVɺnÏPÒnÏ)zé…›‘1ÇÃ3¯KÔ[>»$WÎËCgN=ÀYsÞ<ü€~ÃÊ4à%>xÖhÃ!c>Et|0»3Ícq“Â|dW­à ¬øÌ7}='(òÝéï®"XûÑd»kÍr9oÏ¸Ž“°U(?Á>1rì×Õ±>ŸV´þB«‰QMFãÜÔÇê†;ÕeLDø —ò¯<×ã¡™ b¶²ôÜN}:¿€’s²²ç· Áê[.ôÌ”³jžCȨ”ŸÉY~=Àbrg¨ýìòbÚãfïå (çˆåɯÄÉ@Oc“È£Xdd´â¹¾þJçÁùצ½ÅT ßj~Uú‚,ÔÁ,‘8[ã\{ÿÁÙã×mÁÔ8Vä@U{b¥g8/ψ’.“ð„ŸË¸x8 «j’?‹}×÷r|‡ENÍŸø±Ïÿ.2ëAÕþÇ(¹ÿ(Cü_ù øû_ï_ë9ùÇDþÛ{ÿñ·}˜˜Ç—³>ñÊè:ÙܱBL=ýͨܡ»oŒ6óÁæ‡3-n †è?÷t%iÑBë{ò-¦cÜz=ñðÓýÛ2>Xw€w¸Ž7EE¼ Qëh¨ *ÚVpƒYîó½y¶ò> 6ÝÝ8<þ:’\ß§s¾¢­ºBÎcÈùÅ}°Œ~vÄ㪳©»ï]Œ.GÛ½÷ËOƒ)R—TcÃá¥ÔA©˜N–g¯h¹ãK²¯›ÔÌöÞ…xˆßI—æ1Ç»+½#Ø[þ‚´w_µ`ñfkfPŽF¦nL¡#ƒëlĬv˜7³,!ÖhsFûl„ÃèеDÈd€®ÅÃ?Áš”˜Ñä.&t·†9ÿèbôæ/ÀíHJsçl hw­w‡-ÁŒâG©h¾lšš-’» ܹêhd£?+둦Í6ªpø„jÄÚÄK¢ª*¹Ô¶•Í((H€Š¦ôÂPt“b¤l±K*jJÙær%ÿ™ž„ Ì{]B1Ï1xŽlÌì}ßè [¼Ó+ù.ýuñFKѵV´k¶x±/U]ké{ß#+!·}̘¥¹µ}Là×½Qö^k½€/ /_ï[GvªLC"²?~\?~¼@¹·lÙ.øúxWXÄø¾7®ë7\¥G¸*סR}šaFã6ŠQ^‹ x*ˆcç)Ÿ<œÕÐÖí~®'ª`ßö~Ûûý~ﻦ’AÕ,Ž-§¦†Kq)®ËÛ&Ìe. çñ¾-qö䆉™yþ[ º Ö÷ÔQBÎpd49Þ¢‚¨á Nì±Õh«1mªƒPMq^ªwAif{[˜ŸM +׆ ¢KõzÁiúµEЖ,YWIΈ|uM‰„ ÙÛòL§PbAÌå}¬¬s“ßXI…1³HݨsÃLfÛ„÷M3Y k¹nú¾÷Þ÷ýµÞtM dAWX£±¶ºÝ¢ò’kcK¦¬nÒl¯uy€ŽäM»ßXZ€¸•IŠ2ÏWÙul¦XN{‘#±)f¦ÑJ#×¥ª‹þ=e^lí6óŽÉðqo’”½t¸ÏʰьÎÌgAa>°È’©“¥s…¹i*‚ÛE.Yjj±p]€,÷ôó‹bÛWG,>Ð%å- ;ñ}l³t›˜ñzé¥jf¿¿ßš±ž¤NÈÞ¡ÂFô}Ä0oãÛûÁi*1Èvî1}" ]ny•wež\þ§A°\¯ÎfDá¶m¾e©ËCÜ´Ètn3Ñ튵º|¾Ö‹¼i;»U$ãT©#{ãs<Ù3¾äÇÂÄÇ™ˆèŠQu-±³Ì^À™ mË<ÈRû´qÓ6Ìô›Ô6åðãùϮ͆»[Éê¢÷Lb<šæ.•ñ§Þ£ÞN“Ktc[óõ’Ò‚¡Æ]žU³Þ¾X~ÆìùôSx½›¡É†Ü2¹À[ä¤=Dûj„¹’„ß&á@áý+ÄHj6ôµLJuQtIJ~zi_¥ÂD±…ž„»Qe @pIˆ¥¿ƒ„Q}û{ 㞉ÜÑ Il~PP 7ð0QD%”ªñˆícØÐ"íÆ¤"%2b†žŒSÊørxEeösæÑŒÝÜvd‰¬1˜éŽ*Χ%¡4C@GÒhK"¥àüÀwú…¨C…§ ZŒ6°THÞÛüN#@俇–xeå9îQiýx(漓ÆMóu‰âéK_5ØýÒ>MÔA`e¡Dî¡Cà‚ŒëXVÂf@%RD¸#Ãbk9>ôÄ/ŸI8`»(7¤‰‡A%{%Ô{®³ÚžãwdVærظ1½#rÖØ´ Õ¹cœdN§´u›îðN «|^rê—´ÅQcá5kµ|7 ‡ú¹#¢œè¨!'ɳ³¯‡gA;†š‡ÃyZÕyžÞÖ“YuÑü¡áæÆOQèF†Ã0\¶èv¨!“š?&•ÝX[%Í8KS­;‡ýpÄxÇÍ꿬zòl«íÖˆ +;XÊÁ5­›úÌ€‰ÆCÊ`aÎçÒĉéýa8n-9âþ->µ<ÅvL_(O‰ß•jV8aöpT³sâñ=q´èqŽ=Ò=¬e^ÎÊà³ý5Æ <š­ç•0‡ZYgÈcΓ¦ŽÙ×ÉÊG8f™Ç¯ö^& IDATîʯ磊þÌGf€‚ côÂÏ¢ø†>Ëþ\¢àouÿqz8ÿ½_õ?ñÈCþ™~×ć‰¿ý½êí§¹²&æ°%|Ó££(þƒÆG[okúr<–Ý „:0Np±Ä^‚ƒ¦F†œÌ>÷±^­|Ö,ÌÝÞ€x^kc8õs’¬>îån9,×Ñ\P#yö Ë„æä@WaZ1z(£*à¹âáý¯Þ¯aøfÿOrN?hÆ\áÊý®ìmÅ!*ÑÜuao Ý€un`õâTžhK² P¢´àèANqC!ÙfUµjMB‡Tø<þx;ž¯Uû:xžu6!­jNk“71éüÒöX„H-máóú]évæ¡¡ÏÞŸ†X7ç¾æÞ¶TïéáOníeÍÛ1ë˜VìS…¬GZJCÁšc™¨¬³''örì>ÀÑòÞ&Õ8HúŸŸ¹ “éâ ·ÈuÖû_ºb®¨‚ÐÓrÂ"“7 ½Dn³•Y…Û*µ`fPÅ‚pŶد3s½Yùv7# U 0†"503 Íß®3s*J„RÞ´µ¹„¢Þ•[+qXþokATöÛñE Ëk{1<Ũjt§ÚçÜ 1‘{ó^|zAn½dáÒø«VÕn½ËÓ• ¹Kq½„Û¶ù‚Øb›4ÚKÐÛlÛ–û’H2fˆ;³y½ôÞö¾ï;ùû·I ßc[L.èíŹqâ…_ vô*/Ämöõ~m#åÇõòl¨Â’=1p¢K‰ã×â›@ldË-Å /P6$*f;“w]"kªâ]€ý†R ¡éR}ï-cjhؘ€Ôx-ãí+B(42×~wäÁIæÚ0{?uCT2+#ªÀ61O©T–Ý(W´µ“‚‹IôF¼øÇî¾=_×ö0ÑLȽM„O/8þÞnóæö×Z^}Émï¯÷¿½ïmFs.žVf¼®8°èÂýžQ?!°taùTs`¶In³<²*è1´E—3òŒåà(¨Ð‘}¬hõÓÑrOzˆæF1ˆ•÷½äge&P_!G3çÑm’aÖ÷ÿÂÈP븖ZÅì½m0m³ähi6E¸7qéZR-í²Dï G[–°.zÍ{î~Ìå"^kÝ{ÿþ¾_\+(Lp[¨j¤ýci jÌ+÷¦w€@åÇëu*>ª’Í:].ŒÝS0´t_&Û º49’Û¶ ë7¹üѵÁý•©â&C‡¡ŽfUøÈáÚ¤Ñ>'¿@ì2%óƒó!Tˆh ìzü™ùuß@vëY>{| >¥p$'VÉ' Å†’ ô˜X{&Õ'^,0n£,›íà""7eÈ '˜:•žUYÅDú䣄¥ùÏÞÆ˜'"~†ör‹éç>Ž Qnî o¦"Y8àš2‹~ƒ’HÐL"7R v*éÞqqO‡óºyZ'Ä©æ–H¦h¡þSD©ÅMaºñ= o¿´èïb]­«D¬t’dù·ƒ5ˆ3Ûòád푆â›Z–ëƒÄ¸kì'e¶kŠj^¿Áщlj&;w¹w*¨rËØjwlãÉ&I£q°ÌÄÀARÎæ†B¦¹ŸF…OµÞ‰j}\¾·Ì™2(Úê`zuÓÍÁNÇômá’+Þ’}ïÝ6eØáý™íoi±6‰>%G(këG–ΊLA«ý«µ#<üSÝÿdnz²dƒ.õ ¦ñÞÙÒdîH1ÔÖ¾|jøÂSMá® ÜÅŒÕ:„Tt9þ[8—5?âqÿ SÂ9£ÑA Í[¶˜2æ ¨‰»cžÛb ²%'›Ödú‡ŸHë?Q ÚÖÿ`•<¾t³ŸÉ˜¸1+¹s´%o–ÎZ!ŽêAJxKb<ሞvÞqÒlKÆ~œ„Ø“Öõ‡gAú’LUÇØIÖ­.6sÎ~äï9Ïö¡0ÎÄÀ‰¯A?™*™"[C)'Ü<¦JÀg¼}NíäO$<'O¢Å<±ƒm‡é©ÜlÏ‘FXËÈ|ägê>ÕQ½Dßê†âžÏ\Êc˜‡#¯ZS Åä322-ü³Ò,~.kR>vüJâÅ"ÓšÄÿ`ô€ç-ûŸ¥mÿ£ñüùìã/,þÓÞÿþEÀ?oñLÕ“ÿÙàñmK»/¦nè•Na×0TÙBøÈ îrÂcúèYì&ÆÚZ³öÿ 6è@ä‰A»FÆ \#Õ/Påˆ,ÈÈxÕÔAséÇáÄgž•}mUí³Øø¬Dê?Úû_ê?né@}C;'ô¬õÙÉ2þV5Æ‘WHö4Ûqu“»bPxDXºÄví¼“œ¦*Æ{îJœŸÓ- “‡µÁŸÊ°§âÉŽ÷,‚Ÿ#’>ÑøJoûÛûïÚ¶µÖȤLô<®¥Ãx G»Û,Š ›¾ƒQÑÃrŠ fò½ÞÄ.osu@þ’…E‚vû!0ˆÝ¾3®"Ͷð£óÆ6¡+¥ôqª ª¦S"g½‡oÈ{±¼ö0ÕÍÝ}nÌÃ.U.U{Cá–W%l’¸ÝT¡Ó>‡æ¨®'#œþ™nþÈ3…æVc› äÇŠ—ùJ£¨Ó<‰ƒ›» ·X‹Blq·pUJ’¬%ׂxßñmn) ø'ÆK ¹»¥.K4æ¾Í6ö½Ã¬H„¸_Q²‰û¶ÔeQ«m@emäì2®—%ð|«ŸQUțܷ헉®— _§aÌ$& Ì`]«Êyß÷Þ4z±}Ètó~É+{:ú5íËpm7_kmÒÁ#ºôu-¡÷x <ذ½Ž@_‚[l“ ¼ i™Ä¥j;ÂýKĸo3nƒÊõºÜoq@àm[+‡å×|2A̸ëuFC/Täm!øímw¨CÏ…'£qo½ÖKÕåwÎÛ»->¤ªJdÜ f[m1”—0a5ñmê¢ëBÂÂ}Ä••N’,4™ÑàMÝ!öVÅò+£cÔ‹'iª/xÀÎÂŒÑwáþîÆ¯UŽÑ,Öù˜Qj+FÜ»*Q¥•0 ½–¾÷¾÷†–èÅ4:Rt ^R° º2¶N½°°.½–ÊMÙ{ß4UÔ¹dFµh¬ K:œ¼8“OÑi·ÛñSTP¸ë²“g°T³â#t׎ŘÛZ21:{šõ•¾×ò ˦GÞ€æèc‚[hfæ$h-¹þˆÝÉc™MHòDFÈʃÀ‘Èø€B[´®ò¥‹ú½^Ìòû¡µØL'¥’7¤)|—‹í9@pSÐË–Eï59œDOˆ«j«^µútájnL R7;HÇ ¯÷P¡Méñ7ÄbÚ«CP-_BõD?,j¡³ÅñhÜA*O6Ç>_}5bµjDÐ"”ÓÆ4Z³Ì[0ÌŒáTŽw&ýsIÐѤ›îÓP&ŽxšÄ ²Ù+1ÎPf6P„3ªÎ $Õ“íC%‹3DˆÒ¨]E-j’0k§\WiæÑÀ7ña8–àæ$-Ϫx—Fsv2&XqŠYœæV!?aE…•¡+奘\ÓÌ-³ìã(õ>òm^‚f <ìq¤<|ãÂhÄÊA cÊ¡‰eŠŸh¨©ŠçYF*ÒZ›‰+17-nÌYVÎÂî0A%-Í‚˜Š²¬B)Â^Î|¤¼ºfnRC…¡jKÞY”òÁAŽúãQô;4­$³“ðÓÜÖ˜ŽƒSÍØÎ $yS¥tF÷¿Îc»gµ~ ñ=Ê¢®Á¤d^£ØŸ*gÙ$Q©ÎZq…bt²Š%„ÙEµ¦–`Sàºß/ß´çÁrfôi#áSÞAùÏ7\ãÓ@»c¬üø />1©²¢  W'Uøäû Ù»Ç?3†ª=Ô=² †RSN gÑ®£%¸õìYÐ’«—NÜóGcÛC>¿RºÌ±=z¸Ð“½1ãOÔ¸#òÓ¼(A9ƒïø¨6ßáp:ÜüÃÕ³ |tÜ? šyôM¡Ä§_àcT†Ï¿ OfÔ‡²ùVsýËA•U8tñ?µÿÉf›ž¿¬?ÀŸÿÙÿõ%ÿ´à>Ô_³ðmà†ãÁV˜E„½uÖCáüûÊDÊÃM †YÝÀ6­ÁécCd©FGn®í®¥ùÃg‡·jŸjùìƒ]Ká("P‰ôœò'^hžÔ¡ÑÃÕª½Ö@ã©þ×$ùQxP2òtîŸå½øeëáç3¥g0ó1wææ¹"r ÕÙÎÙ|AÉm°Ä6{–í{µ Ê„ùùãµýhÀrçþ6#a&#å.ƒÕ“ VäRõÉÃÎÎ3¾¦U3F7fNÁÀdPJ%¦ÝÀ:™…wÔjmÒ¼P´Ÿ<GÁ@apþšsOä'£Eé¥;zÏ2îêOYd“&˜õÇs(ª‚£ç¥xT›w+'š8{Šuø¤Ü<‚¤€C±(o«=&UÕëjUÖ’ ²Ã¥¶Íü•‹ˆCÚ ¾Ðl(ô¨;Ý5q(A|>w⛉íí¯äö.Ø\t ·ŠÊ%ò6£É¬_k›¨gÛV᥯þ|ëGG›â~¿½ 9ÄßDC\x•—êµ X/‘;^A¼l¿bÝ¡¼¹±e]kA^*_ö–èÌP»_¸Fk±8¹¢ºx-ÍBÕXEµúLD \‚;´Jdˆ\ ‚›B^ª·ð-¼Ò‘Ž}ˆ^—ˆÉ%”¯¯÷ûÞ{«?üŸÛ»|¯9ó¼½0„—˜QïÛ1ù>ÚbïÛ^ÈË-}$íM,¼.}o{>z®¥ä%û÷-¢Æ5~ßß^¯sIØlsÓ¸÷†èPmÑVé-yÿÞä‹Q˜ÌSŒ“&7ím÷­XWHB›·É¿„t㟑l)`»RD®í–a Q«ÏèM°¶cAÔ¥¸–êZô•ss!ÿ+®Dè§ÈA—ß¾o£02 îNŸ{o3µÛâ¯/µÊ²)x W”©ÄÎ?¢XH›¯íkyn'§ b뵸€Eô ¸–¬%¶·ÙûmÛà-‰ÙLö¶u­xC²ð¢é¾Éõ…!z›!u‰¹4§ëê¦ðÐÀ5â+Rƒäåm, S“ölÉPjè$²¡ƒ=¡˜Ú8*´›eYmÌ÷xúú {›¬8qGåºöa­èÖ¬ÖÄû¾K¬çQÝ‹Þ;ì} .BoùÕ7mmoM„ äR¹wÖ4“BµMS5 §×àfÜfºåZzªb”¥×ký¸ÀnnÒD–âRy ¶õÓщ_›/ò‚"/`WµÈåÑNE®sH‹9¾™Ý”œmê %XnX÷¿ËÁ×Í âô{ ‘§I†y¤™t ¦Ô¿i· (¸f‹^%on¿þ—*Ýè›E™-”ÍvÙT7|>]ýÁ¾nR-ÔÖµèÖ݃Srz,ptqÆe¦ö)]3‹ ?ÆQ9ÕWpIJ¸;(Ž6yÌÓÆ¯k4Ÿ©hçK :˜@»qÁÆI ŠZQ‚)[iç0›[uóîðLùø"›q!Üh¹ñÇ¡¾ zÓÏøágXâ|Ú4çÏ!ëØ+ æ€± Îïá 4y˜mD”À»>Š%ŽßaŒÞ|Ä$£p{DprMÌØê°¼§½Ë8zì|L&“x ÞßÖ¨¨«å÷÷nXÏÆ]åoZöˆ±îûq(o>ÆV¬£!@Ðç‡÷­‘|zè[éª6Þ‰&“SÂó×:Þ©Ç›w$Ê–Šä/ìÐÇè§­Åç)Uÿíeá›á£Ëßþü&Ùã™ øµ5Jöþ–Àß¡ßÿ¤Þù/i¯?Óåo“òÿÒ à{ââoDêü¯Ìÿèüúš™€üô#ÀŒ$­« ùYjŠocÎ'î¿YÿeæŸ]õ¥_ó1åøÿ=NtcŽ”±:W'G«‰¦ÝúY×U W²8ð&F Ú|7d³±jÿJðï‰1#Az›5 êåÐ372ƒÊ9ÿ¤Fû¨Cgg ÎÇ>¤úC×9>ÿܳ>1ãò$Èå2hl Âu$·±›™û±+k¾=*›uËóªÏMvšØÝý/]AöüÙ<˄녺¾|@äñ‚ïŸI 3SX£5øa]R8<AâyMíÒ+Ú†MÌ8„±ebœÇ”š24¦Ö“Iñد/€¦Q{Æ¢_VÄ4‚{o¨®3ËÞݥХf»³Ë Þg1¤öá w¼r-gŒ°w² c*S¶='¬¥É Jó‡è¿ i;Ì bo‰!6Z @råˆ.7çf¡²ÆÝµ½ým.“7£ÒܹÓÓTô;Ÿrƒ- ¥|ÝöÞ^oò(]Pr¤¿.®µ® ºÖËY²Q…*æ 03š™Aí²°Y²IªWy¼õµäu‹¡Å°F–béµ¢fbô«<öðwž3£¿»ø>]wÝäÞ›²ä¥Wê•›äûþý½@ãÊ&oŠ™¨^y¸¹Ûî¤?¬°ôªÉKÃií¶ÝÌ{ò=ëï{o±x]¯×e_ïïüE-O%Uìµ”²Æ-%åÞ’q{ÊÕlÈ= bÒ½¹@Ûì¯näƒ>3{ßö›˽Mä&¯ sm³Íû~›7ñ^éz«»Ï`Oíp‹%y«‘ ÅÞ¦ ª,7'{sŸ¯¤ PTˆb¡»(./÷C`a J §”×k»ck‡e•¹Öª·×LThºW¾ãàXÃÈÍòÝEŒ(›²¯…µ¼`k)‹ö»…ÿPªmæoŠõ‰@éÑ×µ~{-º|ïé:Ú¥ n¼OuÌÄÀTB3+ ׇ>ÏŸhuæü£YÑýÖžnãá,†fÑRÑøò|?ë—«ˆH"MDBUó$6Žu¼áêɯŠü9iÛÁ#úÂC›\CMh¶ýÓÒ´2«”,*Ñ0ökô£øOWÿ¨Ô‡ëy-YK[ñfÜÔMF?1Ù6¹¼&ͬ¢¹W bæV“ô—Iû¼·0âz'kkgc6ã`²¡ÄβÌD§k"”±öÕ•:¼•©¯zM¶ìˆÛjÎÆ˜ðŽTªBßOø Dª)¾¨¡ÒJ”DX}Z-¥r§)²+¸YÕ®aZKÎ]xiáˆV™EHŒ»|3u˜ºô1…“.c,ÓTÿG´9 5ÂÎÜaJ’áFiXÊcÛ+-Ð6p*~ñ²³[«²œ8%yÔ8%£ÍšÚ4&ð{:gÕ&ŽÙAJú*^Í4µˆ‚F!)"Yl‘0õ©åѵ¼X··»,¸Ê\Þ”¯XË­SëÒ]#©kçê[àäl=D÷´¨÷â–6Dš€ƒ©‰¡èWQttÖ㦚jÛ¦ÌI·ŸÂ‚õ?N‹ñvEŽIª¿JÍvÜ“˱ȳQ.ÖÅ®lÆéè€Î™+1â]ÅIÇjíýxþAhfCÖdL†±jfdž ¢¥+~Ö0g²e4!I‘Óæ Ís¢„cJ¦= ÚÙä|†|Îç¥UÔÀ†§OÍ=ßÞ¢Ó´[­ç/  õˆž›èœB bsŒ€f¶‘N·ìbvÎëà [6Qq¬4D©F(Ù¤ßÎi‡ºÛ¦¨–Ðr„]4¯ö¨¢šé‡lØå¥ðÐbªg#+o1è®ß³s0Åå|Ðb¤ÎrDø] 9µiàЃ„²SéŸj’àÔö¸ÅËï¬7ûóQÄï/ÏÎå‡qþØõ=îÏ(£ã×Ç' ¿¶§ÏqÊCÿuûðÊÞ%ÇñÑSüa¤òÇ!€ÿj ùëÚýLgý¯°ÿϨþÿjtô!\ôG#«:°uGÈ<(µ>+#?Þ'/(–ZÅ,A‰TVúòxi·ûâÁÞë±iÚ´²¥âd’ŽR†+ßÑT+áι¤ýûc¿:•fm»<›S_&Ü¡$¼`q°*Ñãjˆ%[6 †¥À8ýÃÛDʼfÖ¶ö)(Ã2ÛÈrªHËÓš4ëƒOR¹Àásq§I'Ýe­Q)뺥ª×’y:K,4K wmË’AsF—û:ý(YÅÞ£‘IDu¹[0ó¹/ˆžQM ™¹Â,ÙOðMÈ8`ßÎPav»³v°^mš£m¿jµ(ûñ&9½8¶:ia=­ó+xÇïY Ý™ÈmX>8G³R¼¾€Ö¤•%7=JÈ |Î óÈX”XòQ lõGú Q}žÀZ y‡E¦¹’- ¡xS˜J—÷/ÇŒ%©q-ÍRÔüöÖ“ É# Çö9ppQÒRê?šâ•ÖñYD™Ä}¥“eÒ·s_ìÙ¥cÅä(;ê2³‚DgÛ»jr OƒY»bckD5¤±_sÐk£›b^]"c|#â1dšÑK㣆"ŒCÖàô$gÅQ…™ 3BËU½°²«c %J4}µ%å·Èòïv ÔðõÒ­h·)›èë2Èh}άšî¤«Mm4™Ä*ß+²¤ñ0M[Úœ«å¬ùî0Érí>ñ0z¢Ý<‡5¹ÝÌÁl·‰øö!\h`Ÿ¶ð¡˜b$“pêÿ9ø¦<ËŸ®>-s‰¯lA) VSÓÌ¢b£úãwJÏÍ#ÿÑ5¶YØ¢YŸ„¹„ïªMõŒÈ y÷—4"gæ%PÓ´rŒÍÅ£‚ÔYp¹c8<Çú¦0ñ7 <›V`´ÖÔ‰™¤‚Rªæö©š±š] IDAT`fN<æGÌS~‡"j€¿fgòºÁa˜ÿTnÉ_ýô|V\ŸK ž€ì j˜Ä¯ïÏZâcêÀûû†qŒìp„Î,ÀŸÉ—ÿ0Î*é$cüW Ä󿨠þ5&ö~ó5âïýÿùçÏæZÄï¾w8Í響&¾kåz¸û'‘óäP ŽõÏR_Ûtÿ-}8,¼O[§Â< ïñw´ÊBËØÕæYz½"Î#µ +ã?††sÍ©­jQé°VäS1F •É…Keö÷âìsB rnë“æÿTÿÉò°/ž¢ÿYÀOïú ®r&8ò4íØ&Ä"=ÀppØùDuߥÿÝlá¦×…QEv#;O§Ý9Àd,ív7Ät‰¢¨î{›PgËå'/.[„”Õ^±×ÊÃXà}ÐQŠlë*»é3nxä æ<¸¯4Ú¾w©ö#ÀïhÑq¦JUèRó|ýØÁ¨*¶7 ;-|Ž~¢ ¸öwåU÷nÃÃsnþ¶u7tN@£½oM9) œ‡˜O’¼ {Æ8F—{,»žœ¡¡¹õ4É9ÍœË;âÙsŽËÖ ÖXo%#÷f\ ÞîéoÑ2¹wèîkv‰U4‹7-ÄoÍЪ—\Ž€ð~ºŒ·§ö¬GS8‡3T{“rW+»Œ„î,Ã1bÝB±h³ðëËŒÛyâ²ÍÄ”¸X¥òÞ4Ù?mýøÙ…[Õ™”ÌÐdƒ6z TAn®”æ'ü‚-í“ág²¸m9C–ªbn…˜—uf»¶ð§a^×ÚÆ¥y1á{oõF`?oŠncЯ¡¸V?H–ñ†¨À=£,êHP‰KX1»¤H …€¼ ºoVÒAGÆßï€:Eƒ±š¹m‹`¹·PŒ\$o2€TsCs¥ È©ø„€Ý [Ýó5šôù$ýs§¨¯{¾©ðÙFó#ݺ'9Ä(n5oM\ðº°YÇ ’Ñsã+<Í A¿°ÜýXÚÍ"93p3æ93-–µH‘S`­µ£B·ñçÞî\]É_¼UаÚq†<“Ó ‘'*²4™Ãè “.³tE Ü-`×$>åö¦,•PP–®×õº–n»ý#ÖUÌÔõ6‚¸%Š¢ ë)è!àHd !#†þÔéÔ“!ª£Û\D7v ²Ý‚éÉ*Æc×u6-!àÚŠ†Ä£+¢våÇ~­¾þ4/hˆ€vÙ¤d›DÂÈZn@‡ü#]º£ •€b-¤_¢Ô¶®«LèÇÅh²- »žY뇣£T*‹`¦HbéãYo,—¸á´š…S:*ÿÊhH*¹ò´ÖéWÀpšÈ°8^Ðˇëé ˜T”4¤#¾ ùãeäÕÛ©½jP.ëZï• c²ÜýN+QÄ™tE&#âD=‚°ÞQ‡$îfË{’¯âjÕ‡LË‹yËN¤Ø°,nÿfl/C”…G>ßš†/¾wD6[d‰±ƒ˜) ;üÞ½2éªi–µ¹ áöBë4Ú×=£8 ¦³qF6¢fç)ù¢o³Œ,™Ï«/Ä'c1,c<Ž[éömÌ0GLê-U`Z»72žZ+CŒ»Xð¾Ò›mtcôp¦h¶U_SחĉÃõ=ˆ¨ŸRTGËÀÜ Ö~Of[ŽU %jÛúÜ­ÓþL9åÓè±8ﳓÍ‘O®'÷’žŠu›þ»R °ÄÃŒölîË;òTQ«ö æŒÂ=‡cüRk…J1–ëZî—-7ÑÜÙ?—%m%´P®×'èç׌x:µ« =´v0í+ùy«_ºÚbv…z¨IBžvnVwC@õ¢ß «ðÁùƒ&=.§µ u~“ø"m‘¿P1*’ÿÌ#Îîè‹ü>žóK?íúü:A`ŽÈjáâÔÙhùiåiËÿ;øZvËãÿ|môVï!FG ÆôË"øfí?Þ<¥ö¯Vþ31ÀoÔ ùθþPSæwÓô¯õìßVUÿ›‹×ÿ×½ºÿ€Îßç•ú¾ImW¯Œæ¼3ºL@P¯x¬/¢˜òùÃ…^ÛÈy›rå¾ÖEÿè-š4¿«jeÏ‘j(øqì*Ç´„—*zÅ€a:ôcK‚¤˜êÑ;W£~ ³:)ó?¼ç—ÕöS?•ýOõ¿[†Ðc =öÜqTxŒd´ ¨GÅŸÖdntàgKRGÝþêÇßk:ÁßðkÜT-Ä)Üã1|mäB¬mr¨¦Ôj§ Ð1ñyüãÇÂp蹂ì.Æñ<@BôëCóá4 fo€+¹ùr„ Çœj@)H5ç¶Ä„Ëæ(bNnoâ• š£E¶@¡o»ë˜Üÿ$}vì "6íÖ1%¹ÍĘ„šÛÞs0B³&¹m_wÆÃžZAÝÒ|€1ÞmºõÒM¸µOhO{‡¶™ˆ¼DM£Ùwf_¼îW….mYËELj3cSºDÍÜ›ŸzfYšw— ¸³›YÄGãké ˆ&¢€$21m)þ¼laC¢”Â÷CV°eølc¬Tê廪9b!y“E^æÎÓOËQj䎯k­½Ìgr^/¼£usç‡fªW­¯Æ¯ßÆŸwÎ#T’øiåÇØf;³þo!i ‹²]ŽÔU¹ÍöíL ®k¹H‘·ÙYÞ¶I{¿ q¨l‘ $áx–Øh°(êÚ´h2’ 4UÈÛ¶mƒâëìzAdAö £4„gÀŒ×etûmV}”·˜ÒaXz½lß(Ñ<Í·\~ÔP§nózx–ÅG°0Žf»ÂÞŠ‹J¹mr›ø0fAo'®;êÙDëÄcvÓ¯|½·V¨èV•-â°þÀ€ÉE÷S’™+)1 ð¹ÑK¹yIþPPu-9oÉÁÇŠîg¾ß÷¥ØY”™KW{’^ i#6Û Šp/M"ʼn2:6ÌžQ¹¸”x_û}oq¸–áxÇÞq …âŽMY^O3§)¤@_–ãi¦Ý…œu®y"; qw ©âœ ]Í&°°xäçøSU !'‚›„àJ£‚÷W‡tçö-¼Í‚ÒK}ÒŸŒ ˆÿ _ªK6!ö™ Zcµ¹QèšuãVÑ4ÚcamÓ%bžhr‘“{Ó|òNX»ïQíã£á¥>ÅrQ¹Y*JìÍ~hHqr!ÆxЮ£:.`çã)(O‘ÙÒè‚MŠž ·ùïÑF &yßonÝïJ· â [Gtµ½£@¨ÉBá}.WmTPªPSD‚03*žÚ œžÊíã'ÙI؜۳‘Su‹¢%ƒˆ:HÒ~ÙÔ@ǧiÒWöû~›mÕ%Ÿ SÑ±Âæâj¢â1LôôáBHn£ÂhÝŒ9ª¬KOl£¸ YHœÌó|0ç:T‘˜ºFÙG^ûžÅPˆ)P‚ô¹‘åPpQû!ʤ#ÌšC Ñ<#9ºlÇâØA› EÈ‹!·b´Æ…2‘‡›GkZôr{µªæ\¥ÍX‘¶©cõ¢±‚Âô|ã›;9±EªÒàšP„c®Ñ„®¼=ÃòNŒø^€œD¶#hG§A£þP6Š˜CÚ¼/yd‰|fáCµË÷©ˆ.øxö£ˆZ±ï¬æ€‡ QÀŒÝÛ‘]Š”¯¬J,2‚ê]qÂ5ú¶›UæR~þMôE’-Å4ƒˆýáîQË‘XÏŒ]ìãpû£zŸŠ" $ŽØtõb&QHý{Õ¿ÝR5ÜaYí%‹¥‡%}ú\¬çwëûô,=ÿIJò–õ_úxÜb¶gnZ¤ù ‚ç‡Ø“ ˜^ì§N­Ö´kÈŸí{ïq¸øeføðÝnuîœs³hÿˆ8+F:ïà]—Õož›îÑh€å<^ô.ytÈ«&¤”Y#°¹•E¶±ãCZ­ÉlN|2ÇÄsYÍK¼‹Brð2}¨¸—ÆwõLfˆŒ†áSª&JiîxC|ÒšI  †àƒ‘†>®žSYÆð©L¤Ì‘3¨ß€ðë‘QÞ0Ïç#5„á-ÄÓ”‹o‚wì[ëmœ,ÆçåyN;xÎ! O}æ€ùTMx«x<éBqE½óèýõðì žŸáǨí7¤MòWÒÿ/Ôÿ³cá«f y$%þ¤Fõ/·ÜÌ¥þÍü£-ᯜüë_ þƒf8¡k¿ùæ¢êù©%Y3¯Y"Û6mfZÎ5W‹`ûñ0óýäÄQ8l0ÅQGjñ…柣Š4`âõåìïí¢XN ô8|ï•FØ2sO¥ëpÖß½¸ äyF™53ÇÊ—Ì|>ÍøéDS?Ó&ýý¡¡Ç2ˆóá¦"•ê£ò÷ëZ> àBíÙP P¾ è-ÊA>Pñ6ÖàºöÀnð!ç»j¤ŽO±Yó­ö‹S¿ãË:‘>“·Læ‰Å†üH¿Õ‹69º’âHñÑ,6–!)Óz퉒¯1öѹñFìÆdoÐŒ(\k&Uê |Œtê‘]ͼ*PïaòÇnsS²lNçó‚S¨!úSõ´U.¬58õWÜy*é}Û ÈëZw-•ÆßpïP=H†¨ô¾9‡0- B9³ÆWE,}Oí®ÖòÞTãuy(Qűèš)MŽkà›¤ÆE<úxѰd·_ì£iR ßy3»ÝŠ–W¯»JWž•k±YT“íw4!²ÅpU´Ï}-7AkŠmÛ Wœ,ýÖ%[H÷Ç#å_·Ù¾M/¨`/Ȇ–Iøß_pÞlÜRÛì}o#ºdÁ;âY*eùìý.•·…à£À~š½ïMÛr‹SöõR3ƒÌý6siÕl¿ï°E›ÅÈf<é¥Ã!Ïscœ3hs¢ÀnЊ/ËÌŽAIOƒ“¬ñq±>ZªúÒTàTyÛ*Ëä&®›ûråB/¨\nq¸«åE„Û‹’ãî·ÛRD[Êö¤ÆÏîg“{ßn=­ qÃòü-`™ÞÜñ.Dzƒ›vûE'²T×µpÓ«À6ç'{ ýòˆÂm¼ï-]Kø¦øul1Û><ˆÌOwÜ"F^ª×#póç}ßkù‡P¥ÚjÅRpÛã6¡¤‰Šlî˜`cV¡žý…äP1šÃ1vå`•Â)|¨ày ;>Ü6Ùãy¦PŒGLôÀv%CÛÛ6—õ»Ž éˆŠyƒƒwbù0Ä"z[ wŸè8-FïE°MD¶ÜAOQ÷²3Õ±Z2Éí–|¨ª-=D†Î¿eIŠ·*+²ŠÈ5J<ªó!F^+PKroÚ&ÍK ·ð6ﯺT|‚Ú°ˆe¯K±ùæ"ŠšÐç\e&QÃWì«ÀÒúþô¾æ’œædïe¹—º€R¾M23‹)í¥Ø8Ç(™1Hª^šUBá¬áu, ¸ª\ ·ƒÓ¼ »`c%¬@/(_cKó«F¸*îÝY™B¨ÝA¾ÉíNµGéFÑó‚÷ä4–Ü J–)vص…„,ök‘mEÉ«úlß6( ff ×zøú£ÞjZÃ?&¬sVŪjäÉ5O|J:¶!jG+²œ:̨Ĉ„¡¢ª'3Åã{Q§×”á»·ÙÞÇ\¬hJˆ˜d,mRÃ)Å8´,hå/{e˸ɰ/çq¦Èâá…a‹lÁ QHºº“Ö¾™8ÄD Å ”ð˜ü”•éþÏ}x^އ¥ýôå—>¤ð¹{5PR¿°ÿsÕ³ü0M iÏNÑ#´*g\fáZ³DÆ~ò}ÒøÀ“ ¯ÅAaÌäQ²î%ĵ™Ò»J:¡“+ãã\waÌI„Qœ\Ôó€Ô´§Mý™{w»b Ës*™l³âÙžþüü²ß‚Fÿô9ŽÚDE`iÓÔ¾ýÓdáۢܣђEFrZÔ!_*G³g\ØûxþjÏÒÛÔ„Ìœš™"É?†dU:ؤ-„òh»’fãж „«epRÕz>ZsSÉù6¢â$km«v|‰:áx’9aÏ¡CòI @9Ûű¥Ç—Ê-yì3f´:v¡ÀKZ›Á#QœŠŒxAt7¶Õ‡»dX:iη*í¿ÇÔ«ë§ÈhB}¨úðâwLˆc!¬§ˆ-â‹ö>ç@=ñÔù‰ðt›!®á™…}§æUÛµ‡ \¿®§–ø ?kâ™+Ît ¾™ð@7ŸÊ娌@ïÆ!ÿøüƒŸZùÙpñ˜l=‡E`ªÖŠ4 BlÈbYÛ_HÏtÆ/|Û˜†¸ßU—¿Š^_c ü]Í¿'«þU’÷G¿1þKÚðÿAý_ÿ2þ“ø»>‰’ª4üD§êÞ_U'$4;U0ç÷ÙåV6|é8Wkšžà&.åªL^>‚Ó< ]²qNºÃW«)^bB¡•Q`ð0&òš?Ì “_‹Ò‰î)ní1*È=‘KŸÃWtrÿ[ÄoÞŠèÊp•O;ìãCœ¢H¼´<˜²Ÿͬì¦YùÛ;“o]žè± ¢mÛN¾mœ’8ž{›ÍeM!ö°·gõ.c ~6#%’_4ã z‚9bÓâÌS¹7Wr`ÁV b®rVÀ¡û£<ÔK)xÔþt}Q´Öd!Þ1ã¾°D°Û¶gÖZå¡ó™;wÉ•æ°È¡¯Èj‚ Ø¿„œá²fÌpØÉ)‘ÍT¾,„í={s¯™ùŠ,ÀœÕÏrŒÉ*$”²™,t\¸Š®ªN‰qLujF2½‡2Nk’Û'½ z!Šf&²Ô3?ªGz’ò¿‘í ï¢"†hÃÁ°jbƒäZò~ó¶(:ÕÂR1HAëZ&Mfö ±<©, k0œµB1rEƤ~`U¹ uÐêÈHoçÙ@²½Ö,·ñq8Òïé•m½&ä¶Mã6¹÷^ëZñŠ"¯¥oÁ•ykŠ hÛl p­å›G«×µâRPx¯[eQ›úò‘O2LÝ˼%Šê¸„{Ð^µªòÕõ¾k Ô˜”ø<Æ‚j#@𝼑sR7_qGMH>Ee-¿u6ë;óÞ{y7¼LF{¿7ý£Ñ帢Ê"œ÷mòŠaŠiÛ›á UÝ{‹q“ká2õÅ'BO*¸.õ©ÊOrr×HٌÒS‰ó™æôÁFWºçqÅœ‰ÆÜA±¢õ2«){NS„â4¸J­éãíúð~µÖ™‡Õâñ ñFSLþ‚QDl‹®äW}òårÐeòTƒF9جš\z¸ iæ·IXØÆÚ{ –\’w€àñÃæÌ7: êf?oy-ÅZ>p¹ãSSËɸ==Q¡9ÀŸ…" `ôX¦ro[Š’‹p¥ÛYÚ+Õ¤*r³·mÑV>³[îíé+ý±´›*#÷Þ´: réj·tÚQò~d¹|‚ë ³C,áIÉVT]º×!dpB¢ôSÓôoi[×þ ÌÄ©þ¨,vQDk :Û °Ô¶3.ŒÊ .a–Û3ëmÇ#1Tg&á‘e²ŒPï‰ÆÀÇÙôuÙ€œÚ ¡5¬CÈ¢•ž©àž—8lÛ²IZ“ûX/”Õ”5Ò–ûL¾°Î¢¿¥89\°ùšLW3‹9a½g“ Ê˜Ÿo@jÃ<6âCŸ²2Ôs¸·‡KíiË߬èÉÌÓ^ˆœdäÄ´‰ šÜ1“fjX¼M©¢«Çán¢Cª™Œ”2Pó”r™ôl@¯`olÐ5ïi æÈKÆØX¯6*I=„·E, ·OØñõÄF=4‘yÙh¦@šEo¹ûÎïUMë¬äi¼-NVyEö–þÿŒÿ¶Ì©l7aÙÛ2yQç×¢e8[“ŒwT}¹šecÍ.­e¾9üC³ÏÝquð&ÌjÔ8pê?ÒÑxHy—$¥Æƒ)#†`Ì2™ï’²eÜ77âa‹'’ÜÛ¥ö–ú¾ì<ÝÖ{i2wàì{2~§Ü|©þwH@BhšCü¥ëÍ&¼ôÓø^s»ñËÓåžÚiG}|Ñ0ÊxùÊfAKŒ”£Ê<ýG¦È€°Y5ÀHsd‰²‹kÿàÄÖ{4 @1~äܼ^‡—ïq]¡)İ[´ýÆÇ[3¡]ci ˜Óy?Ë=²1®ì‚ƒ.€ìÂᯄ@öbRª?¿aFoz3éTr|×ïÙ‘£¦û9>æ´¬âc¶Ü‰”r³X¦Ÿj‡Yô¦Øä”‡z$|üÛ¯~Ú?Ò«q ôúcbC;ëñ]¡ä ?ð#àЮd>¿# ÿã‚ò—ÎáÏœþ=Â;ÿäõýûÕüIGò?%Y ÙüÏ(àŸ{KçÞøU·‹*o|m²)¬ÍHì*Ê3Ì×&zQDYR0Sšï½ah+Râ,Ò\•\^ÞŠ´ã+Ç*ÀPµ'ÅÿÔl"‰kUF`[ýϸíoÃuŸÖk°§ŒÝ~ýuù0þ·¶S›gn¦&üç‘ÆÀSÏÏ™vœúñí"À9š>ƒS.)§íû7³ÚÞf¯•'*ï½vï-•{åöW¶d13É_0­j@^µ–bk&'šRmÕE'Nö‰×¥[àå«þr˜Ó£lÛ·á%¯%Xà^²DeáU«fšŸ–b¿#£K×+¬÷T5·ë^ÚH§œ›^këºôçû~ó^{aá2±m·70;°×ìý“€® &ü¹ã«,õ™fjÃÜâš?ºÕoäÝ6’ùdÑ×õ7yßoÞÆM¹Ü9$h(–øÒíC^:}ÞMÿ€lRl/÷Õ —tçþMÂP”.šÝËb¨éþÓ…ÐëÉ}³µ“XÞ*¨£ª‹øiͬ4«;åM^tùn=ËÁC~?ÁÿÉ®îãdVîBšYu*È6ðZ—\®JFæý¶½ gö–Ž ÅÀɨ¢ËMCѧC¦óXGvˆmÅò;0d-U(ÔDô¾wG¹@¦*˯…:´õ:íómÛs þ‡-Î*bP¨b‰z†Æ½eªäÛb¨¡Uä$|ɽŒb²`ÂÍ èÇù8xjY»‚Ó§¥Ú%¨noŸ2’£Ê¥Á^ËÜà ©gLd(ÕeŽ-ƒEÖŸi‰‘²ÍRJõ–†³0=zºèÙüñ&¬jqô«’+Ð:U6gåâÒs8‡^fæÒ]aäM»,šS꥚q!²qÛ 5½Ý%Á!´¸å×±Û÷ØY‰oæÊ×6Ùù6Ù «ÓœÔíkÝG1W5×;òÙ’$lÁ ?˜ù¬ ѵ@Öä¸\–~…˜ß˜=@7PÕU˜×±Ô|ªhÛHÝž«’7±˜ ä&*­{ÙÈUø©rš`šG‹ÕܺHŒ "Òbè¸îTµÃa˜Ì±'r¯nAÉeM~‰ê×ÇB0ÔRS¿m©£*8q´x§"ñ¤U©oK=ŒI­A¸¼{К«>% f™uwrLp-Aà©’b ­,§–æó£6±d´®®åÖ õ%#Rß(ß Eï†ã{¡‰˜…Àþèq£Çã¿kžà…cµkÝ[G  üÃøÁ¯+5¿ƒíÞ6ž7Á‡;ÐU¾|0 ÄàR8êJcÓ&(ãÑŒm³E¯j­H›Mr™ò»£¢`®¦ãAú¬ëaèc©°a|êsN ¡]ÎÔpÎÃkص,Æî_§Æ…ó)¡Ò)VNÿ-ÐâB‹W™Cáo×Ç×Ô?\³ƒÎóQTCtþûGtIÒ3ch9ý­SÛÊê_y€M²+>ˆ SãóEy‰Ú¸0§§­„L3ZùHnÛV·ðˆ°pxÿ»žÙ ÑSñ‡[|LOelå§ë×Âàê?O¦ŽØO·ÆèƲ’Ž(UÚ uÌÌ–êÿÈ;SDaÑŸfR„ý~îÄ<<ÅYöRškLBHf¬e=È­q¨ÿÕ]Ži†ªæ :4ÞVÿÙZ‹öSoÊ“Pñ¥Ÿ”þòQ!ð¨`9&•ALzÏ!êc4(`‚ÆZ+Ìä/À× Ž#æÖn|ŒÍôp¹˜ÍGóôd-}h@]üÅÒð­Ú9SD”G¶ÅH51 ~Ñí¶ßB@D¦1>\ÔxÍ ¦‹ç—ªèr ?èÁU"ÓlÀñ¢æƒø…MFh{á²s_ˆ.Õ`*6“{)~ ßÄÚ–X¾WÂ&ÇîíÈ5Þ· ‰k©âRø–É%UˆæþÂJÇIܬmÿMK×R½üp Ä‚RÐ~)÷ê f¬T¿Œù aÑÉÂ5Yé4‰K‹MÁvÙÊËíWU§øÎÇÚY…"zù\)÷œò‡VD)õô1ãÞF•kkZÃh@dñ­uhóã|¥eêXÎཤ£\tz׊¬Þv«µÀØ8l—Øæ­›ärº}ðâ‹+NúÊJ`Œ‹ ÉJwŠHÓ®+ + j?Rqf[#˜%úAA¯¡‡-WGKöÞGð‚¿ôâߨ}ZY±BnvMŒ”k-Õas ‹äéNfÈ HξôK=jKÎqr…ì(Ör_2áÀYH¸X£ 4Íq“Ð2z”Á9ˆúߢ&˜sœ·a³ °Ü(EJÊS{l†T¨"oÄ Àr—ßl’c6\ÝîA$N£¹·˜ >T¹€ÚO»jº#­²ÁF>œeôa—k€Î°–øT»1ØÔ´²j§SŽ©ÑII¬½ƒmEªŽ(h#ÙeÝ(Œ#T¸…¸¶Ü޵íØi’o 3Q¢=ªÖ5’@ÓŸ m1síY,ð ô•Š˜ŽCF;ýEŠDO9ô_r~ýìË*€H48Du{h>!֦Ѽ“fì4Cäà_©A8&^Cánf(O]L(–ìžvÔÑË@*ØŽs”˜ùÅŒ±µ Ö¤—ÌiiNXÞö~«l”°* ½#±,Hô™h±ªpÀ»WX3—6ZKðШi¿ùRÞyHùæ 0ùK àˆ¾öJ‰xCMÎs´¯õP—aü°û¿9¶îKá]u1Ô„gßõÆY1z¶°àTaâVÕ“ð«¹ô»[ö“¸rÌ 0‰ÅVG²ä—ITʇ;P¤˜ã° fd©I¸-áˆHé~h.!BÃâ*½€O-œ Ð2™Á¦aZ&9H¬§gµ€¡Æ†ÏKìô‰³ªOD>ð2Úk[¬ÆWɱÕajV~R1>Ð5ýÂ? *Fvá¼0€Oé¥Ä™Q<#Ÿã­ÀµTÞè}|Ó|–d2Y~ƒþu<úryÌäz®¢œ(¤oÏudºçŸÅóÑU.üæ„•ßÃwü Ñó³æ÷!Þã‹0ý%ðoªùPï¾þhÿ&ñÿ"ýëÕòO¼*m¨Äÿ¨ü¿ÿg¿T¢ŸH+´V«™0ê7F™pÈRy<™ˆ_DU/zï§~ZnÑ¿ùBZö­€øÇüÄ/ß}‹˜ê“¸»º–a$xgºæ7¿>‰miç—V¼dÍü —zzòÐO-þhý­Ý¾ŒÇ7òÔ3XæD™5Å×uïX5ñ«)®!Ãq8p­à}¿cSefªšÕáSÿ89}ê&C߇ ©n :Ôpn“–’½Çë›YJ“||‘¢7ÌÑ…1QQÇcµûr"œ›¦àvÿXm&™oCoǃތª•“Ð׺¨ËŒ›Ö|&#;Ηõ“æç£Àv»:ÄÞ¹ô#¨Qð‹‘ûC÷J#k:Mi‹^3›æ2– +Ç-xô¯8ÙLÑÚ´ÕqGçf(7“f&¢ª¬)Y´ Pá]TÙqdB½É&futWت¬H×~Ÿšý6 ­}vÈ­ôvewEÞ‹"²7—r#’ÖêÓ%]$Ŷ¸:.Ê*<ª" ‹ÓZ յͽÛn¨å ÕűŽXUPĬ’²€·÷5Ê}S. ° ãæ½_ëršÿÛ("WvÁšpA¬ëµÖ6sqÖ¼UpÓb(ÁÂ¥ŽÆQUÁ’ûo|ëý¿^+ê¾ÕUB‘¥²íçm?UË” éRÁÒºp4oõ;uÑ8Ö3šñºÖÿùñ”ÿ÷çÛÅ1Ù>:JPxZkNå·vÌl»æA‰$ Ý.¸-íÀ”%ØAËÕVŽˆiT1K•±$ UÐTVºž@Dlo±¤À I™åF2|ýÚØ~Vu)m›· ÔlEE¹ªÛR¢k»rIwÕo‹\ê’…uÁ rï ·â¶= GðËVD¹¹ï·??ŒÜ÷¦_€›Fãu-†HÜÎêÆè(͸òiVeš#9ob‘úuÚ!%>ñaAœÄ‚i¿Sça¹ý@n؃&§òºT.YB“Ç*„Ôif+;×Ú.(àÖõðYÂ^»3µ˜ix_U¯¥F®n§k6,¤­É¢ÅËöE__€AšÐìf÷ºUÇaxMjÂçuœw8¥Ï’À¶“‘I oÚEõ¨3w1ß{_º2Y§0»ýoéÝ«%Ô„”{oV†Ÿ,¢^¸)K("Ôá4sPL†­ê›dÔ”!h홪°Ï_3”cݧ\”Û=òfDû„á§8ܬ=ÔмÙwG;Å’ìã#¤²0HîD×ã¹c™ºCÍÐJ¥TÕC¦q\{éøbËi¢PSó à5Ëjêjîºt¯éÇ‘¤‰{驉Áw–}(¸€‰ötY~ƒx®‡#˜‰ƒzáƒd'>1Ÿ&oÎ U¯n»ãÈÚŠ’;ˆj;ÜjNýcôúæ“ÍúJJäÇ Í†¹{ÞÃFËFèìÓ8¼†„ÌÒÍŒ*PNÚô¼ wBLš-§šûÀqq¢Ê“ÁnH±/Ï&üSfKléÞÍmÁQÑO–Ú®`?ÈxÃkЉ ø™³Ê¶šXœ=üŸºsK¼Ë¹¦¨sÛëúòEÀºå:MàÈk,GmÌ¥@ûç[=žÑ*êÙV‰V˜—âuKñii\ªµ|·grÛwkÚ`[8c-ZÕù,EñÁ,ƒº£†S†mÑ uœõ0­¸ŠŒáALR’ƒºÙýÝõÔ¬rMí…&Ã<~ÇpøzåKA'9gÍt_çõËZç©c¨BŠÂ¢ÙÝÆùš÷”ÄÚ}ñrj)9ì9¬±ÌŽnÌ~o´‚œ©Âé¡ö>“<åü÷$I±&:7L¹¥ÀCìVý aÒ â€cáŠz ôˆ€˜_¯ÓïõzµL¨Ÿ¤²0UéÁ$…©+{áp,挻~úb¨TÕ ‡1‘1"˜Oÿ/êÇz6…}|pÇoùxFæÔ üCøOýæõ¼ýr˳T¼›‰ð³·‘\D"°ÿm$ž†@èy%‰`­|‹o^Ö”œ='M’:ˬ“ðIà¢î:û…lej¾ÌÏ‹¨ŠGˆ¨1Mc1°ª†Àˆ«ER_³ÌÖm‰Kí¶š²¨4DÊÙ‘X`ÇáýÂ=pñŸÍíŽÃ5O}n4ÛôûÐ…¡ÙÎã8ó<æ§«-¤Qµ¢ÓÈ^Ýp4MHõ<&«xZNZ$i¼mœµ´1 ¡¨f÷^'`´ðþ)Ý>p²Hä.äA3×Üü¸ïWG•4\s­jè6Sê£EœÜ̼Ø_ÆZªËF¾ô4[º°ü/:ç[TÅ¡²‰Ž÷k;ZË’#&Ít7Ô_…’b²i&!b‹Q—®2pqÛ{¿7×õZ/`ÛM³ õŽ ƒ±Ì\æË!ˆB ƒB¸zGge‚L­ˆ_X“ÛÈ·wÉ¢½°¨7öMy嵄–k²z$ˆöãXÖD]UÙv)Þ.Énólûü¯×e÷†Š¿Éx¿o¹D—®¾kêt¶ŸÐ¨FöÛ" »4— ¾;†_U›¢+‡®-%1^ôâ^‹cY,ÜiÊö·ºvÎ_G‹D8m¥fÂ{Û¥ åo â þµ½È§Uš 4n1l‘ ÑL®X„×Ü^ƒc–L[‚kaAë¼·+žˆÊA†B±Ó³Í;X‹í†óBK:l§Ì‡¹ÍåCÑ׃õbòòNPFGW»Ì*¾C9F#½8»yŸt̸ÇLÃ{9¼â8L 2ÚNûáœç#Õòô»öyvs´þÿÉ¡ªxÚTÿ”ôÚH/ |V +œ’÷”v¨jò‘Æ,©nX}¤.oñ¸è¿(c8Ïñ¿ÓðŒîàO-ýYÀŸjÛü¶Œxþ}ªÿoOgð×~³¿:Mñ ëqžï-ωִÛ`ÍJ`9jIãA¶ôøv3íòg ®D½¢ñ˜Õµ2.å ÃÌþE2 ZƵl©ÌqÃúG v΢^¦!ÈÌ©®ñXg6Ñ1š{yÿ‘ÛÐñµÂd Ú¡YòV ~ýœ&ª½qlžJ=P攳êøÎ>Ö |+DŸ©`\^¦§Q´_Q^~QušŠ”³,Ý‘h«½n…ÁÔlÇð=ûÖï²N~ôð7)F¦Vü%”÷NUwØúœÀ,Û ïø|.ß:]YÈJÞˆ˜S¼?O ý sƒ|ZC! qßk_„d'ůä0 ÇÃæìŒŠˆS9ŠóýÙç¥ÒÈZ&v¤cCâ åªYåažR §x}8d”ÛNŒ!é{½?™t;Ó&Ÿ͖)Gqæ¢ÿ4?´`K6“¶¸¥ãZŠ ¬•жMæÒ·˜qØí@›/mŠòKö¥IìQ]™Ý_"»Þ•kÁDì¦ïlx„ —ãöð—gÖçnÏÍë·boˤ¡Q€…K²œRhÛÌäz-W‡ßä奲¤<‘Ã@ŽÔsé4ŒpRÎÿòã‡^ø'Ž™\"ÇÒK‘Üô¸¶ˆ Õºj,÷Èj臈vèÒ—‘À¾Š“Ík¡ô"2ˆâ1B>òµ«ÄbRQ)ÿsËž'b]ð"‰5ª¦;Ó¯¹O$¡1SÞâ| ÛÙÍfÂ¥àaæì¬+÷‹¤Ñq:ç1ŠsðM¼—ÕÅPÏõ{ïh$ÌÉKõ¦…„¹y©Jú‡! ^ìwm"fcñÒK/—ž—ÿöëÞ7!¬hé‹å¾}]E ‘Åëßýá ©©±²wŒœŽ…zÐ>è¡nl£ÈævôInÙË3ˆ„ µ©û¢ ª‹üe˜Kª²ó•»—e»‡.ä…¿KÅ–ŠE–$Ó(iéÓ¾Pu·!”™l\K óŒÚ‚.Uš@vMÓ˜©@X\W¤¨¤^,jÈH®ÑãÎé÷Ë™±ÑŒXX!¿ÇŠÙóxŸNA'N5DÑ» P¥©¨?ÆÍ/,—LóY¡†@ÑU»¹›[^¸ èRÕ%½û¬9@ããL.ÈòÔdrœ÷O×Ö‹¹‘œŽ9(t“m( jØ>’­t…*ƒèHIJG7â2½ß7&Þ[U7u«jÍxÀ_Pþšuœ1ÆÈÈß;Çm/RNﺉ,k{4z¸Í˵&Ó¡”hŸVÇ!¶åqOúþ¡P•‡wÃèÒT6_tÒ¡¢4Û¥F$Äío»bü˜£¤QDäô¢¸ZÐûªÆC±ê!ÚPëJò¦£¸ý+¡DT$½¿Cm_i'FãÜhšÌ²ê“à9f¤§æÿQ#J¡|:¾¦ªÆ½QwÌQ$;xV<P䇨åÑì‡ÇHð‹ÖÎÒ¸Â{Mõ¿i¨8tÅv="¼…ã&;°ìC²ÄãøÈ‡Mø£Ìy&šO’R‹AÓ‰£E˜$‰~ÚØ1Éi¸ˆÄv v9‹ªBãîDSnÇ-Uti–* ±ªcÛ1Žõ¡ê @ó2k0=pbì<8NÓsh2Lâ a‰ì91͉Ÿ–óa 6ÉRÄÇpBã{åÉÍ%r˜’öÀ ÚtM0žzNåðã!-gô+¥9FOXÑ„SFˆkÀUÏ?ͧs#tr˜Y{„GéFÎp@}Hò({é›RF'åçeO|ÕÔgÙvÝýÑäÞ”Ï 3O„5~áè?_çŸèï„ZýwªÿüŠëøjæôžýßoÌÿo<øg>Óù¸S¾A»ŠÚt3žF¡˜Ë(ÓÓ@Ïò0}lŒsš Z‰²´d¡¡ Ó-3’žÜÎF!}a=Ë£šŸ³{]ᬯz!ehä«–ôáý~¤õ'`ÃR`T‘¼ÂC§:ŠÑ'|~bh>Òi•žËëã_G7<ŸÓ…‰þŸk%>æ|"¼6y‰è™Va`„Dÿ|åx8ý?ǤLRPññ‡³VÒ´Pâ-h)i;ÍþÛrT0À ýjÚ^`¹Ñ’WHåÌgÂÀÇfb”DÒ¶¹™WU—c†+®‹nŠ®âf¹âTã@ƒ Ü$l±`Ä>c¢ªµ²|½5oi DU½{^G/Øhq" O®’%_Ý2-¢Š £AµãêÇs·º»6KÇû?FùˆÄÊ6÷[u¿b;뢩w<¨ªçlÛk!õÏlç̹¸hVñµ–º›·08ÔÊæ^ fDP®Êa†èlA S¼AaQ{à¶u¯œŒ_w×ìZW·Ê{©ÌrÛ¼•4ÜÛ;6H®¶Ô T°ELpá6Þ4 ÁƧ„Y.[gCÄÜF±ÄÁ{y­"”'¢Xf¯äðÑáRlQ'¦P¼ÕCD°iå±ëí•O_}¨ìwý½»Á•eò+FoYù2ÂãŠôÈ‘èÄ»¯ÂfþBds’Úà¯%'½®nJÄ D±üÍ4Ù¢…%Gðæ+ñ€¹aé±w_ÙÙÄ|p’ޏ#ÁT*VNj:eQÖÔdõBú4"¥W¹ —AŠæVÖ¢QUÆO2ƒu$£ ß‚4jA¢/G[LÝXvûqN¹‚7æAJÈ ‚jrÀë³ì9„Gê\1E\ÆG'=ëèÁQd.Sá©Ìüµê*gÓ¬«Y‰Âõs¦dÏYH@¨ðÆŽ€g¶ 7¹Ç¥š¡˜ü‘q^c`é0…Âxh“}úÌ^ØMÅÿ¶þ~aÝt2<ÑS,|*8`á©7ƒe­AÖ„Çgbüö÷uï¹ ¡€f]îçªC*‹Î³Ã-§­ò8\Ÿ¦9ØÓUWèØÖMeÔÀ,æÊv¡?ë'¾ËÛªÑáÑ5Ñ=*žMåŸÅ={xÕ‡úêÝ…CÎóòŒJCçñµ9—93Õ>ÿìÇÃ_Ïšnw7& ÏŠ¹Xü¹Ìù(1ø¼?½ý_Sÿ„”ÿ—å³Qùÿz]¿Wð_PçŸþÂÊàëà _Sr®¥!R£•gtpÝ»±Ïõ½zl§Í6âþ­µV‹/Òúán‘QŠÂpzæJ®‡‹@WvÁ¤ï~BRü ãM›:ÄÙ00úϨB ô}£´ÛD§y?wò£—>,ÀckÚ¾º! '9@>Ú}ƒ;Äœ|ê×áeOW£ßìH½Õ ý“ò_Ÿêgö¹ÌÌuˆâí0q›Z¢i?KÚ f IDATz†ñYçÞ9ñ€¹bŽLìº,áЦ@Q‹²…øx´¤¼áÖJÔq …u¤;œš€Œ9þjù¢P±TU(ªºïÂpjPèv°‡Cíñ íÌ>éÖÞÃušN¾ÿjÞ40ý4•K5#»ÖÂDoŒg‚\Å'ºòrGá&Î1/f#A«¸ƒ|<ÔÝ}þt0W$\ïaV‰"[ˆˆnÚ™aéq¡FÑ_B­§÷°%­0-KØÆ4õšÜÛª :¥EÍY&þ“8¾J±k˜¶²€Y ÊªTÞ~õËÝk%ºøÌ ‘¥jä%o¨°½F¯¨Ò ß,ÉmFdÆ\A‘{o¥¿ªãVŒOE.È=HôfÛÖ…ú¿qÝæãÇ%‘ùål_G8Yøz…覽mx›zA¬k‘÷{»‹Ê•nŸÌäÔŒ.s^*BÙ^®`&ºôZ>œØ4Ûv[ßÿ¶Ï‹·‘ÛÞP+À1=ÈÏ0w/*C#K`Ðý±À…[ÈŸ  3ÿ$†M LED®Ò|Œ)Åëj¿_ÛœqÝ)ã<ùĪYvu¤õ@Üß¹ÍÜ~†+Ç…i+Á0åCm)¡³´¨¹æ‘f˃8ayÿÖ…þÍÑ.íÎR¸#,DÑÊÃ÷Þb[{ï÷¦Ñ–®¥Qd#å5’¼)Wçî*|—•0fÁc ]ÉY+×eDJ$òÉ)öG¾ d›E©Ê¾Iæ à(@»ÈG4 ÜHÞ&ýrzƒy#Hš¥”Ê4b#\·^Ý`´•eÀ$·Ñhé’öå.¨ÐèüQ‚aòáÕG8À„›v)^zmÛ;-º¼¿D‚“×*9‹bë%÷‘Ë©XMkž‡¯¥²ã7yKlrxÆbœI`ÉŽÂáF¾|˜Ø6¼¸·óÍR”…–N¸m!E(4%7Æé´ê_Ä &Ž ês†¿ee €u,*r[{§ó¯4“õíÌæÁ{33•aqÍ8v¢È:b”}ø5Ÿð¾Íü ÓLϬ¿ßg·Ø‚.Å–åþMªú7ùhIK˜“rBÄ|:•:LíìÜ[ï:Vå'Â!©Q˜eJšÛhORG\‘+Z6cŽÉì蔓ÿƒ6–ˆ‡ƒà?§NœÙÄz®·ïfا&çó’MY]d˜U*=FðåaL%d§|÷ªF AëQ'Cáü™Ò§Òxñùï]èÄñëGÔt¶A~ƒu6½ç]šBRdJr°Dfj¨&hèAF}ŽIQñÝSoÀ1MM¹ÎX·OFÉnçŒñZ|Œ¤^@âMæC2ñjmZÿÍ—©!ÐjâÀ³[+z:_–c๜á†ÁDÇyT×ÒÙúÑÈ“F¡X‚v¬&þfÓ¤›GKñ¤É<ýäE\¯ƒFæÔüÅä°À—‰½ Ëé=FøÕ5÷1ÃMüп¢ßˆ¨D–€ üMK¶óTS·jÏ9­ÞS9¹ù8¸OgxrØŒÇ2e´&ÁÕŠ¤!a¢JÓÄ¬Ñ #æ±…z›·e i;OÉlPÈ1Cà£Xÿ3ê Ùv-`6êGŽ4ÏhÕwÈç‘ðÁzh(x(Ç£œL1> ­î?«Ó–ûÊÚù—ßÌÜÆ’©\Ѱá0†ß• BïGÛ.ø0q—‘,cS̘S=¾­Zñ‚Ükè*šê=©7ž€ªXò4ö'_eÖè¡_¡Ñ@=”¿VÀÎøÈŽbšÆ˜ŽÌ€5è͹\C6Àd휪øC£Æ‘:ö^C>’1Ý®£‘Z½xúqAóÌ¢ôLð‹ALmØ Ôã±/],ûç³ñQN5ò4_ƉxêÄÏ1ú?ê¹çWõŸ·Ô_ãùgãƒ?%ñ—ßžÿÿ%þÉ1¿*ÌÿóÏ_þAçŒ/´ÝñÒ4ÊcnLÚk+’dCH¢ÒŠPVç÷p—ú3£‡ÐJEe[¯ãQ5š‘ /ÚÄ,ôÑù8ÏÿdÔªæ»ö"P—}³E¶ãÙ*<Ý÷þ˜Ê}NøËõp†ýUŠ!÷ôôtCÑù,« §ô.˜küÌ¡i>úL!ßF­ý7èHp…ª®ÐÑß[žªz¯Ô˜ã l;8*ŸKU÷å~.˜N¡©Žæ46Ô I9LøÌZ++ôâ‘§¤ŠìF7–ºT¡ƒþÏ(øãg*"©Q•@>žšLc ÎÈŸîq>M«ÑZ¾{ævØÈ½M&:+F FÏÖ×Þ#€Ê ¡bfØ™‚W•Êmâ1¢dîÙÆì”„'jZ6s`lY`ªÆÚÌ–©h¤:Ùç„Faœ•k »ý×s˜–ró‚‹Je|w¹7´•¡ Ýûl‘a*½¤*¡YÇðÇóZrQ ?MWÄð‹$½¥†P#?Í‚>RÛ÷~oª€×Kö½)×uF.Eê žÎÓiÖ~ôh¹—;tbÒöÎz’c! ×6àãBq¥×ÕÔŒkEŸFLÓ#¨…™jÍÞŒÎ[°ªtÇê§ñç„™¨ˆ*(jf±ðfûÉí)ðù„Â’s.àà ­†Ùï=mB@äÄ‘èD‡Ã"ÑTaUŠ%}Õ ëˆRÄ‹¨“|bƒDË?Û4îaŸ^¨…yû”ßÊdoÈ)››™ŠØŽ·v©Ê£q[ŒÇåA æŸy"Ds†Þ^62oOˆqß;“‹ætzX‚‡í›Þsáv…âžê–›ó~+…býJç©ÏrM\£eÄ.íUÍhxô=¾A¥BvÐÞ¶g‘øŒº‹„ ²N]‹µ˜p%¯%îÒv„·Þ’ÛÕDê›m£ÌRN>Ó]_•ðñA²Ògk'ñ€á“O¨ªT½$)H7®ÚT‹æ–Fqj:Ód^f)˜Fÿä¯LÖ‘ˆmHõù¦Eºš†Ù¿ï¶aF%ɦóT`5è1w×t’ÝZ•Ÿ²wZ[k^ŸÕÉ91bï;³Þ&Jžc“æBåO¦QõRÒYÐ5.NËÀqyN*›4 ŸD„ÛqVU“Ip½Ö)Á¼wŽ*™pr®¡ä®ÏÎ5J_ԢǘOÝgë…VÓ‰T ±þ2ˆõ=Èø(ýŒDC܇Êú|Ú—í©µ qµ€ür€4ÊÿÍ9*~Ùð`Ú§œüÈ’³'ľ„?jJÑÎüò®ï1 ë6~ _–-€7ÀÄø…{[ήRT΂*DEyÜ{ÅŒh ùE¬û\—=¾˜9¬pîöm”æ0[ÜÔ7®Ä¥šûE !å» C•áÖ.†] œ(·A7/P'Õ O_~ÄÂFh‡Zš¡¡g‘îÌÓÊȧŽGÓdÿý‚˜á(i}*‘'Õ뛆ŒcRÀSÞR4°ÃˆZR6Ÿ.}È/äm>Ä\~4ƒáB)ÍÈïŒóàœŽË³¼ƒ¯j[ŸÁËZét5ž%É뉚¬ÈÐxNjÏü9ñkµ‡³2í“°õõo ÷ï´½ÿFi-ÿ™f%Ç/"ÿ_ýßäðÿ+æ¡×ÿ/|­ß÷?©àßTüé§L9pöȧÊð-El“Ai<0AÎqŽu´2¶ŒÓÏžA_ ø;µÌŒõDÏf¥êÅÕÑKœKš‰j¨ªRèçwÆ¢ã€q=¨NºÐŒ0D8 ¨AèY{j¢%6ó°SãH~›uÏ:"`¿Jõúg×9øÐÀ‘%ÀAiŸWC1|T‡\în§èh5ýŽ’èÒ8¬[ϲ•Øi÷–k(ßs›‹¨>Mý/gr3ù„ìö¥ô©C: Šè…˜ŠJóLpcaØ^ß§)—ŽÕ94 ì9õɰ€½Â wÎ#²|¨(“D]DBSžJq³}ÜV(mõN2©Zí£JÙQÒñ!“6Á®½`wi¥\=\ºC/e—8€AeùI¡úo«þG&øyºã¿nÂñüc_Ý&³æÏ"¨ôÛ ›EhC‰ïš£e´˜X¼Û!õ£'½ùdVä„£j¸Yþ‚¬ò vÔ Û` @Wî,@-,/Ì›²:ÚFþs¶Úê{FO/ªh¢ÚCf¨à­Ã§£.N–Ї´;¼õçX4h™\ _2뎽¾ÎOã(qõ¯àiwˆ>LÕ;äõÌæ÷T¼È<ë(Üfê!€A!ã‘8í_Pl~Þó„èÞÝ«Ço2;±3»rõ$¡íQY  ]î\·¶N­®>zžb RÈõ¶ZDIÝ(1BT9Űlºð.TGÐáH°Ê;Ð<¥Py÷DI\08±•ž •% l±¬FÆþòzF„/‰çÜ8ï$kÆ–Õ)‡}Àå8··ûëf}Ó£ã*TÕµ.,‘‰» áZW^ô6:C(4¨‚Ýœïß…êËg„´$.U.-ì@E<²ÜI¼¤r›ADUW”FFå*8Jõr²èd1@ÞFšÅúñà·9¦^hŸ¾^.~n…µƒd‚b BI·R˜a›ºÍîm¢põœÄÛè&Uê6ƒ­keÆS¤®È>˜¬Èâ(Ôŧ—êÿ³ìÝ{Ëkiõõ´"Kq &¼¸ÖB–7äÕûÀE¡% VG\ªæf˜¿4O¶oîêÐ6nr—èuáÞÖ ÊmÌÆpuå<ø1œCÓìðϽ׮£4¸¨XáÙÊ)V>¼]*u…¹ âÞ5¯ŸIqývÜ€mV’!X-~JZ€oÈÞ›¤Ái‹2FŒ’›FÊrÏ"„¢Ö7_òŒ‘#{'8Ç©E ”á©ñ&$ï÷{Ó.k)°À"¸){›©õŠàò¯zîxÙ;½Ç?Þñ ð:§½5º0f{­ÃI5ÈÇÔ ÷!²†Q`QmÇÄü M¹×µ8á!Âop˜ŸèØû˜Ig7†ª¾®åï÷.TЧHŒvbÉréñÇÖuA–¿—8;©vøK{s›yÿ°Æµä40¨b‰nÛ |Sù'ƒd B&ÎçúŽq••r´fjãìë©%R飺ˆ\Çâ÷±²Ê”ü·°67 Ó¢FÑ Ä°"¼dÍ-þÛË„"Ø254#‰ðž˜z±YûPWúLî¼¶Y 0©!æs+§w;ÌM·‘„Ç_ß“·p¯Ð§b"¤)®y' XëÂÞ÷Þ¦PèZ ÜgŽBýˆÞCÔáÀ—gtlj~ÅPÙV¶ÞŠ— —4ºl4DV#t •~gÐD1*Eêxª,ª5¨ðÁª'z´ì-Z+`ëÄu1[Æ1Bò,Y8ÖÒ7mµb$©EÆÿH8Ú3 Q@P›Ý<Œ®õŸØ»ä¬šìM=ÅâCãTGsÂ0nÔþCŒ– ÑÎ!¤ï›YzL¶w˜ÕôkÌf&ÃÒ¡m6¤Dy‹Ç{å]§rŽ.>õЇoRö­»¥üWŠ,‘Ž ­‘Qúûã²å1ˆ6c×`ÄgµÑ6é £ô]]nq{Bj•š§z¥à€h#&YFob’16ªTFÔâ6b×±¥?Æ£I<Ô>J ‚_î£ïâ|ÐÆö?Š!þK„Þý6éXø)!Oõ¿(©˜þàA-OKŽßdŽƒIaƒd"³E¸ õC3énà0ÖqZŽë2StÜVÓÆí¦ýÅ“gd}Ò SÓw_…khZ¬°0ùñ¸Òóü| |g’g„#çIJ=¿F}ƈ±SöêòÍöMæâ) cö”ŒÖN>ÄǦq ŠˆÉàøšï‡†R}cXV`ÿE*^ësuœC¿c tÑþ +rq4€—*É¡äöLÑñi,¯ù‡1@òòA¸?yûhdS+îÄCćÇûá»?øj•cø³•1Ã!­¥ëhªdòø›ïq86gS¦Ÿtz>Óá§ÃX?òœŠþiüïÏøáâ¯%º¯aüD_æœüqþGL´)þc½ù°šñb²W_a$ÏEAÑü=[8G/ï•_àGÿ¸xýIhçï¿…ÿ&õÿ‘—Á?ñ‡þ¿àóSþ×<¨ÝáS~”£Ï÷@ÿ :ÐÙí:ÕÖ®2ã¡Ïk¸_&(á,<ø:p§~qû’ä#³S˜ªé´BtNºÑ^Óþ–åí¹†. ;¡ÆþšµåwâÉH!ŒåYÏ~Nú©®8XnùŽú<þÑS¸ÓÄ(ÂÙ׎E߈ӹ3L'?ð O÷9": .ù«WyVêŸ0ÊŨªÊ½ÝNêD 8uËìJÓp·®Ý?ÎBÆt§»ôÈ–|øyá3mx‹’ùX– ÃKæ-IKS`¹“ÚmØå¯VH²Lgƒ“ #Çpª}FáÄ€µZkvEYx]—{Û4N'Ò²ï5¡ªW¢8L<´°À$ˆ ÕN¯ÒýØsK†Y£ÑºJŸ#8º‘g‹huÉsœ9iȦ t2S!‡Z%(ÞÄkHN:\ØÎ«‚TÅR]áÔ…„'—iHÉþÃhڴܾ™ —×{û™Û«ˆ-_T«]ry£ª‰k©YÃI•SˆÑ¡<Á®ñZý23ó«ÿ !{‰l¾M ×°½!r[YK½Ž\4‘' U1wÊGQùM¦þ)?¶É¿¿÷ëúó û¾ß{[D=’qPÓO–/¡Ð¥›TÅ:ü\.AW!Áµ ×ëڦג†oePòO–¸4Nîú~[ÙÝ…­p°;.}Ùõc¿ÍF4•&[x1l€RáYcŽZ6i[¼¦×·Š7 oÈ c½dÂ|î\8ª3$¸œ¢Ë‚TgH¤¡4sÙ7æê«Ø×åòŽÆ €„ Ę%®¥Ù"©È–³ ç‡%øÈ¼;‚”Å}“Ûxéà˜QÅ/†pzc¤g$o±K”bFý/L¶yq«‰ª!T_--n×ZP!õº"î÷Nè n¡Aš—xo˜B!&+¯=ïs<2Jùˆ3g{DL´¯kй5eQ¥Ï>ŒráÊUߌð£Qd•3ÍË»TÍn³½E•ï¨2îÂxˆÐ‚-C˜È¢˜m#o£—×Åꂆ…P5!9ÙF*.ïÐÎ…t-eBï»X½zr„HÉv¢ >3‰Õ1Z(i"—\ºÈí±Ñeٛッ0§ä íáAOË.aK‡qH¾*›ïš2E]-÷xfé´È¢K¹Ö‘mJùØE†’ÞíD®(Á‰ÌÞ Ú†çw77:ĨxÓ1D'Ì¿ÇѼw´¸ÕëcÛ¢£&?y‰µKšaõ‰^Ÿ²Ä«Û7}™Ý¢…1¿ŽŽùò[!Ë´qÖuN¸TŒELµš[ÃL+ò•*ÍDÀnÉõâ{ÅŸôÍÊÙ)1Ü!Mù޽B[ÕI IšŠ …*k ý}zìB•…)bÏŸE¶P­>/Fu#¯ÉÖ™˜UB©{°T«ao:,ÈÑœiu X…ä9!k•f}OHQob4Ft|%ëg ™Z)Æm(e»†Ï“%»J¸B¬Ëé"Éò²òùæ~³¿ïBO•‘–é„‚d¯®h¢¸ñ¡úb4æK4QT‡ªï^:‚s“¨¶D$É€ä &¼%³nàáJ¥fù†ƒí_û«ØÎUb™D¯´×˜†ÿ`›^Þî›| íd†Ìöí6ô‹jã.Ë£6cµ9h’”’çCD"KÚG9›ôí*ømÿè©ÎêS0ÆiÔf·FKœ4¸æ¡¿œ ƒÛmÅÇEÎÃîPúéïc~PÉÚуÀ¡gŽXMë´¨½û§ØÐÎìô(&Qÿi“‘,wÆèD–9—è—kåk9Q1ÌJ( Õýùy¥Ô]•Öž «øÍoH1ÈŠô§‰/¦e 8Fr¤Œ1È99³â|…áST%i>*ÉyêjN@]?°¼ëmÞ}¸õé³K^8Ê¥¤¤9aâÙ9â ³öŠ£/¸ý.¾ÀäÆ@~2_ÎLÀüêøH˜?šìÎ6ˆ…jÖYË7Çp_k‡H>0@à\©xÔá~š¼ë?ÝÅ4—×é*Î!¦1q$8Nï>¾ Ÿúw·Çð¸ýyŽÿ:uÀ¹ˆð‹_¿‚£ãÌŸKÑÇï+šägÆâŸíÒÿ&ßÿâõÿ}ƒo5øºø/Ð?Ëÿ»ôŸ4>Pþõù?øÍY ú“Ð_íÃýÕÌp—´!ýƒ5Ì%ÊÆŽÚC`%H§0žèçlt— +”s`­==-Î:0œaÆÖ°¹’¬Tì5Êx¡Óž0É@ºv)Ýx ÿf¢ùqTþžÓõþ%Œb÷qÄ— 3T1w+ò¡û\ðøÆq®‘qÚD–íÃï!€¥êüýaøÂ×7¶‹yÿ×ãØÔ…EýMa2fõW»Ú›hC¯ÛÍPÛÞ¦¦UO]äRÿª­Òˆ™§03ïVr|P5UËq(ˆÙ‹jÀ£ÇWÆ™I ®ÅÙP˜Âù "üìjUL‚^yD­&étm¨ÇFÒHW/ËE‘ÚQ:àXÆ{TÕoµ 9€ªBœu4Dq:Š èb/½š,aẖ11hÕ¥KöÚ&²×‚®+Hf¾R‚k-—0b=‹,0RL@ï@D+µðÞÝv] " Ü€-ÿÔZ D>Æb@±6–Û …*l›rzœ¼F'°¯J÷}Ç:æpuwÜy Å…°å_MxÌ1ø³"²ÞpOø0M°wÌrÎÄÄZºV²¯¬/vÍÏ…g‘Ñ!éß§ É'Y|*ÀµÔ\B·2],6óbêy<­Ž™=“AØÞæEÑž¢¸¤+fJ8N']É1?(ÀÔÓÐê thá£ÈåŽ 6L27L ©³­ª®?’gž[}6¨‚ ï¨jAšýkš˜úÊÞ&êR~#©ók¡:´õ^°ÍW„k©x¢¨B?¬ä[Ì1°l™ÁÍˆÍØÀÝ6%^{)qQÇlÉËwµS‘Âÿ‘V[5‹ÁU"X+š)WNy2|nˆpï'¹+xAfŸrøP©6Ê&5#õѸ)še½¶ÅÒ§µ¹9~ùÞk#Õ­®|-õÄ@@õŽ2Àǃ €•Z´¡¼N;'ªXÅk‡_ó(r8«Ö•BÕ¨î£QÞ®ëŽ[LYž(‘îZíÜÙ%˜L™ó}¿&Üd+ÇF“ÓO9èV,½)XXñ+:……Šãºdê5¶*¬É“j©—‹ª(ÌÒè›°W³Ð#CÐôÇ\Å5¦KÑKâéT³ šq[b¤Õ{´YH0=S@Rû²+Íá—J†:Ç—rQªb¹¥fÍÁÕÃ'Ë×\¨ s6S¡ôd[>Âd’ÌjÍÝcÁ§>ó¤p–Ñ.e?‘Êù. s8z²5 V,'Æ(iË9O¿1Ûà<¤¶ÊiÍîoˆÒ9Òýxrè•.„G€¢ÙNß÷r’Û!|0Ú°¤Ï˜ ÏJé*E¬'ÆŸ};Òv›á§µ=!‘ÖŒn öICýÙ,ºØ¸A nBW|¤PŸG_!êAÞwp~XSýÿRZ›uxõvÒ@8õKò¡Má‚k†?>œzõé'b'åã'Ø©š–§ŸÙŽ8ËÜ?Œèr´V|jj=ƒIÓ­Uœ£+yÐÆ#)ëBÂ͉ˆ8=øG»~ù¯‚n~úûÿn?Wöù“ÿŽoÿåwüóøé»ýl‘ÆD‡¿§"ÿ~Ráw^å?ö^øËOí_÷ò¯Ì>.œ/N§û< ˜;tµ0…Zú~li¢,ÎwÚ ]‰[]¹F«d«Mdý‚ëé‡ \?T‚¼¿bÑ56ƒà±Rqô›ReVSÓ#pŽ¥CÿÇG‡¹ë3œþ|2ñÊv-òè<ÁCRþ”ï{çðÀìí9mý¶*?û ŸÄ ú‚¯ŠL·s-ÍÌ;ã“°|J䡹³µïÙ(ÿ¸¬odúC+a ÍqÐ6á.ñ樴‰ç(FÚ7j‡ó/ Wu2èD1¹±Íò·@»öá<¥„»÷ÛÀú(ñòàŸ›#0hÊÈÊYœ=Fí­›õDDªp¡'RU¡6Ü µIv }Ա맡uÜ23íãÐu}¤Ëa‰5ÛÀЏÄviR¥’’Yüøû{É9Ç®m[Ž÷²¢M£6Ù¦EÁÍÒ.A¯ØãZR\Pö&Dw¸´Ç†‘É8ï—-§÷§wË¥¤uFVˆ¸M×b Ü› j3áãäÊÙ ªKÕ_Š×SXªzIÙÄÒÈ59ÑÿLéëÒ½¹E±ò#Þ»­Ý'êÕjKÌþóý¾ïmµ–¾®Å3Š©ËëK}ôŸñµªtM%û™eA¡øA^Kõå’þ¦ì·Ék ^¸t©ì-Ð…ä3¨–&cËë^äÚØPUuÄ–¼iòÆmfbôZšûX‡k¨.o¨%*SÍ%åÞ©¨q bÛ¢" Ïu~×To¼&¦I~ÅX³íV."ÿa¼ß7+Úoì}Û¾·¼–‹~Xd  ‡<€bãÕ&}#díFpwÔ¿T’m~aÖÇÒ„{ïMSª,(¼³¶pm3ëçu0ÂÄ<­f¥ó-v™Êj‹’.½Ôo,5n¶O‹×¥¯k]×µmÂ{SEL Ð¥Þtâ#Ç¿¤À<¨Çâµ›a U¥lW¢ õLŸâþæv¼šW [ôˆ‹. «¬f¹ËZžÒ2YUE 8ÍD®ì°ü/ˆmÜJU¿™SW£‰½ÂŸ U¹©°Í.Í R ûé¹iP ý°ïÔ7]âb‘™ ~?rÄ[œ6Pć-"Ü{S‚‰¾o¡¯½’+·5~).”²añ3¤~J¦âÂ4C]©  œî*.cÜ´Uõ¤>Õ0ÞÊW‡Hš§c’‹”×SñAÖ)ŸiÀИ"´ÀzmÍÂ¥i²6äÃÂ1Ѹ,e›´X—Ê6×ÿIѦZû×:’å—(±EÌö=œçɆ椖#ÊW™@ÆÀ0¡f9 5õÏ¡N0«®(ДeÍ+£!I$Ï£ÌZ¢T¸‹5ù/RDc$•P¯ U¼$@ì^ÉôýS—%c±ÈÕ'*Ó˦®ûàB)ã˜å 4<š.”¨‘c!•f{³Ê¥Só?ïP‘Fɘ§A,k[=5šD3t5H?ý©õgPØCn>²j”•ÁÌÐY³8äIè0›t…võ`úF‡ù£‡#/1"•ý¢OÔõÂãÒñ€”F·mýìRýeg…Ë4?û“€-™³¬ÓFÇéø#¦BBµ® ¬§ ,¨),Uñ¾8ÊME1ãTX1F:TªÜ<ÏwÑÝf^ûÃjKèìCñ˜µx¬#d’ŸTÛî…à¯YIÅ82™f1i·fXêÜOõ_|XÂqKv]„æÉAªùô9wEÄ¿H%gç1?Ý…™Š¨‰ISËÅü[O]©„ñ1åcq*f$Ý䎑—¹ƒ2JÆ—XñÓq2_pê8ûÎþg¨–SÝýš<Çgld&©ῠدíæèàð£äÛתH—}Csbé Mh²mìj³¼jÅCÓÃàš÷%Ú²‰ ë 2·¸™Ï[N‰½]Ø1†êØ‘5±O}­0”uÚ™õ ä^&»'0¼ £‹­ái¬ ¥} •‚ õS Ÿl¦­•{4Q¶›\xæ‡a8L¨|æ‹N«½{N{ý­Í§á–g#ïSB9M›á”C(¨¹±ÉëÏ7ƒ¾œñ5ßçMŸ`JÍ€p ?ô dìç-£ý„åÏuàY‘ðM¢ükêÿ`¡üJMæïJ¤ÏYâ¯øåkýK2ô·¾iþ“ó¿3´ðÏÕçÿYÿ¨ªüŸýø½ïî ‚Çg©l5ªoFŽ•3W ³8¢ý±gNÀˆTy@ôˆ`ÅãFâ…ªAÔhB1ˆ&Cã±Dy Òrc\Úw€›N­æÛJ0œX¨uRÿGôðò'.¶ÕU4ï¨b£Äåâ/2ŠÃê/õ}€wê<»Ìé*žËÁñø?]ÿǰA­Ç꘻«Àú¹%íˆÅÔ…Ã_L•cðñøÇ¤ÀèM¸HÇõÒGH®Ô»²‰FÀ§ѯ;Gœ¾àôS¬Êk ©Å\ôjÅÇ ÍÙÒUþ·<œpL#jO•*‘¡ZÈR´¹ÃF±>Ta©RÕ¯.-Ï?@—óY,÷Ü ÔaåkŠNN¡ŽoÝÎ] õœ>²#ráß‹õ®þ¡RÓÌtµó/ '[ªu5^¸¸ A@¾§º6ö]yÔü2-†C½qq]})vÄ‚-´Æm¦¢N—¢i“ttˆÑDÞØµ#7V×tÚD%ѯ„ÿˆQ¹yG]¢.…QÌ6±Z*®ã[êne°EÖÞ‚õºf‡ ͶÛ[I÷>coT~K!Xº ¶cœæu§"æ}rÓ`©y.]&Ûì?~Üû}CÕþ”¥‚…‹x 6„Æ­â~n˜pû0)Ê2•X€^j"º®õ½°eæˆE¼u.`CEÅdæe&ž¡·lºôÒxï÷Þ‹ûÞ®×RY&ÛÏÆ ªk-ÈÞ n_[£ëyáõR¨Þ{Ãðz-ªqg:ÌÄÌîÍu-mV¼–-¶<îa…À‹n³KÕ„N¹Pð½Íöþñ¾…òo/÷ƒ{›Á€B!ýµR\*»6íñZá<aÏv£(¼ï Õ½øÞ7`fÔò™‹,U¼.µèž…€[7¢d›x«¶¸÷@Í ûö5k•·’¡¯ÇËÕÐsYª6ÂüæÚ"Ð5~“#Hñ%T¬s~ôïν´6 \š]èÞvpoÊŠŠ\AŒu4›Bws“ýÞf¶¹ÂZã¯_uXSçÜ®¾° ºííÚź”~úVro1RIQ\ªÌšŽwØ<Ý)jB…4¼{.ep鞤•d{0eWÈÃã=rõ*:f¹z¬© :Ò»!AÍ­áô<±º0Enò:u½ÚÓ1T$6^ `¹Aû‚þ Ü›pi¡ÓÚÞÜÜŠ•œn&>ªjà+ï1» ÚºJ×­åÜÞŸfªu«±ççaÛ7‰‡µGrï­"—ª3‘ª>Ù?y(^¸tómwöÍPL,~ñ¹Ž'°SÊM_î”yn]ˆ®ø(䃼·£¶åR%³yÂ?}³éáÒ<ÿ¼iÛI;4g.CCWÎljù ‡Žé€ÁZËÈ›”Í+µq·n„ ÿܹ·ûlo.¨B¶ÑdûJšŒ|)¥—)ÄÓB ùšÙì><šÉV£à•É´z†ºø³ºµÖS¿ŒFÙÛÃY#]?݆£g‘¦®†¤ ^c>…·1µš˜“OɨDv1ÚØ†éa¿H±6š*‘1ËBLZƒ-¤„^;Œ&!Ô^¨ b®ÛSTdI4[X¿ŒÐ½´Êˆ¥aáq}X¬T^÷m>UÑÿNz3-7ánÔW üwª A%,k‡$ݺ*ÄN9ÙÿºUçQ]5p–ÜNoó*éNç!Ji€×lý»ÑÒ‚@°•ìb=`@™E[ŒLÅ¥ ȇ¥±º+{7]õ}cÔæê}€þÝn–{øœ/åŽ? ÒFG¨jF)QPì™–Fn|Ù»GŒ†'4§<ßæ4ýG¨¿Ž,<y ò*9=äÍ-Cq³ ê†Ú^¹Øåy ¶Psª>)ä4Ìé¹ömmòܬm·Î±ìjÖQoŒ ÚùÁ.Ì®,ìÉhªÌTAnE§\ÂJ4.W\*qîÈž.0,V‰]BÍÂ&ŽI /¿Ù8×%z4¬½²¤ùÇ8ýòÌVzuúî0iÿ‡þ³ï©×3೦BžøÏÀ}‡çãƒí‘)îR%ÚŽó-2¥F‘%IL‘‡™>ˆó"–nŒ¥áÜŠÇÅgêÁ© —Ñ2?4ø¸YyHþ6µ¬ƒîWOÊÈ©4. ·¥€~È·¥ª£Löš ÐØÓøEk"ê“4r45gñã@˜dç‡*Ù3q_÷»´hH‹«žã2âÃÖ~¸‘=#ƒ˜/5oCN×,»§r(Óã…bÿff¸,ÅRjêôû¡ç9ªLb$¼š°`SíÆ1º § d«,™aS;Óˆ1–4/™‚g6bx|xPøaÖO”Ï çÜñZpªÿ$¿*õižKAÇúÎÀÏ9pnàœ7áQ2óBx€„N–×ß4‚óŸ§g™‘|‡÷ÿ¦˜òúî÷ÿM§û7M?åÖÿ®Fÿ_ìªÿ—#üëb€ø—ß×[× Î̾²qö=UÕZ¥»jñ¥c£cÍQ)¾ˆŸv4 ÃHäùÄãdEÂP™ó€(ÖÑÒž/‡ñ¯ÛBŸN|íÔœ$·ühë‰0Êñžª©Š# Õ;ä.Utt æ–áYZ "4DÛÖta5>2•fm¿ðmÕÄ Â|ý²rvØÄË¿LRasoàtô¬÷[ÎöÜA*zÚñå1•`ÁàG†¥ŸÉè±€ ·¿¢…Ýü®Yþªù:ÅH5¯/Ž’¤ì ¶H £ŽýáĦõu)GÛ°eúƒ‹ˆÛóðÁR(¼>XºVŸ§ p«á'rWr†pT‰xº5k­[ÄÛ#¬µh6<¬Žú,ì¿QÚçiJ‚r«=וÑÔA…vâXs8-&оœ@u ±7àaº×Þ²[†~JHŠs²Ø¦¨ªú‘”UÕ—™!±b°ú¢"¢X&F“;)Æ‚«÷ö‰Ž_FÁ¶ðwHÏ0ÃPH ]§—-¶Dãµkn«7hŠ3ÚoòOÍCJÁ"‘iu‹™¤C¨Ed].¡±ñºi÷Þrïz¹Xþ&ùÞ·ŠzÚ]TUÔ|Ùf··èöÁ’7¶†@6º™L‚¡“¹R÷Êš`ÎV(ÞäŸFÞ"F,?Ìý²2ââ>Ø0¸ÏlP–² _XóÛsÓŸU}Ò*Ù)¯ñ²MÞÛ^àRÙ¶7õåNe±›¼D®×r…|[¹Y¢ËT¶Xï™ÝÞ¡÷®ÔáÄÌÓ‘:ƒ]kà ^1 s­Ø¯Wت.hXÏàï+øßXaˆ_²–ÊKb-2§^ÑŒÛöŠ“²…ù1B9wSÿÒA¸Ì››Ê2˜Ð«Íg;gMÕÌˉˆëæmvèrJ¼…à»÷¦¨uQŒÿ_Pì±Ôßµ)*{s©3ýøEbAìdUX>–czîŠ>_ÁK.-:’åZM¿jD.‘ýòkôÆ~ÛíóÃX>SÊI±‘‹¼‰ˆ-Õˆ÷‡,¡®Øø‚aw|þ«ôQ&²Jf¨œ Ã~7éÝÂ)h.õK±w´¿îFŠ1 5Þ^@”a?(á~mÛ™ÿÖxà¥zÓDduˆ¶cåðqs+u¹dÝrsXDÔkgj²k£Ç?¶çŠc/(£¤LÀ›sIb»ä]™íìmTb,€Q%å”!¦ãª+c8|ú†”/ämå‡Hï¼qû;k©ÅŒB˜×ˆ¯|5 ·ö…!E^,Õ ç ä€B ¬H˜(íÖîæð]’"¸fQU¿ÊˆÃ3fƈ˜ àü!¦w XwêPÇÑ@‘%þÁÄ;›:°«AÚÍ›VFÆRYÈhì.‹=zÄüâû[ ˆsÌ|ØHˆ¨åF•œ'Œ­ ËÍæê Èsibˆ¾$á1t/Ž í¡VJ+CVRVþ°5PŒYÆËÖMòÁº—¢mH(ø}ÿ´YÕ…Ì#wåžÀáÂD ’Ç£nR²ÃÄéøQôQŽs#3ÛŠ‹Ißœ2dù¦@|U*ËznñY拦ð<ö8 )šŸ3ÉýrŽVÊ_Ì!<àÙ'©Ã –„ÕÒÂ0ëtˆY™’­Ø'°ÀçëÙv`RMeq¸ÈÛ/†•PV´wv¨}©.Ýx"ƒƒhÄã É¡a‘>§­t0˜RÑÛÏc{Ÿ|Ÿ¾%!Ÿ'4žfæ‡N>=LÇP¡.|&e$ O_,§g!;æGì<žîJ;Qfósþ•Œ¤‡fixZ…£Ä òÅ-Îб± r8&‰Çä ®q¾À!uª)$dŽäCà-0=ºË'šØ;/ƒ€fšíDñUT5³¾…ZaÎ!0sEk–Š…òKT \Í¿ù°AÈ&#ÄcìË5’n$rªX÷/§…’&Ôj†¤|JQ°ÎfT†#U€äòŽÀv/&½ðÏ  ³²‡<Ú*=þ8®ÈÓ‚Š`TìÔ÷›Æ;©@±è|ªÿýaš\ð¼k{d<ÇZùÎ>$"†'LƤÈè{-FVBÙ/%êÃkχŸøgJìÃaÏïxå¿Óî ù9kèÌcü ýž?AYüCB4þ¡ŒÂ„*ý7«ÿÏü—tuüS~Ë_7üÿkLß÷ï}¬_‚Oö¾Ý<àx±¬§j¦}$B-§ªø*þ ÷Bvóoõ“æ f¤V[2[díf3~MùÞ_¤Ȥr¼ÿ±5Jçì£ÔÁñi þ:÷a‰ECmñãá©Æã°nÏSG³I#T ²3ÿeÌ8ž_ág!gûÌ£˜ÓÁw6 øï¸ê¡d䵊 _òR'ËO}ø¹Ðõ©ªÂ»pÅyq¼Z ÐpfbQ¿¹ uzw‚Šérß ËÜ5è‡äL¹â ½ÑÇKUƒèÊ|¿é.qœtùu<3ØÔØÚZÉ œw%-¦º÷xªCµÓø<¾éQõ‰òäöI³ûØ!ªàöŽT­9Ôܧ5qdoò“!âœqœòË#OéüMN¯*»šª?*‡ÌètÕÈáš­h?β)?‡W6GÊ9v(”m¡‘S£Íf¯ÿ„¥«<…ftïùÒØiætlÛ6Š.§ Œoy‡ü\Oîí×|Û!üR±ÕB+ IDATM(ï"6Ç[6ì6ùãªhÊÊeÑrc»DÖå Ž›p¡P)¡¼­Þï½.¬µö€1°·Õ'ìý¬&T½ëÒÍ×zýq½þ¼ ºï}ßw4SXR¶·Š¶åÅ„ŒK”›r{›~Ö<‹à†bÞæà7àGk¶PË^ë0RUGN;¿Ë]©P®ëµÖ‚`§üCÁqÖù |Èlç¦È6£ì÷†y_«3ÙDV• ©b›àæf¶SGŸ‡$FK–Ü{‹°ø$a„ÚŠúøŒZ/,*·Ó?\8&6nå’Š …•´m®ªÒî>G>¨Âé—*X•Œò‡$w=RXËA.{ (²³›](\êõ ¼B-zAA,G[1ñL÷áéîõïdBLÙÉä¾L½O@æ×ÕhF³ÛaÉ•LUAï"£˜œc+ɹ3á*yî0Å–Np黉K¸× ̽d¶ ²T÷Þ%Km³å@£a˜ü(TYþl{¿c¸ª™_£·"Gy9íƒé¾óÐ,6åµÂMï û ŠeïÛ#9¤È¼V|ÑÛ}Ù¢nsß”ËXà‰äUoÕ|x×¼ÝÂFNöð,£“ÕeÓ½ë"*²«½Ž<Ê̦YQDU5DuŸagÀº°³—+à1Ö‚ÈöÝ&+º)ÈnI:‘F•eåÑÓÔ<&ÖCîD&¹…ùð‘.”{ÛÛd‰ÉR ë4íBÄÕÿ©Ë†Ò´«Üü:ŸkU¡…€Iúi£ŒŽ‚Xê$wÏÝX›Ö TÉgVt}C­tv˜áE@ˆí­'V Ï éM‹(ƒÿ%e@@¾Ó¤gÉdWþÍ )ç~“ Aðˆ¡ù×ÁŸÙ†ºóýúÒòá³8Ã2ß°³ûúi¨GÅq8Ýý¥šÏ­ KXejÎzú7'‘²é> 2LEw”S4Âê7ÛÔVm}û;‰fž¢N,aOÐÃlŠ=5ÍžñÍ.k‘dŸh,[n…èß%ÙQ4͆5è¶x÷Iý—ž›uÆ™ÆMÛt º[UÎRb±rÜÆvìgŽn6uEäá­>Ú®€VkqùÔ›ÂTQ¥ühØVnvë§`H–Õ ¶ àWð{œ:Ó­zîÅQqߪ|ï¡«áX€ ø5êÐZ8äL™|s½÷À¨×‘yÎ=>Æ<_%‚BúM1ø—u&¿ð×ÿÏç?¯S~#û<¾ü¹†ûß«þËïGêÇdè¿Ûðÿ/=8Õÿ_Ž”ðÓÿˆo.hœQqXø”SØ­|LÅnAÁòL¶.5)‚v‹j(y9ŠŒ}žŽ¨è+XU§(^#ìçáŸï ZÚ*ASiß“7hTéL$±á¨%aèªRgßo=›ÐSõðj¶ZúÅ ÇØñ1ãéŽẏOé?OsõAä,sÎÀ´u¶Ü~§^0bû8A:ë9—±ñ;?|ܾZ~¡¾éàü¨êº.xƒ"z#’qÞˆthoµ\qJ¯à”zãýZí1ð±ÌZ _ÈÎZãüwÍÐ@7:kéÞ+¸á]Ù5ö¥Õ‡0ÌHãýHCw@Äö¯‘O ìh1Þ§éà‚;ºk³umÄŽ‘}|?FUp{2½ˆÑ\i©(ŒŠJÕuV¸øgŽ9æ6ƒ.—qûª(â­CuÂÌXöPE5§´sÁ¬Úíâ>qw#TÔ@Uß\›Ù½wÃ9òažéØ™È1Wonþg´g½©—;&Õ2Ñ.‹kÕ?‰m§[ax3u>òZ’ï½ËºB÷b‹ˆð-&7þ­j*¯Kß7€;/|ãÍJþ úÇk‰âÿýþ|ýño¢²ïÿ¼ï}­Ëù¶¶#»µzPláû6p›<²EÆÛe5Q,1šípÎþ0ã6«¼ 7D„ïâ‰Xi©*ÞÝúÞ…ƒ¨âu­¥+³–7àjl†tÓ&ýã!(ÿyÛâû‚º£öZj—ð¾]UO{ Mª¼ÄDp¼O™!J³}ékéÝû6£-*–›¤K¢ŸÀ²U´¾Ô’Þ-w”œ[E¼¯À÷Ϊp³·¥aÚeÔµ®å@-“Ž;7ÌÈéT:wB%šj—qƒRqÓ "EÎû1s¤`º½í€Ë²DcW ³Ø1j,Å ÊÉû%Ë÷ûö%ÇHïY¾YâÝSÙg翸™Î vű?yóo1*µâ uìÓ˜Æ3 ^åÁA}êªñKñ¶‚´ˆX èNV“ :%Z!´{ßoÛÜ\×µýó0ÆoKÿ?E!·o“ÞôZ£°¬mwë›kúÞÞ,]÷ÆÚ?¶»œ·oß›]e­˜d0þ–2øKó š+À¨Ÿ×¥Ðm»*hÉE,¤€%Qé:°ÓCàbBöíסrQ¹ÖR½ŠVd{—¥’›é‘–#xq¸W¶1ðOr”‡ý5cú1¿™—Gý€Kq§@£¤:ÂLKæf«°F¤OÓŒÙVì‚ggÒªiþZ¨Î˜QëYú˜(FVèT¼C2çÓãð“{Çuy'ð߬)$% š£ó8edHD"˜¡Ù¹ !·YK“XxŠ>|ª4À(Qã*FOê*!‹?BÊ{ÂÌèø_Kë­`ðõÕ±5Ö¹ƒ¥|l¥."Nl¾6‚"#œEVЕ`3ÿ£b™±ñ˜V˜ä/UQmVÉÖ4Ô^[6ê‰YZ/2;ˆ©D²¯Çöì=Ú¼ú/3ɘjÖ¢.Ñ%aƒ$=¸â,QøBàÜÆ£[«†ut8ÏÎb𿉚•éY ¢bÅê9æ‰Å3þœÞš@ ùÃÌÌý<¨ÖÚgNÏÇ ŸÖ'©ÉfÖÁ‡«âã€Nå€)WèqšbDU=Z<{ꃮ*¦¨D—‹Œ ùØÈ·êÈA-C-98P#iz£cmâ3Ñqi§ïéNÇ/»öbR¥œ–¤V8]ǃ¼ÅºüøŒã”oŽ 9;391a+Rg™ü³ûЗt„¾…ßµô\OlV¶ò¨qM RFWC´r×~Rºªï™ÈF¿”p*H¢á¬KŒc©“°ý‚€–Ì}¬«;¢OaS3þ4+y5Ógú©ï_û¢±S‹­ hOû4S×ðö6MO¸c½öÓ²voÀ,bÏ1hþJç\n_†µðña¬ã ÀñNfÿÈo!N~Hºé™YáÐF‚?¦(Ý9lÒU5£W3 Ÿx]<kƒ#„ö~íGÍ‚¬Njô¿’S‚û®þKD½ž6Õ"íõá+Æaµœ ÃAˆŒî<,íŸnq<Ý«GÜü&MöMHü¦Ìû7$ÐÙwð›2=~å0Ç_™Jü\}¥|­˜þÓúù¿ãeüÓß¿ràחϳY ?½L# ($jŸu¼j»{£ù]¬ÑÑòôˆMjqM¤ù•0Â6Ç£&áçwÞ³ôþÛø’?¦ÍŸÿ\>z¤Y!õúí®$°Ä’¶w™+å$õ³¢ãùëY•˜¾¹Q9Áì{źü8ðGƒ±ª~@T·(å " 3Ãú! „QÂòóÍn'yÏO3NeMÝ-< âÛ¬Ù(…ÒïCÓÃZËîcïßèî<{P*}øõûàXÓû‹ægÅØvÚØ!P³„ Œü¶Šä†ÖEÿ®‰ÎÉÚÎã@¡êò 8ÀChc ¦Ô0«„¯¨¦4Ê ÐKö]qxÏü¸(95¼(è°@—Â'pâd 1„…Téüo24ÛòZªPYvß¹i¢5¶Cåè[Î%ò]ÅnÇ‘P,I^vŸ÷ʶÛ7M¸ÂBk™ ‚+ï#ÇËl3Û;f®I\YºHÙÛlóÏë’húÔ*/Ɉ°†}Ûd]Ð¥Š—.[¯…?TÞÆÍ*3-ÛfE’on•$ˆ±äR„‰™.JÂ}x‡ŠìÍ-BÃëÂܸm¯íêáòõÿµ®Ûök9Í'åÝ%¶E—þ±®×k½ß¡Üx±ý}ù}¦„f&f¸ô‚ÚkÙæÛˆ?ðÊBÝM/MB…ŠúuõO^DlßFnÝŒ¼Ò½."7å‚_]¢"·DÑó‚.ØÍ}ßÎ-i€Bi_sY 3:ÒéÞηã&/f#7Û¤ºÓ’¿€ËmÆ…‘i rÇ4“ˆ²¶n—¿%Mé!,<öI«ê'6 ¶í6ãRõ>X¿¢B„zyJc âÍ’w:žÌp‹¤üð1E5z€u9k~ßF¯PI³L6 b‚mÜÛ@$EbÖÕ3(îŽâ. L§ÃÈΣ‘¯³*>B’Š¿ °¸@vu„æ¾@ª/ÔÊ¥j&÷MÛ;¼Ràs.…¨p“4ÞbÝ‚’M€!ž&*w] éºf°±+.Š®…º·máåÆIdIKX#yÓnÂÏ5ª¹~ÁÚÅòíì—ðg÷6úpHSÞaÌTÈj¶×n ý k©Òì]pøñd„§>Œº®ÜÛb½·—nç×§É>AÁJQÚítŒ˜så=ÁÃQ/…ì·L¿Ä9›õÍ‘aUÁN†“ÑÔFoBBœT£ªPcor6åòðSÜzÙê™+³®ÞÞfÜ›.€AS/•íÑ‹bE‘sbðšE; UxŸMÄ¡b¡£‰?#ÙcUÈî2F—Ëý%¯Àò¤ëwHÉ%ÖžâHÖ—xÉ cÎfj³ÀbÙ”²bÒ÷‘GÉøä8û¡åKèBoÔ·ÞAD×9»‹U.JËfi5Šú£¡~µñ8éÖaí¦AÔzPRyRº-”¢IŸ°Ó { 4sçÊÖ’[*±2‚·ˆâ½íµ¾§n›ú/ó¦$ieÐÍ“öÊöÀzÿ¼N¨0·û†4^q”Šœã(¿H)ÆR¤è=,‚™ØDvTèÂ÷®BH[R¯‘‘Bžü›ìùÉ´PöƒêPÀ¢ßãœ_ip\ôÈDZÐ"ÍQ„±ƒ–†ò!!“O¤º¤'‰i2«Û jR°-/Xd0²'”/Rãã›÷a¦d½|A}¡ ?gõ½[qò3wXΟzw%Xä ª¡±3YÓ] -É0á±îóC(¯CôДÓÁ€çØpJñe†ã4Á¢Eož-ùU`–Œr€ ™Á†éq|zþ"µg^R[=ÃúÅÀ?šOK~Ê)šÏ[ŠÏçÃ)î÷NëV{Ä×ôWòT-¿\Ž;æ‹æ(ÛJšMš–?&N®IâãEc¾èsKÅG»%ŸÃûk-Ûæ¾O ‹w¤°ÞŒ.Ü1Dvk¤´Ï^ pƦ‘¯µÊÆ\ ƒ÷Ìq°ÄO8ާÒÃ!èmºÈ2䌨¾–콋xz¼Õ|¹Ö¾®ØEC•ÃX׋Víª˜³¨cË¿1÷˜ûi¥,aÍõ „‰´¶µí\H’ƒß±tY©I'4{Ͳ/ØÃsàw×*W ÀnrŒƒ_"BÁ©×oF£Q–¢V£ø-™þÂfx³ ¼ýÙªÕ^®Þ^Ÿòlò*ŽÞ.ó˜ú-¾¸Ü”}sð]–ÂUtMsèyy{–7 ›l1YÂ[D”Ë«l)^¾j´² {¹¥c¥½~xkÂß½C®¼ÿáÂçkEm97“‡*½€ºyDäæÀ2)DD^X*nñe|çi4È_²7¡¢0½ ·ìm›\k-ÜÃp‹›Û¶\T\éA tpžEÌyå*Õ-¦±Õäm£Šþ¡øw³÷}/å˗àµð"LäÞ{QÛ­G¡Õš{aif÷¶k¹ãe“·ØKõ÷îÛÓ*æ‡Oh^}æàtYšõ8öÚÞ²]^KTTuyIgÞóââ%Pàu-u(Œæ"Öh33ûcé–AËmš·Q!«Šd\U¸Õg‹„ï`v=^T„Z ¹l€)?ÄN|y¨W:#Ü‘½I5`9 jj¹Q`ï_²œrÓ}¡êÖìn_û±7@‘K3.gvÉ}qYf)(”³È)E¯ !ßfLÂý´‰¹ìc`ù;|¡A+šÆÍ½iŽékÙ$’x¢ªÙäZ—Sô¯x—ÁL·Ah`îk¯ÀMÝhS¤ª:›3¨áŒôæ@ÛuØB1©Œyì%1ŽÝTÊMbo&‘®øJ ò¡åX$æµ-¡¡’ø7îŒ&çöërÊZaÕ£H¤-…Jp ʉŽPÁF„$POmz&„Þì ß&¹Í–™yå9X0ø@?&ã6¶=ÉÓnüäçžѧ)Àn&«‹5üÿ÷Ún H(XÌèh-¯’@‘[®W@GªØ! ‰aN5æ}‡Ü¥t¶´æM:±ŒEs‰IÛ¨nÞÔ,£¶ñØ—rN­˜EÚ2'žN*ãoç=…¾?Âi·oEÍ£srk)ÀŽÝ ¹Ì¿sLšn Ëar'e½?Ÿé| “¸Bß‹ “ylc?‘ ´‹ÕÉB•$¸<‰ÆDÕkì!*³‘ `Lf#'5º¿2®mm8+£>²*d{F<³áÀ©?’•/¨vrП™‰ÓÎÓ‰vJš˜àŠ£|·5J:%!Û“ä¢m‹Žw^Œ—òe“¶oyâKѳ¯²ïΆ맗_üã,9IÛÓ¡Æä’³éª§Œø”x û9j·“Îje’6‘kÜ [½<Œ¿Þ>#õ‰9ãX0?^É„G `ˆ’5“°3®?ú^sòóUAÁ ÒŒx·YÎpÙ²B=ŽUë°'7ÀðÒ‚»dhåè‚ø˜tŒ"”w‹£ä¡ØwÙNÑŸM4ÂéÕØòOS -çš»ëGJƒwjJ‘êyt%ùre†Æ?g)S¯—ÔIˆYÖq³PzÉ QNûÛÑwðä*#ŽâíBâ%*â²Oåy Ù GâÙ5_OŽqùxüÌCVùåâ’üŸ3üñ+/ôcÜ8ßÅS=lÌã˜Gí(ht_:plžª0?X#ã–/ºäƒôkËý’ÎSaÿ{ SÇ·ø™ù/•Ôÿ—yêñ®{~²dþ'Ìùø¿~Ùü›~5¨BÏÅçèñäà—ß_†Áôx/‰ ™Šô )˜>èòƒ]¤ VÖÐUu\ƺ gjâKÜJ‡j]·•GEg.é:ˆü1- †*c ã¡¢úXF€G€OÕº*  ·OèÇó¹€|2â8{èlù0þ'÷õ ¬ÐOf;­ÀcÔU—6d±ëG¡ ªnÕi~Lý%*JºÏù, dMK (ja\ ¾37sË¢ˆ ¬Ue™ ¹Í)F ƒ‡3Þ›1ÕMG .ëúaW­ÅíY`Âràßoó^¶™*£ ‡ýIûf·¹é¡…·Xc{‚âèïÒ¬Ì y%¦=]OÚLgÕ€!FÞfªZFïÜ}G¢†ehl?EÛWë̵NåÀq7äGgÀº–Þ›•ÞØœ§áD¦¤0=ŠÀmŒßƒH8ï¾äjëÑ_™ì·iBŠ¥E¦'§ÊXž›‘¬£º`F-«‘âãðÕã?žžÿÓÛƒ½m‰ ¢ ÃK=ö½×xèíM\ÁÙ„^kÀZ¸özso_:ML * °òãæŸ/[M*Mž×<øÜ‚—›ÖÍäö)§¢ëÒŽò#¨ªØ½iÊ2|RD–ŠlãK®×3»bQr¦á«@鸄lsAÖb·$}¿þ¸·.\ªKÕöméà¼CñÎ/ßUî×°Šl…ü¶ÒK÷6÷¶}Ó°m¯;ÒÞ÷ÊÕD³¬RDÈ]Nžs+`5­Ü¶wÌw ¨|%ôâRH!ÛÞT@K¥Ý´æ’Mb¾¼w¬APˆ‚;Üá1Ì‚TõäÂDT)¶­õüxŠ8 ,’,¼m/éÚ6š2º.Mn+JãÄm]Ãk¹ÄJ.™å¬÷Ûè~/¼RB¼}Cœ ¶òµ¦¤"·mÞf|o¤? )2v`\§[ÜÆÎÎlyßnS…_ÍÝ$§* µd&‰˜'§ÿõR­\€"Öòµ–ªBÁ}„ÀÄ(šBçáÊð›r¡û‚mâÕËÜnP? Íî]÷ÿ4¶¯í1¡@y!ƒ´I1(\æj4lJwN˜¯¬ŒÊ™ÞîÁºc\TÂQ3w]ã{p«ƒ¥ ÏV‡às+š[¼¨öŽn² !yß¶)ä½Ü$]×±;zm…ÜÜ$¶íØá1öeÔsPG~ÅÙS¹ Û§w&AA{9 Ñ`‘]B…@m;fixkEe ?̬˜„ŽP‹}Fê ˜Šj*dÈ(a)IFѽ}#bA:Ê«edBÛ=ˆ”,OþæKPì?©b‡'±® ‚`Š>žÂê…54²S¨ÕJ£˜±Öú&¯@†æx#;Jƒ¬ˆÊQ4„—VES«.ˆlGñØPŸB;1Wü#RÅAÛ§œ.ÅØDà!|å‡MœIËöyôù8™Ã1 þÕáÞý˹ù›Dc+XqŽªñÙ-9=ácó#ÞIm]Ü"YòÙâriô>´È4x#aù±Z*Ø›6ÔeŸVÖÔoƒ:^•'8²Z˜; ÊXÂ`1ú (4¤<|³Ån -ºiY5„›]MòÏ;>X-ã™bÜeý­ž ãÌN›Vàã'‡÷õb>X"9ҀȨö,>¢‡Ó?ý£]V2vV‡LBG,¥ iíÈ–á“A!)›àg?1æØú)Ê}ÿÆ0ëQ3Š*ê­Z¦úª&bö Ðð”CºÅ7ã‘ØC…S-wÆ>®B[‰3>?9*g/\¼> ý=ÉŠÙSë/×¹™DÃ`€×3óݹÉî,vð ‹Ñ_ @ƒTaäjõ¼vwÉÑ.À.€žënØÞP-R*];Åu:Æçg1L¹©h"‡y1!?CׯGä ¤üBÛÇé €¹©*F?¾üPà+ß,¼×…Åÿ|„¸ý¡ˆÿ&‘xh¸Ëœ+°î®_¥Ù6Û{‹–†/üç&êÔ6ÌQãå‘jÄf—’d»`ücZÏb«"Fœ}l¹ÕêÙm¾P bmý Ûñ*Uc7í oŠ:%CÖ’L8׳(>LEpÍÌ»á”áQ〃">ü»ȶ“B#úbôÇ6Ám†‚¨j¨«ÁAè=HÆs6#;÷*²Éð ÉŠ=¨[Ê£ó!nÅ• c¦ólû¬è X*ÿùC/ÑÛè—jÕ·•Ô]c+»é¼vÆû6{Ùª TU}™7!Íîí¬Ô% xç7™i IDATû‡ÅÐòÃïÖ b3Ü n£€fo*~Ü×¥¶{$z]B„Q49Á:((CRèö¾6³-xYhRËu0cÍ‚¼e÷òÖ Ê}o—iy…Ö¼r¦Xº w8«}Œ@?‹<Â~l¤øSÛ[ÀÝ‚lw£•ü_¥q¦´·mšybÚ¡ªÞ>wß{ïí¬ž&÷Ù\#h*z›KdZ†?ñÒ$_ºÜ¹¯€®2ïgÃlr˜C€Ë±ñB.eäW]U±~~Qvzˆ£€ÇÑðÙ:j®žÑ|Ç(Ÿöy-‘÷ U—wµg΃ ZBÈ}ï}Û¥XÑq‹ƒ¦”L HÍ*ÚHl€¾tŒ[Í$šyw!* ÁÈbWÔb~ø»’ôîËòRWÜ\Ža9°óQ» gf"™p-b2d‰ìí&†Äãׇzuðj†ìÐFP¼–ÂCÀÏ6â¾X"w¬ÃÅ’Åè /|ŠtñPë&Õç‚°}Á5Ê¥USt)„סªF-„?VŒJâ™|•6U¶ ¢âœìž˜ö3ß±yÒDZË’YS r DuéÞ‘0)¼ÄS-tØ$Òt@k›äͨm«’}ˆ´€Mòpg¡ZÒŸ ›­Pzð ;þ/*9@a]nÁÆ`”œ×v5v^ÃIíB?:u£,éÚ ËÁÆà6ƒwËÎjM@(Nb’#³ÍÐbñΊ’SKñµ;CKÛRÆ,š‰ä!>$Vó§+Â*Ñé@%3ç0g!ƺ)Xøn殃5î‘äYmI|lÇ9tÿ¹G&нȾ2Îðil¡|Q­œW¬æ#îÐKF"¡üdf‘-âø `¡‹Y†Ø–>¯,ÚûÔTòÚ%!ü\CkŠÖzâ0‡xS¨åMjN†7OÅ2iN3@ò0æN¬ŽÝ>'ÀÉÁò/ì Ï5ÅGÚ×Û©éÓï/O°;>J Kù$ó„¡Ì1Om >;%QåÛ¬{I¢TNH‘þ‹´—E¦uòvƒ¯Ì£±ä‘§\2†ãA\tŸP£‘|ÃV-yü°ìV ÈZ•æ  `T7_](ù€$gI-Xg©¸“úÈÀ0<@ˆœäÊ*Å¿Êð°‚,Ê>h–Ýþ~ŸúÃ|þŽ"`|^@¥F'kÆÆ O­‡ÀBÔTƒ©NÈA®™£j£$d†æ¨é329Žø?3dCDâÏ`#Pòqµs4áa=>Ü ]nÿ©ÄB¡‚Ÿ*“c¼ŸWÛO‰úüÞøúønù×$á_•îþ žÿˆýü4®>LÞøŸÓþ¿¾£t,ñO R¨ê¯0ÿ‡CŸÃ«ŸtTÉX Ó©÷‡vž#¼éSIA×Áh­÷ÿ{g¶-Ç‘[7<þÿc¯DT†Û}ð1² H6Õ­KKÍÀ©!32ÂÜl[µï¦P¿+GŠ*¶aÔ¥³Ú>cûÑ¢Ù¹ ƒ@ç <ÑĨ=§a6Ù¡ÚG¬~Ÿ  o©½ƒÅp3ZÄÇð©ã Ã!ÓüQ,Ç7TV€cÈ|ü#¦Þ‹G@êÃ-wA`)æ!‚â\Š¶ê§•Au‰`ÚÿIlz'O¢}î\Ó¿vðrН[Á¶bº6Î ¤ñ¡p-œf–rÏ©ƒ9[ p€±ýÍF¿nö:@uyÿe—º=G.RE¾6<-å8-®#UØ&Æ(}ô8 $5wÀH3®•ׂfá9ƒzBý„ª.ÁæØÃ³kN¡ªæ.†¼Ÿ"2¤,tõ@}¿í^|ã!Æá_ݼOc&á/PUœ¯¥ÝrPiZœÍù'îÎ7¦&¾\E8Ã]2 m]ŒnëN´A;r;¯X¢Nˆ’tÌø©òÞ–Ý{Ù7 jrQ̾©º…â’ͪµ;™;ÛÄ ‚%êJAjV¼]èT[¦’ƒŒ—жmÊ¿}SÅú÷oò2y}oK·ÑDU¿ÖW¸‚›[(°ì¥Þõàšü ví}_ê“ÞrßÛ{9—ÂeëZ Éï»»GâDž»M@ãxiþ-@¯ ÷KúB¨º+Æ K£ª”}ÛM{Q.gn¹·m³•FO²«3Š‚yÅû¶/`Ø9ñŠª^ê°#l5îʹ掽Sˆ§@î×Þb—Ù—g¸ÌnÚò.Ò{Ý·aa]!Kpë^–)r3—¬ X^ÁÌNd¼hK•;ª wR¯-ýIxŠ8M¦%W7X¼XHa»0+ªÌpvµb Òj“#ÉNÔ ãéE%ºiŒRjBŠK `z+F®¡HQe’¼Šö´dÂðò]#·²šÑ»F³{pø¼i†žÍÔjVczÐcªáÍ\Èpwl—õkŒ÷_Ÿ0ʬš²s‚R+™ÙáW. ¿).áPcåÖ9 Ósb¢Vèo³cò$"qf©ãZ°ýQc1 ðÎ ã¡ØÈ±þ£?“YxʤeÂÆßôñîDpøg„ÐS´Bâšë`Û|ÿeï¹å ¶šú¼¼O—wKÅŸ-À< #¥º s NP¯ Ü?¹?• ZœÕ Š±Õ˜ ‹¼ý$š¦û<‰ø§EëȽK ûÔNýM{|VK`8&¢µ®wa·&q“DÃʳo$G}2¼—£ˆ–™€Àèœæ›u?ÚtCÐ×7r¤·A1˜¶¶Ãö•£rÎ^™}µ–ã2ˆü*å ´Ý£W í3ê`LºŠ#þƒ—j%͹„瘧ÆñˆÝÕ‚ŽiaX ż%1¤9=oè©<ÑètÖk.Rã7Bu­x?¾¬¯U8ÿÃÑHöH@ª`Ïÿ˜$ü@r9‡Ã¹bKÐÁ–“l¾ëMÆ;cÿ˜QÏ9!>Ý6Gö-›ã8J˜žMÅW‹§îøuVÞ„s,ü˜?—ßÒ{ø«WïùGõÆiL–®œ(´y‡SæC[“ñT—0ñ“f†¥ñ‘KuW+¯û«FÖ ±'ȆwuÖ!<íü)›UMq¶%Û|¼ë90;Žš:Æ~š\Hs|ÿøÚs¶mnƒÌcÑ8UÆk]™vTaFäò|Y®{( R p©Ü¤moæ«+‚ÑÇhTVRY »‹F7ôv"Ø7«àK†v›{3³Pé®II¯8;Å‚lš2ÚòÔBö8ØÞ"®…¢¥QÖœ´èØèÅ(+¼öf|†D±pQïrOX¨;Ke-•½ÍÄÌDÅl:klàt˜°É¥«òC_kí+-ÌÐ-îl­`Në¹—ð…­\:ÛSÅ–,_­oÈÜ¡%eKr À>õ*­²o¹ßÒi]ËäîØŠ¶õ[s$ÜÎ$ØM“Û‡fßIšé)záÊ~FF|NB@&T ¸¾çÞy#ÈkGÁƵ.×iFÚõo_’ ½.‘uo3»Uö¥úüwkåÑn3^ž­†˜¿ð¥0¾D.ˆ¨zQKuï½7åRÙÆmôGÁ¨zîóyä‡ÉõËl‹mx‰êUú?pÓh7÷¥€,ß‘… ´†FŠ ¯î\rŠèi Í’V…\PqìØ¦Q=‡P'Ÿ:YݵþñêRQQ3Õ¥àQŒÄü©¸tö|…k@ý6\À½IËx¼‘jjäw‘BWøïUUs‘é³ ¹¤ç>CÛŒ2Ïû6‚Ë'"f[ä z©º{ØbØç‚åúòò¢#Á³ZfZ­˜}/IìiðÉM.œÞœplÂåjõ&kD¦q%N«LÄI¯Ë¹ZˆÊëdÇT ZQ[-r~Î%µ«/|²Ö?‹ã/ß¹%gͯ¼MJÓç¯.ÂL–æÍ ˜G¤¡¾«\=úR¥›ÏäÍ.ü¤nLç;:¢p,Sg±*·p¼E£œ’m-³iµPçÇÛy³ŠDÈ8ŠÑvËÖå¼ÑRÆLކä¼k1 & ˜¹èÈäþižUê^˜1qcÆ;¿)Ÿðµ·nب0‘ j‡gvŽ!BáãçÂ<ÎiùgwÆÉS4’,3½‚Wˆ ª wYÔSCª±oÁfÅw-$9$©và étŽ:1¯Ãx´ªßÃ/ÏÖáùèµç\p;«:*¿Å {(í³H‹1÷ÁÙsðY¥êÀÝ ´<1:ü±-ü9Nàg1~ü'|Zïþ„àýëÚôŸWšPtÀ·ì¿~ €_~ùF£øOù¥þ‡†>P€ðƒo "@¿«uÑUD-q=üQ(rNÒé™z|۳ݬ¤5áÔ´=7Â:º×J«pL*„ƒSŠ&bH…G÷ªµN„­ñÙ¨x§Ÿùt^E(ך·…¢W+È`– g6ÆG‘›ÌráûÉ€B-îªÎ»áb7Ψ8ïý 8AcôçyÙç8§ºRǂ™E¨¿/¸}Ü»ÃFœ£â:ky)§úß8kÕØÿŸÆÿT;ÇC-ÃF®$ƒ0™ÞPuÚ vŸÎtŽˆÁèe¹1Mjéó|4¼— ëÈë‘EVÊ«´Ü­}Vq;fNX…Ìå õ CtUD°m›Á€q$5Û¼V}½ÏûDgmQ2EÂê-SS©CóhFpÔ{o§sG¥h ÀCjAÉWµuqñy78F4\­LªTY±¨ œ8èf ?¡È?85@¬ºÊäñT£€nN6ÖƒîõVˆ,s[]I2º”ºΙ×sVêÉ¿³z¤UÖwÝQ ÌÑ–ä¶X¤·3Ü…*KE¸¼‡ÀÙ {›.@ _»Æ’c„ªz9Ø òµ` {óÞy¹ n³k©¨~3¾Äe’¶M¿Ü: èŠ~m‘¹`Þe •1çã6Y½©ÿÒeYμ÷¦í›Æß¾;£fÐ(šcì®sO£ä1ÛˆàeR(vËËlÝòõM¿t ÄȽ÷vÚò‘–@•e0"·˜›§8BàhQ5 í6Êqi÷¾ôÈýÛ6ðÛ˜(ýjë)_KMD¶|ßömÍn¡*°*h²Í¾Bîà¥j 댻_Õ+­y4F¡rF”½eÛñ'X\AXö‘¨¨pÖ²ÃÆÿnÏ©œÜò`!Û£EÄd›Õ2âC Ñ%Þ}‹´øú$s³ ÌP(•¤Æ;W q‰ø¼3mÓÑ,ŠeQTŽü”Í‹u¹‹½A•b«ÈDv@Âue UDà÷­Ewä-­wÕgXС"_ „ªFAHÔ±ÚơőÆfµþb¶Æ7°dåg`·'½ðú#œÜÛ–wN ‰.®Ä¹­e<Γ§¹+ôåiÚš—"Œ›V¸ãhY¿Æ#®j­)ƒ;ú…rÉ2³-÷Ô¿â+×´Åúœd§ãÞ‰ªNK!¶=Ùri Z. Ë#^;¤3õ•6yC¾–/騼/îKò“ÑY›ú•¿’ܲ½­ÆßÑÓ Ài:SkçL9gþY¾Þ®9 ÌštUV¼KþáŠEHsT±tøé„…{õ G2W2—ǭ露|’• Q3û†?©(CØÎbv\t¦6C›±9°ø5ª7ºäÖsK¾ 8%ð9D³l8OI›Ý‡ôðtz~1½;ôÑ‘lIZ©Je_)ã±*J¤K]k«ÐŽˆJ 'ã€m±Â¬¬ƒgFdÐÍIÕÿ˜&ÖÆ^³1OùÏÕ¦“;þVÑ1û%´ì6–ÔY°ó?8ˆ>Vǘè„ÊqQH‹qÙƒüiSgÇMËMŒ lÖbRÑFãÚ×F¸C›!ñfæ•„iïណX‹ÆÀ$üÓ‰î,Šg”ôŽ“Y "ìþˆ¡â±zE³µÒ´®^'Á®X!y”e(¥K¶rá—°¸éQë›(É!ZpàÉ9Zb?•œøé¿Œ*Ÿ6NÉí[¨™ãÐÊé+KÏ~Nª‡'×NÈÊð^ód­Õû~³1³ÇicÂÛ”cNð‡3:…Üÿ4A?”Z”7‚ÏTþøZFÀXÜÙ¬¤ÐîÈSx×ü៰ç“@…,dbu\ þª)ÔñRù“X(þ£s¡æU<ÌûiÌO}J¶Dçm3)#ÎÖ(“߈Br g~5.Ss÷c© ù¯ÅFQ¨0Y¡Üàÿ^ ’¶¤(x£8É$\Góy sfÑÍ»€y‹¯¢Žßf¼.¿•´Fs̶†_µ£"&rI47ª c ÂT¨FÞ¶cû§óÈÆùA•q KÓº*Tkº40­OZ»[c3@åºõ%vnEÆåÑÎK°§H;ÏFdbc]EÇlroÛÞaèºÐòŸª.è×—½Ì¶Ùu]Vr£.Y¦[Ì‹g¡z5bR^ËÚŽç ]§/ q™raHã|™)¹V9žå¨ú¥*3Ê’+å\Ê—ñ¶üÅ´å¯./‡ˆlš…Æ¢ )Ù¨Jn´ûÞ;À§PÆO…*|Àa4ÚNj–GPÌL#Û»Îá²DN­|¸HQÅZ*¢Ûþó¶ýMVÄ€Jø°J%ó@¶K°„¢KUA£¶á—èT/EÁÛ ²½RB“[Ì6n¡WÅ㤑m  ó©w›¦VHñŠYApœ•ÆçS ŒjáO6ÞfÛvÔ™_ÅO¥Ú}'ž¸)˜u€’èœéJÆÑø³{“kÁlä¶Û¤)ICP(°º.tÅÇÑÞ‚[OáyÅÓ}¤uùÐ'"«© tv À-¼·,ÈZ>ºÞ1÷Ìv@1–Ÿ¶Cý_È—ƒorä‹üX5ÐÁãÁk©·p‡õFng‘¨÷½‹‚¯ûþZׂnîŠì`66Ƽ8=+Ïùƒâ!F[ y£w&AŽÂcxV]ñ)OÄbås· x”–Gúµ³ªñè“ñ4Â[Süš¹ª‡$hö²-Û4ñR»IÜ>‚µç©èÌ òѦ ,,UÕuïí·^Üt†léjš< ºÄÍì¾Þy|HK7ɯY𯼶 +¤ê½E½Q‡Ÿ&ó”‘qñºkK>LÔæñCL›$«<1=Ÿ+žq²ÍRý’6¬•Ìû"Ç%Y»(M§}Ò$„êWûÀÊäÜDØ·sòd©šðÞ\OÕyrmí@» ãyB0æ)ãöe¡jb’às81¿XZÂJÖß´42’wÓ‚PÄXº±ÄŸYíÀ xU€c»S› 9fnç¥ËœL›QMžú´Q»#†“©­6ç(¬QrS—±N“ôA¸nm*CŠø“qýöÆŽJΤ²ö9…*æq-¹Üš>,ëÓ˜¯TuhI†õ~ÖézgGß¼ò¶tOH_%±×:el×ñÕ*“d1>O{>zËI£%Ê06wP-¼höÉPë'”Ü÷²fR+vp¬.€8aôq×l~ùÄuÉ\|†Ûgãá¶5óŒÉ(8G” L˜sßAržšáC Ç»iõ²G£lVóëÅÓs?ªwªšˆ˜íVeŒó—Oy°2*2bm“;¥Ñéy’7ÑqÜ9ƒ7ws$3¤RŸØ!96ª$¶Øøƒ _ «y82æÉ,ýÚq"±šæçÅÌÐŒ¢‹ËeNº&1ܽptÏïø‚ÇªÀC›æðÇÇ–!*ØæoŒ Õ”óÂÂ…AGseü0®VŒ$Ñ“=Õ_N%oj@wœ€1D(%†ýÊ»°¯æå29ýlšÐ ⩺ࣴÉÓ¬iaw]6Õ•ÓÄôo$Ù4Ú}Ó“àâÎ)PtÅšîÿ5$o-G T‡Ÿ9üQ sÉ.ëTHaè$ÇPõÄÉçOÉ‡Ö ã\ÖE~ü ¥ê‹ç7mžý7”úõOõ¿Nñô³ucæù™Ò¡ e6·†ÛOš­¥¾AªÙg:£:6ŠÊÎ/AqyôñVYoЄùTÜ;¶<ìãp`•J‰À¶ôÂ=à”æL8’ÑÄ„‹œÍ*ö ÀÁæL%¢ÍFZД-“îñá Ý»úd°»†ËH3UŒ 2·…vÉÜ:šÑl«*BÝ¡Ù]²1úðÊ<ÞpOYݼp„ã(cÙÐêÜØ>FFþ ZÂxGaÛ‰†°–³²ægȼ&])¸ÝØKÊÒîFK4®ßƒ·í8i–è»roB€ØÂqtT7ÉÍ­ÎïÖiaÈK;òçÍ©6®8:š4}kà_"M®y܈ˆÈ¦]PUÇ(iÕ˜ñ&'äX PtA—ª#‹–b/Èí¥—[k-n¹”¦Pè×µ\²‹KmÁŒ7ÍÁ‹0At ¯b¿ŒÕÁç5›/?¡m ¦…ÃJ-ïP…\ÀN05¢ú¬±B£©)uÂÊ €º`7bä7”7÷¶m Åymþöº)Ô“9¹js‡P 5ˆØm7d©sÀ-uˆ`X0Ûį…m G¹"òk´÷~Ù¾ìk <×,ÿÄêŽ …7ùkéC´1—“·Ù¥PUés¯(öN‰öö „@®¥uñqµAD^R®«ˆ±¬ò˺dßv‹umE æätù’òå»m÷¾Íèõé~ÙIQ¹ ÍE –.¨bH}D1€T;œ+N¼Î§ IDATոн{ÔUl¿Œ  ,B·Pâ/ƒ€Ǥ«È—Ûxê—ˆon”¨k0ñ‚w–G%Á ‡øÞö23àZëká&¾}û¦ 5îûõ}¿DåÊzpƒ¬".D1zH35³.ª¯9û^Pq#W‚¤ e9ù ñä÷Ík‘˾7Žú‘@UÅ('5Ï .7no»£G*w šPì¾#_±œJ,Ô»ùó„ÜF‘ýµÛÕ|5‹§.1$í¨ñþ tyÓ¼‚Ûns:O)i&ÅP³Êá¨*Èý˜‰CVU…í²Ÿ‘Q®;½Ä—O Óú¿·ÉªbàNGªShb¯G$—Ÿ ¡lšPV–ÕäÅͬ·ÐØöˆp-'q™e/VЇ.鉨”üL”Š—8u.á¤ñ™%¤‰ŠhŸŸ¨<ÎRÏÌ-TO Ü›€EÐ%1î36Ò‚3îrŠÇGRñ#‡EYò‰LX0뜥„l+òߘù‚ÓéO%UBvQ¢³¢ê>r´ -µUÿ …/˜.^õžÉ–ÅyªÊmÍï‡Î_zøA™ç”¸µ ¬ÒáÁ—ÈnØ´²Œ¬ð(~u¼ŒOdòüÓZóVü’i1~žÊÃh²TÇ Ó˜EÉ¢ož<óz£ªÈªŠ’ï³÷88ÿ# à $t>ÑÚ51’¸œ¸ìX9´ÏKñ™D3íq…¡t¤ç<&-$°:ã)ƒœÆ~xRqU&‡Ã×.ÖóR†ÿ;ì9<ó‹¿Œle:Ã1¨™UÀ-À™L m?¥30ùX϶áÎÅ4oË{¿'ßœsà© ”MΞ=_¯·zí¨^)¿^%)FÑÜ$ó ÕÏ—ãÍ™*cö½OeðŽpª8sx8ýŽ=¢Ð±·iâ‹ô->EÔ3Q?zÆÁx–;³v‘Õ^s²v}trJ®ÕÀpHðŒÖyµ4¼Í~ƇžŸÿh§–”£: Ùáîç¸Ì»÷5âÖ6>`ZÞ ýêÒ+eG%³Ê ôéLžÎt>þMFð?¨ZV7@ õY³׿?}ŒÓg4¦~7!×ÄÕ½inhíù;¯Àq}æߨÇêjÅ®hHËBýã!˜_ÒÏ¢î)ž©­w9ž?WÇùi(÷a®ñ;æü_Ñ„ß'4íöV6üºPŸ)Ýø#ÆŸ ¬òs[¢A¯–ü~ù"Ï-Sï†j‡¨c¾‚ÓÆÏó‘™XÎLÇÑSÝŸ„¦Nø¿˜Kdn'¿­sá6@3³±?ý4z ùþm]ÆãwÔæR.ï·˜AÌØ»ÑŒc½ÍTÕ ´ Þ,ÄUÀÐÊ]çL¤”´!q4ûr6e§¸zÌç§gF ì“FZˆC%-Oß&øo7Ÿ˜Ë,è[Eòì§%Ÿy0 @9y‹‰UˆÑË¥=¹‚V錈aTeÞ$ôÞfˆEã1ÅL¸*»j³\L·þ?ƒW¨,;¥{ó`N—9âÚQü–g8 aÆ6EdS–{¬Á›æYßf+¹óÊsî¿—moŽÄ¶×éKK¯r¥qEbþsoU÷†¤ØG§tô2¸õùœžVDë¸QÌ8VýÍ©^kqó¦Ù½¬¥_ëº.,(Œ!ß×P‚7 òZå®p-Ñ¥"á` O–‰ˆÜ‰¥~—Ù8ÒëÂå¶%ËDˆþ©ê%ÿÇL”¢€i4bÆB *KÔÄÔViP5á× =bÔË›dÒž \?”Y•¼ŒöÚ[ r©*iÁ¹wílfhk6diÙ´½÷mëÚ›ÅÀŽE¾Vó/Êwàù €ªfÝCö½!_éšuI£ÚF¶&WçÕ–û.·tgŸU•ö^ÆW¦è"°#uö ù…§Šå¶ô§Eʼ ji3€µæqoov7µ,U¯ ö…ÁT£‘HÚ›¥— A&C B4ŸºÉñwáíè¾ÒQ—F¥"[òœ-£"ÜAö¢<Ù{›„v/bki —äo€^AÀÁ·ë`j÷½X.pÃdË ¼·ñò²„•ÅRfP Ʊ#½Ò? Ê%p© åe%„ ¥ˆùl²ž­ŠÜ„r+ºÈ£ÜΧ¿«fM*wt®äÑqXUC›u»Ã½­Mf@rÔ3£ÊxnY°‰œ!ÞQøa)|–Â)±°gÒ| É_Hƒ9»6õ€sù»ÿ=a‘,Õºd›À:¼ô¢³%•)GIØDö¦ÙŽŠïÈÒëe5Œ¾­aÙ¥k-_afÛÚ¢ƒ'©ñJMÛïó…/!!û;šaü&ùºÜ`ŸÍ窕›:…íCkðþ‰«¨,6V­–£y<)/)ûõ6Ke<˘‹ø/Ù´E5 ÞZ®p® N|WÕx'ħ&#´aì¨r…þ¦+‚ïù63é‰tù5Øöd*Ç©‘X¦ëp§=߉×êBµÃÜApáʪå"ÞœœÿŠu4ÑçP—Ñ_AXU¡¢ý¼x0xfëW ˜÷Ø­)Æd¢Ÿ‚R>¾Xf¤›ÎŒDkðýZŸ=ÞG[Üfj^?ÿ¨3ø³9ÍïljŒÜêÑB¡ã³9KJ†æü)ÓûÂxL:ØùYÊxÈüâ?ûÕøåW‡ýö­¸œÿ|©üÿäúÿ üúEŠjÄĘ3wM§E¯˜¹€‡^?<QKŸª™'pݳ²–ì-ëªÊÄ\C45à•½^þW ˜[«FæÝýÈÂùÂR¡DËÎm”±xÍí:[¹¯ÌwUB4ðÐÍ%&EŒM%Uø6˜éæD` ¢÷ØZýï-ýÇyÓi4^ Ÿ2]?Àqn„®q§û“¾mY: 7Ùî;Õÿú÷ƒc3ÛÆ¥©EÅ(0›—0© ² k­´ÿƒ'~Ô†–#r3ƒX ’ê¨-‘CWÀ"7†*¤„PÎsò“d˜ØÞÛ…§ñ\‹ð{Ÿ¢ 4¤ªœyZ0s> …Pu@¤gf‰±™í½×Ò$Û‚…joSÕPs²·AÏöƒÃ0üpÇá ;ùÐÆ–­&OýÔÅ#hyv{¤5MކÑ…u‡9ŒB2n ©WåÌ&ZÑ~Q師i¤š™%’Fª÷’å4Ã{4vêø¨ƒi`™‰Ï°0ÆÄ=ËBÞbf½t©³‰Ü8GUQ¬ n£¼¶ê¼<#ÞìòHºÀêlÐu Ûd — Ô¹Ù¼ÉÛX~·u]¯{Û–½Í|Q¹d¹¡š;üH ð+†%ôb¨^¢[\ Á…UÕ¯[¼ ×§VÛöö[æ&¯4o—%o*\1…šYP/¨r î­ÞÃáêÇ—.Ql¶‰èx/C¬à¢K`êuÏžo® T»ù—0kùCTÒgk¿y“/iv«ˆÃI6‚þq´•JÎͯ\ï›×ËxßÛºø°ÇàH˜µ'®µ$kþløg×›boÛâÖrLË!ÍÀîX¨ò‹¸M[À/:Sq)êAÍ2jÉM·503Ñl1A TÜè-ç@ÊœSÖÊ‹&vh×KšE›à^àP\ð²cžäÃÀ$s,Q] %c,³D¢ÿÏLÁÍ€Òˆ;%MrŽf£ X¸àÎÄ  ÝèÁㅨʿë/8¥ ùÿùÙ›Ûn¡¬è;MuˆþÒ —÷ uZÅŒ\Ðu:„ªšÌC϶;Õe3ö§¯¿nñ+q©˜Âf*BѬYöÞ\*‹¢ÐëÂë6Ñà‘!zWã‹¶<U£cõr•(-YM 2Þ` e7~v}yxr»ÕÀçojÞ3µ­2²‡Í¼íùÂ÷¹N³ÃI> Ÿ2iîªîz(<3Ù]fˆ3Èài»b@|%9¹CÀðjôýË2CK|ynsŸ‹†ÇO­¤êLÜà5#·?ãΠšÓ°†$ŠQméf–¢‡#ÛGq»øB±Ö¯ë4Ä :H‚ y[üë_EfÚi´å»s}®Qv6ÔòDu÷‘‘=oš.y„Zƾþ¸§¾Ã©<ëïøÖMPÇOÌŽ·áº—˜Fv-Ä(‹žìϼ…~¨… (cÜaîú¥‡l… q6†kól.¾rľ[ã:öM[ÞñžG™™!±Ø¨6q­.¥´+ÒÎÕNºyôϵZS›°<à÷8v®%xc?!ŸhnI ð#Ò=eìðÄ’DõßÿÌ "æœÁwÍ ‚è”CR æYæâ‚¢Îé3!mS »ÃA~³éäÅ€cˆØïæ”õáWÔã"!ÇDF3˜æ¬²s žây1!ÞŒ‘¬ÙË][ëFÒö©šwº¬®ï^X3'¼ÇP±·±rÖÓ?u#ž¹¡jÏáÇ9ž8àÁˆ=¬ìüÁäòwËwùú#x›‘ò0Ôÿ’÷Ÿ¿ð:þ×?šüD©Ã2ÿ<¿ðþ©SÈßñ ÿÛ€?ÿQ?Ú±²u‹¢òHê€Ó<”´ >žˆHj¾`f²œŒ4ÚÆÍ›ƒ„z„•G[ 1† ÕóÄQpºõ1ÅΗFÑèì:{LßcÓ{"ätME&M‹Ùˆþ˜&%[F×Wøí ûóHK½74Ì=˜<毇¯æ'Þÿ§ÂmÈ€/ž;íÆØè>­&€Éô·ÉÄÿÁ_êÖ]‰£SnàµÖ¢ ÍÌTáQ~å7x_Ö UÙfæŠÉÈõ2 ZUjžñoíþá…yd.]oÓµ ³‡½]Ð*¶L©YûY~Q5<öˆ4¹Íä¾—j©‡f¦k)°k~†:ù g Õ,+;¸=-¡x.ðÝÄJ¢9¶çÜ;'h¡B'øXzÓ_íº¿Yš î8‘Æá±L@©‰+…ÛLÇÓnÓÔ`jazyv_ ³í†ëA¹Pª…ÐénzÎwÒÙ‰þ\R×S¾l1µ’5Û'Ä6U(Ž}çò;–FZލÊÞÜ´o—®¥"Ø´ç%º$K:Ãæ¼„7åûâ çµ oËOž ®¥¼wt 0:òܾjf÷Þ¹°ëº@áko 5.¹ÛÐ=ÙÚ¶ýíß/ŠÈZѧé”*ÛÌr¸[¶Öò¨s•Á~á’{‹ðrÅSh[–&UFòêe!œ©!†×ŽwÔ̲͋ð0‰±FT KÒJcÆ#¿›ém²Ô»7ü¨àãÌÛO› 5yY9ÄÈ{‹mS±.…\*> P•¯µT×mûÞv­p¤#Y–¸ñˆÂxEp‹)°Öþ)ºé©Öž/ñÂØNì;8LÈï.ñ0–àÆxøÕ1Áà’ QÜÅ_$Úi÷Nc+¥Zƒ_›4o0¯™Ú(ŸÏJ²kAD7]2VC¤–âùš¥ák )·l5ÈÒBVûCdAm;c>&ýÛ¶ìâëo`±üaÕðØ‡½.¾]=ý°Íì~ý¿ÿü­†ºÔb¯›ÈÆÒŽªøædoJG ä¨ÌÕoA«˜q¦YÈÅæÐKD¼Þ–²)jÔbÑZ€X!û&-¯14ÄZàN•qEˆ¾Ô;cöã@'‘Cã,`Çñ¾Örš½Q6DŒZ¨ÂΣ@ªs©PÔ¼û0Ÿk~Ö¨Š˜þ¿XV/Õ®Í*8"Ê/‰zðB2Ã@$ÇÍi‡t©È¦í»Ó,ò…E •óqØ|ë¹’ž‚T‚è»U×þí¿Voq€Œ{Ãzr™‚H#Ûx–k¯éf|ëÍñ8uç0-d'1‘eF­ŠTÏoŒ8Eç5 ‹ÑïaÄhõÒ=¶VÒLØòttâx= ÑŠ˜]¹wÆïË?ׄÁþ7ËndkAWˆç·æ­&j™©™hÝ^À/j4Ûá=”ç¡õ4©î]²Q©ñY<7¬,®ÉVÉæ±"æø3[Q³(ÆBTz«¡¾üéhm„9Òèk¹BEL8;SºªÛˆBä² Wq³$ÁdÚËi`wKbXìc<“ÃÜÞfõøúû%“ÜÉô¬~¸´áH‹Uu«ð*_ 1–£ù}|ð«-4žD„!’±ëÁª™ÃÇ3c·Ç*žb„ç6Ýž"VQô1÷Æ&Ìš¡è¡µ¼U{TAý+`ëYX4•O¹ÕÆ©};^r\59¤>Ñ‚Mra" ­¡OH»zæC›p”{QÛ‹lt&ì'+3A0Ôÿøv²šVÏÖ'¹üiÁ݇1sõÇÌ€m x;Ož«IÓ |hBÛ3ÿã™H1QôÞ©ï¦1¾¶%ñE¼ßRÄœ-ÈU¸Có¤5).'JÞÛ¡‰~hæx¥rˆSâ|LPLðXÅ(D«)¥÷fÛxàûguš\ÏÓû_Éœpxµ/SæsqÜDjöÝà)åëPŠÞh*˜7Î)ÕaKgÃÊÂøyèçš´3^Þ,~ ¯éîÀÆR±Ö;¶O5Y ¶µ~â·^ôõü£å·vô‡¿9vBsD3œRóçÎ_žþ·ØÁ»ÄøgSñ_Óˆyþb4>›õÿXŒ£gôwCÿ®{ü—üÑÿ/øË&þßbYu1ƒÌ }rmûÂ8ÃÕb½R´ôž†J¢Í)Bo~Ãu¬$îRÒÚV5 5Š ²J4T&}@Õÿ[¸2rÝÌ=ÂÕrÔZKŸf3{ÁT«A“H³%°ZìïC¿>,+|vÈ=­ #ÀQrÌVy°ª–Gšç"¿—T"å—GŠCÜDëÕ¸.&º2;ð0¿w£'¤w­s:h þ_¸˜˜Ps»Ô……ކÈÁ‚¹ÕË»eÖ¸Šd2cɱ-×÷æa¿|xì«ÔyzcŒ2\±UW‡ú0‘róÌìêow'äµ`­7&û…›ÌÄ*€†bWõ.úí;8ò8y#<À›Ðj“i*+[¹]©Óô‘ü–Ç,& &É,L†I•ssl ,µ* U¼'4 är¿"Ü:h" ]PïK¨³HRšëÛѼDY00‰@®ÌÊuhY¹ W‘ˆÞÔ}í!óÆóüÞ눰-¢"k)a<;¾ "x÷67w+ä+z›±„²`²WÖ.¨ÀÂ?ã!јxøKñÈŽ«¯[¾®M:Â^u!–Pº…· Ë3>Ár ƒ_–cÒdaí6»¡—ÒprÓ´JörÅÑ%îÐ%e4†€¯kíïûýÁäåBn¬% ­[dùƒ„—ìÈKK ‘îðUCKZňñ¿¤(è>,æmö›Ù¿/„i†…å¬KM“Öcè¼D}ªkU€±·cåüÖÕ,L¸rÊHymš1¼¶6΃.DûB·u¶G›†å@쬾ÈÚ;1ý_K%IíÍ‘ôö÷Hu=e]&nÛì´óÍÖ–ÀÝ“šYƒ¥ãpjÛbA þ…¿˜•Ü‹t"))F‹G5¢ñ :˜.º5×5)ïÑÀŽÁr‡`¿¸£ÃQ¶&±$´¹à‰ðRýúö5N¶²óBÙ$Ö-"ÜBŠ\XòsNZÔ-D¢n/«CQνD±+{Yf6Ìlyð  ½ôZ*. oÛÆ[ù5žgyÈD*°€ ÈÞ"%Ü>¸TöÆ&õñØOw¾zøceþ°dI‹U˜˜P_î€^+¤k¤áU—Èì`¦…¨ë‹ι®¥Ñ¥ £U…¦/ĈÀÞ(,êr¯SbÄ­bü¶4¹}ÒMŒLOxGãë΀|<{¸¨mð+Æ×)@âè–h@¹Ï‘Ú€ˆEÙ1.eF°N®ôÌ7ûÏ,±ãݬI™¡üˆ±oTˆ9ÆMÈ}߯‚3Ä`wQn)ÜB1(韊Â&Ee(,]QH'qÔRÅòF-šDZ1¥kÃ,&Ë'·š^0–ó¸0mÔºÜæ×v¼; ¯ßº7ç „˜RÙò’•ó†æ>iÜG `ZÔðåž÷Ìø}ÀÇ_6 uÙ ~HªU!³»ûIs?zËqpàäþªôÿ7™ëÿ®lÃÿÒ,À_šà=ÂlnÁ8Æ3,ktê©£ÛùxŒE¨¿¶Ô­­ — „ÐU&¨…N†Üƒ´¸¤Ëªž ³Ó)×"m¡Ï±B2gžhÅ4JQ5G]Ðö÷üé…I‡e¤³Ù}í‚ð£fæiüw5òô"œ«ØÌ_pËcÖdñ­ýí+~ÌŒý¯K¦I:}¤H…×Ê**SIÏ|c†Î¿&2h©n3™. vñ*ÎQJÀýó¯mÄ¢•·Þè1žx®'&Œ–Ëô§1Zf?d¿bP†rO¥ gl»yµ«M=ÎhÊ>k gA²fr°é…Ø$UKFùß–ª9‹œY³×;½`8£4xçÆ¦´¼x m³Õ!U{[Ož8в÷ÞÓpÔa?ߟBƒ»è™bÔÁŠv8ë6 ¨Ó¡“Û›ÛxŸ”¨êЀm¶RqwðTH…¤À«;i”MËpü‚í ¤£f!à ;`4‡g”R»\2¢£Á"u/±ÊŠ”½ëô¦ù‚š\"w\J¢ÂM1q¬½ÈY 㤺üh¼6DeI¡ur÷ï¦m›¬‘^P,òýþíûK._w/ù¶¾Ö¥µév«¶_l² Ð¥º5|L/îmQwPD$ºRUe_ÆoænÙþ‘¨Ó–3 ñœt9Ø¥mDecp`šÍÛn¶í‘|“4BE¾2·^Kïà @_ ßm.pÎr"·XÑi k].¼ÚÞ\]˜_æ’¨Ü[,ÍKÎ- Þ`—Êò¶ÜjÉÏ G¥zïhĽyÌùt©mhÙ´qJ‰w€öžb£Àî Æk>\7y91Šf[¼ÃDdƒ íR½ã¾Ä63\«“ˆ©‚>{Éc5bhÇ0¬gÿ¸›7o‹Nwé3SÙ~å½xoÛöŠ1ÁªŠÃ’íe l<Ä(,ŠALDUýœí™¯*du÷tz},kÛèE/„—,õ¥f¯ï÷ëÞÑiáBó&åoÃÌûMº·žÊ –y ÖB’"²MĉåP84 €\êã7לpÇhqUõ‹8½†…2[ðï¢^"¢°^C¥—àåA²5ì±.Ö«1UéZ¯3Ç!Eg%¼”¸Ð1_Xß÷NoCЇÌi;eH Íì;q)ÔØ=‹Öq„ÓxÙí»ÁäÊGžÀ(û IDAT¶‰€¶$÷•àÊ/{ꆖ¤ÃP8—¥p²ºi.A5€ì- Šb\ÏD—5l#\&Fõòáa_ab NßF]:G†8T:͆aKÐ q ”+®E”·™®È¨‡ŠC ·{HË4'.^€üùØ~Ȫ­{  xt 3ª¾|½Aaä1Oa#·ßµû†Ô?zš ©Ø[ä0À0éMFwÕ¦Üï#(‡Ù(Üái[8¦rwP v“‡±ÌážäKú5fîK“&ƒ¡©L¥‡‚NtÒü¬«Eµu©Á¯èNzFÁŠˆ_ hÑCXWG÷IÇ=1ºm êkà EÂÖ¿¦L8`øé£Žµ1Æq›2ë€uN‚•ü³¶/ª{"¥£Ùj0 •Ž\&³avd~ó}iŽMCîB4p#rß>’ºË„LÇnù}Q{o4ñ? ÉkÜÞ IMd”_b|dKsJi7ÕhÅ«çæóål[¨¹J2ßÎl¯Û.uåüyø‚?à”N|NavGh§OzØeœ†J/œ‘ðŒLk>´õǺç¼…rŒzן½¸™«ëÀúe™y]‘qz»#²}'pL½h2G>>õdøÆsýx¶4nþLèßÁÈFU¿€„Õ Çœ“´ÿŠ?”óKîbÞ"F™5L®;¡c~Uÿ›M™ 6ï¬,Ë 2µèj>5¡ç§@ k}EY›R¿@ìƒîZØ~j• "?“Ï‚w™&×î`;,ÏÜHGÁ:5†[–æ$ó½µ€¤=1ËçÀ úÔC²u&°o£—ŒÇÝý5Ž2¸?£x‰ïZôЄÞÌ£`†g(">âErtŽÿn5î'û§¢ðû¿ž¦g®/¿Þ̹Z¬MýѰüÂÎ_Sÿñëó_ž ü ŠêªøñËý_7ø½i >{ÃSb~„0Ú7óoÒ,·Öª6Î.@·äÏæÿåš–“ã±¹ ÏUùkÒ éíY}{c xW,ãŸoΚUœÛ @Ó" [ -Œ¢ˆ7µÊñ8žf…k±@×  ‹;xÁÏ¿ÔcÿAªGÏ$>~ƒùYÌòƒóðŒVƒü²³å4P1H61æ_zö¯\gòá5Ø65g1£füÝð.î$Hœl¶Ö‰ÒÝ÷ ÷ÝûméŠIÃáa Yu¥g›%`Ì?Ž\&ÕÕ)Ðä˜%Í.ÈQí›1”íâýä&Ôûhbp ‹¢Ä‹dròêMÓ“EwÜHùªÜ$^e™­ðrZõ D¼ ‹Ú„ÇZà±æ!9'_¶I%U•qrn§vXåΓª¦‹—T8&@Rà+;áÍÌÕ,–eJÕšËZ¥Œ;""¼T—¨«ø\£žN´7Ñoî˜ ý\jHÃM^'(&Ü”÷⽉……å:^faÝ~Y0 Ô'£ÜDÃåê7áž&ú½Ô±ì¢¸ [xÓ^¿í—ð߯k­µ ×7½ 7wVN‹¿‹ëÛµ–^ ,sdr‚4í>{ljôUŒlKì6| ½>T¤ædƒF-p©&2L…ÁýP÷+ ×3oFíô«7'E°4ò 3^XÊW`V ¦YÐû2îÛRP–ëR˜íý¢]üºDe)ĹAARqjÉ–åc?⦠ÞïjvAe‘ïûî›b¯ü-ïh·ÌTG¥•ß¹ð˜Xؽú2ž1šG†2’-ÞfyL2B¯ Bª)ažÌP®ÍiÞ êÉ=(¥Ûh&_«ÕØ\½lol¡ì¬U·*¸+I!KßU­™·3ÚÑ}5¶7_‹_Qû fNê2¤'ËÆáÃÄÖðCå+óG¸äT"§‘FÙIäÕ•8uR„¿Ýûu{[°˜È¶­QûBKÿÛý%f–‹s €…·c§!p•›ŽÆ¨JIãtWºGö¾ p¸–¿° ª¢ª÷k'9ÓáhgC!‚2Dƒ) pŽ™4“­&ÓªDLLú`Ïgi`-@Õh|‘²)rûÊÉJÉF=ÕP¶ïí- ‘—ECµŠY¼K¨,b¿¡ƒ÷_iz¾ê *IÚmF¾íšºdÔ?ùH„•x³°ðÅïß]ßÑT—hfy‰0ûÞ"ìËtmEpÉZÐ¥À·KÕmÑúë“zpʆ2Ä"ìyâlELu>FYzA¢ÀNç­÷KjKn‹ZÍ_ë7ëÛcPºWóÇèéŸÝø¹0 þy“øŠþ¬€ú·8Ô)?^ßÞ\üÃcü¡_üGÊ’ÿ@­ò?úWþO™YüïöÏæD0M‡Lü~)¹ž_ aVIß“¬ZOÓ(/[å4áB¶ãîf”•ë‘ÿ"´ï0ÉÕ~¢r˱Ðë†GpS#”ë$¢ùÌK’Ñz8"ˆ¼É‘]YV2‚š 8õ}hžn°âÙ¬¥ÇpBºú 2 &çùüìÑâ¢ô`ƒ?…ÿÌgâû"éý£Öš8¨÷ÓÄOÂaÿWµ¬º•s‡£{¡ž^ldÛÚF£ii—Uí³{1vD,b[ê0) è­RžžÊ­¿a6LÙšÞ«.VßšÙF82•9£Ç'²æW;’ ìÑÆ°À*hú(ÊjQR9" ©º*0`öf‘ÜÜ^ø¹2?d{00ë³ ‡(SÝŽÒ3£Òýìƒð¬Ö7kb j˜:ŒãC*…S¼BÍ_Õ û‹Ñãœ)¼Éo”‰ˆ>L)Û¬F?ˆŠG'GWr옽]³S…l´ñS3ÁAXœD] ˜ã}\±ø ç(k6ðÚ›"›î Rœ›ÌcxÁ…‡Û½åáD[”¶Œ¥çO.QÛüf{o]ºäëZXcXŠk-uX„v¬ØÏ+áI;ªçÆ… @åKñýÞ7Ë£ ,c´›Ò°Ô¯‚%¢‚ïf¼ÃNÕ¦˜ù ”g} R[d‹hb´›€Èµ¢cQsÈå3‘Ö6³ ‹)®¥¶í¶-²ÖÒ×K·ì-×»")››™ˆ²@©[x­õ¥ð/B•¥YùPÍÓß÷ísƒM^šÝvÌkl´’Ò]âI1y­Âxöž @S¬ÒÕ;\"Šoù`ζºȪ*­Ý™áš=ͶAaÔo—¥º›.óB†á45S²Ör—ö—8J·lܽcÀBeâŒãFÍÖI22+ø…‹ú‚¸j=Ú›U4‰r¹oƒjP‹fdzÔ(Ë¢±ÆÛÌhZKtú7áø!Šîÿo³HPµ–†Âçã b:4±‘nÌgR|æ;Á ŸD‰O>DD.Á}Ót xÇÿWT y‚αÈ5w)µôZAê!"ºÔ,¨[n3»-DBU£­­„ñµôZK {›O…¨"䳄CÜUt™lgÝ röa:-K¬d¦Æü`púÅi[t D-$óÇÓ&—o&‚=¤H£§_$¶MR îÔ‚ÂÛewjW‹ŽÔ3ב…³©ƒ¹…j€®Äéø|pyÑSîàã½ ”¥Wk†€5ƒÙºÍS;A¯³'‰«7â-¤‘ðq{&R6E]8á"ùK²j)œ4Vd[r¨ò‹Œ}ç‡nµòr=¬·ñ 2TÓ~Œ¢Éç¯òd‹,¿.å(õǬÙÌ(ÝÎÐÆ–ƒh]ˆ‘ôIIêx¡èEy¶È4s£7 ÃyëW$ª¿ªû9¶Ëù™¡fÑ—¹ýÒ.SŽàŽúí 1Нâdy«:«9ƒYÇ?Š1[ÆóÙ¹Xíi+ʾœòm õ(ؽ8˯§^à#3òmJ/òL¡w.ú„€d Ÿ[7q4³ ™ø¨ÔXß8`á?mÆüبÏày¦ú¦8r,½—sà ;V¯¢9mF@vý£š¢Ö<Çñ ÇÄÌäȱÅeU‹2ŸCí4ÔRÿkÝb.Xœ‚xùø#Ë€Z~2x=M·þéí½»e8À`pïfnÊVÇÉ¥Xg5—´º¬ü Ô`ö1ýé ¾Xb,6.q{ ÷žÆN>Ò/ñòe,RÍJj~ kìw¸=†¹ì²™S‰™,+ƒ\ÉäZæc6âÇÆëÌæ‹Θ¼££ßdçGàø䘠½ƒ ä y}J"œd³ÂäyK>ñ?úO?µîó¯ÂâƒÚ^ϿŰý_Pbû_.ƒãŸô£øw’ÿr’?Csü‰¯áà3‹W :Ý&‡³·Ч<ŽÜÓ¦–áÁXŠ!\ZxžùÚ‰ˆÿ^œµúä’^œú;7°¬PýÆè”¬óŒ?su±üHŸ±ø,èý>Æj?%Nâ àiõ:6*?’æQðÞÚˆB oÙßì‘&ðÓ³#ÖÇòññ5c<.øa #‡‹ã™4O³;›‡µÿçƒÔp“²AÅ–º‰ ¢P ;:3¿‚ƒ °xi×RU”Mòš`ÅÇ+ÏÄeELªKóèBx|rÇÔ¦#ü±WrûwxšgUgfäPWIrï @®%ÝäШ¸i4˜T£ÊÁªPY•¾²Ö6üæææ^=TZ3\B‰ÇKHMÉÁo]Ë/#Ì) Ó·º?jÎߎ< ÐŒ—ÈRlÀ—§½ ²âþ—Ûx-ǧ,µ]›+?c-Ê#Wçr†×̱×w2BŒÔv›„u:Ô –[Ð;e¶áQ÷¢¹ µ¸œhYVnDãˆdûØâÒo¦W ‰âeÞbÞ|ZáÜv)eë¦ÒÌ(&¼·]ª—‚{ê¤é‡Ò'»Â‚lŒ”úvApa™^nÆ%ïm×Ò¥º¾-¾è¥‹q”ÞÁÙ¥q¾5ÿ€QFºaVÖq%‹ÜNÑ‘K½iÔ?Þ:cï U™És÷äY “;Sôõ·mÊ2ȶò@æÔ‰»Jë¯ëÕÂ&šñúÂ7ÅwÅ÷[î—]bò¥×Àm欑÷&D®K¬w•œVÑF£TöŽ›ìü£w‡Üo5¹dL<„K#*A‡6ûåêMñˆ±„s¢„!:³FÇQõªôaG¸¬µêqPgW‰mš·@õÒõÚ’dw17¯µh ë˜ôÑao³Œ3æ¬:OQ 0vœ¿ T(áš”™©jâ½= fþÞe“ËáKÐÛ{Ýó²beÒmv ¾«Ê}ã´ž¶77¹È:Ù(H CÕ}ûç|>O£G(É«õ„H˜–kÓ õì‹G<Äö†G‹ßk¶áü†d#p7°¥USUu9ψK—¨·ÿÙ6k4F™Š/Õ7xEQ4¹4Sõô¨;ªLYU4DZçÙ”ïG¡Š,Q.Y€¨bb¼o?gš™Obxíºè Ž8Énëí‹›³­`Âçî”?Õ¢o‘¥bƒø2ûí¾oÛWZM«³d|ìᮑš¹Û6¬˜zõnFàbÓè˜q¿,*g„k-£¥Ÿb•w4è–ªÈNSŒªGI³Š&ì ™É#g‡–^cjŒ£n´Ózœ¨Yu¤à¬Øq‹¹—JDP–ÂÃ+‹÷–à7gîm)d[ûšSƒñ§¼%ùßF‘°ãŠU¾N½®˜+OÄiY°VN€CÐp•ÙÐ Š¡ú#-`÷Re-ÍciM†Oö°– 7Ñ8µ1Ë0\­±qMX¯CnzbÉ»3Lzu’í·‡ö£ l™[¿Ë°£iT+Ü‚áÇO»wÇEŒ‡ò’°›¤ ʇªÇéàÌø&À- ü“²l¤ ¥×ØG‘ÚÜÒú©|6Qò8%FÏièæZ‰º·‚θÁã]t‘lª™>{h½¸øYZUP2«nCtãxéZF±ØHq,äì¢ØYõ."jÒMÅ¥Úxv^•fáÓỞ–S£»­FôŒüãÓüÉ*~ÔqJ®fª®jOý¬Ã #q<'N,-7¬W:ãé/S}kMuìØõÙa¶~Ÿ%¼c|ðpÂ4^þLÄáT%u“ÖætdÌVâo-OHIÇ«ô'7Ç2‡] ÛM[òk|[8Vüà À£½šŒUë8K$(vY•`ÌFú4ný]!xV6çÎclyÀfØ(‚0Jxû¸ì›îØ·toa7ÃÓ(ðBå»àèÿ@Eª¢õS§ÅŽ£Â™óè^sË)r‚Kç‡Såô¼ÎÑI~%ÇÆ‰8PJcz!3ª3Š Ç÷cõøèàØTà{ZÁ Þ?)™ä³8÷4ƒV=²>ï ä‡8Ä.y¼Ùãöüáäà-€ñð«•ä}‰ÄgÅíweÌ¿`öÿùŸ÷>LøHûÓ?„0bð·ÙÿíÃýcïû÷ßÑßþÇ£„û<èá0ýÙ}?àb¢o²’ðýÑÜ·úÇ1N/¡ Wo‰Ì{-Éaâv¹!,Èö€&XI·Vm ×ç˺ĈQ,–˜äºhÛ‡úçÒ64´YkŸå!3iPÝûmÅ$ÓJíSËÿÇ<Ô9ÆöbÀê¸I{‰…ù£p«}e l²Äìñ³8¢‹µNãƒHD®é{á°®ËÊ£ëèÑíRÜ”òÿþ@ׯ!Õ{È5*ŒS1ö#hˆZ.¥­¥;Œ¶tS@o§çí§V/;åtÄù¿|á<¼’¥f"pµÖá3yÀTØDd‚¹«ÄÚ ‰~ÆÆ÷WU®•ô2³¥K¡FB¼­]^bfÑì èOn¬ŒF³7Eù#Šh&vų¢cý}‚c3Ð’·†Ò?=£~œïwÄmᲤ? €V‹g-¥åìÔÙM \ðÚ÷ÞûvLœˆ,E¶HÅZwÁm\Á·†ûŒº)$³ÝÉmoÈ a4šßïm¶õô.öÒˆ­K’$³Ö*u F,Yײ½}ص \ÑÒí&Fã6£m‡fa­K´xÂe}jÓÞÁr0NjئȖ¤ùm<ÔüXôh6¶Ní>d‰ŠîÊ¥åÏO-‚IjU°mû~ʇ ˆ/Åo\ß½&ªZ} ²bÛ«ËâËFï´§_$Nr—x>J¥¢mjùÐ*QvXÍ¥3ýWö ‹%;$cŒ Þ%•ŒïT‚î„|êŒ ôi€hc ú&¯Ú*¶~<«öm‘«¤Å4é'„ª¬°.i:¸ášö£Bù*Ñ|yº"“ÚíË!L#ä"ƒûL1=ÿ Þ ÇàÄr­&T&‘.þa[ª› šÅÔb†#«Œ ‡ç^{Ê~RfçÎÍ0;i®6Ôg>P$GÍÒMÎRÙ„Œè Ùv®’O@ÐüÃéxÚD0ù³´"ʃÇSBb*hœn÷2WÌ(Q%1¾‰ÎqšgùG× øäp Ù8:^óh0ÏB4rh2«P jâ°èÄ]Ž*鑊?Þ2ÀKÓ½‹òH'™÷˜,°ÜÕÝ(vB‰øU|X—¡ÌOÑiÂÎ1ûGî:>à>óÅàC]˜: a2òÞá â8V°#:k†‰ÛÕù@¯Še8*ìDÃ&…zxgǵ`¥§ÏÒ“ÐŒ)Ô|ZªÏr„ËzX#Yºuab¬oH¶ép~idil´Ugdžuî8™«%IýÄ.çÆZ‚“>©+“تš_ÆG²T#­’™™H"¡|Å¡ëx÷_ÀQ‡Ž™H)ÆrÁæxªêZ äWD ‹Ì¬ë b 35ãN¤Ü1b<;3ÊÕ [ ¥Ó ±WŒÚ©Žž©Š_é©ãkeNS»ãbÉ»‘&†1åêÎ[ž’µŠÛ¬[±“ˆæÝÕl¹;ÂP™¡×>P´»sPÙVv…ªFb `Rg÷œNäf¢W€NÂdƶ˜¬Kš¹67°à3æ›ydúNãÁsôÒÄHàòm~0FÒݰ÷¨œûÕ%/ÿþü¥—åþUº+4×ÿÿâÍü£/˜é‚ÉÆþ©(ÞÐÖ¡W:*æÐ(I¿ðQÄÐÇ󼌡ÎX—tG¾Pê¿ö)ÌÏ^ëŠö”I´ƒæÄñÑ=?q!dƒŽŒî÷C³í`HM¼OyKòôV£]jî.æc³gD£Ü;L`Š%_<ý.£…Éo¢´d Ò5TWƒ‘—zÍ8»wÀ‰3yòí‘·‘4 —ýYþåY#ó:­ëÅfõéïØ9äpOÒ}^´Å¿ ‚ι–kUNUR伊¶eõ0ÈÛ쥥Êz-@a·ýt¡]Hã?ìVÊ,]Ñ$Œîº{~îí£š¥¡¤ÉÛŒi¯Þ"«c²m‹qeÒC€^ - ã³poý7ˆ}éè…}óÞ·þãRY×µÌEß<Ä:»ê!á+[‹ý4!`*¢×ë¥öÞ{Û6RmÅØs™åñ^DLª‹ªØ–ÑW‹A)7£cb .4ÆÔËÂü ð.`QS"QQA_0#–ŠA¹–ð§m,½\l¤ènùyoñªå‹î}-BK63˜"†m="òßÐ- ±±L¥«.-R#áw½ÿº§#!®YUëYÐrÚ{ÎÔHÉ€ðTOýåàòk-™ÑjF-„Ôx…ˆxœBUUASCè†~#G;¶ Kĸe/Ÿ8æl‹ˆÙ.lV,a*²iºDY–·tZrÖÿbš`Y<è¸jQ¥E:çÑnmim£e‡\švX€¼!Avš®à¥ $ÇjˆÎdÈ#I}üÎÞ^pËÍ=­âF#© IDATåôb¡dýö[ñ?­jSË]™3¡r C3ºPÂÌt»ø2åÏÜO›?IA¿¸ŠÙ´Ãb/ hqÒ˜;®¦ƒ&¼S@Akô‘ä ’Æ{’ï²Ñ’r¸Êëáê9¼ÏéH͆‰,•°naŸ9i§ò±“lj_ƒàÁ‡¼›×ü½bšsŽÌFEçÓ¬[p*øyÜ­m×쪲ÐT‘”àªû%xÌ6U ²©~mNWÍj •«¤ÇxêÄ(®åé3GqB2㚎þeŠ,§†êþ¶Yý±•]('²µÓaj”ÓlõpÆ“Ã%ýÔ!Îhþaæ~jFS™ä·RÕ9Dì£ÒýŠ £ãÿzó³ð$–<›G Ÿ§ÃöÚŸgRO†wøÖÑåÔ§ô‘÷.2,ô ×H1ÇkQúž„¡Ëhòl[þúCñòœÄ€uÁ¢b*ö]뾫âÙÈqÇ…ÒŸi…Œ1?ÖÍËŠØÀ/K̳.Z|†â$T¾®h.•h@ᤔo‚ÿ¨•ÁW»p¾zp; ;Ìšíc.…P=æï“‡Ø2"óô$ÕØ9÷©þåðTSŠPÊšiõB˜ Ã^f>Ñd«ÕùcéÌ¡BpÿpD.8×Ãæe¥<"R_kv€Æþ+&Ì‚ñòãP­3]6Éð_…X‡üú?W"=oJýêÈÃþ?X5?’ W³“`å3dˆÚƒX=_†•o(Þrªÿ6|þ«úGsS6\0ù³Œÿ_ƶë-ÏvxìF_±'žƒêQgû1Øӌ,©hØ¥|Ð=ã÷f#Ò4õÀÂ3êíe…D3ƒ.Q÷â·‹@·C³›$S¦ià |•ßÇ0µï÷¡Š9Ö¦÷höµ"ÃÕ*°Re>#¼4Š^ºŠæ]Ç MΗŸšØ ãÛø#†9-»*á¢94™´5w£Æ›6¯F,ÁZx›¹H. ±–: ÜF¨ÁGÜΟ>•pµ¸Gv¤9Õ+}·Ý¶uuIãm¼T^ ëu-ÕŸ|FÊŒì t–¸ŽŸWEÖKI±û§íÞ×yo$…—êrÄî–·˜V±xÝ êFèÓ÷¾·˜nÜÛôò/{ßï­€\—_/)½äÀuÆu4, ½– 6MDîü¾]U•ׂéúÇO·£vLÕ@ÊmÚ––*¼»’ƒn+ ÕFÄvHê…÷#UB°.µ|ÿ4»ßüiTÈ%êüøå2IVÊ‚,¬[Þ?oªB-¸Tª×u½ôç?~.J¥À½Å4 œ€^€.,‘Ûs £°=ÂjÑé&wKS¦g8ÌP<ÔÑ®³ÑlY…Ú21÷A¯Ø%î(â†å&<†uRh^Ìh"¼]ƒTĬÜ#•FÅvÓ¿ 7i¸­„ÊŠ®ynÝ’Vc¤Œ[ P³»ò¤¬µ<å}ï{SDqé…¦» Õ°ŒŽ[$ÍÇb3¹ÌÕ8#ˆj%k9Ôý†SÞãB»ßN0—C"‡*\ûn¦úíV;„*g˜û«¼%-¡‡1ÃÖ¹”R^Œ>Iã<¦b+“ï‚ù¼þæª+,N³m]LE—´ Râ í\"=Ì÷¿%æþåÁm¿ªÒhr“‡4÷z¾‘èTa\Œ&Ñ1a ÀŸGv¹#䇆°’bÅÁƤ˜§‡œ‹ ½åë¬é†Ð{NRm”f¢hæðOiç Íœö¯txqVþVžáÞ 9¡íƒL£AsOHíPQ‚¤½Ùœãþ:}à”4GÓ+KµÎcI¤<94'Ž9x<‡Mg(¡ŒyRíë¯82A}A¦\qRN]ãl >èW%ÌC€S*v»ýYU4ÿ `h{9ø–ç2,ÃyCKÙõiJŸûYÝ—¹v?,ùܚdzrŒØ¦£Cë±âÆ÷“f ˜5™>Õ$ò (}A17RƬ`‡Åq(f¬Éc¥â¯©é9‘ê–»àyzµ<½d÷àPDhÀpÅê߯}+Äb<*üÀQª‚ª6_UÕ cc"‚†Éќ֡+YùúX\HgÀT6ψŸŽjÙ͈Ók_|dJ›Š:ŸêíUKÒׄ´’iÀžúç7X@õJÞ`jQóÿpƒZ>Âÿ©e¬£«}Ns:utTÎùD"—ò»Fmøå€-òÕVU”h•zPàÃ):v´Ð¡ËÍÆâ1?á˜Í¢±_…Ä#ÛÓÆ¹}Ì¿’rðí.æ1 x”žä“Sùå6çŸJÒ¿êÿúî¿é~ñãðõøOFÿÞ¤Áo¾$Ì©0¾—fÿú×­íÿóÏ¿-ð¾­#xüû܈5 %%cÁ‹]ìû”ñUÅ‹_¤ìÑíÛ6dã»ïL°ò`è^¼ôïÇfUÖÄr‹ÈµÄ¤\ÿáäò·?AÇ8ËDWN*«˜i%äöÈvâ$t<¯k:2F#õD.ÿçZsÒ‡ñ\%e޶ò³P-8ëlèMOÆ÷™P.ú<ûœåaÄ‹@Ee‡&>…äücø½kîÑ0juƒÆ£ªõCvZ<Ä ÏaÆò¯¹,šm_Aã¥\¦è6DkÄGÖíÆV…ãd™Aâ*þeUlËåÎs=] 43GÔ=ÕÝYÀpÔŸ0RÍd]ªj¶u“Ò¡Á´ý…¹SÞFÀÈ8êûO\ã[ãL„¶Â©b-•®CU b<®µ”Ž_üc½mêË&òšS ©¢ÖB½dŸo™Uæ÷–»4”bbÄ2~Ìë(3ÅÅ‚ y[(¨~¡.WÿæTÙ‰º4Ê!–ì” ú D€ìuå3ÒLDqIÐNHÞ®zÇÌF¡ëÂKÿñ¶¨ÁT8(ÆvÜ7¯—.]öÅL6„¼E–íM…ÊUÈVóŸ¾* ª²–ʾ7å‡*.ØÍÛŒBS¡ñ6ã–÷v'¨ÛüiB]ªKå½y“/:ìn0hÜ—ªÍÒèÞÛëmù=ŽÍà…°dÓnKÓS•‰ùhõ¥¾B„1¯JXZ'œÜg{§.<½…KÁ Ø5]´àƒl Ê<%ã/»É›r Þ >ŸØÆ÷]„àu]ëµ.¨éº5û.9-Ê ²äÕ`"K ¸ [‡hÞ퟇ULƒÐ׸örra+Pêâé”-Â:*ÈPáÅŒÚg£ëË<æ"QëácŸ„Ó ¢@ÛžºpÂr•–6p?èfËÈ®8ÑiY°¢‹ŒwH¶ŒKÐÌîM]z­`¯ùdËWÑ% r‹lÊ• O Âsþfn#ofާ×|ÓéAfi‰p¾R:ˆ¡Ñ˜¦ª011­½­ iÎsóÅÀA\%7Át6*Cr”„írWut¢fC¹ÉZþcBÛ·ÿÊ5Ð €^ºÔp“&»(*a lî;KŠW:ÃSM€(hv›8:% ‹r›-ÉQF3]–öÚ›{Ì]VZ cÍj¬B¡lŸbª3ZjîS­hå1ï­…:h´&-#¥3Å@é°óÆopófä°T¬ŸˆwªÐq" xãÁ…ÚØut\¯ÁÞÕ£+|ï;žŠƒpa½wª*‹kCTAó9rU”K@¿àéÆ{ÛK³‚'8E‚ë´3PDx ®H¾ŽúÒ€ÖÉ v¨O™Wó^ó õDC\`UÄ“­?D ;t–\–rË©+6ˆ#v©›ir­â—¸ÈöNa)+/}—+*¶A·@Ó‚hL[ùChI[4.æ;&idXeÛ_éqÌ”Ôj²Ñ(o0|Ä”ÁÙŠË0{ Yã¶äRÑö„³lÌù'½¤" q` FyƒJ_x:¾À! ©Z¥Ê<|ïáëí`]ÀD˜†•öVç%gC‰µ˜é#ú€›ŠcfEaö™ Ã,„I}Fæ4’BÐcL ÷Ôªú¶@#(|1ÃøÝtö€mMT;ëƒÎlû®ÛñiFqg~?±·WžæØ†ÔLÁ³'3ß|ðiÇa…>o'”ï¯O#ÇFFœ0+Ÿ?ßõx‡òm>ð+©UÆ:ßàOD»š2'åìÅ›fࡌ£­ÏƒÒŽ$”åçmÚ–áß´xjœ§Vœ=,ú‰ÿ‘×¥æ/Îy9n¶ ²Iô#Q\¿¬YW’Sªp1_gÛòK †|¼Ø+¬I?Ú(É–ª5Èu¶½“c.]UcPRRž#9ŽŽŸã)E4ý yÝâažï$#¤ï³±·{„g¬³½rÒ| ,B˜=Ø•f«õŽ&ËÃ%òªûÒ„xPÑp"5Æ$®Ÿ#Q¯Ðú‹!k’ü*0ÍSî\úX[F=q|áãÎÉÁ±iÌ2-²eúu€?f/¿V´1øeÿåßÃKbþ߃?5M?z¹¾O~Ohý‹“‚ù$à³}L#f÷:?²üí÷ÈÿšaTñŸ¼LþŸõþÿò¯Œ„ÜQýÌ!,>Eµ9¡õçÿeaŽÝÁ[2© × q:e82VÔLI÷…¢W®JB(S()ÖOwȘ .q•ÊçÌ× uWüpÑ~bX‡ÚõO©žÙ.9÷ò”ÚO/] Ïöäéó?‚?…iãCo í¤-Í%Oô?ù«kæêgTRæU—3ÜKYn éü–‡îÌ‘jí‘AKÿé²tcޤýôwˆ×£Q4†ß¨þ-ÌE›é³ã÷°ÍX;¢´´š0õ¹)$ FöaT©õç…ÁÏO3NCAˆkèá‘€•«Ñ×ñ?ɰˆ³õÿ*>DõÕIÞ"²÷ŽBY’í„ÁÀY – ¸§–-h¡¼¸ÞdI±h›$Žk^„špÛVQËSª®-Ó­.—¨ˆi°$x·mÿ³ù2‘•[q1ùÈa¹•öN‰‘ò‚èjHxYéÁ²€b&²˜ÁÊ·™ZtUþÜûæºPµ”p²£Uà˜ÿ‹Y ½î»þHnçA)DårÐ:ä¾k&¨}ƒ»ë†¼ ¼í6W4ˆ›&w¦2¯ ºÌ#W&—ße&¼Í.­©j_pæE¯éÍ¥ÑÄÄþ±7ÿ¿ÿmÂ÷{sGRêÊ™è[Ì!& º¦J ©WH{£ ŒXjܾ½ûð³CR•%P]~ ¹1½ Ð#°ØªKõ¶ûºÍŸ)¯×â¶Û‚ÎLã­òÀ¥êÇÎqñ}‹_↧mêÅjÛ•k‹.ñ”Îm¶Å š=íÞÿm$Å–jú? T®^NÇ®**®u¡ E]ÍÏ‘Ë]é,Ħ@doªŠ n2&$ãÜtÊLœ÷7Å/Ãà·«w¤$;Ê]ÐOÞ4µ ªãf-TqÛ6 PÏðp^™´ýЯ‚øvµŸbÌÊ8ÔÇjYy¢Ô°-–ÂÞÅ*48E{›,rquf™ä¦92=rˆô†Áƒ¥˜qÇðDgû^"ž.ïß1Úm4ò%ÔLĶÁñ <ì׈k-Šüï½¶÷6ogŠÀ°%4\(G‡Ñ±eÑÝ/ÛÔ¯¨u­¢!F+eÔˆ¶)µÆ!ýd÷tÇ­Î»Ž–f3sXYÛb|^ീò©·¼ìm †d¬Zì½Èr‹#pHªSsÕcÅ Á¥±²m:}Ÿõ(‘ ¸!¸~ÂmV^/1(C6^Z¢ÌCæÈ5G\PzËz¨ ©»øæ4ú«Ap-Å^g›Á0ÎÇ>vt)•‡¤A&`l"ÙC/Èè1ÆN#uó`”ËúË«éßÅÂÁEaubËôÍö4ÆÊæèômò·ÙR­ }í„Y+^dÑ,ó#ÈÂLŸ³xTξ.w¥W;Äó½å0ˆRŸ£­‡Û £”‰“?åE–HüUÊ_iÀ²P=ºµÙKáq–qê5DñK‡„³gU¢Ç"TuCC¾DU¼YªŽÌ”»e ·òK~bÄÒz'JËåéDÙ~%®ú2¯‡læÇ9»;8Zê»Ö²Å÷xX×N^O^´³çBPäïïã(•5BÓ%~ÌÓ!òNÆÙ<£æô œ^ÒÔ‘ùiJ—ItÎ6ïÕþ†ª°\"ÙY4-‡ë=y”_b÷…œêæYð™±…ðSNÇÜLÈ¥'æµ5y<ýø˜ÉŒ£BöŒž£ˆìG Ïþ߇ÞŸòcðp¸ñ)#°È#?Lª"<ÀDGE~GæÏÜ`Ùª ¡J¨ÑÚ°GS¬ûÝü€] ¦8;ùã\3½Ï=`¸Ð3›Á‹(%›Ã y1¨TåÕ¥Ï0HN±ºd¢ZýwWy~˜meˆúâ.5‰‡0»ú±O­«6*ƒþ×ýõÎ{ûønë¡…^{Z>*Wǘ°2Ñ#ªC™êìCké—ÎòË(ämµCÃ| rà“Tsñ 'L8óh99BNy­I£ª™eŽÇŽ ÏÍ‚“)†™‚™2_^Yƪ¦–ªñ~ÒêÝØÃÑ¥èLÜ÷›™¿Ôµÿc¿ð¨ôþ}õýBC ½ÿór6ŸO€ß4Ñ?Ó$‡ŽÝ>ïïÐ&~¼þ:2ñ;ÿþþù¯˜|½yä,Åý™wJ“6yfl°¦~àƒ·µªð¯NNðsMœ#4àŽËŠ&_ ÚíP>'ðÍîª<ãJ=¾p͇¯oá&©¿;Pi[×ᵦæ’oÙ#Ô½EcRćK\?´}=ëÔqÞŸÒ?Æøyì¾Hôi¢¸&|ôٵЇúÿ£eé±?"¯NU§(!MO}_SPìà¯QvÖ þ÷“²â‡ÞR+â䊈¡±5ý›¡ï[£åLz€ÎR?sà)•LeBa{„ ½Ó¶ŽjªÁÁê|dæßEá½ÿÈL¼Ó9öDp\ïaLù‰„d9`‡ÁðP¶·QÔÝ'¨!Q?Wáe©]¸ÙU–îóŠ“T&t7y«z‡¨ WÌYâj1 /PvóAKÀá6®…¥ˆðFaO0Íòj‰ÈZj‰Ö4w9¢V±iÐ¥™óÕµqóÆq;ªhè%cc¨êjÌnÀx‹Vc1ôó¿i}±C—r[|>É]ñ¯@elÙŒøß÷í¶¨½¹o xéZWÌ3—0²!DÐmjU´pó4Ê"òZXŠHŠçnŸ ÄôK!¸–8M%¿C(£hA^×úñº^KEìçm¨ª¨Ü7/—Øuêþ‘ÛøÊö ¿&}oÂ÷Ûx¿EbŒñ+“…/Õ[°  6MK±Ö“ÍjKuHÖ$‡„\neM*½¢óÄ"rÈ’‹ÂcP]yd:gÜUÝ¥¯¼Di ñ6`†«‰·ÙÛuúì‰ß¤l¹Vr¨EŸïïëùQuÇ&·ë•q4’k-.Ù;ÍÙ¦Éî>. p­õRì×kßÞØ¼ °mé¾¾ä25Z®·>Ëñ ÜüSó°y> ý’½TÌ,›$ïÍh(Ñ\Á$Hò,¿a è;OæÂ<‹ˆWeX²k¼Vâ‡Âìz©iÃöj ¡ªª¸®H¼!WLòU¬£3ø]'×ë¶{çæ X·±*½=2U­01Ã÷ ™í&Ec- ¨^K¯è—„ŸøG]빕o+-!¸+þxò¸öÈŠ–Úø‹F¾÷í kA÷p²û}†è̳lÛª-&;–}‰4cÈçW[›"¾Óaì X"' 1Q¶®uG­7Œ´mº!L^¡£ 5y )çSHNÄs¸¢ðiŽ× v»|* –„Ÿ] ¢Ks1 ¦hÖ¡1éö&©zxZåÒ¬6¹GrßMK“ÆRi³úü-§/á«$ÅĶ™–iB³*UMm™ÉË}Å‚În?Z·öùÁ+=üÙ¿)[äòKQ£y§ÑT6…Ä%XJ üš¬ª·ð¾X_ ‰"eì/Dœ)^zP±Ê1™›½p8§ò$*úÉü Ã`–XÙ.£f4uÙ‹ÞÅ\ãw¦Ç4GSÝÅXý“%¯Ë¨Y=d“óŽؤÿ%D±ÆJ=÷Ö†Z÷útáÓ –,í÷ÂÉêƒ^ -Ž"ÀÞe¤1ø`N;szwJOyúbgUëÓN7*TÄ÷ÈýÀì+"ÚŸ\ß³ÔcO¦±(rÛ˜ö K53«Ùpi˜,.ûkíÈ>'4)|ÕüHÂW;±SŒ…Î7èÜÔ±Êx%ôù¬øÍvñ‡ü¯W#ƒÄX©xÑN<å;êè[‹Ä©ð©Ò×aa—°XÈŽq€_+*õ3NäÓ¨’F‘þo}|Ñÿgöà 7=Hî&é$ä˜s}ó<ËÀ™=ßÉÄOƒuU^UÃS-yˆœ£9éIª>ÄÇšpw‚Ä3X1ßܯ3##³?Æ6Õ##Yã¯?ë™ B®h5éò`tÙ˜ïÒ€.@Mf»œò÷90bo EÊm˜F&ædÕnL`»›{æ½y˜Ð uÈÇJÇ)@Ç ¤†N(\ç<{9œß×áu;ÅÎqè”nŽŒ«–2øºc©G£{ò¯Î<¯‘©ŠÅ4%ŸI[$¬&ÙÍÙ?ªúíÁ m£êx¾C D[aØf»Â±°·¤/_Z Æl#ÇsvŽðøp cÞ5CúR%ÝŠ®vTPŒƒ±Ì"„‡ îÎÿÁ>ù¿À3xôÛz:¾ªßüݹ¿¼SþþïüϾÙÿ?>>&Ó8«Àïyìÿê´âohYþo!*$ãïä€óbá!ÁQ3õQÒ§=ºbÔ=ëЀ592~"ðV} —ÿ5[†öC|y¤¿@.±}FIJIôô×»ˆ©B“uÕ›5s°³ÆóÅ!BÈ÷ÈŽe ¹ï v´T#rñÀ—>b lyóØ/Nõ_ŽÎ†øúl"KJ˜þÅ8ï¼ó £ë k-oå,ë÷QADºßÓ·ÐÅ#eï)؇³xp«×kÖÄY‘iiv“pñ}T{ð‹ak'ž]°Ÿê\ýÁ¶¡‡4Hšq­Ø-“D"ÎFœé/ |ÁÞ¹·±0fžh)N:4`?¥;uf³âТP•ä+iF1Û$ûLì1ìXz©íâ)pÎûr­fxçª=ˆµcÏRa1ÊŠƒ IۢÓ¦ªAY1Ÿy@ 0×g €`-ƒ}žrìU(X€zˆDsH•eÂÀZkÝ•neÂpvüm fø¡í8ªïºYf™P­p»Ï]–¬÷½f{»TíX’u-Šlbos™pÓ” sõ6M¶æ\‡i‚ ¸¶+Þ¡¸-}]ò~ûñt©óæäq…ÂÂkM\kím‚ˆ¯4l¿·Ü›ª¼r#tS–q{ô@o›ÑÞvÿÐÔ?c_hÜž`ˆ6f±aç(pu¸¨¡?6¥41 ®Åƒr9@¹w. Üä!=R¶˜:ÇL’Dý«jx.l ]×¶šÝ7)pâ?~\xoV]+U×[_¼"„áφ†r/}@%Ù,QѵpW½0¨K•ÎLCq¼=£½½£¤fUÏRÙ‡±ãj^kœW¶)° • AºF?Ê û"ÓTfê^¹%‹ÂÍ-"&KlûJòþ¹MìR‡·\&4ú¯n‘:#hÀµ4IÓd¯`ñð%¬Šs‡™¶+©=±g '»¶7ãZN2Ò,N…ïm/.¶Ï2ÞVÅ'2kf²F";Ÿ™§å r‡×ÒjD[täXxi^UÁ›rQVôq£^Ÿá-Q„xõªªú|ëÓÓÒÕ®êħ¡Õ6ÊãUZxc†¬×¼;™ÏŽ–‚Æó8WkKD.s RŦ¬Á&rЃ,Äê8†íîä0@ÄlK0¨v²é#ÆTx¿}XÔh(&¡q°(í¼H2GJÞ²–Ãp- RCÛtÎ.ý!O‹-Ú‡è½äb*º÷ÐëÀ£‘Ï…A¿ôdµå“¥Ù‚Îgc¿ãqàõU+ú’ûŠãDù+≇Ä߆ wo…ùªœZm?±Ã¹ªKb IDATâºÒ(ííP’‰xn¶R°Å`@A…ÝÊÆ4ÍSº…•ÙÑ)‘1 ÓëL¶w/ú!µ(:?PÐm€-°6c'3ÛᨯQÜ'ŠÚ—>1¼L¸š¬(® FLc§.³¤P•Wɧ³­o™ zÌ"Òæ“3ˆŽ€™Ëq*‘ÙV`|X_xÅvù8Øñ\¯Àã­öï0~xÊêOÕŸ]oœ¯1>Òù×_*”évEAšóUç\”DGž0ær˜´Ôn;ÃG)ì˜rL üa–¯ÄpJ.M5¡‰Üï8Ë’ëÒZw.–¨ìØx0dÑ­üöž+h6:Ïó›'8´nŠ*cDH;ÚÞУs ¤•YÛ!í{ä ­ÊÓwÅÈ ÷¯ju˜Õ:í=W‘{)ÿ—éu~ƉÿøŽð”õëâÆü]ð{M«@f~P=ØÓá>ÇØuëC¤”úl,b/Oa4Wéèõ+™MfRæÃ$WOmè‘ëáç¤#0{ÒØêæ0 `š$Ù1±|üC£ùØ>Žåé­ugô×W¦«+rËÏÛï·ð$ì»òçÓ‚ù·~S\>Žÿ²6å-¿+póϧ_Æ™ÿ¤FÎ?ûø6$ø—jñø· ÿÿMÝýøZèúßÁàñ9ô:º¢¥EMéØ A%MUO(Âé»Ö?o÷ºÇä±s5ÏD‹b ºB·ÐÐe\ès[¡ùøC9Ò2ŠÚ¡Ñ`Ñ…9Å’ÁüLCMhú1–è $‡ÁÀ3 š#ç©þîú/#™"ç“åÀx,Eãq;g˜Û<|2ˆ¾…æql"³øQ‹S‚ý””r>–ôZ¢GÁ’œý½#ª5¸i]NzŒDÕ]ž`WtÉp/=½™¿0œDù©88Xi¶iy¿¨ê-·mStÓ m[àláv¿ùš'oÉ_‚{=!U¨Ò Òˆ™“Œé, ›¥°aã uü»58% Ø`Wñ™ïXºœÆÐå‡8FYPCÀÞUuÑyc¶âI>x!€<†Fµ÷ì r7¡o&WNº.…)vö\9%]T”x›…·WãöÊ‚:L…IØUná½Í!Êên[—·Ô³@Š·¥¸ €Ê‚ì­oÞÛ¼0¸~/rÚM¥«+6âœi4¹!—(£xV*5‚—.¾7“«ˆw¸aaGÕí'N³6“m^Kv„F‚É-ä%"zݸÅ(—È êµ–«Ä[Äù!.7¬—Ÿk¹BSnÒ„×tb‰¼]¤^ç†Êìm¢/ áËË\p qïŸûÛÐÙuýÜÒ_¾×Hçh§[c8°™¶W…P.@—ÒóŒÓÕ=ψÚ³ý6Ú…>ƒ:5|•“—|›Ýæ3A.¾¾Å¶í÷ÏÛÖýºôÅõiÎöþƒ®dï‚ÅÍ‚¤2ËPp‡߇ÖU3Æm}öº0åØŠÛxùDS`Ú]`tÑX"ü$q朣GöŒ[‰í²y¬›¶ÆX.N»T“’g *«®zré©'’פ²²|Œ‰~N1&!_&ò˜âZz›ÉÈ’p˜é3‚¶–6ÙŠ3»ãªú‡1F$8@+˜P¹nÛÈ%‹)dzä=´Q#é!•dpÿ­HCš(¸†µë6+@ä¨ðwûQQ‘šˆ€0Ø ¶skÝ­jJÂüG®ZeÐ$·í8ël1ñ7êÁŽÁ> îï!æsVœ«›êÌKq÷1N6n/ô,±T£tÞþA—šÙ«?´l‚K¸é¸?NtsÛŽžÏ®¬.ð÷§ »}"¥9Ê}rE ¸.@“‚ß[ÉUznªTF ¼!¢q6+ŽÛ æOnzùÇòOhÇãÆ K ^^•‰þÑ­ 7ÉÃY ’{[ZSi(!VV‘4I]ª› ¥ÝAlɈÂ?e¿!ZYü¨b¦k‡þ©½§…˜í1‡ðQµœRÏ>6”`¨~ÖãßòÐû#7P6XŒ¢P˜¥üa²cÅØùÉ` çîºx5@³RrwOÓ­ÿ%p-Õ¾ëB(W5çã0>‹¢ùq…ä„H}‰‡E_Gm|­¶¸d#YôLg´O‚'‹p¹µûµSçwM¿Uk2Y4Ú|4‚ùaÈ£ÖsÎi¡œ›€²™ ¿Õ§°[GG§ÜÄdž–3žÚw“b^7Ph2I\wY«²©JuJ5„Ò™ÒjÈÊ‹.”d´î†ˆ#™/–“EbzÊ5%Î-`Z€è‘5>†Lýõô¹Žs”MbLûÿCûÁQ&Àv Ïz’¼Þå üÒ‹ÉÂ=°š%N7u²ë`¸æG4`&gJCv¼Ò—ksiùÈ´ùüÑ‘÷aˆ«¥죥tí!Ù™$ê)ú_"dè±h¢h!™rô  ½6‘‰ÔþÞ«-`LíËÜÊÊo81®rŽñ•Z{g=^JtÈÁdÔ‰T“ËÙ"3Þ_NtÀ'õë›ÅñhÊ%# ¨Âᨨ ƒ¦ý2[RÎ ­VŸ:>"§úßAXq ïЉ¤6—  Sƒµ\O´±¬ââÑZ|^‰Ö!Xùtª`T3³&C§Ÿþ<ß1ué6À©k›‚ûvZŒ!À1C›•æ§Šô1;ZE8¶õnѳžþ(Ñ­ˆGó÷7…/"üwÝ~þÛßQ¢ùg2óÇDá±–üÙ° †ùÃ/bÙ™þïÑÄ¿ªÿü/ßÿt ðŸ{!ø—|êÿ?6þŸ €æÛ8x2ŸÙçä­J€q0’‚Ãì~…”–­¹*…c+<)çsÂ-늴øOvÙàH4àzš. =¶£CoÈ€zFŸ¹ÉÜŸÏÂ$€È Ám Ì÷‹F"¦‡GRfÍ÷öŒñH†Ôã|쩾D@~9™üJþñšÕ;ŒÊA]k9qb›‘TQ Ç §•(•ý–.”gvAnÛ+h®:ürãItQN¶dªüQUÉPFMÄ™ê£ W”vjÉ;2­c案rjL—H–]@ kˆcn›ÚÂ"¯˜Q•Ç$Ó¬"] fƒáÔ;FÖ&#_³7jêâðÔn³+}n¡33U-ù —ZTGF¦%ÐOÝêÆÀ9ñcíRÜT±í{|,\‚Û`ïíïeaá¶Ù›·Éh#„{bi&>ûÓ>Væ(§ÒC7£ˆj²~½)¶I˜,=l:ÏŠ81Ý7‘œš%z‹‰p{n Br‹í›b|½ÖºÖe{ÔxÛ^ ,woNÎ(xuï›ñ'Leq7Èo¢ƒð¦T%§†¯¥8íçÝ;VhóФ¸Û31ø Ž–rÜèèu(ÕÆ+Ü%ÄÅÅ*ñ®Œ{˺Ԥ»4s$.ãf•JhðÜÔ¼Î>{FzkÆÿp_ÚÞ›?mËöÖ;R•M´œ’÷ËéáZBv$-{ÆJø!wô™”>_ŒÕ qZôÔ‹$˜ÏBtÀ^SY‡ ê xß­@áQ!3S€YqÜEQÄn&^t K}žîÕK¹3µ"k\&C¬‡a;{1ÌL¶ÊºÖäwÄcŸãÁ5ÖÖ úH„ä*š]µIˆ»m1!¼5P@P‹¥´ŒÌ×®¼&5Ôÿ~"ôˆÕжº=^`l™ˆ”8“ÃjCÄàüÌÈÓ§òY%Mç5å_ºúƒ±õиW¥Wå‰7óe žö·‰FGrÞU‰‹ ÂÊÃ7äKŒ§Ä— =„dôü0ó˜ 5¬]oëPYulááà4¤æ¯Exêui9„cÁey]­@ãÃóÝéâœÔ”!Kâ?E×ib7#Û}pKÊ_‹ÌWãêv_ ·¬AQΑ©à±ôÑðP²Qû£x¨O¤Pû!Øàý–¯WÛ¸S"ÁÓèädÝ|qÒO pÜÆ9Rš]ÕèʺA+ ho6öô€Á7H <ަ}”Å'Ù‡_´ƒ>”—×Y®ÕcѶŸ¯Þ¡ÑâÀl=ÿó!†œz†U\£z’V‡œÃ5Ð5ÚÅ@›ã€ Ze'ò¨n–jÃhRÎî5íIwU0gV®Y’Ô¬´<õeUË‚ÆBHÈñãñƒÁªó F}4bE0›‡s§[ʰ1°b(ø¾¢J¢©r&L´|í1ŸŠÝ ëUá‡/=Ï zó!šàéœeŸ£˜ö”0+Cc/×<ätŒFݨw€SÎÆè«xÌEº[øððU>ˆóÿ°Œ8$‚nÚmOmÁ¦øWÊÿeORÿpÉŽî3qRcŽòÉù)=S©êŽ©®“¬¯Räšâ—¶ýIV;~/Nn«2y®®ò$ü]Úù¿þÃßù5üçìŸâŒð­Røï6üwüçÔ>i?¿4 è…ý¯WÔûóFböTÕVþ’2(‡¶VOÈ øAú\Ø$”Þo@C®b ^Í9C-aÂ9È›K°8ýª^8MÔ®Óª^¢Íx Võ0Œm™Qý6çRƒ/Fûc¯:ö¯_‡íƒ$òµ $ß×ùÕ?Õÿ9xøþ«ûß_(gâØ“-/Ìij°çVôÛU6°fú2…(ýñŒ!yôÚúÆ)Fê„VjªA %¨“{¿ì¢¡¢O q´P…‰Ýf—ªª*iÆ{{-çö¢ÞéšLõ ¨¨x#ç,›É£]õIµ*&ÞLçWm*¤[ù⥠{šEIJ ÜÒÍÃ’¤u·LmI)Ì› ™…WéX 6L~†–°–¦Á7ï–´‚ÑÆ à£j•R]CQ’·ðòƒšÕž;.gÂ\äOÙæ»’rƒ©ªñ-4â•ÝAp¥M—ªFžÅ!ÞŠìÀõ@Ht¸Jžè Õ‡)oÓnò?D¢~- Ûo³-û­-æaªÎüX£P9C Õ¬Ú£lˆWnÒ`¶E¸©ËK ¸½â}o®\Ëá'¯uA»d;tÑm·/˜ao§\X– MmŸ*½ìÎò\òÚ¸ ê…×ùi €Øm\¸¶Ö¾÷¢ˆAC¬"É·ñ’T³j•´^md{³rï‡s]I›˜Ðжa‘PlÊíà] ·°EW] ·—3Üû¶}¥'“b RUT—c©Pȯ9"µè«9šèsUª¥4àõÂ)½ç}1và.7"Û,$dšT¿ü7íîm þI®±ý†shÍ…×hj…ª^K6d‘ïíŽc¦ö${ !p‚øÒ$[èÄ0±lÃËuïMÕ÷šps_Õ¶Ež‰ào§ !á·í Ë}«ëî[Ô¶QÍó󛮎.uý½Üa›²ŠX«×%¹”9 ݼ—´ªüè54\‚îùÂL/õ¶u÷é½cÄ,ñYp¥1ìÿÛPm4綃²¹µ]kAŽzéÚ ¹uËm¼`”èÿPè-¦Ö!7láʺ¾lÇó)[™¨Ø(ÍtlQü¿ÕA6RD ±2sœ>ZÕÔàr«)HÆ0¼ÑO¡„_¹pD#· M¨–…¨YšÔóhœÇt`÷{‹P¯ëÜäQlb¾\qZHº7IîÍ\³G+SºìÏ­XSbéÏ)Â1ìªÙ±Ö·”óìb§˜YZÇ꺠&vX óðmùÝB|%¹ç„פ`Ç :aùxDv÷!ÄàfÈ|f˜™op—ïæÜÀ†Q ÑT!µ4e}=mêv€Ž–‰§ÿêVf;`ÕDaIÍÛ²Ècu­‹N‹ùÀ ï f¿R¬½)éDЂD~VNa|†©w'd4»xk\HÒx|([é)Ýìèi⸿”°¶Zç žNXWQû8k C/N¹”U‘9M*Õe\ŽœxYhô‰¿›26¦”[p4T³_+wGçPÆ?ð›¬iJVÓ£œâ–½¿5TBÕŠÕÍ áñP9:¸ ª´‘0È0ZS´†]=UŸRqCËÙdø¦ªÕ»žáÝ{@ÌÞ/K >l~Ss|¸à£±‹|›¶†8Æ'¾VéÄè—fXÕêÃKÿM×?%µÇçòé˧€õ·ò<ÝGSC8k&£ðùÓÝF9š8„PÊ1|Í µy+ã>ê®K[aÞdnÁ¯áS¶Üt¡R»#|àœs¶iÌUÝÚyÝAʶrOÔ$ f’F•±Ê™ò"ÂDr»\Gozè´æ%ǃ#[&Õò1ª˜gø8m&3õÍ–âÇf ÷J‡²×îUÀ¶BdõF9ŸŸCUfÛÛHç£UùƒÁþEýŸ”‚‚“±¤]q”FÄ(vzL£2<×WêG³ÇÑ‘ÉÒሠT >g6Ýã©›KñP(äÌE\ƒOgéh±Éo£Ó&:Ñ)ßqRàïRð¯i~¥“üâÍá¾ÿ¼š‹à+Eç×åü2¥ý•$÷/¦'åïUÿÿÙŠ^þ•7õïɨþ÷ =p.žÀ\Ç–̺G\`0t-kϱ°Ç¿Ò9ñ²ªšX}‘nžº–7«˜ß·§:D½©±ZóB×Õ[}ÌýÈ’Äô¹Ùt45Ï'™ýÒ¹)itZn¬fOòáÛçIÕÿu]ºE+þhˆÖ#üòÂø3õßµõ2sgx*³:Žï"‡—¤¿ù1æÖ‡c£FH)-K„_)^ Üa&­‚íU–ÐÃ@JuŸ…Æó…s²t…ª‘¥º÷M11Ñ’N‡ÿ=ÊVÙÔ#|¶Ö•vœk–$^:Ÿwê™ú‹™÷ ³¨L¬©*Gm•;³ââöŽž=]£Ý.¼ÙPÓ Dnå Ëgìl“ÀuA½ª±¶&[¸´YÞ0H§ˆÖ‘T€ä3…•™«ð4á6[æÕŠ1‰XÈÑŸˆu©aɾ·PÇáäR¡ŠYö e¡4£ìÍÉϺTŠy€rÇáÝY¦è¹&2 îmfv/¼ ªîwÕ}ã¾·uØ2:p‚Òr#‚‚J! Xª[äMâ¾/ÅmÄÂåâ€$!tj y+.3GET}d–˜63 •_ ‚KÕD«öJu¹O›âWÈ-|Ñ¥FÛïTq´<×Ûõ‚åE¼[6d›]Îó±p£l!!¯º–MÊhN£- àªÿ ¥˜.±í`fƒ÷¥›råĸOžä½¹6w­IïÔ˜ÊDÅõºx Æ}¹ŠëÒu½äŽÎU¯\öÚa â5¦sèu¯;*Ýx•"Œ¹:ë÷¨dö.d·Plï7 ‘+Áʼn· Ö‹TQЯpÌÛ”QN.kÉn}• òóm{›.½-Ù k]æHxÉÛâËZ&ŽÇó5I%nQ¿UòØa÷öñ`3jur2Œ¹áM_õ¤£ØS¹”K¡×Ùv›ØÂ£Ï—»IRå‡è΀Õõ^þ»ÜÅÇÕy¤åìCäˆYy{BÁdv‚«›šcá6“]f¯îÃæõQ2‘¿RLáxJä̱X@–Šüܤܹ YõBi‡½›iº§+;ÚëwûQ“rÞãp£»h/€ Wµ³«“5£’QåHéXÉ­š5=鳊ܤmÛ{ßÃ`ºrˆL@îilÌi|t»°íI—Ktâ툂‰1æs žr-Uˆ™>—;,žˆä]«8åLîEP#2 Æ-> uß©#%ìmeöñO(°¾¢VÆtŸ =j_yöÍoîm^ *™…×î=A¬`j‘—ŠQ™)2Û‘SÙåBµ¯ÍŽò"$Ò?i¾T9¯!·}¼o»–ˆ;ND}H.Á"¶HÆÉ­Sq.pµ/‘©uT­ä#À…{ÄâR„Á /óæØõ¾kp³";ŠhCDÉʳœ!~¸Mc)Án ³k!Š_ìΙãxøqx“³`Ö³&§ö”VªšJc³%Ž2Ì`+ ÉÙ}¶Øb+Z(Èy` :$¨C„-Hÿr•*¤3—Y€]XŽò—«à¬u8„í„U±¤ü¹c”1Œ¸4»:GÛfÝ*¨Ú›2ìöìùSl+pTÄïØö@] Ÿnͺº áŒR0Õßv¯xɵÔ"ãÉËè0@°¹<ô[ïõìýIhûÃh5O£gµvW~·S7{žkgë{€õ+­§®¢g(¦†CüTèÆa òhnÏ"Ô>)’GJ¢Kéxò×Óï$Ò™gÉ[F…;ìÐ9Sc4Q…1V¨¾ÙYAUeg7ÛQÙ<_Ô¶YXN´T3,0ÌŒÙK,Uµ‚¦¾Z”[cte£¥ÞRÿó»ÁÈÌ ‡[*ÃÃ‰Ùæk‚¬˜c¥?»ááÏÇìžèÛÃαj“û#¥wºT&m}Â>ÖU™³˜¡åwì_æ@¶Â‡ñD:ûiáª:ü‚Lj~_…2ÖOøƒJŸ©‰틳°=¿Œ±ô,A^éà¸}ƒO5»túôéã@™³u{â0xNùZl;²E¿Œ¿~cÂ_þˆÎïÚ5¿;ð?jUùmý¯ÛÑÿÝJ6ùyü}¿êßûöþ›Ùÿ‘ÿw¿Š3wÅ£œø>(r“½V“Þ¤÷( € Ïr„‡{ÂÜÎ\°[”¬ YLç[ø‚Ö+PÄqP´8â|FÑÚ\Á£ú/C¾±Ž^VDl2 Ð\mA5F>Ï9í±öÀ²"¸Ç°•ù¯½(xàÅ€ÏÅß—/håáf!Ó:ôubôí?]ÓÇ-"Û Šá'LìË*KÎàæçïÅãWÈÜ‹ð(à—À TÑ_!vtL)DäJ×%6€Ã…÷Þ;þ`±3¡k!ôü ë¨b›~´Ä‘&4K2ÆL Æ.RÃì5ö& úŸ)—>X¹·-gñ t£Þ@6ÉœÁH¦_¾¬Û#rŒjËÓ,òì1ëü"œ9S}ËÎàðó—{ä.,ó?EËFî±ÂöÈûú¾Ì¤ 3}¥‘{¸ÁÆÑ!wy»owòz=ªU°‘XroU£cDú¤ÑÝgGo’°0E™VÇT\fB¥6m‹™m¯ _²i¶©ªê †¬]úù‡»–·©ò‡àÇÂõz‘üy½.dvðnUàxœrM¸ ó€(‚%Ü›&¤áµ´r aKSá›®ï˜Ù¬€ß\-mM¥îÕmÄ6ÕÁ6æQm›¢KUƒM£¶~›, ÷Ûþñ~‹`­µü¬°p)¹W K¢?Ù«ÈvÞ”ÁŸªóëë8ïû7M6T°|p Áåø&ÛìàZ¾ñÇ嵫æ"sâÎ-† –Jæ¥ ¸ÉÎYØ?^‹K²‘÷`¬è*"ëzÙÞS DZDÉZ‹ƒÎ {›‰êÈÕ¼Gùäyù¼&^«¹ï}]Kc¸BUÝ”½½­:úÌ£h"QÏð™]Š¢ˆðöaRë'„ˆb©Š·…G#ÍYQ 1c#lïÊÙîÓ#®e *Õªâëíͨ ëmÇû4‘ÛÇ(¹(‰½£0Ù¤ñ'ìÅ PÛ¶÷Þ/]^mºÉ%Ñzk”©øT Ë¿ílµ#½ò·Y1r¼ä¡(å4Þ6{F}kêÓüvOtñ¸‘„D†`Â>t„cPVž;.%0^P*2Óäú1Cðì3à(§é®]’@„³<ëGúͺH8E\’ÌûH}0EÁOÿ›¿23Í}>Õ7UóÔf8ÃõP}²À9‰Þ â1D =ååq(†ã/sz*UFL°MQWÛc‡¸ÍÖÒúõ[õ¾U±ÛRxÑ:ŽgóPÝÉ0³u‘9œ.÷²ChHm߯áAÆ]VtD· /ñ+1æà–xU¬Œø4x7ºÖ"µºWÙí7r­MÅö¿³L§'\›T§$¥\{jŽ¡ÝzØFaX \RÞ·r½|ÓkJ1ÂPµ88ç,ÂGì‘Y)‹AgÎj/‰€h¤s($ (ý™gkèQrˆªÈK HJs󉓯KñÕEQ„Z¥6sSÇ@£k²g„*0e ¾ r¸C¢Z¾gx jD<¢™N_Du°tãÊMRKAÞ€9Øì–j¶f蚃fœ…Èc•±u!ÜêŽl«@‚¥Ÿƒõ©é“­1ÈÔ“ò“ëJÖ•*2ê}”ú§‰ÊKSõËîÜx˜zÑ"½ÿ'C≃Ñ®qa›uðáhåI”é_˜Ãa¨}LkzZñ9>OÖÆìbÅlB=Ùg/jžûaB-Š)¾3«§Çøôáå¹U` ~|Š IDATȧ5V3`x¯;5ÆRn;‰¥Þj>5™vµÆ‰2Å)wòœËAf=2 }Ï*—¸D+±dÇ$†SÍÔ«³uV¢r. 7fóG †ª~|¶i—ö(]ó6>Vœù2žW8g€øó¢œ"|Ì¿¨PõÓÏ-Ø8ËöX—(KçY?xFA¦‘#uñ‡sÝF•ažÞcNÎ/»ÃûQÑ“ª£M—x¬Mí[m  Ã”Ú<”“·¼Opva³±Üò¹| øÕÕ@ÕJ¾ Ñ<Ú†1&¸n 0ö¨ |ƧÏóųTÊO¯=þX?ÉP(ðâQ´ˆ?üR1ýtúÿí ö¿I%BÀþd&ñwéèø›ßãßùÚÿ¯àû½ü«ØËƒ¥2,¬:Æ ¸AT4UÈÓ«> "­-—àòœx©,9Ó$ ¬Y)C«K7vœ¥‘[4‘•îJÅ_U(Þª8t Ò¶’­­@âp݇=²dÎÑ:gÌC¾Öe’ªËŠò6óÏ]ÈS8ÜJi=&—ÀIC“ñ6 ¯Èï¡ÿñ/¯ˆÈBÌwŠ åOâ%ŠkãÎÓ’ó›64¹&©ùíB7÷Ðí`¿ÑXU«Z ÷{G®Ð‹mcm¿ô—O²¸žþ»4SâæýŒî ÖµTwˆˆPÕ+:qã|`¡%pƒ5±PÆU”ÒÉÃq´¸·Œõ~52…¬Ä¢RÔà¯Äͽ¥†ú–¾7ÓQp£‰XyaÒ¤0¡9M_ŒÔUèúÆÒ>r®%÷N’)Ê+ËLF¥—: ¶öªQZ©q!ߨʴ˜œ3,w¿6Îm²§TUÕöíÚªJ‚¢ªkAÖ ?² @âFséy‹ígl÷6æ ãµ°–Ö<íUÝÓ&;TT*ÖZjäëÖ[]»V(x÷çÜÆNŽÏ Uóís»` ¹\º ¬h¾Iª:¦yoF„b°%]`X àf*ÆÝ¸T·ðMëƒ+åBØ‘ÌLv›ÉÀ@sPŒÃ9M™‹|hG ¯”ËÍÿCV#¾óÌO^Ä)üf!p©q--¯¢ŒYâRÅ’µ "÷[î|µ\00Çü̹ÉÞÜFü¯×"åÞ[È{oý¬¥Ñ‡¤;ïä±›ÖhÔ¼Zá­½/Ü/o"?ïM£—êîÔÀV­•ˆøB©H“[ãªX-ñûØì}oØh:‰µ× ¸Öº{ŸÁð-0£ºd¶€íù9…²¸.V€˜ l§8øÞòãò«±VÔñé>¡p0ß‘ÛDÀ—¬™äÞ”µ jÊb=­%Æf§ª¾t$Ù¦Pe§a·™î ÿräZ+øo¢~hóVÖ¬Vˆç‡F^-¾±?‡¨.…Üo/ïä(R÷hê‚·!x\b{‹dÝÂ6¡ð6¼4Ÿ¸*Kt'iß»†w¬WLŠTåR/òÔ¥ðB «46Ó%}ØÆŠXSÈ®TEe?2½_?58˜M§i HÛd·É‘Þla1’0íªC¯”Öxˆ-xWmwÀ¥ß4š`‰®vìZõ9WPB+ŽvI=³´Õµô•¤¡¯ÔÕ嬆|öÝyû¯)÷Ûû¥z“ ÌKŒ-ý'nZ¥é\?mB¸<¢/õº´‘)Pî;û¥¯UŽ÷Ø}ûÇŠÆØ¨9aŸuÛÙu@F+ æÊ¹Leâ=›þUWá°Z—ˆ¥P)cÁqî`™­Gµ»ßºìR± µ6+«É´!Qpªpîó»·¡Ü›h/1O‹ ªf¬y'‘X¡S"ƒâ¯ÊRéËÍt¬ÏtI®ô^JpƒR̰d N¼•¨AŠéBŽvÞ$’2ÉhËÇ?}ç3”Ýö[ç–²"ž¢aܧ‘¢å^K¶EÛ27u˺ï„f“ÃÚ‰1ßò„€´»¤vºDj޳Eyv“,”Æ´¥iìBÎTF±mMý›ÚÊ 2·º`„{æ4ØÝ<ª캿rÎã4˜¢"ƒŽwpØÔ¤Ò` t‘+rŠfe,?uÊ„<õ %]äî3„­ÞÙØûãp Ôu¬2c&Â/†éK ¬£,Žr°\iløüaÅÎßÑÉÀ mNCŽ༤= ç)¯L«ýYM<Œ`CÿŒL +ÇKýDǹ¢ÌÔѾV÷‘;8$V¹ –¹ÑG]GÚê$È ·Yú~Ý2rÜ’òËu±0}¸;9}›—ŒÏÉñ±Øtf¥“ =ú˜_©ý·Òé®^‘ÈC¹Ÿ›ø\õ#¸XWšrŽ&§!öÔ³ÆÍ-PQùC˜ÅàSñ©³SöíÓ‰ENG å8õHX~j®r›ÉQwü)¾ñôœs< Áœ’£‚Çd¤/hœãº_‘iÆ›¨Ô¢jŠTÀyï~Lãºd3_RÕÎò—‡E…s#ÈJ¤Oì¹l±  øÖLÁú–Q•…nÛnÏy¤z“i~U,IÞùZïÈë³ÖZ×ËÞÿØFQª@u]8z˜jGm¥®|Ø>V`Õ «ãÚGL]|·Sª,¼¿!Ð…üX˜zçD.ÎÚf<ÌÂ(Í, -EÌh*KÛ‹ôãA–ª’îe§³jÁ™Lº€ÃõÅóó×ðöAâ†jÍãZîÕ*SÇ- ÙQ¼L±` [Dü”´·¬WGyV´GÖóZú‚ ÅöÍ;pÆe÷Ä®š°‚é´TõªVP…XB]úZº-¿ˆêŠ»â6¾ÚäëG.·y…Õ!ª *°puáÉ ‡ÝÜUD ¥»ˆÒ¢ÂÝ×¹=Š T{ Ķ9Â(7•$…ûÞ·9›ž›N¹¡Ù~ÿ4 _Z/”{ß¶q]–È7a f¶lŠ0œˆ9Í · ɽpI|¥ÈºZ¦JUfy]X‚[ÌŒ.Ut•~éLƒ ¯k]X&”µ·É&—ˆ@Þ´n û& ‹Pö³Àì¼—ªBßvïm7í«ºyXºifö6<Ìg¾Ï ¯¤®Xž¨¼iv›D E¥@þ"òöüAŒ<âÿbù¨ÆxËÞ±%¾´¦~ËÞ4@d wjj{ßñ¼ŒRZ;9Øõ ÆN]W¡T{ë› Rðµ4úðTÄH¿ì:ú! Y„EMæf;”öˆ xÙŽ™ÅsP™CóŸ¹7Å&z­Ê¿²‰îLÝjrùðZú‡êfˆ~Bù(ÊÚëkBÛT5o›¶rê˜?æ «zñ|©KEXI-l,š`MK`Õ§\„PáyØ9yú©ävñÖÊ~ݺežƒþØ{×%É‘äH×ÔY³ïÿ°+œ¸éùaWGDVWßv9‡Û!›Õ•™‘€Ã]MõÓÇYTø²GFJ@Gn$”ñ‘¤—ET¢‰qÁ•‹“F} éøœÐ°Q”ˆiãü€ºj"üŒ4¦º |‹ÚÞ ÷W…šfÁ£‹¥Öž3ó‚ä„èΆlÔrÖnŠq+]–þÙyuð8ôåOF:!s6RǰéÎÄ-‰'a¡: ¼ò8µðÌIa<¶ã®U×Ä# ¥½À«Ž×¡2`ap–Áö%é@„4ûh*úM…Á~ÙL›wâÀ7TTð^wð¤;Âò¦j…•çØH âI=kǬ­_P‚­äIƒ|èšä÷ºÏ#p%áΈOºº¹&nwýáE°bYùpr6q[$åsYOTduœ#—FÎËð&áÕŸ8z(,œ•ÖÙ¬¦ýpÊ­iÇÄã®Gû¯ã[ø8yÍY:U¼È$T¶‰‚ªòhã`š0‡"ù걋®p†¼¥òK«ËœÁ@fŠq¨Lˆ.wc«öf×26ÏvѦ“µH!¿Ì%=C™l›`«½. Ý‹Q*ÐÒF•¾ä‰&Ü}œòNùúé¥JOc’C8ι†òXÆï#c-> jyZž1¡COªüH°Iç¹øÌ&=>ôÚÍVñ||Uÿxcß¾/%-nöW–ßd'üŽhý«…½xpýÜÿ*×ä%?úŒɽsšöK ÿ@,àÏ”)ü¡wê è'€?öN¢ {ð(T§“OG£D”Q÷x¢# ÷=4Ó*ñ•_‹4}Òš•j¢«­P™„¿ìG¨ºœƒÐŸËšvÇ9†Uߟ®æs´ã35ºãˆÈFÈ¡þctw±*p”ä[%Ü[Ò7×¶÷Sæ3Yv…¿Ï~>¹L¨ƒË£¬¦è:>]êW}kH¢R¹ÉP!á¶Øf=vϓ۶'ù'=ÒÕïà iÔrŠ%ªa¶šOKKÀÑ‚W66 UU l¤BTeo)_+Ã1GA²‡ÊÅm»&G.¶˜iX&¾³¶w~ر]qØPT5§gæ‰O`îè8ì ‡Ãî¯7¦ÚP6¯ a¤hÜýM~÷¨Â²×ÕŒZ…¨Y¨½Í@Ò)¾kìX îHŽKEµø´¤ØÐ¥Ü̩ݥZª £Qlo®Þ6AUW½IQ—ÿŽ fºMÅNË/;f¼óK×öÀG.*ŠkÍ­˜:(Ö¥P¶sŪy'ä”"ó™ôÄüõ 1Y1¾ 4ٌݿ—Ǻª¨Þ»à4壥€– Vau ûJgÃê<¼M®VcðÅÿú÷ËÈuéŠ?Ü|ݶ÷‘—¬¯Qø´Í¾Dp©ÞjÛÐì½üJSBñCôß¶Å(þay(GD.]¥º âÇÆS„_²®¯ÅÛöf´Kª‰¨y_°Å%“Ö`“¥ª2 C!‚àv†>\”ðG[ 6ízI†^*·Ád‹‘Üs™ù  ¦ÄŽóÉà㉛ÁÐÆ2?‰¦±2E 7VÓs‘:rL`ó´ÈäK µ…M©$ÈMá.Ø{;2ׂ4÷—µPøWŠØ¶å¤qU‡ÿä¿ —€[`yç^—.U¨¨É>sÕªP NÏÖ‡£M3ëSLc#UnÒ°©[É ŠÊ½÷ ³Ìà/—­S8´ÃÌRhifšf®bƒÞ",FʽXä§mYGt˜ R„Ûìµ-Qƒ‚¶,Ç1›ª UVY÷¢RÁµ-,=Jçsk$4nád±kýbñçtàGu=M¡\+ÎÆž »«kqè>ïæIQ¯¥$·7t I=„Ä~v­Zi×¥Rþ-UÈèPßTÿ€GyÀfõß²ÈmÕÜé(©éµsÿ‹=M3° ‘› ºyƮàRM„°Pé"º ½.ïiô'¿†ÅØÅh’{ßÛ¸ €ÄC”2ÑÓ¿èR«ªã×Dý½Ao6]ú×{Ú~_2¨‹ÛèñXîíƒà¶hXÜ™HŽªÕ,ªT½Š{tit ÝñÑ–ë5ÅÏÛìË@xóEÀE¶´á<¸-qE˜kIrÀ¦OÚ€Ù=(¿óöÂ^…œ‚°ÈZ„ÿPÍc<±'yñ2›Èç’:‡I·ì'¥òÓôXʆp+]"V‰”t|öÍ’tBŠ‚-kárYs³ Ø!»µE=PäRsè(›#' •—9 &½jÓ/š4ƒM¼“ä#¥Ö&U]ÊÙ+ŠÁ<’)û3âGd6>i¼'Ǹuêœã•Ÿ±¿Ú?Vú8Áëh/}4˱sso×õHxÏ@7Å€@¶ ×2ÏxØ­›þ¤ãL)ŽyGvÑè, žÄ!~£‰!'˜…™_S­nWžÕÊ;uéÎûaOEOâÊ™$9yfóê[U<ºÄάÆÌ`3„s<1qHÍw«ÿtüöe|®öu¿#YÀþúSÔzGþ)AÖ6µ žŠaÕ²‚d( uœ=/ÐaÙì*Ÿ—aK‘ÙÝÁ¾¬úiÚ(5í£ÂMúÁQ›æx«Ü\”N»”£ø°é7oÎZ·"€Èù9ÁY“xiLÃ9‡ó#lvzÃV饃™PMجµõ˜rb6œñ°–ÿÁ9:.­:n›D;Ñ©jŒ0ñåÅšŽ¥ÜêðõÇ1Ÿ'Ž#üȂ٘„q$æê׬ekVÌ7jLMçBzT‚5ê»l•™ö}Œf¬{v(„íàcóÍ|O™í‡(FùÔGþ“‡_ô™ƒ‘_P¥ÿ1õò¼ÿ3 ö«Z7>¼uÿg@9øgb³˜ÿÕÿßuv÷þâtå7›ŸXBTŽuJQå‚©Vê‘$D,³ÚL†™¸¯9¯4Ì©ƒ•s¦RDéÈ0UÝо­j²t;%¸"¸RMŠÝEš _ƒ‚«)@2SjlÂÚ_ì³\*¦ ßÒ3 ×)ÇI‚ÇÁaŽpÛ9qËáÁá•?äqœè#»ð{S¢«(ž%ñsX :‘-||–¶°X·±fºF“ŸØ¦æ±¯>rS‘±dWÔVÇ£—ñf 4-Ãxÿ†Jí¶1I÷a²»Ö°Žƒ7—×ÑéÑ7êòÿ•,9}dl2ù™*.¢¾¬ªÊèÄb:ö¶+X«’€•RuÂòLª3°îÅãXAíΆûîŽC«Ib7lS}<à'W„»C(;r2¡>”—S²’{‡;2Ê?ÔîĆ,QúœI~^ñæ$¬YE!¶W”kz#%Í$lÁýõŠå¤À…è: lÙ"ņvkÜ™Kd¹kÝ:j³DÇU4‰8Óm¾Äô¾®k½^J‰ý¶Ã–ǚˑ’=½9§8|CP8HË½Äæfj»M/õœ„f‘ïË]Kf[ä’%ŒÒÀL{å#E¼<:Ô7Ö¸Nœ“Gm£¹¨*B\z©¿|í;8“[W˜ïÅhÉÀïš½ThTÖ%*Jµ›·ÉÂvœÏµDî¼òŠel£˜Xú[!ø_?¾–Ù}›ýF\~ ”Ku]²ol”ådåÔDl”0U·ÁÛéqY(Y1x%…^Ýf7å_qPӘƙÖ3ñˆ½dG†KЇ‹²Û•7îÃ\ÎuüÓF£§khrßQ$z’6`95ܺ9Áö˼pÙÕ<µZrHN ^–+ð²UQ,ýºVöl‹(xG%Ã¥º?.ÿTù§Ï(æPÐÈø±%bÙÛlo_»n —óˆ¶6IÄÂ’y¡õ-XŠ¥Ü;Þ¸ÇÙA^ßBŠñEÙ¤ ³KUr‹Û+ÌëK|µö£ì¸•t©ç²”ÞÙˆ÷hy ifÛEÎâu[–!B-4?;7)¼‹ûÌr ##P0!Lnn3‹%v‰6¡kT1K›|õ FA,+ÜW¸dX0¶ló÷'VY]Õ‚¥Ë™x¯[Àt‚KÔ.Í‹ê$)¤Ûðéº`†Ò®¢Ø©:† ÖvÝPYÂß.6x”I!Á¸I¿4/Us>=­€ra–W`­åWAÐLׂŠf7Œ0²7ÛW4Ì®= jÑÇcÁyCº˜£‡n˜Iø#róÄ)8$9ÂS5›íá«è¢.¥ APô9Q KH ·Æz+ïœ…Š¥Ùô¸’´‰X¬4&"ÜCºdŽz› ‰ElݨoGðÀ™’²·Ï+X>ŒÑ–kxV´‰3ó“Cˆ¸ôCâmnPZ µ¿aÓƒ:ÀŽɈIthh¤e^ß®úV_[ŽAï>)‚HÑû½'ì8Ó¬p1´yLÄúœ ³¢µ+ƒ5Ç )©NCYNqP¦p•¤Gâ Ë®!Åy> ‹Ìèf `vÐ õqŽo³þÑìê«°'sœp;c˜ÑWHsdˆS«³¶Qçàp7,O¾9Z©b“jp}Ô©L}ÛÖ¢EÄ,¯”P‹SÙ´ ϨLKe=ú\ ðÈÿP ¤e5<zMSBÖÒ°R/SyÖ€øÕ¨RhMÞSA¶iI7G6~EiEY)µÈxi\›IH³£H”)È-.a±áý¯¡éž˜h²cÌÓzÇÆï= éƒÐ#ÇȧôІ Õ¹o胨DÜ*êÓÚð0o¦lrqƒ²ª3R¥u8í‚eƒ«ã؆Ƀ¶wÔÓ‹‚Ý!zŒüI•‹äDyåÛÔI„L“½Ó˜Ëžgâ4V®‡utV;Ï qcÊ8£™7²÷§7¼øN„mًߨ”<£OdÙG]ù;ó÷<ê,þ6wþŸ•píûã»/h àó€ó>ùc¡ç'÷Ë_òôýüŸVð }÷þ~Ìrà ÌàÜã=Œ3ofYyRt>ÂÑCUDg)B•%¡ª»•)}Da¥L´w)ã`î¼Ýû¦"ôÉØ¼×Î&_æªF¥íÓ…ÄÕK~¼EMéÁ¦Ë‘ÀÔÝ+#Ì£òœ`üÈ xÀ%˜, |sìúØ·Z‚‚á¿_?'D¿wŒrÔƒÍ}UÍêKíÞXã´µ¤@¯i{nZfÂ@ÌwR¤Ø(ĤGîЗð‰çÎÎmûªWKýpGCq©ó·ÖµiØÉ.Šà’¯¯/Ýö¿åß}{ªz©/.TŒËl“›Ô¥pI›qKÚݹÞôdTßèxcUç©ûŽ]\J[êDh³½·É/ö%±üE»˜ Y”—S‘á7Vr˜®E7>Ö‹µèo^¡õ“gáŸØoìØ‰ã¢Ê2…”o#UÔW*˜hz‘ÜA8h+]úǼå;ÖéꊎVÑ¥k­µ®K%$Ðf.Ÿ_×úº´˜¤ˆš«kCt¹@gµhõSø--‰§FÃ%bö¹úts-] ÒlúO:1Îmøµ‚¡hKîm4Gñ@5B1î·ªmO®pAg2r‹°ÝËÎ-¢îtgÔNs[™~ ¡BÌ?¦}G¡lß±U=«£´JRkïa£G±Ý‡—-dyá›ôÚèÏCÍñ~Œ¨YÍðŠ@óyÝ.›ÛfUXvš.­H¿|„ÈÕHˆoXE½Rh›ÅçFµÈ€ Ð¥>O1šm‹*K7’Ï2vÎQ+­ªÀ^­YÅOÒöÜ1‡‘2T!4ÍgÀÑáHÿ}4jQcØ%ói~:Áu%ðT¹4£>@Ìlýuå¤)"À½Ý®ØÛa»/?A¯[•HMs¬Ž©x –-)^^éŠ6~Ž^Œ¡:ÉnK «C¶¸›ß`Ϫú^D8vçþKg«ª{Û‡ƒº ñ¸Žðf<¨¾ NÊhÕ´æ§W6Sb¯•É,žæÀÔ†Õ¾LË&ü<Z3ËKP©|h,f¾ºŽ‹YC™Z…ª½H¥ZÛ¢7GOÇO)õ˜Mó÷ÛÃ)×I9ñ¤’ŸŸò#C&LÇ¥ÿCÇä5mô•ühÞÅøv p@ÁBg+Ð,€N¹~ЪÑTÊT$û /`[$äû˜Á±TI‘jOi+/ªÃ£I”ïŠ{)‘lÄÑh~«D¸p¤Är! bÀÁw!„£È3ƒ»àúÎOÃãÑ•UEu¬n¶ÕB| ñùË­Õˬ.©®Þlz ê“등Cžê¿–kÐoÿÈÁ~{·œkó9ÁËúŸøï_"«UìŸþmw.ki!Gp5⎿o\šüŸn› ”ABb13ƒ¼ÌÆ×6»{8>ç –½Ý»ÙB<³°:j…B`{ï{¿^¯{Û‘»±×…ÉP`ç¡9/²xªjD– €h˜^êRîãB¾XŽí•8öºÍ,µÛKd„o£eÍOl ä€ç¶¼š®±à%Ra>S­(¾©2ï±¹øÀÔƒmŽÞ,£)µ~Q,w9 &?ýVðýp »F±pÜ™~ø^±=NŒúÜ Yz97ƒž¨Ðkù†j‹—'˜mÛæ) I^€ë9bp¤².Ÿ\ "Ø&‚-bk]×ZÎÕQŠímX¿iÞ•K`ØÆ×6,g9KG–ì#à\T[&cÃÏB©™¸RÛömfBÝ¡2X6U5>­ö~ɲ]¸Ýæ‰åçB£©-C´ã¶·c›áǵÜíîhçÌ]xyßÄm"´m¤,Å…ËÖË' s™ZìµTD^Ü"½àݰÿÒ ×eöŠ[hzÔ•\ ÛÜ`G3§Â—·ÝY¨|AývÛErž;coL5ʦÝ"˪ŠK`²÷6±mƒÏŠe]ˆ¨ „+ãgÙÞÒ¥_­48:RÈö´Xò"x¤Ð÷Ý€-ðÒÙEÙjN†Ñµ.%D~3zAnÏID¿zß”Àu²B9œg¶ã¾[þ`39;ºõZPḧü« àþzˆ¼< DãŽÒœá\æ=TØ(QWi¹Â ]ý䄨5ýx+^í¸!¼¯û2±ûæ6‹ IÜÜvÓ-{›ê¬¾õØ7(Ä|˜À(qa6YK¥ú`s®)¼ÜPqôm\еxðÉZ•âTÅŒÉÝÎ6˜,:ŒžQÁ×µl23»7·ßxÝêUG–$ù &›f;êQ±¾·ÒiÆ¥+>‹{cX† ¢iºöЦ%/Ô³,%Ðäœ[géãâ/ž@T4ßžÍãß8ÛæØ ,æ˜å–=·&-œog€}Óä–mÞaôßfKÖ¼¸÷Mšl!(«¤ÝöÐ;ãF˜³k©^OCšîÑáKúB™ÙÃ"ö"V¯R|«ªk¤•Ë8KQÈ‹áÃWæ´;DÄ$byÌ'>mïë!¶á’̪0ÅgɈmZÛ¼a]ÄÎhñ ãPlKòÅ5ܨWij£ˆ0ýù¤?!ó> w.6éÙ™•›;iì¥7¢Âi² £.šÂœà…<ÕáA’²"¾…Ûⱎ’-ªÀ,wKTÌ1¶ƒ¡R§é,²Ç¾ºÒ,Èrõ´„ø’Rz8a2¶Œ£rNRe-×m»ë¶øhOKó‰á‰ó ¨S$K}—nŸ¨ÞÑœ´‘¨Š )õ_†Ÿ¾R`UeŽ‘‡AÁÆM†ázÏ–.ØÙñ²œ¿«],"l+ïLNÊÖzÌ>0U¾žcÈ÷þ.Z½ÆÜ±w³ P…åŠ>¯“ÅÑvP O"ø?nû;KƒÇe*y‡XÔB²ÇèíPAŽ…5ë|J‰ãÅ—‹§‡Üá÷¾I·V<ŠA VÓ/i„ºÌhDEfˆ¼vïÇ ô眡ñ9—¾ÎÖ©Äé’Â}G°ø\’*\T±lŽ8ÚpÊ/o7¯b@8Ýà‰÷Ë)ÃÈ0–öħ™)Ïhאּó3¬Šl›78/ƒDxá¬xfO>y =Éš@ÖÔ"fL|⪌1'£¡»dÎÖÈSO:®¿ ,hvü½òþã]k-Vh5 ­›«æx»øH$ ÖþY“„>ô[+iÁy—x›Eb7ð³<o¨—ž¸-޵èÇ@z Á÷ÀgEGIyGyÐ(s£5kï5¸ÇÅÀÑé𩥿 Ñòá4¦LÚÔ£©üçÊ;ÎUæÿНÿ›ßïW?Ÿ𘟾uuL(Û_›Jüiõÿ{Çÿ_ƒðŸzS€Ìû$mÀî£^Iƒ^5rnb´ŸbL*. Xó§º.ÈzÜÆÞ;˜Be—65øÙ©{Y´%‡kÅ–ºw4©kšM äîB¥è<ü¦ÅªÇØ]àØ^¦Qbü•1UMÉ ß§1bèc?Ö£ù`–4¡áÒ®tVŠþñy}cöÿû¿¯Ì-VŒRäT °ÞáÉRå¨ÕM#¤ïuˆôºªvjºD3´ÇøN™3ÕóYŸè»'##É»*²ýd{ ‡­ @½ÂÉjF-_÷ë·×o÷¾/]Å'P¥ûBêWÕ‚0dqõE­ìÒ4ïI…L¯È±Ã¯÷4|Ùì„DÉÊÀpï ¦ë fFb™ÖÎCå¯ qðÿjÖâU›2j¤¼v‘pøÙl,ŠÏ«®1—#âTd/ïôÎJ ¯ 3\#\ð_ÙQ9îåGí—à ›è xÎ5ÒàBOÜ“fÆGÔ)óˆ#È9•Ú6¹d©ú§¥QC×uªÝ2—râ°êºÖJ/¿ì"KàP¹·ørPÌö«5ø<^åevƒ‹*4…\k½vB-¶|mê%K`Fs”ú ïüZ)쥹ülPójsN3ÑëöÂ0ËçàÉn:LM4?.OßæQv{¹«×,g1°í2®»âî¥?¼ÝvŒ­F.*¦–€[dûJ]*À¯K–ŠÑ|؉0™µœ½SV‰cƦ™½,TGW9¡Ë5­¹bêò›Y¡¸–Þf›Ñëíù³õ/ÅK°í~íûæu‰(d-bmPÜIg l—(ÇØ p\¨ÃOëR÷m]׊ ˜ÿ·…è0¯X€›÷ÒÎvA°–@ôµ}޶¿Ýæ—ÓmẊšîieêh.. ºVz6¡ áÞÛÔûb#r|‰OŒT)vÓÄ'Ž&"[xåï½)ê#2×Ä•ÔúCK½5`‰ ñêHÞ½r–RŒ?nhN4ç¶—l®<‚nã6î}óZ3åÓÍWLËEËl“Jcœ¨½™Vá,×è, òñ\¶lBñ[íÊyróeq =’^æÏQ³ÄT¹N5»#˜é·À×µôZ„ƒö×EîÎçh¶‰/ ¼6µ˜G5T#ĪôäiOÄ[7šê"L•¼Â:K²¶Vþ ¨¶äÒñö-)­Íÿ9 oûÔT o2l¢-²* nÕ¥ˆÊ‰jÚ¯-ÔõµdË-¼.¼Â#þ¼\nÊo® Såö¶ ðóâo4_p¤oÀw¢Ñ±rüNÿ?€=ùX€ļÈD×O÷!ÄL%.,ÀGZ&°è 48p_ã¨Þ&Ç´Xn"C ßῧ÷yx³íMs ÎãYZHDðœÔ£Gs¥ûwÁ’˜$ú¸ S LùÂ1*›+â¢[.챊MÒOºþmHJ£¥Õ4nŒ7OÝ2¢óG-M¥–æïÔË”eÚQÀ¶™(è¤ðcËÁqСF\piÍ>†ÕÑŽª-÷ŒU$+Â;m¶Èép%ZvTÌòÈ$oªÊÁ‹¯(¸K¶]©vhE¸ñ¹1Ó{<߈1L(ßüA7=tàœ %è+ƒÙÀœÇŒO‡ëcBQ÷ ;Ød2ñ^è~ä§d>°ü¬Ï,«ÐPÍÁiþçÁä>û+úûMÔÿG…L{1 ›8-ÍãkTÝ ß¥¾¹hãf°ó0‰1dyXÉùÖ-IÈi›ߊU0ÚoР§!kæž¡ó4V­†×Ÿ³`(˜×ëd}<»T"²”ÈÝŠÏMªÁt<¯cU™¬m  ”D4´É'gX¡ÅãlŽyä¦Ñ2‚á•(b¤ofQ^Çhò˜Ö³ a>ìƒ]—‡¹VexÏ 'á™Sâ0Às¼7Qù‹‡î] ú‘„¨Ý›aÿM¿Fô‰à¢sˆ«sÖÓ¿©}¸´'6¨Ú³ª žíýo^ÑŒ@LÎÃwÌ2âÄ; ëçÑ|>wà±åf’RèëUœK >Ùåý¾à9§–*i”Ú~G=ã9ÔHÿEñ9Á§$Ài`§ÌÜÇ·fùŸXZ‘úÿ·‡þ†¸Á“Óö»ÌŸÑ´òë?œöíÁ/xóñWßIüÝá‹ÿØlBÚÏþ¦LAA÷Híô„&Íøe~ACÌ«(,*±7ÁmBÑ£ÈN^‚ËàE×¢¢â‘‡H©ødÉlÓ¨×ÅÙˆi›1¡ÂIþh—à9Èëk©"Š êä#ž—è˦J»Ñ‘—™‰Å²lb¡ÝU“I{‰n¹“ÂKÍk™—ÀWöÊÔ㾜¦ŠæïÖ0ci@4@ïĽ³ÅªQyà·õÞ>}\{$Å£Þ%Çp²Iަ˃M©di­4&[<ú@CS…m)½JÎ~3jâ- êaª,U5‘ímÞ›ŸIαWÝ&K \ÕäKä¶öË3:œUĶݗj²é3kH‚¤´Ô'ˆ9ÓØ@ bjõˆÕ¥e¶oñ‚A¬·}zd¼jÐÊ_€| áª(FpÀ$'g-8ÑHïh.÷õ#¦ÕÙÝ›{FߣŰyÂ] 0óŒMü~|Ÿ—îí5à;|“¶°xt Ñ2Ç\>5ŠnÓ+I6 |ÁØçÕFÅ=…0NUaÞO«’Mƒ ÷(b[ÑŽ £ºÖ%#hæ=•«¬¡.Øö«‡ºÜ¢\Ê¥¸·AThÀF¾t7Uˆó§ºaVŒÅÊ8š…J@ýFÌ£Ò\­Ü1¸TY¹MÑöñÆuóï™4Œò:f?§J³¤‚â^Ÿú“ŽE‘R9Kxl³µGM<Ų›€Trº!±þU[óæà4Ú¿ÁÚÌÌãÞé½gý¾ÑÔÀ“ãßÇr“ª¼”râÊ„½çchiÞ#¥G§”U›L«Úä,M®ÈpR5ŽG¸;ùfÖ”º 5d9RWOrPå¤9>×)f58ê!O£T^ÃZ¸›²é÷¶PºQ-­ü“lÁ)¨BâúÚ[]¤³ÎÔá³JÃFÃ3žÝ•v\kÅ;¬¤ÿ¹ÚŒ/;J)dk[68‘R»ß¬ô`é×¹ß,Â?Â$¡½ôàyÕóÙŽ0êuy øØÉŒÖ³9ôÿâËCÉfDÙ̈Òó]ª³FAmãA"údø€Õ°>ÔžwÿìZ邯âp° Æc9zÑ߆%Ôߢ|#(ÿ¼!ÿ¨úÏ?iÔþE}þçì~~SpÞnXkçßòžü=o8fð€øÿá•ø®¿<Àg¿ÿ·òàÍ ¶­—Ǥ æHššƒw~–D>M"X® Îà%}¤-ëkXNò»G9M‡Ø…ñî"t'Ñt6pØ“Ll;ŸÙgmý¬Ï›Í½ùiÎI¾Œè}Ä¡ò«J’ê¿ÍZHûØ; ½~^ µL£9}±Òi;ê ý^óôKÌŸç}xyS€ŽÝ{& DtYÜqüíù/4F¿ŽÈ(LB›è#,rp´šQŸy¹Ô)„ µh U®?¶‰-z< ]“Pàx„ýÚ/³0Î3þ±?1G,È·"o¢Æ1~|Î ;Ê8»¶ŠXíמmE—6½0°ÿÊ•Ì 3Su`ÎÝóŽ÷: ší£Dˆñ r2M3-Á·Î.—r8Lö®¦Á¶PüõVÆ?æu¹‰díä æ¦o—ÆM’§áªe·•ª×äor²$& ¯kÔä}‹K‘ÖtJ涯\/" à?”La½el\Ų5?ëím•MUÛ7w6;ó–#m©ÎBF9€ûSñ_Ù¹Þ‘mÚܳºFöÌØ0Ùæ+JGóŠ´8®âWÞ˜g° Ûdï]EñMyî3>ÒUÞÕl܇–<ø˜ ¾@_Koãµô¾oŸ ™ÈΟóµT ^°øµT²÷Þ&"_ªX"Ð[dq aº¬×7Q$õÇ3¡ÿ«àRW4X»iÖd×W fB%óñÃ8ê_‚»—#Ù”KáNÿú…ê<³á&±zZµ>ä2ŠB)¯¡@’ám ´‡ÁÙ%Ò’.ÛäëÞ"Ü·m-]²Üy´µD«‹£zYz96Eä6¿´¢ÝÔw×ÛöÞÛ]=?®K±t­ذ,³B_ûtżþd‡ŠfAŠò ƒÇhHãVY›bÆ/ {ªm ·§)<Þ2º9 þUÄb~ /1 ÷m\z).Õ-Ûv€ÑÅ]ÐÛ¸fÍIÎVdt"FË‹Ý[¾"cͦÎn›ÂWùˆ1Êš' Ìc¾ªx(R\f&×ÂuéZj/3Û¿Ù¦üä6ñ~Évú¥¢//¤Œ/§C{LÌöm»&²~åmr4I+:X­KÕãTkaûó"Bf?a„}MN8¾GH$ªÍiàÝÛD &²òãç¨˱Í!R[·Šzqn’U–Ô£Ò…õ+í#<Žh¶îêÍІ‚Á–´{-`nÛŒ›¤lP•~{íYNRœA—ý²>³÷ª›TBf*¡âñFªi_5;{ö°º`íEnñ9‘XzØ Ü4¨'ÓЙ|‹Í6tTÆvÅ©A Ð QY€)6c'ÈÁ|ÌC‚ÃïÅÇz¸ºLzšïk‹ŸÏ'L(¯ÿ–²Eü×Ñ©ÓB`e¿&Š×BÎbYkëØ–Âv¡æcðcÂÖ}ˆ–¹¦Gˆ,°ÊQ¬‚¬È‰ mÕ®6õŸö£Út=-¼ þ_º/’™Ú·µ¨Q0йRäÿîiÌOc¦L,y2*åab1.¢ˆ=4䅵å•V‡m³™‰ˆi‚§'ÖïÖ¡£J"žÂGítzÚÈo–¶Y&9JÒªÊJx½ŒÊ¹Ðk²»;4”@æ^zXíÇ g(€ɵڈä¢ú,^â±ùåÉ´iáðHŽY{à3E—vç·r7¨àuC=ê×z”ÒÁøî§r¨éí “ÕmÓq<+ÉEÜç:XñBmRÔNïÿ¡á{«íü?§(„GýpËä£9 ,PNc%É„æ=CBÏÈ'üJ:͆"£B£á·Ìi=aSÝ£p¢ZjWë©ÌvW‚òÀ(•]Üe ¼&)ÂÆ‘ W‡B:ËTô£ÆôQVÂÀˆq¬üGAm,?I£Ìç熡€—+§£üá2ðèb7îùœÙJ äãGòQY#xªÊ§ú_çÜñúßufY6F`6W‚llïËWóö ë^³§ìvTlðšŽÇ,-£ˆÓÞ÷|~b̼‹ÝG0¬}±ˆNdhÐ DÞ~ ŸÿÇ¿éæûm¡ë¿ò­ÀµùE¿ÄO¿$´ÿ½C‚?â½ÿçr üó¯þ?€®ÿÖÀ¿ñá}LüεLÌËcY)/¼´i¡S*¤,w]êÛ£>•dÖ ùhT8°Õy±-ý_ç‹„>3TcS WA5[zíÎçí$ !ð9› æ]Ýü60RåÆs›ƒr¢Ýì Ù‡¯-223­ÆAþÈÒ–éÇ<é´áðÚÿ âØÎÀßîkù]ôÊ~eRÞÆù ”V“Uöm™6žõvÈ’åHvÆuÕõNó`ãzú¿N2J ]Q(•°ÚN ©špVÆ6<ÊËX³ñ;8Ô™O™±ì¼Y«d 2=¶Û5Eª¬oYzcpQ•<Cñ·IT/ߟ§™7#åy•B§Ooo<UfΠ¸›U/š~¶v›ôõ4¾¸jI'K¬6¦‘oÊ4Ñ¿æX¿{"%OúyÍ“ã¬m}`ñ % Ò±­¬ò>Žî²®æMçŠ5™®î·Ó´Ô³›œzwtÌ¢‰*èè% ¯É8{JÆ„š Ñx”]8õÎÅNÕ¦l3Ž#Y±[£<´y˹ñ®œ²£! P1>M6ß©âã8€O±5±k”‰ê©¤s’ãÃ/ä¼U½ÝçëæC †Ì6nç­ñ¨bÛ‘¼iJ|¶Ñ0Ár0«¤#(7"D¢£®O öáÅ8BÎÈêã!¿ÏúiÝÂÀ£J⤺ûa°Î§™IyÌ•G*bRØÙNAËsÀ?¤Ä1~%¼—ࣃVbÌg•¼÷óS5ÅÇÄÙÿ¢6ûÇEü¿òß…´§ È¿ú«üº:þ¹¯þï®þ7Ëãkr„Z IDAT›yÅß÷N¿%z>¿yUß+wN®ßF¸òpÈå<ÖΩZž+üiˆj  5—½Ô BhÂÞñ8¸æ—ƒ‚Õz ·¹z•cQ¯ô,ž…úË–6%ß;'ýå®%–ÔãpR*mC4|¦!†œ®@Z/­ÍÎ7üý6gŒ*úOµî«'ekŸ_ˆOɯÂ>DO®WÀѬvba†Sxd°Oä ©O¢Aä·,zˆ%H¾íMDá‘MÌ\ëvií@KL-@*P¯ãiï7OÓÌïýzZñº¯€æ¦&·{Eã(WKCs îyPÇG7\A&[¶‘KÕâÅÊ™Ëa¶: °É+.f¼o³mtí<HÝÌšÜ÷¾÷þ¡¨þ"Rö63ƒFÍ·Ñ4dV…p«ŠÈ½”kéJ”±»œ—Š™¼ü ft2–zøo33+¼;š·UõR}™mÛKñÝ"¹—ÂE? f›b²¾|8bîWñÿÆ^^2ªËT¨~·aõ³¹4gL„rw‰l9mãÐ ²Œ;'¨{i;˺='!N4¡¨®%´åB¨Š½r“íoËî¯ù¬‘˜õ„ÄìÆë;–Ú¾[˜pqmo@—,Q*ü«­l¤uÐ 7ï½jäÎ6k@¾ y97Ƙ<[|-Õ¥_˹/©nû×,Ñ€Dx§\>¢ÎNª|×>Ž1G%ÖÐ8nŠ7 o“}[žórÚãfSTlÃqdRí µ˜{²RÍO¨×]Gñ0"=lãCK" Ø~úÙžú°$§LÐ¥"áˆæ&5Lƒq¼ñ¶ÌëBƒ Rç_ñß·®Qr›Ý7¾~ðëZ×Òß7…º"÷ö^€4s8¢XªøÒµ~|-ÅE3ïÈœ ¸àH˜ÃÖÖK•öòwÖV@†ÁYð–H6¨BpôZH@Ú€+"Ä¥(ðÒeýYÛÎè ÍÜPVw¿Ù{ ^z h›ûþÍWª˜SîDTyŸë0Þ5Òå±Èn n(åÖ¨ðCEÍ}EØÀQÝͺÀÿ¸Í%èàá—µpë«*ͦíkÔ't܈>BÙ#ŽÓ40·ºV Õ÷›»êd\N˜ç#‹À¡³šF‡b*µ!ŸŸÆÀ&n•˜Ò‘’[ª –Û4¿Û¢¸€MXäæ½ð%MÐC-Æí ®:N‰-4êåwZsÙy›yy…¸÷¥t¾æ¨SçhñÅÅNɲSÆ[à:«€"Xâ ¬wXù1!¤ªãè|¯LOèùDaÃyžéEÖ K”c„±Ðpf6¨ýÒÒ£´ÑuaàÁŽîJÖDep¤#CÂ4’‰&9@$õy¥“=a(¬âÄ“ÙÜ¿Ÿw-!¡Üñ(Ô|˽[Žž„tU·&ÇäN^U„QL¡ÝÒv$’B/m&‚ÛÀQ€à`³œ¥U3íÀ—³<œž÷xï‰aµÅˆ½“¼1°%Y©…b%Î(Ï?xUâèí–÷q‚~&"ôŸiWé²aI¶ç[.›ž†Ž*!ïì)OB€)Nj7 Œß§ e2ahoWbç6Ûž"dõ'cˆ‚ÿzª p²|ZõÌçy|l°Q—É4#üèâ}0“>¨˜á€ï+/Ÿ¿I µšÁ¡Çߊ‹0=Ø ËjTU¦ýÒÀŒ˜ˆæÔ±†h1‹«‡P‹‘ã˜=:cÆXÔVv ¾¦HdxªÊì¯ ¸T‹DAí ŒP¤©¼ËòšÍ’$;“œù Œ)Ѐ±Ö NÝ|Üw]sž[€øøña$&z~U î’è„q™œ×óÀ;ù1ÎÈ1Ñ#ô“›G=aÝ’U«X ý§ÂÑ&qfŸO†À‘÷ÉOtDÄ|ÍÄ”¹cmʳ[·Ó眆ϷB>‘§ìƒ‡è6¼Z9™D“Oö Âw柴‘3âT{Ke÷x¾Ô7 â¡_Kò±DÌŸÓ/‰ol1~˜ðþšDŒ?#=?ÔÎÕýgEîÏC•?®þ?^ýŸ•]ÆO^õùßþބôâ¿s €ŸÞÚŸ3–~úëàû@ËOàlûÀèßq²±éiæÁÄÛÀB‚)oÆ£ì×¹í£óz¡¢¹W¡»öc›Oçñ¯m‹M)Ý"ì‘jPdEæÞDõ˜-¶ÇIg„9¨·:nÀİAò·S=Þ©(BàÑoެÞjf~!À§ák=“t"{âr<®øœuC?­/ìqù/Iÿ6eúvQ}6p ¶?Œ ú/ký ¦½ Á•~úŠýÙk£‘i rNpîH¢˜×,¥>ÿ •áÌ-€ª®Kg$=Öppù ¢ê.¯á3ÜÐGýâÓ–ôãYf›×Gü»Bë”xÀY†ðža»´Ff€ ptŸ_5d{ßFPF’ÑÚ35¤Uí|z}•²zå ÙJ§tUzúéÎúß>±ðF[¿l”]˜1É·F1ãj‘¬ØÆjp…Òk4ÓG™ìM3î]¯‚¼rÊ¡e•9MX˘8Ä­¦Ûöm¤Ù6Bd-¯³{o†tAH¹M¹½Š#ÏÛ9ò+ÿXX ×ÊOJdËñV+ zù…dAóÀÊ×hF§¹EfŸÞ§F‹ð¶}ï[]sÝí»­Œá¾]*êG˜ÉÞƒÕB³ˆ|-Ug|¼ymonÚ&£·zÅöo÷þÍnÃöŽ˜u<In§?ה膫?ÛÜ1ó0ÊëZ+ Ñà½ÍÉôª¢Á×i%Þ›Fªê¥È"½KÍ"æ3ÖÇÓõn¦›L*xF±*“”nÌìÑ¡…Ì~˜…ã¼r:£æLH÷²ª^K£éway ‚‡ ]ëºÖ××u]×ZÉá_VpuÜú¥>U¥¸Œû›íÛ¶íòy¼Kõ+¸ø‘eñ%!p&Š¥ëZk©BG €ÀL ŽLq¡-½ôŠY)Aªþ¸Ô‡I¾z-èµë3¨ÓÍÝ,))á¼Fî¦Q¤/Æ=#2èÇ©yî;”V³YÍ©@þÏÍ;–ðË+qé¯Ü³Y¶¹iæc$Kc¿ÏTú®Çw;‡y]8¹ÑP´1&œ(>tÄ||j12!‹¸åôÞ”.Þ8ï!h)@f±b6%£­Æm.é‹´²ƒts.Î-FYj¥Õª§XóöuW¼I™R=Ö®(Z´Ad?q—Á8o2ߦèqŽ2Ûܰ¹Ï!Í»`¾ÞÚ̦ª2¨7Ç.^JüåCV%º€–Ç~ÏX„|§v*¤\ÁÚwÖpO9æÓÀQušs@Nûgþ÷ªð­½eÆgÿš€È" Îc»J£ª5QÄYÅ/°]̘qWöý‡±tÍZÒn ÈKK—ïx?âóEÌÄsœÃ¡860ÙG+ðAq¯Þ §O^²Àv*x¬ké ~Yj¥dY}#¡uÖ€Xs¿i™:°Nñ<Š%ç\à­Vô'~&û<¥ô(»ßyu'«oÞ§A¤vBµš$ƒ ö»ãâлòÆ?8 12JÞ†­r4xäK­Õ"B†ùq¾g˜q°â1º¬Ò‰âŸ˜WgäÏ1FÊ£/£ ®þÒnˆÛxœÊ»B☤F2ñÀB‡>ÏN¼ô…ãoRÄÕÙ±RÏâ.0xjµ„õæ %v|¾´ð–ÉÇ‚/Ï}¤>/caïO1m–8zŽ3jõ{Í9!ÜÕB¡oÔ%ä;ðÔ6ÂMQ‹Tgþ´Ÿò{"éç¿ô¸±óa| AËLŠ¡±GSOBGFÒOW-oh ƈEÅš«+Žs¢õ"t®ÝVä åÄø°tIC–qe¼Ð²6*¢C°†pLk2æÑ@èQ‹TB¿k?5MÚ?=’zç›W¥8s¼¢}ÇðœÍ ‡©|o½¬—1,ä'ÍMÿèlñýŸ‹}€»ž=…Ô:@ŸÄpW̰½rù±¬ –pŽÜ-´TEd“ªØ†¡M7òÕ ÝÁ™æn— Â0žN£…>h":d\¨ªÐ4š ãoÉ‘J‹\(,þý÷6u“[­@,Bƒñ-øqŠ~ʾ"£#}¨*ê$IV,£O.Ť®š©˜s`Gì•b=[b×áQFÃ*Ø LH¢EóšS¨n)vWíÔH…e1­ŸEÚ䘯Q'á dñ²w߇)³ò›MtE”swíÛYî+bÂ{[í¿t­¡J' Ññ"0ZWÞÁè¼—‘E¢b·l3–ÌË{żØäu‹*.b‹,èK]îvö\º|à ›âŽUWç×hy„Èu-Ó_ÆK]®êµ¿<‹;Lk}ë¹YøKõ1òTWÊkÕ–¦†ö‘´¶–œƒ¶ñ;a'Ý+ùjî—]_²T~KQ»ìF¥ÆÞ~³/Õ-\ _fòzUi$)+ºåFOž $y‘Pû¢Ö9‡—™ns‰gmÝB?–Þä˶׿®«ÓXÞ„ibóº®ËÛºÏaŒD°Å0G¤j"Êm"OŒ¹BI÷_¼m{ƒàDìÄ{ }Ua1ëÒ9DÁ·:¨á ä¾_fº÷áWŒÚÁ–Û‚þÙPr/Px-]Ûb‰ ”Ävˆ¹™mÄE™¦Ê%ª +ÞysPUôº®µ¾Öú××õ_¯ß^jqToà‚®u-Á¦ŠíE¹÷/¢Ö|”’yªÐøÃ·lÞá‚rdô 亿òǹˆbÞù¯Ì"tº;"ø¢À ~¹Ó̸ýôÇí«‡º›S ›ÆNG o?Ç#z“¨«j˜ ªkR‰2’>¨ e™Ð%º|81÷“”¢²Ô+î·m3!¡_ ªøº–‡`JËXªwf}…>3è¨ÞTç>Ç£Ïý—)2‹3I\|ðuˆsvd)¿˜Ù§lyƒ[ûfu­wÇÏÇ6óoâ¾Ç·-¿odðq[TŠ:á¢ÐkUi£ÙöX t©Ð¸…ˆÙD¶›ºæ0Å“¸‹²4Fh""¶u­QEÈìkÏ|`×áC‘0xûNŸ,®cãG“å‘*Ì«q 5ê”Ø!üità Aù1jgWìÂßÊDŽŽq ðø(„•ƒáÆÒ,Ë¼Ë `GBÌ)E’¢¤¤6AŠ dí{¯cç „[Rîì\ÕÜw-d|YYY^ò’;ØPã4îÜ’UvµAE >™"Í3Ü/ZD›¥Y ºqyÎ@$WÈëü¯’U…±¡I•·ÄýèÑ>¼6ñ·Ê6„ä0[Mؤsr)nÄD¹ÅÅô±y£Ãúm}Au¾¢Ô ¿=D÷¨;'bÞÄòpúÿ¶²}l9påÈHUÀ Õ0ZÍ)3áÐ ¦Ä('½ušõëR9íbÀrâÎ “?ŠU ¼úV§;ºÚŸÿáøÏO;³&î %6^”5›®,ä}7ß ñ6[Žúí$ÃÞÑ'¶œ¿â*U8µÑOúæ–óÑ)•éýV°PêµO ‡}W×I¿Ñ±jÛH‚$ÿ ³ëw¸ Ð[ìšô–[êAŠ«â¤ÂHV7Dd²ÄˆºyLhé±(â¹?{ùÙW1a»pdëö;¥Ú@òÄCêNôV€Ã¢]…‚Ž âïh9«‚ÇÄ¿5 HÈÞš_Œn;¢ç=‚ÇUÄù2r8j³_šœâI8S£CI ,='¸X9FS?3µ×5=À0: —¥'ù†g’ÇF5BáΘc=|ÒØù°écÐH¼üOæbÌîÍÓ-C~¾šê¹Y? Hë)Yá³ìŽÁ¾æÚ¼¹”)Ëþ³{ÖÀüj+æ»a÷¯yøÿš =ˆLòà}Öú÷ ã˜-Äâ'ÿs?åÿÊ?Ÿ":†é|JÄ¿8åÂçB–÷áɄҟc„|à,uÚlœHr£¹ÎEYëègÍࢾYÐ4ßçL6Rlå—¬UÌ­éRWÔR@Õj²ÓŽSz ~žõ¬@¾e9ý3OYߪ8?À!ýW ÷·g-ÍYB‹™5ÅðÙgœJŽI Ÿõ0cù:Æ<І=â¯Pým®oýþlm][)ci÷2†æoU-q¾p ýµV•ñædE?ÄR>øEü[‡×Re£xίsï6E’¬ B©¡4€ReAcTbÇšŸü«’:?Å€<³Ye|ôJ9s±„UN\‚&Nž/5lê¢5M§þð²Ì¯"ÔhÔÈ.­”˜›8fš<¸]%‚E1}¹R;¨PoæEè@&Â-Jˆ i95ë]†ïÌâÃÓµH'›«/Vn&ŸœÛÕ&z‚£xÌ-æ¾\}]ªW 4n'û®LK佤&)#g_ÛŠšQÕMy宥k‘½÷[ëKõR]b&Ü·É¥k)TÅömôúTï6¡[pnäkẢÙ41|%ñ=–‚’n߈¨yÚÈ/Ó[ìæ¾d‰`yßfžýw_²œN]·í6~‰5š2Y’¥¼[(›·Â¶E$Eäeû ËýÅ€\ÚÁÒü»77ã;ý¸¼úVD¸Å¾DE—ó³]þ¹Ýl:ºé(r;y¨üŒbÜÄ…Ï5¶@°®%fÿõú ¯4¿ÌpοD¸—wH«Rh&wFFðØÓµWï‹Vö´ª÷^&â÷‰ š•ûш Kå–Ž}÷wûòæç—Ý´/ÍÉŸÆì¶)T£FN<ͲFñòO¹rHï ÕR˜øô4ßrqnˆî½ ”E]n÷UÅ•åüi¿áH²8Øå)BÍŒ€©ÜÛ)Ýýì‹ÁºÖZ_+³ ·îûŽ….Å©¹nmÓ¨².÷ëö:è 㔉¿8\2jrŒ`²i ²Ôó<˜:§ÄR) ùRlÁ­ÜÛ€¸êo†\¶(„¼öþñ45y ±yC¡¾6"?ݘÞt¡#âÃt$}E¨ ÍÝ)-/ÆB‡ÒÌ ÎûFÓ@4[EÀP¦ëê\ÈG·4KÅŸpAw=q<µüàÍÃPYT4Ý㑦ý1EÑÞŸEcnLÊ9.Ü¥,LÂtžØ£DÃÌ5VÿŽ*b–®XíÛL ké‚ba˸A˜ S¨ƒ(°—cŠ©;PõǬ 7 ‰}˜ãt)­íе֦mÛãéQ|=x•7rU£PEÅLU@}as‹!ª;âÃ67 jÚ¥¶Çb•S¿Psâ®"ÌMƒyÓÊã$èKð˜ Ë,DïPÿ¥šw‡™]»¼7åÛŽÓ”5T½¡­Ù„Ù²\ÚÅù뜽vø¦ò ±*Ì«”s”ËÁÐŒŠ±dë °-¶ Í’Ú€¹t?6–ÏÝvÑ*Lj¦Aã=6Cº]#t*¤¨èìmÅ)š³Tè!âC ·~–Ú«¼`÷ðÉ–i¼Ø'¯™Íg”糃%8NR ]ON°5Öüækð(ªu}ƒŠÏ‹Z– ­Ÿ[ËF`ôŸk¶B·Âóàìì ¸6 ýÅEËiƳ¶Kb¶c2Ø99§9gó_1ÛÆ»þì£}DÅÓè?ÃÂÓI;ûOëPÌÞ4I=_Ò÷q(o˜l˜î«À¯j3 ïZ&Ó6\O5s4Û¬8Æ‘9¿Q:&Y„2¶ô'ò Z¦Š?½á­Ü’ǹ^û^@GÓ¬B_±±B7 (êä‘5óRÏ’ê·±À@ù s{ «õyÃwÄ5­'~½óŽ;µØV”œ”ð«¼|¶Oü*ÛçTÿñsG,Þ~þŸÓßñ÷˜ðUÿç/»¿I¢ÆŸsüsÆÿÁB?¾OVðû$N×À÷ç¾ø¿A¸áqïÿF•1Êñƒ,Äq^Ò+²ªèƒŸJºÖù6iîLOãù#³I2K1E°4œï–qf,¡…ñ2ŒFím.´+…‚•cd¾Áw Öʳ™¨~xÃÊ >’GÓÉ_Û¾AÖûø} X—û×çøsBpì8ß#¿¾5;ø?ǹCMwãj¦¸V’¤Ó_ýØg˜Eß'FùÃDVÒ¼°ª ç ÓŠÞÑ<ï¥Ëoëp½Li¯Q !$Cwyôë. ôøÑ©a8£äi¼Û¸X ¦ –àÇvÓ÷ï}›Ó`ô"è¸ú­ñ:Avô¸G§‰`n^Sk˜‡-ÏJŒ˜½{žGfÝوƓ$ lEØF-ö³KYÐ-;±Ô1ñH‹­Ø^À¥j{Gøx’![‚ Œ(ÿ/ëm´ß€d)@Yš’)d­Es}‰»¬×ù>j¼Heɸw‘K£0Yز&zp1UÚ6ã¶MÊ‘/…^zmyÝrÛ¶Íké¥ÿÞÛÌ]Úv†‚;dãõlº#ÛŸ¶7áP íå4ÂÄ|Ñ2w&ÃäÌÒîô¶ÿVWKI0JTÖRÜI]6òv^¾ ¶u7–Jµ›R6M‘Nòeûò™‰[Ö ò¥p ›@åMK 08"yW…³É/Q ›Øv!J¶Ÿ?£¸Ñ#}?C^ÜjºV^n Y¢*«ÊÆï½ï×ö¥DÃeLˆ,¡‚® ¶Å„Ü{ÓV¯§vS–¨ˆè’ 0ÈmØFŠ\qè§oz/Çð³Œ>–+ÕnúF¡{û(Ÿ~Xòu›Ï?¶‚” }W³²FE± ö)¸óͱýÀv'¡iJ‰æÕ:å­K·qÐ¥ñȆBYã¥[ó-ûœcŽg„F"`“ ¸ ¤™ùX? oUuÉ¥Px¸ÉEáí­OÅpÁÑà¶…ËoMãmüqA¡ž“Þ÷¦ÂC ¢nšsý>ŠE@‘-\ò‹†s¯õ& 4'%KŠËYQN5læЭ…Kƒ⸢8(jØä#% þéÀ qGyóY¸Œ ráÖåf4ã3mYn2Ùî¯vÀ<Šá¾^Ÿm«HåYÔ%‘ãá4kȨÉrÑ 1YBó]º¿T,´”޹Ê kUžzk® aÙ8CR!…p×x»Ì–<ˆ\é®îVÀðîy}nd på“q“q£\k]ºL9æy¾‰]JÝçŠ65$¬õ„- šf­/’KåÞI^|îÊX> Š”w? •êxb§ÍAëçv:< ôgY¼7±0N³ºqH©í0Z€ÝgéÛÜîùsbE×[xY²:)âŸRÎ]ü¦ów Èðî|åñ+×n™ì~KdGEȯáµt÷MÖ¨‚“DÃIÝÏ•k¨ËHä¾å£Nß–‰Lvm»_;PY½:(;RNÉҚv‰Æ•–Û79ú°N…åWkê¨, ó_³ *&PIÀ'º ÙõÉØé!õ%(ï?–Zˆú=톺SJ:%'I)9vË™º` ßýÙaÚsWGt¸’ÓÅg-* Óíß)êÅ9ü3U ̶àN[1Ž~JJõ-ˆ #os!PgÀ ÏXIsVWNRØ?èÖsë5hä”õ‰´ÇÆßž§Üò+A€RL¹Ž¾=$`&BH~m ªŸvUºL Òˆ‘fS2Ð}&ìø]²5x:~âiì3sŸ9Æa—»ß ƒË¶q@HÍkܦMÛW€aù.ßNU\±'{…’ì39æA‘uykFQ “§¶òÄ€ .^æðVb›R!~¢²ÛÔJV\Ôå• )™>‡ “‘T,ÛlA“oŒ„8/ÐJ;OL|Ošï\.>X/ã <„üèk”9xyðñÓð~ª¹žþ>o˜jˆñRåªN%+»ã˜Á¼pÁsÊ<†È“w­å©üãE6“ œq”úiÆI­ð€<á=o`bЬpX"å“ûSä¨nQ¼ÝŸšFÁ7wýB‚Syå½…‡àÍ2çû;ÉCý]tËïâñkRóÏ*IøwhÖ»ýÄü÷ù‡¿À“ïìÑíŸÿ‡ÿy)€´Ÿ™ ȇ  ^~~VÇóó}nVž½I”97†¿L½Å5‘+†°Ë=Z-- æ—½Bg¯9Uƒ.ĨA ¹s]ý{)H8/WªÔg{© £~D¤ú¥Fíâ|3±Fÿ»ÅsD]È£”ƒ£kh먾LȨê’ÌóÈMøèçÆYôƒO~7Â<‚ ¿ÿy«‘úçš'ä¹ä+ДÞSz•ƒÈ?ízÏa3šÚáç¦Î.úP»ù' á–ýÈ@È#â;þ±$h«ÈMÒüçÒ*ºïï¬}0w[Þºf IDAT¢ñ+IÓDuqšÙµÖxÁu`œ& ¬übËž¡«Â,Ô”d•Zô>¦¹Á}šÙöˆCÕjh|-Z‚sË›w²Â»¹¹÷ö}t|‚f^ÈjÖˆÌÑBßm­Ó¹ãÛ†¬è¯,G«"Ð ®Ï†ÒÐ`^0°3m ×< {ØÈªkÏÈ\~mf/…ˆb1ÙDN†q5dW—Õ^{›)@1Õõÿ±÷¶K’G²vx$Šzßû¿ØcËF†Ÿñ™¨ê™&¥Ý•Ì×VÉ™žnÈôp¼¼ —®È @̼¥S<·äñï•fJƒn3»yÓt¿ò—J8ݳà„{sé–µÙ¡R8 áÐ-Ûöm÷× ÅZË/ØBO|ÃMyU!ÀµÜf”ŒD8å]!ܨ¢+îTq7½%ùÊåLÞŒ4PŸ¼$Üø6ü¬"b÷þ†”½y-Ô¢§.êŸ÷ö5äÊLš`!¡‘Êm;trMF\î3•±×âù(€ ·ì/M˜*^Pý±–¤=ÚÈ?ïûkÛÒõ—ŒV3.èrÝTåëö¾Ò^Žî1Dٴ׺D v¿¹gü>ãjàr'³£ï1ê¦MD®4ÍÍì±_aóeJã‚àéiGšùMîC§9EÆ eÞÍé€Ù¤aØ(ýÃâ]$²DTt£ÆüŸˆLØRñ{ßßþ¯¥A™qâ+o‹ÞP¶pùã—ÝŽFÞ;´T]`ªiæÂ¤SüOõ ™MÓåßõÒÅ˽æ-²›¿¬TƒíSG/ Ù-î8v7«ÈÄ*0ƒË@¶ëšÇ»Q‰¢`2"èªR¼øŠ“nCœâg½yK(FšÝš)Áá/yÒ·Í,©Œ)]Ö„¢fí ö{H†¬Ê)³qEÕ¯éª Æ—I/bìÚk7‚’ânÓ–ðölÛÁTê̆ü[8ÕÔgk|PL†_ú•]Štt蔇!õÍÀF»wÕÀÊÄN~ ‘ø:~p½X-KCÎÆáùœ^MNvjݬl¨ˆRpszbǼ²~ÃéQ¿Yv|Ç(i~ ŸÒQí|š7ö¦Ep4¬£oŠ3L”5¤}F+ã×`Éwý¸}xTáb¬LUM+0µÐqÛG•tÓöåê`E7É%¯"óF9zÍ 2+‘O­½i2= m'Šf/vžë÷Ò‡sžïÂ?èx„*y0b½1áî£52â·y×Õ×™…éÿ’öMSFwÕlÙxTK£ªÇ‘ªã-’ê,+ádéÙ¶Ð2“ uVþµ2ûªåYCžñ™—Kýúp˜Uì5såÔJ—g8sÒ[âS“Ã<”qQqªZ¼·Ö¢ß$b6Z(«Œ2Ëâ…òi01§6¤Bq îðh³á[ºæ V}ÌAš=ŸB`¤ffºãÓó\Œ À‰C†Fˆ®“BMEžëʹߎOú“í6ÈÙT1BTaª¸WÉR8Û0ÏgPsý‰ž°CØïOn&ÁÈþ/±fšó]cú{ºçP¤zÊc&ÇEû_ €ðïeT—~Pø_›JðŸùÙþ5WèGnùoãÿÇÿÍ_o<ž¢ŸŒWð,k¨måy‡%ã¾fæšËBÛ¦\ïòé<Y ©ŒŠFªBWÍ ·ÈÕh! #¤åÀí1R/f¤ˆ@Wg ÛÅOq,qØ<ý»Qç{dVrά ŽiRF[Õ´õà”é%Â×5ãocE½igÒb$›¥œMã#ŠÀq 1ÂhÍ+{6àÓAþÜìYÿyÌ8H¹R[ ›^õÎJÓúQ÷›sÙþpw†ª®IìLµ.¬‘΅ϯ0Í|üÕû¾ ]•‘²KO¸¦R+q'7¢¾sÑÝçó“²ÓØK4rÙÜ{ÄÜÊFY‡¸|u¯Ôüw]>­0T:ÑÍWmáÙ¢Ñ0;°µ»ªýSw†5Û싈ÛIÂpŠi¸ó« ,þTœ“žrU5æ4ËZæ‚6øG+”7¹e”ÙYY_P'á)r 1Ãl¾mäˆ1«±ÕlûäA©¡f‹ôÙê! ƒà¦,]ð9Š}B˱íŽn˜q»UUó(¢Ð¤á·qè$‘ý]æ0{]+!1q°I hm·eo“åJæÚ}o¡ÝÛî¯ ÕëEQ“ Yêžô=’³ÍÞ!Ê¥ ¤ïM•Y…r‹-Áû’—¼£I²7|”¬Tï…`áöŽåt@ú.îvÑ͸7ù‡¸Þõ¿{Anz;®ßw¬ˆJrßûˆ,é@³ÙÖÂŽAQmøoŠl»(_÷ÖâEµ?)DÌî/û¯¯¯{Ëkq-¼4vïî¹à—˼×8—¸í‹ …à¢(—Ê.Sç¶ÔpÄcl ÂÛúé KT&Ÿ<ÙÕA›íïtÄ–8®ôX¿u¨œÉ‘'ásl ÜT‘%"À¢7DÕ+ŠGëø)­]Òâ§BnúM$JMÁ¶nº.Ò%ªx-`;ùLUÙª‚·ŠØ¶?)kù½RÝq&]º°¢}Vì“÷Œš—7×az÷c+ ú½Á ’¦’Ó‡æCs2ÑåénórU€J£ºŽšJŒué•Õëæiÿ~¤J‚£`ûðn¾Ë„_[moÛû6ÊÞXŠmVJÔ#ÝUïú+Ò[! ¦’ïß }E̳=ø"VáWE“K›ŸL yâ‰Ø2·ø3+Pü±TžöÐUæ6Ñ…®/ ` >sò?>æùŽ´NºP ÓWÙwÇH¢“®º „V³û¬ªàÞ6ÞÔÞµK 0×¥½¥ “^B¦k oĢݰT¡pX•f¦+„àäÉä¬Zv™†{·“$¢ß©[¸¢:ËïQ`‰yÇ ¨ñmšå¶Í¯Õ‹BÛ®ûIqí#‹¢Ë§ý1Ê*4æé5O7)b!º›4 ƒÕ{Lô• :Gò9çX³`›ÍhÇDL§ €Tè0Iˆ’5‰[ö«Ë©g0n>éŽßð9Ûð#@£Ÿþ¤ðh±³†v”?´%ü?Õ‘ì¸`'Š­¬Õ20XqYKmŽÉ"KiÅÙ‹æï×;Fi’ñ²¶n~Ê 8êb,l`fŒ³Œ3I"xèDã Âv—΃œŸëÜ=HÉóõ÷ÊhñFÍ|Ð5,‡†W¢{ *Ú´;\éÇG[(˜°Çáó#c¡9,eâš=0“6Iù¬KΙ#9Zf{ÞœÞ$-­~Ö\Šãµ‡g9=x,óC©æ¡”[ìNYVŸ†{ÍR¶Gf§¤ûš~`™Ï÷ÉøVfAâ~í`|“)JѬ<ïÈMžòqÂ}šç>Øô”£c”gñcĺøäac2^Ò-áœÖÐ41šoÔ ™ÉãOÝ,øOê߈=c]mN6apîfMußÏ0ÒãfdªÉzêI@Ϫ{LÚL5jÄÓê-PI"Ôˆ¥¤k¼›n)§Ë1‰mk4qÌ5†«\f ç9׫ý‘w)º U|[Cvëòi)ùÉ?£÷÷£ô¾wæê˜`@²1skšSvÒs>ædüÎë;nÈq$z+ ù³”fRnE ßí;â‡ínÛùÆ‹b(>.2¿òû·ÆöK o•ÿq¡ý Õù'DsþnŠòÏËØþó¯²üç`ÿù»ÿý‰òÿ „Wíðó›ëý.Ñ!ýX榤ÄãD¬A ‚+Vüv×!d¯Ü(¨EÕÇš~!4,ùÑ<Æ›º2تý ÔèÛPs«ë’_ÿ4o1påâ%oÒuAþö3díÒÀLšyúÁqϵ(+UÛ82×ÃQù¼ô•d­¿‹â|Œ•à]ý—ê`*õi,Æ»1¿þ4gO?Z´ O9»~Ê 9ô¾-ãün[UÍH¥ª¿ª½µÈ5½ëºo@.3 •Cv¾É£ÿÐŒ’ý¨IÔ +ü€eb0?²§D!Ø6÷”ŽñYUIÑ–ø¦Z÷¦AÑ€z+³JÓnF3פ4k4Ò6G]Kna«ú90Qÿ€„ë:oAÇ%/ãÝ–¶ÞðY4-L.à DW"¼Ã_Å^~1•¥ûñ„ynãmÌô~0ý÷ˆ ª1øØ›ðbÈ¥ƒOM1u»¸GÛqÈÔÅ4Ž®kéµtçMÉMQ·ðJyIcH£ð‹VÆU3séõ…µmß›$o³œ=Ÿè/¯Koî-´½e«³Ü(ä {…ÆgÙ•mõÝ!ä!ï}MVÃM¡ð6àµÒB·e)eï/©šqs)rκ4|¾T‘íu«)çœ `nŠÜÆùN!«S¢nro󿽃 {ÛE1Õ³òNVގͦe‰ì<'íð_býƒü"…ü“üsï}ÓîPÝÏ’/'÷¶3 /"r›ß°pô¥z ÿ|("!”Uu4IPòårÍ´÷œTøGIzÊã'€^ ¨\©þoƒÂéAVv·)²cv‹¨à=³Än°5ˆ|I„)ʳéÿþ„¨8†i€ÎjÌbv«sehÊißÕŠëÇ[ÛÿÕ63GSS—ÚmÜäåÁ몊 Ù_¦ä®àVÀQ¢Yºï ˆ^0Ãq6C÷7 ŠUÕTÝê¼"Y¬ Û¼®hìÜ>¼]¢Á LrÆ!œÄ=ì Žœ'ÌvÂ^ͱfšË9˜6ÍÚ¸ÙöÞ÷¤ØÉQzï—uå7¾T¶E: I»Žy‡7ÉÛKFšGJšÑKÔ ðflu|Vðfò¥’Ê'm˼F +S´R7ÜÞ'âUíC`BÅ?¢ÇÆk p?–BˆÛ?7ŠVÔ¨«¤>ù“Òzë-i±m>‚5߉VÊÅMVÐ v¨ÜÒP‚`+™Ô„dÓÊÚ¡ª…„ó)R|¶™4?º°ÛÓ(K)÷y'¦K!k­K¡NŒéTˆŸ< •ÀJ‡ d²ƒ¾!"àJ‡8i¾Šè­Ðü>Š¥O¯MÔ'i҉ƒ·g¿|oHJV&8~Vɲ$X& D ëÓ¡×Ôú`½)ë÷€šúÍN¥Åê*÷’ÆTõ†MöîÄ?ÂMY9‹Pø†ÒeP™è˜kt“$ßE ´+4öh6¨ò2ÍÖ´@2IF ßlcðN“XÄ$úeȵL6Yé²*b9¶‘=ÞyÚ— ·s„ie9¦ËvÁ‡?œsÞCñó¥™Ó};eûLL*Ú·ß¶î3Âi‘ïNÛaÔg'O¦‹ª,L1«+ÅÕÐ Åßåµ}L‰ãÔ¸åxÄš'Ì*£G¸}dsÄ5¶AgÁoÆ4º‡´@)mèNȧnÇèqLñaYúœ£ùNhÂ1IèÙÅñSöF+I½5½õoùn ˆ‘4»¨\40²Þµ‘iG]ºâ9ruh RœtÜy4k”SŸ4‹zuxHù‡bUG•´¬É°-Ãñè†=6&Áoϧ_÷5¶këxìf‚Žéô÷/emÑÙy×®5C`ò6àavÔ?Õ žŒ„¤¸¢yÔåe³Q7[.È ÓEš8õ{ ¢ñaqœj2új%^@¾‘¨ÈÙ_]9œ; <ìÚDÃ Åæb*s¡âC[áЕzÝ… #GÀ.p;€˜ eë)MÉóá÷ª!'ïç [1H=/%PáÖã2$ðÌDñÇ&¾ÿUã§æí»É¿ŠTÿ#uo&å¿-Óã¿Ëÿï+¸ó?h€OCŸoâ:ò¾9J’~¦ÿ¾Ï!x H\vKl›Pä@ùû‘ÏO[º˜–ˆ´ÿÉ @–¦lߣF¾~pÍHhg‚õÑòœá€Á”0º¯Sæ¼Ù_¦*_Ÿ)æYz—_òÅHéfP`î¾f?ÖsŒœª =ô;O«R§5¤¿ð¤\ÂAþÁÏn09p›£?8l…ŽCrLa+Ê_T{ë|,‡ç¤6»Ç°¤j¨\¨uÙÑ_ßWbè¿[Qš ïÒºÞn¸ŽÁ|iúßÚ&a¾ùKãÈœtEAÄ/7”+ÛXó\9Ï€"â`_ ï éRÏ×S¤>FGýŒr1t)%Ž$Dù—ÀYuܰúÐ`÷¶ú¥O´æ ÜòOa“J5±ðý…ËëȈt!d§.ÆeÐè CqwÕ®hŦ5a1®nœ¿Ì¨Ò*Н'$(¶i0UcEüׇóUõZ#ä€bPTLD©9uMC=·–Dh©F3ûCUk­R™„Í$w{¶ÎõzyÉ@¬7÷¶ êÚɂݛ¼ïíˆõ}›³ž\¦Ù½¹þ¡*Âm7~ÃIU¡Zî®Û ¡#«xÓp¡4Õ3P••é©è¤u ÜCÛAjŽa‘”8§,ï"uqf¦ælÚ¦W±0%uzG›ÈI,0ñà.\1nÈRÜÛ™T6åºÅä¶K/ykCÇ*1Vv]ñ2‘{Ë*'œ‰¨àº^{ÿ¹÷ýµoÛÖ]Ðj8\P€vïì¥â6yÓ—Á8d. .•…ÍèŒe“—"&CáèwA#±<àCš‹ŽÐ]¢_i‘ JÚ—0 q 6i›7ôZÊM{A;‘ÙøpEu]ªºÄvÌÍýÚ’Ó ÛAàwÁH+è¥cº·¼ý¼º4b1š]5дctTE HÊý®—bCfl…÷ìX~,‚Bªf×r° ¼[Õ Ò]A¿zJbûa ¼THoðÉd¾½ó$ì%ð¾–"è]>vÂiTO=¤"&›{o ¬\Á©pôõº6wo\áÞ›‹¸dE¦ÀMbôïÙÔ‚e]±„*"ðÐôâ”hÓ|S}‘"…IХ̌†™#y ÌÓ“B‚k ÅŒû¾e9­k]ŽØ2³{o‚–ólg­ÅÂÄ>mjýÈû¥ Ù@ŸUÙ–K88¿h'Ýv’‰xG¢ëáä¦Öˆ§ë¬{Xî$È<ã-u°#(9mc¦G,ª’Öò?-¯•ZÙâ|,)ƒ!¥ ²ÉeÅaNi¶ nOÞòl^-É™³LÄaCQßá{‘÷8èÈD¸r¼ÔÃ]á™þn¶u=nj þUΤŽÜi†i£™gMìM ‹A9É{h^¥[¥‰¢¬[9K­c›,Çú¹ñl@ðf?ÊÓgúîsj §| a2 -¨—ªT!É<õ²¦y¹&ç¤ÅÚ(ìî@Ã_évpkÈꇃ–§3¬ª¢y˜d‡õd)Ï…«TÒ$ç–ÛêÒâÔ¼EÆÛá“Aó[ˆ7¦æzœ‘úú³›”ãkÛQVŒaž–º¼h¨ãÙçÞyø*ú~T;Ýýr·¾«ä|ÚÿÇP*þA¶ìHíæRˆÏû  ÂñmÂò>ù ‚s2–5~ùé Y“éUTî—5©ÉúÕVÈVWÿev?Ï„@{¯0hò½j9ˆŒIÅcdõðd8ŸŒqº¹"WöWišM¦(g˪ß7ÚKÖ£F5*}¦ØÑ 9Ö9xS‡õa‰g?Æ%'ëAÕÄù7Þ*ÜÞ ìáÀ{ (‰â`<õ¢7Ê‹cÓ–¬çÙ3Ú•ûlò¨À®€³:Gùæ9H>/m¼"q™r)½å1ƒ> o‚í(à•†!ñ\"ÿædÿÕù˜Æp”|ûïþžë¯ýØLŽïlÍÍÕüæ7ðÓÿø±øÎÇÿ˺ޯÑw3œï…}ùŸÅÀ¢ù§þzü'ÿÅßE,~tÁãŠãgúÿ9 :xrÂ&qÀ¹rç5¶ÇÓŒÜÑŸÄŠZ#YcþÇ¢<0ƒv=*ÕÝàÑ(kF ncÒ¬••9œ..G^B›õFÊvNˆÐBÅuncTŠnåmèßÒdaOʉFýØ|G•±ÅºûéWO~2¨ÄÇz—]µjl3w Ÿ”ÿÙz<¾öOâÉ|cjXÙ|N?>;ê÷w]ÂÀ¡8,ÃQ¾*Â(ã ?˜–ü£TT¤+`³¯ÐÝ~T—‰±„ˆfFr­åâlCyŒµM¥«0ªðÃûJ©YJÀê7L_Ëi/È #”C3Û™w¹&A?¤VN•ÑጠubŒÖÜÝìÈ=ê™|ƒNsóYŽ}†5ÊႬ261«Ã]ÈM"yõª!äó|Zö6#ÛòŠ;]]ü!©ê›ˆ~º¿[0ùàR°XaG++Κ‰ÞØÞ{תû2Í‚kÁ–ÑI¹ÍTå’åÆÕM¡ÉólцŠÙÌì&® *òEÂÌâ8ƒÛ즽ÌȽ)þy«ïå."¨BL”ÞzŸùí‘Ùýà·*TÄ(·qìêÌL¸¹saã½) —ˆ¾º.¢_jÈL»3 }R•èè¼e­ L$Z$JÙ®×ca¸¤J¢)rÛv縺qÕƒ!»ý;qºÐ›íM”­Úÿ˜-{“ÞÆ×KðºëZªŽ$‰ ëa÷½@÷×8Ñ9œüÊÑàÎdÒÎ3Ž.Á—ä[w¤\(#øŸee@ uyÁü« ]J“—xà­=7fíȶ5ÿjÉØ*â‚þk-÷°;L&ô¥hÞmjû`c-Qám(osoM‡8ágDxÇ¢:Bd»äiýÖ[€Ó‰6eS_¸Uø•Ø|™ Gºß"º¼ÎC—úV joÃl\¸~ ®Ôí–^rqmn™ŠÜB,õ'ë°Ü!F“ow®q8·ˆ·øòŽŽr÷{ëyñ+VHYÉi5ÕEå$doÙ„.yéZ™1ª‰ìÒ`/bÅo¸7A.QS¯03¹À5ÛçKÌ f s¤ŒìZ"L¸,«ÇfÇO»¦Ž˜Ê׫ûë…ðǵ òe?ôØiK#W†(%¹<Éu €æëVI…n‹Æˆi‚:V‚­øþÙ­y-Àâa&€™<Ö¶)^¨ã‰¡Ü»ld‡-mo¯™Ñx/ø×¶?F,¡™Ò)Ü¢*k©ç ½2}v_MÉ+±Î"‰Cˆ‰©.šV3Û¶UÕÍ7Y„Y–A–{SrÖXz"‘çÃ3 ­Ë<©7•¡PV˜‰Š¢OŒÖÃÔ¢ón®’ÄA¹ öDýs­×½•¯C«ÿ÷‰* 1Qò¦Ð磸†Æ&ÇpÒKì°5ûÇ .i@övŠ%á“ÝN©•\ãH\ÊœÙdÚ@ÓEŸ ¾¹éaµfÚéõU"Mš›J|ánÀòë»Ú„ï¤ÚBKìÇ!¶¢ßJ1ªk—Ƽ(4OìñÛëÄ.v“1 Êå-˜ôM2ä×<¤Í~ˆöï£[°†lëä-­‚ödÑMê8Ω¡Jvë.Å£@Œ}’cg†¶È"ühx ËÍi¼k7í©þCFʇ ªæ ÐsN§nžvõÑæñü ÓŽ«ÝùÞrŽ/Î_Ùf1Ú&pÑûS[㸀=dèWŸûý˜Ì–òúµ¾•µðy&BÆZGKßU¤°1ÜÊåÉÉJ¦[ÚÇ|[”VäÁAϤèúã&Öi?v>£aøTmN1 +9pdtxÞro“d™E¸£ôx—pqÔZ×Í Ÿ5äæYG–¼=ìäyX³³¿åØ¡àÌy˜ˆRÑñ¡¦· Xñ•þÊì ´#î0 cÎ<ÈØD)‘ç…¾«3Ý0™1$¬YºôXJæèáñB‡%ŽÇç£eò\\Žoc¬2z„æã†Gœà7Ä @Oñ{õ·Þ/2ø¬|ÿ5ý¶áOh >Æ„øk_ÿÛ¿ÿëaʔܿòåø‹Ÿß<âsâðƒ òÿþz^éýÿýo¿à[ÿ‡ûéÎf1=:b1Ìùdk°ΆÓP¦´¾8j€‘|ª¨q£‰Fs‡  €µ”Âå‹ÖJYËK¸%Å®#–kÞWÛ¢i¶½pD[ NÔ~4Í$Ê IY*B7 x…üŠæánÚÛ¶ÙÍ{Éó.ô¾ÁTàöÎ…µ‚ÜÌLùuˆA/33§Œ:y~šYc!åk›Uás37Ì:£âpïe‹,1»-Ïí¼ÎNÙ¤8yÜBeŽí¯¥-\$á6)ýåJ²;Ófþýlå›Ï/deV® ú ÂÂØ®i^rÎjuŠ››v-¼®?Üi¼Wto@u™m¡d[iÞ'GqÊ\ÇÚKöGò¦ýõ$ŠÅТ%§ô´†—{‘è~VYäÆ6Êâx—¦d·€¯mªÆÄC3·ñµ Є‘ÄãöR@U ×Þº¹Ñz!²EÜ&ܪºV8tÝb)ËTuw¾Q—ˆ—€ÃjËrÜϤ`zÑK“qx ¼hWä6Óû6³{{:A(ô2l@UUäŽÆvñÕJæs½}ðBcãVúÌlÓÂ^)Àœ³K6‘§õ0êjå‘%•mª~SÙ^Š¡dC·RgyîÀaEú(ªLvîŠÕÅpAÓ¿$ºìPÝvœósÇK¬Œ%2dCRv!¨d_Š›Ø÷ÎÑ&ü±zÉ/lɲ®‘ ˜äZ Ù· ?|˜ÐD×2ì"3år£PMrV4÷[¦Û¤DD¸|#¸,ï­ÖìW¸®¥Ð¯ûš¶#ƲqX\‰;ð—ê\´B ÑÞ¾:ìO]n†R¶ß7ô_‡]%çÆ ÚQEí–‘³jŒgo å–¥þ`@Vžµ¡Tª˜gˆJ§ÏÑlpÁ|¶´÷}w™A–¤§ßwõ¾îìiH`-­å¾!Hõ6¼Î[d¥À¹DïFö'QÀŠ&(± ~`ëé­ÕÞR4zZxH~eŽ-‰MÅ,:OJæa•‹ôå1#V äNòðð·°Ç&„ ÂU8çωü}J{%(—huJŒ '¤Ó"á#8ã¨ék̪‚l@©ÿm¹Á}WiÈîòriÙ<µL賜ýnùÐZ-LUÜYSôóãDñœ'H‰¥ˆræÓãîd*œ©ÞCîÈ02‹`ž÷O×PD SçVÕ—¢¨Ì&'½¬ÞµÝˆcWnÀkß 9ðVí±è%m1¾ož-²£ÿûüš¥CNqs$ðŒ¸@gçHí¡'¯÷3¼ Aó#%þå“_ð.˜×Ÿ@|£òðTõŸÿ#“ o¢å4 7˜Þ?ÓâÊDy×Ì;B”1¢‡êà»·ð ÷ÎÄì~e÷¼tl ~é§æLL¡#¬^`,8c€,Ò¬´CKèruÔ äÁ˜ÒÕçr²„1 ¾íKȲ‹©)t‚űpxó'(‰Gþ#TyÈ×ùƒê¹,t¡Ô åKöÀߕɿ ¬àá'lƒ ¡9!Å2ìâ0Û,ÈO;ÊñѨˆË¤xÍñßxPSOÊÑÈó¡ýÞnÎêi¿–tÄѽB˜'¨òÔkÐ#«V%Roy+zÓ…Ž—ãc!>Ö!üJ~“Ù†ï4nÊhW"NÕზ ¾1Ž~è²þÔ4ð.’ÿsr5ßô·ŸKÁòãÑÿÊÏÏ}w¿»þšýÿÿýu^'~ó‘< @o“€£Õ⇗ýùäå*Ù ÃÄþßj•O »¬•1MÑßËJ rù€þžÍ¢û}DçŠQ 4 [·¨˜É*£Cš b-Ga­„zÿpB\«¶^sCÙvâtEÄ3¦vìyÕQÍoÍý½O2Åêa:,ÿâFm Ëo¤:œ8 8èÿéT|?°Ãwfÿ{õÜf¨¡sƒ;Ëf0©«2Sù‘ùaüïž/¦ƒM1Cúó·ü¼SÞ¥¬ñTm18$g‰{  ×%ûv$Qßò]J\ 6\¡ËJ2?«ªªì½ƒ ’˜@ÿ·è׊™5ÚTaQ‡|ô;]‚¸…Ô µúä@K ŽÎéYÍÛ½îåÙRÁkEŸ­ÔèAûsÿ¡êôÊM‚¶Y"Û;j²Ã\ØÂµ³¾›«S2‰fö ¸»A,\¢UœTeP(½÷ösÎÞÎ\â6K¨×¥‚-^ÎéßyÀCŠH–Îõ¸‰óõ_œƒ33O\8#(ÑσÞÊÛÍL¨‹Ñ$8#¼t ° ÅZØ›÷íu%Õ'N{“­[²´ÏD¶Ù¢,Ŧù”ÔôÙÖ#­[D7aR¥%±À"‡‹ßoç\ŠÜÆ¥…Ø–Ë[”…BEnÒît6úœ¦ìîŠÜ›¯ë(Нeá6ûãz‰m[×fZ,‰`>0s”‚äj^Wé„ ]^ˆ#^_Ð^öü"KqAÿ¸®ÿÿ+Ê "T{º`+¾ååêÚŠW€gœSt°½}᥽Ùê)ѺF?x½ÆsLômê_j€¨eÉá>Ü8ŠœƒAT¢à>koƒß¡šÝ˜Z¾n-ð†eß„ZÌÇ3æÞÆ­ò‡ˆ\z{›y#µÊ-¼®/³×âÞþ,ˆKbÏòˆ¨¼·t kµ»mu9>ïq7¼°"#”¡…p‰0\)Ùo£ÿÜ[(r©Ö|€râàöÞ{o mçØÝgÑè鶪Üt+9Lá­Õîè<n$.ÏÕz]¤È—Üe‰4±Ìx·§l!ûÉã¾^QQ5Ñ0áZ± É‚b·ÁûÒ¡ 4±—wÆh†µ í€ó¶*öʇ&ºjßÞÅxw}1=¤ž½%@ƒÕ5ö.ê{o/k¸³&§z¯eÃMpJª®Ê<7Ù…Ú¬ŠQ¹MèUÆ1ÿ^¢ùæá…Xt´m31æ\*6KÆÛèmSÛ,fQc»…5˜gFï«ê ¼…ühËK ºìaúO‹±$a]ºg&A‘ÆÏµ|p%BÛܶ»–ÈLÕM.Aj76öížì°bf󒿣“3e£ñû)˜ÎÚØÂ—£ÛXÀ(H.„aÊ~žþ62qyË2Ê !ÅçÖ'ç.mûµN–Žöt™ Õª!q ‡¡Ó³›m$…Û‘ê´?w+Cíkg%ÚàW‚¡XiXnªÎ`tªalµBq•@Ÿê”7ì´ñšIó¨s§Ð S ð© òÄ4ÝðMËi°F56»:†9ˆo§›;ÂtÏA¥œÕ•¹íOx— f£-¦2“{ÑeQ´—ÍˈÅznÂw2ßåV%ÎSÊ&xº@ÍdhÎŒÔôšQ—\²`†\~àÙ%ÇÙZüQh‰N$4¤„ÑpOô¡™òŒL¸ F-‡E©”ÙFù¦= s…3zt¶”¦©U²=ÚfʼElv‡hIµÈXRLæ¦-zXÎ5 A eC{æÈrä½YÓ~²jr;ˆp þWq=|»¹?& þµ2ïÏTvüèÒþÀßø~ùK¡úo_„²×àÿÃï§oÿ–®ÿ9Õ}cÞá?ïË- þüæ?:Zp ‰Ÿì°ÃXtê·ECå©jÇ ©hù>ž‚Õœ'£]2‰‰Å‹itÉ.?‹Ær¶âòbÎŒ¢&4…²DFÙ"2Ò+¬à}ìéÕ†ûíêŠË=ÏI惂„ìE“sŒûÐñYosÜvÌ÷̳]þ{”¿û’ ?˜+âóš6d|ó»/ =ˆmFG¶¤Î’šo¡ÿ™¤µ÷×6AÅAU»eV4ÝüfFáN£ƒV:K³^´pÑÜHšUË¢4V,5àu×e‘Ù?Km³å„*Úy%þ—zFÈmÏ<>çLËõ•¸Ð½Wf¤ÄM朶NœI‚Üw Šcñã=Ç\‡ß¤q mÏÒl“¶·ˆÜ÷}]î'¢»bùHÂqÐ. FÜÙ…Ĉíò$zø†(ÑáaxÎ¥iH5º QÕ±Ôj™ž…!?EÏQˆªµ4Ë$¤ o¯<&hfáÕÜ–§Éöíç!ïø’¹ø¤7fvS°”ä6ÒÙ/['i¦Î%wò%¥1‡i˜öu]áçYªFá½w’¬Td öEÃGÖÛþ@¬TìvÇ×_’¾L[P/‚4Rù",Mªþ¬ôÖÒÉ‚[*$…ÛDà¨pçR¶‰7ÿf«…÷©ðÓ&óJ€ˆÜ•Cß ¸í/'È+.¨ŸFEZàPH` ¢eÁlamÙÐçû©1A8‰M² ÚDDÖÒÿï/x1®@Ý=Û bŠ Ì ªª›‚m"úR=ù5·/ƒiî-¢’ä¶íÁ娩R<§Âʪ¥8t¥ÏPÕ`ƒF;Ü8R°p劢ù–¾I?%Âû>¡W.•›ôµÖ}ß$Mã°¸B¹JÚ®òvº 3X •Wžr…s¨ ~ó ¾`¶Ýr¨^äÞ37¸EÎD¸¢*[$ UdÅè „\¨‘\…Ì üóËî}C(|%yšUÜ>C©gž›oùûxS \ h÷òØŠ'îÛvbú}'¡†6ÿ?±ØØä3ÃJødžK48L~kryyНñˆx‡d„Þ_¶HÛ«[ 1\ÞµÁ@áhc1Š,¾ƒÇ^ ÀZJ[÷2†fkÌ¢®å!$=¡1ÔRB)¦+ 1á´îÍÅ}{Äj†´ˆåô!LráÕQzmo#èRŸ*·×ܶ]}]ËòúšLÓcVL„JõèNÝ¢8=º„×E¯²ŠÁëËÿ=¶]k8ÄÐ ¾x€@Ì•Hóa1ÕÇÀ>h''6›&\Qââ­X¢1Õñ ̨˜Êhg‘@ˆ.Ó#˜g#80¦/ žapš˜Æj’© bØ“Ý0½sagíhý8m,§¿SÉžÛ€í¹ü_<äpïc°n|žà¯–Cì`¬YFü!Æ ;u'4-€©÷Ò :š‘J#T…ëA>„<¬ØÁ~—^“\ŧ™Ý¦9ÀJQy4¯û… è9Q+b¸BKV̪šŒ=ÊÑCˈö4x²¥@¿UhbqÕXŽ|¶[•æÊÑ›€îjÈÏçèÇ̱IU&”+]JËAæÉƬ:zºÕXµ „Õ|m º×œ/„N^Ò¿”w ÁÏ:E(°»ñʘ‹SLË~ëCPä˜A}<›1´V};­•‹ò -êaà˜%Ñ£y@¸F -±_ÂPû[ ÀÑÑ,•gÛõÛIöîÑ1G|¸]GÏ9N‰¿p'|üÌ ~Ï¡#¤ c0ëÆŸ¶IãÔö(伪PæcÀ2ÊÏz©”ÆÀ‰Å~¨i‰™[à@ÊðˆÔA‰8ruÔ˜EйIË;w¦#B•»‘Ñ?-Û?®{ö€izìàEU•ú‹<7äRPgf‡Ü|áà1$,–øÔ<[mÑéàøØp†iðF»™§i}²†Jâ[žßí|ø«³ø‰’çcÅö_  •ñýFcæ%ð>sn÷­¯ÿÇ.ûÿ ×ÿoSÿÄŸü¿ìý/´ø÷’þùåßÔP|7ˆ¡¼Ñcð»„ß ¿oŽð8ÞŒe)I˜ŒŸ"ük6—xEŸ$ª± Z…„ah¬?Q³Deåž½ÚX²­Ž"Â-Xžp²öÙ]“,º™[…6îeL Êì óW= c€qö¼Bcµä4ùv® •6˜ÿbøklm¾A8=V"|dúã“Ýâ3óg &Æ”çLHñ`Çæ¼ïWó*¹ãŒ_?n£Zöù–´c+ܽÏ_„‘í$ôÞ½½Ç$äÃØ*çÆüs³`ÎeŽT”ÙEr½‚íñúd^ß—™…PÄáàGè | >I‡ÎaÓ!Ém¶€â>—|Çe¿Âr*n™?uH´ŒIR!w׊ ªªJº“¶‚ 'Ò¥ Ìv¼wáU²Ü¶»Šø|]g˜–3&J‹6žG¤ª8½‘UM, IÎí‡:<Äül®P¨`¹|k•ëѸ wÞ_›KC¸u.ÑEÿ2£jÜ£njÜ·Ùâ3»}à0"È%X€1„ èÙ¦üswñ޶%`S”T]ÜŸÇ2åêtð‹k3UYÅ·¼3ÖUÄÒ.d©ê~1ÄaceÿÇ>_;~m°ÖX]Ò¶½·ˆ(þÐ@bsÛCåW‰¯ ª€b)̆Reæ± ßµÝÂqÛí¾éjA»Ò$[‰•cõ÷öîJ\Š `/‘Û…:ó,—™Ç0Öº$¼È¼‰%äu¹“;C_Þñ8ÙeT]¯ë'ŽüòCb<+§Ê–uáÎ&üÓÌ`UÇ1ß]ŽÙPï?И.]I½¦™ì¾U§V!n‹¶çK'ˆ"ÿuoÙ¸ç{ׂBon3 +rE[¨æ]âÆXsVy|ˆ[øZÄe¶½v›\aå"T ÀíŸéµ–ìûO‰ªR]—ííjæ¥ î,v̈¨¾¶ÑLI'車Dµ4œ; ƳR]‘‰e×±Œá€©§$cA—à¦Ýd>[mÂùGRäWõA*Ð…@ês‹“ÉYÞ#6kD E‘µT¥sKÒóÕ›5 Ã?qÊR¨:ó›°phŽš½~HŽPŠ‚a)×eÜ>4 ¸wa—^"›AèÍ•g©ªŠzG°E%©MTpùš¹ÔïöìsR¤Ûâö‘©™ì2q‡íÚß'6ˆ¾ Ó‰\ Ñ?Q[Š c)Ôû±­øÂµP8ʇî.¿7§Ð‚X£¹w¥ Å aÿ¿s­"{‰lQ`ãÀÌ–¢ék[¡Æ{“p¬Aâà;Ù+Övc¼.-9¸H2A²¬P¥ù†4Þi_¶ŽÄ ×+{ËÒÛÐiÀÞrW> ¥ù Ä›&€ž.e™Ç­:;Ë3”‡ž+³'äЊBÂÆy¦è^Ù£–iÀ÷…šÎɯMç1·´—ûç6ùÝrȸ­is « ]ŽœÈˆgzrWX½Ã¥Uuœà ¬³^]ÊIyiÍ-yÝ˱M"-±¤±è1«/ݘ|­âj9£ŽRóÂàgŒXÚB¦S«ø-.éÆAØg8軹–ˆý¬Ù)²LH‘œxuæšÇ Åt÷¬¥d‹S‡-£;º[“#ƒ*m°J¹LâÝÛâ#cv¿tŸÚÆÏ’ÿa§¿v|>ܯãØÕÆæ¹‹~ã Åïp„Ïß¾‡Gl\óǃô;®>ŽfÉÛD¡AÜoüúY7ÀÈ Œ¶ÜHÆÄŠÐQc*Ïqø;TÍq™©Çœ¡QùT7û©¼”'1·“í°^Nb©1ž.jŒ#U§ '@½amEµ÷ÃOœÑd&îkg!Ã`2÷²®þŒdŠÍ6>–ªãÎGeEÇ©&XКâå ›­T°Ë™Sýw@e/•¾Ó­Â”ßÔþQl¥Ãêaö«J££ú¬L<žˆ.iLÑ´½ÉìY˜¶Ô¡øðƒ1÷[•r@˜ÆŸ7Íÿ|oâ8`µz0Šˆºë|VŒÙÙXk*¯Öï¨7”Ÿ¿mØ'a›ü>1püN¾wNª[¿4ÅNõÿ˜òlÀGyíïiò?¤ëà¿ð¿IÓÆgú?Ù^ü¿=ø÷OüâC…¼ì>¤>\á_Ϊð‹Ésè%=%Þº%@.¦²UJˆ*eÃOñ+ÇëTõ(JïôUxøÄØq±¥ã\Ϙ(¨ÏƒW¬}K“5§Íºs“gˆPÉM¸î—}[¹5dn?úu7®}Ž˜"fqªM hÔv Ròò±[‰sâÆ ¾ÉpüÊ®ïã_èð‚³ýáíCçER¡k]Â;<÷ô$Ì“ÿäi2½¨êÞwYn ÷Ç™‡óB²Jsó¢2^õþ5aF3š9RªÄ‚Úx7ôC.=®x½9x2ÐhÆëÒK—E÷˜t'5êU`ÊPZ]<“T3½Ðo…µÞI YUd¼ld8f ìm^¿Æ«îaén¾œªäÔäÞ/¬º¤ëÒb@‡œ{(£Ôk¹sWÍÌdφ`'­’A—¤GŸsØÃ¿*šÜâQ…í¥XÖ»2c ƽR¹V¢K |¡‰*öÍ®fbp5ô&£ñ x]W êî°^ÀÎ’­‚ànÒk¹ÝEGrݼ—èÒۄƽè7/®R2•)3'}ë´˜8˜Ì¡"Û˜“9Þ5îAßͯœ…)Ťk,ý¯mÄÄQ³\÷¹™sÎãÓÓåBlJff–VáÔP¼${‡Fo4nÜ›ìSlõQ…!Þ×8GC‰Ê’hmÙbÛÚ÷$Ûn³ò¡CÅÔ6:´Z©˜ ;ïɨêè…šÌøµå’íží¯ÍõÌ|‘ß¾¯¾E^Õëþ×ýu§Ð(gÙ¯$°\º¼Aú–Ù±]3O@)KäæŽ¾P/@QQ¥íœˆ³lµþ¨º>µt‘Ü´¯ˆ²H6ÙÜS¨´Aê½âá]>²y nÐÌÛɱ ^±¡Š¥Ë|$Cî»ØsÔÐNã”»RÛB£\”¦ê@¡ªTN"ãäeqŸàÒu]*úîÿ³íå…Û·èR·óÞ1kpA9ÔcëªÐ’ž˜«ê‚[ŒZ§vàÂ?ø‡¿&¼,›—'£Šˆ»ºÓHŠòp[§#ÔÌ6I ¦Æ@É®q´’`æµasù0 èÙBו™ø~l•Š.¸ƒˆ.½ ·—Úfľfœ^­ñs̃faÍ(„®´(ôñ›A°Öu)¾F°ÎŸKoåÅ"¿ÌhX+†¤êå¹MÕ.‘lŠh¯%Íœ¯DŸ@çËKü¼“>®ûöÌŒ£”Í­XZ4áBdû´Íd–Ú¨ zJ"Ë`ªYŒ ¤Ñ|_ï(cçµ [ÌË,° ÎÿZÞ6¢^\ãq6¯HÊ‚ d«o†0å»Mzg UÅ6h‹²õ>Šr†ÃFDV¨s7¹\1Æ“»–<\èfPMU„- @˜y ÈW^b_Ð-†~7e(æ Ùiþ>:i†ø4,UÉ="Ed¥Ÿx˜¬!³4`˜ „²ì–Úò¥"j ¢"÷”c¢è‡ìP\iÀiÚIÑ`@(!‰]]@#ø€üÚŒüGnÎ2Ÿ m5.8QP U‹nÛö…6x!}Ä8Vß~™‡ €ƒ4:a2Ò¼"Ñ}C@Õêît/{•dLÑCx*¹“Œ%f¢‘¹8P%§çä‰ULå‚Â5š8£5…O|MVDá± lËî£Ú 9˜BZ2ÍVm¥æ7•Ð ÷UØ0Ãóab(‘°‚!hß³±»,…W7:ýÄCµ“ð‚y¢û)cò a<«qhsS.gW°ïwtשdÃŒ®{s:ºÃ¹Þ^ß8V9>­ÏƳãrt©(®Už²ª¿íÛò_i´BH™-²gN³ölæßOÆ5ÈgªYìåÝ}YÇmc쾋‘K© Ç[úq58:"BP- 牽§ÓcÒòÈÎ~ôB72ŸŒœºqbãà=QÎ`Àtý³‚Ô¨·ß8ŠQ-wÄ¿Úsȇ¾;EîêãÄ“!Œ^ŠÍ™¶P‹y&yý,ùŸJ§wä­!ãP>ÜØßIGOLùdÏ?凞˜QôØÙÕ7óôÇ?;Ô½ÆW§åØ1¶\1›`ÆØÏÇù'ÒüÀ,˼òoeœVäo€ÿó0®G|ûK~¤ÔC¾-k*D~õgñ³÷‰u ƒ¾áèóçt Õ à×^óÿýcZò/K¼»øùÙÿóLñ)øâ/^yú'ªYÆYáì׳ù3¨å¬ômw7^ã´²ÆñT©E?é²3Îrôlz“‚Ç>f=¾}Z44,y6†þõ]Ö˯“Ø«ÌÀhE."p¬}ÅúìÆ–dl»2)9¶ºrø<ä@* ý¯nÕ Oì;ßÿDüh xù.fA¹Ví¸Ú;ù¶L—Ê_ÿd©ŽJ¶Ý2ä~ýÕdÀä{c„2ûj¥‚³¿úá{®À0µÙY 48fÐP  º˜ß=ÍdÛVÑß39ßS•¦îárˆª}~­T8I"8Õy–´H*T5ß¶=Þ4F®[-A¨+Ò71òÒ܆…ÿŸ¶·,YK½y‘O|z`ؽvÄ=±6QIªA 1bŸW݇ʯÈAÀb—Ô(4?DU$îà{áµt½to»#mEžqÉÎøÍ IDATMºXp  ÀeüÊ7Ì®˜Šê’¶IR.á¦)u #tâ|žŒ!9øÁ]¹·WT tÉ P)N¨ŠÛC ý¨æAäµÔ¨kA  º/»DW…ûzÇ5t‘ÞëW}I‚ÁËžØ`F («EK±þýÒÛA݃?r]çŽ&êMÌ|(ÛÄ”7u¦‰êÚ?‹íkr“Yª¯¥¯¥$nîš+ÑÉ,³MxŒÙ©¢†Pª/E®n° ‰ÿBÔ;&1T]JŽäufûRÝÆªeLe1ºß–ªŠü—qE§ mÚýÅk –U«[ìiôÕ+ºŠû=IšSù­5:Ílo]íäÕ5 ¶/t!«@loA¥§J¥ Í;ÆS–» ] sN!äa¯Ëå+{„Øšz¡)”"ƨ4v‰w×è5S¯Å‡†ÙŽùuèšæeX€9WM•[!·³úpÎ'd~–r›Æ]âD9سɗ‰Ì å•]=—¯‹©¥[(|û"ÀK.ÎGD†A%[±Â¸oª‹Å’äÀ} +[ëņÊ9”ú Ÿ¢¢N iÝ?CEéÖí6窵]’&ñTˆ‘1!&¥ìúAQÊ$á%êí[÷oÁ)4 ‚³ ñ ‹…Ëèªd6&ƒ°$V{Ø=UF¯–?`*¥Ô?h?c—7þ›Å'›µË%;&·Nc­óAºB¹[&2“ûAÔlVøeÖ°N®øð ¤Ÿ¼"Rö®ø€'辉íÕ!14Ähײ½ >œŽ²7 1mÊ#5;ÇrÐ$úW1žv9ýg±.+‘ÓrÏïìfŠ.è&ÖVÑÕõõ gb\ë†î€ú(þì¾õg'2ØñxÄT~à>J>}Óói•,Ã<‚O©c-ã$|õçÕë{“£V†ÅVa¡hǬD<ŒÖuPÎ4̬îØàªù3jÅýy#Ôg5æF|túÂÎÕÓŸ&9õ$º©V¾=Òa…¨n¤ÌFs~`5lI='³V'Öc€UÏò4Vð|êÓÇT òi!C3ð齉ÍrÔ:ž÷øLïò¢ã³9ó¡BL ½¿~ÑÌÁÈêPúæj*ö,7~âåSG ;Éùð‘B|ÿ^V¢Œ!Ï[Úæ³ŸU>;ñßT¬÷²Jþ6ñC8¾“‰xÚq|Œ‡€Où(ù¼òuFNiLJ=TŸ2#h~`k0À5ÓŸá ЍŽ7ÍŠä $ÅQÁ‰ʱ剸ŸÿCìly< Ϊ!Óý!¹Bf x&õk¬$Ç-ÚW¿…ŸLdöá59”D«³ö´$~Vô²oÏì0‰¸‘\ž'zræGç-ý|B‹W ¹4õ·GŒ5ûˆ}ÓSóÐóó‹Qõˆ*DÏv_T$æuÚ¿¨ÇlKÚà9Å¢¸Æ€ÝA•k˜qªæQ«œó•ìö:êÛŽqßGÙ>éÄ7ëã®ø¤´¡%f˜ýìOø^Ç;;užêÙñô‡Ívç¿¶GJpÞà:/Ý›iÏDOk)ä0ø[>ŒÂx ô“åüáÄúdM.§Ã';¿{ÐR>¿¶ð£ :„‚ïÿøµJù>+Àç0£ Ðü†6„¹ á—ïoõYþÅú_üµÆã¿®ÿ7Øñ+Uþ3_î?{¶ÁO?¿™È7fð_w|;ª"Ãñ^¤Žce©-wD²HB¯¹Gö­R[øà»<ý@¤k˜åËŒ««Ýîåú/‚\·°ˆ1z~ògäËWv’–?-í fm˜‹©´Â‹do[Ð †ˆEÄž‡aËP§~Òß¹ži+ž#„ªð%<åXäcæ+¿Kýè¡xN1ñëA/1887£UÀÓ­¼%νN²fq{fÕÉß1ÓJÓÌäãÏÖ(gût¿óœ4A€ÓüËi”œ¹[|à蜟<'o:šQéÕŠÚšæ+'»´­qçC‘—×)õ¾Ñ_}y;è6fǨ®.¤ö¾AÀ‡rFÚ½õRq/¤ÑSæêôD3¯²Å”ê$'1WGa5šÅIKa48ó®iRåª3I“sÃÇãHòô娨\çƒgdèTÍÝ)Ë­å1Üõ0 ÄÞ– (›m]fe{d[9e:ï\ƒÞÖrÉX„o3ÙrýqA ª»K Sï[ÙËf)¥+GeuŠ¥Ô ò Vå'¬Pu?E‘M—|ÞõR‘c×ÈÞg¾“îLF ïx†°£»[ÓLÇ¥ËÅÖ¸†Æp†ïEP.£Óå-ÁYÑS,-ˆ¿X­H£™¬°7&·‹ØbÙMÄqaØÅØ€—ãE|ºDTÂÈ}\ãT5Håÿ%&›$¼¶ Àq€÷¼ŽUPŒö%¦”µt-WÐÌÌ6¦=ÞO-cÑ•M4K×-&¾mwBåí‡0@{C† ò>ÿ(~î­Xn#·m­šÅxr‹­hÛP°Ô°a†S!„n³%€p‹\ !D#Å¢_"¤Ü²×‘ŒËm¼BMWÒû. <¸Û̯xT£gr*'Çž`Ú~ L_ÔV >åòÓYÖ£³àX—z\ÃŒEêò÷ÞÝtRR Ó§í£Âíà©X¹§€¸4;²Òð6"twíKˆN¾å¸tiH²’“8ÎH@ÿXÑÄ( 3Û½›‡;Í/ãŸ"ÁóA€namõ¥M-®_!¦DGºÉÃY!1¶‹d•*€U  ÿ‡Lô‡yWt‰:7ö4y±ÖQê@±¾2šîP²]VÇÚbÕt€þú±îÛÜí6ÆLJ„=—C3×xR!Â2Ý#ÍÀb4õRªÚOk¯Y7c¾$² Ü7× 5Ç͵tÿcœPÚ )PÚ6/Xb2O¤’€©Ê÷ Æ—Ø1ïÍÌ]`a\¦W€÷p ¦äàõ¹O£÷cF<µÕBQHM‰òeºÁœ±Á\ï®s+³†Léc44Ñ9Œ§ß:xÜHPˆSÆØ‡•Z$R¶SÞÒ,×±R¢c°%]aÜ-Ï‹¡fÇ{Fë3ƒ²Ò‘Ä„„ôÙú>D¢áQò€ j…t.¢ØQéàˆBÿU²™/[|Ú)ÇYƒ2]æÃÎÚ ŸƒNß^ò(WŽýo~¹Ø¥‰>é,Æ91I é-ÛºÈÚ¹û{§Z:b í¯æ›—&ºî!eYÊQwúP•dŒ5âûIZþ˜L¦²|ìo§NF<=Ùß[O9óö#g˜#Ý:X—M\ÿ ÖIssO<´YDËÙi‡C çàäu¹˜€•0úñ±È [=Ž]<.AN¢êFåÍœ÷ãXPípø~Qb4‡Z³w'6œ`ŽF´¶mÚýl×ɦºtœt(Ç«¯"$åQÍá‹ ¬>å‡(ªDï;,_N/詈Ҧ˜Dy;-ç2†ÅJ½l1†è,ÙÖ5}môë@ÔËL?°Þ¤ù~åG­¢ Üiåöz¼L»7XãTïñ k? 2ø•X;§ä3¯ÆÏžë„¿ƒ³ñ?ß5-¢ósÿÜË>þÀwöÿs\ÝdTâ[z¬™¾éiÆï€7Ñ׊âÆææp{殎N˜¶)Э Î 5Ÿ\ªð@+Y}…4ï‡Ô’;|ãÓe6¸0fªÁR@´fܰJ+çÜ}ÚLpŒú“f;ñ)·WªðýTÐW›]¾5<Ïû÷ À·™fÔåw¬ßðnÃõoÊŒªþO¼³8öÊFÛFˆÕÚ·¹êtc_¶C2sÕÅ`pŽk›îS‹øSͪó#+N/ç^ ͨÄf]ÖïÈ¥ßm òúŒ½™çGTUU…²÷V([`ržqG ƒ/ÉÔXŠÉwtiÍ{iÝáh¶÷Dn]Ö•²… ©Ó» ¢3¹ŒwñXñyÍw…anG¥9l~kœxhN–1’±³nɤbÄ&¼óêú –ÌíÕ™”y¼dŒF ºÏ Ò9Û¤z#ÅLÃÐá˜s$Û¹¿·‰â¥˜1×í^bŽá,k¥H½VvÂÅ=êºüͳc·žŒ QÁvbJÕ·íKðdä@6ÄKV•„tmæ¤8 {“¶M¢8Íë€èuÉòïÀæ×¢ a¸DE½œ;¨ÔbÜeu5’ÔËeNÙbþ˜›úÇBNB¦­zŸ‹ûÔ066mïg—g8PUþz°xIÝFly]TUY„Ê×6¶p±ÉõfÜÛÙ;Ác€¨èZfÆmÛ­Â"/­BHîmîÄwǽ%™_K™f´Ç¨W:Ã!ò[kѸîm4Þ ¯)–ñèà bÒý‚Ž ºmo3'w¨NŸ޾(4Ù´k©ÅȽ³i£Â:Âkitãªþ²îªªÒ=ÞN߈ ‡÷©dùúŽáú6Ó1«2j¿ïDV«ö€™l—Ų̈èJwÛ¼÷ï¦ÖZ¾ò{)7¤ãææñ€p­åô32Ù¶Èáieá伬61Ê0 †âhòB£[Îj2X´¤ßxã^v,E¡®Id1õ6ŠÅ†­^ì~¯+E–xßoÉ]Ñùa^ô¢WÞÑæ¼…zÍêk½˜Åxº‘]œë>wÒwß úõðÙ÷àðA¾ÖK$ )1t‰¡Œ„GáìÑÚúÒ:V4§rè)ñÚÁ±êöLE]@nzE¼¨õðy¶—¾ÄAˆ)¦oÏ“DaѲ'*rÓ’« …‘˜Iá)X“0ŒtrxB•PÌíæöcpTôûUfÈdGÆÝ [Møö©‡˜G™nø÷Ág µ%§ø0Û1}?R$: ¤Rm†ŒPU¸éµ„—–uèaºÈ¬[\¦} zÑÞ˜¥£_•mŸæ`[FeS“P SÉ!£8—㸊”:Oûð`ü ¡ó”ãóœwF…HdPcŠ.ߥo´ú¦ñ)Ðã`U±ø >ôtžS“‰ûgŽ»[ë³Ú{djQ¨»lÔð0 f@ß>;ãÁ£âýy úJ¶lŽy”ìKξüøò†D:›š§ÿ/uç¶ 9n$Y7SÚýÿ¯NÂmü FDUvOë²z˜i©«2ãB‚€¹Ù1žlü‘ßLêÚ ¯ pôž"ûQù=‡Z,«=ûêyzÌûzMŸã;oëYŽY_´ý‘_àÔßPÈø9èÖ¤AÙÐñ’PFV`ô:0æ¤ãHŽ9Aê(ŽÌ3iÁ¢N'ÚMÇYU\1<¼àÆ °þnF·£ò•gŠŠGª}þìd/òqdô„!f¬à÷àPóÆÒ_Aœ…§nt|åý3¿®§W¹W“dzæÅž·>ßkžhÇ ú…ÊÏó×3çþȈÿfŒôׄõ·Ž~üTÎýÓ¿óßìŽÿ»c¿áÿü£øÿ:¹ÀL ήà_—óEâ—w¶ànuXpru{BÛ+Eîô¡šnd}.|…@ó€í?BW KsâÇ|=¬³îÑÓDÆ4RÒ3KSÃQI¤*Ãuš]µùÿƦ¦g~M>yTÙ#“ªZIÓh»£vipC•˜¢ÿØ{âêQÃòá^}fH óëâð^OÈÇ %Æ;ÚZvH{Ê2O¡™©^õÜEW¢='ÃÓŠYûƒ‘ÅB| )Ì»ê-Y|&S,Ñã±W{IzåÕ«õƒ»º˜œš¸É`Xº‰tpÉ„TJfó­ˆOµ,Ô¥~Þº šËùp,&‘Ãuÿ0 9±ß ÎãÖiºÇjäÖQýQÙ¯ÍnF¥ sLs ö›*Ý¥Ûí4ššZ0nŠy—ÓnpáC¤¢jœã£°Jr°“Õ2¶xìã«¿Y»Jx7o£–m8öÕº%!!±lôT'úCÀIm)/k&ƒ¢Oüö x;®F¨ ¡=S)b›_0Qg¹ÄBReº¢-­ª«7­¹–•“9¿P‹ZÌ8N7n¨‚€|A¶a98ÚQÑqïD[와2·”{ß{qÉÒË“Y lÅCúw?½$aó)ËÝäö£UQü·«Ùp‹£ŽÖÒ˜œ„ ßÝ¿èä×ÜSD‚“ÎùTBUämäZšUŠÈÖµÈRS÷´Bå܆¢r¨¬«sÎoÓ/PhÎßíó•µV1%ó Ê—*Û©ê1ÇÌ“x/…_B—êRÜFù6¹D¾ñÁ„òf©äÛ‰‘·í…&ÍRˆ›—ìĺ'å.Yä27Œyfi3‡è‹ƒ £*7!Ä?B*WÕåóƒ%fÔ[‰œ•Æ/£ío1î›Yt®Ð‹Ø¶…°UT—E7(ü¦M,8c~¤{ñ‚ÚJ.¿—‡:,+áìŽiú'ÔÕ\lƒqáe¹U˜ÉlJqꊖ®`ø8™HäBÔõú…ã>”a*>%§v†ôw!CrÖrèw5t¾¢Á³ÐBŠx\:7' ‘ëڇݰ¢IºÂˤ%ºwG2avÛ©jòh1OåUfƒ~ sþÇÁ饊)J–=4Ö£µòŒÏ♢Á ÒŸÂØÈÇË‹BYs†!ÝìÞ)ý2€„ý¹>K0ï!` #0›W‰—­hf„Ù®¦n±ÆÑÙÀèÄ ßõ剼,>–1.c[ÿsVXíÓA•cÔŠ×ì|¬=jÔoý¼ÍQvLíAF­Ìaô®ϊܺ)ðd‘=‹¾rvv$’Ð<`Œ»t xt¼¦d¤±¾ ¢Èà Éq,à‹ÞŒçÕ‰G›ú×á¯ir«4cÝvß™õ XZIÎc©çtÜ~×LsÉxäöîVƖ뙫·j?ñÎEÌ·Ó ±hE—‡Ë%¼q<½'û3à{žq±æ?â‡ìK‡ï«6_Ü|LâÏJÝø0šÀï”ôŸùÿe~ÿ¿üƒÿåúý)ÿçƒpÿ°Z||°~ž½P]^ÍÏòܤ~úJ84}Ô÷Ít¡f‡‰õw¾ÜΚ¡ØBÑ'‚NöZÒu·ÅQ3ºT 4‹ò´xrjØMQÝ¿š‹m´f‰ÍBãбD;ˆæË¨ÃlrŽŽI”5DN¤Ý§3ÏàÛ»$yÜðÆ£†ùý·Ì7ëÅËWM—Ãã¿~¾C<Ýå¶ú¬êEüšÙxì7²ˆäE†AÚý€– +)`´0FÓ†2aÃÑKg+AÙ±9ýìóLnF½ÖoÛûavV‘G5Õl­ЍöÞÜœ£r `VùR–tãüºÅÔT`¬£S’f{7'ЀªêÂ|gN¶‰IFÎ`TÑ£ŠªB!;µ—¹ÕÁõñJFNMD¸-©ØÄh²—ÖNlú ʃüüµý'J·áϪò­úý±!US£iv+鵆{39þMízñÎRn·XZ1÷û˜ÍlÅ…ÿ•-’ðHõÒ’t5c+¶÷^¢r]>T‰®ˆLXfyëéW:3"y çÖÐè0Œ²ÚùÇõ5…ì­âß›yÿq‹ØZ—®*pÕK•Æ›§%^ò#g¯UþøüÂ!<&òMîoÙv_¼ôªIÕƒ?Æm ›½Q {oª®µ¾t™È·í XˆN˜j˜a¶©¸œïÿí# ‹ÍæíããQ|X‚ò8­1kò…( ý;ž#æ2«ëÎAÓ—7„Éö`­?èG^þ@»ÃÍé[ȱPÜ©Œ%…êRÁM8g-Å×RW#\fG‘=ÒÁ^H°.u4 ÿû¼÷ÎR9; –b‹éµB˜æÂ6”bæßÝ*—VÅm[x—7Ílgß bvsªÃ¯ Þ´/]>–Xn_¿ã¥±Mÿ¶û]Þbömç]ïÛP:¥Âh÷¦ —¦O›D˜m=Bοm DnÚ—5ì×+ཱིù&¡*ª#)(.,.‘{ïøêpm;K-ìôе*Ï7jøôª5Ö"áÒqp5Ùn ^<(ºüƒêV˨ã†ÏWцTU#.X¾@”ã8aINqV“Ï«¾\(Ò3úDnÛh²É ùG5íZ]}³µ'¥ÒÔ”ƒ°<E%¸?_¨J}õqc…4Ltrù¿Vð‡¡Ñdóè»ÌAþ˜ÁËyH“ U yX´˜‡*3$"ŠDª^KÝ6±§ IDAT]y€¬KuslÞ·Ð/…nš@¸³ãæ `ˆ·^ç%æÑÂKÅv²ãùä*P §â©ñHQFS¢+„wôfEˇ d7Dt]ùŒ°°â‡Æ£²4Ò,F ï¥à@—OÃ{>6ÅH¸ýßm­î¡Dª™-ƒ£tòš§‘F²lÙWñ §`¬¬äÌfóu¶ë’hìy‹>1ÄtˆID¨Ö|tNí‡ñdäPÇ`ÍÊÛS÷éRq,’ïÑóÂâ{£‡‹ìÓØ+ð„Ke(òB•BkäuFT%s ¯4¨ÎK3õɳ;›zƒ‡'ó0Š?ȤÅn4>ì˜|p&‹e6Çó-ö:%>EQ^Zº“&×*» uÜ¢Y|ÄsFÄW¶ö,sm2 ɻ鿹‘¯².r” ··˜õ5ç{çØíÐò¤t yN¡³ýâ6°9^LLè;ßÙÎÑ“•G}j8g:ñ ¹õI8 GTŸgýzÏ!Ѿqq± x2ÓÙšÛĨ¦a~ŒJ&À?o„œ£Ó‹çF/!?=¯Èk÷ÅpƳÍ:Pl9“A‡¡ V]@͘q9JZþVv<œ‡‘<±ˆ,Å>B‡Î« £Jnr÷ýŽè{â©åÄ7iã0f óî8ZÕsB„jNëQÒÕÒꈦ€|å»°ˆU÷~6U7Cøµg;cÿÖ°€sþ×h­Ä¶ù Ûrx&Ž~49Ñ[-ÌnÆøåCO—:þ(ž]ò*¿éÈÅ ’³*œã5àº3bü`†õl|\V/š;OÅLž³w5Âg%rƒ™_»®Ÿ³¥‘$6ƒ¯ ÏnÇË>Èr8’?©÷ý{ŒðBF¼hþô/ý+ôðÿÍý—7üÅZäç\/ ?ø¾åC…ô1l<üú¿¸ô=ð˜bØÉñÒ ŒÉäŸ`?æ°Nƒi’r1øîKÜfT+'„X’æ^¸<&:rq9gpÚ? z a¼ÌU ˆª:oÕ½™’œßî1ŽG¬…—ì¥ä‹šoµxÓc—‘¿WeDúÐ6Fÿe?ñ¡à¡Ëù{à×Ìã‡Ø+„ìôçµíw·/_Ÿ—ký¦¦‡Õtø_Ê$ΆC£o\OªÃF[ÎÃPÝ{ÙÀ\ñi/Û´¥J¾ÈôïG^݃:·¬ç|úy…3å(qCT±…VG½iÇ«7eÙéÎú5—m’ެ ù’ññF½¶ü¶%’s5Ëö¦hvõyX|ÃêJ¬¨*öv"CލF.@÷æ´:ù©RŠ€ eŽ}æ >·DèµÓ!yB+Î㨥,äñæ ¤¼9ßÝøøã¤ÌìÞ‘¥*È&¾<2±Oþ /'n¬Ú!!ëîC±°Ü…1À »ž › gì(Ó#§ Qh^\y£oaÉ&ÿKÃà™ÀnËvZ ÅXI.¯–®DË]d(œ1óˆñZ¢­xÕ"gλHY^¢ª;\ÍÜFÚvGö}ï„Ý×ú§.ØÞ´}CáŸ~6^ø w“÷Þºt©£Íö®½YT´«cCl[:¯ã¯²ôòû#ªD³!’¢"Ká0º…"då¨noBE–` 6ìÞ„é%¥fówó¨Êv7ŽzaŒÝt´›=¹É["ÿÐu] n˜éÂ.øôŠé_ëÅq3GDŠRõý¾7a_zùŸöÐ wÈW+è’Ÿj¢½"¼T•0Ql“.3†˜“–kíñÉOÔ§‡¦QÁÌÚx³<Éœ„÷ùCå2ÓrGTÅGª0õ©™_òy,¶¥|±íæíEÇc`vwXN\A1Á ÙWwD a*♸ )¦ ¬–Vãê:ŠP-Ï' úè½mEÆÚâr2"BÈzõš7‰­Â]8ú5ñ"X~Á»Ú›¹A[ñ?=“W×c€÷";áø‡dÔüÍúãâÇG,âÝŸxL¿ð«ñç•pü›Òÿ®þÌŸü¯š¼…¹Oìµõ÷·oäüWøíU:ÛŸ¯ëöùÎ…æ¸ÁeôA׸ysêÐ"º(%ë ËQ«>&œ¼n—ª 8‘ê~æ_ÁšTtÌXóuÉŠµpôå‚s£óQÊ"ŽøÄÀÿLØøXeð±K¡ï\†ÓÃÚö9ð1}0~ À®œ‡L·Üÿkßýó‡§ÁóŸ¯fë{eZ0¢ßÓ{= p››Î-ìseÂj¤£Îõ„ìɜۋ¥º'›(5èÉ£sV8T U¬iš\s•|Éì„Ã>þº+ĸø~NS'óóߨ¨3ˆøGCjÇ0`´ô0p~þ% ¡d÷29™Y´kXŠ{‡´ˆÐâÝ6‚ôCo/TTô´k u _Ð 9X¨~ÝpV% a‚ÎCܵïS½;u µÞ8Ù^÷1ì¸É•‡ì,-‡òN0{”hõ–?wZRÕ¾AÅÏK.‚.ˆ^Òã6­ Ò¾ÁMë™11ؤн€ÔjN²é¾O×]Ô\ˆ0"L³IPô¨n³MÓñâu!àÛn¡ …Æïúúá:. ³Ik;5üc›Ñü¸Ü&Û¦r÷±Ë·¿¿½™Ž};øß `qYVVq• 4ÑFÛڬЧr‰WJl±èµ_€‡s¦Ôº›²˜ÚÖY"m&×Ê^v…s]jb{oE¯•<Ž-b¶´c]U ÛÕí*þÛÉ•/è·ÃÕã=šÂ …eyã¶*DnòÛ{3¨*çö®C·Û6`bNË¿„P1Û·‡È þcsm  ~ £X~4 xW($Ï^hDlMîJÿP%, à®ÂªpCe°u)€ïMãfÅì]–·‚B“Û¹?ò}S°c±ÖrýÕŽЬšë0xo.eab© ^úàWï žøäÎp»vg#õ¹³3”‚%—¹ÊÿµÖÿì½7·í/…É ùÓ§¹ÎxKý9 G_™L ¢P@ìÞµ[‚Ыš}Ùƒð»6I‘"„y8“õ½(ê<1I l_4æH–^c-|éåæÎ°à/X@/Ö.D™°tª½jxw¸ãù¾÷®@UÕ(Ðnè*á ±#(Î â©2YýígÚh!¼TÜðêžÐ…é4,”Ev æJif¶ÍóKQ…`I՗ɪ‰ò×mÑHýȶZV”TÅøôó…°¦nmý½Í¼a…jä¬ÔÀeÎäá@ôv>§ˆxôüA4 „Ñ+ª¼÷¨ü´¡ËŸÊ¿T%·«o9Mjêeíx¢½OÜu¦8*TÛzdJðéDÁ+‰eö/ñ·Í»Z¿!¶ Ù`wµgt±ÇBÐþny!ùǯÑ!™°Ù¤:|®)\Þ;?ã̰`Ût#ñ©R¡“Çfƒå]M8ˆr¦i¦•¦§< ý¡…‹PsV¤îã(3\µ=ðJ‹ø¬²‚i2iÂ6ŸZº:¥¿ðrš¸äi”£a¥Õÿ¶ËÇw­PH>?³8GŒ^T ØÍH„`–C Îñ`…-?DfÓ9Õ·¶Õð8t;?+@vô)Gßë°ÃŠà¨€«"VãÓpw:ZÁåAŠÀèÂ<~æÌ¸DÍŽS%•ö,èJ€Ow ¯LgÏ”ôÆî—UÞÕ9½—ÆÌé­åôiŸŸý+˜¿Ûfé݉¿¦[˜ óާqŽÒЯæ‰uªļ’0 2 ﳸ˜¥ÒÐ0–kψLr'Kr\¯­Ï||ù§G=+²á+¿(”•£Mê8ù_2׈ÚpVd¬^‹râ;×x”ï?‘VÙÀÑð¤“pr¶LçØù‰&(²ðÈISÆHdLtªñ,MÎ}Öqôu7ÊäF[ȃŒ %‹ãô‹‡Ø¤O5äTû-v̘|g3>h=xÚ’›}„A[‚Ëì­ANìœ×/grgHü`*'ç›ëo¬^ðømü Û~è.ÍÙȃ}&>žóó¤3:cøÁn@ÆéÅÅì~ß)pä–^ßÿ~Ã;ÿ÷?â_å²ÿI7Ä¿Æã®/ùÿò?|×ôûø8qôý>èñ6ÈógDøPÊ®#g”@Ó1æÕ‡ôÈj0Xkž›ŠŸJ¨ó驉§dÙíÀ3MƒRU èF%]©(ʰ̋ÿð$ùˆ®9Ó)²Ï^˜ q³OIâi«__A$ðØ£ðµ‰Á’GW½Vné§`o'wò'7S5Iáý¬ÐÿãŸqΜ>^7WÉèF[Xs‚*ß$iþRMIÊiüÌq'ÔéœÍ¶a¿s‡!‡E suƒ|ð‚^­@•1eŇ-´Z{ú2^æ%,ʾT24TX–÷”ý*¨½ ¬Üì‘G49º['3¨=8ûÜF˜ûÐNn»›€‰ÆÊrc‘+‰M!º­­h³AD<)CÚxH¦àW¿Ñ¼(Áº‹d€1ÐÆœh€q !$B¹hŒÏÌ—tCC8Ô·7oF{tq—ò½Tÿ,h{XÛ 8Ò·ÝÊ–xõP£4÷È‘LfmÇÜY‡©(l¶çª!ÌɉYðÅh›kUGA¶.ûÞ{ßߎ÷¼–.½xEÅ®KðRwÚBû¾±½½ã4XIÓ ¨b·Ü¶Í¸T/Ȇ'œhfêqðVxek^R·Œ˜SõŒS`äwø8{c¹ßÕÁÓdò§ÖyhÜB3û¦\Î4 §?Dd²m»16Ûw%µT Œâ#€åˆ ÈpýL¹péRY?îí6ö„©n‚f4YrÕÊg˜eµë‚êµÄîm"Qnò¦€òåÞSçg™Ý÷÷¾í¦]»ù½¨ .KD+T#Öî"+·ÊeØù§T¹28rÅ(²|Ri@ÝÄüÞ¬ÁΣ³L@ÇÄ\PúÔ‹€®ès8ŸõG•:1ÏÔF.Òl&¼¹÷6?¬(á9f¿šzÝù¨ ÿPýC½D¾JpI$¥j²J(¹ øƒPí\>ºÍ¢¶I “³üa¢*—BUI.¿x(^€ª"ª‹béÉC°çïÕyMêï6n¶Í;¦c&™ñ•‘šVñFr@eùÂT,DþntXÐaµÐ_@@ìôÂ'G­w4þfUäk©h'‰Dp\y}¥R¬¶M—šy/‡Èz¯IóíKƒ7VêÌ9'­¾~ã,A…srªšOš¸¤&&t¨I퉈æºäØ;KÃ&«º¸w˜ôÔ‹"¿T†QôΤZ ì̯¯ÍHTy[S<ö™¯¥:¼¶J4ý„MzŒWŸüûZÕ¦K <ŒôF(¡º€[¶Ü¹“ˆsÇêZÊ‘z•UK1žµS²Epe€mS¿‚âYC ¤àpËj1µãøD+VÆêb•³Ìׇ-ÏÃ)K<®b¢Z»ŠéLµAýhoCÂUüÕj¦ú­„7×ÊËÉ 1{ÂSt‰±ð%ÉR°o‘Q'í½ ŠZÙŒ!¹çQ¨Gç:d®¬YÁF$B_÷ak«“ºIõ&„çÞÚ<Ý)Çx@[޾?"² I~¯s*²&ñÜŸ"ÜÙ%9ÉÓèðC¢T¬ó¶6°rQ³2–]êPf/ŸÃΡŸÐnžfü°>•“©«QžÖ\žtpÈ ÁIW%¿£ðñ\Ö EŽ#×¢6£!üA+†£«G3h ÀcÏ< B€9†ã‹¨y230Z¸ùFo@Ëyã÷/»ÛY…Tžx,§Ù†BjáÀmć²CGvá<ù>êœg|NFw6¦&ši™¾t ½˜6#ˬcý0M»÷ïC[Pû’ãC)çJbôä…Íëð­ÃçÄùÝãÂBVD ­€“ÏqÓ §Ç÷©y”AQóõqºV%Çág;úÏŸ<âi´Ô™HyÔcðqKž¡m²ªŸ}…MáˆZ¾3ns®VçÝË—[£ñû”D8I²HrTc´FVhþåƒ~0“6ód.±'¨ùÔžðΓ~(Ó¨¶Âçu7 f2O-$ˆŒ‚´Ë€ïô=Íñ‹1øz„!/nûw²ÞJÕóóëöc<+ù=þmuÄùY ~áÁe¯Eü‘ò?¿£ù]ü%½œo"?‘êù·Íô‡µÿ>}ýOMeþC3€OSW 0jÁß5rÁÁxC*íµáTÉÉtdOcI]D(Œó½„(Óµ=aŒËIº’Ô•§0ÝNË‘4¢¯±úiRƒL°bñ Ô†«ƒ¬t»‘Óâ…ÑÈ’ŽÇ*DºÂúXá5iVLÚœ5¶ 1ÅЬé“:¾£Ç/¡Šß\9:8ùúzW’¿þœ›¥_^W×µ®;Û:gHÔ÷Y Ä&3ŽjcWßù:›À)ÇWÂd&:P³ '©„«6Öð–c}þœ#%àŠ'”Ó®PU§ÊG¦Æ/|Åùvn‹ê9 褟E+×Oåp Ãh51ôŒ»ki9½H¨ÌEmòO›ëþ‡ÍQ8¶©+ËÔlÑœlc‰û í&ÚäÌkÛ¨Õ ¶–¦‚or P Z¨[=o1š,9F)Éá’’ÊÿšKFÝ„_%¬¯j²ÅÚx*)i)Üñe»údó¾Ùœ¥ÚÂhn¹wµÏã«Á‹42ůç„ §ƒl±ýý½¼ÖŠ3d]){óˆçß5Öú'fT1Q•ˆ¤7ž É¶mßFR¾ëº1·ù{aª`C(v›ß/FFS¹÷íŸÆ×µ’+DîT „ۨÛ4¨„ôƒ%¬%vos/÷Mþ ǹ¸ZL¨Ô{ÓhTW¶¸çÞ5JbE©b·yë5”[MýQÂ-ÆžsÛ÷¾I‘kY‡PdgŠ|­…Kå1иå›;Äã ÜÙÜ*Ñ@pQ£n#ÒØQÊPÎÐm„ìMñ$ 6Då"rGx©¥h ‹"+¬Ì¡[¹>ú.MÜ¢.—s^„ß·‰ˆ$˜[Ͻ EöXk|ʲ’4ŶÝ1<ã·G(¸ ºÖ‚ÙËìºü×y\‚^Þ“®ʵp[5a ›Ñ¢AREè’?L¡WÄzñ—[î½5'g…‡>e‡$÷¥BsI:Mn›[(_úÅëòõf­µÉmvo”Ö^SŠãÄe\þë0šªì,P€û²ÚµK™ F™#ª@ Sõµ<Ÿûǵ³ …^™A&ãÈ8¯ìz¸$¾)Nq oͨ‡¿GdÝõÞÈmñÖ ?…’¿Cœ1v¢+6Rq‚uOœOV©Ù®DSŠùÅ%˳Dþ»Vë•}¬GO<†6M$Uê½çîø|F-ê¹G²MÍTfŒ2 ÙS·iT(š‰‘{;q}DõŽSŸ–Û»ë#G¾³­é/ L’jx®µQïFò·îlûF²9Ëž1Ï5UhM„ÙæÇ©[Ud£,–j•¶@]0ß–ã¦Tÿñ¨c™ÃÁ]´NR†¤–*­ Ê„9ˆE­¤ì:è¡“¢bŽ2ÝœqQò4áÄ!jSa‘`ÌÆÜ~VoeN²b˜6€—Ó¹=&^¶]þßaT†ŠîT#èër;WŽžI³Lºäî-?•y±Šˆ ¾àXžIâJœ€ «ðhŒ ©íSõ:ψys ‚°ððòs¥.ñÓm~°._%ó¸Ôl ãñ¥û:È© }ò(ÍÍä«)s:a9‹ÙNçý¤ü—ý/Bá4Y?”ÂAäøäØÄ¬æ ˆ²‹®_¥ÈÞZNByT@Kãg&‰|Šz*ø@ÐÇ>ÈÛrËü6æ)+p)ÊX¥ l‡røp Òl88%¼4ûÄf‰âWg´# ù?Öaµ­ÝòÀ‡O^ºfˆŠÌF„_Íê᱕?L"=¨N dß`ùã‘yht=§m?’ìQŽ“Í"‹–d')ž¹ä9¬«YgŒÃpN"báÌ]Wަtú?[žÚ£ Y>Ê™x1ðMŒ ï#úÿœ¬Oœ³4îµÞÐ?l,Æ¥÷¶~ƒ0ôF2„¸.EA“mDŽ ƒYQ(½bÈQl?L_u–>º »¿OÞ,5‚а(Ç諎’ç›S”7Žâ!nWÛÔãÏu¼<ÞñE‹mÆÜc|˜žØ£­ü²—k© ¨ª%56;c›Šc‡.êJû˜ímQXÜ )+öJÁUÅ´Œ7.嘔>ÏÒŠŽïÀÀ3XSêkÓÇÕþr r@cŽ*¡Y®øxýfôÞ2˜Ò*uÀF%!Põ^‰„%_Ú ¤‹³s”a>VËÙàSZnŒ}º:-5~©"IYáŽó.€hØ5b”ÐÆÝËP}›"¾8G(¶8ûNÝ‘}pÑWh®åmè€:Í[Œ˜›<Í!SeÑ‘T?uj5ð6‡!D„Þ‚`J¹ôò_fÇÐhé ×í6Sg°(pïÉf6é¥É²§.+ßc¸Æ™ºåÃ$U)!#¹c^Á&…ß| íú¿ÿG–£Sp]>cÜqüØofVa&2‰„cHÌî-"ò] ÊRUU¹åvù›Ê-ßjk›'~TãÇæ¹ÁõÍ­ö­ßÿÐëk-ã¾·YYÉ=/²V¯=–輺˜›Çˆ}[”jèN€i‹¼3S„Æ[h´{›^î—Boãæ6ÞFŠÙ·˜ÀÄ 0çñ×UÝbfFón÷«k§;oahh›Œ!‡@x“Ü\k-,,qÖ¸ˆ|éÊ´DäÞLĽÞ>&s‚=T¶s±ðB‰*xd{ÉÅ ä±3)Ös§P¶Ûè3ša!àF\„µÔç<¤P¾@†zނӅèb¯ß6 E¿Rªc¸.àºT/È ×*eQ}e›ÑÌd-©J1WÁW–Þ--ŒXN·¯-`éLLüÁZªKq›KÒ‡}ošIv£O´up)¾ÖùÞFÈ%¸½ó^PÅ ÙØO`a&2¡ 4V¬{Я¥FŽ™\”q¤jÏsÊOd Ðv”¾\ÕBŸB(&U˜GoÚp\Uñ¹êFh\€,Y#*yCûe=<¤±„˜·áÞ"ª-ž(Á„q‘ðŠ’ñ•ÊHãZ`)ËXÔ—F1p&¬ô¥qè®1?œ¡–O‘ä!°ΤP¶•%KPñöþ÷M¨h<‹„Æû6nš×ºÅ“¾9tï˜yB+‡<ŀؑŠdo¨Ø ‘u­i–bz€}xRïÒ¯©-ô~iɇ>Õ†|M3¹E¯e”~#<µ 6Æ´íS2K2=•EÀó›H+Èæ£ih´r#f‹ABǬë ïìûDJá«)Ûbc©?!s™’´1]§3AXjYs_*;þ}E–‰IA`Ú<Îãaˆ4×fWÈ%j!WaÌòÃA)„ŒÃDì]öÕÐ1CG+§/ªU6ä+%Õ­1®°Ò¹‹u_‡Ô±#E !ÚËn î´±Ã&F‘ìdÈ7”Oýë½úò.˜m%ÃU9mõy­ô¨À‚ õtËqú¾q4¨ž'üñ£JEÞ¢u‹×:ø*Ó›.’>ü8}«|±»Næ ˆxÝÄãTœ:¥ IDAT1Ôö@!xÀÄÛ«Ê÷Þ×Gaï‘å8b%uI}xÀmrÂûh¥sLëY-ñ˜ìTþ€óóîa1Ï/BF…tÿRZ^œ‹B6L(¨¥öÚ.\³‘ä=v¸*=Ê—6ƒ'ÔœÚ;+>ºƒDãg”vÅ1"iu(«s8rV(VÃ|燺ÝX 4!Æ/dª‘I‰ žÕópN@¨é,ÉWpfèÑvÇÃ=»ØÏ¢Tås¢×Ž~£v z 1v¬³“À?õ‹‚O¨_ÑbvæyáxcÒW1ñF<ÝþÃ~¢®8V³iÆÉ“·J´Žzà*v–‡%²Uùc0)³vXžM´êh&£x$zúò˜¢ >ƶqææùy×b²£ú¯Êà?g;< mo¬óoU/…œUq<Ÿ¿Tâ+Oó--¯¬þOŠ6ÿÜÿ€Ÿ*ß|jƒøKÂù{Û*þ¾Id>Ž#øÿ­zÿOù?üo“þñëwfÿ×1=réá—ßÆÇ‚‹WpŒä& `>‡:¯în‡îÊ1ŸµF¾ëh“ U—ˆæ~y—àLÍÎ^bþ(?j*ìµCDÆP-áam›?±æÂ¤`á‘gÔš8!2Ó&XãI‡2‰cüð]´uxl®x<‘Ÿ&=o¦>9áÄ(~^¥Þ:ix|ªço&á‚ÎÞ{ª_l"×w¶Îdå±äïó1'2êf  ÷àSèÏ3›™¹Õw†)]è¶h9-ûÿÐã[›H4ÑÈ„žªKHOÈäåðx#fL4§÷l2°» •*ܔЎ›u²9árÕDÕ¬ÔÁ,H½C7¬ )÷¶/¨çõkûè ÉÍiŽ*þV^˜”-?ŒmsÃÊÜÊŠµc„-òD^®Ó¹õ ªY±™êË3‘ˆZAf»›Õ€ÄÂG©¹Í­CÍõ‡`£‡†êÌíÍæ>Keg)®ƒZœênGæ4ŠÁÿ¨*ÞŒ7†(£—,AÅn6R"‚mf÷Þ{£œœ"›¸L øZ—«B䄨 Tö£m×KV-JQ¢Òuœ»TɵmÇç¸ec M7]ê xâXü.¹mcËR,À3*­yŸ+ˆy…󱱓††èQ¿™,ä{˜’Æå믈ÑîûÞF[ª1d_ÛäÞ€¹Ä-ã73Ù÷¥Z×4U\[÷²›Ë'º~à˜‹JšÁš–¥Â½ÅHSѧ°-½–ó+î½ËðB;šOM£iEvä[æUÆÚ¿¸1Ùâƒ7÷×Tio/–.SðÞ¤èBiJ>Ä :™EþÇì ;¼´ïôÙ&ÇQš<¤8' ßÈÓ:té—b}É÷–uSÍTu@LM]YL(âÉY²žˆ˜mÞ÷Mòë몫C•ðz O€¢ò¾®ëºÖ×¹±s¡Q¡á·qcƒ‹^XòMÓ’!TUu-Õ˜ ÑDôZkï%z]KTöVãÞaü®¥¡åÌ6Å"opUŠ›l´rŽd¬*^,® GýMºiúKÔn+èªß­xD”üeÊ ^@k,ªté¹ÇK‹»ôUÍ\š¿-§©t2CW._^àþòZ–£»f?4 ‘Kñm{;ÉÆXÓPW£X>¾½ÚA´â½-ì!3I9²Vþ¬2fs“z”ÜÍÚRvÖ!¨î¢ÿÓ™1þ Œ¢Vbi<¬"´âR”Ƭ{i¡K YÅ€AcÔ0ÏÑ¿Ë*¡SÊé½Bá7ïu‡ ,ý7×uÕŽ$Þ²ðä(˜ÜÂ…Ü…MÆ&G=Þ\¸IKÁIe˜m‚)ï—‹eCñÄu„äÁ˜Ú&D,î#ÿ¼Ž+‹( w3[;‹·?HPtÁµ3ï@“zØK`ÆSÊ­»è]€Ç+Î7"3–Kì¾0Š'Š<ßeÕ)ä×Mu#‘cÌ¡p±§Ò P±Ê ]„¾2ñ .ÍRÏ4·kŒÂT{# Ÿ÷Ðþ¤gµ…¡d] ªm‡§ÖU`ÆÓ9S=Œ’”žf»¹£†’Öïsj07Gîgèל¹„çA…#?Ѩ‰•è”*xbi"ùáü_(>/­ÉÿÞññùô‘6ëS•ÅÃ[Ý{j©yr—t׆£Š!-W.Î9á4rwzéЮ¡|§}ò®=|LÈä"ViŽÄˆïErŸ ƒsš*è1÷hýñÄÙ×ÅSw¢?*k.•“žLR2ËjâÉ—VßON>šÇâ|’s¶<ó Ây£I°$û3Ÿð|w­yÅ7cv: GXn(Ò­Uïʯ .è1=ªuCÏ B'h§Ë9/ÄÈÝááš—Ñð†qÇÍþ•t{ ½•çM¯¥Dsp¤°º§˜‹ñy†å¬²‰~üaØ=ù^ÆkoÅøwIïþ¿c´8ËÉ_Áhrp¦•,"_™“ÞtÍ#Ÿ4º;zê€ãûÆèÿ#öó¯#¿1…‰†|?ŒÄ]Í×ïî½[3‰2ßÁK[b â_øRç¨WþI >?9e_¿´Ÿ«Ö–‚_ë¾|åýfò;þ¯ Ý¿°˜ÿ|®ðòÚÿuêÿŸËRð¿*ð©ã5*ôZ ,ïZ‚å)%ÿôƒ™:ø3W@°€Ìz¹zeÖå®Ód!²ªF3µ²°çWpàXX]¥kÂòu†Žc¯î‘vj¶±d‘½?ÄÀ æOÝ(‡SŠöƒ¯;Ž=½˜™P>n>ûŽ0AmïnEG¯â˜ÄÿÀÇ?¿ÞÛÇ6þY«säÀ>%ð.Ñ„__%W rTöm´ðÌáz2ÃbÔ»>o3îmK9ÙÔwg d$§»ÂÍ0„çÚ ó=l™ó™æŽü]41v q[ýŸ"ï¶÷7PMj&2ÆRwÚ"ƒ+ÈRÁ£#é•,W*ê~ìºFsN{ÞsU`YÈ –Ia¨ß*´à“äÝ6OJ–ˆ‚úL…yçúV8›™U¢›x«÷-Æ]s\”»ƒ.EµŠµç*+'¼é®›žæ>ÇÊžàW¥ÙFÓŸêÿÊiøÙÞ^é‘-Œ«âôñ¨b[b|¬•½ìçêJ§ñvü;ZIU¼}MËSPÜû[%§Ùf^¸­èÿ‡{Ðå[wÕ¢€•;BÇ?ÇÇ»‚>!¤üaæêàVÐ?àIôhdP£R×®AtЖ@ö’Ø^p;NÉÙðopß7€¥â˜‹IIÝ”ån{…J×JÓ«=DÄäÛí¶~$4°Elámvow·¬Ø÷mÙÇ¥r;¿jc{k±0…»|¤,ý¿"*]Ã^©—Z\n»«Õ[záÍ«iwé—ªm¡þ‘}÷á»wŠ˜Ì© P]‚0­³t“"g\ëEK$–}Ó.аðµ”Ê?lÙ÷”Øz¦t)ÂÁrô<Ò“Ú*mÃ&ä­±¬ø½K°T¸D ÛçŠê<~Ùª0èš}ðKµ {‡ù„i|¦¿·Ù÷}›m /¿ÌsLr‹\êAôÄÅ×?®K!×úÃSGžiÂ;7Èm=¾S,àÒ¥ŠmÁ!„îõå*áåÊ8û}ËîRc…³x®hÆÐ&êà³*w<ñ£Ÿ;ªA†yWã¸Íu…«ÒŠˆ$bµgç€$÷(¼$hbQôâö—Ìbñu“?»™Ï7{d."šKDÁáµ:þÀ+ªÑªl>ö¼"ߥ`ùßöåKÏ…uzVÙšS±®Ó¶_øÛ5˜/¬Z„UÕö¾£™Üœç¢Ó:Æ’´1¬‘R7NËJ^ËaäÊG£Çàœãâs߬¡¼IFæ ç)©еb°®‡2çÝFfÛ›c¤o›@<ö|Ðî +ŠÑŸxÊÙª"fTÒ@õttpY<ÁÍÅcï”Yé6áèGU¥|$8‚€<Ø·%™Æ¬ ÍCým¿/†Ê9 ãùYE#gŒf#Dš„’Ë5áý˜Íº‰<ݯAd²ÔE «¤Àc%ŽýòâP’Ú¿ÊšßÇx#ÝÑnb¹g•¬á«»–¥­¿„ÐpÒã X<¢2”…B—{ Y _ö‹*]F'˜Á*“;<‹ë¹­ àÝV¦sЊÑfV<¨ó¥2ª§R‹‘ošt›üþÈŽD þ ð£|/œêÙ[gñÔ#xzxd!£¢ú …”ZIð܃¾xCÏf+œ¨÷Ó;ƒ#iAšn¬m æ© *˜p‚5§Þ6úFWlÕÄâUB˜=›èÚÜŸLGd+‡.ýÖ—‰7l‹z4¦[úñ,ÁiPæ}gŸñ€YÙ{ i`•%#Q£¹h|k¹ªÌ¤Øi½œåHÙN1%3µ•ë()™rt,ƒt!y ‚¸é6/˜I°‘mê8F¼g@ƨžß<9*¦Ï‡²1«|Æ•rPZêzžNÏ6MvØ—ùP{"[wâJéãœöŒo8µud†%“(µhB^ëe?x¯ß”ú2sÖÅ•VÉù³Øº{Yt Úº¡‡3>ÇCøÇ¯´S¶í`|#]u(å!|,[ÿüOù1:üOÿªî‚áï†ÿ^ïÿŸI@üÙOößàïÿ/Dÿ×z€]ÿë/ gûÈ´”46þo¢^<äšlY ‹Ô勸VÛ0O%j¬”º0† ˆÆtrÀ|ÂáóK¹ÃeGÏh¸·ý™®Óˆ‰ye^\KÒÖc×¢üçî9‡ãÇT{B"¡Ç¼ú9Jô64¯=ÂIh,ÄgDýc†„úÿ˯>×–kÓ.Y*ØÇv¢RÎŽ˜ûpäsÓ)x?˜hkÈRµÓ†Z·þŸmv­%"àj%½±S”°yxál¢ÿIf|Ÿ¶sÌÐU~©²Yb‚28O}Zê\1 Rg¢ê`J–!ûóGÞ´ÀY„`.Öâº(²ƒä›c4$F£Ä¬l qsÒÞX{Ùþ¿Å]syQCd¼ÒýœÍ „è¡^7D¡æ >±ÈúB¼Šè}­¥K—À3-{ï,õh¾TܸÓ: †Ð ÷·YTѪ׆@¯€¿sžèQœš]–J9Î7lrœú°Wv†ÕbvL»,)où4 ›îÜ•‰H»É%bÌÊŒ\/ˆ¹11¿Itbã»-ó iÙ ÓŒŠþ–ãaäˆìˆÏ´"úû S›qˆ(½´&SŒàŸ•(D‘Ó€Çòi²³ÍF v3_(ö½¿)*Fó¹&àA0ŸhW/•”sг5Õ!ís»´0çû.H„Cšɪsôiö¼f !¢ ›Ì5#'­% i¢$M-´%º²¹¾úv{+f=!¨fýÉU vd2Äë™IÂkÎmȱñøêÍ[4G(«Oǃ¬cûV}íëH^ñErU†ô r´ßÄCµB²86ˆ6ñª‹iE»¢ŽHÔ~ÝöLö #ƒ‡ ´x9ù[jkoÕe Pˆ¢a@H”xïr²ôôd¾wêã#ï~¶¤ó3?烗ïÇçý;1îåëüxå¼Åºð?÷ ýÙ£þ§çoáø¥VÎ#àƒwoö!æÃÏÆF{ç_«ü[¥ÿ·ÿðë!Ïëÿ>wäOßøo¦"8'lúºè\i¢á;ñ$¡°CSΗSÓS…tf«H™èÇZºE<ôF,¬¨ns“„j“vBA?ù^%œ3ìäå4¥tS\ZëïÃ(<À+fùv0žÄî»Õ¬W‚¤­:¬s‡ôïÞýUE’›Š·ñŽÇÅc¤š:Ãc|Hÿü<*Ä/.ÕKÂÈ#|ý ¹Ë¯-BáUˆ™í^ª÷àËOrN=F‹Ðãú”œðó€þûÿ(ísG‘Ä™ý›q’Ÿ‰|öø¾OÕY,‚0ýH¿w=gnœki“Ìe+ÚŠ‘ø+÷÷Ò„ÕrÄñ8çÜ%JG‚ >½1x°mTUõ9ªSŠ÷Ülh¥5å‰$YŒí9“t’ã#I[>H*`f¢ª¨È<^Ö%$’¹OmŒ¾­j¬] +‘¾(÷¤kDº‚<$´Ðrû.Œ¹³¬ÚopU.'‹ãQ*d ýn«F  ¬„K΃çyo³ˆ\ÒYhnÿ¿­,F#®¯*D×õµ²Ê¡.%ôË…ýµÁíVã,ÀèmÛ¯ã÷î·–¨fÍ[d-›XgÆë—.DÜÁÄTT–[]V¹÷þÛíp¦x÷µ»k•p~ÐЙVIò6Û¢ø§^Ѐ„ÅãÆ¡){›µ¡0ªÞà6n#½ÜZ!?å4‘›Ó¥Ä]°-T×Kï¡¥]©þÝ^ðôÑÌlF(–ÊÞwü‚-[äʵڌF‹‡É–›÷ÒK¶Y [QnámÓíšqªW®jêãcç½Û;Nš|W|Im¼T)´ŒbÔ:"•"ˆç?TÕ<Æ‘¥S™ÿÍŠ ,ú“–C€pËÛÙDŒr“ùçí£œ ÔK£òà ¿¨üº®õµ´úWb]ÕÔ,+>„ÜQÔ+¶œ~¶ ¿ùM.Û"¿·Ínûšê’km£@–ÊZps½Ùæ¶<È!ÞVö° h6!}r“_l(Ï)Äð93Øáªê]Ç1—½ÍÓn›¸\ïÝÛhr{öÉœDSž68Nйb‡_œFPŒ;\ëpfÐÉ4#M±Bë.*"ñ:æïè;ÊlÁrõÄ£›Õ1ŽEÚžðW!n)L‹‚;K8èj›"b^RœYK“ÄUÙH¹ wëKYxŽ. Iñmœ…h¡Ad Wä§<’ÀQèX®ÄïEê|û{Ü¢+‡èŽ´m©àÙ¹ÇÝoQvÄ‚¬fÉ3!o´u¦¼—(•?¬œ©%Å0ˆLr©ú˜HÛü•úîÖÀ&þe7ùPðÂ#CSMcnþÛjŠ¡ô‡RZné’hv–˜}‰š;ÛÁBµÇNµI¡Ì³74½«sšäŒ§´V­q¯àÀÄﻄŒéòZp³‚¥‘ÓïPýHÛ•É‘#hƒç#,¢#™>¦Ÿu‘Œ-¦vüÌ­'8©ãèéiÚ<–ßU#™ªsª›’¯<ÖƒÙ-£Fô`¾úCÿŒ?OV_Ì ©ÇÙý‘ŽÛ£¾×yÖ’“¤ÎÑz:öœ­¤òÝÀ*a÷] { ÑoøÒ2Íô¿ªÁó0Ÿ•V“¨~¸b²aZ¦ûÔ7¡åÑUÓº6øŒÇìǪÏó {JróR‘©¾pªµFKðz/ŽÉáéÐoäð=·”Þß)&V†¬,b•f-Í@Î¾Šª¾ÅÃÕ(éšbÅAƉžì(PŒã©ÅëÓÆx?}¨áqú»}û‹{,gǹ†©—-¾Uü€©¡µ'ß&}RY„àµgx‘¦q^€:Ï´=†Šãû·å¡5úˆ9©yr‹SvÖ"5C¬=ãg” Y}÷ˆµ@ž‡p\O“,ÌCú=ÏiÄ(JùbÁ«îÂÞn‰<¼ñüå=©¨tÇ3wÎ#{ÍxÌYÏZr<‚OýoU¢7;öm4™¦ýã×Kà|·× WšÏ ;ùI»ÿaðSÕÿÌ”áçÉ?Ñ ¿˜·þ½&ù_)Õs¢ÿ«ŸÎ¿¢þÿo^áO þ³ƒˆe7äÅý ÷ÿë AŸŸ7wŽ&-Äõð|aëŒ:Ì$†çº’ˆØ´»©˜;ºúêÞª$»#y€LÕˆr­èH~ΤøOHL±±Ðú ÉÎo 0Ó}ç«„æ¡«“{ô·?ÖþGEH¨ÿY¡†²ê×*­/ŽÈ ø! ‚VRÂö;˜Ð»èÀë ï’sÏx…¯’äýVz[¦ ôiÕGÌêQÿÙ-e‡Þ-Ú'à´TÏÿQQ®9¤šÚ1Ϫ³­iWÁÚ°€YBþ}ëh9SÀâì>’az‹]L·¢ |û|L— È)]0Ô!\¶ÛÂB‰îæ±»+%¥Yá}®ßd¢¼®–b®tˆf{Þõ=çѬÕÏ”\ºµº\÷uR­úÝŽ—ž¯Ù§e±uµ8¦¯#7jÙA)Ûì ŸF %]+œîþÅq8U3Š,‹ì n‡oÕÓ"àaÚàa@cÛVB(Çè´0>ëªЭ¹FQÚZ.éÛ·7Ó $÷Ö´y9º„fYírŸªÂL¨e?º§Å"+@ÍÄòèàÃy%Vˆ{߯މÄR‘Ž_+M`,0`…mÜÜ»l¹ާ)°epcnx°Thb·qÉ‚fƒå# ÕÄ„×7íŸu0«=²ÙñR(€‘÷þv\‘ètlBÓ)/ÛŒ]ªŠ/§¨8Ïc9ß_°°›·åŠ& Kðݪê*/bƒÜ®`¶ŽŽG†-Ù¤xªÂ”•Øé°†Eþœ8»[0R—¨”ÌY]%VT7IœBîÛ‚­˜™6Ô'êpAŸUÐ(kE`}>zf R UaÜrÿX×7åR‰qû5ûè²¾¼í *&ÞÄá *‡Øxƒ¿À&¯!ÏlAæXëÂ?PØÞ®uª—5üµm•Ue‹¹r&¼D¶ñŽOážÇ6’”-ür°m D‚mÇ£Õ’Ú]&™[j\FARxÉÃßÝ·mê´ÄS ÚÌ-i›¼KŤ|óé=×7 VcC>nŒ"Ø`ô;› Çq/¤W!Y!ã‘Xd}¢ãv Ðååus½m„P•{»n¬~úÒHl@L…É(³ÎÀÇ5›À#Žo p».%¯~¶Ò‚Äîëñ}dÒ|¢»ý™/k¡'– Øð£i¸*Ë´îÃãû6oòO{—`­~ÖÛˆº4fw3ÝÙ®¸ÒÌ'þN][P'É™ïÔ½U`Ý+¬LôqÜ^‡+PBb«¥ØFQ(çš5÷™Ì²ÜüÁžãÈïW·× ¡@ËmÁæôûr$¹æ±»}þ®õõ"~À§Àó©5ÁGL ê2hG¥Ç«\FŒaxóžj*aœy^rU!™ÔÜktŒƒJo¶(©žªC‰o©…sìÓÇ ÕB_ +ÛL6”?ɇ…9¾œ:]ÓŠnUTPLöžÖËÄA]o%…­¶Ÿôö¬`Ãzoý b¹§$,ßLG¦K{›€Å´&g{邌7 ~<ö­:Ž8gÇððõƒ­=pC™›gH7‹ÌƒQ—/ #ízÈ}x´#3fsã ]õ7”SÔ­Æï‡–y4€ŽÐìi›Âü‰ðKƹ †¹EölÖ{ÍÞbž™UÀã37s˜0sPÙm§³ç-s¤…@…?ª)'¤ÖÍ6ó5ø¾90‡¹^Ž/Ò µäùJu*³iÀG÷>DÎbÖ¡Ÿ¾:šÀÓe¨Iœæa¹¯"/0‘—™Ö ²ŒšuÈÛ|?râ\Û©òhÆjžžÓƒ—.ð¥ÉcqÂï{gö°õ«á;-Óeÿ C¯”¯÷àÉ™yVï>~ßø62ÚS6>¬ë¥È ³?š)¢f`DË’‰}^èÒõñevÍOuL²‡¢|òM¶;£¿xÑzƒœáÝ7‚ig¦älnƒÂ¡C}RÉ‹SΩÁ½kQyÌlÖƒÄxã¼þÝï~Á8Ô¶À IDATýæ•ò‡SŒ+ÄÇHï—¯ä·êô„þ/ÿ½)€Ï3ÈËòó»ïìýHé·ñ ¾e4pÞuZKuÂp$‰ àªâ¢,Çü ²ƒÜ÷&¸« êÃÞå‚=–yV["‰†V÷M±HŠ®d>4¨4ª×%mGw¥±Žë8ç¤DñýD™Ù‚Nöc”ó(Î4M¶KR.ªõ\«­)Ïx—^V4¾ù>&¹.O…¿è0ùå…À7ÃÈ{¡\n›&ŽJssF?ePïUuß[4U `Æ•__‚ê½^ØI&Ü{‹ÈWýÛ<4…°£!r8Cûûb¹ÙÅ#%  ÏÓs9†ËÕûBÁ£L`Œ·‡¾ÿfm±Ò ËÚQ¾&©k‘f»ý-­äw/ªó:AþâQAüŽ_ ª²oÉ­ï%°u%YÕdE$Ñ6¬­\9è ˆz Ç÷øÄc›ªÍ¬mJ’Ðj†50Dàq ª¿åS º·Å,§PSŽq `f¡ÿÓ?SÇÎß,û¢pÇYŸd™Hë2œv_bïmK†ÌŠ+¯²ä6ìº&7ÍT¿VÎy ] ì¬ˆ‹Ç\ Iö=ÉC&ŽÉÞUgL© ߈¹¸6@uï7Êpx÷¶o_>m…ÞNùZñâ·ñ¾÷Þ¾_ëÒ¦sÌDˆU ?Ÿ0|ô´—àK§úW™ ”Ü·éå蛡­G•š›ÎÍuµ Èr‚.1&Ê 9ò,õZê| -[“\žA¡|ošÉZ¼óyŬŒ72=^-mË “ølY]Á(ÁéÚmoÔ‘}¢B‚ò­æ°_]˜76O9Ø2Òt½ñ†po®%i‡õÚÞ…eœ‚r%½Yºà׬³Z¬µe¥®õ#gžÿ\š+¼shÄéÂþØX°˜ïÆ¥‰˜Í¾myS\(ã°zœYr-½fìBŸèGV÷]eÆÉ!©>eòn]¢Òcn*êöÿÌñ°´ž M{·²–ëØèTÎeÈÎÅCC±ðgpÌΛžŸs:ïK|ŒÿzѪ³Òæ”4 †:F+c;dZF8 ãÕýÛ—âþQXâþþ|×&óäe9u"Í˰EUͪp·±þÃÌ>rÒ¡}–×ðhvô1Oû®íœx"ƒ'9m å3oå+DLTõŸÇH±ª¶wrŽ‘l :e ¯VUª¦6#Žg&Ôq×´¶‘JÖÚžcщ|„3]ÉíPó §YnËìxŒñ§‡Ýãª' ǨN°j8òÄ›¼Ý;Ù B{–”!!E…R.ìù0µ@0âJÍ€E34´ßùÌ왃¯Ô²±(JìéØ!·÷,Ý‹×-\ÜäBU5R)BQ€Ù,WžRìÝ>*; qfºžÇâÚ{%R›£áËåýYŠ-„ûE3è×…ki/°¡Ø—.ŠìífjRäÞ[±Â,‰nÉ­ºËJd'tFžA¥é°ŠæSµƒ×Àl/¦áއYr,b…Õá…ì…rQníÖ­áÔ†lŠ.¶ÓëØkÐK•óŒs“ƒ%ì3:‡[„"?šMd…ÈFÒ_ý寡٠›òåùæQÀâ?ní…gü†òl—ŠzF¦ l5ê êM¶®ôšÜ)Ò(_KEd n¨`'× V(F¶ •¶½üܼAGƒ›¿sV&ñ ȰÂv–Žß¹›ˆ—V“-HÌ^«Ùeò­ò¸AŒa*Ù1qþkö™m}^·R‹lÌy™uš;¦¾¼x¯RHò‚¾\ÕùºüþŽÆé2ƒfn!H†8˜Ïz@•¬µÄdKÅÆ4 Õ~ ©Bm›Cãýn²¨”`áçü^jt ˆÑ¶æ]”WY ²`¿hù£¡Tá¾3·!´i~Sˆ6dþ¨ÁôgfÆ0¸¼BÜä¨tÎìÎáž`E>¿½y–“r;·šìØR¤¬Ó.r D !‡·Ìé柳W̃ΘZ?Ôÿ‚°²‡j±ãƒÆîpÈ£ÈÛ˜ r'߯\‡4ÌëêÏgŽ7ðN¢k?š~Ê×ï°Ô®‘s©ÏwÑ‘¨¹`¼9ê‘!ªórwb4÷ð¡“'`8Ê È_AZÈÃ.ùlÐàèÝ8úˆå°–£¤ú±ÏFc9‚S?RPy^Eb’xÏ{˜3®:-œŽ—ϼ ñ#8þŒSMõc…¬0q7@c:ï nM›Œ<–”} sà‰s·*G‰ô!e4%Gy6”¾$ºÞýD¼½º^˜ÖÓýÉÔN¼*Ìüµè«/jÈÕâÿŒ@}>N^ /¬öøW¼;üšÿß7þ£3€W¡ÿ¡4ó—S—ÿÇÜ»­Y®Išn†êýŸv¦•„[_øäŠÈÌ]ê®ÖÌW-í±$˜›ý†çå±V£~ˆf8wt½ñGžÒ’ 8·©—×sã(gG£8¾?ÂÐ+jéTÄAXE¦VÁétèþÀ€Xô¿õþÔ„g£}íÐñœp¬®ÄÁ&Èä Á§…GÜ‹å/?J—õ«Ì±êÖÿUy¯å10˜’vTÊ’£DHÎÇØ_ä}ðÓðŸFT"ùŠg<_ÓÚ!úÿ1UX¸«!­8Èu=Å a›éP“møÇÛ¨V†Jz„AU5»ÉÓF1Ÿöx=ÒÊùÖàñÌbôÙõÆ-²ÝpÞN9êÊ;"f{C¯ÞSvÌ·1;ðúRNcA< Í ëƒàÜ&'݆B(Ô`þ"AÇ|FѨÙñ ZjBdg‘ÐeÝÄ3‡/(O>ÕœÝÃÌÀ9Ehì“«ö¼a8p+©Ž¿ŸZ‘]Cï«íÅäùl±à›ï-Ps §™±¿è¨É=¬l~ý0Èø—£6ˆ© Å—¾¹…¶m]‹Æ{¯¥¤,ƒ`)>fÇ‘©ÿuð‘2aÆZ+ŽAÑæ …^*» «ã¦ð€˜í ˜% ^ál88ªRËWÕ~î²KêlzyL:Ë»msûš¢oW®ˆR"pÅ™c0)/©8ýœÛ°Vú–“¥+L÷*yÖ¦@nðË?Œ%¨qêZ_Š_Ûx§X£èVÉ›×í¸"ïe¼ñL€ªB¾dQÌù¦0R)[bêa•.ZØ4¡ù?œ-P4ß?žM[^È ’¿È¯ˆY„Ühy4ÎE& y\éöJ^5óS/ün$¯^ˆjåÜ»pïØ=¬8vŸ ¹mÜYëƒ.ç6B„V¢U½]ö˜7pÁ©âKQ¼{Ò;N= bÆ•š-²(ÆåhíælFšN¥ÄˆlÚ¦ÑäZ^:áòŒEÍEÊÄk{ªm €Û/~f/oœ8wó…%KÉÍ"œ! ÚZË8KVD4ëw%oĽ͹s*à6Q(/€ l7}·ýž.uÍYm·‰¯3Ô=ì¤,_A0$èÕ4èÞ}°5Í+¡—iÜ“[ä¦#†ª›X"ÇV¢n7HG뀺;fâCrò+Ò£gµr ZJ¬Y~hK%—ïP÷M|OHY~š“"27Áœj}8ÙÝRò‚”U®C²å=ŒgÖâØásƒûEwmü!ݶŸò¹G Hç´œ&‘þ -3HÎш‰\lêÔч g{ýHm#‡E,Ò3[‰óªx,/ò¥ÓŠj(u%wÐÀÞÞú@ý Ýv¥D$æãøil¢Ó–ÖWPÖs³9æBÔ84º6¦Ú¢ Üì¥÷ׯ§ù>'žàaæÌ+·*?s×ÇÙ…¥v×V\æyö%tp´(tmô˜’é”Ù¯ì7ÓqÒßvÀú µ%q¼¯1v‹»ñìhõmççY‰û~yè¹EбóDŸ§çcÜqäj»ÓaÅKÜ Â_Gqd òX“ žZÕCàI¤‘Uh†€ÒÍì3Ò¨Û†Ìqç«úÍcÕîKÎ’& XïfÃøï/l ÔY¹SHQ´9Û¿hµCÖ®Òf™¼§*D™h7xI¤ùÆDðð+£:$jz+gL>_{ñŽàÏVéaÀâ¡ç ¿cRz2H{.Guð}šÃålý–)\y4è÷Ý,|Й?ª»ßüûÿ«|51?|Π€ØY0\2~ÍçÇ|šÝ 9¼¦lk;ÔèW?7(/üï7ÿß·ÕùÀÇ)ɬc•ÀüƒóÍŸëò¡ÖÙHF—Çt Ÿóáoìÿ‚ç\—ò²^Ë÷`›?TÿçX ,|ÿ;þ›ß? sþäÏ¿%d~¹ÿøBñ§/ý ô?óŸ7fåýyðgïÛiÍgÂOßfù/NZ_A€³úóA0&ϽN }ã¯Ç>P¯9s@Æ3YÞ¸«ÉJM4e_”Ößè9YSô¦º0¯€›C=)HB ¬±¹T‚#ts.åÐ0ÔÔî΄¾»Íj9Y£ÈN¿ñþÏs›’÷£Ãßesøi%Ï©ÓeéüŸõ˜Ž{ øÊ9â“wöË[p›ç3¡ß˜Ï»wÕðQyðézöÞË󡟊ḛ̀§ê”Rf›Dª5}?FET•XVèF[&IÅ*ß(¬@‡‹ÜÒbmA™ÅG¤Ù^ª•ûêãÔ²Æ,dd+º£)lØz˜ð³@4R7tŽÿÔªâ1î¿ sHìz)/Ž™iʹÒ5´þ6%GX=>ˆ¯¡Ñ÷)ÈÃ=_Œ¯ª¾•0t(W.TÄTÁ %xo™/š&h33n§uS°V^ç6§~éê’‚>à—ŧ½ yNÓ÷Ò :…ÁhüucëZ”k·ªÐ¨ïšužæŇèσ£f“¢˜˜j÷M'©ª “f†UË¡ó:eíÌáŒ?Y¼fq?޹àÎ]•Q”0#]Aó ûl–ôã5§*²ÏÀR]•'¿ÒÙeð ŽŸã?ë6{öömFÞ¿6Í —ˆ˜Ñ Ò<1ŽÖ‡? r…wT@Ü”KÔ¥+ÏlÁÞ–+ó)PÀá\‰ßÑ ý}ܺüË[PbgJ"÷5ûE[ð,X@&\D®SLU¶Èopÿ/ èN<\úƒ*0б?ñu/Uç€!ðÒ~3x„kQa*Û$ûrËÎ\`Ï•K°öÿ’ۘŠáçæöÄ—B¼è* ~]ýå®aŸTý‡‰¿0 €X¸´3à”Ë®ùź-ˆà6Q1(ÄDE/•›r4^vÌ“„¡ÀÝÇLýÙAšî>=D “,(¼½¬E\N§ÉmŒ Â-ø^þó© £ÙÎâQc|á.à[ð‹\‚èMšÄEÎN]ÊÜoq}ˆ˜ÙöÑïÙåçjˆ‘^”JÅ:úåd©:Æs:N6TÑÑúzZXÀwãªb‚2¢ÍkŒÞã!Y bŽ'bÜjK}<â߯_GP)@µ£+µJ\cð»¨ì(±J Èa±6 ÷¶•$||°-/€]&bÉL6É~!´@ÁÔø*v»2ª_cÿ”Oø9½Ï^õG†»;úZ6)Ã(d›ÁÆ·d!´O Ɔùš¼/ XZ>ö«×,vº¤¼°ŠX25£ÅÈ–¾hhÜùÚö@>µ–av8|Ðö’õP4>ÀÞi5;uV ¤ª ;JýïJƒx¤dj?ÁRýo0'gGUö„~ç+¥jG;OÃF†h㿬I–9”ˆEGÉrB,QèÔÔ äw4§¢.ݪ0PÚ6‡ÓªZW]ùH;S~@.>r/¾2ê¢u{vùÆoù`ÎÖC{øÈ\&?˪gÁᙋá;(~ò!f“ ã~lºšXt† Àž#Êøóò)¨ÿI1jÍoøilò Cà=‡9¦¾çç¯UÿvÃþàŸÔ`Lä>¾x>Ú]ÎÁÁgÇ6ùê¬þñ•â?!‘㟩ïø0âŸ%þ‰úÿŸôêÿ?êûÿúƬ}ØÂp¸•-‘›?¬à”•æWý¼•0›L‚ÒyPX8·Qúê½pfNop½”1l"¶¾³µI>ˆ½*¥Ë´š(:&¥!4z>U]>(óG†t>ña²ãˆ7]ùº]¦6‰zNžcx¿Š‡÷HeþÁW¯/8aq¯gÐaüÿõÿÍãg×?>Í&Þ¸©H?fQr³g%8äϰ³;žÍÆp¨P¥&{DuVö¢´yöVóÃ< Ë~a2|;ÙçÌú¦ë_ü›Ï‡ûãCT‹ä–½¸Ø›àpcë '„û ¦ŠöÔ$mõ”-và®Gì œáëAð|í8zºöû(§Š[Ö"{ï?Ä;µJó8\¯Ë€m>¨üè@‡h!cÇ•Â}1{ü]mpõP'y™´ª…uÌ·´6„–öœvÚAh ®{ žyZV!×2ÛÎaß·q‰o²x@(Ó&WfD-8$ï 0,uÁ²PËǸ×F¾e‹„¼!+¯m»))ûJã( º ñ}·%KZ áÕ)½¸®ü’ˆ¹‚EGH‰ÅK|šÉ[äþÚ•Uaüv7âí½cIñHlÑMÏ ¥ê—êmixµH,««{`qŠ–F€À¶?Þó1°-iïj&‹Ü»µÚ±p¿rs¤*—Š^WœçÔ|\¡ñ5ZîÊlN¦T à<ÁŠé¹sy4pÉÀu«qÛ=ˆ¤ìmu‰îÚɹå{¸¶+Ø„4Y¨V¯¨ì]øgº_j¥Š™Ñ­€ù.­èºIÀ2…Û¯)"_º7œ¸Åk©o'Ñm-žZŒ£.o]öñ˜Ñ$(}Éèœk¾J4{”K X¾°Xà¢,Ø»+ß$ÓÚJŠ(“^G÷6á*=»ôhëz'Â׈0¡'f²XFƒ”odƒe.ÊpˆÓ‡‚'Å’‰¿_žQ¥Xó¶‡sÄ•ä=Á2#C¨òÍe0ï‡ @<¸'-tNÕ+et¯óѹ ²²2ŧæÍáˆð((( ß„8{fÏJðÉ6ϰéö6ÉiÓª5Œšˆƒ„Y‡)žBÃÒ0­¦Œ%ר@œ‡Ãu¯YÏ1íx7~ù•6k2Ð,RTòÄZ§©=†ÇS²(t?[0g #ަ¢ä u T˜µ”ìùjÓ­s±óèH&´iö ptêB÷¡%íŽòNôŽŽ`6Þª#݌æ¾zñðÐpŽèì4º ï†ì9åзŽ×GXáÔ <ý/=+h&Ûø¯S¢úÀwZN!Ð/E]éÝÓ£ðVbèVhœŠŠHµ-Í ï*ŽJ~d²ü|žù0"vQqôL[#VÝÄsžïüÚàêò>06^œ·ºQ}]Nþ„¬¡«r1 Aýýv TÞœ©v.L'`}~”îS‹¯ÜtB]X_ÈXdjÐ=øˆ+^?2­†‡F2P7ݬÀê„¡Ž\ÞÊö(æMêkr£ÆP™GRç¥G£%NßÇT,I_]Í*¢'Æã]E‹ù¯€‡€#˜<ãAx0€b‘>~ŧdÁø8žÍç}•¡é¯a¬ä£›Ÿ]Û˜ÓÀctÉg0aŽÈ¾S›Þ_ËܪÇÌ¡dN ¿qÙóPÈf8Úwïð)uá=T¨˜ÉýG°ðŸÙïÙBè[sqžß*yøY>ÿ"Oþ8†ùÝOÀ7­cŽò÷cŠßaøóþ™ÿóÌü?[ÿ‹Ç`÷¼ˆDüþ Ão?ÛW¼ø`¯zmµH9dv¼%Ë%+Ô˜®þÁê'‰“O ñš…ðá¼öõ~Å]¾B/pNoƒóáíhºìtLÔ[Æ%2%XNFTUÀ‰µ9Ðü#uEïT;rÚÓ1yOnNe}P¦÷D™CSŸ#küÙT ?-MòÍ@ž¸ kÛVU¢¯K² T,þîCŸl~ >TQ=·U>£©êNò¿)‰”¼Ë÷“ÚlÚí]ò8¤ÎÆÉÓÓ,sÍýË(DbÄeY6÷¡ã°Ö“÷}ëRòœ/Úò]š›Kjm¶q: rS̶Fô~% ác=¶ÐijÃáùšãsüÜÙQILûÔiçŽdyƒ‘ IDATƒåÁÈý~Tß"—+\4.R¡¬ÑšŸ!]j3BÃ>еlÛi¨Ã&µ¨‘,Êsûد¡a–möJ›¢ÐŒË­ÙIœ y[3DXîÆ^µÄbŠb0˜†øEµ> IȰ´þd#dV(‹¸“ÈËüð%ؼoVYº¸;oÇè&®\èÒ¢Ç|…ϸÓÑGd™J«'’¼h·ËðºR´rŠƒóÞ)þ-÷6K/]¶Ž&wvŠó§H¨á”Þ5G\*KT v{Ãm¶S~1T× ˆ€™.%íÙzïN »]çØ¼åÞ"›vAä`¡l“¥Á6ÝFÛ7u-¥®0;m“%²·9袪Øf[ƒÆ‡ÿ±MgSûϼÿýë&íZkyÙB%šs#¿*}àÞ¶– ”¶“';ŸýßâR~¿Ž’¶¥Êƒ•u?§p’*ö¸7yå£cå@{xXG÷ Ï‰BøjÎÅY÷{SD–êu©Ñî_VÂ{o¿¯3 ¡Rœ]Ú¦¨Fk®îô{'µ ºuCÔG1 I>ˆçTÕëÂö~g@È_äêRk‰šÉ¶‚Sì¢ó·nP@Ö’ÛÀô8†H¼sƒ2§9FkÏ‚D}tã7Vï\e.ò¡¢®m޲7Ь $D|!„RLELô€–¿åíÜ ª¦ÐËߦÊbH•Ńªªk½ÌË~¥ˆñɇœÆ|Œ&â¾.þÚYìoÒ(ŠÛ·éÁŽDK>àC¿¥l³Ò-!d›3yD¼ÖTä–>èÇ-C Ѝdï'êå)- Ê{#[= ”¿eØO‹zà Ó7úKØÆ(;Õ ±ëò·¨¹86ÿ0ß¶>-Á‚ü›žŒÏbb’—}›€ê»Q‹ŽvKÅ»­ýãøZÿBøØ¶öc)™§LŸaúã}9SÚ,$ä6èpC¬98ŒIœ jÁ:Æ'm¥'# 4{¢%°Ô«Aoûºþ¨«ÈÓ!ìæ“d—AÕËÏsÌC›àá‰Ô¶”¬Çi–»«ÈžÞÌÖ×|Ûí*NU¿tb`]ÛÉgô{–M¾|˺̤¨S–âa[ÌKW}UaêÞéñr-}q‡ýgjœ&§cRP­=ïA‰!¶³ýõýèÂÑåÙ—Û¸ÂksyÁPI§0GÛ9g~œù-Ǧiºp{o[„õÃffE¸@•‘c;zB‚ÌZ`|T£üH8+òäAEÊŠdàœ=œÊõmíêtÅiçGu øeØÏÇsuƒøYšº•[àzD½_ÈL‘v!Á̸÷?F0 ä6ï\Îc©õ€ª$06~@?xÂÿ1u<’gQkW'ÚÔiÅ®fôÓ³6:mZÏ´c$}ú䨧eÁF ûGw¶·uá솱ì µ^óªÿÉ<®åb*•Dzzì µnÚà!í¢eõ¬uõKõSÉÆYæ|J€­ñ^¿vpdH™ÃÍòôZ¥Vx9ü~)£“~Î÷Þm¢Œ’â%5×ü*Õ @¼¶ð©Ÿ…ʺT"#fr,YCí.ÃDuOÿ<“H;äüAä1Ê –6YíÒ,dÓèþ!â9: + eú*qÞÛxjôFíœ8Œ¹ý9æëÁ?æø“Œÿð{õÿp!|-äHf¤álÔÂwÃŽ÷xæ…Ù^º+ó•*œÿSYû» „àš'ÿäWéCš<6' Sòbßÿ7üÿײ# óDý?B$B 7ÄçAΟ]WÅÌüÆŒ‰ÛóW­¹ÐiÞ6ð_CQ\¹Ö¨ ùûõÓâøÖ8#hGð´å<0IÒ‹r¶ç#g£ ‡[2z=ÛÝM6½ìU$rîÞ3öÑ€ÿt[c½òûËø/³ñh®`@ל´«µëxZÁñcÛÆÀÆÞÝÒß\\×77¨³ª®ÓXšâ¬…ïŸñÌ S\¿!³(q-H¯q<0Ÿ‡©·²¯*p1Þ}I9ÆvÆ¡]öÍ…nmuY‰ü÷HnÛ¥ yEè½í2“™5ƒ®9ª^;sWly; OäwŽÁÈL Ì n7Ú!á<µ‘GõøaÄ Æ¨gTÀ¥~ŠÜ¤e:©P“.¯ŸyìºTáÎHß}MÛ´Ò!Ml Â:ZŠãéQ‘îP 7Ù‡Ôð³èC®Ã!yÐBjF•múQ~x·È[š¡$u(šùY=·ËÔCÿÁ.w²àb¸!]–Bº$ç(äÁ{DV7ÑA:ÅXŽ@ˆ™¾Ï멊 VæÖãå×™s0–lWÙ}0ØFq:OÆM¡ávϦ³y%‹ÈÞff/ôo' ]íª‹^*"P‹aWú¶+š¶°² ÛÉÁŽùNÈrIݹ“u•Òö6Û;0_¶‹¶cÑ4»cºKÚm¥Q‚ïí×ÇÞ´Oµ&ž¸ÚF¬¸àï¾ä@1'´‹b])§¢^ð`>ÎsXhF‚²YÈð8˜PÈ ]z<†5v÷eÛÄ9²Ö7îè>w;sFê3#fË»Uyß›ê=°×"kY€Ê¥J·Ü4Q»}œb)ñ|Y–náMýKoSu8N·®¢„j5 Mµ.³2%D3vc*©0¡—Æ],9‹PÀk›"¢fॷ¦â œ¾DgvšWf ê‹’ô "²C—QšÜAHo4›5xÚ·3ª&ÛÌ»œ–³¹£.z¬ùÎÂõkÒÒ¡ê7ÄÒgm‡ý´ÆhÃdö<ä&f¸d;ˆ/èêÒ±+ ¶)tÄ?(‹ËoÓA×´S‚35‰I™\ciÓd*àÊÇ–Kv¨™X®…𕾷P¶@ENðÛX/Ä6HÖvÍ’%ÍšfP HI>¶üœ;C&Š%• ‹¤˜+òNýXн± „,þ4[)¾ª•zR²¦|ÆÏ1šÆÕc& ÿ ‡¤yi@šO,Ð7ô$*ÍHÀúàà4yfÓe·úÃÌàÏšBZOHÏ<ŽFW¨¯©üÿC¬@Ö„¶Ñ˜61.]ÿ I+ð(ÉL/+O\ÔëS-ûb‰ Ž€+î>“GüKeHr^œ[èš²mY£Ü×êµ¥^–êˆÔþQJÌ fûˆ(*6 8e÷ÚÝÿ{Þ(ºDd»úï#·¦þPÖ8ZL”ÚT>ЈÂ!³Wÿ‰Ô8:¹ÎÃ8Æéƒ2ƒN8MÙ§ sh;ͽxÌ ÔMÅ6Tc@âÕÊÓUß²N¯O7i '£–Ý&|(ý{k[ºqÂ4±¥œå§r ø€zd/D¹2êjfƒî1ªg5ða¸Y°¢N¡ó嵟›ºÚ'tðððÇŽ-Î{\3û­sÔð<úC¢ºDz`7"ŠŽÇ¹j{µ.gÅÎ=ÉIjçoçv³xÌKR¬˜Šr‰«lgôÜeÅ¥ãý,[Ôé±eùÆhÁhG¬?Ž\bõ«gX4zMêtèGÓ£s¹,ÿâ¨c5ÊáÃA7óYUýu’íXÓ Žv–Ø ÊPÏ)m_—ÊʳD W‰&úÇSh† Écޑǵ™;Á¸—½"îÙË:—+Žï.žšíq"b7«t±Ï4¶Ö£kx9åeÖûIC##·"PxàLñ$ó ›CKÈó«Ìèˉ†ÆÓØÎZœ“ê‡øt%?sc’ûÀhM@Ó`õ½ÛÚŸ£ƒW¶àSàáœÂ~[xúöÔçó tÌÞˆ|ÞŸÉùCÁ"fÄb:¯ð£ÿOÿšÃ|¬¯Vü¡ƒÿ¡-þTÀÙÛ&ûÒù6‘ëÏ®óógê?š{üͧÀÿDé?nù?- Ÿ¾¦ï*•ñÔüÙÞ…~û§qjL„¾Ôß«Y~Ôñ›âÇî×> *sZé'AÂà™a̓€ÆÉ{ièq ÑjÑž…¢™ì+žE‚O¢Ýé£a/9Ët¯`k(Õ€&ùh¬G‰V4!žë>Ǩ椖Ÿëþ÷Md½‘ÏÔ‘+x5Ÿ+æ{*†#/w”:ün5à§àOïê"@KÒÌ–êwÆ|?¸Ž‡ç3I†ðÇœàÌÝw £gUÀ+#Àszv}È3EÝm¦©Uª`“e³vt{PüA¤™º¬Hî-­¤^MŒŸ,Ge›QO@¾ãÍrßhœýAà4sY¬Zòçù5{>½L+aͪ¯]xS°O3 äA” “¢áš<ªC’é_-†‡MØ„Ú3wÐDÒ3œ¸Ãï†Úf¦]ãˆí™ö¦Å6,‰<êW¬E‰ešpU@ÕTôâhM…Õ`Ø¿:3«zŸâ|Iõ˜£$eS¶ñþe‘WÃCV‰©ƒ›£Wb¼¹)×k‰Ú 0/ìÀú;Õ'ÕY…ÜŒ£‚Í2vmZ yˆ¹ ÓQ&©+c¯qûZH4ݧ»½íBÜjF3á‚.¨|A"º/­Ý¶÷N>?Í 9¹¿ïMýrÞ=£´À?žk4 )ˆ*±±P1RécûZ •o÷ªkN Ku“&·RçRßD›ª“Ö͘á€g–…² õ{>²‘Ö;?oAÃõWkúö&Þ(Z+¨‘¿¶ «Q`•O]Áp³æ¢bEòp 6G:«;ã6ÜuŽqNV4ým&ÏÌ{f®x¤¤<ÝÒñ8·´ÊîÀüÌ:d˹è]Á~O—Uwø$›~¸”J3ƒ‘¢PÇNi jÕïš}Êè%g@:gêóNuÛ¬Ó43ކYxÐùô¨¨TH—6W¯+íƒâúW2ʶÈcÎQaÕäãY‹½xÏߓَvŽm[!E>kÚ ¥y¾d*D¢ÀF>ºÔ §k-,ÆÒAë¨*.Ÿéð%Ü].A‚†BÝk’‹éÜ¥FgÖµîæÊÄ%oŠ£dµžò9ÓÊ…T•"W‚eQI¬rQŽàc8~ש¸Ç~ìû <ÄqJ¢FHØÝ¢ÛJðBàîà&–aÀŒïL¦€gÞS —3Ñ¿F:¹\†TR‘Î<öÈÛÊs“š4Àƨà“‘ßä}ñÖrxܧú/œ˜~™>îÚ ×ï&ÉZ·þÌ o—ä”:N^ 5šia¯>QØÓ_à'2ÄˬuŠ1-¤1¡òGø2á÷ÿ¤íd4Évv*‚ñ‰<¶ÈÃÓ4£ë§t4¶ä\•'î¡ñ;ňÚÅ‹ÑÜäȪ=ã œ“‹U2¨ÈG+ú€Ï¶¢?;ÅíiUÁ¡f“À2AÉ¿,vD˜¹Øå®=ÅÚ4Ê rÎS±|£óÀ=­äŸ•hÿ‚#†;a¨}_ÃÄF=Í߃š…®>ƨm€{ËùUoœŠ×Sà8™îˆRL|.àÉuÀ÷Ò÷»¾“ —O|{d^þH–ç8VŽõU>èüS*«ñ•?ná‘CTÛúLeꡆðYHÑp·óbŽ…œÈx¢·Âý{]îw]»˜Éß\³ã¶#†U‡ÆPçq;ôóÿ^ÍÿK)þÛ°Ã_ðäÕ#ñIåççñ > ¯C>çèà÷×rÐ~"æðm©3¾¹Ì¾]”øùŠVý89»\‚âSªJšãûëI‚>xÕ›[gJk7¨ù¹Rh4˜íd @@ïÿîÅ€KµQ”‡Ä–§rÓ:­¥¶†Q Ëúÿ¹8NòœX¥õ6͉ÁLüûHšF¼yÖ_I¡1Ú`nÙS÷³* ´;Ú Žp–3€Æ”ÙÙDU»ŒªØÌøô³^jØ!˾˜6ÿÐØQgàq$°‡ý O§Lâ?ŽçtÓx%ðRhöçû&`ΜhJתº8Ä[¯3©X.rO\®ÞlLsÚø-Þî˜.Yøßn@[óùiÉ7šYd €I³¤›ûýÿ…×UÊ—/ ]*§ºê•äH"g®×ø+Ù¤›Gš:²àÝž’°Á‡¸¯‘›(ëzæa‹‹›Ónº½û_²Ð]Ê‘>z)¬«àiÞŽ;‹% ¯Íˆ$[úÆ4·ä+hb†´èq‹½ Õ~LdØ€\È»C ŽRqR{ÍM~y›lòÞ7ÁôO'F 7¢cŒE_~Áhuv$8=KB° PÙvå•ðK‘×lœÎÌ1/E¡Ò¶È:$¨ Òˆ6:gä)°–.÷ÏjpZêMá6¹”…´X—®¯+ò- œD1·õ/U/óp•ÖŒ¿îû6["_K×—#±%X¬•Ô¤Ñt6Dn1¡¨Òi±IÜÊ–„‘̹lÿ/ï^^CX«ýq›ýÚT•ËÓ‹ä&mo…P£%xAEM…áIEx‘ëk|î²S#²mi7NÑ×(+YgD4˜ ³g]w&QÝJy¡á¨4 ‚Z’€!ø˜» ³—¤OúŸVö]p`alr庺è=¾iE—îŒÄWjÆš²hòÐr¡;ž>§Fn'LŠÂ:´óq¼N¿rtþŒ‚Ÿœ\i/û,ž#FÐ?3 Î’ãü)nïDI®¯¾9¡Æ×ºìlBT†‹/k[P¢‡Éµï%-Xlù ;æ³9Ò6óaÄZ&Ì ‡!V™~ š“3üAgŒÑÎèD(Èz.]f›&ÛLR4áÉcVâ¦ãtЧr‚âÞÓ´þ|¦èb äØÒ2×5FyvâxbãàÑT¹ë$‘Öˆ¹J~XVwšùx qí ˜ƒæ3tXàý®åT˜µe°’‚¡ýÌÆ±—,ðždW“ dhM2:åfÔü=‚[_ ]Œ·PJ}9=ß1¥þïâ•äP=YoåA 1íµ“ÛÒÞCöú(rÍ&ãšA–‰Ã•ŸMŸÀ%”ú_š CgAv*xq¾˜”U0qGEæp½Ÿ ÿ¡•Φ[ÎáVº­´¹’ç”d:†ªBày‚Vt!·½žÓEÎ1íg‘§¢[Ndõ‘d×ùæ´êsyv7 MÌjðHÙÐõÿk¸â”¶6_ÄÑ>«öä»à(#9tÀÔ˜eåÌò‡Ìz Ù³^ñG27+VYî(‰Ís´< ê§)Ã_ï…6ï7EŠŸ”u~hŒs§FßCíÕC=½*îÊÓqupŠúš#ÈGúOVêÌÁéD¤Ý-œvˆÓŽL±œÊ£é á«Ù‹–¾³acä1í:Iü' ù˜Óù;´“ný±–ç}¤…'FÍúø‚ñeÊfןqå—4…‘1+ |ŽÝ™èXx±w¢6Hžqã‘Ä&6þQT'TÅ.1ÌGÅ©|65Ët§Æg5é(9È<Ç/òÊñ¥=uM|£ß¿ ¿°ðƒÊýÇZò þ($ëQÚÛw¾žš¿È‡8ØCbÃ;Ì€Ž²fðx^‡Á¥òÿ¬þû€×äGI_¿\/Ýßháÿ #þ_k÷“¥ÿ?ÑÀo´UÈùÄëÏ’=øÍ8á$ù›@Äp`àÓ$àq£ÇzΆÝ<ê=]ÀO×ký„X⑇!çG>÷J’ÍizE•`*2n—uoJÃÝÈÓ$=M¿BýäãÏ‘j®¸aYìÜkžÁh'Xc]ïï×ém³9ò•ʜóZ[Ò5Ätž53çfºlðýé{0ÔÇõ„ŸžC•O”¼:x]Pe¨Ií('TvûˆIêøª„‡ÄH˜•Iµ%B$¸ä9?ÖóÙøÍ2ãò?5ÅŽQÔz ÂÌ„Ih,‚_1]Y%°!¥¼ÿѵ¬?3òc HEŽHƒw^ ~Qͱ˜˜ÒÙßowã„VF/œÍPA_$zunÜYÎñmÖ¥°y`aý§R»s³¾ô®fÎíh]¥«¤þ'‰ãxš3ô 9“Y¯á?;÷Øv©<5r 4Gó”¤lG›|‰òÒ¼aã-ŠŸŸ$• ×Þ Äcú£öfïµ*ì”&çØøÙP¥"çÌ$s T¸©æeÍdÉ–L@A…M3Š;U"Ü€()g¶ºw w2Š Uxé¬?̱”FÛ&*:ù%=ìÞrߪ ]"÷¨ÄMx'œ!om¿%oRc%o‡°àpé ÙÁða¿¶ˆÊeIò(.ýŠSá¯}ç_Xø¦'n-Ì)ÜR±†{qÉd¹VŒG¯û‚¥k]ëëZ ÉG’!ú 竽ÖõnÜ0KjG×”ŒÕn ¼…¸~IÛ² ´û½MÔ´.òàÇJ—ó)P8X;°ÍÄÂ…%nó“k]ö¸m ®¥þ–táZ bò… ¬%›>TX UÅ%àŠ3Ø6ûußÛxo³kK¿â̶çASU¼¨YŃõÛmá·²/Þ&"Tºˆ$NTÀ=³ ²)¸G›ÈR‘-Ûh{êI/…±‹Ä2f‘­×R,Ûwá|Î!×ò‘(J±2ÊMRd3êÍ æ8;ˆ.bkºS¤øR‘µVNoŸíÒ ¿:I4“×SÔà°Žúl(¨Z à¶dÊ cäå­Ñ› ÷>,,ÒDÕ£>Wº wR¶ÎÊ~.Ä¡ÚÊèœt7ñˆ«Kq“œÍžçó•|H¬y(5´”†ìŽ^[nãöžácßEõ+jBòg—ì-¾ˆ^ú ­˜Ùõµ<ŽÑ¥„tiDßBÀ%å–¦KÞT :DÿŽÔ2ºÖ6¹VÉ ´:­[öÞÅœÁwÿÿím[Ƕֱ^‚j0eüQÔ­¤o ±ÆEÙCaSf­ÖqÊJmÍÁ‰…†—>jf!R¥ÏMë’‰DbÔsH—#{_À?ZÁ…gÚ óPïøã h™ÌŠÍkHkv›ce¤OØ7v²FŠ–Ï\¥˜ÎÑrÉú욟{,Z¡å/Gï}çáY´ÙÖÓı·úþäŽ+ÌñPôŽ2¾¤#âÓ‘q°3¯"Ym€1gõÂÅ«®>PØÙ{6 ¿Ý6£ÒéQ®6pï®­ïT> ;«ŽYÐûÞ.Sâ“ÎçAÐùäËÓ¤È\ѧ1¨e¢æœ±=ÌÝA€gÔr£ »e¸¡§¡=÷(oÒN€[þË˱E9Æ‚…¸ƒKÁŠæó޳,o~Ñ:Óy»%™ï¿ÆÎvœWþ8ÝÔQ uR½A"o_žÈ©–j€Ý‡îUÀùSÎNÁ«Z–ŽˆÅw 3”ÙcÝÄ¥oœÐ³…89å€XÊ‘©Ž‚«ö7‚™Û™ËxÚÙ³ë|´TyñPÕôþ¢ãz9ä<ƒ_à#?öY¾z"-Þcœ¹y<å9v;ı`féLw.ü\Ap Æûž-Ôõ œsîß+ãø>ð.zü³Ÿ¿úÇŸ~~þÑü§/áOfüN7ÿÏúý_!•ºäçE‰G.ä5,ø¶øù»Oêü¤ÿäJšÉ´GÞiŽp‚›ÚzÂ|B’ò'IuØ»Âà_–h¯…uZt—ü(¼j õhÀrÐþ»®Ûd)¢—dÕŒ{Pí/%šÓ!™Ü‰6Œ¢ì¯&™€`|^€Ž1À|ù–@壥擂eç Ÿ6øú<-ú¡0ø›Kû’g®XŠU±¦Cß°:8;$û²÷ùG¬ª* …qÆäv:>ŸÐÿ0€7Îf–„è<­—k¾|avg·²r¬43ѵXÎÐç¸Ü\0c£+*מ5¹y$ÈRéÙv…ò#‹uûúÀäÔfi%<ó3çÃ]2´™EY³2Ë»®WgÁgq¨oÒÎ3J®ªÞ|£ RBØ?û{!ßnã"°ÛvÆ£©‹™qùÆÈ¯°¼…ÞíæGÏR —¼›í·*ÌÜ»5 4U‚9;5Ù&´½]" O˜[\Ñèá䫪¨zÃ}“Ú½³;8¿èÑš¹á¦gÛŽ;[˜IÙb;pRœ·6æž×·#1Ç ·_,¿„‹X¡be—ÂpäÝeóú´Ô‘\ZÄ1á’ lbÊÖȪ¼WMé2gµ%MÊÉv³¼ßïxXˆ².˜ìmÀUàæ3,Hr#†.vb5ò7ö@Dµþ BùõïÛÌðKô_ëXŸÏ ™kÛ(šPN‹à§çjÚÂ7ý+¥ IDAT·gÖ+tõëë Ð¥ †ª ËüÚÓE1fO´/;Úæfô£]ÅZ 1ï7—-´ÍqOÇ:œÎ<bfÞ¢€yGA-‰¨¬…Käß`”š,Šé¦÷ŽþÙ%f¶¹ÝdìĨÉv .D-á¥"º¶lpÇ3\ãNÁ’í—³•Õ»?Pä_¢_×µm/èÖ½€/퉮Xv¼€`e8<úu¡¶w3 ,ýRÜ7+Îoú“,…÷&ÅTñKö»Y£O„öÎ bï&›3)9”íѱ›õU!&˃R 2줚G\öO?´³æ Üîð"ÉÛìò«ÀææµÕªŒŒÉzÞÁäNû¤—Z °²¦Øqœ‚ü1µ³wðáEe©fOx`Zw:ÍK!€µŠã£UÈ ï0uo²ùâ¹ÝôQþ'åK·Q®mì„®ÙY§çC#à™pg­”ÕÜ¿‰áßtjä¢*¸)K½ ÚMôp›ÛlÌ›ý¡°àm1½±2“›£#¨«)4“ûGè—zÔÇÝóÈC–® ãUØQÏÇúÎ<ϰA˜iî¦P6ü|]3?) £Í~r=<€ïX»8oáx¨Ò Ö¶W:•3”do§ÉKÀ0CàΘ›±Ø Ùé|aÚV­1±ôº)i7ªÔ’ƒŽa5$CYåe˜ ì¯cVegˆ˜F§VƒbºŒ‚Š„òÍÖG]Rï„àI«zXî Y–êÄYÐ̇ÝSÕ|öyV7Â5?=ì.À-ß…lì«‚„|›ÉZ*ä¨*áÓ[YñGÌ=g¼Äƒë{õ绡ìaðåTõf’!\‹“kßá©ÿ÷ožÉôsû^ÕžäÙ™5D¢6œVª^çdiÊÔ‡“°uny¨=ôÁQÌ[FíŒô`PnÇÇÞ ¸~âPùG" tÅÙ¢;+}GWœ°Ø[Q‚BNnw•tv£5*=¨éƒû’ p¨éÎ i—V´ØõGꚀý|Ñ©ê‡l£Kܪ>3¦y‹EØžOMóÑ8=m`äQxñ!d“bUë27N£Ä¸Îøä™Ä¤¬ML;.zÎIÇ‹œd¨úI¾ì„ni½’áß$Uî<ù>¡¸Ãñ³ßw&Ô3ysúÀûŽþô“h4¸kGGüké²ÇW7F”m ÿØ‘šÀx¢õÔtvâÍ’&y¶màÏEÔgQ›ŽÐ«’þ3Û–Õò“à<™>]©ü#Qö'õÿÙöƒvÜ*1Î"ßó©Å¾s]àa½D¶nnç9™} Åü(pããØð}úyø¬þÀõ¿¡ÙãµþøÕ?¾ŠÿÃÊÿÇOùMóc4 ª )ß~Í?x?$dø½Åÿ¯¦)s0—Ñ€†£1eV„õ2a…‰ Ac89ÜÕ±¿ˆÂ†ŠÖW¿ÿCì‚TaL3rÈíG}‡Â.øQ‚5ŸešïÃÈmPF*™‚ÑaY¸%/¢Ùíe ‰×ü«Ÿ½ôÚÜ’æ­–âû«”¯¯Éþ´<ƒŸ/ÒɹRïøEEº§øó‹ž±€¬FëTˆŠ*ÔiZò·÷ûZ”¼·Ïhòa/çPàchGôê ‹{×(®¹aFQ·d¢ôöt8§ñ(ðnµôž–‹Ç)¤·n8ï‘—°8Hd¥ ª˜«ßDeê1ÊFx4î8ºÁ2Pú‘¢èÖeé†ÌB9aÎô9÷b&L¾{å%¤¢Èß°ÇÒÌ“âÕC6Œ+J8CC tŸ—Ç:T_Ê›_7ØÁæî:¬—¡#&ã„oáhúòÒå&½Uƒô’kôÞ‰uÕ ( ž|Ôi¹²0úOT! Kdç¿s¥,(›Ûc›f&k©®+éAus„Š«FÃs*b{•J^Á™õ{åe^¯[–ªP}ÑÖ»©">Ò%Œ’\r`Ÿ $¸IÛP@±û×6£Ž3[ÂT[¡º“-ÛѶ™ÝòºÔÇJk-¥lì›¶²@ÕM£Æ×´Ì;•i0l Òé%–‡CÉ\ίAiÄe¤Q½u|sË^PàªÆš-ë†ç¥¡Ý”z¦¢+€Lƒ ð570Ü´/—BµÌÀ"„*.Ȗλ’›.m KUuÿ¥úÿóö c.1’f›üÊùtIkæê‚;ÞT°Ò§dÑF!—*/^ÿÆ/Ì Q´NÉëký—È ãZÿR¬/,Q&5€ê×µT Xÿ+VÐŒ!ׇœº®§Ô÷“ÝfœÖD]Ã}ÜWmi´ZMÌn¬joÌÌ]Ø"¢K3.¦ )`Qƒ\0rzóbh( _kærÒM‘¹{]_…¸wÌ¥CéÖêÜ[ÌäºfÜ®¨7%ÐZtA‡7ÉñÁnh‡÷úòÕí‹ê~ùü€ôÒâÔí½]÷žj>³ÂÝAþtY*{û>Ñœ}®ªÙ²¤>f÷—§*LŠ å™5*°Ñ+SÒöŽgoÖ4'¶›pY(žàŒª9X’tŠJWÿXNuSáº$¤u¥Ü ž:¹w¢¨H ¼GX´]ÜÈ>ð‰r]óæ+\ªFõ%NJ©XËG*hŸýcT#ÌœdU\}G虵b‘p£h½DYæÊWá]RÃQY“ ÏÃ"Z÷]5ê(9þ`'5=#K´y i,ð^ÐeZxæVfV¨²­ØR{ ö5·ùÁâÀäTL¿ÕºxÝA[ JpT;Úñ?­ê-)";Y*é‡=LÚ# ø¬‚¤YÙ£(h®Qq]°±+Z-Ó¸úÒßҋ QtæyáÊ5û‚þ—9{ä1Ü%©¶ øÄ3çˆGmd¦.~b³(ˇ<ƒ s ñ± øÐB@ŽÜ¹¤mí¨KÆsP¹œ>Åú¿;¾K&Ääës?½ÑTg‘ f<»Ž3NàÓT ÏaÏ’2Œ“ ÎSÂT¨B¹G÷äu>ðýlã2–dHž¸ÏÆòp,½£îQ1¤hNEê#/€@.·rFXé‚v1¿ƒãÈr3ó!Ñy=O¦xC´À‘¾Ž8;x½R·EÙàv–…V0ÒmL÷fc åõÔjçx&Ô Eæ:+3¬;•Ã4‰e>g’¦ý,Då9;@æYîrè§l”¹¦q4¸¦å¾£ÙæXµûÓ9ΙE׋!Gx‰d|V¤¼E>j^˜ðl¼å¨ø…ôŠV±Œ1nWÓÄG¢ÿ™núYåÓOãѧý\Ú^¯B*%ÀÐä›FÊ%) Î^¶Ú¿“«Ð-¦íïZ€¶ïÍvö¡ÇîeÁå{”Ñõ\Ÿm×øísÜh^üêÿÿ¥ö[ýy´Ä?ÿî¾Û±ü­ô/ï2Ý8øÈXüK<ÍøÈ;ÃïUZü<x ÿùL›ìß½3|w 56Õ|-0x¾­Âqöw?<Ð~ IÕ¬Ðf'Ðkkuh7HÀIMܺ€Â¥n!A5Ì{“0“î&è¼³,2òŒs|RÆB ‡Ž|p4}*¦ýšC16‚x bIÂ3ôó  ãOà‡+P?Q{¾_2ÞˆÿïFW? á’Сž5‰ã©Þ³Üy6Ô®|l9-Pˆ‘M{ªL", UïS¯ä³Ù=/"Žg²ÿyºP4†ï7ÈbNÙKbVÇL'2ÕhJj±/´¨ð@€¦SâÕ;_/ìž1¦Ï›VàU43>’è‡DËsgî-·:Ý'ݹúœœ›pØ€“GÛWÔ³äö1ùbÏÉò2W›wAŠÍ¿‡7´ v”=Ó ªª¸-o(¡¨™Üøƒ3¤#jÁh4–¸£@4=˜^ůj)à'ǃ–¼êÖ{,G¹'j(ߌ¥îS×euX»n#–1mÔ²Y&hKü-9ÒË|¤šÜά‚]ÀðílgƒÁ¨ÚÚ²þGŸ/¹}TàbªíY Á޹Ef„úñõB«ˆ ǶÒÛ\ƒb5»º¡ÜÔwÔ‘òɨž‡êœ#”;‘FîHÍzåìÛ=7–†R)xóp—ÉÃSLR[[k~aøÚà‘žé¶Ãèpt‡h#¤ùÝ’bãÇ Zv#¸iùêŸ ű3Q%‰Âô $k¿or—XIQ8+)çx’X¢ôõ„ÓN¸«€ÂSw:¬õ"n.“t÷±N‰#Ö‘ÿ_ôøe‰Ë'¦Ï¸¸œ™Óä. ²wX½P‡O•«ÊÂÞbÚõf*©]ÏJ‚-”?q!Þi"$ff<ÃØj †ve#ÊòYZ7êÚßÇè—9Ü%Åa9ѽ<*³Ñ|~„~€Ú†…¿z»ìI½±ôÔ1&H2>àWrïðòT0ôV`½øÑSÙfCk™“–—^¬Ó¯{ŸÆì/¿vÕGåy‰Ò¶›œLC1þ(6Îe-'ƒZWåqTáà¯ËD«Ck?öÁÚ[À<ýä'b:Y ’ã-Ìß Ì.M‚¥TŒ>í Ÿr…zªuó È6‚¸2jtW$ðåÖ5ÌRU±UàËžcE§XÞ*ªˆŒs*ãA™Lø×à¤+HÏ‚jV´W±z@„h£ZÈ&ÞFOW²P^=®ÕÍSºœñ£ê‰#»uà6žÓ#‘3¨Û+í@ÊØ¼78‡³<¢åÇŸxƱNÌÙ0/ä0Kð‰1-Øóµëï/Å2"þyw8ß 6,y«¾íÿ%÷ËåC1ªÈ£éùò£¤õþšŸPuôøúv²"‚ü€s:'§ý{¦v_Ï…ÿNc“2†ò›ÐÆç7ÿé“:”¾¿šžè7z4ÿèOþYþb6€Ÿ$û?WÿÿC¤Ÿ’'ÿÃ?!ž;WQÂO·ÞÌòœ(éOrÿO¯ö›ÀÏÿ íÜÔéMv€öfË#ðŠoë™pU¶¥þÇ£µÓwY6Gð«èÓ§Sù°U\CgEñTʇµb3a&:ÜýPr´˜PÙh¾lª›»•'"©ö™Qg盳ù1 g<fÇcã*çJ…Ë!å(K×O™€o®ÏwnßÿU~{½G@Z¾þ ùƇÒâEUÕL‡# ö3ÿ©21<Â#U0kßɵ)>«Óõ_3ØÃ®00v”Ÿßo(}ùð¶>J¼º)Ð…B½aâPÎã6lW<µ£®*|½Ógw’â: ͬ¨VØ<@äçX9r"Akˆ<³S46‘~ו]Ç&K:âǹoFyÖÊ…Ÿ†åùgbÉOÁ * *Ü–9yQ3/ØÞìÎy3×°ÐlR²*)0Ù¤èÒ:`‹ï?©½«òò½Èø÷ËÊ*ö¨ÍGAQ˜Ì}/­¹áX¡  ¹)ðŠâß¶m†E—¢a ÌÉOfp4ôe“­‹£À˜—‡.Ÿy†É¶á2nÅA\­kÕqK_ä&×¶^ZŒXqüìúå x¶2E’%.Un;â”.û[]O•1gÌi2¶¹iLØ„+êÆ Ù®‰*7 Ð¥U( ]ÊmfBÛT1SÊRƒËi«ê ,&kÛ,áh šÉ†©gnƒšÈµ¤…¶+FÓ¡Žé¹°¯äù(e#Ç!u—©²H3¹`Ú¬€¡ì9…¥2ºäüÿ/V<Yr Îö¡ M̲‰³ùÙrÀLêce|Á¡F®è•sÂí*¼-*ŶÿŸKeŽ]AQâöîˆA~Q¼JîWM<k]€È6“-*r[ÄÄöÞFÍ, ¶W^:~slšKâ¿áu!«Òx‹\9;üuS cPlØÞ[Eäª6Ž¥ ¡ËTºt ·a-§ÒíÍ]ZÒš£‡´Ý ȧyÇ㬥„a déÒ…ÿ‚üûWÖƒÏt•,Šf7€…G™¥¼ép±/@¡¢3Y—ÅÃf¥ û§Œ0¢áf´]ûÊ@ÛÞSì™%'™|ÜlÊEn¯T@uæJT¯˜P(«år81x‰ùXò‚Jå–Š™*"±*ªÞ—×1T¨‰”1ÉN'q”¯Ð°–8‹ÉУ¨ªA§‡&ƒ3‡©a®q| ï€ûPtáÞÔù´ç¯'2ÄdÞ‰¬J¬¥žŠHº¿B¨Û6‹_¢¿gë%•›Úzq0²Š;³$,ûÄÀŽV«ê·q¨²4ɇpZ XB­ “ätK÷¼3Z_+ÇJ1~;Ê jì-_)fÙU™fo³LéMCDúÇaƒ¯ìØVî®]™‡‡ÍÉöt¿ÃÃ)XVÛ¯q²"¸”“mfÁ„Šë5뽞Þì¶Á¤Ö£œl‘Si ·ú‡šã×´í׆yØÏtá'8аØ-“2Ð#ð+ÀØ VX"¢3¡ Uщ¬·#•c÷;çC„–ŽÃ´#~ô/JêȉÅ(ž &±óp¶—Å»èü'WvÀ›zWÏÓ=k³l²«êª–«øŒœE"$âqåûëÜ/³±™ó²5É™iHUÜ1Loxiˆ³‹rnYÝCpæ\u ÿ]ò2ÔAßÎ/Tl_åmt¦:O‘Ú÷͆qòÝ"J«ùIc4nò¨!áÑmjŒGx!ûËfSg×Ùçñ–ÖAg6ºµÊªù :sN¡ŒR)…µšÎ¼³NBÓðGöæ'%c"P»ŒµhÕ•­¹„ûÐÖsÃ5ž b1mNq¥[ú8Ê©Ÿ,Ì…™nØ–<&HÕs]±i)é3€ð£ôúu¢ê9æPƒŽóJñ ÿw6Ø·‡¶» ¥!2| ù2J]æ ±èv”#ƒ÷Ç@žÐ >lìì¶Œ÷óFLð­4ç.ÖƒÄxzñùqàˆ8Õ¬1dÝ(|̬ô{¢Ï¹YàØùþ"{ ¹ù}•Nà£Î47'|Øù»ÓxüõÑñ ùPaò’>t×?²Í4Œ~É:ì‡+vÆæ¾ üÈ ÂOòðdJ<¾¯üÅß9ýJ.üô"õëø||¶ü»¿ŒEs|?,xp\‘ßbàp?/7þ“÷}^?ÁÂÎ1¬4-÷“C¹…/¶çõ“ïJ‹&ÔÉù(t+Ò¡«Z‘LWɧWÌ<üªJAF1 f²4wI6VMƒû<˜µì¥ç¡ö#G('vQG_.“à¡í³À‡êš±o’Ñ+¯SÒ®¤Ÿ—>1>ÆCðÓXü—ø]丯׉æ?ΓÁ ’êä3Œ $ê Ó-KÕ·öìHg;Á—ÆÑwºvå,ÖPO¼˜9Q+YÙÐmìõíÍQ~ ©:÷FtVz|>.O¡Þ(c€0«ÐÂKSƒŒ8…¨ªüûVì×a«;ØÛ ‹vžŽnA,2xíL:J÷aØ“+eAlb…âßo#[ý¬îàÑ#ëÔj$!ªÃ Œ|…Ë#âà#núv–:õÀÛÃ鯗†åƒ‘DreÒgųÖe6Q¤Vƽù"->‰c“Šìš’ušîë]†¿V¼{ ¹f›fÞÉÛ}májë {Å,„Û(P]Vú€¦w‹ÓsV)¸_Ù†²oSÌO㤛s§Ì¤"=ÂFbsþeÇàÛ‡O,Œ®óPÛÅÖú/<'Á¨kœ‡¥î0bA±o#p¯€´|}]KÕR½õ‘²Ùõ\yX´m ™Ì b[4Š¡§ ê£'UMí=ý\}l2šW)[ËÔ§È'KÔ¯ó”ýá$qoO5Ä¥éu²Êb×æÝ±e«¨[„7Ù–m”uù Yä׿?Ÿ·±lA~/šR¤Rr\ÜbB÷vÂ(1ºsBá½÷×Z„>sÄ;7·Ë«"RŠÆ’/,|-ro«G)z9áA–ÕUî€,xe(·q XjÙ&¼! r-Ék%Sí—;4Úq#ð´¸DýúÒäû«²²÷åPpsµ‹»_%Á;(] *Æ­$·m†W1#1”åjð@º{ CV‘ üR¿D¨ª¶WK[.|¸2, îÏS¶„t_Bæ/Ù0¬ØGmÊÙ¯g"#e»w?¸åUAOÒT¯Š-br¸ƒ»%¦âTýtõƒ¢C23NC^†,ÁíßE~4}ß;SWŒ@›ÿ^t«æcI²ÈCÇ:FŠbìEpPSˆ6 L¬0”‡LQ0>fªBÓÌ©”×û†¶»&·×“ÿr±+KúQ% Ò`zd§ˆ//qätMàœ™²`G¿iFßëT |öøp—MX²¨%ejì{FóÄ^ýþŒK<ï⨮HkC aœ6†ªH Á'¯d ‘)9t^TÊ&ò°×{üù˜‰xGEÞÛ1º°H0qÍYБÃTÙö’€OÕ¦Ó–`Tœ"73\ÉÞkëQ…ê™øÆdOÒôaDön’£êÕ«lÔg gºøtŒÚZYx1ãC™ø8vá @±Ü;“Uc%ˆv5d¸+*,Ž·ã¬èézkÿ@RMîX<3º©•³àöLªf‡§…Ef£N¶o=Óã \熇Aªi+Ò½Õ~n=pìÒq*Š8M€,+÷d†¸KuP)ê p(Θõ’S¥ÇÑÇÁ Uµñ-±Ñzl_0g1ýûÇôÇ̦ ãÇ;­vT™Çp û‘-›ªòyQ‰(F¶G+&sÖI|bTÚ‡{¬fã ÃŽßµ&ù®|_ vª[µç‘’kÃVA#K;{nQÚfZŒ”uiëÍÔ<ìå£ÊñÈA_¾_I§‹;yÞ£x£›}ù­=pÊêQÝÓ“VÎ`zdU++?bþ¬M^Å`²¾ƒ¯ßR¿*è˜/?_ðgæÍÙc4ø°J.ð%ëõãM>~hÛçÿƒÌ†Ø‡ÛläCð]r ߪ}èIL_öÉ7Þ×ãKƒÆËÀŸsòœàm~}Ôe>ÒügŽmÎNp|«$ŸêÙq:òÇ÷ÄáÄ#àãsß ?”kbÐBžÅÈœ´”çO{1`¾yòø||uüÞºÿRùIÜLJÑñ;ƒ?NŠúïm}•ÿélá¿D˜¡ôÓèêùïð—S–cUÀÝ]865ø0!u¹šûÒò¬{E‘õjŸz„YW£ÈB€™‹óÍ}œn"Œèä *øš©”išÞ|c—•ÞÝÃá Whcf¤ÃêñëØ~@û”(/< €¾Dj¦üå&ÝU@¼Q5U ò׎çRö³ñÿ»y>Öf” ?Çtp¥êûˆÿýOŠ'”¾2•kÖ=ñ°Ô4%kȘœÊíqÓúIxéÁ,ôoóy46ؘ îÍFî¡_£™h•^ÔF(ŽàP-J`˜¡\u.ë÷{èË`iÒËi4è,@–GÁ%e÷Rò\ØåÑûï. ̓mR¨*µ^µç–=m„Åñ_ãkuþ´*²ù/oJ PŠ‹vNoºë3!€²¾Öô‚B1‹ÆIŒÆAGÑ%šq¹Úa=’qÑÇBÇa¢Ì“ÆG˜Û·-.‰yÉ£ ~÷ê-£}šîÕë9i&t uþ2ƒ“Ö¯JO´ð ñú\ª@h¼7E°…DþöÖ9µ =K#›¢tö5_[Fð몖‰˜ÍvDLÃ\vf÷ÇbfF]¯¹WêÎz펺ZžÀø¤Q–ç14ê5¢9у€ ]ÛS+Ïa~É"w¿!öË)r]*Ðýë×§šø'|ØÈa{ªXy¬¬qWŒÞLÖʘŠ' 6ôV𬢠Ç9‚•_¶!*”mrA ²-ÉY§YlûhŽTªF9AÛ´péJéh²/Ì(›;ܱܠ“… 8Ä®_”Ôã5æ}!ZðÞ¶V\¢K¸Mbðæ‰û(z¸MN¸ϨÒ}Û¶ c¸YTÖ9Î,ròí³0×j™¯'í¶_ˆµ=:ƒŽ'’õ)Žý³dÜLd‰m{˜@ ²1áÞ1¸åþ’ K¹€_&–š¾s´>æ‚lÃ%æ0~Q'ÆQWT„ ŸRŠzôã¦è6là Ym‹ý‹ðÑ ‚wK3ÞfbQ™ GÏn¤‡Ù/õ^œ..Ëd -&kT˜¶ÈmÄ#‡Gó/7„¨ÊÿÏ6çùL€w4-¸õ;DHSE¿ÀÃÚEèQ¥œu8~¶ÎI IDATGpìÉ1Íé¼”ù؉dD>7MSÞn7f„G‹ÓûFÿ°ü¹gFå U >Öp'ß’IïjBŸÿuA—¯ŒñÛý®/1/OnÐNdE§qŒ{Ëu‰(`^S:«“ùmîÉ©\]Tðå¤/‘~Nã}™±fqtAC,Šr9›~ó9ïpÀü¡• „öÙƒìŸ{Ö.«ÌÆÌ5c´ב[˜Ó,\´ vio‹#Æ])¤ó¨üÆĉÛEÙJ§C™Í·¯eð®X”£6é ýá$¼V(iä3öτܹü»Dt±ÑîCz*Sj•i‹¥»úåË&=É ¡}×ôÅ]ÆJ¬·É“˜¹†Î£çXæpÖ&‚èQ˜Sºiw©jH½¤mSCy}ש Í(½äÇ Jªÿñé!qpŽHò•Ê|¦NÜyÿÏa?î÷­Ô‡‚…éüp•‡°(G)@1x'†‡§Ê<ÆpmRqðaÅ Žõ€É†»…#IŽ p ±qÛ'u°æpIåÛ>ºÏcl“Ÿb'g˜½6EhºNRanÞUÖ9w¨oKû…p|ç™°.ûö~×Z¨y‘¢sg›P„´ú¶ ç@¯0â³ ò{Ò;‡<ë0JýíÎjuò¡–Ó~h,*ÏÙú4'iæâ,Ÿˆ%–2•–@B«*'Ì;¸Èóà[Ë+{òQƒ†‡ý|à*ªõ¸ê«¾Ô”??³PÚbÞãpºñ>Öí‚"îsõI§ÿIÌÏv÷Ÿrü^¶~é—‰Pþ½|‚1þÊ÷ÿT&©ùùùaíøUÿ>‡ôâT ÛÄï# ÞŸþB=¿_³Dn4’Vþz†7Sø¬&_ {šEõ¬l·,ö ßa›qBT4z!!fòµâ×z`–ðÛ¹¢2ËáÍçþGhÖ£«´ÑÑk+X‡ ”±¦ÜFNšu-ê·±Š©«=#˜¬ØÙˆô©eßæ:>†’¾«ÿýèúÇoVe^ÉK@)]꽄ÕcÏOÅs-á9ùfgE—Ãg©ªN-`Á&Ù]p)GÖ´‚Ñ¿¨˜ÕW eùµ±C|ÿ;y†+<„‹›i˜/ZïÃURéÚ.äÈ!_dâ©ã’üòcJ„©ƒóÒ[ÝøiggÌÈMlxNe–úŽãCåpìA:þYê¶@KÑŠûÊÌT5$M;èEþæ‚€KEÄrr'mûà'öž‘Ú^fWD£†óKbw<÷þ /¨åá0=)”¤›VÃæ@r`×5Í*P(eXHWt¹U98E>=”`ç©\Všje×öW‘8…”mæØì˜0-•¢6Cäê4eI×:6¹ µÑ¶«m)„‚ð‡x†¼soËÞ¦K‡Áuç‘аl™¹åÔß u§í¤Æ{ù1Á(¶w;)¤7Í¢š‰U¨ 3ÚM¡¹^Y[óͶbgû¾ï­]** +`î˜C¾q*ÎŒ3ÐDó»“&;0÷Þô”.þ{o1¨.F=ƒÝÛGrecmõÒmÂ5"ÛÛ\þs«ªŸ‚Ìú!Õ•˜oÙ¶.Ô,ôpÓÌëç-ê¦PþoâÞtÉrIÒ55Ðë¾ÿÛÞI'L燭 {D-"“-Ý]•™á~ÔT?õ8…ƒù9žŒ~ã¨âZ꟞Æä„Ý7 LÅצ>,¦[ÚX©4Ò¸mïï]Õ¢Ü,¡BEäÛn»cÑ¿÷òÊ÷` [¸ìþÞÞö,"üÊ….ºÍÂU¬‹Ïq]àNÈZb‡ÓW¾ò­—Ù }tèé/ ui”úæx?ÝܾJ€7ymŠÊ—*—‰ˆ™ý#ò%”è±ðŽ\Îw¹o!tGÑŒ¾y£Éö‚]ÿ¶ KÅ6˜K¸ÕÌ­KLR‚¥!GTŸñ®™Ï‡È-ñ9#¡U4˜Ð»4D¸ÒKÛ9G&•^¶ä¼}ñqgô—»'là¢I:ðŽò „œ€0T#.²E} *©)º‚³é7ûšÖ2Ûæ== .±„¾Œ7€qM¸S\,…S•l™ö &FûFÙ·¬ef3Ñ¥ ÝÜN26êEb©×,2°±”˜K¼½Ë ½lË »–öüçª9ä<ðŸNÖʇ)»m-\þÑÇÀ˜BÇmÈ5ÁÏ·ðs7¥§O«ÞÉ“ô™md*Ÿy U-œ“Òçóv´A¶ç&¤ƒÈ¡€ýô«(á‰Ã(B° ÌI9ÏcA«K¯‚šjk:î ”èÕÓÙ’ˆŽÔÔ5í§©J1ðÛUŽGN;FeµRÆO1·«g1S¨¼@š[Eõ@PµôK ?zL>3i34þ4ºY2cœýÿÌçb»¶ÛÁ(Y4Ã!ý¥ 5îU¯¨¡c×bÛªUÞ;ÂÔy¾ê$õÓ´£d*åNz:»6»Ç`Æó…_#ׯýiÓS áÐlêÎD’çpºÝ\ÛT»_þ³ð!±?ëeKuäa4à :å[PÆŒ‰3†àU.T©éÇQ¢Û¢X|w QÏÿdÌ"åI©QÀA=󈇥 Â## ˆj…®ÔƘ‚óUË!ÝÆ_™Ž´Bv䢨äÙ–’&F…/¤Š­ÙXÎ|?«!q=ñ˜ÕÉOmg§Âÿ8ÍlÆ£†‡X ­æÅy¦°<µž~Þ Êùh{¡ã¤Úv°FeëNFe€3#‡PÞY(ð8ö&¡<•2x;RÕ yoq¬¬z¨]ü@Ri%&ÿnˆ²nÑ~Qz¢æ—Hz¥N'-§þaS‰-wàËî[î=:‘ Ÿž78ÅX|òˆËX¢ãAçQó 9˜ÄVì\5mŽÊð~–‘Pùþèg>«¢ùäc?ÇÕ|,¤! rÔ]‹>Ô×ΗiÁ+‹¦oWù\øiÒ€g$ñÓó|+µgŨŽ}ðBþ.'ÁÆÀïéŠ?zö?û÷'vÀ>Ëxßho¿ý1 cGõ?QÜÿ þã“–þw9ƒÿ( ðÙâyeå‡2€,þ· ÏJúøŠñG0Ο™KXyó"r¥Å€F3­áp X±¾–?üB /ý%` Ö3Q—d["ŸÏLÉDÂ8U¸ç•BµpîÕR ¬ah‰Œ´<9xλ³0€°lP*¿ÿ¸Ê8 0¼ï6Äý¢ qíÞfü ῆ[Õÿw–ÿA†"r!ù#<­/µË}¥›æˆÂƒÝ÷Ë}²d‡°ëËa¬ Ùbø˜|3Î&•¦ÐhxÕ=A])}!¸^ ȰQ†ÎŸBZ3XÜŸ›Õ¦iMÏ d·‚¹XkC~­Fvõå1L˸ŸÇm¡êJoyÆfˆ«³£ ¬ý{[O§ǼTclƽãjôkOÏEU°¬;Šó¢9tù$ÌÆrTÐfL!U 0QHcËæñ ”r’‡º=Ocx2'¡ùF¸\Ö7ΰ%„.j¦.¢c¢…)¼,£E@#™%œ½‹i;»Mµ—,^¶”¸ FYÓ5Ð&O/¤'"´ÛlûÜKÃèÌìª3f‰q0’洞ؾìÎ襃݉(7œ/¦ñ£[lw]æß®}õ½“ìxÛ6/eÀR]€`0Û(‡¥PȶöÔ TeE²Üm›Ú÷Þ€^Õ-j²åöÕçûZ—†"»hÂ%ð.YÙ^ rßÉмÁÇ5xY37¹Chóñ[Šp†*WÅ¥¢†à¼\n3x /Ê<{É D•Gì¦K)Œ²jR'5á4ÛÞͱ÷Þ¶Ýî-nG°ñûÚ´­ãí0%¹m=Kö!J£l3³žÂÜÄ ¹Þrû&«Õ ËSÄBê„ÜE=…6ŸˆËàK*$¾…0]Þ›‰4Öô…t;‚ó¨n˜š©Be š„åž@3¡lÞ(wÅŒõ<£ðÌ•è‘O´ Lô‚x³CÞì›PUD3'a,R¸ŽqZ+y‰{˜>/áöŠn¥F‚ fv‹|-¨y„kñÿ¿ïèäNP„qúãüdÀÊØ _Á)áþmÀÒ )™/‹ÇÍµà•¦=¼w™Ò˜D"lÙ>ÈÄ*mÒSžK"-¡ØN>F²0Ôÿpͳª3/å"úòU]Ãk;ä«Åe¢vð¢Æ0çÉZP¹KŒÆ˜©ŧ 4Rm/Ñum[ ‡ßêjIò ƒÕu¬JQt¼p•J)ø,Â>b1–²'Á‹u™‘ÜS•x$$¶ß ²pÕÝÔ^žØR€Û£ç1kyäÖx`{×à)žðˆ™ƒ˜ãžÿ°¤Âèt(uDÓÉË»û &Gšmä÷ß^^ƒ˜ûáêº:!ûD8@Ðì×pÎRæãsŽÔPÎmÉÊ2²Ì°È&5#Sæ®"xÁ¹Š˜d|ÙèÌÄ€ÚQ6Ú‘€3n:{0LéÀ 5‘"£$ºç- *qEY¢h Ôé.W8+ æt$Þ‚=}Y¸qÌéNéhƒ–±¹"|™‡†Ô„â[nû‡®z2È¥ÝÉì$ÎáND5;ª\‡•?Y¢à+§ÍÓÞVæÑNn¥09v¨nÚ˜ c€`ÛÕ¶j´ÌWÝ»/Ö]1Nh|N†Ÿ<ìüe¹OŠ&Æyk’é›#fUZ°â”ì!P¡hr8»Ù£×WôÈkõº0‹AòjL¦iç_Ñ~!+³~Ϋ¥‡PhÙk šãdXGùlKqî¥dCבêAJ?ÊC~D9æF9G=­ÂòfÀ±ñÃîù·Ü-]“R»÷g“GiHód©@üŒ¨â¡<¤-d«ÊTÓñ û¿GLvL/–KyõÓrø¯¬Ì˜ÊKÃG¡”2›(«áݧAüäî%oTf«Á™2ày¹ô‡ ù¼hð%ÓiúøjÏÚòYÄ~êó/ü«UïYḟé? ©#êÃÙ„SÐü·àÅG âÙWq2©ò&>è0îc•œC"§lüž“Ìræ?4z>ƒj˜±$üüùòÏÊ=>©oPžñ– ù‹L=·Öó'¨¶j@e}.[çr&LŽ]úû ðP·C+êQ‡„8ŠÖôÓÓ»Ûš› YŠl÷eÁT²ñ 6êef©‚3«™ùGõµX`WM4q:˜e›‰˜×&æ7sô>^ŽR¸ž”øÔåã(çÖô°ª²€¸·Û6E¸·9ˆ?—³ã)_›©Ø4«jZáÎ¥b»º“»]ƒÓmf̪Ðý–*ËÕÖ8þü¼4Ú¶}Û¾+=¨õ~¢¶÷£kUENK¤‡ Î@0=Μ#>6:;tf†!Óa7¹·Ý¶/@E·S¯n×WD—ƾá" ZŽ˜ºZX[.v±Á9Ì NªÄ$_šÙþ¾ÍŒ€Ç“â‚ÚÆ½MD.ˆQ޽ê®Æ`$œènÄ5±¥XUˆïŽ!%Éå_}´#T]âÑO žÙ¤83ù”H"Ûÿë•vì> øRÆÛDE°`»{ 1£æóp‰ætÜÒ³TU„ÿ‚þ2º_ܹ-›´{›ÈrP~ÖšÑ6¡1ûŠ–g‰a* ¢Ð¢†Ð¯TÒ×ÅtœºøÚB±…µÀ,šP•åR]PP.Õµ.¯n¢õ—dô¹UU£¤W[!!ƒ]£à®µ0šímFUU]KtcCl›ÁrHæ(÷\\(i4 æ,8Š7œþr9HçÒ6,y¦ÀNÞ'Åû“-¢ñÀ3p‰W.Sh \uKÖS]¯Q1^Êm·uçò1E€j„·Â½ÍD.…BKEd{4gL‰M·˜˜m+Å'`ýé=ÓÀùâà³ P¹›ëKkELÙb‰p-µ\¿ÝÄëÛÂÐ.­ºBQçKSdŽû¾÷Ê¢*ûÃm¡]úâ/&ôeî-{r0ÅÊ™«ì‰õ‘,6<9¶«äÃC+Ieµì“’"& Ûʢ벷… ¾òëS0MäYbÛ]Ø1Kâˆ\Ö½.E¯ÒFcÓBb*Ó54Ì£|1X+ÛÆ€óE»T JªZÕx*¼ ƶÇf$ëYˆs=ŽEjÚa¨†c¡ ïÜZúÒ`)Ñ%ØÊ sF´ÏNÐIßúaDsø"3/³n ÊÎ\ -”Û²ƒŸ…Êšúd"¬÷_{üØ1U;Âh€ŽoËú0™|‚¼–†®³q$vù”δJ^‘MðÀèÝ-1Ô·ç&£-¡¯¹™Sçpr¹Ã=Ó’5å’åç ŽË«´5q*`K´L_|>ŽÑñ6£Ö‰ïØ ~jcÌ=d@«aµå5°þ´µÔ;ÍSuÚ̆øÔSᄚ…Ùãç˜È©Ã;ìž;ïÑ#"öjå¤ô÷>„A[—T Š¥w]L6>CãhÒçû~õ/,#Km7£ó¢m>”¹K‰ë[‰iÂÏÄ”DX /;˜w"+Ž M–?u¨¢ïÇ*Å É›KKlîmÊÅñ0Ä)åƒoñÑ0 HD;ÌÕÑÁ+§úWI.‡àÙüû(RèZn¾ˆÕã¨Ånÿöï]$§´Õÿ=ª×ñI×y8OÄ×çòRà×ÇìxP>+°¾–i‘ÒøŠòzp>r‡ýªæû}Qø Ú°¿Bò˜™¼¨|Èü§ã©½éwï ø˜\ÈNÓQD}8&†tò7P BêQöpRÀN¾§,ÎH'[é{c‰c v-‚Ô¦ ¾<ÞÇg?޼ÇÖá¥î÷ý%ëþ§~wüAiÆaü<¿ÄŸ~§âw¨<~šT|z1<5’ÿÿõŸ?AM îâðÝÿ›:)>)ñüwþ8yёϿJÞ/þô½aSóv­Û¥gñC±ûçhß¶÷.g.,«R 1ÒÌââ2«"¹|çËú³íÿ֤Èz!ñ[Âcž–¢†‘Ûã¥"¤Üûþç{ D¯åˆ¬t¸Ë•?q GŸÙ¦@LMñxüQ»ë] ­29¢.®ýoï~N·E0Ý×C£#]€­´¢mÂ}]:#N)g…ËX5¬Çæ†Ûè_fQÝæGq³®XAHhKàžþ•<^_™µŠ"DTÖµxoÞž ôKbJ°Æœò @=ñ¡K‚Ñä']ëÿÓ%"ßvÓÆù:±&ºbòâVÞ-¼‚ð ,¨ ·©{—+³s .U,•m¨ ÙíÅÈ[äJñ¨úØVD±¯ø’•Gñ0¡¤ݧ,U33ñzl ’ª*B•öÎò±e®8«®%;"^†„…k}ó;1€t¼Õ÷·#b* ·D£(l€“Â:ÒDÜ!QÙr”-5&âÞ¦«a[Üd^œkèF!l¥é»ùûâ…í¢ø'ÞR˜B¶ÙæVÊ?·\ëÚf®¡\¢æ}Nb·×Sì#ƒä-¹ÎKQø”Y…bº÷¦Ý&àÊ*–êm;(Y… ×r7·(AF¸xÒ-ô+bØ02Ú›Û‚Ò¡0Ytª GÔØ[¤6ôT3.nå¶ ²?” †iÜËf=ÂÆlZ/¸b˜îã㥠jª ÓpÊ™ëð§Ü´¤–±}2DR¸Fï`ÿçIÕkÊË!‘‚9*f[[³œ¦®Tî†ÍaÒ%,KLÜ}CÍ$“Ð,åÄÊñ…8_ŽFùn"Áb?…æÏ“*Õg>“Ù¯P‚{|¾NäÁ(Óa¬j@R›Ÿdo5š¡ÀüV9b´Ž›»J|ü&Ô5ý4ÕRV ÁÙ*qÍÉ…˜FÏ*çaÇ™F¤R½Ó‰ZYY˜,ŽÊÊH•“½(,^Âø'a“øt§à-¼<ŸÁ=‘çG¼#½[÷匃? l“ë,[¾ZâQ™xG h!ôyóàç”òPAÆä0ì`Šè³Åk“Àl]Iu„À3Û µNé ¹¶¡þkÜßåžilÅQMÐs—ds•PZ”˜Þ p6Ë,í¨kRËgí•åí8 ³ 08h˦Χ¿”#Ý×™¼ ßÀÈ/dö¢¿ËLF5½½Fv]…‚ãRç8ÍT%‰ÛPò`#­ Ê,e5Á£S‘Q‚éI»ÂÙnæu€Ÿ…)ÿm6eò‡x4ç„<ãç•Vg¡F·äç‚S¢'Å R¦ƒ—›~å9²Ç=WØönÈ¡¸}ŽGÌ*ë< çy÷m Æ½»àa¼Ž1†Äy®òŒm„“ŸÞõüàê?˜2JGÞ&õ9˜=«ëŸC€ñŠfEâ0¤=›?ÿñÌÅÏ~ãã#þĘƒ¨zñHK]ãð| ?ýÀ±c=ÞfjDQÔšW¸•²Ð~?üY¥LnfÏÂzi(m~ɰÿ–ìÏÕãoçøA=ÄOúüû¸ÀÏJü1!«ñ¢þ~}ø˜ßÁßýßÙü凞„k ð£$ËLj‡NÿÑéß¿‰W‡»|œ æó ¯©RV¤eº>Y@õßc#«Oû)%?Ç6•¯àÎE îºÆ™D…²5ËX(Ôè@o t†÷_<,®Íþúò~­(} _Ü3KÐ¥c Ý–Ø™žŠÉpzü—.d& U&Öé^õ¢QÍC݉LtFŠÙr ³*é¸ì$XÀ2câÇØÇ}“æ§á¾“w“gUý+bf{o¨ ¬¸}ì™OÛšAxäc¤\Û„[ÑøÉ!‚"ÄÂ"^ûhÌZU¡šMÀ©æ ¢œþ©!óÇæJ5 C}„‚ØœÞ ¾3.ÇþMEQªm˜IÃÉ‘£šT1ö¦ò€c2ðˆAÖšœÓÔ±óþ7ì%Áä‘ÁѱÛÏúCm`åaÁ#ë˜_¿9AQÓ¬z‚¢ Ëû‹Oä;ÜDº|ÚáÖZk ¹VãÏ"ö¤íÇþqD#ÀvßlCB°!V]¤õÉø‚`CŒÝŸ unµt ¯èλ}ÁL̺åÑB<Š?U¥ã_Ò–zyí2*r ‹8ÄcëGŒôðj£’ÂÙlVö°CHþs›Ù÷Z—‰’²Âpp÷øÌ Þ¶ݸÑǹÆè?3šv_D×ÎÇCgA‰~\'fàutÒƒ i”{Û%ZH.Uìb‡ñZÝGïø~dÍ¡¿sËQ¥†Š'™¥*ü¨BÎiö/ïü¯Mâ(©á_ZÑñXqô§ôc æ ­™´FxrnzIzÜl´ÑåÊÕ!à¿çß¡ÿ?’ðÊt¼Æ^øø ïŽY>K$~±ñ»ÞþƒÈýüâMÀÿ/¤ÿßÿÁßýøƒü›ßÔ/?–ˆà™ÊjŸWIÅï¯êçðOaŽnÌ+’VEeÙ4så¤0È [Àû0ó„ÚídQ´ZÁKT{½XXëýægPïl‹“¯ÅøÍyŽYè¦ù“Çd¸†©°€›ع ‡Ù'ré’NÇû˜o( _çÂ8uÀG|eîûòÎÎóBÌqCMÕ9¬3——ÓŽc*«·ìáÜ?#Õ‹Ô¨R3‡XˆFgŒôÕU•¤*4µÔÌã¾®A#pEh×ü1€ù€:û]/ÿ¾–C«Ÿ°Á"·ëÒÙ÷ åç;-mÖ8„Ã;¯öMŸüXLY á2WSß ­‹°'(?Øòi%¬fËùÁ†ú$®–Ú$Hv~c­4sšAr„PHH–%-‹f3§™Ó¼ÃÌ6m ÓTxL>zº{q$<]Äd×-åæF¸¶:áþ@L½·íMC¾¯(›— TÝ!œÿá¡å¹¨u‡8tI™ŸàpõŽÚÔ§ æm®‹ºÕ!j÷~¸÷v.ˆJà±("ºÔ,åß·Îò„&OæsPÅ)ÖÞ!“ŒeM|­%«†?ÙrÛæ¦~)¿­ŽQf-k«ìÏfÐm¡kŒÄX Í £kflÖ (ˆ¬Úh5膔¿-)ÃsoŽÈÏ¡în2Ú˜b¿ÿ7¿§%Kk.I%Ov„:@ÃÚ”ÅF{;€\í¶¥±ù|yõä¥~¹ïÍíËbxdbj=ôúBn³½åZŠ+>xsüø¢ì}Ëí%)‹¥‘Þà9>Uºþ  f¼½ï]V’„|®OîmU6ÓÅ>&¢Øþi™Ü±vúZ²}S¡àmê4”4³½-Ã1 œí–S8‘};‘Ð'0Øþ^„¢ºJ¿µD‰ °¥]„B—.aÔSS6¼!"yÞ>Ÿ^z îïLÄä¶7œvnBHžuxp&? ᕽ·±ÖvN ¸¯Ç—"Û2‘œ§úµ“„ÍÕ-Üñ@”¸bQ7Ä3$>·ŽGªõ©„%ÕcŠ:DÙfõLæð­ûªªW Ú6mÛ–íAË8”qOÚ\\–“ŠåÇ£J ô÷¢·–ß*k)|l|.=æ”_¥fOj*éì¬RG]²jµ“ñ@Í |xb½aJjDA"è¡Sõ-f)Ô¶C玮€‰…àMRei¦afÁa_Ë3-¸£žöw´YÂ0ØãÙ .甤ã Ì4‰S:„¡hCg÷ o“UÈÉœa »EKµËOrxs‰ÁO®TBôù€ƒa.ýiŠê³Ïí}ži±3-øA«z§¨1›Ž{nêjüQµ¢Ó"ƒxPÜ'\‚ˆyØ…w®Nñ^¤@ÃKš,õ‚éLýMÛj:=²G UsŠÉþSŒž„VrKÁÃüŸùÇ)Þà˜Æ‹hFü$ާQ@]ŒÆæGkâ‚e„þ³-:i«ˆºHšñx×è b*n>ããùEçCÿÈ©4â…‚á'?éê½yy:ƒ‘õ'G\à)ÎŒAí‡WŽFnó‘ššøÞã-àáï™Ö³DôDÿãÌ=$&âFÄÔ™ÜÔˆñÆŸÐ'vòh«ù¨u=ÀU¾øóYÉæþ­~‘Ós0Aˆ{`d9(Žò¦ =]ñy\óPãªîŸ$hü.Eã<ãÇPÇŸ=íøëÀþ:ÕÿÿÝ_üÑÎ÷ü—ý1ÀŸº äÝ[ððó( 滫å׫âý·Gôx^•B;C®,Ëø9WR |"Q)²zn¦è©cË‚Bs&®^H*!¬}ƒ%H.úÕÀcŽÏ˜ÏKåý4)ÓB‘§ÞæÊ9¤„~è±Èzap!‚rñ'žÍ*™hèþ”aãùiry®‹<1zü¼ÿý´îÇKõ=¨èÿ{Å÷ZÂežŠ&ö,]ðøÄ¥¢¼:‡«.cR²:"ØB)>!\wásitEZ4ãÍÊO×#)<·°e™ÞÝ OÃÙÎÛŒftI„¬CeŒ}Ê•tÒvvÞy)8 ñ‚äëí®ïùô"ÎÔfšž@7¡¡ÑÃŒ³xÂßþcÄßÙH9â{£;:]R¨hªä–ãÁc£PÌ„è ¬ØP%2é\^ô9/Í…A•/Ó_hî,­[ñß§¬ì»ûÞ¦KkªgÀ³d5c‹Âš-!jªúº#fãù¤Œ| I™–âv°?¹ÊXmôôÅkpj’lS¨*ª*ÅÏ ¯£*ðñþM€Cï;° ;E0yÆõ™Ù¬§Ÿ3°#• V5}ž†yV^ ÙK°Ìóhך@'Ê÷ABô L[\î£{ßÂ*Aà "×¥ÎäæºÎuϸçÁü[‚cbB‘ ª‹ØôAòKÚ%æêü¸d Ú‹>Ä¿Ò:Œ—ñƒ’šVRTáUª…þq Í¢í^¡"7MMD—k>P êTåƒÏ/¤K%w¾3ÿ¶o•‰pyÁu>fÏ"ê «rÈ9þ¶¢ädžcW›¶I…^³MšÝ3¨î½ù½M!KKG_SÛ¶U—ms%ÒWE÷—‡ ÙYXq¤>¢ìÄysŸ—ÀÌ¥• ÒlÓ¶EïP£Å“(æ*•hSÈÎS—1/)K×%¸qtGäs]U PÛv‹Åèo·˜I…t˜7…3½œ C0a° ï‹¿ñÍKâ28ÜËÿ˜3kí’'˜ù“ØléK2t_Gÿ;Ø'JFüpeä•ÄcÁÌ©mÀ@ÔEyK+IFaY rµF¶ÁŸ rK]êybæ¾uU)÷<—ï±DißbÆ›ö% ´šªñp *\±gÅC4x=\Íòs‰*dEP5„›ån˜Í«òñ¥%²Þ-èZ#̶¾e6eù#ÆÛ·-‚?uóÇ–º'Ó­ÛO½êRRuÞˆ£ŸQñÐää’×8 ã¢ÈJpæLל –ˆIX:«±ûc­*;$~¿åŒi’`æVŒ¨ulgï/³[Õ" fK2‰†-7)}i>èÙÇ©ÈÑ>Y5bÅîª)œR¡ÏŽÔÿdD"þÑyå ÆúBj›DõíL¼ÜF÷³Áè5бY!ÎþP©]ܼÇÄØ²Ûízš{,ᩊÁÔg?h{Rk’’µ /åx˜šÙm¼ç)ÜxîdòZj^_|õ[ÎC;Ê)ßh ¹Ä8ÏÖQb°yƒ³S4Qô¬dƒT¼î}Ç46{½Cô;lv莉léÎ|÷“q2ð@^7³§¡Q ˜TîxOšwjøC$[<ž(ôtQÙ‰r=5QN²w¤úÜ«QéïŒ|Z>]1öRG·ô‘ô¯¥< @bï'!d.ðqŠc|ŶÒEÝå3G:ÏÖNfêìF¬lF½ê^]4ñ[€ôNßeŽ3ÃÃqÍ'ýdÌùªÎpV¡ÏáH4ñ‡>Þ#O»ÿ§JÙSL€Ï«òýè—G7èPÞåB)‹XÝUª›5#Ïòßa(ž"¼*bPDªîíÑy1x u~—Pгþ ŽñÇc ü¥Hóé_}-Óc Ô³…Yý={ûž¾ãNd}¹ Q3=Ñ f'ÙËO‘gµÅ˜‹ýðÆùnÓÍÔ›/õ|èhéŒs¦÷T\‘NP nÏ™vblÏÙ̼®ºÕ­Ÿ…†±Í˜Ä§éÛ%ð“zÌC­ê\ÀÿðGç;~¸Ìßÿ ¯eCÆÂö‹¯þWP§úÿøóÿ½1Àë¥üüÚøã`ä9!8gœàqÕý^ýÃr„öT?O³+ðÈàÜ#­¤Ý%¶ü2S\H"±äè@¢ˆ¨’âM¢|uÒx¥=K‚Ši¢šéªÑð؈™] ñÀƒ 1¨=B—QU%ÔDôÇA§-MUó;j“…/M¿¾žÒQyøB^…'nxˆ{üç×èCú?:ãG_{›ªN؈ò޳›SG©/ù)-DTK­™× }/€‘>¼ª¡•Ñ@Ú+¦7‰¬„hœ§Ë¼.ï}Ï ð¢«@Â,Í”†.õÒÊk‚G° 5=K º…9QÊãǃ•—¦¹ÓYÓ[•¢V–Íc#N11š¸ãPô+*“À6Yžr˜†Öx&bþþ‘ªa§ó3‰æ|ݺhPŸÁ‚”ä³Ì©FUó®:¤žó”´’\=¨)"g/4V’¹v§æìÏya`1éKehhâî ·3$Éèî"V$’Ü×*F®‘—¤Çm,@°^:˜ëŒƒâ¶=šô$cÙ±"ÿ„ðœKf¹”xvéba]jwhÒt{$FIi _ˆ‘'êÓû€¥•îù”_z©Ðìû{ïmK+K¿m˜òø"ÒÑøÑCv ^}‚…Ë·\jä'ó‹ëÎ\Ò¾Ík]\ñ1É“÷p²úÀSè2k@ [7 +õÅ\L¬ŽNBÞû¶-ëk}-¶4gÍݤ ½6t§\Yí¿6Ù·¡{#¤»9 TŒ Ê ÷¬tÓ‚Š·YE 9.›¸9㒻Р«"Q„“Ø‚/†ê¹˜à‘»0ݪ_K½©‚B…îMÂTÕ”Clâ Ýfà¾I–8ÈÉ×g åÿܶïo]ªPEüû.v›ÑÄpßÔƒ,s–¯©Ü›ÀŽ«:)^¾†ˆ¬¨¤iÇVÔ.Ô®Ú·ͽ׌z…(IIS{EÈ!éFˆ˜¿A¢]3Ø&P侮=²ˆ,½wò5 ž.pç­ã“mÛˆ²HfL–n÷~»Î¹MDlÇY™-¸fXGqù{¢Üΰƒûo¾ªÜùr,Kô6¦ñ%´À^¸Ü¯Ù†rÇsÉd¡Èzª yù±E©‚#)V2uN³U0$„=ñ™=ÕAAFó‘p>º’ «Óò‰?4XkÖÜx†é™à áIë˜m±³µ:n‡nÔ~f¶׫:UVÜá°9HÀC\pt™œCÙŽ;VË•‡t~´ÜÚͅjê¿ÊˆAÖ!vŽÂ'á1*m6_ŒÇ ÌÍ\¬Çi&UÅåA•xX§w!y# æðºdÔ/û;pª“•Ê®æ…óÕ¡›Šö7)¨´q”­‚“8Qöå¨93¬5ßV‘vÌ:ÝFMÿÞ0““O»´‹9ËIJv œq=ln—#çÇ9ÒÇä‘ó˜ùéyŒ‡ä,¼è±µ°¡£Wæ¡ÕÑ :õŸÇéloNÛ°<ŠÞF‚g*Ç2™pbw9øíC˜oé»›qùRUP¼è:·ÂžQwŽ08þSFo¼Ð6Ìs±s‹:élˆ ¾¦›/^£¼õ4*e77(óI èþ¶YóZDÝìó+X(‡ÀÎØ *†¬?ÏRýklì`yéü“NƒÃ¾x~524Ê„á,aîÓ!f1k‚èÛz>ÓëhÅàðNóQ´{÷¢S/˜óUàå´cžWçÓÍ©OÚû[ô~´§~‡&o€íƒ^Uïð`{ê,&DxæcTfq©tUÀѽ֧z”†)]ñ!Rò)’±p¿³ãÈÞÂðKú>öʇ)RsSXk&Øž²ë€ß=Ô!ãæÎyW½ÓÄÏ’èg×ôsVô@9pBÿ)|ÉÃÏîcy¾ÔÙ8ý¼)Žža ‘ Ñ*Ó/ŸÏLLÍ<§öĪåž>‚eÕ^¹ÙÍÝÝ×8O…|>giÄß_ÒÀùÿ{µxÌóøÈcàâüñ½}dètÿþOä~~ÌæðÅ8âggâbžþïBøiÐ1‡Yü²ùØWükRäÍõ­k#å~òi©ÿùO´è«© ®´ok'•†Ý-ÊÊ ù§ÔÏ”kg ø%à>žIñ\j<~oûói¹Ÿá¦Bº!¸jLeÓe¦q74«ŠRš÷K4â,ZÛ›ùøI’O¡ê9dýxwðó¥ |6ûÿ9dƒÄý?vľ˜O1D†=`,€bÖ­´‡¿üìñL6ƒ¾þåÊ\YJ]3—4F&!×k€}¥ 7¯ë ºxï(ät{~álñò•q;¹ÂµöüÛ}‹ ¡Îôƒm{ ŠÆ†®8®A}hs¾ê{T Ãx&Ñhî‘ÎJÞ²Û\ oœ¿˜ƒ³üwÆ3NºÖ¯,²ÙEj¹Q£˜·u²Ÿvsã[Ü,„±Í?Ù[5¦å` ?À­«°dÝ7sŒ)0\¾ÎReËÁsÏ3]”T'ó ÓÈã¸Ê­‚ÜŽ&ö†Å‡7¨ƒ¨1‘PòVi§´O¤â˜Y¦" —2ǩÂ,Ùˆ5ι.’ï/ K]C>ÎÝA?åZ†ˆÖ€*²Çè¨ÖØý)w¤ù p­äŸÓƒÑ‘ ª£Ç,¦s†åíá%’I™òT—ê¥~ñòöËŒøplñ<µº•– ;U$½Ý×ã8[©£a Vö¾Žüµë[¾ÿ±Ûö¿D¾–†(EËeP¯(]³þ³Ñª¬T ›£.çû«[u}u ýE`"ÜþtÉPrÆákÆa!I›”fP½dí°×c>ˆc»¸í&mi̹Ê[P^Kˆ‚мÔU;ëå¯`$¿Íòc·˜|ˆkì"е„›·ù 5¿qH¶šËv}W Z!pŸ}˜¶(ÂnʼØ7Ù£”n{¿yx°ÝA ‹]Í-²„v›Ù&!·mW.]bÑZ €F!!r“KÒ »ã„´ú<˜î½)ºmQHh”+ þCÈŽòÜN”\]gl…2ø.=§úWo¬¶KEä¦]7¨´ÀOÅàj©ÚFT2(.@7»\Ö6+æäFã*y.!ËG5¹y›IÈåQ^2mš>í£¶ãûµÏ#¹å '+ü®wZµï€XÛV¦lýZR@Õ-Xb·;™)æÛ-ïôRE3Õ}çfrZ$­²Œ …,Yê•ì2«nEE5ƒˆ ØÞDJ¹[ ±2›mÊ×…‚˜UŸŒïj½@ǪéWæ&Œ¯2b@H¿Æ×g8»ìœõïc5ܾµì¦Êm&‡u¥š¹“4™_–ÕCt ¸Ø/*Aí¯íEŒ©UÐÚRE/<#W{‘`r°º2!POz]+1œµž®É¸ ˆP“0vœ5ÆKð[nú"¦lA«ZãÀx3‚(†€ú²¢Yϱ(ò½mϤVÁ‘RöOLW”!#ƒÄÀ¸õBNTÄû3MuŸ¹å9›x,ø²+xØCÏ}•rCSÃÉbå?€ÝÃ8¯íîB^´žW?ŸöŒLí–µÊ M|ñ+|fã4Ã7ñ5?ËØ´Æ~CCWÕH¥qÿ9ÄiĤÄsw¯4“ªó´ÃálŽdú­þ~XOXž‰ÍJåíÕ‡;®÷‘‘ÀÉZÉ_>ù|îëãr›fÙfc|¶éWmè¸ÕùöâˆáŒ=4éà¥<ÿ´ð¼ÿÒÏÇ6J¶–ÂÑuȇŸ£³ìõq“YOçªr™Ž’î3~}Ú)-ü!z¼T ÿà5þÌiàGXл>‘FÎ`\>EÑ)"ž"þÛZž•òo§haFšä->ÐVçQð÷_äåÝ¥‰½Êñ£bU ;V½ý óÄOÚ%?ûÀù­³¸Çbuªhþ­31›VjÚþo'¯uH6œó|éã 0Š·{RP0€Òð_¬w|’éþÄ¿úMÕÿ•óœC¾„åO“$|üÉþ_Ðÿÿb4ð—D£ÿúÿ7?ä1CwJ½Ö„ÿîE<ÿº¦¦K+êKÁrüª¾‚‡$Õœ;aµ|­Z H_͵~iÝÀ+4=ד™]¥º8ÿhIn‡`[r« W5@&ë]…V­t#¼"›uEyò²8Çõ æÔOWý:WA´Qå#¤kNݳ™´µÑÇ·²$}\´ñihq<Î.3z÷ñ(Ú13]n]rÖÁxFÂÛô“&VÉ]` büú²h:•t¨*§Ã ­bÛÖRw¿¸[:åûÛˆ´ÇQ/”g6C9F2Á€—˜l6ÍûqÃ-ÐB}ØU²ÖÓ/ö³g ø¨¨Òzfº¼Þ²MÚ+ X* Í¥Lª¸˜†NÆëɺßòRpFä-QcwW¶H(áéO8vjo¿¢8˜YÞæLüšäÕ‰>Õ!À =D8“É×u9˜¯ž*Œ XkÙ´çK§uÄ¢QoÚy&ú©¥,96ã‘ 7ãš[HV!°g‹ˆššÃ=«&[Ul© ¶ïÛè©B©3öô¸)-íyŠ:6òè×:µägRÊlT›7ù\ÄWí!Å S)Ú¶)réRõé^Þ’âÍ–+IfÙÉ‘T ˆD—b©¯ÒÛ¹ðÕèó8Ëøk…-Ø›û¸MÈm²…zÑzÌ úÙ%»Mv%—æñ´…â&AIçÑpsï½–yS™m»)Y>žÌ¹±¥¾Q+³Ê61³•ޝ|5’[Ë¿OUª*ë j‚ #Üæ‘Qíýq@D› n‚'u]õ]+@¶ÑTW’%|™3Û4£|‰ˆKüDtœêr0¯®úˆWîm¾°öÞܶ“àÛYóáÊ%Kp‹íû†@—®µ–c×.Z.ÂÁAIb YP¼{ÃM—Þ[ÔG9{L¯ÃWPú£ª¬——[¸I£lÛÛkD¿³æaùâJu ë&a¡û%*ì÷ýM3KycÈ ®+èRl£¨‰9¨† –*$Wº!˜ƒt|aßäré›Î¥â¶Ål’ÆKT¾·ÄÂ?¬H¬Ñ/DöÞFl3Ï ¤ÐÙ4梮÷ [Ÿ¤hÞÏr²ÁW4`²Fjfà4ÇÞäû€Ô…K4ªp‹çµ>Âmû&h¶ã-d[T+­Ù¿¯kä}ïiý©&P8¥JWГNëXö·Åô#~ÂÎR”xë4!whL¶÷m¶Âó Kc¸ËVTôª+ŸVÀ ä S(£}“E§»A¨:C¬~¬= 'à ¡(4¦/¸ÃüWnR³OVâc!¡ÚwMa8]W2Xا_˜sbŸITר€›È  §Ý±è…Úiæ‘#„óù8“Ñ‹<E€.ó𸪴¬ÆÌ Ñ$ù”3â\è<âÇx¢a21O kÿ9üàÈ:æˆÍtû!Æí>ëëa3ŽQÍ!šö>»PA’À¶Æm3Õ¡©iTBÐÿp5hx•˜µ¦òÉä?mÍåC¶!Eò6UZùqS“¡ýŠ8ŒÉ§äiöD«€Ö• IDAT ™˜ ÿýö®Ïb OÝèŒêûìgÜ3d·×#·*¾œ&Óž>QÛý–Mé.‡"ͺ3BD9˜è¾í 0ò*R>+w£ÝH²`]xÜàÀøÎ½v‘vS¢R/7xñ¢ŠüóÒé‰1u<‘<+ÈhGˆŸW›&@i»ØD4H¨ó®ûÞvÛ^fÿú××¥êÒu—IÒïY /U]*~ª2Óxm¬“T ÈR?P ØÓ¼ó·™ˆŠÊ" ¶E}¬fŽŽ\ºÖr‰VÇÅlG®%XÙ>‰¥Q×|”%ž5¦‰ä§²qÿܶñÞ–.a3¥C9æR³âØËm²©‚8¯¡Øï_bä¶t7o ¿ß¹ŒÉ¦© I'MeD»-ôR#íÛD©B,MÀ•kýÈl¿?½ps_¦ þსšcY Ë?hª·ù¡Ü;&K%ö˜àÂ%úý³a*—@n ?û&÷Þ1Åågb3æ¤d2–AÔýò"ÿùçÛìúZ** ºc¸á: /²ÑÈ¥¸·ÝÛg–^Z+þìðQüX•>ú»'ú¯Ku©‘ØqÛo §ñÌD !Ô">+í­è"onyæCÝ €)„Pn³t tTÅ•_Á)² Evëë#LUËXA|¢ÜÀåÊñmû6QˆÂdï*2fÚ™‰6™PôoÄÌ"5ã~´LÛE÷oïVèi2–bM ¬7Øð(Á×b“4*~\~Ê&ú8Q™R‘_ ýÖÀD›`’ÇŽCæÖ›UðÓáFt#âx¦w0bßF3Dõª4#Ü”V-ºá/ÈöÑ#nxÔ¤Lpö!ašýED}œ*¥®r”£ Ì‘m_”“hRŒš‚R!‚:BЪ1“F„ oÁÞ„M*3Žp»ûå£Ë¦ÌÄ€h°Qí4.Ÿµ‘åÄ©•½s„½y ¤#Cªõ%>œV´Ê~Lg¶×5ŸÉÏ…xCÉͲªtèj6[˜ýÃÇyŽfc[M-RŒ¢ìnœžð¾Ù¡¢*ú©­ª~2œè}ÑT0Ô™¨ŸbßÁ¨“¶Ô‹É7áCûÈ]¯pd%›ÊÉÙ²­“õ›=:»Ó_jÁwãPÏJ7e;òH~^éÖó¤/‚udŽjà©ÇA‹lëÏŸm×ÑÅb~à`÷C¶“eã†>øáòQ[Áy ¾yj™ÍKbH­ŸÚ÷1%i¼€1üÍe;QÏ3®ýwc‚9² hÞq>#?†xül|³rH„‘9*rçÍ#yE•Þ#Çà¢á½§_OGÔõ?P 'Èåêÿäˆñ$8 aÔÿŠ¢Ÿ¿~¬ »³âOŠý§ÞÖ£}ò#Bþß~þ{aâ°§t<®;¾ýËxŽ '<ùƒ-Ç<šøl„Ÿ—<ù¸Ñõ$®ÎLÁ3.0Ö¤<AŠ(ˆ©•¯êcž"àûn|u·Aàç/æ³lÿW Ÿ?zÿåúü¯Âñ‡Çß§UüÙûÿ¿Uÿ?HÿŸÒø©þš-~z-ü!Ìðw3€CÛÇkìS£ûΧ ÃDå(]¥ÛA–ÑÎײÊù¬B“6]D›²¢œ‹çM …Ø+l(Ž9rϯê~4ÕR%OÊgòÓp4iKlÿD°X6G¦ÛϨO“¬äØPFà#D¿¤ñbzbñ±Çøt£l5õéÕŠ $,¨H5†æ ˜(\$eÏdzÊh €irxØèƒW,‡*!K¶l(DcY,gQƒ{Qî–˜ MLÒ|©¡·ßZmjãôEÙØ>Ry€J´j²[%ò¼éÎâÅ(z +MÌK•YD)Íïw#´ÿNU°°«†ú¿.ýL`תSù'GæMWÝ&åÛô+~£Ã¢5l鬎ˆY&Qʽ·SP4ÏuFYõéÅÈ\Õ*¸°väR«R Ø•^*3»ëiˆ¯õu]¾â…ÞÝP„(±ˆÚ,è¶rþÊv YùÚÂV Ÿ­ˆÅ}ßf佈ÁàˆP’‹ ”o‘/]ÁßßT¨%{aJXÐ331Šm^_ áÞIÒuLù¦‰aÓ„&ļO—Ê­à"²7mØ—bÞHµ,ùg¾=d03 fy¦,Ì̇»©`CÄú„écH]ê«Ä×Z7-Vû\ DÄvõþð¬²0ÛþhÒ¼YTôÕi‘YO< í>T,âbäHòq°…+‘èqJ‹w¶(ऄw© CÙ²£€|ɘ¾—Ì%±£±p©\º(¦ªŽã¯»Þ‡[òµÔ?ªµ5k-Zd\*® +·¯0µõWç/ÊÍ­®”9/«²ÝÕzíßì ð„Ïë$‹·qê°2+¯!öJnÇÁn9 Ú& ÊΣgý†tÏ |§ÖPT}›VË‚oZV„åYÒÊßžqš,r;Y5 Åè#}ÙSééËÏ@e†Þ0lìú4qDv‡Î‘¦¢ŒðÔjzrùÁª—¦B¾u àÐ%ë<Ø-¬`ä-4v©ûêÈܾ_M{(˜ì)tc RqXú? á™!ç $ªÄ(ª°†:´óáH8'áÀ€Þž¸§6™b䥒æ”Î2)æÇ¼ê+ù˜ä >¨ ¯B@9ÜæçO%>¹¨µ+ãG  Ï•6êÙ“¢ÛqŸVÏOx OðŸïQÖ4ßÕ4vò®bÄX¼ð‚†o/‚йÖñ˜’p>d95ô9qûAšiù¤–÷èî+\Y¥£r¾nÎyq½ÈÑêûHƹ+-á6ëû£N€8N>>–‚ò¤ÕͦšØw™ýqróšw¼ëø!eñJÌ%ó¯-øüÝÍþ49ÿÑ•,Ï)ØÿÀWÿûûyÖþŸþ…QŒ?Íi~VàoòA‰%:Ûœ·Í£Ø!öÆC,Šaª+?ؾ/Y Àµ:܇ aš¾[gÚ‰´(¦X"w[ye͵ÖòŠ©›ïI§DueŠHgyÓvz< ½Åi÷ˆ-ò1f)E`áj Z FÔ§>èuJP§"ÿîÆÂ6ýNî³ëÕÿ¶õ—?ßNïÁ~ö?º0Ñ3c£U¾(=Àäû;ã'Ä}³Mªã|#|…Œn9üG½-yCȰ<9,ÛˆJF/&Õ àˆ®•ŸßÌT¯ê¤f6³ÒL|¶cfÝTEBU±Š{ëRK§ j®êν&õáÃMŒLçšóf î?HÕ{óõe:3“ÒBÅ,ÆY! CT»]+õ¨¨(†Háâ605¥ôž•­"÷rÇë,­úœñ œØÎܾRY‰›PS'Ûåÿª™1‰äMoÀÈÁO¨ÚG-/·Z£Â¥%×<¢˜mªF ÁA™)Ž5ELq¶ò…М”ã•'è¥ì3"Nùi ®ƒ´QU»‚¸·Ñœ@ ¡XÊz™NÂí:ÐL…K—‘š¶B^ªl±½Å"<‚”–¹ËÑÙú}§c;ç¼k]š’œ¹Aâ0¬:z¡wYkíµÀi è –xñËXíÛjLµÍDdùbA~RPñáyå’z?ÖÜFË‚Ú[–ú¯Kþõ¯ëº®}[$JD YÇ™ø,Ȭß"FÛÛ~ù_€, ¹K#‹@ñƒzg{¤_Å÷6§³Û‘ì ˇ¡VoÐNtqÈ+²Ée0³íRÒÿ 6ÝÐÀÓC¼÷®‰…, ¹± ,Ù&Õ_F±]³/HMg5ïÝYÌæ¦káRnQlBEýF¤gkD—2 »ã#q VU]€Ù†è^õl ÄøKÁ,ÛчŒ&jãÂ# ã} 铸‡œÈD`¸ÚtS‘,ûóFÚ:úkv/§ Æ´&èëȲw‡ Æ)š~ÅkÀÝ5)Dâ•Fó@(¢s¸`G}ªÀà`Tð}¹Ë¡vãh³å%FrÖgúÕ£‡óV:bÁòOtö߃ØÄÅP±à' ìÞ­´ŽÚ'=¢hã#Š511W2Ê[sÅKvTò½D1FguÔ€oOM·K5XJ›ò„vMP”ï£=w±‘'´ÿ 2e$%æ`ý€=¥¸Rý7ëÃÔ×/ÄwXìopj&E¨noð„qÔ*‡jЗÄÀƒsœÉ¢äE5| ŽR„GâT¯KÏsOK>6ýÚ`%¦Ù\ã°Z¾Ûž^§/å!À—Õ‘Gó4‹îz¤fD&ø‹³<—'ãSºõCKë¡Ú½§XùTe¶Ïþ½˜‚ƱV}€<8&,S‘: ör<üÿ5¡™ËŒŽ<‡S­«j¤ é=õÌD0`0»Ñ˜·á“ÕØwâ¾­C~ˆq Œy.P”¶sâ¥_ž™E…ßßÂ_O…Æ-½NA¼/¼yÁ¦fÕjÒcböD~!“·ûÓk¨ÿèÈþaZ˜â\ÿŸì«ŸÌêÄ[4ålNð›˜Í©¨”˜¾*ÏØ,*´1ÛuJrÀô>¨þCó\½‰%'5á—ÙßRà³…÷çÅ@>EŸø€W|–ÔÊðóKäÇç³ÿ÷FŸá?ôÜSþߎ~ìþåO?üdÿÿõ­à‰J<Ûšqvþ>Š‘;Ô‘8xþ9eqÎK¢,Ü?êÃ]nŠz‰bbD½9H½ûÌ«ÐãÐl8¡§€'ú1z1àP*ÌV‰“y²H¡îäkËr>FºìÆÃA¡r1[46fq DÌv4rdd#®†ä$!¤kÃpÖô¢wó˜\£žgñž]æµocwáŽ}ó𺛔°#ûÉ© ¼%ĨÃçM;h _ðÆA3—\ƒ$2 Ë™Ž›¡/81_ ñ¾ÝÕ,*b;ߟktz0þßµ”\_×ªÆ ×û`¦ÿZ© f%œËæ&[±vržÕ›>öˆ À‡ƒ„Ãr¶­¶LŠvØù:«>ËÈŸ®ª‰àÈ^ ¬c-Ôj^¨¬;"ÜOÎ{ÛR|&̘‘ƒù»ÌÛ{§a°QÛ„üí \w.ûA_eÑ6^4S±°NºAz©@ñ%ëëëúú××ÿÙÿø€ÙDlÛÒ+²y ®ƒ.'ªª#¾­{“é!ˆlÛf´8:òÞ[±ˆðå{/A ÊRnÔ„K|2h·˜sÚ٥x/rÃv† [¼¦—®|øÂø³1å2ÚtoÏbè½e Ä‹ˆÜ”}˜›¶¶îij\ fìØúrz-Ü„.|]Z6 x,@4LØÌÊwQ|-€T昹y½\iÑ ê³2g©šRé…ó%ÀÆNPœTµit¦GøpVBºïß!Þø‚G6ÚU)DÿºTÅZ+Iá=©MCóPoÍn…7]ƒ¨õÄðxãoHø",iÞ&β½ £º^Žü¥‹j;âffƒ^^áž÷—øgtpU൬Ž7‰•âê“l«('¥tóJî­ÁˆÈ¥zù »}ªk0³Kë<˜c@ÌÅoKVxê7ÈèŒúãEU%èu©ü6çh!ìú"‹4¨×MïíW@e©®EÐv·2ÆD3DËj•µjCU,\¾Äû“­Qg”fj{® "X7¶7¯V¬>Xî9»8y,çš™V?¼DÂŒ(‘§M¹¡·ÙžÞŽÂ¢¶L€ÇOJ8Ž÷Ê9ÅÉŒ“8ͣɣyÌ|—_®¼ÄU¿gUú¬óúÖŽ¸Ä¬K£2¡ ý*ë»qà"E¸Z·XÿEK‚ÑŒ°ä I”AÈŸRªR™ùü+Zš­sSRÉ à™™€º‰8ÇÈ“Ýy\ß,ŸŽ4Ú:Ü@^y,}öã±6š= ë‹°áÚ"^ªºÝSŸ3ÓЛ½v>ðYPˆƒSVØ¡n)WJî’êOTë_üe£(Œ¶·i×R×.ôÜ’>ü9€\K©æ #.)Ï™Šìt¸1áÈÅ<[äeÛÖäZ L¨Žyü5Îe”ŒS˜{˜B ÕCКAFˆj„‚ãçXÒ`qÞ#iÜô(v‰vŒî‚ !è½#Tħ¼2-Ÿ½˜nž¼ ›f·—R°ÜP_&&¦TO…Rd©\Ð@Ílo“{ûG—“IŽŸ…><"…ÜŠèH÷³›o„ÿu7º*î 3óšŸÄ5O°lB?ï-ÌžÉû6÷þ®å±ŽXIï°¥¿ÒjI\º®%‚]€6KÞ ´Í›Ä&¡rÑ -Ü¢²wuhß·ÜØ uÈŒKˆ—ÆÍ„Ÿ‘ù…¤ÝysVÀ^ÿ—¹7[³œ7rvÁUÞ÷·»bà?ˆ‘’²*?Ï}ÐíªÊ\ƒD‘àE:!Ò5¹VûÅ|ãæÖËÀ‡CÃ.ÑgÊ[#)Å«¸š¾ W72HòŠ›{˜ { ç.nÑOp Bx‡iC uæé ÙßÓyÔ÷0©(«ÝAƒ€=cºÁtqŸUdáEBMåê·)Ÿìî_¯ö-ÒÕ€¬hÖ¡V®4Ì«w{šúàuäy†CÇf¡j.P¿L{§ë[ר[Z«ØO|áÔøöÀ¶Í%/ Ê,Û™Œa…Žúò¦§¬Kò?E†×'lº¶©uÂ*‚bÕaRÀˆ V™*ÎÐûjHÚÓÅ»%çET8±@„`Ÿp0LÆ:ŸªJ÷„䉠JhúÆ`d,Ñoç~È3:E”Ê­³ ýɈEb£p:´P{ò@yPm°­ËŠÅvUV¡òAS9ØähÆ X5À£P óÎüª/?$x7èUMûÁ»ˆÏ¾…¬Ø;ÀxpÞ¦²¬ñqÛÉ<©¥ <RqaÖ :f(r fñwË/oÒä”Ã1ÊJ9TcÆ®]õ IDAT¤°¾"ÜJ,8ÆÞ‘ßR.$¾µ«êCäôV¯zg<ȽíúMýšÅÈQ}Úbn¿åv‡SãMp¿Iñ÷µ-jg!G5¨«K –GÃùÀ×óÃΞÊ)ªäWžçýq—¾?Êcfw{ÝlÄâ/Ʊ¼rˆš+Œ³ê¬e®§ï(^ù£ û­öý‰àGùÃþ>|,ÀgáÏZ~®æÿ1%ð/šü?‚?“Ìÿ!¾ŽÎ{!»€—o÷é^kþþwËEË1‰Äô»‹¹Î¨KÂ5›c4T…;}V¾n;ÁÁÐÓ Å¼êDÃÜ™7ÕÒê j4E-ÆH#P 1wóFMe¼°äÀ:é~Ï`Ú7kgD5F<¬« pÐt;Zä²8ð» {1¨÷>6Qà=!4:†‡Y!'^m—(tAá€uŸM§%ËÜàožx+'—{d?Te9ôÂÜû›`Uÿ¢»xo1ÁŠËÂ3L43o 5ÛQd@•m݇“ÄuZ€æ¤Ò¼Ñ´x *+‹g…/î½÷ÿÏõ±¥¿ÖUçvó(ÌòŽË‹Ô•fTP>A âMä°”ìÊa^½"Kä:oò’™5æ°@JqKŒéèÿÃc\ÏBkÜ”}લÍö&· x‘_ûªMÔÇûÁSi\¢Þ–\|§-2Á™DtP$KT>üº³ c-òY,\+ÚBUDC‹¢)©ÑÑÈÐGFkʘ-ll4´D‘T1º‚#UÏ,ê¦_È Ä|·Ð"=²øS€÷@#[´YÆ&iÍå%ÆŸÏrkí³Ë¨ÀâekA ² &4b%öÎgw~Ç Y¯æ]mJõÄÊλ¿Wâ˜Cˆª\›f&ÿGQ˜mšº#?Ê­¸#bå¸KÙz:G¶”Híº'Y …šmƒˆ¨B¹·Í¶P#…oÕhß‹¬Ó,"­1§Õ;œ+c¸*›Gg¯&/¯ 3ƒâ>–¨|͈±¶ÌêvEøØ—Y¬¯Ž§U7/…žMÐÿ7=Å×Á< »€h%t·|Ù‡6‰ÄtH̓ý%]cQ3Íìÿû”«êì‘¶;-•çvíûÑár®HDƒë«m¹'”ýz˜Ûv†¾‡„ºYQ¬¼U¬“jfµºá¬òì ŽG‹;»qJóà Å1œÃm”ÅYŒz¶Ûöù,+oùæ<ÿ„¾¾köˆÃsØ'YéË»™­$A¥ªDêÊ>ð­òRÔ±šÄäºT(º&KeßÏ:nܦ‰#i6:²¿s¶Ÿý”h:ÇZ& ¬ë;älŸ¥ðN︋?èI`µÇsÂÛEÂ7ÂÇëûÒó2(‘ê6 +dxÓÇ2vD¾ñùŸ²&ò!x÷©Rpë)?¹Z/\ë¾û‰oaø·w‹q+ãÅ¿)çkn$Ó<ÒÙq휜wK/n÷Ñ!ɘWÝGeGná–æã·ð?‚µy›£Ë{úCäŸð_ú×¾{7?+4ø âç+ ²×£­äß5¾mÕðedd3¨W~j‘÷æBÞJ‰.‰ÝWaåÝqœnmgîP˜ ¦ü­8ˆk7À(àM¢õStȘñ㸬ÏÐCUhT(ôÀ™ùzšo¯óñù‰j€ÇTÔX\•ìýÅËÝ„ùÌ<{A~Ú3àÛð»$Ì+ØG¾AýôNøšž²7[øHï¯ÊêëÄóAL)Ê%¹>ËOùff¶T{ràu¾¢á…ÚÛÖªÿ]¢€yíú§Q˜v­ŠøwÜÏKcá}4¹QTàÍtùFJMñ¯°ðËÂEÆÌ!Àç"çr?& f*M1³£¥’?*lEáÿ¸(b²Ã3&Y$ „[ñÛßsòó¿èÀõ™œ–Àà™®”Û¼L4eÔî—¤·áí:7êóuQËC¿ `@Ô9ø“7{÷.Ï*aŒ”_!ÚF<æh/»Ã2+zâa|‰ ßžWd…É• ‚Þ$|'ÍHÉ¢K…QréÎ&ëaЙáôËò¢¥Õ^)k©–“§?%=?/ÐEÞü¢*´ÛK»ø ïu°.Udc›óô5n8…·µíyŒëD,ãoÉ‹R©šÅë–!±ay§”ý?,6¬tØQÈå¦bþHè©2]G]TÂ/]f²wï,…Û]À~É›J}¦b#"Íå›»åƒ3ãÞü?ù¿½÷¶xÙ›æ ªþ-²¿ÛeSb|&éxw>ε¶Å¸Pìì7¨þZ®NjT! Ô¸P|–†6l¾pîŠw( Mƒ|í È`•Z%s´d¯·¸iØü@Ã'·í¢ýR¸û¸6ÃŽpùº(bKÖú(—ÉG¥JÛ¶H}Ñ´í^rBúÜ3›-Á6x1ª‚)N*Ú^àí:m[ÀHU˜õÞ`ä½3°ÖÙn$ bD²Hö¾¶kÂ"kª–Èž”æ½}¹ìÙÕÅI°êK,pGqéGŒ]}è4)¾t΂T¡ -fK¶„:…7ô˜Q’óÝ,±“€ÏZÁf‡#§¼9§AÑÙ%âyDAÐpÆãÄ|¶)"Ú8$õ(>K¸£ð›¶^W×Ö_Îå<)ȆØFØ×Æ/Ù.·« ½ –åÆìŠuk$±‚kå ª‰‰e/…Zd ».ÄÔÕìs&W Âló'x u|N§#íÜ6) Ò[˜]ÖŒ¥î¬ø Xöìú²µ@ÏAM¶CÂ\JÜVKpC²¹ÅiAˆì‚ø´Û#Iefl78²"æ.Ÿ ‘ùÌfV”ï™ka]ß8¨Ü…t„S|P(Ð&l º{ý aù&ÙÉÏÖ©ÿÌã)k€ò‰z·ÌæØÁÎ|&%A‡úÉ›ÓPdØîø9GP6iå$Zˆ‘nö96ÿ:Z`»Æ³@$ç•£P¹cF0ÚKyÌÔ3ª Ã;쇽½; žms²CךzSaqZŠÑd¢˜Xjå|4'袌á %Îñ&Ò  ¦;EG¦£ü™ˆ„#Èñœaÿ´œrz5›L‚ÃÌ;襸%yÅŽAmª·þžÒvc³dBgÐYRXnõ_aÂ×ÂÀ±B1„†jˆ¤2qa¤‘•ÙR1OÁ(ªÄ\'Æ;WÍ›ÃXDF _ÖÀÇP«*«úz…—UkÏ}¸åišæk[Öñ0/;øí_¯5Á]TpN¤X €!úkQ9XI%_ !öÀéÒçê!>”Vú&ѯ9fò3ov‡c¤5 kçòtg=÷˜CªwCVa$­ ?‘ëê­r¸£÷½”nŒ;ºóƒGrOsý¼£yÖï~ãL¬ÔS¯ÕýMé~Ñx%z+îŸ &D¸fÑ”›Á2LàPZù$g'ÎyÆ1RýŸž]~¯ âÕ:‹ PÑZS¥Vñ®âðƆǣwtRªøøÊxkÒͶçåye½[™9Žçý\Òï¯;ªoõGrhÚÎY Þ¯r6Ø÷þŽñ!Ô y7ãçÎúX&q»ýæà8ˆ{ÀŸœ$‘©=ÆDÄýëåëup&Knßí_Wïù/°í?ÃAÿ1ûÿ_Ïgü›5¾¿™'ìÿ»Eãg/òÆ£ŸûiÜ¢ceNCùV ™„ŽÜ±Ÿ^TY.ÄÖ~¾B3ö%詊™èÊõ›Èé˜IØóV¯¡ÁCi[N¿¯U?JDÕ¨~4 xÓª@°„Xç4ú¨`/7O+±ŠsQi€7??7´žl*Ïvò7›>Ù-ü•Ëo÷Îè~~áƲaîïøj‘KŸ«G¯ EUÞSoíÝHžy¶g¹ÈN=†C±W.ž\‘zf¦Á› ïVp ’ÎJ¶ëŸ±¡Å_§*Ø…Pv˜›Ò½ßxÝÜSyßexo*ÌAnƒ©Ä” 2v÷~$çHWY _b^¯Yô£8i€.`Gm@xí´iMUÙòo¼å÷ßîÙu{{ u~’,EXò{pá8{¤i¶£à Ç–&Æfè¾NÕʩĈ'ùžyOEÞ?¶C–t°7n!À™Dã®ÿ.)ñÝ m»ò#˜FB]ù‡K–(Mù>Ï=†Ž™Fhߤ‹ht,Pd_¬ƒ’;ŒjMóÕèm",òP‰äIŸƒÇüjìi×2u¸lŒ3ÐcFÝ›ž+k!U¤>u²87µ<ø™žŒˆŒE›Ÿö¶/ïAÄêaZE (¢y”„Ep=Á.RŒ©RZ7Ô ”°å锉ÙþûÖ%üÚ^q¹Iÿòá&¶½Hâ䓲tÉg›-Ú&©gúð2ªñºÌö†€Ÿ>ŠmÓlJiÆ©–A‚¨b)5k›Ñ¡6SU ŽóŽ£'SAýóv³½DèDlÓ®ýüRUrÓÄŒ_Æ_:ŠòœÙgѺ¼«©ÜÉ­ñÁ-mÌFr¦78Âîyû-‹“½Dhâœtr@Å}Ú9züøÇ¡–øŒ½7\(Œ>f“*Û„ˆm±m××uí½T?¿>Öçã‹b»s¬ÍÊæf%ád(tˆ«Ø¡ÀË6æû²À»‘ó8“%ÖÌò ´ÓÓÊ^¾ÊÇÂÑ›Y]Ûœ^ÈCN²þ 0O²ÕœÎܼBÎáíð‹f¨cøû)8E7fs7›VÒ¯ÃëZb²¥êÎI=/‹ ZstgÇY÷QdiÀD¾W,&‘z/|kÄ|¨…ò—T·æÉ§Šup-"JNŒ†Ÿé;%à˜^$í¥’ d >œèñ  Ô$æähŒ±¢6«y¨÷­Ãç“]¿ïµS¥té(Wîá缺ÚÜíâKN^¶ŒÈÖœ<ãƒsà}övËðÕ)W©–Ç-¯ÂÀ=€R˜Ú¼œúXß›w:/nflž6?àü À«u÷xËsÇ#npÒëQIi}ÕÀx( |]Û"†o|­5ü;„[œ©é@çeR¤×dvþ¨hE"Of}‡zø 1ô8¤él¿SUɃÖVp\•[áù˜áP¿ù¼NŽgå„ÍåÜDû¡ö{­ø+8o>ѳWœ÷ëhL¬6¦'Ÿv—Ĉ‡û¹ê½­»¨¿Ãàó·X>ïøÝàé  Œ‡ˆB\PHŽB˜A?ñUßîÁêùö*ám2ÿì7ñ}ã›Å7 “)‘—kÿõ¿?±°ÿ3bú¿Vˆ~:ø¯òx9n†éïÿwõ¿û ðnÿ¿âïöQC7Z#àay¬”w"ÿKwñ]O¸*³÷®ÿš›a¨Ÿ_±Ïv¡)žÄ$(XiðEɦÅYes ‹idÔ,_?êuœ2És²Ò£ÇTþ\6(wv_6°žÃó+÷XÙQBÏS< ~ùƒÉ߆?´lœS÷ŽÅÞõZ_6Í¿ž+IÝ’/0"G>`Zü9hým®¢S;dôÌ—$FUh€R͉Ç#7lï}”¸O9Ýî-Â&¬ j¾BÉýT¯Ÿ…åÓ ƒ …ólõ­Y!]Y,r4“&ŒrTˆ¥´qÉ×±/,“nl[D,J„Y•4­ÔºûR‰}Xî-/‰‚¶Æ £áŒ”§e‚ÙZÆ2CùÏpõr5[QE°mÓøY«.ÄöÞ ·T,¶;ÚÝLDwRèe³pIÏíYì0±FSȪÄ«dáQ±õ¸cãÌ~íýQ°m„,V‚*\ºöÞî‘ùßn\»eY‚€ô S­l4µMå6Ÿi +¸G¢¼r­ïèS{þ~eÎ]ªÊÆòæ |²Ì-rd \VDÓ›ŒS·*°¹ók1`³^]ÿÕÄiÏÞÞVm…; mµ÷P_—ÿØ28o—•vÑl›,U¨ØÞäGemÁ¶hû,4DÍ(æΤØÂ/|RûwF†Ëú Y7Á'8<Ÿ…MÑ18H p†ŠÉ–ëƒÐ[|5¶òe&¶Q×§…ÃÂPu´ã^Þæ1Ê/mX5+ïû=žež²M¨È‚—TÀÂluúZäP3«ã‹…'ZTuUU¯1õ‡À¸õ«šX]+þEçô=k¡£jbiŽ4BÂå$”¨"‰ ÷¦p3¹9þ'Vû'Ù 5¡îîØ§@_ \Û§ÖÎe¾5 ¼ šßsÞã &DM}³Ã(àÜ*˜Ù¿¬\ù·m¿²¡º5a Ê,s@Å6ã€!{ýUT ‚Û( šß´º5ª_T`®à"{|åÖRÒYÝY°-€èÂú›JFÐ#ÒVéÇçö¬‰È¦‰÷-j)êžÅªÎFK^´MBÔ{Ò®MÕåó¬Ó‚–É´ã<‘}fÔ¸æ¶1}Jۂ匌PnÉM[ÃòI#!F»,j*TǼ"›²üåÍ®ûÖa›8Ò±æ­ÚŽû´eªº¹7ÙÌÛ‡#…áSZ³)`Vï¦ÐëÏ+&ž#Ô«ö#éáÄñô)ǽ˜Œ%J` ÓìÇn/Šõ‚VUS(? pœ¾«œÕ²—ÌMßUÔáïAÊ;0Â;AxôbŽë$u¬£3“:&ê3ñ»"}û:|•Ur€ª,m×{ÂåQòkvoªA¥&YLȯÉŠbÜHB¤/ =.Ãz?e슧ÞðÁ³ÍjÈý)š³¬iãÂÓòà§à•X‰±5ŸHýAFºé>;Èßxë®–tÙãtõY qºjºÜ®©ðŠr»—‡éÅ>Ü­¨_†îÑH¾\-8qþ ˜+L¥MÆ0%žZþGެá_Û>Ÿ]ÑH]KpòÅ‘Öà›c7DÁF¬$/^§É­ˆ÷¼¥_¬ú¶ÕXœúûó¨J´,Ĥ¦rd"ódÛߥºö ?†ºƒ28fªàÛÃý¾>Æ-¸©@“è€w#FµDð¦Í¡¯ìÑ2^-Ù3>’8‚! =I oÿ–ðNUá`T%­6Ãñ‡Ítš“„éÊxŸLuýñœgÉ;l…oþÜÙ5|4”Ñüܱ†ßi¯'g1îY?_r0Ï¡Ð`UA¾eˆL"xæ"nüyÞ$Õžó\r¾«™í|⓱à~üI­=籯U†U õ°]ßÿk}„Z‹}v|ß.ÒŠ…|»£ù&ñÿ`R{ŒùÊãÉÿª¿Ñ®þ¤Áãýuöoý/nô©üO€ÿ!÷îƒØÆß ¸å7ÉÉû IDATá;8ÎÝtoÖH Ì8uýh…µ­ªR˜ ;søròqªê›Yí…à£Gj ˆ¼ªìÀ Kwl®q·U %s £Ã*§·ÝòªÎ=fB¾oÇÙ¯À¬øº-ùLqâ6ÓŸ=ä±~iç=»‡ç ¾Lv¦È_½<7yïð y›S÷ŸŸmÀí.ø”þ¢Pƒ‘;äQ¶ü GŸ»-zo#Ív7Ù&Õ¤ªL8Op¹/駯°»;OÝÕ›ù³½ÝìÛ¼öQ%ªnÔ,'1f·°e¼Â††Sæx`>Ýd¨pÚð=P¹®ÊДÇEJ&j¥d¯éÍ Ïn”#:цFÁ™G'S75éw¨®vÇñ@]$Y¥:ÎÐ,à#ºÒ‚oØÁDkwU²ÅcRí’hŠ(‰×0k'“²³2}H´·MLuY¥¥tF´‰Ð›s’è éDPUì~_‘)ã4—'2%øpüZµû[U`‚µ°Yžkw`!€-?½D­£_–Û ê¸òýµ³É9ö¦ L" †‘Õ¨ƒóhU>\×QUnrs›Èԥ⽜XµA»}ÂüºL—†x¡¥ª•ÄpŽVLÍt-óû?5I7ndòÆßKA*[•X€*°0X/É›ªÔ—¿Ù½·k‚–wƞ݄]?™í3Xí‹4³¯ð©Ç£ Œ;ØeäÒ%+‡'æTo…íX¾«Á6öŽäÓ<Õ°ÊG,B”]v~!p=Ú37•†EH(ÿ¸¯¡1þrû›Æá°ã[h¼Õ²I—€ôEƒãt¹e“%Ë‘†’Ö!áú'ÓÚX«75·©óÓ–÷ù¼œ¤‘‡pÿŠúÁ÷wþ³ÿo"XKmß9?ùÄ73õ>Én¯ERšƒÉãZ!€9˜ööÔ×嚉–.6‹Ôú¿/‘U5n2ÌâyìyI†ñ1Ø­ó‰úéWk…ðùg’Œ [hÏ“ytZÔ#¡%Q“ƒ.N²~ÐdÞúlÜ©Bà~ds1¢ìJk‰™ „SaXz«’»'dÿ›g:C i\FÓ\{õÍs’Ë*0”/.ê+]<òRÊøÊ¹¿È]ŸÙFW{ŠaMï)«ÂEA…Vé_| ´x—¤m ¯n¹ŠT³Às®˜…À¦€¦î@¤$÷Vq蘆D5“÷øN2˜à&Eí2³­º›,I®]¸Mt¤†§W°ÔÉô‰!ÐÛö?P44eŽPù~É'§×T?‹ªúù¬}9üm5XŠëÚûâRY¾õÉKuÄÑzÜ^4 ªè#ê÷øzñZ5RÌ4/g­÷8os‹¯ämû« }Ýss3¤³Š– y¦_ NÕ@IêZ?Ð\¨9È’!Ju,øû_+H0g–*„_Eê].s©sN¤4°<÷d•vÄ5L*ƒ(%¤ÇN¢¦Çg¡ƒ©ù"T+סÁF‹³~¤ï£ݶY€}¨¢éÄ×4лúºÂǨJ ÊÃø®†rà÷¶Æ83+z†UȹÃX«a(d7—•ÛöÒ5€W±Äªª~4íÍ6ðQÝ ,”µÔïzí &†*k-UÈ•íð|r Ék8ŸM‹×6)f˜Ð@×õ<1©Kiæ—å63ÅŠ+ÝæY†ô¶tnc)Ã9‹¢2˜4sR¿KÌ14ºUýÍ*ÅúWåF/”Û»lYQîs> Öáø(XU˜i •»— 7±ð½€C”}{ üõxÏwÑ:¯¹†©‹Î6roô£ÐTÄܲ¹Ã[‚ššÈ!¨µÍeŒGZF7›'aôÊ’íÊË™tf„P5ÐÃÆÁÑ<ì#BWßîlU7LeIÛW«‘•ñ$BÖ^Çå`¥À0³B¸²änS––%ØGVe@i:sš¹–Aå1.*_;%?]J´o±D‰ž›V´STæÏ¥ŒÖù§'Œ I¼К¬ E欶ôâ ÎWÜ'ªÞžR Ä>ë2½Û•#sš£-6a¼`4e.e5xO •UÊï¶Ý§ñðW*y#ˆ‘tLM+Š]²ÅŒ jhÏpwÊ7,½Òg“÷±þŒ9…áê´›·5—-ûsâQ“CvÅ™À˜Í–¹áì E ‹ú 饫³ý™÷ë¼ô<äfÔ.¶—ZT¡r@uðîz83XˆPþ4 á(½· !ܱcUt5ÏÍZ†qNè*é›rõÙ™–“3à0~=µ#`á&†:NšCÆ« ÙâÉß[GÝhH.¿Æ>’ \ñßB•æ QÞb½”cÎP»Ó0^– ’QÌk`bVª‡×¤"céÅmP&ƒ9t.ixBr†DfO{ü@ÙsuåAÎxâ¿ùh£ .nÒÏøÖ»f…ʯ‡9»­‹·¦ÛßÈq89FF?`¸yáù¢X”ÃÚýÿ@Ç’ÔÙíÈEYXóñ$EÎä0¦ñOÞižÃÓGà>ÌL‚@ÓëûC©ñìÝž~|úSM{5™ÿ9øîkÀM‡V¹_Nx˜2¡¹éõƒËUÏ!b$©‘|àá·ç±áâí³[P2Ÿx¿ÆybMðjó–™ï¬©^„è—‰2G™ƒ>È“‹>ݽœ×ý«äF™pßlĺµD¿*üsòø¹ àáGÀ«úÿÝÏÅoÿœåþÀþÿÏiþün p¨ÿ¸ßÿÞî™Ãæ €2Qþ<$🦷µvÚ‚—.ˆ}š/ŠvPEÝ¥œx4®ì¿Ì@€™Qâç8àtáhûûÅÆ´Òû-}aYË­lº ×[õs¢h:†ïƒ;ª«¼Hå˜7Ç6þ0qa¬[»É=‘àsÛMNcí ìWüæ{µóëmµ{²Ú/ê¾ÎÈ&å>Ê:å°ŒÕt¤þ°+ë¸ÅªÔ¿–ÿÓr^±çŠîa$^›sûÝ HhÍÉC<¬Y ×–ƒ|rϧ™ÁswŸò b1<òþíI‰ã˜a" 1šf֨܅".eàÖ8ã¼xw,×ÖÑÅεÔãIY†½ýOÔ_Ä‚·èZ˜ŽJÅìîͺ£f”4.Š®5<ˆuÑ5G,ÁH­»°–¡×‹xïäÞ—Yv_u`µ!ÓJ¹cU~Y:€ü³ëê¡&ž¾ÖL«ÂíP~ýºKMS*CãJ4. UÄ/-ØD)×um-Ã`ø‡DûŽÓ–C°?Yƒ²Ü“q eÛVºÈ<tÆ jE¯g…;¯E¸ü9uõúk›êµ¤ºÔ‹w77· ?—çÓ øÕÀ;…_š‹z;¨>œˆä(Xºä0Ÿzõš ¼ ÷£**f°¼ùܤŸáÙüÒÜãd¬eX„¼\62³¨µE<(Ï´Ë*f<ž£Ò˜\º»:–RSáf4ˆlÿÕK4ºËÑl?T?¹’'[`&rÄìÚ¾<à¥ú„bÊÏÜY¸h6¢Íug(L»Äå(“7±mtô;!²–ì]Ü ð ¿TiÔKˆm[´SLT´ãvB`An×£¯ð̇Q# ŒÉ´g„6¦ÔÏ/õ¸ZT3ûKÚöáŽë[ÝN`"j{7¼’Vk±FŸF¤Ì·î7zæKE¶ÿðí3dšÀghf´mÛã/Nòš7p,åe×´]ž¥ñÜ^çµLOàøw¢à9ÉÞÑSFõ²”J‰Øf^…>e¡ˆÈ/U]!…Û§çKñ‰Y°¯Ž£;ÿ¿ÏÈ)7ÄðÅ1T¿2>hÙý„ñªs8|x¼{<6Ôž|2¡ì@æs†;,‚!L.†Eó¸éz?h›ÿ˜Ã78ò“ÙŽ¼+™"J • ˜Pê#®@ äK èf·M*Q”Ïxfm’ï9R>‡Ò_}D r'—2=5¤’ÌÜâ·l¼,}¬¶K”5[¨]ñ{·ÇÙwø8“2Tª²¶«ý–™Æ­PPÊÝ!cQä0ê: ƒjÄ£-º°f±;È#­°Åþè7"øv‰ŸxÖÿ?ü÷Úÿ_'|¢ºÞÕÿÿ *ÐýiyiŒý+ >mÏ8£š_nwîÜZQ6KžSÅ{Ðq`Zø`ýÏ£òÎ-ûÍUñOÑ~¾ UÅÍÑ¥;'¼¡ÃÜäÞ{é*_Dã5\Ú©ïëËâ1úîlÇ„=pùq¢]k™y* ·J¶ûA-Ù¨¡¬:ÓÂâ-ˆpo‘•”k—¥††¢#§[wHݶý–V„* XTª§=TJnc÷¨Âë‹TQ…«ó jÛ»Ó4â—BT´]c*·úAVFÖÔ¢ÂuUgï¨à"튙 TxÙÓ&ØÎE‘-› k7ÅŒ××À‹ 6M *ØÞT-̸ ÷Eª,Å¢‡å®Õ >\­Bú hƒ·-ˆ‰†˜WF»³Ÿü¢m3ª©£—Q‡ˆ&Œ›B£©ñ,JyDûI^4rd •âóHþ³{Ýö‹p›í@³MÛÂO”„6zñm‹bE5Ûê¥û‘´ W‡;–Y—ËËè›…,,(bò§0¦Åd‰ì}mCL¶ÇQà2~”F±½å†lí—4ëv "ÛèUáY´ •îUöc”ÝÄ}Åì¤Ap:MàÀ~{ÈÆÈq)HG º½^¡K— ½Ywïþ’›Ä ŸÓ›§‡¼wÃÃd„‹¡(ª+õXX{Ð<Ðg\O[BÎ <fÒKz°QãÉ› $v«þ"Û:JxTKfËsq;NÞI¸\ùúlÞBüy„U³S(¡YQWžã½ÀUuM·‘`ÿ ß]û ‰š[Ї)e²pÉv7ç‡sÒî~Cu3³ëG&_9ë^$rÈÓûÙpA€Lÿßíè|+„d¥QCˆ”ÂáþÜ5Ïá$ Qf0w "Í.¸ ;GÏ“鬎“î¯Î¯›%ëвàèˆ8’™Õ[ÝÓyÛÈÔ+m®…o*¾¾¥Bë]G³êÔä'µ–·ä§âP›“yÆN7ŒŽ‚¼UÙæðÜdßvôçnöAð *U0êèÄ©ñC“.º;Þ‡&>6ÝêªÈOJ=YˆC‚ÆP¬Q2)›ò9TÔ#Á£œsTõfº"iRò&“þÕEËèÂ4޳òG±¥™³§øÛš‡t˜bJÿ&žïð+ägßç–qCp”kˉïTC&^€•x+§å(‡yÌÓFþ&€‘ç#É~ ‚ó­eû7Rö³Qñ‡²;~&ÓÿèÿñOþÕêÖø¿¦ô?N%„ù¼MhþÔ|ŽÜfå¯D!¤ÓÆŠñà¨p8ÂÈìÊ}ê|“ …zÁŽB”YÚã”êHÌŽaŒž~ê©[^Œ'ö‚`‰vgL´W*hWñ¶èÍ+!º~¨ÅV7ŽWdͬ2Ïü›0îJ2kÞWäUöVF,ci&{9ëd^¥ü[`þÍߟ¿- þçåpwÁ)µ»_ÓŸÂJ•òb"e@)ÖSâ/Ö|=Ìý'kÚën2ý(ò•ôÀÖY7­ì=uü p8ý]fõ(ÀÌyÕžÿEŠ•T¼9û‘l÷õ¨·–›’É@zl‰ö¶Ä¸ÌBèRR5ÁÊ*â|ܰaýáÉ!PHzæ¾Ç+"öìÿFµ?PN0ny¬°îô3é.ކTF{è& V,7£u:¡óYìf´Qé°pÊo'Ž6gÙÐD›”É%óQßìúÚÀ$¡žf;NÛ¿’MH”T1_SÊ}fb ÓŒòCMI7½Ø ›À‘…xíe_q¬w Vfoð·©"¤B!9ÑàÕÚ³‹¾ÀÛ’wŒ›±T†ÿ;›mMªuÆzhM9¨©ßIùøÈ£ýåÖÛ–æ¼¥f’DçÔ?UÛ„m>g‹©ê 5fyÛ[Yá{ß¾¬ôÅÑ:H-O%°9ˆí¤Xwþ‘Bó˜QVfä¶q!Ù°FøšBÞ䡚ôDLìŽ|ß’æú‘[ó«4±,NàÈàNIðYªëU Nó;-!>]zˆÊ]%Ÿ\Ö¼wŽŽx#ß—–‡#žD9µ• –’”š´‚å•ÀåˆÔâHDYòih êsø úD3œu,­þå¹sÌ–¥"ÄC®'Ž9©äÈ n<ý=í{¯Ÿª(¾ûoÄàžð„7PdPì¯#³9ÕÚY^7oÏ P%½‰·v«—G+Ñ•ô :+ôîëõ-Þa#fäÚ{Äi·?õ9ÐßT ’ÁaÜ „Ž^ê!OãO8Ï‹ð ÏEg˜{ÉZ@1 ú;YœÉÅé÷ NQŒ…B9'Oè½:r°”€¼s¸ÝN˜rf÷,9›¨ê–bÔŽùÊ0³œ>¼` ¦5jf7¥»åzŒ€VŽ&›yŒ!Sfrä˜*Ûnugó`0Ô ‡nyô¾éJSü{ä@nåŸ<ÁXGØáD¨ÎzÜ<øNqËiaÉël04“Cµ¨©àiÊÆqX;س Wø¼Ôy/,ÏýÛ$áY]ý¦CnM kq…|ä~G³±{C1“&\—órpƒ%SlÞ+·ÇÉœ„ð»7Æ©1݃|ëôý^ýï¡ÈÝIü„ÿüÌþÏ›”Ì?0~øš(ü÷kèOéߨŸùûÉnðâÓÿp¿}ÅøãÜ÷yú¹!.m­°6×¾RzdÚ!€è/œãc(º:héDþpUå®Å Á ÝAŠøÑxDD $Bxå˜ûbt!”þ||ûšúH÷_…ë¶á@ Î8Ì.ù0‹@N礨©¤ïì%lÑ'w™Ís/kþ¯%”Þ°²|$žÛ¼l@þU J¸/Œ‚­4m»Ò­8VJ÷ø» 3èºn¿ŽL;m`vBy÷zÞµ¦è¯ª–†Èªðõ¿ AåÖÏßþfFÇ&hmÜÃI.%èÿ°Ì%¾™÷¤…Çiø£r5 ãsX©_œ&ZJkOßÏM‡—j¶ªÑTwA ‘¬añDÀ‡Ü#ýs¯I'=0㘌Æ%ª0^¡”#(S£Dë°mMU4G8-y0bËÊ/ÐãŒÿ2?KÐ3¶ÓÉŽ™>Ž~ò¼ìš§Zö ËÔ#¥w,ñ"ö%¢ô‹Ó¶¥~ë1H?œ!ï`{/_~݉lSªW4¬%§J˜2S "H£Þš+¥î‰l…ßO }`Ë%çWò»•°~·ƒºL@ IDATЇß>n+ÐÒˆ;1]i¹b ·TYd|_J5ˆßý0€hè}\1_¿×Âçók_üÚ_>Ü{¯µ,áàkÚ[¢}è$>xØnºÑÿÚ—ˆÑäÔt3›$µž‚ážÖfþ$d£ô8z¥@…oð™X´h¢__WÝ_·TYoâ¢s3qbB».#÷GÕ#†VÛŒKˆð“³dó²í¥Ž+/ ^& k*…¯ØœºxmðN”«£db˜ñ³$Ê)ý/›«®v]&ÆÏ~A¨¤…¢gfÞó‹…œÄóúïWw‡°mB¡®Xæ¸}˜‚åH%úBEu))²‰_ºŽEq‡ódÞ<ˆµ°téZÁÅ·ž‘”Âk Tñ€Ô“ˆÞÒP¼×7_E„Kd±ÇZ%‡T sXeöŒa\é17Yª"òÿÚ^í|'©” ÈÜ1²È^º+W¢V6ÙÆÒÒËQvn°·?¤B`±›k.ztâ(ügúûß4Rm;‚¦N}ŽÔièËöþ»éÂúµ$ªé£!ll&PÉ("Ÿ¡ ›Ñž¹á3é{¨Nh~ÃQãΠ¤Û²6}) ºiÍ‚=ž4Zt -s§siô×°–8ÖbÝÓ`C÷Ï{ü¼ Œ/G‰@_”ø€ñÈœ_J> Ud9lͲp|^MjÆR±mÛ±ýÒ´é¸ä°ØTJH³¨¹WiN_¾­Oê€íÏbÓX R¨M”™N +Õ6³¨ò.ûr&Œ1có~Q ¼Æ 4ñŠa£^£<$åƒèÎ"“t’ä¬x ҷ.äY§¥lnŠ|o¸†y†ˆpI~¸n2×!¤Ôy9Ç!ä â ѵЊDN‡« N#‰ÉïòÔê|fñXJ>‡·‘³¥pÄ‚Spí½TY0 ¥Qˆ¼ÀG(éY7[ìI9—‡Žƒ)f±;ÏÚ~*-Hªç'gygó&:²?qPz*†¼«rଆŠA l¸³º/jpäú3µÞŠ1{&уVÂÑ15S¤Íï‹oR}= ¨ Pr„g;Qö¹ G_L<¤ F}’8>É¡íwKB5Ut¸­bKÖj«‡0³Y[^îbðH 0sN–³Ã„ñœ¥ir>d…(8=5ãŒKXõ“vWJøå‘á(”÷6éŠPÈéø¿gæ‰)Ç·A°}îø6Z Ü…\WœÉâw:Ñi{ "à›ûÖß)V™¬øbÿòÖz€[–4¼¸‘«m!RŒ/SEÞº4c¤7¯8ä-ªÄ?¿¸7EâÉxêùo4ñÿÐÿŸ¡üO”üþ#¯ÿ7—oê òûæL gV«üNµ–¤8Bêéhß «€"Ÿ±îhö/&Ã1þ.H–«PE)P¬FdõОå '"£nP—Ÿ…’ÇûùؼÍjG¤AÕ^ œ½`rküÅ8~9…aTɈj–Ï…SȃÌÓê!ÙnIâÉAd¼1ÃôÛ¾®G³§áUñ§üaV‡¿”âùGAì!¯ ìK%†K@vý7ñ˜€Þò.ìSÆhž¾þ²™‹òý¿ÖÀgéÞf{¿ýð`‘¿ÄgùÓ³Âmõ©¤§Û*…ŽWUŽ†Í©Ó$Lýînýùî–Ù`rزBüwM£Sj¯›–¡\T¥ª»7.Ey-]²)ˆgV<»…8Ê#wt5i[½¹TZäæÈŒêAƒh~Ð܇„.´%Ê–éCõ©Ÿ© øÕ×P™è™‡¶ŽKAή&q{r¸ŸÇÅ_´EWÀÚUÖœ\9ŒgFBlsÓš03I¾Cóê|ƒ¥m¬Nº^` ÛùA1~{íVÍÉÍdRRUŒ¢F3!Œby[†*¬>”Bj¸‚«K]V»h÷åF5:ž³£Ï¶Í&Û˜TñYÜPŠêÕóFóùÌeø¨}DXªLŽ\Ð|Fû8ÓÿîÐ*»ÐŒªII7£m¯ÿ.D‰`ŽœÈÅV3—˜´Ä¿Hj¶¿po§Ž/3Ÿ’Šˆì½·´_›}« &²ä™ (pŒAŠŠ$8 1r6˜>¼ˆcd•o–c‘ÒøQeîw£ŽOJãÛq1„bNã¦Pøñ,f!ñ|8Zã™áÞNIóDâb Z*pëŸÂ@ yr Y)ê¿OĨ”E8‡?Òl°X&j‹Ø¦ãPó­ž-¥Ò„é8kÜÐ9“¨²&î5^c=œË0À†ŒÍÄä¤àDó¦ê¡St€åV+žZœ~åØÉø©Y¾d¥L2žÑR¶cë8g,hN%«ŒéyÑS›XŶsúÁ{c+®<Ì è$•3×f×fg Â+f™`¶)m#‰°ñ¼(½¥¶öì¹B’÷õTTÞoü‚Vä䥊˜AÛÜŽyÌ>ŒWì0 ÈhdþUFäu±’HP¨³œND„Ò±‹UÒÔ4¤Þ»\†`W-§·Ô¹_-–•Ò9 ñfî;­´÷~lgj<÷ëÇÞžs»² Å~‘ð : ŠG‡×ØÿÖ¯©~‹á"õ˜[=J;ë;¬°Qý–Ú7hv˜Bô–„9š å$Ûc΀0˜_äiÅÂ?ÕÑ,¥_œÕœÈ•(ŒïXÝrøÅù&ï<ì÷JÓäà`¦)ïê?jT·Èqñ”ðæ{VéúEÝm>$N`ú¦oÀ?¤91ñˆ~–©sV.Wurcú&d6 œ”^4ùÌàˆBp»þn¸îósZÃ{~ø*Oó¦DG®Ýær<‰ïÃì"`ÿjw1¢°_¨•Ñ›Ä,}ù忏fަ©2žd÷+ìQíÊ6NzWMœµ&mïŸÃ™ʼn¤Õ¿zSxzèn‚»¼LN»ä¸9½ wý¦Î½Um=ø€wÍÉýááïÜg–Ï<µÜàäëXàeˆ—HË7öÿ …ßóþBýïó¯üƒ£ƒoet¾ë±¿ù!ÿ±é__6å}úóp÷Oɇ£ŽQZ–|@ÝÊ¥¼éÛP?á ³§ )ðùý;äO²ÿùhY9‚óã·Pm©ˆ©.ŽÖ2h>$ÔŇ%sJkÔ÷'1`gµ#PEÑAP=ͳ%òì±Øöîh²äcx‡Ný`N@õÌ.þöÑo®ï;ÿGª˜mŠ›ãÜCiLj›…c4DŒ§bÃhÍLÓÉï“ô³b³›UÀY$••ã§ÉÍ™Oé8Æ+Q•¬75¨Gj<çö€S{²ñ~† ‚Dµ['¼çMU.‘=Ð4"ïÜùùºfóv½ò?åFÉèŠyK9$¹Ó˜² €jT=‹7Ïø£¿,„Ǥ±n×#…Qs Vý ]bÍÂÍÜ;4h¸©H²[>KøÌÛqÅh^*&>'{TjA¯Fç4®Ica¦;yoû,Ë:dY¢bÛ.(@»Ì¾6m{Ks°Š®ÖZ’ƒnͽ‘ÂŒ.¸%N©Æï†cÁ¥F[¯ˆè¿òéɹ­6±ÒŽ\Ù\sŠ˜ 퉦÷7æWæÇõqw«jô"ªêÈäTã¦k¡ aK“³q³þ¶Ͷe¾À@±-Ô/'^öÞ—]ÌNu 2yÝ0K§wÒ]‰^*ø@®ôͺÇW›“ߟsyVp¾}"©µiÛò«Ñ¯d/ó¹ïŽTv­*Þx°ÅÔ—¡QHÛ!ÒG7½g'Ü–OB±É5VâÔ̶ “4bæ8j`Ý€¥ˆžã| D6 •¥1-³\9bßç7P þýíÕ,F¸1…µ4[rãO-çÆ-^ŸK*°ý‚£žÃ‚©cQÝ–Þ¯eö=!¾ÓA[—ýÄæ8þQ¹ö6ïæm[Uer<zã~r·W ÷ã8ÁhÕÈñ¹â@Zûë.• ü²Z¦ƒî¦§nKð/Hcå˽ý4`#FéÙêSh›ÄzÄjЬùŠ?ÊkIÓÕ}»Ë :Ôí&Zë“wÃíR)I–’´Õ¡+…eh¦%¸äÔ¥’P•›„< SêBÍÙv–§(9d˜÷ »Z!b±ìy "ÙI’W å¡Áåù„Mš|Á羋Ýêê?r£z#>fb³{VsÇX­‘lóþPíkÄG9Üâéq9©õùUgÀ„ê4»Ñ_q”"U`¦Däü´³£»¥¾'§hkpaKRC 7b#;ŒÍáåŸÖä Õ÷t«D$^d$ª‹?·‘“gÓH–ÑZF*$&û³,,ô{vÍQ&Ⱥ6 ÖÕN«»¹v(8”Ü'tš‘Ë?°n¼ qÇ¿š$ tn·YZåÓ÷Ñ þŸý–9>Àc#Xß'GÄ“.zð‚î ŽNmôW[ÏÁ`8v —Œåô®ƒKùNpãpýzNcÛéïÅZIñŠ::Gé½B8nÀG…!åý¿ó_€A]aήÜ6ð¶YùæNÏÌš—i½„rtÍg ŽêoÈaàÇœÜΧö”áP7«{î;(ÇeƇŽÇ‚#Îffô²JÃ{ÙèÖJyBó¨—¹öæØŒ¯DzM¸PùàÎajMÕãßJ¾ÍG{UÃäÆ0<Ã/r®î¨ž³ìPïbüy}tœc€ÿLŠe×Ýç½AGMüA5°‘¾‘tÇ8õ›Åò) >ÆߨÿàAç«KVÞÍÎü+¿âŸ–Ñå7꿼µçþ4ûðÏŠûüS¾ËùgÃÉ뀆ß{î)QÁ¹uäSÿ=½µc~…ÞJk¥%-ÿþ‡&²Xõ!^ÖãŠ|²35z]b{ðû4›µ*0Ú>Ôû\’ÛH4N¹Ç3IÌ.Ú:zIVÍÄf‘8ÁìñÌ4n~ìEò 4Ì;¡Èþ<¾)=tL€ ôOý úÇÛUËó"Âoó"ÿ–aÖ'ML-`›é\$ [z±Û† MÏ- €¬óõ%UÕOøÊÕ¼¶²És@.Í|·ò, xI•yˆQîç9Fœ Ã¤•ëŽKmSíåóÓ0+Kfýç T8šÂdx À£yÏ1ôÁ…„ô¡¯j#w ˆæY‹`WE3Ÿ¸ø—9Þ››üæ. m8M„C2Öý+Ž0ô.óObÛã3”è¥ìZ¯œº`øÏj.x;ÇŽaï,â'¨1Ì6â—¬ýö`U9Ž8Kˆc¨‡nÄ0s$„i¡ýÌÖëpü^v”/û‡yà ±Ü,.§R k-1„ï%ké0èSÄL\%ˆþRô£²ÅÙÖ!Ú@Œ°m_4Pt2î±»V§Ù¢Ã†a?õ3dŸÇú|Ð}ÀÍl›.qRæAU¹ÍiZºH»® ò ùtÂλÞ1ýþÔ @·Í”ÝjY)×µ Ç(E¶íÞу®þû“m-§¨F´f›Õ¿<ÁS€!ùÁh×e"+R’šãƒ…œ ŽTQ ì—#T¼ÝÞÇ/4éÎBsåârÙyäsZI/£|"©/Ò<A]ÕÖøÌÄD¸÷¥¹ã÷v äÂ'i¾qéU-Nz‘U›˜S>ÛÜÍ‹ò|ˆ×Iˆ,‚µÄ‹,Oµ.•ËΦûçG`œB…lßÿg)«»™_fYº&ðluTL¶Ym4T5K£s1Žòþ9ïü²Ë¶­ç`?ÇÌ1ª^’”ý¹t˵?°Ë¤&ŸhF±½wµöº»<»T«è¾k–š3ëðZ¹¸úlºØ=½ß>Þ*Ð;7’;Á(ùxŽâ¦nÙƱK›áÜäóÇÃß”ÕÇž¥Èm'êg82¼!çc‘!hÖÇXz°ˆ¿1€d5´ªž¾9jžDŸÎËÙ¾Ö­qéMºޏNYªr؃„í¢bù†_ñÇ¡îVÈo•ú)nîå‡\w2Òõ(¿¨‘¨;:èá¬8í]çìÄѦùú}Ë(Xf‘ôHÌ+ü6î _­Ç ® ŒÜí?à!·"†‹{:`Â<»¬ßTÔà¶úP®°àg¸ ¢ÌìVÿŸãa.ÑI™z‚obÓ<€²0pˆ]–ÎHŸïïbcOG©ûPýínSŸ´Ãw¯5'N~K¿:tÓ³ëàMýŒßŒó.ð핎àFÙùKþ+/ߨUòÅ*šõ³-åNÃÍÚ|“qqçE=¦¿mIàˆ§Ü>·â„çŒå¯ Þx›íüUûÿ?¨þÿîÏ3]õ²ÿã/åžsлܾ‘Ÿ~Q8§Gz{ Ÿ%Àÿéÿų̂ó.éd½=] ´ï'u¦"P¥Ýϧcãvµ¢VéðË­{¤IÍ •+Ï,×îe¼p³1xÒ2g[‚ÍN¶óüGê((‡¼yTëYØÍQ“HàhE¤LÞoÙag*D S‡Ÿ“ˆ1î§3gu3(íîcF@{rO öCd ˜9Û”gG§A.JÚÏD‚s‰ó¥Òküj R΃¶k²œÉa÷TÑ}‡?»i F¸(ôZÚÀ~Uà»È8þ·#D Ç¡ „, ß$QÀR‡Ãw#fÙ£¼Ì×2yZµÄgýŽâ¬BòŽÒm—³²´ŠeV"¥m5 ´o;ã(mó‚àã½Ó®u¬çMIc!œ‚Ä¡*ºü¨¸».ïJNÛ©õúzÜPÈV‘-k­µôï_Û.~ñšmŠo\}oj¹‚xÐç "{o¸¦3¼Œ7p“²\YàŠUXUWÞf©.ŒfïšöµZu]Ü,ÙbÈÀ$«ÜI9â-ŠÂƒ bÜÕaâ8™€£ d¡RRæeŲø \~OEô¡¡xuô2„È(^Ì[@céŽW¨zÄBM¤°å²Õ¿º(jÀ'¤ 7WC°°–BdÛR±¾.¿Âÿsïº%;räèÌ™êóþ/{¦+é†ùaWg0÷Þ%©{¤Y«GªÊKdét‡ñ¶RcT²Í=(wÝV¼xQF^¾nÕp fÇGZC¡9Y«už.*ã7CõQ}@_»{6‰XòAtI9³*¢a'½5Jk¤»¤<߸ Åh›‚›÷¦ñ(ö2Ïf¾óÜ ØäÝêtrZðÎ/Ƚ[¨ ‚l¼Inâ‚ÜÜm¹ šF-\h÷• i7‰ºë}:$Bmß+ÀáÃkÃॷVbhÈ3ªˆª‘½ë£«?Y—‚$on$Aë´·lk[ºßøF·Ås3àGÛ²ˆ€°È7€’–ß9 £c4óÛÉÌÄŒ€z[µ‰möm~˜º}I/ŠExN²&¶"$`ÄbûòìÝßR»%¦ŠJ˜˜/‰«E=¿U8æ%œ›ŽGž|hEÿ)WÈH¦õh]ìÍk"‹Óy_œzØO>z¾{ÓOçr.ÑÃTŽÏ²@ô&>¦ V²ó…/ôü‡˜­°ŸCŒŒYddíx98.<¤ÿñ¶×jô£æÔA©_*㆞Ÿû±fOM¸DW`†b£§Ž«±Ú8t$^¼ÊÎðüù­˜rÐsÐG:dŒäδȸŒyÌ0 VÖÔ¥Y”7²ÎCìví1"l*|—è~šÀ‡ê¥§#\!9¹—>5©b÷Çá]Ÿq*Û¯ÄIšÒŒflq|#Ð&~~<2¦bPyÑê éÏÏëäOà‡ËþÁ&´.Hxý¿š\µŽUrfPkf0ý9Ø6¤ª+Ø­ã/ר·ÙŠq’hïaðË?pJ›LM–æ³&3®Ï7*yËærî¶´ÃÒÏ“ÈÙþcô3\æ(*{„ – =¥ZHŸóî;Ïwlº½ú„(ÙÜÂfœnÆ¡zÔ²¹ðì§ðÐ=ü…Ã+ÝÔU5P¸apœ-ÓêSô TÑ-[º²¨ll!µ§ÕзÔ#¹¿ <·+k•ÉmßhHݧŽYäÞFux߯þ’KæoÄKÓcú°ÎT?í( ‡v¬ –þa1—º.2·Ÿ3u\ž)ô.")=ndVÁå²ë™Zµô­ª·ÖvüBÛðÎV +,©þG©¼…‡Œ¶&¦Ò7Í*ãøØ¯å§F!LrꊄW8ÿX]*ÿÍïý}q @"vÓÊ ºâÿ¥‘È*®l[LÓJŽÒˆÁ²úWÇ/MEUyÕ×P' W&ÙGê M/nWµÎí­Œ ¹˜•âhIYah•0¯&äp@L©ñ°´ö$‹mûBâ% šl­•f;AÂ\xÒ.¦&dA±TÙ,&›”{Ëþ×Z¸•ãö¬°£•™“½Jà~࣎e"zïí3‹µôþADt-ã®E¨ä-b–µ¸º¿o#o³Kc|"YЏ Û¶?ý]æ6‚÷öçýµV®r#2µ©×bqû3«£”X=˜]¤Z‡^"€¬ìQèá~i@ —?۷饕¸2áÊÁ·Y¬NàEÚ\³ì¹Žè9“õNÍ_ºm)›k (¸e¸úñºA6—Æï}A-iu…¦qØ^[W2o‡ë©¯¿Qa2{ IDATéQ[öA”¦Íq’Êc¿(D–Ƭn¬1¦¯'X ,µÛd›j<Í Dls:´²iƒfÜyÈq¦ÐŒ=û [¤]!<ô £*ý½] á£Ëå“ÉJŠçŠ »­ |aLÉÂx2Cà~Ý™OCÔ Ûša©¬«I9Lç‘õð^ˆ„}{I»Ç*Ž^RiÊÇÙ6O:ÕÁ/·2v»%:3£êc¯ÙþiK`þEŒM†?=¸§£½+†mP±0Ê#Õv;4‹ûhë­@¥••0Žëã9BaúËå#32u•VŒÄƒËrn¤126ì€ÿÔ#·:g<d”bŸ£Lñ¯¢‡æV²àóÍôýGþ™YŠ=®½öYVÁl&NP"Sí 1pDÓžˆwßëô8Õ€%û4“SV}vï‘”;©¶Ë¬ñ*ÛØ>ÅÆ´¦UnNnAµ~<º¯ˆCñÂó*hß'Â-{|Ùà8íùÏÀLHûá?«iš‘/ߥÁ¹ áèá´QÖP8›5ªšƒU©rt+÷9VNô§š’‚§Ã¹>õ œL¥’¥)ªñ½N¤36mïTÍ»Ïy@À)–L»ûzO­gö}rù׉ï­ßá~D//Ò!¢ì׺4ÞÕWê`žŠr¿+/ܧºÔÄån]å”YñaS$ºøQÒ;6ñ<ÏžHœ¡¿&˜Obžr~øuÏ?M1ÕãÑ( yrTrü|ß0:qITµãàÊ ÝhiÆ¡niõ'±F~»ôTø•&˜ ¯·|]KB´ù^q >ÚF¦=çЀŽRvnà8ŽW=Ðüñˆå$Ö‹*Í”^˘¦ŠŸMTÆCéò1t°·šËWMŸ¯èq<+Fÿ†ÃýÃø'5ü™þ|ª—Dü­Wñ?Íÿù ñÿqw½¥Bä·¥Çï^¦ “,RNkæEH‘§è‹õ jPùH£5iBTØ>›#ÌRÃCÒŸÖs§ÑËiuS”B6ö£ˆÃ&XÏþÕ-‚XX+…`óà† C+h ¤p§éXs®ÜÝl&ñM{K«¿Z•7×oè±µø„|ÅþyÂÑp‰p~Í/ÔÿÿÕ1À…Gv®”Û3´ÂAd@ƒZªT1€pájw£™Š·ŽR®°Ò!=½·* «º…³fÚ¥UÕ¬·±•ÊtÿsxÇk áßgõM–¤–¾à¯3(^KX~šøùÝ18¸®5ð²çlê1‰Uüæ“ó¿ihTuôóÄý†“>ü0ª¨¬ì³w6-”Þ@а0?œ&Y鸔xcCmœ0¼¦V FOÂïÙ`iˆ–ò<ã•_»q¥cg„)®‡Œüº .—¯4Ûw?q5ùé:[ºtoÆ æ2J ð–XP5нW73‰£†·MF²H–[µÇñçù(ÇÇït-L‰w’º%P­U ᨠ‹gjá@sü}Uã ¶»Œ*׃TauU]K)äíçVSÕ=®–a¡íŠO×°šHUþ = ÌQ™l±¥ëúZ—âûZ¤Ùm÷½=¤†¸œUÌìÚÜÞÈô‚G‘\z‡´Û,­»žé¹Cýw!Ú €<)™NÄK´øqÐÎZJB…[­àg R¡«„¢x³­«®Â.t Ÿ$m…án©KcäήðV‹.áZ%ã6…|©ZRGŒ¢¶· En‡‰,­•ÀG=>E4Û1丹„²ä¾-´ïz×¥tŸW`;÷¦mkûõ-Û÷öñá½oùK®Ke‹å+ò ²f>b²Í@µÅ X –Ù0+#!‡îsˆJâu²nÑĈ¼}n–Ú÷~Êþ*vSƒøu]Bù¶í×Ö6_DMŠ;Wg¯ô¿£ѤB³&Ò•A ÆVûœW’?0õ<©÷²÷á2p2›açWÐà”§ì<àÕ‹K:à²:XôñÈRËœ$s@"h 7©T¨¶·ÿ<ÖUaËøb¡?SRtáþö "Ûl&Ó‘¶S#Õlcô.©IiW~Ò3l;Ä«Öñ킸ƒ˜D!—vI@óc”Yl.d;°ªçcb›öËzY·“º‹MÍÕ ôyŸU9êc<ÿµ¶íš1(TTtw§ '[d˜p 8˜Öžº&j(n~´·’-ýÅðÍ'RèþWÌ›s‰åÐip¼ÚÒê~gàÿ9õÛÆ×WñëÉÀÿ4ýÿeð²Òÿï ¤üÊôöEø¹ÆU&•æÍ}ükõÿ‰{låÍP[ùÿ½iT¦L ô˜P„ð4wŸ«žšy>¨ã‰º5|FÒDD®+W)•ð‡Ž_WKç¦`±ŽB¸èï»óZ?]p¥ÿφ´JóyصøÌ|€‡rÀöU¾cÕ"ÇþXºã·¨mi`>¬Á/w Æ®çAø±§Fûöÿ/&Ç£e'ٰΟOÓäìÀ†g?å’|ZÒ?}óaêW¦ÕVÊŠZ°äš¡;¸»Ó¹-þX%xD©¦9ߟ{‡ñÒFÝÉtdm¦9§1’+Ë=5wâŒÒ­ñpwIÁÂóITÖP:~?½}>äÜÖÏÎ_×@U˹¦šydc¯•öüˆº37)º¤YÔèI‹`1*`=,œ!RÖÍ¡ç爫z§K:x¿NŽ€E„{÷Ø©”lE¦À2Ñ%ÖO\i$“Jì|-7MÓ³¹·e難o¨ÞxTQ¢Ò”o ^òXÚýu®ŠŠÙm&{»±r õ ŽÅ%“®je>ŽuŒ"¦XÍ=ŠÓ„TJ÷:tS±ô³¬¬pq”L‡Áùã±ýßy‚Q|\¤ò\Â(9Ôãu-’×õõKþºïÿ³ƒs"ùñÿã¡Uš)TV`žò}.)9ù03­T„W2Œìƒñ(ÕðïÓ%[È-’Â\rÈñD 1±`M[ä¿),àr[èÀNæ¶Þy÷êLý¯3¡åŸï«ÆÂ l´ÓóóÃ/ w–˜ÉÄçò5p òºŒší·â5³VãBs™—7±QsÂmüë¾¹–êM*`|ø`LÓ å~êm·mêÈ 8°éké_ï½7Eî(ŠÆÚޠ­1¢=U•¼í6Wel¥©{o .‘#[J•u<Ñß$µç(XÐ,àåìi?4>;†(D>Hc¾WQX­|tå>Ê|Ì}ˆà“'5ž`íø°ÆžÖIítHèjÅ©wWs1Áñ8G?†VKÍîÎ Â;Æo<Í­2;¡ùìûùôÃS›óÝGÊàSÞûH[üü~àg=>_ÝŸ©ì¿ Kýªý ²÷µô1xøßªÿ埿úù±ðçÌ{÷úoï <¾—c/}Tþ*d2ë|ÆE|4gìén©I­f¬îÜ^<f"¦ÕêLÕ%­WºcMËOü—¸‚/ªpÑÅMÉì1ÑFœ€g™—`)ŽR)Š,‹{/¹íê×0`<†6¯¹Œ|¾‰Î=öQ“ò|^æ„l ø3íÿÙ.É:J;v2=˜Ç`l&ݹ„…r˜æò å=¥b ï¡vªE¶ÖÕ.³2àÔ#Ö¼àÄUõ_‚JpPñúzGƒJ«`5ÊÆ‹ ÜÊœëSÞm¶hÍiBš8P£4C·ï‹ì3wXoQSH½{@èXât=¦/$yJæzeà • f§ˆC.Òeã‹G¥ãÒ^Å8Ô`ùhZ®“ tœl4|Ø{FRt4#X6‡ ÝESêî®d!¦¼2 Y³@¸i«ZKM:S³ãƒße¡~Šê7M~}XL›U«Òâ‚*êtþ9Ÿ„ K–ƒQ©ª¸T¶M"/Ú¶ K ò¨rq›Õ¥h¸?ߟ@ÌlÛ’ÊMÂ7q–Gn“Oi¤Ëyñ¦»«Ù½$fš‰’›Ä}ïë{ó¿k-RׯÛÀ`!ÄŸ¹Ó¼¡Eè§yI%T²UÅÌÑEîöé0ÍÌ\?UÁÓ¬C€çq•–¸u;]L1¹ôú‡Xñ¬÷Ô~l»·ËóYŽ±Í–^^‡ibD„V“àÔÃÆìߦìÕ´á¤qfQ†¬yóÕ5-ìêjŠ(”sSËç¢O= Û õY²h;ë½Í,=·T13íúmXT.`£Š¨J¤¿ïÿþÇ×a)IÙj 7QU\°mb­üDsõícñO û¶õµ4àÙ4 M¹oOKíEIHRÌnÿ™ªº ^6΂¨ù)ï¨`ÃMͶíÛWEn#Í–^8·‰–Æò»)KÄ(抣¥¿¥ Pƒ'çÔ~1$ìeQ‚}ÄÎÜÓ¶ù=“ÂnØ|¨n=—.ƒ:G³§ȘšýD±Õÿñµaš—Æ”&ŽŠÚ…X:Êk†@ŦÇòIëŠGt9lE˜Œ‹ ®`@L*Ñè¥.aS‚yåå!îúI\D,frè 8ÁàQqHûÕÞÏ) WgœãÌ&>ÿ¼0èQåöä»|V!^¡%}bÌ›±~Q*&”±µ~EÑïÆâ48G.äi/.Ÿ‡ÎÝmm}›*Û9ËÁKÌ)f¡l¹ks†öÞH® œþÅÞèaÀ0еÒÉWÅq¬²‰sÇ©6p¦!Ô03–îÖt“"5|äܯwµcð0dìzQ7K]”ôÄø p߃©  ô¨ ¶aéĸL³”G%§U›oÆ#,R|~uÜ™‘A- SGbQëR£$bNP”ÿ9hCß‘6):Tdí³‡"Ó:Ìõµ°`9FÏÁ0ê¦ÛÍÝa{HaøôýZ½âxüóCh’©Êü|hž:³¼8cz7>RJÝÅ}2OäѸŒGÚç=¨ÅÂ!~å ~kž2œµVÁÑdI÷±Pª‘}$(é3·ƒó4øÌxŒR0{ILŸp[ûu†®ªdóšæsöŠìHò_¦L8;xº¶û’ ð¥TLI%dn æ´¡Ø\8/¨‚ÉÕßT6±£‰šYˆ9v‹â gH÷æyTaLÊ´Q½K*ƒ§ýÒ¬ŸÇC£Ç¶ƒß£Ìûå4‹—›wF%?üß“að'¥ø¾¹xò)Ïò™ê˜Cg4 ]…µïèP`ŽUãL›ŠÌáÿï&ùÉþ€‚Á»¤øë· Gÿw«ûÿ,ÿçm`9w_˱ão›÷ÿÖX‚2¸àÏïõœbào0ä‡.œ7a{qø ›Ÿ\“ìø¯Z¨„™ üõ9ˆ¤íÑb˜NŸŒ tÿrL„[g¢«_9D¶é×Õû¢Ú•-m²øB÷¡« ¿ï„¥›³T9¸=8iò~îœ9ysÏQç¹ùÐæ«8v¹o©±—ìÖ.«q7¡RpùRÚÖ]›gNö·ˆØÞÁŸÉGHÅÄ`•mgÓ+…"j|’ÒÂúç³\”è_[à>Ë}ìÁF%!j²­&}çn¬¼>­3- <5{6W³ ªú6|´5êç¬%| ¢24CòóY‚ü÷ r~5 tU'@e .Õ{ïèþ”%awè‡Æ oö.as×\Ú%uS©-`vŠ µÑÞ”÷ßËÄFTYTÛ\ŸU¸+[ËL†ûñ*ñtÊ:c§ë-§­L‘Eh ›ŒÎª#öç«ÞbP™ ßÕù¿[V<5WF¶²ÅYçfóKT¢¯Ú3d©n³+ŒÄŠ¥"0ùó8‚ø?¼†ª*¶ÃfènN}â»3؆Àó<Ûp)€áÔkO«¡hiÔl£v×íÛÜZâ\Ž;êø{7wmBÍh4Õ}íýþûûkÝ®‹%*Ê‘àš!sjض* Þ¥éWZŸwâ?$ê H1`.Ÿæ }"òZÀ¸”à[ˆÌǰ ï\w³û>ÝØìµâ¨À‡ Ñ ëS:(Ô—M-Oó’:5®Ê&UÈíÉŒjë®Ç©.ãË ‡câ0¬5|gÊt R×uLqývtÊ,@— kAZå´8;šm;Þ k¤"ò‹lSU¨ò„Î6ÓµZÜAË–º ª8܆Iÿ2Òy~tËM,¿U©‘Fs×ö¶{·‰ˆ®à²×‰Ž‚m›{s¿–@¼&K±½®ùÛ(²Ä”4¨Ûn’û6úxqÃ3³°ÌŸ{>ñÒÛפ²x1Sˆy¤²·¼ÜyÓÄ`ôÙcšÙˆXC6e©ŸèìöÂz˜ÙBp¬¦ô¡ùh2ó±Íàˆ´5ãàÐÉU t‹âvXæÍ¨Ô©i8ýf­‚‹Ñ¸ošðRYºD±÷VQ? 1q?FÙ^¥ržìÎX´MŒ„n“Mj<ljÃxÏÍ$n+°ó°tÐ'ƒêjp6¦j þ~1€õ´RœÉ]¶’³±’¬â°aFÇ&93‰p2n£,˜–tãÚ²¦»¿, "B]Šj‰gõTNµw0½ÑJßÃ4Ѫü Ãq&Ô’ÏŠÿ?ý“hã@ 1÷í”"îו‰¥UñpëÀY^ûÌ; åI/‘¨S5¯˜”¡˜Je,ÈÆØùQG@'öæÖ:cô “dë»áN w±’Mv¦f5¥ðz-0 Íò9¨8á¿ _îTûç†E‰]®„è9F‰Þ%ö¤BÚN‹)æQÝZs›ž±M£„k±A˜HWóÙ8Yì²&QÍž|L ›ôG<*Ÿ„Ï>°Ýì˜Dm ª²»êÆÆÛŒ4×ÇnPáHJr60 ›ãüHéþ˳™íÖn‹Û쟨 (QSǼÀÁóÁJ>÷ÅÚ+5b°›ï>DÌÿù,FËG|åà…–i‰óÂ)#Fç5µÜ•ôá€á`úæ¦[LŸ¡ÍÙõÿë8,ëð’4('|^Ë„rxÙ±ðHݦJÌ/ä¦1 {ñÕSžF%‘C¿z¦A$éqŽ8]Ç#¹ub¹“1æàIÞQò®ICÞê6^5ü¬]½Èç§^йÃ×jÙ‰T¹¯Ò9ø|ÇÁm~ 5;¨ùß8<¥¿[z¬+–pR>jøž"òS£ã¤F¢bÅRÕ{|ØÞ)Ý{×I:àøÁÂO»†N<Í‹¹?Tùþæåïàë=¯wäFÂ:r¨5¶Ó#¸!iy”ËcÚqJ!¯’äIÜ;r@Ï«’Zíã}$`ð˜4häÚ•›¹‚cæÀÎÛ¤zºbò¸Ü;%q¦©±•œÏL#s×yL9ßHÍÄFU‹XHæ8àå–.Õ0àSlÄ#¹Ã_µú þž¶ˆ_’ª_ ~Çÿùg§ |õþÿøúØø5þýTÁß|Uüõ ~Ÿð)þ¾½”¿¡þã30pýßÕŸvtº¬··.èkÿL`*záëÏaå|¼94_Pó{ÿö"…bèö ®®¿½´+„®œmÓŸÛÛ‹Ps€;Œ©ßqœˆÆP=<ìí‚ÆNkÔ6¥-0/®·’‰ZÇüöîëÐ EnZíÁ«¾_côÏGíâàšþz|¤Tâý¨pK h>ö !¯G\5N­æG<ÍùÌ,vá ÏÉ_Â3–Ìó¿?þKoŠrz¡ª¶£p3 Õáïƒk¦ ÚEáq\—~ËÈÔþ…SÚ>¶)Þ y·òœ(äX­K¨œÛÒ@ŽÄ>Ó™XÕ‡ãÒ*H¢’Ž}[ ¾ %6ª:²÷Mð×´ÎiÌúæT‚…fuÔÇ/×›l½ž™ʽŸÓþ5éíˆ DUá°aä¿”˜¶Eãq@YƒK‰b`÷šÈê.‚<#VÆÄ¿zœ"V‘(êlj¤˜7N†šTaðp‘ñ‹êŸpÑÓiÓ+´ÑUé®Mý :ñºÄFiü˜¸ðÇôØ®k›iL.‰£¯Ï/žüþÞlÊŠþ[íûc¼Öö’ð£;4åZJWƒïûæÿÏïk­k¹ÓL—¦“fb´ÛŒv4ž%g¢Á'ùy,_Jûs‹È›¨X7Æ#kC@÷÷Hó¶-ª²t”ã}œq÷Šp¤ô@Qr»Éî6Ï6É6ÛETF|Ôæss#/ÕJˆFCFҸDz…Íú¦túÁQIuê•M£†¬…ð|M¶‰ûµ÷®ž˜Ks– #¡¥‚KgÁE›X#èµýÝБÁÞ+Áµö½ƒêƒm†6­«N@Hu)äKí&ɽwâævØH®k…½?—î}ïo›ŽÒ*DšrXŽUÁ 0úÞ;Hø(”mßb‹ÊÍ}“¹ :ÔC"[2AªˆAŒ¦Ý~£{1;†R]íâPl3P¤û¯[¾(ÞÛ¤€<Ñ6Yšµ6ægë>o1nLóÚòô€ÆÂRœ½½)¸³C1«b©Ÿ=ÛUû›)˜ãÎ?KÓ½½ª‡M#¶ÇÌ,ŠMš©E‡Eª‰Ò_e‰¯ˆ™}KÔF´y¿]„ãt]Ìh [Y +²™ÛZûÑŠ]t’»'(7Ø+ÊBÒÁ£ì¦"ÂÔݸ®°¨¤ÒŠ4‹éða«‡Wq]ê”îD~µJq  QDt2_TE}ú6Ÿ¿2[)›ˆÊ-+ Ýšò¨¶)Ôòýö÷Øâ“÷£AÆùæëI}Ïšh0m¾½FǾj{ÜõØm#„L‡õ'Ô-v¤Å’LÔöI™Ý§¢¥Ö ¯ÜÓP[Bx:-Ê5Q{‘öÈ£áÝÑØ-Bøá ÀÇ`à‰ë–Õâ«ãY|Ù}¹{MÂÚèã IDAT8,«¾s×¼íøt,Õ…¢=øo劳<ü#Ïá˜LúX§Î³Ë4¿©ÕÝLFÕÔØéÔË]έÁC:UVÐ&ô-¤a’Á¬CÆ <Æû²â5Ò Z9Š>ØáÄ~u•Bæ) Ô¦XÈG óˆ ÓDsé§Ë<£Q=Ycä‡ÉvÆ JX%ÅœDo€—Ö¨‘ÈžùªÖ‘BòMéS?)HrØŽÚÚCÁ8¬Ø¬êîãÀ\ŠðD_> ÈCûï'ܧ¤ô(u®?ý£¹àxvàU~"À9¦ÎÃñÅŠŠæìŒæê'• ï?Þ™|÷1C—Dâ§b¥çGð Kàu ×w]SG U"ypíe\ œ{+i…,vç¹±Âá .Ëëñ´‚òÇèY›0èB‘öºMäq£,0QùP=¢!På ^›ãwdâY”þò\‘ÝT” ,Ÿ€Y±QÈ:„jqÅÓÜ;íŠUlÇCðkáqæÁgè&õž—Ã9•~:cqˆag{¤ÉÂò11«8ìÙÈ ÕY¨xIšÃöúcºœz t†c ïçyJ›ÒŽ¿Ç¼©m<‘›‘Ï$ëJïeš>îÏÑE ¼|üõ?„~ôÿy•þßôÅ/zD_õóÏÿ¹ÿàŸÿÃåòÇßúµOäÜ3å<¡zqStJ“pÑ]‹MvŒ„kѽ†¢Ÿ&&Hi12süpÝÊA \uùjVGù~IÅ#ùF¨JgÞÅOÖ]×põôR‹U:â £“óQ&>v‹Rª³ÈǪŒUæÑ0S ¥¸}ÚÐkGs‰” ²<êu&388eó®|TYüÍ.œ620‡¹Âã‘£š ´¶c7ËX °U{-J}]¶ª{o§Gûâø 'ì¡Z>~ÂCÓ|í–ÁáöxÜ95­íŸãª¢õ‚œØ}ôw’Ôkú8gê‚Fn*TÕÍÄÞ8ZïuñÙÛ}Z¯pÈmý§T;B³ããr£(i”eº.6TEÌlôÀ¼U£ PÇ ]ÊÝmC¢•¯3‘Þä)vŽ ’B:q1]Ûý¤çüf;É­²Ž©É8Òì%÷'»-Cð£[>%âuð 3ð¹T©îXŒäüø£Utc‡s ·Õ¾HÚ9¸ñío¨"fê§ô§+Ž‚©¹Sn[‘wsBHûQ™Y‡NÇLðd$úkÅÊ|à•ŸœE”oëœEõÃMÁ І,WÉH¡Ý·mUK-(v²Ä6’\ëk©~oU˜^»·]ÛT3÷®¾s%í¶½·ŸswÔ´—é‚MÙÍó¢>°úˆI²>¸¶.bƽ ûÖ@ÚÐZˆ©y-”/&ùãÛl‹ÿQÎÞÇQ#.­Ã¢ŽãÜmæíé 5áæ^¤‰ªº ¼vÚI–,RDîMOˆŽ É?§å…éæ7w°]BAä®þ/©òǃŌSA]žxqµgçìÜ\›óYÉä\„UªrS¢GüÂec7¥á+6À j§ld·SÊEGQ¸ˆxÇ€.x^À;ºƒÆcrÓ4Ò‰+1òì{RLõëgø­k šwå€Íh÷}ïoÐxß›"¶÷Zªk!©×£­¯ä©Dø;ïui'¹Åb°,cV·mù&£ ð€ŽE5Gœ¼Y¥T9>ÅhQÁLû6ý‚K~»W™¶L13Þ°â4Þˆ-É7m>ˆ«ŸÉ;#“!3:±±¼÷5QYQZòìecÒ®¦yŸŒ'ÂÀƒ:  k¿¥ je:`’Ä¡‚y¦­s¿úém5o°óÍd‰_È“áS{°ÞRzÎ*¶Îñýqcý0õ1ˆO+@cµÂ\µÊV‡­?ʸ– –¨í»ªf—ßÌ:GÃäP“z{}¬æ­‘4:ßýq©WÅò£è/N…à°—G¤Ã³»ŽZ lw½mã?ö¶þÃaÓ[ï0ÿ›¹§³ÓIqX[Íd‘ðºá0wAqBG6.j>ZŽ&f©l £}§Å÷¾ìR¨á0krÚE4‡¼S´ryˆ• A5Å÷˜€±‘ S Æ¢ÃÒqѪíyÊŒxAm ÆÑB%û9àâGõÖˆa$ÁCJíæ2ªÌªËøAy?Ö%e„´5EÚ雵¾¾»})Õ¤Nkë8¦*6+ãaʱ×4Y‰Yúk¨QºhiƒñxÉóªÕÌbÌÎYEÓRÛ:íq|8à0Ëih&' éŸ»Í 1«Ôéeøc½ýyh-V«>ø˜Ø°ªC:ä›,6\*'å`C ×tÚ uOóÖÒ‡úÿy¨.Ðç„»þíã½~eÿðãøG¾8;1’»Ÿ¢gÇ€?“Œ„w >¿½ËÓF—÷¸*ä©_ñl8^§­úÀHóåïúQIâÏZ?DÂYR!?Ú uN¸c󜭟:|5©W—žÈÏfßóõáRGÇøù¬œŒ<ƦÖç—¥5×ìYU·Ì|*&,bôߎWMP»‚5Q~°qytŸ`„þsgi2l‡]É=½_µ1;aÃðkZGs˯=Ö]®÷*aþe8ïj¼H»è{Y <. }wŸ£GÚgAXñy£ÇœŸÙ‚ù O_u¢˜k<ì© ¿×D¼ñVc—†2>Ÿó/Õ®‘7àÈ»NާTù/ý‡?­œÿ.“ÿŸ¾ʇöõû—þ?€úgÿÎGÜãl¬þøµá¸x1ÿ'ÚÀÐ’¶ËÛ/­þWUdm^¿Uº4w…Œæ{z‚^ÓÍÀ€U“0”]Öä¶,ý‹²Å=Ç•E¡p¥íƒÄ4Öµ2ß6¯Sõç`ìàŒï!Éj ¡…}ºý%¸kncäùßjßÃ~{ýö¯ý71lc…>8P™»?óBgÕ^Ñ›"‡Œmfãg(eºýS7Uª™¹¸? =O¸M¸„“(•”—Ñô[cƒböL½×p¢1‡¸9Ø夯gþit “ iR¬ZÛK8Ÿ¡>D4¦÷HžçZnL{NY޲ë{YóWå`ùcÉcðÙCÅЛ%ÎKÅR½óg‰Z’û³0 8ùwùÌ03l=^îìn‚G†Ϩòë‡å 7¶Û%yCk[dŸëÚ;É#PµiËÑW$¤&ö¸pZ6«ÒŠ›¯&Ïâ˜Ä7“elëÙèL ÐX¾[¤”1­EæÒS|òæÝµ5ât¥FQ“ÕØ.Y¢½M’~>¯ >2-ŠÌgQ™š ‹& ºÆ4ÎRÍ3n3à–˜Ö¦íÝår÷vK…+°k}Ùõ-ß~Û|{ë·Ù?¾¾®ËÓîP¨‘FÛvÓö°=Ú<Èe”|K9-dÕm{Us2mûš;ò¤/¸ÆÊÉŒR÷õ›¾lŽÿ$P®ð ;ÀmÛ iæžnŠ€ù–ž³QÞߘ¦·ä]ï׬\Ëe¸K—\1<ùc±À ±0—G‹1~ÏúJÚÎ?ïV†â ‹øZ˜‰óÝ ÷·ù6@Wà°måÛ…è¶XsܼLnî[¨kAUï­+"Dtáv“Ú {ïH[-‹¬Ò «]D.+Z8d“YK!jÑŸ¥Í‰lÚo ˆ¯´Ë 4Û®²°+æ8J‘h7mï½·ÆiÉîm*B[J¹.„0OŠB!¼%á#á7ˆm®2 G¯Ñ¹k* Ëýòk“‹¡°kÛiƒ_z!˜H¶·ãØü1`Æh©"÷ {X›×aY ^;¬Þ¢@®…-Ü(¬á-bŸ$Ô,bvTIÌkÚ­âW|ÄüJÙäNp”kó‹£W†¸u-¸ν%QKàÜyúf&*^e24jX}³xn¸Ù<Ö£+ï6µÒ[¢ÆÃ\HfW|â§l>-òÑX´=¿ÎÌ,3¢>²’6!'G±…>\ªkoó\”ÛØ7{ó!à{n€3ŒX/š$ú|%@É\9eNnepŠX§ Õ AÜ¥Æs0w&å·DíHÊÞÏñ{ ì¦#ÑÖWJv éEì(r#FK%D™£‘Á]¢.É£f`åÇÔ.É6Õ¡Ö¸Vgù'ÅyÒšÑ Ž>â Í91»ȬÂ<5 @ýÉpd·g…f1C0Úyצ[µKkÓV5‚}hä;›oËU'S½j7Oøeß¹˜y€™X)`¼´ºhSSÅÜY# õUô–j9§ÿ{ªëLdnz¾8Sâl¯Öï6ôGsô˜˜ó¯ÊQUÑ‘” ‰ž$b°ú­ô?iVßøp§`ÆgcHúÉòí€TÈw:®Ü[ÉãMòì!>.Ì!éY81åúŸ´ Žñ?3øè=Œù¡¼Éû£Ë@x’§8û5¾_È™t9–bçÆyóáG':]ÝÃ=~¡€Ï˳p¶Y„¯,Œ?sý~v‹½– ÇžKø‰ŽBêlÁ?¥ÞWWßážeP-ßÿ~`N~Æš¾»+âv,F€Ÿèî®”µ÷É¥Çé«“èý,ïN“Jè cdS\˜Çüúü½¸¨ÈnqŽ ÏF^S3­Tåg\ä|Û8}ÿ<-úÇ[ÐÈÓ«‰#÷F1KƒŽ?˜Þjîê€$U†£ ‹ ÐO÷vþeÖòÈ ³ãx@‘]K3h ÅYðËVe£‹ÇÁ?q/Ë_¦Á…?Ül“Èö9^zDê~©*âq¯ÿªø4‘ü £y8éÙšåÅüö'ðs˜ýYYÌÑþ…=_S*mœÐ5ßɆӿ÷'ýoƒoã*ÿš`5èÐ +`AS¹(LvP#ƒâ渡¼S7ù/dsIðºxÓ®vƒÃû®ˆòšI80Gõöil¹ãp¤³ì‡1ÃÍ ¥({­N`ŽÇ-fUÈÜ5ècZxúýgÎçÅðŸX "—5ý¦ݶÖ*cgÙŸV§ŸëI¼>4-ÿ | Å!/þSµå<¦Vö#Ü_>%ûgøüïõ[|ùî­mPÒ &{ðÜ‹©jdȨW<Çúë´‡uxã8ÕƒÁˆx0<(+ßz„–sÔñhRŠè mP]Âtj¼¹)Vp¼Ltœ³CRÏœ‡7;w«uíjœ´ï€@XÄC#º¨Uº€išªÙ¼Ö =“x í`æôì rsÆPªÇOQ°Ü“q$4@@¯$ð¢éaõzÐþ0|̼îÄr‚ >×Ê6*}ã%î-¦ÐD-ߨQ±Àz2c'HèA3²ø'Õzí W7Mù"W~èÝ¢€lIŽ:#º¤poï˜u§uOnr'²_Àk©k©ñš3 0½Ó#n»¿÷MšâòV\o³€Â\@ÖˆdÀŸO|.4Nö×Ð7ì±\0‰¥ÒÕ NÕOg ªº\ƒ“Í)â ÄìûûÛ{>Ù·ˆÜz)Åq!™W£–uŸg\( ظ¹]i· ±žâ©)ØÞ¬žáÌÒFÚ&4i…¶§óÿ’…g?2ó^  <7ôºÆaبÙÀmò¢™„ê¢Z.8¶iäbâ¿.ħ~ÛV] `K ªË ¥·K§1ª] eÚKÕç,ÈŽï<›<—¢Z¾`Û4ùNYŧhîa6¶Rlï;Ê6–òôqµ©¨÷K [°BaGé9v÷ªÊG;á÷¾¹Wâh®j·~ÓBáK˜CÒC}‡ß=æ{‰í:êFyƒ@7°¨ª¾üm^Dd/,’(Ûvø r…N£ƒŠX¹Ac$JG+2àƒy*ewÀ0JÏFŠW*b“*©Ó­ûÐìîsédNQ´tg fyÀq:¾ý‘gþ8vL‹GSî£4´Å[y«_üøWÓ›lä‡ïa¢š{xœ×Ã#ð{GßÇqááMæ/åÿg¦ êp¨µ¿y üù ñ©8Êcj2³hšwûѦ9«~a^óí¸ùÀÉð;ü!ð¥U9/Ÿ©àÇý[ë Fûx{Ÿ²A§@t>‰3WöÙë)³ew>Œš•ꟙ3‘9F\îîŠh(æ5/¾^é "̉ªÊD¦q³ˆ0¿XdÒãž,NKUk'w©eiL@棇l\SÙc…i”öÐÙ"2žÕd˜Ý“£ˆ»Þ]V×Ì8ààJñÑÎÁaÔ¬ÈôeV"¬;C+*fkåDšAïêÝ‘QÜ|óÆ5;ǧúX þ0çó£šýÛDÐç¿þCúÿ¿eð/›ÿÿ©ÿÖ¼ŒÇ>@Qoì ÿ¼ÛÿŒO"¼ÂÐù™ҺbBMã¬PSÿŸ˜ƒiÄy&Émî×Ë̾Û1Qµ#¾“é,N€Ï|;¤ìÌ´+ÍøNÍh,ç’Q=AaG³ŒÊ€uù#ôs÷0ñN,Uc¯¼†± á8ýÇýy5ñíÖÓ§¥ø?Òòÿ„ª‹õ¶=”?oß÷–&c`”«$7 âÕ]àZz˜-Õ,¨”`DhëŒ]; T< -˜£;‡Xßë/x&š˜v ÇIIû[eÄÎp_q€ïŸà² ‡ Ìè½}šok°WÿÄÆX°§ÿãr8¡‚ñPä#œ(Qé¸è*ánˆ_qæPíG©x ±±—©%kˆí}åD 7YUvßÛ&´­ëºôk-‘ïm¤¹mõÞ4³µ®k­Í;|] @¶™+׊må¡¡Ù¾÷ÞfAQ±sÛ²_¹éýP/Àƒ¬~ÔBîe fjĘ$ _̦›«fˆþ¦+pA×Ò[L ›fB(.?h% ü˜L‡ìñûi«y‡¸…Çø­$Æ Š‰Ù–Ü8ÑŽ;×g¦ã|ÑÅê§r×¶=¿cù•¬Ð6È—.7ݬìçÞAÌ ‰Qך@4±O3ˆÐ¶A!Kd‹xlj}‹åmÀõˆnRiÛY"€~) ˜0aå”mv‰îm^ùàËý¶­PŠUsŒ"R¶Yam63O®5{`äZZÂI˜7Ш>’*õÒ{ÇEè•Àž’¢ÙÖÅ”çlSÖb[ù0Ò^YÍT/¦tD˜•)€R9RHÇ“ÉT’d®™l5ÙÇ„[ö¼ï…êAqŒ¿çNvŠ•}ÔTŒÖ½¡ArãÞ’bUJúZ¿£gB–®L(˜˜y¹t ÚK„÷ƒè1ÑÌk¾‰O\t<Ó%‰ÐÁI¶ I•d>è?Ç¡˜K>ó5û0ˆ3°Ç± ù(}‹‰z¥¿cªˆ P<~UuoKDm+‰Åö­Ýe6Âx<¤ð¾¿iû¾©Ib·#‡¤]ŠÁ11_ÂU‰* †¡úŽyLä6K)ÐÚb‡bÍ»dl.:D©ã A{Ê®C™ÉædÊZÀ…DôçD̂ӯZ#ÊÎ3Pwip¼ˆRŒù(¾Tì´ºa˪S‹uǃˆEEÇIçÑùìG{iVÇ]4b£õ£rµºz$èSü#Ùñ LoòÔSï7ìÅ&Ýњ͆1Æôáƒx~šœ¸“Oß5fsiïüêÕf&ŸÞID‹0Üh´Ã€¡PƒØö7 ‚f\\Ä€\ (hy”Ž©ˆ¦»6Ü÷]¤):æÑiR©? ]µ8¿iä´ò¬G!^?¾RvòRÈHò8 ³äG 7v4œÜsŠMÇ'r LCyàès°-eÛrÌË~¥¤t¬e8¶ÉCÿÈçðçó‚ŒbùûäÁD9kµ«îy\²‡oê4š<@É'!ý|ñò~ð'òÿ›5à­òŽ/^Ýgמs•ç^o ²jˆ†@–Ÿ}|» …Qçuà%ØŒ|d5ƒ_Ï4g ïüˆ‰Ç  \·¾Ïñ©Ùt*•¹…Ö!SWüìÌZ³¸»6©QØÍq {•g«X¡ߺ3Î]±Y¢©¾ú~ 0àt¹ºä`”¸ñbîøýïð#iöÁ[i¨Þe å5ÁÄ¢á³8àoŒèTCµÉ#co½³¨îšÙ5SöÉ׫>”–z O‰²9$íc,ó¶)ÝþI9«=S_@=¨{Ÿ|’°ëá3Wö"6zî9l»À̈䌌ü,&ãŵüÔÍ×ïúwý‡/¯˜w)üs Ð/F‚Å:éOOOþÇ$àd¾søËÿpäûü§r‘‚ÁÝNZzÃG=ÆNèh æ~Œï"Ð%ŒA|¿W±úÜ)…j¶këÜIfRÙïÒkļɮ6p],¯ÇÃyWÍó™·e-HC—L¥ÒUáÜËR™”þã|–¾n?fÔŽìhS6¿Ô–ïÃü>ÿ/Ñ›ÿäÀå’™›‘ bÛTáʳwçÌçÈw +±H„¹í:møcîàÎzýØžžî݆Ÿ—Z?ýˆTû¹EnÝ0¥ÙDa±=\üØ3þQ)¦Q¹£ÃVa>È7˧ÌÁæ í#»4yäKÚ ¡‹ÊÜÉâ x½˜‹õ’ŒƒñØcårê¿Æ6„¤(ÛË©2À÷ièðFà m<Ë!úbr[HTЀáx.0¤¾>U¼¾6hºWnßÉÈžëè@HÃl ¶öþ2Ê4]”6,5Ðò˜s:¡cÅ*å¼mЉqÛqÄ7RžÉ/ÛŠèõ¥vó/nSÈÒ¨À.Å}]ÿý ›©êºÄömä×%)&\]—ÎÁÄ«òÞ\"*rÂr$Ãä9Õðe~›QöcnR¢I½ Úà#u8Ÿå>XnO& °Dt]BÕÕÝøëÓ(óX¡JPÈÛz‚¶0kF+ˆÖfI@ý5a{Oòò7ÇÈ« Àê.H“ “”HÙbÍ~Xø »tëiƒ D½¨@„Ûh"ÿ Ù·-…E¢#@4êÖ™ ¼ëµ`Û+¢Þ5ðoÞ7¢ØÛ¸[Ú¥¹`éã‹ô6¯¨ö±ÍcÀ*$ïoƒrš.›8 ¥åEÛ—$k™™™GgaÌ›Å6ÓêH]Bª‡HÛ¶±cSo[ÖòYÌD@·lŸíl@-¦Î%³9g/zÇËâŸy£nŽ×qéò)¡ž¦`h£Þca"^« c0Õ#^'~âfå?üM¤0ÛÓ7¹Mr¨oÞŸJߨù4¨å—Hž›k¾P{òØÍg~;è¥êªŒXÈOÚƒïãRõNaFcÇF¼´#ˆgJët ó¹ªÀ6 ›y§Öro5¨›Ðsü£íû®`ß3WhV¦˜ˆz¥’¸T¦ïæ|ˆÀ܈[fxz›ÓÒ"Ü{ß}S|Á¬Ò­”ì³7%lü™a2Û´ÝüýDŸ/ÅfÍè=ùä¯9Òf\‹fŒÖìáž5R„b½ ºk(YÕ9R+vŠ.sÀÒzKq]N,hY3Œ"­§¥0vñµ¹ÂD_ã ó0Ô¦”ißV´uz˜#'Öë@@êOˆ6@Ü%Ö([tm< ‰Ì³,¨Ç Ò“§[GE#e-{³6œêekÇ qâ‘K. ¨‚ %IN¨NJ¸FqâzØñÛ8ÊWËÕmÒRU)ŸtIX†mS[æAÆF*DÂÌ?$7%ì¤ï~˜K²@R‚ç5z êå%‰kÇjú„Bqw´¹lˆ›#‘-¡´QWœ—y%©è#[ïŠg.¢ÄA¶±¹õX,U,²l©]h=u¢á+øÔù?}Ö8IÌÎmLãμR>1ëŽA‘þÇY£ Æ8§<ù¹CÚ‡ôêÔˆ©ÎÑŽÙMÍ13šÞ³ûórÌq†D—’ðO|§o„ C Ä»Ø÷ŽG‘ƒ#§–>Éb|ÌëòŠ|PZÒ¦%­?óÉÊÙ¬“²Z\UŽÓ>š^ù¡»AŽØôXî?íÿ|PP9™3FY(òÖ¤>ùKµÐÓ¼Y«¸v^­ßªê†µ²Žœâc4¶ó-^G>:ج¢£Y¸n7Å7Ã4xU‘¡$+FSÖkלôÜã2hýùAãÀª4Ï<_ùEóÅ—úh Ÿ@ãÁ_ÇÉ"êøô)m#3'Wê1€'郚7W?é@VàR²g5ÃÏòÔ!?>þ,ð÷AÂ,)öã”õW×Ù gÁ¬L‘ÏqbpËJòàS_›¹[Ê脜Ûλâ·R&Æ»{PÚõyyÃú%…¾8¤Vˆ·àÊÉp¡KP û7ª‘N¦­ç& Ûòì!Z‚ÑNÀ©8+Ô÷³ #ýXÔ€f"¼Åé°òõ<&rh"#¡6¼c™§lv©ƒÌ»à)“¾–&ÎW0Òûå1&ù”h9<ñQ°./xãgÍ>´í:lñQû7 –C„g@BýªgJäø’tGI¸ý[Úé&S¦‘ƒà±ø7öïÄÇãæWðâãö¯ˆýoÖú?ønüVSç[Ãùß8¼Ì Ž™~æ&=_Ä«ÿzŒìëÙ>Á@uÅ!¡qâÙ§çðÅX #ù¾ü"û¦u_hz°rD¦ÒÌýÄ(ÒD—ß K‘<ÞRãÜ,I;:cÄ“¢€¡,óÉxÁÄhŽ(F—L·• Ä=Ñê«pïh˜3nMÑn4rëˆ!»¸;¼3êý'üðxý.Íþ÷ ‚¦PP÷cÆÛkfaø¸Àù2k!ÚìÞö°T§ ÿYk…EVf,æC?ßG’àqx™!€—›‘Ò¬¡Èæª2}­Í¢êm+º3ë1LÏŒNsìyç÷tŽ^¹„23ûÕ,3ì(ãA:ö¨ä|4ÿæ ‹‰º%Ç]—Ùä¥dnƒ­Ûº9Ãù ÷¤™ÇuÚ&K/ut€ D9Ã÷ÓΞýÖ'ì¬øPƒvvÍkéŠÙ6åRS`¡J"È”e œùÿ€’EëY±ˆàrXÊʃÀ@X‰!˜íÈ”àZËA:M[h?ÊÎ,r$U½ã—‡³_C^ÉÓ ÃY,:¨1½½€å¯e[0°¿ïÛZÚõw()ÃÒl+¿d­k}]& •K|}}}­,’ÛÌvÛÑ´½•45ƒ*Ë§Š‘<n`¹òÒñ ”Ü·#j!ÞfþQ[a+Òü²“Ä%Ç~Ü•µÛrаM²’f4“%jj{Ç9S£‚K“2ÖŸG­Xž§U—±‚°þû–F¬ÚF.W…Å¿ˆ2+¼á‹ª²9ðp†² …¬qAöK2RU ,dpØÏ*ÕB8LáÇÆ5ÇH‰,ñ¹‚® •QÌDWµmà#"±Ûv”@ À—àúǵT=¦ÁÞä&V¹Àh$o §0#äÀx12&Ä UÑÌ̘»£a²%ªÑ„¸ï­]Xªr©!Ü" wN†² V¶mó—ÁmFŠº[+Ös¥VÍÕ9$Të–±†GÎÌûf²È ¯%KغêR]eÉ2nFä²¹=M¢¢÷½|£pdO¢5'РF†³Ì'÷Ó\ŸføXv5žþ™«™yDãÞ›¤ê¹0F3£ŒGDxß{©­Å×ßí¦cqøÙd­HŽ™µ¹³´‘J!Èí!‘AŽ~‡þ;Y!ºž[3™á7ÉÅnû³52éLÚêì¨Îl3f›Û<£J1±%K,Ýè¬ø`¹*Ö±ÏÃxì-"ŠŒÙ9é2Qê®W«Š·¦ç‘¹lÖˆ^‰î\u£Á‚OvÓßoq\ˆ¶_ç£; ˆÇðÚŸ7´F¬ºÍŸŸ-ꟇîÃÂÿ˜3tî>—qDÐðèfŠ.¼Öþ-ND6„£+/É€ –ûSz‚,¨j‰!ÎUÛ§¡ÚHä£À:Î9i*‘Ù6‹®€{eª—œú&º³žc8¬$Up >¼Oéu E0ì¥eʘ“ƒ‰èçá Ì¾(ŒO+YáK Ž`êpµ£em+ꊌ;18 §ææ•“·gùÖGÈ ì_£~ù´TÌ‚ñp“„[ÒÌTdGVù ‚*À›³Ê(øMXñtŠqœ <±UB¶U”íH\?:¨o5ºÿ™ÍZ øÁ‘-­öe œ‡ƒœ2ÙôE>µ¾ƒ}:5en¼§°Äcå}\…ùÇ÷“ëðà^2`ìì«­.›,yÊ9³‹÷#|ƒÍêšI˜]§‹GKlm9ew4['Á9à|û¡òO4#m¸Piˆé¿ä¹+æ£~TjÜíw©»rÎQÀj9¶ÁXݶ´ý4é¯ù©.âã"AŽ!ýÏ{ý¼ÕdEëš¿¤$w°ÖšÐY€p¢ªhú¼*”—øzÆ3ÑñaT7/ØFq2®¨G˜ŒMßMB æ{W÷´ô‹œüZOœlVñðºWߪ3ÙSQ¤7¡òç¥?fïç#ään‹|5ó§TË9Æ~[4ÊTV) ó*Êå˜÷¨R>ˆrÎÝHÃÈtèÇ”x3»/+æ¯ùQôýÜêà!õàå{~¯þÿ1£xeòØŸ‰›ÿšÜ‰Ç)óÏ”ù?þ|õîÿôÀ›hQŸ.ÞÞœ#_õ« ðÛãâ\äËù⧤ÔýÓpp‚"|êgï¢ôS_aEÃA4dwBWxÝ\ ‘Š#ƒ„¢_#räF¯â£˜¸°èÇ®“ÿ‹â®Š@ÃFåJéQ +ò ®ç!;vÈî×9ÝmxDöslÈ8ŇƒsðUõþübôÏunÿ¯\aRÂ3ÜdÀÆJ™>, iÂßôtæ2¨1FXkÉàúµe˜6¡FÞ™z$×±µ -¬‚¾ ¢³8Ú·̃ÆÞ¶÷&)KTÔ14,r\ ;8-Pµ½ãì—µ±õ—Öa;uØá[(-;hw™Ò. P¥sO;Vwsj¦¡A~ÎéÑoT* XÆ+2ùgs“ŽÇø–GáÊQky°ÆùˆÔ„Õ˜ù売êA¯ :ñRûfj3“â …jº’N P³›AOö,Gœsg2èØ7{Äâôuø€ÔE½WQ€uT·pµf&*Ø0\ÃuÞx8Ô"xï.®×³DÝOpèšîLÐ-I|rPÑ$ÊJ:z]=›`§e€\Ñp™ÞbawZŠm‰×GLú¶¿)f¼Å”kéúÿ¾L°Tp­µ2B¯×â·üußç†j.–¡PWÞvºôKä›Bîܲ¯º4)d%@”aS̶A¾®Þì¼Kqx:0|7 І“úéyë*]_} P‚¶3 DÙ{ÐuQ7UÖR]k±<ªˆ¨ìDkCBØFZW*´§›º ”›¼ÌU$ž’&¨ÑôÒÙqXµ_ÌÑ[Oõ|Kº'Ð0¸Æ°°¢YÓçâ‹ÿR±mg[ïwè¹ñOÍâZ·I1|ÐIÔñTàMò¨þ ßôZ׺ÖÒûû–1²¯<ŠˆØ½i¢_þ€}oÛ¦KÍÉ?bBQPU!z›¹ÒŸ˜¨ð<øšæú4!k-OìmK¹·ñ‰ ÄßDÃe…F”ZÓhôf½w—E  g~ˆw€»¶¬fF×”3Ãé,OBõ~«Å•m¶´¶?¡#Û?T•Í¢>·€ì˜óˬë¾CÐë³ÎÝÿ… ,Æ%bä‚¢dºÖÞ{–²ˆøÔ©t˽MÁò! ¦f£G-Ç€|Z%i^f‘s:vB€ÙwË|Ä™ùdÆ9ÿðmp{Äž¡®T?o·‡²|œNG£·#ç ÆãüVÔrÈnÒˆøÅ X@|XHZ)b!©`A7M¡ôbŸ°f‚¤lê2Þ´›v-­Ø&…»øÂ¥ïTjUV¤7€C!TŶ„ ¡Öd=†²h+$ÌŠb¢liJ}’f‡s팺³XÚâÍéödPçH…ÀÂägöcÒlÐûKI‚}ì%1^’ ë»ØÁÒ—ÙûÇV$ò™'rz“e“Ôê§)›˜˜œaÓij˜I;N;]hÇápΗÓhò¨žäl€LV¥jOHߌ}ÈG«se½ÿá¥Lg<^ËXM´|Ì+ª!ÀZÅòKŒƒÿ€%ðÐDB (Ö±<\ΧAcŒ‰âŠ‘Œ _Zóß–å™yË´=#)ÙÈí¯1>í2ágãPÉðÝÅýqh'µæ3Û âzFõr¿øõ!¤ÉÏ"O>~˜§·ž‡½†Idl—pÿ£¥ëYŒ¶JãÔ¹ÈòÓ_ÿT]~iVåXe¦,]…} €ÁT„b8h;Äaªçg‡ñqÝñ¸ej˜ó”ÎK¯î£ï7x EȤ„%vq¿uÉ÷ÿ­š3T29ž÷OK#Ng‘Š‹ÇýW­°kñn.ì1üð[þ‰Ï·B&%Žo¶¹Ðë1^œÂHÍÇ÷²afƒ€¡x^Ìr²åÉe 6h'²J`àÒìð,@âÔä‡Ò‹¿uuŸåÀØ´´ØèXÎbÝC®õMZJÊè)bÊ —Ãï|ÊxÕ¨ñ¡7>e>oÝß:˰›ûšg²©žö4L›óÁÝ[/¾]6Ï3õsÎcºtì_´|âÔÖÏ>”üá…†#/¾þ¿a5þÚï_b¿˜Ôü;-Îü3ÕýS]ÅßøÙêýïÝÕ_ùîÛK‡þ†ú§úŸOŒv뻸íZ?’ùQÍ €¶É©Ž“U†^Í£Y œýG~&T™ûº.Ýe¨PáN|ž°>Kè´<|Ëÿ¥î]·dGŽ]ƒy¤æýßöte¸a~ØÕIFî,©æ¬VÏt/Uiï̸Nwðª²9lE²±¸/1‹¶±ŸÍÏLÒy˜9Û°°|%±î×ÃÝ)%ÔÛ8Ȥ°”Ñd¼õÁ'‹AåÓýÛßöÿvõ_D^´M8V!D_žÄ”æÙÏ΂´Þ&†ãï‘Üs~°/!¾Ö·½÷Q00p@ãÇÈèÆ-|pŸ8Kã ž¾‡ë[T ™nIPjš<6ˆó< TM1œÏF„‹rha½3cíêz7Ù™.Z Ð¥»¤í™|å¦ÉhÉéJXÆÄOc÷+Š.×a^Åäc‘µ†¦ÝÜÁ™m`#ù\È-Ÿá“¦8^$͸‹ôS‰ÍûU0âö†„]• ŒÂ|£ê}mý²Þ®ú²µÂËØÂômÛÊó¯ç#2E[Ú^ßä™êÒæ®%Û% .kú༼jááÁ‚[V ×y×àúL¦UW ä°*%¢_^@Ÿî:•²^ßüë¯ý^ÿßë__ªÀÒ—,U‘—¼¶ÙÛL¾ßnÚÝ"föªÎÈ9êó•ÔI׋fטּä{BíÏXõbÖ÷Þ¯µ~~ÊÏ5¡¾Of÷Ò¦šæžô‡Éw“ýÒÊâÞÛugˆ¾–¼—(WÔ€«ÞC£º¬E3wÒ÷ôBú¦ L=H¶ ÔäÞbjêê€{e¼5@³tÜ ß´‰)U.-!åÕƒˆ¼²7¾÷ˉ”"É7O/rá Ø ¯ Ì! ïmS`ñv@Uô–!ó€1ðŠw1géˆYyoM(ÛTd;§h©#ƒì;,ÒúµÌ¸ß»£$·ãebc£À›"{¯µÆµ‹jÝ7º·©æ3>¤wЉÁ„+ ŠÉW¡kÆêAÚÞ|sƒ²t‰`)T—5Nç[¬7¾±ñ²Ù1‡Qnše?ÇÈvÿ ¯%!ª²›¢¡Ô\‹Ùâë']·ÿ{^‚EIËÔµm‡ñšDгz6›úGè³ Ô!Ø^O³Ü$µõcD»)G Pªâ=P㞤1]/ ÈÿÁj›ß± ·¯ÃŽòŸn¸cË‘A¶pI˜[\­5Ç2(“i&¥’‰ùA‰4ϧÛñg§8žÓxŒÐÚÒø®´ý<^£b› 2¢ñK_ëµ¢¤\‹`'5åZ>Ç‘Óÿµ„oë~úÁ£à«Æ¢þVÜÝÃaî0Z©d›¸4+¥±ž‘½Ð.ñ'­éþC­CYp —§ÑlÖð÷ÑuZ;ÙŒÈéa @ýªI¹FsqùtÝØOE¥ˆãRŒ¢Ê÷9‚0sÐòÞWr3'Ó5‡8CÕ+ZyJ†ÎoÊoÆ&f¾$•‰mÜŒK™{88 °Ìw€r­äšÁY¶Êæ0œ ‰ô$N¦ f»O榻\’PéÜ™äÃ{œ5à/…δå+³OõåÄÀ@šAtï>~–.dŸfaÓ=“þÕ®øiÐЧÜÑaѾ <_楀Óë¼qäÉúÕë\À$[šGQõ•ѯ–¸Þ¢k)„¢4~â ¦)!þ…×z¦(å\6–* YÛÛlV6GI˜íN¾ÐãJÍ›¬išêØ÷è[¶¼ `'|Aô¥ ¯¸ „[¡>bºb£ØÞ[—t©oRÝþ½ßmû×× kœ’üߤc@¶9SÞ|„•³¢¯ájøÀRå¡ú™ˆÇwb½Y{Ú¸@aUítÍÖÏq>ª6D$ª›ÛÞ"¢XKXüùº¨”ä‡AIsú;bnqy-!˜¸5€è®»|Û^¢ïœ—h5ù”8jå+”P³üxpG}õ™Oãͬ9PYæj¿?M|A͇•™­q¬ð´ÏäÈ‚bn¢\³Â}˜¼kÚÏû–r®¦âÆ1 m’W W љӊ}¿Ívé1Î@ïËiùY¹W™ x#€™yÍÞû¯Å×k½ h®ÿ$ßÛ(”…Ò1}Á¦ÊÞܶIb-ÇWåipá¬òb«1æ¢;8\ˤíý¦“ÄV-Ê¥/ b˜K˜d…DmW•½·Z›*\‚µ Î͘ò7 Ÿ%ø/e®‘æ¼±ñ1îe”ÁÂh2ÚÈ}v°¼jÀH1À” | %Þù¼bŒmRLæ˜Oú°)ç[2tw@ÌŒTgŽa"Úrdâ6ê£@}›2n(=gô(dŸPD  ÛŽè/IÚÒø½Ñ&˜.¶Ø\[ ©ž™QmdÆ•=T€*ÔÍdª¹‹ö­Ñÿ x­õõZ{Æ(m5c²"û‚ ²–‡‘žóÔ‚.¼M’yönK\y‡Ä‹awmפ+›j†ŸTDËoh¸àW´Uª¹øe *ÚLìΗB)°õôX”9¦U3U'xjC#àv%! |)˜ÕŽäÔ0û7¦d£. ¬Ôp¿¯B^@À¬»ŒÛaŠ Ì ¹ŒÙA\yù™%, w›5+'3íĘ– ”–ÁOé[›°1 $Z!å®o[«Ç*gÇÇ(ë=„®Ü»)[ÁL&" Í͹`(p(Èã$óÈ¿oúÂüR1Þg@á Ÿ¼Ÿ¼Ÿtçž•€C¬–¬°»œÌ2TùšpüÜëpÌŽ^a²,œ6ýŒ ¼ût„ÎP…§¼Ššo]ͨŸTXœc\2ù+ÿ¬3GÂkŒ£+˜˜“ïîÐ>ôM²×éÔv(¡¶ô*˜†÷ÒËY{^ØîFÑ£9–ÂÉåס¹Cü1Æ)¶N”Þ`¼d««´ºÅ'`¾Huãµ"Ѥ’ö¥˜˜ô,ª9ªê[‡µ|§mf½&@¼H œ+Äâà“uùÚ¿1øà ¼œ¯Yl\,Â×ÛÿÒN¹ÔÜýoG·I©ÿbÞQÁÖ?³³RSšÏÙwwÓ\L™UT‡à<9<˜êy[÷žÕÞ#=§‘ü©ƒánò'~ÖŒÈo æW\à?ãø?´vþúGÿªT÷ß|MøìïLJyÊþÁ¿ûáà˜SÍ™´¶°®ö¨‘›1@êûyÜV B&’T,­HAë!îòÿ›£¿uÚ‹%UUgÿ [ˆ©"T÷Efh µG%wà¬sï’Ç·z½¦¡¶†u[¬°;Ãÿëè#@;Ž$ý§Ø.ò +Ÿ³1þÃ-Ã?§>þ÷ 6›X¡dKÝcô>êäìÞLg¾®w7ÍÙõqë¢Ò‘­×:…ˆÃîß|øñü Ǿ»;éÎ)Ü‹—\ÊVh K[ ãa¼”“¾&Ö܉;dG¹AÎ@uÏõ4Ó”9hT!½]âãRqE޲˜­Ú(–é~ùs…°Mõ¢”Ðìt½Ö÷÷÷_fŽÂY b*WžFf¶Ò„ƒ^[!®ÉêJ‹¯> ÃlBMÿ êZãð“‘§?ÍÛç§BƒïF!ú ‹)¶oîÖÒ¥ “-öNXWfH ÈÐâÏénX^¢°€÷Þ÷Ñ6.MC#¹òöðrÖmbbäöuÂίœ“÷`qÙ[Pwra°<)‘Å©Û&xoÑhYr«]ç…Ù^ÎßÌE§z~^)±E!ë ­2,ì Q•ê'{ÜÐ"[°P£qÇÜ˧²+Ú‡ð1¡:áÄö¶È–L׊où¬¯%š.,ƒ×²'ë‰á­À{›‘o¨:Ë(Xô /]€|[¸ùq cE½ªšªÛPˆßlä矷+•E­w”y=ïî)E­ xîõ² ÛFÈË}àšX„V¤9ÝEþ€šYA¨í–]DÚN)qôM:Uƒì¦Ô`LÌ‚KÅ›a6cÌ¡¢¤mÛ›$_¯××ëõRÔsí²®i‹YÂl<ÿ¢‘¤­3GXó¿Ë³Ì§’gÏç.Á1J‘u¦w¬@Í´•±°½+GÓÃÌøUÇ-2vµšOSñé°äøG{ÄK5L5 õ˜ $ Iüý±U[öÕ±=[[霉ϰ½-•nõ3Á.ß…è$=ÇžÙò²âé@/ÊíqtÜR<­-›$Ú Pÿ“ WÆj‹Õ¨Ÿ˜ñ}Ô ö°Òœ(«h‰ Z2±†*UµÜ†­ÌβÜpi ë)¡ÚÊÇt£C©€À³…z×; "R´Ê1ÔçÊê<”Xˤ.¼Ó¯HÎÆãx÷ù àEtkÀ eþ‰æ¾'È.ŸW[(Irö&”7“£­²ÕϢǰ~òW›HW\2-iüÉ X1Z,þÕŸ[{toU‡<õ´8g@i0Jg\•RsÐG@U£Á.]&F¤òÝ3³/œèA Ñé–ñTíô‰<œ±Å¼6™žô`ù£™”7¸.\Zãî>Ëqñ¨$uv 7]çêR—‹Ø|Ýl_å$<ɇ¹piÈCÇ’v°ââ7Ãa N¯£ @xÊãü4æúyüòlðÌÊ ¸NÎaîíòIÄgmï“Yu¦/îÇÇ’?~\Ž&#‰ÃŒÊó çN‘²‚!`,ûõ ¯`‘Üê¤#£Ãð%Õ˜oä©™]\A³ó;V, {!Ü3™}ó;­<¨Í:+Íê¾Á¡móføÓ}¿·ˆ¬¥óSÞšô¯ma8vXtizÿë.Õc@…SŠÏß¾6³2‡Ùü Üö V<¥‚ÎUr»/? ÷N`Vîã£A¾f¬µ‚^|cª©£v‘ÍŠ=Ô‹#J¦há ¸ãö/‚2îc“‹IôÖêqzõ,âŸÕò_uÿ΄ôäÿøÿcúÿðKý^Þ\úÿ0§ÆŸ|Þ7 ÷¯_ ®:ÜlÍv¦À`ë1ÀÇœ«jþƒ¶íÝÿð_æ!¬k*²rÌP1Ë HnŽµï‚´ß¹´Ó1˜Ø˜j<°·]îq¦ˆšoÙ0›v9žQ¨8£è8çÄÕZÆØRT#`Úœïì:=Ž·ô’ÃÈÔÙu"ÄÛï’Dúo@Iú"MLÛÉ‹(é•lŒ4«ƒuœè¢`VDµÂš˜ÿàÝì?Züü?x °ƒül=„~ˆ4«¬£- ùrB†®çtÇGôU—=}ÔÓ‡PëÊ»I¯ ÝÆgUvcLx\Êí@6Ð很ÊãHx<Òªžõ‰-ê5Äxva£º8îç«pÎÎ’­<ÊÞ8xGÞ¶·íøÒ˜\™yã‰gµ  …àDOÄÜ¥Ž>yx&2_Pý ZWÐPƒÚ1Ê¢Ãjå½ÉýVáK×—zâ´ñµuÎôp›ó÷JûDM3·jVS”x¦Ë2ébÓ@F TryaÚU|(ã‘îRÈu‹¾^Îó˜Oª0ÞiaEüÏ×€'#Åv™~w=#W3÷üŽÜØÇS:,,F/êA/ÐŇ#wTIÿk½Œ¶ æ+JaXŒ²Õr<~*}"Å£â\aö‡,™~ϦœÏ–ZK¼grÓKo–ÏêUÐŒ È ˆ ~êÛáÜ,°«=”ÝD‘ìMÑ—ªDF²=Ü„£)@´I³Û–¯6!?:)GÅ`ÙØ% ÞÈ‚˜"â4U×zÂQ"98ú™š¬¢2ž"G½ëK/¾?‘LžæÏ׺ÂQ ùP¸QëU¤U |L/ÅNò×±•¦ÙcTDÏ2gùz=\bÇYf1¶Û¶'_™GýiÎ[úòÁh8ßÞ%3Ôœ]% 5½Ý^ÝçŸã/L+Æ= @U1éXd¤("nú´X|®<Ù=¨±(F~öàw^é‹êµï'eãð©ËYÝqŠò‰Á”?ÿ°6¢–ï›Uÿ꽬‰ÈÅK4ôpœTž²Îa~õ7f~ÑMˆ¯6– ¾pXÿ‡˜(çåÑqÆ™äÁ¶öqkõ—sžSH/¹¡Ïjì¶øƒv8ØaÒA½ =…hneÍH÷mFk˜¬…'Z6OxØðЋŽVV+ôa^5ÆÑ¹R„ÜÎñÓ?â73 ÈS¿sEé3›žp¼h¼ÔWàÌp?£Ä¢©ý·tuÈOX’-†]¹š~…PÉ8ã+t%âI¿·¿hËMÿœ›cèЭRS´)¯¸¯Ãì/O‰–¤ôÈ•©zYg÷ÙûdxdåÍ7—šÇýC¢¹ß+éI îž*1ð”3ÿ é?iË2^/ðàÿæõèÉX/ßÿÆüŸv—”#Z™¾þ,€¨jÍd€A|ðzM¾M;$ÍÌSŽ—Šö^èUU–ö„>‰1*z2ž¥,¸»I^f©·ùiÊp.r±3;叿1YÏŽ…Ñœ+ãdØõ@×gV3õ¶{–rû`Òq {q0\ŒUÅì¯Ø`©í Xz6\¡öIbíè4gÿ…WËÄ´ Xÿ+&v',®†wçqŒËØm¸mÞ³káìå8PH—|Îg u#…”÷¦IØ'OÛOcAoôÜb¥'TUMÕñÊ2cé !üÒ2VWn‘ 1“¥#ܶSÿ4lS^[|Ì`ÁZÙÛ¼ë±ZŠi®Œó(¯VUÅŠÚÍÔó~`³µ·ª¾ÌÉÊæÎúj 4Å«¼NâØ7V¶ÆeýFV\…KºÜ¯~٨Ȏ›ŠÍÂÞ__$Òð§¡àÇq¾ÆYÛ-ÞÙaã[l…˜Æ‚¨$Ýòzaœ³ØÇÑ!ÎÇ¤Ë „„:R1ìê€jübeÛ˜ã< ^ŽÃúòß©Òï¡f,Jaô¦\QQgAm{/ˆ‰—:Vf›¬¥Ö¸”mb6Uì͹À-U«.é›åÊ?„¥fûµèº6ñÁ›þì^û 𲋭Æí^r£ñµVà´ÖêþjÊR€²Öz«™í¥¬ 1R«XFR·‹b¼¤—Ï¡™ûïö³ŸI—µÄ|FÕÅ@Àïä÷øˆÐE,ÓbM5Ö¢ï>øêÅnáÔÛ,Šks$ ëGU  ºém "³RÛ¨lc º/ü.þçÌ-f‡i9@JŒÖ¤ˆäŸ(T·—ÖF]¯l{›í¯×××k­¥BlÂ¥˜®€]Î{(º„\*gä3¥tõ8;°1R趆ôÒ¯·§¼ªÐª¤§ ‹*ÐY0ü6¡U5á:ÅžD¶&Úâcô~$pGkG5½ŸYãÀQYÏââàsGiÁ’åƒÛ›Ås_‹Ô´9O”P>.—±ß´½ÆC8 -èé·½e~àRË”›ùq@¶ÚÛlÁªŽ ˜YUï”f)k¹Pkëq°‰š-?ØÈm“5W\9îÀƒ'~!ÅG]¼µ«kÞ|Ð[ÉWb_+Òé]"H›8z™àÕˆz©i:© ªI™3î>Ú[ÙŽ@Ê•’þÞBÜtÆcêH,a#ÍAtÖñ)É)ÙÏÕ0?÷`¶.Ç챉V&V–õKæ,×Û4[(æ> í¸‹¾ÌŽ^âdÂ}iL¥¿z¬*ÂÒ\&JƒQú¿·¶ãH VµCr92ÈG"XwYÌÓgžl­êüV.":þþ 0À'mWtÔu¯l9Å\N:"A|ÔøF‚M3›aT× \Ÿ0ò¸™qøÁ“É“–Ây*MÑÀâKpazý1ð\jT`Þ€»tG<¤x¤z{ðª8«„cpÏÜiÔ~#B]Ãþµ£2±s“ÉC«T!#Š†èˆŒdõA)€#‹R¬3û,ÄéÕ̇£å#"biýœ¿`@ØÁæmq4ˆg;C/(b8YeuªŸÀ–¦5Dóinä1³YÃ$‹öq9ÝêÄíh@äBd­ÚYô†;Ö”]s jÄJ>RUæÊŸW4€O\øçáÛ倸ÄqóˆÿŒ³‡îYŒ›è’¼I¾ß­\J{ìNVSúóÄCʓ×…”ÛÁ٠赦k0Ðd@ñnrðÙmçqè­õò`úÇ />Hkø9öóKeŸ¢ÿ”ÊþAüåËû}.áw¯€Oêÿ'ô~óNþægw<’ÙR9G&MÕE&…Gch©Z ŽêÛ<þ|œ|†®ç»9h9t ¢‹A½ZlðXÅo y&tÿVÇ$H !+¦¨<ðT¯ªö ©G¥3¤Îf¹UÖWeœËî|Ô熤˜Ë#ç=B¤8‰œ\Ÿ…%ëÉ¥4çÃÓó?ôÿ6¢Á˜>aeuM‰+:ÉÆÍÌ=É'&æ^.6>ñ€ú‘)º¹qk÷• O8™'û)ú×Uþñ®¿l¤UëPd5N¾yZYb›Ð…ù+y ‡¦°¶h3ãil`W¼³m¶üc‹78¨Æ—‘fƒVå2©¿·L_üö ‰ªñâtO~h¯.G.çz§ÑÃsÓ»™øfoÛébùÎ~/¾™’…JŒG8ÆúVàœ•É˜“ ¹¦ó2*´çûR/EFx³ÚÛŠØXvTÞgÞÑôõÈ<†™ÌƸ6Q¹Oé#^ý¼mÔ²Bs/ãñzfhf­EÒ`—ME‡`$9Çaz·‡2Fb.µoÚk½–¾ø~—BCk5ÙÂý~Y)EDuA·Ei)¡ a«ÁY#{åhPd½€o䯰8³ ®Jm:[¢ä>$  Æýfm‚¼Ïq– ·pî»ö‘‰ÙY"Kä+ñ¯Ë(ëx’æ˜Æ§A=g´%‹D±93¡æº°4ÛÛ`ÜÙ¼‹*ÔäX|ÒxX€K˜Ç©!P昞;‹àm6ï_R³)¨8J^"íÐ8,¿­vTH1IhÜs­é‚Ÿ´ÖHº§J>zÛ—´P.ªw.INÔ÷'‚P\ãŽ7#° +„{›Ø_ûûûÛ¸¿·‘T¯Û,¸«Üy(¼^êW´&+¢LŽ*…”M§ñª^Û«Þ‹½%È'¦p¿YÌžµðð¾ÝIV[L ~v4‰ˆyé=¥¨ˆqtË¢ÑðÄ›ÿ—¦ª{'\DÊ­(‘dó±žëS£È`é@Û¶©¯¸=$Bƒ.ŒïÆ—&’¢^’ϯáò…×PUhNÚÛÉDQGéÆÐÅ xéz½ÖÒ¥P£§Ü¹«rðèÕ­Ûlp´CE4Ÿ_ªûý³µ*ià} ³§í}˜ÒhïÅÑ6;ÌY€@Ì6 ²*~:òî!8úw!À4eB•)ƒ“Ù[^„µtéò• ËÚY3ê‹×ùÍÈÜ-û>LýŒvjÎÊ¢®DQ¹"5L_`}ÂÅìGM 4OMR16Ç>*1·1«cµn»Bjìï6¼›vq©W¹±ÖöO²Ø«UÅ„K…X[.3.´•¹#sä?¶mF1†;ŠBnî,-cJ c\Yû‹èxÉmdλpZÐ!çD”C4ͪ-žvpf‚~ÊYÞ í›Û>êtk¶Rm¹!ë*ß~Z[JdÚ&lØyÙÓ¯Áž^¥‡IɆ¬ˆÍ¨ä0Ý(2A‚ÞnÁî®->Áb’aÄìj´•f.ª©„£_Ù(ËGe":/y H`)hPiäQ)ÓÆz\mj2ƒÍøã àêxÊ¿±zë:æ|§¼UXÞ­¼ëcá*ì½÷QÔ‹¡²_þÂÎGä! ;Z.S9mHŸ”¯'?àÕÜ€[Š:37(xßk=ä„H£ÎRôÏçíµ“Æh"rMðü= -ž½jc|uz;áÁ󻣜R,Õ7Ó êð†foBœ5,ùåtê@[Øç‰ÃÕMvmå[ñ¯ÍŒG‘zæÖÌ<Ö?w€+ü7®îI ¥˜“1f–4Ÿ­—£–œµÁŽ|(ªß[ ‚mÉ^5ÿ¦±¼ý&ˆHUîBeÐ2i'Tè<èÎ~´™r­€ |á“4J¹èóq»] ó ߟS}šßÓ#–ÏÞîZ)¢èQeêS&äµÄd\¹ƒˆx 9_;nŒµ±BÍŸ ‘çØ+hoD|ðÇÄÅû¿\kÇhë’cÄmjðÐÿŸ×ÇÿÆßÆß0þß\þÙéÿ«!ÇÏ_Y›ÀZAEsÿG‘ïlô-«i:ßS™¢ÿêÞàølv4'˜\Ö(¿ÕQ>CP»¾KçuRoAG$8Kí—Žj%3™8ºÖ+S0ÎÇõQh–«{3íVŽà•†É: ”%)H†Ð…³1pA—Æ›¨øÕQ),¿3õãß¹þW j{s.é,x·`Û†fEѽ/ÜÚ/Ù•( ZrS¢*@‰eîZëûÄiW7ïµh ›&‚‰Œ•vrPD#j Àê Ar@6;ÛQEþðu¢%Óx)ÁBg'\3ŠÑI©ñAYDPѺ7’£–ÁÌLüØo7ò‚óéÊÛRßzC&zB“LI¬G5Y/W}â‰3†¦yîM©¨háèp¤Õ¬É^âE$fÆ ã(¶Qô3{ÐfØÕ—+/\‹8ÐI–˜‚NØ\7©ŸiIî¼Xö5L§3%>;@íDH÷ܺ4º£Q]˜xÔZzÓßñ#7ÛB´ú6ëÄ òng„¿©1ãIù;²õZr ME»r¯òdo£¼E  ª `b41“½ßªK!›\¤‰˜½}Jœ¶ô ‘PÅhÆí¼…¯¥Ë'"‘[Pk\P¼d—ùÎì¿àBáÉ»NUMœ®þF.ÈÍŽD•óI‘ @щd«¨UÅ… È'qМÊ(Àóh¡€ÑÞ4t9ªãúå›ïV 2 êO"³½iKaÏev"êùL*³ÁV8åNÆoiêY¶€÷}½TqG¼ºƒ¦LTŽ&’31ȱæÕ¬')‰¹LgnäD ±íÒFûœÚÒS;Kתå$¸ÍÑyÇlÝû{ ùþŸïÿùþËõÏj=Q—*&f¦kAù ãZ"‚÷¦§IHû¶-BÅK—”LªP(̰i.Hª`­/P{›aiÈ‹ê‚eG•ªäö2\ëGc\ߦPPHóéPféòÄÛßµÑh¦X€f¯Šf­4‡:œk»¯T<¡gæ'qcèQ–8Ž‹Uö*"X΢Cf-hNébïÉ`YšýDs#éÿ_€õZ¯éš'掣F÷RäÅZ»‘m–XI_´c·‚Ƴ 𽩖Ëy‚í|ýLºá¶³#Ǖ܈öÍ Ó½ u@Ѳ°,¿/-þ=²»Mßn3lJ7Ð0ú £t¡6ÚÞî{qEÞVŒz Ç'65cÀ¤<íkbf+ k9e£›Ú}òÄR/ %‡Ñ7jLôDîËÓ>.Êt÷"jßÃÎ.“]¶¼§‹~î-Ÿ]ùëFL/H8Ž>¨—†1º8¼€8«: ?Yt|¬c19f]õì{ÏïBaV\ܨ=ÇQLÁËXP€äZ¸=§™ÒìŒ\&y%Éï™pµø(ŒhPçÇ”‘-'Ö±e %ƒsFw%˜ÔAd[‡ÈëØ/¨ ·Îð#1ñ'mñWJ#Ýþ´(ó–Ñø³Ðÿ·Güséê?ž5züî×_¿üwAŠ@þ„½ú;£ˆûXù0üË}ÿ£¨›0>ûZM¿wÖf7œþãy¢k,™ém.k‡®ŒÇ×£mV¸k"3Ùpâi€|$h(¯ÊKúw˦A ðÊ]”«‹*´zm’‚Aø:Ë|Û·xÙq‡]iÀS±´V±Nÿ½ª¸AZþ+'ÔHM Г ÿM d †/( ± Œ Ä&çšF…™ŸUÂT©˜1¬Fýœ^õ0†ûFûV|ð7çh]§Ñ=­åá{D­Ñ‚xã­õ)w]"‹y›ŒVƒWYk™Hß:ƒÌ+YûÓ@ëcSL°¼ñ2Á28 yÌœÛÌý÷qD »3¹Kƒâ~ÍweÓ‰Ì3NÁV¡öKg,-wŠuо-¯L‰+Ž`ùÜvcW7 3ít5!*F)z&3…Ȭð D÷ÐA]—¶*1õP…ÉjºtÄ{ˆ± máŠ.é«Íʹ0N4—SZžQJ%jæ˜Æ¿wì¯ñc—… ¶º~Ë¿+&UÜ„œf*x½ô¯íÏ]ºDdÓL˜èïÐ,±½¿ßï—®ípyb}‰3æSêÀÒµT×Z+÷Åc³‹jÈPÒDÊòšÛ¥íå»ܵj—a1 é#c›§²ªéêBR·Ôƒòð-òrŸ«i¶Ë†øµfh(¾RsÏ·Q³ˆËFlùmÛÈ3 Úu5s¥îÚÜ­¹¹ŒQJ s \j±11­%*ÇŽ}Œ—âÜQ± ™æ£¹×¼"}nÌî¼uÆ– ÁféÛä dx0ò¸®sØ6ÕE’oîm|ïÿyÿõþ˜t-#—_ÜÛŸ;®VÛûM’ÿ‚Æ\‘×KUAŠºÅyìß¼kÀßÍK—蛤E\Zµ@r¿ÍgphÚ~C£`3$Cˆ½­z*î*à… IDAT$l–hwÃ^bO¬P“²ÔOÈœ=î<¾‰E£˜ˆQ׋չÍ1¯ÆÐRRfæ•bk!^ Ku~ŸÇ e‹p‹jÃÀÝ„ ç8nßq‰Re·.ÁQÅTÌv9²{ðëDƘQ »Ìû!k›"X/@Ф;³CZÃÅí³L[ºN—LÎ@ÏÆH3ŸN ŽEµ×_]Dî÷V@µhMÕ¼¤™Ø–·ÙÒÔÿ(pŠeEWâ—ÏÖ]&És<Í3¾I°> ;#ˆùuk,¬4Šq«¯œÎlÒ.´Òw`ôÑÖ¶oã"U±-F +EwnÓ¿‡·oÄ$Ñ~˜{‘¨,­Hzemýö iXÛ⸙=` ðÖÒê*.ÍwDR¹Iç{ÒÕFŸèœ¦çú±‘ü`,4äÁÅáZá‰C½¥qùA´ûªU ¥5 u+õ'Ü-a=ê²çÌ8UÕ-OX8bæÅ‘w–ê†ò>™ ˜~ñD,³ Ocëh«í¸àÔx9Ý3lVËõ9räk \Þˆ1Ñéj©æ!ïÑAi›.Ï9Ä«æËø*|®ÃUÚÝËT‘¡ÉQ‘@iÔzÆ/‡“ ÷9íÏݶ+å¢ñt :+J#†C;6QÛÙÐ>ǼÑà ‹íšJ¦ä5f?…¡ˆM9R„à'‡!û4ý "/ç/ÜÈà]ªiWMý™øÿ;Å„s®ÁŽí"¯i\~ yøèÅ¢ë %§QèÔ¦3ÿ‚7:X3ÏŽ[CØ)ºêåÀ\Õ§Q¦Í¾^äh÷æß“µ.'½)³nžÚþß4Ž‹‘½öÏyKjÏ;ßDö[o±—ˆ û…Ý"ÓQ4âLz/ˆxºÑ”U '“LX4VßêímeíÁ}à 9|±5.Æ!¥»t—~©nÔ¶h,¿4Ȳ‚®³JU©”õÆ¢o"NzÑQ9O¥]·Ém¶g·`}0ý£êíçlhHøœîà£5}L‰OÌàEC¯Uè±-èiR´s±^ãx…Œtö{ðœAÞûƒh…©PÎoí±”Ï«DpñþcÌoF~ü ²ó*¥-*× ·Ílÿ–ÔñËàÒçÖ÷ÿHhý„p¹—%üS†n\ÕéÍnQR0òGZ:G,+…ïÏÎÕÚšÁ]öÐÚ>¡ 2:‘ÂûŠûOÝÏQ!™qJd¦ —\mltÝ¿%¦×Ç»^8IsÆq¤´$X.Èa-Ù&K“›ŠIÿÊmŒ†È§P­Bþ¸m¾ É«9bÞM:îé»Öp@/âóÏ÷ÞEàÕ’£\7>ãbïÐŒéXxäÖÃ&ÃE–…›û«/?•3‚wʳÐÙ$d¨ç Ȭ»®qVÝÄË+\) AÃlœ–ƒ ”üfïoójÝ£GÿÈóØ9}ÓH"œu¸uÖˆk R·2’–—éô1JÛÐóZÞÅyöÓ8—!ö ½ Óš˜X¤ ÉÆž¬áȰmÚzµàÚ…Bˆ¯cŠ•%lB}eÚ(ÂRŠT§ªGô~J–Ìò†t—Ö'µ+ÕMó#§·@S¼z4¼]ñCUÅ):65‚ú®]õBå1Œnvt,k•mнB»+3 ÷Z«%T‡é€ª²¶òÜãÉ r]šÜzjXÿiô#EÃ1Šx –Mƒ!“ø…‘ŽbÿÐÞÛ•UŠÑLÖëåfU÷©¸õúË‘ˆúnÔÀX=»¥¶)bGËR\‡kÌ…Â…á±,QÃä(‡·†Ž-‘±ONpqͤæS¯iå{Û(è}X {Rá»ÆÕ­ã¼ÖöíT‰À5&‚5(zoŠñËLÒK"Ù!û¾ßf²…3¸Kk¢åÄãH_£^,7¼G««ºÈ6–ÙFsTp„üäÖƒ“gNwE«-‹Cr><=‡±›cw­–Ù–­¢B£½·˜ýõþ&m›‰˜Ê Là¦-á{KvÃRhß¶ÿúΙ°£“qy­µ·AAb †üžDˆ…Ãßþz"k½”ÂmoóúYwGË8 Öæýw‘N0Ÿ,.²ShÛ¡ ù¶ÆM–\Ë£PÑõÈlc¶¬³Úø˜³™3×O˜xa‰˜˜B—kÑ ~´žÌ"{lŒÌo•¬: Âm¢âõÆôj†’ÃêNUoff2Ü£°”±˜µ{:+arS@ÆÜÞÛªÍi¸¥^3Ž—sÏIiÁAøò{'cäÑD£cLŸj‘ýüKÚþâE=DXûŒžÍÉHü#5®…jæXc¿k¶YöÖ²˜Â•B#…7?V€Ø*®9e®øSTMƒ™ƒ¯LsÝôLÔS Kç{Œ 5ÉüsG†]î„,qR¶Gƒ´üÁªvöÊ?Æ!³ób$˜¨¶×ÿR!é ÷4Ì^|gc“3 £u]äÐéÌ=àÎuÀ-$€©÷ÁÍn1¿ú}ïÜù1]¸¢+”òù<É£ì÷“”…LëÛpâá'E˜ûú—yŸ›LÃx;&ªä Û®Ûäþ©Å¶#Ñ.™ã:~–k3E¦v4+ª;›‹s‡d83¹Yg2Ýýóéâc¯‰  |âç¹êAÓÂOÄsŽ9¿Mò¢:‘Ò ¾ZËaG¤½›Í`%z×"5É5˜™È£,Eo|šk·µÿ#–;ßg|g—²Ä¹zó2ˆÀSÌòaxÅâmÖé}ÉÕ¹žÉK»L g0Òä095…%ïÕ½öV¹GÈ}juŽ ¸ÝØ5® ŒÏ :“n¦bòãó‹ÁîŒö¿2îÿCöò×Nü£¤ï’ûÕïÆã…ûÇ×;47~üÄÿ}­÷B~:©>¥¹MYµ®gÉdE²CôÏ\ÿ @EÕÉgÞЛ?íÌìj S-Üzäÿ|TÅï†zGqõª˜ ©˜þÇBcÔ—‰!;˜âÚž…å^ àImžcSÖÆGgP§™%ýŸ+—œîÓcšSZ]^<:¶/3Yön*Ôÿ6ÔþéûÇWðKŽ.í8ðšY(iã­¶Þ~¨TMl®X¦™¸:ßþëÞ±¿Þðc^Z)ñ²3†8á·«œNs”¨ªÄ‘Cñ wU‚bhe~åàzÌ/^jÛ/ÉKàz0mò‡*ËC9ÇA]ªX96R΢poãæÝpÛÇèÙ-pœªâ®>»ÃÂ*˜û†A.ªuæÓõÉŽBTB©’éÃN×-â—fùJÄg«`õH5“"Íû?¯™æ’h›ÄThY#[ß³Õ`"Š"b7Tª)½×ÁaU»³{ˆn?ûý¨f–Hr7¥MF§4òetµ5£êeHsÔíªëG††²NÎKh¦¾%Ætµš0zë­* ÖHÆwÙû½UÄŒ@OÉ8\ °,FH4·ÐÈ—|UÞ•tïËR•,›¼zÍT K„ßÛKEM‚„ Äøà‘‘cÕÌb Ä„jb0­òÒ.C{=-aâ5j ˜0Ê«I ß1 ²·ŸÁˆÅʵ|óÛ ªª!²«lÙöý½w^E,ˆl—&j˜®¨ê¤C{›çÖdA7Í=ºk0 ùV‘m;ùäÊÿ ¶D±4úˆeo‹0&»˜c‹DâG£R˜bÆMà [°y5PÖÎ%R±™Ò’4<‚åD¶3‡e9¾›;’ùÞ—›&2¹b%D×j™˜²4–Æz£5“ ·=ÍþgÇ ËÀ’S×”@ÇKúö±š2sJ›s>+ip|ý Qr¨5Ðc2ýv6%܃™uÃw¸žH9Ö“ÑH$<¥³ˆk‘mÙI4ÔÁcŠÏ6\=-ߥ˜â [Ü֊êД~DÝ{P£ªºŽB ƒ>hÄ©e©J–ãªht NM—¸Ù ã<£xIy£þ”±«.òUœP‘Œ![1ÇÁD\Ï Ÿ,ÆYë QÍä7iìYîÂwÁPP/ÒãL#=yŠ4cPößfà…Ú¦#^ØÓãœæérDˆÎæß!Q ¼ICꊫÊÜf–æ0–l3²–¯;çJ€¸9· Mi\»VBÁŠ×a9‘³î—c™u÷àÊñZC|âên­»\8ÏÍ:‰L `ówå«È³Úx´H†R.vãrÛ'xQ²·.7\–ߎº ¶ÜçGŠÄÿ›Æ«36lÉÖÆäe¹l€Ó0ßäGé'jó4}ý¤ù3bHOo îëd*æáè´ý㉔÷ÄåGaƒOî]é}?î·Ïª4O7A{°§j>l8§åŸç”Ÿ~P­ øA]ûTöpýF3C\³Óգ©ãœ8óL!¼6‚íù¢¡ðçÍQ›…ë_žÃá ^_sûð³Žlç0j¶N„û=Xb)ÉêË>tÊ ò™xšù}ÏÃõ¡qõ´§V`ÙËc­õ xzÎúH( Ä8ß ˆï‹øpØ‘êá˜W=þö8)1{äHñCÍ>ç…ÕpŠã©xÉÆ:?gïùËŠ,•ê7äÞ<±+8— JÑŸ"CgÁc—#ß“UQÒs=ü¤þ75>}|0“?”¹ËSÞèq•¸òð'›?ÿ}õÿƒîÿ·~ ÿ†Äÿ¨ÊÞ§¿GŸÿ„§ßðëŸw+}ÀTÿå¢ûã Ö<“ipéD" 1Ðø.’„¡dÕq©œû"yõĚݼ{”äWd‘¹1mŸ¯ñ+–À2F³tFr»bîÛ,_4²º¼¬˜Õ vÏ»¥eÕ )BÕ¬¥ü•n5ãÉT4óõ4³ük¨ÿxž]¯ÿ v~7{Y9 }xÛÔ‘.lrО·}{äá8ÿ1üˆj®ú÷ýP)ÀlNì[R(F °Ñðà¿m›q-  G‘T¶ ¯?_°ÙÀ¬^}Çzé ±¸î_»H·vŽ'“?ê¶Ék0/ –¿àNükhÀé$)Qþ-•ò?ôÁ=¤lÁÙLê‡×ˆwX>øûHWÒa7]忉=(o›ÃpªœÖ)¢ÙÉ÷çQ¿@ª†x«ñ¿¬c˜ ß¶õ»#®™S-ÆašÆZÁÞdcþ8ò×õ(Ñ<«º¦d8˜â‚Úõu#õ+‘?Ñ–*úàúd;PÁ5¤£|"¼nR‚Ò%¿¼b Kl‡115ÙöÞË-¹ƒ¥ ØÑ²™rp*€q3¯Ì6ÖvÅK¸g/7Þª¨©#ÌUÄ–`4>×àÊÇQÒQ †§”­â¤¨7)&{áëjAϱ–B,\7 Þg.ùsP}©¸þ_5ªfö©pÞ½–äïê¢WÔŽ×Ø»Ír²òÞFDåšÞÀùs,Ù þº×ÊЉÉèÛþ°qYä4=@û~gž™™ˆYf~Ö ÿ€óß–¦]=FÛeô{¨KDLL©ϸô‰×’m¡Ù,ô¦ÆFS¿¸½ýÄL Ð-‚:1ks/¼Ö+~ζ·½ßFûŸ÷û¥Ðó½ôÞø†êK–ßû¥×Ž@IA\U(ø~ï‡;Ç‚±ÄôÔá"§ïZ¼Ð^•4¯¼v^¼mï“&v¸ëù6Éü6¦†•×TÇņ>’g¨båÕ(Œ¢“H̨¾jË/è3ÄÈÛD{Õk]”3˜²÷‰¿·í½i;J¦Öò?á1‚%ŒNÀv\¸P_ ÎQc:7Rè›1Ž\z—·4!Ll›½ßoÒÖËozT4ÿŽk½öòƯÙZñ'yŸ ’‰ò­µV4èZ†ÜÄÀÅ(<ðX“f—»”šhN ™ìßA¸ wm‡“¯³„oî/ÐÁ‘à¬jé9Ø ¹íM½w¸Ë k_ßlÔëHŽ*m÷Ëft1g‡òåŒÉ’/ ‰»7êMSìLueÕ¦Œ€HsPFNÓGˆíw¦Ú_“DÿêÀ+Ë®—’²å¢msÝËØNqFs~UøZåïÔjÞÓÿ·èš‡x/mª(7~ä,9ŠZpŽùgÓÄIy¯ƒ Þý„UÁÙ†B±(6V@•²6ýgrtìzGùk2èjêÓ±ÞLG0ŠÔÓ”Q?: ™¨s(V$ÙÓ+ "#(ØüìQ»JKiQÅk\b'%•ÖŒÍAðgÅß²TIŒ±WŒ@Êê–>Œ$’5KM‘±ýrbm­Mí(Û |®/í–G¤Œ8×¼r؉GÙ’ŒïµüùsúX†r?÷eQÅ(åà ùZ阋ô_]H³½ç‰µðbÀöçŒë)À#Üp‚€NuñßÑ‘îÿ}¥>.ø8vÁU棜óoâ4:NÂÎJD~ìÆ¼†,d‚ƒäxÂñ‡¿yÉ~>^e:žá£<·h’ÅÏÇʼnºåx\ÃÌó¼[O.|œ¸:›UmÑž2|\œ§N“9lä©Sð˜Aû`ŒTJiJÿpîgqŒj®ÔÊ|¹‡ù8¬ƒ?éП4zœ3žKÁ¯òÿ ü‡ýÿÐÏÉ?»Z~eÿLJN`ȇø þ¶¾‹§Êç‹ú©üòeu‚ÅyùoTFqpj}#Qà@ž*ÞÕŠœç»DýH¡¹ÑÖ4‰¢k‡ær‡ 5œe¯—ŸŸÃ?ÏÜIÃÀE¸>"½œ­Ã{îòPÿWWÒ³9D)ù¶fRäØQߢ¢‘aÃÓ8ÔÙ@þ ¿…¬ªÿ½€@¢§‚ -ÖgÒ‰åÏ*Ã{Œ]òô\FŠêòempÏRÐK`þWeµ¡²ô*g˜´RÓî§¶r lF|\Æ7ë/ÙAĽšàãÖUf踀s»K•O£µ¡<°Q¡†=«ë¡-²·ž=9¤­¤à’ã¢7/©®@åt-³Š!†ÍÂ9³0˜Ê‰BjO•Lrr)f3&Ý©mGäÉÌ_Eø_ò$«•yºqÁÒö$ÕŒÊh[ðM~ õü *jÜ^<V5×Ó¶µÅŒ‰UUnÆ’ªt ¤Ûfv ëÁÜ´«d8xqYhœ2†…óB‚ 9!;$D_ÑKÐÞÎö!!¶Í³™/7¨x'(öåHg¤3} Íñî’Q~…ÜŠÖ’hˆåý«‘¶õIÍ?Ù¤¼)¯,’µ<îvO„v#©Ê Ét瓊W¢2;˜Ý*h®$»0é‰7ù®1N´fß"H±öc¶DÖìKÍÈrþ»¿2£c¾IËyù4¢‘4g~qgðB"«ïNÖãÙz¬­òèÚ¹<ãºR¨€zÊ÷ÛbD t)ôæ;‰_”  U«À½èÚ²R³êѼIÔ¶Q„KWOs#4S¼j<µê³Ñ¬t.Ê70&f¶AŠÙ[̸ ò¢TÊ··U„Oí¥ù3Ÿø/ôÛÌŒ J¥í*¨ÃhZ•OoÛïD ëòïÙ«d@šÏOH^M‰Íä6Ûö6[ª©< ×g~˜1ñ³½y)/STôSl'¬JsÈïÑs‡*sØ’Fßû~[¯´w®ZÛ쯿þâÞ }½–£Ì²aºJd±áš„ƒÍ}Åx“«9”d䴼ǼGIÕ1Rí½7ÍÂ,»÷û{oûÖ¯××××+û26€µ^¤£dâtíÆ£åñx¶g¿øíûÔpü©¦R÷¶w^ùœ¯$³ªîsxŽÑÄ M×.Åcùuœë‚ÈÝøF¬,ÇÔlPìÎW"xMfþÃgá ¢ã>è[i™ÑÅx2f3©ÕÃèeï¹Ñê‘ÆÛ–äC £Ã|6jôÁ&]Á_Nò£Ø„O"þ$àL%…O¡—“°s¡»GYY}Îm¯“¡ÕG•¯<˜™ñt‚?E¥ÿ''û ­:÷‡xÔ0ñX» 7~TÍ8Ç(ÆÅÃŽ}Š')ˆŸNÍÎjÌ e3ËáVÁlã>f6G>£®cO{vÚI{ø7^JšíeÎVÑãðöŒÇ»ð-Mñ’lÊ„ÝëQVÜ…º'¯†®r[ã|û(lÈ£Hí‡s^>’x3é’_§jÓèþµ¬«ÚÅáÉã¹¢hŵçtyQ9x±±5-Ï[ÏPÎMÖ!¡I%œ)3Ê´':ŒÖ"|ù'"÷(9V™ "$šmÞw%xœˆøQÂI€ð¾ež·hü?ãæåÇEAäeHp¾@^&ó‘_ sãêÿÿƒîß›¾†ÿìç<‘úùô,ÂÓš÷ó뇱Ŀѻ|ÿ÷.sX7Ôÿl­&qOe:ðUq¨ÿpîjììÖNÁjªvVø¶ 'x>ü '³ĵ÷2Ì¡Hå±×~|<©Än¡¦ã`izÅ–Pâ4‚¢¿…]HT‡…†I£…°Yªy` $ÆËáB*øøÒó¶—cëy>{ñaštƒœþ—4‹È«@óžæœ$·'€O2ëۤϪ·ªjšê¬úlM ‚ÛOˆ}ý3N¬úÓÑOÙ¥örÓLLMxŠD'4ÃÇ!”´ÞÍ Œ¬½XÈÝÄúŸì¼xvÏ?©ºl»=ÔÁÑç[#ßï½´bhj úSîú©¹ª¤f`qò÷Ó:¼yÿjbä Y¾juÃ"À Qï‡à$ð‰ÜØZÙíA?ÅÞ§¶ˆkêÿ1EMFÖèH€µ”öé¯ÿØå“OXÕ5ç:[~¢¾Ü•F¥bQ}ŸìoM? kñVÐ} ˜F ,,ÉÙƒ\vÜu–ú”Ý@¥1 –WŒÊ[výB ‰" Ù6Ë|áZäɲ](9Å$M±ü=Ïë“ dÜ•²‚€Kï¶–OY¥z$Ø>*Å+iž¦„/35ɰ)Æya€ ÅLЬ-éµÄ¡øXºâUå©GÉ\×Ü`šôl÷Šž<Ï›Ý kA…ȘÈ÷¦7t`-¡½ßÛÌR¥³€@=Vé𤃋tÚôÁÛÞïmûýүˌŠvÈ`ÛÏ-;ÉMzM‚åØÏ‚s ¥J‘ý~oÒ̶mn®WŒÕ9oÛL© 3Ø~›Q6 åL¼%…m’šrßóR«öeß§n&0n1eôè.Ñ—?Ddïºú-¹UTo$ ÍõÇAÊHPU”%ñ–ãt«0Í|Þ`ž½0]>T^ºæçO£Ñ{…U3XZ‡BÙâ«iMàâÖèG ”4š3 º]Ì@œyô¹ejoT¯Jä(ù ­¹CúÃ+$U l¨€©1 Ôžš¡GчЬC1x/ö8}Qªñ¡žù±ôFCw|¥È¸J (FŒÆ™ef,2¼ÊJjË(Bö=”åá&9æ=ƒ«¹((rÕ²x¤CPžÊ/Šzs…¢WÏ)D#KÈú¤Xc`Ur'›1Âì`â „†ä³ õüúÕ-ß#Ý ©Ûõ¤\.ÙRë½tÄT|¤†‚þsfWY_ºEÁúÊC ˜.ߊ[Øåˆ(™Àœãç-© îä‡ä*=͸zÍ”b]El€bïŽRÞ1ú}êZ‡LâÐqÁ sËW†ôŽxp IDATÅBúdÏÆGw$ø©9òÐÉùGäî¿üÖIָ᧋/f8…AŠD›”ç!¶SÏC $‡ø;æœçû¸„,>ÔyþQ3z,JÆU¶"~ú™Ï\œ Mš:dÏÞŸ¤Í§Ô(G­ñàû³“ÉõáS˜ƒ…>CsÂß'c<럗ϙhS`Ö£§m#[}õÓHŠ-¹v#{*Y®IXõþÈDM@ O]G’ÃÚŸƒPígF"Ëf‚«¢á;úF¢Âl^ˆÑrЙùZUÉøM_.@Õˆ,E%!…6š»#åxîmö~o]º€×ŠÙŽ¿Úž 1ü;þOÛLÈ%ª²¾V‚?’¸+¤™—ø–1ß5U¥CHú@uôôfôNq¢7’zz1d¶ˆèÒÇ}AÓ$Æ&5s{ºFyñÑT™ôâ1©ºôlMS æ^‹×–Rt‚ýÊXNãt²Ík)”:6ëÆ¬Æ…ìÔ…¡¢3k1ÑCvÿõV9ƒ‰(Íö€Ìe‰vØíeD¡¹iòÖõrÔÌ¿Â2­h DŸ.U°ì.¥YÌXjÊø¶-ž´Ph¶'’ ***[ý{O†®l*”·e0„Çüxo{ÇÈÃ[F­´Õó@/kÌPé…d}Œpl‡©€ÅT׎@–¬ó±À$üùlÌÕÿ‹ñÇhdÉrC‹«…Fl„Ê‚ ^ëuŸ+å˜wÎã –ê6é.ˆ¡¿ì˜˜qïèz‡Ë^†²ðÒ¯mo†žÈ yl¡šÆSß ÑWKEXÙ‚Ê:Æ@‘ûaÁÔ)Eê5ò¹ÇÌtgž7‹ º·åJLE´·ØÛ9[‚—:Žá ÷@ <üa!vª¬ËÆbŽ.ðØ u³NH &$í%°iɃÈÔ ¦W0'ùBƒO(óëÖaƆ̶£N––‚ ÆÀ§\¢'7ÛW»l”§vßÒ¼’u)NʇäTR|ž£¹Ô€N­j£føû9hû‚ U´t’ÛÊz7©CŸôëœCa4†˜Ñ ˜U~gždælž,§áLåÊpCÕ6³²KQÆ„«“¬®UÈ=YYEƒ3D  e®åþµ²ð g§Ð·ã>vç&·]‡‰ŒÇI(°.9Ä´›ÃÇôÄ3L±KzÑGîYÈiiÛ-{?žr¡ïpV^íq¢@¦^ã]jŽ­8ž¨&Xè!³[Ý:½³MBˆÖ?úR®=ò vØÌ«›¤F8UØ‹c”wCÊÏðŸ€ØG‹ÿOž¦û÷<¯À8ž"cµ G`J¢2ŒÌ1åPñÙ;>Äzé!ÜGÝšóL¢/¶ŽN2–k?¡S±8GÓ·†z<á?zùÐñøôÐç“èÏÿ²@€—ŸÝ4ðò˜cU õ vëóY†ãÉË0vœ=œ×qâk÷N§¿˜ÃÊ'Ã$Íò¦V²x%ɽÏ¥Pæ¨ÎêôY' 3O¾Ì=/¦û’%Á—Ž; ‘èæËX@ö.&úÕÕÕì×€Yc~bÚ¡yÀ¨x`Ö€²‚rVÌß*iÊKq{íÓ÷‰¨(XIºÝ°ÙÇëGH´«œ§¶X…AG θTe"LØ™ÿ’Ö#2÷×꘲×½€ð™¢á¬¦âäBç‰þŒ)CÑ?„£ËÄãf“[+GpÏ6°Œ½g 5²n3°JÈw¦"Ñãìé«Dçãdx”¬—EÂl%>³ñ} •jfiH(D}g Zþ#![{y a¤GF§]8üˆ±+?oÅ+ýŽHF-FõðŠªª¦ •ý‘ G9,`yfN–o>G?…'nU\ÔÆ Ôß py% ¡ @÷¶ó°ƒÛ>ë-NÚ§¦×Ù!:[ƒæ«z5l§<·™õÄ!®ÉèûI aŽD`¤í ýª_Ïf|³ï’oLxã U¡qo )GT|ù$)¯¥Nd¾]~×oòÛ¼¨µ N7ÛÎ@wMª* Zw mÛZº·ËÊÛ¸?›S* çÍéU [)Ð5ÿì/U@?¶ƒ–ã¶åpãZ°-+jÙ%z\uC`̆hçr`ô«ëZº¿i"²·®k"ˆ1""8ÇT¿ú˦æOIÖ…>>ù͆-hÔ®bd!dN¬þEeOc$°ëµ-à¶¿¬%+M÷õ [¨&z‰(Is¶…ï;vpPüø1¦¸DÇȈ¡:€â±²Ö½ã;šÒö÷&p­/Ï·+êë Ku3¾FÖZË[/ü6_Tèú…嬾(Q´Uyt Á”¸*À¨qGC`büÄZô¼ä)x¡TeÉ©sç?¦¡ ?·ïrR”ˆ"fe…xˆÖþ`Yq–mùŒÀ rS­ût˜¬z0OŸ"2çð¢\™ Àõõµ —'Òh{o~©ÛÌôµõç6/'½2¥šEÛ•’à ty|«£­ P—*¢Ÿ½é%0>6TŸüQøú%Ëñ92äu]¡«q›?¢$Ÿ/5ó³À»+ºD%I쎗ÏG€ÑKÏ¥Kð(Bï]§˜§#lon'™™pA>ßîÝ“Rå–í AÛÛßW˜aùm÷P²–®r9f»`;)ØÑŽ ÔQœHKÌÿŠKB¿¸fÜÇŒÚÑå1s!5.õâÔË­L&»w‘‹¥5!H}tÈËúZ¡àÒSow±©tfv!oÊ®…ÎÂÙêŒYÚ›¶£z¬ƒØ>7ð¾.fQ9,qŹ«b<ÒǾd¢ÝŽí @rJ$‡Ý/É{¨—XÊ>jÔ òå,Ä)•¤¸6E^•dc÷;O¢{}Ïm%ï.‡yºE#¯Fbêfh<èRrÐI®ñpS&"´÷,¸§8ËB‡D3ÈâÀ ÈÜ“C?¤µ{ì›±7+þ òI¿èã3|x¸Bû£¾s†‰K†€òÇÊ[‚á±cÕ[ƒ_mͧ 8¯x‘<ž\?y@Cp|AÇϬ¯¢äù‰·‚tgõú5ßìÙŒ«û­¼3|f«x¶°fûÜ‚åØ;;~¦ôD÷Tͯ¢í³+1þ_Û”Žª§@ UñZó)·²éß«Ö$‘ÒÓfÊ#D‚ Iø¥´}—w0ˆûùÔ÷ðÊHˆr{4jÊvæ#Õi~:A;¹£ ßFoüì.Éh+ÅJgãÝÆ’mň£ÌáÖ<û;ŒPUWWGÉ}þNŽ-« žÕ¯ŠïË?¸»qÜÔ×9ÓjÀ=${€?ɘøÎÌ?¥·ãE9ÿm¯\ÿ?™x›Éò\o~èÀ-ÚãQüûkàOxÿñ˜ñÖ&£¯i• ú îp6!Ž YáÊ„|ôžAóŸ £÷T¦­kÕ™T¢ÙË1× H§ŽÕÓŸ>Y®`B½uÝ +»ˆ5=¢nèp2¹(9^`=dô®Uä3yÐÈÖ‘ƒÌP^¢j1 žÕ‡“åÞ†¿÷ r`ÓÎÎM¼EC^ÿq#«›OWí­ `ºæšOºkÌMzuI¡Ó-Èþ^ï°apæyLâÍc;ͶS‹/} ó_4Íù»„f¦ª]??_•lEž¹Ž2ÄÔb4áð¬ÜÊ×£H’µMˆÔ¸ C£ö\bBŽÇ0Çc¡hI\ •i7MÞH¹[\T‘j ~ÌC%XÕ3(óßøþ§?ŠÇö?4p=˜ŽºÍb[·½ƒ1@êO'ÑgºQõ~¤âÁÕ÷9'Éí°ŽðZsy©A5ÄjWizkðÎËDÅC•ÛÚÆµÆQLS¸ÈNèZ–~‡[¡ÈjB6³GÖFFw@ã#¸ÖØ ß§V=#ûsñ´ E¸÷Þ¾¯ó0ˆÃ°bÝñ«I*r­"ö¯=Ã4W];‘ZdeJŠÑdÓdmÛÞБDt»VÏcãÂ0¹!¨¡Žå" s]ÁBäKõk-Ÿ;û;0ºà"0K#e¶Å€ûÚ|­¯?µ¡56QÓ繩<úÎ4îbº–xC¬`˦ȒxM?ØëÏ×Dj åšctO­¨À4•¶róŠ·¦´iÅ‹˜/[“Oõe¡wÌŠŠ\XL{ëŽáÈ.D©[î}s«@ÐŽ T®¬4Þykầïý‰¹Qßù1ü¸®+[%öçc ձΫ:y»:ämaÝGÁ|x]Â0Œ¥"X~ÙÈ0] ¡ Qáí®$¯è3¨I¯N`DΧ›ôI5Ï¡fyh37Êcذÿ1ÖXëIa™OëxVÔÒ‹ŠL ÛD¼óô‰çô‹{ïu] ¸ÖºÖ‚`ï*ññÃêÿã´RˆÖ†«`h`€¬¥àrÙ7v)4¡¬µtéúÆÇ¿Tõ‚¹·Ë¿Oš_ê¶ÜµB¤#©Üþü˜ª:jßb›ó‰²ŠAP‹hÂx¸â¦føhV¢=‡ÛüºÕŒC¬yQ67d{‹B3—”í ‹ˆ~ tg"±ÿQ¨ªûÍÂO mCÝ÷§²ÄÁJKtd|¼óòI–M<¦L=Ì’=Ãõ`ž>¾ëûèÈß²;œ°mµ <j1©ù{Šîw\Àºâä4€Þpr­¬ü剮^¡GƒoœÜp¿è1‘ó k&rO—›?ïÔ *Jl8¯÷¬xE\¹¾^±ÔbÔ½bðüSïlwëæFx(Mr#¾ß–®œ¤°õ ¢Þ‘0uâ¹×Bæ šTQ|~ÎñšuîWü¡Ð ÒH‰·”äµ%u´­$ß+‡©6Ñjc{cƒ´sFFGo‰çc{F$-o·ÆLWw&£¿=‰LNç4êŠsÙ\3놊¼†õœ¹˜4È×u–{ÀÃrÞ*†ï as9]ìIÌÈ'< ‹¦ÃN™ˆCë>äžxq±²ÄPȘ™t•ó〈=’™çòÞϸãôåhæö¾~w2Ä‚/œC‰l‡çµí—ÆçÃìã8]þ(-Ü!,§›7:ÊxÖv€zTfß8ž_:nÒ^$Hvö œíç‘ CZb9.Ö{íóÑÔ—>± Qõ§°Ÿh7MavNXzñá\:õ¾*ÐìO½TñQ6cu‰‡g 2³9ãÔTNÂcˆ6¶ÿ¡€2;éoÒTè5U“–â,M¯ª€ñÁR°Øp²‚ôÅ?éJµ¾…4êÀFqtt>i…«€¾œ5ãó¬4Bд-CňwFž#Ní¡ùoêM^¥>½Á8ÆíÕ!7-•}5”Ï_Ásšk ñïàýùfÿÇ3ðg‚L‹xÏ?šú[† ¯Ø–×ßñuÁËÿúëÆ9úyäÉ?êSsÇ1¬9=å%Õë³Ü‚/)í..rœ¥y¯. #E@üý´âÔèÎÌË2WèË‚`­5ª½=©n)‹{V 0׺&¥£¥.ôù“ šê\<¹Ú$¨|CÚQÜ·Šg·©Óµ"£àuð˜7ü™nýý€Bec Ú\EÜ~¸HÉW¿ü8ѸU¥ÙÍ5_?y¢‡h†:²O¸…—ûg¡Uƒ­Zù"Ü Ñœ¤þãn<ŒÃ¬Ç~Ù4r¾ë.}c·¨ªuiò´ ÇKMí¯/t9ƒýpä'zWr Â+ÜX݇œ™él1“aÞïùÌÍÍô©îyÇeyó´šõ#‚Ã0fy)p"ýWà82žu._nãng@ ‹›Nù3.Åò¤‹ª©´Á:7Xuzoã„6çU]I‰ê<\mÊSpSº°<ÖD;Øã&øÊ_a½c ÜƒñÄLÌðéÑ@tÃ…ÖðØ¼¹Ú£ÑÒná’ïù*î Š~Xò¥‚½wy0½˜Udy»¤TEdžÛ›¦ÛMkÉQU@ƒE¹¨†s˜ÛÌêrYÙ̧„¨çm.›VëlЮ}*ëk­âZ×ÿºÖ÷¶À®`Ó,‡J0MTåZªz)ò)y8,…p5y-ûèZÈÔQ:©ý˜fÚ΃$¡¸pŒ#Ô±4ØëÆù@×uô®©ÿÆXøÇî2ˆbo Ø÷³nä¹8ñ$_zº¸«ÝzK²$´”­\'n¢X"Þ‘H ̾·&IývØ4‡è£ÂQ‡æÿrïmg+K“Ÿ½¿mïÏg›©ââ~‹_ªŸÍ?®/^—ÿõýÿ~>ß{3£B,‘϶(Ú5žî©>ïÅç…XªT½(Û‚õ2Ê! lËÇ0×»#  t9:×Rfä„É Ü©¼ïÈ[u)úœ¿ßM™?¸*‡÷|oÃ¥m°Ëï(3¥Mƒ™V)!I³·ñfJñúPÓÊëÉp+߸‰–Oy;¯ï1i†ªú½‘"3U]^ö0f®¾KÑ YK.IÊZëëë2³ÿÇXîâÞÖu9À*€B'n›·Šb]¸»ë‡wþ0e‡ìËæò-˶O>îc—¡ N`깪1q½w(ZþtZ "ø`“„Q—gpbñTƒŠZ;$’ŸíõB@MÖR¬ÐhÆAKœž#ÛÄ5:ø|eœ[6 ‚Â"ã“qª#úࣂµr_dâúÿh挶ݨœ±t´#’³Ÿí÷ìÒsšÌ„·(ÇV¤†%,ç†Ü#Á‰7AAÑ>]úi¦òT&¨atÔò€Éò,‡a lÊ «ù½­æÒGŠcÄgãoÖþ)pލêéŸ$Û¼‚»2Ž55z†öÁxãÃ&ŽR@CiØþ²z¦xøY:Ub£4{ˆŸ²ø¿¯egAã§PÉÚF8Xö6Od¡3 a*¥:eéoÉæjÂ4-89Ð[j6þ4 ªÇ•¥¿2‡ }Ò­ãQ°­J„?¢(z‡Ûwmzj·À]õ¨C‰üŒ0ÆrŒ’n n<ŸJüÑAú|íäÍRÏÇ ¨úíH<°^• cæ.¶œ::tfAo³q÷û>Ѩ“ÿtoÐÝÁãàYþ{ø·ž^ÐÛ¥?N8Ü›ƒáMÍ»anÞ).O£=C˼1Ïь㫙?–¸ç4ŠÏ|p€pŸíŽê ÞtÂüPM&‹5=¾¸ÚÍzÓÙ{ûT¤øxù“>qÿƨÛ1ft{ÓøòÌ›ØkŽ’IH;äóF¶ëbL0›÷Ѥwóœ3ϯÒòEJl¶òV×ßvl˜+höi¤ì ¦Šù‰â܃²$I‹æLÅ_ÅÈŽT>5wôÀ†cÁ£**ñ¾)^ú­ÑvU«#ç£'ÆäœŸá®?3“·ŒSýÎ|ñáßï%Ãc¤y󳆙‘<ùV_8ñ?Ëî¿B½w¦àû¹ÿÚ‚×ÿ¤ýÿÿ¼NŠ[þé®òMîúÔ<3s±³åRÿÒŸÜÿÔ&“ðãOh"5 ˜³6±)ýŸ²²ÉשöÄ«? Uzï®[V¼²È­Þµ²qRÕqß•¤=Ó_)ã‡:ßÑeþ5Α¹®©æ¡1öác¾î¿“OJaΘû¤(ŸÌ1­Ê,] ¥Þž8en­åö+žÏ[ý·“!ÿe €±àçqÜ7Ï:û'OÌn¡â¦¿;v9Q›ôx>U¹?½ðMc\ý×ô‹§V! IDAT`¤þ\­pšÁ‚ÛÑn€.‚›˜Ýì)L™»jñ:PvKÂV(XÇèŒG¯{£ÓÊwœTãìh!‘)¯_× –sÈÇv>«eðtàXÊÝšÅe®„§qRîŒr¦ã–ÍiM†!ò®©ŒYIü³µì0Ï'ÀÉbo²Q§XIv©Æ£\#pÍp¢Í(•§äXT0œ ¨À›]õÛ¶q³ Lô9ªªêRûìÀÇw™‰] €mÛä0£ÄYÒ¢_Ûö6‘?T}b¼vzÙ/â‚1ÍF³lpÉÍ<ÐàŒhÈB†âýævØÜ®™ýß{Kòû)4‚sÓç:¹;ܶE¶¿vŒB¶¼WžgF£l ͶªtÃä€.ýZk]eö§3Ô„BVìhoWç÷vP¨Ðevf§'”\3£ü¢ro¹Ö«f¿–¹³ÕJÙÆcƒ2Z,ǹ¨8>ýôý™)rª*ñ†Ž~ZA{« é…;O_Þ ‹Š)³i÷~*Ð""egP‡‡ÜWZ«•BŠbûÀ2"ýæ6³Ï÷‘ëZš£‘MnûìmÛMøþš4N_K¡ºÌ¸Å‚H(+¦¹±#Š"ˆBhîåá§T&ä<÷‡§¬ç$ùá&vZމ.Îеí‚*93%žC¢æ ÕŒ&–hÍþP¿=‚ƒt~çñ×Çk˜ÕÍKåñ’F•¬óÁm†q\QN,Ñk]L=5%<»kY’CK;?v3.=‚šõc= á&nß fF¨ÄßäPYu}}9 Ët­/½¾å³T}à…Üg™ý’œ‹-3Îç½XÃlÛTÙäÌXè\}s…@asW#&X *äö‰ƒ‹–­;4ù¶]NˆèŠÁ¨ìéaÀGÂÙk“†­ÔgÔ»ylÂÑæª ¨ÙÖ‰Ít{-²@‘70YÊýtø´7¸ãÁTW-“hoøQ×rMQÐ뫊QDÖ‚xMØ#®pk›]¤Y™ê3Ù]F”ç$´Ø]í¬!ªÛà¸Ó{©f “-,dOÉ}8q‚=SÇà­ ½×œÈÄÚ× a=ÀY¤¿‚_™|9” ïs¥±ºa¶\8Átco£Sª7jÖý9Ž@m¥Ç¹ÀòÙŽ: æbu†±1øn¡!þ^E-à H{µjX¢Ý$e­£ç/y‡¤3ÁMì_jR‡bˆÈÒcB–FÿÐ4ÁÙqÑx@,¦æ½4jÏ@Ùì’Ü·è`8CŒñ;îi9­L…À"-éI5ZšžlœºÞÏ× º1§ë¤~žìÞ¼—Ã#Œgµ/oŽuIqVQÜÎÞùԧΩt÷g9^Ö¿ÈÙ¹1 Óøíù¥;9Ó (â>^hÝ¿u¢ò4ÊóEPy¸öy3ZM‚-…¿ö’äö³ÿwN3ÈgûrW§bŽ4TúÖžµ"óÛ•ƒvŸ çKà,3ž[{̵|öïÝ9WDù"Ï”J½û@‚íø/ÍÁ dÙ“™Dä4 ÕZÏræøO²ÇÍ(§ß¦'µ3gÌó·åâ<©†2èÔçm˦#w¿›@!D?+æZȸ,M}Û†ë vžî=ûØñ×–É3¬qN{´ƒÁ+c†˜èâ1^í©ôçý¬ žvàcœ4Þ³眆á¼ÚŒ±>?¨Ôý9£Í Ú‘àðýáx87íßuèŸU©÷;ú'lÎdÿÿÀߨþÿΤϷ……¿iÔùSS€G fZHsÕœG/4í-îkã¥ß³¹uƒ¯Ía¹TÈ —W/£ï–U#2¤DêÁ®ì ¬'«/%™NïòíÇŒž Ë“o\¢Ñ‘öC{ê)Cc FeÅa­¿ãhÙbQg*ÑÔ ÿj‡ž.Œ³vø ÛÞþz÷€ÿã‰8MS[c|ðu-\¨À ¥ðôïóÜÀ³E‹Uƒ˜é½`¨êµ‚öRá̜ՎU*ß*òøcê¹8ÿ†QPaÆßTk¦ XnÄó1xdY½° v*,^òë%)"—/ é²Gt­±ß9‰«²• Á:$1ö‚~1dPàðeΩ±ïÌUçv¿qR›d°93ÛïgyNÜ“ÍYžƒ=’Õ0§ºÖr[J6‹ßeÀr›%DŒ­ŽÂmçî’ãA©|jz”?J‡ÁWJ]UCæŒmD˜Tpßë…™Ó?ÿ_gIB}å,•l×õºOM®@Ê×´t£)¨ëBöÜÉá‘B%ö,#ô˜ýq5|s8k˜PÅçSjÓ¢ÓÛÔÕᦀ Á©m±A:ŠyǬ|ëkHUŒx+¾õåÛTeàŽ‘bªÔ,㪪¨¦³>µ:±BŠ¡± w‰Sá?Bxp$ݸ¶·™) Ë¼ªSýý¢#¸wü¼NÖœ*PI¼#Œ…ѪúËÝ8-€9aÖ{Y´Ån÷ÃÅ”e– Ÿ=+Úh^¾0f1’Å夅n@ùX@4*¬”è ÅØÞÆZÉHÙŠUÝ Ý²³„W“K& €'d[*ß^DZÞªzŽ _ƒ§ä3³+¦Jþújˆ…m&ff»Ÿ&o»¾è v)ÙÉ_ìÙý;ÝÛŒ¦AVñv81“­¦É_EµG °_Â:¶r3îf,³Õ§šXŠèätŸ8“4äðóm¢uyž$úb«ë½¾N­À¡HvËM(4ZQ àéËBˆšÙ6®è»&ª*ž”€H¤IïOT?d.`óÀ€ôöŠlg=éK°Ê$˜‹è*ú€/½»‘áëšÒܸv"ÑQ¾Æ¥ naü¹Ñ0èƒÈmÝ“ï‡]ÕÆy™(2ŸÔ'‹…ÈLÔŸ»±— /è47ª.š¬U0Õ¥Ë'5›‘¾a_?K)V-Ý>úUPânÔåî›–ÄŠ¡@ÜQ‡R'‡ï§q޹T-=§jŸ@³¯ëbÊra­óÆòMÑÐ|”ð¶ùxhZô>§N¡Û¾ã=hm6]4Z¿ FK“Rº “«u‹°Fµ²‚`õ°[°LÃÙÂ|Úí¶#èÐgiÅ›ö‡;bê€lˆGZÄÑây´œ:zjœšãs¤÷&®_Ðõ¶õ­×9&¥Ò†­Ú\ÄKÁÀ;E¥”çlØ=³òwTºÿ†¢vof•d¬2ùžU¥2•Ü:ÍeXC86zÎ¥ÚvÖÆ±¶œé±óz‰á.íŽÎ*âíŽe MmÕ±ìÌ'Xä>c{.ã&º;LOëþÐñó_¹× ª­ "gÒé‚úñaâ©Úþ BcJ¤¿8ÇŽ°.ù”Žø´ÒΘLî¦ìjâa?Ãø£r„Žð¬‘ÛÊ÷"„ã6DMÑóÍÓ÷2áøÁ2¸å­Ó’×]!—ñœýC`^'Ïãn¢Ð?èyúžh6qlNûáM±”wM•ôŽŽà R^À.1™—Ø}ž„5«Áë¨ÄçNû¾½aPDòŒa§ë‚ãºíŨ§28ã3µU«]<)€Äùá~áN[‰ôö¯¢ÈGeñFÄg<üÊx¶”yá(›’Põýdå¢/(BP¸="9Èþ%™%k‰ E#>ós¨“‚ù”%çðbô~³£×;à=éyy_“ uó'ã}©»ã}oh ξÔ#3ô«¡ío“üõºþoý¬¿®Ãÿÿ2àïþíÛC/>þOø?ªãqÄWŽèWƒl¥gé¥%@?‚‚-e|Õò-;¥ª…Ô4Ðÿ 8^¾2ŸÖJ–÷¦UÇaº>ˆc¬gæÄ¡`Yj[f¹Í‹IÒ!m ¨mðâl~øj‚@ht«¬4WA Ž1ÑL~+ÍdôýÊØæc†e¦e>žoÕÞ ?eâ?䇨¤N’÷­,éúוÛÙiï:`›»O§¿Œäþ0ÃJAÐ6ÍºŠ¯ÏÕÔ̧`麮K² ˜œ\{´Š3Ã,æÈê> וÿz ÿdÝ™GÁoA ò¹vžô„¢þ¯ ã†éÔ“â.Ë‘xDOc™†Ãa•…>Fsøìv¥=·Š¸QĶ%Ò=>9€®-±Fü"k­ŸœgÁH³eºPHŸÌ'07õÙõ–3‰|wÐLN©7θÉ#ŸiÃ+”‰ÒËÆø;+¸œ!žXM>§Ñí’áÀäUˆ³aü•¥uˆ…ÑEQgU ~l‹¹&¾GØÌD®Ì¬T»²A̶—âÆØE,óž>UȪâ‹3‡jè¹o)Inûð‰ÕaD{­™‹ß*‹éu½mŸøE‰FÞ#}òfF°&÷?ŽP^y«~c“OS³·Œ‘^:9û‡,`SDU¯Öi¶½3g{ŠH“Oé³I÷6³AÃÊkdMåC%ubI±£dù Ê'$÷fiy’ 0Ô«Û‰¨8òwð_²s„fµ¿ã9v|&ä ÅàB]˯疤h ©¢´GD´¶Ó(¹¦ôeÑ”të¦ _o~ºW-Hb.÷ö.Ÿ°Ð¬ùK¿6?=Ûý!‡«_ªÐÕfLLQ.*WDŽ~+=&§Ÿ(—gë€!Ïþºã¬€Zå=í{ÔàÁx“ó“ ²¼ ˉaŒ%ðºV¨Oê¶ã²} ;•©xZ7yî0o ¾¼>i÷òÃΘåŽ73ߢüÁ×¢Ë?j3ùˆ¨2vlD`2«-WO Óʈ¡ß´ï½£ÄvÂê–jX¶ëT¦KS¥ãRõ" @}ÌèÙO—¡ÞàÖ_]À^¨®I÷ü.ÐGTÛœAäa'3‹ÈÂZ½vé8—ge€Þ+q"„aB˜eÖª.¸[A‚éå¹$„z­…kýñ‡Ðøýù|,´€bIAFÔB/ÈeÊsºy&Ϙ²±-ðœ)7!u-íz'X×ÿJƒ o„`,W¤]0ŠmîÇ%Gâ°ª|Å_¶›‰XÙCÀ•ÙG ÷K(sjèÙPM%^²˜å¿Î•Â¥”ö_tí«ó dcQ«_âÑ©—ô#Q.ëÄÏ Bè‚3çü_wWmyNyæLÛ•ÂnFHHJG+gîöy¦$ xǃ˜!¹û5—:E!<ÿq3!Z‚å9±Ae/nBc<Ž’Ùh¢ËÐÌFÙ¢©aâB4z"Œ[YŒån¡=ˆ½Õ·$26qÒ[Ñ ¤ÜËÖËùK@+ëcy°¤EäcP4 ßÂôÏë‰×HxQÆÎ*‡ bÈu§Ý¼èÛõãGP²ñBTló! ¦Íù‰¼w^H5ò¸³&Éžg&ˆ?h,öx†â—FxC;êí?»%ÝF,¸OàwËïµs$›&ó,S¹ ÷j“:©ô·™š€•÷ŽŠãÁdæ»Å—Ú„_KY%EË3hA:¼\n[àÇr_GŽ[CÏ}_ÁØ.öňÕ€yS`Fk\=¼É¤wˆo7ç15(„IDÄ´Åàñ÷ ¥4žY‹üt(°Æ†ìNliœžŠÈ‚F}n†‹g»ß#½5Q ¥€ZCGæ§â'%r|luêïèmNë˜(¡(‘G%Ú&Ñ Åh¨üÛ‹U|Ëú^…Øäf³êÃ'”ÛÌÇçe;š_aN´0Ɖ÷¹åó¸Ì±¹ÏpLRÿØüà‡Ø#]Ê|l‹Ø+ð•GQÛM¿œY'.¿>`¾4‹ð'ã;ä>jþ7íÿQµçÓ¿ÿ®¿€_"•þ‚²‹É ¼ÏªŽB`}›hÏ€¶¿É'+ÇlÀ=Eêàl)u>€‘CJí¨\Ü^ µÕÙº˜(³5Ž7*ƒsæGѪÌb`“‹ ž«"YÁìb§øÌÑCIü±Þ`éÈ2ÑRM4‘•Àf1 'èiìÎ\”Uáv#9Ds?®1c¼éQýÃv橞õ¿ø…¥â•ˆÃ¿" w‘7:…ÿé äßb6x,´|S oêÿŒx`oûqJ$|Ž ºzS·Sø(F|ß׎í[ÜÇ&]‹Ûs| \ä5³Pqðâ?ÈúAw>#G5- . X¢Û×ÃIØqhŠ€Z%ÇÓ›CÌø#`fyZsæ9ŠNÚNÉþ)Üäñw¸ Œ„q­Ãó¡y÷´ÿ§‡e¤Ý}/¡CÊŒ“°É¸çæ%KËÅOéê!4–¶b¸%V*{ªo29B1MÅWÃ*ïÆç±+EÄ[§Å[({o3¨ª«øD}äŠ!ÌFò Ä>¶"[Ë¡1TKøüœ”[Ê#ÏÍ?zYT_IÛFE õyt„e_ £¨EUÌo3!Kö¶m6ÖuóÙ±¿8Ò[æu×áJÖË3ŸlAŒ¥ŠÌ™±ìÏ‹ùõ¨ÂKU[HRi"4På²h¼ª2¤²ì–îmÜ{_×5Å;] ÿ†XP3‚ÁޠщÕ*ÎHÆèR*€tÊà “ÞzåëiæÝÔ²esgwy7q4»’NÒ‰p‰ÙË,Ù½Τu6c­PÌ£– fÒ,tîN1yƒÈòQ"ð76ýÕ/xå,&Fsç±—žÈ¾ò Š=ƒPÿÖ 9Š‚AÌc¦[4Aše{cŠã-¾˜Ù‡¶¶~¸…òµƒ}…!¢´¹ÏX-ñòÔGT׿&ÑœcYÓ,B Í Kñb¼ñ‹D­›Ï§ßÌ—èpžõÖ^]wxìQ(7ƒè˜Y×Ò&Œ5úyw`aÔÃ(›FÚZë¢^וm¹ðäÝSÎg0Ø~mùc‚2>Ÿ-"×Z¾ µªI•ìÂhý·ò©¡˜ù³1Ø÷þ¦˜UïÛÀR¥y÷õÞRDöb†Ó€Uí9•’lO€f0n)-j×w®ž\ %’Ò;àõ×ß¶ýyþåÞZ ªúBRU©RÒ™º-°Ä~î˜O ІFòÅÛt3wæ*ôägÈ·˜Ä@Èœ’ÄUw\ÖÛ¦«Â‚#ì(³±îÒ0wªïMBŸ®ùÚ×µH~[EœYWç7ŽÊªxaA$&9Å×Ò]ÐN¬–B»r\•öh,ű© +žìo¥¿zp~L–@ÄÖ:¹¡³³¾~.ýÒô'ÑëÐb­åD²!ïf ÷ƒÕÔïmbæÿZ¬8F:ƒæ”­EžÍ ÊyÀñ(ïFà —LËWœôRŒ•üíÓñ‰Ulí‹Øƒ}Z`Ï„¼ãP«“$_€(Í™gæ!ŽúZUXvA7 w G÷Bvt F¬Œ o“GÐ಴Œø7¢f§™)'kº™ßçk©wä,]ËwwZžh>vùȘU'=2üÄ¡»À½ž<õ.fíÿ©ÏµŽƒÀPØ¢Ïê0,V…&T.®CKQæC%·f +«{çïmœ¾¥ŽÅÏÙË‘@" EQ-éÍä`åDÒ <»Ìe5XÉùgêT€+ÜtSè3†æ>é° I7`õ>Ú?WênwAPOº‡‘Ì΃ÙU_[»C»à»uóÅþ®b ¥¿QþqÿS*h2\ <¤” ú©ÓûÏAË9ö~2y¤-Ó™;ôÂä8ÇÙ?»ÿîÒ"oƒ„nÍ‚[œ|–!‚ŒÐ9•y­…î ×)húöpŸ!pxµÞFA:Oýuú½úþÉ F÷B~]G wF0ût_Ÿï­mïÕL›Ê"\*m‰Æö«ì=_ƒ ?K–âDEô¢5Iq;”XªöÙÊ«À}&2î‹»zrÜŽZ—Y[Xý¤8VÒ/wŒÌÌH=ïÒ7›zœ|ãá–ÏôÀˆöH“¯WsöTVÞ—œá…¨8¨‹Æ¾EøZ*Ʀn~^ÚÊ)ñ£]ûeãá¶?·i+ H¦ú³¾S"©ÌØÜtKï+úX÷Š+é ìùòzÛð ¶áÏŠíÄ¢ÕÿÇèÿcIüo› à5ÜÁ¿âèÆ³ƒùUõȃ<›Ù’¼ Ó( k€5-·¹ë/èqšýÛË_«E™£Ý1—DZ ½Ôÿ+—aG]/ÿų8ºD€åðIPó”„Qí2ç³5ôòNŒ\[v÷r¨¸a½|XúPà¹ÉÌ1äYX[îòmi*B(ŽÈ#N(_qÝÐ%ó·XÑcßA¹YM~/ü“H÷¨ÜÓé1¨1îÜÛ÷—iN]õ'ìþü> pÅÑ÷tÌÉ3ˆ¹Ø2Ù¾Î3qs4,ÿéLä0Ÿium¨r¿ÜÁ– ;GZ‡9$Y7ÙEZ8úЯiáÓa·ö„J¯Í0îgŒ.âБjñHÏ×<ã•„#&Á6]Z‡‹ŸŒ¨Ùö\E¡P(ÏÛ€Ò‡I€Ü(p$rä&Z™]¢'œQ ÞŠ(¥|4ðåA-ZÐ|ÀRé#ëçv‹…pIXœ}CZ8™™ö úoæhÓNE±¼öqµ=‘üË,1m¦)å$³X6­Dsˆ\PŸÑc–öЪ°”»ÓÖ1È)JB—º”Cš|>ÿ²ÏCcj›†¿—ráaÈMÃríçõR%ù1¡í[ëûºµºý°` îÏJ‹ÜB!ùqƒ±™Å%½Tà‚.OŠnnئ¨Be¹.ƽqûÜGž˜W >0(²·ËÙº.Èþ€÷^»Ànt‰†šmn*äRýx^*kQõãúênBëäÖŒíŠñ¨0€uÞr«õz­Ñ^ë$À½ÀUg¿O¯1Ãÿ´¸é™5™•7Û©è‘s²¹r~¶¡Ñ9K0rÕ¢j]¤¥‘_Ü•­U¿þ]×Y 7Í/¬µdÛ~“â„e\è¥N2—ãã:³Ðú1j\B›Y´û-`t|Å–7ÔÆjŒ›¢ve)9¨(áÞm©¢ºpâÍD¯ä~E0jDö6Í»}‹z"@gæe,¯bJŽ–Å{fÙ‰áz3Œ×¤…YÁ™°Ê“>xÎ×K¯œØ–7 IDATt„lry/Ùv<=‘³fV[lM’f\Ÿ¢Q7`añO¯œ²ˆªêº¢·Ý蓌ªk(ÏîÞv?ÆïÂøF³ >@cIÈApÌ„ì³{ Ž,¹9N‡nèËÝE#TEÓh†d€ÏXc¡˜õ;óæÉ‚PEt……– 6ª½ð`ñøRî~œZ¢«««ò¦¶†ižp| hS˜<ž#~²°×Ê9,‡=!¯<ÎÁ¸¼ c*Úßa@‰C•ùdÆÔŸ‰YêðŽòyÔ© •ŸÕœ<ø_¦æ/…Ú‰9FO¹|b<2#ïe'±‹ˆ9ÿ‘âÍjðxv|vcýÂÙç-8áO¶t?rÔä}.$üçñSÿyòè_OÜ‹gH©LÍGçFþB ‚o ´A~M½4YŸÚ:»&é n듽“R~9TÏxFa©…3B³ëc-–^ç{w…wP‰BÌDW6{Ó²$Q·ç][OÚÅLc67rž%»:A;y+8n”|¢÷ÝAÜóI·&ò×@ÉÛzù€ —´ý\ôIˆÌ0ÅXÅÈ œœªºœ¬a'õê[]œCÀx†è§"‰ñ—™yç°~è!$-.ÓA¹÷:«^¬0ÇÝõ÷v®Ë/=)òFÌùF0¬}2ì½užO˜R7tHö8UÉÍsòñ=x”šÚÞr‘^c¤ô’2Bâìj­Iì?^=£v.“ŽŒ:4DˆÆÒÑwG´´u‘òaÉá).q4ýµ[ˆ‡( Žx@g4Q÷8ˆÃ£4—ÖñÙ˜c”kÓƒørWЮ³:iTÅRÐÀì~“<~úÉèã{@ñ)'Í( R5µø¤Ó"‹%c=Ž-¢ŠãÍ>¶#ÂEO¨†_…¶%ZÝÆ@7…“õŽÖ–Òê–âyºñ-ç‚®/@uÌvóâ'7¤ç"×þK¢[ÎÂ}ìoXMþTÝþ¾?âÁxbõZ˜ÑU+ݹB)[D]FžVSQŒ~ãhÛ6òóÙBùúZ^{¡²… ,$ äÅ%Š…ÀXï:vðÆ’Œ°Â5Š=mÛæeéå¹ÓD‹Ä€•(ò¾†ïÜK¨•öñ¦‘ûh°CÝBªÙ¾å¤ëÖPßžSˆ®ê ¨à].MŸý‘ô'ÒL|Š€îžuuÍ£L¹bLu|#áO6+­Uþ市/š6Íà±S «QÌiÙ+^Ãø¯ÏG· à òt$Qš»í2æÂ•%ÃÛlU–q»IMÅuDÑÞ›ÂK..wPsV—¥§q6‹€;ƒk´ üžÍKÕª›Ahä ]5+s:îÍÁpZ*4ç’)²%ÛGP´tÐÁ‡ºF+gj¯ÚÐzÂa¦:ÉÇœ¨Ü{f)îcþmäZK sagCb¥às-ÝVå´Xq VMÇÞïäû j\Ô$æÍÓÏŠuKõ³i8m6¨VN÷–þ«û”áÐkGã«ÇÒëc†á EšåÝZ¼)@TÌhÛ„Ä%ÛPW‹£fÛ>æ%Z áòÔÜýœí>|ò©m ]±»êä–-ª–ÓµPôJ Q¨ 4Ÿ©Ä{‡Ó`¡aòw÷8Ò-ÆCRÖ=ö]Í ¨ñLó]K#Rx”„Ö{ß;ÜàDEç>­P]î.õ<ÁÂ*T‘ï-U±‡\ë¸×ÃsðB:óôþvñµyÇŽ!aB¤2Àuj°áÊ:]õ1:+ýýrx3 Z+TÝ-®ˆµEBÛT"„“†‚Ò! rvTàu¸}Òªf¬‚E¶¦žmRVï»e"“ÒhA 1‹ÍGÉÂä™d|ö :WÑòYb )§ˆoDfITÉÐÞéñ»]t”lónOJû{b3 &cúçüÒòo_ÁÛäbVŒÔ8½ûœ›0cø膒ÄsxõË)ï–ûÝø“¿ÄGVê¥E©äÓÛŒ2ø“º|:äàvf`x¤sÐtNCòÁƒ:3ü“°>Î÷|èߘr3:Õ,Rt5§PM­âPšÇ?Æä+¿]yøçâ”ùÖúùæv;ÿ¸§g÷D–`ÀôO+¼¼ÔhDªµ3µ]Wéþ vC“"¤»}¥¶20| ±4°~[˜g}­d,k‡$5’FìRòêÈì-1‡¥âÞÙ]ÖÃØà[~bÃÎz•ór™ß’/GÇd™ÝèØ9T¹ºã?³Ï#ayv»Ø—?ú BýúRï‡Ë+GX¡ãp¼É25ô”/o&µsÐ>b“uC証·[(¡ ‰UŸ‹ëmžó i™‡ñk´‡¿þ†Ó þÆ¡Ï1¢Ás@÷úÛÿøÏÏ@ÿv&Þ|ÝÿÞ¼ÏÞœM‡€ß—‹&öÐåC‘$QÉlëÍ1ÁjöÏѪ[fÍ«©Åºñ_‰ƒÎÙã‡$שÕÖ˜)tV$¢¢3)—B·í³ŠûLpå-µ£$€Ý©2Æbgèa™ ïZîŠ,©n£~ÛÄÿ¤…G«1wà#§…^Z~¾zùwN‹þ«RÙv̾ÿ§v"-ý¿åZï{Yþì*@ʶՌÙÍHš•ÄM,É3nuîÅ!(Ï7h–6-Ò¹@¥‘!Å­3¨g¤¦i?ºWÂ’“¥ÔŒ‡+I‚Tvâ4óälç^œÄ´‚Î}Œ©ÿb€+y´:üÜiÆ”á-äaŠq‹K‰†ðÄç~ª üØc·ËApÐbÃSxß”¡õ `Zë“UÕ÷xÅ—ÜéGÈÀ&¶³´R›Ï7/ Tõ–íMÏæžbBަcçüÁÜàHªªYj=B¿ð|í» _K·µóÌÜÏx¹YÙ/-Û¤Úb´œ@{&AÀuo$M'þN"f¡æ F®²u>d%GI¿+Œ­ª ]þy©®áƵå:êÆq©eð|¬¥_ª ÈlSÚwÿ̌դ'ÎRŒ;Ï!œ ÞÀ˜8ìÙk7·¹MÞ>ßfŸ{]®‹Ê•&7¿w·À]ä¾D¨ŽQO±FE ƧCS•Ýh0·]ã±]©<oì†lŤ^˜q­û4¸?ÆËùÅC R\ù鑹ò½YBûðúR—¢MZ:dúä¾Tåí u9¡)µc•*_e F.…öøš,Ûjnß x-1YHÿ¿QÌ6t/Ué¹föïdé·b¦ÚsäÊyqÞG?’kO¬—ÛË…- ŠýLZM'¬â䵨è#œß¡ÔÐ % &”ËÛ·†v*Î’._Ì(¼œæL“H2úi›™ógP÷‘AY+)}fŠßÌúxTº ?GÆ#$ß2êÐ ±mjLƒ3‰ÅñÌHM—:“ǟȪ¸.³`(Cõ­öCNE8f1EpÞРÁ ?ºŽ`D%|$Ûb›­â°$ÛÆ¶l">Î<«© UY²âß[èÒõ$J˜òm*Ýp@æsÙ$ºth³26«þ¨ì4¬{7ÞÍÞ;,|¾¼ÂÌ 9aÑñ퓓òBFù«òîÝ\ ³%ü-ëô e¢1þPP—*¿GE¶5æèí|q± oµ~Òë1f&-³ƒR8¥ƒbHSQáù˜;?t¹½TÝ è/I«”·°ïþ(¥O2µÙh%À3²ÜóXáxäÇÄ eE z„\F}Q–›ÓLAÍ’„ñø‡_]P¯~‘äDMÛñ¨-w{sgÎÃly£nŽñh¹çÆ j¢sêPW¹´ž÷tØú¶ yYÈ6ã S¸­>¾¯E)µY˜ì Q²ò˜UˆÃÄðôºöVë X~@Cý/Í;ü±=­a•dæÅ`lÅšWä«J<춇LÐ7t#ÆâDºZúÏz •7¼ËÓžS-ê÷taÔ×µQpÛ%$í#½¥ê+¹GøiWý4¸îÕ$êñ'#û¢Æ‹™r4æ‰øx›DÏIÒ^\Ô!4ÖïàMQ(7pDXJlÍÀK 2!?ñ5øóßc™çK¹ïìŸαó»ÆÀ;ù›O'| ÂGŒéçï©,Ïq?ñE¤ãsŸبphcJ‡ÁØ:c]<• Xܯš§O7'Fz§©¿V[@¤Å›¹ŠŒø¶HUâÆå¦¢*Õ—"&³ú©ŽJîDŒâ•2ór|›5ýUY•I`m(î©2é&€›Ó#$’>;Ɔw•êü7xUÿ¡52´,lã‰@ÊœLf墣h4~e‘„oÆÌ·1–>ì­«{J_šÃèøÌxf¥Ä‹)óV_ÁG¤„/ã¢Y<Ìž¨‰n©ÿ¬±Ô‘?a‘L0Dõƒ.øøøiݼ E?Ïx{fü9Aúµïo٪ץçÿzûÿ­Uã/«¹¸gjäÌ/Mõÿ(·.þ¨&ØCK•ÝbU3LW,~$‘1+|Q»ê¿â˜4 +»…Y}7¤Í!^ì5Rµ‘0 ¯,jv–ù=ÉU+'pAf‹eYF$¡pJíÐRáÝŠ>»Ó»U]S{!±±óåh9ã¹:­ú«#?ñÒl{39à}©ù'&ÊsqŽV¤*Áæóý¤rBÀè{ln焨οʖ©üc4æûèÏg«Z7‡n|Fx3ú«™!ù%|Èp’ ~?b¾ÎRâßÝø¨¥ÛÅ“ø!ÏÜóžçÀ… Rê3vû^l\SVcLí^áoS¡Ãv G»—DÛ(cù…ÙÈq!£hfšsyW·j€“\Ø2SÄ0D)EwYÏB‡ñLËÁ Ä 4@BXÑ;ýÊ D쉟‘“ô à.º5-°Ùö ¶“Ûv¸ðŘT§-Ê5zP«in›WM!µW ‚FáßÈÍè'x¹«QK2²à óElW½ÖdA)kÕHëÛt1Üúß_m¹%dèt ] ®›û¿Û§»vjå’µ° ýͱ.e@ VÌ–3!4¬êuñÐHoëõÅdžqQ½‚•Ñx[â&·êÖl@l‹ÊŽ>ÚJq/@ýx¼Ýs(LVT̨.ËæyÁJ,Užòo&®<é*Ôwu·ÝÔ0²˜ÿmaTd™Ä¸$^Çe üÉ˪‹”ŠY—NÐx–ÿçO»!@/ ývÐ~zîÙªøbÖ›%G$Ø,©Wı‹FS:8´!&T¢·ßéj!¹¥“Æ`ýÝvÿH ¶¡Ó°]Ä‹ íkŒ\ŒÑ0†ê´}M£CE­ÊùD‹eÙZÎ(wÅzJŒÛD¸wà!¾F˜™?¨Œ$}ÔEd‰ yµjl ï/Â>Fáju%F­ˆÑ'vT"tœÏ÷0Ögòi¢HÄ˵?¶IY—êÒëëkÅç÷ ÏtïÅ@‰iœ¬¼0È2…µ\â|ÁYRœøltB_ÏÆjÊMI=ƒÉ{J¤ù F«;¢êÀè©®´’Ë0žfMp=/k ¹š™´|!•(BÛþP+Èʽ{ȵ~Á&5+&BÌ J €Íw›C!F\#±7¡˜ÛÚLçÕH>×ÓG|Œ³^1íFÖ‹Ýìd„B°·,!·Å k-êÁ;;N57ªÓõæ!üXª"ÑOl>!v² ¹ZÑ›ÊJÌÑÐý€m§&d¨® Ó…Ú?ÏÆô/'W †ë»¦•I†`!;]Ú”ÍÑb~Wb N¤7@³>*‡ÄåÜO=<–fÔFU ótŒ­rA =¥íÑÖU¡“HGfBƒý± FÞ·CùHàO“TÓ/<ù8eFŒÒè\´ô]»Æ“CýŸÁ…n'è¹FQµ.ÎQÊ3f6¦ß49c€jöŠ)ŸR»ˆÖ³Ÿ^¢³Nó®µÞ££¢K32k¬ˆ6ô£/0¿‰Ôcd•u§ø«~Ôf¾·QÏ5[ºåÑÕdG¦%xØß ¶;ñy(Æñ’'èž?øÜqg•ËZæxùKqWÁ0øH‚» sÀu0=LÌP¿=}ûPîX"à%1îÜ&œòå=rs¾sÄ´RÖÇÍh C7&c“Oí/ï\ ;-ýDxˆáÏäO6(Ö+É›Aù(<>I@/çrŒ0›g*N8 ºA)©!zBˆ]¤ _!b ʪÝUÔÝ£¬™5ù™9'óPÏ"ó>57e#­ƒÑrÜ úlð©p„™òÔ…Ü“7uãgÜ8MaOVŸÁSìãçã@Á×Þüž {F¾{HpÄSØ»ÿíGqÌtùø¢ñSeõ­Ç燹eAÇ¥d&|JDriK£¥G„i¬¶8¹@ø ^BŽ;gô{žsÞÚäç„_æ ¼ä BýZëÿ;Ðÿ/JèÂóÿ¶ ýEõõªü‡¹ö袎F©°wy/’²{DqÎþÌzž„7QQ 4W¢]F~¿)UHY+TQýÓzЬÕ>ɱļ‚uŒÎBëH-1iÎèxúÑ’U‹Ž XMåÏþc€³CxÉ=²F Þpýd»¥ynès¶½Åûð܈ÿhþˆ\7˜Ï¯´oÞ!I@˃ís?”`uf<ç½á>à1‡Â ºéÏÍ®¦Y”[ŒØ¶y==Ê;@=^[xÏ7À<9ú°$*¹;vͧ¥·Ì™¡·´èÐ[ÒJÈeF;S2Óe‰#DÑ¢[ÅB< ql(kÍ÷NÀ]owD„.áýj÷¦ÛÆf~s¶‰KÕú#ʽ JŽ·i»®-¶î¹¢ûò%ˆäy§§g´k8Šc»-ÚÙ¿–}JÃf9ñ,{bkaç.B`µîZAö='º_ÃÈ÷ç¹EÕ°4` FòwÁ—¦(“†.?Ð"`åÇd”¥)Œ‰,Õëké¥"ÂÍýÙ{Œ”ï-*¶K¿Ö"åó½?ŸoIÛºPSŸßvêk˜œ[^Rq•kwÁÕøßæÄé ¢ëÒè[’O4rÛ¥{ÂÕѸ«©9ù5ûN¹--³ü&¾¤kÊ3m?¤ð–-)…_Ÿ¦¸¦¬=!äªHv; ¤À•Öó.õ{Ò±6Âm™¨Ë•`o‡„˜‰Q»z3¢² ‹è]zªA >Èó?›}ÔŸ¤®þÞÊÚ½`:Ñ%¬Rli)–+mÍéS¶Ofp1\¶(#.›˜*öwœ«•”½ºF •ÅʈyúÛsYn+«¡£ÒØ)Ë.ø­«À€ê2̸^áp¶LIoŽâcø¦”Œz7WRÄ‘&^:ûý1ˆ¬?.Šù§´ÉB:¼HÕ%%Qú%âg"M:[ ©~ ‘kAW‚hËá2 ó=ÖâБp?õ?}1Ñ0³m××åwL)ä±:ç-ÉÍÑØc®éßg`»·>‚5ž7–È&ýÌfù%Ñhü|öèÅÊîöA(“id$7õBƒÊ…‡Y'ʦ¨<‰ßžk-Ÿ-F—¹ë,˜Æ¨Ì}êŠc[_‹Ví·OA£a=e‹xÐ×ü¡^%ú\¤8¢”€uÆFHº1µÝeÖ; àoWEùVIPrž³½|phÛÓ ÐÓ×:ÈØ-ôã Ù§b%‹¥äC„\„fÛbpm¬8í©¾ð¦{Cê!*´9ÅUa‘W5¢‡]êÙ-nþ¬¨Î÷D¦Rãl|ਵ£‘‡…±C•–¶&õ‡t¾¤Ü:æÆ`–K1²^ô;ñéˆÇéäS2ú†1˜È³˜äˆ!­eXÃé_­Ãµ8ø9>/Ôð8¥KsÖÑfy†ÑxúdºvËöVi§®Z+Æ{?Y&&hu B¾5zÕH&Ç)9eUÉÆÞeoóÓï=ãT>øƒÙr¼†³dz"NòiÍùNð¿4Y)‹XïþxŒ—Y;[ Ú<_t5>Ïÿ8ËÂn£O¦ë~~þ3•ÌÎ3LŽ÷(¤Š//‚ oÿÉÒçAù©'Uø¨;ísu)ÚZêû÷^2ßáò»ŸZ¦<~s2ÃÕ5¨Î‰8rž<"¯²Œæ6!lØûC˜Žú6¨Ö£o0§9ÑåÿV!^¦KùÔÓøòmt¦ 5ääšÅqAúëêc sÿ#G3~Ц“´ïñ¬#E^jtn9däg鍊.rªn Ö ‘ض¡Šy§ßËÊ ?âj¸Oَ˧p$Ù_|O ªåPÃECkCSVŒZÞ’Um–1 gQâ¼9ªz%°!QXÀ u‹ºÉ1þòC®:¦âËq:Ü€6õ&ÿÌÚˆšºŒ¯VƒæáærÓü_—=ðÖ1oáÇÍ¡W–p€®7k¹òÃ\KŽÝ–ÀÓ]¿Z¨½:Ú²ZWN¼B>Oq¾½mƒy3† Ë¡=¼Ñ7NjºDöœºæ ¢¢”OGµ/ø)>U–îØäYpÓ¤“6÷ Øm¬”ŽI¦w8°’qÀÏ×— ? [ŒX^ìøq tCýwúˆÑÖ®jêEÎMIáŽwß{Ä&]Ĺ>!ÍÚ-¡•7H0Ë6¡©.°+N:cZjj‚µ ²m›‘û{--ÉÞ¥LrjéÃF¢r–+ÆA<szÿ;K —"BÙÇ€9£¢õðéEÌY=³¼I¨GÂVÚ°M”ª¡ÑäØï%•”Ð-›[.w±nûXl¾é‘ë|p š÷ ÓIÜ ì¶ýIwLyzƒ{ù5–]±Oõw­¼ëiã,η ³g8×½³•ÚGǽ+ˆ'û¸.§”ôáµ—:8d4ËcytÏ mÓYE‹r:mõ|º…*-Ã[›r}óaÕm"[Ô­ÓPËãPÁë·¦ªÇŸÏùZf\€\¡œúºœºLÅ}>ÙuPįr‹×Žò;Ñx&Î< )²r—¡·ÑÊŒÃ\[ Úþô¯ˆàV¨?£¿vP ßÀ˜íÉ“"´áDbÛö›|F3âóÒ9ÝÏùjãa¾€$:­²®ååiœIsŒS+¤ðpj»ã&hf·ò6E´r:zÇQq›åâ¹tA/иD+–RQªÆ\û dø"'fÔžò(º)¥1„ÑXmF«Ï Ÿ”v¦µ¿¼¦imŒALŒª:[$eA,²t± ‡ò±&·»ÀCwˆŒeÔXæC†M•IŸàøP}¸üÁ–ÔG¶9(¹™¾ ”·þ,c¬4×xÔ,¹#óÿŒ78ÖkÇ^ÆÒav4]å|b¾ÄQá<™žY(ÐMñ¸Æ"îŽLí6¥RS ¹Ù7ÒfÕnþF ÷MäbÌdªrh!%[3ýÃâbZ¦e­óö¸{ÚÏgëN\J£ÍŠÈÎŒ~í¬)G¢ÿ5[~=8>kr¿§xæ%È» “…Y¹öKFﲊí>ô{ø¤™§qÑj1¥)/‚ìÙÕ_ÃfÚ¦ä;Àr:s ~áè8'3O«Ü°èÈõózÄC=ç?MjÍH¤?)M-°Ï½S6Ÿ“0ë¥ÞI<7`Á—jÎôÞüyvÞ=Hÿ'Ýæ©ÊñŒZÜ¥¾JÀGç:Ÿ#èf)È„æŒØZ$y­.àÍkPh¾] Fà€f¤;J)ˉI-z´ã­ùàuHÉÓ´j?ä-×ߊÌiÕµ vT±Ì2b¯±øŠ¶˜5V§±›CvÂX™ã±ÕÅ%AÅ ©ePÕ€w=ŠCñ–{ƒŸé‰˜jz}‚ù#éýe IDAT©1^Ö'©óò¬ÁWj;a2;ȳ¸T 7” Ô‹X— Õ„¥É‚Sý—!¶‰¤"gØåÐÜ\ Ni¡?í}»tH‚›¢ü‰“4¾ÊÏ‘\¹hy[yŸëî(µ_HêSý—%ð¥Þýoý‹?®½ÿÕú¿üG îÏ䟩þCNïÏÉä9‚bhïÀ9•|é]ŠÍÆÂÐÒt”®jN$”µfÔ0.:I‚È?a KB;Šœ I3À­ÜÀÒ$Ϧµ(%®B€èž†A‚ç›–<ÙCGLÀ¤*;ï+×%Æ‚¶žKiZ=nµ;³@„m€9žIÖ·éw6ý''¦÷ŸÇ¤[iyøä¿ÿäÉ%TS¯Ï¹ëÈd€¬µxl¦{[!ìÀ›_½ùdKv^Á1<š]ÜÕ`äõõ¥ƒtë:.¯¿ÞXð„üfæâkúî3ÌÌa›æX­‡1ªç~ÉèålWyÀ™h´ ‘Þ8\%qY<Šz3ñ´‹1 ºhUŽôL‡® =’ªÕ¸GÒk¢qD°eƒz˶•´Ôö%д[ê¹ÊÈQ«t‡óƒ·‰ûó/ß2-rœùáuŸî¾Ò„ (x• ù§¦Ú'l„"Ù¯±qÎ=)fŽùYCi.Ä# õ¤€D#Që»Û{ì¸SðÛÙ¡©>k ƒ±š»àlHk@øÉ ’pŽ$÷¬œ$ü:xº_mŠ??RU°if4ÛºM®:Ÿ¤UßýpŠÅ+šü–Ïþ>,<ö1^ò*¢úùno º¢‚Uöè5seVT÷J[½[FÏGÞŒbÝØ =¶ÓÛ±¤ €ÕbÊ’¹ú cÕ]óÐÊûÍ(nÝÛ~óд²F‰eƯ锅n€:Õ+„áµsK£lš4~ï=÷•{”û˜’cö‚a(!£™ÃδAé#>¨]-ÄÃOʬ˜LöZ!,J©•?Ñ*Ô̶Aág¶m@—. VÁÈÞH­`íÙT¦Ooi±ôŠ`ŸÅý×O!N .³eŒaðGsð<“!Ïs0«E…, ‚ÿÙk±O"ó™‰üQ¶·ˆ|ïíṯëÒ€ØÂ0 hÀ`wkÑ|È®«ÐæM”øÕNjãleÖÀ†úonsìI²ûUªè¹o©u1?‹³ (1*ŒvåsÜÍ%·ÂŸæ5Âáa"Èê¿®µÂJÚJ‚©ÛŒÏ6½63}¥ø-µ§9Šô ¡P{^Ä:FÈer9êdYè%ßìk9†^炦}ò@ dÁMÎÈÛ&Zœ \ðœô6Ç:þ”G¶§³¯jÉÝ5ʇ‡›ü=·4©¿wïþ±‡Ü_éál%Ÿ ÌËë{VLZÈ>܇\ѯšOŒ#ÓÚ¡‡|~k£hùÉ”¯Ž\Äà2Ú£»‹êÁ"c ;…hŒ¦xN„V’üs Ú+4`ÓéÅÐjMñ;BÌË}4cp©jo÷†—fÔu%s{èöh[^ÞÝ-Z‹Üè‰Óˆ–1NN‹[|x1)?×¢!NŒÕ}|ÝŒT»¹”<}ÞhœZ™C?ƒ½_‰c ¸\‘¡ p_]ùo­fÈnpÈ'•õ%7éq% ûÜ%ÃHQ²g%x9>P˜ !O‹BÉžå¨ßAó÷ ’~"õŸÐ=|$žðù:aÍøP_G¦Ï.ègß6¥ÖÿO¡ÿÿëåÿÇøì¯¨ÿxå4a0»÷§k‚9kGâòçÿMÙh?4½Jk.ˆîßa¼J¬”V—PRnÚÕª‡oÌvL, ¯žKÈ>•UýUN¦¹lèÇ“å?é6W½0ûxƒ7k$ü;ç€c&4´]/î|]Ò8,çŽñ¥wÂ÷Bf§U]ä®#Ä.œÚOðÚK†zžú˜Ý»Ž­¢ î¢3pér5:Ù ´­Ïƒa¬ 1g†åZÙdš©´hÑ4Óô…wˆßeÝ›qžÀFͰQËZ§©ä 4C|d®ý&¶Þò¹ £Ž®TõÒÈVøÛ¼âû¨‚(?èÒ¶!¹ ’]mÒt84@•‹ÄˆŠxé¡_ JÝòÎ qÆ`Øâ…ER@sÓМï/Á~‘H<Œp°IF>ÒŠlÂyñi+Š} [ÏŽÍ #…ã÷‚…?¶Ië©›ÅÁ¶Ñþ•«ˆB¶Q&#õHçлž¶EnMýhž‘ "ÎN{§HŸ2]%ºÎe$÷¢ÛãíŸÍë^5q&€°ëôF,–UñÆß˜nYÕ­BY ×ÊÊeÎ8)?qÆ6-Ûñú—}³ûmߖÃ2Ôܼ8æùRm¿a }»üð³»y¼|A~DÑeÊâ•0‚®¸å[^â¹fd½GpŒG}M£T¶m€ÜUfnŒŠŸ[SÅiHéS¤cÓhÕ þIîjèÝí4+`¢ëlIι”pø)oÛl×B!0Ÿ"«€òùðûûó½?¬K.ª^ôh$"—®l£zhRpl|Æi¥¿Íͼ‹û)PÂJ…€v²zÁ¥ÃÇͶÙÖìC7ÊòðÎÿÇÝÛ­I’9›c”¾û¿Üo*hØû%ݳԫégWRÌt§ª2##Üé$ xaøAÊ×tu/Àà€bñÓ8—ÞÿG©‹‘_Ÿ¹}ÍŒ¿þæ×Ü@,åŽéúÅŸöGUˆ®µV:M°Øc--d'G`]¢n !öÞn¡"!6+ [;¾MYƸHá!¼s q´Ž<–÷ŸÐlpk.±«ÜU×-Rªö.P2J׳t¡„v¾ë¸A67·@e-¨.?îr²Ã§÷ˆ!v²âÌ4F“nÇ7£ÈG?ÅÊ÷•J«j¡Ü1¤Xô‹roooÈÉñp}n‹*›%K?Û¾4¿·ŸÝ}P.!°Æ@ªø¢Å-›cûÒÙ|»Eß«øôêå.y^mcïŠü‹F͆ãè}`RÕs^–®<âù¢Óí¾]½P£9rúŽÜ¾‘øæÂóÇ5º¯š’&£b„•Ù½š4Jå‰Ó¥ÁÐï*ÂVPÉòË)ÓX@ŽÍÓ!}Ada¨™¬§%\]£¸ã¶¡Q¸H®Itêz Ös'.6•Ò‚€N] FRõÛr6(r¨RJ¢ÙŒÃÆŒÞÅ´á‰Aƒ˜¬oûhÙ6Žæ{’¢ îo3v2,kÐ×þ-NPÀŒÑç¯Ð–êts…ý+T4¼°äÊwoÛ&‚¥º_ ùC„— |À00è±*íI¶€p0C&Ž„ ŽóµLRÃ#‹?ZËLð© ±7>ˆm[§–I~ðÞ‚¸U–(̬ÞRÛ-‡Íé鼌Yص‹ø|Tu‘æM÷…yuø,àóà³> |÷¦w…FýmÌÊ«À®'ý¡;úP›”ï7ü¹¸B mK³–.–¿HÎþN‰JžzÚš˜óKÝÓ¹l¶íÈý "FƤ¤MÎÇýIÛ=>¡™¨r”’w¾\ÿ_JÃ7¢S½Ò(úJaè%¨Anû! Ñi;,¢¶hR–ô6ƒ†ê“¸,¦IŽØSCË Öt°Î] 1u¡Ù´ b…— Guvâò*/ˈk ?­Ù)à½'üÖ'{²çjÃLèIR£nQ€'}‰^âyU/ƒAo>;ˆvÓ¼É##žk¦6j¢Ý= P“mÁ8ÔUHÁïC­!UFÌ›ROpk)WWµô¤°Vi1^‡ »Äc>’B©í•/Çm¼‡*\- è\V B3a¡NO7*•…œ~%×eFʨëì|d¼«1™OМ±÷¬Äõ¹Y0»A "Aƒ¬9¡™ÝÂÑäá”¶Ù- _´n±ÊýÈ«ÒÿþŸ|¿ß¸­g³_UMåd祌Dç·ãð`Ýüs>@;ï³zÊÉðH™ñÐÓÿ#ÄöÊ'ð4â}ú«•åÔ×®ªÖ)³Î]ؘ žõ¯87b³w·Tn\`y37S^a…§H6säÄŠaÝ>æ±·~9q¸íEsìf¥TõbM~×TÛ”.\ø! ü4Œå˜›¡ø ¤w}Ýr1o(N¦Ë¢ñ=£äøèÌŒ§MÅä8Ô¦\Ø M½¡`Í€&Xþ. pòe¿Ä«Œ»ß«B *Õ|asâÈÙÛáUXÈÉfæÂég,hœîëÐïóü¼!žbê7x kgfs~$/ýóRáåû¾dSüÄÎ9ƒ&€;-õzùCøš(òdªÀާÔ_–ÞÁ7~ÿS¯“?£ÿÿážÿüAð_¢ú¿ÍŸŸ«®'D¦v/À ‘Ȭþ®ú_Õ7Ž–`ðòµKHÒÜÐÒXü¯és›ˆ¥Z=ÃǶ´† ®§®üï%ýgy..²Úl(¥÷w TªƒLªA’ñ2ü ôÙCu°Ïr7¹ÎÙ%^-ÀÛŒ¿à‡RHRüÀÒ[D”à÷LTåïèS„ßpCOøOÃX¤çßè!L9É‹Ìënú`½ñ}»¸/™ƒ§Œ8WëEœ8‰b‰5œºz};å'ÇFÔ§À–IT‘³l¢ §ÌïWƒ…\Þq©ÂŒÂ0o‘ÛHGN"V±§PÛñ®üM+ýœÜ;eúŸ3JƒËt`¨®Tó4l%’Ø9•ÉÏÌÌìÿš ‘Ô˜Ñ|E…[d[ך%Ì®¸’leŽ\Øj;U:=)ò{o¿þu˜Ÿ›À >}'Þc¹ÇވƽK½¬² {­½õZúùõ‹¤ºò˜Bƒ ‰²«1Voߑžù­©Gô"ša'åÉ0Jô›#áQígÑDÃËéVïrlˆ{›­þvÚ0oó<þ–Æ.K«;hìZ©牗’~ô—19Щ¡”ÅH¡^ùØ£©°"„ªµŒi—Ÿ¶¼ý³cçG̉òÜœ‡l_0íòؾM ï}îÄñ¶Ç^Ywnöýý嶯Ú/“½ª/ –&Mºtöu/…·É×¼ñT–®ÏZ¨¶„¯ðʈyY%Ü&ˆIJX¢ÓìêŠÏY›žb„(ÔÛœWBç­æ¿q€Mƒ›Ì½Þ+}¡ü2æóOÛFÛ::œ4‘çp–IÖîB€µâb蚨Ã!¨¢Z<ýá…¸½L¶ÝsÔõæÌô”øò£©E¶=mGQÂ?f£˜(LuIÜ!¥ü'eˆÎKÃ0à¶t­üâš £iv^à2qd}qù`á±02‹_èk «Öq¸j:ðGŸ¸ÔưN©®Kæ²s¬ì-ß=l{'jÕ¬1ãPX¦ó‚‡>ì!­lè›´ß5ûa½Ó‘»ˆ|óx;[ËtÞQa4¿Bã›Dñ±4ãòZ#§êÇHÔFŠ!.‚& s,Ú<¿,{râ]ÓKλ û4ŠVŒTJ I7[N™ äýÖÞ‹UÁôð4ê‡baOÏU2§8TrŒ¨×ØM|`Ö ™Ž£•"Š©cGõæ‚xvÌLpyµ{vŒ;1ºúOP‰±G::'ùvþ¸ãuœ€ûHM&Xö¿`ÞRe†Ä¼‹xhË7/qÑŒåd¸ýÑÛ½Oƒ.æÆ¨úbCˆÚaŽ~-™õ¸ÆÞo0ÏÏë#KÈÁu ‰…Ÿ5³,Ž{ÿßoñyæ1¦lų‰âØ.N]¾®•%ÐÐ’ö~gõ[Ò‡$‡±¦H×¶:ç”ä3™:qOj[)F©rº¼r¹rØÅ²Ucx¦5§s³à9–Ðs–$}@½æ‘„;î¦a8Ç›`ËãÖhZÏ[‚5˜Î€þ€ÊgaÁRr·bçèzÉ-‹Gqsè6ªÇ¿Þhˆ7ë‹´ãã½±9%„–$)…}Ûwyw­—8{Lû”{Ô…çØ±tÊî?&ˆø\B®é˘š ¬ÛXìÈ—!#…W¨Gäê¿ü-êÿ›ñÿß_Åßó2Ÿ§O<ÔèsÉ/Õ#@ûCJ_^óþ*²Í ²TSJ$d^´º _!ð&D—?ý_ÙTð u ˆ=`x&óÓŒµ‰%š4Ó©–®aªl¶FiTõŸèCñP‡¡¢ÐÏZ$¿¶{&‡ÑìöîäVCŠéÿ«ÑžÖ±Oü0J´4þä4"ĸñù™jLŽkæv¤ŽR¥Ô|o4l·³›U/ÝðUßÄPIòK[ŸE[&€ùk›mɇîý5ìª]cqÖÖ{úÓy| “¨s#VžUa>ÅI Ü™$¿ö=õŸ>U‘‘ÇòÇ„Qb¯q,‰ý`GÈ 'à·¬*)§¡¬ü^V »¯B„ÞêFßêu©®•ü¥ýýn& ™œ3£%É©£F Ãè,A{ý4¡Ì+ƒŸ–ʪˆÊ0R¯]},$±m}–—ªäz(ÿ±™¨8ˆƒîlc^ôBU)´>G픇šèߢ}u¼ÖÜx’š€Älêç”­¹Ü¥ÞO.ýõ ¾Z¨^ܕ҉ dZ‹ aD¤ÖY2ö¡jq'÷†»²/ç2ÖLÎC®Æ•©˜ÕÜqͦ)¡‹‰ÌÌí5£?²gà‡‡aºi7iâÈÐF9y5³f/ãŒïa3ªéáŽ|ì_(÷Üi¥+_áKap4Np]Ñ_ÃÀT$B¿œB ¬ Áþc]ª¢ªZ5­$9¦Ñ~°8òcÓÙg­Y/pñx’; “êÅJ¡‘4£9¬Ù$Ų@µ$\·¬|¥|°—®sK„üƒ(ÂCŸ‰4Ð뇡]C8Sg—… æË=¼w²—ñAxÇiD<ÕêœMަÒy»Ô)%ÍVF\¡üû×^W–ò•râw)ψREØ¡#›ÊÍèø pÔûò1-šüŒËˆ˜Ó¤ai»ž§Þo,T–F|-£n¹ÏG˜†m mǃ®äÙk`$üc2²mi½A/”¥&³2±c·éXaéÜ9TC×Ôöˆ¥øNg8·"6i ÞûÀ *ç<øG2<ë½=ÿ€æñªÌÎÑw`6˜^ZOçRD)ܶEæX­®¹\Ì,B¼4ïÌNõd-”‚q£WÜC;§}ßXpÑ?™Å90QõÅ£ü»</<<É×@à$bñ|–žŸ–ñÙÑÊ+þ²Óÿ_9¨ñ/~íßHüÇÿ.ðàüô.êúÎ-d¥ ž“-ÚPæ…0‡õÏu}Ñ9Ä ãç·r! Ê~™ÆšøÎ þ`ñó5¨¿®y§?U­âD–·-¢0ŽõmÏQºŒÛÑ}Õ4„iCEr>« « F#x¬á:F˜ÓÿÃSþ.×ó'n:ˆfçž ÙÓ½€ÿšÀ§X=õq™ÙÓ°ÿäápÌÞ±|·þ!‰ì²ì Ê)æmy"#›œ+«÷~å«\õŒD¥^sQ83úX‹dˆ–ªÛõ:ƒsÉõg¶ªkõжlpˆQ¤u«}óÃ1Íc5• f4bf .Ÿªî1qµÈìê°HmCÎN,3ÃÈ××Ïh¤¢\"îï¤ÊÑ#ëFטPÇ€@“Fë¿‘™wÎrï^WÏýå‡bCãÝG•êiòˆ=X4CJU ] ]÷Œ{ozïz Ù kp?‚¢‚÷>ܘ!î!ª‚ NÂ6ãZ½™[ájKÁ·ç·«–JDABv^¢ªÜ;šTqZc¬ùC59ÖŠµJtüS­<¦ Þß M¥Š&;ÀP5(Vå3(užõeyá¸æÊÞi‹^º Kå£P]€lþ®òn“NÁ§YU)!ÑHã7ìnÇŠª|¿öqòLú´i‘/›B‘ íê¶ýht‰1˦™{ôôtà. IDAT#YòÓÖBó›çF?(íeÓ®S8ÔOÖ‹AcZ¡F BÃ3óÒX‘ç6Hí(Æ -2žÛÐ~ içe¶‰ÑÄ¢Z@/Ã?z-ïaʱYñ"¸sÿ¡†³»ùjNÿÚ±¤»E! ¹è¯ôÒÉKYÂà£k}t-ý¨ª"¼¾ìêiˆ%v¬›ž]!ò3ª~>úë³4âŠR=ɶpÙµ¸=éê:lErZW\Z)×,…k¹¥ÃvÍçÀæÖ=RC©zmKK„ê*¸à£‡AÖJ2Mø£J3$ä·IÂê‘û-ó')”m!“›ªFÓ]; –Æ`0×¹cèÜ;²PºJ ýØþÆÙ³[‚Dü0áš tŸb8NïÞá6 ®n-;‘†ñbŒl  õvI‡{¨tžè˜`$…ö„ÃÌçÖÿ«:L<’VcQÏYös–uçB+ˆ¹Í¾[„&nf@ jàóüÐS¸ìWQY‰4ðGã¼ÂIKóY…ä¬mºé@ÿëlÈXH31Æ1 µ˜QS»Ž½©0ÁG?æj™dûóÔ‘ó­YI *œÍ ªo÷¨4qDQx˜>ï±Ãð»Í tžî«KÛj1Ó“8ô‹vVì,° <Ÿˆ`eS°tÙ×N´‰ˆ à£Á¸”“¹ß¤é®¸ÌÍtÁ(c ´St/·_™YŒÒåGÝò7×׈ÁZj>Þ¢«­ÔC C{= ‘(«¼xkŒo{ï³q–¤×ø!‘h,þE¾úfXZ.¡Pˆ˜Æ%ÀÉWëb•¶:zÇ1Êňʮr>VµE„ƒ3WbTÑÊ4ˆD £·t;žÑ-yÚarrñ}öXâg²MŸñ®t²§ëG’*#+¥ËA Är+u”¬>}µalé¯ê/ {3x0ìV±A3ÌNá¾sÛöâ8 —g†X®" P¯/ ±ãs< ¢BŸ¾­'¬ƒ…Î ëèÝÞ{ø³ÎñfÛÀŒ5%yNsLd¤Ÿ¯¿7õ¬ãG㘚N¯×‹EFMRïòJ>×C{í÷m§#ér–^ã£Ã":bìxµ:k°|º~š¿`Ìè‡ÿŸGUÔY)Û œþ~¸gE¸$!à,b9ÜàÇ]4“;´ÃQ„1Úàx˜<-œäéÉ=?¼LIÝúX ^Ó6ÐîøØ9¨íÑ…ËD†G‹ÃpÛ N aF3Íj™‡ÞŠy”G*ÿ£x˜Ç•ÙåÁ‡C ¬G]ßÜ(èÊÑ"Ñ€314|àºÁ5àEºýbèš¾I?úøyªÿòãÿ?Döÿ{rïÿ‰®ü˜ZέþmÎèU=Ö —Rž°Æ<ý>xLh>eT(bG¦2ó} ›Šøz9`\ÆYݺ^‹¢ª\èÃÉqK7–Ìöïæ›%ŸHÇ,&k‰«ÿ-QV90¦à€ƒ¬‘¾òM&Zð&Ñ?xrLǧ†Ó°Öµóø!ð;xjýÿdˆöX­j¨ `³Ò`©BŶxâ§å/Ž¯Ý¶þR0š‡‡ÏÊ“¼¥¼’Cë*BófK¯1*n msïïZ¶¢² ’~J_K=àÆX¶éKTB°ôNŸBZº3X €9¡Íýšñ]~wVOf•™‘jÔïLÕ>L? ¬ úZÔJæ$<Šq‘°¾ÑÒ ƒ~SóÏa ç®á°cøÄß»Ôâ°¤­ö£Ó™ì¤uMk&ã–ð @}¼]UäIßœ¼qmè$¿„bçkbYï‹–½ójLõ/¼ZxÈüô%ö"²ïôqðŸ6<1jt6@¨‹ eëÒ@eY-—_$ßíÄVU6ù‘‘TÀ³¯Ì8EÏyÍÜ5ïÿ¹R7g¡h)nß:.Àë»>tá÷Ë$«ÓòAWfkÙî‘0þÕ©P‡ªiØ;6ð'\Æ-ܹ„Eí(¦¢´-Ì:ÊžØgf(²# b˜q"Yó¤ÓO ^Ê´­0ÚÕes/©Žã4‰[Å%'–7zò#²iê?а§…i¹î!&¹íKRñÉ%^¿Ÿ•ǯé«íâÐZ\ˆƒñ˜¹ÿà$¹¹,af`8Ô+Ñóê‘`Cv´…໿Û6ºôׯ8}ÄUÝøóÀþæA?^?§&Â¥ ¨®µ F‘½‡1­ aË®¦¼4Ç”)¼»z§Aãr'å+ü%³kGþðàöËã°Cª.`¥­0‡Çê+Ë6I…}43K”-Õ¤£ŸŒï±UÇaãöy¢MyÊÑü¹ ØÇÌœ\s ýU¨§ØÜÅ®BÉ=Aá–|,Œ[G÷m(Ìü!¥fmÎ÷G`è5¹Ú¬šÙÇE]OóW§A"âôÖá‡Ó|yO°˜e)y_sä˜æY)3ƒõ€ ¸·ÚC‚rÔ°ïÅVÀ”£ àÅÀ™¯Ül°· ‰áËà‹ ÞÛ²ÆØBr4/•·G$º/³¤Ý•µ¨°·Éï_QMüQ©¶¥§PüÐhù‘‡§G®—S³Íú¸#œ|‹,|©$בCK=8þ—ŠvÚ K’¯¦ðÊg¤Q½˜?ÖO,ß(±{¶Ð»%Èt5¢H³a4ê[:BTW>3ýó±¸ã '6üÕ*+†¢BYÔÇŽ*ðÄmô`óE“¶í8<Ñ·8ßú6pþœ§\<&ÝGŸu§%À‘»ÆQðZùÓ£rTâÎY }–3D½¨Ž»'÷ $«.K:•]ørtâ*9\Úî%Ô tY¨©‹0ŸA¾…´Q¿Ì9AùšNÔ÷f^úÉAáˆ5̇•=*þKþùÚWµÏº³¿±¶ËþE~¨`D`«Qþ <|Šoi€pˆ÷UËKgÄ£H éf²m÷ÞT!ÂçpÕqsË/¨$9E‚¥+\¯u<µ|$›™ÙJ¨ð1 š*¤“—®ðA«*h¼ÓÄ–‘WÀs‰f(H!„2«oŒLõ êÙë˜#>PÌÑÞ§Ç(í¯TÜ#–±Ðáê;I’RÍ!]D óqÒ€w7`«šÑ¶ ‚"Á×Ò8}Ž”²Ãtkg)Pù'„!s3³¶Q"ÕÀà7’Íz‰©=&_>kÝy¡Ùð& K—–Š™Žé/]G™T¬¥UU„]mÀîf­íªå,h¬ö=b(¼qRD¤FÛ¶z mrä:UD¾® ÿ6GhµÜ QZ¡ŠukÖé3,øÄW—|Ä%ìÿù~¿¡JÜ‚"\ ÁëÚò5›CFU­R2Yít"¶a¤œýÝs½RÝ€ZÅÜ"K×,Å=œ.®åú1lû1oõGš~YÍ0=×7;åúÕ÷»ƒÖd#*>)É»{,­Ùã›ÉZìh{ȾG—ër˰ Ÿ×2)¾LvAöhÅÏ#%yOüȈï¼=^á%fZ°”ÌÊCJ(FµÝ·zKu‰ˆ‚ß2À¡ øå@„Ã×]ø%Ë—¸_ªK]ü2ÛtËmÀRp»ãäÇ]‚?#^Ó$ùÑà^½H¿žU¯ùöóB 8Ÿ\f¼Y 1;¾Ž“ž¨ 3(tËnHÐPiÉè¨RØ=ÊJ%x3êê,ó±Q’[B­¦™Ñ|EKu5ª=¼\d+CKÆõù¬A±«–ò¹CXK˜mïEX‹f¨É#¿GpeÓ@-qI¼‘ý¥Häû\žºZ¶÷ÕVÈ."D¶íý5A&qæGUªµ7Á±È„\¥çq÷F8€Bg ¦FüTSæã3Ò=àKô1­Pti=ÎHîï®ÍŒ@Rîçíµ®‚mAT{¹¾¢X"ün$ˆ›"Âõ-0êšÍ毴Pm"{‘˜`@ènñCÿHÔ_çŽ šœÌsK âx’!œ3GRAf¼‘T&F¯Ò¥ØÛPƒÑ%–žyˆ4K"? ¥—‹gæÒ“&%˜#Ä`¯°˜[¡$k8’<œÙ3pZcD€ê@>O\óúËñLBëc§…†W1½ÍÃÕâÎ3UX­ìå$øª µë ›ü3H552ÄÑá)•>êP{+Ëë9dktZÖ²Ë,;¢¼²›ÞEÊ7ºHd0Dò;å-tEŠéüK¥ \HÉÁy•xR+ãÕ€óùiH÷yÆ=†^Oƒ8/Q‡?¡O§õñZ»XÑËoçÔÕ(6Ìâ·¬< ìåO.¹O.ÆÈÅ\ª ²ãdÆHÂ$§ñduL³Kxfu—¯ÌJ5##ìÇÇlƱ҈=÷¶€`RÊqG8rö×™N\^Œ(-žs²{ºc «ÇGExAÅœ4Þ3î&ãŽÈÔܺfSåT¨ O`Ê;áùÈšÆëKOÈ Ï)U =ÉÈ[ü Ã£ìý"XÁ;lìpp­l½Q/)]Ð#Ýï[ŽtòÒâA³Ó#ñ;Ÿ]#™_µ×(iZ‡#OT˜ºT¨ L¹‘v$†¾|`0æ¢rQ’FÖÐi˜ÀŠ5»eÅ|ú‹™3yÀªÛˆ;w‹| I ­¿š€ñn'pH¡ñpÏþ@…Ñ•-„éÖ"ñ0.âÝ Œ kdêUqwª‘­œ¤~<µ÷+2…9Á¼& Ã3z3Fæä˜-ˆœÐ<'t¯Þªÿ­úÏSõÿçó¯Ãðþ︋Q·Ü|£-÷x'ç$=Àq7Åå¤Ïí•ßT+)g~Cæ ÁôÂw¬«ÃC®Æ˜ j~3ˆàöF…*·’A5-"n¡‰¹B_«Q¤]§pOóx¼*þ·ªn ]«C¿–¯ ñN¦òÎíGÇãç#j rë¼Í4Ç#^uÈ)¦cV¯9ÀÙ à3´x)ÿuŸG¯š¸ƒWÛ„AUæªw¶-­Hº÷Ž ¼š•­CÍs{©'šÑ¨¦Õ@ «iøIÔÔ;&•լ܋ë'æðØ$ÜÛþšúëÏqÒ„T]ªe^Pá¶,‚böýâóÏ⦉&èx µ€µ>ª¡Ñ©ªq«â³•Qôʤ Ukœ.RTRĵœ®!ÖòÈ#¢˜N 7;9:‰Ü ·ÃstçÑË~„öÁÇ?Ö˜JÄBµÚR¡Ë%ã&ME}oI3g’H îÀÊøPÖ[0ú¢w!õO·"zäseŽ “V Ïòs’NÅb** 3,ÖÙâÌôV|Ã?UuïãÒEÚ¦! î²EéŽýr|Ä`- ¤ŸrP(²E„0âó©œFöÛι„tTeï×'_5Ô#‚e²%\ýÿ¸€¥ª– `tÚu ÝcÔŸ ‹¾«0’Y‹Ãè>Œ ÊRg4/¿â~ï/6tá“wÜçã³ÃRß¾›ô ¢sÑ¡èפíý5g +¾™ÍæBÊö§W#ßãìP#?kžºÍ125Þ(`êØ¹¹;g™#rôÝ]*d‰˜*];Â’qvC‹¶‡üÒMÍßÛ>|Î]*Û¼ƒaCþ°;ŠÑ¿OkÆÙ2ïšJàj’è –å¯9~Û¤Š16n6uÌÚ^ÿ×7tŒÛHLF·h„¶÷“c œ±‘õù¬õƒQóË8%´³€®OÎD¾ß¯óܾVu¶“¶zXˆ".F«}a¹†š2|Äh ù!jà¢L^YÎÊR•Ͱêýìcžaò(]i 6c_Ú²nTÿ£Ü+iõÅ5ÀP÷¬¶V^:o¿5q’·‹ƒ4ÛßMp9Ð)‰ÿT½ß˜Ùo䎖½i{û†D@þñˆPãËça)å' T[š5ö÷¶X‘7=A,›yh)ªˆXVtÕ¢„£t è2³/¾+ fd¼!Åh*ŽeÌç'Gð8Þ|ÁRb©TÃâeÁÈB±\ÃÞ’I)ò·½ ¶ú^0vÚÌ^ úL¸+‹e—–”èýašÙ+ò‘ü;M!ÜæDö…ó¬!º¿0Oó(×e7zãtC2×8ˆ(eÓ ­LAêªDŽj‚ï7/—5^™ÓÉÀ•Á¼Â ~K+zÓ^ÛPkßÐ’7[då³àq‰ÕÍ_jòsÇŒLd—Óƒ×Éø!à8cÔ8Oç‡[³6æxx;Oõ½ûÀ©™—Æð™<{Vbú”¦Ç’Õ}€šÆº³@¦ŠÓçÍÔ¶æQ䩸U]öô!£q`º ”Ÿb gÀzŒë 4e>޳XH1P6I¯*}“V¨«c¶±í—Ô?`"2ñz8¯0ðÆÃF>.ްÙ5Ô†O¬ÈT*ë03žÿ™B¶q°ÃÛŠ&ª^%·³Yq|ªèÔÁ1ˆ9²¿%†Ôò4K_Ïi>3ÕbOéë’•1ê>f9žËÖ 1hw:Ëcë©Ôn°¿ÜÜI¥±G&c\#Uwr?N8ì/Cu·—D0ä%‰qõ(Ošb¶ ?ßLŽÒ¿,;”=Ä%5ž9á…YæIªQ=W4Ä1YGQ³ôõÏ?[GÏ^…«çv¯m¾ý,mjhD{qCyñtµ9Aó÷r –~>+»´Åz›©»´­mNB'šú—‡|÷¤5ôÀ¹‘uKSó€«k¸Þaó4Ï¢3šW ZŸ ïdúmCpq|4>*>ùAËœ2©b9í®opXWòXu_(F[RФfðÔ¥¶&´š¨Ÿ}F¹­gl(5ú褢JÃcvAÚ$ëë%§-0´íT§¨ûߊK@¨‚%jbãäD‚ ݆Ÿ!tÊùîÁ;׫éÎÈú—[Å~ÚY“MÓm²ó±P9R‹0û&.n.ËqFy »È6ÉøÀVvM¯-'i<Ò6žÆáÈe6ƽO–†<•ÇâÆ'—‘´íÛÞFÊ2ůõk©ÓÀ!öQ`>![ü(y’öû÷þýý ÕµÔeM %¿{'°Ïê>*XrɇkÝn9Ãa_ÓZ‘F(@_ž½Œf¬q­ÕxVæ]N•é¤à ¯‹ ÆÝ§+G¹)Ù „jLXJ™x_¯–$Wµö¹ÁlS¾¿UŸ=œ tÙN/™ïnXG¬ºp×MèöÃ0æ¤ßÇJ¾7)›Nt5¶#õÌA Ç›6;Ùò’J¤F”‡Ò+R¼>/ïâvÌ¥ .ûš˜µŠ%fuò°csÑÊZàÊÿöúïH¡::îê}Ìpð—í½UÕ“œ€Fï"4ë0û°mQà>oϺ€…þ®öCL3Þ31‡:»BeWÁtûq.)¤pڔ”4üÁ®3rÈ"íNÆ¿úUhß~û:œ'OÓY“Ûí˜åÃÙFžy3‹.&<ª~tÌòíG·é/]Н}wvŸ£veÀYë=t ìrøþÊÀQmèG+cP³µ6×7°Õœ ]Qê{HïÁ×ë«(¦X½33•Tîãp'2Æô&Û¶®`i1ë‹>o,‡ÂØàF@]©]8Ÿ#;Š_":q¢Ó“=È¡ßT?[íÛfMv á‹áÂv‘ׇ3a+~«'`'9/¼[™z\;Z÷Xlw«¦#lAÊFºj„4I¨ 8¸!(_±¡ÓnÈMiĉÀ‹]é¨<7ùdRÏÊ ‚‘[›¦âRŽƒ›’¾ãÁWÄ‘Ç*aï„(rÚ?ó½ä”40—ŸJ]wJ}ŒÉyì!^ê|K­äÓ|ÚßkÔOK×[œ*.¯ƒY£6j8BN¹dúøˆSQæK}odöÑQz -X“«Ä µ‘£?øÀ}ã° eûK :Ò”˜î3k¡¢„‰ùêê êç¶dõS“§†vúǧg}М»”&mœ36ãý”ûÝHº<Ž}K}ôqÓ[ÃaƒÇÞ,vR]]{ŽœZ0âóìI "ß™ç ŽE¥å€±ÿ0­ªŸ•m|zóË"ï·ˆö(¯bó)_Û9jKÿKɬêŽüäPaiÁ-3§Z˜]áÃCÚ¤Ÿf !N|<¬ 8’¢8Žù±Ðƒvœÿ.)&¸gÝ7*Y–ö´*ç^©þgµZnlD0zAÆ}(È:Së¶‚¬Úµ=š¼ïji¶8‡/â•2ï¢d—ý\pxÎÉËKu ´ð&ýµg™8¹‚3·t@8ª¥OmzÚþ‚°x”Ç0Ôÿ‡ÿTÿÿwB=þ­»ùHIüoZÿŠú?²^À¥þgÇÑÁL\cÓê{/„‡³v ª…òG-˜þÇÒЖ؟¡D oº¿Ë×"U)ŒN¡îGút°2-›ú;pLXû–lO>û‘„’iO¼eLàÝZl&ú)ºb-?çY£ª÷¢ÌŒ¼é}µ'ø“ÌS7å>¦<_Æ{ç?w…·J/¯?´þö¤—¡wLFXh È^žÜÍ6ÄKŒSxXJå©þ'»¾µï£©˜Anö]ZFcTaHÂ<Óó±‹P–Ï!oþ¾ª~>b›“Ì$z9ÄÌa»‹3Ì›@ºïÂD¬_ŸÏZßï6ÛõW])DO"d±ZÒòp1Ö•ìþ’æÀº‡Ò²¯ót>&'$´¶l!,žyþÅ$%ÍZ¢fú’÷­¨ŽÍ˾š®ï¢ê‡±v¶ ­ ¿?¨pÌNœ2Lí Š«K;¦„Q³ÕÏöÑ*ܧ“3"À¿–Ÿ~‰š1k-1¢#¬‚b*3Ö…‹­<öع×R €_HŠ<ˆ–SÁϲÜ"áÓÎý –_Šk)·«’^Žìßm›÷`I»ÈZÇÆ¦ïܰ @” {:‘¯[8!Xf¤j +?úDËØÜÝ!’aƒ­¨ÌœoííûekQ{©ÉÚ,]®Œ/ýØÙºUš)ß½í»×/-<.ž{¶sˆõÑåV@UÑÃê3²zéiŽ'1M¶¬µ>º4Ê$,?óó€ñ€yy*Bñ§GEMПÚùüÉ6¥ X4AºÄ&PÈ„öÛL( Ý §éL꛵ÑzÅÿFÙF’ºeÀlº 4>袬Øò($¬ù ˆn±ÿ×û;rgî±€¬;'Yç;LŸ]~y²ýéY âÛ-¸Ö)Ð=ô£EhQl¿ßo5Rd–M‘w·×´X(£ý;w\í&¾n¢,jûq3ª77U(;RGLê‡2Î j@R½±5@lÂ6 Ó…ø, ;ü"µ=~òëW¦ {˜ÂýÐçî`ÿ,(ô–ó|²®£ÛékÄ=odo,ö—aæÿIn J¥ñ> T î®çÍ?´7Gå†1Gþ¼ò2€k0F™ÃõL >]Q½Œ º“)F.R,æÍºR~RìGP€.Ø.ìO¼OÀ˜ËïãîöýÏ¡f¾@¬v#¬™íî;Ù,&¨.ÊŽ70HÊ©cW=²2§­"²Í¬ ‘(a¢pÚ.!£Óvâ:zgžÇê­uôѺn53¦´@72Ôæ°ig|°Ñ,y˜"–‚ X¢}BêÏkÑ ðÝ·Y;N86“ÈAæ`Éò£ %]óç5ôòXúŽŒŒ²¨ƒÛr—ƒ 2XÃóÈ©¶/:¹ÖÈP¥%ÐInøœÁyÁ³k‚6E úª­²µ@|y KãµJ¥)^dqJåCâz9Š‹® IDATŠ&ÞèÑ=½ä¡^]fÅf>(4u©¹¾´„f‹Ä8Šš3‡¾¨xuBÎÓ¤›Í/vÏe3½á7—¾+Ç€åЧڞÒ|xí†\4ù%¼ú¸îq¦†8¿mc(†ç|Ê‘óyË)ì!™OÚùb;ðxªXqL’Ó/?õÃs­Ç)¶Õ(2äÙ%ÒW‡TqˆùLÁŸIcËó­=ÄÊî4i9…¤Èçq¼GÕÞRŽ·±|uÒ;áž'Íå2$èÈtz[ù&55_» ¹È.; zжzU©Eæ|3ÑÐ9°ÌG²*½[ÎD4‰L"UÒˆýêgœ+ò3îŠ1€MÇ{{+BŽa=šèbÄŸûá fòrg;8ÌGˆŠUšÄ)8‚ò#—t2„_‰dÛ»ýg 뎎)БXý'êÿŸ üÿŠýÿßKúÿ'þÿNý—ŸÕÿ# rBÐѬYV”ÌiJOn4êÏh´d΄`˜‡Gi¹æ#Móÿªù¼ÔaG vÅÓ¡¨™ÑtÖs±øÝà(a9ï(OqÍ&ßyõ™æ¤| D2 nК`9áó˜w±ö}:Bp3~1zá ‚¼æx0L+<îâÁÿâý¤{O¥ýÒJ¬‚`·€§T–ÂÆ#ì”ó ¿´:<ç 9Bï¿?̼ͪõûýýínê‰èah^5Ä6´õʵ´|Qf&4]«0FªoÝìP4ñs&[KƒŸ‰è¶9ÛAÍ–b9`+´ ŸêÿP"ߣª"ÛFŒ¸·­³¢”‹²´*…`biøÉhÃ:qš­R² 70®èQ-¾{—Ñ>©ëñ”ZÅýßËú9H)Ì®Ž‰ßöÖš÷CÈÅy¿Lö¶íÓŸ >™1G7h¢ ѹÏþ7÷;0ÃÔÜ·({ï䥑ŸæOõ½¿ h6âBUŒZE Ý#Ã* ç'9â&G¼¦ˆ:—îÀ·Ý{fä‹î¦¢Œ4—<&úS¬²äãÖ,G1QÜ1S‡@ÖZm¿ÎÊ«Rßlà«¶—Ä®8•¥2œ#· PZÎŽÊÀâ ³˜±;U…B™é˲VpʓӬ¤РÍyí¥M’kª¢âµ ³m ÈGåôòæÌ_vÕ¤£tµ¶ ÕØ©4”ƒî>’…<ë@Êm —xI·;8XÜ7!uwWzÅêàu|Nƒõ s ür¿]—õ5— §3G{m!ä‹f\ë eøcHËn!D ›ûÜ¢feTó<«&•}NbWG æÁ4o7E¹õ‰ÃÕ)ÖÄË;ÍKµ®'9ïbÈ ã`E b´YÖi“ŸÌ†Dý®-¨fe5™88\n÷AHrÓ^+@ýF& £«"Ltv¬!§‡¿B ]ê#š¬A@ j¼—tÈ]žÆ§®ÿâÔœÔó vcF^)| „0‡§OA¦w¨áø÷ûsµSNÿŒ'0úþã#Ú£ñǪÿ¤§ÿlúýçÛ|ÌÎp[@‡Gqrlú‘YO@ÔŠùQrʇh¬ W®l.à„Vï©ë¹=ãÐ-¥&s®©³c½Z ǤÒå5áªiB:£‡e#âSÃõ•Ó;wíäÅð‹ùÉ&MJHxä û›í±;@0_‰M$Ÿkâ)ž^u™5!xóBËÀ\E«Á(lLL,h‘+Ól‰Äi³ORºÂ¢fº†µ-ÃÊ´Žö¥*×cr ‡z+yTL\ÿéúÐα6ÖcÌ”"æUÝ Mà~4U³ò-™32IWaÄôd›dm„PdÓ„"Zã€`÷;/À8PÄ/ÊÚÌä:­ŽÃe‹`ÃxþN$Gú‹ã >J X¹‹cn5¶i0}Ê.zîP¿êXjGŸjûÅF³;[“Ÿ&ñÚáþúg+€6ºä€åAÿ?QÿÿVøÏ¿¯ò¿Cý¿¾ßÍc ‡Õ-W9èá°OKWk†å¡CÝSé}û|"FGLƒ§h6W,´ã^ÎWG¡"ä¢U¥Ya=©¼7B ´ûÁ‡¦ÆQäë¬kêüJûdÝ»ÎZЄ-øž®S@²}%¹ª½k“l™4¾h•ÈŽœÉäÏ2ž×pùeùèО 3H[U,x©‹ÑßY*Ž™rËËq>§E#/£ª›¹bÏXSfË—áÄâ>ëK“`4‹¯“Vù ÅÓ\÷ï#XÒ  ¢+( K•ð;à}›^xÄž 3]ZWÓí ¬E…ERã´:< nŸqöˆ«ÿ ,€ëwÑ:—¨>Ùí¥[»–âÔã³`Ö –ö]Ÿ_Àò‰òa1!¿[Ta¶U×Z Hö¶eÎÛ_uɯõë×dz;óɇ[úòxWýïꈛù,ÞK3Óľ[¦!IfÊFIê1r°?öëÉ‹›¤3FÔéz:ØÞùF݆û¢w‚x…» ©Çž&8oÍѲt=5h@=&¥2ÄvcÚÍhÐ¥£8¾&^>Wú@}>ÙÛ¬ÿй·0k"~œ3øN—staÜR‘²àaõ©ŒÀãiÈ‚ezY ´™¯™ÐÖZeÒcÈpT±ù1>g©õ S¶ ‡ô¬Üâ<ž d[Œ[,dvdÈÝX©-'Ýá€HÝŸ¦eü<¶i‹‹fÛìÚ,§·Kª‹þqóLls±þGU&d>ämûÔWTVn°T·DŽ#å¶7Ž)§áú|êªñrŸ>”ñˆŒ²á¶›¼Ë ÿ“‚ª°ÊŠ›Ü-Û"·¿lV‚Ä­£4Yf nt®©®o>ŠÆàü$7¿§õ´›ºãw0‚Ô(sâqÙ(Ïø*ˆ^;ˆ`ø×ÔªÁª+ÝbÒ‚È¢Ô¾›át63£—Ù—(R•êÛYÒ©À( €¡Rê¹o)Á²ÉOýõ¹0A¢Ü;™F.ô¯åÝ´~w#sFtT?]—ˆZ‘Ów+E¬»:ÃGUb/Å¡òJi>ÝuVÎþÝ£¤ü¥Ñ$ÆŸÆY´y{ yxmpU^:âYñxžƒ£deÓËÍl4œÇ.‹ßLÓÔÅ3ã¼#(ÓÀ rÚïe¶ê¶QÌ÷þIœ­&$;žÖ9§nðͪh”¹£ú˵‚îo»â˜®–ŠhN¶æÔ• ;>›)âȾå‡xeú¼Eu"Âç#óAMáÛÿ{î2x=‚O‹Í?¿fœ§iŸ³`÷4æã ˆÓ¬àCá_*/¥KºËw9âÃsõ&ÿônÏ! {;5TÜc2P–íü1 ÙVmÖå{i* X Ò¶y¤°¾ÊM¦%“à:àWýÑ™ÙæE±ì^Ò¤D a±Ñ2CåþäÞU?T+-Æ ®Ûllþû÷•óÔÓÐù‰æƒ€ƒÎ Œ7//e7~8°¿q™ô}Þ·µ@Wá@¿û®dáVÿ¥únÇ‹E‚²î1 ¸œÎtÙ}’>Œ|8Q-B#r¸$yð /ã –½zrÄø%GMY/ï¶ÕÏ=gUTÓ“ÿþÛê˜/¬þ-¦^I¯,`®2…"²ÈÕÊKgÇî>l'R/üH´ ¼àI’I¹li ÈxŒQ0àÀ‹×7‡n‰äãsvx3ñ6£”Ÿp9ÀŸn7ü`_çå‹áOª÷Ô{þ}â=ÿ=‡WíÉß9Mxõþ棓õÓ"z™ý# é½öÔktüæ!kf»y˜…fQWUÛ£“—9tðIW ŸUö&f²´·nþdËЗ̡ì°ÑÆ6™Bí_5†ê˜øjÌ¡™{j$Í.™ÊÁœ®1Ïöævô”:±š<Ì8#6÷myÞÜcw2b‚ñ·f¾èÇlÏã‹ÿ©3€O«HUUσç±UÞ‰ÿÃÚÖ‚–Y:ìfcg¯ºlÝÿ'ÅÍÿÊZË+òÈv…ÅØe37^åá<šSgûhÔñ¥»Ds²ÎaðP¨5ö8êZÿÏÞ{ùN`úéÊøŃþ<3ÇÃŒŠÜKu éÄgWAtãÎ𖵇qšk}E™H„¬Œ•Y§œáÁ£ˆ»l7 5ª<è¹_Éá8ñç˺¬Œèöñ˜5¬Ä­'!ýåÞá¬ËŒJÆZs0 ¸$ÝU6 }„ãáÊ6·ðg)^ðë(°‰¥ Ñã‘Nnß øEšSÃ->©€:†?<ø¿º¤%²•‹î2^肊~‚Kmf;}úqJuþ†jE=¤áŒ±áµ½[ý-°zÛl*§ íæîb7!k} Àþî]o«†&夢ž·æk¢Î…Ÿ ÃÙmí‰Ï})0*>òµ½Í¶°k1nÚá._|ç½Aa©þŸÿóËDV\€^-=Œ'Róý0q€ù üEòÁdž2/’— ›k‰¿­Â-y›ÓœaL^“™{gEÕ¬j%¼ØÛÅ(£ËÏ"ßÜ•þ¼~i#!pìè¼§X·WòÆ]ƒ¶Ü‚sà:$!GŒS¼àšîÍïÀ]üMhÆOîIŒôKÃD–º9áA€ ¡òùµÖZ*Kİä÷—Wë$N_â»>M=̦Ù2µÉÒ¨áðäuð*%¯X,¶&ͰÃÍ[€ÖñÎò<¥ŠcâS'v¡§4ãbXŠ™ê¥3ªªÀÌ®+|î kÝÔ€ˆ×lÞ$1qÒ!Й‘èí9E(¾êãdÚ†-5*yNÌò5a¢Qø0ܲ¶ÿö4%uë–òT»Fr5]w;üZëû Òü ì;]*’ãUp}¸••îÎa9É©–R·vïíy´kÙp Äpùx”Lb-SFT'UXdç-˜ÃP&¼N±ýVI¢«Nb–L¿Y–4À‹&1rØæ-9ŽÕZDµOÆ£‡k¨÷-bZ:@x#°}"“{sßÒ‚º—ÐöÖµ0Ãü¢õôÏNA ˜RlÁx%t“`cuVa!nü£q¦FиµKÚù´X3Û p½§®ÊĨHmk …Ö“nè‘¡Ú¹ef„LÎYO1Ø+GÒZ8B#mFJ® ×éYˆÇ¾Âv¨‰+É뇘;Ú"挰K{†r€ ÄTHÇàërÄ7}‡Î˜{—Ó–óœ™û ”°¬ãIRDRTyw6$9±Âs:nDçqõódªMâg ¿Ñ]rzÌ?âà¨EÎxúó{Ê1ÛëžÜ|/£äÖfÊçÛbý炪ܥ±ó‘ûÖ1[°yì2^¾“ ™G€7kfê­9ã5á­¦¸Ÿ†}l8‡Qg$‡ÚšcÀlÂèÆÓÓ<쥛R{¶êš½„;«'aì=Ìw›šK±.Ún¡|µÛy d"§ôcôUAÆn?ˆ†‹”Àsöçá¨ùmAG¸øÏ´>Ö<ò˜ÅŽéØù SÎPå9<ǃµßÀˆdtcu/úü‘>ÞqŸž…„±"ë®A÷2(¬¼®ÙÎñÜYgo”pØ,´7Ý2ºVàIt—¼3œB Ÿö[@†û½fÉÔð<ɼ’“/Üͽrü‡ õºŸ"äñ‘DAò Ï6i²iÞ¹C½„Ò[”‘•b¶¢ñ°I9’ÕkÅ‘Ÿ`‡ÇÿÙT€Ãå~‘ûgsÍàtðeu@³„noøl—§°E‡ûù†•³¨éX°²òáYXy_R\<“W³âü©ý”áß«þÿ{ƒ~ÞÔÿÿÕ /ÇCýoe~zü ûxHÜySI†Ý23;þ–NÏryRp×þ‰ŠçiÑýýgëuEE³Ï*"ª’2­Æk Èòz^Y¢Yr‡cÂÖR£Ì‰oêB(?í±,ßôb-)9ß)" ‡Úç'­y0α2§ÀÛ<ºVî_£6–-…ß«0D}OëÎá·¤üwýó©šÛ>3 7ö%²c$¸¯0àžRe¶Ywt/¢ÅôÙR;÷“ö31lÞò!”Ò.W”£É‰ÝÆU#°òžù¼ÙIIñv°¾m¿…;˜ÿl³µV+ëÌÀ›ÜÒ×HÿYm¦žöÛÔHmú=s¦Þô·1ÊiGk­% ¼Ê(vë%€†hœ_:M'8»„u.ÅTS©W0 çœÓ{’ñ0FÛœöܯˆª mä  ~ÀðNyf4œKÓ0~ºhÓ?¯nw­v[µqЇJ&\ÙŒ”îû>Úr¦­É*fñÿÞb*øšp’eu†‚"ªË™8ð¶ÙS”ïåÕÌyËÆÉ^ÕM¿MÌŒ È*¾#fAS *0QÍ:«˶m¦K¡ bA¿´€$oj¼¥¢úI³*Â2yÚÀ9úêPó|’t ×È¿ØÎѮÌëèªòý~—êN¥ø±ÔD>ªöý‡ï†¿ûËÍ3\´¦+ë²+Ô×"*Ü’èÚtûk?ÖDœbl²Ô°ðÃ#Á“Yõ¦‰Xš¦(‡6ÉdY%º±¶Í%·gévæ ¸ÎŽ•…bVûf»H´í”ÿ7g1¹ŠSÆÅ\±/Œµ¢fµ–ÕÔ o‘Œ$ÅÐP¦Ib ®u¾frnyTn•yKiýÒqËHó•qÈ'«2“£õøóq„ä°3<™ÝâÕßþ®iùOŸG¤½,O›ÈünÞM[­OÐÉ¥žÿYÝy-KàUÑê?`<Öç±½}Þ{Ê-¼QvN^ÿË*D`*oPqtíæïmsËpÇãw¾×ý¹â‚Í¥PáÇ ×œïô‘îŸÁ±…»$³x ¡ò²1‡%Öï6›CäÆOÄ) ”gGw@ŒÜUÆæ­Í•îóÉ„÷#òËÐüÔ7/ਸ•Äuš9&Ñà }(ÝdEÕ‡kvÀž9ü%ˆ~hZL†µØQx©±L”ÏtrtC`o,;ÇÅÌЉÆÌ‹>4b!”2޹âlÈ“ê M!‚ß4O#¬²ehDS9-PmnÙÁ´®£Ù g‡Ç"`2PtQœ"3¤‚çàPÎä4̱¦)0Õ¯cª5UÌø bܲ ˜ $ ÍÅ’;ê#ßí“Yˆ@–Vè§ ÔGŸçc ÀÿŽ2€Ï šPUIî2ñ¾ˆG‚×(Àta“K˜Q,ÏïÜÆaÕÃw_FŨ0ìZÚþêòÈ4ä¢@WîvÄ<¾¸·qÛZªÙ·iBÌä+n?Ýo™!ùèG"ë÷þB *.=}Ò“ùh³P¨ÕI@æq¯î¯˜†ènyš,T7ïÅB<år™´ôÅ;¯5(Ú¨Ñvj“’§x]vRÔ.縥Ö≊9yCïr)ÛÁµjä*°TyÉŽB×çpHË)Å*DuÅ8z5ÌÌàEÅîÖwfȇúK¸å÷æoÿŠb8[y2–o\2…U3 Úor>'¥èÞ¼@=SþN‚óïzg66)š[m¸I;9ã!'ň§gØ=[a4ã˜fÓ2þkØ®Ptþü 7™.•€ÕpÌÎ%\¹È'O\‰–F†Ãô‡·­;ôÖ[´ö‡=ÿ!wOßYÖRÇœ¿Òxâ¡FväHм×ͽþìDe<0kÂÔg支÷wš-fÜ{ûÀfïþÕ h{íã†$L¡Ä%¹IoF«¨ÒÝ[ §Aï7áþÏ|1ÎÑÒ¸WÇ\ÜSzžJ~à)ýaJÊ‹¡sc…‹à•V<ÍÜòˆ0¾¹KÛ [ô£•¸‚$)‰DÇ¡pt HÒLýŠW’ Ù‘®QÚVñs?q°hVR¼ ^´GÊ4÷ɈŸUéH̲©0Fj¶‚_c<Œ"ø:öW×`Sè-½äîsßæ•lª >V ž ¢—„Íô™å¹ÛžŽGŸÔñu=:ä­[Ýk`ò ¯0SÃ͑գHƒeج†XÔChPÀ1öŸó(«ßìoì- 54<)ÈŸÒL—Ù«•Óí§Øõƒ!ë°½&V°ŒŸ±ÏÉaŠ­‚Ú*5gyOMȹä8ið(1¬¶Ã{‰ |H@UA‹S°yœ^•^èÇDFø’.h_{Ò°È+Ï(Áu·Kèá7ÆnþQW¾~9žÐ¼9à)Žðq›^È£9ÐÏ=9h‘Çô¢X0ý!œ—…Yf«Š½dERê'Ÿg^' wïTQ}9è¢H߇SˆpYyÙÒ0Ï+=Á£ö° ŠßFháÈÝ2Ç32RuÁÄÕæ{Ô‹¤3ì²Mž”²1²ñÃâÄün™í"ñcCO`¨QhâV‰_±¸E'Â%&¤’¶´)긥‘jqü :’‡x#åUüÛöú†• 2ƒ[è¾®ã`ýhÖÖ–’y+Ž#€ÜØ4âº2ó†«NšÑöëÿ‹Mf‹îmÌwŽ ¯-‰¼J$Z‰HõÅ=v]‚Axé¨Y9 ¹hßW5rC$LUôþ"5'ÕO«¦û2þW v.Åg+¸GfûqPÎTËÜ2Aî߸yJΕǥ~¨•½%ef*&rd65f4?ó|L(ÇU#òÿuñïßÈúûwrü_ìþ½½ÿG“ñŸŸËñz«c:ºê1IJʦ‹ 2”Y\(È®ÜÚkel´_ƒ¶8^Cçò=O%EAïsÌœ×1¬Å³ÚEèÉôßW/a­~CîßóuÖ ÏÑÍ·U™5»¼$ýo³!09_L¸޼/kt"ÌñéäœW¯ŒÂxK—?/ØÑÏwÃI€ˆ|Ì̯%ŽÝ¨˜+«ZÑ+¤¾Ü®xM¥V¥kE>ºÚðæ0ºy Où ÛäÊmw·ÃBËësëòr\'ØR IDATFB[Õ¢los¿pUxͤ€,9ä͵9fNáNl|æmp´S\¯0…ší½Eä³–$°U1{ísKPoàÕò7, \ŠšL©£S|š#‚tä`:_#C/‰}S÷–Æ2L†Fî¢"‚úR¡*f ÝeàÈc˜Îç ™Û³€¡QEΓշ¢d¦.‹ØÃD–¼õܬ@ì­¶òTJV–1æÛÔcé¥U®r+ôþ»–g”«»õ»+Æí€”mر›õàkwEd ”²´¨ré¼TU…À‘ò¤j¨Ÿ^âáà®Po){o)`ñcDçÚ¶F~T—‡ÊþôP­μàúNTÁ×lÛ6[ A¹ë¶ëG[Ö#ïn„TC;ÄÁÊÿãÖ‡‡ê»Ñ!i VæøÁGƒÆb‡~»íî2ñS Φ– )Õ³*²1%„4˜;‹Sþ½Ñ¶ÒÑA ·, ¿óÏ\‰«çv1¡IîÌEÊÑ]EÎö±Z€*>XPÐøåM…>Äˬñ÷Þÿøýõ9àF¾˜h'rÖ¨ÎW\;³‡ø Û¸üJnɧ†B—BšŠòÀ!š»¤b~îçKŠæ ¦]«¾¬ÃÕò- 1£ö&Bš%ŠSÆ’€´Üq®*cE–$kéUÛ`Ô¥âfÔu¢uÌ QE}_Z[¨âˆS÷”½od4,ùÍ?ˆSèèúÙàM´˜«CÕåN3ŒèN…‘&Œ [I“ŽÝ3;{ㆀŸÕ—Äfw0ï׉²¬(#¿x€L(Pö2$„_]ásõ/dávfúë7Š"1×ÂGÁ8ïW×ìhÔƒ+gÍŸ÷æUþ~ZDI¢dÏŸ­ÎÉ•ÞèÀÿÆ뇘øPõÑ ˆ©Š½·‡ºdÌ'‚­tlÜq)ƒA°ÉÜn¥¦ÈÚ$MLR[œXÇ[F¤ÛwÆótþÔMÑÝâ:KÔVØ­')©ûOÐL¼F—&6ä²-îqèäaè«rÐÌk•…0DºFqŒk±é†* ~N"ç“o•¹rÕºrúJ¢Ê~šòs%‹ØL>¦Œs¬6zÁfuóÛ>:~Ã'E ï÷ì?)êý»$ûÿ п6Bxû8'‡®ŠKýz~ŸTõØÇ 3ô@îtU§òÎEØß{–óN-qeà­NDªä3 Q¯%õPÊëHƒy!+œ‹È*àBg¬“MI a3ÒðÝÍó-b5ÔÇÏG ª­ ;Æø·9 b¹hp'ï1ZQ²Çü  ¬­xM˜ñ¿Àû_ 7xmt®ä4\MWÉ£¯ê½ê!Ak™,Çü:¯`{ž…Z .ç…åÖ\ÁÑÎsh^ã"Oàkå¬]›F²û”úLÄúYfZ¶­É.Œãñp4×YÎhipn”[<Óј€ÑÔhU…6p$-(hhÙ6㦓DÂ#ÖÀcŽ£Þs˜v;³˜6UL™ÞÛsŽ>šŠ °É•¹YçŸ “µ`BÍh¦Š²z SD›éØcYôS×Ð\ÔKœAhûƒ>Å2Àzò;‡yú7ÅyœYh5ÖÌŽ”ØÃ'S`k–Ïr¾ 5øÃ²Í/¸pŒÌúEžq:~Zì©ÿyg»äÈ,Ùð{ÞÿuGM„ïø’”´’fMÒŽÙ+õTW±ÈL$àá~\Åê„Ë-±µeû·ÛT… mŒÄʸ§‡¾*Š(_ ü¯%"oroÛÜO:²A‚v â¥K€å˜ boîÒõ×ù½F] Ë'Uéxö§‡ß.=½ :Â9W—- ä¦m‹­øí3Xß|jAù’ÔH šµÕÄè9D<¼Lм¹C²àöÿ7Wwf=­ÑÑO`©Oå52ÜÚ °óyoc}ǯ§š-kÍj³Xƒ¬3ÖŸêЮ‹L–×jƒg ì%BS›L Ês˜¦„ᤆʲ×ú¡í“tÚ)Ž^yÿ|¿ºyö—ýÞÛ†4÷áYZ®ÿXvU?fŸkQiÇæ}ø'ÕÇÐ/GtChˆ®nD°Œýð‘hŒÓv°1ƒ™^¢žsÏ1íxØÅðCàwWS³ƒïdðÝa‹® Ö‚¯5ÕºNi¶i[eå[ƦGbÎÌÝe‚>Ky3a8ÛãJ]/¦%ÿ2™Ç\?¶Ð6Ü÷w~žù*”^ËþµA:æÏÕhÚŘ<Å/e¶v{³"4úKMw‚fFüÄ<ß›œ¥Í£s²x¼cIÑ­€”ÙPUO¾›%DT7éiÅ@GšæAjQ–ªP6w¶¨Áœ‚AKoʉO& vbZç o8Š)û þöÝ]«»HSƒÍ\<•v=qø ©([LaÐ#~en ½’‰$;Ò"“„ÉC6Cb6‹*=\‘#lÔ P=}iãû IˆÏU{Œ7Ò¤Q.Ý H×üzÒÂ} ói…Aå|oÆ’[ÿÌÆ<° ¾‹zÇKùQÌMÛùù­x¬5£ÉéL&— ÒŸbðª³'¦ñî¼YÑhœ£Â—GvŒÓz—pLOïFAv} ~­TñÁsÏ#|Þ#ý©;á‹8„{ŽíÄõåć—u6¿ô¿(Ÿ~‹alÀÑ›†ÃÂ?ýrYÛ;˜9€ýñpLÆ©J„l¤vÈ@+5;% 6õ.ïJ$vîØldɉpÕ0ÿ¢”4„t¥®¡ómÕ9ì!)ßä«÷&ÆoŠ(d©Å\ê]¬ºß‹¨kŸ.r?íaë‹Æ SÚ·¸[O»“2YZ­Wǥ藆æ‹ü(ô©B*ä¯Å1˺¥ ÊH=Q0ÒâéÑùŽa¯«¾ßVîò*•ïÇ÷©ÀÀ£¨Ê“+A •(¶ƒ°SüO‰â(:Å!óps²¸FÿJú|§¥È·~{|úŽð4ÿÉÇã×(GF1NútªCº²½NáË´ŸXh1<ªµéºò¯C¶ñªô„÷àRÿÏ;gBáz»Ñ |óŒÚ|9ñ7ó`ýÿešð÷Tÿ?ðþñ¾ÃõsÐê´\ 4‹Y*Ú_Ð+šbn8€™Àì†jÞ©hªN„ŽdWV¾RÛíœ0@§1¥êèÃð+m¥¿Æš^Êch"ʽ¡/ ˜[☠²°]h#ÿÜ!µpƈ;ð¼¹Ø ÉüRÇP/®ë±äáÍgùñŽK%°Hv®âãäû_â÷ÿ0H›î½§áÝ‚ ¸"òüo¨"•¿:,5Üÿƒg­=ã—7üŠHÎ ø^qm©c9ÓЗï~ÑB µæb”£ú»oÂöÝàtÍçNÆBÌ$à°×ƒþ ?î=~ôa6¾ lÈG[ß!îleÀ1sË›;í++À#|6GÓCOL|](K>-x”©ª:-*,‚FÍÙ£oSŒ^¥É…ÕÍuéÈ—­ÉŽ Y·á6£še Elq3},v9Ø{Ñ[V+¢”†hžPäe±­×£€zòÁÅz˜çH«(ºt#d[˜KÜV¾¶ñõ—ɶMá‹xãã®S^|(qE˜,,ÅÂr½àM·)!‹2ån©ˆ¨… ö½«!®À÷¡¿ÈRý¡ÿÑÕ^i;Äæn+ó-èÒ¶e—Ëxà}/{›ýÀR†fÞ6dMËOPPŠއrgÍ^tŒpŽÊ&eç=ÕúYmüÉm–qµ*•”b‡Bm\H/ec `Òよ8E—€>Gp÷uË`k3ÛÔG¼‘¹3äN`ôTùælÃȨ-0½‘j†µÌ¶P–*41Ú’i !b ©CýØuÀ)_ªÑî #mzuÁ{ǯâá9·¨uÄíxÎßßiíÅ[Ïù è49åÝõ76äs1«éKšÛ^о2~Ÿ:ÈOàO´ùÔ}‹ÎSè&ÁËWqhTp¤±§˜²2*³"<&.º|V‘-@,Ó|ØéÇFhlÿuÈ6nTU““Cúó`•su÷ˆ´ñäA¡¬­Še-ŠßøÃ1œÏxN§ô‹i ²º>Wi1 VV}‰{‹BÑ ô÷ºYú½™!Æœ˜Ù¬â§DŠ”WMÙ’ Æ[WÙÒü+n,ÉײhÁˆxJZg»ív– ×cŠãl2&‚+ë@:ð0­¢Oõ_Ä9gg†öäc…£Àæ¦=ÿ:¾i Ó ú´ÿóƒƒSÙÌ0Êh|áÄÌ|sR©:›¬‚H Ú%TžêÚi˜œ)!/óÒµ>µ+â¡­ÔTh w4UQVzî"‰³j3õáõÒiý›jÚˆÄòú%`•4ƒ¨a‹µecB F Pºå¬CzË VEMeŒ L.ì$$‹Q¸‹[S¹@N}5ÞM%S²ÏX¤ƒr%ú†Tby»ÏŒ£ epÒz‡«ç¿[ýï~D;?yLž˜f¯¼>+¬?±9¹òt°'ð6¨tf«r¡k³ùÇš…ó„\×)«Y=¦ZOùašç›'k†èÀÓ|®× ÎüÔÙÓ’”†…áS¿(CÅs´Ç+ÉU°†‰¾¨ŠÞm ¢a€9À°,ºðÕ9[ã7M)p¼¡M<ááä—‡hžËLuú6"¢ÿd¯Ãì.Ä)Ás Ch¼ñØIЃaŠIqj“N¶°… Ó8‘§¼'ãx¬r˜s³yWìô}Vâñ«ÿ¿ýÿÏñþãwýÑï<žÔøû©q$¹LïÅê”ÓÏ1ÿ05…:¶¬¿‚|qÓúêo¢cÒû6HËúb²¥evuÄd``ù‚ ýŽ"<…îi¨ Ѷ«¨ÄPõ§–öŒ8cå)LÚíÉ¢cUùg«hþ Íù.²¸Ne3ÿ‡>öáCb¦=1"Þ®ÜïÜ}9~ƒþÿƒ¯‰Ìt þñ!cðsÙGŽÙÞ+ ‡$ë<ˆ:p?’e|R€¦ÝÅng’yóØáÇ<¨V¿_›ãûl'¶3›ßº¦*YÆ1CþC~[íî¤TX Ru3>z†öTƒ]êçÛ’ãU_ ÄÈ‹™#Š ]zg¹õ‘Ã~Nâ1CãdÊ ÛªÕ¦ çÖ†5]§tPá`¿p¥*;&…þŽ[¼;ÇYV´$î±½÷ж¦ä¡B1î”  …0Ï‹¤ÐöZzôƒ…jQ}±èdŠÈðp·¦zÿ¼¿ãéì‡oŽrfD”’óGÔaÅΉNwu ŒÄ,nÊ‚½¥,š1¡Â¢|„æ{G…wך@°€ŸËyT¸|s›I¸ÀOØríªãÀÜ ¿´a ™~ÎÆ73¹øÖé%ø%fÛKàÇ:üü\ÛõÖ®Èãzñ’½@»81Š €ª)žûa—þ­NRåDôÂZ†îÀ¦©Ž^V—ÌÌ…<ÏkõŽž‡žž#Ã&Ušµó;#1ÄØ¹O¦ƒÏÈÜ€¼›.ýùŽ/Î6ššì»ÑЖÃÌ£ÎÒS©û¼MRT%l9×zDò1¤'±,"?ß?¾ßïýþñú±VðVTdÇøP};׃—Sã±êI×Þï" …äh5|ÅÕÐyN¦Ã ]£w[II ÃЈŒç?Üë,L¬jq@8r]°žÌaLø¹5a„:Œ½ÈñèLÀ@ÜÍ1ZÉ*hô¡øteó±Œ|§»j¯·ß =žÎfæ‡êFmowSš˜šÖÐxy­ñhÛ 3re´.·Ž]!PVß“ô õLÇfé{‘ÈM—"n¿ªYËI5U¬&á4žõ߬Ûà²þôÀæXbæLåñ¾~¿mÇ4\®ËH„ûl½V«†ÀËak€‰)÷ÈÆö \UïÉ™»€¢7KucvŶ[Ó±~ IÇb5ï¹AˆÇ¯žŠ`ÏQaT$‚›tÉáåÀqʘv圓4d  `s¸lÎjm5å’yÃdìT÷»´˜9RÓµwMMÒWœ•— ²¯"€èP í¿Üü‡ËPp4Ú<÷Åt!Ó-2ž‰×Írl2²s‡U8\-Ö£“ñò:u¨)Œ³ÑíFmÅØü…PY\ -6K€’®’AÓð5'a¨ˆ=_G"inž‚Ü \ù3= U¢ßÍm]¼7 ¸é[ë&áC¨Åt£®Ð <#@ý/HÎy›ö¯›—æÑóÏ?ñlû_€­TÌù±´D·µaÊ™ð*H‹z€©Bë,Ìc}ËŸ‘¿-ßvüêçðìqàtÚNƒCôÉGO80åÉ, s†Pÿ¨•d ‰rÃê!¡Ò¤sþç‚á  u%Œ>þFŽ%J:NåP)H} ìœúõ؞ب"˜»v×74Êoˆz.R›çåGá³$<5_„ vÔo+#¼=¶’Éï !…šxiS¯^SüU€³g¤‡§±$ÕPd5Å÷çTT¡aw›dΧm0Åd¤;=Wªg–í¿y‰Z<4õÜ-û@ïvq”|ð쮜ºÈØ4›ðXâuR~ó)Ú#óf „çÖÛ×ÜŒ›tŠ”]nüÌ vàljÁsÓ}ßÈFxÆ*‡‡m pX³ÐƒŒ<®p+ he!qîÙ¹ë)’èøtâñ²PžÓݹ[ÁÓY^ (9`¿£{þ“Äøà¾ýµÂ=ÿÊÿÔîùç¾Ã7ïÿù9±sa=¿›ÿyþ:‡«c£UÈ *|ÔùÕâ¨Ð4à1**Ä¿oOó{ð§yx€Òº¤I&Ñ¡¢ ôǰl¤"?LKãA­’ØS:„Ó„àb¸6ánò¡`³§ à]zœÎƒ+žÔs—1°Ü¥ÝÌÆ،}~zJâwŽ þ9€^HýŸ¦òî/o‘™Éè‹“Så<Š2矗›O|j鯲þT‰™Ç'Œr”Ÿl¯£ 6=ÝGIlmÚfàFŸ÷55)6©’zh1ί—hWÏ …€žöùYë‘^Îz}ôõèÌ-Ó½8 k+åiƒc2Æ.EÆ}=s‰æ¬è.ØCG–º&¡™–}Û–íZÔCÏ‹¨¿ŸW°áp$Yy¢…ê}Y“R%cÊÑâøÌ”uBw”ùwâ`°}ë‡q(šÜ%R°|߯.ꦙ¨>0*Ø—Üñcw¸ß"/²¥Éøïã3öàÝ*QXy,ÍDÄuÛsóGŠFeYP“|âeæSO3¼ òsÛlÝ©·9ÍÁzìá8‡RxwžYÖÎ3Fªn‘#DEI.¾äÛ ím[ k½æ`#MWO¿Mî[ö rš˜±Ì_EvÝÑш3?ÁÔ”Íç:5rE¶$Ü0ÿìætsÒrÚzz<ª $À®b¿—AŸºaß93X•"ÈÃæxžr!¾#ÑæÀ|dXˆê{ ÿD]¬ÑßéjQà²ÀAðXw= ¨ô8‚Eº¥P9ì®iŒ·ºAT¾[l·¾=_Ïbàr}FÕþˆ'»aV\”¼öá›dʼnBæy€­¦¸[}ÃY^·|ÆbÈ88Òà”¸ ª zxÂã*,8eŽ–Ó kH P$½,,9ªpp <|nºkü>PÍ<ö: zä÷¼ñÒ+5»ïIÖgFË‹}mÖÍ®LNüM†|ã8t É“1 ð³™=åœ<¨ÿ8 íUJùofe-uâ¦ùó$úN= ?hÈM5ALÈçÉÁ¬à4gWÊú€è!yöL?"»Õ·=%¡Ìf£”f®…ýÑÅØ#ul@­¡å…éÏ~ÕC¦qþ¼fl(œ „{Ë4ð—}ÝÀ1Kî:žº’ùÑâËc(:ƒ¿WûHïÇSñ8ßöÑV\"lÒñ;„~TPÆ©#sÕL8i¸@HZDP>SIšfJ ÙbŽï_qQÄBèx¤_)§ÍkúK˜ùŽrñc¬æ—u5ÉA•Þ“þ]ɱXûnáU‘'Œâœ¸¼ ¬„ÃÅŘçi­¯)‚BŒ˜ÂƃË1&¾‘ƒˆy×D’Ø–†9©v*?–¥ŠH®Ô:Tý-íèŸa—Ìþ÷·.€ôžÒò:Eï·Šò!cì;—ÆÉõi‰^ó%èS_lù†ø4ÅÄã7:ìy@aû×2ñ 꾩õÿ“âß¿7úLŽ…|ÙÝú‡×¤«7K ‘Ác¬aßóæÐyçãùƒP™™ñm; naÚŽ]ÚªœAŠ g¦)¶8Ëï`ÅùÄçû^qáä7@CP«±Æ 7fz¿f¨!÷$Î2Œ¸BJÀžù³7Ý ùãÍDW3½èÿšE‹´Uê&º`Z3qÇo0Ð¥zÝqG³:>Z!ÿ…üŸ”Üχ¬oìÝúÙÆK^ªNòüDÒC&þhYkyGß*Äõ.YñXv§nvÏð{Ôô Õ^Î »úR>»òH³l‹¨—WÇ*ï½DþhiÌJ—”“ò€c½ab‰à ˜ú S†ûzÚ÷\dÖZ¥wÓ_é`ÿ«¶Iµ%Ú0¾Ü”'!ïñ.sctXÈØMHÉJÃ%UíE‘ üeZá¼?П}Z "BÛÁ£*£˜÷èqÔ1gÌwØ/G›šmj–ŽywÌfgí·vÄË+‚)nrå3ؾ…üöz) WDxœqd•°²7ý¶,ïfÍÝÆ¸Q¢ðÙÂÀ"à¿27ÕFP?ª]§Ïî¬OooÑPÙD–`3Ì›FãÒµ…‹ÎÒÁNK²_u Ùí¹Kxÿv§}¬€Zh:›ÚWa’Eš,¿ ‡©¢…psÖb†)æøï9%+ “ÊÞ´Û¿/Wɉ!'·$•7ù6GÓP( ’üdEÙüH;ѼéÖêºà%¸h”¯å ñ¨ëñ¢ìÌB‡‹Án<¶ØSTÏÙÝh:¨ ´ €²DÄ-Wï—ÈÛgŠÙÅÌ© NŠsŒõuÌ…p,|³aQNôÌ9>û‹ gÙ5•Ͱ–Íší±ó“½·¬%‡¿>ìYÏ›6Ýê<¼/¦ÉN¿\ ¼¶®Éø¥dÁï<†Ù(bînžx8±œ}³•Á&%Oq´¬@…»R_§õšÌ@jÿUâé œ¢?䊵ødÍ8ÚY?B'£B½cvpŠäáþ8¾«d¡'ýÎ[»Äùû^K§Å€bK}Piì󈡫¨Å1€Àõ)1…«ÑH{³ôû\o)^É‹A4G&ò»{¦bÆìz4â1ŽøM‹­:"7˜C[-ççˆ_CX§Du7{W–…é$ħíw‡»*jøÄ1'›ØÀÞÐà$:Ê“É%N›º¤xDìow¡Üº€é=¼C9ÈnÁIãÅ­B·õòÑÚGƒèab2÷†•jBp*'à«Ïh"î‘d¥ñl_äX»òw×ѨÃ|fk:H.è?û*}8Fì=’álОëv4}\gWß(µzÿiW:.Ü/'”äGè.ûëÞл r7FnÝÜ5=qyçmA—n=àaãµy#îÙó5ñø`uúóÅ! Ð-dfP‰zv tÌ(y0ž ºQ–†_½\‹ðº€,Õå¹|ú6.f~ ‰…õÖ=ir¹ðèðY"füžä©Få¡ç^ó©uø=çì6RÎq +_Y§©)ôÛ V¶–Ãò9Õ©·vQά÷`±ÖáL1_®–ÈÏâèÕŦacgMûrY ü#o©vÐù‘üNÎÌyÄøTr04Êj?zª¯h[Uš«?kÿâ;ï-±MÕY "Ð.¶€¸‹1]8¬4WJ·Ñøþ¹^X$¬ÔJÝrLsgΉò-µµÝ«®ô‚½DÞ7õCJÇ!k×Ì ÖïClÎã-¼âH½D¡W´§„Ô‡þÏ}\´pù˜/àúQõ…ó©„§8Dœ·Íø ù­Î× ÷ƒÙÿOÿÊoÑÿ}¥ÿ?¸Üáù¯ø¤þã‰);ú&‚–Êê3~è|•iåœ*D©gíàŸQ ”ñÝÂ^c"/ÅÁH?g$heçS>Óò¸Bõ÷Ðü_ B 3¦rT×kŒJLÑ çÄaÿ6;‰3oòFÄQÐÔ®9f š+<é5œ³¹K9ùÇÏ^sYá˜<)JóϧE±ÿCÈwK¶³8Š•HYÆ 37À„dž÷êµ+‹â—%Š(ç€ä.LÃÚŸqJŠåxnÒ¯Ið˜L\–ÉjNkÒgŸØguœ«¶àD\®!Êü¶Æò1Å;ë"cÉr4¶ÅH¶—h´pbÄ?½‡kRÏxxiÇeK¦™¤µ*†§BF1lÌáz'.ç]={‰ê®š¶ˆr;rCd©.AzÁŠšî:/¹ÃQiN…ÈÛv aB]¢÷LÆ Zkȶ7\+ŠÃ ù_~^3šQ ]ñ2l“°% úPËñÐWœÇf@K½ f7!º4 äÔÈZ‰nÉ*òÒ%àZj۔ܾœzº5XÕÓÉK#mÓ©'±½ +¼NZ5z¦5®U7L™m³`>¤ØD¤šï‡à8’&Èï+ g;&€½"Û¨9}fªPA4%ë„­}ìãô•án?6"C¦û׎18+3òa#$ϱœ%måoºiT··ê6j>—cÉê„;xL%>ºÍ‚Vc²ë&¡,*Žmßïö°?}'‰¿ö¬ÏÎàÔàQ(ãúäÞ.áËûüåY÷x"„n ¯:`»d´‚#.êi>ÈÛÌ=È–ê48ò·×¿®’,m=ǰv „Ô¯IÇrh~~ FŠi%:+)ØÙ$éöD×T· *ôŠÜ~)`jb¸$½Ã­÷}™Ên›Cåè|·´L:‚J¬%—p[v7"H¹€Ê’—#ˆiÙ@w쯫‘?þ´·Õ³Œ$ß‘ŠÃ©üàwÌã«QÐnßþh_ã£%{<|™Æ²ãÞ` p’­¾j½T¯ƒ¶˜eƉۗSŸŒ0P§ŽÚPgÈë<ÒäñVÏn^?º_¼Fóì§•J×ÂE…bE$gkÂy«:ªq-åZ7d}r¶ßŠ—IfVÒR™l}.r“ZªL-‰>/ï„SŒ³æ¯\Mf$÷{×c¿ô:ÒpÍ~ꃹ½lMäB`\ÜyɄЫKƒçÉ™±§µò¸tq‚}ü©ºã-6³µVÙ´6OªŒ‘}5`Ì,tµÔ¶»e€Fæ¯ÁçÊZa³í*Ò¡odämÎ’ê¤Ó×UïI \ã슞óò8ŸÚýÈý ´åìl½ Êêo*éÇÁü6AaaùÒ| ªí¨GÕe¥á¿­åìPMÔµš°´.¨€4øh\Aqe%8D’ ÜÚKA(æQrœ8¤³CíØÆðƒ(ap”Ç×ñW ÙF~“mªèÒÚíÆÆÿÁç1áÀÑ{b¹Úëšvddªpúµ|Éñ¨G×¥þËèë¬ûGЪÁHJÝ'l‘JôC… HXþËyúZä&ÒÀéó'ÁÄ«ã},(´hKTµ¼©ZÚëZ!Ÿ,€fж”1Ùo†¼…Qu§‡ÑÇeðœa|*þ¿Vÿù­V³ùKÀ 5‘¸¾ß±5æµ ãZatä$9ÇÆeOÇf•鈇x2!€—Rdžü ,óã|Äc­=E%LûÂssÍšõNe;miûc…¡xå)fîzÃíoùÇZK?êFD0- ¼71ö.X¨Ÿ‹m~Ð>¦÷Ž•0v‰Ã ¢¨RFÔ_ŸO¶¹TéÜWr47Yá¼Lðý 0N@µ©w¡3¹#SEŽ\M‘ÒQeŽíþ̧.ÃO$º¢S›Õ¸cH«õèQ@NuϸÃõ(ª¤Áebn¬Òsº¼gæ¸cyÑQLSòòâS0ñîÄú—E^(™b²'Úó¢LÛ-Á_ʦb$`ä'Lÿ5<¨Ùƒkyz|¯Lô·šÅ V7&¦×ÂC”kHܰ‹Ý…ü£¿üÐ:Éï>!ǹQG&Ò¨Gó ?Û²š¨ ³ŸžJqÙíó‹„‚ÑÄÖZ—EÒÉ,­Ùaz&æ)­â1f×iEŸs9FÎÚ3Mo°´{Å'«Zov-¥•yÛº“XÄr9Dz7Ììæð­£º®o´½Íáa$ ”%4å’*ùrÇ`¸¤¶D­kˆbýK#•mnþýéû8-,£rõqý;Ú¸j³ƒûvW÷ΧUƒÌ&·³öîÚWÃ$ޤÑDqÜ»5\Žìpúë!n‘„Âq=yÏ÷ëG‰rÞwŽºˆá¨Uso-GQ•ØFÜ®Š.Ä–*@ÜN8Ì}´Bõ„±Z†ÚëÔa¬Üà±e©/ô½>³ ><ȰœU^v°¿}9Z<ðíñ6x¦µPxLPpºC(¾wü0zqyí«·‚ÜœÃW»èTLOÕùMjÛýcrÆ4X á sS=bO(ï ‹-ùVí(gcn^Š…ÒÖ OÀÙ ÙþTÇ2™ †SßíY¾T5Ž2\HöñAdèçÝa$¿Îїէ㘨rýå ùÀNÁtž~Ûlð Ê MG'?¤‚xE¦Nkíp‘Ͻ½ô©^…&F«Ù˜§ç,ôØKoвxž£6Îç¯C¥‰"î%Êk}Ç&Nèh0IT *}@5Æ(Ñ-1Ù»{¤^ò:¡I€ÓÑ‘) Ô6K µÝÊ£}«ŠY/@;=áí³{PòPc•;t!fÔÀÆó¶ÿ1k-NÃ!· î(ðÀ'Ôæx1Rñ-æ#Æ£# ²UnõÌd|pÝžK±¼§ £(k{3Z¤ª4ðMÃ%w¼²ÏƼ༙Q¼³1Ošú +*Üñ±¥ªˆ³Eg}¼Êt 2¡Aœ=¢ÕoÀ”ÚQs@Ó»ú³YÉ-Úé¾éîRk(–‚»‰I~ßcÞÇö0ÐצÇ.iÌü5˜È/Õ,û̯ܳÇ(ƒ×#Tö²vPs-«ìÆfGà¿Áí¸™j³Oä°Q¡¯ÀZrµ¤™>à–þ®¬g1÷ÓàøæÏ²ë=$-=úÿo¦þ¿.½âw.q½ÿòIýÇyaÜ Àƒ ÞڸɲÀÑþ‡¸J—óÈW¸*áZ>m~Óªôži—‡à(Ó„B”¢ t¤÷‰Ò€åÞq5¦qŽíÉ‚æ`£§°9Ó$ìoæ—± Çf?{8Ê@Ô»gž}•YΧgÍ’Ž¡_þ Ejµ´&”LƒÒÁmTÔÿË¥Çÿ» ퟓøàì<æ$G¾>•Šõjš9!ã@1£UåðU;xs¨«Vû¤qӧﯖ_³¡ÅK¥1ÈÑD_·nPÞoíÌŒ~Ž›Û‡ã¼²[$zÓ—j!zÛÒãJg­3¨‘ƒÖ/ÜGt™mLøCpþt\ÊÏ.‡Ë€„¹Ã¦ú£¹<öS¾ÃÈ>#\ /¨à@ÕbÔ ºz•£}ú¤Òuª ,cÎT†‹°vÛ(Ç(Ûì½%›'´ŠO/GYýæB3Y~tOpÍ!#¥Q†uÊÜ)ÅÌ…àpq´äææzÉñÞèz‰˜þbÕ‹«ÒV¾‰ÄR¬•Q¯"RÃN« •%óy&`§'ĶlšNºD»œ—1•¥oò‡šœUQnS  ÍàiT_â¼qrÛŽD 9ÿš®H‡©ÈO³JŽÜ‹I¬ÙhWª]ß3Ò¶-Ñ¥Ê;Ú\p2/:µrÚ¤*E¼Ô)5¢Ü 5÷94„ƒ«ŸÉ\\Víù=ÃCÄqçÅXò¬hU h%#ĦÒgvàJDÏxÙ?%´`L9ËŠ|r§zgï{Óhê¬0<ëqÆúR梣¸òÓvåÃrj‘ì/s ’j¢KÜq ;òO•E͉ÑñÉphÄÃñ&]l0¯¬&)e¼ô,Žãß9ŽÖq3™ûlVp&²ð7,õeŽ>4F_?g„8ßaî$Š0šgÙqnˆ·‡ý„mbùr£ yé+TÊ%Ø*YQ^O«”óUB>؈å±òNœÀK«[Á5D›÷HeuS½èõää3©Y  sÅ(&1Ù?E~Ópðˆê+‹Wuæ}ž¸Â7às¸x}[ÌZ „®H³éÔ}€™Ãf¾DUÍ—‡8­¥Py©ÙŽ®£{C™è‡Z½¶ÛòÖn†µ– 1ÔY[‚%ºÅ¼;ZYƒ‹lO/³Ó·ªGö`—ÁHš¹YMÉ^) °qí©¯> I©¿·'2 Lc_ÑÆñA'ýÆUñå5NÌZ ³U,Ú!Cƒ€[:|n™êÚF¾^+øX5“ĵZ~êDZtË„³wíäY!Qnþ[LG?Íd-œ /O‚–1ÛKqe¤²"æÚ$Lrìò{ÎwŠÕ³â2ÿcnfé9Bp%†ƒ:CãX"5:ö‡c&TC³l„8j[*NÄsï(iË)eÖùiÎþôà*ºç­H±fÕˆ~˜N"æ¡êá:E³¬B¨k+?5†ßòÊX®óbï‚´k‘»Ôÿ룶SÏ›š;&·rÓc6s¬¤_³k½`ï´ú¨År¶¶E¥›YÚ4fùÓ¼w»ýÎ 8¸Wonɨ¬ª‘íGz’œû’zLžZ½ŒÉ5o•Yo›ÜE…È‚þ$EˆÈÆ’ˆûß›÷Š“¥ÔüS™D•ÓÎü,lhCD¥Ê?*ýÏã0/gå1“C:(ùŸ|‘g¡;ÑÆýáŽ(R°¾D›C žÅÄDáyb…rNˆ¢rnÈ%¡Çv-o\mp¬|î4ºÕÿ¾ºR¹¹ÏÑÚÅ#TUèÛ1ý!/ѵ&)ûkrŸò}±|©@äVß[ð‚ì á½p–oIMc¤àSV‰˜!ŠÖfÇô±]P3H1lÂÓãî•uS5ÓÁÝÒæ u’$ÿÏOóÇLîFÿôû}ê牋6 ô¬¼K.ÅG†5 >ã¹ÞáÊWåàgËÔ=²¤ž}9Ië"ê¹ã|¸ûq޾Üjÿ_ªÿ*09÷Gv ÿÎ8òɬŠáI \ý8Ꙉz§ê…Y‰û9q4!E¥¦nãÚe/s´àK¦+ë̬Ö®"‚-c§„‘®[5&Ë'±$\˜ØX¯z| ÒíñD iv‡²û:ûo Äex¸Q¬Îî9Éǘí2â•mlöȹ~˜üNÝÿxyëU;)«Þ°7œÅ?!¢©V][A‡\Ÿñôˆœ•w‡Ë¦;’¢;ˆÔkØç~HÿÌïæ´võg½*hEÒ•Ä,]\õs"qk½ÆðΕ5;”Ôû4WƒnúÏè¶òPüجLïªÉl€„g˜skˆGáh…ësF!×RšrzDù!KÎq‚AŸ…qŽYÁ|šp5‹0ü| l£ªÞ>çç°Ûú¼G¯ªæäòmäõQ&?v Y3`?ÜÅÔZU•.Ø…ÅfÅÇš0†ffq3×"„i²ž­TÏæwMÍu ª ÃËËMÂ#?mvxÀ†I‰.÷‚Öø_Bð5Y¹ÆjÙs…8'Ö€°‘¬R-P/õÿoÛÇ*Ò”~Ê@æ»,Õ7y Uíò­J–B–‚æ·ü`늙i"c6M 93(¥):78g; zGT7_‰m¿·àG˜vi§¿µògb”…uåP]šJ ÌÔG‘ýÅÌ~Rן+ëÿ±*½âruÍ}Û^ë5" 6=è”s É½vÎI.Õ5w –•uyo33SÅâ Û”µ­Ä¢•^„óÃ*@tŸ,²j}ÏlCÃå3çÜ{ …bBÛFÍÞïí5 ˜a)l‰fÓ"Èš‚ÎN9+ ªÚqžô4ª”²Ñ]äèê¸7”c@»‡®&`Ï…®_.?>¥5¹G‰ÄKF†Æt$÷ˆ5 õ7vŽ·øÛ‘qÒ Ëý”!|Ñ]jѱÖ¯±ì›?À¶B¼Tʆ¿è5è…•ÍÎx/én6*{ç(ú×’ÃnÆ•¨Ã®ÏË÷içT,(|i)˜E=±z1 4Ù6˜~›žÎóúŠ-àÛ Ø? €®,¬‘/é/L1þÌÛ²“z™Zªkº8ùŠÙÀؼ’ÄÜÏ*¢Âò8v†?Ì|õ5ÀÇÁÉ•›mî ¯|öªƒÿ}Œ­N²ÊVƒý~RŸck¹Ÿ¹ÆuñÌ–z¶åÓÀÁýjbŒ&{K+|·TäŸAL°O©ÄèѺ Ï¥„^s‰ˆ˜øæº‘¼ô¤(EWt¶É@TÕðk]€q;&Íc( Ÿ/xÌÊŠºHjbªµ#ÚtlwîÿrE±j‰œãl@&a_†–×st¹äþF|åÙeNsvŸùk§ëŠò1ƒÙð@ÅÀOªC¦#äMz=ë~ÔŒñ?.ˆä49éÏ©ž?Ò9AÐDüS)¼ê”ŽàÓI o¥د¹øª á'JÃã1Õ­ðíçÂX²gr[ð0–~wÛÑ/©$Gv§%]N×Ìé1­Ì‹47쨜&´Y¶…KìI. oŽ}܃}­c­Ôã”ß=!kèzéµ~¡Øþ™Ò“Îä$ÛÄâó™ÅÜXM·ˆ¬ñ9‘+gv r%q8ÂüsJΨÑE†=ëÙfL«å@u ˆÅØ/–ÍRæ üºz¹ AÙïRC©(Š€Ž9ž—¼2òžŒS6æ0¿dDF6újýÕz˜ß%Šá9áêuBbÒucÔ1Íê{/-š$&_¢ŒS^5·Ž …î’¡ ­'4b¡˜K¨ù}r\ôiê¦ sɹØ2À/Ã~ËOd69SG¯‡Ã›Ã³ÂÆÜRÌ½Ï Ü9 š™.ªË›ÓlD†Ó/ÊMBòlЩ€b›«!\Êi¾ÅÑ ç B%Õ]³ñs•Y¶<úlûcÀ12 3Í„OâCQdTÈFŸ<-9ê|,éÝ#ú¨tº.^CN;qAØežÖçBœÇá³Lñ^ ùñJÄgõþ/)þý[¶þþUÞÿÿzMü–gÈŽMDcgr{\ŠÓèªÏy‡oçϱNèƒDT騅Zsv\&(~¯™")ØìÌ;óËFÊĽ ¯Y+5’é3A1oë=/TË <½ ©ÒÕöÁÙÔ£PŠEäL/Oÿ­º5q=6¯½ð‰«?’:ƒ£RsÛ²“Ü^}¿U}Øþƒ/9/ùóhrÍ?×DÊK»À÷£ŒÍPê?Ïʬ)\—Øä”ƒ>#ìo§¦õeŠòf¶d• Õ–±_p×^Œ.ا!ó@Ø…¹"W|™~ý$rýIÔî™±§éÓù“ÚþV IDATt§UÓ @NÜpÙZ‹ky–"[鮫ð<µŸ‹P®G|jâ Àñ‹&¯ÖD$Ä(h_Ô³y¸ÛÎÑ㟜ڞýÚçlüjc3£® ¹^'.öFo‰ÍUœmN‹ ª¢0¾>¾c€Þ¢ðí4 PM¨~|°Ø¨)@}•91ìÆ~á<íÒFßrÖÔmJ*S šÚÝ( •4…À¢H4§;=ÁÍû²J—mÕ~~5B”{û~“Z­e„UFÆ—V-Ý3M:$Ml{3K¹ðîQs›ä®YÝðeƒòØ“ÒHÑ…½',cœ$æ\Ðx› `¿ßïýÖ½ðC£ù¯ƒÇ©ªÎ»¾=»=fú¸?R/eq窿 €+¯}þŰ1šmƒBuáz~Ä)Y¸3¤wŸÆ¨ú ŽuŒ$»é+ˆHšB33aöñx(¤š½5ß%¶v Kÿƒ}«4÷š(à>…›¬©b­ÌŠ‰ÑøþåçÏŸïv·B¸–®ýRŒÃ»ùž²×môx á´ÈÏm%Â;‚Ðd2ÉÈ-à‘%€¸#iþ]X=ÅvO¹¸”^Ü/ŠlWVVÔ0Ê·>¤I^DoãÞµ8ÿëµøãU¶M7Ž›mx‰þ ŸÌô¿ú-š™Ÿørå2Ù2h¤A6×úØeT°ÕµV]¦¹tG¿õž@‡ñ,ø¸)î •-‡/A÷¨@¸7›þÚ©ÞM#ö.%ÂÆ•·ÒR‡‹ÉÑãòyæ ž*ÚfnRÏÛíž ßçqÜJ#ò ®ºÔç}ª' hZå#V¡xuhePn‹y·qÖ„á(å¥>MÜ]}±·XX h)Ïn£U®±W ¨êZK5f žîp$F-5Á Ýù:Š>ÙC‡C²ƒüÓ'… vA¢iZH)訂E†@—Ægí³½÷¾¥³‚˜ØâSÉ|¬Ôs5eØB*$Ëßk¢ #ˆQ[Ü< e%aœUó‘¶ý~Q%~àÀaa•XÃc24;ˆmóK.4H…gèYÁ@ŒÐì@¥©æÍmÄ[ÍzöÜi¾-`Bþqªª.8Hªê¬UÎ\ÈU‡¹žG‘±w½³»¿G‹+pm×äƒÿ„Ƕ$6’ä€MÓùÁ´O£½bJ±[Œ =$²m‚I ‰z=‰S!,t¶ÜÔVÙAœÍ„xÎÅÁ FIRÞÒÑ|0 C1î–êÉߣbSaD_ÑÌéÒWÖ€Ó🞸o*ƒžwÕ”ò%AW—ft*Qœ34 àÄõ(±òá€ú£:²H³]ãŠÄ`DùJ¿Òw/·l.#Žk`·•Û¯fl…Ôü½—jæÆ`çHþBØcˆ5^jIxÐ:€ó6©p,¢¶40ëÑüñ¾Õq_ |6Ô™.ñµtM†ÜQœõˆy¨(›rfÌÀˆ©è}Ù ³iöƒ1½)|"ûÿ€x‡Ç àÀ¯Î]uV!î¦C?ËAÛüʨRÓê¦ô³)¤i”pޱ³˜)²Ã˜æ—nZbü+-= HU_OcžvN¦·*=+†]޶ìçàâ\ê¤ë¡& ïGAl\;áúgm³cdKëÅw£‹IéÓ–¸ÞG%Ää]®=Y¹ªFßEq3;ønÑ' de+U<˜¤ž¸"9O¨÷ªò[W .,‚£Ú'ÿ'‹‚âk…N§‘Ï€'`çÃ$«ÁQqŠÈÐ"ËÓøŸ~ÿÜ·@·Ãui~ÆeRnĽÜ× wLåŽå7ýþªÿU†à¯ôüóWzÉÿÈ÷DÿŸ™ÃCý×ç# 8‘^³Y*iÏŠEBG@gnÆÄ3O4zXà g,‘‚¥a(—O.9’$Ö9^…Û~U›ÏYÿÞŽ53­y>…«ÿ1GˆÖ«4è˜yLÁÙCäþŒ¨ QóŠ›/ Lú# çƒåÞÿ’õ:β£l¯9Áøàå§Ê³Ò¯‡*”QNþ¯üÏ«çY¸Î-!ì޶æ×š8ŽÖSM×c’^<صtE¾šÓüO¡¬×rÉ^2ÄVEÁGÒíçíëGaÛê,[Žá2yÙšžÓˆáúŒB_^çøyYñv 3OV¥•"dÆü¦ÝP†ªàhÈáòC‡'¦šãgC2‡X)$W®˜Ø¡¡|!ÞÏ„½#:œU¦¨A‹”5 €Q×tÆ‹ât¸üs¿ˆ 7`:$z7i‰ADÓeµ<ï¼Z-Í;樅sñ}ÄÛìµV¯Å6“Ø?FƒœKP»Õ½á6ª»‚cæ.ã‘;),á¢LÔïùµ„‚·Y⟎õdŸâ ¿>F89XëºM+ÏW¾L…™iæY¤˜J[ãÑfö?ü¶zÆb-Îö GY ·<º  P¿¦|¡–b(„‡œiVÐq.åµÙ®£»BTA‘½·7ì‡ü°½Í¸Áš1{/®% uàg‹`1Û·´û×&hÕÑâ!DKMË<•˜ ^L¦,ó²ºÚ능²ð¶QR‚IÀèÉM?•†ÊÆÙö*º”Ûê{E“’Q±Œ - wR=~¢d1ëŠàŸŒ»=z¨²Cªôí‰ãï—F¬&+^œ¹€Vó}fµŸ4)‘᛿ÇÇîô$â¯DoŽFÕôš1™\eÊiûS)Mi¶ÁØ‹q¹./S¦åu¼*ß½–éÚbHÙÉ íCãó”[°„‚Öo]å-”J`5å`o ¬6§…fOS¼#nŒaY7NŸh:f,=Uˆ=¬d£(öi'=˜)ózWã$ê' ïwíüÆîœzý\Uª`ÛúØÜ7÷A?ˆ:<Ä#F/M2²Ÿ³ i“b–Y´ Gj¶öEQ¶«±1×?ä‹ÎÆÑ}ã·®6q*~DÌ€.÷¼‹Vì”ÎÊïÈzUõ'ø^'`²bëcìIU/^ªAßoÐÄDÞÖ³¬¾Gˆ XسQâú„î܆ÌyûÁÞù8IàŸ6ð6Ì…«Í q·0sÕÔCˆ³¸.~!+:‘ÓUóÂ1 J±_“q€åži,×ýbÆ‘´t[!,B "`㯨¥íñÉœP›üýS²mLåÑr—Ÿ–Go¡Føj&öCÝ@rÖuXeW†þ úç&‘ðàšÁ}]²|qP!Ec/¯ùx£á (¶øYuûnË}nÿ¬÷’·VÇ¥vqÆÎ¡"¯3BÀýq&_Ò¯¸Æ/µxjʺÖlê#€xÔþNe2þEGHéèß¾q@G)I™¼OÍñ¬ÀƇ[vtâßKbÍÏéÒ³Aþêwÿ ÷þŸËü­äN~ÌÿÅê?žê¿ ¥Ó¿ö>è$¢õÓ8}ý|½6ÞL3Ö„©aÔ—lÂÊÙ^\%ʸ4ú TÆU[ä ­p$óÙy² 4O])0è+o˜%R¥K"ã”ù`çzGi>Ó|§¥#ÁˆÏ©³Ä·?à<D‰ÂvÌñK°ë~úucðs†ÇMàU<Ç×ÏFÀûOò zöâ>Ìãly}C ÄyÉiyÎoÛ±;¾3æöµG Ú`}šYáKæ‡×P…Ø|mAÚÅ:÷ƒXÚ\Ðè6³U¶ú8 ¤ýÎ;…»ÀªÄv'¼Q³¡zAòmr¾ßfXësjôâ§KwU{ébà§ ­-jMwr$âŽÇ3¨)³‘Õü®LLVåP~Ý´àÐí,KhMæ hÎ~ù–ÌÄ‹ølï–˰…U¿xøåò û…UkùÏd&xïD|è†Û ^¼™@­Ήq ÄÌr·3wùø“Ä­½ýÝ4ÏdÆfa*úz­ýŽ¥—ä{3{IÍÔˆtšµûÍhŸö/Z–ÿÖËa_¶VÞWH$‡´[_š¹¯mÆ—¦©"Q¤ WŠ4±§Ýoûùþ¹–S>Ó1Ù´rqèŸqã°ñî4}Fäy· ©»fäI_¹.qöt𶌹[=ÈmÚ~ŽììÛtÚüÚ3ó6G®Zü”9> ­·ôÞœÖ/–ò½–GÕšvé\ã«dÏçŒÛ¨§ðçR/eoÔõzëûUš±½·q›-śʚ•t\gù’útɲáù•·ÈËm‡­i`ÍœtÎüG™ª½Y¸½€ùÄœ«à¨)OyÄòã]cû4 y‰ÕB ÆÞ¥–mÚÉŽ×8¦·‘BÙæC²²Í3¦¥ØS˜Ù,»2<¬¡Ü#†v+p½·lɧ H9&ß,0ÓTt(@JN?Gší;†IÞRÞMž ~¾wA`³fà}TÁ¦B\%è‘Ç-:iÛhÆ×Ëã[Lz{÷‰Ô̺a· Í=~¦Ýç¤ü4;Œ-˵ù±‡>2°r>âC·Ñv9»ó‰B¾:vØô ¶·чн«>!K²}\€Qï3÷mõCýø÷=̶‚¸å›V —ãÏ·i¡¥p‘-ê* ÔžƒKcøO4êú­sªï*±óãÒ5’šÐ™„œ,ñxÉ›,rV¼ KÀT!õg’.ïß 7Ê+‰<®šãOZ º‡.·.ÝÓÊ2ß¶)³C)¹C§f_Äšü” ýUÓrþä4F•»ms\ÿ­H½AGKñ± DÖ,:cW×íÔ +‘œj”Fºz³ßÙj\mM,~×wÇt%ü£J2É„€Ïö™«1yLõR‡v^Ë{_ï¾ÞòêÅÁó•Èvä,fj=ÄEËtº•ÕsDJƒFçÏ)F¿{ 5ŠÊQo‘‰½úÄæ#nzõˆ¯1$¡èÒêßu·÷Za2Ÿæž²k5ñ}T­ͦ8…£oOÐR|ê¦ð].€×ŠJ^ÈÅAf0Áñj˜ž,þ¸Q±òZ£l4ˆ: Hš8þÜ-¿ÓÁÜÀŸfâ“’õ%²SdįLªÞ°Àsl›FnœòŠœ Óô¶Å)ªP¹uŠÝØ êb=¨wua…_Ã761#ï&­°8 ºôHê³:x$j=øÂ/ï:ÏØŽùO†ý§›ÀD´ücLβV¹¥K$Utë¸û{Ö®k—-ÕÊÌóîÌ[ù›aL¸ÿp­g—Æí„×(ögùé­í´ÆªpCyfÅG‰µ?ˆ19kP"bæ[é\x†2v(h¾žãƨËr(ª%ã2£,Y=3¼ÿ£ëLõÌa×lñŽ´„€ÐnjˆÃî8εœý08Ãç2‡Ç ÿ‡Õþ}ÕÿóŠûß{ÿñ±Êw¾ï˜„®ÇN­s8’8g1QžU8C¾g¹À@~w&Ÿàl¤˜ç˜ TÕšsA 8E¨€Þ#³8¸ùýY´¾ê§\¼Òx(¸GYïÀIºî‚žÊ— ùúÓŸzŒåJŽÖÄš›¶Jà(ð®Û»zIpY»ð·ÌÇüU Óý‘[Çu\€~ú×ýE(Ïþ¤üÏ? AayÕX)¸Y{ŸðiÁǵ\;Õ}¬¶+ŽÇ¹XÖ%2¹¬ç¾¹Vd·‹¿±èŒõ@O¶}íûx2OjŽfZVß«á #B}NEËøïð÷0-†šU;©b©xÝÆp"—•SçÓÅè 8f•zdu8æ R £êþš£JZÎ(]òaÊÛŸ[ªr@Ù£)ݱä03QålBØvý ªbƒ¹›BI<:M~âý}e5tU•æK³ÞªeˆËíÿîoÖùcoƒÅ>M}0›³…Ò ,ÚQ`Æ¥¸Ñç"“Ç•ëT*2²·a¨#Ìd%“Í3ÓH””‘Ê´ô>zºÄ@<*a2R~ïh(ô õ¦3#]ú_C,U·½3²/k| sãh,¦k Ïr!h¬&±¼¨›Ô–Æ`ÁZv Ò¬BŽñ@º:÷Ýå„h‡ÑÄÀŽ×7ì–S±nŠƒ·vOi·|ðñÖÁox2E ½Gg&ÄÐ×B*°U£qŸ^ ¬NŠîÛ¥B£ˆQ±z%®Û„n0ڸ₊9D.ͳntåÅ8 fÔ¶„ç–JÚjŒï3QVG{ÙQ_Á ùyZ ¢P¿ÆÁÆw/pkgì ÷&$—¾Ôà @æÁ óó*Ì”½÷6ÓT™¿•‹J)\%‡5À 婽 =Kæ ~&7ÍzvßÑØ»#@±ÔùùšÈŠVÍšê—¬1¼ögÒŸ²‘Åõu à³”=úÒjÎd5h ó,MhGmx£9E­ÎSÕ‘-J,}½y@äy ÛòæcGE¢ú\°´Œ5ó’î­L%“å|©@{¿ˆ€Àßh‰ §Gç:›(MŽòÍ«EFf —c' F¦B¶Ïz4 óö³îydjâàY ]h¯~–8‡P¸deØpÈ„"k½–Šÿìk~-཭VÖü]ñAí°£à±Tû„œ¥.QÞ…«múõ]W'¸Ê¿ØHÇÁª‰o%Ø vyþ=&ÿÌË‚`ës¬H4cm8zOSD >>–¯_ôzü9­íêõ­jÜ¡œ2·Š©ÚršhÁfí¦£8íXÂ{W oþXÛ{PøÆ ‹©¿ú¡^zÀ”¶ñÜNÚYÊÑú0>˜«)—/8"F>ß¶Qä·°3/¨mnk`µEÐZ‹C¶&Dl#Áê¢VŒ'wÊÙ˜hhæ¨ú¬ÍHZøm¢aÊCnã­ñ[œ–°1 òéxÁšÍâxЬ ¯kÿÓþ›ƒÕ9þ‡RÞÿ&GrÌ2ÐZc¢x—¹~8Ï…—à’€ÙE‹¤Û§Só˜bŠ\­a¼ûY„Ã8YH±¸‘¬ßà«ÇåOÿRþä7øâýÿß‘ðœ·ü#*_®ü³ŸÇ ‹Æœ8Dg}ºÉ£mîà® ­¯†ZUØé8´tê¢ ƒ9†,\÷kóúˆòøŽºdÞ´]~@Qcòuµ b¹Ò‡­‰ GÙ£¢O¨z*è[¾Þðs‹\©‹/í¡åyMhqL]ýçùÁ ·jŸúj9ãòÿ®y¥:_á#¹\¹êaççØŽ‡§¾@ÿs6žk|A*&§™z¤ž<ªºn¼*=ñŽåêæÁmŠÍhø•l@Äc’QŽ·Ê ðh˜ñ¤×ð—¯1³µV=lt¥9½­¾ã6NS™wøó׫'•§˜±i´Q:iÏÒXP€T ¬éÿa„ÍÃðáx‚-[¥1¼)kp¤+² 5ËyLPPéDNÖuýcG릌­Kܽ¦u› ±}]­¢$MJ7˜ù>@+\RF½âXÍ–"zÊk˜¤è?Ü{‹¼Á•o-›¶È7üârÒKìÂ{`ädñQZþO°@–}<ªƒ>MMÅñ7bQÛoàXZæ²áj1šhAyÒ\Iႚ̘‚°|Káý娸4¯«¨\*U…momñ}–šRÔâ*œÞã9—FÊ‚TÔñŸœÙ\à½÷ÿû‹5düùÞ ª ÕÉtåóª7šŠ®UÒ¶fzbŒù ‡»Ä`fïý6‹°Ž[˜¥±!« ,o½±R‡OÇ šÏþ€çp¥}Ÿ©¹´óÅS+’ïSrœ·ˆè‚†ÞÙÜžo 0n3Z³E×1ðE^ò³¶Lùn "ÕzV#³Ö¥‹ „ªn’Ƶ–ÆËòPÕÏ–* šã¼Ùz ç/+¯ÅµÕë/Gã÷~JŒJeÛäªü ˜iœ›ÞÀáhNCUʇjÅÉ/¨•Ì¢x‹¹÷kÐŽMJ›A]^ø;)ƒöVÒ¼|Pçt¦œ ~§… n7k.} [9lza±¬ßx8a k©½8V–:§îšÆ-[Þ‚¥¶°r Fn«|`{;õ)tãI”yó9_Y%ê¯Ê³slÒÝ IDATŸñøc(|J‰/c/ÕåÓ¨aW§YàŠÙÊ“8;[ÆÔá£Á• :HÇ6Âü =Êï9i\œ{üHºpø1cómä¹³]8vù¨ñœmóÌ fÓkqšÍeqÂAšRíÕì;î°´ôpИÐ<$ÿótjè35u:6r“â}ê´L‘¨"æL™Ç)Ža- A´ª²°Q`Ðû’®LN§f³;»@£ì% \©+Å0©üß g÷&E×’GZÂë+k÷ÅÚ˜ fŸi%r§Ý^õ¨YŽm’L&ÔmÒÀPH#ÛI¨)”ã¨Qã@JûåQš£•U“<[ÄkX5 ´‘,&—ëÜ@MdTM^®Û¢¿KçR"»1Ø„2QOy­WUXFj}Ãuðž^WÑ[?K@‡k}å¥Ýæ4n 0pPŽ_5o‡êDÅû&åèl:J¯á£|Wr6zØæ-‚’Òk·‚îö°Þ%\ß,¿4Ö!/X0#” èZK‘.¦²ÅksÛ"{z^qâ´KÝðá­hÀíèÓƒ1¼jRYaŠ–Nëz¼¾³téônÕÆëÕØðJD>ìäñ|ceÔ Ëñ`duóëo°yøÅê(Õ¥-ħŠZüQcš›lL{6™áò&}P×УmÎs GÒ(»Ö ÍícÆáèå[C8µá†ÓÓÍ:CžvEéM¡÷RN„´÷©ýžUG`ÈËœfàê΃ŒÙ´òäJª½¬ÔYõ#£}]ì¥Uø5¶Œ2a¤r±ië;˜¾Á8+dÅ=£½.õ¼f,Ý»> 3&Öu"<ËŸÒìH·QóÀå앇B>0]¨.5ëêñ  …Sá×ñÈëí»¿÷’Y-¤(‘Ÿd pþ;Où=,>÷¦8¾-çž_Ž/mŽÄQÇñÜ{ò¯ïù}Ÿ¿Øþÿ¿ôþŸê?ŽaÜunÀÜ<ÜWÜQ+˜¼ŒS=Jcè©>lTámX´× T‘ŠH'¾ÑzïQêr8ðÎ#äß{€:«a‰“S6‰œkÆè#/ɶ«üGPÑSüì%*¡(~UyD¯“{¥ƒqYnf´ú•O]þ#u§¶Ü:öDvÔüÖ›5ÅYü‹¨EùQùOîêÓ&Ÿ;Xwô»¬ŸöD!$1>yÞ0¼goï}dÆÝ+mæ*yùaŽ RMìòÕ.ð¸µñÔ´ü¥û+lÛUÆ™îÃz2˜ôŽ}ñ~:_Ôö6Ó¨aœÈ·pµç”¬ „årÊtý!n´U_†f6»ê«Õ`ÈùÔ¨Rù©ú@Û‡‡".©ž§ Œ³ç1~~=êy*Ìé-ËEY-Kš£o`vúˆOQU’¶á2÷ úN´Š9è¡6׈ñ”²|'Ì`4¶’å0q´KìMÃ’´"?ELå& Î]üé3O{µ½Ð#0t>)™cMI6qN·ùRMM”†×KȽÝjËy×€ ÍŸq±½×ë%h¬$ùuãÂg¬g|¹‰€Øå˯ i{ÇÓÿ³w޾m–¦Ùÿç‘ÑÒ3¦emãÎ.â¦ééÜ7Wi¹¯Ó*Éoqþ.¼Ö+È0ÜEÛ ª.YöØ{»%G’cIÓÔÕ³ïÿ´»,¸é^ØÙä!{G8-Û2s„]•‰"<ÜÕT?˜à+\[ñYˆœy1» zø'ûÙxñ‡J±á}D!%A]"¬†CbÐIª`\ÔW´(qs3•¬NÿÃÇʪöþÓ°„ŠŠ4‹èõžˆ I¡>²XSÞáFÕ3%nÔ92| Ïáú&Sd«“Èl+-Ùƒa=Þ1°¢3ckÉ{Ío[»ôNgƒyÓ€ÿãCŒxöZééÃØÎ97›{x¯3°n¢‚XÃ,y¢ºÍ̉º5Q¬ZLÈžT„˜@®YÛË;¼Ñnl ÉŸ;¼Ï @ˆ¢‰x½ô¸ñ q€ Ýe{õà¾í÷û픃‘ÔåÎYWkñ›²ºÈ“$ªYe©ÍÓ¡ª©&0>û:¡çèQòqx’Ÿ:Âó”ïÆ„,°vv\B~³"ÈhæÞj7ŽÕêlŒ²œŒrúAb|nẘ·ÔG+~šl×\yÝ´>|@…¤ˆ—§*´jy}ùMå]UwwúÂßÅX ·»§T[ã~Œ¨–ge r¬°Ž)\ôm>Võ;§˜XÁ”ѬT[;’õQ̡ǣŠcä½Û°M(¬⛪ÖÊ_(©GU¼ &¶t%Èâ¸KÓ'm{(6Ÿm–¯avŸž¿ñàÀô­VÔ#| mhu}NÑΈÙÆ€e?ã]>ñ+=¬8Éú2ÔŒ3‡¥VÌ_Lå“\¢4ŸãK È„—bù¯bUãÝ43–a¿ÓŒ2)Qª%©G"fk}2 l¿=¿öÔY”‹áî'gD c¥SU»×j+ƒêw®± ØOÏKÇÑ1Ûz—ŸvHÒ¤lÿ\ [×§w7Õàèž3’}—Ôø/*_ʆ:îâÉýoñß0'Žº°ë4-=Gl§Ù{eÀ™u8 ät°áï÷}üKJ%‡*³#}x©òa1+˜çLº8§)YäðŒ–×´%öU>‡ù¦á§Ïe¶:-goÛ±†ÃÞj»¡$ÎdŒ’fa­ûש¹ K´öâ‘5˜Î{¼7?½RÃ7€Ù,0—ìIØx«ëÒ¼}¿mØøÐD+`Ÿžb¼íÔz|‹j,²ÎIŒáWp€ö;6jQÙýû}ØZFóìèözv¦0ãÏœ øÎ§á§‘QJ0B#Ý—òE¯_«üö$ïÊS™(¼üÓ¿/øÿ—þó%Ÿÿäûü úWÿå›Äãéxtù¬ôcë;ù¥ùq]¸"ö– ’Y½ê¢µ¤ù̉@¢#2/¾Dyt%;FŸ6¦! М´ô¡Ë-HÕWÒZÄ(d TÛ(¾ö"pŽÏ}ƒšQ9øÀ ò'i*§Ø© .DO4ðq‚–™­DÿcH½·¶¯}ùú<å#Á±¿à™Bøû$Šˆ Ýl ·äÛÓ§$Âv¸I¥ÕGU×µûõ~¬ZÅ:™«ê[Þë÷ïT¶u`~Ì#Îý"LÅÇëÇÕ±ËkO¥]ÓsÂðYÞ×af’š„f›†ß0¦9ÒÅê·r=Éö`õ&¹zŸÊ.eãÊ{i‚³‹5É9ƒ9«ýX-äÌò3nwË äö®×º/pƒhk¼¸fAÈ–ãg04qQÞõ¼Íà%º~swÖh×mÇs$_YŒ°V„ ÌÂ.Ó—‡Ÿ/Ë öB={ÆÁ8ÀËD 8³ô%°{ïû}¢JUˆþÒm§ûh‘l˜h$u{Ž!J”SÍ•0?aGx£'¦¹´ò6þR4„7ˆ">X=þ®[|= å@ß÷íÒ¥¡êt£=mú—8­p£€hª9oPÀ$ Dx‰ã<ÓD=kÑÊAwùè+g~·|Ôaq1 )Hr¬P9µ?òÅ0à÷0Òĺ5%%Íßè(‘’*-Låw¯‡¢1KÒÍ’ž< ¾âî—ëÒÉ`УöhöCµ±í&9‡ÍDO[òøa–?9h)!—£äuB,)+¶Yd²2šô]þ Üäüƒµ€÷£XÖ!ýÆõéÞ \"Ê%62k¼U&MŠàúÈÏ#‚j)pxWÿfá_yvBk‘€)øö†â©Èñ4ÞÐzÓö…ÅΡ7–´N¥£Ÿ¢D}Üì§É}׉–3S([ŠöúÚ§.”vÿB\^ü‰‹ô €IÀ׬á¨á•{èÛë² 9Q=cKKÉT³iK¹&`³Ž2G1#¢á¦’¸X mØÔe—Y^Ò?äâ?#싱ò4…­Qæt¶ÿW‡'žüžUuãŠUÇó5IúŸØÿã„6_œ”Ú}ÎmNçü?uôëþ¾äRÔ•™ÊûA À%èË öÆàÙ¿›±qš’brzCŽŽò0Ê€ qc?õ¶# õÃN—_ü¦û#xH»c¥½ÄŠ_Ɖ_»,ßͤRìJJÉ»î"Tf9;ΧJÃ_M×BÅT‚l/ôºî lõÈŒàfytÜ6E?Ôð7÷\ìá"ÇP7÷myš˜ÈàqmN¤3‚#ØQi™jULí!³Oã!Ǩ,M_ ?à?¸‚tñtmæÜ*¶ƒ?}Œâ÷8M;gùÀ_ùÏ]ñï_ªþÿîÿ—qØÔG6ê©þ& V¢ðs9ïÛböúƽ¤sëÕû”Ê|C­a§•´ã‹®©èk,&;`Ô2©®Í@ÜÑu/u2´tɱ_eH• ²Ðˆ¯Œ]…Cµ5!?jb1™Èx”…ûÓ‘¸@ýy5z Qíëë#Mò€|1XÕ4~îìtç9‡!ÄÒÌÕ•åì`¼HÖ>v=qŠ@ÚçÔÆõ44Ï}á&ÇG‡eÅÊÓ‚´AFýb­qVIÀÒõ3$©€äA¬… Lf²k1fëœKhìÄ’·Õµ'ù?)1bo‘Z‡RÐ"2{‘ÔC¨ÌfªîC‹qKtKHïÃii1³ÂÔƒ@q x_ʽù÷+èÔÛÑŒ0û‡å9S¨ª@µM¡G¨|ó†pÏ'/«3ÀÑÅš«3⥜}%°­×i¾y‡( r\wãbò:•´M ou}”o´5"U•ÖÏ…¾í7½¢J„"îÕUKM½¬ÕŒ{Ȫԛƒ¢A2Ë’óOU(Þ`Ô[£ýþýÑׯiE ÷®ªbwXÒr´$ÉÓ¾ÊN»o]å3)þòé"A ÇK(ˆ~ž5»$wúMþáêÔ Ì\]-—ÓŠV°]1øR*ôæü8Lv¬VŸ4¯±­:ÜNj°H'‚­rN” 1¿ mt¯Mª'DRüÏ!å#b•z‚*ü·ƒ©Ò%‟Ù”åG^¿Rû bþõf…iÄÝ ×` &÷&xWþ«ªÂÈÇYU>î³öõßà­Gü3Š?u,‰Rå°a‚$—»Ü–eÞŽ-E5ûæ:Ë3ž¿õ,‰Äïµ[þqo*ô@¾¯c•äŠÙåõËÉ ¢ç,BâZDã¥ü?ÕÍ.m„ZBÃ’Ýâå²U­WÆê–Ìr~ýªxnªÓþƒrÁ,÷ਫVÛ0Êå«Q@£BY„ô°D8·É´d yMp‘F}÷´ÐþÄE½„ˆAN½Ë´eÉ…RÅ’5Æp±ßbPV¤”CC©H(˜,ˆ}‹Ûð›fí}ìK2¥-¯¹1‹ÔêЊA‚>KVb[['[m ™¨Ì'é¨F_£·ò2pEŬà}2.KO[§Þ2"VÚŒõcÞ@AŸº§Sµîš½ ÆÃP?$Òò±ˆ·¥|èë,‡$Í»IäY*ÑãÌXÛ˜wÎbOêF–gٛŽJ&ïÎhñרU ËA5à„ÐñUkÒJoL+ãO 0Rà=:ë#kŸ¯AÑjXŽGJ²>œ+@Þnž›$ŒÂz©êrö‰]ÜÕzîm;Ê0sÖ‰@€ ì#ÁñOµ4â»÷”ÿB`=ž5xÿî·…lÞC F›€œÝ™EÖI‘rÑU{–k3ÒÏ-MY•®Gõ–’ PÚ2ª:Þõ £VÌY8,}®X$¢\G!ÅÖŒ­ï`ÜÄcó15û¹+Òï×Sæ·ÿUÑlQ¸°lD0²QI¥xÜ”f´+Àþ‡&sÑüÍ„‹]ÛêfJêaÂâœz3q(Ü\˜µ¸²”ü4·uf8Ó`•åX‹îøk1ÆhR”ÌW2Öá¾æzD¢’R®æ'||u¼ƒc\•¬±ïgJØÖÍUšoUœ0!4Yo^XüŒûðAÒ›øÏ`ØßÏþÿOlü™÷_ä Ê¿ç…X-°þ ¯6ÁOø VŒÎ©v×Ê#ewì]Áp¸Cºû* ­¬@Ã(l£…UùÞø»Z±ï»<ܬâ¡I¡¯Ck©>Èìùö,ü‡R H´†Œ†?ªß«^ü¬P–*Ù°r|ïi Ǻß¹’ ’G‰ƒ“¨ÈMgð6Gþô‚)Þ›MTægùðßf ð*ûÃÊ05úÎ2³4s¬?E‡ïך÷Ú•>wt÷ïÜÏÌA‚;¡xɨ¡òÖÏÃÆ¬"ðÒÇsÚe–jz>³Ìºy•0H—iŒší£°9–è (yÅ`¼·zmÁñž}ÀQ¸Têg×B°yJR7erÄfÞøZ(«ú@Bý¹š={…­ô¯Ô­ÕêÔ•Y¬¬*X±çzxšSª¤pi^%x@ ŽØA²1¡N¸ðg¼qm ÙÏq¹1.„Õ~Q[l*Ó&F½Öp‰{;èÍ}¡'— rTT!<Ð+¸äKx zF7«…”Ю£l‹Žn㡳B\r…è…áÆ„•iRS¦5QЫ‘hf‘’èm£ï í±N•¡Ì“&F(ù&?Û˜z´,O'dXv¤œ:CAðëç5Šs¼EŒ*x ªNáì,Þ¥i¸†åšyÄ¢¤ OxdGU»hÂî¥Ý_¿~©þê)T˜Ça"ªˆ.: WuJ„.³,ƒb«êª#,¼o%¬ö+# ´XVlœÌ'=ÖOr`œ˜=£àÿѤ3sMÌïf³À&)>MGY8y»ý;*S‹j•=ÎÄ‘#JÇ"“/[éíùç5 wAºb—!& …êч§!ÎËæiž¨º¥,òçèQ}½^¯_¯÷ïßsÑNWÒÈ/ãÿÃß½D£rùzb,¡* ó;L°*”!zŽ72zÍ‘óÄ…ÆëPÓ–`£M‘×,A?LúGúš0`õcô®L]ÊA?}MG°Ü‡4k™Óf^°XH91ê9~nÖßh‚±Ã2:ÊÃÑjQÿ: ­æq²œ_ð¡ü7“¡“¥·ª*ÕØé ã ˜E؉v“:»û5gEbïæÈ˜dþ‰Cñ¨ÜÇáf¤ÐAaY("Кçô8úÜœ)`­»¢xA@3Oqdq‹1ë z¦¿6xÍ)Tͬ…\?eF%¯/ñ¸Ðš¾¯ÙHI?Ýou³x`˜Ýû¶`rØ„úáÖ”õKÔ™¶Áhæ0ÞTt/ðª$>‘м‰ýuX­ÍØÙPÃQS(õ%ã¨D™¼aø¸À-ƒ±"˜¢—E»ßõ–Ô[ý-×;¤å$Œœss±æÄc1ô †™*pÁ§ Í9@n»éb°,)Ñ!¾ž®vU *3œÝßö%}Tt3ÉÎTteŸË‹ËUj·È²ù.A`“np]þjò›ªÚ$ÙfœÈytÒ~õl;§SE<€xig¸a¬ìŽªÑÄÎÓ¨å®@RòóÑÁ°ÁÐ ñÜãã{öy{ÁØÅL/­OfX¦&LØ1œ´X…cq½å‚cN΋ú‹þÁj ¶TåN”£æ:pû:8¦^ ¢ F;Ù㊠à„J ìPqÞR²ãf‹%¿hÿÒ·ÃR+8ÍΟßûgá_Pü°tÅRD³xoŒŠ….ªòûe, Ü):>gH·^¸å—ƒÆ@ ¨v{ªø$É R]–Ì: ?aÝÚåûÓˆó\6:ç¸pa >½½RüÅ-…ý°û|#%òÕ9*ߦ4lƒ]!·ºÄeŽõ²Ïþ1ÐF—X€6>(6óŽàD ºa4lXéåÑ´“ª;¥<‚œ? ¶S~OäNnÕ‘Je™àoWÃ7k£scF,eû+ÇLj莵Ükß LýÄösB6G¹Iq„Ä¢ÌÛ@<ìîýŽúe¦¬¢âÙý”äSÂ(’zø/™iHòà jaY;2ð)LTþrõÿ¿ËþÿmÞÿů\ê?Ö´¨bµ«ær^‘@! lù=eÖ1Ã2ï?ô¡çºÏ¨ ÃŒä_DIЍ \;Å€½qPrÿç˜Ðô•UŸZ,’øa‚¬ÕzZò‡,®WçL{¯à lU â…Ú:uã{8« –%‹€Ô lûÒr `Á-B—H} j?æ·À·4€|ëø?ð±i¡ôI˜3à DdÃ]ñI}ɳlßu‚ö9ç¼^3t?ÚbQ:BIí^|ÿãjÄØGv«â—¼PÀñ'Ó:Ì3ý0ña»HõôÖÖõ˜dË„g°ïw`jªPUßµÚÞõâtFì‚gÓÒ5¶å³šïóÑ«<ø Ý@YYi‚Ð|ÂÄ:;,¾ìý}˜Ïý]\4UÙãç:Ë!Ü=²J> J$è¢_Œ‡ÉŠWd#o"£:²89Y/aáÿ(„©»î<Ý«J˜ÆœÐJV=z.Éb}:Ö;Bìšy\1ÝòeŠBd`ý„å„”·jD^ãcÓâà„¢£€(Ô r/åšYÖ|§R‘WFCƒ¯¢wˆZŒ¤è)ü¥oÃ,Ãß ‘ki@² G¬gl—fÒÀ‰òO=úR‘k÷ÞOUME³Ôm|¶¶£ßO…^‡ŠS€õÄ_æ³GõøâMç·¨Bô„pS‹]‹I­Ð˞ׇ?OãÄ—c™]‘ó¾$ ¯_¿ =íó£z=WÆ(ùaCñïc88‚PÒ“<ÿyŠól³]óÎÕ`MêLítKuü­£¼7»˜ãi¼{)“!˜v)”stœzóüföû·ýú¥GÓ_ZÕÇZ\ÁÞvwaI@¶Â?æb,`>÷ýã×ëœ×ëõ:ª¦GðÀ‹QUþa÷Ü«5?››†®tìF6—Y\4š2weîg ¡_¯…÷£cZ^®æ>SbS\Öµ·€¯½ b¬ÓWuiCèÑÃ…çØE†“t1Ì6µõÌbâ:u;ø‹!Çʸšä,_O¥úŽ/~:’A–ϰ>… ¨mÌ¯ŽÆr7^˜]6—ù®ª§\<“ïX8ñ¿wÈý „ˆ¨tÑcâ§â‚ã:AÏpûQÏq™Ð |óÌÜ{Ô§,ögR B0³Ï{ÔÌxe Åp‰ÙÕ.B»>äÌDj6Õóz½ßo_PýÍ´á±ú·óŽ41<2LjþÅn"Äæ²˜Äõ´ô)ñ¶e­2Ã_Ê9‡«Ac¼gkiðÇè €ÂxÅK2áÑ—z¬‚£Ò5ìó¡P*|¨h‰°!ΉKÃÆ´êÌ\d®uUN‹ž— ŽÂ†¹½3ÔqLÐî_ -Z çÐÞ7!­e;Õ·G%(’ry¹{MŒuOC2Yp‹£ôà ?ó0x‹¾US®TöåÈʤN¹¢¦œÛè 3d{Và›DUrì×G¦¦6Þ1ëLØD심Ëm…Y ?KRáZ3…w¯õÖÕª2aó˜&=JcCsï’R ß5ác›‹êpëc˜fùqï«Ð2ë!ƒ4?ã)ýÏ¥’K:Ð}ì6ß9M›Nq‹™mQÒýÂ7›Úb{¢5Å,ÿ4:WÉr\ùÿu;JUX”=5nVj´AQx4ðƒÌ0ŠTk¢W§3,bvöo¾Öc#ÿ˜xCÅëý7àÛÛήr¥ IDATÚL)rµÀ°¿9å)Š2ÞŸrÎÿ¨sµÉüÏÕ9|ùñ|*øüáQùÏE1®¹Õ ]e °UýT't] ¬8Zf]pΔâg¿'¨ãlëgŠÅö/ y¥‹p²íÒÎáàTxI@#wŠBUi*º.rÚò);L°ìWO;̇sjzãêüëÍÂäŽÒ™É¯ðB“hž”êʼÅ×ßXØ-ŒR(/G#q"t±ÜÇ]Å‘]$MÅ/uG^q{äe"F„ºÈyh»WœŒ2à&"¢æ¢it ØMŽwÏL3Åz=â°ÙlU ýüACèïÖ%º>\¼]bO‚?¾˜x™³„UƒóÐ×zNÔé!ŸÏ@­³C¸°ŸÈ¾ql{´ÁôÖBþõÿßL ükêÿüR.Œõ&áñ*¦óÚwðE%7¶ýÿf¶ lÇÌnÞ>¤wýY.†¹”±&¢µÕrz~‘°†ý?êÒ4ù?-"Å$U¦IN¼Ö(ˆ~´«Lƒ'‘÷\_Vé\m¬E<‘FõH¤³ &“è'‹9|±ä—x‹}½{0ÀNôþ ]ÿk0ô•ŒZ;à¬(òû8-@V“U£¢}&öYe$_œ“§Ú,/³KM¤NýO#稜é¨C4†Kõϲ29^â¹I2KöæD¤ §u)' P=GõP ¼T|zÊWH‹*`£èQ½¥­el Üæ·e¡ìR¯ ‰xQAü’Åd •fyêÒÖ'ËÚ(#i¼ƒnÄÜq‘6Bˆ5áÄxˆÖ„.âwž+ ?~ÜËnª}>|Lìä·Š®æ–&œÞ!FªÅû˜ ¢¥W‘t§y™o¨Ÿ„ÈYÄpSU/; fdh—:åî,3’¦PhoŠý-ÕÄ4»j¦Æ··øæÅ7Q•4}KD‡.\ÆAÃT|íÝ^ž£Ö½{KUìN£_!Í2Ï;Áª±&o÷º92x¾×SU= åè1µz*eÒfìŸ-N fcN3f`Zý~üT}9¿ÈßÕÃ=ú²?\J>Š÷½~UÇp®¿!6Ö>¼£L[¡Æ$ñäÍ~c~½ÅÞ])Ç0e€о{–oš\8ðÉ6ÊÚPk‚°ÇKS_GƒÐ±KwLO]“=¡'†hoMßÃzz!4íf%óðê†ý?ÄÅsåfõÚÉ( Ñä(<ªB¹´kÆpK=ÿë? 8'B`z4ÍËv "òÆ=¯ú¶k¾­Ó¦}˜þ»·‹ÇÇÁaÿbb÷÷Ûƒ-éLÆìÕò.×\6-q-c›·}^ÕàåɳbÈ/ ÀèiÄh•ÒÀäRð4yhàM5¦W¨FŠ%§-5X"âÖ0rÈâËÇuÚ­¥ò8Ѹ €??W< IÁ¬š—ª<‘O–AéÈãAÉÏCO=å)XiÂ. –ùˆ._‘n¶ EDý5ú"Fàd…χ·àÈg´xU_kòIJ¾ùÛF’¯sŽ‚zh¼^JÍÌ®WHc¢$û~<˜NÙWµD‹!íz“¹â¨Ì !ÞÑÐ $õŠa iÚ_²]ÜÌÙlÓ·ká˜ÚRÐwÆÌ4šïX|”ã¢q3ýñ“5¦ !ÉWTSGÌKÒ¬Ôx¶Öºd‡´ŽYhPžPk6RM0€œsÈÛµÌ"¦ª[Š7*mÐÑj4>|/™Úœ©~0_¥¿ù, Ð €åS{óv©7¼Ír9¢±R’r²j0€Ê†=žEÀ#¹@é²-J¤vÓßü†Ç/¯·Ác)¦ç?…b´¡?cNذÍy”Üë¿H¨|,9š3VÂéÄ€çËi¾&hóÉæ¢9ÛýĸÈì˜Þ‚éÿìò¨8ô¨9ò‘aÀ)É,q: ÌÎÒĶV˜Ž V®©¥'Šèi°w ÙMΑ¬X×lB©ª±cÃlïí†êíFŒ‘QYì-÷‹NõaR¡5F á9ó‡+­?‰£“JîjÙÿàŸ&š¬ÎÃCô¯XÃ$&\ôXþK¹?QÄ6óº™+ZÑ©þŒ€Å®õ1ç¡ZW{×"øv¾?=*…z+ïJ -ô¡az +n‹)Óûò*pÕ]ôl£ô”K¾±häCýÿxpÚŸ¿­Übl=orò禲G„¹…[Cf^¥6ð™õ­çã;î*éÒæF sŽp1Ii»ƒè%ê˜Ï|æUƒ½T S÷AËHÆ$´‹1çPHÉY®'Ý»9·jáM@Cq*(%¢ÜñφÏ1°²Ô,¸£뜅ç±+ ñæ1ÑúÀžÃ=ùÿS”æ>,.Šf_™ÐÚ®á1‹Àèjïå_[üû_ˆþÇ_ä¯þLŽÌ›îGï¿´}þû<`­+}ïöy:ÿ£B>®Áç´pÔR¥ˆG`‹ûþ¬è†Ñ#P81ùË]Æ—­ÎöyÍZ0y’kêgqÙâÇgg@ñ2l„™eÀÚŽæ“UéÝ‘nóWtê¬o{‘¦ÌŽåm(è§lI®Ù¬*M£û&軪ÿ“ñÒÿá €Þñç»Xb=£èì³õ‹²)·‰Qf×—º|cñÇÈ:ýF¯sÞ77Úw¹‡cT _ :á’ƒ–y­yAœv§ú×Ñn7°öU'ˆÕ\ì›yŽÇbûôëQ€ Á«h å>¾  ØÎ ûNT}r eXmäqcOp§ùo†0$½BñÜeßIFq›Ï|ðM&RŠ›þa|Ü&{œ8 *&Ôô–\ÖÒ_†óÍO2h½ŸÓ«U¡(Zp{xÕÉð¦¾O1JØ)/ Œ¢‰RÍ’:>$—Õ¶•—CìL|oz-*vU7*ºØeb6—fõ33ë6L¯µŒ7:f_!ßùÔ€í¶ö¡‡RëÐäÞ%õ„žð81ÇÙàåÝȪW»7 Î6¨yÇ@XûjÀÕ4³zý,ÿ“ŸF Ü™Y_í—”êrtù©´CüVG„8¦òKÔ»ÈÝ5{lù5L¥Ùè/dvLìªs[;:³ev ׇ.E»\9=Vµ•NØ&áîÁ¡ðFÊÏ#öâ±Z?] ŵ×!0¿šB¨í§å§V•ÖrUÀÀ'Y>]/ç}s6©è¦ÿñ&Eíè9QT ¦‰ezÂÕUc:ÁýÍw½ÿ@Mì}ÍŒ×ñázÁ¯?~ùèȇ»¿^¿TÝqë¶&ùîï?伇ôe¥K%ªÿšŸPpô8‹üé9ÍþGo3Uáµ·™ò·ÐD5†  O€EºâÙ³À$ÒÄø5?‡‰¡xKÉ®@¤oz©Œû»ñh;×ò“3°~œa¤?± æ§L»^q²#äð$9º(JLZ>sп‘³²ò 1t#p¨(“VÑ?ÞöxºÊ/ð¹=Ž%`¸¡“é'º[Fýz Z¥!¡‘m¯ö…?H;ØN4ÅI=û"×'eh¶5T& vOz¢áï<ËÁ·šAqx‚øBï8}lyÄYXÿP$¸×nT'Ë( ­aFEòâ­Ì©Õ JU½–yB¾ã~ç D³àµKxè+ʨã‡ß̪ƒìz ö¶ˆ¿ŒƒMÄíÇÀd’Ìï=‹ž'/‹†3Ä¡¢U¼ŒO‡ò÷‘ê å¼£¹}~¤Š>‰»‹NVñ¬¨ßCÌ}¸Þ5îç"›_S¾Ì É^êÓà[ ëu[)YŸ™×NAn ¬Ùíà©È÷\3eɼ@eF:›mÛI—€;éÍ9ºë¾Œ]4á o H[˜Ñùв³Ý$?‹9䘸ܿQTˆ[a¹DÓƒ£´*eb|øþ‰¨€åÒý*ú>Ú¶£­v®Ö¾rÙ¥}ïƾø1OTOßF;sâo÷µ#¯+&hœã·þX­ Q•“.ÒêIÞê¨)ÔXÈŠ¶“Få#îÛGM^ýgŠÄ%‚ýagÔ·~Mìc¥eõ*i+%&¢ÙÎ:êÄcP„‚# '£®t†íoÀ?§ç™ô•Z8>.½ýg¬ÿgœo,ß#Œ'”S\4í?·Þá'‘|2è§àž3ª;Âè•VÊ¢†ŠAÛZD™Gõ+!cĆ™…¹ÃˆRÞìöðæ1%räÛ†Wü87A¥/ÿô½“Ëš±zƒ¾ìëǽ§­t¬:gì•–NÌ?‹^ëH¦ÅŠ‹¹œÈûÆ]m)j§l‡r¤ R²wŠUžc·@°í¶yYŒ_>ùO”ˆM¦ò9ÍØÜ®>uôÎJ®õ¡ZלaP…ĸ×ÊrÒÄĪÐãìôb]‹ó,Å„…Â#ˆð9F[¿ w•ú®éÏâð2W?{c>¤ú/Gƒ¿“ú¯59…ú?nAùÆý_„=6Û'<í/ê«Y/»5Ä9Š|šÙP$ªbõ*rÑ:æÒðÍÜd±½ûBž•Ä­‰Ž³˜.˜xgí•í­{è,ôrß@/ufГ‰òHØZ£¼*KE{y^Ò5³ºûIÛšUø“Ç æöŸÕG…†³»pÜ?u“~!ë˾\ÃÀ ÛhÖËUNÒ͸xÌ{/‰ô>Ÿ¤Ž.Ÿ‘L”g{MŽ 4|¶‚é‘E£L×s˜:ÒëþÑÉç)S åx ƒØ¿†Gc§?Îfœ‘Ã~TaN½¥Å’Ò7tsÍ}ã}õµâ9N[nŽëسSP b}s×; @.'…ÈߦƠÐbp6\Ù†?ó9âñ£Ì@Zƒþþ(áÄ’•…4BŒyÀ`Ž¥Wå‘“Y¨ n¯2jDj¨–dX®órP•€d–ƒµ(æ`¶þÿªQ”Æ`&hè_P,.ž,Tð ªöÌLë*å„&uÀuÁ˜µb"v}$É&P@O6á¶.szÏ€­‹ˆÉu7èdö¼EHóbukÐj¼lëc±ÁžôaSŸÚ:x_SïÊLõ²üÒ¯jãud¿{ç`×C»’hGÂüé#Pu\@½@'ÉBD«zïi=z†ÁÒÄ;"¯òº3É2cI¶™´¦Áˆ‘¢š©|ôa€íqq©FsèüÆ@ôÍâí½.¸n–Ñ6Ä$GGaÚûþVÕWîü¸£ežMíI(¼÷b² Ò £ ™GÔ)¡áϨG9%OàãxC³÷Kž(’°õ èµÒM׊W ¬L¬ <ìÙ§jäxÙ[’.äõ:çh©iföÞÆjš}Ýbv/ŸÖ͇û9Œ±õzÛ?Œü¯?¼*CHC¬µs€—awiî}ɪnáG;ûÈç㤙ÑCÖ6ëÄöCÊ®}nüµlOèÍ®‰ª?!\?²‚3©€_O¼þ_ˆrbÈ »véÇòK†GÓêñLJã"dPàÖ€éã«8¾ï›êckÏa" >s—dµpc% ÷îŠÚ>z\àœ£GŠY˜ˆ¿]nB»8¯éÐz¸C.À¬¶ó¹°0SÌî|[rŒS b(N¶_ÆäÍ®½ã³Œ‰·¼hN[üXó]Žãg{R׃“—|´<¹s¯%7JDh*a8`= ¼ ËãŠl´z$(“ȹÙ3D1ôÝk¥Æ™ñ}ýuÍ ÐÔÜ‹<#éDب¯œšÛAtõIIwTgÌn©Ù[}ˆ¤ssäUH­ÖÙñ½ v)‡Å<±, „ªÆDTí¥ y0¤ÒذÇUÜÞÜšgTg8pLª€ËþÄÝ\˜8ƒ¾˜eC”I3r,Jû·kC— ÄJ£r¸Ów Ã5ZßuÌΫz\ÿØÂ9mÉ,v’}–,}†³ožàÑ›;ŽgË(—Ãx_Ö[Ï:6,4qedzùö©·k<¼"Xò$| ¿CeLäèy Hþæƒ ºì 9ìP*à@$ìk-ƒ»ÐíH’4ߦ֮ë½|«ZrXU£?€-^pÈó’ìÆ¸JÞ FÛMì#A£€õ¢y‡Å]¾ú™áÈÇŠšØ8†…1¢ý;Ìa¦¦¶É•É£”…ÿIïOÙÃÙd†Í—ÿ]Ÿã‡tÅ$ïÒöÇOÃ\êÐÅέC5–+çim[Ǥ»$íÊåÚ:/ñqîæ—whkYo:GLx°¢iî7Ê÷š{t#EÈÙÞf2W²~ÝU÷ãž‹?ÑÂÒÅ8åÖ–õ¿œ5ÈØneÿOç5”w¸­\–8ŒM ¤5b[¿^:ÓÞãÕ5FüºÜÿ4¼}Ô.deÁßUý—(–næÍ)Ê8Ö†<·„!ЭÕVÞ|xL”Ñsù¤§1šNºWMqqÿ˜>˜¤­CÙµ×(]¤ŠUÆ=Pq£Ôp,ëS85¢+f6‰}ŸÙ^Ï „‹+~¾Ã ¥0÷ÂqØÚ¨Ëi Œû„úËèëãZ%‹ãß¿ožÄ:ìÈ/‘ÚžG­,™}¦ògvÎ螥4Rû!­×lÖSòIÝ­~0<ú“(]K@£ŠƒœÊq‡ô°,ÔvLJ¥ÿFÏ«ƒ›ª/a¨De¼Ù/¬º(®¥™½õñIÿ¸ãÀö KÅPŒ¦"æËzqÕ+—4kµ!–xµ¸Ò1.˜óŠ€ª1T¨-Á8HŠ£äÛn…ïý+ ´K‚Ðïûƒ9ŒM‰jŠŒ¼^¸)QÖ52ýɪXE†7T’knãUªrlÛÒÀkv«»5ìGÅ%äŒÅDämòIç ·#°Z¢Ù‡Oä”.Þ‹¤™Å³ÑG–˜›7‚à&O¸î…¼ë‘à2ãIØäkaÏÝg ÷%ï½´×QBMÔå¾òÁ•Þ0¡œ-ܾg³×ëU=«&ïŠ ãœìöê£ I¨W"_‰‚ðã•ê!7Ò®›»½Eâ­øuŽ‚ÖlýðÔhr×K‰×sH¦8»Áeµ—¤>ÇœýíÇüĵZ/¼gÒ2àßì]÷ŒŽ‰Ø5ÿё̡ÝLG*Ä/3¯Z]ÎÑ˜Ü ìsË ®9&ÂæÌK 86}Ò}üGÂï ¹Öün«X”Z…z‚n Q9$ “AïÇÒßœýÛu"ÁäŠD²I GÔ½a f{=OÓˆ²Ž% Ôé,B %oü´ê ÊÁ– ›9«gº—dÚu>E1"ŸîV† ‰óS«â ’„ï!ÞÇÒ@èz†g/Xù#L¸yŸËÅ•!˜[º9µ†Ñô©ÙŒ(4"8¦jvߦõ(G|Ó`©+íÝK¢JuqÐ"ÑX& ‡‚<·²ª*]Ul× 03øvåV&0ÐÎÏ0BcèvÛœ= ”ÆõDOQpi…ùæxið}½}ÇøÏTx團tn±gMƒ˜ñhð“Ìä›7"G%mËyv ©Ë•éÀˆRÆSmV¦ï)²ö+ªXÜä)­2>kaóNf ©z¸ÛcQåV?ØFÎÝî4ÉH,ÍŸë°Ê0±» ÒQËÑÂÒïE³êQ§LMœúWË^‡Ú¯òHU…Uóž&®Ý{Īòõ4Ÿ6"²}Ö†Îè§½‘gxf¾;²òyÛLlm­‘Y°DOZ_H—áQ¹uÇ¥÷Œ»]Ë ŽZoÿFŸ×>{ÉQ¿„Nƒêpp|¸æ÷¹¡ÇAµ^g‚#*b]ž¿² >ýzΉ}”¹b8QÌm—˜/–óí¬C7‡§<Ÿ6ãØYqˆ@N`“å†Á–€œòÛšÓDô =.Þ,¼•ÔŠ1Ó÷^çÿÐeú1OàÿPhçºÉ‡Jø1ø¬F\ «Q<ÝQXîå ~—­›8'¦—qDld-k­ÃÆ–t`—*ÔÁžbdú¥lÉɈÝ`ì¤yEP*½îòŽ 0µ€õXx³ž³`YmèüxËk€ôe”Zìuv£C…;¬Ãý:¹§DÂÖü[o#Åѧu’ÖqN‰HiÝ·é[÷|Dçk(¥e`Í=Ê€LÈœ­><籿éxuúé†á2/$ÂàKŽŒTˆø~®\ Èêº2Ƕ?ˆ<Ö-·vy“'—'x›>Çòïg†b\»Î 'ÛE«q>C|’‹‰Œ l Iž±õTøþ´Œü½"_ÿý¿dðWµþò)ë?çØ8ÌÕ!K)°å¬êüò>g ¬º¶áHp'a9îñ1‡€4*½Ê’Y‡RŠúaÍ¢çµAª9ÅgÛ™%¾á†‰Êu›á¼8ÉšÉ3 üžåŨtÂÜPW>ÙóYO“A¤xòælUªk>ï—Ê J6Z™…òçjZ¬uƒŽý0HXÙËÑâèßUý—.æ0ú _û†&|iëˆ]2–ªGÓJVÂYSh¤÷8¬Æ$'Îsô"bÀóòff q´~ÀG ‚?ÖËÐÙ’ø Ý‘¼Ý:i6E—u òý¾¡%¸àö§“£~Iâ¤=#s{TS>F}Ñ‘êØ´†!«.]™AÓÙÝ`Zo¯ˆ¥DH#ù–×뤄Á|cýPmU›i"û¨/Úɾƒˆ‰Ý Õ&Ôû ³I©ˆ[8@fÎèâFëÜ\Œ5JÙŒ`-qV À!€£~”¡‘×÷[IÿsÍJÑ FƒÍëˆËa@º–‡Å¯Î¬¥+]áŽÍî _|Ë!=Ó$g^ïžõÕín}ˆ±ãîæÐŸߣªw1²$N–I°ë'D÷ª_iZ@]çîž÷÷Jb¹üc×¹!ÃéÒ½r|p9¼F8ú¦.ö~Yöšqþ€8ª;†Gê.¸º¢}šƒxTH·°¤ØL"ì¾óU,c/ ~´´t.U2ðn'D¯8ÍĽµGàÓRƒ0Ø©U«èË𓸙—?ûÕwßo§àâ×ëˆÒ1Ó©Ü9ë¨$Y¸jª!G>XYsyÍîï·Ï2Còx½¿‹ `\ª0X¼£ !kñ× i©c§ŸÛò„Îá!"C'É@æÿ5…Ĩ)‹iîøTõšñÒiµšÚ+Sþ²Zg†Ù3Ö5 •1älsžyn„RkeXX)»µ>‡ªÃb¼Æ‘‹R¨×ËÔW+uøÖ—r‚n6&¯?R_T¡‰pvùøb}!"×®êAÉàúYT8vuÐs,j ú†R¶‘C9]ÂáÐw¾”™N>ÿDn=‹SöFN/j‰Y”O¸ 1¤æòˆm WWUùí­*£31ѳî|¸ƒ7üs;.W3@Ÿ2a¤Ìï5Õ[‹8§ª‡v{—õ÷?.ô¾ëä^žcáÐLrï½ ƒ|’"h§á¹d{G¥{¤£À…Tv(VU§yÖﵩn1Œ–-/!ÜäÊeUàÄ¢*æi‹«â•Þ(˜,GP­ý²ë`ű 9=m,9_¼|ds!%…¦fMÏY\›~â2@Ìd„´J5«U¥ø¬,ÒZà‡ò „ÏÀÊÌ(¿`4§­]ŒŒ±xÆÁȆh;kä3ã’¿šblT˜oB9PÆ,$“µZHo…\šx¾ºCå6ë´é ‘1 ¾\Ü\LrœÄñú—ÛbwsÙb˜^'ËñR ä³ }îÅiýî®qÕÇA'âË&ûoœçùN•ª•}hÜ÷•×9™g 0Ô¬„çÔ J@MüðåI¾[AtÌ0ŒrRs÷Š«¨]¬ùÅ5i©CÛÔL8#SP‹aˆG=5{-˜OTsgø¯;ú% ÉŽ)¿,vãŠÅç®×þ öŒf{˜f'We6˜°ð‘°@aÊ×_2 À“Þô©)ü œŸk’µ6m×grßkŒŸ‹%ˆçWƱLšl}˜ƒc¥˜ñ†qSÎJòJß–tJ™ÎjØšGê" fØqý²¤PÞóÀ5{0¨&¶úß<ÒBÓÝËõÞõ|m»ëð£¹_¤ûN$³¿“âm92šAÉéÃo=¬ãÞŒÜ÷ï-_ŽÖ{h/Ô¬·Õ¿Íi­É•_ÃIÜ® ¿M;èŸÏ[VŸŒÎŒY»¯°!‹´2”º:oJ£OöL+yŕĨ ¶kº‘>502$†œXaaQí¯¬ß7.–˜ñ^àÛ^cTcð+êÿŒŒlƒì_ªþÿ×ÿ寒Uñ§>b@vÝjÀ3C|Œ”²ÿ“ÌÝG×–,“h9š= “†´Í¢‹â†ã°#Ûgylrp<¤ÃOšŽè¸G² %c…µAÔ=˘+#11))é›@YîÚmÏ_ÍRNJô¬=j÷–š(¶3ç³­wÍ*sö6!ó¶÷_º q3ñg:>>uán•ÿ#€Ü›S—ä«dÃU\-sv:NãœÙ§‚€ù(Ô_«ŽoÚÝ13òô´\¦‘-Ê/ÇX:Òñ eóÌjÙð–ºUµcÒ!z²QÎØ*Èœª IDAT¹‘áÒ$͉ÃÏÑà©&Í„‰oêQn¦FhEª±‡sd( s+>íèuA!7oOp:g9KÍúýÔ²½»Ôðrè¶Â¡’bŸF³x:†šÄŠä&É~ôgsöé}7? áº0/+”Fñ¹4 ÆSªðÂD«x:r›&"УÇÞV*"Ç" ƒz9GAµYh!û°|œÒ䨑pýÏigUœÙg%Új‰KÎåÁæ#²½gCX®”*JP…qˆxú¶¶Î@:¤<¼·ù>* Íõv:œ%Ú/ƱŽqñGXú{Š2.Äm¬Á*÷úú® TDhâêǼ:}ÂÉû÷^ŽòGÉ•'¥òÞÀ€ñ·¼×+:ìi¼ð´@²˜I ¹Ú›ç»—Õ-|Á²Ó¹;;uN„Y\ò£;cž°­·¯²˜t?íÈâc»Ä W!T9¦‰y‰ÕÌì£û·dF!õ^§ð//8½pÃËTÄ<ᢸêq5ð}ù:mò2¯½¿ÿñ7E^ :Ÿ<جî~MçüãGcaKIš ò:«ÀkR­ÏÒ”âÓ´ÌÑ*ª\,ÅåscŠÏÂÓZªù°í{im£,>¶sòñD‘­‰ìÛwÏêæ9dþÅÞU×ä‘q¬â²\Å¡: ”nXòùÕ@Âv0D£cbô;Z—èùUØ=9uXÑ2¶ÿ(`%ÍÅtUÖDµÂKø1D"Æ‘:öóØWf2’<¢¡Ñ÷ÅÈl&Ò+u™SPÑPÄAÇ‹itrV™ãÜ;&ìžVˆEâ¢z®d9i´w`­³iä+rG æ¯Á’ò#,ð-¡}}Yôæ;j÷q]¥wÓ1³ÜÁr©ΘJé$¨*&(hŠƒèY¿l^:D¨åe¢¨û±˜jç¥""o‹&´Qd?k-ØEñþ×!5Âdß«¹ U;ŽÒ¬<=Æ‘O­êlo÷ÊËÔ2ðí2U³.p Ê0´ÞR„x¡d„KZn¨>²z´'ìXÝÜ ßîùÿ )*+ècCBtz~<ànÇÕ$#×R <’Çuäš³%MUQ¯ØÚôOû¸X*íý~CÎ)Ó$ì$~k[£ C¡ðÒs×ÞÂ[Q0ˆØµ÷µû¾¿ß¿ þQr޽‡ªJõ2ÜÌ@˜íâ|zz)p¥Ž Ž™ªÀ9ú<¾¬š›EÔÐ×Ìç:ØjŠeå´Se_¯—™ÒìèAƒ £°Ïm˜È›vÌ' öoª/‡D‰1á(§|õ£#‡’°¯¸<>Õ׆«£Ïm”š|ûY'Žõ\Ûä<™Ÿ×yb¶\8G€{ï-±0}Ùy4Ñ›u¨c@ Ãx­Èså1Ÿã²[yäœ#f†~ùŒL¤ªk‚—·8NÝ‚§‘QrIÖ@¡gV%‹ÿ\¡sàši>+„}îL<4ðò|gü¶Q*8(7Ä0éh`ÄØl¯ÎHùxõ Ÿµ±2Š‹!œOÎ{mXID€Ç¨2ª‚edÇX%QIß ²ÈI@¾'íXË_ô¿YRšŸ'ÅÆfÇñ‰"ÉQÅp'ax2¹ ‹ý㘩Eùÿˆ±,LæØëŽmÏhN’¬[©Ú’3ÝÍAÎ|Œì¢^%–ÞØåx¸Ã-`é¤pÑ9Ê[/˜Ç‚‘*‚´·½gþ9ëpÍC ÏW …¬%d "Þ;+âi´¥¶šÛÍè« ¹N{]è²ÓŠCgL[}±€h;$ºÉ©³™NÕŽ;ÛG‰1ÉKÉõv¡¿ôpΫ"f¯%Ý{НTº¼OÙöZ6rü¨vX¦±š9tuÒ¨2$PÑhm™Ý½½Qe_°ÞÍ¢þÆjYQöó‰ñŸ«`ìCΗéýùáá·ÁÃx¸fYµÛøÁøPµŠ3‹‹ªq§ÉÜÌñu¥š4þMË §µµRÊ•§z⯣ŠÖ·ßRu/5Yô¿fÁnO°‹Çþ=ÂUM9Ò ÀZ&‡Œ¯Ø¢ÀÔs¯lKS ¿‹)§µyž¶IßÞ£˜Õ=û¬–œ!oðRÌ1!…Wdßòó?ñ²®QÕªÍ 1tÖ‹i…%*ÿ#ðlFßþÊár(òXµæÜú;²Õ*yÍ Ó‰2ΙÝ`Šö8pT“³Û«ª¼Ps󋉧ÂìäOæh;eÞ ¬G¨Iö8Ìp~Âßn²œŽ¼ÍÖ„)*óª<þiÑé¿¿^ñ/ú>ÿ{¼ÿÿúÿ˯æÝåŒÿ=`x~å„nO£¦ò˜¦;%0®ƒ¹8a¤7~‰êq)G¯\TÀe)õѸˆO3;j^ؽ;IAÍ¡àÖF'Ë1“Er:-ÿùf3él Clù·‚uVË:¿¸(#{'¼B2džóØ[|&²DÇ3â‘àú $õEÂ9.üùûÛ%rÆß™âÝÀ¼ ðíî…|Ì׸Î#ŸPW|JtjÔOòS3•nÃèGNæ¬BáÆ]+—ê'PB3T‡¢Odª<ÊÙô1ŸË\âH,blîáÚº|4 ÁÊÞ·hbÚ§Œù[{Xlh ¡ ,S\&3¢—Õ™YvšÁ»es’O'ЇA¢âç­}`Æ®I¡—E—ñ wd*¼Óއ3½Š‘¶*òN맪„¨¯%U„c’ú`"'[\^gÖœ‰3¨FÚuŽºÆéżFó2ÁpèY¸Š<Ô¼t±‡6²”Ï b –™O&ÑÚêäuÓ´xj~쓬o~ŠBðÂINkÙ‡‰L?”·ÆÄŽzJ|ð+÷è‹Â#÷îa×8ÈSµÌ@t'£J‚ Qêí¦ÙZ»v¨ñA͉†ÿ¡Õ®¸Ø,›»Ò•å›á÷á;Ð.±'¼1^ØAyûW~ú³°wåtUKý†ÔxÉLðEã±´Kxt\,~¹"JógPE•±š/+Ÿžs É96‹ÖÃýa~W¡]0·{7\½$½{¤/Œá‚‡‰^»¿BL´{ʪôeîC5õ3èý¾×~ÿãÿøýû÷ûþ:'®<«îµªs Û>~ï°0³°åŒ‘—×®ËEQ8­Š{ÍWïjæèö£ œòFYøoj]s—ˆxô'$F³û¾ õT•®ÕL÷’¼žmú… ñ/¢ÝªþeaÒäŽLqE]+IÊQNÁTEäxí²êêyÑ‘w®Ë ¶R’8Œ¥xŒ´}6UŠŠ™Éˆ ³Ÿ_uRs{z[kÀYIB©c=ý|¶ŽóFŽP`¢ Œ=/VüPâ4L³Aüs…Áà öq÷<ÐO%"7üÌ©‚¢ï÷õî݇tâ¾ú¦¨G¾ä§yÅäT{yüž‘½óùFá Ýßÿçõ úOôLó`g_JnŒ”àëδߖú‰»µÕ×WU¯kòF`Kò_GKÚ1³£çú¾â-¯×+½kaöûî! õô ÏWò8âZ®x¶3ÂŒ à  5ú£ü®,6j½ì u”\çh"w ÎŽßÜÚjÅj&àËŲˆöpÄÏ^¥P…S{‚qL,`ØÌÍ:xšÛTö4~Þe˜®†Ï‚8Íþ·Üsò<·5Iêo^gLYt(WZ…Žc®Sgι×ÿÕ÷ ¾ù¤±N¾3/†öS,d$½\ÆëÌ‘ð²Ré váhf±œ,¬¶ šò@ÿsª5¾×$›8¿|݈Õ&Óš|C¾¹ûåÁ/›Mz$U’¤$"ê.8ä>Oph¨#€çNÒ›:R¾sÎ ª= J»‚ÙÞ)v)Mðò¯5´“F] ‰*T”A7kÃQž¾ú86AФsV$"V§ôûCl«Dëóg3eê—eÕ‘Áìv+cWò¯8»óéÃÿsUíõm“úÉ~öå¯=:¯—ìû¦wî†ÓŠí?©RsÈ£ 6ßhÆÜ.«îªi'2åÿŽãiÑËj²;vǬŒ­[¬˜q¤W¢^‹0Wlœ!Â_ƒÀ2óQ­ïu~æËcG;ýõÌxDÌEj·gU»SBõ,U¯­ÑÄpšX×ÖN62Œ¤Æ1J_~}¼ª$IÞï7š:æ sM{â|‰²m%ÞÁoŠ q–fÎÕ1êD²¤#«¶\=ù`¶HèàQ*ED‡kn=‡G&ÚOÑœò±šÆ=ߘKœmW”WÝÎ2ì~vds›Ã­zJ”iý,\«ê+àñÀ Н ñbžj¿7w?:¶Wôiÿÿ+ÔþW{ÿÿ¢Àäçü“<І§2É;ó»a×J|ü„ÏÚ÷g!é#9„ɹ/³ò¸wSyŸ{Þ*–‘Såæ2؛ӼÏGyWwSÆàj‡ý×'°÷ÈMNoThŠÓZRØ¡…al'F"ç}a›¹q–„¨nkÿ䥗ÐoÃñ6<±„X/X_¦ò«Ò·¢Ÿzö1ëû›–÷ ÄfŒÈ ÄaÜ%7ÚR9­Ñ{CÕÊ%ˆ¿ùhйi>(:eemIýq³M3z±}:mÀéÐøø+_VÚg}n—!»ÊTm‡'§ sÐ_û¤zå2$δ07 þÐSÀ¤+çºVN¿‹íÚ4öñ[_·Áæ&©ãäó4îtÓ©+ g‘ÏÇØÚU%]"ìO#Æïìô$rZË1RM"#`ƒiB¡xyïJpÄûFØ<)æ¯zI•BÆòZŸÝ†Mù1¼”Q-å‘—§Éx,¬Äh­"ÍÑ?Üõk¨ýê’¹€>–¨R.ŸzøÄ‡^Pˆy˨9 ®6N°¸r|¿äÈcÀ¹³x£·J½Vrma£†¥šNGÀ&¸P¼^—-SoñäTìÄ£ª´´äÇ>èhÁÌâ2^ã:Eyb¦!Àæ­T³‚§r/Ð#–Ó³óë¥#´Yœ Û ›H ñbußUNæzØgnGm¯È8ÉH=Îß&EÓÚ™bÌ0¬Ö·u ž?éNtäjC íÎÇë×V#1’÷-À9/^^þ¾ÆãZÉ—ˆ¡wÂݲf…íÇF»ŠÀk&xå¾ïû}}\`jÞLàíiaŽÝE³þGK½»´€ŒWñ5è`—ïì¾ï5S}¡ fvßvŽÊ‰™Ñu!iÃÚcú;ãO㲩3‹ª}™먚PU¯¼kÒ\žç{ß%?É*UýÀqÓÉ·­æ¸:–,tŽž=Õ°pXÖµžDgÝ bñŽMœÁÆ2žSIy{*„.¹¼ôuN]ÙE¾„ɹÞV|b*º‘½ûàS˜¿ ®±Gk@bR«6½^? ¼Qzì^ëw›:­5«øOšƒ)¿„¢ò¶ .}æ¶Üì« ¯ÙÃÐ0’\ŒDzƒVäÉoö'¯Àé§Ìƒü[³œ{Ì™T\æî4ÿ¶B‡Râñ9ðª|àªuóJO^‚ß!¸‘r¼c‰ç,Þ™K„ƒreH¦?²ôIÉ`¹èñˆT”5àÔê—ÊŸ‰ùm£ßÚ­]‹ÎÓ<¾p¡î…ÛÄÁÎkrŠ\k¢CGx-š±BG[u~(êLãµNj”‡·MË\è ­íS_ÉH_K2ØÌÁúÏ£ÝrcæÒüð>^“ÑÐÖ0vºîìWxƒ:-žî³å+ZÐП£ƒiþ ¦5¶¦[{ü;õJ'è%MFA±ünVyŽÙª+Ô{«+ Ù¸Z¢ÊÃþ“qu¾nßJxǃo’ f•y£¼òÕY.LœƒBˆ(tLËkÖåê5+¼Ow|Áè};8RÁò¨ÆÜz­U½Â¡²(ئ¤Ý ¶/Û”Kx5Öq«¬ùCÂ(ó6"9W&†¹k5ò±a" ‹å<TMJ¾Ù?Ùu›;› ‚n mSoìÖðƒ¦þoªNüññabàŸ*B T(ÿLÞ"'Ç&ÿm·¾¼¼¥yÄ žn™j0åp­šLÛ;86‰áÀBL º*¬ÈM½íéq©¦ú¬gq«É Ôl,uÖeì%uQ°Þ©ÖÊgcî’¾ûhúͽôðºq?jFmï'¬=fVáSÎ aÒzVÙÁ²<~iýd'Ý×9õ €øÿ:¿þñß…oÚDÌt|+öÀÔ4‰S¿‹,“V1œ!?’Pãlû=Góðéæœæöͬ‰¼3´¤÷öU†wBƒÑ<^VÇŒ!å²í˜n!ÔµÝ\y2Ç„¥ÄË e¯«¤ØéÓþ?Þ°ýTΰVÅ>C•YoM/ +2ø×¨ÿÿu²?~ˆþ›êÿ‡Ñný)äѳ•ùn.Llæª=Ûš]3Þ\'®ç%!½ú奊ùr*4ŒºI©Þ¦œæ©•”ÁµMDø&é ˆö`MŠZ7§hßZ¢*ϼAX <)Ú ëÇ.Kf›–À7ô š©ˆ+ Q‚â{ãô(Šâ‡ÑN‡ºzù¿ »Èôz,¡ÿ‹µK›³ö‰oüû–sH96ðÞÖþ´œì†1s]Ê·i»«óçœÇ"Nu¸÷’v¯7= ƒ\)ãRrŒåL²?v@ š|ÌJ\sk~6¬mªðªhþ¾¥`Ð{M §„$•0äÄêxÕGP÷L…J+PªŸÞýê¾×ÎÑá)Œ³½ˆšš[ÌÕ"Âè´oAÜ‚‘=!>¡Vh¸©ƒJQ5ĨR$»e‰)˜š¬t1„ð½ù°è®rÁŸí"/á<’ʨóœÈ ³¦Ð#EµsTgáh{Û,#F En.‚,ê(¬z¹¿Ÿ–¡>w¡¨*Ò‡· ¯­5±7W¤ø¬å#Õajè”Å/Â蛬e`ÜëBºÙ<êWLŒcœ3|û•gÙVEc/”»‰WeCnS“,m …­ÕN¬P·‘Jß‘Ÿ‹ ;í¾Â—êIGMºeÛ›!Pà@å¨Ýõyo ÌÉ'4®õvŠh*±›}ÊhÓg)*ÃWþ*¹Zy\áƒsð¶ps癓ջ3Þ wÄ9?`ÚÐ(’ï·I¤:Ü/c.‡áßLfgâ¿–Op°$ا×àr^çíÏAòɼ¯¥WÚF»§¥½¦˜.†¹}Ú³U‘’Dé­!—šqämM ÄKÜñ6{ßhäM-¼×~¿‹üêzNR}tLJ{HqÉæ›&³Á|èŸß ¸P—©äY&싘ú¸ãœƒÎD{g'3ãâW2Âõº_36é¬û;ÞO¸Ê¨¿Û¾R!1moÏ$) ²¼æÚ˜Ýh@2µµ" ª8ê%#zŽ nw%SBäȉɹۣ¯¼2‰2lEþAûå"J¿X¸ïo›I “²„sôð[ úœ´7, ÿÅýºŠË`Z¬& Þr²â$6Põpˆ¡ƒ¢3më>,ÔLe˜´ {`f÷¾£·ÝóhgaAäèùô*<ÈH[ó舡ßרfIçï|¿Ã€ŽP Ý²9•d.{ŸËöa0S{ûldõ”d$Æ*ä°:Oº9 I¦óWÚÃV·å©å€Ë1¿å–}̯Ö̤Cþ¥xô‡ãŒ4Œ°UJ¾É‹"pÇW±’¬&&í¹=žöˆ)„Æ ˜HLÇ~¬öÆÇ HvyCÕ­{²D5üþÌ%K£×qû¨ïK“äÕW^&ÏfåF¶\E犤bæÒ¦]}µSßÍÞ‡%mªmÞä),LNsÞ‰ 1¨ô­WmõæyœéòŒáþáqdP¨Â¶-G»¼ç#ÍÈçDùQ­ûQs7Ö©0Œ´óÜ0»V%7¹.“Íšgß¿1ãÉÙ» Åš› «°½~#AV&2ìG_ý¿™@Oþ[jãŸ(Û60ëO_#? £|8¾Öo·Š4÷ìXív;»ÒÌÙ=-ÊbdËPÄÒÝEŸb+ªi¬%D¥z\© iÔ’±³PÓmèÇ\»*e|¯¸Óuøüˆ§‘“Ýè[$ ¯õÃeðxüÙ4í|À6Ræså‹ó2<ÊMƒ"¾[³÷Û"8¿~½j$ç_ ¯¯r­LyÚÓ]-ƒ¬SihWbñ“FYy2'ŸÂÑ+̚׃<Ÿ´¹ÐXÔä}.êl„˜d”\aZ×Ù ™w/¸¼ÛO·jeuÀbâÕ°ªmÞ˜½=_©^Ò}ÉÈ1ÉŽk³'F}I/â[>³ÆÝ$HÀ®þü× 𗬾Ÿ@-|Wÿ—SßÂد »aò¼´VU’LÔ\mÃã2PÎñ%Z¨ •5L×DÀ$£@{JÅ‘#´z®RIJkXæÅ;ç„§6ê´œŸlu¿U¡².§;5Sö Ý¿d?š|ü(èØzÝ窞Êòê¬ObfOVb§mQÔ´Ÿ44^5 àû@ˆ3—û qLOÁ}µp?•ÿ~ }¶L Þü"W}=O_N½DÅ´á‡Õag_d|áFCJÁQVS^»­I~9L|ÿÀÚ”f|ê•pÇZ¿²G ±#ð[Ç‚`áM" uV*#~f´—¾òááY"¿'&.BbÎ AøªŒ£PtØù͌׭¸5dq—(ÔpG ¹Ÿ(3IÏJÌC5ÇÝÐeDùÇæÐÿˆsf“†Ÿ¬†"ÛjasÔ· fý2«þ!_ñA?+íóÈѹ˾ K±<ÄÑï`uˆ¬Df.¢—vDkPRqh»€©Ë¢.€4\åQþÒ·…ÏH£tq®ê竨×â¦æ0P[•òÍÛÍ„ùy €ÓïWL+[4Þ²é¡ ?7f ¼…Ò(‡Z-™n×·Õ÷5ƒô) ªO*¼þœNýD[×´x’)» å­]L¼F®$¬™‰iûѼÍòõy÷t‚ €¤‰Øp( Sà 2–ôHánU ®OCȧ7 =1×ÞF(_†ÀÂX''i¹ý6RDiŒqWf_!Æëbڥؑ¤-QL!Þ›rTï}3"ÿzTƈ­«^³ÏÛÝ„IQ‘ƒ—s{}ÁÕ$òçQçà\hÇÁ²JÄ5‘W­Œ8 Œ´"–’ÎOEŠfW(rí>/zˆPÞ´÷}ß·oÈKPEýUÇæ,È/;3~[ï=g £ EÍ×=ÕµªAÌê•Ç©™™›#ñÍØ--Ω»Éï¡é‹~^+5Š4{›Wæèñ”I Wõ8‹4j˜VA‹x¾=¯×y5R< =¨áÇè³…³¤ÆùLÏŒb¼ ÀìX}Ë * Ó˧Óí_ IDATž¤’á|Šî‹Ó#ù´B*uuBšeˆ&EË7.káïß~Ý]“?3FÅC÷&ýV?¸S•Μ@^fw† ¿ì@WW>Ôz4aQ¼\=•Ž4¼Ë”<Ä÷Ç/¤Ê3a‚Ë™±-¦""*ˆ.B1mâ„‘ån¾vdP̾&#~Àû뙂æÁ9ü³Í;:žàþvGÈ’2Æ?놌örü˜ Þ¨LÝmÊ-fš]NFš˜@ 7님˜!G/(¤$1=¬ú‹( š*„¬ÉÖgtéc¤ƒÁZ\k¹›¨¯B£}u70ÞÛ=mK´x„•ò¿){§ÞÿÈMÆÐ×é0£ËI¤ú¬®ý\^ûjN=¾gÄ´(´àÚÌ{ة疒ãpÍV&;7ÊD5¢dãÔ¹Çñ|Öa¥œ5D½ÞӺߚiv—(üñà ëF¸Ð‡òSȬ.Kð]ìÊuŠpÉ–W~ì"ÏeÑ¡[ªæ@uz}Xá²’•S†UÛý£h—s8f Âë.íÆîù+åjy§gù{#\; (DÜ?¢=,ñÅÛÚV9È9ŸiŸø;K»K;9ô“ñÔ%¦vûçL¿.ðãrùb¤èª4váÇÜ‚óúø”&æ~z÷Wó›0ñòKLÆ0³¥vN2ÂÜ$4SI¶ãGo¬Bê)0f?TqÃPl<ãléh?xÝÒî.cõ³Ïª~skkÆÓ\wº·¢˜| ŠtOcºÑFjª·2"P1VÑv2ãzüÉûÛ%Ynci ÔÒÜÿÕ±>?âÈìEí—Üv8šÌ$-öê®®ÊDîãe.П°—*\µ_ñyØÿþ·ÐÏŠmÁêl“Ÿ<Ö[&ØÅ¢UƒmÌ@Ч€ƒœ¬ˆGÀâf®z“lÏã¼GƒJ_nùƒªC°¶>„.$y9ù™}CãtÄ’^ÆC^q¹‡]]°SU]Â˧m<ë<ÅzÖðں婆Y]=6dQÃKUàP[p\¯—É_ëù§ðÿGïÿòGß·Ç„ï?\#‡ì|¨ÿ8DɺŽãîØÕ—!õx*]ØŸÊðÎqò*ª$”æå.rO{=A@uÏßññúIO'!k \qj;ÜBˆ÷rcýêœZ¿˜Ïa>‚²ÎÇÃU#šã•jý:vòFÓä„4¢Ækz\½=ý,‰#lŽÔ2€ÈÆ£s].D×ÔùÏxà ˜ë¿”ê™íïwglüðŸÕòD£èx#Ö ÏþÏSÎ8úÆ“ÌLx6 'ü€’Ì¢ çxs¢]žý:^ÐQœg%œÕsˆ³Âh=L§•íù »ÄP¯†^X¼RÓLTcJF(°÷¦™. pœe©†ð8­¤&_dÖŠÖ? -ÈKsøÝgTf)qŸîSãao‹ç;~q¾¤#dËG“óh6‚êÛÔ>Ž3™ )þB&Æv(âã°ø¿õn*e—m´>¨MË-eWÁùÙÇéÆ/«öNãaQ³§pûeÕœ(á[ü¿>Ë ûèISšx:BFÌ_vœ6i&6¼ª]oæoÕRƒ:‚E°¹cT“wtïKÆV+æ{œy«?6 ?Ƶ”4 ØÅ#̱?³æhÞ,æãh><-ã6 ¤ÁÒ¥ [q©{òSdž‰0 O4²\›¸2y|îö›’E¡l!‰U#½pÍl“ýݪk£Ò€Р9Å'9)~³©&× ÂdŠ¥~üv®}ŽXd·M¶Ë©’‰ú)±ú³Pá7+@LŒ›"ÈÒ05Aôùuª*´šm³I^)ó¡Bׯiä¯}nÌBÄshRº~5?äƒk ëEnAõ¤üúðgÛŽ"8_¸E¨¶mÛw ÉÍËw©ª(0C—™(t¥ÂvU WÁå§âb€s9¬xߎÈÜ8¥?Cÿ¥Zøˆ:?Ü iü»”Òwà%ß÷ñnõÂ`ëv5óÐ1iÉ¡DˆŠ.G}K±.ë¦Nqú8!е"Wö¹ÛÝ­ke„gÙ?r¸kžóìŽ!µ}Ó¥=u9ÄQ6Þ>ÃÓuñr€)³K¾½)“yå6FÞsºþöOÑíc<Ôˆò¾’{û˜U‡[Άçjsµ^³›Á)Ó>yi¦CbÒ¥t5T?k·öªïhäŒkü‰ÑÊòíŠïÀÚB³.ߤkLÏ5™@2R eÒÌ5Ù…„VKU‡oclìÖx£2DL!õ¥/÷òÒw@n4 p:þdìÛ8”t4ˆË)=*S:mCiÄDYFð š©*Uœu™Òˆà˜ˆ’>F+£I⇇C»ŠFwõ3 ÿ*ö7‹lrXXUÝxŽ ÌÄÃXÍ`¼pV)\¼ñ« —L}hL‡Ø‹q¨RŒ†š1O8C½U1êüÖÏÂ@¸ºqËÌ—æ’¶sJ«ùØÎöìº}ãc{¦x9|Ñð—3iiìy¶«þ‡êÿm'æã{Õêoóö=Þ“ùAt|~Œ!f™é`FIç«C·\ú³Z¸öµ•dÕÛ°ñA2Åiå[2iò½O1N/jvYÝøÕõ1*ÿšhG7ø–IS“ËSÚy­xÛA󉉓í7¶~–FS¯Ž„¾Ø5j–xZ€€l—¾£ n1? «aTûÉ=š‡^¼¨ÿ ü矤þÿ ­¿¿±ÿ?ðü»ï÷ù“È[e€ òÎû{.½ì õQ5R[ÒAÞFÄâùΚIÍ]+‡Ô¯8`ÙeI•ªÖ°*;8Ä‘ÌQÃ8^ÉM½!ÇÐ<Õ°*Û•k³¡¨Ð¬XBºå¨n”8¶q´s C£ˆç 5ag÷ƒ.!u2¶>2÷¼á"ç'*wªv>@Ï¡è£Øß}þö¨ú_3 +QLP‰Y0I|-$ÀãíW»oƒ?^ïàröµ1ëä<ÊûAúwk_œô™Ž˜*ºt–ˆÞé,ÁÜãôŸÆ¬bP¨ƒ«ªÖ gá}¾ –þ¸J„*ˆZ1Ì&Gõ½ ÃÒTÍ{»Í"åPèŠQ––¿?…¨ì.óä*]”,îI¯MNúg=?1^¦õ·J&òù9Gd7>Úò]ô‘cçÂ7»îÁ`ÞD•@n—i‚kŠ’\#ÙÛˬeHänwvÛ«s&ç¿÷+‘+ãU–¨ÙóZu2K m…É|”µÂؤà2£7–4·P‚PÊÞ¶)þg\ªF7ãì[âtïÄw.6½ÀžZ D¡ØþW¼éÉÄ5-!>"K‡À=–?­oÌsÉ'™°ý£¾±¶K¾S7š4R´ KõŽÆQF[Ö;wÌ“d†çD–*×ò ƒˆìm ²G²¤3öÀ‘ÎSXÕVáœ8„‘ÀXìi¥±ß83[T“³Á-Ý¥ûýa¶`ÎR¿Ú=qi1jr»x"£UDöŽMÉZ+-{áv…öóPhÀò¥B‹ó!bûû5îý…ýóžuñä×çcΓ2~÷·,šuаzϽ[#ëg›&»ÜÓòêv¦ìï×O, «æL9 êMÃWäø€"ÈX Xb"£=f®À=Ø;[ ׿¦ ÝV{Óÿky#€ÐÛ²SèÁ¹‘DÐ× ‰Ï`w¨ª’¯sxGâÂt½·:­è^^°¼L)JsÕó2G¬cw°Ê¶­U!U7€4ê~Î¥<~¢21Q¿\hŒ”ë>ÁËÖÛ̹1¼}Í#7VŽ×'žáxÊÎ@"&ð8:UøéJãO=Cº›Œ•Ä·„ŽG²áèëjš€ËðS½PÌÌåû£ÄˆÔ¹GÓvÖRW–6¸FO8á|ÁÎ÷3 ï¶”¿¾¸@K!TD˽ûj\¢Wˆ!’/¥¹cŒLIì½×R‰ÁdÔûõl¼4/Õ0• 0B€B™ ?x=L9:YäÔ Ïc<Ê“….+–jzŠ "\bûëUùI/?†Øî•1É ¶¹Y6mDÇZP¤›}!ÏkC5‚§(7ÌD5:Šmo¬•ƒ+Ž´¦œÌ ²îbt_ qõ ¤²[¯OG8y0»à†Ó.#+çIÎwÛ–¡8ºÎï⇴–Ä|¨¸Ð}Ææuì¦ú?<Ÿ¯jD¬n6ù:EW–@Ívfç¡Pã–£>àrÖÿ¤Çô¸4µ,GNE @=ë·óÔf\Ò¬ŠƒË‚ËTà…< D¿­Fõ.¦øÖÞzð÷òØ_õðñ@ çâ¬ï8–&deÛýW¾ÌMD·òˆë ñÄYðŽªå(A 'ýÇš†ŸsŸ­6å×®U µ3œ†g™h÷£ŒÁÝúÅ9Q¡»ó1;·GOÇñî¢pîáÆ>!5Ï1 hÊ)†ä?2ÿ ®^³3iÈÙw–ù ¼—YÂ3Â:GeeªÛñˆ1ˆ%-—Âͽ}˜ ï«Kët–N¢|¹úxëÐGŽ£xfc@ÁÇ å×°OÈ#7mæ xÌçÒF‹¹O²C·ªÒÛ§aÕÇ%W#Ø8Í0Œf(÷èú«A( `NúuÌ*(À4œÙ©.Âyj— Í^ä°•˜ð˜%Ý‘rƒ~Òá{_`®ÔÜÓ2ü¸rÖ|—»f¶>övÕpHŠsÏstÿNîß¿{øG[I9¸x åvi¨i„º_ÜpO£Ód"·§¹ä±,~HEuølÄÐ rO'ç?QÒ뙺ZÓüÞ€u–d[šÃÐù÷)Õ˜œrËý»W”­œøB9Ý<{’âøóÓW3Ž‚¯ôè†s|© Û¹7µ dæ™ÓíÞ§ê"´wc®µÂj`›òŸŒŽ./‡²øY±‚&›¾Žýé(âthSÇãÉ˜ã’ø:…‚ñGòåL` ¶7Î1îž MnPô×b‡¤kùjÕ“ïl~râ¿;Àiôø±’Çæ йí;EQÒ*í™ÊÊKÛÌ6·Á[{Gè·À¢˜!†KN_"cŽ>±–|w×Íl›Aáz¿f³¡FNŠÍýö$.Ú¬Û±þ2š‰ŽVéüj[‡”2“0B1êÂHæ’=öËoÓDô³>‹£b$fFœ‰Ú»D¥¥J†yÝ„|mÞJ{wCõ#µäCèŠuqpD|/îˆ"pQy²EL¾ ×È12tØxàćw8ãjNÅG5hv‡t^zî-æÃ«FëÀð(«Èjº·ÉÞÙƒK.U(öö‚Âo*GåÝÛ¶@dïïWU_qù\G± ë³È_ÿY¨àŒ÷…ÎD<ÜLŸÔÑêÝ$6ui¸d´cÙ]ª¤lÛ΄%©=X¾a7ˆGê}»0\õÀø„ìmeÏ÷I§ ¬màîôÖ²k¨èZ룪Šï¶?ì8Ù1ùîUMUEËÕXaÎ$¦c*ËGNŽ‚Pûm[(ªË O`B¥‚Ÿµ\º22ƒ@˜Ïh®µÍá•Ñ3Û)½þ›0`©˜ËZ™ljóŠ+P/ºÄ¿[!å4ád—OãYµž¦ÛevEßúõ\Ïkš'%á“"Xý³,ôŸ>$_œ×Õþ…‚[V0ä-Ïþç‡Ñþ¾¥ÐÿúžQ…Q* ÿÁ¹ÕP¯Ñ…™™¥ÔS¨g +çG]¶ˆW Fæ@#À¯U^g÷«Âéà6«’ÌT±Í>ɘh3uŒ“\¸Œ¡ÂµÉCNÿQ3’fדê]4(  ª-®õ¬Ásý¬Âî2©°ÊoJÅL5 ¯æ.#Ó,j͆¬B½I)¨ß©Yy?€…÷  -Y™>,»Am-OÆlZZK¯’­HÙŽºûà$øïkÖÑÌaµÑ7")ÛFGÖ#9P ½Û¶š×ýnñ€tÆbŽ$ƾ¬ýV¨PËŠ '’‘(JeUð´è3“#?”ß»úñ J?¤ "°³Û.šyJKR…Ï£„O‚ö¦ª·.ùü2þv?ûkÒΞá“Fž·ã! Æ]sˆÒ/N¥Å•a•\JÍbœšæý§^ÕÑ~~/ÈäŸÏñ×µ¨‰yNN~ØnUõ!ȭ挑€\ pÅç kˆÇ˜ªû30„F­xŒ?c:1ÜýµE¸Á’ÑBÓ*4’qóY )Bƒ&ö=ö‚XmÊA_=Oöúès>ö´²ÔÜœ÷7;/OŸ'ûÜŸýüñóǃøýêx™ `“BÎp1ΗMË™Ÿz9j çe†%bZ¿ES‹²…ˆˆQyäÉ£µú*>…¯ÙÒÒJ‰VÝÒë6ƒHöìcªø†Œ®'-©O£ôÔ<(ö+O_e6ù9«aœ/‰[+°ÕYÓÿј4è eÉ®»:]Œ»Ñ2LHà ?‡×÷[õ$“â•òÿ÷ÿþ³†ÿ{Þÿ÷/x¨ÿ¿¥¯ƒ<^/úf›Çá'Êpr¤£ÅBŸŸ¨œÈê!CŽK²°CZ¦×P,,ÍÙH2~=ûÂ/¦µHäk6Á¸ó^{ é­Py¤ê¢¬h% G©È' fE%Êë[N?¦f0&öø+öZ‡å-f(ÇXe:³q7¯O+y^j…ûžÚí9¨`m?˜ù¿0ÁúxkîÑ>·ôˆÀœƒ*3[Àxã!ŠÈro ëû\^±¥À¾ZÑxÖ!ݲŽhÂYKÉQo«nÙj5v‹«›¾”=«¯ÒFݽf–_ÏÓ¬äíZà(´s—‰F±®;|´`š Efº³¥t-޶˜×œn ‹ ¼u05”î]«×P‚ÏYtù¯ãØ€ÚÐ8ú¯N™fé®3ªæ)×ÂÅÞƒýîAä_ÅHŸ'b¢Z”Éë]ɂߜ.,P„NÅÈ/r‹¬$AЧ“4Š“t \(„åyκp®âò£lÐSëyÔÿZv²Ô¯%"ò¥í2çRGí|nàLÚ¸Vê¿bØëÍañ²ÀlŒ`Lšíº‡ÎŒKFqÌ+ÞSéÁmŠý·ü VòÜPm“"ºáÅ žCˆwz¶áŒ&XóÀcν+Ša1I‰ç„µÀotbÇölÛ¶Ab­Ï ý$&ݳnc@æ3ßßÆå«ŠEÑ1Z5gˆìtà¢ë³ü1œÛ\‰,%ïÐ+f• ªVÃcÁTýñƬÐ^š Ôb¤da½wÃ;„*ñ"·y«°ª}—B©/Vßï·$ì¯QÿøƒAüñK]YŸõ/Ê”½·— 'Ä2)<´À ÈãÍæ}NZ^Ãé«I!Ò½ÿÕSâTþÏP4äÚ4/[’ûÁÉG™Çáê!ÎoâKù÷›Ú1½ÎÃÏRˆÉ6¦Y1Íw~o]&ëßÅeè^í≠‡jvÀ$’†úšª§‰È–µô£ )ëù’ƒyÁ8·X ðÛ{™ï¶ÄyíˆäMG‚@b’TÆèä5° å¾÷Úi4PwóÞì€ì)5{>¸SLâ¬ömªË„–´sþ-G˜QE’>Qm8ïsˆ”õùÅ¢ßeî9^ÃìÍù1×8¸Oµ*þa.Ô‰\,øt•Î(4oßÿø«W=¤yŽLý9ûí2Ÿ/¬…˜ù‹T•–j=³Í³}4‘AÜdV4‰‚\Þ6£èYhÑÿ}kµ$—FÄ¡R çî®ì‰~J°¼ºå ŽQCVnTú¬²o§$ÖU„§%œO&YsŸìÓö–\&´ÑŒqQÑ¢Û³Ûìd” 0I‚È—U£âY”Ò'›sКQû¯|Ûb½þ+ôF| ¦|ŠäË0†,›QqÑ’¨ò‚Ñ9çkÓÏq¡Ù¡£ÿhCwsFG~ñ‰~:U¡w* ÕÏ€¹+^Êûî¥ly¦PÍwñbä]ì .šh1͈IƒªóAî«·¡Êš‰ÑôÓ±kÚ¥Ö ®P¨ùö–Lo3ÑÎm˜ m÷éàm¶œ—§{Ëç!æ°„/¥!–.öœ^œƒnIš˜&0“¾ —ÏÙŽÿ®îíGsÀ®ãœluþ§jû•,€~cßÿ?4ò͘BƾÑÚ¡pÿœæ’oWùHôÄ^Ê%oœÜ¶§wå)ñ“±Tú©2¡&uhå * u‰QèJj=žÆ3^ÅD[EµW¦ªò$”Û½í õ଱ìXPìK€Ëu[f\TkàEU<&OC’u§LŒl/­ÿ]BÄsPÀŸ…H<„N>£©,æ}J9æãñt—Ãw.›@ îߦº~ˆ^ù’Ñl|Þù³êl.ø£ùð%2%§:òÒô¶‘ç.omC–ôÉ—=†’ãÆâÈ å­.½r8ãý!ŽL ÏnëÒïYòY9»1^ÇLò<} ßn¹s+ y{×d–-óÞ|ÊßZü+ÿ(øÏÿ’úÇx’ÞòèKàçI FcMè䇂áiÂø¡*¶Ô½ «â“ªÓÛ  Aú5ijGïåÌ;«ÎÂ/jOf/µ˜„ÅŠ‚$¢¢ãª³úÀ,µóCg’ˆæBYˆ6ªyªχ«±ÖwY!€Ö™ ¨#`!ä^hs¬½{@l¹x«Gó#2‹ÕÍn?ÿÿK*bÑêTŒk›U³Žoš-egFyeu&s4â` k)Ö)f¢ súl3÷Hº,ÞJ‘@hPܺ˜†×,íØçèBÎ…þƒ'¼áAöNM°tAÅÂÿkwÅ2蕨½çˆC¼ùÀÉ©ú‹XŸå•¡[áÙ‹ÆÆÃ5Øë%e)ØjkÐgf–Ï<;l¨cScqŸs­¥K÷¶-_oBnLOš̰ AÈUêxF»J5KéÊiY>gªº:‰Ñľf߯ñQZìA4­ +pm’íwuœtk¾è%Ä…'WDäû5tXˆ&uäúµ|=HSŒ>r1_bÛÓ1ô{s-µ¬;ve<{CÊoêJ½í8Õ[¸Uˆ ¹¨*¬Ø”±I`— ÅM£éÚ7гÛtÇÇN-j´1†ÜýØx»‰àõ©U¯o3‘Ž#Œ*ÃVÖûÚóüŠ(M@-•­j™àw²Á ;–íC×ðøåÚtwâ‰úzÉKùݯç¨c³ñú"­±¨Ê(”R.ÝuÂmíá³tÇDÉoÞ5¶“~â;‡ªq”^]lIzqÓ÷¦óI²T³-F Dðv¬ÌÀ·žŸZ‹z¶V»…àæŽ*I$jfA2§-´€‘ôž29d–³zˆFÒÓ€A²‘Ñ›ÏÓ°*e ÎÝH³¿ÐÝ qªÿ™ç@‰AUE (ç /½Í‘N‹z>L_ͰßÔÍhŒQ¯Ö;[=2P¡'™†Iµ3í·¹Ÿ˜[`2µWÏ[ù3¦vÅÛ»<Ó%)±6Ó!Ï&\ñxõôKD>úu·È€šÁOGtdö!¤wHdÚÆÚͳ*3ié_dkW7du‘2Y žã“Ñx˜*ª4ó²Ý¨{œr²Pn:u7DMdõð*ÃÛd›ÐYÈšø!áౚ&=¨=NGrþíjÿvÏF{ ðÐx¯tZA"ßµ„kƒgm‘mŽ–fAÕdÿ:âMjR”´6Ún²VdLuk¶³ÜètŽ™øxWQ­ìù`ЭԷW¨±îúÈœ™‡/ö°ðQf…ûáªÖ)µshx¯öi<Ö·Ÿ·•S«ÆÜáðRÐ{º°DoŸû`Ò_êõ}[W9°ö é¸xgy b@Mþ.Ùþê³GvöC‰s{_ åð²sŒ:Í&Y“F|ÌÏ20ÆœÇ IDATw–ÚQfײկ„c˜~húsz)1¯Ñ ç‚2ÀZÌ’u´XªFЩ¬£Wyü§ÂÓCÅGŽèyõóÄ9“}Yñò»Ü“€¿°âýOýëÿ¾èíw; Þ ¯¿ÆÜ¥œÅè?þÕ+QÕy& æq Kñ ‘„CG³ ˆ!‰´Š ¯Ž˜A娴km™¼,ßG„šùøŽ~¿ÜC.1æ>÷뜖ô\Qô]¨¬¸Íü.ÕÞ‚šO¦y#„"aÄ­ÿû)i¾ýÔ‰ëa—Û?µç±~û˜p®ïw¿ÎsCñ_5 øÌÉÍöÞ穃xL"‘næ:ê÷k0H^¡PCT93Üy< þËóÎô©¡’£e™«(ítÄÔéÇá*ÂÀtŒ)DçrB‡ÚôdÌÃM\ Ö„Ù.r«ÑH0ôÍB¸ $¼ÉÏ̇-ßäú[ÀDóö¢ÑÔ'ÙþV(vX¾a›Wœî°†z!£ö‰]ß{ ýìÝ‘¹c‹PÁùpÒ)Tk×á>,–v,È%ŽY8WvÇn<Ž=¼’‡µ,ÀB×A±2Ýè”3)[œ¾±>Ë/Ž%°x×tƈ›Añ“÷Â’HZ 0‹P]¾Jb¨«’4®Ïz<›™FCscÍGóž£}#HÜÝ Y$èÇ s"¯ûÝm@)ê>Ðôìö|KäQ%ÆtåûçY­2͵Û}‚8rË· ˆfÜj÷Šû8ßÏ%¤mê:m1ñf;&Øu# Òô.´¨Ÿù³ÙH*f½}c j«ßÔJ¥]4Åø;m9c½?Ûé::J> )Z·9;+í¤¥j«à1ÔI àèŽjR´«Q •–¸íê¼;Atw,$Ì\^uNˆìò‹Wà§"È’ZÀÛÔe›)ðÝ6¥Q¦cŒÁZæ¢ö΀W/˳×9èY¾ëè$ iØ£­g K!¢-Ûo&aÃQ¸Õq#(ýÁÞòhPJ7ÈO¶Åèšv 7ÖZ"òõVá\ù*wŠÙ6ÁĨ ø~¿žðömTØ&x ¶½WŒè‰²ÿo–Ù‚Õ‘ùëM··åmÚbIÛ1Úus¶#wÄ{aÂÁåt QEÍM¶bùucv⨢,#íªêïd\U9Ùåxœ.¨%ú£—êRA^玖—Á½O•ðeøþ4Ì3TñúuUD„?9Í'fýéÐÿM“Ðh³‰ ËŒ;|àl†µ¥szw£ÀVxŒ…â€4 !€èH——­é¹o;%/ß™$ÿÜw±¹š®WÕpMãÑÜ+»x¨<ï¬Êþ ¤PVYB¿H ùðk:„‚k%1I,‚Fäâ}Mþ˜Ëè`ù¦c47½üs<@)Â.Î;:6ÙïæH_øËë¢Ý[1ŽH ›Ëp1PÑÜ dVÌA ÃS°ÜUÅí‰å ÇE±ÖðfÓ¦htÍ̶®•n[Ԧуü‘§óÀãwÎ&t¼iFN:–—7e°dÇ‹}Îo6MÆè^å¼ìÀó]&Å¿Ùýú·Ööì-}´­Æ5‘¾ÖMEIÐ$‹D^=Àìoœ!”X|?¿+˜Äé°Šõý¨ôƈ¥œ¿$Ns*¦Ç4ÓÅ·ŽëµÒþ3´²MùÌ(̲®‰GGì+–ïº *‡»Ú÷¡¿â8BâÒ¿@}æBqMVÞú(Èöó°OÍ Æ=ià=§'D ß&Z>Cðê‘âÀZŸ«ó\[À‹ãʥ̦³·iÇñÖám£ÆÚRü£oÎ};®!ã× «ÂGηNU9x=P"Ëî^£`_¹%Ï+VÛ-­g â”þFÛÄÆ®$ÊX²wìE/¼ÄŠvUßÎb¾^M8yűø—ÿdï¿üo¨ÿAŒà1Àë×àÌ‚È[–`œŒylö á^qô†ù÷ËÑõ»_Ò¬«I¼OrÙ_018ÑM—‰­>‹cÒç›:èÜ9¶—âIïúª8ÎD?â¬Á¸ã&d±NõØXæäò7ÄVªc L–{ÇwŽÚ]Œoά?éw7ÅœUÙ¹ ~9ä½Ä·ê®}—÷çîèèóy{2ýWå>#ñßçÆZo=q¼Íú Õ)‚Ý%!éÂ@1;ðT‡\~ÅZE~ï¼{vLÊ}(1 9ÇTÏlfeº_4Ðó}öÈ] ãÐYÍq@ÌÃÒÑã³=Z¹®œþ‚´$Y”´Ò¹t+ï8嚤üãgwbJ ÇñÉŒÂï’Oèí ,òË­à(ONô°  ¦‰Ç2‡“ÚzqG5Æ6+3aâo P;6eø3xªÜ›?ö^¢cÇiU«ýz€¬Õã6‹žãöš‰bA¡ªK ÿ“ìX2 P9µÆà;CE>¡-ÃC½xŸ¤¿ª ýèïøAȘʵÏÅgñ «Ò:Ž5º™=ò'mç$Œ·˜uzæ1•h^\žC…ñhs/DX$Þ´ÝkŠ´}÷RÆw‡à»Õ Ó—ÒÊ‹\Áû?eò½èÛ=aãH¼Î°;ñY,9=6I!„ýnF÷çç`2ÐÍŠ.‹Ò7á4芽S§OªÆZýÏK Ôĺ¡ö1³lóŵó•â¡´ŒÒC^WÀHE[<$—Ü1:(—±jYløp͊ƪ8I•ª>÷@@úC˜ð¿+Ðä‘öQU¢ïz—NÐsPt'mæ˜'äßJ–Ko£HŸóœ–²`º‹]z*PJAÿiV«a\–£u®¾§A5›¨qùþêl–oNÛ Ã¬/ ñx/£v¦6rÉ­8£@‹™B••³‚ /öi]—Äö.’æ™Ìm „“º Q'l‘¯`qGÉ—mãc¥¹1rrã*ͪu|<;“`j­_G¯ˆê‚¢]KÎîÞ´Y¾˜`Ê.ÀrÛÉåÊ¢†Æ‰aé£poƒ{ 6¨EòÐ{¾1YÑÏ’xxCÌd}lâìs%Æ—4=Çi.@‹¬@4å±0î5KcîØ—ÒI&À‰¹[:Ç5Ð;Òs•'N¿‚\Ÿ¥{ï¯GN<°iöå¶CùŽEît€M)·+ëÖhˆrª„ËÈÛèês~¹¦lòrrÑ‘íãÓ–‹ ̵\å”mS¥Äù ¿:j7Ïc¡ÓE˜Î±èþ=—ãäô™ôµå»myð¡-¼Þ¶º$¦ñ%f¹=5qú9)b…^is¦Žõ¶µ•Ò­V4x§ #pjmFêò"µƒ\xÚàÆç¯· eAUAX"2s 26Rë³ÏÇ›4TE¾Š«ûݶi;Ìlœ'J0þEöŽªLÏ-ù+*b¢‚²5Ÿ“àšÄ´†˜ òò—¬Xñl…(!vº˜Âí­Å²àÃDíË\`˜«uh%)߯Ñìªå¥ÓäF2ϬÊcªF²<†R9ŸNjžU¥˜»…ìPNgè1†µ½½¾!Á?6üN8UÝBþžáó?™R¯öOEb»¡'©ÈÛèsl2ŽÁ-4sdÓZ·1cðâɈlŸ‘0IvIxÆ¥°œëv½ïzbÊ­Jûä° :|-ý„B–[ß—Šô€´ÖC‹¸±Æ´§¢ä÷EMBŸ  9Uü²ŒŽ§ˆ‹Ä2i–¾°§ÿÆæ1’µU¹O«?\”©÷oÆÎ˜¥½Õ›"Ù?FŒ^dșӽ ]­Y~— N†nHŽ0Üs}òÌÒâ7˜zåbœ"NvÁÌMéY"œ;ÏtÖ¡˜ èRdwìîwì˨죙ø«M²4¯p:dgÞ  {ÚmyÌØ|˜^xk¼¤m&¹ùé¯(`çŒ ¿9£ÿP€ÓÙ8į^쓬êiÃþ%•¥'NÐøE[ HðÊÄ¢\VuÿófçäWðrjIƒIe¸îÿÔ[%ö`TôZ^ØzrØÍ­ä Åal÷符¯%¸Ì{9jÈÛBqQ8.eŒoÇçûc{ØØù°AÿXŒÚ=½x(±OÜH·/Ìa_M´ö±Lò –«ÁãJw.[®®§?ÀK›ý6ñ~•ÌëÄUˆ¬µ}´bŒ¡éÍEJ~êý~ð]ûÙ^^‘g®ø˜ F7O®=ŽŠb«Â¸!ç ê >-Ðg"•£ð÷5!'÷_Gè¼ZÒ£€G Õ­ø¿N—æí7Ý˯ê¿à7ú>å/ªÿüiVóóþÿŸº¦ñ»ï÷tîË#Ês†àmJP?eTã(=ÖÜâà]©Þqö7|¾Ü‹è˜àÍq;íÝ%FÃð%˜ˆÊÄÜ [r— h¸™Ëèñª‡A½"Vþ ÜÇË25ãmåO¬m¡å®oP~Â#XÛº¨ƒ ›ù#l¨Q-ÇÜYÉ«Aû–5a#éÆ˜þf À@‰Î-æ¼^Ùÿ]LîÁîW Oãè-Ã(àIw›˜œ ôòóÄð1íLÔeަüAXÍP¼|}s=+>ìmåwƒ—ú£R­çŠG<-ж-ÊñŒYdšŒÕ>¡3\z4¼«±FCÚ‚H.\êêh‚œÎýÝ\Z¸uQÁÎÊIño—þ¸8º*0[}¦+Mè­œ£Pi˜0¡¥‚4 W77ײ½¡O¾AÃ:jôÙá¥wŒ"xg}“H›Äúá§àˆ{×pF,vŠªX¿–¼©¨\k¤}Í-{L.PŒ5ºB,ÅnY²§\„›_lÇ·_=¹L™¿½‘?ªÓX"táª{,ã»uu²!´Z3 &”S¼3 š¹û„$Ã3BǽHN¡qójLì﮺T_†°ä&K·eqóRÀʇèÍòªXÙÛÔ>ÿúõõ-©Ÿäíq³úo¤çF$Ef7ÁcS`(a ®‰tŒ¨u˜§Byní©‡úÌ5Ý0ˆ«]Sgð3 È×j댞/.9™$B7ñD«’Kð‡™y>àãÚ1d‹kä¯2­}iË35ØÑ1‘¨Ó™;‘dÞÄ9ªgžÕêo;¢á"X€ºŒæ\+W”¾Û¦|ãWãZi¾WÑ‘Y¢{“ük}ÖÛÌ5 ÍŽ¯U^[\+Yª)óǯ Ä#F.êl mÑb¶wÖO$^Œb^ ”»Í̹t ‡äÜ@Ô™EZ~w4J f±Z 4ßÜß?Dd­ۻܳ¨ª7·½|’ÉR«…+“ÝSí,™2¢ñ»Íì냦é:Wñ²ÔàÁ-þ ‹nä\@ÔW¥@â~ü,@x9‰”³Ñ~Í=×”˜Â%’~ã€A ä•^OpI:¾óû«zx±YåAA;™¶î4õ“£fè¨Ø½þwÕ? y”¦£\óú8r0=YSÁêþ>¶.‡cŒ6+YÍIäñÈFÓ½¯w£T¯¥ˆ‡Z;*Ävû.Fƒnù$,â*û»5\ܱE™›ñÈ.iov’²}±B™¦íMdµ8–D6ÔÄ8@ä>Õo¯”[:kTB¼£iªÌØ'Tls’0ÊÇ1"/Hwf¿ƒ#±z6VF„Ïu©ø®Õ¬Å¶ùQb9Õì1Îä6Ï ÁKÃüÛ½&c®Pšœ¡¶XŒ!ÂbTA¼jçÝ4 ?Q]Ð])ÞB_ õféØu7(\9Û{ŽÝüðJPOìñù$VŒ¼÷-taü’{S|¡”Xòt¾x¿?l—O—ÉÓŸGVGcA)wA3UÓ¶c_TêɃ9—ÔJ5!Ï!þ3¾ªŸÜL§NÌŸP1: Í2—ÛÖŽ7/ 3?'¶ÇÁðúKHv#×gjŽËßÑÀã…ñÏBã§ýˆ‡04}¢mP$0ÝÖ³ `˜0»Ó¶?OÔ5:£ºðAì|^ÎûÿÔ‚®ª{×|J­by^Ð:©½RÖ6µÃ§&ö“ÐBËísÌ‘¼³Éb%QÚ7Á[yÕ½HÿM)ûã”—n†JÁÄûá+H·B/”}rmµÛ㥑»—¼~C<¬ÿÇþã’1ÇÍ5ÀEØ™O¿hUjØ‹1ÀÒ)| Üc£2RÒ¨`í½æã[?ùØc)·m®7Es˜ÜYÄrD–°‹,M¼ÏôÚ£Ô:æým¯uVÝj®@ß»S1ð]ج˜ëqä$µø~\àžÝþüÀ8yyLj•×ÁžÎwù¿Oú@z9é¢áÊq…žÝ|:ÝG4£öü”•^É%øÙ w×Þò$–ÏC÷¦_Ç*–°£ä¾ÔRžæýºÉ¡PªmVAê1E}®c¼?Ï]g_ Ž‹–5›„£=2vÝ#}Û§×Ò17m£8®:Þ¼z¬–¿To§À‡^ü"~ÞYwäÔG?E?611Ž?ó/õ!‡'i<&&ɬ—˰ù<›º¼ô»Ì' ðeuÊb/fË­y.PYf¹]]Ó6©-Oñ{°í]}$VLÒÇs¬%f&¯ˆ”“ âž©{Dù­ÑI„xÿ{ !ÙÇ3 žCǬ‚ãK³-–ûìÕ3‘2&v}¹¿ÖíDƒ.Ô[ *ðv¤ËÃ=AS²wãŠ_ÝUƒ;G¡ÉÞ_åÂßõ¯_KµÄÌñDaôð¾Q S‘r¨ä HS£aLÝêžsŽÄòʸrÒ±¢m›‚¥ÝÈ´G/ut«pt(ªCÓO˪BåÃìúa&®{AAú‹Öb¤¨€p·5ÂóÌKq†˜|t6—б˜Bm!­Áƒ~Æ+V…@eﺡy@…”"Ñ¥ºôûÇ—bªp¿¿m“s_¡íPöþÂl®ðÀ¯_ºT)²¯Ên3ªÒáÎuµ:ã(–æ³.ØM8j®zG6IÚ6.ÛöÞèÄ.é ÿús`éñD‚ žçñ:÷ÞqsXݵހ^Í„žÇ…rù7cÙ%¢ÅÞ£Ò¾¢Ë]$AÑpÍv›Ùod»½Í?âÌÉÓgÉÈB‡ÎÁ’Býwˆ‰/ýs1º.ï «Z;?ž{ï}T¯1}\Ðb3MxþâwÕRîÞbÜzW1 2óßùÏϦÏ1xƒBþD7}·¼æ̶ç]̶DÆqOÚÕ1¥H&”ϧf CÑ)TÍÀH5B±s‹¼`|s«Æ™ÁÃH-oróqØÙ 3ñ·Ï¨¹öF§|!GqLØU•õ(§É¶mÓ§Œù»øêïí&~b˜±¡zñ˜‹f§²G§p´ÊÓjÉHP°"K ˜C~â¬-ír3S­X ˆ ØžÖd.}Ðpåsìy %Ê+ƒ)»y€ ¸Ñ(eÀu±Ÿ`óeªÌá¬ÌAê#mlÑà½Ïv«JÙzm€ªnñÙ¯`Ô¬R!K‘Ã~G˜å•:UÀáµ#ŽªN*Xš ñâÎ4ÇDå`¦]2 Ѳ¥Ì¸ÄìÿCî1Ò‡£‡ŒüJ…ÉÆ@Ç#•ÜC9’4„ã¼5òÜÉQðÐ œ[ŽP¼´Cñàd¦@×’ †Ù©2 åĮ̈|œL†¹o(„6õÙñS¬æžIü  Î?üô8àñ4âñ{¦ò= éœÍðÇûÁqIq¬r¸ZC÷sG½ÆœK=²>Sð>dq÷<$\²0gêåF’»Á«o(D.“Q\§Á èM‡i£é½ËÅ(êZ¿sЄ¡éŸÄÒ¸ ûøQ*å‹ñâáB,ÍHÂX ®æ’‘Xb¸^ö@17‘5È‹¼(ößÙ5;¹dÚüÑxÑ1®w¾ÌðîòïkÎÎYW„jLt¯ý¦¬ñH:.U ¢E–¶}®§]zŒ£KÖwxêœÒed&•Ì—†ü7uA&–´Ÿ+¹)”ÿnúR¤{4‡©v<ßÜcñ÷zÿÿIêÿ_íþý©ÿ3„—¯¹¾o§EîjßëÏXÒøž:r§Å´;kiS;ŽÁŽzœD”ºëñSÃ…„Q0eµD³€¹éÍ Y$,=Ò>d6øLÃ[—:•·Be!Ûe#ðݬA—ÿps.³äÙ³-ÊÞP÷$CÊ™÷|¸G5øà†â·#^¼·Õv˜ìù70üouýŸ,ÂxˆºGÙD·37Ç™ñ¥¾v$‚ç9Yµ9'Ðѵ‘üß§gx>¤UÝ{¿}îg7™£jS.¿žT-÷è<3[ Lyj G§«f<ÀG­¤Ä8JèÍ6‰Ï:6þGÛmx«Ït27eŹ¢0c©ÞÑ¥“\£¢ÈÓëã;¸“´FnǤ¬Sì ÀXΜ}’†Æpù»@ãÒ²Ëø"rþõØc=ýJz5…–'bZk ®Ñ9« EwŸÇ‰6Ìô?Øj·cÌK)W(èÝ7õu·+¿–ﶘkD¹ŠníT *Ó˜ îáN ¡¤Q4„cH^•&Ïm)HÁÊúí|Ø1}@þ澲霽u‹\¬kê~T#5ùB©\´ÌñTuMtï}ïÇÛ‘‹ø®G/E¿¿ç ý—&¼'qÄ7¢ÂÑØ…‡zxÊ0ÝFîoò³úY#,WÙ<éžx}φÛùÅG;±›:½¢ÀËQ‡©P‘[„Jñ'…?[Ûdp#Þí{Ac70:ÇâŸg ×(˧#/Û³c^ÞDu<çþ4² ÇFËÑø¡©/÷hÈZÐê0î} ºÑÉ:y ý><Ÿ~’O»{â Â}¬ºÌ¢Þ—6¯ÂB¡,¢qºZL¿ìWx±y&þ'Ÿ¸dÍø¶¹äb#esûjó˜æúßÝ‘Fïc±"ÃFh³m$/47[n³AU¢æ’lbøÂ4úÄèÇ\+½½¡íã¯13)‚j‰ËíÆ5?òuù‹5i´ñrMDöÎ>O1n2-OƒyŒb%Pu-Xt‰è¿†?þpˆóþcuýKõ³|ö!*b{0YØõ8û4š@UÊ®½íÑŠQ>™GÐþôjãV’0iXKDh›îšý…ô? ·™$aI3lk –F‹nÛ  ;)5~-í.$¥h,€KR"€›1\ð®k°]_ó9Þý¾›˜Æ<ƒ=ó ºÔÏë`aÁ ®hÇ:àlðü5cPV­B~}Ö¿ÿhŽD úËyOKU$Õ) e\ÖZk}\ºYªßöp‹¸ÿඪ’Êû£xl¶Îúî[Àe”1¶)ëó bO“-¾`Ì‹U£MÂMKô‡ù- a”÷$d<>PºŽçX²(™j!o'°Ú+IÂm6®ª„¿£’Öÿäb«ÂL׺Yv¤mn3ûn”ì€ËÛêÙ§ê¨èÓáfùÇ^²ÖÒX;úé±·Õ=èì3¹·Óá% ›©À‰»)À+ž“úø×ÄÖ‚À á¸ÒEÐù€“÷ãëoi~Ï ÒznâÒM6~@‘ˆ"ÞÒÆç’z¯vëä«h÷wU8@u‘ý©ŒŠ» ß(Pd‡¬^‡ì–ˆ¼ÌÂn?}õýP…ÿ`g{n„$ ú$÷„n ˜ªª¨ kÇÀýÝÉ.“ZØË³ço¸Ñ½ýñ{¾ÄXDm‰ÐÅβÈÁ¡˜jcÿè°yà˜gŸ°N3³ƒŒ5„0ZˆkÛhÍ…†ªcò'o*Ý]ËLœêðЧžm7½/~ÕÖõéWì˜TiÎ Ú¥œ—5•¾þÂ]MJuàÂd9ïÛ[”›ÁÔ*¤z††·ojKÛy;ÞuJx.’¸G޵cjqØ]r­¸‡È(»Ïv"…äêœÀ¦žQªF£Z¹éó<ÉÓø?¬©qdl8¢ÌLK—ŠqW‚±ôÀ(PÑïˆ86~vÒ ^8?×óú¢à$‹§²'›a<}Çø;Ô«{]›Pã% •áÚöteaa x†@ñ&íÍhJ?†TwûåŒ(ë.2|R5ö?þrc “u§dç^Ìeùî3”ÕÑDpÀ²æà!J·«JŠ úÑ1C “bGSàÆò!´™êºÐqqnZcz“jêœx„fÄÑÃ)+PËýðÂ=D$Èãò™!3>5¨nØfVCÀ 7¤Ð±‰ Ð=®'#ãC#ÆÑ:Ú2Þ9È:ý£1×ÍÙÄ(àÊñ]êfæJ´‰1ïÅaõü­“øXÿø(‰}Ý/a\·O®+àÿ-Âý? þó7ªÿøíhàÚ.WTèEÉ?Ô_9ÎRÑ?û\°ª› µú‡çS"©ßnÈj‚Á0*Õ­­Çî—Ý|?=<üh>wyÝ Y‰2ˆÇ€¢BµæèƒqôíÊ_€¬Ú=iáGF 5Ä/x<Hç’ÐÍØf=:Ç5LUÀW3¾†Ê…Mâ´Èð q×~0÷O£<ïdü·†>uVq6ñ¤Üá°•at‚9&…ªá:—²Ýš]šþ«‡Ž³ ýyžyWçùçÎO´~íɃ=FÜ·¹“ÓÚ&u=ËæÄ¢ì\Ù“|l.|±7)€ÅãÑ…øuÔ¶æ5o±?Ҭɕ`n¥ÁB ØŸ‰óN¥k›"è+Ý'Pøù©µ_O2º3a8þ¹~LÄÂë“÷ý†„Ê™‚Ð¨Ž B,{QXžJ¼Ô£&4˜©Z·>ºo}›‡Nå$ž¬ÇÒE1ÓðKÕrTŸD…¯kü×õæ~ VÓ¦R’îo$IǶ$%m~ELô_}\slwÂgÕPãÅÅ$ Ho´ü««ƒdõ ‘…2X÷µæ´Á%«êÃù$(ä˜ Žh×e4 —B¸¶l¡@õ#²€âßß?ö¿÷÷»ÿ·Pôÿú%èâ C—âë\-ú §Ë邎RmiÅ›Ù_,­¸Ö}¨£ñ4áÅט—ŒùSl5rÉ&õßU>lÙŒãуè¹âƒ#|vRQè$@cy–áÜx±ï¹k︴`Y±µýhæÞßäÇûǪ M·,h†‰ã÷ÍÛP*%:×gñ+²)N=s⮵°~Õ°Ó| ÕŽ6÷Šð&Ød)–ÂT}æ:@纷IX^7…ûû¥ÉR“Ïâ-ò‹ç0^¼ãhê=ÀçÉóáŽh…ØËGvä½ã¥<±¨ƒ¬kSÑê¥ä΂”¥nèé›1/ÜÛ*>·“ý5ÏÛÈd’‹ x0dT5àMÒ°–형 õÄ*.Ò›hN<¼f¢ºV(ªªêžT’C„¶&ë£9ñ²ø¡=îáÞ_êZÑeÚ…K X¦qÇ(ԤĽy…YÍ–Á!}!:‹S,ØÂjâ19ögëx¾y¾úeçtaÿyÂÙ­!Ï]ÄÖ—í ûŽS>æ# OÊ¿'0üí­Ä‹#~–Ö'áí¢!Ëù»U1u“õˆF×»[\—~ô×ç—ÏuÜQ^ïªìÀ«I…`âÍ©“Q™ÑS/Ñ^¢Õl{p¨w±ÚÓÌ@(T×ʦEÓt$ôü ¡ka$OØÖZˆNC*  /9É“ 1dRo»D–; ¥BÅË-(‚1Þeqðh³ã|—ˆä•xA~ÍD¨*ÙÑP´bG@D-|‡RXì[=Å´™¾nŠvWÓ¬ ÇtóúϬ/¨CãÛ^ûäÌŒÿŒ¿ÔCر“ä¾ îÞ9â[J¢ZxàÌ×Ko²Óm•õ6•ýÆp…ñ'¯Ë™Áœa†OÄdý³†"?3j’ñºèšÊùÜϳö¨?Ëò0È\ïw*M~?˜Ä%Z[l9ME‘%óu_¨V¡š|ßλ8Ü«&·¼ha?1Å©é‡õ€®×â¿O½ÂU"6õYàWß­çˆ#A'§Q>–¬ˆÎ¯¶js†B³xÄlÓ¿Ñì |o§×±`yiÓ’)€!§Ñq‘j†=<¯ZÁiuDl‹½œrt)ø³'Nd±ä ›þ&èäÂ÷œFü˜£*<7Eü†³ò g»½4»t§7Þ«œ1ÍoǧÄíVœ×ù(·`›qqxê£èqÞ˜bÄ=JÑ Õñܶ ò8ZÌ„ÌQÎÓ”,ãË›= R=Ù'± é´ÃEj8_òƒÄèÇèâúLç~âóPh":(ì”S˜é0äˆ'åoU‚ƒŸMhŠ æMêÿƒ—Ò_G…vâ9¸$._ÿý¨þÏ–>þ3•ÿÿ ïÿóÞÄïs¯êÿùP¸Ìõ¸4ÇÛ™/3 õ2|Àa…~€È 9V燦q×ΰÕÔ ¼Œõ>k¥2LÖsìJ]¢Ìþgèûßj$˜A¢ ËÿÜbælúõC]„P†XIšUœš`!óçŠ*—i$'»eÔ&çýë q/I>ï÷Ú¯ ‰ú·3=ô¤ûfäaNðð0%è?ïNû;¡RyI³;írðÃFCÚ;ù0F„9Ôìzv^j~ñ¤ÉÀh ¸Îÿ–4]NýòÆXlXþu-ðáî³èåÁáY.÷ï9å›^ªÓ-A ô4ãÓÌ ñ~æ³,ÆAcûª ÑèØÐŒ´QóÙ”ðH#+lwAª×²æ¯'£„oÖ 2yÌÝ•ãòmq¸Ñ¸>2¹˜4Èb;Õ:'UÅépBå:·LióᎾžâPDˆyæÚÞŒæjbéR-´€g ‡=ëVýOö|&äªä6o–ŸE,Zä`QÀh4×:e*&æ„„pÙçvÞv¹A­CÓd©*@b›-ÀRyÇ×c‰*>ê¼ì(ï77d qÐ.k;Ém¼x"ªïÚœjIc¡AV9TŽÖÇ\LRÓxà@€‚‚=9;õš½ÃÚ­é-©Ml­%%Ó¹僾ZøJ„uIðÐêyoFQ§MÑöŽ“²·#@±w5†øè@Õ¯—†º]öÿpz|*iŒÆê5ËSJÆuá2taZ<ŒòãßæÇ\6Äós#XÔ&9Z> ¯Möò·ün¼_‰>73¦Rx¯R°Ñ袺±ÒÅôcZíĈÞ‘f{o#Òi•ÑÓó©Í|ëHÙÔìk“Y“^Y£Ùw¯µG VjÚvO5D¨IÀG­šÅ…‹„E÷TÍÀtåx»¨ö¸òëLcôc㯠'Ïðe³7Ö×Ùrš Ÿ1ÿ”K_õ˜HmP ¼”Y‘Sïѱžjƒysj”LÄkQ>úÑ¥á÷;_³"1=s,“¸ÞL jÝE[a„œ¯ù› | @=?EˆëãXÁÈ* ‚ú)•ž)ë´7š»;¼¥¢“ñ8¤±”ÿj{vr#²é™Sò-Bt5Æ©^åa5Õg–ż–F2uǤáÇNÂù.Hõ:ñøA2o²QE‡.-” úÚ~œk3þ¨ªŽË ÿf7B•3““ umÂûv©oWG.ÿ}Ã)MÚ£×ü‘¿e¦âš=2˜wÕpÒ>½‹‚afêâÔ㇣څƒb[YÝUãhÈ#æÃF»û[°H㸅Kƒ—⟛žQv¬&o,9 f²_µzrNÙiìÁ nxø ¯Áƒ…ñ¨àgŸ~ugŒ¿˜) ™L|y5xü5Õ £JÏÅsÁq)æ@ ˆ?éÌöS¢ÓrtzJq—f_÷Áá5•*5ðè\e»ùÇëšVíâ5ÈQ5©«A°!,lh÷óQsËxÒ³0W7œ!û"³ùlü*eòÝSQPóÜ$KEyç_ Vd·!¼e~`l‘^ä<õ(=ÕÁÙÉ×"Б¹¯·p~ CZ¾ˆX‡¡ušÚ@Ô+ÛQ°p9QÙa€Sãš(ªÅÔ¯5î…tV¦ gˆ¼“;•Jé9£’Íœe˜Z|Ó¡è–^ ÆÎ§Ÿ*ØÍ:h Øà1œY žá’´Ô¯l%™œ0¸£ó?õ#·Îûb7¯iÜeFþ þÿ%ÕþMýÿçè’ø½wÿ¯ªÿ?}Ó˜ÇË9(NÈ~мZñ60döX´Ò– k3!×2Vzå,€‚%É´êõMåP&£2·¶bÑC9ÝŠ©ç­h™‡Š™,ÍÚai¼aXóSÄ÷×m„û—‘x»ðg~rk²pÖ¡göÇ ¦ˆZÙkþYæ7©GðÕo{E °ÞÎ+µ}eï ß[à­4#_“Éì“M…NƃܻæÈmeU~ÙûÅ9þë§ýÜsF¬à ‰ð¬> @,v:Éo¬Ø¹™ù#ØjÅ2 ë þj=<ÛÆ%ÉE¨riï• ‡NÁ7B ¤Í_„¦P1(X-ÐÞÕºÁ̓È`)Å5±ý7K|‘ B]0³ÆÃÊÄï÷»¿¦Âè®Ï¯_ÿú¨CŸã´WG©nh““µ=zßïI1šÛ×âyy»}»]Eb «ÏŽb‡ÑTdzm@~yŽn4LµßPÖùk ›ô ¹%YÖÙcc‰äø¬~þçp ij÷%€"ø¸±š¡†Z††¶fp„ÂZ±^)`®þûL£1æ²ÔKžIš³È9$›Ò ÚIŠÉ6ª³Ä—˜ï¶*qdžú¨‰ºÊ€¥K¬¦#N: Ðö¶Ì~Á£YòU‘›lkfÞûjŠktÉ‹ ›*Ö!u-]ë|ìsY×R/_‹ƒ1ºŠFéeŒbû#²©ü€ÄФ³gsN8ö^CñÝÑ?¿´õ1²( ~¦S¢ ¤>Ò„0ñ&fn!÷÷¨2"+õÞ6½×Á§[aŠ_ÇY9¯Š0¿©0:³îÂ16 ˆ4³ÏúõÜFÛGrˆž–æÓ| jÛ¾ßwÓ½‘}õ›ÓÏor‡ ¿×‰þoÉ6Üš“ŒÇ÷áé ¨Iac¦ÛÒþ>RÌ@¹`GŽF#áíã$·­Â1& ˜ÛDÄv3¦Úöˆ(²P\­©ð®¡Ò£)P(KÐD¥Ä /ˆ¦Ÿ‡C¼&"!ýH®ôù¬²Iª þ™ªƒQpP†™TŽM`#³V!õs'Ë+ò£e)Jô“A&”©ë\H··°ôÑ]%""v]Eó!Žƒ[ž›šêUJ„aRÉÇÑvø(ÆšÌZ“+™‘–¸åÍfꥪ'4ßúêpÀ-{mT¼Ü>HvSfxšmL›ðçq ˆ÷7­_qžÛ3£“)1Ä8:¾¾k¥¯9ž\)íâE[ʵoRÌ}ôÈ— =È<”µ‚êFvuøÍ¬¯"ûa¾­6n)üP »qõÈ#l~áÀÁ± WT-ÐTºoÛô¥×µÄ÷c1¦ùŸó1.üÁ$ËñN§,J5@çËòo8IóÓ)õ®¸XR(À mïèc·M$G.r4?Ô#óf/(£óa&veƨ›·W¸Tí (/~ö­eÏË,æ¡^úD’-Œ3„B¼8ßy¾=EZAÿv4ê¿@»Y[ËDúp†ùj¯™–ÅX®fHE××·Ûáz¦C‚s¬—½†Î_Ï ™Æ¼Ž9ŸËx,ÅMÝ>ÓQ£†­à~2ô?Ûéõ@%æÞxC¯e¤‡€<\'Yü¦ùrbªc×*™Eã*ÈÝ3VSÊ 0"Mw”šÅWg“µò©Ãij#Gãþ jwÜhêÓ”0ÔŒmÆl'š£œœæâ9tÂ9Ï;2ZÓlÜ"à¢ÿ©Ô—?òççýÿë³Ü?›ûm¦z•ád!gæsœAò<4 ûˆ”[ªjÖ’«§!¯Ö´¯Ñ(kTîqôC¥×ÍÉ¡Šá##Ìž§½A­µ'G´Œ•Lcƒ%mo;‡ü.„e¹VŒÌDv˜åu-`“ß½í»ëÛgë]wŸ—P…à&Mà-îŠDø†Æ a,-Ùs¨âÄEØÜu§Ô7#jL¾ÂåB=2´Yló .[„Üåw Œ(˜µˆ ÷Þÿ–µü_ÀÚþÛ'dÃßçhHõ¹/ô÷ÇËνÅÄhúÑ£ñ2%l$dÇfœ-®m+sW¿z¼meøÁ¦…Ê æUa¬ß[åCe%ÀT° YÔ(GOÎÒ«¾-ã}(Mg_6ɲœ§;p)AlçÊ­_•Ï·£ß¸îWèZ:Ý;¸õtæ Ev^>%â/gh»û»üˆü¡P€Æ-Vl˜m`Eo­Vf„R,ëëÁÈé!Ÿ»Pý&)@ËQCŠ'X³ÅájŒØS["mD$Z(ôØk{yµ8r_ä³¼(ü¥*%.h3êÂÖ¨jüžF]Ôr·³¯.ëÙ±å23þU +ðù¬½±-xR~Ý&`ñx雥­þÆ.Y*â1‹ñtsz:b´¶–šñö–EºÏÚ~›q‘?l‹'GÜgÒs?„³(67ª8]¼°È"X~,±oˆåo«Œ÷åmÀzyí‚ Ÿãï o#Á(‡§Û‘…±¥•båEÎãrwýÉ÷vÏU®råÀb%Q3›ëØHã–í @n2œÝd™ BZ¤ÃÀ¾!W¢QÌ‚²“ëíúÜù(¶ÑêRÙÆvÕv"ßXß$+ÇÏ­yfcŸT5§EAEýRÕ8[£19u¤\"Ø‹Ng’óʘä΢I°çáÓç*p8Q"; B3Ûœ}Ù2…!i`™ÌBµ·YŠ{‘Óïq¬~ý+gÉü[/êfI!Óõï{ÔÔ>:ÕQdt3Ÿ¹Vr·Q*˜³ÀÂF3Y=š½,¬(¼UJkzÓóªÊÜ£¥’“6rý7«Ú¢¦ð<òf<ßÊè´³¶‚RO@íê½c%a”9»¾ôûñ'_X\Âsç†õúØà%Âð&±HçG—¥Aø÷‘— ½ ƒ/¾ýœmàỼŽÈ—ë ‡UøÐÄXvÆÃ£ýCô诪ÿ¨6PQu #åJɱbàAèºFƒœÀNÉú¸Yû;ŒŒrjÇrø²S[wëúI7rvf•érfz¡©‹‚¦y4ÊäLÈáLÄŒ|ø›96Þ%¡qr–\Ïcó Â>OóëvKŠZêÃfcX¾ ¼;:ñ‹æZð“F˜¦ñ\Õ®‹ì Áá9d¢ ñˆÌX3€Ð³/üaâV?e[£Qm ýOykå.G9G ý”gaå¸þböûÞ×Q·ŒœÐ1ùQžÉI—àX|»}‡:ÞšóKô(Ü>µ_JŸ²êÒÒ]#­Õ/Š÷á°†Žg·IK±"?P¨þôšß;©ž*ñ6 Ÿ(ùq>ó?ÿ©Å¿øOÔûÿ#õÿ7ð<¦x}1‡ºyïÂjã«ü¸âŒGzÄ…Ÿ»!&ͦ~²Ö¿S ãFÁ×Ô8TsMÔ¾€»L~D_‘e/î‚T…[nh¢™Ï<Ù‚OôÓ¸ôµÖqs¨½ zO#s'F7š Ôm´U/œ%2½È:NƒFfÆ)º¶ƒQFÜE­œêÿO™—‡• IDAT#Üù¶µ;,9ꚦ5ä§´ÈÿûyœÀÜd^õ}FnÛ³õf Ac³¬]àÀi„ëlF? 9N}8Ÿt½ð2aŽã±.o¾M¦±mø:ÝÈ,6©´M¸ºj!íß?:C’ # ßaÛ$‘=xü¸{×-Kn#I×ͱKýþo{šµá6?ü D$¥VsfñH³Fb“ÅÌ}‰@æfŸu&2 }`ca‹4]À4]‚¸WŸú zŠˆÐ„ǃÜß»]…„aQϺ?Ž~ÓŽt¹îq(ÚJ¶[{K¬PaÖ¸Úù<-ý¨˜ ¡ÑéG¸,ð æ²G‡=$[|BÓŒ¡ÝKžA"«H|a-cÝD1µ¥\ê÷éZ?€`!$øËvâ}²¦N@ð‹ÌŒÆ¤U]A;#íËHr$ƒ(ç’æ2nV5š»süÚÙ‘íÕÞfÐæ“º¥>À×dwÔ·êZzpÖ³Ø]V7áÑ+êHQ-ƒwexBÞ ]Ú¢"Ôhûèt¤ñ³VŽÖ¾Aq²eÛ ‚ ¡Ø¦éÃvœÐKõªÖ)‡Yˆcµt¿j¼ÝŠë¤dJEG†t,…ñüa>â´–D¯>2!§~XìŽy¦¤¿;áwö~x&èôi¦ ÓeDG iN_á:3UÝéuN³x<[͵ô×Z&ÜÛ–êîˆ|!OšÉ-VF&«ÄÒm¶·-…í«dpc‹ƒž cö‡D«¾Âùú×RÍÞ`3r …ºÎí·ßÀ"©:—†;5Ös¿ iž½˜>h1±åqo{¨Y­ÀŒ³ƒtˆ¥P¨Exƒ ý Z0nŸð÷׸¿ª+o¸°$•_q&‹™£P+ÖŒËçñ€‰0wËš-@”v⃀ ÌÉ€íâ[ÒÁºøž½œæ`öÝ_óS{ÅìRèì'Q–#èëOuÞ¥cM8Ãj)O˜ Ýìšâå¿tVCtCV°¾¶ÒÇ bpxU3ׂñ)ˆ\…À> @•^½]«ªðÍuArÄúíñNÏIß¾ž@^Yí±]#af_o¥1›0wᘮ͒Äqè}ßÇ÷ô8öž÷ûèèK~ÊÊñ¯àk[¡a˜¼Ç\𵂴A ½‰È2ûa·„öø [!ù§èØM9œ~k4´q”ª§ÔT5Ò?ê›ãÒ¤ÉÀ-`=ƒÇA2 Ì[ÿP†º¦òì±Óq>û0ŽâßñÅ•ë¤eÌž¤òy<ê&iä&ÕÛÜóa¨#Š"#í’«¤OBÈ¡ò€iÆ•©†é°uùWõ%voÅóDǧO—s9å\Eç€~'¿7½gÈæä½W Ǧl‡†ÏàU4h|ŒêfÇC¸<¬ñç“‘Ñ—’¯Â¸ 4ϼl< ãüåÏËW™Sàzó\EôùÎ&^¦¡88‡t‹Éó¿žpù÷ž* ÜßVž6%Äô„³(ÂM>Ó©ßgšÖËÖõÐiqM©.,øÑ·Àç> G*ùªòUч©N8æ x$Q޵]ëÕæø5Ÿ-}Ø7à #ÆŠ(ƒ«ïò­F£@Ä:7±(Ð…ÙH;Õ9°9Ð|=°{5úŽvYé<@ì¿õ_i–žßÌ\ºÀZšB4ÔèáhMÛ€Èêç[—Ê¥NGScŠÇî n« xI sÞSž÷ÏŠëŒÎCšÜQ<V'¢â(Æaÿ ö÷ô]×ýqq”(³æàÑœÝLHì1Ï7ÏQ!pEcÎåàg¯:æçƵà(XÎÑÍúóO®:þ‡©ÿ"äÿ…êÿˤáVÿqx’qÍ9åÏX¨}y§ùãmt8±ø²WG=çú?OǾ–:[AÛd"!Â^ÁXA®yÐ6tÔ¼º$uŲ^KÐÝìhø[®`2ÛÆV–‘ð0ú¤™#òÀKdŽŸ†Ê+3×ýƒ¯ò½•×”FÞFòcÒÄ`œªqôΓÞAþDR·S"<ÅŒ\´v‘á×__˜³«úáy¤‹ÃENÿL¸Ä ¼Û+cL9N2ÐÄÉ„8/ƒÚ‡/*¬7 RÓK"Æ’2ß~ßÅöÖµr À'BYš¾Ô6ØhØ XÒ¼›}yqŽÒfò´ªdݼUl Ú «"Lñ:–Cº£·°›)õ£Ô1>@Õû@ÓBáôlŽS™™DGœº ’`| ‘í)$¯ Ý™ w­[uoój‘² Æ:YUÀÜÉć£y¸©Ó´Q½OÍýíËhìŒT5~+>ºè{ו„v+ ã§B¶uyD÷Õd @¦ç¡‘M1û~¿_3~>k•‚t)ö¬…í‚›îò”‚è«8Þ|s—-ˆþý†¯ÔȯmñDÂ6 >ü^ ȲH ÈR˜Ñlï½*ö% ›þ9ðãH`ätî|€­jä¦mð®Ç¾ƒ©™·;J„6¾ÁŸ& ñ.ƒ12¦€°ZãQ`sä®DÙi`AØÒ¿Lr\0ÕáJr[„/ž^“Ed퉉,w šw¯blr ë×g¹Eª{˜åcÛ]Þÿùá%†d1—T€4ÿÖg¸kY­­ÝÚÞ^);Ô0Úæ×nlkn+RÙª\ÜLi{Ž×AlÝÈŒWQUõ³ÖÞ»ˆó1ó×ÛúÊ3LF‹( ÄGu«Y~OA löwsü,'áhºâuÐóð»ÿ±÷^û|¼>GÖguŲÙò•›–÷p–°¹å¾¶@#{ÆÚ,êÅÆ.¡bÛÞðºmss#/n;ðèöÌ Ÿ™q‡°)›üã÷VÈ?>¿ÆA²_fãaÎCŽ…º†òFŽ¯Ç§!A(Î?¨qiõƒ;gXq]K"í®ýù”/-^óo2[XøÜØ峤áÒRý_0Û£1ø'£êÖHä …Ÿ§I)¬Ø{ïï6$ëZ¼¨QqÊ~î7àÜ΂ÄÕ1/r-˜õÞ{çvÖ*øoÐéý&¤ ÆôŸÚ›+fËDgðô¬ÑkŸÞŒ¾_é|píïsˆS˜îJ«rœ‹Jó`àË4Ê(ZHÎ ¤0wžòb'müF‰"sRÈÓV‹.óhI9?8äû‹·R ÚBÞ(­û¦¾¯¿>;0¤«ñIišeÕŒ\œ7ˆQ–bßnÚfÎ÷’2ñ2¿>":©B…È&‚Ä€åhµLF'yj*œ[õ§ôW™çåþÄ<»ãÔQÊÞf³=§úC2`û´§4µ1à22OH¼èÛ´Lo¾)³«sÀmy–Ÿ†@§³yIÍ´HJÕþô:?]Ãç g9Ϲe‚†?¤š0 óîg(&ÿŽ^4š¦âÍBü·s£¬ÎÊfzBzÆéqVU*ïsŠñ&}áœN‘’„óI¿•‹4@¸PóÓdÿ­©C .Zd.[iŸ9ÐÜpáÁÁîàÔqËÚ½”U)Sbõ»Þ¿ÃlÆyŠ¶Ç Ñ«Hòâ—jd³”(ìPÌ) ê·Ölwxßù\ç0<á¨)ÎQè{äYÎ#F§8í½'Dl¶ò:„ñ9k^ – öycå Y(*»V½£ŸºÛ¨ñÀˆSúÆÃ©ÞÊc.´è¨Çt}.9Ä儌j²ñy€ù…Ýtp eÖøâáŒ@*þ…±'àñ•àrÙ?¤ÿW#øŸ­,8¦+¹˜ŽW\v9_*ÿÌþÿ¿Ðîÿ^êÿ³`÷/™Š‘[Ç™–uä@x·¯ò’à©KãÖY>\¶`c²¥ –t†³ü}éæÜ"KN ÅÝÜò¦£—Ϧ¹×â¥hϘ{;øó}øŸ0øDKÕ Eôfêð¡çIÿƒáÐç Oã1-Û¸Ãq¯×Ôh ŒKÓ´xŠ<Ú§®Á£NÈÿžB«T¶´Û­­,×Zûl~ÍpŒ•ÌËòRs%ÈmeÀóSŒ3³¥Š¤ pí…K¬zzjFæÀæ@ %@6<¡) !Ⱥ[œwZÕdsÌóO-‡w¥Jyjg@lÂÕx€òfuÞŠ/JqøVr- S£³ à×Sý&·©2Â¥,Ö•ÑÂó…š H–YPÓâ  ¥1`Á/JVZŒxªOµ/e޳qÔi1ùÅ0'cõCAÇÄlGû›ú<@½Àl›ÀÇ®µ>Ø›okA—* ¡ÿ øNrûåj U€*t\ ¢;ºD­‰ñÕgýRxÄÃkÔͧbÞ/mñª3ªMßß×xR8¿ŽÐÝJ9ÂtHü*Qß1Q Y”½¡B0 s¶7I˜ˆVÜ8±£j¼&j·ì¾¶o\AŽ…"ԖẠ~äì)Gf§Ý·¹¢2•ù!;Žþ[—Fí,«{ cvGë‰ÝT+‰>fc=ÈE¯?ÐjÏ -¦XÇ®¦6‰ÐkÆú÷Q][iô'Ýû'Æ#ù{ÛêUd­Eòûû÷öïwè娭¨¯ÍÃß=¹î¡þ+’‡/Fùó)ER•ü~Ç5'¸Õì&!¢¬¾šc$2—¦äÞ¡te¿Dt$@âµç2}åÙ®¾ZFMzF  g«”Šl‚®sঀµ¤[p1æûɃDo­m aù¿2@©ÉŽHP}”$#H¡‚+(G8q†oÏÒÞ<òX‡¡•<¼Á•(¥š}móhÄ%…²ª"bEcV/b£²žX–Ðulª‡ f‡Š í²wÛ¼O]˜_ðÑÉ}Ÿ,ë$z«_nÇù¯ÙLql ýú¦–06HùªTú­õÜHBàÔàvÎx´z^ÏsœÔ了(÷5@–(I¶wJUˆAžƒóü6=”CÐÇ€Ÿãª½ <ç&–|‚œÿ‡òÿà8¼¹óh‰FñtY‚3ÊRú-to._0ÒòäPÜ {s}8Cªsfþ¿ÛW™!³”2ësYb—ͧ8#}O ¯øæcz.m쌚w¸.5½qD æøbdNMu´’Ç®Ê|ï¯F-³Ó¥CÖ°æ(;¡Ôñ<§¥e8ª2*!6£Lü9,$ïT9œÙr ÏJÍ|W,¶ ÇŒ?¨ÿÿ–vÿ7†Žã¯Týñ瀧oÿ_;àuðƒçÄ¿h@_¢CŸ“Q Ð3°†\á_ zN¬S:ܨÃH°ø:£šl“ûß]ýDјze Md5n­ÆÖm-C4÷ï »™ €ú±xÚ‹ê}°&Ѐ[1£W4n6V®œZuF91inÃÕ¦U>4vàþVÿåÀø°ä-GcÞN;ƒüðøk¦]«@ûU.·×ã{ëû˜zòòØÿîgsFã'çaÀµ/µ"‘4y€Ï×q¸+ŽËüY)ü0›pº¢¦ÕÞÀ—¦ 71£éŒÍ®Ÿ¢_mw¼Ixi;ÅÇ’Vä?ÜhQ™]XÙxò¥p£=.÷m”JWsh}Ä¥ê÷©&ø¡ÜXúK‘Å1ÙÉBð,L•SäËÍ7ÑSª€æ×³*Jé°¥²†·¶åÓqú°!TZ&4LP•’h—n=š¸¸ðXˆÜíŠ8¿ŒÇë×?*YJW¶)ªQ˜ÁŠ@¥¾žLxºâR‡Œ¶n@E5¬ú ¯/ä£3çGßnº·|2åÈjí‘>Š™ßÜ®G{:q'òöÜG„{†È¨PÖºç»ÓJWªºáoyBZsrvà õéqÿëÒ`Ûœ­ï$èIaÒvxª¿Ö³$.žífùS@×ZþaRl›ËÃÎetAé #òì‰%)U¸7ÛL²aÕŠõOÓŸ˜ù²Þ²3aŸ¢kQlaù€7¼ÞŠQ*n<Ö$/À`Ù/ß)Âý©‰{€År$VBíÚUã}õØÇ¶ÉEšèÏl4Fø¡òj ió ž:µŸõ½T¹ëWììxuÖ :ÅÖKBµC…³3RÚi¹’PýèÁv•ÿ&(‰cQ§Ôê ÷ß«­Ý“) ~°èæ,ÂH ò›ä¢6×þkMËo%Í,ïK³s4¯­¥ŽX*0—CŽvØÂÄ@èÍy‰ßmÙ]Ö®ŽTC î:‚¨b©ÆÓŘ•©ñ¥kyšªs"WM³–±ØZ?ë PCô<;±Á¬™Ê‹Êl×>k t ñ†%ÕÆÒ!OCw4FÅÖqê??M2ë¦' ºôpöðÔ=ÀêH[ÇÓ¦B¨Ïûš|`ŤhùÖ9ÿ ±;È"GDt–`؈t6Ú¡öLªƒø“çM=9&¸ÊÖ8¨-Ñÿ„—RE<ïðzÖO HÇ8è¨÷+s?ŽõÍ]nÀ`VÙ}“ïq¾¥äC½’DÏãdÃ[2¿v•º,‘>¶èÞZŠ+stýB&‰'…ã@œ¹pN×óËãBjÿ+Ù©ŸeœÞ·‡Y“Ó„ÎJÍ'ÀŒ{Ä •öîIz´™†T"ºÀÙÜñ#Ùq|3wØ»LáwÛA-áýT2?Á: —üÚîD#³¢£çIx`²Ëü4pŒÆÖK)KÏ_#2|½ÖŠåcëJÓ;ã *˜¶N/'m¸é XcQ¨(ù ¤$¨Ó¬”}ibýɽyn>FÂåey¾oé“`Dˆ¶Èš„°N^þø°üß$¤K¬Æc‰:3C‡gºËtコäpL£=Ž˜Q”ú2hö±™Ò‰ÖBn’$€CGѤ9_ˆ?ô0DÆ\ gâ ý«Ï…£'ðOã8ñ2yCÕp½ûËRjÉbë?íO´Y{À®kõF5&i]ˆzÒ yu»ˆPU—ªø|\¡3ÎæG*>ðP<õás8 Ç Ë«H&çf(›Bü“ "©ÙU©Ö™zI¬ˆœee¡ÁT¦Lcû𲿬ð³Ç»Æü¨-³œJä8Ñ€¥û[QôóüæVѪÚÁk„ò9.Ä6gå±PÎþi<1î¶#ƒU<_£"#þ¼ÊnÙ»÷Ùyì2Iÿ-äUyA©´¡ù,qsü0=äÌÓ¦?¬®~—Üjçk/›¶ô4éZ#Þê rR€æ–óEøyA‹_Øsø€y‰Óþzn^&u)çgÚy^¬âƒ÷û›GÀÛD{‹rüW£gÇ*+*Ѳ3$Ô³ä¡ó³m¥—Ûð ³{‡¥}LáÏg_‰ž˜ÎóË>Σ†šç#î{×€•Æ}Ô‡$å„-•Ž4*ì4Å¡*ƒ5¯O¼¶·UÓGV#¨$tÂØ ,rj>f ÝnÄÃJ?ô9EÁâH~w³'NDÑÀ¸åó•MãôC_šbáU´|t$‰ãík®†··ú[½îZq•Öïá}PDd»åˆ=Z›0ªj“àþHy‘§ew¿é€?~;¦DZˆÏùÀ^†Ž-f ºÄ^àÛàä°ù]èŒM=ÌËÞ„åëÃêå‹á[ßqË Z¦’ÛVyuyªŒÊkþ‹^ÝWõ_qÔà0þwÁÇ».’Mÿ]ôÿßÚûÿ¿µCÿ©«úÍs„— À©þßñ€Ù5t%~ ázÞè›jÄ-ÓŸ%ߣXéŒ_žÙ6ëÚU¹¹w´!˜GýM4W‘XZ–ÞødÁÛÜó@ÓOÃAŒ1?é­€¶¾àö®ýÅçíŽ]‰NYÑÇ{t­‘î=!?*²IÀé|©lí¥{cv¸dø¶ _Ú €«d×µžàñ×ø·L ïÀ´Å©Ç1ªo-©¥ ¸Èn0Ø;÷aÞª% ïÈ–i¤.ÀUö‡:Œ|2Px¯ëÆ Äɨýâ[p'Ÿñ#ülIDÅŒOfPƒ •*®hužðZ ô. [á¹s>ÆÍÃ(E3€0õQ€Fâ>Dû¬Ð4r©ˆÈO¥+bN¡Š¼c†À!Ü&K‡ÿ{Ü5TnÖ©:„%1…bù‰ÒV g7Ü_ûþñ%øë×r“¦ã¬ÜoìL…$`%ÍœÙ#Ý’LLŒf›UHÆd…i‰‹~X¢™ä01Tcª¸·SˆÌgA®þ÷IGç™7ºˆ÷T×Û>å#VQMrˆ!È'6µ@@>e„xû/·²¸û'°Ör#û糘S8ã %8 Ký:‘¨+7"mÄYl[uîuz@§çÐè+¿2FϧRÈ—f•b9c‹4³µ´ôë¤dKvÖÒ¨ ƒéU$Q]èiƒ˜±ÒQ¯¾z z˜Çbûƒç( IDAT¤ª€ì‘ãp¾bzÀÕcÏ!\wS9< ü8P™ u:´q5LŽ_˜Ä™4:£¬àÿÇ©ýt*Çì4¶7ý€#Šƒû+é8¨h³#õDö6‰æ½Ü„äÌr_tY,¯ÑWI󱼿N³9ÔeްvZº Z4•Ó¸hÌœØbÈð,µ#M1k«]0AÆ&ã`Ä$ùºZ Ÿ/·˜ô÷K±9°±ç Z`&¥ÓÖa¡{ו¨É5ñ˜”{D ¿LP`iNÈ£p“ºâÛ0£À,©–âHŸˆv™G‚Ú#¦ÚÃé&6ŸnÆk^ZÚÎû£Yù²žû@xü³„  G*î!\ŠœØïðn} åHáŒíó´¸ËmQƒ2þ‘Íäg˜×lÙRLÓÓéE™ œÙ÷ÈkN‹²Ü£^ëØ}"~ŽOgûùÁ<Û­¯5‹ã<Ìe˜f~@'#ŠœeZõ¶’Y +,,û";.y¥ÌŽ¥‰ßaÑÑÔN6<äˆ#øÏÖlÃk/cÚØuúMÏÇ ‡Ì ½Ò"†Ã ïK:Š#ãqÈÊ¥=Y´“qÌVjHpb¸õØ,ÜÂjÉòŸzÚµ5‚z*'/ŦZä_äÈ”6é,u$¤\Ÿ±<œc›n´ýÝ_f9AÚÔ¥/XrøV2TÆÊ¾¹‹W5°ýBn!ꟊød[ô|é}Œ}'˜ˆlÓ_xþz“ ¬˜^M¬ŒtÀtëi§‘Î †kJ PÊ×Qñu‚hüSFEUEpùpɲàD3ºo¹wþ ˜ÑÄb˜8×a#õ7¨*.ÔˆwT'÷ÜØM×Q2ûº·ýÑð²×?R àßêv^•$¤™¦R>ÓJ,3×E‘˜wóïïWH•E¯èK›¶b1Ÿ»a¥f²‘Ö>–ÝÛl›Ù¶%”¥âuÍfßï—‚_KIBËâ7¾‚õù|~}KñÝÿýÇÜÆLõ8ö~-at-Ú¬\ Õ@®x.¹c<5¢1ÚR~/—~õ+8iÛLù<•>Pñ>_Ç–ª|àëXŒ$5·Åîkª¡+‡®¸£‡ƒ?=f>(ÒL%\[Eáyí0é"ÒØXK-ºNK4(aÀµQl8°D ÷Þ;XJ:[x/f²¶p"Ñôr ñfbalçZñ’Ê€„§eŸeŠŽ¹N}\=S‹¡ÚGu¡þ–õ/Sg˜ô82½qüåçR€ðþ˽9 ·®/o3تػf‘šâ›—Xßoð•\m—)ÿ÷e<îÜò¿®µÈ(­?$³÷J›ÌÏøu¢@²œJd¤v)l µ;IüQÌóü¤6w\é¯ÖŒ0ÊQÃ$Cÿ½Çgº{5blÏ ²ø5̆N¡.ìDÜŒ¾Ñð7Ó§Îÿ›µßña Î!8–pKG¶X4â£y7›ÐŸîð‰f›çý— U1–A±e ¾eº÷ò,~åÞðÃpJŒT$à{9.…“€šq<ïñ3ç¿Å˰7'”÷Ó~FB†–› !^é#+~jö·;äˉkoJòe¶’ÛvÌÿºˆlD%®d|õ9ðºÕÛæ~tòá™—= ? w.€£tX¦¹ørx–dPÖ„uYJGÀæòÞ‡‰­K›¯¶âY,Íúåófœ"O?1¬ú4üNÁSß?-ùcLÔ!€@씜q—µy«í¬ÃZS~õè²èÛC8 ½eÅN{@û{LEœßØé‹Q&„G(f¼)µ‰º¿.Äþ™Ãk‰L` ¸ñ¢OÓ¹¤%>FNG?É+€qý(Ž›°FÓY‚0ðŽª¹Æ‡xžq«ò®èmMЇ¦ÜWÛ»qH®ÖÌQ@u´ç7IÌtÀ•ÑŒ/ÐÒ*ä„ÇZ€QWÎûO%ú8ìþ!å„Já‰êt Oï¸~qÆ ªsi°S€çà˜QqÎÄÞU9þ$áá–w¿){d×Ü«#@Eþ€ýù_IöפÀ‹qÿÞùõÿœrÉëàx‚ŽTÙ:^ñ»†{‡'Äê¥n §ûSÎ>çåáÛãB%®Þi²ÏŠ%ÝóņB¦‹¨G2tlNüÅkXû)&²ÜN¶HÓ¶ˆ6†]T{30>÷9acŒNù]šDí±´Ö¾zù–Àº`dd±/7VûsJÿ”ïeÈü#?Á!Ü\-@·«å55ðòŸÏ=[-q«Ã }CöŠ¢lâé€õ#_Væ:ÀèZ²p!¯äÞ­$_µ’î ­v:d|Ï&Ç÷¾0b QÝ:„äTª-Ó¿±JʳV…h;Ìcûgä‘sNKš©y³eLêÉüîþÒOPdï@¼0@L“÷b4‡F +¿„)Øf j.Æ€"%åQ³â“ÓtžÄa¹S…ÑÜì¯êŽ0Ôëô!ÚÃ!Öýí?åm©b–‘ƒBº «¢ŸWcžÜzÅtÜ ïX8÷îèüyÿöç÷J±ó4Þ% N*qG‘(È«Õ ¶¿ÜÞ9*¬›ÀÌGË;g¹:»Y¶˜¨ Z÷²q+=ѩ ŽªË¶uúxçê‰õÙ¬9™}^ |ãwÙiéÁ¡—‰ïÈô!9¯”¯™ÿÀd¡µü$óo—ÍíÈ…!<,·e³#ÞŒÇo¼ÝM§[°¸ïªâ<þ^±j-¥X»é*nJ6[Ãb¢_SBEìz@ŽtR®.*mB¿¿{¦%/žŒí­¢Ù|«ÿPè3“TF˜*¢ª®Šûèb;‚È/‚%Pˆ-îû Ù{ïýüRÓˆ'1iT Õ!ÌßvÙ“A—ÿÙ{ﯙËôŠzbc}÷æ×‘ü—£­°ªº”ÂÏçó럸ÚýmDº}wü¨ÿµ÷¶¯¹áÁ¹@ êO¿6º×zŒºå¤öÔÏæó˜Cunqèæþ»ŒekRÏ»¨.]%s©¨¨ÅB§}}ض³@7{è;ègbnЮžÄf~×zfY]«—4„Ýgû"OO½£Ž¡„F€Oç½Ë†5ý<¾µÄ£µÆÁ´ÌÈ¢AE“jô§6ªÓ¯YL½©W¿ZFÐA´*!ö;Èף鄺H†éï~(ûÿÓ]êÕ¦p…ªk Øq!/q Ë2ÀÓÌb‹l¬ˆ«rTâÂÒÍñ³Û„b¢:Å)NÅ‹ZæÿR¿Æ„åŽú%§{7Ñ««"‡øÄD¦®Z| *òð½w¢b\ªØ©qù&DÖ7@Áí);yäësy¹]}—(?Ž·7?hSÃk=´M>‰ׯh0I©Ð0Â9Z¹í½€øríÇŒÊ&0…Ö²#¼û(ñXuNI†·¤?R»%&žúHn¦žb·ÌýÛò¸ÅÊÉÞŽi‚E3ò¿³UqŽäC²¿&À$ïÂþŸ°·P óç è8ƒž[hly)2ÄÞŽ©`j£¬v=ôjc™ ä——î 2ƒÕ”(m‰>.4{^#~‚BÇ ¾` ütÔ2P·(g'5Oµn(Ú¯¸Au%ÉófÓ›èÊüòǨ *Æeñ µ;Òúkf.‡hØ|‡AplôÚO×5õø@X»Æ/ÞçqåueÖŠ ´<ÕÓxäÈžðRÓžC/}£§ìÍa ¸ž`Ìeü+'+íƒÇlzé2§pôãààG£J™ý¯'2ÊíšÃi€F¢‡²!JÛŽ=Y¢ÙR`.ѪxQ°?1-ƒ<4Ñ+¹jÕÑëÜfµtt´s 鯨±®Óù@óß;õÌGý¯œg*Ì̉,žî‚ÉiOÃųŒåmaÿkøPh›é—ĦNk'Ú>§lÞ¼ÇÜìK€k­%²&üýûëÜ1“½¿{û ‘?Äá-¾Žl¢•A±Tc›~ýXP¬.çÜ«Ð`IjrÉÎA –†EЕžþiÓ{ûãÊYk …jJeƒ~¼­ÃWñu~¾G¾y ®bþ6‡L}À‹d ·ÙïïžE+£À± ~¼Z\o}MeÖ¼ôÌ|TÕK¾ÈÎ÷EI‡BUµÖÃèvËþ5q&/Ò~…¢RxŽaÆ Óü„q%fª¢%Æ$Û¶Å ¢>[Cs{g…ºP,õßä{Þá€ÉýÃü½Ï(ÀÁîof¬ü®þ[¼<¯¾¨+¨L>éPrãƒOHjM;r׳JÜ?ZB§?¹ªo܂͌!§'ï¤ûœŠšI4vø¬º ¦’`Äc|œÚ›²Î)”¥¢‡4îã3Ck"a¿.ÕôuÛYW;ÛGM.Êð”ZC)ôÉÊPí¦Ù‘ÂÌÒŸU×Äd£†x¬Ð_–ìBÓI8´º‹­úô託ä*¹å×C*£0‘Åyä&ø#É*˜ê§ö•шÝcÏòp9?s.ŠJêpp|)#"ð\"ÉCü¿V¥¿)­ª^•ËrÜñ'-”JÀi_8ÿÄ‚ÇÝüô>ŒÒ&ŽB•;¶°÷Îås×—m,ØQt|›äÂíU£…¢1¸b­Ṵ́lm®fœ7î`Õ»ßÖʧè³úËì´˜Ë,Arž ô Pårèʱý»Oÿì™{M2ÌÌ%ÐØÌ+„PUWgVonrvL9ç9dT3†@ö\:âkÙ¹ÚZŒ›(vá¨ÆÝÁGŽz†ð)»Nuߪä‚êúsŒkÒÊ ðXðQ\_Âu¢À^k©~4ïÀµ{ŠÃ Å̱÷£r:qñÄ¿·w¼–-5Ž+4Î> ¶¿÷w›Ù˜x°Ê‰Ñ0årÝD¶™‘¿(Ü`yl—ŸúrV¸éá‡M1ͨ°¿_Ãc»T-QpåŠ/ÕÂ.c8C³DºÍïþo7)/üŠEØŸ.åÆf– u4z£NŠgU4þ¾:º‘iZ]°-$ù5|ü×Ü17ãxn¸:½¥º<„b Š3¼“·ØFÄ!ªH†#Ũ`S Æ=”ˆBuEç¨Ð²íë] ¾ˆnõ î´VU…ä4Ò)\@äè;ç"kU¿%bš}·®%ÀRÝæ­æÖi]KD6‰„v«„–àcÅÈ‘¼x«°Ö’Ú2?³Ñ ë³h ²•ÿùÈ)dh!F¡›³‹ÞGkɶ¼G˜ˆß_3ÛQ¦ÂQë ~MÜâ`·}“of{‡M¿èZúë³–®m{Ó~ÿñÝü±7õƒôÓ¶™ÙRD™=£³w4èHëi{MÕü94br9+E=ÈE Y¦9T]äË[ÃìÞœ@ÞDÞPü77y{}lúÿ4gÔxžæ·Q {à’FÜKBR¶í®4ɧ²7À`êG'빫æ-OËÉjþÏlê™Çõž­ç” ;6®ýÿ¡UæSÕŸÅ ØIÁ’Í¢à4àg/ÚY0ßCçxóû–½ýƒ…ˆ,Õõù”dlg‹²œ"NÁÁTuEg«ÛÃmH®83³­ðGÎæýÙøW_-µÛDËh_‰Ùº[>‹‰6°W¬Â•«U"DdƒwÀ«kYÆm¤Ÿj’t²UÁ*õÎ]Є›¹Fçza!a´@I è ²š«*mO¥G5B=ºVY’ÞSµL”H•usËœ¢Él_À©½öW6Ú¡U¸Ùsâxb.UWNT5,ÄIЊ’üA>_¦4ã›]´¢ÐmÖ¥©ÚH£êúì«_ßw'G×y–õÍtÀã¿ãh9êYq«"Ñs$|_÷f…GžcÙ÷ñx>á­f ©µ“ rœB‰Kt¢ÌÄÒ먓x¤d6ýñô£a®OwYò倊kZÑŒ’›¾srAÎîW쑞+aqy•­…!ë§ÿ¾í<·¸”…¾'oðø[è÷.áìhÜ1 ÜÑ9h°áz:\€6=ð–¶cF:–1œòRybÿ¶£ð}U&)޲‹æ¶¢5_é¨)*³&•ƒ-+GÏ3嘚ôض{sßÍê…ì~ÜA‰¨À]–,ùÆíUÄ,<+dÞN}¨õ¬ºà¶z_2Úµ/ô—ŒSÊ‹ú)vâC¥1^¯HÀW&Wîx¹z¼œ÷w-VÅscÜÃ^• wN¥‘)yª™´ÿzÍ:j£NÁ ¦IOl¸r¹ÈžB 8ô›nm'SŽ»MD­_If/D®kÀÁ´ÖÏfc½Ó ïåÖcÔêÞ¶±t©Îéëh''ð´ÿÔÿ¿ þów¢áÿæÏÁÓû#xE·OøÏSý¿2÷ć_^Þš_etÅ™ib~]Òæ¤& ”³ ´ý:Ga}þ ÙE¶FYqAMU’·§ú¸1HÀp‘©ÀAQ\02zx±NÌØö¼óýg JÊ”Hõ§Y!ÞÌþÿõÝo€AHŒi1f@ }>,fPÕ¯µs?Üaµ¯É?œG”Q'˜áyHŠ ¿+¥‡?}´¨ÌÑåBh`´+íÈpà`TÕKëdó{É E›ù“/™%B2¢Šwdøþ€.«le!¯ýF­^X·{½ã“ä¨*®{ɤ>dTö}œ¦}Ö˜g-vK¾Q{~ŽŸýfcç ’Çdóu§éŸf.¡ùD1üæc‘ËÌBïõ‹›$ãÓ™öJ÷ú=C¦"Õ ‘Mƒ|4\##¯_v„ÞG& ·Âþ¹æÑkÚ×X£¥kゲk‰ÝÇZ˜Às¨·eŒ%b¶3ŽßW¥Ca"&ؾÌY„`‚üâMî%mAäû{o³ïþzU¶m«gäWuA-, ™ sè )Š¥ŠóÑ žÙeÔhò[D¶QÌ•/®µþñOݯlàÀÓõ¶Ô•>g¾ü¦ðë—Ï>„•fõ›P²oIOìÊ÷6 ÷× £ó^š*êɃ)N£¼‚^Z­, ‚ÙƒkiJ±¸4ž@¨Mtl’µÜœÐ᎛G+íaÂmu2pý|Ej"~~Êrþ]{"OÑ>íð{ïÏgŽ.Rk$¶ØšJÕjIÅ`Õb– ˆdy¦6çc ŽeU¾z70{¸¨õk˜4k`TqºU£"t—açØŸ[WðÍYaÈð=Iò÷×ñ>FÊZ0šmù~¿^ª¡ŠòAªÏx1@1ÛèúElB)ÜöÊ¿ô¨w콿¿¿¿ÿþý5ÇÙi6 f&¿å«¿UU‘W%à%ÔX-­Ë³ÇY¢ÎÑže$Eôõo&ªAÉIÕ¥Ëm\{ÿÞÆ‰iؼ©kÛhJ(øL=2>ú¡'#YQÀkÿªîš·cfyEw`²Ëf`óçàd(5.ùñiÌ{ë—“ö6ï'Q]½Ø¹#„Q¹¬v»aŠ&ù‹Ø§©¿QÛ£*ÃERjz¬•´J¬â¬[EÛ|¦ïeÔªjË%kéçóù|>Á—a¤Gñ¨J V   룿>¿è¨­Í½¥"§Á_†ßô?9LJrò¾æ÷H Ea½zuXùS{ñN_D©}|$Г˜U] Ó†í].>ɰÚSZaOÚɬ“G=kšä¼mË-}BA/I~Ž¢ ‰ QUö†×ÕÇÄ<# IVŽ5+)MuEó‚Ü›š‰ÃH±Dp¢±¼j}£[†9%cþ+QÁLªÊ°>ËÁw"z 49šç ? µ¼m8÷5ðR_¡s¿îŸ Fo Í}/\F²»æ´'a)ÞL…ëÇ¥¿!êÇÛíÔv×yLjÈÔXõôÙÏÁã4ÍS‡â0ùWOò.i‹ÈˉAäOfo{Ògù'¯yÑ[´`.ÿv¨céf-•þÁ¡{ü¸HXT•ï ®¹3 ki¡þ¨HäqO_Nÿ‡?H®?*mÊÇPâ!COÀ€C™LêØXC^šrIÈç@…ØA4H_þŠàtÕ€©eR‹L¯v‡ÙŒ§Gø*è+@"x•K·ýú¶ÏB•n쪼kÿZ8Tú˸ÛpÖöAf ’Lr;gS ‘š'º'ÆÇxQ‰Z FOLƸoÑŸ¸§SƒÿÁ9Z‘Žd\U“Ž5KK!‘íæÐ¬T;4úCíGÓ° †úi¤8½é@ʺˆòr˜¤xrÒ“÷ØÌêY ÔLjf :ë²Ú¼[„G‹Ò:2ø'Hl"Þ IDATÞóFz®>ÚLOb®‰çx•s:øþý›öÿ¿¥÷_þ_ ÿŸìþbàÅÓôæý˜ô/Çñ­þÿû´ÿŸ&÷ç+àý÷PªLôˆæƒë¬¼³‹bn¤K›Q‘§=ïð'ÂPögylÃ%kÀšÁÖŒ¯ ÄPìqÑIÚ9Fúi{Ê÷å£á¬€½G ð ÿ{äÅÕðzPŠÆ ùV+ežY,N aýÒÒ:óšl²=ú“žòâ{EÿvC¸¿|àuËÊÜ’£Ž¨á‡Y®ª/Q÷òÈ‘ ÂO|œ´wÛ~*zà'Î6ˆªá‰FWͧäÀÇŽ5ÇÚ3©.¤0¦]àu[e!GÞ% úüõF21±uy’.Üêxs•IþÄñ:µ½KÅ“ÍÛ<ϼfãÐëó€hÖ°-sïÀ×hþïÜ«¾7¬ Åäaé9 lmõÙ…]Kk>Éœ›è£È¥à™ö0GÉû¶b};½’NV—FiVÖKqØSZertB¤AsamQü’õÛvTÍÅöæiá=îoLNt ÖÜr±Xã;“âf¢"Y_Š^¥–%B¼T¨&»é^nü÷ÆãðŠH†“}èq””‘¼óuÃușA±m ò¨í¤îYsQ¾6WšZµ|ÒÓÞ6gv ‡ïNAήÁSõ3dte-µ\˘™œ—ÛË6ÈòY¸ãÚ¹òx!.°ª*u›ØþÊZ¨~­*¹úëðàwsI,r b1]Ý¿moƒP?Ë'^^uë䦮ÑÐ'q ×™XUÝd]ÎZ/K\º²ðñ‘ihâû˽¼³â÷ïßþêöþš™ø|V5®¥öǨ"l²šyu­ ÛÀþ~ƒJDFîqè¡9d­á¨?õÂD¥èG›¦‚ûú¼& ‘È`Ä쬢} £ÏBÌaMEåî&¹G, E>ÉþòàÈm[u„ÌqLÈ3Ï*YàEö„jŽ,Ww@šMdqô‰m[´6ã%ÿŸ»ì®È ÄjÒ0˜uÄ©ï”:/t9Eü̲øsÜX¡ˆ1ݱàh)}Zy·…HÓWUh´Í%Á=eÈ e Y›QŸ-&~}6ÈA߯*ÌQä4µæ³Fý!€¨.IˆeWu7§–Z¯à]×.Y§-|™<>éo3¼hxÃÿãŸH@iOïÆÈ‡ .ÒËϼË-'kj§Á䮟ïè÷ŽÌ³ïyº¶3/ó'Ç%1ÞRÏÈöm6A¤—-ö‹—r* ¯†òkƉIy³6mlÃAÞÚÝ€êŸÅÄÌâúwï¯5ý,é¡Çcá­ÚK©t<•£¸õŒ‹>R‹ƒ4阈$4«ÌÆz4 `ÄÂ,C;2jE¦`ξTDMj< AƒÃóìÙ¥–}Aúç«=ôc È·G›çŸ_^ø/woœ‹1£?þê<²=®~îõ´ûzþ•½2p¬?äf= ª Žb'¾´´‚š‘ÎrI8XYà› ¤«Ô‰\¤[¤×8Ýj'Ý‹Ìà=v`!è…§YÇ´‡Y¯]÷™Š¨Ÿîê¹Ærz:ºÕáµa¤n Á€»Õ¼ªx3êÐ1³Ð¾–ý¹Öc4ÁËãÕñV­»IªÇ8 Wýÿ»Ùþÿ_¨ÿ¯Žø×ߊGñïܰ¿ ~.ˆ~ H6Ý| éøë9ËÎátí>ÊlÊïÖéd­~-äó"áÓ¥Z•Ø€+üáèŸfóklÓH‚HÓáå Òqнi>>˜Š#ôAhtƼF¸Í£ yÚ…*bâE”²|JŸÝQcTÛMèC ~–'˳àÕ¶ŸOï‰X®G(pÓFCÑÃø¾Uûÿý`©o üP# 9©>óH,³Á/Tu³nÀóóžùQ-¬DêGB©\e€§]Ä«[ÝôŸXñ€~E¶Ö{·q’…”] îl0SUGò’ظdºEÉßߦeA‚¸³i”½¿_Û*X*Fe©8ùÁ¸Ë'C¢ ¡˜:ÁW¹¥+À2äq$æ¶vç$ìð†Ó;q ¿@3l³3#‹>aN«†3Zæ:96u}óû_Ư3´¹Å€ð»î¯ òupËþZ4ÄnÑׯ1† rQ\ÙêÄõéÓn›ÆCÊŒ ¯ ØÅÔ_´Z2Áv‰Ëö—ûw´Juæ4†ç¯ôÛT&„K¡²lÍBôWˆ¹Þâ»aQÈ]úôq‚×N¾ÝËìcliýµ^]±$¿B ó òý)/«eðI ݶ¿õø6ÊÊsŠ+›–¬Ñì!G'rµ<íÿ¢ùU#Ñ[sÛ@’_Ï0 ºZrô³Öò¶&Q_¨ºT¿Ëâ2¢ A~º>ÙaÞq.’Û¾’KÐG;4Ÿä·›¸Õk²×gAÅv°òc%V eï-,qÙL+ó¡ &Ÿ@49 =Ïoxn<¥³-Q‹ëoÓødîSL6Û6DÖyà)£¼©®µ–®£ã´ÆûìbÔÁæÏ1 FÍ»CGÞ{ã|ˆèüQöÉN¿ ­u¼`Ÿ°í˜øI¯…;çPö4©¦]Ó49vgì '¹²™ú§!Âcñí„g@…V¦?U„ôQœ1ÔGq쌔%sºP² ] ùùþ;€é¥‰›8«Š˜÷V‹Öxúažªk-¿ŸÃ‚”åP³³ÌhÚ Ï’únøPÌ~æñbˆ@(Òî/gÒeŒ†6ˆ„E‡Ò±Ïܱõp%Ïè‘ÖRzíG|ÇfDð²¤iñY¬øZÓÄʶòи^orXsg-A«<˜¶`<Äë|wd{УÉR[U¥f­}À)k~Ã#¿æß zƒ*Ä ¹­á6/72týKÁÓÓg.ôs«à6ýjNx«mT,,‘íGõþ/,±Ýòj Ñlî‹Ä·0ºyá4%]ž˜Ñ¨û8)è-NšN Ŧüy²éÈ㜥cÔñ·ë¶³¡˜›8šA.-ù–?es×#S k¨ÿ‹zá dâbÈ!˰¹Aš’­Ç|äT4ûI—}|¸ò®‘Ì[1ßpr´h iRÎÊô>/¶r<ÒýW|Ⱥmìdf8aA$ Š™†À“s‚t¸£h8Z[D>‡àµ(d&¯t*Ê%qLBÌp€Ïë9[C¸~^+ã^#„†ò€Í11àð‰ HA؆ýŸ—ÌsMë³R:ŽÉÀmFv\àø*K[+"K…€ÙˆPâL²Á4Á`¾°Ìµú¥|€34ªýÐ!›‘¹jÝñ¸½h>Ȉ&$(?M–Æ(#bšCŒ˜ƒŠÚ$t£o)ýr‚ÌeÂÐR§,^“¦Îã/Îmð }UmbÆMÏ÷´•¼sÛ_…#0’¨ßkF„ƈñ²àxËO<«á“WåöþÍ&øËÿ}ü<®ž†ß+ÚÓÅ¢y~øµ/”âýñ¦Ꭰœ¯+Û1®çã=÷×ñšÙõ'9™ýÕ—vJ›ìˆÌ‘£ÊðO–‹ävÝGåÏÙ¤Œ,ר”a¼ LÇcQi•ÁÒû_=~5ÉÛËu•‡$…•‚*lÇ{çló6<_ØÑsçQÔ‡³€oaR®8/g9ª@çœMfæ«·æ Uá@¼c(nmǸŒ)Gž¹À¡˜§Ô\ªžmwž€÷ž½7š:¦‹Æ¹—â  ÿ—=hžc9i´ãthÐÈ/¶&ªÛNI%ï@”—”76˜ ÙP`ä˜ÌEïnv|F~:1ɶr¤ãg|ee£ÏÖX?`š!¾ˆcÚL§ ÅN²­Í¼îc¿˜cÖO8<Æ&ÈDUTÀ®{Ò&#¸ïóˆxe¡Y4§·*ŒŠàc"܆ÏòuOöNÓQuº"ls‰^16ýtVaR¾ÙìÛ5ƒê#µ$›@—FëéRˆ~–ªæö&øâÝÔ*Yª,cOƒã6Ð0ÎïµsôBEÉÑ èç7­ÑW ¨±°m·„_ãê¢</dÑ|¹V8”·™š¹ðJ—\›¶L|¡Ÿ5¯ þXØÅòΣm­Ú+k‘<’á®sWg„Éö:{Ãb3[Ëb’œ<¨@Û%.ÕˆRŒx‹'Ò œÀŠ"~Μ ã}îƒ3µ‡‚„€[íüA"þîz“™ykXÞ¸Ö…“Â:“kÔ¶½å£ñíl{Ý«:FÕ‡4Rö²¶ª¯l*X¹’øú}<8Ì06ÍlŸ³$ÊÃQ¢IPº"Q!ѳjU]úÙö-µÖ·ýjÚyroÊò€ËXo$¨>¶‹ˆéƒÔÞ»õIˆ.ýüúØøÚ܇ÍŒÛ 5EÎZ¢ûˆ¤#‡²ó¢v‰5áš_GÖlNr¢$D=jÇÚvÛ|H1Û}ÃÏ·/Ó>XÉ&Ê›è|>ùãÖÒQàœµ >èŠõy$Ц™ Åk ü!êt‹5³«†G]ê!qÓ¶Ç-Nþ^Œ–p:‡’ì‹íŒ¤êò®‡z‚[­É8».§½ƒ+Xó‰j´ðp‚÷ÃÛÞÓ´‹ZŒ¦aŒ#¾¿÷GuýÒúÎü¢½'ÿéQ´ÙJ² êAð`†\=’†žhÆtøÑóÖ^—Ø”1ýâDÚo±&{bÇ´v§.FÄ„ ÎV›Á°ÑÕ+”<ió°ÜL¹˜k®Ñ˜#‘é ÝZG z™aº!KւŽºòw0<!κ£c23VÜæÕ¢ˆŒ½A§¥Ôòë°ì y£”ƒ_TÔÆ™l¦ŽÖV-£ðZ’¤ý#:Kº‡­™c¥>æèhÞí,m¯‡½QÆœ‘½ ­?.£½$Y9ÝáÙL Å<% ‚;|)ß}õÖ_õc7 ^Ÿ¯aü ÷œsÞ&Öç?y·FÞŠÈ p´}ºvƒh1y!—ò¦µ|Â6ü×ð¯@4w?b|¹Öäe ÛâÔrÆXvÒÌ.­‹¿zœæÑ¡M@G¹pó»WIÿ/;c{ÿzÎFjíati AõèJ‹-Ú‘J‰TÓ›ÕõÒÄÖ‹ô­hÎÓíÎÙI[‰@tÁÀ1t:—sŠÐ°©IçÖRæÒ#"ˆROX TAÓ™Mè Q‰J:Ž`©8}»þÛž!g{Æq­yƒ î©Éñoq‰TŸ÷ƒ4¥€­‹’;t’~ÀΚ¼}Ü­%Wà ×§¹é ‘SçúöGQ Ç<•æ?‡ÂyT Ž­t„ý'le ?åòduÇS¾jœ¯ø|~¶ô?R`…j¸„ø ¤ŠÊëuÜÔx×à.ï?õá•ÆQÇJ"<–nÞý(¯®+þOò^bÿÿÛÀð¿>Ÿ¾¯ßÚ?SÿEnsðËô?Z´ŸßÄô½¾Û+þì½<H.wU=5qÑ÷µ‚ül_ÚPóQ¦I:nJaPé« ÐF¯ýÑwÁsŽÊÊŠ¤|D˜V*TÔ÷x±Hyg½xT\¡Zë:éÐ, 8WCÿ­{øHý²gÝŽ~±‰Y™ÌË21€W½ðã»*r6^‡W@Þ‹_þ3ã€y€÷#ÙÙÓÖGôA·¯'–Ò“ÅsDœ ì ÅùnŠÍlA>"¬^›ªšmÏ@d¼ZR:æŒ:‘VþÆOAœ°(vzµüî¬Þã<õphê=/PRŠY£/F nm?Ž…F~ÜïÒ–½¡6±8¥ÇNŠÄÏ¢]³lÅàÍ…›5püºtïí[]s.J]І_—´"¸V߯[×·ß‘–ÇÄ(ýÎm¥ÞîB ¥™ÓR$œÒ«KšOyØ[2ÝÊlª×°ºÞd‚Œ÷‡uwz 4„K) Š>ß[ô~vxˆC¹ûÞØX!ßvéÎYº­]«Åý€±&Úîä 4į’Ëm<\ãè®Þ³½)Êï…‘æs°*ªKÆIgÂ/Åúµâݨ¨Ö;ÀWÆ6ÛJ²Â~|©õCP‰v"Ú’O”¥šU‚Õ¶à×â@h†÷ö£ý¯ðÿý÷Þ;'KeÈ3nÛ{o3’N µÚocìTøºæ›\<—É‚cG혉ˆH4bÓl[Ä“¢ßQ“ñ{õ”慜ˡ½YÌq £ T¸»G4MAUç1LMZ ·­H8ûÜ[í[¨æµÔ!užK´Å Nš9¥¥ÎƒáA§˜m—´x•aTq©T+w ,W†\F‚è—ºÕ „!]êGÌk @oúµ/åq0¹gV¸¦k®\@tE6ëDˆgd^UE·D–.] þÚßßû·‘Ô¥>«ðÒ¨®o3®ÊïçGÀ®ù öކ´ß{ïýÝ{­…Ø5ég}–b}–.…w²òcû[Pÿ”"!·tÀ(0$å ºxç>èPþ›9GÓ4¡¦0“y˜i¬ítŽp“É2*k¨‚íëo½Ëµp(VæŠbŠ~T4æ¶W$®$áÓ›¼°l2OAêÜÒÿT0’"b2ó«©’£BæZk!C½Á##UݶÏSE²wy ©ªY£ùV(/Mv iÊC®‘jæ…ó¤×oJÿó¿S£ÝâÜw´ÎõÓùíÈØ¢XÛ<9h|€dŽÂÒ 2pÃk[âêàà§#ÂÝ >€ÊetèrˆÉâ¾ßËgû€“3Ó3NøPlcLîËÄPõ¶ÙÃìpIbx¹(6/_&ŸÂª—NšŸ¾Æ©'w†AŠhÍIØR<u Â7]êG`8\õ÷±q GüA`™ÎÞ°äBl‰U‚ƒ°-³<†3M១úTaÉôäŠPæ4´£{FY¦Êg‰êGÄöÁÚ£u;G2b·ðrÊ_ü^\\DÂ?Ý|Ô îáñåÿÀÝ"å®À±jÜnÆ'bB/·ê4Iõà«viU’;å»pøØùù$¿nedˆT¯³`V^5~ ƒ˜3ê¹zô}ûÆò{Ï}ú&Y….l©Á¨4s©²G[úšÙ毕EÔY€žç´ps@Ìh;ë.æ|€ší„F%½ƒø7†é±*%¹>k©z‚ÅiJ4x[f›ºh[¶Q•ö5.jX‘½©f¶Ö /üÙ0R!Û ¾¿ý¨®ˆ,ù¬µ> èg}ØÆ³÷•×ÌbVªªÙYBæË&ïW©~ĶË4¦W’Š^=s³ŒÁï’(¨¡©Ä”Bæø'êKIœåë©»Nö¸·Z³rÔ¬¯Œ0ùçÍ¡ªì[µžŒS ™ UJ9”ª•ÅØR#_´jœS«rŽWSá‹g²²¾T|ð¸Í²ÕYûÄéü;ʈҠëðÍaÇü¿½Fž8Mº£o·Ô™tVX-MMÔfrÎ âd{ >|ª‡R ƒdÄdnÖ ‘¡Ëv·;vnRJ£ XNŽÄÎãIðD Ué-Ó¼`á=ûXÚ¨ÁŽ€6ÐP9:f•F6÷©HÝ5]‡œ@¨¶^…滞›(Ê ÑH @“~‚œr»‰¾P²aj~s–¸¡Â@—}¶’iÞ$õÊr»½ ì²R“WEbÌjòÍcZÁQÓ:1³âøÿp÷n ’äF’¥ŠÂ³¶ÿÿkw™•}Ð+`Y=ÃÞY’õ@Ö%2ÂÃÝ ˆŠéÄOAQ娪bVäkón!3Ë¡$rKB$öcäü8úS^½y˜µ’Àá#î$мÈAò—aÃl ¹u25¨Ç7QÜlŸbªpBEåhøl÷sqËX˜ „õÐE »©äXÆô~ ®‹ ¶˜ºòË…Æöpˆ¥ Où•³ìaxݧEëxW/šïưVùµ7þëY0=g#¥([í³XäÄV*y WÃg[ºòÉP‡ ‘îÒ<‹»–ªðb^="݃L”%G²ó- âX, 4%8Ço¦ƒ¤;' y³oŠU3šíQÀœÈ­8cz#§W¯Î8‹D~5— ‹áLCÙŸÒÏqO%ª/Yñ.óÂÓù_Ð…6“¦“½A7¾GĶøV)‰s&5ˆGmwÝ(ë©…¶!Ó÷6p˜7\À»Ý§;3*`Ãj…΂]Z‚¡üñ¤¬ŠVØîê)†ŠGåÒOFí„A,}Ô„?NˆZ‹AiÌÐi=+àƒIã ›®Ü6Õ)΃âõç øøÐj6F»ÎÀ¯µ,üóà?·øøç¼ÿ2}7k«Äuå0?æ>ðÆ RämY;6³'Sþ=}ð‘Ó˜Y®h*:D9æ •…!F|×ïbÔ{¯Œ‹U5}¾mÖ#¦PÞh“å›i"¤GÔæ/ˆ£Ž„ÌP‚Žq¨Ž”WBª¸uŒn"?1‡Âwú§ž#q²–¯»¸,?c­>]qƒî,?ÇSøgªÔ¿í€… PÀ†›ÕüöHr³'rfóTÞqÚU5[õRKªãi›Ú9WwTfºª‰„å ûŸ€žƒqC]qtðÁÍ€ÛëݹÂÖõc"¯½Lã¿m[ŽÂÍÌ<$ÅŠøÒ~Úƶ-§øÈ§R›ËJ8ö¡‹ÿúf¦qG§¼aÕìÌy«›;Ú’.â¤éO²ÖrQÎþªþì?F;cKç\én¦:`‚Oò?)fÛzW8H> § ç˜ïµOµíÜEÊÕOõ³/aÇÖR¥¹!©®åt1oÀ¨I6áò:Nnl͈ËIé²þ¹|CE§¨Ñ”ÚDø˜”V/²$9aÀŠûF@ñø”—¦x ú×gmå?äË/A,`ý‚ª¬µÌ ¢b"Ð`w)»sàpôçèþ÷¯¹¦k±\szOüöI»GE Q©ZÅ}¤èrY3~™g—å IDATäï0Ë œ«§ t}3·ÿ*k“]Žù¥C£A7îô¸5ÔyCKæ¼o›>0•R¸C%7JRÊÊ…M¤¸¯ƒ¿…;@Ú½j¥@¯[ýcìV•ªõB­«®•ù54õ“-+QýÇC¹ÄðÖ#/-ù»P4ÿ Ø£JÿÙ¾ò¹¨l@̾f£1k¡kÛŽòûn®ö~Îêoþä>žDÊÞAp­˜WUýl™ ¼âB:ì異‘h«pŒŒ¾V1(ÈbÖ¡›J!Eí´2ÛþlRèT— ½ÿPó–Ѿ¿ÝÞ;·(9n=ÃóX+ïƒA~¾ éX_Õ ³‘ðN=x8¦n ¨kéB)¶­V×Ù®g–ò»Kû4‚äUb"}\áǶM62µâõѼRµ+33¨³“óˆã3¸’ìùÿ8§giô¿>†K’lGŸþBVõˆÄ§ êÊ€~eß’Çü4Ò2úb›Õ¤Ù<^ªC€ZX““ 6ÃqÀʆŸ’è-‡Ê é[ÌÈè· 6Ýh¯Òç¸^}ò µÍ¡UU³7¦~£iÔ” ZåT¡Y¾”ÓRœIÊbp–û½àbHƒY.„*çÈh…oÉ3/ŠLÎ!½+7MÔ|gŽæÜé víîžÏ+¤i’Ÿ@|WZ'¶Øè®dJÄisG_š¢ÏC·é(~Ó‘.ràßßù’ØÌD‰Lrœ…Ðå„s>7PE¶ZxÜDd pJtþÉæÛ—¬¸x1Ëïm›ux6UlôÚ#2rÍŸÃ_ŒÄC£¯OÜä ©ë›$Dz̃͂k72CN•—oœJá÷Ÿœ°<œÙˆi½Lî䵊ú¿ø— ààûàO:üM½?+üüÒ0º_þôKàá-¨cÓE†çÛkãK¹1 3S>ÍŒÅ>vã¨$Ûšç‰á™å‘>¬s¸:-3ÝÜ7-l5ù¬êܶ"|”Jõ=“‰‹9a´5Q–_Û¢:Âjz…ʲ/|IL 3ÁÄ¡z?í8%þL®Ri^ ß\çî~a?ˆü/¦ { œþÙâ_kû/t™KœÃQ­JŠiÚ¼ y0Û¥õë"%CãµÁyã }]Çå´Íü;!ÃÌÏñ [nL܃‘¶” ÝŠÃ7!ÍürlÃTX.æŒ.µñ¿¿)Ú"]ñØö˜„ ÄÍ[+Ã$1V-ŒŽŠí—áôPg€0Ö ÿG”S,ųy4X‡ £¥£Œ5<÷e욢*mÜFUY ˆý'k¾a.-ÎÍYšªðóáMkIôÞ ¨{H‘î$ÆÄ) iW ŒNkw·19wk;«¯}:ðu…Õ¬’€r È—ØwË6ó2mšxäDTC½÷ÊTbÞF¥4‚Ü6oïmÛ¤4ÆA|ŽãÊòå‹̇I¡À¡U±»ò5[¡ó넨o]y$Rž—@×ú¨boÛò³Ê¼"Ò~ñ~JaæQäYÂ÷‰§% oÖÖdÔWí\2pÔÍåf4ら­ƒûW;bõ¢`jZìêê€Òñ`¡EÕ„\þ\‘¤L“fKÛOÙ`Æø´°ó‹¸Ã³ÍDªP(—¥vŸSëXN]MÞ›!×Œ× ºß4Nüw¬ÃŒ“j¶™še¼èجMo?p×ELt-A†5rþšcé(|`Üq]ŠM¨«I"šÈ×{âÇŽ£˜Nñ s ¥Cõ-'*¥ÿX…(Eö÷»3aá±¹Vg©ɻ6R­ÏÑLÔå­’ßz)·MS}Öàn®•zâ ÷iú\k6-,>ÒÌ@#«Õ¼¸÷‰æËMŸv8Ó×Ê¥¦oG£åg6 «áA L¶XÑÞÐ…*éM¸Žän×WÏÆÔôñÄ/¤Ñ–-õÓÖŽ²‡î bôŽvÀ÷`³?¹ÿž0óîësV(͇„È`ÉðMÙ5†Wú4Èœ‹ ÜÙ».„¨™aæ!̶§K3©¥¶º•B’Ë5"]Ëÿ9aï¬Õ8zºÈW²|w€:·ySK’Á9‰ýH¯\T^(éñ&™™ï $""]ž”£GOÕ ÏŠ{ô-w¤þ˵š5n®¾ê“øaƧŒ!‡Å–™ÕsÞûÛ( ²¼×UË–3¡$=¦Ü'ýµ† 3(Cgê±vU^]xþìH [,6°bµã8[û'frXlQ-ì¹ÿa’Ÿ/ ñÌ¿8NO}ÇITζÀSQ:’‡"ÀE ƒy2›oVQFc”/`”w–ÁW2õƒ]d$14òiÅíÁ9#‘ãÔP~ !ŸÇÕÑùNœÄ%‰’myûéyÔ›üЗ7ŠSÉËlâSÕ8ž’~-‡Œ‡ˆs§­×ŠTÔzõصL:kªç“üEÑ Ô&;Ü d|kG—¶TØÎJùÑ# ‹·›£·€ÃfЉ@“—xÊ<×MÁÇÒëšö6R?Ë]’çeŒÂ£b,I.1»¼GXšØú‚¢þÌðÝóö‚>&VÁÇC8"tyÅïäƒJÙú½ÈKz2Y ‡^$7Wúà“! Yáœ?æ_WÍe/b¬VßnübpG¯ “õXA×\ÃVª æˆ zbšVˆVhíHê2<}u1¹ #ŠAFä­ÛãEŽ;Ñ·I\ï+^ÿrQføç‰·öˆÞq‘ñÕÎÏy¥p¤GTÄTþkþ·ÅNüQýý»W¥~Œð:=x…73ÿœ4ðÑ@îØ^š×]~/$ ¶k|ˉƒ¡ZÅ3µïïšö›¬1*v-Lu3MTÉÉ™NÀ›ŒLÓáââõ€üì˜&θim.#—ô?/ ü'Yþ9Ît£;í?¯afœ¼9MÅçÇOc©Ît‘`‘&ùÒë2v"å È˜,íƒÅè-‚=+fO•@_X©±ÆóÃs4+†kŸ GÕ«IúêU—ÿ^.¦¤sC½ºh5D¸JP|\BD­Ä8>)Ûx´"fÑ“.’^0O0Ç\ý'çA¬2FR—| ¸41þ´ó+;وÆwµ™™ê÷ýf3¸±—B1†ô:[;ч††bûØ6ÃwSª)¡·^Œxƒö°äí*ÛnQë_ŸÊ)¦Ò ï ¢>%’µ>9éû½mËÖâQ—ÌTÔdû!Þ2(ã’óƒá6n33O3\$±äþå3LꥻIGR‡Os¬¹ -ÓæXߣ~ºˆOužˆ˜Ž1süƒ?8X`QY+fòÄžç¤U£ðkYÅôv:EÍ,‰›§‰×í²$Gç´†ÄÜÇùâ)ø£¬ôã€ö“Sº/[el…b<ë¨Ç¤Ç|s©ÁÂ0TJ5ßÄ3Ô²v=™Rö„zãnwV³Ž l-ͺºŸÀùWcBÔ]U7$ÇÃ3¨ð>éïVÊ„I33²Çpßñ\ªòÔŸCǘTY}pˆ ղ뎈ՙYMƒLlÊ1†,Co<ª^<™ÓÕNZ†Tßj f-Œko0%DÚg–zô°ƒ#bà§gÑa@æÔ´f*a46¿ä²ý£>ï6ûI[ºHn³s0Zü7pXOPµÑÁ|<{9Ÿ©à~×xv]Ê/¿Š>S~DÂ=*Ù…éläd§¼+ׇ“ÿléFÉ“öQyeë,èåÁ'­˜Â¼¯l4 F2zì8&E(DvŸ¶ …Æ£Ûì·"Îrkxà Æh5cBpôë n@Ç“wT娗èy{Ãù{cpüõèŸÕ¹SÓOpŽSÐ.L‰Ÿs7[»¾ìËÀÃ7sY¿qV^dT¥­)<ÂM)eµ¼éT—õ"™9p\¦Ãñc’ \«ÇD¥ÕÒñ†iýG’â€ð7%Ê‹£P‚ ©d®¹¾ví{|¨–/pò@ÐqÊçÅ´)ô™*q6ýí…°vY 9†òxA áPŠo± /l€ËtòR2ÅkKpÍôÛYÊC#|JŒò6'ú—PûñO‡ŸÔÿ×wôÿðæB~èrÆÛ‚Ÿ‚?æxd+÷ê;×;¤ëOß4õc,Šs|‡À\6ÏáøÖ½uôYž•(niÍêw6(U3Ó'ÃqÝO£0zN¢‡rSÇM¢…R:³'hîNzQ¶“X¡6ªðµÐèÁÍÑB”Ž¢G@yh2ï<>ÌÍ÷ap'{éæœ»_÷ñó~®õÿæU$‰:Š]&Hf¯Ç?UšÔšþA´žÃâ“Ö Uc{8U§ÚRXûÐ1EÏÀãðŽYuÇ©íÔÁåiÂh³¬Ñ¬™©)>¼¶÷Ý&yXʱš×FÃ~§bÊ3m“›É—&ø^™¶¸hΉÙã >¿µ/kx<ü8(NÀIjîØÁL~ÿSº¯¯,’•Í"Ì*a%˜© kÖ,œ&.Ž!_v¶ÿpUŒ§ËˆÙH¡µÉ)j刌Œõ[T©6$ŸÚrÿ”k´GµÜ—Þ±‘DgÈTï 1WùáA £‰ê4ljöÏ9DŠÙTÑdûƲø¿îkÚó(U­m²´(;ÄI9Þ6·ˆæò‹!AG^CƒòR“°^ª &næ–áºaV®ª°¼iþ·"Œ?Îýí‡ùP¥ÑWÝà¼@ÓÕýøÁý¥³jÏ‘=<Ûg7efòwÖ`ú‹;„†2Ms;?lÿàhûz;ó¹8 ä£7q~ Î/—x÷VUIìô«ßBâSYâiÿæºn=»• ÏK¦—š`:ØÆ„#†Á,lÔºs¥Ÿqžd>f\<@E¼R±¡1Š×/[” ôÛ›À!\Ì žÂ *„N‚ÌΜaJƒ-èÌO¸ßð²AÁ¯ Ì£|ŸÏ-¼ŒÎúz›Ñ„ãQþ¼ò.ÑŸóÃï_8Í0¯""xâ\Fq•òBc†VrÅQLNJ²… 9y‹oi!²…õ‡‡è¢â*¢>Aº…Ù‚ž¨·Myz„2kÁ\©4!)˜ Ýy?æ{‰@u5Ïpr˜!@®›ç³’'è,2¹Æ†ïóâWá] &ßuxÞóÅØ>΢ ¹j”çï<û<^ù›Ÿ›þGÁþNý¿Y–Fÿ?¿!^bo?ú­$óU®-ý5¨xz²Ô¾yw¬}~nXg ‚½ø+¼Ø¾è4®ñ…¹Ê—•DàÜá0)4ïõócÑý”fXŸ–-Âø?\c¤í8ŒÇ`À'êÉé&fdÒ©Î-Ð0LcPߘ‘K/:Æ”öš*~t´É#ðˆtôY³wDî?ÂGàÑß üƒ7äßo0Ou¥×›Ù0CÕ§«5gÁHU×Z—Ó%{ïàÕõnÞ½-ÏêDž é”­t±ô/,÷Ámæ=sÛÒ†Iv,¬RæÓî¡n3„Z½!SƒU“ºõ«=r~/Û½IŽc-qGrD¡¦Æ}VÈÃ6=¢+¹E ²ÚÆÕá©ØmãØ`&Á«bݲþuòÎH0‚k,ž"®Nï%عô9ŸZólÉQR•–·Ðr¶9âˆêŠ@!**´p¦õW…H€ØÒ€)eJ7ÙöŒ¤{9Á€àª¨i•ÄU‘¹î«º„fØ`âGâò Dlïm{Ó:–~V´©ªöGÍU»ŠûÄâ©î¾ö6ÿ÷q²šíï×ÖB°Âs±ÝV+\Ù gÙRïF¢!9è,2Jg‡² Âq)ðŒ£l!]ɈN¦©1Ϭø(>¿þR…7ɽCñl"+¶[_±/í¯e_ƒ‘¶cЧÞåøÝAÒ¥85œ„Û2¨**ŸÙÙQŸ²ˆ‘Û6Í`–gÅû; ȸñ$NuÛï»ÉÒŠ+<á5Låtò‘4 \ì׺K§GíÙîg§Ð(H+ÄÍ ÅcïÑ5â„,3P× czÅÞ»pd* ñh²™£ôÂ}#ç"‡•Ѽ’€°qÜI±½ÓaÆWh"ÿn#FÉ4OŸ˜‘{sQUŸó‘½fI î*P¬¥~Üú¨þúüZk­õñ]Ž–È«Ñ?ëÕ5"”$ß=-õÃØw[ W„bÛb/µ~Î@÷O¶ÆXÈŸ¼Æ.ââÑôª]­f,+Y?WÍbÛ#MÖ!cû£V?}ë¾åù…ˆy¥ÀjÙæíÕ nVoî´ñ=ã·âÌå]²m«À æ…ÝõÙ|nŽ^ß~Í3Df÷Vdœâ‚§èR.‰1z³’‰޹ Ãy«(Fð›n;ƒm2gSëmŽÀã¸ñ¸Úø¾äeg>\:FCãW9îPûríêo•E˜›°1¯ÇyÍ(ZGÊÿ¤þÿ`þW²ÿÿóêÿÿýÅûÿú?Eðã½öWø©Vœ?¸»¼ú§ïa@ŸÏû$z=Üÿ˜nÖš,“ô5¼*ý‡…ŒÛUþ*¶Š˜šÍ°GMh6WU ”fðÄ¿S ªØZW›‘°‹øz`cs¯çÖÇ¢F‚FJsâY{‡–µ/À1´ÇÀ ¾©üäÄ—ŒCÚ ¢\;ù¡Jšc›ý,ÿíþí@x’¯b+ߺŸf;­w`cdˆZV-.ñùA\ {ï½÷µ˜Éø@6Dä4J8“`Ó¿OSÏj< •VžOöV‹ò[ 5øæ9CÏɸ •® a„¹åý¯(Ä1¢Õs“×ÜVâÜaèY¥W3K·¬ÙEÓŽ"ŠEï§3N®àΛf)@§êe<³ý(îùo?pÛèÇ®LfÍÕU%ÙÍ'š·˜å€(þübøÄq{ÖJTËÜ~|üÍT _OYô*V½@âgÚóªdcŽØ{Œ§Æc6“-Ûä£>eÁø­XT+¶CÂ5*WE±¨ î¶Ãg-\å …Ëhpq&>iŠât'…3!h”åâpóôÑLèšhC–†Ë[Kä›’ŠïM?ø%ú㎡„CÒuÀ€v?{ÒÎæÑU­åÒÇaN•”•U—ª7(Úïío¬~Ñeb´¯ü–ß"½²Ø—slgÈJø·ûn ÍnU#þ*É × ÈÃeæ5V÷†SÊ·Å Û1y£sËAÓMꮇT·D„žhÃ@&"ÞQùDAÎ=jšÏÌ·ÿ,Cdô,;‡GÎÈln¬ƒÂ¬Òg4þ –C¬e9Û}x7³NTÀÅÐX©Ü‚ÎÁVÔ]( j[¼ªÉ}©;<û¯ÒPÏÔÙo …£≠VƒøcTèþjUa=½'`U 9oÈЀE(äš ˜‰ÈògI£®õ×ÿõ×_¿>Ÿ_Ÿ—½øÈ(Ôói !t÷•mÛ›{‰õqýÒlúÆP}õ½÷討ÆažñTJdO'…JVB «3Ža¤È+¶ ?Ö˜ð¥ê†ò>sú©òló4Sk›»Tû¦h B›åÁÍðn'›á¼GPæ½5Æ5BÛ] |>^ „ãcµ´¦ªr’6èÓD‰‹ÝöΗ¹…Ãmà¶d]}gKdñ±Þ¸øß›ÙZ‹ý+û¾\TW#õqõûG> ?ËËngSÜáỉ]^[‘ù§£¦ÜC^:þÈ9¬‘ðŠ|Ó(žìÇlÐËe¦.q>Ó+@פ»Ç€fBC…;ºFUãpCYKF¡¯Õ2} g{™ŒqÜQ LsØ Š%m¤ì¬Yá9a¥õS’ âÛ¦5ä››=•Œ&!çya în jðŒjG·l³ivP_Ü=¨hƒ ƒƒj K÷ÎÅ2ÛÊ#]é ®1«ÍÒI?«Éš¥S>o¾âظVcs‹ƒÙ„û|†¦ïJ‘Øe’IOÔ͇ÇãõÌç°Ó¸©Y IDAT”î¢ 1iLOSéˆÿ ]¡EÞµúá ÅàÇF»&dÑ¥i)jt¤œ‡à–[Fäd>íóZ¥ÜSÆ)°¦³žÒ>L›>—×¼‡¹þ8çgÎ…CãÀãÍw§|‹{&ÇEs;Xê´]>³0Ș2p¦1d§Ç§LÒL4ºÑ 0ŽsÉ1€jõ]ÆïzÊPžâçO³Áã¨î^‡7-/Œw.ž·â!rØH¢A1&&}³ËÑзéÇ<ÓQYRçÜÑÎÊEá­¡—tÌ:dœ•cWžE‚÷cKŽGh`.³¹¦ÿæ €<1¢åеVܬøq÷Þ»ûË÷î™zÿ¶%1¿ßùLJ)’:ŒºG¶ =åúÙÇÈkæ‡x»öרmÒ´Mð‰«Ip‰æéUà×ëaøT—ÅÐ˃{ü|tàeušº—œÛeU­Óèm :‡ãÝr>!”}íø3{Á5¯Qh¢—ßl˱1Ô.¨"¦8 »L‹£BK& ÿÎ,Ⴄ?Núf¾™V`Ÿ ÀhìÊ *E¡Ê4©Ã}úñóÊ÷çN}ìÄA ÿ@nE}«‚MVÁ DXÃbB°­º>²…Bw?{ ˆUÕs¯"òQ]ÀRݤƒÇ1\®F!̺½ØgóI¥2ŠÙŽV‹ÍµtZÕ0Á‡²àƲh KRîüÔ%‹r›¿Ef íÈ@1oó~ß¼B!²…Âòˆ%òņm÷Õþvá]'›­àð¿ØE|MÕÜcî·¬WAªˆ|–ÿqOɯ‘&›†æxø²¦‘Ó…øœÕ Û7HüÆIÁ‘˜a+áW&òÉǰR©&%6w¸nb¹ÂÞöüpÿeíòc¿£ùC×o°eŸLµŠÍy¿Ôç"ºF7iüòþ G†|‚(–É2óÔƒÆåèžåF³¯>z(4JÂ@3{ AeZÔƒÕ¿cøkžo,cï÷Fo¡^u~Ûô†_³m"¡×Ò‚©ýµí™[§Â—Äõkñ+Ü[È¥ú_ýõë¯_!Ýzz‰Eð:´µ2ôûGÌ‚Fn¿M>>«ÎQï:QRÇ™=ÔÕ½w¥QâjÜ›þLT]ÈâWVN§<›M„;üãQ·çukTϪ|E¦mo½vËq‰£[FD`^Ç¡f»htQ¬Ó%1¾¿D6üö5Ÿ4ôd¾~´õ´4š¾o°ü*»‚b']ç÷s‡6;DU-êxÌÈiØ9£Áþxˆú0ñÛVS®¥óU¥ú¯ªª ÛÌ’„û8TW!|Þé1R€…e!h‹7F›èN3sÅÜ%—Ó=\bQÑ?p †¹–Åm&ÀÇÅú–Å7Ú{{„LäJw&—ƒèyB+Na¢"+ZibW´p‚;pÅý45‰~ƒEu½»-«ç”R çÁ‰Õ#Û];œ«Úõ)e‹(>¸ùnö:; /w²`ft‰j@«~©Ÿ÷ª#"Øâa(9Äc_I»Ÿo´Ó€j(Ðåñš=Žžñ&y5•?ÒÂ/fD0ªí#zŠŒÄ5j®à1uA±‰¼Yï“à„wtyHìs<Î(Е)Kù<ÉMKïylÓ5ª†_ÔûR~8Lò8wý䟳 u†€·|0:™˜flÕù;eì —úT{ÌÒñtö¾;âqªuù¦²vÖ=+ †V6jZIk”’ÿ­ÜÖÝ#žê¤UÞ˜g¤-ç“àÞ+?`{Æxt.O“TRA›tá Cˆmq’R>MO£Þ¨-à>Ø”>èƒÐ„¡O²æ°Òx4 ÅñèžæÕ>ö`, •0èî\w¯yADÉFéÃÊqCÈ5¸F"ÌÌâYñ8Fã9O/®[£H38=ßÕQÀWx“0YTèÁb¡O#øø-âOºVÎÚ¨?–‘óïóÔ#˜ž_䟙j7%ó m²³p³R±¼Þ¨Ä¾2#‘UÇ×…¾<’S¸œùil”„Õf=¨¯âöxš°«zؒǰ`nöø6çäðÅHxÌ1“àJ=ån|ýékåŒE]«Á£ÿ9·hq×Ñá¤Òx¸†ƒ‡ÏË‹à™ÝúWRÿÿ÷½ÿ? ú¸¬Ü?¢÷!Gq«ÌÊöýù<‡ßrñX¢ uaÈãR³¬®öÁiW¾0ܦòkTq´–Ɉæš8ÞÚt%r'š…¶*ží5õ % X-ôÕËÎBÈkæ¬/£}½E‡ÕÊŒ¢2}ÔÉSD<5žÒC”:Íš ¦Vÿ8¶ŠKUê‰i@øCñÑäèèx‘>6ˆp°ÁÑÄUÊÓ²è‡ÐGUc_hjBªz,"ƒQCY ü})£ó@fz <:âÃõYC,Üš©‰ÆHš}iŒÃ»_:Ë]T”+ŽEY9 UÝûË¡/ ÓZdA·YjŸ‘µÔ&®î¶XZœ ¶bUéžÙ,fW[¨BÀD`‰±Ô²zâgC¸€íý“–mó¨ðFòÆ,HEWmíGª-\®üñK£m#M¾ØÜb˜Ãrν@Ä‹B †o®A"Æ%&Ð刧m&Ž2w† ¦E«s’–Ëöé5¥&™hù@]ZPûšš±ðàa i›0È]ؾÍþàÀ½f$·Ü* ËîX‹,Ñ`IãÌ©u ¯5@ë N m¦ÁÕt7Ú4÷|FYþciŽÚÁÁ"ƒ[W@{‡W¼TCÙUQ’uÙÂÝ÷æÊëOv ¬õÚ¾õ*#â%z’{I³À:dߣK=1ÏzX<ÂTµ!Á7÷ú»UÄXýú|~)¼ãÛ\MÁáB>¶d ›|¬ ø{±dÂPõ©i0(Üùzx‘â—º®®­mö®jÍ6³ƒÝ×ñvèQ¨;›ϰl 973ŧÝ"þï¼Ì/Sþ×– w`Q¬»(ÎTuuÒ3j•÷z&ç|j–ôq Qi$æ -°ñ†±J÷¤ˆWnÊS…`s?÷xLìF¤„ò¢ôEéæÓ wi®®RÌ~ܺx?:"ÿè7'TŒ(‚è¹ ®\ÿE-Ëç ªÄQ–WïÏs?›Ré.C¿«Hƒüú,õyÉg}übÀ6I2?ðž®<Ùci ° è‘â- §èÜ|Múf:Æ%Žc‡ŽÓH˜‘MFáJ]®€mIgÑÊHÙ¶é;Ç€bØßaËÕ4û{¤ÊHµÌYVf:vŽaŸE-¿£ÝF>Dd ó,©Ím»É™{ä؆ ²uŒkÈ:±{Ä™V”­FlG5Ê›ªWpÕR¬eŸâ»CÛÚ•êX­I:ÇÙ‡µë¦9²É^¦ÐÉ p=öR…ZÆà&Ò|½yA¢ËA9˜*ÇêƒGý-ßœÄ84Î_z‚L8 âÒ1i\T›žVúÿ:Ý W„œ é(‹¸YáÄ1øêðBºÅÇT£áŒ} \N”G)Ã6INºÆ´þOï{+Óœ”ÞÃAùoÁ")ýŸXw­Ô¯Ã#© Ÿ˜TÝïLòp*âì@Û!æð¨´¸’wÃøw“íô’¢œo::K:tP<•؇ÄMv¼™ÅŠ“V„àgŸ,$°½æ!§:9î*NҵBÅ:¾Ap¾È™j/UÜîx¤³KyŽŒù2…8²Mcè\ÖœS&Õöíçs&ì¼[7ß•cÊéÿÒÐÙC=Ô¿Fž…M¯¢<±°TqØwÓIÒ‹jE#¹‹ƒ„'F‹Ø‰]>fÌž ž‹ú`¬Ÿ¨IÅ<ÏÁöêðv‚ÜÖ«;~N/“Ž÷yå-g¢M&û«<ðŒlþñ/ÎÚ±Ä_e¡cÁ£ý$ òiü§þ þÿ«ý…ÿÙo‚¿ÿîøÃwxAÿã fýø*rÈû»y»Ÿ0/?Iù_»ç®ã;¥JuPpÉûó™î§QDÐJÒ}_§¸VÊ´”úAV§Å&¸ŽgTH㫳„h¬s?„¦ ¥ #ÙÇâÅœy˜Õ`@ä ¥ÓBÓ[&-ƒ¯5Öë öœ1È+©ç81-y´üo®fLŠ×¢rÎx. Ï–f•ÿÜ¿>e%lJ˰kç.‡Gw‹P{Gž¡ÇTÀæÀÅîÃZG>ý¾»xŸø=Y?IZW猙Kx¥TUñÁïïï «z …éáœÇøÇ$Ö‘Ç¢Ñ`¿ÔU»oî3;1÷pæü˨Ã+/ͨb…qÆÑ&Y˜…·ï×ôæž)äõ«.ä|/â×6ðø£J;ßg¡ŽfS—eçúÕÀw‘`")J›TôÄ-ýב+²i{„4Le¡Q™îûsʼ›!#åŠ*K;Ó*ŸoOù3œ£bN¹‰_ä°È%IKâÁ4¸†ÈÓ ïE¥ÙwSÒªò¨j§VÛ¥å^^~÷î™îÙ‹ì Å‹²]rÿ„üìf?h¢&í~¥BÜ~näØdöY6·Ì»ZcÕGᓞƒy ˆl¶ýÎNçl•ÅAe ì›×9ê2D‰bÈJMãwohÔ¼×| §Èšc-(“"¡ûÇHŠ©¬ñp7Úb"P±|‰Ïšˆovä¼£™Ò€´Æ\yBTh<êRèWÝiè’rÏÅéçtC[ûý›"øN8Æ™ÁŸ²‚£$çé&æ¯^Î1`È“§ QÊf°Ke´Ì4´ù±äH+`÷wïµÖGk'n3p‰Y"ۢĀhsMðƒ¦Ÿ—ÆbÎð\õýe§·Q¦Jâbúüþˆ™‹è6ˆÅ9Yâ*µôç;¤ËS¿­Ÿ(uG`ë-?Ä–( 7æH´ü8–â¯_¿ŒTÅRM£EÝ02†wfµ[‘Õ—Ý×@•ãm|¯Š²Yp Úï“MÇé â†-‹Å~Ï“åŽ}Ï}HS¿¶±± ™&uè¡Yøz(Õ²¿ƒˆÈ¸ÚÎÚQ½Œ®™mŽ,ExùãG_ï“«20ZÖ±ˆ ïñ&q´Tœ^ *–šä–Ï:™Wo¢ÇuÀÄQ>€Lîi-)"´í#¥qy:ÐLUy†tiÔŽiB=Ëת^ ¤ƒ9øŸ{­ê~¨§R˜¿GTöî á™4Ÿm{¿7ïZ¡~²€Ðñj%_T1wfìB©F»SpM.“::ªƒ1uÇQíY8ჲA¶ôÖ2®ÀwõŸÓ÷5ËíGta¸ùÊf™>MlvS{–É]oÔœ:1xìÄ -61n7}P}°HºÀ †•#ÁÈ¥¦G˜@`»h¤¨cÍ-|uIÂ.âQ‘œ@ !ÓD`”UˆÙ\üv »,–U'˜M®µUÎdä4Wó@˜D¿€²Þ û(y5ĺ±i§?h)xˆË3©ÜQáfÈ Ñs°ÀKýqç¡s›LÉIç<Ó EOÉÜ,ûb5–ÿA¾æV<””(`YÝ…1Gò¨º<:“!7-¦D—!Ôí'¥†ªL8¸+†8J}‡zÒWvÄÐâìa 8µß!ŽöÉ5¯¡!¬j¿öøœ¶.*=H(ð^â8v3aø!®¹'‡ß¦V)ôЊƒ>±ÏjÑÈpÚ¾pV¡²{jг‚Aû‹9®(¾—°´Ò@è´† i@!Z À ÉÀó ÚÅæ‡Á·<C ºKR',ëæ|äñŽgÛÏ·ÌÛoÔN€ç­|Í—˜ÅÅcNy¤ÿØó‚3} („õ êçcªÜö¸jñ¾]Æ]Ö¯»FŒhêBÒ ÓÍÆ¬]“ æ²U2Øsz‘$/ÔhÏ(û»×瓉‰¤øN‡ÁïÈæ[ 7ZÔS²Oü8žùeýFÔq…¯#qõ°ãPv¡š;ÊcÛš4™ÐÌö¶ßÛÆ–ÞEày?|+º.É'K;â™uŠ;w¢èó1¡=g17rŠÂÝÿ¹jê*ö– .R>±£er›AeYrãíK£掞žì1› m\*™¾\‹[U¡)ÔäÞº^Žf5R°mwä\æÒÌtô1GЧÃSÏ-’ÖblÕµIû½f›:YŸªÿe+à!™¹Þ UQ@L7ËWï–_UP]¥rB»ºî{XMz›n’Ë`•oxÆ.&q©Ël1ISºVK×´}×^ag-œ¶ñ‰ØDœËòpQÍÑlÞÑFy8™­ÈöýÚÞ^»œÇÁ¬‡òƃ8&öúÜÓ³Q‡ŠMçÍŒ!îý Ta¬’ჩÂÊ\oAÜj ›[¾­&Ùp&«påKU6;3±,À†ÏE6é…ÆñŽ[ ñ7Èp‘Ïg)४˜yñ£oòdY=‘ÓíÄ£'/Ö-y O²JaT U ®?ŠÔïfÔÌ(µ7MlPÿ•ßhÓú À(ÆeܨV¹ýIL¼È>×å3zÂóá[«Š%g¨UI½Gô°j™½#&æ½0ÎzÊAËq²œÙš‚ªd^H{Kf—»PcÜ‘qðö½Œ |d@´øýþƒ¹G&ÜyS€ õˆ DÐ;r'|‚f›×­<”Aò2ßGÕ÷àkU¯÷ÒJ¨x§… ¨º¾ß¯š26íA²¢ÌÝ< ˆñî‹  $òƒ D•ëñ˜å¬Õ4 £ä·áZ *”<ì’™c§¤­ç¥…iÑ­âhi±¦ùsh€)¤ÞVÞƒ—¦Þ²›¥ôf¡i+ô·îÄ9MÈ:¡9Ø©QjcJúîºÇ{R¬ÙXªàV=ìfª+ùúN}f‰Î…}7~)=3,2ùiƨ&.×9–à„Æ— ƺ±Ô„àŸh°Ûy9íŽÓ0~->Äÿ‡ñkìBxø=eVôrŒ/6káÝVy¹ünë÷DϾŠnL_´´¦ßõ[BŠìí »nÊÚóñü§öÂÈt'²§ ûgUòÈõØ‚©Cƒ¾ÑŽ|.eÔn Ø©ŒŽ?Êí#ïÆÛÓJŸ®r„KŽxô˜ pœëBí`gx$Éêi©Ê¬ƒæ©¿!0W¹hØixŽËÙ:’4£z—F%˜ü1ºEìêIº»ðå!Èý-²B¥)M]Ñ5•6¡øùp£”Ö'¤ž7QÔ*o¢å¡ ›ëLs½²Vðl,nsŒœóŒ³¤I.·ÿYýÙWÓ3]1ñÚ§ÎÜG4ÈH;ø¡Ò+‚ÕØÐº1[n¼”F=õ9“µ!Õù4+ÿ#¸˜ƒÎQã•D±ók_.ìàÂgÇFUÙY0ÁÍø¢y«ÅVùß/xîxìÖMÒ눛˜ðEwµG“ oïÛRÉ3Hò"ýËû·9Â¥<Ò\Ò¬†âöâÈ›‡yx7ð€ÿüËÚþÿéâß¿óþãÏî*kÅ=¦ÀshÇàg¹«AxË?ë]æm?Þƒ+ò2øáÚ+³üèâ¹fZ?Æ)òq!»ò 1¼ÿÔUaq+ÏÏ& 9)·¡mõY•4L7v͘銢ŠúÀúÒ4¾žoÆs&aZÚÂ…v¿‡O¥Òú]Ùq P_㌇·íï 嘻´öXƒ®Ñ@©:F=¡`–&þRÔä ¥¦æÉ(Ž‘Žõd©Ó Iû0ÖÇ¢%ÜõÇØ#²0FŠ)`GyÌ|Õ·2ܳ6XHF¼7þ²…ë"EõC‰~qÓ5ZÏÕheAšGãÊÃ)@e$µ)Ë;«˜ùs]™ÀO9úrçÒ5“üªb&Ù­8Úzd/UŒ¥¶-—¬4ŠK#µ¥ô@©´‚q‰ùeà5ÃF¨&Y"×|hÆWÐÅÌÌÅ(Ïáu@…E•QbÇR×Ô¯ÀÐWŸÖéÅ›¤‹ ÷ö.!i{a9ËÈo&U’t`÷VUç_#+áóL·b¶RD<8G×ó9mrö £€àcŒSÌ”µ>Qm監»²rÇ›žØ(ŒÏ§IÁ´Üõ;c¢9ÆÜ]”ÄHg&€Éípû‹xé$±D¨” ³ÚWÁögk¸å]·å @.€Ðš%Äeo—ŠI-4ñÙ‹f NFKW>ˆ¦ØÊNP4º# ‡#ºl4î-»é5v¤Û}ʶG”±$¡ è)Îò(à(ËÐ 9熠K¦(;'Ó01L}#ö(¢2ã3ˆÀ8+¼ÌFØêÝÿùl á›'„|ÄÈÇÑòxÁñnT¶$>½\ mèu¸AÞâÿˆ;ès«¯KŠK¯%±B׳ð¸BF †ª.£êê!!(/P•íÊL98Îà+¿Syñi_ךAೊ6Öh¡ æÀð€/e­…0.]KýÝtNX´T¾O£™c<¡HÎHŒMqœã’ŽÜQxèWNý>Ò˜ÁwßO½Àh–1$ ©ÙT´Øgî#3?T‡fÚ±B6ºÜøñUÄZž¹¶ê¾—js®“ÞÌ*ôŠé»N4Ê£û»¦Œ¹é¯ºè^"ü½Xǃ‹éÅü´>ø¥?î~¿Ûf22Ÿ:Õ™¯$k¦ÕH^(SCöÝ÷W ÈjB+=~ž©\H5-ú–fx#É)æšeâ»J¨æ‹ÇGµ PG^ÉuŒTÙ»LhVÀ¥$ç(6e†³¨Wk6¯Õ§&f±§Ì½‡:¤ï¬õŽÉìléaXΉ¡JiëØ0kY¥#é•ÛŸã²zÃ(ÊhD/ªOúLWÀùgÆfUW2uè‚@ùüVµ3RUpïÖAľÃÚ·á_oϯÈÔ/I¾Î3iOo·A¼3Êσà†G¸HïÎÄ}ª\8ÛEqPoÊO€¾²­‚ÓuñÄLðüZÉíW§jG ¦4ˆØéÜíÛt¤)ÊÆî2ŠÐÓhŒù†—ÛB>gpt;ËÝÃEû4ñ¾ä’Pt½:Z™»Ï¸Êyˆª½aœ«Zކ¤ú˜å”,õ£ébNcŽ[©jîxR_`c˜à ‡f°ÓÛú¼}ÖˆÖ¼¢¯ u³Ÿý¬õµßÖç´%µ] dAè•n82Šª¨Š˜?kè€ô’b´6ˆ$œÓÒW-g´¶Œÿ;þQž¥Àïµ$\ý>ûy6«zoI¶;¤©3³/ˆgÊtÄÔ ó:DSø4Z¨:¨ÑhžpÎÄ0ª&´SAÇõÏŽ&›XÌ{iÇ•eôä°1Ë,ȼ¸]Æ'³yDÍë‘s؆ ²X“>"+Æ"Í×ÕÑ*]¯í{‡Xé|Vpâ‡ÒÙÖŠ«\·„Á’?îA…÷``,>9¶¡pG¦s…ŸØCÏ"šã·Ÿõo/ÍòÿçÔÿýÿÊãMÐCÿ¯B®Èëò OnËç×´E÷xÿýûdÇá]S*x¦§ÓüùƒÓ?«ÎgÒ˜ØÊˆe§Oµk,woZ&þ9s£‚ —1-L½»M:P¸®P¿ÿ8Ò"[(Úþs¸èÛ³vdÈa$&3Ñ^¤þÚcXtº8 òmp8ôßJ [a"8cÝ{›ŠýÜþTÀò3}÷¬“ ‚̉U¶Ý²x®Y*²p¤ Ïz%œU7Ýb4Ù9BTžÅ9x$¡H&³{HðI¥±+=—õqtaáçs• Ûk6v‚³ ¢iC‹L§' çc½ ®ŒÅ•°ˆ÷VªE…FPý̯պ^]R1­Ñ‚Ʋ}ƒÒ´"ô|ØOÀ~Éâ?¶UV‡ÇL#óµòQ ƒBŠÑ¨BÙ”•ü/Ä"D V($ôhØlÔWÌ>°ÃMÍ©•–‡/«)X—Ê„Õ%FLM{(t ­}ƒ©ÂAÓ~Ì­9ŒÀZxGAñæöòOWO} Õšù, ög¡±â’38HC÷3V>›“º1ûؼ;ûÅßN‹¡Zå×­„¿½xy‚i‡Ng¢çý§o9†‹FÆp”Ƶjt£”¥3èPÙDOðB%.¿> •%² S—ÆQvDÚ¶Hâö`¶Ý¯…Êäé_ës/àQ ylìlûJlø*?Ÿ˜+¸Ñ\Õkë—ñŸÖ7kSGŸ3e_š…Ü)ºXÍÇðÌÙÿà¶ Õ;sF:ª_# ‡ø½TifÆ»8Öãâ‘Á ˆìŒ€»!PÍŒY(x˜Wc”F­óR[Ìõ Øûa•ýÓää…ûm©}›éwÙ¦­¸z¡ÕP¬:im½âêa` äÄéðñ¦?I]ÂÐP†TYªüäæ1\»öã¾èûBZ yjKÀò½rqé–Xg2\uéM{ê¡ ×T®ë¶'ÑTX‡¢Ä—ó¿è ö°Ž€t½€«ÿk©¨;Ü´¾”x@Õê œšJ±R¶…[ª>Eþ@G:É®ñê¼"µ@ÒC®ÄåCn7ÃdÝ›Œä6f¯´ìW3üðàÛà>ÄO»7ºóF?ãá}óxNW¬Èi¢érìNN½-1òRÙ1Àß…›Óµ£VO)ÃäÍÈ~Áºò`åón39!ÉÀÑ“‹qÜ)/óäé=† ¨Q /”zߺÈõ¨S—F$ +Ÿ#³Fa4‚³=eÙ¯£®æs㼄BTÇ©‡0ˆ6s‘;®µç͈X>¾ú@Ç\IîÏ"ûÿieÿäOçψ£·9þ_ÐÿÆ+®ÂÆ‹× äíu– ¢ÏÒµÃŸÎÆo¿—÷ q?wsÕP?`œ4ú$2C„c[•âBs*¤v­œt‘–º#;SŠŽ¬ÐþÝÌz è^ºX8¹h¤“öx¥t,Ó¾…®Œn»Òåb;óËòÈCÞÅ¿§Kòðþ[¶\Õ«JÖèÓc{÷ò`:?Äÿ(é?Ž/P…ƒ±S¥ÏN6ZAkÒ×ßl¦-ÇÈO]µs ®Iç.a¶ÚƒMŒ²X>T$YþØ;•&4QÒÁ»f¶taæ'!éÔkwÍÀtûùLYñ†eÍZ ¦‹PÛæ·A7²Æ´Iá4y„Í8ªºs¿$£™e¶\(b‹gÐÛQÐ$gªDÒ‰œN+žãF„c"Ý ½}NK×Wh@$A{ÍëÓƒÉùd‚=t8­³yty¡ˆÎ±ßt}=†:ZN•LRžñìv>&Úõ§]ˆ4½¸O4ÕvnT“mZIúØœ9˜ßõ.Ô™·NÎnUUÖ¨Â[¥lðÚ/pÓ>¦ÆÊØT+™Ô[í\No]Š‚a,—Ì2]2V+B ÓJ’¯±r µËöèQwÙcäo¤ú#‡: šÍ\{ÒxµÀ” GXD…‹4uŒY¿ÈÈ[®H¨d75i´mI¾¦ÿËI¨¾®å$Hd-–¡8få›–ÓÌíνd„˜h’o5³jºglqܪXÃQzº–CNp¡æØ:g™§do[K®²ïGzGZ©àÎuy¡Ðl{„w%«ˆññ:Ê™’ª.õ¢nš•÷S_ʆ ùrÜkˆX˜F³` jžJßùQ,,ê·VùkJŠÑ³ ’žpL6Uaœs MK#XÆcÛ{Y€çX5Íß/Um[9ß³A½’ûqÀÔÌ,UÈ‹ˆI|i„ÉÒƒsíP=  е"4«¬™¹„´·+ˆkù!~äì!cŠS|NŒYÍÞ ñÔ鑯֥ZW†ÅúÄSóŽÃ-#T=¢…v8‚¤K4ÒÖáÜr¿ƒoż;¸™EMƒ¼´AR*çÍ, oáfìaÛ>Ä£ö7¿7Àèé¦Q£ CܯpÓ?þñÿ×ýWs¤]µÈWa°™³]©wÆæ ‰0Q`ç©@Ù5S‘¨¦lÔý>©µoÀ­Ññ/«C…bö?·§-Mší aáô¿IËmÿ¿¡ª;eåàà¸'ÙºÍYÃê_{.# ܨôjtr-ÊWD°À-z\ŒùG^uÆmü,Ç™«[&-‚d_„uqÅ€0!þÕFëïu誖±Ë¡ŽÐ‹Tˆ¶Ò/}æó_¸<ܶ½5ÕD?׉\¢$Êp·Ùò1çTUÏõ¿añôωDu‘âكܰ粣IB0 G™|gÍ8pŽ€ÌîÍ„ê€?UÍì˜r-f îHºFo#sÏQ·?ÌlÛ×ß>ÿøµDO¦¶˜è’üÄ ºp“;Ý®P@”5àëî.~Ú¦‰Ø¦(MŠ™;×äüe{Ä¡f*`j{K-u1÷]}œ$³cóz¸0…ë¥Ùý{lò~ýú•Z~––@gñT™öÞ­»Ü†Êž šyŸH~6¥”7~•ZÄtĺZžwÒÚ&:&ä X<&¬¤ËV]ÚO2Œ‹£Ò¶H Yê~´Èuq²§ˆ&&Æ}ì2ë³pø»®I,ó^„—“fOÊ/'Ìà©bZ. Y“\"\|1Ád9£|d7äÿåîmw¬I’#=7Ó%¬ ¥ òþ¯N´$-Å®pÓÿŒÈ¬ê²gIô€œéz«N“anö˜È¯__F«Kh-Íî‡á?õð?à¨çJ”^Ë×á;Käˆ5·BOêë8ÕyO}Ðëâ!¹º^(Ó“~Õ×·õù`@¬ÄF…OÓýlµk理YoÅÑFê\Aÿ-áhÊÂÕÁ—6ìǶвL º`"PøÓWýÊ»&ŒÂê3SÑ@‡Š„Ç«˜s®ÄEàGÕabì¦íꥪ¬Jý꩸q ú+½OJœ)¶–؇qMM¶Ô¸‰ÝÇoú$Ùì1¢ÇªxWYžâ×¥ÿ$y^ R“$8\Õù5—`OžS{Í®*ë¶Ó̉ÿ—±;]Ž¢ê…Á§Qâ°2w{6Úì°YÏnÞJÏ0CÆ2£‚סê°<ç•û°ÖÈëØuP<3²È›~Üÿ„-" ô ”k$ÏïO4šOáÖ1|]VßJ¡°H¢Uk<]ÝSU—výÙd·ífæ4¼@E5ü.!yu“öØ?ò¡á=c,ŽÙ*›/Zåc@/Ósìa?‹1މ|ªÁG³›__¿â΋Ô:Å/ŠJÃZ~6ò‘aZE >éòÆ÷þ,nó>2AL´Ò È«ÀòÑû[&|D¸ÉÐ̰LœÃ@qV'Šv×Eµïq„.;˜qê‡Ã)ËéJ²U~òˆš„Ÿ&eð})BÚøãÒ7š[ £7(+©³?SLFANt ^µ«¼Ü­È™9¨5Íd°mgD‡·÷_Dö¯Íõ’#LvyqŸ‚Ÿa„®39(y븃IÏhŽdðHü ò1¼2 /ç‰'¢­âƒ8餧Kå{_ýpïÿëŸÄ› ?ÇQøñ»ü¦ýÿ„ä¼ à¦ëßßêõ7Çm{û®ºÙ{¡^®Ùó¨#çìxzÆé«¶I1á@7öïÒu¡‰3f~zb{ÂmÜ@ +¥õ±‡P¥äS]ƒlgX‰¥CŽ‘šÁ×ù± µó`Oô˜ñxƒ«‰BÒ3!rE¥Ÿ±Zq«–˜“«tܨ<îeàžöè÷ØŸç¬Î_w "fÛ¬z$C¹4úÞƒµ×Áæ–@Uó.s>Ï¢£8ŽŠ°>üøáQZ×äGÎÞà4µñ¿–n‡h&šŸC&hÌ ƒÃMt뵯hmÉA™äÖò‚T{LÿÁ|<Æ]‰ÝêK ™ó»UÈ0ý–µ¿Çœ|´pÇ¥¶¶õ0)·Êè _p5É„·J.àN˜™ç½ sàc^¾7\š*Ö‡HP‘Û-&e´öœ=©fÛ°V=jnØ‹ˆ‘ Æ@Ôøˆ‚}R©œUîשÙ`+Ù[2yëÅ!éµÔU¯/hµ1íJ‘áÃå¡UÀE&4ß›°Š»q‹ýåC#÷|VG!ÛÆyf©BÔ„¨ïM*l ‹TyuÖ¶ìô¸çöÉDòš¬³sT¶-À—ñBÌf‰my<£7¤ cu*ÕâlÕ»çÚ’ÉdäÄ!ßļÅ"/Õ‰¸Õíe˜³©ktê¦Ág¥7.:ËüëÌòJó¥)ég ƒqÍ«å«Ê6…8xölOÏ.Ç‘¥`¬îÓ§ÉxAþͨÒëZ@ó,Çʨãh3+Ã%S%´>‰޹ŸÿZ˜¦fF§™@Ì[ÐsþƒW¼QdzD®œÞæZ®½—Uýµ-I+}ïíÌÞÝ3µh¼õ Û¦.½Æ~D_3`MÕXD>Ÿ_ÖR{ï_¿~5ãÜUœH.Àhü<=#¥Eµz¸i,Âyî¥TäËßú(ù/GVÅz IDAT=6Bh'#³f\P E=½y˜j3–±¦˜ä_} g(5éÁù`Ô  ¹ðx.“…þÈÌ…²4tmömÎñ‹ *„Î1ÄV¿ëiþR(Ç\ú›¶qî. O³(ŽØ©ç¾ã¯*)U¶=¸>jˆ™åŠ¡”ù8BŒch®duYtÖ# ̃Né–eœþ§ù¦ÉÃS®ÙÐþu´+@Ð)F¥Iïçö5ö×_¿¼ÀxïÍhÒlê®]\Ó6U±h¸Çj XšGc4¾âÚ§åò^ˆ©‹‘S3 +ƒæêã£í*8©R®S5ÍQŒÄõ$”L@Ûžh"VfŸYÌþ nŒóCb¸¨è¥`ë£M¦He1U¨ßûæuó"¶m¨ (e›—¥ÿ':BbYu‰Üž2Dñ[mÓÑ=•B@kä9²– Mób¢pr˜LìÔÝrÕOë×àÊÐã[¿õÁ©¿O{:{rÊÓä?@È{6é´ÁÕO¶nV(ë éÐJ„DQ=êT0Ðô± k?›)ćh”ÿ¼@gíÆ,°•+»Õ0aø«¨[sÏɵª~HÓWÒ§6Cg;w‚èø7n)“®bm0Bö©…‰%pêsnäS¼aíåÆÝçÀV""s&&x˜u†±¬‚QG³o³˜Ëë^o)³. ¨2ï±ë4zñÐ,r›ã ¿4´2²m¿>hrxàóFÖñà9¨G¡£?²­ÐmÁ‹Ú_6âað9:m;É÷›~»ø,4™ð+CîϳAõ„èdç@l|Y=Ñ|ö~·“ªûzä~(ppÊʇ:[ޱo¸µ2öµüJóÝóÜq-¯s¬¢s8&òùot $¬ü2ªe$äLgZ/y¼šÊŽ2îÊ2ƒë(—CzŽIÇg‘ÅmoÓ Êˆˆvt¾C1^¬©ÀÉ€­î”%žšÙÐ:æ2;x7厹Çmþè;¹”ÂsUú>ÆgÉJl8óÎ.çóѲ$³Ô¥7’÷¸~†øD3ýè=þãåþŽúÞ¿Øþÿ­¦×ìÉßo¹üøÞºï?e +ðÃü¥ÚÇ¡ßG6pfº±üaÏ®j9ÑÿVšøP9koì5RÞ!¢ÎþÉíÖœ’»h¢6Éž«@­’;é=Ñ0&¬Ê :âÓù’mwº(Ș d´³R6Ô>Ú ®íÛl$ë}ÇÜ”qŒCn”_Œ[¼@x@•_®üc€8ù?äÙDþgþÏG1Z¼ÆÙL"Õ…¡à8¶ sif¢KÕ€(~Uaæw8‡§5ˆ'ѼµØÍÇŸ½N1®ŠO6¢sK¦@?l\ ©ïâ<3;æ #ƒØ[^©” 8:³ìŒÄZ³‡ª×$ÍXþœÜ)¡ˆ"ÙÛ‹Î}B–0s›}T[§nó(S_FTå¯uª`½Y£eoB³Ž5yhkÀE³óFXºþA›à,6ø(W1-S»]aþv!$ 53ºYûHëi‡æ'ïq?¶¦Ô¹ÅèÏÂ̈‰}`—ÇI1â ‚ šT%=Åp1<—Ó\_sO¢…vv–~ôêÜï¢4u37Mn©^“zÃÉžäèþ#¿pxY Í$üàžðu‡ãgƒYÞb+" º>Š/oîKXrlÒÖ¬ÕUü·êá,1´î0×1Ö")i;“µ7lŒ㔾DcÇÅœ-[3"lŸ2Ì~æ"&`L¼CvR*ɪ#Ô í‡î—0³ÏZˆ²eÚ–ŒnŒœQ}ÒAbÚC™cõAæyDã“G¡£ksïË¢Ëô5´Ï¢Ç)ÔÒˆ£.tŽ®ý²b¥K²:ò(dCÓ0îp.©Æ•0§Nל¥JÖn»>(K›ÜE1pÝ!SF”lavš$½ªóñá]}N1WóÍ»2gdƒ .·¶®UÕÿŸ€¿üòùÛÿño—ê¿ü˿ȓ¯/»6s`«êÍÕmšå‰ Ðtü»\NÇèfe©?HØÖç5O€ lqAu*¶äú˜ßE¾ó,—@¡rË2Ôç'j¦ÒQLUˆl3¥>Ì{U‚(ºÔQ~bl®dM!ÆÝwV2I£þ‰D– oÁÔBŇü"ôu‰ÆÍ¤»2b´»WîÐÓBW 2šWw‰iL†µw¿Ÿ6ôɵ°Z¼=`ùÖÙ—{']VäµÊNÂÔ1Ø Ž0Æ7ç­1Y¨=t¦Ù"ð—Yã@jƵÌ"~‘}}}‘²m“ÑýØ:ß=̬§@YŒÔÓ—.÷|{—@—ƒ}gÅ›Ñé$K™ÐÙ"â^Ä=Œó;¤±"’[þ¯¡íßñj€¿Í3n)lùÒÆÜÿCʸÙÊZ¼ª3û*íð‘•žz³Ñ)ž[d,Å…$—ß“,ƒ%AºâHi?þŽÞíAÇ# mÊX\Ñ£P¹ò\çR“ƒêÚ'_®? ÐÔYãþ†:lÓ‚ûcŸ]ÊßÊøV+ a‡ïÌÓ±{ZªÞãm ÐT¢|Fs~Ù*Ÿ…5óbE*«F žY_ìí¸¼AÓð~«àô–aË-ãx´Z6ˆ^û*ÕØükÓ]Ló¨ðy±aì *Ýäê0Þé6¢íAVÞ<Æ0*kZ¯R}×sÚmÍj>×’x#,o®ݜ½²,Ãø[\¤ç;`þ^Eqƒûvh&Û\ZûŠwÒlçŒ:¾²@<&"óÑBsØ%¹2œcíª†\̵¤žÅé4‹1ð5?^§*ju gަ(ê§ 7—¸~@zdj-k“ õUj±z¿Ça ^(ÏÙ‰–ï濊ùÄ7‘ìÿ÷¶îåâû?~þ.|ô¹ëä4Ý0¢ÓþD4a<‘¡Ó„ÏÚ-ˆ|G?ï‹`¡o %§é'¿Àˆ˜4‹,1óŠ»L40<¡Kb<àÐyÏÆñx˜ÀWìš›êÓÒgIr¢ý®cnAÄà ‰Ïâb]¾ç x KEG(gYq€úVÌלÌÃ÷Ukbî%¬;}D+ùgåÿˆÈ)¸Œ°ÖªlÚ¾.­¼\eÑŸÚÚQPeZ rh «:xþÛ`´ y˜a닊\´¶i>%¯6³™Áj3Ÿeh_Ú²^c†(oŒÜ®ª³‰Ë™ÈÀ憒-´gö¾¶FÏ"êqM'ß»<,L‡+±2Ù÷ëzÑá ®STu;4pŒºuRº#Ï5),£†´¹#®z‘‚JZ¦}‡¬×û¯rl¿¶™ªŠSŒc€NH¦FDg,gH–9ÓŒ Ï|tƒGÌÎ8\¬èn$Rçœ&¶¶<ï„‚gƒµLˆª³Ÿ´¯ú§a}DÎdk e¾Nª\X.ËX𕵢Öj†¡~»¿FaÆì,6¿Ps³ìN,—vËqNûr$ SB„ô¤ûì½·.ÕfµS× ÛL7ñÄüìñ.ÕºËÇhÚ‘y•rjïÙlçr¦.¥å¡nök í õЙЧÏ&e­Ú÷‹ –w±ïžwú$úiûs?;SWSQKÆNà5¬¼~ÿâ”ÂG¹Dˆós‰j­: ƒt×ãt¤±ü:Xp†H®bŒ2Œ{ š_’ŽGÓÏ"ù«™FéªJU2:Ÿ-®…>ÏÜË/[ÙcØØéÄû¢Ð¥+Óa–“-ÐxEQ‹ò :XÒvm äm1Zž'è1fö¹ªZ*æ¤3t“x~¦%Mó?üÍÿô·óѪ~mþËn>.¿õç³üﯯ¬€%IÄR(Ô ‘ÍÉý¥«z ×öª€2µE®“ÞA3šìÞ>nÛw‘R3 £[RòQ}šjXbÕ'™xŸ*¤õEžä"ŽümQÈRÏÐzNE‡`o½gÀËäø¼šÄÕG2×i ³i GŽ×#òéY9†Rr”=`ºŠþ?w)5ã‘3ky®¸gÕÃÀLµhëÊ 'ÖCè–…˜Ö†{Âãc«](ƒ—"cYxöÌ%Y…ìúèô³GUOÉãZ‡Žg„™¨º !«V/:’C2«b´†ÖÏᕟ#–b)–¶H€wùÀª÷oI›í¾þé=éeer\ Œ;+ˆ²æÊ$Ú1ƒÌ,žs¢ÀÕ´”‡*I ‚¥æ­¡8[ %R˜&/Fw†Â}÷°£nÃ#D>7Øü¶íeˆ!iÓ†jüV; rB÷Ç0ÂYh^¾‘.AY†î£Å’°§tp–ûþàĉºTÄ–yqЏ‰xû†÷¿ fŽ KŸ±ÅvÔ;#l€|Òm /Y$žg¬¢Ê25cË„©çáŒøÝÛ«Ã÷èZ5(5êŸè‡úZùK7 ñ”s‘€ »P8oí žùžÚ ÚÊŒÁ‰#![åÀáŽja®¢›¦6e3ÃDõKmð·øxA0ŽS¤ÌRç¼ìÇiFŠÝo^O%ZÚ¨­`~eµUîMke58èÇ¡FÙwqZx—Ö™Ñê³ÎæT½\·”ÿ’·[­(ëšG󜇊•m%×|€ÏRªà×îR*Õ¶§øù£É]Ñ;Y‘•®¸M»= •Áü™21ö8‚xow|íƒj!9T¾ñèÍ ¸4Ƴ¹•’Èÿ÷…:®zK‚xAž ² ê”Áßò ÔsјSO­XŸfm²4ºÜƒócAW.ýÛ†ùºôJŠjÙû«lÛ:× ztå#fߺW +k…æ14 3‘eì6@½ûx)ÏÖwüàç‘{1ÑóütŽdØ-G §Í.-‘–Þ‰ñÍ7mí+6ŸË‰°Àiyß…C>²m¿Ó`ÿG©÷úÿú•plP_Æø=:*æt?_Ñ^ÿÈkSÝ©ñ·¨Û¿”Cr”Ì“/yò·ú•W[ñ–©<cr{nO7êt½m½œ:,ebVšW³1'µœi¿K%V08y L£[¼¬/Ž™BPkGNjR}‚ÊÀz8¤À­“ý*>ߪáp&…Žræùίá - ç!ù8Øøãö×¾ÿ DÖZ¿|>⣀D‚`Ä£·Tµ¯/“ û’_ðâý0ÆRÍÊzPçùèy“Ù@Y?½ýkÙ¬Ö¾®n¨Ó+C–>[©!„ц‡óµJèf¿°[dXÙ¯’Ë8øGÜ{òéÊ,Pø_s³&ÃýT¢‘}*±ïÊF„;;ãç^öY’ËIÑ=p¨\&eÆ#¾¨F »ÃÝ­ß*^ïDçÆ¸û×ÍC¹ñø¿!5}#ª±À€ÙÚ†ÑÔ?Sü¿ÿÏÿýŸþÓÿœ"kjªŒQºj«µXf‘À!•$è ‹ä8QÖ 4Úncgl Z¨×#Uób·k¬<9ç ¿}ôŒÎì^XŒF›AïK¬ Î _¢X9»Œ]HøUäÕ ûú•{ @K6§ÄO—Òâ~T€®.¥ÈúåóYŸ`ëˆ °”‘²ei|qW²šê°Ì:¨ˆ_ˆK§¬ ”Pú†J±Z“ïÑcï¿GwÅPæB\Ní# Ëáçè‡ {·\¦§ü#á»G´Göv7‚ÌíÄÞ›KCRŒmš›b³>j¡ò.ܪ‹‹2±Zü×,â<’:øÚãìßþÂCÉÚdÕµ÷^îþÆBæ[ëW"µ²cu”¢— ©*[1#¶å+êGýî+ÐÌ„X"”%ðkÒ¸ÍÎ>&Yk‰Ú××öïkf5)´\Ëp`d¢Q¦„h‡PÞ Ï5?ÞûKu©€®µÖgù4Lõ³Ö^±,³|IlºÖçó‹__{c÷Sil7²ÓÜÁ@ ¸‚J@Ô1Y¯{èYDåipN¼i´Ãïí+3ÌvBš›&§áÑ=ƒ8ËÅŒJ¶<›³„É÷ß–Á²bЇ.Æñ•L@Ì-|Ñá/§ÍùÐÏž˜ 1:"¥ìÖeçÎ碔§»E›iÔ4½fã,Wš,VÅÚP ûDU{Ö'Wš\hö…î6ÎqpÜKæ9I©U&¿"Æ]óÕ³Dë>1¨¦ÚMÚ•CèT[ñ”‰&îÄ}g»‘%ÑEïªíMiöU;ˆS—ÕZKVTä \sYÑ¢'AWOw¢fÁãâ-á´?JˆmƒfɆÒL¢p8{1C^|,íÁõ±‰îEµF5(Ó:¦¹Ãü\ªn©âfvªzæ±f£6û£M³iÎ:®YêyÒ[Û.æÎV©R#QD«Ó—ûO¢_g»rÊ,eEÑx òBÓgªçΜžÞ !Qîý­¿¥\@à àys¾HŠxuý2kÄO%ˆØ(z–—u]2eð:0Dï äf¦÷¸b%g›L»„|vͱ!Ïûà;ÞTPË RfØNS7×p` cøCtxDžƒh'¢ @ûMò=çØcäMéÓËâõÈçÍô6ŽÖHLwïülìû%VíngÚLÂië,ÓlÄQ…çn—±qˆpѱÜÕ ÉŒ@) ȧ7Fp{´Õf\¾»Ì>†hèâ ¥µk<<wUÉ–ÈsóÂ6‹‚wµhXÊ!KØ2s[Hdàr,ǧø[Zë!O÷~ߩ֢-2a<%‚Ú¥ÉrÐã2==æãTˆJ]ÔéO_8"|cÖc´`ü­EÜç äøúͨr’‰cLr%Qqnw¥…ÇTˆ¯¥ZsÄöN8щ9¦qzU“µ¦+ÂWëöà#tý¦¼žEâ÷1E®>‹GpŒ÷zŽëEòx+D/#Q®s’ËÆ0°&Û¶P°·¬f8_|ÇV…/]oúúëã]Hÿ«jÿä7{å¿©?ÆNÿŸÂ;•xsiÿ.¼;É&|;Àãeð¬&æe‘åøcà§ ¾Ùñîºÿ2l}è+½Vr`‰²cyÔX¥Õ†·ñÅ$Ř´EÚˆDIŸW$4žDcö=ŽýHጵ,±p1ˆ£*dF«tįš­ƒíòÚp®%x&âï9ÂÛJƗʇ?Ó@D–*? ܵá¯o@ZädÔíJ’[Üæ?5ý Þ˜ëûåo²Š¬’åOõòèÏŠÉ“–õû¼ðÏ•_­Í –Ù=Ûm®£‹+ôkË!èiw¯ûï‹A«º@o}vªR³8d^6ò§«rväI61—ßO-!µVTÕl‡&Ø.¿”-Ž¡¾]ñŰ·_ã\êÖK©j®L‹'’âŽ~ó12µ‰m±ñGÃqPödié®õ”¯ùœ Q°»ÃÎPaŠpÅ÷æ ƒÑHS&jòüÃqf ™}ÆQr^Æ<5ÇöXè],îT¥•­C+”d³K‘ñ½RQ…ÉKUIûúÂô}—!z™¼]Ã%ÐDðt•Së¯R;_Ùô-š‘¶ sYÖœœkäHM ‡ÈµO/¤ž¹ÿú8, •%"Ú×û 6jP©þð·Ü!¦æxœæÈ_sØ•©;ŽlÜq¥¹­|’þË´œU"w`dYÀÛ]]Û›p›f –ëÌ–¿´V1Ÿ †¾x”Š©5ÇgäºÉÇõ h´hj•ZÃ÷T™N˜±Œ‰“âyy'…ßÇ@²R™^NóØ¿Ž_k-,‡i0ÁȨB°øGSH(Ö(É,›©¯oSÁ­è3¡œ—œéã¬'s£FÉÁx‘á9yä¥û±ç—–Ù6—,hG^¬—úeU•å8ãÕƒuTAäC8ÛwO šD‘‚l:éû¸Ñ![r<{«SøÈ|¶“¡_]Ýdæ¶’.¤Å¡ÿÊ>ÆG¤0iS­¬SæaÎÉb¿Ö…Xnèм;²`–Ãå¹´O0WÁ%Ëú[ב×rÄ‘tÅ('ºÿÁµ~ã€õS{ßAÿO`Þ/ßãfŒ¿ý™¯Éý8<›Ì·%Yºtgf{ ûb,È9Ž“éì„+)G…ôžæGåÏÇá­t8ÐS¥‡`‡eî<'O;`÷8"GaÏA\H"ð8AuÅÖ®4sݲŽAà ‡ÅÚiƒÂÓ˃O…q×[îý°4”ÇÜox,Xa–¦èè÷ y¯²Û z¯®âõØ_L÷eîg«l6øáX¢:ÍÊz^LÔx 1ÈE8èg_úÆÑndÙR,i5²]:fY:†¨Yq#§_f‚Zœ£4É4Õ~ɧւÓÚ}[ŸêñõFö¤"õ'ë*Ç^»§8PT5_—ØbÆ‘#ïf3E/ŵ 9RŒç9מ¿Sàç¡&Mau‚Q¼Pø5"ea%‚œ8ù+[3Î)c1žEÝ« ß)´| «õW’Ë*O䉴ïíuY~ 9í5ß鯼$ÛYòŽãåà´ óøC¶Î8{îØ«r‹¢ìø%Ãa™H§>­ a>þ;ãíè+·äy6R>ºjñWnÀ_Çþÿs­îŠÿ[‹/åʃ^A¼×©¿U÷ÿ¿åc Àƒ?t/_ÏÒá³kv5Òr— ׊ð|íÕ`£½»®ç}ÌæK ǘ=X¿Så ¦%i®a¾µh!ž"ºQÖBÌ­ãXç¸\Vƒ}Ü©írdÀÁ ÏšOOÅAJ%R%òë™Ù‰—ÆÛê¡ÿ”yè :„Í—;ì[È?¾‡ýénšÕ¬äƒãïpªºÖòãjâtã…ö6/±KyÊÎ@­õùÞl-§¨Ky:|GŒõ×ý«×|†|ÉŒœ€–‚¡³¦ö±9ãz©»€µÈÎf2fk6EN‰pTô1ͽ 7´ ßw6ýñdF| vç鋊&#çóËÇö*ضZS•rþþttt5¿ÜaDB[ ‰0Àëu×íE9ØL]¡*#•”)` Ç’à5šb³¨-X¤!ïú?6Ia¹µ¤Ñ¡ÓVËfUÃÅ'ÚÝP˜-hûÄJŠM¹ wÚ@WZë2,Ùp²šô/Ý¡DYƒŒ ëgA†ÀòÏ%¢-P u'æ_lª`Yaôj±Úu‹…¼¢òQ…(}H+¢IP ³±DC2V{$|h‡,cG=͉‘K½ê]d{ªÁci«&6]ÿÛÏÆ˜y[f§s×äŠGfË8 9V%^\çpÔe6-ëÄEްôë8ƒ˜%ã"Ä9Ã+[\t NÕ L•VU®([ŒE\k‘¤ízJå¸bšë1ü[tüEHgy¹æ…_ßÅÓ!ùŠ;ó¾Ä($]ŸòÜUM¹ßÇ{A>º´Q)ﮟçºÎ÷1³/Õa¥'±åËw$öõúøZö—óµÕŒöe9M9иb­JT.qÎÕÎßܜב/boæo£z—Yˆ@eïýÏÿ¼! Õ.¾Uˆ`CU?Ÿµ–ªþ"òëÛáeÕO¿ :Ž^>œ ÀP|tÍØfâåY}ØÒ'¨­xåÅ5:3e]±½9oÁñEçP"Ãe»”è,¼;R(;žyGGG:á²:gû1Qsî§Dvª˜u™Â¬¶>ŠŒÑEGÓ;ióñ÷MàtØXÖ´I…2ö !Íh4Ê'—K¾|R‚ÀdÒK ·Æ—´ð¸…ÞeÊØKgàÈÓ¹erš…°«k©\/ÉLCÅ:Ý ^ÇøÈ×`Òçr¥ï,UÈÝêԸ̔ŒCI^l©j±Ñϳ\ïÆ¥¼&‚C Íý#uá®uZ•Ý繦 ž.MÁˆšVª¼ fY¥T»uÁÙËàÕ4Ö­¾«OÚv]¹V{!H‹­oâÞåI\n?ÜQ)ž;Ñ€Šª±¥ÕÒš"âÍy—Ø!Ç! Ý}J-±^°G}åO;2£»8íµÁ0Ñ…zªópiVaª4¾ä›‘òûѬ­f¯_4j¾ºT¾w¬¾¸DÙÀÆF¿"y|­z#§Ã‘&~V!|“J8¦,uçȃ©€Yï}ô?ÜG׃*?u÷S©Ç[ #^¬ÆÄPÑ€bénÚ8’ôš>è9õ|Ô23èÀ­´&Hƒ½'ºäQtœ8Ù7-ºÆº¦½4D·ÂõñÆFŒRœ´¿×‰£•‰´½ÝQ¦š†¨è’g³çcö˜À—Ú°æ˜ ÓþéX³\Ÿ³2T°Gš×‹Å|ÚMZŒ”Íi IDAT`@<. %¢‘\Dm“¶óòéj|Æ=k¹ 85y6*½ë©{®¿Rš‡¯‡ðH\&z”'ËÖu{+ÎJÁ„ÄŽÞ½98 âtŒbn6xŠø÷ˆñèq޾p> ì~r…ÆkD03}1¹q éœýcN=*ÎÉ>{ÏåµoÚ,—“Ãã,ú›ÒÛò͇wò‘tî®nþß7®ñ{i“wîÛ›€[YFNAˆ³ˆ{¯s7F+«£ßôG³V4pnÑòU$t ÚÉõïÿ·ªÿ¿eƒ~·úÿû_»·€)Ä{| ð¼OºìüüxvÇå§YûÚÖ¹ÄËýz”ÌÆ4PÎé@Ž¢ô š}e1»ÊP!@DsŸ¶0NóÜ/þHl@¦…u9ZðC6ÃÕå*Sþ=ÖÜuÛë'[h3!'ÿ&–/ff¥t”O=à·.›8÷œÇ–k`™Qxåìß×ÿûܯÿ]IÖ¿ˆ¸ÿýBþ»¾Ø¸©Ë«Xúô£U¯c¿,« ÙÞþe¯…¾ñ•ª/Ú´ÏNÏ}9?MR5±ØJA-EÔvìÿPBò‡fFSm‰I€ñ´Üõ©à¤ì·ý\®ÔŠdß›X©Ýç8M$ýìÏ€¹NTççöÜéZŸõùuã]Ê5´VVs¯‘6óv ûè¥rYƒ\(…ªÚa««Šaΰ9y«æô°…ÿ¸Š=¼`I[û§úÇÿü¿þÿ´u LÔž`‡±Ø¸1+Nz8fŠ¥ RêîÔB aXn*(Ù¦ÔÇ(ébŒ¾LkƒCÑé˜ œ$-‹¸‚C©‘ K ÛF¤ÁTÛæ‘WÌ‚Z†i²!–âhB6M_q]ËÙàë•ÝNºhçY Õ4( nB{O:·[”ü]TñDGÄvʶÉ6¦Ø“ÛZî²V¹ÒÆ3Ÿî#Å|ŠylÄo^Ø*ýR½»,Êž¨Ç³“åʨrL,R´Zõ¶İ@Ý•¢Ù ñÔÔkm¢™‘bµ4†gj4x§ú Œªx{&eqO OÊ-vMg_ãö%Ø€ €s œ=äkÁ£-y°ˆšTûÚŽ»ÔádªífÓÆ‡°.±ÝîwMv6WÈŸ¸q]HUZÙØf j4öÞÞl«_Jà^¨g2ÝQ;<á…áÅ©#b´½Íß_3¯c`ùÛý—_iôóËŠúîÄäÌY¯kÿ"B~yÆqi¢Jþêl°÷޾_…/©Ç!©( éµÖZJÊÞ»jjÒXš[uÝ¡ÚÓ'.Y ]éüúkrNÀ¡Í!:Ëßæ¸©œÈD@T3¾çè¡(œ #±É•EöÅ6–/™c©jpÈi»½†N¼æ¤õGgLž}‹‹PñÙ7õf,^¼ÇÁhMÓV/ÒŸaØÛ¯±²È*2ô5”‚ØT óûÐÞxD¡äÒÄËÚ/ié<ý*`†ÆF×g·+¦wš™ãþÍGf•½› ÚÑ–lÑÓ9G©¡Ï“â9̉ßÚApªj{Zcy ÈvE§Çj‘îIv ÞN±T@Çún†íØa^xœ ]_©µo†#e(šù’ÜMÖÂçw«NûpÒ¯ÞÇÎ}L8¬éþùmÚ$ŠËå€Á’¨í§üðÄ2ühY–®aˆÇlG)4š²¥¢úãqÇU¢¿#;˜|kXÞ5m›Ý®žCJA·‡B.m—ÐÉ)Ûâw8ß^ÜõA/¾/œ@ tÔ%?U-LD-kR°UJòpÍÀrýØöYeÛryK‡ï -ºŸGÝtÓQÃ5Î.(XÎõÂrG–Bx8¥«²%©‡Ñ€Ð®[J…«²ý Zš˜6ÿen²9l´2Ë^=×'ò5YqŒýc´5ÂÀáëâ¶NX¶ ‚l¤Íoj®ß h»cæY'¹ÊEC]´-ÁzÒ·²ÎÑxœù@´FYp]–8ÄÒ@& ¾H5›”û3¶%{hᨹ0Üьаg6DÁÁ/scf¾¯1(ö“¯5–…c±Žìù6ÇjæÐèÏš^>ܾ޿©òž‰c»vñLj¬.½Ü×?•¹õâ/ž`´çÚYÔ—#úRR’Å0º9ð[Ykhý5Èi¦ë™2Ó¼GóàPRäÅÖá¨í™¬š›Z¯=|g =×O®»òÆ]È ýGò:æø/Ó¾,Ä7y®yÓóˆ|üuº­1ŽHæä1Ti ö¦>8vRBãŒW6)·Rn0dŒ—Ê‹o¿?Ê„|<ÿ*9ó}Büú\þ„ÃWþ¤ã¥€¯pŽÞ™NèQ/µÞ]´ŸÅR,HǽÓfÍ_c3{r®†×r„7{4{̆%mNDËñ£m€>šJt´nž.AÎz§úééÛBÖÒüGëŠT,bça×RB%Œ2Ç£ö¬×_k¶ ¸R¯^ùø–^êt¨ÜAÇ{Ùu¬A²4fe®ìo3ÊÞ²½m»·ˆõîuÁ”Ñ–ÚiÇãÓ Ç®[@ËM}Þ´dªØµyObMp´‡ï!0Ü Ã‚@ HE渽°*¨U7^a™ešksÀ<5È‘,UÄ+æÓ€Fò°Ëe\ăLM·”Lþs8ÞhâTŸš#ç)1ç@õö@Kb6F+d“Ò{jštîÒò— V2ŠëEóŽ?3qñ™üŠî–JÐo‚*ºÕ@uK:àË{DƒÌç¿QêƒæwÎ@“7ž€g¥KìÛ{†#XÓ‡[Œ.·ðØÆr N#zRà7DPk]N¬b¤(a(1Ö§î/u‰Ö(XÊM®1ùâ¥áÝæk¿…ýê¶y·Òa‘l+÷¥Yâ–|bïhTi= uX½Ÿ…±¤€ëƒOù²RÑ¢½ó Ù;$ÌÒ=‘Ùú€º|–Ït¿¹·Å±Ò_ š ,ê<·§G%±£æc†ÄÇÍ ;£2ìIií9èCþÒŸ’óWFO^ ªĮ̀Øô‘í8×_ˆÙ~š%Î[Ïók<:iÄ*êª*E×")²S¦—&þ‹¨ÂuóÛâ²lÓu‘vuü£½Bâ€ßhSÇëã€Ù›Ÿ®b÷Aru×6v1šJ…3sª©7‚©ÚîBœÛEO³ˆÈJÖSHâ:œ*ÜÖS"êòù¬òÿ¶a]øH¿ WMî2Ü”íðVK¦ÀGáTÿãX(9 'YÔçäÖ*‘6úøPFY·`<ŠÊ†6ÎnìWA3®5ÊPƒZÕ¥’òÛœ¡çï©äªeN#kÖ6çÎ…æÃ%¥çjáŽ*)«÷¨è÷[y,yßñÈæ [OJ²zHÙƒ'A¢×%]>  Ô¼£Lkhú ±”PsÂå–šÚ ”‹Á+Ê9&Ò"ÌÀ0c78K…ªÖ¥Iót8Vþ¥ÝŸ;,\^¾ßT(x·&êÙÕ+}áp¸?/Kù`è`ÔÔŽ¿¼¬nÁ°B´ÄØŸRøm†9ßæÒÝÙb®°ÕõYÁTŒUýý×ûÓ1J3‰¥Õ5kÈЮ¸_ðÈú^ß:4úÔ j¹á@ÐDÍInÇ3/Pn 1¾¸›‰Ñ–œ)0ø³<é½gïôW]ü6.0ö§úvMõº>{<-:ã§žÄzC¢³+z×¶ KEÄkÀ ùOÑ*6¦ÿ²)²c »Áìdõ 71pYiÅZ³Sy8Ü»eY8 Ñ`å“ ŽVˆ PÆ)¸v¥(µCŒb²9Úä¼mïÝ a+#åR5–œÃ}V@†¸­Ûx¹þŽ6YT°æ pçпwz·÷} ‘Ñ’\ê0{Ýz†ÛõÔÓ¶ {Òo²ÿÆòK×8Ѥc§Mþ<1SøÄ”ÝÌxžc­IiUòàÌ–S>ý8x,ÜßJ®p‹i¬?8Ú½s"üõ˧¡+i×ANQ¬=nC0ʇ¸j‘Id46Ý;%Y™Îl1 õP}Ì.žpò뮆þ–ÇņyºŒê°îMºQ˳#QvêOs…_ô&2GÅh0/~¹'=9$³*æ±³c£bv8)~›w,ØüÊèÌV׬–ÿ&]œXŽáÚ‘ùÄÈ~Êéó„ïqä"ÜÛ<äh|t˜®ÔyÒug dм8i›Û/ÍÁ²e*——ÇÕô™Ç“Àß(‡|)RøÌ³ÝZ¡Ö•Ñ“\3€Î „h|@ŸLă¹ÙŠ,Ë%@)¢É€f\z ¤L rÎkæ]Uûlˆ2©™ýP«GE«„ÔxðÄÀ3'ÂÚÒà À öti²–od>"Ò?F-}xâ_k WýȺ_š‘0[+økÝF0NˆÙ}x`£^5tèIzŸ;¨"_fóœ£}àù¬ÞCnQh ‘ ½=fdävý Þ˜šèJìÀÔç ÖYA£O»ë7qìk/— ×Fõa%MŸ„”_™UÿAc/Ú•D1OÍÏ)0Aƒž Ñ£É63gT'uÉp«Hh'nïúˆà=j?c `Ã=™G âécÜ ,õé|ÉìÌÙ¡i};û•±Ý¼9Ìn{ÏqM†q<ü/1“AËþþØVçÉûhk¸i×üá`Ÿ ªïì SLÄ«\@Ž]ãi*ëðf['§Œ¢Ïƒ{´ü“bß4wšëÄ[Eì=äJqIÎf¢š”>ìï·ô_–»FtÌžæ3%ßKpT ­3 H\cÇúx^°õräǾµCk×Â_W†^Œ.‚íS /PŸæŒ¿xãy÷Ni/ËÙÐvùYî}Ì(/îð­ñ󳺩<ÝÙót‚£ÑùbG…4ÞµÿPO ¿÷¡þóž ·õ|Æ'Gém~x–¬’mO=ÉÏJ‡ݰ½wuNÉVA¾ràçÈ¿M›ÿ£èÿøíyžüÏUøñWæ+‹êèyᵈ¼eWÞÈ“×Pç·žú$äè3ýöxuedÅ9ĬQ/i?nLÎ×H9«®h,p€AÖa4­*Ý ]d |Uµ2-Á‘=ßy˳ã^ähù€Є?j~Üb+ñPÿ#uÑà3XÅYºUO¬t¿‘±xÕì3NÃ×Ä cê!Æue¯C¥‰+«H•?Ý>e¡ª0º«ÚÌ­ÜÀ”¥•èpÔìêðPu'Q‚FÑ_v6éXU‡íÐ[ã*¡x„êŸóí–Žk¾~ö…˜™{%Áža¤(¼”·þåŽt]zÇÆ¹Û°Å›{o(Õ¼ECÉþµ^ú)0Z s®¬TU'gµuîž0'Ž~$Â4m÷@&RD°Kܨ 2ðõEÀÇ(Xª_¸ý8sqïtŠ;"¦qЈÈ2Ê5¥A(;aÊ鬒ß‘°V1;GìE$ʱWt¥¢~MÿݧÍ$0 s{äPØïÛ³?6®¢Ê0°s¶ªkïÝêÊæZ¯“{àŽ N9 Ýîs,Uŵ°~úï«Ù®s¯ÃÑ¥=šÇ0ÛÄ ˆ ÊZJW-mg]±pì#1f¨),CŸc]/TwªyHä6zY­Ún…$¿(æò`£ƬÇ:W¤ÂݾýŽÞ×~^ˆˆÈrÊ­YÃ辇¸½ÀGÛ1;Æ9óéã3Ý_~ùx'Á à3 *5¢ˆÃz >T%#PÛîÕêY)fþý#[à«yžzâ¶â"]Þ¶“ãÕˆ_C{£m2E _™¾úXÿ5ßÕ$›5``Ðu:³ c‚àƒ‰xÕž8™±OÛe8²£¨žÀø+éu` ,¢t—Úš¦1ëuX>ÜœžQwDË5ÝÔïKq°ºT±æI'_ä 4ùÇZ`¸biÕF#}þ ª˜M©âÊÛb¹b0¦?ÛÇsf’±Ëhú›¥$6EÞ—fŽt´1?< s;ttfÍ6æÙYu9Cn¸•üü,,ü“¡ä±\=œ‹×qÍ4k©ŸËø0,ß=¨4Ã9œ9,ÛƒP”ý¢ÄÀŒ*àšèrŒsøê¾]…­§Há§F] ó &dD¯î’ì`·Ï”›!×éÀ îpÒtpú, Æ}S™“Шíæ)@)†#Vl³¤Û ÄL¶ØðÄ£¸Å³èm”CÕÇà…âƒ<è=Â÷GVvhY³µsd±P^…Âßé©|HF—]ô°ÓZ¤2œ±å áOåÝ2Â%•ÒñtÞž1¬ÁHºÄÿz²ó Á%Èå-ßþu† SNgo²å¯p6ãð¼Ê0Ðrº,ÆKG;N2{µGÉ-YJwfÉY‹Æ.ù¢Tä‡5)B‡Øü¢¡Šfyy Ò„32Õ™ÀiÈæa q­qàr8Êó’oŒ¥eßó~bÀudÝM(êúº!ܲ„¶'‡œYž¸/º&jX¡_wò%tà&šÂœ -%Ài­¾ßòø? Õ¥FÂ43ð"¤²KàV\Ñ2Iø*FJEÎ,«áÔpÇÿðØ¡³“XÒ·G ³B{rÃm± ñõç„€­Õ:¶VÊÎ)ç:l¨õt"DKý¿Ö§ùÙLÁtoûÅ{úX,¯þ‘£…¨?èþ2W†þŽ*¼êvÓ÷8GÌÏ…ìRÿ9?;áùRæ7O4àãvœô‘Êä1’äåö;ÿnjŒÓšìC#…&›N;„6]óHük ñ˜OÿGþ¿ºÔßÀ|øî‹ûëäÇ!”<|ìïÏú3:PzÁ[‘ïõý²éôåð®9<ðJ“y¦}˜’,ÇëúÄÿÕ[ é·×~zç$Œ•"Ë—gÀ’ rÒ„+#BC×öê¶?=iNE ²üq‹%(§aäTr{Œ h‚šœ¶û.ì›÷ð×ñ$ʧŸcÚZ’åp‘pÐó_ÿ ÕùÄ»î|ÕÑé;‰iíÿN«v°{,jPEgÃyiæ4{šúkpžÁ¤,¨ÙðåàP8eGáërûß 8°í:'ãF³ƒÝLü4™úof%Œ 2êîßäkw'±–¢Ê)‚4먌ҿTrîmN֦ĘR˜6LRùn|}ÃIÙ›kÆäžÕ*ƒ~;í85O„‹Hí*¡Dý”ïSCˆÅ>:y¥ÚÂd–v5/³–¹Ò»üh…ˆ—LÏÞ"q†¤â´AÌìòãÉŒÇY[eÔŠ„=OË‚WØL Tb 2Ñe.â«\PŠ<ü›ŠlQ¯9žG7¤klÔ=„_$ŽšÛŒB˜ü°Ì(´mƒÖ­DÐÄ„ÙÒ@èòÏQ‘à ÿ]4&6OjX›{×4)—‹©}áFj|òZ¬‰k‘—„C_—"#È ó@yýæå£G=‡ÍãÇøUǃ¾­¥ø[–D–”ù´\uo׿MY˜+$WG}Ä·I…¶î>kq´¡¤XÉ–9³±Hˆ¥‹kÜ×@ãL!_ ¢q‹ï2h`>ÙŽN´'Ó¤Ùß¹cŽ8¨>7!”é‹ÃràÛ“î9ƒYر‘y:SÛìÔû ÚE•©$øw'µÓ¤ùƒ•§pKt«,¾ñ÷—Ì}NH0ü)Gcmò&§9ø`_òáÄ ”Œ`öw­é}Ç;„µúuåÉÙÃÉíÃ;7ŠGÞ×ò¿!²‘ÍÎÝóÕt,¬º™Ò”¸Æ?fµž8[cšR;JÀFÖ£3+³•äÖ$ê"ª^Ùú¡82SáPrž|“=Ön$äó+í„£uÆSfg·eÈþÄ5 bm•‰kNP˜z7&d»wÝ.4ý8G‰pb_ôîÑÆ„¢êŠY8†[ì·Ó ¿Ö:|:*×á7œñš¬Ö˜2rØçÆÃÍ‰Ü¡ßÆ²\*1n©ñÒL1S—ô„æíšáÛÉQ•*„4á0Xµ<+³ð`E÷˜_8Ô»å™Ï²SNŽÖ *Ÿ‚u[¼‡lŽþħHSœœ¢¯öeß.éÁZƒÇs8ìö“\ÑZå /µ õßûÂx¯U¢¢ÄÎK…Â)¨_¶é#ëÂg-ný`ܾã38;IšQò þº¤ζŽgÌB_†»ò4(Í”î …?bYÞeh._8Š6ŠlFÈjž¹u®OÖ%4ÿñ¡ë±|9Á×áDn¿Ù'{ÌIçÖ oiÄcP¥ìÎ*–û3Å‘^â]x`èþÃÝ‚ð ÇöÅ4—õ›T(Þ‘…qSÊ\Õm"£@@uÀÐzMnÞ+àØ$n¨‹Ô‘Tª°VðÍŒïHD'X00´˜\ª —†ñý‘scõë2wö‚Âg.g‚n˜ñú¬³ ŠV²àf£Œˆ š=Ø•ºœòReÕõÆå‚ªB©ýÛEßÀ‚”bÛ”Å5Næ(Œ½oïܬÊeD¼ÍÑ?۽ͪkÝeǯœ89/9-D¡š‡¡ªó«ÓA{šÐÂÜù¢qù¢7Ee¹xaÃnÔjpfßë´Õü^°m ¦{IYEw£¬=ºexÄ%P§•<,_Ï?*",ú£Wu­›ë€YRáhǦ…]‘0­xó’ãúsèÜA´ IDATd!—˜‡{‚ÃÊeŒÑ‡=ˆŽáÓ–yj)žBêâiÚMÊløÂwåó…&‘ì8htËÁ¯²‰”™hû£ÕcžÙ5S¥˜éý!Z5e7=¹ýýb;èÊQžH1(ÂwöÞ[†ð­×ã«J°[y³#v—r)&.ù!{E¬ÎC(Ð9Z$âpÒ/"¬Íj϶˞ñë8lO[KÓC‚¨q--sH±|ÖŸ iÞЦPË݈×uê4Æ“~6°°ãB¿.ÕÓ§ÏŠ>ùß–¿ååœÔ!Ÿ˜áÄL³™'ÉÊz[²éÒEåk+P@¶wi6 ,¾› ÃuCÒ0ê ÁR¨®jŸ·mòKý%Wîô¶mH¡„uéðsž «´)ñU@|M¤XÄ ¦«lLÏL >Îa_â¼ ˆ?J#½ŒT¨.|‡ïØ?3Û"KMTË‹=÷†©Åp4³œ®¡d÷›ôªF­æ¯͵θtá˜A\Ðh<Æ6ˆËt¨xHWi#1²’õB§¬Ñ;(dµõ ûª \©kÙÉ ˜íRsó Þ>îóV…äU |ݧìMYA«$ºÐöÒX6¦‚Å'VÊŠÁIg‹iÏC+®—W¸BÁºô^JÜÜo‰¥²L—:à:ó ¥ÙÎJhë* ØÑ±/R•àiMÿf(§Z\P¥˜2¶¨’pž93“ ïMy;笞bé,‹äV”‹WcÐO§¶Eß´sëå«ìë¡(„Û ×Qg¯&û€‡'òä6tt4H„«fsâ¾|Óžf`Ç·Æ šÑâƒq§ßòñ4mâyØ?GÏg‘!»köÚøêx¹Ï#Æ<è.ß{³ò5PR\.]ÓO|¹içwoa|vÏV¶#‰sˆ… MŒ1Ú©S…º{¾:< ßæ;~·`áMã$õ7ØŸÿØrŸªtí]¥Aá~~Ð)æ÷±¡l’”º˜â§£Š¡MÍ• `9›ßIM±;7ô’‡†|ÍÀŒÞ]ÏýSX–ÿI­Ï¹–åÐæ¨–[àRq¦Dṗ‹Æ„íCwÆ q°üKcËí§Feîò¢÷Û@õçPü¢›•R•4ym–^òMÄá¼/ÁÂû¿)«æ<°ÈVøaÁXåh8ëIÉ#  Õ©QlgI¸;ì%Ÿ„§·SK'®iâ³ [žÆîž¾±' clØ/–C™@&ðÿMMÄËØòvyMm¤Ï¥3vÈðuÛªðxdë1Œ«H±eü«ÞûÄøç½…7_5Ž/ak~*®¨ú1úÓõoŒùͧˆ‘4‘AþKÃÇ\㤣‰Å³ëElŒ3TþjÊÅ–hˆk°w¤²NͧӉ ž"ÕàLT( ªúùxƒÚ|þ45“5áÈâïjåýåǿš–ù;íÿ?~*ô>,à5@ÄÏ?ê·ßòÛK^õo¯W(ä&½ž¦/·Û]‘;‹…\«‰Ô°û sÞ (Ò©ßKå‘þ˜‡Qy—þFÙq?a¬w>™,äŸþñÿ—ÿí料Dvz# …A™*~‚4S³Í”hªD»eÀÂO§¨2kc_–áÁV:‚ ±áÔ¦}Û‚§xÃéq¸Å]“ ]Ø.“[Wº;\˜%û8TݾEPG¸&äv¿~³÷°vÉ:²É&U=‡eDFÀ^ŠtŸF~éÐ4˜eg™)c˜Vz¼¢Ô]€`ÁÉüÜÙ9‘7cf»ø„´ÃÄ/+dê~ˆqãL.Èmþï90J/rþȬÞÄÏ+Ù¶šû;ŸŸUÏÚÔ,ªrµ˜ò^˜©ª{oæ¸a²¦›™ ¬¤Âq¼2é÷âôûãÚ”ŽƒY×]¢:¢#Ð`Úåñ{;­b‚hê'ëPU×Gu)€ýµíkG‡%L ŸT?g£»‰-]"²÷׫uBDT¨5 vŸ`„DâÕziEERµŒLc³Éê¥æ~Ÿ&f›b4YK“}ï*¤É°åÕøGUAÕ†–ä”# ñjSuÎ|î¶y|ü2'‹@ÓU½²u1ÙÛÌgà Hû»dƒlô‹†uÂó<W¦Õ’-@·’ƒ½ŠbÔ£s9Iš¹Ÿìª_¬Å¤ 4MójŒ(ks^ ' ±ta) ÚA¯,µè 07Ëç“(»úóâ/¼H­ÂUYA;(R°½„y51ïHºíRœÐã¡åâÚ©“þ@ÌìE>ÈÕݪ½ ÊVد|™­˜Û†n{`0ù‡ùü²­‚µVì8Ø%µÆœmæ›Q7H3iæ9v›-]ù «G¤¤HÌ$Y?ðy‹ÏZ±™­ÎÀ&‘šŽCFºP'ñ›-s·=¿õoN2Œy:Rƒ›RբϴŽ6¥\X‰aZêrcز0x¥cKˆŒfk¸µØL–g ù4ˆržÃÆ:2²U©ã‡/›Ç„ Xï9tcÒuG±™¼ö4÷¦±¾­ˆdŸ ¤Ò])AVò…U¾#¤ãé¶:ÑoÒÿÃc}ûñ<`÷·¼~>YÏâß*´l›-d’*Zœ¡»jl~Ð°Þ ‚“]Ãï2¦ü'ÁL#M3´æ3€þ<Õ5Þé™ „älè 3ÍpjI¥=Êk«sTTMÌ%ìÐ{¶-ñl¨kü¼j>Þi°|\å¬ÝsÙγ_ã:¡ÛøH¢È…ã³?ô•rŸsr;ý[`ÖA1Ë[Ô0rcHÖqàdøxm»3 †K¥„Ž:êÆÆRG;ǽmÌáÓ´øt,ˆ\}IäßPƒ‰+Ê ÍÇ9XWa8 ½‹€AGEow©LþŽ7Dú­ž€‚®ºg'ÓQ®ƒôpyb Cþí™Q=ªêq3üýO¸×p¥^<_N©Š×ŽˆÚ …©ÅׄàØ-Ì$¿LKýiÛžx¢=°f ¦OõßpÄ 4¡©y6lÔOô8ý-uó&… 8­üå ;†˜‹e¾G¯ÑF ÷7œÚ_"„ñX¾:Ë~¨1"¼ÀÛYKy¶ àœýò9CB2Í3ÚVÛH–'§0¸3h?d[: “½JRÿ¸~ÓIˆ¨®µ¼þŠYÐÕþŽÒ8’„pÑ<²C.‘ÿoÒåÿªôÿ¿ô?[ñê³¶ŒßŠ Èb}\ˆxýÇ‚SØúv(€aüâ§ñ÷c®«Ñ([4›‚n¡xa:\KöÝ–6RW=ËMQËÏ¿+ŸÓÞ.ƒ;Ï$dŽò¼”t"°¸è³~³ ‡›È's•?Ð$%hAE¢íx8»JÆSxD)mÀ@®íè³-Ju²Î úœsågZõO7¨³;-ÞÑPT°}oè<¸ºéžÙ³÷¼óïN»®ÝÌ´ë0¯R2Û"ºÖËT™O£f‰7ÛÅßpÁ™°ÀÛ2-šùlAHŽpZkG‚Ô·øÙœzº¥`4&†Aï:¢ºªÞ4³†>Ù#0šù4ž‡õÙæä¦±dl« )L‚§o~ApÇd[gMÕ#ú ÖÂ&ew¤£E”ÓŸÄ–%’©"­kMK<Ôhª€©S¡—Ÿ–<‹ÊAUõ.¤‰%¼¨U§¾Ó¾4j¹j¾¾~¬#MA,s¿6¦Äš˜;ZŒ2/¬á¨öâ9j÷| %ÐH‡o$Cqsv½¦3X"{|H&^l‰¥]©Ï¸[Çh¤±<DccÓ{³Z-€á:Õîn9wòRø”zÍÔ\çœœÛ ËL±]s›/S¡¢Öfí[îXìó?î1—>8t-rݳaÁ9ìš õ¡J«9±Å/Þ–9ÁÔN1û³¹4 ·Òh/ÍÆo’ i›Ër¾]ÛÝv6¿†u©+ï­w•KwÞ}ž_Å×E¯hU¨ú<•~B!-TõóËgýÍÚ_f_»–Qçy¸a¿*´t@ZŒÖe‰éHZÞ<¦ªj£H@Ûû‰*N€M5rry™5é 1îmñ: ý„ª.Ùz…SŒ+gG½Ûí’®JÛþyFµt^’Yf Y*À¶(ǯlCïv§a!Fq¶±VY×ó¶K2MÖÆK*“nF3ëí|Ì›Y6Äj×ÄX¥®ðaòéð7§y¥˜S™4ƒœÌ™`´§û8„~8ûÆÀ|ÕÀ½[Aªªª÷ۤǺŽVi„ B`²“¹'+¡Í, åÝ%ƒåT%ÚüW‹Ë›öÜ»×£à³ì0v;œO€«KJ÷œ¥¶‘– ’Æ/u-jN]ˆþ;øÔ @YúØíÚ~ÊyÅV‘ÏË24& q&ãNT¶ •[æ£*^¥ójr±d7ËÈãÅ=e,d3Ïê©X›•bèÅ—ùàÌsO^ aÆGhìó€<Ê„A–Vø0%²£\®æä7NµÆ*éF±åp•’[ ãFUòHž 뮑Z‚‹çA;Þy™X}ÙÃn:z¯£¯ÂhŠåç·aFM<³~Ñã,‰WŠÃŸ¡=[ínÕSν<1lø¿{ €Ë%zú­‡dþ8p/óQÝ‚`wÑ’fŽÊÞÌ¿W¯)§iou tO‚Ǟ̊ø/‡_¸oÐÂûtÞ"»®y¶×ÉÑá9È'»ø0˜7NuWqh~ó‘w­ó{k NÁö™õC%½÷­é䘈6ÿÞúˆV/zȑ֪dç"Lj‚UFNÍe{9Ó¨*qâ]Åóè“ØñÀåyÂç(úUt51¸ë0Iߥ°z]l” ?á,:nY¶¼4˜W*r“è³)Œ=ôÌ\íç4 ,D'9ûŽç„Qh¢ÊæIUw°w4>ëLòú:¨*"–]΄'¼Ä„L‘bï$ÏSJ%ͳ‹{T£¸|[Fé ¯RÎ#ïÉ ŽgÔIu)”§ Ž9K¥ý@dÆ)‰ƒð\Y>Îx Óús(~H< @*ªâ•±µ\p u´B.ùúPˆŒxB§ò’ðLg—d €"K²ZæžθӮpÙ“W‡ïZr$#ïå‡ê€¥¦åϳÄÙ>ÙyŠ+eYµv`{"ZÀ>t“ÂI—«¶è=ÒYës rJ´ÒêXP ÍÕ1MÌ9òfgÓ$¦&fY¿ØVé ¦æqÐy>s³”KzÜRþ‡€hxÛ{rS00ß,.ÿL7§…ö(À°übË8OÚu B/rnž<£F½rä¾Ó —qÀöذ‰FU9æpÅöö\X P×ZkipsêùÞÙúÑ Çö¾‹n“!¦YklìVj·ÿØ4ÛAsM 9ì­« “·a>Œ’ûŽÁgô\NLTõyxQ…Y”EÇ%—'XUt‡QWi¡¼à·ÚËztPeƒ‚²Ízëì³ÁL°–Í­ˆÛ>+Õ.íöFÔp!þX“Ö¦¥ŽI ÖšpxåI•­þ0õÉs˜¥QÌ"­ï̼¶ ãlÿÕ”~Ü–5æ‚™w‰%zC¬ãÌDÊgZùC1ò>‘QÊ=tÅ› FYá©hQèkG?§ 4;?b€èqdP^šìš¶ÆÕ¼é…î¸+§‘¶¥j:™û|&µÑ9LË6œM¾@()Xp÷T|ˬÙõ‹¼¼l‹Ç’üI :4óJ% G?×ÔÔÒú/ ¨ÑÞŽ*™fØ{¢SÒÕdÓÉ)Ç i¤¼FÏBB§µóRyt^¨2]q$צg#?ú|ðàìŒÈÅ%psΗ%6ß%ùÚƒ'¶b.“WŠÈÝsŒ©Cæ>á;#£¬ðé4θþ…·½…r .úæEí;ëõwãCÎß}t?c\eSë>òZ÷trTšvQ³S¯æSÞwš"L ûðäY#•BoW %¨§GE¹” Rro³í–Nìe$t³e =ä¡À¿Š`;ßpùÞ›þßCõÿ Ìþø7¼˜oë~ù{߀¡?.R¼ Uð­W¿¿õ¿ß¹þŸß+K DÏŸ«qGF¹Ö€,6çk®×òÖªþPªjRN jVWVù¬¥*y›¨’j?¼x™žÀU-£hæçŽÚ¿]ÁÐÙ Ô XMsÅ£÷¡ršf7Šêºj@³/ÖØË‘Sâ|hÕÝiñïñÐÚ‰u­ÂTB$ZÙé¶™‹FÞóh+¬õ#÷ìZÐ6–¤Gz|…¡ÑTÔ€šqw[Þ`ÏåmA^€i­ª§7Íj`  Ý-³ií‹§b5óZ;STš¡÷«NaH‘ÏexAQÂñTþ‰8÷‹žÇËBˆc»®˜ùLΑÑ,ÙŸ8a®¢Û ÐT¼dò¤’øhFá=cŒŽÍ1ŽfÞZó–Q`èG•èÆ(SRÜèn6ãRz’…ruŽÝ眵›XXdv¬ú>¾‚©Åø3YÊÔ8ݕƫiV”l1ˆVQ¿GÝ”œÐuÿÓ"2¹&Z `KŠÚ6ÿ?NÃ…‡×½£äÛýÊhê,þ2 ”@Á Jî†2ô‡k e˜È—(noƒMí8×YŠF‹è;‰ÜÒ5±’½·‘Àç³*¤4˜l¥›Îtr7Ë :,?ê2FÁ¨û"{ïú«‘- PÉêöPÃÇÓÚYÆHÂLuIuqtRlC€( bº€¬›vfSî¬¦Ï ^*ºÁ>qã%&sÅ|¢æEÊÑʬh¦2c(í¸)Ôì\0üPŸmE´éA_©E凲éÚ\ÆlOÓÔM:¡+r;cgÉjaôO¤L¦Ô†¬÷þhˆË"L—\àÉ!Š1O?–¾¬BýÕŒ=cSà›m+^\•ÝÐìd*UÎÐÒaIËIOw£Ä{€—¿Óƒ<¼ö‡àôÆLç‰?ÏËrË·ßI/ÞÿDèIj? ! a“w'T¤«ZÉ«é]Fm‹éŤÇ1âñý qà¥Î–Ÿ÷S&^{éä{Éâü–·[ÇԘΕ¤Ì<,™¶æÄf‹  L»›¼YUVîÕ}8hÎÑuÁvªDfXj)å¿qý"òt ,=?bs,ÆÉ9>Þo¥g¹gNß{IÕ¤Ÿa8 vCÉ…½RÈ‘âé§Ir‚.‚_Rºy«Ñ¢ ÁòÞ¹ŒÀŽd€”³X=N*ÞË/hÌQD> JŒ,9r“!:º,÷–M ¾Hé?§Ôý}¦bæå1Mfü{Vƒ=¦TÜê×?JYÏé¨÷Í÷¥½nñç C]îMQ"ûG'Vóˆ<SÇ yX{ï¹æ1Ôì¬Ù(Áù¸×‚P$•ˆÅDšT¤îJãqÀäíAy,×°cüâH#Pé7S}Êfø‹„]~ÿ·*7p]Ú'ŒÂ%M ŽaȱHòà¨AÚ¡E@-ZK—oir’Še–3¿Ç—Ì‚ ìw¦J2”Ó‚=Þb›ùå³TÖç3hÁÒ®1UëÈ0cøÏoú¿RƒÄ§]âßüÇ^û^1ëÀ_sÌWü›õþ»ßãúÊ#‚ó@¸ÔÐÇCÏçÑÂÃA‚›¿íQª*ôÍ ±ˆ‘DˆÂÔ‚¼Ž …ó½ýK•c¦ØÉ—戄E7Ö Ü%ß¹æi¸]xÛ-QgƒH˜+“‹á¢çXÐà;õÃ[ÈãU²MÖµÈõ'Ñ=p˜,á¥W‹¸·‰/Ä'¾ÿ9.ãºÏnéªßÞØ¨“Î2g¯æõ4šƒ¢üc˜æ_1¾Þ€FWÿûr:šç½Ž½*îâL '0æàÑV^ÍóUáTÒzÖ‚‚qH“®žogHç®x´sÈcjnŠ‚ÅT’8*4_‡ž±e‘¤o)Ü _÷è­¶ÙÑðÓdÿL­’ºœ -{¾È‰÷ÓñŠ^\ àoì[dgý”nvmñª£¬kG(ÿçÿñ¿ÿÝßÿƒ+B}ÐhQ:Àí[žXñ¦œ•Ž•ê{;ü"LZ¯Ãq¦~âPñƒƒLñÿs÷®=º$Irž›G o"A„¸øÿ™@B¼@à7IÓnúà÷Ì·N÷r›+j†àîÎéê:ï%32ÂÜì±tå¼, ‰¢NdaähC¢/›A\i¶5£ë?bQ¬Z>cÕÛ&«}\ì0R <Á¬•/V6y^ˆÂaüÑíhW^\O¿-—¬K0ã5£rÉŠ!TÜ ·6Tç2»'~Rµ!Cè‘†Š²šåC'ÙØ€n}ØœYò4®1·ŒÝ”,¿DH˜} y»ÝÊf´ë1"œ+¡òiÕ<Ú7™²S§:ÅU¹ó剕Ì2ß(¤ÎåÕ,'ãä$e öÖʈ¤äàž„cÓ Yc ©~ 6 ÜU.*TUÍÓú¾‹&®ä÷_¿¡ G= œèùBÿSnje6/‰Ñ˜vô@A“ËKóV!¦;¹}ÇwÚdìÐÞ–ü9¸ÿz-\5 ­hZ¤Ù,<ך›Œ±„@¿B-°-½èáÛ•!†RD®ñK+jã}°z¾Žÿs!tüž…¢¨Ök$CiKeÞñ´-æsTUDkVö:0q„²<@œ•ÕùT0NÜ—˜È5»÷ú_wâ;õ¡×ßeøŒaˆ½ýbk'¸Í®Æ8ÊŒmõgËÛþγ‡ $?Éïïk J!WÞ ï5Ç”1s5i•œ± ¾ú9‚Û.äz -ùÝ8ÁÁ¹=FU¿Al`\äš õœøŠÞ#Õ,Þ(#E0Ž4@UÁ½A Šj¾3Eýq°LÊÈ#Áî 6òÈ6„%¹õªÊ•ä>[J"…²½7%© OG-×ôφ$DÉ¡ùqÒñ@SI8ƒ¾:§g‰¯dixM0Íú¨à:›öÉÐÂÚÛxÈ{,Ä TšuÛ÷Èáh¦ÖÈP>Xb)Ëuæ© §Ueâ`úN¸Qy6ÝGªaÃ>ØøPE…Gƒ IDAT(²šÔ¥Çú¡ÏL ¦lñäýó%ØcÙß1«×&¨çÊø‘ ðÁ5:·ði\è Q>ͬœž¶.ËiUÇh¨Ÿ4¡ßú`IGÓ°^›>ŒÚ“¶½>º7Ó˜þˈˆlwÊú0]·µ]_&I©”ŒŸ€RõY€Ôfè{8óm3{1z¶àQžßGƒ°˜µbÌö:ÖškWK÷4€Ëò?û<°Oªu:JMëv»ýXcÜpçT`ÎS­|B§—ÊMé<Žqaçrº;ÆÐu« ;$%ˆ›‚#™Áá$’l»™¶wJÏQŒ∘–qT‰â'Ÿd32 7MÁõãC,ÿ㙳|œ µšž'ç±ÖCùyÎX¦ù¨Ð°övëß²„ÈɆÿô~dÛæyD)3í_ï¿z7”]-à׃Šì€ ÷]}&™Ý—Ã?ø\)WÝHŽž-'X{èï ¼ü4Á–õí±<ç'h£„y–+µ#»(á¹Üe£VàÌ÷+ó\H—U:4©BÄag’(Ô_£Jsfcï“‹›ÛŸý8ÖÈ Öá[dÕòý¤;¶|¡¯y͉¯?M´ÿïï\Æ[Xÿ_EüI½Ÿ!üèÖçÒü/hþ6ÿÇÓ˜œ [ÍÀK¡ÛYÑQí0¥`”'PûGjRΛÃêÊ¥¯—è-&Ê\ôø-¾39ú|ûn±O¨hÈ÷Š™I#–9ÛÇ¡´F2^€<žcûc–Ã9°¦ÅÏ€ØØìçý8jL'Mò>`ZÇÇhÜ;“%"Y&ö|+ý6HrJ™‘!t“èµ›ÅåñÔSýj˜Z\}±³î È]a—úò©×XP‰?L*ìÞéô‡å4{·ºÏ¾-Òž7OK´ª~üêœ2´Æ“ºvwÍtŸF‘2®t9¢‰©žZÏãPeeÛÿ‹Æ^=jQÚ9 ®úžö„úqŒ<Þ¯ˆu9/Š‘Bj‹™‹ ÷%ë¦KÒ²ŽCLÞ÷r16‰o*åt7-š£eLîGvf´¥ÌzΆ]«te0š{¥U7bP,½í}R c‰C†ˆy¹"·²Ýn Üç´Z—PëÀev8Z*Èb{Ê߃¤™ïœÅÈî—§>Ý“+?ÑÐl!)Zr¢Ÿ!´G¢Œ”´-ÓÇ곪ˆi—@!†®¹\B~‡žì@QÄ~&ƒ± ¸|œ¦NF‹®¦7+ЉYá•®@„uíB ô9AdR¤yÉH¯•°ãàeoÌjÓe%l“y…t-õÓ1V$ L R¦¤ðC5Š2Lˆ±ò#™[kΈÈç±±³RO¦hØÌÜ>ã‡íQnøùl‰=ˆåG‘ò®z嵘˜’†hñ[p?@È+Q­ ÷z¤[ÝàRjüÀß¾‹Fñ€/u{ÊKíícp üUb[»†ºÈ²ÿ?…|—TñRÿŽXóç]Ut"˜¸Œ¼^ûÜÃVõ­qrnåãsê1ÁG†Óx{÷ÞsÎù ›|=÷ ´N äƒIÎÑm¸E·ïÆ ¶¨9Lˆ¿"Ìú1&Q…ÝtÍgðú“2ž½èöxÔk‰¾•ð03»ævl9çHÍDÕÇ(aç ¶ºRçY»Ø.ñß6|æhröÍûsÎÉñjDPÃ<Æs¿0„¡ø°Ñ›Þ¼êä¨M|ª÷Öã½úò¡:ûÖY‰YyX Q~°^]1Úfre9ǽZs({[®+­1Ú¹«¡´X@9”—‘ËdOPü¡TEBf]öVAÒ±1&7ÉÎ3Øòmžôê°h»ô€Úc™º gSbôÝ—|R¹G÷Ìz4Ññ½ÖûüÁQl_ªŒÝ÷AéûéÕO·ƒ\(œ0uï/X¯”ȵã9õ1(ä¦êfFÁÑØY47}lúKÓ98™™!_f¦.rªCÿ¬ò¼ªheBd*•ñ*ÕœáÅ©»yÃ9LÄçÃÝÏJÆËøÏ¡eñõÛ8û­sÞQxnmÞwxrcCe]q‹aÂ-S] X¹T‘Õh]:mšò¶Ž¡=ða»å8!øC§N,QcKž|·”ì„ò#&P·,ê8`]iÌÎQõ&‰##a{T?Aù|ìmDºü—«y£¡dG¦ˆ©„Y=î×Y!Õá­¤–Q°Þ©&Ûßá:CµÌmžÍyÕ { Åm¹©Ë2è¤é:#sáZ­ ¥´,ª7ŸSK´o §Oä9µ¾C]ÕŇl2k83O«•5÷³m¾J÷ÉaÀõ½8¤AÕÃ@šÃ ‘!õö„§wWl ЧÓ-‹$½¬t;y´jFEvÍ𪠑—ÞCì„3zÐYþ‘_ùÕáf/}pnãÑÇ(XÈüTÿWIïŒ0¾ÔÿùÜùÂÖ1g6ý-¢%æ!xò‡UH¯žU¾üØ| ¶\Æ]ÎQ;ŠÀˆú|^Õ¨5ŸøÇ(6<BÖ™B{`ª•¶¾Þ$׎¯øY¨‘3†ÁSUO6ûî´N©N“ƒ­Ô/fAÚn¬ÙŸÒŸÕ9ú'Zþñ–áLð§ˆÛg›ö§ç/>»ÝŸ»ˆ>üÐ<üxv’ïz‚‡qéYuÇ0bx+ò…$UÇïs@òièà¿ÁñB#d˜ÆãDØ»ìÓ†zuྦྷfÓÊÖÛÑ|„˜ÐóúiZ± =âí.¼íJˆÖß` €g‡[€´Ó™± Ê % ¾ ? x8BoÎ6Ñ9eÑÏëÍOAåèGÏL‚ä6 h"Üôo»øËé'Ñê=`´{¿cº¢¿c‰Wß²…UŽF©ò÷9»Ø³‚G¾å¤‘sa¢Ó6í– ^¨-úÒÇ~XÖ…Y'ˆñãñ³í ´(Ïuþ¨",nêr ⎻#G[k#›Ý¶u"!Í.ÍÅæ9•åœì…†g?î`‰©Šî¶/£oÅîèŸË׿âq-(¤v¸l1'¯åÔ- ÅýcÔØ†Ux¨Gcóýè5Ͷö YIÖóT½•hH8œm*ÃÀ˜ƒ7a<94Üg«Ûp£œ¸¼ÆŒŸ‹h€Õ<9DÆ£ú—s<ÜÄïoƒù0“ÅÓI²X  ÄA+÷KýíSäKÅL{kH!@º2º»+§I àtØ_3Í!¿ Ï2F `öLbfGXr)ñ|™ææï*ˆcv°eÂ?¨.¼©auÙÐêý\•å(ãêN=\æuÑ‹QÜÕ~¿ÙLjHH™…Ñ+™ nNFcmïîMFC˜õá‚æ«ßÎZõ°aôÌù§ÒUgÿŹyiÃ=)Ý£tä8‚*ŸÄ~u„ú_mwåöΕy"}ëÚÀbvÐër~’÷Gaon ª.ÄJQÖ5ó1õ5QBåŒÏº¬qøGϧc²Û1e!þ°&šFº±‹¥þ¦3l´ïÕéÊ8Ó»=ŽR:Ò|+±Èž›’®®×ç>ãëK‹Ák7“Ž©¨DÙ›¯úí¶©êWÉë|b®†§Dý'(ùø3DË¿GÀßç?|—ôÈœŸþûÇüÞ{î©­²òqJ%?yÉçOÏÄæ.5ÚÅè k§½£ÒD^+óß‘æ: {Cµé˜P%JGG·œ$LÓ²} ÓÒâéÞJQ^šYÅ Yô‡Óű•{-UµhjñÈàÈñØðŠ>f5Ø{dŸc_žkÕß2è+V™©|?–¦ Õ±ŠÁ‹l¥ ë0‰éÚ+Wí>ϛٔ• | Ø?¶·qüfÔ/]ìK:«—¨ª–Å€z€UòU®If¾»ù¢duodÄj¨KÁ˜Ô¶dÖ¼ êAý5ú»Wo턪SÈ£ˆ8=†}´èû$ê§_1Ë$9ŠjK°(K\FF1vç*rÉÛÛŒqD?@mÓ»Mm6 °ëb4Ó/7¢kBÇ{,‘ùJ1s×^”Ǿ]þËúÏÿöïþ¦Ú˜Æ_JSLæ0',º{}T#ùÚ. MV¯G>,ÿÁM²¶)Ä‹ÝdRº»d˜ej×8˲ FID2ćc¸Ÿ{³ êJP€­ÓzSŽ.õ¹Cøa½Ô`M"ê/²Qp•a®m†U_&߸/2ã °2 â~–±¹Ë¶ šËTÇ ªû3të@D9Û3‡4Ÿú 1QÑ/F d3_+'’Ž&©¼ë˜–¾%Ò3„øÖV²FÆ=p°Ifžþh‹Iª ²sМ֙¸øTÎ9C¦Ãó$\ìºy1Y¸o¦×Œü'p¨òè×9ç|óuîµïß~ ÑÖ8¹¥©8fFH¥¦&¹5²L¡ýo‘·‰ÅDUBrÅhB¯aäÇßò÷«ª¶×Ÿžñìà¼ßKY̪‡–8š,d3šªßx`¥R  ~ˆÀ>xž*°TÔ ©[šÍrÚ‚§³GPÃM¦¯ŒÅã…h²Cìªá-ZÆkßþÙèQ@«´É»³•ó2 Ëdõ•df ßûñçÓöÓ¶Þ"c ‰îôÈ£B—ׇm¾òGÓ/s‡*;aJZhL_5ušô  jÆlÓ͊ʵLÀWð¢æÃ{bçÀ5³L+A` ]«ýtº6mR( Šv;ÄÜ›K“e“žKJ3fýx;3V’ƒ#µ£k²m¿EŠ9ȯ£<„]{ Ø [u‚rÚ,Y&‰y (´›+ŒÔÑí”Y³pÕ|20áZ². â†Z±3U³€LeóR0—šýHv(•­ŠÉ8ð¯3?M`ú„UºêÛ3œžåÅpQî¨WŤâKyt‘0ÊšŠFvúœ#Q6œóêÆªl4SKöÖ7Ó•_ZæÈ—d»šx¶¹z’‚äÑùê¼ÝÙ2¾-m¿6·ÐA/Äs¦§rô4º3-,‡W¢7„ÅN¾¦Û-SÚâÆø”:š“º•Ÿ‘e1î#å³Ä’ÑÆ“[ÀOeœËnç-æÏhAey†Ïž«ý#1ž¢•jä É3qXDƒL“éaͪs÷š®£Í§w+.ýƒ smgUŸi)2}3 ÝðÂEzk 9Yô{§5+ä62þ=O„@äŒÃBªŽR1#œ/íÊõ£^ŽlTÅü´a.ØäU«ÒUé:°Ò%Cà½ünùŽ"v…a;½±Ì¨i‹«¹~eG Ês^Ät$v!n˜JÛ×ã¡×L?íÈß¡];ú’ã0BÂ'u¯~Re0)ûßÐé.ÿ”EZš®àÄÉ]Bý÷ê÷Ô® †~ñHž‡ŸTÎÔ­‰*s¦Œ¢r G[ô¾{Ǽ¯¼qhëG—`ß‚x L.ã°u‡#áóÜñ~øÓg?éës$Ãdê©+âW·U,š¹Ó»½&©‰AÅ»kWv«K)ŸõÑ2jnªL§àÏœ,z°ï' Ϩ TÉH Ó‘ <ÇM|6Øðw%ó¿Èþ&øC0#à׉Qý2Øøá"òËSö±ˆð«äÉ‘ ºaç æßõ£—?ˆ!Cq°ïû¢c+PNÍ\îÍŸÂ*ê»eŽÐD³CK„"ƒbZ"¼ÝwŽ"RÆ,ÔVqBÅ9!YâôÍe<…Ͳ O7¶óWî86o—ŽÚ­ÀöÚW[ÀÓš¡Or|ž0(àOšôOA§§çc€ñ·\ð•­Uý™ºðxo@r_ U»–Þ±,fE²ý¼‘ÂÈ‚&û>RÍìœüâß®T1×ø Ðõe˜‰ª™=íû娤ËV/ïç¡ÒcÚ(&èªÅš?Š67å,‡µD󭆧ƄêðмÄÓr«—'w#Ô¢ 0VèèŠLËy¨y«á¡ù®áà+íŠåL­Îªoµf@Y!ë’ÖQ7ዉþ¾õµÐü™˜Üœ™ç\ûä†(v.k¸pòc‰“@ôOú?‰à³JIF=Y¬ªšzAVð½m^Òù XF"Øù¨~ž·&¥ñz-^`Ø4{¸ÂGîÜÄûÍW§>ø[W=Áð/mH!¢` &v Ù\ï:¼ñª]éC ¸y§+'"·JŽR÷#§§Kp¨„wØÖÊ,1›Á’ªebQ« ™!ýÑ€ ‘Ää2éÄ4âuºˆÑ h‘´¹f‹!¸ŒTì¸6q?|Þ»Ê+EUr>õQ(¡ú3ñ²{ÖRQŒ *…Œ]“æ?¨ÞX° ñ)øà0Æ#A5%Ï '-Ò'ppôœòOÿrŽ=—×nZ¯†þsŸeœ Äš¾ÛÑ£»¥ªJ"¶üºñ\ùJÞ(2SÌžkÝ îEô‘Ëú¨»3òp*±ØJùçšÄPýqÚŸ]Îò%¥£_fNŽ‹6Òþ8?ž€f"j†s’ˆeeíÏéówÆÖSéó„Jí‘D׊KÖî²0Ÿ’F~)HЪÇó«@°I$Pú ˜7Îñ|Lóv‰ìUú·]ÛuË‚HaûˆÂ’òùR²ƒÕX+çÆZ˜ã=dŽÂÚcÐñ̦{í\=´½Û‹º÷0ØÛ1à0²sV–€Ù;•ÈJ¿nSwç°&*±™‹É¿'ì#’ˆ„k·AfêLÆpÝVZ¥ŸŒ ÜP¸—;Õêës·®?Ò¡´Ë8ú)äF¡±ŠÜvž3pôÌMFÁ2† ‹¡Bå½½d*tÕñ‹ñû‚G¬¶°% ¬’Ý¢Á¨þ^%Òþ0Š~RÿÈI‡yÆ"•»G%!Zól[ŒÌé ¨Cµ™Ís¹C(6YÛKL3Ûš“ý€8–Ï# n$•Gíò'›äXb«„ËÛ{‡å¿K4òz!÷eêHpÛ¯OAä“Ü—“Ýé?¯ìÞ¢aïÏó‚Ö¥ä³qûi ¯³aŸ*¦96c»¥+gÉ¥˜UßgúG.¾™%ƒ¥¦ªÈÍ!K-'yÄቃX õsãŽX²/m;ˆ8òòÃ=8|ìiñÌg!iÑa¼6S0™ÉTލTeÕjÜÚ-ï/½2óçœ,¾Cù¯ ‹†Üub%¦žºò8²ô‚ÐþNtá†~ÔR<¼mÁuÃ>Ol³…žìɑЏŠu(™÷Csˆf«¬ÎçI鳇ŒyŠB†bŠý«üu)ñ¯þß3&üâõ<¯\ÍO €÷Fì3˜Ÿo°^Wü“7¨…Xôy, 浆fçkj®ÒÃe¤Ç„™”¬yó÷§äºÁ(-(¶2zã+FœSÙl?àÕ½àç)z†Ei؆˜á÷ÅXOð0º´ðšÌŽ}vó‹öt·Ï‘ ¬ù>~úÙh2¸Ò|ðè4ù›¥}aø!j¯Gý!w¿mT%ȵÒZliý¬>îg륆Wîæü.Ý& Ò‡ Eô® Àø·7’þä"ŸMv•B@GçðiŽT’ 8Õ07j‡¡®tžPߨ}S=?ÎÇYêxÉT¿K ,„ü02•T|C*’vTä”qÒ„Vr¾ø‘>冥Í[iyËpÏ!0ÄBÕҕν½N«M˜…c8†Ô‹‰G4mýÿþ?ýÝ¿û·Á©½yŠ@î’,§HÖÔ`Ìxí::«y…¾É•ÓeŽ\Jk.ÖCuŠÅ^ÌŠC5ÌasÍðOcëJ ¸~nJ`|hŠgìÍNñ…dõŽBÕËrºŸ… O§ªËF˜Ðƒ‘‘°€•„ÁŒ¨Ømû±…80°vV¶z Œf¼'Xfã#Á„Ü‘ž,ˆ ­•í÷µ¹‰bÚò¼±{öTaydñ[íðù©ÿNQ›e’äqÊ{o¹#Ì´ˆŒa¸ã4“õ¢t¯ \~4zséÿ©ŽòsBàÍùc;ÜRÀ0ö·_Ö9ð¨¨)ÓäY¡`é9HÖ¡»4½çÅK/uÄ_eDß'9Íý¶(‰Ó *%™šW»¤S^£n½!--Åz—@º´Ö+Ò‰…«Ôy ô]Búzì³+F4Í%^z¬§ËDhKªSAŰÒ¼Š æF!uEÍ!WµŽÍìRýPÉë¹°R"â/ïëëtc!?Ä©ûbËù<²œ´£Qnóñ•c$Ü<šŽlOr~|týXæÈž²Œc–êùË_¾ð üöým1N`ݱˆd CÇ l~ƒ³Jº Óe ÁQ^{ð»'¹¼Ó®ÃžÇXR×ewŽñÁx»äïQG™î—ŠÈ^WýŤiÌnƒÈ‘²ÕŸ%¿Ñ…Úžæ6ňxšÄ?gFd”tÄLBU×ðÅzájÜìqѪlšÁG{û¨êEdA:^öîÎáMÛ‡BÖ€Þ-ª{…Hö¥'Õja‡O¹« µºÃ±xiåŒÌ‚¢¼óeZŠÝ`û]bˆ×ØbË¿n³j@cò ÓÆdÖ’JP¨¨è­(L’N’Ÿ•¹ã<ä*ãAGüEÍû80ªíŠ@º<4²ýÚ{eO †;+ðñ$Ey JëVZ ¨íÝU/‚îÍèõŸÃçùö€±bEàHëtlãä»{›0K+K†}2!_nÅ74Œ  ùù£ø0 øÈ ~ÀŒ·ñédZ£jÇÈ-YMüñèk¨u´8ñûœÅÜ\öº~8r$}•.ÍAöNCÆæc~F,)•ëÝZ¹dZ»¤Þ !˜OQ¶n]IJY¼:ÅÃAr— ªÄ° ÇxÓæs"sß­Ço=‚ŽJ­ež‚ž~"Ôv"Ôq<‡(ëk¢Tf5B4ýàlS¸UX»Ì¥¬ü~Åhå„5Ñ»Š•—ššúœh/óua<ðÀîK5(le8×?{÷aq fœT©Û®MÎXsë:íy ³laóã(ê͘Á“›–ú?œ©|OfïERe_]#c#ë ÷zø£µ™Õ‰]³Åð¥0?¼ÿsÁªzmìÕ™ŸX˜óg4êbÍVÿǼ—RP#“ùܬrØœñXîÍšXˆ8AàÙ=ÿd4ÎG÷Nê‹[Uë¤ÉìŽCw:5É3` 1ã²Æ*÷%íûãnÿÿ0mù“ÄKüòe=ž|ÿÍ”¯lÄ›×ÿAñ§s…¿~ÀÎñ¹òãunû†%l·>>>_ÍÆ2¬0% ];yØ–åª&0vºž@ZxÂ%Ïža+ƒœp¼é‰×¾Ñ84Š*…Гg?9_êÁŠkj‡5lC´5ÂeËýÖ{É@@ïÐæ™9'á^ìñ.Y§4Ngslð*ðy䞸þ­¾ÆF*:š®Î¾ ÌXâû(2ë1JâþÛeix6NÒU8 ˆúb¯õî=i@Ò"ÜçºÃhažµ×íõ€.Ï ÃÓ€6\‘"’¢íZÌ'LWæJ‘«¤×e𭥟dÑû—Ÿ& Ð ÅF–•¥&˜™ ¾è˜lN òp>C¥(1jý*[˜;ß@ù­Êo¦8ÈŠFPt(AÕ«ÂqcaÏ»)Ò¤Xtr‘}9þ9hU1BtŒuž½ð¡9ÚvæQ˜ŸÜàþ¥)¼G?ùâ9ü[Kº‘µÅØëÊâ¢L¬ôe ŸdÍbáü„&>é ,§<@·AãÃØq›•Ä‚_T)òg%Èkf_EÕ®  ’fætŠ@ݲJÆ£5«öŒ<_*ÕÆÀÙâÄë’‚çG·Š þáþ¿·Vùyôƒ?ðÚÿÈ+›M:?ýøï€íúIüœÛ*°,YÓa›w¶»-8QZ-ß·™dbâ–OxlÇÖçàˬçóN®°ê²‘òô \ T.ztÑ5=¾_IÀÔ\Æ]è¨ó1 ‚Ýäݘ¹{£ ­=U(Ûy0aÃ-'ÔCvŸÅ:5] 9ã×) ÿ0EúùzãÇ2€GIÒ­øogD3£éE´ "΢Æßø­ù€ÏÓî-Ôƒf‹³Q*ŒÙ ?µ¯tÐTrHšQÕTÕ™åK*Œ³[—‰–j&ö¿t¯2….wž_þP×+殯V{M€ÑÔ·v•BE éÈK£ÁïÇÉ“îÇ#G[Ýð[AÙŠªšÝ¹ºÔH‹Ó9µgƒ ¯…Àœ5),J_ŸÕ ý#:I&0ð”i&ªà·øn’ù䚦õçÜ佦jâ2µqxÏ`¤/1ˆ¼ub ÍDDþýÿþü¯ÿîïâo%Å NÆ–—Ñ¥Ù5»W¢kZ}Jš×!ú#[õ ü6‰¹²®A´2Gm[âÛ‡m@H ÑèĈçcÞêég £ó¿†áÿQh-šåÕ©}DWBÑYT ‚f |Æ ¥È¡"8€x :“ŒÐf‡Ò˜gˆ#—–°PV,éБrLÏV}@«@“‚dl*;ÊÁ›úŠ •¶8³½Y¥ÅÈQ^ñèØÀñ‘™àò>sìáœòâü?u|ÅËÞ%ÜL±úMÁL¥) –d¢ëûÒô¥ÀÐX^GÁŽÒA’S/@ʰ¥b£Äh*òýmÕʉM]ß1”¬2Ú÷u1ý|©ÌÚæÜê V-m0X™ ðYMxð€x‘æJ‰ßí˜ÿ÷y­ðÕ~œã‡GV Ê{ý § Ψž—b5éÁØ_NvÍû‹®oÔÇd>@]ypŽÄkªŠ¯¯SL¼ß~3à¦ÙAž)Š—¿ÌôZ6MBFooT±›X$ÝgtlÙw/Vf`=!zñ¦¦È+™+,úy™Õ¹Í2E­Š‡ë­w BLê e`Í´cH-ìÕ\éC»B{¿*j?¿ „Æ|µˆË©Ï(o÷Õ vFöAÃ5úéò! Ý6CóÅ_+ÂÞìþ 0„&®N·ªˆíõ§^»+¬LGˆ¶p;·Žhe`¥ ·ø9­À]\£Õ‡§ë ÙŽqæ<&ã±Wï<¶î7ƒ˜c¾zª0t|œŒ›®×œúÑÀ46‘P­ê$–l+þ š3Õ¿œ|ÀhX6nߢ>kA9 Âå¿Ú=µ*Áž×`†¦þ7§ÖÛB5)FmU*J k ó¾;à+š3öÞ1ûIϤ<“ÚI5 Úã‘þ™B9æ½®i‡Ë–…q&íð8£SÞ(ìàæ¾pT‘î­ž+õ¥¦‡2Ž®ØGÍ1Ð_ØLQƪ8 !оišÅ²^?CEýùù mõÞ‚!UÚ„ë×Äè ç$­?ìS?¯·Ûø/²‡n¿#ƒ½Ú‡ñiMM[å@õ" ðœ˜[‡>ïÑo2þw¸õ(ô®Þ?Ä’ }–ÿ| Äät0¾}ãqÃva™_Q*]CIÕ¹åÅ6mØÜaÿ^üëÏ0ëÿ#É–â—Vú_=ïù|þúÕÿ}ÞÓ&ò·Â/ø8!àž`í·†­ãõx~[Ãd •)í)Í:ö(š ñx Y2/³àc{.îçÏv5JÃm4·?eq©£Û×k<r)Ç7ÆÚU? ÷œÃt¼Yœ'D&8~_úÙÁö±Ñó¾ûršO|̪³÷5Ï «ÂÃײhRØß,ÿ&Eÿ=È-R%˜6rpÄ¡îjS·£Ð¨xÜv°,µU—Š!²…‡)/×1 Ž'!UØ4¤Ø²¿‚Y/™Ðtú£ §W{ï2ÌXâebb`†ÉΔl²hÀp™Tçg² &ý€Å b›w8¸õ ÃÈ¥§ÉUê<Ä•öŧ›‹,¢m÷yL×¹sÈ['3¸™·¾ØÆa³5ð¼ñ†Úÿý Q¤0ëá9Še‹wIôAT jÝøêò{LT.ußft›ÓBx„ªÏj†<'ŠÒVó#6)S$†Ë3°ö’¬ª˜lª+™éH¼-ìg¾¥¶:ô¸É¯wõþzé2JÔh íB”ûi”,—«Ñ!&4¨hùôr `}![UQÌC§šAäª ˆ -{u½³²ÎŒ²Î¼ˆèæD“|Ë!óº4L¢WtëÉ\§Q¢4±j}èÀk5˜÷4E¥Aó9xщú(ª¦©$ìÎ,¬ÞÉBHT yXiÉÔú°©¬ú̖Ƙs<šc7‰Ç¦‰d…ZÇÕU¿5"»êkƒV)’bà]Eáì ÁǤ,#ßÔm䵊~¡x§\9|S£Ø§6à>¯¥œò 6ê»`'Oíi Ùe>.u–Ž-E“¸¹ÂìÛª‰¢þ”“Þ‚Œ„®y9­¥ÅÆ´Öþð«ö4°ÚØ+4¡ð–uP¬‘Ðãú"E}ÇÿÚåÄdI†‡Œfi¹ª«_Å9ÀR„HÖш£[Oèñ“Ôiti{ǃP¬ï첓)q’Ue[«›ÔÔOFÿA‡g¢jÇò† OaB z‰„|’ªwG$V/ÌJ”b¾˜·S—Ÿ-¢?Xþe—/ gKL‘ù+ûÅR‚©“ÒÏ=¶(ìÒX'„"¸y|×LKqö$4D>ð5>Ó »T^¥¡/*B}ü¤ÌÇòËIùðÎuÒ!“EèQ<—M·AˆX¹Á‚ÿ3ÔrÄf9­Pç×=?tçBÙ-†ñiÅî°Õ˜øbt¼.VÛL›é#Eu¥<‡kÏs@„oÙùÔ‰uŸ·Ïõ®y³bŽÄÂ$ZZ§¶ðáË’UñÕ&ÛôÊ:Sè" GÇfG±!ß3í2¼¬”ÑV-Vôü5zl­€¡ŒÜµƒ#uioÂU‡w·öN§¼ 鋤,¢V§>«û™…NÓ`ÊvUfq­ÃžƒÝ}b²·ª±DsÜáVØÛü>æG‡§cA -V‚ò‘’dÀbu&ë¤>æÇÛÊõG²—ã‘®˜ã;áÃßEß?¶¯¬å+WËVúø^½¶d |\ÜöV_2×ÕQ·JÍøsi¹""¦š¥Ä/¥ê„bke”÷ÎOÊû¤¿Îéí¤Æp2) ïÛ –¦Ùõ³š>=UQJ0ô?»kôgŒÞŸ&x3ýçŸà׿‡?Ô|~”øñG_ÓävnáÅá@~è9úô÷ðiÏOèØóUÆô5EXÈö¡×E|Ê£K¿n0ÆôÌ]‰V£Ô]¾î –Kš×u?ø¢å˜-|Éc&v/¾þ²7ˆRRáˆÊ8èésJ÷ÊhHlÎßèÞQ95»›oÆ)¬~ sò±w‹ØÕ¯¬~ës)/ Êß\À¡UíéäÒÜÛ¦Pz8Ñ赊¤Ü²üJjb³ ³ÅñÔM’þ¿–Ää·†±î^+kó®±ö4–^P=µ"rïÕ`¡è½ß²¸÷K. øL.»f|ï|]«Ñ»žÙVÆÇDAäâ½B? ª9£Øs¨¨Ò+æÒumXc£"ZµäZº˜Gš0<Ç-b-)¼mŠÆØˆÀ,[> éÎ\Da~Åuø¸—Sjù¾i–¬Ä÷>—3]¿·ÃUžä¨…ÈËüo¦æ ® <óuhÍ|;Šn°lØMŠqífú–iÑø’í: f½œ”½®ÉÍ lŽ:²eQVê“üþþæ¥âŸËUwÿ—*-°ªÙ VIOy{PÜž|€˜žj_¨cx6ɃºK!²ÊHq¯±"—Aoª#›±FÞ\tÍ*9YÄ(( †]ö‚¢ÐPìóZ¬þ³²~Ò³ƒìh‚qN—*ÕL«J¥ ¢I¾m=Î"Œ2Á¬bÈØ0XPÚ n¦¹VÇ:V¥g•cK'>»V¥ þ²AÆmnüœB¦±iö]nLM2 èIöYpÇ+ðM­çB9^ftàaKÅzRyHTæø¨åC „‚ ÿÀ)Ÿ?ù؇Cïíq_Ôâ¥DîD È¢y¦ ëÛ.ß8ÅJnõé°Ï’6´D³4ŸwŽ™&¨þ³-—{1XÆÏ†Ü‡sî)ÉA6pbÔ`ªpɹ+^JÖ` "¬Í°ƒl(¥Ž}¹hB,Q<βå"¢˜Ø pÕSÏ)F±c@ùA×\ˆb€ zÕq…>‰n(£Å ÖchØ*¸;æ°<y{AÄ;[üà6G4>Žˆ°j:À‘÷E“i…dx6f í_·Õ—Ý^û1tN¶Ðºº9ÓÂj‘½@;yO6å­— ±S{X-¿?íåbllq¨°µþ`B¬|¤Tø™(¿nµ6”9•Ú£%LVô­1\ qþÃ×)_Êo•ZÔ¸ nÊEâ)1¾H:¯A „¡oÙ)´J£ý £=ƒ!ÿ˜iÜdÁô—Óý‡ íÃü #6ßFo´¤ >1ýúg÷šñ¯(ö%$gã~öL^X.Ö_åéc<@©\ÿ…5 xvûíÞÏ|6£Ð¨¯îs|mS¹F~‹ªã¡m+f¦Ìpe¡cÿ4uq=+þÐø÷¥“Ë/'üøé8ïùgGè~·Nç#æçÃ` /ÇÓ½°y^$È„ág~Q€FÚÀèÛTíºAT9[îƒC\Š+ øQùR4-&\Še6ÂÌ!‘zxb[NØÞÒPȲ/>%!(G!rŽ— D‡ù÷ä ä 2z‹£?Y"ugº¬×-ï™L¥,‡ýè™ø(G3=¬ðè#R|(Ý4×Ù|À¦1\—E)pÕ#¶þÈ5>íØŒ¨ÝVláå(f÷—±ºÇY«|©I¢›Q(>ýXAl(xœš¬j{1EÖøÁXÌ SÛÚš£¢T:0’J95«ï»`ù¹4„Q@6”VŒô²¨TqG–êä*uïÍØyXC©OUò–#äÃ}>’|¹¿ÎÇuœ#Gï,~_Þÿt´â²²ÉOÙS].®sp$–»<‡ÐþÚ­ë+lž]ão4y‰ì ÌÜvÛ)ëà%µïêÍ^[žúZ¡*–×ÿc†à)濈³çŸ?Ïêh G\Ê »;=X¬ÿ:¯æ0žH°¬—Õ<©Œ!T¦œcãËÉ*@êDÂϘ‚*MAË®yE ³•mFÜü >f*OZ:Ä›ÒF"§-ÅÕLÔ¥¤abaÒ¢:@Šl¾.T% ¤‚XwM•¿¾“dú€ût¨§Ýø„toVXC.ý<ùÄÔ8 Vž¹ö"3dz³<Ÿàà ôÞ?·ª½ÉŽÚÃóãÊ/õ7>«ŠœGE£¯—ˆ#aE´-_ÛʷŒ ö¼T¢¡ ³–2?9?ðƒO>©°öUôÓï¥þ÷’³íáXíÀ¯9íºjç(Ül¦žù‡Ûùþã 1?…ÆHÿƒ}‡ysPÄôŸº,¯Š¯¯/‘ïûŒÞ—‡"Ä‘C…rîèÒ†ShòrCM•Ÿò Úü kÉóÛ*ÇšGÇÔŠÈé^»e£ÏÅãû÷Þ)Éÿ#Š–ø à½Á?¡©~âýàÓ…%?´õŠ´î½­ú¹¦R~ñ2>½fìEáQÕ[§úO»“Ümôœq„T—q} –‘‡ý3hõ'& D;p¢|*hºá 9:†ZL9€þ Á•÷y{ðè-€€JE#IêÑ”‡O¿ü¿}‡.©³fæ<‰W=M˜t¬úÒ¨;Þ`F,¸Ýw?Lmn§Õdƒƒþ¤iÚÿ` €â”å­Ïå•pæÏšj!êÙBC%›(I|GQϤJÚ0ä€@¯?$£ê­CÊ9NssÜÛÜ ¬®¯ 鎴^RøY‡H°\a” F¹k©¯5òVTÀÈ GþnUPyB;(‹¡ºgƒ³Í©Ñ»,é÷›Š\¡Æ­”%Z-4oÄŸQj1¼)j½Ÿü ñj¯ê=Œ­¹ßXþ²ÑŠ…§—•©´ m•£xóDR$7hÇ“M1Ò)µÙÊ÷aœÑPïÕÉK$#IœE43š]Oj¸8ìÑÕS&M¹ôTUÖ²‘sˆ Û(/°¦Íö Êß0³&l¨µ¡mDZñÛgZ ÎÖMµã\<õ'³{Ï™¬À¤ôüì艃vµ_©È5Bfâ×õ½,@}®…{3LxÚbàõ%šThdÇ;¯ GÿÏbÓ¢Ô!ŽÜ:³ýÏs §[Ã\9œÒ}“wN ö²mƘ]õ$ïå÷7UqÎu€{[ï§;L#¹xæx•âdºss(‘VÝòu‡ûw÷u€ƒZ¸ûƒ±¸þÃfã¬]%æ¤Ô¸ë9M´0–¡ìi¯xW º,ˆÈÂ(_4ÆÛo‹cåšW³â2¬+6¤'ß*ÃØÆtâ¨Ãõ ¡*îåPxr»@ÊÐàA^F6@ò8HÛ:J{f¤=ÎU¸kY|ÿD˺Hd/¦fúá}UDc„Ý  M `U›ˆ]KËE3¢`µ¼gòîüÕ‚ IDAT»Ž¸ü *#kT©¸„ÜèΖ±ú"gTNÙÕg"(ŒþŠ,NSÁaÀ1Ú7Ö\ -š9×qw‚ƒñð޽F݉ ɬ?ya%ÁËŸ¶\+Çæg„ï¸@-°Àhr€7P¨fËzöàÈ1cm›=×ãòÉ· ÖFÙåÀ@,ê0>¨AûiÊ—ÊAçžœôyŒ}ËßÃIÅ­5ÿ(epèþo §=·ƒ€£N[G5}hÆ–Ü_Ûz”vYh*xEÞ?+²{èÂ9®øüÈÛZÛ{¡ŸT.iJá|ë´˜«U4? šxoçYIZ0NME,%Û€,£P$jG4$ÜžOù3Óª[³šÉºAò5cÚ¶JòµeðPêªÊFñ™éäû“2hÓV†±â1 >ù»ká(\\ÐD5ÿmuÉÆVÚ™l,Å´íÿy\ƒÝ xz}9ÿî*¯Ð-È[~_uêU¶‰²Ý$ò®œX;.þ Î}bùþŸ] "«7%Õ‘› ݳ5…ùL[zŽ.·>'íxÚs˜ùž*¬Ö$§äqŸ–ÉöA„$ÖW¥Ñ¿XmÛ¬Äí¿ý4­}‹Àx§•^k8á_þŽÑtß‹è`iáˆ,'Tì™b'o*»i÷ϰ¬‹“FéÀjUïÎZ¸O;{/2ÑyñW)Cuš—ÈÎáÜä5Ák?§ª…?Y`äŸøãÿ>~ïçÞ:þ«×å—ÿÖï• à÷_ØN¼ŸÝ7ýˆX›LZΛ:Ô¤ ¢•u¾Rû ‰êNZEcØÚÚjeµF©@½ D±ÏóG†4à7=„ɱҤ¯¯L`$R5k£CqžX°DÚŠøéez#Ä'É$Áæã#u¯S"òU2ëCÖo7ùŒR¯9õòÏO¾”g#ÁßZ NßëjE;¯»K|Ùí²æ²¦*$ýmÓ¢ÈçMÙ<ƒJnlfE÷ß08µù¤ǹܖ¦|óRx…ýO³ªé¬Ñü§øõðå‹[¢¯Álè#GX¡¯]=ÁEB*ea•Œ hü†}%ÑÖk½#1É yåC§ü×"Çñ+¬žHf ùhœAoðºÅ<3þ~†ä<þ0Gm'óbçž IQ÷Q¥%šÊ=ž[>ˆ¥Ù¿‚‹Ó”zï„íLµDù€¤1¥¶¡bûþ¾f7úÔqÁÉÉGEŽîVÉ,‘¹³Ö•]”ó>BÍ>äÀ‘\5é¾û6ÐóLi[m*e(o¾Îk¨l kœ)t"÷ÿwøƒ¦ÝýqÚ©ÉLY)k)m1¦\ô0‚¶¢áD½ ò"a>Ä-ïS€yZ há?·ð†dñ`_æ©d• ôuƒfˆGA`,å-?œ¾BÊ`’˜ýí3²¸b”œZ”“T¦˜îï"†‹®Hþf¤ý&¤‰ROnôÕ?’â>Î…¼ã£njÇœ%Ûf40,® V]Në¥!°Žƒ:0xÐRÝœÄ>êÐf?B`9ºÓì¾ÇãÛÔ¬.-¬Ê*!ìjdYa¶+×'q²SZ(—öØ„§ûlƒ(¡YÆÀWNÕ£iꟻð—·$ˆ¹‘sÐ௕Š-áÀÍ¥§#€`Aìñamå¹²jðu#Õ„ü:'µÍWÜ(ÿDSãîÙ0'Ç_ú€bù4=Èù ؉ ¦‘¢®]Q?gÄû¬4ñG̶Ҩֱýá?uÆmf#žòF—wT]åžÜ(óüí/ÞRß÷£»4š'C ÷”VguÉ€ÿ¢¯/”¢º÷*Þ@>âbù‰÷Uú.¬qºµ”9oª\HŸ¤«h–òîY.±Dœã5pžecH“¦%ÜÍ·ïQh| ‰Š«ZSOÐç'R¶¼$F4;Ú Î2‰Ùm ‚í>îÌrTi¹T½4 ü–Ô\­:3Rô'ÆZ—z­‚–Ð÷³.(¯õ¤üÕÈÉ$jŸki¹^ Rx‚þ>´ BñJòßïxN·e ž¾9Vò'§?T|Þkv{Òçdf3âfÖ–JÕòãðœ¦e ¥©Çóûä»ÅηéÃiެÈŰñ×åí¿ò'ò%~††<•þÙxÓÃB¦ã®¶FùV™³š© .¥óùO‘G’O¸ßErû*eä㎖åL\#€é—/ý±B°l,äòº~þ>f2"§Y1aýplN¯_k´Y‚2#˜×Y°Æa'ðXt2ŠñÅY§¾¨ç1·‹Û`˜ës Ï¸ÛãÂTñ‚pL Ï¤ú³øï"‹œÌ÷×¥M4È[C¦â:{Â1-¥"f…V S~ Xg&;pžmûfzô—°¡Ÿn .û±r “Ë‹PW=j˜~QŽ1H!å¡þîÓu›<1ÚŠ{Œ-Ýxå Šñ­,Ÿ¸î"Á´ðƒfýø¬Ú‡ü=6Žtý¡Œ‹½Unôüy¼©)Ĺ«ÊqÖ ‘Ÿæ‡ÞK>Ç2]'÷“BF¥Ø‡2¬Ï‹Ôš×ŽÊç_^C(_ïH-ÿâ_ß{%÷¬@2{†˜ù}b8 …ö®@V=˜íDU“w̹ƒxØy>å®^ƒ*鳿MFÖTÍç ­¢¯ª.cðÞûñãOQg:ÓÿÇÿ_™1¬ÂßwŠáW”Ÿ77ˆøÈþÃÔ^!ŸœC±ÿÝîO/ûè5,…{ܾœiæ1x?]jÛŒF‰aC„$wàõaÓå-¥àµ©èÖ_Š¢Q"Ñ2—çvÿ²ãcMÍÉE9îÚ­=PRÿOŽ’Èh1† ¯ß¶óõøcÖÇŒJ•DÊùAíþ ÙØÙlýGQ3ø2y¯xæ/ó1•3À9€¿±¤»øóÉ®Jɽ»ˆ³R‹ã3ø¯©üøQ¼ÄYÍÍùO¦ø‡kÄú^ŠU˜^|ƒªZÒÑŒ W,=Cº4윈H`ÊÚ©TËÂRÊk–œq¡™Gùíš™I¨ Lâ~o¸“_Uᣀ!D"DZ8QK…#*‡MÈ¢Dçp;ª|v[äAµëN¢mÖKU3Ëâ¦??ë¸^Ä$r¤i²9¶ú¬€·¬lÝQ KŠðÛð%Ô† =£à¬i =Þ`°Ì…Äoª–HÚ- ßß´kß÷:˜"®?¨z¾¢LÖs’ójQL‘ìÍ0¹¶œ~2«?0hã‚PÝÃ=¥zqÛ¨~Œ\®‘Ô€|%FapBQ#Ð5“Ž/ny–ËÁ‘£Ž„z³p¡õ¸ EëÄЕ7u»ª+‹:MlÌŽ6WTZaœVQcœn­Œœ,"lxò ÔŸ=Cë@LþÜýåÐÖª^s9R(_ª7 l]²-œ#‰ÔºýyÖD‘Detaµü—2¢™}Ûe`¾Åi›‚â–W~¢]ÁÍå¬ëtÜçþó^/ã]è¢O !rÓk‹x w‡‡PG͸Ì6¿:Ïg½ù}içœB´ÑhrcuTX¢ç.0¬ÎM®•^×ë îE 4ýº ž 2];8.Ð\œß 8;ý˜§ó¹m¢«•f–]Áîç-vÿØ9컑ž /¿ú¼£¸"? sQ“¬‰c¸‡÷9•:‡Ú¯•ùßK&£ÆæW|Í2¸#I‘¢RHöÖÝ?•óº÷ðþKFÆhßä$-ö·à=]œôè„%4"¡g ø8˜O˜x,wÀ oº^ó¥°LUùö›ÍzÞ\œ+Ÿ/œ3'£¶}Éó£™»é…5%yàz>‡ó=´{f,òl­‹O]þͼäiÿh-íf…1Qã@ΉØ?ûW~|S—Å}(¾H¢4ŠÀ˜˜¤þQ=9ù¼²ü¯ ø¹Rfâyì#çʼÿŸ>B„ uŸ©»FÂ{Âr¬êQˆàÞÀÕò›ªª™ªÄ*9˨ü‡þç}žð‡jÖ?ÃOVûO|þ„ëé‹÷˜þMKÉy–éèãéütô˜y<út¤žçp´tù4@‰L“u¼£ @‡ÐaÈÈt“˜@Ù3`B#EÏ%ãdÉÀ_—Ü/™Ò®U» §<­­k04'©R>·ð¯Þ 0F~ã éÂÜ!bWºÔ­<«þPÔ-?Ò6°ûcÖ±ÇÃ}ñºñšìÉÊßèk\‰†Á“u½šÖ~ÏÑVölk´LVß…|ÜÖŠ9hÏ»+õßßßç=çûûÛïÂ$ÃJ {®uK¯Ò¸5%ÇÜýT'ç´ [¿XGbDé˜o3‰‘†™]h¸îç\¥±w#éœoÐÒ ÿ5:J!øÒóÝUeu‹²* º=·Rhg×9æ™3Z†¸`äu@€:”‹¦Û§õ4­üiV§ãÞà€þ$“;ɇÑr sV-bV/UÐ-Àó¥ÿõÿü¯ÿò_ý«D*Åf×ÄL} 9Z¸k¨êÑsôë•ø,Œ&aÔªÉüJ¤ÀTeÏä”b»®°N)¡”h|ï\1—×i%¬Ét2œ¤Ù„Û ˆ8­ ‹Š[b¸àfõ£ž ÈNÛzÉ1´ª¬¿Â½…'W%ï|˜Â!@,S³\Á‰ÖЏoŒ"üó¬ààUKºnhÌQip¦Â˜­CbhŽMýIfB—cðqS‘²"P÷©]‚HùÒÍRú€ý»h_#†6VM[UóF9ižôlp¿c3/y¯ûÝqJ4köå#Æ”ýTç‚^ë€Uyá׉œöžêŸ…—¤û¼fª8hOÑ`Ÿòƒ¿’£˜<®s«’/³;-w›L7of¢Á›>*vÖQ§=§äÀà‘W­+’¼aKÁÊ»p©' .`Zí™Z8f¤ºIm³F.SGA»æãÿ ÞÛ·r7SghËÀ™)·àVòšÿ®™Ú C›qUg<&Å.)ÌÇÿ*ì@ÃÜ —à {ÒÐøŒdYr›µý·Y»g:‘n¨YS„…’.ŽYDH.ÿ‘;_æÊdz…Í t —6¦þ¥­Ä*š#Ô§iaLïúÐ8?·Q¡‹Q¶š1&Ž6Ü”^vkE²_Ú;`;ÍI{ã̉éËËÛq~˜† TILŽ9#äS„ÝhHÙ"2uûIÇ¿&åvsü™8Áí1f;,Q+b©Ñ¥ÀqªIAºv¦£^19C–•T¢k`f É,Â.Ã|ù*b¬ÐoöbÇ;‹Öv©r M%Û¬“ûLsÃH–C,Ò­9°+ç =-]hnø2N"3 õpéàEŒ1½ïx@»h;sÈÕ9Ó7MÂøòpÚ‰/ŸsYS,¿êS¥ñš­WЩ+9z)§co„'´õ'³)~´ïS~ÃówN±fúEj“ê?†¥?ÕQOÌi °ìfø‘è>ÀL°RcÛÊÉžÅH‰|–þ_އæ7®»…âž‚ã#fÁù’¹¥Ó—8~g‡g\.ÄêÀ^·ä™ ØÝ›¼0bI+ í㎜LÂD(•:\ ›g2ÂŒµw®(y¨ÿ™€£ì®%ïRÚ°¶Žx*ƒ¥·­GxKú×pNáâlUf;F –ðI/Y‹á¿<»’",>&.\cRË¡~p*>¦—~µ¹æÐÎc¬ÒŸóŒ”lÆäÜf?.ŒzŽˆ)² d{©ëW}8>UñuIÉUHçG3©D´,´ÊDÖqcÞð1[s}KkJ…±ÀŒËÞ#Él<éÐÏ_@¤¹”ÏlÑs–סxÈ3ÐÐøë9ÕÀ»eyH!?ò¯åbT~)í"Ç + þ§ÿY#é{U¨žk†‘°äÌV!1mȘQ¼xßH_ 䉛É S®yeÛI¸»#ø¬gïý­ªžÓÄQº÷0+ö€î2²¬ÐLó±¬qžÂkSü~þ©ZãÓ¯úãÿWQ"þàø©!àÇÓë‡ðqdüñ¿œâ³Âˆ+~6¾›íƒ מ÷ÏVô%¤±÷°#” PN¬kB Ó뜒º…0:ãÅ¿kO_ÊΚöé©JÑ9;„’Q_œêC¸5*Á@”f+T‹Ö“#Ñ4:¯ñ{æ RÚD7)‘ޏÃCÐ`OWE#Õeóò¡qmÙVË/fVØØ¡ýÿ2€¨U7Ú9.è˜oJªgç­vŠ÷*ô_ëî²ÚšƒFÿ#–}@E·uÉÈï{‘J6˜ŠÆtôß'ê£p€r‚ô`æ3±AÍðMC uŸ©õÒ15—©‡”,RÌkŸSG›âûSNÚÝðþ]òذL¢úµ¬«Þ®Ü•Å;šý²ab5ex©¥u*u)Ôhvƒ·CØ…Ê1¾2Ìù ܕʎ®*v‡v™0<÷ZZo僴›x`„$QÇ´q°¶Þv/NÒã‹Z~T½ˆ@Šg!zŽ~éºþ…0؜ąAF“ÀÀ˜G³q™f„-ª?ªéø*„w\ a‘:“ÿ4;©ÒõéZ]_'šµÙ!Ö”Úh (`Ô ª.Y«“{S=_í‰)bHM¤¦µ[1£¢Ìt|xày§xÞqµ‡ì“URŽyÒŒTPU3ZæàOôÚ™8†|ÀþÅþˆQŒT ¦›eöÜgÚZÊ!GJàÌ£™£Ž³üw±®š EO<ý»gõYvŸ L~÷ @‰‘í™ã¯sÎ5‹‚Ô(ä@K^–ZéïayïÆê\,óIñ *1¼šÝ«™¹ì^6k>à•Ú2¦' ë^O­®øÍÞIYÿ¢x<•ßmÛjú”=Vpn;KaÒÂáí0ÿjÑÙjTwG-~‡3®½…9ÑQÔh”BÌš¨¤Ù«‘/Õœ‰EsCùMB¿VÅë<[¥WÈ)GúP»$YÚ1:dMœG© ð¡bºÂ†R ŒFLvö¼—PúÜšäb•qóG»B.q=±¯ÁâvÓêG“rP–H“zè³Âåó1wŒÒÌäŒç-âÆnÄdÕ.‹iŸŒhr兩2Þš"£^0- 1;?ãºG½`}²9ÑtFíY„ÑÐÓP˜¥$d³Yöd]k_«d‡ @QNîøl3ó¹"£jÜ Æ:0i= hÃõ~ñµË¾˜HÙÕŒ±>È0”å+A™wG…°ÆD"fÂòôÛ!ãmãgT:ÝLòÁÂe1úãܘPXŽ Wl}˜F.íŒÌ‘kŽzOÑšèÁ#àO> ©Nßc­”asLN0|M,F¥Flb†wòL—à##ë#ÍáX iCçuu܆~\Uf"ÿBùÑ yÉê?À–æat57QŸ¯„Ä笶L“â±ÈSzÖÔT— ;œÂ±ùI75 ýUÈz„ŒU¸ç(ÇÂ,`1g+µîa“"‰ñŽ­ž2cΪ¥’ÖŽ{ÍLP_ëËݹ$_HõG Ï?fîk$…mJéyÑ÷Ø<Åk\m:³È5‰_nÉOâÌ`=#6aˆ2blèD¡•UÉ/L¨¬ÍÊ/ ‹[¹)Ô%¡c…2c~1Í$íÂîlvçKÐéÜ~Œb~vœ§öŽ›%r.Ý”)°9»äCÅÿúTpÂ1•wÄMF€|‘Űîä½/"N§6_ó¼¢fqæÓ6l{tž—_,UÄ\ŽùËë8ÿòß$Ù¾¯% ™9P"Ú­Ê|aµ“/MdVMÙ_{á R€¬QY¤”âʎĹºÖÑpêKlÿ°ou×¢Ž ¢8.ú”-ÀF 9‘ÓáXbnoòÈÿ¤ÂÊ^§_ò£âøü÷þ<Ùò#è59~7`òÃûãgÞôøÑC ŸhÿïY×L ,¡‹øª!è€r?>ÝRó@^|øY‡Ñ§ !}ØCb/Ûì¸5Ÿ fêý£RÄC´`ÍòQi©ÔSÇPˆŽÜ)ªG9g\yâÊx3î;JcoŒ»,›#{²-àÔè‚kÉ×8û²å²®ë•à±Á³˜ùã¸Í;|O‘øòx¼§C.‚@³FŠD«A[®œý"¤äZí2›cˆñjxpñàaíLÀT1æ†Ô~±9~H‰DTq]ÁVGÁä b“Ë—hãæíÈrU眊ºÝœfßfçÞ³Ç-% N6Lv?‡ÁÕ4ÜÑc»žä$ð%z˜ öι0ZF²'àqÑ’³(Ó‹†ú"±áQ •ëBçQ˜DmŽ'ýŽ7ð[¶Ì³«5…+á²Üˆ^ÅŠÎc&oÈD9Š0¼FÄ• ö4€ÿç¯ÿ÷?ÿçÿÂí*8_J㽤™c~Ð/¸ÚzTZ&½8É`¹ ë£WT!­výÿBîÒ²¯’× ¡¢Î Õå ê¡W ü£Eµ)ñì **®U1:Êß¾>s%Ä‹28ÑS ]Å‘Qé\ƒ,—ÄY:!ïiŽ‘óåÄÃј¨Ÿ|É… B¡¢$U@­ËVý—²æcÓ+‘—>i°h‰'vú­* )tLOµ‰º})äµOd lR¾žA0‹NŠE)¯ÓÿÝÌ‹ê¹Õ¤ yv•Fëæê/§ÊØ“˜ž4¼Õ¨G4¯° Y²eEï˜|ò[”fò"¸”mvËÐsØUEŒ>¼Ý?LÞË{º!¾Ð^¾2†Š® ‡? R?èim;ÇÇÖ…†šÅ7(3è°X¦yÓÚÔdË8FòÖߟv¼z•Æ};ÉOl§FŒ—^Èä—C*&ÄðV-Oôc„«¯×Å9©]tL]‡-å(¸p5C?x\öút|GA1ÖV 2+v?y¨{˜rgåZ¡Y»^Î-/³;ÙrìKU9ÊÔòÐrKÕÜ­c×è—i4 M)UݪX¯K`’nsÿ> xÃÝ5z0eOÕͨ+–K]㼤?µ~`±ž1 Áv|NteËGIš¤$VVaƒ9'ü0O³é¹—Ÿpî™:âhÏÅ蘑.Yÿ¿¿Ùç1†@Il”Ñçe{¢ø€¶ÿ€âJ®(~VZ@‹ûçÿZ²íßßÌï×9'(—7‡_«ô¿ñhÚäšfÿr&v¢¹Z±LCCÄìïCOݸëÒ^ïeïDª0³Åqï}ýE`‡» ‰öýÛµJ²«³)º¸‡IòîWëÍŸ¨Ô¿tgþù¬çûõüèÜÿAç œ§XK Ÿû{ €?01ù.sï÷Dêï_þ›Ç¤zß4”ڲεjÔ'ŒÆ È\IyèþJ®JÍ^ ÂÂm¦ŸˆðÆ(žÊI ‚@ª' ìj=E#@/‡Œ°sU¬620ªG·‰¡Ì b  ßs®¸+Û{[÷‹&AWMòùš|6cw_ÞWÈ›IùgÏÑþøi†ÂÞHàY‰Ð·®«—~‹t¤h IDATi–òmCk£*EµÂêhK-ª7Ëaêÿ¶ ûQRM\V’*I$ÇÎl–lÒóç}½h•Kµ‰ÅÙÿûûÛ-å‹tõDU¯™¸‰Ž˜0¤M‹TU1ǽ¡ÍEqš—ý>·“èwÿ˜wñ•,ÝP¦ÿ/wo×k]vçs·(JP>¬(`A ÿÿïä"Œ@¶“˜‰(ÉbŸ9*ã{í}º)«iDl„Ø|ßsöÇZsÍY£ê)ÊùÑ¿3!/€×ÑØèxF'¤Îhr\ EñŒ, æ+é9JˆÎÒúHÍh䡯œSÁ/«ä|Ê~~ws^ê>ý×KÏy™¾®]˜ñ0Uf:…æS59¢º³49UD°IDHœ *ÖKtG:€¦?~Ѳp,Ç´x;ŸõûÆHÌX‰Z] ×ÓѦ’ï¹¶iÉD^•†ž¼NhžÎ,;5Z° w"™LäZ™`‹CJJXL3…2[«šz29ψ£¡zθž˜P7?­¿ÛÀ®ªˆ¯&V¤ËxŒæŸ‚H6,™Ý9þ"/ƒ·sÙ,?ÿP,‡éÐ’05Óø#¿Hªü@¥~ß ¹â¥çêM^íK¡ú4-¼{3Bâ/ýèÑŠÆÔÌ)@`WÖ,É¿›D­y’¯ŸU‹…ã»ÖrȨªgËù•'rD‰PÈ©À{EãZ“Gn¦P«îÇ,ŒñåÎ!i’…·¾*BŠrU˜©z«ÆìN!&WÉ8A-¤…G{«ÿŽT>£¥bÏŒ¦Œˆ@9èÊë®ù œR&Aõ¼¼PH=GÍ¢@5DYØ $GäBìÓm7uaU¤Øû:3A f2ät½Åk LµÆ$ʆèX‚¯b§!cýT.öwÏZLÆ7nÙœ›O0³1ç„Ѻº+1ñyí.¶ºV µ¶ã$ $D)†ê€Ö:Vº¢`,@FqÔ2×âi49êø^Mò^‹Gyµp0ª8ª´ ‹Eí‚bE¶œ¥Ö[Ó@Yuºûñ;³Í;£ër;ˆ˜—{D óõLWúÝш¦HùµÃË{¯žS[{–¦]8‚(ÒL†uo|v@r8¨)[j4/&¶ÀÔ¬ÍMÇ @â¦{±Ú®ÍüÕRKôº3[)Ê }ö!1„=è4‚`0µÒtliŸu/“É…¾` æ“^ÚûØçèD³£o¢Žd—”ÜMÔ~µUš&JZv(»HaÃ0&z©ƒŒýòÛaË|=šv/ó›û~²ûÙùU{PÔì‘*­ó‚>\s‹¢ÒªŽùÈ6¸r*™[w—‰zéÀ,fŸèGkpyÎÉq«ä÷<²ÀÝ«5ÃúS<3Íýü´ÕG!Q~¬Oþ8X[ <¾ÒA~dînСþ³éï³Üb0¦elô;¾o™ágo5ƒ aXÄæT /½å\àd÷&)’­ûÏlàªWdBØä}`ׯS¶›­n;#7@8ßÉ¢CÔ?3ìAÓŒZAؤ)¶;Ë~×292=5_ ä«é&x|Í5—™È>fI@fKF÷j§Çp ÈM‘vÍ/xƒÆ ¶~’ç½+Ëþ`Tvh·–`ÎÛ¶£ÏŒ «  ‘n«a#æíeéÀÌ%g†f˜†§Ëô1¼{"¥im“‰«ÊD¨Ÿ¦eôÖÑ3S0È+…µiïÕxï·¡|;^ñXËJÔZ>Ndçýòçÿ­_GfîýФ¦RUa¨þðúáW¿úAD~üñw¿ûÝr%y¯Ýœƒ‡‹øëÆF ò•6MñƒßF!°§›Ý/¯/G(UåÖZr¥Àe3úûªMwôi[3ùèîß¾„¼Z-ãݯ"Ë*ë‹™ÉWüE&±r¡ ¹PŠ©‚䌬J!]AòwpŸ‹\>Î~Öx¨9å;Pž¤l„j´.ý.K2xΉ‰·˜íxÓéÊ&²©_ײ$K[çt™3}e.ôì¸Ò™öUŸTp‹S1sÖÜz¾µ:vœ{N;éÑÌC, jàðäC6ŠŒ®?M&ï"šðˆ²°é›éþ-£þÝoÿîÏÿâ/^¯ó:dzüÞÍ ~ŠVµ\RÕÀKÇ5¸|ÉømÕ€;ŒEk@¢ôM ª,o±ù|ù:Ý„7‹ú¸Ò³Éy­g`eU1Ö97¦Àyñ:ÍŒj4o6f…°À^ø£ R@mÄ´Ó¤Jc¢•wžÙyx øû2'§‹sæ\ÉÅP\f:uιF«¦³ªuIÓÀ–‘ø1iP¤âÆ¿{]Ú˜o¼Œ5 ëšóS©¤¹Dfb~íx²AqEî5^ž_ñe´·6sO\ÌpAPT=`«&½ÍPDu [äIj5ÓÇX Á=EkyÚ¼+vÈ‚}aç‘?¶ÅŒ‘NBV’×GöìXÜ}Ë!7—*ê,¢Ùv.px=F\ëѤS¸žP½óÿt¸à×±"€eíòký!¯ÈÁQ ÉhK-ñh–? ÔǶƩî|AY²ÙÑ mDFºU±kC–ˆÝ˜å#†™ù`=*y@"21–ís…Ôo? × °ò:Ep«T—aÑez'º´<_q•7¢ôÔuëiXÆy¿ø,õî,(ž f›pÐr€ÛPòÐxsu0ºI;yœ ü€4E —+Ìjýâ¾{êì,’¯3aª /ÒÅÖQ‡ÿ,-âV?Ìoefw ˆ3rJ`ºu\s»LóË`5:pÛ¼ ­²Þ„ êò½”Õž#£Sü\¯#U„Ø'š¯V”\<Ö g()åŽO«Qµhc]­Çºú•€Õ1žÕ±÷'&ZÕ›.FLAEÌT¹ÃCó>X•¢IÒ •R?ãѷݼì§E:7çùÄqft÷8Á÷r9`èî‰A©[}½%ÐS–ƒÏêNH™”‚‹,Á&&ðV “K¸«qÍ´ÚãÆ^„opÚx”˜5ç—XŸàÖù¸híìÅí³¨ŠŽ¸­Îê§ömü›‚{d1ÈïÏlMÿmë(Byðö¯½ãE{ÿ£_"¯‚8¥`no´úoURÎÙß#øn.@‘m žŸÐ,ù,—J¬R·å®™d8‘fb|n5Xveð/)›Ã,0€ÕUæ~ çnÓ[/m$ïY…]¾œê˜.¤§Õ|ÍFQìqò“‹fö'k{Çrø]H~ˤ­aÀ»„6EÉ#¼±”8’Î<• ÄÆÑD¾ŽÀ·´‰M=¤wöEem<ñÑw±ÿú“©tMg!y£WÓ‡DïÑÜ_{YýÇmK{«×\;¾“’){¾ððAhFÑ˼7Ú®*ø€éûª—½òŠãRoèhW1?L5ú¾Ã´ îÉ=[í¶œ¼œ±ÿçGú¨3pÒÝN)-/º[‘Yi…wšZ‚øš<úá­=gbß—¤tê "”óEZ+Ží²MQU?Ùß{ÎU…ŠàuÎ ”ó‚Æ!Bʇ·GƒÉšY2Í|Kþžú||mÎ{ªÇ\‡ãÜÁú(ÍÌØ¥Â“y—£CÏ’oñ:¯¤#¨ îcaÆ`å'çi¿ˆpÿ‹‰“ü½ ¶>ûAدæõoï¿å‘Ø3à§Lü;~å =Ä?jxø7«ÿ!üÏåí»ÙǦï˜o¸€!êäê%o«.™ÄÍÃJ y¾lÐm@¤hþEGÁAäô(‹ÛrŽ>¾ë*ñu4mø¼¦ç°f:·‘±ÏuøešáÊ:-F9Ú°Ý&&͈€åiÚÚRŽG¤KŸò=•9Ë óiÀOóß?ŠÀ#1”¸ö(,viºgPiKŒv:Ü;lùù«â'ƒ÷©àf@¥\"ùõݭ_‚`èŠQqŸ$T ]ø»óÞ# ~ Ö®¨ºŠfh=çlÙÊ‹]ÃØuSí¸¨‘Å-Žo]q×îë q$É+7Xs2yú¾4ì­¬Ö £bÆDá‰?Ãkò:½ZT!ª$…7S·óœ«:ª?Ù••öG¤•Uë”T³/½¿—³µ÷mÿסq`z])ÿ¥81 ¸ípbo'fÄgCÄ%óµ€*µÜµy}æ´1aNÕœkh:ísÐE1“sUÖª`Ñ´Ñ T·êβ 6d†Fl@SGñ[Ì#YV¸îÙc¹‹*Vžx<ûM"DŒ4ì{7%:æ³­\ 8Hp¿ìÌŸß}€l¦³YXi‘6a©ì”1:íõÎY+¼](ÓU<´äòìjõ0¡ùG5O½Í+mŠÖû’´¹´¡ª>;M:Û'î»–ý:Èi¾I%ukn 0æ¼C¯n2祒Cßüßínç‹'e‚£x+e(£é—K¢xÊ{|Ó)“ bŸýwqéÖø¦*’¢/uJt„Žž>Kà;}ã²'>Z僃ò}F²œîëTÅ‘Ÿãðÿëèêb¬ u5 5Ý:€™l€Œ³ðE­{!ÎÌ‚÷a„J°Iú³%=">ïAþª´zd&v¾Òs_N)ddfš0äÙ}ìæ`;¾ß“ âiß¡ÁÛÀ£ä—´P«2 ݹ%Û0äkmý»úÙMýÈ&`1è›þ’ÿ©"¦ˆ·à¨ˆ&J%öU®*ËH?ÖZvµ–[eü± È ïrÝ1;&ÇíQzZ-È*dLvãæÖñ”…ÌPÞº´±Mõ²ž£«™BмËâSî³G˜¨“jÛT³W¹a®H#–™ouݨn9Y¤žÞ¶5JvhŽÏãKcG-GõGæiê ²ü)£MÉ”?ûËzé÷^tɵ·L¹}pòê5»÷ëÇüúñÇ×ç¥ç¼^HùúíȇoPÆLDcÀÓØ¥2š1lÃÍÙÓ^>–ÉÚÜ\»ù~´¾½p€ÔN'öÖ|ÈÖÝÕæúµ±é*³$2Œ®CBTÛ[-i5(©ÚUöŒA¬&Ýh$vi¼v‹`@3ŠBãÕ÷p2tÏ-HU쵊Xú*Þzá©“ëƒBšÒ÷CŒ+ÁœuÍŠô“© x…vì"êß)­Ÿ0šdE‡…Ï} Q\?3/<ð‡Èp‡ë<èržÝ]y£Å(7¶E;l[WÛ˸:eÆ-ÉzòÐÌœRÏœ€é$‰ÉïýYX º bôaN“vDpІ¼_¤1ÒyA©øØgdLïœÀ‰ÿúo?[‹mk§”h1]9‚ÝGK<šÇ°*""pl&b‰)w3†T8dî¡m–28v)®K–È›­?äÝ7SÃ:¯SrZôeöR›V;ë‚U_$1t=êîHù‚Ò°¤W¥!à$êÚêÌœ ¿€FKS?½!&É–jÐ&Du ¿fÖ¬åàJžOH)× À5ÔdF¡ˆY)9f†©MÇjãø5ÇÕ°®5ªfx¸íñžÜù@Uk ¸Y?Œ¹A¬Ž5®+øZuåæ³µ 4(y¤Rt" ÑÍø(k³_[äŒ< oϹ¤€Rf÷ëÂ…~oJÌC–7x0¥®€^ÁÉÝÊéQ–ŒêÇ6Õ¨h7”„ |ޏÄTÔ4Éά±@ÍjR¦§±NQk›¶ñ‰ÖŧêŠÖ0ˆ|¢Ù÷ë=&EŽª‘úüÕx˜.‚ïSsËÁP.ræx‚H`Nø";£”t19a±=Œc+éÙJ £tŽU*'±Š+,c6cèh6DpTýùõãå˜;ªÅ{•½À#c!Õ‡–8ðžÝk¸O * ñÞ~*#§î:‡w%ejJ„qŒcïM>3ÄÄØuÄî­¤µp „y%„‰nuB4‹Ë´\*HØ•?ÕZüðââ™mFÖdÊCÏ…¿zp9™G|t|<=å Úëå É>Òs© ò\­—:Ù5¼!?Ýp)ogAŠÈQ‘ó’CÐäÇ»dW y⣰°ùíO5_z6TþƒO v9ƒ žRöχoh…{Ë“ RéGÌh5¦‘r… eT!wˆ™VM=ÏzµhW9oÍ;·±¤d¤¾1Ò»Ú)©ÑÈûMô#1Êe§9sLú‰ÉAÌyüž#¸õ_YÚe$*†‡åŠZiÞqQ  ­FxVlb7»@ñ ø’h³h—RõQW*d©µw9ŸÔ)—bWý¹ø ÛqE…¥:„MÎ"iÞ‰~4=Vˆ:–?»rñ˜ü°Û5wåÌÀ»MäYËÑ£MrŸŒëø¼ÒSh¶üWʶÇd»óöU2¦süR¼Ã¹§\ B(< µETå9oÃg×7ŸÛž±öb)•úÌÍÌrÍ?û˺‹Í®fn’' TúáÖ¤ÃõpΡðë~QDÿGðÿñßí‹ K¾çô¥@µÔæ¶$î‰tIà-¬ÐO´Ð üôtÀ5ŸE2=`ɇ¨C"ƆxÖL(fm%Âà:b˜m7˜¼ø¨æ›=LŸøŽùÏpíóç"¿@à›6à=øú½ÑO|Ó±ø¹]ø;³ö¨…~¾LÃýÞb|ª“ÅO*«ýª\Æá ÂÔôGAn›~g,ªl>ðT¼Ý.'˜¤­["Smx¥*0]5õvEO. gæ™OŒ\Å2ÇO¿)âöµêö~®7á~†Óó ÞÊ’Ç7bƒOò!²äÛU)‡º¼ÍggËÌ@~B½ÿßg <ÿ¼‰`ÒÛgPõÚmB¦-3uÁèÌÌìž³Ô¨¡PÚ¤9`Çäœ_“Þk)|†].¬ä¤«'€ªž0*< å¾ãøk"ÁYm–ô7Ëñ\1Q(åVö­¶±Á›ž«c$NeÂvV=Lý £sØcãçÀy$ú·Ì±f™o‹a›Š1PHƒèÊÞƒojD·§EoŸ±e}‹n‚Duùo"C¬zÒ@õ|‰œQN<ú'+‚ â¥Æþà#ˆô°ÚÅëp¿Œé.%³Á¨­îã‰ÀîœÀyt+2ûÌRèL‚ {ê ¸LûdŸôÙÃPg3QR¦Ü/¬dàIrÆ`é¦= ³E Á‹R(E…¦=r`Ù·‘.à(À³¸ CJL%"lÓͯÊ;ÔHÆz̾vu _ZÃ"p}¨«/9®k“ Æ|ŒÑ…Ó|“7J€æ—k­à¥¼Ð¨¦¼(4±+r ÎÏsvð–5fŸ¾š8UtZ¡Š©SÌÈqeŠ®!⛈Ҍ0Ó5„ª7ÿmõ—·Ì‘a¹Ó Öv|!Ð Ñ?‡7nädÈŠdWéÔ([ÓDT”tÌhtË>»Ù#[džÛt'™Øøê#@ã5S øUÀ,C>ˆÒ¢ÊÚ®])8¦(` L„)ýWvIF0€€¡A5ì¾9F¼^Tü#Dml¾{ r$£Eð±'סôÚQ~Ýâ¾®)pN ëåå¨;’åóB—’–è¯ft?‘³É›Z–Á¡tÓÓèì<¨|CžI´é )µfášðnJ×ÏÀìõÈ: fËa„@ÜÄ[{wT£f…ðìÁFx~ÈŒÉq  t5Vx?,žYqåi^÷QÚ›O27”Ж4­ü\ž©ºúqws#‚^ñ -C·É`¡“ߘ‰zÊÍ–³±ÂGŠÖXŸ€÷@@µF›lÐðö®Š@¡&ztz¥gcF;rHîl1 I†¾f8 \ÑOFÜ…e¤ÅÓ`¬R"0ÏOkv~©%[E;úà¶‹§Ù£;Ïúlï­ PŽŒN´[tÇjˆÙÑÞ-¨AJ´?x+èÒ–Ñ0‘qçúRêLõÖH®–õœÐ•ÑihÒŠB„âGÏ”ˆÃT\êZ]g€Ï'Æ©¢‰54lÿè›ü½YÄ=Cyöw• 8ݪ»qq›ÖŸµ‘ÓÓͧ?oüàÓæ›»ãÑÎ;y­ÕNJìªáÏöHÊÄÿá€B·Žq1Ÿ§}à[- rýç¸Ýë«,›«ä{ 7‰Ÿ4)êúñyp^w©Bæó—¹xÔ r[’‘-´®Â¤Úü`#¿JÊ}Š—œ;êþÒJýW<ªñøÆðɺÙBóÛ€ç4ÒûCÑuÔ³‘(øÑ˜WÄ(£îÊóg†/ªL?(¥]0„ÜGX‰Ñ±1ÇPo:ë‹”[úæÓ¬Þæo#8j³¿ ö.sEà ÙãÎ%‚ÄG_'ÕY3åõ‡_Ã^†§ØrÖ˜Bp>Ö§î=hn ÔsŽ8{Þ ¡eíø˜p ÏÆsÒ†n—±Î7ë1dâPºeâãG©ߨ  VÃ~•ŸÆ›ßµÝ,s´ÿù_)äÒº`$‰Ý¢’QÔ–t 8Ïýú:94ûºÿûGùGÜáâ·ñ©ë'cn­ìšì+ÝOŸé†îé2¥90SwQTdŸuêQs"ApØü]È&s§˽n½¼I˜e½Ðf>Û< ÍähnÙ«žrã/$Öÿr?ëŸòcŸ9€ÏÐÿw"û‡!À[ï/ß|ß½ñÇÇï•À÷`ªøóÄž°¡ÖWýhãï‘bZ‰Ý‘,BKñŒ.OB¥?E^t>FYË*㱦qÿkŸÉŒh«h‚w÷º•Û2&±Ã\¾V™!?(ùs±œVë$Zrçî(PØQá¥B}ð¹%›Ãx¦ ‚ç ‹9š9“ÿîZý;UØEªÛõEtÀIfÂ[Øå—Ù½8§ØDç¦ÿÕöäÜ+Pì?æðF3cPý$•cy½âC·°Ü˜%a,'s›‰È9aÁcæ³&ƒâiBª(ý!Ô?fâG6 ûCÑ_³1œÜ¹ã÷»³ bëe4'‡ÄôÙ[‹ÑUÉçÇ1¦ou莿c~$\QžjÓ"oPžÑÈQÖÙÉ®Ÿm/ô$J¯<ÛbÍ|Z‚|4–-9yÉÞ‘¨)¤8@G^ǽ¹§ØeFSSƒÅ…"iJdPKP”ÕÒ(N×~LkJÌå9*ç4E`áZ1ô‘È݂۠žût?Y¾Y;@µà¬o mÙóM!uYþTTà `Ô(‡  ÕÃûaA °}X2 ’þ+¢eŒáœAœ­$q#xe.#ZÎ]Z9º°ê·¦è\ó°r³ Ë4–ˆ]§& „< êŸ¸eQn¸ÏZ¦ñ0Œª+T'/Ú™–Š]Qoª¡S5-ÔÕA·Ž:Ý.³¼#jâeá¢$+1Sq1ù2cánH!)r —b×òwÊ骑(>Žó‰¼{*‡‡v „W0Ï]†DïÿŸ{Iœ!z¦—¼Ö©,wCÉ“¹^i…U¡Zvr[9òræÕ¤.î'à»bi« IDATÎUç8´øœéBÔ`ªÅ<,Y¿’_mœ¡Ü{KX8 ûr† Q DJE¥æ“;Ÿ#BMæJ3YøÀL0iâ´2ù—öúõuUyŽ"‘I6R-]"Q³çNg`Bõõò’*0½ú¹-2œë !LW'åå*æ š„[ ¹Å>ìóWZ…¥”aøˆh¥Ì_&ÞíH5 ŠGÛ³eAAË©¨ëîÖÍ=œJ¯±y¾"«j“Q.úž_œ•íj–ò+=ÑÎßÏ „±@fúzù¡¬¢6C³ÌfY–Í*§*ŸÖãä9¢¾¬5½ûê»ö$ãâªÑFе% ..0÷y%Ò¦R.¯‡‹á£;UƒïNeBÁG‘‹½Ÿ¨8SèÒ$¦!YšÇ, Ï„O¾:@AÃnźo@ui·ìç™þÕ?2Û(P”œ±Ç¢–cC¿—¬þ5 RzA óÚbþI‡¢úƒ³SÄèò$ÊŸ(ýáUÝM¶² Ù]ùÐXçQÝâq÷™÷E˜H% žÜuîÁhÔðÛíD³…¿”{/çiw ñµÐ³Di ^äb¶}Ô³Ö)tdfªÑ—tâ]‡bJn:„ ç:MÔì4T«ŒO¬Ÿ*Cîu’᳌Øë×µ/@pŽÕkÆÁäþIiaL÷é#:A{à§à™PY/—òVÂÊNCÎ?˜ÿ"³ÀxZ¥!Ë‚<‘ÎÖÇBδV! {}M?ÛÏ7P¼`*™œ #lR¶JÇz£˜Oö/®½uÝ“†Õyu?i²m£˜y£ª³Is·_ÓÒäóÂ.¿•‡}²c\×éDj^1.¨ Y8ÐÈÆ}çÂÐgѼÊ"|ÕDŠS,^Ê¢=ó—Ÿúò»G¼|6| µÑ«i6€c€pž4hø}°Ã¡úÛ³¨„Ï»Ï^ï…™àcii‘\ö~ÌW{þâê=f Ó_ª-bo-Ëïý½¤ð+ùõt—¯FëQ³³¿üW¥á5±—êëõŠ‡Ô‘[Dä¸A¢ösžr«3ROܦþúÝoþÝÔÒnHž4‘9|BÃ<îUL[EzƬSçݯªv- v^@ïtŠ“¾pù.ÆòOýg•9Êwˆ¹?@"`8ømÅêÃYÿ4Úÿž¸žwÑö­7¹_ ~îÀ‡üÀOD0"‹ç YvøV>µøÕ|üÒÂÛZýá÷U®Ý³ÛàTh¹®½1JJçî`/ºŽ'·ó0³Ë(®¥Vÿc›ø‘Kœì!>¼'ÂÌŸss_±û¬½T>äEeñ3¼Î)¢âÕSù·ÍÚǾèßÚ•÷?í€c8Q”®¯«÷¶¥ß'¼~@MÜ Ü„J™F¥[oc‹ƒôcLÄÌL 8@£pÀôÞ/géÔCÈUˆ‰t0 !¡D.„«6è6ã@øœ£ÃÂU53£µ ‚bFÁ åMî¥êÜ´j?ÍUÑ™rš­ÆÑЛ¤LC‡ch¤ù²¯OóÓbœdþe¾—É\Ãï󛟦­\®a[O®n÷39  öŲÆÍ•Œ”SQiä‹B;Þ!|Þòâtñǽ²Ùù v êïû÷¿úõŸ¢òt±¡³¢«pÌëË]YòXþt`ÿX´ž±}¿£¬£eDæ›, ¶Ž‰Y$Öl˜ä]ÏëE¹„dÒ¦µ)Ãn~ÏšK ùu£EU«%®°K¹ŠùØê¦¸0Ô ~9(æü†d}:ÌU ÍÑ kê‹l`Ôò¬¦´Ä³k”k1b½7°¯}‰'£4Ÿà–DëdGÌlûH-ŽGð¢M°wQ¯ŠãoØDÄÀ#Bâèë‡ ªþH ŽŠŽ„Nì/õhây°/i®˜úÜ㸡UÔmÏáø cV1%ÒqcBeú @–°¤HD ¬7ÒF^–S¬]Ë|X'63rHiÖo?/k-Z¡+ƒæw”ZŽu´ ö‘2‰b‘FvÕÚï»eµö`º“õÍ%ÖäÄ-3ûAô®dà+F"'€!¤™Ä$;É’ çÕýi´{o|ºj‰Õ2¹HáÓÏÈLÞã8vzD_{ïS:²B¤“ƒÇQk1²hAÔ˜^Þ«ZL­ô®WéÂx.÷Y1Æ‘VK§Z|˜ª‡žö€%gÏ邏¹“o=^ãhµœ¿Nj¼œï¢õrMÙ¾^ ʼnI’ÉL±hBïÝVp‰®Tµ *ý%½.«I’9´Ñþ—ºm0qGŒ„Ëí2º”ªvË÷9nhhR‰íiÉ\€éæuÕØ?$Z<Ëë"è2GÍá8ª/)å>OŒÚÏ ²Ä`ŽAí¡Sá8 «“‹9Q$¨ô(š–sµx®z¢ J¦"_å&5Ï_xqü5ƒNÎT\uCQp‹FêÿÖ¸bŽ\š*’BÈ'f S†œE©äe½J_B²ëŠ¥§Ë ’,Y*¿³Â¿˜"x|%:²5MUQÕsN\æ_´¬!äÞŒ?NÊ|êNk²‘#><#qc¢X\(í¯OxËL}d*ÏìÜB’È0þ¿Ûù éÓÉ‹U¶¾Ôæ1 IÄÅæ,ÉŽ•ßÚýúz![£)»—v~˜­=tèžÔË“þ,,ÆGÔÁ*]æSé¡"ŸÆjÚºãîϬ-Ó{®9ë|>)GØüËf˜|Øœ ¡}£ ì~w8>Š=8öƒþÑQ¾SͺRaîó‹ÉON;îêÅóêFµ¦$«R*x&Ë-UV•&}à k%x¨·yéÓá4PÃjf<º*'RÿÜó¶»s9,Ibå´fÙÇìîÔør´ý0yÓ¯sõŒ–`¯N;X¤²KðJP/Uý©îaµlÌ›nÍg†§ŸÏ áÇÔö‚=ØÎNû6|b!“L6f¶Sòé³zÃþè~eãðA3B¦¬ó«¿ü×víÚ}$²ªúSäÌî×½fšˆ\³"B¥bªª§Ø¡üÝoþýÊ>Èc8(¹ÒÌ?-Оý?ùIPgrʼá`‹ðz§ÆåöÙ>0BÕóòwz¯E^ÏŒâDY•°Ad|ðF–!½Ì»NáôøëøE4zþôÏÀþýøúÞÙò(–' cßÓ›ç÷®¶o®>?Ób¦Ñþù~û(žs‘¥ðŽ¶Ú·Ÿ€Ç´Ÿfï]ûïÏNÇ.ïeŠýsßh zQ39ŠAçkþ[:âÅ®œ<qü6;)›ï¼Óïr™™¦†Ñ9üNœLûEV ªì‹¯ÑiT6àÓT¹>Ò®z.8cöü¢z2`[Ù¦pø¾OoëÈ⤖3™ãÆs˹¨?1øø'žqùé•/?±_ëšÊÙ Ûy¶V‹`‰IM-èöe-¶½üQᩳ‚±®K¨*‚ÏQšD©– ùu¿êÿqmB…DVI2PÂþC{ ]¨˜ï¥€;ï,>«/À(j'¤[±7Óh°±ûžˆ£¥»Ž…•ÙÐ(L´ã˜)fÏìôâó1cU!Úr£ÌÒV¿É‹Ð5M ‘}¡&XÓD¿î=ç¨E·¥Ó·`ש­<AãŸôœÉW>!È¥¡Lé¼ÝÙÞüO¿ûõŸÿ:G™&‡Q˜ÊÒ#<—‘ê*®~…ìaŽQPC›LÂOÙJdi`i ¨Ãçie Çë$@­m‰±ŠÌ—</«ŒAä^"˸7G ¾s§¼gÈ'0µü¸Í…¡‰½r×8ZŸ ;é°¯mFF'«6 Ø)Û…_¿Ú™y8 Å%­{ŒöÓq"ZéU§¶7ÂdÐ+i«B:d%öÂÌ;)€qø¹.;¤Â'—šZ-G XDTÐ<’:=Gùqôe»Nv*$±ìãaÔZ"öŠÃÕ“; gÏkdoA0è=P•j”g›Ùlü•[£U©(ÛËOSP&«0ã(û¨¦µw7#Ô¿V¹ä5žã«%f?[Ÿ'¡¾Ô÷~õT®†þ4çD YkE…›‡†jw #¤ÕÉ@„àlM)›9Û’×½[Ú¯Î< {lw2«ü*ÏcNJÓã¶ ‘•pÍ%ã2Me™`ØáGÄŒ)kgOOçø“e74^3{A®hpŒäijޤ٠µŠQŒ™ó=¨Å‚óGçrsÉWšÁû« !UÅ x€o9¼úó ÉÆ‚ÅÒ†&a(9, `R†¬iŽm8Ñs€¡rÕsÅéû|”³íz6Øgz­…ôha½<Í2"­‡N#\°‡Éªy—lùIYE‘ýéSÄìÝ$ä’êÄ›ÔwWg B-@†‚—v‰ØI0±FbNy6ð>ª ‡µ_õˆ˜On^æfétÍîz¥ž& lô=Gb^ *£†¯,‹Â9缎û½¯€Wß0x íê#í hK±ClÐ]zý›±ÜxBG±9¿™¤™Õ»žõé[þ¹×j›ZçW×[‡Y¡G¯Ã_g}ŸøK˼›ÎMØiUa—¡ˆêQq dÍû¼w"Ý¥Ù×cPÌ<ûToKÃõ¿~NTÐ×eÝjúœž³Õ°ŽeÜ]ùs¿Ùg¨ªsÆÌn{Þ–Ö¡gI©öœªDÔ:ƒuиù%®õúe>Ö¤«:üÀ>káó™Ìì¢ÈFÒõ–ZS0ñÌÊÜæ[=e ¶âÁX¾oo¶OŠŽû¾cÒ¥…Òç¦ú",£u­gT´È;̵ (™ëÊŒñvZ±Âz5$ §™¸w :dzËQ™ƒ¹ðOÎ*s 0›˜#s-:ò”#w9‚Îçe¥MÈè(IvÆ0ª fdÍ”óª£{F­û*Rýw”Ò_ÑÆH.†µ2O¥^ ŒqÜb¨äæ~AYed¤ÉmÜx‘.„`wEW)Ç;çl“Γ¡º¿¡Á£îCÔ4£«FÅÄX×6XB--±@ŸgéA?3«ôA¢’:™¬\¨¦ð±NL>„ ‡†åN&?Ž16xˆË@¶úªyw¦Ê£TÜí éÍÑ•Ö×B£‰¡hQßœUV5·î¸¹ÊS>㧦Օ/“ìWxœç)óìá[[ʤ ^OÎæŠüÞµƒÃÛ¿zëpûløúüßlëùŽdﬣõ¡ ?¬óxÌå8¤û ¬cŽTŸ/¨¨ÕÁmY5‡TQF4F;-ÌH–¿¯ȪQýð wk A— íªž¨¤u³»gL ¾Ô®ãNìÏŒ ŒÞ@Np¸rºÐoêÙÁ¼¶¨é*‡ Õ.!‹wªÜܰnby¬²f¢J3^Ây‹I“²wÚC;ct¹k–§íÒÂlåŽ;¾­–ÔLÕù Ah¸b(Ë¥V߇á[Õ—±dP€øU¦<™|³ÕbäD–v*ÊÍÒ¸¬m¨ösÂÃQòî4§¼÷ cV*à9ó¨‘À§žÑh[Y-¬o ùáHeôMìà‰0­ÚíP  ¾(ög ‘ó¯þúÚ=ª¾çâµßÝ ›ºj(DbÍ{îõ› –!“\PHÏÔûÿúÍ¿¦$žH«ñÆØ‘.Uøµ½¾áèü`¶oË€þîçåLXNž–dä::àÜ*¢q¯Ž…»:þ'"1l•R-oÙ,#x”R?c‘v ­@ò†»³yMüÑüóråº"³Ô\? ™CI²ß Ê~8þU_çèÑ4&‡cÌf©SµZbFl<ÊÏ£iñp3F Üʤ¥¥Ij˜…¿ÂGzö9fL÷mMƒû!`)Q?‰}Ó¯:^wîl› aœv-U1wâÌwi^~[QPîšÍÀ´¦¢‡yR ŸÝžüÙŒ8ÇÖ5’³¡4²u4”½G*ª G ïH˜œÁÇ`4¢"GŽoê5O=U;ú4§šÁ;ßvx€Ë2¼º·|}d»—‘¿ýÛßþù_ü¹?î£Ü}J G)g‚q†*Ô~9òOƒß2ø÷÷[åÐLz>bæ¦8â/’Ñ®1Þ7šDÎZ2 J÷8 ¦)WÎÑ,•òݾ´•€4OWþ6k+Á¢ðÔýäâ`\¹&æ I4éÊ‘‚{ìa©Ð^ûiê4R•Ø™7Œå!ÝüèäMà¬=§Bs4Æ_Ô¬"TîâÂÑ‚rÓÉ íÊ0”wcC@J]½dxòëVsIzT¡ª.ƒ›\„2 ¶ñîo?ƃÑw™ò‹ØØF3ä´ì?ªpOº¦ƒE/ó ·çÛù’”˜~îÿOª’áiŒ ‰¢ÌIb–!çs4ÌP]nÖž“Ä_uèûùR€jUÜ»ÍzQ5­­½BVSK¬Ì Si!Õ"IU¿¾1GdúØ'†À\„" ¾òÚÁ艩5³£3p¼ÉIp]Àüóû0N¤¿·‚±˜lcÑ‹ È9:ì_ë€ÌHÙdG‰Óó«R:–’ਙÑËüeOw˘¿žJQ_´öD„a>³&¹eº†6£¥šùÈãìHo<i*J-Úß6qN'õ®t¹“7.}Õ1ô=Ô¦ÄfÞêˆL½Æ•D3é½@ çrµh:•bûZ·äY*)ìV¶§!}£H—+Årá¹x’kÆÏQ{*_ÄõÙÔ ¸õV‡íç.`†›6:=bi®–·³Ûa?Fɰ}ºb‘ÖòÊÓ©UM&†Š:4«'žcVjÆ‘LB•éu‡AÿYÎËÊìILHÙÇtJ“šBµ,ºKLÊñR|ø…ËW“ãä‰?i‚b•›m?°ë Q«6Äwl"³ Dê”mlÐæ÷~}]•w’Ä€4ác껯Õì•5¯‰ü[ÿìóôÄõµ¿Å ºÑ!í¢¬ôKqÃRôüÏ(ìö / ~º"D>`áŸÄ'é`EÉÆd#õâqb­AíeüƒNéñÍ1;//¾‘Ã÷m$jËVY;ӪŤ,}¹‡OÍëŹ÷ÏæÙØt›¼Å)-æ„’½ÚqÍ7Ü~=½’ÙÀ£kVðph7Ed²¸Öá#vu.ÅûJÇ“Œ˜Ì¬l\Øh­yæ[ÂÆ#–“¨o’#;•%’*[è'p¡#ÊoÓ ‰D¯©£¢;xTqù`¤ð ƒ\£JÊûQ PHŸïËr¡§`ß³NB/°$xl]Þ¦Bœ{*«‹©-¸h(ÿ@õûòm•“Qï8[2Þþ0÷‰½àOÓlÀÖü´Îè„_Êg2¿¹3z𾀃rþ»¿ÖžÏè5£ÉSÈ—]0žæm1•H6ö¡‹+»QÉ Ë=1T_¯ ÿéÿü· Hœe÷rð­Z– ¿å¸ ¢‘‹#×@~ÑT{‡¹ï“P‘Ѽº,H¥~2mNt÷Œ›:Ø}Š*´Œ|"+ “Ö.¿LÌűhõ{΃÷|”Û÷ä¦_ÌWÌÿåïføfðÔWüæïöhÔ€¯é'&‘<üdBâ­°w½6~ð˜ò§úƒXý»: zùvz=¡I,ÂŒtñޤZ– €¨uLÆ;8‹šÉ.GÑ2uî|´Nyl+³=ZFè õÁ´‹4ë]:$ovå\*àx­Àà x13˜À±÷”(fŒ¸–¹Ë¼z!«S+úU'‰¸®ßOkqªÀL¤F:ÓÍôõ¡ÝëÙË‚ç­8ù 7i CZz¨@Ú½0»he è¸À÷;x$‰Â˺c çz†ˆ‹³hCž¦ËÀÕcÌqHŸÔøÄû€Ù‹¸/×"T* õFÝ—¾ÑDvd—ŽL#I²)<ü3à¿e®Ò%¬xTBaÃYÃÌÉ%æd’g&q¤®Ð3€rŸjt²Ò#ìÆ þÓçù}Áã)P…QÌË•yzÆo; š¸²ÕÒ¿S»×Þ‡·`pÝ21(È9hÏoÇùŠÆ&¨ªjáš°¢8Í‚K…šzȤEþøp°Sרš—Î £Èõ~à¹Éß q£$œß¼:g0ìºàÎÝYOÇZ “õdБtoÿúªm䚯äuíÛ1g9h•.Òé‡w”Md4æŠ~ó%»ŽV†ëxwÔŸ*ŬëE嬅äštQiÚ?|U^ÂÙ€nu€ŒVëw8ŒÍñûr#[ Á$3\–͵¹úåcºæaý“$o”{Cõè.³âj{í º|cDM¿ö«V+‘jaB¼a*RKùŒ…{ïie™†A1ÈzMqêŠGb?o)¼êPLÚ]“¾ZŽÚ#ܳÀÖ¾ó¶lÛõ:èµ0åÛªôÌB&°MÝÇü“n"õ¸ Ò¦âq±¦b0i'7&𰺯V@ÉFæ#ÊŽÛØ!…Mù6ÇÒ5ÔŸJ+¯‡²fz`€Ú7ž¨|‘çáh°Iù¸A~˜ßæ?¼|«9LCx[øÇ2”£U‹õÖ,Kí[ƒÉ=˜4·i×ム²‰ESÃyTÖßr¸çÛ“OŸg»þ!ªoC>{‡1y³z=~ǦÜägxbߘ a5-q IDAT™Tææ3¦8Ë…¸¿ûÊpÆ”KÖPáQ$ŒIgGLk¼>[dìðDŠã)á#û‡™Tµ“ÖxŽ!«ƒÓš‹yQç™™‘ëõ¡×‚µ êÆÜwåæ&' ãÇÕ<"È»fD½§ïÝXµ§ßèR1úxâ×So³5"w½7¿2·ÞÉe{Ù‚ž¶ö3õ÷¯Î"Q³VÔqáJ’Œ+2·EûþŒÞǶcô_˧–ã£?MŒ¹LÉ×2ò†{Vçõ¼hß4̽a ¦ã è_þuìU*ôa}µ*ä=€AŽ©€G_.7°XÀ¤ŽïÃHÊ,ÅÃâoÿEþñC%qA vu& ÿ£¼Цü·‚é:y­«~ø0 Âb²}Œ§xcÕAyEpAÃócë BÇz½Ê÷FéQ¸QlbÅkëׂGlî­ã« ¾Æ‹øeuÿïgø¾™¼‹ãÓ€G ÀgƒÿÌã;jÐw¤5ùFíÎwS®"g”Ö62Å® ihéZs=Ê Ç¯•ëFsê8ÏGJÿ òS˜¬ep?Ƴã…¹³Q™Yð@¶jʾžKx=ÜM¢Fkæ<ž•ÁÔ_8Í‹a,Í“ÕSYtªT?Bñébu4š×M+`)ÑM¿43Fm"G |PÇ]…™g”ì„ü¥±‘”UެZ-"¸‚&ªZìŽX©¤FÄ9™çº¼Beºe¢yk™ÅŽ0Ⱦý£·Ž÷”¼€ÜOÌòMSÌ?ðlšj'z®5šŒòr¡šÑݾñξi8€GˆDURnk/ÝÌ.,ݾª£šÓ—5].ÿ2fP¹l_êÍ_'ªEÉ©FNÕ˜9ršºs¤f’¡gä(ãAû!…Gk­r¦hôôfr€CûŒÀB ¸ìU¬Ò{õ½¿E0&8nP–?¬H>A'<2¢ðÿìð¯í¨¿Ô²®Ä0Nv™mµýåy4ŒæÆu·†µ˜n&Gˆeñ®tq]çy /àR£Ø(ÊçB5"1{­¦«b̳s¾.Å*°æ”$ pƒ”½¾ÅkµÏ€LÞiz.cß-âV" Æá¼ˆÆ¿i“û%h­º•j<üwTEsŠÕZþA8|/Çát²¥‰Oü‚pQ²Àq)=€„¼ëóË×t…ä¾V±¤)@KStJ6‚ ­ôYˆ<«`Xjçj"B_Í1j »ñyEŠðð~º}VH7­¸ŽlÀ8À·™Á@\¾Ž¤²FNœÏPt–èË\aòï¦Ç‹s ›þ½Aò÷’<>:69SÎ\ÜNlçêýÙ")O½ˆ /`6œ>«è´qþ ‹eÿÊ jq$oð`;ùƒ±åÚ< ùjÍâNm”Af;úmÀŠy=¸ðÜ¥à§Ƨö_ýÙ=¥¹®zü]vÖ@;UÏ9L_gµe…ÕÊ÷>¬‘vV™c¦¼¢ß·õYª.j+8Õ2²&w@Z9ëE•á£";q©CÀ¨öOȱV󳤿> »ÕkÝzœÅ³>ûC¯égiuk/¶=Ķg•§ ÷(Ö"‘™¶T.ÖæéÑhkÆ@wJ†ñ”ê^î9s®Ó,2˜á"ž‡FýŒóûQ_™ùÕÿ?Fz´ ”âR51xsLxITЗê××—™é9³Î˨ü!ˆµšc\Ëòõÿü͇ï’?aY¯[;μãs¾*„‘ýmyÖ»uÌ™óuUÐÍ}êÎKqEäÚÊXÅ®‡{ölæ­¤±§Ì…Á“¹:räxIùó1Ù¥·O3ÈŠ5äøƒkÿ¿øOÿ +4¿‡ì=Œõ\ãüÏ?ßùõ±kdÅÁ]¹µtÛU!ÿ(ÅGÙÇ·öÖ[,Gÿ7-ûÆ©\n](º~6kPp×ü#„W惘 †üsE„Kóû9âY~#íÞ« È­ïk¢| ÑþMz±ÕˆÉ…O]ÐÕE´§À„:ž×ÈvdÊ›1?ÏKFQeD˜U€áÐ{mÞž0aÕúnEç›ÑD>Ö–ÿK\õ×ôÊ[(RN÷¿PÝ\o×R”ɆJçMh²wLEEõÞëݤ€WÀD8T«£Û!êª* ‹®ÑÜ9,Þƒ×Ìç]0’7õpM–ªU™˜1ö!…¼~j…Û;i&b^ž„Yl«ãQ.€£‡´£Ž»"Íx®wõf>³+rT­† ýH,Æ­ßgt~…+¦ëŽŸÃ²þ¡rù4C;Ä3ÃpR¶K£¸’Ñ”¯¹(}ÑU+k§ð„bì çŸlf0׉ B3ZyÓLLåˆÍ#NŸãkrʵhž@Ý9~s<’EÌë%Òæ+™ù_ä—u3cÈDíq/ÈjU'¶¤–3Éz?¿ÞºÆŒµ”3æœOî{îPÚØZÛ< åf°l⤠À‡ˆQGJv¢3·l0’‘»o§N·ìÞKBq¢A]ÆÌn˾õN_²@»^Ÿ§ ›}Å éJO‹¨™Š¦j˜©½œ`OcQ!iÐ[éâ,ñWLÁ™Eó¦ Þ³yE)iayq+.a¨@TH~Y…Yƒjmf¹+ÕÂûŒ½G™j0»÷ËLD~PõñϲMååe¦Uð Y4k'…ŽâÆåLƒZÓì{T@»†‹5>føé1h<Ütš1Qoà @U=z8† 眚šMaõðLFV7¯ÅÈ–®Š©û ù.N9XpÛR“\°0qeÙEÃGÇ´ðÇV“fÓÒѬ0V¯†*¢Ü¤ ‹G'ÃÚÜbiÞÿ(&H™uW„¢¤PY¾,ãhÑT!åÄz©0J›ìã ó÷±U_Uoù¡Æ+ÈIÛ¨ÜôÝgz€³_ <ÒîK+ð bÑ™ü²Ü* 7Léaóü¬Ý+—KÑð™T§‹ÄnÞTQ{`½Ê>6m«h›úNda\ª5ZGEç,wm²‰õjù¼ŽáŒ)‹VÛˆ Îßl! ê‘[\ˆ‘ 4¡Êñ>¾²“,wY±³Rå8 ×]¶[Jçi- 3xÏä{éyäà¶cí;Í)¥ÐRìç¹,Ä~C†—ëˆÓ´—L…uß :TQ ·º7* tUÂt‡Ío>ÂâwPظd– $hšÒŸ™oªë˜Ñ°€Ü8P³»8¾+ûÁøJs£äåp…h—jM¦yÝ2e>|[ž*Üc•®Èà<¿yÉ7æ‚›¼«v—úU~éA¢t¢ãcûÙ¼ðª~ž'q”œŸ.žGņá©ÅN´N¦1 {²'Žã˜>â!²Ê±çg¹þÛÂ&ÜÒÆÒÀ­5!q"gÖ¹qö¬È ­½#•Í1®ºò¯¢&§žr·G:)OHTW=‰qÑýAk´¢6³:­w°þâó4k,Þu<àlNEZUúp-âó Ù¼©ÚîêÛù#Á½ÇTxR«­µSÕ æapH‰_àüXfë,f¡ú&KEo}‡ » ¾x´bä" À9÷ÞFûw¨ ò^»ÞÒMqù·­øÂ©ûÏê¼ýü1‡H¦ç¸p*Éw.'ã0ï õ$ªäê8 ijçι7/Ý`ë`ª_Yýd”€àP¬Ìî5;ow¸|•AAht+¤#²pf|^ÓñÚ—á"€#î&±,F û2‹FhBud´qôx¾ËÇ;(h“kr¡C¦Ñ”Ç×5a7„å.+)14ñX»h/È%™Ù¯ŽûŽ©^ Ù×úÛà(•ÔQÀÃ):ûFÑ·å$Y›‰Q¹æ¾ìz[t,3Ó~ t—vS£šØ‰Iã¥É&s‚Ýÿa ÊElâ®ÔÎ+¸‚¹7¸…nÍ¢ëv®z5­H&Ñ~T+ ‡ÑHˆzžfÄ'³DØùq­ÊdinùÎ(]þÁiøM¾q©Ô>çuºä)‚¼A…·w|ÏÏn2Ž¢µ2+M•É)£àä^ïÞì§Óî´ –¶ñh>6R…ªPÎä½y)46“9ØDëTWsuTcFz$P>n[Ç/EAê—t^OÈj‘•iî l—¯ˆ©é»ÛF_@>Dµü˾تÊëun„Mç§±#îiëÎëàœ˜—ø•æããÇVqXIÑ*jõTÃîìþcüòï7º; Æ$ìnõ2¡°âmxœ4{ûvæ–A[ß÷—œ|ä8-z?ZJK{º÷šï[Úæ{A}¯#µËÔ98j-ØX¼Þæ9jÛØ‡08@7ÚCk©Ç>‹b·P^=v="éeà2*pc!Î󥨶m~gÇÍ8Xé9KȲ¶ÖìBÅÏÉPJH³°úsÊ6ìxÝ>n/ÇgìºT‡æ\ŽÌLäóWÿVÜÄγú ŸÈu?϶'æ <ÓÆ8žeZeŒ„ãqm¡1YàÂ[<§t1<æPŸ!¡øwS 衦)ÙÂZP2Ú‡–»-'bX̶Ãla&Ôc¨ª‘ •ÈÌŵO3Ê1!xÊ‚xޱønÞ­ãxȵcg–+sb×jryÚ`Í,#ö7ùa\£Ò\æñ4ñ¦pB~ý?üOL;“]c²4û§®¡ÍôÖ÷Ä1S¨ê¹f—×+Ð. ä¯×¯ÿôתÀ½__?þΟ ÿøýXÔ·ÔvÁí7ñ›†kòÁóì­Ãœv½}ˉGÀ–È߀_¾%ºc–?H°{džÃUSF@qVGè„@ÒÙP#ÕŒ¿Û¿Ù²Øè=š „ŸˆLüÜ¿ü…røüXü„Ðÿ”»·´ÿÍdä;¸>˜ñ9 ¨\¾Šü¾~püÜàDé·WHŽÃD+ï¡h |%å1ÿê!f¢³ m-©÷†î䉸=“VY]§9ÒÕÞ,{,o—‡IÚ{g ò•–D·W˜IœT}“[ùeÆ."ƒWP|KÓúÒœ•~Ø< y¬6­FÄED |©Ëî˜"äSEçöm…“qô.Ààl|$«Øîý0Ÿ¯Ûev¹V0‡v-> ‰ò:äçÔˆœ0Þ@ ”÷a¥s:.ÕÌšu¯þøœQ«*6¨-M,ž¤Ù¨ɬ­¥båÓ_´Š„×ùàré’~ç{P?Ð"¹_÷üðª~E빌z Su.¡ë+0°UÝWÐÒ ì`8ZB)-Å 2³ò%H˜5z½0ÙîŠì´#{šb¬…PÊ©AúâW–Óaúõ>€Zå‹äõ¦#ŒrV¹&…}šQ§”$jRæ*ººs¤ÆLU󺼞 fÞ+ªþI!­”í§iK*·­¿qÆÃDêKOÙàl´TfØ>¦\a± rH(û1PŽ/1A1édq»ÈÍ í‰(_6¤EÌ‹T×™Y‡TXÑš}¾`fù9ªRe Y’O¹YM }]úüs8ùVj{ζ>¿ön>» Âëû㸫^ùÈá°½n4ö3Û*Ì#pTÔµësƒÃV`Ñ;QŸÖä"ÐSG™1-`>‹|ªÊLêçlj\3Ñ$šÜ±ˆ½w¥¦UjÀ,ü¿„Œ‰ƒ9^-ñ±ë‹tmù¤T%cTV«æòUÀQ±Ù!ˆåÇ—¸J1Nˆ­—`v4Ö¯s:^wgB‡¢ÒÍ!ÏII+ÔíU,¿œ‘¬õ!SpR¤‡—ŸãfÑ<>è¨<–ÑÉMRóX—®DNô †ÍÃa,(I¿G^?“¢¯«üeÐÞN|Q…˜aL°ò©x¢dx²TÅ'”±@%V?ªgÞóD±áë^Ï¡Ð(/oþ”nkt)YM™ñÔ·&.®/«ê>¬<¨‘ ïÉÞÇ÷§6÷„Ò5= 5-Á,%½–åÈzªI/¾N ‡>ª¡8Ÿ!Æ›ì$ód©+š¦gÎÓ8zÜÎVº^{ººŸ ‘e·Ó6YÆiŸ¦¨)Œ4ŸE­nZ;Ä‹¬çX™ÿ®î§A+Øœƒ+{ÏΔZG³P‰ŽC_›öq®@>žØï•«ÔW…rôÛL  œ„ÿíXÏÈ»OŸ{{¿Ÿ,L5|æjŒµmO%3"þ†(z¸y©usY-RK20NCÍbZù‰Åj d¿B ‹L ψR¤1@’%Þ•Á,O^)2Ë" ×w¶Qáñºƒ<ÎçËê¯._u µêIÉŽ( 5œª îklôu­aR˜g˜!²¤‰™¢³G1¶;r·:®€yt=ð¡!ŒVö’»¦ó|÷nøÕ©Óà*sTÙ„bÀ±Ëµ½a.ú¢礓91’52Cý˜µ–²ZÃ×§ÁA»xŽÖu®|pü¿ó í¢ø7Ű=™Ï×h¡½«CÀ§T¸YÜu‰uõd˜TëQ‘^$PS½ÇªõNmŠcÊB™}DÒØ­Y㻕¤?ûëÿYÆI‰Ç<Ð)v-¸¸‰%U4¹7)YÛã—ç¥@Mp^ç\3Q¾ÎÉ­»ÞÃ(¿ù·ÿÛT¨‡Â?Ü%«—`Å›N¿BxXpõ8Š‘;á1ÂÍ^å¬}²2 ÄqÁÖØzHßãß–¸ŸÆ—Dî-Wèj®ÁŒ„×uÿtî<¹ãŸg(¨°Grÿegòø½1ÿÜw<Ã…Ÿ´%ÚY þ åçéqX¯¤§¯À7S’÷Á¾KìW:¾YœÎ.(€ÏN¤úOœ·¤1³n({Úâuj͈1ZÕØúkÕ·©"åªÎ|ÁÉZ‚Â*/qÎX&t©ì¥>Uœ¢Gw©@½_IÂ…Rm:ýùT ó«çj> ûŸ€—‘óþJÛù Bë§?úÇx]ï_¾^ofÎÝ·%i?ˆVE[‰HÒ¤ˆÐ7ÒLÌQ‹* abz¯Å¹ÐÅDàAjj¤‰‹ÂGÉã†ú£ÊÑáPµ¹~ÅÞ¤ #ðÏYg§ wÛž«öa63žsü<ßn”% 5ß+'Æç÷ZÚ&ÌÓ9Gjª@_šL¦¿ß~¹{ eQÒìÚõK;g+ j:·0gè:@Ú×בs‡—á­ÁGpr,‚ç–ÓF˜%Þ’BŠÑTZ°>é"‘>Še]Rìý!ÇF)yÉŽ:¹µuÉÀn‰PVu‚˜bfà¨ÂÓÀ-Uû0+P¸L•¬ÉŠªGÇ0Ò¾ÒNmf&¡¬ ?oL`/¯W Cûçûh’‚8óò-4à÷=”ÍNñ·ó‰5Á™ˆþ¨cÅ’Sâ÷‚Òæêù! °}Ýÿš“¯:ÌxKvz/ØK_`YŒü9ä# nK‡‘HMDš1X±Qe`Á†c¤‹|o ÝÛœmâ³Iºõc5ØmCzÀË„H}ÉÃm_!3Š!}•t„< 0©—Ô½¾åô¼ÏFR‘“3²k9%M;­€Yë‹£¯èÐtc'V ®³Â|´ýHƒÙk¤t«%†c„–¦Q»zÖ®?°nå¡÷qåʨ>v¯ƒLT”t#¦ÄlèYl±æóHÚ€àTIDfm²¶ eÈ6¦m*¦ ¡}¶‹œ$Ã_Ó=Š‘Äÿˆ;µ"Ç.¡ÍLPuḨ«¼ >ñŠ–€Ô zeA±Áè4™Àv•a÷û8N|G[ÈD¾Ë£ô±:(9¨-I%L·Ó!ü!3qä>øK1„ŸENŒ·ºÍü©Gòó¶äQ¼š_wØÉ ¤Úަx¯I 1V•OEmRÇ8vc5Vø‚µ ìŸÈÊöý¯pÁ¸2 I§*¿„çËl`€#UOǯÉ)À` Î}0Ëß.5Æ•]ö±å²b³žá·}O~ÁZ¹·8©@0€d^>&ͳ¯Ÿ¸ûòm=›Ç&4.ëàó…ËüU&Ôgßõæu°Gʆ®ñ@( +/ä¾iPìëàßë‘Q‰ ,†ud”óà dÞ“5GæTÁ¦˜×ÙÊ‚j´Y¢Š0GVùGFß1Ks-oÌÉÚùG¿.g”am¿h×KH9}î™B¯$¹nîòžýq{rºGZä/þÍÿb¼YºÃ÷Vé pTz”¿ûñGû²_ýðCÅñÓk1\ŠDi’PÓåS_î?üð«?ùU˜Ùÿý¿ÿ¯uA­„ǧ˜Ñ®f’Úç¹ÀúÃI)îEýéU’`ìË[WŒ.ð~­ñó¯È¡ˆÂ3ŠÌî>TM wÑs#2Z½ß“µuE¶Å¥ÐµD!‡[«‡s^¼]9‚Íÿ„LÀ/ªÔãàï…â§À”XñMàsKð;{ߟvú˜ÓÐi{À‰µE^FþTá¿Àˆ1äþš3î'+Æ– |ËÌ#q8’0ÚîTvébNªã3_ƒÁÛl­>Jà§Ù·ü8…&öS›/&Q`)#aKø×vð IDAT9îÉ †gÅÂ¥ª¿bÓÍ8¤uø3êVÄ‚Aä“Ês{ôðïKÙ$thõ1Ï;rñm¾Lä“ó„o™ùã ½nønÂíç,¦³QçÊ‚¡)äuNªƒPÎ ¢¡_"ÈL7T^QÇêf=Æ À%xáWmTZßÔ„GzŽš¥.ƒFýÖ¹ˆ)6ÇØEwêJTÄ´òíÚÌÌ´ô¹qW7â·þܽm¯vYv5Çܧ]j70ŠE!‘l#ÿÿw@0 &XB„D2±û­Îž#æÛXû¾OU£tÙÝ]’vÕóœs¿ì½öZcŽq!+ÿ®Z;à±Ï5}’fxC& 0Vó¬ˆÄwtן8^Åfh^(†H,ŒQ*Õå—Ñî¸ÝÝáÝÂÇH.4pl5è[õÅ–3|™^…^Ʊ=µõäyBzr˜°}>UAÔ€êîC\ª™(2NÞèŠø…¼—Yˆ"¬ïPêsö±gOîͰ»ºM.s{mw[Ö¨ÅÍt–fY—m8ËžI¦v|]RÊ×sËìÁ¢Z¢Ëe¿3Ì)3jÁ˜þ2êaÑ€á.M-(×=¢¸ê´Ž]^ ã]6ëªd"lÝóì1Å"âl MÖ…=ø‰~Àå¿m–ÑùtËå^î¨V÷öœÓÓ쨤¹)ût1$=LÏK8îÙöß.ŽÏzD*ÿ>ÙÝšK×a9ISaì’»4{.nEÂòåÒ•¸ôI~#*g7'–‘a¼ûè tçvvØ€ ÿˆWu—5Êlvѵº®¶ rÑ@ÞAyµè½Ü.TK÷üòÅ,IKP‘Í|;ÐL ìÏÆ#-$\ÄÝC}ßÕS&,#næ€]H1¼F£ÖC’<*™È…Ë8QAg¾·^MUIbÕr'\—çlØ{½{øƒl>p-UÃô#çÈ—V0m90{£¸Mè)7±Ò{àQ¬VO@ìÐbͶ³åêØ\Ž}3ÁVçOxÔt˜ç,8 ÎBµLŒ¨âʯõ"{ä§ ŠÑn„.©C[ü<-ìÔ¥Þ_<1¬ûY–E';èY³ÿhqµu©þS°ø6,„y:$(s=·˜i/ZÓN?L_Òm²©˜lF#8sˆù¸] ²Zöu^ãuÞ¹P®žðã ñf[Cî¾Ý†“ãöêžÎº¾œ˜ÀgrÐÇ×;NL_笸@=$‹ožÛX|æc¡•ZD„w´=–ÒÜ l“g—•(*ÐL=âP—ÆUeFðÀmwÜjõ÷MKDÍÁ¥š‡<Ö­|ϳˆHÖÇ€¥+U9Ω™1· èµÉÁa#Mïê6[ÄPÿ!ÛBUƒr¥Z¿¾>>bÌgEípbå«VÁWy&š›MÏø?Ú‚¬|¥Põg<üZÓòbÂIµ^LЦçGˆ9ÆŽÂõ·[úGµœ«D¬í•vBAžðL%ò˜IP%çÀfˆß½°ãñÐÛª7›ªc…¬C»ñ`srFJÛö¤î}Z-Ö#’ÌMy`§Jà¢xŽl¶­G4qø©øh±ìy±_lÅóììÖê$ÔÃßa‚ïæfûÎk›<§“€ãKEýw«êò€Ø2ûöÜ)Çãb9GVúù€ÞøàG¯Ûsž¸¬€‘f%?ác§êp½a0ùJ}üñKX²D‡ÙR†*¶šø‹,•Þè‚l¤l÷h¥6TÅÏ!Ì~ˆÏ¶N‚æJÎ`›ÄJÞÁ˜^ˆtÇ‘µFÁO÷†±§»ômÿÕÏ‚G™:{»hÿéùÏÿàãGîø¼ïÏû3>wXwŒ@›×“¢ù“¼ï諼^Î…¶YÀ’˜,Ây¹(~ù¯jf?3ìûT–+£KÉï–|ç©ù+¬ÊÎî}&’^A{…Ž7×]³³ÐÀè  ˆáæZËß zùFÇÓÑ/‘ó>pw8œ“p;¨…Ù9¢º½y|¾‘§x)‘¶ÛjÊð•9úËÏâñ—ÀÄk%ßöáyM½%ëÌx†ëÞ2Þ§“ÄßÌ'^Yï¹·!^>û¾¼-¾A@óW Ø¿éeé5jÂÈQ"‡xkg4<@q „á O§ƒƒ/q¸ô[o#ÀÔ:z±FZ¸]òhö=úQr_!%? kÞtïÌc?? µ2xïë‹Sd´S±WÊòˆ—„dzñGÂÐø°¼ü¾t$ìåéÞò_ÉGs¤œf—]›Í>o'j··-ý,/iÉ>Ü¿ýüÖœ¥¾)4GDÜ©û–q?ªQ íñE¡n–vDÇuy‰à\•à¾ï:ܯ"dÁšùpDk:t·¯5ªŽvª†¾oØhã™Ï.£=Rb±X™#Ö˦’ %Ö#P8þêÉ‹¾tA©{OË«Ö4Ú&Ébìà BcÝÕ™ª ™¹ˆ,žëµr1çR}¬{îÉs­ðž”H’µÏæcÄó\¹}ûùù£ý¨ÑþkbÕcÚên§ÏŠç¹µtp`c[lxP×'`äY56MÊé5ÞƒÀiÀÊåÅ+¦‚>Ÿ*2¥‚¶8ñp»¯)]‚Î0ûèE¯„ù=˜:µÏ–t)^½ÒäŒ M¯ùâîüÚ|hcn‘Ûíã¶p’Gn•ãB“Æ0dXó0»I˜{–P|^ÝÀ¯ D~™DÁeö3v7ˆv ¶Ïå°ëºìÜA ,´T62UÙ3UX;€ü~ꆪÔ0³ÅDüŒà‹òMV’ª›˜ü¼?ç#à'nÈŽ¤ë£ÑMÝù<7$TmëÐ¥õE‘Á@¥.¥t;Çhfèl´mÜ,çÖ&E¸A^1p!÷Íwmñ2d\•‚ò±r7òQ˜ï-çäxn#NŸÂ²gá°ÛºÁצ\d^À¨ìK¦©U’y捻¼•‚I§BG Ü]oÜlfòÇ8UÑ´«ÝH%þáhð –Uv¢K„@éF¨)—Àíb°M˜4 +#lW+:3ް]cñ˜ÇÜÄ1—ª9S f¦89´Õf#“z\NLz0ª_á3–ÐÙÝî+ª†¤LteGk`ÈÿÝÚ*³›0Ü=ºÙÖ)Ô4}¤y•>©cí¦è†s¢7cóM½š­ÇLeײ»ðd »w{—ö»ë“ÆË°mO|±Ä÷­û«à’Q·çL÷ý#ªƒýu@ÆxωÚlmëXÜôQà¬Ö¤Å…Í%"]Ù¹IöX¢¥Õ€åû̫Ȁ½s~â!ç(û0ªëpZp O”6é‘=xX­:lx¬Ï¾ÔÝõ(ÞT»§äïk©ã‹¬Ñ™°Ê5qãyµ:ŽìŠ“ðEÒçëÙ¯Ž¾§âÔ{#Šio}~vU_ôäC(Åk¢àxÆ…fÉ÷’š á32þø–á/ÐgµdqZ6xzwÛa™0¬fÿPúö?a´Âh1y è×xPu!<‹i˜»CØãN›ÄÑE»+mÛ£‘cðÖÓæ»EâžÛÔdP›MVþÔt’kãÐyˆ–&#'žÖ^g²_$ŽÄ• V¹ÆN>¼>3G]q(ý aaªZ8FEñ™B'1¢2˜bâ k]sÞ’Œ?ï*êÏaT1Á“L;}çˆ1£)‚=©îÝGëw®ŽÍt? ™¹mJÙ@fCàqÛ­"2´Y>àM5H4DÛŸ=Ý0³øOþ›LÂ}\W ÜÜý23㽆 Ï­jº+¢{„rÇhf—?nÆ}óG~]×u‡ lйü«¦Žâóßþ_fö¹7×ávÀ&P´ GÆsø™—e؉úÊO^d/V‚yƒu=´íT>ò\`å7d—AÄç"ªÜsÂåÐ3>6ím±7>ý ,gä¿x ëK’#ŒüÉ6]šÿ·ïi~þ;Qÿ÷üfÝË|…î|=°7*;eJƒ¯}û_ ^ÁÐ;œºÙº†ÖiA@— ̱úËamn×IF bÙÖ’#ç oóÕpŒš ™ŠKذü«Ë"Ÿš2ÚŒ„ºÉg‡äëfB—|5¨Dûúx°¨ä»­«>¥-wT»ò:ƺHá´ ãóW¿úÑ7ß@”ˆ%öÉ^›¼wÏ+G0y £ -=4üdOš¡aóÝ»vJW$kžývc”™LŽNƒ1KµKÜuÎ wÌçY©VJ»µ+ÞÓX¾Å¦ÝcÃ0ù f•3 9K97J@‹-›DËŠžÒ×.• kˆÍYa!Ì®`ÇÁŽ,œå(ÌI^u ÕÏ|FnÃôèR†•pWìŽå ÊÝãàOû+ÄViík›jBŽë¤ÅŸ> G*°MÍñEŸ—[.²fïÃ…‰ø) o—w=(ã¶GY­û*ÝÀž^ˆ×Ÿè ¿’¥¢ÀfûdêÚ#5“dä%wÏQb6›øÑ!œ“’–ð´ZQw„IïBý¼s¹‚fŸ:›>´z¯çÁ9p£$øÖ #F1Dvœ” “Œ,ì¥IƒÝåE1ðëšbÜû˜*dµL×Íô?óÆ'ûÿ¶l±Õ¿ìöd”5þÝè"„Ú´'­.ÀÒ¢æü:oškZãâ9͸¶‘…htþgÄ}ߙʙÆÃI 7E! ¬®¯o¡Çl1Òá7ï=g‡þ1eX6©Ÿ½çÕ0ªž@w/m&·º=œÄ&¥Ž£Àü®µl¼–&Ý~9ÝA—îô’LJÏQ>d+°R°›3zV‘ø ÷µ™C*뺹ss!=Œ(Æ–A|0áÜg‹Ö~­qsÇ•ÚHh_‘¼ÍÍéÝõ›3aç¶…a˜±²Ö( ½âsé{£zd`@$Ÿá#)ueD‘v4†´[¸ ®Ö³Âõ<]Æg?:Ì´'Û2†ð%°£–§Ì4ƒwÔó,‹kŒ7¨aߤúîvûïµE>àTcð¨ÔÀT¦Ö3/rM”&œ_B”*Íã ß3 Oí|¨ÿ½ë¨Ð¥ÚNó¬æDT=ê +ÃÉEeT­8”¦¢<ÌGäQŽhpgÐ-¥TÏt”;á²7Í~’çç\¦*S½ºZùÎ×o§å8ú§1uó1XÁ¸-æ4Sd  k§ôÏà ʷ¯´§cvv–)W³PïU1~êMô“ÖÚ=¯êV,ª5ü»…àsº6„`ò¦â¶»ÞgÊɧô6fޤ €TÄIXàéF>Üç[~¼AõñT†Îa‚OaŠ¡ˆ7ñö8ÜHl-Ž¿ÔsÏYVŠ>¤TÒ}d->™!MF¬z+ñîÇõ¶Wgt‡bâ9eÝ/tã¶5¶ƒ^çã=:›?º2­Ÿš/4|®rØ™‘ŽÀßžWѵ£¥jú^8À*ˆ$´bd…™•¹ôºê9¯K.æA‡¢™ùÿ³?Ím̈`Ï]hµ¾ö«oZ#QÕ`5ÉÏà]'Ôœ»”˾ýö¾#>~ÔÇŽÞFXüê_ÿŸïKcà3 “-2÷|<ÆŠç•$79Ü¥4õp È¡À1qzªÿ&د¹˜Y7F„ ” ¡\ôÃ|ºô­¢,šX¦x¬6>i¾¹øçJ=nPS§˜<7u2÷/—ò¿Ýÿ»_ÌßÝ àµ‡HÿÕ_?‡Ðó½ÄŸ7r?žh¡/ ç΃öú yâ}^Ò;†]Þ° ç >ʆº˜˜Á}ú ÓËv›_Å0XËlÒÈÒ=Ôð^ÎúmKɦßM(4‡Ža¸®Ýò i4T$ªgý’ÏõÎcX+¿ÆÎjg¹öéåÏÇÛõ4g 7.2—Û_HÙiÇéÔ–JtÛ€¥GP£wÕKx±üîpG…4S©s·þr*´tôòÒûL`š5‘–x~ÆÚÙaqÂLJhÃïs‰]nð^²#ƒ;ª)wšESIé¡kÒj‡þjMP)ûõþɤ·aÎvg5. ¾VWs+=UlŠîÔ!ŒÅ)Èéôje0¥pÔ=ònrˆ½ÝþÖe›<Œ¢ái!³ ¿q¹™_ŽËŸ´tòFpòòô53H°>ií±´ýžìXÃéh‘É œÛ“­°uÃkàG:r[¶.ÿ8:Žæî+: B%íÖ¥ðOߪq‚ý¥-TEíäíV0m£¾'Ùó–ÝÆwC¶=}‘‚rÎáÉç„@Nd¢t”´hµÜ°4Ö%Îf9FDcãwðjSf¼*œµóIF|Þñ©¯½+f¡ÒM:¢/0)Ya­£åe3(¥üæ,ú9ðfß²ÆG”÷Üjc 㔆àµó©¢|¾EÕw¯j5¦°O¹+Æ\É:Š®‘]ª÷Ú,#ÛÕ’D7‹ ¥„b¹r{±x¸Fä¡ Ÿ×ÚóÑYI#ˇ8V( ‡˜§jäâV»Ï_ªAè.O¡,¨àÊK¥¼Æ³KÊ€dússoÝRßãgv¨°SèPŠö>c)Ë”0&bÔ^ë™êXŠ®”Š£‰©÷µÿQ®ñGœåtÒgµ@*ÅA‡7a‰¾µù² Ku ˜áŒ€µ$_‡?O¸Pí(]|m,Ù2^‹í a£Iïåh@ /Í,ÑѹÑLŸTê1—ÔV Õ\ñ†›ùÉp+wdbÀ« sè훕ªˆSœÚÿx–{ò…2*2ãÅæ¤Ï‹i~¾¼Íq$Cy­vЄø8BÕ6 l°f^OÑøyª8Vù<ëm¤σ ¿pøã|¬A@F‹TZžÀhÌÎÖãa½åÅ8ºêŽaÆyv¨½ÍùîCŒðäÃÄ(è'–ÕÇL~§³×¨mXɲ=ŽÚ÷×¥äþ®êSrßð’áaO|€—¦ðçŸP*ÚJ“/æÁ„¶jô“‚—Ž@IiiWSkÆ,ÒDAè´ &ÐávÎCjº°ð´â6Çü¬õ¨«‡i³Wäâ)k,óLžî¶éiǧ·‰š æ$*0[zHn…oñØÓJ£º}}­Í¯ínñnÚ ºÊŸW„ŽdúÁתT3$4ä†èÕ&4(Å<ÉA·ÉÑÏ»nË{åå²<æ»8ðÿéŸy“aÀ¯¾ýÕxV —a¼ãNXbD|{ß—ãÃýGוTŸ`Ì%ÎBÐk×—|!wð‚›Åç}g?°|üÍ_ýåÛeê\¡í«"õЉçKç¤*Sã+û>–ùâ¶­Ëââ{é 'í'uÿQþî¹éǯ’•ûG¥7ífðŽNóØ9'µÇj^+Ê.z8‡+Šè“On€ã'Ó©o‰ã{ïÿc²õêò_ØÝ_•öߨtïf/Nv¼Õå›’ó0b¿i§ýý™²°áëíå{_Èvÿ0Å©ZýÎ~ÌΪ …WÍ×í´1åÁÄ-q^³Ç­ŒÃ£>ú}¥˜\µ±ÎáçÞĆ•mo¬î=¦Ç«ë»ˆ¤n„á6sÂwλ#~p¤W”ÑáØ”UÝ£Žu U&´'x?µûµ¡|Æó¥x[×.«ÃÜ£æëléÛõ1»âYe¯ÁÑߣÀåæº# GN¨¸ûKzþd´´þ³1/lNïëÊåg2‹ŽÍ'̳âUycèy8¼§0Ð;°ÂX¬i‰¾Cž?3i‰Ãu]A^©;%¦QEÄ=ÕŽmuWG0Ûr¼¦Viâ »¦ÌbuiõËJàˆH‘+úÛ>˜pö0w…D‹t¦µ¯NŽ–½Ä©A^DÚ{ —|:ÜÜ/Ä}³|¾ŸÁ›qÁÓ@Gø‡Ù.÷Öœíö9„K·›·Uuh—d£‘=Ár¢b9C £É.ÇC¸ùPо³_þòç?þñæW\%–;éæÁ1'êîÚuu?ö_ë:Ù-RÇÚp.Â뙂kkX7Àë9]Ä/£ÎÀFÄ~ü´OLÿ0wv$¹ÝàÐA²X˜eÅŠÓÜËG?”$‚Îê èøfXûP:í)ÊÑÌ>ïp/®´”,ä¼·½$xGî?J¹‹£&‰¨›–ÓÒXŸÃ,)ÒœlRLˆ TBC̱hZ:®ú¿š¶…0TgFØm™æ&¯òÚFÛ±Q©Æ.-8ã:­’ ÇgØÇå‘%Å5¶ðz”a•oBnêÿv]‰‹A5Ž[þ#ØIÅQïæú%#I(f4~æÃ´·!±o§Ïš—ã¡á¡IúÝ-æyŒé•-æŸ=AÍí¾ïëºjÙÄoXc‡%šƒ–n1½ ›àšÐ[¯fÑÆ#% ø¾§v»?÷Õ5€Þ-5¸#¤·£.ÑTøÊöåþ±Ç“±O±Ðx0,"ùûk܉d1—×+[Ç}æÜÍøy×jâ^· ë#ê>çœÂc챸›ñ´µ»Û«ýºÜ'6-ØÅ-AéÿÄC š¸AHÎ?³ÉŒªØÍ×]S5êWD‘¥Ó Í•!úß×óìEuæÃœˆþ³èFÃÜËI‹£»¸|›¬‹­ï8!ŽÁØ, åU+é¥UŒ“{v…æ ¤Õîfÿ+ºÃ5 Çð¬*+ÓfŠf^B*b×%šÕx“Äcìª÷lt¬Û3£È}•ï)ãÜÅ$TÁAç0=Ë%ÈÐtÝZ<¬£šWGYG»°©`¸s§Øƒb0jþÛ¼”›âóÖñ9r½9ì96,BFªm0×;"Ó´›‘j'ÑšÕs‡Œ·y'n§YÂjÎÖƒ1È:¾ÂÃ]xLƒÄ®N{‹8X(ÃÖ»ðyzçèPÕ§é9ˆmm°Zk ]ú­`èt¤”@í¥šW88ð‡™âÇ[ÆÃÃñyï÷„­ù‰c!ÁD‚ ®BQ¼ÜÄ5Ù[N6&õ|¨ø¿ã€£Ö™¶0%úRu+Ó¹2³…›ö1W ¶$…|¾CÉqfÎápôÙ!¸£®4?¾Ž>Rû²o0noú#DíRuëö€5)ÑyÆv=ÙõÔ›Ëô¢Aù”G£X/ú)ñƒSÁÅÆ”x÷òÐÉÙþÈŠYÞDÏšÅa?¬Öp²¶x— Ö®¬ü=‡…º9Éë8$ÒÑ(Ý&Ôû8“âg‰>ìœ~艇œýë°cSÏÔËS)%© (^®¹!¯ûÞ§;tÏÊŽä'P߽ޔÝ[©x1îÊðŽVMæ°ÿüŸþó(HG’2S䚥-¦=¼ã¦áÃAØç÷ý |Ü…¹SR“z@Lº'àf÷·ÿïOþÐÍh_IòûÚùƒ¡r÷;w¹¥ö¢Jž®Xê shóU\ÏGÕÞóy_Ü'*ç6»uÍæº]Ì+9—IIŸ-ê‘þpØ7Uš{±µÌö`JHUß!6©FJÊQ×22s'퉺zõÌóïI÷ã ýŒ|1,PΩ€á‹š‚ãrÇcpúôÕFÿ]/e¿á'›ÞÞØ]èüïo9>#1¢°+ŽmRú´E‰Ÿc~:‚Ëê@àñ“wCÈ0¿LlL¦¥h‹5Üx>¶Ä ¬ ‡›´såÌ.°ëzÚ/›b öùjêÈÓÐT,rölJ*Åmy¦ÖÂ’j6À#h „~òmd€D¡­+[ªóζçN}/!¹çÄ_í í÷©ØÌ>r“‚–y9ïœÂÔAªú ­Äji ̦Så]*Ä­5H îé ¬Ñ/ƒ™G÷[ƒHo¥]90hƒ•óa´79„èœßQ.J®Ä;+làÅå°¦t±ë’ÃݿˑT7ýçz0ö*,ö1Ö»#˜*ÃEY¼ÕôÓàŸØr´š”šwúFH‹ˆ›q™s8ÍÆ ??o#¯ërO“õ¨Rjš‘FOpù=•¡Sþ¬DŽ…ÌŠ»}ìóÏ&Ñ»ŽÊp·»õ˜Êȼˆ`Xp/Xõ2kWR »†eã8ö$ìç?ÿÙü“ÁÎ×f;c[ôŒõÑÇveöòÔjW#Æ$ä ±FÚv4îá×¶hrž!gàЙŒ«¶ôû<í`9 IDATEæá"N'A²î·,â–ó'Sób;î`ðî]:Ã+CŽŒ[6µ.Ô¨^Ól9p«UUU`÷Ö²Éñ)¯8÷™ÖL²}üËs¹cˆÐQŠ-ÎápÜ<šçÈ ü,aÓürD\ÒÇ@HCšÆ½óÙ|åÔdd=aÔ*uá*o(yÛ}•ˆZI ÜÐ×cR*Áó¯ héJòªK0Xod—ù£½#BqíÞ°|À›æ§ÎH—Ou§>·Vâ’ž±ŸvÍOê6T™ûÊ'«;ùQ³;(1§vüBÝñ1žl^^ÿ;ârg²zek¡{24;*Ȇ ÜÓÇôÞ»gA4º…&ý\!d­Xƒº. ïHj›ë­S½Œ×/ãA‹¬¯·+¥y4V¾ÍË=Ø…½™Œ¸‡ÌÖ7cm±xG‚ïMoȉPy–¯ëº®TMÝ÷eØ|Ñõ8ˆ¨‚÷¼®·ZÔä]¢joö*g– ?ìçÇ„Rëç§»@x­]ìXvÛ!ʹ/z1Õà .›:‡ÑÛžî®/(aí²áMü1Á©QZ…y`¨[òð¡¼HëŽG‡MékU1_GƒX·Ž6Kn¨ˆ«›ú !®Án­€imié9‘ÌÒ§Ì/Çpãr$»È¤-`kÐÜV¢š/þ¸vîMøÂ!Öµá5 –ƒCÑy„ÁÒ›MIMyUwóþ4c”üQÜæˆd¦èhfcí“ ¸ý;Ëb)Æ×bVKñd¡Ñ²Ã†[ìWýaÙрܗÎê¹ÊékƸ‹ZÐ鯻ª’e+ø(\ŠbeÍØ¡˜/]Rûùöü|zÙx”O fÃÓÁˆ/ÿutQ ‚3Zí‡r†‡bW*O/™ö]ïây†Ã±Ÿ}…¿žÒiŠØs‹íÀÉ‹UÄÙCŠ?3q†g_¶Ü3“Õ‹«Gê¯ÞzÖæ¯páSd»{â»ë«OñdöòRiÇ£±ª,,cEšŽæ˜G²£ÅVÉ ÌöÀ4½*ÚøkrZçk€h3Çy¸¨&줣K¹¬Î1ñ6=ÁÔR‹žË'(žlÑ{ér&'sâ¹Ùp-ÛGÆXZàÇHl*”qúGv^™ÔóÊZ”ÚÅ´%urR/K`Œmz囸š~{zÔzzzÃäïê`­0“¶ ©e»+fW²¼{Ò•É ÇKYÓH·Ro°q•÷/À u2¸}£ÜÅÔ|΋¯üÏþ‡+ éÒ¬Hχ™¹WÇ]iÙ©G’v]¨¨Ça”ù]t˜¬úߙ͂ÁÛh?û¿ÿ÷ÇB3³'wä«ð~Šc5}ÜNÔ=âûfÔ•‡¬0P1éÐË—](ù-ƒ¬ìC¦~¦f~+"?Tóðw°€ìûj턾–µâÝ@CúËvîéíóO<æñåíâQé­/­ŸšÓÃ6N¾–¨wªêÀ›O_¨~„JÞÃŽÆ~ÅNwF*¹Wbá2JTœdT;sÅ^‡ÔpËNh¸Àýû20lãò!N6Ç‚›0[J§nù,…!÷ëmØÛe*b›cL£Y…ØÝ-5ù»ZZˆÁ°¼LhNÌÔ3‹øšSú=ñþ÷ –2Ú--ð›,:‚渧ý@|ÞÖæ-ÙQWÿùÒAÜúZ¦Ö°½Wt:/ ܶø¶(wýè[·,¢lœ$Ú§Y±–g)Ú`´Ë¯îøŒ`”wƒtèNßêö&´”[Å ew¦ÉÊàŠ8Á;GDøåîw!< «œðaFËÁéýy‡6Í#wñyß>…µ•‘àç}ß÷wÄ}Cá…¹AùhQow飷•*R w ÷󷻌þºáÂâ¢7%jž˜=˜z ¼ò«(h¹Ì˜9Ü€`Ð,ܯî·jT ÇQ6v³5îî•ñ‹ŸóÍ7k&ϰàtꊰã÷ŠG!À¯¬2ŠÅb%XÛUhxpÜ…6(ƒ•·Ä'v"'7NXg軪RÃOX“  Ñh~ÉÔ²/—‘–é´°6|#øÙkë4ûò¯}Þ›¡,íÓŽ‘çKOiÉŒî¥`S!FÕ˜q0Hº‹¯!Õ\ó[lðâ‹îR}‹Y.J J6x¤{µÅíp++{^wÞ 7 >Ý9/néD¡CÁ«æ6wÍ1uDØîÖ1øÐkDA9…k˜ÄV+O§d¸_GHÔŠyG]é^áØŠ`ò¯£†ëQ¨¼™YÎ+ÆmEEã.‚æŽû~cÜK·¸#X5ƒβ»Eý?YñߪÑüò„­ÙÔóá¯Ò.—TÅßûq=P95X¸oΣÅN*íøjNzõBrE÷tùWT}:ZCÞa—Z{Ã>móÄ6Z?¡ÿVBO+­{ÖðFÄ]w-2¹‚£ü6ÿkôZý ww¿.w1§:ÌêHÃw‚ž¬f eõobðL€M[€ÛÛ‰üà†+¿Øü$s‹ž4â£<)˜Œ”NÒŒiŸm]U› žÞQL¹9+$ԌȎÝ0Z`ž@‰^æâÚ¤_²}‰ÄLiÐv€» Mm¸3ÿƒÚ\Ü@ð.ÿ–3Íól+ûÙàA`÷ŽêqË¡A˜]S'ÛÊÌDAk@8[ù{´¬ FŸ»ëÉ0FãÉ]' Â°æüÌ݌㸩Ÿ™.äF4XÓl®smƒ‘ÉåQ!4WšáêW Üä¶O, õe] žYÒj=MË/X{„7ð.“ ûBìÖм à:6Ã4ï8iEn¢{B¸›ú¶‡³»IKu ÌPnóçyªÊa*Ó}œ´Íº$TÂë§9Ž)µ«•³Ÿ’L bÙQgR1ºÅào—Šg£ï2I í ý¾‘òx›iêƒoÇ bLY§¹(„6TÛ€I;r°{•Kö­ÎŽ}œ5im~éPÑħ߯ÌñPÿa8§ó¨ÇM©ÔzÞIÅ…W]8è¾YõˆÂjNÝbíg €h΂I<éAo®+xÉww®¯©kâ‰.©æ:4Åþä¸Äö–RN¾ÖÞU|ˆI²«¡H9GÀó BÄrÆšp_Áyà9~L\Êe @‹Z\œúWô粬sÜ›:zj‡Õ±FÁ¢=Ål€´×Ì[n™éqøÏþ«1ʯ=<_U Ÿ¯Ìà ãàƒŸè¬t×eè´&Ôå 0,"®koø_ü?ÿ‡hrx…žá;Õß3  =9\T@>ŽÉÎã$ûþàícçÔcriosb‹çŸÙŠÝawŸ‡B›RY0ÎßÖáàʪ;®ÉBE£~uúQÓ௖ÜÝSȶ½£ñ(–ø×µÈÿM~€QÄ9°_§øåBší¥*øoaBÿEž$5|ý©KÛKDC™ïBÃz‡úÁ×uĦ´ÀÃÁã· §G¤QS2)çmÎÙzæZ‰í ÓWúôëÈÏ"^û.nFØÕo؇õßø€r/va½Idκ‡ÞAx9±ƒßJª!ºæ¬1‹!dÆ(qlI€òIš‚c S»nuèÌ0)ïuåDÉFø±Ÿ¦½Ûb¿¬…¿"Ò®Y8øñaî–¼Ñ"k|æ 5"™/:hׇ[Ђ@öÏ™Ëp´ $,ÜO™‹f—˜M#aÜq;6êMð%ϬMÕg+Kl£ý«}…w°‡Óìþ½Fû½»Z‚<¬éR©~k`öð?¦ÝÕ“!ùF•WÞø†ã`€ÕŶ¦7óãñ`"«™s{­ÈKŸÁ/¯LKJÑåKCÌðÅ>ÆRt y¯×XânâO­t¾[âÍÝÑ€‚Bý¯Â•‹]¶˜$5†Ý7[L….ë5…ã5wJƒ«NoÏœbØ™~€²ñj­3GC–U^>Ý›¦ƒˆ´ržÁr ŽÞö\-ErªKó’ÛMƒÁëx¶4·‚çÌ—àë`œÝÒT¥+m@AOqdBy§w>Xèî(°!Þ—•´Q×\W7Ü£±ÛåAEýBÊ»’íÕΔ&)VýC›eÃð²?rç#ÓÄÃ;“ÙüÛ9Ïó%Ö*Ú|}Yât?I»ç1¼’B§ãánAÏ„f­Iß}Íö"úUøŠv÷ûqè`<*h6¡Dv,Iÿb„»ÝÁ*Ú˜¡~1Ö>ê?ü#uþ%íœH/ë}ä;j+·Ï,¢•šäm1}ÝLÐ Á>@&Ù6aò޲ògQÝÓ‹ëºT¦í2€rã¦Ob4Ir'¾¤ €m¢å½ë„Ö"é@"f°}óÔEãNu C 㑲?Uk¹è›LRéÝdÎcRË!”±|]žyóÔo—…¹å.ÇU]ë• ²%žÞ…š¦yð°RøÎ5c¯/«æäó TB¦®- Þ^ÀC‘s­øì.+niq`2Þ½euùÔêÌÎ?ÙY æ@4*4BéT˜piy^úŽiÁÜtŒ»è'/Z¤pX5F¯ÖYŸ^ókÙœ½n‰beHö¯Y¯Ù³ ÙUD%iÎ'7†-ôGž•Ïvÿ¡Ñ2 þ×vЫžyù]‚Aú|jÚj$V­©s—p;Hã3ÖÙœ­(ÿw­æ›#u‰…æÒ.AbÓ…Õ(»¢þdjÒÏ‘¹ÃÁ`™[¢R›,õ±îYn€£‚’u6aPÕ5¨‚ü60O{pˆÏÓ§@ðrêžÇħV½Z:kŸky{B¶‘t°Ïù#kë×çÔ¥÷÷2x5(‡fb¡ºx^RnQFì'™RÎeøä³½›ÀxÌ>D¿8¾§õ´Èîvð(ÄNAH-Gàão½¦TQ×ÈwÂÚ£jø­=m-C4¾ý d¹7û6gµ8ëü–xÀ¬Au[4 }yŸÎ÷Úmý@…àHbò„ú# Å:áèËåã]>¨&3=Ï{¹bç“(K\^k!¾à’)`{L-S` æà6°ÚÝ9½ãD'—Z› ç2‡„Ú,×0ן†kÈ}MRÝMáSç˜SKv×jÁâýtKq\b¡•êunŸê”ìûšyÈ¿:a9î*ýˆµÂ»~%kW‘®Ú™ç¦ÀµQbÎ ¯íçë.óRïªÒRÙQ°ÿâ¿þÓ¦Næp12°µÝ‘ó€-¶,ƒÖ%ƒˆuWE"½sùþGU†æíoÿê;nžs²ÃÓüµr‹ïWuq.1|•„÷837ð’?ùÆé}Øk¡ó¹DÇ!œÿ)º‚ù0Öݧý:èÍê*Z$Uj7Û¶ƒ>yöñÄxQ­rCe™gÁ¹?’\ÐGÆ+¾†¿f2ãïö$ÀßüK:¯Á_·à¥Ì·Ä¯·$>¦¤ÂÒÑb#3¾ÜïJƒùŒ¨Éý«!»’“®µ…¹Z¬aÏ“ýÞo p»9YñÊã3q[[$M™’j£?ˉEÀm[ qö@¥äÅÚ϶­I)åæuq`=˜H˜(1—³Ìbôüôñ½573…â<üy}QæEJ€âXE!SCÒ‹Û«µÆeLÜ¢¯Ï ß1¤û=K¸Ûçgw-t/»ö ÞÙà‹‘(Cs^°eˆOv}êfÑ… -':@dOè¬HzË›îû†Ûu]Ùy]ùZ|¾hïã.“òHwng,$7™Âè)uòeT®M©T¬Ð·vf§t/î}úUV;=Èë‚îÖ¡6!÷=Ü©¹²(Œly7ÄŒš§Ïb=3pùU&¼af·”tx£‡xovжH‡½høö±RxÕ+°ºðœ @¾Ì Èk¨aåhò´·8êùDù{låßö.iýæö¢ýò—¿üæ›oäÒ^@mƒìNóÆ\÷¾s‰‹â„‡¢çPÕ£—©Ñœ]ß (ŽG^p9#¬Ó¸L…s†•¾ÚÀèn1ü†‘ô6)çZ§å ÀQå±ðÙÖ•B3aUÍŸó³/øŽ™d.ùÝ5³œ¾¡«Þ5´kÇ+ÐǸȂR[Û¬T²ŒÅ~ ´0÷ëƒ;‹ •[+ÈÈÓC"LÒ‚eX!Ö¼3â@kO`gèÓ¯™¢ƒ·t€zp-’‚&U k¾uw÷$¤õy 5±µ GžËáÌê×]¾ÊÇr³5)Ðqß…¯¸.§ÙUgœ<Ñä{s1ïgÀ Œ).ùûwdç­ã¬ý¸.¿osxö¬¤ëß3BåѦÜy/mãT†énîŒì®½oÎqÒlTÈ‹6gý+p½R ’c^µ`;æEJ§ˆ%=ù€û·¸£–ÜØ E}]~ òÃ}Â8ºøæ¢uÆÔZc>Èbç¡Fû@ UY¦`**Õ:“±¾Œî)IóÙ N9ÃöÉÌP¹<Ù¬nݲá0ëvº²}?ëò*¤™™ ö\GÖÍ0w! ªÞÝÌ#Ï ú DZFü× oÎ:%2Ûb†ÉÃíKÊvuÎd“q@©ib­zÓñ§Îy$=&Úƒnclò TµÇqrm¬Dt•‚üZÞ]Û—QÈ&áÓ‹ˆ4¦ [œ\=¢®^í+ªô&ý4‚žÀÁSÚãr0úUÕµâV°Ƹù÷²mf“Léý¤VwÀMÚâV‚¼n›êKß”‘6÷Ôi_âàíkßÒ±¢_SVÌ‘&4ÏÃú÷°\Py“q©ÎHqüBvla›ê·£þk†vexœϯiEzäKE6aNêÃJ^¢¹n’àB·åMë¯ Ú+¦|éHá¾’ÅmÕ×ÃìžYÿ¡ô2ÙØÞÓóÆ7ÅÂÛAo(Èõ*ª×–¸1˜H„¤Œ-x¦S™©mõ8Ô³¬pK`³læ²ÐÙ¤Œø6ÝPeO¥d¹Nq!†äBqIx8JpÞEߎ4/ÇòUíÕ“#ê¿ûåÛÇ1Œ´X‰ ì½I7õ™4Ol ]Ž·Çýúü#‡"|}èIQüÿ düý«ÿ/ù» Žà׎¼…û¡#ØÓÖCÀz?j d*W(^^ÆÉÙŸ‡7 ÿs*ð@Z ¡J­}fvúr¯Tk…ZàÝFÅoçe¿¼²²6.¡"ê¶Kz‹kåkU Ñ2@[ÇúùëUɺÁ3/Ƙ¢ŽÒ…mq•ÜsNá/Ëh¼û‘¹š‘ïã(°²ƒÄ„mfÇsh™gÀ˜!´j«Ïñ*qx®º{Ùø#Nôvdõ;8øøhÔ Ê XÑmH‹jùú”YÉ4½í6÷˜J HE÷Êòß”‹e‚šÓî|¸ú‹©«>tá4`šYDê#yˆR¸L™4uZGWæLÀ w]Ÿ¶í¾íÏIÅËKªæQã¸[þäpÝÇÜóp›¯ÖÝùùŒ+/ÇèýšIG³æ—v2ñßÌîT+GœrQÎåàyúïÖD)oæn(C'×¹Çq·;:‡ŠÚc :¬ä7ÄÙ[f}ëöàJW¦˜cOKˆ/ šôk¶fÞǦ‹Gdó”j¦bg»;ˆ ýüç¿üÉO~œkãˆxëCfBò¡CÁ 9;9+Èâ‘§|P\£€K'çzÎlAuÌd3xw·{\¶GÏãèC— z*fãÙ|jvV¶0§ª¨ gœ¢îïªK¿o4r,k¦~á²+ÝÓµ³îß¡\ñå°u›öÕT!-¶t¡ºœRZ GåJ¾ÐqŸ‰K}…ɳƒ©Ï6U51¢º}æ.:åú¡þÿp'`àm´@õ“‹ZaÂü~U@j7SënuÄRj ÐO=Ùe +@àÈÖ•®…]×uoy¯£±6%”Ãè‚E*0I¾ç›áw-.Ñ€¬¯ñ<ÑwÎa°U§ZŽ1º»É$5’ìù7>kÍÚêm;ZEi°ãÄ|ú¨”Åní4^;¨y3»X5‹óu¯5§^¡F¨`œšB¿¾;S‹µäh%åíå¡â—gQ`D ÚCÄrƒÑ)û¤Ÿ«•RKŠƒž3~ßÓ´ïÇ蘜ɤ'våÓÛ¹tÛ/åDbGaÂÐ>?‚‘¡Z%°'b:Ÿ‹#BåV«ŠjÜu;¶œ¨ÅÕpiZÊáúMæËâé[<ßB pôèhxÒeÈ#–{ÜÙæ˜„QÉIgU¾˜˜¶p“6ãå{ã(ŠS£íR*^Ù8\»2.8ó<ºRwœ:Š £[ăLxzBy¨EõëoÝC‚Y„ÂMôËDo¥èH†<˜˜,ÃÎòÒ½í„ߊµ/ùúWæÏ€{§Ýð×`®ÿ'hej€æ’öë"G?ìB/,.®}áãõ¶¨ä > ¡!€¨’sAû¼o1Z÷æÅÏäÀâñM‹WïË&›»‚5QÛYò‰Ÿ@ÓoêB-¾ùO§ñß§¾~¿Äe®ën©;.ÑßÚ£°sU¤wª´“{¶ëÝP%ˆjúêùŸï­]Ë8nÖZ3$2)œê{T”ËI7…ÔýûQ™4!¿På^õH¾Í‘ Ê’fãã¨S …Ÿ<—5D‰¾<·~,V)Åô*£²9r.¶[´5Øí:š¢ØóÚô§&‰Æ$ªÞ=ãŒÖ¨[ñÊÔ{ÜŒ@@³ª‰–•TU3vGÓü^“t_}Ñ)ú¿±ñ Âì M 2­Ìûìà•)% ÏO7í¹Ø}‡t}×í Š'mDE2(dÊå«§šº;¹#'ÒLÛ0Û²Ç`F+ìö,dV÷7ejonFq1)ÐÃR4™Ýe+ý¸ÛäqB&¯YOÛ(ë¤ÿÇSëæØ‹ºùG~[½Ðw¾‹¤ ¼lÿÌøf$v4;oE0ŽÁÀ¸[`xÌSÀC BÀkÇûÖNãì½ÄR¥¹Iœ,µ£jx6öçÂl¬‚¸knÔàFi·oXç‘Öbó=o7Yÿ5@@øU§œ)u)‹ÒUøáA³’Áec€¿#–É:³Üw^]Áó¼¾ëÉ?ŠIH-Ãk‰ÓÁ2:žfŒ‹`êÿï~€¸ð£µns Ús¦íýç1渪#:=÷å(˵Ï—ÓÑv*öp,¾Ưâ…nƒhYgÍ®Ë1z]ƃ´ªD¿»!£fÈ[é‚9ñ¦6ÑàâVK0'þK± EîÀÜÒžˆõž³ë{OXs‹±L•‡1?á¤Y·o¶4ލy‹¯‚áy,oðt$W¤:C'ÙÇD¨ H„”ŒµO×pªYÝÍý¨L4Dæ€ K¢•§i¼)~âºQç¼›‰äŸ€FDÜÙ/cÁÀ!{k0æøªh˜ÁŠl ò‹¸Á˲Êü^s1Û€Ú“Ê¿ýÙÏÿè?úCB} êŸ~9…ñ<:=Ä Ç`èÁ˜|§É8³«<¤EÉ¡hr2åP—ãÙ¬CJ"†±c‹»²¥”Úžlº’ÏÆ«†£0†Ɔ?&•hô@)ûI¬—:…¦½ôN}²%΢õc'„rŸ‡…;£ž7¿nJM£’\¤Ýóæ„»Ñ˜~Ò+¯^E,¯}ýÉpÿ8îä „à’­!Úfp˜î»ã>ûbqç´2¦LMúxb»«â Ùï†z-UX¶¹¼Q¶!¬ëÁ[Cçs†3ѪkEû­Ø÷‹Ú<×àÕÛL³;ÂóO}BNýÚŠYnUµÂ˜„–OÌHEÃÏí°|ŠG—˜×‚GdOïå®’ô8Ã<ÛÔzÐzŒûσóf‘ŒÛܧvú|]ŒöÔ§ô°Š¿íÖ»šô™½,SÒM«¹£ØNäúÖÃåWðʽá‚Á.E'$$wm'ù>€ëò0à¾gr’G¥«?¡¾Sƒ8]]b7ó Káò¼Ñgè ÀâŽí(i“¢¯ÇÛuÈ œṄÁ³ÛsÚ½­ÃÎ)´†¤(«š,w9&Ͷçs¯Ñµ»0vBëZËרJßoï ƒg[Yj³öuñQ]oÓ ½ØUݽºÝÂÔ½}ï «{˜¯ Gø®§» 8zoX¥í7BVª  +Îs|K5ôö âËdŸµÌ¸ª²µÃluC ´ÚWȇýYÐ7y9Z`k߯Œü`·†é£Âv¤å¶m|×wå!7Õ7=Ú=ú»+©0x?}~˜eqzÜP¹1šò_˜Ù¥‹OQÙp–e$ª+¾Ã0ì1= IDATà á üDZWÆxØ©þ6'ÙJ½¼;©‰zvŸ:ƒãŒKaˆÄŒ¿^¼a/”]µ½ã!ÞJìI\²Ga.OyáT΀¯k'¼"SI l¶bÇaŽ"äå'ˆQ»p€­U ¶£¥×ì4HÌ{Va}$b*<À{Ðé­‘Ñõsß­L(sî¦ÜQÚ4ÞkT‡ƒ¢×sáéwïÍÇÅö(¡ÅYú¢C>Ðn•Í ;Ç‘upÜ~-UÿÛó´‚3ÆUÜá—YfKÂÖ!\4‚õõ–0öZèh²ÁÌ.ÛpVÕ]?å–Fæva½I€øNëëÿÀWóÝyzÏ…ß\õJÕ?zŠ5ˆé‡dI­ÌôX ¾Ä=“ ží¨C©Má×°ê{X´\‰Œ=sðͲ̢ó'öß÷>]wMw¿<í}ݱECpgm¨šëtÿùÇÇÇ7ð ?ÿîÏÏÌÈæÃ²dMÉc¤£e§¿ùW©.¶7°6ˆrÿ“I¯½åΟJÖW]'zÈìY`KœK+¥çFñ¼—u$€'¿kzŽòˆ jG¥ôl6Žóóûðw?7§Ö{4‰Ô—óqÍ J+¯ƒÁ›ô˜¿§’ÎeùdISaƒgßëýÿíø‡ßaÓç‹Wò‡I¼c­÷õeþ‹3 :þëû8s)|%3ƒžW9Ι»þy<°#!Ï—ð pæòZsyYebÖ­¿èÍ”é @Yle-œž*ïâ­#q¤“Ýš–¦‘ÉljY‹u`×p ¯þœsQCFpÍŽgwP^%©¼oøE#ãæœ¥åôl¿Nw‚Ìü.«û ‘ëçFXwvÙýpH”†©6š«;Ã{i{©~?¶) ÔSâI0ü-™åý‡ôãK˜ v·-Øçã€d×bÇr‰rãzš-ë¿Üƒ¢iG¬»F&¿üÙ›nÀÐGt÷é+^/˜é˜ãa¯ÆÊ¹ÃjÃV'@¯vê™K-rÇ垥”»¸¯«Ñ6G:â]^6´±FZóaêt€^§·*\ssMxì’ÂÄÕôçŽe ÇèÌÚ4®‚å¤ÊÑfÇMÜW/õ1 CpÀ×áê]|Ûƒ¼ÊVðÏ=¸‘ëیɑó}żä…Z{Ü¡ñu>ôЭÆÀ«XrHzջǺORY¾ªNûL…—Yt¶á9ÈŠiçQvŒBQÓ¼®Rjò“‹TÁ³ažŒŽM5¾HÁb—“ »+”s–]‹½‰¬ˆŒá®¯*Ì!Œ«úž|yä“Ë3#íºüº¦Ÿºú²[Ìæ–„5ßeõGZ¶/Cdoű#3‹H¸ùò ’e)M¢/])é,q$¼á<Ú•Ú˜ã}Éâ×#,ïÐjÄC4» žL½¨ÞcŒGÍ‘ï¢ìê ÈVóQ†‹n†0m8*³WAû-3DÌÌ¢gÙÖï\¬~òB[‡Q?„c\>Rn…›æ—r­tëAêûâý$³p¬á3ä7x&(¤¥Ö *(ä!†â:¤6ܸV’Ÿ–spfÇþØžhømîï–´>ÿã{%XŽâmìðñ ÂÌ9“9„‰¹kHêþÖz…µÒÙÛª»éäïµXgÐCæþjÅ)è­D»Ø"S—çHåUaÇq°eñûUaÔNT—gÈhg÷\cÅzÕ˜xȾæ©Y†üŸoæ@­ X}‡@>[M¢G5®xŠ„ceáÍñîÅmvÑíêµÀý¢ÆÚ8ûZBð€áÁ 9#ú5PËy“çŠ m'®#ÅjÑ®V@TåÉúrᤠx¦”Ë^í|nˆ‰±C˜E©­ÇNagãÜÓºÀ5Ó E6ƒ_e/µår;˜ÅÝβ—Ôz(ƒžs,Æ/ÉXÌÖ‹ŠoþúGOÌDúáì @ãvÆèbSáÉ[Ë/ú„Ÿq¼SùôÉ=õ?þïþ⺮YãÂnvÉ¢¢Ìí Úÿ‘O:™bV n^¹Ó‰ëúøæ›?¸ÜïûþeÄç}3RÒ"€ër“È2ƒýWÙÐó¦x6ýË5ÌÜFgžYA£>áLÎRã†þcè*ñ ‘ý¥ù||k©ÖÑ´ÞúX{eE;?"ä™öà!@OÚœ´à™kvÀà7& ‡”Ùìz.‡!¤?ßê˜[¹g™çýî1ñü­ñþ-ÉáƒÇ÷÷ÿƒs¿v-°z ÌiÉ9åb~ç/}0^ìÙ#üªÚãM0àý0#ÆS|YfguæT\ $ò[Æ)Å4¼{W•ý]Ób¤…®EÕÉÅ{ ´ Ô µ~½ë°p‹Û.ÌÓ«˜c™w]ÎÙƒ A¹á×8ņâù¤Îyvôq Õ»š6BÃkqžÏ(”D`LÁòÂØ 7k§#ö¶[â _Úãñ]ßøïè ma´ËR=Î\b>5c¶'Ö(^ >®Ù°æ 2V—#¾Ü¡ùMÂì¢Ì€c)‡¯^P¥Fq pœî0"œ-‡ z~7Sî=dB?™µ€„Y¤g9“}‘h>;Ý÷]A)qÅ1Ü婚ʓ‰mïåšužždèôVÑRwc( åËt ×AV;xÙt¶‰»ƒ·®5ØŠÂtt]WŠnõGpê|ó{j•]še‚žÙÍÙ¤§{Ð+µŒQñµ&g6Ô[¬5…$U®[COŸ6ç¾=½}¾M…qu¯ñà÷™›ýÍÏ~ö“?üÃ#ñ-ˆë° ¶›¢Nçk†Ò•@1õcˆµ¬v8¾|#®Ê¿‹5Û!…!ŠL$‘À+n’î³Üíì©màNL'j­J;™–LøñtÄ•‚cì°$¢9¬,t{kåÍ7ìî'nÖ˜·Ý÷êˈSg 0â&ïû6ÃE¸üâhl;F)V·\bmKh`Xz¤; >zZꢀ_ü4:±ýuy•-˜C.L’°Ã‰îF‰±9„±Û^ë¢z`œ• ÷Š3 n¯&vÊ ¬1À€h|Ë\cäû+û+A»kµ7¬!_²cÛe]Ÿ^¦ròá×ËIaìP!Û d´ö(Ù 1Œàu#pÖY@€"aä¸g_ƒ»¿µ¡ÙZ¿”ˆëº>?£ë=¤!oÿ`[Ù„J¶­/ ¢ýC ©M‹í^Ýë9B ÞŸŸ\ÊF3Ö9‹ ‹Ä‘!›_¥¬l·ª æ{9-¢Øäs*¼IÜÅì?æšAÀsé 7¯f²y%ºpDÛlþ‰“™¹_U¥Ú2¯›Ó×…(¥ ~9rlL¸?ënðþÉA>ŽºpmÌîm2·'"/¢nžg™5¹ªP’ÙR ì¯·1æ\7a.wwÝÌx5Ë=X$îS »¼#ïý.Þ¥tIµ ½b=;?Ž}í{2b†Þ=sÀ2»—‰.S|±ÝŸ,W…÷©}p·Óa •˜{¶ÞnÃk âhu¶öl¹Wqmß°'[KãôìöA¹]Óð²x"]>¥.xyD¬>³«òf‹+È3·g¤ÎIíáÿBCÊÍ?Ý}“,€zEZ‘ï [×¾÷­:0nÛæjx}ÝâÑÚ· 4ñí®Ñi…26°$ ;xáÒ³uøÈdÁÆ1±µ3¾R€¤±Â\T¡1¸s8žIã¨öƒm§Ù~èfú†U Àz 7ŽJ=kM}ÐÔé£`ìkj‡? Z¢éöoY4ö¿¥¬‰í·#¹|ô&ŒŠ(9ƒÂ ¢Û Xf>–œSuÜP]JCP<Äœ~Ãòî‰y¡ Ï—=ã&ªäñùxm'd49’øÇö“î˜ÃýN\1}!³aÞ‚®°h"Àf¢iÓ +Š8ÓÀ¼®f½VVVzIÏøw?ý—*&5´.ƶ¡˜=‹ p.EºRòh5$ ;¿µWn$ØwÂVÞ}gÛ¶ ;ÊK4›0}Çv=SàÀ«†‹7)¾kí/±„º\¯®* Èfq³Ju³¹û>>h´3o˜;¨Ëá¹4ÉSâ­] N B<Ê{NgŽQÈÛ'õoëà+Šþo–qÎ_{ðU-° aOþ³êW[é¿|+<¢‚ô¤ž'bÂ/ë^¬ëfoþtû" ª1p-l5Ó'EšÜ_7·V»½¢Õ ‡¤aLò~³*·b³Ö›Z®!é [Ê‚LE—ièKœóŒâÆÉØÊKÃcƒßb ̶ŽGIpun).sÄ ¡æÿÀÔ)O+!·¼øä–½FùLOTo¼&ýn&¶k¸­1ùhõ9Àd±$VÈ ‰‹H‹†GŒÅþíS–kCŸüx z}ã1nש±¬SÖÜ„`Š‚lÊoSQj58…‰•wŠ‚$:³AÛцûzŠ }`ÎÈLÄÈX(+X=/üÑnµ‘̬b¾â«<߉5¶$g¤XqÏ/Ü<9{a ªûjì£ÉÑ,§ª6 :Ö ƒ,ü¼,îÛ/ïAPý±SèÊéœy¶™­kS3IÇ`uî(·.ÙQGÅ'šXcØs~-l¬€îê8¬õ1ù¡æèù7ûóÿäü¤1³ãßj5LS ND- œÆD¯eþ ¡ua;ÜŽ-jXeXÖLæ–ÆP«i_íë˯Œ6«™Ó,˜Ì§‘¹;7Ì–¸&qýQµ#~¤‚×ábî¬äz(· ²… ì¾í¾5J"E¿ì²õz1ßK¡Ïyߟ÷é2LJÉuyUÐgæòN1zfE\luÚ¸¸›AwÏÉôá t‘‚[¤6dæs§w©¤ÛJ]먀¦¬î ù0ä­Sv5² Ù[âÑ>“Ëåq⎑bf*öØ'¬í³ýë>â­6{ G5bj`óˆrù°æ"¤„òeaœ¢o©ûjÌ‘O%c,Á$FEEº1O_ikªÿ‹OõîgakGPZEÒÜ7¥ãŠ.‹Ro㿾ìmôì6j L6FÞŸ=} ¢1ÅŸ?‚e¿ì÷<¨‰b8 \§×ˆÁ¿97'=EÎÛàŽ½ûÉS"ÙéÌô3®kjFî£P‡%݉}yêšê´Ïí œXϾ⪠µöXŽD8ýf1µJ…Ž™ÙSàZz&^­eO92ÉÀF0r¢R«ú’JŒôÄB1߃ƚñ Xµ¯¦·~·YöÌÈaŒäÁœÖéVKŽðïãùn©ÍÄA¶ÝÓóä$é¾'ÎuØEØjßLú©Ä5'¹>Cm2b«(¡Ë'ë‰0Kµ¬²ôm®0doøÖ ¯Û¯«3:;È®MÐî$'Rbì<×do*Ü=d9Z#z‰ïޱ+AÖ™¹ÚjRD4Jk5Í?ábxuÁÇ]«Yúº 4©ÂÃYn¨39ëá.V_XUÖ›¿?“Hé•ì*pˆàB`?²lo¬ˆPÄ‚©EÅ@ãUüI|¬ðE>²{ÁØÃ•ybxùüÏÅ…oÍÛ™3hì79žóó /£à!þøÃ6û<½¹‰AëóêÃ>(ÆìŽ8r 6%µwÜbœF{“…öq•wtN?~í+ã ‰h àå_˜à*Žé¶qu£umËFÂÁ éd=¹ÝÕéM[;Ž »úÙçËÝc,cÎ^O*ƒê좄ÌX嵟Z®¢Ù¡ÁN“†‰+G¥`q›-þ‰yÁ¤^¸[‹ÀÙ’íÉͯ¯êØsÊrÉ•J¦CÑ!¿IÂ!`Ò§1^¶éXÜr_=·T…ÔÁ¶Öì¡«Ôe/¬l‡öcVp~]xê¶r²ÁüêŒ5ej¼|g<_œ²o°°v³á¤ý“¿ø3³—vµOFÜw")H9KD‘Üì¾#‚ýÍBê(‡iÚDÄ£ÝǨ cšq€@Üñ«o¿eÜŸŸ·ýºÌìßüô_Tï=¤b„“–’ ~`LÇܱ+avšÄ8†_ï•dMsða9ò2ö¶—€–™ÅCú:wµxAœ{È•‘”œ^Ž£Õ,woÿÝÇz÷>Âî#Vi²Ã&„-ÊŠæM4Ý`c³Àiü·Ë¨V¼ô|¡ç~a§ý¶{ÿÅ/g¿¹I¿äýÀ»?ð¨Þ¤àøí²¸}€:¥|Ú9Ñ~}-|8Ï.vª¿–ktŽ)Gó¦û¸÷¢q£9Ù”ƒôlç»ý™x?½|¼½?(â7:jp)è¹â×+÷rbýðöÁµe‡ÓiÖ?°>šÞ—ƒI«_* ‹Ö>y×ÎY4Û X3š_D³î«õ1Å4€Oîÿ›"è×éÎÛEÕìô6ÿNÚ¡«®ÓhD¢à ÷Ä~ûë'Òè®n€‹›%¡’µwwÃM7„$ j„²'e[¥RG§Ëq¥·½YÅN‡Æº¯ÀoŒë\U)’ú8všÔŸÅ~C‘29ïy3‚Ì£íÖË`·êë­`7'Û¤P¿^LÂæô½á µ&í®±´ÕRKÔ±8ãÃ\éÙÇØá­»2»‰ìîp-¦‡Ñ»Ñ»?6 )+äåÚ•,E´/å—|.×9öx0²©Æ[ª;ŸìMz¿›r«ÜÈ„:^1k$m`+»˜vÂEîãêýïþö?þd;~-E-?H¹ý[Z1²MÌ|„ËŒ Ý÷ˆÒN;œsúˆ½RSÌ¿]­¿hß#†ž¿ªt~ZaÉͬ0†™î \tÑ\S-†+19¢ÛÀ82îÈ«x:Ï@‡9<ÚTî·ñF £xµÛ¢úïòÝX,þ´6ƒ&|ò’V©R‚I‘F3×Ñ9ØçÙÈÖ§‰ºÁ@'I&=K&Ïz6ÜÑTO‚AÃÕ}cU6Ì:½Õ¸T'ªÝ`Û@“ÝÔÜ Æš{Í#ûÇ„˜>Íý¢1gëY¤ÌGQ+ÙÆM“ÔOÉ45?½·çöž£éw!€Eyã-¯¼2ص­§S´RÎ9÷Ôš­Ün¡û$ò!0Úƒ,2f_•ß ÅqÛ¹¿Ç2ÓnÜùoËQ‹·Ò9ý Æëj’R¼ Æò gÞ P·ÌÁ53GÄ« ‚9÷ÿÙnR¯.Æ}›§¡ß(á€N˜>{ V¶®€îuøî™fD]©n¥ëº®æpÕšL3ØýyG£sÊ,½½N w’W¸ 㮯«íÎÊÇ~UÐ{Þ@·ú&š¡O¯Nk놞¤WÖ'óô×¾¤ÉNãÚ2À£™Ì‹¿æ¾hùs ö²ŠÖ%!Ÿº7h:*X!Ö—ÛNM<ä­™Id²w­½¦Å†Ò/Ûîø¶u®úÎæfîÝ äo­…Ðwóާɦ&QïE²’ƒb¼É÷À”¦ƒ ®YêZ½¡JÿIÑCû‘"cÀÇ,z¨äiJõ®NxX½V;ÍGb®Šdév6õ6¤¯3Ú[DíXH ‚F’s‹&PÌ5a)ùí¾Ô5³¶³z‹gð) Ç‘²¸‘ïÐ/9€=Æ>[>·×¶¶£»{ØRj—À·cºÖ²¼ïg3š¾‹pÏé8Ííb¼¨ø…Æ•‘œŒeŸÓD|åqE5!)Öé‹3ߪsúàËGÔyÂ~ÀÖ+ãTõóøÍDzg°‹HN'Vô]Šÿ¿ ‚5|F×›JÿtŸç¾ÂDw÷SÀ3²Û€FŸ HàŒ>É7RŽ"ý®:‰ÅïU^Ý¥x«ÁM?ˆÏÁª¹|8³.(™\Ǥ° ²G:0æ[w=ÞG‘ N*ÑZËÙÄN¢7Cg]m&[-ºì]ö‚9Š¥ºÆ”È#Pé?ãSÒ33‰s7Ïy¡j| ÚßI/Ôƒ¡×Æ{F‡,zbzÉšÖéƒýÉŸÿù‘_þlqéÍÝu}ˆÀ·ecÏÇt£¡â‘uñ£r~ ®þ— Òæá:xçcKÚmXcÿD¸ƒwð¿üÅ·—ÿ›ŸþÏóhvÈxQ(gÓ…GåvãQá;x©þByƒ| VÎd†ª‘‡-~lÌPŸoYg¦ü›ó1r6S¼«Zy&<ì58"²$Dr"ÉhÆx}Y+þÛàBn3»'hOƒwo#Ò{i°;XÖzÈ×÷pŒ`ÞÁç!Ž½Ô½©ÎEÔÐÙwÆ+ìõñwäà¼{õ¿Ñfà÷-ØßU *¾,ܯ3€‘úùº@}9qàÚÑœ|¿ÀÅô8²„w2÷;>3©¿™´ñ4¬; G ¡TSoA KÛžÒí{¿ZtoMú”¥9Ïa¸¢žûIò1³lÈë˜ÂÌ8ŒZ…Ö‡·+Z¬¾Ñî#´Ý&³SÆÖýj,|5bN¤0uqag&AÛ`f@ä!FeEñ ò%±Ñ—«³ôøÑÃöœÃ~ œÌß}›!äàH4¤‘ªV¸Pàròö†¶D#‡YÜÌŽæHãqZóŒŽAOîL9zÎêÆ‹´¯Œ`ÁûÛ»Yõ´÷+ÁH 4«ÛÖv_U~9òôN©œÄ 敚¸óˆÜ*DßEe´oôID‹P€®öEËôùR|…) t `QS+7®,T6Ù'Ä[¤Aý ÍNá5ËÚ‡‚™ÚðP&¶3i¡Öže‰²–]?>8ÛÞó• Íù–È:,èéÖ³màäP(|J™ê„êÛœèfCÿï.a(;¬ý #KÞz òµqâ/ódìØv´µïÌ$ý›â,h âUŒ‘ Ôž©N€ •JÖÄ`¬œå ú¦÷k‹äc3Z^ó”%p¨G‰a ׿*€Óý\JX]ÙŸI2XÜ)î2,ÈF=nŽó 1F,eXäQÓáð˜æ ¡TqªPëô…³7_ÿ”¤;Û½ãŸ$=mý,aqþn x=iNÓôJÐŒ¸Ý=W¤ø-êuíjç‚éKr4ê9ýpÙrÔ¬ÿ·õÙ ˜“ÂI‘Æ/>Ìó R¹¤ Í=¨ë=Û "è^ÖÚ8ÞÐPvË©ì‚íi¦½‹8å¸üJi m颹O‘jN+sBÙð§Ee;–o¾…[ë—è¡Ë®ß¸VižÏ#†~[ »64%9ÿ¶NgR\P¹ý9Ÿ¬o0ÛMÛ.ìÙºÖÆØ”ýº1l6%¨)k]Mq3«\æËÆp·üNã›RZXζÉ?cºVŠ5ןí•ÓNidS}f$êRjmÃñºMÛÂÄÈlSo½3ʶ—™Ú ë·ÚZNO¹®tè7DÅ\ îѨ8ëDŧ<‘ÌÁ‹ h=‰:ÕOL²x0ÉÔÐW8°Ÿ"{´9•ÅÄ!T{šÞGܾñ}¾Dn}±VñB¬­WtŸä“:[Ðt××r5GBµŸháHžö„_=¨MVspp°Å&?#clD©½žŒ›’ºÏïæjvß}‡¬c~F³Å˜>`ÒˆLK'8öÀA‡ž§¼î¶$ò‹¿²£à:&ÃVŽŒÙmI¹ÏR—tîOº…ããµ1»äßô„ÃÅS*@9A:"Xå£fV2¾À³ }‰Cã­çÿÑ+Ki>ãVõ©Y­ºÈúÁ :áj½I£ÏŽ6,©±u}ø{…P/œQJ÷dYž6<îiu·€=î4‰ºN”ë`Ñy\Gùú× ÀçÍŒß PÓ…[-ªž%ÜÀMqŒÒŸ_åyØö‹¡FS³J¨Ú,µ‚2EÝ«£ª‹«ÜcýÄ?aRl²‡öfàÔ$¡ tdÛÈÛêÆa‘7a¨”øÒÂð”þý¡ *‰·‡eí¥Õ„³5W \Õ¾™9„-UrB6͎Ǫ— RÚ0ÿOqs2êæ£?‹ýÛäÿ›¡Êäü´ÔÍA›YVúÐgöÔ³” Ôù‰ÚÐTŽeMwYàaß‘¥ÛçÆ¸Þ»heÿk€ñ²“ܲ9¸úwÿèÏÿ'ýÐçË(¶e>'`ŸA’W3 Œûn†¯é>ïàbmím7‚ƒ¨w.`RÀý/ÅÍ^ßí¿ýéÿ2øÝ&J-rE‚Ž®^¼Œ&ÔðĿę‰Äs,-ÑûƒùŸUÞ,¿ÖTeL 7Ÿ&o<ä,‘êø÷Å‹ P¬Æ^‚þRÞ^·tªÿZêÍ'Ø Œ¸ƒµ¹jõ¿¾Y›x÷xXúŸS4>;”›fyø@øR¾ð´óû†_õ~è¾ï—’MÁèÎ IDATï<¯C¥ßÔ àû£|=*z3›\éÒåÎÿËŸ·Ãr^_„¥h¬7¨+Œâ!|HÉ_¼ÛE.b(çúY/Ò3À…s¦p:Ò¢üÛ³{ô9x•Óm³oNôš‹8à…îôjŒ/«µú:%üdbHÖÀÙ°ÐÐñîÛë`B/ ÓŠSÀç’ȳ¦´2þ¸’œ‰ò±Ï/tw-øf¨y°?ø¸Å¿Ì×þ®|$–FÝC"YmÂüÈÆ[¸óÞʤòèæAð®ÛÂTâ¹ËŒ–Kêƒù ¸ ¹tsŽ•«Z³nóÜ^ùyG& ’Ýï½õl¥‡Ýwp$ܱܪM°Ê Æ÷~À W« D‰Eî®-Á½íoƒiÄÀpP½Ž}Cy©à _KÐh.GhïóLãjM°tŸ¬ô—ñ7À@òÑWÃeU4Ûa1ÖëŽû.Xzë&¾ÚA5s¦Ô·çÜS·’§ÖÛÍsÈ0f0_OÎÆñú#Fèb…JšvyŒsÀƒ°–ÎŽ)?63þõÿ÷7ô“ßlêˆÑs.«:o¯1„ð^*ùd»Ù{@+2OQ+\/™)¨:鶴cNÝH0¬ÕÖ"§]ÅM_È•ŒÈmm¶M:XALɪ-R¦aŽtáνƒ…\`£:=½Îf¼ŒŒÞìaSI™È¢YY¯æY#Ó)E¬ºcÑ"ù`*èÆg=ТàöÒãWt ùÑmËíOÞ>ݪ,bd5>6ß$¶Ât¶ìQD£ˆ»´QIàe"Í/Gð3ª]âY~î9¯l³õŒ!{øšÅ¸WåoªS’VÇVP¶!ð)sìa²ffÝG¹Uk¼mÁ]pB/WÝ(÷øw^„î·²­ÆóOÝÛ¾l—mÙ]s̵ï:}Bb· ;"BZbhÿmÁúAb^ŒBÀD¢%DI¿T=ךÃóuí}ÝOÕ9U§Óuésªžç¾¯—½×^kÌ1~ÃKŒdv,°EC¿ñ&lÀ¹PyG‹Õé8ÔœK'†”™ë–YqÓÙ쯇QÊÒ #<.µÍdô:èp¢Pˆ¥VJÔjÍa–ß8—-æ4žÙXN|ÊŒV£ÃsÈÉ#»ÑýÕó&ª‚{Dƒ¶; «÷V¬Ñ-|Ì­¥5 ‰ÞˆìÍu[α²×]ó¡Ç|úæÇ»TêïMDdj²H¨†Ša$(·ÅRÈò1®…•𜽕Z˜íœÇ‰æ‘ñªdù¦àïh»æ§ÃiM§&°,`÷£0kŒGÞ\ß7çXKÂ߇ª“íÒ#ú!“Ièó‰°håÜœ%{Øq†©£ôðÇ$6¶6¿ŸÙ°À½cë{¡œ?|ÌŽÓŠÁ<=SrË!Ï7xØ=«°SXýJiõ¿gº±žŽ\ $£=}-ǰ&²•´8¾$&TN ÂÚí`jg(ÃÑkVøàX9ñV¾!p×× ÿÌ“ö2[Ø1¹N‚O4¹·ÍY™0¾ÃýÜå¶Ù±ø”ÍY¯&¦eeóôïþçÿÕYYd_^_Ì8 ŒÙäyòRlÊ6{½¾˜õ.±*šÝ0õYŸ½ ˜7ѤÝIù ºc̸éWVô¬o DþŸô÷{ÌÇÀOý|ÌW¢ìÍD‘<ú‡ôŽO4ä1ìé2€Ç·{`(,üF+籬˜Ú{cºŒRN}œÄj!óQþ0͵`&òêiSâa]ÈvóFÕsèc‹[dï±ëá´IL*^¡Š@þÛ¬äØ’»HL'¼c8‰«ä¨II߀2Rwž/hJu: §Ží^L)¬ãíç]nÀë?¤ý¬±Õ1æÙ°¦%Ž*®¤&4Y’â| Q£{ðâ“w‰K¯ýð:¬`TU×MŸÍ÷¤‹BèJÁÃ/²`xC–:Õ/uJÕÞ€lïä±ÃPQ¬è}œ®wì½Ç™Á9ÂÁb¤ç>]…WMú÷ ;=:¦Ç­|F¶ ½ÍÕ4Ÿmƒ JDw#"1cžë †"mýL½[unK_É7>T\%p6Ã41¥ú*>f€z‹^*GñJÿ@ƒKÕzH#}Ð"èlŸŒ9Jèãp°HLj2x–‘òôGnv–pÖÏ";ð•7ȯeX?œ#3AM#ÏŸ»<†ï}ȉ+_uÜÃçi(³„£ ‚Û ö¢™é¥W§ã{öPSÚQGÌꀮ3Ťܺ>9JtÁŠ‹ï¼!(³®ØêÌ?ÛÇ2[¢C(Øm_Vu­!*=lW™¸WËùL)Ú*«‘šJLlÝâ!&¶°dÁÌÌlïí¥ä.CÄ5n±Ìg›$Zl-J6I.éìù‹úÎSךßÕÿ í´¢Ù~ÜÀ˜l—FÊa«¿ß³§™]ºåfzPŽÎ©¥8+öÎj6Nßî›»«ÌºÖQ+îÚXÚüJG.JW=»1F†¾PU½–wÒ“<ݘ¬!xR«f«Oõ?³W)âåK÷[iwg‘Yšž>´Åºb®çê¿Ôö»çÇ¢¯˜”µ,*bÒyéBõÎ ç׃âòÐÒŠäÈÛÌÝý""ÜfPµm&£ª#"®øtBÔÌ´aÙTˆqô ›®¥éa®ŠÑ¨‹²Q8¼[ÐU¾,gã‡íYî««Ë-wÊL`ЃGQ[Ä¿2Òì´.w$e8«#Û§˜À*C Q„côžOßG€sžãôÊäò¤ª‰(`ô-$\í#øI…  _é=³Þ­š3ÎÆÐ(Kq6ˆgR®Â5çO½zXšªÊ[Õ1Þeæ¿Õ‘Ʀšq;öˆgØÅyk´’Tº X¨‘ÓœÝ 9 Ú›ÀØ!êé “Óä{({ÀpË]m<±'Hqx`o7éM È’OU¯ÀA+-šÈj0Žjªtö‹øð@$j¬a9sG£Í꣢rÓ«y̘‘ Á,õŽmóÇòÒÊåG^Ñk¢ý 2RÙ³ePî |´Eeq®&áž]aÉyømþù°µTååìãf2ÐÑßuîÖ­QX ä ŽLí«Ãü¨)À>jïz@ÃZ kÏ9Øëƒ­S;“¨Qã™zÇt뺯~õiãÌZq^­> ïYe¸Î#°«‘†ÏãyäSU§¼5Üf<%³#„4ó¢éãZ(@NõO- Ü&T§†zm³ïë Fˆ~À¡‹㭚6{Mn:ÞW/ß•^ì)À©ƒÜÓ$U*à ûw`úÆEe9ßQ…«¸¥dx°=ˆC=eôA÷ii/YrgB¤Ý'-ìþò&Ï[3—|´‹OïHÕ÷¾Ü§`iC9‘#¡ònœpÜ€‡x#­þ×þ½¿ö×¥Ø3Æ Ô¥ ,Õ½f¯>¥‡?›^"›{¿¬¤6ÇÌ'Eøqh"²qÛÝYg[vÔª ]ºTø'ÿoÏŸÞV0ä¸çÐ_o+ï‚Ã3osü9"­0dí7„#uLj)ç9lv<°^GéÃe|VXçt›ËìNpÔ Ï^õ:ÂÏXR#¿8g9 (WgÁiU„Tk¹,.Q?]^ —Ì€œåe·àC~ìKNzä£)Ö'uN@zVÀ‡ÏÿMîóé3oó§­øÆÆx”x^DòSæä‡â€p<Ùˆ·3€²çÎ|?ñ;ÏÌÁ)1·iäýãxÕ:Ú0{Ÿ9ܼLõ æ¾ÖV®ë¯Xb|ÛšJQE­šÖ[ÒÎͱ?̰¬æÇD1Ê*ç‰Æš[qu‡0¼Ý(©þÛÃR\ê¾³˜wT¦b*‡å÷E'°'µ¸¼5þÇl¸"ÊSó‰þù) Êàn¢f6v昳ૃ4|:Öúy „Å‘#´ï±U„²’T€iæ`ÂÆ9ÊÉ Û½ÿ†Öd ÆaÙF@µÃã¼XÈ*ø‡(b´¬ñɉ?霑L&¦´oKÕ´Õï‹ s–|#-§«wg Zá‘r½-¢ªÖ'° ÐMÑ=„`Gæ&¤M¤‰->xRMÛL_ªìJò嘱¢’EÐÎxûr rºj;ÀÊ‚ö¶™"f[°ÖâàbzˆÆóì¬\õSCXhÆ©)x‘¦„«!àÙgËn/“FùK«ï¤!£žl¦`u Üœ¹Õ꼯/¯o®½m~6!øLÐJY¢»ÒÚfÁmå ¾ÊQûD0ó4ì8ƒ„ÇÑ?I[Æ w‰­å§mb"F31PшV†=ÏÎAløœòû ´†°ÂKS0ÿCf„½D• :·ßD`€FVÁþ6/Çåa"XëCàbª'W®¥ Þl K±-ÛB²•É“+_=!êõs´ìo¬Þn½^B½à¿û?°£UÚG¡7V=n<ÀBUUD‹cÑ㥘üb2š¨=-àHÍ…8DänlGU—Ø“…ÀÔeKYíÎåñÖãzHìäjªùÃc ÑÃÀi”…~©ÝbëìTUq)|2?‰ã?c®ZgÚÿý¯æoS³ØœR¤ ¾^Û¢¸BëCH0Èü¥#ǬµÎB¢üÒ[keο\f…¤¯eénë3fæQ?O:КÜ3æeá©N+¡£üÅ#ËÙèÛ¢ü--< üỆ(UûHѵ£ZÃÍb6ì„“°Jjdâ´dßn;Êç‚Kü×ZZ1¯Ä11•ьގ£»I¨ažÞ3ÙEã‰]Éå‡ <Ö壭 :LcsÆÞÃuK¹¤u D°¹×b|6Šd súNX³o3)XÿªØœT†¸}ûìÑ)š‰_åÊŠÍrôj¦¶Sù¶,áîà WÜ¡Oç±P~/âµ–‡†GýæIªÅp9O·M¿;#ŸÔŠqœu0¬zý4•“}Dfx¾~9ÌU÷ ŒôÞŒçŸô÷Y+tiÞºfL@[3ˆàãã\l…È*‚-ôâæPîËM›}Ñîß@»QhVL1ÙŒVMO«ÔVü;¥ÌÝ6Ý^¨£*WéñŠÉÓˆZWŸ¦Xæ~Œþ¡Úµf5 ‰Eq̓ݰ¼•§c¶[ÓSVô¬Ü<ŠñÆïáhy˼ÓY•Ø}-Ç18ï¨C Òf܆J5ƒþnöp[pÆÓÉGVÌKÉ¥ô©ž2­¶µÕéEºÓÄÙDQÛhÀ4Žþ†œó+&$&æc>Š'†_‡mç4ñô7ijÃnrêÆÄ2›d´û¯ýkóýÂOg,4,>̯—³'b,t7ää õÈÃn˜ÿ¶ [v½@¼NõX{¦:rè=<ì!qd:>]›Üi'=?¯> í^€:%á¨XîÙì8 ™˜‰Ü0¨Æ⌄}Ê#ǽp÷6 Ãl©álºá[‰ðÉ89º2þý¿ö_[X|v À̤m%sÑC´¾½¾ÖùX´½_{ǹ€Á$\Úæ6r-U¬tDŒËÆ‚[Ûȯà¨i^÷o*GÛPBùçÿëß)ËÜÁó™N¨ýЍò]1ïßË, <\ò㟤 =xo˜½òÑ ßJ¢=ÆŸäE0(ˆ›U—ÅMóÈ3"52“½zœÃÞDªñn{-S·§”6OŠl¢ºvb%ÛÖ Znì0×ó)»Œ•é «ËÖ 7Umzhü[¾Žjîú®pŸnÿëüÅI€|^Ûû'à9Gãé¿ÍdÔGÊ ­Ü¾Ž·í¯Ï?àØã.á}7žèG¡à}§ðó¿Ý†ã…ÆEja“Kçâ¶´ÿÍÑ”s£uªð ¶­º†W9¦4ê4•5=AÂY¬1n˦–3èîñ0Ù{-¦!Bhîg5ލSí±ÆÎ‘½Û»'ÀpÊ÷j‘óæ¨åa¡<§À?{Еškºý€å²°ª&±$^Î2œ:$jDeŽ¨ÈÆœ±¢öw\Kà6;eF**+Þ5ë:¡´í—Ÿ°n=\æØ)\iK! ¨Fë˜ ¨ªÑÍ?½Æ™]í{Ç( P— £ºK+ŒÛ¨ˆénähÿ <€¥ ™%Þ:GšTõ÷a2IîÌFg³lª—ó¬.{º“|ø`C@‚*ùâËÒF¹à[7µê4ª¤a¥°TÀµyþz¦Š@¹™*5䇌Х~Ò´(wÇeóí™±:x’(³§«ëŒV(„AŽî³üòz}ó‹_¤K–³¼Ó_|1GlÜ|9òÒMŽ6Ì0.Á{xÈs F£M»¿³jIM'kw5ÔñAŒ6©Eßÿ¬^ÕíÿD‰ÑWÌ2Êäºb’Ž‹ áÝiR‹²±P£b‘äÞ²³ª·QHB%l^*/ûòò>à™‰æyü«†¶Ÿ ½ÉŸ‡8礤5XÚƒ/ÕZ¬#øU8Zàpô "Jì6ú¤‘Î:äce•û“&DŸd´›häÐF”©Øö80÷(F¯*꟤w›õ¤³ð,'nxbÝ+ŽFW‰eʦ~Åç›L‚{©¨z+A ±Ç(kõ™D„þ0ÕyÍÊVHw{úüWª’ S¹ÅÌÉl›ˆ(¨KSæëS@3ô¿Áa[zž¹H;ξìŠç|å´rŒl=ÞeÕ¹*‘SÕ¥vM¤Ù–å'œ¥ l]¶À—0Þ늪"s¤}¤£ð®Î[¸šf]DÔß « yy¨Â3 >ÆÖå™0Èן4(VÏddŽîA¡lÛZH¥Ñ™¯±/ILD¼$6àÔÚ¹)"ü5&_Éê4æl¯¾Í<ÝçµòÑ$Ù9x$#ËUýœÓb¢¿C49\…Rà6,5¨)˰-S¢²æ$ÌnSª8-]êGœ3ÆÀ©0ޣõ~°C•R9’!ÉAD6MãrgòÚIe¯Ì¢d‚ÜåBˆgf0ÎéIÁ‚Ü^R€ÀÉ[J[‡³´›/*º;Ñ¢µ–ç/=¤â#+o÷qÖ Ñ™ñó¾9Ë»àåGcazBæn[Fºr’çça·#Bg¾¨WõÙäé…d ‘åó ¢sŽ"£ÓFªn®Ã2è~ó2ÁLxªÅ°‚2ÎáTÄÖedÜýVÉqUSyó¢I¡•KCqÇr`nGæQή»QƒRÓÓÁv•Û…Tè ›çœ'ý|Uä-wËÃÍ:†ÆcÀq«åÑ‘Lõ]æ¥!ÀoRi±áj´dUItx'~¿¸ùÕ2ÒWjèWñ .¬Žv†]Šá嘾¢ùmnoFj>ªAœŽMTÔd›x;vb,[ È}nÆÊ„n€ðR2¶3ø´1è£#£’oÏÇÉ*¶1ÌBË¢#‡x¸÷Ùëõ|È›úŸR÷PÿßYâ{5ÀQ3ÇAkEέý€ÜÉrÿÕt­¹—g,sè‡EUµ >j=Òu¸-€´LMƒìIWÃ{€‚‰“r’³®C rŒTîY¯±@ÿåÿâ÷«Jxu-ºý‡\q¬ìÒ¼îÜŖ段ëZßè7_^_¶í¢‘-…M^~ƒ|\WõX¥~Ç:fQµ«ßŠ8Fr‡ÇZ¦*ÿìüݱ»)™Œo=çZ4Ø?Ćϫ5î߉ŒÕa…G6Yöæ1%j¸s瞌šzÜÄnÂäLFõ@Î{CÀ‰Ì˜,ìJ9o|L @¿í]ãºÑóÞß§·vÄrÛ¨ùðlžµ³áODE5 lú¦ìþ½5Ȧï;<’Õo[/ð öÀ›¿ð§"ð«Ž"ðUÍþ78øž?”›.ÞU÷ãßgÜ´þÇŸ|0zžYÕ3Uð+Ž`Öaœ9üv¿ý^ÐÀ€i4ýìÚ¤>TGŒ€£³u02¨T‰PýðlNÎà,ïA41"Ê넲“†hQ\чþlò'gÐ<Pš‰Þ*3ô¯ªQ3$n½ÎÈ…º˜IÖA©ÅÑë;¦ÌÊÖvëû;âîïÇ9Ù{ yßìk~6c€ ©ÂY ù#ñÝÄÇ$@5 {A­p«®i„÷-£z±­:1ê®}wY΂ˆ„»1X µ®Ê¨AeG¥c°œ¼ØÙ¹%!º€—» Ud÷|W£ª(ñb…‹kçF?W%, Ñ÷İ‹ò~&V„³:ffï—I¹Õ{åf¿=‚¾Õ*ÜS…¬&m§e„ò,¿&U€ _ºøBì09±ÅÚ¥à^IrHuU,öf…ìvC6¢€u¼É&ÃéLêf&©ø‡RÌdét 5¬ûà0›‰ˆQ Ð"Í(ÅÖ×0B“eÖñˆˆ|ûÝwæ¿U]’FVc†£MnsˆG#ÎŽåt^&í¨÷­q÷©€Ä½c/Û6r}¯¾Ötr‹¢Švi¦k…>cÙ#9 Qz߇¥.þ%_f«ûÙY q©B\Îc–Qœ.¸åÜrU@4p0Áâ YH–&hÐ8:üà·4œÃÛÙ±™ ðvɆQÍ@ñò!%ºêÎK»wm<ö,–‰U™Iz“¾=F¼¤:üÆ¢k V=¡·†´@²(;ŸësHv1"Š1^$î8`òVT•D á Ïôƒ./, Ûæ¹÷m˼”žXSЪ+1·c3·6i)[bõ•Çw¬Êa¼¼~’Ü~-E”[CKËÉ, ª}ôà¤qË´o"Òfªáb¾ñY‘‡ãÅ ¶Rˆì“Rdy# ͤ©“âæg^Q3AÜ–¹c–fþÌs³p-Œþõja²\T6;ßê¿#`Ä‚9úå;¬o×Íÿ.—.FîA«¢ƒu9̳F0ØZXaÜñ5™aé¨6‹^&DâMÛvõh]¹˜A=½×vz ç®:׫l8û’øTŸR;?2ÔTƪStûz¢êÀ;¥Ýx—ã€6³n^ßsa¨ã‡•SÓ§5ù Žä ±!(úÔ¥m-Ô#v,è kíñ™Fd„©åN>ôt “ Y LŠçòÖBÀ¯¡“u„C¶ªdî{æÈ3@7-d¸âssàÞcä©jABýºÑh\]ˆÅø+i®Ì>{AÿrQA"‹+Æ4"×sÙ1Ü oŠîÒõä (X ”äÅ•ã¼#5ž43‹*J–™ƒkÒ“Ýð¼ïcwœ3Â=|a½ÖzˆJÐDÏüNMs7ù]¤úš3wI|;»u\*5ÁƒøŸêÌÙ<䲊ÞÞü²%ïØœÕ±¬{<áMTœ·(GÞÞ±„3¡_ÒrÅ Ž„Ntßjb!KýQžEáÞ9»òÓô]'EÌJœC¤jß_TD ‡º5£5~gÊ ¾â‚kRç6_wù‚é+jU•¤ý¡ŠßºµHÿAöÃóìÜ0ؼeý[Ÿxû£}êT“Øû–в W»? SÖÀYì ¶y#žAJ)Jÿ&æN1ý4ÌK£_g=Š N£Ä2Ü®ËÊ Äch³N+:î«Ì´Q$¯òª]嬰ŸÑªó¬y`³¸?úi„½ç1p×£þòïý¾ß +–??™¯@|ùYÅTÃÅÒ§„:äkÂ%öüy½^föÚ{‡Ä+ê ä"€¾ì¥"l‹ÆØîútd›Ò„àúøöŸÿÃÿ9E1=àrrŸ>Ës€»‚þ`fߤ¢›Œ|mŸôYöD~ÌÒròk*n‰šÇȦ9|ãÚ¾Ó0»v;ÝpÛé¼—ÃqìÍ>Ç_PºÞ|¥âaY~"=nÉ4¹DǸ’Nc'Ý:ö˜1aMhûJ[òuq‡/j4Ý|¯4^­ZGØÿ‡(å7ðÌóû fž˜ò¯´˜þ*?Ç4é'&àg^¾´º¹~Þü¹£]cÀù?oÓ‚áBhÒ•œt þ+³çf?Bÿí‹?"¸]'u®Œn.`<¶3åwâšhq{Täu8¢GÁtP«¢Ï øDÖÕ@1`‰%áçÀÓç­Cj?ùâhé,– €dîõ,P‰ã©KÍdé$iÝБ;W}æv8‘Ë”‘iÅ‚L«˜UFîò+ f3ÈË¥âDVðµýW%­Ä_e›QIÇ ×õ.¡ˆáHdÁÚ $£–Ö-¨bâÎMÒvúuÛ®u/9”#8cÁ'ë!)c§'}Ù :•n;H2:bKä'œ‡²LçûÓPeùhcJê«¡ ãuõóF0ð:}Þõö®j‡„ÝxçØ2¡²e¦¬ +»<’£¼dvuPõ$+ IDAT»)88¬£—;9m&²*dlÑUÒ9.žv1h»sêà©r;…ÔŠå Ä~ûí7×*ƆÍMEë~PµtV8p`ejµ!2.s¡ËEraeT5/>¯Ò»­o-Õ¯ ‡‘Š›„1:5™ÔúâüMúg˜'8ñ¶·¤‹˜Y•ø*¤{ rm5Ê‚ÆöÔ\ùM›#‹Ä"ƒËxû±ÛFÊu AÛN›Q︜´«f$Óçn¬tÌ` +*׿réuŒèTÁåìî£ðÛ²†CZ~•ÎsÉ6"ƒàQ¾Î²€1ryPÄÌÖR&×Õ mˆUEŽæŸQ ÝL\dY9[ì›&ŸœÊà ªå‡ªâÚ¾CÒQÃN«hWV0®|JÁµ`³ÎÂ×—‰R¹ÂÍà«k% ´ꀲF^íKkI<n]lÓ8©I”,„a3‹ˆÀìKP=&@R$›è"a³ \×u#,Œ§–*l»GÏ’×xý.šmR”ŠU³Q‚òpúTåtól 3­žõ)¡ªÈ„ÅsáPF¦ª^ì´±‘Üû¥kYkÊgY/ ¡hƒ_õtSpN&•z‹˜˜ûË%Ý“EëôÆÞ@(žÐÓÁ—Smñ´šÁ=Ià´DÁeãC'yb¦0:‰ˆÓ#ô?l£ƒÁ\˳`± $ˆ”s|,"Q\ì/èÞúK¥ÕÕ|F3÷í½¸#˜fêFl˜î qÄÏÀAŠF1OBjçHК1Ò™’I ²ÅêfÅÆJ»õÙB5“ÃÑí6„#oXó n²c.¢Eã#-w]êͳ…áyÈÔs ì|ÈñÄ7K9dbOnûcìXG=9rº ÷‘ŠW¥eðK]²F7–ö_·±[‡öwåîغ‰‡é6÷)6ò3âÃÚSËè $‹{ºFØkKmGý`¸-gÕ¹¹ÓƒXË~eˆŠ¥©Ê1mòígð"K·‰eÅîæ}žé2ý³Dñ†VõFóøJñï(¼q4WmYs9¹ÅûoÑ(¾Oµõ‰M+/MMçÇ‘qh´LÞŸÙ­ySã:–»÷¼îFwšvVd †Ùæ>*¾ÍK¿ºÁÙÙýQ/ÁtdXx¹kÐ0*(¬Ú8XöŽÏaíˆá·ñùÁ[°¾Ü(–B¢äúã¹|ÀTÿNvf´úP¢ãÐŽ†Dáøª;º7ÀîÉèwfÚº¤pXË3Ñ\ùúí⩪±ŠcÓ±ÏKt`vQõ^¥@ãó+Á3‡i¥5žÎýžó‹Ï|Ïé÷þºïq}s-Ýf&m AnÈòalF  JÛJKò©jLÇ꺘ìÈHG\kuz›7[FñF=Ôc÷>ÄרÕûŽe›9˜kÍ›«²æÿú‡¯$•CÒƒÞ Üó1J3Ð’`H’£P*@VÎ_ Gûûp3Ã-ùÌ‹Úo2 ôŸsrg…‘ŒçV! ö†.9½à½G=˜fr_â>Ñ÷žÿ’ÏÊ ³ôc„ø¤øó§ýo è©ÿÔVç“$Ï1‡›çáô‹ôs %ýG¯Ù9¸«æ§ ´ƒÌç«»NJÔ7-É»¹›ÇÏ~á|l†©ët{Ÿå¤ë”¶'d?~[Éœ°q|>˜¶}‘ꎑxA?†-¯NÇ~„dµ:žÁgÊP¦v¥6ŠPôÌHŒ˜szc/RÖÉž¤ÄN|Ô OL?R%k@Ë@–³òŸ&ILô¾’ã=¿éqOýœK€Í²bªò~qQe•¦rýËï^8™GÙ…:ÿm—ö|S:Ž.ßLC(r­pcé6S`©õ©? m“#k?Ì#ÆO‰ÅiŒE,6¡”eñð³I#TÍðÚVÕžQaêÞ›Ihda¨aOÎŒ{öû™| ÉeÀX(Þ­–’ë †­2ÙÈÖX+l­’HÛP2Jœ\´ü<A­YAîg“sâPðJ1G>¤‰‚²[B~o–nEƒˆ1ž‡• Sâé=ôÿ~¿……:‡tSd"ëpnYJëüöõúè`KzÍiÇYbw­lõü’£S%4×Q—TØDuóW˜¯! FË‘踣{Õ™RæËØŠ¤úƈ3 ù\ Íd.W¡V¸gƒ»iÜáò/>‚EÉj¡²r“ e!¬Ü´½EÛVâF³—pòõágV®kurZcªqÁ‡Ô³rz!‚íÑ“èVCx¼‡q©”P\+í¬Ák‚Ô ª`!=Iñ>DÈú°±‹jât¯LAšúZ?ûü“×Tß²C¸£Ê¨nIŸ DÌ%{~˜Á×»['¿¾ìÑ…y‚6¤«µŸ#²'yÒSÏXÖÌ&e9µÊíÍàˆNÑè>3tä˜ÞXËc{4¬ÆÏ‰iìÃhµÃ`D>™tˆCU§O¼ïB /nœÆ|Åß’¥ Skö„Ù¶îÅÁ ´3ê‚ ¾m¬ÆœžÛ§ÄqÇ÷—CÁ·ëZØ[v* È^_Ç¿q­ùŒ+–]«çåb¼u{ª‘¼×¥ kº©¯AgŸËÈÞ9 ’Ä…4“LVL‘½‚«ù†Ñ‰póe™H†:æ05ðæH®W\¬k%9`êÕ¿Ùªñl½A¸£µÙ¨N ]•R4j¨KÑD_]‡±´õšY=-K„ Jj1{þ:þ¡ßÚæ¯ø˜4rŒ$Y˜AÑ&ˆ£AÓ& ¢+úÉQY€§TןÓ{Ë3Ïx^w‡ :ÿ»ê½B‹ö;Röo6ccu yµjn²1@È(é Þ´f2Á‘‰”h¬YK¹ -¥TÞÙtzÔÁUoٵ𘱖ü¦ ˆ F$›K<úr+í¬Y}T.¤ßâ¨cɰX¬*Y3²SÉcê;‹˜Û•àĸ-`€ÂkÛWZ$ådi°}3§ø%K¸óbÐ!¬†ßàG¬èÔ‘¬¢™¬x”?5êüFL¨Î”È÷Ì;\»* q#nº8“Ò¶y›{Ô›ErÜðwÎYϾà_@Ðhy»ëS픨ÏTBN!ÎS;bæÉ—mñÉx˜%÷ru7†z`5´c^Ú¿¼@1=#Ãðž^ ⻵cF®†7(çmx;.Þ°~$±•>NY[Ú¦£¼…$z¬Æ ˜2.Y•Ñ‚ æ$á/g #¥¥XÃÚ9‚ά!?£W(]Tiß¶-´M¡ªÖµÁŒÏçÅ[ôûSKªýlÏVôKžö&9èç÷aÀ$”úwõoÿg¿_}% ã! ‡qIzD‰(.‚¸HÛ $=Ó£`fLJœ¦ë¾~ u]þ¥x¿—ÀbŸuDdý-3F]ïk{ÖóŸý/;Zqr¿ A¾šÒ@ƒGä!wGÆèXG«?÷|?ÁÐCHªª,ºÓì¯Ç¾ëÄ1âìMÏ$òi ÍíÁòä_Žå¼[XÇ]Hœ±‚É…Ät[|GÕæA8Yaum†¡‹2­ösÂÅT@Ĩùù„ÏNGÂ>ŸeUIœÓL¼‰xðÈŽ'*þ3MûÈMâ'­ø ŽüqÜZ ~ ‡þƒ}ÿ|x„îÌ•9Ç×2'7}lÎøÀ¼ £nxïŠ?ŒÉ÷ŠàQ@–Ò¼:sº0%÷>r/ 8ª²܇áljW¦Ç,»7:NÔ[¨ž¿’Tÿêð”àè à-X—ü’î캕WЃzCÏYˆY¥ÈFQkG…FGmYýñ•OèòÞð*ô'87'³œ¹§53q_óßæT(o®À?­€<®Òh/ƒ˜poªráw¾¹tùéÐöæ~alÓëÈ5·ø‘ĘG.+ÆPÝÜL èÛåª0< EŠ)y0ÊÙµ04YlÕH·Œ>ÓÞz`Æýr×+¨IuV9¶ùàÞéÓêÕbO”²gÔrÉ8Ö6¼0¬%ö “iùTCŸ›ä.×VÉÞ›0qÏÐz‚Yù†*¥ž„lŒGk{cŠ‹?mn-|z•¤-?éXì™7öº4OãÍîËÛ‡/Q#)ÂaŠ­:+Pf]GH/VHDž‡™=ÒËè/*š÷Úr!³*`JSà·¶?ÜWÜk“ä¶ {v*{LBYA‡rxËcF\ Žmé"Õö@X-g7ý`ÂÀÛ5\÷FM~ÊáEËI‹Ó’MÉSŸd•¯DŸDÊ ü€Í'¿¯1zà G  ff²ÝwëMa=±3“n+„Ñ|Ÿ¦!w¦7k¶T=,ogÏrX„Š‘á SúÏP†VomN/ܤCS‹ùá÷céæ³Ö.«ÀBRÕæ ÕÂ)ý¢Úø—_;†Í¨ã¬œÔ.t©Ö8j(Oµ Š#S ÷8ã9|PU·J¬Œ«Á¸°Ã&V¤â°m1_0zk¦r›è1kà°ù°¸NÃ9ušÊ˜‡·¢µÔ&DUUW1ÿÍèW7†ò%t’¢:2p߃ç^Q#~é)ÅêØ!bI9^¬f£@Ú÷H¸ÄlS±TËj(•ÆnËdRöæ¶½FôÙMQÞ¾î£03«c­øF8L§¾ÉÓéì™Òü†|Їa&1ƒ‡q8ν2K÷?Wß ¬Ÿ!R ¢D8†õÓ¤àâˆg)GÕJÊÅ–ˆf¹-P¨a#[:’éÆÍˆ‡fh¦í†m„µÊød>ˆ™HÞ‚f“µìè®X=ÛˆP¤ÕÊ`][Œ¬OØ`Ö¹žÛäÎ1Mâ}WÓeS`GØí°>ºŒÔúa´||z˜¢ÚOŒ 1hmP!µ`y/ãë[!µuÑÄúb[]®¬Üc5À–ë¶ 0˜†]3Ššƒ¦ÚÏw< ,˜MRÁ=Êù³%R†ÞŸQØÛð¼¶²7}µz1úµ1a,[ÿ¶kqA˜‰¶P3¢¹4ÅÖ4Áe ZÜݧ/Nòh/—OÈo.ƒÏÚ nÈ÷1ÀOfÿÇ'$z~¿þÇÌÞ¡vøþ_þDQ€78 ³é·Íï(Æövn‘>›Ìƒ¹Ì·Å'H00ç”ìcÌØ ½Ê=–˜´">zq&YÏíŠÄ(G˜¤¯Òͤ˜Ä¾Æwé%YñX©ÂCCìW½ªÞ܇GžrÖìïÔŠÕŽ\yÔåäƒél¡Jº†#㽉îü²_ \kÅ QO8¬ÊB‘Íö'~¯{`Ú3€IÒ”b©WùÅaÍÿ/Jïûç7ø§;OïÎ dåÉœ‰Ä¸ÁâÏm|?eÚ±“*”ÌzÀlÏðæ…ƒV§E7¹‚Åm"+éKbKQB¹£™gr¢ß8 ÆÃÉÜŸ‘og2G]ec<}%AuœcàN9Ny’Ð&—`èn¹j©.÷“R¢PÀ X}®h”@6ûÖÁN‡ÃßëÕóUˆ0 ÒÇKé§ämÁÊ>§ú¯á¯WĨ`zzFü¿Ö‹ëÙmW:`O'WʵªxJ«ÖµÃº?ªEhmrMòî*¦2*jpGúôØ(æìOç×QW.{zƒDD…âÎíÛA”jŽV“Œa©V¢çÐ7Ô人C´[_뫹¡Z§Ë¢|CT#BôÚéCò¨Ìso¨¾âUJnx(=£ÊBÚÊ&l)z©?F{°—ªUÉ%9'qQ49csZ,ÓvŸ¯½¿iëfÍdYß(x”Ãæ+bôí‰eŒ«ÿµ\!¡bÝÐTæÀO+ˆ”u.²2i#ò›Ê®¨‡QJ!ržÓô$<ñ ¹cÖÃßÌ[ r˜mŒ³ž_:î2IšÉFs°V^6 ÄðF³²X=£¸o5AÃX ÝW\µaŸ‚èBH‚Mé° qÁÊSA?"q…ôèjÜßMEªªç?ÿÿb1FºîÕ"p Q¬¯º¥BK¶É á9¢'ƒq’6ÁD­8¬Œ¯9ïb Ö  ›&tp‘\þªïjEéÞµøOÿÎßädJÔ¹J¢º2 Çò’Ô>õø3ôéÜêø¿×-|Fÿ÷C§>{°$ ¯R%¢âŒÍvËAò¹¿<¼)­É‰Š+íÿFêqI'ÌdxnŸ¸¢ ÁxÞjEk§rrÄI¥?¤'e8æ¶aãDÀZÞN·E¥Ý@1é;½ãËnCþ.ÏUJÿ òÙ¨áhäù1¿º¿Ñ7¦}þÄ’'?Éœoá&Üçö¨gïÊv»‡·wî)‹<ÜY¿þ.š;²7±yÇÈúôã)[í„q4N¨GÂæºÎ@[¨r¡ÔÓ¸i!,qmé! ¯x‹€å^•½`äSs#•X‡w`o₇3Tp¡Y~2NAG¤™¥à›•Ør€B÷ùa–:%1X{,Ã-Ax®È@ŸFÅ8¦ìøºôÏŸ/èª6*…¨™K/]Wº²–p»ËWI#̸ƒi¬F©ºT•f_¾ì%|eA®‰äN4ûêh~и¬vfýälRÁcÌT¶/m~Iáo½Ð/HCØËLz}vGcÖæQ×ìÊÁ<“ðí/ÄX T÷ó§äùS©Àî­užg‡Ž‘·«àoZŽV¬ÈTµrÞêí",Óô£X o~PípÀ=%ï!ÓÓY+O2r7Ueþ×ݸ¿OâDcvFôBÈ/_^Wšœ]䔩C³ÐŒ)tKÖgJ>±xsþw¢2K¬¸#h?ZA`iÏœ}hþïU}Úë;j=šøª—ÏÒÓá–j£C›³åÐ=eQº*èÕ–7œ MtŽã>%%éu52»Á.NzÒ(îœ-TÁn4Û¡‹œUï² *â­Ðô°3\ÃJ®À(Äåæ á&õ>¸Ïb;Pì‰V×^W†jØúS0Œ”úˆ'Õg?ó±5ºK,hBdºÕcpÉ p½Üi’‘:в,ü8ýf©¿÷ãu› Ç"5ØÈ*ïsN5,°Hª ¨¨ª.…@¶í¤P+)ÛÂótìæV~Af]^hÎG._dLŽUÛ4”ý8 ŠÔö?`­¥€ÙÎk@iÞg Ëÿl'Ê5>UGH"‚"¶ÍïkãÏ5Ñ9NU…¹ÑnC†DŽ~µ¤’¤mseêQ ßÙQ'{Ë•‚Ñà>= FŒÑaH¾ø«ºŽPe™8|[ªeÞGªEøᶸm.ÐcÒ>è=}­V¹j³?"–-•­¢¤ ß.ëB¦W}pix·”ÞYÛ1–Ôb.k~[ù{&å¨MôÑ‘äz™G>Ù’u‰ð»Ì¤yg;Zã@¾ØÃ? ]­žQãóKÍ+9+ž-FöÑ’íå2AÛ0˜©¸h]û1OKeøæ–ž»`í^lfá*n/¤ÎØÉZ‹èy_FYB"O~‘$J rWÎ|ص¤¤SÜÆïa‰‚üx7€Í:úDiÍæ/œ¢5Hm{2M` Œ›³òþ¦R.‰ ú3PŒ;™ù0Wpª¿h©Ù2TE®PuVd1ÿ‡UÚF:ý„ü´{zp±¢ç¢Ä«#…#'ɪc;uýjÝéØq^¦ïPÞ6²VF‡·›rˆ*6`<Ý–uëÛ »†ýv¤3EŸ%Pª:‡4„fJ:h¨ øz‰ªQ°$Jîq„cÈÄQOke$žmcï¥Y`gËÚ€xKWü=¾¦çÔ‡Ï&þtc¼€Q4ëÚ}Tô9°ffÛ¶+Â&â^‚ÄN¬µ®Å×~}·EäC —,ăr¿^,Óд¡ÅÖ Í‹Òg-ÙÎ9wUÏ…˜s?’@ÕŽ±rÇf7¥¯L!„Qlû׺"¦¹- âà‹‡uDè×·å¶?$¼6+ä X„™ú¹Ù[Äjƒ|(æ)¤lÿ;|ØtüÊmcÅ\ÐÍMRö¶9‹sëGª²‘¼›¥› 3ò®?UͤLçn2Bü>Þy‡úአMÁu]E1p+OÃŽ–wVµ`¨èn T­W`-öþ}²úÇncæç«?Õ¿¥_7…µ£ üòå»ëƒeúÄñˆ;ÏŽž³—ÜÓ÷¬†ó”ÇFäÓBåp³§U¨Úð& E–Sž Õè*ˆ`¸4q=~T »›~怦#f63CaFij!~µ§¬; Ü¡·’¢ * ÂwiF¹&§9Òë«JCÈ:ÉJí ~mo IDATCšÿó_ŸCéìœ>¦Ä&‘™àèÇ&ÈS(ÐÔ|0‘1å·aíZb’5pÝà6ýId%ÊûWåË]”œ&½šÛüéŠ']¡~ n”PŸ&é”:•ÈÌÕA£.¯ºš†ÁÔ2軯‰Õ¬ ˆ.]!õ¦+‹r¹l0J)êv…zÈ«[ý,e$ÊST•£ƒ¡¼G¡QãRõz9~I˜»×÷§ò?k­¥:iûª\°½p’è­¢dq>¸ÃyUA3…l)6±ÝôM‘„ß:š{™GUÕó_€ŠìœKøË[ª*²CºdÕIž^*S'Y(Ê­oùM¡­UÐÕñ^¦ò¾ò ÕŒ)HU¿kÒϰ IÛ"´mæº|4§øŸwË@ÚçÑâohÎì³ç¹gjGqÍób4‚Gèw,¸ªQê.í/¥‘¢>ÑoVÿX¯Q³E'a;í"nù±‘1É3'L&ò8µ7(Ô’T…„çÏsréšTø˜ŽÑ=^ŸŽã©šÛI46>.¸«£ƒQi4µZN!BÛô§m¢¡þæÈQƒqšôHFY"çPöP÷þÍ@ŽztÛ™¨$‡E_¨ÿ•è@–§ÏqxhúQŒã1õ>÷ò¶fãg¸Ò ï^7¬¨åÜnõÝŒ€`F.ç?iš¹É×—/Üæ|73;¶´¤|ùš\k-U])›0†µoHUÀ%>FŠ+ØÆf7©…Ö–M,ºÄh¡ŸEZ¤wQŠÈÓѨ¹ aAÖ%$÷Ÿ¢\Óƒ"Ù3…w9€š1ÂJGp\Ÿ+à:æäê‘Çpºù4U[£(ͼ.2 £Bõ­&R‘©mSi”»Z>ü0)#€ûà6->¹Ç‰ˆŸ’/£¬¬ ÐV¤¿Šf¢ ZÌ‘|% æ ªùÌVfÊ72ƒË^¡Œ0ï•Û‡ÍÙ¡à±.ž›»n2;wAE7™ðkåäâ¨ÓÓ”V÷âþ£ñb᜞'ˆÚ&jn¶QõØH¥—®\¢”á„—Jp4 MÍqf¼|"¥ÄŽÆ·­ LlœÓ‡1°Ns³³’Ü@`ªt%D†$¬¢>p5/íÃ¥Ë i0ül„lªº¼ÂB;@m®!*ñrº‚™Û“´Þ9ªÿ›Eã‡h’nOVÝœ…o·WTlnp¿¦ŸŽü¼SEycK¼F¾5½¾]*S6mW_œ«m ²g½²w|Úb ËÀº»@‘1¾GqOßS•ä ó§êÊQH ʺàÑí !àcŽ£4Ò¿™ £¬½»ðÓ—bëbTÍzò‘5 Y»Êæ¥Z>æµW¿Ãð$]t(˜YÉü;Ô¢ÙÖz‘Ò~`Qhi‚ÈnNCµŒ”’/¾H±½u-±–k-i½(€o!Ùo—G7Yr†‡¾Öq&P±Å¾Qÿœ”4õÁ E{?3ùeU‡Õ„!s\Ôyš¬ƒEh¯×Þ´,…€ ÖRUMDƒ´¼AyB‰›ldF¬¢F 1œ.ot'xŠ?¬ §jâÅ*U[ŽäQ9vä&ª‡‰0®4v¿ÌVš¤J†ì4ÛôXáQ¿ß+Š¢¦ÊF‘X" w ³‰š0Ç7Vèv¨ûwßµ›ºÒå<=WMŒËyQíåVSÕÃd©°ÖœËe?fq­4­"+)ÖI΢+’C_žÊÔŽû‘Ü q©j¶”ptž÷ÊË£Ö3L‰`I•.ÎN6Æ©Pƶ·† ¢å9ùGÁ„:V´kÕ|m1vÕ°Äšëô¯¾€!CÍ¢qYË÷ß‹ýZ«ÉQÙ9». JÚ¹h`=ÄZ‰õ–<¿ÕO˜æÁ—]~Y­þ#Cd}Ç{%Ñò䨗‰Ïé6zÅ¡ôb¦ãz_1j ”½‡›TÄ¥¾y±Ñ ’ã'ƒ¨.-0j*LëO¸ nþþ¿ô6 ”ê…Šp`Ž/ÛŠ…æxaÛV\X×¥ã cªç¹A]Q±ò ²–ïloDáCì¥ü_¸ßoÉõ+ÃùA™ Íä"²ýBÊÔ OIšÿÛßüï ˜(ßðÃÎPTî+B]ã«GªÌ 7ëñõVƒ™ _]hvèíÔ8¾ügö빸çd¿GÂ}þ:Þ3c€6 x7FO«qõ;Ž”ýmý1®–÷G-t£ø¾lß•gÑpXܲ޲“¶^ðgÄ“×%­´ân:H>F.õø­½Íhܾ¾&Gw‰ˆí½®•Æ­aÇ+Æ}‘¬qÿžîø‘âø{–ÂW“?^£,ëD>©¾æízýñoóm%Þÿ“óEd€M*Ä[ÿm¬“sz|ím¡Ì5Ï1¶F(¬N1añØÏlÀ–lÔ9Ú®c¿Øb¦N¥ï“âù.="Y*.÷áH'Ъƒ£ Ør"7Åk¹Ö°ëÏo`t‹J5Žõ=YÏøpåô#Ó ¢'Ž*E|ïM§Ù°÷õ¤Ÿ ¶wŸŸÝ2ÏÏÏ týñ——£¼ÿì/¯XÃFP•¤}1rï,ÍtùC×Òr„ÙëõÝ?X%ÝM‚À‹Û ©á—ÏZxuë*TõþÀ`nâÇÚ¥ös Â‰êZ!Co ·w£úQ¶çí4P¦‡€ª=‚à+¶º¹s[®)5g> Nšð§*[<ßò^å¹Ù ÏJÁQDÑù›<­F~²%`0vÊ2Ÿúj¨} ê‡%ǰ4Ý’MºJô9!cÇ£‡ùƳ¨CP‡ççwÆ\7)FÇü 0Åz^¬.å8z}ùLÑ ¼ùÔÜVO¨àRTh#†>Ïb•Œ÷ñ Êùž†¶–оØþ([Ó¥bYVÙB†‹Y3ÌdÏÅ2£Rnâ½™æDU ó›™é‚/ëy‡£ T‹ª3NS†7Œ±ƒ+Æpä*)jpÿÿˆô9UÅmÏG©öÎ+f5 êuy¶vf(Ô„+Z>Dd›yŒ%d×9p£õI®Ä.zö÷߉$YŸÏ°¶Õ…@èòÓ–h¯@æ‘Û­C'dLÖÙJVZ4¡ ,ưWžÝ˜‘GC"K³À’·¤‚-3 O.{…úö‹“ߨx¼D‡íU¢Øu -ÖU´á}ÖÆò±SoÊcÒï%pÕÑ KÃDn¶Lë×I q3TRhUØA;?p›šìÌ,øñѨªWT`bÌôüæôÉv3ú'Ûòîí± f™.ÜÒ1„HM±Âºí3o4áM(òz…—bôñÚžú&¾ùX¯¬ì4²toZ¤Ä1Û¹—¡{t-5q¥¤Ì9Þ¸é(ð“? ŸW³UEVylÛðœ›< ÒŠ¡°bxÉÕN^úã™íÞ€ìï¥[$ûfÈÁĪ]µ¥ðßÙ®‰í¯gSsLËmQS•J®†2¡î®ÇæÒ:>×ì¢qöäf¦ç(JÎ!YD[̳*Âeà–Ñ`¬Ååñø ½TiÁâ[Çž–"›Ñ¹Q "Rƒ DÙ¬&¶\ÀI¾?°t)ÄîÕUË©í;™Kmr:î˶}@º$­NYŒ—ŽÑ$N-­ç: w Äo’½EµÆiÌî[I*ûØ©3†ÖÈzPôÄ1xA”T]héIÁCº¹vVwƒs qؽ ó Ñ Tetétr§›D¿8>K #ˆWI üCì ªÇ²m¾ˆiS$Gv|Þaq/£ ÏÐÐþz|â8FavG*‡e›Íé3pŠ wÊ—±¿š°[fê;Eý½”ì [»üG¥ÈÇåSøny½Ì¡1 š5šõŠúÜ×íÊÕ5§Âm–x?Êœs[Ä©v(Æ04Ꜻ‘üÀ`[ÖÉJ«™Œ&é E» ñâµæiDuÑX׫0^Æ´(Öà íÁŠUlb©x·Œ4vJ˜_Ð 9 Ðl¤î0ùf´ ÀI¹Ã§ð 5Æ%º¶º½èë¸ÕKãA(Ë~în]PíÑ?káDé×=²*a%§¡¬g劲r)§zµ÷Ðå–û¸}X£ äÏýÅßõ§‚ªÎR]âGºCÔ÷.·ÚÅâ r«"€Í€,‘½еDX4Bd«.–(K`¾áZž„ZêÞ å}Qñp°‚õµ£ù5^Ué.U?áý£¿ñßÕ¸uöè²bQC;Ä]¾n÷¹ÈÙ^{ªð]¨‘è3°ªq8Çqà {+NíuøàCÿfÚ¯+‘ˆ ÈÎ¿âæžØ• K*Æï×6 cÒA'œðGÀL>†±·zã£ÞèñÖû<~ ¢ËÂuìáØe¿Fm%Œ]Ñ‚#5ÉóK†ÜXÀÝÇiOÀkïr@ ],²ÐùYï×^kÍIî¡õ¿©‚ø5e~…ÿ×ûyžè§çùù_ùs¼KþÏâŸÞ ͯÍÞ±¥[p+iwÌ Žÿ3Ì÷oßÏxD2Ë{qƒöÈpoܧärXóÐì„si'…´96c¨õ­éˆ4Ý5,ÐìÿPjß4àêc—¿ýÍæ«ö¾›iÃCõÔ$€ói‰¢ùóêÖ)8û*ü$¨úf®J€T³[Oeà°åì!:æ.mµ8¤Ñ{bQ»»±M1‰´x=ãgMºþÅ¿úö»o¿3ò?úw~‡"Û„{¿6¿Ø³UÇ/ÚúHnšnÚÞ;®]Zë}ç…˜q…àB4¢)¾§ðË_âµ3b òz}÷Íõ[X¶E41ƒ`¹u!þRhæ&Ïê++ WìÏLg€GÇœd$"ª0³‚]J”2åñ}†8sÌ„ÊS92Àิf³7&R¬ÇÍ1éQSË|9lu -›á˜üÍ0*¹Lä KP=°¢™¦õëNj­o eç&o2Xû ôœ¦`jå¦+…Ñü8ê“6ßpzóxh33& µz§óL:_<|uÕÙL›HñͳcZFgV°š¢bÒÙ*¿Þ:Ê—m×µx¯z™Çü|Ó1nR¶9¼ä †¡tà_w.¡«–›Á² EsœÐàW£­­æ¢€å…’Qµf(A6 K$Q&½”1œ’½•Leõ6Qü+B8š]„KÔÄŠUêÈ †Ì[gÆðeZ熵·~â8hUj:`D áRÊK.9Üß„ˆ,2ÇHQDÇŒîûϘÒ!Ñù|ÏÏ éâ%Ÿ™x†'™0%BÄç0ÐTÍl°ý}cåv×zô¦¡[²BÃ÷ÌFZ_*C&CÖ5J È»¿³å3÷€·ú/É<Ø–*'*.T›R'0é‚®`:ªªØA PpMºž›Fó0*¤ÃKJÖAã^¶M¡Kƒt³÷v1=ÈY´¦îÆt'ðÝÒ‚å_ùkï °å„…Üé UÛ»çIR3£™˜«<Õ+z©€+®µ (æ˵-]×õqÅLüµ¿ûî;!ÕÁn!Z Ò@Œ¼‰\g§‚à–Ç"¾tæ !Æ0®nZ•±œÀO13pÉAí.w³´—^'‰Ku;ÕßìR]Y?žG+U»BµY ;oާÁe!€—`8ö鹘©7{°¨ƒHS®j4*Œß,cÄSKŽܤÆyF鳘¿KÑæ'÷~J¹·}fÒv©vm&QYƒƒÿO­Jà“?ozàž­#'ÜxìBÓrG–E_«ª.ª™¥ÔTúÛÔe¥.‡ð'Äã<ÎèUÍsàe™°TèsÓ…j®Æ™ÙR•˜ÆQÁ|²ˆSàˆ„!æ«^&2¦ÙÓ΃†²Œ/“Q”?oñÏ"htëZDé—LËÈXU¶[||4O³¤¹kgXŠ9¿,÷4ŒG›?¦,¦/è¢o µF‘¹BŽs8ø?.‰Æôl2TŽ›ÍÁebNê™zOç£Æ˜æ\ÖUÇpíûáTã´6q‰‚–T«–|(¾ýÖ{ìü…,Ò6•^Zv;úŒVFã7-|~±…vß5¹n Q­´eæ!gN‡CýÏf’ñ‰¥ë@ÎÁ(ø³þíy6¦3œLž¦ŒžÔ®×%WgdYq(%¡*s©`fL w& 1EÞ:ætㆠâ£àSmc+¿.:ÏæàÌjÜæ‹:&mœå)-»T=“q°SN;"ñ°g˜¬åƒÞn‘%`š³}Õú­ßùó¹µr>á¥KEäõÚ_ö¾tÅ’hUàª+u)‹ZÞ;@/iJÈ¥€®(Á¹$EîÏó×´JŸÿºEÈKwqù/‚.o‚3ŠòJáÙd ·GCiÛT½Ûc”¨è°ûùþñßøo‡Â~sêÊl„&9«Õäêó«¹hã ÙL|m[ª Ç2O§“Ž‘© ÜMï‡f üŠ~êÛ7®ÇÔØÌØøñúVßrö¡ÎÀ{?qÿ¬o$Ü4Éɰ½ÖX,»_pãÕÜ [8i,i ‹B‘“uzÑÑ .6"žz~¡ù#ÒjÖß±ýIŒ¿~ƒ3¾6·½þÿû_}|¬MSÕ×¶×Þ¯×þ+ñ·º1ø½íò¤VP?0¶\L%Îë/ío6ÑêD™$¶p$ ¿{ýñ7ׯ½SÝ @&LW©‹Ü\ ·&&ŠÉ0F.1ý¾þøHßµQˆ˜»E«^zæ«*gs«!I•ÙBDëž8š='mU^ÃEBYo±Vvqtbc-uÉÆ·ÜfÙ»ª#â=׬Y½6~²-y-º/ýsÏ\ðë­µ$E³éÍ4R­«}äBsÂ…¿Ç,Inô‹»$ [©þ†À-ôß’BXG3,R’øò¦xh Rég­fwáÌt¥§Oc,øÝ—}]ë.üGd¡}r¬Cªjs®Í¨Ó"Ò¼ Á¢F%ÑåQ+euÂDM^ñóRsÂØÞÔd ÞR¾Îb¨‹'©Ú™¤ŠÒ=§P‡FqšQsÖó®ËŒcƒ·t›Ž ¿ZÔS Í6±ÂúÄŒzxØ~q3T,ÿ.lhó)\ž–æVZG,—‹:9²P¯¬ï·ýéÂÓ[ê„P¤¾dz䲤A1µ4j² †S=ËÌôD”׎nˆ'v±ª7XûëV_òÚò÷2Ð÷µšEâ ØíõA"¸w‘ªõ™¯nññ£ %½#Ëçh+(Sb`¼ä¨¦ƒ³3­cÒ)¤®ZNH|5üöŒ=‹`ŽA®¸i*Þ8þø!1ºÕõyäíÌq,½Úé›T5 gɲwè“¢¯cCŸÝ]¤Äš‹Zù¡Rÿ…æ~æ/œ!iâÐ*éÁŠ|ŒN]BíÊÁ^"ÑQ6Á¹°YSsnzJ!3ëCàps壡TçùYŠ™Ie¡€âÎuŠ"EŽvOe‘]†Ä/Ü¿=VËg0Üf9@ì:„1÷ÇÁiÚf}žNÅèÍêWÇ€v96l_ì¨|pJÚX‚ày ãÅk¤IÓA ûEp^­²´aLá÷ÿb¯¸¬#l7£g|Vài45~€jïTJ­xŠ~sO‘7¡…׉QÃèfú”"Kd3|.Ù<ìž`ô´çÏÓ ©3·ß €ª¶‰ª®hó»t”(Üo÷bmΙtœEH|Z„+bœÎkrèºÓL­èÌxrOP NŒ§3y(Q’h³öUò7\õräʈ1¾eìjÎæméÉ[‚.¸©ƒæ(¿ü7ÿBª-…í,ÿ…fÓ‚V›Òu­º”¢›ÂqöÑëbVí —ß©QU!_bH™ß=] cÆiˆTqŽM½ŽXHƶE„öò«Bù"Tˆ©?5­Ò'fÙW¬ÿøüo¦”?K4æœë¬Ómæ( £`ˆDH?èЇ_|­f…;m?MzålNOïSßæ{µ7†¾Nt9š=GÊaNÄóÐ^TÒ›tˆg¬·õäùB¦0¥=‡œI$ΕFu§7óçµß‹åÔ)ÑT>ómlÊFûÑjY'Ù;bc Îéüñ±òÉ"•ÑVÎÝzyâÔ'¶û×ëµ®«/ªöãà@„ñÑûÓÀ€~íQÂM÷ÿs_³Ï?y&üjpaâ~xBõŸÀýßè `|,Às´ö¸_Ï3 &Ùç|#ç?¡|Ò~±ƒ^üCn`ÌwÁº]"'¦¹¿Ò …IQ… =¡*/šÊ!B‘KŠ'¬8¡ VR¼´³:8C­|ufésÍI²ÐJ²QÒ‡å*¥R ó ›ÌPo%Å™â”ß F¾*·üj/ >ZXÀÑz¡Í‰äÄÈ.ÄK:1ï‡Âø$bƒJåúS0pŽ=ÿß?üö¿ø…Рf{oÛûeÿâÿû#Wø,ìI4Úïþ[Îs€›áJ×¥ ¸»1|H›²4Z)4Ò¥I$ !…?ŠAÅE/ç—\¹+Ðð"Š‚ Âýº–^ׇÙþV¯2AË6¥n1DÙÊÏÎáѬÔ4‚(šGê,Òðvº²kéò² ÄÇ…÷EUÐí*Ö‚³whœšGU±![‘©\n…[Ãp÷–ûaÄꢷ¹õ¡BneuÃÉp\vF)íqn©";m¿Æ„µ¸™ß+u‘¶TÝc˜íÜä¥éâçÕX‚ŒTŠ&f±]· é©DŒ–ƒœi¸h~¹v‘ËæC•Ï[ î½ç,‚ mŠ"Âï¾}}ó[Wœ´ÿ–¯ û¨B÷Bisœb¨ñÒi.¨B¶Y\RªÙ Í (1Í0sƒEAtȅɪ˜%6yÖ5½e” \ SÌ›¼¼£ŸæI€WII¦€G1å2VÕåJ£¬øÕÀ¬i5@ÒË2Ë”Ç?ÎQaLdʘ4R½»2l–©%Mg_˜å ªz¤l#b’]Ù¦ì`îÒ")Û›µ±¯¥¦.ˆRQ½ÖµÖZ±ô ÷Þ{›{ÃÍh¶^ÁšËeÝ»cÎb^ ¬Ì¹óaú™ŠD%½ 'lÅü¯ãNªnªJz3±"~sÕ¡‡ÜëæÐEÊrÃiP{²ÝUU!ŠéJ<`B¬’C)‹ÅLÙŸfÜ{E$Œ÷±«½)à7Ów$U´‹Ûru/)"vêzIòmÛÿOÝûõÈ–\W~{íȺÝM‰¤4àXÆþþ_` σ_ ØÀ üè?6<†AÏ@¢d‰»ûÖ‰½æaÿ“yoÿ#1T ›—·ª²2ω±öZ¿Õ «G`S[P™’F[uÙ­…%Üy ‚©5ÓâdV7-¿Ê?[y.h^DLrK: k‘OÝXÄÂŒcÁöf¦BNwå2¦‰5È›çºT'ϪjªžPr†mÙi¬ŒµbH"q'W4*ôF= fðï¨FïjF¨ cm{ŠÅ®â¼ë᥯þuÏ8®°a›žïr(y$.ÚrÚ“XnÅêmˆo ù_[º^Tå|-š–|’¾Ô Y–Lm[,@ P!¶ SSc2F)f»gÞ*ª!²F[âÕsÉùÉ-©mÕÝILéP¸fe@íŸ1µæVÞ$‚Öl‹ÖZ¾Õô¤VŠ¿ ÙTwLÙËV«Ã‘‡°ÃÅiѹb€‘4ú\;­‡U!ƒÏsøðƒËÁî–Ò ì¡>Kè ~ÓØ©àÔòÐåÎ8µúѤj_ :eˆ2¡ÄaÌfõ|¶­Î=QNQ=ml² ZE¯Ìi¾A­É":Y méŽÐ_ÓÄn»†·Ã@‰Ö{£ßö8«£O@Ú ŽkWšbçÓfu>"E±¿ü×CKn¦"˜îkÒêy=ÊEñW—ãø(€¬õx¿Þý@½–¾}x[·Ö`¡"^¼ShÍC§Q¨>Bb-¿”•Å,¥½­%x¸M(Ö®XFNè‘B½þ'ÈIÚÂÀ9çÀ™¬(˜åQë§'TK1œw¦kçÈf‚ïÛÆ[Vp£xDÛNá§&×EŽÑ_*ÙëtÑ‘¯²-ù6ÊrÊÌEå ”„j~üöýË/>u…Áé‡?«j¤Â™ÍIÉÓM* ù ˜`¹IÖ{Ã2šo¬´s÷6E±m3J(cÉZ'iÑJIŠ^Íl±-XJzX;÷^–´¤¹ÃÞ]U”\Q Ù ÐñÂ-&¦ê¥Å´pÖ—†<öŸù1ùü•gS{p6jЂ‘£'wï)Xqò{ Ö˜ràüÇ,@Õq)¹µ¦— ·ª£=;bñt Xr‡=›£í1kVÑPô£¨æ,~É­YúZ«ü¶&•$AãªOÞ}éøìRK6(ÆáDÓhõsÜä´#…S‡ÿT"Í2î¿÷Z *êã|ˇá½x È#ãw–Ú½W¶ÈâŽ9¼aiêÞ‡ÞZ“?Äî²¢ho›¡²ýÚÝ'.\Z–nvíé…êy^ô%„Þß=»ÄÀêT-³¶ÙÆÉlá±½/äP] ¼= &fb×ûµß/3Óµê ·Ë6ùq¿ã}`ØZ‡Ê›­à{ï¥ Šãœ[7{’<*•aµ&ç?:)Ofãsæ+#Ïdtç,V׬1þïËc‰¿¥›ȢȽU1âZyšÁ­S’*;ð^G0¬áoÕñQ³¯˜¸PY="þãÒO]ÿÀÌ2½d•O,"ïr0 ’hqï4°áÎç§„&M,t-hüÒ½h À|–{vuLÿï`¬`Öpe´Â/Ÿ=˜_}»¹X»kñ‹r7K§ãóÆ÷i{ÎE]Ýn YѬF¾Ú¼">êY]AŸùôɼ”•œ$j$nÖ‚ŽµŽŸfŸ¼€¬/÷ws8è«c¥ÜL­A¤G=YÅCR)1ŸÎ½Øt;²¶ (äš¹V™ÌôÞªvÍpsgÕh¬q®ÕúCÓ›†½M:8š¼ËÌ3@EVGEâbÜ¢2 t#3€£LÓ-6a²î4I‹3ЋE°¥á„y0Ñ(&[mÃÀ¡^Æ!/>L?å–Äe‚…‡<ÄQBd›Ø88êAãÌËð0‰Åù ¢c#‹n7ãè”}¬iˆhæY€œ?I¸b63´Þ™Ïߪ‚rÑ€aîÒ«Ì!tpL!OEÕ»JlwmÍc‡Ú•è,‚uÎ(r6qô“ ݶ%m<*r{oô›.äî|FzÒ" ˜›­sYOüÉø ÒL¤¥§úJŒÍª@(¿øÕ_ù€ÖƒD¶™ES›²!¢Xþ¶kdÉáÛñÌk=}ô¨k…÷m=¶º6M U}¬·õx£ÙEs'P ëý„½¼ÓËoϘÄÇ™ÐÒ{@6R½ÝÚw-B«? ÑÔÞ­ÿóú·£ùâÜTÿï8˜¡þLäO_TyšùÈš«Æ©¡]ݘŒ¹'ê~4“±#·€<ÙÜ9êø^Ùþs¯r3¦Ý û'*ÿµû—¯MÏx.'®ñÙ#Dt-²¼¸@pNç|ðò3^äç@¬!³ìbÒÅL¨”¹·'>ç¨@<'³¤IOõ8QõÚÅȪÕìã`çï“0BÄF†ªÎL _|Æ‚ïÿ¹÷^ëqCäð £Sáý×e?wT<〾Cè5É„ƒp&¾O7Àù_?µù 3ùdý€ T%ñéÛáöwò€R'¨Ãú}+þmÍá^bߊùS’€w<"˜Ï~­¸yS"GÜ-Pó·%‹ksd2ºýØ›äç`rGΜ­gŽêö•pÅaŠpõu9kÈÊñÕë7ïéxµ;‡ãßÍ"… s­QÒ°rÀ1©Ã˜…ô*’ÿŽ P: 'iÍABžsNÔ§ºŸ_ÝÿB@ú¶Ù»æ2¯xy X6-ü§ø½[;½ÿX à‹öeÛ¶Y˜¸~ñöÕCóŸ`,3‘½ûç-ÉN@‡ž#Ü i²UTã!ûãTî= ¹©°íÂEQÑ·/‰›~Z=?s€dùøCÂ4x¥uPŒÒXÚãC’ŽŒ ­ŒÇ7\x¬-‹ÂE{8Z“YNÇ6ÎdÞº]ênˆB6½³Ñ8°˜žM [ŽÀ¶') K”*kõ‡f»cÛ¹717uû!A]*Ž^_ÔÉ-AÄŽ¼¥£¨8~ÒY\:Ì~U`¢^pvê„ߪ? šÇãä]Æá+@š=­Ï1”Ȱ!ÛäI0*ÃÑÓµìûñý«ô\c4Ôµó¹.rˆ#•ÆÃÃêU ”Xr5ͰVËZÛºš8dGµJ1ïx…ëI[ îÀÎÒŒ¢¢+w‹†mÛ¼ €5Û]eè¥KxXÀF]r°úì´y9}2ç´ˆí ¡ø¿¸àê'Ê¥Š8— *8è£qÊ,¦Õ^KÒ-BÁ­¢k#52/‹9›A~¨~›ëˆË²ÄÜÁ޲Ôn ÇŽ^‡¶)îìÇf Dªí‡”†œ^öŠe­c5d +¼ÿ"Àž¥•šÇA˜\Ò¸Ö¤¹wèƒ4£Ó½æVdoóûk~ÑK¦*âÍP`î¼ÇÞÏWƒ³Š¹mé ›g>oÇ ¼nv?tz§î.kLÅ«RØm¿“—ÔŒ]˜>ñ:Ó–wð¾vŠZòß»K–Æsíí æYÅT a•óÀ¼ç#èqê3—Þò8é‘3Ûûº®ëýz¿®ä~§JÈÞö.—^ª^Ï"¶-È%èÝ\‹‰F³-Fã^² H_Â!ߺi¿:«¾’KA‘í=NþÙF䡱ʬÿY>e ¤^ô¸ÛîxŠ/åtäß84Ç%}«d¨G"Û4ìV²c=²qºÐ7£u+…×Ìï§+Œíôg ý—Õ×ùD×û¯ÜˆÍ΂ݔ<ïé9JÖàÐÿó!ª(Ý%QËPÔ5³}m1mâ ãf•‰:IXѱ²ð ´h²Ö¬ÇC’}²å*¶".fÒµ"~áÚœ†dŸ‡‚Rš*¶‰CAiœø4iÍ©C'm0ÌÓ5Ívb¦Æ2GeIeLbë¨V”)"”ý ‰eS]­páÈɉðˆBx1Êoò$d‰wÊ^óxœ‘ 7˜{ï)­'fòŽâjʣŸÁ U²Þ¥F~( ®¬áYÊžyíˆ ;œ´ÛÚyô‹¿ú7ÊV (ZÈfDÐ6œy(áo ÌL;cŽÜæÊ®QÌef¼ä¢y-™¼_ª"¢µ®kÛî¤g&w \ l’¶!°7Qª T×›oû*ˆ7ÊmÐÐ‡ÂÆIEèâbù|Â?‘ÿëþ·cz2‰Ô'BCnæ›ã¿sAÕfÏFKÏ©v?#N²èêo8bGóâÜ©×ó_sÅÆá¿çÍÂ>‹÷/LþÓù| ¨üÞ´MãÅ7;mÚÏ¦ê™ØoÂíÉxÉ÷YOó7ùü‘ñö†¡á6Õ„ùrîSŒš÷ìÝÉ|¶·ãTx§ª9/,íš«pfa,å½3í7Ì®Ég†×ßYÜZáç“ßO‘ƒfíÏ»÷Ø àéÛà'˜ˆù E[Ëýøõñ¤òcè,·}þJ*ü‘P(3 À§Oþ¹¡Ý1çWÝæ¹íÀxKŸ§zC«¿Øõ‘ž!¬LÀJäOé5Fƒž7’sÀÓô2^G"‹/¢ÃOŸæ?84äÛ›HÆD|;!#TeÔö-¥»Aó¦OÒ»wŒUf ãÀ‘¦Ó+cab£®Ê$›ÝXXÏœ÷fæªÛÎg™É‹v0Ž@Éç.fþ‹+x¶ô ‘+m:™Çj¡zðÖ'I+õR† AÊßýî²m¶÷\öÅþða‰»@…ס|øâí«/ÉËaÇ_£ÀÍÐÞi& ¶q_[Þ{Y>>«s„Ÿ˜š ìRæõ±ðž©O[8þp—KYÑåQNe´¬@rß±fE´Ÿ$z€Æ™Ì'È,…`c©Vj>˧ ´ Uñ¡–{9Îqøá|$&0Åò*X¥Pµ,Jc‘š5ç%2¹|þñ’Ýä0)÷Ÿb;›Þ$0aóbHÛZåZ1'aGsÅO—nñü&íu¥eQÛ12/9Ȩ—Ð$ŸÓ1Ë76†fÞ­²ŠÏBrïýXÊ¿®ËÛJýö«P‚w®Š`=·™ÐÌü6Cïg¶hÙ‰.cÅKõ×Ï—YM2ZJ]¶\ƒa¯¾[÷û£÷©ƒMí>¹êB‘µV–.0£Þ/Ò±sR‘µtþn-ª 1ÏÚ¬íŠ1ª¼Ìµ²ùX×â ÷­KWW‡í0|íQºžã46\|¸Ñ‹ÎŽÒäöuÔ¡ éÄýÁÞ )z\rS‰ŠW`êVÄPšî6ç5. ñ0Š .a.ç´™1â0FÓ“JDå\ΤÊiИ&Öé-V9+«èf9¼…` éU;ÂÍôxÃ9ðÐ:õyå‰SBj–c´7›¯ëdlÅ£™ƒ³)"7V„p-EϨ(tš Ó9'UÅÁ„rŠˆ>Ç·9ÕeïÜŽGRɇ­º%§V¬‡l­jùØq¹ÓQ{#SpožÀá*;޽Ö(»©cÒdÑá"±”Út`á²J[tx‹gûR4Í׃™ã=}ðz°$¯¿ž»Ð%eò#¶«+cΊ8 ž°õ£“¨?ÈŽTÝlÒéÇòå4lx™ ¨±Ïï•|J"b_ü7ÿƽi~5¹“@u!$ ˜c‘ýDBb‚IÍ=aЍñpÔÎöx4Z· NÝÉÀaIÈ MEe) "{ÛÇ÷ºiK—wæîßÉ=N•œ ¹i,5‰½¦,õ^,¥y|nsÅä?þûÿáx‚uì’òÒ„›sïù”1«ž¦i•±“®@(T‘<¬!’U˜™õÚ I®‡‘‘¦¦¦”;ônc>úpOŠžÔ´VœÁ§¬Û)pŸTQŸÅPÎFäI™wB ¢s€ƒQèô 5OÿŦ,·ï¬Ûu~îsŸWVú3ÞÐôC&¬&rug:xŽ)g_;š§)sßá4çl‡¨tøHź}Ѝ¾£¾~Â?{_Ë+yovíÏèøñ¾ýïø³ïû ø4 YCûÉÌÀ'Ýüx1à‹ð½àq„?PÀó É/öb6PÄÃD„ÓÞ\´!vƒ¯†"s~€Cúo³ð­’¯©Eý‘-Áì·(d…F½TV[g•ÖâœfHíD¢ùô$ç5NÀù@*Ûdéá\è…2º£ê2Òª¾-\kàe¨sNR©)Å-Fƒc =|Š6º@_tì$ãÑcð 40ì,ʳä$œqT›ÈêÓïü¸ð©¹Öífü—Qüˆr'€ª×¾DEUU—[s€ß6Ëä-äZËÿ+i×f’š§úõÇë×÷û¨ˆÝöñýݶýòÏ¿úïþêç¾t[Eô±0Îp¢¥F>ñ5‡9´\þ7SQH.Uš˜X`¦¥G qöÛ:£ÇIÞeg /w÷D‡z$•)uõkAŒðS}FðÁ½Ó’Ù1’´Ë.,V[«¨º0í„f¨ ör…æV½FÚ”CU¯uÅÚàtWÍ®Åe’…bþ2ÜžçÛG^û v GŽ=µ D>±»±Ï•êû$.WŽÈÕ¹2nvKjë<‘§Cóéa•÷ëZ1Öw¤˜,åÈñ” kKqÕØ"_ûþŌȣ þOörÅeG‡•šÃÎ 4Ší8ûµe-Ç&µ¼¥~ê¨Ëh0$*§™NI‹NeÄJFÛ$¹&ÉS¨¢k­Æ¦hjRÚIꚎ–3Q+fº%¢ö©*JϪâët©w}pútò>ÚWáÄÑ-b €©b±O†®¡“FSš®µg~ €´ ƒ»MWÞM†~šQüº:'ôGŒ8°M<¬!´Àõ:ÄÐ1ë8,òbÛ}çÓµ/^r Ç1»Óàž"Ü&Yìƒg’ÔY#ÈŒYgÚ`ôñ±”é-Ö ‹@]ÕêŽP+]™fîÜ *€ˆ ¢šc:R2¬‹²dž{K…d˜ŠÜ`>O"£jÙ,>€ªKâiG«¡´$H£p›ƒ†<6X¤ E¯åEW`@U¡;ž0ñ~.@ þÈ6oÒì2ñöà”+b?$õYÄç'€^Ž“ëeŽŒ¦&›f»­Ù³ý,ÔÒü¬´^/L …yÃ,ý= ùHh;QQÂF®K/´¬•^ø˜ºÜž Z牳nÊ€¥^"çž¶Ü€à8 âŦª³ÖuF_—d‡æà¼ò7Ë–×ÜÝö“‰éÑ))0TÙ, ºT ϵƒa†±ž•ð0®÷ÅFla IˆmÍÐ!Àä²5Þçîò­ÐVÔ÷0ØÁ÷® g“˜Ï€ZmÊ@ŸÖ³JZ@æ@xžÒ˜? ¨qHõÀƒÀ³S.Ô3šY uK9ROêÞBäuüæŒ*ÉÛ!=]f$J ²‚åžµ¹ˆ§j´Â'µëÁìƒc¬Þ]¬ƒ¢Uþ‰2»5n=Kˆ^Û)ÿxÓÕQP"[íÒú.2jˆ9öþ{«R°à£Ïâ7hš‹¢Ñê62‡ø–½¶ËGÒðVâ¥î«=]©0Tßž™&¢÷ÃGäf[†u!#ƒû•é´6'ÏÞÒø”&ާòÅîÇ0ƱzGö{í>_9¦ë“È0Ë\OŸK ÃŠô)MT³Øo ìÐhâî5µh4¬£Ñüg‹ ÏeiH7V!&Ê«¤ZëƒVËòèÃþÙ¯þ¦¦!µ/Ûæe3ñ¶Åžè2[k­ŠŒiª¢&¦‚å'V: §˜R©¹ðži¿¬•p{J,þ‹žŒèC•Y³`¤ì% >®÷÷‡ˆ,YÅ‚¦”êOì1êR@×[˜Ö–„ûÌ-Iúæ–ÿçßÿ÷7ßkE¿ní­¼{ŸcLQýŒ<>ÔPH»ºª9eÂò$;Ë9áU@QûâÞ=ÖTen8·³åìb¯kì¨ÕŨûoòé¾ý´ÜÉïÅA9|m¹„ÈÑI“Ç[hÂÔ•weè>šÁU¿2—ú0¦â`;H§tE$"@@1ˆv-ô—]^€†¸·\c5«Ê9ÔÌ0ŒRA³YP˹£‡[Ùc6‰G2ciÒŠÆd…ÉÊÉšìNiP°Úί/!¦RÄ@ÐÏ”5Ã%Ý™;,DUÇv,†Œ¸Èptúi M.ˆŸÛÚzHÌ3²¿vM’€ið„ *§)À¢ÊBý„¾w¶ÔvFQå¢ì[{.á ôŒ[]˜t IDATÇ„šQÔo!ß>…ÔR‡¬,…i¶øƒø Yä6)@kÄ®¿>Â(­áOŒ‚Äqï¡2 iuW1äÑ*eøŽÊή±Mã†>„fPZDNÈ›¥D—ªÕêä.èž‘Ò+}öGj)ò!r¥ˆæ”3Ôs7;3)ŒyXXìÅ[Ð%oÖ•²qœ!AJ‰­ÄŒö‹<ØŽ¨­`mÏòmìÈF»QÉ•.…|-ó(bFwºGË­"Ò)"ZIr¹Žf©mÒÃXêjÒ¶‹ŒúPìk$î|vK3n³`ØfùÀ6ÈòÙ>šŽëÔkóI`Þjîî;3™š «k5!ZõÐç6VóÂO6T5ìÒôUÕ²e¤§½-«ìÛÌ®ù~²ü«Úèqc‹m“ulš®–¨êãí`ã²y÷_–>ë`Å,3œÎXzèÒc¥ðÆ N]‰ûñ=×ËÒ•8„MìäAËOtO˵‡áÚ1FV—p¯S„'71~®3"}Ñ‘½Q ˜ÛÕTdfŸcM‹fȨz13*ÊaõIŠu¯]„¨ìÚâÖRY+rf¡œ:u>‡ôÑÁЛPMW½à¨JæœmY9 Ƴºô8^$ØLµ.i¯íäÑÀÙ²&÷ü‹ñ¼g·|8~ÌLìv@DÃæ˜–ôo]ŽõàÍw‰QÕæB×Ñ áÖZñ²tYÅâLPUVµhŸ–,ýÎõèfKb¸˜âa>)Ó/{)â± ´“·|Uqect&iøå<Q³²6 FOeelµÕÜvào°Ç1­¾fšÉÒ“žë[’¸ÐFYËg³'ËduÉqHõ0ì ðÄ(JÜM&¸édý×GÉ[å.ØíÀîçŒïÂqR¡©ÃÅ)'Ó|cU’¬ŸÄ0å²Ãk”0@¾èãŸQn" áZ¹Àaø˜ùNBÈî©R1ƒNŠãoBÔ¼aŒÕ12Õ¶é}ø°ƒ µ·¨)«ðGyU BÙæV³ <q’l©ªÕÝ›µš zÔw9ŒÑ¿4EÝà&£ŒnŒRÿóÖ™ŽZŒ~{擵€¼ù&)À—ñ+ßëc=ÖºööG€Ÿ©|üüHIÄÊÝ&[¶C”ÌhKë$‹ZˆB¸Í„[v«h Cî¢5’ÊA©\‘v*¹ÝæUOÜÕ¥lîÒ…eÜ‚½/hyX, ¹`ùŽ€ê#׈å ì_ÿ¯ÿãòL—æ¸ûàû†àëA)«À¡WY„ÌãO¸WÝA8Ø4… âü ÊIlS|YTа'þwôM6z ä•oþî¿Cz$îÊìwI /¶ ¹ÏÐÃç Ëù™ì³’ž™Ì¨™tyÇá÷p™>½7<6ï7î}îÉ3ŸúPîÖ;ÀsºøôúEŽÌúGRµfq¢­ón‡ 6"aŽÙ« Q5“:t‰m¯Œ'çηÞt-ÄÙ˜å;v‹8°¥ú?„H`‘x´OßòïÇ”B‡Ò‹J¯¦êšÅÌãCm,ñ8Ó8§È†¿¢CDóCd_ð$àù5|•¦y¾Óþ´¤X’CÌh .¨.Š-ŒÊÈuóI•€bF!mo´Êü&=Ê,ˆAfö~ñ7ÿø5iºþýÞ>|àŽñû¾ö»ÅÊ¿úåW?ÿÙ¤‘Ûíè"[ä}QÍö¶ `ae½³CņÖã¯ñµ¤ç;Í5yòui^×xW'*ÒœˆŸ„ð˜v(h[tyejcÉM‚ËuéÌõ $óÆëÙqßZ« IŸ¨ä–nÁŠ&©<…>"·*&" nÃåÞB(à}_ðÁK€ ØÛ”Uš‡sˆ9q¿ke!ŠK¼«S;…[FÜ|¸êBˆÕ­{NŽªYCl'кS"»MDa" ”„‹Îƒ»Æ E¼e¢U(EÍiZ‚¨!±ï’޽lú]+Œo|'¿xÀÂËU¼"Ðh¹€¹¡ÈIÍhfvV§ÊÜI}˜ÛB]ÊÝAŽÎ¸â'EÐÂ-®X“¡‹Üë1Ž”N÷'LÝòµ¤,ÕµTœäQh¡Tq+CëñÔ–h\6U…pÅ1=\²"æ‹‚RX1yEà(ŒÀô¹õ[ýð¶SF7±ò›Óh¶ÍlKg¶vgw9Ê4Ñqµ)äbœlKüÍßɬžzA§óL?%ÝunY—¦=œîΩ›Ÿ(°ËÑ0ʽÓO̘­?T¤íÌe€¯yú­Mp²øãÔqj•©)9e?É'Õ¿ °Ë“ÔÓhÂÇ6ÒhèÀ~ Ù"&òp¢} ­ö^~IÇ»Œm»Î7Û¶xìÓ*po åQ’ÚǾÖo935b¿Ît!å¼Óšj«–Ëbé‚R÷õ/M£äXbpJÖ°›9h2JÌeúClÏ4¯½mÛ¶ WýÕk2<2§èW…ð!v1+'iœŸ¤à„¢$C<ÕùðMGS†ULÌUFبQ;ýYÃ;f™$ðËÓGƒ]oª/ ;=Ñ5NzCØ1 Qá ³ #ÚEQ¼ÞºO&}a ™å&%`Öq§à&mc.cð)§Ð¶×yû9âdC  ™¨r(þ•ÄƶxR|CIV4g,U>­ö^˜àCîŒ<13dzY7ç5ÈzžùwX%9˜@<Üi•¬¨oC\îªn±vçü•óµVÂY]fq ë~9ñL´Š)i‹9,ä\/uuu°«¾’ŽÙ7$¶©m— »i'ć‘ Íió:6NÕå4íd”›³¿;â籲Ρ(nTÝàÒ0˾Ø[0  -Ãz+¹¤?›'©’³fÒç ÛW’k¦<ÿך8«Ê¬µ5=y 2‘¹Á ì¾cîÚk^ÇÙ‹¾vg¸QXöú®V_t÷ûÊÁš÷œÄèéÛÏŒ‘ËéÊìèÝ ¼3U·%"Õ6zzÇ(`Ÿ•÷šöB®8@`^º«‘"eö•v+8í¶<î°{!otõDò×gˆ>ÇÈÙ¦Q7óhÖ5çW[Gkü¨¯ÈzŒ¸uÅF±uÒzBÝnJ9+c™v £p“þ¯ÿÚÇáfÛ¿R5fÃêûèÍËÌlÇ`#¦ª&™ËN©Æ²ô bËåÙPм´Æá?K ¾)monÛû*æ¢K:b Tï1ó˜DkÚ¶íÔ§}n!Þ«rW>–I*ÌlY¼ÌÄ6Å”KTh¦*K—èâ&Dÿóÿöƭʃs«“SsN¬ùaÜ¿-à˜µ+¼Õx0qh¾}š;98Íè8Öº9¨ Ù'(0û~¢±.?›0×cp”nȑ؞zÌMÁžõÊÈXËd }JmýÐãUËê¡Ìåv|T*s†âË¢a _¨ô„g<›çÑÓÊ.ÚÆA/Gr=+¾ÌŠ‹¦œbAL¤è¢pΰg…F¿ùÏÊpƦþ”þ)k5rxyQù{¯ö}Ê=̆aŒ£ˆ~´ÙNÚOïxõ " £ºo åÍ §3tÕ¾§Øa†Ø^¯ߨ°"ÕæHç8IiöLîÝoÛÞÚeâfcÓF­¹Š]=ƒêmc=xJž1o¹ë­HC`Š€³Ô!Ç  ûy‚ñ¼C[}Aïá)éE¢r§œ<ßÓüÓ÷þ×€—m?S©& °H[Ð%½ &I´þ&…®”¥âx‡\ñObyƒÔµöAÛûk‘ÿÿGÕõþþíûû… Š™||¿ÞßÝðñÍ·ýÕ_Š.Ñ…¥Y[jˆP¬‡>"7Ú›?ŽPßÂg•Äç#Þ‘¥e|Ó¹‹nA}üÙW~׌+‹°$ëIƒ,QÀ¥>öþÖ ÍŽ~<à1å;åƒÚå pa%û[ƒ§ËçiÛŒiûC-‡:Ië›Áxðdtí¨;UóP²è" ˆZ­UÞ pÞ*82Û"}6Lɹ:™#v‘*|ÄÁÕÂVªöº†…™rs•H_]ˆC3#ì˜ft¨ÒH¹ÈÀhA>_n%`X!êF^>ºØŒgß ÃÛI€<Ô-NTI¶½K¹ãû¦xµÍIÊá%;‚Ü>dQy¤©Ù[À úP`ƒÑdª*²ú¦êÁ÷=3Äïs¡ã¦†o=žŒ* ÕÙP3*hbðˆ´Óeýð¬0iS[Ír8Í¡_û[îðá5QŸáã¶WÖìþihhõì8¶jCUÙ–^ÐTÔ»j’,Yph©”\—ZGÔ¤+ÆãœZðч—t«£Q¾œÔAð—ê4Xj?gƽÈ×õÚjg¬˜¥ Ó$¬nŒ"LG dÝ¿Z ׌3Ø3o3в¿FÒ×,½è°gÙeg2ä¢-9‘n|ÌY²®X6”(ƒkšØ,á’“€mª¡8tíorz"T¢žQ3‘Ðyr’¦Q²†¬TuïÍ0cJ/þäÞ¶Öâ%fGŸ­$ß?—êCsH88fFÙ¼®Ë³†ñ÷—¬¥k) õPhvTæšfó3¼Ãpªa"rcèÚRPãö›Á«¥ú›¿ž=Æe.´Q¾YÉ+§âYôjÔ—ûå`B ……Væ²<["m¤Y·Zx\y6üûI€aqÀzŸ:0}Q‹²¤ƒP¹ÁË„ª6¹³@@m<žêáÚk¥GELJF¨ýÀjjòÇÝ£)~¡û**Š™¨¢’E,wÇcñÉÙØÇÒ`"ˆút`›t’jïDæœh{oÁGï©Ô즣¹m[PŒ_Ù»È\f?Ú(¨¸(KÕë¡EÃýÓH³¶ÓZO "E©GŸ”æÌ; A=MgwòÀsÇ(ßMð.…6_Ýœ@°×rf÷lé°Ö°™P¶Øèh7P>‡QùÛvÖ†Hüaàž­@}ˆçLƒ˜È'¦&æ{%6L4Zšz(Õk-±LQ’aô‚´M."„Ù>ë9-î '²5E“˜'J¥£b•B¬dI³®ê^'áa@¡Ñ +7o³08Oæ9^¿(ÐføUã=LNÕó"Ü|‚]#»Ô§d@|Zlemùf¢ãÌÑ»YCÉ·ê» 9·‰­«¨ó´ù×€˜ãwV‰&‡0Ÿ·;U@Ìoý‚Seâ(Zßgr«~ Ç¡¥ì Åw» [ý—Øž)ò[ÿÙ¯þº—îüæÃ"[µcJ@l(Vl¥|”î¶·o†-ìOÐ%^”ÑÖµ€îåo¦W¼ÑhFM!´÷w£D@\“ª \á- +5TÂ$r™~ø‚/ç>Æê`Ü4.`­¥º²G®eصm_nxúÐ%áßþÿ{]é­ÏëÙJ1ÁzHï‡ ö0E>»ˆKÄ kÆöÒ0ö#ƒþúø$™¼‡ âMñ¦Ÿö”¶ˆ´÷ #/ì*—Í)+Ëbr“‡ªæ³Óf3b"zÿîlžÜžW×_ÎïiþÆó_EƒšÆ:'Ò¥ôµ%™ ŽYÊxGËB'¯©™œ9¼ùêÜúÛøŸL ÂÚØÓÄâlÅ[.VÚ´ò©3«$"Ûö¸dÑÄÏz¦Kwž¤íyèùZ+ÿ ÿ!Šá\˜;ÊäSþ¸ÀÓ‡ÜKä3tžï1bx"ùÊÝOSL€3ô0ü‚?ìe¼ ñ<¸Í†>ËñFgñâÇsò^ìN)µçw8Þ¾ÙÌ£¯, ³Õ §Ì­8vЧ¿}lqb9—RŒBÔÛ{ ×Â*«±m-@DèȃøéñÒ -XéË)àð4hI…óÙÁ([ ñGšjÕ6™´Û¨”Û(ˆ’êˆwÊ "&ÔavõÁ';´‚«2®UMzq] ÕûÊé±ïíá8óúÌ(41}Îó<ƒÌ¥‹Pªå;#I©õþB7˜C\>ÐèÅàΙA2aRâjq‹VùjšctdP€’à}”9I*'L¶XÙðl·-+ÄÕfñ¥&FŠs±ÐØ‘šã¡¥(Û?Nüÿ0_“åiÝ?<øèÝ¢S6VPá‘—¢µÀó[‰#‰]h6äe¦º<óµI¬Û÷ç+¨Û× -„Åò9y盇êPˆ' u·ôŠ‹Dté Y#Äk  ””+J6Ä,–ß±h9* Ðb_•ô–ôÓ6£ ç¬6`@ÀZ"òXK£÷O¶mm_¢qáD‰:ê8O•þ‡ šˆÇ…Õ‡le ›,Võ¿¤?Ø`b¡…Ñ+?ѵ¨©Ô)Í ]cPb²˜í±ùñ‘¶V>ɲýâÊ2L£è FTG):Á_Wl•À!ë]¤,á,1§ëåÖ¸C[ÚD½eiCîF0gtQåîO7î˜5FÓM©ˆ(FZQ^¢ &;¾€ô§—„•÷sèïÆ˜ôÕ@³A ò¤-.é¹(ù`‡Ö1zÎöMßkºü\kx)ß"Du)ƒÛ×D‰á‘ñ­ËÍæTtsXE ã¦êV‰‘y àŠ×ÿúÍá…‚x\ÞpC=íA°‹‘* ©Ž‚J~TgÄ}g^um½œûÙäprIPË¥Ah&sAçç…Cp57%ù[Dwº{_} …'^É>\¥4‘Õ^¡¡j¤1œ'ÀJ„ ;#±– þÎ ÆŒöœ¸ˆ‘©È™6ÌDå#ÍIs¨½Ð‰‘³m#I4µÍ;,RG­’!YògÜÀ:ŠX!P@q3D«¨ý‰CŸI›]GF)…¸C„ÞMsQ§þ8@MYaâÂa¨bWx­=‘©%´ÊÐI.òÙ–†– y|ùË¿1Göy¾*,/J”e8S‰¬ÑM±m¹ôQÝY‘ƒŠï;êbEXþM*'#òX¥1½ÞßÍ Y§ÊšÛ‚<þ³,x9´Ÿ"ͶˆºVQÔm¢û›¯e=lï ¾Ñ6Öã¡Ð啨/@MÌ6Eþö×ÿoN×ZÎj‰išp „f³ÛpF–ïXŸ^‰ Ïxš £'á=ä/ f=ÖX/·m2šœ¨ ¯†tr»ð“´Oâ$ù"²óèù5ÚL0ÓuGA}n÷Ÿ¦Ùx"¢”ožãYô\þyñçól–YôsÛÝ"uÙú4¶gB=[y¢f´é=¸Õ$3,ÀŽÿmL£C9C×YêщÅÊ^„® Þ0RL£%Ö#'ãÑj‚˜£ÍGìß-7ÿ(Ùÿ |?ÐO*ÀKê>_T8ÿðï¾6Ü9<¯9%ø>r%v‰]r{¯ªþDnô§ÏnøbpÂc^CZÀç¸eò˜ždh­¢|òÆ+ë½SÌÿþ<9Ô¦C _±Žïl‚5ŽdLK@Î-â;›˜Æ¾Rhž?ÐÌͤPVÙ@€cÝCž“iŠF<NNöµKU†³ä@ÿÀs_±xº=üÌÍ®šÉ787]s5î÷slÐëá±J¶挼ô‡È1^úÔeû™ÙÖŸ\ àu+¢ÐÌ6ôÍÓŒK6÷s¥»ø%Ç:šôZ%Ûl¡™¡Ãþ~ž53燖©¶V×u‰Èãñ¶k­Çuí0ä…9«|¹¢ªÛöoþé÷ÿôx{{{¨^öumoÛüüçÞíÝ÷3F1nö¶LJ/lWNèœÉhÆ• @—hí>)<ºôñ]±÷-ÑøÉp²}ùeL|¾ÚŠJŒ‡7óBÔ•|pÞ¯é‹ëWJ^Žéð¬ êžkßîz&ÃÇIA4q"‹ªîÍô¾Û_Ç‚jôð¶F“>GU]äÎÒÈ¡Å!«/!FY©˜*D­©…ÚªÀ %]_­SBå¤;Ä»0D-¯L¿®Æ®ƒ4›\–t%IxˆóåË©ÅÔµcSRÎËÛ¢àÒÀ»à-iq6ªãJf”7Uðxò™Û¢Bսɶg‚$2†ŸŸ{´.”1@Ý¢£ð¦A)&XåŒ$‚6(9Ú1À5͸,)Øì+ Å<ï¦Á©‘¥¾B^¶ÍgÙë)KÕh…¥Íó<7RÜRŸ=½ªÎÃ!XoË¡À{_%FFÕ'Ûæßâq¿Ôs Õ¡Š¼ï  yé™PÂb“”£òcÜéÎâ’7fìcå…U-m†=±=¾@Áa7î/ðR> ¥wÆBõIf†:sý `&'T<3+Õ3KÒ3b•ÃK£ã¸æ"Š¡¬Ó–N^<õ-×nŠœ8¸˜Ó² Ï“ç"•DÍ' å|•;‘Vý|q)Õd"}œü”6Ù7çl î;È>Jtß®˜*•«·Ñºb¼®1þ*â÷èkUˆä¶ ÖÁWg46'¦uØÅUmbÝ›˜ƒÚ”F®éãðŸóë¼;ŒÝS²®QV¬ñYå *lj»«²×Ö†Ûk:©yC2±„ã«D ä¼ÎÁyâ®T“Ö… ¨¬|šKVG<¢¦s·2W§Â…$† R˜ÞÒdÅòŽ¥Œ!êKÓ¼gý¡Ð ³Üú—cW:€R¾ÂªúÍ_oHq¾Â¡°ÄcÑÖÉŠ_;éC”Ü€ŠKó=±€…ÙÂò=ÛÏ\*Ã}‰§÷y2÷RŽ$µB'ô~˜œŽ0ØTç5ŽY”Öè!;îϦQœ#·xŸ£ ?h÷§øÏÃ1ý& íں̼ծm{ouÉž‡4ÈŒI‹[H—ê²´«…ÞÈDW×D0¨—®÷k_{­·µk©êÚVG-¯“ôõǽ÷–mòö]N#…¿þÏ¿·Ú$ù+Ù{ÿòç_ýõ‡_˜íP"¶]—\Ü_¼=TÓ'˜@ÿ^á bB}ÀŒ4UVzˆêhøÒ4“2øøø®¢\XÜoKßàBE|]Æ•¥bdäõÉEª½Bð™Ò IDAT >^›¶ôZÙáãI£´›O‘apj·!i¾ÍÛ5Ä VÀßokÕ†IòhYÐ¥j&¶#ÜGîˆc+SZ½å=ÖÞ+_š¢Þ¨Ñ8Î&íÂOcˆ… ÅÁcRÊøÅ@¡l«ó…Ñçî=G·—†Ç)<™)šP™å µ—B50Ô€+7$H%¸È‚\f¶Ab銬3‘0Àöɳ‘Â’†¨”ŽSWŽ].DŠÜÒñ¨dT¨¥¯.©èºÜ[®ãCaÑ+%A§‚ÍôÕ¨k„y›öQ*¦µl„nâi";”TM\~OL|Åh*H^;%%+ ²–ºqOµÁ÷=’4§˜Bi(õ-¤# n}=[r|¾–ЯzÅ/˜±uºŒ×wxÐâ剸&*¢1¾BŽâçHe ¿€ÏT{zš/`ÉHîv÷hÛì_NÿŽ›Ìüƒk²‰oFj@£ÙF  ]€âÚ¤;‚%†I¶fºto>VÑߣüÄT ôŸµrôkf,#Â1s³‡¯:oj™8Ocîãóßô4AÛ„piœ"GZº¼s«£™?^tyVË/™UZ…¶›Y²ÜÍE2F¤äN[wÔü¹£q‹‹ÿþ%&²œË#Ã_˜áÈ/•´‚£ç Þ«…%ù°8á–`Z“¬}®Tß…=®+]K¢@©Òm¦Û4¤Î$_U~ øìqñºÂõÚ«s dzc¶¤@C³,´q9ݧ$|Þ}ÌÀ“.¬‹´†t«Å¦A‘‹–lç¬æ4®”1¢T sÛÍQ¯k})j6Ô%†ˆyDž>t[g’PÀÂÜK ’Ê{šì‡ð^ÚP6ò8„|úâ46ÌQ[C«– £Ë뜇¦ÀO"hæ$¥›ƒ€ªm怟L§ÙY¾Å »!´Ecf#ðõÕ‡ÀÙ'Àb N³-X¥AdÍÈpˆw­òäÕ0Û ¤ò¾M¢afÑ¢Q·d®(PŠD:¸›m2jš}3¾ ƒh&Š#oð¬UU\ðè•õ, ÅæÑhά™­C(Ë««¥ kV^ÏõP| ›Û}R rËæ„Ê™¶?è™—ÏGiSVÑ)¨Ç‚"·­"VŽ"—ioâk¢ÓH{:Ý®ÕØ<¼,Eb¢•øŒçøÜk\øi åèõhr|d#2’¶‡îº¬V™hE—FGšŒùýè®×øàlÈ“Öó¾´Õи˜"çP6•Ñ»1ijãÍó²4©L4%Ò‡þü/E p”fý&eWg¦­2«GÈñÚ³\Gº2‚ÇÐA^8uußÏê¥ÈŒLËЀ׾Îïp ¿Ð{F öP…pû™ÇȾv³ý—cá,EÞ\ç”å€Ë@îû©YaZ«Z<`rå,S½ÍHkªX52•û› Õvîiœ5aGˆïÎö™éž~ûïi¦ŸŸî7çÃö¥ëñý*ŸñÓóüŒÿ'y‡ùºÐŸU)ùô77x"Ÿ*ä~æ§üÁr7³6EîxÕÏÎŽlP­@muLüÜ‚{ðô^\[™ºoÛZ°¸Mš´Ì#ÅZ+EÕtÌϦ_†ï ã¸Aë"¡1*ÞÓ[ÌÖ¨¡f“y%³Ì'®TNdÑ•lùÍ3!p´áè—sðTû‚J\IðN¥V8}V® ÆðºèYáø¤DÜ-„oZY;0(•1Õpû3ú4…Ñj$wÖØ48öY¨››óï­ö«ºý[§šÈUjxÆKT Ï3”À3¨p°•O¸Æa’#ÊMZý¨ÕG»9¥c1ˆ,âdõ¢K]€¥(¦}^bðó4 äÞíùÀF€÷‘dˬmžuÆÈ®që4o}²•áøUâ ‚™‹ßYÓ5ªóc-îU1ˆ;Lló. LêH ¹þü/ëÂ0%¹x›\ÁV §Š»$¢–·2áÚ«P«ìÉû±èãxes ý6õ%)9\~Ó›Ùµ¯\ñxh›‘m& E=²à%ÔŸÓæ^³¼M¼Ù"3~Ë@ £†ùÔ£¯Îˆ ~óÛ¿wgL×ÜÞâôª±R$lT—ÔI¥ÕVÜ$ ` È1†['ÿa>rî£Ù*[¨u&‡ÎIiY“æ  Ìš¤ý9/Ž•½Ê:X&·NòPþe=þØ†Ê òp»ËñdÁñ`ê,–ô£úΣ’:ì yåÜË9?ß\ò;•ËÏÌØ$Û1¡Å}D1Ú”¥êÙÿjˆdv!WôCôœðŸØãíÕ8ûàû¥86v81J¬¦ qõÔÈ l¡Ž—< È–Ì=ëù ¿Ã ÿCÌõ/ ù·ÑÊ Aßý£?˜D¥âç~!~¢hôû¿¼;šñÊÿâKñ©÷ìGýšÏŠöø‰¢)?9ßø ¯,ü϶=£„t¼N…™çÀé稶‘õôi Aë»/¼ïÏÈú¯;xױ׿ló£,§ú˜í½es"‚ i{›µÎ•Cî¨]‘+êvÛ—ëÈG…lÛoofƽíýýº®ß; Èc¡äüæ@µT†;€&ûºн÷Þ; ‡-Ô´@{zLß~Üï×7ªëííáî¿w£÷õûûÞfyâM¯ŸÿÛ¿ù‹/Pt‡<áˆñÝÍ\¬žæÓf4ö6žêZïÒ.*6T¯ìô[ag§#LU„Q¨²Ü^âETÖñsìŒjøÎ EuY˜Û¥\'ˆæÕܲ`ÊÌ4WbfmÝv¦‰âzl8úÂxìú<›o.¥ðg±œp‹VE§ÌLÝs:Jj¿Ò¹(M’¦¡,ŠS‘ P¹†ð2÷ñÀ~ø7‘EàðWRn’ªùGš60 HQ#»ÙÌÕ_¬¨ÀHnPý ‰¥+Úú²»RÂ,ª%Üäå˜T´‡â?ë°8›Ø&tG“ž{­ë4'³‘4H?/¦8£1€Sr*F¾?ƒÿÃÑ[QÃ,E $W ¼ðl…A=e© RûÈ+39ô)ÊmìÞè ÛA˜QURöaþå £Žƒ^Ž€Ì„s,;‡·6é®äcÚ6½•%§]ÇåÝ^¡lQ?&hj"«tȃÏ.Þ½Ó—¦ÂÊ.xDÇß=¨ZÝ"4ƒÉeÉs¬ ›ãq˜¢‰Ï[öj´A}öÚÔG5e Zci7›ÏñG«ÿ…Õ]PÀ1h‰ÞMØúòg>SxŽM­®ìŽdJ\èñ LÄô±æí¡üMc@Š#ì&ã@¸Tl Šø\<†±o}ýü´Ò;q<ŒÇ ƒšÐˆ¥Òa@Áðø‚š{øí}ïÜPxq7v3‹ÄÅ„¿ûû¿¯C €å`]L6ÿØéÁG%ùGtÎ"=­wN¼jŽ0„‹Qê1<Ûràö3 <ܧCË óšäìùYÔÓ•­PpW…9 ./p'×ût¹CøÌQ8&È(¾[þZ~k¥MN.ºœðµ;Í ÷Âϛٽ>§ó•£¶ê‡oõóê¿ÜYõrã­t,š"çº^fâ›ú_+„ÕCJj{Θ‘ã¹[ÂÓ/ß­ /øO3>7Õ)ŽùàØ×Aäüœ J}—-bÉof¯uB«¢±›¤öJ—>ZV?­Aß|/å·_þÓSŠ€ûòëYQÄ3€O«æßSª——_ÌgÙý‡V¿ò óÓ󂛀ùBó¿å^lž>Ë8~¾žÀü!DÓ{á|ÿá«Àièææé¸SR§tÏÙ&Œ²ŸòÈøp²Ç¦ç‘³Õ& [1* =¼<ª"5 e¦’·ÜAOò¬@ ²h¢+lj)á „qÂÚâ¯õЄ#ˆ ûst#UôÓ"ÌOã.ñò:ÑcbÚü:×ýéuÉ0à°q?ŸèbH]»&qj=z/BÈØNÒè¼j܃Âå¡Ð Ü;å¥áìŠ Ÿãj’žØñmæ4©Öò ýŒô§½Ù‰ÇB…!Œ"»1ijíPäˆ 6²4·ÌÜ×È?Ò•jÙ«ö8ñõÞ3F%“QøI3ÓQ⌙eªþ1¿û JW ‰6×Z><õx{Ȥ»|ÂÝbä#®Œ…lÛäu]ªê‹Ã5»â¢ª~¥bs>X££7Ͷ57H³4}MÅFó<ìšzyBý^BU¢ˆóÓö;ʘâÜ;GO·›D·‡xžßŽóy>WZêŽA~•}ê¬}•9\™y 3ƒªfÁk¯-D¨iÇš[̨:‚ÜÁöÏF—hÄãL‘ 9À•YBXÇ£í(ÉòÂrøžlÄ}sìÕ#çqeø Ã,Y,¬íQ]Cg¹f #}¨g¢[7ü¡«Z_•‹Bµ¬ªÁy˜ãme¬WãÆù6â”F?0%œJ{GáoR¸Ó|„5†—”Ó“Å㌛¿–º¡ ýCUŽB'¨'×£Ì76B4 JU¯Qì>÷äz §ôqÓEÚ´˜[FZ÷id3ɛĥœ³¾Ö´ÅÄV×jiÙ‘÷ÓÍÜo— >$àsv¦MoìqŽ,LePž ²mâ§Ì²’|¤µy wÒ@^V:逋uÅrx[„‚•tÓ‘÷ —9ù“Ó?.RF€_ ù‚HYr~Âþ›Ð›/ƒ™X%§ÛúLã8ø@xpüsÓ…lÉrÊ›öýå±1Å,Ñyûê« ÔÔÏól¢¾7÷›Œ(”<éyÚ˜¡š;Úµýɮ˹‰Çs§T#ª•ÕséÊÞíLV9ÌQT¶ºTuÅâãé pÍ2eiE+®}=¨nÚÞÛ‚ÛWS 1~÷¿‘Ô: ODã4tA—Àš°,&u¹ #–·;rÏèlÄÓŠX‰Ôü”9µ v³m_æݬ<üâ1*xûJH&îÃü#Ç$RÍô=â ÐÁ,cÍÀ eÈ 5”ÌùR±r–“wŽŽß“Ÿ¯ÔÇÛNBfoÁäBœOªQ { ±=‰“|)XÁ1:äTžºN줋ðj°Gðcq‹ÃK7_Pç‘gk±%øM‚«ÜfIÿ® iÕ„Œ÷!±sÅߌ?¾_×µ·A`”½÷ïÿû½¯···Çw±A‹R6Iˆ›3£}|¿Þˆxi!nŠŒ‚£ñÁû~¼²…F[ºÜEåŽ~ Hƒ‰Èßýý?‹PõA¡ÙE33®¥ß\Öc™íp›íí^Ê_|¹>¬àÐi@:%}+éæeîq%¤3ޱ%¾x‰€¶i‚oq Ô,y^Jt/ºµF®T…-€\ªÀEQ4³ŹŠ+îÔU¡Š‚?ÜÜ`*dûá9y&‚–Qpˆù·pžß JZ¢=Ü$ó¦äÝ›ÍÕ§TÅ=é4ƒ,ªPãÒjÈÅP¤hŸ¥½ã¤M©ŽÑØ€–aÞODÊGè ¹S3Â(Ë þ *¹Ë¯åñìŽ+¡)Xè*¦|X¢8òÙÛK¹Ò¿íAþ°pÃûïº}àT+B\ÕÆ„gË¥A8»Æ}¸õ M PCœŒÔ`«¢áb{º}§ÂU¬†•ÀVõ~ü/̽ݒ$Ç‘¬ij‘UÝ 9{·"ûþµW+²#³s†$ˆîªÌ 7Ý 3s7Ìšì Ef($Ð]•?îjªŸúyÆî6,ñUû³èQDû@ÎE@$øÌ‘w‰“šÌžÀøõ#;¤»˜/DãaHÁ®Ç£¬™½¯5~Ê£€ŠZ‚›ãáb6Ê-‡kKʯêzË|"8=1Qõ=Éãîï!ðZ§ã;æÊ’Šž EÕéj”dþ,Û RDŽÞE!‘*Ö$óVRÄB#‹ÍX a¼;þ×ës²vcê¾hCZ ¼ Ábõ1ïr¬–~ff½«7‰JV¶09gy1™™¨ºö®€ìŠCœŠ‡¦û¾ï/ûæŸMXŸäBßpº$³¢}‚·¸¼OÒD/hТä¬ß¡ôÒ™ÿ¥æt¢”G…f Wžë÷hnZf"íKâ$¯z•Dœ‹YÒÝÇf&“ >Ö¤ 6`¦Ù$mÈywø¢­iS‘NŠõáÙÌœ -jøe–^$#˜sH’:æ ˜ŒC˲U¡O6û„ŠY~‚w\D] ŽEN.ˆÏÅ%ªT7ŸSRz9AŠRŠ{:>8ŒwÄà3¥Õ"v$6|§µ *\T­8ïX¯Æ!įÕ6beXò C-àþD×$eÕ9”sƒ…å=g"ªþ·¸„1½]žC3ÿÉÇ üOÒËcöÉ 7UM.)âšýÚr„ Ũi8]„ÄüT8s¥eP¦êçU¹,­ÙÓA7zRc  »ŒkîÌHaÐÎ`€¦JµÆ×ËN¡&!}÷®¥êÃRä÷RŒí‘—OŸ³«£73ú„Œ•ùØ*KzvŠuó°¸2)áÄ@ßbö[E.Bb¤¶œ@e$Õ;²¾÷¸Yü©U œhÎòÚrüíÀï%ÒÚ1 :æj¹ÌQhÖ)Tvõ¯]çÚy?nÇý¸þã¯÷VVª,T“œÏ4g¨2­N’Ƙ9¶ JŒfôb*p3ž/°RópdIt®Á»*üpñ€Œ÷ç²åpÜ„¤KGXEdŽSäшÆ(ȉ-ÊnÕYáúd“¥”²ϰ†MžãºZ ãäå`–-v|ì¡ü®\IA²> ?â¹5gqÿù¤ ¬Ògõ•ü ‘…ìÈ!ËÉ"JU Ó ÈI\ ãµJæ‰ô^Í-*/–etëÖÂvÎ=@ú¬à[_gÏ˲hó»jhëè¦ø ­ýËc~5¯£êÇ^DÁEŽ]‡Èý€n|Âø–…AõGÌÎæáßk#æ÷Žø0rxZ '0Q•þñÐÀo3gÿ|cá7'CÿÔÇð3€E¯gÉѥؽ *Y‡'=íNgê²o*–’Û¿©ªòðæŸM!\™D>’×àkj?8Û•8 *G±·®v2™ì&m›Nåd®NÐa*%BŠ41£[F)Tòâ)¬·m¾ƒ˜Ÿÿ“éÜÄ×Íê5E9ˆ"ïÔ6,§u@«EÙ_¯æ’i*iƒ^.>•Ù·§ TliÅx|Féçú¯Ø°õN7Ö«D㙓†´83w, s»±uøŒÓ‹=µ/™¥¸"Æ>¼=aɧÑxô~¿ßÅ}Í Y¿^oÞ\I¸â—Îý IDAT©é~M¢0ã!‡Pº™z4³Æ<ý&¢¡›¹†Ú) èÖi–ÍL“òjþÇÆ}fƒÞì OrýßÿókRqAéž”‘O› Ɇ~IõrAá_>ï~ ÷­™¦òëŠ;d‡¥³Z‚ûý.=xÜ·»Èž=¢ <`Ð-N%ž±qf‘š›²u¶ñŽþ·dyî› ¬û‡œ©ŠÐqÈ/ #‹¿~YªÆiÏRž›<1 5;‡j&”À‚ËâÌi½[•=8ΰ®:«!8ö2Rõ"QœñT½HÃ3NïZEjÔË+6?õdì9”{#³|x‚Ρ"œŸn#/UQ4¨Y×ÀŸ =*„P5WÕh0R{œEüˆÔÚF±„%¤ÇŒH$zzÃ0ËaN ‹¥Ú‚Ô_WEeÔÕRL¶|¯qZ3?òÅAEߌƒ‚Ì[.'Fºö9¼íÎܱFûYSQh|‚iÅÁ8ðÀH °©Y™ÆG3F¢|¬×)“)Õü®'ØV(]hfÞ®ÂmQ=ùéÕu–ŠQTÜÛWtªYmL~0+‹Ç$?ÔíBüFζ§jhî>‘Õ˜¨ª/T†¢ÚžâûÔ:‡Ž—×êÌð-–s ý5ïâÑâÖõ±´Ù= ÐLòó-pVÞqÝ¡<æQaËvtx¦Tê›æÄm2ãõxžC`6 ~…dó„Ë= ñØR»_lÒ¼ì›6…tѰWûš9i-úYtòƒe§ùòßÚ%0 óx°§©=}ã§š˜Çêé}ìSZ;p8 þ‚P±Ð'SgîÏÒ‘Ÿ§¹ÈdÅÃ#I3„%îOಣ WÜL`¬~«,Z·Ü{—¹o°gý•´eœ_ö^“Ã9 c';šQ˜«ÌˆU…yø'LÖ©ÔüøRg¬y™ÊôBö˜ ¤bŸ†¼'ö`=ÚŽ“g$vRÆò®ìízƒÍ4âÔ΄‰ø]¸äD{ó‚jkÊýx1Ÿ¯\ÛƒÊhÈ㋞ÿÊø©c,óȰŒ4NH“R»Ð–‡?ýtåC ¹¤–Á’6š_שߣš'Ɖ«Â€¬žç-ýg>ÕMl¦6E½‘ª^Âä|t¾J"§F#h´4$`å­~À$ àb?­§¥°2.·ž«Îr PÇ1:4“!t—9{öUÌYN?´fÖÈ ûר •Ök¬nÍcçåæ[U&„ò5^˜†XÇÝ3i9g¢MÿÚF²$à|­1I‚ýØ €ÒK ª¿xiŠëmòåÇ/-µÖmžhM–©Y_’Ü.0«p†x5f§ Ë©®jƒ3ô96޵^¨ôŽÖïjÚšV'ã>ë'Ê€ê€Ï˜Š`Lr½Øi^e,‹=:M2ˆ •ÆÖ'>ž4vˆ¨)ðóÿú¿—i3Å;Ö£36ÊþªÔ‹¿u”šC¼š@FžÅ\&ÉŒôcR4Ù¢tƒ”þÞ%¢ÂY_Rf&R†˜Å”¾@Ç«\ƒ1± wŠK<â°·„q¦2=-dä—Z ‡S…Ç2è–r3~ ô®¿†"òYòÉ3¢ZäyÆ9ŸW¼I´šiŠS×mYíY8dó:™ÚôwYÍ]ªþ5ï5–J¢2Í#Îõa2;¸^óIYX‡.õ¤…Ÿ6 Ý5Ò +("A¹öº®´5ÍlÿYî]@C”‡—È'ÒóÃvþ±í‰¬Ìßr¿£¸00sv3½£ùçˆ Ú˜H]Ÿ(ÞäI-0ÿ(¢È³ëšxï?¬JÀóŸ ÔÐί’Ð?X9øÇÒSêÖ›£ìǶóyë(púRdqÞç©uP±ôÜHÀÑÄìs:»Åcoâ*'~™Î·1°k•í“¿…ñHðçe£ ×}ò85–·å‘Ç!2„$8-‡¢-d[I>¡Ü凑yô± ËíKýR´iŠª¨–cQi=:Áš2_Mgýδ´–•ëŠ91 0ûG«v/L¤ë"ö¬)ú|ÉÕáþùçÉÿ‡7šX猪ÑCzdXªhFAӤٹDŽf^ò0JXGð32!+Á‚6Î$þÐŒÇÑ£kkMµÁñö^JjrïÞ¤ïMlû c(›š¦‹ãIb¾§|P)Œô¦N”!w9eÝ‚Ÿíí£îÏÕÎtÀ¸$™Ku±êç·ãUÏ6°›µ5ï=ýñu‹:ÃUµ“Púáµm[&$`¾¸Ñœp9ýCUïB9¸o šª¢!á’C÷Ÿ'æQ O“¡.ôF.vi°«'j'-ƒo”ê($Ί@Pd>"øÅ^mžÍ†é*s!%êh$j_é y l'˜¥ù=”¾/2iB–¹P³›Írð(Ds³JnÕ#î0R\³/Ô?!"Lð¾¢pßâ pyTÙãô¬ðéԦЉ¸} ò€ƒf݃ß8ªlS3s¸©—•)mC3úÃÙÛ—‹©å‚‰ÕÁ–†ÆÔgýGé=:÷žB÷~v Rˆv©‹C jé”Õ¡a9„:<âòŒ2Ðý’K1Š>‚’Dí@ú`|­‹µ3+mCÑe,VL ª»ÄØ#ß^ûˆÃd "°÷8ô>Ç]áþ£N8>ÉØw~âÙã:EÞ¡\ÌÞæyÔ$~,z¶a¬žê|ööq 7ªC Áˆœ­­*ÕBà[€*t÷¯’.=ÆÜ÷?èöG·Ö¢Ø.£6û •ì=$á0 "¨XC:­¹ó(â@ÓŒ­•户Èä¤w›¢¥š³Ýq¢Õq€ ôhõÃzêj÷ÃoBHJÏw*€¨…‡›Íâ´c C@ókÊ¡Ùò„oªØ6Ï)t„Æ'Ñ\­b£žMS³BHøêè+™(ìYØ>ðïàš±Kµ¬NŠËFžÐV35™.\þæZÍzè¶î.Q’½*üš‹ä‡”ji•Tÿ«,&Yã2¯š(Z¼¦œ³ªÂP+S¥4rùeß”øAÈÁèŽÏIpÙ§§[Ùí>ì:=¯Ä<© JëHbð¦¥xÒt±$dÞñAŽJT4ê©[~AEvȦ›þÙS¹cùèË×€æYÌc¾æVˆ‘† 5 èFñ…»ØYTÚ2)3_çtè ÓʤUûOÇp»"èjã¡“”ÍQ¦ùs›7~ø8'ñ´óÖE,*–܇5'ÇõR•V&#!¹$g‹—S;Ë0ƒ˜šú8Þˆ ƒî¿‹Ù³¨ùhçÔ@è¬z#§K“# gÈKaçb„˨ùQEàRP•›UPù¯•Õw£ÆyT½žùµî¾b+f71ê$P–¾‚«›DjÍT¹¢ÊtY§VSŽ+Æøð±Ç$éÛиœÈ üÏ~£ùŠC*ZÏW‡&€,lâpÍIƒ(å‡ÏŸÜšæI’Fµ!Ý,qTpgœ‹ ™ÉZ@—Ÿ@# Âc"¬rú›nÚü´ÆÅ·,ªÓ´ô9–blª’M`­éßþãßÜ8+,³˜;.õYæ3N3ã03¶T:å×Ò=Á*Ã&á‰vƒZ˜Z.”‚Û`vš™±Ú”±«´9PÜ^é£Í+¶Î  •Ó=<#%3Té ×ÒÎø¡¸÷Тö@õyüÓsÇ<ëo˜*<ñ]âñWÔ{ÿä™X*’OTþIÏ[º‚Ÿ9üù±à¼êÈÏ0s>¼ZV‹ÿcLG×ÖãºÞ>AO×]·pŸ>rsKqgèä‡oÚïDäv ``<TŒZÄ’'µÊÆ™O¾Çùr¾—iOùgŸÿ©§îL#Ló'é ›4æ @„¢ûóIϹXþH%ûôtü§C§9š|ˆ%y¬~ª¨Ÿß"¼ü(˜©R|éyÒªßûÙáùç|‘<Ì$£Š± m¢cdbø×Î4ÿ< ȇÉéÔÅKuwÌä8@ 3·œzJ±åÏÉ<ÉtÖÏ> ±³›óÇÿŽwdœ¨ËAÃ÷sk‘¼×r-iDºmd„'ÔÂÝE Ò°¬]õ©ßû3&JáFi!rB;^L¯ýóÔr ¢¬NãBNQ~h&5Ïm•…Ay­9·å‚z|áà û¯—¼F/Di ÔÝýÐYö*fædœôAP-®>ÆUÞùèì]Cª3ëfÑ7`ÖÍ´5(Dt |$Ë@kŒÒµ’gŸ©-ŠÁ”èNl°ûÜÁsú£-e[šÑÔŒ^_/5:½~p &~Ó¬wÿX½/¬. ï7Œ„F‡­Q9»°©›à Þ†48^¤?!Ü[/©ËY§7žiÜEF¡÷4ÇÑf€l¬:ãî`ŠÌvYÅŽ®vœž, à†´Nò÷œ¤'3âå#l­2èc!y©Ñè#· ׺ƒº8XÒså‰f6Ókê#Dþ(‘rÄ‚ûÈwîös‰~b™¶s|^fvd?‚è2ÀîLŸ ŇIm&ææžT‹Êcæ ¢T¼ ÛH{%ín‚yuÕ˜ikðÒÛã¨ífNÐ ÍØ §Ȱ©…˜ d0^ôÙ]ײÍZóêûpÿ{Láø|LBÌϰš`\r¶1]+êŸ#Ýó FëÝH¦Eï^Î'HÜ÷’|¡È0Qª~­™Q³º×œz; ]ºÝ©;Œ›ðÙ¶š:‘~¤([Ò ˆO×1qRÃò(¡qúÓá$³.¥XunmÒ“<žK%î,Kä‚?wýñ­ªf4ë«~óå^U“ý´äcd²°tÍÙ3.ì9çËW§6-ʈ’{5åä;ˆÄ[DÓË™¶}ç›ÍÄkÜ¡½Ü{æÌ?Q=c¤7ùË{)Îå¹kòðŒEà,ÌxYÂîôz’r⫲XPÒÍñPô£‰£Î*ÌrævgùC¦øBcGW÷Ž1®X7¨= ,þQP¨Õx=+~£€Ù&åM0˜È€ñàÆzÐ%÷|ìÛSÉ@€¥áÐ#×XOý§ŒwñaQÎÙ,Öv‡yV9>U[NälÊ{Náb4oª(iÔ>ØTNT¤»ùû|Ë7•Ïšh™“²ï­ÞlVьËå'ÉC½z&¾kv^ä„¿ÂytR¦óœy?áÉ`6¤/,-}‹µ×"7+% s ”Ü<‹‹Ö8­dX-¦f“°& 9K}JÓ!; ¤YŸD#˼XäƒtÎs²ÿuHbXÇeeñK?EéìýŸ?ýà«b7£äáÙ…öÞÍ5tïS‘n"ÝûΣ)bm‘ÕùUXì}+×eú*&¼ ÎF™ŸóNd¼åÞG¿ÑG#€b×]Hë6ñø[ŠÅTÖÆ[j‘—4mZŒ‘‘ÌA‰¨ýò×ÿUnÒ ¹L}@w.E¬KD´9aL´8ý+Á?ºiê^ôŒÈJçºÎ•SëëI¾äoP׿9(à|°ÕiÜiy’ªüÌ\Yf¦85~”:×±T9®ŠTÿàY>Õ¥RðëÒO¡Ñ,cY8Öpž Fø(Õ‡ #¥´ÌWæØs¬3wg=g¿>×YÑOý.m+ûg?bð'øïý>¹;Ïïësÿ+råók]à§Q>Î<ýŸøCA@ÅÆž¯ÇSMÀ¹ †­Æ  ìð3¥µ|2œzú&èói‹Ú²Ù²xBNƒóä]…N4égB!´Õ/âÝTI-@¡9h%¹~"ÎlÐv*e*ko¥sA2iè½7Ó¦BJŠ{3CºÜâᨕáê—á¦D‰¹&L‘Fé"ÍÏÇ#d˜w4çáa¦RlÑèqª˜×О¥Çñå“a7qö¯©øŸ]šQaÎ/t!6¡S¬uҾܷ` „³vë´T"ܶ¢ÚU\oÉ3ö.0/ÚuíÞºˆõÞE°m»j‹ó´6uÈ…¢š€(0Ùèa€{ŸmÛÔé'0ÒæNðWjã0_“Jso°öÞ{—Þå8`‡Þ¯¯_ùùŽ _^^?_¯WçÞÞïÆ›SÌè»IÃýÕ®¾o|i¶«mv\6ÙÍhTL°pThRDäíÎl>è½1-'ú··þõæ¢RWÝDp¸×Uí‡×—@ÑÙb]öMšÍ=¸Ç?{ÿR€¦øüz) Ý=ùÓAR"Å­ð9ì4ŠA £Bé@ ­?£ÑÞ*à(œY’븯ܬ»ùTÅüR‡zÉë0[ú)2\¥êó †ŽÖËr§Ìc†”ÖBЉç$Qúè#â­Ö°å˜³Ö9_fòè£é¦3Rµ !ò­ã“òTæt˜Cf.œ{nbªšgpÍÕ8R¾æ¥r,S»dÚÔ¬)¨[ñ£T%,È®îÙTh9½GÒl¨I,KĹ:f]Â7æ¤u³ÓgX«bôjÙ/,Q뢛‹æÚP>ç6Óü”ö8ŸdÉ4ò8aDgŽ&7¹–,*ŽjU•Þ‡ï•æ¤Ç0„ô…£5M›{Ê2%áΧ[¨ú$/ͱ^«~m w¿ÒŒƒ8}nÞ*]ÞÃâ=ñé´ržj˜²x½GêiôÁŒj&ö]§Îo¿Éñ'&…¾f*¢ÊÙº´±Çª ÁzGSêËUvÃq›‡ À²Cå¸y®ç§Ì<òÐ÷ÙTHôžOO°ô&?B;ÍØtTK‚ŸùJ-›'­Ç}êƒd L£€Q硚~Y5õ•Ó4*Ùç@Md°ÀB GþK("ýèØÐ©UGœsŸ²‹4Å4¼>sxƒ¢Šô£÷ê­š½¤2üýEïãc$Ñ ˆ¢É”PÍöyª¯D}‹ÄÉ,°¸kù ±£ä+ÆT‡ÃO0Sù[Ië”&Y@ÆÕ À»_MÕÓ=^þ$òÓABQ#Ç9D(ã!Ò¢êAb„ï´*JϦ¥ñº‰éñTæý#rä˦QKà’ýþ}ä­b7W* ‰Ú?CiÄ'BöÌ’²Ì ˜«~°Ò=¤2ÑË8Ç®©ö˜,€áÁ횣ë 3oŽ g9ûÓW‘-bV‘%5œ=Š‹'r>§¥D†¼²úñ/ѱÞð°ô:ð‰šÞ¤[kqÈ0Nvë’š<ðª•!(NâØƒmöŸ½à‰ß'd ž¼7NCGʦn‘Ø@ŸØçß÷’ú!m{¢ïÏm ÿÐ:¨—øï à7Ôù_<¼Ôí&×ó¿ósÀ©‘û×áùnT‹K07¹R;dšŠ÷e ²,v‹bœvòŽ­5Ú¬ã£åˆ<ùA”S­R¾2„^mSF¬ëXûØ©GæØ9B`iTd%• Ô¡¬x*Åš‰ÂB—¶:Pâ?ß:ÜáN›‘¹dåžMÐ$üÞš\çwÎ'±bKŒ® _&ÔP ?8nÛ‡qÐâ\F€O°Yu÷ÿ’ ÿëþ;=Z)lmóf@¡±Û~ÙÑÔzï4PömCkìݺuÚ¶mºµ~toÄݶF²µæÆ`kÑã~#mkªr ¿m|oö&¼Ö‚0¾ÕÖZ {µH§^ùù]^oÛ矮}¿s—váarë_^›_•wHÏâB½ `Ú¢Êq¿;îßQà˜áÎý./‡¼þòí`Û·­mÒ.·—û]_õeG»ózïv˜IS Z¿Ë½7•ϤI¿ºèE{¿þý/_^^ô¶Ûu“û.Ç®²©l"©j .ÊÄè)° Èë½ß{ˆY­õ¦ÍÅ%þë½÷Ê»‘ =Ì~ø´ýùÇ…7¸BÔèr€‡oãõívÄqØ—Ï‘–¾¢Š Ò_‘vª«ƒ*"¦Œð„ˆŸ&1?äK¸òú´GßC$íè¬U+®ò}o®©®XÃ`ÐÔ1 ¡eƒ]BÕ™U8jfãæ2›ÊF9rliY”- Õµ–^_ä$n ¯³ï¡B(Ý–>ñ‹«"ÇÊaË"öØÑm£“™¦-Ùwè¾@™º©`;8öìÈ–Ïì”´|ÜÎU.š U¥ú-[i͘3l>žJ—oh¬¡‰kôŽykñ"çÄb Í`7KãìÄ”¬Óajþ’R‹—AwUKg *!ªêÄœ(’9th­iCï¦':?¤&é‡B±Ì·‡ã*™ÿYÁQXíáœfC€Ÿeð÷¨­Õ¸–Ó@„L fRºvü›ƒÎZâ<“`ŠþLìF 'Ò¹¡I›­ôÓ ûmªJ!߯3“w‡¿’nvˆl"Ò÷eØT ÇOm~1š‰™¦'ñ14ú“cÑk1vú¨Uh¶k)ÈÃü#"Ï–JFgyFÝ#ãþh“ζ tñFñ Ï›S R†ï~”æ»hS7=VÐ?„ª&Òº™NO™4P¬5-õõÓ–×ùV\ä;¶Ü2úNª…íWt …}ð„“ÌçYÑÁÇô¢´k«žKæøo§Ô|УÀ@‘ó!‹€t7Y8ű=ÖÐ#ƒ(¡“ɘÈ¿²Ô¥,†$3©PéÉl”«á+"Ôæ›Ç¡úŒ†û¢óbm8 R6Ëá KJ¼gmv`d‘ÝÊà*¬0¬êäƒ<èÏ ]Ëù`Ú~Nn9?ç©¡<Һ٠툘q¸çc GOÒôbÅăO¥pßd d\«‘+J*SaœÝõUáØ Y¡ÐW-“i·ÐöÀꃉgw^Ö%,ÿœO]òl˜’ét <›`Ǹ@›— .¦“ŠêZ! öàà<¿†ÅíPFÕÖ™}ÅÕÃ4.¬‘6pÔŸZ<Ì'j|™Į™žÃÒ¬YíáH·Mäîä×r¹´Q¬Uù( ¼“ò"…ð„œÖS¸¶|bÛ¢©áØ”W¹õðãw™ŠÖP…³²bmïŽE$^^ “›þò’c¡xÁž“Ó z§ŸéŸ‘|ÔünJHS¥Ÿ×²^j¸b¯Ã¬6ã#ÿCf³žOeäk8ªD„ªŠò®¢4šÛOĘáõæ3Çjµë—%¿iIYë—zø1ÀhØ.·ò4§/s½j‹æiH´üä5«g*jUôgáŒÌ=æyJr.6ŸOuVâæÊ«…|S?0•;{ ‚‹2§¸ß­#Ï4é] n^æ­ÕR\fU”èDÄtôgÅ¢‰¨«`Ñ=«º ŒüõØ ŒoÐ1ÂuÃpÕ¯Wg(ŒÉôÏóŒ–RðÒÛ“~}2(ª5 çÞo|<ùÆ¿à `û?ßÿwP‰CÄî·cWß’µãvë÷û§O¯Ø·ûqïGçÑuÛ__?o Äy_ IDATÝìýÛÛöòòúùåçü=åb³Î˧OPô£÷ûý~hÓO/Ÿý8úëç Ø­ßlŠûEÞ~د_ðõÂoWåý"Ö´)ìÎöÖ/¿ð§ŸíßÞðcÇg`×—ß±¾õo·ûýçkëýŠíªôh)”FjÓKÛ¶­õãx{û&&¯¯/b8¬÷ÞUÛçÏ?lM7½ýM!MUƒÁnýýÖaf íªhFÅf¼ í~ˆ Q¨´ÝlÿÇÝ6ü‰ýnÇÑìàýøao—M7=.òöI¿½¶÷í~Dz”·wϳÀ'BhçeŸ<({ëLëfÐß»ÝJ·Ð¤KÿòÒ>½6éæ.ƒ ÑAã·÷Ã&ÇŸ^Ó/cÒbë„#›6‰ ¸—or»× æm£IÇñ³‘"Qä%U綦Y6–¸I$œŒÆZ‰ÅªÛxôø,!|è£`6¡âC$2Zts…kÌàG¾jœK‰ñ2#µo‰Õ ü™%Ç­-ýûÉ/ Ü^® Ú[x/NþÐÑG0+$UQùŽƒe0žDÌv>3/¼†ˆ µ¦†c S9íK˜B:U4ùŒù*ÆZšQ” " ¥ù²ÖÓ ã1Ñð Ï@Ù¡:Œ(‹goàƱˆê6ŠLT“G@f]gJ3“æ9òGUj8‚¹'þ—‡÷Í,9 ¿µA{8}ë'±#È 5œý¤©uZª×= †ÛÆëÌ]bVB5±IKƒ-iªqeø`|ÚÈEZƒY4JxW¥ªHS‘­óD °È]¥ÓH‡»»Ör:ø¾ˆ^º‰/“B»Ý²ã#ÞO¦ú‡ ¥úºû-Ú¶MvÜ%Ã>Ó»@Ö¨">j02ù3¿YµØ“˜þÏÉÌ5–Zµ<¡IpÀÆÓÖ:44Qä-Q SÚ¤Sì0mc7°M¦²uëÉÆÎN zBîPÀ)@"Ó@Ä´ˆäA5„3û!|S54Ÿ¡YŽÐ´©fÔ ,MjeÒœ‡;QDH8UÆø.ðªiœ>öaMô¶l±5Ä8DOŸÜ/#›ájÎÈ*xÿ_­5õ&m…u3Æå\†>C˜ˆ*;¢'4¦Ü1ŽžPj^Î)ç¯G¦×½*’Dã7W“¾|Y°Î7Xg2ÇïV;w¦†Þ¡Õ]£…ÞÁD·Í'“Ï&tIÀë8aMÍκ–¢´@KˉÏJYhLaýŸOu{Åó˜POLÓFÒzï¹¼c‚Ÿg8À$cUñ÷µ\£ôf\ßX<—=\ :—% #ËàôRM…Z‚úQNº”ºž¢¹8…‹‚eÀ'QŒ%ˆ<ˆ@çØ¯{üœ-“I߉¯EljR*¨4›äÉ„þU{q4ƬVÄPY–‚äD€Ò}§DécÛ™ï*K2<°š‰ÉUh›IÈŸü\²/nü˜6„ôÅD4tÀ…Ò͆ς¢YžìO§ÿ ãøº‘ ƒ€Ùœ"<Ûœ¦2+{éãÜÙˆ ÃtõVvïmc ²›1Äçèf„\ MµGy\Ô.Xv˾ýãçóДë5¤Ùÿ>››&Ëh 4ÁÆv‹&œ’”–ÍNíàÍ­‘Éè€ñ‹¢³{9â¢Ù9h~Äì(%UwùK*y<ökgE–œ!KãùTºÃ÷,õ©½å§Ï#ÕZ&¯„ žÉ¥ÌÁeШÊÍoþDù˜ñŒ¥É}µEIj¼ˆKÙx-&2qu‚,ý™åYVÜe·QYJŨ»>\˜VñáœPkóºÊ\ãÄ|(ÿ5Y»àܪº]ZCÈz´IŸ üVsÙ~ W|r!Ÿ ü)]tsÏÝZ8º¹€Ê Çš¹8¡ºö'ÐÑOüE“ÖlÒ9X`A‚™2^CG¡Ù?©J4ýŽoÂM̤éìøãÎHa8½Æî#ÐÄñÍkÀºyOj&>)~ô– kÞtêf7M œp¸ÈÖËiLl–TLjx®'ð ÅÓ™E¾ó‚ý×Kô­éqÄÕu;ìòrÙÚ.MúÝn&Í@ì¢8„ÚåzォQºá²]ŒízçËëk®·[—»š4UQ! *ÇÝn[ß÷‹õë·o÷­µO_þÌ TÜûå—¯_·————79¾Ú×ÿüËåí'ùzÁõÛ½ýõø·_ÚÿöŽO½èÖ¤Ùõnb/¯¯/[3a÷®€N/¶nìGgùz\qõa6ºo—íuÛíè½›oúíPa6ö¦²©šôã¸[ï½µ¶m PªªPMÕ¬£é&³ãÞ¿¨üôúzíz= ¶‘¼Ýäz;T/±/ì¿üiÿËçcÇ7£~»Éß±¯7y3Ó¶}y½¼ìíöþÞT¾|º4÷¶Èý~óLjiM6ô—vÿùÛíu‹ˆ É~À|ßíækòuoŸ_¤cç¡Ä?Þßͺ¶}Û7mÛî\‘ÀíZï…ÖqF¶ÜÉп 7lšwMLÊR:ô‚Ì*rg^û&¦lSïTÎADÆ€ ¾3k2CŒóÆ'†±Ë¨Æô Å=_Zo‚“¦‘ý¹ ­ˆ˜ª[7´7àÊðпШ¦¡BUrXjá?IÚûõ࢑Œ”«I²“LÐÀæŠì ¨³´#y'ÒTrkD7EHžc¿š¾*^-…[Ó=w¡)S5…SD,:ƒ~AÄ¢)®3†ÎÝ$º3}"$gñe›L1™µÞ .xR(–~™¶1 éåS¥uî Š:ºa‹…‚ÆNkÃÃDùÄÔ£:ÄDZ"u8&pœòq(²AØU)Þ81z߯‰Ëï±RQ#†k‰TL9YÕÿÙúYø`Ó¬m‘¯G@ÝØ”¤wöh©g6–ÿS€mÓ¶éq´¦Ûå…½ÇÑÄg•"âì܇nåKŒÏ¬ˆ¿ð4DŠœÍºßÍZÛF±€T „u÷¶Û°.Ufn>![ ƶB;l¨ ¢Mz`Ô,9! °«h’Õ^_:±»ÄÞ¤}ÌÁVö Pw ±ZM$´§¦|WÖ"Y£y}Ï‚BE"´D•¢/ìa MÁÁóqÓ›®UE)]h3áQNWÐðhކª‹';NàhNDôo£Të%Ü!ì#i’•Á`@$XØ1Oõù£FTT@eE>ex¬Aò×›ªs-Ôášp0Ú 0c6N»ÆbüãšW˜ƒÒ/`ì´Å, ¢uŽé­ãŒôÇjRÊ—‹uŽœ z¤0érAN-‡Å¼q̨д"ίŠx~xã)!‡¬Øüò•ó V̬Ùz¿f'ò#ÌÂöüµ_Fž5”ñ …œâ·¤}h@;UŒ’¤>|<\ @XiȘ4E5²1Õ¥^~!0ŠÍÖÞáb—X¦S&fdÒX@Ys>Øü^Þ8±¸Ë«y•çôT–ªË÷¡uÏÎM|d†Lem9õJuFG…UÖ çZP„ÏqÍΆž¡ü|É…‘MTéðíñL\$Ï<“Y²ZÅ?ÿéS^ìq&(1ì¡—›4À\ìÖ, v£œñlëõÅȾõ ™KÜè :Ì8\®¿¸”&ºy¡vtr(Ô:®pIäòç9'5>wí[ž ‘ÖûwîhíÛ/?0Iî3Î$.¶¿\JMxèüs48vð¹X Ÿ3µ:`YÅëV³óÑPnœ˜²1 ‘|Jâ÷_@üa¦(¿Eç€CÛ)eêãÅÆ£çЪÝRΓNŽÈVÕõ+Ègê1æ}~ô“è&«|ÿÀ¦`g<‡9á Î/˜¾%Œ½ìOlõ²äðIêîZ”ì¥ä!œÞ,¢\ûËôœ6- ò¾â‚ ZêÈŸ—ÙŽF¦J%©µ>IÎo¤4ÄÏîSÈÉ6*’¦ ä”Äcø »–èÃŒÚQygÓø¬Ëy“ø@úXLJÿø‘1óð7&ú|”ù1,»äâë%EúÄCЀߡÕ?ü»ÞEDZ›³í%ðǰ€žçxúœøÁK=#¾g0€ê’þðð7EÎÚ¤Šî“çß«ªþþYÀ:<>Œ>°Rëf·p|¤Ì§e]>X%T)e+ZÐIg_â$Št 1Ú‰£xfæ*Kø†År”ÔÚâ¨ìÙÆ!57‘bÍ2×Ïdr‰sˆr;9{\œ9o]ƒÊj“)'Ia½ÝC×LÑ&û4ãÌTùã²Â5l\¿fõáø8„Rg6~ƒñâßeÐÐ[“ÛÛ6…£UìiÐÞšˆu;Š&r@hw¡öÝŒv w;úí®/û¶¿˜ 'v^ÄÔÚK»ó»îª]û·¯×íó§¿¼šÊõ¸7Á•Ýa#Ýö»}¹¡Ý¬ýçõý¥ÿã }³O"ÑÃ3[°ãýýý°¾ÓZÓ—&G§ðnÝtÛš6 Ö¥›̚˭ý~qÆ‹î·ÜTà Qïv¿nfU;Î}¹ÃŽ#{k²ojìèTPnì&·Mtkûa"v¼îúy‡fv‡Pä¸_ßn×Û~ù¤Û!¹ÝøÃ7¹|ûDz_{·¯ßÞØ´µÖ¶ËvyyÙûÛýÚ„fªhlM­o·ûÍ ïr#M䨴ñõ•— ›XkÛß¾aÿùØ7ÔÀþãçËeßÐD p›ªjkÎEØšê&"·˜{»n‡—(-#¸ÉÈ3T[úC4xÀ:êC‡΋nn¤Q 3Œ3o®[³|W¬1¸;R›úÝ#S1Ó4Í%~ð¯“(-¥!¯M}`±Ýï6B¦Yl&d'ˆ‰ ¥‘˜øLÜlÑÀ•=ef†Kdrªcÿ¬ùy`2\è Ƈ š£ÔXv„– )’µ’@|²[ž› EÜ £L>,¸£Én•ÀË*ˆ&æ(íœÓ…ƒAL†é¡šȡÔÐâRj Ñ–Ë”xœN¦—Æ%Ù ‡aÑÿ ÍÆª5µQÒ+ÁÇþSÕìÉXä K«”gÜù\‰ 9H ŽTЪŒzÑI IÓf¿ÙpøE"ÅæùµaœóË>* ¤¥y+¾¢˜£ŽîÞïñ}Ïß¶ÖMÛýz“nû¾«j¿ßív7…¨¶µ‰ “²ÁNiMÍÈ~˜¤Ù1"â‚z±Ù𛆠±S¡žÿ÷Í)>¡yÛ(" ÌKì èëy³ÜáëJB(,¼%õw²Ð~P÷È':J5â²-£ê¬]€çš€®³óëÙ‘Àï5€>¬ÄCx©²“i•Uóz`!«c~éLHCTù’c´‰YÞVf,Y®Bxà2©c J­d0òlc=9¦Ê’g© DéD¯]àsÝžMLçU; ÿ€çÀ8W#áʉv7~ú¼§© álB¬°¡f"Æ@Ykž|ÈNm| 6g#Ã!ÍÃŽJPGƒŠ—3¹©UÓŸ]FÿånR Gß4&ÛTe'!ÜD¾8)½w/<©cª´+!÷Û»pÎæ¥Ëý~;¹ß'}|K#íR+ljoÉÜŠÇÆ'CÅCÖ¯­ã(ËrW[×ÅÓy.B{Jb0æÊ^qÁ,"tåá±ìKE †¹ÂÁŠa4£“ñ½b¶£<Áµ^‚9¬ÅRÃOÝÓª4Ç-1?±¹—î€bÅ?€F]MIï=± —ÈhM?,VO^æÒ£µrþë x¶?v³tâÈÒ¨Œ{Ýc‹|’-xGÖ/ð§|¢›ŸãJ" i[ž)ô OJŠð«jã£æþ¿Ë3ý#•ßóZ±¦E¾3—ð¼ŽOeùß#ü¯jCyä®AªûWåHJØh­‹L '—– ðüì@©LÐï#Æ`qð(‹u"‹"Á;ªn'O¢¬Ù #.»÷4 xÆ\–~CÎ7hB@[PƒD_ÓÍ€hŒ!Dï@DñäÄóJTP‚¾Þ]l&[;ErÇu¸æG1"µ&y"Ëð»4ø^€Šš#æG¾ÔÚœM-r*½a:Gæ3Áþ5™?ç€Ø]ÖoûviÀaÇýý.vˆ™ônPtªA›6²[aÿëÇû/?w3Þ®ì»ÊÞ\ø4kfJ^¯×——Ýä;„ÛŽþi³ãíç¯ÿh/Ÿ^ÄÁvÈýÍn QE.›n*vÇßûëeßöÝ®ì¶éeëmÛä°ÃŽ÷/4µÞ›˜4î*PÛ7½÷CD²“êú—:NªT1;¬ßnPð°ËeßuhTt•Þ J£»hØ6Ùwi¯ï7ï$Ý¡"·.· toÒEd§ªÜþþ×÷o_å¸7­ãxÛÄ^ÚkÛØ{§ôMƒ°¢Ú÷ Ey·¾oíeSÞo¶&  ûË®›ÚqˆÝ”=å[c7öƒï7¨6•ÖØT.»¾\Ú¾‹Êýu‡}ë×~u'ªk—×í§O›@ͬuÂMj n6Ñûæ9 fR_ZúpFëô ºhË&³qÑõcùc9,-Éde—ÅݲtŸß4Sm£{«tŽyGFÇ^Ì$…ÆÁpp*‡YÈŠ‰ræ4cldü0.j½™¼jšïû­ðs¡WE[«¿)½˜¨< fzw8ý§æ?ôÞlow3R¶Í=ƹ‹G4‚z%òx £Kñ•­ÜôÜüRGèÎyk™ÿH_3:Í誾Ý ô‰Œ‰¼¹ûÄ4'¥¬Ø©’õ L}5¼ì­¼ÀlZó¸+˜páø Ù'–x–ÁdÈ/ÖR(ͧ„Y0tÊ»:êªd3& ãpèI}·”r'ŵN“h$O&$ÀF6ÉÞfše dõ#K\UÈæì tüT^Ä–[F:)¹ jËNW D7°Ã.*ŽpÙv»ßÞßÞ ¢ûF²¿½e±†Bèõܘ®~¶Å!ë=à‹e#f—/X§/`Ù‘!J)F3Ÿ©…µb"~§gNbuÂW–mÞ¦Œú5‘æþN33G¦¥º»‰a´.lê“O=‡ !—}›i%æ:¤«îš‡„ÞûTÖϦº[© sàãcpªÞ1 fìRÌŒ¤X'D±Ù4ü gNJD"ÑSBÑ6t±hãØ¤½>!²‚þÎJ–lL´c9„ß¶ÖfòC©Ÿø¡ÍkbhŽˆ'€¹5v{Ê6z7™ B˜GøAF‡cð‰\-ÖY »Õo­qŸ` âNñPL«æ"<Â?õpn²èÕ290˜‡ûz4^?ÇÌë¼MÊz¾ž´0þƒå¯­eße{±xÍèN¡²ìu!ÎÆmœ-]©Ô•Q:*²«xØ1t Ö¬H¥ÿgbl¸¡dD¬f¤ âþ;up•Táòjx*ìª2nè.•bÓv^æ(€¯õ*â¨ó´-[Ä‹Egz𠝉ŒYU„Šùöñ¦C©Ð‘¥µPñÔµ7ÎOþ Zý#écÆY8¢BTª»|pÈžŒrrΰ)bf‹Id3IQ4¶i¼p¸ýŹs·o_ç –ÞÉ¢ ¡3û¦Î®¦Û!0:37µÙ•%Ϫs290 ?‰R+Å(Ò¼Mª¬3ç“›[„âLÈ^4)É ‡³³ãÁ¯˜ áÔüY×ù“|9û ÆUL9•ÛÖOná`‘RO;&yœmÎzá™õZž åòbða&%Xo7)E¯«Š½È{“¶ ¯QSËÖºüÖ:,·ï3‡ó‡¦áºôe13ÓÂU²åõÿ‰æ³FËVä–ýü×aÈË_êU†ç÷Ôö)uþ,Pžv|ÇŸp²–&”Ú2Ä0ÛÊ!ØF‡üò–õ›cy´<'có#ÕpÊ¿L䩊•°.§Zòòã?!¿?þ«€¥àIçÐïž<ùkx(Uþãò‹öŠßñ“ÎMÃßýBùëÃ?Öü_#iaÇžÀ‚Jl϶7x ö<í2ž›¨óGœ˜4J-CÁ’"CÝÅŽ^4Ÿe¡ýœs¦Ò­ÅÛ¨ã6¨ô™¸7Ku¡@›!ññ¤ÐôïDrw8x¼­`Ú#QK»UÇÓØOϧ »¨Š’0çŒj5`péksC†:‡u¶- în³ŒËÃu+Ëqn.0X‹´ðÁÄgiÖvË?fbõÿá@¬É!´MeÛÐïÝ„­Y™;ûaІýå‚Þ·ÖØT7EU·…¼líúájQ#•¦vÛUmóþˆ»‚Øø·¯?ýÏ+~ú‰@Ûö]»XçÕ¬sÛ/[S­™Š}ú„Ëe{¿Ý»©//û¥Wâ8^äö~»ŠÙ¶]ÌŽm²Ùpéf÷&wë~Ñ€5‡Ò«ô£©ÒÌ/®pÇA›[¬åÞ%!½óÞtÓM//Òûñvû¥é¶ïûFSÜ»›‰Þ»K)M·ãímë×ã~ )¯_/­}Ú©j}ß ï×CÓÉßÚæ6ÿnfýèÃ=ïôŠº~±EšË^2 Ü¿}°¯"žã!‡ÙgéÇÌÆTÇyLoiíi¹7Ę>¤Õ‡øì´£4Õ©ü–nÔ±œHSµšÈXú¦¹3«F›I ‚ JJ³¬´¿>]9¹Ô`fKÂÎI¥ù؈¾Ë¦¤ço’Ñ™ƒ,¯¾«=cÌ“T=§V¡Ñï"k%—ß6Å#D‹ÚJ…ÜR(°ò" ?œÓe…óI(™ÂÍŸqË–ªÞÑIœÝB ²9ꌵ7rãô­Ë‰”šúf'ê<%fl®kíÎ"mQ΃ݒ.Uf(Ö§2õœÀ^ÅGôGvÀÒ÷º_Y3gÅè‰bœáâÓÐà-B£ùøX(8Uo«t ZuË“¼ò"àL"Ì­|@ªé4:$ƒê®â£L4¤vÍTÊ3Çài>¿ÎîM¢_j ÌNóQË<¸ÌfV²¾9ÑW,tS âF(eÄÓpr >J¥Agòdµ²@”ÊÇÈÕY1€Õx`ŸpV—§¨UÒͬé<ÛÕ IDAT´‰Yý•KM ×É-÷(ïêÜc?»¼žäËVsκÒëÛÆeF‰U'—[íÉb…åÅà¡¡¡H>èÙã#Ñ2á×(œþ°¦¾‚˪ ÿèª>¿Þ§mˇ1tX>›å”ÊÔêuÀ§rìC/ûøã `ýœð8Gª£¡•d“ô¬(+_hã.>>T‹-³üH±Æ¯~CÄ·žQ€_ùóÿýÀsµÿ±÷ùßû~q|½Ìþ{æžó,3óë=~3#ðGÌNeçëH¶ _á8…#OQ ŠÒ_O¹#´«[2p2»Ü‚ NÛTÿÓ£™ ï^8@¬Ó†Y^I×ýu òµvx¡œŒð•ƒÄiÛ`åGqÔGž¯Ãì@œÝÅA$W]·º"ÖÓçLæµu|ò³¦~€55ßúi¹ Ûfµ"TˆLDìãíóL9Mf?"šý±Ó«?p°«Û½Ù[#äh"›ÔØpôÞͼio—ˆ÷Ûíòòòúéå—þµµö"{ïØÖU3¥mèh¼õc£ªÊÖìϯ­)õøvôÎmÿ P´½wªvå¦j»Øùå÷M¤Mš]ô}×vÁÕx“Û/Ëe×í~}»©(äPkôÃ!·f¶A“fÇqˆª¶·­©^¯oý¸u»P½·ÍEäP€ÖźñhÜбø.W»}kÛge‡Ý•w‹ú4( ¦°MZ7ÚEoʦ¶‰÷ãÓë—ûýív¿¨·ÿvãMÌvÈFëo7öÞPUÛUÀ뵫¾\v¨™ÜZÀ¸aÛD °‰pãffTëÍOÚ;íúíë½ß!ªM½5¨ft‡"íBÊÇþrùòyÛwùñUÿüÓËŸ~Ü_.mƒ:æE”ÿ8b“Ô ?\6 +õÁüL'8uÄ0ÚÕ.ˆº<ä»é8xpTŒC‰áúöl.8z\3)K›ØƒhÌ@“vÀQޱaÈkP˜Qý%#UÙ±¯t[8¤CUc¹«×éUIŒ§B¤AÍ’CS»…ÆÙLª~ó¥”9r9,Ä„(ôŠ5‘`Û‹“Q|öqp’œIšYž6êA1dgƒÏUŒÚltâ*4„ù°0‰œÃ[4ÛÖä~hœv5^šŸ— Ö;l‰S€E'бlÑÜVíñ  *Ypå«™þÝq´ؽ>*é0÷"YMA „Ý9ýleÏ”ÃïZNà]õãj’·Éˆ¹y(%‘3uïë3ذ*£î/Æaãu{zšÌãm¤*,‹\<ÀKT>ŽG,ãÚÚ ²ï<ºÜÞýº.µ& éFš†)XTÑÞ®ˆAi5¡ðÀR'œ 'àçRPÿVã;‡òQgfC>™·m­|nŒu›Êa~}+ M`,Ù‚zTùÝ,ÎOšõ‰F£¢‹òð›•Úb~‘€ýØm›E¡aÅ7R¸ííåõUÛý¸¿ß*#¤‰6bÁÊúÈÁÈ*.ùø`Õ[£ýÕwsÍÅñ÷¾I1)m…ÌÕ¢meWè¸ãPk.¨Ç\”d/Yœ˜RLèHgj¶°“þõyY8Ì&tUóöm­Õ-fؘØ(²„Yg<&ÆÊfQ€x¼(àêJ‰ÍµQ(Ò,±ÝpøÙ<ûü?õùùiMò FÓ°Ðû'¥Æ†2ÍðÄ•c$1Dz\ƒ\ηx0ÚÝ2}Šñ¸œ¹ô€[û¥˜ ¯xeÓÂ)OknÌÙýƒuÀT@¦¢>½¬x} u)7E©^©ÃŠxŒ]êLµ¢ŒY̪r:…þ ,¶¿Ùšœ/©=1Ø<áuJu&?шþta3cƮ㢜k[Ý›A3õ·g Ãb³+‚)Ï W›)ò›xð™ÕrƒÁYÊC¬Õ’„q(_x?¹<”läÒ Q&j1»–(€© ’ ººLɪʷæ£0-´×E„Bž$±'‹âhF®Ú˜_ÏVgáþ'>~…ø#‘¥wÔŠÇ–£åG¤âDEâRUSÊ`§? 4°±±"¨7Þ3­“H"¬y+´bØ0¢oeÄG«¯9cýù…*-¯èËøýízðfw…Þs¬3ú3É•óµLͦ€OFQÚ,NA5©–ŽGU‹þ hõ(ñ×õ¶†Žæ*ÊX\óu¬ûçѫťbæ©wC&F퇴.üµßžgœ8¬sÂ-ëîô§—Ÿ+o¤Èò^I¢Ûìá~âmàšß)¹¹ñǘIJâú–¿R„Kzk1øXs µüÅs·ù<.Vßg2Ý?'£¯!ÆZ¾£Gìã¿ø7~ ž&-þ©ßˆg±¢ß1 þùŸòáŸÄÓüÑ8àÀë?Ô?aMHÌ'–¼R-Sšh ZŠ˜­>KÝHa%žìƒÓì˜[úkë+ajó}‘´Ä–!ߨêÏ9%f® {¾yÛdIA±ŽÖ8NCÚŒ@q11õ LØR ²¥ûˆŠñ<t4=ÊX¥Jpb‚™¦Ö¯¯\ÁKu[ÄÆÏ[¿Ç€Á&gúÛWèL‰ðÛÑ¿h“£ßn7µÎÛ½³)»6\”Çq@ôÒän]¥¼l{kºo¢zlÍö¸åÍ-•ƦÚÐ jl}“ëÖ(ý¾‰4iº­7éͬÑìú~yýÔ´Ñh4ØÝ //;:ûKƒÊ±Ë›úѾßì@ãíE^Þ¶þyÿ‚¶_…Ú­õ÷c¿èѯÚååòÚÚé´Ã”ª‡ë®¯›î—ÖŽûÛõ+®ßLúÖ\àQA×Nˆã Ýn÷÷ŸiÂëû†Ö¬£w;:­K?{S¼ìûý~4÷Öãn¸“¤Þa¸€v—£¿½óþ®¼í{3vW;ì²Û‹KKMÑD7RLL…Äf»(p¿÷¦¦&ÚŽæ§Ⱦ]öN;ŒÇ±·F›Jv¡4k.Î[ÒWÂÃ|¼Å]u¿ï»Éõüõïß~ø²ýåÏ/ÿöÓëeÓn¦*›*ÍÑ.òµ›EðE-´kQŽrJ79‘¢ª¾F5„æÈbOƒÃLÖvì*-„Œ¢"(E„=&£†ŽÒLTDZ³œP9jJ³ªã4ãw7(.ƒü¾»{ DÆ –·ÎO¾ˆD‘é'±•nRßÀM/ÇùT¦¬ ñK_¡zŠõÛ8ô¯dt€Éts—‹L$²Ò­1\ߎ•9}®Ü|ãÔB;%½ßÓy1 ½uu#t>b´mQ*Ê`fÕå3,y€ù Úš¦~ÂebÓ3!/ÓF7Â1q‹÷ˆ´4ÂÍTÇ|†ž˜~'£y¼lJN‹Ü ào†ˆ©4[^©Âa‚ ‚Uƒd³ÄHgeýx!LÔøxÌG~\p6. Ÿn%¿¾˜ßâOhªv&áÂú®íÝöM^ö~;x»I§-9 ˜ û„´CÄèó«MhÀ1<–Ñ™¹ÃŒ÷ňDGJ¢lb’™eÔ,éZuc#›zu³Cï!PA˧·-'¹.²©Z^9 °[²"Á1fl'Ê BÊðq„_x¦Ú hð:à#R΀Æ  [Óýry¹ì›6U53^‹³L)ÀK…R7¨ÒŽ»Eª1¢.IïröºPëÎZ‚(š*F¶ÓÆÔÉ|Fjª“ËI­O!{¢{ \äaϳ׊dð™Ü¬Ê¾…ýbO¥Uƒ43¶Ö0ŒX.£©´y[EaŒ _Ô8™Íu0ö¡:Ñ8H)»øô誈A–+ûÁ¥³ÑZÓM†4àÇÉ7/ÃŒýbÁΗJÑyd‡,ìÌbN¥ŒV®1_“½44г<·Å|Âù§Ï4FÖcŒ“Æ =‹%ý--`”˜0ûG™:’å4küÄý‘µ°ÉÄ|×ħÔÖÎ9ÓPŽ©°¸Œy€¶\ãld³dÉ9 ]AÓ‹*ÏÝêå#|*†ð¡µåì–ÃÄÔÍ1Í”°J@€çs OI¶2G01¢Íg_¬@ôe-ŨÅ{û@`9†bñg&‹N†ö=1ˆs×záYz×@æÁi0âÆy†uƒªÍòPðC¹Kyó€â¤.Î~$ ¨">+n1É.÷Úôb{SÌ#ª-Qòéóg’b='m2Ñç98Ú¶Áºù éå:6TR( žd‚šÒïBsœhˆøÊXÕ˜-^¼¶¸ú,Š(4ªâiǵ¹vúX7õL‹›<nîÅ6ø#òöþ6<ù ;b@dý¿Ì½ë’,Ç‘¤ijæ‘Uà°g8Û=+{›yÿGÛÝÙ&Ù¸œÊ 7Ýfîn™u€hiR\êTeeFx¸«©~,=¡‹Vïp<\‰y&GÆJñ…,ÌaUÁ×Þo¿O°®'MQà„4ŒŸãÏxµa—YžÊˆÉÆ>^R £Ô+3û‡#ÇËÑL Ñ$Cat 0©ÀFÙÌØþÎ+J•Š#Âøü/Ü—u,©e媮󺱪U£<F´A–£šRŠ P£.2ã›XµôJV8Ϭó™k¼>-†x!o¬Í Á¤:ªÇ:?ÙK| F=.hmH%qõkÉ&—sã `®Nÿí!¾~Ý4¦ •n=/|< ›ñ ¤ÛžÚ¡Ÿ½û¯e`ÖÎX¾bÜ¿¨Q^Ÿ¨K%ž#»ô¤zˆwtáåÍÙisÀ]„xîÍDù¯{÷4A ¸n1´¢ ~Bœ©³\?—à£|Z°ù…?ÿŸ?é†WÿÇoŸü2ÿoþO޸ߦ[òéšØÆy ]DùF¶ówμúyœ;òzIƒÛÜØ,8KóMgaü¢’.yEu1í !`êÃA/ÜÉe"ÄpO¤äT*ÕâIíAïÏ?)òÏÆ^ []S™¼šæ½|…3nT§)Ÿ­½O g{À?âÿúÃï÷ƒ”Ç]µÝT€~~ýéñøPÓÛí&æÇ)BÅÛÖ÷ŸŽvè*ðî€4…Äy{»½·ægçyJsã ç‡Ü·Ûû­Áñh†fø)çABLÝ{;ÚûûÒý‡ûKoßÙí8ø3ÔTšPÄU{?Ôìl½7=ü±ŸT;¬¼ÛÚUŽ&*÷Ö³Y—{'ÕüMÎfþõŸTÄšˆÐqa'."ý÷þã×λÐíhòñ³?NÒéŽÎöö®Þì<[Ó·›ýüñ³úÇÙïpŠtwi‰µwÿ¹O…C`O¯~˜«ÙÛ»4XtÒÁlïŒ÷f7h§w4Ax±I6ïÍÚÃýã~WÊa&;{â½;é€AàtŠzP=ÏÞÝåýívMÑAw§Å_?ðßý/ÿôýÿé{møò~üé?}‘e`dÕTô§,„wBüû¦€x€EÕ4† œ ½Oá íH[mbB(¥g_nn•ÇX/ÎÕÚ÷jã‰}µg€jëUÙ#üçÊ@=8Y©éHÅG˜[„„»(œ§x#×ÁÄ!šý»œž÷I…àØüåséu •\Žr}"ÖT×seêgGiçxŸÉ°ÿs”ºŽÌAPÿ£v@§ ÙíF¦CP13ïdïÿ§5ƒB©Úš{ˆ‹™S<°Ë>›Ê>rÑW¬ŽÛñ Šr¾Rl–]Û+r󧄛нyŠ»:R^—E™i..}¸™ ct• ?ûe )©Š g»Å’[ ˵7.w* - }«À6â0óØ=¶3|"C5WU†:¬Ë1¯Ì&?gv˜JdhF玭è÷Súƒ¤hðÍf"þÉš:Üßyú`èKÀ÷=¹ñ: ‰‰9"I1•쬬d‘y|Œ\ ˆHnÀ„Š ¬nƒøt)Ý]ÄSa –L¤Ï箚ˆÓû@Ûxtà wŒôȘ¹E¡B ‡Ã ó&Jf€ Ò%¢ÑØcL ¦1+h335U÷n=s>3ï¹áÒ¦Í(ÎÞÓ+§X´¬ËÈaRÎᆩ¼Žsiw×$Y1p¸ŒÜd¨o~,b.Ÿ¿¶7?e+|ÙºÄf¬2 ·IÉöwÉ`'ò"—J$«tXã9¦}9˜{/M|Û™f™íÅ)œ]™W™2b”oˆ)”rRTCæv ¶$CN¯×ܦ-é{%O‹G £Pd,¾ :›úàS Ø<Æ! —v)»—­5ŠodRÊyc´1d£xÍßOõ¾Û:e: ²ì@¡„+D[×D>™¦äv±Ý/‰%;a¬ïpå˜mE0{g"j3 ηyo—‚ _°Ÿ]ÈüÆ ªd¨jNÅ _ÂO}ÌR8üï=+ Mü'¸–¸ÅÈÉŒ+b|²ñ_ŸØD ^€ Ë}ÚX±+±ñÒgCìB§_%£ íqZ–8dE–ê̤ÄõbX·jjf=¹Ó汿L”ùÂèJ Ì÷ßÿ!°1ÝݽgBž p? ·+£8L¥æî*€*Hí>›‹XGùLà0ùùœ¢f¬ËFÜjt­gø‚ù¤Âê {¼@ÑÄúcI\Ï›Q¡’?ýšgïØ¥jîØ0Ü6KêÌe=³ÆÐM™Çu$~s>cÔ2\Mä[?¹WÔÈ>ëÙ}•—`\!Zûv¢ýª¼˜3»QS•—'BË|š`õAäÝ6à ë¯ÜDØê´Þ¶õù_>‰£}.å˜@M§äMÍ—$\uÀÖ20섹˜)žæ5ùJu'¿‘ÿ»|ѯ²à¿Úod6^ëˆû²#ý;ÅÁ×ßOÉÒ_-•—KÏ­¿òÅmµ\hGþ-¿µù»EŸÏÖ-»{ÇÞþr ûX([Æê<$ D¢(ÝsªÙ+„í2Õ¥L`øTJ}<%Ë|‡#"͉=Ä NMF.ÐHÍ}‚tˆÉj{ ®Õ! my>Ppi!)ü­YÖ­?ˆÊ›.ª‘ò…A›=PVÜð5¨Ì³ÜTû¹iÍ[šp…ýkÓ€\ú‹´d8äâ»NŸ>mzŸ™0ýE)Ï&]@c·î7ÐÏÞ?ähÒp¨N8µó@ëä×û×/ÿåO°îýÞï÷[»µî‡zoNëçM½ëåCünh§UÑ﬙ê©çíhàW¨P<ýA=DnúöåP²|üì9ø8¾ÜúÇ_Þßßçéâb"p‡ˆû½‹¨ÿ,NշƇýࣟ½?~xt0³Ûí ðÑö.ÝÚÐÏ7½›¡Õá T¸?î÷€ÎÓnÆî~WyÒáᇺÃ{lö´? MN¨ÃŽÛwí<ûOw¹“ì~šË›ˆ;OúÍ@§8MTT . ïoÇÛÙÏî÷‘ìWà÷óì?ŸªÖÔ”0Ykª¡ÕëùPiÅùAïÚ[d|µ»=N{ˆ~ÙuAx[ÑŽöîfÞÄ$3—.¦f”¯=þöý÷üUï¤xï³yÓï¿kPS »0Ñ(]~xP ª&.ß[„ Ë§Âê}NšÌÎ5R·cqÉ^Î `Y‹WÎ nñî“”îyn™ëAÊÈ •c.áŠvJÖæŽèxÔ p€ 2† vù©Ëwo" O_»åêôd-€Â´$ÔE8ÏãV°h½ÐÞÊ©ÉÃÚ$j–§Œ·b„ã…€©)܇ÿ ¥Y.æ15†Ahª£:”ÉP¨aïÚZ3‹ЬyPUóïI± ›”*XÁ•Ë\–ü%D 󋧯p œ—„¾žÅî9N¬¹­r þù ‰žnÙ©QפñðøÏM13¹R­TäjÖ›MÍô2c {—uѬøl Š !!žÁ½Y†®Ù’Z\[c‡æÁqRHé²›Õw£çŽÐ«±:ÞNª³Û6;S49DŠ¡ªJÕKöL¢ /Aý1ìvr{ Ÿfeü !öîŒRÂIô>r!rvÏ[¾{æ}H…å…ÊJìÃöMfì¨ö%O¶ÚJ駸‹ZöŒ$:”îÝÝo!ÙäfP8yžgG`îU›yw5õX Gcs^EöñBo~½..(<±$ÊrÆK.×@xmÁ›Z=®½‹WC4ƒš¹rj\V|z?Pp‹ëû~Á§¾·B§]Ô«{E JÁ0žt|%%Œ5(z¶Ï‹ø¸ùY3!«ù¨Œ»w.­ãØ¼Ž“9ÅŠhÌËà9*Æ+…ÜÿôŸÿ˜Œ{< ½S¤gnlüÙ‘ÀéTE¸Dz÷\Æ„ÀKÿAœ…5낦ٜâÈ´MªðŠå³Îñÿ¤šÅ‹Ž•3jçUcþÎܰQút ÖÍ¿þÛmÖpdn#šLr¯:—.É6ö¾ С¨I‚*ÕGã`-CÊ­ŽÓ{ïäeÍ̘ÓÅS[YÎ|v³ ¿ ) 1z¡bÆ£ª€€×Üc`ë“°GËä3çácÝw*(|æ)–×:~θþ†¦ƒüd—@;;f”Õò*±ÈmݸŒ0}Nt–^zY©.%(`E4Ëô³­ÂÝ>³8Ù}„R0yø©Š?ž†˜[Å"‚iåD.¢Å"+¥ÍxŠiaØÂ¸¦ÜCgs ‚¶÷=>™æKÄdŸgîVßO ÎÛÈxƦ}µ¦°D ´m°’W|¶É«"‚Yˆ®"{­žUþ<¸ñï½Ìùü’§«XÛswWOì6@á¤eØÆ½ŸZ ,³ó…/'ûŽáZB8š¯ûÝõZ¡ç7á_áÙý_zü;‚¿‰,ú»Øvýr ó²Oá«í¿}ǽzò2¤óÛ# RÍñR‹~רu/ ¹Ø¸|tYró²Û/ ”šá͵ãç¼³°|lÊ:,F£Â—\Ù*NîõÜüéÓà’GÚX¥J¶ ·N˜äoÄAM…kd(1ÔâOqM‡cØþæð•pvÕK³ÜÀ°² l<â ¢…50õ¡–| zú˜®„&‹çø:N]@@3©ÅáíÂúí×{9g¢Å¾õju½<Éç:”eûÇL¼·7½Üå…þm áªs ‡l^k`—é)gpÌóP†±’޼-—ý”Cüf]ŒFîbœçÊÙ0zL7ëp£ ñÂô0(ÐÇQ÷(Áp¶Cè*€íohýs¤Á*ÂEB§ÜèÞ¦qܰ<ƒ8‹.óÚ…-£/9Ûi×ÊÐ…ÀÅ! U“:J‹Mf%ö h\~ºN‡Þ‡²6‘îMKí°íräq®;×1u„±±åóŸH_-}¬kx¶Œbƒ‹D$Yª¤<Ïi1c÷‘,ùÍØë)©ggª*òS13n[4ŠƒŠK¨qÜÉV¶BÛA“ØNL˜'×AØê yá)c+1 Ó¬ù ½—JíœnÃ0IKþ^29ÖyÀöše®Ù_FóBÒMb$ìg÷ŒX‹æÆPrè~¿ßEtø­sÈU®F`1ÓfêªP“³OÐDSMX.ÆÌ89Q‹Âa±Év\ IDAT„ô¯ÄÝ4 1›¢ÖUxiJÃ’')3-Lyƒ»‚8cYZ2Eå¸Ã2`ÄKYÜìûóPQºG“„Ý9yÉÓ/k`£á C.C¯Z&I2Kška£vÊcBšG¡|Ef-DŽff!¯•ýÏ)ß¡ |öÓU%äS¯çvþ*ñ‚¥ü0?^–c¬WIv†…4œ¥ê|2w›3Î%"ó 81lP.£À® Xó¡‹ÚWkêQI—arÓT6où¶wç‚æÖ&üädûÌk÷’[»¬ÇûI|íVciˆ-5k¨jÜE¨¬pO4j °¶Qø¿ØF Ïz>w¥ä©´÷:)} ›áà:Ú¸VäÅ,j5½ìÈdf%öZJ‰§ÃQíø•ñ²Í‚¸g8¦[¸JY'žÜê@ÓÏÝŠˆjÔ¿ÿË¿ü×ótUÃ_ß{Œ´ÇCD1.áÖì.óaP³Ñ~@P¤Ç™Q"Yí"ufAºš™FaH„»PÜãû VIÏKÖs¨w±>y|iêB‹•PçàÛÇ8d†”sã5IG^[NHÕ¹²\|™i \Öˆ[·Ég^%}ŒP>ýýFDiD‘--€9,œÄÀÊ%´K­¡,({¯º£€:!YÄħ°ÜÒkV6g̦´)|äb•P0ŸÆûáÎHòO’¡j23{wYÉÆ£tñHÙ%C.zWÀQ‹À¿Jl2úEvÇóZ‹Ý^¤ä5­@zÇF\êBS뛵̫GR­XعÁóêŽ5nˆ°Â¥W±p¼rK7žÖÅH^Ʋù,$ã³Ü'ëÍÞEøW³Ðg•òY$®a(ˆ<‘Š­$h[ 7‚Í„‘”Ojõq°¶jû[+¹:<Úd­Ë^E^ ½° бuu¤Ç/mß(Ù‚Bsº3pBãh¨“ ¹ÜaÊzr.Ÿ$xúŒÛz‹¡¼î }*éå·é4ø4:ð -›“ôœøßü.¿öGà ×ó+¿ ¾‘šÀ«h ¾µ¹»Ìjç'ÿï–¥8íMåËkÛ­/rYø[Q±õ˘ ´6r{/0SÏa>`t·¬\NeŠÉ%” vDÒöºÓU(†ãeÙqâžž‡Ù FŽvëéÍâ˜Ö¯çj'\³Ã\Ã5h3=o[ï0ãžÌÖ¾qŽð>°SÿãB-í#I)`h Ê~]'ë—à«;7=Á‰l˜Ã—7 ® åÓmð{$Uþ=¯ |=ûã&·›z³Æ›ÞÌ`¢ê"e7qˆ7ÿ*Î?´óK;qÿùÞøÒìfT>(§8õCô½òîüQûO‡ŠRßÐAÈýµÇ_v>~a£PËDåÄùèjÚš}@¤ó|r7ׯP¥…˜ò?ŠÇùµ±7Èíf³ó!òîîÚ̬gïçCp{¿¹Üü¦þ8½?zÐrtF:Uœr÷¯Æ;F VMM¥µ&]Î~ºŸo­Iî„¢ò8šØãƒw?hÐnÍ…"‡0<]Í{ïäyàP#ÅÏó®î ¼iù8´7R5û¼N:å$O5»‡AEäPÁãþp ÈîÑÍ 3#Ü£'*PïèNÏ`r€ƒT]»÷¨ xº&,6OZ¦úÖÌÔOwwʽûχÜnÚZ {wŠüüµÿôõ'@ÒN~ÿåÐトl– Ä“ø6ë°L;ã`¨7‘ŒÌQë:õ‚±ùq'ŠÓ°Êú°VOÍ45ªø$q*Ù¾Š¡ÒbMæÒ¼Uqˆ"?|Åú2hCÓŸ”˜ñT#^¬£—S!>y‘É@™LšLqÈxh|UQnŒP´)&ßÃ3 úµ—f¬:èpÛø”«³;—ÚQ ×öœC ’#!SÓ ?V‰rÆÎV©3fñ™ùPw:¢â,® ×YfZJ¡˜TñaÄŸ5žCÉK´}®÷kÚÄјVt—_9¿0›·Õ,–±wÒ]T¢¨UFWjÀ{£È™@"æÃQîd@ù‡*Žéœ‡9úÓæy{d,"6Ó$äAr¾}QöY¢ fì]E¨:‡<„fûçT)¢ÿ ëÈèB˜¤bŸ”ó ]îíÉ˯çi'Hx‘`¼fêÝeLAfL÷4:†õNA—XiÌtôç%_^Ü 1Ö‚ºÓ}¤a„.ª1 â ÁQÅÆL£3MâžÏŠüL˜~öTSº{óD6„>p>Ø;Íf1{„F=´—t<Ì ™pñ$䛉æÜ+K)ˆ¸ÈNÝ[3Uõ¨}tÒ}¼…±[¡(F½×Ú¡ì}ŽÂG%{ŇW„ÔÕ½0á`+I™ô†¼?|›la®?õú+; jÂ9;aaóÏþÔujcÜÒãN ¸àRðH¶Ú©bÌ¢)ž‘ Ž„9À¹éTîŸÂäƒlsœîœ.ËØ.eX[Ý¢Âèž\Z²DJ™`ûΜ¸Ì'·Ø£IìÂB8o5C/Ý!SR2áA›â;Ίšb® …²Yv"º*‹“‰[§ |ÎÚòA¨²ÌPó2äź¾­Èt³9ÙÁgõ³:Ç^ìªy­iÛç˜2Û ªPuÉoo€á´Òåñaµ‚ø2ÈÈÜ (]-—j²JKçå­¸âÀËðKL­¶iHUÿwÂγm²¿iS[®ñ­¸r{‡Ê°qSA·Ç)OháJ®Ê'°”²ØX¾tõü¯ÿü¿è½Ó=j¦¦ã"ü7îáÈ€Ó45vº©†æº6qÔÐX”L ÃœŽ¸‹@*šŽø)ƒ‘ÞÄš»ÇœXuâk¢&8€@‚¨ævqÿþòC_H¤m9iò>¦’y‡3G¹uJÎ=¬™Eð fF¬UõÚáËŸÀQMá±¼®Â÷IØõ!mpýÔ™á)0$ {âðp̰ʪOá6H]r\¥9ñ•¨{ølŒŸÄ(Œî©!g ¼ ÛÜ0L¤²“ÒY?ÅÄ1‡[B‡5Œ4⫘óò«0B!r ¿\VÍeª~ ”¼¼’õéâím+ózZ¯³‚èp-Oḕn±Ó–Fs¼ßWZîQ,RÙlK5s•b˜Uuv )‹ ¸¥§¸iÿu¸~ŒL«Í>§Úÿ ›÷<ÏP{y ÷øšï˜"¿T3ìÖ <Ù§ck?¢ê±Uçl‰IL"ßuÙV"^n©ë@è3w£Vù 2î­©ÏÓéñ‰¶°5A(ž9âöœZ îo;÷ ëù²}’§ŠÖ×Âþ+;À·Åîoákð­ÀŒ¿/ èó„¿m ×ÔßCßù¶o´¦oô¦¾| xžü½ +?›ƒ¥e~›¬]Ìî(1`Nòd‹½ârI”IW1¡¬õ\ã×§éš—½xx*èœõ*ÕŸ5ëeÄi-!-/ã†Íy¢^Þbõ¢ÛÒ² ea}2JŇõ¶|ÜsþÐðo•ͺK á]ïOŠl ’Ó †ÜØeýÒ2ô¨ˆër¢,b¢lËr.žßòx™°úWÞ?â  Yÿñ°ƒz§<Þoj°ZnF‘nÞìì¤Cú­wÒÿp“Ã~øÏíüáíí ~‚0e?~¶þŽÇÝüãлtWÑ[¼Gç£}øÇ¥ÿÔÔ4R½Ùá"çãnÔCÞìh ¿?\E 4ñà ßyªž‡½9ÞùnQ¿õÖè"_oí† ä¨XÓ“ý”®zד~>Þ¬ʯ¼S¤¥g4N¸qõtÀÒ½‹ŠiS…é)î&® ïoæÞϳ«8ÙMÕš™Joæ]LN¨¨…ýÔMUÐÅD`ý!SõÙM¨*Öp»ìÙ5Ižý€ÛÃTD¼x»½¿ÝÔ»÷ÇC¡ÒTEÙÒåDwQQ¡Àó¦TzP]¼‹ŽÖñƒZS{<w¨†QšR&¤‘*tïòñcü±ÝÞcï©ýŒa¶KúׯçýñƒÂwÛT¿ûþöOø"„çH ?OlŠˆŠ¼!wˆy„žÅ"Þ6¼Ë£C(uqÕ^¸ï)S¬L굋nmŠê°÷Œ$РÅæËW‘ç©Ó†ƒÌz0³M#RM‡6šg¦¬à½ò!¯HÎgŒx€b]TM£G"¹1yÑh1‘¤D EvÅŒê_ÑHaÏ1 í¾d!JÞ]²Ú¤ÓòŽòHpŽÇ\y†ÛWÛM| ÞûôãÁûâD{ÉýcŠp‰K×îÄÙMÃÊà)fR>YUÑГIòIJa0Q¼y‚ˆyê¡=ß w1ªc”V?ó$UÕÝI§E£LŒhŠ)¾LÉóe¥ Ò †ðFp ñ™ˆ·2…j¼·ã0?yþôUªŠèUWEïa“”ÀOz 1\Òî»x`v œN("wDkvö’átÌt‘hdLŽQGMÍAÞ¹´$x\SB YDáò‚Á¯w Ù‡Ù3öKLUÝgu4‰Î,âyO\23Ÿ¹$ísÊ¡±ƒÁàôM ×åEˆ»HH²÷2jÿÆJ2ÏöË ó2'ijÙ÷;0‰Ÿß{*]*¤:¥‘–¾{‡ÚÔ&ÝHP,`:£» ™EÂ鎅¸*áž²±æ $8æm>g?%õ¾R);ÂvTƒQ•·…ÊçíÇIpN æÛƒ_ºFåû¬É†ÎJµ €KÞ…l=M,}db”ŸêÈg- NŽSr?¸üÃËxáB.€˜]¥S7ÂŽÆŸRÅ/¦³Â>g²Š"ªItŒÒ1'yЦè„^¬è~1·at>O·òkTvŽ ÒQ°ë)²@¼éþ÷ÝÕ%[‡àë³ûú–;õôÕ¾šüìè¾wó±jD^"!vä/4,´ø°pù¸}–f=b0\³¦k¶}eÒ¦·»æu~{2m~R\¸Ø l=¢›T&¤f™—¦obµŠrÕ†VscAp³ý/US'Ťõ—÷dŽŸjÄOp]¤Œ©ÿÇÿõF¬³÷N§°Çƒ]“ö2šíYOÃûhG’‹³‹[’ð€¨®qŸÏªâóÀHÂ#^6À³Ycf€Fp<~Tcãv:1MâqìY%¢Qÿ÷ÿüsÉ JµGkºP’£[üXcàå“Üñ É´òüqÑv‚ )ª'§<›ÐŸuZ+ 0áiÛp Êòx”­ºx‘ØwÁuqWªÈ®I&Àßö–²è fåõȪრHcÞD…d5íö¬ê3Æ–{¬¾>ÆXvH\œÜ¨]V:î–§ñÇ¿ =²¯X¹¸éWó"…ì“Üy"¹”±èü€gýŽ»PìÝäzÉa¯2à†¬j!–ì/TŒÆ|£øB‹Û5Ç~+¿ëš>…»®H*¼œÄO$G¥ãâù_úìÓXÊýSÅ딾Ÿª}_¦ ´n¬ÝKcÛÀ™¡K•cð™P].󈬢”Õ€\óŠüLÅÅ'»âŒp,0íL¼dØÊ÷е;Ùû2‡EX6ÜYÍbäýÛºí'ÿŠOX—¿­·ó©àå—¾p¯ÿâ(@,2¸ô¢àw™|òƒÕw~®ëÆUÊçopoh¾œx)ÇæßPQ·IÀ¨ñ·½}Ï Ÿ‘L.<;¾ΰžXFÀ¥<`H`µl.Ž$â Nïù çÎeÈÁ¡ª³¶ú°4Ô ëœ“ÏöÛÒ󡞆w×8 ÃÚM;‡ N?îÙ”ƒ¶`ýjôŽòÂBBQ«Äœý>\÷e‰(nÍñò“E|Y—gƒÞePÎPN¯YŵÅÜE®Ý( wˆ§ëq_>ͱøK9Wÿ!€&“Ç»õvÜ¿kÐÝÖÔ…î B÷Ƈ ‹ô&BÕµÿø®ç›ýtž kpJ·óì.ì÷Æ.B£ê8G÷‡Ÿ_~ˆ40ý&GÃMàgïàÃÈ7û.àÁÍÄÅ0ä*ôÍ rˆ7å—[ó.ÎÞàC“®*N‡POJhW÷±Pä´ƒhr‘ô~ÆÇtÈ#zï'I²5=i”îè¦xk8O1 1Ѭ©©BˆÖÜÍ”*è’U¸i":Ìô`ïAŸ·› iÍZL¬T ìäÙ⧨‡Þp­=ý|œGÕî~§T›5umGì½{T‘Fg çRtCL˜Gƒip6äíý˜Z¢»³ŸgïÖLMéqñûWò{ ŽË…b‹GŸÉßÑ!‡ûÏ_ÞÃ4C˜ÙÛ­}ÿåÒC ë#ˆ¹)ï&dTÁ ÅôIWÌ­2ÅE-º‡Y5²=!êâ:ÍC¶±v¢è ÒuŒ+à$æ:ØÉqTŠ©b˜[7Oç¤eÌÞyTJdzl¶©œGb\štúÒM´EÜ{ÐaP1U,ö¢LéhiîÞ}:uq1!ÝÐeïSÌu™SEݦÝ2 =.¥yDI›°„ÒŸ*«b"m‰"«ïf¼Ágo¯kKW¡_nèŽÀÝKˆLÙ‹—`sÛ&«˜óÙiŒ!^–ü¹ÝÓˆwïNÔuÏrcè–BÍþÒÓ=¦8õ 1\ía”ÅŠææIcŸÃDÇ/Ç­1›sóp­íðó<¿Þ£¦5tnŠ/Øqï“¢“zÇlBNç6@"³ÔqÜE3pgÔ‡œgW5a€›ª1œîQYßX½9¥žq‘åFÚ'àû!ð«B ù$†}"s‡cP-½IÜ5£‚¢\g¦<žÀz˜Â/ö4¶á†QYDw¼•jeIEKÒX¨† ÇilÉ¢o0ËeÛ ô~s÷ôV"+* 4DeIÁÙO´#g[‘®Ðc´íÆŒcl‚è ¥*Œ‹¦*½OÜÎPÕ!H#Ó3Óc“4ÖÝ«¾Ó²pžî"¢ñÏÀÕÔ“iÊä.hBœ"ªŠ‹ôNëç3²>¿C”¸ød;ìHk®•wµ‚g.Kl÷¢£ŽvÆ&r ®LË‹ÁOxÚ‚´•]Úœ)JŒ²„›»ØiØ7DþA*zCɤQݾRNÓ¾”FͤzTÀ²"øYCâÑ]YŽk§sÉø$ƒ=8$Å1ÿID|3«á%w¡ Šø¬ü£8¾<Öø”/!ü‰ê™ÃŸg5£xœbëæ©Å”UëwçýýÚiýòË·VćòR_Zéœc½PŒþà5 ]^ɹ·0>¯Ùˆ¥Ù(íe¦³Õ‡\†7ÜÛ(êâ˜fýéŸÿ9ªh`fmÍTéì=j’ú(sòüvYÚþc†I€‘Æ KC@û’Ûͽ|Ä0·I©@Q„Q¡éÈö3b$üþ«ÞÀ8AƧ ˹%Eik‰a¦÷©ýcΣ†˜ÇqÉ®Ü2g’rÍHP—cæ„ìª3±ˆS½¬ ç²Ô'M=Þ¬µ6^k]ŸY?ã|2G˜RðÈ%ÊB\¦ŒÏ9ú]SʪœÅû#f£¸dº5&+£€*æò±@ÎÜE¡ž¥ ¤Lad|¾Q»dg DA.uŽó}¼a².Fcªƒ“'0"\” \x)×A…ÿqM ¯<äP¦sU©Ééö1.Ÿr SgávÈ6Ÿ¨• kÆŠ ŽOVcLÀ³OÓöÒþQïàEsÌÆÿ/#…Ö|Ux¾?uHÔ)í6ݼ„θ6õåþ=cI÷q7éX|#¨S¦Ë…²Ú|vÎ ûÂú °éàS•[ÀëÓ8€‚ Æ |ccˆL^«¯ÏKÝDUC ?Éü&y÷÷‚î¼þBݳÑ¿ó @^¯’¿íàÅnŸe/Í€b{ߪL}IíàeMøëñIEë¯{\1/×€°lª–ÂQÄß:˜Âs%äꂚàüå Ôñ¥àV–Ogçµq¾%Þg¾à9p¡Ö´mVXxt«CÈ1a—9ýuŠéÒ—0F:ˆ_0ò;yLœ.àü:¨ÿl1^Í|WøïÔŠA¨[9Ýr™ø"ÝÕFÁç°B¥¶©*¾]êÓÛ52{à–MG¹þ?>»Ú(òró4x?Bç[ówûè§K÷C‰>PÓ“³a7q§‹ŸçWòPõN>¼›:”g>Ty;n$ÙOBÞ{§<Ô| w…ÅVFa o­‘ð“ Ýxwg“3îN8„0ªÂxª?nÊÓGöµ÷[á ÷IïªÚTÔÔ½›hSð-ÇP4Ýÿ®¦Pу äf„ðì>nj]ýÁ®.èwˆ7€í@3sÒ  REª8\Oðñ yæ€Lh‚Té½ »G3òxÜ3Mì› €˜á0=ní»/Çùp’§wk ³‹ Ĥåy<œªjjjª¤[ ™Æl´Àþþvûþ»÷ÇyžØóNWC€+ž.*§ôG÷®å «¾$áѱ=ê@D Ñ…öèÝ=”·›ÐéN*3øv³ïÞÚÖãÃÕçF<žÄ®d&`FÙçÊÇøµœÄ™f‹1£…"¯ìÆ“ëŒäâ1˜ˆêõ(z…ªºfüæ–yŠwQ9†^¼Ô,<â$¨,OÜ47,çƒÐ£tx"ñÀ$hC~TGu&{ôã¡fN“á2ê^²µ’“<º´ªÌgŒóWx]rž(%Ñ)„@`䇯Xd1|utiÈARõqH”µ„"_‰òbŒixÎÃc´”FmIÆ0‚Ô}ø¸·;Î,/™USìøÂ+Ñkj¸58_?‚þ_´ÛaÒÉBb–S÷ ¶~š&ðgúBCó0¡Xè´ü¯j…\ã:Ù4hì.6Þy= ¯ih1IŸ¢weiTõU'-åºÍ´—;GAÑ -Íhÿ¦" }Z賤æ$Ñåè Ê›¦y!ÂŒby6÷EERxºüÝùxøqhwa³fÌA!ÞbzÐéÕÕ°ÁÎ Â=3ówækˆúì‘ _®´¡WlT©éJE­ Yxù.‘*H¸HÌæ/Ò+MÇ4ØÚžt¦èg,ÝRS9ËåÓìXO£SS+ᘣgÒÇbµ"c"”ÁÐ"¦#âSž'àžÁŽ«JH鲸U¸¯zÔŒ¶§)¥˜:–¿‡K+?9r­eõß#þ›5‘¬†õÐ.šè$c^Å«ˆT—I9¤ƒ¢öjÆ‘0kÎ’aŠuXÓרúû˜€8K®ù"ÉOUªú²ð¹ò¿-¦OX×-s"2™#ÛW,7.çJîÍ¥×^Ê»òÉVx¶vaÇkÔ#Xµ$“Å$º}“òîå΃§½v'{¢¬öGpkÒã%ƒŒ‹Qi4«P‚¼ÂÁp1ʲX7ü¤Ò1ÚÒ—¶ÿú4$+6ðßþ·ÿ]Íúãñq¿C³mHT¡‚îÌGňîXe$ÝÁòçÆ×̾Éà|–.\øméºõq™¸^ꢒºLüWy—”ñ5äò)­ Ëž2ëÞv›Q|oâ¹ÛåEã;¶Uò¢Wçí©‚KÒ« ù9¹ÌEVvë91ÀêÿÌ˨Yc‹§¥ïU3oEÿW»@ŽzÀQAQ¥þ‹µ½þŒ¡ðÈ â ¹z.>Ñ¡°Aø S8fµæ’Ê(—Ôßó÷…TðWìä¦ùŠ…Çkÿúߣޓ¿X¥Çë§äßšÈ'p~k°™~瀼ª“þŒ‚ô4²½|Í“¨þwâ€ä©”¹ŽÔ~ÝûPü ø»ß3~’Øœÿ¥W¢ÎjÁº×—Ý&²ã…â€>ÁšuNª½yLôÉk³ï¨c…ul:’2DÒÖvfDÆÑIAŽ ÷¬¿!EŒp‘ ‘IªÃ>ŠXO ±Z0cÜ2Ïoº–0kt§¦“µZÞ„: \Òɧ»á 6­gôäÿ%FJÄÊõ;Ÿ[Zé²ŸÜøÉ{?ç™uH[2t/*>qKýÇ ÞôôÞ…ýh0y]5½'p‚lrÆ[ö@tíÒx»ÑL…'»ÑWUœ€œòÖÐÏÞÑÍ¨Š®ø Éû¡Þ·¦P+Nß8T®š0MNÍ,€G@¼ñ4k »¦0H¡)éÝTU5ô.±_v…[“îÝ=9ÐT*èÞߎff?}kª­=î§™ÜOº¢ñ‡‰ ¨pÀš%£s k SÅу@hÁ G^´áž÷¯.3}ûÃ÷†æt´f™&ÄûI‡•›nŠ·[ À½BMÂMq3äFîdƒ4@´§ûP3UåÍn·£ÝnÎQö“ÖZT65*œîgOr°–G*ÕaÄ'Yw˜ªÙ9D ?ýëã2BÞI?"ᣵ¤v*äÇ€LÇqF³ø;ÓCg­p§öи…"]Ó8qd V ¥(óT³LÐHïíâw IDATÁ9"M¤ »¨Âƶ…¸¼ÇvÌÿY×Î0v]LÒF ]8«{³(eÀ¹%zí‰EUNü SîÖ %€c Z`„–£=~©‘‰¢b¶Øb„”Œøõ1êÖW©íœ+Ì ¸ÇÈ…î݉Q<\XÁ©R͹¨)àBÑ¢1„Ïq®F2ÙÓ^PMƒþí±pÇÑV齜!UÅeÞ)-¤ðBJßmúÙý3œÀH° fŸ­,Q,‡Ý‘€Û,ÆPÀóª*» §ëüܺ/DY‰öÜ7sN9œ 㨴ˆtéò䵎šé]*”Bº÷û×ÑØ3zí’Æƒë.ªÂ¾S íA§J2ž0ÙÄy‡Q·."Ð)Új³œ4yga‹±§?Î$T¬c@eE´¬“.É~º•—íP²å˜vïN?ÏÙ'_H žY ŒF¤ølcÊÖÙeC Æö_“³IC•&€„ú<êpÃû/Ý™—°äa:ÅA§*áXˆá`!ÎGÑ÷Xø­j35ÄypLCr×q£Oû|@ñ®Æ/ìÑ!âe‡â;i¶ÓGÎ)1¾,ÀÝ»\mÐúÊe.ÍÓYGø ½”Ç qi¶7MN† sé¶¢p…ƒlѹz¡BéÀZý€ó¹Îœ3sk?Ü…R|«0ní]gÃA‰äOZÍ«p¶ÔL«q4j×nÕÚ€W&‰·Í„¨×°ØæÄSgé*-—ŠA–e*ŠÛ¦¸Ê^Ä/Þ÷r“£YY÷‡—Gj\¹ Rwà‰Pü±ÏÇÛ´g}¥p›eïéÙ+„;ç~v2C‘ ¸¬Ç3ƒ(•<ÿ,àù@MÈÓuˆkV]¶Æûë0„¾Õ&s缬WÊ*¼ ^AÿYl¾"ÿõ¿ý‹(úyT­ÍN5SàhæiÔNq—þqïæ6ëQÁã*}Œ^u½ðqU:EÁÓ€9Jk3x÷nP¿»÷ÓM3IÏ‚yMf7þüçƒÂo¥Q7¹>’½õËUÇbôÔ(죥ù|NÜjºÜʳƒ ÞŒ¹O>Òx•ªÓ$Íí«{ö$º¤æ„8›¢ÐX|$AæJÄ58’«Py·s;_9à&q>î­Ø1y Ô<_‹¾Ö®¸Iòk ƹ¦Ñ)ç?ªÃÂxâ÷|ÍÅEï‡qÌAÂ.‘¡RÕ’}#7uL§}tÏÌ;a.7%ŃËxþ•ê¦|šïÉšãÅå`a’åÊ« kü9–Ÿe®þ‡<ž@¶^†ºí*‚è€Mñê?½–›?#å¢Öõ5X€ë¢ÇmЏÏ£Àˆ;kŸMw/?o&æóÜI®ð\Ÿ^ ¬ãÖ¸¦¦Ò[ñ€KœðÑ$M•ˈ…ò­z-ƒñVòU*߸bñð‹Ý©˜¼šÔ|úp_j+î•ül ø¥^÷OwŸ>ú?û.¿T‘ýùë_"_å#W³ðëÏ×Ìßu ŸÏ ž°;¿dÀWyµ±Ûú±ÿf /§l¿:ðz ¯@.E­½Þ‰œýáµNÀ%(ÇÇìQªG|ͶɘäÑš(˜Š5{(´„Þ¤þpt Ë~ géð¤kPÇ~*ÿ3â+ '‰¬=rñGê„ N’ÙG9Q“#Èw/Šý¨˜ÒªóT>ædÈæ€y {âÏBUËè$‡6+ED¼{È2¥Y‰§Šaõ+áÃ9 ðIç.ôò Óç«ò÷ï—ÜÃ?H@»áìzÂÏCz·øzÌt¼ BQÑî'H ùþípï~>äì±…ðËM ž_Í *Ú]᪦ì.]UDµnï¦Áâg ';…vD 詪0„»¤w65óÞEx3@\ØÁ~S3³ó õ§Si bMÄU¥z Ü»™°3êäé.è5t)]•ï ÎnðÃì¸Ùûí]UE¨”6¶rµ7S1…­f-'ý~?IW‘£©Y$(¨"']Ä °Ãç ï_¾ÿþÖÚq4¨šm¢ƒ>Nzïi·fV+à ^8:w}‹MÜùèîzÓ&MγC¤iƒR•Ö´5…8Ž£¤µÌ“8Ý!ýhGtWv‡Šê£ûâ##î˜Us„=–-S(Ìé­ûƒ.¡ßï:êÉ $úúø¸ŸyZÍôíí€ãÌ¡á5ƒ‹iZ\9•B0ÛÓ|ª+øähhâ‘GxËCRóÐýÈÊ“_°ªX98¢èoïoqEœ§wбÁY™ª0†÷;§hQ³–ÔYpXy‡UÝ+?BÃ:›~Õ !Gxè×PÀ½gA.¼I‡äü×u™[Wçt\9Fv7+‚ {8ŒÇ¢’¢ã¶a4Þc0®e£¹R}cç>¬öiÑöp3ùø½'{kÑE ‘9,êyÄÒR¸IU´Æ×(n¤ùÆ ãóö£œ–ÇÈ¢èÔdjÕÌÁlœ«›š‘yuÕdÄñéˆK¯ÖüRÄÓ‡á .Ãú” \D¢¨y|gšÁšÜ?0˜-a¼¶hb^u(· /`žÊ;’ÇkÌÌÔ8-×€6ÅÇPüó×r@Eó1)Þ rf2.NÆLwa}¯<ìty[@<.².E¾ô̸£Iúèt髪.Ö€Áy„ñj¯bF\†Ô y;¨ST4 w!UG-u4rKLz%¦¡Cè¨%¥;¡©¿^âxõÒÓ/©èHçDnw¶0Sô÷iØZƼÔ\¼h³p’³v¹þ§ÐO„C÷=«Ïœ/b€°F:? ÅJÏ+Ïsj…-£X© À«rVìÓÙä=7Ï5 lfƸȲ2¦é”3$JvÄZ%ñúmlñtl}ÇÇøÓ¹ééHûú”Ü]OR¹”ýñj—àCQšE¬*©¶•Ö¡9MÓiÔ$&é{Ú`£‰³È=näÑ1_ )¦±åIŽÔãÏÏiß8Ìq¬Ïœ«Æ‹._~ÛG¶¥±‚^2ë¸jЍm†,¡}»_qN¥¾R´ë·Þí¤ØA­cŒ ì™'«ùôëh§T@ˆTŠÛ•ÿ$³à*+x}¯ÀÝC:ÜääÓÁÂ+¬`ÍçÀ¯œ3Ú÷ÏÿòÏûb÷ÙOÅ^T™«n.Äf¦Ö&VŒž]=ç㞃J?{ïaæñ¼îLðç|pu‡ÐZ#I½;P3!»÷~ž®Jáyöó|°ÝÌb9âן>¤"¹Æ_j¹j†e±:— ö_¨è©¸rNÉ| ½2ç9è¹³‹ÚQQwÆùb¤Q³½ Qjs¹;x¹´Þõ¨,WG:Èmí?sœáÑ=”)À2çÉžá„¹Ž—0ss\…œ°´ê˜aµÍø^!/qXŽV*/³`Î$/q(’±™>‘™™„–²¼*W ŠMNGᨠžwÞjò]YÅ… Åñ•Âê6_ fµðZ@–bï_Yˆ¿ñ”ÌS:êWq=Vƒzq®% Àò›s‘’ÆánðDçOŸñT!¸AçОW{©­øÄüxñ_Zuñ 5¼Æ ¤ž-¾¥þã”.í¾¯%`VÒZ5&l‘¶ <㳄ˆ ì™+Æ´éVUÞù‹õÊú/´ìF4å¶ã‹ŸIœ/×âê‹®VùOÔë’á^.è:CÁ‹áõ> ­+ÂSâטÅçÿmŽðWoÀ/ôŸÇ¿k-ð¶uÁÓ.j~|5øFn`ÿå¾­jâwü¤ø­iÄo '¼œìzn•êóß…¿üÎ4ê¸ß± kbõ𨇻%šã’жÄýSHoãtà×9éP‹‚\Ye}CõÈÂPûWú¯e7ˆ¶uÓ2Å$Š Ç׬âä1Òaû– Ño´ÇÓÆG/“HÝWÒGÀ[·@í´‚Í‡¡Îã\ú8ÉR%]Òœúðž" j)ýÏ•‰úBº¿"¶‹ÇÑl;rèo Îü; íMNÀ•$A™ƒ§.NCWUS}¸a6Ùýñ ÈÙ07€4IQ;ôØ=Ú*ºÃ¥‰ ÙšYÓ7 ÝJD\BR ª4ÄÕÔŒä×~šš5¨€›²™Ô»PØÝEUçã!pHž¦¸íÄ9Ïpî { žîyA÷ó0h×/ÇûÛûýqÜ?@œžÅ¬Ý»)Žf·vè| iŽ¢[ÒÏ“ªo·£iI&·y  ¬µï¾¼µv¨š»[ò%\‡k¸÷3î•Ç㮎cŒ¢$+7E£vÌ€QÖ¡†ÇÇ£w×› „ÔÔL­µfùŠ  P´ÖÒ{œ<Ä 1tI6Œz$!5 ¦Á ÷ ÞòFD^«SOT„‡=<[pw¤‡éþõëãq?!p$åü»÷Ûw_æJ‚–VwL³ÎŠ[1t8ÎcWèí¤JBŒ4pTiŒŠíE¤ÉÅ鞮ӎW$±±˜Ç´´œ~‚tן’¡ðêÔ­VÌø)ÑÑ´\§a|lË•±&¦_ ÀfqÖuPEc:reñUsü6ã)yÙ$â)‡ÕÈø{ ã²¥í«¬)YEµÓA’Ð\¥}y#óx¢¦XúÖ›©+Í£KRXÃZÍ^¶‘Ùq™Æã¹ïÂìdœký°â«rŽB a\§¼¹pÙ+ïjâ>ÜÐq«’Õ5Ï[>ªœ8*¢ªÝ³h ˆ£}éÖcÄKæÐ¹C@† 3ïÒ©ÅL[OpN"p³fíüù'ÍÇÐÿ¨¦fëÞ¾Ó‰'ïx gÀÙ«cLDâ´­j*ï%…ŽÞ…® e-e¦«šˆx?ñâÑJ"D„Ú“É>¹îž-á“ÇhN¦Ã—O2Kª¡Å,8•íèF6Ó¥ª->|Å–4Xè9A½Zô!Ìû<ÇYÉø‡R›¶dFÇýï’;5vejCsõÉ œ®&ªò±6ìœPsÖJ8ÒŒfÒÔ¹jö°’1^8טX™óW•tëÏC½“ÔV ae"9é|‡ +sî*c‰ç ïDG¸”\EÈØ†CáQНÅc&”¼˜Y‚$óp¨שªPf}VÖR G$tô=póntÏ™éÅfåd1‡<‡DËk|ÌŸòÉ'¸Pe5ŽÕ㣅‡Å‰b,GNxrœÅH[q” ¬&1,PØ4QMGNa ³ÚCybïª?|;)}Ú2(ÏVÍõ˜ØÂÏ9|àªóð_‹8{ì–zJ™:,ºý³†Î—¿È³4\Óé²µS/7öšZ`9Ä/¯W«Ï­(¼ ` ÙAQËŠ>e_oÛ¢½Öè»JÁ¯lv¨ëHæÒÞ›OÍ?ýéOšEmÉ ºÄ‹¶¦ãñAÏ=!út.1kø8ŠªÄžžÍòÑÏžñÎSv?ÕTr¼ª¯8é¤)Z;8Výóì€ÜâñwöÇyï÷£Gïìgù•KSëcàä}`füv½ÑGêBe¦®œ™!R‘RØM9ÑZDè$ƒ 1aÖ-ªA:Ý)ÎP Ûº¿›}îP]ÞÀ°"ªŠ»ÎŒBí}²+·¢ÕœÏÎÛBºsù½Ó„;Va®Ycv….XÌ2V®äVA´Ìî.Ë» êqlé1À‹ ŸGüÛ±•öÎ5R“=Ý"³KŠ^þ ΜOcmג꾃0b¤Õ¡ܸ6«Õc¨!ÛÚsͱí*gɧ)§ÊʳÐ~ãFkì%|¦r¶™)ŠüÍõ}×øuÉÄ+éxfXB#»Â†kŽ`GÃèѨqò["timÞ×q~s&}õŽ_©àuua±½˜NÏþŒ5>‹¬_&üåºçEŸOö‰".ûŒ\øë(ìV0 ˆ—%½/Uð§;F ?ð…rŒßhºÿ•üϾò×)ðøtâô«5hù%¹ˆßö²6”¡løâ±!¨=ü’|¨ýæ×»9Yê„î~ÇBÉfÄý¶À5aƒÚ«#@Ñø¥”§}s­\"ÿìÅíõ$WSÃË€5¿Õp[í÷HÇ \ÚHéŽ[&¨±€‘âÈ}`XZ/ýíeJí=_W :~î4[®<è% —>Æ ‚@}¬DAAÛ­‘Þe4üÍnô`É ³Ï„òäc–×xV’'$]j%Ѷàp,£F®™žA„Šúy¾õ§”kÒé?^÷/¹;{ô+7ÒCêŒg“ó¼`ªjî=ÔÇpEôû×ÔŽC£eK!èY`- »*C›j c?[C;ô°Ø‚úÐ5Å#Æ èl¨z{û/ú“ªþù/ÿúõãë¡iEs=LaŠ8¯úØéboâBŽ£©B,èfÁ‡‚w{ i€#]³*GkooGïw‡˜ÁUÄC¡ÃaÚTM¡CÍF¸óݺÈÛí&­ÍëØ0*¹GF@$Øâîî{ИÔÇ éîtÊÙ{ï§;ÍÚèºBrJ’ÊC048‚ӻ޾߽¿ýôõ£5S3µµ×Ó þôSUTq´›5k­ýÓÿx|Ìzß³û©§è—»¾”Æ"î*¤cô`å›b¦˜$s‰¥šLðA´dZ–uÀéJé vôëÜåÿüõã<ÙSÒ¥Ýô»·cÞáç"`„$òHªÂªãÏ5Òà"M™Ô•Ì'ÕÆ™S(ìâ*›©¨4¼GfbÔÆ68"ÓeO©„X¹ê=äÐ’1­@’BçZ/´á6çT¹»øp{òEÃ!¬Å@B lTbž:&E¼÷l`h–5Í'X&æÍT]HúøÈô>‹éÇ8¹v7®ÀÅê€ô”2’!#³Ü9QæëT‚FÆé—›H×1-ÿ~ŽŽV«ãÜœ¨^-f÷ªúxœ£ýCÍ T UìQXÞëÓ?ƒ6QUª/ÆmW)Z³vX?{ôT %¾DÔ&RI<*y§‚4M÷C…xý‘߇¤QR×A]žc•r2?,W•ÏYˆ÷ 3¡ˆX´óΊ YA'ç?`ò6”Á¨/à!zÂ;·X¬"¹æûLêpz Å #“”$•«<*^æÝQÀ,qâ)©`ÔÍV…±G,Ô®T'P£}öáЈ?§Š¨ÒŒqo¤êrÔbʪh¯€SJŒî"¥(g—dÜõ>ŸQ‘ëŠThǹԂ¢n+Çt ðY3™4H¿xkèc9ÖtuòÆžl†]b!ï›p+= ( Ü54ÛZù¤|Tãkîö]á¥Nà e3^b=Qû©þüRN†ÑŽ)ÍÖá[]/ ùÈì'®^FÅüêMâæ¯´oíŠ)>ÉÀ©ó…Á¿i(Ûÿ8ëÌm3¾[ÇPÂcØU‰mÒ45t@.]` ]_Q@‹L¶ÊÔOJW2§‰v<òËÕ ft¯ »îY¯äE¯]©*–Ú¢+¡·\ ÿýüww÷îéýñø¸;;)÷ǃäÛMDšš‚¢jód‡ñ TUWÓœMEhT9榑AŒ]—N®%I†Ø©éÙÏžU-ç-Á=@­™wùóŸÿ*BDKÓlõY¸–Ý}}’7•åphñ¡¯Q¥ÐÌyln2sJZÒ[T°ýf}D ¦Í6sΣùÈÎ:ªYz5mÝUM‘°–µÄª¦#[¥™tFX.÷°3MÎÇÊ~Œ7‹]V!ÁÎp)½}Ò6¦Ë·»»4c?ˆ‰çŸFl(v‹úm×s-× ©`yå§‰ß .Ç&ù‹/žÞŒí)ûâì ŒáöL®ÎظΉw‹—ú¼îšÜ|ÃkêuÐTKÕ1[fçùdMã½õ¹SÇò­>Y,TÙ¾ÂVªUYƒ¸õR¹fQäÍ"›«¥Ü+¸S¹e/ ʛپá6d?÷ €'¯?·±‚¼®Ëô˜kõÆ'Oœ ¼"ást—EëQ÷©;×ÿW¨/©—‰Äüt¸= &³õo¨ÿßæñ”¹M“_Ž d{~CŠ?÷ |ª7ÿ?ÿ/!É|®þÿŠ…kPñË_3ÓŸúÅoÁšÞÊVÄÂÞÙXrø,Ê3žEÿ Þ{^ƒMesŒ_žÀnÂù»‡'|Y÷·EÏž†sâ%.ð²ÿjÙ‰B"a툤lbÀ,ó20„Æv¾HLØ/¥öýJ2KÆH¿T¥sÎdPÛ‰öˆè@©ä. Öá–_‡ÁŒ‚Oþ`ò8Q—ª¿Ks€­?…{jÔÚWqˆUãª+ï0Ë™fî\–p4o¯`-g°ŒÜ—‰ ·yX4Õ=qü^ Ùæ«ÃÂß„ùw06HGöÞÅÅ5S?ï­½:éM=iéì..ÞU:ô0 Pú)þ ìl‡Þn9€Î°)Ôœý”ðþ» \±d¿¦ií Ÿ³ŠÇàýÖþðÝÛÇãq˜žZ8E[ ’ÂÀÓ!~bÛÜÌH¾¿¡<ëü¦ PÔ¬©>÷Û!oÒÏnMU\¼›€ÍüdkxÜ ñ£©HߌFÄ1þRC§#P’CæõZí0wµ@&b½w÷®f¦Úbf B:ÙÝMØGkÇÑœ‚ÑÐdÔBŠý¼™jrÞøÝ—/oo·ÇùpÏ ×Éóq:Ûí­µÖÜq´£µv·÷/ïo_Þ…üËŸÿòÓ?Ú'aö—7Nçɺ­ÛŒNúy†e+îzöªqm‹À° “JytR Ÿˆ—ž'÷ B?»&ë)Z‰Ù ú~k9óŽl´‹tO²°OõTÔ Æâk^IáîŒ\rL;ÔÉE¹¥@Îû)R°.•ÞRþÃ>Mÿÿ™{ÛnK’¤:Ó¶yœ›Y ‹wÑ¡ii-Íÿÿ9šY$Ñ£tweÞn{>Ø‹›Ç9÷ffu ¥þÝU™÷%N„‡û¶½ŸÝ·‰¬^-–c×<Ѝ`Ñd'p ðÑpÔ¢úëØ±5bâõªX>®ÊªY2bXË»ÙÆÑ˜¡Óz ÊBör»G¼h–«¨ÄíÀN’ÄÿØÛå7ó¸Ot2Ûë—‘'Ó ¥¬$o"z6”^ i”·F-é2q•åùÿrº½ÓŒ/ø²(»ÓÜ•YXHÔþ1ÚV‘ôfemJ]ÊÃØ«¦ÙH¯Ä)w°ª döœWE”Ü ¹¢ëW³Ý'å(á)yy™÷瀪âvÓäŽÇtNÈæþ.šF’ç´ÛPÅÁðµ¤Y“¯Ldh”9ãâÅ­Óo(Ú"fTõõÐ.{îØü¨ÑØË}bD¤Aì%¥>…Õ ÿŠùVz*2ñKV+Ñ¢ß#Ö"g³jÜiÞKëŸ@{gGûT††o#¦>Å‚­KJøŽbAßré åž4É cï!Œ¥[Œ^È›|‚$FäÖ¼.&"<ìc[$JV§ùŒE# C5±1ÒlªªwÉ´vFdÀYÿ8v$¶ÐH<€þ’¨RôºãF8*jäkuLv¥R;Ånœâ)¶"cDF¦5Ïöùú§Ò=q3@\êÝò·lúDè+\ŠmC5V¬O/¾©îqDƒ±ÀM¹hªÑò—hAZ²æì„ü€R .sÿ‚ØS ¢3±ªÛñÌ_ßÉ"{G¸þ`v\àÙ6÷‘Íïöø,=¾«ÿ|'œÝ-Oñ•Exâ¥|r®÷uɰ€! Ø ‹l·¶@-qó0¸d ‚Q²¹úÛ!w9l¹üÑè«[dÍ”.=©Øe‘ÝN;êMhcã ÿqýÙ¿ý7^¬³J"gÌ92†ê8DŽ1ÆýõÕÌæ9A1s»¿bÐ^FãÑ!š¼Ünжꨲ–w¡™©WÏÇn%CP4cèPB€ …™Í9ÿéý*{ù‘üÏÿù¿²ŒgÆys–Kÿ*Nâ™Ô˜š4Ä)“GöÙµ‡¹ÔÞ0Q´vÚ|w'ímY³êï·¼$Šœïý'ãéch3¢W½¶3‰°ÚLÈ9 Å‘6꺑5ãŠØ¢OŒY“›êTŠ9HÆŠ:†ñjf× {­ÇV;[0_±Ì²´ùÈ:©±³|¤¹HРštȵ7ºYTd˜U)ѺFúb´[fëQau8èèÝà DEküpÚP•°1Ù^˜­oJújñ·†ID¶j*ü…Š*Í·Ï] «%rE!u3Ý·fÖUo°¢J‚õ7ê>éol«37é–—VO•­b‡m•î6e>’m¶ÁûgÒû¿%7kM—ëž¾Úiû½4‹ ‹nâ·êsäÕeýƒ-ãàCÌ +³õëàR«ô¦äùXýõBÙÔGÊ>Uþ*¹ Ý;¢9¿Mâÿ1p:ßô÷ÞÚ3úlj¼}yðìû૯¡l>ù Ö[õûô›jÿ“Œ®ûsQ=ÚÃW?÷ÀŒì‚š}=-/vqÏy VlHýÚ8­ y*õI†Viq,–Ëa «xÉ@”Q[Ú Bd$:xˆ¹ù9Š… ‡>ÜrûZ]»¯¥QÊ)…S a«ä’“‘i[eæ…]i ŸÕä&³j<¨–V9º–’"m°Ñïš^F¤×Wt¿72pm¯“Xï¿1nò/8x¹‰óv´”¦lšÌ„6çmàv»Ý_?T¦MÂh:nÇ ÌlŒq»œvž13áñßýŽ¨ÒæœÓ¦‡,qçgÎóàœß þLíE0ÁüåùKOª³Ï- IDATBq;`çç_ÿò—óü¬°á(|M?sA† §ÁT‡‰â»¿ÿôk 13™T†CãÃÀ¬ lŠº»ž6¼÷ï¼ÈrŒa:fám¤™Ülš!üìnT6»Te˜Ñϧ•^c"¥¼Æþꇋ¤ƒ ×.©ªcøì ]Û‰¾çh¨ŠÛ1„œs¾ÜnçœsÎãPoí>Ž¡Šc ½c Ìyÿõ¯æ§ïõúzÿç_þóý*ÉÓ/.“]PåÌa±ÎeÐ…ÏR³Æ 5\è:aqeÌü¹œÒò°ZŽºðíÖC”ŒÛ m ,+vT[4µï:Ó~zóod‘6½Üë ÓÂßu´j“(}#·¬;:Õ¸Œî=mðôhA¼Tf3Z»æ!F²h̨·åSsåÖmÀtâðÚ~vQð†×VÇEÞ—‡éݳü9/^àU2>Í—ÝͶë$ìŽdˆÅλ`žyéa­O»Ï^°šʚ˽í/nü p¡+V­"àzYZ€yŸ¨`»”ªÊ3þâßÿ;¨ŽãfÓæyŸf$Ç¡BøÈ?\Óâ‹Ûœ1e'A™w…ã¦9ÏsÆ& jä˜Ó~bªHôkI›¾À8y2_ðå³¢²ÛŒ½Ó?ü?ÿß¡µb&’þ,9 ExÚÝâÑAÚU"‡è‹¥ïœKpÀÂÞ6¹™^{5ìñÈ"Ù²Y„èÖÝu’™W覸°½lH4N@U&AÈ)zRžÃÊ™ykcXD÷Ô-­(æ$ÍØÜ&Šù¿ÅÅ߃!Ô¶¤ò&Z³ ¹¤ÈílÎ}ݼ¨u(_=º u¿x7n…O7±Ò?¹bµ¬V¡EkäÚ£ý½Iµó¶!ï´‰ ØÓì,Þ¨X|¹°Ì®ÇšÕUI…®r?}½.¨ÙúI=9bû@Ó– µ7Êð=ù®2X¶œGú›âÙ|Ä}JŒõÛvvÅu­ëæ`r‡hÉî–&îloRÞ€‚o̹üÿ¶Iˆo'ÝX·FQ2‘\!Òæ «4ø¬å,w¿Åjx³é÷tjn³Rb9s·\¾-Ôð„rмQ§Í¯à½?ðC¨û7•Eý‡| Ò³ý ñCJø1*N[°à[¯~s‘•Ï=û×@ÎJ™†¢N^‹‘WNƒ åV–%åcq™J·/í½æ7‘Ôˆµ§Ô ì’½ƒVK0 —?¿°?þh§¢#·Æ,_1RÙc&WÎ'¢k7]¡î«íÔ@î½Æ¹Ê#Cµ/€T^2¯ ÕÆ-˜ñÌÓ“Ô˜GYmè†îPγV—m½öÁ®FçÜÒ„|J-(.íµßÃqצ‰ÄÖÀÀjU¨ËÚ3-Dʈˆ<¤ykHºØ=Y±²«#¹,³›W¯cOû€[¬½TÚðè¢ÆœãÀÐyÞe¡L"÷â}ß6ç:©Ä‡Y¬¥˜ؤ8ÎÊN–µJrÇ Äîw9§Ì{?ÛÚ ’ ‘5Ì8œÝ  ã’05wÎsšÓº4/ÿ|cšÄ„üô¬©¨ÂaÍ"¢:TafFóá jJqt û½H|´™tî!Úã)$Dýðn{¶}·n# ÷’‰‡¡µ™0hö/ ©CMш$LA¡j×b!Ƀ07è›pÚP‘9ëç™Äuj-/þágÇÐPÊE=Å »Vì•à}YC#¬˜1gÊʦ´”£™?¥*°b–k"µIÎ*k¶Û) ÀÓŠ%òˆºÊŒ7ô¶‡<‘"žûU5ttMa-Ó=þã8ʪ(¯.ÄÎñ¯Ã2vƒ6š›z’Î`BäGÑÿðˆár.î媆¶_Í>Ì"4×õϱ áÚ¹ÆZÆ~9ow·yz±6£ˆ×ñpžE‹HT(á70™«1Ú]j&TÕnfcþ³ó´ó¼sŒiÓEÆ8Âaó„*ÏÓ߀ÇqÐù4 ø¿ø›ž*[’'·Õïó-£ÌÓ'÷~ ePÖ¼#4ojoGæÞ\¡97-¢>;ûb‰]þHXÑËÑã3ᮑÖ@¯žÆ(ˆÊµÂÏS-#åï&'ä(Bo‚‚xä!Øw}ˆ…ý-ùüšíô öJ(ì ±Wi¡Z°¡~Ǧ©NS«±|sJ3ŽÅ,ÉÛ¶à÷÷¬Á£=™ÜÊÆc뵂ío.¨Y9W¤m•Z[÷V—œ{ØÖÇà®ÿïLVpú^³ª ]ŠIÛÀÏs*÷?1Æóè}<Ê1cBõÜœ£äÈÔìöá>?aƒPž´ˆ¬Nö¶LÉcŸ,¶PÖ6Æ–Ž‚ìXzì¬êuŸ˜ƒ—U>6îâ‹ïn!y˜f\`ïèƒÛ²MQ¡MT=Ue¼±GHØíY?’Ô9D ÙrŠ9^}ö^ås5ê±É¢oôwl-ä?Œ|óüOò+Íö­ýYñË>zþŸßÈ1ðÇü8Žÿ'“¾5ùz®?Ÿü/þ&  ÝxðÓóÇFð™iEfhv”U®[Û>àòC®f`¬î€Ê t$Ϊ®ÕúO®€fØ›² Ødë5tÅJÄ£L¡RˆèûõvòåÑkÜFk¦:´©Ø9?ëTyÖ²ði9¬pvÄ…;UeHYÛlŠªÓŽ|Û&e¨A†«ÿ5Õ/·ØTmÓÅ× =˜’W^^‡Û ÏæI—§ð§¼è<çPvãÃ1p ÒìÔ—CÆa‡ DÏó°9yr(Í^ušµÉ„ÊË xê!Æù+ùþuž÷Û1™VÈyÓ—ßúîã¯~õz·ûM{ÇÓ0* jê|Îû§×ïíþùåg¿òPÞnC!cœsN’7¾ÜŽ1Žã (SqZœ^Ýf¡ ‚ ÈI_fPhœ&2ÍDl:C?½~Ö1nÇÏ™ûnŽÃÕpN„§)ý­¨~Ä»á“Ýn8ùÀϾûÎo./DÕ²ù!ë5}+=T½1ãóëg9ýÅ:‡Ž#4V3çžûDÁkÆyŠÐlBÙl†²L¡Í1ôãËËËËí8¨Ž¡÷©¿¿ÿ ¿å ”ªŠn1V¸·2ÁnúVš;65ŠI‹=³9Œç >ƒ‘ù…vË«ÁHïѤ ¨9ó€tòL4!§Ø*Zžbø:ÿi~ú·—rA^^ÆÜ$š‡!~F4ù.+Àê]§„%ŸÁ„ ´(G1Û­Æc]bÖ ¶±HÀuh_iæªä“$#¹3j–Ã>Y?åW[¶{²:¢37–4‹pWãçƒU¢GD£%£ªí!k©·`½¦ :Ú’±,hyÖtÊš#Sh¤©mG>`•ç ydkŒ`™ƒ@”S:ßH9J­…RW ö‘uŽçîiS y-Ó`ó´R€Êò±©æÑ`OrÛÏ&=6`@Þ•SÝË9(€–…(‡Äe->`(¦Íx*Ò¯—1‡ú9YŠœzÆ…åÁ>íO)D\P—û ”»Qäþ »—( ©‡¸ƒ{ŒcÌ 2×!«Bçyúé?,fX$âi¶8.ÛC8sœ]¦­dTÕmó_°øð_¿}r1ÐÚÿaçmˆDôg[úLÜ :VØ`ËÚÃU´À'«c¬½úÃ9ù4"V i2Q’ŠBºòB s_ÖdòØ'UD«È“¢¤CQ¡–ht­_cup –DÿeL™Ë‡*`t¡Í]Ê&žªdmÖZÍøÈ=XEIµ PyqbüŒbïjWòz/7ÙöÖ ý¾`ø„W}“–2JÙÃegH{jC›l] •þAdöÿ"Ò´*y1j#Ú5×ø`Õ–ÔðCcl<”ò:QXwH—2·2•uƒ.ñee8êŸÅ1=´Î,¿ µŽÒ 9U˜µ~jz2Ÿ4M6·s犒W û¿][èíòpüä7bñæIºÆkr±¶òx6Üþ>v>Ðu¥´²K®fÁêáeª±·&£ÅÇãëê%œÀÆmÒÿ›?ü£ß÷¹¬ÇA†CÃ+º5VcJ¾}/t¨ê8Hò<§P 6¤Ž¡ñ'Y`"Ñ2Ôlfj3Œgjâ#Ræš‘1Ô :lȸ'’Þ6-ü2¹MPsþýÿÅ^غœ¸ÚIQѣͳ‹…mG¾v¦ö§D«õÆ!idw*1YTžŒFî¹—Þ±¹påL6ß6-¶¤mª [F&§R_µÌ ù â£YðJüеNCjZÀËö¡ØqzTW=Gȼø±m:3.Yy¿eź40ÙøðU9à|k^:m+òîu)›¥ ŠÁ'Ky5óù`õò=÷ žÖO¿D¯•æSÆÜòƒ}D„¨¸FJ^aXZþ¿Fæã,迉¬»ÓßO|SBÁKY÷“Ÿ‚ïM®œ• \^€H{ÌçݸÃûÀx~“„1]¿kÿéÕ·Ÿj Ñ'æe4õÿ›Txü‹ý8ºŽ’¾z±+í¿Ù¤íyå·\¾j¹õ¯ÛÜÍõ±6ˆ\uDÏÔðÙ|3ℌ²ì“GÙ¥,cL¤ _8«yÀzpé½K²š-Ù+ÝS"ÖŽ|çpäTzlööH↲¾o‘÷Ÿä1ª´ 3e'LØ4hÁå²?u÷ÍÚUÎi!ÆÎ$Õ3! Œ“•΋+?‰®qËz/Øâ9”ÒfÏTýíã{|ððøÿd ÑÚËÛ‘ÎP?‡»©ã»/‡Ê€È¡Â©‚»a€ÓC Mõ:0}þ} ŒŸ}0»½~z=ô>GxíÇð#†ršÌW±A;y¾¹ÍV­¥A`§Èô"ÄÎ;ÏsvúÛõ㇂2§ PÎû)Öp=DÄN3Uq‡¥oP\‘ð"yÀqŒCEÁsžãv@ä~ž~'ÒÆ18ùAÎsrª·¡ƒÃÆP3óÊ1tv;™È‹«:ó‘CÕÌ^^^„„T¿W{A•Ìø4­d 4,Ïê¬; ÍL =ûü™©sA•8…ŒÀ4õ¿ šâøÊòÍÓDÍL Éûë²u0îóyˆÊNZ&Á`ÓDA°bÅ" 6 >w4³]DØÚßšM:81Ñô«®_¡ûüYæôÎU—è¼µÞ7Õª!+ÈÒ>#Íf>´’Âvx)ŸsJèöj—¨–ØX^Õýª)ÿ©Ð¨ICtç+ÉuÊÀ³P#¦%€*+cáóI‰@yéHÞÂ[}~>0‰$sn磙¹<í ù8g=/š™gІR£ÂnúÏ•aÂ[ ¿Gxµ?øà%ÉA*J-F׆ݕ¨âr¤² 5ör*£ïq–ÚãÉï­\vïöNM5 W‘1Z¢°?r{àâähÜm> ºÁaBϵ7’Èëš²ml‘•ñeÑE'ø0Jš¾TQ<¸×tˆš˜Ý)E;f°%4@ŵ“Ôòå »ê nÜâÀ׃/ø»cñآـu—QT)~º€È<Æ8T†`ºøpN(ÄL!:hC¦ØEŽc𤀪rˆœFˆ  ˆ”C„¯´9T—q~¾{}¦=½;ÔWá‰ÈQQu^5Õå'3@}tÞO9Æ!FÎ9…¯Ÿ^‡ªÙœç©ª1‰1™óœA.lø7R!‡Ú<Ïy"ê 1†b|¸c¨Š¼Ænó8óóƒ Ž#¡X5…f0;Ë]¨QúCWÿç´¡ ˜ªÞ€&¯Ÿ…Ä8n®Ó©ª«ü ¡Qn·# ‹Ùƒà mf1kê›%ÝŠÌ9):"ûãûº²³ŠèA ÈéÞ1Žã8Îyڜ΂ødã{ÞÔæoÛ?ш9|,â@û—㨃†C$C³¸ê;Y£ˆ|øð¢ã0;EÓãD!VIdŒý;½ž-:Ó¿>ŒÂ"¢¢D6ÔÄ­VýøC+áïý²ƊL*½JÐê—p†|_sÍKo¼ý\:^FDNáðTÃö‘‘†€ù{Ysg^b?ÈÅÓí—áÕUÙ3‹UëO´V¾¤ðµÀ¥æþaõ›F“e?sa­ê‡*>È¥fíÊFþÏ û[»µ–SŽ)ÈžY=šqSjú×·xÛœ Ù8¡þ`ÒlG蘡h]m ß!/C‡]"Á»Û8+ÚÛ±~¿jÒ,é¸xÞ·îÆg~¶mÌy5æí ^}ß«Øä‹~>¼ 7ÂY—-kØq£´Z_éAˆ¾†ÍW Îcšrÿúváÿ÷ŠKžó<¥|r( ¸o‘=á‚<)€Çq»ÝôbvžSu„Cß8¢L+jw%•FdáÍœu™ÐÝNN;ësA#êy“”Âï÷3=XZ‰éÿòŸÿª¿4Ë—¼3?Ð.чüÙʰä¬kb\ÙÂgåƒS[é *=›$äPMt É4ëǬeïQ§ý'}¤5/)èYëí­–úÕà${De‡þ¯ùgðáòÕ¹3|ê YÀ¬lãõ£ì¾ÀÀ±ö0˳²>qtÖt[4$‡Å?Üvã«p }ý¢¼ÑŽÚNûXX¡%¿ˆXŒôT n{AÖ‹¹È¾ÊVjà3ÔÀ,ÓÌ5NÚËXwüZ Š–§âiO*úû,’|Ý(ë—T3Tì¯NVXÀž ã=F¾šÆg7#Eñ›ŠeChÚqÀô©4Óá1²ÉŠßx‘¹)(2ZûÄšì,ê¨õ½“½1«lØÉûL Œâ¾N°¡"@•1Ï[…¤•¡Þ³>2|,¾˜Žå+="eÏÔéâ8Ve¸äýZ‡ Yh‘½0?#›\³G­]” d„qÏ—*1³9]³”Sä…4Kj›@ÁU¿ èD°Ihp´G©ÕÃæYIeC· s¨ÿúòrc¨ªNál:}Æ ZŠÚ6h5oÔ]lL÷¸%fuQ)2'Í À8t5fDŠ:B8OÓñÔùÛ;çtMÛá—åf`ÉRý€]ÓWpW˜E@Ô;ŽÝY»êŠWÇØg‡aÆR¡A0‹òï`ÙGÐNéYÌÁÈ@Z>žÕ§n^Ð!MSÔ§È2{ÇÆJ*J:Q™ÿÔÌ¿¾Á¬;Iåp›/¢š{¬0ˆ Ø*æn g#ÉVÕè¦Óh)¥>)»×½±Ô*â“ &cÉÉZ-Û«†¤ls, ô´~.leüóDŒ}_ÆËýµ”ÝO¹älô—~0RY[¡…ÿ¦†Ž¯äêJ 0Ör»<“’ÁMAé¥\7&#Œ2ðQd#™ pÉ¢¢`E½[< ý–ÚÒÜF,\vÃÜ.ñÁ£¹ôeᮠ㉖ŋ¥×Ìkršo¬/£‰§JÄj×\È žéA·\ºþ^úÃßÿJ»,(CͰLà!°U‘¥¤5Ÿó™ôu/·ÛǼ~~õØPL‘Q=÷ç^O#T°Js´ˆbšŠpÚÉWñòXVM„è`êÓ¡‡Žÿû?ý§ö¹´=c·×ÖŸh`ñvÃ##›5<¼= °Ró*ìVðE¨w;Eü5¥bÎ\úUº»J±AÁ¥¸­°™ÕDî›j|ÞàõÈšO,—-}þ Ú ß>“ÖÛÃÕóR40*cÎÉyŠæ6Ùï UEØHv­·¤d;Ô:Ê¡:Pq£æùäE_º¬|ƒ€ÝžWáŽÕiØç‰5ˆ«å7ž.Ÿýòâ­P?ó½€õ#!wÜ5×Àöóç^¼ÃÚd5gÿH  ·{ þLÚàvÇ&J lszm“ÅÅjß—‹EY ‘_U«² šÅ× Î¶ŽU]Í«“Xõô²Þ‘½Ï&jäî±ß:‡ùdQ~ àm!:¹Pvsä£í7ïG‡‡¶˜õ¤¾!ýs·à·!=z+ñ›€>óüÖk±rV!I %À'2á•ïoÐ;õ‰°Ù¸Z´–eø‘jýjìzoò™R[Á C`«ä«Á~o©üü ÿÓ¹ Ú.xw ó+È@_ünàUKæ—¾ ¿Fåÿ)gòV%À7»ýól²gß,|åàåq €w~S|óÏô´M SüïFP¬Ë´A¬»¸X&/7¿y–o¤~6’aúåËü^Pñ¢õ¤w¥YÅò¨•"féQBÀ|/´S7ÓA*b31x•ú²ü µŠC{1¡ºHZ¯žàP³¿±ÖmÂ¥þGÜ <JÇkÆÁ¹/àÁ¾ ÉjôµŒgîN­} ¬O&Zl_äiäe븿ƒä§-8Ä& sίxšM›¢#œÑõÊ¡ê¦{@dš*cç4Ú Õ¡p5grCUEì&:§hØ5¸Søp;òúzŠ™MÅXV‹¡t‹¦•uÎù*ŸT‡—sšáÁT¤£_fwêtpDñ5vÕv»Ý_Ï‚À¸ˆ©þ£ãÇÛˇ›ŠÒŒœŽòW¥B!y7û£­ª"p®‘*\©_z—kòÓ9ç4vË,D†ê²xC…<Ïû9OÏø„@Ãσ^œÅ³Ùÿ9çœQ³Ù7 4dÙ2œ¨1ý0UdZ+Ì{ hM’«-¾D;"{¼\ïÈã¾%E²É>sf÷ÍœÍUN!¬Á–-œí¸ÓœdZXní¶‰M'öª3.É-Nî¹¹ÕiÅÞlÍ3Ö™žq¦p¨]û¾$9ò±ªGâเ3m'ÀV²"è®h¹‚_Ù|FažÃýw´Ó¿å žàp«¯¥0¡hÒv’—¦ 6lqã5›¶C†Î”<»9U³:ÀCáfYaë„ie©cHÌGîi('¾`9¼y¢³;†ˆCHÞšVª\1«h©”| SµÜÄd¯Å2Ww®´rHÑøTN•ê)L,M Í÷â’€êM’@ä:ògmµð°Å*BÀ­¡Š!œÑÂ( êÉìfü"¤MxNŽJ˜³¯Vâa.]Ñ“KÇÎ,»bE½k!·€¥™øÍ¢É®Mp„4e…ð!jľ“"â­jùš‹ÔPÓ¬¹ EÊòÄ$ÍE–È EQMÌ¡€øœ"I¸²*vÒ”WUÎþ­ïßÞ°ü³ƒƒêIÒÅÿQzÁŲ\ÚS­’/²þº"|ØÊ)à©ô©¶-|üö=»"²û㥱ŸÉý ¾”á«ýš›cŸkizsk»yŸš€È¯8ŸóáUz=›5&àKï]ûoÀX*èN9ø“?ù£è w~KƒÕÓÈj¹)3Ô¶s¼N2*©F”ɦì5ÍÚ)6{nUÇ·ãcœç4áœnâ ´é«4[9Ȉ'Ï ³á8Äi&Cä<-zþ{„„øßþú¯6¤ÅºÙ±$>ÜÞhA¸Õ±W/»\ÓÐ÷?‚–ho·^» E \>qŠŽ¿/Ã…Êf9Î-„@eŒ<³Zþ%ÇXû8fY鮌B_>¬µÑýP±ƒ+‹€?*å"Èb.·>ä£h4„×§¼?7±*¨h åò /<3Í©ÑJK€G()Ì[Un u¡Œ½ß~ê+uš°ýöÂUi[ž *ÆÅ+ž|µÒl[_k­­‡ÝÖF‘æžoó›…ŽY¸kY“Ú-÷“Zj¼Ži¨Y´õÀ×,b lU \’«,B¿´×våyÉÝ3_c“µØúέn JcN->aÃcqÍÀíMEÙK˜š÷9O2KãÙ ª²v¸iàcé®Ki«é¦bG“ö¡G·]v{ï†çãõß>˜õy cñ™e¸“†ö”!˜Õ¾À'WÁAÃþÞCë~û±Õdž…=YÑ*±ÖÓã•!«ˆxîý¾l³sœê ö“MÕo2ëCîwåÚw$þoQŽ¹Ï›¹Áå(O³x|s‹Ñ0¡_Êßû2|ã¿ ùßf€ÝìüÃUüg“µ¯Ç½¹ü¦jb¼õ—àƒ¹õÐ\·¥K÷ïSî¦À¸"á2Ngölú0²Ø¾ûÙÙáwñëŽ6]ùæLmáïò¶sÃwõù¾"—V{Õ¿B™¢£ïVmàÙD§ÆµãuhbØQý\&),á?¦š "I¾ŸÍLuBW²aý†ŠKo¯'¤TyƒdGQÕ¦î3öÁÍÆ ½¾cß~¶wÛ•ÝôÓ ¦ET#îLó6H‹m­$àÛâ9¨|øpSÅœóv¨ÂÌÄf˜V5ÁýPÑ¡c …žó~ãóý´i"tbn 4³‰¤¼PGß$0K²À9Ï“ƒc ßB9ËE!¡ö&«b’NÂQš¹8>Toc ýŽ4;§³T£í{ÖCU)þÅï4@b0÷zá…Æz }y¹¹ê5çœó´)f¦ÊŠþR’s:!Cõ6nÇè31ÆGþø…àÊ?{p"ÇípÞï$ãp|™kŒ:Ñi÷9†Žã8HÞÏ;iª8ÆqŒ¡ÇZ{ðÃ%°ÃͼF³9eH4`æ%X4%¼ùÓ§ê_DÇà>,÷^bç·ÛqŒÏŸï¤¨¨ðU¨n[Åœç,g‰YÇ]ÕYvõjÞrý€bêÓÀ„æ{[æô/¡‰Ž€³Bò¯ªSx\”šÞ* a·PæbžsÚEMÀŽd˜÷t ¤ÛŸHª¬ÖÒ"›šo1%>¸iF5°E´Ѓ`F‹(ûÙ.tùÎå¾ó« f›L[ܳc……‚m’=ŠÒ̬VV±”tY`â|0ÿêF g+\Ã`5VDqDÅŒ!°†¨I‘UÝ‘ªm¢›5õÞÜ‹p7ª“Œn4!š¨´VTË‘mý‹*ˆº“ü…Ø?ñ©öD¢ÂZX5?­óZ¢¼}uH (b¶º)­-ufND òñ´ÍÇ5r0õ XÕA\_Kƒ.|ûQ+kN:ROgB½œçé![Õ°„a7s.Ëfÿ£—C ?_¹Å 1# >ð8n«uÍ=x£\%kÙw›…¨ÏòfŠ ßZ´NhfƒAO-%o1‚æê³¬é«mÖœý,ܪ€]¡ ¼È E”õOºG=ÑeGlpùìo‰Å*ˆÜ|!ý¿§{Õ7¸Ü¥—æ ýÍžt«A/IJæåíÖÀg¤œ§}‰|¢£\Ø>xÃñÕ°ÏOi 5.»…óêß|Gß» àÑÆÆærÝ2 ÏžLƒ9)‚?ùÓ?^Æ^ĉÈ8ÕÀg+™}ð(¶‡´¢Pûè†2Ú{bãì‰f2w3ƒ²_Q z;Ž·—IÞç}ã&c¨ê|5™$ 5kƒxèF‡Â¤ñ]Ä¢ñßþæ"¤\½™Ax°öqB¶ÁÉWþ¸”@´ðj(­V ,bßC30÷ØüVá̦ËBô÷¦8…ïjÀÏ5„¨WQ¥tTñó”µÑ-ÁvÞÉÁ•À]I3®¿Âªé¦÷Æf{Ô™qƒ01š¸¼?Ã~ëš·©+Kiö‹Íö¾*¹¡õ‚Vp5Ë/ˆæŒ¨k™ÏAj;Ù+À/Ü'rg£g"}…Ò8ºÒ+r×k—O åþ§Ç£®–7ht1,~¡0 ¾@IDít‡ÒÄ—¼'K—a²(§âÕhÂô…ú×Zw¿>[ n›+ÆJôË¢Ûèta÷¹;ó—ÁtiÒØ¦ ²õ×ó*Ïû«K7Ã{}hAM^24¹•zã¹°üDc”'4¶GmÝ cÞÑ3¥Œg£ßK*m{Oì"¬*4PÙ…&|ë¥óƒ¼ÔO;S/ͬ—7ßÃ+qgÓÅ¡*Ã:Øj»Ÿýp }x©@ ²+cl{úw®ÁcpŽo‹Þü¶ ×Z› é­/yL¦\­ ëHýž½Ÿ_m翘}¿ø•¸yþGͼ?ÒøÂÀóÿ+{OŸâÔŸL«¾¢"¸Ÿ ð›\Üþ÷+ëkUÏÀ*ÔíõÛÜPìƒV¶­|ú¨`ElwÇ·coyQ ƒ³"n×—(s‘M>T\fŠ (ØŒB«­Wÿ»‰—å¿õßÔ#J}Ë®„i¡°ò’Fè¨2á}ÃóËc…"Ö–X!x]hÔ!¡iåwNÐRìÜ$k‚ë›Qýõâ¬äDÞ<¦Ol›ø ÑC B}úš‰ÆŸxÚÚå…ØÞHÚ3"´9õʬñrÐæ§O¯|Ë8#ÓD 8Føƒæùiè /·—^¦ýò> ÅáŒRª·1§ú h»ÂÀÜ»3‡Ú‰v€GšoÆPÒ9Q0¨É™j™+IœB3ÞŽãNS$õv˜™gÄæë+pÓë*»ˆ¹’×ü&<¾ìGÇq¼~þì »ˆ¨¢·éŒ˜4‘1ŽqãÃË’¯÷W3K~Žïóéò±ýÃðÛqXÙ³Cõv;ù°›Ùœ&Âã8¾ûðˆÇqžçÄœ4÷“œsN›q~5›$ãCÆ1Æy›~á>~ ÄD[f 'f¨ÿ""œ&S“)zã8„f眖AWæ‰ñ»uû0_¯fò÷9I›L1Çm9Z1Ã;†aCƒ¯9:&L¦%ÏåTŸJ˜Š’ Ì0,°+F *ó³‚Ô… ñþNAG̘^Ž©e¢^03ÿd‚s¿è,»ÆÁÝE·ºJÇÎv …ô46e-/É`it›Ig­ÉrŒDZÊ¢t;´Tü ‹’~EmVÊj4õ…x9ˆÝitìTŒD!§QE 1ŠóÉ™ÿÒÙbׂ㬮2©ý*Ã`ÉÆp‰’/QW°È³éŽëË\³)ϦŒ„Ù¨½«6ÜCð C|~ÆÍ-×ÍSK:Yê¨{,i)¯9Øà#'Ò©Lá‘äï·°o½ÜoyoÔu\Šo«ŽÃj¦.ö©4þS…ód®oxCm•&Çf2j1ó<½YǨ͌÷šX+#®æ‡2ÒN‰y‰Õ5ñøˆªcn˜³†«õ¸ð´Úš¶S V#‚HC¤Uü‹ÿ “Þ Ö„(–X'‹§±Y¾¯°^[Z ßñ¶Dád°FÓ£í\ÖaJN\£cüÓuX¯ŒÚ²-¿‰XÑ[á>TNš²ÖŽÞc©KȘ9âÚäO‹ìÑå*]ÎqiWóÊÊð„En,]=&lËÜ[=m _á9TcWkmëI¨…Ï5mz‹J+ŸD”ØÃ¹ÿ‘)ÐJ-“ž¹Ý»K|ìÏ·YÜš…Ã:!´¹ÁJ‡ÓÛ‰ßÙc£• rÿVå0¾º1·gžo¡ù޽®áêcÞ”#>È÷¼ªÉèÞ<(.|G:étYÈÞû¹;°Þ9ß]Íìüùÿ«0ç×àÑЕƒ^An,©ñì":u‹s’pB”bŸ‘}5Úv¯YÆ­b6%^ag¨V_Éàsî$}¹>§ÑÓÕ¡cÄOâU‹Ëïë'r-þë¿üÏ©Û6K×Ã]°ÜŸxÐq/1¿—ßšp71 -×Eå8XŠÝ×-\ÈhW/ø&í•KUû±Md¦â50¼¾Ê¼Z5ë?1ïÅq;‡phlÈþÊÁv·«¬ ´À!M‘Ê-—åÔ9®}êJ}Ä_ÁNËƒÑ ïbz!áã©,¸a@ö·&{Â’² ¸1,âÃæE®ë®ßªôm•~Šã>ÊDO¿ÊÅnÍLœ]à$^[ž!¦½heVq¡°µÌrÍ?QûÃ:ÀWV.–à0–@ë2x3¨ïŽÊ§cF¯*Üj¨é é‹k{Qµn„¶oK â:é¶açeäU¢x÷´´HÎþïÍ+ž‘Ë×òÕ »‡~›!¾e6ulE¶óÈûƒZîT°Dh‘ˆVËB\ïp>èÇxL‹aŸ<0Ö9ªö'é«I«]ß•Äod`ÿ¢c¹}¼é[¿üS+ç×{êÀ§|ÍW¤O ã0¸´½NÇÆâ8ðæ €ï¨Î?øÒáÙåà®I?WâßâßnxDþ±¤üÿ ôAȶ¤üû÷ÁnñõŽg<%ËçÅgøà°ï'Íß;—ã­hàÊVžEÓtoâ½è²_­måÔ„ŠÀ(Gä(,DfúH¾p!Bd°ê1ÖòŸ(DÔ ¨ñ«E‚Ö“{N•,NoŠVƒÐ¦ç•æ+|,( åêÕ`'ÌDzÉB^äÂMbL‹­—ÀyR]7٢ɻ^ˆã;GtP0Öé•]á¼’Ñ·¾59Xhν¥pFx=fƒ´BJ÷Ò†Ó³.n͵Rº¦qòjl€O®ø:ž xnhâ“ ÀóÔ>-žÀR5¾{|zhH~"Q¾>‡¼•Xã~÷·—#ùÚ©èH™k«k…ÃÒ¬áyÆ(—Ïbyó ðö–Ê7·?…ñ¨ymdA¦…aI±º«é9ƒòr6äÄÏÎ)ªcÄ“è+6‘ó¼Ÿ<¡ê¿Â!™6ÍÇD¿ø›¿éï¿e<ÓUƒv¿nƒj<õ]纱$Y‚-˜³nÕé+D|‘.»%}WF×ûr=°ìP ÝÕ‰þ³Ù_ÍeÏñ¨µ¿5úÓCEë(úˆÀ3qŸŠ/~åk>ŠÚ ¹™YCBPjóÙO‡4Šx¿½gá ¶&¦òDˆØ#oÛVhw©çqó¥.Wë–Ý¿¤àÖP»7ö ¦ÏІ×ȤzuýStÛȰÝ.´·ê“u燆/k´!¢ïy$ñÁ(?¶“}93cDí¹ÎøÓl'Mm-!>Ýñc„>`Ī8Z#KþÙ”ƃ$g &˜ÙSl4\MMMÀáu„€I-&¼È“êÎm[Õzæ·Ú“6Ó{úÚ`¯{¹ªwÜÜ÷xˆô’t ãÓ•ÿIÛëÚ·˜¬=S_“mèÚÅnsê¡ÜUË&üÿC¢åÓd‚\#†Ò OfèÛM˜ís›zÉ7ûZD³©mè„ÞyúÖ`âíÀ6Ï{ßnðõ‘‰7AƒïNOžëÒïù ÞWéñÝxï¯|“³þ' à‡¡üùÒ>߸boŽðÆX„Ï›Zßúr|à[%X> 7àábÕœ³ÍªÝ—ˆ‘†ÿj^],xòmÖ±$¨2zô‚ õ Ÿÿac¨ªmNì†ù­5WC[×Q‡‰g/z˜‚Þ|ÉlŽu·—hÃëY"ø¥½ª×%>ª  ¯"Q>)Ô6¾G÷kn.(ÀÜ3¤ÔÇV¡¥Œ{tnRmN«^ÊêÂsŸŽÆÁû‰^_ã±–‘xæýÿšÛ•?UÀ1ÜÝO‘¡ªà¡2§‹®'yæB½3竊ï>ÞürÞíx‰kN9 Ç1Ƹ …œ"ClÞÆ°› 9Tíf‰Às°øUz鵊7Ꚏ¢4Åέv.ÁÐôðˆ¦MÍd§çx“c"2  ñʪÈ@’ýC€K×íê§È¨ßÔœµT9 6§˜A8TåvÚyÎ@oC…÷àO:ØbrÎóþúYi“ ÓIR†Ž¡#‡„ÙÍn[Ì9ï÷ûq9’ TÕcà8Ôì¼ßm΀uP}9Fí&Ïó\Âf†Æî}UõPÌœ_Áÿð1Žœ6ƹæwþô/$ Ån„ìtx”‰Õa‚!’†{꿊 IDATЉÈTÀ"0=”t÷õ4Œ§üÞ¿ý ;¡¢(’< ÿð_ÿ¯áPÿ˜É1@S1%œ>šcMæ4r¾ž¯ªãpx®Be":⨳üYŸEÈ$FžðÍ òg¿70§Œ±­$§ojãèˆ HB4&˜• È38á`(¦8Å˜ŽÆ¡Ìj¯F@`Åœ1^‰)$ǪëòäŠF•µdO§„Çn+O) Wï¹È!˼À¨²"ÖÚÆsAñð~—‚ŸdI‚.ü)ª÷_¦®˜,åæÉÌuÙ+ï4´½TÕC~_|j®BÙÜÐñC^ÚC€^“g&`kõI0z5—ÊÌ*ýeÿp)à­Æ }áh{×ÓÆ€ýÀFÁ]ä%Q<~ö3£Š9å,Æ-¨go‡WjÓ[ ¨¿Uu.#žˆ›µ¡ÓÌ»¸µÌþ6‡Wä%*¬¨é/ÐʵÏÂgz˜~‘Åk»eæ¼"Ç¡«#ݾ£¨tQXc“¥¥âEUîbØ^qÿK7Íf‚K®" …­lS‹c¢H?ÀȱI&dºîêªýðÂn¿{Bô«’ÍôIç­°VÄT¤EE}º0æk‹É™°ÿ˜*HB~&¥Qü½ mÐüŸiDÝÔfc.’¬y¥£|&göY®K9 †Ö°RKÅÌØ›mûª·®Ô“Ýâˆr½ ýÅÀ,¨‘"”¤d˜QyËÞ…»W ×ÄUàì›wm¨’i¥K¡Ã…á#-åS³”ê/J…«"înúü¿ŠÔ$ØYl¦ªÎ‰e?2íö]c{J"wcz<âÃyðwrFß8‹ógyâø}'ï_àçgª‹™Zvlz› Ë‹ÍÈ¡ -˾Ïðºø2—SÖÜ´ú÷Õ(ÓN«Œm%0 oª— 2"¶Î ŒZoæÉCEÎX5ÜŽ‚ìpEÕa€jö·ÿýo»® ŸÒÊr ¾»uiðÉkšÝŽPâå3½J¸Š†¨é]üÙ~8VUÙÑÙå…öA§þwóbÏï2·›ˆ[ž$¥b–UÀ3Qj]¬-*ôP‚R¥}Ìr*GˆXvyÌæ±9=9)‰l9u®æjvebžÍÅú ¼SXI¦l½uØeü'­WâÌÕêÉ >’7U¶Æ’!±}¿¢¶a?K${5IÓ³¯MtüY„N÷ü£f‡TL3[u¬ªöB,Æà·TÏìwðM{f 8*OLIèb9C¥³ÄvKÙëîx”½†!÷üíZ·A9¹ }¯w|ƒ„öìÕ®Õ÷Föɽ£Å¶¿ý¤Ž™¿FƒÛäñ‘ìÚuÏ&ࡳÚ,êƒÌôÈ*ì,d6E4È«n`/’ü6Oó·j¨ëÆà¥[åmÕû"2IoXû„'$›…¡º\Z“/{&7ôS“Š÷~'ðýßøÍŠßHÓ~ó_ñ«ÒøÂ ßâûß%öw+~š Á3nÒ××óÙµÀ{—ŽÏ¸”xöøø7ùÆfü){ûñM<$Ì©°Â¨©‚8äéݬ¾‘òµ*QzP‘É*Ë`“:X#–i_i8FðͧQ/R0—´ðôBc4öóÆý¬O¦Œæ?’F¡}u_‹ hà2uï b5v:ß è?¹ùòjåTWTžÅ˜ÑÈÝéº|1ÕËá‡fB÷xLιì“lRD=hPå6ÐÔÂlÕ࢓7\5dä®–ýæ4žAD›]̬™n»Â á2Sˆ ™Xt¢;a¡R¶\²˜¯Ûº¸"ùR©%l…ŽW" Êÿžñ¾’þµÇ<û‹/ÇT0»hÀK‹F“ï÷dÖE:¥ˆÈþîo‡Z›y0lB±9cbµ”,R=JYb©‚*ç[äîE [Á€xz0d)Íå4ÒqQÁ%¡i„Á&Ò‰Æ@s ’vEÖÛrü>=Ž¡ãrú?$ÑŠøw¿ø;¬µv7pfó¡­ÏÇ€•3hÐŒõÈ߉x³¼lÍòÉ«ÄGZú¼£u7ÈjÆ>pÂe×l_5s:Mý~/ór=ÿ[o±”c&§›ß¸fäYEŒÛR.`_öX5²¥/uøa*˜’#cqúËZ¡D<Œx…r×B€GìþnŽE%}h}mV^o‰ªæ•’{³Þ³–d\µÊ’·{â>‡ž `,ö{—Ì#ˆ}]~ŠÐgâØEná1.ÞœkÐv­Ù2²!+ŠÀânõ€ìõ°ù¢ë@ÿ&‚¶fjT(!‚¯š/‘8%n ³Dö¶¡­²µ~#Ë’F)¯;ð`ƒ ·rÓʸ`Ö ë!DÂJA«ùh ý-T=·~›«8Ç÷u:Èuн?Ðìcö²ž…_ØUUËÒ‡Mu³×/‹òƱúà­š@FyÄ ý˜ÊÍžsZ¦„«jŠ7GãÜ&Àó”wÝíØUø›¯E5¸qÏà5 à·ËÖ—kúø~XÜâ ¥ó¥øößýŠïý>~|SÊá_zÀǬÂ{™L~]šåAïÿ2åÙˆ¥OªžŒ ø OØ H¾9ÐVÿ'3‘ôß6>Ëj^掶ʖdÖz¬íT=‹%¬22¬õ^ë8Bø›þ‚×+¶”q—ÙÃzVz—amŠÿRAçwg½h°«¡kl V5ø—íÌ3³ÌâoûŒ(Иm†x°Ü—ë!zpí hˆKëRÏÚIößRª¹Fl YrWß?ܪñÓâ3\WÜË=øœÔïiýiù?"r81âvªz ¥Ís†îÈrøé)ƒßª*îߟ&PQÑÎ9UpûøÁ“´ªgPŽ*ÓTÅÇ9 :ç¬<‡oöGâº]¬QÕepf(Ttxê?k¨Pƒf$Žã¥ÔÍ~5GrT帽Ce¦Âó¼q8˜óäyžúQÆÇ8™fî™Î—4†ˆ|úüé0SÀÌ\ÿ*½)Lë—ãöòò2çy¿ßÇ¡?~ðâ^UU[¢•ÅO«ã8¦öBÑ87ªF 2Úì]“Ã`ÓWF£ª›¼¿Þ¿ÿüIUñÁÈiS(ôþý¼Aµp—}w®c™ÐK ªÃPã™,‹cI3¤:9œQ–åVxÑ¡ªvž¾ñûŠjƒn‰U³<¡˜ô¦âÕDÆcëÌp’¼ð„>(Ñßþ×?—»Aª®q»`çüû¿ý-„éé–›()6qšÞ^€#D¸äR„õÁ¨ÎGô¬å¯þñÐ?ÿƒ#;F “¢–9/×MˆW_»œY Ú¢—Ek¾“ÀÃ㦫‰&LÃ|v'¢®Š¹Z¥h˜ ÄÀíÎÞE\U}¥£µÐ—m±€<” o¬V¨Ÿ\ƒÖ?]ñôÀ¢¦¸ yh”ˆ*eÚ!õ®²š¹üah5›Ëú´)ªÏHZ# W`;ÐsCÚl^l_«Î*Ö¢EP4üjŒÜŠ®ˆêZ‘¼I—‹±Ø’±zé}¨J‚zÀ5Ãþî"PA‡â3h–ê’£¹yfõÓ¢¥[°Á¨ðHÞÒl?k¹?®#Û—sHçm1|rfa×Ú HTºÌ€ÒÍ*ÝU‚½3 ÍšhzÉS”¶ÂËhîÅÑχÍ»Iççöÿç¾ÐM!æ‡ÌÖñÝëïßïýÎÏüÊŒ¡ulpËBLJŒÙÕ:’½“õÅ—žf±ò*0Khí@}ouä×ÎòiO;!u[yVØŸ`ˆÂ—£œŸå©Mëh•"2 ÄêºÎñ¢,´…ÇKE=Ùö_þò­Õ´éÀÕM¿òãÒOû§¿öí£X¸ÿ_ÍbkwP爕iML ]8Š›KÑÏB|fMo­7QoÉBIÜú>Ä“žùZï#<¥yÑ4 g-–=B€­Úsˆâ‡ËäÿGÜ»5Y’Gš¦æq² H°‚.9#³"3óÿÿË>ì>qH‚ä¢àeAtW†›îƒ]Ü<Îɬ¬ê (2œfwUæ¹Dx¸«©~ºâ‡ Aä9ÔñTií(õ,Ɔ ôå,=a¼'cá àÒÔ€0p— XÝ'û¤ |Ò5XÆuvä†Õç6CéZe/ÉίÏÚÃV%XÇöÅ"jãÃv%òêÓ…\ØhÀ×èÚOã>`êÆ»èŠ!’~ŠÕFQ*š{] [=M kS³&f}ý“<Žj͉sÚ§j€hÖ!¬‚ 5E°_¼S%°ü·zË;!–åÞ“!M+Ù?ž¾¬Ô ¶)·ÑöÉ–Å…ÁJ˵ K®œLÞfý%”U_-Võmzѯ}[0ìH‚ô…$©°½‚/?'?¨â|´ÌƒûAgûÜÁË“½=z=å–°Àî¼'ó oIÍãµ^'xƒsPÿ?hã~‹ZŽ…*îÐf‡ÅVÿ_6ž?ˆQñå?À?Ê à¥êÁ¸xCFR¨”ûùñØXlÔ—¼AÅð‘o]¶ºìObyy_?]æú†þ§ôÕ›íø·u-­ qD [s!.î™mJ›Àj‡ì½IŒ^ÉR»¾ºJš˜øÂD#òd­*#±ø `dÁ1‡^Ø–ÿU÷±P˜ÂöJ—unô甉*[žR\D^ SQì£;ÞXtk\œ¡÷lhÒLpÛÃ^|ú¸Iò¨àRXm±B?ü@áHº¥žÀ“\Ç1¢Y± %ƛĔIꡃ4êÐL¤£âÐ çÊkÄo”w6ýyžî|~ž3ë!¡a<¤bÌ9½Ä×£ÞQõÿ:†›ÂT ”BÅ13óK‡ò«ßSÌ9)2Ïçó™ó|&ÍhY*àJú43‡®ë@ý!ÖÇM$ͦ@ÍÌ=_Æ’oÕÿðm?›ÙíväΕ z ¨Ú9Eè¤Bÿã_ýµÏÛ>wz‘¦ˆ“M׫«{âH wZùw|8\UšÁ,§Š Îuo…<á£)S0iœÏ^r`Qv¨:|~§F›éeg’°þμÛÍ ¡N RÈÔ¡4BNŠ:½Á×AŠP¾øåAIʺšä øÃü~Š ž0;'N‚§c˜/,€AÁ²œ»^y1ÿþ«I•¿ùüb“!æÔîᜦC1`Ñ}ê[M›yPhmâ70vÎiÙÙÛÚ˜¨ð9k0nƒGŠòý—ãÕϰiÂbú³Í™­üÆmg¼ýÙš«Upzâd-NOª呲@åP8ò3‹6#ËCêl¢ñ*k9’( j±ÂŒ,35by¿Ï#Ë«JãÆ´F€hÿ è÷&é¥:†,½‰'¾S&)Ê¡e™²"l·¤!φ;D)‘G2…O²ÁŒÝ^®,倅pòhÈâ¸DÎÀïhi£M™ÕR~I›S P3Õc;Ÿ%?•Fʸdf‹Ž±w¹Õƒ¼Zt«†”LR›^a&ÁÔÍS°»ñ§ uÄ_Çà0 Û±gŸ§Qc„Ð6MŠ…ÁòákšZ, •«ý*XfÆôƒÅÍ-˜õQXºøa õ?‡<Üv9c Ö ’v}¬¾±'gT;° S”ÙØmZ]±b˜åm’-Ömîçhðñ~ѶQóï… Á:J=‘%täqZ/‹\ ÈM?˪TÊ!@t[#òÙÑHΨÍY{F ®»üü:#—‘1Î\ùèèšõ›Í-ëöá=ï3iâ{í;£Œ—œ-¼PÊ—¸Õ@`…zdÉÃ/ÛwDýÕzòÚ9ïÎù¦ôúM?ûüOÅ;¹¢(by„›!/œØmÐ{(óÔNÖ„™kæá3Š©ÁëJthJ†ëf/g~cj=mQÑ£hÑà,ά׶.aÝnðÕÊò¬j{g«ÁDä×ÿôOõ&²Ðº~® Ѫ^Û!#ÍÊ•{|’]âf`i5)FöŽãÕV½|—HÙõ”swJÇ…Oö€ °‡B²³£ýØî6ãïGïÖ@!9ØîÏ-`©5ãè=™w?jÉÕ 0Rãq®`ÀÉöE!>åü—M‰x VM\ÁþA [zéªõ×°í£ª<ïz#¶†&ÿmÞÿ¢C5éŽëï,ÜÚRš1¦øì|}Y¼ªúÇg“½kÚ–£m]hj“¨H áõ’j rî%Q€Ô “‚ŽÕ¼” ‹›âûéX¤Ò?YÑUÂW—,â 0X3@„Ø.màÀæögXC¤h-JÍ5 ›»_kÌgÝùÐÚ—¯"2®ä¦Éµj«ËÏZ`½íU]…çÔÄ»[` ‰„qeT³¸„Ú5ÙoÙ"©f´™y}^651; j‰°^]ŽX«¼Tn`^ ’|„.ýQúõ‚œÉÃáÞÞ8ÚþýýˆæÁƒú#´öK‰®„™ìÁtâ²rá&x)‘õð<¤d§ŒK‘Z%DðÚo¿&>IV盿î7nž‡ÀGsǯ½Ç÷,¾ðoð°žã*€R®É€W>Òëår"[jöã eË< öõ®³þP»—-£ý1Ù[Ìãi¡Ž°BÛÝ)Øß Øv æ}Acv-Rqoˆ”ØðŽvÔqJÇZD'ÞXsJC –Ï—`µ$x’Ðч(U›=cÍkLcèòt%:ü uŽf¡ÿë<±m\óìçï^ê›cx“-ý'½ôŽw†ý ¸´]=öð¶ l[{Êã°öޠáÌ^­çÛ =†•ó|ž’ ÅHº†ñ t*<‘sÚ!z„3М½#`šÝý U=æ ™Ô7ÎsÚ×_ëȈ=²É‰ÍC‡ŸýU1T†z:C1]=±,²Ä2ÅÒ]¾ªª:çt—‘ÏÏçóœŽÊt®)ŽãÇ NÓÉZÔ8¼*Í"¬íŸœ‰0#øò8Ã[æû ÕÕq7ÕñÍ7Ïóùùé³wf¦:xzzzÿþý×ÿù{Çqø+v1Žãtš™Mç’x.AÌ|˜ñ§¿úÛ Ðxx[\î«ÍûèÔ70œ­9ÒÔ ¡ÎžSÂ)p™‘f5~ó,uŒ!êªaX°§(PÇ,Ψ¦qˆ9¯„&2¡ @ó­š–²§ÁÍxŠ$@ ª&–^U‚ôÓ>†/štµA1[Ô€\€” T 2„ºæð“ÏÿL¢ÙP¦—;S|ý‡?<ŸïE•zˆMè0?Yhóùû¯žM@‘¿ýÙp–Ô«+¬Ñs-›ª½,f¥@,#pùýËjÎÂIµVx e –F­G h˜¤A¿Ók#‘z"@™ˆGM"‡ˆYÝ{Ö›3¬ÎèÂA† Ù¡ˆ1VwQ£â†°½2c³14C“d2iºŽ°¬lÑ´"‰v¿0Žÿ‚’HŠ` øA=Š€"Ï‚vQÆMâõ(H Ëüvvwеòfñî¤ Ëî|¯E—JµªòöÆ?±Pÿ™Ź7&åß²†ÜĤXÄ„c=À$¬åXk:W[x!Þß"_W‘‚‹•a5¶Ÿ­ùhóˆ‡BàÕ‡GçñG–6ùÕÏŒ;îÊNåÍŠ:WÉXª‹@y²½Ä‰9)ïÆeî2©"™ ±Eý»ÒL0NŒ¡1U`l~„â{íg;$Z‡ àIçC"úƒÄhV¢WF\¸ŒM1`+E´¦{c<ÿðw¿Þ>ô†õ óÁ ÉsQˆãHS« 6»ë—üÊ{ñx•/Du97¾.èm²^}zÄã î´Ã~ú¹ãy´Q-º};g@º‹+¥®'…›ÛòZµÈ¸C5té#äRÄÀgæžÓ³ÔïcØX]Ï+$ÃFÅk<勲޿˭¹½ó·:¡C÷7¶v˜ÝæŠ~­ì”ŸMÇÆî㵆æ~FÌ;«d¿¹î)éÝ}ŽŽ5e·|-ºîiÞxV½kr§-€Î¾€3‡ZÏ•tdmä¼4óAÄÅZµ?üP»+Þ âCÊ5Öjuý±/TÞo%é÷/¬Ñ½åZüCa³Æ†lh;·ãÆé^{³jÿAyýcµÜ{ ÿº‰÷•ôR?÷è×|ˆšôòûä·I0¼%mððòõùørO$ÊãÑAó•où…ÁÀKe¼cñÛÌ^;\>^‚å‡gy*í4lwÝ>·®ì¾ŒÑš‹Ž ÂŠn„}.ôP˜ jÉÉQ¯u žbàˆ¿?DL¨ ¿å(]> øÎx—§K„F‹1ú¨âú/Vç£ÚŒƒe<çzªá=™UÁ§í“É ¤æ¨Y¡¬IyÖ…bP£F¶œÏÕ©Â(fQNohÃ7WHƒëä¼&âüÀmª×)ùžVáEæO¼{wx²ú¦ªClŠ‘áˆDê"\›“Ç8CÄw]Ã\#ÏçgŠxw®Hä9ÆÐã¡SDô8QCu>¿?ÏgÀÛL=ÿí+7EN„ŠÛm)<âÜ@•æöK1ãð™û:À\u ³c$áÎnŽq|–çÚ¹{kŒÛ»Ïôv{:ŽÃewU5Ûü‚¾32VöKÈ£€ÈÐá ÿ¡z{:Þýþ?ÿðŸãp›¿@AÚz;n>C5&ûâùéç‡ÈÓg¼Éù'Å•^Ç; ™ü©Í$#\ÏÃÄÄH%feIÓë_Ê8ÄÒ| îw˜Bf6esfFL™Þ±ë iª y ²¢v;e‘2…J Èaíœá_ÝtÝÒüd>ÆNÿ1ÞêK¡ÓÂTE"¤Þ>»Nw)ÊG¬ÙÎiÑíQèªû‚§=PE]D'ÌjƧÏÞ=ÅwîTv‘ANåëç“‚£/ÿîË©À_ñ”. 4³N5"&³Ô/䙇!|”ã.¦Å/.£Þª°ËcŠD5w{ª®²P5)z^" IDAT£(•ý áóãdnج€W¸Û›³.–ÂBôDŸn‘8óA‚ ©":Ǫ̂:Ô -«(läê¯ÑX@.fy-kRÐÊGSÐÓºŸR´¯@ƒ—d¬T.ìTTM^šB¯'mV~§Ù9ùäGáOƒ¨»ÐžÞù¥«v.†¡§ŠL^_3wÿX ‹ß•-] 7N¿ž˜3´r #<¶œÝuD‡ JÖånh¤þÌ[$“X¯JŒBsß4`t,Oî4Ÿ!–7¿ÃÃY>êµ¹A3’UÆÔXrX«,&«h=ÆvĪÉSh+ÿI½ éYÁO'yvséοÁš5úpÔÝê–•-›íÒÄ3rŒI‘öæ´G€)CD=Å`ÁÕ׿¶ÀòÐæõï`/û—e`‹=hÕ;ç`¡iÑ^«î“ [)ŽüJª#ÑáTYIÞ\V—@!­{£m¸SP™\ìÈ€®”¦†ly(w´Æô¥wd/mW'Š„=¡ÂÞ+ÞjhÙ,öŒ¸J¼º:†¸¬e›ûŽÂY‰‰nI[Ls67-·rÇ21çb§bw¿prç5 \²<öè‚ÿ¡ÏòÙ²-è:µÙCË%7rTf¾Mbu•Y+å.K·Drªˆ˜QÄÌí‰ì‹­>ÄoeU 8Æ-üa!lš GŒCOV{€¬lÁš°¥ÈÐ’ÂG¿ª@}úwÿû÷£$zÃØes=$Þ9¹:¶P-y -ìÇvŠ\Xþ–oæ¹ïÖ³ÖU°ñ€.¬Šß>@Së¤/í¨ÓŒÜ•§…ÁÚœÉ}j°>B\0åŠÊƒ[î†5q<Ôú­ö˜”Å>yYÍÀfäbηÂlòU +^ ãm÷½%?×jk»æÇ>¬$²ÀN«AFË–¾&]^êò2û®W|é.àqvASŠ¾ç³Æ(̤*ëžÅ¹toêTëÜÇ*¸÷\†4±`û˜7Ö=Qp¯gð?4ˆ0Ô#wJ&>õ–qm/_Eº~½žW%ô\>ÈFŒn…”Åì¬?»/¿Ï†qÏÍç>xxÐã‹ýöZ½ãwW0ùX)¾¡¬V›5Ž]C X\¸æˆi1ÿÿø°Ù¾«®%}õfͧßÿMö_Ô+üè65ìåÈ|MÖ}‹lƒGqôï?Õ"¼”Ùà Be¯à¸®äh&€ÞÖ¼'?ÀŸß%è†*`ã——ñø%oÁ ÃÍõÖrûääC‰„ÝEÅW¿G^$Ëï¸~à•?ùG‹|ÌkÄ£‘ _ä)}8ðò.¶C«â²ê|d@°™ðÉ6ìWfMNYþƒjÍJòäÚÈ­# †:U­VµÂfß¿ kßQs)æÚ¾"\‹¾?™Ä(çƒAÆjˆ:b“Vþ%ž¨Šã¶¡b‘V2‰ÙCøô}P|$¨ÿüdFøk5°UC­#';Ñ27jÒ¼€¨9Jߟ'¯1õÅ0 Iwš>$MÙƒi÷çv[Ü_™Úvoø#%tø $T˜1j|ñˆ61³é}°sÎ9Ïñ#Õ¤Ó`ˆŽãœÓlòäœS;†#ò¡ªÖ‚óÂ9OÔãèè—é¿§¹ˆB98ç0ÆÐ(ɨí{P¥û®pH»§ãÇÝ,VÏc !'ÍPµg›“ïn&¾G#UuèÇE÷i‹.?©Ó{ÿQ[`£=󅃧Ž!*rˆè!<åLQ”çí„A„ ΂DŒ(:§;©gê`ôC`™mêŦܦè‡, jồëW”o4g2¸íeÀâóus+™ŽÈÔôÂfÛ.j™X3ä¯ÍñEa jÓ…Ô©žE=“äÈ¥1ªÒ¨Mh˜C\ba DZá´)ã4›AV›Í°i*@9œ,Êa2ùnÌIQQÁà<Å´ )¦ö_rŒã¯¾x·ÎYIz£‰-Ñ­*YÒîXHúÇZLŒµç¥rO@#Õ!]®z¦:‡POÔ`)÷QÜNÚöð׸z¬$y­rͬ@#„¦á†tyÇV¢N³4zuDx×é †ô¦štª­m˜ gz‹—§Í#&M¼tR&TÁ3Ó¼C`ÍͼÇ‚õ¿mü%–¬æÝðúš )CÝ´Ì=¾äÚætÇ¿FÏí8Žã$ÇmˆQË @6§§¹µýœaX8:Y"séòª[¿Ðžf* Yy˜Ü`ñ¿Ñwq3/Ñi&¤Ž!9ípÀÒÂÆ­§™¬®S¿G F£î„µßsEêt–·›”ÑÉL(û\iQïÜHÉmŠíçwýÆÍÎ#CŸjƒ åšïˆF¦:kýÚÄbM¤a¯qAÓ±l”ö)XîÒ˜ñómu~ktg[(ìYê>ÉÉ%y£{*‰ABꈵ»[á×UiNe¢æv¹éó÷j«ÜŠêÌC™Xw½Ú½Ác ~ew DI«DtÅ ?±¡…QÛØq:+¯œ­âÏ1€F¥ú vøa @ƒ­GÅÆfk £\di{µCFÝ{Í;L[rá2¸!̽µÍ›²mÛnœb}—¬žƒ°EJh|Ey5é)› 8f#¿„’ÐöÈž-ÊŸýä6“Œgªº kÙCé¸}T·RÍW–HFá4mÖ@EàΆâ–«ªæÎà ß½^i»µuª÷ÕEk#À‹aœF[ZÜN^òY´oL‚¯mâOß)8I2´H5³µçüÙ#™.šAÿé~ÓÔcì’ì]¢ý"ònžûdŸo`é.FÕ.CëpøP9XL,–ûV¸½|ü÷³\‘ ð¥¨dèrëØï\4ð*VàhÿPp LÿË1ž¦•ÛÆ‚l¡uõ¬'¹KK¸SÐëÉ>Ykæá4 i’ô˜3,÷?wÎC¹¯ØEÛàõ½äADä*³£¨:ý9ÀuøÅå+ÇåB\€®™ï„ÞÇobÓÁ­\g1w½f¯· $¶IòíŠE«¾¥ìÍXS]¬»ª­?ÌãçEµzl¨‰ê¯i_†QG²_ï+yŠEÔæÉ‘…ÒQê¾Ve V|E¶b‡ëÓý…ȪdZ3ö6ÙzC°kŸhf/\‹WÛˆ"™—éß}Xe iqYWxY#¤-/iÉ@ØI3ªK𨚢»OÿU'{+’¨óNQáÐ×9osñ[­H«ÞÁ[¼ûÄ}¾ô¢ßˆ;2çº&¾dü—HŸ½‡[‰ï6!Ùv@òÒKÜ"&?³o jÍ´ödù|õ1꿼Qý—áeäQîj§_Ýÿh4×߬)¿nyEÿ8Uÿ{¬~x¹óƒ¾<X¾õóº["ðÊdæîñ[f#*ŸfÃþ ˆ]¯ñu›S"ØÕ·íVVU¹4°I4jv•£×GKÉýØ ‹.kˆãƒ,Âèš§Fª¡E¦ì‡)>L¡FU¦Ñ ê"ÀìðÐm©l÷"è±Ûã(ªR=Àaú‘í9†ª Çk›ö¢ûî—§¶µm€<Ï7jPLJ¦±Ö w-[Áƒ*à+Ìêr)óÑ í‡ªŸ¶P”*qœJ›C2rN ´7TU1 8†‡GpŠÈ¡ê –‘0UÕá’‡ÿÏñôt‡8“gΩÍ_¹R$uáBÇ¡z“tqžsŠpPÔ¡Åjy6óë’†ËK€c(ó<}4@›"2t¤Ò•R{¨|6<¬îתººíÒ¼ ­ñ€ˆÌ9½A §ÿà'¿<‡Ý¾ÐwSúd§PðÊdsj¨£¾¤èÀ:EÒÑî\1n D88.áE!˜†z&pYL,ÿ²©3=!™g·ˆz·¦@‡c[t2|þ‘ÓçES£×ô!ôZ󼕰•B6‘‘Ý"ÞÀt¹¹žì0̉ã‚6ý=0¸7–¦¡ £©2)®ºÈ§ ÐôPÞ„cˆf@"î#6]|7rPQœ„™ËçæÞä§wÇóû9mRexDBÌH™2ÓPOrª ÑSLþé«)ªªò«Ÿþh‘u“äÞ,h5VT˜:Äž‘ápW|À„Nì õ™oÖ]ktn“,2ʪ¦ó ‹»’"'Ó'Òñ3ƒeËS~´Äû ¹4Áy%³çr8Ðy©¬Ð‰wƒGwý"tWˆÌÊæÿf¶éQaóaœ¢•V;ì¥Äé à9¥Ô‘£º‹ýBŒ§Š9-Ý·þ¾ÍE~óÐÏ2ñ=mÎM£ `@‡ pÄɲ U¹ë Ú¸agNüóP»Ñq·£b@~@#¦uLóÖÆ¦­ƒ/EƒbœÖ ®úHò´XÜ4BkRd9×ég3SÕ‹¸TKPDUÍD8Ýo\OÄÃVˆÃïkóÄbήÐ@ð£|³‘À+úÏÜúˆŒ°¢®!Þ…¶ÄGhý©1%”ÅQ'ÁYßYØ’÷ÒPe2(Ón@äåxõàˆjS™!¶št°·ƒ‘HªÉYþÈfð£,Õ”­½>+[^ /á*IþqdÀØy–ƒ2! "£Ðý­¯17†§!ÊVJȺÊ$É5eÌq´^{´bl' `NKîqíI#nÇÕÏP؇Œ  :ÖCÊ7”:½ökŠj}]Œë)£Þïè1‚²¥ß¹Dšm]ŠLÜ<« d°¼•Ok¶UêWA0þÕŸýhD 1W7¿kT½ö؉7t|WN~5Ó ´ZÂ’ãöÍ­Æô2ؘ6Y_ÂN¯Õhj\äížÞÉÀP>×êw”1¢kÕŒe<‚+Š¡fþƒÑxÎÂTÐhä@¡IÓÌW7LE«dBþãÿþÇ>Qárg5õû(»¢ÄEA­Â¹ðÔ³â/Ðpú44îm^RÖàdXQ4Q·Ã‘Énub7ÃíY¯†çÁmY..Ks¯ù®xvÐ Uúõµ;¡KÆæ˜zÐ{ùè® K0.‹ÅR¬r6o[óóÃõ6åc%é±ôð²ú_)’—Ý’µ€ÛÆ2bAåýqÇkéÈ#GšÜgQ’ÍC¹ ıˆ³µ êïa÷âyɼ>ÒÙT¸Œís]:Xåi©I27Ò9ꉾU]©d¯¯~Á…À.ï_^=¯B"‚@L­ê¬Ü÷®Cq3ËVi©«i1çúÙ´Y¯P tÓõ[ä& £MÃ6dõ€¸ègÜ$\§të „lJT×…ï5µþͰ_KA¤7¿ä£ÂÏž=‘¬‰w<±B•o1¾œ˜YVÛèâ(˜ƒ³=Û”'g Nüg Ððu³øÃøÁ}YéãD”Ì4û(Dju¿‚àu– @{Êê‘æ)/Z®·“—¬Ä™µYS(aíQa<üäøé"í þ¯hú/Šø¯ˆÛà›¤~„}ÿƒ?cÓèÀë <ßòG¯¾Ÿð9°ãí äþ¾¥uš×ĻÿÞ¥gîc }7Ôÿuü¥ÊFu¯öÍ´^~`’‚Šð³6]ùôÔ7óå:E;õ·oâæ^Áh³õ|yæÂÃDŠ7o6|BüE µÂ2ñi„|kã…-6%ôÚåå§§¨5(‹á1ñà¸tè½} j²}IÞÃ⺌,lv}蹞V®‹2J”9åºìâ…lÀõ"y8×’?F@ðô4|'®€çóy*}˜‡ÀÌfðû Ç1 ®\؇קcPÌlÞžn6íùýs±þ‘ÈŒ—“Yœæ]l˜ïßÇ!"æÈíiÆ Èmõ8Çr›š‰ˆM›À·u;)@5ê@ N È8n€Ø<ŸŸŸ]ý÷—1ÜeVð„_KúLËnŒ1‰RæK`Üžn?úÕ}ïÓ“w¦µ’ •i´95¤:x ‡è Ðw$|êåÕÒx‚<Ç¥Š •ôs¸r©éž‡È8˜™!U¢V N‘A6†X€tGÌ¢í#@ÎI¾õòe±X58MœZú€$U…ÀèûÙ;ÿ® ŽŽ´©É"²h¤stÍâj´6ÉåØMûêw0/'0U̦g`4ÿÖ:ÂHz‡ÉPNªÆYq:ŠÉ+<Ç1v~sž dž§;²Ú¯ˆþÅßüÄ?üÝ?› :†‘b' ƒªÎ!À?ÿëïEäWŸÿ—€?-}¾§,÷,B*FÍý)S£(/}b)$ª)’] f2 ÒÊê]ÑÑC>iñ , ÁáÊ]Sr‡ÖA+ZSrW§ÝÜbArÅvΉ½…œÄp×èµ2BôM¤Bfî˜å>rœ¤þøØ̬ªÞ`Ê”¬ãc³å=ì’À1):Þ¬%…œùÕˆKÛJs ÕÔOÞ 1†@¥fÓ;2&äÐE½¡Aíôàøêlf¡§¢ªçT`ä&çæ|.´ƒ“Ï´½ôć©Oõêñ¢& –OJÐÄ[»§o夋ÆÞ ¤Kɬñ¸™W¾I¬ŠB¯ ˜œÜ@½eÂü;tÅÞì걬ðŸ"59.(øÏ6 ª#z~TÑ?4¦–i@\jC^yš w,ç½éÅÂ1z³ 5UE¯rU*yÒ)<ò¹1¿«6°4.Šy a,Ìbñ$C{^:ʵZ cB‘”$-Ÿ, T¢N´ñ‘Ò>²HO‹¶s9Qê ²‚^xŸÙF>/¶Wi#öÄ"þ¯1^þXDðÞ#27k¿zt"¥Ô¦kŒx„ìÞidë@\R–ÿb;‰f…ʪÝFkÙÝ爷|,is”‰ºZv C.>ÛîP›8ÐZjɆÇÈWýãwÕ\ûTé‚Å‘Ü?è€ó°I`ÓûiÄÒrí˜8Í¢‚‡…Ž‹®XÿòµR,7xÂp×zÊ3±YV’^Ýã~áh„¥£»iù—•mÎû´"z#ˆgøŒСCÄ@šØÀÊмðÿøëº?Hw9ª‰½(8Wh¯Ý?«¦³UÙýÍRùc´²7tãVð@·(1¶ž†Ìèk¬ÒëjµËQƒ½.xýŠU„Èî ].Ù;kÓ~¸ÅEƒÙÚQ¹~B÷¦öl\ð@ls”¬|9AÝ 3½¿‹hÐ%P²Ë«u„Ü1YQ”ø{.÷ª é·u)I… ×Es´:rÈf),3¯+›Ê‹ƒª¤në,zÒú•ù¨ÌÌgžØs®—Ù°îÛo‚=Ùªç«}[Z"cƒÖuÓ# Ò-eÚ4˜¥¥›,Û¦ŒpZ[ò•sË8”[m+êNß¶Émò`7ó<©ܧK¸(æÝµÜ\«xÄ•Ùë{ÊâNmÀÃnX´K3‡Š¼+óxÐ>¾¡fÐúGöi[M JSÁ—}â| ôÞ‰vX€ªª÷ã“¢"3è#ì ¸t_¯«µ|Áš|ù˜ÛU²Ó¡ñàã¿|S/s¦q)µàÃùÁÇù·?b¹å¶ÒÜ£“™¾ØÙµa)`׸È?†‘ÿŠÊ ¾ð¼ôn¾µbŽ7ûúñôãWý¦û}=^¤ ÅÎI™6…óyŠ•ã¦ñ3â<9Ežßó˜6ž…„‚f3P¤È ¸'`Æø?þë¯Äì׿þCN‘9I1žUSSN?øÍïþ?¿ü麠WâÒëvÓ…ÉÙÌÌ®,;3†Ÿqú!ËXT¸^†»j¦>r˜“þyJ˜9'H Î-m1\[æ@·fHÊàÌÔ Û²‹ O^Î2VN]Š·fFò{ÈÂËÁ¿‘ЃÎdZâÒm‚A™1žŠ„PUñL#­ÐEþ@ávhDÛGʪjyš˜ð•®PÇ,ID05‰åC ð•édóó2ezFîPoåG%_wø1ïpÃ@޹–.l$ŽživÒüL;oÓºæŽz‡ç4U>ÿ,1´¦&Èh\°H3«fÜxÀZÎ Õ‘(-æ•6†Œ  &òZcy¶£® ÅÉ¡ŸÌý%•!åM á*+ŒÃzêPqu·‹Í/i˜/Å^g›Fõå@ÌdÕ2°¼›¹â `yNV†dU3—mG% í\ƒT »z–pUiÃÖ´®’BÈ¥i[uò>Ò¯ÈU×KÏe±ÐùÕ»Gb#–9$.—ªì–z\Nî…˯Pf‘ J}ó^íìßVŸ[rUxb!›Ž¾¸õÕÝÂUfÈD÷xþfàª]âîx‘#¶pw(®ÖѲe!¥4ñ*-± ªøW§ÛfÞ×ÂwA†f@sd¬*1ú¾Òõ¶!*•ÓV+%AUpúnÙ|' çјŦÈZÈ„êèeò^ °P¶Œ8…pÉ@K`Íà Ï¤¬ì´^$8T¯ìúsºœàq-ä½GQI1svS12“Ë&øí¿ÿ¾¸ÊéuÛ˜xíÛ—&·PÛy5—˾WÞ‹€ŽõE6&J“ïJwÕ˚˞§n©”ø“ì7F¦Ÿ ­†n½±Š(b‹¥5êjƒ§ðΈÉk%–׫âÖKØó¯›¢º|ÿhs<“pAô¯âùše ŸÌPDØ~$‹ze#ïÿÓÈ6ܺ†/âUÓÝi]-Ï/µ  ™°±Ëb­>¯¹)¹°Kq”‚ÿm{Ì®Çç]h"A°+ #ÕY@-¬ßú®ë!€MÚ'‘À#´.ö2Ü«¼¾íVð%Vµ ¬Ú®â|µÈý8ñå,Z#ˆ!¶`»ÚŠÉØÅÙ ¸7ob›´Æ…ëWI¾ 8Ä wÍ•ØÒ ukáâ0_pK3ôGhC‡ÚÅC>ö®ã‘éò·Gø É”\FÙÓ>{øðýÏ7˜Šqy=ý+ǃ¯Ì¢¯Š´|‰ÀáG½æGtu¹C*m¼±K)iE.b1ˆ‡£“è[|³bþX,ƒ¼ý»|»Müc€¥=œpü@O Ç/ñ¥o³`üÈÓãŸzQʯ­«/ÿ~S–’ħÏäÔ÷€-޶v-Ýœ@¹lÒBâ/寳íAQñ¬#fÝvXeX24E,©=¦P1‚,(óáÚæiÛuúé Ç VÒ>\§™ýŽÙÀMk€z|B<ú²÷£é7ºpÐ tk¦r)Cƒº éšñ‚Æ|›• «ÇàÚ`º¢cèÒŃ7=TåîüæívCÏsRøîÇ?·Ûyžf¦7éè›ã8ªMTŸÞ½Q`T6'Eô€P”ïE”)š!&§[uÌyjÄ̦™]øìÉX½ç²1ÏSŽ!Àû÷ß8ŽÈê“€÷@öÓ¿4¨ á”9Ë—Sìl›QäèúªJWùó:R@0DõPmšÂ±YÄþ›½*Q)Bõì~»ûLxfz8 ÔBgST,ÃŒCèwOVf8æ „ns ÉóP vú—B\$µßüæw¿øùŸ*ªõW?ÿòÿý>»Ušfsª@ø$Uhò›ý½¿øéŸäÙ6ÆL+¡Ÿ JˆD†Ø{˜ªl”NR/l•Æyó1€*s»NgHÚœ&€E«¦ƒAÒ—¦‚ˆÂ‹zJy_˜”_EvÞê>µ)[[úœÇ¨~76ÍlÌS¢, æiÓ¾ø¶²²µÍº7ž˜ƒm‚ß(ÙF—Ò‡’"Ç•äДå•ׂ§{ sìÈc­Ê,é Ü é„Q¸8:³¡óš5 \0 êï#p—1fH-Í?›Á<çLb„ýžÑ¬ ªOä%—Òœ±UÕÆkœôj¦Ž ¼:ᔓV,ÿå òt¼Ä ²u—‹Ì²^ µÅÐHß«Wˆü¾ª"Áûu2ÔÓEѸcùò·ÿö‚*À«º·“PŒ[ªü¢°/»PÇ­WÞ2ç7ÙJ!¼ò™ïbëú°¥Õ8 ‹»ýígìÍl½Ô²:œJ—A§ýûA¢9– Ô±XØñ•ÂÁ• Ü%=.b·,éL¼úñËŒ /VͤÎÉ2ŽrµžD0ÀÕ;LÙ:b·yÛúỳw3—³­süsð©…‚ïç¶)¬LLÛ Ö¹yoX-~[#^ÔÇp…²Ûõ϶ëÞ¶P_ãávx=#¥yåöÖÒËWrm{\WB bŽ}Z°z0p7W‚\aêìŽè­¢v‡<ËczlŒ‘–I¡ Ö,¡;¦6-%&ô%ϸuÓ øUvÏ­ÎÈy©‚ßç²E".rüµ÷¢¸wh‘æí¹Ò |Göšèpp§aÿð—ž…Q_XhcS£’§„WäÑÌLáÍ»wÝ·¨öv Ç£-Ë¢".Ÿ¶/—ot\¿Ò(‹¾ÞAîÎ0‚ë&¿êåwÝÓ|eT‚æFùD]vÅ0°•ÆÄUÀµL¹¿–½miÝs%oÒ·ð1pµæF¸þåOžå╹ÈKùƒoýKûßÿp˜à{Éà:o|ÃoÅþïOŠBÜ1^¼J¾£Ï¡ÅÌñmp@Û  ÿPË(~ÍÖ}š¨æ…Möpë¨YÂJԆŠƒFà©ûU½s èÀȾ£-“«%((dº\®ù2Ò™IÄ$xtÞœ)£En Ö"®œ>¬üÕÖ»OŸI@‘¨ËållSÉ…0R ÕË‹¯]ÔŒ¬Nœ®7ÆÙhÅ>L¤¡2ýc¬½.’I¾]`ºÏ«tKP4ºÜ=øíÿ"rŒ!"ªCõãgŸý"Ï￞s:ÃÇPÕì©WèPСU(üñ|>?ÿþ?þCNP8ïôprõ(ŽC‡òœ©‘ÒHƒjÊ©c2Íh¦CUU£ Ö‘4;£rÀ}Ìsžç³Ù;3œ“å¹ð›Ç‡H.Q“Ó¦;¾MCgßüåÿðöVQÑ!ÂQ:0B%f )k:C9oCGŠ»ïÍÏ PÀÎÂÌë!Y ŒÍ¢ktª• É­£Eû_L·Ôeà8î8}>ÝF!mDg£‹V,WÇ iÓ6gª. “~"¼ZÏß¼ LU7äE“uðPŸ¢ £MKÿÛH3µOÖTÄ”BMoj§Óoüw&y¬S Ñ+<„ÀíÓ,kt-¯+åJ ˜ ‡zí¯,ºùt²ŒåÁ ©ot]~§——Šœç43Ø{á89¡ãËÿ£'¿–”<¦¥ùÝ(0Ÿòüü—_í_þùKÕã´éÍ»bæq(Ïüæßþ}``_üäGP‚[1šâªÉ‹„µÃÊ}7‡ˆPM©Æ%vzº$Äkon¨ Ì,H!1º 5Í¿¢Xÿ4üÉš€³Ýj¸Ö\Âi¦ªþò{©Ž<!ôÚ•à7×ÿŽ•D ˜Suµé†¼—ÕˆÝæT! Œt1&©'ÅÃ4Vâ“ ÑPÎu º¼»QýtÒ>Œ^qb´‘cºÍ¶ º(š=€LóL9PÚUscx‰zÕÒ.ì\d Ê žO}÷nŒ1¿þýáÐ]óq¢Å9]XàÑœ7õŒ}oJKnW($ã7Ñ»‰#цšÉBˆõ˜ °=9§é¸àhÑçßÍ43òˆy´ØœiéF‰4Q(±M|wõŽ M žàþÑi"è—rx)È@Ò„œ­Èô2gƒ*Ä(4˜7ȹ¯4Ô°-AÊùwh¶³b¥­úx}EÐÞ¢¾|ßñõ3¹\7vC0w3r?úÏrú?ÃD¾\ Vðz•nov:»Í4!ŒE#½t"u,œ¨_²ÎÅ1O®á¹Öö[ÊzÏ媢«QFk;ÃÒû%ÜÄ€ ÒeÃÌ?:€Ô¢†ÞZÊ6=ŠBAŸìgeíá>ñKTº3“>º©äM•ìñzü­'K()˜³[›ç´˜] J@=<`›è•5b¡ñÀëI\Ñg5i_Œb£°ÕÀM,\Ñ,Ù,KuL¬±ØSX9äxV² þú_¾º?hãŽþûR‘ê‘k$W/7XU±­ÍÙÞ|»<@ ÿT)°â11ãÆ[]÷Á2}sdÖìlkùŪj©¡NŽ&Q8›Ö·[H*¬r&ÿ½Ú$OßVdA’%®Ìg4Ì [Ë­\óÕÊvE¦(Wµ,|>XGu½ɤ'zÖIð‚†âºgJ6®g‹,·÷wq ³vµêU\"+ Æëd` ^uaÁŠ°È°Y/­±ÒÆÂw„^*ZëqÔSõ­N¸‚$(F~ûÜû< ØðØžaýJgvßɤÛw°=a¶ÎáÞjKT ‹:¯ûX[Î Zm%”ЭQT·*ýˆERÛ@Ì÷Í–£î2¨˜p¬öÐÍ-Ï‹ú»WÐ.K`½d4\sÍ"º‰Vkli å­õ{‰NG´iÿE§àIÃ-!ì#ro.à µ®×ââÇñ…u¹q½öë®ô³+ÿ¯ê—|™ô ê?^Ñ>ñbàÅ·Îk/3^ñÓómìŽÚc6Xà²(æ)ž[]hÝ'w½˜ó_ÿd? ÓS¾£øVëIùñü¥4ÇÝë-üqÒ§DâÛTò>bªðáøú à[&x)ÔøøŸ»@x_ÎCÞéÁÛ\á^j·Ú qté;O,®¬ÚÇPªªÖÝ­™üòªX/o¶Õ[›>ǰÿ—y~;)ëÆÙˆðÉ9IqäËêÎ ¸0çÝl_i—4޲¡T §¯p"”Æ ŽöÈz•‰òòoâå\~Ÿ_-§`ÄX2? ©ž-öår£ÕéÅ©d""´iÌCôJ—Á°šÅ,Ǫêj–º¨9e*ÕÇ)žxjóaW½4n«‘.t–»6ÆA5*Fò!ãæ £:BâÆ5‰J;Ïmˆóøöç˜ÜU› ¤=ð€Vc\´`?sÕÀß±gŸhÐCr'EÈÓx¨ÏQ4.Ú%j'«¼fD]T@TÇ  Ï€ájT¤xó[Ô6È&¨˜cv‘Ät Aûqô€ùÐ8j7º§5ŽÂ Á»ìg­[-Ú²¬·€ŠÌL—Õ›™S&¡Õ+'Ë*×ÐT·])‹¢ù]W½§ÑO»^Kðq˜zv¶®´’¿o‚«Ã²¸;$G÷Èýa®²±ÞõmWVÛcZ–FÛøšiRlîVsn³Œ×Õ⛽ »¯ …SDm?Ò‰>è>¶‡jyµ†ÕejÐö(_BTÌjï ½¾ ò²|ùQ “Ç$ƒÂñŠÊ&.yX.?kìs[>ð'_E<0˜ãÞØÏ6·íëÓuðP‡ü Š®{dåMê?^üi/`æqæxIAÿXïÿu(õ SÂì’g+úX#FV½.l—$жÕt·¿ø'ð‚Øö–4Á·ÓŠ?v(€Wæ|ÛäýŸ‡T²·} ŸöÊùàJ{km¾õà‡Ûì ßE-p×o+¤ ¨Òˆk¬œþ¤¥¹t׿75†[Sй`]«Ÿ‰+qXÜZŠA¢>/N·ÁÛ'4³=«*`¤›ƒA4!CÒSÁÃJŸ³@‹Ñ·q½okšþhìM•f‚LKÁ9¬UO§¤4¸H!E÷¡r?¥B·ÕYzÕÍuÎÛj¿Š.ÃG ^| v A¯OܾÇ(À‘!kŒ1Æ1nÇ1çáÓ»C óùÙDUEpSõ dÝH9§ ¦@uŒ÷ïßEõ 'Dؤû:é´GsœçÔ²ÈÆ¦#D# ½ñ˜çIXQh£…7Ê„KÖ¢@ã8Ž#) l<áŸÿ%‡š…6M&\<÷¯g(T‡8 ß)»J]  UrCõxÏýDL7L‚„¨2@у ‹3±ëŽŠ¡tÐ\t$üò©¢ ÞSn"rˆAT“ûõå{`Pi/af+UõÓ’ ç ó»åàB} F1‚2Œ“‚ôv»qŒ†‚–Ó–•GÀ1u€6Ål†XEN© †ûRaÔV¦€Cç4“(90üûEã 쟷·¥ÃÏ"§;ÏÇPÈ©ÙM4Š\5d> 8ý`9Ç@ >8IðÚ‚§›ä€ŠNp …ªÞnOf2íôLN[´´ŽGøâg.Š/óÛá—íœt⾃ L¦QA¹ªú÷¿û曉ÿþó'€*äÀœ–'–A=žhýÈ9Ÿ¡É¡°¨{ ¶3‹‚ê!…Ð& ªMRDÜ —@ñ u\òà¯EöXÐ ßéiV©"OôÝÉŠö+ªwÅGÈL£˜€i[†‘Áú¶…—s1Í#\¼´´øÄJj‚á %Ú ×§iP`²ÂÙ8ªÈ‰ñZÈX'îXa\*7Y3vyÄ&/,ÙìEŒç«ÁÔAtE@ÈÀžæMãâ yŒi ™ï³Þ×ñ ð&`˜!ïrNG^$êP1Ñõ 1¯ñ`6xù¸ÓIî2<áèó³åÓf]CfæÛ¢MïuŸf%åÙO¼_—`N#,ð팚½'-Ò|toølÔÈ›¢+Nå}¨à`èa[`ôœÊ^‘W®ˆPÿË]Éxå±7^xá6‰3LÿÏAÚ—Ü9µ‹Á˜‘5oI¡ßO2B¡eW)P Lj¨„YPà ]{™ÖhHJ—HöiÏÚ¡h›—1âSÔdH%9Úáàk½‚tõ?„¸Øó­ékéëÕ_Î<±Ó‹{µtÆ´Sµtc¿Õü¢j'}Ŧ†®§ É’’`9ІãE@XÖÚI˜W{¿ÏóÝ®Nµdƒ7'§Ñ:Â>ÂQeCÐj)w$‰T‡ê>Æ«œ¥sS•J #ÃçMÂÓ[\ÀSk¬k4žõÒBÅhlß“³¾¢¶ÍQ="æ¡VX‚?.‘Šñ¬Tée2¯ˆ¬F< ­™•b«=Ñva«yíõ¿u–‹×q/±¾ÊýØ-Äè©]i®¾ëËOI?RÇúãòÿ–ÙdŸéõî,¹R¨¨(Yö·b9ˆL˜[Òuo•Zpþòús+7§«ÙXÃËÉð6Ï¥+äÝj EzÙÅÕ[‚î0þ¥5zR¢¤Ú°ŽÅžàµ[ùÎÂ;)ª÷y‚›ƒdšßÉî>©ÍÊÝ?z‹MAˆZ³ƒÖøréæV7ïœÑÚíXnøPÔ¡´êc=eµ•—ÅbÔ8û§tÁf×®/¶¹bæ }ãThËñO‘á‡"^FÞKnÑ÷"AZpZ‚HéVK £›¿]¸mÁð<Ÿg6¼ô¬kQP·ÅÔÑÓU«€ÅÃËȯǶʢÞâ`¯ÞÅßcàÇ£zØ=ŸŸiÄ8TÍÔõY=Tá L!äIy:ÆñÙgœç©ª&¢´I~T  ƒ0Ÿß¿'o·#*ÿH¨ Q Ó¬ä8Ž¡zΩQ$+fM¹ñòÞøç_þ·ˆÊI¸’^¦{„©Ñ“çž&¿î‡wcúµ¶i–ãÓÅ7û©ðÜj÷Tá Å6|*GÁ<7Ó ¦‹æqz {ži;„ TLÄâU‹ŒqˆÉ) ð}f>¦Ñ«ZûlÒ0=⯠š*&ò,1£ÐmzŠ`U°¹lèêPóþoÜ þñ —¼ó¶FÇL1ÜÅ;½ño›b6 ñÃUdÂæé†O€jª"¬”lLÒûY5â#3β9Ä œšÈ ,fç9Ç ÈI ¡Á÷’¸½ï¿á0³wïìv<ýç7ß”NŠáÈeo¿€kv~#žÊãcø× ÈTèôËC¦£®´É\‘ÄΓ?ÿùÏ~÷ÕWÓdÎ3¹æîƒ”óùdÐDÏiOÆñÿ|ù~>›™ý¯ÿòÙÃ71åM1¯äh¯œ®Ú@°™§3­¬Ñ׉ §Ù—kfî@`'£–Gš•‹S¼¨þÐp=XU„Új%90¾Œì»;²hX•Må"ÔÃëꤩUÄBPÄÄüKÍr’¾\Aæ)ò´’c —m¢ˆX‘kW:tøìZµ¾¥¶Z°—@Ëvø¨ˆ¡ãvÜÕ‘)ùš€ñës>õSÔ/“Âi¼?,7.—L Ç2yà8Á1D(s£@Õ1TN[½›ë«Ðl6v$‰U¨ÄÅäá·!CµRqâë™yž=g®V®MG$õžJž=é‘E¨Wò¤ç=ÇAèÐP4‰Bê»{Ι7l¿œŒž‰U‚œªr±×F"°i™Ï×Ì'ÔÁÜåÎN+š­ã'ĵV­ uj™˜Ñü«~ʱ•o§` 0˦ìŠ=¤Û|›yLÒz©0k£>‘ÎÓÙŠukùÑìŒ(p¦&:#œ‹ùFKý⊊jÞlªK^b±ƒ$Ë a²ãä21»+íX2E~¹È2òd`æ-@õÖîÆ¿@U Çl¯H¢S=Ò ³8Sþ±Kc6¹! üõÎob\£€ ´’÷ŠøçQ IïÁÌ… Òˆ¾UXè2õiöm:††\cRk"ø“´}‘[L¦ åL/¾N³¾¤r†GÉ´ÿ"ª­“öâ]”Í t•´ð¡xœÓD@³%¯ÄJ‘j—PŒSäŸÓŒüuMîøŠÕºu'ŠlT|¶”ÏnÔчè®_Z¶CnÎj>´‹±Çˆ¯¬–KzymÓMÖØ©(Þ¥µkV6K¤6IØ®­½ì&ñe“÷¿'UmTó‚H´Iu‹”ØHÅrÅï,Zoûzàö+¢þºÃGz‹€[škí‰ob(z©¿é«† Ê©F—zz~è¶2§· w×÷ØûWéÝ^kZ5äõ9â“_ØÌ=±ñk›ˆYÂÞb“0íÁ—“D÷ÍÛΕ,Ä,Eð‡ºJî[¸ÀJ¤‚ýw·MÙàö5þn­ðm²ZÈ´0ï5‘±ß€ìÞ» veE?€­ã%wë|ÔT¯sb‡Õtšñ¨µ ŠÈÍ©WÏšDKНøR&9ÐË«Ã21çr[_FpQßúq¡bÖ—²ûÔ;’¸s¨›¦‚•໚ç!l]Í>M‰DE@‹DÕšÄ[]Ix=(œ3"§¶ ö¹KŽÜËF^<Éû;¯2ÄÙWó2µ·ÊÛåØíŠz›úOWx¸Wï×®WåÓ·ÊÅ{µó£—Î*mÙ6Vž*·º›^¶|ºÞ¯MÉ/@xÃ\dŸ¼K5ËziÖðøç}è#~1€×š 䃜zðrB…ßîw~d\à;H<^Oî+w?1Ó°åPn¬]Aþs—…u=/Óça"ƒký¶rGqê Düøfî Š1¶íyšá…bʦ2a`ªcâµ½íÙ¹90 ¥­ƒ‚-P§:'%^½Åóè‘ d°@Lp¬[ÓK4¡EpƒtUªæË\uù(&K\.‡cÌœeTVzL fgpÿDããpâ÷ïýt8žÐÓˆsN›.=˜8ÄÎ<ÙX˜GËrOêqŒ}öNU¿þæC!œaT‡G÷Ì ˜~Ó„\ç‘ןt¹\Dôùô³ßi§@Æ_þO*SN™ ôõ‹ I°Fø9#Ÿb€à(heús(ÄP[,JG9½ÏeÏÓ(ϰ9E#Þh0 ’Ô韌ŠÑâóªêÂâÿõë¯UõüÅá4/ðý*?ðÉ ¢<9ÏQ&N„{"»'5Ep·ƒZQôMrŠ”Z€… Œ,ÆR Þ”ìbÁº‹+ýákg¤ZUCþg·üªb p”M˜YáÝó¯'Ö€†_(Ãñ\Ûb‹1pž) dFNÌRÏ-ÎMcÂLdt‹f;šêðM‘™Âpƒê;çu¨#‚ÙCòâ¼db¿þ"Ÿ®Ò+«išUÐË€•}œþ´ž³Ò•p7ø@ÖaÅï-»SsŒÅ†GU½)ÑJ’ðŠA»IÁùL³mÔ¤˜•ºÂ\Ç`ê¥)0_zI Ò{@Ý4™ïº”ºRÿ!BU=Ý=ßàç+hŒ¶+1+Šá[@ñ×Uã'«Ò½-"n¡l{Pÿ-ÎË^B#LÃ6¢cºÈÑŽ ŠÖ⸫N ­ú\ø¥jNM1=v%5¬€\É›x…Ä Š¨%2Yn“8«á[ÒŸ‘»±’S3ŠøgéÙc½îh[Ì‚”(;ßô¡- »FñÝûP!(â@ÛWàÆ‰xàjÒéN±lûMä¿ .-WÒ)‘gqFªš5ší¼ÔðŠh(§Uô —/ƒ*#ÃCÌ›KD,Ù:jÓ#(4Ú|“nž”¬K3ªL,—>”·úEÞé<ÈqÀlãh®»Æ@ Sú>IÊçfMC 2ÁrÕÔ`±Íƒê IDATE×a]€ùêß/U/(!¯œ1¶Ï; þÝ!7Ûb˜5» 8ü¸ÕhîøÞ¸Þwà +nÒ­t¥¹ôÇÖ¹Yët8fUóžÈB~w6×Ui–žçéT©«ýº„”åªÔEœÎi9º»[hš`×(/w2Di¬è‡á:u¥Q8ÆÆåÝ_ÑšIf³|¯ì¨W{ø%¡žyõ©u…sC8Õ3sYvxUkQɯÚR>Kdwn¡)x©R£#·¼ ë,ÚŠtãûY’¥CëŠã-£=ÒÒ×E ꊧlTü¤`®&¢üò°M|Ú¹§÷Üë9€\è<²z®ewîß^»¿éέÜf‚],ý»¯¿†>ˆfyÙÔŒæ°DF.êITÛÖì{c憳 €M™‰ v­ß/p sdÏ ‡Vz# –|#¸xâïQ'õ²CÒаyñ.=ë4+qØLóØ a „ÅWjN<ßóDV—©Ôú…‚õ²ß–z€ýª;ý:ñ}ñO=¬óE…°U_ý5~HWþúßÇ/IÇo–w^–6_Rÿù–ŸùêÂ{Õªžë˜´õÿnâÎÝé >Ú#^£~ßÂúúFú›Åb¾âç}Ëßù¨_ñGÆþ¼åýpà[iñ|á×â;ûB?> ð©êÿf°Ù:`y|…1u‹­h1ÚµÍË,£iجjåÞ¹T±0mññŒˆºcÕCAô³éˆ[V+ŒëZu ‡[³ý7 ÉjDL‘¶OÔ›¢9@«ê-Œ˯±€¢Á¨z·è0(-J W¢¡u®ŸŠd/_ í^È{©»ôâI ´06¿Xß¹Û^q”ÿEeÛñß×½6ÙúþK€ÝÜ Q3SÑ ³i"œ“‡Ž©29!2Ž¡TÎsqMÌ r @³çó”ó¬!¼FilJ@1nGÏõ'¾ å"i_üµwð" ‡dÜÅOÃ&ž=p2¿¦i6D ÅH0ŒÓ˜´nº¼(Zü•¶À£êt ¹étˆM~3¿)w5,*\˜¤ñPb¨…«ÁcðT×Ï÷Ó”ªÙ¬`8Qüß_ž*ø?1ÜÒ¯Á4§¶H%› >çÈ}5|  ÞÌN‹ó‹wÑJ*]„9ÐÅ ½ÅÂÆ\)ó£¨;¡½Âß«ŠT³±?3¼XV'$g=ÖRîtüÿÔ½ÛÏm[vÝÕZóÛçTÊÄv\eÇe;ƒb§'Àáò‚Ä â  ñ'"Äå‰!DD`‰/¨p%q ‚‰l—Ï^sôÆCï}\æZßeßN™ŠŸ³Ïþ¾µÖ\ó2Fë­ýåR—SîÓÒ¦”¬QpˆµØ†`‚T[Šš<ŒÖFí.†ýÜ%Š6Úh=&5°ŽòŽI×ð®2xfåðˆ6¬ÃÙCÛQ¼!;nÝÒé2‹‡•ÐÇSTòfè“P°Ä8RŒôƒß\0œ]kÒ#ôPSïKse<ãºü(”ÁœIµ*³:p\ÝWùäö”JÌàý²$ >ON¿y™j缤…jh£…ÙÅ F 1òù¾óFHÊ:ÎÞ — ‡\9Ò›¢äbÜ]±!ÑqàÌüËÔ:Ê{àË~šÕ:[ÒŽÁ-Ï슗k?‹¹¸º×ÁéªqѲhI¹ßS6—8îmùX ±Ø ÙEƒóe\Ûwל—”K¾$~%Ñ)@{:=-µ´ ët”Ôj"ëœì‘EÌÕj°|àï‘.²å²·^l¤Ü*¶°…FEò|QLñÌêÅÅQGÈ$,ÌçöÔ•®ÿ<ð€ äJÖ*ƒêÄ.—ü°Oí.Åø=,Fö’ÐÀ£² 0f­™‹=úÙ¡}iX¾ôˆZ ,F䃖"M¢äNcï‘h Q^˸Iö!/)ÝÞe£§a#ñ›ä膑ÃñÄæ4JØ—ANòÿúzÕôˆ¢ŽE\…Á«¼5­êÎb|§µÜ7Öû Bá*ýß•,oãA8\zÔK¸èÍ zíèäÝ3¹p㲡ô¶iþÖº#Z[‰ó^qb!¢;×âpP­/37«‰e¢Hîlœ\°; ~ãÂCâå[ç€e^žc°TDÚ¥¶„³ŽU!¾ŠfLCQ¦1®gÓ À…°;\ö˜M¤ï85¼Ø¶Ö Ü7íÅ´ð—ÓLz줯[<œ¹N, ž¶%ÐLš{ð9 ålŽàLU3oAnëo.#€õ~Ê‹L¼œ¹×mW“ýÖJ{Øùã¯jÿÛ³þ¹s¦1‘ÕÕk|FhVIk}ò|”¿u S¬¿i©„Ð*×cÖˆ´UE`U3cD˜5–É}Ž‹<ÖÐÙOäÙnµ<^iÕ;¸—ˆbñ0p >ãwæŠ zŽ6Õ#òcù2Ê!–ýGŒúˆó.wèûi˜¶‰ÍÞ»U©/ßÇ,ˆ_‘}Ô:£1¢Ýg0½GÓe{wd4sX«2ýa§Ðê.¹ÜUð™±?çĵkWoU´z˜y`ÞžP{3yi|ÇV$}¯.óíã‰Wœ¾ 8¬g2 [é‹•öòÏÄŒàg2 é£>ŸÉà΂ÿìs#mè*~®£5cÕ¼ü˦Zjuµl”§¬h>òÌõ³ív>_ÓÆ?\•å|²eŸ¹¸*]h𳇭Ç€š4'½öÀdÿŸ®äò19f Ðt¹æ–kÝÎzA Åy„³È­¹7˜ŠŠwZ«j€Òƒ¦sß™}Ž‹ÁfóTðØ¼‡ãpË?¤¨ë©ªeòì£Vw ,~;òSWì§=Ñ~ŠhÖÜf´fêŽÖÜS'Šˆ%Ðû÷߸«÷~žg"[H›V7š7[üÍŸûÞ,ò ¼·Ã@´¹l­,Ÿ]f0ÐÝx°=µ, èa¼ ËÌÜÈã<¥$½Är;:ëJ ‹VáhE¥Zï·ðn¤˜­eí‚êÜôÆ®ËZØ¸Ô ¯8.*D <ñ¶!ú†+ƒ@‹l°,8ûçéJELp˜‡$ÓhÍ#ÛPyÊuöÞ%÷n90câYzÏÝGø}£¹Êž¬_1Ò=:áN—Ìè^$¡l+M{Èc>­`tohnE—0šä8!À"-vJF¶¹ã>ü,€À.çÙiúêxä®î²¨o–Žf@óÞÍ:pˆ!û¦õÉŒDsõ£™{WÊi!¨ì=Ç(YW,¯àUÐÇé§Ww‡5kn#ú ÿìÿðÏÿÂ/k­ÝTJ³‚úå_ú ð“ŸÄ¾®…¬ ?;~zãég+ÆyŽ@ï°ðOÉûW¾¢äÉÀãr£Ÿ‰]yx¢^¦`óMpKÕ0§%0Ó1ÁÃË_ÍÖÑüg·ˆÐŒ i0ÊÏhcVŠûlä¬9…WÁ±UGrE+dþÔ쟰d׬\}ˆžO«j hB„ûÀ0)\Û–ÂE˜I5R 9]Ì(Dpµàbê7ºs‰`äÓ­µ.ÁQjNYôØ–èÓOš•R¬¸ 5ÖÜ@?ÆÏªéøÊ²ó„ºº§a™»Ù¶;ƒ"[δèâß*̹*™À˯Ì%tÍ!P¼ƒËÒûà¹"Ê@ãjejÑ\@Í¥áÐÒö%è`œZ¶SY£YÞòÞ:¼çf•òñ™Ö ê «]n²\fò ÷Ä&Ôl” Fâr¦ $,R” &¡)¾IöxΕüwJºÊëæ‹x²ÔÍî¶â2RÄøeî0Lqø»«–@ É9#àpÈOcr~>&«Çòª/nj½i?Î8€&,ŒÏ\®š .–È—v=“5 ,ó™øYuà2ÇmÍLªµDùx“ú5D[î›ì‹s[ ž 3ÒI°æ:19é"Õ¥âê(­Ô>¼ÕAš³ƒã–¥>AÅajq¯aÑhÑÊ›Ú@zXä[$Àû©bØy–zÏ:‘zËá+žÖqR«Ú$†ì̶¼[Ä}ªƒ6†LØŸ⇔£“zÖÿðú£mío¤6}ðY#” †‡sfsyjAX̺ÚüÕ¢gÜïçôØ¥(,âδù‹«¦G»¯MÔ–¶¿¨‰|0Dx åÄÔ¦=ŒQOY•\Ë€a<}–É@=6¹–ðNdÌØjE+pcuI³]•¹‚Í;Ýú‰2ÿ1Jvë™e[ñâÒŸ²+mQ3­·‚•/«µœQcª9{‡Çž·V1!|®é‡IÙߨB8Òåk+âÝçKy¯åº±×ý¼áöcƒä:le>±èsÐ"”„ºŽª›9ŸÝ™ê}Ú¨Éé¯÷Éþµ `„²fs ÿx¡æsSè¯pÞýµü®çû:yÕÿ¹NÇBmT‘ìcªÕ!¹Ö@ Š óxÏ=ìp¼÷IßûKyi‹2y#DU*iN«mœëŒxZpôÐ#l:ƒH*)`–  TV3ºk¡êÚm Å[®qW¾lÅñ*D.¨ŸÊ²‰ÆKÙî½X«í.®´oÕ¢}¹†40uyžŒ”úpä—o8Z;¾AcƒÍE¥šþ›ÒòO›ÁAyAn‚Òè0ÿXõŸw£D\B÷§åGÚ‰_ý;zã/â+Ÿë5;>O—ÕÀÒvEî17ûëñÓdV}¢ÿ•iˇ#>õ«åƒ¬„>%úðÙrx¡~ð^wBÿËs•—e}=ÿâ_âTú[æ÷§å¶eÒZ4߯Õv1Ÿ(ã~º$á÷Ç•bGÀFí˜J >§ÛmLÛã£ÔÔ¡øÍƒÏ³¾á¦]‰ùˆ-ÈÉDíïßg€4L½a»7ô*0dÃôcKˆ\Ûªž¯ãpû©—!ßÖâ´$Õ…A5Á2Ûòp#+¨H[™˜öšZ f£A¨ ¶#û÷Ô^=ðàL×3Ýô3@ง/~¹€X©I-\ê±Ñµ‡X‰D{‡W=@üÉõî›?û ðh‡Y;ÚAòé—~3d÷pÑi=îï–ÞŠÃPkâð%«¦øžÑ’Jüü)1V:cø0BéÌZ­ä›§y&ÖoAzˆªX¦à6kÇqöÞ{3²4Âöu)ólPTý7Z“=5¿¹zú£‡s¤PœäL¯¢ $º«z ­ÑÀÓ!—ìT±…K½[(ô1Ѭ9ˆ–—Uu&:»zžß/”Èg{&$zÀ(3gÛ“Ã7êq«Éq Ÿ™°ƒÑÖ /¡;úeã”nȦn~ÄØ„½¡‰N ‡XÝH†¥Ö<o†îa¼wq¾;‚Æ[â„ï´E2&ÍcÀWwq.®vN )idNý:­8Ú+WÆú4WÖ‡WFõaqA «+(c'yfaDó‡®Tå°IÖs.T¶†¸'‡äKÍÅê\ê ÒãöÀ ÄëX5\*§ÂuT듯[I¾ójøp¯9z‰_Õ³õ7¾3c‹`ïŒ[uÀµ!öâÉí‡4Nc‹6MŸäNåÚ9 Î )f}ð0ËfFǬV“õ{~ñ;æðìyÔ/xÚcÄcd¤“Ei \ô^%â„Ôcè ‚‡ñÖ«Ð:™†f d•ýÀ;õÙ“ÔÚQOfÓÔ2™R"eTÄ«¾  9`Å43?!õ@õÅiœ-è ¢Ñÿ“WW ‰²Ô$BY]¥Þìğܰ¸cû½P½É]z®ï(ÃEWâ³ôʱ¶¾sý©ZíÇ-Üm÷Ú߇$ç©Ç­?´lØðÈÙÉ…ÊúàL7ù‹²Àîu›Ç¹žÝ§!âN(Zð\>I»—C±Aq"‚©m±*'ÂZhœº]­*ˆÊ.Ly’cdz(Xäbäô]í½ëÞ$7T“²±á)°Ç)õU%âÕA©©öaVãâö]‰Zß9'—i€ÿ'wj\&^wc ½¸ËßžHWÙyɫɆy myŸ%ó=²¢j¤­:„Å’âRš°k‘÷’hÞåAšô‰û3›Ï] |Aší —·¶ä×Ç]Ęå> |sˆ?/Ç=/ÕpW‰XÆÁ¾Ì?³Äó¡W /¾›½¸âc?h‚ª®q†G©mú­1 ªêèx4<Ùγº…]š4 õ¢Ý¦]…ÿ›Ùžx”ˆ\Ç®›Ì¢íù?aÍ0gVÃ#Œƒ¾ÎPµ¨,óî­G`½ëßÐ4ßΊÙKºßÒnÛ­ôDðþjм7#hý^>V¾ë5ßîÇŸnüßáxûUõFAònÒ6š'‡éÕKh‡ÏI¥÷á}P,â9v>_ºÚưÞ,O¬¥> ÿ¡êÿsÓ^§7ßzÀ«2<ŸM^ð ¤×B÷r?±½4aè v=‰~Ðw¬ÏC.&ÿ5©d³¹e«)ˆ‰ÅŸcoO@-„Ð_1vÂ_ Í´¬Ž¬ÜPžHRB<ÓÙ¢%zטýMr².Ž']âD¬ÀQx£A¶Nã_ÆXQÕm¼ƒGÞÓÍ oí¯ Ó¨©šÏf¡ò¼i>„@K®<ÛåDJq«5Ù\ÚÎ /mö´9˜6;>zN¼<¦²}®ðÅ;,¿¬ø¤îR¿ý©Ùñï¸üö^ÍZ6Êʽ$³ÖZ)RN3þâoŸ§/€PÝh’“œ­¹ÆNHœE£Tß•àÎJCÊƒÍ tuÐÕº­¿“7ƒ!Úù†=$Í =G¹eƒëPò)èìAã5•ä4TÇ×îfÞÓR «(Kí¤Æ».p/ö›õ÷ïÓœYÈò¨LY-RøiŠb]DtÈZ^½‡ýôzà7˜e_ãµ}Ò"Cw椻ÓМe‚ÒÚiU°.Vi·Ë(¨‹¸ÝNÀ¬Å.0T"wùI}ݲfãæÂõª½[Ú\ÏCè&¸ÑÌ Éã_º¤&„^"I \lJ*ÍZ¡?ì)4éÚ€zXG ÍùÙ{?ýà1.Ô ¯!*«Í\ôÎã šS™è¡³ DëÞÝ\½w‡Ž¯eæ›à¬µÒ¼ÈÅ;ÍsÞ¿ü¿/à'ð“Ÿzû“›ÝNWãtÆtwâ8z‚¦‰î]Nýýô§þʯ~meÿµ¿¬_Á¬12†=ÁõTp-¦#“[ /˜QåVy÷lvÐÛ]/–þ¥Ú%©²AAIsïÙI#äÑÐ V^ò!S ¿ÿdh”ÓO‹]llp™ìp¯þZzAtJ—m(e¾y+B_5¤˜½w.õ¹eËÁ#ébÍq&qÛ 7Ë6”Êfd_mI´"{abâóöÞQd⥠¡”3èÝ’µ{œ‡:ž=¡KæZÀEs±iáù¬"^¡ “àÓDkCŽÙÖGRF¦³ƒä&Þm˜ðÍu¸nÑóvùK?ÿ¶ÙŒ\ï-#.ùÖ’ ˆÛu 1t¶2ÙÒË B‚í ¤Ómt²(›YÄΔ½uR„SÃnC•”øåg#†ÉÞàŽYk„ÇtÀ ÷`ùÑk0º$ïE¯êF‹—÷гÛ=ÙVc¶˜5ÚŸú˜ Eí8©±õµ«yóIå¯K˜=XÅòAž@s †]X;>mî.fûûÿ²Ò&Æ6aԗ𠯊vã·¶ŠÍNÅÛóÝ·äb˜‘5j”L³ cÁ¶n¶kéfåÚɉ¥Y64³º‘åæ.\֘¤o÷½Q8>ZtµRJüÏu‡2€g3’W½º[%ì¿e ئڋ®Ü3%ïnKM&2¾@l\øuÍR¼~=3À¾*ÊÓ?=asìýbåäð`g”÷^ÓŸï*^Õ¦ *#^*ÉyTŽ’¡Wês4äî„ub±÷Þwoòy.-Áç1þ¯ëtss‚cÂYn…å}±„ó€qRróòÍ+˜ý|I²›ÇVÛŠx°Ú6E)¾š9Êx2CjÕœ5Úèךú*m5ÕAMµð‚yW`ì…ç£HéIäZž•A㛚ËI°SµüâB)YT®ü,T^3F¼P_ªî)\’—œÆ}÷é,8¾Îbßæ×_R–Ä\'bd£øÉ¾LþáÃÓ2g€üÂÒþWõæzø>ç´Š=Ö¯$æÚO|¤Œ?×õ¬Ï|˜õ) Ž·ûôùh 𳟼p‚\ß1/åÆ|4³yõ<Òó6íßÇþԺΛ?ð í1™"ÊsûOZ×,Èg°bŸË0š¸Í²›;Éñ8›¿1´T Ñè»O!–µŽºW»}u!Ñ‹ÐJ¨1ô]M8*Øn¸À“XÛ.ÐÉ-h6ÊX!éØý—õ>!*uØž.¹,ªn„ì›ÚQƒX·‹Í¤B]¾Äjæ¥Ta/xñW. _6LÏ^¤†GÅÏ4f|u >VáE轇Dnf4K4øßøË`›–QV½CnC¦L=öbÎÒ_s¿r ]ýÃå—$†0@šl|‚veai0Œ‰.ÖÍSc¹ñ]N¹ÜMhÀ“=ÙÑÔC@·xwýìd¶&ÄÓ»Y) R§ÙF õ[.OÁ¼UåXèㄌL*„&Š¢Õ•3“XÂ?·@¡Øàñæ"³#­ÃÞ«1”@Ž+ôÖpvã@G Oiæº=Ìpq6mŽØcEníQòù…!8|§®.‡KÞÕ{·fѵjNÿ&Dæ<‹êªL~ƒ-÷ã>¡0„ôp_*ÀDyG3Ëh’<2V¦Ýx÷ôt´hØï½{4ãì݌o„Þ;uÂÑ[‡x„óµãì=—öÖ"Í{†×Òï§/: Ç)ð€QެѢãèèB3}MoÃÓýtAþÏþð'?ÿ ß+"8‹ƒhšžGßø/ÿÊ÷%üèüS¶ÓHÒé]`ï1V¨" “{4]D  µöWík&Bã…Öº¯ž;M¤ ”ÓAys¤šÎR©R’0P.—A=YOWÈ`Iyh­¹ËÈv4U³%IEùƒ«é¨/Õ›µÍ]ðÞ;Õn/K@¿à.¶5ÀÎõI@~*‘ËžÜn#¡B»z-óEi:ÉGÅîn#û#¹½Ïs'‹Ó†[õ0y xº¼VqIäWRTâä°=ÝàÙuhQú-·E´»² ½ŸÁPp—üvë½ÇÁFõp( † ^Ñé‘‚ˆ@kÙ â ôHø—¼M®ÔMcNÄYµš$y(Û]‚÷§ãhÓBårtw'ÀÚ8ŒxjvF™„$÷Èm$R¤¶w1Úq?H?…3˜æ´ƒ€á`‚A$š¹;tsµvñ§½ÍŽF5¿½7gWyO/Åx S–‡NVC_ÖøÿÎÿÂý{ÿ”MÔq˜ÁNuÿæì¡Óf‡YÈ.qØÁÿ×x{÷d~ûW.Ëú.x’­pJ-¨DXµ.îqò’7ß¼³EØQ¸Š1GÍuʆ‚Q©82Åèu j’(2¡µL‘ˆª•¥6UÜ|û*®çC$‹»«T°¦ZY_+Ã;f0£’óÐ\ö¦ÌJ¥…Ž­«+aÇ%/d&é—¿÷‹ <0qÑÓ"E°{aº@õì÷˜ýV–÷ ƒ pwwk-T2ÝÒ¼K¶–\/Ñ]cLc´Fw9<+ƒd. ¿¼ðM”%J'£*Ѭâr3“bt70k.{Bk‡{Ïe£’¡g{XgÊ=ìýÁ;c ´5&b‹Hq‹Urµ(VÒ*„ÄQ7(j´á>³%ºÐǪs|çÚOxì<éGŽEú¾W4¸–qîVž;¹*“ ›ÉVbõÅÞ}qe?dozÚw¡=ë 9f[¤çËfi ¶äƒõ:¹P5ëU•›3«Ú¤Lihʾcó4öC6Çñ_†*S®€p]Á.óMþE)þ9ÌJÒQ³½å<8êv6¿qÁ·÷Ïœ£ÖñáP¶·_òXSZ»^õ@vÙ»¥Ys mÃje¥¯ r'1G„e<º•ÊU¿”î|¾ÅA}q&2TX§r­¼»)cke§~ô¡„Çh±nãÔ‰4k~¡Ü¾òÝÐíÐúEÓwù/^”z<ž€<+ò>³6õÎ Û™¼ÚFkæÆJæ½ä æ+&Û¬ã™—ÕØúÇ´h+-™•JJô¢&ÞÁ…¼3JЇ˜°Ü1XË[a¯š6èPãæ•(Bdsßks¥Ù¾äÒ=—!¿o–¹ábNÑBå_?Ñ6ôgz"8FZzp·¾Ô`¯ß Ò>ûÐÄùðc=é¡|Ÿ ~°»¤«žñþ_}ïŸU½y\…¾å7ïlØ|\xñü·òÊ[~þ?k)qÑùø–±¾á¯uá‘b÷âÙÄ/¥—6Ÿ|ÔWõÔg“|ytóù¥p¾y€Kàô¹1×Î}TÈäí‘‚Ï5lãG€x7¸;zšdÜ1˜<œ%E=˜¹±"ª§€q»3wðØ À^rÿþ²Û~Ö³ ÓNšs“‘ɃØåšqjI6RˆÓ^Ƈ£¾hÍ"$¤ºƒmZ^‚S´ kÞ®^Ä••tn£ó‘ÖÒluE1Ö/aøú#g¼ ñÜåø˜„XÉ[›SGl«Çž& Ò0Þvó…{õçÐw¿Ž[J|×Ür{€–Ív!³w1éÔ¶¬1b^ãé?3Ê8ˆPò=QðJàZ‹iÂÑ<}€èÃíϸÃ2sÐOoÏž×(ÌIC¸þr»×š%ò…Ö@š¨~Î…ÕÈÊv wu¸Z¨® Ø ½g;,éT—¹em'ÉåNººÌ˜˜ÈªÎ,š¯e3 4Ú´©wô˜n \\â g\ß§L•ÐnÙ•Š.[ðƒ­™%¨ëˆeš…]&Ñ­J ×aÄ‘¾Öfu4ïhÍå@ïR ”Ä ·óFF.¹Ó Æâ|—™ÂOàaC!š‡ßzíz"yÃaÉþ|—\Í¢ªî~Ê¡…iHÜOÅÍüûpÜ7À;dft?-h·Ir÷Ì>ÉE¨)lôN·1”)8»zçéÙáz4èÞíŒùGº ãTú¿ÿŸò½_ü¾Às@ݧi7CYÌǬÉ2Ú¿÷/OÐó¿ýQ§¼³÷HZyŒÝÙÛ©Öºº;t°®³ÐßûñÀ_ÿµ¯phòDFEUÃü‡°«Æ„X2¢ è’;a-Α8EšI;–kÌ@³ìvëVi¡(P¢¡F™jÈ›½Ì:yÝ R‹“µæbm²|Ô1ÓeÕ]ª‰uÓ¼¸sÃ8ÆUœÝšƒ{³ d,üù,òî£$6§áºmt)]üj!Âui^k[Öæ-Z~ŠL- ƳãÉ{g¯,MÈ“ÈÌà$Ü€§¸¤ ™ÉO0šÃu‘¿.»zF¸Ø-ˆ6äyÊZjRgª³ªø}Ø­5¼E‰Ø=hêÀa‰†ÀiL2:|,Z}Š/ŽœÈ” ’Z¨Ù)}W)²è©äùa¤3{åToöe¹H%.P®–sP/¾…;ƒE¥ŽJ¥…’É¢ˆcäÃÃ6¼ÿÓÌ›ÖL‹ç–; êî‚5L®K‚.TÌcd7Ï»‡AoÕq+h‘ÙG拨¸öm”*T\âz €_ûÕ_áUŒ *“;‡D÷,XÒZSL‚Æz7VÈ!é±PˆÇ¨Y¬bìÔ½f4É x÷&ÌN—òtúÙopºw’î=1–ÁXÝ»«Ü—^ô()ŒÀ‚Q`[DÿåÖåË…7a`—äèiÅm`/ Ó„E„qj%5ñêy)L[t1‹àp5° .Øé˜ ê¢.²LBóÚØ„ñ­{WâҿɇôŒ} ¾­z¹ŠÒتL¦¯~w¾Îvä|±µå ÙŒ¼«3¼"¸™ç‡Q¸œC.œ“}à·ãÖñ2¯Ò¥m&¶Å†*ŒŠÐ!•®Ì.-^¸øÜU²EWå |­ )1T{¶¢Ǹà'~/iÍXù|.lÎXUM„2£DlVòªXGVIûóe}/§Âz¼Ç36ó¹>ŠÉÐ_€«3y;Ë‚ÏÁ´Õ ¿žØ\]à©—Uh³²Í6Ö¯_£´Ò¤É/aÅǧ!V«µl½:§ˆÁb­Ù:³ˆõ|e‚·IÇö Q—~RÞØë>ó‚ò~[ù.ÂM"m“E,íÖãžK)ÓRëz÷.ïÄm­ç„˜)‘ïÉßèéš“§ÕÕ¯éÖÌÅÅøãy³S‹”Áö™%™Üå\öæœ6(ÃCרÃ]Ñ“_„õi¦x.™(®Å‘Ü×Ö…a­+Ðv] Rô<ïá—óË„–×”Æç‚o컽ó˜sQ\Ìzƒúÿ¸õ—Ïxÿ?ŸúÿÚ‡~“[ÒçÛc^ox­Ëoý<Š2_(ûÙó1Sˆ«ýIo\9y°ß•&Zž%ho8ûu7WœöKacÑx{d¢œøXzªÜ³ïL”]ñ'É…Ý9xžñÑ9ÌXJk³c´çVRnÑs³2rä2´'䲯5T5R«]!ùþXõ¢íÓF­lnÿïvP*%ue´æ&ë£jLPî¸sÌbÌšG°rM½ìO›G÷Ýý‡úâ…ÀÇùsßoÔèmî#SAÁÄ¥7™5*‹k'Òb®Œ*{ wd7{èÍhžòD+éƒr°É­‰’)õ9+Ï ’uuB衸Àzí6Ü'áA¡v„ÆhhÉ ˆ ¹gýnêIla…•@ÜÙ½6_ÍšÕšJVŠT2ä~˜!A&h ÓRÙ–Î?©iô4QIi2y‚¥kƒªm’~Ív€ÁãGØ·cUÖ¡[踤ÁD Þcë×Bk2óI$u…í6í .¡‹FwPïìödfJŸŠgsïùÍé0ºÝú0ø£Ú7JVt‹T$aORÐ?‚èµUÝbj–²‰V½Óø)A°Œ™âìgðDÌZè21¶óÞÙh µÌуeon²,?ÝyöΔíBW·‰é? ‚•{V‚@êðh¹ £1œˆîß÷g'{½eT÷žÒ‘Þáî#DŽIžŸê¡®‡ëßýíNÐõ¿ü¡GnBnÖh’§Žç)é°Öáßøiî-‰øôMkük¿þ¢8-Ü,jtƒcôY…fŒ¦gº$³f ÁŽöääÙÇ¥BÈÑZ•êÕy6Ä&L~ô ~ä#¨¢ÉÈ-×d=ñJ³/׿•­.ö†Þ†…_ÚŸܢ­Ó=Ã(†œv«¦’P†¨úΞƒfqòg6Ÿæî±iwà° ¬ý w@ÇÊä¡  †ä¨, þÆayÏ9ôtD Ç2Ñ4C²*ª¯‘k¡ÑnÞCXˆ)ÌàÕµ;F ìÔ6ËQò‰m'€pÔ ÂÍQݶ•m`tI€½Ì—“4ú‚äD ¥!…t²Y *vÞ¾•ºã¦N“©UÅ‚M>Eêã@È:ï”fæúŒ¾ð,â¬â„;…ÌçŸ7Cé£Ë)¦¨ÅŒiGe @ )6å=%…i Vß´luEB€-œËv}jvãþ·D¼¯o+ÏÉä3†ê—…c Ibeð›é7¡=«´ÇäcÞh׉Ýþ·mùºG—z&·Ô»+NZ•­“´¨µ·ªÓ±Ì\øëÅ€ÙÕ{/Ô—¢(¡5Skè½IPD"†ÄÔÝÂ^3œÖšQÝôÏï¬äqW/ê¼U¥1H[^Üu´FS»—"—£Ä3®ä®¤NNâ75Ñ߃kì›ùMKâbXù<´¡àé©§ìs§| h»J?íF>]Ðé»*¨vI|Uȸùµ¢îÚ%6[ûÜ3k æÇ8Ð.#Õ“fQL¦óŸ×–ݵßR+¿aHvW½g8¥¸A%¶¿ìʶ á5CœUó³S7—[qNk`J†W–+jüºQÖ Ü]r˶+›i&^èr¸G?Û4,ƒh)`6}å h\ÚYm=¼…¡];E'FžÔN±Š¶â ý^ϹxCïù.Wßøôú¯UÒ=†ƒËfóÚîpÑíÊmS1Ã1DîÕ³—~”u×Y;J*Q˜ñåÙSV>U@‰ÂS®9Rþ¦YˆVÏøñ”%ïF\Ü.>(ç}ã¿ éYö:à‡¼³Vÿñ¸.çËÌ^¤Ý]ÞâÍb>áÜ÷¿ÁϪç+Ç/!€72›îRŸò}|ø±{áÇ?i€ eømýï…W{xÖ³# þ,Þãg›|ìÕPkc®ÜQk†¿kËf)õå6?›°<#™ùKO°hÊ"‚}-}i¬vß!¾»ØÝ9½CÙŽ@'ZÂ!ZêøˆŸYÜÙy”®¼ Ð¥†dk%òª}$ÚêAlTk1ø6šwgks™[ ¢ íOÍeQ8e ¥ð€Yøþ‹µcøªP¹³ûïT[€öUí]Î3窞·ü©Zà±G/Ÿa²BdmPÂ¥:wϳȊ’šq8Ö$KŠ’çš(¾0œì4¶†¤è{*C&²ÓeIçŒÖùP#ÝÃ4Ç<õªÖz`º¼™æféÓ,ïl˨®çUÑÓÁ£P†\Ì:Ý#ˆBc ]‚ã‰í¡{?»º<ðÅáÑ>Xg­D˜(:J!ÑÁðð€ ‰÷‡ÁüŒÍÐH3úpê›Ib?eáøFÝ€'Ðy.S3ÊO¸Ár¸ ¢„Þ œq–SïùÎÞ«£„@ÏŸ¾_i³^×iÙ ì:äi5õ"Hݺw$MÙ±%Ö#ÔŒaÖ‡ÃÑ!wÐú¦ÇýEmé½wïçÙ› mH¡i€‹£Ûoi(ñ‚ž:[YµÖÚ*F‚gÀ+ääÝÊ{Ìø¬]ÍÉYæ\]9—Lw|y‘k[Mjß Îu9E3#ùïÿÎ/ü—÷'æ][nè[hc} wuʽݬÍŽÃÊ¥×~ïGßÄAþkéë°]5B^60\çº&3–Yؾ78¸MûÞ³×Í¿UÄ)ÒrtïÝwuƒõa ·;µqDhæ»_riùAú¸ë¬­;,½Ç©$Û˜ W‰q¤íJÑ‚îñ¸/-[òá\OÒç‰=×i!íñžô>á.¾V~¸º×öé›®ô8] A\ã#ÀšðD¥9B5>–Ù.Ûf›ÃË„—ÖlˆBÀaÕjŽë›§ž¶r}ÆkòÂ4¸E¥†Rž¤ÑO -—ÔK4fÉLi½_ —*]¿¸{ N/h˜Ãª4c/"§t{n\=˜2|¬Òª·êw“ž¦×rºo}ø søËê?Ÿ»">»Â©W…e¾I†~m¼òŠæÍÿ>_Î<šE¾Ýáÿº\û 1A}5YŸò!>VéþVsx <êú[¾Ä;üX@wu_X@«ßfìqñªTC&épËÀ\e´ ¶®¿ d8Ëû @­Úð.¸Ø wLyCèyï Ý1·<Ë®uL³ƒJ²<Å5t þàb,éÄQ¦ù:0‹ûÆŒ!‹ GnÞ;h‰.jM:Q÷.ÀÕWT•lu0·7¨B@£YÈ­Kaç² &|{xX=—˜ßóWƬÛÛþ›ÝG[òþêÂâUÿgd/<¡ÃŒ¦DŠóXq ÎäJK=2úœáèÛ¤J+Î$G9á@s2\ÛÕÿ¤ZõB#]2+ݪ/8‹ˆ[ú5Ãa†F·FË,ó‚uä¢&&ߢò6PµÐMŒfÇÍB¨DHlrŒ$›Cætƒh WFïÀ;6³rîZ=z$e½ÑJ¤Ø²eJŠœN€o“{¾ÕîHíü‚àÞ{€ö ‘ÒOAÐѲd#šbaÎFý§¥{Ê!žçU¼S´ Ïfñh˜"üDjd‰t{ÙóÜñL+ÒJ‘ a/þ„%Á[“ŸÑhÍhvœ ÎsÍr“˜/4é‹un(éÃŽ>ks6ÃÍ:4Ð ç´0 —Ó}“@C8ÍÒ¸@``ÄÉØ‹C3ÄvÔ;•ÄÃÁBÜ‹Býotß|.'¼H˜\ ¾CËHÐV~wHŠSeç¯þPäýì åNæÍŠ€»ŒQ¾0‘ôïÇ87ÒŽžCˆˆv rµÑÜãGÁó<§‹:oEr÷’–Öº¯cÍ=â1 ޹ûyöÞÀÑŽ\tµA"œÿ`Q@ÔSAkOuíQÑÆy;kGT— ÷ñ&"n’ ÔR­ª£XøC`÷ð¨Vψe@óÕ÷t{À#òÆÜ‡>™MžØe²·¨Ô¡œæ2Z%O¸4ä·«åm¬è´\g¾Œƒê9r½8' Ä*Œ®¾Ü¡}r4¤Î&¢gV¿«xÆÁªoFBJ©­ÕH á6ÍêGS²­°`ñ§Ò=æ­óóq¥Z”Šã¿m»ŒR¥u/¯qÝäF›‡-Æýeò¶yöÀz_\,ûÑN± ²ÓG¶Pr®äEÞ]jõ…ra×½&œ/ÅÍenÑå˜Ì¿±Q@Ö{½mÙ7¿ð3 ŒkC³.VÏšiœùU´Îyá! šk´R‡²MÑuš¨±ÍQgcûVs>Sžqã̵rYÅGA5'óÊ¢ñkóŽƒt¨`™¬eÎZºJÿ|Q€ä³Šå‰[ ÿ|-@0ÙñŸSR÷ªìÙ4ÍVcñyZn&óeÌ­\c3[Ò¶úc[ç ¯&üú=3M˜Gã?¦ÕÑ?œL»+ˆ‚V||]¯•×úÛ ÏU¶|Î1Àf}k¸!m”~–‚d#n XG.¥ú†$تË(Îf–~îžkr£Ñȃ„ ù|¬Á)Ž®#™hÓÀ IDATÉ ”g…œäjUG4Ê%ihQä6¸8û̓„yÆJÝèÃN3ô Ê-> $÷ˆ„’ì®ÞnÑoœvópÀ‡=šÌsD ØÅå‰^€`je °ð“%ÐUý¦n8Œd#À{ ¨Š½ö psº‘íxjÇÑØ ºÓxs{¡îaökÓ¨zŽl†“¼êˆ §ü:¨!a‚t±®°xÛQ•A£ƒvĘÅîìÕ‹[cè;³ÞÚ¹NˆY¹éµ2xï‚;Ú; ëì½KÝÅó”=U3kŒéš%:Al¥¶!X38€Æv;;Üè]#zqy–L¸rjPÉ ®¬L—JÏnæî98IhW‚æh2@ÉΖ‡Kª)€¿õ»¿"è¿øïÿ›™ÙÁnÖT÷ºØÒ² ²Çह î:äŽÿù÷ÿ¸‘?üÁ×ÈË3_ÕëáÁŒ@1ø.tŠ`+*Ë…kÁª*DæCƒgaü‰¸{_ëÃhnõHÐÐ4òßCgÖpE-ý}qÖJÎ*J-\Ѐø½PÈœ«± »5'h¨ˆ2Ä#7Š™-Ë©–"7»nóô޹-˜ö-‚8â.·ÌÄYm%N š9B€÷.‹Š—Ð;£WË6«3£Y#ÚÑä p£êÑs®Ÿ>3Ru °:;òn›zébùXr%ÈÆ£bôaxÞ'à[Â^:„îîÆ#$ŒÀ¡¨êo›çhÎãê˜õ,©ˆ;a2gº=p)‰Ñ!²zì4]hNÊHŠ5–Zvq‰’™‹Â´¿cM@ÊùH|ïT”?dÒgl KOT?é9nYò \ýO ó`Á3Æm0æéÉHùÝãßÊksØ{ž²Þÿößù~÷_û’zOÊNüoôEÏ(ÞèWð,Ú9Z†@cÎ:Âá¯ð Ì5œ É¥¨ÛWV}ÔlË®F4ó„£VµVW±tr<oÛZéîÿ·~»¹tö3Ç«ÀÓÓAšúé½3»Çsôy»@íèr“©Y68‹nÔ¢·7¬¨§F"¬ºð@„,85·°¥û*cg¿TÄÞÒf új™Œ¨HйŒq¶e deF„Ùà@-nËÊÇ&(³»ý1î‘Í…VÂfÛ¶`÷­¨•ø¹Û:çmw‰)/ʱ® ¸¶KN»;÷ÒO\€œƒZ¹œ¬¢¾“7YºèJÐ:Läs{3r£_½÷š^Ÿ0}Šzi··>¿aI\_¤|®ô¢ñ7ôÇÙµ=¾Êí+-“"ï\«=z¦¾Hv*ê¬OÆVM´|¡Ëoœ7(M”/Êà°M×{w>´¦®œÐsæÔ)Aßã6uHK$»æ{W´·0Øã^¶çYÆC‰£<›Z>+fùûTú'0JÃ0³i9Cðµ+5‹™"‹ÇÑò3Žsfsg¼š¡J¿?K·š >ëB&¦ÀWõ»—ÄõÇòÜãþᵜa2æ·xÌØI.¬&ÖàMkËÎåÄx^8ÒõM|D<ÔV¦Ù2¸~-“€ñDWÍ€Ÿ}ân8mÃZ×s™ëˆgÓÊú÷Ѱ˜@Ÿ×ØŒA6òÏ+rä$>zй0ü7ç}?#}›Ï½uŸàË/øÌ‹aà-äŸ/¨þþ£ýQo“o¿÷¢é[¦o™¡è¦¼‰|èiÆJéÃgú”W׆ßj'05™>û—…ÿNôiù,×®ˆ¡o_£c0Ìרc0kãwx¦úCJí±Õø}A I.4Ëä~Z©‹[‘¡6Ÿ ¼0"¹Ó,}„Ùdè´¶WÕ»³aÚözfäî9T¹,³Ë›r¼Õ&—!­QW Ýô6¢ñ&-_цQE«oiu’>(Šæt$³ù¯üºúªjk=‹¤Ëò>ÊìAv•£8ý”£¾T¸a\cm$wŸÜYrƒË¸fPÖæù$ä[O÷²¸dߣ°¢™InézŽSŽÖ£¬ÀsñÕâ³Rù„§nÜVä»,¨ÌçüJ: 3‘‡·^\¦5n>qÆ€5Éû ©ÆO÷¥bcÝ’ÖÎ5Ÿ¨Qò­;Pÿ‹C`ô»`ýKðpªÖv þÃT'ŒI”Ç AâŒÆ&?[Ã#:cˆ!¹”0Ì›txÍÚOpe\ïèÒIóZÈÚI9DÔ®T©ƒ¤B’½DÄ`•idB¢8‡5š øË¿õÛÉ‘‰¡.GÆ'“'©×˜ ËÿÔÍ™–ÎñÏ#:f {:¶‡³¥©¯›[Gfj¬ýÍ¿ù¯—= Á§áZ;*%W†x”÷ÀÝŒ’™”zú*Kæ½)éöaFíªñ4L)œ¸YbpÏÖSÈXSмT+ì#§#t|wo­ïoçíOúGò'êÎf_õu@ìxŠkÖuE× {56UÿEŽÐ]7Ážs­rƒ̺4² ‰rœf¯"œÁÏXÞ>m¡9ˆ¬L¨×[g+ÖøË•‚ çCÃ}½\Þœ©X&g°±v¹ÊPàÖWùH@åsjWd”¶¶åOyá·ÜmŒ´Ë/ÛßÞ½òZíIµ o‹…¿Šµ—ÇãHýéÌ6³Â¼‡¾ßäbûponÞê¨;,W4ü3fi쥳SÍã\ÑEZäöm€2_jö¸>³ar-•$§ì;—*r,ç ‡ÍÙ¹F2$¸(PÕª>Î érCG‚¼š£/Îb]Š_t• ¹Ú¸·¿ÅMäž±Ýͬ…íÃÂúŠlêÿª÷e/&l•%&;§‹ivШ^W.³\ù„Ù&†8-Äg!)2XÚr¸´8 ˆ{ëZ`©ŸXÀÚ÷Ë»AÈœqoæýnW¯ÊoÄ#e‡|4vÐHölÙö ¤û!äh’]`jãÀ·ÊZ¼Â¿lÚßÉ»+víJ÷¤ölãA½äÆ[Õz5ªVVËÇS ¨ºÜˆBŽË)>L4*@•æò·÷E×lO|8:ºä ø=ÔŸÜÊ—~ßr)L~QÔä’†>Šüóù¢ü,¿U£$½±÷öy1˜¯ßJ>8À7©ÛŸ,1š|®OþÕzS@àga¥yðúiö1eÆü8Wö>˜ì.·1÷ÔUf”7Ñ7†±É¬àAŒSòÈApXhêÖçK®`>jkiƒvÇëcz°qltOM>ýÑ-rñQÞãZÖóçd¹(Gºn vÜèÀiiñA èö©­[OU¹7>³öaTñâ¶Å•’/ÉæØ_•{V ð:«ÁNï±ë3Ú*Ø}©7zv$9~‰} òÏt8%‹š£‹Í–½ƒE£DɉpxXÝ-—ÍCÊ …ÕÚ;S÷Û­#í„448-+¥É h0Ñ>Î9É %j”É7ka°èÄR‹B “‡ƒ^‘¦Aˆ´Ú‘Ü;|´6Èoæu4°=Y ªê2Ö¯CZSÈnËg삤ÆÖÞý =ŠÑH€ðäìrôÞŸ°($°ÖŽtèèݺàÀAÀòØÛÁ'Y⇟‚Ù:tRì0Û7r··.ÞÁߟçílý”{;ž:Ž`Ëó¾~L¢,’ j%µÖ?å¤50îáè¾FÌ]æV–ìîM-¾\“pf_fœÐ]®¹­­/؃À)>ôÄN«üUE¡ ¬EËëÇåùÕ¸Ìà‘k G„"š=•®>¿¶~ëí]PÆx˜Ás<Ð1x‚Þ$ùþýíHqò~ÞÎÛIÚW‰Nˆ¢ V]‹óu ^KûÞÎn¤µ(`¦×ͶrYÃCY;ŒjÝJé ñý›¿þŸü·¿OÍáÆFôÜ}÷îˆÔC@‹Ð póöÝõ$à¿÷üI0þ•é»$ZNz&D§SÍbˆZÜêf)’É5WÂÄ’Ô¬YݽÙlOG)ÈÅQðúùˆO 3XTUïCôÑØíº°&Yœº.’=Å9 ¶/S64#ƒ§¹•hO,nÂWE. ìB EmŠ”‚pbÆ)§0ÚË“v%“»wìkÆ,jCCß8ºÌóf!ËêÐjûÓ2é.‚_–]Ôœ‚+¹¥JY!×#U™ù˜¢È@˜å.àjÊ^³ÄhçŽ;º{¤mÈü À[OAˆÂxïÑ [ °=—0-ÀUº8xÝŒ’ùn¶PÆw1<Í µ¥NÞzùå•Õ2凿Sl›, Q|+À233 ©=4¢f-¿kŒGl±µl*nQ+„èhGR˜Ðá9°„Ù<ßͼçiÙ†ÖZG7˜$3Ê]fFt/âÓka ö‰ÝÁ¬íÍV÷…|,#{ÎÞ¸˜Ëå]®¨Êì™Í¢D)l=ï’2²ã`æ\¯™™eµJè¾Ç“ütWïýv;oïoföDfÓ‰ÙÓÑÜ%òOt‘…oëò.â¤ÒÞÎùl¹&<­ÜÍC¾j GŠfžb4àÌõaXU²ƒÁ±¤kò ˜–y —ÿ3÷ÜšÈt•Uæ\[_cfàÂË•-,ä¡¡×”z\¡«Î•³¬ån›[‹(͵*àRÍç7mûéäÃf…ãdg±^D.{)úU½®…0Ä*ò˜ë1ز¡éµòü±?=˜í?Ó¾9ðGUßÍ!|K{Ñî Í.äÍg¾Vcf§Ç. òjB•6³û*nC‹é~N¿K}š`åuÈ0FK{¼¤YT-ÊÈû˜ÆD°¬eC³+a yv ùi¤J¼§îÊh˜sç€I[´bŸžðAÇ0—#Áz¯­áÂ)Ç*,i¶¶.pPlK-­´QêË#f”Œ bÙÜ+ö*̇p´ˆ«‚ŽÌ«Ó–åÇœ–7b޹cÍÀµôyïøHwç#am½ ø°¨ÑÒ§Áå›}$ØikÏžA™M3]x¥OOÚ'5Ý;ðf½.÷3evÓ>ÖÃtÁéRΑ¸«ænÄ[_g î-ÿÏ¿:° ìX[=´5Ppù¸zxs¼/ظ«ÉÝ&dÿ&Z‹R–yŽq°4:_Øý‰"àò%qÏÜ<oµÏÈØ÷Ÿ§}÷ÿ³h›¯ã‹¾°ñÿî½¼:XÒ?äk£ËémoUߢpü!½Ÿù¿6è|èù³0¸‹苜?Cù¦p?¼x¬ š}€ìž6‡ï *©ªá]$cx…0´wYJ5£¸>«€‘ë›üͱ±³YÃ;Ü3Îhœá°²F¶¬ÇÄÚÆøŒ¶D^æÈÙö6Ÿk%:>ÀðZ¬Ms!XÀEfp’ƒäa•-ÈæúÝØ,EkŒrEšññ©˜n«tx³Pš&Éîºu,;f‡p¿|)„ç w _@ú¢—ÆaÖ\ïX ”Yµ,œh)¡ƒ=»A ÁÂ6CŠUIh4ù7çÍO—º\ÞöÔÚÑÄ^n@Л¦%Ôbcq]ƒEÉdà¤y›¬uÈ¢y×E|]:´ÙÕÁK/<­‚øUšh :ÔÃñSŒv&$¡ªj4ÚðnjQ[¼d¯‰Gó÷Ù F·0šàFtuk pœÝ)Á¥¹ì r™€#þ¢Ú{:à'nÄ©Žú;PÖnÞãòò¨äí’TkhOD!ÖÍBªczÈ"âÞ¸æÆv4zTÏE“C zä8³£È#'íìö®©g`4DHÍÜ=«ÎªÐû7ï-ñ$k¥XËb*e­Â —ô¸öštv’ŸÝžŽ³÷Ûy¾{:â^ è<«ÓÕÝåÝ<öbÂaíÈRÔ´)?ñ0šKO‡ãìOè<Ï~;Ýðó´ãhŽãG­ÇÑb±l8)¸Í{€]I½» | 7¿ÓÄÿÖÆD±€$µ¨¬4üÇÿö¯øÏþ»„†tÑ ¦^-šrÆñÈÍ¥Ë)‡[ç(|SÿïþïDã¿ú›ßµ€*4e_ƒ»l"mûäh£,Á7oÌr3“5ƒX_7 ³ƒŒ‚h ~bä6¦i*÷§é^Þ»‘ŠãKïÄè+ˆ¹¤’kšÂÜâF”ûßR n¤¼3ÆtÌú|É¡£òD-¬·m˜óÂUV-Ï,Ù”e0¬"›Žßi23¡›5³6ü˜Å1šÚPbW¢þÁÔû»Ø1ši” läÖR ·¿$èô÷Žãàjl Kœ½ijsLQ*v¨ÖfÉ)õ?Q5ã™^+wÑ@gAú—BŒ$™ 73çã2ëeJ­‰« ¥ŸUÝ7”Ú õ€*ÂH bNk*×ÀbðxµÚ ~ë·þzŽájÖlÎÃÆPEœ8[‹˜Ð3´XI­Ù(•(þ}uÆÆäÕügñ(‹9<áîfM4÷^Ý…Ô»Ñ<Ï1²ý¼‘D#zÚð­dyËŠí”[’°Pz¨Ùîcb>šÖnÂò”$ë , õô~Ç@” Ù ÇaÖ§¸Iö~;Ïž°µîÙÐkqþèýûoÜ»»Ÿ·ÓÌ~î»ß5ãÑŽãxÊ6à›þøýYÐ@¯ÁAYƒŽÍ±Äe©pÃQiZ—h¹”Ö¼ñq<æ& ©¦\€õj.)k/`bÔH ߀—FHÎpIê‡îÂaó©ÅlÖúÿ¸{ÛŸÛ¶-««µÞçzö½€` (’°¬âÍE€@4_H4¾øÍÿÍ…è5RˆBa ~‘@ñR¢­B ¨{ï~Ö½ù¡÷>Ƙk={Ÿ½ÏÝçT]o%7uÎ}ö³×šk®1Çh½µ_Û­¶¾*—Q¨ÏÅÀ%ço[Òãžt¥¸ÈKÄ€æ Ⴠt*tý|ìcXâ4{|(‘goÀ5ÉÄI÷™·#·j 5 äŠkCÞÜhøÔ>KyiÞæƒÁ_[aŸ'¯Üžc5@˜·Ä*î|ÜëqÀ=mP›à}+p¯ÙÞíêÖ¨¾<â¾+…‰ÑV,*`¶™ÉçèjŸ/'ïR[mí›QšÛ a>äæ0æjÀ½L« J7ž—\$®Z ê)pÁH<Âqª·—s‚š}y©©¦ovS—%¨Ý—ƒzoD44+ã`SG´ÙdS­ìdï×ç¸æÆU3퇙xŽç•&ùAe)þ|„ÕMb›®©+RIÏð¢§òY÷¿¾n–~»ÆCÞ¶ðjΆ.ß>}Ä|/]wÀt±ìÿÍ]u_*ý›Ëßܨ¬Q˜žìãoN>ä<æ\¿–p©µ> ÿ«ía“KÞ¨=&.<³¯Ðû¸Ã¥Ù¯%Ø\ª³¸Íþ´^š¾q½U_èïÕÌÆOúÛÇÓkáøÑúË/÷æ>çW~¢Rÿ©3ƒ‰ôoþ<¿¢î—Ÿ¦ë«[Œù ÖøoàøeøÏ‡rŸ8øV_Ó‡føá!û?ŸT— ûדìi€‰ÍçãÏæA½«×l”b?4ëH‘r?Þ& ÙJªy§œaZ.ëCW½¤öŸ4f/Ò¤YANil¦uþõÒVŸ3[¯Ð9¼~u-/$}TçåêÎ+±#w¨n¯œº[÷TñïÆ/Z¦î0WûÑ‹¸Ñ'‰ö@öÇj\(fíD9”jÕ <ÿH<>†v/?^è»ïnfßÔ„ì —eHYûšgåÜ„çès.âPyYÇ€ ŸÄ¨úÇùš&z3hŒ´K‹ÉÓPôV0÷Õæ2†Ñ`Iûš0XþêB׃®ÃDx»;iyÏv° £>)1PM¹Í)Ú¼5d‘Þ=æZÈ‘V{¼F@Œ®A–ÑF²BdÙœ)Vy/ŒÆkƨ1L²p×Íœ·ƒ·@ŒxŽ;dcJ‹¯wž†ã™›ì°0f)’grOߊþõ'Áœ­~wÙqZªP4zIyÉœ ‚æQXÆ¡ Ìò‡MðÃàrX†wŽèÑERUfÑÈõ@Y§P®ÝR±ÏüÝÖ&é%íBÒ©ð¦ÊDYOrZ>ìâGOÿ ô:FV­:-HÓ›éÊfÊÉsœAÜ__ÝÝÜÇ}Ô¼RÁà`¸Q¡ãf~;â´qÞ{Non‘hv?F85FDM_ó¼£F…Êמ…FèïþìßúñŸü‰èT¯…ºÖ<±e{ÉWW£lÑ™ÃʾôÒŸú¿)€ÿæ¯þ<î‚<ç4ã 'ÍtÃáæÙW5eˆ…S9ƒø™ŸýEwÿ©ßúkX¢iCÏÕ¬R¢24ºWŽ.hLš\26J¤†¤ÁØlE…H¶v·” Á¡E6B2‹: _Ž¢ê4»&·Øé.ÉHØ& Í•o·ÎÜ•¸Î¡ĤçU*{ä´—„[®TV=!$14Ï·Ö=v›—Ÿ»ÅÓ ãÐè¸~¤e‹j-Å»5Û·q†Mf6Îzã¾k²27^jïÆ“kEƒPÄ=p{ÁžáÙ…—ëþE³LÌTñYÔnÔê²Þøi>žžóªÊ"ÂCÈg¸àUGlYà ‹ g©+ÿÖßDn§ÑEV†B²É9‰ Öd‰]©:}¤†UÿXqÄœ0ÆoûíÿºÖ‡Â¹›ã.“ÌV‡’£=ý ¹å{)bLæsØ»­ª16”`nùˆHHócí ì°8OjÀʼËÔ‰vX†"ÌÝÇÌÄe-%D)±ÚÂù aø€S›Ó!E]^m²}™y£ñk¹_·Õ&ê¨Ð©LòŠloÞמdX+VÏYÖòÃ9’Ùeû‹%Ûyä™±W;3÷;Su}Ô?ñ†3EòU³³hF·õàá½"64kz›ài]õ ÄþÏsVÏŒ‰k¨æÃáRÛÜ´þÞ‰(ÐÕÜÄæÿåªw†*Ôì«ÇÌF\Mp«xn{à¿I¸Z—ùH~Åã¤åbŸâÅ„g‹µóŒû¦öYO_Ôþ1Û»ÖÉõ®ÌÒÃ/ &„ á´M2Î1ÛØ>ìúŒ,÷éRÈEIZeÖ¸VįŽtn2Z×ö”VýÔËšyÃmËí9¸O¯—(ló¸¹ÍFç•~“¤õPiÏy ¯ût«¦¸€­ˆísxhÞЬ[}[Y×EîÓ@¾4[ÍÓ¹õ*×u|ƒGþ s±‚¯ßé˜ú˜úÿ \B.¿BWÒ´ømŒ‰G¶Ø[#ç˜Óú2ÍIc-ŒQº=Õáíä{êWùçMòyd¢g½ËBçû€Šz\°Þ¸oøÉ/ð3 ??ªkÓ?þ:õC]ýýŸ›£?öÁÛ§%>§àÛ‡¿ü7€ŸúëMŸòôq<”~´à?ÂÛËÿט!ÒK:{’}E[Ó¦¥þùîlÄÊǶ{)iÚºl~VÅ$ÑbÔ«R8-s+‡0Ã`+_kïšz»v”u´)Ow´UNFÂxS޵µoAÖU~ ·ã@‘@8Í|y^/r°š³©|69UšØÞ X5øU{k1Ÿ×eßcqš^ÂvºO'Æ#c3½XãšUFÿüøsâÅn]X a Iqò4yä,f ;lÍ„aŒgï¬ËZQÈo£Ón¡û§Áéf/Lðƒ|5ܲ»¹âp€<¤j$ÊÛn{²“ e¿ÌäÒ#§\RèLá Žʪ4 ˆŒUb'Μ - ÔÇ‹z=û÷Ñól›Ã ÂÃM9S¢€1ž<‡sŒî=d¾½8Oðnß}áAðJÜo6B1^Ïӌ޾Ãb ÞL& 9€#½¨z‡ÛP¼Çxw&ÃÊ ¢ðÔ1ÆÚ&BŒðuöó¬@&dd}O›!tiô Û÷ØœþÌG¸YM*g‘4•J3M_+«Á@Á&‘1°‘åëi¼þSAÀ ô¤„JÍ6æ)mõõœ:ž7#­²œ‰:m[üÌv 1okàWA±Ô=©¤ˆ‰‰² ß œç=k³iÕ¾s¸’)³!°ö¼ú¯z×b½ä¼*¤ðã?ù»*;²ôÏ’Wã3EQi"ûnÍÀœ¸#‹Å¹ášdu_¬¦®0·š};Ò;âá UìqÊ6~Î1²àÞ¬˜þ:ï¨þ€ Ä Vü çiä¨Ä]ŒÊüW3úç,-_T'¯ú~Çв,FÀR"bV¡HQÆ\ä©%ºb¶¼tÈaSiw^ÌÃoÞÛ u‘«ûÈnœßõÕ#3¯tÿ·&Â+^¬]M{ðÇîMJ[„Õ°»þ{àu€|hß¹Hô3‹!® ùî¡Øò/[o# .~3ñó2i{ Ì›íªÞìy‹ÕŠ0^-ðzC×ÒsÞ€—9¢¾Jjšý@ì€ß2oï·÷š„Gõ[„ÞG}Ÿo !>.=ÖœrŸbmý>9å•i£pö“º·ÀCÛäq÷––1ƒ—¢_që&žžÿÜ]RéW²V§*ÿy®mÃÐËsЬÿKÿÆç«ÿ_\\~~1ü°_ôáÒ|XäÝèQäS;?2Jüà«àÇñoÃô¾ à?K ×g\êOJjèËÝCß^àáÎ|ÜV‘ÿ¿©þ|ÃöCÀšìÍLu÷»b¬ ÊH¸¶ƒÛƒ¤$ïÞÞtœ½ Ù[½Ù½û<v è©•µHkHøDQƒâÙ²‡¬‹Ü·CþwÜ?WÀó¤õÿר¾¬è;Ä/Ý IÎ&·¹çjy™iÖ¡‹{•¤ e"­³›4k”˜s\ÆûG9Ç9Ó*ûpGðãw?¶ò}É@ro)CÐÝC59RÜÔ M¤˜ãʰ6°x ¡'@3—F“úL^Yý섉Ðpó€Ç°Óû‘”à”k/7ƒYdý‚b¤#p„๠§%”¥H!vº¹?yV¤¥«ýˆQT¢Ä@œ¶”JSÚ-gÆâIÞE¤ô£È똇º»pGÓï ¿ßwÚËÐ/%4Ew¿G ºÙqØw¿óbÇ ²q:øBcŒÃ ÁÔê¸8…!ÒŽÛ‹8!ó€!Ê愈áYlù¥¢†’…ÌýšŽÔb7r®,{Ëäÿ!7÷:Š®¶æ+#kY³ee:@ª„2I¹ æÊô/IÑ*«b©la¿Yßk @#¦ÊÂæ ²¾î[÷Nãìüv¬¦ ^ÔÞÇ>^+"x|´0g—ÙÎÊàîØ5ó7MÄkÄЗ®Ã —£n7ÝîzúœæwpjµêyÁCϧe[mÜÇ“ûA{cû<«z#V kEÁ‡\¶ŸâFžfNΠãuòÀÇÞ ^¼.;’èþ@mS?l™âY/v)^棔,u’®—Þ•_qÞÿçËü½¯’ZžPÍQá#>n>²ù¦úÿV”ìÛ±Xóm!ñ ¿~<'óÍ3PYŠ®ýØ+#ŸJcžÞ÷©ˆéK|Ÿ£æ–àÎ/ôñ‰¿ljûÃàG°ö÷+o­¯Q ü”À¾WÙí ÓæÏõ P‡Ó‹ªsý–å+(ƒ³ó|½q  {éV·@íG|§Úë5;uÛš"¯Y²ÑD²ò§Ÿõ Úƒ í¶íþ“a—=÷V÷µL²šO=B°†esº´À­æÓ<)ò›‘¿Ä£ü‰Õí§¬ Øk‡w—•JŒsŽðÁå’xÞ}ìö{^Ïö±ÞJ |áXÀ…ÙhÙqntOðP“2a0g¢ú–;)?¨ëò^!æ Y3’›©ÎY¤“ ›!"…eLÿýyv£¨s¸ùÍèLcø(]”ç€hé-´ •rFaÉÃJ¥â"„2møÉ¥ k•è¤d˜ RçYÕÄí’53Â:"ÞgC±è„[ó H¸ú Fˆ¡#^ù½ ùþºå¼ÁätÙws¿ÝnF1ÐQ¸ÕDiØ·þ¢§øvw ÁD˜É ðfßLBTŒ€Ì=ºè7/ Š_AS2îØgôPpúŸ`E¯&Ó{OÇAɽ(+‚…"U]Í×bt¤FÑÌ °°`NÞwâûïÏVV vâ#*;£Ó§{#7uW©î¥ÔB”b˜ŸâQâ®!ë9"‰d©bVmŠ‘qŠz’¶Œ?û«§Ç°xÙÉ“qC+ßì×eHV-Øe¿Ú;tV¹c[Ùls-§:³"X…â6ƒa !Jk;cŠz0N |ÎKº+W9†ªc`\§Ï®ù†¨ež›½ÃÈÕãõºk _‚ÃM!1j¤ã//9î¬Dj‚ÈæèÂvºú¤‚·¶ú;þŸªfêEÄ9ȬIXÿ’œ\§.j”èÝÉ%f9 ˆnnnFkÑÝ#¢iÿ®SÌH;&kØ1è¡þ’°cÎȳ_ÿ¡q?Ò^ªóì/§@7bŒ{ý)sHIç'rÙ·¶ö@±l5¤1b±Àß“–‡ŠdED¼ÞÏ_ø‡ÿ51Õ9{pxU¢%o‚͈J.Ü-F0ÂhˆÈ@n%0N%ó,†Ž^›ÑåQ%¦õ|>”0ˆ@f| ަôûö^•„[æXÁ7¯æXn‹Õ”Þo‰¶†˜]’•ˆmSyæÛj¾ÀÕW¢´ëªpõ1 6¢6THë¯Á•»cWë¥[Š•Kât{æ„”ò«ƒ~ ”¶)}2kÕ2Ì•5[ €Ð åN±ðñò ký~m0ï)̶¼SP´5oÕªKÖœWª(v5+žFÿë gZÛµqìmÏ{x 6xþÂv«M륹k?ÕíCÅMS*uz?­ìãÁ3+÷Ó¨ª–Ô;½‹–2Õ¬™Ÿ»Ð~šüR÷TO-.Ü{q'É¡DýÅï¶–…<ÔÃÜî2þ ¶ŽèKX}¿ÇÖó2—Àž_ÙN_|’:x„´-,Y|V§Ç.Àt±evͶW(Lguº ИÌÊÙ6«=BÃãr½ÔŽãYöíù¾ëùRwùlSh%@Öäh‰€¶7F_?ýYz\·Ð㈠’¥Gý’Î7ÚÕ+¶ÅÆÎÚÕX^Sö\ Ær¶}þÌú V–E×f¿YÊ£5‚ÒÒ%?8ÕÛ’)z+߀ëm¨ÏWµy;Þ¸>o(uM ÕÕÿ?¯ùâ¤.ÁBõ ëJ+špŸ·»ožšs‚’VÓ/ª~|ŸŒzç®—kžÃöÛó2 à›Ò7?»„ö›æÿèƒÏõrãù|ÕŸcËëÕ2ÍĶ%‚×d¿Ã/ì‹vs|ºú½[…‡Þ¯û |®dý™7ÆWæê“þ¢Oú®þ²ŽP90ÜôP ;¯Ä¯Ãz„þkò(×G¦¹(¦yíµm$ÄêšiøLíV"ËuÛD—˜ª}k»ý¶øƒÙDÚ;a눱ø¬Ø6*] ¥-¿«ÑåäD§›Ügêr{¨]%ï ¹Š¦zG"&>)(SvÜN‚yΤéa2uÆG[Lé‰*¼®¹%[c–•)“s|ý mÿ;žFÛOéu'3„1£îߨCó@œÌŒÎT5uÁÌiH¾R£I#"¤!œäK:¯Ó•‰0İLJ.$FÙAaVŸu¤6Q W1"ì‚À;Èu;‡¼«&C ð.ºœƒQn»fpÏXnÌ¢´<íš”²ÖºNA¢®8Í¢tÈ®Qt¸{ç·LøæÄÈrÆPií¾Icð”¨ÁSªbFŒÛ Îf:Ê»—§ØI78)30@´hÆ'Æ™C¤a&ó‚˜ :Txð´ŒöV9ÛY‰Mt&¦º¾Àbzòêœ/)0 9˹:Ëë,ù/û³PÄ1"ë±Õ‚Ã,T°¦ÚPŽêoh«aP91ÆheFå~ÄH0 Ì8¨î•7# £ˆ¨Ãi„ ÷×÷ßy=Çý~÷î]ŠÛq»ßïÿä{ïýê—w~$ã<Çrc›9â;ïÞ7;ÜGŒó¼G®¦4øa‰ Qfc€·ÿóïý½ßü[~ ²&WÊ6^µ4@Dø*ãÌxmtœÚ‹Ò:³ƒp÷ˆñ'ÿà¿Dçñ~àIyÍÜÈäÚâ´ÖÑÈ0a&ÜgÀ‹<‘2óŸþ›¿ðÛ~lü¦ßøëëÁ½ Sõȱì¹PW&vÚ0ÿÁÁp{µ-•00Š”ÿ*Júi»cªcÍFÄ”½m²ƒB™ªèK´Âæ]Á]ªµŸ I÷ CÔ)\r÷œíÞj ©£¿%º£øíñÔ”ž,ëʳA^ý×Üúy¨ê©¯+˜^r«jž(b¤wyFFÈjJ¡e¤]ɸi)­ÃÎ! =„Ø‹±8ËEpO |'<ªÁ}"ä¾5Ý[ÖÊßšuÁ­ûD­ú¹ÆUaioDbeù‚<}¿iPï£X4á'x¨ù.)Q.§¿võá·ÿîß·ž¢©6ß&ͰDα*7[j]ÄY²àוµý1lGöì2lpw!):µÈßn‚‘c)îÕGDœ~–’¨$º“^—û8Ú¹ „à‚µÁ‰QŸîí¼ë~—c³Wr²} Ò O·yˆLYmÇß\KÿÎÿþ÷Y7Æ*σ'ßäú%M†¦­œ—vYÁŠ-–Žõì7f0X†÷ÎÓ–1›ypŽ8nJsKÅ6°]ϱ&E‰ðÖŽ÷?Ÿ~7U1Íœ\nt¿Rû…+E$ct¨•ž}ç*Lâ…8„ml…74KK§/m·OôŒ 7hm,K’ß0@Sø_ó<ΉèDçÏ̾]5óKÇïWK ÿóp—]TŒICsÁ¡®Üœó3 «îa9þù¬qR®jÛ›ÐnУ§ Y~µôÏ·£z7›‹«‹ TÏŽRnõscÆélVÛz2<ä%žJK>"`k'U»Ö—“åô)Ü2 - í•~vrÏ•[íò#\òY‚áç¿ïoX~|ó•éùýÑ|ƌӭÔO£VÏê_ØÞ¸}¾=Ñà#ë+ç$úÒþúçëöEýëü!K žÔ|}Ý?øC¿‰OÕɱÏø+e2ñï¯Ûðp´zhý½Ü×ÃaH[Û})6ù§‚¢è-ëq:c§Ñ*L£sï)4g¿¼ŽË²¤iU,Ó˜ìÖü±Í{½§&‹r½†L¨Cª¶=êbÆ2!( Ï3OŒa),'°®NëÑ ‚RYÖxrN;4YCL§‡jJ17ä[/#F!€º¢ ’´M/x}Æö¼å›Zîßmòñµ6Ÿ:R&%Ï%EZª ŸI~ónåTëÕarÆÑrv–Áw6^Vâlm%«’¯Õi*wø¸‡àq‚G‹å8Ò)šeKgÚ?)(,}Œì3_@ÉZQÁ#ÜfÚ/·òIˆiWœp7%/å¤yJÕpSôî·(:Š,Ne6ÛS“¢jtùÀ dA8ËÙ#Üïy|‹(‚>Bˆø.LF„Üív;’´EBvö­aÆ‘ß±ÈÆd&‚ÞÂj j Ã1Ü º5÷:H‘AKgo›},½Ör gvwVÇšùZdåÙ1í³‘.ÍöºöµI)9óP×{ÆH,c làž¾È&O¾Å9"„ifàÐh„LeÓN¦–ÔEv‰·9ïçyž·ÛaÝîxž4‹×ûøþ÷~iœÃ^^n~d9.""Eá¼}A´ï¾{qòï_GŒ{Ü%9y¸%–§€#ÎÜøòânV¶qDI£ËV-_1QjuÙùn˜Î2ac$zA#ËzJÕnžõÚúþÄöçÖÌ4óDsäÝ!’ð̹€Y({ŠC®èöÃ@¸1~áç ýúßôϬ¼èÍÝRÌåkíIY `¼š)mÖ¶” VCiëeÖî±ï(†" –²å•ɬôŽü¤"Múu3äÚ͈PŒ1F¸Ì×>$w¿¼ ‚AwhŒ:¦R0C “¶»$„ fÿÝ<Ù¢}|ð„¶# MnV§Ö·–LèHÐ^Šyù¨±â,c20jÎ+ƒ|÷¹Ô{+X?3½ÞVåçåKD3Ë;Š«†î†›Z®'ºU.JÓì°Œ.vÎBó9[@¶cÜåæðÊØŒÁnY6[ÙM]o óÛ4{I¿ó§þ@ý€u¥í¬j&)@æœ6ˆd¬#µÈ?%„¦Ê3`Œ>µÔ'©šXrÉuÞ‘#Ý<F–±Šã”Íê0Ò¼w €;#p8Íá7ŒS9gD÷]po ²E¦¼KýÈÀ eЩ˜óF̦è0Ž3Œú£µ} þ¿ý¿^A0òAV»“Í^™c>/hçé,›67÷uiüù‰¶†svѪ–®heÁ}T2ŒÁ!8^ŸuqžÃM~´ÃnÄý>“Cè«*z‘âhÎþ‘[*“3”ÎØ×g÷z'qqä{Œm4Mb¥¸ëfÈ"“lŒì Ø.»…(—Òèm;'Œß6îyûÐIÈ¢÷g¡þÐA£½÷sý×n±v '|‰=Üm·³œ^ødÕè`«J'`ýìA„•¤yæ‡&õ|EÝX/‡¤ÙÔKœUì]Ž#"?C+gºïò )ãõæ7òô’ÇéíÑ‘çYM (&—U<ÿ–4 íýVu,Í­×>AypK«Ï#¯Q`ní»ÕÙÍWDa¿‹üA£F¾@Ï%Ï\¦~."ÇÜ]™=Ü´Yž­«éùn³öÓÿk@³jˆŽ‘2Yöð¨ÜŸùOiž> I/ÓC–ÊŸÏN8¦3ÏòäH™·Ýmf ƒÚñÍ -a$qÏýr†°‘\ó #-ï–”¢„Ì`(ÈA¹l´«ÀÀ Ò¡:ýjuâ7)F9]óÀm¤¹«(ft&ˆô+¨ˆ˜§VéŒ!é®ÒuoY”Ø€;5‚ŽƒÉK¶€9#-Ó¸ºÁný;‡ßÇ9 g„̄ۋâH³q °ro×s)R™mUc@¢òû6Tßa¦ ;«¸2«bI ÓÏfPÈð"ö,á¬á•™™óÈhÇrQJ¢§EXO5 ZHfužÉâo‚CCE‘6;pq?‡ 1bŒû~0^Þ½¸ó~š ’9ý0·ÄŽ…ƒ%´…07;÷{–ßÇý~?Õq$uã~¿ßÏóÝ1F¸ÉéFÐýÍ¡‘o$ÎS2ÝF0gDDI$w3ãËËáæiK÷B%¤y_-EótC˜Á£:ÕJUÃ[’4ÍÃI7Çe`ÇÄ´Yþ'ô·øÏúï¦|ª‘c0·Ã»‹1}¾1ÄAZ–fF.ÃÝévØáÒ{##ÂÝ~ñçÁÿµ?öc‰k±|ZHl_PNÍ ý®ÙçŽÈ:ÔTuI„’:Åö9Ö·Âl |cŒüÃŒ#=~Ä"îwÿË_ù˳Ùa+ÜÜÅKN‰¹EĬ⣚Hfkj0û«7Q'aùó¤øºÓ R2ö< †²;¦ž;ÙÂ!)r9!DÈÀÈeR q1"p7ÏOé†qfÁŠX»…sÃ7 ” “3vÏ”À° £AO^÷omΑ¬ùÜjy´öd†È½äk¢©oNKSêþ7ÑäYq?ò*v† /h>YúJ½‘Z³{G-ZåŒn÷èÀ`ë—4 º`Ø!•Iù¦ÑSe駈¶•&h¾ù–pmÕðŽ+Å´‘oD¢…´GZ¡ ‘˨(ؤY.TÔ‚Æëˆë{6ÑÛúš$Ù/§Ô=^Ù”ú;ëýE;ƒž™Üht˲ìõ_òÆÞÏŽ+逴äLâ-VÐVœzгcI\¬ê™¼ê'Y\Ç1êðÃ%ZO5~oùð{U®ÝðÃn­(n쵨om=tÃðúød¾&Iv“ÙjDr]ÍAô"ä\(©›4S_Úí6~JÛ¦9 á´Œiu£L©¯öj»ï«q´\fßËPq’z©•iÑ_<¼E› v±R U>˜ñ±…ë6sYëÖpc|{˜}Í¢{¨3iD:¼‡gÞÒ·§ö†¨ÝŠž^©Ööö!Æœ)ϨÏ#þöQh¯Wõ$è÷­Ìëηx&\"u¡…=iËo‡{°Û4?Mâ[Ô=ml¸7N°C`ìõ è©“Wo¼òg×EÉ5° ç¿‚Ôÿëµ^ÍS·üëºÀi±‰‰W]Ü*¹»éN”½>ž÷ø¨dùõL¾9^úàUº¨ðßT,wEìñö¬¯_¬õS{³ùŠf¼ùeùŒKüÆK_÷½ê›ºÁØ;äk{çùËxÖKùæ-®·Þ×Äl@H¾Oø[±ìf×¶ÅèC¯Ôòæ¶ Õ »÷_4-X;&W·ŠòDEúÎ~¬r,ˆ ÐSJW8“1¬<9GQ¾WŸ§~ Júç¡Ü¦nžÃíAíÛËmó¿ÒÔ46Œÿ´6ÎSs¾Æå͸Rb7°m>©!$¢|¢m;5~eú³úµ¦æòqiǽ)íóC=C!€7î|~# 9I<é‡ä`äÍQN„¸† '< ‰ïÏ‘JBNØ@ )Ba!гÐhp%Ë9›d=•ÃÃÐ’š„ÈíyNbN*L Ä ä‘TZ0D kð7 P4e7)̰…Ìô¼Ÿ)K‡½ñiš"RÏ*,"ìpá®û 7Jp‘NÄ èD‚"ûfsœ­C#ÙÙf|÷rƒ†»8•ñ—´gRÁ!š0ÞI2¯{I²šUõ†•=Z—ɼei/R©VÆ ·3á -·2D¿Ù´¬D ‚™Q.ŸcÌ1ÙÌú©j>C€™¯2#ÃÌŽÐ=_˜ W÷s(p?ï/ÇËñÎr”àfô¬gÃq$Å1 PD8ív·ïÞÎãøÇñK÷÷ïÇyŠóN¿YÒÈó_ý«~U";÷,¸ªë2î¯#ôêáßùîa wu_qa…8ÜîæÜä/þü?üu¿ñ7r:N+9_Ú´¢o7-úxÏlËQ¹:v{5Ídó€?ýGþ€ÿå_úpˆãv»GH1dNœ1Æ‚@DÚ•r’ñ,|¹eò ÿV ÀÄ_úG¿HðŸù±_[¸r€£‡QoÂY Zõ£S€Â (ëÍóN+³X±ƒ“ÆVª[d­}2Š`Î €tã("ñ†¶¬ /RÜì8¼ú~1Œ=´I„Pbh"BCìîd[º—æ7¤ÚF“e´yüóleD y<$1l’VÙ»«øäÍK…Ð7kLö µØÖ“TO&{Üq+M³Õh%Ó]sàk8‘:xôx%Å„“öÒ3¬j’,-e†kÆG߸#ÜgVº‡ ŒfD«{" FÞ“cŒ1Á>ÈD; ü×~ϬûÌjŒQ³ [›GÕR3éþ§YS˜úAê¤ârP™NL3ƒ`ù°ª—;%ûk?ó—UßÎ -P‚•¼ïåV' ‘6E᣻ t—( ”Ë¢fÏ^¬?¹ô!Ë2JÙ倗•Å ®G×+ckÚìÔ‡UFnÆ!¹„þ]VRcôªp.åSÕª4~Q„Ê®QÝ1µîY¼©&&4M;ã)ôh4I ÿ‰áׇeÙá;4âÕŽÍÌ]:k+—Ϻ¨&ÞÙ®™•à¦VO & «çoß=‹ø±ô3§7ƒç“:W®¾‡¸ÉÕ®>-¹|åßàWlé1­j¨¶Vç¼Ãcææw?û^ªmyqÊ-(Ô>°Ó¾·¹<¥;ö"}`F°4ÔGµóÙ¹ù¶$»ßU×yÇFrSìÛKezNËèq² ŽŸ|ÉÄÛXæÆå›q~AÙNK#û˜(ÿHUó.…k¦šw±˜ûz[|\²SüxÜC_^©üü_f×É/I–¯ûÊø˜¹RèÞ*QøèÌàáö{6Û| Í}XHþDaþ³ÍöŸôÓ_c2ñyóƒOù=_«­à—5pé=žÒñ-ôÓÖ{û\áv¯"›O êÒ!»=³²þ—åÚjjtš ‘ÓˆV¤.Kh»ÝSrÙ¸¦Êò.ór§¥knf "‰ Q:(ç–hÖZïC² .%åÎ;cv²<‘s¾K›íóön‰~´ b×ú‘µI‘r‹l|œÉÄʼ’ ¼"°ûÇQ6…5ìœ òáæ|®úÝBõÄü4¶eîͲ_m_¼8’%ž>Ä3ÊþN°¸¶@Op«’Fz†ƒ•åÀ-8³jà\$õFhI©ë˜èJê {“L·c0m…)þ…eM+w zJ§Ã ,œ¦à€³Ä´ dÆ€\…qH­§Îo=ƒšç¬,þšEž‹Jsè $ž`ä©×t?Ï‚4Ÿ‰â íÝAƒ8#r£=†Ì Õ§ì:bD)I‡ÓqL×Ü F ’nš])ÒG§òòÌÐÌŽã¨:;eÑ¥N/RŒ1Êã ]éï∠äîÒ#MŬž÷(Qò%θ÷××ãö’Öc3ÿÞ÷¿÷ÏZMºRÒˆˆb‘“21r`õX*Åå<[z*QÕ+u/w”WQU,ÕÔ’ÖJú'ÿÐo–ôßÿõ»ß^Dè¼[ÒÕ-4NQJ#ÔÐ)™wÜKߌ0óYºöOÿñ/þ¾?ñŸ"Æßøs&1D w².£MÉ¡¡Íto¦ñWLŒŒƒEZ÷;`ªQJ}ÃéÞT—;ÄäGEúãÎe{%McàÈ~A‘ä&KR†Tª§!A7­ÖN“Z·œøÎ Î'â:&8H ·¾ëqºt¯fùq Ìs¾6˜p¢Í;Xd4âÊ-ïŒZ»»j~·ÉGý˜4¤2äÏ®·˜ˆ…•Œè¿ô¢vïFT7#Ùý«˜« …fL²Ë X¯Ÿ“ W V‰SlÞ¬²ZÕ†Ê<¡ã¼ßÑ|!vgõïþýxŸø§R„ŸnÓ]DëüÔÜëònu•3Pg¿ ïJY!…g™-?óÿâÈ¥79uU_SU빉AÇÈÔB‰7ÃÈ*-Þ¶Ëb*¡e›(}8ð2BÌ0ŽiS®’Øõ+|2Íûƈ^Ø9Ý¢s …Ï s©_jå¨e£Hÿq*™«ý÷fâmGõ¶²â{¥£Ëa¢ö–yÇ–F“yÓ×£ ȨàÏ/W`Üïæv‡7wÍš¹•í$ÿ‘û±íËfyæ„w¯È­¦XšL¯ØÈ)Rh´$0z žó¯dïY›(Ùxá·Ü»3Î{3znÌžwqcÇ4Gf³ κÏz‹tTI'ý€SìlÐÜ<ŽÝéÊÙ™hJîc#±²û…¶Mk:bêm¼p7já_jäœÕ®©©útê”~œé7ž=™©€Ï^é¹ß->ßõ¬Ìu&hH} ™òúEÛòzÐ..è]ú1ôÚüü¤šÅ+¼´ƒò¢:ª€½;Z9Ú\’W4gAÊìÈŸ­ ¦©•àÊ»Øõè#"¹×ßêâ›ÿ¦ôÐt=7ÀkŠ´·îXÑíéX¢õ¥j(ñûL é¢Lï9[Ï–öžqFp­¤C0“élö±Uß/íX!Ñ&dýª4ëD‡÷Íu ð‰%.†6¹JÁºY„Žˆ ©_k¦/ç9)úôQVÊ ('ömûÕO2iBÛC–ež^«Zl²9ßCz¿¶ R n—H+õÖˆËÞš |¡€ËÜÌ4«ž#N™)MÀ #íEê 8ÉÃ1 ¡›#ÜÎUÑmWv"iáfÅ•% f<ð~ð@Ð2Cb8Ü1¤»N“NÞ¯ffL£øôÁ1HÏ­3ë•*¬Ä©óªÔÑQfÃYX–¥³ØZ4lm7IF7Ów!FXjɈ3"ÎaÙ(l93ów®!3¾&Nyz¥¥ÛÙ]:Ï!É›óP¤鵂2Ò8u»±|µ5¤Ñ3Šî £ù?É}l=i |—J¿»d½ó\XE„–¦Î±J^…1ÚQln%Þ±K†ìgOc0]¶,äKF‡µ¤Uµß*̺uÁ51â$5ÞŸïÓÖˆÍj{˜S<-nÇq—=G jÌn·#ibÖÍdGF"ÜÇý~¾¿PB¥)Á"nï¾óúþˆ“Ç­Z1%³c“f„œÕ+[yž÷JÖK!ÅyÞÏ××å¦&Ý\ÆP¸ù9Æùý|ÿûßûû÷ç~ËÿøœTXcò+6eÑòep?¤‹* D²ùGBÚi¾Ñ"`Y¤¨ÉkM' è.ØûW_~úÿúOëd iF¤*/Á q¾õÃý84Μwòÿ†¥MÛm"l îAþÎ÷OIñ³îÏ–)ŠÍwTì/M„vŠ>«zÒhÀAÒ=ËW#É2üi/oÎá¼ V0%%$%J˾_˜a„ÌB›ÓÇ€E¾d“o۵r%£ÃY%(«õ8õ21Pc…bd÷î7‘&,þDp—Ì<P‡§"1ñ*3Ö’¥6Á^‹»5AB]4™Sò(´9[ÚNøÎfŸÔ%lË…ƒXGÜú‹ÝÁ£NSN´Õ¸ÉÆ«òÂcXrÇ’»_+D>´•ˆ˜8x¤kcØçÎNt"Ì"ÎHRYež¦G^èßù÷fÌÛYÂ|Ú:kòºME»•–âV `5™õØ5Zø™¿ôVì©(íÑ}Å6}”k³%á² § b®‹#œƒœ™ÔlP¢$›^ÝîZÝ[ ëÙ•e—=Ö¡'VýIóÒÚ5k©”Õ'¡šê­¢ÔRdªöébˆ˜IÌ…Õ˜›ÄüiÃOŽ\…J3Œ^ùó7F2YcÔb÷Ïh—ý8§£™ýëýáˆ6Ä!ŒsØ0»z‘Kc™Ox·x¡ 75…«6g¤½)µ¨UÎg•^­ˆÄ­G:—‹Þ©VáG`^aúQ>zŒª0.¹nFg¶h8¥¸ßÏãr¥,a‚Ó“_óø­+¬Uñ>žž™¨Y3Kè_š\ RãœwW#¸„pXú5Ø ”˜»>° tÍîr#ŽÍ ³Ÿ}²%»’k»Í,sÈþ *iâº>ŠQœ"îÐgT·6õ‹7 Bq}TÛïsޤ«ÙÆCÑ1°)1]¨Y¼Tö¶ü"íf½ ~÷NÕt0„H„‚œL—‘‹k½€­ÐÄßÞ j6?÷²ýpmIÕJQÌ@ä¥Hyê3ÛqÎ×vËŽqŸCÖúŽóU1m›A—Ýoצ‘~™²¶¯5ØsÛyè{Žå?8°/`¯Bˆµ»tNä+cÒEºs$"Ë/ù >ÆÂ7 ØÜ½4®“åzÔµnãÝÌûÐÀÀNíaûë­°•7/qpÇõ\os>LñáCÕæ:å6ôÑ[Avìfø 5ˆ×0ßàéæãgïìùÛJ£mã„n\!ž‘K¢$[®7ÐV2L}²Q÷IŒ-Ïœÿí½/³lœ\•ûð µáíÂÏ Zùl@å: rº†æXs¹¨?[€pñ~¤ÉçùÆuY|[ÙÕ“ÐÚýì âckæGY>»@óA:ß ?_ný­ãñ‹\N~P¤GÇŠêuXíaµÝÛùáoóu´°9ž°ÕŠm§nŠâ^ð‘ßý ¹(qödŸ®—»)ŒxÛ<~ ¯µ¾¥9À—úôpÉWýíŸÑÛñåÅôÏ<Ëû×'ýZªõ͵ˆƒƒ€Ï™\׺mð\Ü“ÌÞo–øøà$„̱ýDä~d-‡ÙϘÊÖ;õ0XB ÚÞ²Òaxë˜^&ïB]ë×<ÆXgë%ýÕ^ÐÉY.[&¿Í¼¿ÍSmj'Ó´6XmS­2ð×Ý\J¯#`¶½ÁR&ýhÍÿk ›»ÿèuÅ#6²Ÿ Ÿõ˜†Ú`Šo|á§™ó×}SÕ-5HQ6N%Ôó#$„0bb:C¤áxWÕ5ÌnisVlÎfæ™Ãϼ^«Eæ0«oÄ ÜÓfÊØˆÐqÐìÐÉQ”¢?[{zxCfò½ ºC)¦ê˜AÒ\‘vÍÆ(´ÄFÀÁ—wÇËí~?iaL.QɈ»¹Š1Æ;:h÷H£y^ ³j§í¡ÇqhvW´+x¯ŠÐðýy~÷¸FsÚéY­iœ§íÔS¢4‘L[\öÊ2R‡™K£ÏîÑœ€ì¤¨üTB<á³™Ö<¸ OJ’‹‘‡å줅‚ABM|Š´Ú¦9¢¾F6£´êÀ-%&‘ý¥¼Œ3†¥W»³Hf¥iæ\JÀyÆïY‚ FÂS8NÆy`¼{÷Ž´q ç8¹S} ŠsDò=B¡ãÐá‰þiîpZÓª•Ÿçy© ‡ýpœ.E(¤a¼Uó)"߀¹ÝŽÛdÍK©×çºXmnÂ)ÔV›A³F@…Éae¡^}|5ž­În–­¿eÏ?ò/þƒ¡øoî׌ÊÁ)mœ£ ]x´=Ø»Ï3‹0² AÑ<ŧ„ýŽ?ú'@þÍ?ÿg½ðrmGn ¸!AÜLº…•4<-å“azµ§KžÍ\RvÞ–0-?‰ÀIa4µíàÍy#Fù6Ï3ªX>Zýwgò[AìsQ130gŽÕ19T üÕAÓݱ…/ozJBÁC²$˜[uƒÎ8[ЯV-ÉuÌ EsøKQ^Rëñt/˜fÿÚ_ùQËÇb5ðf¥m*Û^•þ±¶Øªo «ŒhZ-Ê7Úo#ï¤ͨ~…I©Ÿ(·&QÃ'móœ{ÓÚElúÁÚjì¥Ù[cqr´~²Éd{ÇQg.õnLKlþ€õÐŽ3¥TÈþòÚèªòÍ)ÑáÔü¢ô"X¯œpTZOÅ¥w`FôxzJZbzH–)ge´‘˜ÕÂI‘0›ä=Ôa’ìSïÆÀkÔd¨ÈûÖ ŵ‘Çb[u•éaÇPS“£e#+óTL&Ç¢æÃÁ²dÑôVŦɿMe³#›Ü #ºÖm0¸ÇV·n $ 5'Û¼¨ ¤Ãå9ïàñà0=ÄmÖ7„¶ÝÇR-lVíÎ;íÆ®°¤këE¨×s¼¢ŸVÌñÅôªìã9îQ€G@;çck_K–¦56©l/3ø¾Ý«J3­‚Ë©SeÎÞŒ²3—K:»bæû­ô¸Ì¨]LÕCÛ±¾AÃX‹æ§Y7ëòB&Ù›qÚóãz¬=`ºúÁviŸÐƒs}ô9[vQ¢R]O:1éÙþL<¹xq•Þ¯©x®GxÇžW­ÐšGT†x¨"å‡m>8“ëyôhôÞÐÈä'ÉÙÚr‹5\[XŸµ6©šÐ´Á°TÁ²ç‹%½ùWk‹sèƒWsn:´CÂV®IÈ€,¯Ïœù¬~Ý/àŽþšâÙì™û«ÿ±VÇKqÇÒ=òâ‡Ô×­z=} O#}¼™GA~±@À‡š_û¶¼N…KÜl×GàJMöé–›±€f÷S’Öî’Ûc$ße…ñÞðþw“Viý¶æ1›àßq7ƒ¿õíÛbÀÍy=@]gßÊmüÃŒÊ>ëe~‹ÅÔßÐÐä™ôð†È€¿~E¿µÏ»ÙÛ¤–oâ’©ÉÍJ”£ê‚â2*¥w˜rÏ%Ï_ÞKÞ+4Ÿ&,Ýbú;æ]ö¼„ô«ÇuŽQW&Ú~0CåÉ­™Â˜dÑÉ„¯ì?|vmG_Ò÷ñd$a¾P”‰&N†È‚ªÖî)ÁkӚśՉ¬Å*äŒo>êïѤEqyõh°Ùþ”m‹MìúÃv2¾3x% ®^¥/9°Ã)âà8^*¥Ÿc”¨ú1¸EŠÄí-ã‚“Qøòö'OÉ,ëŸóº%¢'…™#?uƒ ¯àEºîdãÜ“EXp£Ö'š×§ú:⬾Yð,³ât€¨þP0Áâ帓³€¿c œ¯¯ÇñBºY="-ùÉD‡¥½ÍÒËdH±0ï/Ù¬r¾d›iÕîY.H°ã ½â¢a$::ïxs2Ë¢6åö5SëbUÿÑ÷(­ÈG„h9 "}–(vð3g!‹:]¸ÓsתºÜ&((½?7£9ÏÁÙ|\º8§…2²¤ôªìN&kõº¾pœ-ŵ@.H|ËŽïYÑÑ ÊóMÕ¸F+‘ mv¿FȺžóW‡·Ål›Ë\†:Ëq;#9Zs¯9¨MÙ¹,ÄFçkVx* yó¸Ý¶st7+“ÕÍõ[y娾Y׃Ï·˜6©ÐZEä5Å&h©I]ÛÝí¹Û,Ö¶‡3·eŸ|CÅÝlÛ÷X6i¯îÐÈëC×LOƒÃÇÙ÷Ó7çdY=¿üÂ’û•º¼>ì§ÿæhB_»@øÈû<FÛú‘llsñOûõVx(Ò—Å}0‡Ì½€_öÁf ¯‡ÍV“µÚäk:híá¬-N[ÙBèØðÑì"ÎÓb†l®,¬P•.6xö"«#mÇÕ;<òCp-">㌊Py­“œªÞ/¥5eßÙî›ÉÞ"*Œ‡°2î娉€Ùã±ç´öaëØ7È‹¦Êtõmä¹¹a³§»}­}0‰€›“"Å8iìFÑÝHÈæÞËHÞ aâÿGÝûþn·mg]ãcÝßgŸ# ÔzÄØ€Õ(¤/l£ÄÄ¡  T+0˜}AüüS4$Ę1´ô¡¥1þÄh"`4±…4Õ(Ví9gïï½æ¸|1ƘsÌußϯ½wO»KÂÙgŸçùþX÷ZsÍyëú\RÐ)Z”wŠœç ¿¦‡H¨”µ™¡D­í›ˆ.;ÅU¼Éé&ÃM|šÞELõSKtÀ «oXöãV¶´ ÐÝ“lã¥#ç^ÊQZž¨˜ÁÁcn&÷z|n¡Æ¼¾ÞµùYÅàâ0;ǸÙa¢P˜óŒZÛARL ¹JíˆnF€9#©:é® Q|¢/¿¢cÄé»N9Ë[ H87A¸¤$È ìþQî=ÔC+…¨@5º(dÀïwÜ ÃàŪ^Ó," ;€—›ª©“JKU&È*µ|8Íê`é•Ó˜¶ÀÊ*¤¦h¡fFé`$v3RˆÛM£o:÷ûŠDQ+ÕøüÜ›™Ù}œ Üì €U;l C´Œú™™Å°¦¦J³¶ŽˆäŠÃGðU`Û7ÌÍn~ΰ„™UAUHŒá?ÿ³?ó[þáïk®GfÓ5Kœ.‹X)=Ž4CÌP¬šúO‚. ˆˆ@ˆüar÷à rUáYƒŸû»¿ïW~òg£šã5}¹JcÐÏq?îg¹¤0Õçéz`hø)Uvš#Pðˆç@쇿þo?ýãñŠRˆ˜¦Â«êiž‹Aôªöc6‡sDÚÞÍ›b*cº­tKªÉr=å2 ­atÕ" A£¤…©êa¡!÷1Ü_Ëú8„§·ÖÖ™¶YÊ~®8î®ÀHñÀgvfšå× &ç_Ð%4‹Y4Mb9)ŠŽŸd´•]’cc õyôNv¨¯³wà¸gȬ\ÊBNy…`\¼¸~K9Æ)cÜÔÚÌ/ÀZr0ˆJtÊàöm鶉ÌÈAâŸý½?œ&¤$*.ÇmöAÌ#²»o=–?Ïd¥S-ùËÿÍOKš'r„`ˆp±`)ÕŽžYÒN`1 š¹, S¸“AÍÉöÜż f=PËfúªÛ¿mUv;»Ìúת Ÿÿ«K¾ò¢Z#g‹šÊÝ%šÎº,Äœ šY6Œºð^ÍСè—ýn¸ªÕÀtÇfG½B8HëØ•âÅ‘do!‘rð³Y»Y5¦ørºŒpµûTÿë’ä 6¶CȱsšÜgÿi `Ö'»ky)ømš,M±:Œ²€3PкØW‘]oÛ2ü«æUV5Vä/’ŽÄ¼@”ÀÎ}@§[³¸ÐÓ0gè*8å!$ÑÒƒIø¼VWõ¥åb ¼ä´7yÍVßš±F*.' ¨³Ê.E!PŒ°fùpçƒ>(e»{ï+Ï1ÿê5ÂÉÎ >vU|«9m’0g£Œ¨GòÆ`zàbt_ï.t!Éî8®wsZ÷]þ±±žÑ@1rE0æ*UF¨H¿’(ÖüƒÄö{µë„'Ŧ[¸Þ0èk4ž»Õ×LbK×4UœlCO¶Nogh¿jWn¨›&Þ±÷hõ€¯/ qÌ4Åʲ¯rè w­>h®NÖÝtÇÕr]‹¿ÌätwÏTObwdÚcÓl&^!å"ñ„ Ž¥n/  &)nîþW> Ï\óåßóà ·ŒB›_¦,¬”99îïkç56'çDèæz¶1oñǯ+¢›Vr‘°¾ ÷QPM±Í(vØŒÚd ›¯LÅåÙæMƒê –5v~›ù±ÇydU‰pÊV¼ë›rЬÛܯÄ6›j·À”hMËK+¯Û'î_J!—:ÜšwÎÜE|[·]öº,ÓÄÃ{êª#ß!B>¨‹Ü/âe!¸tÀˆù]Îü}öÝgÞô•J±%Àäê$bOdª]\£§~"“çŒÿnjèȬ=Ĥø°k…^C?¸½í£­ø¼v^¿ûâóYžƒoѨß"ð?FzÞ=¶üpUûmw.ßùh|íïcC_æ¿J3€5ýJŒ®¿ÀGŒqvs€´‚š ¹U¯ïç›OŽ3b;õ¬ûä—Írí’#øzDÐ.çÌuÆÕCyd†±çOÛ©ÜäÇ«·€ú剘ãf[ª3Žšjù¿ÆnúÖš…§žff¯sK’vâ¼s¼6ÄËs¤[f"„<Ó3°6›KÚ߯Y3µä»üz!T¶p_¹ôº@s™âöiŸ|ê3»Ô—7ˆ«© ªADᇊªéUËvDÒe°^D‘IÛ(õEíî«AáøäPÇ4÷*kÓ•½Çî7U‡‚ÐQƒpæEœ—ÚÃM+jPN`q”àÖ&œÈIT0 ¢ìL=uÂ)Ì0fPˆzpÉÏ |ÞSlp~ã[Ÿ&è ^„¦öævV²ZôÈøô„RqÀÔå@?9nÇa¦¯¯ƒ>$h$à€G?gdjúòr|"o>=?nñ…ó(6¦…Ìp²A1÷»ñc©y. F•k½§ÊVG4M2ŒËíåê¼¼Ÿê¥qìÂÔÛÄ…6ìä–sx¤4‚ÝQ;(§Ì½¥xP¸}°‡¡µ@ÊIµÎwNR| w7P¡û9⣀³VT¦j+4•ßþÃÿDþúOýgp1¡ÞQœÃuxùB#Z˜™`ƒVJS§Î1­{üEeˆÐ BšÁÓ*œl$5‹Úº¬Óæ2]›Õ)"ìÊ"èÓÇkÂLÒÎ ô€M½¢©ÿËÉYŒ5'‹nÕÐû¨ä5sU®Îas/e•-”ËSfÑ d+ˆ?ß6âlƒîÇ!ˆ¨Ò…øÊªEWžâË„ûÂôŽsŒqÃò¬5%®&} c—žìÓì Cx‚üçþÅ•"GÓ.Åd&Á¥åQ ¹Ö'ìh~Muñ¿ò_ÿùÞK™’žæÝ¥ýÝŸÿ'I¹"I×tÓÖ~@ Ìåf¹¢'·îcIŒÝO<ÏÚbœîö°—*Ö@Bá&`m~æÆ,Wݺ gQ%R_â2ë'Ò°;L[|¶r:‹‰ŒÜŒ‰—ÔX@~̬€G3b7€ w‹˜^ÝñÌ2jö®9N•~1ƧsµˆTô!B&Ç@Å' ¢Ôóˆ½h¤}l™/Wó%»`˜5½õ½}Õ"±é »ÿ)¢ÌnÏÚÜ–;K`fYEMRÓfƒ ÉóK³^nËû‘³ïÍKh"ƒ€ÈMÖc#·ùk¼M‚“¨`ä‚¶vŒ:˾ÊlŒéE‰6÷ýKÎõ‡ƒpSHÊœ ò‡è†@Ùþ‹,Š^Ô+íMÕ÷³îàõN¸¸ Õž©ž”6›‡îýoõ¬ÊšÉl߸‹ IJZ¾ 8\'@­\§ÕW~øOrÅŠóY›3Z¿òFÙ’÷¡Æùªú0•ìñ޽ æ2wxç£ÂUÒ²O;òIvüÎV`¼¦wm$°‰«xf>"_>-eχҋL{0¶Ý¸o¿ü|rK>÷Šo;šÏ«?™Éïʼõ}ç­ûá…·þjjµÿ5ñK]äÝ5_•ŸÜ•ï×þW4³úîÒ—3=zÃé¦ÉOË€·sdûUÖ_š;—jÚó~÷$¡¬:«¡0ú¸NÁ©àhøÄÉà ÏOÍ£6fÅ®Õ`É&IµrÛ{Ú1Ké*2:·kµJ­Õçê]ªm‹ÎNN™ÇC˜Ò×dbF E(<ÇC¤c²–FS`˜5]]ýï5æÏæz…é×Ä>ß é­ç8„JQÀÂKŠA…V’f$V-£ŠÀ¯‹Pœ¦pñ@®@Í,éå ˆPIÓ6J¼0Iˆ}]M/3é”sœ§é"T9´g"£“N‹®Tˆ@aFý—.X86Í<,4Sp¢„.Ž“Õ|â»"¬ÃdØánª?äX…þ鸿_¬6©(Äîé褈S;ãåå•ãäùzú'&jð'T-Ϧ™ú‡ÁôæÊ1îƒ}[}iôx·»Œ›ÞDdœ„…EÔÝ_Ç7ïÃ]¨šxI9˜pÊÓO3ó(nó@=Xhfe¡uWU]–IÎb¢0ÎçyÀ§»,Æv"Dü`HsHâLÌèNÚ¡ÎBÁ¸¹ÕWîÀ.2¢fFç=‚âââîãþ*"š*åq¼j/7ÑÈÚGî_«:ÜÝ…T33ñ¦Mž|1‡QQÇ8‡È“x?ƒÞ à—þÿü_ÿ:15[*(0†&[j¦%)“M>7‚YòZçtŸùIB.rhÀ¢JJi= žq Àéý&!ÿéÿ$ã> ävˆÈý~š*ÔÜ…ä>Îûaj–‘¨­zQúì7/¿®“òÛèˆðý©?%tÑ›ª‘ŸÅ£~V\·ií ºpè‰r8å³×©t›ÂrÞQ¨”ÔvÊesh¨l5{ˆ÷H‚‘8ø%“SÜý$D¤®ZÔáÙµ» óJ˜.ä —ò]âž3Êö«¨z;_côsªžt"ç¬IòYŽZ6ĘÞlºz7à\÷Kõ­´í§rÁ‰ý.½ƒ$yÊPqå!©8E,ïæp»ñ¼'’'Ó²X,žkâG·¥ùB(rŠüÓÿüï ¢³ÌÚÃËáì }`‰PT]l:ÿÇÿêÏ]踻á6{’ë£cãKÐݧy´25ñqÆ£ëZ•Ú1]ë¬êñóá9^šŽLCÕ“ Ò!ôXŸÓ²üO­‰óx˜ËY‘Í^è¹SjÓ¨‰§Žy/]zE-v¦«° $&V¨ý,iù ×žfž'¨N\Èn6w•¡Ó‡£8y}¾Ž^Îîu!è¦ÊØ–ÊAˆ"E=s—O¬Šª©br“’¢ÿl"#V>—™LU¨cŠÙ𦯓úòGulÙ˜ƒ#¯ŠKujþ.Pñ(ÀmNäQÃLQÔÄèÄ2·È*ÜÍ Tàûi}OË_N›÷v¸˜¼$ÁhâÝ•G€Iÿß<ü)ùÔWŸmÆâB= ·Õ‘ñ]¡Û †ëܰÚó<£±ÞTbL ;4#ÇÃR±ž² !ÁüQF@+¾œ ®àÏ­lȬ˜{s•1üÈÉeú†#GÛTdægbP~Úµs«F?äÒ8^ëè°Ÿi;ø)ÃK™k&êùI§YÀ逯#B—ÎbërnÞþ+â䩪°ñ2¾d}<бé@­$º[ª§Q]õÊ;½üw\RË~Ž•8PÎØÃ¶²½E[¢»!/¸WÎv¡»¹zG^Ì-J×™#Ÿo¿ôL_ò9Ó©7gûïô~·ñ³TÃ;³ˆ\ ÕËÔÛ’é˜îÓ'þ¯7À²9gDºšLÌ™ÕUE*òWׯeo‘è‚~ÚØBlmâEéfú-Ó¸ÃT®Gßu¨ ‹ØÒ¥ý.Í*ÿe5ïh¥7Г¹UqOÇO=ÑQKƒXâU¸*3d5îÊe#¶(d ÀN¹pÖ°‰àØuÁ.VÏdqU0el¶»u³O"U«Ef6§&›¡+|ÞÀ‡ˆÜÿ,.Cey }¼Õzgý¯àʦßTÝVîAðN¯ö*éü°º× «‡Û_m¶vp­ä@ϼ´Ðøl‘š@ÈfY)%® q£¬sœ¶qÚù[2Gˆd¢lnÿµêµ£ |JZâg/z!ÉÇÜ¿ 57–Ö—9Û0EX#Ì÷Ìšø¹~’/ ²ÿj´ óC°¯@_hñ\‹Ã¬ñÀ6ûmÀ€¦53Í)kúÎßÓZVWgðK‹óAlâ¨bÕ*©¢ÂúÖ€pH1ÈCô+["éÐ#GR*R(ñá• »•hŽ®uzš¢®ž‰ÿIq¿U ¤þáYY¸¼y;)·pJ:fY”fk㺘·ž¨Up?úš„çÉA\hlïõÞ\ï.›ÔÚ$í³OyF÷aÄê^)̽ç èåžJvˆY4iÀ L‹Àn°÷$‹_ŸÍfhXǤU„X<_4€ºŠÊ¸s \²12%‡8à ¯·‚áÉòg$`}+gv`¦~›éE ÑÃaÜ¥ªPÁAÜáCôˆÖOŸÚ‡JúÊ(³ ‘!ͧƒ j î;àHÕ,ô ¿SÄÌ RÂ]‰§‡\ýÄn߸ßÿßû7wÅPºí!îFÐÔñ¹ÏŒç”QDì‘ržg(œ¹ÿtž¼ã<í°ècñ¦Ã%;`ïÃaÇM˜̬Ó(k×܇P§­L¼>S5Ôn²¨kÒUø@¸­´ŠÁ‚ÇrЍá†è껇KÝŒ‚Šh¾#eDS©¹<àMŽM¼ú†ˆkÑfb9 §ä"cðEà Vf¾>#o5b•~Qf$“Xð¸îÁV@_V¦¤ƒìQo¥©áŠwñÓõ8îiª Ø—ª9uœCnz5Ø;¼œÛ´Øs‘úÀßùCÿrÈþ‘`bƒyõR.§¡¯^HÆê d™Ÿ– §Èáîô…­`tƳ¢cYèKý 9K…Î(÷Qð$õ8NÈ!P[àWè>â©q'Ô…Gzð£YºŠƒ§VÂél“ V%ØÎÁœ’Qf9ŒIÙòŒ'ŠÈ€‹X+ä„­·l-û¹¾lÛn1!;ó\íemf³ Ïæ¡PÄ1»6¨¹2MSþÉ'ŠIHä lß˧øÆ©y–†éM<Ž~«X^ÎUÕ/Mwô8™›;#F ¢¹K>Ì9›‚V=0jŸêU4S.ùYÌ+8›  ‘{qYê~æ·ñ„õÈŒwÒyÎqÕÿ¡*Yë²#Æé"îgþÎvTÎ!“Æz%Zt:ˆb:Xi´ª,DJ2£|y“¿'a>£Ißâm‚UرÛzPgn!‰–f–fkoJfôÒ†ñ_)b’¤)FÚðZh°D$ÊÓMŸadÐ%Æù3ðBw™_œ{Ã,¤ßEÛwíüŸ®%m¥(ÛÏ3E[¬‚ä,*˜.ûe.Á,5is)Ny |¯ÆÛY =‰J§Ù(/i·YStÇ 1ÏÜñBÿW‘w’š8sã}¤Ó+M³=S¡[ûü¤u,Y»¾½L ÔÕX¿T­œf]z¿\ÛÏÆÄzðy- fo¸x‡Ñ-ϹT·X߹䡗søÕoÆç 5hŠÚ¤£^‡­(¡¨EQúY î€3ßÎ5 ÐµÈNÌ0WÌ®xGœÇ1\§­X-ŽqC¥›øÌe^ۅÀÞF6b6ίB`®e-·Z‚<3,âÇŠ^x§¢ÊùPÈV?óóÛ”yô¥ò-²áƒ¹rÍ ±ç,ºÀûT×n¹(>̨žK»—¥—m¦Ê–Jé]h‘€¥Ë/øÜL’†ôþØvÆÎ¼sºñŸÏzÃß}ý5W»5Eù–Ô€|JyŸ×ïUW×F {ÚåCÚwÝí_¾úÿùôâ†}¾ƒ_ð¯áË› <ÿi¾2 ù\  Ë @®3€K[K¹õ©Úæ¡ìŸÐ#Åèhš‰\Ðv,ɾ4K×ô5¬V¯ê:¶"ÃÙ¹J8 OB.굞ʙn“F÷€ôRÎb­.eu LÑv£¶9[HÔCçWÛ:ßú-3³éëHEôÁJW÷¹ c³é5Íkq™Û6)áò¯/ãÓë|±ú‡¿ì#fû4d¡-Ä4dƒW‡«־ų’ç°€/Ç¥áFq¡5·Ë”¤ÝT8Èû`ÝRf2aÕChîwŠ8Oø‹:ËŽ]ñúÈæÞ^ÙöÄ’ä= §BîwXkæ [õx o`”H'ÜÀÉsøíÐоæÎ`õ?è.qмõ%¡Â<#8E÷P!U@N¨§Ÿô;]ÇàEÍíͧþú­ûýf¦ª€†Þ0ϲ ÕéA&ÖŒsÏ$Ø›\Z5s¥ÛtÝÓõÔÐ#x1”ÕÞ­p¦:è.®¢>«ˆ×K8Žê+§ƒ¶gœGhw_õWî‘Pº#™Kñjèx9nçp¸ 08\8‘Ÿ"5ÂùmLà¢ó—›å$ ã<åõ>Îûiv˜ƒúî÷ó³cŒó~Šˆ¾€Ò‡ìÈ;ÏÐ×PØ&Ua¯Ê Jªú1hØpaðH…@hþ IDATˆ =0âªê. ³öÀ)ˆ©¦æFXQ<‡brL!нk÷p<Æn§ˆŒ¼rB[\íŒøçfž|N¡†áòƒÿÈoøÛ?ÿócŒó<_^^Üý<5uÁýïÇÜé‰eGu*ÙbàˆXBZªe®ÃñjKé§HðT§ç(±Sà8©˜‡ÈHçxž÷¸ T‡F¯ï™§ûƒÑw@¸P÷¨öZëf~ž% ™ˆ×Ùw”äž#táé™…Ú¸ÔúpPÙ ½D«¼W[U5â~ž¢"f¯!Hå+±™²/ ×|œcÎ0f¶qÜn±J6Å7:# ˜\ŸzÛèÈLOµ•ºvŠÌÖêQýIzÍGä(’Üê»smØ1'iº¹R„W«=§ :²9õë«L8øzŵÈv©BÞÁ=Á;í¸N 6Åe…3›þ|† x–Ox"ìqkÁ;äÜGò·FéëPbÿÿç6s«…m S®T§´Ñd:U¢“X‰Y ŒÝ×.{ÍÕ®.9´SÛGÈ{. üüê3Þÿ?ðó| ¾[…ÞÆúÕwÆÿzæà<^|áOs_1ž®#Ÿ«øÉ¦|%q¨/}ìEÙäÙ¶fûæj_ªư͡Ñúƒ¡)b"ó\WNyê\`PTIJ$å„Ûë/ µè“kW*d– OS,;<@= STá­õ-´VKÄ[ï<jÜòÉÚ”~,Öç:wÇÏ0rذ¿?çf2‰÷%m›lM&|[÷bóç¨yï@D5$îKÓ7ßSžŒ^ÜÇðã6é ˜ÃnWX[2Êóp¶…×r ÃYun¢aeÜAçÇ¡&–¦Ý°††iSHO6 ±îË9„BNL|ã:ÃÜ =)c”ïÕ3½YVˆ²h¦â„ß 923X½!8'¡ƒ>|îæÍlGtÖª¿ø×>•sä[V ß©opÇIœýUËX“Ü‘Žq„‚²ãÏ6®F€2"£a*~2™Ô­*<¶.f9瀘X¶Ì¶l`>Ó>ÂTrž÷ Fäé3ºªª•ÅF ûxjjÞNŠi· NÏ<1#B¦ùÜ©Ý=Ç !4=.áwó0#ñÀ…‰E܈€Üùí0S1øÍì0!8ÄÝOÀ›7·¿ç;¿ÓÝ¿ñé·hR8°Ú-9p@ø9î".¤s@ v¼˜˜Ye\†“Âs ó—~îo|÷÷þV5åˆÆó‹&ïsJÿÛ{nR¼IEV5þ"šº‚0:h‹þ¢—»@š¨µêZâÇŠßýõ¯óþýÍŸãìîm!¡JŽ1³.XÀuW?!êHâ£îE#]UéaÈÔ°EÓ! T~Ç¿ð£u|Õÿå/ü8‘ª^õ…¨6O­J%B’Ž^mϳÍ]V‰k‰\„Q¿§ÖPBG^Ý8ë˜Å¾N‰I‰ŠgÒ‹Ø4«¿åë"ó;T9 G#‰Ö‰<·ÐP9O–W³È'ò©3ëd|lÓR¦X\ ËÅËŸu¬¢¼&¦¶Ȝì¿\Î3$uZ¢šÄ‚›0ãyÖ÷„˜ºÈË ¸E—8äwþ¾?$î­†“b·tÆ7À/rž¯BŠ‘äûgÿ“êÈЖfPö•|ú¢µ ¾$ˆEùõi Tôx{®’†AWÊ}Ì ¿ °±T¹Lÿgj ´%€‘tϱkÚê˜y‡dk~UOÉ\D5ù«)`=¶:Ê|€B}H±v"ðè€IL.23«.¶º{ã•ë³*”ûPN Æš2Q('ùª¬õõþà[åû´Ú ºâ-nz| z}a}°ð˲•¿gRðq î—aÆÿ"âóä|þŸ™àçû_2>“ì?òb)N¦‘O4H‰þÙ´V jåé=6œh +~)Ö =mþ—‡Ô;¢]³á Z3¹=ç‡Jk,˜oä詌õG3ø—„ŸÚœùÙú™ –ˆxv½r¤œÅÃͦ™6ÖÔžÞ\õ×wæ[b~úQŠ}ò[–$ÈrÌ ÂÞð+¹çXåéܦÕC fZ»ßî.Ïß“_$0aå«Ð(ÐÉ«¶Ù[™hB€AçH y)¹Çq´.«^' æ K0)tzÔu'Nÿ±‹T(ÃëîN³ðÚd°¿ž§A÷¹VQUóq ¢zÂ¥BBšYÈãyø¯Â99tŒ0.çÇ“ñРݳ #¹ùó7‡ŸÎ!\Ttê4ÚÆ!\Ý=~)ƒÑnÆ3þŠªAí;€oÝ?sb·˜€•‰~Rˆx°@|!N‰˜Q”Ñ`—¨Ajl·XL£ïÝOp  bZƒX>“¸îQú›  ÌÄk˜ƒÞÁà®0[#½ 1 þR„y1È¢¢H{6.¦Âe&¦¡.Ñ•ª„È+Ccʆ,m<¨‡Ý†UýÖ·ÆýõnjC“Å1¼vVÈÖ’jJñhªŠB¡z˜Í§vŒAŸå§# ýX½Ò£†3UÖu)ënκ%ˆtýµ¬) GwBîÿJh<Žp©®CKF> 'j’ ûûÿ¡ß""¿ô Û a†Ê×>ùDU݇ª™iš Õ—­Å ŠZ,–\-î…b% « ¡Âšâ÷ÿ®-o&ÿê_øÓ±&ºN;V+°Z7sæžÒ¥7à—PUË w¶T ÆÕ¤¹UON.{ÍFxC ´áL¡°XG˜jFjU~ä¨Éºë“N=šº&Q²BŽêl›BÉq§‰pAô®“Nò¶¼’yvõ„¥3t ôâDÇS¾µÌUµé:¹ÄÛÔhÐÍáÆˆ2…;@ îÝOSúk„@9¥ü“?òo¤˜`Ö ˜á½Ñ7(@.ÀOþ‰ÿàååÐÛí°ÀÕŠB§3}CÂojЂc9â–ôËÉ;àJ€pñ ÁGT1Q:)fÓ8YµyBÙ¤¦W<¯NCžWÔgöÊÊ»`B=àÆiªx@v?ä 9»e–Üd«T“ÄW¿  ‰9ûËÄb*gNwqWº[†¦ê9(qwµM&97M²êsó©scã¢Zd¼ÐlÄKÈrà`äKf꺒y#Ö_O¸FµóXXˆm³¾’a¯kNÛ,HSü)7 à“¹FFša)”\(¡dr]ÄWéïŸÙÏÑäE ÀÞB¡X|+ÍÌ’¯(Q;‚kÂVŠd LžY°‘ÖÙ4'pE¬À&«Èbª‘·¸1vVñ¥q§¼$©£‘Q;h[ÂOÞäC 8äCˆ9¯ºhNm¿;7–ó퇭cˆŠ{@ªtÜŽØ‹m6<ž>|©•;0 ë5Õ½â‹âŠ?ØòÏñI[1±×>ÜE£g Öªñeƒ¡Ó¸žö©·¶ãy³=U=Í6žÜ…z˜<0Bx5ˆ=µ_NÑ;€‰CšÐXB}°ŠŽÜéÿ0ÇT¸`2z2b§±ÜV©·:¼¹ÂïRÆ>HH+ÆVóŸÎ…o+n¾jª3K–çm¥ yÁ¬Nñ…Wz ·³ý¹»@ïšÅÕ_¼;ÌVãÞzyå}Ú¼_ÌyïlÙnd®É*¢Lu[×ÃUC˜–®o€ù ?ÙðI³T[ßH­reòšÔßMñhÝÑkè³5ôß[¤¸ÎÓ ô˜OZ¯üúchÛ1í¡•Ö™-˜&ŸÍÙ[hÕªk@ötpQ±Âi?éž=ôðä>•™ïN¥×Û­ [¡âº4ÜñëëܰU¨6—8û˼ÃÈ2q©ižµ‰’4ÀÔ壸ÈÜ—5†Ïõ?ìvð·©øoU—åíJ=.âÙC¦b¬‡w*Œ|›8¼%§°Ö£Êåž ÿ‹û퇹ŠÿsP?¬†-îÃm^Ó–ÃöÀÕÝ'x¨YÎ sÛúê3Ó#.‰ïjR¾Ò_'Éïåñ8t~‡øÌGŸ8ÞúçøVwÿŇ‹/g¬ð«>)øuª‘¿#ßÃú*Ssý $øØüÁµÛS5A;û Àó`Ò#»\]3 O–2“Ì¡ Ú€9Û”’ä“möºÞ ŸP†I¿˜éÍh†ûœDS¬»„ØE_MA‰â:LPB(k£†é¾…N3u =Ù9툢AŽP!¯mêþPN/¬ teQÄ´R£5J'6õ¿©D³G¶ƒ‚ÈòÿiÕªMVŸ<Ÿƒ÷´è“ÏýérûųÕ>b»x⌮£!´:?##åœfCí¤Bªã4ÔB³Ž«´ •ìwOÅ)*ô$[‹š¥ðì:ä„ñ ¾Å‘“-¯òGótl%‡®jÉŸ€ªæ$ÚÒ><¬y°‹—'&ýUEÇð“ ñ£€ ‰å@è·%D¡ç7ê5ÖJ¡íèw WüæFÄŸN DTÍnÃÒ ØQˆá8b¤Áû7î㼋;lb]X&k†#ʰÜÊ(+’ûòž«zRD¡oìÂ3ð0àˆ)œYRùƒ>°¸\éØ]ãä]Ͻp™CÚ3ãïÚ¤TÌ2ÀH=ÌÜrèûÿ|@OqU9TH¸ËaÇË‹¥øíÎê92M”J\d?ïq©ÃP«qyj/P›9N=OWð>ü´QnhˆˆOh¼£—2\ÎsˆP¡Åp¨E˜áçIFý¬©™šˆüÒÏýìwýƒßKË1I µXhB ØF€zxvS«¹ç«Î ÖÙœíFÔKKö—¦!,üóáÖt¸­@{,`þ›¾çïû;¿ð ñk;å8 "ÃÇôaª ™+K=r9îCrK¨GJy+ÂOV‰ñ:—Ãð™üþþ±šúÿüÓ?A§Ew…—•º 9K³ªD”É–$ú£)G±0çˆXg±|(»ŠË/‰ª€NÜUkªp#ÿSú¯áÎQÿUDEè‰(YTdp¢ò ÖS¯ Îù»g‹ñ ¼:‡{<ÊbòŒ˜ÖKUŸ³¦áOì Õ1‹úÜJ GúÚ§HÒâÀ"‡ðu®å:¬.#ÃÊ?ð#x{ÂW~ØË²±£¹ \ôøÉ?þï£R:‚8]Á1ªLÊ‹{íY´rƒ±W(–¸øªçÃÌtai©"“ÿ–CèŠÌ¸S(AÖ&Ä,ýжNiµÄð@øÍ’€æ)ÕUÛ°{£'Ä[‘ÀùÈ]æ*ɉ©Ž§fbå‚»Å-¥¥8$5ˆsv›qGÐ1\ó@!ƒ¹û«”¦r9íV@@¶áðü9ôY¢|¡ÆâÁˆ”¬ú¼2úí͵.Mo!V2WTMŸœå‹%¸OiùÉ3Í´<wq…#»FoÒšÖT_&:Õ]ó3.òZB4ãÂ+V)PÿŒxï`Èq?=—î’9üJ2È)¹ç3/ÍPP÷0NΘ›òÑ|™¬÷É"þ\p…uy(Ñüù²—}_¸›»BaK’Ùô?âfw^U<±KâÑ»ñåŸÊà«g{ ëUíÜI0]4Á¦½Uñ%m@úâì>øPk4Ÿ½©ÞöW o#­¤>ÌÑþ69ï(®ýõ›øJ:í?&òkšØÿ¹ÅÞˆt÷Wê\•eتf­KŸT†2Š{ øSY·J ˜e:w¡­o`9 ‘ƒ@Ø]¨‰Œ ±~xø­]ë¶í‰Ö¯:„[ Bz JˆaÔÈý„‹€°[£ãUV{˜”a¹Ý:÷Ú}’ÐjT"ÞG¢p§æ] c–‚25wàq³™e ûø'ç4Ëm³Aþ·M߸û¢€øT£i uMºcÛOˆæq«ÛÕ¨5ΪÁ€¹Ó›ï§üA*AÕ× ®@D…£Ô7â +OŸx^ȪvŒ!·ÚðÅå¿X—>5Á@©Z5‘8’}OUw*é'ÕDpŽó°cÍ="*¬OqçaI€qŠó”Oïw ^Ô¶ ¸pxÊäkQ!ž%ui¾9¨Â B¯|>yrÈëùbšA—á'@÷#AjªâxX÷èž™c_-‰ɱöøg‘Q•ßB¡.ŠFPM|¨èÉ1N#»¡4Ïf‡eÀˆš¹ ÊÚ¥RLªÀaªå)ÃÇ|ăß&Ëè×Z‹ÒD€äD Yê~͇ž§Cq˜¾9^îçéî4ψÅœ4¦WwŽa¦ °t¨*³P5ÕÁ1NWÓàNä¡ûô¨ªŽºÓ1†'::Œ]c wWµ²tÔ¦[aPºwîÞ¸Á#ãÓ«^ àÚ&¥öˆxª¬tOÕL7ÓÌÙzÐô­ åÌ/ Ñø•´@=14ó´2{tO1Þ¨Cüî¯Ï ÿÎÏÿÜÔCÏÁûëg"òr¸–z’¡¨¹?ðpcQ›œ'Á^e8BDWý.jĬ‹B‘þÇ?ñC?†¼òþ×~ê'‚¹¡Er)f[£¢£ º¨&’è p"Ò⚨ vþu¡ÏZ8ö8‚›u:Wèn"yg6'øþQ#=º›"~F[7C÷‡˜ÈÝå°„¥&–`þ¤u›¼Pý,–ŠÈ"àžò²H*Έ„ÄŽÓD/¯ÜwŠÅ‡ö ®@øŠ„›Å²¯¥½ ‹„y4KÕŸˆÿà¿òom–ôÐdL¬û5ŽLîˆù_üñÏ Çí€bŒ¡3‹)ãC«´¶Ÿ=Ï\ó\ÈÍ>ÿÔ@ö‘¢M:Ÿ e¸Ä°s=€§çØ6é]-~²Ï;Þ'GÙ=¯X‰œJëe³n+M*ÁL¹tØÎ6YíjóÿH>Æœ3ôQäZËšƒ5í§Øþ0µèõáÉÂ;5Fù¬±Ÿs½JU¹µ¸(xÔ¾0oòãR©!õŒÀpuà’í'’j-¦tÔéöQÕ@ª_ÈåAp–Np¹_ v$¶ðÉsS¯n\¤YìNÉæ.”v²_ÎE¶ f/ñE¨N¶_Í“_æªå«^À´ì'Ó–¼4‚ò]¨“•‡`F 6ç g]0ó¨TúÅ5Xc‰Š´ùm×¶Î|¸Ú­»µ¹¶ê¹]¨ZSö£‚ì‘Å$[µw[—åªâ%WôtݺÈáïs<~€|}µ÷tË;¥˜§4ý³h™} )Ë]ÓAyÛ³S”å6£cV`OÝ|^iëõÉçØžÔŸÞ+á¿õtè?^(?n»È%lÁ}ÂÿäWá·ALÿà»øK'|['ï½LOnM~•@ÒŽoïÜÑ=Üu;¨qçW«7ÉÜÇ…_;\y|óÜôR›º¾Bž~ÂÝ$-pU<ës±Üôëp™©±úН@°cêEÎjËz)fûpNÓF!yTáÑ<½*ÀÀ•ë‘â©ÖÍ^Âë­á¾þJÅú&»gýDέ‡}ne1Õd±ÓøÐ´TeBÒƒœ¾:ùVÃË#+­rr‰©é;Ÿ#°Â­Yù0­Œ3­X§¯·}2’ÐbÎáGawM8Åt•U×I$MÐà(x'eø=c&ôsŒý§AZàí²Fštèq„»PÍdUŠiÞ'VîÅÐe´œc¡ÉÍHˆÂ`ß¡ŒLÒ‡ÓÅÇàë8ï~ÿÚí“—ãpºZnºàÜûú‰ùÖv!Ä•ôá:ÝüïîÞ…Fƒˆ ÏqŠˆ¯ê]Çq—»ód=ˆnN·eŒé !+…#¸tBf\©âä0ÜÇ|$ Ñÿ;L¡ŠsPH›­Õï¹¹O6i—¹>íúÝœ?"Ä¿•ߌAͯIŸ…¡†{#Œ°j‚MMUMÕïÃ+ö»"—l&ÃI÷˜lòƒåuãôáŽC-`ÀÐlBŽq?罹Ét™xôáF[†ª*†³QãÇð¦-Îá®s·v{V)('Ç·&ñ!zÞÄœ™¨¼Ó˜&ívÒ-‰­åÕkN o¤«¶j':& ž~1ñà+ƒ2ð›ÿ¯;ùÿü­_$åv¹™ QU?zä­ IDATç¶ Ís]%Q7â²FIš£—2(Ùè1KäaåÑ%IÄínØïÿÝ?&JµüÕ?÷§@q±!#hWjðá¯A4„~ ËɈšd$~V§ ¢³wí(LÈoaÒÄfÌ¥¹ÒˆÕ¾g»Ÿ "C†– çžæØÜÝZ´‡Ô@Ê+*™ 5*JÌ¢*ž¯9W´f‰Of;fªo©½xÌ`/RŽBœÓ‘¤Â˜Ó‘@Nitš×m à†Žqú8Ý‘ü$…Êø¬#£‡ˆˆŸÙnÚO²qþË?ñGé÷Ó`Ça·ÛmÐïŸ~¦GtvÓ]î§C¡ƒ#ÕÌT½Ýn³÷høÏU®DŒ¥¢F~&^B&„KUu.¨é^a lº]L|t-|—íw''º†ÍÄ*®³tÎYevjÇvF*³Ñ¤®üý¢«—Í‚¼!d"/iýzí–9eĈ ˜î3š€æTÃóÌð’Peýsêz™¬œ­”©2I럻(2ñ÷¼³P¿ S£MÆ,VM< îŒê^‹¤W,BiJ(^9b}*›"猅O£)Ã1ŽjËj'(Ä…c¦³j·¼ÀíâmðSÒD!J93UTƒy9ExÊM^'VjNÚ»ØÉ¶yˆeؤ(Í‚E]€E¼´Õb 3`nÈ::7µéê6ïTôM‹Æ[F>Ø¢\ݰk´,3A˜%2Ë[õÏhÐÑÊpÎTÄÌ7llŸVa•°í³›åʬ¶òe™+í×váÅî¾ú‹So‡˜õšî7÷í5o«…å4‡Ôû–ý»\w4öÞÎo_ºµÍot¹ô”ˆ³êö§n{ŠÑ.Dýô¹÷d—sÚLÞ'>ñ:<ãú[uE‘+.¾6ýh“^T¸Mf%F]Ö2^ ô‹8%‹vŒU1U/8ˆ"1 Á|è= (ÏÙÕyݽî¾c«‹è!) ˆ=Ó|qu¿W‹}¯þø®Â;¾C›J£R¥LBR-ÌÝwd‡µ<™ÉîA$l7üÇü’tŸGþ»C,_Àüüž{ˇ|]>»õžö7ËC5µ<"‡>¦‹øáeøe’9¾ŒKû0ÂújÍÞ=è¼–íÓø éÿ뵃Ö;ÿáq½B÷«… ¯B5Ò³ð,— O0D:ß™e6b«D½ýsé‚#߃ Äèa¹F¯&°òiŽˆªÕ.† 8N5ì»âÙaR€²ÍÎT`"ƒnÐÊÑé20¬·S÷a±–!’›¹³AjŒ›då¶(\uÊs˜ðX uá™åX"5}íUô©¨°ÍÐ×L¥ßÜõwŸ¾H€e¨­™ ”«¬J5:‘XÖ7è}0U8„âãt¨¨ ÂçfwÖJå4È‹6„…ÈZV_lÙ,Í‚Gw‚ΜîcÜ ~z@ z¢o1y>ŠŠ ÒûÎå*Ìèê&pª¨Ó£K—AŠ{À(ŽC9 >E]îe6…À …ÛƒFÒÜVfù0[ãN"'TOM¤äÞ¸«M$<öñ•]ïÔ*l·,y¾û«ëzÐâYx‡=ôŠ!?ÃK’Pb¯<¼Þ¢P3U‘à@¢{QœŽ!PËÙCªÄlÊj‡¡Á 21ÆQ\X©ÔW€WAd b“âºPgƒ™T1Wç€"ú#SFq÷s =¸ãPgPwʙ㌢å !¢7S:NØMd¨Ò'U  ƒ”1äõõ³O___üv˜R4dEËu'…ª‰§,É0ªÇ¡1 2Ƙ°(ÿï¿ù3ßõ½¿-š‘'÷<„˜’àBW#ÔHç™yd–¼äœ³4O5‡Ù3je<Ú&Ù{²U|8é’rxudJÔ0D¡Àw}Ï×)ò¿û·ì8‚$jqÿ—UUÜóëE:6kük!À‡[Ý ÓÖìç-—…•!:ï^eäûÏ¿.²è×åÏüÇ~Ž º6ƒž¬Pð °!šqÖÁ²8ÆåšgGÅgNüÄ íVÆelú€¢1P°T¡;Å€2°:WñZ?§ûô˜ÞmzˆÚoô~RÎSÜý“7r˜éŸž¸B`ÁÛ–vÜšO/`ß,ºáæCŠ LÉ9ÅÑÅ•‰ß+–ê–ù)qAEÕxŽûpÿÁ?øGò-kˆŸ@*•=¶Wr.™ú?üé?öÙ·>ã8ÝEj‡F‘×Ïîßøæ7^ï÷ó³û}ŒPûo_ûä“—7ñ  ?ïøÄ—Ûí8„2h>Hú8Ï\aѨ¼KÑNk—fDÁÆ7j,®ÄĪ)k˰z kÁ©N€õJ?ËŒ0A ˜(|ÖáË'é%þêÀú|l–+Àïåí&–…¹e÷4Ä"j4Ojxé½Ìæ±8:‡SÓ_ÿ]fMÓԆЈ²‹9/;¯¦ìø”ƹØåÒ˜z½dÊ×›2“Ô5¥[÷È}Ñ…Ø­rEæ3†tjÆT«„©ÜrÄ!aplx“Œ…¤ ø¼œ¬îñ{®Þ½”Ôß N²V|¸£ú@¶.Ó|0Îy÷pê]b™ £8D(Ó S݉.šø¨ ](àõÞ£Ú<¶›c4PÀèÊLÐuŽ×óõMl­ökÇÊ t¥":ÕI·ŠŽP õê«'§`Ò(Y-PÓ 6…/­2tÖ=>÷!yâ(˜~;M¶ÖÒ½sÑV{ÜzG«ùXpÌë¿‘NÁ.j`ßú?Xlåm~ÔwüKLsS-šl‰Œáä‹hÃ= ŸTù8Ê`?Xm±ŒF %¶š^®Vn.ñÔ4‘Moó¨h7Ù¯ï®Ý©Ï™×üÊ;ÚÚ+D¾;‘ñèL¾\_ls•êáÎç íî˜C ,pÿ‚LÕº)X$þŠÅ,p·îtŽ–¾iÛ\ä.­¾ÛØ$pϵ¯ÙÍ´ûl ›Ì¦ÀÕYºòïÕâAê#óåRÚÍè ¼Ì2ÃûgP•t|«…yN§Ë\¿µ›CX~Ç'!€ ¢ž-Ïo–”ýÙ»}?¯Hö(Âzó™pÍŸÐFý‹Üƒù{° Núfn€Ÿ± -ùè`ÿ š£ý»r®ÍÚ-TѧDl^znHûg÷~1ñaÆñϧþãÿöÃ-Å—G­…$µÅ‹eM¢vn÷4·ÇzÕ èëcõ1·ÛÃ;©5>ò^ÆÛ6>)îý9€·OrÞù©²g[øŽÎç÷{®ùì>xË]ƒ‡i¤¼·õøËª?æå熽ýqù6iíx[†ãÙç¡ à+1àÿû§fl;|n½äÊמ3cfùYºû] ÅÌžƒ¢‘§(ômA›+0äûÒ;Ê:V¤ $ó‘©ë•N%ÐÓžPͽOï'a¹1¨Ÿ@àî 1gt:å±¹;V0Ž-oH-ôÁƒG'Y­kÛ‚E¸kö ÐZb^²Ùƒf,xRk¶ëc3–hj?³"UžöûÎw OÓÕ—xW“‘3!Mc&Ù–a ‡¨OÂJ–³ˆ¸ÎÎcºXR»]hR”'Ž´±$(&:ݲ;1Ê:×öÀÝEPQÓ.]Ç`Œ“îîg¶ÊfÖbnƒõoªöòò éÇB*‰tTՌȰC}TXëjE<ÁY'/Ϊj6„ ÜT(Ê!PºS#,#¡ wà^!žxvU0\Ük4W•›§;O¸wÚñR/Ѝéq»ÝE„¼"`â(U¬÷Ûaj$ ~Ôiúaj_ûŽ NýÊ7¾õ’XÞì¸ÝŸ‰ DajržcÜ5H ³ãž‹—¸»áî<ÉC&„¨€3i·q¡™99\$j±sÆÙP ÛAV„ﳩ”²¢X5hÔl£˜¨Or¶z1ÑýÓJô> ßù›¾ûÓ_þ»ô@¼×«™á°#iqÖjïŠ:ÌÃéb9”‹.Øã}Ä@õ¨QÈtþÊ«ª‘P‰"xT~Ûü~ßIªùÏüG1eˆûv¤ˆ™’b¸G½jú¬¨¢Œ©o$NáÀ©zÞ9²[BÍéJ‰›Ü=¥šBƒ.Tˆ!iõìB„‡ˆ“gΈ!öɳûýô»¸™J±ä^ä®1¿§‹Þ”$5j–ØÖX‚××\N„" (Zt¢tgÝ‹£!€Y(/ô¢âp'_LÅ?óoÿ»ù„»¯}‰N=ÓÖ %ö„øÕ¿ø'ÿX^™1ÆyB ÇavØa§w’r}}ýôÓ“òµOÞÜn·7ßÏöYËÆI¾Žq¨jà~WÕÐQäpÏ5I©ŠJçXLJÚFÍdÛ¶Rkl*M§‘ÝÎåÏÊ5¾ÂS¾©’ùšš¯uD*k<„`@®âܽ¬²®Ö£©¤"«,±^)º§O/‹¶ä&š ÏUL›$3ñIÀ j#Wïà´÷m~|ÄQ°$ÎdOZݦµUMÁ26¯AF*1µ³˜~÷Ô¬VÉøh clÆHa7™¥› /l¨¥ ›ùb<$i-ÞSô‰9J+odX³ù5É)Ìꑪ>Ç®—öCR€c,--éý³;R/¸`´Hí’ 'w RÝ⾩p×ãÂL¸V©FD̆ w̓Ïo<Ç*J[êæÕɹXVÌKäLn ]}e}æžUEÄt¨zW7YÕ…Ö˜„þõ"f€Êý¼Ôštr{‡ì¨L­ªcä…‹³ÇHªWÂÇàb·¥Æ³g-ðT'ÙT,:ÿ"ß°™ñè[ÔÝøÏÖÇúO©¼2<B.f¤½‡±Å•{gð æ#÷¨œ`›ZèZk$­xX%9«ã®±{v£ì,ŒMïÂaSê§î‰ý·~0g½”ùÅ3_ѸiÙß´ëçèðX2ßâé]~Ègðâù« cfÿÈŠÚ„Gªë¤3q¶ÅR:s§ÁjÊ ¿ÄÈ¥©5®É‰cOspÚàVéH³Ú£ý¹Y4µº’; ŠÜIy!‰Ì½<`¼¹ê£í¡êoã‹ÿ¾à«­A8#èëi@õ^<þíq“ê¶×Pñ/ã\Ž]mY™®g,8a.|‹„ÞV³&*Ö÷X †|«id´&º+—àuÉfÜm™mÁ+Ε™êÜÙÿ?NÓã‘üñVíG›,QÄI8Ì·oÝ¢0³€„Ó%wÖ¨ì6\nô§„ñt¼í·ø¡ê\Õ%ïœ<Ÿ¼í³~Ç=À·¼+1PÏrüè‹Å§Óöσ.ú<÷ù¯a©À·¹óîRf>¹{·èåWfÀ÷æ.!—+í¦±ó¼ŽÓíÅUÛâ^`ˆ ”m†ËiÒH?†°7ÀrU6?r#ÖÏG‡ÚtÅ5{ rQ;˜¼Â)u†ŽŠYw ­Šã¬ñ+ò"JOPÃ=F¦ØÖÐEP«—ÕÒ´{¬_.Ÿ$…n{˜>ÙÌs|€AÐkÖCîCIm¼ÿ8qQ×÷ÞûLôaÀçLÂðþÊ(¯2jNU r¯ûLÁçñ îTsRKà>‹î5B4ÃÃU=2‡âÃÕ‰ôÕº¿YQ_“!¢‚sŒ!<Òq&ä*apƒF×Ddì"é¨L-©S(¢c Í ÒGè­>Æ/7°øa4Õî˜ 8æÔ}ÐSp·D…1ÛŽãÍ›Ono^H~ú‹¿øz?_ÞÜBbt:\‡Óoù p CÝ?ìæþªfã³ÏnÇö(ÒéoüÌwÿ¶ï‹HDqÏëä"0I¦ÛCëÔW3•rn’¶ Wûfo”Mc¨ ·Ðu™¡pú^•f'¨ rw@0Ä….øäïýÍ>ý¥_„u.Ð,]&°¹YÃ(aø÷ýåKÂíÐ@E«Î„5Ëœ*]” |¦I"u,ë^ ùøƒ?òo ]þÒOü‡â¼Ðs!ïS\!ÐJÑ·'“<‘ jÞ(:¤×1Y”û ª//"î÷{€áf®gÄ‚ù¬Ý~håî€Ê%k$eØN~ðЯ÷&ÎØïdV%æÁá‡Ü(¢2¤bÕ¿¿»®Öƒšy b?~ÛZËKVŠ­n­l«Î’œ“P}<ìÔWð%¨uAf;1Ìø®¦"CîihëâœH±”¹ò6oŒ•˜‘ŽåÎÔ˲%å§‚EÉÄßõIG=RuÕbV˜£º¸M*ç½ñ¨{ uƒ³_ä%$‚Áœ#Çœh,ö /ðÌ9ˆë27mhÎÙÃv4àƒw3 ?œEå\‘÷ÔÂQ®óÈY"{¹@›¦Ï<Ã&pqó7þ®‚J÷¡£ù æº–TVîÁõVYó¹æIŽ Vu º(»üÌ{è} ÷ëÞXÝF‰Ú;,Ÿ¸¿!r¥ÌóCDI]&´ùî›]=a±ÞŒ¼¯åÏ”‘'D³Uƒ¡§0ZÉÒV?Œü£/nÓóß?‡ùYëåŽ`ŒIVï¤v{¨Îg¢#¡tÂ÷ÁR™3q¿=k‚Ç9ÖjÚvF.7ÊÙú1ÒҵϞB,Irbô‰Móœ¤3°ŠÜÏOøRu¶ë°ãr—?øûçþþÿ§î}~mß²ë®1æúîs_UÙ Ht]el#þ:!ã;‰’bBÅÄv68 ›–%Û`;XðG ‘Ä®"Aôh@‡ ¸Þ;{×4æœk­ïwïsÞ¹÷ÝW~¶”Ê«W÷ž³÷÷çZcŽñUD0;˧*336ËÏ8š—qçºQå19.‚kf¯öÙ1¦WˆŸRCE<~¾¸ùȈüEJ^wô¿ÜWpv!OÇ[5¥)!› UnZ.„®1ŠÉW¦–ô×ÇÕ2qÄ ‰ñ£\ˆ/éò_ Èr´ àØÛ}§›?œ|žÊ;¸ÕêÎYƒ\çå/^1ú"7î”süøÓ~/¾¾>oô`ðàNþŠÏôæ?Ƈ“ƒÃ §d£Úž˜wÐfŠ·Ð‚‹ §6+B¤FCï°-KódsÝÕPï óªŒ 3-Xúh¾\'ă4„Ù†«ŸZr>ìÐ\±uçâœ×|±ÍÊzíçÒYKH­YΡ®89<Ãòf‡«kq. ~ÙMÔ±Õ•/3ب‰ãƒòó5:u>éš ÜÓŸÞw€)ö`g›­Á’ŠÅÇöÇEÈÝaæîÍ(÷fÍ #wuK !³(‘¥<úµ²´PR¢AÐü. ¨ˆ¯iv¹ .³B0#÷‡n½4’îz!g½À¬:L²XƒçíÊÛmµWOea–LÕ(¬ûQ(”Æii‚Ô¸”N4õ<šâQwçxb0†Sçþ[ºèt×[ ÕÑ9#pvˆ‹úÊÅ[ž(ðÞ œç%Ë=Vð® á!´t'–j©ø\îEáÑQcOãAõåh›Ø›{ÚQÖX•{~ždɪg/A?íëªßÔ®ñšóåfËñ&¹B¡+¡1gá¬>] 9Ib}rÒ®rŸNÜ9ìWœ×á]€ˆ_ ^c¶(·•Š*ÒÝb [ ©¡H?ˆÍ³£ƒGî(ñ›n-‹s}¥Ùk8Äæ) íi´Ä‹«÷arm¢¥ÓC¦¬äñXYÖªé{ 9¾tßë}䉫¤ÿùhÑüט] äîtØ gÂpÌBòmèå¨F h}ÞqR§W˜Òa3¯GÞO-–‡×ÌLÍúÊÏoxí°}ÏÕÉ€8 ¸4ÁŽ8dc(éîa3=¢µ škðçÔÿŠú¯7 ¥¯«yðNÁÈe¬öÚ àåq¬þx<¶¹§%½z3~|¼>Òõ¥ëÁÿ2f_Ê!|ã'ÖK‚ÇYÑ}ÊWs ðù s€œáɉ=áôR«/KiÈÑ8~·J ë¥ãAc|xl$02ýÉW6”“+ß VvZ.Æ|¾ì‰õLÑÀäÑÔØ²³RUKÀi«9®ñ%/XÒeÿçÒµ›%€¶Üõ6ö!]BVíØZ•òêrpËá°œÆ,dRðæ?Tuž{Pôõàj]Wr~šUñX3ð0 ³AçC¡ßôUzI$ñù  Œ8°ŒYH]‹ï76‰ úôîV;.×Î( &¿â$µÇrA‘è ãê©+Á¬ukM’­fÃ$F¼ÓLtkæ»{eY𙳠·uxÀ›Ñ]rl–zhzl2Ë3ÑC=–5ÞúóÖ?ifò¾Ã/Ú¬™Á`—„înÐûzÎÉfËÒLƒÝ’ë÷l µfE"̔͢AˆÎŒcˆá- w`ëSÇ\nÞ›»ÚÆØ$ÇQQ¯r"+)ôâIZc\ aÑUz%Ê )qÌUœÇê¬àÑ,q’Í••ÜÚ»RâŽ! Ç-ç ïDÛ ‚÷Úe+é™b²Æ¶û£¦xzí]É܉ÖÞBˆl›mm+´ŽŒæò<Æ€z~¾’´Ö¿ñ¯¿{ºüþw?MÃ|}wíØ-€þ­œø@!$×åry¾^23ߥ,ØäÈÖq庮ã0)U˜ÄQe¿]%+Â`ð,&£8·F£”=› BÆìÚ/󈆑åkhÐîhÙ ‘¿û[ÿéÿøO—?¥ÃHœäó10©t/=«Û0v‘T›h9²¡Ðä†s¤møÌ–-P IDAT'®"A3“–vx¯áFï¾ùGÿT5Ûøÿøßýª…¾'Õ±6ÆKÂØ,_³¯=mÛºõñBʼ/N«Ó~ÌjXÁ¶K¨ö‚%< ÑýÛÉô®ËÆìöOQ…ê!7:ФîhdÌ;å–ÛÓÕßbT1È]2iè:‹S· Žj<Õ[Ñ¢÷¤w§ øÁû³eÎ ^Áýç©Ðë%üßü¥ÙÖh0¶Ë†ë§ò½s!¦ ½wõÞ!X³ççå[kzïÏŸ}&ȶ Šã­ui4cÐ>ØÝ»ËÌ]b^»Š2š ·“‘TñŽcm)zÎQœ•}’vTÈ#×ð€-I6UmMh²!Ô/ …®ú¤ÎÔ–›«³ôÀp™¿y¹Ž¤¿†‰’\Uß,女A}×£:'Õ..ë•|R•bµXÔ\÷eY¦ÂÓ±v\.âF˜ÍI‚;¢éWÆ|DÆKÃÍ#"jñ’!]£n˜ë´V²X/Ž ‰¦,ì]‰Ï³Ò`Ž)v&äг¦*; Ú¨´"û MñoœøÜZ,Ú] ÐG7'À5Ã!cRâÙ›2$¶±â;2Y^ÚL;3G± èT=íú*&°/ÎE$QA\Š}Å9pÑjçc¨ƒ]«Û×…ô©Æõ˜²š¿ "[|§Ï’‡z[OÞ¥E:)ÐN§»º\YsA .žSÂb¦&„³CüÐ*"¼(¿Àa¸' Ÿ˜ãâ 5v4ka¿ÏBÑ5æå9Cœ¥²:þöƒ ~VñŠkHûôÞå¤ì%Þèiñ\ c9s>Kjúõyâ¯s•.KǃÃÇ5E¥Ccïƒ?×0Å£Ot½ÊôR€™Îµ“Ô$ç2YªÈ_=^‰SeßTxìL ø„µž“ԦY–Ì£ø1Àã+™ê0ªôâ˜(,—y®Ó•1¢(>–´XlçÛJg×:çŒý˜28d§ÿ¹ $’/ê1ïfsK¡Î슈=H9 k´x¾§Ö#Ïs4 NšÂÿò4®¬|¿_6›‹µ&• “.ôQl3Ôcó†MŠ×Œ›”dMŽv…ÃÅôó4e8¿¸Ã8ý˜+WL¯(ú÷õ®§`Á+nÙ/GøK~B ÿ™·Ë‚÷9µsr®›f‘Ú2ï]«ñrÙ ßç’âÛ¯DÜýM½ío}®–~ìS×CÙÿm&VßËñÕIÈ{xhøè`½áBùˆ=¿ëjü0cû—tSðvðR[ÀѶòUžL.Û‡ÏpØñaÙ©ån"šw-j¬hôo’<Ž‚ûÁ29þùAX-0>BÁWKèø’²¶s~Œt#¥'`|¾eA4þÅO’ „ |øØù!m±‘Åÿ䇱¡á2u8hv<dQŸsä*쀵¬¤Ý}ŠÉ‡Šçª#žæ Ë:ä´›®{ øÀçÒ–©Æ0§†æ¢Yv”³•HÓ'Œ·-/}wo—¶™íÙ»˜È^Çhíá¿õ¤ýÍÛek‚n°=é -®—€‹/1Ý®NTH‚µˆ*N°À‡µ¦°8`¼ç#ˆ(é+71if5«’hÆËÆÞ•ovuf˜ÆÞ¸ÑD««T 5—n™m/e > G žXwŽż‰Â¨kV¢Iø€i-ÙEÉuÝÕ>Ÿ’’ãûlf°hßB‰æœ¢H&`.ö—”Y3kl¶].—m+K|´ jwO6@Wâ— ÓÛº$hЦsˆ2š¤¶m¼{z¶ þ(¹ÑUË+ëý¶=]Böb¢Å÷ø *"‹ï=æ1ðm»Ôº—ÛÖZkbðàÅfSÄ %w÷×»oO— Oï.ɵj¯Ä@ ß%‹/¡ÛõjÍž.ï@ÙönßwI›ÙÍÔ?ø_ÿ—?òOÿ3êÌ‚{V KBÓ`E!•dÃQï|PÑ2³hñ<•·‰È²ƒ`RËä›Je—,óøEêõrŠôÀïýÖ/šø­ÿóõk5ȘÏú,m´mLbV†aÕÝÇû)úµlAÉѺj¤{Hè üËXÿ7ƒwØîl î µ„«‘^ð”eƒ#)¯È)‘1>hͲA½LÐ7ÐýÆv¡ÉÑ£TD‹{À{`²ånfLâ—å{ˆžÔš$&ÚáÞš»z[”è@®hoÉ.ˆ‚z-Ycw[ûìÏåÛÌÃ× E1ÃAÂX†v¡N|û·þ©­™‡½lª|¬µB»ÖÚ÷½ûÆÞýùùùâûgŸ]¯×gƒAz~¾^¯·[ïßO3k¼S‹;äÚ½C顯 ÐT³å‘‹,d´a8G~†Qíͳ¾%Ïh Þˆ¥Ær|›Þö'³Œƒ‘¢©þÅZ7PѤ|6­Í ÌÛÒ¢®"e¶ ÍöÌj\)k»/5·€…·è5à iÍ€$ƒ{á Z ü³É!¨f6Ì㘬'Y ¬â5Ö±ZCäªãÔBÎF¶¡é@[ø·è—-¢=mS‡Ó¢ëœk%EÉòÖ…Œµçƒ£‰UË3E )ÄsN1R³ 敃›Ô€Û¢”Ö^#‘ŸÚ5ì\âeou4Ɖ᭧*bcÀ² D¼sŽBœGÖ¡µærÁF^Bà&ð’•À¦öCˆ~¯ñ"¥¹®…Gà¢\ü>$·âÒ-ïƒ*4®‡ÈKp^)µ±I\þIòއŸÉ‡9—䨔œà½ïÑV,6ÚÓAC:0 V¼•+d®Ó¥7~§éì”Î~ƒðP‡9;¦§ôªƒ 0ïÏuw6þóБxÈÛÝåi zêüþØͱÅ;4¯¨´#4ÿ¨{JxÔgÁ“@½Îb˾Îw_”>¨EÕ>ÿJÞ©±CÐÓú“mdÖyþœ0þƒ‰=JGP>êyôk¯oÇ¡ Ž®€q»ÏÖØ}®ëÌpܹ3¸5ì×K=U]k†2x'>}^ ayñØsv.Œüg†¸*α nÇ?iv͵cÕî"mYûœÙdAPîùf)ˆ–¦žcBÓTþâÄËK£«ü{…½^Ôí÷ưp˜1ç§ dêP²Îkµ¼1–µGqA\M„ÍQ«²uzz×ê°‰xÃð¡âÇÏÑùR4^²¾Ö9üF’K±ãR‰±èÄHBè|fHf‘¶vîb¢ãõIÈ[µe~е·´·¿j¿Ιzó @/‹ÁϬ‰á÷SS½õ4¿xXõ&äÿ{œ¡/"~ó‹Õü¡$}à”_ý½4½|Û_,?mùËcÏ‘Nz‡Œ7´žéâãŠ& þ§X€x¡¼XÉëö"“ð5@vÑŠíšÎÒ$þDñoõ%jÖOƾu0¡ÓÌÉ/ =ʃ–ÁlճѤAŽÚI©ƒ£à.ø6ó™kUDâ••Š’Œ~[f«¨¿îŒËü¦Ã‚†‡‡Û:èNòëù4ÛK×.=…¾Ð\ëµXiØr³A…Ò~—7FkÖÚåòôîkïžÜpÛw¿îð˜œiïÝ]1éihÍZB/T£ˆ²ÐÖóŒ ƒèÂ&ËÙÔ«õ·‘´¨>fT{0r»´ËŸÝä®¶•I’Üc“èèqù¢è¤ÔžZ”žÖê#½®ftlqL6ͼûÞ=ñ¦`ûu@³ Ìáî™G·Ü4–úõÖ{ï×ëóÓÓÓ'Oï–eÍ JN6»>?w÷€w¯J}¢¸Hˆl÷D5)Äž­ :ÎyÈÍ@…ñtd¾gI’j#eåÍ-ãõ’`Þ*€âhÍØ­Ë2JòhE|û·ÿ“¾ùãÿ>îK÷Æ£5Š8´¶¯{Âp#š¡0)Τ^ÚK,¶·Z+¶—“ÛA‰ Vk$C˜Î šYÑâóyéê[üÏ¡¼Þ¿û7ÿ³çä&¼»¨›÷[ ñ⤫üê`J¦šf©ƒ 2£/ØÚ¨÷›Dþ˶¤©Ã$íi­É$†ÔBïÄ%j¬é­!Уly‚eN=ýùjD\t‰´gVH ƒp­)Ծ΅öýéùr?e†qsó(P[Cß!}ç¿þ•ÖˆîÍ pY£{+«º Ú=w–k‰87­ñÝ»'èÒÚ† – ½{wom‹‘â0Æ—õ¡[IÙèks«»ÑÀ(‡Éècíû)ÆÆÁpŸ‹3öž€¡|óvxÍ‹Yž$M/,ÂÔ?`ð™%œtÞ²£Oì f2cj}Q3 œÿ%K={Ti?²fD}ˆÈBDn†&5J?J+oÞÇM ý{måîmŸ“~ü4z`èE“w2k`OJàòÎ^õúå)SåÙìÂAŠçš#âš’X0'3ÿÝ8e è?yCs÷¨•ÿÃÑEÎå§,¹k'†kÌÓ™tØÓKsŸ±—²*,âôxNP£û(æÅ79ëY+ÃÛÖËÓA[àJbˆÖbû.œƒz¢|ع–猪”kþá4o‹`ô1‡u.Î¥àHKc9N^þ|ÊWReÒüÅžì¢ KÃ4Ñ­¶ñýŽ…Öù;Ü•|"›7)¥Ê2syöU÷áÒw¯“öxî"x³ÄÄ;Ià‘ŽöEà‡^‘(m´cßÂ)WDUãÝ2àŠ´çÿzÊQÜÛ9mßú×çôЃìÎû‰ù\ŽŒ>.sgÀD™üK¢±êDªwó|¼GñwOócFKÎèLÊzI^ÕÛ{“ßxôè½óö©Ì[~Ç28ŽßžÐ1¶po7ß`ÀçÝå «ÿ_¶>Ï7Œ<¾3½áð¾òSŠS`¡Ê¾!pºqüP¶Ž« \¦+óqyÁÕ†cjY!@IÞø¼HKæË¦X¯¢mEÅ…PE„}p©+Hâ% l(·*¡›ìXÈÕ%4§c8‘‰ójÔ[ƒúE]Ê¢‡Ê¿® Ç£YS -kGtÌ\sºC5‹ÄÎ9üc ÅrW®¯Á¶œqÞ[ü.ÉŠ»®‹÷$û%ËÎŒÖÔƒëô˜Q“bHèB3ÓpPÆòuï. šù¢Ôl‹¡’YÚ¨/­I»>rï´Æ`EÍla¬‹4ä£!ðÎHÕ’Q>UåR£ï*—§†7 X%©8)†Þèývswõ@ÍZ`MLhUî’¶véÖöN“uvíHT=D4l-áÿ¸Üû¾«»omb E2‹+#_YŽ[ÒINÉh›™;ºwl1dsP×½[ï¡¶MÑŸ`‚giê·ëg„5ƒÔ¶Í¢¢³ïŒ–DK“‰530–Ùjë#=«™ýöÖ#­çýüζ¾÷½u÷~s‰½fp‰B4‰’µ&EÙp:Þ0V(ÎŒúðtõ^ý ãÖšM:AÕ¡­5/5)Ú…·áÞJón 3“Á°÷=0ö €T^¼|jÛñkLÞ:/— w¿\.€>“þŸÿýû‡ÿÉŠcË8¶?ÌTs¸`ÎagOÖ¼ Úfì.÷Ý=dBdvˆÒÝN5M3~nD}ÆEÎ*5úÊü”çS³»võ’¸Ä[h”³eß=êõ &ãmˆŸ!3ÎZ`Ælb¨’œ©…ò³ç ý¶;ü–¯$Ë1޳Ö^a›OŠ6Ë3ä§_X½*5Ãû l¢ÏÕR×dòXö8,³=ëÃS‹ ߢÚÑÔ:`Ä€¡B¸gÖ<ÊíøÕ ðTõ«aR“´ÔO©yájÊrîsFL.ÓʸXº_3.5VÊÑ l6&[­>k_7“£ÅÔ0ˆTyZî‘)1'+?±ò 䓹a3ì^—K«£N¹à õLº±GµŽbyŸã¢E5ªì‚z¿õvÙb ¨³Ïü‘.ÿƬÏh~–i•ç‰×"<ÚÅ.lîõ‡,ø¼2qŠ“¿7½Ûk£ï"f/›Ažû ŽÕ<$°ŠxTîË5¾ Å«þ¾N©¦Ò6 .&÷;w,Pùƒ{ùøé2aó‚p9;<οgŸ—r‘y/ÑíR‰> Uà–W=§Me1ÃrìHm‰ƒÛÌ6Ÿ»TkÅ•yXLS(*«îES˜Ù:Óâj‰ÏwØ2ÐìmŽËi”O›8õ,k†'srY¶àkŽ[ï³­wÝâcí 8ˆùšs®âVf“àXR2KaXé¹:_‹è?}iXïÌ÷ó¼¿UõÃhìÇáÈqÖ3RiIAæQ\_A~k³Ñœ™e5ÐÂ#T¹>RéõH’xà÷?w~,5Ì8ò”/¼¤M¿Ddã#Éø!nŸœ-ŽÓZÊ*˜ÇÂiäÁˆ¯¨ëÅ?¾¦µ Çñ^ |@|äõØÃÿ_š¼`Ó~£ŒÅ»ÇùQïû¡_9vwM8¿«_;¢Z3ŒÞpºàø9ר>Öñû“zåËðÕJ‰¯ZZaVÀ½apœEiì†5:îGp¡ r3‹ªV£gxÿ¥Üæ¼Àg¢´úÈ´,x2ö.Ã4 çV¼ºæBœ ÜE,ÇÝab§hè[›] pŸ8¶PÅPËmiPßçº`_.(Q ê6‡‹)[0sŸ3öýµž&4²žáƒµç>f]˜U'g2|ÙjMçÝì,âH6 Áèþ$¯éžX¶veo4Jάü\êžÞ}8g~ÐwÈ]-I6ã4:%íeœñÝ6CÛy–öMƆ]±“ÔHy>Ó5gP>P“¹…«ÙœR€)Ò½D6uÌÆS ÚéC­“Ý`€ºÂ:k0©;ÜJŃ[©)a°ÉvR@:<4ˆb‡¶á²PZÖÜÑ{ïÝ!èÒta àŽ›‚+§[°‚Ó,ÚÑ iÝrÞZ¬êÃûf›ò½÷½÷‹5n•ä÷îr÷΄0—.ŽÕ(EШîIö¤yºWºÃÐ`½ï·}§åˆîÖ6÷l@íŸÁ˧2.éh ȺÐË[…›nNlÍÌ€½«]¬)z”õÜoûÞ7k¤'œ>ÉDH´ƒÙÖm²Ù’*53I}/†Ü½·f—¶µmÛ"I°µ@¼ pïT4 X$HàˆÈ1«ô`¿íeÐk©ÌÌ{Hx5ö |8C¶· hÁy‘GväQ½k0ðjØsp÷ÞXûw!8>iе~Ç"äÆvÞV>ÉR±ýÏýëñ€´y·$üTCì¨å.WÃì¤mpÿÝ_ÿë¶½£dÞ»e£‡dMŽÖ¶KÛ¬y÷î~Û÷ì2ˆãã~í{¨ÔÍL.™â‘Kôm»|òõ¯Ób)ÿŸ*3HL½=Ôÿ<+Qãµ·/ÙSy‹ÌèÍÀAäÿóÅi\›X§L‰6SBóJx¯Çžjœ¤±.)Žƒ¯]®W‹ô„Âs-•ù­ýK]^ˆ¡92§ãüS¬j:¸Ôâæó Øv¥œḋØóPGbeMÿQ ã<€¤MG{]¶‚2[]4tÁvIæ Ó›±t'gòÏs1'†äØ,oáPâí-Ð-°séI1$W» ÚåͶQ~Ë‘)Xæ£Sx­ÞRk .Ù¦ÑNšåInÑ€00=«Œ&âõ‰‚†#°¥žŸ:TÈJKç¸* κ_’AKXKËËò–ãvj×B¢d5H-”3^|ó:ÍÙ¤*U@€Îç‘ØŒA›ÙÈE¤œ´ìŽÖÃ^#®ˆY–—å‰Y)ãX=˜FøÇ’Õ#æáÃe½»¿¥Ås>0éÃý³ÌxøH ZðQ¼BtÊ[ÇZçC+ëâ#[q|˜(ÿÕ½¯“Kw%1ñä××Áßî±Ö¡„¿ƒÿ^äù;,§…:k†´FÞ-^ªoø\hl˜3ÏB–›²c]a“ñŸ[j×HKr™Ê9K²Nü*$ƸԪ«F IšÏàÊéym–WžÝȽ€Ðø¨å‘I’L5óãT+fÎ(wáZò<«Ÿ ÏÍ5Ž™NÐÒ+±6Œë’§9ÔRÔ0·ëu ¯αÓ«p/ø’×;€µf´Ž#º/Åó©×lÅoü½w žù³MJó9z¨ÖÐ#„ÊýÂ5÷ –Äû¾òÿ@x¬Õáø¡xV]ïŸ /‹ÊÀ#0ßYU9>wjÑfI@çÍýgJÒ½âÏ9©]Ç|+¿^ûЇPÿ¥«œroŸðýäo¾ïý÷ò¼èLþÒ¼æ/ü+½8eà{=޾×ßþÁüñ×ñèÊÏÀÃуîëùnË5F5Ù–B—äÓèó ²9×jú#ÈwlAaf?ÜèX\—‚¬˜B!È´ÃÏ åK”ª©†Ûµ C+2Ž@'Ã)¼ç.sþáTñù_‡Ó;ŠìÅa+I½Öø÷*÷ ‰m,^hgæ*àÙkg¼¾åµ.OL¥¢ŽÚRwKO{*T© “Ey€;÷½Ñ‰ ™] ÍÊ›`öÞ»ºz¬Œ%ÀokkPÅÚQ#çZ´S½0Ñé x}#Ú¦=×r^ÌŒpfDÖ Wá~¢–ÃÕ(’¾{§Ë„§Ì`¢{pŽò…‚‘ùõeQ^V—wHf|ï¾»·†wlëGІfvïÏ7]¯ûå/›…«Íh–-ðv{ ?â{ôîÖZa,RZŽZîÍ6(ܳò.c³­¥ÖíNÀ¨L¦Ôbͬewƒb´÷“'ÀƽG·wÛxi&s9HïÞ{·Ö¶Ö.ÛÖ6ëÐ~óï eæXèQ«°€9ÃÂh½z•KÖèè&²Ø¾Û¶ÙÖ"ê`Úo!éišª8,ÆÆîº\ÚpÖà¯Ô­­m€ßörWï½_o·OìéòôÔ,kJŒ0ÚÓÓ»OÞ½ûî§ßÝ÷ÞÌ@vw£¹ºšQ‚µÖ{OµN¼K®=¤ÿývÛ÷nÍžž.¬íh&ÑlëîPßo»€ž•m4ãõöüµè¢(_jüuмÂOù@ò}ËÇ%ª<›ß€·FÛÅ.AKó«ãöŒ.ÙEUÜÅÎŒç¸4þ«‡ÊuK3v¤Ñ¿YÃÒ |ýýÿê?ðƒ?ñ— ,76 °§,AÌòÖÌIØÜ­Í§¼¹VgF‹ç§ƒàž7m\qÚò%Vq³ñoriÕ]–öz‚Æ«/CÚü¿ýãv}ÿßùeLjdX5á30 dØH“dkFªU„Ðtz”“ÇÉÈ™ŒÄ[A0Rù–ÇU”›ØFTÔìw$þÀOþÅ73; ™«D¸š“ÇnFèÊüP-'þû_ýkýúÙåry5¢\fùˆmkš5k›ãV_“%´ææñtE‹.nH;hÜ.—f­]²î%ubw7ˆ‡É>†¸÷OõRg ƒê’@¶ÒfaFaèÜ´MiÕH«¸–WF¸Té9 '«DÑžãiu Å»b ·~q¤ë¼2Ë‹ÿ¸‹ñÆthï,3i([J¿¶êddÇͼ 2]¢ÅÒ±àr¹xè™®l°m.¤ò50x²É›¶ÅÏ1V ^(-šØ,1Ô]‡[ùɘa÷6 ¬ IDATNš¥8#äÏÏ‹´“cÌqc o‹eÛM¶] v,½£E–SžYæ0%!YÍ€BÍXá°Å„:Ê&çvýñá–¦ÎAt#î©îiªX5“Iܤp\ ×3f ŽÖÄt”•f¿ÛG@õaäIO/ ¾Ë2ÆOŒËúj5^tÀñ­µöÊ*ÇìÄvŠLÀÝXKiÀê°y^Ì­Q ñ{ > hÜj¶[ø2q¡_g›7³8 Ðò¨=æfk÷ëíÔw´Ëƒ? ÷ÝÐrá篻?B²©,¨Á(ã´cy6¿ï¶ðÃ-Å%}tgìÓ#£.«ªj\Öó¾X½ÿ\%æ³3ÿ ßØT÷DñÞ|{¯õpÎŽ6(.}ÛÇŸô¾¨Œ£RuúYZº/†3ÁrÀÛÚ(Æú=#³g|ƳæsÍg&ÊŒ Êk6ŽsÚ§Þž‚“â³­až«lpcIôiêõžb}3Ïþòœ–° eK–í5PüÄ9Ô­¸fãÛÚ(ÏY%œÅ¡®£[œ‹³?¯6_^iÓEèL:eɶ&2?Ï´ ÞYþ¾$iN÷¶â×J-?Oøâò†~žxN©ê˜ò‰3ÊnxÝPÓ8•+H‡kEÀ±Ñ"£?ôµóW~"ò=•óÏ•mOˆ"+A§bÿËM™ë‡šöÙŒqôŠ âé驿¦%ïmüæëöô/Ae}‹9?À+þ`ÛñÖÀB;¼öê?“®Ãôá-_‰oº[ßë‹óñ%òqþëþo¾­ø9c‚/;ðöG!¿ÇÓ”;™Ñ=…ºµËåñ¿Žpg,Ó‡5&{u5—åtã ”Ïz€u9#öJ¼æùüP^'–4W&‘@‰ê g!LP îµQ €Ä줓Ç}V•¡"†Öjnq*náv˜lkxÊ¡’® „ûU•½Ä<+u¥ ‘ìÇkÑwä(ïo~=ùëmOˇ €-t1—ô]ÝzßÌŒÓ %ÔS°juXL°l¹O»£«·â=ä 9·\Kx™[`t—×p2JP)gG’k¶ À…êÈfõ«Ü¼Vá-ö®a¶bï¸÷KÌ’Ëc¯™QºÑ¢P*í½ïË0ÚS€®½‘á8Ž›LLè{jO ×ï>ûóuÿÚ[{"$ïÁ¶V9±3P~ìC¼÷Öj*å½Çœ#¥.†ÕýùvkÜŸ*Z+ RJÐÖBC º @·ìÛpw ä-±ͬ+Â]fûÞÛ¶µÖ´w'š±{¦fÇÊÛ]uܰ)F] ³ê$ëLô<7m0{ºà¹÷'n¼T±2Pyc‰avf¹‰FÛ¶­ï7‡·f€5^»\òývÛoW]¶˜ Åv÷½ïîê}p¹\̸÷>0>^ ã¤7#°w˜ûÍ“þß»gªmÍ$™‘D3³hi&[k—O.·ç.ÍÜ]èê"ðôôÔ{ÿôÿü?>ùÇþ bÿVêÚ¢ªaL v(cár¬€(P½öq1š²Ò|ã*oH¤*_ ŽIšf‘ÊèëÐ Stƒ²àB¤>]Š*• ý½ßøk¾ù“Yž{ãª×t1_-Õ›!6ƒwkí°šý*[<á9:dr™È FÞ6(Úq9âÎñ(W’v~¢<­ÆB«s*ã~ƒ]ò ÅßòŽ(cÀh…ËÝèü+ÞËå‡oÿÎ/0ò:Fäeÿמ­! óºûÓÅ8cuƒ€ÄÛ.³µ¡s_D‡ZƒÜ1CSNl=¹5ô=›žKyø¡û玛/['œ×ÿø¯+ÞNÉEOùw@„oÿúÏ›]ž6>÷æd÷ž«„¶½ûÚS£´¶pß /BÛ¶x~~dÖ>1ƒ.­5A·Û.©‘Ûåb­)Sƒq´mÚÑh–Ó¦Þ=‡Gyu%¨0È^MÞcØç©dÎÌñ] ` ‰$2­>^ËÓç‡mÓ]8|È:¤ sVT~ÙñºrSõ`,BÓ€b)¤;+j&9cÐ퓇UÍëÊB뉟ˆ.Íű‚xñgb—K=ˆvƒÖœòùÐ âz(ÿ«²ñƒ«K‚£#¼Ò|^Ž„VXÍóâ#D“ ëȰ™„ÕUU±Ì%ý:~õ0–ÑȞǸÆ%íKƒåâ Ï Gx9¬¸£ÀrŒü4šIYÍÈãñĪ6òi’y@¾¿Áîòu©ºË•¬|êŠg>ÉŒF—MÚ~ã®Ã|b,cùaŠÒhªu4iÙæ «ëv9Øö—­·c´•Î/vj&j’´ÜØ–Ì‚—"¬õ(‚1‚—å`9ÑÇæ…eYªWž1R)1ƒõj×€t°•2à<:—ç¥}¯¾WMM{}¿Ì·ìèu'z”ΦUË;ÛçËo²¦×~Ú1=<ŸJƒkxô¾•á¡r’b¦+}­i=yé_vØû+™œ‡fè‡Úý‹á ~ô=ïæ%%‰Ë`ãMã‚uì±ë–·‰ © ó¿°e¹”¬a9˜aÛ7`©§]w˨š´õ»+÷35î´šE¥áÅ—åmËMOž&d)ÁîC­Ã"7ä ¥Ìþª5X º½x]KL6¬¯Wª"@íY—P¨ªçϰä.b¢ëN »X«â,‡;ô_k€$ùêÔHSJºCö¬—,ß›n¼–9..ï±ÌѹL„‡ ÁTc©Óðš+4hñTf ‹é‘žÉ{®ÚÒš.,}Ä#ë¥5GŠ^x€¿ø†¨´Á|´†¸Ÿþ ÃúxT»‰ØàKR£~¬Y5ÿyV_Oߦó|@{Äǽ¢?äÏê½rà:u: —4Íe8qøÅÂß–ãsQVòñªJß=¾× àçð×ô vtúï_eÐbäçË^ðuýÈ3¨æww“f2¬öYXJ]‹8mÕúbsŸ\edÓÏ|ÿ ·kB À‰p~ãFÀQžòNZNà9^}UF¶¼Ç&·¬EÉFrÔ¾æ'ˆÍw•!Y?RúdMòZí°ò€Ù 9Ÿ*àZPކ9M©ú³Â%”ÁòP˜U©L…$x0o/ä%þ{ÈÜ]oxOll$ÈÝÙÐì"ÏœEl»œ¡œ²9R<ˆ®SxQ•*nt7«‚É ÷p‰RÒ%…´ ]pæWQ¦Z3C÷nÑ »mž Àž‡½‡6*¥Åí ¹<µ€–ñ`—DA€Í˜ò¹÷(ƒßǰör3–*ݼ‰ 9ÜvC“kmÞ3Ѭ]¶v½^Ÿox’ï]ÛfaGVkÐ\N0=¶µÉ8–wwck[“˽çŠÛýÙ» ‹µ„„HhB³¨ÆSriªÐrZ%W/§ÉÃ6j‘› 1ç±ï{7b{ºì·[¾å,ÄÌ}qÕ¤6·“ýµÖÓ!˜ŽÂftJR—[O‰¹7ócó›‹TC0¤û^Žú(•€nmëÞ)XqZk­<»!¢ŒÂ=T M´/ îîÞ÷] ß]ž¾ÿßûÿûÝï®rj.šGïf¶µÛõfÝ;Ô{¿í;fíÝÓ»mÛòê’#B0hí²]¶'ïϽۆ úî݃o°µ @ï{õ3 'ÄUŠ£å£=S1)20¾]šµPã`zËòX†WÂá!\LîÑX¯†À#­{Þ›j ªŠ/S[7#“Î^f¶®)ÿT¦¾ó?é›?ùW8¬÷*G\d}ØZƒû@›O™Á²G<çùÀÑÜHÏŒwãaI8ë&@•ÓÍ“%pÂéo`ï-ד˜j­œ­ñÐïU߈³Ò·~ìß,¿÷Û¿¤ ÎG‹ AkyÀ¼ïj¦,’¸@Þ­AnO朅®Ó›%ï‚ ü©Ão^ûæ¿õWë%ñhlj;Ù MG ñDy.,'?c½ûí_ÿyÁwp£¶¶ù“d¦6èe'ê…ÌÖ¶½÷f„.l½Ë}3Ò¶¯ã“ËÓE]Ÿ]Ÿ÷ëÍ]f1ëdzì«™" kÌõG\±ljÛâðÊ-BW$ì|7»/C¤ÅÉ&w3ƒ1ÚLò¯º1‘ñü'>å¾Dsòàd­ª„:¼…ow*î2hEß׊c*–ì\…ª)7iνXÐÃ[àΨˆaRDB‰ôTâí-G˜åƒC Éºw¯j£¡ é)¿¡Q’u¯rxæ)_¶àœÙl¹„SC`KtËeÞLÜ\NÓ¢Cøº0æ´Ã;@K¢à¨/i[ÇmqÝ.‘§ÝÁX¬aºäG)—Æù-ƒûR‚™@Mh¯4ËXâ½°ð-Òj[ÛÆxí4 ç¬4UZ[»6ñÂ?-Ç6§—³„`^R],qšløòû“OCQµB†.5¥k´{›Šv^ù'|»Öö øQ…®6y·–S§a>å2€Ð a9¢é·ƒæùb¨–aÈØÊR´w沈>5ë•}¯=ÙÓç)zÓÆî‚!®B«mö‹Ý¹üËqÄAÓQUã,­=K-¼«À=8…§ÙŸÇ&Øu0¢.G……¯9 ÉǼïGÔì»cuè1®0Ë¡—”'ÿ°…Z? îæg·N|h¶ÜpÈÓƒíª5ë8¸>ªféÚò.žÕœÌ¸*Õ*«CFçÿ¿ZÕ‡r>OìhUŸòD€1­1áÓ¨x¦Í³ÏY‚ƒábüfΊèÜ^cT§¬ÓrމIöñ"›’7Ž¥\»çÃÖ–Ñ–†*ËDHi3 Ò˜”Œ´ß(ð=÷'ŽÛéþÔòæy«þ^ßÔ¹Föût¹q) ÇsÂøhV© 2>•|çʸfÈëâð,kc®!åÔЋq>Y+R0Úi`w8Zâ=1èþNÖYô'µ€™]ÔVt­å¥õ–™ÃëÊår)ñ…ÈÅ}”K¥>ǯ­V6?Š*ú¾i8>¬~õ:ù sßq¥æ¡ÿ¸¾úã BŸ;Rù2¤ç異}J}OføP^«øÊŽÖR|þ4ìáÌLë9eýùïsɘèªy¬ä[_T¾{ÔÅ?t„ZWg 2§æif– è»ë`ƒûh…Ì߬¬ÃKÎïPJ•IEª€Kœ4˜áU¶éŽIΰ¬kifŸÙÍÔBWÓÀÁ™VI«Ñ$_p³YkÊM£ò¨âÚ:Y]x¾B'¯Ï–`Žíð/—ÿü8  ´Fè{V~I­5× &§¢‘=%àZPº`›Zl!o2S÷.°‘®ž¾Š`ŒjäˆÕ)4šØµy-[ÁJ 08´M•Ãð2 »ËåMs”[^>P-±Ü"Üý*Ug@‹õ¤«ËEÛÌ]]}‚,‡Jè4Éïî!Hl²'nÍ6P”M–«ºä>5ƒü³kï.³§´'gÖµ'hbYÑä]$ ’ý­÷†~é¾wïé|m ä½ß´Ð 7²ƒ–iñÞ÷μ;š£oî. Ú7ÚÖZÛ`†¾‡oçv»JÞýk¼õÛm¿ÝnÑfR¼q%ŠNÑ¥ÍHÈhl’·ëíYŹF’¦rÕÕ¬]Ÿ¹÷¾»Ü}/šµDOl¶­õk'ðîé“Ûõ³çëÍ·¾ùÖ{§i¿í’!^³ ¶»§>ÁÈÞûÞ;hÞûm¿5kÞšõîî>èÿ5›€f­³ß|ï½»»ÜpÛÌìé“§ÖšŸ}úY¶CC›¤Ëe³fþÿ¹m—Î~½^A¶Ö4†®ª´JI9ÊX ÈÐ|5Éòdz×èÂèDÚˆËåW¢x®GÝwT{ÃÙ« 2&¹ÿŒ¡‚#9l£¡œ›Çú NB2¢Èa05«5Öw~íç¾õoþ‡¾o>S“Ê’æ¶Hö‹1¨g‰`à­3C°¥7_§èwörIy8j»äsËsr€ºÀ†“.#ECH½&…í6ø>ƒ€ú×þüú´ÿ»¿ó7 kœãìˆÿXÀÕÑCjmÒãœCð ŸE£’ô!Ý“äüÉŸ©•N€ÐWéß–Eçœù ú?€Ég%ý@!ùtn~ç7~ŽÀöô¤ÞÙoAÚxQßÓéìn³Ó6ÐTuê\²‰`Ïe»`¿*ùàåòΞHã3¸ï{üö.‡r˜w‹ÂªW>‘ƒÖ¨=ÔK$‹â˜öþÈœ€N6»ÀØ÷Ntyí"99,ÙLà.ÒÕëF ¿Eÿ`ÒÆ«ç:©BõætO‘HÀhøðzþòÞu5]OŸRöª®|º€«Ñ€£sŒéîÌR ¼š7è<œÛùê?̉~h舲3ƒ¼Sž]Q† ±Á×4TTȦ€æÑÌe]Ù0`Œ½x¸—ÍÔÉ=F+j´¼Ãó*éžiÔ`…yÚUó@g¤`ŽA ¤‡~?¿¼jYOæçqJ¤e=Ä…¡Å†–:V¯±hž·Ââ ¦æh"Ÿé.t`Œè ÌBsðÀT=ï‰ì¾co5§É³<”W.È .ÅœQw”›c‹û%>e2C0:}ECqŒ³JÿcF6:j‰†Œ{!®˜Åž¯™¡´µêïTM2¥úìb‰^ZµhãK[rü¤ u¹<»Ÿ·ü¦cŸýy½ƒ§"éÀjâÁÔ³ìÿrt:b³Ö7Ÿ?Z/È…´™·À¡8zìmÂYE~è»È[dzoišÈ[ÑÆ¸b­ZY-£EéÑZ8nÈñåEœ{Q\VühfKV?¸u@ôÈ®–›yMm­6r« %ûZWºYý6Îifï–bžÜx°Sy@©ÿÞ½û¼˜êÅÉuá7¸ÂÃïµúÅÕ1 âUsÿ>7¹Ž‚±'ßêý0mi¡3hBäÞjÏå£ÀÍâ̧ÍÞJq¬'à¯c—ŒÖF£åRœ[ÂåØqÂõÀûΛ"œÇtŸ”ÇØ—~‚ÀÃto¶èœMôé;9ÌÒ!…W…ûYù},篽^,áû½mÞL¤_!_–Üü‘ÔÚ»1×£ÖÑ«C6=:^¿ü2ŽÇ ?Nü’¯øÿéí@!Ù<úºGÙW¼€ï÷õ(ô¹bú8ku 83¯JË'ØjÉ9Ы™[×ÉðÅE»ï8Éš·š‹N͵ŽÏ¥¿-w¸¤µÿqi¯ÒÚPR ‰ê.``f‘ϰЌ^³ÚÄò°Æõùp÷B½jÑ-õY3ܦ˜\ûúõõr÷€×ž–‘ËãbÙ ýÁö£GF•‡~½yÐåÉúñr¾Ï­S`Ö nÚ“tB÷¤ ¨eÌfò›\Ø‹‘›ÊTtOA$âÕÂlÛûµx/‘,¨S@Gµ+ô”$TZ^9ÊðyH“6øÊqeº{¼-§^ÂÔ[ ô½÷§c2ul8pËWbõX¿yOPŒÂ³›Ñ&i5ûYá²™xq÷î¾m‚´ïŸÉÛðŒs®šãl´F£à¾—WF½ï»"¡ëcñÜDG¨·ÙGkfQ{ÛZkê¾KÞåž¡XZ 1-îaPÐÞýùÚŸúþôî“íéɬ…ŠíîÝ»¤Oÿ»$ž?»vï![¶L¶Œ®Zn~Â`QWõ;JÚÕC‰´ÙCýÅ"±ßv÷²BX¬ÒJ%Є{ ¿{'=ÛŒ½ïIÜVw¸F*! ÚV‚»¹wedêØ]j¾ï·Î[¸\g€±Dw÷ŽëõÚ{`­™»÷ž;j76k´p÷Ê û¾ß®7BmÛ¾ïk߸~z DRß÷lø%ÍÚþÿƒíù#¥Å#Õº8Bw73ù@L¶”o2 丂‘ÿ Ã-¯ê¬-…ɲh6Ç>F¹g¯…÷9¸4&Ž-…y”™7ëE¼·,ÁÐc½|ÀN»Ç@øÎ¯þUA?ô§~¶ ŸqÖ4¤µ±ðËø»-"ØÊ²&£|Ð6[‡(Üx‹¶ÃÂptÿŽqw´‡ó€„v9> µØMǦܒd[þ̄䜤?ü¯þô²i±ÿá×a ‰h‹×z„‚Uа ¢c´SEŸÖhÎZâ‚K\µ¤‚Ó}ª4®òr°çÆÃ|. >¬µ{ù7Z,ËÔGÓxnÜg¦æ-cÞ¡¼Æô¦ÉÜ#ùr0ž.’årÆ£æÍ3ŘËêFËåü3¿rÔw«ŒçÎe]ù§9äIÖyn—òþ|¬ekÔ²«P¥YÖÙùrŒô&mn6C~‘9Ñ=vo½¶^ÑÈ?¦Ùú‹iÜ/€C ëd„ÖœŸ|e”õ%M–Î_>ý!´è=f èpãÄ¢Èó9˜LÞpzÆaÁoË"Aðš%¸†-¨¶Ä#Æ–QÚÊšSí„4Ý®l5–È¥ƒÒºÂã,˜ŸÊš¥ÚÓŸÖ·!âš0Ô ϶Õ\cYs¹/QNÄ_ÎÍ”ü…%K]-¤ípJÈCøµPYßPKY€N«ÑÚ–?š|6Ç€^³«¼}¸Zt<8¼[£!XJ‰Å7¦kQ·|—qpA$AÛ¢ûîÚÑÁFí½ÓL­¤(‹\[3 ­ÂhlOîÝÖѦP%âD4„eÕ]Á×OŠ9§Zmˆ›€0;äîòj`ãh~«5ƒ¼BÞ!Gï„LƒgÒÕ²²×®;|‡&ô°–4l5—Ø[{ª²‹d3{$¬2'Ø÷ÛívÝ.[ŒG¶Öš»£{·j#‚$mUåéóÓÙÈ:0ZVi-8ïR”90£;ÊÆmdc´—Ë5ôåa½óîŸökï2£m—ÔNÒÚè×ççŒk,æ](ÎÆD¿È+æ_ ǽ÷Ý{‚±‡µø¤Ýû~Û!¿î·}ß}ß{ïé™ ÃÖ¶¾÷¾ïnÏÏÖšÁº»AÝ; ýº“lÍ2‘O°â,›¹E‡0Fѡʕ¬ÜCºdm»oû~»^l­Y™ån€ Ý»ï½|‡Ö6ÇžXx¢÷çïþþí²m_ÿäëm3¿îêÞ÷îr—§ä+DÂ#·íFïê|ÄŒÔ u2]±€hÕüœ˜æ˜½¶}CRÔA/£áÂ2VŸan (Òƒ²V¦Å˜9(VÛvOŠf ‹Kù÷~õgÐŒÿùŸøã¶,ì––ùÒ{yôæ¿jÙ¥bvÞô,¶Ö©Âó˜nkKÌm¬ö´-ÿæ¸\‰¿dW$ h Áw`ƒ„­ÁZýŸÚzÛò¯$A(^Enÿ ò/& Í ÿöù ={Çq±JYÛc²AãGÿŸ_¾ôÇ,£êõ?ÇA˜òßšX‚~ëXþÞoü¼ºH6ÓÓ»¯I~í@»˜“Þ;åðžõíÙ‰‹ü³çç§ËÖÌÑ<ò½{kFZkîŽhßîþ|»~÷úüty‚\½§ŒZ‰CIû¾÷Ûžó½IëÏ‘’çw3y>Cµ´Ý.ȨV„+Yrb334‹7bßiïÍ #žO†,XÞØS ^Ǭ‚°j)¤ î^iÂè„WLê¦d3¥—¸èy00Zã.õ.ÃÇÁ’j]$ÙöqÚÉÒ•<ª€qZ«PÓ®¨‰ÏR©ÉHjf‘h¢´`ø¬MÐx%\JW¬ºkIìGÕ‡9‡ŒEôZu›¿[óñ¥åJ â¡!8>Im:ÃS7vMk0ò"H‚QB°üÄN™–5ìˆ:LüÀÈh¢G¹ög¬åâ:®3/X¹Ç™©”΂eÈú=,öÕqÞ@?98õˆCÏõyLÁ‚á߈‚å¯ ä!ˆ>B†u´ÊzÀ­¸<èì¨`9ÔãÛÐŽüm¾òxrÊ@Î…¼A §tØ;Z°õ_#<±ðxâåW‘³±pé ÎëfJ`«:ÂêÜiüâÙvIDuä IDAT¾”‡à•‚un&.}·ó}î˜f.­î®Sß"_ñæ>±xŽ,h§.Y'NðÌmãÍDÝtÔOa¾¦v?ž»,ˆêB@ŠZ ,E:«ÿ…Ô´àsF#Xx¹\ -€­%v©Jmê,&†5Š£•:ß âÁ6¡¹Ð0žzi¤£ŽƒEéOÁÇ0^â‘\~~&¡8vìáºkòý"ÂSßNu½Ÿø0Ù0¡îT€‡ëp_®óʳEF‡p||¯²?%F"G©ô8X'æwcÚâ&šÝóÏ/µZ5‘¢Ò%³:Ä3 öÜ!ET›÷‘O¿¶e} Zô«ôdñ‡Çzx¡Ÿ?ç]ïi/ùb?Ù±¿à‰ûr˜¿èçá{ýF¾Çøêã}IŸŒúÊÏUÞrÞÇ‚€\²±*âðü/X^­ìâô\2>W,+î2Õ?e'¶ØP¶¥4@ÌõLϵý(8tM?“ÙR°-ÎEæI|¹òâbRAÝÄ”‚Ò2ê­rÏ0ÛhµqŒ¸_"ê—Eülï°í@píç&ÝhK«±«gur{º ÕÝÃc\Άu ôöˆØ:,–Ùd‹¼ÿ0zÈE‡«±E¢¢àºäépw¢k÷g6kpu8<€8¹ ¶qHDÒ£0ö;š›>«4©%[:Ñ!R”ù$Tu÷¦§áü/÷P\èÚ›Sæ-Eݹ^wõX'2 Ô.9{¬£/`:îÉf›¨ äÆÖÕo½³ä„A½† ì1B˜ LåÈwàºï¬ ˆÑ(ëò ÌØJ2‹{±÷Þ{³¶vI4Z¡×“ry·6æSQ-¡€oÞ•·KÔcrï=HD’ß®úô»Ø.—íÝS³f hQ¨ 3Kõ0  Þ{7ÒÔÄg/T ww%-)CY§¡Á %°÷=ö7fÆÖ tï®XžÞ±µ  »<´Þ}ß›Y07zWâøI¶ÆÅ1‰º ”£Aâf&¨wýVÛçh ¸î×ëõ_ûºmMåhl×ë¶¥m³]Ñ5ê[»tï·ýv»]ñÅNÄþCç¶m€»÷]º„¨OîÁÔ±¸—¢}àP©6ÔakÏur$ª½ X´YÒ§j £—CÚâA=L5m˜ÊòߎÚ+!º8)χS:]V91 X’Râ–g›š4%7´ö·í¯ø­<;¨6ÐÜþæ–·‚Á ¹ú-ŸPÿâOýGÙ7Ôy,e+«ÞqÿÏeCkëÖfY<·ˆ4µ Aÿi™v ât^ÑAjÛÙ¶ÓÆ3¨£mKÿ+ÑZ¼½¾õ“y]qþ½ßøëUD¡ú7~fê¶öÍ&Mï`Nò "à5‰¼‰À ²Ïü?ýÚÏîI/» Å‹WûÞ]RïÖHÀûÞá]Ø<˜,ÖcêNQò]Ým­awìá]F´¶‘0™K}ß¼>?{ßã2þdÛ,mÊ”˜F÷]è{oÛ¶Õ`«.‡ð€GMÎðÃtHC`vh f͵L©¾[˜L¼zkäKÙŒÖ ‘3ôƯdÅÂÐÅ5IŒÎ$¬× OîäÊ)Íkw]cÈT«(Ç&Ì1æmÞKGš~|Ó¥A«s‘ ¬žÙž3gã ’±´›T»sµe•ç÷ñŽA±ýÜ?:ZG´GBÚ„è ëpúÄQÌÀéáËëÔ™L–QÖØêQ‡•u£Ñù1"™¢$MüÊÛP'.”„ÛÀ/pôû²*Ÿ݃’¥©uI{(7͘œ‚Ù²nLà:¨k+€µ’ Bâ!˜QÓª=®—´lKÙÅò}ô %l!xšo ²+4÷UÕC'ªúIØë©zNYuY\s^â:Vùè+_F ˜Sú÷ÐÿÜE§µJTôú £IXí"¾«s-ýsf;ˆü‹[i>ç­`Ï zíùÕƒõ˜õÜíÎúòGì(Øçvi±Òjä%§œ6#Èëu§uÄMˆ³4UªŸCT Y,{bëHú—ÛysÚÜ,wâeÁeu×JŠW@Ù/ïwÇ7:öS”ùõíÍõþ~’ÃÝ95Í'übðš ÷£E|ÝÊéÞ%©êi hEá[sùàÖ¯RS?f.yQ2k•ÏñskÝÌšÿæY*æe\}f3Ê~´ Î"¯çÊ$§'MÇÒô“6¼8ïµz¬G±R¦éèu(̯"¯\¤•+h∇ó¿ ×¹Ër}:ÒÿgÍ[eÔ~GëkŸqØÚüy¾øñÉõâ„ã9)›œÎÃp=Þ ùçm oµoñQ%ç‘}¼Âæ;ùNèZ} 3…’¯¿zÓNÔÐt’Î{åÐ °Nô–i"בæHì½ß)þ’ïïñ+ÿêÞ§Õ¶lÛòê­÷1×>'îÃ’ ˆ`~AHµêÇ,¨`ÁŠ$’Ó§ø°%E05“Ä‚ßCôé?„"Ò‚@òÆÙkŽÞ›…ÞÇŸ¹ÖÞ;ö‰÷¾àÝǽ'ÎÙgý™sÌ1Zoí×ð«ˆÃ?íÁþN—öµøâñ½|ØÌ÷´Py§ï—?YÐÁO¾öw>Ë‹qj‹­ÈÛ ºMÿÙsß1&ù%¦ Ø ïø'9 ø =÷Tá[¿«èÿ+ˆʔ呜]¸{S-ÉâÇÚ#Ti%cf«†w KHÀ?u62Xfè2ÔÓq¾Âˆòo]ÞJ<=i±È3¿0Ïi¢I/½„À2fX“F…oö}V?yˆª¥„Ë‚ÍlÁ¾ãäÕ³pwœ­±¥9nÞ>±WM™ñðåã}Åÿƒ«å£©[bÚÿš¬X«ŽçqB¦Ÿ|l—¸~R¬ÅLæ~‰Íœ¶=±ÁESt÷®€šDŒ^_Õaãt•+‘v÷´Ì»djxœ§9ˆŽê¬&ÐB%œ–‘†A¹n«Ìß+T‚Ý{Sš¶²{2"BHÓYJDÓà Ÿ?ôu丩8îŒìªÍ³—¡u¹3ØÌHªÂ !.AQ.L3Ã=iÐ µ[;LÕ»‹&ÈÂSÁ0Ål,\»ºï]5ÈTÙRÑ ½ØìÝ@¡Ú{kȭ5U“Ù<€#¨j£°w‹AÕ®÷œŸ˜&¨g¾„÷¨2MÀÔâááAkm¡+‚Qj@.²hË VÐëëô.rpšsIÓê4ˆ¢]Sª ¹$ÀȯxœX†‘ÔšÎß:–«*ÃE‘åÞ©Š¾|¹½"8Iš4Ut?)áìáÖ»›iæJJÎY"âÛë«jƒ2‚//_Âý8n=:ÉøñÿïöÏý ÜŽãì]ˆq»¥äES DÍ %©:Õñ]ÓWd 2'öž³_zToªÛ¬á®Ò·ÉÀ.¹$ÿe 6›èdH`²ŠÀÀCØx†«Ú4{âÀŇô,ÆLÉGYväñ ¢PÁYà¥K‡ª6ùŸÿÁßI;™L‚ƒ>˜eq~QàPm€ ƒÒ‡Ýû_þwÿîÖ±ÞF[H—v«5ÝÏꆉŸk~ð0H ^p@#Š:Ø#õý=I°UÇètçé³ßä_ü7þv=¢€[몺 ‚'¼er¦''\Äÿ9'ãÿò_ý9êKˆ ©RF»ÌËœÀá'Cb´³W" ¹a Š•¸¬9#¢sXª‹ÃšÍj’µÓû—Û ôÅ»[³œ€šDä9¸Ê–y¾žçy/7U«‹"fYuŽL;ÕŽeš¾Â#WxdóL6Û*wO™ ÷l¤&%ëâs€ª*É/H›˜A³(ÒL£SQ!^qBî.\Î&ÃaÛWŬí•Ip`EÈRyÙ€<™+ƒ†2¡ì(ÀªÄÀÇוsIJ§×¤O‡ç@iƒé#{ùÅ@ÏOr¿PST­M\–ãEŽþ…˜’P¥€Jc ¢>ñ½xf¬èà\ÝÌ×àÒ0+í$˜&•’¼ózw–×\«•Þvå”Õ™Ž¿±ûˆE’àP§‚rA¨ïû· ¿n0vY- kß—@ÊJep)«;ªþ£ehÇìG\»VöÒ²ŽlþÐ))פb¼ yrkO~H.þIíIóM_9ú>ä¬`Ï®¯,ñ"¤Œ²¦)饰ó¼Å]Ñ©nÏŠ î\w`ï ;þ.å01o`*欣ŒŠˆµ*¯6©¯o,ƒ¹%ˆ¨yÅöa<ÿcéÿ'<ý¸*!ÒÇÿ:vU>ÏIÅ4å¾S;‡‡»Eûdæzp¯íƒ0Ýí:Š”Ó>½f `Olì‹‚—>¶žñ|÷^ÙÃÅùnÅsèo+DÛË‹­á!¦‚#4ßQðI½j<©·ÍV£gIÚBÛËÆé¿¤oF}¶lÍCØJ$ (:˜'ð!BÆPì±+³O“áà ’á«ïh¤ß+6'vȃnÌùÒ¦›nÚågoK‚«hu{ڬ®oxm^k9¨±­3C´cƒÊµh&i ²žÚÅ4ÂFÅŸ‘€ÇÈèÜo˜ƒ9ð|øyRäyD´ßOüàÏð‘ÜÿÆý![…ÑGÎ[>þI¾ç‹æ³Áÿ]÷’—ÝüûŸüiY§á[è»Y‰^˜q©óaê϶olé–q·-òô+6_ýgdî²”ÍÁñ–‚ŸÔ$"¶°¼¸á·>9pøyVë_DåÏýSø‰Ïóêázç ò-÷ý5!ókyÀùÆ;âƒf÷kkÞ¿¦ý¨7þ1óŸxcêDü5H\+j?wñzðYTÏ3îÉÕá»»Ô‡{-F9í88ËGYY fs»êô“n¾²|k>€s·ýüÓ§„ÀtWÖ×e׆Äpîxã;»aæÃ§„þµóª3ß<&W®i:®MÜ¢ØéÅn© ™s yl(‰Œ¥nNÍm.ðîâÍõñÓ¹ä<~xïÒTG2PU‘`U¨BüPefÔ9 ’!XöÂöƒLØ“7j¾®Ô“U ©d”º q—ƒ¦ÚÔNÇøkËo;iS0QµšÜùš‚RÔÑÅ*%[ç°üøÓ6U %=¶‡DL I3 5]fŽ7jTât„ŠØßÁÍÊ9ï<²ÂZiZ&ÑFÈÈÏ9»q8×XˆZ ÜAŠêˆ–š“î1‚‘ù1wOî¸Aû—Šåžv²¢fJ3FrηçþØÆ tÉ‚kLNdvÆ„€ »èè¥,½n1óaÛÅÇX¿쌮VÍ ¾Æ°Bó¡¤|a·c nåxtmrNjN+»ˆ‹”¼:–¦5bÛÝ%Uë´$ѹµWƒ a"<æµTÆáA “öPEÆŠ@Œ§ûö$Èäùéî/¦óÔU°ÈîZòôÃÛC@Å]ÄiIHó‰ZA—£¿Ë âïm3ÊQ ©³€æt~ú†.‚1Ù้DÏ.‚ålæ~böÒÙVÜà»quýŽ!ÜŽ‡+åÚu™›ÄÜ!wLVj"žYìÕù±ÿgÓÎ7¢J/e±W§Œ|ýñ=ŽÕ‡YÊç<¯kèÍQ¹6¬ñùäô¦‚ðYºÄÖiµVªa«˜c7,åé Òq¡ô ¯ .åVÖç:§k¹ ë èÌn’¹६6ïÕQ¼&"‘©ùõGd;!Z”¦ýÅ`$Wyö °pæáÁÕéz ˜rkÞådUÝåuι(§5[:¯–z®>*ÊVÝ:,~EƒÉš®yaí“ßgÃ܃\›'p‘Æ1"TƒûûÖçÞµ|½®WÇsKŇ¥oS·Þ¾{æ*º7þî ̺®ßfÃom$oXïïK<†ªN¯»W˜:d#@Tè+ŸäV]qÕHÀGޝ¥4œÓ¡íå—Ii¹Í½ÉR€vËÿ>¯ã5j„Où·ùÎÿÂå]ü,×ü'Ƨ¿m)~¥À°Oø‹}ª»Úç?Ýëôå§>=þ¢®||Hèþ ôå_ÍÌÎ?pÆóüÉüÉä~þÀì7žT OÎùŠÊMgÊÉc~jVúvDðÝË»ÑEbò‰Ôx#éÿ¢Ùwj€„*2Å‘|~_žÖzСúýèUX Q)¹zñ(S?ÈÔ#Ø…¸è¡â"Lj|~S15CªQ=®* hP zôðP¥¢iúfB†·ÒšmGŸ¡ ç!ÖL#kÈ T0èBMTU6²$€ªÂè,xX{{™pb(D¶«¦&È 6³°g¸³X/Œ³»g¿e«¦ƒ]éb£CähÇq;âÝӳʜÝ@OœÂóìg6ÊBp;zXiFj*å¡ïçy÷~?É8^'yF:èqv;DZšš’aŽ”é’^ý[å’($ó”~ó ŒáÛ£¶Öî÷û¼œ®„PüþMX£zôîˆ;L„™6Õ¨’íÔîkð§€Ð<èiô®VëàBA¯ZÜq13Uµ,u" ­µ£÷~¾ÞÏóÐ’an¥W5m‘= € zïŒp„¡™Z3;ï§3Gæáy¥jÝ»wUœÕÿ<÷3‘ŽdåÑŽÎîQZT)4µO7{Hˆ˜ê ž¥{ $‡é: ΃©¼ˆlå¢L½µ%ObŽW±– 2,–ä¬1{e¹÷XÖfÄ uÒtâ‚ö—*ƒQREJ¿©2fM+BT°ºò(½ÖTu2 ù‚³ÜSsJ0ê\ºrî—#¡ÀäšU³UûËÿâo µÞììÁ78ù¯ü›±ªÖº®ëð<uài#Ð5ÿÕÎ,Âû×WS žé‡]ó¸2U³K ¢s1N¦*áë`¦ú—ïïp‰GuhTÉk´—²v„óU6eägåye"rÚÁc<ø¡ªjM!áÝéî'phŽû9lÏ8Z`0#ÙÝMABCn/fM¿½¾F€¤R¬)€ŠX!3Sv§iœ¹Â¨Ù•p¬³¨j³–«¢ˆÃO¬æ©áf‰“ÄHv!‚²Õ á"ª«>·vHY,#Óé†éÇ­Ñufé¢H‹1ÿ}êÍ[7QNjd¢q†T¢#Ëœã".ì?«'¿ÆœIœjµ*p¥&ä#¾5r4›ª0.S3¡«úy¢T“|W;Í¡¦ƒ†̳aŠD“S”4†MYÊP3HŒ6NîÝ~XÚg•c$KfäœÒªUñ´ô×ý•Ùºa‚'"Bžp.V¹Ñ/ †²×¦ •£ïyûI2AàÖì0S˜£§iÕ!’k›¸>û‹¿³ \”¯Ôô³½iIû“0—Ú!Ù|[ëp*ç7 c…ƒ9.˜´ÎèÐäFï(5é&´rÞE*Ëzôº_­4V̓ öåTsögn$³&mg°ä£šÉä»°^ï06ãQ¾ÃŠÄä`íîNzöæàú+r÷nwIbU\$DnÎÌÓr¶Hì¦Z•XÀˆ ƒh¹”b×ÂÆ„o}x%€ê œãÛ³üÀuà•¦ J®¤ì÷„ü‹_ûÙt|1©¾¡H½=À'LÒïÉž˜l.‘‡×†Mý ö þ¤l6&`ÛK¶z!”+í´ ÔÏœa\¶z³LýzÅö»‚˜9bùÏ>¿h¹£‡¯Bì¬Ú•9`ˆhL¯õvÐ\_,dèΑÂ…x³£Ýgò{há%âǾ”xAâ±´®Ø*XqcVºÏ#¶æ‹‰AãQÅUÈ窨æ^?¢§ø?8M¢»bUn¢¬Ùüš*=V;ìV<¬KK&Øò1smpÙZ‰7B—Ÿõ¤xï­ X„réÈÅG7®I–g_z™FÆìŸjÇx§‚™N»ÎÄ'NTæåϘyô1uáUÈØƒQãbÈ)^¸Ùðj ¬©P”\®âí–ÔÌ8š4ÊE‚FññèÊT„$Æ}-J÷J\ÓbU‰ð/_¾Xk }}íÎó<Ѭl½"ªqžg~ˆåP“"=ÁYm܃™Ë+§·ŒY£FV…3I ’•#Ë„í¸?:1å? qP”J¥*…0S, 3hˆð”ðЙ„E@¨\Ú VÓ9 ³¢Šð_A¦¬ÆP/l8Ïç ¯Ú‘V“ûˆ_Ž2UUUi­\£v1{lÆùb°$ ©D‘È:‘ÂêÍš÷||ÌL˜š1ŠjÚ/›0·ºmE(7×!=ĺiÉ`TžCp(Îd: Z00›â7¶öDdlSÍ5ÓÍ!Ø‘6UŽ„žV[òKBúP®: ø3û#[É%¶f”%*+°ŠB$°´êG‡5f‡°Ž#4}îáf“,8Þ[±<çbF6`ùÀQÑ.‘{»ŠWÖÇf»0¶ÛÕÇÃvajT3lq‰)N`Ò„9¯wå ^º™q7c~µMèc÷/¶ÉÒóÁ)bûĶM?ÚEßÛùé¹ùÅŨ¼$÷M¾4$.ç”ìÒ׆»^âï⸠:ƽ?sð’<@›žå<ÎAöþ‹'Y~3¼â#-æÍÿ÷ä|`òú‰ú”ÖŸ–¯oÅ<–¬¼•¯=hfRîG2ž¹êÓ« IDATQxc1N‚ÃóäôªdÀ[?t›rÍ¢’zÖë?öûÀÖ<޵*ÈüK8«5r8wUlÛfŽãñ†¢€Hy&ZKX²×ü1Ò¶³}pAbÌ–çŠ:ÌR¬AUÒ±Zïs„ÝÈ ,Wæ€ûWœº—¯)?+kP¸žeÃÇ+¶w¿ÀpåÁo)y¨q3û˼i¤Éd')ŒÛ>Ëp¸?ÜìQ/œûAåNØ“-ûœä)ô2Õôrn.\7«åE¶Ê¯M‰Ÿ„\âÉøÿ”¡ ÛUÇ!fÅ/T-+"i:LõµÀOì¢]¯æºB¹ëÐçAÎò@S]\ûZbù2·@Ç–¥rs¼ÍÜ嬄.ŸåEŠô ñ±.ëê¨]ß“^ÒÚØKqž’Q]M?¹(}ôO“Lp (¹ú 1Â#Á '⟠MGª2åÅtA2û Ë  Šg!SHˆ&ªÃØ1Ïy‡ü!*&uU%ðX¡[k)‚Ál ¨éOîOÝ˩鄬VÒ:\F+4² Ø#Fëƒóbzx‚¬U5‡H¢¼&O<"KÛ!~¿§_:bZ„!ax «¶v´6¦jní€HïîÑ="•UÄÉ~ý}ñ$„lÖ´¢ºd0ˆóü&,» ÆV7—SPRJêeRó=´©e™m9*Õòn÷$o«i³ægww(zïÇqSæO…jkf¥Î+Â׋RKÛzX@ëÄ’HäÁI xx z;n0(ÔÌš­éËËKk-~yRœtâJbd^Ã#ør{±ß)TMí8…QÄ̼Ü^L-i? ×2h~ŒËuiÿãׯ_¿½ÞÝ=è£jV‡¯¿YÍÉÛGðŠìmªe9Þ«*ʬà1¯6´±M…¼«s XEƒ˜Y¢ªsbƒ»câÀU~åš4L·Bƒ¨¨¨8¥3$?žì€ˆ¢®—oÞ9dvF+MáÔ x¤*Ò0¨ßClíQ ;À ªâÎeÜC6ahOSj e!Ñ-ؘ֬Ìùšvx `€þÕ?øób߯Ñü—þ­?¿<™‡[P`4Ìä òÛüªùGº‰ÂDô.?Ôÿøßü§ÛCRƒ‚¡33OzyôÔÄtº·WáJ]"@.¸½w!ÃYe¨€š5(¢wRšéè«¥r…”³QN'H¼“Œ,5—v´H=˜9"="†Ûq¨¶.'?_Ýyž¯$Í bC‹ñ¹Ž"8BíPÕê ©U´ðýC…– À$zämá*„µÑì›3Ãñ Úã´”kŽ+o[—³MtGn ±lÂÔ.ÁY5”×½d˦Ïz ºàLÌ}};Q§÷-°`Ç—H© ÷@…Ó2ëãHž!‰HA@Ǹ¾  ½$GÓçÂ¥Í×ÖI ß<€»ÞË/Å;ÊÔ—@ÄK¢¬Ñ…×ócÀ©†24ʃ†´IM¶š NOŠS 4²@Qzq€^ûŒ0øbKf*T*7¾×®Kæ³olO†ÆŠzÿ³É»úÑ¡¼€§×|¼#Ž¿ioV%6+÷xpÆ„„<ÂØ±7D.J«ÛcŠÿru©ïì P\K¨R‚V™Îú„ ê³@e¹Ðñj¹Qd–ÞRe¿EyÔ½hµþ’)´*0û©VOM²¾bº¤ §¹•Øìþ}»˜úIÁñFÔVoO{g¿ˆ~G•^—Mâ¼´Î$ˆâX®ï’=ħ/vúªD»`¡Ðæ~&¿¤²ÛyóÕP.Üü«ßÿQ/ÁÛ¶Ë«çƯè“÷cïN–(·ñìEç,V“‹aþ¢øl> jüh²ñd¦Ò}°÷¦›|Œef xã/Y®ÿÕà‘sZÝ{G‹7n£Ú´ì.×å!ghçÀKy¸öóýžË’NU\ájœ]'Äåbõö’S!m­:¬ÎXÏÓxÅšóâ/R^žñÆ«¾"‚85úyX¨ËÃtZdjáðŒÒÒ㢠ïý[·ÀÅÿ½UJlKõâз´zÈæ®;¶WÖÓú•Qƒ5Ù]]eºÆxêÚ?å°€Û3iÒÆòRÙïÇÇ2Ä=˳V‰x£;ãÉÁÎV pg°ŒŽšK¸`B¤××5r婿q‰V€†ÏéÍ7Š ¡iëÙ`X²Ç eVóý~¼aàXÒx-‘¸~Xx¿Aösç§åØÏÛ£¥Îâ_ãÇò1vöÓŠ/?!…}oH CžàsÄOô—x ø•.“_þ"ùÞÀçî ?pY‰?5 ì¬h¹4ˆ55Dlº‰$8Q^.:ùA4¦a­Äž(KJÕ­Î%?†˜Äå›Â¾Mĵª)0 õAÑÜÙºƒ1œä€/KŒÊ%A=ˆxògdö~ŸýFÔ}ØÙË¥6g“¸1ñtWà §v‡'ç$z§ ¾5 È#‰^LEÏ_0Þ«äÁÓÃúù×ñ` u¤„GÀŽÜb¥ÄÇ51@*.TºB•TX¨â2 ¾<±¯jBU„‚ØaìÙÊô’zË"T¥PÁéÙ®)RRçðC§f¥dDHÁ°I™ÒYsž,‰b¡SMÕCÎ¥"HD„xPoÖªh7uÚ °ò@Ê!–`þé!DX: Ü‹´bF†š9Œ-ªÚŒ$N÷Þ{D˜Àjz;šá<½¦&É€7ãrÄçàC¢'ý&]ølÇa÷û½÷¡õæ.‰ bufªBÎÞõ=MuA7nuÒŽ¿}û±5{¹½xÄ_ä›FÌ»›B0Í8ZÎMYËÔÂ;×^ xèôh-"Î>EÃÑNÞûý&üáë—ß;{ï¤ôóôÛ<æÁES²I)Öí鋻$*Ô£®Â$9ÕÑåV2S„ÇqÜÚ‹ÕïÎU«E,$! |yùzö.ôvæfæÞ!¢f7@á.j·—ãëïìþíŒð&KCZ#´ÂÒCa™`¹½¼œ¯ßÆQB¬^3‰!­ÉQVBd»&)9úªÓÍ:Ifeë8îgå –½n˜@%C'i5dixË›™²Ít¡Í3MȪšCŒÙÀ¨{ˉ/µ„•ŒZ½fÆ8ïX¶Ó)I®*8…AÍ*èá Uy{© C]•Á¤Kˆf`ijZBz‚œ)¹S"D] 0déæ3Ç©:„±"iÅœÐîrcøã•êŒZxþêïÿÇ¡uƒÜCîßÎíßù‡yxžTBêX+Òyí´ )}ýâÿ_ÿG#ðÎ 9›$éÚÚ$ÒL ‰\°4ŧÕÕË͇X:ê0B末{n“öuKD%ÜQWG™Î…ÒÏá½{¢©@zïi! EÜ! é§÷ž;jÈqÜÈèÞÿÉïÿ?ïýå奙ýøûó SÕTD[«R[µðHO>’j¤Uâ“"Çø/¢Š£Yˆ0äEU(¯þ-â*b †sƒ=$ÈVçrã¢],žRÉcè?oèm€Ä”¤ÜmIM¸EÛ¼¬Ù»ëÔH WÑ+E¹µYל{r$öé^ ™èˆf”h°ºT8O¦ÁíOŽw7šÜenÑæ„§|!óâ#LÞ¹–VÝåé€JÏ>V Ö+GØŒ1àA•`¤²?ž‰¼Dýå­é§jjB†“•œâT±KSfŒ÷¦ë™VþÓ\\Ö—?ª*£d£Ü‹ŽàÛÅ’IÊ–\—M[º¢–¹w™o¶}âæƒÍÜÔ-îéóLZãÙQ§<>Àȸ¨FSôôj•—µ—§°C†©CT4ÖŸR«¸2¿"mŽt8†DØvÞr™HŒ&˜Sá©7y`™ññºG¬Vµ°hlIÞUÙz•ÏÞ´)¢†²óO8 *]Î:Ûí”ì&^¬x¬)ÏĪ/…*Óǹ¨“Ùü8–X9îÄáú¯V“õèßáôúÍ<6½WÛÞ2N>¦ðŽòžoŸbñ|LyøQ|žÜg°5¯=ü…Wú?ð:ù)hkƒ[Ýnó+àMÛ¼Tx<^CY€Ñ¯—ƒëÜO3¯N.pùõF´„WbŒ.€ V£ôæ8˜ÐžÉ¢cÛ‡?ñ6C¨­œ_1@ÇtíÖÙ–‹–’kóaR-z™%}*A ŒÏb Œ¹ø€kVÐT3X6RZåé*—¸drxjôØÓQŠYÓ0sô{ÿõR‹7&~šßSc®©íø·ÐÕÁD¼}®Ëq¦´ôdYm´£"W¶ø™0Y7(žÙoMë®0‚MÈT·}z©õ£mdª&¼ˆGÏ2èîÙ.zÑË+¢dxÆQÔy}öðàR‰ËíNÛM¨¾Þ1…åC`bí»÷i÷evpÉkàIù€‰;Bèa!ïPÚŸÇ ?Õûû}r(?ç¢æ'È_Sýž?þ!|½ÿ.m—ï<ù=_Áo–ÀÏûcŸøa=EŸæÈ¡V`~fvy™ˆl[¦³MÒgÜ u±„۲βªJ>Ì öáʾߺb£(×IØú†{#—6@ÐуXe•HXÿ* ºîëSñ5E ß0ÛóÍëµ½uwp†Þ²Ýð1<Çk9WÞâMUÿ‘C÷A\ï£ r )6»‚îL‹Ëÿ/¢M)ÎP‚g§båZD¨9ˆÉ³:èT8üSFmìÖ4Ç7ª¢Pip'fû®¸Az¸æQ5)338DL˜Š˜­>M%£ÄQ ½LD‘ÚIK-Gä #¼‡¶€ A‘ÔÓ4—ªAZ—ïgH˜6;L¤‰ºzb*ƒ Bņ0<ÚÒhŽÄ¸ä.0ÏçÙ%åŒèa?|9¬)‘ƒ…’Ñ74)îieMÄq ÓeHSmÖÎó¼¿Þ!jªüðå…UÔË‹¼ƒ‘Gò n*[KŒèwzH|ýòõ8¬™öó~?¿©¶¦6ðñ9Zaä`°š6ó»¶bõ+Î~îË»ó M¦€(Ñ=MýA9»7kE‚·âC7³—[K®^4@´€B ›%HiÖÆQXa«« KËÝ]öÒ^n/i±òð !g‡½º{ö›¦Ü!ívP$ñh8DZ³lðÞOŠª¤˜6=B¼îï¢*bÂÿ¯ÿÃþéž$iªæÒáˆã8ÎÞe`:UÀ3Ì‚ì-M¸¹ÕA²˜võ¤—>;W7-©†3kó;A@mÝ>i|®fÑ\ø‰ G_š‡ÒNĦ§1…ÛÕ]ˆä±dŸ‰Œ±FDì0aŽÍëe‡(¥†$©¾9Ï{'!r̦qWAf1LÎY),Q(¸Äpé@x94ûh5µì€*¥©e¹Ô«*fPqÿ†vð 9‰‡H€¯Á[ö”h- &«Šù>ùù­êâk’m\ÅÝ;¼Éм:Bß,h[ þM(ÇfPÍŽåÈ-AØüÛ²•ÿB¸±Î'‘!ô×@W\Ëǽ0á1ˆ›ƒ™#T*u'f‡î }\\FYM¹õA)Y VaÈ(J§ìn“ZlkÙ¯7ªiP ‰`ÌGÔ–7×üäÙɨƚ\k­K24>– ×>ZYî?NxòøNð ]ÆLÜFl"6ˆÄÚ3_›ÞWô\7ßÿB6Œ‘)1j~¶lØ&éll{\ž˜?âÙ³_uxY½3;KHãÁ4Ü¿ žc[Óîe(w™4lƒŸIÜ‚õ> ~È) ìÂø>@äÄ.þÄè²&/ÄÆ‹Çe±Ÿ‰@î•ÍkÖ†} öÎ|t“þ?1¿×ÜÈ_Hj]­ÊüIWüoøåµ^þr?k缡µýVÖϑʹ¿œoñ×N,üIåO¹àƒ(æÛmÀµ°Ö3"FÕþ;k-¡²jG—`«q«øàR£üà©BOÊô>}úx`çÌÒw†ÕRÿUËé€íî«è]1¡¢`Ë\Ý-Ë'1†Q ;áÝŠ£ÌÝñT¾2Ï8õ; ‰˜‚äFRŠËšðð\¸4|MØç:…lh ˜~¥Í^²"gžýoKÿòùRëVÊT„Gø)ÍZJ¸AÀÅ)LnC/ßeîžê€­¦)t25ë§b3´a;FqÁÙ|G ±ã°£i?Ù£{ïá½GÑû™-é#©CFt·D¹ÔºþîŒ2): ²4ÁûuzŠÂëë:jºL­eE¦™–è!VNP AwÏf'-k$½stúR²ƒ" †t1C;nœ§§ ïîd¦øòˆ޻¸‹5:{?¡ÈyIª9E„»ˆˆõóTÀÌDõ8 ‡0ü<;MÙæîçù*íH }`}=:Î2•; ¡Mgаv‚ŒîARUUq?¿µöCS²ß_ÛAê¡eǔԺÃÃéB<Ë€ Õ ˆš%Y""’<îáqFÂvòR1U´tirôSƒ ¹éñŠ0µ¦íhv„‡YPœÚ—0Üï÷óÖL›Výä¡ÍTÄDUÕòƒœž¶v|ýòÃËíÅÝ_ïg^0iXŽo¯g?UÑìä8ZD¨k–WCÕšÒã8Ž#H~…DDx„Ç8Ú”JM£‰©eu„e`?/tD„k6gb9‹)™† WJ„‹1¯íÒ(k9U£ÇP“L««SQ×¹{tÊ?UVWI°s‘Ò°m‘gŸrdä‚é®ýŸãY*Z”¸º«Ü4ßißH/ V•¿¶Q)Ÿ~}ó°`éAM¤7…ýL9ô€šB¨ÙM!A ê96Ž1·l€ýò#€aUöœ“‚óø(c9&âÞEs7ýýï ‡åQgï.°í\«ó‰Dq€=ÌLÄ‘ãD®[NªÈ_ý·w8ó"g–®³”6ùk+Ñ,b¨Z]Éb’¼eT $ˆ*_M¬Y ' ýŒdÅ(©¦Ð´ZŠ O—ˆ ÀS±‚µD§hPÝ#<Ȭ³EÔ@a+«‘CPƒ¡­) ½œúŸP¯­òÑCÀИ‚{*§¡¢¢N«®XTÝ ³|ùųUM@}í3L³|tç “A­ª˜BBúÅ'd;ý‡ºœ¾CF'£jZkÃLz]ü2h(Zæ!HÕ¨g²>=R‹VÍ(sédéÿnÈ·›Ô6EµœKæU*u8Ô {£ÌÕ`ÀÖ1²ö:<“2Ø>ºï(ˆ^UÈê…’f&&á>tÌgëhQàEy˜º#Ë>ÿ] âÇP6¯òºüëËÂìDΧÚlG2’t5÷¬²l±Û?»:jŒ1'Йn¨¥jðºŠÓ[•ïuço½ç@Ñõ¡Ù˜!à¢JŽVXjÄ2ê._ÚtâŽú“j7ìÔÕõ."Åý N¸~-Ù\e»òº8˜ƒ÷1†¿‹µ ¢TNÄHA•9FQĶ+üg^Ùâ‹Ùä‰Ýœž7ñÕEJ_‘,×óœLy“O^M›ZùªÜÈ.(šÏ¶§vàQåÃDƒ oŸŽ^ÐXN©ÅŒžDÃñs9>^¼þ0 à&Àm,)W´Ï$ä1Õô¡^hë2jƒÇ—¿ûÞ·Ò>XðñàÿÇG'g|h']œ›·F ("LJaqÕ¤E¼ísâ3þäÍC<¹kñë׉˜¿°“NÜØjn…¤ö‹‹lè¤Ê‘CÁƒOµèØÊ؉G\=j=/½r"cV¨Uï'[ÇØò`¬éKÉžö©‰NhKMò©Ðšëç`0ß6X0rûVñèFmÒ¡3`'aŽ£fhÙÄöËf,ÊU<µ7iÈ™‚±2Ð,qà±ý“|¨‘]ÆãÎÇ"­â¢Ãòº|oPð7‰ƒ+?Å{\ÐÏÜø­¦™[Éœûå«Ò+´†cmäZZ° Œ‹ý8þßÊ’l6Ä9TŽîí«ûž“!­XìÇc&`Kl·ºò2Ú·V/åÍ|ø!Ï„å}Z*þ\¨wbÒ ]fæÈÜîãhrR–“}Jód½Î0)o‰þoŒðiý†Ÿý—üCØWØÅw)½?ï/ýðOí¥áß÷óÿX 2þÂoŸüø…úç‡3ïöðOXüǼðF$€ïB0N]²ÕÅT ìãšO÷þ‡Ì>ûOCa4TäïÜ£qxúÌT‚gÜ!žðñ™Æ+ÿ¦* jf 9=–ÿbcêÈkU2dô€aá ™6]?Õ½F1ö‹T5ïô¸‡0¾A‘x}Lc¤¬âtAKÌ4QªØš3ªÔ;ū͸JÕ«¨É0ó„ª0ÉÁè/ÖÔÝ„¯–™!ú"Ä=ï÷îîéúO¥Ü]Hˆ™%¾@1±¦uh÷¨¦¬Þ¢™µô|§ÿp÷ÃÃ45ÏnÎeIÙVƒwgkÉR"Ô: ¤’‚¢Bq¶f-ÚýÛëÍZ’ƒ¬)ÀOîÐ^H‘è]uÜôÔ2ø«q8t Ä{Hª\"ÑÝ͇[š`3Ž­y;ZÎ!Ì w9Z ï¯ßÎjw­b6h­Ý3ÓÑþʳ{‚ë_¾ ¹2ƒ5 áCf—l¸´QK)ª€ÏÎHˆÐL›ÙqG;twwÖ„TÓ—Û‹÷SÂL@›…»G˜  ×Nÿü˜X˜õX¼©NÕ:ð ,zý‡a†P“p‰Ñ Fir¦ FÌ£3#\¡ ÍÙ¥vþºLJóvV¨M{·sâNÑÄ"£ÄðRÖÇjÍlG£Àls4ŒìXÈgËHÉZvþ´fW>@ZrºFÙï¬uFa<¥%”&)6Ÿ$ ¦ Xž¿%¿wayÅ+¾¥ >˜5P*åÛ g9Ž&lÞBá–ø@Oœ| HˆŠ˜©0š¦û<æC¬'šÈyD^ ¤Z¾–yX©GPS…&Ĩš›yžÉ¿`u_TŠž¤{QÄ¥@¨±b×õýzI»(r“¥üÊðCÈ›.s@*#Ã#T¡ÇíP×óþ*"¦MTÚé­µL‡(p´–2ÍWÀðkQ?äïÉî¦ΠÇMÁûÝU °Bªš_–*bس†F¢XË8ªeü°ž–„á5ݽõy¶Á1’WÕ¥ô[qRØÅ³Û9*ÇôQ Õóž•A>Žs릹&ÐB&4Ém1ôá" ^âõb j€h„ÈÐåÙ)1ÊeøÏ IDAT•1†/m«êªøŽQTËP-8™‡L*øF1Br{Ó“5&, bB ˆ ‹:ä8Eoé9ò-‹ò ÆOƒÍ²ã‘„Ÿ¯-F1ù¾ñ1”—aÀÛJÇå½Î®J?ø†€KP—Àô^SAì…×dõÓkÚ½ÝoiXw'æB#{ÃÆ‚´¿ÆKÒ&fnMß—7Rms ¡Dzjš“Þ³r¯o¹ Î&Ø« rؘ÷äæ.ç ˆœÉ×5Ïñý4¬A(â,èЦ’|pt/€R9&Ÿ¹\2y:³¸¶ø;àæ”0ÊôòÄc*Å­.%¯/]坨+Q’ô¢ýïG¿­òe*ë+P)÷RD¹œ2›Ï;…¹4TÜpŸkhû:p)ªà…'U2ûð"BFɈ½–Ž¿‹ê;ùgŠ7|3;Š+ñ°a÷fü¨ÜŸ\ôbÅ|6æÊ[‹ §Ér›žae8 ë!Û³~÷×oÕ´+€Y©k¨LOsâú&¨ái^É}ì©£vG.¥Þ³Àˆ›©òÂÝ ¨i¯È!wªüxŸ;Úy—4ñ¾èÿ@(ãûÊÞÏP—ùS+>’1Mû7ÐPù³þҟѦ|‰tüqÄáßào}·oy,ñ×yýLÅïQÍø«C¯~þ•O|ÏûÜri%Úœïs4ƒ¼9v Iå(¦Éƒv!‘fi‘ 5TL,Seܺ™-BF^bíEÀ²9Ë¥Owbmc¤«,p>÷¦í’‘ŽXΰfYÏ Šmê°ö¤…1$ØŠãW–a=l'ü‡›á(×Q½]d{Êpß®‡ô0Ón±ˆü]©IcýKnôŒÇËTžj¢ßÄ\=!€Ì2¦!0&YY•-…ÐÌÔ@§ £³Ò­¬:Š˜£†0õ·•ÚƒšôfªˆGDïAµS:U-}p­I¨q…9Š„Hç '7$ÜC“¯¯9UF–VœYÿØOU¼óÒ¯¢Üwܼͫ蚣,5·í£ ±HĪŠä 0OÑšíTЦ*âJ¹MÌt¸“!´Þûý¼Û`U›5‰…ÞŽ–:dD ©’Âlj FNT5œå  FªfŒ‘v˜tXÓ£åWZ¢˜÷³‡G;Z³§Q5v(X‹~äïqªÿøúªªtÞn_2¾Pfî:¨‹©Jk¬~ʈH«."Õ¢(¢ Uõð„Š:pž§{×4³†¤5÷~{yaq¡¡°ÃZ(ºûý~7CPTmøif/_¿ùúú­Ÿ=ו~öÛí&>Éu<*à“æXÉÄT#âõõLꔚ¦ã3ÏúÍš©ªÚq´œ.˜ÙAºwM‹Ô ///_¿¼öÿ?ÿ¯ &¡ã¼6ÎFy E¼Þ;päZóã?þß~øgÿ†#ÝÔ%PÃÌ:»_‚ 2ñÞ6–<]: ¼1¾¶&ÝIÍEW‘¤–lÆæ ÐJ$)¢4;òÖ‹ˆÝ—„ÒBÞ“m¼ûnf‰Ì8d !²E#‡¬æem®ËÀÓ8ØŸ:Ȭ:V­­)ë Ñl”Ó'©¤Ĥwxš¨eÖ²¤l ÓáÐGÑ„‰~255ËY )ê! ³ $wÞnGêxž'ý~ÐŽñ U‘›!fbÚ iNÏI‡ÈÝ%å/·¦U ½MPæƒÈÒ/‹IQ]ÒEºûB•`/5CÖlRè‘ù ‘„¦53w÷ÄÝZNëÊ­›ŠIU°6˜K0˜¯lÒ® Æ·. ƒšÑy4…ªŸwQ8»7UU·£Ÿ!×#l^s£ª<¿à˜‹m-îYIj%ß²|Ý©“‚ÂáS¡Ì vBÕâ$Îl)p¿dxC\ƒjÞþuàÀÒв¶:åÍ*áœÖäŠ#(Šp  ·9 ²¯¼‡W¦%ÕÚšÙ Õ¨A:O¾Ù^9’&¢fŸÒ0Dèp> ‰ šMAEMT\RÊüOv´ .HT1lùè¦ÍK¡’´öe¿1E} ΚñMSÊ”Î±ÉØ#q °UÛ¬GaÝ>ƒ0¤CŒ™u ã¥ÅLš®Z,ù|Ó¸äi.x¸<L¦Ø§cz)r-§ ݧSìÌJÂØÜ£;®e´q^ðÙ!3¥°;l,“ "Â>;6SZŠ9ÙÍ–cóµ]Ó7‰¡³ÄPC¤ TäÈßÔ6¡ºxƒ¨%~ì¼² "F/æDVä+ï«Q“r9ˆˆô¤rñ:„¹Vñ-6@šÖÀK¸™ŽCÐEšÈ™‘‘™á˜ äm§Ž±…ϧHÆw2q„ A„J•!Á( t°Y Þæ\‡Â"–%û:ËÊoðVih]üYs'\įY;lÞsR¬Ó^]Él¾©l‚GmþÉ2øÀíç~„ƇB6Ë1®ôæwÓåÛ¾ANðÆÅ#õQaéÍ`تÄã©E{÷GŒ§³¿K¼—wZC—ÅÅwâôŽq)ÐáU‡Ö³¸Žhë2Õÿ•j]Àô‚üŒóplZw®L•ep-h¼vä¡ìi›œ«MŽ<£¡mMb„-VkL._ ‘ô Œ­ÊlÅAn&WC€l%z[1 LwÊ“×ú§óқؤ}…°Ãj)¤ŒÎbŒÎŒÝÈV?fÍdEÜ6Ä΃ßöïåŠçUÉ¡i¾Ù¿ÕyîVY‡e½ÙL““3îñÑWœ†#lí„Ê}(—«l®ÿ ÐV*=gÜë³×T„Û„Tv¼âµ·¼@ˆå\g‰kñýóZ3ƘuÿbZþ9M„:-¬x|Û×–ðwTÇ>Žï’ô>3±i}üXôý´üú}Z诣êò'Íøïë¶o ø?éú~&ªüæRö¯§Bÿ$êâqÆ”0øõ?8|àñO}Ï·ýÇ›Y|œ x{°·d„<*é4gÊs ë<_@r’Ör<¿ÖÂñˆÆ •ƒ‰á Ï#²¹£¦‰42\Ï:òÎfÖóFertxíZ_áß½{` ÉûêÒËK‘;ºàëÓÒÁKÂý„„ ô§Ÿ²w==}dr•7õÿz‚k[@å­²ßçÝéóxï$$æk¶PAFgW‘GE›ªfU7mõE¨,cµÎÖn:Xð¥a>˜”f’µRjM<‹‰RŠ©ª‰w ˜B#õX‚ šjS9=Ü]“ÒF£sdœ="'R6Ü=o™w3–‡T•iùZ† •½žNñÈê»]„lf¢Fï§—uÔrz‘ÎYrå“ÞfÍÃ+©ŠpÈq´R¿ ~sçjjfÊ`žÇ?÷NZ³fžԤ޻‡€DÔÕŒt͹—Ç#ú·Wèy´£µ[~‰íP¨ ”¹ÝnÍZ0÷çq¿ß±p`mÓ.Š˜YæòÄjf©"F¸R©c× U³©‚¨â¼Ÿ€·SÆ£P‘Ô;EÚqˆÈý¼÷~ Yr§Æý–ŒH¢G³ÖŽv»Ý^^òõ@Aº‡ÕQenúž~J—Ö^Žì#…ªÐ½ç„C¡¤œ÷{DjqÉ’‚BÇh'¼÷$EÉPÕˆÈ ½w¿PÂH’½¿þÈ~»½dÁôæäÖ4j#K+°Ê0‹ 420OFåßÔ`$‰>¯–ŠB`hWé†/PI¢±›·5ç¨T¿l§wÔ¶”ÓN–Vúƒ5±£)‚Y§È<îêÌY £VÊcÕ<šÞméãOåxÎF±åh4(‡3®B<‰îŒ,/äLÑrªå Ù#B¤©¹dÊ"Ë#3×D5˃‹†Ãh뉓×I-‡wælƒ:MfL$åý”P¥Ç­)D~<ƒBtG;¨ÀfýýR€rÌ®Þì„]€í!;ð'ŸL“¢>œ¼:†FsV2³ó""žH4 ˆA™ˆzU#™! ­Ÿ/Çq43ñSµÔúé+\Xu ¨;P·­gkB:{¸ËqT%·VåGËrŽ÷oÇ-µÚÓ%¼ç+dõµ$ìJƒ!ì^{‡XR‚Ì$VVíˆ AÔÚ¯"ƒôGwÏÛ°LªfJTé'DNŠÒAm ¬_ÛŽ7Xƹ˜3ŠÓmš#ï‚æsÍÇ.¦&Z5Tu€ÞáÄÔu(¡Q½ç9w䱯­å°è …X¯‘‡FPön™0Ç!K035•P9|"Ròdl;–"Saói†„Š@5†&€ÍhY3¼@K*¨P3f¨P¡!™*-ƒ7¦—pfµU|XýÔÌqŠj©Ûb’\¬,6^û×ѳ04Ó¹ëq•“ÍÒ³w`ßšqÉ“4YR c8c§¿¦–¸©W«UvæKÁö)•›1õꉉªõÜqí`É)&ŠY‡2⫎v‰¸\:$¹a/c ¢ÅQäðú´%fny1}PŒkg^õ*“¿>FX©Í7A¯|@õ‹H¯3 ¶Ž1 løC¿/äÒš¼'Ù$ß=h»"·VWAATWANuUº$ UT¡1¢ ](â6ÅÉÙâSW«Ç5•ˇúÊòÒÔÍß\Áç1}\¡Ëï4°Õ+¢(/ÎU«¼fI.šÿr¿Ó¨;‘Ø 'Eo• 씡ÍcýÔ±þñ™ŸoŽ–Õ[.rã•ù³(?¸Z¸°Í'b &|v‡nv¹Ú¹WµÊvÔÙ¢òì²³üyœ]Æó{ORúF¹ÂšœT¨·0Ž•8\8Y&oÌC›ò¸X¢®®ÌP–ñnnå1Bæ,¢¨Rî·ÚEZ‚-™Ýnó:C é_×è0’½%‘ÎèRUýŒÇvÕn“‹-•µiÙÕA2\ëõòjn)@_ÑådVmaÁ|¸u ¾×rVÏ/Ã8ß¿a¸ÜjàÀ½›±."\‰XœSÀ©˜¯xVë{ ÈA,|÷Ö#]'ËíµŽÁ!°í4GÉ:÷Ú[„”£ÂW÷~~½ÝZ;-SŽn±•SP1è 7;EL!žG#zæ=P­™ÉXÚlPLÒˆ{WÅý¼û7ov›¦L!4$¦Ý;Ǧz¿ßM›5ûᇯXˆÑs*y¨ /º¹@E ±4lEÌ«%˜Q¥„G¨ªFŒþµª]©ÚBÞ¨•”8 £òê¦[I`Aå‚G g«Ç0_E^Ý3ÝÞZ³v v¹—¯Ü²Í:eUÒP?8Ø6{ŒBºÀB„Œ–ñœêiW-»Y–I„çwËO3ãÞ5Zœ qï"ªM‚9õIϱª† (/â:xv;¤åZ­Çƒn^ÝœJ«Éq(=ù–·p´vv³’ú“ט‹÷ªØî’}¡Êoäs–û!Ë`®û„d›;,ãÛºq{¶zp.[š~Hol½Œ9YXuyæ˜u\]Ué6ƒ;óF˧ÒÌ{u ²gè»{% Öù|Vì„×A\û­ÄúºDýì—Êå!î³Ç¥kr‰mý̯°öìåò§€Wá»ì¸}LìãšcÝ‹U!‹€SPàå®Ge—éoÐMÒ뿜ùrL˜W{÷n’ùt|éÑàMeçLÈèô1®+SûÅbs¢‚¸óž¶âœÊôVé@ÿ*~Ö‰€ÎLçü6X¬|ˆ0îõ”œY¢-hu×Ï?õ_0¨ïµÊüŽ4ÎÎÇté&»÷LnòÉmeüTð\) tx¡t£[ÏËò3£Ékär7h~G⹯Zü“êí÷¤\þ1¹÷ïµ¼ãe¼ñw_ퟋñ›ù~ÑñoL þ8?/?ñÂþ¬ªý{[þS4öÞ·Åw_à?%uñ×ü~ø#¿ÜÃ;ÛÐ7ó/±ÌðöĪ\]mJ&í¡Ow|0íø š¹sÎ\nz¡Ð3MX¹¶X}{´žpí'AzÛjΦ*ºy‘XPjˆö­4¶§rÃøä_úlÝZ>ŒÛl¿#«hìîÇßê…¶”w˜Ï~úÚ)ŸÌq±7ž}’¾ûˆBD!æÅA*Ïsw Âã:ÝÀri")«ºÒõ>¦u”“ž‚zÿê^ L…¦ŽYöyÓùfP]awƒ^v(UFyêtøUè£ÆðT0%¡&S ê<;c²’_«…Vê²  Æhc)](žn>¬h.ɰ!‡„_é‚ –ñ´ï$|¾¿‹Èûû»@b„¦šÑ™R3UEdwgïôÚ´ç’T™,ØOû2뺞Ïgº_!ªU5ùžc|y{<Ÿ×¯¿þꑉ…Z}½ò .‘”sÿ|ùùEߦzô)¬^_WDh"ƒ;Z UŠŽ*`ó<ÕP|ói(C`¨y]—35HZSÄ™å¬ Ë™‡Ç0÷1…„\fŸ«–Too)¹ ä|ÿùíË¿ÿûIÅóýýy^îñ\ÎK ‰···Ÿ~þùùþîáÇá”c )—rìÆër+š7H„‡ª•¹oâ<„PUsHSï^$ÿ$[’ý¿üô_þËÏ?¿?ÿ×··ÿÊíh—ÿ<ÈF‰ž‘g ÒP®ÒHœ°L§—‡ ¬VS[ÉºÝ ëy)‹a(´˜ëXkªð­a œ=cyhíã…>‹h“cÏõ€ªADÜ3úvéiݯ¹¨Ä•9›ÈÅધ¾²§.BT`’•SíÞÑFèjÄkBzµþU •Ñ5œ&'Mý¼«5ŸPšä¢¤ÎÕe r«¶áÀª\Í5Ab4QÅ—1žÎ3LÎ@¸Ÿ2†êO‡­38v#’ÞÎxC^åöùÕW»æNiYŽ£ª]EªÑàÆ-•˜Y8Brñ„H§H\5ïDMÞšhWd¨­óA;&ÌI½[J3DÄ»e†[ªBVÁfÍG´‰0úrRh†Öý”±°þûànW°¹ðÚÚ]s/ÅŸsߌ½Ù¸;¼¥‘ºþtc ld­{‡'woþ¾ ØÓ•^ŸT§7}Ä­ùÝ„Éö²¼Ådʤxk¬[{e,ôãé}/bMoÀ|í2½ÅÄŸ9ÎÁ®Aö>a.ý7ó²0(¹V™éæVø¨V¥Z… ™ÚnÊdT¸,:œÈ#}Œ‚õ GŠfîÕôºEÒ/£þuO̸Ïú½›pÅ^’xŸi¾^¢ë=ÀÖî'½Vã*w%¤ªád®¢ÄÍŸ·±ì÷EŸ3­ÁÉGàöEX…ß|Q˜¸µy H=ÉØ‹ª¹ž)¤géäíŠæ: îàúZáµð”µë{·]iB˜ŽÐyXRÙéuùkÏmt-½{rMVõ6µ^éc~¢¹Í7**¯Ä­†`/K–mr¸¢”¯-øÒuƒô`šù×’:Y‹øàÏ\ùì…ë/ÕîÆyëí¸uöüu¢#ÿê*ÿ¡²æÿ¿§uò~ ÿä«üOèAà§ÿýŸbÆç‡²Rù'\üóßè÷Î^ï@쉸©i€ô!€~>|Ö1Tz>:9š>wÌ‘gîjn_µWëñ´Š[Èhó«mò3Ést{Àt!ñ·B[û]†X[Õ}±’’iãjK¦A²÷óTÒ†i—ßújX–JÙg²o ¦?Cf©Ú SZ­À´ÈÛG³G“Yf¥`r7¼lyâ~—~ïÒÞ°tO+²MÀF)yµgqqžHÛµ`gs£Ðÿ]¶©HÒGšÁ-› ajžÐòhÂfnIÅLê!!—*TD zÑŸ×ÕµRF¨œ—{ˆd;.п ¢£SÈ=l9Äyƒ¥¥8íVnÌ}à^؃’«Š7(•îZã¢a΄՞8 TàŠøóéîóóõ”0Íz’¿f:-¯Ú{ÎE!ªr.B§œ_¿åû–£ Ò„rE“}@Ž$ý«ª05ýòåËÿoÿ-‚ÿóþ¿¿üòÕ¯KT’ŒÍÀx<Ž'TS¥FðºHò1LÄ"úÊD‘×éÃëP—ætO1ß/ïð µÎõUE*OYûTæëWM Úú“ôÄ6Ô6–Òݬ©˜°ƒÖ QQƒ©)àq¥³êêiÓÏàá9®ˆ‚lÔ )$G“Ö ‡Îsta3'_,*³o\[{Ì0„<Æ@«ÿw*‹ÍÂɸ²U[@•ÎÒCó…2ÂÆ`‡‚t‘!resuO.‰¸‡½™^”÷gDPÅMÃ1¾˜G©öIÑê‚õ~Œ¡ú6æ0® E“HÔãövâ+°™+cÊÕ’Ý&¸æù{3Ĺ{µ°ê(S&`6¯ó:Iòo¿¨ÂÏgÞñ5> J„=Æ0Ë ¿^÷;e¨ ä¤<ãáDO ¢[”é™Ãu]­#Z^þ ª€ˆ¬Õ%¦J9P}y>Ÿ—_˜¿Õ¡ÊóäÜ#hzÛ·NO¹µ IDATWÙ846ìùžŸxˆPl0S¥‚ Í)‡ˆ Xu\~ùÅËU¼*FU8jJή ¢lóvÊ ÏôPGÅ×rüm† ůx> Å5¾FF3•û¬¸•„J„#&)y}#yzj•$KˆÀ3Æ©ŠìÉ-%¢î>­ç}ªºÙ{T:òB5Ë”—ƒÔæÃ|°j:œ³{ýÊÛ‰åÌž{¾ÈDp:IÀ‹QõÁ±vcXJX/ŽY!LZ™Âœ˜Uß.n4Æ­F1R Fõ÷8§ï¥òEí Á$ÊOACÔV’´¹ÚD¥Q§ç²¶]|"{“Bm–Un޳ŽwµÓ© Á »¹ôËÙVÚQÍ¥‰®þ^‘üMoʹ E‚K‚GÅ& H©¸J_©ÞÇÈ1ç?¸¦ ½? 9«@¡c&k/Ï\÷¶òY1‰C5¢hJ¹¬fß-ü³u˜T$nM•×ô‚ϱ !€ïæR®™¸€!ÝòQ{ JRÎV1G&±9’"rÔ3¾‡a6ŒÔËÈ'øôŒÏ&˜¨Beu+äÓØz:’_â¸'6˜Fýã»y KíãÇÌ%à£ïÎͰ´@ÉIe„ W®]ÈÏåanÎ){ŽlEu¯bÁÂ>áæä½¥!¤ëSõ–rئ­¸'̯ªÖK¢€¹ÊE¡êªÉ¹M9 ßI€o¿þµK}¸¦(v’yW9¯ƒ-þbè ݬZOLÿF`cäF´ÍÕ™¬RIž)É¢Æq"…dcŸT¶rîógô:³èph,¬l“-Û±IÙ¹ÞÅð½t¬Sò¢§µ› ™ºÛw™ »ß Óè·“iøÑ)×SöíIzs r«üÝM…s¼OÙ7«feÚÅck¼åMºf›‰Ài ¾hÆw†÷÷¶CAìf”èíâÒ?çO+ŒŸ5p$zœ#˜hÑvýô k`¿…S¦éi~œ¿2_XÛ¼rï?¿s¸×5‡ýîZ¸½=f3CØGNw룂OÊöe_€¼|ÓïX­±³O:Éw†Ús’8þQ"ñ?DŠþÝs |4ÿ‘_¿ý2þ™ú,ÿòø‡ÔÿÖo ‘»üŸ2Þ¨æ?oêõü½à °8-ûØ<õ3¿Wôh®‹`jè34•Öþµ&#;{¡¶— õM;gw¥B÷;›hJ—Í”šnsÕÝ “Àƒ´0å„`ž¿z'Gä˜a2’”//©Ð™ÅÇ)£DJ:ºè{¼éø°kÛ@"Ë.Žýp2vÜ{äŽä¬{1Õ$Ž~*éÿöŠùú'CNjAu¨taP¢fQ$¥hnµºy(Ą³ ºpÉ· ¨-ü Š)ôˆ0B†DHªÎæS™XË“ý0¿œâÁjˆñª)Ô@ =½8ÄU*PSñöQ/6)$¤´ÓÜác%3¹øµ·æÜ¶*ÕÂ@ŠEî‘è+u/³@Eœ’%¬bªv‰xÀ̽C͆ˆ„;²}S FÒß/ <nF÷‹Áp0s?ÅÅ`ã‘ÛД; å¡x¼=øÛß~¡Ð= *¬Bä÷’c š!±Ä¼Ëu]®z™ 3EðbD¸»Çå$ý:¯Ë¬§ Œðð®Z-G~…lJžê2Ìl dÔ ±¡ú’\zX¡LËëW•sÿhj®Á ΈV=:ÉJcoo„|ûõkv_×õË/¿ä<Ÿ‘ÑL@3ÔTU¯ëü*6Ìì§·Tq]×yÎwši""ýÎI†QU«öf(,ÜKó)¡IÈ0³ë¼ ˆðíf0EùåëOUÅÛR¤Òšªš’`cpZÖ´á.Òæpº&n§.ê*þUQS£ ‘4[;êÜF$l@4u[¶ÿ,y¡YGË™oK;…[ ŠI¬NL7)ù%Î:jÝ8¿êR(Ñ@ºF;D¨"DÕ§¯¥w‹0D³&^±3Ìê\)¼´}˜t§j¨B¿ª"q-fyá}.¦Aê~]×éjÍŸàœsD;x‰É¢qôㄪÚ3ÐC³CÄ/âÀCsœ#ÇâôëäxúaòÄ:ﭱ؜gΨ•V%›>‚œ³)úoUæ]yèÆÅxØpÒÝ»œ[7Ö»èB&I-[»)rùuýúË&SZµhDC‡©©‚ô2Œx†K¸¬ú`6*D!áNy3"åh‡ö°ãù<Ç05óËÈ¿*ª3Ð5ÂÕìP½®S"êšSSahT ‚A‘q FòØ¢‹˜Y%S¼Î÷Í£¥óHKvÎeX¸'Ù$eu0*žÐŒæÈérÆ´™ÒX¼rf”sY¶0§êQ;Fé m6{€"ƒ¼È»—²v QJΠ%×GÍûè½4HJNÔÀ®#ªŠø*ùžã´ «eÒ#GN‘’¾ EL:€Ê4ƒ×ã«a 7œ®Ž|Œ¬ndބʤ´-%e©‘»iü°_›j+›sçE»ŽµIÄÞx… ‘<‰í¥ @2ÕuÑ­qªªó­n×ÏL"î*/ë/"ß8à=ÆfvÅ9K£—Y?—›Ü€ç¯-r6¬ä… ã ùø÷9ƨk­MÅÇ¿¼-¹$î-kŠ/‘à6ËB=süÆxbÿu§úš`—~̶ì¥[$„Þm±ÌŽ+õ?S-‰Ñ,©°/ùÛzç° |Šê â¦î±Šµ„¢±z–Á69D³{4öZ„uÂ_4|löêu‘l@¢» —7I[¶Iu_½QGÊ%®¡Wÿë{ëéýÜÂýt´é¦s¾äüÝz;ÛÍæíBž3d¯ƒÁÎJíÕë¶;¨}×7™qZ¥gë3Y†˜ÒvúÞæ6¼‹)Ñßѹ‰ùÆ5Òb¦fZ&;Îi#}"-ÔÆ*žÝÛ}Úm=ƒJ¶Ö¼n¿LÖ¶j3ã—޼˺¤ûÅ[Sî׎Q¯qájV™sSÊŽøÀLþÏÚÀElßyL‹èÎ;\„à':îžÿ˜çøV¹#l¶:ÚYÊ+·g€l É”‡DNdÈ}~€i©YBúTçq>4×G¥ cºÂ=ßI%Y*k¬×<&tKI-.3œÐo›JMÃ’<¸Öמdo~ùx+»ÝÛº±a&øQß侬šØÈKŽÀRlóñ—Üt{¼´È}ü?&'òUìÞéøÞá/—OùUüßùÈîTŒýØÉ|sþÝÿŸãìÿýbø?WŒþ؋þI×ñ_þõüŒ¥ò»oŠEõoSÿl®É[Z°&3©·-äAj@¬BœbuÆÁ¨’GÑRùsbl;o¯½ŽêÇÊ%1›¤¼á$t.à1]<"!r4¤€k‹¶æÐsŠ‘D‚™%-NÞ& c{ e"džfXæ+IõMrß|Ý»²–"¿¬yX ¼üØ{iÌr­Ü‹Uø1™ñòdÄ-¼üºP~ì ÿ4z3<³˜ð+hCÆ1­¾A¡ 8I¿9E<ËÑ£ŠÊdsU æ6ØÚ„¢¢ ý ëÓ¨¸».rÑE’É¡!‘Ч:s¾;Uê˜xWÑÜ´°â³D¬Š"kTW-g Ù´ßt. eåaS£ÊŽ» ûù¾,Nm;ü¼";0‡<¿žq]Íl®âˉ,m9fŒ <ÇÏÿö3É÷÷÷çu¾©ýtŒçó<ÏÓ=¦³ÞÆÐ1†Y»æ¡ƒ"ò8Þñë×_¯÷óÊ‚bŽ1ÚkÂ`6ÔT[‡K£ké€yv„ÐÝ‘j ¤û 9²½;žò.™ÙˆØØè}Gù‡OÿFa ¾!!nö05©þdÎma~‚)Áè0#qØÀ‘’(á¤D>r4ŽÃì!¦z]×ózþüåËy&½gä‰*³¦ $aÆ5ÜÝŽñ8 ³”ÒtåLè:l˜ñIwŸìéš™ é~]td…o«!Œp?3k#e²á×o¿þüåg{˜ý¯ÿÁÿ?M ³ fíT¡Õ‹“‚TahK‚ÉACÜ©9ãèŠ6*ŒˆlèÖÄu dаVZ¦gÍu>í0;÷ƒy2|ŽcHN¿¨*®C·}š³ç!2WQ)EO#UZ´&^I$‰`BÿóI÷lñÌJµ¼ÅŠAò:¯ëôÒHUÍêSŽf•/ý­A=NŒ3¨ƒÖC/˜ª;ud±)ƒ"!t3LuhD1cpÕêšíôÒ½=“Úßa£äEÛB~¢ÈN‰ÍØzó„(D6 ó’5pjè+TE<…rŠfMŠBŸ1ü|ú°AjF§4äŒP ®ë Ô:âáÕ¼,A1rŽã à|>kxA‰a¦ªB(âIZ¢ oo~:Ùì¨I”Á€ ½ÑsG.ª-‰3Ã#ܰH¹+`šÕ ‘Ëë:“Е“h¤ÕÑL"rT2¡K!8=ÒŽ®Å]Fy IŽÒ•Œžµ¡žgvè G†"”pUõ‰^z>qŒ|‚4…ˆœ!Ýÿ=Ó¦KHH\ôº—Ò•*Ùkë"ð>Ç£÷`\±f´\•å ’1-V•…i:­ÇI¿ª1Saóc2‰s(R˜•†":¹.l›v– ›t¥ñ7±Tº6`RŸŠ®RÃÙy¿³ÆêRKôO9c¶Ô§™Ó,'+©!jkô_q¿Ó%\H=¬Ö† oÑþö½½öédÁ’k8uyq˶ü¶y?&dhiûÍü~c³`ω6ŠØ¶ø„ÜÈL[éïÊ/µ X‡u*e•-M:ÍõK ]qÉ „0j ½í¥1é@ùUg|s5£nújÌAAAÆD§‘¦ŽýÞéšPUü$&JI+r³Än“q­ˆ¯éŽ…¨pd±;¦Ù [Õ;?0ñJèùÔô«’ò˜Ø†.òË#UƒtqÆ­Qµ&&UÏíÉ!ÈÈîo0ŠX¥kªÛ¤TvÍG°ÎÙ»p{]¼…±7«NtUc‚fœD€—£Q#¢¢lÖJæŽÂßt9`™­öŒõvZÚ„jvd¼z°Ö`b¶ßµ@ï9Æè¥«Õ¨é=*”›à+ÜmÀ˜QƒÉ¦ÙJ[‰üͧ=«{¦^Z¤¯í‰¿RämÈkgªOdYþgWAYf˜¤puÔʑȎBzÉɬž‰Ð¾™n¥Æ“°4'*œ©%)Çž!êæâ=«ñbó“{ÜhýÁì~Ù¸¥nØ>^¥úüKrîßd[˜ü¦“ðu†5C ¬*šù…ûš­orW¶’›öÝiñUœ»m(³¯`ü!*ŠLJÊÊ2à6ë*jfÓs>gAÂŽøºûò[AÏ¢z¶¡+}0Ÿ \øªÂïl—Ö¬óŸÞ’c9©|[³8™óuó»e†Ûœaå4–ujãØmWúÿㆉæ÷Ô´[ÅÎÈÛkÁÒÂ[ñãë<ó÷+žäo¸;oŠ%~§¦øÓ|¦ÿg<Ôß©føÑòÝß|ß(¿û§ÿ1G¾ÜP*Ÿ–Güé.aü“ÌéŸLø§~àQÑÿ”÷Áþç~ó÷†”W<Þ}*Àm»u·wj[kçUÄìúKÅ5D¬÷uÆ ÚéÃÕO BÒ"sÈÑòÔfÙWÚ=;…¾OŒe“ù}pk š•:ÛÂ[G.¼Ôpnﻡ{ÎølÜ×÷{œû÷\·ƒ˜„¤Q‘vOËa ˜™$Z%ÏÛ¦QTªZ¢bÎcºo9‰Ùt'“þf&"2Ęb/«Þ3Ãö}º#`i½®éI*ZK©ÿ}ÅÄE±,žÀt˜þ#‚tzUÃTâ^Úò¶9[õ¹³Ér¾t÷³õ«•Ø|gIQçŠèÉNuž2èÁ1Â=ü æ¶©¬ˆl9¬¤ˆìUV¤Ô‰´ÿÿôÓÏ$ãíë·÷ËÃF tjÊ–1Lq ShH:îSw鉈áåWß„ÓO `˜%¡eö˜*¼1€fËn@5k~mdyŸÄåÔC›ã÷„K¿l`dÚýÛóyã˜æÀv«EÅØl%Pz˜ƒß®ë§aÇCDÞŸït=ÃUDÍT‡)ÞÞÞq¾¿gCäûûÉ@'‚¨U{§V‰qÁO("þ·ÿ5ìc˜i0ã`„™MLÿx{(ô|>Ëví®›%ÊÔ¢,é’AUƒ»$skEDãíq|}UF )lš$ºƒVT»–椈ЦN”â/eÍ©é®ê„@ô?(ƒºaç©VúùAHT7¦v,gËÝVº¸Ø£\yy¼öÛ•Üë—…¤M·>L( AANo?1úyŠ—[x&°Ó$–bOzÆZµéŸBãþs¼—±¾²ë¨ûef«ÆÒóôàçuò;´Fc‚Óut.…oZ§ L„î©<¦lo Õwr:ÅHš¢ d@ùÎãvŽm«RZmX+`Ÿ§w}2É¢Ç|F¼xU³±Îg³ALáä R<*¥•"Œ1, µ1ŽpŸj¬ø%ïïß5˜ ÷kêÐ9;U ¢Œ‘Æ[èP¼#&䮤ªzð$¬=Ó¢©Ã2¸çBqf+H ÄP¨ÚdÄóyÖ£œ¢j‘K”×ex1æxs Æ…m_ƤC„q§·LæEøq—1lDòZ–—””^öŒB!çÞõB—W‹CN˜JøUÀdr ¨õ?¨`Ö¨@*eEu …¹°¥Ÿi7O¥J§%dªÙ9é ‰pF¸À¨j3 ™‹²Uá³PIƒ´Â.E\‹©ëQ²sníØ®Ç‰Îëp]2–ê}íq¡¨¢' YT/jÖwíÑb€•jÀÌ Ö]=%Ÿ{vB/5ª«,¢ Üëc®-cM/sÊ`°PÔ€Q–+r•I”òOܶײp37—ÿÝŽ#[•-!ŸØ‘äE¸eï)V³ vs¶,Ò¦6´}3îFÝ›¡e­ý©…äØfnÁA"ò–;¿˜È‰M°xV¸ßjËËxÓ+Žö¦·;:(kӜӤfçÏÒ­ÙÖyíêuM„`Q,ÿ¼Ç´2±€ÛxL×É7z,?¸—öHŸò·Ê&`ŠQ`y$ꊧÎ=ÅݫɎÖ̼³SØÖ‰è©"Ÿ¼Ý)ëSÕ`B¼¬˜Wªˆ†p“ÙÑ¡Ÿ¬3ß‚àœÞšx›˜#¯ fÛ˜Ff½ù¦T׫WÁ®aÝÁ§û`h«­]Ý»ÜHLè®Ûõ&mE¸Gú­‰•Ï.4`¨*ÃTaVÎà®áNñ›/ˆ`Èìè–î Z•¦› ¹«R™“4³•~ìÂ#—D¿ÝÊõB°&¹Ë_3¯Ì.NžRkÃhÁ›ô¾VdÕç(™¤Ä•jh€¬F ÿ\7NÖ‡j¹j¶_ÞÖÂWBÿÔêe5Ì®IPg?h»Ø…g,¡ùßßõ…„Ç6"Ø£ó§ÇVópk¨oÁé/å¯B~*¡rÕXáÆ¸Eu×·‰\åç[(}Þ]†[Øä²åcÉäÛ:¬ÕžÀ•8«+^7y¢î>ìOÌ ÚLp­R2\†µõ* ï tü¬××Íœ¿1ĺW¤7ú74ô;Àç®rþ†ô¸ ß5ÚÞR Ÿ|´ß2ü ]ö·z>ù½ÿ¡ÿD ÌGRùçïÜ÷‡ÿÕòw½ÿO2#›Ý–½4ÿ/á>çÒ7ÀŸüâ?ÀkŒç_küÐ?ã§3îÕñ7îgm¦”íÛú„_ŸX€ÏêÂÊámž›CÐ$É™.wH.Úž–DÛLûƯ¥P…ÚðNF¦¥‰KD^?&W3ÝÁýéæuå­åøI_0îdµ*Kׯ •êܸ£©ÉV6Ú@Ãs Ž™ÒªÇøUß/°ˆMÚl,x9¸BªÛHù2£®]SQf—ö*¿Š6çûGKºz÷ËÎ5xŠÐœækÎyÍzb#gP*ùR‡ƒíÊmGì.N’·ÁØDð'…DVøçÕôÙHcÞîósáï”ÿ%÷’>ùÃiˆÅß .üÄ\ü˜Í?d(ÿ +¢ÿ¸pþç_Õªxþ~øm ßËëüoú?”›½=)ûÙp¡ïë)e$ï¤5ñ•ƒ¬Ìs{ü‹cØãpI¬Dyµ…Ãíp*ÑLÒZÊŠ´±X‘?«ûL×>qz2Ð{~Fšb{1™g -ýa-ïîŽÝߺ²[™ÑžfÙgߌýI° ~¤¬þ¹[2c"·º¼À¶Mál× Ÿ•ݼV#ÜÏ *Ííܲ‰»pxŠJÍ@r0  O»)Ë+¥Ü×ÿ±Ü•‚ü¬qy\ç;mH[ž).ª0葞lôýÙE{0×^)Í•h´>d,%xúÙüz*ÂÅbžmX‚*f¤e¹Xæ;‚ªQÐÌ —Ã3$ê¨åD‘TÒDL¨áò8ßO¿ÎTÇÊ8ŸÆéTÔ9J%Ñ™…µ« çåé.fooÇûûó<Ï1F½±ZU”eà ?¯+„Ùé:7Q§Ÿá¡Š·ÇÛcfúõý=~ù›‡'»fèHí¿ÞR«@€¾|ù23è† 9ýjÇUЇþ|73+*¹5¸Ñ]ÊO†4oÊâ+„ªšÙy¹cÕaYG= 4™„/“òJ¤&ÓZ…ò|>1l˜_#,g,°a¦f"8{<%â<=W¡ZÌÔD¾<f!¦ÂÔÂSÇŒ9=qiÃú—/oûú¿þÇüÇÛÛßÞD`fh~úU04Ë%./¯ãx(ô«¥¨‡$ñÀ·ç7˜þôx{?Ï  ©Öˆnî IDATA¾RQeäÎ[;öVÍÔ²h†þá*ãšr徃•“oËäÎÃ2»yeãDùÎæˆ©OÛ[K:îÉçLåÙß·"¹,É{3õuÍ ‰°!f*¨ ÇE† –HÛ·!îçñ8ìÐd,EäüÅe~Zù¾.Ož²™™ÚçáWÔì•agëq‹–×;æAsÒêŒ8S„4:]0&œ×¶‰•}¿VUs§ªA Yr¹·„= èâžÒ)ÑUè"îñ6ôºLEE¼¦Û º òŠÈ‰ìð¢ÞM9ù|×~¸ü"ÃÏëÞ† 3Éq®"â¢W%oÞÀ=.ê)s¢6ÞÞÆùÔ»zÜÚwˆfÉ9Täê‰3 ª0-#xm)WUçJën gL5ƒ]<>+"˜I‹I°g©*ªÆÌ¸©"q„B9=BqÙÛÛ2¶g tV"2‰ 2rF>çÄôëŠë :2¹%“CC­ALIsÊ®/ºH=J*;)WðºB„•M©=”kdAÃRB$<9ÀÙ'ª1 Pz}§ 1ªÛ6§ÓŒÊ™ £ƒe¿€aåÒ}¶Á¦^Ì‚-æ¶Ê%ç†uÕoöéXa©•#ÐþEz®Í À ß-ùvÜÉa[QN›Kw0å㕽÷GïßEÌ›s}9kù:™úŒ¢óœœ—š ~g $ßgμvó)2þyíûëþ€¥ù(rñ·¾ >@»~·Dü'$àï~韑•ÿa’4?Œ»gšç4:ÿ¯ñÿ¦üá_÷û?ï_t³ˆýÆ/òI`³¢ßã€\ÄúÝ€]d[]îÅýÕÑš¢±\"HÈm®åÑˬÎâœ~Zp"DÇ”úÓLtñÝPƒÝÓ³ŠÈ<×w¹RáÄWºA|=-˜¢‘gz¬Eïï)ícë/o¨æÌÏiü¶›– V·šÜÓÞÜ\C²Jªwß¶ÏÄ^O°ºz £½Î:5Aˆfî@ôð¡òÕ CB4P¦J#˜]Ý¿£“"’Õšá~]d‹é`"rÄU #?µ@U”ôð¤6nhÿ'î¡~OÄ ˬA;ô4”ê<¯êו©ÇqV=4/=ÏPÚ›‡<±ÌÍ[¤+,Otp¦sUD<®üØÑЀ ªZîtòôó<Ïü”Çx<Þ ÷0«}Ôäfº—Ý`y,½®óüöü[š×uŽaïO^~}ûö-‘ôÃLËj«iØ÷p÷ÃD«';„×u‰ˆÉÆ3Îë¼Ü#{›Ë— aB±«ÔNœÁKD0Lã‘WnÉôPˆÇ!"ïß¾e½áy]øúõííMͶ.EBw«y± N}´¡"¸øòxÔÌŠ 1«hÉðì-PBÅ`/үˀãáþþþdð×_9Æ0U@=.Ê[Þ‚Ç?½}aÄ×ëŠ"²SuÍšd«å²RÔLÅ/ñð+Ë™ýÛ/¿þí—/· ×Ö”t#»Éñ°#$Îólß,ÕÔÌÎóŒ  vØåþíýÛc ÷k®¨– ín’æ©*8—Ôd‹äár«8Áœí^š±£njÏ«éuW$ùc½Ñ WÿYÌFÕ¾] }óìæÓ¸•«”,ûØá¥2%:Ù”ÂðS”B›GåùÔ2€$¼e«YvD žN=âËã8Ëߥ¢ŒR(¡§_Yóp¹ÓC&uÍE„H5^äï8–=9[n&¶ÃŠdº¬êyý}¤¡êš¦i FJ…ª³Ç®*¯)‰ ƒ‰pJ—WEN¶¥ÇvjŽ~þ™A<<=ö|ž³ûñ•k®«ñý¤0®Ëç·ÊÙ•A§Ý°–Eñµ ‘‡V-Aœç»»þô“B²!åÔ¦çI×ZFª~EøÉàz]—² Cl E®ËÇ‘j»•u>5ËwÌé ¼êU)¢ÇÃTAž^˜«9â;èg>ÂSiN —jbfULÄÑÀ r¸œõ™A ^OÑcÒ%Pjú,'Iš´ô¤˜©eãN6cã"ƒ&bc“ˆ;">ÿÂCŒË®°¼+¯ B¶F‚.»È‚™ 4„v[2ݪ]E «6!é¡C¶ fҹ΄{ :„Á¡Câ!Jwt˜8»J ϪÔÎÄ…˜‰ŠÛ•oµ@›åt©Ü« ¸çÆ rQ†,Í ¤óiœ)‚f¼ PDUˆ!…©ô_–F˜Š™Í‘_%»!$ &C3‹šæ(I·g3`,iH.ݚ̛qÿÅéof6ªŒ$£š¼öA¹±<[o× 8Ç‹¹Ç©[qbOj[ÞSäÉ5l L¿Rûúilzþ€ÈEQŠåg7ÅäXbH&ŸØ­Ÿûé2n±Öú†Õß=sBAfͪ^!‘KJØ—ÚŠ07/ɲ”#ü‘Ok°EÒz\Μ 0{È$Ö³ª_\U]ÙäM äl)l^yBÉ‚Ph"ÆY "`àÂ*î7Zl“h–F7=2{JÒФ~YÁˆò=ztRµ6„ÆÂšc+yž•oUŶ×1?¨uÈ€âãz]½?éý;Sý¯áÄvÍö']§ h¼%[ÖÙ Ƽh&‰ŸÀLD6J(ê1$;@®óršV½|ÚÆ<uJòURk"(gÚê»'tp;ØMï¬c_Ùø6t“é0µU•­ eË™ÈÌÀÈlmígº{½sm­š­ÈägZÈ2u¬l,wö vZOð婵ÿâø^ðMVñLÌÖ¸rê¥ûc‡!^Ø=)ïµ¾}fü{2Ro›c:ý÷ ‘ì-Í/"*9h{[²–bnÑÿýrþÀ.«éô¦lÞfdÓl‚ÌŸ·¶„ck@À­‚ùv `sâo× ¬ùC²…Y:Î4vÚa7óÏ>á4•›j.)·ò½ÛW&MAw*îÝëUÏñ1î‚ïj´ÙYÿ¯wµä÷ª›øàîß;7¨ÔšcáSMóïIœøû×ï'Šå§“€g|‡Yÿ£šê_'C㻪ëg ÿ"qöwÍ~{Ø€O:~ë%óŸõÊÿ§yÕˆ‰û÷Ã÷Ë_bøƒ¿é_ð-³Îÿ!€Ïo ¾àøzAÁM“î³csxXT“1¹…­55ýTgùœ–ñ¡¢mÒ …uš M•Iÿ']Õ¶§1!7\a5Œb.çØÉ©Ð>'K'‰™]€n.]¡Zn3­Ú¹—cµz‰ç´-ã·G6åÃSg'á¾®Þ–ý¦¾4"}:~Â]ÌoëÔ÷· Ÿ%žnÅÐã0uJðJ´Hú²gÜ5í3~U|¯íz­%¦=DDhýÑ?“—»ª%e›С¢jð¨6Ær0S„Õv;[-k/Ð}ÁBqŸÕ éPH´41‚”@nðƒX®ú¨ ²w1÷šÜʳ/Á* ºG†t.*2õp‚ªjí! GD\×¥Pµa6ø¼5JÌ‹ºµT!2Ì*}ÏHîÉÓLMÉ0ÕCí—‡¯©‘>w@QüµE/›e@«)‚×åÏçS ãñ6ÈðHéI*ê‹_ô`¨$Pž¼½}ýÿ¾ž×5ÌÞ_þë¿ÿûå×üÿq>ŸjæÏë|žÃVp"®jÌ,õÓ¢®kWò=|¼=½yôl0MŸd¾½ U<ŽC„fv]—×uIp¨>¯ëýýý|>¯ëc¤»ÿºÉ2ymÑøµDvݵÜß• is[§ü½ðßÑ÷XÆý•Í›¶Ùv¢2F*â>/ù@~¸¹”fKr]\ŽÒÍÌ^3è.ÚÈ™¬È™ÈBÍisO”×S.­+ù ò\çß½íoô¿Vx†²`Í»÷ò*åOLS…”?¨òüTZæ§d÷Ùü©Çþõ+ÖÉ»5Ÿ·›ëûJâ:•@÷{ûð÷l÷øý®ü ¥ü˜ú¨°Û(í‡^ÉkO8ÿ̯pëµþ;C‚ïs~T¸ýG5~ä¿y·üYé¥*ãÝüÃ’€{èä_ã7áǦß‹­·×ÚÐÎ-CxòœÒžâFu¾ïZ6‰äØ "…X04²d´ŸõºÌÛáE·{É$jÛE¤õé¨+«ViÜJ§.BAƒ›‘ ùà ™1'È‚5£Þö¹¯®¸ÝýÚ<Ïv|,f-ð²GêÂTÜ-üødù.I ß+òÃr” hâ/…—_A‰¡b:šïlYÐYÇi—d¹¤d|HCè]sÐ{nÍÆ ¥F'hþ}BÞMÝ#R›sQ¨&©cÆ'ÿ5Á"ówîȼµQèÉÕ˜à¤èpJñ²aªPásO†BÕšûJO v9¬…äYh11­La¸ éîÁ¼ìñwòíq˜¦kU#˜ƒ«”ü#R”ˆP…»›©#"®«›U=í`fv<YË•ŽÑy¥[¡áT…;#œ’îd0D®¸p¥u<ÞÇááß¾~› ~Mm"]Ó ã=†úíùÌëî¼NÏóé[Pqùu^g¹›û´“ œÒŸzƒ˜}Âå¬ µ€¦–—úoÕ¬f¹BjªÃ°Ùc±ÐÆwöå§/c0Êãñ6ÆÈ±ÊaÃ#~ÇãñÈÚ¾‡fÜ b!‘üÙÚV#¢¦–oSžº¦§o6rEBR¬¶roeIªsfÒó¶Î`$ÿ|é…êjmMvøf78Ï®/Î,ΚJ‰ ãŠü‰ M£ë%b!ªŒ(ò½TÛK2ô3¢ãZ¼".zNT`„„¨E1ÉeŒqžgf• ¢fƒ8afìtUáá€ðð  ãMߎãxã8Æ8â—3BÖùš$Ïó$™"»æBu ïÉS—T&~1"òZ¨BçVâfÎ"ÿ1i$NVä·–¼–ÃS†Ã1†CEüò÷¯_yž#D‘§‡»¯A]ÿcšh¸_ã‘ð¸®+ëpþéÐq u÷qøC ÿöo?þí×_þöíë×õ<ϧã°a%OîùLHuËCã8Ì”ùÖ‰C-c`Ã,mÞ°ñ&rŠˆ_„Ž1:%e\U]CzðõÄ».½ýÍKKmêÿjjNˆãx(@àr—¬§N =ÃCLq =žšÜ0hk‰• ª¢z9×g;ât•jÍ`ŽB/°ÏäêjÉÌËžYV…GcJtÖýåI"b[³7H3S³l±µ™€`u$ä$ò KÑEÒ¯ˆjΞ†Ü¯é03µÆþ¬N€Ù”Z†ñ$!i¹`³4ÌžÓœ¶æ S5Š'7‹«B²tƒY嘟&¬½â!$Í¢^—™UØÔ‡•† †s¡·%„Q±¢P‡T†@ë¥$ÒM»kXÀˆkzÑEU5'®=»,GŒ@T½ˆ[»]µ†o­¾î‘ˆ°¹iÄžášýWî¦Ã›¹jûš—ófÑgÀš”BHX#oä­•Ö‘Xh!U1ú6À\²A!¼wîٖ݉•<*t“ìBO6 ­&lYƒ,t9ÒbÄ“—ðŠiMJ¦=\ÂDE3%U`ÐKäZ]ùàAÌœ)v\Š  ‘Cä,€¤hk6âûNŠPÈñØößÖïw䉶˜ÚSe+£ –È-&ÈxC¢¹Ô6)=’\$!rÍ\Ê>0ê{˜îl]Ü(ä àèN np„X³½u žÌ• oÞ¢mEo8 9ÙP­Ÿ<·(­1îÂø*8ž†œ9{˜’åš+`w…£ó1· T!J1Àå!”ð–’]VQQbFv¨DíµÊØö:ÛC¹µµ¾ÊËÍUn¸ÈËõï¼MÑvž>öY¶#ÎKâ”7;òÊÍMÃjYÅûw©;,vO?k¬¢¼»¶ÓqGÀ(íc§Dì··\ÌGÿÛ6Yb\7Ì[Ý,ÀVÑÀ®óë¬ÿö«cq¸EñWéaìV=¼6b/†À§r'³å¥xöp&XdÏF­YØ-s[Øy¼Ôð.àÂ6ÙšíRóË%qòs³}öa½ÃÀf›yèîbßýíê›!‹ÖÒæa~)7ë¯Î?ªÌQ flmAª^d¸µä\·ñAC^üŸ&tïoçöДÏ'*û”~{%Ÿ+Ì[qÄïÔw?³ÿÿ€­úXÛ+ ðQ÷þë”Ðï¨ÿòQýÿ+f Ÿ½G?ú»ð‡æ1òʹûGdþŠàG4c|Þ‚ü;ü“/ñŸý}gzó¯WLùÍN`~G#noî­þ¦1S6»9gI;¥*z—‘6Öþ2÷Ø*êûAËrÙ'ÝÀr¾Ü²˜bšôå‚‘n15í"„¶üY_\å7ùMÆJañFøÛ] y¾[8ä:µêíâknmå¨Kë× ~„ˆAfGš=ê¸Áyb‡Ý/ºÿ´q{¾ýÖâù¡=)ùŸR¶X÷àe‡%3Û Vƒ!IµÍ*’ŠÛ@f%]2^ۆˈhÑ3D3dœ*¹×ad cª’M€!Q*R·-Q4ÝŒPÑ´ VÂ3³IÀDaÔt/ˆ2'f6$Ô™&,5àJk×ÜŠç‰#Š}ù¥¡(Ö@ªÂU‹”µF–vÔ Ã jáÏë)áÂ1ƒ+ ÇùFäÁ"u£:R‡’Z®BRݽ…n˜é0s*µñÉE¦¢50À*üZTO ³Šà§ãQXó'Õ,ÒîšrD´E“"îžnøeœO~ûö?ݯóúöþmŒÃL³–À#®ˆ,Õ43D›Û7XDßô©›‡œ79õblõ ~]éš»1³TÒƒTÕaã1˜ ÄzŒãñf 'Ÿ9•:Ž#;UØñÐR¿â ¼½ ýN«Ì+ Ñ—!‘vf3{ûòSûÂ3Q€ˆ†ª\î µã¨³lÍ+”Jáq ÓçåÏ÷çâŸ6Oœ”ëznx@Ž¢þg 0µ²þ’%ˆÀÝfÈö^´[UZ‰NWh“gb«„£MxU­°âsl©j>q·¼®´!6H|šSU……ðò 1ç 5¥¯nE>Ìò°Ñ^j"a**ôâ(hŠlí&%CÔ8P(¥(…ˆÉ8F^Wá~º+`ǰaª_¿}-㪿ƒ’í/¥›YkGð<ÏçóL2w0üò+X¨Ä4‰—øxD À «#®y!?V®ód^+)ê˜i&ÜϨû|{t5Lt ]jš“<–;%Iý‘ð({µÈl0Î+Àyù—·GŽ%<| ¨©\9¦¤Žá‚pBuŒƒÂ¬âýù§Ÿ"âòÐó Qèx¼Yjúoª~•çuž´1ôº®ÎSëeV÷KD 5•#‡™N`‡ªVA@éÈmFn…ár÷+¦–Ê ¬Sáõ,=-_×eªSÜ%¿1lÑà¡&ª:Ì vyU ç­ÌF‚Ñ)I…P –ZFQã"76ÉàI¡€xfXªwÓZ{¤abazžçl$fê1§r6¬Z½‹ž”0¿l „É<ò˜‚Ýð6›FVt9±BT²šÓ.ª¨q‚ÈÐ, JŒFNrÀ(ú3(R¹ƒRÿ¥AôªÌ®Qa‹åcŒÃ4‹“ÃÁË/VO7¢kDâž P4£…®É¬ˆÐªP!áBì4•¨[.‰"¡Jã€B’PMìXË»šJz€ kÈ`ò¨9ÆÕ–Ib†U‘;(L~ò22Ë´þÏiß°¾r.øâJÅG2o¬…9t”=ÀåÝX……er ¢'LmÓÞŠï9F¸:É%‹dp¦žU¢͈Èhˆ2J³né´À?çÈöß‚.¼ü"·‚µ!4Q1Èc4ÊÇ™vŠØ¡6-‹Î- uE¼ÇJ&zÉ@¸H„D/7º[ WdÙŸôÁµúµ ¾çh0Áb;2„KàÌÔŽAˆ<–Ç´„w®Zé©ëE7ùBd2} Ɖ_³ïå@—ÆÎ>`Úyéü ”pï“›O¶Û¼¦ùƒíFïÿ‡Ûµ¹§¥$˜EØ‹ f´¡"1*˜UÚ´ñE2Æ¥£ö8ñbÉÎÖ–97c¢FPО¢¼€n6Ÿ;?ÉpsÈl¯Ÿ¯<¯U¢+÷cézÏÐlG9ÍýßÿÏÜÛ,I–$Ëy¦f~"« +P^^Áš|ÿÇá‚ „Âqq§»+⸙raæ?'"³*«§fî̈ŒôTWeEœ_w5ÕOŸD¹Më õÁn‰ì0çØ\e?«ð&ÁL9(òÒý° w'[!ÁfÜ=ÿ2éb¯\"_‹$zgm°ãªkìù쯚[³a†æŸ|>qƒ–6è5Õ·=”`*=\–{åSy.ÃGÈJå³Fƺ«¯<½*î+'>ìy×Ë{•l€#ìUì+ ¸Æ;ð¤MÒÜ‹ú/;*ˆWáóUtçSÀêûj"þœëüƒéo†ø£ÞòO‹Ûï‹ëü±/ô_LJ?/‚&?aBÿðC~Øð‘TÎo9²¯ƒKùácÿαù[÷ãâ¼s IDAT3þ=?ÐOžs|æóƒÏףĿÿ×ÿ±»é廼;ý!+28ˆ¡$z޵|ÍÇK“\M<—SD6ÇbTõ” …¦UZ¾ìTX¿!ä2ØŒðË”ÞM(«­c=€ÄHv¢ ÒÊÇ ›ÕO^xÝ78£s+ºÚVOÓ²VŧïÓµ"œh=ì‰ù÷ÄâÞ ÛºzÏ*~#-ôl;À7ÇO&iê[åH•H 5J•˜%ÊR”›EäaYþ( ñ¡¦ í›¡çé`÷(¢ƒT?Ô!œM³¨ª$S'Oß@ÿ°´Å)œ° `&B?%$zi¹¨åéªjµ›/l÷†<0"¢ ìÙ™I‰â«­¤aÆhÒSHd‰i<·P´™ ” …ju@ %Iýí2ª34ŠUÂpï] fj¹´N¨¹5;c©a´$›ª™ª&ý<ÀRgÝC•’I‘áÝ=£È·‹¨Ù\T¶ft=ûù8O‹È‚Pxˆwˆž„õ¹ýÒ”ck3º¼Æ*!šN.ÑÆ[ úa°ÉVP!M-ÂkXHò0ÍéÆ ÂÆø™€°™¡çx£¤øu3‰ Pi"p ä@€±v¯¢!A*¡fhÍÏSU#:¦OEÍÒ•ïÝ]¶çj–.\3VŃòá5³ðp'Ý}ˆ“Eõá¼3G!s=ªMed˜™dC6£«CѽåÔsœËÓ­ ÁÊ»¡÷'QÕ©28aÙÅ]mëù½œôˆÄüKMŠ4gÒwÅÛíÈ–wwwSí½‹âìÝÔ"Zj¶ª8´ik9¬Î€û×óQÓsÚ‘¼¨Üšiµë H`• kÃbi&€‰]žežÀ(=Ũe µ¬öPjÏl„jµ"£Ö‰¶STÝzáïH2\˜L@±<ßšÝ á#G!=_Ôž´HUƒØf¯©S¦ÈÁd*ÈkP^c :´xùÅ€'r04VÉCÅŠŒŸõôØTN™„ð]&â†îÑ\0q$¬tesŸ¼ºœëÖAsÖéÞ¨à »Ö›[ê8)(þ¤0 )’ñFÔk`?9Ê…}&b´.º.>t[bÜ4DÏ&ÖùôVÅØ#Eâ¡bŠlç·Fþ_(L„mª—'CN°úê—:Ÿ6‡ˆ äéÔßR»NÁ7…÷NOÇAýª¡¦ £Ì‹(Bõ‰0½!>(8Á1þÕ·.â£jvl2 ïµì–¬ÝÅôx>.òMÛ¥éË‘Ø~3¦;wí|x飨}²?–ª-¬!ížuÎwþ4Îê&´çn-:*î»”<>ÿ³4–\#ûTh 컩¹x8½÷¦C\ŠÑ\J…{ïç EkÇЈ5I•ëÅ©5¶ظÏÈ`4´f3z*(Á`´ÄÙ+u8lr#Ñ]Tív»Ýn7wœÞ{Z‰¡êÞãì0kªPìííí|<<Kúàf‹ÚGš] "œP3ËY…V-õ€tY¬…‰p¢MìŠfxbPûwïk@,xe„{(pX{𠆉MJ40­åúŸ̦ÚÌÂLÉ ˆôÞA¡µ šä$Âï÷€·5’Ú,Z R"" Ÿs†5µåÇ‚î}2*^0&QSIu;Ñš~礪KàPµ:óOb’ð“•Tƒ=â°ÕÔ£ðãL³k!µÊû_´0žÔrû!PÌRûÈa«%žùœIØ¿8|»ÁÏ»Ž'Ñhè‹Önz÷,ܲ{oÖ:ã9Ï3K€e!ÉAw`³¶m0‡áI–eY+¥1*tVçÁ´©šMÖvQ†Hv4ó@úßS…d.BæLÑÌ2ûä(™WQùýµÚz§Ã.œ¢²ˆÿU@’¦²÷¼š»GS}{»Ç¡G«7góÄÖXV³~ LÇê%6¯Ó Ã–h~Ð#IÂÐà K´´,—ÂxÀÔVšLâp Íš¶|ÖÕ(.ñ^eÑ!0­7~xhQ÷;ê¦Ó8›y¼(ú'Ã-Q_™¨VØ!D#"g@ù¢ñðHÈG€È«« q``¾àkàAÎþs¡Q&¡hEïté\Û\‹–T€ˆK@õPíçùÒ¼÷Üš™ªu¾¦(*5WémºÈ¸_° %ƒëfwÝžÜp@u†Vœ“ü>û‡·I1ÕÑS`²•8’sÄ:Ðk]޲±ÞüS/¯/TMÒ¦fsv»ND #Tä-^-ÆÓ¿žçÉӴʰŘ}Cµ•P¦œ>ú…ø¸Sná—ª‹Î€[2ð‚W2þH/O0ÉÜXéfMÎö¨ñ/FÂ…ÛÇ<¾6h?PH[ð\œõó„ûBÈO.TÌÀu¥J°óaû˜qUqJõº×]ЪM×®Px‹½m“aãæ%y2¨3ë°@C# —YÅ&òŒŸ´ÖÂ=Ya¢Ëq‘?0ÈCs Á§hÌT¢‰'/-—ú¯º~yXd¾¯ÖXœ©q>©zÛøbwšSð¤ûï1,¾JÿÜDêÕGþ"ºàYª$W”hÛÈëÁçúÀñž×7/¹ÕÄ{?̺¬ÚÊÝ¿8G—pÒÌœ^>ëÕƒ·õ»`{¾LyUp;`°1Æ××Íé=‰K™å¦Â– N>9v/Ù˜abç^j+ܘ”Ú§Cyueãýtÿ ± Ã[¯áÝ |oŒñ£’×j£ˆ­(Xf]žâ¢}p«Åžˆ²<³Pì œ$#z½ã‡¼4/ÏyÿÔÚÏ?¥þ_Ò‚ÏmÛ/åÅ?OýÅÏ™¬w/~®rýgNÇwÇ=òïü+¤üM4üONDèpÀ§ñ½cr!k=£ævþ>d߃ɅÑèýŽŠ%HÙX);ùºñ!£*/+#<ê…t´Žu¿ 6ÃÒµ÷Í"½ÑªWrûŒ^¯Õ§V9ðìË©5·ÔNO‡D¤ûS©Ø‚1‰I—·=>œ²,­èéd©x`­·†ûåRå‡OKnC›ËÉ{:™O?á% t‰°CãP•ÚÔêè#K“¸ ÆLÓ ›Q€±Ú%ƒÉ …té@TDU •ø=º©‰HD/[a-¨9[zwSh;ò<š^) ñ~F€T| ET•)Ȫìýbe'R£HÐk«C°!¼#¢<§”(«{rŸ¹öÜŒÔvòšG-_ÙýTk‡¤¢ ³–æÄ¼Zk€V[)¦`hÁtÕ, õ›=JD`­a8-Û,Í(ò8¦fö¶QL¤R"ÂÔ HÇúù8' aà$4-öáÝ¥­Ç­µv¿?ºû˜Ó1P jf€ö~æéR¨›xÐ$(Ú¬ ¾Bu]D©s´³ÌÒàY=ŒËI•å©N³ª¨šjdâŠÖ]Hqw Lµ¸>î#a ¿þúk¸g›e¸Ÿ÷»©MÆf×»ÿñõ·ÛÍZË"„üÝû¸?‹ZžFJBšµ·Û-Y(UÝaf·vKŠ…†3–Ø+3ˆ¤¯@k­Ÿ]MËџ«á¥òŠXΗâ˜ç…å.~Þìfªž×´Vç¦LÓ_—3‹!ÊpASÍóÉì(RÊÛ}`>Ëd îé8nªæî¤ˆQDá¹O¥ÞjvPHyDdáF='CxœgŽÐFÁîA;êÁšqët#Å{„xäÂTÎÇ="ǘº‡ªöÞIšYŒÑ‹ª6ÕÞ»»gÙ€*F±<Èè=j„FCU[³ˆèQFã–ÖY ZO—ô0*TÛ@XY^±³Z'½\ÿ9>êÀ@H%};7¹eñ’ž”Ý‘¹œX =($Ä€¤ÊäSgší˜¸¥|*‡{oZþ÷_ÞiÇyöÖ‡·f"<Ïn¦@Ó,¹… O§(bÇqƒŠ÷ž9$wò<%R=WdcöØÈÂn^ïJ9¨ÁÇí–ÉôÒ)ÅšQ4›™‡‡3OKªøù¢ :E¢S@Ñ:`”Ê@Iˆ“~ž|{;²I$i4ù`ÏûÐÖì<»{Èé¤çPÕ‰|t4!ÐãÈuD³Jš½§TGsu=pVÃÖ³‘Ǫrˆˆ3áM"÷˜pkÑ Nââa öó!ªªMAöõÜ„³’BÕ´éqÙdîç)SAYüp¦4#†à¾^jô]­T­Ç–R#“ZµšâÙHÜš¤g®€P…ThYkQ¨òüo†lŠC1…©ekú˜ëfÅFHsv—¤²¡ÉË*})   mNe¼V(3™S`ÉèzbÙ"Ÿ˜~ `gxvÏ&  îP™åj% ({déyYßÇ /€îõ¶Ò1´+÷©Ö0¢¨‰ FPá3ÌšªZ»¹Ÿ[êscøÈFÛ¬ÎéOn]yr€ä@c§¥p•Qq”ÃsCü cN-4G‰W#òÔûpé•OŸOå;T…¹föÝœ3¬æå÷;Àí˜ÕŒ É_ Ú… ãé93¨Rpš!-}DùäѺÕ3ËvþÈ©ùüKYbžùZ¹r¡f È^#õ)†i@­ET¤Cp+’Xj9¦aàR÷¡ÃÖ\aª%µ<#¦2‚Ë–LB»HŠÀų@9ç©:t±/PôžQÓ³"¶óL”ð?jVå v¿gÂëÅ TÇ$ÃÎ.d,|Úmø‘Ž_ê˜ÃŒñÙõ¢…kƒÀšª™2ú~zÅ\tOœž­5©pð]Îæµõ{6AÌ’d8Z#ÉÉ&ßíô —u‘öy±}=K&Ûàø2cyÎÍË|4?«`WÕƒk°±NíhŠÀñÎÅ–yþP³r³``mj9>®¦5/’ ëáæ2»ÈéOë=* –Ck]dãùµÑ2Ï_SÉðÕ]…Y†;GÒ»JsÝãò­y}œnt'êŒS•Ë­¦›yòÉh÷žÀ bäJØZ—ÿꬽý÷áÞuø}WzòÿmUê~ Væ¬áyܤ[OtÙ ’‘E½< Æôvƒ`޹j ³Ó~{â]nŽ9Ä—rOîÓ ð¬Âðužó±Ë÷•©ójÿsj*¾­~X´úÏRß{?øô_ú·Pÿ¿û>§þ¯'Èw¬éJÅ‘Oö0<áX×ë÷O?]ý=BøS'ío¡þÿä#ðçñ;ŸUýØ-ŠO°§þÎc€kÞìù›½cŸÁ÷\ãÛ¿f¸Dµ4Åæø¿vb Q‘Dž`ïèá\cV_ðÞ©›–~+Š–çO¨õJÚ†àœÃy³±Šø‚¢0ǤaNlâé,úáå)Ì5þ.ïsÛË.er2p6(Йq3”ïoîµ>9X–WñØí}R_ˆÿ|¯Úd–§$(Aˆ¾ÝŽÖÔ$¦ü¢ ’8 ÌrZÑKTQ›b ô0…öÞ‹×_ù‹Hk çHwüqG³Öh¢°T‘À(‰G„LíMµ©ÂjÐLû²Œ¥‚«Q!T;23óå[—BäÞO«t–Ãã«kùÕTk!0³dMhVL"ä8Ô1Ï*ª– ÿª– AÒšå‹-˪>úZJ€©Æ8eE*€HVG¦•d¨VýÃÈ“–RãmfÇÑíîgœ¦ƒH•Ñ .$£w´vkMU=¼÷n¦9€–çt¾ÜŽfÂèÝÝ]Dtñt³|ýúÇ0éê¾—Á0Ø»ï—Fz2—›d€Jó?Ê£P©cmPîé\§kv G¸Ëy>Üývy7~¹½EÄýñµío_S<&K£7%ý<»ˆ0»°¢ñ‘cˆ—=“33ó¨:kÊqœý<Ï3"SYßBDN÷ÌFD„™æqiÖRŒÎ#–x‰ýoÿç¿ûÏÿ¢`xÇÆdO$ï[C§÷55ϳ€ÿYÁÜ>gxˆ™„tÆjŸ¨LƒÒkï¥;TtžœµæªFövxÃà ʞ³Ã4ý…Gô‡*¬¯wPì8¦aÏ#’ùƒÅ.³ªÈD8ÈÙ`?Iax¨ŠêfáÑÝó‰}ºG„5ƒÁ#(L´ÎÖ©K¨ô¬ˆ ¥}"Ò#γ×ÑœZqºK%Æ8SE¡fHrÚp…•¸["µxhãŠÝ§15ùÙÌ´wçì»ÆÊ¶¹G3S`܉œ=>_îÏÒØVš…d¼@î~¿Ÿ ûõ—/ê.‚ÖLfGu‡ŠÈý|¼Ý¾¸ˆ3„ìŠ[3Ú¡ª~ê|Ü ÿõ/ÿÊ𠘉óñkÒÐC0”*ÚÞšßÏÞO’–£ˆ)2 b°ÎH4U½Iù£³÷"$P‰Ÿ~R@ô6³ÿAPeøÑ4¯RUžg<(Q8>­´¿¤jbàiªâçyÒ&ŸWüqBv!HG ú †ÙÑÌf¾F—ÙH K‚«:›Õí‘à‹|ÍØXKÍf I™Z½†ëZTeÎEIÕ*¹O’Ù@¡Â²T#2¨ç…LǤ5 Ï·8ÿê®›¡.A⨖)Ù³fB˜g o¸B…Ô Z&<–S! ýžç.»V ˆÙÄâ+p“4ÉÉálFÍèßÕ‹8Äc2£ÅÔ‘#‡_'Cz¬ÕM&-‰PQ…3 Wæ‹XI gg— éå@™þ«ÀÖŠùŸ·¹Y)Ýá"â•0õ9ºŠèPmƒÑ‡¶ÁÕPkb†‚ݯ¦àeõ¸¦u!sª®›À4:»¶­4Wºu¡‹¤7**a"}õuÁø¯Bã‘2©Û¯ ÔKÓv%«GT‡ÙÙ%%S¬Žô~žÉœ² ÿrPu€ÛçÚ;°D‡Ò‘I·‹A& YØ®DcÐÓaŸKU–S˜V•»%wõå♺ Ui™pÒ,+¶yîVüf|°‘FfYØÖDKñydÑD•Âã/~fÇàYP™j¼ŒÎû©]n½ÚCUìõÆ«7mâ«F3mÃ…DÍ ß«ŽÆéqx¾VÑ6B»éÀ¢^|Ü™¯ÍÄa߯q)ÊaÝ7¹Ý*”\%(^«„ú¬ @Aä'[‰b VÏbFˆ™,"‡A|ßÅ½Þæ—F1LÉzJ×Á%=.ò´áãðÚT²å"g¾øüÈMmº½#7¾öxãóÉË}Â7_óñ€á×ÓÉæ m$nö"ñ±Ö¥o£\äÚT7UÙQìP¸ ía%; jüëí‚ÝþYFV©²9)åè1s •«8¼½órÊ!Ût“ã¯Ãe[óÄ”Í/tx¾Ðé/\]£Oß…›ßýe>$¯&ÂÏk||ýÓœwoÞ¸SVÁå’|‚®ì’ü(@lqŸAù¯F±’u [dÐŽÚgRÑêåS&Ð1ZÛE€ëµ´MP¾ÏAÞM¯9 ) [GÃGÇáÏ øüoýžÑ÷‡>ÇõráÓ“ì%ÀòT—ðÓþóiõ_ðAP—êÊ;ßèûg„?¢|¿;àÇÒë7#:#­øOPÁþ¤÷ÿ;_€ Íø7üx/ÓÕŸãøÌõñ·;àÍÁà¥6æãñ®ë±×fŒדvJ¶&§ÈväήÔnIUå3ªßKÕŠÆáKþ¾¨3I Ü.DBüGÓ¬é=ñ"šñÌ鯾Áª‹«W+F_Õ͹rZ°°¡w­ÙûjBâ{/ËöºÜxù#¯6ÿéw_½Ë¸à¹KàåuDÁÓÜñ•ôî ÌJ5Ÿ–ÆÂͧÅåÜ8“cÕÂt‚g'2(¦ ª’}‚ìÈ Ä  X"µ©L¦J—nÚÌTÒ5hÔKqD]?£ß¯œ¹XËD©šE@Gyqþ1‘Dü”Å<$¤0#Ÿ!`*y5 •‘ø.9èR„a÷Ün±­Ð•C™PUFxïÝ»1„-Ù܉Z6+nظaÄCõ,'ø!|h °ÞPk:|èz¿ßs- 1 ¦©ñå•ÜLÓ³ÌÈÕr¶£‰9žÅªáLéMLÕZÓt†O8üÊGÊq»ùg)ó¤ ÌÎÞ3^ª¦, f§îå_þÏkÉô±ïŠä¼½½¥;lD„ÇÚÖ 3k„œgzYtÉÇy º‡‹Èq«4Ck6vc¼é`Dïnc¾’ó›,d~¸˜µpçÁô'Sø8Ïf–q´v<ò+eKAÎ ˆHÏ™™#Ê©$¨ªçyè½&( á‘  ÆÙÏf–S*'  "{iåƒ-¡gäŽÔ¤¡Qp>RA¬9ç¥W‡/ýbyš"w®µsJtm#Y{’‡’Ïnq¦S8"¾z—G6s =Úqä)î‘¢ #‚¡åc·<ÕÁârUý8Â~æ4,s9xÓº3%›?$ ¥‹L•¦o«0XwêVŽó2ÂÈC±²w(D ÅšSB[úã#½ÇÃl=pkk:¦ºAŠûFH¨ñÃÀú/HFRLDØŽ¼Îg•ÄæÊ,•Ÿ5„ÈN"¸b¡2ó§Õ„Kó „Úׯ˜Ú/_n~fñ‡LzUf°Äåþû]’bßCTÄfF€PÕ°Ö’ðç‰!ƒ ÷~³<¨ª·Û›<â·ÈàE>o=oÊP5§˜ÂÖ·ÐQôhÑ;4„†ÈËŸ2PjÎA⃀¼ÝÔ;­µâÂKxh>8²ÁLìÞ1;ÉÓ—­"†#ÂͪÀàöåM"Ÿ»PHôÐQm‡Ùív #)L|\–ÌfÔ¸2øPóª‚SUôIDÔŠé,#'3ôïÒ£1*ÙEÄT` t I–Uf@G~e’ÅB]D9›rbÃLVÄ#c9Îñ^™´X³Íú5äÙ’íÒ–Š R‘ﱪ—áÔ91ú}ÜõB ñT+”J[~Âa$(=AÿŒÿѲ4dYwM'â¦Î¿êøššjf†R¢¬ò«RÓ<™xœñ™'»ç7å&–>9ZG™EÕ¤T #ñ#þ'£ãøºˆMèµRFhÁëË ü¡NeKÔBHåÊåÞà\¬òÒïbÜ1 €'àœ1cLžD=Bc{øðí9Á;ê6÷ªœgáîÝ[ìÝ è'Iþø †Ÿ¡Dª%¯A|æKò'‰×ÿ"¥òa­÷'¯ú¸À·g¯¿:{¨.A6>ñEW_úØI–¯[‡æ2á’˜$ZÔ= ÇŽt­üp½ÏÒ}T¬wYµ¹(ßí%º0C˜Žð+îø3O6Í&ZÔ`À–¼Úddæ—S÷ÎŽ-7¡ïÞžÀ`ܾÂ=p¹²¶äklp»7´Ñ·®ÜwÒ‰m`ú ª.r¿?»‚ O5¦'iøÖ"Ý30«ÕrɬÛÐû™5£ÕJñˆ¨6×ÔÅ£–Š£:@…nífjá½'ý£A+òJ÷§:qQë22-ÕP1µ´1{¢Ò%Š”‹ÏȺ׊bË(%MG¦"fHw­Gôî­µf-<ù¿R®Õ”2uPYyž!¤‘Ô$ÙÍÅmF¤è­Ò5  „Gœ.M´5^&ÜU79—ú—ˆ"–bà×ÞåŒ3Ê¦í°¦ ðk!~æÍŽ<‘wWS’|ýÃ#Â¥µ£6©A³&î>&…+þPôM 90{‘**XêºD­‡¸‚Oû;®hŸ¹ •¢›w¬0ª»€þ*Œp†p^F-«C€Ë=†W ôe1 w²ˆ/¸׿ˆG7JnŒ\/*Üöi8ƒHX×Ãh°Öe©Ã6ânÑÞnž¹{6YÍkªÈíÈ\ IÐùûõ¶«…{¥.sO¦[^¥¾ÈàØËÞÁŒQt»f³DbŸSpÕ+rnÈê\ó •+šM6Ù?Kˆ¶ZƒEÈnmÛÂ8²“鱩^JaW6þ¾Ýu¢KÁ¢éFîÙ ëŸã=Mb¿bç},ˆ¸\›˜±«Mç˜Í43­2—SÛkµ†S^B%OЃ94Üq@\h¼‹§|sS¾£)òÏ+‹ï¨«üÓ3€o¶Žcƒ÷¤ÿoÌþJþ#_<>>>{</Í3…ê}¿òªç~:|öü~Bnþ¹êÿ·~>*ùYòŸýC ßw˜ÿ]Íò?¤Áó¯'ü#5ÿþÈõó±ñׯ+­úiư?ªßs•8Í£o¼cLÚçK•Ì^àBÆQ4Ç"mºM‚lûNº ëK¼—ªKÔKb.Y5Uüæ‘)§­¬VöH™Z¿*é’?”#D¹âm›¥¦sù¯¡ã:–»!!›Âƒ±dáõùÎúQ%8øñ»@ö’­§óÞr®­iíˆPM–)%,b¤{ôóÞÝ ÚL¡áEWEï~>zЛ!û3=¼Ÿ'D‡šÖ(’Ô÷ŽAh‚¨©¾µÖ#L1À2Uש¦Y1¦²C&"’ÈummHiV'c9òIO Iµ¥{0g' Ò*^Œ‚öÔÞ+;’ÐíÕ€1²“"Åâw£¬ÄFvLl@'P$ΓäÙÏì¾lZ5˜’Üð¦îA¯í»   ¹î E¬µt«·›G<ÎÇ€-°º8¡µ©+²té E3g6"¢ÐU *"áUð†±RÕÒz“}žžðÌæ›Bтѿ޻ßÝ 8rƒ•¾t†f€}ªüiIþ‰B¡8ZÈéÝòÑv˜™ª<Îó~ÿû[33“f8ÏÎ>îChšÿR‰óðl ÏkI¬%“G¨îim îÞŽVÈŠ<§ÇqlMTø£®Æ:¶cÜãôƒâî齟½çt*ÉWîžpv•œÕ²¿ ç vÜϳë[ÒdTU»‡HðßÿŸÿû?þÓ¡˜xz÷PZ¨PX¤ÃŠqÞ© –Ä?óq¦*ªêd3“S1øQ× ŒmãHdS+CÄ’„[:31¦*©Mªhøô%OÅÔM3¾’.© FxÄ­ÖÕ3-+1Lú£Œ´á§¤³çŽŽÇ—ÃT13USQçÀ< µt‘vÌ'ÔˆEUÆ3.£Ö(T‡ åcmh£(!XÀQ Œˆú• ” Csb…Š2¶¦²b8!'» »4Æ­ºSVMJ„ˆ©øð%1TfjšRf;ZkZöS·/7÷ÓÅ…Áûï_Ýýôó°ãöåK> bÞê-uà˜â甀ªªÞ½ ªJ @îþ¸Ÿ€3¸Œb R$¥¿z¨%®ã÷GÏÈò`æÝäë~üœ²p`®P^£„bSÄr¨°Œý²wY`ÖøUãoíeú^æ#n9HÓ²13F¥@òú䨭‹!‹9L !6™S¾f‰ôrõÞNèF”#¼–Ì-d2-O.ÒñÎr[/ï¢ôO*tZkH`¾B8’¦%ǯøÐ…$°IŸšãƒvèOI[VŒ1Êu³J +Ö7DWL°ùÕ­<¦L»Ö*xÆŽ®¡22R¹ÂËH™hHP¼ú¬æ«|~â)û”ShU—nß«Î1^FOÄ¥ÝçÅÔÕ)ÝîS¸]›Ñm½ð¢ VíÙ Ôû“…vU9÷¬¡ð¢ùàɧv¹20I¥þWµŸ\¸ö³æ{ÄåëI°lmŠk9ìØïb‹6`v®'ÎØ—‹}Ì$tÓÖ§óñµ¶y0`x9œZ17;SÑöµ=§÷Ÿ—ÈŵF*õu8àâÓäÊà50ö¢K^Ã;›ªÃq¼h°|ñþB¶ùËe®’ GÌFµ, ØøO~õ™‚ÒŒ`,ÔÖ“R¸3Ðö_}º³žÅ/¾ç'ŸžïW1óOÑæßM¿Ç“ù¬‚ýú/¹éxü¾‰ùÛÒÿg%Åo¨ÿ/>äw¯ü öçrÃ÷Þ«mÿÌÅŽoßÐÿöÚÿ÷2Äky,—bŒ`cn¶– 1GúS3'å¸ÔR…‚Š#ã‚ãà £Ü:)PGÃpnþltÔ‹È€ÆÎ÷l­±Ò¬¤k+R#y–g5`Å–YëÚrFsWÞcñ—EaÐ.+ò.ø8˜µ4œÙàYÜßÀª¼\¤Ä¥6 x~MZÝ–‘~o$ðN> õÞ=Nmòf·ÛÛM¢Kt©¼ìlЗ‰3Â#úyÒÌpˆÈé]U[k(İ="Ę–ðÞOïÞŽÞ}$ÇÞG𤡹4…¡¥˜{†3\Õr!b³Á“Ê8koCž¨Ït8Žˆ1¢Îf-f%“ én¥¼T¨Ú4DúÙÓR–å6áaö{i òÿYkÞÓɉ=`ø^Ùü¼ ´£‘~¿§C‘™§èÞÕì8n)´yww4"T-§ošÝ¼áYÉ8š)afµû^{ ä®ht*†bu±™áàoqk7ÀÈIaùßó§ô³ Õ¨·ãàÑÜûÙ»™”)‹•H^×yQæU4¡ôÇM‚áŒf ÞO’!bt ÍNˆž°:›«:µ˜´V]pÁpöªPÅý~ºûí¸™)ÉûýëÛÛÛíöv»"8Ï3ÏEíß~û½µ#‚î½w¨ÂôÈå~“<îé\†µ&"÷Çý4‡Á~Ö‚?TñknÍ©¬¨3áÃ2Œy*1ý¦UÉZð.ƒ{d‹#o·z4u²çé31Af2¸íív« 1G$s·¢"á4Q÷@@è·#fmt xTq¼Ra0(ú™±™„ᇪ ÝÔ¹rYÆæ%D¨ ̉¡3çÈ*[†é¡KdŒ£vµ „.˜Dõ*$’L££¡ZTž¬Ï“’  ÆÙ–¯ä8 Y9®£³ØÄ(êâ9$³%§ „j&Ît­ayy%SiƒRDKG>–ÙT±üj› UÀLááâ,ؘ(y'Œy$`Œ IdýÍŠSUS3ë'¤ç“I((…ánU×!”/I]ó•/1¨XË(ƒ‚bm¬#@ô¦#ò[¨Aæ:|8mSv5SDï㺂©Gb˜'S·"÷úFþ|l%wã£íMÆéñ×¹‹MwM ÿßäþÖ¤I¶ÑånfŸ&Ýæ&th›·pY/„šI†°²Üz¹ëú^ÕkŨ֙âv#Žç8¸éѲFËD+ ~Ùæ‰ËMö:ý§mÂ婎8§7‚—ª^¾+^={ó*Ôóš.Ø’¸BÜø2à{A„ùààxÎ =dšŒ¶dÃØ-Së ¿æQ#©<¯—ÕE³ÊY~€-Œ²Í/GfM¯XgÙXNï„->-ýã'H„?ö§Éïü¤'ü ŸŽxvùyõÿ£#ºº5ÞÝðaa³8rœ±ÿ™WFÇ·æ ×?×<ûÝqËßAoþÜOý|À[õÿÏ}ýÉŸø·®·Á?\€6oð0×eÊ=&_.$àœ¨Ã=SqJXº%D,¤´D[ãY¦w0ŸÀ*™ ¨Tèz|'oÇæ8b¶Á—¦FÉŠÿ쮪ž§dÉ`Òˆ¤¶*‘MX¨Ò}ÁD În~Õí@s+Í2ƒêá¾R–æ^Š×h(šòuËôtåMÚ cå:Kxw`‡v>ªbÐTALM@¤€@é,Üç¥ò+ƒÞÍ"Ëh«MØKâëEÇ(Ãl0zï33k`TeìøMA>º3¥ÃtÕiå–BŽˆŠ’¦ˆQ/=›rìA]@þ7‡Ê$}cÙ›˜]‘9Ušäƒáájv³jžù}ha§f×Yux #Dó¦Di¬}›DV*G€éø€ªµŠž­†Yf ?ÏH£}r® 5%ã|à$AQ$Î*ÔªB„Å*d§¨âhË‚\È£·ã CºG•0U;ûy´†3 ¢ÚªÚ‘4´ˆ9pÔTck,ÝC—N¨¥Zµ¬óµ'uÔÕ¥IH ¿>E4‚j03LüŽ4hÔ°ªÊ™§¬;5âYV'‹hZsâ 7 À²J:µøQ¼Âôœ{r©<Æó7fÛ %ã7E«î=-È·fj=Î~ÞnoívôAT?nÕvÐìÐÖÌ<޲*ÂG'ެš;Éh"·/oì=k#<¼A›ÁE….Eá& U„ôÇ™½³ª´õ©…D0…0ã𘘔!DA ÷Þ½C[ÕT¬˜qæs‚áHãè1ñBù×ð ûÌϲw‘`ÀKzÈ9¶¤x@\%B¡¡”°U"“§(N®e‚Y| ºšÕ³¬Y~‹N‰ Q®® 5rT{L@5óö‰E+ŃªJu†+—÷´b“šÀåÏU58=hÉl!=a>Lâ-»P –ŸÍ $¬“D#šÅ@{í?MUY]5æýô0òm¥ÈÖbUéÔI—îŒ a¢ÇVžfPè F÷“=0`] ¢Á{7Í÷ %šg5*GµVËi¬z ©HC–„çâ #I+#w2•s\^C®üúy›hk‘§WE7´øXÿ®æöT±üNÕ¼dPw}Avq£ÒqÂåuk’':Q.øâÈÓ¹¿ÛE±åD&c³l¦£†vƒâºÅ–ºÈ!²Ù s›¢à¨‡ÈÅÞ`“îAŒš€l>š)UÕAO'† Ç~ŠÃéÈÀËå‰ÿ´œ«t¿®Ò'Ô~$ kk!³›Å;ÇËLáâÜã²O‹kØXƒ3evªNk3“zö*æÍ ÒöŠÖ­š€›X†å}&¯Ê)ž=ó”^µûqòeÖ™è¨ËmÅE’ªÜXÊç¨*g¥ãÚ?~¹‰(9„CÂ¥ŸÈaÕ*1 v(z·×k52Ç=I¶£g,FøqÔû¯¤×!ýµQ{­oÁõ–T…Ik Wé­9uÊZSÝ6Ž»©wÍÉ8|xð>xDûÑ¿Pš¶:nìêîE̘{ÒÑ·ËY†KëÀ´ÔÛ¤h|ÿ…-[mëÃC^ºqLsByöãW¶þôË™)}ž›YoÆ“8ö8 í"&NYœ—#Â×ÀÆøo0´B\ëˆUuˆ›»}|ãË}ÿ¾Yй‰;Úäh¼ìê/å©|‡»²|þœÏPyç2yÒ;úBQdzʌ§§AVîÍdëF“'±b3 ÊÓ£eáŸ6mãZ(½uÐ\&&ÛT€/d^þ_Ü—X]JÓç÷=©ñ›ÿ–ò=“4Ìíüç<û¸ ”ÿZõO —{äã!Ô;ê?œr=äOW^ÆW²ÿ÷Ä`È õùÊ' ×úW‚ïÿá fßu)ç~ø{} |úøàÏ þÛ€¿ñ xw2@y¦¿­Pò@ÿÏ%t ʊͦ YÝ„œ1×j¥K&ÐV"+kщRS ‘ü›/Ç4e"s¬Ã/´ŽU®`1 sŒÀ€æB±þj¶„­¨Ãš³åd9ÄV—€¬ÚKT£^Ò3?ëîe.Ôq½üGR|á~/IÆ} Àª„“­6íÝ×ò¶çÿ ú:¤¿Ò÷óö‹Y»Apö.Ù¹‘ä&n^wM>‚%ܦE¸ŠÚ¬µHÿ˜J-lNº!ž~J4ZYðäm†A„i¤wÇúsT%¨B¨J;Ù*)}¢Œ|¹£È…{ÔJØTÓY !ŒÁùúZ©Ñ>ÃɦVƒ(ESs BÔìvQU¹ž6U5K½,•”ꚉ, X\ˆÈCxd '´ÜŠjµË ÒŽ¦¦q¿=»›©(vB”ϳ½ßÿˆšõÞûÙÛÑ~ýõ×·/o½÷ó|Pª ‰Ï;]©›Ü´y:Re3S³Ö"†×é•6U3{ÙGY²z­i#B­©™jöh/Þ7ŸºW+ˆH÷®ªÓ¼ÓCÕŽ–\#‡ˆ©µÆ(éœè*j©K4kVy’ùÔ*¦@šy¡šo7aü§ÿýÿøç¿üå?~÷ˆˆ8{÷ˆ3zm-€h7óîÍ´F„G†ëýÝ çùÈóŸ¨ÇýqÜŽ¬ÎM„'Ë"™E‘ 5³’ð U%ÿòÿþ·_þçÿU#GM 24£PQ5£xÌåjn’]Rzœæ©mR jÂÈ9ºN¬j¼ÊLš»¹Ä7U/:d¯ÆC>\¬¥8ÍY0!Ö´ŸNµ¦uPð(bFŸ)( Þ¸C¤/XaPC‘ÃcÔIÓ€w Óøhp4£ F÷º¥× IDAT2^‹†ˆ’X……T†L̓ÍÁ%«º›Y^#PÉ©ª§"ÚZ«±hY6ᳩ“`·êªZ>p°y_½ÿ²ú.k3iÓ߯„Šd6Ò“›P-ž¤…«f¤S¨ö¦ÍÍ4Ü) °v@5€/·cŽòRü¢Š£Ik]ðÛo¿Ý¿~ÍH¬H f–](=ª¾¹{ÌA?¦P+”€Ö,‚‘ÇQн'¸,ÿ|ܤMÛí­ìû]B"AÍç eÐ|Ñû£[³|J„ˆ‰õþU˜" ¢!ŠJÏä…>dQäPYÅÇ3(Ó9Uç<`¾A¸wwm6ö˜™š êSel £¥VJ¸MU´JÜM ¦Ý5z¨ötDDèÑ&ðÞÇnLcøe¢œó z AøC(ÉÞb*?µŠ¢CMŒÉ5§¡!2Ÿ ÓÃN‡Ò*T ÉcHôH@ž&{\&ëW(ž7{ëG+ì`&¨Éi~E“¦ê÷ÇIïAO§©£Dº`ttéëX]äœ9·âqzDH~àPѤ©A„jƒîYJœ^Ñz,¡ÊžÆ 4—”*BZ¨æ"—*¢ùd ´lÝÅz^¾÷!~ªÏ³J(ÅóhŸd8s!Ûi-24§ƒVEfoÖ ·ÞÔ•é|êUÒ8Œª(Õ~”dd—BñpdU׃j 1ek‚nQ§fyï¬]¿A3V½h}¾K“±@„&=ô5iHÈSþkˆ“ç|ˆî¡›×ÄU»‹Ý;<̳›Bš$ó]¢‹3BòÙmÇÆ¨>Æ?Lÿ³ô¯¹/Ð-ɰ’ˆ­›­h)\B– zXºåÒš "@«s -¾ÙèúÖ½$z?ô"Õçù±¡¢éäË_|ã–>KPc“õ´Ÿ%­¥¾ÕE›uÆSOvj¯Uå€Ö"¦é|ùŠâ÷‡ÎùX³Ú³™‰ªÀ† ÿ:d Çð… = ø”ÇÀ ÊríqˆÍ,6¨E¶ÚÓ/›«~Ù˜e«š^£¯—vMlø¸íŸUË£Ï÷Ú 7äu½ØØ6yúU¦(s¦Õhl9c‘––jN¬Ûþ’RWAwÔ &?_÷Ýî~õlÍ»—Š€kõÝ ”¬_”¨,\‘‰æQFõQ]uΟßJG›ïš!JðI8¹ ʼn9¢™ÛîÂi&1óöQŽÎâ!!¯ñ¨\Äÿ×&I| Ù<7þ®ösË”ßy=Æï*ÌïU‹bw÷Â˨`Ä‹H¶‹M5I·òÝz ×!+ñ)ž¾Á½{2¤.Q —ç×(¿^÷÷Šq<ÍZ6TQ)žaE¸6~G ýiæ~l²ç?þZNz™zðéü¯0iSÞ‚ÈKÿO)’}Ú²g~d­tÞí|SÆåçâ»òé7óüffàßÔæþ×ý-ò!úÿ‡´nü¨†þ÷šàçÑÐ?Tà{UÀïL6¿ÿ^# eš<Ðgdæ$ksÉ) ©¦¸<´6¡›UHNÖÕÕv Ü4Xë´ÒIuQÇJÂæœB¦‡¨ð‘!b›Ñkð¼¶)|¶ÖSGŠZ$ŠI}Ÿk1¬Ö£9«¥r×°öÎÏ|½pTg¨uCØ]’jsw€wò@ï„«Þåÿ¼ö\ ‘ÁPIóæÙA´ÄäèÌ?¦‡(£ÿHÜ"¥u‡!Ø{Ì'ÒÂO ÷Z©0Aû,Œz6àMê~¢ÁE Ò=ðÜÊêæ I§iˆÓ Uƒ¸üIáIì!̦‘FF`0óÓ•ŠU¸ÐÆ´øû»‘»ô1À<î*°¢…C$Ä) kíhM5íÆeGÙ2zƒÑ’Ñb©.cÔ¼À+“h)½OÔ´fM¨ÉXÖD„™ì~Þóxë½w ÛÑŽ–FFðìÝZ³\ïEµ |"ÑEÔû\`¯{H¤(Bg°‹´&pi¦g÷®Ö" qºH¸ÃI2ÜÕÈ̆PÜóÖ´PªÈí°³‹H¨ˆÚqè~¾2z5h—Ýó~žfÖDÏœÊôPE0Ü£YSh4³`*ÏHNÆ3ׄÒ6À“¼rU^ƒ™µœxéhä´|P„6žf·/Ö’9ô–ç[DUšª§–+šM'ÙuPwU»jæ_"ztâžcº¯ÜÛ¡‡5Uõ ÄÝã¼?Ü=eMgÿ¢øw_~¡{k-ï¦ÿŸ¹·K’$I’ô„EÔÜ#²«X¼€ð„€hi±œ®Â1f–`ÑU•áf*ÂxQ55ˆÌ¬êšéžê®ÊŒwsûQeaþ¸‡‹°ûaÚ¾¼~¹ßÛ¾÷ãèô|þGŽÊ’GßL%ÄShí¶©Ñë ¦0ýÝéŠUÕl¬‡^8d À³K¡e¬ ‘ü¦$=œäv{9úCú4ºÓ'‰ž½sè*¦–ç"*c¥Z°ÙÙz®h¡fºåÌ5åÄ!†P‚€ªå5³ɯO«ðl¥Ï1RÔ9¯ è«Â{¤‡¼˜DPî †ä$U²¡Hò©‰Ù­‚‡½ÇØ+S!T-#iÖ²°AIF¢Ëð$æ]†=zoV# S-ð6†Q3ÑKQ‚í\ž1G¼P55‰=C!’Oc8Ý%<‡m!C ÏbJËjã±›‰7Â̬©©©åĶæð¢fÒZáÑûM Yò¡‚îâ™ÇƒjÉŽA‡¤úÁÞ)`ÀL›™æ§_Ò]"TÜ'ê0r H5™çÏÁ d5‹®%îy»vlâD¶ŸÅƒ²À$˜µÏ©»æ<'RÚÈ“&âYå )AÉ4Þ騝$ÃMFuÑò?D•áÝ ™*…Î.¬¢iù€Á}|¤!©OßÄ©þ“WË&Öª¾ÂcŸ „«çµ†*Q¦X+m!âíÃ䃢Ü65tòS¶KElêBœkñek†*¿EZæÅ5õº€hV¤Hú;%^³ß¢.ùòôC×[^̪'ÿž”¥ÿr¢@tÚäröSM¼2ZÉbáë©`y†Íåé(4 e? §“3ø±ø,ðüB¨©"°3éqª££Ë¸îw'½^§"'`ÃlžÖ¤ÒÐ,(_,·yÊF]1W%O?}rbs,¤".ªâ$ [ ª‰*t/;Hx‡P¤ H^žÖSÞýQ“²tTNÈSxbÌ—âº1Þ;)—d÷ùéMÄʉÞ=Y.˜[i¬}ssç·PzŸ´®3Es6“KÐ`MŠŸ'Î¥×UEÈÿ¸‚I^U¼÷e²äL§Ì©Å¼Øhw,¸ÎþÙSø“ Ò©¨£‘jqàØ®'e^ç™ã5›@ȹ)Ö3&y3:†?S1^ÃÑ?~=Îh½W‹ÇécžnÇQuw†¬9Òµ7ð»RÙI".æ§:ö«þ‰ŸõìgÁ%(°Vé^…ƒQˆË>¿k¸^‘º¯ŒVs=/k¤×¹¹œDÅå­ŽñW«"G|Јû­ã³^£ï¤P\yó§—Hθ??ø®Üø#RäûÎï©·K¨ø¦:Éߣ|~ÐŒß"ý0—eaòˆãsæ§ÇáQ ~ÿ/³’ßc_´Î?ÄpÏN“Kêüïù]\´Ì¿‡øýíó<Ìø;|.?øvð³m| ý9.¥¬óê4þsVÒÔºظ NÇz=JËÃ=êsùÐf{Œ. #jÅ—Ïé÷·3‚0éóÉ’þŸ4ä-Ëv'mö`i®.ОeÄ[uyĵw¨¼ÿ2Ò ññºš0c\ØÌÙËÍl A|ž—Ê(àÒû3ŸÝÈðÑí#ÞÇ•íù÷ÿCÛl»ß ‚è` rL†´\q´Ô#ÀÄÖËËdT4†¦®€ÙÒ3%žß'TSÕÆáiU5Ët>4Q<Œ$W´tC§ÏOÇ¢{îSGÊï… ~¸á2xžV¨éЉàd®Öã§x;£ 6áÙÉ‘.¼Q¹î0}ì ݶör{¹o·–C÷¡nj6™¨êá”— î⬿€¦Ãôy69×óAæ+Ô¬gØÚ¦f9C0ÕÞãèýv¿Ýï÷Ǿ¿=ÞFýfI¸)ÿ6³qzžöy¹\ÓZKaïÇ~"ˆð£;ɲÏÁ†GŒ:OœñÆ #U|©@ò8Ìý0”Áé´---³™ÌÔñ4RDõËËËÛ×·ý8Ïüiw1¼Êþ©ç:«YY@Ô( ²G0 úןÿú/ÿôOÚÚÿïÿÃñó_%ü±?öýÊmÛ²í@ÇÑ顦¤ôÞï·[R°ò$2µäMäÕ·ívÛ¶ûý¶ÝîfæÕSÀRN=BHP–ÅÎÙ ¢µf­Aõè‡æq¿½V¢IU›&Ö2ÉÙ°S–|‘JäòŒŒñžª5K“q顜m §Fˆ÷€ˆ‡SBUÍÔ»[ÍÜÄÚy“‚à¶Yk-¯S´f*Ú½3r˜!0xä,­YjøDºpKtèîBºD–7³ÚÄåèpé)S’ }Ò3H€Igž«:Oº…È)$ÎÿNû¿œ ÛºØÌ”ÄôC’bªMuÜj¦•‰’Ù U™×I[„‡¨å» ºÂÄ’‡ˆÜ^^«Þ )þ½÷ýØýè½×4K5"ûž½ÏÙ·_153{ýòzyÄ{xxÔ È‡x(C24ûÍŒz­ŸS·‚¬‚îí¶™jx-DpÛ¶¬èóðlçΙžd4Ó—ÛFJ×f£å|Xòj;],ëmkíG·…Ÿ»s@›w<ƒ6µ½YÓñtÑ)jæSÄÔBØ{'c–¤LÊC‰;ªü$t4åb)¼²ŒEß $èáS;µZ…‰µÌ¹p$ jØ3â¨:¨á¢ÖC(Ê´Šjö’A§æí¥îW‘NçD™Ôøv ªÈÀ¤žý:˜9¾© ,.FQ,ÏÆ³l³>Š9¬àì‹9bY“r4DË o¹ìØ1 nf™èô§»#´’“6&kœ”3%;Ö“ƒË{ÁðꜫýqH ®®!žÎenˆDvW'‹j^‘c‰u¢D éÕ3Œu¯(P<âyoù¯U5«À÷/cˆZ`ŽÃhãÄ™J(W0 N¹Tq†IsPGw̵s¦‚ó£ÅºŽ¾¨WãçŸ#¢È–ÜŠhËç æ_?à1XÓHœ?€˜U¨¥ŸÃPÍš6¢w ŸêݸÇEöçÌÇVðGÅÊ&m¨9‚3À039à4Tšñz¯³Ç:Àry0ǘg,RØÎ6-O=æªp™8› åŒvV¶s¸¨Qk¾¹P€ÂšŒ‡ãéEÐñKAHa§é>ŸÑ¦³ù}`&‘€ œ<Í!á¢ÜíP°leyáËÆb<&pÖôb@R‡›‡kz8WL`®û§8$—åÒÇÏ劾AÞÁþç¶Ì?î%{{Ók "ÒÔÌZË:Zå e¤cyòÎ µá¢NñS ðp¨63ªšÉ} ±¾ ïáîeÈŠ3hÏNSi›ekpyâ•p+cP2…ST@ä(É#2ö-‰1šYk­û×ûѽÇÍ,Ó IUU *ÑÝá!ìQµérKyÐÂåÃu„i+1@)î3æH#Ù•µe ÆÛþÈ%·©éDS)„°Qz(kŠ;ý­=Óáº<³òTFÐÝ}‘UÙ.„$—YeÛ6²Ú€{ï ÷c?ú~ ‘ŽÝ=ö`lfÉðU{g¡ñÜÎ~dv ³u퀙Ur8ƒ¦* »i*d{¹Gð臤OXØÝ÷ý1&Ã$XtHùëŒèwð‚¨Pàîî¿üúK¸¿Ü_sCKEH¬F† %:Ê£ÆDjj²p®óÐ]MÃý/?ýåç¿þõÿúÏÿù¿ýOÿL ÐzÞÝÌŽã@ï÷ûÝ´©*MZk€?of-)XL}Ù–)fÝÜnÛm»µÖnÚò­¹{òüE¸{žK ÝÔê°+L­YÛ¶f­¹ûc´m%´á²ïÀT˜“ ºˆšT»D#“°8ÍM$”¢Ù+9›p d&b>Œ["I%ËýZÊ8ºIÆêµˆðCÄ–“)Ý»J&ñêè^cLc´"+¨JUx÷¼ø‘7ÿê¬D°m)M5y2[kGtwŸŠA"¼šøÂ̈AÊïA'·È¡1Z¤€6•>|`ÈVêd¿ŒY œŨÉaa¶R£Bp“=SSÚØ`Ïúßé¢+æIq$J>Ðf-ÍÜ·ÛMMÕÚý.¿~Åá¾ÝTIÞ´-üpVÛyþgÛ6K J w`üúõëËýn–~öÈÅþØ«—5ƒÈLOζm3³Þ &Àqt@rT6÷e*ÍÔ~P²1~?uÝšmÍ(Ò»{ä Â%\ZÓPØö U ? Ò=”¢š+P:©bÐÈÇÇp:]ãÞƒ4Ô$hm¡7µ³ÒrM²¾˜p(ZU¹0‚Q-’?‹;TâìŒ&3Ê7s@ƒ¤îáÍMÍ`8kqÇž\Õ$<œ˜Íì*VRoÒc5b+,=OC‚Jó4p#(ШEŽ& ÿ=ÖJ‰‚ÒLKH¶â „͆…MnÔDð:“Ð =ÙÆ6B05€I³*Ôr–UÎá&óv`ޑΜfQÜUDPw q *ÕrNƒE =çK.!Gõ@h2µTdúíd(l9UË;Båá…&«¥dR‡No„é­#³0w|æ¥È [Ní¸‹ÀÚ4 Îp_¢·U.½’º®3j|"¼2>goãé裓$:½ýXjûÀ·ø0Û$¡n1ˆ Åx.áµrC%•ì{ÊÃ[†N Ì^’pDª&vŠgTnHÿ29A Î}É•V7î²£Ê$¡D6<ÃÌÔòɱñ²üWÔi|ÖIÓ-4èl EDÕ'Ff€ôLX „!žmRñð ËõDKÖ&©¦þN÷¼H&• mçdþt.­¹< Qƒ!V“½K¥ÛÌ3¬Y¹ãà°y±†Kçñ…¢qމeØþÉÓ2¾~:g¡ŸM¬K÷V4†(}ùñKEø`F‰ÈdÓT¼"ƒ‰³57¸æâú¢V.ïÕñ, ¯”LÏwƒ¥þ•gaµ'?§> f…Ó’à“Ó~ e1{(ÊÝΌ„Å(Ž5ÿ0<ð+˜ìÝb}óàl*˜Îš¥æM8sÚ46ggß „ÌB÷î¾§Ëx%¤ƒïZÃ?u›÷ù-±ò©°cþѤNá|Íê*}žíò[*Ûwg߇í|`²£·!?U¼gJýV)?¤Oã½kõdþ¬¬¿ë7ãìSÃå\åGC‹Vr²¹ø(ÎŒñ´Ê{ÏøóÐèßÐÎßôñðoýõøˆ%õÉOû·,à5Äô¹7ÿ×öo‹/ýÞÏç'ðíÃçMœKŒXb¢µ Y—Úë…™¶?F­x#¨º =[4‡¯ž• nT‘5JI3"qI6æÎ§ˆ¯"^Øsêä@4,Àþ ^^áóYP•Q;Û 9„Âz×8‹ÙPèi“™ÉƒX f²îkryöž-§ —šñ§“héAzO}{êã¬yÅ»Æk¬×Mk­µê tê(Pn¦fPK—o€4ļÈêÕ S³F "BÁH¯GíR2‚ìG‚ÅeäÙ #„¡£)ÖtPXb8&SMî=i µ±æhç“`¤øÛlËí§ÁÙéî¹­N¿heFýºyr+RÊu6“¦h#ÙMQVÂüH\Øo½wµvÛÚtÅÕþuP+ƒá>lŒ"Pݶ-ϰOîg@4<½ +€™efa.Ô{–åÍÒ2⺵ör»o­ÝSp]êÎGx–‹uy€ê*,‘šGc,—Â#,$uÜ<Ìç"±Ýn///BþòË/â3Ýœžo³àöUÓ'PÕ£i„_÷{ã#&)qô¿þõç·¯_›Ù4êj21m6ÌDÎîµ+Ô’ cÐ ”UÐ7·:›YDüó?ÿþÏÿãÏ?ýY$û-âvÛòâ¹ÝrôÃÔöcÏiªSÓï ÞÈ@ò­Ý^n/YþœƒÉžSÏâKé½·Ö´6ªªÃofíõõåõvˆ_¿¾y8ÌŽ_ÿßöåÏÞ¾I›oUôˆ&Z¸d€ ãhSY’Ò’¥zÊRb©^Y]¬ì¹dO«íž•„H˜n^1ÑìÄ“ Øêð *£³{W¨ê¦ „d_ÍŒ “½§7ªÜâžý j‰ÖèNòèGwˆfMD›2H6Ö˜@µA)”..Ýs‚ÅÖ4QÜ™:ðx¶DSUMǼŠx°Lq J‚ Þ~‘õ$#C ¹ÏÓ8k¬[k÷Û–¯PÜÂvoýk8#º+ô—ýí/ÛM_^±ï_#<2wajÛmcнêîy#8úÞ¶¶mM„Y†¡ºÝî[xìÇ©å)×}?Ž‘åýw¿5Ûš=Ž]›nYk‘(®ÈªsèÁ^=·ÜnÛÑ÷ýëÁ¯ÒL[³¼3 C[Õ{ûWè—cßé‘2:ÃÃÒù®„i“Yû­@Üî[ZäAqG1©š¶QlN‘††3Møò®h&™t2ßWi&9«UP”$Ù¶mÛf¦Gw“$¾ÅT÷% ÖÚfföp—ƒE¼ðH¼þÁòæê+”€S)l¾Ðó<4=Ëzf™è{)í½’Fš«&º‹%i­"Ÿµ´1Ég]ÊÓEPÄ;UÀ?Ò¬¿bk6pŒ \V‘‹™M Z®y%IY >¼'6PsnÁ.˜”mx¡x÷LB„ÃÏàÌ5 cÚPYßF’ðˆ,Å-÷ˆC ÙfR ݦšM½§žÇ\ÔU¢ £&¤–Ï%Ñç½Qœ" œqÄi~¸‹C²&8åŒiŠB[—dLܙᵘwtÉ瀨|⨠(x$jOÁÿórDÆ!D­fÿ©ÒL|ÿôÌN‰kšl±ºqu(/ ²‚‹.Žîi¡™®¾Sçàóv,Ƴ½ºdÒ*ÏÒŠmÙïCWh@®@{ÑžòYaÈi—Ä!¡ }`ly@„M`òÔö;4Ç8¤ÓÙ:«\¤0g9t¿X€1šh ÆNɾo-=Ægï§f»à?Dœmœ¬ñC*X**kÿX-èN{LK9@‰aÅXCÙ"š:9fÊ»ŠÄ‘k&’ 5 AÍÉÈ U¸œâ…Z;³`ŽÉÎ@­•¸”„’"té¹ó P–…çÚ'§|š6§%MfÀ9=zd“0l89­£§¸†Yµ¤µ§›u œ+Ü Ó9ek\%‰!€œfJW3)pŠŽKuÆ¥èãüó…™S¿´øæ”bñýfeä‡vÚ¥¿+¯èÂ×Î+P—\DÀGxg­Ÿ lBæžõ"ÚOZÀœa-eyãUå?0€ Ê,»âœ>ÄXCYÏ%Õ0>@ÈŒj{Ó>/Æ9yže”> –/_Ê¥×i¾iA]™ x¯æ|Óœ,ï{Uñ„×.áwæöwM»ã«×)O…——ã­— IDATúYÎQÊ¢_àBË îEû•Ì*óI:÷ßwù†Ësê½IfïB|ªøñ7Ÿüßýþ˜òÍÌÇ2)â7¦&¿]ýÇ·"Щçìø¼ùÎ¥?’)¯c^xf”åºôÏÉé§ %ÅþšŸÚg1ùó€¿E[þMÈ|Îÿhþ¶×Ê¿Yýçç$~>Ìü}ã |RÀýËÈ3œédÀw°¾ïíZõ;[Å–)î€îÕCzLä# FD™T/ÏùƒÖ9 tþ­¨AÊþ[‘[rx2¦I!¦Ñ\Èg1@ ;°"6lm½@ÞÖ©:¯½;cv ŒbH‚s-¾Î“#r2ÏÝÉ2¨:I8£ˆ†O±Í³¸T/Ðű ´qm²á»?ìãhÐaëN#¾ ¦0³¶)èÌ`í~K@Dxäš"Ц֬q`LQbà­ïˆ&f*Aéá8h–›†4HºÐtj–ÙÖ«”Ѫ@8w0 ÷²,å7FuÓŠr3ÊæÝÙÜdK«’Ç ¥ªZ¨q$Ù£ê 0Ù’ 6$„Á$²Œ6 ÒZC¹wK€8ìcpF=ÃL[Û(Œ>ª )ÉAÖ*Ñš©5æaéYü«…$:sâ4''íÖ^ïwU3ÀÔÂc¾iM ~ô~Ѭ©eéñh]¦$ç˹Ðffî!ÂÇqtæB-ǸµMe6q¥2HßìÖÚV&Kш´› Ù»‹Luâö‡G#yÐSþ”ÄÛˆS§ÛDpô]vQE³M W¥@LbI…†¶ÂÉÁ#­¬kû8K¢¤P_¾|y{Ó·ýx‰ž6ö/_þôz¿{ÄývûóO?™ª~ýúUîýv»#èdxrLB4?}³&r»Ýn·,àÏTjrÖåŒl‰°Á€ÌR¨Ô[JèÞÍ”'µW%usó#Ä’9É‚‘]\\ –iÕr±y,UWâ žµ"ÙØKjõŸ 9dv¿ „áBÍ>×YKǤ‹Á+]«¤€ª&Ж˜¡£Ðƒy€"j½¤€Ô†4ÌÚÛÛ”×[Óút¢{/t’¸@Ì%²¡eŒ@H˜1âpéÞóbRQ˜â¼?ø¾w@ï7͆`ÀÌ6w7¨„„B¡’€ •ÁÚ`4e”Í+bpák7]`¸á À`"¦Zw‚ðp&² Í””&""‡w÷ÛíëÛ›iµƒÝ:±*Ç®RÞÞ"x}}íáM5áñ {ì¶Y3í^mÒ~ÃÍ6ŠÜš9°ïý8Ž®I:x}}ÍWx¿ßö~ìGbšÂéýHlÊ×_÷¯otÁ«êËË«GìÇ/¿þ²Ûm›vî"[k9K}Þ®Ììæíë±÷î/·mËÿßZx‡{tï´›(”-§ƒ{¢qº‡ýÙY%Ú„A¼|»ÛvËF6‰T£È­µÚ¤“‰ŠJuÛÌ<ý5b,²H÷x8EšÁBUZVTeïJUËœõµ¡šŸ 8€ÞƒF ÔȡܬÑpòÕÖlŠI“jÃõ#ÝX©´qˈˆ#&Ä8²šHµáD·ˆ¨FäÌ‹“vEˆDñFŒÕ¶åƒ€µ‚B–Y1¿É¦^içCN­ÖD u­“ÞJšÌÌÀ²qëÏgñ'6ÏkW®P Lì²çÂsÎqÖÔµ¡Î-A[Éü<AQxšÄeêó,}ï’\;C‡èß ¡C>â ƒPz,?O$†"Ç·)óµTŠd!Ç÷Ò¾C°Q¤ÏÊÔ4v.ØU—c:%c]ƒÓK§ë9ôéO^G¸°­Ï/Ÿº /{ñ¹&Á9V,ÃàÙ˜„zÏ„^’³¼»¸»4”=–†‰3Êb¦Éé\(IdOI\Κ…š¦i¯)¡ U¥æ2ån\ÏÌÊÃ`av’OÇŽ¥þ×O—†˜÷ÞäRŸÞ]Ç„ «“·nLxyž Òr®_/8ãjb¿F»ÅD‰.@ìÉa«´ eQÙ‘t×ØÏº£—îÕ=ˆÙä‡Eä®;VñUGhEiª>bh š{~@g,fiþXhEëȰî=9óɧ÷bzf IhC\sH:ûJŸ²þtÉëEˆÏ˜#ÎÝÞÐ~ÎW¤È‰q:HøÎï|Q?Ç>²Võ¾“Ú>Òt°Ø~ªƒñ#Ù ó%ð,7¸ž'øH“›nyº=æ;=O“ç&Âgí•—ãµRBFM1¢$HõÏîîK-°¼“å°þž§¶€kJà7™žù{Ì¿øD¨üHúä·^?±Û?9çÿ($ý·æO¤ÿåFU›§g×=>Ñý?×}9ØÅÌ+ø†–;¾…Ÿ}t$,â=듃À~ð¼øÎïÃß$áÿ¶ì½Ÿ—þù=Ùýg?8ðíaÃ?°çï–xò–—ûÒxÅ5?åžZ;1Òw;Ø(Q;=i]9ÀÕ€_†*¡rzj'2qú2Ì—µø~ÚN°Šò…åxX³MOǺ³u °1ß žïWÀH0pî%†»cųP}ôäj5³vú~4“²Ò)¡üí¥díêæ—ëÄò.µ†¹\\?hûßþ§ÿ±éh]6C:1[Ó¤—C€Ñ5H9زÎÙ} xóÇêÀm¥ˆ!î‘Ñ.Œñ¡pF3c>úNF¾f¬œTÕFËq¡ffœ-k9óÙîiK/Á^l´êt°‘°d´ÍÕ…®×1f9±çƒ|Ñôx6¡g”¨šCtTåŒ6=£IÓ›Y1ª2K!‰TIV»xݲÀe´ûrªÞ³hsÌÙ8twk(ªy €rc€ë×QI8ÇðÓQ×ò“w»ÜßpúÖO¦íd×,*äŠÔOB\Õ°Ÿ5¼ËE¤%lŸm«Õ]F»í(5šH®r1‹–;ÚNŽž7_2k9x2åÏ»ÀH-ŒÎ”¥=DÖ ²ÔŠTî){póæ†õ}Œh†·ê¡†Q˜/OÜOýt¬Ì^Yª€–(ÈbéË~žùZéh\fzÖ /‡AË‘“Ë4ž÷ÒìØg¥Ãù±±F#¦u¤K$àª:/ÃÏ‹˜ýž¼¼k|SGþŽ6ö¡^6{*V|ú;sùW?u‰9®g›~ ‚piI8#açXôã†ÃUáÅ9˜§q¯§±ÈRÉ»¼}où_ 3Σ6+Ê?QñÍ?àï°KOÄwdU¼÷O_£˜ù›¼w<áø—îžõžxVÏ<ƒwÖwôATKºà$W}StÆwߌˤ¬•ú7¼iüö7óùUÁϾ ß»Ì~Ç©ÿ#÷…¿ßÿá³úØë#OWÆYÉ%k™ªŒ•ñ0,ÕjOë¿Ï¸óKÅèÀ­?ÔåɸÜÁÇmœçÂKæÑÚ¤L6N3²9™/?_ª “B¤CÒÇYf¶Öç×…Åø¥±)üžË èúd׳> Ë\#=pÎ/ž3vç£çš|>kŸÛ>Œá“¬ÀócÎþ÷ÿù?ª„B`hZ—¦Ò!>Å<Õ…8™-œ„©ÚpëƒUß=ƒ@¡N²m[3› ÂÓ¤Hÿ»ŽfºtY —‚ᤆzï}äNè½gól`aÖ’HÚr…iÚ¡ÈÌÔ(e4ñvï:=¦‹`f ðlm£œÈ¦Ü|g\ tyanêJ‡ ÚZS3¤SìlC…ªvS½Ý¶//_ÔZÐ9®S3kšÌá„LwZÜûá½ÞAçh­E¤‰0H¶ÔÉÒŒDf„‡‡Ë¸.ä¬U«Œˆ4êHÕsSPPÔ÷Îó¬5#%/íûÖ^^î"b"ãØ¾µí¥Ýºïôšz¸„xžDÒ¿>z?:T½ŒýØ»ÇËý®¦Û¶¹÷¯o_x}yùóŸþôÓO¯jöõëãqý8ªQšµ(y$ÿЭ™©’¢j­µðÐÝGL¯ZÕ­5ôˆíÖZ宓3º‚‚‘ª‡ªe–ý3]ξœ¯Ç y·‰÷8öz5:ìî^™¼/™šÙH ²Á7Mòùv²Àù¤Kìt¦¬Ê%ªj°º¶Sƒ)D6³­5Bܳu8ÆêDO7dæe²3ÈbR"ó%ɦ™ê²#FVrÔÐWµ5àõ“Œ/­9Þ'kºÚè™\.Ó‰:Ï Shݧ$G!U§ï:úi¬g(iœN;–4´,µ‰Å™„_FµPÄ(_ÓßÕŽž ϯ8­ˆáÖ\vñCáÑ9R˜rDŠÜZ-å€äé}I%‹iÀÊMH€‘õƈ²MGÛ뎚֦ŽijÉô^d€¯<<™Ð§R6&H9!Ðô"T­©Šâôä`D¡<ßþ¿Á0_Ɉr§v>äaUª<¾ÀÔœ&èS¨‡ç¹v×Õ§¼´bqÑ*/õ²£æÒM©‹_X8…ÑZaÛ ¸1‹ý„?Õá,0Í$žeH¸ÌÂÓ €õ ,º]júy=œ¯HOk=ì”ö°d§VœæIÒ'$BÂËN½êº¥:wqzøó7j^8¦°ŒæÁZÔèúŠùKÇ®E¯Ów‰RÒ3w<µêìï:î«'7QyÐËœwBë'åDf ±â\¡/Ç‚ • Dâéjì—K2³¦ÖΨCp5]òìŽÓYô}Vñž'’NoT¦ë,‹ƒ“B¯wò°žV«¤Ù71ßMþÙò/ƒ¸´ˆÛu68åÄJÝ„$Ri «³/mä¼ð¯§ B+çmnÆF¸žXTàú´0_ðˆÿ 09gtå°®ÊêNÁ\¢ã#‰ 籯; ±û2Öÿœ5âKqî W}r”9ÓRqj—\´}\Äÿ%(´àÄž·ÑŠA ãΘ}KµtžLúÙRÿ¦B3yºØž¶åX‘T:n¹SÐß²|Eî\¼çúCÞiŸ·<⻞Uœ ™d?.e2çhWWîÉ|Xò!ëñÒoÌÏ̽—êeN™ç)%1{d‹`už‰2b)¸ú1×ÎR¢ò®ààwÍ>Ñ#¨*«…ߟàzšð_Kþ®9ý©±w™`]ϦóßN“üS†äù÷QÞÈäzX:žñ[X|S5~±à‡îoê´ü¡¢?ü·ñÛ³©ßÁüáçïœ?|ŒðÃbþ7^!hÀõ[?@þŽïû{ÌÞWsm›£;¬3<,EOe¿^¤ÿAª­ÉDÎ/˜HL,uà&§…¢ú%ëK†CCDEµº° ¬:2”c=¤˜ÿÌsyÂáâ A–¿ä¹1^å:QHë ëÏùGå$ô¤³ –¸ä2êžž .ÐÄç³rZ›*Í¿Øö¯…Àß>Ayñ›|tâ×K²ÿõ?þ𲶦`@ ÍTMMÑšm­•“­òÕ#¥ 5Ex¸Çi €œvç Û¶É€'°6¿õ!%>{#5S£"Wêe^¡ùø&Äå™ìIbB=V(ÁÞ;„Zܤ=Ö,‰=‘Ífù‡Ílø³µÈÃã-I/‘J$›EÇ(™NÐ1þBjœå;ɽ_nfRÓÆí~ÛZ Ê~ìiË•*KœÚõ”ªfµtg¯¤ÀòÇH<{÷žë¢$ù¤M>Û˜1Tµ|í¶%wF‹jšµ½ÇÑ;LU ‚žBˆ–vGÊÑÞûq$mÐ])ˆ£ûà[Õ®1w}÷×{?ŽŸýÅ{Ç‘èù¤ÙûAÖ, MÜ__rmÍšµš£(N߬¦n®’LpÎx¨©5㸻Œ¹@˜&¡GH¾=û¾ç‹oÛöçŸþÒ¶í×·¯íѧª›_ܬØÝ*úM÷0µ!2©z÷” Gû«rÜ4\ÊT Õî]Ͷûm»m÷ÛÍšA`Ö̴ݶÛm»¿ÜÍ,‡IéUÍíåE@iwéžG¦f„ZºvO×+ ;;3¿ <ô Ë.Y °‚)%o©#ùN ”AƒšÚ"¡]fRÎbd<õw¦¨ÚW…¸xï"ác€Ü·ÍÌî÷MÕ:há6L5—›Þ·­µÖ¶ÖZKòdõÐ¥‚!‚{kÙW‘6}8úa@C3³Ö¦d¤u2LÎßræ”<¬ªID]¡Ì;ÌZÂsR=¡j‹*Ñ“ _´‡rdsè¶f9ëP\Š9gcÀ"05¸;{Wk÷vE A£÷`ýñðîC=¥©%âÿëãmÿºÇ.94I,¸j³v»m[Û ¬þõí¡Û팷ǾïGdAm}%åbAÕßn·ü4’¼A¡ª¾¼¼439ö]͆»‡DÀbð¯¤÷ÐÍK4„$>•!šOêT– ꌶٶݬ5€=EööŠQ}y¹«êPœªž×u«¬Z ¾9ÔH >ŸD‘ ›a$©=Qÿ9uQht ':šlÃQeéYI‘ÌÆéT#É`Ý»»Ì2Ç|z縛K¦ZT%+X"¢WIoŒQѵAˆâ8W24ay E63MBˆ™Õ uî97géaV h Ó;)‘ÂwÚæ'ÒZu¤GY-×i TÒcÆ‹ä¤Îœ{÷Þ#£}£Šaѳ¿jzF7‘…Ô‘ÎTÍš‰ö½=˜ãkåsø“EI¯Ç¢Š¨Â°ÂªE Ö΋m@û* ¬ÃY/“9©COÇXQ§xZ ®aæÈ[ÕÚtˆ±ãApo\žŠ XÏÚ&¨®‰£±®ÐåÑgWÈ.µF£Eø0p’ãòH½|Ù3Du”=ÄðIôå\é´ˆpD‹j0Mµ‚ »«’†Ünؘ2?ë ª[ „ CÜC5TÕƒC шHSÙÓeŠ‚Öl¬µµfªÙŒ+ˆtZM‹Oº¼Ó´8]ÌÞ6¨hTCŸBC&þ8¿5¼2ùe舲`â"¨JÏw%žB•ª’&ÁhÌš"‘t Šjw×D-¡ÅØeŒ kúɶÛývAßo1Ù ãsˆÃ{R(ª›Q4M ´SQ¬…¬@H…ôî>xãM·#¼÷¾Ýo·­í{êoqôCÛíÞZËÊÍ’5%ë“ûÞúÕîÛMÓ$ajÕü ˆÈ㱧εµ­øõµ‡I'Y—’ȉh‰îáq¿ÝßܾG„&ºûÑïݽ dÛî­évÛ¾¼ü©m[òß1-ns¿¡š:¦©…Tv$‰Yr™íÍéMf5¸¶ü#oO2h­=~{?² ౿u·f^ód3!Ç~¦¢“šîóÉyÈ#w©A¾½=öýxy¹o·[ÎH8>P 3pÃí~»mÛ– ·N—­R*šã¨J¨ÝšÝï÷Ûí¾Såå–'lЃ­6Â@hYÊ@=*@ãâBÑa€ApuT˜zŽÎ<}Ø)·"G¶%F§ïT)N"Ss?´YK‡H¨ZPÔ#`*ЭµÍÚÎ`ÄqDôFuEklw³¶µ¾w.”î~^J@a¸±=¼Ï{ߘhÕ݉¡†fÇ€¸Ð2:àÑÅAÉÊ kM„f-ŸA”0…wª‹—!{P›*õHû¼3±-BZyÈ /cVWPŽm“U®X‹Ñ* õ³%i‰uB±Pæ©Þ{ÏS>HïGÏÃãí­¿¼´ÖzpÓæ{?ºwïým¼Ü_2,SFìºȆf¦I•OýnÛn_¾| ÷½ïýík?Üa½w9U%*ÐZcPBŽcoÍò6hÚ¶ÖÔêŬcRbƒÉåýˆÖò±¹{0!ø_Õ IDATLU Ç±y}mZ½ÍÛf5AÙBUË;¤š&RK Þ»:21“‹‡î."9J×·GFN°ÚÖ&É{.õ£5чÒ@?ŽØZ¯I55 ý8Ruzô•·¾‚ZkÒ#»Aš5g¯I/æ#ŒÂP Òi 6T{1{¸ûx´žäÝœ(áéÙ®†Ó(gxwiMòp'™cçEU;B"2“&ž–LY0|Y‡R×Qœ•°Ó…ÙDCèÉ"MÕsm”ò_‘]¸iÔÍÑYù-Äaš£÷s³UµÜsîâ1ÊÅõôf³ÀËÙªW_ ý+ȈäIUª(™4¦$²¸¨ ÌTT=<JÆìÑšÒÚbÛL`Y‹\·NE0$†Q“ÑÅå#›†zŠ¡©J$¹fÐ×!ÞÅ8r¢ÂTÿcp N›ÇT…ê2æÍ#B(Þ…P¯Xùe]Ш®¨`ÚÉoêéÅÉJçQm<¥¸“X.WMkÌ)ÿøúSç‡T‰òi»ê—¼lC`õ"˜)¢?¹&)Ñ«JÉ™n™ã ŸŽˆ¦Ø>º’$^BÏ3-8>„…d•çþƒD?ù\b_Z…Zmñ~eñLŒ*eŒOk†F¤úzâÄUñdžœ”—ɲE‚‘×H •ù$žëî†äÆêì‰fŒðß@Bˆ‚Ý…Q‡v–Ig@AÖ‚qâŸÂú¯ó¦‚ç î7é¹¶Bó³øþáù¿¥fYüëÿ¾¥¬™üþå´ÿ ß÷©cƒ?6ø=ó”àß4 yþ´¸XÚ¾|¶_ÒÆµ9ÍŸeÅNm^oäÂQfS=uìQ’á…q?Û×°<ÝU$„*„VõÆCSU"È=5Í•§x~c-ƒÛòv¯µå2övSjŸÏ/‹©>ø~¤ºtÑëA•ÏŠ™Ç‘ýë#O$g‹ù»Þ»ÿ\}ÐðFŽrR¹éGï Ü6ƒˆÉ¨†¹¾‘ììRX³V5©o™]‹ƒå[›€4•RŸ:kÚ#Ô]· ¦IX4-2ðé É¡Bƒ1"ËËd5hTáæ‚hÖL¡÷}ßÇ£„}?s"¤:á/bîj}¹2óÀºfo%r;Í4ÜG0¬Æ¦iƒShh€F‘¦‰¥1ïþö&€zô‘« Õm»ÝÒìÍ»IkÚ¶FUØû!jÊ£ EhŒùAþÒ`<ú¾ï{qô#"¬Y»µ–¯OUÛ¶Ýo÷#üÏ­n£m³r·÷nf‡wñ¾EˆˆFêÉyý—ÿû_¾Üÿ;U„ÞTFUåvºW\’íª ÄÇG”’>g9È~Û醃€9¹¥‹0"ÅJS13«¶ÜO£š*{‘'•0œÁ»R !‚£ìî"0¤ дÈNÛ–Nm«=Ÿ"Vô†ìüDmË!!”ˆ£C-?mžߤ§LYfðÃÖôpª‚ÙÒš5a(…Ít7roÙÌò0M2©RŒzQ)×j†‰ÿbý9ž=T#ß“y ¼µ„»ˆtUCí$U‘vHwß!µµ|>HSTy.ãA»A!–M-.TÑÔYÖe5àËëývÛoûÏ¿¾%S¨µív¿ýüן9Þí©æÿ?ÿõå~ÿéO?FóGŠH ÃR/ Ò$Q{ïÞÍÌšmÛdxˆÁótÞëP(îÛŠÛfñâ"©VuP•g0‚àqø¶YF‚ÒX 3ÓÖN¡z@ÿIyìG¾}•÷ÛM#Ä–,šŒÌE‘ušÅ=dÜ|¶û6©MùøV;oþ¦šM×$M¡Û-< âÝ!„©qúųÿZjBi[ËV:C"%ì¤NŸë!‘Hn šg/§ œ8 Y©iºõ4ª»{8·­#ÐT{ˆšÙG˜Ž)>3ò çìS); tZÞT`™ÃÎÚÄEÉ]Á1P¨R†îËǨºf?tÛx ®Íx2•Ê? ¼•È>ƒò§FÕ0LÎìcÈ»›BaQ¶ÒaY®6F :`­³¦Ä ’+{atŽ! ½+”P«y¿¨{ˆÕ€_W]¯vÂPl“zœŽÝï,‚N>H_Õ*\ÅüAƒ$V äø-Yoœ-²s«Lò±f)µTƒð!…§Z¹Ÿ²à¬¨dq8Ö­ÌiWUà¢÷à¤ËOñ*«ÏH\Û©¸Ì*æc4~j Ÿ*ú+ʧ ì ÓXÉk]}²úˆ“Å!â¨k±Rc"8ØDüô¯SBBEAx¡çU¥IQþ]ól£)c‡ Ðªitpã¬HI}Dq8Vý•( Å«ˆÒòYuóÇà¼X8‚3Ò7æ["ðs㑹Ի§ôR("fÌ Y¸3B ¡y[ŠŒfË`¸æ@®& yMUçÊtÜRçꢔúð¶mÙÔ‹¬ʵG!41C¼õã1ìûL>LUs¡ÁBèâ=×jù?¸ípÀbNT1N•ÊiaY áy%ëÙD dï⡉ô‹x;"$§aW}KØ‚KEô×Y6œÅ¤çÙ9Ë’þÈ®/2Fž Q£¯!—¼¹¶È ÖÒLÌN5µStDɚଞø7–OK4gE2&,|¶´äMQó$Çùê¸ÇŒß¯ó,¯ñÊÞ‡àŠ ›7U­G˜æ…OŒÑÇ pJßå „ŽyÄ"Qå8[TÐ=–v…ÙלZHÎnÜ¥w6gQ‹š}Û—öoÈs^g4Æ/ “KP W=ƒŸÍžÆ;ø¤K“òA#Áœv^:[Ïa9ÛëÕÊçÄ!åßÐk…sm4¤<ý#yù.~`¾æHU¼Å†þ OÕÁüÀ_¹ŠbüXj|¯A^ùú®èôÇíÈ?̈ÇÝFûAÜdÈœ©kw9?qqÁbñüÎÜã»ÄÅPÿãªñ ù™í™~HÔÅ ©÷oü­|÷Ïü°E‚ÿJ¯õׯñÇÓ1ý/Ëøðï9 øPÝÿ|Dƒÿ´Ìz5ž_”ޤaH‰Sãþã!mŽD=‡ zU‡ËÞ…VéÌr÷Ÿ I¯yY9åtT”ÃÎäUó;ºó]][aä\ŽnáQpb¹>¿KŠ‹s@"+ oQqÀ;±þ„M¾¯ÎÉeðQßðj—¸öËSÞ°J”˜ä¬¾z©†U«ÈÚô{:f rÛ‰t^§4Z;ǪXNôá¨Â+Í=Å?„ˆ ÓÕ)# ãÑépÊU½ÄÞc  ©j#Ö¡¦& öÎî‹Ðáð„nCͪ¦˜˜jJÆ+å*’Ñö;ŠpÏk"Dô:p‰£9Ž#™5[bjPûS@šl"ˆè îÞ½‡©Ê¶é²–Ï¢µ 3-MF„ww+ §Q³µ$Ô‚4£¥ÑOUÛfázÛel—äS-¬öJ3³†UÒ»ûqýè½Oàj )3Hj=ž©™È%= á×}?Žc¼‰‡6CT¡ÂË—ûý"ŒÞÝ=ÌÌ¢ÞÉ}tèIIóåäH´Ä’Ïà¢m{½½˜ÂÝ©lÛM¤ïý µÑQ+Á°ô «öÞUµµV{È£«ªG4«ñ<¨Ö6)·ìû~=Ot3³Ö¬mªdSˆh`f/_^ÿÝŸÿÁ_ö·¢üªzÛ6 ˆYj£ÁÀè ì½rx‡o@tÖY¥µs Z‘{Ñºíª¤´á¬´‡8Ê«Y¬µ¹– šÀT=^„ï¨KL âG˜>7‰mÛ#ú–ÈÿÀ½HDо÷Ù„x€ Ún7@7@c߯Ûív ©+.57û’}!Ý A¸@å„J‰<ÒiÑ£ä& Ö1»þÌaÞÜ ¨P”\ÛJ,Í­ÀÙœ™£iž«ËQ<£êîf–sË÷ìº;U S“wÛ`&F›†Ñûñx{¤ÙW„îñØ»xÏ1ÒËëý×_¾G¯®ÒÃûÑ÷}ß¶v¿ß²Ì|†Ý‚!%{«Y³6k½÷dpýòëÏÞ=mæ÷Û­÷~ôþ±m[ÖY×èêîýèy»Ýî[ÛDd? 5Sšªjezˆ ™Þ¶Û~ûñHЛ6UÐ'Ù{O¾EÛšG5ØÆx.ä¢0ºtÇÖÚлêΟWœ÷Þ»#û±KÌ©f_¡g¿fŽiT¤€]D#ˆ‚![³¶ïGÔ„Eš™%wGT¦QQO¼%æ¢d”z)bP §#`€—„o/7dÓóÑ~¨A‹h¾«ºÇÆðhJUlÊ\%ÓF ÍrÛfÀCU…!a° %nXW]a§ ¿Ò)³<ع0 œR×±¯›NZxÇø7_ra¨(Äé˯¡÷5C9[úr C»O~Ê hª“œœ¸Œw fØå ÏgéQHÜ=—Cáò ›‰¢©¨Ò»,ìÆÔƒsFˆ ¸Ãèj-½÷,f6p»o—^ /æKg·GE\C„A3CïYIˆÂJŽâé­OÙ™z9QÇÒ9v!¥Î— gcUª… ÕÈùP21raeÚeµÓ$Qe ÇøÿS÷®I’$G’¦°ˆª¹GV¡Ñ³´§Ù=ÄÞÿ KÔ3Ý #ÜLExˆ¨šy<²²PèFodÆÃÜݪ,Ì?Á1±Rç¯ç¥˜—¥åEÓãeû~.Ïõ,Ö\„—´lÍ«“ž×1Ÿù½È ¤øœ’ˆ8Êã¿ ‰ätØÎöÓ“\µš÷tÁ€<ÁEDAŒd‚M̾Šxñ$<ë¬Ê1jqe$›wgÿ3ô\ô‰êºžÑ€Yö<½$µÔ›‹¹*ÌöâKÐwöd-!¦§ÊÅùÆ•Óá=“*1‡ëþ’WnˆÐƒ`ÎÅsÝšV»–ÔsÒ\Ÿj'ó2”pB`«N@šÎo/Ï—Ø9”›FeYŽâéɳI8G 5œ+#(ª¤'Ü©¨¤— fþ­ípŽ4*ap>é8 މNª% ±Î‘'!òŒ0Ìb©«Ø=gP™ËZ  ®{—vÍù(“µÛÄ (çÌãÜÀ^/ÞK¶©lOy.€i…9ûMLg"GD<ÎÍÝU¼Êsô»+.Â0g6s5X*£YvDÈIÀº#ææÈ#7F¤À¹¬ý À]àFœv6 ”žŽwÒûUÔÇú–ÏUœ/ü©ø ‰r+.•OlûO“ \%”s4öep€¾O€Ÿ¾’ï|í”Zïõ%òð{q`V©ÉÙÌÀÓTùÉÄâüµ<üŒ`zArÉ{|×;3ùU–àL–á'5g^oJÿpéÿ‰ðs‹Íö[‰ˆ¤…ÏóOŸ2žÁR<{AWÍg§ýïqgêIÄøøÛÿ³ÕàŸýü4ŸÿØCøûµíŸ>Ȇ8¾"¤¿÷7áãøõ¿ÉàÇÒÿEñ?+m/ÝQµnf™ãÕµ¾¬ØuÇ*Ûi%ûʃSqºë4KˆX- °Â®8ï3zìõ Ã{IÍ$º(ÎFa̤÷¼ï$Ð[„TÃUñW•ŒOu ‚ÈÕ3yy0ãrÓö‹{ì9Bqž8‹2¸¦ |v–àò>÷—+~x—~zÚ×ã²ÁLjîžêå(L”ª¤;ËYŸBëôéjëmÒ±E$ÌL ǾGDµå•ñG1 1Æ®f·Þ³1¸øé¡¢c =‚’eµË‘Ãˆàˆ²a‚ÕX˜%zªP ÁÐUwÂð¡ÒÒaK—cŒ‰%–¢@¯îΔßTåÒXw>ê—"2±ŸµgZ:¦3-á @öëšÚlRÈñ€L>I@§¦)BtÒ= >Ž!"щ4gFdà!Öݵ,û@D¾U0af³#1œjÈúܜ݄ºœb´ÖrUéîyÅZS®"mÚ½ñ±û1tÜú&“Ü\Ý‚p·ÖRËÓÞK™hX¦ TÓ¡Ó#\\DzßZïÑo2ŽÝ#¬u5ÓÜ;!ŠžàÓ<Òw\>kQÒW¥ÙâuZÓˆ8b¸»ªö­á¡á‘èöŒ{fqèÂ(‰`Û¶t—ì©ÄÄ­¿PB90ØZ¤DXÈoÙÄ=‚ljÖšª6ëµ5P%9<û«{ï=?³ t7U®Hr™¸j‚ê#ZU€RU¿ýò-Ë4“ä2š „#róœþsМÄJí"Ò^ ‘]˜‘n¸³ ¥öLóì.Wˆ˜BŒ”UƒY€¦MD‰[3iâ@­©e&>0dÐ#2?‘Þà>H#á&JîDZÃZof£0AB‘@ ÈðÈ»|€IXWEïí>/QÔÞ^ÀIw ¡€ÈÂÌÆÎ‰YöxTÿÇÊ–¤€R gaÊðŽºjr841Ç ¦ü8\‘ ÿüóy©–I ô®ë£Êvïo¯a¸š‘Áð1âñØ €£÷®´ˆÈ®fYTœcÉÊå”^NæxCÍöáÕjP“Eö¶û_ûCUoÛÍÔÁàë÷ïdÜo÷¼Í¶ÖÕü›¿ì~0Ü]MÕЖÓ0OÞ­õÔ½>^½º¯9ƈ`ëÝr>¯ª¡FÍÚcÄ ‹Öz!æË#¤Bf–!„1Üôh}SUS´¼W˜Eȇ3¿á IêFkÍÝ%¸9DÈ"jKª|~.PñǶCÙ¼™´¶‰•õÒÃU#%¼Ö,Hºdã±Íì ¨ÎŒK'“’$b½Ã 9æÌ,AUïÍld ³ÿH¬ÂbŽ òìÊçƒBL•.Pt…/ja>b J—©ŠB’ÉCQ;[½ËF¥ä@°˜d#[ 5ðNÙ2«‹slU¤ÿʜĤ½+¥åÛ(IŽ#TÍ´©F®¯R¦ÙrZ7=æ÷(]³šXƒ2ƒrRŠ©˜föO‚’Cõô Ì¥Spp@›"(b>]DÔ˜}FЎÛ8UÈÌ}qÑ" €vt îÇîî¬æê)1ªHHV¹j#„D «õWVo‹ô(”##Uá‡'‹5O£\­„ᮨÁéõŸ>ª˜½_¢'µBogU•ȹ=?¦y¾-ˆªâê‘¿\ënR{L[ ŠMOÒg³ÿ¬ªb‚5E™åð˜«b«zó(êêÅ~\Yñ™["«ÅÅu,‡#¨Á%â²$xç¯?ßáKÅ ,lÛI¿!ˆ'’Ï?}ohç³6ÀçŠÞ']ê3¬ö¤c²’/O³\Õí©Ró"W z¯ÊÇ'º2? |ª>ûÀùõ·xñý“gºxQ®¾(àå‡Ã8Cï5ï_à5 ó‘póYh€?ÒKùA1ÿ¡ì÷³êÿïÑýŸ¥ÿKƒÂ¶ó·X?¯¼ ®|ëÔü|øó[B3¾sñÃnÚ²Õÿ?QúÇ—Þ?ZÏçõ~ñÏ~ <ø#ÓŽO«ÿÔÉ¿ê±øzp1îäv’”§Ž¸Ó÷/õ0ç2×<ÕÑVË–y$©)YsU"l.Q‹˜Š³@)Åû5„He'¬®b>¯OŠ4½ Éá\Æ{ÊšîON‘Š"äâ^gÎù|„Ô×ÔÀ¹†"ŸÒ¢ù¯èºËþþé:Cç YüùC—¾tÈÕ!ðÔeôù°GßåÌšö®•#PU„*fE½Üás= h³ÖìÖn¾û~»n7[VykD,XÐåLJí£5$Ÿ‚"Í6@s3P8]Zú;{JóØÕ <–;QÛÖ[ï uFcŒ€ÂZzPÐïwUŒ1ÔhÑœ!‘ŶV–Œ…‰:y»³"W>i·kAžÃ¬µ¿QÀ´Uo®4k9¨¬Ãu¸ÍƇÂúmó=†™2âð¡ˆ&6†¤C*ß“ãcŒòÚS®4ü—Sò+äuöh*R=W¶˜¬’š&©) /¿ÜË‘–ü €q„™Š Õ:]ÌZßú¾ÇQu4ju7ØËý^Õ¾…àÁÂ)FÓÌfO‡Y³ÕȤŽôàªÝ²×;‹G5hV’uˆ¢€9^ô‘ˆ8Æ1Ü{k4h2‹ Æá 3µº0ÂÌÄÅ«•Ó÷÷[rŸµe0EL5 Š$ÂTÕ𬙋Þ:`»ÀÕ¬µ&R-%•ž™U`áÜ{¶Î9Æ ;³c£\®€ˆ]Ôšµ”=^^îýßÿÏ´>rd,ŸTRéš¼*7¢J€¤…B$4¬éUêÒ8㙾Wžõ¹ÁH¸B0¬Ø°•ÖÔÍh› ¦MÐPöÝÀÈ^z7«®hû>ÆHÚÏcÑû·Ö´÷Î:Gy!qîO@Më šòð‘Ö²Þ·õÛãø>(ì­ƒ€¨l&b`2-f¢jÓk0¥ ƒ[í’dH(0[µUeTÏtÚüQ™¡­ JUųz!+'é.@ý¾ÚLǤy¤täÖÌ3Ã8öC·Ûäq ºÓéûAEWäxì²m­™5Ë6ò P•Œí~ËSh"ÝyµŒ‘÷ qŒ¿w÷ÃGxt³tÂÝo7ÒÇ_þbj÷—ûÛë|TñlðñØ{ï-ñmf·ÛÝ_GNREZº®nž5Ï0µáãíñ8Ž#I_Èv_ÞŽcß÷Ö7»w‡¦ÖÀ^…´ˆ3c¤ªÙáÁÞ{ëªRž€1Øš™âîûž• ¤µ­™) #íÞ“”^ý"fš¨¹RQ r)î­™Y$éNJ&œZS3K6€ˆ Œ¨†ÞÜ.GVfΔ•¤ê&tÇ#KzkîLh³cBz oi¥¥“Æf}Þ¥ó~f⬺Öob6Û×Z­³h*A´‚ ºáa7ÕÉi†œz$!c"ÚW"S ei’¸¤ÒØ $»…CT¡‚H"U¢Ld.Ÿ²ÃV&Æ,—pᢟ“øÔ}jr±xABBÆÂJ®@gi/!sÈ•(fHâ„RGÌO\c(ÄGSƒˆö–G“‹BÏæ'q( šCÉç–b9®.¦Óü8—úŸá–¹±+¡›OÍŸ©à¼_#¡+Læì˜}*âž5\+ßñ>0£8ç7r>kq¥óÉaÿ¡Á”à{\ð‰J ¬y¿¯õ R}Þyx™ñƒC{*Wó6ß xBYøEð„kœò”„¾á+w-¿ôæ<¤gšå9Ùð™®Ï‹ªÿ¥RŒþòßÉßÐ!Oó ?þI?ú½øºÿõÕÏÙŽ5˜»¾ÎwÎÓ/^Øé§ýÁì㘊òÎað;ÜèÄOéà?~‡ÿ«(ï_þžŸþí?ãúÇϼ ÌKþRòõwG[þÎ)Ç%ð³3€¿ìŸø¬Ä°@¹¨ËͦO?ÓáO˜™\zÅæ¼8-hYàPIm¦, [øQ½¨Ø\f‰9QþÝ\Ú³î@ T·V¾ù)ã¨çÙ%7p~BÁùÛ匸D=Ÿ{ ½0µ¢W›?§ïîË×_™“›ò¬òÇÕš0íÿ×ìæ3åŸNb~úPøó›þ*kÍÔ%\\Ï’#0á$b 2ÖÌ<×]ffÚES;æ¢ÖF„äš~F4—+HEÅa½5Ít½š’h2OS²„"­CáùëîMUÍýÈÁFÂ+д›ÃdÙëÛzƒÆ8ŽWm¢ E7kî;éA-dGlfšÂÉËȉyj­yøNçNXf¼3AÕµkš½gÙ_œ=–ó\v/àþAçþàÃ=ë|8-¥R‘ŠZäá>Êë”Ú˜ê:Š“Idšaj)óYªÍ<´‡DĬÚ U-dGÎ`öDZõ’ÓT Ó¾z®‘<ùåÛËÿñçµÖ‘K½ªB=ëÃíu3S ÇpN†xêô鎽ý…”ð~´Ö³ü¼Ü ½÷@°¸È,—¬n¹jiûOý¯VTZsÍœæÉð°ë•Ë'BŠ{©;9í!à™ãɼ^v¥z&ê1j)ò›ÆÊ4ÆH¹ß”‚ˆP³V?4çä1„îáÐ`²Ò\’s ]H³ èÈnjì„dƒÃqø ˜ŽãH¦â´5z"UåÆ˜¹ÖR$%±ÿ$]"Õ\…^AAXÔ—ô;™VgŸ=QqÂJc¡P6Ïî¡H'¯²vQ(Ò8}tO«4xíK䓚À³2`© *n Q]¢f8ÉG:†"eTŸ8ŸÑë'ÇŒ¼)QHsúO“ÎüÜfšWϹ„ˆ×¾(…ÓêŒmåØ¿¦º…:½Àa!P˜Q'Kù  ¬U71O&ɪÜr×.CÑÌE”‘…©*ÙÕ˜KRç3v ¦0X½¨5¤©N™«L–Áù"æBb•ºF 9BB<[O–ƒÉÐ$†˜^Vm'ÁyuwV·GjÈ+cKOX&Y…ª¦aè¥U*Ãy¾á¬$¸²1@§Lìž±ndÀ«éwzXEMÐN—s²ÂãÓó&Rõ3qÂÙÏ^Ô×Õ}°"g¡ê⬩<ÓVLL0âd„%už!ÁÚÕ¶3 C…ˆAÄS¹Î¼ÒÙ×±©jbO×iQæÌ1W<¸fÏøTÖÐî"+&€Q 5… .]s•/&ä™Õ_(Æ8õÖIŒÊQÜ\þ+ñ^K^P!`RmçÌb²ìf³¯¬– Ö¼6CbeîËÜh­dΗçìÓd/Íòó‚ãéËU—.RQœà³Õ<‹õí%—%¢_¨èÏ}äÙ*wNÏãù…¸Ugmªò„[L'¬¾Tž\òT ôÜ´+ïØPØ>xÏÂ8Û5Þƒû?ñýó½"Ìg€Ì×¢5¿€™ðK^ä¹ÿšqö>xïÄòå­øm‡ú¬Ñxþ¨;à'*6ÿˆåÿ¹××òŒúÏO2øP¼ú¹a_«ÂüDý«ÿ¤âýÛ¤&~rŸK£ø©¡Ë—Ðÿ>õÿï™ò ù/H$ü„°Ž¿çøøG>Š?:ÅùÿYnä!ÿÝ͉ôY)tvœ4ºrÍÒº¹%>šõžIÔ€`Nˆ\(Ÿ>/ÃqÖóΦa°8|Ei¿¶×LsÙuý*O…ÃÓ‘W».- juReukF¾¬Ls‹¤¸¹ŸAGð]Y0žï0ø¼ñçyHÀÏ>³³2¸%vSÔ„^ái«†µŒ|db±ÚÔÔ<Ž}?‡T¬8D¤©¥VfVëx]Ùe„ˆ™•Co¾Æú{À,™!Á8œAS«Ý¬´|o5Ž}ßwßu(Ls¯¨ó‰Àðq〞v^RzßÔ]¬ô,Í?]}†µsÈjÞðAS‹Ö¦#¥ŒY©øÇ¬£…¥ ¬s{§†Ey›Ó$ÌíÖ¶o·oÛmë·1ŽÇØE$©P]qP,…òsh!îÞo7¨ªµÖZÆwZ³ãðo/7ÏÛxk¾Ýîßî·ËLNÝn/6Æ~ìû¾W¼fqT±ëtµ6ÛrËúÅËí."Ç¿þòíþë¯÷íöÿþÛ¿ADÂÓ-ÃIšZ3c„»¦VJdëU}„6‡XœD!áijU³ÿ€Êð#îi«“=Sœó5¡™ÃGŒ ír”"Å Ö {„™FФžAH&cxÂÐäR&B3µ$¬`ÛšªZW=ÅRÚÖI¢u±Èþ†$ã×k ߃4°úE„έu4Ó ·i¾´ì¾‡ÐZSÁ8޶•þ”г!ˆ€¸À„ê‘¡†˜)½2mÈœñK jm¡¢³Ç¸4bæ‹2FÀ¬Ù˜¨(‘¦zd%hÍ'V?'Äér¸Â2£™¨.²hìsàPü“HïÚBK5R܉€Â²Aj®S £BeAªàÖ{35† :3ÑF÷ˆá#Ç3iêPððÕO£Xi7L±¶ØjŒÈâ '$.n? º ü’ Áëp…ç¯Ýh> fÏÙtÃêD‡.æVTñ§Ûd©²e¸ ù „‚tWÓôUL¢fËl›`¤Ÿ³-jÖ€š{@cDbå—åÙ3›øNä¯ Ã³ñ·l[<·M¨[ MWÉe»œK'$-oGQ)“5¤“•¡¨óðR• œA—šèüíŒÓ/—gÿ|âa1ÙòÇ襸–d :'hL˜Ú¬¹`ÝÑ&âiêâsz“¿NÏ+=©…g)|•g•öbO:ÏŒÏÓmS.õyËÄøé‚ÏuJ<²sôòÿ\ˆ-× ‹å|<'>|§žŸWÀÌG—j‚nõ$w-2¿îŸåjò¹ŽŸIä_ÍðÙð ø+Jüóú‘rˆ¯FïfϪƒ?Ý~D%ÁÏVÑâÇS„Ÿ–þŸ› ΈڒþñI5ÞÍsðcéÿÇî{~ò…Ÿõ=üŒÀë°æ‡rûß-}ã³ó?޾üCµsþC~$þ³Bü}?ã«+MÿAþèâwŽoðãkó¿.ðùTëó?-ŠùêMɧl1ZŽüIäy2I¬Üs*Ìês²ru%je>C¦\?yºO›x“³Ë&ayϧL-ÊBª³›Œg–<óð¦GæLàMÀ%ÔFzÊÎ…jÝg¯w(\,Ï«ãó3uò.;Áå9ŒiÿçççлNià} 0¾ºŠßÏpìÿù¿ÿ/m AA$òsUœk\Ô‚;—T¢¦ÖšÎâK˜5Xõ9d™œšbR±ØN<Žƒ·í6™8W:G6uÃÄÁ¹/v'´œk QZk¦JH¡]’NUh1F•"VåidÑŸZKÃ))ÁHšÇJ1F„Ô4!Z³$;§aÕ&5e ‘2< )uF&9 ^G%AF„šÞo7k­õ[ƒI¤ í…·´j ’†¡ª¦¶Êîâì*Nšrk­¥k-/ téQNèêâÊ*Z 8ö=+L_^^n÷[ë={G̪î\P›UñrÊÍ<|ñòrŸZqmtªV×Zƒ™Ù1ޤ¼ÈdA`±läâ’š%M)åç?ÆÇ~DDk鬃?ÍCÕ­*fV…½sïIu¡ôm«fÑjØ,R02GÑZë­g ¡µžfÓ˜ì @£8‘S„–sòÿÛÖ·üâFaUÑ“­ë¶©µyÕ”ºuÞÁô$@‘9?ÆÈÁ ShÙYæô¬XˆHlD¯×LC¤ (á4áp2{¤=ÏsJîcˆß P¥,•@:ÖÇëmÛnY¦ðê^žxw´mÛ¶Þ›0 ?öc¦vßúfA÷ãvëjÅৈi‰©HT«Ÿ!·mûõåEUï};b|}»ßïßî÷ ï/÷_^¾UqáÓ%X[ù|K2)XJ‘9ªjv·bJiZ£ÝˆY¾ ~Ý}YNsÓ¿¯Ð›|ŠCϺ‘Œ°ê>Zk··ã8Žá (´5Û¶NèÛÖ¶Ö[kÍZk>F¸Çñòí¥·NàöíöËíÞ²_ZÞ·¾e•ðý~3µ¼=Få—²®–îNafzÜî·Þ{ëí¶õÙ˜W–>Tp¿Ý[oãpŠl½=ûÛãUÍšµÖZ2ktëÛaïÔdy§ç̵¼êî#céá>Ƙ¦Ë­ioIöXsÙ4LÒ\óé +02kÓ§hk™éJó(Õ¬Vª%ç|x¼O‚sµ>L€ ™ïXö…è¼Ùkö ¨ŠhD¬„dN\¯Í…)/ŽÇ,`WÓV’©š¤½"ÝU÷è씈zœ20‹‘r ¢2›m˜…9Ÿ(,Ø9à–ÉÈàì\l*è›öB¹Ø•®— }Õ;Zä¦-ËK˜7œ¼1ca+. …!6%¤*~®à˜Äõ¬†ÃªI‡ÂZÝXVçJ‚𘔇`&GrÔÆÞ»ecn­IrTïYÅ~b½Õ8dyÁ¬ÆÇIWrjÀKÄX¶å¯ (îQTïdB 0ËUV)CÌ:aªÅ¬G¿ÌòhD M f­)LÁ,KŠU ¢EÏœ¹ƒŠÜ®‹†ëÕ”î&WÇþümS?Ãb{.㺬ù •ò27\ê TÐ4¯1|ÝW ñÉk=è¥ ˆ3w±ɶjÊ8Q¦³¹Î†UÀ‹sZu™èÌ?¼xÐ ÃdŽp|`S‚6Îxj[ƒ†ù@©ï¹šWà ÒÑ«œ³„rUäé𗱩ʸæ½/LÅŠ©3›ÐU×%–~:‡I¾Au §]«žw2GÎvÙêŸ×Å> ¦³¡îT‘· I“U6$±œÛ¹*Ž9þiZeTS–¨[ƒËk“1[ÞTdÝçÙ‚À©é©uÚä6é©vf¿ Î/"µ^V•¶!-ÿy¦œ oµö•¹Ô¸BÆçœ×B!¨"·L8^î¥Óé/îRíÜsg”qŸTĤڬوK™Îç…Iš@[ƒj›koòy·*X1Ó\L^U¾*¯.°üT. Æ$ÍŒª“T?ÇzZæ·Ñ•sï°n ëVBN—DDêÑŠú–kÜêÑüùšÀ¨Êù8:N˜#™:T>l2‡CÖT`v:IÞæÇ\úù7™?ë©fvÒÏèÚšr-Ÿ=Ì.×Hâ¢S_{‘¯žüœ%ëIóùÎ~)D~¨™ïÍU³¸´AOM/OثГðŒ `Ææ³iýke‡øiô·¸ø½ïÝŸ<[àÿÛ™Ï.øÏÏÿþ9ÿ»€Ï_ÇÙë~y]ç¤<”“Tv}ô|&<}ˆŒœè„§÷í££ÿÃÿãÇ#å×o)Þ8Ÿ½3¿õiýÁÆä©—§ÉÏ×â+&Ïùß9á^æ1Tøðåÿì×?öæýó^ð£S÷zw}*»Yÿ 9sÎXÖù¿S8ÔER¯ ™ô+Ÿ+E¬M¤\–Ý‹l Îuaýðj­-ʹÛÈ5N)yùn® ŽI&^¿[TŸÜF¹Ø¨W§“Ýÿô´<=9—†®§§+–½OVü§¢÷óWÏeŸ§ZO÷F|¬mX»àý³àýÕ‚g0äšs41º©#R±¦—f¦p¡¥z !ª½YÑÛ[G8.è¦ôég!^vé¥Çg8U™Ý"x;6š0¢fµÄe‘€µ_@á©ÏŠˆ„A“úÀ´ÞÑ]¹UXëoŽª3ƒ 5‡FÐNZªü°f …oÇî¹WÞzJiP…5[´‡òº <|n-O2†X›Ô)Ö³œaûHï™:ƒ>n*¿üé—Ã}| wŒ¥.égBµ0 T…š& DÎS½íª =ô˜›~0r3W%´Ì¦H MË'­ÎÛsj¬K½õ¶IÇr?DZËý[kV¶ÑwóÊò’2ͬ÷."·m{{#.@Þ5 (¼© w?޽™=   åÁ0Åî•â ÓÐeE2òF: „«ÈÈ’Ô½õ;IrT‚á!2d&VÆ´÷»šîûNŒ<ß{o­mâ«5[=F*eîžôûÞ`¦¦êNPÓ÷}WÅ­ß“*C2èÇ!ûql­Kƒ‰’-ß5Õ´®îá€6µ¾õáC{k¯Ýšþÿñ¯¿þú§ûm òõñÇÜxœÎ¥¬|‘IwVa0ÌÄ*òOŠ1F¸PˆÈ'„ñ)#ÖÌZëd Oý<;¨Åf%è$$²›º¥;onñ‹2•ׯMÓ§µv¼=¯oúóŸ›5¨¦Ó<7æÚ{Kš‚ªµÞ¡jjÛýv^^nÖ·ãÇ8‚‘s¯´¸™Ð05Õ´Þ¿¾¾¶Þ^¾½ôÞQ-ñx{X³Þ[kêc©ÐÛ˦¿þò¿þãß¿¿½5kÃ^±‰´â¶Ö[Ǿ·Çš1š©)ÌÚ8R}¸0†—…Óݵ©ûqüõ¯Í´ÉÖ»½™©Rà1òi¾m[’Í2—E™V 2bTÓH¯m¸J(Ê©"^ºj©h4Ó©G„ˆBG:6=¢ˆ(ßt–÷ ÇÛ[lÛÆ‚ƒHEžù´)®T2ÓŸNÉæâÁÙ>Èy÷÷|3ó1ß»FˆGCážÓL¹¬cB† \qV9—7ÁÐÌœ/½yoRh#Q" X®Í%ÇI’ÙÒ±†”ò ª‡Ëpv9 6*ÊeqeÏlÔ„TwváYߨAæå’¨äm3˱«—” B½LêõSK)+kƧT²ôsÌ7:¡nµœ 4|¡Z<ÀT“r/RC>¦Ó3稔º'nHéOÍCÎÅC¥>"’ !#†šÞ¶-¦3ÀT‚dy £ÔSÃtøÂ Pa°xó*áDÖ¸Hu,g „„„¨”Õ‹PºÕÄà‘©T¦ú?r™Y>Ó © æR#ÝôÁˆ#VÕð•ô¼Ìª—î½âªØâ‰’Ã¥qùcÏêݼ¦Ç2÷V½ªó£ð™Ó‰Ÿ¼{öb°锜-™!*—ù8ž(Xs‰yÜKUiÜ ÈÒts<©£Åžš{’tÌyKS\ÄOœï,4Ó}ӽÔìãD |ÔÍžÌÓ³óðÝ>­Öt6kt§¢yzIÉuX¹J¥´&Ö€„„s%\ó)Cu0"Æp ‡%<0D[õG¦£bêºi!¬-§&Šyå©VHv:@ ^ x‚ɱ‰È¤–æ|¢üF´SýM†›‘E$|n ”ª±Ë`=§|Y~e&™Q–H÷Zúk"í¹º ªÊŸíÀT´Å9D6"¢z”—Hz¦80ÛæVD½âù;²ŸWD0ÆŒA<ÈU ­z>3æ¼£\cìRÓ1S…EŒ ªM@©ÂŠ?6SËËaK¹E(00f«ñ\Bm–P'(ÎK5ëNÜ =ó_ê¥g!fcÂâtU@DNž®@˜G“¸h]÷Õœb@­vZ ¸ãºX;[’gI2ò%ä¥ásøÐæ,8_ã ¶äˆ$<Âçe¤ëš}>jPÀƒéäP½´ÈÍþÀ|‰¼èùÀÕÿÊÊ!U WÞ¼²ÒkVwÉUñòÓ§<£vžôE¾Ó¨ÎÜÕb:e[˜Mã«ÍdvÍŸN†‹üÀÏüèü Ï“ïþþ}ÊgJïWœžÏ!ÚŸf>3‚íºåoz|ùõÁ×õSˆ?4]ãiÀO„mùêÝü)¹ŸüÐOü¡¸\O›ê~?§ž_êC‰öŸ>‘“¾,ß}"Aá·Òø¢Yùg²?¥°_Žƒ¿¡±ò‡>ì¯Ìàø=ö³u¿W™Ç'/÷÷Ïø£a×ûãå³—ù“ Ò?L5Ç?"ð³ßŠÿVàþ®7ñ6ä:üë‡ ¼N õ=ˆ¦¾r-ïORú™ªÿ+Q×ùͺ8”<‹ÏP ŒšÏ*&Ú)ýŸQ¼ï›^+åÓ“gÚpÓ˪ãÌm½ŸAÉj:âÝîzŸ¿,°'Ï.4àR½x¾þ´–aŠïÆ ÏÙšO:„ãÝðµeo  MhiB›&–Z¾–M’u!„ª…G™Ðd¥Ð/†ª÷Üy†%!="dÔúÖ jª*áë f"Ã=}yK³4ìKú@=Ü2ÖZRLÂCE­õD«LD™@êÒ•ÖÚ‹*#Ž1Òú¶IkM¡ ÷ôá¨j­š«ã@ËéfŠˆªŪ‡MHˆi.šI†‚UQ£4èãx}}}KÎjk}a'Ë÷ifMûàQŠ6ƒª…xVOFTG1KÇe"‰jf>|@“MlfQ}„Ó" IDAT«æ^zx ¦­5×Ót¯Õ/©8@FBꉉ¨“#(¦///cŒÿý—¿d‘où%ͬ÷œ{d0ÌT#¢¸"•ò<“}ƒ´=¥;4É[ëŽÜÐ Ït¸ÞFhÔöÆêäš=ᙑ—Û!‡œÓ¦93kÖò…—ÛÚãÆ»@Ý“ì_D0§AÛ¶õÖ&¼H«/ÁŒä1gLèÛ&Ó?œH-=BE 9ŽQ„êye»ûq ’IÖÊí ã(Yˆ®hížäÖØTDˆ`6î‡ ¾?H>$BEƒ§¤O–qd/ƒ#ƽ5Q5à(Ùµ™vK媃4ØÛÛ«d4qk½µN‘Ã#FTß_ŒˆèÛ¦R$š5µ¶ãðÑZS­Ò»áCUçMLî1¿¿¾¾¾½¥ï×_ífß÷DZ?²"»õæÃë̉4Ê™©êàTž†±!âÇØS«C!cæÌrk¦ª>J=NÆ ‹½Á+ó“"鋟Œ.I€sX‹ûý¾ï4ѧqì_þå_øK¼¾½åù#¼-ômSÕ¤©=ÔôÞ·d&lÍ211Žá>(ÜÇȬÿeÈ$YEò¶û±¿oÚþt¿ÝÍ,›T2ý$ûm{¹ßþçÿü÷,Qo½ýòíÛ÷×××·×»ÉÙúÈÙáPe‡â{4k÷û–ù›y ÊáéTîÍÌq§5{y¹?Ž£©Œhb|`Û¶|GUÑ Ã#ƒ ºŠ¨1.ª'( &d ù‰‹(D¥ç½²ˆÏ'T¢Ò|T»F5*pHSþ ç¾PJ0 šó`5ZkËöïÃ݇ÙºšÇêH<5¢Ä É‘ e릭‹;I×H12Ÿ:u²¦î!âJFxéíäIE«oT*T-™ÂsÄ Éb— B­÷rɺ'M:X ¤ÔPœY3BUíƒAêÖ)ŽÉ|§Â¥Mbx‰ž\¥„ùùXù0¥`5 8¤Š¹Pxø0hªs\´ ª„ÄlÛÖpÏ!ˆÎ䡈ˆáQ@‡ê (•EB\ÛØê3P#L$¤é|.TYn†ªHÓä‰)IM I v–O‰ÔãMyÆ•we9B315PO¿ëîÃ=qÚwdôz²Æ[³Ù0_,¦Ì‰K®g 8hUΙy`V›3KY% e¼ª:‹‚¿4sŠ!6‡LWÚÉÓ*5´åDEÎû©‡-0ÿ#‰©m‚ò¶TŽ)â3…àáâ¨hðªÌõÑà”ò×èáâW*@çòöL••á]b¥¸\‹—í ¤RÇréæKÏg¯‹Sø‰U ;ü©øGÐé U'h’J¿\žæ)¹Q. §¹ËZšk¹+™+”ùñ %Ý’¹¢ª I› é#ŽÈšavbI•Jç ɆR›ï&eŒ™Ÿò¤«dÓùið&W,t²Uæ4)*›—"&Ih®"ŒÒTƒM$¼@*3î¤HÈd®„r<_–V‰…Ë1ÅDEùÄÊQq5ëÀD çä×.º$7†ŒœÏ«»¦|2k¢+æ SVµZ°*ZîY€©MY\g¥C"j«CÈ Œ”ÁÕ‹µ¬UUN|måç}'$ÛÙfénÝtÞB(1·ÝéSÉûhµœsŠÌ5Ü“yÉ×8 ›”Ü:õgªgµ¨§5&ƒ¶‚í¸/ó\íóY6$µ©îZÅ[œ¡Cæó µYK*òOYKÿø#ªõÏþ€FÿtWü;äýÿ3êòûQ²|˜Êž«ó÷´L2…Ÿ[¿ka9's?BÒ,¢SÇB÷œ5ög‡‚Owj•“¡ÿÜ^›]󌄊hm,p*ûë¨OG­¨ýA1•”Ç“^Zù€¢5â\©ר8ŠO3^Œë˯wÞêXpÜÚÅà³±(®}6«^XÞžŸŒïþ:D2j¢¹GV›ØJSA‡– ±©L®Å™¸ÈòÌ™Ñ`ˆÃ#È@¾Žl3¥Z^Ôƒâ¦j*iõ¡D*ˉæ7UÀHépT(?^et•[ŸèËÜ&BÕš1|b8A a«E›3,’6¯.á;å¶$Hp0Á8‰Ht;TżäuÜíÁàAa5œåS&|ÚZ3µ,¥Ýeÿþ—ïß¿O×* ¦•0Й:ÈÑðEÞà¤Õëêr+(L×ö¼DæÙQ7{1fe±š$n Ä‘ál—>› ÌÒ —ÖoŒh­¥sÇLSß435Ü­Ýo·ïä‹™ªþíû÷JÚl-…‡å›Yë ó]”‹Y0 ¥ì¯ônyÅÃÇÜG£©õ—_Ô´›%f¤™1µá1 ¢TÌlëýûÛkx8ÆhÍF ±ˆŸ¤„«Þò£áF‘Þ[™ßÜGΜ"ÂS¤A˜CTü¥D«Q LŠp™™6XvË:áÎÚ×$é& ù…Ô³Vä(}‰ZñelD`ÞUE)!²š<Êv-æsÓ…—Ö¾„Þ ²e²WÈúG{Ú#CЭ÷ÞwFôÞµ™a0ð—Ç1ûÖ¶ jEÚŠA§ÐÇðf™ÛaªîlÖ~ývÿþx—†κœ=Û·Ö‡ÇñØ÷Ç#"'vƒ¾~ ‰Þ¬M†ÆœžAKžGä 91+^:Æž¤×8õ-*Ñð»;çÆ’’µÃÇðüö¦Õ¨œ©©Ô­Ã#|@šªÖ?ÕƒÙëòË/ß"‚„{ŒãPÅ8Fkí¶mñöúªß´o]Uå YËtœ ¢f3ôC›>Ã=òMð2©ÂKFŒc°µ[k½:3æsPD|ŒìZÏÑk3óáûþÈwæíñ¸µÞLÃuO ±fÁãÐYW›í»©J&Ö@¡½o~Œ‡ÿmìm»mÛ}ëòvI¡7 ïÜÚ²@†jªPª© xÁÖtDNÀ¸Ö‘0ß"éÔßR÷ ?œÜÛÌ#$ëZ¸™{{-Pa$L@UX­t¦¡Y#³dÙ°Jcê; p1“6ïf89Ãåó‹pÀÖQÕ¬ðVDDË’‘L)ìÚUußGð!´ÛM=¨¦ÍêœïÙ?;‚k åî¤R!-nš5ƒÚ2&‚pêU” ¾Pþ›‡ N[Dž žFu•Ù·CiT­ tªN4P±7q±¿·¢dl We(¡L¿ÍÕy©¨Zÿ/däj–ïo”‘,¼&²ÏqeA«4UÍœ¶–ÊZ08³¤Ü`$:†Qa,ŽÊ¶9RÓÁ@­%" ª,Š ê³¡ /È¥GLð ¨Ðnšµ³X“[Ÿ!¥®_œáôJ8„gÙmäÜg‚ëñ3OçÕPG""ƒIÏdì²Â%Í–ŸfµM]õW?ñ[%þªš˜‚"r(djIýÏ£‡TD˜é¥šÊP-C­5 ªa#*°A=[ôf-EÍ岦Ü0¥pÈêÆ½Hƾz™#œº°ƒ3wÃÙ9'dT­ÓLp±¶/¡ºˆÿ§ØÌ¹áOÈ炉ž»`h²Ý.`õ)é‡èìƒ Âó°#«Á.¼Ia…Ѧ¯§­Of!¾h¹ Þgôgùx®NϾÛgºQõ#H8õÙ—_ ÷2>ÑUñNÅxÖ$òaÿ‰køS÷?®½ï?^šß‰—¿)×þŒdùwY˜ù“_ñ¾søçâüÌTþ{?û®àùŒygŠ_£gÑËôH×fý„v}~ÔË{qÝ>õûòã¬çÉÎß|‘x?ø8¹!¾0ëó÷êïO¿ßÑ:Ë/&I_~jx?#‘Ÿ#ÿüä+ûüËøO¡ÐàïÊ0à?å@ø;.ô?&âÿw \†?5X,ñË—RE‰LÈ>tÓUÉêÆMK^µ6ÃvkmÑ&(Yq^pÓ°I˜¶(àiŠvi«@ê"ÑW ÀÙg¼ ?O‘SÕSŒY<;ró±3g~>ÍêiXYdy¾1^‹$õÚ·s’Ï¿ Á§Ã~X èoMÞäÝô ’pÿ ,ªª‰š w ¦–o{ˆ3–i`æ1$¤©–‚–ò¨jÒÏKe¯‘¸Ù[ ³-…uJŒ€û÷­ozWi-Þq¨Xºƒ-\Ë¡Uï²™4<î ±ÔËtÆ3co=in9­Ê Q6½m/y .d„™AmzNUT›Ùj$Îå~•¢¢ZàW6k}ÛòÕ™5˜šG´m+p Ãb I"ÖL1ShïÝLEä6¶áîIÇá,,¥ð~¿'õ"ÁýÙ»áPýöí®ÀÛÛão¯Î,ÈUM§œ©©a?|Ï 3Q˜5F˜ª“ŠÚ)T•&ê~.™³SbŒáÖÚcß/+1:l¶80²αïåfûöòí_ÿõO{}üû¿ÿ¯Çãác„ó¢5ÓQmš}mBRfŽ¢2ĶmÄöÜÞäÄÁƒ´l¶¬>B)71'Á9OÝy~¯›Úöú·ïªj}3ÛZ"G¸€û£õ[DÀÝ6’,Q["‚´r—¶™®Æ Š ¼¬µ"8³,¾ICD3tíûCU7@èÌ)âÜЪä¥1ד–¯öÖǘ8Ïve†X)ªõ nÍœ$Ù[k½‘‡»*zë³2¥zß]Ö^šr$—@Uá³D>‹>l:ç(¦93Àp¸‹ˆ™ w¡c”¹-¢€ûsË—|@#<5žä„dıï½73ìc{P°õæQnµã±;£©ýíñðÃo·ÿøó¿üùþrWM—*¬”tÕQê‹:ûPê1\aÍ È’*s%if½©A#±$·ÛfPzØRìÉÑËþö8šè­i³±¯¯n}s÷Ê äî—ÁðáÃÍ4Ek­™¥Ò‡¯¸L5¸ŠBŇïû‘­cØ1Fx¤2-ªÐ0…çc6ÙJ–®*5Ê{J›åÎBQ2XÜüÜRªH¨A|ýhH›¼ˆˆçØ™ÐP³õ“rzk *rœQã•'ÊØ›³Z¨¤íÇ<‚¥¨êÔ ê‰ÄÝî9T ÷#¯U^¤ZU‰(#z>{³¡”c?¤ôhèÖej°€ôÖTq<tÑÍ!ÒP@ ‘öC³äÙ'©¸ñª'³¶Ý½‘4ŠXÊ¢©Ù(c¼3fÎAÁDÇ0G2Y…ÈdÝDÛ¤à9¥É+7rÌ.ÊB†3!Vó*aÐÇGŽ: ȰúL˜¼rªi(ZºVþòbÃOo¥R‘óƒÌìñ U¨)ƒ>ê6 Ó&j½µÆ±#Fá‰ÒÏî"EÞ×#dDÐ…â.!.“ñª†-ç9Xât?8VJ*ñØ×MK³@„¡Ni mÝ B¸sq,¦Ü¶„•âæL‹AÍT'ç2Ͻ,ÅF>S—Šó‚ªn€ywйžnÛŒ£Õu¸ÔH“ ´³dÊK €2y3[SýJ<%‹‰àIH\…SÌ.FRQi»¹ÑÈõ4(ÁYí•7–™)HõEõ©xÀL¢¤§Z}Ã’o«‰xNûf‚Y&Ü"vžã“SýÊ€Ìéõ~§é’ÆŠÂ,L ͹Ë@¶zÌØ™=*,¾DR­N¨á¢ê^?Qy̧іX»iHZoÈYò ñ\K *‰[+?ýüGLíœZÌ—Õ[u“̽A¶T§€Š†Ñ@?ØŒl˜šÐ˜‰‚*Åá'„cÄ!Rî~ÒDÔ@ÕÊC„WËŠŠÐ Ù¥&gZ) Ai³eX’R(³Ú'´Ô]df¸6€GD’É:H--.´¤*’•Œ£»Áì3ˆŽ±Èø wæ.÷ `ˆ¦/•F˜Ë̪TÈ<žqÏ#x8r謵慻gaÒ¡Kó0±=ˆ¡³z]NwéÌtÿ$ÏþÂØ›xžD­pýÎKµt‘Êøîë}Ϫ'æpñ`å"øãå„3à4qî_ÊGø ¾U÷Ôä®mù®§PN™‚;íoþÚq߀w´Ÿã´ŸòPomáü‰w’o·õò»zâw}Úï}¸ïjcZ^| zT§Šl̓^}î§¹o€æGêwSœÏtîiãC•‘ßþÕÞÆä,€w£òá¡ÅûÿíYÑãÓúœþ˜ØþŽYô÷AÿñÍØÁ‡ßðO™<äaáÏùÛC¿Ï0ÿ9’ù{ÿQ™ÿ@°ü[ñîBßðd~z”0>÷¡4R}ÅæÎï£óÀ<v•¢•4ª¦Âåž„hâ'rÒ4HçÈ|ÇžžE%f“ qJùû $IàØ£€s½$ª§½è|³å¶ožÝ8æß§"òýxþ–xÔpZy¼é·#boÿ®!‚1¨DËs¥¦RËßIa” ~Ë&[ed#¡àîÅóQŒ Èe¹X3PB‚i‰¡³'?ZUÕ–¤$ïý˜jË„Ï(ˆ<Æ„¨5 2Á‘éñS8Á g·©”* ‚¡¹d]–Ý]aÙ-Û;±lÆ”´¶ŸÅ}íYZƒ"ݬªYMˆ´ÛWÂâ•=gD–ùÎ ×Ê{bÍöFT…·ÛFr±F¡©{Ʂ†«™®ë ȶ &¦9­;mNÉÌ,×å­5¨’Î#ûkmÍX.Z›V=2z“$ÍìAUåôóº{„/fb&ªŠb1óé ÎáMv [ká¾,í²,OëÚZ‹¾~ýÚÝ)‰ð¶Ûí–u¦ÖÚ², H™ù:®i­=}þôÜVk_¯ýºÝ®X«bU ÕË“­—Å#Â%ÿ0HÃ]³Ç˜T˜ª…÷ÛvKR÷a–ƒ ÑÖr ’õ›bâ©iñ€(W `Û¶¾õ>¶ñ/¿|º<]z××kîaFUΜQò—òµâ{ʦªº´å¶m^ÚÒG¸zøArйÉQˆOî,çRhx|}}MHÀæþ´¨ˆˆ»¬‹È]&¡» @Ü…Ñ·Wœ\"Ó«‹G§ÄuK‘R,òéÕó”KÌͤ{–ǽ÷^‘õÛvS°PiKk ¸Jºž%º¨*šö1"F@M*0(ŒâP53c Wƒ™z§P^¯·Ëº4³á!"«Zb¾ò¼b[ŒÒ –W]j©ÆLÎ Sˆ¨XBÇ£ê`Å= 2ÁMÐYŒZ;_ic,mIbÞØf¶,™7âpÏÝþyB9g#|ß¿“ñüôtyº˜j<Ë×?þðám½,d–vFü§ÏŸ½÷ÿç¿þë¶m_ž?}þõ×fÖ¬}z~úýåeÛ¶¦–!v ·Ñu¹È ˆu± ìu ™ £¯²®Xª$"2Uã? ­cÜÆpßúöûuý­W9ª´†§O×íêÉâŸn?–`mî} ‡êÄdÝU׫&nžfvÁE–ɬ acŒüûðÖ<¨Ó,‚u‘–“JAËÄÅ|æWãk–gä. k-Ùž¦ÊÒ‚š8~…§Ï•Ò,ÿ&D$†;`ÖBÓO+’e±P ›‰‹Ë¬;Ê€JŠ×éIO…>[ ¡5}Òu4}”%Ôæú€ˆRÀ !dò¯Ý#Xõ-ˆÓ¾ цÙ 5¥ª™vQjÞ¼YK’Mš¨…ñMÖ çŠÇŒ2dŵs‚¥ØVRÇ6›‹¨‹K š%¥Ë’í(È̤iN¯YdsÖ›'Jý »Ú.¡äÓ…!Œ°ˆh¢j5òqD¤ ªÀjíFr2qHÈÎx¯%¦ŠXŽ•ªhYŽ™¯RBèi\§‹6è*b:ç“".U_Âᡤ˜©YŸ‹ÙºõÑ·[8¢–¸‘.äT dòd¬V¬ˆ0PN† ¼îVÕ8e,×Å0öl™î]¥…–eõÔÄ-ÊÒT¥.®ôd`hZãÓS;Ù— :ý¨¦õ›çEÛö½&uJœ©Þï`;ýûÖ-5]E=ÉN¢O_ý·²gpÑš?&Yý87A…04Ï–ž„÷Ò1ÍX[€Ê¤›CI¡ï¡Í b~FrYä`¥RVöÞôÕ£,QA” ùŽžŒ&ç΄; •ŽH{»èQ}<÷CÌÙü 6M›1Cµ¤†X{kÊu›wv"T&§~’^<c“Åš Læô¢¨ˆ$ʪþ‰ì¨‰<îõÑz9äÛq&x*ÏK©)Ÿˆ4³lù.k0A=5 ¥ÒT­µYµ•ÃçÄãä[(4[É\è`9É­´ ¤'(—Œ™ßɱF8S·Ü?d+JÎæJÍÛ-&ºhï•&Á À½T)Wб¸‹OªéÈχêÜ3gïpWÕØÁZq²YÆšÈ\VÖiŠ}ë^Y…š¤o~{~,Ñã£"Zþ”Ü{?zúf„àñgá‡êÿφPÞrógÀ¿H}Æ·Ã-<§þuz8?ŒäüÈ7Ÿ}ðÿ?+ø^_'g ûôÜÛǸ@Í `æ “½B:´‚”HÚǹ/ä”KzsÃéXȼ}ù O4×a§§j›¦ð ì¿_8Ôæ^2]ã@ÑYdÒôæ®ÉîI(õé~Lî_þ–œv7SŸ¿™XÌBM§ ÁãØÆ7'èÒÄáXÓ4#Çï%¢PêÞž\ï‰ÖÚžIíîõeUXk—ea\;‡5kÖbV=©b]—TàC>’]#“ÔLS’ؓΠ†NeÇ¥ÈÉ™µ& "ÆÜªWGÃ{Ĩ²ßf${ïâ^ì¢lë,=3‘Ði"NK^šx»C‰B e©ÊÖ®1Êñšc¨§GHÄÒhäõ;ç ¸µV]Ót¼,KÒíƒáá¾®Kz‹U±´¤'¼UÄš¹{ ªjômx¿Þ®Ù šý&hk3mKkîÑÊ·BQ ÷¾“d:›8Œëíeôþéùóår±Ö<îÍŒšE»-UbÕu]¡:€ñûõuµö$b­ýòüéõvwK[HÞn·ˆØ—›ÕÍ q­‹Ö¯/=Ü[Úò*2züå—_RÛu÷Y×u]–ÑÇõõ6²÷Ï,"QÂz³÷ÍÝ=BT”šÌŸñ:ºO¥“&Üð rUÕf“f+BrcÛnÒ}\ÇÖ‡‹jQ¡˜|fwwmYE™.-Lº¨*#D•#|øp>Ìtl"CFŒ‚³ ¼˜’§ ‹L=ÈØ¬=­k3c¼¼\oÛŒ1\›~ZŸ&2‹žÇóò,õK AwcáÖÒïlÂ`øpÃe?RÇ  jËé&xµ%É0}„§.Âq“Ýjr–Ü!¨ˆwÍ–jŽX)1ÓÖZî.Æ‹5OfÑb­Ò‡‡š‹ú"‚§æÁˆhmaH~׺غ.9§±Öö¶Ó¹ÑALš-fF ¨ª&¾…ª¢¢ ŸEs5›kìµ IDATè|YZóˆáîÎù›M4<ŠgP‹³¾^…ÎB.TV&ŸMë²àËg¶f…ÇQ#]Õ´fÉÙy}}Mv.Kk뢯zݶŽa¦BÁíözi ¨½÷§ui¦qRPZ•ˆˆ>n¯› ”çåIMsã ˆ ÝCôÛˆœÆq…ÙXœž™\ÖËm»‘>F¨¨ TÑš©éíkï·~½^¿|ùüüôŒv0*Tµ>°dîPªFuö´{Þæ yy¹¶¦a¶¶Œpmì[\žìéÓ§ÅÔ‚³†3\%E“FSuŠ}„ªR!D¶òBµAéÑ‹{P¦bUÍŸa’Ûµ§§)¼*;hjˆ”T—ÖT­Z³ë¡–pâÂ4h>h³Î$ŸùáP8›IÀrn˜Ñ}ïz!©Pk&³:%gyµ¹0¯÷ÖÄË%*¤”MÞ#ú¶ ÕäÓ§ ­¨0”ˆTÝ  dÏ 8•ØêèMqQDáÁBÕ@B*X„Kq9•–• ’c$+D-sU!=Ýë³¹\)ä‹sOÀ‰i× 3…`‘E9<œ"1Áú÷zGÍô@’#jd˜ ¸P@M#8…ÓO.ʰl£â HÝ8X—Öš¦´Ý`ú0ï[äë´ÖvšÐí¼DI§Ö ª!‚žÿÞ wH˜5m—¦ ²JuøŠHfi”\Õ5”..“xi霤vKIÉSËX“4ƽ™•Èþùl6ö’kõ8•)”ïvRã´UÏfW™ýœ 3Ñ ¸²”ùú•jÊæßßK2ÊØÌ¢ÍœÀŸ°$ò»É&³k"”%‘% 2Í ˜R´tWì ¬ˆ XwQAâzT„…¬AL.ϾC-¼NŠ}功¿ÉÚ»yO¾ß“©EÃ˽Aæòã´®)/‘,ïHìp•s§æoƒC‰¥ëåôëvÍø(”P˜^È€8=¯¯j*™³Yw¹s“êà&Ï’ÑÅèlù€Ǿ™v–Å„{˃,¦,d_ Þ‘ÏŠZç9©Šðò–CΦKCNÊÒðMs’ôʹ¤ïž^>ê¬oÐp@¨–§*ñFMkÝ…äaÕÛª:¡c^ë­ÖùºUˆë˜ÿlDØ Õ•{ŽËÏÀÚ>º zâûë²PÌ~ôs­FNx´ÞD""¡²îÁ¾¥Ñ„d5)gçÀ{w÷Ü…#“Qß2ý"Õa0]UŠU~$vµàðZ¼Ä9¢:6‡¸_œÿØ'ƒÜ9_¬äL:çv‚Çšúþ—£1äAëžœ†sÝA¹9çQžúé¹—“ï+´8(“{×)´ép”c%;|H° Hf«S¶Ñì@bÜBf3{Özä$ce÷r‚x¦Ôù€œ¹äô]å>{ LíÓ=ôÀ~ Ù¹ƒà!Q{°Î”¢9e!E{®‹¼ƒ»1Ax àˆèü¯ãƒæTâ=EçgDK~ÈΟÒÜ(ß4ƒË}„áVöÓNmü#ÊåÉ–¼sý¿%îð˜×ë$G”…?fP?ÿ<•»¡÷»ÅÝÀã½ïØïôûc…“ñ•çŸA~û ¼sâßbÿaS3î%ëGÑÊ·;#î²o0?/ãþ:ý)…ùŸå@ç¨>¼|Œÿ5J9Þ4YÿciˆŸŸü ¾ü¿›æ¸@å¬Áñ«1©\zÜ‘{¨(]: I²Þñ؃Í­²´9b™¶ê½' B´6§ò1Væ/wO5ÔŸ^£ÜÊÏÕ,êÙ5—K‘¯½ÍC‘½ÝŠÀ]/äDù¹ê$ÍLîD­…¤òO;tˆ¾ û±û6xÊpÚp,ÃðèÁ‚^Ç”¥¹³ÊzhJ´¶…zÒBgŒZï*ÌÔZ[Úâ½d± ˆY•]¥‰É̬5­š+ÍÎÏ2ãfŒ`¨šBS;6Ëì-Žh&'ð1|tb)׉f“˜`¸“²´†}»ôm FxýiÜHc°ˆÓ¡ª‚¶44#Çû’Fcµ·DzxßúðÑ–6»&<×{ÈK"Î’„ÆÁtk2·ÞlÛvs÷ —ÅT­úæ(ei‹BÇ"ɦ`÷! K^4}º\T â UÓ&¸AFŒpD.+óšœM|F#ƒ} Q¬ÏO.ìîjÚTaFÑìëËK0`¦ª "·ëõJþaöééy1KI“§3Sª UgX³Œ¨H»\r5ÝG'C!-[ŽÕÿÏ/¿Zk×­¿Žm»Ýò¦jËòÄœaÐÌ"v;+\dô-‹Z‚K~M¿u¨.†j×€"Fº^ia³˜q¡ ÕÖ$bÑE€›»2Zk¶®£Š &¶0ž7ÞªœÔ¨"ÚìòÒ•{Vήm'Õ©Ð f­\¶˜‰ª-OË6¶ß~ÿC#á×Á§OOOÏÏ!0 bèö:°^žL¡. Á÷S(êîØkJ j¶bø ‘FcÕ¶‹f¸ˆË¼”“õº.m½,­µ?¾ÆÛË/¥Q^llþüéYOºPxŒèN*Ùû&N3= ¬Q©ôÄÄ `­…‡ FÐ2#⮂ªU&h±ä ¿´ÕÌ|†IÉțʑ…`Qñ|裴¨ålEÂb !`hfùš $Ý/Ú„á$-"†‡"²ÎsOXçÞ,岤§–˜ÔãÖ–¼Óƒ¤Š¸»µ/©FU[kÀt!ÝŠ_~ýõéùyë[ïÝÇ0Óח믿~Ñß¿~½ÝÆðˆÛvݶ_>“`ß6ùüiYVÓ[ˆ䈶´ŠëõEÒ.K[>~6Õ×mëÃód÷­_·kþÌV-æÞ_aY¯'ËÒr¦><œ UkjëåòôüÄàW{ùýo‹3k­eÁö4LŠ6Ř ÷ˆŒ:k3˜S÷‘áªZHd|K¨»˜’ bšú€ AƒG[h%¨fª¶ )ë§TЦ -ñi P‘6ÆÈ½¤-­˜×sE5õy³3Y FA!áaj93à ª×b&ßoÁ©¤3?†PæEÙI{ èÂYTÇÑ^TÄ,_fÕ+4„éôÏb–0\Aí… >Ý• `šVî$‘°·àÙç`c"½!3%w¯H¸—õww$ÎÂGaÊy`¦>r™çâ)3«BÛ“èCG¡êCu‚#B—5ñÚû«\UÛ²˜Y3µ¥)&ÒT¨ÞcD>çb6OZ$LAñpQ5FzuǰÄÑ\µ)Ui’,šDé˜ wØj-È öpºE.R§y¯ÇB0h¦bk[%ùD÷þŸªfVˆY¬ò¤DõµÏeÌâ¥]B˜]óœRoxx„R\É¿÷4óæ<+j»çJ'Rçœ%H£}eGdhÀET©2ýß"P±Ì„¥1ÐLaÂT¦g¸®Ó$³Å,žÂÔÄ¿ fs§íKfųö^Gîtò÷õ‡Ø[‡Y7T[ìÐHh2|€Gëòú‡g»Z¤Ö†ä\`'*Ää·d$€ ÊÓ¢ËúÄíÅ@ª¨™©®¦¦èp:¨q¨üy=ÌÿVYLë$ïJD¡BlGofRš¨¥ÞÚI‘ת ‹ºž èÃÉ‘ƒb¢2óÅ™ÌFÕJ¦J™|²,¹¶sÓQŽPå qZL§ÛkŒQ0µØ‰^™@ÑâΙ A&Øæs-Eí|¼ ö§{Iä¢*E/§8k/SÂT ÏÜ=ŸJ–}N¯&©Êê•AÆÑD*Ra:ƒE”Šk*Èòa÷1˜ÞTî¡*­Íâ¹zrììÈã®±´µ™V³F(¦õn~K8q0…š Œsœ—òô~åÂ)Úçó5Pt…T®äÀÑÚ)ÿ'´€“˽œ Ä-ƒN= õ_P5S†˜"*ý‰i´¬ùì*~/Úf‰ŠÜù(O2NìŠüžçÅ]ÓjQÀwHâžtï‚f­| ÎòT|}«ø~£é÷£ÉoT <’Ì¿+êñ•ýõзú7X@ïÛ}ïÕÿ´Ð÷úÿ}Ó¾!)ó1[éôjLÂ[c=ï xwâ¾lº¹<ÂËàÑ ‰?£—¿¯GþËóêÙ}wñï»”þ4ù]#ÄÇý]-Ê¿É~–ˆÄ}býoEñùs~ÛÇ…À{êl¦ïø>óE`oƒ N–,Ž2œúæHºê]ëwþ4îC&˜¹?Ø ì|†ÞáTm«t±ˆbÎ/å¨ >çv‹ÍìÁš“òØósiá z'¨:_bºs÷¨À>Ý—fºëí§¡Ówd¹/5ÄïĤ}éq>YZ€Îwg-êÛ±ÁKRiVÈÍ6Ź*©ÝªéTuîžr¿•¸Zp÷¥µ±®ª°¹[4M[ª ÉuH[Z’Ih¦1ÉÎÓÁ#$ÝÝ%"̸%}ŒAQ…s™ždWExÌ3™¢<"ÍÍ7w=/H‚A§PÒG’ šªêÒÑ·ˆš.åž8mrs¹fÍ`"ª¹\£Ç¾«ƒd€»±£,âÓÓ#ôÁÞ·d(-­-j®º®[V•jÓ;G Íš€¼D‰m¨þ„Z=›©!ª"faj‘\F3ƒj8H¤™œñúz}ݶOªŸ?=mÓkA€îB.ËrøbTé^EoäëízÍ+E¢°®ëmÛôh¡*…(«ž«S7Û)³Júï×ׇˆØÜ¬—˧Ëå¸ÝnîÞZIf2Y%f-7])–ç‚Ù…k[Tõµo¹Ê½‡»:‘;Õˆ0µËÓÓó§OdŒîbê½³Ùp÷Ñ}J<ËÒR¹¦šG€É•à˜<¡`äUWM’9®a¸‡B%€xБðÒt¦{__^„²¬Ë¯_ŒëËUMŸžž¶Þ?ù ·?^_9„¦}D[4 øh“À1DÐ ]³ªÔ$íﺔƒ–„RkMUHiÒÜ㈃[¯ý&j!>"¼×××p_×õÓúE!ÍšjJç1Í4èF.‹ª#+Õ‘ç´ûp5ËìpOÖÊj&"}ôµ-«5¤™6]—eim£Yë½ßFŸ w8^Â@@LDÍ8ýbdŠ­)@N8t^# SÓ,c8œ Š†ì»Ó¡îáe‰ó€ì”Uì#›„xp]×’ ›íL•ÜöC¨PÕv4Ï‹XBÀ><|ô­«bY–¢]žzßþ÷¯ýÔŸ³~:"|ôëí–ת*ŒmlÛ-ÅP:EdiËÒ–¥ÙÿÏÓ£[,¦—Ë‘êI0Fôí¶m·š¤ŽÖYÑA34•-;d&º,æ é‘Ü[—å?~ý•Á_¾üÚ·þõåÞ?óišó:+yQƒ¡PrˆH³†&îÙ˜7ÓâÁöž]„Ⱥ6z¨ªGµôÖÈ<¼5˙ۀ®ª&bš·QH>—‹Y[V…ôî¢0iÁ0­Ò¿¬|wRÆ&Ò )“*»@‰Æ— ¨|×(ù£µ¶¶¶‡Æòb1HW¨Øn$-iÜU÷€ÁB™Ï¢‚O§\`JaÕ2—”\êz3µXn=ŸW^Üð"ÍA(ªê^‡§ºy«Z².%TmŒ£]5ß»SÅA>Kç!¸óž<Š«¡ÈGGˆ ¦mX¢Ž^’w`Éå¯Ù’¤mV²X!Ç+Óˆ^“õÜl¥#tS@CH«".A {#%‘∊äêP1ƒ‡íBk’Ž*ÌSdÉœZNŒrTcVhÄe½P’[6@Ñj ’Iz°Äî|¿h:±C.ÊáBÁÐ’÷#ŽéCcƒX~6wŠ —ÒŽY¾Þ:L U[D & #Î8ÚKK¬ ˆ™ÚíH=W5²q}6…³çÒ9ØšþL‹L1KJŸ8¢'&5Èë^–oh$Ì" Ó½/Ëç$jšÊE²È î¨øNL¼LÐCV=ÐÚ Í ÅtO{±Õº”°¼µæ”wÖ–9¸Læ:Ó½R"ÖN*: Îs8x×fÈ#zÊYôQµ×{â .šç î&æ½÷.¶;cM„ ~D¸onægê»™û‘f&À¥Y³šuÂFT­t¡}¼8=êÔT)¼ŸjU¥¡†&ràrŽÁqÒ>Ó¡²›C3Ò2"vßFb-­D“ Š©Ê¹k…tÆ|]’c"Ê5%U¶ÙƒÝÖEÖ§}“³$¡¶Rº«nz¶ƒŒá¹W#2O ÄO¬ ‘¿7o#Ã#4+ýß}P(ËljšFòõCÿ+ß©ÿïeÑ,Ôø@hûìÃ;&?=¿Ná#=úÝüˆˆŸšàáÔ‚9Jw_üN÷—7ÕÎ;ðç4ó‡Ç§cˆRJç@ oO1ðøªx§éü<ØÄà~Ô!ñè*9V½üeü#XþQŽðO×Ñ“>Ïü‰¦u|w`ðÝqÜ?Cëç÷>èÿþø±¡ÍŸøžªü|0à£ó~îæy– H>Tž[¿7l8SÅXMN!bš/RàhÒÅõì ¡K•KÕò;/ÈH“‡èÎvε@ˆºÀŠ !§Ã>‰Ì%1ôþW–»ºà3i¦‘ï <­K=£çHàøZž"ÆóØîéÜ!—ŽûmF½›g¾üñ.PKôbwTvx†ÿ+Ù< #D芉/„¨UM€€Š™AôÛ¶]žŸ>þtÛ6ÑÜ ÀɦšÕ «Å£iË@@ "`”d.+‘tcN£Éô=ìWh³ÙÃ;ÙP€­vó?%ÒüøîUÇ(&jÄìÎ"SSA„¤õ¯šc%;ÇÚ±é*&ÛmK´Ž™åž§µ–R =vŸ «LöVÕÚƒ‹% ݹÄ[ÚÒ–¦Ú"¬ÖĶˆ¤÷_–eqF®Ñ—Ö`ÖLEà 0†»‘yŽ`:mc²´æëZ¬M ´¢ÁYq –&¦Þ·?¾þÑ.ëeY¶2àš‚©º;#tYŒ¬ùRÍ£—2è¼¾¨ÐÅÚ&MÕ0¯é,y."MÞR¤sOÔƒÿù_ÿÓT—f‰a Â0Tl¹‚}ÛÌl]UÍ´D3[²ï·÷Ûɶ™<ŸËº>­ëHg"d‹ØúfÕ§\M yõ‡ÓTZkë²@ÕÝSÅÓ岊0ÿ1º¶¦fÁðð&–=‘©3óðÏÏŸ¤FxY~ÆE›.*L$+afš}ªP'ûèk[µ5í}Üz¨ °šm¦ËºüÇ/¿þíúõóó3)_ÇõòŒ~6[‚"ÝGÙÎET…ŠOÏOµ ,Ö$d@†GV9Vfœ©ã›06pÏü=Ýašžáëõî »¬—Þ»PL ‹%ÃGinóP5kŠÖtõ%϶»7Å¢&B*ÃS÷ƈ>¼g»ò,ê †€0Mƒ*H`ïÛ×Ûæá’Ýsó–`ˆ”ÔGm­ÄfTƒlJÇi{Š(_Z3kóy& •&înª±£#ÔZCò‘RzdH”í·ÛÕÌžŸ?õ¾‘ܶÑÇø¿ÿã?ñð´>n×ë«÷_~ù‹™D°7œ¥=-íå¶1Ë{ÍrO¹´…¹,ËuÛ®×ëoýk*écŒáŸ^oËB¾^¯}ŒˆH÷ý¶mùË|~Z«Ç0oU¼îž¯ž„ 54JPŠD?Æ€BEã´ô><\DT±^.ÃcëW“ špYìÓóóß~ÿõ¶Ýò¡—OÝJAq_ Ì8ób#?  i°ž%ž-)É›}¶,-ŸÜIGѵ-«4Üû1(Ëb²m#Ã<6 ȲÔ¾Áâ ¯A!FWm‘*‹ ‚ÈVyá›TÏ,ÃGxÆÅŒ ,¦")m‹ÌgÝL<ìó߉)&@F¨‰‰Öæ~òƵ3w0 #Š™^dõ1BtY0Ë *‰Kk#J”K †%Ȧ0[šTÃ;†#‰$ÈY¶ÖŠ)˜¼ˆLµyÖ@òX²R  ムDT1¡-M©^¼‘L) ŒFòkvœÈä¾ШžØ•¬-H ŠDÌŒ>¤jAP‚œ9n›©& ª”Æá°lÑMê7Mµ¥Ÿ]êõ \ÐsS@½T6aP±1|»máC(–1!³&‰Ó 2RæSJ Ï•– ç-zTR)…QEèßí¢9dr†1šî”ézú1G@ä5W¬f É:C5ÄL‚ÌŽÜÉÎrqyPô©g1'¶i6é \A§¨TÉ‹µÉxQÒƒŒØk›v -do›ÂxZ˜£ú0Ç.^ä»:R/“=3 ¦ª&õc16@huÌUd %E÷Mœ“•/U)fG™d-ˆ&Ö²3ù0 óNG+Ù]TèJʽ"  À¡V ½ªÌzÈy M £Dä PÒ¥.’®Ó%ë~+0Á=t9û^œT³Œ6nÃó^ á º&ƒ&xâÁW*‚$œ»û‰;-pO RbÏ;deEÑ™"v-fŸWVgŽØZ+V?$— ¥38r¡šJ÷QuÎ,a$•O!mY`&Ù, mfˆÀlþÉë¦:ã#ûŽþ4ŒMT«^ rPNžVT+µ¥7gäÕ¹ïýήÀâFÖxXfˆ°J¹!ÕÍ9'jà —ÄÆ€=ûgâ0 Í MV0‰fÅÑ¡¼³šey–B9ßiÎß ¼ ªÅ|w›˜Ó” ²V³6æØ÷øE¥1›ccñ N;=&·w·¦Ç-{宿G¤‚'ýž‡Ý>_XùŸómŠw ‘][ÞÃMReAuîeÓÑûÖ½Ü{޹Îmù‡Î²¸û?NÀðúx‘ù¾ôDMZØQ‹P¸Éýž~§¤Äœ!¬J”䮥ԦsÈ|kXÇ#äËôžÜý‡jÊ·bêØÁé2|OšÆÞ4ð°þ EßÓÚø6Ju÷!ù“ÂÜãQÁ™îüVäŸe¯ÆhÊÙ<Í;ýò 5‡œÅ{[è«® ÜYçùfx€ã]'± ïawsè[EŽÙÙœŸž›CqwçÓ“o‰6òX‰Çù’>OA~î'd\É}8‘âûiÐ}ñŸ'+Oÿ4äéþ6Ûèïë«þQâøèü3€Ÿz|+ðý3ñAð¿|ðí³ýÅ©FÔ8¿Ù oX¬)ÈrZ߃bäŠO‹tÌϲ®S8ö,ü§änRmgOý)ì5ÉBÉ«íÐ4%cH!ŽÏ½&¼ðî<ÒÕqJ÷Æ‘´S}0Ðûçäð>´çŽåq¾uQZS v=ÌÚÝ1úÚZ¢´ÍLM54ê!í¹m)7£™• *ÄÕ)Ð@”8h-MÉ2|D8ª¯ò¨œiÜ=I‘¿Tk Õiû¾RË&U ÷(ꥨµ,ê ÜC˶OGä’X-+ºÂ½°ÁÊð¥YSÕf­c‚õƒ­©bÝ=)È9DjšÂÚÿä'eÊ`hâ.Ý€pOk‹1.œ”!qêßJp¬Z¶¶Æ¾ýe8îZáwd.f ±iö©‹ÂÁh­­ËÒÖååõõ¯ÿû[[–OÏŸ±6–OR„’^é\ù‚Ò ¡“ã©Ó]ÁèÝ1Ò'TÀÔ8ÙÕº–Á۠ˈkvyZ‚ƒÒÂup¤¸p½Q(á>nÛè=%Zm-­j9Çï¡” H ÆÒš‹-—¥ý­«¸ÓÁî›3(r‘ç€ìúÅZ«?ùë—/í׿¼^¯üþÇ5!øI{Žm”%EÔ2ÍØ#%îá2F/Ô˜ðzÛXx(zt³–2èt×ëv¹ô¼UáöÞ¶ö|YóœÖöuî[k9RW3(äþµ™Qmë}Ûn."£÷„„зíõz}~zN8ÚëËõ².YABòeÛz5ç B´5ó@–£ÈÞkQÓfÖ‡ ÅcÈi¢ÝL{O/_¯/×Û­ûX×Ë_~ý¥YÛ÷á6û9„¡ªšÔ9¯Í15ÉýèÞ·ëíºm™×°¦ÛfÁ-ǬXT%Ȫ°¼³ÈúÞ±È`XhŽHsòSƒ†‘8Ž„º sŠ—]$‚ˆ ”[š1[P!”Ño"\ŠY!"H–ºGˆxÄüN©‚™¤ @‚®-ÿјó|•6šZ>‚<‚mÒT×eöìGe -ã} IDATY—ÛÇál¬ÝTÐ$·æ–b‚äàA?¥²n(Ô%ò-›Ë±„è$¯ˆ‰Ä¤Ù̲ƒdLTs“ŠŠÆo˜iÑL©¥ÔÞÆ¬qJK‚YµBR9;UÓíšVÔTGâP_³^‚™ÕKÒu 0!* *º)ÈQI%â4K|D½ ÓQ²2Ɉ>†™¡™ª"š>?]Dp»]Y\ g‰@Î^ŠæÀزP"#`÷ HoÑLm™V&¢ž“ B™ÏÏ"IQ…´¤¥$‹)M 4"1£xNœƒ€Ìc”ŹØSxEUG¡8ËÓ’Ù;…ÿp“gß3*¹@=ü€‘Ü:sá{òýí4¢œä¬bï DIg³b8bú$&ò‚pßm­–TÊù ÙY9k+ pÌÚ€."UÃTÙ–¢ 3 Q ÎP –¶ˆ¹r­KÌ*áSäý” ’ýU7̌ψ¨%VÝ/=E¦íÝ„Òr})3³³o>Ò473"'^:EÏH’BÄÞÔ`:œ¡ÇÁU­ˆñé±~Èß倚“Ÿ“ýùh€ÀŽÃ))2G›RIH™Õo<æ¦ȦŴ6™(šIºÎÃ#b$ý<åòY#,4‚4zȤ5Ëz\žäBÉó‡Y‡SÃ’z3W#\)áYBVÏŠÔú(–cÓܽ®Lë‚i$€½x÷ Âò¨€=d¹{S˜ŠÄDÙkm/5Ò‡ ºLËv˜ù3RkE§2ºœ,Â]ÄE ÖäN±Ê›Œ§'Çnž áTžûÂ+u’ªd‘{0\fßõ?Áì¡ÎSf¸Sv§.Š& ûnÞRpÎlÈÙéÂÖã¼tYvY}¯ažåbîý&;hgÖ,ŸôqÙ+v‹&—À³ô¨%¿å…Ä8XVËZ)âíö8ìž“Œr/ýßýšz¯;|Ì19ÜÎü–øÆ7ÂðÎ=ÒM|/Çó{Æ{þ ˆy§Tá-è‡?#3ò#z &’ *÷üÞãGdÆ·:;ß™ûßÓp&Í@%눘`ÏzÞ+ÞO4€|{¼jñÞNÿN5œlŒ=Iu¸mùþ`ãÁÄMöÒÍ·=·{é¨Å›ºÜU ¿‘ìÿ½ôàŽÉ»ÌÉ¿ÜJþ÷~~@Kð«Ëƒ«áÃø¡æ]üÈDð#}ôçNë]éô?/MñoüŸHô<ªà ¾I¤Rî§¼¸{6ì÷m‚jsV •ìݪ/œn–2¸(r¯*õ¾Æ¾: ݵê#pòé솉bŠ22åZ Êh"€ôÔut2ð.îP–èÞMs}|™r:ŸðÆû¾Ö~ãƒÀy!ñ¾Ìùͤâ Y’9‘ÑFÑÜeµ¦KvŸI¨ìxaDH*ÑG7À.—Ö ŠOæLjåèÝ_¾~íËb­ ¨¡ÓÌ€’ì™dD4N'E„Õ–ÔŸ\ù©$Ï$"O¼²@á.`ÌÎÒ@Tš©6³1F„s.ê’¹§yŽly^Å9(¦fmŠª{\¼°§Ù¼—M£H¦·YÖ5Á¡j*ÄèC"Ç'6k‡Kò/©zm eb{ÝZŒŸp9¼¤ ‰ˆ>ü¶Ýš5˜%Ðü%#ÕÁp蓾’Îxw‰àóåIM_®¯~#1Ù*ÍÚÒšoq}y½¬—Eš’£µrYŸ¶±¹ûõv[­).³Ý—Ì®³2ÿÔ®)˜æð½‚#‘ØÌ3T à²\¨-èâdòœTz¡ºªmÝo}»Ý¶ÛõõËÚÚ’¶ëÖÖÏÏŸÖeÙ]93›kf‘1ºªÁDÖª·`ïýùrQèÍûèÃÔòÐìÙ¥Ùè*y~L×T™:žH¥è­Ú&à$Üoý¶´%9335EÌòç··;°®ëÿüö[³¶¬KwOLÖׯ/Ÿ¾|^×5-øÖ¬÷ÑZ ¡¨|ù¿þÏ×ßþûek:£ @[8(šT SŠfqä²´mÛúˆeÉÀ„2%ël«BdÞ€<è"òåù“µvÛ¶—¯¯ÑžÖfzc( šÎñ䉶Å@ŒÞ¥5sa†~‰ánPa€Y4\6»ËºŒˆÒ2 ùÀÙ†[)Ä,[[{Z×—ëUQ¼€Úñš>??½~}i—K3ÕáQ°8 "Ö¶ À”‘¥vÍöò+†§´ØGQø9ÏØh©4”fMM­ä¿ÝU-¿ÝÚXzÿÛï¿ÿÎøbK›J·»dý§¬rÞQo®Ä=_ÖuY?=?½¼^{¿å=¶å Ì,5‹tïõÛÕ=Hùí¯¿ŒÛ]íÒD¼¼^o¯7Fó]™“(˜š´9¥;l ct÷ŽÂæ«êÓó'<üë׫Ûí&ÂOÏŸv}CµðkEâ%…–DIQ³¦tO1¢rë³÷›KÑ*°®OõˆÈ ƒˆUcDÄÃZ Uˆ*Å‹#ª…éwÕ%õ\µz ¥ê'£œÀ ††ºDè ²¡¦ÐgÙhª|ùŽÙJ¢¦©ž–†[•HØ}ÓxZ T NÕbÛʵ*ÐN€•êà™Û©Šµ˜yÚŒY.>¶-æÁ‰Pk’ðýb£A V®¯ì ±E! éâA*w¹8€ d«,Κ¢)GбW#Û›% ;—\ªs2ƒ— Ä4”ËQFˆITÅÇ 3TE…!L† 8\€ô³ ÷ê¬üöȇb˜¤"²yJÒ/̨J†Ò »-™™8öžtÆ6†Hb‚„¤™>/ËÒÌÃo·Î9;$"•á|ÕCˆp@`!Z Ž, ƒkofÍZ“pæà>Q!¹ È aä\$ÛÊ#Ü{ÆÚZ›=³Õ¦ˆš¦Ò=ÑìE ú$wG5Œî…æ*‡d¤*´)âr¶kõ}$Èìpv¡©¨4Ö(c‡Ó– ÆtÉÎâùs¼÷Àwì\j?i@sÖ«EhË æ>+©®Ú¬PbT‡2ÄÊ)æß“͉œKf-$ÃËU `šÓ˜k2ù§À_³a²£œ»¹±êùs¯]ÊEðÔZ«[’9»Â«—x[De.t­'WöÅ„"ƒ¦Zk×ðªv¯Õ $‘ˆâ{ä/sÒ;ƾ¶<<(§™‘5P&Á5ƒEOL_~ÄT%Ó¦•O¬¬òjYÈ0Û‘³Z6¯Ü¹¨#g®…‰ªQ=4D•,BVÒ iªÖR1‰Hƒ¼Déûª€ÂÕ0‰ªÕ<<5ý]ƒ'À;±®€¬ä¡ï!W yˆ<£M@«¯»ë/dÞà{ûÄr-¨})÷Y ‘Láaó§H5/È@6¿”œ]V2[f# žûÒ<€ÆÉŽš¹›ž]Ýu~}øŽÅå,˜e.˜mÖ9–Ëäö ì%ŠY]T?ŸÙ빪bÚh¦Ô•ÈÈCËãlÑ>ü÷U³}–¢ª¶yÞ×–i¨"o¤™2ØgçôKzIeÇÇžï9«Z{ Cç4'•£w> ¡ð<òa½6jHY­«Ç³`‚¢°G¬ŽáÑQ|@ÉKHNYj]q’+S5ÿ†wJÂyä„wzÎãS}o¼ÓÄÎç'?–ȹz‰È‘ëøP&{ôçü–Q˜ßTÝpöIþ=ÂÜzànr>@e<æÿ$÷÷êÏé:0U8é>3K&ùE~sG%pg¡æŽ¤ƒO}÷=”÷ 7Ï7‚$ߺ`y–öç]@¼•¾ðfõæZšWõÏ(Ȥç÷õÿ° ŒŸ˜ñælücP oDj¾ýaù£ŸððˣÛì‡sÏýýÁø?ª‰ÿý£üsB¾ìÿ£_uÓň¬j6ì4EM‡‡m18•õäÂ0_e;BàþsD±øC'ÅpO!¸ˆ&Av2í¬Ë\“R"$ºöé&¡Ç0!7±k³sQ³$|½±žHýGáž’ÊéöŽcVÈy1<¢4¢x8ª‹=Ñ·NgXMÔ$²(ÓÌ2eÊi€br®=Ýëž”‰ªú¥ ˆ$±Z &jÞL¸^.)Íl>*+.jªBõäB@Tµ¥=«N\,M}§0“Eig¶(b­‰H0]<Ô>¼ÌfѦZõti»z$s¹3Ýj¹¤  E$ý½9&(hø¡cê ÇáˆáY0¿¡©Íq waî\Ë3üS&‡»°>¬©‰ˆµ&óUÓ"è¦?oV%ËtˌѯחËÓ³J$½' »—<£ÜѪªj¶eÛncŒ§ö¼.ëèÝ#úíÆÖdÁårÀá¡=†{xDPÍš»ï!âZæHiä¤hë¾ë@Á›÷Tf0¹OÅÏbH°®#R|#ñ¯¡ ö×-L_C‚¼^_·m»Þ®Kï"r½^x~ú´ª]Z«‰if‰HÊ*`U -5#[4ôùò´>].cÜn·”vÔ¬ ÖªÖ””QîoŒî#ÆÖ)Ú)tŠÁ0¶¦Íé©Úö­/mI½ÒL[kq„®¡“­///îþõåŪVH'q½ö¿ýõ/—˲6¨¹SͶ±AÑ} ëÓe­ëY%»4¬ÔØ4<üõÊu™âE¨Š)š5®PuÕÚ{©7…ça ÷‘ jBφK­µþŸÿùÿÞnW˜] ë—Ï­-0h–OœÜìR±¨ê¶ÕñÌ‘ )‘nÚáDº´G„gÛá š‘zf"z聯õR¸j¦ºzDÄ#âˆð PÄé.1Ü},8ÇðÛí&ÏŒ"î£â)ÙgUT±Ov1][§çå, ‹ðŒä-‘eY•_¾|¾^o‘eÍÌvŒÈ¹ÌÒÖe}ºõm½]/xR3d‰ëÖã¨zŸÚDõHÍôùéùùyÍÛªµ%ïµÖZnsò¤U‰CžŸ.Ãýz½òùùù²>­máˆÑC‚jHDT1c²DÁ,ŸA—P@¶Û¶Ýúíöš9ª†–½˜Ùb’—®»öfMóñ· o[3kK ß«ðjo`:û‘#ážï®l[…¨*’Û/”ËzIg0€Ëå©Àà– `”ÂÆ#ç±"=Ýç^-ЬFLc¸ê="œnbùw˜ÃHUØë B5N˯FˆiZÆS¼ˆÈHЍš’Ñ7²M²X%Ý5p S¸9q?ThŠá’E(YšŲ́ê5cöMCU›šZ%È-æ4WØ,3`îd€ƒY÷a³N< ZÙ&¡ÈÖG¸‹ÙÙ’å"†EÁÆ‹£F0O±ød¿;$Rñ ìª>Õ}ž%9±I6”‘ÂGª¤ÒTÇ„"g42·T( H¶‘D "°ì÷PŠ›í„[Ò‰¬:ˆò.× "õ^ÑÃþî)®™”„«jË b>íBD¨CdDPkQò_º"¸õ\TTª€ `ìE“ obÌ4aŽ ÀwºHt‘E4‘üYá]¨Ò4Ÿjˆ} Õ}^$ƒŒ>‚Ý“aŽ0\N[,Ó5š¥ŽÌö"ÄŽ’ž¾@AŠ)riø—¨ÔB5å,3(G€µ¸×Y`·ŠˆÌL4Må ’HˆieȘ&ô@Θ. t´IÉÖY˺·VNív £ÀÙ’ iE„ §xU déLGf—uY—¥Vl,VdR¸dgt…Lw¾Êãdfäá`LPξá˜c©/êÎõÉYŠ&tAg•òV)€ ’»lÎ2ûîíÂ\˃ÌÊp÷t·@€¸]s. ©Ì+Wƒù:sBs$F5«q"N½ž¨¶ˆºb*P¼Q¡†¹ÎDõWK=ÇòxÚA=gcQ]ð:¦PˆZ¯¡ªl‘—’€tB!‹Š¶–8?dÅîŒ6äËÞÅ«¦¼8UÌNäUÅÂÎmÛ„ÑÞÐSüÍ éYIGG%q¥sfx8Ùô‡4Ä W]R=ò4íuxúMÐLÑ aÄèîe2ØÕwÐg?B<öŠGïàAê9{e):ˆS%Èœ±È›é@¹³înéj<Ç æ¿Û·Oà”·†nz†á´€;‹ªüXžçcøh,¼‹ÈcUùcƺù}•?,®‘ï¤.~KÁ;Cþ˜Òø¡ðy áQž§ç‡ô©ar–\so»ÆLywÎø&Cpú4¼Jð©œ*N¢üÝÆ'¿yœøp0q\˜ò~š0{0¾}NÉ~h$ç÷u[òÏ·‚ãgun<þÃ? C„ŸùÊïý£‡û{3 Å¾áúÿñOÉK|8Õü.Òtjÿܙǃ~ôŸÁ¿úýDÉçý´¦ÖS¸gìÒ¤è©x ™œ¨ýZÈd“h-+ߣ BYôþ(©¼gÝçc0¢ÊØÊk¡ܬ›ß=s_?·¨ ?Õ¤O{Tá|#wg|8=<¨ï¬ûŒ¹h`•׊ë|)n1#¾|t³ÌåÞÍG7.¼­ ojYw)Þ‡dça½7ˆˆH³—ÑePU Bzï¹â×òÍ­FV8ç(„P3ÕEµÊP]Z33SeÐER¦ÛˆŠ 2®·k:@D&ûúuú²°Rº`ŒQÔ[ˆ“2\Ôò°xîð(J.Ta–VÏ”ÒTVÔâ‹NÛÅî‚‘ÉÊL‡U­gø;÷NIÂ)kÖÔbv* >ý›,×k59ÊDBXÖìf‹5NE;[åZAš‚”fÖ{ÝÕ†ºSÕÌZŽb…WN×¹V"ÿ/Ò”­ý¶mY—år¹\o·>zúC­¥”ýz …â_´¦}¤áX=ÂS”µº˜Íº÷¹Ä,j^×%åxFÌu1D4·Û-F`ŸŸä¶\¡T÷ðmë›]…ì>Ü=úèÒ–õù³m]—¶$Ø@L×e1Ó|ˆˆ´‘yoª#ALÖ0Æï/´íÂáU®÷´\Dd„cŒÑTë¡r â¦ÊuÉFÖLÇè- Â1ÜñðÞ{жsÅÓG™Y‡õÖ»Ó#bimÉó@1Š÷h¸c»u[bYZö@<]ÖÄlaMa:£´eUŒYk©¶©y!o«9 •”íEïÍž!úùýå÷¿þíßþöÛåéy5këò´¬íûÿ¨{Ã%IŽ#IÓÔÌ=²ªÀ¬ÜÍΊÜ>ËÝÿ{ÿ·X¹Ý!  +3ÜÍô~˜yDduu£ÁáŒÌ‚ ÙÒU••áᮦúéýñÈ‚½”qA]a$µ–ÄöS¤I¡Éó~¿o½g"á¾ï{ºÆÅÒ†¥J0ÓcP˜ï$0}ÍÚ¾ï¹Ó-ù;MÊÍn·›ïcÏÓ j¨m ÙnÛÓšT©šL¡h¬,Õߨ¨½dþÝÉf– ¤ŒÝøœÓg–ƒ¢Š9÷Ä[AH÷„T¸‡Èè½û˜¢m»Ùùé—¿üú·_ß¾¨Ù¶ºº)œsfC.Åå¯MpÍãáûþ °÷>çT³­÷Ǿ72&«fÝŒäëë§p÷é$û¶õÞ“sìÇ»Ùý1#:AêÑ´WƒC©}Ï6‘|NxÞ ª9ZÛnÛ¸?"&ƒ.n–’]NÎlë}ç(IH·¦Ù: ªÐ<•è¢Á$(=IÂÖ·l¢E‚ÌLsŒÇè} gëÍÒn0nÂ5šN!j nó&…Y¸áéE¥ò†.оµ˜3˜yûLÁ@2¨$Ú6MDT¤/Kãb+éážúéÃ=Zck méÏÍ„¤ƘafyÅVÍ‘Ö܉‚éSDL•¥PRÍL›¥Ôk ›•"È…è@´›ª»hk"ûÌË9oÊð0k%±«D¡î³¼ÜûS†ìý†Ý”pY~œ-"hÓ*ÒÉû¼*̓ƒBL LѾŠ¥«fj&M{ø˜õd€%ØÈ$HE8" ´‚óñ'Ia2Xîû¤‰Ìäb”R¼bÙ` ¡¦q“8¦Ìù$Iz–žÊŒ',útdq"TT©¦©Á¡f“u6r«©šÒL©¡TÉ*dK ÌIvIÂZYTÔT-$ªNõô4—5}…L£å—6ˆ‹ˆ©ÀÄdkÍêMIð¹0‚*I—²’ÞóycHÝ,Aþ‚Kï$A5í/«}b #§y—†xUC]¬´(×­HpÙi—ðµV€KÆ7C2Ab[£25õÏ!¤Õ2‰³® UÂEÇ!¥MRÅ ! "«#"!_¹¥—Õ-P{P. å²ÛJïT^áðæf¿V“ç‚vãîÚê)\ ‡tZ; ³Ì<…᤻D™$N¦Ìeš`œ8S눃£^ò±,”1ásFZ¢õøÄ–{Y¯Ë‹_F©ƒ[r\"Y‘~ 'NBÐÂ;cI½4ƒˆeÿBe™ÝaV»è$ æ%8—U;NŽ‹'–AÓ #ÓºérѪ ‡6°™ p<A ñàœ…ª©ACy‘J„ ¶Xó —™ÍåŸS˜… Æ¢WÕ©UïRÌtFˆ"Qt§-œë’FÝ5ÄÈ@Vå®!XÄ”P‚Aé~@_Ö—/.L ­² ²¢Z‡›ê;ªúÀg¯jYLKlÁ¤V·&‘Áƒ'^…³É[“:˜$XñŒ8äRTðp\ÐBKF-q4ÚÖå˜ðrŸðƒ¸þ¨r?«Q7Kr2·ËË"¤R6Uæ-ÂýºyÖ>¿ûÈyÐRÌ´ÆU"œszTMÆ%/pQEN@2ÎŽe\ùDRËð9nȱºÖe¹öœ!Å¥¸tM~—¾È¥—ñ¤‚Î%{ð^Sç)Ds™ä>ªü÷‡É¼—埾ú+|Ë<yçÿ7è~øø¯ù ù>›?¦Ö~L!úÐNŽÞÑo(¼UüJ¡¢ªâyu0 '£èÇöu\7“©‡ÀIøðåð¹šø2X›£Åúky÷£÷ªÄ€Ð鄽øù/^n~4DZFä?ºñ½ŸUê”l‹©äå‰ÞøF`ãïà ýöû¨.øö´_‡+¾ú%øU|ߪü[>"^æs?ö~üoÂâ%_¾f\öOãØEíg‰ôKR?"I©¾ê13¯ _aPª…÷øºKjíŒRó€Ã“\²˜—À-@ò6×L ³01Çî/¯·OýS^3îÕ#‹¬BõñxÜÇ>„¼ÝnUÕ9¦{†°Ö¬)ÉS¡sÎ$‘ÜZwŸcú/ÿòßþòÿý#Å}PÀm›Yø6÷Ù·HÓ1fƒÎjmKmD)¡‡$ÆÊý“ÌönÓçð¿üå¯NþôùÓÏ?ÿbÍzëÖLiÓ}ÖAJë#.Iœº®Ë5¯NÓGö½t³Òo[Ò*fÖ`D8]€}¿wö­ukmÛ¶ô¹g¹‚Ï9ÆÈœ™6UUuÀç„*5À*n¥vS1Ä¡M›ÒÒ0š¸žüï$€¦µÔIt z¤²ÏP ©øœc<’RýØ÷Özo‹fÚìHk½ý¼Í9~{{+6q¦Dò¡ª0è ¿ôåÊ>wƒEݼضÍÌæý‘š¥Ë7Y8©Ç㮦¥”¬ÃGD„ÿþå÷ÛmÛô¶Ž¸UÆ*¢šš¶>} ôñxóðn½œþ" 4Ó{,äz]ÙÚÛvÛn÷Çý¯ûµµÖÌäàE”‰W. j[±zÍy¡3¦ÖÌ´@aLƒ,¡æá¤˜évÛzk‚Œa°© š;YÉ‹ˆp±<és¦K6Ó RK,ˆ»¥±@’¢ù„©]& êr¤úXE’WÎý¸ˆø¤Ð¤Ü`εc­„LÙ‚ááɇ"=¯’ ¦¬Œ¬ÿk-§Mîôœ-³d•2 sÕUE…„qÎHvæçº°)õiÓe»õ}Ÿ!H´†Uez6ÓIËM"Y„ˆg£Žpú ɪ]Y@ át¡®Ç•À¬<B’JNA'¡¤¡:DK *u:hAUF6g¢Ì— ×¥8±þC‚ ù@­®¿ÕóZCJRˆXk‘9ðLß·qYÄ[ŽK¤Pˆñ¨ÔÌ•ÌÕƒp-0˧a1Ê$¬Œ ÔI85uºÍÌŠ˜kfN˜ÀºÁ1YEF¹Õ6ŠlMRZAý@¶€J‘#Ýs7«L¹™Ìaüˆ®P;œvÛ IDAT¤éiñ£°îJ&ú?_^àc{˜î•Ó»#¬r‹‹PsPãå,ÑÈIަ"YÞ¥¥ª"­õLâ¿äŠÜ™#4¥s=e© t1bU/©1ýÓÙ ºLÅ‹ž­BØâ¤ˆd"jY‘Œl*Öê'x¬HÜú”ŽÍäÉAªaIµ,,bOéõA5E³\`!uBYÑCb©6“ë“®v…Yb”„pµÃ¦Æ“ø'ÔÄB+Ê$ÍöÇcºç­|êÛH’¤)5ûÖëÁ¤<àçéûpÕ$)‡]k~™ÿ÷^ Úo[Ì=™ü²®‹9G»r˜ÓÅ7*q"Ô""¢›4±1Wx®¶ xCÊ?´ú4Vë\ÎÀ–áʹY—Ü¥«òÅRV dø©øe™nÍß9¬iŽg/+fy®ŠLÎë ÂdOå³r¥/5„µæsúB†f4jg¿ÐLç9šBµjWʱ£•zOž-zX®»ÍŸþ*þÐã‡år~Ó°o1?¸@>|4’“ïG|Ñùêâý ð'A@ÿ GO1Ê“ÞÏgÇÈRàׯ±Ê®ÖÆÿ"ÿ×—×\[Ÿ²A¥¹'…%Ïj—&û’ìar¼Ûrðlä|Ø^Ž%ë±Õ ]iAê‘¿äò D§Í­~Ñe9Y“ á¢:Çôùú•)ôþ ’çžpàˆl=¿éq,¿¤>^à«E†×rõóü`dþ$-D´›„‡‡½$ý§T‘ômšªWk« išî½ò®Ì¹bˆÚTIo팠CUÑ„NÎ1иžT IöÖÂÕ8A6ëYa˜|äâ6”$YŽ')Ð{°I"\Ü)ÁìÔåQÀXIªjkM(ûØÓ§©«Ze‡)+ 5dͬA¸¼Ã© ‰Ä¶Î q÷¤úè2}Z—ósÒ3õùˆpÍf­µ1nj譹÷dã¬t‚Ìp¡4µÛíÖzK.SV&̤lóÌ&宪ímZ±|Úc¾ùœ¦ö“ÞŽóX¡êI&‰ÓÒ?Æ.Š*(“O—E¬N6ˆÏ,•¾mÝôÅæƒ"1|F4S¨n½‘ÜZ×›üþö%cÅJBBŸ I¯`Ad»½ômc0"Ë©‰Ö†Ïɀ˥ ±TUõåöÒÔ‚ñxìsìÒnS¹ú “¾Y·ÞIš¶ÛËmŸS€¹OŸ“Î’—R ç!?$$ ÂsPöÇýd//·„™Ö[«O65N7ÑÝ=Ü˶¨µi­Ñe<Æ|Œ„6ìcWÅËç×ÏŸ?𙽾noo4 !²Ì/ÒU]$Â0»E<0n"n}ß§6UZö]jöΪAü\«Ì /ó¶¿ýõ_ÿg†ûû—ùüùçn6ætFLWkUàêMÕZ£0ÂQh¸÷v`FåÙóX®fÖûƒÓ·_~RÕÞ¬¡Éã1vßS©Hs=U[ëý¶™ÚëË‹ R4ٶǾ9˜€Õuúi–Ű²uƒ¶}îY—×·s µ„`%³˜yŒ!à7k–öÐPw ùÄHûµ.ˆ–„"™]Ú“À#î1Ü[ï–ô@ÕZk${ß>¿ÞDØzSkÄœPL ÒNï»nˆ²sæ¼a¤ÞJËU¨Ï@_glF³Özß÷ýñxlͬµœ ż!ò¸I¢˜0Rš”x™sï­m½%ÜŒBSKöÚñ²¦W¹®cî§—SìÃÃÝc¶È[q9Ͷ¦¹'ë)²¤ŒˆéI'j½u2\Ò¸' 5¨“"‘³Þ,ë4÷EÚšÌ)YŒ©r°ÆË G1aŸîˆ´IZVS¦Äç$yZë©{>¢=áÅAª‚^¼c\ÏYÌPت•z«pðb"b8çÌ+_l‘nêsˆ¢›‘P³r­«¸Y#ñTGÔZÂúwùBšˆ©ÎàÜwQ(›ôž98аiC—A ‰ÉhHÞ‡+%©ê€ó¹F¦£„²`Þ!Ô*FH @,€D"cm""jæ.0”ÐÈæKÁT!bšÒ“Öý.þ+¿·ŽX8#åyWxÑ!ihZ}B ñðÓ¡¢ Ç%i¹õ4inSÄz·†f·#S*eMÔ¥°ì’È!-勞ušÉ~„‚*Jä:Y:ëgÖšF€N1E 蜻Dˆ) žÅ¾$(´d’Ô/‰Ï,Z!+Ѻê#™È’R©{£ü ‰faL ná”ééÍ–ì,™7mkŠëç¦$^UÅ^[m®¿PuËÄK‹±+ Ìâ]äïåô¬ªH›×ј-@J²áˆ8=/‘d¿% #-¦ªëj\ð&þ^—”AM_ƒXÓÖ^-^6È´ç»9THÑ€êúC ¼§ìYõMÞ“ÕuIÿ(aÌà!š‰hW ™î3q™Bhr×gšp–†AE—¿‰+(¼6£ÜÇ\:lŒBµ¶v•[x,2šf“6JvŠ®ºøñSÍ®Œ†äufYÝî œg­e™U®ÛD]‡Y¿°ò¢„Q²Ë"7œ„pNŠH)½­ì@æ4¢Âc1qé4M?ø± ,S*?²ðq|RØp­²Ì³lÄ^¶ÈÔÅ(¸T­v:Fä“kY=°ÆKõÖT–‹ÿZt BlÕXSÍ4´¨Œp\í§57+tçq\-Ý „d_Ȳ¹B.ò¼ÓS¨ØA;“6KÛ^ÛÆ¢›Éá'>¦}ùcâ´¨-E;–•¼Jv•Œ£Sóä ‚kmÝkÞ²È&bÍT3ç9sU¤”/¨Ú„nPò«µkr™¼,EOËT–î,G"…âiâ“éî ùÔþs =O7ÌY­°°BÕÐCˆµŒãI¨Lä³ÖšF¨lS8°²¸’ù¯ îz©§Ç§½ñ=F@žÍ‚ÇTâkPÇ4w>‰øžNÏïèƒ?ŠÓá·…³ïÊúïá4üÈx~M1ÿcÌ70ßÿ-Ý òjá«Ò}pËòÏf-8ÌòáÕóÔty뾉ŸEò ?û‰Çó÷ü«^ËZ–¾ €zúÀ¾£À7æ9°çäJœ&kYT5¨!óñøòûoû/}3ÓÇ}ß¶þéõÖZ›sîsˆÈSºxÌörÓÖgwÚ£†»'T3néÂÔL{¿õnAy}}ýéóç/û}F˜í¾ë¾ïévÏ.ã*WÈáGf!Ü=èÚA‰ ™½Ün[¿…ÇÛþˆðü sæÙZMÛÖ[kcŒœâˆÈ>¦I³n?íÃÌš5'o¯/¿üôSoý±?ŠÜ@·5|iŠªîN ÞšºÃ}î»6k¤JúX³ÿVÞ7Scä2dÚn½µ¦_Þö¿þåoùõË?ýôÓ?ÿóÿùËÏ¿ 4Tqw±Æ˜îN™"BÕ~úôéþx¼å¨Fb ofT˜5MƒFƒm­}z¹ícì{o=Èý±ë«2dÌ1ÜÒÍúÖ{ï!dSK·o,Ý>…­µôz²-Pí ÏöZßšª¦uL M{Ý ëffA¶x¹Á§gºEÓ~.Þ[›pJðîu‰æ<)‡Ù(Oo-àsº@ ù ô’-3ÛÝ{ïÛíeº÷fˆD IГ¤T¶½çÀ1Á^ÿà cîs0‹"²kÄÝ{ïÍì×ß~c¿mÛíöšÃ¸ã’½¾júËçÏ9»]M€uzÄž€©JtÍMí0'W'Û3 5§ß÷¡‚1‡BZu38Y´ÍšB]ʈ @ Š™Íé—c0Ø{÷Ⱦhæ ^¡bE-ÊÚÝG³t:ׯÏTÍ´÷žœ (Ó…ôãÙ›“µ†AWÅÖ,OOM Vfò?—_ÓE—*Yí ¤š¢7xí?á ¶K`FLŸ¦1‹9­Á´ìœIxVfxÓâ-j€IŸ€ºªÊ`”š,ES5-$xŽÀÝ»·Œ˜S¤õÞÂgX“beB%Ùí"P5S0Ec ‘1 9ýpª¦—Y×ÌTÓxKeòƒáL3v¶yC„ ÆcŒbÁyL÷Iù:f¸R{kbª*s/öøĄ́ø“ Í›’â£ÎRÖ^J@º‡ò_U<½ï9΋ei<öUž g?ºÎ…d8n·¦sµz¦È—SWƒˆ¶„§×c}™W£l#1"(*eêOäS²¤Lêp†#׆#Þ¨ˆÄÃØš)¨ÊD#ém(êáqŸ¶¶¨È£‰Èð@pJX"®pàsbñY*¥’K™«ýº™[DHWému¬yÈa] \ò±Á›˜¡zÌXÙ…Î!öM„¦z,‘N“\ë¢ U˜§Ÿ«iYª$×Ëc¬–fÈ" ”ûXkV1sgŽ BUT­vÅ­M›éA• HL—é¹./íôø­ T~´Oè¶u][|f)º3Ê0Î5ì“™0&ìžFƒ"‚å"hk¾µÀçâh(®Ý`sÊeY*Êê\‰uÖ2)/GŠžÃÒ& sbkáx2;çC¨œï'ÐdºHÌšä¤Y³(G@Î¥#/PA¬òå"‹Sí I>—ˆcMâ¥"WN¬r]­Zð“ßÊx¶(þsr¬ à ]‚ÂËÉ- Èt(%f„šµš +M$ d\ øG¾äÈ{CTÄ)‡¼›*­vù¬K#}ÐCó1É lœ–Ý|8gVÚ¥n·(`…„Éq€(d?ÏbªG)®M¢™³\Ù½º²C ×sŠt•ÊŸd  X¦øU®ËBŸG6JEä Žæ¹ó žNå<‡‡œÞÿÜã­ó¡Ç/0«]Ú,)| £¨!u‡U³3”"1䙵hQÉÀUOpaÚ"ÄÏÓ»:äO—_^Æ8ÿ$qk{±r¯?~êÊ~ÒíŽìÄqÞ¯‰cH±ö‘G”ú‚88>¡S“MÖl.ŠïãÇ Ã¨œü¦}÷úó!¨¯ïÜðé?`¾|ÀYø“Z,Þsmø-uoÅU¤²*™ŒŸU™g`ôUQ¾šN<¹ý/ziz=‡Á¨gð· %‡cw©fgpñrûOÕ~?.9´/<]WÇQ þ,¡ò¢¬ƒùè‰s«ö”ûᇰz%>,fþŠ`õ‡ã(òcìÏ_K?xÅÿqRï×éü]ß„ÿæ×ðñ8ïÜ÷¿k€þÖœæûÁÏ© á]‡5¾û¹â{ßîÐ÷š¿ªòÆGŸ/¥ã_/õõ\‹òxÚIÊ“¹ê£,hëôgÇN|mKXçº2jf3³ÕjÅÎKg-•²¬r¸6É™4<jL8Ê ìùmÒKƪ" —¢Z1'&ðë{üyiòiôÒ¬t‰¦û }x)ßߥSñ’調ßBBÌ ¤(«ª°;å³ÖÌgEëŒmJÊpAjå½Ùœ’a<è…H‘ ²;‘’>/Qœá¦é¯/ÄFa[³±I5&wß_Ú‹Z±`‘ípžy(ÐÚ&>çþ¸'÷w^ mÓ¥ i%´õ¡hë!òòúúùÓçés‡Š™-‚Yí[ðÓ##”Æ—/¤œ*ªIUÑ•u.  "ÖÚÖ{ë-‚o÷Ç—ˆ=æ¥úJL¡@ªÀ0›c<÷è½µÕ£T€XŠˆéâ“lAÂ=MFŸ_>}~}ý oãm®x2ChuÏ™NêtúÎ9ï÷·ÛíeÛ6çÓLU#DIS¡'M`kÍô2x=Ï—«%•Ë»Scë]Õ:Ù[§DD˜êô9{cò·ƒª–L|¬ Yšjk2Æú>ÞÞÞD„¿þš:  _?}ºÝn*–JÌc‹DÜÝ«¾þðTŠ3†¯TR4¸ÝTö=TÍZH0냀ôÖ^âà¡möqÛúÛý±ïC¢l@<œ:9øÌîs·a)¨j3Eïh–G[¨ÞÇÈtí fqòu»Að»ûÖ ØsÛ^zß8ö}ìc„Çcì“ðá»Mˆ×ÿòÏû_þלsë½f—‹ES:Üw†§µÌn½0§›65:BNÏW÷û¸¿}ùòö{ëÛ¿üËûüËÏ*ò·ß~ AŒ¡jÙK±ïA†~ª¹š}ÆHRSÐyëÛÖû}ßè­Yë½µÛörÛÆœû>Æc 5Ý}B,¡ùRÔnf}Ÿsš™«ËB±OP^^^Ž‘ùð¹Häý˜žkY߬bŠŒÇ °÷6§Hjtiíp¹fægÂsz”ñ‘>o_Þ~oÚzëé sª!/UMÙc œÑ¼|½±1ÇÈPÍo¿ýíõõ0íB߬ƒ„™ZÌÒ§ÇJiÅœÓÝSµh­™Ù­oÎàd„×0F)–¥ffÖûÃû¶5kiÕ¡¸Ui‰ JIµÕ˜Zã Jkˆ`Ä>GžüÝJkM 1UÀĤIsŒ5ñ35Û˜AÍ+P,4búô š‡C ¢Ò¶›Ó‡®UÇ#¼ X­µA 1#k]ª›Ú5]ä€B§GÐͺ© `Ÿì9a‰4¸[r Ÿ2-g¹Â «,©¯2òDW‡:Ñ"<ê¬tÏ R‰0 K‡Šº b›Õkm ×A±ÆMæ8»5=®G£u:rCu÷8šµó¹Lq¡ÎXðl2ç¬)†€À˜yC&i> ×ÔLX˲i ‡„†Lqµ”L5UQOVTQ¿AˆÓeD]„ÓÃgÍ•ÝûŠU¡ÓO¬„‰Y¹BóIqŠ49úwS$ó*å­©¸A  ñÂÐäp¼HrÄ/ "jØšåL0â˜k®ýòE¿:Ýx ~sÔŠV`¬xòË™z-§ŽR¿árzSÉ&æ–g!‡Òâ]¼ ¢ÕLQ[î¥dUY…ÄjuVÝl7Šu™3D#˜Ýª–õÑiR ™ÌØ!Ë×r g•vÁ£8ïÃE^ÎÁ³éj8YÊ«UÚtqQT’íf9¢¯½Sƒ ÂKQÄñ(©CÉRñD"ë•“0^õ§icú2fn™Õì’ dT 3cÌpZßZ“±FùS,¬O'Ê]½¦ðuÛrM@Ê |ö)¨©ôÖR6Î¥AtMˆ*Ì|¶|¼ú'Ä$’œ¦PJ5×\ ]H¡êÉRÂsË…%ÄVüBNz¬\'%U¬Á•{ýuÜý(C œƒõÐÇÕ8vØÄªGõd„,nXÀ,"’JTG<É 9OŽà”…©D’ß¾’À,(ºp_Vwµ\Úb…gŽ)Öé{Q»É·ä6Ó ÎçTö9¨âõmâIàBÝzÕôw$«¼:—¨KÍ^,rÕê)"×îtB]È»zÜuuyžY†ÅX*@“)`–s¥KßEÁ‰ u7=ªxi3#fð]ÙUþÃÙ‰}Z4~€¾€O½Ëª-Wï'¡ëªˆçô¦±úDk)Þ©y_¨•ç¯w1Óâü«¿á½RpxUÿ¤\…'‰î»ÊÞIéצÙïYOO!P=pE†mÔÅ\<ðÍôÀ_Ç,ôx*ô}B‹ŠløŽ~xP¥ç¡À¡û/³+¾r Ÿ³£'͇20žT¼<þ¸¦ßWøž¶Û…ã^ÉßøJEMàÇÒìÕ«s)§øÊì}Žx©Cþ,„+Ì7ðí\ÉÇê?¾Ÿdáß>ßçáüI²Ô?Zªÿ‡ûÌ¿5&“ç;—O¸ý˃›°ðÏ bøÕ-ÁËÊôþÔDñ-)öO¼÷ÿÙjà¯\#¼l™ò¶?¼…ï'(OŒ³ët¡ Yu$d:3­Z+UÖÉ.FNºhVýJScœ…•“,Û…ˆâl–Ê¿Š{$åû•;(LÈõ|tæ£ò[¬-²è9'`BðÁ‚KLB¶Ïs*uåº*ñ­ Þ¯nô ž©Õ Cø–v'%bIÅ$5U¹|ܤìEzºtÓnªSüHXtŸBÂÚQ§K!ÓõáNU¢¥ 2‚,éœPSk]}9æ´ÞŠ‚ªEéuôUl¦C±Ï1æ¬ÒäJŸ¨¤šÂÈ"<©Í9Ì&BWµYßúÖ[¿Ë#á·¬•Á¾|ZZõTdbj}ë>}ú”)j“"D¡’*ZæXÌR½5JŒ}TÐ ;!­Zî‡ç>]U{oH&ïÓCƒùNдLkú}îùË¿Ž±;1kïKL:[kM)˜ÎéYJ¹ÝÆã1Ç4›­5SuO@“̲,K¦*"sŒ(xq®_¶Ûí°‰•“Xû¸ûl°D0m½‰H6ú 9=æ)Xb­õj ômnÍtŒñûï÷9ç˜ó~¿§(,¦}Ûn·›YóLŽÏ¹ï{kA†# :ÆÒ¬A«ÿÙTSžiD–”RDƾÿú·_­Ù§í…Ú´QÌbºŸâ\yi÷Õ ÿöå­™Aå¥o2öÙÛ@ë®cÌ1[ëzkض¦–¿µE¤…{ÓçÅéž £ÉسµÞÔ"âm 3ë­CtÒ}ú ;‚sT5‰šŠ©OW™^l–Y‹U§íå 4¶0×ÔGæôxÌñ׿þuºÿËýç×Ï?ð1!Ç}l7™s&ì‹gs~¹ß åŒ`xãí¾g9­*8ƒäû³µáË*I[úôúÚÌÞîj(]úô<ºF¦¯­qt§Ï\4²¥×¬S]iÝ}ø”­µf/¢@8BlÝ„’æ.MÃà.´ #‰é¬z­èƒHî²ÎU¶mswšÓé)£§W6ÕÉ}óÑ[/x6D‰¶5uðbUú\Z;J8GøÞÓ®ª9ZsxYüJaɬ ´­ùð0S˜tŒéáP¬DÑ›í£¸ á*ª1p:…nÚÄš$2`á ‚RÝJдsò(]RdÏÃ]DHë2½Ri÷ÐB1jMÎbæ”QU'Aùé(PØ< Æ\ š.®vJWÐÈ) H ‰»ŸçàBdLnZ]OÙ8:É 4‚ÙACú˜4+Gn!€ÒªÁŒu(´æ e‚Á …p5zÎñ½B¤1–I™®â‘ÔB€ž^‰`8…ª‰iË:˜Á@S5duÃòÀï{mT©²ñR"ʘPµF^[¯,-¦æ(“KƒÏb•|Áfj•¶ŠÇ¹&Ô•{醄„±0–qr3’ëWðp-6°.ý÷ U—u]˜·wDÅ«X‘o=A «ž¨¶®¦F@ZÆX+(á ¨¢½Ál¡¥iÉÒ²µŸ —å!€jÌã…^I KOc™wéÎjiEÆŽ)´A= IDATúâ´‰T™PTÛ™Ò_#PMN–c·|—J\À/^ÂôtI³HQÀŲÀf}ø†kfx5T²XB©bjf–ó÷C Í|Q–ødÏ×pïjIfaQW H³&Ö ‚pEóC„æ´H…3‡éb$Msm£f+Ô:¨%Ã>[ G±„g•Æâ R D+®%ëù'‡K¼´P2èùKž!‚‰ÜŽò€É·Ö›"Ç1¬½}Jì”z /ú#(@ˆ×Ôf¥ÛaËpÏÀ8D¦Ð, D=ûj‚—C!À°¶º‚òYžðÀw¢‡¸NÔGü¼î-\{R!§CYä:ByuÿTX¨lX9î=.”…°"péò¯òZ‘ö‰Wà8BÞ9zã©YÏ„øâ)”§[˹nV±úb Ô±‰g‡x}ºjr^ÆŒÜê,œÕ•šÂsòxlIÏTþËsÞŒWðpZÒÊN’ï´=ØÕUmöäfþŠM œ5.ÅZÄ©ë @»OE³±ŒLzLÒ¿5?t´¿çç¼{]*|ßå†à÷ü½œýnÚïõ}â¡øãß'îÂ;²óóàO ~ßýͯtÈ+àOJ=OèO5sË1‘ýô,OÝ¿`Î×浜ò9Ÿ€§Ìrîàd/ây rÌ(—¾éuíñÿM~>?º²ÞæG 7Ÿ‡|'XòÝ›ü õÿòóÑÈâÃXÁÇšîw/ª4þãÚŠÿ3ÎøM›>¿5ðzþÚw8•<åwââ;¯˜rPóïåÇÿ¦ñOAx1ð2 Àe˜ÍÃÏEâ[VäªÈc=€”‹TÈ£0,åÍwå —¥¦L” ÚbûëÛ2•ÿ ¬CŠ‹ëá2e?Eý¬S:5ñ¸²zÒË»2µä™;¸ÂŽ2æhß~¦]Bx+vy¹}bý·^†ÝÜüöý÷ñ‡[ÛûÿïÿÇLMB%ThdC˜Š"’H©"MµY¢iª}ëWâ¡ût ·mÛú–Šž§ÿWi‡7T+`w˜J`YjGz¸©jËöÚH#'㱓̀²ÕkÖ ¦­5(æ˜3e_˦^p¡X•Ö8E/Êâ)—c˜Bá\~¦”¡³ MtEàS%ªZ[ûÿ<³ê±é®“#kÛšäÓÝcé±Õv‰j‰„µ­Æ«;—Ûm33F’’œûØÇȆR˜~úô‰ŠÉ¸œØJªë(X›däÓm…5¯éyž9cš²•ôتZN€ HIwŒ‘¸õ㌑½¬ŠféÖUSkj¿ßïo÷ê&%iªÖ2¥KŸþØõb"„,Œ`”tv°f¢ÐÞHÆNÖ’Iƒ¯¦¹¦fÍruæ`}€i¥^áÙ ™îâôí‘Y€Çã>Æ`àñØô82ˆˆleüŸÿú¿ÆcôÞ^n›š™ÚmÛZodȘs£™)”Çý\vÕ G¤nør{ñ¶ˆ2bÌPôÖ 6Å›š63XDÆ2ÀŒœxD0luËaQµf°m³´®­6 ÖNN‚üÛß~ÝÇŒßþö··1~þéÓÿ¿þ{kæû˜‘-0Ó,¡MÔIk­o]w÷étôÈ(±@ðx<î÷;Çã±ï3fxẍðpg¸7à¶m[ß Ö¬0Ê=©(Hp+ëv Ó¢™¯|û>v_7\–$GD‘¬)mkÛÖ3šžx·æ1‡Ïé;ø }yÚHÄ‘†Re°›¹³¬pÅç©Ò8¨©X&!`FÒZKË|.ܳð9ïŽéóq;zúHÄ{fý·¶¥ÆØZR¸õ '´Y3³ß~ÿâs_kz7S•Žýafí ö_ˆ Õ¯[}éQuJ·ÅÎJ¥ðnÉêIŸê"§¸á AÚ¶Û§OŸÉúòð$×0±m·Ï¯/õQR2Ûáž°¬Ô´ŽrƒJ:ø$˜óج]Mð”䪞-ínîž&çt|{&*¤¤L›.ãï‘—ŠÄc÷ lM ð¨Ê\S3­žùÔS ó S@|¸0Lë €‹”¶4kIæhªÍÚÙ5íœ%Έˆøœùˆ\Ç÷U9dG‚Z™‘“ ‘Zþ¡ [k²äQÄZ¶µwÍ¢æÞUa %QÕìó‰Èá¥UB©žÆ-«´!Ÿžó×¢j3ƒÍ*llùB7,‚„&ؤ/èE7’Þ46!"[7•l PÚ÷è‘m‹w­Õ"EfÃÅ鵓Hj¬^ÛSâ}uÑg!¤bÌDò%ˆ[Æ‚æÇ/«ÂTTÕ€ šÛÃQ['Ðz¸§äîű¤øœ‘eèTM~âôrÅÖYþô>‘ ¢u³fšWµJ]ª=Dz•'Tƒ@Õ%ûˆ–„]Sô–¤éjíÎÿ•µÊ©±W‚>§8P5Õ¦[ï½[=«Û‰\8ݶ]Õöìõ³±¶ÌŒÙ”€l…X^‹oQ^À¥Ç§Ë º÷Ä'*äØÛâ´ `¦j0ÍÇ=V°!1&ÈýaÞ gò!wA j„—áÀ¯ ²Å'ÎÞNU*t5Ç—ðœP´êÂÅ ÌN¿f,¹Šœ,†â8êI,Õ*h†Ék¼£nŒ¤L1üäÅk†JI×̦.…&¯ñl¸JBOz˜}ëR“Ëün]Ñr1Ž~w9u kµàägú.yÞ“É,‰ ’xÄXž1…Z=­¦g¢;Êz84s½ !¥e ¡Z®”À#ÈéŒðcØ ·BÄjzóWYK®ž¥5+Lr†y¨Au¤¬lPýa>«ç#>s¼XКK×kâ™úȹ1.¥¼"B„ÏI“¨¶ÜÕÃ@O ©4­ç©bmï]Â%Ö /ÓÏ!¼­«V.ŒšzŒ‹\'­Wcq>ðÖ`5ÉIšÓÙ³Eà”)¡–Ý"å¥åKÙ¿BÌÃ%/‘»õ_-8WÞMÝRùˆÖ¸Cª¹™ÁZ&|Ë»'¥é×¥¼^ÏÑ|šÁ¾âÎ^ŽÇq4K\ÔE9qt¹C8»|ÏÃ)ÕB®‚ãSwÜ+§¸zŒ¸/}z\rOøŠwŽ}œ:B‰¿(2AQq®Ãåã;Z‚O] ^7p5‹e·Å{¸ñõ¯ÿÖê74>àÝÔô„v| âÇD?|ë_\þýηÅ鋸ðe]ºð×<Ù÷åÙõƒ£ïõ„–ºúµÈ‘‚ó¯]B×Ïà½ÐŒu ñ9yð.8# +Õ€ó¢ÉGÊ1:<;Ið.SÂËOUyšß—`×òC¹~@ø6Áæ›C(ù£@ÉGŸ%H9ÿq‹7¿)ýÿ8ö‡t—ÈßõþAИ?úYøÞ—ã«?ºFV¾î yþ˜øoàùæÁ×>üÕ>ÐWñî×ÃßùvþÇðíW‚¯Ê=p°ïϵ@qæßªóTW“ždQ\'ÿ—ÕøZ’wYQO]KÌñìD­†—꜄N–Ñ_¤^òYM3ÙŸSùúsÅ¥·&…Ћ¥@q¸[*KÞY‹¡ž`\³[àS~OÐ9ž¿vè²yœæÁ ¯ïžÈ×LÕ3­1RÕ ÅQszLt Š{}ùd¿ÿþ«bk­¥…ùñxK‘(œcÜ3£Ù[hô˜Ó] “Jh¤ä{LÖ)–ìfÖ ª;GCk­Ý¶®*û=¼ÔPÖžÒLÁ­µ…Û!ÛË !>gÿL›X•wš"¸ä™‹Hï[¾-ýQÈæ<ÊV®•Œjû”它Â(T'%LÇ‘%m)3Pá0¨âÓÍlMðµ÷¦P¡Ý}äu–†•ÞÚÖûØÇcŒ÷Þ·3T1}Ì9ösÎÛí&¤Y›ÓaZ¨Gž$OþÓ'E,uéˆËüC•”àcäÆ¿¢ ÷,:®3ª¥Ù Kg AÍٴlª0˜i¸ÏéÉÐÞÅAÈHÀz„“i\cð9%;cÝ»ÙÖ7}-ÈIÂ(ûq'“QeîóÖ›ª&$« SQ /6“™íyhcA<«äð”…Ï7y{»¿={oMÈô‚ŸG &jøåå—/o¿ùíKkVͪjú²ÝLmÌá'1ÆžÇæ1Fzœ[ëÛÖªÚ<âþxä4%­^ 5kEÿ!ЛuOÑi6ðóÏñÛß2Ý­ÀpßLµ©xV„bB R”¾L7±fUYoîû ~z}}}ùŒãn‚X35mIɼSr–Zk¦·ûãžNkQ¡©ÜzßÇx{»÷­5kâô}/Û– ýív»É-ƒ1sÎÉÙ¬€¸ðIýÄù6ßhfK ƒš o¦ÆŠÏ „XB€Öào­%Í,¯%ͯöK †§Ô.õAT‹GÞ"Y~^릙‹-¹8¦šSÞF¸ÓZk=§GÖz3ðØ÷×——CªŠpUí­˜îñ¸ïqWUÜ^²-c»µTqÆ>|NÉé—GkA3LB׃$™<ýOŸJ(–Òãsº-®Ð€›šûÜ÷}NO^IÕ†Œ?%‡IªwƒÒm ¡Ï±{·¶m¯"9½òÖÚŠÑ;C ÝzKßd’èU-ݵLaM£ªkÁX´Ð…Ì^têÁ Ýt¶©„¨RÄ¥ü`i==%Mú RwŠÑ$Ò Ÿ_¸ rMÊšqi€Žõ}§†øSXÂõ¨5XKpºZQyTÕ.Ìlƒ„€ˆ2µ„Õ¸^À|VË2R‹Äd8׊¯±zd(ÀeÅHrkVþU]£r<»S¸ÃÚìOáh%™uŽ£õÉɧ킊œ0‡e^¿ÕåDö ö¬äf)ƒAjke'@Ö6Èè_™sª"ݚ؂Öç4·¢>¦3"ÖÜA“tV×$Ó¥K³)œ÷ Jÿ9la5ÈHP½Ê_Uh¡f!†"fä”>y¼£än3@¸k™Æû¿×ÝŽîbTU1ƒP¶œ[4k¸½lˆ)_àª>&ÆcLm‰ÒñØš¬üŠm }†”˜¤­™B…b.jlã˜Aš¢§ïF…‘$¦QÑç, ötW˜i7 Iç`íË@Xk[ÜîRÂ=±)}ëI0ÈW7ÝéÁ¬¡tOû’ßÆÞ£y rÖù5¡ó©J*›>g8§,òvò!¼NŒpÙ¶íh­—m  ­YË#Fä³ö¡A× Ö¯e@4¬©ª¤¾›Ú1@¡gí$DT›âåMÕ‡ßï_šµ_~þé×_óp’MÛë//¿ucˆÇKßæ±rk‡ùýM·Ö?Ú¬…¸A›j½ÑgçYÐcšÂZK•Gë¤@SôÖÏ”ôÆ% =;­ÝªM¥oîá.kâ÷_ÿùÿxŒçÿ°¦ àcì_Þ¾è_n}Û÷°5óˆ9ç￱n¯ñÙÌ"èácN ·¾H–1LõoŽð1Ü3áá‘iœðÏĈ`Æà°ÞóT M§¨ø¤Èt xËvªÈÌ«ýÓçŸ÷AúmÛ^__n/·Çþ8; ØY‰Î3¢"xÝúô¹?y°ÓI"j_  'ö^!”óþx¨Ù?ýüËmÛTííí>ý1ÜAFN EdÎyܞɢ=FSiNµé>zŒOƒÚÔ%@(ZÄ ÷)TM- QLXÀ´l&MÆ•ä2þ„ve„¨æV•ÑLƒW”5ÝãvëyìɲÒ·í6v ‘ñr»ÝLÇ>f¥oÛØ÷±?Úë'Uܬ‘¯ûý~kM{Û"²½l:œø1§WU¯“"±¼¼¼d`Fˆˆ¡jsz³ó‘_N@çô}û׿þõŸ~þiÛ¶ðÐê~ …ZV1ÇTaPÜ#—À9Ç_ÿòk‚ßLo[ûío¿*ðÓOŸ[oÍš©‘ܶ®Ú üýËïÇÃL—ÖÐÔ>}ú<ÆÞZúÝrÅ… ›´{ß¶Þçtž™¿2W©UPì!¤ÿRË_ÞVG€,-¡&"3 æœá:8£9XÞ¾ÍâÞˆëi>²@Ü•)k–xˆˆT•Lílkn!˜nÝò~ z‚Š‚DT905Îg_U†»hD¿Ã'…ªvk=PïR¬Ì¾IJÍb€¶fäHªw¸5Sª¶j‰$cSÛ˜>gˆxS±±ïwßUѬ%CGsªbBç>]M§ç”øÿ©{Ã-ÉäH×Í=ÈênrF+Õ}ÿg»G»÷ì‘Fœî®J ÂÝîYÕÎ ÏjÄ_$»:+‘@æfŸyúßËb ºGxH°Ïå‰* ðˆ>€2* UÉ«ÿÓº,jÇéŒô>g[wïîŽRlYŠZ÷@Q(ñ ÷è1VZ5K“¥Bâ A¥,›—¸IŠÛ"@h˜9$W9l,u‰¹žHryN¢0ˆÂÎÐ|u ‚SšÏѶÁi>,CŽÈÄã ©žàc7A…ˆ-ªˆ¼ír]KÑtÈwŸro%ÄÉIQ›>ôiF!‚Áž†—i)áÅB:¡š0­ÅÆÅIöîî‘·ó,Å¥Æq¼Ø¹±§ž+z^ÔÄIóbW.õ8…Î? E•émŠcPâÔ@†›„ó›Wˆ{â0B=/jùAæ‘k" £õomlôJYŠ!‡»À£œ¨»5˜0}Æâðx‘Ɖ"³+ÁÜšw›Èy<è<¬•ÌBs›Ô}žZN]PLUÇZ†”È݇0|XŽÎÑìÎÑ#¤x¸—ÉQ3–ŸéT†9ÒcŒ7V¯%UÚ«\š¦ƒAq¾Ž.[¨ÿ£S*´æžß§¢R¯¼‡ÙôVt”ëºCz“Yè£ÐãP¦”Ëv™*sÆë˜Qãü¹"b¦ù䌣’K£YÈ6ªVfJÅÔ¬`öɈ‰ðä›åñ:¡çW4‹´“*3—ôÇñQ±þ•’ãÊ4âƒ! ¡Ì.P¹ÜQÂÆ¦ŽÈ>k–D'ÆÄôGÎ#“<+j6² 󱞿(ž?çг[.Fr$ÙRg^þH7A9øûSƒ‚D ïõq…ã8Ñ{ÏhSÌtŤå:|’¢˜>î\ÁëÀð0ÿóD= Cúp®†–CÏÃ)EtZ Ý»St #ÆÖ¼HK³&¤K«ÄØ)òAKž“£Ë~{ú®«3Òê œe(žkùñ$O<ñò/r1/6?&ßðòÉ';õ{ì68 ïdµ‹©Oºò{AíA¦AÑ{˜SLG'Ÿ„ð@ynø=Íχ¹~Üê娣OŸ$‚,㪯"6ùèçåǰˆglÄãd÷/îÕ"øÀHÏ_÷à?ïQϪ®Qü ¦ç£ÿC<]¦x:þfÁ¿®F?”-ÿW;½ÿKÆ ü ‚òGâÊšÿ¯‹âø ?È ç¿oPá¿ ôƒ^íG*ÍܦcõÁs ‹Smápe_F)> |ÐÑ,ö; &`eF§÷¸…óÊQ{4È<&ÂìE›úø†ìãUo¬<ò‡POGmùæØú(×OAfÇ /”@|8ø:oVÞe6.÷í‡î‡Ü´§TJzêš(Gç(Š2SÓRÔ`Î&‚ ·æd´ÖÜûmYk©­í-ªƒð ³í*÷»Þ;„Ëí%šúB$Á£þÕCÅr;2QApìY* #ÏI(Ð-5#QÏî¨-­ï¾ÔšÁÕd^'Û!ÏkÖB˜£pओ¼ ŒJ³aqOü L‹b’¬Â#é=!‚ÀÙ¥™[ºˆ‡ Yn3„{Ô¢ªf&Œe© I˜9²”e­ëWù³÷~ß62¼õÄ›ˆˆG43snöõëòr;$¤$ ×RbÂdÃý~ß’³tÖ“)4kÓå›Yt@: ^XTë²ôÖöÞö¾÷èª66bf¹w×£ëA7 ¸»PÔ,Ý» ~:š~תbýôùSx¼½Ý»7(ê²,­µÖ¨Øö;ƒZ Áî]kùüó+¥.EM±X)¹ãrÔý]vò‘eÎhŒ“«¥@·¶ i¥Ó>¨«Q¬`ÕÁx€3TáE‹´Þ5´Þ–ÁYF×þv¿« üéi0o:ÓØµ'[kùº½w…Öš ë½AUž Ø`1¨{@ѯgP"I;ÓÌ*{P„ìí!qS˰4Å=Z÷¼Uõ誥,µÖš;UíÝïÛ–T^f# cªIʾG˜iD0ÂÖ%#/·u9 Åëºøö훀±íÜ“Ö’Ñ wォê­Um½/¥Pk¾‘û_êb5JóBU{4‰šú é óL‡9Ì„Y¡0›¦”1 4™ÉUƒrâ¿>}Ç•ðIR7Sw2¼íû¾'Õ€f… Ò[ó}ßo·eú»U µV÷íîîÅT /·ÜïoßßÞ÷µ.&ÁZËP(yFº{ë}FÍÒl=FÊ­õZ˧—õÛ÷WÙ÷{Æ"<Û¶ÕZT-â îIÒ·Üýõ¾ïÞ« ä} óýmïÑÚÞïo÷¢Ú#–jYoõóçÏf%AΟþç¿ì­¿} áËíf¥(̬–bÝ;ÉÛíVktß6+VKÙ÷ëí¥ÖB.€2úh‡q7sȪ#Ó‘7:æ|•öÞý.–îÊZç0O‚Á¥&cNj¶î.‹-Ö½ œN…0úÖB›-µ$p&èáîg„ÒC pC5ÕÈ,T“©a@ˆ{W+9QŽpD^°‘c0ܽGUM­Ê”5äìÞæù#zhÊÞÍ jVʾ·îÔìô.¥Z¾kÙ¶P«"ìÖ{j*aZŠÉžÉá†AóØ[cïuY`VM-'Û @önÁ CÕ¢»N¬Á—´Šo½µ=uX:aËô’ŸÎxfy︭f%èТÒ ˇnËJ­ÈÅCkºªˆ Œž¬Lô~æUT#yãC œ¦r Õ¸¬ÅÔ®0ä`Jš]ÜJqB@35³ódHªUl'ƒ ÓÝ-Óv󹡪¶wWˆFˆÈîùPöLaàA>:„¥®¡L†?ÆTo¶C}jÖÚvõ0}/u"]f6ïL!œµ¤8”÷ÉÄ>@”#â’µô¦§›väb®ø¯1o&BDO;:R‡Œü³KT/¿E¡3“Ôá‰Æa‚ÑMOôœ÷å‡ÃŽŠ91¹Ð°ÇÂNÍÙÁ¬6q<âÑãÔ5sЛëRdz’}ÊFYÛI³:ŠcÉž#‘ ²æºÊ€Rs))(ø˜Í IȺ솙@Â\?^‹ä H;À|6…;!@ç&åÐФ<$¹çôóKí†Gv;mÒ1"dÚh4¦Ì8ÃØÜ0Ó×ZM;ìÿÇÀ'<ƒºÉŒäøÄÄ»ç9ÓÓœÈ8‡E,Sh9È˽T‚‡a"¡´h2„*ˆ¡Ufå- IDAT˯ñ°uц° “;(áiÔÁ1]P˱_#=3Ù)‘Yú=¼gªÜ)BšÀæ®ìC;ÁÞÔ,z„Ä–w÷é\O÷‡–²H §˜ayÈ€ÓpNËô˜‘—W6Œ1sicÛ;,i“Ñ?eÌ© Ï#ñèÑ3S4ûf8/d;œOí|õÇ•¬EÆ\-¿¤ÙHˆÏ‰-—P29¥OâKk‘Ìù.ÒêåÑÅ-FüAç…Žßþäæ˜ÂÙ”ƒN Àj!D©rT á çËa÷Â3Ìbø¼pj剑œw¯khçÉð?ÍÜ8_ê<¼ê¸82/SŒÓC ÀUWãQ‡q@מFCöà>k¦Ÿ­ïWèÍ8ãÀãùøm…¦?”S/¥ºïÜú?Wð96€w”—_aô?¹+õ|âÙ·Ž ‰ò1ý™—%çœ|+ ©ú¡i‡²ø!]ù ½óá-=µ-| hT¶úAY/ž5¥÷Òÿtb<äF~Ôdù.~$9¿×ç?g€¿¥yw-žÃ'ü6í?ê<¬ïžg\ƒÄŽ‹xÿMÇïßÿƒI—ëí÷Gýü"9ëç´gÿ·¨æoR½³°?óxY âÃoiz† rY° #5qÉ|$Î<âqt S¸KÍuü‰ŽÍçF) cÀó>§Æóy©—§tƘŸ®Àãk®GÛÕ£aÿXž±N½º?Ž›çÞêáæsVe‘×'<]„HLgÏ8æO)ŒNùÔL“ÿRhFwñ•,¶›Ù‚¬º e¸·i‘O3C"j­µ˜G©”Zkšd „ˆx„ŠRsi•àxxаÅJ"‰Z¯LÉgq]#DÍêz3÷a+BÌ- ˆs9ĬÔe™AyXVŸMó&Ç^=œNH§ xÈÀXüˆ08Ó|z`žJõáÖW²»Ìê34·Ì¥Öœ$W2Á¤:#Ìž5Žz>J©P DC¢.XJ½­7îËv}mûîî1ÛG“rÚ÷]jmYo Yn·¤x'ô£Ô%=kµš˜µÖµõÖ½[@¡˜¥ø’m«ƒbfÊáÉ ªöÞòÃXJ‰Z½÷ˆvî5f§gĘä, ÷®jU•¦*{ëá¥+%M.â½f…Q¸)áòó—/Þ­µp§‡:ìQ—¥Ôª¦*aD)F(Jb¾3’l¨¼èÌsøV„Œ’j_>¾Ý^îÛæ½SˆÐ².ÒÝ#Š)4›ÏBàƒ—s°z±íwwOTxDtVÊÏ?ý”×åú²º{8÷Ö$èêóçÏAzD-ekB‚-\M)²ÜŠô¤†G_–—^÷ #zŽ(~H*¥MŠBHpÇ”cû •!G„¸¸„§Ö!j€§¬Ó¶­÷î"¨ÕZïK)݃!fÒ»·­³ÉZëôˆÖZZõ÷}ÏÊY÷è½›ª©Z-·¥šik-Œ#HU»ÕeÛv’É£ƒ&ûh­ K]Ö¯÷·b%^K­Ã³?Û ÌFXG¡žŸK(4i(1¶–ÔLPfç.9›Õe,ªÖ2È’í5i¿+è=DÆ$ 3|ÿö­wo½e3iïíõû¨ oÝß^¿»·eYK©Ól¬µÖ—OŸuV¦–R>z)ÅÞîo½;c3ӥߤ=OeŒXK¸·uU‘–H”9×tïÅà§Æ!‰ÄWhO€>×Z ¦ŠhÕÛ²~ùÔ_ï÷íîüãTì‚E¡½µûö¶Ý÷ÖvŠ”²,f/Ÿ^LU­üÓÏ?‹à¾íªúò²üùë÷·×·ðùܳÑ6lj­ï|z¹AðÕ½ƒÈm½õ¾¿½}/e1+¹ßé½Adßû¶5S5«qJt¶¶—Öc¢o‹š@³Ú‚"fÅý÷îaÀ²,jÖ;jE"¤Pê²DÛ÷î½w—1³ S˜&+² »˜Ö—:º/“—w“è¢:j<ÄEÄFYö}ÏœÓÀD‹ 1a§‡y2å uJÉTg±ˆ.ž­Ö9<ΙXLõçV—¢¶·½uß#61j–R® G.‘è¡Q/`“Þ;¤ÜÔŠ¹•[Ö{Œ´ 5«.=\tɑ曘&UxhfwÏfuõã¨eéÑÛðjKÄx¦ ÛŒ`šå"Âöö&‚ wë-¸‰‰SSq£…Ý»Ì6º4ËæLÔÒ›šˆ¬œ7»ªiaà„À²™ÒÎѦ Â™Õ éEÀsuÄ„°ÉéÌ’#t®ÿ- =œ}ÂÔ$—Cˆ‘:Ôc›@ ‰m)Ò%Äô ⦟—Lš‡à¦j"Ù^ Ió JV OG`~ ó¦ˆ.‰îD•£+b<ÚàÏ\d=@¯s YŽU.%†ÈC|"%%ÎñV gˆhû¨•¢Kž@H®Áî)iþ—RÃl]LKðh$ž^pÅÓyx¿ãÒr2AF6Bm0ß<´iŽÏÖî L‹*sì=¥‘’~‹ªYJÆqmBB0!ÁPŽòiDÞ*òÂ(Θõ¦2–ãi‘ã[l aYÉ ÇÞd|#³}€×bS¹¸‘Fo-åœÐO¿±«Š‰iWœÒÃâœÖ×|®q ¤Éœ3Èl÷lFþÑYàxö%Lã2@ŒÎ²$‹Kòá¬"âE-)£#?!4˜H塿OÞÜH- `åXQOg./a\zär9K µ1F²$Û£JzÎÂÆ1çÐl'šF¢U™ùꘞ«§‚m&9° éÙè|؇ã"Ûé±»/ýKbæj?ÆpBêIºS8f`ª£ó…q=÷¿H¬XÌZÞÁ[êØ9¢W¸GÏâ=ñR£*ïå³åbûò+uU½gLYôr4ÌI׃9ŽÂÖ}tËÙÇ–?—µäY£2䳑lŠƒ+ŽÖ™«œ{©qÕ''û÷ä€ÇX„~ù§†Lù‘n‰É$ÝrÀù/¿¾‡ˆˆŽ7ˆ™ 9ÂJTaÊ %È%’6Ý]ÏÑÿ™Nó¡ÚLJîÙGIø:Â䣎|Z2ÏÀU}‚ÀüЬÿN”'ýïÏÐüµï;ŠÈB2Äñ€ï?ÈÑàûIÈõžªÿ…9'ãañN‚û˜þ¢¨ÌËËŠŒF¡_ uü€×’¾ØÇ7GÖ ç\J߸¹ðäû—‡äáÓ æ_§¸þX™Ë\ñCåøDô“ ¿þÿaEþ}?ôq¥ÇùmîtþÛ'…ÀŽ¿š’ó­ðÿÎ €ÿý1@vÌ,ù\ç=ç(¸~“¦š6È8Wóú!æÃ’ª¨òØ£#bzÌÍ1u¦Tg•Ó·„+i/µÑc2©×Ù¶òlLÃÎX3/ŽHõ¬}XRD!^6ø×¾–±_ð>$ãã…âèBº’T¯Œ¥Ëšátr:N9XÂÔ# Űäè4M#”ˆ `º ûŸßQª§Zšwÿa§Ÿ|kÏ"iž9Ò½÷ð."áôÈÎp!Ý(}Tù Ïx~kÍdŒ¨A U‘žPxŽõã0à«(hCÖ.6ÀVPH°÷œS9sü+6-Ö}ª¶cÍ *'”H$NP4Ýõ)}æ°@iÅl¶ †9Z õt{ÍÐCrŒ$štÍc5|°w™oϧü¢|¢Žæß "hèÁ'£x Û„†ûèÒþ\®§ œu rX_r6.^¹%-‹w -:|LœU€³pùW‚–Zôy)Ä|>OqÎÔòŠå$H!ƒgäl,wÏ5^Ñ\‰hAp5hQ (†Þ£ñP–œ"w¶àjqThó2¹Ñ£&”£á²Í™¡ œ¤Iš!…ª‘Õµ"Ùè“ ŽR\$$P2"¯ï‰ÃÉR‹ÉNšCB6¹ÝXŒcÙÌlyÌ[r‚{búÓe2®Ÿ86#‘wxœæQ=GR0¦bŠQÅy3EŠòmq¤cR¬Ä(³Ž*²·*‘V2-J-àåZ‹¹ó²!ïv$ޝNY†\üÝãÄqI áþ¨¾Šqo{{òeCeÈ„!1ºgLoܘ3.“N á„©IxwR23NÓê|D’†EçDuà ­Ÿ°õyAÍ€ã|rú}7yÙzsjJžû÷‹L¯ódG0áO5§š5Îgdk4²LAþÚ2 WŒø{m~Øì䡱þlƒyà´Ìw;éSü?3ßËëø0µ+g”2Ìïµ)Æc§ùEDb\–—P‚^G¸ò#ÞÃk”O2èɟ燗‹`r° ^à#éì¡YñÝDâ§8§ü sž*þV¾q_K~…öòXüx»éünâ¡‘öü—¹—;c=BùUR:PüxZƒ_'çõ¹Ö˜?²Bó¡T/3žöu^ðät¿þ'ŸØ>|ôêóB‘'€Ñß"¸âR óÿêCnµTü›Þ'yùw—ž¯'¿ÇÑâ£HÑßÞÂðEÿ«>üð?ñWàCËëßüáÿcƒƒ–—ÍÁumqzèÇCsºLû€ø–7d½€”ñgA*ðúRª°Ë!·rç¬ABÄ•œ3):7ž"úêQ=Ö ³øKÒ Ê@¬ŽUÛ`(^[xÏÕðÁÈ92c3¼ÏI(ë"ö4-x|?FËø~´ƒw£R”L_lÃhéÞÛkkÞ¬V›Ö„t0*.Ìj»pg-Ê£mIA)fÁ¾·V(KR‡h.¥¨ˆ‘Þ{D î>ŸEsçJ‰Þ.fٚŠUm¿28ýªª…ä¶Qýe©°y0íIz5+ÒÛ h“­7«.úBÂÛ>ÉŠ9©Ït8ÒG’¬¥¾Ün¦ÚZ{½¿½m¯é/éÞ@¨Â@M[, ùQU†÷](¥T…FD—¾÷] ºmÃÝì­·Þ<¦UGÇöldž©i±Zj…Ig‹ž E+¶Ê‹ÂöÞÛý)v ˜ÙsE×v…³Tsp⎇|îN1žUî2Ýsˆð=¼RËà% Š8uðbж'òýûë¶mÞ|ï{÷¾µ=Èbjëz«k*Â$—Y µÄéª0Õã<åÉ:¿ ô [ou]o//žóîÍÛ×£YKÕÓXž—±ß¨Šå¯å¶o[k{ww2nëjëâ ÏûŠÚ?ýü†¼m¯Ñ#Û(²¼ÔJJò™¾¿~[o‹*¾¿¾¹w3ÜÖ—Ûmý¾ÝUµ³±7N㩊)D¼OCD–¼’ÌnÂqóbæÝ»‡ ¹{DxÐ}k{°«ÙRmY_J)½u+JÑ}—ÛÍÔŠ™C(Ž´Ë—¢fL¢ `ß›©º;D^nkjßÊt¯ÊÞÛ·o¯Ë²|þüR¬0†DZED–o§úof£½" r}˜6ßÞÞ$ùF³V-8Ä &PÖT§R–CS¨á)!¦Ú.Þ]ÄÌŠènÅÎ%‡ïë0Z¦VÒgª tg÷Hº7ææ*·——›Hoû}»ï}g„™iÉfOäæ·÷„Yb6&U½5A¶òjˆ¼ÜÖ·ûþõûŸUµÖåV«5"zׄ”RDÖﯯ äÜ&"L5Íõu©²¥|YH¸³µÖ)Pº-ëçO·ÛZ_^^^>}6…)>½¼ìûöíû×}»ÿùëÞ_·Ûzûô奵>úŸðß·$W-;:[k¤|ùü¥‡Ël¨Nª»¯‹u·mo{æýå¶Cw­EDäõí»Ÿ–ÛÖ¶ÆJ-EË˺®Ë²÷özó`UÍmª™g³þùÓK)5ç—îÎðžYL¨xOÊP]DZïfÈù@ jjftïÈ LfL­”a„3KmŽÂ±"ˆ¾77`‘ôا ÅÌB€DHeC$$(„ „ 04)eé}Ïê…~èj³†ÔÒ÷Jd_3Ñ=ÚÞ–¥ÂTCUaÅ<Òö@þr™S籫S()]8xÅG-* ua¡CÎS©6†‘¦å®Zk1ê Ãì.™ÙY4VC*¦ª&ZŠ‹Èº.Bj±@¢ fDp˜t˜ ,Ö’ 2½+¥ ÷àpG[μ8LžD™÷?ƒÞØEX0N'Fwƒóh‰SÉ{lðŒŠ‚üT§m ÆÄ"£ Í»÷ÖZ÷ÖaèžWLÞ‹ éš@6ÒZL´æk•4½:øKù<Ô®ÐB ™ÝÁ9¹OOn¢ë&°üÐæÂ|Š&<< ]LŽ’Žu7†üŒ šrú  £¼ñlÖ©™†¨ F`nÈ,Š“Ðˆ¡×à­\*nSÒëä;MÓƒ»~T$ªFʃï`[]χ¿†õ9 &.þð«}ü*–=(ãs#æTX"(*¹~›ÕæÀ3€ÿÀÊaÓþ€­rQü/&èÉhäUËytðIƒø°Iø±øæù›%ÒËט¢òÓ/¹g¼æ#ˆ9ïÛf,Ô»7„ç°Àub1›‡ÞÞéŽ#‚zêó¼¼,®è'çÿõ?Í£rµÐ^ç|Î>ÚzùÁëþºýÿÙ™/3õw•ú.A+ȘÀy°kÍ%ÄÃù¡úæøÃëæéj¼–WÿºöÊåYü5õ¾¿¯ºûW¼Ô? ¬Ìws©¿Ñùÿãð·2~—ƒúo!ãóï9Z¼{\CA¡í‡øyfèx5ÇS–”9/×9sÍÉ&<î&ÇDav\oÊ1H„£¹7ƒû×£å< Ñ9Ìæ1<˜®‡s™{f}×Õ åjÂ]UGÁÐtǤ`tÉÌ\ß1í?œùWEŸ?¾*ñ0D?ßö;.Óã·¤ÄÞŠy•Ê gÆF5`£“BÃ(D<¼Y»›’J«KÕ®÷} w‡[ G¶ˆ¨™HÓˆ°{OñdVY"]¡ËZ7 ·¨•r3;rnTEøØp˜ÉRM¢N ?÷ *F4ïA¾”e]ê^J‚{9|â2tv9óD[ßqÓOŸ?¥ÊéáfÞš°ÑÜ‚šÙm½­·µo[wßö èÑZS@KŒŠƒÄ³H0¹ õnÛhµ’…aYyjTƒ{n¥DUÅ{ìì½1Xkíî4rpä…÷ížR©€6x­*"¦T]ÍÔ½¥ ^"•ÈÜ•¨–RKñpi¾·fæµ5‘T½Ç ašáPà¾m:ÖÙQœý“­õ §Ú‰aI="œ¹GŠˆî&€jRµEEÍ>½|Èëë«ê*—pñjr+<½A˜i±,?‹ð)›ÃH fhïÄ{óÈZg¦›VÂÔ÷µ.i—ýˆÄ3ÀZt©+†nùþí+=ÚÞÝôû}{kÿ¡¦Ëz»Ýnôøþú­µQU”bÕ–ÎîîPûúõ«Õ"Â}o½í-<7½¥f¼ádµb‹™›HSeDÎd\è.EBf ±Ò›fûk–ç¦Ï—!÷æòÓ§åöùsÉoÄXáö²|úô©X!¹÷î™" w5+Vzk½÷Þ=5—Þ£÷ž;bï@°ï½‹ÈvßÔµŠÐÝ#»5ǦªbÆŸƒEµÒÈu]IFïÝ{¸Ó´…§6'·õ¦ÐÈ¥¥6 ¦…¤Öß{#±ïûÞÃ4«Ç1Ú¡ô(UeÄr⨸±aÒiáù½#Ô0ì™VR5UïéqVg°Öêî1ýû½w³tT»ªQbJ4žüÉë÷Ëçϵ)­õ¢¥~©ŸoŸHÿúýuß[2‹’¦"Ó]—o""Þî[J™îQËm­”ʈµÔ_þüíŽÍJY×50þüË/½5Èn Ud{ÝDäË—O·Û§×û·í¾yï-/'÷­íK©øô9ïªÅF‚K´†ªG´Þ"ëqŠ™Ù¶o{ïK]ÖÛOdÛéQ«½ðÁN‘^)Ånk]Ö•± e=ÏH†7ÌìË—Ï mîÇ4ªM$ÇH¸o{k.»_,‘ S˜™ÜÖ¥V+EÝÝã¬Î,¥¨€âˆžê|À(a¦”軋Gw.ÅLÌyWfϨ æî}8kÅôš‚î “ ïNŠ"(=b5ƒiðèÝszÊpæíû÷WÄà# E^Qy,‚DÂ)Ç Ú,ÅlUÑäãg"ld(= £¬R‹iYØ[ãYQQäD«XÑjÑz&â]Ä]4o9à ±Öe]j) cGQ5­V[ï˜éP„¸»ë€îdŽ ¢âìZòK$jŒïîÙ|l þ@PHUð¢ñ1\ΕÅ…„ÐR/Ò NE‡’ºëZ­”RLu@Ù²5ñb5]μÙN[åu„ˆïûæî!¢aEáî›åéZGFvjYŠ™]1hYä ¡¾KAHœ]œé€üF%‡c½ìÂÈ-†Ô<@,""}'Y »,@`—£Nv,$õBÖx°uêT¥¦®)2–ø8XCž‹f%ŽÆJ}àãqkŒQϾ<ßìS †¿|Z–9aI’£ à!Ë Û—b"ý²‹Y:Æ“Ñq¶BÏ_À ÅÎgÓP/ Œ$NaôÅçÒQ!GíS¾ƒ´”ÊÕt>gš#= Âé‹NaŒPË(%9³v¦/NI…0ñÞHd—û,Š¿*Däalx0‚8­àÇÚñZšß4â8‡ú`LÊ-U¶Ô¤ 'sLBè,¢HŸ Káµ:ò1 b :UÝ“‚Rr¥^.`ö,mê1ðB¹cÔ«<*Ù±ÉôêŽWG=³ Xp„T´›„ Œ‹^ÇŠ6âRųN.,3U¥Ž»µQÌ@¸P…%ù[îj'/H.›äcžqî$ÁccÌÑ-2ð$¯¶ãyì×þX<¹mîc IDAT¨\XßyÃZL³FHTé!Gû²Ê9Òtõœ;åÔÒ5GÆaŒ¦,+À"|Zÿgù•p¼[^–î™Å™#Bà ÃóˆõçÈðÅ'&vô‹ÍÐlÿ06g†È™À:ÀÙBtÙSãÁ¾}\Џbð3Ô÷ØÕ7zÒâêW?§•œóï%®íò!1ŽèÒœŽ~,;3HÒ¦ Ñxï^öG>4Âò"¼^X.Ç}ãQPå‰ÇkøÈ«Òý̺9Yõ|þ/þ&ñ8ûçõ>¯ÄQg‡7>@\Ž÷±˜ùñ·AžrG—ÍÕæ‘p0k!Nü¯ÁgxIè\ÆHüp*óÀ=šW ŸË’y¹´GbäYÞ5(ãñQ x”ûñNö'?8O´ï~„Š<ü!÷ñLò7èÄï+"Þ]Løa]ñâß6øMfôßw–€1 ß¼á·(ÇüÍoìïRìñ7þ½ßKñÿkÿ¨c~ÐÃÿ?‚çót\޲ñ„ ’sõyÔ€á¬Çè"â|ˆë£õý»ñÓç3p”çÓîI6®Úþcêêx'á^õ£F’ÄG¡D@m@gZ•òTsY1Ë㸗1×»cX‰£x úîïó€¼oš¶ˆ¬ˆ~ºá}P€3°7§Î• Äé豘«VL‡g%‚žXœšm-e]–¥¦cØ/Þ?FHwïáfö¥,M{ë.<â˜3Á˜>hzÞ·Þ ÓJ¢×½0µZ‹½õÞܬ./K1ëì­÷•¸ëþúÖööéÓ˺.ZM›MüiuxÁ£âX¡&B1+XqN®¥ºŽ°x¦[Uµ]Fm`.'&E„"˾ïÛýííÕÝ_¶Ûí¶Z1í&"µÊ°{ðÈL­3’úÙ#ö}k½EîBƒ¨¥(°·f4ñ¸Õµ~ª~-îÿ) ]¡”RÈl^¤‡‹ ·¾í_ï÷m¹Ý jjòŽXÌ\<³]¤˜!H­ÀÛ~¿¿Þ—Û2ä‘é‘…Ìqä<"‚âÍ]¡j#‘[¹a óÜQÚRU5Ü 6¢÷–9€ä#•Z×e±Rœ±m›-õ¶Þ,Kb[5”bEµÇ\]&j!Âû¶C‡ÏZß•t¸ÝnëºÖZ•ܶ-$&@@Tt­UÕµ¢¶{Hò«^û¸KD¨–Z ^^j)ª…Ña¥”º8)A±XËRT;Å#¶m'å¶Þ’ŠÝz‰/ëËŸþÔoŸÖ××»w·bÑbsÿåÛ/÷voŒÅj^Bst¦‹Y)UDíš’"AÛ{—"¦Z4Ÿ`)ã o²7Œ¦hùòùåçŸÿ à¡h'aIDÖõ¥Ô ¾¾¾5Ï-˜‡¿½½QøözGê¥YLºíÝ{D|ûúÍjy¹ÝrÊB+VÖz»­áQÖ2 i45÷è}TJèLotº8ÑÝÓ׿ÖòúúZ—º®+÷½÷.CƒAËíå¾oc&Ìè6xØèÙÎ UORjß[¿ÕULiV$ç[2ŠG»kv pØŠ©)BŒõ@%·Þ÷½Aõ_¾|ݶQBg¯}„»7…–e5E²€Fþb¦¤¶&¦¶.«™íû¾·í럿}ýú}b’‡9.¿­î¡=BDšwýþö¶Ô²Ôe ܷͤ­–º¨™ÚÛÛëíõõýïËÏ&"Ì €—ˆ}ïe]¢û矿Ժ(d-«W ˜f߇PZm»3ÂJ¥™^ˆjbŒðp …Z÷AO‰Ütàl#º‡P^ÖÛ×ï¯ß_¿1¸,KÚ„#bÛwèÝó!-zï^­U+91iUÖZ{o )Å–².¥áîÞA w-¨V²ì&™çX­ÅTqµlŒ’l­AA¶9²VÕôñ:©Êt温ã´rƆ¯AóUAÑ€l{§K©–†uQ ·‰Þ·†A­Öl~ FwÓ”g¹†¢E5€–¢oû>LÀ¤¨–á<!=`*ðø0hÆÂsù•·Öp‡•\NŠª™ÖZûÞï­±»AÏFœRK-KVë°Ôe©¥õ–«€ºTéû®bYÒ8¤šB•ÞEX‹œbfÄFwPï–ð”¼`æ—cá0áæ¢ªµÀŠš*‘³ƒSNåX)ª(¦:àFAHtF½â:B0Hii‚Ës© B–µî»© ïMí`[j*Àá2(½u¡GàÀ"=©ª!𬃕Œáî8>OÚ\N€Ù3›OPgl2­Å€ ]F5*„‰Ö?sB®Mì\LÚÚEJd Ct@ò“Èf™!Ò ÜßakÇŒSÍ žYY•S0:ö ŒU†(3/5w G\X² ™ƒ¡ø¹Üη¯Ö,`…ÀÙäDý™ù?LU iÏa“×!à "sè“ÎæÃC­ì Rrš‡ª@Ø¥©8„”R¬–¢Cuæ(o"lHƉÙÇ 6ÍÔç0ǯy¼éö—œ¦âÜœÈÙ@zÒìOwÖ±O õI`›³…Ó÷Óø©$Ô¦%šÒ=ÇQœžsQ„ˆ É¢×Yញ¢ Vf×Nò…Îj×a+§Tµ˜³‚‘nPÆÄ¦²‹‹ 6Z~‰#ÿ‘*Æù?õñ-¤°ð­Šü5{áç.(1D×pÊpBá.Ç]&¯!³I§U)dk¹½*£°(ëKªp<ìŽ ]âQEuîý@‘—±9¡ykŸíÖú®ÉãÑ^iNsW"'Nv,߃“ÆÜ©"f»­Ì|ì—ÄÙ¢B†_šHUÅÌzEØsÛxúÜp)èÎÚgŽË1À˜ÄsÁÜßs“Aè<ìÒsx¨ÿ¸ä1] ödÚæ¶‰sÜ2š@æˆáü-õ‡fÿä/Óš÷né1%y$´c¼4ŽžíY8È'¢Ì8ïKDdvºÎI.XyÅŽ€<&È«§ò©rö¡=8Þ+XWJæ;æÇ™dºjܸ>;ø“yÏë?Þˆ>²‡Ú÷Aâ}o|pÐó:ïãé}öÇóÃ6ùÁÏò‡öEfçCDã°Çϲ ¼ÇàóâQÇãPOS³`€×е bÖ¯“ŽõüQ‹ãÇâ{?þu pe žqö-óy||úÄ>šr|¨/ã ,xm­~œý*ÓÿñæñŒþ÷üó{ÉÀ¤~'Íü/Î>*\Æïé?ÿÍê?~e¼€ß}ð×S€>ú¹Ìø?‹ÍeåÃþ]ú‹çj‰ NXŠÈ‰Ô;£‡-gÔF›ÑeX|!Ÿ!.ÙÇxL¸þ¡Ï}š[<å·ðAÖhæŽSÌ(6ôÇÇ&€‰Ò *xºÕLÜßå¦7–Oiµ´ òÝ›’“4ž!ç(åát]Ÿ¾ãº‹ Ì*½»1D©j/ë ÄA‚Þ³°)]‹0¨‰'w ¢Ê2^ÄHiЍf ¬µB!3 — DwU­jÁ}æj+|ÔL‘n#}ï¢ZS­¥z°¹ï{k­÷Þ>¿¼ÔZA¤áŽNeém¹pÁi‘5)Ô ÐÈn¥Ô¥JDï2¤è´†Ž«M±ØÚzûÿþÏÿ¹­«Bk±¢E&‰Rë§O1…¹¶·ÅjµÒ¬… ¡¹½ä±Ùˆ"DZÛïm լɫ𡼤©–[oëº,šÌPÁ§Û§$߈Ⱦíù gxde`o]K„JÌôøÖ$p¨Öšê¸woÞŠ MKD‚Aö›N_‰¸'U×glž zDˆƒ)¢byZƒW'“г˓Ý;¬î­®’è 3¸Bzkb½gY(="â¶®·Û-H«%ý¼¦jÝSÕM7w€ †ˆ Ç%w¤ µ(¦‘¯ß¿Ýï…‘­—TEµRŠ”áô:u‹éb™ÍáÛ¾§ {[ë§ÏŸ(0Õª%)L|+míýv»ý?þó/öKßvêÆ=ÞReÛ­·}SùR [ÛoË’NèˆèÞ)+IjR¨ªÖXA„äüë¿þéÿ¯Ü²E [+(j¨‘šLƒõÈN¥…„™-‰Ûöt²öÖÌ4/éÑÝ{P²0`oû¾ï”Z«ÍþåøB­Ue©QjQÅm½•Z×uÝÚ¾,Uo½G§©J)fº€ª&FÆÃ£ûÞûËíf€šf«D)E{6È)ϽFkÝTÍ´X z‡*$ ¦³Odô’›Z R9Ú{ëÎHô@™T´‚˜âûlîÍ­) IøÚ·•œ¹´îÞ¼÷cUÅÌê`j9M5½Z·åî˲Xµûë›Í@Ò².Ý{kûë뛓k-¥VÍ t©¥uï™RHÖýþ¹%Òªo=™õÝ{ë{­åçŸ?›²÷þv—äø'P ¤G´ÞoËòóO?‘ìÞÜ»G?Š:“¹UŠ..-üûë[¸ß^n)Æ›aÃæL‡ X­2`XJm­ÿòË×bv°›ØÑ|ˆ'áž\9iîY(’÷r§‡*!d-E²™Jâ¬lûŽ©w¼¬·mÛöÓB0ƒ# & ÐÉ2Nƒ£UØ= ššMÖ×oÛ." @3x>'¢8ófr˜­G?j±IäÊŽ#kx7ßE*g[cŠûÁP÷|.ÃÒߟâû–8º1ϸ¥ÆNZ4Áé9 W0*%kr…šO;@„Û¶ ÝÝñÖ›0ÌxO^óøâ=TöìXj!E[ëB´V+Vƒ‘n†ˆ¨µ–j (ÐÂ1ÆÃù¡©Ùa¢d~ÀB#ƒ­u»„œn è Rl*Rs6‰Ûߣ‹$ìԪ‚½Eï}ö*@MaZB ZÍölI:Zx#„€º{Ž3~Šá „a!‹n£âr¶ëìºNpw'„}Ï.¢˜\ŒR„0 Ë…ÑË0¤(†ûÐEƒ´½@cÚcR£]1¾`!Ó~“«m• ÃU“¢°Ñ7ŽSDà”ˆ.t™x¥K­¤æKÆ™qA~žfÂÓzèj"ˆóî‘dC}:Pß)Í äo”4 æþá;>½´#¤O58Û*1…9SKüS¢ö]Ƥs*PYý‡¨Ÿ@ DÌ%3ƒ£|&gÇÔ¡µ…Æs‡Ã8YøÓÆÌÀ ¹8Y <¨¢“íÇr*ø6ñݹ­*ùš9~QHŸe¢22 ÌcõÓ·îQe1vΓïšÝWrÀÆ'[h\ä‚ËÎ2÷ËÐm@V9Õwé,‘÷ÛDï¤o$YWÈ}WþQçÜ)élöÝã¼Ì@GÞ*Î"ÉGÇcO#ÜÅ}X‚ÔD¢Þû¸"uà±NU2SÏks‰œ9‹¼oHŽÞ°UÂΘH1›x¥ÈÃ…HI Ž›z†=çÎz8â2^œOñ¨Á7õ©©fBJNâ¦ß?‡-;ûȣʜƒD˜ýp£÷®Ï,‚êEV’vöœÈøÂP: "6Cð PuXÉ8çû9™­ 8öc:3š½Ý¨ÿãè§yž8ürS¯1wò03ÓÁÿ, ò™ZƒG]ÿ¬n}²÷“rú /r·x·æŽGë5Ž•/ÅÝçø„Ì¾bUáðG1Ç“§—×cÎKŠy:õ¯Eƒ×.ZÊ… ÷®yÏ&ásjû@¤9_í8Wx§ÐŒ2ðXÉËwþK\xGZâ1µÀÇià8"×B'ò˃èÿPý‘æÈªb"µ—DÚñ”ß¿àÌÂɓݕOWÛ8¦ïGÇ‹A׿üèzHðÙ.þN€&Ó"çx÷ñR:a§àóÜá)ðƒæàèáÏ¿Yñ~|K áw‘àÿ6¡˜¿Ã¯ƒüÊÇü4úmï‰"øÝ…o|P}½wüÖ6ƒßøâ¿…Œ/ïX1¿ö!\©óz¥ý|ô1ðRGKžé>9ótc›¬rNñ'‡y,ðd€NYÇ6!©eø×õ´áÇâƒ&§+~âà/53ûÑOÌf¼^Ã%d<`÷$ŠÎ`ÿ“ü/#v0‘™ƒ|ú¢˜M7̇A°‹ à0ë<éðÁú×fΑBQ1%Y1¹-!½;$Ö¥˜Zk[Zb­˜ª©iP[8·­·¾µ¶¬Ë_¾T-÷Þêp÷x–óü—b.îáâM«SíÝ=‘öP¨jï½{[n7-VjÀ#$è ´T¶vßîfº×*¦²mdë=Ü_>JÓqê·ÝÞ#W<¢B˜¶Ü,.P3sfiY†üUÒÓ”ÞuYõ†·×·×··¢&ëÍ›nа–â·Û~ßòdB¡-ö9ÈÈ U]êª:°K]rÙA@k]"-“Ù‘ˆá,ÎŒnçý~ßöM¡ëíör£ šÑúÛë}©Å=Öu5+*;ƒx{{ e©2çE- M-Qò$÷ÖLt-Ë×ï_ùå?üôÓÏËR>¯7g¼¶]€ÅFÍa÷>æ¤)òxGT~ØÓ>å [kÛ¶wwƒömoÞRÄNÿ{Îî‚Þ@ç*³°ÀÔ"˜%ƒ¹eÏ~QÿÞEFt€‰öl¯o{ÿ÷?ýÉ`_>½¼Ü>Ûý¾mqoµT5• ››&jœEÕ# ¨ePjñ`Ѳ¬ë}ÛŠ•Ü!k6|7ŠHOzq„ ¨!Ý}Y%XŠ¥}TU*4B®‚u]Ujùõv†A÷mÛ{K€ˆüû¿ÿ)5P-j¦VJ¹Ýn6Ù2äÑÉcw…&dªÖå§ÏŸ?Ý^PŠnoËRòÆ·J¥ #¹ïû²,‘Zª»ÇL«›iwW@Í„b€­kÑ•–ÞÖuð©¡``:GG¼ll¸©ÛzKŠŽ©QØÝ½‡QK!1:¾9äƒc™Z‰{ÎÆèÙ™ôRªê€z‰ˆw‡•¼úœ* -ª£ ·eµRLMLñæÞz FiÕÌLM*^^Øz7숉ÛíöIÕÝ·móîK5³².µ»Çýͬ$_CÕLÀ}»ç·žd-åv{Éïˆ{|ûöç·û¾Ôr»½üôÓO÷m7QšBï=T-'Áe]Íû¶ï9ka ð*Pªté U$„K© ´ÖzkÂ(fÌé±wÖb6z+0ã[‡)oJ‚¢Å"QK½4Eæ 5'rá"aaj9ŠL“>494¼G€"H’X-¦ª †ï¦æÑ]ÂLu)ÕŠõ½²˜´[ô}ËZ€ÜàG„ˆÂ`)/ùÑ©ª•‘Þz£§©Ö4(*ÍÙ[Àªåó'ÛÞ›÷/fºT$Õx4Mj-åÿçîݶäF’%K½à‘dVÖ¹ô×ôüÍÿEÏšÓ“•$#Ü3Ué53À=‚¬ÌºÌTÏY«NU2ƒîÜ`ÙØ‘K±PCxÝÅ¥k$D¢ÂAˆ °)펬¦~¦ˆˆÅ³A]6Ú*‹ ”¬²íµ¹³È¾7©Èb (‚¦%» ¸« "’²iP)&jsYRáZ«ˆÜn[QeaòˆÛvÓÑ<ö‰¦•þîÔ2% áQcØíÉ’ˆoAfp´»¤;«=ˆ¨A,í áYí胮B$ªº ‹•€£‚Ö(Ó0Ýz¡½Ð$;kE¦‡^ET­¹-ÒÄ$¬Ýí2Ø(Y-"ŒIN—6 ³tZˆ`à€œ~`T$A.ܹéy¹T¡3ipö•D¿ ‚($’¯9Š{yá褑€î¸ÿ|ˆ˜÷HÔ9N3B ëwé ’óˆJðÜ;ϲ€±“íTþñèÏÖÍgø§s #I齩‹ÓƒŠñ§šj ˜r±Y ˆƒ)²Î¤ßý);¬ï=ÅaTA˜D™©ûýóSš 7€óe‰»-D_I& ÕAÞ:Œ!]¢&póÒ{ÍÃYÎCEç‰ú8˜ÅÚ$ýcõGÍÆ‹Èn àè•íû®¼0sw*}â™D@ferœÆìΤdÒݽwí‚ÏJw”)æ­7‹Í…g6àŠ^t1Jªû@(»†M,wúš7ŠàžƒàyþyäwOO=Ñß.xÖô=4bvX4RÒB‡t:Z8\-[Ó9ZÜr›X–ÞÐ¡Š La>˜’h f¦`xÁ0KÀ‡êˆÙžy‡OåÈL‡²+>î1¾mt*R8Oq¶dó#8ç$ÿßëÿø »•ðP<} :ó#žåêþNÒ{ú†tŽýH {´÷Ÿ9bq<ø]cuм?†g¥ 'áßS™ß9òqÍBd¿ÃŠ?¾»ù÷ÿ„÷x!œÔæGC3î)U8æ÷)¾ø»…ø¿ oó7ËÒ'X#~|U}Ô8Í?þÈüû ÿ‹þ/÷»wÆ÷P„?Z¹þ?K|üÍׯ÷—¾›Ú2¿òœø_|Ò§‡nŸí´ôÛ¢jßøuþ>zwYx§ëŸTøñ«’ 4tR&–z›· “t,¯0"ÀÝБH>&â<ß·ˆœ'âGÓoG£íA"=«+§^ø÷Ê;Ny¸Y3¹‚Ñ·\£[éý´›Ïñ“ç 4cz@2Önº‹ä‹‹‘*i¾ «Éò|Q•ˆº½^_•±,ŸzŒS´ƒzU,Ô­kjAØënKYËbf>¬öD–.˜4~vEµµ¬eEÖu‚K{‚!òùûüütY/f…•¯·mO·ðÓÓÅÃËŸÿíÏëºnm‡;aP½]#u|7©Èºi¼î}1\à ÀÌrøµÖè< Týç±×ÛR–——S½]o}³&ÔÁ*DÞÚVë·×W–R˜ÅÃUËe]¯·ëvÛ-éÿDQ[mî=È}²&eåc·è¥-¾ÕðÆÄP¸‡Šìmÿí·ß˜YÍn·«Œ\'‹À}¯UÍ.—•ˆ(áYü˜ëLJÔæ­µˆ îMË}n¤´$ËPʉÍJó€Ü"¼Fc.=ç?aÌfEÕXär¹ÄðÂK‡‚r mû¶›EÀr:!²XözËR, ȽT H'8ŸÉ)ºKÝ‹,ËrÙ¶-@ž]Äu'¡ p,ĩ҃„9„M‹qRÞÇ®ÀiÓš'HÇ[K)³Âµî*J"ÁÙO;q©Ù|)ªVÝ·Û5«ÏL5ÙëÌìî ±Éº²-Ôù3߮ׯ×7„‹* {åm»ÖÚ–uÕËÓúŸå?2›…®,jj M•ÏŸ>ýòËŸo·ÛëÛ·Z ÞQ­>3ÔÝå ¤-*š‹GS)ùŒÞc¬JTë¾,Æ£éìöz%‘Ûmûöúúå·oVìò´&ÉGˆV[>}úlKyýöm]×4,óˆŒ+›×tÙÆJ0³²,Å ˆ®u‹º5ŠBƪVŠGó¶×êî­5+%‰:’‡”ørYÅ4ï²,vo¹§,ׯn×Ô$G¥$¶Œå ˆF¤Úªò´-Ë‘ ¬^›7¸±‰ôúkwg™}ßý¹ ³91.¤|¨^×§élµ…ˆ°)<($é`‘”æ.jÌ$fm¯µÖü°BÒÚîΪED–eQÕéu¯î®ªË²æŸ¼~{½íµ(ÖËeÛÞ„õ²Ùb¦ªZJq÷Öva¹\Ö옕RÊeY¿|ûO—e]–²¬Dî}„.J }mMnît‘+q$̲šVöZk„`ªBb¦—ltäŽHrá9Ñ<ؼ;d:Ì— ð`âpwo (Y­ f´pb%6‘9yòü¸ðäÖxË›#i­-ë*Fùë² {)¥…sWù‰­5aµE™©B®lÄ‚æÄ¬f«{:å,Õ¸gWA g"+KxK|µF Nµî¬²Ø…8`US ºG—Òo¸.ksOðµèÙ14Ré §·-\Ç@6Æ6ͤË1’·Dã”úƒ}´:æb›õ© ¼ê¢¤pr¥<ª!*MÏxL Ž;ZéãdùêNóL1 §Ƴ§Ó?‰[Ù]Ð×–þ.ú÷šÂ)’éûNõñ:‡€Â ÔøôèÕoŽ=zDÜ˼¨O3ŽÇŸ âh IDATpvä#]'ýsŽîZCÎÙã¬éœSGe¶‚Àäiä (“æó§ôâfqŸVžÌ‘ϨÇiFÌ”{MÜ4R'|K†NT²,X»‰áŒÞ¼ –ìºKìÿ¨kˆyn»Ô6Z[NÄ‘ÙÛ·ë|§ÖåúRy>YãÊŸÈ#={ØÛøh ç^ ?úïpô×ñb?%Ðs—ËH"k¢(ˆUHÒ1gàŒL¨@y<'ÓR‰Â{íß´Öß;=,‹l„ó¶Ë 58|òŒÓøšô©¥ÌB‚á%Ä!kŽ#Ò£BÆg<èÄ'õJbw òw‘!}Gº¤œ˜6½UeŒ„2¬÷ÝÍŽ[Ed*<ؼwÂͽgìøª ÜeNŸ§ØØG8}::¸ñ­rrÁî)ø@qÁPwRáÅþLç ÝŸ¥sþXÀdþ@@»»ðöäÆt*Ãá¤vþ¾}ý<©Æ÷lïï:nñ§éÁAà‡sйYw¢ã´ŸAl§ˆïÖ.ãqÁŒv0Gø«ä# ÍyFÀïG.'øC÷wmøGŒ¢2¹å$àž€ò—ýdfˆ |0à?ôþßù>lGø}Â<ÿÁÄÄ?7¥ñ¼4p"¾ÿx&¢'ˆìnäɸ_ôÔ`žÔ¿Tù %‘¯>8ˆt̳ÏٺƒÜê_ÈœMLG((¤;Z†ê<ùÆ‘î&}œs£ÖLN-3wC ifæHXÜ¥Éêä~÷¾«1»?ÔG–•î©e|Ÿ'8Oøn%?¬0R ¤)]tQaå¨^ëîf¢ª„PQU“ôçÌLI“-(YKQæêm@Þõ¼ÎKr óܸGÀÃAXJ1ÒNr¸:€V÷½ù;±>$Y´˜*1¾~ùæÌd,aô“=+ !®×½”Â,à`-…Y"žOéxõˆ÷XÌ@ôÛë·ˆk©ív7¢Ò©¡¢µò¾oû¾ó²®îHgŸoO€×ˆaæî;§ÒM”‹œðh¥táz‰YI­-"óÔZ#"Í?ôð}DzֽÖ}×¥PxÝ0poÉóá ù2Y×ÕóR‰Vçîf.¶˜‰{ÔVáÎÒß»dÊ«5!U¦JÄì ó8Åì\cHÓßga5Ó¬:8¸ñCˆ<¥R´h‘ðØ[›jdõp! Ø*ÚËn8”¥µ^—Ñ¥iAÍêÞdj5òÔM’Ãì ¥dm%[±G1DEEA\½µêy;0±@¡¶fÊÂ’Ã3ÍÞqÐgC:²MÕÝGËs/ósDP:HÖÔˆÌ)n’FК ³˜ ^°p’Ñ"Ùê¸(DÙteH™¬kpÈá  cq䤒f%ðAÐî#Æ VOX…êð0@CÖå¦ ÅÄ0Ö\¾ gÇIs0Q§°t§i! Ä`•ŽPÉ(r:®:Æ•gfˆ 1 x‡šÌÓÑŸˆfAÐg[×¹ [BÉq?¶Ïw†-F0Ÿ\'íµ§gc›Rµl{øzNbÄðŠƒH‡k0˜HØ¥„!4³€Sz,íôÏž³"ÈíÈÇÞl®À¸+:DšÿíÉ2ÊØ1º€“(ÃÑ•¶Ùgv*Ÿ­ž;ùP!C‚ó+¤™íÃC•äid2Æ'P’0Ÿ’ÖÝŽ¡¸÷/ ÀÉäK£NzT;ôøHn]kÎ~bâÞ­p8qduÊÐB‡@kýI{mÀ19ÉÿÂN½l‡&ݽz‚2ÏÒýç$ÔC¬’1¨Bb:²H*ÈÒ·O`ÇX¥ûu¯zpN˜˜Äe|ä”z<ÎM¨:2±×³X<>þxäëR0˽çhÀ좑„ ý¤ðG¯Å ŽÈ!HÊ)1”gt™÷îìa"E· g¡ÈpáøÈ!5 ŒÜhp>©ŒèMtÓgß©),¢Ãó†!·Ko>é‹B¿Á§ðƒ>rËI1ÞŸ>Þ ­s›~Gᤛ¸¦°ßAN³Ëïä½³ /ÆùítlÍ$su$9zÁç› ˜>hVxRðC=ïÙÊð!€{ïJô¾çtæwŠ'ÞOf”ü»Ðãáã½§rãÉøz_@2ÇäïP4¿_н'á¯Ê½ü¯¦îþsfôamó»s†?t„Æø‡¨Aÿ¦ßùQßu#|ÔŽð·©qrþµ#¿ÿ:šXÃ;Wû=¾&4sÿx ,Ó—Óz8š”Œ l­Ù5¾ËëHvÜÌmÁPõ1¢±=PpÊ"¤Ã;FU.ÓÒ;oùXø}n„i€z)¢ï•z‡ÁÑÖ57(4k‡9u(ðÈ7‹.'s{{¼ß*+øxË#ÔÇçáôh÷§øÇO±þŸÿýÿ0Th5Fìûõöm»]n–¨ñànAŠnö a3+¥èz»Šê/ŸNyî<µÕl.lböÖ2ï 9Âшx-ö¼^Ôt«{ ʺ,fiš „™=­a ÷··ë¾of¦ªD,ÄEÌLMÕÌTe” % K1Õæm¯[«mßo¿üòËÓóS­µé……“'@=OÄÌeY8™A¬Â*,Y‘ÇIÃR³eYˆ¸X¹\.¢’öˆØ÷}ÛöÞ vü‰hJz©âeüüüýJo¯™±˜àñòò²íû¾mÙšìÍ™)k™91ØÅŒˆÅLTDmJ‡9ÿ`.8tò!:ÚP•¥,ùæÓ~%YsA@´g÷±[ÊÒš!*Éfi­¥À:3’ Òb¶MÉéÎ9’%ŸÛ>@úÞ”ÉéÓÆ¨„Í/ÊVw ^>ýTÔ("‹§áŽ$€ÏÇ wO’uîtSÿ¥á7Õõt=ËÏ\–²”%ˆÔÌ›¿]ßÒ×ß eL‰N¢ˆ×AqÛ6÷PUQMžuæcˆD”ÕTU«{ò™.ËúryvoÑAADHe«íõv]ŸžXØŠ ‚±v|VQ~ýõ×ÿúŸÿóËׯo·ëV«©å;WÑç§Ks‹aß§µshdÁ"Á¢Æ""VzÔš˜ ª Nb’d|!Â÷êÛmK±$K~þüi]3{~yþåóÏÙÝË”ª: ÂfÅ£3{ˆmŸŽ|退¬\lQ­uÛ¶ ïµæÓH²Zó²,—Rrin­J?°ê5öèP¤<©š™ð´ZæscóVkM£Y1ÐjæE<"Í{\Ä<’,Á¢)->Á©÷Kºr*ð!Ó·æßÞÞ¾~{MjV1]–¥”5M£IŠBç÷›Okž“½î?}?’ÕC£Í$ëf0m˜Ý[mÕL×eýåçÏ˲À[/KñVEX•K)<–8%‚°˜-™¹Ý®·ë1úéó/?òjîÞª»‹Šj±b*fbëº,K GžS³’9$Q1é<ŸA4¦ÖZmµ,v›æy‰zxkžg¨““EØ="Qâ=•“S½"‘P£{“x@…EU˜„YY‚²Q™"-–èfÕH W´y PŠšÚe}2ÑpwäêàôΠõâO$JÈ´ŒžcÉÏ *¦VÔLÕá·ÛĤjŠh}€Gl‹©Œ:ŽwÃB5}Z×r¹ô{D²Ô¹ß"·k9ÞÓ,jDD=2ÞWT| å§ŸDÆ´N˜YŒ¤ÌE¥p?z¹© ʃ”7…l³•ÙЄQ\?ú0Ñã Ñ åC9c÷æ­yð ß39B‚›·Ùm«¢dJ*Ê’½Ì£_D”¹03±e‡/s­á¤9_à”¥¸#2Ffq²wg ië¦NЈ2°æb<(+9ÍQ>ÂmÚƒk¤›aLzGôgôÞƒ2Ÿ¹ç" òB4Ó¬™ :íZ‡;¼ãÄépÄt“0ßÁ¦£†e|àŒ;0áàý3R?vz¢È”°0)g 4«¦¶ÎÄÙ 'GRoh¢c;Þ ÎiÙf. ±@¦;?臭’bÕßéxÐ_-î1"´8f,£Zæè 'ã„óà³ôêËBÖŠd&F8'“5N•˜¹¿Ê56§qckšœ¹äX@€è¦íCãÃh%ëžo|§ É>nvwÍòŠ 5"™dØž¯›Í:‚£Åa<1Of½T­—8Ìã“n0#[ -¨à`fù IÉgx¸7ô´2F=â9æ*Ñû½ÁýRÉ~ß›‹~W:{¢¹Wôs©Âb³ft$ô›Q/DÏf ³WlÞ+:¨³—¸÷lj. åžxÜ#gæž™d~Í¿‡ø¨ÈÆñM­ý ȸaÏ,GOÇÈb¨œeÌ4NÍãË{<õ¤ù‚#évÇ…N˜€²¡~÷§IyÑ'dàa‰sRvæPE„;ò ù-˜[•^Q>ß}ÌìˆØc¼­êŒÓ4ïü‰ÎÊÀqø»òï{ '3v1)ñ<«!šÚ1øË@¢,é˜sÌõŽï³G°!æïéSü^§¡ðÉ®8wƒò¾€óDz?ˆÚwKãñò<ISÊŸ ;Ôéc—)Ôé⯩¶ï ãîü¾O7œÃÌħ@¿ÿ=|äÝ!¸—âîÿ-ÓãÐ`þ!Ÿß!ƒ‡Ž÷ùåøÊ zYΣbN1–ûqÅ}fƒq¯&ŸŽ×G5÷oï>M2¹^ü4Ç2vó_ùÛüÕ×ÿØ8á÷Úåÿ±/Îô· ûøŸñÿÉûgî>¹ð?ÿ#þƒŽÓwßé]áÈ\NOVcŸJ§P ]µ/ºrÔ „tFfnà¥ÿc߈N#LØ9!Öd”¬°ö•D„!}bß7Žçô¹Šg*“Ž®êÖó‚?ò÷Ûˆ¡ÐŸ[”†ØoG ù¤÷³b®ìó»È|†ŸÍótå¯Å§·ð.vŠË‡“Ùó=˜ c½Ï «±éB6.B¥HË‚V&UE4 ÖZsÕæîû¾¹·×_þ|Y–ùéê3=I‰DgBhñæz}½®V LéÅ~ZþbV[ó('C“T„pf^–r»^߮׬Hl­9׌Ícøp;çQ„EÄ4ÝiîÞv¯µÖæü§—Ÿ r½m„hi§­ | †"LUžžàÍDó4kÏhÍZuvD4ÝlÂLšæôs>ãZ1U©-ñ;‘¿%[ ªAÁ-Óë.óÙÝ£ÈôÚbET2L¤ bòÔÖã/$~«;bÌXFEv•(‰–R.ADÍ7vræ¢eE¤ï¯Ë²v‚£¥JÝÜ©õÁ‰p69Sˆ²¹©.e•¾á@¥–5¾ f–ê"Ëæs6VGÀD÷Â#›ÄÑ»ɽ1³@RßJÛ1à 6•µ”]¤º¯¥%"Ç5 Š¡O Âш­¶]x!’¼CEŽá¦3¥N»+‰¨‡‹ˆ»çùÃ9º‘CAD0œÇîLƒæe½Ðux¢SÂï;4¦þ1EÌ$‘ƒ:¦¯z0Q4÷hÂÌ* hÙ·IââNΤ!Kßèf}Jâ¸;8tÆhÌL¼ˆ(Iaö¾‹Åµ‰ñðpžo“é¦^Bчü1éJù˜¾I~;¿ùà*$爲AàÕO?pÀ,Äѽ´s;ž¶gÃ$ŸUoî_i¥­²H…”Ez»ðÿ(òYqÔŸ>Êž 8}4'ù/&L2¨—T`=àñ–—E4ÏP`¿k3gÖV2:•,YaÈô–2‹ÐÜö?Í#éjùå =ý¡S%DH”F÷ÇA§‚S ÄáeœÇtkU = @̹1œvÙž™˜£õ…ã£\¾ðYŠÙd×C|°G&Lòô°ß¿½'SN éBL«ù¡U¯ð‡| óº½ï ‘á^€ ~ÈÎpŽ¡ðÞŒxò±Ë¸YÄcÇ{ ŒÛsq_àõ¥iÚýŽvzÜ9Œßi³8þCt_.{Ϻ/ôÙµ“4zêÒéÏ£ñ80'©>w/%ß™Ó¹ß å°ôãŽðá2w¡>$ëã¿#ª?”4œã%§Êš>åï™âÀùž) f»Ï‘z¸ìÎãûñÊÀ“úþ`Mäækô«éƒªäG]ëîóáþG>,þµšéGM%øð/lïæÖûàßù9ù]þæ;f}ü#Ãï%ÿ^ÿéþwíA÷?'èpZ?ïïc˜(ü~PŠ´¼ÑØ÷?ÍâàÞC4&î"'ƒô‚¨\á#c…|š°?FùToÞo<÷é¤ èi\:A|@”Oé€+«/OOBULB*dÊ„€·é¨•ÖjÝk„‹HQóoß¾îë%U!Qáq$fÕ³(±±íR[k­5NÁ"¦ºsíÜŒZÓ“áiyQ%a`oˆÖu½Ýnû~‹¸,RHÄk­Í=ÄÚ© ÊæÑõn8BÍ.OÕýz»:âåéy)Ku¿n×½Ö"’êRn@=¢¶&ÌfÅL»µ¥6¥þp•çaoÞ<"ÂŒ„Q.ËîMZÍ´ìz¹´Ú""Mâc"N'¦°"¡.³ðmì5óBV½½]áQÔÔm3U*LDùÁAÔaÙ ëvѲUÝkuoOOÏÅ´¶ž6èXsož8ŽT#"Ü´Ì!žLլIJl7¹Ý6¬[†¥¨-…"–eæÛ¶eíØ ~äsèð2åÈÃÝAèî$Ê'@v÷@t·~VÕ3X™®ûm½覛š=].lû^k5Ñì`ͬ€ÕþPÍÌù‚ÓO³šU€2‰’[ÄÝ]Ü??=)«¨j1¥w~ª“" D¤µÞºA›{ÇS¤ (²,¥+ëóRXoÛÎD·ív½Ý¾¼¾.¥,ºšÙO//¯·7Þ·§§§ËóÓ^ëËO/ÂN¬¦À”(-~yyyZ.ìµÖVóñ¦¹›êm¯¦&"fÅE2Í” r–ô7f÷1¡¦9YMU%¸yx4aµ °bÂòüӧ˲¨êÛmÛ·Mˆ÷m•dÅ$µ©ÿ N ŽŒ üð¥T§‚ˆmß/O—!²AS Còm²H„Džƒ\¦`Däâ@D  ÜjŒ_¤ª¥ëmß«Šp)Ù>*vDT4ƒÒ•Ÿˆ(¢Á¨¨Y .ÔìÞk oÃw¯½€A8yÿ¹¢ ³Š / 4a¦Zc>e}úé“©~úô²ïõõõ+:Qº©fÉs IÌ[¡·öæþüü$âÓ:)¢Ü%c¸··ë­˜˜eìjÉ«ÚÌn*Ðu»^¿½½­eÑ1ˆ^c‘¶×7ÜJkÙbªYm½ÝöZ÷ëí*"?úôÓÓº·¶}­9¤pQ+fªêÝ)z»Ý–¢fÚª4be.¥¼]o¾•tlW6€J)­ÕmÛ­t¾szî!"áÍcFðÒO"ÚZ=ì7.T/T½Ia¢ ÎrM -«3!V!VQ%5Ë¿È$j…›{xPˆ0!X uß²¢ZF»† “ަ( OÑ'HUD¸…ÃU1åpoÞzæ "×ö4˜3ô¶oÌ$¥Õ¦½–ÑrÆä9ôšˆ)´º¹s)*œB(KC­­n9"-Ï—çço-šDÅ‹ølëTÍËÜ`ÍÝØ<"±Öj„§…cxºÒõÉ¢š'«5 Õ K)ÜûaU ‘ Ác¥Ÿœl¦ð"`®û¾ï›š 1‰³Ôªºî“Ñõ7VM—*˜Ô—9$põ2ÒZ¡€ZbÍ3QŠ#ßQNÙXˆÉ=dèÕžóîÜîä´œF›GG0"Ç„wÌz Bú4ÉH dÂ,9ïo_²g2ºÕ$]ÒÉõ¨²µ¿€)„̘Hxõe€'³¦²#¬Ä-ÍÐÄD‰GšËî\Òš¤¦ ž1´,ÆIJsˆ@Hp¯Uï2"ñÆÑS4·Wô6õÃ<›A2ê;»)êÞëE”-pP=Æø8†·:‡3ÄÄTƒ¥æaNŠÒY#•Î"¢é¸ù˜ö ÝZ sécdP A5ÁLÔïÔd³'w'éº+Sð¤ÿL!&ï='Nx …}<ïðaÅ¡raREÁŒF'ö¨yäáŒÄìŠP¥>¡çˆu¥ZÛÜŠ2“©EN¹˜=»Ê„N¬r"Í"/÷i¯Vr°DÆ×¿Ï‰ÐQ›$r¢ŽÄ´Å{О.Ôèd{¦ã‰''=”=ÔÀ'‚(2:ö¥=®Q3%騔Œ=eùaþ Lä>8»¹£8(üÃF“ 2Ñ1P}Îå¶Ìƒ€³Ux,ùc„ž IDATœS\CvŒø‘ðÄÉgC@/˜ÃC[?Á¹ÆWé¸-ÌbÛCy==]Þ»ÝûmÅ!ãrË3>è’íEèGùÔó{DªAïÈ;0&Ó²<û˜ Gj§«æïôÆÓã6Ÿ¦S§ê-,t¦õÿÓ9óHîÈ|‡ÁÀ¡@½¸“ºøìgÏüà >F“è4&5s–Ρ6G‰y¯¥S‡É™Ï.8¦Cg‰sÞyÀâ(ìC™‰|Jƒ†*'U¿ò{%â®P”™‰¿+…ñG¯Å>õÐB‹ûlÅIܾëgFgJ|_çÂG“ŠÓÅ zo”?Î÷ã„ãcóÁË÷¹þ—î$qÜç†à=5}âôqâZwd’S§.ŸÇRôÈúÈ©ßÉÓÓÏü‘r{ÌÌpjœ¹?tg ÷Ý àÔÆ fì&=ÏîtOöóQÀsT4«±º§ý(©?_1A¤ïJXÞez¤Ð«æÈQ÷w¨Çi,¼2ÝmT¼ÿwÁúÝ’……}o•üE “@³”.=2b* AD­µbf¶¸·€×š9Ì íõ {c‘u]e]YJÿ53¡£`0›o“@}/hÕí,B÷•Ž:º¶˜Ïë%>ù¾ï·mKœAððá®È–h^ŠE`ã¨s?.—‹‰æ!Ü·úôtùüé³™n·kV˜Óá £¬D*MZ:/H˜!œ-‡î®¢¬ÆÑ…H¹,—eñÀçOŸÿô3]SZøî{ôè,ɬ‚j &"8‘¦?]Fe®ôÜ:˜ÉÛ7aɹˆ²ˆ ‹¶z£ ˆðý"|}½FV¥ݶm‰P³ŽOSÚ1ÑEÕ mÛ¶m‘u]ò»·×€ÅJYJzÈX4¬¸Þv€¬”8L|•#VÌB÷0•eY¢²<ÞêmÛ÷øË—¯A`†°Ø" 5añ—O/úË_~Û·ýùé’ŧ ‘êÞÂUÔÝß¶kÑRÌÒ’ÿ|Y·½1ó¾ßZó¥Dš–GÕ†¨¶ZCD!oKY8"=%á©ÂÈŠb )Ò Õ;Ú#¼ùkÜDØ îáì²×=QH©•+«ŠFD«5AÙù%î&#¦DI˜È̵¯Ë²·Šƒƒù²®ìu75SÑ¥´Ö®·5o4ùû¹l‹ž7f2+ˆPI€F¿¢#ry=BXiª‹ð6Z9-A`5œkD¸²±²Q'±¸{Õ2Ð@G¶šÌ¤5À¢ „7“Ŭ‹@$ÛHˆù¶W¥”ëõZJQÕ¤Å%)%—î’ÜixÝst¥”q™ èéÉJAD«-öV–b&ÏüõëÛ_þŸ¿üÿ3_žžùå3@Û¾]ßnîž¿ñmÛÝ=¢©š°¤7½˜„g‡tYˆ¨E{»nk±!cÉËËsÛ¶ÑèÙv¼eñϺ¬Ûö*Ú¡ÔLzŸOj¢ µÖ<žJòFÃ1K"iõTÓlÉ)©¦šH8(«Lzò ÞÒm›2‚ý\ÉY˜•œõàí6aSÊŠš\.@–°{ s#x­™, ÀÉ…ˆ"¢¹''.+¯·«{„¢…[[(›À€$\ ¨9µž`È´™YŸ6™°™¦‘+ª©†ÓV7›(X܈5ØH„¥R…ˆ¨å«#Œ$‡ŒÌÅ4µL ‚UÃ4TLÍ[ë™0ž“ÚÜaiÀ:[„ÅÜ +isfRQ&cÞnîðív]ÖUU™)ÄTŒˆdYD¥µØkEkš‰=Nð6E¢tT%¿ÄÑZ]\A*’@•„‚aØÔE$TY™Ä˜£DdÂ4椼û%™2ªH`âàÌ8ôë‚E0„l:6óÉI+!Î$ê +•®e’䨛˜EB*ÉZb0±‚X3 Ò#µ殨 d) ‹2«2 g50§J™]D©o;PI/abâLCtá}nÊ…™# =i½˜Î‚Ót¯GîxØifSÃØ‡ŽâKG¶Ow[è;àa™½³H ä©s"<{ßêØÅvÜùhÀì/:l†£Á˜†BÑK*yè@ŽçÍ œMÚ:‡à0ÚG/µ¦êÙONy½93Ó áÓAj—’îîÊ’€HÓ Ó³8€çy"`üIÇÐnRöÕÑt_žÇLt) ’}«·knÌòĘÏ¢:QÞ5‹vxªhrü"BÕX8šGÇß˽ÆÖYƒœœø"αª2È3g ÁHÁvˆ¢v :tÀ"ƒŒÔg3Cl’Œ%rê‹5y¸õþe%CŠ % ÑÜ©Ãûµ'"" 8…¦"‰f w}Å3¤˜04 ˜‰4»ÉÂAJ+̲ӅZEbÄT‰'[w~!Ü9Õ™YŒ9B8;›ép¡ßvnÏ´Øw< .Î`àHÃ?ðÊùDÿßiÑ8×sÏpLΠ}ÆPÑÑüˆà#³¸Òºv±eb °fYƒÜó3†)‡ë¿gz‰Ü²ù<2(1çUŽ„.RŸjf9¿uü ÆžygóÁ˜îåö‚;ä ñr 2OƒÜ©¯Çjù³zÈíîì°<ÙvgvÁHÀœ”†…gCÜåé©55ˆ9{rdõôcøÑÕó@·Æ MÊkŒŽ{ƒö{¶2Ý#ÿù½¦úà/Ýý0Ž*ÚûºÅ÷äœ\«óÏåQ¸¿™àì=NÉý)$+žsß‘Ïæj* sx„?°ª?¹Ó]­çã=•Õ²¢WÒ"©Û¶å9KË?©¨¨¦Ä¹.…ßäz} ĉ€PÃ[«ÞZQc¦†}Û·Ûm#fÓÒ]½á>Ø&Ù=Ý—ËSb©÷=ë‘ KD„„@ˆD%i)¢ÚU?gîOhx!õ¢p¿, ɲïWbïÆÓsK‹°¨ä @‰:¹(<_i,«ê²X­UUJ)Ëò3€/_¿äU¬D¦@µî=ˆÓš¨¼]¯¤èF|Íÿo¶t§+¡¶æ"â’"aϸ$q(© ù“Ëúôòôôütýu-K·á£µV[Û·ÊL///?½\Ì–Ö*3«ZJ3JTL„%(û]ÃÃÁÄÛ¾Õº K)¦*žE¶,î­ÖÚóüšdˆ¨šÞ®×eY—e‰È©0Q`‹ps´|ßc¬í1æ ‚€4 ÇL ‰ I ŒbJDÂw‘ý)•á„£Hi8z¬· °pb°#ÛtÒ[L ²Üo ë¡l3+;L6ìé¬Â"fšíÁj€S®tF”J×",½y(G5ÔÍab¬ˆ®+…¨¤šmØ YêI$fýp÷]Ùt{ôì nšûî´-Œ]îÀÛLœùIé€ïSÏbn½9@ž®äé]Œ|‘˜žNœÀÅðšÉ^7€A5¹Úë¬ùÞöÐßQÌU!1ú ÌÒªô?oBrÀغ ¦L]õ'[ ïñƒàn¶TÈ£—$©Jÿ–Ç(ö* À2ZÒ\ÄÓ{~_N9>e hBxÆ ™žæ,ž8lß³ÕºóÁ{t…Ê(žpêw‘á!MSŽŒn-í,VF:z€¥K¦i"éöä~£Î.¸ãVùý;·L²(ÜûWFtô…Œ Ú.n˜<›ÂyXå“-Öͬàµ0+få‚£³*NÊix­1Ìi O&WkÑ;l5s„™çY‰ÀÌÚÓ6œÿ½S[™ª(X5—Ñé…ï5®³pÂ[–€Ð‘(¸C¡TmÌ'MÈ%tºIêôÉ^Ã~ï'ãcú•7S®ñ‡ôèø§“}ƒ'4€OÃdTÎ ŸTržÉ”ã“s"§>³“i¾“jé.q¼Öн1SD"Ù4upÀ°{›pV¤@û¦"sÔ3&*ü¨nòY¹fžñ›3eLOºÒ4EN’Ú<ª|Ìzb^èaX3Lÿ8OPOGXøh«š‡‘ï—‹ÑO§Ê‚Þ~—^:Ñäs—tŒ‚¦Ãw =­ã0f?¢áïÊb~¬•ñãݵ»>¨à|'³¦ÕCÆáô?ìÝ»>½æcž…î,æ˜õüÁgÁÎæ¿òYÏr ­°ñ}s–?ƒÁ§ÜÁá»g¼ó°ãþº¦S%ÀéòÜj<`-€ènPƒÚXyV‡¼S‡ù.913;=Õ„û ãûëú#çù‡-Õü}Ñ›,RŸà&Ò凅øÝ…¿C£ÿ—™¿G‰úqð>$ˆÿßþø^,àò>zϺ ÿo®öól|€xønAáól€&¤ÿ`ì$ªSN¹ŸÃŽßÃÎ$G~)’ò7²?,ˆaý@7äÐØ f ¹»f¨Ûiúˆ3‡»Ð8_ùúåû+…d-°ûG8¾îq×€éúˆA:3³˜©GƒÇ ˜ùƒ;èןùá§N Ÿã]4á0“˜pºÄ{(ukvmÎ^)H”DÅ=àPÓ…Ö¥,‰ìOˆ (öº'o„Dl]µ˜Âßö€Ofªšyy"¾\.·Ú„3ÚÜá|̼3S3Kì{žÚ¨°2ÇÈÇ@“§ÒŸ&+7³ ÌTŠÙuݶ*ÌËRŠ•tŽ'Àd]/­UožOá[ J±n’ÈJKQáPµ×·×··Wx¬Ëêˆh.jÊ]œ»ÚbËçÏ2µeYDdP¤;–1ÏgŽC‚HI]G^“JºGk ] 'òPy+?½ü´Õ}Ûk!ÐöÚVd¿AŸDÔ=(^lÀûò€².ÍÛív¥S ñº.///ÛmûöúÚÜA.ÙÃ8Ù}MîÁ¬ªÔÚþíõ5-ÏÛ¾ë*ÝÚEt2¹} &cYLA×ÏS;<½`fÒ¿æ,ª&Þ¶Ú™B„M­¡m›·Ú@@#3HU) "ë²×{9€N"ö}o­E×P¢µª&jEEàÒÅÊ®û­nLdE3ò´jõK?35jkÕl)¥ eUìÞ¶ÛvÛoÍc]Êe¹,¢,ŒðÔñsèàX—eY–¢zÝ®îmª#¶,Æá{Ý/xV&PlÍ/ëb@mÔš‹ÈçOŸ‰ùëë›GèmÄê )L­!4m}KÌÈèŸë·'÷4Y.œ¦léPQ% ¯lÛ¦¦OO—¢Ö++^‰‚C¥dúXˆÔT|P’<Ü]XºxÒÞE«`öˆìüHe?iTʼï{.Ò1taLmmˆpJþ{ôÖÜ>€Øj "+J€©“×È ¿÷i¢˜‰™¹{eRÓpˆ,@Ks¬ÖXCUز)–XͲ´0æè¨ôÞå˜w_õZݧ„ã¡ÊD¶ïD{ݱÇóËO%ÛJ>#áDÚYI˜=¸ÜjõI‹óò’†¿e]Â[ jÝoªëRþôùçR~½¾ÖÚÞ¾}©µ-Ëúò|ùÏÿoëºüúåëx&F15]³­î3]^kQS»m7¸—u]¹0Ñׯ¯-“)Z_–EEäî-Z±òêWî×D¦v”_OM@†ˆ-Ü/O/¥ð `ßvˆ«*H¢6 CUÄTZ—±)™<*@ :¤¬Z[„ÌI@®rAäîQªÍŠ™p7üæÉÖ–Þ`FÅÃÓ6ne1Uo^Ûž®ºpE°M4ëëSŠHG;¢Š3‘>èʇjeV³Ž”êa&bâðÞW•jÝ÷êP¶"­‡¨p 4˜jDlÛ°ŠiZWBœ›{«ÕÿyoÛäJn$é†G™¬sZšÙ{÷ÿÿ»;ÓoUd~?€L²ê´Z#Íή­ÌdÖjUÉd¾î{X:‹¸ÖI‰Ûê­CPk¥°÷ì 5À «Å{ïã¿î ÓYêd™µ @=hµ@äþñh"Z Sä(g )°véª11ÃÚ褖ŠxPZC­Ãˆšu…ìô€ªX¡ÆU)'¡â´Ó™H„8G^ÀsEAN³æ¹ßž®^õ ¤'ÙÕZ @‡K¯†éTXÝI™¤"ªùžlŽ71†9„I¢ )RrR•k>…•z(A²ù \¦o<JXš’“•¡+YÂëÙmu¶à„Õ§ oÈ‘|Ò-F¹¤Lk+^ä¹+ëkÑ™V™aAæÓz• [ž—ÌPåɉ™ÂSˆ³T$>è„fEç\á&æiÑüŸŒ¡'hTVžkšVU!ª õÀH⮀1þ¹m"PjþÈ@0†s!«Û0 R(“Ï̋ʓmGé‹Q5ýÅ ’™áh†þ7Í%x%YŒÝÕùSÃ4Ìî€ðh9Ýö„”-¦Ë‚õMNËÙ-¶¾T?zxÌ s•?g Ý4Óœ"!Ù(CC\ÐmƒÏ%ô,ê³ ~ÔOL-eàǶ, pdÑ¢·¿Š”A¡Ä¸Llkä1œ~• ̪†ì—.ñˆˆ¶ˆŽ )ˆÓ{½v|¹û” x´‘åÔcÈ XîJGØqüJ&?Ä]PF,q´òÔäY_Å\BœÝ|.<7Ó €E7œ=ºÓ=nñ8¹ëÄ,9¹f¼2’s“¼lÃkËv1Sójï¾”Ü A_;ãlË (jz‚ã&ˆ—F¾ˆŽsd«*{œáË:ÏˈCÎj†'>JŽ­®´}¬:¾É9Jñ#µQàâY•WæÊóèòÙ–¸d€u·L»ÊúUy¶øÍþùd¸ 9Ç´Oêþâ}~΋Ð$_ûùÊk:¿‘ùÄ/J^æUz*»}‰•Œßç ’é:`Ì+þæZyfnžͺ_2=O% _±“x‘þŸ§*ÏSàÓ”Ÿ­Úò<Þzuœ‘•y+y‘wŸC v²žçaá—:$_¿A~jÔü}ϯøÅŒæEN{Lý“ÌàŸÇQÿ{ûÊñ§æ\¨#ËWy¿} ñç ?~+üÛoí¿0ð¿Sª_†f^ ûŸ-ë\9Í%X±¼Ð ÏÂs†¨]ð~#Ÿ½0úg¹×ÜiˆêPíq5Ë#@#½«/~ uãžS‚È…V¦ž§Í^Ï!½®xÁØGéB}&_¥-öÕÌlÝŒãí*ê_ç—ºÐI+ð9ªyDžiü· ¯“¹’|9z³ ö2ëÔ³tX÷mWÕððQ¼u5»ÝnVkÉØoN DÒþ¿oû¾ïiµ%ã·÷ß?~ïáR,÷0šVùôÝ#DÄŠA4uÛDlt¯P}û&?zôQLVKUDÞº÷Þzwßj5³D3«ÖÖúqÛ¶òþññqÿþýû´[”b i«jiÈ”c ­t3ˆÞ<$IU‘éx˜Ù&Û¶m·}wpŸ.çqÖmu{ÈÑ[SÕb¥”’BáÐ;ƒ1+qdà‡Pa[}ûþ­ÿæÛÛí¿;ŽC­–ºd.LM€¨[u÷ÖZÙö¿|ÿKˆåh‡÷ ¨ÔŠŽO4*yG¨¦O IÜ”áÕNt ½ÇPÔ$‚»™©ÀÙÜj™-f –õ¿D‰ÜPÍo|Y]–}-³5ÝÃýQãüO9ôðQp ï·ÛN¨™U-Û¶üD,ÃdCDZïãÈIAzw–(µDˆ«KæËA"ˆΨ¥j­9SPŶݠîH‡³M S&ƒ"zôRÊV´Ö:ÖQ=T%¼w)6D[1SJ|Ü?>YYM¡K1’¿µûͶÒÝk-Ayÿx¯%!vô£–ò¶íïåÃÌ<<}ýEµˆ…(BKÝÍ­ªÉŽÀ𽇈EÔj”*q†šmµ†;"l+Ùä\ŠEªß¶y¿´Þ‰d#%C!Ck`mz§K$㛑"é|4÷œ]õÞ—Ôž8øtfæR2ßß X5µª{wU…™÷iЛ=Éóá,[#¢…CŒ ‰ïQª© Z¸‡G®2Ùˆƒ‘áÎphSýVK%ë\B·*ñ ªPP¬Š½‡ûxü+Rζ0@Ô@…ÚÈ5÷!a-ÅJ¡0’Nýo¶€ …¬T*›»!r@›h³‘4½ao ÆÑCJí½ °I-fj&Œ§d¯¯‹Ce°·Gç¶šY1!ŽÇãÑ3BÂÝ#‰qVj…ÈÑúñxƒäýx°mƒŽúÝñØ€XÑ"*”Gé-¨á˜M†EõÞš÷nfÕŠBµo£áã¶m$¤÷pw‰ÓL¡ä-¹»„8 tzH) KèÿPäN«ÉÅIhÈ;bdå£x8ÓŠ²ªL®~Õ“Õyk*V<"zöSÕC­¦*„ðS¤‰|r,†ÕÇ O&hê0Ðy÷1IÔ Á=$Dºp ùG>–«¢*ÀQ¸ªè…­MÒ?/ãtx/;*RZG^;2ÓG8-é§[xäøg÷0¦6ú„È7í¡ fw„ÀèM33y&‘—K®ín',y ‡ÃXªgäàÙª—ÄˆÕæ9è¤.j.†U~Ü$ó‡ÜÃÕ ¶…dê+ß‹¸#Äg½5 …•l!Š@6sæ@,L ŒFÞíÅ<Îk“òS}ê*p¸H°”`$ù_ˆÿ“pg@ªŽª[^,Õ‹By6NÎÍÚGzf«Gdè'z㓊ÓW-îÈx`SGDJò*¢l¾FíeôÖ“Ø­CRœëB(c–*3ç[¯ž»>Új5˜ãD¥³J$/£õÀ¡xžÓ•ŸŽœ\½àg X”#‰éÈžÍÍs/9ɶ@‚ãÂo` ‚.Ê ¡æT •[ˆ WÍ£ØÃWPÜÔÒ•ÅgGÙÓÁÙ~±Ê—ÆK§öBäÔ¹ç@a÷ã IDAT‚Ï«ï:®gÞyáóY_£Æqðb%þ}Žô.²<‚TNúDñž†'ô8LŸ>DzÓ3!©³ƒûZµq±¬?é—š†”ñouœ`'vâ¹S÷K+º\qÆüBØ|–×SÈ+€<ûFÎA3úɉ6YK>Æ…¿<_)ö¬_å•À5>ÈÂSÈàϰnF×nÞë°åY}ñ®¢ôK¾/ìÍÀËÃéÔMˆ\ÂÓ?ürÞ|þÎp5œõµ}ÆZð©Çø3ˆçU?Ûø¢w_fL„Ó¼öþâŠzµ½óz}ž‘ÓÍðªwâeÖ‚“僗ÿ“^v…&=!›®^æ÷“¼y…YáO©™kˆÃ×Z‚‹ϧ€Ï±gtåõ_O>élÄ+ßÿëw¯”g^>äXºýAëÀ¢ü€þDï4YóïÿøaDæGï›ÿé";§<Íÿîî|€™þzxçØ/7_!°Y´&2,&ÌGp­ÝõúèÌ­å°üàš” MËÎ%Q'L/懴çÛL®ÝIùçÈù8Ä@]cYÃ3ž´vѧ]ŸN€avÕ§Jì'ÎôÕÓXê¥2áIË_vÁߺ¦yivš?Qátj„ôæ­ñ0U¨˜DŸO ¨*W3PŽÞL¯8=# í­{ÿ­ßnÑbµÖbömß«™L<ôÐñÛ¾·Þ“ÝŸéÌñ»»gò<»j#št•'ZïÍ}Û7ÓºmñÞúýþ(f¥X<š™Z±K= "ÌlÛ¶Þ{D齿ß?ê^M5ÕÓ2yzö³Å ÊÜ.¹j´Ö"ÜTµ¨¤GŠt ³^UÝê²9CjVjµÔïD²Â7½+'€–Rê&ªÛ~ƒÚ¾3«%ëV­XÜïªÆÑ®aIƒA-ûV=‚oûÞ‚"¼Ý¾¥`øxïG»ÿÏŸ“¯‡‡BGí#2|:>ÝRPÑPÒ£µnajá‘`¥¤T÷ÇLD¤n¸Yíáé M¢©D²>óÜM^´¦ÞùxŽÇñ8"âÛm7+)XE„']ËñxÜö½XUU3ƒÈV+éÍqôæ=¿´¤èô1Œrºjކª£+dyýƒ@¦P"ÔŒºÂÎȯ«l±R¶ÒÝ·b¥Ò`µ>Äé[Ýömã|\ÀUMGk÷Ç¡bßnŇv´Nº{f´[ï½5¨ÖR¼»è°¯™ÄldDÌbú6/ÂÌ´3‘{¸»‹X)@`ßö£µ£y5mÑ¢ªƒÝ–õŒèÒý(f"0@M½©" 6 Ϙ_¤÷Ÿî1ýq#=Íê]º!s¤ªøVë]í8Žôƒ«¢÷&‚pôv{SlµXÒ¾EÉ*¥˜•lOÈj 3³U5µǪ„C*¾š­S3?އjâéîÞn7³""ïï?ÿü3þíííÛÿ³‹`¿íî~GËfrMîUÞS¡–%Él½³8§”R%ë&ÇxÄRµlµ:{•RJæJ28£ Ä Ù†”ØÝ,†¢…†­n$[s§ge¸{>‘J AglVY$éL­·³L`þx¶[>ÔuŒà ¨Ø(µ®¥0䮡Z±o[K»{ «mÞŽjÝÂ{N%=L^z·ŒÝLÿ&E4eúiÙŠˆÄd„»{t…‰fHŽÃª­õ¤‡÷îQ2Þ&jVRâký8ŽÃ[‘’z—wïæV•d?(dÔj¦–¸j 8½G Ì,Ù!A Òr̾m½µETPUV²2`~Êf¬Ôb–žÝph°| ¸ °{ëžk&ž+g=ºˆx„2Ü ñA?ÞTYŠÇ=ºw U1 âL6͸< &[©% –zI,Å9Ge¢@xD„!á:–C²¼Ó]®¬ù³¹¼¥¤½ŠÒ›è.îIB Š ªšªxônË‚¯éf†Šzr}Lƒ*è ¦¬&Â1 ÀT$L4"‡ÔƦ–„È&(Š.‘UÀ AœÝšgæV&¿%9å9”Q¬˜Ãø½Këï ¢ðÚSy²B6äâõ5K›ÀÀyëÅ L¦¬%‰ÆÊ‰©S ¡3VœÈy]ïsyQÙx ø‹]°b+ª9|âCް¼f¶¬¡ò¢=;-ò±Ùé„D¦¢ I•Ð*šíö æA€Å͠IJå¨h”5­™ü!Eóþ‘Ç3&nlœ¾•5Hr:†ý9yƒ9Ï&±:ÆpCÙSm9ýº¢SLQ†nq ŒuÚØ¤Ä4ºˆ ¾¢ú#Œ"í«’yœ4€(Ã/°aHGê¼gÍBÌ™°‡ +–³Bÿëi ª”qæ“ n ÛrØa|¡‚–5òSmËÁ× =Ÿe0s<3¥U,ªÏŒ[DŒ#˜%"ƒ«5þ£¦Œ1„^ ¥¼.áï!_ªŽˆ¨Øåô¸†cb&ÔOhïil×Öl†H†‹ |j>wé¹=xÂÔ¬ÐÐÔ¬—‚ó ð/Îø~$ÜðõÎ~–}§ €‹8γ£|µœD[Á…};“@y𸦬xb³œJ*.¯m¸|«ã´~bè>ÛûåbÞ[Bé*æù×Ç]ÓGBcŒüƹŒ)åšNQb¼TÖhŒUùiÇ`r¯×¬œ3~¦‘󚟙ÿÄqmŽß~æÃÈ%L½†¢"çùb1¿ŠÆ¸ès0¾bæ,ƒùÙ©ý©.|±h_ë`ñÜÀ/ÜÓ‹€OŸñ+¼v¼®0\3qXƒˆ+ï©°‘_ƒgVǩԬ|¾2†_û×2ò…,t%öó ¨¾à<Úº4¿˜B¼ž28?=Ÿ_‡ £óS‰ðSqÐŒE¬ÀËN~X/fwx SÈ ýr‚þP"æBpøi©ü"uð_~á@9ü{† øÛþrþ Šñò“üFðƒÊß—óàŸÚÙða Àä´¸ðG#戧YdÊwã6—é53™°¬V1úùóLpÚ}’„2:„—i~•ª_¦ô ž¥ù4È¢ЦW‹º3§ :þŊʉˆŽæ–1Â7w|àñõäÃÓ¯iAÎé%O¹~è’#Ä (\ð|Êgà’Î8%­]AÃàÅ›xEr‰e‰¡9HþÆ£5'8¨¥îÛ¶ï7g$R?ÕpÙ²š5â~¿ ]#ÂDÓØ²Øý ™ÚP‰1Pö12«ûjd—µ–¿þõ¯¿üüK;M Ú=›ÙÒ¦Ù­w‹=V¾•‚Z7Rzë¤|Ü“Mac *P-fá=I<µVINhzჽ÷ì0,j© hpl“ùÝ×RÞÞn÷ûÃï÷åg—áRÖeãPŠyrEædJÖÞ¾ÿ—ù—d:«i*ì­5ÛÊÛ¾›éýþxfÕ Ô†ú&õq¿½ÿþööö—¿üdf›m"òÛÇï÷C¢çæÇÝÝ{8Cº*LTM9yP:öÄ9%sD„š ÿ/#½µ=¿) =ÜB¿½ÝšåÈÚr`í½=BÈ*PÕÛm÷Þ ¥õáƒïUU™ñ6¸CÁà8s µè¶m®JÕô"åE¨&¾ã¶#[[#´è]J¥Ðfc™ÂR)ìf¤ö4¸ .‘°†´Ã‹)=<ãýŒ Õlß·GkÍãm»ÕbÕ´{",à¤QM5ßd&:`¥fÿêÚ_™Öïo%èÿßo½û_¿ÿS ªº{´#Gbªb¦Å”4{3¾hj^½©ª(¼*`(è¹ÑÌ®6[)óq« Q#Æ6ÈÊFOáD•(jf½ øèíè"¥Ö[ÝzJkrŠ0$·mwÇãÑì0 Å˜“ijfw=fÕ_Êý""Ë6¸b£D o¶=(&AµRBš»‡wW†O;^äqCö BÌŒp@ès_=ÿè]«ee@Dô.)ýç}Ðûõd!ï]:‹ÓdéÞE /î."¥”ZŠª¾¿ÿÞßo7UK„·‹ û¾³Rª ÜÜP«'í4öÞǵ”`¨ÎBuUÙ÷=ñ¾mÛ~û׿üåß~þùþxÏx»÷Þ÷}×qê¶ofÝ5"~ùõ—Öz±â÷Ç2ÁEPF1‰¨j©5›KÞ9ó9ªjRHoý`ضm[­”*d©Ö»ßy€@~‰"ôè99.º4-m½7qtÏ“TÚˆ.DÌJ-ÖGØ?Ñ="RˈG°gmc»;9ø9ÛS—íqð²N÷¡åh=,j¶×úööí·ß™gx4怠˜-ètzÀ†Î¿£”¶ Ù; f…p¡˜å­¶dÍC;Zó^Õ’x}"2?âÞÇ쩚f5 ÅB-1 àbž'RŠ÷Ÿ]1“÷2D~²µp´vT+î^r–%¥ÁðG;PŒB…íÛ­÷ãþq<}³³Þ`P˜I°(pï},HÆœ%GGjFÒ½+äè½h à ˆ5ÓÔ‘AЦDóoSôI~̱¨jvž˜P"I=©K:ð¸éÁGxHŽ#gÕ2gWå€LŒ©N14 ¡ ¡î"=z(@ƒØ˜Š”ƒ"H¶^ €’¸pЉ¸†*š)L u ‚~€Z]ØBL;tJº»ÉEFExªo&¨#4D)êÓ² œ%¸“}A ™”$ûiÝÏ3H˜Ý£Ís¶*&sN ®9ß)\:½TTÆu*6OøÔÀfy2"(*¼J"…ïXjVw!•QPuH÷8á'0$¾:Tsɦ–+aJ2CJ½ÖÐ,ˆ:Éã ð4Õç]bñùì+£‘Úez_ E“Î$á¢:¥Z2¤eÕÄ»³¾SÐ?èùœW]ËÝ“òvÂUÛrMDñ~ÁÑÿ¤öž³;>“xð̾øÂçëÂËgz"áoÃkø4Aàåuþ„Œ?.Ñý¯6‚ÑlñÚZþãû¾c~ tü@ÿF_BÄðƒ¿óå¤êŸø?}6ðiô<¾æå¾·Rd¹âÑ/¦çD_/5À„pXœrÇ8—FXÀÒaÊ0Áð"=wÓ¯ £®t“^ΊÃp½Q"[çÎÏö ¡ cèyÞyï½4”gñáJ&_YkNŠkûú“bþP\Æ\þ´§I+Ÿ\¾»\¿HPJ@(>Š'»NÃÙî$IÃ@IB8$ÂJnáÞ¶ÝÌj­›ÂIJ-ù@NÂOŸ¢ªÀ’%t+Æmk½SÄT³COm9oª›¤%>W­nµJMBæ½5ù~ûæÝÿçýãh­n[s5û–ÞÕ —Q“jÕL“¼,bï@·ZtºÇ‡íG-²K¬Ü÷ãã3?n¦PµRF«©ðèÞUG·â¤ßfíp/~Eu§œw¶(™Hõ3mqPx¸ö}/¥ì{5µÛv» $Üïw˜X·íÑ›4!¡f0˳-]6VÊýq÷àV¶£·ÿ¨eÛ¶MÕÜ{ŠIÇ‘ç{K‚•ÓO‘!žŠ{ŒêXŠKj¦äï¿¿'ª§9»÷”Ñ¥nÛvË¥qïéŽÏÈ-Óÿ¾mußêÛvûåã½µf[5Q÷èÑb€@Ë„]‰@qÇÇ㸛–Ã!D{`3ÁzBuIj)J¦V+"(F6G¨2K•kŽUT§†)òIÚʲ:k¨+“slŠ,u­%G> Þ•b¦{©Gûù—_éoí_úK˜¥XÍY˦JNÌb&ÛM&Ø÷”RŒD÷P8ÊV»{ 7-G;BU¹?Ž™i€B¿S-¿¼¿«YÂ=à¡*îj„T49´1[é‘‹ÐiŠc¨0²ú7!ä:d…jbÛ6w7³t8z‚ŸE’§AÈ^7U<Žãý~Ü%!ãBïnfHD­(û€Ü›Y6—æW–Ê©ZJîäŠLÅà]1oã ¨ªysêíÑšgyÒ 9;ÉqÐìõ•á¥@Ò•?2©”ÌŠ(g}Î…|·Š$å×ÈŽÓ¼ÃÞ{-E€mÛÞÿíýþØö=ïA7S²gÿFÂZNNói‡ID¾f‘…»÷ÖS÷wï˜È¦I Jð;"@ë}ضÈã8ZëB–R²°ÁLkÝ͘¬¤l8zÿíý# ßsª± `FE¹Õö¸¸}»E÷£7VÝÁ> l©¼‡û¶½õþ{kÝô°R¦/óÉ1E2DBc•GÏw§0µÙßÀ¹ä,ýïÒe5£Ñ /nç‘‹É—¢J=©`èósç·vÝw » 8µ1…MêÒôïê¤"-˜åbê¯êª »¹å_3]‚qLvhfÚàyvÌ=öžäýq„Ͳ8CÄr+_ÞD:¬¹jv7¯Ù=1+#‹Ãsø¦'RÊyÞä,©ð*'e•`Î‰ÄØÍòl\Í'Vß<‡FVtfUd¬?:üSÓ7Z6p Îvð©8ûbU½hgÏä¡$yMÒ?®Š ø½Ð«@x•êxaõN¹úºcæŠ*« –ª 3Ã#®ç¥yKÊŸV7É+aœ“£õcòˆ.=ÅÏrî•/ƒ½ª’Š1’“§¾Ø¥Ü1ãÙg¨`Ådž?ígèÈ™]²k®Ÿó‘˜À'mÏ8•%$žj†ê¬Gž—^¾×DVB1v7ÀÙØòäÄêyÑw×y 5#ž0ۮ儃{|cÍzyç/òæÔ,nñ‹1ýó(FVaÀs–àyÇp%&FüsE+®$< ƒìÒ3;‚_k´xXàUo|‚ð)ô~5-À'±òIÀù æÿm²ÆòÏ5=²¢C8¯q¼Ž¨¾öc?IX—Rá/ÕÿëÛÅ4+žX£A~vêãÒÕ16ø¬ýâ/¼œ¼$2ä%‚禊§OñIóý\%ðJŒÁWGVüæ•Yœ?pèãoM)^Pø¢–úŸè…§\‡(øÛù?~yü ¼?þ®¿øùÿƒ&?8n_D†ðœâyI™~Hè]ýæ¹ü˜´~ά›Ø˜éŽ À„É9çºÝÄI‘\.‡˜Ä ¬õORHu è:ªëAà Áç…9àŒ¯}æ0ŸÃmK ù¡x>0c®Ý¯50/Pº±Þ:Ñ Ï·ºKÚj’¿|Š¥ñ«—Oßl‰ˆR733¢òPéBWSµ$u¦FÆáÕòÿD÷PÒ{WhAê¶¾m·š™eË Ûˆ`÷Ðj…x=’©mj¢ìŒ‘à Wضm+E3¶ Ò`[­µwO]©D$×¼LFkÍTµj)ªšÉhï)}Îð½Aª ©ñ- ^ÄèjHý –ZJ÷8ŽGö”2¡#†ÙÄ3xû}%¤0$ ÚéöÞ ZJ‘Ѩ)fFR5÷õ0S­E3 !TȾíùó"‰)ŽºÓâÅ#¢¹Üï̬´š‰hÂR‘†V+â¥Ç¿ÿú ÉÖú¶ÕoßÞÔ 0ˆ!¼zi©’·aIðˆ(ŠiáÔ4"˜¥Ç“@NòÁZ ÝÃL%âþ¸ÿü˯fºo; V,}yER4ÓbûVûDó™*P Gi¦dRw ƒÖmKõ™%y&³÷˜å«ÌcÂ"Rj•Iö;UR¶mßq3Ó„¢Ìë¦Úµ¤Xï%,"ŽG[«p‘ÑÓ˜]}˜qm@+‘¢ªÐÿ.ÿÁ_þ¥X}sÖZ¶Zd«½»{–ˆªÀ\D ¥n".Š­”RJÃ;[NýbÛ÷pNi M‰œ´qk#”FÐ#~ÿÈ‚d†£¶@šÓS€¦ñŒ£ŽZ„VtÞ-Ó‰(ªš ±ñ™Ç‡ Q­ÕzïÙUÐ{ïÝ¡ˆàn5éÛaºÕºí[e}¿ÿüóÏ¿üöÛ¿üõ¯¦*Rhº»©’¥H?Úáîº\ÙÉþ5ãº9¨P¤…«Pœë„ŒåVU4ÐÃEDM¤ËmdnÆùõ‘¤¤S÷8ûßç2²µæ¥”A‡PKY$"Ü}ˆò™L|àaDÎ;‘ªC;°ï·Zë·ïߎÖ÷»*b(î=›ëDd3UÍ__ª|L³™©Ú¾CÕÝÍ4&ŸÍ¬äaªµØV+D~}ÿ¸ß#\dGÛ÷í§ïÙjíÞeÐÆÄ««<ùµÈ;þa¤Œ, ©ŒÂæ}çdk®˜Ôj[Ù½ÖäåPøvÛÝÅÌê¶µÖ(Tµ¼@DÄÊí¸mûVìÞÌÂÝ“¶1•BU³šîQÉ^ÙåÇ,°„£»4BL *Ç㨥˜ÚÈ•’±w×¹í-ªAöîE5†Ò§’3oïsUÁ 7 ­h¢íòKéîÆX"∡XÚT¡ XR, LÜ¥ PB¨DP,[?v¯,5qm95Hu±¤oœÔ Jµîͽ«êoïmÌãk±j¤VÎt¶Tçùf’”ºôûO¤¡Âv:Ñ8ýÖA„®¡ Db°”@¨ˆtL‘*– JB‡×m¿]œ>=É:ÌÓzF[áÀ†pIS9Ô&ž{@þ!…4d6Æ“ö…K(tA[ÈÁOÆY24È×XØÏ¹`ÒŠN6È„ŽºÓÁ_Ï'ÇÙ0މç«g]‚ÐôqgýÄìB Þ;T×ȳo VïÀ²œ™Ô8D!éŸH4eä±êÈÓ\(y™Üv¹Z¦$Çt¦ƒCY–ul¯ÒŽB B/%wšùÇ$mhlº:lspyÄ%×_mXTjÉ0'”Ó*0éÛ¼v,ûp̤÷òÿNZ –W9×Ñ1 çÂÜÉŒoÁÖóWJ¡xWÒáêm†D™7uaœÀS-º¶V£Ÿø¢©ã$þ\4̳2§¶˜|<[øç,ñd.-7ÜpÍŽôÞܲMÉ}ž{ˆÕ<…êx WP pzéOÜ^Õ½‹ó‚o_µ סÁÃÇB!é‹Eý4ÇälžUËÓ.2> «Œ"gÏè:âYŸ~!¶Ë¹Eÿ³­ä#¥1‹Ö5}=¦|–*§€‰E”¿’d.l˜y]¯6‰3ŒðÙ|f`€—²ÕW‡ìéÇ›#‹«;Ksæ•¿‚KNÿâãC–®7“@°15Éáۙ˙›röæŽYt‰¨è",ñšú¹|ŠÕŸ~U61Ë>e‚ÎNÎëâÊ5hp)~‘áé…^A(|™`9!yK}¶|!Cžú¯Ÿ;„ÿNŸ6å©AÏОx¥Ð8ø¾AþÇ †ÿ˧?¨O þD>æŠk=Ȫ²ZK”˜+w2V‘þ SìÖÓµ0ö;#(ž+Ñç"^N×®ý%˜Î?"œaC\xÎå —ÁjÐ “é?H Ò§;³^<û|É\¤—M˜œ´Ãž‡¥x¶ŠOCÉÏá^)@ã§Ko=¤n¥˜»T Ð\ýL‚¢šþ8UÍ‚J˜¢ééÇ!¥¸°µVö­n›šr@9SÏ‚˜e6ÚD DUtzúèÙ#ÒR^f«EUMT”Ý饖oo71ø½7©ÅŠ•Öšo·Ûãñè­y),@Ž£½¿¿÷b¶ïD""S£x–œôFšßÇ6¯”tu@·}ï½€/Œª°“#gi§<ܕܠ®®ªGïúqˆÇãîjvÛoAöpóbE‘æd$ú h„ ¤Ô­nWXƒ~xC¶k;ëL%]½#m”vÓjUU zûÑL!do½µ>Xäi¸s/´ÖÜ{ÊRÞ{Ý7l”jZKUÕR­<ŽÇq'Ù{TL]˜bhîœ÷mÛ·ý׈~´_û­–Â`©U&=á*áñè¸È÷Û÷Î6DÉBQD"¥»&î=5ëH÷nB“Tk)ˆ³Âc9'îy0gâìÐΡKŠf¢0hfbrXK2õÁ´NÙ¬iÆ^n7PB¢wï-o,Z‹Q"bÔ ¤°ƒqŽõ܃uwQ©Ô,§E,¡G„ã“A"cf$8›.’$NØPw¿È9yây)ÅÌ’jöÓOßûíw}<ÞÞnãJÃßMMKDë½Ï eä ´•™“túçc0)I¥ÔÁÂ"ɸ?üãþhýðY¡<8øv»}ûþÍ[ïîIÛoîinÍXÀ¾¿‰@Kù¶f»HÎ,[ïÝ]­šÕMÐŽãß[É…b,€jÕQ±*lí(fy ½í·­n aΪ÷Œ…¥C?ÁªzGxDP*ÈCÍ6³ÇÑvÔZÒìÖz3(Í"âpŒ`5 U2Z;Zë‰Hœ*Êl»5„»„•³b”ѽVÎ’Ûk-9øtUXÝš´lÆ€tÊÀ3°y·Q\ªf¢î­»¨ƒ-|´V dÓ¬¸‡x„F÷vtQ¨ÚVt¼s&›» UJÒW§·‡÷Ö¡¸í»©…ÈZÊ£íx`‡QUD« ­Ìn›ÖCä‘~­%Am#BbŽòófŒ`(`Ѓí8šì{a!¥wWH÷`͈CHŠ•aˆ <â ‚aˆˆ£ËžíëjÇÇ=9‹!“;žùdÕöÙîž)ޱWŽÐçÔFh"[¾%ÌòŽ›:݈•¦«[yëM…1Ã#ìéýÖuËî§•m”‘/$:4Åq@l¬œràÈ(`šé.a!Nª¢…J‘>I,XPöp±acÊb«8z€.&êxI¶žŠ§fL9+€)[žy®ùÀp=‰Ö”Q¹1ÿ³­ky;Ïuw¤8”„ŠS@gšüš€ÎÕR¹Z"8ªcõT-0(ú:Ë„ÏVò¥†ÿwè.Ó8²(Ø“R‚é1ÊÛxd“ÂX'W,•}Ù#λýü‚9ÕbÕ¤Æ(¡±tçlˆâ}„jG/ŽP¤O“Æzcì/¦ ¥¹>QµlãB/]í¦yäWl"V%èù¼_„ç¡1ŽMËXP0ØùŒãêXƒšNÑ$ñóKåbÐ'%+?"ƒ(|Ne¤šRÄ=R“JïØsœ½ÍÂ¥‡^3iÂ_É9xªü©–ç–k´Z+²=hXCpÑF'ç²×J2)Í…ÇgÄò(gXb c̆Œz‘Ú¯:\¬`îó1XA ¡iy¾hƒ‰D& ïVF>–Ål|iÁY²{É `²ï×­çëŠå¨}¦@®cŒÓë’k •§&„“¶=²#]ù¶˜n­œÉLÿºŒ§¦~¡™VÇM8×\Åä…}suó^6£$zædWAøÉGÑym-ï‰bᕾ‚kõ,¾<¼Ðl>ù˜¿ Ú_•Üg1 «|•÷xÑoƒllšrëArÕ4ºÎ¸¸ZË¿•Ï^â׎çSÀ9)È®ÿÔNÆÏ<ëˆKýp²»æ¥A>cZædœ'ü8Ÿ‹fõD˜y¶?‘ó¯¿rɼàÕ&»œïä:¾ùä¾Ró¯2ÊW2óU›„ü tV°\š/åjÎÔW&õ$¼Ü‡x"€Ê¶õݺ ³uSç 8 ˜ÅTӜй»drY•45jôÞÂrÛË^ êˆè!«VÒÄ-aazè³D΃„©N01Ì,Kx{ï’ŒàÞ»÷Zl7Ó¦­‰´S+"GkN±RpÝûq9Â03ÕòýûO©[íûV’‘žx†»'ø»š 4ÈÞº¥cP’©‚r?ŽæMýË¿|ÿþÓÇÇݽ«©–b¥ˆHï‘ ¬b¥Üö·42²=Ƚ7ºÿþþ›?}û fî>H¥@Í|Fn[o¥T ‰¦'=œ!€õô®só#!̼g7Z^ÕŠV°¦ö¸+t¿ÝJ±ÔM„âÁñ¬é=÷&c—ŒÈ¾vï¦V¶Q†ì½=އ+·2“ÛY»fjPÜö[·b¥lÛVkõˆ±“œÂ‰»“Á‡+û_J+ÛoGKsyŸ ã¤RéX‡ªº{ðdvÕÄFUÞ…kˆaŸ4Õ”¢Î]Fj%+ 8 F–\uøì™<>,挒b±‚ÊŒ$¤NÚèÅìÿý×Í×z´‡{Ü·mô¯Ž6©ŠÞ£GÜn•ÀÞ¼çc+µ@pô&ŠˆØ¢¸moþññ‘-Ó½÷jÅé"Ò{O–LÅÝÌ•Zaé¥JU1Ž9Ü ÀÉ0¡8Œ¢*)Fi~¹ï÷÷oß¾7‘ Ú£å+‡ÑZ·ZÍ|ðü%Àî®V|»=þú×û·˯#ŠQ¸ÝZ‹ìÐÎ2âtÚ Â½l[­5.ü`¸G„ !ð.° %©ý-ÈݶbFñÞRA`Qm½+ZàîGs0( ¦f¥”QÖÊž£#Qê2Z.Èš"íøf–´kn)½ö‹™– SV¸ß?ÚñøþÓ_zïí8ö}«µÜö›ˆðfWí´è­lð¬!ðS 3ADË+Ù½»{’sD¤÷ãã㣌-?>Þúûïï[­=b+%"RÝN´Ð¤S )lî^t 0¡ô0³ã ¹×jfyú=޼!«ŒhÞš7ºç¹q-ÛvKHŠ™uïï"RKòyxн÷w¾ßǯ¿þVÌR6Î’ßúíÍÝ>îÝÌØ›‚#âÑ'æ>»ª­ýþx@²`Àt¶}O½ùVKx¤Ö¢–ª¾²!æ *ßMb {ž€ˆn¥@îªØêÖº @6FhÑð,åñQ×9XuªbÅÇáÞ̪™¡–¹íÔÌfÝ Ün»¥VSsóÇÑzkЃZ+†p)jÅ ªšmÉ Ïñؾm¥Gøý¾×½&º°(B¹ÜÛq ~€áCa&hÆÌò7„,0‘Ê *n¶a×ðRÅEùaapw‚@àŠè.SS*u=¢3¢€+N²·hÍ­”Þ;f¯T1j–åÛPÍ´ ™9C(Jð²¹/PŽyŒíA,*ªÖéfTD²l|ˆ`¥ 0Ϭ\xj¤ïu³—»Rˆcá!¾öÑ<£î{ Æ2*÷`°#º@!PºÎ2ÝSÂH¬ÝäWçº9’;’ÓÛyÊQóh^œâ   ˆQŽéfÆêPø…(Ô³õd€ê_•Å!çÓí›Î>äŒhnNûô$t#“QIÎ ‰ÇRjÌé»$G^²æ9_a¢~§sqûôÝç)Õ0bULÂç"C/Žø“ÃŒî!~n?ríìSß½ØÏ–Så´ÿ «OeSÁ†¡­‡´‡xPç’]'öž‚'®bb5‚jYÇÌ9]”™eæÏ ˜P…”èÂÓ¸öQY¢©;Æúg´È΄®™ö¬û]ÖUœ öA[#,]A¢NŠÀ_ZpÊBŠKÞyÕIzžÊµUæs“3C†‚'åIlÎL(é=৤$¹q!Pæ]4'¾OþÛôkå'o5ËZ¶þêƒä``ÕÚBm¦?HÒ)šk”«—’¹aK˜e,Æ ÝG½sfÂ8=¹ó¢Ï¿¦" xõa&Õ~²qÆ \íŸ,w7¥¹=–“^ËŸ?ç #€x¥u,9“ :ÎÙ ´K­ÕYtqBŒ†‘Óþ9:¸"êåB{¹È¿œ|y‚ô¯vbÓó ú¨½ÆRr5>/ÔzABžª .*\Åò1>X;œê§(Õ‹Ü=F=೬›Y\ùîT3ž¡.Ócž±¬4~`ÍkfçBþ!ϑåÒàzó_îW¾Z_p™%V—IBžó|ÁI‡~QáøŠÐ¹Ö/†QSóI9ÿäªÐ¼ðZø™ä4ÃiŸ¦8?Òäð2õݽ7ïÝ?Gxý‘ܶm?}{#ùÛïïÿãßÿýÑúÛ~«V¨²W«¶•RþÇÑr:q©‘dÇ{ð¯?ýäáî|´Ã#¬ØÿoÿíÑî½7÷HÂx!fšÌŽ$©w¨A‘¾àÔMT݇Õ(o\°TÏEÂ[ÀLU‡ò”¶"FDǾíî^¾©@C¤”’—LM]D%û0sã(Áh¥”}Ûl+½ûÇÇÝ»çE> [o¹i/ŤgÝ·•(Û¾ûvóáÞzoÞSŽÔ¤\]DÃõq>>²—%"dbPT5¥¥ZkwoÇ(¶º .šÙ•ªÙ³k /fòf[;Þ÷dÎ$6 ”Ü‘, ÂT0è±iB‹è*J%H³ã)æ-Z^µ¢X{<4ÔÔFï 0JVr¢Pª•%¦rô,w¢ÌåÕÓ(Ú™ànv¬i¨2¼ó\5­s-•>]!yY@–B3ù0‡¤ ÅE’0¾ ‚vó´á»DAÔÍ¿îCe„ŒæÔŒˆ©¥`  )@j¹F"6)TMá¯å|m\݃²9Ô²<ªJFè8WµO:o®-ãN&Á€lšª0ãôêŽå´Ï6ODdó„é|aÕr㬔€8±„¥µ¡£Å2ÀˆŒ-†¢ØÄÂËRO—ê•e|5Q^åÅÉÆÑ'pB\«†qÚ†yöCˆÍéôN¶ˆ XÎC ùÿ©{»$GŽ$[SÌ܈$ëVo`FdÖ1/wö¿y˜YÁí.3#7S=÷AÕÌ ˆÈ$Y?]Ý"-ì"38üÇìè9ß±9-MÔCÑ%ØDÒÀrí6kš#.#ÙU’L­Q@KŸí¿C [`¤Ñ7¯A±ñ|Q•I\â 0$~Ø„cÍ##O‘’4a jËôL\7ù9‘Nò“€ÑQfŒ)ØÍcr“m½ñóF£<ãÍRGvG@™hi8p°š;šœmGHÎa'„ƒOXÇÜe2“ÐÜ%òV“ ö¸ç΀Nü˜ =ά Žž›·Q…pÎd¦!š%šhˆ6ï\8‡/tBd ,&Uø£xÿ4ˆùøm,™õºœ”=ZÕ<…~Èçí3»ýa4ðpi}Iç°kËæ:$ø[…ûU ümøÏcá_néæONüãÃð{”}üqiœ¥O`?üaôFç¿ï¸òýëO¡ýöÿÞM¿üþì;D¤ˆ¿‡[ÏTÑÃhþÀ€û¤%ÿîØ¢¼gYLÙ1œNI‰T¡ÙåÅ’E R‰õW.­'¸ Dâ¼&ºà$¯3çŽßÀú‘*xì~få:ƒü=p]D‘ªJul 6ûü8‚¼H !§®…ŽÉ䟋ê“êZØÇX Yb’nb¨0¦MÄLR Qp”Wè#‡¶ä^,ÁÈæ0e{ —„%b…QD †dæ•´ÀS„á³r”çuȧ&úñóq,!£/,ÊUbuT¨ÐîQËÔ ée’Å5ŒlýEöKH¾ÞYŽ&©0Ÿœšù=°€%6qZÇ+qZ1IÀ ’Ƙ?—“‰qd…÷XæÓÃɈxhNµ¢ìç||à°a1àEt+{³üc)ÕHà”¤qš…äŒlƒNŒ:ŸÞ}37c-–Ëz Î1™ˆüØ‘S £°øc&r›Þ!òO\Í Ú`òMžœÊËÜdøñPúÈK;lÎW¦I|õ!óÈýOI\¢‡G­ÔT&1ögЀqNîNr=/æþávKlÉc/õÐ[çË­˜«3Ë ãð£x ~\ñÁ©?¥ÚòßÙ 0?ßÒǼÈ)û$s[> z‡¸;j¤g[t¬ëòö1ôŒ‡—{P~G‹²,iŒ8Fžr+“`Uÿ]ÜãaúÁ Ì4)Yñ°=ò$ gùè.ô9e9Ó-Ox™Ì—1‘ÈøT¬[Êü[RíljŸcŒQŸtbD×AøÃÂëØ$Îpaú”25³oš™žù7“O#>‹ÉŸÄ;¬§:æWÎüƒÃ€ó™€ó¬I7ó£þß§ña¾@ŸL>!É`íæÀ©ùÜäsf¿¸3qgª IDATùsÏùïíùSŸü?H þÞ‹ýã ü›düMïù35ÿæŠ?‹dðš:ú(„âwN>þn‚ðHüÁè¿ è$é?éþ3Zxòå™? —XžÆ§iq'UžqUš5dSÛÆéÊM¹~)æç®ò$çŒ!„L§¼s ‡¸ŽkÖiVPñ™¾ås¤1o‡á÷ÔÌò§†dÖz©_ZE DlKÐúlKï ?¯ý³J K™Ûóu‡³ä‡/QÿŸÿûÖÂEHЕ©*)C¥0¹Wáë¶»÷Öàìp˜ {!VN1¢’ïåË—//WátbÖa§ƒÃºus„Ø*Âr"4£v ‰â ;kÑ2zGï]TH(~„Þ ÀëõåÏú¹»ñVëí~ïÖEKLî÷£õÞZ3¤„[ŸRJ”ÁÞS¶øñÑZï&¢û¾}y}¹^öZ79Ìš5Ï(¼”¢%º³!9Ë¥ÙUÌÛÞ»uwÇâè¬DyÀ›››¿½½wëû¾—š± âÆ×'F'tn ê@ë¶•RÆ~-=ÍክۦªEEµ|yýBLÝ-š¢ú°%»VHÅ>——*¢¢±¬.¥Di¢¤ÙcbÁœ"£Ì|Ù/æÞZ›;Ú0æÇâô²mªI1'PHŠc×ÎÛV.û^K©›‰“d¬‰£ X”KÑY¬ªçL-z–;“fWpª¸æF ûíýýþ!ÁˆÜ:¸SÄ™UµÖjfÍ:ˆŠ¨™ùJ$ì˜U$°ðñekžçœU&jÖÛ½»·8Î/¯_<lÑë™0'6‹™„oµ­•R˜èÛÛ-ö<·Û=?¹¤·—™ûû]˜!O™ Ì»³'Ø8Z>•…EkvB„Ä&lnÝz:¹\ös•m«!Î3 ³!Ú¢E´–¢ED";`öíö~ÜïµÔHœH’m(H_Á®©µìûvÙk3+¢Eäýv‹[ðÑZ;3cÔ¨p¦û`ÙÃÍÌX˜…[;|6ŠNu~^{µ-ZkŽ*RaÁý·hÜè@¤%ÖelÎ)'d“ÿ“ ³pÑʬq‡)¥–²mµ~¹ì xÝj)ÛåzUáÛýÞ݈dÛöè0·u`£ǵè½G‹ßUJ}¹\KÞ-©÷ÖÕør/û¥–ên¯/_öËUDk©*¥h©¥²h½æÜbìM%š_Ȯ{þvs". ŠÐ{3婢ŠFõ Îݦlµ ³!q‘œà±•E´š{(é%øÀê°Öº– `϶J H2ÄæˆEÙs#d-ÜŒY% `„$&-ª,lfGoq9»¹õ²†0›õ{kD\JÙ´Fú*»Eòh¡[y=„ùnIZðìsc\‡Ñ˼mUk Ûo ½²Ü‚ÉÝ%&‹±i’¸šÈÜ N$‰ï—KÙʶíªuÔZ4ÊEEHŠ|žâãÞ °ˆÀ8̬µð¯f=ÚΜ&Eó7«Ê²ŽÊûF·ÞÍÝü~Í̼÷Ö»™Š¼\÷Z7">ú±‚$ŠŠªì¥½›ûußEÅ…=¢’˜&‘˜.ÁýzÙ/Û;÷àø%ÄFó’1¹u´Þ­‹pÔ S8d£;šbÀáî&-D“ 9Z|KLæÒÕî)õ¥]ž²¡3s1,š(¡Ad–“5Ã)ñê¢H-’¢µƒQœíá ç0…Ì·àœgN•˜\8nTáP‡„“ÃCú2ŸN*ÎrVÏ „;Ü@޳" 3 |xbâlå Ê÷Ÿÿ‡“ÚÇi&fö8«ãì÷½¨ëɱ† ¬˜fp ù–ã“4²qAʼnŸÈñÁ<™+wÞf‰w*’Jóù˜ëŒ¿ˆÑ(8–ìXœÞSóY\‚‹âÈ3ö†ñBcµEÉ $"sÁÀ­;ý¸è Aê^x·çW}â4ðlcÇpëý.,ÉãÎñü€«Ç;Æ,QæÓ”ªïnÎRFãFü“xžTÌç[˜¹ˆÔå‘°'èÀŽÂç¹߈ÄðÇ£tC³—gF$(!u*±2T£ÛØ!„`º†‹“Îq© ©hQ.JªÑ¹Å'¡žHØEžLݱŠ,¥æ’g·EªÀ«Û™Nò÷#v%h5³ÏgXh0^xâ!#ižެ›#Ÿ,sæyælwœSB’(À‘ÉÌo#·ÊŒíQ‹{ ­ü {/èž‘•Qm<Ããüèlä… 3ñ°þÆ v/n¼6cå Ìê’ù‰F g0§8j3v:¬Šãæ3JÌÒj&«VÎOÇspÞDf•ó¹A̶^}9qµŠ>¤>xa2ñ…àá{ÌÂ…ßaVÔÀ»ø– 6»àù¡b”’ˆù|óËÑ>ç`|êñãLÅ<¤üÁ´ÿ°´Y~-?šÕ¿ï¤üøéÏø*üÉo~" ñâä\ÍÑôàS{:n şסȪ¡2j^ž <Œ…¹:à !Ïf??· Ñ«åˆ!™DÍ@xåANãTƒoóçææ&2r"V8[hý̧ÄzvxfÄdô& Åj]{ -b^`Ä!½å£‡W,¯€æ±Äš»‡õ1iþÈëþ ¢>dyš®Èx²$œ'=ÂHËì<îÐ{´={Ìj„ŸÖò˜1á…>Ë!'؉ä!­1¶’˜s§:pËÉ,ª>G?ã·¶#ô©£ s!bæTð/†,í›B!„_4fNWÃ2;õfïìPR•¨p;;ÞaF R"ÑôZE²á<-=\.Ãÿ`ö<íÃÞÅY%—gÔÉ(XÕQÉ&-,çøÝNÄ¢$ó'VUUN óøÂUMÌ ˜XÜ+<²'ñdt€œE2#0OÙ‡¾Šœ¿¤EC&qhü÷S§œ£¨Á‚ç¨CÏô˜ 1±/U“ tbëÓŠìçW5ùBÂ7Ë;²}Ûùâ6{ðZ;r˜6Þȵ€V x¡ÁЩ$˜Š•™{3ÿ™î"|"> hÁøÑNlßvÕsG63/]ËÞœeJ±–ë‡ä F%çéÒÙ •eBiùã…=]–4†éÝÏ•!`¬¬ Ç6îÇ{å†añ¿ŸÒt~›ò„pyLu¿uõ«ŸÎGZh©´~˜Óð *<ólðCÑ€ŠM ŸÁR>þ‡ãÉÍ·ø¤‰€†U~ýùÉ–À"5­ü#Ѓ!ßá¥Ä鈈,3ŒQÿpBs–ŽóóÍ=ºóù|ôÞÅà½\öø ;<áûÍ Kã?úÓ˜ÄÎßwpããç?âÿ›\öÿ4õŸ÷Œäïz“øR÷wü¯ÒËÿ¾/ü_úíýð8~÷q†~ªí¿‡š: îsïAÒ ÎbúÖbò!¶/l8h˜NxTñ$Γs'Ë É‘ò°Då= Fw Ð#V¡y2ÜH°aãñ³?jÒŠÎeíð\ÎgVü¡ƒä™ ”‹1áϦX–³É#Ÿ;›çgó3Pî!ûÅ… ¹˜ˆª!á0x“Yà29©¨”Zb%¢¥Ä"ц¨'×~´¿þòë¾×—//,>Wjª²i=¨õžC€á{²¤ÄT¤ˆÈËõb°ãkAKñPë‡É!ÈÚA҇㢕ªoRq¹„ïžYj­e¸¿çN²Ö"¢„\9ÕRný~-€æ¯—=œ•¢Êµ œ{g¢Rt»ÔÖ¤;¬u·V¨ˆH©U…àÝ{oTü¢»jiG³Ö`æi'ŸÛSfáZJÑÒú1=¸fèfѹìzf*EU£þ“#PÛݼµÞ[˜pÍ=Lñœ¦Zw3$‡¢îrß·xæ*K)JDÖû/ýõzÙ^¯óÞŽ¨2° $9Ÿþ³¹Gùjïv´ã8ލ'5ë­·ºí—}OøiPÈGUTJt­µnuÛzïL‰?¬¥š[˜ˆ=XæîÌR0ò×ZÂùèæ±ØWH€8ÐÍ™(kÕJB†²‰¬€[z—VìïØt ]öˆÌœ/×—¢ÚÍî÷#àòÆìf®Éú~Üûqg‘Ö:ñ Äï­»SQ­RöõÛW€.û~½ìæ.¢ÌÒ­™‡`àÄ$E™HZ·î®BÛ¶u.Ç톣ü»{÷¢r¹¼ÈEþý—¿ ‰£ßnïÇ!û—mÙ7b2XЮR§Å,ä-¡Ê·š1Þdå…2h¶Û…óÐŒ‘rÊØ0(¶å"rGç@þ¹ÔZÌ­ªV'Bo‡ù½Go…$0ü—}ÿr½ÞÛñv{{ûÖ^_^£¦¯”¨Z €£7"êÖo·[gÌ=Úz.ì3,ìîpr§˜ß€Uµn•™¸V‚wwwêvûYX Á*œÇQá ˜ÁQ·mÛj܈¼S-%†y4*écºæŽ¢YÖ^6Õ ¢3 Ä¢“UBÜ[ŸzD)Ñ×Z.ÛŽÁ¹ÊªNw7/µ^ëÖ³¿Ú‰àNµj­[­íííÖj%}«•ˆz©e«µxª¼·Û¥Ô£wáv^×ïµnq ¦yWÄÜcô"]2éÖŽûQT/—KPn¢;=‘ÞdUYBùˆ¹H([µó‹p‹«’Ek-EÙÝY¤”Jp&æc J•¨t3?š¨ÔRbè´Õøqôëõš‰¦·n¡ªa«¥–ZÆ­À‰ ä½¥ûrCðêH…4°RJ-•ˆ#Ï„7qJÃl)!d«[à>D% BHàŽ°–ÛìÕÁ¬³‹?*ÐEDŠÑZ«ªöxŒævkNLÊ*ÊET*ß23·ãNÔݤ+öÖ Y”s @¤,C*‚@ÀdäfF,uL—@’{)Ö:2XÕÊʅزqý@cŒŒ@Dµa‚çób¯•Çá½÷;0!ñœœ) ;òos8ÅC¡tE›…ÄÒàöþ~?Z(3Ýt#f¦Rzï1í‹£ëfœEÖ‰RKeÕU4×dìâìP•ø^L:»0»x [îp3‹D:á'Ìb¬.ÉÇ‹n`!—Ðì8»e£ƒ8cýÂÈW!Œ˜¼€<ý*œ¦Ïs&øØ*¢òBüä>bk²+ÖŽŽIC)HϵϬ‰Ì÷œ…c 'Îa0€!aòss˜’ww碧3îÜ‹ùC'ˆT3á02Ö>ÞÙ4{Š¢Â£–YLL:yU´t]¤@î8YბÅϲ´dóNu}t©,þZa²æh…µsâLšY1†š<5J‡À¸œâóâ j óŒ„'ëîy F§CƸà“×Ît~31 #&QE ç]Î-²<xXx@x˜U£t7%òPp¢èŸp9ÂgzôôGX-þ$fV«œw®˜<#MñgÁüÔ¼g¯íØo.lD#|Òrû±Í•yÑuÇXÈÈ§Ž¼ô®Gõ£œ»ùsÀçýïQç7ϱ9†Uâq:Ot`™~¦ìò*)¬ì3ÐS¹è£:þ]ñùqAk=ïs$iµø?ŸþëC„橇ÆÓæYMÃÃËàibò$Ní‘×±ÑÓË®XŒj¯ÕzÏËAø4ÇH ÑÚ2ýñM3 ün=~8ñ8ó+OÀ¨µ8b9vÈò‰ ü™RŽ¿CjýSþ©Á³Oþû“þ#²3ÿдŽÿGå¿ã˜âǘO†_8˜Xåý\‰¥;ÌLŽ%ŽýÔýx¶-› dê°)€§!K8Ì1‚OA´ùÐv&Éçôè! CLœïgRz‚î΢D>ìüsœ#Y=.¼p? NLâ#»ïáVÀ3]» Uæ-b¸‰HÆÔ~<¢å;£Izz®ô!ЉÙGHXn³QaÕ*yw£Oš`"MrínNí~ôÞJ­u¯# uv,¬, ».ÄY‚f0ºYÃ÷$,E…™Öï½7³ÅÅBæèìaÛŒt$Ykû¶™{j A'uKÄOH(Šª°vkïï·Ûý¾mÛeß0ðÙÑŠ&"÷Ö~ùå"/û>¢ÏTK¿ß' !1œ©&* ÂFBhLø 7×ÐÄ1!¦¥nÎ%ˆäf=l³ED$|ÕᆢJ€ˆhU‡‹ Ý›©xJ»Š°57÷€*„+Zö}s;>(ø÷_þãgûò§×/׺íÍ[G·ÈäŸ`e­õ[læ½w®µ»‡«”è^JÙJÍXº0³nµˆ*1›[¨Øûå²ïûý8Zkµ (v¡BDùë/›ÖRŠ»‡ ÕÖ»õÆD£œfæ–c =¡w¨˜wòDN© ÎO¨C´\.žA”™HÏr)…¨»ãõ嵨š{)·Ö[ï=‡Uõv»­·[,‹Fá„˾«è^j­ÚÍEÞï÷û»»Á:l«%:+ŽÖ¢#t:ìÌ[hbÞŒ•úq;î·np‡ÃÁäi­M”·ZQô~?â½k)×ËõívëÝc¢W‹š àn igWÑœ±€„$ ÅC‰´q MÜX »y£. ¦2mbnnfÖ­\¶èQ˜‹¨¹Y7¸Åî—ý²o{sÛJ½lûívcU }%â 9\Ez7œ»`â³?Ï› Ǩ}žÅëÌ\ªŠp2R„ØŒœŠs)zdб’ްsEþžS£ëu“‰aƒù¤j‡O¿3uCÑ€P)@·#fa)Eˆè8º»­Å¹(¢,z¿wLˆàîÝÀ‹w6³`1Á#AeGkÌ”T¡¢µ”8,[)f–éñ8±B:¾”ãþ®Zöz‘¦¨¤Ô{;/e ²V7kÖIK©µ·fÖjyAÙ¾~{{{WQWgæÖ»;Ò*.5¼io~´•óŸ“ &E4AÎ2èuÄ"lÍB.¨¤«‘D¸÷ænªjp;L˜³ÝÞ»õv8è /¥häUÔ‘%¢Öz4?3KˆDÔh÷#¡  QÛK"LJ“ Õm«µFÛyÂË;Ö„†1TËm n¨¨NKˆŒÌwhÔÉvˆF "óxa%fws Qf{RÙl +ssvs¸uëb²•­ª#¼1H´7»IŠðµºƒ£Eáž×ZB3+E SEŽ£1àÔ…fæ´ïµhq73wÍ †š”"uøíf RæRkónÝF{ä‡9±ªôNáÛqóÖ),®qa+/þ9’à> ³“ƒ “(µåÅ3!ÎÆT':c“ LãXÅ@(Ÿy ÒT‡“Ç;EüøúHÔc./,ž½ðÁK.w8gۡ£‚2·¢Ù/Ìê` —`C è ÖÂÉ( pJ¤Êòáž¹ÒÆ<ÂJ‰í™õÄü< XMýÖÚ=fòù€£uâ'¼É“(3¦l‚ê“+’“¬ŸQ^Æþa¾3ùÄa~†ÍÖ…HàlÅĨóªê ã¿æ®3†:Á•+¯}så¥=:>ô ÎÅ™_à3M1´ÖM6¥œ¢I8ZÝQ r§‰ë[¶YÓÄ«¨—lÔH­ ÿ³ÈL!œ ¤”Á1¹ëuó},Bœ a©Êìˆ$ß2ÙA§Óy–#3˜ ìƒJ’ÃQ’ý a9ä j»³FÆxÀNÝ™™j¡¡"ÏŽ^°®anàa“Nå”G–dÌ$W8ÝHÄD>N;!™+ôÀ¾_¤Ð1–sÈzl>ˆ*"öÈ[îWc‚"L¥œ×œ™®ŒÓ¦ÏfGó;äÿô åÉí?…SáÏÆƒ½ZæS£Ä+\ÿ7£±YdZj·ÅO{r}aê|öj,Qù¨ó‰³h„#|jà8%øT?CÑžc»5Ç3ÀÀ3®%‚%1„3]Ãç­€#©'Cœ­ŒGÊ£»3wµ"ÚOú?F*#ïUá]äôOÇ+—R'O`ü#ÿóÀ×Pú[âRÈì­¶9ÈÀTŸÓ¿0>Áà€ŸV4PzëŸZW±L8è±xJÑÐg.í6ŠUô_˜j]¾+ëfQž±ÜÌ–áãÓ +b±ß¯ÿ]葆O£@âéµÖzJþ¾ÂÇÞcÆ*Íð÷¸11x¬¶=éëÌäQCÅóëá¼6d&<¾ÌZÓA>ëì%XâëúpGšiŒt úüxÐø;ú(â6eŸÀ–°d—Ö©Ãw¿ün­ßÿ§_é÷ KWA>Þáßõ>¿QBÆ?Sêý»Þ~ûâ;¯¿÷óÒ¡øÆø΋ý+Æü·ýmæï~6ž ÙÂ…e#8®RYiûΑÈê2ÐðZ<4§¤»µe¥u›B2·œfŠ€dfô¡Ðôé©·„'|º%¤ä&A&TTæzêÃ!Xw¶<±Ö¥”ýr…{÷¶æ,*‘Ýýývs³Ÿ¯{ à¨u 3«jìH·m#¯ßÞ.µ^®™ÓìsæøfsU‹p4~´#j â{U Î&VRWfá¸ë¹ôg.`ãuµžŠUŒÓ˜˜;¼{¨$Û±]“G¢EEÄ "\öBï÷#!DM"SžeÁa P©9©rI›·n­µZk@ݺÛlL¤C¿º·ûqÓGk÷º]´¨£Qm÷xÔº½\QJy¿ßÖTµõn½‰H­{­tÜß›u%Úöý-f`çäVD{Âá{pr˜5Æ™Ä\TZ °“\ÊåËëëívû*²o[ÑŸ1G\—”Ía€õ_[·-5ï³*gîT¤–½5s7&’RpQ)÷ãfæÛv)ZLµ•;"òÀ·Å@"éDæ‹á3V¹ñÅÅÙ"i¬Ì‡»à9L$ý1(8m¤xrŸH’¤˜¬òÅ\ÓFçl0s iãv°8¹øôÙ‡?d¸z†DŽQö|RÖ2Œ%5œHF¶`b¥Ç"|¸l&}`ŽK@ËIç–œÁf:‡“§ž5«é‡Žƒ¤³í–W''E×`iH£ÉL¯ŸLr)™¯Ù^˜_ÐB†À7ä’FX&.ƒ Ÿ*nVV/‹îÑ%‘}+n–‹2[±TÑ¢ù{ä œ¤Î81«¹é€Ú&3ÖĈֵˆ%œ›“DåÇ Æf/qöûQ• {Öq9­ž>„YžåáFnžFä<12ny±üP¦Èpù Ç`z(| …¦ž~6—æ(-æ’Ø[A4€˜œ=ZåÏÙÔ©A3Î,)HŸ“~`x`i ˜Æói”'Æ@ÎÚ‚ùC­òߨš­š+óm-ÛÐQÙ1àD§áßfÈ=-rý­Ãøvj´0O?ÿ¼™tÌZf»Œ+kÂ>‡Œ0ßî²ø ðN!ÏÎÆ»M—üÒqCZé+S÷? ãymçK‚Ak|Yá3HÞq^ÉqEIVæ’'Äq|É\l§®›Í(Ùæ~¢¥¨.<&~S¨,G—À4iâüöž¸8Koî¨3@z(ä|ðÐç÷ã˹2ŒŸXOÓ‡?Ö©ðA+ÿ€íÁ'º/Àd¬^úUîçãþ£w~™Àño±y•Ù?a{𧸋 ,3ªs´±–8= I¢Ì~ËJ—zRÍù{ú9>¾É™æz¨%Àýx¥¶}JqÁ³ò}’…ð¡°úƒŒ{Öh¯w„?ýú$ãÃâ9ìéGü]ÈÐãÑý{uöOP6?ÖÿW>þØ[ú£?ûÈêzU}®ãJâß$ügàùy÷Ÿ!²ÿ+"¿û âiø¦ïT†‘çtO.ãâQóâäJ’˜Ùé a’’“ôXœ·A ŒŸ^q“Ê'ùð ­„ì–±ÊsÔÍÄ\þéâÉO‘oÉIk§<¯Ãسñx8ø–ñ±·êCð´¬RÌÇÇÓóø8´ÀÃHÛã‹Iùèò”èÈYC`­\¶¢’î!wòتañˆú²Ñæ&BD·ÛíËëë¾ï»ô4†œŠT ¢]/—Rµ·NÇáçgs'q"ÙjíLž OÞXˆ*„»Û½÷ÛýnfªªZ.û掹"‡õÞÌz³îÞ­Ѷm×ËþÙpÎÕnÝëV ÜŽöÎw"ºì—½lîNì¥hjÍ› Qâ"%Ì@B´oÛ¾oÇ­þåøÛýNÂÛå̳ÎÌû¾oµ2³hEëÀ¾MEk!÷,ÚcV>ç%VåÃÌݲrì·¶0ã„pUÝJÙ‚Š º£* —Â÷ãpØO_^ƒ?¶‹<ºî˜‡`çfÍŽÎ_f7ºl—ºU-¢©~F½_ï»# Õ& ëq)uÛ/ÇÑU ™%Ò]E^®/½7ƒ)":ªs¾æÀð|AO»G±¤#Ú2áÙ(ËfæîZëô¹ûí~Xë"bf>ñÛXìæœãïÁo÷a”—*…K©•‰¢61‰W ÏùVë½5Œ;Ô—Ë~÷òBôÓËë—//ß¾½½¿½÷Ö´¿¼&.‰%'VA7Îe‘¢±[˜…P"°f²yj€Y!4<2‹ r[7”ø<£³‚È-ÆycºÈD™¦æÓ5¤ûißž™ç¡ËGŒ…&îŒ ó„€¢WÏ]Ö1)hü8ÂËŸ¡vÀ:EG±ä+ðL”™[=o¥ðY;Æù>Æ”åŒqƒÖªW äÍØ,G/Ι«wÐ ÔÅä÷œ»L`å¬`@k¦÷I-)ør[ð5}Dh)ï3g°f˜}|™y¾Î€SZÜã6—žä·ü`"\øi)z2î/JŸÆ7EãÆJe>˜êpz¼Ï׋θ@G;î23=;‹‡kQyÜjÆž:_±©á4Ƽ)[OÝ~±Ýc$–ˆÀ9Õ¥±G‰DïQIæ`½ûÄöÍ–ï“05íYöΟɡŸiaŒô+Ìi™Tù£ö°Àø e<½$Ï׳¹x Êù‰ØÂü©;x.O¾?4¬¥Ð¼Î@X¯+Íì£þ½6|È<ëùc¢ÀŸ´™G†4ÔÑÉL[Nm>›K˜á€EÃLa¦¡ZiQO¥ÄŽþók>—ù{Ò%žUÃÏãó1‹*>þ^Å•ñÙ‹< G§ìïpñ©*úïøc8ãwióÿœü¦XýüÑŸå?þq>%ñ¦JŽß-Êÿ®7„ÿj, ü æ¬Y³®s:Sui‹pŽõåÒÞ’ /œpÉX-ÒÌÈ­i&L(ç á¶w$‰sÞ²ÆÄ;Dž‰<'š±L> =À|¸äíZ`>3Ÿ”Ëî÷\rU ö™48 ËD`þëÓSqBäàOϱ—ŒÐŒ0`E|™ò§™³ŒBWe¥¢8! :òÛû­·ƒÉª²7ËŽC¢Àn‹%PvÙõ‰èVãw^¶]˜ïÖ ѽViÝz§¬„fûåòåçŸÛýöË/mï–1T+")¥ô&VMª–"*Gïn~´v?zïÉê†××ëEk³ÞŽãh­·Ö[7sU Ñ/ÈËDt»¿ÿòë×·oß.—«^¯DtDcçåbèîo0ó^+‘›¹€«TWÜ&D×mË8>àDÂr½lѦ ªÊ¸ƒ¿¿}kÖ‰èz¹*‹¨öÚÃ|¥ÇÁ%Qr«EDZë)…gÆ9 þðpåÚ·w;Z«UÝ-ºD¥ÖZ‹0w·Özk ð’½ áôôvï­TQ /+¶ 4øhÔPQf? ¦Â§Ïr½¾ #wta‡ÞDîx{¿©êÆZKa•Ûq¼ÝÞv0øu¿À©›…¨J@?:3‡|I<“ó†ë dLŽSz¼Ük­ánçtÌÅ”ÅTÕ˜Ãù"!·ÌŬ[W¨¹Å&0Æ[Y0:;‹è‚G&*dìª"¬‰<8m?ÄÝ ¤Ì½[˜ »™€›1_·½½õ§ë—·Ûûÿú÷ÿúׯß~ýÆLûËe—"ÂRëõ²÷Þ»¨™³«e‹ÊÈz7}ýúÍÝ^¿¼\.{)ªÊ¯¯fò¢[ s€pÙ7ëv?Zœ ñEŠ%&“øÅâÎÂÄ`S–à HìÂøËõ…# @TT£v•ÝÝ E¨ÔrÙë¾]ŠŒnïÔÒàDEJ³·ØJÝK=îS¤—1¥Ñ‰,”l-C](àÞTU-e«1µÖ…lN,%' ~Wi¬ÃÕc.XŠN)iÛÄ-*5I…sšˆPœ¸j=ˆJUí±—ÙÀ¦DWF®?¶š'"RÝu;îÍÒ_ bûow ?©jo-N­RJz-³¹Í^ëã8^®/ªñÂDD÷ûÍÜïïw¸×RÞßnIxJdVW-®*D!Çw¡Zj¥Öî½÷Þ¿Æ3Çá­îî°£ÝßßßU¥nÛýv?Žöú"×ý¢…ÍPJyýr…ù1ºÖUT¥ôÞ’ë'¥Mc …‚Ñßç&LµFE¶)°;ˆÉÌZë¢ìî1AkFää =°Š–¢@\EŠ–ëå""¿~àæˆ»A)ÊÊ Àµ¨&ô¹é‘¦¹›¼¬¨E_}lÁŽ˜L3 óÑZI +dà ¸3e(‡H¹0‡h…óEXtsÇq·÷ÛM˜.//,"¸ ѶUw¼»¿&'’ ¸9Ä:Ì=‹B£êHKIË#aáEJ€³Éƒ eηËew+27"(× é´îîe Õ)<ƒn–wÝ(§°ìÛÆB?Ž›;Z?„EEŠˆª´žb°ÄÄ îv»ßÍ!BQAŽ“EãòRŠÃT!— EUè°±Rz®å@‡Ø(Om¡OE(Z§“*•‰”ý­î 'ᇌû¨Ä&&r« ÏòÖÈbxÊs²¢xRöàë‘ÀªiĽµ£¢`˜áN/îu‚B,Ù‘ÌtªÿˆôÚÔò ¸ºq¿‡L5ô"Q)$t!%®à#4#¡\V ³&¾b²ç—zèꘞÑQÐ5ÀÛœ@<«=ZŽd‡m|N¤"ÙxÉ”½¾·©¤Æà"d:Égzx2x4È0ýN!䌌¬"'/ÒÐüM'Å`Ò45¯”a2\8TÂAÇYL6³À­‰ß˜}Å>~vm&ÈâanûqèeäQr³ "Øl†€cD¤ÏàSU&=íÛIó IJe¨F3'2M}q$U¸¨’¨0G3»“÷‰òàSK×4±Çb16yÍ29310U¦±3‹¯¥ÅÚS˅ºÜب²íi/ÇÂì«tÉ`ÿ;NÇþp£;œaˆ8 DB™¬Ÿ¿2·d3EÎü'G)‚V˜„0ÿ˜ÄPb¼_[•Œ³Â'"e­€æ“n“ï¹ú3-Yohã4>“)K×'Æ5D~î#Sëçå="l0Ãô§­—A>gaóæ+©—?äùa+O{amåv}Œ×ÏÀ. Æ0Öžsž©‘ɘ¥¼x(9šóŠN2ÈGj•¢9s?+ãh0ŽGóŠìL'¬G!³@£#} ñž“óëȕŬSšâ4„„‡V^šÆìX„cyécm`泜i^A™"$š&¹EÈ¡ó¬A_[ÐO‘ôl?g©olzz2ÂÆKHá3\ûê=í5ÀG¿ôÅ1ͳ+¯~<Åb°Ì«ÖñžüæONU|dÑ/1ƒ‡ÈÅ“ìÅs4ðü†Ï‡ôGL³?Á2bϤŸý”º’;¸ÎÎÎeŽ5ñÖLçì{SYæŠøÜŽ'1ú±Ð€ñew­èÁÙ`òq°4ÒIX\ÂßGåàƒúüÌŠ9í XO¼OË ž¥üß­ˆ>u9à78oö¿€üw Vž{,>‹Fð?‚7ÃÿbHþ›ÂûÿyÇãÑñÿ˜Q„÷^§fÍOÁ£¸ÂbRÒ)ˆ M<-ãþ$'Ö…?™«ÃÜÄëݹ*{¸÷žwkÌwÂ|Îqz—Bq‰MOØdÙ¹¥q‚ vΞœ#áC÷Îê¡\~œ´ÐE÷ÇÚ@ôÍ9kŽ¥·? ¦ DRz7¯%jµb³ ðXI¨ªÃ™¥” kǽ) äáƒ6Jƒ±°;çj*¤ØþË/¿À}¿\J©Zôå²ù.ooïß¾õô§Û¼÷ÞCá`µ(ÐŒt1YnøU£(•ТPX€vÙëV«{?œXè²×CXµl[ýryÑ¢ýöív·÷wë=Ê.˶åb›9¬÷‘¨Ü¶½ÖZjå²mÂ,ÂvXkp#"»XQnfz³©|ÛÂQ ·îýíýfno··oo·ºÕDeÛ÷ÖÛívûUô²ïû¶ ÉË~=Z{{{o½Õ­Jl­D˜i¯—è¼åÅ¢,$äìƒüÏ3hyG-ÕÖ-Úƒ ŽÁÅŸÛÞ“nÊp|»ÝjÑøNãK–pÆÌ”b%HPßY#&’º§»#ZXÁWe¹÷öö~£î¦÷î·{swÕâä%K¬÷Tÿljpò TxpKœÆ†U3ŸN¡¨Æ?)ÍÅîpvžÉÈê¾o"Ük’Ç’Nžv2áÐxUEUƒ)Eµ†ªÊî®D¬ 8D™ ·-"Ĥ"…¥ ;î/²¿^^‰îÿöç?ãÞºãý~»¿Ýßû×Ëõr¶ýr·ÞÍŽ£ Û¾•té©è{³Ö¨F§ÅO?}©Z梵¨…hŠ°åº¹7ïÈô—©w.ÕQŠ‚Ý¥lÌ\$‹Sz€Fá•Qö'ÂìˆßBDÝ=Žvë½TI,OkˆŽÞTD„;x¤Ó›÷,C;|Ð׃Ìn5ó4O^Mü °¨œSÖ¢¥¨ÔREÅÌ•™DÁ ó¸ªÍ]s£Ç*Ê '-UEKgÌlNðîd1>qƒ{‹ ™ç=J$Æ—Z†âߺ…U™ˆµha!Ñ +DTTèÿfïÝ›#IŽ$O{yDf¢=³'²ßÿÓÜÊ ]dF¸›éýa͒Kîɵ)duHDFxº«©þ”á"áÑj î9y¢ˆ)£ÿ&¥ ƒ¢ÕÑ–Cxl³’¶ÍL>ED«;³"̦k^ÄRJ)ûöwU½­«ˆzïZgænºïÉ ‘þ:Ì\J6–ïµîo?Óð¾í5IG×Ûõ²\Míñ¸¯Ky¹­-ÂÛŽ¡öáÐø”IôGöQ§ \¸Óᨗ׉ªÌ0i¹?O;yNÝcßëÏŸ¯"r[×ÛíúãÕ»‰5ÍæîÙöxÛîIRáÇ#¡e¦Zтɉó=õLžó?&^L[¤Lh¢k)x¸ GpxoO+½·Ff3ê8t³§’€s\íÔCó¥X`Bîݺ@Ž JÆè˜ETI˜š„V›}JM„ì-Ì=0f²L™ñIó 8&!@l•’¿3H,}¼ÁÕ÷–åÛ]½ ™J¦,¦J„b¶í{Ý«PŠ–½£%r›Óõkâ¬g`¢Ëå"VzíÑ"˜=a²¨ª»{D“H~¾@˜Ø ¨Š;rÅ€ À€ª€˜Z# wf˜=HˆU 0N•p ‚;Áˆžçé„(¡Þˆ;FY)ÏIÏ¥ (¢£œY‚j¾G]»Ëä=Á+0áÐAc÷Ów’AÈž¦i´WFô¯ "pŽ»‚yŠí’}&S0l,j|!ƒ’8¬o8YÈÑ'$D Ÿ™!™uÅ>ùY' Ìt*ro/fÅ -£bõÉC7 èíUÜ‹+1qìH˜#Íü[úŽ›Q?G9•OýI†âô>ÁÐe¡ÿ&¾?GÎ3†ƒ+â2ô÷Ng:‰d ݈dÌÝuÝS S‘!°0º'ygMÿ¥Ð´™£su¸O<¦'ÔLŒ1&pd†¢ÇºküxÂeâ•:Mqº‚ç‚U…N‡,á òN+ö‰ÄðŒ>ŠpÿM,ÐÙ¡1:C9¡$ýêÅ,FcÄpŠÅp¨âècHß>óÈÌàɵd<à<ãý}ÎËœäú8æFB¤½šXG«ð¬éxŠ+ô“!QmHoï<˜¬DôÃël"¦“üȬ‘é¬ÞœÛi¥À{¹!ï;ᓎ¬­ÇäoÖ“?‰OöÁ~ïîžÁý`ÊO™9_IŠØX£Æö £kyŽÇ‘/-5Ê ®ßÏ8 ÎXÿÓ(ƒÆïC”ON¾®è&kNÇÒhÏd˜f›ÐÁû9%ãÇ¡ßí9'‹œn…“ØÔ†§L}Räf-mgÕÌŒSYöC}9òùŒe9µ‹ÏÔ?ó©:–G•øðOL~ß á úüÿ™8[ðæD  ð……„½@xbúOÖïsÿÈ$ôð“ò^ ãCò‹ž9%OÂÄyŒŒ]饸„DøÄ¦ýô¨¿—Þß• OÏã‰ã'wý© —úñ'º,ÞYØù3}ÞëŸê–ïÕ|f’~ÏœÊ5þ¢¦Êôɪñ.ÁBï%1þ¬±àSõÿÜ£p.4naå­¬øøÍù)ßó.Y1`ÿãÏ¿ãPïu4>@êß… ˜žn:÷¬ÿõ.o~>úýÿUZëoȬÿìþJ•ÿ,¦7~·Áù¿ÿ3ÿü_íþ‹oðoˆc`ÐÇ3«&>ê°ŽqÝ“>w? äÎGMå´" žüÜrIêdÉ|짯îdÒSrЇ:ë‚ûGæ$$æIpäPö#>ØŸ=Wpº|À»¹Dž‚^|^ŽPÎN%ƒâSªb_æèô4@?‡·øýtr&9 FÙ®˜ ÁÑ'*"ÅDMóWI]/ÂÝ­¶p‡ hÅA&*J,!àçë«G|ùòB {mðf¦Z̹ #oûv<ö¶GDCË÷²KWÃ| é._YÀÕ›²©jó·RÊ"¶·Ö¢5afÿöíûõzõðû}ûyÝö-(t)×ËÅÌJ1 nÍSñ4^KÑR²ýLDVÉ(´×mÛ­¨2EmÕÙ#˜¸p¡&ÒZ+Z.× sMesßöǶ óm]šûýí‘ò_YÖ½Õ?¨Ùív)f,úضnŽná—Õ–²,¶Hmnf)¹¦‡£o³Ç°ëH`PYÖZÛëÛ›°\¯×n£ët§€2³Yîn¡f¢Ð IDATVJMIÄk „h¢ìD¦ÄáÒö:ÓÙk){­á{ŒÓo9ž»ÞQ(—½¸‚ˆûýab4G·J›Ú²×Ú¼5ˆšZx­ÕÃ5TÒà Ë±ÑzRšDÔTóŠÅðTw6=pR”HD.—Kþy61¨šg‹@òŽÝcouº–ò”›~ö•E•wø°B!¼%k[EÇ‚6÷«½m˜YX„X‚x!##ToÍk–²èr1³¯¯¾ïûãííþúúØj%°©F¸G1Ó^­©™Šoíq¬ëÊÌÅLYš§D†Fäî¥ØcÛT¥ºQÝk’̓Žt^¦Ö\‹ç*ioÃ8P"IåÕ›©+ BH”EH‚kŠÎDÜZÍáB#ˆ jpAuZP ŸL±g±‘zP­{ÌŽF”Ãy$ãpG½8Õȃ8Ñ1D$$Ää9ÅQa iÒ£ZDá${&»Ò°Ë j…‚„ÒÑÜ3Óì¹(:µ‰ëb¦¦Ûc53Ëœ“³µKH D«Æ…¼¯é€©æý`"‘}ÍËbž¸/î}ÿöýüò=e[Íi¨¨h1ûÙ^Uõv]sæÚ‡Z€pgFdÂ’³ÏèU´nVÌlYV½¿¾=¶Úœ¨µê{­ëº|ýú"¬£)?^ßÈSk+Ë?ß¼ž‘zPÕ»¢ ¢Q™pÖ Šc™(á¾”’ƒgU}´o÷{óøþr“,‰ @zÉ{ÝÝ,§êîáQk›ò‹{°ôz‰4=5o{Ý ¨µåK½\ÖÞà1ŽÙ¬Êªä-<ˆ%`¤ÉÉ“Y†èæ|ç`–ÌáFØŽæ’-¦dÞ©ü©Vç£ÇÇïxj`ë]Å”¶¤~_ÆlÅœ=X9¦QÒO1 ^#Ëq´@`llºðëAv¬?=ã†Ãg¾{¡Ÿwc˜´Ç\KfÙsÞTÉQœÂèàLM,ãgú-zŒ‚säÒéò½ááð“óIV;†Çæ‡K^F…ú¬BÎ|ðxH-Ÿ{ª±Óm1'úË8E70nh>LÔ'á³o¶(ë•ú/­Jc*6FM‘äá°HžØûð4ºúßVDµX@ƒî‚p4g:ŠzçeïÀd›%Í GÁD<@~iG1ò|äæÐ¥7† ?sN’#rÅGJÏ¡Âò1ÀÀ‡Áe¢OÄ$Õ•#\þ$ÄC0.mòl¥8O~ǽñ‰b‰YÎLa$g€¦RÏïx®R~"Ž¢©ó‰óìFÆGuö‰ŒsšÕk…O`~Ï9µNÄHüUÊûoIñ“vBÆýJÑo*™­ò{®?µmü“}èü÷pΚÚù1þ»ºñßzMÞ!øïù3þêÿ%bò>üwÈÿþÇ'?fØñDW“w‰Á¹çkyìLÇŒt„{½ÐÐÉ¥#€Ï±^œÈx}ñ’“Ð>?peXCúŒáC9ùAz›Sqî]†¬ †c[#<>Õ™ù³2 ¦Óøâ‰1øvBàgû$0à:àÃbÅïzïÞµÑ@Â/ÒÅT%‘¬›cpNLÀD¬‚}¯ÛÞêÞZk^K)e]’Ö½5xP)¶¾ÜÒÜ-–œ h®Íß^_/×Ëå²`RL׬â¬éÖÞZÙáàÂìèÁDEÌÕ_ßÞêµ™š‰ k«ÞZmÝäNºØõv+¢oíçãußw[–‹]—RÖ²xx R§e°H’FXU™îiÞSUR&6Û÷ýþxlº]׋¡äÉS̺.eÛ¶'¦hÞZ±šTDõ²”²`Û"¢óø—ÅãúúúúxÜ™éNTk%⥬¤$¢NP(m¸¨1,-äm(ÚÑÞ 2³}ß_ßî/——ï¿|÷û¶#ÓÙAäA„•†hµ}½Ýر;GƒŠ°˜±2+‘B%’ü®j‹© ³<öGõË¢ªyì3ÕR,ä©>ö½µ`¯•eõˆ¶·›ärp+—W¸1}DÇDDI ñêί­æ7+¢Z÷=ã䬜¦ï´N³0ȉ4±µöhÞûã³âµåÍf¥Üïo?~üjb¦ 1„5˜îÛCZP[ucÓÁǾí;@K)9 m dQ­¾çQ[»?_ÿ¯ûù‡?粜Õݹæd‘/úrÖ“Lé,î“•p '–ðF^z#ÕTE‰ÝT¥,Jý)$D¤ÊÌÞLU4Ãõî­eÞovv«­ ó¶ËçrH99Ð15¢¶†@ï“r#"Êé9øÔIᑎ¿FPUÖAŽò ëQƒ\g$ÏÃ\Œö[kî±¢ÅV]š/Ÿ×Ô*@Þ<‰ę͙̂¡ZÊmU{kšj÷"PQi¡Ì¼Dï ˆÚ”)õl54æX"ìœ÷ÛDlߪúr½]n—V÷ûÛ–¿Õãqûù–_õíëKYI¢ærÏÀ€o+YIB£WcY¯Í½5çAþåû÷o/_Ü>¶·íñx<öíþ¸Ü.–¬xálj`ªLPO®ËÜ"'":ÃÉ€715dœ¨šQÇÁå?DTDаº?ömûñëÏ×_ØRxb•,µU&²EÃûc,,yóÏ”vq‰(š‹°gô,¼÷LjmÛ¼yŸ zsáZ[svJñHÅl¬©´·æ¦ÚMØá`@ŠˆÚH+¥|Ï4o„ûeYªH> D¬jræžñ‰^ð]p@÷ÞK—}&ˆ Â[óÖ"ñ])¼¤f&Ó; áD­9àBYJŒð>^IË¡ïÛ½y´Ö"Ͼ‘‰²¨¨¨ˆ˜Fq åT±ºˆpP¼zx4&ÓbÅjÙ¯CLÞªg‰Œˆxr¹¬kÑpZ=)SDÑ‹êɬx¸tlÛh2}êí»p¾EpÈúßîÔ˜ OÍ܉Ɖqa|Ò‚™È˜²jníR1'Ý„ìw½49N1ê„1¤q§¼3w6öÕŸ™C":6,Æ<©å] ²|µ]‡Nít4 „½{EX‰AÂ@›!8Žwt8Ïùý!žgâV(}ÒPt ߢ5O 'NP>sŽÙTÐÖ©¿Ó-&9C˜ƒC è“´ú÷pMšíi@ôŸD·>Êè“¶N"b¼3vâlûOq¹‹¯œu](;M1¦‘·ûnÆSÞaC<xçºK£à(î<„¼§–Lbbf{fWEH)†2yjtAdaÆ0æã$1÷êŒòÚ>ôÊéc·¢÷!×QGÁ|Ø}§|›êH¢NCBTz°d>†Žœƒ¬Ì½ƒ'&ÿè`ø‡œŽQ—ŠS ß`÷àwXÒÑÉRÝö{RöÖŽ€°C.œ¥^1Åsè“c 4#È€:bSòïH„%ç—ù~F§Î$¾é¸Õ5ï©x"…tªÏðÁJSÁ³T!±£²õdîJ“AÚ5æ ‹nc@ŸÎQFË©iL"SîÓ­Þy}B†yûLŒ OÜø^=ŠÖ)Jè/îTÖzzZFIUoÏ¡}‹0D{³îˆÌŒý?]|á@Ï ŸÆqÇÒʤ£•¢‹îNiéÒü“ôsæY‰¥Bé\‘ÒÝ=›—¹~†ýoOfq1ÎQ&NZ>wæBÙÝG ¹Á£ù4• >¸/iãÓÞ_0s'+ô©IîXûýä?¯¤OL³MvŽx>ʨ3btά|´ÀA$: ;ŸH‰ŸÏèpƒ±†xŽ2|lHä÷éA z”œ«(N˜ÌOô𣰄N˜9<½Ÿ~Ÿˆòç´B§jÏ"™O›u‰gê{éS…”Æ{@ÿGä?> 6ðqÌ8Ä1+ó;%õü‹>ia}‚Âï*×ï0ŒwɆÏð³wœ?ý?ß>ÿ¹xŠ£ð_¾?ÿZ÷Ãÿ=ôͧy“ŒÿûŸeFÇ?nÂðÏÆíü‹šþO,ÿ§<‹|>*=í·²Nódè› 0½sŒ-q€tÚkd¶n!%~^ùÐãçÊ%eïà]çúÞx·<3Î$ñ!=ô$¦!ãRlÓ uröØÀÓ>ù—üñÒyRÿîîiv{|ùi¥å§ô•±*õ˜{w§&äß›ß[.&f ü 8Àºo^ëÄzY/ëÊ"­W²b_¿|©­ý|{ëlβc‘Ö¢!XØDH77"˜ ‡;zsgžôˆ‰á!$“±˜¦¦?ÿúk»V!‰ÖÈXˆÙÁL«ÙZ.üç¯?¶}#’—Û—RJV×ë¶o ò@ua¤Òm»Q›oÛ¾m›ª~ûöUYUU€bòç?÷}ß¿¾|¹½$l:ç—å‚/06D4÷."Ŭ¹Ëàõ#]¢¦ªFÌ Õ="êÞˆ™IÍŠªE`߈”ˆ,ãÍÓîU[”¢*ž}qˆà“É‹ˆëÞš53%³Ÿ¯?2ßÐU&"¶b)~°¦>’Œ•^x-€«(²ë`Î7¹¶¦fËuiÑrZ3Ú#DDLÕ9f½‘·ü]°× ʲìÍ#(={Ýýæ"á,1äÔ.£ç?éÒðm«DXíöOæôû«j)†2±ÛÝ[«:zÂÝý±m³ýkVÐÁ$`tÑiÄ1¼á}V1^3N7Ñs9eç‰T¦(~gÌ¥'köé\1$³µQÆÅ‰H²_œ%§ášõ»'óÏ€0)÷Af€Z^yåÜ÷cÒðD£¯˜ŸªÉh¦†5xÔóSTè ¢ÇR?'Š!™æÈdbrä‰à!½ààìŒ)V~M®S}B:æ¹W:cÞ€…>uçGÿÔ+K³-€3éè‘;‘ǘþr >z †)z/(Á2ó”4 á1ù@æ=™á±‡*=fGchs(S“£ÓWi¾ž‚Ó$çóüFÜC<Ígg~¬ŒAÖ1ʜ׬¿›2 `ÆÀ ß:7WN]&¿+•>ÉÃ=OW%}ݦð},’|€ó Òk]ˆD!JŒCIî)#?Aît¼»“?ôäWÈIYÆ(sÉ?6=Üß|êïëgÅG:éÄÉqØ (9ŸF~³}·/;ÜÛŽÚŒÑNÒŸ¥Ž=`8õz4²ezš©Ù•‚ÝßÐÿxT•?‹·Oàà3õë½ùžè\D|¦|f’ËqyŽvNüþsr¡¢w-µ'pžÔÎɬ>ûM>¨€™|~)3ÔŸ«ÚG ï$öãúàydŽšï©þc·íY¿ÿ´¥öcj€øÜn@æ|Àèô‘üž+'‘?mú}Ÿ>á§ÅQ9|T¬ñQäOÿ”þ ›ÿgS ~ÂÁœ.¿ƒ}¦éø¤®ôY‡í3ŽãגּãïáÿíÞÝ¿¶³öŸ®ûã7ÿÇÂyþ?Ñ,ð®Ø£õ Ÿ•6c|€ÉÀ_Æ0ãGú“ Ó‘1¿AÖ a˧m±Ò‘B£§‚¯þ@rĺ[„³¹,øœ?Ë ‚LC}t¥ù#P §q.böõ{–¾»èWãàÅcš]½,¼ÏkNŽQ.B#qð¬þŸ¦ÞÄüÙ“{Ê’‘ˆfû,Etº0ssOÚ9lÒ-ÒÖërI ÷º,fV¬Ã%DLýäë1¡äZXƒP÷º{ÍWaªÅ ŒFªûló<P N¶ <Rôë·/øãŸþãõ?®Ëu]WyáZÛÞš©PðëëÏ_÷º×ëZnëm]‹š4D8jõ nÊ+&{æž}Âi÷¾ée]U½®×„0»»ªÝ®7S«÷ý{ûòåöõV´³ ”‰îû½EMù&‚¸¢yoîÍÃDYÕ4‹*-˲^·íQ£ óårY—"¢Û^SpÚöMM¹íGc’HõÍ#Öµ³²R#ŠðþÈ~Rá9XVÉû3Ë$Y! f Ö=뺪ê—eÁe]#<6ÌÜZK!—ÀPr6S+‹ŠÄðêê Lm!›_™ˆ²ð>Z w3Ki¬†·hy'BTK)y§­¹¼ÝüO¾£‰ºWÈI3"-˜%"ŠViÞ,—HI;u­­ : çø˜µ÷R’c6¦q¼·3‹£6KC«î€°A$Ô dúWˆ(™‡#¢gáÄDÅŠõè3´I“d¨ˆ`q•\¢óboûööv‘EM¥ÕÖZMÌUÇ­ GomIšW×+éy­µuÄN @9Ë<@0UG 2…CŽA:Î hïC§¿º3 £ò—˜‚‰×I P„P$VbÄÄRœ¶>îùaìxL’ÍiŸ!IÛ±``ÆÆCCíà·ŒÑM7„çêDZ–cJõ}#F"‚’ñž9À>²þ׃ÒµK€Ú Èó©WÇP¡û+%/Â9. "!'d93§IÌq"BXI!i€³œ¸ƒ”0<Ý`“`¢)ÛÐ`sê!b ¹½Mö ô2 zÿ©𴸲gv–ÃÝfë·ä[1¢` ~>:ÎäR·!§’œ†˜üé½Oš; %<-þžY ›¤jîjl£•D‡ù¨è#¢»“…Ä}NÒSŠ}NÑÇÄ$sáwýŒùKÀ{`€ø#Äp'gi$%Ïßç@[ó“xu¦ïk? E¦HF}q¾ù½ "# ™"áÓçý‰b„s0:TŸ5»·†h=š¢ÃøsÀS=<å‡X8ͲcD0¯øQQ:†:ÏìŠþØ÷Í!Oj-¼ƒ¨d2]NÙ³d¹“Äè…<¸E²Ñypäy\Ûc¾ÖOAwhjG>fBˆä-(g>}WüqÊÀº(ŸE°qæÄeK{{ÄìÄcÒÇ’N›Qo+q ñ0 =e¨‚œåO”æ±d¬–^…C=¸0§Y0Œá>û ?F(ùµÒQ?£®ù¡ÌŠ’kF3'L ‡áEGÊ1¢è£cr8–hä®pÐOH“¢âùvÒ sävî´žÁ¯1ÀÁ¹Œ£›÷tÙNÄšc4Æ9×>;pÆí?Ò§àîÉ s¸÷ù\ÔL49ïÚŠé}𪟵&«á¯Vš€ßTÏx6Ñ[Ç™Oü£‚zÌ4Þ[Yù tÌVø½H|Z$øyXqÌ2XßA›ëÿS¨'òæI ás°‰ß{ÑÑ’cš=%,<‰ñøxµÞóôñ잟l¯wý”Á:>NtÏ"óüÕGÔåßw<óÇ¿Œjý'Á‰Ïü³g\Ü_”Û¿Rýí8ÇßNqùlðßü~øïúËÏl(þû)ÆÃuxóà¿øÝÿÿß¿ÓûónáOÿÝSíó|€Ÿ‰lA=m{ðg¥Ô µáŒÌŸ­2ÂÃjbsŸ8¢‡ñý\Á¢‡ª¹`$Ý9#ð4›åS1¤ëh;½lî‡/:»+( ¡ˆÏœ¤ã¿å\„“ax‘ž.²Ì‰ÈÜA}~ÏíÚi¯þ4E³V‘Å„¸‚XTKã&QŒb˜P9=וè¾?¼\_®/5ÉÃâR–ܯÖÚö½‚I´o¤ÂýõíŽÕBá©L3á@€EÌl¯-«DóĬ“Ú´¨Âb¶–eÝ=þô‡?¸ûëÏŸ¿þñjº–•Ö5„¡ëRÖr¹\n×515FÒ$¢5OƒeDµæDX“,Á¬$e) „‡Ü#܃‚_nÜÖ?ýùǾí٠ɥ0&~üxáÛ×enî¡îÂœÚ±Šª™³örYƒ°Õ˜Êåªfù­ÍÍô¾mµÌƒo roÜÔ˜%M[Ì͇©›H…x‘Z«ˆ:â¥,·ëË?ÃI˜#]ÎQ´¨Z€Ô5€°ï•jMÃeKJt±óM”­ÄÁ”b÷õrQÕÚê#«3…#¢9«È\eô¸¦¦ï¯¯VL”Z·™`«ÝAsÐ3]-ýÝAkm?³§Ñ%¹¦"LÔ9þ@­­ÕZ¾•˲¸»ŠÀÃ÷ÝÝ!IëègœdÞ "²ì‰¨ªŠHmÕÓ«<“6LÊB{vÞÖêáo÷{‚À꾃i«ÍýËËí—/ß¾}ÿâ­1‘Û÷VÌîÇõþ㇩.¥¬¶•Ú4"²Â+\ÂʾíÍ[š¶§V IDATÛ+³,Êÿóßÿ}¨ðÖ²ÔÖ² [TQÒ–<õ0SYÒ«•°²‚¹EˆPþïhˆÖœ Z,ÛwE­6—ZGG(bÔÓ ëåJLã*µ½¶¥XH©f®î­5މhQ3WÛ´#Å3–/ÊPžlý˜ Œd>(QC6s¨eË«ç´füµ¬dHû–’˜99"RL<ŒqY–Á §î¦nýæ‘3è°læ­UTÔX%•Þî†÷ÅYM(/>1eu­»ˆ–RлU‚YöºX–5"IÑZTÖZmm|z@5)4PY–µÕ}ÌÖ¥”²¦Û=̼7om»¿Þ/—õr½DŸ™‘ˆ”by}’äž72³‚h]Š˜ÆÞÆ­îooÛËm]JQU³…ˆ–e!âÇc#"U]Õp}‰·Þ|¯õ×_]–‹š•b’óY¢L>ýÛîîÃ¥G”•sììûMk±YoŒˆm ìaªRŠÄÝ+'pŸ™B L`e„ š³L¸5…¨(L8€½÷lÑ\”»2š ­±ÔöÔ^°‘3G#æ·V ¤J*ÌbÚWty#ƒ‰ØkážcUÕ¤·;h¤¦…•ˆ•EU‰¸ «°;9¹d¸1úÀŠIˆ‘kÞ†{˜ ™I%-ZCSw7½)‹Ywti¾ÕÝ[c‘böÚ‚™‹&T÷Rd]–ÕZÑœ™š§XE”Ž ê†yo”JÑÌŸmû¦f®&&¦"`¦VF\Ó½z7€¸Œͬ(‹™ 9†"(äÁªˆìãíÌôÜ^$ަÏ2¸× ´œ5…bSd•mˆ¨PŸ)guÇÑ¿RMˆ…ÐçHÖî¤8#HÔ3‹ìi|Ÿ@ÈnÐbsëûWÐQ” Jf–1p00Ü3Ÿ;SÍM ɨ̘ª(H†Yu’›©ÛÝ;4&îàîßæ¤½(‹ËÔæÑÓñNwt9¦A±/÷Œ`›»á£Jwø¶ÇNxÚój¤’J< JQfÀDéçŸÝL 8ZìÑKǹ—Àò!¸DÆtê¿ÃΓ/°‹C,1Dƈ“¹¸ÓGÅC÷OŽ;¥®Këã;Û'™Nfþi!ŠÞÕ0$øÞà ¤uê(udœ BSÊš;gá¯ÿ8NÑDÂ=öÄ8âƒG’€o©  ÁÓ5Ì”‚t¨z`žPú“Ô‡˜ÑqõGê`˜ÃFÉÛ‘µ!|ù„=ä¬NÇ™÷N°uƒõø]1χÀa)N®bŠ)–žLº<¤U~ÂW`ð±Cƒ}Š“ }<ÿY–ýòÉñÎ.ç‘/9¸Õ]›Ë Ç|´ykR„À §ÑH®tïý<'¿Ótz*¿ôi”ZŸÂù©éUdÀaRÉGR5»í;Ù˜ÇÍ#Ü+¯gñoŸâu-8ovHçcQà4`ezBû"sƳU"+jNa#>Áä㥰Ï}i:ž{DÁƒµvðBi¾Œ§È×X¥zô„Qÿý4c˜ÃˆìÛ’éÙϧ‡Gzé„/è¡×qZOgjõ‡Öx6k$æƒ?rî>áHú\äI;8棳÷üäØ?ñ‘OãÊY&ñ¬Îã¬?|ƤçC ú Aâ©wÌI>J¡ôD6 $:ë»ï¦g‘þ4 %:-ÃósøIñ<ÞÏó8îÃoÑÅógoê“?ÿìú<Ë2|^jžl›ÏdŒqåIx“#Fóîü \sÆ,}¢?½æ*ìé3ïcÐ⨇?JöÏÙˆOú ÞUþòïpg>K)à“ßç¦M¢s|üeð”£øM[ýyåß ýsô¿¿øÃê¿(Ôÿ½4 'ø· Œß¹þ…þáÿS" |ZÎ}³ÌOyÖSß<ŽUŒÆ~*ÔA¤Gë¿›5a’°è¡µclàÀ'‚ËÙê1·¯Ãj*2¶iªÓs—Ο£Óà1¹†©eáäN{ ÜÉsjü úË÷"+Ëg‹]ŒcÔišYÐ ~šžh|€ˆÉB¸¶v¯~Y@ffRf+K‘Éý2¤Ÿ¶¶²¬ËõòíÛ7Þ¶ÍÌJY„t)Ÿo¯{­—u%+%9‘Ï"‹ª ¨¶FÁZ¹Š*íµEÑ"ÈÚ¦¾‰—<:…iùòíËÅ ±¼½½¡¹ïû›€H°Ý﮲^/_.×e½ñ9éeiÔiÞ#à¾+AP‘’K¦Lµ¹ïT%Å”Ü8¢îÚÄvæê;3Õ½R„–…ÚbH)&i´¦ 4Úªˆé²Ó¢Å.—K4oÙRÄÒÊÉÀ™QhV¬´Ööº‡Ú˲ª(±wgbÞ#ÂÆ,¦ŽøÓ¯öhý±Õ‡±Š®aaVq81¯ëB£ ±ÃD‡¡¦­µ½ùl ¤(¨eªÍ³G!%ø<ÈÌCî¹Qªo^ù`zNñ=m¼I¹IÅgî³Óû™Ìèˆ0³eYö}Ïw‹(Ô, µÖÖZkíþxüùǯüý»Šxk½G6Ò7Ú©óéÞ¥^-fI ÍSTJ„™$®5è­‚ÒoFÌ{Ý_÷×ÇÛZVbÞöÝÔn—Ëþô') ‘Sc²²V÷æþŸüã×_·²./_¾¤¤Sk]¬ìÛ3]–uµ‹Ð‚²ÕÚ¢WƒØ÷­ÖÊ Ý}_ËÂ"fª"Ëív½\EõõñÊLÇcßw&ÂfVÊšLYáÈQ:l¤H¥Eìm˜ì<@A¥$›ßx@óœÎÔÜ™H‹™ŠÙmo-MLÕ½Öáë’^vjîC†f"´æé!eSÍ\~®Ó£×º3|ò†oá¦:YãÉ:D²¬ÊÎÎN§%VJ‰~¶ãeY¸P=A #2S ;½7ç›Â"R›§Q7×Ðì«`&Ñ4»sDyôTsô~9"Ò4üŠd„»¦3 U çÝ’é@2 oLÔ2Ìš&ÖR–I÷*&Ä ¢ºm 2Û‘æg÷0U.ÌÌðˆ€™©pÍ›D(j8·¨po¢f"¶š31‡°poúêbXkÞ¼¥¨CÑÌaᇎÜüŠn¬9¢3“΂ž78~þÙî?F®óÈöìß>eæ”ðŒ•y¢¾ŸÇ=O Ó¿åÏ䣔ó§y%ƒÌÏZ 1ç—³Î}ò¡ŸêtŸÖÑwx W¯óӬɸ6#×seÈSÙ<=×H¼zzì;oíH4àÉÖ‰žÑógáûæäݤæ}®àcrÆç– >Hûã¾æóœìyZs,Šï%O¼Ë>Ý|l/ø —âÓaÒyZö©Ïïnè¶w|¢ùŸÂøLýÿ»£oþ1ßçw_5ÿ +çSnþ/ö,üWJoÿyvû•iÀo¼Æ)þÓs·v—È? Äð»§RÎ&z9¨<õÎà˜Î±ŸH£ ktpñ99$)vÞ‘ÑÔœ$ÔÚzþ›ùÏ¿þ*Ìß¾GÄý~oî}3=.“G¡šï’ð¬SËšMî2OD€¢¶@ÍÌŒ˜|¹\Òîš[î½5‡[®×Ë·ïßß¶-Z³²¤è`fª¼mÛ·ü“j«×Ûu±Ò<®×ë×Ûívy¹]®’ Ö˜]Lü ¦Öš&m¿˜=ì×ÿøãþØÿïÿõ¿âëׯ˺,ea¦²XÞî?Û®*_^n[)µÕmÛÂwS½Xýò?ùÓÿó§ŽõBsöŠ<0¨Šô1 œuµµæA«?µB5‚Šr¼µRŠ›•BDÍcD“&#÷8aP_ó¬Âœí¶;Ôã¢ôøHÿT 3Ti´”†>ÚÏêÚû+©×Á†×|ß[P \Þý—=ù·ªd1gk®×´ô*·8D ³±ù>>ùÉ88ü.ËdFEx>§­Ó±†¢ ¼ïmß·$Õ*ú¦½6¿JUSØ)µÖÚÚíz3•FTŒ øùxûÃþôòåö?þíßSrUÕbÖ;ˆ¼y~‡\IòÛšªŠ¨ºoÛãçë+}ýúmYÖ£ü £58"Ð]°µ5fV-‰~‰è:œ0‰ˆ¥”K!©Þ¶mç”s#–¥¸Kk•ˆÒ€šÆ+«X AÌüåÅjóÖZНA̹Æ3(DóV*Èŧã{€`æ©–ÅÄÞZÆåHþú ž8& \—ÛUD~üøYëžÔ&a!áIJlI ÂEˆ£DSáÄ;9GT„DÅŠA‡G€4‹p›gµIvª°hßZˆtKwÁ:ÒYÄR0•u];7lUM;n˜½5V¨°„ˆ»Ó¾«È²€øþ¸ïµæü#Fj$ÿ oª¢Å–½mî~½\[DPkbÝ[ëO mÛ¾–j ™•ÐY;œÃñ, pU•µ»ŠÑZ8® µî"’%Åãà:öf¢tY©íµîù LмëQYl€)¡±R²‘@¤$9Çaa±`:ÊBz!cHcè AÐ^ 0š{Ñ]ÌuŽéúî9ª-É›ó‰\ âBq<ÏÏ€ j Õ½R8T©âwÝŸ;xÿP—¹ï¥É¥ì\ùyÈØ«€ˆœ…"èÂOô•T‡Æ êĪN‰:š G»,ž„dÕ ÝtÖAöt†óÔýÅ ˆ€‘‡Éû?dÜã€ø¤W÷¨ÄØÖ3¼K¯'@‡øOcyGì0³&gŽ>†;e¦§XðÊ1Œ¹³[€ ¦S)Agù0P晎”p~‰÷–gÌ÷=³œHDœ¨¡Ñ‹¿Oˆ•¼{$OD>fùo4ã/)¬"øYý:AfCë À ùrÀ<†Ñ ïtàÒˆýòŒÊ…´b¤5?¿Â§–{~×1Ó Âg-ªñTä³÷„ß9ÿ޲µQÉ=Y1½Ì˜çû-OJ¯œº)æYw4ÿâàܟωï’y¿ô^ dc4’ˆñYˆ ãýœ^›ž*ÉçåÔ!ûÞ«üTÎO®l"j™Lë[É¡<÷ú’#.q@žÐyøÃ.Ç&œÔÊñÔžà èuI,ÃhG× Ï9Ã\hO«öìpwkÔ³ä<¿ ÎI– e§ÓðN¥ƒü\2Ú¦û¤wnáfÄ1ÅW‰Ó_&œC>Ϥwâß¶O4‘vOa<¡á? Zø¨ñɘ>úÀ'«¿K>g'ãáœÈ;4 Þ‹ÚçïÆO¬v~.˜ÅéKÇ3ñQãÙâð.ÏOùŸáRÅiîÛgrÞ Œåàù²Ì™÷‡÷åùé8«Ù}ñ8kß8—ÒüŽò‹'üIïççÉÆçÀûHÇÁ§Ê*ÞsÜOµ$L'Ù ¿¥AógÅÆLϟ`€óoΘ>U…ñìÆÇߦõþUhþÛ¿ýÅ_ûoø‘üy2ã/Úùù¯þ¾üa›ò;¿ßß ¡ÿ³xü+ ø³G‚?ù xÇU{*:ÁÓZp ú¾A¢g‰envf¬Už×¼¾c:í½†“¥žâ4ØÎMŽ®þ±+ô|Ÿ$!¢}[Їz°š'B‘˜Y4©DÝ)ƒãÇ™E Ã †ó¬óNÂ(ægCѼó“^$Óþßw²rBý<Gß…êúûbfPJ »hcQN.amI AÔº£"7{­¯{s'p ’C½×º&ø^5ë ™¨ÖöóõÍJ:‹“!¦ÎÌ&ÚÂE8›]=ô±m-štª1+3«x}{»ß¿þ|eV»¬ÞÜ[«v½|ÿúíöå‹ÙÂ" JÖqÞèÅW¢×«}ÿòÅtQ‘ÿü“ÖZßîNB`‰€™ÑÛccæ¢Ö¼ÁÓ·iDÍ£îðuYJ!fc•"s‡B@R㨃‰Md±rwoµºG­»2·²°È¬»Wµ9Õj¾¿Þ·Rô²^T­í‰hÑ<©¢yRTi8A‡2°,öË·ï¿|ÿ¾o­ú¾ï•(Ò™âÕ[õ¶o{ÓfÅàª*ŒÞ¬Û±é‰-¨± oí‘`cUVjðð~Ø Ôñ%z‡á­=¶‚Öå"¢imÉ3›™1szü3I ³u`ìU{gmÙÓ>C6­µù䊪·¶íûÛë«»?œ£DöV$pw ¤Ž,D€OBÕU¥y ¸‰©pB™:Ï$âµ&P¥”%€R–eYÕʲ.¿|ÿeß÷µ,qYÍÌl¹Ý®V,ÇE—åÂ$Å¤í»©ÕZ×eY×…ÁÍ=ÕЄuYú®TE—²¨>¼ú^ÛÏן òæeµe]EäÏ?~mÍÝ}]×/_n/×—ðxÜ_Ë[­µ…ï÷{kmY-:7šÁÞsªÊé³ËnIÀ„h]r{·ÕFµ…?¯{"p¹¬«ˆÀ36@ ‘Y™;vï(!"!j4õ½Biü~½r‚™Ä„FœC‘xR Ü·}woëzY–BL­3«°šì L\½šª¨1³‡g™À¢Öý¡ˆVê&h.ª¤Š ÝkjH‚ðÁ-¸^V³²íZ7&¶œ<+3³€±í;"ª»™ÈÂ&Úg6ÌÂÂ9b !!‚™ƒ…ƒD}«Nƒ©ŠH°Yb1òC0çÞ9wÄÌÑj@¡B–eÜÉ…"OÕRÔLE”½œ‘·‡‡{mµŠÙ¢K¹\/ë{«ù¦·}¯­‰ˆ©ÁÄX.×/ª""f/µíÄòóç ö}cf-¶Õ=ÄXÊ‚pwV³eY@9¦%dõ.o@ó¨*®/Õ½˜uô7aÖR¬,L¨{‘eY‰É#2ÒåîêA"U¬µÖ<4ÓB¼ªçxºÇô¨ “d¥}+“¢‡A•=‘Nñ`ÍUGHz‡'ºÅþäwð9z~Hÿ¤à>pÌ—ŒÃ2±œgp Q;E—Ôqê–’g£o_Òej:2}ÂE2}±Üá6¤Ì-ˆÓŒÂÄÝOòanfáäq WŠÐ³Uf÷O»ÿ4-2@vÈœ;ÓŒe çTÇÏI6Y«øh¥Ÿc >µú¥ž"2‘t;¼5°knÁ)Ùð]Ý“1>8©|È7|ê_LæÞL12ÂÃç=Üy» UCcm>û §òÖ‰NSƒ¡Sò)»“:oäÞ›2å$Úˆü¿Ì½Y—ɱ¤©›¹G$€*òžÓÝÿÿÍK?ΙæíË2#ÜÍTeÔÌÜ#2ZXä%ùBV±xøb&*ò 3I²`ü Ó?oÆÒz4\ÎÝ]<¶cBAP~Pç2û„=ÀáïÍ‚Štz(a}nù@î„–ûò6óƒS„¬9˜†&œ‹Ÿ{´g¨Q q!u¢ÕTŠZâ©­¦×Ò/%9™Å1úùßÍÎ3^Í0hΰhB_É G)w*•2á‘y/ˆQØü÷ోÉâÎFâ“ ›§`˜]yGÑÁé­Ï8—ž9Èú®¤áî´Ì®Ýv^¤1¶â=p¹iŽ^q×mt<ʃ˜…Ô³Â=‹cÎG=ßT$qlßå°±=Ð9Nž 1!²Ã¼<0°3ÿ0‘vîyDçΧ¸NÖ¼7õÿ, !’“ù€‘cöô0¼áa>›eèAñ‰•1™*‹0  ™œ–ôœ Ô¡ÝŸ`SÞƒ8ÒPS¬ÀIäÞ•ó1x ÇíÄϧw†üãÎÇYÀ£¯ñ,±ó©yþTâÜ|¼'ŸcrýéÄyŽ?¬øÜtQ ™çwûémðLy²V2Ï»ü”çqLPÏi5%Bo» íÉ|®²¦wm ÏI†ûcYÂ19ÂÓDàÝ3ã‘äý$þñ9󾵉¸Oý ü¡Æ‰g…ë4bcú°ày\ðäÛIˆz—8ùXbÅ÷¦ cÀúÄãÿhúôgÍþ!Eú×JþtBþoà}‘Î>þ,ï§CÏ…ÿûføñÌÿí|Gâÿî7À7ÏŒÉóáq^ЙˆG)Óaù‰aêI;Áñ– ¼v¸a"÷gYylÔä´ÿš¹ÊÞ°–%Ä}Hfë=noÜû{'˜h:VÇŒ¹×=”ðœ"ÂcÇιëÕý߯ÓÀ÷¸ÿ=óé8GoÙ²øh±’i}oPñȆ°¨’#¸Qr"b»ÝoÂ¥a^Jɺ×Ö<*ê­µZ‹êº.*v¯[­-¡·û=vº+Z˜y)…ˆ²/"L35ß·m¯m-2»D”A^}‡¿n÷¨MH觟þòå§Ÿ>zùôù¥º7#á˜K‹b",·Zãv¿oÛëím÷ý~S¿¼¨j€Uý)73÷O¨*ª x«¡ÊeIuR„÷Ú²14Wþž8–ÜH¨ÙUdÛëv¿3Ó¥,H¶,˲t2 AµKááÛý¶WQ½ouhâQ› ³i'˜§ÏÔ¬ˆÈº,*òz»×¨L¤Æ3 Ê CÍZ­œb8‚HH FC‡-$½Dˆ„µF}»Ý¥§û;1û±b茊D¦„×(%¢ÇZ»ü›“†ËºN¿óÐ…Ó‹Ù£ÆéïîƒôñÁ¬EÕ=!Ê,…)ðíÛ·æ ˜Í.p 8Sá8jµÜúúx–lôÆ1³ëårøM™km÷ížb.YyKTk…ûõú’Äp,¥¼¬ëõ².¥|¹~¾o÷ÿûõ«m{u ”bîÄ{ ß[cgVÄ}Ûn¦Øöj&û¾ßî÷ûíÞjm-¶}ÿËÏ?—Ë3â ¥ IDAT¢¢YqH€™^¯×ëzYJ1)L­,ë ‘¼ˆ™ýŸ¿ý­z°ûVŽý{sOåšÁÚKÍD% €¸ÝÍ6 6³æ­D×T$@@Û·¨”""I®áAÀ)þ•¾Î¾ë˜jVVË¢Ó©zï ™%*{9÷*1ê[ǦÔÔæl&ïØD µtGGî’‹ZH°È^÷ÖöW¯‰çá5q°`¢¢¦"Å^Ö®Ì,áîˆÞ 1ë(Ywªm¸0©Uá@sO§ü¢E¸ª«¥·´Ö˜ ¶•á¥êßQB‰¨˜©¨ˆ˜isoÍ[mîu¯ÆÌßî÷ûý¦ªŸÿã§—Ë%ÏyŒ´ANÔzjÊ €ÅJ¾@­Ûý^ìu}{ðéåååúi1Oei‘;¡lÈRBË›ONUÜ[x°E¼¾~ÛëfZÖ˪ʭú}¯¹Ýéxðæ.j‡gè'óù2è½’,é»Íûwúu¶7Õf¦îííí®f—¥X)]ÑS '¸ä£ÛYPÑæ‰IáoÔŒ¸×¼0ÑA¶÷û¶P@Xù!åÌÌbJ"ZkÝ[­»‹hˆóÁgëÝ$œwòÞ…Ó+‘Ãkk,2›0š·±WGxÊÀgx‹@m D’ˆNÁ„ðØ#¨„°¨Í ˆ8{2–èãëLQDuo­©˜3³Rʲ˜»ïmÏ/jªLTÖRÌÌtY.Yå¢*KY[«÷ýæÕ[kjº{D13Õµ,^U¶²NAˆkø¾WÌBˆ÷m'oáXV5ap ÷}«Þx¿(ÜÕlY¸¿¾½•‘Ê¢þR}[[ÌD^ê¾W¯¹LpˆJg,L—w¨X*[ aU!9,wYt~81æÖ¾P¡£ÓõØZàÀÚcLäùT@•Ãgɦ׸'6Âyv ´§žè”Hí¹ªÅlÑ™‡CfÅH™R¥Bᓲ޴4Äé+Ñ@0A"k;‡öù¶ÌrhBPÈÎðÔÖ1Ĺþ›äÞEt‚CƒIÆ—=¶}ÜÍÄ3mŸ^‘“:îOô/ÃshÁS¡‘ÃÔÈ2¿K©©”éˆ3`ʤÈzfî²bê{‚Ú¢Y¥z83‡8+½êxضßÙSyÊTQï·•ÓOyTºÿPÈ;dªÿ¸tà[ø¼þgãÍÜd2üL>Q&0ª”‡-sî#úÑán’f1ÂgÛ|Md½× 2Mܧ*졪$ÝGËOúv#tÕûj¢û¤ÍFþ˜êè0æ†VœU#{D/e,ff3dÐa¤ÛÌ~RõŒŽøø Ü ~4¹Çq˜Ó7vT»f~kí©ƒe)Ì~ºý¼=òáTó‹¤;Ÿã aj÷½¶öÜò‹D¤E¢5çòHGôõ:j`þQ^0ú,@£í}æ~ú÷Šàî3]ÅG]m:úöáÜ 1OŒ8QÕggA·^á\Pݯ§¤åäø¡vd˜(út}Ÿ}t8¿{¡£gy×1äã1Ñ;–Õ$‹ö ?÷‚ì'S4øÐñ{¢¡ Ðw¦t”ŠŸ*ŽOÐù©Ï3úYÉNd>' ~Eü:PÅ`ç@è|F¸ð‡†íãéððâïMãàíˆ ' ùÝxdÙ€;lrõNŹnUDŸ Ÿ{(§O‡ø»IþmJòo™ÿˆXÏÿà¿ÿ'¸Úÿpð¶ð ¾£[ÿs† ÞÌà_”àßyò}÷Öð8†}JùEMý†”¹æ$|2y¯3šáEf¡èÎ{~(Ë™KÇÜ(÷Åî)›7ºW§wîÌgE u´Ï†[z&”™†éáñŠê! œD2Uœ¯8\Kñàx ‘Þ ?%ÊF&wåTE/|"ž÷cÏcÎŽœ Pi:1‚,šSmtID8D"ÞÚ¾hYňtoܼ¥—P˜ßnoµíbº–ÅÔR¤ËF-HxÔæ_^ʺ.ŽhDd¦û·¯ot]Ë‹2ËRÌT·Z#BáéýÜ÷š%xáQ©É¢ŒLU¤­JX²¬“ZótG–Ë æê~Ûj.ûTzek. ©»µöúvûåÛ·Ž™¸ß7U]®ëÊ‹°ÂT“¨ÀÄAîS%fSñÖ}rÙ.  «  I‹¶íÛÊ”^s狨˜2„)Â˲\ŠíµºÇõb—R’«O"äÎD벺ûö¶Ý‰–öÀ}kB5Õ4&uff÷©¤,‹C÷.`€EN¸LÀ’ðÎG._X@ä-qÌ FÈÑ™²(‚Lͽ¥ê7Â×”2gÊXe]’Á=†%º.—0¨Ø±DÌ"S¹\ÖÔâ'\r®õcF¸Ëåbf"â^[óoßÞ"¢˜•RT»w¢îÈOB˜vJFbe‰EMcÌ:Ûä´ì('‘ƒü©m(¹}ÁÍ,ª¦–©y•ŽÖU³—O˶ÕûvgæÕ–¼¾ÝéJÅ´y‘¤`;¼¶ÂìÀvßò W€ZkA¼¬‹2Z«eæe]ATÖ`}}[. ©–µ$^#ì–RÌ4(îíÖÜÅôú²ÑÏ_~r¯÷º3;µ·˜÷êî­K•ÌáÁÌ¥d_0DYÙ²­!sÏðp"YŠ5Ǿ·a˜³|XDÒ œkþ‚Â’ä™ÓhòhI‰€ KPdDw=« gjÒÑ '7,æ$½ "Ø’Þc×&ceUÛë¾m·º×7Uf.Ř­м¡Û]¥W¸ 1 yê…½¶¬ç%¥Å˜¤tžYÌüu*]' ußAh­5Õ4›¯ËB¤}¬v°’xƱddjrÑbv»ÝîÄìÛvðõë7"úë_ÿz]׈¨Þæ ¼©•¥¤;¶¿~D˜j­õv«µÝÞn//W5]×k1eiÃ2†aÑŸ ¥(‰°©Q oU‰jަþööжokYH(‚(ÑR˜ _Z×Åî‘»l•lícaR¡ænÙV™Ã³7eZ–•€ºmµVfj­µp§Û=M9ÅÜë^Ìâ­55‰À².×õRÔ}Ñ߫׺ ©Ç^›3ñz¹P„˜åOÚ~­™4Z½‡Ø ¬ËÅJ15©Í5Q?Ɇ—IÖÈ`Åš£D­5!¶«FάÜ3&âù2Q&roîA@´*b$Ì ÷ÉÌEkÍŠ¥˜£$©Hì­šè²,@¾LLv®·Hi1%Õû·¯_¿ýòíÛ·¼÷è².ÄÜj3SQÊ×qw÷RìÓ§Ï"r¿ßÞÞÞ´Ý·D*jTÙ´Çæž”¬œ™³\4Õº3—²”ËeuteŽ©½0£FÜ÷šÑbÅuß[kÛ¾yÄB m“„©Zs_ÖEI"òëFêÖùÕY'=¼ƒ ¢— ³çꀓçÞIàèmîzdW+G¤Û„Ù‘IH|“œúlf}d74²Rtïþè¶äIw“ôö£na&°H ¶sP„buLwKgЩª?ññD5`f1¢@8Í’G ÁÉG¯¡LJwº’ÁÑÃ3]å;†* ˆÌ}û´ÎvÅQÎjrb'Ò,uAt  ØûÈ#ÅÑá«™¾l ¸Þ\K½\v(*’-ƃEgÛfê02]ë„QF~Ðy ¾–ˆŽ¢Ü3(N•5eøÁA:,i!³‚sT´²vºÐ`Š J^ Rx¥Y€›ÂU÷"ËQd²ï^‘T¢Æä‡z$¦Ur† äàl€™C:Þªn§ýel$7QÀÁðúì¼!ñè4OT'â§)ÅÑŽÒIXÝb2n¯ChGŽaúÆnŒXpd-&z‡™Ý‚}dNÎGáð|ƒù,Hö^±G@Œ£œIvšÓ%¦Þ0ÔÙ] éçÇ ®~TAÅSV·©í‘eÍnã˜m{Ükí5‚y ÒŒˆóƒ/šÇåC'íuÚ*1æÈröˆY‘|¢MdŸ(óiE' FkÙz…{6ˆçSŒá³b{ŒXé½£(UúzuŸ1ýÖ<¿Ìðž`T‹ç_˜±“ËOÚýÜ#Å‘ú?Fs¦;_-³S½f7²Nlf5ÆCb\]3¶0šu.Ð('÷7Œk꡺]¦Ÿ_S騫tñ¬å徎@'€>X¸FD"Ó7æq<ð¬¸òIný@.¿ƒß”ż6 ž½÷O$ ~'¼á½gõÓ_vλsŸÏæ|¹?à|z˜‹ç­ñuq ¯L½ŒùzqŠÁÐ3™Þ]£‡ÞŒ9ü8W·ÐûLzOO–÷ƒ/÷îx¯þÓñ$}øßKáÓ÷k{Ç4§¢Ý³‰bùàIÏow×J¢_…‰EÊjÒBTZmáÎã f6½–˾µl¸5+¹•ó¯{kM˜Õ4 ‰àO$³¬ka¢mßæbV†?.ÏÊ}¯Í[¿wâÍÝ—R˜ùïÿõKm-"þã?þòó—Ÿ"â¾o¹ÎáYž?2ízŽ'}ûZò¹û²”Ÿ~þ9G ²©8‚™©ÍÇDD¥G4ò„XD×µäó+BDt¯ûývÛ÷-«_ŠáÂBE4ÏÉÊÙÃÖ8µpsHz§i¸;™D1%ZÖ& „ £úî£ÂÄ–"¬ÌTk#楈*ypΡÚ^]˜‹-LñVÃÛáNîÍ[sajÖˆbé1kÞKwU’\”*‚h’ܬ«¨Q'xkR,SjyÍÞˆa££¢f¢¡ÃÄÎ ëˆôøMx„{¤—ab9DÏ[¾š:wA¦CÂ…ƒÓ Ì­n¹\& <1‚‘÷Þ|ž±·½µ²mß^¿½½¾¶V×eÍÚU±²¨îÌʯwoGDYÌìófºß·ý¾×VK)bæ gð^[´ &QK­ÜLÅÄÔTíþövÛ¶mÛ3çãÖ[]õ,"/—‹™åžÐ½îûV½5ÏœD4¢¼yˆh8¶Û†ŽÊDÎ’œ#g–ƒw!¨'ûN8X˜Nrb a‘x§ˆ¼ßSïÂíë Š±,œ¶®s0Œ@‘9»®üóalÆ©Jp8PI”‘vø‘tÈVe‰»S­Î:æ¹ç?ß'¨¤ï«SY'bcpPVä;“`v Í9fƒÎÞÇ.vŽo|V^ú5]±'-%í<€ ïq&j'öÄÖ‹`AÑ)ñ'mt€gæy«KøpéBl¯þf9á­ùT¤ú¿’’ï½–vÒèÏÞšÎ;a>ŒLqONÌaÌbo&ރ„dI–Ùp"L‰ppÔó«€Nlø$vÝ—O…eYð¥Ìjiy Ð"<µð;\—PÁóœø1IL½¦ ´‘þ꩹gEÿ1wqâ„m c Ńôœ*9s´ŽÃl}•ù}˜ÍqA¬}j“ºöC¡(¦;ýÐ †ȧŽ}*‡ q¸ªúé?jFA”a BÙŽ`6ˆ‰¼O±FÙD1ž»UiT ëA'Oì™È;5î¼Q=7æ2z.t3 q€ì§™¸›äø,8ŽA•œÏëQµî1vÃG‘bziÊqJépÉ2zŒö‚3 ';½ÿ”Ì5¹~ÑJú±Ç˜á¬ö ·ÛÌòÌ~yz$¦îx‹¼eKÄ¡¾3ÇhzVšcš9ÇéÕO¬Ê˜%ÃÞÈóÆòèTÇ1QãHùG_¶Œ.:::º©DÏŸ±S8û÷'jža8ÍôH$úóÈ^¼#8Ó¹]G›6?XÔyH |Ò8ð=vÅSËÇqs¡÷~Q:B4n`ßqbówL8KÞü~ Àtî(y’WðaóÁÑ®8þ“¸wØ;ñá¸×ƒ¿ï–™Îëwc/fVóh?èéô@~}È8ëTøàÈ?ÎU>øˆgµjÞMŽÿóø¥ñz’òqš ̧ç÷æ§àùÃóq ýðû¾óŠÿH%>Ä4Æ{Çúcó{Íôƒ÷ücÌüƒ²ð¿V´Æ÷@;ÿ4eœËæ?ô'ð}°^®ãßä?ç¹ýxvtˆhNO£¾† pé1º¶¦GY¾¯ˆùà÷GPZrÑI…š¿ñÁY‘?R̹V£c™HÄgVžY¡É '–Ñ;+èù°AÏ“®Ï•ÏW7N¥Gx¼Ëͦ¢ïÆg}üT}þ|~ (˜ìulTD•Íl1·_~¹IÔëuý†VUX”˜­e¹l.5Zk{Ý‹-˲tB ‘Š4÷­íV•i«Oãíº®‰ƒOçbvQ1s÷æ^«%dTEUÌTY”ˆáNÀ¾·ý¯ÿù¿.—åÿùßÿ{¯»ÙÏ&KºÓÂI>fZ¸”R2mp«÷®Ý­'ËR¨­š·½í½—B”y÷J0±ª¬ëÚÂÎ"-뾊¥·Ûý—_þ¾®—R–+¶V+°o;mÛîéUTÑe!nÞ8…JÕèêvÐC¢uÔiÚr…™iYÊõ²X–ŢS×[0â·ûvY‹Šö3+éeLŠNo¾ígƒ©©J‡ “›hP«¨-¦­µæPIrNëãÁ&ïWšglžÙáT§ú¿×&²§µŸž—§˜díûN@ÒÕóDuw2ËÂLû¶•%%]‚›-f! è”¬à‹£Ú”ÓœU•ÂŒ51 !ãÂ$Å4P8èîíÓ_¿|ûÏ¿•×»3¹ˆ„¨1ƒ‘$odŠ}7’ù¦ýöŠÀk3Õ0óˆ" fµ")î@ëEéºm"dÃâo¥˜Š‹ª‚BXrxš&ôôsF—ú;ê †,ë³zÔ £ºÔ“åÒ¿2”&.¦¼,ÅÊÛ²þ×/ÿ·ÖÍÌJD)F¬Ú÷RÙÔ*<‹(´”à¶oÕÜK1q e_g6jÝY4€Öê¶m̽R£”e´tªåíîóËe¯­µJÄ*Yù D„‹JÝÛ¾oªMESZ×…™^__­”Ï_>]./‹ÙÞZÞ„¥³æržZ7fÖtµNsîlì å².Zµ“N™l1•(¥¶*DY'«jæ­e&VÌLðˆ¤”¨Š»kJ¦DIöo­™ÚØ¸Ž½K+RÖÔ\ˆ„9ý]Ló¥¬QYÖÄäîÖ4!LrèÂf–ÆaÓDâ-ó[û¾ÝnwÀÍJÿ.ÂfËRj-jÝá  œ7p«•……á Þ“*Œ`0Õ½†G¢’"PÄ<àÍ ¤âÌ…)AÍ baÑ,Hï´·`ØÙÑ…ÙCº´0·æ9 b† 7f–õÔ9’Ìð8ºÏàuœÖ$£#øs`۾߷½,ÀT‹½ÌÉ–¢îIBso9ã3y}»ßöM^¿ŠÈvßï·-‹ÜÁäá ©žƒ((sYJƤ@ìÙýÛÜÌÁè×$jLÎÂ’0\ ðŽô4Vž‚p˜š¨˜iØÝëÞ(ÈÌ›‡0©ªˆ€FÕ I/‡æ$!Ä¢"¬,:‰ fî”eæ£9ÒßËS E¯îìö &DÖÇs×ö:‹I¦ùWz—x…ƒN€.â„>†ß“ž~Ò“"®"&œé‘|þ %¯?{6èT{ˆy|‚/ôǰ–,Hµøig~rÚÊ0ËÏ<éÁþ¡#ïÐi[F_éø÷6mÑN¤ÂäâÈΧnÌŒü‹‡”Ø$Üq60æ§ÏÒÄÂÄAÁÝ–>³¶‰fGOrDl8H‰Û¡¶òV›&($…îÍ•N6èÑÉà)ÔŒxàÜ¡0Ú¬Ç`¡—•‚eêgC#<ð1 éÕ¢'õçp%g±ƒf.ÙÒ9’Ê·æYe¬Ãu:¦(£9†A¹køäÃ@=¹N'¹ Ù`0ig”P/°eŸa¦7’¹JëËòˆ¶4åYvpÜ™bF¨™y¶EŒ1YΟN^™=[cbÁ“¹3“H"(~ðl²§wcƒ-ücøI7çw$—)ßÏ#†'wü³ötܤ¼ô’ム#2‚/xê 8¥„ŽSˆ§aDü`è;âS*éaæ|øü]z ¿ï><þÏý§ñ >ù#‘»/HžæÑüX%ó~jóþÿà,‡ã|ï<"Kôï*¥ï0&¹Ç¿Å;W7Ÿô1àCÅþƒ¯ñ0•Â;óC»ýó?~Uôç|ˆï‹€?”’4Õø7ó®ã7|±?.xã»ÿø÷ÔÒßÁùÓ¿ñÓü·#ÿãŒ'ß*/uác²Çïo£x£CrZí(ŒOÕ]oûÿ’Çú.ÿù(¦£C¸oØh>Bã´®Ç ÉéL:F¿c)£„@ÇH‚ŸÕÄzÄQr“ïÒ‰ïÇÓz=Ä*ð~lyž±ÊC&è9üð™&*Dll¶”kæÌMMŘ+ T5€»!¢µeYT¤ÖšfÿÖš¦™û7‘ôt¿½Ýæ"&u»ñRÌÃ_ßÞ"‚DTdš…ý´Òá… •bb"v/ªµµ¯ß^ÿ¿¿ýŸ|þòùr]+ªÖj3)?ùÒÜïÛ.¢Æ\Ñ™d•¢ÖÒºßÒ2ÜIÙ—Ë%<š·”þ=ÚÜèõý;³²™¯—u½”å²´Ú¶}1 &PÜ·­¶v½ éR„)î¨nuß[ó¦ªÅJj N:‘‘J‘4\z»ÝÓ NHñaäH‘ÎLEDM‘”›„DˆŠš®XHØTY¤Ã…Çr³—R)‘cžR8 ÙIŽÃ‘R–±Ð‰Öhß«ª‰%ö¨ˆ†&n w¸°·€`*b8WË ϶ï©Íe+ÒúÈ=añlª-¼,fú ƒèïî9¼êÈ#B„7"SådA¬,*=µ@8ÊDDªÒ·î¶}/£¦Ø½‰¬¢´cBÙjmÍ-ã-ÄÞüÛ·W+–÷/Óòù˧Ê0¸²îµQàz½ÖðEízyùöíõ¾m÷ûnö¦¦×et•…KŸ½UÛÀ½ÖböéÓ‹™¾¾¾®ëº,‹²$‡%"RĘ(š¿Ö;Üßn·<@iŽ&æe]¾~û•~_ÑQ„f¥À£EPëž †Pa"ÍR]’/_[åªLDe5•`Ô‰àh DËõº×º˜vtx1!΀;2èÚ¥“e¼c{ï#Ò«ÙÁ,*)DO¬êlÞ›lV * ì@NÎDdo-‹F{‰ 6Σ IDATÂa1w''˽gÜÓ¿_Ó7Mä ¥pJOzîüßj(qŽ‚rô¸í»™YÂn8ëÍmßëƒbÚ™ûTlТ¹·Vk4ž¼Fö½Šê_ÿúó§O_"âëím-KÑ^wÞ´¶'V+¶· ½ˆê¼âš×<žjZʺ·ƒÉ®"Ík ñë²p²…Ýz¢œWeÿ„>51ýnY¬¶~Gí:iÞbLõ&€Õ RxÐ>P@ZòûñQS&VU¸8"²WXDZmD´·Ýk…D—3AD0‡¢˜y°·í~Ûª¿"hY×RôEˆ’¸VÜ[gEmî„‹•là4É:÷B„³È^« KkµµÞ0›»k„{‚AžÌ–ÏAoî„ǺØY†-¥ä¡yKÑZTXTBué<ÕµVQØHA¤©/‹°G‹œß1{óû¶›hY1?z‡*˜Ì{t eYÜ=Y‡–Ûý.¢×+Û)@ᵡ5ÄÛí^ÛnjËeiÍë¶ïµ™ŠŠ‰**c+ÅTsVra5+V¶cÊLá}¨$ÌÚÅ5Žn&êBI7•àÜýǾbï2b6R¨Ê}µ0\ßÇÆaÂï{\5’F‰)úÕ!â M6ÇuÙFbÀ©‡LÓË+¤P¢`ŠNŸ:ßT xðsy~8`:Z‡{Âg(îÌù¸…ƒ“m„3ÃøÇpÔËÉ[žr)+3×Îz΢ބsæOÃ:TEä* ‘ÅòȤBÞ4Ksa?þ]¥ñŽ šîûÑÑ?ÎÇ‚àc?ÒìžAù™Î,œ9ö9ϧvŽBøL_™pû|àLµ*¦O„̨OöËQ„{@ªÇËtk·¢þ…=Àš°S0Ø™z×îá§d6f'¸?É…Ubâ1ÒŽÑà±§¢xPPøÜ”‹³Ãý E jL:ÀH¤óéÇq¦Ñ0ƒ2sÛÓ÷ŽÈŠˆaæš“›3ÂexÐ=›÷ÃΔ“yœ§6L­é­a:Ë^Lq’Ÿ&ÍfV œcîýŸ¹wSdSœp6&ãä×ê}ôO´!^O®›èHõôï2wÕ„;A)ÙËd¼¡wƒ¯Å3Œ‘·˜þkúöé4±iË Ò2n9ð%ü0xhÈeí§Þáa"Ê" È1!û³ &†ÂžÁAÄ"ÅŠNó3çc\áŠìÏüê½ÕéôÙ`lÖ&p‡»wþèÈ埽œoE‡ÿï9‘Œ <@ý§© ƒÿƒÙÀ‹¹œ>€X‡rŠ¡LŸ29tîQþ^Sç’ àÓLãø°úƒŸ<æÌ§uûlè<ýzœž0"݃ü}íìkï¼ÐÉÔ9b68˜)çÌY8}LƸÛáÀ÷¸ëãÖS¥ýq"œù8g‘‡ùñXðcÐìk?‰üÇðïçø‹óÁûŽÉœ¿«Nž¢IßëNÆÓôºÞyô˜žž?sžw¥óìƒ&Þߨû>§ ã"ømRí¯5ÿA½ûO´ÏãŸ+ ã÷¼ã·»ÿÊÁ…ë7kïøÕÿ ¿ ÿ†ÀvQü;þç1¾ôîÁq¬¤0„ì±lîküy—À)tš>~îÖ}>òÁ4R‰‚‡1à(ÿ9ÝÚ°‘´>nà3Ê—qÖ,“ì^ >ã4yØñ°6§ûg«Ãló™qµÇ:ýÓihjÅÌZ}ûúõc¡U\ Qe!ñ¶G-Æ¢÷mÛ람mÕ*œNõ—ë5=Ñ×åh#¯Í=bYLEî÷{bšë$N “¡5c' Ì úåö¶×öåçŸ?_?È#.—kÚ5¯—k‹¸ï{¾n9ÀA^ý[}»×=š#bÑض}¥ô¦³°±È#TÌx¹n¢~”…EÅŠ‰l¶yxKÎ I·pVIY1Æ×xkp'³ZÉúZKF„YÉR7æB\LM•™«Gó–ð™®Àäi)â-ÞâþÓ—Ïf²ïÞqüI®7!)¦‰³P0‘t@!ºå ÁÌV,Y"Ãó΃h¯ÌÅ ®*ùˆ(fŽ`áä¦3B˜t¡EBÔ¶Yâ„­¨š¥ÄßZÛ[KƒpÊ)ÜÔÖ2E!É—Þù|lCçBh°]Sa)ëÒZC "öˆZ›ˆDk< Q&:¢äÄHœ%ÝÁ‡Ë&EÿRʼÖö}÷p4xw@d„}zq,t¯{Ý[‰r‹¨ÞV[ˆI@×ëLß¾}ýÏÿüÏÛíöÓO_[çÜ‹‰U8€Øë¨ŸMÞ®ràá//WeN®TDÄÂ¥Eä­qÛ·½î÷Û]U›{½o:±e¹¬ËÛëÛ8Â*D‘|›¾ñ`ɽrÚmËûTˆ SrW²\ÄL;C³Šáéxky]‡»‰“·PÓ âñ#BM³ŸÂÃû/AÌ™®PVI%>úö¯oD£{„ˆ"¼5g¡E¤WUã&J‹±ª~þô²ï½ì4"jmÍ}YWD0˜µ³âì-ÿ&‹PQÙsËž0$3I×®šñõ"ùÁ XQ‘jŸeo­5"|{»‰È§O/È|Ó9UÝ÷šËD´,Å›GÄ_þòÓËËg®µ~ýzo×—¯Š$û~÷l3NkÔ ôIF^‰Ë²fKö¶Ýs¾«ÚÇ]á¾Ýo告æ^{ËœÏIJv«±以ô ¹{°Šˆ¬//ÍÛv¿A'÷áÞrÒFëúbEDšssä=!9o©ç- ‰ç½Y=m‹)T™o&­Í•™I2ƒ’Ø5áV|ñHE9Mîî‚E/¥ˆ²8œU;µ:¦ÞÔÀÄ$J\kíÖïà aQ—>?µ¨{Òü#‚‹ú…""¥˜°¶hÖæ^ßZQÍ®Vë\଻H_d F53aÞ[eâRLRÌrä3ªÕ•TsTíè½r^«­’J1g¤!BMÂÀe+…UTô~¿×梜ü"7¥cBœûüßkÍik.®Öe½~~¹¬k‚ûÔZK"]€½9-És˜`"pTDk¥An˜”˜(4¨9y_fKBcŠeÀ‚µèU.kY>yñ毯¼ÕÖÜë½Õ€ /KQÏ$Ÿ“ˆ(1šxˆè”sv>#ëÃ{ÍM×·b°'hãÉ5ÙÖÂGv`R ˆ0F@wÄ#bÎxÖžinHÇÝwÈ]ðÏ€_§Sw]!1]]…”Žè鑨ƒ¾á.NóžèÀ¥³)šˆD9òu¢IÀË„Kö¹åT²'€úUL未eyö÷jºãf B`ÊVùaëéÜ^ZÂ*ÄZ †tÁf}œ™}ά£"‡}ÐÓ<Ã'”„G!x¿=€“r8í„7šk^™µÐÙ¤ƒ‡Öá#T;cœ>ËG<“N0±ó ¸— âŒý <Ñpø´ÍÁiŸBÝ 'PU_ãh¿&>¡QŽÀ 6Ñ)nÅG:ìüV'cÿa©ÆƒÁü}Ùít;¤L¿(¿G¹œ+ÇϦwæ“[žÏŸðZÎ>ûw €£cåxFÏèΉðøñž¼¦ŠõDž? òsvu2˜ã{zäñP?”÷w¤™®xŸÿ¸>a¾“–÷‘³º}zž?™ÿùt“ûPñ/ä•È?’=™ß«êø ûQýÿ|nW8^ùÁVûþdÁÓ(è]Vå°zž*dþ,½ûÏÒñÏxчáߟòâÿ ‡©èûëõ‘æÿ³’ýTø~´ßûWä8x'ÎL¢ž[pùéuÏÿUV&ÓÁ~;ñÖ˜'$ ‡íý`ÄÑ)BÝÿiβ‘l®bè¼D, íÍ—3VØ3OÄ÷›¨¯Áåpúœ¤ö§Æû¹È›¼Á÷%m|:|r:ü4dþ¼#ºyTÏ?Ž^æc‡ÏUMDL,ê•|»Ý [Q%AdbkÀÝ+¢1‘0–R„éíVÃý²®V ÜÌ{­¬»ïÍck;F-ÜÝ#ACiùO'àôP8œH¬3iÍSôem¨ª(/×ëåra‘½6øt½zxP4„™¦ŸLU™I$«%°µ5&üåç/×e©ÿïžùÝ;‹RJBDa ÎÏÏ À4€“0@`Ѳ}y¡½ìjƌ𠫘€h«û·VoõîìèµS*¶( $­˜™JDlµEçB23ßî÷½¶ä#宾«:ÙßÞ^KÑ%.Þ]ÈÁÖ&è zèÌv‚|ðÙÓÐÅ¥ØÞ’žðM'éppFÃÙ±25ÕФ™O*qáRÊ‚ð}ßß^__>}ZW5U³ë—ëK¶×v¿ßßî7¶’^ffR‘`€TUSæQNõÐjÅ":þÍ"&¶¶ïuG~ëüq)%ë¶#àB ìµÎ²„#e‡­Gh„™2[¶Ù¦m¹6_3+ªB"¹Ó°í×ÅJ3^Úêíæµµ<ÏÝC˜)˜—²\×ÕLͬÕv»o¡PaÙ·ýÕoÄòéj¢ªì"B½#¬îUUˆ„˜5û~¯×+w¥M;‰ÈäÎ_– ¢D–K‡peZ‹}ùéç½:K÷? G´¹»ÐR$;Á %4&b÷– y¦†`’0ºy`§^Í¡ÑcÅòííVë.£}І UaFÿ1'jÒÒ"¢%ÿ„ÙǦ6ÙèZ­ãüÈ+›"7¶áù=°ª©Š¤£ì ë¦Ý6ó¤*YÀÌ{­VJB˜uæ|‰ûåÄ¢¢ÐDôä9ÔZ¨*¨3ôsÞžìx¹–Áa"ì{u÷gæÖÚ²,—²03n·Ý=Ÿ$"BT®×K6 $®}ßkcY–%1\îííí~ß¶ëeeæRÖÖjîi[­¦–G˜(çXÄÌKYšx­UÕµ@¨Zk; sQÛ"öº·ð¬N0+"Á¤ßß¶ëõÚé&9b㼈h«û¼=¨š{Ëfò¹ _–Å=²Ùb&rÞÐ9È'ÒŘsjQÉÂDiwà HTäárYm)¦öË×_H­Ôö $Eáåó˧ϟßkQQ¼V*‚Î’3/jzYYØ[ËQ–GÀY™[83+›µÜ‹š²Â"LÊú–쿉Z3e*fDL•Lt)˶mo÷[d3„ô[_PÞd*²Ý·½m«.*„Ö|߆[ˆÚx!û3#ÌJÝZÒ«Rg)εxLÑãá=,}Eš·2>¸íÝ‘ÊÊÜ«/ê¿»V”¥è®ÀÞ*:;õBH@*c-s³Ž.l§õ'W,w§' O 4˜Ug¼@”Á]Ó 9z·7ÏÖÌaùŸýµ'3ï°–æ$°{S§ õÝŽgøc³h”†úß÷A‡Fátº,Þ-Ù`‰IZèTÐlüzÐË)ç2³‰w(gBT³Ñþ±ãP†÷gë3ôº, bÎzpf#é^ÇKŽ ÆÉšƒ:ŽlК­ ,½=¹ŸOä…Ñ|îýÇDø¤®: }nIhÎn»˜Ý¡Ê€cÜ;ÆŒãкp¢8 ÏÎËa(8]1#Óuü“ ÝÇÝÕàü*“Ÿ5˜¬xÐX”~ìØúžf˜^†((û}M8ýçUÏ šï”𠡉fš;79I샬År<èD|ö|Ñ ð¨ÆígQúfX¹O8¥x’)²iš‹#ñ¹¾Žác™=8º:rCgò9÷.s-ÁsЃ“ïÔó v·1ÙŸ2(Ÿ H4+MÍèSkð÷Œ³|$¨/¯{“ç|¸ 7Ùð$óO>V€2kohúñ“ }€"}Õ<º“úýXÀAñ è‚Dç¸fŒ:è!°ñ ÷ÀCÓ«c¼Bs›„37e.fÒ’?"¤<ðN0ÇÃßy¢Œ #9¿óÎ*¬x8’;ÌüDH™‚Œœ¦›SZ¡÷xz0¾ŸLóÌz=èñYÀœúUœñïAêSá¡G9ƒÎÂ3e5[>füDª˜)t~È àäÌ?Z|N¢ ¿ ¼Æ?ñÜ•ËG®á¤UÃçqÈéÞñQ»ìã‰Ó;‡0ÖíƒâC¿;ãYƒPÿñ|&<”4ðó|_=|b቟sŽiž~àã“~‡ID ÊuO³|×Áÿ^÷çw^~ú Iøƃ_q‹ãwŠ«ç¯@ü+â/ÿv}ÿÀ¿ý½üôQÇÇoš[œ‚,øQùðNŒ‡Ñï àw£'Ä׿:ðG¦/çõ=Þá€ðð•Áatjaâ?@wt*èed˜Ï,¾•¿£Ý³ã÷ÀÓTt>¤ÊP x~Ñ9=e g_Ïߦ/‚Xz´”˜t”P÷Êâe9ÿ®òtܘd†Oï‡}Ó÷üaØ(rn1Ž›8å‡ô ÿ€/—ëÂvYér-ªŽVi–ªEß³Šˆª©,‹¨‡+Kª–E‰Tc÷Úš3·Ì%VjÔË‹„©êe]sOîpÎ-8 €ûV‹•ëZ^.—×ûý-¢¶Ê.¤‚p¶”õÓú²”¥”¢ÂåzÙZÝ[Ûö½¼¼˜™s7N3³{¸x7˜3Y)¬ì5-0÷ÈŠÒ òZ%í¸ÂÓb’»¶Žóì»ò”!ˆ¸˜–~»ï îÞ˜ØÃ÷¶ÿí¿þÑ< D¾yj¥[Me±‹šÊ•‹Š˜¹ûßþþw¯5ÜïÛ΄¯¿üâÞ–åRÖUf€³.®Qоm¯·;r"!ª¢ÊêmoTLLìä#_Ì2ÛÖTh9Äûê},µG:AÌçez¸çÒ³¨pO*´d”³°ˆyÛ·u½°±ª:E+«™éý~ˆ´ˆ‹jëëc%ùFF]Ÿ]0î.G}Øèþþ\Ñ/˲,JLµí­¹˜ª)‰˜Y¸£…»»ª¨HoO&‚Ι«é˜øEò£TJ)VD¸ ¶Iþ…EMûÇùòùs)åõõÀÛvwES°eï7“¬¹uªÁ—uaùéò?ÿÇëíõ~¿ÿí?ÿöå§Ÿ®ëª–4#¡µB`3UÑæíårmµeô@Q³tG8QfJGþèÙ[â˺¾\—Z!ÚÁÌÌì­9SªèaYÄ]¨î¹åM4j#&C'^‹‰Q•¶½U”—EU™ø~»»g­*™*ñ€ ÚÕ8áˆIŒáÄ»# mB* äTX²y¢3yp§ øÌ.àù‡£wyô(eŽÏiµ)K¬xFuÏRbWïÇM/5Ó˜™‰¹³ ï“‚®¤ã>t#³0Óâ ¾¿·â­ŒGPø¨ÒlxÜ·å5yqs†ŽÖ™õžÝÄ?¸C-9ö<œ:ÏßyæKV–Ï´HVtdºe ×G ƒæEÆÄ,L8üð>™ËxØx\SßV >;w½•°ÓÁZ|dl6Ìfó™± sßoŸãÆq5¨øàɉ'a˜yNêÞ«Y|œ¶ R̽7æp»µ˜óJ>˜>½CÑ<Î3>(úýP ÅæXŸÙûWÄOp<1ìÏP°'50õiÆû= ÿÔÔãý¹Ëçi̇vãcjû}}ñ ‘à±^ø$¤çã•¿ùùÀ)s~ çyóœ€?œ(déÙü¤ùÿÊá·ÈÖ¿nCø¦þ7XÍùGoÿiƒ?ô¥þ Fÿ{ÅŸ?wøÑ ‹?þªü'Üg(üÿÿ¶øŸ|z~ÊŒÇÎÃÈv.IAg;JϤ— åt9 ßÁ|ž7Oa}ÌËEúm(S’ÙeD.{Ö‘#öÞ•𼱎@i¢Š¦/¦“öªÜEä¦`ؼøf}YME/ëb‹6§êBpxÔûÞÎäÂXÖ²Ëc|¹^MdYÞ·ýv»©îÞüÛÛ[î$«J“1¤ZD­(bð^( Y­ˆä±,뺬ë­ÖnˆfuVìe½ªê}¯­¹¨¼\®ûÞ~ùöõï_¿¦fíîà^5”\bSuw3ûËO_„ùõõ•‰×²†F§ÿ»WZ€‚ÔB©4ÒTÒÇ3;(7>žÇÞ¬ÜZ½'4hug&SS­; GÚ£âçëUMkm ;šÜšòÞ<üë·oöÿs÷~[’ãHòž›;@FdVU÷ì®~zÝèFïÿ’Žv5ÿº23Hî® @03kº{wfVÒî9szzª"3 07ûLÒí¶&æ­5-Uו„!’ÆGmÖVèþXÕžúo3ET•±l(騽íHyHº è#ÐéâÜN†È3vr&ˆ“µ4 µ‚ÌX¼kY`߸Ъѷ¯“ÂÖ] œ@œ’“‰Fµm´Ë„pã§µÕñÀÑe.–_ÓÀŽp•O虸VÒ+5g3<™ƒO#¹]ÕºnÕ¹Úß„ÈO®‹˜XÍzé~ºé}R¿1Aœ†ÖÖÙ£0"¦“ÙÒ°7ª,ïO7;×gLñQ|s15}rüâÉ•|iINy·P[¡ù˜—wRd·Ç{‡ÿ iq5ø0I 漆>Ž,æáíÔýYñ)ÖuôêQ;õ^Ú¢è=3ñ”ñ´2!ãã ÃHLLbœÅÖÖG)mÒ„ögÝÿNˆéÅçY {Å­sºfá;ßò+s]œ[•Î ®93 ƒR;ªÈ ¤í$<ßIîð‹úØÿnŒY‰}üÎ~Æü”l­c3§âñvu™„âîd•ƺuêËÞST}úœ.6ï$WÆ9>á'ï›üÖtüÒи—ÇÚIÍ çG ÉÚjÿƒð +FD̽MÄÛ7Ö}j\CMgpal8ç[Ú›¶sâ…/\DÄތܧÅ,Pïžnï­äW×–[oè¹€QÞÑæý>¯0ÕÌŠö4’û¡ÔÕq‘ öA¬ô)s}å Óžxc¾‰3Ô+”}vþŸÉ¬ º3(P8û /á–‰ tæóÞÙ·ás˜ä"ÈàÌX\DU?ø|õ)ˆàŸ©v×Ç(pFñÏUûüz}ðËû{-Ó¯1‹¹Ê»-ûó5ð®¯yVL•Âøhÿ÷w–QüØû?ñ–ü£:ÿ>Jòn>€iCA~' ÛuòàK‚¾ ì&Yø3SþµU\ó&ŸåÞ]Ø÷6Û½6~‹Èì¿UúýGKÃþ·ÿÿ£äã_ýeðOVÄý÷Oü?}ÆÉàu™ÿã…FåÉx̽'› S†jˆ1|ÃäÁ˜v2=¶7#ÏÌíH‹Ë Ñ£9±‰‰ÉY@ZÒi@.6'ç±€žýHÄCÌ:kˆ™˜ß¹j¦¹õµ¤wʘ^zê¦7ŽíqK»<¯.%ÀS Àüei~÷±%«F¢¤„Yën1ÌæJfL{ÊBFNœHÐp.Â"{-^,R޽šR¡Z«°<Ýnùé~_VNLäoÇaCUAp±@Þ #3×jå¨h2˜ ¥fnu[–å¾®Fá""yI÷§õeýåñªfa+Ω«ÔŒ$Ì"ÖdP?êQJ*‰X’Z\Ýêq˜{^2––âLIqlö(6M,ëmùËöz¸Þò #ÉKÎùéùžYÌÔÈ­ª°j¯‡4×¼Æ*1KJDt[W"z^ïK^ìû/f–DÖÛm]צׇzD‚’-·5IQSe…kÎnv´R\GuT•2 ŒDR`L¨¾»•êjf¡%ïÿ03ûdµsêž¶pИC‘ÇífíA¨öZ˾m’R-%Z|‡ˆß}tûL$%7=ÄÄĉ%Qc—ÇÌÞ¸4¨foûÚ§„xMt Sˆ\¤÷†Äi¾a‹é(uÌÜŽR—¼ä%ë4 ‘î êÿÂMÍŠ\+caÐNUcqµ@s«i4c"“ºÑÛÛVªù—¯?ÿòË_Öõö¯?y¾?e×Zè ìè_u'&NI²åÖÃLG Fœ%w}Œm´¦f B%b,K¦z<#¯`·”…`N)g7‹Ï=~_t?öJVª©2 ܪ`ˆûÜ£hšÍY$ñˆ‡Å\‚$³‘‘±ª•RTõÛׯž²Víb1µÒ´$¤æfÌLnaëÌ9ÑÙæ{±{´&S§5çžïfŽ5¸…ÏpÃðˆR´I“™YäÎÉ`‘Uu3bisÄRâ˜NõƒJÄMA£–ºX²¬9’ˆÂ" ÝÉE€D·fîݰQŠÀ’ór”?þù/v·ý—»­ë²ä”Rc\‡Ë>.›°˜y0çÕ]™ÙÜã8Ž ·\´iQ ˆy‹7A$"¢H¸§”­åWÎS_Ñe¶5 õhã)$ÀË×ÞÞ^GÜ`›·üR×wÌÝÜÐjU•Y…% «µTë\fiuŒçûª1AÊYëQ«’s^ÚÖ©-]wpèÄŽNÞ²7ÌÎtïè‹!D+/ZHwe8÷-œŒÏþ©&½¬é¨DÑÙ¹Q*°wêN®MC&à yÛ ÇÙwPVâßpÓ¡cû*bµâÝD©v÷ö^tîØÅ¶&Þ÷voðÂØ>` ¸Iô2Á8êÎæRœ.£¡bÆ&þä9„æßßÞÄPîªCÓO5¾!ú11Bi*kÕªqr¯ÏÏý(ß3ëíÖæ²ß˜Í¡Š¼ßi|¾OòPøø0q^W:o¯–PͨÂÎóqºMñÜ#j<”O3:óv|³nïm% M¨{;¾Š|êÈM¢î³˜ø2 !ÛžEÛ³ v€Ç‡£×œ"¶™„ ÖÐå{ðè´ò¶oÿ@=]ä=#æéN=©Ã}×Kp½«ðMì¯ÝÝ“4›¦ÔT_â8Іš}l;¸”tIŒ\k6.´ýs.Ú#Yj•–GïTàuÅ¢}×èúò<5¹p?ü"oõ&3a²wò M¿í¥?à²ÿ”sÇ‚nôÁ£Ú¿É?ÏyÓ{\‰p'Êc|Î …Dçßz§ÿ÷g‚Ÿd±«Tí£…úÈ~2žü ~‡*O}0¡¾ðOÅ-\rFçØj>—øûaÅ…Yqù¡g• ®ÒÑ9]À'šÜØÕQC6¨Ûm¾‡wBþØœ“‡Fûº2N>ØØ}…| ÿ|"€_ÿû Þøè‰> ÔßM¦ð¹´ø#GúIÒž2†ï~ ®5®þ«<™ßf³Ÿ†ñ~¹qü3Ïþï«ð_×^ÿ)Z÷?åÿÞŸƒOºÉñ@뿤wûã»ÿ§'@¿íVýø—¦²¢ôÜ3ŽÁÚ8œ‹'N#»ûü\±ÂË#wä}ß9ß™¼¹F¼0žÂÞ0¢‰ËkJj:äìR!¢Ö½ÖÍS4{zupd¯š¹ ýA?[†^Ïï—4?GÍ Ã8YtçfS>Öûeú0®Ö”KaðYívEô%'«jµº°•‚,ævàØ]C=¥PŸ!ŒœÔº=c·¦5¨Ô–DbÓ³Ò’×¥–ZµFèãñ0÷ºêzKKZnyÝhok?ÿÇž.0Û¾›mÇ£–jæEâ€b«†vJ•œ˜dÉV­ ¿/ëãØ=² X)'Aà×U£Ã°¾=fƽÔÝL‚mÓÇãMÕîv—”8çù˜ä`^ƒä^ŽÇÆvì·ûýç?|û~læt[–z˜ª}ýòõúÿåœ_Þ^yyUõª"aQ5 ¾üºÜ’°pÃb$IÛö¨Z@´m7[×ûšWañ枎&3†¬†ºÓ™ÙEÍõ8˜9±,9;y4˜¹²iS©ùª5øÑqd`s­¥Æà+ðêæ W 0|¬ñ­ xKTmVÕèçV”˜k6Ó£–ÈÔJ­¢JîYÄšÀÚÓ”Ri7¢e]sÎÛ¶í¥0sxª;xë´Å€̤ꠣ–Z ³,9³H¯öHëP@œÀ,hÖ*®j•9‰lûîî9ç,Tw ˜µ/9Ú˜Û±#,ó©ˆD‚ˆSLMH9÷£ ¹»RTì²™6yB„™³¨Ë°ïû÷—×u]KÕ”’°Ä‚—RªµC´¾Æ˜8§l6<ë“q©§jÜ Ìáë3Rgcò¼d‚—”Ëö°Z• ",,ÄžÈ5<ñÄRRÕ¢J"jô‚(pJªn)¥eÍ9[À>TCn3s£*’ãJ©ê¶oǶ±pÑZJa0ßV3Ë")%'RÕZJÊ)$3&¤è%PðÖ}‡3‹)‹ˆÞjÎC^8ž[3{]¶šŽY«´»»ªZ+Òh¢s“…µw¢PTÈS°ª2{FZÖG‘˜ƒtþCÃð03†ºâÑÅ.0¨©Y…I­ÕLï·§/_ŸsJ˲休»28¥|¿Ýj­ÏÏOOn¯oU (¼jAY–ÅÍcØéîëzþOŒöº‚(N"–rtGßnÜ·%Ý–/ï‚»®vŠ=NÇ~‹™U­ïû±ï;Q[±£ènYÖhÐŽšIBà)Û÷Á’²0ƒéب‚ˆè_$X›š8æX—7mô'F~Ê·uýå—ï·7ÕšrÍK&"­:â-ˆDÆÝ½Xa’uYN""L„bêÅ`怩3¨èQÕ¬õ) 3ØÈM•nÄ#°4J’LfNÇq´þbfáè§ U«ZL¡¹º¡mZ8<­mÅc9u‚pz¾Ë~l!Ðå”b•3sSSuQ ¥í‡RËg3ûòm;vfõRªj¸ÅعUýX$UÊÛc{Š$²äL -Z=˜m.")I’TÍÌ”U*v€!’“ÜÓ’ŸŸžÍ,™=oûq¸{u_–5'¦X»ÜÜ-jˆHÝ´j­Åã"‚nr»-™«‹Ä·×LcùU"ªÕ*Lú<¾ª" H)•ˆ8gprc°¤{/ ïu£IÅýfddÝç Zr|âpžÚf©JúwçRkƒvÞé1"µ®J:‘Fï i5¤§Ó»‰µ°«¶<«{'J— †)=l´6@ÝnÒÏáÂÃuªNÆâ›Srgœì}:]u8yšÑgÕ±"XOFq‚¤4jYèyˆìMJ³vü‚,Â;…ÈÜñù3#@F±§UOa© px· ñSÏ£¨O <\áÍJÛßN/ðËЉ{ rj鉆EÒ)0‘óPxÆN=„wîs \O Q];²Ñÿ¨c>Ep§‰ú¹„³8²¹šáƒÓ3ù£Ð½çÞulî#±sÂ1âÒ݇‹‘¾nò”Ýá<…‘Û%í²zš|L ¯m~mõCøFVÇh+vL#…ýÎ÷Ë8‡sí:‡ªnÓÀÑ5ö6±]ž=r€ñE§,¿J«³¦K­(ÆðÁÍÚÒÝòãÃ¥§Dk?ÎÆç8Xò=™Û´BtÁ¼Ž@O¯Ýè/ÝÒë­R„9(YgÅíŒ(wÎ JYßßò‰ÐàÌ ‰ît'U ¯Ã™ÛLäîGô•!Ö±qæïœ"!ïs&ŠŽîs4ƒ‹ÿ¸ÿ¾¦ÔªqÏæ ŒFßXº¸Ð!£=ãœàõÍùŒÛÅòïÊÿ™ñ«žJÍ—Ð?i9¯³”>–ëÑ¢%xÏñO<¶§Ûþê*îõ''ïì*cÑd_j/ ‹kB× f»OL‹ó>ùPuë?R)}´Î1¬ÿ(ÞáþæµãzÒôý‡&ß ëý g¿#Àül÷|ÿ8>5ðxË­çoÌÛ~ |Æý} àïV™¦ëþ7_àðŒßï©Æ{ŠÑçÌÿ?þ¿ðï?·ü–Ïøï`uÿOªïþ_¾ÿ¤Jâ¿Ëæ´¹V¡}F4§ c„&]œçÙ7Ô`'¾ñ„Ź€úij§òsgWbq2&‘8‚ù—q„0•ó8$…ì@î \­N×Ç(з÷W>cPcºqnbì4àûlµø,eÖ‚'Àlz©95p"fæÄnÆ"!“0ع[ôb¤”IÄ8Ü7ÃÓ($4³uÉä3¯Ëbæß¿ÿòç¿üéß¾=Ýní»ã…œ6õŽ•ZÐyîff®fÞup‹6K ‹³z,"œ2³˜Ùqì£ù`I)¥œò"I˜À1 ‚$i²‘¢ÜÒì’–”“¬ë—¯_ómÍ9ê(…˜I¤M9”J¸ÅUgÞöý8Šˆ,÷ƒ©¡tIké¤ûpÂÌ ÜtvF'ƒ6E&Ì¿9e>Mgí(ÈW'!á(ýn÷Œ5ª3‹HN BfZ5†eÉ,ç«^à@nî{ÉKŠÖñø*¹Y¨í)8ò"I æƒQ xãntËÿu“lû¾¿¾¾ªÚóÓó·o_Ÿî÷œóíö”sG#aþúüÄ,OÏOI„Œ"­Â̵ìûqDñòq”å¶>(ú–ª:º†Í(zzՌܵ)n1ü“dæ2p÷Z•™Ý,È0I’™¥ªé~¥j-‡™=öÍ"Œ ®e$@ `IYrÊ)¿=ÞJÕ(I)É-/½ŠÔ&Sž·ã;cÉù¨å8v­&=¥ªZ5î1P ’œ´”r‰WÒŒ”ÀBNœ8 æç„]ƒnM"‰™Ô¾_í! 2KJ©Gf…täYÌÝ´îGÑøFw\ ³H 5‘)‰$0@ªÕíÄ^4Ý–ÈÝJ© ¡ ¡Ñ(kVµ˜\ÍBøòRÊcߎý §¤¦ Ö„£|‚´ÖZí¶¦WÇD!¥¼,)çlnµT* £Æ ~¨©º«ª§”#\¢n9çœ×RýØÈýØ3‹ Fj”$­ªn±]R«Z«FÅ@)‚ÖéŽÄñ%mʽñõáöR¹0á¾1,ܬ–€.‰³jÚJCÁ`sØÖ=xК9Në7º‰„ÑûzXn“e´a÷Çzb&n½È­o¤+˜]#ˆ—‘¡\u³1€LO™;؆>ê¡ÆäÓ[Èódà";ÄDY˜j5 Š»ŸðžîkwîÕìƒãŒ*&¦Yüøz¶‚Zàèƒkîpæ Øie¼ÔÐY'w8úG@ñ‰G2µ‘jÐóy½š†;+e`Ü}òõö׫BvþÃåØfã¤`AçÌ80M"ðÕ9ÍZîƒ;eûŒôcƦ;fålÀFÆou»ñ·Ç ò¹ôÌu 'æô’èèþ S~­k¤NÖïèÚp€xRLAÓ@ܧ8m0Ô2*»™„9Qm—ætnÎéÓ€0uV×çšq“Œúà-ögÿ0 ˆí6@/T¦Y²ŠaÛÙÆÁCÅänb·§iC'|µjh©q@lH%@±47€QïÅ|níÖgA'1áüéñ&ôÝɱ‡eœ½GÑ7·÷Ôv§Ì½"ql¥½91‹5¡+çîÎ,i—ÞL5|(±»÷¢5š¼óÃæ=F­€—¹kçQ*Ý2"nFg×­óýu]h/åÁ*lC? ­áÞ`Ž÷=: 0XúŠÀ¶ Ï?~à³GwÓÛ’‚~Ûž$±¨~a–0 ´õg"ø ù=ñ~jžë¸1E‘ÚYõƒ¢ÒïÖ±pžKq|àC}ïYá{ÅI»ûÒo9Î3ƒÞDsÝ寀¼Q–8&a˜Ò3ÿ}±ÿœ”ñQÚ›Xj×ÏøãÜô%YÀCh¹Ä˜Î›œ&g“Ïò¼ˆø—·‰ÑÃÌ>{;.¯ÐêÐ0Ë1Sýð91úȹæ_Ôg§ù™›Œ/b$@í˜Ðªl¦(5½s÷¿ÿ$f3îqp\¦‰~mΘnhš >È]>eË.q–Õ ¿¢µâW)%ø â/>2|øÓq ŸÕY_ïÞßgÿw|D'ýƒ%aüÑÿ¨ßá7½¶ÿ­?ùûú>Éi\?þß„Œú‡Liþ{xñÿäÓ¹<•ú³åŒô¦ÁxTLO“ñox$+ᆕ Ù½púbb“§ÀÒ´Ý Ï‡Ý_úbÄíoÇ „àmCÔtJL£Ç^øÕé~›þó¶-,j&"ë²DSklÖ˜ÜK)ÌH’¢'ÂÙŸË §ý±ÅnÕÕ˜e]RYë÷7˜)§$”Ò’³°Üò‚ͼ׫vŸšš21%æ¼,_¿}«¥¥ôd€4ˆ“¹î‡A˜YœÜá{ÝùûKf~úéCTõõíííñPÓ”5ÝtWÓ$æ €ùù¶åØËž—$"T( ü z}ù^µ.˲¬·”$ø*ÜÄ-Mj޲„Þ 5\?µ„&…Zµ–BD÷umð#â¢eÛ6f©V<\š“ „eI¦öIÂ8ž˜5”"4WQ<÷«ú²p¨Èq30'"J.„”1"ñh­v7Uw¥ÆtÇûNì(e+…I©Ñ¥:?7Š7©9F=¾rÞ×fŽ av8‚‹Há®sÈ£vÚ-˜EL¤Ôø×oo¯ª¶.+˜kdM¼÷†õíNZÒ’—šµµƒÛ¢÷¼å„ì Ô>)T*ìf’Z*Y„«*B¢Ts–ýùÌüïü¿þúö²,ËóÓ˜K))¥5翾¼M%V2&^rîG7277 Ð-Â*½.‹¹ÇÉ F&)QJ÷/Ï¥ìÇþPÕ$;qf¤ÄìQ@ʧ…²{-¼ƒ¨¶#7ƒò·R¿<-¼9-ë²ÜoýPÕe]‰™YrN¿üò×îx ʇÇÑ´5Ô™ ÃtŽ #g‰\C8Ç‹U+Î WØ –i Ë£Á¡ÍÍ5zÚi_k% å{ͺ΂Dívª¥2`nVT5€K”8éÈ”è˜`IwP.¢Ü7úd[»€Ö·ÇžsZrÒ.ñ·Æw3u³à™„vˆ™µ—nÐx|ûö%îvIiùö|gðv”£”£”ÇöH)iðgÌcE½-9 ñÂ]¾Þž¨É1ˆUšA"r¼}W³%g3±$Q%s-ûÑæÿ㥵ï ^–µuQNz‘w¢…ˆù¾U+ˆ%qðtRJ$‰9ŒÜÇJp„ È)›itÄW”Ûº>ùâäo/o{=b`è5ex­Æ‚ã(Í|GÌ¡NÔZjóz[ˆòãØÝ,%É·íŽ!:)ž½ñRº{ÎTÛsÆ™™`áû‘…s×>ÒÛ²¬Â,Ik;Ä'ë •ßÉ­j^»1D‘¥”RÎÌÇQIˆR’œVr«µ‚9%¸™¹©;Y‹|3‚mò NâÞur&6·Z«–jîbúýõ¥V½­ËQ ¢Ü=/S+r"ì{VÇ-'N9‹äªµšEŽmv2bòîU-9·SS IDAT/9çÄ,ZUk©j¥lZ«ÕjÕÕ¬”êªÇ.Ï_žSÊñ8kÂ*qX>,)1³š{}}{ÛcYü¶®)L gK)åT«F)AU/•œQ­fZÅI-–p¼(1YP!ÝÌ›.ÝB`ïËÝã2úYL;ÊCú§{oßá»?OäÞÍðääbF†!~Ö2 ‘Vzeý€ß7u¬ñÕãaV†OÒ.ME¿B.Âìt˜‡¾;&÷ ƒj5j•®…ž-.BSk+=m¹>˜Ù‘Ë?8—ÐäîPÒ›ú76¢­Ñ½íÐyNÑáØcäÖ‰+¹»ÌÎnÀ¶…Xws»ÅhÁ;ª…?Ãw·±O†ûÙXé1ø8¿ðèlˆ‰Ž÷´ÝýÚ½±¤¬ÝPÄŒkC3ƒÜ2Ê?•Cû•ïág4xȦÈ8øðØ6®ãàL±ŸÊÞùúHÚzŠÀFÃE ½,><¸ã‡ÃaÃÀë4…ú/âq4‹&þqÈüSˆä„³ ÉÈgLJ¯[uÒž@§ó8ÅH™ÐL¿ M7¥ÅÜ‹{´Î¸FwX7D |ñ6ƒÁ na‡Ì 9ÝJÑFÚ±/mº æOû¢_º¥.fHaÁÄS "ŽVpB¡KýãJ:™£YúùÔ p3ª8ýÌÞÐXà®B 1O~¾ë¡Šu0½OE¯—Î_rey9]ˆR~áÄ;í—Nù ã/[Ñ.)ª3’×+ž’Ã?ïÎþÎ#<èkíöÀ¹ˆáœ»ù€£Ÿe#wA4Mp¦šœÎm¿Ô¿ÎaŒ_ùäxÖ°ä÷‘fÊý#1|öqÓ\ë7;©û8ÕýEùâæê$¥Š3>ØngþÂU._¬ðøD-óëäjõÇg: ÏÌ߃{¦€ÖIñ©Yÿ7ªµï»“ýo$üß.ý°³÷·ê¹Óçð¾5Åß+üg<çÿÈñY7¿Öðpþ§ûg×ÿ÷äÓOé3 ûG<”:úõ‹òÿѬ~ûç‡ Œ|Ñyš!¢³® ïÇsäN½Gçâb/i¸Ó€åF›V[7xðmÜÂçÏÇ|PB îÆàë³ø,«_¤KèÿŒ _ U£°&uGËg<mç§×œÆë?e²ÿК*?ùhN"P7€UÔ?ÉEÙ ´lÿ2ÁEÀaÍ1ÀYRgB=¶ªÆ‰E$eÉš´Á\×…@Z5¤«Rª¹WÓV–ÛíééËú§?Ç1,YQ ÙåûËK-@½Ýî·[jý„¦8HRN˜JiiU v5ûþúºEr‚AUæÌr’$¥u]î÷ûó²$IÛ¾mG™6‹Á45%6u9 RÎD¤ä›¹qΉ¹Ôê¦L\"¬®Ãþz”ãÏëÓ²|ù¶|ýò?;¶²ýò×ﵨú¶m­uY–u]“Èm]þå?‡…úéé.G†ðöØ·îHº-ëÁs—”D$n£uÉO"µêQŠ6<{ä­XÀ¥Z3bª©‹$ˆ°=6UË9¯´ˆ@«‚èëó“p6·$9hØk§9§%¯Ê5ôOúÜŒ,¦-‹W·(ÜáQµéDµV&˜‘›eiF½a¶ÀiI 9Vˆ4À2ܶÚÖ ÎfÝXÙ¬Uè)ô¸µgf·ÆÆ1-9 R8 ‰ÈJIŒ©VˆTÝä(¥”RÔ´VhõÀúõOdüþ dIn‡‰ˆp˜ÐI˜ÕfQÔ'Äeƒ¨Öš—vf‰M?3»ÒÖuaYþü§¿¼|ûÿú/?ýID´èk)Ûö(ZY$ ÷"éNP7€qÔRKÒZ&¡º¦$f^µ²ðú´ø£›Õ*„ÛmÕZ¬ú‰ªÖ–6Bb°Å˜ÉâCá”ò@˜%¸mVÌôØ)åx; Z×52(’Ò’€ö²°äÿå¶{QS­•sŠ®s }˜¶}?]{žÏ÷’ªr³@:'qõì0skT'r ÞW£?3$Y22Sw>Ž#Ô¼øA±½TUÕ6»5uHSŠ…­›…Ü̘ɔ†¦RlÒÞÞDZÇ}Õç˜tŠ¬Ë‚j¦ZÝO}f]ï) cüËÌ ‰LŒ¨2s­þØvw/¥ÆPá¶®1]R²ûfÜ–…Ü߯`n“³6÷4­UûÄŽ°0l>Ä+Ú8ØLU‘"lÄF¾, ÄžŠ¢ÕJœØˆò’“õf‚”âk¶ÿp)Nç•ó¹.Ì_¿~‘ã(µǦª‡Ö[ÊÛ±Ç7½=çÍûèŽ\Mº;ºµ‹$'5]r¾Ýî„'IU5*Q[Kv?ôIJ]Z`&"§PˆIÉJ1 Wºur‰KÊ€5½(b=³O@MH’˜ aI)3+ K÷Ì­>±í38¥\“€àb¹W5¥(´É)QÓ¬ºÅ8`þl¥¨šŠæ8ö¨H Téùééùùë÷׿>Þ €Û *îâm+U f¡V½ ZÈŽ$Å9\3ÜDÌüõí±.˲da~<Ñꪵ꾗m?j­mË Ð’rj›³ Ð°»˜îy 3êQ+§œH½Öb`>8‹)GÉ…9ÝöRŽ S‹úè”%æuVK4šhSë­¶¸“#ØcoÿÆÓk0º~(p7@Àã!æ>¤XFœê&‰]4''uS}'✇ÛVÊ`ˆ÷(#ËÀWDLì-ÄÔ+‡9F(4P&œ›çEOÉ…£ÂEÈ£º¼ÓˆüBn&úK§c.¡²®âµ@NkPÇ¥ù®u´ÂáJh^ã&ÒŸáÓ!~1µî_;¨iA©nŽš˜ƒDÕBþÁù>Öaøx°{Çäâéb=w\ÿ|~‹÷ÙZ˜HÆõ³?Ù¬é~~†Az(§}ŽˆOg±£§8ä2Ÿ†ANã±ÒBL>õáZÄ bë{ýd²S‰Iæ²Èa©Š'Ú™™ëŠzŒ.©¥¥æÚ/™ëøhç¸DA´¦â®'öÅ©»âéª:vr–Á#ÞT´­!M’óŒm‡ž w?Õ;´¸ù!sœc•v& ×ihí“ÉÝ¢ÔÈwµ+5 Mçì¥^àì«AgóŸ€ØžÎ߆(ߺ¢v³ø˜ Ä߯0ï,.œ“î¾óØ-€ÈÉ´EÊÆB2  íÐÝ®=¯|•øcîÒpU±& ]»7²´ÐÔeBuŽa@+Õ ¿Nã n‹ìRßK™öÎêo‚>èÌËc’™ÉMDÎ#:ÞÌã2ÏI î×¶9pë̆tï#?ÿV§·ÑÅI!øÄ—ñ‘Žò‹æëûžÑ=g »û»ÿ¤Kli–‹m¢gÐiž_F³á£>ŒÛEÅÉC›b`LÍeŒ¡ó»¼JrÚÑ\ÔŠÐÖqqŒÏ >¥ÌŸ¯ëjcûµ¼¶QÛ9ú›ÖºçñŽ>ïç}ðN²Ë‰PónC?ƒësÍA[ @nWâè¬èð‰Mã>Õ"O|L[sb××¾B Ç;ösìì§“÷3Q}b% Eí’¡x7”òO‘6x_AñJìýh WÐ’ÿ6ôû¯?§‰èNXc¯M3UÓ? °Í=¯xÖÒLK{ôEM9YŠ.§.¡Û@ú€$VX§Ø àfù1 ¿lêØj°,¸QÀ6 ΧÝåI©DÛàºÌ¾ËåµysÛ½7£¹µi3Ì_ÿ˜ÍštÐwÎyüû2Sj¸IvâˆWvS­ƒ‘l–åÆ ¯Ð{)G´œ¦%1{­µªàqäŽýx¾ýBjÖÁS«’HpkömÛÇöp÷ûýžSr"§Äf¤®BQyf1·jÚn™·º%s‚»ª–` T5wa€8¨%õ(;Ñ›ï///û¾õ}OßdµL¬µì²$’sß‹².)M³v%r­^›Eœ–Ì9‰pZ–[Z_ùu/C„ór[…q_ÖÐÇI©ª^ÍiIìNoZ´TSu}5ßÒ*’Âý!,)%3¯fGQaÛÍK)%>ÊA"ë²4†x”XI’øÞ^^XÒ#'aVÓeÉk¾9ù÷·í¾ˆ‹'GiÏ:&ëzK’÷Í͘e?°v¤5"éùÓÄ @ʲ¤ì •€¬µ·`fÕ-ùFqûf Ì9%U}{<œY×=…}THÍ58é ‡ÆôX×é¿ 9V‰T£¸VÓ¾7¬dŒ…D$%Žl’ÅëQJËC 2¢ÚWd¯x“3rÎ¥èØÿs4ÊöΆp²·A]­ª5š:þŸ‰è¶,÷ÛoÛÛìDZ.ËÓÓMû¾1óºÞcbq”RUÕZeßžÚ˜JkàìRR&…aæý0Óœ&ÒgNÏO_^_¿Ç¥`p¥ÒÀDÌQ¿Ü¾Mr ™“‘tЉ(Û£”ÃÌ#n€s®Z™™Áñ#䔆/4¢ò‚öY«$E‚r^ªÚÛãQ«êÓÓ±ï)Éz»XÒBnÐê`RUvã‘ ³àÿRJ™ ÷ÛSÊù~S'z}}Ù·¢©†R”²~!¼Íñ›8¤ß8¥ÓnkõB®æê&I#$I‚’f޶ÄÐ' ÌÍ…½Ò^ª“Š™ƒã‡ƒµfªWh¯pdbN9/ÄT±›ZïÓ’©ùö=ðn­ˆl®ª& #—f''Õšòó—o_ˆQ«ÖZK9¢<6.ªÒxDnûN刽‚€ÃOínÆìdõ &®Uc>lIÌ<žæRù@1UxIÌX,¡š:Y4IÆ–iÉÉJ-¾×m’ôÓ—g"”Rj)EUDˆæ€Öì\9RMñ Œß³ÔjoVk­¥1±‹±R$&‚TÐ4w1¤pr«wÔdÐÀõtʦ\f …;£;º(V&}Ní”' i’Ì[œkpôšØ&ß·Ó ­¦sˆáމ•á숼äA–.ܹ—î´É£ Vk‰•Ù0Õ˜ÚSKè´ÉnVÏN¢™ì°ÃÄjáÈÂŒ1ˆqA›ØÁ ,„ÔüðF†#ˆ]t2^[,lRœ:CQ<í˜d¾š Ñ]Ùênq•LìgOðY @äµób|–È¢N†üiWTS<½º¨mî­£á0‰F>P §^èÃk ïH€Î÷=Ä¡—üb •"jÍ ·vŒÀÙj:WÌÇÙ©ð4m×)ŠÞ1ç)œÞßÐBS.|êè¹½ŽÈšcç‡9˜J£¢À&l6Mšdse¡ô3O&ÁöÑrþ0+ýRPzíOÃTà{^Ñû.Ú?ž¶ÅjO=õBàš³Šh÷+v ƒÕ’ï¥Èc+IÎ~µŸ:Zþ¿[»U‹ù €ÄÕ‹³g¬Í·î–³¹úä÷i¤C}'Œ õø^pœfGÒd’š‰8r%Öž4 ÏïÚ-ÓLùon…4ZS©Ó iD\º™î„˜ø)çbp¥ÐúxÍ|Ò6Û,Í'žÖé{>+”Èz+Fع>ŽàRlêc âób1º Ìèô¿ "adFŸƒÉ˜ç7M×ÀÄäòîLQཆsJœ½mDS½ùGÿ$0øùíé¿Ïêto;§ ö+6T|–_¦Ë÷Âñiƒ<‹ž}B4Ml¶1Tòß$A¨TÃC2_“é/y(ú—ÂçO>˜ñk¹¿g5´¥ôe錯¢ó¬ª #®Û<àéë‡Í¯ìôª{¹À k?Æô=°«5Û/­çÃ|íµ¦wÉ•3sŠ\BÿUô^Tù¾­ó_“Zñ)éoM>ŠÆï¿&Dû¿¢uÿšFì¿GKÆß‚ýµþ×Ôøß%>ûox“ë×õÿ²€îï—°ß:ø{ëöÿ¹ðÇßeó«¿—_¿ïרL_œpA<öu³Åês2«³ÿûc¨gmÙ§Zì ÐÏÓ Ô]ÿ1'`D#oGö½Û”`…@“Ïße§ç’Æ“6êµ£.©ê¶ØAg°µ¶IŒ“Kèýص­GŒ÷38ø9;é7¨ÞüaFÂ犄á­÷ÏTœ- imݬ–}S»§5Î4)gRe‘š:qâÄBiß¶¿üõ‚ïÛVkó·¯ßªj–$Â¥ê÷—_¶í±?æá|Cs­'‘ñ|¿}¹ßëÏßÊ~ÔªDTja¹¥uYµZ7ãz]ú%7µ½K^³3L¦¥šVÍ’@8K¦×ÇãûË«ªnûƒ@Kʪ®^‰(q¢î.o@á°>2K’ZËÛã¡ËòÓ* £ñÄ4·Çvdab¦õ¶Ê×çýåñïÿûÿùïÿñ¦¶ä‘§§…ZTDœh{Ûþï(<U¿Üî?ÿüó7s¨}ßËãííØw"_—»táµÔò—_bÃnNàœÃÚ ^)åôÓO_ƒîíîª^«š) ¯·……­•±Uë_¾wó·íQnõé~k‡kwU[—ÅKΞ²»›í6ê®dD.Dzì ß‹ˆ¸“šÆ°ÇÌ! Oaî© ¾6g#'HŽ¿§§»¹WÕZëº,±S¨õ};XÄÙCR ŽrÏ}R8)nwb¾=Ý¿ýü•þ"×ý8ÒQK­¥0hI9Ô ¡Ü½ÔRUMu]cÙ÷ãÖ¹žáÿ!xSEÍK 퉙kÕûíÐ*U½­kŠ eƒ-1"¨·øªŽêà\»¹™‘$1·œ–¯_¥”uÛÞJ©µVòü©æ×%7ÓjªU÷ã`æuÉ’Ã:ö.?ŽÝÜÖeùë÷yV)˜YÜœ8IÎ\й+œ µVP«‡ àÂÒ¼ãð[1Ç nàe]%c—ÌÁ’"k¦·(t­§¸{È9Gy©»åØÞ¶ãØeY–%>n&ÕªÕÕÝ¡î /†$pq³“)ÜÕUCk‘€1‘ª·~MÀ´6t­j $Tͪj­¼äœ¾ U5³RjNyIÑ`ÝäŒ>´BüSMkþdæ=j=j}£²’ŸŸŸSNkÊÜÖe,Á¯¯oß_~yyy}zº‡Ž\ö’Sj+’ÙQJÎ 3Þk¥HÕ*½^¥ºÛ±?ˆ(/·˜U˜VwØ=†Û¿~My!¢ZµZaUf&ð’–8´S 0(¦q±(…7×̪ÙÛã"­ÕBX ÞîèT`‰Ë2ù "Aïq%bë ÅXt?vÕXÕ[°‰‰“9Xâ_öšÖäfJ¶´¤ZÓöDÄÜU@îµ9n͵*73uƒµ" ŠJYW&pNVƒ‰¥,,Ìîæ$L¤j·zŒÓF™w‹û$›4=(6>­.ÖÃÿØC'r¯VãIÊ, O¹™ÔÔ”JõõõõËןžn÷ãééíõmß#]Aªhšˆ˜ÄÒ¤je?´jJ²,KÃHôç…»šùvµ.ò,¢QER @÷ç{J©–²m‡™r…U«¨9-AiŽæ’ηccpYò²,K,¿›ŸÆå~ÑãíE«•ªmö®îí1T«>Ž73«…HÀY˜…Ôóš“äÁÎà! Ç=RNê´³²ÁaÒŒMiÇ·P ²„ED"POµ}øfŽg31Ü{ùÕØw–¶Úô0§wåÓ†—3^‘ƒ5cÇbšûNìp#7/mdÁƒRäd±5ª®ê§t ×ÙùÛ-ÐÖŠæªÍó÷ÍÐ…nîô^àÍ®îL éÙtaôíœ'ð=‘³ø¢T,”âxB8ÔC€¹\«ã¶5mm|ª0Ýü:q&w±é9 q›QÿÜô4ëSÿB@Ð0µ¬Z犉f §ÙùÓü4¥À||#ÀìŸ÷øÍ!å‚H­Š+ñÛá‘8ýšó‰À­J¸›y/Æ@¤P·y_À]¡îÖáPYG/@Q› 2“±Œ"ŸÀå²ÌÙOWëDãâ&7û G“AØSìtá{Ÿu^Èt+ö® ´¤XP‡ìôìžfçøý[Çô¸ãÝí,«æ‡w6ÔI‰é5Ï>øaF­ø#¦wŽ :NtÞÝ8Gq‰™ÃÃ~rúG÷^œvc䯬YÌ›ë­ß¨ªNªqzë°Po hR8ÓIÂgŸ‚Íå¨sÓѹÉy¸4u2µÖ¾RëNêÔ8Í$#jISÆó±þNåÓWn4YÇÊe³…Þ»'–·­Pï,¦³®M£s·§â·«1¢Aç rÌOÏ ”_†výòNž†_Úï|¤®ZÔŸGäħ^ŠöCݵ X}tw÷÷b§÷<¦S¸ Ø¯føÉÞÎô©;~-ówÒÚøæÏ/~ ³”‰êÑ•´æE&ª‹ûÈPÐTüý% ~iZ˜‹.&4£ u)}Á,ߟºöøÓïÊwiBJ\³&ß6-¦ØÔeúð‘³3ØA0cnÆé褮…œVQ¢÷âФh÷;q)³ö‹º6†Çç„„®•6ç5n_Qbÿ~Ð…Ð}|j~ÿ„Åòažä?6yÿX¹ý›|xÿ‘~û7 ” ãzÓ^Þãi³õ·Ðç–k\SŸ¾Aÿ®ÿ¡ùïCþùóøGtÙÎ`¨„õŸÝ¢¿gówúÅ.:î?-™ðkŸ~5àÐ'ù𾜣EÆ4öuÏ 'ƒK,.ƒ€"éLítn}¹ïRi¸ûp–îb4ŽìáØGS' õø•ñ@š¹Gî—ÎíÄë™û;é½¾½ ˜aœSoÖG ^lŸb:†ûw $.K»;.&Šö'lZæ1—\×§9†i™÷ÔèE0r«¥@Ín‰–ÜÜØ—û¶?^_ SÕZÜô8ö8üoyƒÓÓó², «ÖjªG¸§ÕÔÝàn¤f”˜™9眓ÝémÛ޶Ƕﵖê¾.÷0¶W«6=ø˜™{Ÿ•©rÆÓ’ˆÈʱ…ÄÊ’c³Tµ–jo‡j³l/Kj–á>ía‘ÄFù¤u®BLUuÛ¶Z«ýÁ-ðÞf”TÕ¸ùQŠÛ!ãüãŸþòçã8nër»Ý¼ät¿=ÕR“ ”’X޽¨›»¿¼½ùýòô¼æüʼoÛëëËQÊóÓÓÉduß·­–B„õþ´¬KÎyÉ™_ïOYä¿|ß÷Ã…€(º*ÄîJº,|»­)I)M Û[+:v7³u]ˆ¨VWÕœ©ª¾¼>ÜݼF!øÇY’جE=voVÜU•È÷ã2‚öjÊ­,œÈªjPàCüöüeÉù(å———·í±®kO¬;‘GÅ¥»£µ!P9´=;gɲªiH rä}'¦¢vh5ÀàÇQ„9I ½MCCw­¦n’eY¾|yv¢$ræ,II'«©HŠ!¹ ƒ¨‡Þo÷—×—ÈŒ7Ô², 1-)-9åòöJ!Y»‚$‰¤”˜!ÌF­þºñÑb-ÈÄü›!52 4GË*—RhÉ )Å_ÉœMg£ úëË÷_^9Ê!,ë*mOÍÂâ_–U‹ÖZöZ…Íl¹‘¸MDNV+QˆC{&‡¤eµRÀ™j*¬ÌLƒINîîÄΜƒ0¦ãf!w‘ç/_òº”ýØö=§×Dx!w¯ÚpæAjWή`16ª¦qü©¥š+°0©¶7tÁ°ó›+YðX`Ö@@d^˜µ•‹QJiß·ˆ7‘{"®¯Ñt 5GŒÕ„cüVÕ‚ÝÒ snfjj£Í½F˜ˆ´êËãAîÑ5òt¿Epêëן¾ˆ20QQëê¢)¥ Gf òt…‘Ôz»Þ™9¦È!" €YÑÞ¼mªjÒ=Ùf@Z]‰WRz ‘ ‹™ImÂk›'5ôµŠ6wöÔÛɓ—²Aó@qàÀ-:ã¶ï6þ<òVî‹fÔ·|®î-{§¦ý4àŒû8¡sÿÓa ¦aM{ð h.Á¡±ô{Ëy;?¦¦‰âÑê{©‰^&£ên˜ž»Ù¦QºK:º¹·,4Ó€«¤m˜eâ}EÚ¬å$N 1›´…ÎÏYHîƒsnm®>«ŽÁÀ·<ÚV:ÀÛFÑy±ÚVòÝœùhëhûÎ5™eƒ€4 b±Òâ>˜Cq63Z¡ÙrúNb„&á®û.©U¡BÃA±õÖh\H¥€ÔKŠgÛ1ÍWÓ Vn u‰[õƒ-•¡ýƒŽŠìþ~i É„&íTõ‘ºè³ 9ÒeËKØ +ûç@ÓÝN&´öýþô°_¶& 7ÿÖ–±ÊXÈ“çBok oÛUö+•in¸úþvnÅÈCÔÝHÖW¦ÝÖ GÒÒ®xÛ±&m\隸ð@fìC‡VÞÍô¨½×ÂÛÎÔ–rz`l@`E[6ºZª-DésÐñù´wÍ‹ˆºüy¿Ý““<¹`ï¹]Í4C5 ‚%Ñ1RSK:FÿÈÐFq(¼óþ¸jìü˜öy…Ò㉸Ÿ€àÛÑŽf¤ç»ö¤“Ág:÷Ö~Ýc«Ç¼…Žáa¯4|Óµ‹3¹>®Ö¥šÆ ›mi|ŸeB<ê[†Z€ø¾ñÓ–h\ýé¶¾A¸mfÍú{‘ |<²vlÌ@Øâóo‹ ;¼ù÷†5ªð3Ú2Ò`Ëd‡¦ø·Œü…«cß–:?âìÿ^•yi/X&ÛöÖöÿí@ÊÒñ-íß ¼Ÿ^hÑÞÓX¯çÖÑûu?þßï™ÿ5AÜþÀôÁ¡^3(ÿ8ÜŽŽöopþaòü?‹E„hhó ˆ’°¤™æØzZaàø¬¦˜‹5tŸ û|€Œ†;ãAuG'õeÎ@§ßi¹Z|UkxV ×{:½rXóÐ4“QOãr?(¤·—Á€þ?tÂûBwåÔÍš·CúØ+ðñôre=&•ôæ`è¶c"0©RE01‘Tos;fL)~z¾œÏ#Õ*Ÿ?Þï»¶È&¢¢CÀ»[f[¦21²8V¾ ä™·Ó&w½ï÷Ï_¿|zzò;À7¹MÑPÍTaK)Nµ R¬¾2¶ÆÂƒRj•b`§ÓÙTw¼_Nç˜Âž+Xð:œ@A‰P¥m:RŠfK.EÔÜx‹"*®Õæ½þòõë—Ûõòï§[­ öéùy ¸©k`æìʈTÓý¾çûþÓO?1Óç_¾|þüsÎy;±Ô’z‹Wát>?Ï!¤“ÔZŠÖÛ}/1úÑÝk“ÈÑ·À!D©µ.kGÚ¶Í/ƒœ›,btÇŠϼgD¬±ªh`D‚ú»UxA¸v@}áo=É®ª9 ¡][fŠÞñ Õ¬Öª"nsŽ1œO'f !d©jZJ1+)mø’˜íy‹±f^Fj Õ Mcˆ—íT´¾æûO¿üBµu¨ºkJ¼†zø„Ìñ ÕD@9Ðå|®¢`Æì$ uÉÛ DQj«Ì4?z]Õ\Jõ¼@†ò/§íãõ~ß‹0†¿|ÿéÓå þÃö=-Hmø¡]g LŠ$¨->Œ`j"«ª©A ‰G=šº×-0ÎÕ§ß)ÕL¡J1ýŸÿöó/Ÿñé鉀* 1‘™÷;ØvÚlÝïU,"Y/.í„Üøû4*æ02@м—zÞˆ%Cï`ñˆ9‘ˆžNIªªjuZ–‚š¡YŠÑù'·ëõ‹~AÄËéìîõ&x#™"¨‰`hP_k]ª¾Ëei"µ*F:ù¦Œ4p0SU"QQrß®¶> d¤!™AÕ Õ3𬨠ˆVõ¥ÝJ]{õ¨„GR<1à,©ÑU ªóëõZjÍù3Å-&QÙ÷=u–H­µxt‡;‡)ŒbçUOÌ¥ÖRKdWÿ½„È!HuJSŒ@E"…€*"RA­²XQç5í%ƒHÍ{fŽ ÀªÔZªgib`‡Îõl @hù''6¡‡0b ã2òHK ÆÜfŒÄ¦*Ð2² mã7)ÈÄ¢ê­Ú]+iG}§o¥DDêBÕׯ¯!¤üñùÓ÷RýÄSSËf¹¨ªV«1„-mÞá]f&ݾã9@`?É«ëÃ[:ÇÀ)Å”¶Z3ðÆ` VKõ‹nÔt!2[Îî%©§ß_©A­åo?ý8|z~FB7Md&ªUêý^J)¥úh‡(€„€ˆj)""–jÝÚç5ñìuÏ>eõsÛ3/æt6ƒnô±¥C¾‘=LÒ‚/Þnn³A´ ¨š¶< ¶‚u Àœ¯Ð!MÂÆn©ëÕÃC(QP1¯Úi…¹åNdÚ 0©=Ò{>|DÐtóuÚ æ+EÊ0îšøÁ«7kš6gKKåõ™‚šw!wx ˜y»N:xoðlúÆÿë'7ºVj „6D•Y‘Û, Žþžp]ãõ؇ ö6T>sŵ4³C@ë+ÛÕÝ×þÅð ØhwÁûôÈ'7ceÛµœ¢«­¯£Ó{'›Y™ãZíÙüÖ8ÍTl Ä"Rk D˜ q V¶ms4E4À™Ð¶aæuŽàuЦ*µ•Iº%f9X³G‰*‰ ÀO_1µËvBÄ´¥¯/¯%—óYÏç³…¶êED÷ÛBgž<,—½†•b)¢â½ìµT¿m¢c€P«ÖÚò“ðjPÜ] xÏ&XÅ”À½?ïÅþiîê½ïûû÷ÿ÷úòšbÚÎèëõu‘‘àÓÓù”R©UÌ8©‚èŸ09¢×íµ}šWuPUë™ÿíoÿöoÿöùógSuG¼™•j!D3õ“óýŸÎbÚón6d\èã¡Æ¾SÓرòb­7ҿ«›‰½z×J­~R9·§% ÌΧ³™1w™ÕýwDc ÖöþªˆK^Z4>&dö¹fJµV#©BŒ¢œ‡GÄÀ”Tˆ¹ÔÚu.@¤´%0ÞøMä&KU!Š!&î{³6¤qrWS ɵâ†W2UŸQˆÀÀLÄžŠPS‘ž¶áFï5{þÀÑ kUSó.ÖZ«šŽÀŠøé‡d"hÀL÷ûþÓçŸOç³÷vç\gÕ¤# PÕj­¥03 Ä=ï"ª2<†Ä¤ª÷[Æ‹0Õ-ĺbò’gê¾·yK.ªÒ]FH§HV+… Ò½>sõ%)bÝëND)mžÇ$ç‹E„À“\_^K)×½<ŸŸb à@cŒUgÈþ !(#´(䬚Óî&íêx´Æn‚f ×VY;KX{z3;áaÉò7GîЛɺ›;›yÊ–4p6|™¾fiÍ­-DÚ\îÅ<ñÖCªŠ„=J9îXÖ3Ùì‹Z,üö÷|‚µ~Øc÷%zð¬™ë]T04ScT_¤›6lE'Z€¡´Î@Ð~”z-y#çh'£4½Ë÷“@1ø,3UÌ®³bÇýµÏú¯‰¢ðYÚœþ3ßhÑf›UÕ Éד„ÑË·ppÃÑæ,‘:þcq{Ï ß1¿X@á8)¬j DH¼x1ûœ¶Y;q*«]PÃEó;·?' òf8ù·ŒÚ6T Œa9Õ'du†š~4Ó³ÔM»³‰üvmËwš9“ñ!7÷SçùH¤½'CÅ‘+ÀÉŸ³Yh»`¬¬·ñšš}^=‹³yíuEßüSBôˆj{,µñM32Z«ž[¼~`‰÷ôô„M1m¢ˆ&okU˜;DÇ|Fhª7Öâ­0â$>˜#&p˜¤öG @_…$õ²_è7”I73^ÝÄ€¾žõ;G——ÛuæÅÃ}‹¾6ãY‹¾Ó¬Mî¤]íÅ>í«ÉÆŽóÍïÙª€^‚uPæVãüƒ½áÿRk˜ÐçrÎ7öº2zÉOXµÕûüPú7gCo1#-2`‹•z™õ[« •±_³x ª4Ž“©Ÿ`ﻹ±µ(Ùƒë}(í.¥G¡×3ŒfÇ-ê¸wqÖƒ…Jð(/¡ÍÇ zKÓ¬Ú-– Ù¿qÉÖ{¨½à#å± ö10qðð£+u3Ï÷"z㬛08t@÷šBZ¯´õû”y à££ÝÆÃó}MÛÅÖUëWæ!QcoÃÁju¿£Üæ¨mîS#{cöo °ö¡ŽŠ2ÿ?PêßÔQÛ±báqð8"0ü8Zƒ ðñ½<4]ÿ^ÿßáÄ·÷þ’ý1éÿŽÞ^hÿh]ËñýµÃø¿zà·MjÞú¿ýe‹ô?ûg:Ò¬Ùä×ùýÒl5i×#5tÝïw»¾)ô0ß¡ö½át}íÛxLs0Lû­“ ýXzCñò¯ÐFe€ÿi¯¶;qºiÚW§v|"4ó­ÔÍCõz¯‚Çîßi Ú¨±‡œ ¾ó…ã®}lçÿúý?[0!­¨µ êé”.—&R2³§ {ᥩ2‘¡•ZŠ(1o)]Îg"•†’$òŠBqËÀŒ¦kN­qo#11"y1¬f•ëõæ‚xóÚ5¯Ýó}ϹHýòúòåå‹©Å8pLÑ1ß!ðiKÖREå»OŸNÛI¤€{óÕ,2£ÂžóaE…`j¢5—¢jª–ÒvÙ.N  ‰8 L˜R|º<_¶ó)EU˹zÍ1!W©?ýôSÎ%„ÐÕT5¹]¯u/5ç}ßk))¥ùñ_ÿú׿†‘hKÉÑUä~»¿Þn_¯W Pµ*b4ßsªÚ)m‘“ƇbŠ‘¹iã̘«jk@ á²}s8ÆO§ô/ýqKÉ\ªæõÌ{¾û+)µ¸àˆ„[:ñ &«5@‚I憬9ÅÜy÷fNšvÂIUãfR¢`û¾#a3Wʼ£uÊ.ýûb æ@„dfEªŠÐaÒDXK15ïB¥†s3­RrΧóé´ÜÄBD&1UµÚ÷­×ëµVÕRîùžsF"â9m‰Cðïškad&3¡[@½µ60§´9…Å·~€]UbB$Róñ£´ýrK'fwî;×þ‘‰80#ª ƒ5b½oªœ›ÛEÛFÕ÷–r"Dt]¬§¿Vzì ÇB¶v˜ÜP¹ô¶µè1™ÚhÄõ«a~á§çï‚×äˆTì8²óùéùòC}ëãÇ_Xí Ã#ŒˆÄ‘˜‰9vþþ$R#l1¥˜1ä¼ùòåöòrÿú5¥d"__^ ƈˆ¥”}ߥÖûýþòúz»ßòžÛUæ”#™wΙNè,©ÒðàR“N]Ÿ¬Ï1äó;ƒˆ´A&qÚâåt ÌÒŠõæ~Þ†ÊIØÍ}CªÄ¹½C7s‡q766 …‹£Á¯Læóåtyzböt–RE+á8»›’ŸS»ÜBJqK§b[9Pëù$dfk íÜ>ú!‚ Hõœ€¡HÍ¥T­ zÖû`¬Õ÷€Ž™qh¼#kP;h&½aÛÀTŒSÚ"„À¥–×—Wajr°Ïn}ò䕆&âŸnÖ# RJñ”|ª¤UŠ [d¨5c¡úK%0»ïÙÕQt²š€Õ´ºáÔiQHUÔj)H©Ýw¬ÙÑÛÛÅãGv<›1Í,Äðütaæ’Ë^e‹1m‰‰ã)…|•©#Ö„Üjw{²‰9p CŒ§Ìs„>胜^ÙNæ®r¨jïÇ[R®67ê ƒ‡”ÕC4Ål\ž_½þsñk³¹5G´¯S>Ýã)0jÛª’ü{1òh\7”ôñò=—PÂÒH›ªÞiF6(Ä8Á$ÞòÔhâ½``°QÛ$W^³W€ôêZíVþ!­ÑîÛ˜°öçx› ,Q£ÖtÚP-:0´½ù,fkœVS[íà l½sÇCÞw>{ aà‚áò‹fÿƒáÔclt7BçìáÚîÛv&íè6먤Íߘ9ÐÍìksé ±ÌÓu¸×[¬ÂÇããÅ¢ù¯æ Õ-óø(“´õ‹¦Kù‰¡“qà°‘ü Æþ§…ú€`"Ö» <-ÝÎcjÅ´âWf÷ôèˆîì1_ Zÿö`²í=Ïm³ØXÔÿö“ y{õ¸oɤO.tn÷ú.—úý»ÑpxáìÀk]&ŒˆÐ1S͸Ðоji# #BbFâV›dÍíß&Ó¶ìO½R Í´­,ŽÚ:âêÛwê˜Op¶œø ª2†í”êÈ;7@˜x¦!\t·>Ï·‚õó iX+—uöÚ¾¾Ví÷‚qSèy«®µQ ëáTØÛmÓL׳“ðÙ‡ ß¯§e…}=7/~ ëqѾWº/áÔÛ¢‡²`|yË0ÀÃ×àôrËkœ€hã÷h‡4å@]uνíìm ›ÕlÞŽ>¾£~}@tGXÛ¯mn=˜ß—'Û#„é]rÊÑPÿÞÇ7A8¨Èý,;6ŽÛÆ}ãQL† ŽÓã XÊ¡çmtPäVÁ¼?mpUͺ X>ܱ(³ƒ ýP‚ý@šAZ–8ÞHºÇ ¾©Ëž‹&|û© #|£¸ù})ú7Èövr÷ xÊ{ã¡õp¿ûzpù ¿ÒÞΜ¾ñ2gœâÝÃÇÎ`û] ñ¯½¥?>°‡dËñãþ“dð·D&ü¯üOï6€÷çJÿù¿ðÝØ <ÜñxÑ Úò¿þ|[—s9 c%ÕÁÓc:V¼£ »ÒOÝzÓ\­:gÙûÓXk/*šy@ê¯v¡f–nüÆ–¦6kèF0<ä¢=?jÐD°Ãižc¢¶¿‚4—Ôpl0™ÌW„7á¼Kä¾5™‹ÇÏ×ë­Ä@ìKlDäŠ&J—§çôtúÊ u˜˜rÞݺmIUo÷JTB BV°âÓéS$æ×Û~»_¯×[ÍET(—lf1>û¢8ÄèjW÷;s­µH)UrÞ½¥BHHÙaÖîŽd¦¹Šùbƒ ‡SÚ®y—ª)¦¿|ÿâp½¾üûÿ÷ï{.?þå¯)Æ*ÕQ¬¢ˆ‰CÖ’ë®b[Œ)Ähã ¢`ÈN‰h áÓÓe/UTEDAPÕ@Qˆ>ɨâb E hP¿ÀäʸP#Rj-9k)hHF1¦óù釿üp>_^o/¥h­†ÛiC šK)%—JÀú fn,$#âm‹„¸‹Üò¾EÝsAD ØU`¦´m)æ`¥Ž]¨KHE‰RH1œ.çK­ ΛÔZ¿òKÝsUÉ9›1EL„1D‘jbžèG€ªRUxî· ±1Á ÐMAÍŒdõªø€|Øä§´YU}½^ÇèÂ/—ÀN¹]–ÅäÊGs«[Éºçš #Å’’“b$¨¥šSÜN§Ëù)¦ä;’bRj©¥šB.år¹Å3Óp) ˆÙ9Q©Ð5SÕ@(b*¢ªh11 ‚-m¦êÈ)&NÅ6³Z«×«¸ A¾™&'í3Š #V6µª¢!2•Zb `HkVª† Ï£¹Vî8nB€XªxÅë°NûɉÄÒy,³Ž1 TuxƒVˆ"“‰­¶,Çî‹h­ÅÏÕÀ!„p»½Šêi;ÇOÛ™™Çd+ÅÍ“é‘ø¼¥¢xûˆÎ¶-5531Q`ª*RCóþèò裇)°8 K5¥t½^úù§ÿ¨òÃ?€ÖêËf*Ùò^ 1¦”RŒ~Döû.µ˜AÎ5„Œ§äÅ­Á|¢9Xsv^3q?ZäÃQYöoíò¬R ¡ªäR\RuòO/ä4$RNÕ>zœ¸å†RQw5ªZ.Å'%DhŠ•ÈT™°IíÄb‘˜ö;–RšÒ®R=EÔêyaà‰}´à’‚ªÖª.ሊ¯$T ¹õZ{Q9?ÅEÎ[wÀÉie1F& !©ªâ†ð>àÑn¾4S ̼m1&U€8xõ‚HˆqÛ<º‡¹Ô\ÞhÏûý~ÿîû¿œ/Ÿ®/¿”Rü.ª&Æ Ì? ä8oרU UoÀìª=œ.g€6âjK±*RrÅ ›`aÜkf‰DüÓgFRPoóV«Ø)à±hfó¶œ!"Ÿ™ ``ŸÐÈb§€ÂåéSHi"ED`òŽVëv×—»já¨j5$!÷ÙÏd]·ã°}¨ŽÅpŸ¤ ¦{[X*ºyW¡ šc¹l]´®,Œµi²©`ÓÁú“ä0´Ôé®ìE·ÞÅ3'¶J[ÃKex^ IDAT…Qƒ>¯&>Îé#ÏÖj`ØÁ“ÞKÍx3q88½¿žðÖz2%ÄÐ~檅8µÌ_ô× c¶±X÷§‰g/n‡¨¸£c+€û!!ŒµÝšÝÙ2Ô}õ£Òê…µ …öo񻃾:ÛÓ̶n'W¥gôýN3ÔRyÐNÞXl´þy{!­(¬³î‘MM¦±¼W²Úh>kÿhjè! ˜,¥±×hEŽB…ÆÛo„USÙØÑë¹”$Ìý5r“Ú`wÞ«¶ÝÕdBò!,ÅÑJßshPísÞfÙ_ÚsÖ5ûàÙ\f9ª²ÀBæ’Ž]Ï8â9 ´§M§ÿ¼BµÈ2†Ñ~éO‡—_ÈÄÓáFÆm³ìûA‘qUÒªdøÁbàÐêo¥ø‹­ÏaZèÝGr«[YÍL©ÍVÞ¾Ï6´å#ÉZº×y :oÅ–C3¼û¸è“¸ àa4®ù^®ñ.[4¡PûüÞà@(!4@CO/:X׆­ûà.ÿ:ˆ'ÔÓ„Ç…£G{²AÁ­ mxÚæÏ]1µÍvÕ•‡Ka´ä.¡–îÓXùPC}0é?±?–Ûˆ'<}ar„ ̹죇{†˜Ìƒõ ÊÌ´Á{M¦ Ç}t#¬Y¶…¾tìÚ¨_ÇC„õ‘mà|+l®2ݘéáˆw4ôlS8²xðˆky„½àqrøIkcM<„=5<´·» .6èÍ­çÀ3#aôÅ kÇ‚R[{%Þ–¹Ú›PD?¯m9!˜û–ɘϹ£åu™(Ì¿³ÊMøQ¨`uÜÊ“g<dìátzóo„`ã oµâ»ðžßh ¯î÷£¿`¿ÍËmß“íãñćP!›c±yÁþ¦ÞÞ߯þÿ9þÞù7Þþµ°WTÓŸdr;`ùÖà£Wþ±æÿó€?×Hå-ÑÊ>/Ù:T»4r‡¾q^”Ô›z¡ öþݾNs Zàioµï4Hx# ûjƒÌAíŽCvTÿ=]M‡€ÓòöRNèÓ…žYÄN§œöŽaÅXãïéÔz[ÿaÚ€+¯ó‘ÚQYU¯$hiä‘ Ÿ—. °¢@fD̈䮢eÏOß¿~¾Ý@7Çø€©Š©ÖZÅ´$±¢µ”â`EPÄÃà)†§íüåõåõz5³¼çœóår>mLˆ—ói‹±ˆÜnwUÝbØ ªTèë6¹__ Åô}$¢ª"ª vNé¯Ïßà½j„«µÖ\j-Z¸Ô²mö\®//?þ¼ï'b ¯û~»Ý!#‰Œ˜†7È9ðˆ0…X¤ª"„B?ýò¥ÔìÛŠª–"£Á­dÏ׊*nÛé»§§RJ®cÕR/aZ«7¯ÅKU4ØÐ~þùç×Û ‰Teßóù|~>?ãO§S¹Ýv×—ÍLL­JÓû+«‰” €!FbÞ¶dj‹¢¾TF‘@„ür(R±A^| µV0Ä„™.ç^.)¦×ëëËË ’©êËëuK[ ¼¸jP«€š"²ë×Ú7àªZÝÈ൶=ÚˆDjÊ1¢ôNf_xÒƒ‘¹ûà˜‘C9ç=gT&jQuþv»°Õ%µŽêUSÓ\râ)Ä“T»z5õN³’ÿPC€œóëë«Tå0„È)^ð™ò>¸IBÊÂ%WìEîß žO—âízÕ¥T!„€Žùïz É÷ª¤ªÞcC¨bÞZ$ƒxmcPˆŠ©š¨T¹ËýåöEíùv»¿¼¼„¶m˹@HiK̈ÐÁG?ýòSÍ…B@BC2+D¤j`•™ÌÕµ*L2 fB#=fÅCÀ€š”˜¨÷-¢VñÚSy½¾n[ „æwD*š÷Ü[j@ct;ÐàY{§+"#™41I›‘®)ò}Œ È̪RÐ̤vï<–n”f$01MÄÒtåfB÷O3FV1fU‘\Š6es½#k{P.øCÃWò"Õííã88æÈC01pΆƒ™@jåcˆÐ_[ǹ"HÕ• ÛœtŽZàxñjd"cZ•’RóØâå|6µœ÷Rª©4@bä )™ZUaæÓéôý§ï !¼DUK®¯××\‹VѨÌÁë”M´G(¼ÚzвUÅa;ó•ÏŠïA^Fô±"ø³ÀoSÓßÒØæFÌž!Clu‹#§¯ª„ÄdÙŽÞåËLLL‰Q¤é1©@Ëj¨Šã†ˆ6m4uPuºÕ*"^0¦VE±ÔB‹¾¤*„¨­ÏÈÀai†¬ ¨ÚðZ Ec ~—s?#b…VÜæ½«ÆK ‰ˆƒ…àÄ¡X @$B¯ñ`å´EÇ&* ].'/jÞs–š·äÅ3µ9e[Û)RïS²zÏñ¢VKI§í¯ù‹Oµ÷=¿^o¢b&Ísa â@|cf1 D¬j^ ¢> I°1RuÂr/±4âRŒ!v×s[Íõ„!àëív2ûôt)¹ ‡f‰Ù3^Ÿ>}Š‘‘xßóË-›U«l¦þø`$ò‰¥_t-äDhH‚JæKÝ  †^\áý±k[€‹mâ쌘eï‚Ýñ;{TqHíÝ-cp°YÂt¼ôò+mªÙ*Øê¤­»mÚœV¦ÇL±[.ÛÀC§+dBè:ÁúíŦÑwQºÐëhðÞE G9vÔ§ô1\3í0‚X?b\¤aéójs £&·ª­­‚ÐÇC:Λ%z-ÛôrèÙ“©h8nþ ùã0¢[/,Y†2QÏÔ)F¨~ ¦M¶ühß„cðH;7™¬1‹°›×ÝÚ4QÊHР#íÍwjiû§««ÛGsnç-5¤`ËÆ ÖÏÂfm·bÿšÎ šc¤¥8’Æç¿PþW‹`Ž{º0Fí!ïå«c/í'Ê€fá N¬ ôá­š"h1ÓÂNU¢iLí+®×›C4u",ꄸì¿‹sI=,¯v)á#ŒtœFãÅ,<#/‚3—¶[4³÷ZÌa"Yõ˜A®€µ"(’ùMÇ&ÐzÎlDqŽUk/ïU ]=a²¶kË6@`bPñ»û«›öF6§q<Ê.‡#­`ò|ÈTúQM­Ó°½ÊI²æ&·VÁðÖ@½úâ§kþ`y€–?è­Ím7%Ò¥‡â}4 p¿ØhÛ*ÏàÁ=¾2âºl1uw5uhõ¸ÂN:µ·uOúÿ¨nç!û™¬XÌÅÓ5ov0pã,sÆ÷tÓùǸÌT{;=<ˆ¶‡±Ê’°2{TÿqÔñâû’šÁÛ1Í•Æ$ÆF®j€œlé>Ä4 ¾)¾k}µcë€E¬Gäû„MØ£¹ØfÉœ?&©7û&ØÃR_¹Œ<ñ=ÿw›2›=æ úl‘¿`­¨XΈÑãÛ"Ë8£3×ü®oÝ~ûø!Ùƒ}`,É‚wÚÁßú+zßöõÎ Å»Z-J›×ï‰ËKþ–¢kßdáŒoˆËçù‡½ñö›¥ix¸˜–ô!ÌΨ ˜ú#Îý?[(~'|±ÐJºýÿ¢û¯u9¿÷F¾uÃúûó ¶øOúþ„‹ï ”ÑF‡ÐÄ¢®ìE£u6ùx«CÃ%A¹´Ú»3Z'‘éhv?…»´9Ž˜€F]Í:JìÖnÝ:³¶<=›ÐÞÿÄádÀµr¤þšȈ&ˆïP„C ôÚ!X»uÖ k÷J/˜ÕD°<^OnD Ð DÌqã Uíó/Ÿóýå‰30 –’ ¦Ô43îH‡FG5(Rv«TJ*Ò–Ò“\ÐÏ·û5ß³m¦dR«£ADÊ*y/Å=òµ¢Ad6€Ûõv{ºœS|fe!Â=篷×#]RºœN×}ùúzÏ·{.%ï_^¾rˆöúå ˜½¾¾\oWD|º\Š–///vË{@òÊ\Ùî1D {ɹZvA·ýþÃw߇þåsÑ»W/çhfµîã¬%f µŠŠ0S‘z¿Ý1¥äUõÂ23ãBL¦v»ß«Èv>K)&àd`1ÄççOLx{گ׻Ä·1¦Z˾ïû¾›©™r­5¸OˆU¥‹Ò ¢9W¯ah:5 Vx ªltËY¤jm¹Œ^Šçí¤"ªEî¹H}U­Û–R „Ü€ô>w ÁÀÃnWéž2EBQ÷¢*µŠ*R‡`@DÂc`¾—]D›ÌÕµNÕC*VÁ˜šög †`Ø‚ìÍ*n&Šˆ¡¨˜csª¨š)À#!í9sd Ÿžžk 1œ¶Í1åLüݧOjºïṲ̀°{Y]aCª¤¥ˆ)x«¢« ™¢K†Ž…™0‡›#)˜¨¡sï>Ê!)¶ºN@QCÀZÊ×—ëõv¿^¯¥d–ª`¦êU¡¤ª*µVf®µ^¯×¿ûj6$à@”Š©Co¥dTp>!&­ÎE"2A3&@ñVl¦*ZUPÄD‰ˆ"˜¨²!›¨˜V©Ìt»ÝÀ,„ ª!B8Ÿ¶û}×Z­S«Å4‡œª"æNïÀ!¸"Åo`ˆéÞmm}³ŒTMT…‘[ÄVDó½ÜöcŒ¾ãr©\ÅÌ”eš¤ZÁoOoø¼×[mS'Ô«ÖZ÷}ï `¢ëõuÏ™·í„ˆ§”ª(Dfcî½èX¡Ö*Î÷oÖ~ô¢?õŠ§ó¹Šˆ•VPîä'ïÀ*•Œh¥qÁÑëc9p» SÚLU>==1ðS4Ä YK®"¯Û¶m1!ây;¢&y~~b¢{ξµpó»¶è›¤¶ÔJk¾‰uíCU±‘teYU9°T‰):´¤ÊòCíO2)y"hݼné-ïżE&22f®" æî{Åø=G‹´ÑžP ¥–ª¦¢€˜bQP+¥ú¾Fª``@–9üâ £0U10诘µ5³a«¤ö†00ã&q"U©BÒ|U„Í:– ™(0‡(ÄR²ˆPä‚ÚtP†˜Nçs-åúzË%_ÐbŠðjE J©U•cR3`F¦ªÉÀò~Ýo9çÝL…-E'©j-%¦­Çí[¥i`º—-$ õµBuÅV“滸„À@b¦Z"3“Š©ˆõă Eëë×SõLOo€nÃ6Ì!„´ñv“R³¢h…pbf÷ṪL€ÌhäM>Eë{ËñPÂ.&z±¬ŽrÊÑÑâ&íéÚ ‘³ÏÖ ¨ùü¡Mýuvm¥P÷MóÚ07õKr]Q…µ ¯M@muf“Cî÷‘GéÊ–.Ð>”Ó.4aƒÿà,É[`/~&ƒ0K´zBý¦ØŒÁ¦f ÄÀ@hø£ýFÝï¡ÝÆï 1úk󳞼 xÂ÷qƒc?C3@DD¾¯M!]D«!.Ä#ó%ÄôucƒÀªW Fí,âBz:¶çöšnë¹ ×ú QM Õ¼j§Kƪ3€;:5t‹ÿhL&\À;ó3noÙº‚?™%sÖ2íëŒ Á¶|£&[®ÑóˆÔ4cZ¢Ö®ùšr!™-n¤ö6ÚÉ1òCÂ!–@*ˆà1ÖiOƒNcjòp·)¡AÃv^Vï˜Å^½mÄ=È0 ó£'ÕË f@„žøª¬Ž>;› ¥1Âo‹ t¢âØ«ÕÚ»çˆhz°MÁ, ˆöi†µ’û¥ëtÛn¢‡=x«:süâ †n?óh5d•Uuþ¢ÓX[+éØ˜6{Ë\Áƒˆ##³¨iÃÏ6¯ _yÌ¢í…è|=„c³¨MvÀÁŽ‘ùÞڲʓƒ/<¹C#}’„ˆ¨V[;…/¾„9¨ŽwoÉ%àÕŽ;¬nðt}æh¢·VΑ:ˆfVi ÛÚŒ„èÐrÐNWš›$5Ä¥ÆiJüÖ]õC3ׇ'ÏL¬©Î“7¶Î:}ïˆCöàÍ>”Ãâ{ñ]mRöVí"{W]|W·ñ¸%ûd)²þç”tŽpiš÷å1èQš©%ÁaüÔ»° <ïµ¼.or*› ™>ÿž>€Ñ7óCWïÒjCK aÕÕß'‡õ‹ænïX²?ïá^}PØíËñ{Ø!|GO6ûÀžÿ¦à¤Ç» ´wDîÇr‹ß¤ÿ~è}¿Ôm4L¿u°¿ñ³ÿ‘F?ÅÝnï|ýCíõ¿Qíþ]/âþBñ?7`â ?ø¶†ƒî怡qÔ€½Õ­·¬Ñ­>¬T¶p߯ïiƪ^Á-ÿÝÍÑLlM£?ÞßqŒ{×Þ1\ÿp© z¸õÜ(=ÜiÛBÿP3=ï"6«ì`ƒxü=öUØñÁ„ýQˆÖjø0óæÿúþß‘,€q°8HD[$»¿¾Ö²spÎL›´èþ ff"s°ü ¡hUj.YJQQ5Q'ÿŠH•ý¾;x¨¹Ý÷œ‹Ë¥Ö\JÎ¥Ö:0òÎSŽ1·Sà VÑÅ#CD·ˆ˜¾Þï{Ù÷}—*Uõ~¿—œo×kÞ÷-%g1çûˆ´Ô¢µ‚ŠÔRr)ù¾ß÷}/R_^_î÷]Tˆ(Æh€¥Ö{.¿|ù’÷ì°fBl¤d3BF$©BD9×—ûëž³ˆzÝå–RŠÑ' ¥Öý~WSäSrV2q`ÈyG/þefN)†oûÍm鵩šFD)¥”¶-œìËi1©Mè…³§3€à(¢µŠ¨Bà ª9QªÃMCJ‘‘™J­¢UTCL,¦µŠ³†¶NÛ›j #ÏD *nj®RSJÞ/ f!°ÿh‡¥4³°èªN§15k0m[`'`"“¢"SP›‡¶nɬ§fMUELDVEDÍN)6«bˆ13#D'7¥˜Î§“û=ý,ò}LLÄžX²VÝìB³˜V­€(&~¬ÜuÛÈØÌꃕ ànþÑîíˆnSìévŸRqÄÜdBH1JõzLÇ+©ˆO‰öœEdK‰C`"Cä´Qð¾ˆc@&4iÇ©A"Àbè³+ÿ°ÄMÁ +ˆ¢çĵÖ6¯Š˜sÔwø~Rç’÷û]DR cŸ#"n#ÄZ 3¡©ÕÕWC¢È=ùAÄÄèÞÍF?*ÒZa‰¢7 1""Š[,Uzw1±Ÿó„ÎÏ%‹i ìlßSùO6ëó5l,~Gfú|O»FÝ¥•÷|½^èELO—sŒIU™Ãã–R©uáv»íyOic"‡vƒé Í :7 1ÅøÃßm)ÆN§z÷™¿—’EµÔ:vé-Enbž0o^…ÞÇU„T¥VÉ9×Z__¯¹ïèµÀ–’w¤«¶T 5,ª$z»,èE[Ð{}ª&Ršæn]\J8×u{ @t2àдG \¸©"¦JLÌì¤gõQä#!ˆj£ ™)¨K–>F±:¡¨ñÕYMÔTŠx4ÑON?ÿ±ªÆÀPEbL1p#äûUlVj®µu‰ ¨–’E-Åà=%ÐÆ3ĦÕïb„ã¶Ñ„Q¢HH¥–R˾çâ¶]@¤M̤¹cÜŒ™´j•b fu^™wÂ7ÑqKñé´¢J­µš(ˆÖûmßË^j.¹ªVD³RêÄa‚A©5z  ‘;nQÍj)R»îkN‹ï=Óãé´qíz›æV3ð¡ µ‡‹€ä}/%kû*ÆLÀ ŒˆH‘9´û#’1r+9ð³¨ÓíAˆRqƒÎ1Š{š4ë.=TºveÜoåì* rä%ëÖ@ÜU“ýRé§ö\Yö8hW3éèŽÄ1\h.“V‘⹺CN¨ÔɱÆäÁ£…µ {]ùÇÅTH€ Dˆ¼´) Nž·" VŸN‹uW—^œq²R3F9ÌHR4ÀÃ8# ¡{q)zèdØŒf[åÄ”ãÄ,\Ó:Ûšf6ˆÉ6"ãdäb:̉f>Àz•ôw´cK¸ðI–hNüvŸ~ª¶¼Ä8€½n½Al¥Zऀœ¨6Q­ý¼÷ÀÖ@;·¯´RìbµEjM‡ºW~Òê4øºÃ]F_ˆ@4Ÿ ¯¨y²ly[®è·2ñ2‹ñÃÊž%tZ!ª¿ êÕ èÉ " F—QÃÔâøv>0÷s«Q¨;wnv8-. ¯$µžÈABWÿ±­[õC3Ë!ôÕ0»ÃgñrÏ’ç©gÁÑüð= ¶¨Ž½UáÁQ6?Û®#·U Xke[£ä£úÈ—IÈÔÕD¯[OS-7l,§>du¯ †Ðƒ˜€Ú€Ûo؈kóø0EL”>ö&§·rµgiz÷vOý Û? ¿ b[µJïw·”±%§2EœÝضøZUGæãÀºÇ¯Ûæ­oQrÇ®ÖG à,¡ékVš'mŸö.åá³ð€ÛªuíShy eHB4‹£Ü„nS‚E*k÷Áb&”¯ì1ø-3~I´[÷‘ªüX3|ükSn7£þÌ{£ìííëƒm‚ÔטS|¬ 9òßmüa«Pé$B3{ø²Ë>,°A< Œ±oòKv°É]¶Í ðˆþõkÔ’´)Nk飓Ä´µ“á­\øþ¤‹àÛËÞ{ ýº©~þ}*øÒ•àzZ½æíÿVø ATh‹o/»Vàæ þ–ÿ†ßü;¿1Tà…ýg'ð=êÿ›³Y÷C°ã)5«sp<ø×ÕU[§Ð áScî!ÌŠŸÁ÷gê7áÞŸ 8ŠRú÷îó²£~ïÏ_7b Zê´0XÛÐàœ`ã人ìüŸæçsk\ãt¸”%­Ÿìx6¯?i¡oc-°|,Ôÿ¹ú²>ø4ßMMSSŠ„!P´Ku4¦JdZr1æBŒRœLîåxì“û¾%BÃàB[ªšË.¢+õµÆsÉ¿üò%åt>ŸbŒD8…ÞDˆŒƒ`  1¤|¿ÿ‡üwçPG‰C­RKÙsQ¹ï7Wp 9ÅãõzóŒBsG2m)3ÕR‰i‹iŪå¶g3ݶ䪡‚^ïûëËuKñû—½Ýo¢k~½^“—{;@É…‰Díõz­RUˆbÏ—‹©^s®R'ÓæÚ«Ã”|ÅXJa)¥”¢˜l´ž¶HÓk4€Rî"z:B€äj¯£:«¸ÓÎ$‹ã 8FfŽñ’bbŸ* +´è†•¬^¹™85Z)³/à¹Öj§-`.E¡"¥£˜Ö’oûn­® 32S ÑÌj¬[L*º—ìr#÷bç=ï®×ÔZUõt:sVU}&¡Á ì¾ï÷}b¦RÁ½ó£KMM”YMÉ:½½CU•Ž!D É%3±‹z˜R"2ˆÌÄdNFå8„6í1«"mNX‹˜A AT™¸J5µØWÉ.„ ªP~{jEr.™È¬,óW®ðš¨¨(#¹8.ªDÈD(¢Û–3Û< PÊív5µ¢9·[!†x:Ÿ­[vž.—-&3¨Zµä¢ ¦î’V€„Q€ ÐÂÒ^¡&ψp@ „)ÄÐo³Ìa/™B ̪š¨‚x¥üÒ–6³×}‡œ}uîí»6ò1`^Q€ª´ÌuK” J!Ž˜ˆb+ŽT¸˜ÑHÙ ÒÚDà”ÈHôéù,UÔœzïe(hj!°¨šŠ¨Å|˜ç7"î»2\&5¯©pղ很ö=ßn·Ï_¾Àó§Oÿúüt:SŒ~Î¥ QÉ9¥ô°Œ!p§»œ·Ø,ðê%fk³I4Bñû …y­‰O) VU©¢Z n1Q ‘˜Ã¶‰!쥔Rj­¼sˆáér¹í{³`«ˆ¨WIr !îk—ê»ØÝÕ ÕÆK¦b¦ˆ îÌ!úµ¬Zs–”’WÂB/W,g3E4ò‚G¯±•V—â ÷>!¹¿M ¼ø× UL¼ËÜ80õæYUæîKöR¾>z"5g1ee%k6Ub35§2cNÐSs¥’©+l‘DX«©UB4SRw³ˆù4Õ²¤mâ´õÓÔr¯µºpâú³öf)®SW©/Ÿ¯?üð—¿þð¯—ËýõåËõzmP#©D„`¿O!æR$·k-µŠ•’[•˜T‰ à$§À!¤`ª9¨©jE­³ºJ©¥”ê½DDꕆÄ`F"Zr qÆ ýþ f„PýÂ)"btʉJ!„¸JÅ‚…ˆfñ¦c§×­Á`è²àÄV4¥˜ÀdnNÔË>ÝVß¿uNx«d”*mFÖeXB\¯Ë5b-·À›ÏQm-FíÉú±ë£¡Ä7ŒÞœNô*®æèörÛƒ˜ 0{e èD/ØÁüp>¢¢kÖÔÿ6…÷)Áè·B¿;Ù—hØ O>jt?¨r{µ8HŒ^¸0­ô„:Þ;\ݾ=1þ€²áýin|QÇy÷nÛuiŒÓ%ãGÎ{7îTg|5Ñ›AZ»µùleµ¿ªŽúWË”z²ÀV’þèõËxŒÀ6|@v"5Ų×êZ¯tm*¾€öî™V;` IDAT¿Œ ·j5¾T ›’ve: Œ-¶š‰ 'ú¾7NÃ×L€)áÜæ´xÁ4–ú«%"kW-nXo¿óÖ¿ ŠF}gÐìÝ‹ŽÃTæI›®,âHÕ Íx\‚¨£}xnÁœV4AU8Åo˜õô£³n FV|²ÑÀ€Émåˆèü@·­×­†þ‘Þ÷Ž"«“}¡Øtò·YöÒê·²ÖíÐ.è%mÊ `@Dí} "7dÐÙ `­™çS LѬe5Žžé€ Àü\º^E`þ´až½|­`yWãw‹€&*-çˆô0³öô\ëi}Q0£0ã벿b[Vÿ]ãÕµ¶7Ù·Ÿ¦3£³Ô•`»Oðl«Œb‹¡ÛúH³»fygië4ÊäI \2Phýц2žkÔâjhÒÈ$ŒÎóÓîS“BokÂVÍ¢ïõ…ùGBæ{¤ó3<4K˜­I‡¿ÀƒžÙf³+MÅ6˺…atNཷw„Ü…´•Þ5Û³e”ÛŠÇ^“+•^ù{Ò¿­¦[ 'hvUvx†áÚX¼’´ìqš²¯|ƒ‚3*EÏ!VÞ‘½åûÐ…¼ÒAì1»±–OüŠ£{Rå–OÛ~Ùþ7©ÿ¶è£ŸÒ¯…~·`mÛµí×Õÿß©À¿ûrÿo:þ3g¿®þãoVðñMõQþåæ_öP]ý;à,·z ¿ØŠh{$a‹úÙ"ãj÷qzßeŸåƒÅJKe9µ"ú¾ì½¾£jŠÞ*Ü‚ØÔ Ú‡‘a–]3ëA~PöÝÏb X†x‘óæ÷Nµûø)+’áX# ob^‡ŒÞüÇÞ ¹Ah¼à8*ņø·@¼N§ÈåöòåËW9ŸÎ[hôÛ¶ó'f:qdD$ sÍ @ˆQˆ0$ÀD¦Vl¼]&Î5××B‘N§“×B§‡IƒH[åUбÖú·¿ýœó§çOŸ¾ûž€T„‰|U‘BØ3ºß“‰œ»ÂÌîM‘ZaÛˆ!qH)šZ­hDÞ>ç‹UE"+U ¬ÉUv¿ß¿üòEÕž?}òM[ÚR­¥Öl³sHn·{Î¥ÏÊÛÿÅO)mœ²í""µ`Œ cŒCÖbfZijçó9„ *5 œ!2ï¥ÔR Æ(¹¨j-Ù[î÷›™f'±€›vK-jF^æIlfD "(pð½{ Pµì5‹XÕâ×c ÇÅ#b Þl\UE„˜bÚ¢^o_¿|}ñÑSŒn¨4ë˜CÖì{0@H)2³®RK)ÌìËÖ-žt S˜C7ø«9—/¦H¨½Ÿ¨_’M{½Þï¥Ê)¥Ø õ+h3Ñî$©¢"eßùtöØÊã§OÏ%ç*‚LÎçfß&w[[õ®Y âÚ©¿`q³ ëžºð}Ým¿AK2…Æê`üÿ©{³&I’$IOXDÔÌ="3«¯Áì‚@ö Àÿÿ?"ìÐúª®ÎÌw3UÁƒ¨ÚáYG7¶§·¨ÏÌ8ÜÍÌÍTY˜?VæÖêÖÜ‘Àñ­a«™Yаp ²l‘effÏ™“yBÌ»ßgžgùõwß¹Ùý¾¾ÞnªåÓÇfyhÖÒÛ^T5MÑ ¡ 7§uIÇ<à½zdωƒETKnO„‰DÒ8O0¬Y¸ódæR™(ª!‚³2ÎåôÂ]!”y~꺦Àͪ=¥‘½ÀТ“Q4 ¢èàên-²"Y"˜Èƒ¦I[³ža÷.åI¯Cì `Ë báÜ© Fõ€2™¨\K›*3jSÅNÁ,#>)¶ÖZkªº•·ÖÖe%¢?zÜöÍgo›P-%<¶4Ì€b5Í(F>oÁlnÖZsouQf¸·žHÀ`°Eƒ0A6ä1+È8ÕKäЄ5Å~ÏlÉX•PwaVOŘ,È­ 'D+Ì[ÊRÑš ׈ ÊÛ<ƒ;D(-î R•.¾’ƒ8¢#–)²1; €ˆ°ssËÔE6¸T„ú¨Ìó¸ÕZ)ÍŒ00‹hÆ4Z³¼¢þüç¿0óoó/,òû?üqX9ÉÌZm­VÖ2ÕUØÍxª490.B€*çtêÕoªå³(¨ÿyuŠf"a^kõæa»2%"mYzˆ š15s‹µ“Ý"® ¼ ›µpä|.Ü/—Y€Ë|)S)¥¸ûº¬yž»‡[a+*@°“Õkے󀭲۴埋‰»td€FÑiü<Ù;š”åÂÇ'SïPl’ÁMvÕ­Tv[ãÀGq Ú7òA 9bcöœ¬:بÁ±Õ%NÌððnÍè°ûØKP7rIþ “t'Þöê?8ú"<»F-FÍg˜“PàØº l®W­MªÖDd'@N‹í­†x»^·8ª{7ûÖι'|çÎèCÒ «=P›c¹[R`2oÀ}:Ô÷]Š!5½—H²Þk÷H¶ ³çäh¯øÂ}^0 R±sŠ67ë®;Ñ"¥¼^ Õ¯çè&ðV)qà‰l7ÅÝÄŸŠ7vÞ÷(1 úžÙ>”Ïæ˜M8ë݇Μ êQSš•þ-ìC©žÆÖÍ_µ¹­r`°: 8VæFÒP·™ÔöâHá£ÚÈÛnoÏÖôVì×Þ·[»F:!È "ļsĆº+ãgÕZˆažªxRr=G“Èú¯Í®7b0ë äŽOH^êt66!<a§8¸}iä-#Èùu' ±P“Î[›G_ˆì¢\ǸõÍÂŽ ÁNÃnè!#[VyÙI=!›¾¿£ÏuLa6ZI7é†ìÈ{§ Ë~Šú|; Ûµã­ðYÉÕejâ„":ZŽäø+ÞhC†‡ƒíSM½†<Ž¿e ÊxÛ<×6ÿV LÔ oláw{aö¡æÐòrÌ/ÀÕEÛ¸÷yä»êÓ^óžàyxPö{3ÞÑ 0 8ÈžØÇ+﨧§ªá8€wÞ¼ÈÀÛŸ2àávü¥›*hœxǛϑ>sú¯ˆ°do.Å™GvxI§v†#²è³òHŠm-‚CÈáÇÕäx; ¡72þ㯎“ã?Ζֳjÿ œÕÀÛKƒxç/âçˆÖñ–Ëñ7ê½ûËÄÏVÏ +t¢?ÿ3ùôÿƒdñ‡Ž…o¢Æð÷½ü¢Ãø~ëÁ?íÔ`T¸à^!ûJ«×˜8f‡*³Ý—rxâábèµtê{xTà½û¡Iî$ÑÜdpu*SÁ,À4Ý¿~þá‡ïíã‡Ë\ áäÍ:‘ˆÎ`a&P‹Æà­¿(¥1kmmk]ÛZ[®o™YI d̓B§©·è¦D% &yJ)ªZJ¹Ý^_o·e]®­ö£ÌT¤üêãGVùüõ‹¹ཛྷ@D¥L…DFx¸¹ˆ0ë\rçÀfÖ€`€CàfÖj5)Áî·¥ÖËýöúú¬¿ûx¿ßžg6ÕÌÝÌÌÚíf@Uì:O—ù¢ÊÕP—µµ*¥ôÙUNMD¨LL¨ëZ.—ùr)ZÖVÛr¯µ.÷uY[R\ÖZ«ÕeY×uý•ÎÓ,tœˆwqU¹{ò¸¯ËçϽÝJ™'a¹>]žè** È$Åu²¹Zî]#DÔ˜h&jù–@d–NzgP3cb‘2MSkÍÌ¢Ó”°ïË4¹Ymµ9Y…/"…Ö»+¥6ÓÂÌz¹\æyŠpZw›D2’+¢¸\/sDxÜÖµyËxŠ_Ûê(/3oÖ¢5–ü`Go§`–BáÕ–¶ÖŬ¶z[Í-™<©é—R~ýéÓŸ¿|öÚò@²ôÊAœÂÜUEÍÌ‚Äiu‘Þ¿MT­ÕVû G8zQX¸Y)€µÖ?—N&,Þ‚Y K5‹ðF¢‚‰…â A1É\T}–R¤Ló…¹µ–“’œ9 éŽÁB>Ø\`QiÖ:~|[…yšÁA¥B£úu ÿo㊈Æî—ôÑé N—½ªF g#œ~ÙÍË"ˆ9ÞÖ:u¯ºg·ö”šyD¦½rû#,`ÊÒdoͬ”^±jÞ<ˆ˺D8À©÷ƒ\DTU¸3µòql4Õ‚ ìºW•aI8p“áf2kf=UÝ ÁDTÊÜZ5sf23Uɹµ¶Ö6«^Ÿ®_¾|ýüùËó‡_©*K6g·ü ÖL'vr3»Î³==Ýo7V›G@”K™‹HÚBÁm´'©ÀÃl57Ïž†@ôºÜ—e]Ö5ïê×ëe.S/‡Gx˜³È\´67kD!@5_[“¢ÌÑVk"Ó<Íe*¥(«;JÄ­­™ÈÉë#šZV÷(ô’ê4„þ?8[”ÈèèãHðÏq”å¶)—``É‚ÍÝÚ99›»•xW]{‹øI§ÁÚ+¨aÝç æG°ˆ8§¼…£cob$n&+bßv2½ôÏÑm8d8„WãP’…80q6Ó*wë/¥y¼ß4ÈS÷M’e –‘{ÆÆ=£Š`gGÄŒ:ÔèîeÞèá§ùn‡‰½!’y³ØrGÉ‚ãà²õÞ™»Ùt&ôýŒnnG‘Eð Ù< Þeõ´/tQqŽIƒØhö¾ûÊÇt¨i¦îÑÏ®‰ï ï(l/7 ;°ýd‚Œ‡Ý>ZF{ ë¦ñf&Ý͸]4gìôVòáBÇ)²‚|åúØ £š·X0‚"-`Ûƒ±•1°P@Ò|uðº2ƒA!`ïþ~ýš38ÔŒçe¸SN(†Ô±Uqåo<Ð]G-ƦŒÆØ¼m¹†ÝÇ5ìÑ~:øA îy#ÉëVðp H쓤ƒß‡<û rf™C_ÆEÇÑŸ-¡»CÌ=ŽR33b”Ž$R/pÄ¿ƒÙs™ÕåáDõ÷üwJ[ŸVlÓCSb·19b:7ßJù’|kùróC÷!ÃÂ,Ì>°†ÀFÌn÷ÃåÑÃSyj‚‰Á-8ÃÄw[^ZuˆÅAdžá7¦õmzîé=]xÈ—{}.Î?æ ½É‰—Ÿ~ûÙ¡í65~ÇÛv„CÇüžÉ¿@wu úÇù|8O2rì7'ÚçxÀ"lƒˆ³êãûƒ÷¤ŒãÜ ðNÊÇ–8Ò}Võ½«GüÐ;r8¼§ð¾ú>Æß8ãÔ4ý~œ Þ4Nï <Ô¶?¸ÿß'Ñ›Ï7}Sý§oãÍ$o¦8?ªÇrg~⵿ѯñ^ÁþÍÏ ÄÛ(Ä/ãÿáÞü´þÍ»ûEƒ…¿ïÇ?šÑ?~áýÌ7ÝÜÚ‘Îu%Ø\S‡™ªä…d˜*âŠ.ñ|ïØÊpiwßœÜ]B¼/ïý˜%N´O&ˆN…O]xÝiŸÇõÁ¬Têyô6~Yl¥É ß;öEúaÊ‚7÷‹Ãý+Þ½ GAˆY–"ƒ›;)Ê\@͉®—KûøáË—XDUš;Gîn#(Z8´-%“í9p•n‹Žˆ‰<só QõˆÚš{HÙÞQ†¬p 0OªEKo¼|þDS).6+už>‚^^_‰!R‚BU'ÕÕ±hÑçùJä÷uY¼Í½Ó”ÝRd¿S‚G×ûÒjcf3¿½¾z¸h ˯~û›ßýë¿~ÿý¿~þênnµºS4 ssgw¶ìöb Xk¯á//·ÛË ”Yµ§M€¢<ëUµ˜Û_?yzº\狪~yùšGæ~[_—ûëë­µjk¥ÀåzU‘Ëõ"¢]jL³H˹™JÒC™²™EXÄ#ÖuY×Ú®‡U|š/ LeRVxX3b-“Ì­V·%ˆ‹ïØo*€A¤@¾¹2w®?q$2ȱWQ1÷2Ž!÷mb¢À²ò;‡Ï´©Äy]$Åg°zò&5Xîëzc»¶ÖÙóúèRA«ÀŽ«ñaÐx„O©‰2÷Þ{Úí¶É[ÛØÿÃ3ÞK+ûÊGòï¦øFÏNNI$W vRD¸ƒ"`½2–œXÀ’“|ŠxO"‹¸½Næ¨íñÎe?팬ó„Yöà`ã ÚÊ¿1ðõ£?:±Y‚Þu›JWˆ8E'>a›Sœ :ró>µÙú~óMxožî`ûc Cod%æ jô Õ°99z›H>0OÕ½ÚΉrÄMÎÍý€Ÿ`"ÇĦsc×òFÏòf±ØØh!¹sÀÆÒà­Ñ £«yûò ÔõšcϤ_>”ÑÍàU2â <r‰ØËj3B¹%Iº°Õ§«ALE»ÿœ<«×;¾¤(êltŽÞÝ÷Mi‰ï‘Ûq«;Hç‡1AîÅÜzo«zï¾ìqnAáän!ž™É³æÌ£Áz)0"É©baËüíÂY—†ûÑÇ|ˆ³í2;à¨$Cnà³tDDȧá˜ö =» <i! b¥‘ªãÞbÞ‘Q[q!bÛ8ÖB ©Ñ{˜Ó{ìÄ&p¨íØQ÷ƒCŸŽîø x$ã‡J¼tò æ­”wO¹ Çù¹—uŸp탚Ã⿇z%F¦à ÀÞ™ssÐÞ|Ƽ’’ŠCËñãîΉm*¸ýQœXË'¥í^ÿù¢º[#Þˆ“§Oþ±&‡ÞUÞÁ€8âfâ=åþ@6錦ØÕrzèÆŽÃW>Hp8.‡ÞJµqpÇïåâC†8Œ Þˆé8xù锫z·ð žpUßÒ$NŽŽÏâ;šé ªûèªÅû:îžEÛò[qT!©#ÉøÙ2åiE‡®Œ÷¥s:7Æñ–;òð–Nñø9Ůس)?iJŸ|ƒ?Û×?fØÿñWï~El÷´÷Æ+ÿÝtãoE!þB?C¢?ƒòK‡ÿÁ ÿèñÉ·íŸÆÇKvz"öOqî›fûþðÈ(mz!? Å#›Sp0Hö‡ ÆÓ„·/íï;‰tð9Ä“Ÿ >´… 5;fg÷Ƽ›§: Ówì¢üæè?ÞÚâØ'ðæ³rî)x÷^ßšŠ†‚9@nf¡ ôäù¸í2DæËôÝÓÓÌ@ØRÝ…!à¤`ÏÓ”ë-%ÌÜ#}µ*f§P¹`fvS0/ëJ A/:]®×¶®t™æVÅÃ"\¯¿þÏÿªS±úï÷Ûm­-»QÝs´7W‘ •å–M§­5 !ŽfAQk~*ìͬ¶l"Ö2Ymö—/Ÿ9HYøTDY[ªE¢PÝ/UÚªGUEµÅL(ò+/¶.ë’ïHDÊ<¹Gm5÷­6£lÜ"‚a­-ü«5«kKqJTœ¬+̳°{R¢Öõå†R4(ì¥Y´//¯“*3_fí½ÄÍ×|yRT& ¢ÛzÿÃI¢Ôuš§©‘×`–¢ÚÜ¢ãV0•âªé`N/Ì„™E5w?>r:æw"3ŠÊzgwŸ/×Ü(X‹(¿®ÍúÍDfnæäœý"8DozA±›m7Qáàæv¿/.eRÑ à evæì`ŠÖšƒÓÙÊf¤·›ˆ–Ú‚b/åJ¥É)"jmæ0&u2fÙèé`pôf³´¢¯ë’*†–bn·û¢"¯¯·ûýžý`¹^4÷W“ôædÉyV\¤P„5ήä,8$"MI³¹(‘ÃCAÎíöåëëëBÓ¥ƒyzºkZëâÍÖu¹],ž¯OŸžÃÉŠ‰†J`é³QgUƒ#˜5%õÎfX%=›)–rúÔ²/ßï úæ %ˆ ºpÛ|@°æXyC¯ÂÂ}Ô3„ÑæëϸäM’%IH’Äùˆ¸ÝïY;©\.×i*¥"Z[ æ–ËËÛëëçÏ?ääFDJÂè#çÞ\TsZ£Â?~p÷Ûëý‡~È‹¡ˆÞ×û—/_n¯7Vy~zP×…UÔ‚¾¾¼6kÂ|¹\³<ù2O—ù²Ôµ\´µv™/Ÿ?ÿõó—¯áÎ"ëºzDŠafÖ}õ§¸zz/YH¬¶RôùéùRæ¬I73Q©õ~»½ÔVŸžž\ÝgU&U‘išD:(ÆÜî÷åó×/Ì ‚YËr…¢¢RX¤ï¤Ý#Húd(Å3¢±%ΨµÖkØ™'æJcnDžTtšŠj­MÅÌ­ÕÊ„iâ<ÝNî*è;mæjÞ YÙ ¶òFÈ’ûî M=»—CG‡¶~ôñuð?a4õ浿~Þ× â² {Ã7À£x1íSÎÀÖc—ì :Û‚, Ah¤6?· EÝv?4åÍ8Ì”–]?`|ïª=`í·ºrÄÉHIÑkÌòIˆ°M¢àÝ%åã´x4õê„>ðégÐv¯¿áÔl¤W«è IDAT12ù}è3™®‡§žÚxõ;Œt‡œv=?‚ž üV9v» µi¸ÖçL}¨ÒYÀ–jDð˜ÉseõÁg # s†£õ·;ðHDv´ˆ,Y1”7P߆gMcl±¡!Ý͉94O¿Ê(ÃÑM<´¾ÖíGqŒÑýtÀÖnX©H#"ˆ…8uòœÒåã|®Q=¬£sn»³xÀng¯yС¯xC «6È‚‚jÍ/ß›cž‰]Î#<äØG˜¬Ûðƒ„û@ÄácˆÀ9'ëûY0o¾"³¼Åìd.^½%’²ðf»>}X²òŒ‘?(ï9!9’Ë6“ün 擉®ÛkŽÃ׃E±S· …|{̱M»bk•Æ.ˆôì ôŽiÃï'{î!A0اqÈH û÷âá l,¥,`‰j8ò„ ¿s¤)ã˜0È•#µ°sƒ0øQoìú8éâëÉìvǑ޶kâ[ti'»£7¼õžgCøy´›Øݧsûwá1pêæÉ·-ôh,Ÿ’7‚xÐkO¥£?¸èñ>ýÝ `lÓiœßú[aœÎg-vYÿ0æÚŽÎÅAÛçç£ÐSzïòiprícçà>@ŸâÀ3z'Ðs&q*ÒÀ»Z4ÞëþwÔëø Yú›ò>~<&ðS?åa~?É©7³ ¼“¬ù‘—Ÿßoð7÷?ò‡Ìÿ À{ÿP¿p8ñÍËêï ücù?¿¬á[ç{·EÄ¡`«û–zxÓ‰d#7îslèùw<xÏLd}'’ƒäžÅ6ˆ. mK3>¿ ÏÄnl6ˆ =žcÞ½CàC~oü.wê0Xñ˜louÿ÷!´•‹ôƒ=!l¬'ðc £C0bÄΣîè9vŒgì@:ý.(R=4Gðd*:1³( …™¬¨âé",è[Ráa÷ëí|Ê‚€Õš¹‰*Lr1HDø2s‘²¬ëº~­ër»ßUÕÍ&§€ÀcmÆÃܵV'¯µýõóçZk)%Ï™j§Á\ç ÚÖ Ï¢H 2»²ê¤:ärFväi‹´'Tœ’5dÍœ™Ë4%VCXˆp¿ß™x©Ë÷ù˯¿¼||þðòáãº,·VsåçÍó=¼°8y4ŠX›­nMTµLÚ)DÍCì¾V7gáîs4G0‚.ÓÅز6}÷ñÃ\æ¥.__ï­²tWE#¼¥íiñÛ}×¢r½>]¯U‘»¨­¦”ût½Ñ××—ÖZkV­z £áªÅȬÕÛ×5j‹æ `e0(S¹^ç¾|wKªEÔº¶ZåˆÕÜS‹7k3Í °È ½-˺®¹ë(e ws_kEÐ4OÓÄ ›{u¹^÷3{Ë–QæÍ¹™¼ƒîQÊ Ü½µ¦ ¯v_–ûËk[–©LyÁX르¬<ñ æõ¾Â5jfžd± ot4:ˆxfVkUÕçëÓ§çþþ‡¿,Ë¢"Ÿž>¦jàfdîa˲4Ë@I¨jLœf^'瑳[×Bd©R§ý~H4’‰q(qP™â\ئŠJÖt»Ý‘ëÓµh‘¼”™Ó¹l£¬¸wYH#£ ©æÝªÜ;ŠÎPñÐÈ–S·0&Èî­r»-$/—ɦ>õˆ¶Öemé™'‘eY^DÓ•ØjK‹SKº7Ȥ<ûP=º “¡ ÷\] gÛ€`Y85OÆzö°ä· ³»·¾.âÑïN¬D„î_“öÃ>0¿ž“§}§”ÿ$Ñ%"Öu­u§¹»æ™[k¯÷{o¢f6kî^k›tҢ¢Â*%Õnk5*ÕuM+q3{}¹Õu©î_¿¾Öº.Ë’;wyz~JðK0«–,ºÐª­¾šÇׯ/ó<ýî·¿• X—åëëë×/_–µ(óåÃó“ˆ4³ÅW ªëJÑK#ˆHUç©lÃs"*óTæ)aè¿úî;b^ÖŚݗµÖFŒ×Û­ºë“äa/Dk],ËÒª¹3–û’Þ=‘¦LD¤D§¾?ltCÜKeÀí¾Ü·Ù¸MEdf4N¤ªiPæáÀbîæ¶ÔºÔ•¥hDèD‰ÎEÑɬ™5Î[Q¶ôÞÝÄD1“G5ÛFIÎDÂêN‘¬“äà¸9EHnb’ Ä™aR¸;µE–XÔV#”º äî† ˆ…°’ÑE¥”Y%ód5y¿L6bk­ ,ëbæ9w‰ðÛíÕçK™çu]–ûr{½i‘ëå:—r_W"baUm­X[+šeמ÷ºëÓUU­¸*ñT&–õ>ª/ûN+3cpŠ>毭¨µæ£"åŠíÖ¬úšUÍÜ›÷útf)šr¶€À"“Ê4Ïã@…›ƒ ³zx]V÷šÌ´ jä]&¶ThŠ›žxÀɸ¯®2Ayåé0ήMFÖub#;GMÀIbÞ$Ï s²Y;•yÖÄŽñet+:õfu·>’c[ Œ»g’¨Ï4·XAÏÑÄFYI‘Ëb:À¬Gõn ™ã³Ð›{;GÂ"òHzÑßq¾‹t¨òÐbq0TwÙÌŒé¾ï­«k—D‘ÐíˆwbGësѯpìi]jNpßnû‰âQ›<š žíŒ·°[Ë!ÏvÊ¢K×<°)ÑK|»_7pBøFºï%'¿oLzKAW^2tI{›Y¯MÜ`G•p˜„9ûÄc;å±ù˜€¶»Óm‚Ó‡qLŒÒ†7®ÁYÇž}I’œmˈðP‘òdoeÄ!¬oʘ¶Rá¾krtµ2?•Œ8A3:%&¡’”8É! G¿Ry9F€a„·:pX:0X=ä‘£³#UãƒÜUá1B!Ï`%èÀï{ÕzÃ6¾Bd “FŠïŽ„ÔJ.ør#‰ÍÉžêù¸·ËxPç}4»Q/%óàÅø8‹Î„$&«žˆt¤ÖRÏübÞsºü=(Fù[ÐÍø›×nôFd,s‡©"‚³0gA¿!ì¦gçþ¸;‹$¢÷ôºþßg¢‡hÃ>ë8Q5öz¡¼ûèVwŒÒ]¬ö4¦ µE‚N^BÄÂQ:Xü6<ÊøÄl´ýHïbh ÅÞ>ÈìIš¯quÇVˆ½·ûH”ÆIxLJ}p…ªSèÌC;ºæ´É£Xx›á8©Noáýñ=Ù)ÇÌRÞ Îø#Ö¾ßa%b`Þ9˜Ž°‡“zsTìOÑp¯Í!,î.L\@¯A÷×ÛþðûOÏ8K·rÛ8€ŸNáîNN·ÛmY–RÊóÓ“»O¥ÌÓÅÝE\»àh­UUl–l©e†€›Ùr[ïËm*SÒ½ÛÙ9õbÊy€[bÊ|U&š¦yž&ó|! ~Õ/_¿þ·û·ÿåû_õ»ßÜëm­µhy¾\ï÷åååÅZkµný•án š¦)r) À*ˆhÕ~QÕOÏÏÏ—Km>_æÚÚ—ÏæË‡&ÄR8ÂÛvŸˆ) &ŽˆºØº. ^‹Àà©hZï‹”ÚÖ—å¦/:OsQÒD-¬ÕÕÂ××Wxxó,Xã<­E #~úÝå7eÖºÚÂ7f^£E¥ëõr{¹M2åKúð &xD©€Ê¤¥j%¢Vëívëû!óRJ¾£ÚjV@´Ú¶lwDdø7?"œlaŽmGCfµmS«awZkýúõk4ûôé;µÖÜ aÃÌâm]·z®fÑ",¼ÛœÜ‚,M½ã_²]]±®«1 Lܪ/k ÊäóhþaŠ+‹†JoqK3{œ"¢Ûy‡Í!(DA°pßs:5wgéd$€‹–e]‚¢YKÚys¿\®ž¯DäÉ;a³¬ÆàÜ:Q°À‰¢flÖðy‡Ó¸»ÃmºH‘B¬Qxg:3[¸·•ÖûÀº®€e«ææÞ fnk»½¼J™¤ˆ0«(+»G˜GneBôžÛ¼Q™‡ ÌÌ[@X˜…9k" Y€éänž1‚~ôµVI†L:ܧéfw.y‘¡õtæ ³#‚UÔÜ)šUêåÈRв2“3#8<ÆûfaiÞ”…Y @«·¥%h(*ET¨µE¹[k&K]5JÞ=RÎ.pbÔfý™ QóºÖ¶®5Jd©CÖ¿HÜ=\U……¹O"S–©uɱ(1{mÙXþ³êÙîÒš¹<Ï“Š¬Dš¯óÓ<—y¶ÖŠûmY|]D•ˆØ½õÒ‘ðZë•.ÖÌÍk­kmDôô¤,\Í"H„E å%Á@m–RËí~ïŒ,7w7aV ÷rž¯ìÊîÊì`‚…µÅ(":ì~H«k«f˺¸ù†·c´ÄA‘í;# Ó‹àÛånṈð0—@31\ï5ŽF.xŸluÍ=šg· )4d¡ý5÷ñLŽnƾÏ]HÔ~w¯ï!t "²6z¶Çhg×öW˜ƒ°nJØ–¹`Þɭ݃À[èá n%g?¯ïÛU–Þí4*Ï]Ù¨¼ ­Rüd‹>šÜ><ØtÑ˾ä}B´ïNsºäcþŽ?ÏÊ%DÀ|«æNÚ”}<å lp-ïÃཻ” þ]”à÷œ›G÷’÷AÆÃxg{h¢¯ÇÒšŽñøÑÒù~ûÈgu´½…Qh¾!kA ìZ¿ïh£3OhÏZÆ>hÌ!ö6äx°øîÜ}¼ÁŸÝîAÔ'”4>5ùñò}àãÒž>–Ç7ịŸÞižxÔ[OíoinñÊæØx¸0÷TÒx¡qH+=Ê!§,Ó[*N¼alæyxhgþíq–}bµ÷´ó¹çaä»ÞóŸãtðï{é}ý?Þ9ûǙġ¦à0~?d@§pÌãyÁϱãÂèC ö™ÇCÅïç½²€ÎÝúvîù6·75¼y¡gÆÞF%Þ™ÄYÛÇ7Å⟴¶ã¡&âïqlÇYÅýÖ×ýLõ?¾ýiü{Lìø§.·}Ô?/;@ß,7ÿ§wýÿ²ƒ„Ÿô<ÜìÍêãáàA‚ˆ¤7ôDÏâ¾i&tw?L¤™'Í}Åu†êlþmZÀ™Œë÷Ìm•§Íº@ÇVà8YwÞ“:ùvI>:á]óÝ8gŒºY%pœ©êr%òFþë|™áÊ8xË—µfÕÛ<Ï,RTK)n.EŠª¤»gâTt*Amè—dÉ% K:$w–…Ñ ŠƒKQaÊÄ †ÖÚ➤v ¢?þá÷×Ëõ?ý—ÿý·¿ùŸ–Åx~ú0•Bۺ,až¿ÍÚº¬ EÍ›°àcßÍÌÓ_/óÚ5šÊ4 Þhmum5) 8"1I´®\„ˆÖûêÏ—‹HQcóˆz¿ÿñ¾hÑï>|Jñ‘™ ±²®Voí¶Ôëjµª#ýܶÚJsUa°ÅêD,r!`’²èZJ)*km…ÌEDµE¸3æiª­±H­UD˜¹¶š‚Qk·×ÛëR+×Ë¥ˆvç;…™Ed™t^°i… o¶k D©hg…&3™yZ­§RÊåZJID;õùTÎ%H„Ý}YÖœ! &Ê™®u7óV޵®Üxš¦Áû¤fVͬY å­9þüù/·—×yÒO?Îeáz½”iÊ9<(Õ=JíÝÓòÔ¸Ã+¸Ä¤Ý8Ùµ"•",Z*EÔðÈíTd!¨u‘O ³Äë¢'–{¢¸oFú~ÂÊÕ«ÿzº‚VÕÞàÔÖ%T§è¥žˆ@1s€U#*Z­¶®Ó…Y ™«ÒÓÓ…ÀërËaÏz»µ×˜çy¾Î3ê™’`8˜¡ê”UmHÕlD×#ý*ioÜDQ˜gÕh4óÜo‰° D¤×C\×òhfÝ1çèÁ“nì…™yDˆœ"“u0Ë®þçýdšJ³)<A¶e­ت"bžæ¢%õúûýNDE•YêºÕÌT¹»Y¸¹–l@éh ÕáÆŽ¡w÷œ¹Q)åùùéþOÿùùÓwªâÍ~ÿÇßùòåOúÓ÷ß¿Öúéùy*EXxBÕµYo5Àå:OSqïe‘ýçîîëºÒ÷îTÕ03÷ér)Z®ó<•Â"nöååå:_ˆè¾,Í|]k‚®bÈ1és–Oß}ʆ˜Z×ñáå<E§ÌëˆH6à©p/¥”Rj­­®ÕLU¦©äµ]×5waÌâìnÜaQ<ͳµæ¡ÖZ3ÁÌS¡j\`áäžu/<˜çY²B aaî#gŠ>4—ì±p¸¹‘[PÐZÍ(.@…0˜:ffÉŠè—+s)*¢ÌÄR¼÷ìÛÄQ2/¾F„¹™["•›YkTY$îAæÞ̈(*k]<Ï3Z "D´¨7³•|$?¬Ñ`ãÏe>_q–4–R&Õj­C]УáA0‹°fÍl]×èsýäN0Ä9º³œeÙ¯0‹J®è<#J–|ö (u§:»y8ÝêjÞ¬Ö°CÝIð–½ÜÔÜ$“¡NAl}Üé ÙZP9eÁ½to_Á÷u)EòdŽt†´Þ:eÁhœ;f2úTlbÁA‰‰½møÀæy‰ÐQ" &Jß~ò¼»‰¼×  WöE¶ ~P½ª`‡ÄXVö•Èi¯ÜñðÛ·ïfÂ>tŠ®ÝâàÁ "Ž­t¢«£MËyÇ!Qàô°:Ei7wöf²Jׯß1/„Ñ;¤¤„WÅY±,€ÔS8=tX VG„µ¶zæäÜÃÆ±D œwÎÍUÛlˆ£Wáö*höÞ᣻Ñ}Îê¢.ÆË˜uI¿Ëøû¥˜š)"Ç›·”·é6’oÀ„Ôè.S¼Œ(6ã|Μöw:ÆWgnÊVM "á0ëo•{ 41ïEoÃ…;„;0p®cD€rÖûÄæ;ìó¸Ï~a]õ NðoåËÒ§‡©Yw\?€ËÝ#Ûœri”÷C'ælïÙ½“}ç­wCÊÁ¥;jTÃFM66[ŠNý ½˜´_@QjwÉyx˜¤Jf±%¥û]&Â=Ï]jú;5ÿ¸¥Þ2›7z ¶¿Eø&:çs4¸§Ï£³º†;Ý,/î?¡·¢÷"ŸN¶Üñ\ýRŒÌ1õïÍËÞ_ï”öÔ®¹ÏȶÄ~>b™·ÖØž^Ù×uÀ³Uñ=¾1¸þ[®‚ÞØ›‡DܡƪqkBŽN|˜„{è–8œÁ83ÐæÐ§ôvÄA®Ä9“3h9ƒåtdÖ¼qÿŽò”8õº^Æ>ºxDÈô™ïööŽãcn?ƈâ'‰8§àè„ÚA±Ã£Oxú7ŸÃ³÷AšÚ\têHü çsÿôoà3É»!œxKÛqÞ»vÏnÛƒ·óøÌÓ‚'»œþ66*Ô`Áu™ïÔ  xŒ}á­ ½;Š7Ñ·Îôó<éŸ>p*·¤G.ÿijóȺÇÏ‘*¿Y8‹Sà¡à­É>~¾^‹_,ïÆÔÓþÈ0aoL§÷Ž ~ži=þ»ÉôñälÿÿKyÇß÷íÿ ~rõ&°^½- Þ¿x,ý0ØãS„#î?6æ(g?0%Gñ1QƒÉÌÝp ž¥©ËÚMº L·ÉBþª-ˆ™f›n²‰,ÊÜþ0Ô=1à™e=<ãHö´ÀxH-ô˜O-îqX@â|k¶â/:µ+ ÷Å‘/ôÚ‹ÃŽq8%²èxÊ $Ø+7ɽµŠ„!’SDcp0)8Ì`÷4hS 7 -ZTAt)¥™‘ÇEk­µÊÌîFDw ƒ*²ÜïrÛÚ¬Jͬ·›¹[m?üðC4ÿÃ÷úþ/ßýúòýÿçe¾|üðüòò:Oe]–ßÿþÿeáišó=$Iž§ççm­©)Wku]ˆtš/Öj`("E T–eùòòÂL__¿&ÜŸy¾Le*S¹^/#Ñb¶xmµµæf‰Kš¦2_fu©Ž)¢"á¥L¥w7´~ÀE¶F÷ø«¸]¯Ï*ÖøHU3u(ó¾ˆrÙì&c¡AIÄØKKi#¹wG‚EŽ÷ÿéØaÓ-͉™KÓç.6Œ9ÍÑ1˜Æ˜qìS¼fîŦ‰‹ß‰ñ»[{p”ú<¯÷þº£g“a‡n¿Ã†78=ø»ŽbïL—8¹þ7Ž !¸ø&· IDATú'ûÃÃbOoupsòÈGU„¹(¸·4`¼¸]Þ ïÑ éœžo0³öäõ1r.èOƒŠ Jð_tjà~À÷7À†¡Þš†‘j#‘m œÍvt^åp/^µ±1JØz+Â8™ãa—‡—wO%zãó•ûièRñÙî;S8£¢{¢)„ yÄJD£´Š»õ 3C=+¹/6ÇtÞ]ò¾Ø»Æ‹bˆP¸ExZøK)ÝÖZØ3 n¤]KÆññeáÌt.àÐùX¶´Êv#‚·‹%Fæ tЄу±yßò 1zz­±ïᓱhDa KìŸÙ¾Õóƒ=v­wŠà¬;îÕÎfý?˜lÛZÔ‡Xé.GŸŸyÞ£Øÿ¥ú vìÇ!RDœë,÷^³Ã«Ù ñ{·ÄÙlï6µnòÍãÙyÒˆwªHñ8éø†:‰xÇ^JÿØzlwâQã<Ê)ÇlÇAÂÿje×¶¶’â}z}(]Þ,û8½åÃÐ1O7¨zÇq¸ï}Õ'µn´ŹQ9AÚ¶ƒC´këG¶õæ‘·%a<ˆ€ØÏÂq>DDïÀ݈†ã¼ÇÚeôEÖáÜ®%IðM§Ä£T‰Sîd›àØNý#3ªÃ8¿Hýÿ©/ü–+>~q,‡€Äù ô¦ú5 y¾.øVØþ»Bô·Ÿ“¿ùeüžx/ïôÎõð3XU§Z>H·$ÀÖõ‘—¡ù¼¾‡Ñ>çÇÓý §á|zvôhmÙØk}eÛ -Ã@½QD½÷^C:a±³ºÝ–Çvi 6nä1oq‡ÿïþxŠÝaš°¾u§ˆ­Oá| ᱓ç0/ÑèÖÔu}mr-Ê QB@X'Nб€DÌÞ"+LU%HÂ̈hmMÌx*ß}÷©\çOO÷—×uY¯e¾¯KDt4˜`ÑISîå~×¢—iÊ"¯4~æŠÊÌçiºÌó_>oKÒ¢JL÷ZsQu[n/÷WwWѵ­¸ãi¾6w÷Vוˆ§§‚NrI¸,ñiûÍà´$ q€—µ• €#¬Ö:M1Ï Ù÷R—ûïÿü§òoÿ÷ï~óÛ2MÕ½¶ÆNNs™§Têk«æÆ" ±ÖÖeçyš îäV›»µá&Ð}½gÐX{‹——›Š™=œ»^D6&iž¥‹OÅÜ)­M¥dX;©&) j,ËZ[[Ã'Õ”ã‰#ÈHˆu¾\>Ì_§ò—?þùuY,EXåéZ”ù¾Þ‚¨ÕÕZ£iâ ‹NDT¤|ýúú•^…ùú»1óu5“;êÚÖÕXPÊ4ƒkk)‰JQ˜{DV‡Í—ùùé Œ\(;…YWÿ×Zk­¹tHòIæ<ÜýÁƒÒ¥va±Ö@TŠø²„y ›«³G³×G£«´¾­¼Çf<²("“ªšû¶Föf¢"¢n~«7ÜÀLÓTž®×R 0F™@zÆÓø'ª/·Wk)X×6ME ©¨Šæ´ §a8È‚˜˜…‹(Àͼz­µ%v@rÆÂBó\""¦)Ü=Ãúáá^¦Ò=YájkhÂJ oá Æ*Ýïîë«yë<#Z„[cé–ó=A†X¸Ei½µ+Ä…»3ÄgTExY›·„/ ªªÌ"ÂôQ„‘±@°yj˜Ý¼f`ñÿq÷vm’Éu¦3óˆÌªnÃYQu±»úÿ?iwŸ•ôècW3 ?*3ÂÝÌtaî‘UÕ8ä#â‚캪²2#<Üóžàéã Ï JêdÑ™ò˜–Lp¨7³~ E¾½µfæÍZöo›{Úà§D—’ºùùÌÝõÆ9&ÌqW&Kj«ALA‘…yÅ®ËÚ¬M r‘QÝkkVµþþzÍRtQÉ8KÞã–c1 ¨fÓ¸YKcù——¯?ýôã———RʇÏfˆ>~ø¸”²®—ÌÇäú¹m[³y˜ÅvßÍÚõzóÊWòÞšqaQÉÎ0_×õùùé¾í¸9Q˜¸™ÀÒË6Ò‚š\o[«ù6/E—eA—&x]úü#ç"ýÖcæR0àÂAa¯8¤ªEò/0Ã…è³À= ÕæcøŸ¢ukcf+Ç^$ +EÅ™a}Ò”Ç6¯ÍÒO„V[3+ZˆÈÍ£Cù™óƒe„¥»k³ÉÓ,ÌTE˜ +!Z˺ ïk5‘ê²ïÛ<˜š¹¨dp àœOQ/0k–¯§q³üöZ£—åè²fqó—û½ÖŠ k·Ûv¦D =rwó®È‹Uu÷D*=ÇP³CB9K)DhÖ²Ð^„½¶mÛ{Ô‰X¥”R²ò×#-ÿ‘·dÎÛ–RDTUSé°Ö@°ìy6Ï̃µÝ%ÄAdÍÝÛà ……¡Ï¢ pX€…<˜;^mìê šSõ|˜vʆ?G»;„…óÕ&îhÆŒg¢·þÎM`6¿Ÿ+Þ¡b@ô'yœUTC­—åÙsæýwãøìwåI Fþ ƒ­7±gS÷a‰³Ñµ,ÓÒ÷a†G8GŒ‚®9žè úgŸ £Ê¡žµY©½·“9†¨˜GýÌ?2F,nŽj^Ûóíù'žùa!È='(¤9¥K½×‰ÌÂÃÜrÁ«r/ÃÃgåðP pöѰÔû#ç}>Á½éyH£[888F—nÂFß$Í·¸{©™ˆ~Ãb{ú9'Ì 3B2ØýqtúŽ9σؒ9â˜é^"qhaŽþM˜Ã)ÌЫ¡'O C˜Í…>&ÏNs2Oz'SÈ@ ‰F€XÑ-Wqû¨qúýàÎÔ‡¦ãvé^r÷ h€a2hçœ#äå|"¤:cjŽJú(Œx²¨É§WzÍ>6&8 D£»ûP»'¡„ƈ9½.n1ûë¼õéŽÅž0ó£éî!B`î¡Å¡œ=X©ÏcÀ·Ií¹o}¾–ö¸-F¸‰{=à àðC«ºZùկΣc`”­Cߨµûùï˜(ðŽl÷L†zg¿öY‡Ç»äö7¯æ¤§¾å{ é ºé³ìŽ,}%~Ÿôü8=%“ùH¹·ÃÞy†FŸ*¶g¦ðÚv×C•_àÏE ?Ⱦ9ȉߦ Îʼ›ñÙ˜NM¹’w~æ©-„Þô_¾ºTßͼæèGüš’ÿ”»ãW´ßxéõ‹ÒðÂr²ÇoКñ›~=ÿü*áÿŸwž5À7 ù7wïÛª¼sâÝ¥§¡á¹ÇÛƒ=£)GŒõ¼ê3÷1>?\­õa ³v¯;ó’Goƒ,ÀÂÊ0´Ö„ˆ C£žèVeN!cPÏ™™aÍÉJE¤Öf­zÇç¥,Oß}ÐE/×+ ›ÌR[/­VUes£æZtß÷ûíFDñûÿ­6o­eU¹y83ÉD2pR2,gÍš™¹»ª~½ÝÜý²\D9I,L£q0EÍœ…U 0·ZÏj)5 (( Ý¢2×{ÖXkYú¾þðRZÁ…%ñ/)ó‚P´°°ZG 4K¹ËÒ£KÕªˆìµ†ùýrG"ûó8Íæšû‹d¨È×—_o/Ë¥¤³j)…@ûÖ¢íÖ¥¾\¿9nnö²¿X«µ™€1Bˆ0ÛÁ(ª4l\ÍêËýöQ¤ €$K›µÜyxÛ{%Ÿ‡vB4àÑ̉ªpÒìá\ÖërûºuS‘7&‚°d!YXm(ªÊD-¡ÆËe‘ë¶ÝÂ6%ˆ@Ap@"1E‘¤ N/ðP¢…“E€=zñ]úør29éƒ0 óHÊxjInnnîI1ƒG„e‚'#îý€~2¨R¯† •! E4¢ë9xP-ª²®—Z[­{^NI'QþµÖæyrT_‡5{y¹½Ü^¾ûøÝï¿ûÝŸ~ÊADÔZsNÀ£ÐÜÍÚ}Û\.k_›ÙÇçg½ß>þ¬¥¬ë" 0¯k™JȾ×?þñÛýn”òoÿöo¿ûø½»¨í­¹1P´äqNJI¥à?þèî˲ô÷Ö,‰=ùݳĕÌ[æwDtY–t /ëN@„…%óI!ªîžgú- ±xš†ò*ÈN³fÜ?ñ¬â¼l0R# 8¹/¤¥_p€È%Õ3éÍyC qoáîh&NfD°™93*œ—ËÓ€}¯{­+À,ªbFÞ¼™ §20_[¸¹5óÞW•͉,¯cOoc„P4"ªÖ^^n-ë²,…!VmXRã-”˲¸û‹µ< æ’¹=Q w«­¨‘µV]¨5†²X&&™Â­ó ˆ¥;I“ƒm­VwvfaÉ¥ûvß¶ípss³ºmÍ̬e£Ã²ä„ ;˳‚&„>zЭUóÔÁ{?$åòœf&’ô™²Â*Ýý-¬÷‡‚˜®Ý=„{­î0K‰‘û#çÀº7 bûÿ‹Þå~2Û ­¿6}ì,'·áÄFv¥œÈè ógÖ'Nßò\$°ß@1Y4£ó䌧’Ì‘x¨ L}Ê#3Y¹5wîÉ\ÎNWhð€Ót´Óäö¤j7éþÉôáÈOá»swÆÖ»šsH ù×óÃ9^ß©ƒ•'asš_“˜`_BGÁS8ž´Ie€¥hýiã]hîÙøÀ¹q/¦Eäd=Â|#»ÑÃf8ÌÓ½{Œ"íź4 ô rôÆš¬Ó%鿤®Fãp<1ÏN‰ƒ‘К˜ÃÂ`½c‚§0,¡‡¥(n>lÓØ€ØàÑš»+óÌ'ÎÂh§qäõ@_/$=(·O$ p2§p'¢`Ubp7MçWŸÍßáªZ¯]8cî;fŠI¤_•žž¢ÌÝf_yú0Ïh9)™‰«Sêœq~гçú,¿Œ–êÑðƒvÿ¼ƒˆ ½­™S„Ê<à1fo-˜d°”ΟuÀ¹Out4Äu½Ü-÷s(½K€a,#;¬"ûH!Ü<Ћo›…gª×dÛö|¦wŸ#~D±#¢ˆWßÕñî÷¾Lf×ZDåÕ0Kzê' áˆúPû‡Ø™ìÐcÄ0dílìÈ 4ˆYd‰û¦µÓàèHà•-9Æ> ñhÆÏ¦@Œåá•(8¿iÎWÒÆ6gÁ:fv F¾#æ8Õ<`âA,;óä°Có |ö¾«âÛÒÿñ"ÞiO—Йf“´ûÚN~ºhÞC9uìˆG•ßäº7ø£Äu´žÄ‰:?álq<Òâ” {PÄ©íot8œ(5“Bö¾Âû|~ÐÒ^ùhð«vï8¢\³ AßJgüro츖FõÒÑuy„÷N“§WcÁãkßuå¿jÒÄI÷¨Á<ç1¦*Ç]ƒoÿ.ø-Šoüéö7Ç_RçýÆïög&þø¿ø?ã·å¿ê¹~-ðNeÊ;|©C©çw‚S¯J)†Ÿ¬#˜Ú³Ä#±Ä§ïtz‘ 3s?a Ã2Ú}Ÿ“áT§èU[Ú6Ði>Ž#)57Ú¹ûéEÇÓŽ5ºÉòhã§™óy{ ý¯êðxõp˜`B¼?V "î1:oSÎÞ‚Wê?‘’‘p&çe‘mã^y ,ë²(@~-êu»Ñ6 ÅÀE8¸¹ÐaY×¢BD~»ou7÷,6Õ6«´Ýf"m½\¾~ý²oÛ…ˆŠ¾,ë27 Ì¼ß·øðjIŸ¦$胜$5 E[ÚþåsEþæ‡ß]–µZ­­™{Qfƶ×(¡eÉZN Ô„º=TC”ÍC\T™H ŠRÊR.ËRtI7¯~÷ÃÏ>´Ööû½îû÷ß}ÿ3ëÞjGœ\$J¾í[òö}»>}üwÿæßS}¹ß¾|ùšU"yÂDx–’,ÅÜÎ"½+äYhpe®f¹ep0Ã]KY/˲¬ŒYáqrÇøüåóóÓÓ÷?ÖÚ@ÕúÙÇ¢°üîûÊï*ûýþóçŸÛVƒ›™©jv +K {¹ÝÓö[TcYZ³O_¾‘Š(kó–Ïa"Š/÷›¹¥û8I0iyvf^/ë¾ï/__êjëÚƒY“{)« ãtˆBYT˜!!ÖÏ1}W_4‚„anû^kke)ÍŒ™/ëêA{ÝVáÂÂæa±W f³°¨Ý5?Žé›™%žÕ½š!Èæî^k%ÆÓÓór½¼|þ¬€àFµ)’”û.0ÒQ›ÇâûýŽ‚BLÕ*ƒ¥ZÝ÷ªás£ÏÉÜj¼·V[3Š`9Äáâá­Ý„sê>õmßö}Ÿá@f^Ÿžn//dÄ݆3Ѝ kîmÏ)Ìb]µŸ×³‘›;6_‚0"Y*‚9ôUp°GX„’Í‚«#RfY¹{5óÖ†%7e Žá7ó«Fw‡“¬µpÃÛÜT:À;Z®º&¢”0tdË¡%Ýá µv¯9³¨<\*eÖ8»÷æbt‚P=s”Li>Ù5kYv©ÌÚ<ç¢oæ6]Ì@ð"¢¶æÍn÷ûývo­ý?ÿùÿ5³ï¾ûþ~»}þüż!I[):„¥(‹0øz]Y‹¦lüÍõ*"ÇÌ`œ¹~¾^ä£Z«Ÿ˜kÝÝãçOŸ<âçÏŸJ)?|Èlm¶ö¹×ÖÖu!+»30Efˆ2#þaVZmÍZ:ÚDµ¬‹Šœ@ öáÎÏn¯þø2·™È!<Ì[k--A$Yâ@¢ƒ«ÖêîžW»°¦§7݆¢Ú­™€ˆg¨»‡yÍŽ]÷È6ïóS5Íomn ‚…{v"Ã! 63Ê:p žž®ë²¼¼¼|ùò5:zN„m©ÚÕÚºm3ιƒ:¹±Â÷hdùºñÈͤZŠ–uYƒ¸y4«DTDŠˆMF E~ºÞ·MU¯—kD4kY±AÄRV^ÝUäsÝÛnù»×ZcÜy>@lCaŽ ‚`·Ê½2JÑuYÀBa*…‚vÛÍìËËËívËš¹Q83çú8| ‘øø¹ 1bàûs,dcö#c5H05‚Ä¥²H, D)f±·:l&Ým:Àáé8æ¾úRçú0583‰»È;è?2tÄÁ#žgû@ÍÏ:ˆÌ©'·"šàþͽt 'ÂÀ0ÏÎO®Sboà^í Ÿ1Ø'Ïb¾\!x?‹óÁËI9k ™‰)ÿVtŸ<‹µ¦Äƹ¿™:„=øñ8Fgì<‘£—ÜÆÉ ÝÓÿ8¼ãCYã Žb\žÁƒ8vë ‰ý9zÁ  ²„p¸Ã"Z)ŠŒ‡Š*f'6ÈÍ;1ªÿën»‡ SUhpâѹ/Ñô2ôÀ‡›ùp&u!î¨/˜:ë4%=H„„…P¸‹L,ËÔø†ñø„Õ¦ƒ–Jãì„33¢ƒ™ºÞÍè'`«Çéä¢çOùð ´ %æ$  N”Yž:—ê8@?2˜”{ß²Ãwo5~è¥iýÝ?óë§»jtŒ÷Ä@)½Nª5ûÆçG#Ne(zè!ºk#æË†ß^£êý-isÆiî…ã¡ÙrKYeu°›p8¹c=æ= 0S§•M¬U¦R’“š±VC•¹õ DŸÛŒÚT9ý45ÉG!óØ;á¼Äå´y×MÂy'¨"”$Â&‘çWÒ vŽwtÖså IÅ´§{ñ`ÖJ‚Or&ëÇÝ:{ y‡ù¼B{ý æòŒ›y]§û&R|\[ç\zrj:j,zÆOI¬ÑJüà™>nÐSíìÎ+££yÏŠóÁññ#&^2oÁ£ÙÝÇ{@:î#ЛÇà¹S…^…à¿É+šÑÉèýfö Q2Þ`PÏôšMzlòx´êãD‹‰xý“èXá_O$~M%{,„|”ÄÏs.œƒv§DÄÛò؈óPïòkÛ|Gcå;Rò1@œà<½+~ŽNƒš ·™‹x[‹(þ"{ÄÛØ7ê>Nó4ÏH½æ5P*~ƒ‰ï lÞèÄ·Tøs.ç•ïÿ7|â×|÷ÿ9~)öðÛ' x¿ûÍtÿŠfÿ”ŸøKþeßm|ûýz÷Ýû¥¶Šx~Ü|šÕ Ž"¥C)wŒ]>†£^Mò00ŸtL0Üú=Õ:k­xn=r3ÿjªü:wBX‡ x†dÃ(˜2=eöî{íž!§qÈÜ>.ÞÑ¿!=pÓžñæ6Äâ#–÷êéôê+ú'£dÎb1o{«W• ;G'ÃÍ"Œñ @hQföfU%f± Ãýëý.¬K ò½î4ÌöÙˆ˜z¨×Ff&"ŸŸ_¾~¹ßï­ÕZõËËËZëzY×åBL N¯tNp¶Bu¤ °–b~ÉaC­õ¾oD´í»èRD„5ÃâE–KYÀ¼W›Ò È=r ^¶h¹µ»®ë¿³æ[»‹ÊBÍÂx~zþAõëýåO?þtûúeÿøñrY:F´as˳Ѳ¬AQ[[ ¸ß^¾¾¼ìûa*r¹¬-%숽Õ'YúÖ•³î”J)û¾»{)Kr1ˆÁ,âADB$+ûýîýTÊ  ™¡H&ëö×Þkš×ˆ™}þô9‚T4•/"£ V#¬9¨hÑ"×ëåNñõE·û½yÔº_ŸŸ/‹¬Ë"f{’×ͪíûæû¾‹‡;\!5ÌÌ›Em{óÆÂeYKøý~/ËòüáyßwkMËò»¾y¹eÑÂÎFnnyŠ·Ð°Þ¤é髯p¬dA€¤ƒÛÝ™$sä¨2‚á"”É äKÉŸ(""EK<š÷;q7wl„Òk­n^–’m«q*‚ËÁ˜7k­Õåûï#âÇr÷û}{¹ÝZÝU˺.ý•Ìå$Ü{LYtYЍæ#1+Ê_n/fÆ\2@žÄÏ_¿¸ùËí¦*"×}ÛŸžž.ëš–ÛýAá.Zè~Û[#¢ëzÑ¥ÄÖ«§Y8ç( Q)’qu)ÂâáfvPÁ—Ëå(ÚÁÔžÑ!çÞÿÜcéÄãDÿÏ$D†!ŠóbæÝ^Úkûºš¬,ª'_¹{m Ä€© µÚD„IÙ[Û°¢G‚ò¹ê=´ÃV–CD´V½§ bä¢YSˆöêÁ,ë²ÜËÆÂ,žð¥é 0Š!kuKë€;ÕZ³À#Õ²–XƒÄ ¢,RT—¥aßïû¾í[ÕÂK)RtQÑès_VðR–Û¶—µê¨›î?ä¢Jµ]. ÕÚ,\U©Ž¿©ª`£Ñ‹ ˆÚÕ‡ü;t]×nìt#£}¿×Vo÷{)š;0í1D²ãš@ÖìÄ2m”†^.Iáî}ÎsƒcŠÜ'¡‹Òº’µ¨jÜAŽL0¥Ác¸ë#A:Dgï-ª3] –l.&äóá°zx£! @â8¿ã Zýt õ²ÃÑ: bÏÔ„Sdƒ§HzôrÏÙcîí¼ ã=æ.5wÏÑ <‘.rö·:Fy/^Ë$Ã?Î ’ÃÛrn%Ì%c@æ IDAT„™<ú ólá–>è´YS²¶cŽ7ÐE·yˆHäš3‰Ð‹y“úvÔŒ®€Á xòþ;Oáw"Òÿá nB•Ž€H –_Ÿ Ó,É‚®•ðð1ÍS‚&nbòKN–æŒ]¸•9ÉpŠ!¬‰ÏÀK@z“º-ªgaÊ223&„f‡Ÿ4æáá™"0ä! rò¨»í{˜aî˜SoEŠ­Ôyß>Nãõ3ÌÒé§MñDº zÆg¼óºˆÜÃ"çÐãÞŸ°’x<ðÎ1M'ÍoÎgÊ-έyƒ gËI8êX«óWä‘“-9æ e#hÖýû8½6ü©x¤©ú x¦›úŧac¿ûÆØ4Æ4kz4ôæ2ƒÞ¿w&N*;p¾~ŽžÓè-&Á"Ã÷Ö¿°™M&.3(™‡;@=ˆ£]ÇG¿igìLrÔÐñGåð±-˜ïXþŽf~v×÷†à4±zh >ó|ö¹8Ũ§?å1fª#b&¼Žµñ(ܶc°3~Jı>=ÈýÇÇð †ÙxŸ”2¾1óãCê·Š_'“6¤ œ%è÷áWöö˜¿=Þ¼–ññõ¾†yAFüŠŠzžpç8žü¯ØRo¦²M°žÃó‡ÆÇ#Iðj,õ>×'•SÅžÃËrzX>2@ïŽR¾­wƃ=ö´¦¾MpЃǾ—p>þäãù œ”¹8ûϯãøUr*§«æÜó}Tõ8³ªè½Á;£‚oúäãµ,ú-4þìlÁ¯€l~«¦üí‡_Ÿü¦×ú¿NàWFoyêø­oþŸñÂþBÌÿà ~ý/⛲ÿ;:5΄ŠQŽp¶þÎ펥16èsmêtùŸâœ]d>½‡‰å¡.Òtœ¡x߬Gä™GÕÛéŒtP^1 …ã_zî€FJŽã\jpyz3Õéz>V3ŒNñµS%{c€ÉÿÁ«ð5DíÄzÿc PòO )Êd­µØµÖZÛ¦j;Zä²è}Û-œ‰DIUˆ%‚?¿¼„à OJäÕÂÜ» £CúŽàps‘HeJ ”E¼W­¹Š—fÍÌ×R€Ø÷º\Væü8rÈ䉼ò`óPð‰ÏÄ'’uUæØêÝÍ÷Ö>}þtß6e1·ËzQ¥Vƒ!®^[ót™«Ê¸záîÖ|Û·„bo;Õ,“¨îÌ|Y«ÖÌ¢YSª·z`žƒ¢{°Î—¢âÖ±¼ã„$ÂNLÂäiuófVÄvPT‡¦pWŠ –,$%‚5b@”¢¨IQŠ(¥`ߘ\…îíâHL³{ ZmtÑÎ#Ìœ;ÄI’Å”Ûaf‘Þ›Å`P³ÖK'Ç©¨Er­c:Í18Õ ºÝoéõlƒ$ ‰d©óA}^µ9Qt ŠìðˆhžçÀNÝeHÄsZàNÛ¶×Úžž®*ÒYÀ¾ïf €°¨HþøºWJNš ˆÓêE†‘KU5÷ZÛåÇAä§(e‰Øj­Ùa²‰î·ûzY×õ²®«»‹p~·bïX|óðE4"Wwáú| PQ‘l@±Í«%æˆH‹²@Xòrs;e!CÚï£j_ó³>Ìs Q€û2žãÜŸ¢@qÑ%zú©ô˜§Y^óª­3ß³íMÓš«™äL'Í–j;„™x-*"è Hsk­™›Œ6°€af Uѵµºï[xh}äG÷_*VÒñĄޑO_av"÷Ý=ÜŒŠ àD£œŠ*Ñ»Ãó ÀZ¸’;ÖR–Kxµ¬f\ŸÖýSýôùÓóósÚ™p¹^‚¢m5Ì(}aqofæ-j†ð2ªÐÈi”"zpr´j÷mKŸ í~¿×OOWÎpDb܃!`°ŒŠÊ£ÈqdnÐÉWNÝ:=ŠZŒì ¡`-²Ar·Šòúf[­ÔÈÂ2ì79ÝÎ$ã Ž¤ió°xtI‡Ó,Ê1µ¢áíw¨ïôn€2”ì¡ïv°í$óÇ„ýŒ=m“ Gþ‚ ° "N:L÷vOõvÖröæ,è¥)ÐÒ˜tÚÀ©'â%ïÐrDŸ„Sç/¥rïÎ"NpOTôò¬˜Å´CéŠonÛò¡ãc‚‰˜d6Ìöï„1ȇrzÁyf î~œÞGÄIâ‰Y&JN¸Î¨ÔüTXyòÊNK%ætôú@ÄDð¡Ü’1ÃG%€Á9-ï²ÅìçLXÇ(P΋ÄÃòÏi²™^~÷®ªæ Ã›Ã°”s†ŽÎ„Ç(O‘ƒ)eÉœ,õǽE,ƒÎ ɸ€Æ Í·õðÛ}À31ðH²bb6,t/Ì®éÈ×™Wù ;£¯TÔ£$ká-­ÝÔG£Ì a郋îsÇaïXùƒ8!aÔ½}Tv¢õ¨ÙíbÇd¿œþk÷¶Ï•Ø÷g\y<ˆÔq ÄÎ=1ého!¼ÇÞqšã„ª ysàt_Ÿ p'¶}Dç¿1¦³ñj®ûÖÊÇÕr&µ¼• ßD_ýk NÙŸˆø%Fý©u÷ô±zÿɳ·“7o#èUåPÜÎÿ)Žk âœôxÓGýmÿòQðÇh{¶ÏäØÂc÷YùlMø5hûë· ïjö>nç¼@ü£œíotïøf&â/(LÿuÌðËŸë·þM¼÷åÿDÑ ü Î~ãuujýÁ›Ïsò?Ïøžx›:cj"âèIN7ÑÄïœö¾tôÉf¤ì>)ä³oê”"ˆHÂswjtô:‰iX…¼#Åô^M|”t«ML ÐCö¶ï¿Oïæðœ³Y§Gý;«æy5¿6?äðÞ$ýí½}ƒ+1´¬‹zY–B•̸[´ +/%—ÛâªR˜W]¬5w' ‹(A‰sqŠ<>³§½ÇÉ@Ú1]ÄcÁ"Šàëåòàž*‡¥Ÿ€poK3³Ûí«í•"ý/=Nnf·û¶ÝoÍLUܨy8÷ŸcÞEsJä 1˜ÙáÙ, ò`•Ä>ø^k~/÷[2 @daéQ¾µæn¨­ý·ÿï¿éßÿû÷ïÿþo^¾ÿéOüùç3ƒº·–^uRÑT÷{k;Àam¯æ÷íÎÜÃòáQ–%ˆ³².kQ' BYŠ{Xk\Š2GÐ^kÛÛÖ¶D-ƒ™¹sŸS¦á w¯{‹ ‹i»éÏi0y„àaµѲÉ(@ó€h‘Uo±E¥ðR´¨Z8‹´Vo·—ýv#º¬Z$‹[×u}zþÈŒÜT¶Öö}ßëÞšýÿá?wdaæ\Їä˜ç\–’vuQ½0ÜÍnáf@™;<ܲH:Ì@Û¾£ëp"wë’„' „~—hš’‡q4TijJ!ÌÜ`$Rr%–·ˆp+ZŠo~ßïû¾{¿0 yPëænÔ¢ªªˆ¬ª?ýüiÑR–•™U54U(YsD¸ßkáû^‰bß÷}¯ZÊZJ~ÞƒlMÆù¼"PXs „t Yöa8ÀÎàÎȃP¢\{éÖròÁ¨ûº›‚ïdì錞gö謣8eâ³É{~d^x8òJb©A>€9ɘltœèÁ)Ï÷ú‚Çåtšø©ëÐ!»+?†"|&!ÏÎ.òºOÄH·öÆÁŽó.†R–'ø,5íIˆ˜ŒâèNÕs6‚™’2' âÜ(œ H¸=&a`hãÙ¡Lm¤ißHíšqtŒc1åpþƒ§¶Ï{£ëùÇß9éHô (u„yDJK1‘¯ü[Ù%p0l:3¹ÑW™ÎéPû…5›†8ƒ;·ƒÒûr:§08‹]nŠ| }ÒNb\w|ç`;äS^ý,¶ TÿÑç¦#u¾ÔÌ^Þ¼r8Y0ãˆÅ Íä VÍŽÜ!ï÷"ËN¾‰9–ÉÁü$J=y‡Ê‰ð°vž’þ>ü"ÁJáÑö-æ[äë5}<˜„) r£åæ<»Ep¢o(Ì3£‘zn&’\Œ^ÉM‡:xÔt ^'ò}Fxrƒp>ÆižÂàÃùq+œºßF¹îaêŠY¤‘%`«/Þ[ †¢Ç˜™¢˜ùE°ŽØ»?7oMÍY=sţ﬘…{ ÷/û°‡Ïfò1³aéŸKþf‰I¤37~šÕã­wµ/¦q\¢Gâè%6K†³°†·ü‹rlfˆˆ! êÓ'BÒ¼¸"pœp=ÀFkFËιR<õçR‰‰Y8{Áãñ¯=ü1è„;~G[ˆIwzg_÷š¾ÍÌ—ÔUœ÷·>|<¨Çñø·Î\cÈ,#?7÷']}„$²n$ëv;š¢1§¨;¸€YsjugÉ_Ùö*ŒÓ NSéèþhT‰Áµ–Nï >¿ÇÉ«< €x ed[Õ ;-¥4»˜þûõ€1G 8Ü׃ Ýöq´L„8w’:âhû"s˜õâ1Ró *Ônînò¤»\2ð”²-™%¸Šˆp‚G³náaR{û¦»#jYô²Ó‹–ãd§¾›Êé^ë¼T„g’aØ=…1& 4æýŽŽ£›ð\&ñ9½þlNŠL‰P¤­ßãÈ;‹º÷Zä‚âX0|HÛùA‹SÀœeXÌ0´O&þ‘ì „ñÞæåÒ1{Ü“ zÞd£#Ï»±ÔýT7Ù Nù¾ñéêB$ˆoä$¢ã—Ε¿#½Áq… "õÙuJ†yÚ%Ÿ¥îÞË9÷Ø«þ»¹þårÂBÕõMôYѵ% EÄùûM]þì©?àM"Ær8§ßxèCÎñp›½™£œO4§‡祣bnX|Þ6ä|ãš i ÷ ]¤\WÛ¾’Ýs£àᬊˆ”…Y¢ˆ’Ûm¿oû=É9ìÂA¢ ¤,ˆ/_¿>±^˲ÝÛ¾Y33Hj‡ÙËÌî{MÌ}€™Ù¾oöÅ–Ë%¦ÛíFD—ç'pºžyä1™!¼òº oÕ‚¢5cNù7ÁÎQ†Št\úùÞÜâîæuoæÍ¨e•ÈL{Åe]o÷{3/bÛÞ ºDÄ}Û붯×Ëïÿ»?ýéÇ?ýüÓÇýï×ë) ݪ»g¢'œ‡¢5{z~úðáãËËe–#!¼”²”…wcS§Þ—€ÒV¸YÛyYÍú˜ÑŠR˜Á –H?Tõ=>D¤Ì1iˆŒ 2kp&¢}ß•±.«°\/ë²ê¶í;³»;¹»nnyNãRÂÑŒ¼º-EŸ®«Š®×µÞZF‘ƒ¸,Ê0þôãÏ_oû²h*[LœÜpIÝepE­Y(1ó¶oÛ¶U7ŒŒ§úß à"læuۯ뺔~\p÷ÖÚRJ6‘½|ýz¿¬—•b½VK)fM˜‹ª²J‘fîÿïüÛ¶ùòyÑEÀ·ÛÍ›==}à"ž.W.ËÕ:N9Ò·œûý¢EMwß!£Ž(û‡—U…™s×ñ‡½í{­P£½Öd,k‘Ö ±_Ã¥Õ݆©¼µ-.w "ïðY.«¸Gk­K§Bì Õ‚V÷mÿdfµšYzµZm«. §V«{p \N˜ÀÂÖ<8"XÃÌ‚.ë æöjN£37‚HÂÃÉÜAµRQso{³EÄÉ=¨2EÀ)˜¸—!—%N‘=«y=‡ˆYš)Ó;Ô¬Wt`n®˜%+úÀÎ$Œäe Z¸{ð‹>§<±ˆÐ°éÎñž¬gws¯­zZx»Ö›Ù×—¯¥”§ëSŽë"fi0‘²„ö°yÏ!õ¹ 3×Z[kÌ|»Ý#ÂÌk­?úÙšÑóós2šÙý~ûãTÖËeMWrgªF';½Cÿ·Zœ&,KÙk]Ö‹ ÷}×ãÜÝ‹²$ëFš½|ùòòý÷ß-æ^D=üº^–Ë%}ñÖì|nÌyD°göKº’Ô^¨î6Àv°@8•î3?aRÃàÂhD­Ö„jÌólž™OwOyŠ}B¶É=)ÀÝÌÍ£™Y˜Ý <ËJ]Š\ÛîaðŽ5a@TyˆS»Y­»·~1¶V•Ç,E`knnnF€Á™àð赇ÖedïKY²í(ëEr`–«"ÅK&Rˆáîâ–:ƒ‰Õj@Nii)Ëõ²¶Úšxñ ¶ºU #£11±ùîæÊ Pó`Õ^qàd ¡°$?E03uDˆðº,á><¿p=jƤö¶wù'"Ç Ì@ˆ,\‚ˆ¤‡ÕNrlÆEˆ"C\Ì’÷iJ+|ò DÌ1Š€§ýZžr2“Å æõ‘Ò#–fˆê¹608Òò âà®uÌv·“ Ïþë„ëb¢W‰Nù5ûxéŒ{ˆ£@:ËÜ6úPƒ0€VÓ; =³M`êF½^j8„£Ó6†ì 6³Öfâ4¯A?¾‡ƒÈ²+âîp g‡· #s# 2rù•þç@7Oº=@16À§Ê… ˆÍ|ÊaLáÇßܥ⳿2ñ‰£Ãƒ>XÛz8aWN2Ž€q€‚„!„“µÝB(8-ê9SŒœ˜áÇtgzH=‘Ê.…È6×ü`ò9˜“ŒL/oh´ˆq]aœ<€CõD¤tr IDATLÈ@àp {»âPàf)AÊÄ4¥Ô›5Qy¡ž:gäå¨î‰±nX?ƒO¯ O >J-Ü1Ðí}&ˆ1C…Y@` ÁzÉ¡’. ÞZ#÷\T%Û›G"3};„ñœ»“9“s¸GÿŸì™ òÄòôAš„¡Â³Nà!Žæê¨É Êä@æ5ºâÖêA­›£S1ˆE²@ ƒ~Nô°1jš ПWõ¶<=ãVœ´æàa§ÈÐYÿ€„etKŸòˆ4;3zs õ Ã‘zжqO‚N6@Ì¡skRЭî½ „çœcH®~€ÆH,-z,kTn í˜S¼è`¶Q»sÇ^{œ±'9¯KÒªãèŽfÏ(¬òãˆÃõÚNýFÇ+Ä´Ù‚æêDŸ â謘Ĥ¹³Âø'^éòoµ¤ÄÍ1λ¯1úÎô*Ñ6ÆH>Îã"ƛǩòUv`|wį(`ñQ‡ñèÏÿ¦ž÷4?Äx°s÷O0WVPÒÏC>ÁÁd[ ktÃ<®Åt ½œÛ…íàöð_†w=ñ‹oàD/áü"âÍ›Áù,èý)Þý ð:vǼÞðyçJ>Ç:^}¯xœ|kï)Ò8iûß&¼¼Šœ† 3•òª9ŸEÿ@¥÷ |ÿ&Ëö_£÷>þÁi…¿.Ýÿq$õð©ÿ#~‹¿®Z…_£°hß^MÀœ NFþ8Ö,œæ¬ ¦Ç"™9ˆé êQ©M}Lþ ‘yTLÇR 8xNòN”×Y©^ uª'g¼eôHîFdÔÇÆ»§ìWœ» ÀÒ¥ÃÕ?|æI†=6C¯óDüöÑ6‚Ü*ÿÜ÷ZkuW…¨”•Ý›Ppdœ˜š9+X@p£àì¦cŽp3wKœeˆTò¸ßoO—'åž&‚ o¬ˆ¤}ä¾µÚª[0³ŠªjoU5 Âû¾ pßî̼¬K”¢\˜Ù"!i FJ@¢±è²·=7E’£˜ó paM¯¨™SPkd[ݘ€1Wqk ÈÍ.g8$•È8àÃÝ ^[M¸Š*£p)º|þùóÿ¿ÿ¯ëò$e]Z³²–Ëå*Â*jn"²‘çgUMÓ}×®<ˆˆ%áþ"KŸ“0#96 ÜNRBo$ààƒŽµpY×5·–%#ÖÞ:æaÍ}`ž¾ÖRÒNEDa¾íUUÁ´í›YmF1sKˤËrjk¢!àRX ˜o÷í~ß{‡™‚RoÒ¥T«íVSJ£è'Öz1˜=¢Z «Ÿ>sQÙöêá`ì¾×VAXD<âr¹¤ÕED˜¨wÕŽR‡u]î÷íÓÏ?§]¨µÀÍÚ^[„3k&ÖR–eU."nõæ¡e‰ ëõÚözßïí^u)ÏÚ±k<еV-ËZ­û¾Q^ÏE5(+7=ˆ›µÖìÓË×}ÛÌ,ÖÕÒÉ›€‘§ëý~k­í÷j^K)BšRg2â-2¾ iOc¢¢ªÊÉš7³fÍÌTÔše„z»o÷ðõraQšÕf­Ÿó™¼Na©O2)}bÞ´ˆU&wCÛvçh€L”ÎÌ8åv6›-,›pƒS3q703K¦Û»ß,²…”©yªqE8Ì#ÜÂGÅ,ÒS˜;kA¸°{ß…¦_Ÿ¶msNuP¥ë(4`@çÈš{/ïmÖjkÖÌ[?Z¹{y´ð”ï[kO×§”øi„ŸD´¨235jdäØÚV[#"7Ë.ÄQ­•™·m7³OŸ?Y³õ²&¿%Y@ëeýøñüŒûz(¼,KÖ·žØqã¥è÷ßÿ ,-¹g8ühDôt½Šè^÷eYÂ)»8k«æ!Â[Ý™ÙÜê¶':%iEªE‹dÞ(iT ®>‡w °µ:};½}´ ˆ•eo5³£g4:ŸŒ€ŒñWÛ²\y¨æXšP Úø ú™Üì¡gAÑ?ì€`„áó1q½,¥¬|¹µZ-²f,Â’FòRºQó°…›9³ºGkƒ^T -?_x¸¹³AzÏ-…‡…ƒ ¬™u>9 "E—³f³Ä;Œ6Û™q¹^JYêÿdïÝ›$Ùd¿x™UÝ3sÈ}™ôý¿™$³{¥½ËÃ3ÓÝU™@„ëÈêž9.¹+3‘k\>fº«ò x¸ÿ¼–ºW’¸ TDÖuHÇõzaæe]Xxß771‹Kw„nµÔ½–eAReBÊ9‰˜¹1ÈÉ¥]]m‚¥"Ñ6ѬsCð–Á]ʧǼéî}02í"ƒõ ³D0 ®œ±°q€=ŒsI’F9³•B$KÊ´Dø{Ì[BfÕ0™QhsG­bl³Lâ“ДOá6<:AŒw[Ó Qµ¯o¦E<; ¼õF»ìbÞ0>wÒXD“àthNMò’VvÜwÊä±j zÕy¢ÖL½OkbRtrCƒ˜& 'EG´ÂÞ†zlîc¡p45†öËCX{#g`.)œlsM ŒÉ¬iÅa䇿ŒO¸;{:áºÆ©=`8–Gï3IÐ<•ÙÂçËäƒ Í] g¥ö(H‘‡'¡Å3Áç¯âv4êz+­áèŠ] #xL½åýÀôd3 µ®…~m»G¾¤jÈZ«i|§ñj½ú Ò´Ÿˆ®õææCoÿ<]'ê…48R¯`‹óÝs("½e çbÚÏ åXÐpãìþàjq°þØïVtV‰6f&í÷)çLŽ0ëFÂñj0Áa–à<0†6:›¹fa…{+mµ¨a²Èg ˜«÷ͨ!ø©egÐ…4}6€jaUÈTŠ„ ³Pàh£$2ðxÍ6F™·ê‚®/ñ`âɰ½ä,¼ò¤·ŸY±­û·‰Úà7sߘŽðZÓ]ƒDf«w[a¦zLNó^QŽEÆ,©§'¤¡mÚ5êDÔHšcEÑCÜ÷ºÇ·ës ¾JˆðØ{²ï ²ß‘‡˜À'gþÉÒݳY#sÏàY¤'ô4Lš¯=œèC=Øu*îãÿr¼CcœÓy’<ËâkÖ7oàÓgà‡Ž‡÷ÊxŸÓÌ xžçÓ Gnʮð²ŸHç¨ÁwìÚx8¡…M{opü|zø4¤¤¸|xÇù#%®S%z>oØJ»§ß{Âo8ãÑ;1pRÅŽHÜämòµÌ”<5õü6¿ø5¹>‘äï‡fBÓÃcL¢ø¬-bÝ#bò[ bþèáá!óÐä¤ó˜6ð#¦èq ðhxçÎ?>ï ‘âG|üÉÖò‡ÔfüÍçüý1þ.¿íÿþ=_äÿ»åȤPâ Ããã\á1½Qâ™áL:MóÌ@ZTª-™E}`câí%ûxÐíNÍçý0ÏÁÙäù[k‹P5·4ô¾øcf>9úeJp³ä·ù…SÛ)¼‚‰G†ê=/¬¥=£q€§Ȥ`͹Ðïç…Žª±RJ­ß8%À¯ÕP‹¨Ñš„D™÷ZÉMØ#“/ŽZŒY…ÓX‡Á-ëE’TÏõ²¾mÅñ¦¢ʪœXYÐ-iAY5¯MéVM½•7Ü‘³õ~»_.!&§5eNR̼”Ð|SC¹YÑä‰VºÝîß¾½\ÖµsÀ}³ê!4» ©Á¢ÙRD“rNjîf‹Êb©¶qÙw˲¸»0ï¥8ðÓúåÓUöt¿mûý¶‡½åþ_ÿ3åü´^táoK^–uMª‹¨»åe‘$Ë"Ÿž?¿Ý_oÛÍ¢Ñ*©äe —yYõ²\ܼí½Ý”YRR%f½j_ȪÊÈ7'MÌìæ"¬¢Ï×kÀ[½™5ÁN“²Q­ÆLNîfѯvßïÍ?…ÆdPQY³Þ¶›‹äeæeY¢S!- ÌÕ­O5\XX%2hÇSÆZ jâ’nÛví;·Ýê}ÛT%%Õ¶yd8 kâ$I]ŠíÕŒˆDtY„œÝÈ"²¨­ ÜÞÞ¬V‡ç´Ô&c%wÊIÂh¯š¯*"P^Í÷â벨Ð~¿{¥.KN‹ G)'v¡2±‚˜Å»úmd fÍÙÌ*Q­5Æ]f•!õ‹¬‹>Ù5é².ùér\U«{µ*̼^^_ï_ùJ„ëÓåËçŸ|Šî6<ð ß„UÖˆ–œ7 DÉJ)û’×u]UNëe%,n† æöííåËó€$±Õh€;)HÖ¤LªZAª œ`n‰$çL ýþ„#V![_Òº0²Èž.ëyö`PƒiÊÙcÔÉþ [XÃÖ µð»2QÙmØÏ™ÈÝÒv*G’ ]^D0ñí±É’Hà3$‰#”ªŠnêgµ¢¢’–Rwì1pÃáL2w«f`1r‚UËiI,ÞÝaÅʶm¥–È$y5ZÐèV+ˆJ)ëºþë¿þkÜòÿñ—Ÿ—œŸž®Ë²K0Án·Û¾—¸–˜y]—”Ò²,OOODäæo··RÊA{€ÿüן?ú}¶D4l}\ÊšöZj ˆ¬0óËËkÒ´^Ö”R­¥Ö ¼¥”®—«¶ÞצsQkÁˆ G‹k`1×ÔàØÖˆ¬ùQÓnr@Q†hÄ@±ýºó>y¼š½OÑ#äACú¼1“¹×R#z•L‘é™L*Êìˆ7"w¿o÷OOÏë²À÷û¶õ7fr¡ÆDÉÜÜ=%]×eß÷½ѤժožR6³¤*ª Ò”’öÄ•˜EÄk­1s¢ã½ uî"ª¢"9/µÐÎÌJš5Õœ˜ñåË—ëõ²—boVk‰îxeIŸž®‘oc´‚L‡›yX"-jàVŒ1ç‚:DÒJ¯ŒŒ“ŠHùv\<ÈÒ^9ÕȽ"*%ÈÚ¿1s·×40XÁ_”æô–îÄoÚÁáâ7YR4Ú5|»D$œÐš€/#ÄJI¤•é‘Dµ²D}*{+õížMq’c§/MèêݳcØålšHè³PÐXB2,uqAưóÁjØ >86»Guo«åíª‘ã´=m×n¸ºSÕ¨yYÂâ¾Ó®Wf£8½‹]?è3èöç8œî^Ýue,!U‹(ƒÕ âiì}iŽ >¬M‰²š`c&4Öqh=“­’[VfD$ŽÉÀ-<4,N÷> éÛn>jZœS® 4¦pÿ0‘Æ/å¬7Íê {´–>xqp„†šïQà {J«¥î©C}wîu©§:Íf`¦øTr<*øŒú\As<·òYéÚ­ŠP¬ä Å27*`–v›vrD¥ó¸†Ý¢¦ß£Ž²ýy2£ž‚–ÑâÒµ`4 ¡Ñ9½ÜªÅ™á$Ò×IA’ @6ˆà1Œuò>âðó ¼|ǤLûi²pG¸ø,nÆ<Èy.ªn¡†½f÷>-¤1úpwƒ™›³¨’ƒ4¶²æ-ÆAGKB$YÛÁÚ…iRmwRD `Ö¢<­â˜pÞ¯_ODNÐö°µŸ4_>L'ý(%i ÏÜY’¢}ˈ¤T2Æóë(i–,þ ðrV;»}\TÑ «5å1)Å!܃ "Þ 2ÚD™y‚é´6‰ØÌð·ÞIÊ8¦)Ü'»ýYxâÆüámÆ0wOè|á“Sj¤CØòmuã$÷Ç!?Ôsþ@&}˜KrÃL0Ñll¢Ù›îxm5Õï¾âƒŒãÌ:— x<›‡ý¿!”ñŽxð}ß5¦w^ÊG\“.ý¼'ÂЙhs6™cþc€yôâÇžäÀøëÇ tæ0ðÇ‚éq¾0MJxŠr`®¾ úƒ³5AœæsÍòÜ}€i¶3›ðl ŽÞíkÍ»J^z¿’áï˜ÑOÂiøÂ^Œ)‰©Ýf’ðñA&çrÞïkØG…»?Æø`Èð0aÁ‡z>¿y˜Oôÿ5?V£ ýñûmjí÷ßtÿA#|GaÇßë·}ü‚ú1‚‡ÛÏýÏøØÿíü{ÿÞu Œÿ7d"œ+Ì(àXäK{†¹“hVÊÛÚ_‚a •‡õÝÀcÉA¦Cb˜@ÌM‘à£$ÎiÄø(³i8Ù£&JÞ¹ˆTÈœZ©0õ]Ì@®Ê©wžN±‘~{ÐÆ'¦=#¿yËôÀŸ[‚ÏïÏñ>]þHÌêæVö§jÕfYºŸ¡ý Yµ “»¡lBô¶\.¾V±´j¢§§¼íf±þfmXEPz  Ñ­ì·ý^­’PjNj•¬£cjÓÖ²Ó²±Çã„™U8'-UJuƒ…´}{¹‰HN‰ˆvB-Uµ,)(g0XEEÓº,—uYSzÛ6oîB`dÕê¶—,úòöf¥äe öÌ·¯ß®×§?}¢bõÛëíÛׯYóçOÏ—õO··[dºÓ’V¡”³• ]÷Ûþ’—üéù9¥@ÏïªSŠÛ¶yØéú|ȉr~2kM‚ëá`¼¤°Jy[*Ç=ÄÙKuF·ç€ÄAT«(eWM$`‘ÀYÇšÛ€ _Eá7£Úñ² s1ÊåTsJ—Ki6ß /)ÝÞHdl/ÅQ¯×kÎjÑÆ¢9˜jŠÝopfší‰‰fÅá¬*™×5]ÖôúöF𜒮KpEŠïÍ IDîI…Y”½ú!Á«C„òóÙnÆ×ËÂBü ¡SÁ+³C¨I "'¹¬?ÕRAVÍ÷º7:­(¡m¹ñ\8z c~Ô)°½ÜܤÃÃ`ÎÀT7«H7ù0ÀUøéú$"ÕÌ ]^lûMA¥oV«»¥”™DS»àá°ZÃÐgn1qL¢/e¯f1Š([ùúíÛ×Ë%ç³I'Ü· î)·›zß¶jµî%:~ÝýÓ§çûç¹^.·ûýÛëËe}ûüùSX¹Íâ 2"ZלRn=ä)2[1p³"ÂA؇Eý°ÕZo··” Pû¢q³¸ƒÈªÛ¾•××—ûv'â”ÚRÂu]/OOC1 E°ÔÇT5§,‹xŸÂVQ¢˜÷Jw£ ¿sNÏÞº&Cµ)àAˆùº™‡G4^ð‰µÖf­­µÄs¯A‡@½õ]ƒãïf½¤†O–ÓZ[IÀ^ªÕÊÂk^Tˆj­d¤¬ËB>¬B œ1§”j©ªž{10›™J+ KœâN陚ÿÝÝÜe‰®E2ó¸øNºH‰Zû6§”XÔaQóZ¬–²›×æ‡o»© ƒELf‘1h?ЫÎ"¢ÚÎX“2󅨨4 — Ì9'wE{  аª)0]",”ŒÊ! Q*Óˆ¯…jøˆàH7¯ƒ°ÈqPJÑæÉ>|ÅÌAïÁ(@«>Η_©BRMÌ¢¬Ô#Í hËnuOhî`Öˆßɉ›öHG×,Ïûì°ÌèðPÎ,¾Td,º-t&p¾Û.Åïóž‹öxwÞN$çÉ8'c{ÜÜ2ðˆ1ƒÀ Í†¢½º’àÃ{ˆ pbíÔ²~€X!L’á$ÍÎÌdM¿Œ:D&kÃê÷†Ä>MÁÉ*Èã‡Ç8Ž#!Û?t›Ûö’ÏœÔÿÙäz@˜ᣥx¸Á „|Y$VßêL^­©=•ºhoéÜï˜Pc0ãáU+Dˆ„¸½Èަ ÚÄ’{Z&Nœ€Û–ºí“¸Åˆ›†O‰¥w«½ªä`í`—1nia’§Š3q"ò9¯-2E?<4]é’¿¹óaKmçÆ{') gADÄJ XhÀáÞyvt–;Ü­”püh´EÂKX$žá°¡H»ý4ï45w6ffÖ†sÏm<†¤õáŽÛ­ÏïGSºJRåÞÑRq³€_MŠî2n6®–’©5*ˆ)ºˆãóÓ\GÎýÁÂΤmO;YJ[Ñûaæ —0ÊônYþ-Œ;û¤9z»F»÷Ýò8B"âî3Tù0.N óTqÚ?R¬½¢qaê‰Æ'NÈäÞ˜Zf¹ò­=:ev¦ÇCZ8è¸-m;F }«,3Âh@…ù$øEâJ´å•¥gIR|1ø€Z¢¿´žÃˆwôwǸ‹ÆPî<¹9ÔI_î·ÛY>î-z'\8·D+åŽÈ,åŽJÁ6=U2FôÓ¢ŒŽù_±²å¾ÏׯåÇab;|¬‹ñÇ6ã£ø£QȬ-óÄ3>«òor>q¿pÒ÷º‚2^²8L&ÌTçxp¨é$gÇ­Žv±œ5O¦N(˜Ý¬Gs‹ò#Afî-þHÕã¥{ªfþî%ƒ÷®þãÜ|,ÌŸùplœ–]|ä/¤Iuü~Þ'Öß‹"ð˜æ|ðõø]ÈcªùxÚ‡¬üCÑ›á£ÿê á ¹ÇwñOßyPý'~ÓÐÏø;æø]’|ò¶ÙÂAÅGÇæK÷ûà”Õ[J¬Ó܈ò‡ëôL¤÷1ü%ˆÞ’ÉWÏá(}¬•çæ/Q}WŒSF»:iÛ­ð¨T£Q<7 L™ 4ìÝãt}ŠfµØñ î&Ç:#p¡ÍÊçwE""«{y¹‘z¶BAÞ–Èœš gnÝn±€4·°N²Óvß‘­T­»›c½^.KN"Ë’¶Í«Øì qCëòÓõ""ò„×_øåë‹Ì ÊOÏŸòš¯×ë%™e¯{UR!.{¹\ŸÌÝ¢™–˜Ý}wx5"2r"RÎÕ«Wª¥Þé.OO¡æx5v”~¾TEXRJaîŽYµû¶Sìøˆ˜h/wwl÷û¶ïf–D>=].9ß¶{býôô|¹^?=]ÍŒ€Ûëíåíõ²^”e(‹&ênµ"ìëZѬ—DX—ESªÇW^RqRÍ’{¬$èʡ셉ƒŽàNÚ²ç“U.¨Þš{Áîìákv÷@¬Æ`*«^RÆÌüz»ïûN@J¢’ë}sMOUÅÃèDPÑ5“ˆ,)ƒ©Ts±ÄB"²Y4e=]Ö§§§²m þv{5§t@ˆIER­bV“¦¨ç K¸ª& ‰sÒ{3,¬="ÊJJ sbÑE‰©Â+Õ¶…3к¬_>?™{&ÆšSN¹’H“^Ÿ®L\JyÝ·í¾ÝöÛëÛ« ]ŸŸ—”¾~ýåõv[Ö+‰ÓÆ™ž¨75XO='•†¤j[”R„˜XY£Çµq%jˆµ˜·æRTóuQf]–å_þíß~ùë_CN9iÇ»C@µÚdšF’`3kýœðeY4)RÊ)%7wqUíÜèàEÀ«‹jÊT–$ ,'ïz÷T9¨fªÑÆ«î€9”I@•ˆœ«Uv$]sÊI’Á¹îŪhàÈ!¢î]™ÒMjyöÃÜëNDšR·—¸»Cî`mR”5§°†æ4Öá)-yÉLtÛ¶ŠêX‡“ˆ×P̺¢Ó›9šüRr_ât'I›Q«ÛvY0þk­Û}{y}I9/ËÒ©îͶOD)å”òçÏŸ¿}ûW;€uÉ`~¹½•}'¢ú§?ÞÇÌÌÛ,sÑá"Pêbµš{­ÅÌò’×eÝöm¯ð–””@o·WsËyyÂ¥ÓÀ»Ý$h¤¤RÒRêýV`Vj­µÜ¶-„þ¤i ˆpq'óœT—ÿ“ªjNÉŒ™kôiÁ¢bU“àÝcªߎUàýHà 'p­0¢ XJj‚´›Ûvó¨éO–&@.5رâÄûÐ̤ËI{ijJ‰%çS‡}ß·}ßËVʽ'‰(/9P6n>Š«YL°ÌâÚŽV[g‚ï{1WqWMëzÉËâʵÖ*½{4<1™p+¢R«íµº«JÜ"|»ÝE$ÐüíH‚4i^aÑ0ôZ êžV¸[OA2³ÕšòÂ,IG×KÀ®m ­Y q¹ªª°‚Ì©T«5¦w‡é7>r R×ò…z‡óT4¨ª’$ÔjI’J­:mÙÝŽVCo4 ‡¶ÄPEHsÖ$d“΢ÇèAé EŒ6€Gso“zǯtŸã ¤ì¤jä|L»×v`™ã(7›BtR„ݺËÊíÞ…¯>„µ«b -7”}>(„aÿ†4›.‰£øZ£p{ E›4dLp,<›Ç$^hÌBL„Ç'dJG1—9¤) NÎ,h¾­èWhˆxGO)´CúŠV&ž°GsjÿwÐH³µðàšÓ8ôÊLô!ØÉdmE$pŠbw&¨tHUZ¨#6>ÒŸÞiuÓL̰ 3dĦ[§j«„Ž·%z1ƒ4K½pƒòÇI‘Þ·Í`øÑÆŒÁµú×Иû»Ôˆ'iœŒ€@ò€obñ–rÖ”ˆYÌ㦚yhµîƒ’7vãfÞ;eÚeÅ|tI|ZÀÃØéƒŸð.x2ýlþUËöyTþ5 ýo ü‘¿øî¼>D-ø÷tø›ø·}”÷<õ‡kéï ‡ã*7Ðò;oþááùþÿÁóþ°6œÔà ë¢üìôëOÝpSôb¶éÊ 9>ØËÓ]RÎG¶m$Ž;0Ì-}IŒj¤£B]Ž6ß1ÌäS@çÉè”ås| G7@ð΀½#hÚ«Òß³ U«#ÇTÄ3wp¿ó§Vá.Òó8ÊG×1ïMdn»•·›d¤D9¥Z¡¹ZÖ”ó"¨ g UKœ0"†{Ùl¿?A–ÐꉘjP>{–+öøM9¯yYSND{Ùÿúõ[À‹—´ÜÊæ wxµºß °Ýî·ûó§ÏN,"DP½›Šv!=%UUI)=?} ²¾À‹4Æë|ª»”²Y'Öêû¶¹ûårÑà6¸Øö½ì;‹,ë¢"·û¦Ì×Ëòt]sÎBÂJë’k­@_‚j5ÀÎÊ—ë%åL«%öcÑtºæ”óRk±ê&žDø*Iš%¶mÉÛ'¯µ9DatÓµ°8¹ÁáTkq ¥°–»ÌœRRUe‹·²¬imÜaÎ`r\×t3¯…„%ôA77«9/ªÚ4÷Ëun«žD³ÊîAY)–Ý|7 LD1â©'¿®W­µV3«^¥¦œÂ¤I€Rô6´ÑB­ÑbAÐ6bJI”x+åõí†ÑRÕRjt ë’¯×ËOŸžÿãÛ/ùå]–|ß÷}Û¾½½¹»¨þïÿö¿=?_ÍLÀÿãÿYoÿçÿ¡9=¾îû2e­n;ˆk3| ¨ºyIIY¥/பKÎ¥3»oû²d"‰ £FÍh«K ‹ ×bÅ«ÕZ+¹ˆšù¿üÓ¿l墽–ëzáZ Ì4¡WÓÆê"âq´/—KNªª{)æ.f¡•½lÛÖðY)¹#ÔØÆW娓;¹¶48«W®µÜïØkII‰€ûÎpi[ea2,z µbY†•ºÇþŸ˜K)æ^áØö”MòóâÆ@Ç9ì¬!ñtÔZ4¿±¹Wó6Û…±Z[…0D5³ÔRš^ï–5YWÿÝ*‹DÝÝx:„¢š¢<<©URѰå£SJ…ÓecÉ‹»U÷}ß#ü¡ª`‘œ…ˆ>þüç/?Y5I5úÌ«ÌÍܯë%åTö½¸»5IwåRÎM§Ë¢¢Õr褒ä’T5mûÎeb•0}7a†¡ª¦Hóˆp ‡˜9ÔdbÚJq‚meÛKè Kt‹‹6Ý™UW"Úk‰D¡i`Çâß,9產S2ZLÆ€jÞ(=lŸ&a¢Yû#éP-û¶o¥Öm+ª""û¶p¹\T“0-ëÂ=1×j"*½Äá(t‡hÇÏ KJÜF˺qNDQãA½¶·/¼‹'²P G¡IsN¹=Ö­¯ØÝï÷*,9å”TDjµjvßnÕv‘l^ͪ´£*î¥õ(šù;"¬ëúü|þ R7QÍIU™p'<ïfMFE©ñ$¬! ³ïû’³ˆ¢1ü,¬¡Öfrð”'°Q%Yë^î:Nïuh¾ÙZåL÷µ2QÒæ‰K9/ùRÊVjeUq |‘]¨nÜþ"YD’æ6=VI’X$¥â7²öµ Îaa Pàù³¥s%¥[„‰9Ç¿ U§º»! lõÿ[ïSÀÍZk¬N;¨iýÝoÒìˆ8ÅÝäìý~mƒ{EÑÀyc02G 7ü7qO „Ickp+B°oƒ g‰¢t²ˆI1ˆ(1I«‘¢’K“¬IœY„5ޝQÁCæ›Â¯Õ¿Â$Ç­Ä1Ìðƒj Œw}øœ ?A›Ûqã£k€™È»@ÁŽ8>î]©ŠótOJÂTㆼPf´•¶’ §0Ó•<¢M°(QÑäÒÞÝ´Û,Æà&kEX<ñŽœ­Úp&J¤*,Y@ ,U#­0`›4 »KCü5b¶¡³2C™9 ä` ƒÑ"ÔA¹Õ.·žºtVou8[¤{­q´Ç2‘÷ŠfLbüÁC%UN)^͹½†@n- C_ö±ÇuÇPêçpÜ€PÀ‚fìþœ8ši»æ;B›0¿s>b*Þè—S1éSÒ£–ÅÁräüzmÏ}˪Oºi Àg×,±ßàËó»Mì¬Ôú.®G~ ®QÏñò>‡Ž£G'æþ£R?¹Åù}2—¾3ŸÿR7aœ©$Ãj×¥gÏ~oŠ9V93{çðtàœÉl5˜Ìg{ÇÃ\¡ÊÓeÃü}ùxÿ?óƒb+ÜCMôP´óè4q}ø;¸ |Gµ;Œq‚Úäú#«wk?ª¥DºûgiÊõñæw:öÃôêä>ÆÁm+LÂcDðèõE“˜†m8Éô> Eônþr®©ä1[<;íç#>ONßöC5óážÂÁ§ÆyPv M> Xó¿~¿øÜþƒïKÒÓOÀ¯)°?Ò‡'ÊÇù#ý €ß¡Ïþ†?<žÃ4?ø‹xüÀ‡ò1>úr9>’Ôÿ8Ÿ&aëïäà'ÿobû§™ýß’³Ëÿ„ú™ÞÝM:§‘¹–î2:Ë„dHí“GhzqµôõñËd05i&¼iæ HåÑlûòð®jhJž§ÃÓ÷Ï ÈiÇEö:°>ИûÇ&(Yl§¤‹YG=ò sò1ípÐ\WLcšßg˜§Ñè4ÞÆƒµÄ›{1âÄÑ­çÎÖ,"Yu©Vààæ¨jФ%§Rʾï—%Ç1¶Z‰IC©òBùÄ`¦Z`fž«ž.—²—$"9ƒ¨Ôêpa4÷ÍeYc›ø%g ïyÀ¾Y4%"Ò3 o3'-EŸŸŸ–´”º¡X CdN9çœ$ãêQ‡^ókÛ^+DÍ Y5&zzzÊ)½½Ý^¾½Þôž—œ—o²b{”SJ|¥ív¯faÚ‘ /º|ùò9~~‡²*œ!kRaªµ¼½½].—Ëõ’%íµÄªÁY¹#ÈÈû^¢6ö*K¸.ãd\Eò%1¯ÖÚƒ­…\"‘_ÆE½V+{©{©Þݸ˒úm%'K)ûÛíu¯æÕ@ø¬‰‰oÛFDr‘¤P.u+f$\­í»ÜÜ«[Rݬ³JŠ*W®&¢î~Ûn{){)¥Ú².IZ®§V 9ò²(úž‰›‘“´Õ¤ÅÔ×e)¨ÂO*ûݶm‹2ÖívÛö Bëzæ}ÛÖuùó—/FøëËK±ò?þýß_ooO×§œó¢i]ן>NI·}_–å_íŸ_^_–%]òÅÝJµbFñL6·è©&¢$².)%(%©f±Z–\ê²m›»ïÅ’Ž'ˆØŽÄa€bݬÎ)”DI¨²±ðe½nûNN¢’4±YiG¾ YI‡?nY–œsˆrjr»ßK)V«°`f˺,šà®)/ «•DH$‰8“º²DøpÑîÅÍc"mKIJÑ §J,¤Ìñx+¼ÓVîîFpsâVu+";‘ôØ6G+•ˆ©8Ü}IÙ»/À^K †Qf1¡Ooµ¢zkâ KW3†#2Aç0 zD0‰„úßR]ÕÖëÌQ¯ÑÈJä»ùNµ¹û™EØ€eÍ,k’ä³Ì!­VaUµjÿë/ÙË~½^áÈ9Å{½$÷ºí¥Z1·½”Zk±rÑK5óRTu]–”sè¤ÄœrN,¼s‡ù§ë“_®{)o¯/‰¦E$ ¹¨np¯fõ~ÏËbf·½ô¶d¿\.IõéÓ'fòê¢"*n^ʇ¹Û§š»Û¾íeßE”™5E@öR™9«JÊI…ÁÑ~Ì"Á%s8 f£`8àP•žý3uš ›ù,Rfýëe lD³ó‡×U9i²¨¿ë“ù`G0Á9ò‚ªj” ˆ$Õ”â@Ò¶m¯ooÏOOÜ àž–œTÑF°Þã ^KÝö=úâðuÉ)¥ÀçGL'¼ùÍÅ䈾–ÆŽ`pE#³h]Tâh¢†‡®ƒáRj¨+V3Š)NjiJAo–ä&,‘ ! TÓÌ}Uû¼«>|¦í¶n¹>!`$IdæM mZ¿$ð(„p'r–”Y"HIó’S”¸‹ ‹$=\ÿqãT3"ä”rÎѦÎíа’Ä‹D3kÓÄ#-Ä¢,Úr‹ÀˆÃ:ÇG •™$xå›Áƒ‹Æj¡¨Ãæ’vàšú²m6LG,/‚š«önLuë{“±1¯0„D1 à“Ý­†œxD>»ÀÓäAì>[n¹UqŽùCèˆB D•¤ˆ  Ììâ ²èa|äΤÝY‡×‡ Ýִæ퓌KþÝdÅÎôTUS‚#iŠ÷NRma—ø“] —:¡ŽJj­ó€¸ÿ RÙxwP§]áø3ƒ#66H9çeYòºp‰´A+bÑ~jd¨«5åc–@Sñ¶’7#8NŠÓÁ56ÚÙöOûþYeúÄ}ËG M6R<1Ãp'ã^D0I‡º=ÙÁé h”™½WºÛTB_Z½0÷ŒéØ ÷öòJ‘1ŽÂ(X/ŽIàf*‘qR)ïOpdý/²÷ŸÐauÇ ò$2wXÜÔ°ÚPE·ü(š¤ÿÙ2?«–3Ë8X‡¤æœDèÕÅýT0ñkæÚŒ¾&>'³B2ªF cˆÅvÏÜê!~Ô :?…¡CKÿHç ¥ŒGsý¹2ê$þž€È`¼ç«|¬>¸Ý ú®öüqÁ'0ó#ó‰Ž\Çiq"YÐã·z7'xw`ºLvþ“³nÓÛóƵò—!‰™;AGÅÄá^è¦Óƒ˜Ã菉ǂè·7™~1)ÿ˜“Î_ütBÿÀ6ý>fp ¼“¤ñÿñoð‡¾òyR1ÏÈð±I?à5mþnÃ/þvQöwɶàÇàÑ~òt§à;!?yȼWùÿët~7¬b¦ÿÿæÖΗØéùÌ?š€`R´‡‹z­½kÛàþìê'jô§Žue‚“èÃ9ë ž¦Î]ï¢à €Æ€{IÙ°LÊá_šß¾3VôäöDZli¦)§ÐBïµ¶~&ð¨Cy_ÜÒ–Íäs‘ðC+˜ß æO¸‚ ÐZ#ˆW*¼‘RáVJ1â37ä , OYÍ,ü¶2vt!ø¶º´Ñ"â´G±à|ßYê^°m÷mÛöýz¹‘ÁbÍíµjJÌ’.kìâ«Õ·û+ÉaS^%'ÑRm+{­{Tð™YÖü|¹|}uÕBPï­IÓ’² ×ZÍaìD¼ÕRJ•”Tô鲆aÄÝï÷[²%ç§ëEEwó××WÛ¶Ïé³ö^éМâÐ() Ã:„×*ArJY³¹ª‡kÔÀ¾oÈp`IJDßnßʶ™ûº.ÁyH) .`åßï÷í~_ÖµšeI‡Єė´äœ‰èv»½î[)aF¾TÌœ\8¼êffÛ¾Ã=¥´®«ª——[ýóçÏ—œ^_¿ýÇ_~†c]ºÝîN(û~¹^rÊÕFÉ9í{½ï%üPÌœ93SXË•è)_DÕ`ÂÓue^_ßîî»™å”RÊ,Žíq±ˆ¶âáÛbŠ*é ¶09g*d¨bѧë5¨²4'³Z=«¯†¯ë5¥”S^RþúõÛívcV}Ö§õ²,Ëóõrß7»y)õºV"úÓO?ýüó_¿¾~#BÝ­Üïwwm½Ô"¸ ƒÃ̉)$°P$ë’R[id 8ÞPU&ªã,ŠP­9/)…æHË’Ýüßÿýÿ6÷Z¬¹b[óóÓæ t‹ð¾ï÷m+¥”º[­ðΪ͠¢wÜDž\|]×ÀšÔR–eIÄšs¯ζmÕÉIÌ,)Ò(¨b‚co’ªJF¿Ý^7éÒ~+Ú„j ŠJj Q0 Ä‚E¡îžºÈëî”8“ÆžßilŠ›¥Í(²6Á4ä–g8)s`M<†jÝlͪ<$nä1 %æÄ¢*æT¶{­!«5¥´älÆ)ée½¦¤Õ D—uÍyq÷RËíövºûv‘Ÿ¾|¹,ë××7w÷”Ì÷RKÙ;LÈrN‘'‰Œ¿¹íµ„S2efâ}ßï­GARJ¥ÖbuÉyaÞ÷à>ÅÐØÝaµ˜»E|x}y±èZw'¢þ§Jªª)„²h(ãUÚ( äp»ï•RS²^.Ëšr²j9‘›•ZR1wsß÷=åÄÌ*º¤¼ùîp7é‚y%ʪBÔ§èÓ[ cnÏN@JYUs^¢í@EÏùÞ.'€˜RZȪ°+µÖ`üD#©6”‚ê*¯ (Þ©š½¼¼ªêårÌIY˜ƒò}¯‘!s÷R*„/šDÊË’òZ·;;£ ‘\ª;(X¶ﵶºæR67cws/{©fû^˜iÉKRu+ußw f·Ð¾ïÒ‰4ašdf3kð¤)K*^$‘›€W7ƒq<öU%ÞLB¬m ÈT0½7yó)Ð Šuì÷ƒw^xÐ#Dj8ßæÌwÂßÉŽ>*›2A³7¾Ï£§õÜ91é˜øîpŠñP+ýqÿï¯*Ó )cô˜yaþ5( ÿ†[éo°Þã·þ½wS”¿Éÿ¡ÖÿáÝÌäyÿËÿ¼y?Œñ;Ggïýá?~Û×}_­ñ`»y˜"t2'ów`B±itPáæjw"m”8±ömÜ€Û8‘D¶µGÞÍÁ¥mGu܃ܣ飅ªÇ`»õÇ'A—Ž4VÁwHo­b‚;©ÑtœFÍ÷/Õß?fÔ†N(¥ãÓÎ1,>˜Cé¦ï»SŠíÃ7"'+u§ru–´ö²oJPŽ¢Nªµ–*Áܨ#CE•ÐзN¾.‹æÌL QÑØ(‚Œ,š6ác²žB-^Íj¬Wͺ÷‰‰3«æ«¾~}5Øó§ÏÄìð×·›¤´æõº.Ŭì58¹Nh23樵‘0+“1«j Û°ê*™“ˆ˜U‡—º{yèªzY/Ê\wƒ›9"9(Øñ•®—À×o_>¸˜)e!±ljFµÖº0‹Us77Óœ‰h¯»™™y…›G:‚J5UË9 Ë’×ú¹lÛæfe/qÖ½':÷æ…Y/köœSÕ±„è¾E°ï¥-h„î÷ f03{õ¶ÜNªÂÌÄ![×ZrÎnp÷oooDúòúO‡£â¯?ÿ,ªëº\—uI*K^×UUJ©/oo÷{qXìóUÕ{Ù=ôY½»\@È9?_®îu[yOæpÕ6Ñ nw©&Ý–-»!X›¹°Ä¯Õ¢² !YôÓó@oî˺Þ^^ärÑ”ÖeQ•ýóŸ~yyýë_¿¾¾¼íÛ¾¬Ë?ÿóŸ¯×çØMï¥ì{À7üí¾ÕZŸŸŸ_ooß^¾ éõz‘ÀJ0‹HR æ©f"ßRJøÚBCO™Éj3èƒÖc8š6L$7w_–•E„ÅAÖÚ2B脉ßï÷·—·û¾1ñ’s5s÷?ÿùO$Ú2ëmlf‚ט=¸Ea/‡:Ó# ô€Ä AÆÝâ•wJàj©µRb¦¤)*J-­¬R4S‡ÇÙ£Ö‚“v"&‹»W³ÛÛ=%!‘¤æV·}ûúË/%Þy,ÁoFT’í¾3‰hN+7KIã03Bn qÙÝÝ£ ÂáÊ ¢²ƒm÷¨ñß„Ù<²"^j½o}þ$×™(¥(+«³“†Ýº·%·u…7Û. å¬i¹^‚6Ƈ‡˜™Ìjü–nfqI‰Eï?–ÖfWN”õöTqçÂÜ)Èj´õôNi‡ãZ(¥»©­ ]Úÿ(µÆ½%éÜ$^ЙĶ*"Ï€öÖuêIDª‰éG¦¨ÁúûdÝ{DrHªh¦„©Ã¬oâzÕ £½¼‘÷D”Rj­azèÓ,¨êº.fVk‹ŽQ3òÓ쎳ÆñßÌvŠÃ>?zæU¥'ÿÐ_TH‹88™á^Œ¶v?<­ÒøøÊãÍ×KÔé!ëSoF×:P IDATöv¼ AV¤³ øHÐǯeÏ«¹5ø¼ýGÁsþB̈<˜DØi¦ócë=úCõä îc<<ªÿ³ß×KñA•ß Ld®S"ç,3(Aaš/‡|ƒšßûßlÖIÇ™µÿ£`ni¦‰ÿ@‡‘O>9™âõ\³À|1â>ówÀ-ü{´Ë¹vå|õý (çžNÊiж ã|æð+¢&?;ø{:9ÆäôýþXœ#goý™³Æ÷Ÿ¡þOÇý]¿rýÍ–ûßó%ñwILë¥ïþ|üWHÿÿ=ìÿì{ãáÉñˆ‘#ÎóŸÇAäïÝ`C`8Ï;·>_ |?¶?‰{Ö£«ñ‚ódã‡N îiF€cÀÉS\ |b|ù”µŠU‹G.a‡[änòí?%p«¨“ó(ìÔ3ÏÂÀûr ÌྱÄåÇG8?–¼LÇ"-ëÂ{©Õ`æd¨änÕ«z‚+ß­Æ6MÚ $œ4]–•I¼:ؽÑk¹-<½­Õb{›ˆ! GÙvßî%½îÑgÛ-AÒ¢ *^üOúéùzýåíõëË €¤’Sr¸¡n&öáþƒõ̹Aˆ+Üj ¶¾{­{Ë ¹0ï^™iÍKNº,*,¶íR^–QVÖÜVQýt}"¢½ÔÞ*ÈÊêšr5Ñôíë/¥–°Þî÷RkX¼cþ$¢`‘Y³23ËO_¾ìûjšYˆ¢¦¤D””-*^‰UXEs’ÄŒý—‰ª²˜™“‡LY’j)µT‹Y‡ ³@Úí– .DTJa&¿oÛ×oßlÛ–Sfæí¾™×}ß.—‹¨Üöˆž”åzI,®ú´®V<¦oã%êJœsŠj×hu å,š_–¬ªÛ¾1³ [ëÜ&v¸Jvxt_D®ÄN æ}/,¬"JêÎV÷¸6“¦j5~Q/¥|~zªfîøùõåç_¾þ¯ÿøKÙ¶ëåúéùÓSº\Öå¶íµ”R™‰ª€·z/e¾\—Ëú˼‘ûÓóõóåùér¹Á¨ºÓš´•Z &æÆ¥ ®<9 è0k™cNBÊM˜é¼ó~ßËhvkÕçÏOþµÖ|Y."f–rÖÐÿ´i(­ï”(¥üüE×}‰l3a/ÌL ÅЫÜËÏ¥üù§ŸrJ’ô²>—ûÛ’UÈ\ VŠ“H"áDI5Ãì™XDÊ^BÅj8ØêÚ&‹^8% ‰¸ØØY5]Lxc‚×ÇKYIµ Å}=-!Šp¿òps‚A„U´Ujv_X»›k´)j’ÄÊ÷ûFmL’RÌÓTS©5zà`N\lr÷jT‹¥¤ûm³j¼ï’®9ç?ýôüütY/ÕjJùùzÙͲjç[Ù«YJyYW¥Ö×——Ûý¾—ýóÓ3‹Tkÿp«fÆ"Õܼy$EµÀDD“ªæœsy½ßê¾íûGιÕïåÛËËëëk)…™ÝlY×eYªëæÌœ—…‰$/ë²^.+5Ä3—Ràm.*2±îZ¡ƒº=TEt‘5¥¼í›÷íÎûÝÌCÊ_—5GÑé^ŠÕZkI)Sou~³íÈ;˜ºOc<Ðkô³ö£Xí¢ñÊIGW*qÊX­1–€Rjα€`ˆz4 ;J- ½\Ö”’{Nšîûæð”ŠÙÌE%§Ä,ñM=G‚PÅѰ¼Þ$w4‰o]—”ôíí‚U»ã%D«Hîp·m7³ѪjRqX´Dq ¹“„Ë^D•nž˜˜“daoKŒêF`«»U«ÕÆJ>rWá5JȈdŽ[&•ã‚ð´†ÖF½ êõ¼C]ê¢"GfË!‡}”ÖDÜ$å&B9'IYÔ12³j5úÐKTy]/"\ke’áþfvy5J}Íèø°†:SN<:ødl²ç>Ïn!à\i±ôV0Ù+‚ǪÌG¯Tˆ:©÷Û"dåðÖ7C>umê^ Q›­5ËIü½A, {r'òy·ÕÞ¶ï"¼,èá¹& ô¡ð½ÇmåÍ\‚#KÌ Œá m¡€öL®ñ‹°³j[¤M›F»ñݼ•xµU3ŸL½­ê+úuárn í &œœ iR$Æ[º7zýwâ—6–Î`2¹0AE%1sRá¤Ôèó†÷øá4‘Ãi䛜k¦œé~‹ ³·væu6ð§CËÑÜÂ7³*±€ü0Øòh=Ú‰·3.Î>U Æ©~!÷´ ‰îŒ hY Y#}®Úã¶Nd“]F"š<@4Ámèˇ¾þ޹`âÎ+ïŽ{žõÙF'ÿL‘îÙŸpjàþœsŽhט%1Ñ”rûñÙzÐáRø3½[̲ŒWÌñÕÂHDÔŠEú°!. 'w3êÁ–ÚG4^¥íaÓ³râÅ9Ñc"ÒÞߢ*Å™ô~bcÒrªÙëÞÿ1؇Eû°ÜÛÚj¼.iÔ `n΀“2K<ñÆx‰Ïšø°‚S·v®9 `>Î"{_ öÃÔêF[ïðØM (­üy̤‰eïóC¶Mˆá)áßjôFÿ¡ñø|¨cù42.‡$0õФ²c|a`rú·m†11¥úë Ÿ“U¸=ããDóÁ±ÁQÍsÔL|WOŽíÈW°¥ãî-ˆG~ãѦͼùCPŸåW>‰ö«NGò¤O< '~Ÿ&ÅÓŒƒÁߌô˜Ú¢gÚÌüuëu€<éñEþ±gx§C>þ¹ùÿ'ð»_÷Ùƒc+ícÁ3½!ŒaûùèB8Dö¼N)s@à=955¬t„``oPÛkØ÷™ÄH4z:îx¹¹qg,Ø­áIçVƒ 4`ß™õa-¦z>YYòUqŸ%Äcp@ð{lž™àŸ IœŠëßáß 'ÞñŽÓTùˆ@–ÎòVõ¾ÝVŽV!f®P¤¤Á„™Z_VŸ5ÿ.Ki»¥æžš Tó0/,‚dY@‡ˆÖr‘×Û-©”Ñ cÉERÄ^”YÖõtR¿–MHNËz¯ÛV<»Ò%ì ,È(Ð4Aw#B$´»m[E¨+.ÈPmS`bD¢OO'F.ËÏ÷ëËëëv»!óëZV^Ê9·m°J9ÓòËׯ×ëõz¾œÖ¥!>‡mGc)åîÛý~Ok6ºÖŠfZÖU¨ $ÔÁÃïªÈDX€šª~³PUaଞí·Eso¯ ÃÌ€¡QUú^Wøù—_àr912"S3µ°¦ZaÛ*bÜn·Ûõ•X˜dYWS5Ww)Â…ï·;Àõ¶e­¥p²ñ; ‚'àóù,̉xʧÚöüú*"j „çóyÞ¬2 “pxuÏNE÷0¤&$í9¡+Üt;—u-EÍ)‚²24ö„8q"ÝáùõuÛ¶û¶ýüõËׯ_×åt¹]¾üòëó—ç?ýåÏ—ËÓçOŸÌ½‡ÑqÛ#cÔâ ¸”%ãäQéž6·´c›X^VDÊiY1ìV“kO”‰«"ÍwÆPR‡'aÊ-ô}ÛÜ‚¢¹Ì0šN,‚¸¹ò—'s·vMÄÝ“—{ª[Uˆ(ç¥Q“ͺ0§&"BÄÌH5¬™“z·Í#œºƒÏÜ­ïE‰³O UýØdi³¹c·&¬ 9ûRÑ ¸ÿŸÿñ¸®ËiY=¢° ’[›ü1ñZ"¶Û´êëíz»Ý2gÃ.jv½^·ºQxlU‰IU«ÖìN9£íF‘Ëå²”"Ë¢ 7_ñÔ}‹T(w¤)ŸBDjµÙn9ÏJ§žY)ÅÝ×u=-KJ?æeY’¯þÆì¥Ì©}ñ°7zé‚›]¯¯½í–Ÿ.—”Æê¾ÝÝ}q¯¦IþY¤ô§  †pJM²ÜÕÿ}`¦îQU…¹”’±œÌwÜýªæ±ß‘!Ó ].q"r󪦺‰q@–‚HµZK"\D1Ó]N@ˆ$ ˆx¿ëØt¹¦)Â;¬ÚͪÞMîÄ“Ѱ¹`xçÇ(ÄÉÄÔz˜rî€Ñ:!ÃDL7À-àÕܼ™§À€À¬qïoïÑ*Úk';R¨­çÝ[S1LÀþ¶|DjÅé˜{€f?üZ/gêMÕÀ=ƒ0t·É&»+Aí‚AHH,„”6‰6‹Mã9'—„±‘à!W6ªJfp¿%ÍÆÃ[‹xî7ZN!zÉÞqÜåžpoím^Ø8\aaj›‚R´ÅCVeä§K0`÷D‡êÄhX¼hU(x°î²$K-ÇXÑÝWÌyOŸ$´,+j<«Á Êã<û>Ò Þ¯Ûœäè|Åu ó{æ\Ã3Ã7ŒÛ³„=h?COÛuÍ}ô‘ø„[I~§…Ìùÿɲ×ì°5øþ˜5k<ŒOÞ‘´#8'ù^Žuî‡x'8vë1z\¦‹ûˆ“M^Áˆ÷\ÿq°Ï„ìH¹„tJÉÀ‚M#Ú˜<ûÓY¼ÿÆ®±N¿ð`iJ5]Z D'8= âcM죡À„œÆ‡RÙGÕû@ÇéF‡«Ö0‰û;öê&ÏQK3«•ø6Þº{OßÖ+Àršf £¹f¼ü€Êñ†ÊóXb:Æ|ìk½ ÇŽß|ÆÆ›»‚që?äïà‡ßî\Ë ÇüÇþÿúZá›ó÷žuöÀûFð[Çhü–¿1ù ]8Þ? §µÎ{úûw*Í@ýŸ _ßøÌ¾ñyÁ¢ÿSùßõøtL|ð-âÌÔhà!ø4#£…‚ñ½K~”±3Œè ¤Ž²žÙk™®÷gbU  Ün›¬ I& –•e)Ì” @` BÄ"‹ºÞQÍ”R>¶îH¥XMà …˜¸H E…Õ±ÞïªZDi:™¸”Â"jZµ2Ái]D¤oOZ_$NAc `b^Ï'dD„Â/~5w«•åDm} … “¹Ý¶[­ÕÂO²æý´”¥U5w @¢ÏŸžþñó/ÿåçŸ~ø\¸df™À‚N§K@œÏçe]U«ˆH[2ÿ{ÀT«2/Kñ¶F‹Öɶ® _o·eYÖóš1ÜâG‹ LR–‰f§e¶ÁExáBÀ‹”í^á¼®E–Á¶ÍAuß\ï·Û˶N "žN粬Eof"åtZ™ÙÁÜ1Àn[õ[ÓB+35GwG0çtZŠ™ 6]·;|ù /§e)e‘çWb>­KDÀmËÇG¢tŒfQ¶_.Ë¢ªÛ¶,뺔²¼×íîŽÙ>ìáfÛ¶ÑårAÀ—ççÿüûߪê_þüçOç§OŸ>g>`Ø%×uYÖes#"ýúìhEÖuYþúÓÿ9~x¹^ÿóÿU "Zh:ãP€„!bKñýš q@ 1€s4BŽsö’#y zbaD _Hˆ0 ç`ÒAÈŸ.—èéóg"z}~1³×ëkƒþ÷}~æëǦ›¿XD `(Zˆhf\$ÜïÕ¸!º‡0{£-dpŠÜ ƒM'Aôðºi˜šAƒ{™C`–HDJ!ÿrZ±­õnjæáV]ÓBhHˆŽÄ @Âã5s#öïN(âÔFÝÜ™Pòj jXd=¯K8lZ¡á®#£÷t¿·n5Biºƒ·+iƺÔðˆØºÁʺüåOYDt«~9_ÁÜî·Û/—Óét>Ý·ûßþñ5cft÷ZA ™ÝœÑUU·*,D$Âææá·ë)cL¦µ>]žÊº\N+³”R„ˆŠÈWÓÖŒ")QäˆÄ{ÏôAì¶5oc+¢Ρ’°dwExÜîwbfÊ]t|zzB«Z]Õü`Ó‹15i€ èµÆ°H‰5n·«G¢¥,jŠNPë¦n¯¯¯ëº6¶r¼_ôTü;t£A–÷ö0iFkÿ–Dî$’  5æåz85¶@ÛG! ï„b$"Ï]n3ã"m÷ÍÌïÛˆ(/âDVÕÃUMÈÈLݽ”EUG;]Í!ˆ(Ü«nIÿ73J¢`)².«7nD'ƒ·ÎPÌ#YÎæ L©Ž F7G'E/ßu$µµ '"¦ÈB»Ü´Ö2qy_”XÓßšÈËD€A¸¬ˆR$ñÛ®>ê™ó=z ‘p§ )„²t!{ÝÑÄxh¥Zo9Ïxˆ`¦¤4µ""¡ë B F λÂ^囿nH.6VLt¨~.òp$öÛ’m<üÞ\&ŒÄ)0A×Q»Å´cþ-gK-dÑ Cõ' u{¤y&(¬+ j7à7툞L5CYÂtÒw":·)àƒ¼2ˆ½Å1‚€“ÔŽ?KØ£Ëf–‚|Ò=0í¥H˜>å±AòŽ,~Ê|ôºÞœY·ëRRÜÛé8<¬cCûA žpþÀMîç´_›Ìõc69Nõ])*áîsœT”2¢¿ˆè¦ VÕ1uÏ•¢ÆhuÏ,#`äª&Ô†ÚšÖó¼°ÓÐ×úP O–ö¹ç÷mÕÞlÁá€(+g-!µ3+«;̮ߔö¢Ö÷;&~{­:åÓqžS½Š8Qe¹ Îà]tç{D¸©„™#„÷ µÌôŒ‚ݬkq%fï-0!hr‰’k îøížë¬ûVCØ‘ú ç@ ìêdK—v½²¡W³B@õv»©jÚ fUgÄPî+q$Çv•¼»«*wu¾• t|Õ¸XdpMdS/WØ¥öÖ—6ºÜ'á8ßÝTA0\£peL/rìf­&½Iè Û•Â÷ïÌÙ¬^™à³½=/Zn;믤8±X¾Œò 16×É$ D¼Á»Ä#{%¡e9ÆÎ=÷C–wðÈ‹¶yPc1õ§ËsÆc¯ïmÇ{ožqßá»c~Ú ú`ú¸2—êó€¤|iTŒD¿°L ÜÍúc^ïaÇýÃŸÇ =}†ýFÑÜ€>TÚf¼†^ Ü/_é–À6±n],;Õ*šL|è¸Ø±_2ìçéäðÈ÷ûlßS f(<º¹§$Å4…ùÀþ¡ŠöÑÀ=îpTbpFÅàÀåt<êõ_ìÇ1ÄgÚG${ÇQÙõ£ú¿‡ƳÏïiò†c€Çqdtü"&ÔÆ QLúoµ¹ÇÚÈÉ Ž“ ¾ dæC'fwý Ûû›qúø"s¿SKmë,œS@Sð÷Se¿Ôà7¦CøÑ¡ïŒŽÁ€=HôñØâ]ÿƒ“ß½¿%Ìÿö¿šç0‡|ËÇÏïM¾=søM O|ƒÀßñÅï˜áÿõ#wôœÔÀIi|£dÿaxÎãÁ÷;Û þe†øûÿøîÇOÓ8üøU&ÈãBœBè :7·Ó¸ˆwgt½häÁ'„Ðl‚É]A7´{K'àqZ~ë~+¡ã¹’Ñ<Ì%G‹¡C¶ñ.¦¡qSŒcú§Õ¼ÆXbF12Ùùï Di¾Ð|†OD8xÌDPa 1{U%Y°oâè´®")Ä/à5U±èIZ‹P wÇ`¢Â̸·Í̽œÖu-K 'D‘/fRÊyYJIã~Ï¡C2Íñ|>»[UEÄu)„Qµ2qa6h…Š9ùIö\BFDf@w‡lجOk¸[Õü*é}«—u=ŸÏîñõúòúúBa‚,Ì >aâ­ÖoaK‰E–õtúÇ?þ!"?|b!iV>ÀÔ@ØÊúéÓù|Û¶ö›à€`áä)½X¸V%²3Îûv±SX Ÿ__ á"ŒŒNAˆj®æÔxIè vÀ&vk5³k)ÛçO_¾|µª°®v½[®G™ jÕëõZïÛõõEÖó*"¹DD9 ÿéÇײ8Àëvýõ×/ªVJ¹\ÎuÓͶ[XK™ô…¹û×—×¥,iªªµ‚C‘Mkâh‰ÔCÒv„”7ôá@‰ˆtsÀRzá)É"—§sX|y~ ws ˆBlî¯×«Öºm[†Áµn/×Düé§ŸN§óŸú·êÌL׋ë²|~úħþö÷ÿúòåëå|®Z_·Í܅؋ܮװº®kÖ ¨©º-RLõ~ßj­©œƒ©‘§B@jŽ ˆLÂ,î®U‰8ãäi823UsÏæìÂh Á(,¥ÿðùói=™Ùí~ûúõ+q)¥Ö‰O§Ó¨Ènª±ˆ0‡ûR åÞØ,Cív½ —E I¸5E°o×s¶i˜EÇu«f îáÍmÜ\’ („ \ÔÔ#!sS"ªZëmã",¥íˆˆ¨@¨¢LÁÁ,Hu'ê"!»'½‰9YÀ€ËRy -ˆÈ!(Úî[ݰ@ ‹H8z^˜ˆÎbó@U5Ë«œ›‘ð“¬9GäÂVMU“ÍEn×WÓŠ„àªË²<]žÎç˧§Of¦áªí\Û´ g}q˜k_sz«ªEÊŸ~ú‘¹°pÃah º)‚Cvc6xG„3›Vˆ ¤qÉÍGró/çKÞk¹Hkµµ,! ¤höV¨Ú¦Gæ¶Ýîjë².¥ÌFÎÁF`æ¼b ˆ˜Ûý~?Î)R €þôô)ïˆXJIQ&­ùû°ÚÖxjù˜Y¢Ø]”xj5Å”®ð‘†O½%܃=œºÍŽ˜÷vUw#¢\QѲ,÷m3SwËó——µ rtiò/j5áPb@7ó(ÂfjC[Ê ¼g‰E.@ˆÜ Š”ð6ü FiÜ Ç$w-KÉ粦@@d&–‘Ò­Û=){1ÜÜÁL ’Ç×<ØžnCL;<= <ܼ÷f‡»Z¾ßL™x ¨‘f>™ÞÜZɬ‡·öàdúÑa‡yH¤‘~ØÔ1Üí¶mL¼fN­j‘ÌŠpfLù €„-‘pÉ|ÁȳƑ&Ëz†á 0I‡0Õº1š|„³ïÌÚdŸSÖÃ¥;a'ÇïÊ¡­ï5 É-à•Út[ªFx'Ô`Ò Úšÿ»=uxð¹ógœ¦—,MPFïÆÞD0º›å½¢·¹ §ÒÙèíÀ™Àõa£æêS£Lc4g~@:xµ€…[éщ~œVõVКƒ}ªl²bO½v…a2eŽ"teú<¤scd4¢/Ë3¯AN¡Þ•‰ˆ1Zå x„Cx@!†®» {u(] ±äUºË€ÛVûb¼y¥!ÙŽéû޽E'Îu/€Ž?!ŒVˆÂm²ÁLÄHfÁV«f¤€(_tzN–ou™hÈwy;0'`_›{»6W €ª…;aX›Ð3¢ˆŒáÂãôÇ̈‰Dw$kUÆi?Ic´D b2ÝpJÀäņ]šl‰È­GÞå»b;õÇø¶m³ þ`ðƒì5ããEÕZÍ,‚P–¥csLß§R#‡ú?;0¦¦ÖÈ!N#ºÁP:Ä"p*!€1ˆ!G 1zà¯#Ò‹á§ & IDAT³071ù:Ý2]éy÷ðFß—EB"9êõý2ÖÆ?CË­)=8hôÍ.á‘H Q!>3ñ³s#áè\û‰½CSiD†'ZÒh`ú§QË,2 >tB»±ö²’ïÁbïzòOGѨ{ϩޔ Ø7Ú¸§=81.SОm7×çÎovJ¾‘Tö'š$•؃ ûÑ7¼ê;r9-aÊ™¼¯®Nd­ýˆUÎ=9±·Dy]Sã-¼i“= .âiËïüæ~>¿ašÀ¸£¼M4_ ×ö,jïßà ö;Í3çÉø0@~‡áG[xDÌC„d×éF3ÔêÍ”ßñáK7Px_xxâø€¾óžê¢ûÙŒxûƒø]ðýCõþæã88Œ4bT‡Î螇F…}¦±k“‡<þ¦«» ð7Ú£÷ù[öø=’/¾Å˼ýÛc +LÏoq‰Þ L¾‰4zË·ù&Oÿqn‚6t¼kØGʇ÷Œå¿Y˜~2>Püÿ°ÿߟ±xóñ_ 8~ß›|7é‚oÜú8þ)ö‹CS¬[Ùä‚xÄÁˆàМfÔ×GSö÷Xâ4µÝkS3?ÇŠö—ÔÓTÈ¢ö[ÀmÚÖT8¢^Ø•þ)”0v2™`Åé3ÜïQ;‚µ‘iûdºÖÏ·ã¾ÔÝ{_FÈ!_3£ `P˜N 7Ç,•]NKùúüŒµÖ"ÂL°–%Ìnª¾mµUÜÒ7Fâ;ÜÜÜ%]ÕpZVf)ÂêLœ¦cµü(Ì<ÑOfŽLÕlÛ6AÄËåRŠÖš9‰Óº.ËÒÀMúlHáì~ˆÄ³çl¦ñ¸#ˆ0L¯//øt&ˆ´H»ù^’æáàfèà·×ûý¾e›èétJlxˈ±hUZd †ˆí¾U·dŽ#2¢y Óp¹º"Uwrk @k,ëÆ6͆º,÷f÷ðä\ÕZŒ‰´¡ ]¶›5u¬Ås΋Ä;d ±}‘Jas'"îò´3«Ùº,îîjnáM|¥”ªªª1SéÞöT J)h¦³‚;W Ü-ÏÊžlŪ“ÁÜÁ܃×E˜WbŽÕz»]Kb!dbrÀ„ž¥›7ñªš×ËÌgœ·{Í™n_·ÌNôW¡û͉ÐÃ12?”Ã`4ˆ b&*kaw¯êafjŽæ6ÂÙ/šo±A f ±ùaóUå‰OœÕÖ®æ©XšYç\'ÌÆ’¢ÈÄ$f7·äw–pΤÎ>”§åL,î^·×—ûVk•Rа¹o÷­›é[~%&œïnHv–Ð1=Èí+ÅÖ¨‹H;"ÁЙÈs¯F„À„DÍ—×Üt4|Ã9¶ƒ½Ž1­&Dí\HvÐ dgܤ_èpÀþ{ái íƒ(3|þ»lлßFucîíÇa–—*ŸL(2¶eØ:„zÇ«Ç$'ì0À€~õêYÊÞáæ*mÆφƒF$j×è1˜$‹F{"³Ÿ,rI—bzZcµÀ‚÷äÖi49ïòh‚34 =.xcVr¾†}AÑÙÿÇ865Ðv†ˆÝÂÜ«ÕÞ ˆtrkOç9lmlQ–"%…ý&V:v›-uJªa™è¶ÿ]&ÄFIå¾³¥rvD`Jý<‘’1)$tõ0#"?8l£‰÷¢auòpÄ·¾<@õy0ÕPË‹34óþ9gHêyóÌÇì—`h9ª´ê÷à¹ó¶ghhå 7.ëؾɺZœìíGh;UÚ¦Ô¿ Õ X”àÄ\á¯ëJœĶ“ñÉן¯ñåû=4Ž×³ó ^qý³ø*7žÔ Mé)Ëy$B®ÙÀ¼­nÆn3S•}EÓMòò“ëí¬Z¦åvˆe¢¥]\q7EÆ# &8ý€G8çÕlp÷}Ö­a·À·?$Bs” $†fþŽ€Ý‡×>:q—ÉéÔB0ƒGÎ4ÐO+5¡ÑIž5åÉ= R^¦® ƒQz<<"E)TGÍ®3‰Èƒ}Hü» Ý%ñ]ýª3e§Ï³×ÜÀ›³ûà%ĦäG)ûcä£Íq†ºÇŽÈ‚Ýi‡k:¾›Á‘ ƒ÷á=»7>ÚLgfáÿháù³8ù:ÜzìmÓìiÇÑ Ò‡f±â#eðØógµŽ›ÃÀ‡`>abúGüXøûXs>¦<ð=¹üøE=¢gâ»Qœ­¯ðþœŽ8¤#Æô½û0ÊcõÄ»ï?ÆóÄG`”ø-†~ßç¿¥û–uü–X‹oϰ£6 `©·¢ù»ü>ö˜<ï§>òÎã{ãüí±Ì‡Y‡ÿEüß?LøWHàw¼H<ŠþøÞ¼‘›çóùq8j: ÍßÝÃO{×MƒûìÑ¢a$i»|u“³ßIæj·Fáì[ž › õ8öwH0Ðué8¯«´ÇçCÍ“¿ÆðÐD“öm:^$ÜlÙ`Çw¢ƒý82‡ó= wîß» årZd¡…ba7"ªª·z[?ãÅ 3ðž!L5#aD´æ.Àe]Nër9­÷­6³ã/‰±,e]À¯›VU«UСZ-¥Yˆ(‘(Ñž¡ªéÓÄzC¨ùÝœ‘Zœ™ ‚9“¸C$'D“,àn…Ëíöòüë—†c@L1ŒˆèNj®ª”ôdˆ²,§u©jÆjnÕj0Ia>ŸV÷P÷~ø¡!¹‰v4GZA# b3M½‰9 Ì-I<Ò¿*ˆè`î›VB\D˜ÙÌAXq•å÷í¾EDaaBsïÞºîX4wŠ0Ó@tp€¸×M½Þ‰´sÀÃ08 ³*øzZMMîw& t0 "H!aùz½e˜G\NKD|½¾¼¼¼DøåüY ‚ª.„ Ýàpß6€¨ªàM;¸œV$Úê¦ZÁÝŠp îá˜*aƒiä @·P·å´äÖ«š* ‹<-çͶûV‰ùt: óý~wExúáóE™?z­Ì>ë¸o[ü¿š;!nµ2 »­K9d µ[8@¬ëiê ƒµ,lƒ½)©·È´ªc⦺›#9z5Cb)„,‚Žæj^kÝjE@b.Q릵n·º•Ô:‰×RÑ–Å͉0Ó¯//-Ø‘5¶ÌãÅä¾"eÞÂâæÁM°ß¶‰Ãº<¹™ÇŽÁ9ŸNîyÉw¤tôr$z¾‘¾;¶5'š·Û-ùÅ"2d©äðÀ²ä?jÇ ˜;›™éý~cæÓùLýf†D§emÆêwóP÷Ú´øæ½Ï:&vE@wÓ áÁDB|»ß‡zbf,b¦æ,ŒK‘:øÛ£ü¥bØ‚Zñ¥BŸslt°T÷æ|t¦s´:"XÅ›_t Îcàîƒhó†ÆÝioZ[A«NE‹ÄV­ÐÝâÝ™Ýë×È…­üZ!2z;)]4Ô'˜x'y‚vDûXè‹vŽïÎUˆ–êd_ùŽ ÃÜÇûÕ¼9sQ„8 T½ÛÆÐ[L¬¥0v75eù bþ÷ð0ó:¹qz¯‡ƒÏ¨VàÁܯÌÎYUÑ?›@êE­="ÌÚ,'^aN b¢í†ÍßÝÒ†³8›­Ãz½sw2y«JË+O ÙCÎîŽ~nΑ–éÌáÇßnʋ䠬@ïÄr€|´ìɹ`Ößk­ R7©ó´;<f‹ý±)ŽtûÙÔ?ʶ=ƒó3æ9ðnÕ²ÓhÁTczïû¬Â]UGÙÀ 'ÅCäM¯o¿ ¿¯ÑâAÙ¯)ñ¾rŠïCÝq-ÁÔà{@³à‘û‚S£Ðø÷{ÉäšVÖÝJºûZñˆ^êÿ5ÿ[š[$Þv?ì‡V°G%nF>Ä0ù£‚ÿø`æ"ïã~3óèçCø7J€ñMíë¤úâã\ç}+xü–>Ç7ÿ,ú†IýøJÞ¿ êÆr[ÃÇßþ¡9Ø+øæ|'ÞcE½ûwü-ùwv Ä7Up|o~ðÇ”õ·EÿçÏáûÄï™|óÈ;œ€8!Ècwüâ×oBfø0ŠtDÞ1©cݵÓ¡—OÍÌÐnkF&ÜÃé“ÈÕ𰾆áÐ‚Ãøîj”Dˆh¢ôô”¶Š”áÃ#£?èmqI84M,o#`×éÿýÖFLÙÚœ}j:\Øäty:­7½zìVˆt’Þ¯·¯‚O§uá^–•Ð,Rȼ+™ùé|út>-§ó¦_¶\tF Ó"RŠdZ½j½ßïÕݪr)÷Mo÷í²,Í…DÜ7룿“q« .…³OxSsgâ4Ã!!QÍ .B r‘µ¨ZÕÜ“Ù-^¯W"|zút9Ÿo÷{­Õ±x áZ ¸m÷óåüéééùõµië,\dFä \–ò‰QÝÿö_ÿõz»:?AĦªæÈ Bâf.œ5…Q˜ AÕÊ*—ói{½«{3¸ß}óˆ"’dX˺.¢áQU\*{­:z BˆI›bˆÉtMs]n÷íšI‹Ô·ˆÔ´%M")ºÀz:ÉRàz½Âé颧µ‚…¾^oÍl+ .Ë n×›Y…´,µ-ÐØ+F€¿Þ®}ÏæÁj&œ‚{½+fäªE¤ž\s0&G€…å~»W­˜@¥H‘y)Ÿyý·¥|ùõùùõ¹ÖZk¥Dü¿ÿÇ¿ÿòõËËóëõvÿËçS ©ZðEÎK)"·ûæfI#Y¤0piÂ!BŸNûlE8”¶ï\Ë’A]fî%®M€š)ü ä\\µŠCö×:‚»iõÑêkÝ‘EˆkÝ£z€Â…×uafƦr&xÇi°Y#<±R=¬“»#)…ˆîÛ¦ªášWu@Ã8½žV"òàâRDL=·ª-gá~3[ˆH(›»Íl3«÷kQi¿qÜ"•ÂiSw·Ô½£ˆ@+“k±êV˜ ŽJæˆÄ™lˆ‡p7psS÷ôW´ fïf&÷È1¥ÖÐp­Ñ¯5àNÉÂ^r;9&šÓ¿np·g8IA@g'Ä»)!šÙU¯ù㪪¦D¸”µœÊºœˆ8I,¹#5¶héreYÎç3‹Üï×"K‘…Y̘ø¦5‘ ºÕ€Ÿ‡ˆƒð±®K6= âý~1iÕù'Ѻín3Õyo\`Bô-“" ‘ÓÚ»’AÍò× ÉÃuPÍ\kx|}þº®K‘Å\“‘ŸŽ»§ý?GN³%7ÒB63§¤Õ,œHÍÎŒ;î í–¥få;‚7†FÛ³pôzjBD¡¼B-‡Œ“Ýå $´EôÎñ¼MçĨg{°£ð½ŸÜSûs©ÛEªêŽM@jWÒÑqp´.£®o}#ò&™Ÿž´úèÙ«X÷âø† FŒÞ9‡lý^n´‹ q¨áÅ©‰ø &Ьշy Ž_o%.{F*_]c½‰À0ÚeMzÏûØa< }C9¤ÇÑ›Åä£áýx”^Þ>}Èomíñ¨ç>Ž>~–8ò]™}ïzÐ1£&xh(:;ÌÕ‡~ |„ϼ:àÃw×l¼ïàîº å3µá[~HVñ®Hßàãø}´àx'“33ièj¾Ùì¼?Ö•8Jû£Áã¶VP»>Þd ~7/÷3ì 7ë$ùÎê†o›î¿³Nà÷ëÓÜÖþاÿ3øæôÁ~sûŸŽÜ#¢é퀬)ì±O©'¡Ùœ¹ êý~Ûw/p˜ãdb ~d÷éx®b(º5N‰žEÆãa‚ÔoºÓeo2Þ‹‰!r¯Ý½{2'`ÿpÄ×(ø^©96`ðG‡TWÿñ¨è]cÔi'ÛFPHØ!KERÓôð¨[ýúúr.ÂŒàA„”VY¦¦ä@Ķm¿Tý+ cÒ)ÜÃAqf5»m[[ï¦ð^«U…e±H²6­e1Ub8•ou«j¥xFÕ¬º¶.\"aF-s7 &–E„©¬Å<’¥#§²ÜŠ Æ¿ýÛÿøáééºmjz¿ß 㺭ëé¯?þTÖ¢–z•?Oëù”{G@æN'f~¹½¾|}Þ¶iUs5“ ì³pó8-\S»DN$IJ¬ • 757«fÄ(¼”"² ‡#ãr*—OOîñòúš¢ÍÔƒÌ lSEhö«,õòfí È/ÂrËdf HÕ`ÖÏ]¦ÛI  `]¤—בš%N*0"Øa] Ÿ/î®öüõ«ºƒj:ËÒ¹NÂ"âH„è€hZ³´0‡sý* ,…ñëó«&ÂõàÑU¢ ·™ßw xä)¬ª1cöřՈ0Í çö.Õm‚f˜ÍLu߆cßÐE«¨#r÷r>ýÛù´Ýë­Þ‰h]–eY8àåùyÓêwPU4·ëíêæc>DˆYϾÝïaF€á­/;<̉>þ¼.‹Öm«:€—¿|ùõùõµ”¢ª I±”BX`·yRDoðóÓ§®Àú/¿übªÄLDE ¥³rÜh¤Ï‡ò°H£ø¡;Ô,ÍØÌ’Ójf™`·¶ÁF höɈx}y­º=]ž ÏÉ1‰Lé§·´bdL˜r&0Æ:‚È yÄù»PÕ¬—‘þ¾æ¦1¾ÔM<»f›G¶yçNHd¥d†À–“rŽØ…¶Ó¨jÌ@ª*R†®7‚›iAíÜr€jæa%%k€8v#î>nÏ*eKÚB“\ó4Ì¥>\ýc 7õ‚ "ýPNF>¿ûTÂa‡åSAÌôàƒRÐjPYhê¶PuóÞžŠÃÖß…³$òD«(oük×ÁèœÑÉ£ð®‰îÐ œ‹çbжÛ4£­u=º>?þ¡ÿ÷^ÑÀ€òÞ‰ü{³A7¦toi–¢B†|j÷0ê¥ô5~kâ¤í£Ò]-;:F–'Ðq`õF™Cgd¦ò?{¼¢KxÉ ýppGn:»0%­©±mýMÙARò¦ n5zÓˆP‚†Œ<ë»8ZD0Uu€0oŸf¸Góþ÷†Ótà f3v²úÚŒ+úW¦P#‘8ÔÆþtä$aOŒjÙp×¼M]»8šˆ â¼e«YÂM&CqôӵϞ‘8oÊf“U4Üš@[2åì!]“[ºïа[*hiâÀ>TàÆ~¦*Ûþ~ÇϨj­5ª¸¡eˆòC—oÔÞIœ•7z‘,ÏÉJ»)3Óx/ã×2 éý&2¿æ}òçÞ[+ZO«»MÜ&ÊýŒðð. õ'µ¹ïö€Úl _LŒÙæÜ²_Q¶ô×ÖgQ#VÐpAôÈQ9ë>HÍ4HB™AÝÅCŒùN4õm6³y¦1Ìvˆ|/Ÿk‡|»oûü#1Ý´€cÞI@À0 ~ó7)ÔRîwŒ–Që£e0Õf@ÀVGãás` 3¿Œ#˜ß#vúÍn)8h=–ó±1Ëf½è%ÜÛu,Z…ÌÀvÆ{@ztÆœ¥:(9óµúýF ë øL{œ8äâðêYñ]·0´R<ÐÆ¦éû;¼»;<ßö«>ú4g•$~§“gz2`ãJÁNWxøšðhr"Ýõ IDAT™ãQÐ=Êç1nóû ý09™a†ÊðNwz0éâ÷©£ñŽ\Šïëåóûm~8¬BðCW÷~%0õ?<õCÞŽã:õ9Gºcœ†ñPSþfš„ßÔo˜Ûã7œûðîå»dð8Ê«ñÏAfŽ–佑ŷ*ß³ùcº?þ7©öÿ¢ºÿ¿Jõ/~Ç·ú³®wúÞýðÝ™Ñp;¥?š¥ob»Ån*÷Ö07«C×úý€2!€ò¿ò>­ïe;ýÔ§DòwŸ´ ôª¤7· èE˜/&ïßùÔ˜‹C¹qàÔÏ;®ëé 7Þÿ¤ØÇ a>ê“€>¦Ã©>ÊøQ0IZ”@DZ÷A¸ªcÒ~q«×—R–¶ëò@ &B jF€t{Ùªmôt9!rz™=¼nË"‘1c ¾Àíu“„hêaæŽPµF@) Cv¢ òÂÄ@aÞ,Ȥ¡`À|Êû±š¦k™¤0º¹‡DaÂeafKXìM·ÛíµÖ{‚Lr[‚D€TJùë_þ|¹œ«n¶9Äçó)íœùÕm¦ë²|¾<ýøéóó×ç/¯/i ‚tNº%™@U-– â@€B²pil‡ºÙ¶Ýʺ -Ëjj @ˆ`h7#¦ËzbÂíîäÁ@й•RUG@`LïWΠ,R ›¹ÖÚÜkÌ‹0"þøôi]×ÿøû’ûåüi¾^of."Û}c¦~üñßþô—Ÿþü“«Þµ>¿¾æöÙÌku&&g$`áœÉëý®µnMdâ2µýøäØM;ó××çói-ƒf-„OOŸ é¾m®æ®z¿/ëÓíåúüú‚L°Ê²¯Œ#Ö²PUûòõç_¾üúå×/ðÃO?þp¹˜Ú—íõËóóétÚ¶íåå…EÝV ªÕÝ ü^k>šÔ¨XÖeYW ¿ ¾__—R:¦Õ©»Ý<„‰™¼*¦™‘ÈU½ÉÍÈ™ªÍ³êàV[ñ›H3$tpPÓp!ÎwíiŒ¤ÙFÌíSÉ÷^׌êZkUD`€ÐMÁ,ˆÂÝØ™=àBˆÄªº…"aú³ÃC“OÂâæír@RÄ}HyÏ6U·p7/9¸ ¦¥”u])ÐÀÜRÆÅpáªæf½À˜ÅÝn·[Êè®›ƒPsH¡“0†8’ÀãSßZDónP`Xœ™Y„ÿú˯Yc+„Y‡îÀL¥xÝh—¶n×k9ÏŒᩯÜêB’`% 2‹ÖäG[­///÷mK•¹]o7úò…˜ÝýééID²Û¹>Ò‘FNaÎ#-…H"ÚÌJ)$ßÇ­~:¥õ šiÝ Ê’ªzt{`f’"™~‰@w$ó ̓ãìㆊÄLäˆe•pøùç_k­C9_N—Ó9gƒ¥,"’M!Ы2 ¿©i?/Š&U£cGÚœÊaB+ä)Ùæc¢$îZ7J°@CµšyšjÛ¦º“¬¡Ao’®Óv>í„1£7Ük:¯@Í–RR„2DS{~þr:2 âÂ’õônÚ*Œ±ñ÷,ÁêêâÄÉI‹Î×Øâž ¼„#µÙa€‡‡{ö ä7Óñ M`Ì%!zYJ¾Ì*ó©”pu&Ê7µë ªu[)#åÔÄÍ€ÈT«jIïÿ² ¶üŒs? ,ÙCiîaÂ"E×µœÖ•ˆrÌ ±†RÜ}oK 8Ï!­Æ÷OÁ:= ÐJw‰ôhÖ^[™©èÜÛÛA†½Zv.¿ïÚa«ÊŒ–RPóÁ€º»¦ûóv*ú¢¥Á°%Û/'ÝÚ7øè½ì´›vÃ+³ƒ8¡Œ9èkñbÁOGn‡zw^L¯zb£m³k/ùÏÞQ/­Þe@¸z>«¯z(0š•x˜oû¼‰Sýã?šLgF~%ÔÍ<$]HsoÅÇ;y$0€¸¹‰±×«B¸µ/¶3ë©åŠmÓàæüE¢jnABéiÅ<ûZûUà®èéÛü@½ƒ³ÉÀ³ |²i‚V •›³C>\MÃüv¿oµæå±”"L~¬¢3¹&ë÷-AkMòèïôw×ðPܹX}Œ“¯™2ÐÓ‹™),Qf53æI_ä ”R²™¶Ö-]ˆä8­&'ràà½öFTeü]ˆ"ªómv—=ÎÓ£K:L-/DPJY–‰D$9™×ë5ù‡…Í<íPc®‡‰6E‚©xÒL¸ÈÖÇzü…¨k÷SF)OîÉܱuêÖ¸H„Ï¡/×ã°<Ö$Œ˜ ‘Y‡êD"¡Fj¡µ]d<Ï”<f›ÚT¶:Vš3þh•âì‰áŽX4ó^ú0É‚£‡·UóæhÓ2ïöí_>ÿ·oA*löÿ1,L~ìoa4¬âhÞ€öÁ¹ê#+“`M?Ú0&•s>Yš»æªÚCx`ä) ,c;—Yé®e³Bˆ°‡«[fÖ3ü[ !`±ûíõ—Ÿù_M•…ÿú×?#‹†¡B„Õ&5ÔªZÌìç_½ßn—§‹»/R.ËÙÅ=œ˜ÿýÿú÷¯ÏÏÏ/Ï///Ÿ?."-fá¨×ûæY$™$Âçe!"7'äVTR0 B^—EŒ¯Û ò7˜9©û¡fÌ ç1óTª¥Š©j,.RVZ"=tŒˆABxd${)œfXF¾Ýoª5"j¸ÝžÎŒŒ»¶žb0{D2ÐǾĄ̈›vÛ&ÜLÍ"\¸ &U˜q¹¬äf„dnIÀ¨f×[uØ\íz»ÕûDœÀúÆ4D"ˆaö "ï„_€A ò« f[E\ÎgÉfSU³ð…Ùªy¸¹ßï7íÜ’f@óP­÷ëíÿ£îݺ\7²ìÜu €ÌÜRÝÚö8çÍÿÿoÛí.ë²w& ĺøaEL¦¤ª®î–5jTm©”Lˆ¹æüfÒH1—Rxáp«ÝBêµÂÑ ß’ÕØ!g©tåÿ Ï&ñᇠUûöö†ˆ¯//\–Û¶o·ÛzY…DMUM«æb=%ƒêU¢AêÃÜÁªï·ýYQìfDtÍlRÜnwDTÓ}Û@JAÀËå’ûÚËår¹¬‘;a3eâ1Ÿ@ĵ””N¼9R•/—ËËË˸,†ñhn¡¤¡V¸»Öºí[zðKYD8Ï#‚oûZ÷ž†ŠÖ9a–§ìÛäÔ sëâªVU÷}‡QŸx'FJÇ%fÄòý_g÷òcôºìYÃáP<6üÝ›ÕðûƒÞíù)¾eþ€ÝMÕjÕfÞŒäJ+W"òˆ­jÒöKÖÞöšTï£x÷ ‚²ˆX—µêÞxMFÄRÖZk­á{5¿‡G$l®–HªˆPì'q75çCKõà^˜?O£õ‡ “@1\Ô 3‚ƒ`fä-Hž4°ð)¨ûÍö[»H¨Ý»ÒªÏ¼ôBVÕ½ºX„ÖªîŒÈÐèð­¢ÕS§Ýô»P³º!­«DÈDEd]V‘’‹¨DzÄ=(ÉfLhádM†!Êj€ÀL‘¶ÅaÿfSVõYüÁŸc­yÙì­] ¬ËÒGí_›Ù0Q(T÷pÃÖ?–gÇ~®×Ô&Ю_ÂpÆwiÝGËpsInùoÖRð €€°þ·–fñLƤšœÔÞú›þêE®c€p(ZØé@@Ó²þ0î5#~÷¥¶/h¶Å m©iZ-€‡5€÷Ùðu¼tíÂØ³ýSsÿ1ÐûÍœêÝsÍ£í ò+ߎŽV³€NLÊù˜Ã.zÝ,JaËj2Œ`Ff&f‘榦3pL†¨¬P˜jµ0‡ê"c†š„eˆ©­a¨Ý&¼î¦fû¾'úÇT‘H„—Rˆ&vyW‘ñ·U¸“<Û<êà¦ÄI,žjè:h^D<Lû8«~JÖZë¾ï™­ŒPUÂ#¶•¯Skm©¯v%’‡· n¥Á4›Ëæ÷Ùn…DØêÐ[ß0¶sëÇŽ ߈ÐZ‡Æ6ópOtd¶ «3ïÛ^U3&"‡i¡fúÐÌÊ¥WôaLŒþÙÜÝÞöj4Ï > õcBû´  Ç×4Zï|Ü2åp |t?º{L­ù=%FÊ‚âÃîvüxg:"Î¥èl#îŠ<œ €‰²˜Ÿ[-yå#OJž,︤ñý°³', Ç”-Ž@DLÅ…“a#Ý‚ø`ŽˆDáõ7ìÓY<;ô„þà°ô[ò ½™úÆbeR_["!§}]D-zÉóI=§^×I§††KÇ@(N¦àŽozèãÅ8‹…ÇáI+çñB£&ýS·øƒd{îÉÀ“áòdP~€VOc©jÉ ÁpŒùÏó’Òƒ˜’oO=Ýxv™@=Ö§¥Cí)†Oâpê¨=Q"ðÔæúPè:E&u©õ~›öŸªÑSôОþMìÚÚS¹­z†£!âcD%ž1zÎíñ¨S~@;ášÔù{7Ä'ÿcÃöÃǃøB{&î>V=UÍÇ§ŠøÄŸŽÏÔuü‡‰½Ÿü“øM/üòÇÆÏ$þ&òÑïKýÿû‹ðÿŽ1@|Vûw :èôiU0"Ì¥ôésjCäüéÁ°Ÿäl<¤ÿ(Μ7>–ÐG Ï=ývLÇ£fþQìËÎN9Cê¡òÇ„TÀ tùal|°³Êç_ÊåñÁÓ ã3âóoiwuD6úrMÕL„„˜e€-¢ayÝwwmÅßm`–ÌB@TÝ!‚y1¯n­,ÔÜ·û”j]DQÍR HM¨5”´UÏÈÊP?tál]"!f!®¦£¬¾§#Б %ÀB› 5µ_&Â0{l³ÐvdAšä˜WJëçm"|À ë<¤&i€—›ð9„½Î{ω 礩¹…5=lZû" Á¾•I¬›dO!u¸ˆÓ²r@šö¹‰Ìj"ôÆ€ðÀ†·LhL¸Z.ú²‡':%KªÎ)ÞMjct r¼èµx¤â”ö÷T”2¼5VÇ™f;Dz@j  ”Ð!HPôp€Æ\-8cœ8E`P¯ËlïÙ=¦JÄóÝcvÓçñòÄ׃ ÐýæÈÖG1.L]*ôÙa-,ˆ”Ÿ™ÿ>Öð,ÂE¸̉0<œ‰Ä?¢W}QŸÝ<ÜPU-Ay®jmÀ†¸, ‰§Š <šÕ¿- :°gXÅ=†KzÖˆÇEëón㌠zâój&PtW5ˆ=öZ3e˜}&œ‰Cªæ¾*‚±÷â©,·ÇMîd(¬«Uß«jŒ{ÚG) š%mï8uxV­jjæ')¹·#Ôi{£²©BoŠê›®8{ÿ3÷–#í6°os¯Adš§/ɯ;Zq§(CùpxRø‰ÜþðN>"ýj.らó÷qú~ÆoL:ÄӨߢ£ÿ^1ýñ÷Ò£Wþ7r|z’ð™Ì Ÿ ¤¦U@ŒÌÚ”Q >†š Üï?çzruŸ¹pŠ$·"‚ˆQê{¼ö¸yω1d® µ{Òÿ }yÜfs’1­I{©pîÐÏ®ÿ¶à™é(‚§-À8ªNú# Ÿ<ü¦E>NEç Hd'¯k0 ¸Y5ß6v* @\Düþöígˆ×‹¤wLPrËH…‹”"ðþ~»ýõ¯ùþ_’¢ö¾["–&¹%Í‘q7«j€È…Àj¬ëúz}Q35‡0ØÕr=ì=ÄÂŒéÕZˆ+q5‹j¦ûææÂ à†+…¹©v[‚BÄ{Us@bY(½V‹@Âû}[Öë^^E$«©+qï¨kÎ:k3S³×ë‹…Õ]ï¾-"Ø‹'˜ååõe¿oÐä'@¢U–²Êíæ^ˆxY®_^MUÝ©jsB1cr‡×!¦F„Ì áMƒâP‹. à"FL«”µ¬ëz¹Ýn?üüÓ¢¾«*2Ýï÷ûí¶^Öå²pF)4¼VûáëOÑZì(¬¥ Ó‹RÃLÝ`YKîs0ÌÜ5÷¦23áº,îié )"EÐÌÍzŽÕ«™9ê®^÷Ýîûöã×+KZá0âíëûÛ}{{ÿöýþpùþÂHꦪ°ïõ뷯˺¾¼¼„‡«‚1ïµÖº;À¦u7½^¯"¥ÖÝÌ Hó±%¤)\ŒI 31GxUwµZ«Zuû}{{{#Â¥”e)aîj–{š¬,15S[e-Â÷mló"—U•E.—Å<{š>É êî­àó²¬"z7B5Ó°@æÜÕƒ;xNJ—Žš?¢ØmÌFØ#§})L,ׄ¿)?}ý#JY€ÅêI ƒd$ õ¶gCDËÍ„”’™©”"$R°9¸ƒ«VfNóµ» ‹A0çŽɉ¿Ýo÷ .‹"R5EÂ}7F&`b·š¨7'¦¤|‘ðU^´VèÔx.ŒÄ9üÀ>ŠkËâ¬à³¬£™ í gÇ­DÄdf·ûVëû^—u!’Ë š'òɯzÍz}ßïÛ½2­xY‘,„½Ѳ¬ËeÍYBÞh¯×ëË눘™¿ÿòýRŠª.eÝ떈眴¥“y&wOõ'šÍYWJÜH ¹ÛÏa:æ‰ÒdÓ´q%æ"¥Àz¹¾\o·ûæn¦¶íµî›Y\¯Erœ`î„`ÍX„ÀÄA‘ሸ\®”Óî:akjš3f éM/Ýš9}UãÜ3Öo¶Å‘=qºvÂm³äÝ(ý©‹üh>6Œ†>=»avü-õÙ‡N³…ølD’=ñÉmjºƒ› ÂqÿìwÀ ‡€ñ*üì+$ºï GßZ#AY",lÛ·}ᕤ‚|è¶ï†ÉQ3êÛ ØÕ€°šÿøó/ß}ùîå57ÆKY  wº4¤UŠ0¥¬Ë‚—K¼\/e)õfa‘¾©víµZDfôØnûm»¹FÔmW³€º›oû¾Ýöû¶!Óu]…9Íqf~ßv† |{D‡¸ß7S‘Z€Âãí~¿” Þ¶êHÆ!Â@„ÞV«;!­ëµ~­5a‰¬s‡¶ûÝ͉‰D Ff*••˜¾|yMß!Þo·0 H®BõJ\‘®”pç– ›'˜AÃPÝ@«¾¿½½\/ªµH¹¬k˜×ºÝî·÷Ûû ‚‰IˆÜkÝ# À¯ë2:wSÕwÄu)ùxÎîfjù^,K€Áˆ @„ Vu³­€2祙¨D,WUB 8¶Ó ‘îöó?Ú¾û]W.lfPßßÍ…UkB-ÆRÏk­Ûæèñårýñ§ŸJ)¹ÄfÀ™.—K–§½¿½¹ûý~ÿîõ³'6…B$’—uÝ+1bÚÁ„)ˆ6s¤ðÐÚI&¥!íµº»‡Õ}+eÉ™Äv¿_ÊÚŠÃyÙ¨ÑéIë^‰Ìlßv óÛÍÍˆŠ”²8@afû¾©™—ë<öº×M=Ì‚¡”æT«6C%"–Q§¥¦„dªÁ€”ßx4JpP„ƒ[°4pE¾o‚ 3v ¯VÂCM‰Y1œ 3J8l›&Ð6¢í×7 Cw!¡\ÖúòÚ: ˆïÛÝ÷Ø«¶P‚ 0 #3S@dæ›[¸ËR˜Z¹"¶îÌc‰ f N"b-$œâùHiÛ ª0φMˆI(" 3"ÊʈfVVG$á"‰µ‰fÚÌ›@)²,—Ëe}yyefµZЏûûÛûë—/ˆ`ᯗ)…‰là <,Zm_æß'§”ìdwK#4nr@@†ð#b7‹ˆ,¡-¥˜ù`p7¦VÖ2r!KYÍ£Öjjoß¾EÀ² w%E͚DŽîK)IBpw)Ëòåõ "Z²ÌÝ—²$9a´ 6Ù‚°%ú>=ObGà) ާµÃ¡•àÁ…È_:uña·˜osŽ ¼ÓÔŠÆâäDDf"ÐZY( ê®JÊD¥,Mrê àô'ˆ”„Y!‘ÜîïÂÌ׫™¢›ï{mÒ$6â ‹0µ‚CÉ'˜ 0Ü¢'"¸uhH4ïj„IŠŽÐ“7\£æý’Â3ÉN8°Èà9ÉyÈ Î¹  "ŠÙÞsކ€hšt‹„™0qžt"æT>Óñ›w3"*ÌKaá’=Ø™‡C$5WUµ „ä™ÉI§s³]· à b"!„DÉŒQŠk­\6sc­†q@©Ãðw^²f°éLM:ˆ¡ t ïh‚À~U÷k müØÉÇ£©1ƒ%¯Øåê!û£¶ºIÚ@Ц–„„Í7jù¸ÆÖܯÃ$ÅèWÇÈ Dé YÞò €¼¯fÃ{ÅAxÃLÄ„”Ž.]ÍE\CéÏ|bÐa¹—] ÀaŽH¹Ž ÎãÛ9'ŒLL0)xÒH{KD£ eÃh$¦Ts!ã©þÏ Ùxåd©¤"·¶1h:¬ P9$¥§Õ“ 2uÊ$á™÷ùçX dÚ¸ˆ”eÍÀV¾&û[øÁ¶[Zk²?tüvŒ3ñÚµÆ6 £˜qTì"œññ1)µ=¬0ºÖÃ[;K‹O´¯bxŒÑEsÍç¯e)hx€Þ·Dè|”¦஺>Àˆ5ÌÌÔ°·´"–íü>RÊ'dÉ #3f;DŒHŒg1ýèc ÊQM¯ÊÆIË}Ú¦pr"ÖøhxÞ]'ßodÚâ#’¥ç’vxæ¦2áÑ÷­µbÆ\<¸ïÛW:ºaï¨îZÀ„¡o¨ºi™YL}LG ùBð,Ûá ˜‹úØ}ñDAïbGü˜RÁQ¢ã9>®f<|÷ϬÂs¯ýd]?Svf"}„âµæçé¦F¡ –ˆOZ^?*¤3ÏÿxWCÁ}†Ð?%€xG ×áRÆiTñÌ`ý4²ðä_Âé Œ)þTäð zlŒ´ !ø§ñÙ¤0&:teŽ)>Ä ¦]ÏQ/9×êÂ4d€˜Uº3xÿ!-€øða>Àç¹_x•¯YŒiPÒñDw|P? ÕÇ'ÛyPâ‡ARœ¡VðøŸ©ÂÕËpˆn¿\ü¬iz¼}œc)¿úqã_é1 ¯z¤‘ü»óhþµîßrôðï8°ñ;÷ýÈý: èoÈ`|¢n°Yâôûô×å|5 à(OÚ Îùy_%hr“ð(M:®$ê7Õn"L[P[Cx2ˆ|¥û< í&¯ÍÎúPW`<µ-¶èpD  w³sÿ„P|r´Çӌηڷ<#æ²»_:—âûÎ/´¬W)¶òz¹P¡Û»¹n€$,BQÌ“eŒ¹Z&s3ˆ÷û.…HXJY™·mÿïÿß{ûþûí¾ "BÇŠ‡´é)-"K‘\ù¹Z¨k|^_®M]b‹÷oß<üíý†`ˆ f›îVUëþþV¡üåOòúŠF¸»n÷­0†H‘’vì£ µV‘—ëUDÊZnÛMÍ^éUÃ…˜àH¬5#.xdÅ !€ ;Ç®¹¥gᤋ01›“¬ËÂÄfî`KY¶¨QwD,TÊ"˲&Auך ®nžmÕ”2H7#/,ˆ®Y\×4ZtB×Vdw»½›Z¨9Àqß«™š)‚#‘"¡¹—R.—ëºÈ¥\Ì­ZuwáÒK1´Öt:¥§¸º¯eq@²w¶kÍe fÇQdÙS—v°}ßÕ­Ve&êè• 9ìûÏûÛ ÔÀ‹„yVt§cµˆ¼¼¼|ÿò²|Ýw¨ªèèî_^^¯—‹Öš w_–R £â\ÇÿñOº½¿ïû.,/—ë··ÛV7AÄEŠ$@©ùÁ ˆ”Bq½\„yß6¯J„¸ï;¸[UEÄ`1ó”Å™èËzá·û}ך+¹eYYTÍÜsǪ¦û¾G„ºhfjqW3"4µmßñRV&*R<ÂÝv€­îÂRu¿^/j–[Ófárlž}ê"YâΛxœô±ˆõzUd¤€d³@µÐ"²èP„(ȱò"èZ5Zª]˜ ›Qz-AD)j Ll®I!@ë%ŠD”m´y›2ß÷°Ü)Ær¹¼\´Þq‚v=´{Elôr¼È@ÆÃÝ47ŹwwKãŒ7kªfåFGZGwæÍ!EíüÇëR’º“®Ã¾?ýîÎL±”ÐÒÙnÚlÝ„!$×—ëº,—eY¤X,,ÅͪÕëº qÕ(Ë›—SµZGZäßf§«ˆ,eÉöuçÞÁ›c wOWoª9®ZÓšJÄD,ÝP9zö²®ÃݬÕ.8"ˆH¸íµ†…ª¿½¿Àe½¤ž÷OXC¯xÞE)/³,˜åü‹( Ò\hn #&S3³V—0u͉ùÝdB6Õû­ñ0xM«ëÃü”aúM"Šy°¾ïoëem¸’ì#êËLŒÅ8QÄzYRÝws¯ªHÄœ»‹ŠHIç€&" 3ßnwÀÁLšÑåÖü£Ì!¨€e;„Z¸åhÊÌÁ! † 2I„G„µ ‘ª±ô\@„õ1[)ˆKYX8ÿCt1¿%1(× ZÍÍQˆó< "J‘@PwG0ÓiDÌ?Ou‹ždÜëÎHKAI*KÙäøµÒnõj›vóa)‚H‡è”yQL/."PªéHŒ¨Þ,ú„ÜlçѪzxÔÛæ=pZáî²{)#TpZrR¿,†×»|GU2T|”. ˆPÌûð¤KEãØ¶¶|RL•ÑÜC><Ê [£©—7™Ø£O—£k|6âøÐåøœQt@"—ï" Qžø|gY6|r µ¼lšzþ;ž=¾iÄÑœ€Ó¶:™JžêMðt¸§Ýõî€þ½÷yƒ˜B¥‡ùfœ¥Åüšï‡¢*ÂÜzÿj:J$uí,A&:NJ?‘©tZ*!AkÀ7lUÔ6”h, 'ˆ@o˜>uÞ塪™jëâʜՠ½uŸµwÏu{ÛÿÓ…»£Ô3ü|Œ=>ð¾Y“:–'c é‰8™vÿ8E¸jhED@æ¼C³}t…ë©Áÿ˜:Ì÷ƒ<Õ„M"¢å˜d¶ð‰ùú0˶˜j„w-¾Y˜º69¦ì£>‡¨ùà¨Jö© 5ž™²s=†ÐxG>šx´{œáA¹9ÂÁðAq¤ ’“­Qó;"8íãÓœ`èÄ $âcš‹‘§³OÌ0u¶ÄhÈ¡SCê‘#Ìññ4žAlø£~Ô±sû⤨Ï^Þ^¼†hLB±§W¼µÓµb&ÿÎä<ä@ôÑcî0üZç((Z5H‹VtÌØ¸L+ìÁ­6ÓŠi841RJsp&&—É)ÌM´ÄþÆ £p|7£•®Xg‡ 0Ë󃀃³ªêßzìJǘÄö¯çé.q’Þ!â—À1' Äa‚Ÿóð¬>»úã,HO¡…nŒøP|€Á©ÞÏ“h%Œ·çðÈã$` ˆOÜÍåß#­@x”aÎMѳüt°‚ǧfñá½à4˜:Ï*¦‘âcüá‰ÖOtºO:‹?ûg§ÖâÇJƒÆxüEÏ5NB9þºÔz …°Ý§ùÑYº_g禄±t‹ß¦~æÀýÅú+5»øá_ûeÁüoÓñûúQªã÷Èú·xS¿«9þ&‰ÿaZ÷䨾vü¨ÿ7¼êÔ$u¤¬NL|Lß’Œˆ6ŸÇÑ5ÃçÐÌ:#ØÔ^s> òÀ¹¡CØÏòúå[M]hù¨È N¦2‡£qÚ#¤ÇV~¨ú¦ydßö¬n€ü¡ŠàX>Œyí´ œŸíõ Î\ʺÖ°-½ÞEh‘bXÁý~»/Œ<<-CNîaî±Ý÷ˆå¥,×å…åë×oû^/¥*ˆÍ\à X=§ÉKjªpO#g#&#~y]X~øùg3Û·Û·÷íÆÌ‹,Øâê¶ß6­{IƒQ„,\„—Xvº_.ë}».ëºZ¸A$‡ÂÌ"u+¦e]_ÖËËËåŸíG‡0Nü·å_þ†©B'qŽMTnY°òå"B@T«³Ek*c¢ô 9#"’VG¬¸”‘îºÏI–. 0î¦PˆôxF´ªVìÜŒ<¿»šÇÝ#öªvÛà-ZæÌ#ÌÜüÏøã¿ûòv{ß«¹ù0iz¤6{)ÁÌ Z,…®K±Œ´A€›™ºEZ4šmÊÍ­miÛ«›y6¹zæªÌn·ýöv¤ P·Á­," ñÿðG…ªV¿þüÉÞÕºí("//×RÄ-–R¬ƒÔ}Û·¾2³Õí¾×K‘ë÷øoÿýÿÿá‡â¨®ooï¯×ë².àªw^8÷) #â‚ÅÐPp%ys¸ßï¦NÑ6ÛîŽhÌ´,Ôõ²,‡Šˆ¥aN/šá‚üóû8,R)LZ&³êæëåJŒùõ@pfIÆÑRTdq‹¼Œ™(1³ÑuY!{DNï3‘õNÖo†ûåòRUÃÕšK1<œÐˆÚ.#"jáRH•$"\+d߀„f©0ó¼!©ªA±›fWµEl·›¬kÔÖR€Ì‘ýÒ|YW áu)¯×—"ÅܶZ³w׫zš©]HÊB dœýKÙA­±‰©©… „Ýã9üCÔø8ºø.— ”Rê¾»G&-RÝÈ6\5Kø²¹_×Ë«HFÚTõ§¯_EØêVU+-MÒ(,˲Üöš$/¹+ j•˜g)„µr,w(í&“¾ßJÈCv03׺ƒ»M~HDdDÉ]_ÓVÌ›~å†HÍM@,+’»uÓ$À²^š×¾Öܥ߷-7Ïëå’G¦j–d)¤$ç­†¥)Ék^hɡΌ5xGˆ(ÉÀ­"Ý1¼ÅˆE˜¶}ï¹¥ÌB8p€4ÃLÝ×…÷­²HôÝ<š%DH½b/#%=]A‰µÏ*È &5pN2–5¶ªF€›¹…S d—M "„8ɘs8€]Cw³ˆ¨M…nŒòÔ7„˜©©æ€jf®¹ow‹€¤ZX.0Ñm€`I_€p1ßÁvÍóå[ÎcpìÐÌËùÙ¡‘7´‰5áDÌØõ2J ê!ኔ¥ï¦?o†ôFX$s)Yz ’¢lLíþëHZ$Á`efGè8Gmq2Ä•Y{Š]„€ØÍÒ¹èLe¤9“{ãÇ$¡ýjæ"w˜pÃ#zzh>Ý  þÜ­é8ÍúÐ ÀÁñãÔÖ–-,ÁÈž]ï}pemdÅØ#)­¸o.kÄó1è!Ušß)µv„Ä¢Äé:x#Ü<@íÖÐc Gï “Ýc• Îrù¸ØãQúDDx8Lѯ±É»þ0¢;(¬îµ>À8¥*?´žž;1nskÂc™à£pú•9Ïoå#Ø$à™ûzÒ@Nl|ÊÇG“úƒO÷IíÜ0ÿôLG=6ãPsâÎTà¡Ôò—tÞ'4wœÌò‡ÿþ|íM§lbûãIÓŠ©„øUi2~³rzš1}˜£ôÅØç²y<—üð| =ŽüÊo|êãÇß0bø[Uzülëñ*TŸNÿ#EÿÏÄïÝ!Áßwà_£ÀÓ­côïÎQ“¶h”Õwºbï HáÔWìÝè7ÂÔѺÓÝ7Ïg$£mþ@Æ=‚õçv—аjfÂÈŒ–¢_€ óËõrÛ6s°¿þð/M}€cÑ#ÄmuΈXJÞÖªj6üº‡‚1B£gÈQLöÛ½Ö½V'¡/_^—eaHø4¤p HM0ÜL͉ØXŠdc°šæWö^ÕÝœy‘b `ÆR—œ´«F¢¥&ñbMÁÑÃìÚ ±ÞsDÄ”ÛlÄÄ—#ð4EL >!d˜¸mrש\v‡(õâ^èZ~kàk舦aPœõ¢¹,0k!5Ùaúm³³Ã¨9¯]ó]xÆ7e§í‰=z´=œÒgy€iæº)O" ЛK½É|0rçD>?è:„0ýt‚{(pÔQæ#ûE»ŠÑXk½Y¡ eÎ@m1~Ø«GÖ5`,„©É£HmuîÞ`8j’ê@.+è ‘ ðFÂɳKsë±µ¾CQÀ¤Û Èãà–z^ËÍ!±) ˆÓºû‡š>$ôpä†oO‡¾YsÃ#Ex·7È1òR Ïqµ\(¡ÉeËé‹ä2žv«žE±ðˆù¥Ëb˜ÛhÃ^ ´Eë*ÖAmùƒƒ³Ÿ÷jf>„ê3Œåp´GäˆÝgK2 ù¦þöfa>Š—»0•¿±wWt¹¼g›½§_Ó,ŸÃ’ˆ<­,¥H‰ˆ¶‰1Ö´ö¬<¦&–ÿ,AÄL,"”Ã%ïY!lÛÍÌ Ñ"Â"Üè휨õ~a7ì<¦¡“÷qZLu,ÉQ "J‡›»%M”Û3&‚5ž½¥=ÿ”³ñÆP3C´úЃ·O/T ÛüÆ[pzMÚþ¸Í†6IÖÓ "A8ú§à¼ÝÅÖD’?Omú{"gŽ‹Ä û<õ’Œ‡u]{TDÃ\ìC£ïeì­{0y}BÙ!Õ,!í¦<_Æ^â4âwpÐA¿éœ·ÃÞOé†îä48͸:é‹zÒ¨OzŠu«Dø\ Òõ¡nãY@ýh+ÇO\ß³<~~ÙéÊÁj?â£jˆŸPÀ(ø€OšS<ý>žG#NOY82 8Û­r„‘¦ˆx,Ú=)í³“u¶L>¨å'þ üÊÏE±±2é§ct3NøÓ:Ø8®:7Âéu{(%Nõ³ª|Êdàó‡'‚äIöŠÏþõøT§Žgœ¤‰ÈsZ¼œ.·Iëú žýG˜Ð\âÙC91Ábᡟ!ûÜ1fXοvðáƒüÆÌ¿¹"ñ;°¦ã¿Ïgý»=òÿ°ÉÂïjpÒ‰ñ· >·`ÎÆAëvˆ´ªŽXT8¢< }ú¢ozÒhû˜°o‰óO >AßöÇw4ÃSƒüÏ™¬˜½ ÍbƒHçzÞfß럱dõžèŽý^~<#h@› ?Þ­úP$7‡éÍ“áá|έ,O¯®C«>‘ 0w·MêÀÍ!€¡¬kpÜ¿m ‡Ø1ÊBÄ…ÈÀýüþþN„ÝßÞ‹é·¯o_ á*…!1(`ÛjuE$X޽ªÖ?\¾èVÔÍ#¨³”<×ËfîAÌhþ¾Ý —"E«6è'âRÊëeÍÌhÔÌý 2BD‘åzYîÛ~ÛÞwSú§ú§ëõâØ\œD¤n@„¦êæ^ÍoÛ†L¤®Læ¹@ôj‹Ú°2ÜÍŒ¨m™P„¿ý¢jiÑ©U«[šrݬš² yÀ‚òúrmHŠAQÝԪȹ®s×mwf¹dÆÕ  š¬FÍãDîá+ëÐŽ IDATá±1Rµï˜ ðf¶ h¶Ü¬D|ßî[Ý—•5‹V2kôˆŽx"€ÐÚµªéR ±¨Uï¥O벊ð×÷7 l…]’ŽêM½1TÍ6½ífzÛÁœKc›|z¹¬À)²ÿõ‡ˆñ?ÿå/[Ýüù[5“páuAæê&èîý,ÂD°ÞïwUûîõUU—²¨ùËe}¿Ýnq¹”RˆiPD³¢`ÛlW­Û}+k„ïûvY/D¢®&Â1íW©–:Ȭo­ëöÍ= ™»Ù ÌìQ‰Ùö݈ Ü”‚z‡Sn|2V…$'Œ+_ª™¹š™ˆÜïwaéµîïNU«kÖœTÿn'lÉ^)eßî‹p5GfH úîaÈÈ€œ´ùD™88KDHC6‡"€™ ÌéÂ$‘%Å‚ˆ—‚æËËkêQ’œ—~—j‚c„¹BxlZœ3Ž’¾¿p SdÉ3èÑ%Õ¶†óö…eÉï>˜GyJ8DNøðÈÏçWø“Æð®´u„}€—ë«éOîQkÍç2 —•—u]V^þåŸÿ—›í[UÒ÷Û­Çè~ßÞï·ð`f€m¹5¼ Ä}Û=ÜÜT-¹+Þ%^5eâÜ”kÝs„iÜ40W ’u)£w>•œhø ÈÛ‚‰"âF"nFNQ·»8¢™Ý·›¿;3¥tÅÌ×õâîÄ$E¢a"Z×¥éžCÿñ»æ‹sßw5ef zðF?—î¾”BU½6ÎU´Ô…išÕÛ=´VâŒxDØå˜5æÆO&–}»›:g'G•´e#ZbÉ]½w @¤É_!RDغÄ6HDdyEbÔÝÚp3 àJÒèëÁ#„\rd¹ 2D·†Ö¹³*u3U@,ÂÌýlj= ˆ:Ÿ»Y³ R[ô¨{U2VU‘’—BÎXd½¬9z$¦äNà!âÄ cäN“™Á À„ ‰‹1‡ˆ0@i×ÒÐß!"¬ÖÉD‰Œ„š4D(ÈL™¬‚ÃÏ‘¡pHä ¦–ŠY:=Ðm­‘eÃٚبHØOSgÃd8!0èpÌE}cß26ýfÈv]é¬lGuÀvh")tËKîuÔO _$¶é fDc*SÏØ…[ÆÊÞ1ròO6û¶ÇÔG–c$<ÌžMË#fb²°œ±åÒbnÓ%<™³àJÍB³KµUµ‘ ÉaJºmœyÛ7³6ƒ‘8i,à‚¡AçR£íŠñŽ<ÃBœ£µ€#tu؃gý¥‹âcI0<íÑk<çôžìRø,óâl©Æ¦¤‚j6“73!Úih²¨çø‡FÞŽOä] 3ú™­,E„¥ˆª¶*d¼¢-þ»#BUÍt62¶ì6mpíœ:j_.˜Èþ "˲,—KûÒy˜©©æãµÍ0µúa“ÙW#MßM²\ŸyO¬>|h)è×9M;÷Nˆñc¿ÞEð!(@Ã<žƒÞÚÕ“ˆ„cM‚§ÎZ< m3†è{æÖ¢ÜÏ`žâq™å#¾)ë§·Úæu–•gµ0ÊoqœÒ$3¾?Ai”-ém yTõFÏeLÂõÔ<’EDJrŒ÷Ùù4žºCû üN'(†˜fþ~kžfÿŸG_|‚§ÚýôÜn2Íê:¿(Î3Çr…³gÿÁ.çD›%·O7=DO3ª!Ú<ÑÊ?äE¢c¯Zú“ÜÏ´å‡øÄüY>„žÙÞá,þ,Ö?H¤ñëtC®šHÛ0«Ïí3ÒD¯yõù̳yO“#yb!žŒ÷¿¤E?ØLÕž1•ü’Ã9>±±ÆoP½…Oêðs>f Èó`<¥eðY_ƒEŸ@ˆ¦éÈoœ©¡ˆüTº¿iŒð¹æüû‘þ¯ýÃë âwùáÌüBEÌT2|âNö¡æã1iEè…¼s Ÿ0{©Ê+8[ÓKpÜhçv¾Ša1:½çÑ)r†p~‘é‹+É\=ŽqpÉZ ÀhQ{xê ˆOô ,„;eÙïà '>y¬Æù1‡ƒ5Q÷Z7‰[ˆÂey}}Ùß-‹jÃô®w€•A=Ü “y¹®o·Û}»ïu{¿Ý,œ¾¼¼"º›ÖÍ Ô­ª±ð¾Õ¡ÙA‘ÚR¦Öf.n#$"®æk‘뺾5Ü|Â%Ó`è)Í%n¢0¯ë‚Äüý——KYîÛ¾íµjýÓ÷¸\Vs„•¯è±ß·æˆD €ìØ÷=ÜQXh¬{‰ñ` ç[ŒðZÍ,ÒŸX0Ò˜²Ê².K7÷mßwÝQ„À)ÁFˆKY¾ûòòòrÙTï·Û^+IEÖˆôºîVßßÞ‚y)E˜’ûÜBú±,¥o»êžZ(,nuÏí>³YB´ÙLk­€À""ÂÄ·mSµˆ@†Ë¥|{3$`È"æpfo&ߢ–[!Ç,Uk)aw!hT¨Â$ÂÛ¾Sv»¦ƒÐSÁEä%–ûn¾×ˆ(IJ^„Q„ßîûûíöåõËõú²ßî÷Ûýýý]ÿçÿøÓŸÿü_¿ûž‘¿ñ}߉.×ueb5µ@ÂPM|9«2fA¤}ßÍýëû··÷o?¿¿¥µÇÍY’«”[V'P2W«v»ÝmÛùîûu]Ynû¶Ýw¿¿W«¶. ¯Ï½z@8˜ªÁíªfDT­Â×}»oYDh Jéf«D”1`€!Sh˜©#1q #£("3³©ªZ&²÷}„̼÷Êå.B¹ö¨L•<Ì}i¥Öıì½Ï÷mCy0bÀÄÓcc£”ˆ`rRJF+r5v˜—²¸#F8Šy‚CºâÛ‹4½ª¸ˆ`RÓ=¼å¿ÚúÊÍÕ±¤JÀ½l²yÍL-ÑÈ2èÊ™÷?x]æÀ `’ÎÛ&š&UçÝ&uóüµo„Ün÷½îj–˜•ÜšªV!6×?ñ__®ëºÔªn‰šKÅ ÷­ªé²”œ€“{Ü·ÅR×ùöõ›wD23Ý·;0 ")90³½VbNùG#'¢jáUí~»ÀŸþügaðV/Y» Ò BJ¹^¯ØïŸQJœŸˆ`s%’fØkÍF^N—uMÎ/ñÉž}""fIK')sê,æžµùI‡·tpŸça€¹A÷º&ŽÔRŽj5ñba6nNøicÊù9 3’w¾‰·ÎRr~Óé4! ÇÛØö˜!€iLÔ¨ðEE™÷Z±©«´2ÕJjÊ"üåõ Üo÷}¯ê.DYó>B;H"j àîR÷{³tHºzZý0"2¸¶.RDɬ‹8"$å¹À!`°8éEÂD$,Hf––gU…n„`&ìT“Ô•<<•¯†%‹HJiSìÂ5﹃h&5Yù«Á¸ÿ Bb&A"Ì–šQ#Ûó‘y3èp ê¤æ1ÔÌòO ®öûau€ˆ™Ö^;+ Ž•QÀä„©O¢“ïãÐG»q¸­7Ï…‚ØS¥¤Ó‘ÜcæL`ÐøEÜÉÏÔºÏ‹?RÊWsÏÕÉC<“Ãðüp"Á±þÅql“€‹CaTä“r‘góX¬âÑã›Ýqš¹Ã¡;Ûð`Ô\R ÿ€ƒ·¹`$çÁcX<Çè“D‚;¶I ¶TÁÈQþA  èãiwÊ~Gš|éízr÷0ÓÞâz¬ó ±åÏ{MÓ[ÓT¤D³0帵=sóËHù[WG¶ýæ‹1ËxXæÒqÚÿàLðÏÜ‚12e<&ý(ùÅL†cþŠ£³˜° DÓâGp† Ï"u&»š¨ïês ˜'œºOxóv™0ÐǸÀ§ÎÉ?ZîO^Ë¡ƒç¡7o] afÖê1: ˆˆJY²wú´ftôÛòD°lô frpwá«9ÊoÍ41…Ö†@m6,ã‹ÚG„f|: ©t Õ.Ó¸µŠ‹¦"9xXëÖÎ/«šÎžñ1…:çþ€„ï Á¼± MÞT^G­~œ°34ù©Gz.ûMâkn­úk»Y{ƒ%Iµ¥Lò:™Ò¹¥ÇþuˆN¨ïBqPß“G¦ÆT?3gZ¢û¢‘ƒ`ô7tÕh ¿DëñlÏD€cS ra«àt®'U·¥Ü›ùp¼ˆÓe÷2jÈ$9ô@ÛC—5⌮‰xÔñÕx²PÀ”;é_8s×OöÀòVL¹³Óƒæl»‡Ó©Šsíê8Çákb6Èøàd~0÷?„pš„“ögŽø<¼OHô'{úsÓö›;ÀÉŽ¾½áidg·ýq¨q:øø™&Ÿxª§QO£>tÀTf3HðC.ãÊcA]Ä‘_ˆÏÇ¡:g7âuœÊ9)õÉûéâ˜eó€35ãxccñ8•ÇŸêom”¿_Žgöa€_üz~ŸXšßýÿoîTøíüªßÅ à7S€ðì¨züÐãupþóè#˜Ö6Ø5'£çoš¦µÔõûŒC0ð³{a` rÚ•º1‚`ž\DLCú¹„:•ú&…rv ­;ß-¼çEaôÄõwÆßÙÒ“±a”Ô̇<:ýž,§{zpšïNÅÅ€ ™ô$@&äÜI@ñÊååË÷¡¬:8˜…e¶Ì×"]Šû^¿~ý*E®—‹²›nj[ÝÇf“꾫âÂå²F×[ò$º&ü$%$)ÂvI"^P ùÙh7 Híº^páT¨«Ù®fîHLRv÷¥”/ëZˆoÿ‡ºwk’$9–ôLÍÜ#2«ªgE–¤Pø«øÿ(‡rsé®ÊŒp73>˜»‡GfuÏ`@€™žºdfÜÜÕT?½ßß¿~u'³ˆVÓz¹¬ËºB‰]»¹±³¹³“„µÍ[€º”ZMA–¾ªs>n÷˺$à}/f–%QÑÊ`5½Ýï/׫Á)¿¤Ì‰÷_~Ù÷ &fIDA±HÓ“ °oû½_®kV…¡a‘SZ—uÛß»4Ã"©n÷h…_ĆœÜ½+ªKJCÙùØnm7)>ï͈Ø\™‘%ÑuÉ ¾^–oï·¯·¯kÍ!Ó B ±WòZ­–= QD¢kÕðš;`ÎYŒnõ[)Eœ„pÊi¯ûûÇ·¿ýíg+Õ‰î÷;‹¸ÙõåeÛîÿ÷ûoœø}Û¨õIrßä:rÊfïqµ$¢y·º«&·Ûí¦Z÷}WU#O‰“¤¢uá5ä'À‰Ӻæ%±½Ýo·÷÷URÉ•ˆ˜)‰h)µì•!Ìä68¦jV‰Dxzª›-y]s²½T"Òª&¨µHJtn?¬E«ÕÌ9*Y«Yvr"–$äÄ.µ–,É‹Æ~*'Ù÷VÌ‹æUo÷Á@Å÷ÃJM lëâöû¾ùò“»iI™¹Ô=òL9 ©:/ƒã\•T ^ˆ‘'fvBJ9!0•Œea^#7öZŒülJäNª ÐH/RÓ(Uóh]®V¥q†fskŒj€CSîÅŠ¡MÄÄ‘‰98:ÙÁ†f°«Ÿ­³0眈¨Vµi{À=ú±mw­ŠDD¬'º[UVù•¿^öµªÑi§Ýþ~ÉË—Ÿ¾ˆH­€šEKaù-—¬æ97o¾50´ä”C(û¾õ"¸œ$xô¤eawpÑjÛv¯eg¬ &î®îZ«iu"·:Ô“ã »ªz¿ÝE`ç)ù{Äð¢d]ÊIiß¶RJü^n@•*œ$Éß™yt̘YñrøLD^ÕºÕ±†£3Þ‰ª€ÈT8dÄ€!,Ÿâúà&sÊi¨T²jtgG“9•",žärM¯/‘”¿ÐËíþQkq"u…"™‘p&c$‰‘˜ßo›y¨4z €õ*jæª%„‹êF-ÈÜêç‰‰áæÆ,`„ÒW‹nµÄII:Åã\ d]ê³¼šÅH’âØ‡|/)¥Äœ®äæ^Ì<˜íáÖt32B’”Ùö­ÖêfXHIRZ"7, `°ÅsòèÆäQDÊ @JÌœCõHkßO›D|(´QŠæU"‚HlÃÍ,BQ Ù¯iœúfvî‘$íFg (Gë–:H@ÑÅÙ#›!†DÔ@:ó8ÃaINF|ÑŽ¶Ï©¸šþçì'f¬Lû÷7 ¸»;Ç 3ZZ:ÌE¶»’#rÚ/U ÊQ_0Y¨Á ˆÑRnMžìÙG¡ÅäíB Ý̧fG´êßÉ6è5¦œ<ˆC¥ ¥­¹Q·)¼ä:¿=4øz½Œ†¢{n?#2¿F¸MŒ\(°å€]PÔ È:à‘•qÁñ„vw"á£áÀZê„b* `iHÓ£ÕÕ"‚D­ó«×êv ÇbZ™$ÆW}žõ' fmNîV͉0@œs^ו:¿ÖÚ-ómÃÄÓ åÁýûð"vpwmÑe-arŸË„ù„%‰|–ÈúõrSOáôYÞ?C ¨=N§Ý"å,»Çç`Ç{?ÚƒÚµ1Œusp³¿A­¥·™öưÅÔˆȬ†PmMõ¥V½‡y4O´kå$…‘ÕY~ž×<Ľ3$nzö:ðQÝ[Þ1Dêí8Çé Ÿ ÆÇ™1ft íN/µ5;ÈÈãA8€æÙÀPJæÚ£!cºoLK{ÐAª 1:rós˜á3aê|i:é•„µù!SòÀñóèè°ÍúƒçƒíÇñ‰tú\?1x>70µB8}’’9†?±§!œúðG%ç§#£?(ÿž!ÿ9s\…þú#žÿOc3ÿdZû¿ˆ;þOä6þiÇøãoÿ‡T §‘ÀXN%m;‡hõ=Á‚¦Ç:Ÿž‡ÞiÔ ½©¶ûtú·[‡ïË<|è|Ò–T+½íó2'ðXrÜÇc¯Ô³Ï.ŒiíÓ0{ÎÁa(ÍW žGù¶Øá4 ð©ð݃öðx˜œÓCö,¼yÿ‰@œÝ|Û·Ÿ.ËëËË~{'!RÞ¶[©ú"—œrì“ð’^®9ÿ¶ß¾ÆÆ@ø^÷˵i)Ö°dd朲î{À>œÜ• Rª–ºÇ’½”’Âæ0BUuQwa¼¼\¼”jN Ô¬²²kÝK¹—]”ßoïjšSÞkÉK^RN’«ÖûVÉñöò¦fÛ~_×ë—/_X’š¶fÁvÐÂŒØfàA ¶×Z)QÄñ÷Zb]»‹H¦»n‹$Éòñm»ÂRUï·ðÓ PܵhBv­Ffá¸â×ËË»~Ûnwrº\Ö”ØÌ„cžBªzß¶nbjwmÐ`Ôt¹$üíý¶Ýï ¾\/Y¤šE½±“«kµzßK\“ꊒ1óšÓ’SQû¸o_oï_¿¾ûÛë%/Ì’„MÍ]«7U57Õû¶]òr¹¬‰ùÝîZuôn™Ù¾ײÝîá%§$K^Ô,/ëËõ¢j_¿}3×——W–u‘œöZ’'‘œ.yY×”Q c·»™q­*"ñjÙ÷}»ÝnA«%÷Zt}½¼¬‹1áýãÉ.Ëúörˆ’2qZóeÉ™åÛÇ·J{Ö`ÈjH*Iòu½ÜSÚöÁѺEÇmaí1Oôò\­9-KÎ)ýúU÷}ÿúíÝÝÂYjÕËå2!8]ÕŠu—mß]K™áq5E8$/—‹ªI8ÞLÎO hƒýÐÐ’úÅ0USõK!"vªµ¾ÜM]Ä%gÔÌ‘¸Mx¢ÈTͪª‚!HM.á °b¤ 4ÔCo0Ü0ÑšiŒD‰›(‡(Ϩªe/¡ñD'Ðs3"fLsO’šõb4‹®8™ ˜SÊÙÉ¡¦®qgî6âZm }æ‚3úè‚ܽª;Ñ|0€ÚvõæÌ²×’s®µ¦$jVïÛ’’šn{ â¾m—u‹ÑÜÑðPíÔ‘È[ˆ¹K·³1cY/˺–²s4ÕŠ‰=¯^Dœ±ä”RV»‰…™YÈ××õú¾ÝïÓT0ÀÝóº¬`´æÜ*g–EÜ‚*tŠDÄ?ö|‚w\µ(¥(jð¬ã­©ZâEÍ©·z§X4ƒ¢¹‹»z©eÉžss8eUµë)•…"‚°ãu~‘6æÈÀ#=àÃ5‚¤Ô[‹¤RJí$áCÔ0ÓZ«0“9ªéÇû½ñÁÜ T¶ O¦¦Ë’·ý]4láØ]xç]Â\jUÕí~Ë)›Y©Ê dâhà~ ©.œ£ýÏÃ#0°è`ÿ·Á£ƒÑó*ÆBCì´N`&3om01c7#PLER’”’Á0W0³ð’/qm¹»ZÚk…Ý£>[£æ¸yÀœÕ›¿5$ÞøË½•ëþ_ðIQB«Z’z3hŽh»9Ö,Ö Éú{È¿ÒTªvD´ ‹×“ô(+k’Ù Ò?ºgƒ¿ç]#š’Þ{N~È#ÎǦºË`Éía8Üja ‰aŒÍkºa‹é‚“u†º¾ÞQpdÄm(þIpÄD+ÊlÆÉ@= ÿ½ÔOocwì.š[§Æ8«]Ä4õ~7bÆæm²{ç¶·ðÄáEOÑÆÚ6á®}W'%¶Ûu‰ÈZºv0¿cŽÒÌm ×dG‚Áy8pXLD2óÁ2…#DpîÈÖ>‚øèëAê¤r03$%„é"ÒGqÃ13baaS‹óB©þÇÍÜÝ[ž ~ÅdË=èêí+ˆÛ† ¢õz´.°‹A”k¦hbj¡Íiz¢š=D‰ý˜-±0«ÖgŸi‡Õ؉M2áûtÉçŸ6âA‡|$„=¾œùTüüHj-œûÌÇK­>•ÙÆ—¨ŸˆB©¯µú!¼Ž Y¬²FWAÄjعÏ/ÂjÓG Ò; ¹ÅG1r»S3tšÆÖ­âÞ}Ñzä ­è»“«h´Aôß>kLg{“ÁƒÁ†8@önƒ=rŽ vÜûâ•’™º‡³‡{@á˜rpqR7t¯ B}¾7³¢Ž“bZ,¹%‰Ý#¿ Ç1òßQ‹pÜ"p–´F!©7p¥ƒÍÆŒºc.BjÐTšÝÏÈ0ùÜñ‹N°Ͻ‰.é“á}+OsY÷AmûÄ韰XÜO=lÕÆ->„Ù~çŸ †~ mŒ×1«Ÿv{ÏpM_ûÀòGÍ““šé˜bœZ.¦ƒˆGJ»ŸÆ ‡àÒoÓ'Ïy%û˜^ðÁefÿ{½Ï•%-qù¶hͳsŸëŒó;y‡­%qÈÆ‡/ÀÏÒ.žue¨&&z¨ÍœU  3|­Ýp>“ AG»·ÑÅxí'_þi*àsi°Ÿº»Ïj^û;sŽð]LÓ™S?O}zÓÓ4?À¹GAÄù½âÔ:0'CÉ¿£Ü(%|0ù#œÿ{dbœ›>Ëÿ°HýØýŸ,K ˆ:ÈïïÙ¿o°ÿçšJü‹…*>Åf&x¿ÿ‰|6ÀDu›Ås?¨gxBLѹf÷é??Æç§Æz?p·Z+ûŒI"lDæá«µ”Ó’3I/Ý©–ª-Šïî–RÊIæö²ñ7æ7I’Àæ®q‡jHl `ªÆA@göÏšÑøM >Óî ÃRw'gæ”…±l[‰[Z«Zu§RK)%ç4ȼA/ ‚2)í¥QêÀ0Çôîzañ.nîûdQS'OˆÔV¨À¶1‹,)ÐZSU­SŒü¾mªšR0îÙ]»¼‚˜¥Îêÿȶ3'W‘uY¢É5§ìäÙr|˦5~‹ˆ°ª‹$? .ÌÖÊ9[2ã~Û¶Û¾mÛëë‹j`U%òdBÉÜ…Ý™=²'ñc–¸Oó€²€Í9xàVÌ#Õv[ÒHÇ’2Ì:Y!‚_ÄI@DÕ÷moŸ€À)4ÁFݾ߷¯ß¾ýôöS47ÄÑ47aÎ)KvØ…Ö%Õb{)î”DIjªnjÆêÃf®­º9Øbø †™‹p“ü@¦Ë ¸¹K’D",jjnUÃh4”X…0 b& ‡Ã’253‡“ëò†IOL,$¾Ó¼»9 1˜Ä%%€ªÄd¦R%¢œ“p6«>јxºù´BÃ’(ˆƒpcQþn,522%   YÓt½™MÛ0 ïÐä¦Èa»›ÁÜx¬¶Â 1Гäc-Ør§ptÈÉPG›B8[i€b€(,çïв=ÐØï)áð˜QCsjí’Î]öíï("À]ÕQ8ÄñÚ¯r("£¢³h¼Ý[¦&AtŽaÁì{òÞ&Ú{{›@ѨÕh‘ dô.Ó67 ­éc Õ ›Ãä€ãÇÔ»Ðì}¡ÞbN£2Û[Õ«S$…ÎYÖ¾Vf©´‘‡¨µ5Ýÿã£êíÐqñ(mH˼þq8«kPÉC†=Œ´íÅ! (dF)1ÄÌ{7C÷V²¤6µócÎ@$’–”ªi´ÔöˆI°û¸WZ³0Â$Cè³nÖíë8GOã™CÁJ^5ÀLž{íïlW¸žÙÌ@¤ˆÒS…|÷}‚M’{üÁ>Ïp¼GHh.Wlõ¸#Ø1ÎÌx?µ°õˆ­í½½¯1>†ló5ý:YgwÔŸ!7~ÕðÏT¯Ï¥1LèƒÃÇeûhšugà$€¶*> t.^xT¾¿oïퟹÀýXqLÑÿ®EOrṑ¸÷©M Öœ”ùžÔû¬¨ú³Éا3ó¡•ÀTe?Ú¤qNœ<WBÛøöûïösØâGßÿwÓýÇzì÷  GPø?\²þLúÇg“È›8>Ì=½Ûp§P×Îm%˜µü^êKüûs£ :´¯´ ¶i£‰Œ[`_/pÓÓÉ@Üâà|”üö(r[¸¸=%F¬éÀé4ÍšÌ\8Šƒ1åND6Å;AÎÓr«­7ðÉuwªˆíÎùI|êc˜ct~6>Á™ŽÊ˜ä’¬{ܬº- rß· p ôBJ|]/VK­)%-zÿøð}¹^XrÊ»tÀ%©ªš†A2!3/±ŠÅwTvS˜ ˆj­æ–rr·}/¯Ëân»"º¬a¶$ÞÊÎ@’dn¬jÎ)å´•}/uÍ\j¹m3¹\ó’™svSÓû­l{|Ác¹¾\“HÑêD#B몭‹)‰HÔ¸™ÆWnåND9-Íí"5ßÊîFK^×” ù^pY¦·{ÙßoÎdæUëvßTU«)ŒÝÉ]Ðð««dgb`Su“¤—#/µîûÎiØ)`s £k¦ÖQÚ\@W"Þ^kýxoïËËõ²^‚=•˜—e©µ€³#|bE+;Ýæ¾ïµ¢ŸR8Ö¼ÈÞo·¯ßÞ//×7~u‹„U‡Ë‚5ô·m+VÆì„Ü…E˜~ÙîRla‰·|ßî_ûEîûV¶]«ïz¯ªÿËõ¿þÛ¿ý—¿ýü ƒ…Ùš-¼¦××W0‹ÙÖ\ɹÔD¦Ð¿¬høÀI•‹HúéõËoÛûõ²Æ¶÷ýßÿ·ß~ýUÆŽÒ©ªm÷۷ߘˆt·”X„úòåz½ì{!"Î)ß÷-¤Ò^Œæcç,`ukNÞNÁvs#ÿíã½TxYÖRJˆ>$†nyf–”I8KŽ-˜ª&–Ä*J«¼vgp)Vª–ZK­aUOI‚‡[kÝ÷=³SJ­öŽ98ìm#Á,IÌév»•rw'‘”$§¡ !¢ 8"Î"{U ›rüHá¸xÍà(µV-±?d°Á0¼dA"ˆ8…_Rݪz-ÅÝI IŒÜÕप¥Ö˜§j”ºSJ’Z ¿y}I+»NaIÄ!áa¨ç@xNkìýÜc2Ë Ç†ðŒ=u"ªÝhjìdÞñÊP3 `gQ ݈=çÄ U“©ôÏMï‘ÝñZ+(•RÖe‰_Vke3Uƒ‘/"1­µqó'å¨1Œ3M‚å¨Öá䔂÷p<ܵV7‹úhi5ÀP4šÄÓLTÝB9esG^T•Ü–õ›Ïí¾•²o¥”ªî…ÀK’u]÷ZrÊRP´¸ðèxü0sΩl{Ýéž6ÓÖôÀ,-9a效”UXš:¤lnóuòèÅÏ$n§NFäQªM™t„ëßÍÀ´æ…Aµ¦F)ÅïQî÷}«»ï8D«n³¥œóVvÄ|ÍÛ0LfÆ…*@#ÔtÿØXö”dôªêVk}Ü£)†»±“Yu:Ùá(åÊ|“sÝÂðž„Y)yuUµ†éoøf¤œSÎë’c! f¥ìqkR²–P«¥¨mDÏë¦Sƒõˆ‹Áˆˆ‘Ôkx¸gŸ©™+•xõõ5Òס‚S¡æâ Ä]rybFÔh 륔áÉÆ1 ~LÇýÊ abs˜#†ã‡Ÿ³U~Ã݆×#Vr vêì2·ÆXñ¨WžœxB°øÄ†í¢oäŒoRœ™¤Aý½µÍuÏ܇:¦­yÆĶû¨Z³Ò¹-r4…v”“Ç33ÕVxc¬C‰ë½¥BVÛ'å¢ZµÑ½{u5Ðoë ÅÄÔZÍq(ãt&ÈbzhFE›øÚŒboãq<9FváÁ Úžƒ}Ò>I­Í…¢ÏÜšE'½¼ÿÀÇ^²ÃÛE ’RRÕ£>½e†f´ÏãWØ,x0^Äo±qež^ bøÒî@„pÃ4Q¸ã~ òÐüYýïÏV/¥Z¯š?ëÏæ¦m0¬úbâv÷Ž“eÑÙBM@øŽòdõÆÒjqD_súù(ã‘Sï³ü€0šª˜ƒ®?–+|fhÐT„Gb Ëþèšb§$EblÚyÎõ] C PÌÝ{&V;~~/c°ô|œä~r÷õÄûxÒ©…Z÷uÇá°Í7ö$yÜ9öÓ|k’þJ̆Ç'æåé{‡ =)¨Kð4¿þs°¦‹Ç1Ä$§!}Zíü#DkLQQSû¥Ì-eFª¡—€à<¤çaÒLÆ\m<Ôh<¨^§ŽU?åì¯,àDø·SÈÀOÓ;g‚Oü'†û‰_‡~ù0‡Q˜žÐw&sÏî¬}ÇRÞ£ÊÝþgõfò¯~§;˜*9Ný?¨ü”¨SÃ¥";ð¬ÞÁÐÇóÀã*DÇYsžøå¨|N<¹¿ÔéHd9¦ê§gSýï‚}ÎðŸßÿâ¿GjÿÃïúÏgðŸÏ§Ç³½ü“žð§$Ô?èÕú<ð¯ø½|ç[¦¸‹O±¿.šƒ˜Ne41Úk|È|Z?Äbt:=x0{£J7œ¬Ü÷o•þMäþC§yC^6Þ¸µ\nìeJ xìLúsÆ@Í4¢4öZø®Ï3&•ÿi.×HGÔôósw<â©?âǾs˜+pLÖŸÆD”R˜ºWbW7!‡4¯¹# &ÅÍ‚œó~¿³@ZëÇ·÷%e70“0Ð@ÕšmÜìBÙÈE˜;7L·4oËÔ ‘„sÊ„j¦fËU}»¾Är“Íö²ÿûÏ?ÿåí5IRµ rΗuýöñMk©HæµîûËõ’%e°›kÕ²ïEmÛîd´äääj5-ùår%›P)˜êVöpô$f!©š‡Aj‘ÖÖ—%U-g^/ S­—•€Û¾s û­lÙ”©—D£-ø%@I‰ÂЫm^–l _+œ!á0$¢œ”©7#No/ת–RJ’·²i­)çëåúòúšSjK^s&¨©ƒX8Ü‘ª‘ÛÀ®• Ò–æ¸^¯I„úâþËåU„þå×o_¿¾­× ª [@Ñè+,f®Zªi\¿Âéåºþí·ß¼î ³Nx{}»\®¥yÿ¶‹,KþùçŸËýnªn&Ì·ûm·zy{;2Ó²,?}yÛJùå×÷$‰9ýüõ—²ï9%êV™X=LñIDš¶N¤ÕJÑ”ØA—uÅÛ[NË’ÀàuYr)ßn_ß¿µbwáôúò’%©š™Õª7ÚÜiÉ‹Z­µFp°ºÈ9ï{‰MÇõòrYÖK^¾¾ÔZ|¹\”Zè€Ó¶-ÄŒÂü‹f²kÑFÕ¡í8™+ º[0ëÁ0³™ŠÄt©¹Ãí½)^îîHia6·jP`•!32õnA2ß³\‰Ü÷mI¹¯«C•$3ù°±f(¥ s›‡\ÛN¥ÝúÃÐkDªÑ.GÌLLî¾—=”\3g°Á,1ˆ Ìc§Þ³¸>gƒã!RcL2Ž O}ê ¬^}@ç{[gëæzeðèC'2P\Ì,Â'_-ª\SJa^×¥­¬ÔµUUK‰âá¸êOÆm/9%f®ªµjÒT«Cm­ËM¦qóº:òT˜|µfîCÖ0/ö¯áã±@Æ ÿ·K´ÁqG{$CTUUk0…´ªÖÚFŒZÝ=úÜÜIwsIÉÜÕtI‹¹%I‰ÓV·Cd!SN)ç䯯ªU$™¨OöFSiúŽ¡uÀ¦ZK@•zÉp"Ö0Û éé`a2#•RÈI/) 5ô,¢Tšˆ4t­¼0ÔɹC·ºÙ#—£µsŽ GŒ‹j1þ•n{‰ãQka]/I¸Æ œs>|òˆÆâ„@n¹·¡Žv;.®îÝf¸‰°šÕ6okG$k#¯µº[ÔÕK’6˜ ©¹½[ýjn"’Rs½ d¤‹¹oQS.Na™\–VKQæø™Ü¡É>•… ,†:ÌáR{ž@ÚâΈr.ÂÜÝóî‡ìd˜ 5näLBÍÓ–“i»dLeƒ>{pâB_76' z5ÑðÂy»1H;‡œŽY{÷taÓ’®]®B`/?ú}R)ê}@hÑ=4 ²N‡ï3T6ë‹VïÀžDÑÇ€hÑ9¹Ukv¨ÈìQ6Ìñ?çu:á¨Ô ["‹9¹xÜuŽxÜij¡ÚIäDŒÆÊñ¶¢1£A|&Õæ Å6LßÁ s¦öGQ;ŒÃß>9KÇø²&Ip6‡©žÆ½M|bVÑÉ 8Õ¯Áå7žÍOý‰ÄjêÁþ¢°šw¤CpN(°1 ®UVþÜBKcãÐpäÎD6¼ãåµyÁcR®5šÕcIÖ’ pŸ·ÌXPOü\Úf~hçÀ|Ç©wÙöš?+ 68´µ/tb%£È{’ÚÇÔy˜¿ÃK‚x`Å*îAãóoŸ\^%ÃùÕ¤ÀNØ'Ó˜÷>Üã~©#ç‘"î<ïÁY%ZÅTç€B£åÆpë(;²ÎgCX$ìðhtK5m·ÜtÔ³OY€ù¿wÖ÷û öÌ 3ÏŠU÷é7|µ£z*¢K}üÐÜ»kAj­¼‡Æ¬}Î1LÒ7=´A ¯{§ä7u¦NBð‘Nh1ŸÑŸ`LÈò£ƒ×Cîš~:S‡NºëöÀZØ7]r¸Ü_ s£†0ž/±|jòØG}4ýØùÿp¤ ¦ºñqvòBGf ‡g¨û#ÝÏvÝ“à=´míøÈÈwüÚ3ìÈäýy ÛkYŽÏû`ù÷Ä\œ“ÂOÌz”í¦cù#Šÿß­õÿè‹ý|£?«ë?>¦?x+ÿ`]ÝÿÄøÅÿņ?<Ïeãøü[1ûú'Û_»÷¶^0ê{´†žˆqÏñlÞ fõjcBæ£f¤ e˜áA`b ýJ#boøÿæuœØ°çœä,}nÑ-LLÁ?¦Þ¨¡íû`§)ö}êÁôl}šµÌÞ‹ÖðÊ;¦úO>§.L»§ïOd”DöV´nDf¦¨°£¶ ‹ŠÅëå’„÷m å^ʶï·ûÆg\wnõž¤¨¯Üî÷RjJY’·ÜHø¶í·À—õ¢×Ëõ¶m˲Lay¼½¼lû®UÉ|Ór»Ý®yá¤VÕlᔥm{j[+§œ–pÉ*“VÛvÝk!§¼æœ×R«º%N•ŒÝ˜9ŒÀ± ŠhöÔ–bÔl‰½ªå´Phôe¡VkMY^Öë²,µÖRjѪïºäLDKNj怙íÛΗ6 S7ò˜LAˆ£2Ù­½V¹\.­[Œ<”H)ÇœñPJŒšI„ùë^ªêËËõ/o_‚´SU#uJ(§hÞâRµZ46c]ÖjZjeæ%å×ëKNrߊ’ ¦u¹¾½é¯¿ýöÛ·¯ëe͜ҒCÊ7ªzl–E°³˜ºYüÒ½¨°Ô^\ͯÂ/ËRrb‘ZêSÌ ÄµVþ¸ßëíã¿®«iU¥÷ÛûÿøùçRËûýöoo_nÛÇ·÷o‰9笮äœo·ÛÛòº,kâæ0Ú÷’Dª[›ú’Ä–Ë")¥@!,ºf¶—’3J@Æ[\ؘ¹”²oÛ²,)%ªVU©Ö·aÛ÷œÓšòN5åy}I·ÛÇÍÌÒ²´Ž`s€÷Zk0£Sr”½xJ¢•bÌÓ&{Vkw…C˜Í™~]rÔÌrÛšs­Õ™/ëJîj8ò±aˆþ¿îqŒ{eº,¢B’–b «i5e'l2­lfû®4úˆ€óÒPõD¤VøXƒzsO÷,s|âq6U²önœœ´ªºMðØ\[£·¾“µâ’f±6d‚F!ˆ‡7–PC­ÕªQ±è]Üdæ5åa%¢¸â€VOÌŸæF'*ª^ëuÉHYÍê^k©µVáDlñÀq¶R[òAõ²^¾¼½~}ÿˆ-= .eÿöqlá2Q’t].—ËeÛœsÌ#F—­+SCý7Ó. HlhÝœAÞ²mpCíŸ|š!!‘ie摇Á"ŸìLRÊÑ5­U—í5r",²¨Z¨îþñq Àõå²®k›e BA°Ø«äœTáDfcï×=Ï]ïˆ-M)5ˆY)%Š@¢ÌÀ "@¬¼»úCh†lœö¦N¤jû®ªàeM9e"/UÍ,çÄÂ,Zk1 kvû¨U Í/@®Z̨fBN,n5@Ûñ`fJN9 ¹—ª"XR¸j­ñe} QEŒøL¬i(ApQw/…ˆÀÂÂâ40•ZsIÉJ©Zx5彨ֲS!S#Ðe]BöæökBÞàϨêÈgvÕ 6ÎC3¢VFhjÄ/[Kõ>1«6ÒÖm>ox`mÎb2ñÐc¿Ûzïíðâºw6üÑÛ%¢†Éˆr€NSèñIëfMÂFìîø¹¾‘»»Ru®g>°ßì3L£-“9Š{sGÝøáÈîjw×8švlθ U£“µ-ZAIƒ€EŒr€¼cˆhn“TóÆÇ"5µ¾÷w.FÂòQãf}èÓš˜s°µNKwgbW="½Ndpž!—@'ž]º˜«©úP ËÜä¹1ò´‰ ÛDºCýoð F´Ø»2â :àæQ6À$ ¬ÑŠ"ÃfÝåдp"‚3!1·1üƒ"Ôî¿­™C I’9UÒŽcB5è ð6€hǨuX@„·‰/nFtT=¸Ú›/¾)›Œ}”‚2k?'Žƒ æ ²D´¢'ê>á3ŸRÝÀ³á-†¨Zë\B3öÕýœ3rÎ""Ý[ųꫦ4!þ‰fL¿ŒµÙ¿q¶=·Îdÿ·ÖâÇ“‡ùH‡5„óãªïüxí6ùYËþ$Íb:›[+½ÉØ\«Æ#ÁçŸÓîT­üè£=ɧêÿx§Ì8É© ù¢:*ÚåÄqNÇòžæúLŽñ¶ÝcqÒÐØ’t4‹àèp©Æþ<š!–ÃÓÝë¸:˜5ñY@§ç^½¾°h}|˜4þ3s,‡ÕîðWÐŒÌ9ô ·ïÍñG;&Š/f«å¨^áç–Þ ¿µö9Ï9ެÌôCvÁ£âø,ãÿy}ô™0x"eÈý³mmwCO°ý7öŽÝ;ðăþ<Æ(ßÓ Î̪I-þ„GƒóÜîÓw?ü_á'ÕþÂ~àøš‡gC¸Ojï'è$wÿ=ñÓé»ü÷Såm«*À÷ÔJ<ðèÓŸ~øÓG;q{7Ш‰Æ'RôãLáûþo?ºõSÙßSb}â%ѰóN·|š*x® þd*ò¤RЩrOVöÓLÅñg´àïKôøÁøèw„è~¶üÝ=Àšt@Ï>»&?y…øÇ“sü?øÍÿ”UÆÿ1ûÿgo OQމoÃ-A…D<¥p| ï—Þ-þ-nñ¼µòM×"£'`üó´Ùï«ûcä0®=³mîQfÖ«‚Çã…O—R¸¢£pÏXŽš›€v㜞"™±rí†ßmš§ÄÖ±lž{†z\úñ“Ÿk×G÷®ŸþóœÕiÞª¤Ûý–WΉ)rÄaº Kß•˜³ð%ËÛëõ¯ý÷}ß\¯W0nõ.AN`f&ssJÄN"ºm÷mYòeYSÎ$D¤Þö1'ç$îTÍüöú¥D­.SÊyÙî÷½”˺f“_?¾ýºü†/?± 1iQ6 +VE×ËšR"fÉ©–RU«S•”‚ší@Ê ˜K­‰€V%É̾—ÝLͽ†Á³ñš›Þàj{ÝÛ6[MµjÝSºä%›ê^J)e×Ѐ0ÛšZć›õÒ­3÷Ý€# ‰ÒDÎä¥j!­µæ”×u¡j%÷½–ý^™9KÎI ⱕ7Ü5`Dû~WÓ%gfaó¸ S5OÌY²ƒyûòz½^¾~ý¦dn.NV¥šI¼j·,9Šœ±+ ø’×ýz÷õ²^1¤ªNTAZˆÌ5®¡uYATŠšÖ¯_¿é^Ãq䦒¥¸íû¥²ëe½\Ö%§Ÿþí'‘TK½^_œA—ëKN)åôöò²¦DnK’m¿ýöÛWaJ9± h÷íþë¯[.kÊœT Ì{ÝÁˆ“ê²frva®®Ü‹´úéK)åÛ_ÿùûhÍ ‹Ù²dÖ fgfRÕ wZlw-ãa•sÚKùþúßo·’\A9¿¦”b3-aMîÜTFsÙ7kK·Fã¶ðZU5R MÂB4§ÈõE8Œ”„CíS†ša²™[ô}tK`O‘û²&«J®ˆVΰ›×RRÊ8Ó@«ÃÙJ)¼. r–}²P"Ò„Žé`döØ|Z”&GƒbG1XÛºš3 ÎhbeøÁcgÚ…K7ÞPO\B {s—¶iK"JäΪUµ—!–Ň£j‰(¥D£Ä¯OZɸÐÇí£¨¢ìî¾m›¹§˜ösƒ;y±öc÷þòòzßv5c‘²ïaZ¾ßï1½[–¥”JD—õâ]ü‰ëí~ðúò:œÂ{Ù[zKRhšÀÜX˜k­av ‡ct¿üÐTµ”=‰¸{©%*—“÷:_ìVkµ. D¬kÔ1n1ðÛv»ß÷½¸û¶ïKÎëe‰îÙfä×½Ö*IKEä)KȤ#½ðh»ܬ”¢µJ/ç0³u]sÊ’R;‰û ÈX IDAT¬š·á¨÷4_Ü©¾}ûØË·åËuÍ–J­UÕû|” )±jw±2w djd¡TÈ᪕I¬=;à(g`$­:N-sµÊ TÝÉIE0f¤$h9œ8€Ök4o2˜•æYNìn ˜yÕÝL…E»”亅ÙIÈi/5‹ ©G$Hˆ„ÜŒÚsJ¤s Cí¤ò†nšksµáãšà¥Q³ÊlÜ=(Tª.‡‰³ ßk£}G]]ɢ݈Á”¡Ä!XÅ? †M„ŽlÑAnT89SÈhmÍØ•ûV@2x‡b={Ö̉Œðèݵ ÍíKâÜ›Ü;E'lÑØ……>Ìáúm×€iœ(º8cµÑlù>Á!§Ã¥IÄÑŽHÄbý€6ŒÒDèg&Ho]TŠy1‘)9Ù!Õž¦”YÇ.õaÂö1áŽ>Tgáh0õXQ›´©ƒ4…±+©·àV"k´ëØÐÞ÷9Üýžª¦ó¦3Ò0N 5îD2<ð{×Ƚ!·æ¨5—½š)Õß"K;ocÊÄœI˜*A¬U»³)ž÷‡0BËCŒç@5c€³ï; ›w0‘;z£À™tˆ¤ÇMu< ¥x Sþ¬;™`4k•4ññ ò‡ÒWŠE“Yÿ]CfHJsUÀ¸Ãת¥ÔQEÛVÑ>cQâEŽ'Ú¿hXæ³sǦž±BÄÜ‚VñhÊ4ŒG"Æ0ý©3?ªÆ87<CÛĹ¼OãÊÌ¢m«Ã>I;khÒômfýÏ4§ÑŒ=•íáVÙý£ƒ:R6„¥áoA!û¡O¾X†F’ÈŸ:‡éÑrîsfâü'r-mÀ2Å2Æ9Ö7.x=Ôƒ÷ kcrp7¤Àh(!•£Áæ¼üðƒrÓ­ŠÀÙ ?ŒáG:މæÐ3ûÃ`Ò‡ ÚêæÎÞ&‡ú® £G¨Ë%uŸˆX“F?Û²‡ÉŒ¹ÇsÂü|<9¿' Îu½½ëã熊~‚øÄJoµòÏoÚ@s^î$ÁÔèñ~lüШðqÿTR}Ö~°Æ]ït¦<ÌÒî/`Q|Lü‘4ó=“¾ûwÉGyùd½÷ß÷‹ûCÒás|ú¼¿!Ÿ]>éñxPœ? Q’”OÑú½2ðÃz8>HaôÀç÷ïÙœçþçOðïñô?kÈö?¯Òúgh‘6þ°ÝVNÇÿ£Ìgs<Ÿ…4þóøÿçÃùçåáûï?ú–a‹ÏÓÕiçÖ­ö>罦GùøšV£ÛNuIÉiÙÓhi\‹âéGv~P{q¦°nwkŸž÷^™Î}‰jÑo»ŽcCá­òy3OãŒbzî3 ›G~Ñ2û4æâ>"1ëñ“>)"yr6œaþÃDD t¿Ý.H+‚E7=½7ÀÐîeßÙ„§”Òv¿1óëë+‘תÈHÿ]œ3Ä$Èš3^˜Á÷}KfÂjDKNÅ•¯YÀ¨ê¥ª0¿½¼îuäìeÍÌ|Û¶ZÊÛËkO÷ÛÇG–—Ë‹š•º{Jåc¯÷š¦œ‘ļ®9œXF¦µšZ^s’dfJ+ìH L ß§Èë—×}Û~ýíkivàØýŒ„¥(»EoiYN8•ª¥Z5¥~‹\u]s삨Á|cÍÝ€Þ̘°XàÄ™„ wNµJDUë¶mšl]VfÕ[ñ"Ìl«ÛûÇmY×Ëå¢Ö "#£¯qBZW–m¢jŠ$^ 3UÕ²ïfþµ~½^¯IÒå²EÛ¤“û²¬Nt¿Ý_–«¤äæ¥jÑ"]lj˜SY–eIùãvÛnªZa‹¨šûæ5R!Àa‰¤¼l·›JY/ëåõ…E–—+1–œ§X» °—ºä„e±a™1³:Z(ÔͬìÅÌò’´V"º,‹$ (oFk¿ˆ¬—•ŒÊ^Ö¼3³R8þ–”E]Ý)š]÷ÒbÃG6 ³Lío¿ýòó¯¿þüëÏ—ë5§”R¾ä,‚û¶›{Š<Ãû…I)™¹ÈT³Vk»ßsÎ̽TQôÏ`ñÆ·Z›ÍÌJ­­+¢µ0™•R«j¬bXØÃ)ߨ߅Úaøjä¦î^M!QdwO#ð’2‹°HbIKf6§”r)ÅÌ]Z{'D²$5DÕsa!Å ‡Ì\Õ™ëîÄQÍÚýþ RÛ»’#’WáRl›NÁf xBÉ;E͹€ª*”rÎÂÜ(ð‡EÃ-òAS"Z$­¼îû~»o¥jÎY$-Ý„ËÂÖ‚ØFÕÜTÁ`\.K„¾‰\’¨²¤ôòr½o{°Î¼ßoöaï÷û½lDt»ß·m#¢oï̼.KTk”ªEëšsô(.)¯Ë¢nªºí»™†Wµ[ÛÈûV„eYÕ´ázªÍ4ÊÌ-üÂÑÝ·’3ÄȒâ\»o›j öK «.×E±¢QVifû^ºlãÌÖÚÝ]F½áÀ¯´Ììv"_‡BÇÜ:3b¬•Rº^¯ä÷Ém7wKIÆðFXÜŽúÁHwm·{­:èsñÃ[Õ/à†:tŸî'¹)ªPŸ[‘›EyŒ íðmÒ§}¤´W#3SCê„w³^çøÁÜ` é”Y€!ïÈ&¸“Y bBtƪy©U$4UÁËણ2#_—% Çp®ª yÎ9šâîÁ­¹•ÔÍëhS$aëì£Ö‘X*U;PM@÷>¾ŠÑiWm|¬UZbæ±ôqUgáÆp7R7ÄYƒ;ÅÝ@r:™èB“ŸgÛÏÓasÅDvô†ÄóvG´ïõ¦Ä¼"w,®)wCLlÈ&³ ‰×Vyp°‡¼3ŠxáFЂW_µ¶üúâ3H‘N.Ì,ÜÔÖŸ6Û˜à­t„ÁÄÍQ׳»ÃÁÀð ›kkb4¯½\$ÚSŒ"ý2À 6ú±ú,£MÍÁ`ÙX±NÅ8¶ôGe¥Ohô v˜P_u(y£µ¬É¡ìq[%„NØÕeœnÎ8öúÞž™ÖúÎèõÎm1 -âc°‹WUwëÈöÛ»Ýãé°ïED$·8Z×`›=¨ÙçÒ^ÄÑ=7UÁýê#r!×hcòø$!ÑK­ÒºE¦eP«âéÊ@ @Df—»ø>{Â}¶Ÿ0UŽ1@ŒŠ» ßDg¢Xq㺬?ÌÚ4‘UhÔÿ> fq£å£zÜ€R£ÕQ;9[©µOÞÿPêCg?üaÆÐÎ3ë?ÖG[Ï¡çšyøZ¢_áɦ!<ë¥GÈIdʲyJ)üíFãÎ÷FŸmè(+7&˜·Ð à@!Íõ*sãë˜.ùÔ°ÜöåŒàÍœÏî¶9÷ã€bn’8øZýã:›ã¶ÜVüÌ«éŸ:aÁ!ññ|²úÈUè@*Å…ÐiäpúFzì´·æ©Cøh'>ŸóSÆâЩ‡U£¾+Ëãón—D/Ÿh|ª>²he4RZ=ª4)ÄÓ©Ø$ZF‹ÕO/ò9ë0 €§ñˆuÌO["f]ãíŒMšŒÏÓNˆ:£nŒAšlÌ€ûg‰±tˆ[úðOJf=¨oÒ0ŽÖåöÙ<Þõš“nÕûiNvHŸ¨Ô±&œMòð'™y”Aø1à˜"‡÷3TâàûOgíçðÀã§ç?ã>±‰úˆô!È$ÀúI®÷Ï$ìC¼Å³9õ»¿öÁÙC°ƒÆ¼>eN…S0õÁOÿ]"¼ŸI?L}„ù‚øAnÏ¿ÓÿWúñÈ>†þnaùÓÉ ¾7øñ,èz÷/~ðOÌççñ…ÿIþ?Ïþÿ¯úþãß~Ü{û?ý­ºk8ÍÆqÌ„} ùøãQ+Õš~iù‘'¤fØoé9‡31Éøæ9|7DŒ>d·RïýÀ"$εhÖ¨öfL·øö4н1ðÐnáNvÛkí>áÿLÓ•Çþ§cðü\ >ÝÒÿùü_/××Ã娳Æm Ñ4ï{Ù?n¶'æ,—u ðEJaý¶è0ê2Š,‰«jÑJD)çPÉÔ,§TͶmßwHJ×u]2 ŸEQ­V…×뚃íbǯ¿þr»Ý£Ÿ´Zùòåˆn÷½j7ç²Þo›¹Æféz]rÊ’8åä{¶¶ýhª©¹ši-ÛF뜜(±ä%ç Ž‚s^"=€¶Ÿef#Zóâjä´×RËo!©§”ȼ:Hœ‰ÛIç ãÚ½7$)ëa~h4k{-V³½(˜/y¡e)ª•bæUÉH%KöE«¾¿¿×²ÿôöS4m2Ááæþqß0ATu÷¥WuwÕ #h)_·í×oߘ`æäÆ ­•È]ˆ©”ÝÝKˆN6¸]×UMßß¿}”;‹ÄFE˜/Ë%Z%9ñ²f¥œÒ’íþaá«eÀ™Œœðq»i©ÌHÎ 6g­’/ ± çËõ%ü¡êV;½¿4g±­K¶È7”j¦a )| M­!*,‹¨ÖR+ÃÂ8ÊÌ^±•ÍwsÝwaÞ¶ ´®)[)Ú7ü6YŠx^ÄŒ=LlÒTu/EUùQ÷··—Ÿ¾ü,9¥”›ÔjUkøƒåJD¤ˆí½kTŠP«¤h›¨ZœŒ$’ÀÏëBFæVj“©‚¨UX«ÐhVr«EU+šl)á Ï, ̤VÓËËR‹íû®zcfND, Õš§œÊ¦[ÝJÝ_LÝ)ʨ •ª¥ìgdN<%ÊÁ…’Žn1C‘‘ʪ^55cpcš´¦R¢µª¹»Ç|L±¢Á<õ(~´.‘Àƒ#Á‰[—ö¬DôfÉ)DÒ­ÔmŸ&®ÝUÝ©T­¥ŠH’$2À@s7ª) J%'—œ®//Ã5!€%§”Òk’½”Rª»—}¿oÛ·oß¾½¿¯ëJn9/KN º®KÎ˶m5ÉŒëθ͚Y­eœ–ff³(–”lß^Ö•ˆj)¥–Zkd¡æXƒö‡˜E$õ^NRÕ¨>àá¢íVÄØB1 œ”*ùõr¹ÄwEkb­ÍÅgZ+Ýl×åšSÎN~¿o"m½µÂ2Ü;C9bðårUU­…ˆJ­ßnûV®—5/yY.fz¹®Iò^v8™È}ÛÝlsª•ER8É%q÷Ø5ø¯·;NÑf±Ô8™!V3qÕ£ FŠX „m“,Úq™“;±“1µöLwum!j  N# éÜ•4nتÞÏÙ5”&ÒU§ÜÈýD„vU¸›Y%‡ Üñq=`‘(ë.U1À¼S,ÌL«‚H“˜òB]—QÐâ8C~xUjA(¨íR`¼,Â’¦F0¨2‘†£Þ#¹Õxª kê¬ãH•6¾B[¨Þ[;jàÜô—¶64@Bh÷¡v+Sˆ«=,Þþ‹5¤Eõ¨“Ù›&Ò Û±ÄìÔ~näŽNVâ¸É¶G†t°ª»S”¨{Ä>x“\ÆÖµ´´ánCðµ[7‰ypÛÚìÂÈa6ôø.²aFKëÈÝÓ^s†¤ù/…#å^æ„x³èc,t"§q@†§UMRèŠ,Þ;ÕH"ê1¯Ö©ÐÎøxâY˜gÓæ±äk˜› • ´U¸Í!ŽžÇgæùˆ©DÊ2 ªÞúŠXrÀ{)UEx܈¢a蘵ŒÖh´¹Z 0ï¦DtÎWÌøØ(õÅà ~ƒœÔ2Z¤ Zå`ËL€!“`Ú~ªZkV±Ùï9Û ÔOÉ€1$¦>P…(în‘BˆýBãNÀg“{|}Ÿá¡qR'Íp;=2:(&(„1¡_xdü³®àÃ:0ˆ§>ç9$aãAÓ êF}ýàqñI’„2ýXãäÃtßK/ý°DÝ¢÷ ;3˜¤ü-ÃAmqCŽöp7p¤Y^ïgÂÙ4Ù]>ôýsX†‚>Fm©ÆxRŠq*zéà„S$‘GªêàÔ2[Ëó͘‘¹Ty 3Ld=Òw’æg¤˜OS¨áëå'í{À<Œ£¦¯3:wÿÆ–øŒ©CçÛ´NzÇñ.ÄPCÐõ+Ôg‚5ë“ú?ˆCŸ*Tx(9=9¦O ôìå<\—½T`ÊabùwˆÇóhªïš÷ƒ|0Þüt8U?:ž¨)öR©™úcgwŸaÕî?\ƒÎ·êOX9Gã"¾oV÷chtR¨éDE|Pÿ‡kµ;œ¾'íâü ‚>üD–É”íO‡öYëÆS:çDŸ‡ç K?K§ ŽûïCH†OÄŸô­ÇA‰Ÿ ±ÇI†Ydîó¼ï¥!h†ýÓ4èúCb*ó%ŸÈr”%szÙŸA¥þ>)×ÿeü‡ôdÿ£¯“úýÿaêÿ¿àtá©ùÈÿyŽ3Ò[ès׉R?!"ÇŸòyÀ†Þ§åAu¥l8ó€Úä Áóz¼ÕöÑ×A°ÿºwï‘I²=혹“™’ª§{îÞ™Øûý¿Õâb±t=%Eénfû‡¹;‘©ªêÇÌt70•”’Aº;çwFT¼­dšæÔâa+ìOl¦Ñ¹øœùBo>bnŽÄ}rÞà™alN‘P>†óQýwJnÍÓ‰¸7žnEçGyðwÇ¢”ÞÉ ø©žgœÊt¹®—e5s5«¥ºÓ 76ë j”ZÕ}©5çœ?}úòùóí~ûøá5XíDŠ ©«7>~Ã8&IÂbWgaQ3Õ½h}lÂ’Rª&^@äUë^v&N²Ä¡–m/ßÿôÃã~ûÓŸþ´f©[yy¹šÙ/Ÿ¿ ‡·˜R’¢B—õš—V6Iš#VµÁFÈ’rΛiÙKÕ")“; gZëý±µ¬¾Y«; Ä `gæ$©ÖªU%‘p¢ju+H¼®Ëe]““9mZö½À( ªj’Ä"î: ­/Z3KJû¶íUsFJ’D.ë%*gã{‹16øB.òØ·Ï·¯Äür}IN‰‘ªîÛö¸\.//WAŽÑ®•ˆ„[2{ß+Ë.`+¬Õö}ß´¼®/n¶»%N"IÍCL) ³gÉ6šÉ—¼^m}\.N¾×ÂRZ^^^³»IJF¾×¢nÄh½¢KZ°>n;Â’ï KJ"dZêŸÎK¾&’DþM ÂâœHȡŴVfXmˆ(Ü¬ŠºkÙjl`ö² ãòrýðúš8‰ÈõºÞ˜bÌHUâ×Ëåv<w^®/?þô£š]>}ZÒ8w׌uK5[Ù›†ãø’W3ûþçŸ~øáû°™ÿûÿü·O¯s’Ç^‹V«Ê">Yƒº #·ÆÔhò„jYÒ…@êÀŠØE1‹¤\KqÓüáCbÞ­$ÉH´m¥ènÅɵ/ó£öŒ f§È¡» N"í£Ñ÷a9 $ÁRNÀ äÀM€áæróÒ|©Nt»ßG¨<¯)˺×[)º{s–­ 5'¯12=ÖÁN"‰àìQSÄÖ¹Æp†Ä„ $»;¶ Ôö]ÄLÃ3ÈU§£ °oS«Ì܉ Vt¾¹™0D$‹lÑK¤Ó|/…™S<\èáuWE´@“ ¶­ÝÙ{u*G}ô¶—_¾|a¤É—ËåõÇ®ÚÀÍE$‰ä”ò’ÍM’0I&S®ZK-N¤Z;Á_×ËeÆ0s)›™~¹Ý˜þq5Ý÷}à•ã·§œ…E¹4C4ŽY;¹UóP‚x‚~ø%IâÕ=@.D̰F¦ÀN&ÌS3W-÷}Û÷´H|â#%–áí‘V€Sk­µæœ(§…2m{Øÿ³ÕÛíë×Û×3¿~xyÜ7ÕúùI",²^23Ê®‘KŠ˜Á wJ2¦e9%' –UUµò(iIÂ$azÖhís3÷jÊý¢6kßÞ]Ï v7Faü?22õ†½ŠñT¬E”ÜŒS­ª6>¼AJÂîH"5’½Â1uøO„XDÀ®`j ?SÓNdf@xu"ЭÉÇjªZ´¸yιÉ{ä^ÌvðòG]*‚'fî r¯ª×)´AäÖpWa¡DÄÂ1Áݘؚgæ&œºŒß ˆð~„¸7£;õ®t;Y8£ðøÇÄÁÈ%ÌÔjt0„ãk%œ÷Rnkëk —p¨ôL†¹»øÑé6Í(E½½Ld¾«6"@œÜp sÝ–\’ã5eœñ3£ßíê²6¼l1µP!£Ý|n^èÝA¤!7óX²[;ªíŸ=þ/úo{ˆõXIF ƒ£:` ­Cbb´õñChHÓz7Lú‘‘唈AÚf,ò6ÂpµÇtÉc¬À°0 †#úëd½Dp=ކÓÃ|õvÓ±Ë^S‘tÔ‡ eTë^kÔæ˜CAiG{䢞œ¶ƒ‘0IRÄ `cRŒ¬Õ ‡gjÄ¡¿ ÍäÀ¨¿W·>RBº#š00PIqrHäîÞ{z&4Èê8 Å‘ M‰17X´·Ö9øÐZ‡Çy®j ¿¶uìL» ¨5ÆËYiÃá§ŽÚ·¡Z¶yb¯{nS$†ÙÐôŽ;E˜l2föʃ¦ÈoþœŒAˆêIóiÁ>?fo4ÆDGÈ)nô'è ŒRÛšÎ0˜öd×o¨ÁÜ!ÖŸþ7›ßqÊQÒ|;|þm´ãl{?¢÷ÏŒ‰Vs2ù¢ïÑ:áÇ¡ŽSÌmïÍÇ¢r8ÜÛL ÏÅhLÚÞ$Ž}od§w:/S¨1<.óÀá¹Uø8Ètbc˜ºÇËàV÷çæ¦¦äA¥lO£Q,|¼¢©;FeÚ8i£t?ÊW:…ÉÛ©Á)õøäÓƒƒ>¤zsÏRç¹Ûcô%¢«Ï`íɺˆ§ãþkPðgÇ8h5Oíä4ðV¿¤'½Øß›r UßO\o6Â)ì„w¬Oä”S åݱÄQyF4û©ÃÕ‡dõFÙî_mXõsA¿Içh˜ýFe0¦,Ï•ïXÑç–Z§7?æ­N‰ŽcÂé4áwÛ‰Ÿ ê‡Ï÷)GàNošγ‘ÓmþV Äáïd=šàzS$Aß"oÁßï<ø+ÔÔßó½þ.çÂão—uÿ¦ýŸ¡Iû_üÅ¿s–òß5Àéù/Òõý9È÷;ÞD¢ðæíÞûr{Þ ÃÚ3QÈ s›æžöó7D¡N8´Ž_ —I?<]:0B¡É;8~XKïÂÑI8:Ïô´:tPPïißVUì]²G·ì¼92c¨Î§.ìî3 £xÌ™žÉJÓs xg60"ñ{Ç¥ø+H´8¹šÖâ²dbInU­¨*—Ëåå².iÍ"îþÓÏ?«³ïUU«ˆä”K‚ïÑèÜD´”R΋šç”j­JU4Ø8FDêVjd>uIywýòå‹»_Ö%<ÅD´íåv»].—DI]µ ÅgÍ9§D£ªá 5%PÎÂÌE‹«W­Ì¼®¥(§"$¦é±ï"¢µnûŽƒ¾ªFV5TD #O9±ˆ°´³ª¦k^×”ÈÜ ©™îš%;áz¹^¯—/·û^·øØ™z©²äõä)I\ÍÜM”SzY/½|1Ût¿¬×ËrU¯û^Çõr ÙÝœrÎ’’0´(EÀ3ƒcl5bi©®¾[ípm'JH’“i w5Í9_–U‚‹OžD¶mÛj½ò²|üðI½¯¡¼&NqÀ‰ÙAjnDYÒš2̼äÅGI×uýøéÓº^—„}¯_nŸ«ZÈ-+'f$b¼U%жÕf NKÎIöbKNaeÝK')¥ˆp’dîëeýôáÃ’òcß:Fœ&‡“%¦hDàÇv‡#'–_~øóâþz¹F¨¢íÓ«-Kj*aÎ"Ò ÎHœ^.—œÓÏŸ¿üüË/þþûÿñ¯ÿãOüÓ>}Ç}Àiª$äê¦F Ö,ˇëõ¾mµ }±*ÕQûfæF–D–”^.ë^ömßsJÕmß _ÅÍK)UÕÔ–$Dá5¶îƒÏNÝÓGç¼³ˆ”€½ÀÆœÉÂs vrUf!çª{üÈ8_™—ö5³š$!‘SfÙê^ÊG %6†ïÕj%fa" q?E/nuz[gI9‰pr2æ ðÿFFô $n$®ÎF­ß³£Ù‚#«/4§”D¿¤6oݶµÅócÛö}Ï963'"xÎffªM‰C&r&'áŽ!¬9‘™¦$îþxT¶ýQ«ÑÊëõzæËº¾¾|¨¦ªºïÛýñ$w5»?î1‡H) Qš¨¸¡b§”røã;ÀÌ~¿•Rö­ìÛöåë À’ó’Ó‡“H˜¹„’»8tJmôu’6¢:ÏÌÝsJµã‰Á"D^J—6À’XØÕâr“%ÅÃg/{­e}QuSõûã1wàÄcΪko¨ùUÇž-^³ ýñúz}ùðM’K^–œ·}'¢Z4,œUªˆžuÐSàq4¶!qÛB2`žDµ­JîV*’ ¶âFDÖüʇlàYCÃS(8àªVS3r‰¢Ã(n!w‹ˆ#RqÇÙéG‡¹K=­uϬ”VbÁ ƒ%%™¶‹ÍšIL©}NŒ‰«íµÖÇãnfÌ2ràƒ\׎3s¨fc·ïæ¾_³R««»P‹r6ËCs 7F ¤æ0¯U9!”³Fth"8-‰; ÏÕƒ×Õ²™èx~t·µ5°“*©:Qt«`ôRvP¤…<^1JòpÄ×;2«±ëh‡ÐÈÇ IDAT@ûÃß/³¡ÕÀÍUº¯]6ÝÎÇÞÓ¨µãFJ‚(>§í}#‰GFŠª*ŽÞòáÑoA4jÂж»\nf'DßÎv÷kŸøX϶»,µ„lü2n«Åjý˜Þû¬™b‰)„o¶QèIDÜ&,dæ,ô9›…b$&"×Ðv,‹¦Øÿ2QÔ-p³èDGÒ¸Ñs_kJú ¹©¢íÝ¡‹¤ÃM©ýoXDRJ9gô>ØVâ³ ²5טÆq¸Š{æUšcºMŽ•¸ŸÍ§à^&Æá±u"Fjñ[1³l,–K ÎÉ™H“,6>[™pÈ‚ƒ=r¢¢{¯‚Q[4óKú=¦ ¤£D'¶®4›ÇcQ¿âI€>F}¼<¨ü4ñýçBÕà_dh®«U‹øsûô„”~úxZõ;v̰¥©À‘AdŽcÒ‘³è–mÄÓs4ýNZðð‰/xê=6¹ÎC_Máà~¹›ƒ‰ÁÔo‹n'¶+¼í Í…Cm½‘ÒÈLÌ 3üç®K×{{~ƒ£§ºeÞ¶3í§¼Nó†¹kwÆùÏºÝø¬›)pêíò6ãé…k|ä0ŽHÌßȶø(ãÉÂ÷EœÍÂqmGFmšAúl?JcßGÚÿJ“iŒ6ä47Ljô[ˆKŸ/~ÃÖÿ<鎎Û„?&*ýV~V”gO÷›ês‚°‰ß/$ú“H~Âj çùlé?XR§·>›Ý§WpòóÇ‹|S~üÜ…ß “§^¦ü†~ú7øÕ62]_xO*þ!ãn÷©ü1_ ¼¼=2¿wàçïÿMmxúÄÀÿžný÷Gøoתß%YýÖêþƒÿï¯ ZàWÿrzªâi<šmý‰ÛÖAax:E™fœ½H—òc!=6Q茓ÑþÍá»wr OSÜ»òš1À‡·¡=þ¢ÜëxÌYCó·±cÈX¥÷xA+8Þ‰ÿM çëØï`ô{ ‡¶WÀož+~dÁ ÇFa”üžÆ8‡ ˆ¤eYˆH Ì|ܵ$¸¸©šª×mÛÖ¼¸™›1³ª}¹½o«ªªœGÕenVCG clqsj V »ù|«~ùòÕÕ.ëÅ\òšyca^–¼—ªVCA“í*öÙš’›µÊ[àÿòS%¢”rZòååòu{ìu3w«f1,h|ò—ËE?}6­•,ü’ ¢û¶]®—îicr/5€í–8}xYÖe!bS«j"òz½^.—ïüñçŸ4SS}”»ª®—K„£þ7DjâEsN’./Wç”…ùËý^·»ÜÈG‡©™™ÿõ»?|x}ýr»íûžRúøú [ìQù²Ò¶¡)×Í#*‡A›Ða l8Óz½Ñþ€%§ùî#@Ÿoׯ÷­–Rµ$ÉŠj@&’ä,‰€]¿¶RNˆnC¢e¹‚h+»$Ïy¡”º,—œÖR÷½ì{Q5+{%hÑ]ˆcǹ,²äuÍ~µ}ÛÔÔ¹o~øþ¶\(Ëe]% D^.91J©vß®‡œD˜ÍìëíþÓç_~üñ‡œóÿü×ûÓ¿#¢Ÿ>ÿ¢æu¯hŒÛJu3¾^‰…a9fEƒ cê’–5/}#CNIÒ’Sº.×mÙJÝ÷RöRX¸ÔJÄ)¥âÕc ç‘QÕ†ƒøXãšš*§´¤œšîãdäH.Þ|jQ@×z )1`Zmì:ÔÍýfw‘\¬rµjº×Â"9¥%/FnNf–DL¤ÕÌ&fWíó]7­¥­8u=Å­<<<ûžÇŽ«’^àîû´¾àUpm°­ÅçkmàÌ$­—e,öªVUSÕûí–rnPì¾±¬ª‰%‹ô†Î6 'J)å%©j)E£Ž‚,¦˜?|áëår¹\´Ö´,¹c"¼.K|‹„Ž0Ì€,Magv:ÐÀ1*EÄÑ<¼ä…Áµ"|&ºßnUµä¼§´¬kÐ[c„*9-] ¹áreD MHHÒ*1âªB4{k½Îºç%gλ–ªÊb‘j0µÛׇƒ@Y$ɤ_x˜ãVO­A!|ñ¤Z‡î³®i]€JÑ$B—ëG"f|½ß´ªV £8‹´Õw ›4ç” *н½ëpðœ¤<ö¸W;19‹›G7)É‚¬Ö-þDLÑÐéfá`îx%S3¯UÕ˜ÙÉàèsÓ_¦ÈwÒf€W53#˜»öÒËÞ¡±x ±ž<ø!чÑL©Ü¢U©j¥Zk-Û¾×RsνŸ9> æ…Úì…ì€HÈZ¥jà8˜yM«{Œ5š<7µRm>VOh=©žeUqË[ø(˜%€ ¹Äñ±¶n4k]‡1w¡ž0ˆá 3#%æ`·¾bç6¯$o<Æ*:ª)z‹cmªy=:œp##738Aà3켩ê‘äh…j<šÉɼéÇX<@/fÓ2a€uºgÖƒ ÙT#v"Ž¡;ÕZ¼5ˆÄ ‰èq ÷®‡¾‘À›· ð:‚Ôߪ§}~y¨ Næ6À”í i†Ÿ–fý7µ†1÷CÊy™·²Ö ²®kJéøÃáÞøõC äÉ7ÐC¶îj‡òÔº7úeÅÜ$ÝAXyÛÆú§/zOµÆ~@\æ±G¯dFÇBN&Ú1]ó®¹Ï’«·šl\HÆÓ³eÚeŒ{ð·ázš»¢U 7Ää›v°ž¼÷`ŒÅÀÜâC3ÊÆMæ¸>§Ýfk|âXǼ×d;ͨúæx~~œ­úGkôñ.žŽíA’ ¿BWÿí(nD§bƒ4T÷S“³M“¡g w.¾í59ýùJG¿1=ïÃ;߯02-kF½Û¦³äŽÂø~DO“$ç™×­Ì[$®ÆŸVYki‚ÉFÙ©‘ŽruŒ„ÞbË$³:æèÏ·ÜÍ3‡ù÷IÚùÖÚ'ìíL‘Ç9 oDÜÃFÉ=ÞðƦÝõyŸò~Ò@ü-°þù¿ý ){–xq(6£/¡»óOøq%ök‰ÇQò¡Ê?©¬-ä2PºTÖ(õx›À8 âï ɳUßßêuo\¼í¹9 ô\°0€zþ¾Þî³BïG é _NbLs ïbð·áéê¥çƒìôkÚ%ÞI¶àTAûÛá—9¤àßTø·¿ó9²ð¸Å}j ~ àoiöóä ÿh~õ"õßÿ™Rø­Sýkƒ¼£xv €5éMªî:uoø›&Æ]Ó ÛûÔÙvÜ@bßÎ8=,Úêè+Fƒ®xØS* 盞¸œ^{ý‚sì ?ò¹‡Ë¾ŠñÄ›(l~ZÎ; &d$Œ‡ ‘¼Cø0±¼yFO‰¯Œœ–‘Ó\Uá”’¨ÆÔL­ì¥2j05´ù+ãSY ! J[8Ìüº®1ލfIäÓ§?ÈýVöÍÕ·ªÕBHss/¥–ú kΗ”敼ì5.éZÊc{X(À®a$Œ…¦¹J™©$YÖ…ÈEÀÂ/×ëíñµTu»}ÜDäz¹ÄÎùzY«ÖÛã«› ‹¤ÄîäF–ôòòz½^¾o?65f0í[‰œþõåúñúòüûÿY·ýçbî뺈°/Ër'UÔŒj­%"óG9öm×Z£2ÁfY/kU­äµì|¿›×××ÌÔLrÛl E•°¤Ì¬ C3ŸºÖŠ R» 5#F­5§,,fvßîn ªU-¥8]lËZJ)EsÊp/{!Ðëë¸ß¶ª¬ë×ë…ÜkÕ$Òv³Ëbf¥5/Zþüù?þãÿÛ¶íýßÿ럾°—Rk5Ŷï9ç8>ZëØ&•ªáõœµ!´ÕtÛ ˜–$Ìój--œRVÓ#“{)…€—ëEDîͬ†*×Eêa&LÈ`r÷Är¹\.Ë"ÄÕÄ’I’Zu¯{$—½0zLÞlß*Y|šÍ̪9³È!J®NZK2À…Áœ¸{íK­f@·h‹¦(J%¯ênÚ›†…ÓÒ ¸AG7uŠÉ Ð%7FPÕ˜dnhþv²æ‘}Û àúbî¬ÐÞ&dî¾m›ª.ë:P³]Œ X͒Ȩô&\™Hs3óå²–½þðãOî;õ’Æ%¯^_˜±.f¦D‰S©Eµ†$‚.­±î@$±á»Ÿö±áÖVÄf$bæ¯/^_öRj©ªúùó—ðºæE.ëšX˜ Äy{lŸlQDžØu¸O»o ‹Ï“¦0ÊÕŠ•ûcæ…×”—Q˜P5mª¹7&lvª·””Òº.fíö|ÓB ­%ܲ¥‚ˆ´jüd æ¶x}}Í9|/Õ¬¡pö}g¢Â,œu; •Ø÷®†[U72wV%†'fb.¶«ÛU.’„„,grwª1©Q†Õ 4fúææZD’°Dß(5ŠwºNÔT~ …öÔ•tÁ„‡fC,eÇ@Ûa@ÌÍ£Û[Ý£Òž™sÎÔns19 ‘ìãÊë0~F#ÂvªLµm†B-ãîúÆÜÄvøŒŒ}Ц†6d¾îF7rvî¬ìÞheÈ:˜r[pFef»kµ²n<¤!añÐÑ‹‡P¨€O÷®'·fꥌ‘Á§Í7^e[äqcýXL!ÃÍܼıºäÉw!Šôæéð7Ð@â‹´J["ëfýïœÛ‚Š,Ý\[A¡ƒÅÝîb±Jëºi «Ü0¤…£~"f{í°Çòö(1a‚@E.ʯ<²ŠZÉ\µzï«W3òVZÓÇ?=´ìõ¦Ñ“5ÁµCÇŽf]L-`Öa£:¸M—'XB½ã½)¬Ý^èñ¸ì—«S»w»ÍÑ!6f2r™ÂÎÝ–‰eÑöaI¹¹ÜghþÁL'›Ôà€‹C¦þ^sŸmõ£Á«ìÅÌÀœ’,‰Ûe6¤ç®bKŸ"—u|¥Ÿó‚óñLóŸžç~Ú¡þÓ„š_°‘ìöè¹ä¶!ËÚ¶‰pjIí?§¿ÂÑ4‹1¹ïúý܆Ö^Œ™õÐÀÑÔJtx绳¿ »nt†ÅpICÄXèþ­7(nìtj¦Q6 ëí>?ÊŠ&üý8³`Ï÷1øŸ‰@ÇToÆ#íæ4¡yu™þ Ñvà½ä56ܽïa.@nŸÀ1%š. šù6s/Bcåù‰ô2¿ë1Ƙ½ÿýƒ~4RÌ'—™cØë#†6;Ìû?FA#õÕcO(žþQUX‘Ž‚™SGüS'Tu4ýâÂ}ÈÁ„©?q{PäÜBüN¯2g˜mË Ù¸Nôlç]iÒi€œReÇìr:]îOˆ³ÔzêÆA†>±žÕõ7ÐéõŸk«Æ$£?5ë ûŸ½ø#—Ö‡~Z¼AüÏ¿›ÎÜx‚ØOä¹Ùhߡӑ-ˆ‡°ô3–Èßãp+Ð žÓ©Ÿ¹@g ÷T›{ÒýOöïà öÎò\3Ûçà}âò v‹¿ ¨ÇLÿ^IîùŽ„_Œ¶»w•kü]ô~Uï· ‡ôk`§o~çïJ8Þ4|ëüWhËÓ*ö|tþQtêÿ*ÝßÿA¢ÿ Ç÷7ÕüÊ_¼s§8?ª@Ã,)ÿ‘Ÿ%«âaœj-¸ º3zƒ@kåÅôákáʉן¼}%Ûv,îs¬­w ôî²ör¸[ŽÚíÚßé4éƒ9L5uÏÐ(Ájbܳ_>z. j9öqÍð¶þŸoqˆc 2†x.MyÂÝMß×_HR³½<†¡ :) °ŠðýþøüËgf^×%§¬¦·Ç ©\´ÆZÜÌSJkÊ|Y LUµÔ|ÿ0›EµãýqoÝ›ú¾ä$KJë².œ¦ñå~{”¶m/¥j½?¶}/IDkÑZóëKH]P°H¬ sÊyÉD¶—mÉyÉ 8qn;t?6NÚb¡X–%1¿¬—jJ %'qr3-Z"*[8éÍ]©öнk+q…H@R*àºíFJ;!—jjaÐv÷Zëׯ_t½²pPTêýöõ²®û¶t:}P°UÕͪÖZë×û#öÀݶǗÇãÓë‡ï>}÷óÏ??JÑjÂTN²\—…–{-VTX–%×½¨yNl ­ºiUµ_~ù¼?öBÆÝk%°,9QIÙ¶¯__o÷—uÍ,e/·û£'š¶õ×`ËÞ÷{¾åœ™™Ù:žw{ÔRíÔ;H2‹™‚ùV?~ÿóëý ¾ïYFêjÛ˨èt2½ouük D4öXM™k­¥V¦Ø‹ä"NIˆUMX@0×ÌòûcßK½?î»Öë²r´0_¯/^u/˲äœSb‚Üh•¢!µ£VûáÇÌøz½|ÿýŸùüùÿò/ÿ׿ý{J|ß·Zk\óñcÜ]$iªqÃÊÝo‰“CÍà°«×R~ùi×Ú6Æ’Sb#Õâ¦OK9¹û’saÈ˺–BdN¦ZjóËÓѪ‡¸¨Z FJ`nh U¯yYB&4×8®c)`ε¨š’1¹%NÌ@âZËC•ˆ2€$I˜<(×ê.h X=ïŸÝ"Gu7Xujªkh‘,ì²jîjf· ó$ NÑ)`m\œfDob'jßNoÛ¦ZÇ>§šŠ‡Fà8Å\jfj輊Ϯ6&¨9ç~ì›ºí¥˜YΙ;f„(ºé˜<†`{ìQä'í9DÂ",9/Çó’×uÉ·Ç£λ²ß[ä™B(gîvW凷‹x½‚ Öv]–¼|xe5Ýö}ß_º=îw^__?¾drBã <> 6T›4$§$ÜwU+uM«¡ç¥ëw]ý‰³ìNÕÜTÉmY/],Ñ”r­% þ¥Ps¹Æ‰f‰ €›ZZ“ˆ¬Ëºï0Ûµ*QöïŸaštǺ^˜!RÍtÉi]fι֪D¶mUMÝ­+(ëÚu»î(ÏK"‚’óº.ëºæ”÷²ÝÃô „ªáß6né7e/$EÃRóduø%ÍjXVý¼`f _9Z¬Í»å?:7húAÈU3†°¨U«np'ר0êc!I‰Á}Yàäñ6ÿþÅ&[e_caˆk‡¹8*íÉUk V¤¯®ââçèQ,8Œ£Ð(R÷B¿¸Î[Ey_©YO[†q9*fൎøh`¢XôQ¨’Q 9ub8ÍØG"XcË$¢7ækËôZé£õÒìð¢Ï§9þ‰É d¦ñ7š)7³ÿ,ÜÇ Á'lŒB˜Ê}3vû¿ ""4Q70¢´Gn¦gð‚?u*"(FÕÔÉ' ½Ÿe'àóqíDþì㫼ã¿IMÝ÷¦cšö¤`(#$‰Dy‰·ÒÀ®4ŒçÐo¸•ySÿôÎáÖJÐwÌLM-·RÚs%&¬Ìì <âæ†s±h ´é°*Ðh¯/&¨H›<Ý’ƒ3!L(@'‘ˆKÌÞ…húíd;«¢“§¾ƒþ°#œÜÜD-…ɲ¬ìKrE†ýà„ºsÄ¿|"!,“ý¤øwMp„¬vÖ¦ÛœæÇÓW1¨”Ú ÌS5¸;¤IÏý·£7øtÏþqŒé<Ã8ÿ' [úP™»éÞŸÊ@­ @vä#f7| ÂV ³ñ‹¼ÌïèÁ}ÆìœuðQ6àéK¦ð¦AôôÞ;†| Ôz\`ÊIL¿Àû”€ÛÜ%fÏ­‘ŧŒÑt<ãÙ4ÊâÕÅ¢Sj£ûõÖñÐ!f(ÿ0g´Yf?¯>Í{ŽØÎýˆ˜p/aïf< fx°è5Ÿ¡“¿Ï¥¨—›t½ýÀ±8¦ÆQ8{ }cÀ0Þ|AF qÞ¯y9—Ï >æv^1¹øïtWÏÀ¦ŽÂáæÙçí“Ë'±Ä'{ŒÝ¿iÄÌ4‡¿Ž«Ï' Cá÷Cé~«b6Éžï¹3÷'Òù=âC☵듙~zSþD'Šßj]'z#j`Äô9Ä@a?»7ꎿcÖí±†IÞ<•üœNóôM>øEOÛâFß꣦÷x<ßþª_wÎûÓ€è8Yóáó©ÅøÍÄaÎEMnX.œ~;`øU~Êý] âO¡ÿVŒÁçÐþ†_÷.¾Á ý}Jòß Ìÿzÿýïpâþi„zj=ÁoþYìþviÀ íë!wr7ùt2Ññ‘˜eõárb:jx½AW[Þ#4o-µÍ<òn„Dd iåjÎç¡_ã’=ññ„Çy K-‹ciÛ\HcÚKi¸-?SÎÚf€'æs.ml0|´ûž;~çF?û=ðfÖùμ&•R ÌR³,DØ÷ ꔓªUÕœsZòšfÖMK©Zµ²š[­Ú±HÊ|ºßZ«±]³,滂Ûcsò,²ä庾|üôqÉ™ÁÈË}ÛUAXÖ•˜ÛþÃßýúåÇ?Ÿ—ŒîeóP¦˜‹&Qµ½À4å////뺕J̉AîZ«©±“öÄ^Ôù]¯×EÒårÝënn„¨<Žåh3ºp#F@DbåÚzÕª¦­lšPU„‘€œs^ØŒÔ&9PqÔðæðNš‘HÊ’`öùË—ûcË)×Z)H—FÂr]W€h'#ÚöRJ¹ß8Úïh«û¿|÷ÝëåzûzS·…Ö0 CI(ÉëõeW-{Auf11I‘Ýt[6Ê)Ü\3±¤Ç*1„…Y¾Ü¾Š°ª8/™Y¾ÜoffnRª‡ñ¶–YœRt/w·5/©{µÌaðÊ)§$æÊ¾ÔR$Â_?ÿüõË×Z‹ˆè^^®×˺¬ÄÕMÕ¬jBUª{1³Ç¶¥”—% ³KR³Ç¾[oø$"‹¤¶µ4¹à ÆóÊB SuÒP^SÊ’Šùº.ª"åbe‹zÌ×õZU]©šC`¯dNµºíEMww»?^_?}úNݵìUÕɃÙ.ÑÊI€G÷a5ó”Dx}<ZmìádnKÊ{-÷û=å$’ܼº–m_—5v«ëº^hK¬Ôê^“ˆ9¼¸Á]ÕK-M:é»ÖHo0«HÍ”œÌˆ…E3—RÌJ"s ƹ»¹¸ ‘´ øz¹ò¾5Á$ÌŽÄD$.ÔŠ5-l´JÄDÕTÚÒÕ¦D NÛM¤”Së/r4Xxi›@J±×k<8€!ÌÑÂê0a¨)YœNy ‰ÍIMDK^Íi¯{lÓ’#W1^+S ôVöRöîV¦³¦F37¯×5îÎ)Éýë=Nó¾oí±.KìgrN, ½B‚K^ÜL#—Ô7ˆ÷m£I@éI:8ÍlVV¾êð4sÉ‘YQw€RÐåßù}YÛæDf´íå¾íu¯nv}¹|üðѱ¤?Ã8¬ª,tt¤>™·?ÅË0³ªÖÛnŒ…×t «©š©*xäCd]V‰koÛöí±•­îûWY^9…0Oó^ira–a””‘SæÀ…0ת¥*Ñ (mõÏ&Âf}!:!wnÔI"%¯«甯ëÊ.°FÀfˆ›ï¥¶Â%£]ªÌÅf.I^lf–¼ £iq"Gç#4!&†ÍDÕlÈ]Þ[4ÉŒœ´iVÕGK¥5.S5æöfÝÃER%¥^1%ÕÌ«º{)µí`0³[T †C•@0s0¹î£Ð‡þä°ZÕ,Æñh`c#'HN¸A®¦Á~1µ”¸ZMHaû‡““W+­?ŠR“ME÷v8,ò>ÌB©#"ƒ'ÒB׈Iˆane¹¸±“@0T¿øÅŒÊ¸ ÄáÕtðÐ FÝEZ3šLlvØr[5B?êÚô\>.v7PKC¶·G2Ó±Í\bdsç4±JÏaŠÕpÓ%Á<ê'‰HHÚ(½QÈ»~¨ÿ±6ïú¦mTÍz e°ÄòFÍZ]{WDs5Hx ³ˆâv•Å? Àäà³>ÀèT°©¢ézf&à³%‚iŒt†²æ ÚJ zì¨[ŠZø(N<é ¼©ú>T8Ú¼`÷S~x-£Zå$‰ŽŽR5wPݬêÑâËŒ®¤H,ÌP³Rk³EGãzМ&µöSN™û¶£zÀc†êM1$H)š~„â IDATZëÈÁ ÷s–kJ·>޾Yb–aF÷wÜ€t+w›uz*¹ ¦RµöÓÞ1MßïY Ñ&09ÝãN+êö¨3оùÔ°FÏÔ”xU>ˆ:ñ{[yö¸yøD9È7‡æîgúàÐDêxª;kŽò×Þ–¿ÒùNÈä]¸mKš7#c뻞Ø2GƒJþœc²A÷4a64Û? ë=Ûî fÁÈÙØ%‘GC Ï“Œã—~j@|n9ž²æs¸áÏœÓi²þôäíH4ïo§S*¥¨šVýðJätß¶$Ëoªëº®ËB½Ë÷BË6Áª{Û…Ѷ•Rö%¥½w×R~þüù–mêô¸ß¶œTýzÑÇý¾o›©j)µÔÝ…Wyaæ_òâN·ûý…°,K^VT-\™""&ZµÔ-°Ýeß_^^Ö,æNBWw2­fÅj0aÇZ9Ì>’$åT<2ß5µ]ÍXд pl*à” ViÛkT¹^.”,ÅÊY²çåõúâU{ ?ÁÌ›A9¶Ù ’œù%/û¾åu•œ…ÙÕJUN9QâÆñ0w6xY€j­Ý¨eí¡{q²%%Ê9E­kÊm a§è•„/9™p·òQbYóbIaÇ+¥šÚâ˾3O‰Í}+»šEŸ£™žD”Rjò(PU·ýË+½òÚËáç…#%Ys.ʤ&™ö½ªVfþøñ£ˆÔm_¯¯×ËEˆt2›ºz³‘WÕÛí.i7{I"ÑDW«ù’—0þ1SU‹Q`­µ¨&³¢UÀD®f-9v_RnW²Hö T`-ÌõÇý–sZr2÷R´˜*Q^˜!N5Öâß}úî~¿oÛc]–?þñO/×ë×ûh@uûM*ÀÐm÷ŽKεֺÝc·ªjî–м´I’Ö%;Õºm ÷ñãeY™Óí~«º­¦®U ÒZÃO'n‰¹À!•®[GjÛ6 ®A\)Å”ä Nª=ò,h†©³»Èy¡Zj)#ÞÞ>xåln®ªå½1n€E0»˜1¢˜Yš³´0X »¶Pƒ»çœƒå9AÜÌÁ§f%†v†•AÐ@½1Í'ÖRÕôñ؃6³ä<ÄÚí”9g¹\yÑË×Û=fF0FD­Bœ’t-ÅtMÀVw÷ v³Ï_¿Œ~4ŠŒáæÉ‰j;)Muî¡óÃv¨6Œ±¢ÿ¨ß Ckç/íHRþð1ü"”²3s­ußw¹pÙk^N‰Ý‹–†½&Róm/"í~†($ Å;q ì‘9‘êzS·÷®€Y÷y}ëf””rÏ×Ë`w‹Ë¸ì%À_ÇŸ¸”<9FâèÌcFÜênm€!Ìæ¦Šè`I‰j•’[–ù U#‚*Vë^KíVt2¸—}7÷²ïQY<šr™‰'•ªÕ¦]làTœ’ '€J)‹1U@RÊ4Ô/¢&¤ªJ´>䎎y»ZXÁ¬5îÌIjsYN“!´'vÓÔØ<¤-¯¼MXÈÜ22IkUbM4vØ©’‘Œ0Îv”Fˆ}41̹{m\ï”àÈaPso@’››k+023ÌÙS¸"Ì5Êc›B£ˆã^SìnHÌ™8Èû Š– 1‘«º«U"Q·£í“4zwÛ\ ÚªÒ£f¹ÕR5ÅÐ,š¡#„4èØaüÇdyì\iBMOªœƒX3›·¹V ºœo6¶' z$¼ïUk5†&iXo"…`î1Gâ™^s˜B[yµ«ä „á½°¬•öŽeýøqYFØ $1 ™‘6yQr[ütÕ¨÷k¢¥¯ãܹ$]®kgñ!a1ɨlnÿÖÔðƒsåà_EZ|„¢©ÛÙÁ³g}„ÒàÌC¦>žn ÉÔÃ-ÊàLð>€’VÝKí ,Qç-q:zŠõÜÊN½X˺v::’ܵÚ$6·:¨ 4PLOk­Së;ÆÔ¢Ý)œÚÜ§× ®ê¦­]6žÜ#û¥~èÚ< ÙæëîÞyÛ…ržÑoÅYˆœ08Šƒ!þiÃõÉÅ<'¶}Pø{£ÍÜ Ü™0½ë _Ó€Ùz?#]&nëf˜ª´ï%=öü„¾yrâÎRo˜9†îïg÷ëPÿgKêx/ hü¾ãüö£K£}f…1þ†¥ÑÖ„ñ©'­SƒòáÄ Úü7ǯª"ëó´#0AÏŸ$>L]Ù¡Mã Ø~üýèè—ß6xO¼N‚¼?iã>±b‚ÜœˆLü5*“{9ó’8ÙÇß»†Ç(áiú‘ñ.7³ãg‰ÿ.• §vå>ÚÅgñTŒÎí_Ýýég´™ÎS¢2~ à|­ûdoöw\ÉÇ?uQ¾ûýGÏt÷d:Ç)𵔄ip2üÖ™FfÍ_5ÆÿíöÜà{º”0±3ŽÊäøö÷t¼÷5»³N(zÝ<ˆ˜ï˜>Ë–ý-ã©|xxèÍlGëÈûð}z¦×7¤ÖùoH‘xÀT\B˜r>àG£ &öÍéˆù¯ ñ˜;R¾õòüorãûï¶ýœtù´eÿ[ŒÿßÀߪþÿ5¯àïÉÿñ¿ñßÿ‹cŸ„žëD¨¯‡¦Ýw7ò¾ÃèwYnÊë@Å⽩œÜˆÙÍÂ6IçEKkî F2P·1 aÚœ"@a&¥£sÝ—>¹¬0g[L;¶em;Ð,iÏsñƒ7îæmÌç€÷@ÿÿç§ôé íÇd7ž¿6õ0?U­ƒR,¤o_îH)ø¾í·ÛM¯¯¯"\5œ,‰€¼.fÍ<% ¤Ij’Tk)۾߰¤†aawÿ|ûòçsÊ)-KŽX@^Ö¥”º,ÙÔ8‰nUD´•zK#ÜSb–% )Þ æ«ÛêäîÕ͘(þÞ® «©«º]ÖŒÇý^«‰¹ïµD Ú»pÈ\CTÑÇý®jªæuYÝIÝ ¾—½|½{-ûcßwUMIÀpófŒ2¢²o"²¤TY‰8‹8sN‹¹?ÊžÒZÍ-âØnN I8KæÇÎj¶ï»™ýøãOÕj)õº®B"ÜêªPb#Z/SÛêâÄ,Í[Xj%Ük­Û"É3¶d’äã‡{-·ÛÝÜîûc„pÃz¦j`8UWÖ¼-÷û#‚9KGDD#" ØØŠºHZ˜¶]‹¹mÀ5眒©E÷ìu¹8é^w5‡7qqY²šÕZã*ÖZ+xÉ N€ÔZÂ5T-4JAc/[qe„ËŒ ÈœZÙ£©-÷ÊŒee"|ýüÙ*©zæd¤3à1dí°ã¹{)åz}Y×5çÛfÔªm˲„¯Ö{ì=òOnnfabsS›©›óªU$-KF“,x]}ýòÅ3ì»û®Zј§PÕÈ+¤$Ì(µ.iQ+ìI84VioN¦ò¢èät+[J NÂ)1›ªg¦ª­!—\͘ŒœrÑêÝ)ÉcNffmAij¤ò¶‹>„Ã)Q c#¢–CjÊ,îæJÑz]ö=N‹H¨|€›UEwjv„ÄÙî# bD›E[Íœ Àͪ·™ÕZj­µåK¦-²w×ؽ”"È|xŠŒœ¸ã—ÍÝ«×Ðð813 ArZ–¼Úº,Kà2Z5bœGaê­žhv]YXÖe}¹^©:Zv"𶧉Yƒ$Ä °?,>.œJ-a{ÏÙ¢§‘ˆ^®ß%᪦fñ‡±OžÌݬ‘™nûÎÌ)çeY# Ç.¨A¶»ú³—=^‹š,LÝÉY!œâ…¥¼Œ`AÈ9f ‚œRJ9„3i­{­5}k(Mí"áìc›PÌÀ€Zr$ÇH£I»±+H)Ũ&ì¨·ÛæîÛ}ãÄ˲˜šUÝØÌêðÿš[‚„P`ê­ÓØ÷êäÌð¾o^«ª.K6†«qŒ©‚^ÕÌ„É\@ÂhÞX#MI©éÀ]”&ÂvW¯Äɡٞ×ÑEß,²½ œámV ¦à0Á*+[ÌEâ’ÀøwW}N©š¹»Âïi~eO'ÌBÔr¨Ñ^kÈf)HSæÄ]‹(d>‡un†š2xI¹»Âc"®îêÍ?ZVÏxý£Q*dõX¤Ù0xvÒn{onŽ_$7vªDpWv V’º¹¹4–%÷À¾Q‹CŽ ð‘áóæŸ2{ÇJ<«>sam‰¤yRnÀ¨Zƒ.ìÅ3¡kDMÉlÖ?(vÇìwÃs{ïF3=¶å6CŠ¥<üi}ìaÃ=|Ê=Ò¨š-6Àíõz†˜jÙûà‘!"rZV&Ä-êŽ̆â6¼«`0â}j)9P¤ë*…¢Ó]€¹•«R8¨º5P‰GÅ4OÆCk DT[`k` ¨/:… ì W"Ý‹¹Eú*V›"ÂÑS@‡¾©í€´)aU'ò,r“Û5f̰ lA6Òö)k2‰"ÖZu”ÖÒ¨]í Àc€xNyTpZŸÍ[³0ÔÑAÇ?ÌRämȪUëQ†öfŒÃ£Àv‚fFà°:äÏ, ç)Âù3å%ò žo— ̸²íO™iª4:쵺¥‹ 9Ækq˜æ@fEK…£þ »G”7Ã>ÎŽ[LÌŽe1rZ—ôñ»Oîþÿü¿ÿ[÷’;QÙw¹\†SÆÌ™‘„ku8jlrhl|¨~ùzS³m/÷ǃȅ$¥”™wU"RIµ>ÜWßK1ª³1'`äÕo·Íbc¬"RÐ"â€Î”.˺ս–L“0³<%IdYò˲üÇýñ¥ÖŒ(H IÜ´¡ª“š#ô}°¨j¸–EºÑW 8§´í{’ÔfKfe¯Ür ¸,kÎißs´ŒnåÁ|µæm»¶ETË"k^ªÔuIálN’–œ™¨xU·—ë˲ämßÈPJôKbþðújSÞÊîd+¦"L å²‘ºz5·º.WÍ»¹›Vê_jR ¹CÞ¥ÕªÕj 2Á"Eÿð=öÂÌÅ ³ªíµ)èë—/1éaB–Tkµ”¢^UD´j-Õá[G_=©™• òRë¾ï473­5lú–Òºd—RL= ¹¹«1Ë%/m 6BÔZÄÉXrcÍ+îÛ#I¢ªæ–XZù¤÷ÒpIò0ëî™)±;[ź,»olUÝ™ÄÜ÷Z’$„72¤ŠÎ¤bÄÇ8Fq-PÕ6Û¾S×ÂÂê'dj."M9h:Ñ(éjejVÕK)®ÎF¨äÅ Ü #ä¦êc0w§JÎÆÌI¤¹GÇ ñpа_ñëÔ–œ²$u£{ÞÈÑì“DªµTsW-fnj9K§x 4ÌÝ‚¢&©õ¬}øôaI™Eœ<”bëüâVozJv„ÐhÖ¼ócßK-U«õ‹ÙÜší÷TrÂqÓMÌEÜ UÝ÷ýq{¼|xÉËjæÛ¾]/×”—”ÍTSʶm{”Z’$ë…ææ¦q+n'šŽÀ±‘Þ÷=Îj«P>ôÂ9¬ëG¥NzEº‹E:´ÉªYÙk©Å»2ù?†84ªY’H’TµÖª!×qŒ]ȶJ†J-Úäp CY¸w²QÇͰ”z»Ý×Ëz½\RÎÑáaüÿä½[—ÜF–¥y.f<‚¤¤ªœîÿÿßzºgMU*%’î€Ë<»ÁÝIQ™Y½rVëAKb0"Ü8`¶ÏÞßö”ÉTLwBSDd$N)6êæ "¥O91R¤Î¼e\ëEEœ†‹[@Q‚‘BÑðë>úÙ§ WQ‹ÎuOÌÚ µxR|ÀÍÌœëÝU¨:{™È꽑0%"BSÓzð»ÎáÎÌŽ µ7)Îǧ®+oq›‰¯©…©9A 釘'f.RSbÊ‚˜ D£†91sJ91‹‰ª~T=¶ÅÖêÐÁ­&›lŽ 8:¸E©0(y \‹º'Z«þƒ‰IBRDŠ#ªµëÎ-Öl®y§¢£Œ`Ð:0îH4C „ðc?F§Š§f!m}9ØKh«xTkz­fÕ32~Nd½"vÐrTÑŒXµH#˜(P&Õ›#06U²zfÚ ÙTc°Ñ*(€¢}†tHu²€š¹Rýi²çPÜ«ä N÷âÔíífÆÑ8XOøjƒ#Ÿ5‚ÚïåóQ¯C/‡±2Ks€_B§Ã“L\kç† ·ö àµwçiC­ÄwÔṀڶ:´{·ñAk7Ry3xSÌŠ)æöm7QÙØçäàŒØ©¢96\¯i@¨öyDB L"qJq¯ŽTÖ>> ì»Ë37ÆGKjÜù½$@¶©÷ ÒK@TÁ­/µY{W ±5“W2`K%Mõ¼Øò{ãñí…õ&㡡ÀêœwFî½*©Ò­IÕÖÔÿé£<@?àó¶tjHŸQø¸`†ÊVl¯žÃMºÓRc)nÕõ2g”k÷µƒOü¤”gÉÍ}« uw™ÛÁÕ {Ã(NÍðýïœ/ž1ŽÂ‘6˜“Ø;j‰z© L÷Lœ/Å>ꎰx éð®÷ØÛþ¬[ûã ‰'ÁìÝ"ö·Ð’m´Ù¸S›ÅÍ?šDÀšurô;)¼5øuÈVAë7»ãøû¨Mö©¾Z†Þ_o'½}2B[l™ø.Ô=òPž~ïD :¡‹àÜOðäßs&A©÷¿œ„•I¡¡»pÀ|ôa8?i íóàO<úuˆg¯ÿô_?. âà M¿~NÓœ´ô³/ÓOnúŽ×›jàTìóœŸyêîá>÷E¾ßÑ&O·|¦ ŽüÆihÑŸ€Ú«™5žJÂçÑЃb5 Ïu!÷þåv¤ý®r»k€÷'÷\øëç± ÂŸàôüiØ¿ùÇø'X1èÿØ«ùÆ àû?àG=àpr„ðtÜÒÞò]{Ðø¥îpWS¾½$Ü–•‰ß¯WUu7‘âî>}ºl[¡!“ÃEõíve÷uÙ¶——ĉ ¨k¥Œ0]8‹UôÕa/¥ÉSŸ¨jJüéåÃËe3³]˾ ‰ùõv3ó¯_¾¨Ê‡ífRÓ—ËöÛíë~EÂuY—e„¥†"˲S)&„äµ½p^ÉÕYÊ™‰_/ë’@È̆Òàεª4$~­{èñÏ9oËz½íœ(Âáñ ôíý*b9åuY2sNÉÚ¾dÁ5Hô//—…—H¶"™Àa{/"q»×L)êŽ Œ‰úx‰–\EÓRJå`]Ù";˜”÷¯_3§r-c¢œ#`Gz&Àaâf NÀnv»î_¿|S—ÿº,벨™¨TdªIÁóO?2SYÄÌnÇõ8 #Sß)ÈQÀ\Ž¢`à BP𭯈2-?úx¹\¾|ùíº_¹Ej8#‰‚ # ÊaLkÎ?ü°ðã8`[Òayß÷+ €)Uù!u3QC*× 1eBwÿøá5¥àÿ†ÆÄDôv»G1•Äéúþ~ååõeÉ˶m^7^ö+ qâm]#÷uwLèá­S€Cdß÷eÉHXJÑ——5h(9@'Hfz½Ý®ûˆ¶eY—ü~ݽ¨“ŠRBBæ”*­›iIƬ] yIªBˆ›zCÞfÚ./ëvÙ–äèªzÛ÷5e;D)êM¢÷Â=€-Ö GÑ ™ä`ÌÕ’îŽZqé?¬Ê@ˆL‰˜V„Fxúƒ SUsóÅÎ @OU1sU ¿=Uƒ:9bÎ/ð/NŒ•_áPg]Žèè âxEd] ¶ºÕúMY×uÉ™)(1¤×¨B‰ûùqwÆœ—%cªÏžè ç”J)9eÎ)žqW¾¨¹1µ+tê|¯ò¸¨"ÔX"–zG]RÊDâ4¤CÀâ2_góZçÀ|øéã¶nKpÆRUÂÂ)ʉi†•€šq¦ET5LŽáÏ Î{ütU#wE´Q:M¬îù.çú½CKðl¥Dj÷íhx–¢EJà¡Z œUÇ>¦ 1›lZº9ÂJ˲䪹01ÓÚ> 枘HývÛ½p‚mÛ&~4ç\%”ó’31¡¨i• @+ §9ñDÀ5Œýªàž—i”RÎYUv½ûQ ‘RN¦¦ªîBXïB€å}·M=Õa]_hÅÇ8e ±MÉúÎ =DÛÆ27 0$r¨Sâ˜N™;JÙMÂÂcjÒ™ˆM˜õ± ÇzùÙpwRˆë˜(eNAÂj†'Ê^£*ð‰фÝMËaÅì0Ù÷âh‰8¥¤ÀÈM&%Ç6´ss¯ƒ¢¸˜­©íˆ±‹UŸrð#4¬ßUNsL]G µÀ -BT“ˆ3w|Øýª$ãIjº#6¹*žqñ¬ª38®Zià jÖcbeD;<90`ú=¯ÉÜDG¢V,ÜË«TMÍ„ëz¢´g¥B€«ªðUÉ?ýòƒ¹€ÀG›¦šÇb A‰Ð@ÝjÝ1ôFÒî> k?S]˜7½£Nƒ"Ä H jÕ¶ßìÖÝ«ˆuëæ3ʡڜÏÞ¢h\ˆyJke®žsjÏ»6@¯O8oç W©’we}„/¹urRMÐÖú^—*ç±ç¾5E-T7¿l-`Ý?s¦œVÛGa¢ªï¶½?O÷s¯L¡®¨wJ\Ï'Q[¥ A7UÓø)_CóZ©Ö,úy…F=ªwškõŒÑc~˧ž€Zq VM¦¸n q`1ªÍO]E$Œ”bv“]ÔrNä8/x™*ÿ‰(èÔ¡P˜ß®o¢J>‚Æ)¥€¶×½)¸»QQ#"U€—Ëúzù°¬ aͰb^óº1%"D,f`FL Ñaæº-wš'øõ¶‡Á'ç¼mk•NÃHÌ‘0Äff„S­22©¨š€1˜éÇ^®·=BT÷ð‘·c¹lhhbn;"ÈÈñ¦d°P½‹É!åß~úù8ö·›1ñšsÈɘ)ê‘Mݘ(s ™ÍÉL|?¼‡ƒ#1ˆHHm–à螙к¢3ÿòé'U{»¾i¦°æ¹ª¥=Ò)_ß¿.ë„o×7aÂm½lÛò¶ß‚ŠÃÁwP2pE%N™™©Š/uÛéàæE •å²®¯ÛúùËUÕÛ~¼]¯/—ËËëëeÛRJR„˜’S)°fûª¹ƒš"¨qbæ…z"L(ª°­kHhÕø¶Ky{[–åõ²1'WCªûL7KµI5Ê1B¿p ϦZÈR×ë5>Kʈä.ñ’BV³äi]¶%‘¹©¹šåœ `qÀÄÉÁMQ«.ë^Ò"µ„­÷AFp)ø?ÅŒÜW9ÜâÃ熉‘€,è=†ˆáå¯pcÝEJ)fÀT+ª¦"!ªVY¯n™œPL;¿˜&Hä]Ó¿ T±¬ñ»!’ UâA¡ +bD‘ÐB¤pk~õxrˆèO¯+F fHÄÞ¯×Oé#§>²R Óh[!÷%jôÄF×𺬘X–5¶Á*êäÈ©P‡+®aß½ïu-„•œó‡×?¾2'U½Ýv¥ÚØ›1óq»RÔ‚REš0S)û®¦5y`VJ±5/žÃyશ;3¥œÝT$fN•ƒ‘ö`n"2>õ*ªY¢€À[?¤·ÅÜŒ‰Ûq®ð‡ „G9ÔÌ.ܺâ`B¤t°s ~ˆHTKpOž—ê-°nÚy{ÙRffŒºSËÀ›^Yêîî¨~2/åhTŠ“¢¦VôØwUÝ£Þ9™HŽíÖLœsjž…È)aÔtCµZf¦ñúˈaÎD×*9YO±Á‡‰øäã°Êk§z± ;bP¼xݬ)7îFäîQÂÞ¹|óVÅNZrÕCIUÅÊ1ð†€'B“r!€¶•\ÁŠ–"ÇQbôlÌËš<ôa"ä^ߊŽNQ{£Ú‘ Ô0 1C†äuò‡PëO»Æíí›[ÝÛ:À¡–ÁÏ®×8ô<¯ Gì èL$÷ŒŽA§üô:v¨È¼3òE7ɬ@5ó0¤¯¸Ÿ¦`·êÔñ²©3SªÜä{è 4–†S"%D1‡ áYDh²{¥WÔá1¶õ­™‡ÂÖû»\Ö¡7‘+ó:†‰¦ låÒÍʯ‘Ðjÿ8*ÖL01©è>×xJ8œŒD0ÒȳlÓhJ}@­Þ¼Þ‚@ÔyëÿÒÚ1föɉã~b‰e´)æ¦_ïŽ>‹É!‰Õé_O´ßyr‡¶Nõ m°áª¦¦ÔÜ÷oï3c?ù‘Íš"fÕ±ÞÂÜí÷X@½åU®þ)TÑUÚYæ†ÑkZÛj¨•Ïe« RqáR¹õ”GŸŸá¨Ú­œX¨ÄÍ2"³Þe}¦J(²jñöÈÊôd@ÿ›Ã!äÕnu%ÑHѵ·0ÿ`;"ÝV7¬m w*ø-ñ k^câýÃ0c—Î$–ç!€  õN‹>6ˆI;`ã[ÐfìÊx?“}‚i ØÊi³÷îdÖnƒ[?ÇtètñœÞ”V;€!87Óƒ×KŸ˜èç†Ü éÙí%>ì¼þd°„¸^ŠããŠ>%ÀÐïOÉ •jbÜT1äŠÆ¹GìÐ$h8¹æªÚ“ª‹wWÂ|ç@|ÒBpy‡zq‡Â3±ŸôNœ…úéöKàQ¾÷ìYÓ:"DyÈüþ BããúˆÐàT}–®ýt, –Óëô½cçßrÛö_7Ñ£N ù»ÆñžÂ8ϼ{àÏÿ]9Þ• L¿!DN“ÞñKžÊ¤8ôzìs÷{a½sø±¾a\w?OEΡøƒ8FïÌù‘g3>‘ëñNŽ÷óµt>ƒîN2öïþ‘û@œþ¬Lû‡²üsaÚLiÇ9üˆÿ9Læ‡fxÆÎýã €ÿJiÞÿžÓú¿e ðG¿ÀoÒñü˜éóˆ5˜>$i7wêOz¨³ðè¹jÓš´i Û*DnŽ·)%÷u=4µ!ÔÆDò³knÊnãù^ÖFÇ[Ù|¢ÍUë„òÐ|´½6²`m#;?ž¦‰ ÒwPdýKmÓ9 Üai}Æ€ÄõåÇmÛ.^>\.—Ø—’rÊKfOÀðòú²_õ¯*ú·ß+ÇòÓë‡)'Q v_â§Äû!}ß6´ŽŒEÊu's»^_//9g)¥h)Eò²„ƒ.ÛÅMEÊÂ9S²¶^¿\^Þ߯$åEMÍ4qFÒ`Í·ÃZÍ aÿ#’™© +Už†YJI]ßøòr©¹Z+#QCÀÄ,EŽýxyÙÜ45%¥b£ÝBƒ«‘ ð~-fN¦GQeâð 3aBÎ9»ûív€OŸ>Æ%#*Í «nf®ª‰jhª"âšóî j F©Ö(š*˜•c/Gæ xs/bG)´¤¸41sbwGHîp=öØÏ„ï~[¶Ëº¦”ÞÞ¯×ÛM?hURÝ÷RÚ2™ÑQ½‡‰‚{b.RTí².¦ZDc»–™03¾™˜0qÈ|K^Í=3å”ÜýfzÝ÷¯×«ƒ­ëv¹lZäëÛ)B@„gÎbbªH´ùÂ)…ñ¿G10tUX‚ËȉW&pß# BôŒJ !Z—Ì×rQÌÕý§f¦¦iãß¿ü®¦?ýüó‡××@µôûº.//—ÌÙÝw)¦ìjP#¦Ì¹„á_5ö×EAE ÜT4ÐçEÄŽr„tëñ1 6S¿M !WŸ²ˆ&„L,ì뺅L_¤„ûNT‘ê¾&P7C$3•"€¨n‡È¶mÚîœÙÔ $BK&ÛQ‡Zì>êÑÀÀ#eˆLAvGBvTo틱À45&tpq©7Æ–¬*åpSæÔ@Ïnæá¯v7WDp攉1ž0™YÐvÂÏ÷ù`!©¥&Wã¶­=ÀÐ-·1í BŒø¹J¥­ ³3s ºÒv-·Û~{Ý_¶f**¥±‘/Z˜1åÄÄFÖçÅä]®€¸#ÈDUEš½·mMñõò‚ˆ·ý&¥¼½_™À™8¥ ®Êi@QUÕ!Á8Wu†SbB²¤jÚÒ{µ1€Œ9¨§¤*¢²_¯A7gws/Röãzû’Sùcp²-KÈ‘ooû±ïñçyYó²®escc“½(²\+‹‚·îwÁ“©€@$Qu¼ïX'1X%BCÆK¼jµ&…b¿‚‰Ò¶™{q5Uqç^[Iˆ——-^é¾_EÛ£z„hªöƒê‚ªÖ*†êR¦È!RTâ·vt~@BNt'è¤uªïFÚê˜ÓºQØÐp@1jðÑ8ØXQí!Gí0'n(Ä©Gtrÿ4"Dknàï𹋓b~¬Ý€Ýn¤ƒ­Ô8æj^‰yj¦æD8ÅJÌLçB]wã¾ü¨Fã–?«Gfïy§ÃMÔòáÎŽ!%!"s¬mo†¯&÷3uæ¡)¸Ø9˜S1Ã î‡ :Ö%‰I†§È²ŽZ”v׫Ïòvå!œú°aUF7Ü•éVBÁ}fâdUǾïœ5~|¢þÏ£¢Æ÷Çǯ L}hC}!wêJösÃÞ¹œgûÀ´œùw®0xϸ÷˜WÈÐxBë;ܧ &käéeÜÙÙÛü‰®ø0ŸžŸ÷š¿<°tÎÍ»÷•ÕÞ*ßksO@ qhð‰§ïd9QŒGóú“΋¡%ù·tU?…N`³Àøð«ý¹§ÕîØUO f“*?tà~åÜ_ƳÍŸ 3F€¤~&ýž&ïvçç|-ÿãÿ»“ÙŸe'þ©fÿ?­kûߥþÿá¯ÇoßðO—ЊÊ?ÕÊÿ_6øÃþÿØàiügNk̼ï6wç?ƒ|ÛŠ¶ö®žþà`œŸ;8î$PU~ h1O¢S0`Åö P7AÙ8ÍÑBÍOÕcC}TËÒùîM^Ýc½z`‚üx¥fW“Wý]øP掓Qá>Ãtê²ÕžÎÅÓ|Ài*ö]L¯œPTˆÓËå’»µÖ3§è92S% -RÆHÅŽ/oï*¥{ÉT•‰N±ˆŒÕi•8{ðr´ÈV·dDtÇûu?öã(ÅÔDÊõzS+"O¹%_b9rÛ÷ÄyáüÕßT÷cyyÙ6÷ fÔž73•ÐVš|ÍÃ¥¨G‘œ8Ö1¤®ˆÊrÄ ÛwÅFÐLÛ ÝEm[¶œ´FÉ u>­ ..¦±NlWUK9©ÈQ®l”ˆþø‰ßÞÞ˜yËë˶©Ûç¯_Š{L2Tµ€»å0®›ò1ŽŸbbsE!ÈœnwtØRÖ"`ˆÌ¦LdºÞv¿ÀÂ9å…Ú²5efbÎüv½–RZ¶¹š¿Ræ÷[¹î{ ? ½;ãÀ܉ ¾ gŸ‰®ïÇívC ¨A8à >ø(¥lÛÆ„Ììf„¨jÁ´N9E˜×іĉȉÔl?p_—5ºÄŠˆ}X·_ÿ&ë¶^¯WI‰½ØMõ·¯¿_ËMÜαCŒ¤61­LQÌën ‡¤$fVš…Û²0Ó~€}ó·ë~}ûúC27ûË¿ÿå¿ýû_ÄÄZ÷r-x]/yÉààïï×¢ñ1VS¹ÞÞáz½Þ §ÄÄÌ\ŽRTLõë×/œò¶®ˆPT€™RZ—u5U^圉EMäðèie‹â `^T“ç´Ú»åœ×eõcØ:3©6O£YóR9˜jNIRrpƒfX.ÑhNLT‚À†"'q5N©GÀÍœ*˜z cM ‰j“·rbp÷Û¾kD"ôÆBq­ô~Q-¥îñRÊ ¤¦–:7›v*¶Ä½¹ù–(RT ™ú±ªºlk¥låéÔKbTY÷Þm«Ï)F›óË墯z”bþÞˆbÚ̆ڣÑu 0÷†M¨·iS Z‘º#Â’sÎK·šiÔæ¸»‰X-·¨ $DTSn’Jleã#ƒHïïïß$Lµ Óf5Ufv€¢¡‹ÿª—Ë+#©[)ÔÁ©%«úõzÕý&ˆ˜^rNK{LrÕÌÀmÖKƒFí5Ôóþ¼œàœ¨ö؇¥È¢–Û^’DKl:ÂõÖUa3Öàõ奔RŠTtÖ;síU¹ÝŽR„šøn¶¯€‚jšŒ¢ʤ&ZÁ>n™ !N\GúØ[@ãñÄD€Ô-Õ5M£ZóŠŽž™¶ÔPg©ºdXùª%˜Ñ£šbÕÏ40"9NëÀÃT­Á;lÁZÄsó3ù¦>ÛŽè«l§ñÃÝ\¤_]ì®IÙv^FóŠã§®ÿz|Ú-ÅÜ ZÒZ¿Eç2!¸¹6ͽíDGípؤN}nÓ6£u†ÜkEÚãÎÔöpÌ}’Šë|§#˜¦Ý<šbH€ÑŽåOakô)u’ŧìÅ#.iÍÎãŸé€»O,ï­µ¦·Õà†ÃÓÎH}Í/¡w>L ™w¿ÒÑGg*¢ÅAzpÚâãA¨nÆ; Ô]uÄ£I|ØÓÏêÿ#i~pišpÂÑ{Ç&à lŽÀ?1Nt§A=8ß2ü WÄûèþÎ,yRø}º@ïMíðx'êÈžQ'x5ΚÐô+ñ¾ ÷ÑQ;ƒ Û>g2ÔsG?Â7 Sç0š?õ—ÎMßq]Ï ˜§=Ÿ4?ž©‰~»²âœxb£Ÿu¯ojš~º2q¹øé›âß‘ýý”uÿ{Éýþ§±>?ú3}þ ûwµ`Ç?ÿã¿eÊÇ{#ùÿìŠú‡èïuéÿŸaÿjðÿñq޳Û*¦@`ÛQ wýTø‚<†œ'ûz7ªuUŸ&÷½!q UÁ0à=çKÁ}jÖ¥©sÀ¹&X§”À\œ¬øw%†ý“RƒÅ8TzªbCÛòÐ÷§Ç;È{~:Ay(8ùöõ3Ežµðyu:¤ÏŸ?s¢%¥"òéã‡_~úùR´TKª R251+VØ“Ð!Hd¶-Tñ‚¦¹›&ÂTÑÖj»pW­a:i N P°Ëñ¥ÈÛ~ýíËçë~S5"’R®×›˜Éº.?ÿò‘™( ‰‰Ì'ªÌD‚pê­…ÌU‹ˆ"¥¸¯©WþiÝÊ©Fý™šÕsÊîî ŽŒˆ€êžb¦ZD EÊþµäŸøãË+1‹HQ f¸Ñ˲Z¶·ëMUÀ¶ó’PtYWkt\3¢´†(YÊç÷¯×ý–ˆÜ¼W;…»IAјÐL„ÔK7FT„ýv(Ø…ª[ÐÝ™xË §¤®„,&{9ÔÔÀà†¿¬«™"€°æå²m9¥ÿç¯}‡v<ÝÞ›¹3ÓëëËMŽýº÷”7GK¤X­pžŠô -Ž˜ùv»…^ÃDq~Db®d&9À‘#i‡ª‰‹©’åEÖuýËÏùýMn;€ÓîÅ®Á]9XäØ?$½Û²„KÐÌDÅÁSL䈢b2ã¦<Ì\Õïv”ýÃe»¥ì73Ux{¿–råøüù*sÐß™ùß~ú9¬já²LÌÌ|”äØRЉRPU=‚éÈyYˆB¡fâ¸yfNˆ˜s2³œ ·uK9-뺗cY28X11u¢è äÚ£Nä¦q=›è!%¥*½2§œÒ!%¨*‰ 5÷”×Àø:8å¬n±áĦfà™ÁÓv½í™‰y´ p2W)bÝD`Ä™(vÞÚÈŽÀ Y[é#HH$63"63*EE9ÐÞDŽ®f8øvEµ áæX–„H‰9öÌ)ô¡ÍD¤¨ˆSÓã(„U‘ŒÒZ9ÊÍáårQ3nâ"Ô N5…i¥ jj<zä÷rÙ–œÿúÛ¯oooÌ”¬o EÒimÎÌfNLÕÆHjqìøÍˆÃ7[SîRv â>–r¥¸ýæ”c "RD€*g]TU…ä¶W{ûܹI)ñPSQDÔȨ"¦”£U¸Y\™É#N)119¸Ün×Ûí*¢ˆÎ9ª^©Í{t2âÓw”âZë7@ÌúC*È]æ†uV×YžÓRÛË#¸Ðµ«VŠàÎ47•^6Ø)À moÂJ¸\™YÞßßL¨§à½:âT9Y˜þª@poˆÉ•ÑÃEÛñ¬Ä(ûõjÑOtO”D\æ0Ö­1ºT+¢á¹')ðÖ>y–͵Ž»y‰(Ê.Ö¾Œ„ÒáêÊÞ 8â%8Öm¡äÈHG%̸¹ºKÊÛ’^¶%GUu6©›‹*¦Ø`2! ÄÅTÜ ‘£j \œ‰ÌÆ¢ ‰»I¤–j:f®[4o(¢©:8!#`ш\8Õ¦Ó¶fF¤TÔ÷hS f³÷®È:˜*7­Â÷cLÎf8‡Í¸(³5˜f¨J÷hÏÒ·¦ÆŠ´*³)U’y«ÕÅFân.˜Zä^'BÐÂÍ­ŒS]jý³*bwkz5cEat#mØšÂò. ÝŒqÀCf—`ü¨±Ý¨:r°S´Æ¨]bíJî—îàÖ·²›V&â0ÿÉèroEö»wwžvudF* ܧkÌÚÍl&Ѹ{À "õ  ß½9œ=æ=%ùDqô3«b†§áÉFù\‹Æ©Àñ,}C0ôj\ijÔ[õ ;`6L‰>JÙ˜PJþM ôÞs¦ŠÏ= Ïw|ø`ª™SµLÍÝ‹”Äéõòºd>DW ÷¿†¯È<œ¿^TEE9“šÇv–¹úÇ€™8±]8™¹ièŰêÎÌkÊU¯t3÷Cd¡üï¿ürÛ÷r;¨º‘{­\œz#ˆ¾AºlëËeûüùk)% ü dà)qZ²&f&dŽÞ;ŒNN@Du705•"E ½nÛe}ýºË¾ïï×#‡ëÙÌ‹rżzÀ|pI "rf3O”–u½í·Ì‰™™°‚¸B@4Ë)â^€ˆTDD¤èçÏŸq?ŽœøØã8)‹ˆaäu]pI9Vjš€¾ÞöCŠŠÆ3ÿ׿ýfV™Ä‰8§Ë¶…¡5>»9g €{¢‹2‘ªbÎ˧חËö‰i¿-K2ƒ›_“pL­ØÝ£,ËêæÁ©× ‚#ºC—1ƒ#ñš‰T6}LzŽ[âä¾.ÑDèà Pؘ¿îˆè@)³¡„¥‘œˆÉÔ k;!#š©„HB3uçÃ)«ÔMß"*rˆj09By´*Ui øüêú~½"Òׯï9%óK9½\6QS)Dü²]ÌMT¤È.‡šŠ”[ãÒ&¢}?Ü,¥´®kʉ(gtŽ‹@D»÷y >ZG>J©ÂÏ_¿.yùðòÑÜo·=´iFD„m][÷Ûy…ŒdS•Ƥ!¹±©¨)i”È&‰:ŠØüó¥ÑPkÁ­ö’¹î6Ó"%$Uᬛ5$jer›ªªÙ²¤È7l°¥Ä¥D‰t´ `¨ÎFœByÑÀI©©ƒ™iZxÝÖÈ.¸Õ÷¤¦îc3¶Ø³äaެ‘ªîÙ ¸2a¯¡MIM Õûx´“¶}^ÜÊ™8â#}„ ­+’™Ýù8ŠÔ )‚Ôõí†ÓIåÌœ †;®[hW­ÂWH„ Ödh3u¯È¬Ç%$B®]w@Whµ×Þ˜ãXsf€Q&÷us)Ús{„ϲ¦i`ÜWzÏP5–º#%¥.Wª~  QÔ#ˆF!(_•UÉZÎatèÕdÑ X   ‰Z'JÔ ‡UL TE«]·8w‡PuÖè‰D̼ô5!Õe“3Çİ~Æ(‡­1i¶G]´‡¸i¶«ìÇ;ó²å¬uåDÔÜÍHˆãºXM†³8„nÃZ»DÌ[oån×êkç×NPïZGÏÌ­Ê{náìDòè]8©fí“OÝ5Ì„µ°¡rS(ñh¡Œ‰=ù]Õ@‡ÿãIuê2Í\ãÑ:(y²ç ¼Ý‘†àÕJ܉.gÿgûQM¥lPoDboVߨ*ŒÄðƒ/5VµrÂZ<£$*ÈÊ»È62Hà÷Â߀œÄä¦)IÏ(cÏ3{3ûÇ1@¸‡ªÙ?8¥½°YˆÜÀ@=V;Ã$€èŸ§Ù¶ìØŸ˜ZÅd‰‘ÉÝ\¼%í jç6´®óÓtÁºË8Tøˆb+H)UTŒYW‰ÓÌc4»ô&ås¨ñå¯ZS"gp?Ëà>ú[üé^˜bO û_À!áâì™? õïÆ-S¡ýÁ¨«½»hVÆü™t?LòX@ø8J8ÿá½Ø_¬·X?õ¬ÞC‡f‚'¤¼O”Æ'мׅæ®Ê©·—TÝé„ÓÑðûŸûŒèwì£2\û»’­ãé†#D1¹÷ŸÎ¡çÌ•9åQcqŽ'»=Îþ÷’oOׯۣï¿áÛ“{‘Öï4²éÌ<÷ü? |—ÿóÄøý0^øv•ð“ÜÂùSþÏ”~ý©Eü¾ÜôN¿ô?¥)ûwTŸÒþôRú”Úý_ö•ýx¬äûi |2~Ä9›wV÷fž¼Kj5í»¹Z#.΄¿;¨ ëØñáã3¡®ª¨Ý1i BhŒçNk@"p4„4]ûÖ¾…ÎÅôA»…¹³ ëx Î šé¡?Âñ2eưñ‹Nó¦;øÆ ¥ÃÕî£4Â<>ÀSu$bF 550Q;Šø8qÞ禵€™ æ"BNì´4E$æÚï‹Îˆ«+e$R|?Š©º¹z1÷Ãàõåú®nšr’"v¹€¯@´,‹ª)D”sšwá¯Çݶe»\Šª&æ@m0rxŠÃìoàñßcɈ¨fªV   ºR¤ª¯·}YR¢8N€\Dv)„L¶dv%1q··÷wWç-§Äœ)åØwè¶£mYcƒg¢E¤h)å¸É¡¢L´pbÆ¢åxß‘xpwHÁ ½6ï­9oÛ‚Ça7)A0ê|ÒD”(9Ù¶-jZJÉÂÞ9@„|¹l!„…bøùëBJ¼. ¥t…‰‘4 `î»í>üòúïÿÿñëqÙ̬”ð(QÏ^ÇÎ2ÖUœÒÂì*)gü¿þú€'Bq÷”9$·°rä”(5>8‘£§œiY2|yûòþfRUñ¶_KI˲ÓvYÿ[ú¿BüªîoâúÄôÓÇ¿üòËív{{+EÜ\\U•‰ ¹;€_Öå0câ”ZHº×ëÍÁEä86õΉ×u5³ã8˜iálŠ÷÷+}y{ûòåó¯¿þº¬ËëË«ˆÄ"u[·O>¥%}ýú¶®«ª™V272±q77U‹1ɲ¤ì·²kš!!3§œ2“Zf„²¶^}ïë²sì~—eq÷]:¡!DDqA¢LÜ7TÀ9¸ÁeÒãV]Ùn)¥lf—Ëš]‹‡Ðå`HTgi H‰ÔÈ]Ô@sb ®‹;1›¨˜{€ÚGÅ™ºîE<‚Ñr „bõðju¦EÄî°]^¢n?Žÿù¿þï^ãÌÄÛº2sh0œxÈîL‰˜˜Ü!¥ä—mÍ)Y´…{UèÔœ‘´e›fŠq˜ãLD‰I :º‹¨Ã~YלÍ&"RÊaÕ¸kNðQáë•-ÖØ \9×¾ß*_KADÌÌ’E©Àqì9/KÊ}  U”øýëtFŠÀxMY3³ŠŒîèñ$ª3¨Ê Whï´°Ä„Á[s;Š˜):,9&x¤ÁÔuc‚§œ×eYÖ-­*À:>éÃ3ÓlxÐJ:Û½Î6zj$Þ—™Š4ÛcÄË´tO^÷æÄq›,EL«þõÌ2[­|wGd÷ÖKU-En·=3Q$¬¤LµàÎH)%trŒ9¸Æt6æjª@@ÈA 袲“ƒSÔ#·*ë(ø$¬yB Wq· LqèÑe¡Žæ**V]4ˆàX=QÅ÷•ÔÆ \‡0Ú3 &ÌÐRêð}ná"v¬0Cô^L úÈ3öNõ³ƒ@ R®¹"`‘ÃÍvÆ`{ÅK­²Lt·¸5kWø) !i æ2º;P£ð#ºƒª„Í8ŒÆ)Gï/©›š»)GËBlÀ Í­›LUÕôp74Q«1 BL9åœ{¿œ¹·.ž–vslÁ!oÓµhIA:™bâžZÅ&«¾eœ ˆHÌ12Ü÷½ÎÂS=ýCãlx”OD#ôJÒIÌjÒhEžmšÃ‰b=E¬}RpRÕk­{÷þcu“Föšê]×ÇØ¨•õÙPœØs´]êí‚~¼‚ OÅÅ‘¢abNóGT¦Â›·ÔÜÀ¦GÀÝ©”ð ¥,ö¶jºovœôNô˜ƒ@;Y1þ>¹íÛÛGÇ,7):nŒ¢Váÿ£­ ÓJ›µ¶çvçDw‹j†Ièt5oµ.}N1·›Æ'|$UÚÄâ„é)«vµbbQÇ£A¯L€vÿ>s®pjˆ ’7vÎIPn’gÜçk|·MNwÕZðÃæ³ÎÛ*«›ŸÚMg¨JÓßý±A·;c›*æ'Ì=6'û,ƒ·ÔŽŠúÔU¿K[¸­[òÍŒ˜Ü:üçn~ׯÍg­Ÿ—>8™Kâ íç{çoy¸ºµŒjfÓá”\éš»*b?1 Ú ¢ÊµQ‰)BSid½sýMÝ<ÞÛêM»[ÇLÍ'µ¯Æ{½†û9q‡@ïX!;IùpªN™ñJ§Råv¹»râwß¡çñ®™{ºqNµ¾O·â¹÷¦ÉÕ '4`2Þ ÏFa¼ó O}"x¯u>`ÑÚ°–„uµÄúßÇQÑoÄ-zXk´ç_„>õÜ‹¹ñcèxR$G•AcâüžÆû¼‹doݳ¦Ò¯cŸ}ëóóäIsð8ÜO¯çAÔ<ϾÛü,·6TÏÆø9†ñ,’ñ Æ>ôã¬cˆOˆ÷¾ý{ã:Ž‘Ð¿ññ79ÀÜÝ8_ÝøüóÏù†¤|žê4‘‹€ŸH—wÇÆ¿oÐö;#îƒcöüÈ·g?Õ¿ÏýyÄÿû3 ÿüöý‡½éþgp@¤Ôû·þþwïN¼ÿáûçÿÖÓà?­´ÿWÀ•þ…§ÑŸùê\0\OÊÿQÒGBÔOÅŽŽ‡×à°!`ݳ¦ùã#°¼=Ÿp¾0Êꮕ¦y@ñ{+Ž.a,zÚ\ß;Ëg&5Q{US•ÐúU7‘#5€›¿(4z·Žh›ùcþJ§…û™ ã#3÷¬ÏU¹š¬H‰€¬MñÀÌÁj”SN&*&u©ÖZ¹˜]µ¸ä¼‡Êƒ„d Ž]«¡ß-磔ý¶«ŒÑ"jæ/ëEP–5_uÉÉÈ0åôry)R¤(…rÊ?¼ÆÛ;Žòû—Ïjƈ"¢’Ò’z@•‰ÈÝÜÈ#ÅÜŠ^ÍÌ™)猬fû~\0åÔ¬7Ñ ƒ˜¢C"€%SŠIUfDBÊyÉùíêEô(¥6 £3'U3qµfzÊ9'fjÏJ5ts}ßË nÌáT5r°]v8ÝÈÜÌÞ¯· !bZ&*ª?÷R ¨3ÀÁ+—ÉÍ.— |ýúårÙ¶e#æCu/¥¸¨‰«ÇSŽ‘¶—üðÁÿã¯sæ×ÔFƒ 1„3bÊB1â’–eYÜ,1—CŽr,ëªn¡âÆu¬f¨àŽíÄ¥”ó¶®/—í7þ¬ª ¸g_>© G§ZâÔp1˜˜ƒ£*zÝ÷ØV/9—"¡¥º›º½®@T37 ©-y)"u»ˆr&¦è0`bpW$b`(¥üöûïoïï¡°‹Èç/Ÿ#kÂ)CJy[V&NÌK^ˆèãˇ”¹îQ½ #qõMLjÚ‚È –¢eßqÊ91&Nz”þÓ”³ˆ!YæÎq#!˜Wó)Q‘bnN̨È'‰“¨¹y¨§˜Ò’»Zauˆ1šƒ©nÛàb ºF™U¶l¥czVܼ¶‡‚Y4"¡˜JYßEG¡!*6ÐD+L'sÚá§ ,¥”sr3;ŽÃܯ×ëQŽý¸–«ÿ˜ˆ>}ü”s¦ÄÌœsÞÖMT÷c_yÅ„9- åH™8¥BvDr¨ÕµÍ™8_™“™u¿èHÈHîöŸ¿ýñÞwc&¦‘PÉ9CÈÙUQñ¦ž äœk©r˜=súÝMÌ®×÷ëívÙ”_¹>xÔk΀‰ˆÞÞ¾¦”·æcæ „G©FlÚ£h×ÝÕˆ«еÙ51%^b ­H¸l vG(§H’Hq€ÛíŠ/——uYïØ`•‰Îi4˜Ê­Ã8ÚCf®Ç–7D`æ¶alTU«”@•MÄ©öK·ª‰zcI€ ”x²j""¦”JÐäPY–eÙ«+73)ÂDœsæ%ÂgA@pSW3sÓЩ¡þbÆf„ÎÄœ#ºFQDÙ€Là@äÔÓdqÛsˆŽ\±úh@ ø ·®QwG~çfç‹¢é í˜ªbõ S‹³‡HäFZœ,oî€ÎȉeŠ6UEÔÆ˜ˆ¯­Z7)Q<Ä´ó%̺"Uµ6¨V Œ¿!8%DäI`§ªf¡VG¾ 11!yèÅfbfJH=ê„æ "jÚÄ2 oM véÊÝÌLDc0 ¤Óñ#]«˜„¤æug"N©‡‡BÝ ç¾ÝB&‹+§”Sªíâ­½ ÏâZÛS{c×X­­¥Q <ª&+ÛëÎÛU‚Õ„ŽAþCÄ€ÊyÛ¶S·•ÀÌïl½µ„‡bfq–cU=ñ>À±ÕqµÕ3Mòc¸¡»Ó4J´('tuœHPT·UýóÈE:!´Í /ÅCè\‹“/w^M7¿©zˆܯ/aÚ®7Ù„z<¡¾ëÚc?¿;rbl ÷Zˆ³¢¶™¡jZš^s è¿—ŒwZ‰‘†ý+îjf„”× éê"§yCûÔOòŸã¬§W:"ˆµi@x æf‹‘ÔG˜ú´ëä­û&»wÈvéœ"K#:]ÑÚVGÕ¢ßE¤wêó´]œs›ëóD{ã)Ýí¨"-ô(Wµ ´½ëZ!Þ}ܧþÞ®eµíƒÏ1¼ú'7ú(®óo£<Äi»Øjî,ÄõM…±¶ƒŒñ¤µ#à=ïS쉌?i}ñJ´–Æ{¯Ó>‰â-_A š_s6ÔGy…εæ)0ÑnO8O@† 1•êR›ŒÝÂ4FmLVÚÄå®óù„×'ºÉƒ}Pdp-tÒÍ8P¦7º»;@Ýçž\ê›øöÉà“õ»L첇Ž¿Gå<<ýÈmRu{â7ìà|-ÆêCÓ0S]ÉûÜ&€v«îëëøÈÏÀügþá9tôûpƒ»?Ñò¿%áÄ™tÇSxVð{§4ÝìŸÈès«ìÔ™ëîÏ~ßÔ˜p"MD¥sîŽËtÐôÌrÿðíþ””=eüñRòï |ð\gzÑ{ü¿¯þ;½2¿ üÃÁųKìÅkÿó_ÄÓÿ¡¦Ý¿Sˆÿ‘ÇßXú'¨ÿþÿ3õÿ{ày.tgæ¿/pˆœ«äqóN3D‹[w¤nó¯·àHºw žâ ]å7 ®ÎŸÁþ½Ä«g馵ô$ô‡Ï%.^¢‡«®Âg͠ǦŒ€‡ÜA½ð_Ó¤doÔ…u»ýY»÷Óx› 91Y¬ÕÂG‰àöã-€"Íèê!BQx¿Þ.€¬DDË’cÙÍ`P4Ù 4e–ÉAKAð•—Ûí&‡FGcbzY_ ~…¨aÜ3+’szY/‡æ¶ïG)&û^BÕ€}߉yÉ9xѽŸ º}¦¾2‹í„ªMªº:¼¾ßò §^‹9%pñ`‹š#dæuÍ¡…¾@iÉ¢&.h@HïûíÓ‡¯/ÛûõæÅÜ,0L¼¤ ¡õ"‚åHù…9ˆçE„9/9S=йÄÖšMá8Š»G ©™EÖ¼¤”oÇ‘)çDT!¶„nUX^òrGQY8¿lë–·ã8¾|ý¢à‰óÂ벤ð!§”2óç¯o_ßÞþ×ÿøŸÿðóç/aû""4PÓ}®^¶"¼ '¥o?uÝ–E¢ûÁSbU5´•V"Zóš"Z&ÚRþéò*·ãý8@=Q´dPÚ÷}ß÷üúBŒyYªç¨. T¿|ùòŸÿùÿïü燘ùu»ÄG+QZ–¼j'üÃjcž·5Rô‰x]–ý8n·›š­9¿\¶£3[–ÅÔ®·«ª^¯ïoïï9¥eÛ>~xI)¿¾^2ó¢¶,ùÃåå¶ êÑKljè–8ívˆ5ö2brpuu5GÆLI¥H9¤¨oÆ@ª ˜‰ÅTŠæ”3“ÙQJN‰˜ÜÔÒº9¸”˜”Œ†ñUD C'ef·”V&Çëõ" â&fznjû~-º&N¹[Å*…œ¡5…ÖùŸjOWÆFYA¸e-dñTwôÈ¡—«VDmÀ©ÌQ¥5Ö:’¹½E>}üô²m¡Î³Ìé¶ï¢ˆ-3½^oǾ§œgbDNœs¾•]M1¥…—”ؘ/ë²^ÖÅÌÅš,^7‡-Šåc‡d Òô&í;^Bw“y¹\è•¢þ¡Ú¢î¥|HNÈ¢ E¢6'´ÜLœR ‰6n\LôûoŸ?ÿþ¥ê¥™Á€‡¯ÍЬ«˜H¸á˜)Aá3¶ÿu/̉Ûd½)´€]4)Ðü:¦ÖÇ›™»ˆ!¨y)Å[s¥™‡åì]¤«“K¢œSˆ¼,)/·ÛÁ™RNfî‡!SLƒÝSJ‰SN" ÁÜÐ ˜8q­bDW)¢Ò²ÖàF6EÔÅUCôl œ¼×>§´,ËeÛbµd ªEµ6²Cí†Z²2J‡Ó·™ˆˆ‰°–„BÓïh”B‡âÊP/Š»WqÔ¢º æa±¥îqhî]ðÁ¦V,Cã|5Â"8Ƥ)»ͬ˜ "7k {‚cD1î>åL‰R€¼D¤^*VÕ'7U‘#JfS?"vÀH´?GÕDöjynõÀ´º®´¬{[%¥Ã`DµDÇá³õ²ÿuïÖIneiž `æîdä¥VÕC­ÕÿÿÍC¯™®‘”¤»p.ópÌÉÈŒTI=jI¥ eN§Û ØgïoGL Ov µjœþÑÛÐÎÕxfÅ0!â#q«"ÀQn:dDÄÉF.÷ñflX~Ûobá­ch%,ÝÉ>rº½ý5„oê¦ø©ÕœŽ¦‰Ôs4 vjrKùÇì@}ˆÝ±Öw˜ˆ!­w ÞÌŒÍÎÊê2yL U@ݼÿÏg·òQeŒ³¤)xÍ÷Hít?)#g/õÅ7㈫ÎÅg>Ué"x´–tS3 ùQ†6ÉB1^9ÖøÁ^ìK)‹òdHZ¯îh2!ž $N‡Ä$šZõ<%ÞÔÏnƒëÕÎF‰'qΙ™‘S«š Üèž'U8‹DÃ<<°3Xd£º =Ñg«[~ð À>ƒw€æGRͧña.‚‡ÇXá8?B¢ÆI02mxp2ý!%Ÿ+šû@å©8?”ýM޳ßÒÏo?ÎÛ“ü2‰z-Ê'öå>j{?B “|Õ4—3`k½k–æåxW6 œÏ9ŠC[ö'4úp;~*Eúìpô™m0¿¢7ª¡û§ùçZ=âg€Ižêçáy\'ÚÌq…ÏLé~Ôè85ÄaÂ?”ë?QNÅâí“Ç'& ’?gAà³ >§ðiJòG#0‰µGÅ,~fR 8Nÿ÷½ß{öè> íX>þáóù Ô~Àó<ÙIZö¿O8ýäXþþtäõêß95ü_Êÿ`”ð›üé ‚·¿ôÓûýïø;e÷j}ð¿^ýïŸþÜá;£Ñó=tüç£ áÙt1ÈtLRû¥9›ˆ¦ôÖXÕà‘œt ÑÂ5MbaС=§»è°$:p8l¸©[ÇŸyXa¦€ëšÅ—µÛ"bÀv;9îÛæY "}28sý>ä®>\&}mOˆçàÖùöÙHçØ_ûò´,«úº.fVê>ÂÝ„Ü ½\7>.jZ2nÌ¢*"ÿ=-WcñHÌ̘òB ºY­BäDôþíí/)}y}©Ö¿Ád({©u_ó¯ÿñË/åöZk}{¼—mÿ¦ööþ~ܰԒrK|»îÌ\—%§4—ÍX[ ™™XSAÇ‹ÅÕÜ/—«ÔšSFL9ënÓ53qK€ªPkUB|SÉΔˆù£l±‹wmøeUUZ2 ä”EŠÕZ„H¥–*„ør¹†ŠqY–ZkÝ· ÀL]µˆ0!#>¶òØ6Dd&"ŒªÒǾ?î}ß—œºæ#-ê)¥PåcIWbZ,íµ”½Ü~º2¥eI9§õvUQ Ù €ÿØw¸¬ë·o¿éÿ¥£]•ЈÄÜ3óír‰‘#0ÑJé¾W0W0cB€†éÏëz]¯»”QÉp´ÝÜÀxI—e©¥®9_¯7‘ÊM‘}M« ƒ ¾ßßûãþßÿóç_~}½]›p©á­ÅÄ Àþùg¢_k­¥3KÌ×õ¼—±ãRe"*µŽw’(¨ˆx½^¯×µK—Ë’sÎùv½ØËz½ïûß¾Ò’2"æ¼¼¾¾z1¸G|¬yÌÕÔsÊHX?§€ IDAT¥¢5™†‰Ôâßv½\Ü@UxYÜØ™¡Ù ÜÜDÕ¼¥ÆnDUbß¥î¼æ×ëÅÁUÔÍ©Kõ Gucp¢Ì€Õ+¯këBq+¥˜(m[SóÝÁáë·oHÖË-U6¨Ux„€,DÀ0>Ç)‡H †„äÖÅ cbc3õ ýŸÉÁHbÑ(ÓâSÛÚ9'|ýév»]·RÍìº.‘ö¹^V³e/Dëí…_^_™ÙÕª@`NbRK‡Ä‰ˆÝ3ÒËõº.ID¬¸©Äƒ¡9 §§Uè î†<ºûÎŒR"Up¿yÎ9çäÄ I×n\]‡PMÁ!qf$õØ…xCçâëË—Ëõ¶¬ïmœÓ²R@«"frDu‹N׺ïÐ;9³Leƒf À¤F9½M4J޽”"ªfÊnkL)˜&b7N*u‹’^DDRwO ^Öëíö’Ì8‘4ÂRĶ®>÷ácÓ‚¸‹ªÇ°§åš„çÝ ýÚ b×ô{E¦›X4…»ªÆ»…¨+Ж^’NFö ¥£_©nʉ;¤Å €)†]#­è`}[ÔI†äšrÎ)!ƒW©¢ÒQúág7nZ3‰Ú„Ȥš›¥ÄÐg`СmÞÇ`„‚ˆi‰Q– À^ œÒ ÝòoæL · ½A  nÀbÖ’^nÖÐy‰ÑÔLjôL[°0S+ó…~­¶/1=JÔƒ*ÓÎC|‹œ¥7êF #|`¥ÌÚ’Í:ƒËÜ0FZÁkvx°ò ©–n‘9°ö¦±ð‹†÷@ 唹‹†=Î{9¶9Ì„wµi^;æ·-ø ¡ÐÅ0´—š21M4Ïùrn”½z ÷{8q"¤hqÆü± &LÂPpf8ûðC¦wrQÏs&ÙÜÁÄŽ„Qì|,'¼o›PŽþ˜úûš…æI3ÂÑ7;Fá°O6}s$œZ$ûMÇÄ%ú!†Z—¨MT‘Ð#‡£>*£Æ>€ÛX }±ºy)>ÛUZã÷PÀ|ž†´¦èNŠiAOè—@ÈGmý¨-¥Ö><Ä“nÛÑ82‚)ýp|ê„wÿ¨Àe»¿£ó{>~\)h.Fü ˜vŠöÔÑÚw‘8*:|þ•Ú[­> ˜Éû-áªññÞüQù®Ì2ôã-r´šÍUgÁú¨zïº9é0Çù¤µÃvÝNíéí ’Ö…H³«ýt%–éÓáÇ̦2磕x¾NMKï<º‘ÇÝv¤}ŽÎ\­ÅHЋ|`{€ÀΟõèZhù˜Ï]vía”uìÏQè2i sKìžÍW.´—ú]ãs¥s˜¹Û´pšW=Õ—L¾m8ß*ŸÕÍÙqïƒÎ>Õ2ò¬Cœ]æn­Û¤ÍBÆ$ÎÛ]ñ„,oø¨˜Ág›=8Ȱclp|ÇH†<ØA³›P›N‘&üçËÏ_ý4iˆIàÓ§çÏ ùö»âœ7ÇïD":ú0æÐ'x¤©­ñUÀSÁ™ï?ÇHð© ¦õläý±›Äù žxZ¿kVÿðOƒ¡OtÚcÜ…FüÿÿùÀùÇröï×ñÕûéýó†î?jL@øáßôÇæW ÿ.Oúï«ÿÿ-™ýÿ„®Þ¤ýÿw/~G¯ÇçO~Bä=Y×ý° t›ÉÓ'6Ûi0ÐY:BHÌ[éBdÁ±›ÈúÊ5ܨz8áÇß"jzä“ã¡}…Ž·ƒãí}!¶§(„ëKÈ‹â™ÈÍ‚4{¦(Њä` QU5㉨+ÖÇ´ÃýóÉìë˜AÇÅåÈAxªHË’¥Êc{\_^Ô´É™ B‰Í%5“ŸóÒš`ÍÕEDrNµVÂVÛ||mª1mê3êÎDfP¤‚ÃËåºþô ù‘v3¯^@!Ø U¤ì;\’(6–0%FÓ”8§\Jµ„Т–7vWD\—‹+I8"‹Êý~¯û¾ß^^^nL”3Ñ··7w_/—×u ôv-õ±mï÷÷u]ˆJœsV7ßK-YX-—œJ•­ìÈL¢‘(qº\VUK)BPÎJÑí`Þ,]f•ؤ™k£¢Cã>t5"¥„Ì)%î `{ŠÖZk•R Ѝƒä%sJµ 'dZÂ’G‡­ŸÖz‹c]Ã)åuYâŽ2ñpc³Ø9bo´î»žÝ^ÍŒ‡ ‡††Žî&¦º¹©ÔZÕ´¿c„̽€| ›8Øh rÆa`^˜¹)+æáOˆjγ¡ÖãÆBÝ?æGÛéì&? k±Ü‹ Jß8¶$€ƒ÷çKÃ#¡;³Y‰Ñ…ÈN”EBÊ,¦:á©ZkhxóSJDˆ¬½ÐP±a(žÝ̤C<Ú¼£¼4ôj;ºñbJBÌMý õÈ[V¸ÎaüÑðÙ q™©Eo‹M„Óa…´Ýx\E‚™ñŽÙîÚz÷%fBb ‘µËä0n|"wó‰ÙÏŽÆÜhÕ¾ÇÛùÚôBCoøý^õ„EÈÔ78ʨf¡Äû¯¬±ðÎ2€ ÔŰýÌÅìn™ÜÃÞ Ü«î2žå+w@кšäš3\Žâä¡càa%m+ºs Ü¼×PÆÙo“­æNGêÓ8ìM°Á;+ nÆLª Ž&Ô65ñ¬O’ݺp‰˜ŽA#´áAgXÍ=´T€÷ z2µŸâÍ‚Z¬šž\ÕL…Ý¢?­¶á€ãDÓ ø¾d§9,§Æ Ùm’Ô-ñF‘ÁƒrùÙË?â3ùÇÌcóÕúQ-{ȵSôˆ¬· âDâph¹¢ ©ÿ¸ ™yóV!1§#ð%y ˜È?Ñú; ?sîÚªêÄ?þÀÈ‘dj$óÁÞ’ªÀð¹#xÇ{µHI$ÌZ̧G9ÇsÁGY'öbíS¶¦Ý³ÜŸõœþ5aqB )ÆÏ .âØ‹"1´Òaâ?ˆ6ÞBøNy%ö6ž8yNJý§ÂRo¬îƒïØ$ºõ™è8qˆðTuðxü'vJ<Š(Æ 3u­OVA?9ò»Ûo` >åãs;ðÜ50 CÓMrd÷N×ý©âp,˧ëbnÃ8Ý&Æx Ž9Ì%ÕÁ¸žlò¡ãyÈ4kÍx¶mã¡;O£Y–§ÉãÁð³t‰ß— ¢Ð?:¡gã9~W×<ò©NýÉþ=É1¦<·+œœ¡GNÞúg5øi¦u#sw¯w‚^žUpü¬nöIOôiþähŽŸÜž“Úÿ»z½­MXÀÉ(|žejÿ!·¾?=ðS¹¿ûKëwˆ=þÏpÿC¸øòMþ_ÿ‰4þÏQÿÿ©ÁÁ¹þî¼Ãw6ðq ð4¶¤ùªÃùÖ…Ö\hÔ6}ÑÔþ;ao&ìp9€VõG§ÑuPÇü4·‹~à6š÷džÑ@-ªñéÞå‹Ó´rŠ?5}ßøøt¨ÛÌ(¶-Ú=ä-0D?¦yòÜÜâGþè™Ûwî‡ù€¹›çó\Ùýé §°›?Þïÿñÿ.ÕÔ%…¯MÕ“c8˜ÈQTÜMC&޵ž?d$$¤¼$ Ú²Yà#Åä¾C-5ÖöÌiÉ&á¢0¯eûöU×õâjÈÌÕd{lbâfÿïÿú_ïoï¡à¨ 3çey¹½Ä²GU/—‹™•ŠRk‰|ú5NhWîŽÎ¢‰.TE‚öîæ!¹Ѻ,1rHÌL(j”€qG»ïED®œ Í+Ú}Û¢dx]×…Sb2%šÙ¶ífÎý½ˆŠ¦ÌµT÷v<.× rJyY@DoHëåz[–ªúØÁWSU¥h"¤e]8ž"qfJ[Ù«Õ¢ÀL„yœÒ)ç+âV«ÛÁÜ@Éc#ë€@<(«¥ªH§¯’ªA†Ni{uB¼ïw3åÄKJ*ºK-"ê§š5Ö­1§0ˆ‰j"¢”Ô Ä2S^—qY²‹¾×}/EÔþúÛ×ðØbÊè æ•1åÛë ºÿõo¿Õ½\.«[tÏDUE̘XUïû#s˜#Ü.ë^*"–²‹Ð’s7@3[?µÌLܯëE;¾¿Ý¿½ýüåËëívÍ—;>ª”¯o˲„—// …TÉ$¢áí f¦ïö@ÂälªêŠB{)ªûºPŽ¢š¢”tjÇ"’׎ˆ×_ÿÃËþ.;].‰ ßï;A^2BÈ{è®ÊDׇó€×›#C°à‰ÉªT NŽÐ´3rHà ¾[- žn/ º#aʨ ÉÙš®€ˆÄ9¥Äi+Û¾ï¿þòkbÓXRSÆ UŠ!„ʬ ô å8ùG®'å,ELµåÔH2QÉBR)…1äDH\E´ªˆåœˆ(qбÌܘxYV0Û¶Ç×ß~KyI)7É :ÄEM—”RΙ!‡À(N ¢¡zÒ¨Ôê€ÎVU×È9¡šK­jŠîÒ¯BVU5# xj´œxÑnñ5õæI©žÞ Éãs§îÕïí¾³ÂÜâgí6⣖f²ž6ìA“>[Ä­K1G¿CKLS‹“˜}øOÃûÃhá³w8*@+¨žÈٲͳ £O ‡ã)jÃÛû¢VL R Ñ0]5 ÑÚ½‘ êÏŽwd›â±, sÌZóS›±5ÖŠ²Ê0É>Û^>ÑtÚóôÀ¼ŒÁÒp¾ÀÔF÷Y¸¹èñc­Ç=§pŒ¦“b‹S‘çü½1SW<DU˜“bµ­iÐW’ÍÒn`ñ@ïÄùé ÃüO?q.t>ñd¦NˆH²Ï•ÑÌæýØš[ aŽ«´Øq²Q—r[}P㠣ѷ§6 I0úéO¨Þ|> hèþ­[Åz˜ƒað|bÄ-±ÆÎÞO0¨ýí¬?ž>½ì·_XǪ ?—6pÏ3Bì!!y”8ˆæ:W.É+;¥7OÅôi p8êÇÝÄŸ ̇°‡ð:^Éû³Ô'©O­ÓOͱ~ºlOèöû Í¥D“µ|<=ÝOu| #ô!/>ã=>UŸfˆžF#v1 Ò.ï>üSŠ ;¹Ùñ\œûä£ÄM°ýÉ:—Φî—á쮺 F2b|—ã3ÍæÔ¬ól3Ç\h,•ÇOöSÏ$ž£?>Æûè¶*Îâ–C%}ü|(žt{œBðÙOóÏÆ?®è:œÎÈ?P†ýûƒÁïýö?š"úq×û?°èï~ìuÿ;~—¶úÿ/ù/œ*Àß<ßñ3¹O‰ë?÷á ÁTîç,­CÓU¦aøaçÇÓ|¡uíR+hòn?p†çåeX–›1¿M¨}W7¬·®6³és$`Ÿ6}‡„‡ô@€"Z3O¤Óup‡ÑáP¥ûLz´œîÆø«¾+NçuÅil9Œ…sä¢}E*{¹ßïµ3s€Xû¹¨Õ÷·Ç¶¥œÃÊZjm&N1d ß®‡1ê%‰©H m­RÞ63ÛÄéÂëºä‡ª@ÎwÅRö½jæâî"5'Æ´8y•ÊÄ—Ë%‚ë²äœcKˆjàÄÁ¦\×ËårÁ†Ä=Çáhfb3CÀ*R«Ü®F¾]«™‰ÄrQ”ÌŒÔÝ ¤–„¤D”7 ƒ£5pßaSì»ÓÌ€J±J @LMšÌúA ®Mj%@DŠVÇûöxì[éCjú£%vP5CÄ5ç#I fn ù²®‰¹ª<¶M/K Q5"Æ…Sk\EQ€Š1³V¦HNÉÁ ØÁ·­èº$wUׄìQØë–”A³ª˜j÷@Å.ÖÜ÷*aÄ­ZÕ(anÞ¥Všêf÷¯{)%dñ*Õݦ%-KæØ1`XqA\àëý.î ÆL NˆKJm{<·×æ„€?½¾@©RE~ùòe/å±ïU’ªî¥4ƒs#@#k#îRÁýí~ÿõ—Ÿÿí§_˜ b›ÇœR ûef@w3Ý-”b«Åª9šf6²²ï¦NDU9ê“Á¡[±¸¸ÖןŠ(¢0cr"¦´ï7Ñ¢ÈÄ9»yJtY×Rê²d25&’QwÑ›ÍI×TP-&XTiɪ‚L`(€êî5°KºŒP¶ƒ:“+ƒs«eK@¶æ¼r¾——%jiß÷ Ä‹$fŒI¢¹ƒ©9Dù†£©©Ö¨M/Á%`Ì)A£ä3ã: ­ÜÊA J‘Z«9Ü–õ±í?¿~!b1#ö×ÛKbVÓP—ã370àôó¯¿Þ.W­Ñ½Ü'š)§u]~}YrNnööx¸{N @æZErJ9E»ÆHå¢5˜C¯Uar5€¸ƒ}DE‹o‡{ &<ñVÛ`&ˆ½cg«M¨eTwBH)Ç%KÎ1Zcæt0±nµîeš 3…•@Ì,ĉ¹osÛsg0b@]Æ© oûýñ({]Öôr{%¢@ûa³£“˜ÑLÝè¨fñ@ x-Ø,àæÀíÄN|0Œ½uIèä…ГÛ˜ÅË·:ê!ý$æ8ÁjpS3ñ”²@M9§–f03%siÃW7!ŒH È»Øm.*ä&¢Rã±ê‡ÃαçÈǃٚ-[É1!7åÖÍU1ÉM)2< ÐÜ3Z ™èwPûÛF7aë<:û³ ÍîË>Ná/Ì6 »G6tÂL¨=TwĘº?3=µÌSÌ¢ƒh!¯àμÆ8–™©–ªá53UBvUb^9c·Dº!¸˜ƒ:eL`î¥Ô(ÄÒ¿jÔŠóX&…Ì„Ö Ìç#tZÒ,Ž¿‹E¤GX"úÉ [9Žª¡Ð«›?œ+ÔÛå)ÄØ ýôÅ9qNã Qkï8igAª­Ss|LebWN_j·©átGÀ'_6ŒÉHt,»éT+áf@ÔÈ$Áêиy‘m„mp0ô»'z‹Ì <Œÿ­]ÂÍ›ÈÚNÉ–è·Ñ&uvç/vnÌ(Õò†ü˜ECŸ]¢G‚ëckd|ÓDŽ_o&ª4¤Î½Á]þ,ÙG£ìÁ¸»z»Ñ1!¾îøŽÛIlÉFà‰&4åÒ'„+úÈÄúÓ †ô?—ÊzÜ;·bˆí„ª†Ø£:xþí¨»ÊãØÅîa£ÀÁÐNùúùÄ3¤©õC\çÓ™ªPÛÛ¨’ÆÐÑá˜Êœ1$§ÈÑ¡“øD4„ £Õ`ÎtB?.ã8¶ˆ#€¹ktA¹%æîhñAöŽÌâ°®ï¤Éžz•çðÊS#ô¬þ϶}ïý4óò¦E턟šÂƒsê8^¼ÕJÏ´>E 6‰ösUëÔ÷{Ït¥×ÇÅçO>øãbzRó'ɧï8Õ D0!‡ñéß´õÉ%þQÈïZJƒ·ág±‹Ië?²]Ä?ÛPg˜¢?™ñýHøÄÄyú‘øéøŸDv?æ8èÑÓÑW݇ã6ßEüGÑijEsâõ0ÌĤðs‚WÆó\iÄOñ˜¸P>â?¦ÁR ·!âGóþ˜'’Ÿ¦]ŸÿDõßÕ ý‡ôS‰äjjnïÛƒ9 ÷ì{ùËÿú¯ëíFHyÉ”8§ àÕ¤•膟‚ ÈÌöZ0*#Cx ­Öòööv½^_o·e]¶RªJ´×2q8çÔLMŠÖè$伄Z”sZ×5uejY²ªæœBR2Uæd.j°^CÍÈ ˜bOžP"€†A@s#$N ˜ùºæÇŽû £˜ k°kÔ,34ñ]i/EL%3H̉­h ûñVÊe]‰‰€cÜäÉz_ :ÀQ ‘rί·›Š-²«Ô*uwbÆhFt`G'6w0(µ¦N¦ND™™8Å^°ššY5wI&+UºS K-/—[Šv;¤”°m¦ÃõŒŽ€“ H³ †Á!†Em}lk^«¸›–jf–8 )v'©™©ÈívK‰ÍÌÀ¼ó1^„UdßË^6Q[—|Y.K^ÑM™94 íì²ä¼, ó}¿‹Èðþ¤%'d3Ý¥¬vcÛ«\Ö%1U*JD?}ùˆßÞïU+Áää ë4©j©µÖz½\þÇþg"ºo\˜‰)§ Ì”Sb¢Ç¾ß3¥j›¸š9§t¹^:3×Ý@«:¹®˜àr‘mÛ¥¢®/׿ýõok^^—}_9¯$}{«à È—«»  UY×ëb¢Õ SíC½“O[@Ä©Rr` 9Ç»" ~„»[-µš¥”‘9‚m†Í ‹91“šbZ(-9•R¥”­Hƒ¯_¿&æeYœÑÔŠ{d.—KfNÈEelD ÉÀ1UUê~8$BÇPF§ jÓPƒuY2ýöõÛír]¢ÚŒ9åœI±ˆDG(8€ªÔR àß~ù·”øëÛ›íGœ˜Cçº,ËËË eNPj}ßw7#¢Ç¶ïµ>ëõ•'ÃI4؈€n.&‘[j\35oNvõÎÖ¯µ^/ëiíÔ1„Ç4¼GÏ£2rîgúh– IDATƒF7£5™£ŠŒ ¿˜ÆY§ª¡'z—Ýck@Ä/·kò"3WBL)5ÒQW¨ÃTDTDd/µln×Ûš³˜¥œÁƒ­©òèwEÔ©L8’ò‰mÇv½Ù¢O+ï¦rú€³QÄí¨CœiyHh}ô¼…´CVLïõQscä0ºþüÓOñ6D$1+¢¦”[mˆªJËR¦CdÁ Î›:`pU}¸zé¤û¢Ú§á “=ÌP‹ }¨ØD0×pt‹yIXÄ-ºˆIˆŒ<{-É)š!šë9†ef*ãBd"âæ,öÎÈnéL?ùÍÚ£¡ufú0MnºÖœÛ'ãÜ—;n¶-æ…Zßró݈2xB¬Ñ]Ù´11µ`3SÕK^–e©µn¥,žz™äD3èjNDè ¯ZPÑÁ˦®Â„ä9lé&ÄH®ñ€ãõBÏm0¹1ðf`o¼„VjLÜND4DUí0ƒa«WÕÌßk“[æ¿ÛDÜ̼ƒ³8<)0qzû›p4°®ÝZÐ0½M ¢tå^Ž[.3¦,dß!Pbï¤Aж¿Ø öÑè¡-Œ"R9VÀÓ ¢6£ÛIG¸* lÏ²Ï sÝ#Á8,™è“¹{¯u®mæ3f2Gsvôëâ0Dƒõ69³nÊ8MH“Ùì3AábŽ{`¢ÀÆÌ)Nõ®ý™;¹ÑDìi3Œ®âFˆ#’CÐZÆ&ëý‡6Zfn#'Ó~SŃhàmÞßU<$¦ÑB<ñsÂFÐ>ØVMÜ’³¬æG´÷8·O®ö¾E›á9³l úÏÆù¦óÚǦÖch×Ë8ŽÅ#RDlB¬èhcîk§ÞIÐz½Œ'xëâöŽÅ‘ÐÔúÇWùá1Ÿ*ÕcbÌ}û‘é &FÂȆÄ[ñÀÑ̵Ì0‹ã]ED81Ì”›v^µV›ˆÉ[Ì!TÕ´yì5ŽN % {ƒ¤@ÜÞÿ<.:Æ…~XÇlf5â Db£óÖpvÄ÷«µ­bé}àÇ=æ8'”ÚŒg¢_aÓl`DQNû ÍXÊGßôpº#Ž™ÄÑ”pb „ÐÌWñÙ8Õ-<ÃjŽKÚÇ ÀŸÄÿ1›,ÏÞDg8‹Øiô¯çüJƒ%8uLþ̶À ãGã''üˆ9ó³ýÿìÚžÆg̼~([Ó6Ž~¨Ö¾±›ÛGøéôþ=¼É;¦ƒÿñŠùíÑŸ‰ðÜî5øÕýÉ:û}ÊÍ\Xñ}HŽÛX¸K‡)7ÐncðGùøÁ§‚/ž[ü¿gêôøÃ7„‡úü÷ÿýwÇø½/ÿ|h€?dÿÿØhòÿ«ŠþÚ¿ð¶w(pD"Û ¥»ãûx ´›l߈‹üiÉÙVîOôš¶9}¨8ügq7nÓa¢# ÖâÔ]SæQ¡×Ö¦=í4UæœñT±þŽlÁñÏmQLÍÀOhÁö±úÇÅÑÜì]àh…ÇøaÔ<}ÀÍø/kðOì4’þ?P¸À09•½¼¼.Äœ¸aÍ©(§Tk5S‡k†¥ "%¤½X*…þ¶šûý¾m"ÞnWw«¢ÎœF"˜sæ”PT)/yY®× Q 滋•R¶í¡*U…ˆåœóëË-Ú°³cw1KâÕÕªõýR©’rbo¶Åñ«iâ”R RDì°–%»gŒ.ÇuYÖõ ’8ŒêmJ „Ñ`$S£ ~ª8 S¦`f†ìˆî¡þ#aÛó83ÂuY—¼lû®Ñè›xIy]Ößê7ïJa¾½½]Öõõå¥súÆöZ‰ˆ©¥ñÕŒ‚­äauOÌœ8çÒ£r•àP˜©±aÄK¾"ÑÂÉLUÃrÑŽÛ€›R¥J-GJ„ëJª.˜¹Å§[M´ÙeYâ{Á‰ÍMª˜ªˆ¼¬ÓSžš(1EîA´2sæœsË€(¡«0‡À£ƒ=¶Ç£Å1„ÕÄlîoeÛµrJ¢’3›ÃûãžS›!©9ñeYïi#"4ÔΩ<ÖεVUM)­ëúŸÿþ¾þ×o¿Ý÷ý¶.˺ 3†)©š†•¬DMqÉÉ$¡›'¸ýçÿB1UBZ_´2/9­9ÿövûíkøAa½^@@öªERÊD@•2º›§è1DUX×”2VÝ{ŨBu ”R¢Z+ $n7efV5"74K„àÔ矔–ÌàŽöN¿?’Êæv½^SJj®ˆ@ŒéQ0'T5Ûd7Sßû¶?1|Óañ&ds»^¯—uÓÛÔTÍÔ<*²Sâ¼ä0™Š™™'&1‘ !Qkžl8€v¢3"#3“ªlµ¤”rJÀ¤æía½¦2¾7d›"…˜÷ZÕ 9§yçµÖ*n¢úõý¾m›»íÚ÷¾ïµVøå×_ó¸ñvˆ*¨©kHÁ­„0nÝë²D÷KÌ#Tµ›Êzj®?óÌ,fæ¡y`Ö‚uŽ÷;ÔøsÜ£b¹ý°ˆ!ãR-ÚeMh–öæ%OÛm[]923‰¨¹r¥1¦æ¾¸…4ž:Ipæ} 2œÍÍ~LÏ}>!­ŽÙÅheôß—ñw®©g ç 7<6–þ§hìcâÀ?õôQ?~ž2Šã|›Î6ÿH‘|Šùxà~GÅsªàÉSÿÙ§áƒVc‹OÓ‹ Ü0«8øÁícp>áóñéS|–˜ZË&⹠ᬵö7þÉyŽ>­ÔBÌC›ŠÌjDGÇH? wceóϳŸ©ç–àS5²ŸfÆÏ²²ÿ®üêOærÿD>Fx*x˜}ýçlÍ÷~™ÏôwÿNá‡UbÿA«ø‘#ùa³ÿtŽ|·=â(«ôwE>Î ÿ†ûÿç_mFðg8]±çÛÖs¼lnÎ=—IJ–zïnßSLÕö}pÐþXo‹MÂlš*‚ñ|Œ V[IÏWâàí´mèÔsÜ}F±Mƒÿ—ÛÔâë=? ãIwlÿN•*ÃüÔ¢Š4ëöÛï€;žïÑýYaþbá±iEÄç@ÇÉÄD«”RrJkÎÌLÈÈ‘:Gssdñ4iBÄ…sÑ àµÖûû]¥†YV‘*µ>Ì8¥K^“›r3‘Ƕú,³ØkE¢Ú‰ˆ(›º™%æ%/{-¥ÕÐM[tXÕÔ½h%#$H)‰¶Š«Fí§V™3ºß.ª¢–((æmÄèà¢Fˆ¢ZµfÎD‘f&P°ãLH›T÷瘳;H•¢²—º.9çœ×*„ˆýLý4cf»oûcßÊ^Ì,xG.51aND\öý²®™3õÕ’³»V…"ED‘‘@L8œ™D¥”]ªª2ó—ÛË/?}¹].ßoý!*î 31'bä}ó"bf~»yÕ¢¾"eÍ—›©¢n¶qA¢0i¦DˆùÛ·ò¸×²ÀËõ51 ¨¤”Ej‘º,‹:^¼Ö½–÷ætYÒ’ëC¤zT¿‚€3sιõ»ºâ’&´*•wLæiew÷…ÌV˜ dßöÕ”/×+§¤¦Û^\*ÐeÉI²½ßU9§ËÚKýÚM½{À‰Ì™¹Öºo;/¹–Z¥Þ¾ûJØ(ø¾¨"ÀºdÆÏS&Vsc¤uÉàž‰G÷Õ t—ˆˆ G’™ST =ö‡î…SÌfœ¨òQMÝÌÝ˜ÓØ¾-)‡§Oq¾ÿÈ1==Ü‚ËMÑÅÒ NL¥4…"çB^1÷%qbî‰(<ªäÝææ¹fû ®ËÂDRëûö0³œ™ª¨æœ™9lÑÆi`¦Ö5JD¨‚æ¦R ‰˜E$#«JHlÞ>7ÓŽ ¡eaŠ$eŒb"ÁM·jX¾Ñîì8ì§±lnë裹³›v£à Œ´Ã<ý—÷üý¤ÿ÷žÞ!üLõ ß5§Z/é(ûC²9ìµ8»3Ðd}J'ÃÎ~›ªðÊÙ¸Œàf„Ç8&<Ç‘+ È1wUE¬³öFB½_ú¬;Pí3Ï¡oyC«w3nËNOox¸'£õÒ™ 8!®áÐ ÈñìŸXG0µ/¦é@ƒ}>™ÍÍŒ мÛW´ÛÕQüy‡ØK5[élk)9ñôÇ}jÝÑÙâyx·á‰ßÒž6¢˜íÞÝ•£Îjh¾ñW“x¼¦9ïvE«i;Í¥Ï<ÄxW‡øëýuFQz˜uç!~pä‘ñϺpï;Á£„6ìêS*bÌ'ó7ÅðüLÖþÑݤ€GG@ó÷¨h@ÉO…´“h~ôyãÕrÍøýè"PèßÖ©²¥7Là\‹zPÎ&¨OÖŠ蘾C Ï ?·k̈üSÁõ¸>±ÁÇÆ¿©Óuà  ?¹g=)¦ÇtU5œÿádk?æD> €8Ù÷Û¤mF¹?K8CýØ®:Ó&g9´& hÖÏ[‡$ÕVüÄbßG¦­¸_±SëdÑÿ¼/ÁàÄf’šýd‡qT}j¿=S@5ø¬2ý7ûCå\æ8 å~â\øìæFøPþz6T?kÚþ@üÄ¥‹=€xº®;šâ¹>šÞÇ'ŒS¾a€*ÛJ´{b8Q¿ÍûsÓqw6Nd>ôŸ,žKž‡lïðIÀS‡ò)œðyÕ,žÏx[ãêù~»,~ϱî?¦)ÿ &ý»¯ö ÿö•/™È?ŸœýÅùGZ|Ÿ®?„S.ç#hÔÿÕ<ùÿj gAìx}¦qBþCÇ÷Ÿòk8ßWÛ6rT’<Ïý·À]jÀFQ¥ãòGšf«´sqä ælA¯lÊN3¤Ñ$Ø!EîHè±×=þšNkŒa/#wŒ¢Kw`äá9=JŽ{ÅðÚ_Ów/œýSäm€5a`Ïu/8-žŸæ×ý¥¨‹4ÔZª™oÛC¤^.$~<6©ܯ׫5-Ña].œHªDlJLÄfv¹\–u-{©µÔZÆ-„Düúú%~ä¾—mÛÁ=¥år¹ìû®eÏ9ƒ‚ª"QJ9/«»3ad¾Ýï?½¾&DpP7Z8)PTSu[òHÛ¾2Ô½0r Ñ—IÔJ-ë’SXæ™Ý; &çTj©ZÙÝ÷*—%>‡¶\6“Z¶÷;¸ÓS„ñ«hSÔÕL!tu&bd`b©[ðøf©¦| wP·œ“ìÛc߉h]VgŽ<òãñ÷k^€˜8'R[m5Z@îÝ¿Ý IKÊDŒ„÷í®³QUOËÂÑ+Ûõª53?vÍ’Ô$ò®kfà)åÄ)±ä%‰j&ÌH˲€{¸°sJ掎æ¦N­VÖ5gÆV2eN DEUCAÌÐ:'4tºuÉ{­Uõº\râÄ$Ú`ÚHÄÑ “DJ)%`DH”^¯¬®ÿõ¾‰èÏ/¯æÀ­¥ UÔLM­VÁ¦äRrNÌÑצ&ms³ËíöÓëËír¹ïÛûãNˆ;’‰¼ä ŽóÛË5'­¢ýÛ×ú¾±91åeY¯ "¨ aB@ 7wDvøíoo&\3ºçD—¼<ÔPåör»o ;2!UUsQ ÏyEÄm{Ôm/Û&Ñ&±L¡í†Æ*Uh‚ HÄAŠX›9’ìÅLT0j겸:€—R÷{âÄë’E‘sb&Bg7t$À*ÂAˆ`DÆœSh!Ú ok©jj›í¾Gtâܤ @ΤbÄð™½îUs©5Îç¦÷R­e½#½@àQ(-Õ,¥êbòþÐ06†À½.ÙÝJU­¦÷û}Y—5/în=Õ>Vr0Ä`æØ®Ñùu]3sh ê¦j}t1`µ Û¥y©ÝþÜ[q]J)¾‹‰cÆYJÙûöØ×ËòòòÚùZ9!ÆDsJ뺓ˆJPŒÆÌUuˆ­ãy²ÏàQ­ÕÌ|Y.9™™¦”SN!‹!cND&¢º ¸«4¼é_èî^ʾo—5©ÙcÛƒfKDyY¾|ùÉ̪Ts_r–ÈŠ…Œ"UzÜD¤Ï ¸J }\TJau­’â'‘Š9€¦´RwyZ›ùß ‘IM´TÍÌÞðÃ]ˆ)åæÚîûȈhœæ–sª"R”“V+µ¦”¢44*†àÂD6€§­\Ⱥ6ìµm±fÝaiµáÇ(™=$Ü©`‘ž°q¨ÐÔ8u7 ™ÚKtnhÄÀ|@«ý4—y‡ƒæ ÐIˆˆîå®]TŠgWïHm‹*ó†Ä &ÿ…Øì°„øûüOÍÕÝDLw©Tjr¤ŒÑäÐ¥ñÉÄØž)4'¤œsp™/ËÄ`¦ÒUÑoj4í@qb`“….¶Íq;UðÌM ‰‡ØÝ1¦¦!^ƒGÞs@Ò(Æ´aéǤMÁ½MIúç"±G¦zSrp¢âajf%‚ÿšT;„÷n¡ Es(S¤b¤ßÁÌÄÆxÈSÚG:§-îÍZ¡óº‡Ê:º.¢ÔÝ£éÚO™ý6£p:곎©Ñ˜)ÐñQQ÷6ñîð2Ž„€wdfg…5šFÓ½š RͰcŽ>²17\¦ƒÝHƒÆÕt'êâT+]iŽHU4‹¬É˜‰:€µXI«ÑÖ=K˜(9€«¶ ¶—øÆ}5ÚË#vsÌ}Œ#ÁZK|³O±¶Yx;åÈÁŽþáNìøõÆAŠøK8¦»~„©±lð Xi©–1vÖøø0â C´cŒvÞõñ$¶‰xŸÀuûÔ¼àIÆ ¾Ô½ªð$Ô"L>ýž¬™KbÆ``¨‹£·@DžÜômvæsuÀ #¹Õ.Z±3ÖŸ\ÒñúmÈÝcå0§aúãû ®Â4xœôÚ1æ”ù˜÷ɾ½¡‰OudËÆø §}rGì—þT wý” ÀY拇·ã ViÃïj¦™6ˇn Ž—õy¾ÓNËÎ8j|*æíòƒ<™ÊçËÁ|ÐèŽ×Aúñ©3fPð(žŠ|Ò»‹gW2ލÓLÅl',Lã*ÿášïlï<]?ë÷Ø…›é‹}örŸçtóGÙåËÖjòÔ<€ø,æâG‰ñ# äÓ¿þŒGâç&ƃ s†ÏLn{À©gøDozCŒ2Þ\sìE5qUMèÿÄò|kü)bŸ$à$ÒÏgÌèð9·Ýâ!¢ÞÕ>¨9%äP À†Ó»s° átøŸÎ³…iBú½†T‡µqÿD:í×øYèyà¬òxâZ}¢Ê~ìþqGûŸQöý¿£ãß+(û?Cžþ4hÿ×úÿ?0É?xÿÿ{íÿþÉ’ëÿ‡ËàËùLr}~xMùõ#ßužgŸ£Us*q~ÒôuD>r?<#ôçDŒ$ýØ@t÷ þ÷©¥縋^7:P#" Èã«hEc·Tt'ÿñd¿®“ýa„©p Ÿ=ùóBáûeßÏÁ¼Óãcô5Ži|yÙ÷íý^kQUK™¡ûš—eÉy]÷}–É—ÛÕj©NK^˜ÉÌ~zý²®ë_þú×oooÇmŸˆC>3ÕǶ—Rj-iÉ×ëõ§/_¾½}S5b’ZEÀsΜ˜‰Ý­ÔªfooßÖuùùËs8q"Þꦵ2óºäRJâDˆÅw¬* ²¤Œî¡ÆUÙ|]T‚ÙëíúÛWùöþþå农ÜlÛv¸.0+U™G”£¹–êÙS"J ™ˆ“;¹»¥Ë.è†Úz H;"ò®ªªEÅUS€ÄÁ/ëzýöí1/×Õ7¨ª®,äG-KjØobº®ë›J­âމsJô|^Ä1Qª*÷}«U¤*’C ž/à^eß÷”ßnðPÉœrN"ÉŒÐÜBp•—LZ¥ŠÕ/ËKJŒ½Æ$gp¯¢ý±—º=öV:ˆ1)*RÍTL9@aí7&J‰WN¥þöõë×z­¿¼~‰½qâ†ÜL9ÚõÀ<1Ãr‰«sÉ 8¤ÄîPÕ©!î1å$ªU•‰KÙPª&BØöÒôHˆ//7"º?¶÷ÇÝózý)Ý~þyÉ©ªþåí }½‚ËŠD¥®ªN@º‰Iùúׯï_ó* §”³'Gtevf4tCBÐ"¸?ʲhXšÓåÊæ`îoû^Ê)Ëi/ E4Ö ´¬äΙ+ªÜ7Z–œ3%U­"Z+‚!Ò^庬™Óíö²m)"eF"S-q5÷¬DÎÉŠˆ™#”RØ=­ìŽ (R}Y–Ñ™.jn¦¢e+iM¦VʆŽäfyY™ùörEp‘(bÅ*º—jêUÅ̤ˆVUy”ý±·S—ÉÁ©ÖŠˆkZƒF(ï~hÈÄjnîb&EÖuu€mß—¼4Ê5’£W“ãæjv»ÝQT‘™Á¼Š0G`5uw ͇hIœRb$w—V„{tÊÕZ¹ei„Ív_1N Rt8Â.Rk1·ØNyýò†on†D1&KÜèìËu‰±YôÝJ-^!T4¥×ÍlD¦ w¸wŸ»{”˜[J‰™SÊ}AÈP&·=Å4QLÂôÚ}³ZGA±Ú}»ïûê?ÀöØJ­4™ûò²H­ïïï—u¥ðŸF)´ªÔ µVìMU e6™&˜‰dFÄ…ÀaÉ9R )qJÙܤVwW‘X7Ûš¨=[$>ÅÃ{S+´ÎÿÇÞÛ6Ir#Iš¦f<2«HöÌìÜÿÿi'r'w+;;M²2#Ü3»Àá‘YEvÏ‹ôŠ?PºYYîê£jV[ Ñzrœ#@£jÕj„bÜKäIX8dbÌ"ÍY­Û¡¡ñÅÉYøäW"«æ ÝÎÜ¦íª‹™ ¾, Ó­yŒ¯Yý'9GK|¤;U§ IDATïÌ2ùðXH§Ý_7s#5uPç2K¨ÿFRÑàVùPœCÑò“°CDîa»î<¢àLýaÍ¢ûtR¯ÄÀ[æ”bŸÅœ½ ÌNÔT}\“)¥”Òׯ_¸l^÷úö­µv¿?êq`¶—öËŒùÝ]mò8¦ÁŸ!8eŒÅsŽ^¶)"]ÑŽ2óž wJ÷ˆp?ñp²åÒÔéÖA¦h^E<ïYØ Y²7Ë1Ë0 #‚Er .ú< 2yA› ÿA¼xä §Öðè¦ñë¼oùÍÖ°n,°mV¢Ìf59Zká 垣é>^ŠSMh¸¸ÀLp#«áÑĻ́˜ÀŒ?ušd#:•©‰½:m©>9;g«ç8ûñ!9±« „ísFÀƒ•ïCæI¥YgÚ ñÕQë-žSµ.£ï˜ qï8{È;}~¼É..›Ÿ{tÙŸ•c>´£“º>ÀwêXÂ>*GŠûXÎ Ì)e™ì•͸$‡úùFO,›±á×UÀ<î>T°…}2÷¸‹­x®‰^™a“µx=JAΓr‘ŽÑIÎF6òãiØÍãÑ4øÿî×b†%"v YŸyðlp™ªº÷¿!Üs?ÂcêæË„~©žÕß«ãÛÏ f™x¸Oüœj`ÔkeÀ¨ŸÃ4>OßܘÆ`À/¶Oÿ¸ËgF\‰i³ÑÎ ¯_Ÿ5:€ÙÀÚwÛþì?_Êo×]WkäŸ\/" »ÉYU퓬‚ üÄ×hªüëQœý»ñ]f^í€R¥Poèÿºd/¦ ú”Íð¥‹v–\/Ô!:‹(–¬ |yì¬Ösºbœ.R µ÷5sŠù%zà ²ÿioxÚ—¯6}€»û§ŠÚÒ·gZfp„_„à>:X8„ty=º²òÇ`ÓOÑÏáŸÂ?fÔèIúû –œVˆÕù|)~åó]à;:^Êý"ùøw<Ë}šÝGs«‹ýƒöOµËùîÖÉÒ:>öŸ¾‹ïôdv:Û’/ú¹ Ç«ŸøBnæœZ‡";=«º˜ ½C¬ú\›ò‚2~\æëô±žàó9‡ÓéÓS°žÈç,Á‡ýcdÿ¡i>{3âþÍuÿ~}þÏ«ßßÑýo‘Ïñû?>Ë^|vÄþà?çâ?yðg§øƒˆ >¦b0À´¦14¹ç,òRù{Y^\î’%L%爘<û½Æý‹1“ö½\—C¤ì\_)`èÑ…¾{"ô®Î÷ošÛ”Q"<'¥Wœ"ÛüD5ÃyƒYn×!%Ó´†­}5~‚áÇÌ uQ23N‹à‰úáãqæ¼mIRÉN)ÛvÛJøU;8‰›‹¤è·ÂkcyþR¶·üØ÷}Ë%S‚@ÃiBdNµµçœû5-8š¦­Iì´ÍCb)%k3#ç±à†h}1Þ´EEgS †/ƒþòÓ‹¾¼¦­øéõËïéÍß°ï8à¼+ƒÁ)ÉmÛjkN^µ‚‹ Eð„Ô5¼æ)¶vÌjzÕÌSFJ}~K[záö8÷;®êןnÂìN¾p·–p¨:ÜÜ“ˆ™­•’;7Ö)Xìô26²ïGÝ÷…“$"n[)ÙÔ݃.Í âNÊN,̈ªç¡_Tí÷ß~K’^ÔrN%'Ê©6 lzôS* $mî9¥œÄÌU›×µ›¥k¾ïÕ© ’ˆÌ]d‰$3¯¦ÿú~w'Ô½JæZ‘°m›ˆ4Óä&/¯ x¥”ÔT­©©ª«¶o{;{¯÷û;»ÚÜ«ûõלY¾~I€2“Ó±ûQZw2- Jœfµ¢ƒLA®:€mÛ­l7m­šeP’”%™·ÀÇ ˜Y„ܽ±wç½:Y;*'0“*'IQšçœn^rv³Çnu¯eK€§œÖ\5¶¦Y›—Íw²ÆÄîÛv#ô=gmfnª‚ÚÛÛ›ª·ÚÌ”ÜÿéŸÿYD¾\HÎÆèü°@»$3×¢ª¶ß÷VÖ*ƒK)Û­€EµeâfjÖLÅ…›¶¦M«¥R˜‘À[)ûq45s“$¦V« ã%G¸k-œ2Áäuà·œ ûZJýõ7MÉ;üÅ]ý7{<ÁŒ zVûb-tå¯ûæ@NIDÀLxÔª­$‹EAdûCUßï÷’³¼&o¥|ùòjj}ß#övU{acgx Ã8Î(ýä¹ÞBm­‡±@e{a–ˆg—¯»««6u¯u³äìƒÆ¡}¯¾ÂGÝ¿}{Ï™¿þôåv»ÕZ[­·×›<8—LD÷û¾ïûqÚlßw‰a¦œÝ©ÖJî’rlA% ´›Ùb(úþöh­šøÎÌŒ¯ PN¹Õ ¢£áw³”r)[Î9Ú\FyèlpWºäý:âÌ[3Ó¨3NIRÎÓ–ËZ£»ã•nÛ6*IOƒá60s”!̼èE}·ÉŽâArê·X’îð˜f–œúnãüÑC¶Œ¨¨‚Ú×+šﱃB†)™9zÇ*“÷WÕn+KJÂb¦ B?I¢~{‚Ÿ]ÎÑuG‹ÐƒîApÇÅ<-¢ð0ÿ‡gY83;(§fN9§”âÃ4mG­ý=SoLé—± ÆÖËmãÛ m/hUÛQ[ ½M& 'Üß0ŠY>®h'â {£åÖÉI‹<î,` Hø.Ò€òz©5JÑYGáÏA)*:–lþ`+p/¤Qp †8™aF*)æpJª1wÝ( °u9×GË`Aq_8óhÉ¥8-“·>H5ÃEgË›»cZÿúÛ’Ä=‡º[»1ÇgŽóãƒ6MÊ'·dÕžz½0éådùÂ#ˆe Æ”£ÿÉÂ]ê2V .˜bTàæ#æ»}?ÓÕaY 0cˆ³Ø×ß¹Ôz1Ë Š¡ fH]Š©Ÿ®]óˆ‰R·"¡¿À«IψÔ×"#‡ •¾3Ÿ¦xÜ'W}6TŽ|×GW(Êe›1¹¹ÁƒƆ)¢û…ÁíÓ2?õHLÝv™^T='ËîÉS?á@=:úZ9ñ§½ý$ØôcßE= 1]ÿOÎë‹|2¯Æ=a"’.öí™y˜mÆã Ë¢w•Ø'žÈlÔ»K³@>öRAš˜þ¥ùåia:ÐnaLá³-7j†¯†\z9úl :ÕÆsôŒÏ@1pÝ¢L¾?˘MŸ” î.@`­ü]b Ëâ¤o¬¬CWÜÐyY«€/ |ÿût©Ÿã÷ë¤Èlv3Eœ33uò—Û-%I¥µŠ¤mc"*9E§X.fVkÕÖŽZãH©ÿÂYEZÓež¦ïoß,)眷rûí÷ßöÇ>(Õ¾Ýn±¬O)%Iù%Uk´ïfþööþÛ··Ÿ^_ÃI§ÕyH˜C‡Œõns3òªõ†<âô˜ö'jÖ22˜ã­î­ºûív{{)¹äbµÖjkÂÒq álµ±Ë5'W-›”Û˶•-—Úê^Eåš»0«{èƒ>’¼N®ÚRÙ˜…D’¤Û¶Y)œ¥6{Ý6u#‹¸Ù˶ݶ82m4úñm»%iZ÷½Fvîö–3p”K6«|Ã;˜^¶WrªZ¿~yýùË×[¹ýßÿïÿ#„f*Ì®®5 Ý15#%u³sµàÂòþ8J.¯)G§\„B sùé«_˜ùí~{{7n©®2† k+åëëkIép“’ŽãPÕfU Ý¿¼Ü¤ðQ/ îözhÉE:¡Êˆì¦&ÛöjííÞîÇaÀ&²‡[äߥ)Î kdέVkÕÝÔ_XˆSN2¾ç`&#rm£)…¼¨úx¯ûýuµDTͼªÀÝóËO nMÝá†V«kc‡œ…] Op‡0¼Mä[Éï­™ª'N·ÍZõÄ׎AHe3"WuE”‡I.…³øýýÞ7@.å8Žœ$‹Cßö0ÍÙ±ï!$³ rt[Yƒˆ{"ÞëÎs=jÛ`ÕÆH¹”¼ñ_ÿ·c?n¯7kÖT›‚`!Uµ;ÔI˜…)§¤ªÂ¼Ýòã~˜Y*)‰ˆÁØ^ã  ›€Ø®¦vW›•t£lƒdbkãXQ›~„4ìk%§-—½o÷Gl¢ ç<…ò^¥¿¾ÖZãXkÖ€ž;·ržLá¨$9ö]’Ür¹›¶PÌH཈±ûC; üóO?¹{­-¬£`hS‘3ñûL‘hj…³4OUƒ÷5~ 9—œ‹»§$º‰û‚ºËÉ+3»©Ç+ ¸°š™6bQÕ¾ÖvÇAD91óR6°äœéK lðóÏÆŒÇã~p%÷-ç”spîO 6Ð À)ew‘RŠ™MG§jeA=²5“—RJnþ؉¥¶z‚‘l ;™öÁ¬9šÍDEX#‡sØk­µiN’S.¹—.Xï¦xÑÔ¹óØJ®Mò6P4÷zš¯ÞEçp÷M›À>Äà 68E; –ýp(¶¤1‘&›Á ¡â·l-ö˜}ñëˆÂ/JërI<Å÷/òcÿ*‘-ª94‹sý2¤.=ĸˆó½óOµ kIb¿±¯îÂgÂ/÷-_;e=Òo´”_󋮌KŸíúîãÓOIkñ^Ó‚åçãwùg:qàúq–xÁçâ¥_ÈþAŸ÷ÎËO—g¬Ä?øÌ?±8ûRQýô]T¸óH=)ÜXg  kZËÙ™½³«gŒ ÈޥؿexVýòûü3µŸÈ’þÉuë<úþáOýósà×Ågz>ý-6ïå[ðYÓæ¢í?zÿžWÄw >jú¸${üé }rNñ§Ãÿÿ?Ó50üòßuóÿQŽcùjàÃì­›ý1ì•ç kº; ¾$ÎíÍ ö\»Ÿîþh*ŠÜ…8Öñ–c!Âóc®ÌÁq_³æ¿ôÐȺ1¢“¯è³™ï2ÔÅľ¯Ù' £8iß ”­Ø´a‡ZB ¼ì$yÝ,ss;'£þ´à¸¦›æ‹ÙÒÎ3;šêíåå8qrß÷’D1½”í¥ln4i3V†e'‡’¼ÚZ«5´³¦QÇKµªmì±vmM“SÝï÷{þöû¯¿Ý¿½9ÑÞŽ$IÕþíßþ'ƒ¿|ùúó/?ß¶œ˜Xˆè÷·÷ÇcOYr“´µ˜kØ8 ç6§ÇqÔ£6³/¯/Â")õ>^æ÷ãør“Ì9Ó¿¿½õx¹m¿{ûýí­ª–¾ÝO"¢n÷Ç#¥‘×’ßZUÕ£µ×ÀЛå­l[I)…Ž"fîÄŒàAkS0'F*åþx(i0.R!°º?jKbkÍŒEJÉ’¸Vu÷Às‡À§®ñUã$Éè@«­ËÄ$,aÂ%¢$læ-ˆu R7Ígi÷vß\ްð‘{É%ÖùDê¤Â aCb?\gÉãØí7«µ&pk½ 2µzH’­ÍZ­9Ô¥*€n›„-ÚÌZkªz¸&áùË/± ßëÞÔîûýVn£5²ÆŒZµ™n[Và¡j­5LSÊ1ˆÛÛa ¤dpBºI2³ªªN)‰™‰{HƒjÄàÄâÂ"±Q!¨œí¨¤ N,^È„½R}»Ûq:€Ä¬³+'oYJNÔÚ¬H€˜%å’˜Z;8åÀ±¨iÎys3W¥r»ãóZ›¶£5c”ÍQÝÖ¦!k´Z“°¦?½©3]š C=âÍð8Žvz«UÝë~¤m Ó»3!™eõ˜süòú×·7´£©7"¯jä[)î” ßJyÙnq¯2Òã¥:"Ü"92K"ÍzAÙ|œ¤à%¥ûã±{³‡$MªfÎ[Î) „%™ÝM©Jp4׉½ŽjÔ¾Ò¨C1stq·Ûš»0ÜÍš½·vpι¶8šˆÌã`šSê3$PºÝD$FSýKh÷QÞk46XuI;y~Gk•ÈÅ$ç"à”rJ%Ir÷Zþìû±Ï?Ž’ê1LMª5]<›¾ÇãñRI")§(ñ¾u=% GÚ(Dôv¯-º"YF+Ƙo䨛0Pýíý½U½myÛ¶”’¾¼¼¼ïò”%•œ§nÒ^¿¼?îïïï"œÀpmN´zw Q ßRòVŠ™5S·`+ɶm[ÙXX$¹»i“”MMµÆU´õxÔÛkÉÌÙï\C¯QwfæÒ³¸à“$Àœ˜u<¤^_n¥laŒBÜg¹ä< m`ú#!À`'@âzcš’V¯¿…©;€ð†ªË"Ü“adv"RJÌ·tí´-s3»˜9‡¨´¦u0´ÕÌŒ0e»Aý1?›1Ñ£c…È–œƒõßZ FÓÖTCš Æ ›3Hk# Z¡ɰÆçœÍ¼Ö:U¦ֿòfàŽ½Åª œcDÒ˜DÁ»ënââœ2ƒÍ½y sýÒùçEº²Ãp·Þô\AŸÈüR' ¼†9™65W72²¬µ©š3ÐKz'+»©‚\OÑÏÇ„ütiµã|FAháÒ¥T¶‡d1¸%辕eòn-W×¥1ÑÃs|_xÌ œÔ4f?‘“ú¼æè€B‹g0w@÷I&é“§‰ p‚‘Qüä0¯ŽÐ‰hŸ‡‚CÍw'÷YBÌˆÏøÆÄ”òáö€†ôd3HêÉb‚ëïx\ä(ê"îú‹9ɨ… ‰ys†Ç›Ö"¸‡õÅ­Ü;·þØìWˆY¯ÊG~´ai’îÌ-Êœ\$èOçÌà4>_˜9¼¨ÿSíë ¤…¿î¡Ô“ãê>Ã/öSëWô¹Ì" ûhh_mû±˜œŸÈѤÑRÐ)X#ì²¶DÄÍ× ÿ4^4÷•bß7|³àù´ecPà8 þËûŸ%ƹ&çb5B«jtäÄ¿1*µ.à q²Ñ1.,ñéú(eöo%rŒNǘÖFQöÍx}/C¬Å¶ÏƒGCk±vü†.úÇ2‚œÀ±™UÌóúˆ¤øé›ÞðyƹWÓøÍqE° ª&SgL¯Pã<æ è©¿…¨1?kBæa|&—ôg„èûr(NaÚG <Í“¯«ãtÏÇx‚.P5w\ò.ÃÒ>Alçæ}>W0 c@Sw|ôI~&öà]€f=ãɃñU€w;?ëBáx…SìëÖF[ð+LáYß=݉‹¡¾ðæ|¦“^97¾þÝ«AÜé3†È°‘ñhXP9ý¡~‘кAÿb½JÓþsÆdЪVŸÝç—>Á%á‘|$I_ÕÕ§[îÚ”°Ú²ýªOùUƒŸØ>›w§u ч ÏTüïjãßõƒ_ Î7‰Ïi3Âìîx©,WíSs½üÎ,Ù‰ )êGS ÏDTÿ– ³€þœCûO øþþ»ÿûää?õ¾1÷ ßÇëû­âxþüiõÿ¿Öpÿ@øl^ƒ¿‹ÿƒë½óbá}ü½N9ÜhCI?ÇC…®Ž‡Ý †ØŸøH_’G\ žØ²Æ8w7Ëõßé¬}Ï3`#&=šíør˜üÚH?³ks]kÂýøAør‡>ÿJO!tãOÏR¸©þ_¦5SúJ|èúù4ƒ‚+|ï<ìÉÍRVEJ‰…«¶Zw'ÛüörÛÌée{ð£î­i']0›‚¢ÎY˜S@祸zk-²ØÇ±·Ú¶m{½ÝŽãx¼½ï÷{;Ú¾ßÝ]²dOÿôÏÿüßþå_Þ¿}ÛÃûûýþ~ïvB¢œ³›½×Cª¼l[ýˆt 9‘™¹ø¯?ý|ìûÛÛûQ·M8 1R2zûýýu» s­U]ÑûŸRʾï¿ýöÛ_~ù% C n,ì uß"»í¤îÌ’Ç·l·c»ΩV­­™u~tWÿû.¢oºj«oïwIy»Ý¶¼õ ¸ÙÃ=%Î)‰ðÑššðúò…¿àß~ýíÛã-KnÚ:#Xœ€$Î9íûqU˜9:E”ŽZÍCÐÑfáDÓÆïõøööÍTs.fzË›FCwÈ’šz)9Ö–Y¤6‘œ“[2WÕööþ–%G9§e8@…Ó^kÕ¥$â\lu˜adjVÛ®jMõ¾f¶·=¯¯/îþûÛû¿þõßö£¾l[–ìð’¥HN)…9¢µñ….âÆÉ3§üòË5µ½¹ª²ÈíëÏNµýú Fd­™ª©I¯–`‰™bkUÕ¾¤ÒTëqs3߇QÛãm÷ÖÈ4H¬Г‰ÿò—"2µÖ¾½}K[®GEbqg)R¶ÍÉ™oæd‘[W3G"jÚ´?ÿòÏÚÚûÛdgÉ®{3óýÑà´WÒ¶«j³æ­ä×Z«©£î;'–êšSI ·ÚjSßJI)×Z­éÛãPU30Õú ÃÁ”’ïûV¶£{«]É lzØ]éÑ"áÑÜloRÄÍsηm‹¾ÉÚš%gI©p¢Âæ +X£ëî˾û õ3D¤¹ßßïêNÍXx{yÝJcxyßJ¦E3‘œË`\šÓ|ìÉ­ïã‚3"R"}u­¥”€ãŸÛ9€˜ªjoЕ0E‰ˆ«.nƒA¾š;Û>Á]\“­6wÿ¦æ¦¶íFn̶g3I"F~Ç^›Þ¿þöëQ«0ÿôõk˜÷Ý-gSìPp]M-nz¦è¨ÞŒšsy}yåž ˜r|ì®e8ÇÑT“HmMµÍ)`‰„SäZkFôx<Þï÷c¯¹Hʹä8‘ý8ÌÂ9¥”sÌ]L5çüKÎÌ¢ªµU2ÒÖ(DD,q ®·«Ù^éË V@Éž„ˆZk"’DÜýþØwfä-ß¶[À`kd`-R4Ì„;‰q7rÆ](çòåËKÉÅÜë~@¸Ï&gpu¡Æó`wK"Üuð™_T†øýýte‡ü¤Á¢Ÿ™ªPhîî1°ôâ#d†õH@\MµW2IŸÒÍÙx]ïc|®“˜Jà›9ž2Õ©Tž/7 ¶Ï2iÛ§ÎY9ÅïQI<Ã7Df=ÇvN æ—Z¿3öjà1Y vÿçáxuJ1ó¦=oõã—úî~}¸vÿ¢MöžãÑqKsœ@4 ò|–¬¯Ç¿µæî“Ëï½}n¹ˆFoñ"‘™ŸFÚÅð6ñø>¥ö1¥Ð“öŒ#LJÌ%Ià.c%ÓAsçÃ׈OÖËxÜ º…|Êâ<Ã)'ȬÑ>ç"ÚÛ|N¿ER¶ÞØenÞ"<7ÞpþÆÁä­t 9dŠ;ð960á”$LQ´v˜%z˜ /…„çz&c†•ßžõÁ¡û Àh@Y…®Å·?·ñ+«gÌóf3hªk:>RM0/BÿÀ›áS¢Æé‹ÄÒ t*×ÀÔ3±x?j¶¸Dú56§+Æg¥9°v-\±—ne\Á3ç§úڦϷ7ûÛO†ò™4|Ö/ê÷|N}"ŸXÏÀ§5Ø«G}mŠý¤Äàb3÷g Ã)çûG9ë_{ò”Žæ*:3”øÍÛ?±Vã¢ò¯LŸ>pöÝ÷æ’ÐÝÓ-áðòO4ežc|œøgÜ  ùt½ìñÏüSÄ÷¤jš |”°?vÀýãàÌ`¢÷ïX¨"Ñß/ÅOãû›x.ôÝÎå·ê}©²þôúüá§Â¥!c-a÷?t§ÿ½Ó”ÿ ÿm2€?žxêqYoäXè4O¹‚îZÒf8»Ë;.¿ÛOÎÕ–Ñ|Ým]G˜ô=4Æè±² ’èÜÜ@†K±?fŸwc^&#ïmHìgi M.ÿ àö¿>« ÐÿoüÔš{¯,â¹ ÅsÓ'í&cO¾¶Ì|H-«šÏn(¸–7øõ´Ž>šÄ2}OΊämÛ¢\‘YÞï5ÚrùZ^7ß„µ™Ž¥['yám´œn",ï÷{)å–Òãq¤¤%3Wµ¯?åœrJÉ]ãâHœÿòõçÿíÿ?ðÏííÛÛû±{Û÷]ûNÞMݤ‡ÐÚÂ]>crb‰m:ÕZs)?½~)?ÿåÿlÿW­ÍÝC x{׿ªúxìô wÓݨ»Lœÿé盪Þ÷½[r@fÏ9Gg£¹³ˆ…Žœ‹pb ¥ðN¡UmjäÖZÁ…g¢¹Ÿ-æ½ÖG=ûþ5ç×íÆ2ºCp%)9¿Ü¶÷¿þx¢œäõååý~½bnf÷û]­ÅoI^n7UÝrÞ[SÕZk«G(÷÷ûc?¶­Ü^^oÛ-¥{玲 ŽÿQk§‘Œ9„smµ‡šÕvt6QÈpìLõ8vŒ¼Dºæ2ÅŽÈ Dç3RJ¯ÌK ó© I$K˜M-Ö ’$Ž„°LBJRJI)ÇfOÍÈh8I:Üé’°‹ O$ÇTÆT LÌjÖ]úÃ&0‘Þä‰ñ pð®]ÚØ:Eˆƒnë¢-8f!(4ä ©°@ÆÃ`̤6"_ÓwÇÁyq y«k¦nÞØº\#LL"¦øq}Îûü”ÂæÊ85óµ÷.äܵ`3xë¹'sÕÞ´5umõanÃF £×¹è1s2ùÉœóm+"rê•Qð£±O5˜Ø)žPcêƒg»Ø)˜…™Ezc³5'sçÓÞ¼õcÚc–À½˜˜†2 PZÖ]<ïB½E%8Tzó“‰x+<¡9Þñ3s 0-¡ŒhU½T­Fq6ä"èdÔáòsßïdÔ—ˆK:­ß4Œû¾F@T@03îºyŒÒKdÆlâôHÎuÑð ½Å‚àÞA4ÆÜ]1ð˜Ž9D÷ ÷ãÀ8]³ÔFqXEÚ1ú*†©}àà/Sìf¼»s°ØÒGzÖצá¾ùap¬Çö7žÓ°ƒèx¿=3ÇD†žÛ«w—†[ Vþ*N‚%­ÑƒA&_‡×qFºë~Âɧ;»w µzp2còÔw:nÁ£9Á01‡oʸ«ô?Dטáõ+‹16OàÙ­º6”ž¶+~i1«îɆ¿îwÂH>ܨтÀÃhÂä§ÈŒ–™—¯sˆ>luÂ^œî-u²$,ñ` Y<¤ö±9ÇOf·¸ô1ó(úþô±”õõ÷èˆ4‰ü–Ù46К`ˆ‚òK¨â »ëU2¦UmS Y±“ ½©žtý˜±' úAJh±ù©iÀZã:ù꟠I°ff^ÁSMæýÚSæs8Ãàó³¬rèB=÷ Cë†!ëLv`^‘ˆÁ:$?Ÿürë?r78 üãk5¾ô§Ý|âöFOàŒu¹àÜî¬øŒY×zsÀwèÀ«™Ñ'»먀üj*œ.?=ÛO•«Ý?ZËAßמ?ØÙÏ æÙfîþh\+Ó°’¡$‚^,»~íi—'õMm8ÿ;n‘G9ÛÂ>û‹zû±zã³…wQ¯_|Gý÷sµâaÑ'¿WGü±ràɶ¿»&ËÍÐ{ÁæÍí©ß~$kæb¦‚ˆ(•m#÷$rÇÛ·oÂ"`'Ši}<î÷G)›ºmåVr¶ÝµUm½fЦY)Z1{gÎ9×ZÛ£¶fYZìÏ“le{yye™ßï­55ûë·ßþë_9ñ½íͪ$ÙPT=¼¹G­jJ ˜7o(¥ˆPìJàDÎâÉÄÝ……œn·òòòJô^¶äôþö>ɞ͚<ªÈ5'Ùr6³÷ûñõ•sÉÌì‡'IQì©T.91X„œ¨6…ø®M-:  añk½—/  ®l­¦c Øë<½ÃÔœºCVRSÛëˆÿ}ßKJIRŸ»L„„ZºYF)<åÞJ"bHÉdª{=ªVwÉ[*ò’3ˆöýˆ ¤6ݶ¢u‹)¶ñeÄ>ÄÍâesêÀb³°¨²™ý|ìp‚Å$žÒm`RNÉTK)IøíþQ‚@Ì]ÚrT51“™ÖVÁLôóë«›íÇrmíÝ*+Já’‰$u%S&³ÂáÆÌæÞÐ×Û­Þ÷vHI¨ØÍ2À[†¹5 wp˜”LÝ̘©œÉŒênMaæ¦d÷\Š’í÷ß__¿l¥4µ½ÖýÛþþþøË¿üåõå7¼×wSÎpâ”ÒPˆ´à’rt°°[u¢ª•˜ÿúÛïµá—Óºgg4˜KÙJJû[­ÍU›{É"/¯¯ïïo…UmFVÊ­™¶z˜9§ôØ>jc Õ¦IÄŒœafzì#%ñp›ŒvX½»„µUsÏ’·ÛÊ3¸6Í95ê€` .p”¸kÕºïGÓfF9§=³¡‡{lK )‰•”6 ç¬æu¯å&Â,YX=çüË/?eáß¾‘{ïïθ b¹]5;ZØ„Ím”rŸýŠHî Ü 7ÄmÂÉc¨¹ìŠ"$wpa>õª³´p¾‡ð„2óbLc¨Y«ÍÔêÑ:J˜\[kÚˆ(§"Iyô÷Öfš‰¶RÀ03¨6Õx3ÍÔÜ÷ã°ø»È·í,pI¿?4üqÔEœ.ô˜Íôq¿›Û±""[ΠRJÐÈû¾å’˜M¤µ¶GHùþúÓë¶Ý^n/’’›KJ¦ÚAôq«(ânñÌ"ͬ÷i×Áð‰Tͽš¬i˜hKÃFluój`„æ8K/SÊS5ˆçð”N¤C̽»çE¡ƒnDùãþ*Œ‰‰^ZS9¯«þ×CÂs7S:Ü:ôƃ)ìáÝv]… Ô¢nhIGŠcògǶ«°A?ˆD…“ènVµövaæÞcb½f¸åÚCWe7›9„ÉØt#sÌAèöc-7¥Ò1©èC‹@fùˆ|Q°ö»å|Ñ·²crp’8Ýç!"0§”2‘—[kõ8ÞDnátvmss5ô\ˆ¤À(.ko1nœT‡8#4ɶS.¢öà×÷6fÕN ‹iöìÛŒöù³@•1÷¬Ã·~ 6!­ðleˆƒN1€15mÚ\±‡j Dß@ÀktcÄ¥1YKù´› Ï Óœ=tor0€úа~;üÔçuÇSt„ñLìë á®ÂÊPaŒÁ„ ð$!l4ces‚Î8çè4×±¢é"‡][/—±j¼œôoH×úçlg2Œ¦›{©œ/`ýàôlÕÝœGj£+eËÀÜ/ þ©ÐõùqÄ(z?lÄMúˆšÄ<ÚéãU0§,ýjažá9·xFûÚ‡V6Ó•G3öC®+ý<¸àÑÐ|ªctºò‡Oùð\¶}ÓY?i0]8™¨kéO\—¥uƒO@¬ølµý¤vå N`_…½‹‡–ÜܘxŠéz7z~ëÈäã~wm  $éN¯WíO>ßðé„^—MžþU¯™Š5qÙó.¡‡þÍê‘ (dÑ™ç:rqñEI™­~ÖÜ¢¹žˆRJ|àÈÖü‡Òq­W)Ù(ï¡AÝq‹{Î%ǪŸ œ„Ãj7¾4»b㣪®>!9±H“ˆÖMU1¨GÃÕû?…÷X:Ol ¯t`UЯj|lž{?ÊÈKF×iw.Vh>wßcÔäç´&Èø«Óx^½Œ¥x”.¹,Û÷yg÷YÔ1ÕcëÃÜÙ4L—+æâ_ÙdãáWHа!âƒÐ¶ÊuNîßsÛŽ0™cûŸ¦þóÐL…ôJÉ¿vŸƒ®qÅ¢Ÿª”HËìÁ] ¸¨Àë`u1p‚˜ÏS,2¶_MéOŽúÏÚkŸ…êeÜà?“?xÊqb†VvO‡[|GÂûÄ€îOöO[QEÒh#‡qR b Hý.:Ùö4qx:±—@ùç>íîøUB?¾:”—Ë™¯øp,Ý?¥š|Nîùð@pú¤ü÷y‚ã?v¡_~ÜÿƒÄaüù_ò½YþŽwàŸ½ ÿÛ>?%Gð£×øÞçüyýîÏ·€¸í2ãĆ¢¿HèÒ´°ý‘Ë´1æpe™¤’2'y¹ÝÔtßZ(pcpÔ&¦R@tì9xÝ Fø<`÷Ú갱ȘÐZ0™·£ÖÖRÊ)¥Z‹$×Ö$‰Ì­¼ÜDRJ²ëA†ý8ûΖ -Y’<û‚™Kâ°\¼ž2ˆ™5{ìÇmËf·­wØË—Wan­>ûÿø×M)çRb—@ Coª"r{W­¿m/?ÿüÓËË í(v™¹9‘CÀ­Á¹jc¤ÄBߦjÌp'ÎÂ2×Àƒ”R¤Ûä,ÆTkýÈIä”Y¸Õöxn¾åÔ´Y,‹‘dè M][Å ž…“¤Þ“n,L`VxS5e÷’—¤ ·ß¾ýúÛ·ÚÌZ­¼Ê)½ý&æ¤nU ’o/7 5Z# Z ±“ÃôhÖ´¢‘™ÑÛˆ$ñ~ìÊüòr Gžm9§-K;´6ÞIRÉ¢ö8HU õí¡n®@=Ú)2PŒo¼Uf$ ú›U#S!*"ºï÷l”Õ]ÕͪH²æN¦ÑRˆø®qh£fÚ<'1÷¿þö+ˆ}îeDfÔT[SZS7¯ÚËT…ÙÌjkn¦Ú¬Zð%ò–¼±\˜¾~y})·¯__œ „”SìKSNÌÍÎÔ¬jb¨¹jÓ¦Â\€¾YeHæ’‹‚!nn).ï'¶îl‰+Y€n#5€‡¬ßó+"ÂlWfq”d°°$H‚ÓÚTá®Ì½ì”È“¤­l¥`Цz|ܵµßßÞŠà‘¹×ÖZ=‚®ff//¯%ïkóa5fYcïÌRR2÷¦ZkM)u[ºZÎù§Ÿ~Þrp›”R*¹hkYÒÿÜÿªªýi“ù—Ÿÿ’Kq÷Þà&úH0/8 ©2ÀU—.iIÉ´©«¹™º$œ•ì¤.ð ýy  ̬ª f€Ï;=¤´5^j“Y` 0ñÉŽh†IÙTkk¦4¤ùpa–Äf.„ÖtÞî˜YÕÔ”ŒJ)ý…Ί]›åi í¬bÄçÔZwâbfE¬ÃOÝÎÍaÔoà뺗;Ό‡…?6Xèú*¯Ã rÏýuPz4¢§º×9ÑÓЀâû0NÏš‚ñ£á#bFk2=p`Ѻ!Óø¿ú¾˜Ý9`¿Ìœ:â  VË,ŠNÿxÉ)¾}‰%æpMû¾ßïwÌ‹•“˜Ü|½¼úb::ß¶…ºÉ6LÏD'Àº¨KæÝ#|ú|OäõŽîp ÷ˆÁ"‘sÞ^\û¢ÌÈfšÉ­µ®»ÑpWt#s83ч<›¬‚°ˆôÎO‹nÈžpàÓV×/Na™X÷U÷…è¿­¿®N½ÐzÐôÂÒ¹ù]Ýfwoc`Ó)8S_:OaÛ'—?n§=z1É̺ãb¢ëÖ!ÇÌoN;¦D·ÎÂî~L´mÐä–Ž„óÈ™q 9ñ¨Ñ6ò>MéG€æ£0V¼´N’°ËY+ ÇYÑãxv6Fž8)rýœEÙ8zöLô:¡¾t% Ÿèª¡©øÕ»ÞaÏë ?þEÐÁRøÛm™èÓ=L0= yõ= у uQ¹—;âÙ㎫D¿Â–˜æäbqø¤ÈY)´*ÊŸY'Ÿ] §x´¦7ètJ.SgžÌÔ±>ÔüÂó¹ÐMàWYæGh–EwúT<ÄÕí’ÌY4MO°gÿ¬Ò`M[|Ú÷ˆoöĦ †÷0¼Ž*f„´óÌ’xj|^CÄøï æþlß^âßÓ]q^R~ øÅöü‰‹vV-ã‡2øŠn,÷®TãÀ;þ7)ºôïúi|¯_úOþºOë)üÏ æJ¨Çpÿs'ä?EÃ÷?õÇÿ 3ÿÛø?g´ºÔ—¹ë•1óÜC{®ø¿¯ÛbžËK¾Þ¥x ‡ã“;,fiÍ ÁÜ_òŒ1-Czœ6þн£qù^ç·|Y$ã©3ß_Ê|=n•~CíTñ ̽~ï|—û6¹_6¾¶·øRê>v÷´L×?¯þ…å‰ –€êÔR ³X¼³Ý6aùúúe?öÚZ{SS;lênp8e`gm•8Ödž·MXÔÔÔÕ,%ùòúJŽ÷ÇÃG\ôþ¸Çrð0ËàÛíÂýñPóÞlé€RÔᥜ“ZÕ;‘ìj3§ÌiÚruä@UUI‰¨¤M‹1É„ñz»±0ùöòòå~3óœrìï…Éé+ѯ·×Úêÿÿý8¯¯_¾|ù)'É)ß¶Û·ûû±×,2kÙŽV;-ÂQRÊœöv «;«imu£RJîì\37ãYGD@ yn4գetmñ€æ’ n¸UÝsH©UKœªÖUÃ]XÄúTøO3Jœ^ œr7þhkÊÖZ&s ž‰yè…Ú+’˜¥µUSغ|êÅkîŒÙÊåc#Îêmˆú¶w„ßÝ=:‚9^Š'NÍÚ··oî¾mÛ˶iWôд*©‡ÁÄI@„Ú´™1J"âf;Ôš™4K·ۋÝðí×ßbÞ¿Ft#*ÌDthS€3¹ç ¸æ{ì´ŽÝo¯nºßïÞ¹EÏ3'qSf&·ãñxÑûDR7wÇ=v<íMæeÑÌÌt¾ëŽJæ±™gCUAèÝkÌŸçbnV`Ʋ¤c|€ñc“n>Ê/;7‚‡F˜O wS³`€E¤Ç-UÁ<¥«¨–Œ©UÓ¦†Z[H}­©ÙÙÌ× Þ€xPˆzÝïîc÷ˆRÅ' ?q,© ÞQ?£¶!tÆ~$†@vÅ©3°“°£©©µ˜=àæêfjX¨¡dÄ¿Õzs¼í”St $féâ¢G‚)®gônjWŠE¬Â}>q*˜sq<°Ùӓޡޮ°_èÌÂ`3ŸÛušGAC‹Š"pñtëgðûÚ;fncÅÎÛÜ%¤>]蟚{zH¢ýr³ÇÕm=C§ðÙDºøæ'!¤Ÿb›•˜J©¯®ÚåK7‚èp‚{¦Î[‘ ›ó ¢úBm1c‹èy¯˜ý 'æ0úÌp¨ÄÈgÓ<ä¡aŽ÷â“&e`ظ~–­N‡à“32•ÙÏ>¹ó“@ÔÜM¢È éï÷I,>g_0¦«öýA1é#mš IDAT„)¯lï Úêm«qmûúG³Œþ4vùë>Î``Áù›DËÌ(t“ñ)"HÝ(Ϙ'i|ÅxNï|Ó`çieže€§„}aÑO˜Í~”¥*Øür…œnó‹mpáëœ1ˆÇÓ~ðj µD'£ÿJu8X‹í3аXæG+FP-txþTÀ{2ôÕgýägK”Eæâ‚~䂼ֈ^Ê >å‹òrbï/¼ׇŸ£<Á5ü“ß~Þ®Óމçâ€ejážùàpš¬å•g–ÃçÕ´LÆñ¡H¹Ï鉨˜†0rˆ‡ãO½Çx•|ï N[¿? x×ã{­­pz&M=ag”.„³ õ3ûÿ÷õå Çäé§±Ì÷þ´÷ÿOèÖø;äkÿîßü»Ôÿenò<ûÎ¥ˆâøÔèÿ¬f:ýy·ÿ¿[ý÷¿oÎòþÞŽ?}ú_p­¢åõeOÿº¢;­3=€ë-yܱF›Õt_×ãºÄZAp …-Â×¾—+'g¬¿æí2ž–Ý4/E?Ë‹Wý̤TŒÞYú³/ŽC—kA܃ã£~˜?¹Ü>ܧ®úð§Aȯ™áë¼³?Îør[RÎéØc YÌŒÔàœRGu3—Ùý8Þßß·RRÎI jµ—^ /fsÏ’œ,¨Û¶ÅÞ5wv¶.V[3kŒngjs€séM€ƒ<àNÈ’ùågNI[…3È<%!BS‘ªµ©ßy?š`Ù1–›F:’éöšK˜yÎ)ÒÐÌbÞ"`›EDÄ÷û½s*ÌSJ%%ß½695³}””àRk}Í[fÜUûZáæ¦V¹á±ÁpzÍ7’ Ð$aJà½U#3³½6'¤”Z«î.&9Iò⣚»7  (sÏ Ô·zìÇþ¸·¯__n7¤sjzµ»»Öñh5‹4“¹EF3Sm©áýýžD²ˆ;©·j{3:Žã¶m_^_&+SF¶ Ò>Gv÷µuûpß¼s Ô]˜Õ‰T…ÁÌ ªŽ*"÷ÇãaÍ[άªæ~‡;%îø©µ¾Hn­HjÇ®û£©‡àApuæ£Ö£ŒtT“MB ;ßnzìÞ\Ü-a¶NÅz9»?ˆöýpsj½ý1¾àUÈî{}ÿuïÖä8’diêÅ é‘S½Ò3²ÿÿ×m÷TeE„; ÀLU÷AÕ :=22»W¶&Ròî$A\ÌŽžó"˜ÍóœsÞKÉÓÄS@ š(åËõº\Qe–u3©&&*¾µ-¥ AJ<ϳh©)ñÄ”æ…5%»ÝÈRžP÷ ¶®µT¦h&¼ïê•W ˜jUð¹]k¶4°ó’¯Ý>ÉÈÔ2§ðî7ÐS¢Ä€fbÎò×…Ýa]&Þï{h©n eõIÀQš9,àm¨ngè`}iüf0´ð$™D45£ñÐãçKƒ®£µlðâZ«ž²¿xÚJûDÖ_OÔTcô‰}ÂF8˜XÑGHÍAo®âôøî©Pmx•V!äûÃü{ðVµíw/UÒ^ZF€è£ù  WÐMÈ]£Õ6úèÆ}cüÙz®+°Â[r³ÑåØœêÿ@ÎgéK7°«>Àâ[Чiǧa@¼ºŒC‚Þg{ê®ì²ë˜ï±³õxPùâö®æG°~OÆDPCήj€ù£ûúGÚ¾ó*›ªŠ#4Ÿ8,:ˆ4¦]üø¹ZÖ>ˆ~A45C=<Ðð×)!Fþ¬iÇŸ¼Ùåx" ­ÏÏüö~P²ÌšËÁ¿ ¿cgHÍ9”ѦÖ/¿p‹·¬ü0Ä阸ŽÛê~>…ëø­¹}at!µ²4ƒ¡•{8õè ÖÖ%rl“Í‘j*uvhÞ½à‡NÞ0ö9 -œk½àbH- ­‡.Ý ]ƒ-+ö˜í 1svê‚n£Ð¨€=qÖAóx”œ·S†ƒ6tgâkõÂnüÇb×1á{ÌFt `A´'±‹§Á³<ÅÛ>žªŽ?›<ëøuý¿Qý‡ÿJãðgâ¸}./ãçÏuéÇ~ÏÞðåþk¶{ûðÞì¿÷þk¨ÿŸñãhá 妷ÿâ©Hþ˜Z·%$ááÈP£€Ô´t$jÑ )±îoá³!ÎÔŸ¯þ`Æ&3ðþ°¬2æôã}º{õÝžÜÓÇÆ™N×¢¢>Öà˜47Ç“š¯¶U¡—‡á0$Põ¦²1a×¾  ÃRá1fÑâÁ¤ÿqVz¬ˆ‡‚’xë T31¹°„ZÝ-Uüøá¬Nä ä÷(¨IlUTMMô¶nHŒeßó4MÎèȉÁ@Ìæiº,ó··÷üïÿ\. %r¾™¦iʳ©n{V‹¼.¯øJ÷Û­”B„Û¶Ïó|¹,îÙÔU·mÏ9{8¡Ji-‚Ý¢¾Ó”rsÄ™WV%bUµ*‚ˆ¿½~¹,˶ïû^wbºçíëË !¾mk­ªªeß·}ÿòò u/pœsZY(–ûÀ6匄·õŽ„–æœÒËõJ„ë^л䶲¯ûZª¨šh!Dv"1 £ 59%FR5w±&¦9O—eQÕݾÿfªÌœRruÏ»#&þ¢fZUUu7e"q[1ÑVŠªÚ”¦pÑÖZD¶½ÑÕP52pÛ5hϹ«iа $æÄtßvQaJà`QT7Š;òe7»Ì“›m)_®/ó<Ý×ûÿüöÍÞßޥ߾|¹N“˜ŠHñ=?Çòzßö¿ÿþÏ̹ÖBˆŒä‚€˜˜ÁºÕº0ÞUp»­ÓrM³š³\ ¸» —²ïBSÆ­ Õ¬P‘êý*²¢B)õööf÷m“R¥j€ë庼\ÿßGD#Nh»Bº^^œS$"ЍÊE+ìóÎPQBÊœò3/¬Õ]SNÿ×u!æ… R¢œd]”ÄªŠ ‚‚ÓÕ€…™«ˆ*­¥úþÊs×·Û›(Ø$UyZfÞno®Õã¡Wa2¬Œ ó4—RJ-Ì̘Ýážs>bã~v ˜2RâÔ¬¥­¯bYE˜ˆˆs2fvÎU©UKA Dh)ˆ.p59ò¶Þ‹Ô×/丟kJÉ )QNÙ‘¸qš"Ø*VA§ƒ!&oÚôQ­ªx÷fHä™UUÀ’)ûΑ]…=Ø>* ¶gØJñìûzÿþöýõz!zùöãÍ÷±Ì¬7s8olbCý!‘mÛj)÷÷Û¾ï"z½^__yDÒ»„R"¢eš˜Øµ†Rë¶­Q‡›¸–êm{˲¢´÷x­¥×âsʈ´®÷Zê²L9g–Ëužò²,÷û½ûÚDdÝv‡ÅÝ÷ͪø7^ERâGr:6&ÿG/o0Q©›l¦HLÛ¾›Š GD„)bâœRºÌ‹?bªŠ¶"Àò4ƒa˜PDz÷¦Ôêâ,3ûÜ>À#æ8jfUP3)âÀ¨”’©!u©‡Õ0¥ö!D­R« wÓŸís‘Ô3 ŽŒš™¸Âl&nCëJÃ:Æ/~8馃5Û‡±_ ž:¨ôMëšÚˆ¯v ó(ªG+l›gSo¸‰K‰™»xí€ø>öèöIïóðl 7írÒҘݹ'Ú@½%*ˆ¬Y‚ÎØ×¥¬ÿ 7£5mtõü@XÇF<ì§$Á³ÖRô?Üðô7ßiQãh¤ó3‹£ §"¿üDC#B¬½Ô¡º©ÚÜÍÑÓ¦öuÇç}î"=P3Dä…ºíMˆ)%N©ûÇB‚7{@e´uë)šnëáÎAêÌv¤i‡ñ«lñ5ÖÐoS£´>võÂìõTU¥V<èy_ÔÕÑá$¿/;FvFK¹)ž¤-µ ­Ýƒ£Ó`¬è8z|ÐQå÷ ÝóÀ‘Ç3á°ìã‘×ÝÓ€j5^Cæ!‰a ulì· Ž¿ÐìAÈ9îȈwÓn¿ï·ÚÏð]¥ý ㊞ÆÅvüÔ ³ö¿g·l0 –ã³&ufûÀÇÎxÆsù€ƒÇAä|Ðãâq¶Ÿ¼íÑËÁšã<ôÏ.óxjF*ÿ( ÐO þÄ0€‡¶ç8w *DãóϪŒçÈ3 г£…çêAùÇSYBWûí¬ƒ»­Å`ðÉkÚØ¸{,oŸ¹ùzÏ+•íÙo¢DÿmÜžög¤ë¿¨þ?;ýþ´Yþqâe”°YŒŸ¼q{˜èáýÖ?#sÿ©)ýñ×ÿë¿û_gL€¿ôŸžü¡‡R"+yñ„űr×·‹m“0èÖôŸšºC—ÖâËCCCSh}E=y†ˆ ¤N|êdÿä^(€&ÿ"’Æ´»£ ç,u/‘«ÿØyoFÍ´4L†0µÅAO¾õ@ßiÀ"<Èíf8·¶Í#½…¨õ}¨ ïJgÎñO‰ˆñ”OTDÈ9Ð ‰°Hµm«‰¿|ùz¹\¬V-"¡63N!ªë9&Ûý~»ßˆ(1ÏË2å\EÖmgæV´—N<å<3“¬ÛZE‰½ÉV­íNU­”²•-qJÌ¥ç()“LH(ªÛ^Ììº,ŒTM Õµ¡ÍUöÅ`GÃõDL€¤PµÖ½"šÒdf"æõ•¿ûçõzQ§û‹ÔZ·mw舑‚”Z¶ÝTc¿eš9¹•þ?×]Ev–ÌSž3$U5ES-û¶o%~¨Ve„Äl`ÄÈEÑ\,œŒ$h `*Æ8åüÛ—/jöÛ—¯¥ì?Þ~\_^aY¢­ÏŽž1FRSBR+žu€Ä*Ú¹–‰¨zE¦ªJ­ŽpO‰¦œ¥.n=3mpH`J J™Ù×ʉiÐ&:ËýUD¤Öjf’³ˆ”*¾Í3³—e^3_ly½\__.oï·ûí^÷Äðåún;çg˜3Æ!!Þßo•XUó”!å6ô7°jL*¸‰­†Ôdµè„&;Q6[ˆj-`ê`+1ó! ÏÓlµTO$"Bbž—‹ªˆê®’SÞË­”’sN„)¥Û¾ Âåõ…—…Œò4Q¢uÝ÷RˆyÛ êž¯ ƒ(‰)p¦²S5ÝU€’'%)#£ŸñDL¯/åÇE…ˆ¸{•ÙT('G¾CU3#r©Tc³yš‰Átš³T6FBÆ(Sl¼ O±¨!bÝk¾f÷låÃvÇíÕÌQN¾r©V ¸-3<ƒSÎD”sVe5C/CPC¤Äͼ&¦px“‘3cÅ)eûýÿØ÷ÝÕ N|]®ù•31/SŽÀHÒš9MUÀÕ@fä*8"ghǸBL<‘ªòûµ“c†m¤"@J ÜÅ €ˆ—åò~»ÿ¯ÿù�~ÝöýÇûî§z­UjMœ8±[Y ý€ 0Àežérýíëoë¶½¿ßæyr§š'|ß(REj31R)e™gUõë Èhšæœ“¿Sobpm¢ ¦<Ñž÷û¾–²ßo÷Ëõr¹\}ÇÞK€‰ìåå¥Ô Á°âmß×mõùbèà*eÛ/¦º‹R“9],í–=Ù‹™mRëZÓœrÝ*"¨1LMÑPUK-ªR¥ÜÞßôU…ˆ¥R¨ÌÄfv_ï>ið ƒHí©²3›çižg ´<;‰ px¨ž?H”ˆÀNdê0z«siG¸×T©Ó”¨->¼bW‹øÓZR°5³"!³;^ûÓÌG"ÛÇ|hˆ‚ªÐø(ŠHL}TXckè5 Òr‹è°ojQEŒ˜(´¿ ÐwœñàÖfÄÕŽú}îx&ࣩw˜C|˜> ÷ÚÆWh§Õa*'<¦à]*¦çNÇ£%¹{ìîE{ÊaR ø¹”g<åý<ü˜Ù³È€áÇ€,žB=÷v~¿ãþ©7öäœf%ö8„h!;HN?†Gƒf—iÊ¥»ó÷œbxÈ>@->^ÂÇTàL ¡ó±PùÉa(X}Ýöü½ ¡û#‹ÿ§ª±Á˜ÊûT&ÿuû?þ9ü/Xöÿ:ÿçéåñ$OôÓr_°Ÿ|´_üEÕþËù‹ÿÊdáÿWõŸLGìׯøÙ1=utwùªFZ|´ŠB8E¹ ³ñü<ì²8ijó(|Pë[†t¦ó›¦^ìR€oaðTú>åÖ¢ÒÀåþÈ6<…Ïz “ZŽ©m’Ç{"átÃÞNÿ¡Š¼ßz\ëÂÓˆ;’Ã8®¸í4ï?-ÆÏ% Íf×®cV/ºìâ ¥Ä|_W•Ú>2«™gÙÙ@1OœÔj­Rå¶Þ÷}Ÿ–…¦)÷ ǾoµÖ˲|ý÷Ÿ8‰Ú^ª[yb¥…´mûºnˆÉÓ¶„ìû7oj´A¨m{USFüfß§”Ui[70sH½ª.Ó”8U©fºíuß÷¿}ýÍL \°¶u-R·××/^ÇWª2)%2ƒ)%Ù‹Š‰ û78/3LiZ÷m]·ß¿}ó}R)Ź#´®»dCÃÛzߤ¨jN¹jÝ÷ò·¯¿]çÛNFÁÁ¥VÏ8I2‘¨÷-–Z€Õ€Û³DJGŸNsª¢û¾‘ jNx½¼üó·ßÖuæ "1j“îÄ'ÍöD-Žj„˜˜Sb›ì¥ÜÖ{tH‚eN:§b+B€¸Ì9s­õv»»nNˆ¦zßË^w¿Ú(3+A•jUªw„®ùú¾ŸÓ^®¸ÌSb^öôzy¹ÝoÿÇïoßßß¼#Â|™gwæ|YæZk"v±Õ½ç ÙWå²× F?Ö®óe&Ýr¹3&2D2Çä"B"VP›'®‚ªb@Äâ+ãLXÕ×2°ä¼\.¥ìœRçmßJ-œ2#ªn÷UU§ëÅ1Ãzçi®·»¡íµVÙ)!ª!mû&b——ÜO ll_€¨265FÊÓTE&ºÒËåBDzÕ”!¹‘Ÿ{!¡ªª–RTLÌ9BHˆ)E@¾”¢ªÛ^ZlSJ9ç£=•hš³Š2³~œ³Ô·£Šâ­ÂÌ„'ÜG܆`ÑxÔaäms”ìØh‹LLl:õ›Â{èLvDô‰{€&; ÄÞRkHqJįl0BTQ@F&FÅQD²N®o04PBT¤¶Pñg¤ hÜC(QI7_vÈ´¡ÖwÁÂ1‡¢`ubN7Â1)jn Û õd7ׂ? l(·¤†\qk³šÑ@†>\üÖiOˆbž\Gqü¡ÉXâé_:9çЛf L;QÊ¥Y·ÈÛèZE°&¸#úå,&ÇÔJ#ÖÐÝm¢ v½E¤+µ}÷œ8jš…¹}:4XKhZ¨‰8ü޽bN„ fAî†GÒ¥¢ð«žvÄøö5}Û¹nÙþ]€Y´¢™_ îG züEIþc+À°ÿñ?De$B$MÛ–Z›©”Rbð`::Ȇώ1:87¾aiÂà#=éØHö›':ÒP¢{×t˜÷t=MÛ#½°ÂïéÍd7zêƒ\ç°—¸´"{hGhUÇ}*õ`Ø6wz¢ßWû9~öò·UhŸÛ›úm€©G§ð¨JŒ¬WSÿ‰"ÜÜæ©Mrõì+6û©¶t¤Û:¬Hë Z6‡Æ•N o IDATq&<åæ[ÿ^é¾ëá§ašÁ@½yÔ”ìd}&¯}f$¶Ó,Ć„ć¿+>L1† ÄøŒ"è7`£úoø©iÞ>AלÆ¿†Õ°O½ôÇþ<[xNÞ¶ƒŒcÏ^ Ï™†sçõÝù'kõ‡Î^4{òùû]餦Ã(3žò%øØµûúÂ1Áñð™÷~CW÷àäpw~¦E){¢õ#ü,±`?5®U¦Ÿ|¥øÌìo?±³ÿšôÿߨiÿÔî‡Ï¿`Än¥ÇŸúÿú»ý…Ïû'¿Š=Jþ)©â¶¢'•áœ8Öþ‡ó†‚¨>Bn"Æ:B0æzÒ žÀÃo‹;!¨B<ÍõcÜ?© Z$õè;b ¶³ßôQ¸´0wÀbëåb70µ1ày®‹Š·†Ø>©wK}¬n~ 1>.f>Líè¥:eáÐPb¦Z+’S5tât]®€ðöþæ=–£¬RßßßEÕÜœÒ4Oê¬äRS¢”ªAJœs~}}Í)µ…£'" ¨J5D\–пœR-¢//Ó2M¥ˆ1Ö*jb¦*¢`fPkÉy""SÐZLDæiJ‰½@En·»sÆEd—Ý·¾”ZÖu›æ "úŽ·²3óYÕªˆ šBTT©2%EN j­>&ÙK-Ûîû€²#‘˜–½ìÛ~U­µ¬÷uÊ©M–ô¾—Zk˜ŽUˆƒ(HXúÚN $0*UÌ@D‘XTK°ÔƒÀˆŠð¾m×e~Y^ÀÄDÿö·ÿa[©ª÷uÝnÛ­¾-—e1›æe«¥ÖZKÕ*SNnVe#²½–ªÆUErÎ/%JÙêYÕ,j¦€TQ´ ,MK3)°ïZÙ°º¥ˆ A©̦Ë<ÍÓ¬KJ|¿ÝÒ4à2/†”–)å‰sJ™&æ²o"Û®Rá˜xEØJYßïóå2½²aQuW]5U cƒXê&»£¤" ¥r® *…?ÊoIĤhD€dh¥Ú—/ËÄœ³ˆ2"ˆš UU¦¸e!1 * Ñ4MH”Sö#`&Õ°ªÖZ‰8y¿©kR@L O‰¹T©µ¬ëZ§eR‘×××mßïï÷4gÝ„’Ûv©yÞPHb7î0RÊ^«[[§yy}yY÷"µZ{컈ÞJ©„hDH`¢¾­tƪϿLèœ ÆæJvp|¯3Ží_k;4ôxPOmõÒ œ¦ Z!áºí.L×Z÷mGÄ·Û ÖmK)‰Y"Z®/×Ë¥ À:êÄ/3‘څ㸈óDåö®a&¿Ãøèôz½Ny"âëõež—”’³§ÜžïÀŸ@·x›Ï«HÖj}yy™çEE[ݨM‰¡Dx×E·ûå”Z»©snÛæpóQ¸rQ|6e¦œˆ§ÙL¯×—®VšHñ‡aûñ fÎlÞZmê7ÿÖüÊUABÏåõ‰”ˆäìï„RÊLÌ-–äu÷žs®ïÏÈh]i×nbP ³êK³ƒŠy‡?_¢±Ç54ôCøÄ̆„–Ïü0EQ¥§&†î×Ö£ €)…¢îK¶ŠˆXosU7Z* B‰çó¼ÛÝØ›ð[é¾ £ƒ  —'Ui›>øÁNžµžŒ¢§T}$íéáí6PìR«Û[£ÍzÃoƒD1÷QŠ ))´^GÕpzôýÚ¨Zx78¹Ým"Í >5SòÂPwMÃjjŽºpKÁPãýõÂL‹Îð²ýÆ •*øø$2Gs¨)!˜hŒ6âŽtH’­”™ÐiùÝÔÜ[vÑÃ3=°Èø©s” îð½œÀŽò+@ïäh@ «¦ŸNœ* ÖsÛÞO±ÁŒèû÷cqˆÔ1:ŠU ™·Øç`Ï!ÔtQœ½Ö££ß6¨?Øþ~]»úïJ¬Ã¦Zd£ Ò}Üб-ªä§6ù¡;:cöÒˆLXµÑuü7KĽâ†=º!Û¤Ù'îðÀ£f Ú´%öh5gè{ŒnÍ?R;'íóøvmTnûYÛkýJˆqg àÁ·¢ä5¾=3ò°O}¼ÐnÎ4ªÿ}à3;wZû©f;ÐÞ¦1î—º?Jÿ]%ewWÿÇ÷Ó$ýÁLÛÐÓLl8üNµaÎ¥‡LÖ§ÖÌþØ«„1Þ89²Ûõ´7Ä'®Ôa“ئ•ÎLÿjcéÒ5ÜF`9ïå½Kü¨À5éâ8E¦)¶à”ÈW³~Oˆ¸Z¯ì‰~‘Žþ7?ôœR{:½Ø’GÅ FǤ[šÄÚàô!Œ¦ñ° ’YT&t.WCÁ)ŠA4|­z̈Ù=†Ø¿‘N-Ô½‹¡H­#Ê‘ž™\Gû?,!;~ø(†—=(ö8ìGåMŸdÙ·~õYœc1ö0|"õÙ@¥é$'P´îŸ°çvê“ú×J^ÏóG¢Á ´Ž¯¤Ågøô_zŸbÙžaŸÏígÇÛ9e#~Î 90\vÖvð[ýQrųkÚ ý‰ÄmChæ×ú`?&"6XîñLAû®Ã“aîqtþ0Žì×÷ È’Žsüy/ÄGñ?4å~˜ÙójZ;smì/j>Ãÿ¢výW~ÉÏÙ÷ö‰ƒÿI,çO½Æ§ûyzâ†}~\>gø¥)Ä¿f9ÀŸ>`øÌüßa5xÌy?[ œB©ÃKƒåªf‡á ñ÷^SA• cwèEM΢D|øAdàæÒæ×Gf w>AÛŒ¥~0Þ‡U—¯Úo¡‘ä3bëš6O‡ß¿íÊz9^ 7¥1lwxó’™=öOrIþ§â>•¶­¬e#fÝë2Í×ËÅ¥W4˜‘u°ï»sŸU-¥”'úúúúÛׯ"úíÛ7LD¢VöBD—Ë ¿ÿøÄŒ$jÄHĪhEª‰æœr>&"ÕÔ\(e!#æ”°jMSbâÁ§V E@&21"¯Ý—òË^qJ.Ð3!§TkyûñÃ^^9%?“½üV¶*¥b¸±ÑŒSUì2Osš/Ë|Û¶}ß|oSJ2ãøÛ¶«ˆ™ýóÛ7ßhZ¦ Œˆ÷ußÖk)¾&Ppõ‘˜’ºaêXÇ›ÕRŠT©%HH/×+‰êí¶‚é^+€½¼¼p;)ˆˆ|éu§ ¢yQn¼,šÀ)câ £*’sN)ÂÄ“/ÊJ-EöZÕDUU~¼ßîÛZ«lÛ6åŒË%ç<¶EqbS+µ6NHMLÉ¿ÁðM«ï+P &LLK­ÄUŠ€MyâiIÌ?Þß뾯÷õv»½¿Ý·}ÃÄ,"U 6ââ)†mÝÖÛmž/’!3š¨ÖŠÙ¤šU±œ–Z °Q+»±P6â4g\oåÌ™¬Hmgu‘ИòõŠÌµ””ør½,×+d¾Ì3ç”6¤9:òåË5yá!ºR­FdÌU« ØŒ@ªJÿ ÕJ-ŽDÛüºÙwwWaw¦aÈ ˆJÙî›1bˆP(¦ L€FFFÍ!Z-ªQ„PRJ1”MD@`&r¦Š8é8²Ù¾'‰²%€Ë2_.—û}õ“jß÷mßMtNÙ8€UUìæP‰©12›éË|E«vy¹ ¥´ïãfFU} T«–ª”<ÀEC¯šš;;½M(@ç8„Œã/f4A“pbŠ*!–R˜yžçñ±æÚ®_µ„("¥'çþ¾FöO‡LË<ûˆÄODi¾õ4°ª˜©çf’£a3Ü÷ê®ÒËåÊœlž&Gïµ€-üwöl{Xêœ]SŠHýñöFD//¯ÞŽ˜Ø;B )"jš˜P­'þ À¤*1aÓ²ÝÇÄÛ¶‘'Љˆ2sJéíýÝT˜SrqÄŸLd„½°5*Uùz¹’Hu)ITÑŒSÎM;˜¦œR"/v!6S÷ö4‰³ÐÕCqá¯ÓXd¸ 7×*JáñtÎOƒ±„afÚ¸~; ±’\ÒUS Å*^:A¾Î¤°ô1•y¬Æ¢úu,hm6)3˜_bˆÈŒè]çÀ:ˆÔ=®,« е¢fo  ŒØx5¾7a'¡c'¥÷µ‹«u®›™(’‹Èþ¢Ä^jÐzbÑÅDUÈU "Ç[v6%"J>á†Z•0T†˜Ö@“DÁ¹ç5Ú:¤>¾ê §à „}|;ÔØ–¦Õ¦;Ϩÿ«¨@#P‰Œ¸9£ÕèXvB~œ Ö ¾H¤Ä.¡SÁð‚ý»QÜÁнýÀßêdjØÃ漢+¥!Ûˆô+!à{H†ÂFŽ/½¼ûM›Üb€ 1 6‹ò¢k¯ ]}}MmªF±<×^Úª¹­u1˜yá.aWdÜK1™ëVƒ8åĤï3813ÔèÊÖ®ë"ê †*ê§ÂÀï°`%«·hùýð¿c3/ÐÏÇ~`÷´æÁ@‡ïº°SîÅCŽô F/(Å“ëülý ôSÐ#7ÐFJ')ÌÎÅÿ¸H'ÿ7Ç=4~:´ÚÉá:*³íËÕx’Bsx>¢È]O[íóòíɹ à°®?t ŒoàŠF{m;·í5~Þ~—xêβAk<[F*6¶ic¿!öQíÝc?pwÊâs£Cl¬=\ÚX‘‡lÏ\‡Â“¡6 m@¤"žÝ¶&óŠêÁÄkÓr?þþ†=ë¾.5w϶’‡ëØl é^AN]jæqÄiûÀÂþÉM{7ö)xãGÑEáÔ;ÝúŒ¡y•HƒÓ³Î=¢¶ZÌê${Øa–N ý³´b?1rŸm}ZÛÛéÕ0j5£œós¶³Íÿ$¹>;¨O6§Þ¦¤¥³£ÝžÊÀÃûê©J<—/fÈ>É6üLòÆóh`Pç±WGØóŸÈØãÞ¿¨_ÈÃwù“£ùñ€Í ¹9¿¨ÿõÿã°æÙu‡b2 ¿ò[ÆZè³*ùõô'ß~úêö«Gþ `õ \¢ÿ3æø‰ÛÿOµnó4=€ýá9ˆÛ8vØÁYÐ8•ˆ‘÷¾µJ$zðà·çLÂéÑÓ‡€Ã{`'›¹bÒòvÁŒXðâö;é  õº³^æ±^¤€G–¶ÌÂiÞ}š`¨ ÈîX;‡ÜôF0¶õ±AÌWøñ¦ux~XCUÀGns0þãÓë&]–å¶Í)%©užçe¹üÇü?)¥yšSJó4™a­ÕT;E‘Ek]«X§¥– ¢ÆFHD¤ºvT÷úýû÷y¹LÓd2ø”@ÍP Ã*Û§´Dt}¹^—kÑbŽ8q!IDTɈ‰9qóN"4„šŠbN  z½.ë¶y ¤–â!æ”Sš·}K)͸øö=@5Ÿa/?òn5#¦ë|½LÙ×W)%gàx|Ì<ób5Bâ9i­Û¾›Áõ²,ÓœS±Z ª!£4ÍGv ™2ˆWEïÛºo¸n›kÈ šiÈg¦*R‹êÄ™™fÜö’˜§< h–PňÐ22xcÁqS&<¿ó453eÊå[·í¾îLTEn¸ÚívÓH¯+Ö(ÄÕAHŠÁñð(7ÍÓ\¤¨ !!X{«FNKÚj]Ëff·õ~_WM)ÕRÍ…È”ï÷Ûߥē³sì¾®Ä䕵HBÖ*‰ÉTî÷²ÁD™¥ÞÍp[ašÙ‘LÌ»Š gÌŒDÓ”K)TyÊUvD¬Û^«BfŽŠNS3EbÌ)åiÊÓLŒF† ª¨€RP\“V[ÐDȵ€%Fž&°Ý-UèìuШMÇË‹¼¿“³Zߊ^&F@×tœ-Ò·p ¤Ío¼¿o×eÚ«ø@B¬„ämW’Ѭš1³@Õ¶íUP³Ìì(ÿZ…úךĬj•Äsúˆ8O“¨–}¯ÞßÞÕlJ™‰ª "ìUÁ4²ëD†6§ä”!QÍ)-yzy}aä]‹š‰è<åœS¤ÈÕÿEÌLÑ-Bsâ˜ßoÑu8R@oO5 ^3Ï`Ò6ÛjÈd^¨U¬3_†&ÛÐ|ZÖ˜¼9g@©¥T3ªSW‡·mSÕyšsv¾š[Bµ”èݶmWã"!"£VÑœ§œ³oD·m÷Ã_«·’of–R^–ųJÞ ëzwû|bvîVbžRÚJ!¢*–"ÞT¦ibÆ(2$òˆ©ñ,5K‰;[Ÿ‹J‡EH-þn÷Û2/sÎÝgJDµÖ*u¯åõuñŽ–®œ´IÀÑ®ìRDTѪUUwfUÝJQSÝké…D4ÏÓ4/>L¢¨DŽAºÏoºÛÚGUÔKP†E5”Ð DBhEªµøtDDî÷5çì‘7Ø6…6Z‰üïîÅ´@hƇ;û¤œ„÷ÛÔ|h ZE•˜H´ç°šCCN}õÀ­AÇ .׺oÌÉ[4j­ˆ„¨~6ÄÉ@"뽓Öj T<騦a„HNò>#à)«Ú5цա8¥Z–$þxüfÃk?¶Î‰ˆ95ÕÔ¿B0 kM˜p@à}%yÔüñÖÿ-¬>$ "ïólþ~B0 }V{:²whÅÿiЗx>ê1—E|XhÀ9ؾQà“ƒ.ÔøD[hmd> *YËUáQVœ˜»†Ôüò­z§µè†Æ3´.G[Ø}qdÛ¸XíÂÄqö´*Zï¡% M88­]¢…x-p›§Q ÓÙžk¶3ðÁ/–.àÙð•„Ò¹¨öõ´÷ªMÞñwACQ ¶z[µIÝW½µ3ÓCñì¯àÌ`ë7<ÑQR`ÀÈ Øs¢Fœï?Žl꣠×GAú¤Ø>ÀGÛÉp4`ØúŸU³>Õî—ÞÞ_â» ?n}|›Îý }kÓ—yžý ;ÎløkpÌ›_5Aöo~Ö ôÝö¬?)Õv÷ìÌ‘=7ñžþ@è‡gP›;ÖØÈ €‡ÁÆCyÀˆê¸:òÜ›ñ€piØlmzG9º¸éK•ÜWÁhž2Dbl“¤€SŸôô”Y>¶Wq.P\”ŽäÚDµØ'ô~`jè½6®'0E=ÀJm¥ }Ô7N@bî˜~€³‰ÚWY™c˜Õt‡ó‘ΆèÁr[‚KÝ®0ÐÔ†¿v§¥3ÿý¤þŸ”î±¥Ϻša# >ÍCé…æý˜ÇÀÑ,ÿ0Ò Ÿä(IôÖž<ü¨¾Ši¯:<»êÍðS1à1T€4úGéÑΞ±‘Äô=ÃpîÉxnë¶“Á||s‡H=?k;}Bxj‚š7zéû8 ‡’‡çâ.>E<|dû™ûÙpïÔ•<æ.ì¡‚ò<³AÃO^}X¾=}DÇÛç–m<½/ü¼¸ù\=üpã‘ýYH>8ìYéÆŽºð×:ÿßhÐöá Úã¥þ8ù@˜ÇW×§íÁO ùø×‡!?ý¾ì/ªùMvÿ™ØÓJå_¼~âó9ÁœgŸFˆ§»ö:ܱ70ÿÎz>&¸ˆ Š”:Üç¡Ç1àš=± "D}€1à†úÛ1&Õî' 0s±ÐäøósïyD†ç06_¿€.O>3}LGtøO‹ñ“®=6Ç4Çhfj•SÌ?<…Ž[qúíõUT¶}ÏÄ h"µfN)å”RJµ+Ei^ó©Y©õííM«"â4ÏyJª URš–eAÀ{Ùö½¸n5MSžrJdfâôf Ý"*Ò€ Mœ3•ܤéïUÍî"*ld-—úp®—ZB¹0½ Š TàÄRň¦Ì_¾|ùþýÛû툦iŽÖ;°"¥ç ›•ï³-1â&ºí›‚Ny*µsÎyßwmÍP ÉYfv½,ZÅûró4ç4MÄ*±$ÃDiÝ+é QœD¯ªjbˆÞl\Eàçñj&63æ´ä¼í»ˆ€Z…BľñÛyž²®Ý¿‰=¤cÔiRP;HV¡¨!'Fr.9Z,ÎsJ¥Ö)ÏÛ^—9€'H€/W­âí e/µÖ½”ižrJÈVËnjz_wË)Mýð„5ã”sdªl¶ï""u/{•²Ìó^Šˆ ÁÛÛ”}Ÿ§ÙáQ`Û}÷}Ⱥ®!ISF1BöݬJ¥ea00aD#Îyß6Ù”x"#Äš'ʀˠb¨&Ĩ»ˆ@¢4e`Êšk)UªÏb(/éJì †Lˆ Pl/HdÓlÀ€Š)y“¯ˆsB°”Ц4 &N„HSF…RÆZ Vß%‚)×*†djD€µ`ÊkQNœ]Ïg4Ðê:›"V³ ÌxÉl*º ÀîêmˆQ‘ÐS%?– †j誨È™»ˆYD¤ÉÙûœÝü f ÅUDÍq»¢ŽªH)«êîÅ¿*o÷›™-óÌL¦¸@U23b6-¦`p)øüÉ”ˆsfF°*(Õñë‰Sfb1‘^KˆNc"dËHˆD>‚¶°rWu÷ÙQãB Þ]¬E½®²©®]pÎŒÎÄÌ)Ië#%BÕÎ=èp©%¥DD—e6µZå¾m^î¼53ÛkõLL“S¨oò™Y‰R63`¢Ë2KÊÜœ²äì±U©ëº–²»KDËrñ–„—Ëež¦ReÝîï·›[ª8œ4¤ZèfùV*Äœb,ªêwlNl¢¦ ê-§µ–ZÀ4M)MÓäÖ"‚²I­u/{3Ó‘ßßܱ×”d¯Xºoûívÿþýû¾U¹\=A‘RÊÌŒ9e%÷Z̽ð‡ÏÕL ™“ˆódØl㳦?t]µßKTO¨Z­•K­ë}óu(4ºÑ¸78vò .NRÀ ž5<;%„ßÇ&<„õ6Ñè…:íÿÕ%ä~ÐgÔWeêáÉÍhðñ…‡9ÌùH’|îÍNBú1ë>»(Žo€ð±ìz|Óú¨úÛY÷üy;«}æÉíÉI´OD÷œ§ CÉã£õýdÀFòÏØ;¤‡¯?•í'qN‹tËÉyp…§÷Õ¯üT«<&<ãØÀ~¢—Ÿ~æˆO~ªÐÚÇ9…1 {>%ú\ÛÅ^÷§ÞÿŸ ÇhO†2øY›ðÏ5ñOÎEû%=þ¹Ý> AžNìq>óTþ¤ÛâWtö?8BöçQþ)}ñ/•À_úSÏþeœ-:õHõïîwÄ&å#ô†v유vécG.´¨tïï2gÆ‘~÷õFl2 C-î8­ sL$Ìõ®MQ8ýǬ•¡cbã#¸¥I[j³_Ò>І÷SÐÏ}÷±å¡Fn£e´÷ǃbÖY88×4°O&±ø8ƒˆ œ†÷pÖ3ìã)‡(U0+µpJHT¼Ô÷à\ä”ÔTDD$f Is*ZT$1™Ùm»•½Î—e™'Bº\–/¯_ÿñûßÁ`Y–×Ë«V¨Õ}â¡F»e}»ßDj£ý‚jUU§©¨å¸%,}Ÿ(&„hjkÝÜ”RNÌ&je«ÀNR IDATç//¹Ör»Ýü[PÓ*P…¤áY™œmè–Xknugbuf"á4ef.¥ê¾¹7ƒæ²$¤)O›­ÄxTNY ¡UEUDåíý6Ïyž&Ši†*ê­ËÄTµ ⺭"šfNÎigDN¬«zË¢ª!j‚”ò´Lóm»ÿþý{J‰‘`h÷"D`ê õh.4²¶é2&Ìœ¼ #WÃHगi–yšóܳõ9³&?ATJ-µj­•HEÑ`Û÷Z+„Y ÔTd¯UT¹,Õ÷*µF–|ÎyN¼K"¢%ÏË4M9››¿Ti"*{­Zw@F#›±"%b0H&¢™¯’×iÚKaNóuf„L×E ôý½ÖÒOf&d†{UPÛ&Þ·<™¢bJ\+²1ÍK6E@͘(¢í%¥‰êV¬’!Q-)Ùn÷Bˆ6O Jˆt "]ˆ„!#šQõ²ëè[34%0xM¤QgŒ„Hn±íMåˆ9'3¯ãUe$S­ªfÜ<}\Ju:†O©í.ÛÞ-t`DÇÊGû6t§å)«Ð±}X扈@­V!’ªv_WŸ,Î×™sÒªµHJ8+†" Ð\¢º×š™ü8K-´Yrq˜R×m™“švB9(CæÄ”ö²›¨T)ûŽˆ”s"–æÄïef&µîµ’ Ÿ Gà„ÿƒg_J-øPñ­²ÕZ|Ù™˜¡T¢'Ž¥¦Sb¢¬ªë¾‹Ê¾ïë¾ïû¶,—n½LG튉’óˆî·õíÇ{šhΓ_&·Û[©u»ïyæe^|fùöãöåëKJ9%ʈ[skAD2ÕÄTE]»ÝÞŒ99§HÕÞï÷ež–iáPˆ@j唨Ôòöþ®¦¥Ö//_æy2F§œ%îfJPj]·u/ûív÷ã@Ë—Ëׯ¿qý˜Ùºïæœ"•¾ÙhªŒø<"4cçùD)B{.º/•_; ÀMJ(Uj)ÛºM³›\ó¾èJ™u5¡c$´Ÿ`ΓǶ1Ó ¤+„öíüAÿ%4:’}ð„>pÅ*‡𶌰š{ FÛEµfëxCA€Í˯ÆC!©(´èŠºÛ²³xš%¹·=iã‘[3‰LjßÊop·y qXƒÃ ¯¦*€ŒŽv§˜[¿šT£ÁžªS}b Ô¥?¶Kc­nh¢~÷H)sëŠH êZÕZ믪5ÐÕз~?ibrú8$k;i ì!äI!í†y°£gÂ×Ê~ˆ¼1µ+ŠQ=Þ£ §ÎCŠûqÄ/€°ã¡AÛ:ÝG´ÐJhP´ýÛìVèV' è§bÐû{Kaë_hó‚8ÿCÏ·&67=:r0†Ý¡Í=¸VûÉ9€ˆŽ=Gô£T‘ƒ’ÜñAÀ {Eâ m=”¬6A&$ˆÔ¢Xíàxà™ÝЖÙíP9ïÀ Nè÷šµ&íXÅ$V²½»í™T¬—Ìø&Á3p¦Š9¥c;Òç&qØã)5àCG¡¹<€F¨?¡ÆÏ±õlÀ ãôó`DÆ‹ˆ'Ï OZ?âwüG÷:‘ëøfà$¼±§×kHl¨¶ê½¾}F~n÷µÖò5 ÀÚð>ÆÛÑ% G’àPÿA`ëãˆiÊQ­Œð¤@>ô±}ó}ºpTŒ·Få /Úìⶠ†ŽŠs¼ÀÚ7³k{;DÎ }~é‚ôáÒ‡¡öǰª–bUÜX ª†ìy$DNé!–q°Z@ÍÈŽþ‰¸»¶ Ò©Q6Væ0ñZ$ö e?bçOມ߳#ëi<ÇÀ»¶»z©šF-±#Uã“™Áyû6 ¤ÞPz””ŒèíÎb½ä}è÷;0B6x'ígîã°J· ÿÑ#БH‡ñ£HÛÊgìq®phÄÍä‡MÚ¤då뤓ÖIavj­·JXë$~ô%>¨Sx ÂŒí¶vçªÛã¡vèŽO¥ºŸÕ¼ÚXÔññ>ºÛñQq=#ä{øCG‘×Î"vàS–¾3ÏlztþG?äyˆñðØ=Ã> bŽ’Ì³ þhG¥Ç#¸ã™[»=qžrxƃ‡§ˆÆC½<ЉúªŸþ_ ?×ñá³r†Oá?}3 øg½ÿñ²gîø?«þ?“Î þhFõ¢ûÓœˆ=‡ÎØ/ðçjôÏŸýј ž$«~úKí)¨ëW\ýÿçªÿðX#û¼3ÚÿÇûݱ@oPþc>ßtðØ ÒpèŽ!ú¸B:œêaõ8øô™B;×›žºèîƒÄÝ„˺àç˜B÷^¶&Á(9‚ ó¢µdú¸,ë‡Á|'…ã'Ø3¦ƒ ªútáñÙÑ_jŒ.C“5 ?›§}ûâ8êKU¤˜½ßoH”« ò,¥T3+µ:R¶ªŒ¦W"Òª"õår]~›·Rà¶®Û¾#âËëË4M"2ñDWüÿÜÍtb¾N3 Ý7¨P›ƒšyM €‰UõíýffÓ 3ôçŽ×F7`§ulEÔCL¢pu™Çs¨£ 3p0:GKºûA<è}¥-5fÀ¸ð%LZåèx}V‡&Ø'>~§uÜÒø5ó5³?wTbNí ~‘ÆÛð9¼Y68CIƺ±í‰&§ü6€†œÒvTì\" çÖжjFll^¢åw¶lÇŠc¥á±ÁÙç®~ªû°‡Ðá3þ‚k­Ñ£EµÅ §ùäÄŒ•6!ø°|b¶Øé¨P;ªSI̘ÿÙ¬6ò^ˆ©¬u´i ºŒšj¸[m8ñŸ½OLj‘"v–ˆ0V˜©5Úvœ…¸þúö̉ÏË'Qv²CxGL%?8”Ö~•6gƒˆøâm/·}ÿT1¦»N9š:±O^cüZÛǧ6/¯úÙHè„"éŸr,Ì"Ç )%™ž càÓùýTlž¯ÌïÕ&‹Þ(›z|$%÷áÁ\`ˆ mì“}êù~Ä2Pljúãí9ƒä|®âêmš‡õ¤JœXŸð5Yi&|Ú0@ö@¶÷9I» g±öl&Ç?—8qdÝæ©&u§òÑDŽƒ5­ðú*ö#öÄÀN}gO4ÎR9Â3»úÇ©&bzixš<Þ>?–I|ÂûyŠÌ™»>Lþ¤ÍõôöíAJµ³œ´C}žmÁcKôÜisÝp;µ(†l F>,T 9ÊÁ‰m’14uœ$ØÓ_1ZæªÙ  €IßS«*qèžØÑ6Â/¾Ýð{Î4°:ïV°÷wö3`BÄ@/¦†&j÷ûœš JÕ ·yèªÇ³‰½G†\™ÕÑëï<ïCý2t@O to~L<Ú&QZÚLjõÜíÿýÅô‘UϵފWe:7B÷¿ûFOÍð1ÆÏlš÷]éY×^ÕY6ƒ×ï ¶†•i‚öOÒ­¯óc8ŸˆŒ ÐðžÍè'vͨªjõ €Úo¿Ó ZZ»8ਨoóƒØG?¼êØ7©vU÷4+½ö±¥=Ìl:œˆ³»ÖÍ-7`†17µöû&³¿LÒ@fö›°ÇúþˆFäêD…˜—L£€Álî¼À)ÄŒ“F‰m±ýá)Œû@-Ũ¾XUü¨‡"N &;£,æ²³ù_šZŒs‰Ÿ¿m*Þ㜷ó=½Cf¢ŽÆ­¡ÞâY®Ex4fŸ­-ÙöHÁ¦ÿÇÄC#SzanÊxh‘陌çÕŸK‘ø‰`þÀïy)¬f?á£~tòø/öAÇćQѳ¡Åüýpº–Ì>>Øè<~@ŸÆ±úH^‰ûƒ=Â<žh¨úaðrטM £G¼=wuO7{HLüP×|ÄAáÓsîÏ„àǤÊÐCâ!Ïõë'Òú_RÿèŽÿkúùgŠ}´šã˜ôÙÓ¡ÛÏÆ žKôøSßúiÔÇ~üûì¯ýàÿõíÿ?Uõû!€ð)6»×ðú§v:M-?ü¼¶M¦ØØÞ•ˆÚáiz¶ØÇ×QÓ둦Ø=9[è<†ì·¾¥žÓÇ*ÅgÞ4s|‘8R¾³ðùóù´®sÄ;ÙÑg <äqO7=ztQ|x†>ˆÒ3Ûg®ª xÚ—ž\hN9«0¬K–ôU°*²,°¬H”X–uÉyYŽZÞîïÿí÷Ûz1Õ%¥%/bRk1]:.u]WNYD°à~R«š¥Ä×륔ba74&J‰ñHK¬œRÊD,Uªí&²ï;ØeU­*ês‹;Øíz½¤u?v2„———Ø‚™vRˆi)JD9/fGÊ9nûnfb >@%¦9ÅI“À¸™.Õ€[¶ D…‰«TÓì¢@l3€$°–œÑ`I9RÌ€ÆíÄô?¾-Óý_»f^`À(*ÖNºtp?Ž·÷'N‰ÉÀöã`æÌTT˜ˆÀ]‡˜SÚ£o“¢‚QußR«#5}¹]ÖeY8*Dã±*²cÈÜéíÓ½”ã8HÀ–œsN×õ !UzÉ€­ëòåËËízQ5Ûöûº¬YeÛ·ïoßáJ=®×ë’r½^._o//—ëír/(¥kZA`¨•‰rJKNû–þø·?¶ýÿúþïªúõë×e]–¼8KÚÊý]öƒ¿&Ú”ŠÈ¾ïßÕn7ÿÑIÑöªZŠ/ÆÅj‰LÐÈM¶ûïïD DI*1q"ÀËq쀊ZkÑŠÂ̪^Ð`Z+æ „yÉPBß5Ó†c³l€¯¸W_‹Xë Z¶—Tƒ5˜™(@[&`¸ ®müXê¾SB"¢æH04ÐôK•ý¾)ÂùÛßRN¾£¨!Y¨šªYJËËåŠ>$ò1m 0ŒÜå'R IM ö㸿ßcëu­•Ýwk2Öû¥ ‘qJ®øUÍL*bæ¬/¬Í(ªˆ@²JËʈ VㄪՋK¤ÒRŠˆTÕ«'æ†F‰o)!IÒ%g¿¢ VÔ9¥RŠšå”˜ù8©¥‚±TéàžXï{h%µm?Öe¹¼Ü¢4Rä¾ïÆ|X×%˜fŽÒžêQ›Šêæý”óˆ“× 0Õr”Z]hþåׯ×ëM¤Sr>u­õv½ªi5pô¶½K•ßM9¥ûöî¸g˜PËDZûúKÎùíþîÕ-û¾»ä\ˆ¯_¿¥œßÞ^6‚ˆ)eS-Zdt¹Ý°Þ*6Œš-Ë¢ª÷ZLÔ½œjŠ€~»Î”–¼Tæû~¸°KB0 É0™öD‰DÔÐÔÌûNH¤ˆHC͘ø¨‘Oªâ¬˜‹ÎƒÓÊÙ nl|ÂY»‘ÐÔF“+†²-µŽ?wtºÇ_Ã!ízhS„µMͬp^Y “aÃÏúx¦ûÚ ÌÛÊ}´¦e Œ: a¤“!íyñ1º³¾_0„d.åRï+hÅ‚† ŒZט7X:p¹çg·•tíҟϾ†ëÇÐgâìý µŠiÔT‚wAKÎ-y`DÌĽ¦3Ž-’£öWÝ´sìEg$pg€XŸúôÏW£ìÕ•^ €‡©X_ýµÅ(Õ¶ ·žPi"‚€qâœ3"‰ˆ©´zJ FH4#4uÌcè“:,Íë=#^u!Y4Úw[±Ptùù©h ‘Ê.¡iËÀÜ-`}8ŠaÉåùfÍž™Q¯Òy&àï0Ìæ®ìóp³úe 8ÿ"mÜùÀs¸s#ÿ´`B/ñÄ){1:x=„Jg[sS|1òÄ©Gw@¥&üëéê*Aðaz±ªõ'4ú\6¨<ív`½ŠšGåb<™ôa”“ßK·»ÌÍ ŸÂ6o30OI›‰‘ØRÅ‹EÇ¢:I~ £œâoó,¿+þFvám==·£¹úì@6¿d”÷ºõÏÆ¬÷ÑWœå hÅf}Ÿ5b<ƒZОô „??¢ñ‰‘ÞC(ÅbØçP´RÄôG"éIfìYàîCâS1î õ65ª5‡Â˜?(àöÌ$ßí‡nf›g¨ö“ÖôÇùãùÀÓñÈGH·ý%éÿ‚±ÿó„? Øçs¬?ÞRøƒ#÷'Âþìÿø3²¼={ùSrükS’|Lð?ûýÕ7sûL›˜ÇŽçÞäS‹Rレ¿Î>,q&1 ËžHØ-VçŽøþüÌUô‡!t …ë”UëUWÞLa‚‹M¦x<…ú¦Ÿ©¶f‚¹ðWç88v¸?Ì­ ƒÆeoà´sx¢'èáãëy85ã³3zº#>,I¦Ÿ`˜öãPU NL¾ ˜1+@‘š¯{E"^—%Qº,TUÊ¿Õïßÿø?KÙ·;"~ùöíí^ÊqÈå‚*"j·ÛÍ ª ÖrìÇL/·kædª‚:¤4föU&!UQF¼¬‹E)hźm›™Ì+NÝÒ¬ÓF”اÌ\TZrb°Ã ಮLœr²@™£vþ#ØQ* ¦i=„QæfŒh  E%1Âõ¢v÷R3­ƺ½n@ÀJÌ„”ªo°}@ŒnËõ¢G¿k*(#@ ¶)ÖRû†Ð7²ÔcL€ bÑ©¾«ÙŽRîåz½˜‘‰Š ˜ÕCUõv½®yI“åÊc¼.Ó0`qs£3LDä~¿3ÑvlªÊœ–R™¹ãM9%ÑZ[öÖyÁjFfÄ„`µ”ïµúzË9*î8vÒ·Àþíë7D~}¿QJ n·kJ©”²oûe¹PfªGIÌG)kÎëú‚FUªŠÕÌ*!ç%N·c±”oG©¯o¯l᜗u!¢ß¾¿×ZärY_.ëåú‚fËvçí½”½ì(„¸®±Û7ÝkÀÄIÐL‘Dˆ âÛåª IDAT©ånj˜8-DÄë"HiY®¦¶©½mDZpy¿ïN,¾}Ñe]{†=bòQ«éû¡ÃaÃy"Ò¶¸è33ž Ó)‘*Mmræôi6Eä%QUu¾H-¦º¬‹3ãý*ðÎ[S%`J‰ÌID÷m+G!$âáe"æ„ „ĉ)‡¶P õÞ1?cý®FD ÖÈãfˆRt“;efÂêCEs¥)t¿W¥}ßýHy!öKTÔ«}ßG"Z­UÕjØ7@ Ê>a­µª Vļ, åäeÈMœ5X„ebNŒ€ÉŸÌ2KfEÅIGDTUÁ,çT«ôV€ZÁTºœëw³Z‹císÎÎËÊ)­—˺®÷÷û~¼•rÌúûû-ªfZ«úë‰ATk=Ž=ÐÉ)½¼|q÷,ëÅì^žýòåë×oë²”Z q]¯p›“¦K)&¢^YÉ̪øúþþýõíþvß·ÝÃîͯ"Û¿™Öõ"R_¿¿ç5­ËòÇï¯þˆL)×RPD™2/´VD ”˜ÓzY Qªì¥H­bþ¨H”S¦ŒjæFkP3»å0:îlè¨áÀ¼+˜¨çZœÄµ¹â&øÆ¤\DZoûõv! -i.í$Dé-ÊFnØÑÐ#|$í’ú¸†ë¿q›Ýw–M‹R×üVÇäÁBpŒŠcY}…þ”¢^¾X‡šzên8¦½Ñ§G Ã}ìölCóe'Á€—3‡^c½-Ó«w]ìÖé³hþLlŲ͗ADh3C;¸ÀoŒgïí´êž>ˆr^¤Éº{x"3s+¸%Ÿ=І.A4S4òËðñSHBØW·ïò}‚Œ{·Ê™[;”Ùœ/#Úîrˆî¤õ”ÐØ£’×—D271ûW¤”‰ˆ‰Jí|—8;ŽfÔë9}ÑÈÈ8 äUŒƒ>Õ»Iƒ÷ìâEXó1¼<à)Ô;Á&6 fîà6ŠœuÜÑ,Ø…õÆýà}¡Üúw=Û¦&1AŒg–:7´Ë¶ˆñwv멃 …ÐK1 &³»in‰÷1Ä l1æ³ù0»ñ6çîU˜ç‘r%1ݵøöÙ“ï»$Œ0G(³¼ÞCçí¶™ÂȆ¶™R„­ËÆÖlJ-~pÒmà 0¶dMœÅg8{‡˜Ä•0än÷àã4“5Um\„úlàH"¸Û0™úiû`Æ+Uê ´Òšñލ´ª0·à†Ñ™Ú±2ðÌÅhU"0m&è÷~RE‹Œ×x´³›¦ß¦ÁIœJíÊmdÜäþx´wÐÆlS=4~dàNc§™Ô޽Pº7i4ÕÞ"¨hØúԚŞç˜?b”3Ñ<{ð×C¦S…ÌÄ«Ÿ"H~ë¯ÙlÓ3˜Ê2:’gdVbêDídŽ”ßä'¹M5 øCÐ]§;æ¤eÌnÂAö€Ü©ðQè§nÖèE3ˆ'ã|óé^Þ‡g §t¯9ù pëdÄ|¦8ÒТav¨âè¼þL}”ç:Hè£ xÊZØSã™x0½eBˆ°>ë—»[ó•>ü”ùÚ'à üL¸?¹Ÿh.gy?PLúé«ÓÙqkq==i is„Ï­ÌfŸÄãgùÜÿ©Œh3ºÉ>Ì2úó?Œˆlxö‰ˆÿì]Æ>ø(SŸÝ,Ï,÷úCü‰ú?éÿõßàcPâÇ?Óþ¢`ÿ4Æñuiû©šßŸUŸB¢ì/ ~ÑøG´÷WÛçŸæ@ýÿ_ìâ_8Ÿ?Ž€Ï×#õj"„S@/k€“ßÙ÷æS+ áÃs# Üìn=Fà7ÃÁå‡Aïéû¼Î½…6›w°þž&G]ŽçÓ°ñ{9Mþùsý/ôÚn ñw{ÿ)Qwbo>óSØžºÒO#Ù)0U=}zq÷o¡g¡ö¿S-ÅH$U¶}GDnÛa5=jÍËâ;,‹ê:Мóår}Ýþx{}5Óëí¶,«Š®ËÂÄTÌÌ=àm«†ï¯¯JôË×oö&ÂD„)-912åœX)%*E(S¢„ˆ×Ëê–ªh•£¬ëêK|²[ÉR|ØžDŽw¡ºŽ×ª¢¦Œœ9íå¸o"21·nϽfKZóETOB­¹ëÒÐ:ÙôM_µÖĤ&’‹(ÕrdNfZª¸“E«™)“:ìÈÌ%U…ªèeËFHkÎñØU%fj€^ß»1‘Û¨]Ê`ä/×—o·¯ÿþ;‰˜¡©8@õ¾m—e½^VU=JõqÍù(Çu¹ìG%"w1»³Œ“lÛv`Mš$˜ZÄR’+ÎŒdV )'&@&Âê&j3DË)1Ñ´± ^ßïˆ\¤äœ.y]—œRúry¹ïÛßÿøö£ˆZΉE Ž"º×J‚À(ªÛ¾«Uÿ¬R˜ÈDÞ·mÛ6)¥VÝŽão¿ü’Ö…‰Íý¹VRÂ[¾\×Ë’3'PXÖ€ÝSúã··;в$ifA"Uãt”jLZWd@«I)`bf5d#UM)1ï)gU-å^ŒAU òf”3=‰¹ªÚ%œ=ˆÚIH R 2QË]CJ,‚èxcu£t #5‹ˆ‰}7¤@h@æ‚¢Z­[[`NDŠˆ¥¤DÌÉ)R·Ëå}[rΔ¦|/— }æ—6T‚ªÖ"ŽRU:o1§ ’ËT L¥TDiØ HÄ"š)™>„À‘ônõ‡˜•!©j9ʲڲxI¦yjÀk}•Ñ aDˆ”Rìo´±(¼óD¤‘Njªì’’ŽRŠ© @âY}WXÜÆ~Y™HDŽýðóÁé˺@G ‰×öºÔ˜Rîi§u¥”Z·û½”£JõQ+˜³çà}²âj”ˆš0Ìá7ò;ô?g¿“CgA™Ù~”—Û º²Q¤øÌ 3ŠÔãP7+'bƽX¹¾\¿~{aæ½¢¦E“Èëo̼ÞÖ”j)µ8* òÊyYÄcgœ.×%1-y |3!ª9Í_;7ÅšE1õɇ{„ÕÔ0 PE;E¤–ccÿ]ˆ "†$Z]¡ëìvü±ó0Ôlß5Ø÷£Ô’ºßÖÌp)gWøº"ãÁ a ˆÔ D£¨ƒ)hµf c»Ðè1Þ-ä. ‚±°r³vs¿²›µ½ ZUª J`êo^;µAbÅÄDP N o†8D[à3v‡_b– €A¸ð­¥ [³˜ª8}Ï›HÀ|ÞgÁîÁáE7„b–B;_±ã¬Ã£áÓÄÑú×±áÒJ¨„£ph$®á‡Äçnîýˆœ^ƒÛø´¯¹´yK‡X£*ë3¡š1;F¿D—áBÅ@æ6Ý·f 0óÆf%$cVwsºI‡¡Ü˜9PÙD^ìÜÔÙ°ŽkQÕ”9¥„@Ä@Fá•Äšiˆp[ c+²mF˜Tj\Ž.G7®ë“Dߺ<°O…˜üö~'lìÑȸ©hqâHMÅ_ؽùž<›’I_ åBW«ñQP³)Ç;[n`ú²ð8Ñèxh’é„ ‘^@Ü^McŽOt#<Ñ\ÔŽïé2&43¶¹H ¶~@¯Û™öc ê-Ý9mÞ´qO´oÄ^–ÞÆT:¶xC×nkh…11"jÙ>ßáwFöËaÎØ ÑÊ:cŒÆÔß{bÛ0¦f9ÓZ úÃ&S#øÒ³qÔ‘}s(¬«ƒ±E%wù»‹f‚~Ìâ {_F9‰c½¢g¼»âay7¼ºgSû¼Í†Ùµ§èø‰­ï­&?øØJ˜cæãß)"ƒ©áœ÷7ëÇܰ_ÅöX ³Ø9ר¿Fg½{̸"'¡ªØOÅþK ‘½´ 3»‚îˆÉjŒ"êîÄfŒ‰l^˜lôt†Äe;ñî{„ºÕ»K SÿÉtŽ9v¿Á¬avQÏ=}ó§0À?™1.­^Ú”Að4VD8ß­à\ørBçÌ%,ç|Á©¬¥ ÆÃN¼Ù3õæƒ{úÏ1ìøÔ£=¿©Ó¯°˶}ìý…F‹ƒ©—èôƒ[Û}‡y=¢ðSxÂK¯Z>×Ã?Ú—'©zî½³›qFÙÃt部óÑÇyQƒ}ʲ'#(ø ü9N\©ÓÈâ™ød8Ijv&ÃØcJ㔬˜íÆp&®=¸æO£è5âwÆ3Ǥzî£Æ?W¨ñ©¤ý´4ìø¡Š?í߯?Iu<Ž žü‚¿ú2'›?⟿2ü ?õ3·ÿ\9/|n–þ¾–ÿ¿ÿ™iøÄþ¾'áœQûع äiõ?Ç@‘xøåC t-ÍiR®O*ùüK¡Ñưqõðù0ƒÜÖÁ“¼Þ‰}~›ò½SÁ}íÓåë}H9ÙÜ›c¡þú‘Aj\·¼„aê“A4Nà\„Õö!ñu¾ ðôtºi$P/n-²—Z§œRÎÙw&ED×u]—ZªªJLøþ~?jEÄëíRJ9ö]D@õËíÆ9§”Ü«±m]¯WÕ°FÚq/µ.‹´ôhüÅ%Š”˜!9/„Ú.Ë–%y€r¾\/‰XLU‚+Ú:Š›QL‰TĈ§]ö"•1"îÇq]/}±íˆ%1"VAÝ·]7€ËeAßK/™ ËQk5d&M‰EˆCÈÑê;‘=W){}ùåšj)ŠŠ‰óQözËåмÆÎÔUUP‘ZŽ£ÔêÄ #[ˆ0ƒÇÎÉsºZà^J©RSJ_.· ¢¥Z©9e¨HÕ*rÔcÛmß«ÖD)ç\«üöûòE±Í?|óÀÌÝDƒÍKårQQ3PÒÌɇNÌRÔˆ «*1]–äÎÄNÖ½o»ª¤”—uQµ£Š·Â.œ«Hy¯·Ëš§š(%ƒj"%!ŠÚ^³]TMıԵVXÖ…Lk)žì^ÖÕtYÌÞßÓ²sZrbfw”.9§Äjje7N¬×˜o—/Ë•HVcTÑÈú !¤Ì*€€ €š ° 3x{`Cõ¨&N—%×*zY²€‰TÖ͘(¹ºeÁ 6õiÖXžUÔ°ÄγHÉ™¶ÌÌ.ë«Ñp 0€À@à˜¨™sœÄ<ö­%ðN&!&B^–…Kb"Nì¶/FÒDˆ'5un‰™nÇ&( 3‚!&Å•^*ÿcäð(hhéô’êZ@’s6³¼dÕzTa"Î,$Ìì/¦û2 Ô˜Hˆý€9ö¾½ß·÷}Û¾|yQD¬¢Ä>)„D”RÒæQÑ£V¿ñ§œ£­ –ªêÎGEÄ„$¦nh¬ª¢JU‰2L f3»¬‹_5µÖ÷s*GQUà”j-Ãèê71UA$U©µÔZ;©à@„Zj©âåÉërA"÷B-)çeIyùý÷ßúOsq³ÖÒ¯_D,å@Äœ³óýñÿååöòòõ²®Ÿp”""Ù;Û£oIùò뾿½ú7©HÈÌ"²æe/‡pJ·ëâ:ˆ3‘^¾\½;áz]G¡¨ë+LTE׉(å$­çPš”/À|GOnP31«µ&fÇK)‘FI²ÕZ™-¥Äœ Àà îor[Ó) €1†U.‹µÞ·Í?ÊÙå†eɵJN)z}5°äfˆ¸”3¶&éŠ?rÕÆز+Ñê Ío€ˆæiØ( 1³„QøK‰¼‰È½Þ(à5í¦=Øìiä¼#hÁñ…F¤*Ѝar÷uØäé6d÷™ƒ£‰‘€[®’¢“¬Épæ ÄѧáÑäé‹"gÆ8úÅoDÞÁÓÀŽÑ»Ð×*ÍjÒ…1jS·‰£S«§M»“†ªk¨¢"êc-¿íœO®ˆˆ 34ª–q*êDD œD™yôz?ôLC»! ÃiFÅa úŽ…=ßÓEØÜ£AþîZu#ÿ4¤ŸYäÃÌ©IÕ!KfVEj?éEÕÁM ¡ -"Ýqíe£ˆA³Š ®Í Foì¦Ii*ØÔ…ér¶ªöÜ LaHöf *Rk15l³3íC3Œü͸ñeΦ…±ºrÚFU Õc` ÖÓÌÃסDuöd ¦‰—ê^ÎÖ-Aýf>QF"Z4P6Ù™ ¿ý¤&þsô¢ HKA„Yœ%âÉCÂG¿}ô“m0v¦‰ž÷8'cܽ! _g=nX'SÙ)â jH#>5/gfê]¿4NŒ ›Ç½ŠaŒèNõ p¢*ÍÞó¦EEôiXyÚ5xíÀ3ã3EùS.=ž£Ÿ AF9Á¨šzâîî…$ÖN+œÑ!6ùOzއ?Ñ£ñPg<§_Ìaóöôc†'àYÖþªíçÕÜgÌ{œ5ÌyüdBð—4ýŸ”œíÓy…}MùÇ]æò’؇ð‰o?—~°Ÿþ ~ôŸé—vßÎÇ8÷w0œºmÎ_Š“KaÇ NF²1 lÈ5jƒYðo½`€´Y·ÖR6&ÓÃÑ'©¶@t÷ö)E„Ú³HqF:Ï&½A Èú²´9šF9ÔxôSËÒ3Ô~è﵉Ýö3ƒ¸3húÈlœâÚì/4= Ú%ùáÓ¦9¢r*¥„ªîe˜ëeIÙ’õ¨&öþö~Å÷î‘W‘RŠ{Û²¢Uã8®×+JÕ*Õš=ä?~G°Ûí¦ª¥(QI(%"&䜼ó‹ê~8°Þ]®9åa<Õ,0¦„`"2F,¦zY–‚è ðË˺"•ZDÅË"×eÙã8Ž|½a&¾\®Û¾íûöšxI VÈë’ Q¥'"-Uªßl¨lWÕªÓÁnëULJ©þbR‘è0S2S_Ä!b­²•û÷ß~{ùúuY«‚ È”M™x©h† Pµš(ˆåøþÇw?÷ôžRúã·ßàëË×”SâÄœ4-™‰Aá×ïG)€¸.–sNÄ_^^öýH)%bBWŸ-%öõ2-KŽn35§0ñeY±íT|áE FÌ)%Çvûù¦€f""¢JäN"ýp¯ÇÛÛ; ­ ¶í‡ßyRÎûqüþÛoG9ˆèv{¹\.@„ÌŒt¹]ˆhM õp½›ˆIEªh¹ßïï÷{Ή˜™ÉÔªŠ€T%@@õÀ 3™æ ,º(AV•굂ÊYIåH™¥‘œ˜˜VNÅ¢N¢ÿCè’%zß”îoˆx½\˜†Cs¶dD‹" îƒÑát&§m‹‰YkmˆrWSŒ™ Õ›“eÂÂ^BLvmÎ7ZM-%ÓjŽ!CU+%þ 1tcŠŒ‘Cž²ïJW‘‡_;¬OÞavÔJš½zagøÂFl¿©0¾,Î9«jÎYª˜Ùº.¾OÛ·m;޲Uj) .)¯×µÔ’'à~ñ`º³÷A š2-™ã(eÛv’*@` )»N*PáDQN)ô@¤ÄKN{)"‚Í´„ 57‹YF *,pJ&*ž¹q:“Ãʳª¦œ¤ ¤ìSFEbZÖÅ=.Ö»nODÌÉTŽcOœœv'•Acu¢ËˆØ »ã¨7 >ÂÐÄOÊÛÉ&ß³Ìg`ø¬¤S óšÜ¡[ð@öŸ‡%=ÝÒC>}$ Ðïç†ÍÓÄìP;ŒØÁTì—'Åý“¬5~ϤÀåQÔ´Eß®jŒú;Ã6¾êª±ML|ÈE ¡÷dPk!³Î”ï&ƒˆ¸ûÜÚ©7 È@]|Ä¿N³¨ƒnnÝž·¡:‚Dw.„°ŽdO$Ö¹¦RJóôåCª ™ºçéOÎÛ9µßµõë’±nÑIëØ1ZþëœØÖZ£H=ªùØë,pÑgÄÎTí1Íàåmb¡5[L‡$Ù‹/ O’î\þýplÒsÇ]Êì1!0sšÕ}R  »êo³ô?$ÙQ”~²ì϶õsëhkVœäUë¿ñZÁ£‰|*8îmöÜ==õÛˆ›À(“EøP°ñ¢˜K;ºÔ¯¦É–ðŒ™v2¡ó©­Ï!¨@«~ò ÎvÚ8tøAÁï¸+œzym*I™{^Ú žqgŸ½ý‰™Úž… f egTÈTos ?Î$Z„æq"agðÅ4Í@{fMÿÈýù± ý´C³“íÑøQ¹Ç›¼}ø§ Ì#ßÿO_¤ý„ÿYYðOuf70<›qÙOO~zdòççê?ÁoÿŽ2ðô ûO“ôñ{§'ûÿT1sÿ‡³¿ëÿøáæŽ'ÿ´Jq¿¿·´}|m6@C-!†ÀÍ\Ðð亮ã\'ß¶~Øæ cbÏÖè–§Ù§ª!Áš)·ûB°8§JáÈ´ùNàHJ7gÛx´­h¶ÒÐùVüÈÿK»)¨ˆŸUÁôÛ“>»»PÏQX2_¡æœ]^¿\.÷ûÝ{rÔRöãèÝYµêÛûûq.Ⱦ¾}¿¬—õr©¥ˆ„£ø}ßñý~€„d¢&¢"®/™ê÷ß~[—|»\¤Ê¾o¾4g"JȈ¸æÌ™¤ê!•™XIÁŒØKDµ”š³KTâÒ?1»º‘‰‰h?Žr¦šˆ<* Uöt\.KG¢â’2˜û^E™ ‰n× Ü·ûûûû†”õ€˜Sò½kgPµîµ¶4Œ«k††”ÄrJkNï»ØqT­œÕÄÞ÷ûºd¢r%3½—]U‹Ê}ß©‰™)IÔ]m¥V‘rû¾‘JÍ)!ÂzY¿|¹gµ—ÿã¿mûþööºØòr»¥œ‘)åÌ)Õrxoj¢¤`ïÛ{æœS~¿oj–¯9g¸]®~TMUD·RTäv½¢5×’ «¡¨¸çÐTÌ’_v×˙ؽí벘ªæu½¥”rÊi™Æ'VUŠˆˆâšó’’5bì/ß¾é—/÷mÛ¶Í·m¿|ùúåve"k‹SWÌ,§t¹d"’ZELÔŽZí~G¢ý8*sÎ)å”(A 3'N 䕈¿Z”;˜‰B­šÒÆjÀR•)1'5C2%g7Gó+VdÄR¦cK™,bãÆÌGѯ·[M)˜ˆOÚJ­]Xs®IW$H~c2tÀT¢;JTBR0+Úø3Mw§—©ëLWg¬b­·I3³¨bhq†Àý.»0«z“„ƒ¯ÔF@󥞹ԓØ{Âà¨BÄ”1¹£Ñú¾’õ¦Z‡á(‚ÕZErJÄTk­U˜HÌœ¥ª`êfíC€ «™HZ2¨AbN)oû†„ÄÔÕ%çå—¬*U4çTEÌ€›ç¾W'¤ˆ*ˆxwôQÛÜ¶ŠºÇ?¥dÎ@i·[¿U-€R8ÈT90> j÷±À~"’kŒ|Äbf×Ëåº^Þï÷··7W%ªÈ’@M)»ê[k5­Þ‘‹ˆ‰3M5ÖÊ;K9B t<}8¶mS=šúòeÄù‰¼fà(¥Ë£"þÊÕ{Jú ÁÑ@îЭµˆ3ùù³äÅÀrΙ31[Ù åE¥ªgLL¯ëeI‹K]„x¹ÞŽcK)ç”™ƒ¸BÌî´/Ríä"ôß |141€¥Ùû–¤AÙúº IDAT2Zµ²™41²Í?Š©y£CÓñ T—5#Z–åo¿þRʱmGJ©VYÖ%Ñ8ø®ïS#2a)ÞçÆC;˜Ð§TM‘4f&èŒ,Ð&†ÿÁ1ê>4B$ÌàvT¸Fgfx}Ý„ì0ìÞ6Gyx,°zm Q¤IÿõiëT Mœ0ªÂ±¡ÒƒcïÚR#•ûÿ(yj#Ž!¡™i-#¬ÇN ƒìñGz©ýr"W©‚ ïÆÜ¶³&ó~°ä‰´ûF4æb¢(ƒtůøéͳŕˆˆ8ø±Økª&qxÉ{ΙRT¬O 4Ÿ4«ÏvôDb@BP¯>Š;qÇqS@ÀÑ3ÇÃêîÏ_¹R&¢îâwe”}N˜sŠq‚wÈ#DÃù0к,`Å ;лPÂÞl$؈ç±s'£?Yº,­S‰Á”­­ìG&ß#b4·L˜OÀˆ©gÀLÑ4FÑæYa¶@~ ØhhLjCûB›ÆWÚ„—:Ej™†Ù{l»‘Û<ƺîK¢3ù£aâ|Ø86 ‡8Ô]}œhnÓçߦJ™ŒNøèCa§§) ÝÄ”uF˜ÀÝ“¹ú"ßÕ†sùÈùŸLÇ£nxg5Nìɦý`ùàÆøb¨w´jÔ©7ìVKž˜ÀzÑv¿ÏG:”ßæa?m¨MãÊV}T©ª„öHj—rÁúT1õþªµçB:‘Ͻ '°9õ!Ídšíe›>ödŽ— Í>ÒîÓmÔlö×[Ÿ9ŒdËiú2‡3Î,¸ ³ ·5VA«üíÁƒž÷›^ù#ãV[•Yìu}c=5Ä4[‚W%˜.:ôð÷¸{X YáGMÿ—~vÏ,Ýn,°“Ь§tìÛ{Õ_ßö÷NƒÏöãö‰Ò3ÔüAýï“íóÈ‚¢¡aöÓŸTÊÁúÀáÀañŸ+ëL¸C¸a÷`Pý||üUÌ© O·ªÇn^„1ËÀ6®oÃù¹}$ ØAÖS,÷4àƒjhÐÄf¼‰ÍlŒ¡h÷ëiÔÖPPì©)ûa8ôT™Åx¤'n”ýÓµËvVáCâ© )Ì3ê¬ ðyÑìé:ùØÏ{þçÇJéÏìÿÿ°‹üÑ·ozðÆL Ÿ²Žþ‰Ð–ŸúÉvžCàéè#< ù?ÿ2ñ§~÷?W–·Ÿù·Ÿ<äøÏÈ@übÿ9ÿ¿bÿÇW26±O,š2ƒcpê—ê±h3EâK¥)Ý‹f›ÙCƒ™Öœ¾[wûÔMGfúñ±soÁ˜Ù~húmd4=¹ZK0 FàhbRƒÓS(Üu‘A³)à•¿óìwºVý»»~lü‡s¤Àg»Ç'Œißw]VZò’s¾¬«ë’_^^^ÍÊQJ)oïï—uÍë*%™fv”CÕqÉK9Ž"•r"¢û¶½¾¾:Уª@µª@°ËšsΎ᮵¨ƒ0Ü…˜}£Lpáô^w­¡-9¹k’‰|WD}<ååSªœ’sÎK9jø”ÝC "ïïïUêš—”SÛÏsÎùz½uoiæ|½¬D´m[•ê(›e½fÅÎ`51‘„xY/»mbÒ™åX WÃ^UÑ ¥÷ZÌ.ëe­f 9!WØér¹/²½¿Ù¶ýò믉PTV\ Hٶͧ`–×…]n—”RNé_¾ý@÷}g¤Ûeýí÷ß_ß^Õ¬"B⨠Ëy9êajnhýíõ;'F…Ûíråõýmáœ#’*"ðþöþ]E~ùÕç"môE¥Öûö¶¥]ÍßZS?‰Ü#ÀKt,@NüëׯðFï/LŒˆDë’E¥V-RUt!þúD\ëÀ„|Å®—kÑš9]ÖÛ+¿mû¾m»×^–l£á–œ}ksÔJía|”’SºÝnÌüöö¶®ë²dÆd@Öà݉`•·RLìý^Ì ª•hJPU+E™eºdÑ ’˜ÕìV½«b»€À…y«lßßÂºÈæŠÑz¹bÊÌ”¶­–¢"žž€/×_œÃ®fR+¥äµ¢ÎÍ1+L¾!BeuË…ª‰K}UMUz0 =LDìR|4¹E}'Nr‚µº5뽋1ïœÓ¨`þnÀÄi*HÄ0q@‚eQ6+Þ G2vÌîÇá{q)µ.Ëbª¥)ÞÅJK^EµÍqa{¿‹ˆ¨!Òíú²^—†‰‡Ä½4@—´$oÏÕŽlvŒž)örTU­5§\ ºÔ^TÌ=ò)9ʿǦ= @ˆÆÄ2m ]¥b¤¢ÕÕABÚ÷Ý@jP"’ˆDuIy]—RÊqÕCTúq2UÓZE|Ó+Rý/ ñÐü{l_"o#>hÙz+qhzÄLBðq”ïsªH2#¢õr-Ç^Žã¨eÛöcߨ¡'º^ÀDµVôYB_8ÊgÍ˲¬H$¦Ujâ´mw"LÌ.t$ ç áff"ÖøÑ­¹5†šÀHëÂDtÔÚÇâ•ÈÞ±l9/HRßîw¹Ýn9/)eBJÌLX$ôN¬jûQRNkÎQn±d›_^^à8Ž£W¸Ì¬Ö¨¨5f*½Ñ4qpYLM? `ÔþÈdfä…ö„®VÑÓâ?Ð(¦jê6ûS ©#è!ŽUU L±àé°As¬5eUIFÎ'žOï½¢lB Btô¸ªHÀ¾!VdÚe©ÐýýêÚ¶_¨Õ/W_|‹ýÞHÌœhÖÛCžÜ·Ab3õþcëþHp2žbpÒ ½Ì£uôrÇClj‰ƒ˜ÑYçl}5âÞŒ©Sq•!Ä=­Ëô~lBš¦Vµ”ê© tâ©tëЋÝãâf¼¼&¸ ëj§ÛŒ45!µšY­hæ§¹í† $âðWèæ¾VŸuFwçÆ° @¤éM Cuq¶÷ÒÌPúÝúIZw±̹ œ„ìájm~oSTT´‰ÝcunvG0õV™à’ ¯A\bV€Ž¯ê|÷™¸>‰›Ð âþŽæg„Mžñ­-EÑ«›'úÄ´9šDÓ¾G;–]ÓV˜Øê# ÓvMr6€_w» 7{.fh­wa‹6û ´½“;.ï¬ÚñIûŽ1Ç$ÕôŽ?Ö‰;Ý+ ®9%Ç0Í> ÂçyCÈè ~Kôk²e&ûwy*œLþæZd¨J{ý¸o ‰ÚvêýÀŽRëÏÁùý¶‡õ§Zó-FPìçõ ·Ž:Ñ“üãªa5À(ÁÙ'>íGaŒ0¼p}£j“ð*?@jõÙÞPÿ›îoz"™À„isëùtmé'*Gß(Û49;; ­= <~ÔÇ?}"Ò~ã£÷Š91˜CV§Ê÷à8ùæN»‘¥ ýÌG´'BF±¬Ûî?”–:½ÏW¡~ЖF…ò)Ñ‹€ï!„„ç6f{ƒIBöQ²Âs5‰=BÒç¯ÂÆá“uþ™P…ð¬´ø£õù¬uáfòþ[ËR‚#32ñA¾øHvbþ°áŸ°b,«çþÈ‹éx"‘<Ù}æø ÒÀHŽØ3¹m’YÇëA¡œÏ…'ä¡îU·éÀÖ|~왓Ûú]Ë>Õ&ñ“÷|NËÄNqj–!˜«ùGmlJ2Ø'Úí þ?Ïižýì4|v²>¼›†>çBë‡ùK2¶}8düý ÌI~·Ÿ¹" vš=þõ¹Åâ柿 þÿé¡y ©ÿD“Á_ùÄÁþÕÿ¿lÀâÓ?à ý_Ü,ÔŽaÛ?ÎàþÇËç;«ÛÅ ác-ïêç¬6Raë«iù\Ààî.¥«'Û ( ?h *÷*3/ßC ´æ¹âzç°ðax0ÐCÚ ä 8Uïë¡jçVõi¾Ò·P†î¨ýH´WbÏZÇñɧù:€%·|ºráú”µjµÛeEuw|%æªZ÷-œŒÈ(›øwýúë/×uÉ)#Q‘eY@tƒ" /·K΋ªU5!¦ÄäýœÉ¸j%Ä}« c9ŽZ‹[ÎÑRÊÌHdLÄDª&¢ Vk½.+%®¥râ…—ÛM÷}¯¥–}Ïi!WÔj)Œ”2yÃDpY’ó BÅCÊ™UUݽEDö .–™™XÀ€à’3ª½mïîOdkƒ ‰0!YZ8%)u/;äu)G-µh¡KÎLÄ̬üíåúë/ßþÛý×ÿûß_ßÞóÂbðúýuù—µÖúþv/µªi^òõr½]W3•œRâ$*noÐ÷cÓÛ—/Š  5j¯/ëG=RJ—u%fU)Ed~{}Ûöýåv]–,àëWצUÈHAùz¹dIˆøÇÛÛï¿ÿ뺮ëÊž¾QCÁùô€·ëÕèü8J"F¢LTë.U˜ùvYš¡êýØ£V5d¬¢EÊ’¿”®×ÕÀ^_¿ÿÛþïï÷û·o_—´4Û¦ƒQPÍô(Ñu«>ãâëåâ{†ÛõâQqåtI¹Š‘ lû¾ºÝ·ÄT¥”M˜ã^@ˆÊÖUÕv…ª½WL­º—S–j쨪LG•ÌI»Š"¢XM”j­P+‹Ó~ì;Pu'#˜i­ˆ(ª"’}§T+¦f¾ir_U-%pó“3ÀýºµŠª00 DI Š€:,„É&ƒŸ¨H·Ù¶X[k¶vÏðPª#™ø¼mÔ«™r3ÙúÔ5}&r¡YÔj­‰Ø["ºïSMƒãª:¤D̶¶:;ƒRkˆŒˆ÷ý~¿ß÷£˜Á±où-_Ö5¥œ×LÌlUK- &mÛ­H¯·;dxl#fÞ®"Û}ÛlKKö)£Hyyù²æ¼^¯öqJ„™ (‘ÏHª Ðæh L‰÷r˜ˆ+i~cq"?bFÂ"’¶*µ 3¯ëÚåxê(çˆe÷âNÜŠmg‘!$rÉ9ù×/[!r´Í¢FßKÏ»ñß~ÿ»ª-yI)¥œSë0ØÞßß·}©å8ŽZ‰È{ ,sÎàñ‚Ä\JÙö  V‘Ûõb ûQDª©áЏä5æ0<Á‚]ÛUÏŽD½94ö:O›9&’1sŠô„Á$»Qo'âÛõæªhNÑúîïÝ¿‹½€´Êq×õ ‰„åð(EMûÖÔ.U‘*2Ã¥@8¯›Ö}‰¦µ½N“¾” ‡²MèZ2 h*ˆ6â=(˜£S°¥!] ŽÓp38 ‰JP}]ElÍ¿ìµ&°†ÃÖ§xè·„ˆœØû ú®-`[n±DnmQ·*(tëh`z,àEˆ½J:ø`m=H±>#O‰:5îð5 GCTD;µ“U¢èÜ'L>Q©~E¤”Ñ[ßd^PlÙöQwàx‚Vk ‚Z¥6Z7§Ä^æéH "”ÿºwk’$IŽõìæ™UÕݳXBá)Âÿÿ›ðB!`wgvº»ª2#ÜÍŒæ·ÈÌšíÄ9 Á P]—Ìȸ¸«©~ªÖ@%áò/¥äRâÎXùN=}Ùú ÆDäÌjÙ ˆ:­‹&¦sU]jR¢ÉJ¡ XH-L ¾ê’Èm´Â<ï¬ôˆÛxŒ§^SŒ€‡ VḊäÁ 3ï…\4Y‡½¡Hˆ:· 'Oé¡á  6ú‰ª:Y´X9£×Î7Õ,ÙÕ¼íç+½§f |H%½ZÆ ZsŒ“p–¦ÂO÷œüú9º pŠw™°L÷hÚ|z/ñàÉwµÍ|Ú H‡#»:†m²U÷¿Uí.u:ÕöGƒ×G€Ü“ÜU9ÕZÝkf5äŠlh§ÒàÊωxS›PÔ=bèæ†½m»=ª`Ä;îvB½ø}Ôe6`ŽÏüXf4pS„i‰¢l¾›êLçê§_,y§å¶—lé©k÷.¬p›"Á6ïºç·´Ó;6³‘6‹n¡Êÿi%¦Ø[j¿bÚ&¶kǼJ«Ó>°v‘# ×z¦a·V3~“íÀöÒ: iêt‚0É&Åùˆ÷ÁþÝSCÀă9ŒÓ°ÓÇܤ.NÈ!ú0¦¶€hÉšE]–Eœß×ÄK½ëú½íµÊ«u ^ é♉ý–r€ÄÀÍ:@=8¥nî íÈéÝ,áÆùü‘Ô4hÿúÒ½ÏüVäóƒþŒp+²¶Xüahѕӛÿ ÓOì<@òÛ¯œTh¯¦OôƒHT±ñèØÉ‹ÉÎ|a´Óè‚£áµe7æ·àvÈ€Üö? kÐ.~ÔÏý 6lƒùã| h¸ý~¥Q7!Ló„äžénz”ü±óaoô{Ú…NSò£.:¦ÛL«¸©ÅGgo¿|íáÑ=¢vj!CW·ÍŽî’$âäÈ÷›óp²ÝñüȾøøÓ‡ŸéKÝø[ú´ÿ ô?ºÅŽþÀØá¿^ý÷•°?öþÿ¶?'"~p€ò;^ â«õÿ8ØèžÊƒs<Œ¦ÇÞ4äk­dŒðÕª@wÏÀù/ÍáØn.TÍ3€‡U;,ù$¾×–¨éå nE¹zÆÞ,Ž4†ÝŽÔö"=UÜ'p|²ôÜ'z‚c…÷h%@ºK­ Á>à 7¤½c™Ö£X‹Óãîñ0À޾,Iš·TcŸo®ÅÎçÓÓõißw5-¦ ^Ý\ÍyMŸŸž–”ÖÓúüôœsÄÓzbâËõÊÌOç³j6 €Ài]—uu÷ëõòöö®¥3s÷ÅnB³˜Ÿ\˜Ã5c1-0ƒ‘9XQy~zºnû;BsŠB/0WUÝ É€yZdWkOöìÅ h]OyÛ¿¾~#¢%É9xa3+XÔÕU'XýõbL$$œD³*"3 ß3 ³ù¢fIø” ÷$³}FA~zºìÛåûåu»^¾}ûöþþ¾®ç§§óž73k•¼ ª»{¡"D„¬fHT¶Ý¿üô9u®:ds?¯ ^®×m/YËÓÓiMÄ9Ÿa€×__ñóÓóûåU–¨}ß®„èŽÂ¼$Q5ØKyeþÓO?…òh­ÍVMÕG@ªåíýân{.0n÷beÛóóél–JQT H‘#.²œÖE˜E¤ä|¹n•!…¤Ûþ¦ïøüôÄBDLJ88º™-¡jèH};¸{ɹ¡p) ͈À‹53U3O,ÌTuƶ40"Šú‡ ¨Õè1F§ƒ ¤%5í4†_2w+ZYnÞÚ*$9 jhv‘íˆI$"^·]‹s°€àü|N’ŠUCŒþÞì¾¹¹‰¹º6€Ií“«eÅî±…h¢7( çëî›"wçE^^ž€Iˆpó-¨hĽš²È¾íš‹á°–©êuÛ’¤\r@äéŵ”bºHª=Ï.r>r)!C¼¼¼¬ëz½^ßÞ/L[JÒþînññ@ÍÃ[K$8ÖÎÛ8¨¥(4/$3‡FçÒlë÷(n ÂÛºž÷í9&Ê¥h){Ϊ¥§ Dd/YU…ˆ™„G{TëqÔí¡˜ûû¾!âéüDDxÝAK ±z0«%¶RS¼äbã%jˆsÊEcˆKërŒ·°çŒˆQJ¿Š‘j <õ T• E˜Û: ˜ºCQ]E„YM ÉÖuq¨ŽrUT«sb̵ðÃJÑ}/Ј1pqwá(¨­Ì>·¸ÆÌÍX¤”Ò¬ È@f^E#pZéºLi¡;x aA‘¨5q=:e%`,L䀤Zqqk‹Œ_×,ä­ñ5® °¸#U¯wïÕY]¯` $=ÌS¬!ôq¢`¶„1¼ÖSDx§²StGfaf Çz³¸öË ˆÐ1}ƒï!ù¶"‰¶óÈŒF/ Í͈ƒ ãÃòÌ<­öêê1Ž*Å›{€ç½!"œÎcê°%ÂeYzjT+mW Q¤b×›9"qX§ íÀ2FâÝ*]ÊÃM‘gåšBpï½¼mI\µÝÙSçÍßZUTª¥Z¦£jv¶â¡ÛÀÚŒs²ã0ªDb¡ŒpZq¶‚ ¼‹ö{í¾ˆ?¿®šr þP`»ª0h-ìóÑ\H€a§†iÿxpr*ù÷©c¹®ÎÄ4ÁºþWwšH˳ªÔª aX1Ìì>ë¸ýãR¢V½{£ºÇî%ÆáµvâØ Û±`ƒ)ŽSpkÝò­kX¶GvêÖÞòaÃí.™ðZCef&$¨ùëÓ÷¨üŸ¹š`Î ´L—ƒZܪfo#•ÔžŒÐ£‡à£…»H¼÷1¸›Ú¸6ú¢zÈÝfašïMÑ“¦Y ƒq^c·pó¹· KÕèl¸•ýšâÜÁ2h-úñƒVd`7FýÂQûÒoæQMtôîìòW®1xñã:|®ù¤*~n°'ÿÜ<Ò0u'Z mƦí‘‘9[ fžK?fäP,&‹j$T¦>‰ùŽ}áäÌtÜ]C­¾š’91±š¬!G±zz£Uç¡ÑÀÍøQù÷a[gàQøckó¥[pðsü~l€‡ @7 ø èh®Èþ´Ê ¸vv¼:›F]¹yÍ@Ô²…íFÜÁzc6ukÃ÷~?Á}˜Ú§[W¯ ðc:`zà\=s¤g#ùx@áìØ¼³›W»â½Y?&.ôýÆS¨%ZÀ£E]ú~ 4LõxhhÊ]ý?¶ÔC„¿G.} ÏwŠ{ÎŽ•Ïs¿k¾† YóÃoÅÇ/gL°~‹ªË%úð›GÃ7<~ Ü×ß­Äúñ¶áw~uÿp?H¶ào¾¢XPð{´åGEÐÀî?ðFsÿ‹ì7ÞÀÿRÿñVþ8Ð9¶ûNO²ñ?žƒØƒ­Í$Óžý}eyŒtQWç#Ší¹™`ÿ£Qì:„}¯F{ôž*kéÚã$ïøW`^¶Í‹ÃvÇ#s0k;¾©o¸þE½¾‡ÒƒÖ€m´‰mT€SzŠ0ȾŽ;“ž¸¾ŸeG[HŽ¿5Ñÿá·ÆyOß~G·1²©˜I)ÅoUU$B·R ó². "îZ˜9¥”‹Åʲ˜&N_¾|!Äb¶¤„D—Ë5ôâ}ßED„KÙE¤.ךíT˜/—KGº3Q4€ ÈÆà9L j®„5kéËv½^®kJ²ˆ¹9¢ªR¨{jÅ‹™/I ï.ITÕñiV´°³[QR$rpµ( úÂðS«™¾???ýúí{Îùùùù”ÒeÛ!©¼_.YK€6âÆ]N“æRÞßÞ/— ¹©fµ5…Ù0kqæCkû&‚”bs[T,N$B6!–œû0„;3c&U-EC÷ŸÑ½ §YàûÝ]$Qk,€$""çÓéùz¹”R´”ËõoGD–e‘ÖHˆˆ,‘H9WMƒsÝÈ–ó~}»>za‹ˆÔ2nnÙV'«PlÄ¡¸6 s.oïoËzЇQ\Âzì$ì €bÖåˆöŨ‰®ppÀ¯y(YÒâªàLÄ"a4ÇjËÕQëgê@–!.m…˜*9"cÎë&tæRG/¦j’˜¼Ö8Ô–º7Žý »+5!Éç•×µ!!€Õ1‚°°p):¼|Ì`6ĵɒæ­ð 15@¶90rtIš„ŒÁШðP™: gˆ¹„^Ëì>š2k Ï1‚bmù¡ªÖ’:QÂ¥ÓÝס%Vt 㺮­.røÈÚæ;Ì‘ªœŠD•ZÙzS«ŠMD’QÐºÄ FÇÌÈyËŠ =Ý+¿ŠñÎM7Ñqï–5ÌÑ>ª*‚â´A ¸U¨;#òånF®l/¶®ÄjnÃ:({Ø)]gm«wëíÒññ"­ÛŒÚÑðIUo«0s· ¾÷ö0o£™á³nbRM;çö´îê?t*÷b® «Ë0¯+™IO˜UÔÝÈ'Ž‘÷ óÐSm"ü€S5°×ÍBßP‘9I<é¼x±*­û,ôSk4‰ÈBÓL;`ºã»úå‰LÍ£ØÚ5HhqLJÑ`$Æ¥1Þ—©ÂÁ*åí”l³º–€©/f6Aãˆ2øÑå<*TF—xÝU¹ƒš‚æ5»Ó ñç]Ä1t›Hæ‡`A{‘D „>av:ÿ¿á&LYÒE”MŸƒô?NÀÞT¬fÒò ½Õ5>œîpAýL'¹Í ̲qÚ·|ó›™Öi"R×3û)K#èlÝódæE‹5sLeQ­ ðz· .›ºÅê7Îé€×Ù0‡·§Ä¦m¤mõ÷æè‰v©nÖ f;ÞVüNŽSeÃ}H¢{kŽ“K¿IÀK`uæKSS7tÃþx|O 9T#±²Þ°ý®JuÐDg•2ùDˆÿnû—Ên¾‰DøÔ<)­üø{»<æ}›«£ê¦›ò`>ŸP`í‘z#DúCƈOcü²ˆ?r¦wÞz¡[+ý½ípõè÷™;Þ¬çè®@Íí%¿á?–äÞ½¿ûÿŽD±û™–ß+ó¾>RÿñnŠàÇ’sÿQ«¾d¤ÿ`òà¿W?> EüaMêjÒþXþmûÿïéPþñWà¿Óîïw¨òß<Å~ÏQÁþpþÈAþï¶ÿÿw1$øÛ©\2G°ßô=³ªÞÄ{ï&ªQÜ’·øáœhŠ…/6¥‘…ÆØÁ!ð×Í_ͱ×èÜŽåFD¡¯Rjzvzïf[Þb4‹þG$PƒÕ"ùœÀ:# ŠÇ13´Ê¹º×®$üyS„m#AE†]îÓáãË'ð§S`@¼z®94ð* s±f[(¥ Âi]—%ÝÍlÛ6-ååùååùÙÁU5^ÅÛû»™Ï§œó²,«¬º”—óSJ²mûëÛÛûû þôå˺®9stm~3ðçÓË–÷Ž¢ŽÏˆ™KõV!"0'¾ìÛ! ±K6»æÌÄÅÍ͈p96Ü.lzîOB7/ Y !¥ea R'8Qm$§’Q8Vf¢=çmß¾½~ÿöö:vM••«Ím}eW%{Ý®Ë"§´zV&aJŽ´g¡EÖÄéýíõº\þ‡þ2È¥dfb$ ¬Q.Ëiɪ/OÏiaA<§¤;#VÅ=çòv¹˜y´"÷¥¼ƒ—RˆØÕTÃ@-{Qñ˜¥8‹B67w+ €ŸŸ^~þõ׿üò‹Zy:Ÿ0!ì%Û[H¨®®ˆ˜KÙÊ®ªçåc¡ÄœUC+Î\býí&$+§âž÷ëž3„ìÕÏqfŽÑ‚»;±0׿µçbf{.!U #'–Ÿ¾|F¸\Þ÷}_—ÅÝYX˜ œJÌÀS͈¸»‹pÎ^J ×s:Ÿ…%.Žb%6?Լ项†ã¨nTg‹\1SU3CÔø~CTÀ ]31»dB'BFd$HËJ"nš·2Td²©7qšÛSZœ¢x—¢`™À‰òŽE-º˜Ý‹j¸÷ͬX%½š™é’¨›%a€—‘Z} S8²aðêË)h¹h¯Ö}ˆXr.joo¯Uð (Y÷œYêXÅ«–07s+âÁ‹x&²fIvwNìî†, ÔªmAÚÔPÍNDÊ –-ç¼í[J‚n–÷lbZ¬Êg![s5hïEK))¥¸¥,‰!qìÏSJöµ|ûúíÛ×o,òéÓ§ëårݶ¨Ü`–å¼ K.»k¶”Xb³\ÌJÎï—KQE¢…¹˜¡,ÉÌú:[ÍrÎËiuF ðÂétj5ì%vÈÍ£‚K)𠩍6ã°ˆHôZ:$2%*^ßrïû¶m[ Âß·²¹”\ŠªnÛ%Ò_ªæîëº KG ›[JiY¾DbÀGÿ[ Çk àõš¿þý;Ÿ–‹*°ÈXS´U˜º22rÕ¢ J¶ôOë)•(A[𤇅™™#`æ½*pß7F }jYÖÒ„ƒHbJâî׼ǽ¨>¢=B‡Eʾçx†Ä;`&aUsרás-î¹ìZ”„ŸŸŸhÏ1NN)AjΞØ£GÝ4ž( Ìë°zò:ÈZBiXuâQÇÚ¾R÷FÖ~‘¼ˆ\ц„luñ,Üê:ªcÖ î° 'n¼{̤&rF¬Ê ûÊÇLÃõu !âzÏû‡œÅ(ù a˜™©T–6¨óº¨ô¾è4y@`¡Ú†b4ŽÚ1[©÷­®0jÅY¸1š"ŠR»‹£{Ðê<¦雵»^ èZŠV[“·*惈ɽ”Ü뙪ª»-f®ž[Çq2ZÙFœ‚}?Ámºg¿–. uoi…ÿÔ ÇèÍ9øUã×¾#\!ªj€­š6J3GÅiV“ãÂw‡°Ñt„e_uäÿÔ6p83Î|b'TLœit¨¤´´øÅ¬oÔµuͯôÑó´‰k®óÀzXÍŽæÛ ÂÕmpP›`ý¨rð7mGgÍM³SÅÂXÈÓX¼ãüž»ÿ²&X&¾~F“49( ×ç¦v¿Ï" Ô®hó1¨–z°ã„®‚ ºF6ZÛ$|Ù=48 ‘j%R Zp4lϳë²›‹Ü–³_]„h=0ÑZ¾Û :†¥³ø;–°4­i2¤Ã¡Tà–Ær°ùOJÛðé]kÔ õ7î‘V€QÞ+ÇxFw–àˆXö,”™300ôÄV<Zè¶òÖÚ…-0•DôX;ô¸ƒ èS½÷öa^]6ôÁÒ‘¨ÑÖDÔvôcfíMÜë\!ЋÝ/í8ín`ÓÚ:œ–™Ьìû~ÔˆúÍi¢4µÞ ÷IÍ­FÚ âÐ13夕4nI{PmHw8ôƒuÖ·Ù>uµö`Ø 4oåÑI‘šGTŽÇ¦ÏÏaÌÚP7·M"“Šs¬+îw¿ÓÛ?43~»K„ á®àÕo¤þ›ÌA+?zÜeørž8 +ÿk$jüÁ÷æ&ܽݛùŸ:í˜4ôÁQÿ³hþý~`ÿ?Ì{ñ(àÔ-Y£íâ2c·¾÷Ÿ%8 iX7‹½#uà¡VçðN“ÔjWu,#EÇAÄ>cì!Ý1ÒFäÖóŽmá‚Äý/9uT#}p(é·j̵(5ÃL4ª¬Â‚Æà¼§‡¸Ä›AáÍÜ捻c2ñ&@˜$³4GsàÈ]Ýr@‹U0ç,‹¤”r)×ë ¿üôY¦ÇHO¬¥D]p.eß·Ÿ¾|^qXOkuºæòöú&,×Ó‰™÷}/¥QΙˆžžžBŠ¥ÈqGKƒÞ:ªi&¤uY’È;]Ô™¡XÙ4¿HÕ „,„J²,%—\ŠOÌ× KlTXÖ嬦kZDøýrp`¤%-¥ä-çëåjn")2 ,‰EÍbÇñgºæ„ŠfC×R˜Î˶o@ŒŸžŸ5«êu‹ÒQ(tfË%¯ëéŸ>}"€=U»Ø¥oÔ‘ØI TË÷×wÕòüôœ0!1!;¸8 ’°#1”½àšÒ¾oùë/Ë"„jf–Ír)9DS5¢Àn¨¹meïðM#Û÷P5=­+\·½¨Ð’JÅZ8Ò¿~ùô÷oß¿¿¿Å™À̱¶îz\—]‘ ´ûË:»¼j¦nðþ~-æEíåÓOß¾ýº,§?ÿôÓóù¼çMs©ÕE*#»x²¯ ¦8Jš§2$Zâà…9Â,BtÙ6 Ÿ¯C$`¡`:-ÕpÌj^òN@€ôéó'pýþæQE“°º6uStC'200R­üËçÏ.bEU½ò«2“š™1a‰ˆùüå§ÐßO§Óét¾^Þ ç:a)Y(iÒ|ÝCÑ)0<øÄüùËç«KgæER(ÌIJ¤…E­¡OçyìŠc*¶mE–RJY–¥SÚÞØSâRJSä Àµ’Ç1€?Ý:‡ˆëº>?¿¼¿¿õÉ®™‚ûå½Ôc~Ç$뚪ƒ¾î°# ÀÑÞÄnVL˜ØL›ñ¶>üsÞ‰ðô¼JZBbèšQƒ4·ïfè,U• ƒ1‹¬ëITQ¼öµ@œ¥ÝÊH1«‹€5…+]—õé|6Ók½wQ´™›š—’SJ¾U‡ÿV€Í êŽL¨;„ØEÕ(² …8fç§ó)-KÌWâÃ\@‹<8š¸6ô0xij¨½o4¤$ró€ R¡R ®VÛ ª ¾†*{G\˜6»KiÎ Ä0RÑÌÛênð²|Ú 2ÕÞÚÐÛvO3NLˆÜ¬¯}}Iuý6,64zž´R<жu½w5ÞxêÄkw,ïÓ‚ó è]·!¸3 ¢¤€¥3C®8ÒÛ¾á^Áuä×)Ofª­¸¥’ÄØÁ À×ee‘.ÕRʰÓNUªõÚú>‘9RõGÇÉܦ2µà?gÌ âÐy+~­F= ¨ º‚`}w‹#€Ö4ÄÊ!®ð°¨÷ZTm¨€ÁµÂÆYa@ê–$šÐÖ>,(ØëÂ&ã,¯LmØa‡Ædj>bïì¨u„ÒKÃŽ¬†®3¸õ“ 1h£D„•‰d8wìâ¬u)TCóu4Q2üÁØÇý{1ú6†tÓ[m<ƒ3 Í#4¶<&gAmîÆa¿®KíºŸ!ß‚£¸¥j×E6Åý"–•×oá€ÀºirPãuzV‹^zä(Í»ŸŠRõ0û×’gˆÉœÖ‹¢=Ú™"÷ ‚csev¤+FPÄÍï þÝ•?G.¦)•ßt38Á±` Õƒ©¦]ÈŽv¥N°éi€ö|±>è ªÖÎ0ú’ÛImýrï#‡Ù„5Q±‹53-mÒÀD‘93ªyû6˜>¯‰–[‡j}Ê7øúf‘ êC©iþ1„6 ‰O0qø­ÙÞ½g`Œ‹¦3*Ž’ÎröðitqìfÀJ ‹•¦F°µ²ãZ’¡;Ü'UµWðµä\3;㞆èïèx0ÒOôÇ©”vB.Ø}H à6%7#i:šåH#jcDœ³¥ºÛþ'wgáŒ8ÂbÁAa:ŒW…Æ 3ÛïF8åïáëG—ºÀ'ê߆³`}7ÀCnâ†ê?Ê~póã^öÖc0†ÉÍùOst{hàá+ž4øqçà8⹦v@›ðöˆáðÂH‹}õþ¡.?0MGÓï}™Ä ÉûÍŒåØ«ìÇ÷E< ;ð6€·• ·òcàX§ŒÇ·ò0EñPíÅû!Ù?Bë÷%‡ÿûf9ƒSñŸIvù)üoõû%øhàÿY3€?þêü÷ ;þÓÞÂᮃÿmè ü]ßŠÓ êôqF8ä“ã|oœïT¯òjÕ ˜óesŒÉé0ClßÂ`Mb²:f7=ìMR§© ×¿7û›»9N)Pšƒ{ãò&nkÇ|Ík¥ù}D#Ä c#§ð&AC Ö}70ÍÄ˸äùò㇃pšpÜÝ™ßÛûŠIñt>1 ]®[µ9»à^²«©º{V•¢„LÌëé$"¸kŽ•®š«ê¾ï¡ç²+—ëvÍ[)ÅJ!sËùõÛw.ZJÞY$–ø¦ "a¿jÐFT³¬ N¤9ïûLŒØÞ<Ïï—Ëûû{D5åf1pf>N—ò–U‰ÜœœÀ bó`î`Ž„‰…%1…Ä Q¦z)YÝF&!æ%´­R˜À‹ºùrZ `WËûV,“P’å¼,¦ö®›0±¹nԷ˵˜†@/)9!“º½^.Û¶¥%=ÖÏ/ŸömÏjÅÍÔ@µ8øù|.ªZÊi]‹Éõr‰ÚN:Æð!"æ ÀYØ\{ 2 Ê^¶}»€&a7WÛÍBs‘™ 6­°«c=ŽqÎÅÝÒ’ŠwQÝr^ÓBð’˜ï¹lyßö]˜#qR·ªÂ•ÑA•égª¹»" 5ÅÆô ¢]ŸÎgDܶíõõõ´.9᎑_lB…R6“V47:FêWÀƒ*[‰È f§u]%õm[üÈi=™[|-xî±ï^‹ƒÿýëW·ú=„”RZ9–uå´çœ­€cÎû¶íšsÉ%«r—P˜5õöº]·íÊÌY5çLˆt:©Z€ŒÐTsVIÌFHàQ \åhÈl[Us5âU ¿WÔ ( Ð)€Eˆ¤E™1¥sª}ïoo¥É[’å¼®á“l½ÄNˆ‰zœ(38Šá 9õ‰„¹4iàP°Í›‰Ý–eIœö²ï¥°pZSÖ¢ª9çï¹'ž‰¿Ù@²˜ 9!b‰Fñ¦qRZbz-%PøÄ—b† VÕÞè¦^‰C¾o×}+_~ú,iqÓ}¯ÍÆUÇcŠÌŠš!W;tC[0R1E1-¡š”Zç‰ÑÆ\Ák;fNn„Q&â¥&!"DFÄ˶%fDáèß6Ã8z"):tM„»0åPáD£ž*'TñÅmQítzþçúó··×_~ù¥BèZì¥EÏ›—Šãek³ öͺc ±ÈbiaÃZ9ZPÜK?Á.$œÕ¡}ÖÔéÿ®EU²O4 j*È€9ô†ÌŠû" ŒvÔQ( ×2á&rÕ]󃛂³#z«Ê•­æ­‡¶f.*¬£Þ5Ì©–,°S,¶:ÿØk[)Æ"‹%‰¤6«CB‘¡Ì-µÏ8paRåx3õ¸jÆÌÄ)âõŠˆ¤8™* “ÿÈeªâ/$‘ˆrŒ$JðQâš{7€çáµ8ãßWàæÝZLµâ²Kc4Ó%±ö¦ö†ÏøPÚÑбë±ÁÚzL8¸{5'Ð=Î;ƒ®ãàP4úã¸òšÐ¡Ûl8çã’¯Á‹jg÷æøie]cï2»ºPë“ú_=Dë Rq@S÷Vxÿ'3eè}xÈäô6‚ΣŸÄ¶a1ÃøÐ5ðÀŸYÚMv¾vBó®Ìâ„óïÛ3lÝÛó©Bª*¶Å}ðøk«u­aŸ»>‡ ¦gõèw3ÕÆötõÉ%è=C8j$ºzÕFJ#ÒA0z °¶À™ª/}ºÐ®©èÅ:9¸©©y%ð´ûÉì ‡¨–7 Þ N8–çõiûÔÆXÕù>Ôþ“×ñÁáÚ«¨Ì }øúm¬¯!{¦Ñb[ ¨Ï ÚìĽD܇Œ‰ØšWbnÌfˆëÿ kÿ4#©Íñ#]Ž}‰Û©V÷=7âû4Ns›¤ƒ çF‡MÏøI_¨sЙ>`¦¥Uk×kFÌñ<êWP=(nØTl`@{DÝp›³YØCó-¶µžLqÇÙ•|[ˆê¥º{£g[3ÞŠÀMmÇx#òŽò!÷[üÞj™cžy´Î¶Û¼ßL'ÆÇÕFz8e›¦I. ã0N8T~äy¿áúü–¾å7ï S”Á¢~,#"€Õ±Á˜Ò>x¨¨3xÿ@h;øäï>"<2?¤‹ÆqÆ¡ùÜ€™fYºkËxDò?FJù=ùç–qó(žu5<ö±JY>ëewŸæè ÀYyšïÓÉâ‡Cçø òbj ~À ù!ÑÓŒðá©ñ[Zùð&øoÑTþ±ñÿ¨ÃÈ?¿_Lö£Ë÷£õÇ ÿ÷?øfñ©ÿþ[ßäÿìN,ð÷âÛ`Ìÿröÿ#'ˆ‡™å í¦r/œý!s—x«¢:`ó±åR,‚©K}2‹^êËOïKˆ)“·¿þSÃÛ;@Ô¿õ‰{ØvêöаñvFlo'wHèu=ß|Šw·Û‘=T=ÎqÀA(‚á}ó©h(Ž˜µþÆ™‹9a~¸§ù]Šîp[ñ“»#Ejª{Þ…%¬—÷‹$a/Z¸Úwa„§óÓ²,ÕhI”‹nûxnsºæëõºïRTUKñ¢ä°½_¶m—u‚¼íDtZO€°ï;"~z~yy:¿¾_<—`£º™w[—2`+%Y4gf)9/J«¬è@ˆ˜i]÷mStfäêØtC« lªF+,Z˜"$â½èžwS#ß³il~NI’‚ïb53IK÷èýý²]®&út>]÷ˆW $A–$ó–7X–UU÷ý*tJ²œÎç¯oßÌõt^Y/n¾kY’„Þ¡ªfD T€uYØJÎ9‰¬ËÚÌÎÕÓíêl  ±¿*šØÁpIL´FÖ8kc°.iY–”xnèrw!± Å<ŒˆUkÖåºÇ?+û5gÕ% “tÍåë÷×·÷÷@·ç0E /)‰0!Q)™É:Ø£ L=H00 ë²ìÙSwÿÓO_ÞÞ/ùëßJÉÿ×ÿñ>­§äT-‚Ã{Î>íŽzÅnQµÍ k¥˜»¡;IPéÝŠûe¿>??ŸNëž‹¹sìØNËg{Îe+»š T¨§Óißws/î[ÞrÎ¥_þéóçórÊ®¤LLȈDWDŽ._"#*¥œS‚ÚÀfˆ(iQÕïß¿›ûy=!°Ú‰]¯àpP›3å¢$ìÏ­Ô]¥@†V¥ù†(0²ƒ)(y,•)ŒRՃ豈õùééùéiË{ÉEsùþúš÷ÝÝEÖÓy‰›«š· GÛp}žDõ/T9Ëg»[lƒj³e'BãX£Í—ËuaæTs®Ú„ššºb=F o¨ñ}ßÀ=-˺,цœ÷Bˆd¦ ­gË8šLL¥h´§"àOŸ?§5!RÞó^²«1‘º!@ !`]V阵%‰·sÉk ­œÀâÚ¡”Ò³»–¢Z‚­dhº¬'lé–¸]ç¬fJMݘÇ˲|ùô……·Ëû÷oß¾}ÿ¾ï[=æ i[îÆöÉ9ÃŒ-nOFpw!&ò€Z‹:ˆMÕÝ®ûfjŠÐbý¹À,£ê_g’ðšc<<¨‘ÖˆÍ;!ØÝÍ=¥´—b%‹,!ébn kPö“ÈÓ)]öÜB“Gäœó÷×oçÓyYWFÜö½‹Qqœ£@Í@«Ñ6`eŠ;¨<Œ¥DfpU†c‘ ¯Û~Z×Ï/ÏEõë¯_¯×kJKŸbeÉרãÝ×{§U*´ÝÝcƒ ‡º†öÍ­Š„ˆ”„B…†D¨]‹Ô<ÑñQ‡^JV5Dªv‰ I§FcAà¶Ûd©éìÑ8U¸µï2Mö:oÄ$¦HMU;ù|èO. h½ZÉ™ªE±F[ ›ÜØëMu(s@­h)9î€À•D{LIÀXZîÁEꨆÉÍÂvЉÇñpb©éUè8èê7ú{óD7o¬Ó€]Fx%–aHª¥ZR›+«œän߀(-œãNÔV3Ÿ6ï½IÐù`±ô¶†xÇ訊Údy¯ qìs£)fàî9,ܧ~N§âîõy¬S™ÝòÂMîw"2Å“ÓâÁouy34îö™NŽih… 0ë0IxcLV˜»áT×=Ðkë}`jí¿˜k³E8ô݉ÚìÊ!úœâXÅ“¢ÖC¸—Ü=­ÁX­gˆ‰Ç´:¼¢áž:"¦³­îz_ñ¤€wÇ=ö!ÃÀþè”'èŸGðuâr(*pñs·I9F¤§+`ÊL W·QÅSÂQ‘0þkÑ\ò@JÕ5ÎqˆÏ“f‘™Â4MÔ–^qpÚWz9ëèØFˆ“û ê C/2* IDAT¢æǤ)Š­Ø ¦ÒûCЧ}¾uª†€ âE ÛÝ|ÎËwfŽÊ|qö÷+},@ý‘ìƒ÷âÈ>䄟äs§½ù$Ú,ä75ÅDD³qÛqRÓý-0åîG ÷‚ÃÌqÇ>wbPïx@‘é%(~ð‚ßkø8…¦îøC#ohÓÃ4cj§ƒÕâ,/=jÔ‹{Yo{|S@˜¼àÇiJó*Pk…ŸIý>NæÈ„ûƒPÃñ%V7Õ¤¨ûƒ)Û$¨áAý•Öí¡ҪקíÑ Žwåø(ÒÑßMú<˜¨øÇÖw‡©óãúå{¹ÞÞ›3?¢ÿÞå°…8ðg§.¯fPuÁ•[¥ü!Ö€6…é©„x¸.FÖ«zoæéØ~áí䇯¿¢bcµ@í†È­$¸-ù§D×trŸ¯âtÞÿÛjnìm­Ó  Ž"ú4â¼Õâˆ7#üöR» Þëƒ#çÓ§Lƒ“mÇ•à ò E„sÎûžÃ(– BŠ—iîX—žšK¦L¥hÌLžÎçn§jËSuwbÖR ”’®^*"ÐRòž’„}/ï9-‹¤äî×mÛö}]×ý§?¥$YUCú‰f‚œ›eD„Q ÔÝOKZä½½¿ÿþÍLÿüÓŸÂf.ÌZA¬æD¼¬‹šmû°MÎÌìíýÝÝV;í½YˆÀÁ‰ˆûŽÝ˜ Ô »íÅÀwõ¬,òüô¼¦ô³•·Ë›ýb°¤dªçõt:¯u‡ˆÀ@tQ€ë%ç’¢v¹^ ñ_~úó¾ïa­e"D'@#M,±SI)AF€…d]–(תÜ^÷RºXŠž–Õ\A«ÓÉ‚ ŒhV¬Ý@§$ ËXJuÏÌ0‘C`ÀC°0óhãÛó>Ÿ_çuaäÙsQa„Ói]}qó=ç뾡1 $‘óz2'HàÀôPðCˆ 旙Ş$d¬!0’BI‰ÿüÓŸˆèßÿöï_ß¾/)=?(ç,"«È¯¯¯ïï—n\ŒO¤*a’rDíDW"\—ÅÜ+œ±”rÍ9ô¯bT s—jCnº[ˆÛîî¾kízM"q%ÒF×íú·¿ýÕr9O[)H¸. á².K’%¯‘qùúíkgzª™;01ä’ð£“p¤ ¡%A®bStîfœ ˆ@»0NeDtB$4 à±›)#¹_ÇÁLâl,ãRJ¹8…–”žŸÏZlß·ËuÛ¾_.ÐëËþüüü'\L¯¨ÑÃRmqfI)$%$̦Þ+ã,jT ZhEK×Á×Ó€+@Þµ”Úï9Çf²ä2d8p¬7¨…‰ÏëézÝ65-Å™D*»)¥5Ê=Àøå鉙×eɪëi}~zIÌ×¼ïû¦¦Û¶k®êˆš2Ñz:aÉ¥[àCã R?–¢€°¦• œ˜XSëͽ1ÒcD*Uíõíý©”%-•Þ\xTǰ»õ ?"¾½ÿöýõç¿ý²œRÞÊù¼P “‰°ÙýX¤gùûV?pULìÚñIëp'fÖR®×+¸?½œˆÙÜ(öðàŒ„€L”$y¥j„ׄœ™YV3³=oÛ¶b< (4oÕ¼o@¦M¨ŒT–º»š ‹°0 S±$}—ÏÌŸ^>­)…LOìHKôÎI·õ) Quµ‚Ô Z‰hzÄywD‘RJŸ>½,ëùßþíß.—ë².“XQÉ>7ké&ñCÌr‚ïÌÜE·fæ'ªÊã\\ì^½öÕ­àÕ­OÔ(ÙU"#æ¨r1ˆ*[ˆþžh6ƒV¬-â@4&U¥MƺRh@ä(2!äÄK(5ˆƒ)ßÌm¾ B$foZÓ«ûaÝJ‰I&r’ÉŒÑν ÄG®ÖZ¯Ê ·ƒÙͳ]#‰×ì“PB¹¡Úšµn9Öw3 —("²p|zÂŒçsÍßôê]@ @Õ÷*TS×Jüˆ  R¸þ‰™ˆœÕ>Ž€5|y}]û 3_„¹®Õ|ìùqð‹{r‡ÒÃQ2ìNß@®ãT)eê@v»øïkþûËÉ<¦Z–ÑÚ Ì/ gÿ¾SÍ¡­{÷uËgwî.Pè‚rÛ`tz…Òzc´= »‡Û1œàÑ+Qú¯¢öRÄ(¯Q´»vŸœÚ7™èW«w³ž‹F81:Š”Oý [[’uÊbÕ0;-*üà‘rFBUµö”i'ûð–wé¿¢Ðßë¾®]=»=eÝÜñ£D÷øÀ£î\NT Ú¡ð›rÝ>lˆIä'RJQŠt°ø·1áD'ª»üvêú ÝÔ6ðñw°Ò‡Çp¿êÙÏÞð„-Ò0íÆ„nMéžÌíxúZ1øl:^Í#ùô^ä&ïƒX‡3gÐùÍO.â‘`™GRÝ<2D¿CàlQï£ÓEшY ?·ãð”gÿ1ÙoÇi >œNü^yÛýëÇ\Ü?„ú¨ÿøèý~«ùPÃÿËÕóTÿø-âÿϯÿ¿Êþ¾ÔM÷}Mr!4ýŸpälña0b·«–F…À~çÓ¤Á*Åo'ã&Kp×¹ŽG޵6‚ûØx»¥ÐÄ/C8t pÿ„ñìY‡û³À‡¢ÉŠähh…½õ÷ÑmÀÄ;˜nSðlyë1­é>‡s»ðáµ •ª—ÌI$¥d ªÚá Át&"‰’ÌÓºªZÖ=ìÀId3Ëšûbîíò.‰׋YQp:Ÿù´áž³kMù³Èét2³Ëõú·¿ÿŠˆ×²·š¦ºÌ‘e=¹!‹ˆ+DÌ̉ ^®ÛuÛß¶íå|v¯.SS[Òò~ÙÜ#·N,®Ûd 03–X!©©:¼mSOáËv¨áfªÔ n\ BÍeÝ®Ûå ùùÏú”Òò·¿ÿµâ½lȰIç ¥EP—eY׳ªþýí¼yd >=Ÿ¿™1Q.Ù\]-‰°,HHê.ÄËYrчÎë©ïÖ¸mclt8ë¶ïKJa÷ì4ÕŽ 0Æ>~½^w¦$ЈڧÅ:ÝñÐÚ>)Q" ØÖ’pJO) ù¡íšY ÄSZ@ÍXøûëÛëÛûë÷Wù—þóuÛWIaöQUf ñ?6Ù¥””¤›ûÿáŽèU¹[—Äœþþ˯¯ßßÿõÏÿôÓ§Ï̬Ù^÷÷ëuËš)˜ßîÌr¬½£D{ÙKV"´Ö.K@Å•™Ñ¼`!¢uYü²]™x=Š j$Â2X7ì`Äè±ÕkmñŸÓºÒ'úþýõçŸÿúíòöíí»ª>½¼ÄïOËB̤jL¼¦[Þâ¶c$lªá(ßò®ZJQIuFËHʉYÝẕXYÖS€¦îÇ ¾T'£ k(SànêY'p Xàžë]FC!ŒÏ7Üâ% –ÓŠþåOËr¹îWD0Ðëf°m%3;Ο>½„ÂUEDt¨å¥à¦@¤Ö•ëP)ЪÚ5ÅßY=æFÌg‘ØóÇŽšˆI„˜i]Wfι¨êuÛ®×Ëž÷}ßã¦J´jmšE‚jÅ%bNÌÜ£[Ì´Òº¦E’•"͹¼^_“$wÏZ܉M<ï{è=Ä}Ë!ÝVr!æÀSJDŒŒ`’G­©xÛ¶.%¤eaew¿\¯_ý¾œ-)Åo»M€#U}{{3Óoß¿oÛu9¥ÓÓ*)¥´„ðQy1cÓ©&·]qÕ¿ßÍ”!Ïé`´ÔÏPU÷¼½~;?­iYQµˆD²ð’–‹>"(ZÀAÕr)uçƒLcá$"¥hh4¡ÒBÃ…h)Es’…™ùùé$,Å P˜#á’’H27-«Ê£‘ÒàË:ÚLð¸Hr$(¥³ÅjÑx/~ýú¿¿¾¿½§u‰±ÊÛ˜÷7ñÜý8¹wãVÁ9áj¹EQ¡"GEsiMÔž”R Ñ3æ1Oïþƒ—ø æýar? TÚï!¢Vj}ˆY b‡ßÙX8 Úz”§²èÛÄ›NæÈ<áä˜Ãßk‰Ø5“ƒî?k“°õ± úOûá¬NZ5ÞŒnoM³ùœ°‹Õ4Ý0~@˜M:¹ãŒdÁÁ‡šÄú¹¸ñ(¦·ûÌj÷0ù£ûQÄöû·óØ ŽxSÑáŒudÁÏʼu¡çzfÊUà£IL'ܸØ÷øJœ?õz 9˜ßwŒn§F—ò›Æù‡Êß!LpÏ©¿S ý —_þýÐ`4ÃãDÃÃgþƒ·>¢P.©©iÑ®>²ñ©åLšhºOÖæÁ½Ùø(%à¿!ÞúMFoÞѪÜþ£:¬ÿ§}ßö¢ÿ¶úÿ{þ¬ÿãoüqáúƒŽˆcæw| øÖÎ!ÿfß¿ß< ÿѨà¾ãï<þÇÛ ÞþÈ`ûL‘-?4ÕçØQÍB;Ðg”f#¨Uß> O_oŸFÐm{{º·z‚ðF7G€¼ o+íæâm‘·©¾¦hA‚Cà ª/o.ó©Jí°Û#R[¯DÂn¹ñ–Àí4~š ÷Ç0MÈŸCê \b—ž–%‰„EwY×uYaË9ªcÕ¸ï;ŸN ˆÒº¤”˜m¿ì:Ú«\UãÑåzQ-ÌüùÓ§p”T61 3¯çó'‘ëéí’÷·÷·/_~úüé“ûþú—_~VÕu=-§•™ÝêÆ’‰Öu%"B&†T•IN뺮 þúë··÷ :¥$²0¢œVN"èˆÅŒ ‰™—$ÀA0u(ë²:ÀÊœ˜ÌìZJ6''æ&j)x.f¦1Ò0wvßQ-ësÖ²]¯¿|ýùë{bæ¼gf!ÇUÒ’sÙ˜“ÈóÓ9 kÑëæYÕIäõû×ïß¾}úòåû§yz:!¢$)¥˜*˜Š“˜’f·S:=½œ¶-›™°˜™Ze§+Ó‹ê¾ïÛ¾'akð¬9ج¹ìuÛ#€€˜K1³€¹W·”{É…¨¾ñˆwl{ &¶d•á"‰Z×R8†âü1H)aÁŸ>}~y>ÿüë××·×ÿçÿÝàËçŸ>¿$FF&½S !fm°åØœEpœu¹è§—gfÞ¶íç¿ÿ|ÍW‘D„ˆ‡gäpˆ[±øP˜bÓä苬Bìeûüüòíí=ö‰LÌ$p‰XÆÆZSÉÝÙ€àPâm#™ eÊ‚ÌDð Ô´”²]¯ÀÌÁy-¦FÜÍ“ˆ«ªáI„ˆJαÁö¼½mÿŽ//Ïëº4$e5DWsU&ê„5ÇÄu“9êpÂr»ç23°©’©™–0û†M³ Pxò¦µ6u$*¥„xæ’Òçeùòå î9G\cßòB”³.ëB"žµš½Ý= Œh†MCÄhˆRØQÌJÎaõ35Dgæ’K¼NFs©¦Z$Y˜ˆÀýùé ñOàžKðmßUÍ͈„Q€Ûä3‘¶QGs»ñ¾íæ^L—”ÉÔµbÓÜã)âYKJ)¥&¤±gžes7®6|¬-Õm¾í¹ºüb2®nÛ¯“Rýþz€óóÉâ”v}k¤do 5CâçççØNü§ jS­EwÞQû©p÷§$™Ð-aµµñNâßµ”ëu‘u=-iab”€¬EÁp˜µÇÓLÍ­¨UÊ™#C° Bˆ!ŠK¯ÝU*ˆbºð©Û»âVnlÝ ñpÜr.f!$”êÔ€¿©ZÀ±£K¹ye[ eø/ ÜjQ34t "î{y/{vpbާd÷tû¢§ †nU$l_Zud—3+ÒÁœÈÉÂÍKT×4€ ª‘g°Šwî{Ɇ`«§.6·KÙаû=ÉYP¸&YÔ ¸^ , Üzm­–Qëðb¡»†ež(šÏCôL)Idq‘$b"Ë"Iòž# N>-†ˆKbÂëuoZ4¶M$㣚FX"(1ÜͰüˆh²ñaF««Ñ*;Æ@ƒXïNú# 3G´´¤è£¢:ºÐRšÝµæhÐD¼å€«ÔÞÆ°ïϯX§®¤\-TSM€FbF7@Ž” Ne68×öÕDÀ¼c½ £6 r‹: ·.°ÆbÜÜÀ Ûëu»†ÖL5C£¨ˆG'Í ïa±hh'2*w‹¦v?˜ ÑÁ) Š1Á{•°‚ÍWŸ˜½Ú¯·.IŸð(8R$ƒæÙíóÃî³ ƒÖY:q€LÙlÈXËE||Üq¿ê{­æ¬®i†V’ÖóX½ž×ÜÆÎmæi”ž"=ì0αêq®ƒyªó¹¡–Î2Hhý“3§…A[›[XÍ:,¨ ±X„‘bÉQSV´®âBv0¨ô›’…x©ÜZYú{07Ë­òÛgþpô¢·ƒþaæ}›’0Ë|Ç)ÂÜÉV+bªÿþvsx»š‡å™ xïÆá«  ·NК¦Ö¬œÎNowÎ!ãi€Ü©W$ÄšÀÚ¼îúú Ÿ|üÕ~Wj'Ü©³›JÅib±¹ÙÁÿ?êÞ¥I’ËÒ¼jæîAfV-f3«™ÿÿ·Fjª“IF¸›©â>fq(TÍ<d²ººCR˜d„‡»™š>€sÏùŽGýJÎ9v|0Ï ú¤l>Ò¡Bï€;X¸_év>¶ä…2Hô>5 Ì'¯x»`&B—ûs÷)øÐ1ê O»“â#Nh¨[§¶‰Yxš#(8µïñ¡™øpHø¬:ž¿ò‰D‰½(³M}à¤çôoc»T>æ ;úÿØõ¨cŸRŸIÛ¸Ë÷My?WOŸŽKŸëúäÎð£Ø;?¦G¡üôMŸžÊ£‘Ú¥Á½*èоOÚWáwÿO>—}¦âOFoþxøùûì¢ö?' ûöü¾ÌŸÏ~×û?]×þ§~øÍ ~\ý÷&üCþLJ"¿ßŒÿ ñ…yûø#_>„œÎ>†•†:jçUÇ€uz^x×ÖqRï¿=ö»'Âm=ð<á‡Å}ÝZç›Øˆt{O7ãTÀ;F3/N‰ª}cNÍŽCNÍæãó$q¼ÿi:@@á»éËõýœ7α¦À‡¶œ×ŒcPòx;&Ö åÑhjh8 †1…Ò‘K‰ý''J)XÈ„„‰ÂûÙÌŠˆœó²qK‰g‘©ò®‡$—²;lµnµ¢ÈºmŽ€DU…T—Ëå§··m¹þãýëûÇ·”RøSˆèÛ·o"²,W7T"îÛÈ9‡q;EM%¢˜ R._ÕÕüë·o¿½»^¯o9-%çœë&j~»ÝÔØšà›š»ÙlÌñLõãn/—¶â47´Xô€¹Õz¿ß‰CÉÊ¥°jvðÂ!^pº¾Üï·¯¿~Í9lIÊ TÖÛG­¹0A¦”Rr„jºn÷m[×;!ýüòöåºl¢¿üö•1ŒQ5qfd&2UU%b$zÿø "6Øœr)ËíÃBúo‚»93Ðõ²¨êº®LWDWµX …¶¶U±ðƒ»+¨‰‰*¯u€ìŽ}$Pr.%‡:¬¢f 誚˜€(§lnÕLÍ8%v´)19f®n‰hÉñ’¹Ü¿üôþñ¡à%ÔF¯éW0 zKˆjƒ"¨„™Í,s~{¥¥”ûýc«REðíg}3Pùb ¢ë¶ÑR2%n}žæð±ÝÍm)ž~Soç$0'Ñj½ô3z¨µïad܃±;öº9%5/f¦ÿ·¿«Ú·¯ïUõ²,„^¶0Ð͈¸”²n5Àû¡%Çf­õ~¿­Û½l%fuÁmÝÔDª«™ƒ¹@5`&çæéu0A5QpÂXhZK¿ M#–¦q¼=ˆY„Qнkšî~®ªjîRk†\Ê’ñåú0Q))m"½9ÖÐÈ­Ö¨ê¼ßs.¥p ‡%•º'¶nîê®ææ’ …E›„slY£qúp CÉ%¢’R)K‡:[­²Öjf*¾º;xJÉÁÀ©õ„açÑ#æÆô0›hȉÈ.¨Šªˆ˜[J)Fœ¸¡P: Y Ä9sÔV«hu+%…TkµéW€dÓu]×sŽ©j]e»Wf^®¥W PX§[ò`ª È9ÍÿPC¢*cv½Ç:ËØ‚4»×G‘düÙֵʛê/?½]/Wê¡fn®k¤¨ß‰ªŠ¶±ïM’*ÚèÀ}ßJ‰ÈÉÔÀ=Ž@—²¸GC<§ânPÍ¢%[¬S†CSŸVÖªâF.µ¦œ¹s<hÀL!.ÄyÕŸœbQÎE5”qh€‚ú²Þ×m]¥ §ôòº A¤fBµ ZP“Thènñ/DänDÔÆ$×fó‚Ô98S7DFA"ÝÀ"ÅÍÀD4¾mJì!r#¡›ö¢SêtwûHd7‹:;­ig¨¶s«GØ+þÆàë"ì}«è.“˜…Ä93°Ä<úH ÀSJœ\ÝÔ¶º¹;s jkŽa‰£7Èxö' c›4(R.DØ»‘±«HÞH&0\÷ À=Äæàd»+„áçmæ— "fOˆ˜›1ˆˆJÌÐÌS©-µm "2£Fµé@ÞvÅjŒßÉ ÷ÏVUÛ[ÜÝT™˜Øb¦±žé+ºµBÄÔ">ª f"bÖìÿ`à SUWS''NCëf×v¦†ùÔvY“v²XÛÖÇö¾u7‡GÐ]ÝÀz¢$ôlocá–÷VPì]ÑS c“÷&DÎ.é6ž_l&dÓO´]>Héø„Žò¨yÁ–Ãb7Ézkˆ è¸å£êÙ@A*Ÿx´O/êñõØäµ…g)œß»<•ŽçJ„¾óh契9äÏåI[gM$ëú:NŸíê?̽Ofçwú½ÞÚ}22µ\ãÙ³ßgÚ8§ê¹kb2<:ñ{ÁùY]t?ÔÝcŠcPǤ6÷þúï‰¤Š èÆ IDATsLÅOWß§Ç  Ÿ#ÿŠúï\›þq=Øÿì_œ'Oø/½„¿æýɉÊÕÎø¥àóéÿþüñ?Ÿ'ÛxRúqçàž5„©Î¢r<µ§ÛÒ©Z`* ØaËjO£5œ<õf¥Þ€Öÿ¦ã±l{®ù¼âB?‘1·ÍÜ3ñ‚pP Ö_ÏT¶Š,Ÿ–µß¹È¬Áƒ¢JÞg¨kèOØ» ºCyºƒv7RKu `”*ت«™«8pV3ö»>6.¹Y0C⣠3"—LD˜[$šv·3¸ucEÀ’†oä°Y$‘€Èµ¶n5ýYã£'#>Ùxad4XI-ÊN;ùºÍ3ð”ÉEﵸÐxKñ1«ÃÌÈÑ›W·s¨…Fc4à­È„mƒ‚Ì>^„£1¡Ír‰MêÏÐѨQŠh>šoNU±Ã$Ô=yA¨ÚwÙÖt™!j`¾M–™Ä­8iøŸ›<ß$-$Bsô4^ ú¬Ît&½Û$ˆ·xóm·a$u³€LF‡ô 6ix*-yÓa‚äì«n:â à áÏc87»öx5œO»¬l §éù³±BÆ^@­®mÖ¸[©Ÿ10UæN‚;y·ëÝ{Þï?'Pž¾nl}ÜÁWÕ1Ÿ[‚gÒ®´Íl>ûÓçw0CS|ÌBvƒ3!òζ9Áh ?ákp*ë$‚}Û=Çz&ÕbªP?à¸'ìOœá#ÙçSNér¹„{¶Zí~÷îC4ŽŽþÓÚŒ+·ƒ÷[¢õKˆÀ<Ö³§bÖnqÍöÎæƒß÷oè`íÉ2ÚÅw  si‡û'd‰V 0<ä'>ù3+ó™ ï~L-(>h¿§ßL¸~:ñ:j8 ° >”s*ŒõgL <‰ ý» ãÉ}uaï„8|çyF6s'ÙéMð‰}DηPÑÐ{ý<#8~ñ>oÀOB9û¼û'þވ硠â~$ƒøãÃ'õú}<8Òg—¬Ž0Ý‹e¼Ÿ‰Ñ6õ©á!WâKðÎKÚÇWà4™êLîO‚,{àòÙuþ#JÈ$8ŒÓ÷GÄá'‚™§;øƱ"ÿŒ\ã?®T?ÖøŸ–¤?Ù?Œã9©ÿþôúa ú‡C?ö~ü÷{çÕÑÃB?<Ûø#h¡ÿõÿð×?†ûå³YÁ~‰÷ øÔU‹ÝìþY.O‘bþ>Æì‰XÜ;{6¡Iü~ºu`ß<ãqº7…µºWæœ+óÞH×óéýáN‡–ï>e¶ðƒö®ÄÓ3Ó},îã!I½OcÒIÃ_šÔ¢Mþª—èpbÎÏ œž)¸Ÿè‡•Êaæ˜ÂœƒSŒhH]R‚; 931…Ä­ûò…˜kÕºIXáúb‰‘7¨ª’ˆ¨ 9¨› Cæòrýéç¿]/— Õgæ×——œóûÇG­5Ì€Ì,jÉ,1C°5ÜCU7QY7\7pp„*jäðÓÛkÆ/[Ý>îw à û²,U4qúíëWScäœz~ V13QQ"¼ßnw'€ä€Q²GäÝ%  RE‰Â0­ õéœUSCGs+9½}ùéº\ÿ™8åBèj¶mµJ•*'¹¾^s^Ä¢ë8ú˜‰Jb&/ž“›»©§UVU-9ç\85r¢VF&¦œsâ¨f~ÿø¸^./—…Âgãî)q:ÝÝ71dµš2aïw²ºYôK¦Î^]ÊåuY ]Ä«h­Z2Åôk,.KInÉQ5“àËû’‹¹­U¿¼¾””Þo·µ #ÿíç/_^^ý?|]7±ŠD‰9þJìö“!êd1s÷D‰qcF …ËPâÑ(<ÆN@)1öÅÛ.™«‹ˆûþó—_þùOD|}}% ’³¨Æ$ÐÌÑA¢Ö£_4!åªýy/®">µ]©™‰ß×õË—a„kf7³¦åy|²˜rVÕÛz¬90/î%g"¬Àïß"Âr½^ÁÝME$N"7sgULAe .0:¢9°#2¢ªŠ#w_kïèbËœÀÍ,*8ƒÜ`݇¹ÛQß~z½,×’(±˜¡J¢¦ÞG$Ôc·(ÀÄ,.LRrhýNˆÕÌÔÌÁ›íºÏU™ÙLcn—˜KJHŒH]äiOon3ê4d¯`ÖÕ±5Êå¡a»ÛmQ‡ú/)ÂFÚµibÊ)•¥ Õ0±e!øá@›ÍŒ;È;4FdàèºÂD”s¶æ7oß?J°ãü¯²E--,×ÂÌ¥B¬Ò† ëz'b3¥FJ'woýŠ€ð@Fž ŽdNÐŽÐ…nh"Œ‡".9¹ÙVk¨ÿfÆÄ¼$I¼ç ÚXÚÁÒ¹¼çx YÉ&ÞX„nô`Ft5S5Ug€ÄȈ‰©T©[”½C7Jc"âþîÖ”bz×{ [9Ênï3‹Žª¥Ä½5qðÒCðn˜Ö(vfÔæÝžÆ 8ã€Û¼¡µv…¨a[ † ¼îÀ{pçxº“‘ƒuì82D¯»Å­TUM“%“ÖÜ÷l4| dÔýg4à0€ÄÑ €-D„ÔlîðHHHˆßqU ÞŠy ÑÐ)&0Ýy!ƒ{Ó€FŒÁLÄÜÌ!æ½1”èÒXhèáá4׿0!bëK'$& ·Ÿ¹G¥‘Æ;I£Ë”q<|¯LJÏ®ùSÇþxp9š[ÜÝÝp8Íܬª)ì½5Í¢fjFv@Ú³x·söªh«ó Ìw¹œh܈v€D¥­,¥,—k­ Ñ©û¥ÐghýÞVAîêÍ̽Ÿ[¬©óª籫q­3SÂX+ RBkÓŠñ˜9 Å‘9*`t@uU/ðê4 –_Ùýû}rÕVÑ>K³×qÚEú¢•[ƒ$v')MNö©TÙáQ ¢æJ²ö¯ãåÇè‹[ ;='ÆéFàN¶«öØ 'aBÒ v÷Pd… Äb·FKE„¾þ™ù'8Y´¦`Œ-(^0¯æqòüŸÔ1mó°b€Zû1âÔ'<Ú•Ý€Ø{A·[[:"Lu¸£aÿ±G5¾²1U¥‰ã:3Ôq‘Ú燄8Er­híáÆöƒèÜzlf¡¨üó”eÞ÷ÖÚc$wžŸ¾`ü¡Ž71Iâˆ"©edÓHKx#Ý·+j%(ªóO™<^·M5î²­7~DRFEn\ÅØO¿™t×K7rõ±ËAÒŽš·þXlëLih²½°avÍD;Wf¾WOŠàL1Ÿ4Þ³˜7„æœAÞ4\?Â3~ê±ÝËνŸ­Ñ>½‚qÛ´ç2 Ÿ<Òx8ì½"G+5ú‘.4ñü¹ÃyÖ‰qrÆï §ÿßk`‡E¢O¶|hágIwÅX´È B3&bôŸŽì90áÏzFx`âïƒÃÂì‘O2ä+<*}Ç¢Ó{è Ìȧ)űæµwWïS±Ð~úGb‡ó(ÈÕÿS÷óº³a†êûÜ"0åÚC®…pâýL~Ü'`üh^Î&ULJ3Ù‚Þ÷ٯåµã»®Ÿ G(ögZ¼ŸES|~®ý8æ³Á¿¨ûŸÞïTíátrã3õßÐ`Žø×âþ#ô÷#øÉ<àO«ÿŸØÿÿ[½ÿøG¿èÔæ{öÎÏ7<“èIz§ ѼÜ}8Ì7ÕéI m¿ ÍÉ3MÝ|¸¢ËÓ<„‡˜Á¹{¸#†ýµ±:*ÑF=À%´ð=ì{C$ŸìØLÔ8¼_mÝAØg ‘ôØ*·?jnò¹ï—ŽgQ›´×ä>ƒÎ’Ógz¼pŸd‹æëÅ(©6Ïx;v„›5å‚s¶VjGœ8þóׯ¿þ?ÿãˆêZkð(Npw@‹õÛËõFmIl†¢ª¦Èl·õ.fTû ûór½–R>n·Ûífî`®uSÕËå%µ\[ ›y­2R«ÑÜhj˜sº.KÎåï?ýœrFbHK@£x§ ÄìýÈŒŒ‹ƒ»aÎŒ½©>®æ]î˲ÔùKä°MàžTaXlÅèx8S3'v3§è¨DUlgàAÀ«yûä©[èp,V©¿ dË<ân×VýæCn%ítv~Å­ØÙÑw„tWúv€T{Cæ÷vçÛ9& *Ôÿ“v@C¬‚|ƒyÇÒ'm=çkîûº÷Jä¦éMÔÊÖγ¥0­[oˆlÉ óƒýð@ý¨ˆ§9Ѩœ†„>÷8¯ˆÜ1†{múŽ(o) @§Xõu`]°ûÜâ®ë;ßÜåZvç†w½²Ç–a¾ïªèŒÓ}Â1 z²‹Ç®Öâ„h‡t#¦ýPRl"ȑոÛa&¯ô³k|QìÑ‹í©'zÄ0²b­jÑúȵO‹ LŒG8 Ìjˆå‚‡ Þǵc"5áï÷=[¯áṪ¡iˆ bÐfð{zo4„§a¸áûaì#ßùõ‘!J)¹;õh)‚öÒžÃÁñÌßi¤̬Bkò»#~¨Ï“…}ü¸¿±ÝRˆLžÉ‰?öÜc2Oö$Âd«3ÇCAã}ǹBøøN>a•œˆ£vwØè§êÙ‡XƉè %r˜gE'ñúàõø!± š ü“QÙÆg¼‹R#vwmŸé”ω8“ßÿäO€E>UGì²8NâÛÓʃOTG?ÉÍÏ„ØÑ¾SAŽaÜ)ðƒæl‡¹ä`ÿÇÓ7ñÓ4mÄ/Ü¿ßð ’˜>ÕYFþ~¼àûÒÿgsHDÂÿù È›xø¿ö†§ú(ÃÎpüÉjæÏ¾ßÿ:áÿðß8Þ¤ð<¼A„séÀÿ9JÑxù;zwGXâ¾8ßÛ¢Â&³s!"ÈÓxÓ›ÁžÓ† ‚†3sß-:.§1@¤Ð˜$ðA:ǦvMïfp4$dÛùãÑn>öÆñ°ñ.Ú:p§,œøc0î¡4_¾=‰ˆOg÷Ço2?Ÿ‡Î!H·mÍœ[¸¡ÑfD¶mKÄœ™j΋;Þî!ЇOÙ)ñZ«J5ÀLt]–œ2‘›*­Û&}Š@D?ýôÓår%¢o ªa]GmNic‘”òe¹T5GU¢ˆ`bl˜ÔŒlöÊ4 ~Ün\Å gG´ªâÀ˜e«U+ºoÛ¶UaŒÌ±ƒïÛ˜”ÒV«›;wôü°A!3—þ¡ƒƒ6¤! ;(˜Vg&pX·-1ç”Tª»«é½Þ/¼0Ò¶mãiòr}Å—Pë/ß~½l—ûzç¾"—ח%çÛ¶©yi^G0ræÄ„t—Õ XÓÈbÇG@è æ–˜óªu«›ˆ–’SJ%ç”3ô¶O߃”AAÀ¥”z¹ ÓËåz½,a\ºÝ×{]IÕ¾~{¯usô(ç½­ï«ÜÍ­Vu7‘U•·ºr\‰Ò&Û’sB¨Alr't`¨"„iY®·õ€9óRÒõZîÛ¶mÛ}»•\J^Z`Û¹y+Él‹|šôqš3qI9R&=~㌈`ª^¥&æR.!öʨ"Í.²”ÌœT•*Aq*‰³›‰JÝÚ–;%V•J™G@¡ATGh¤õkU3[–ET3õq@q—¥Üî+$JK)·ûýv»]–¥«EÀ‰_^^Âø¬*ë¶å”ÔÚ ÒÀ0(¦!V7 C `LÈHÔŠHJ.ªbè)¤­Ìá_µ†H)šC•-¤aêñï–ZG$L‰Ð‘UX¢eÔŒÀÑÔƒvœ‰±‘Tê~»™››Å9)R×u­²^™É"=p)9¼lß¾më}uʼ”’Rº,Kkþ4ŸKã‘1‘ªGˆ¦jæ1$µø}löÃøVà ¬ü*9¹së~ضM5tüLH¹¨híÜ€ø"Š6 Žm]š…"jêiwGZ”±‡…;PcfVJ‰[1Å(°¼9%15•nÞç0¥;@­U6½¼,3ÊÀw°{ø9& ,£³(f–H·Zï÷[|Ïœ õ_÷º©Êå²\JJU4‘$âˆÂ¨JÐíE3º¹†ÅÓš9,¦#Lð÷Àûä\~þù'Sù¸ÝÕ”zz ÙiûE—ZÛ<´²Vj.´IÖªÐg0ýÖaC梽—Bw¢}¡ˆ¸"Äð‰—²ÌDèMPè¡?ìË¥îœuí&ß0RâÄŽh„î.¦ë bƒš›Šªª qJÌ€Àˆ™zϸõÊ\À¦à´›!6λþ®¢’q»ç>PU³¨®¥Nr‡>ùCj«¤½å‡/›z' -м+¾M„RE"íN”˜ÝºˆÄØo¢ÃgÚno€4”ñr¡Ê‚ÎÝd ûôhÇXOÖß]®ˆl·êoSU°ð¦†y¡¦ñõµ«Ç´,/Ë¥”¬f¸JÚÕ?Ÿ+#4@0‚±tìRóåÓ˜‚{¯þT7]uð¾ZG©Ón:„½³ß|K.³ã{Ò"FÚH€Äm€­¸U]GJœÈعàÞ·i^Þñýû.¸E!&hƒ±molî´¢^‡ˆà£—Á[…5u:aôvѧ ¦2[ÀÝLZ=ÆNS'¤cR؉3»4Ù}ñsÃ3¯µG·B µzpw¬¢ÔZÜ¿úæ»›ö•ÚŽ z"š¹1Ôm‡ÇfKxp²w/¹Ÿpùq'Û»Ä3h×öÇуž:øæwA°ÿA\ñC¨šGDDONÛõ}¢Q²Ö@ÿ1!;þ[yt#-ä›ëÁ,Øë>zy@ÌYÇ6ÍÏü³­q.äˆÑU@k±ßFYq< ö½å®ö}ÜýüÆ~;í¤¢¡ÏöVX?Ywa̶úd1bm­â»Ý$ç>ç6„;b¬ñ•¨-îai¬"w(EhÏawhšµ"9ÕZ½Mr#ר€“½mÈÇ>y‚‰ÑÆ[}÷ÔÁZÝ3G½ô~7ö‘çtÄêàØróÚý0d ôé†tøëûfvO ®Ñå7ë¾ýV䟓èO2-»Ž¸·Ï“éºÅÓhádó‡ã þw•Ôg£=>kyõÏ ³‡@ÓmN¿‡½âÑ×½'Ì&zJ]át›Ã‡7:Ïhçàž4ò#¡ñøÒðÓvßϨ%p ô'“ïŽúSÉêüZÜzï„ïÕôã¬ó¡óïù–¯ŸÀ:'oÏÉõùd å­ÐGIÑýÞs‘ÞÏí#,pœ=þ ÿ„.ònW€Ï¿wÊi<$ü<'ÁOÕßï?™È<ÏyüËÖùߟKà}«?@–ÿ—ÉÍmü¼Ýçê¿?¨ÿÎøGšËÿC€?Úý{–ÿÏ䜩4ëýG|ÌÉõÕ1íðrHÍ„sfk* žT{€­‡wpS5YïÛ !•œ«™Š 3sƒ]­æóhcÓ$ϵ·ªÒ¾À­ 倾»Q­¿Mõî¶Ž6f7KLµÊ¤D4JØV°£30&j­ø1ªN›>Óž$¨ª6'j¦öñ‡¿Uãé'Œ›»N‘1i@£ÆQŒ2õÚdq[2§=lVà¸!Ñ0üîõ¢}‰2”ˆxlº;`¿í®ÍµQxql‚»½ÞcÚÞ–œÍ\ïò98O—Âã–zqìÃ*=9HJµk¸ÃyBùë*@J9úcÚÞÚç…ªãÑ#×ÐÐgã$N‰™ˆ $R­¼7Vº]¢ïêNˆbfì*KN)¡HÇ‘C”À.ƒbC\€ôh‹÷1ÄŸŸ|ÂÃ#ź†9íÀ1¢øüm¤W¬›”Ã<ÐÕ:7'f#¢œZoAôÍ@ÄDÇ„¤Åœ}ŠCÑî}˜ ¢£bq¯Ô[ߢã–NÄæ#É1¨;=kç Eª›Ù±CáÐÊ;.œ._ï ßa3:—-ûHŒL¯á4]ÙAX}mÇÓ;”g,Næx”i ¬Ï'u`Ÿ°çFc¢Ú=²ýD2„µˆ:Õ¾ÄåH?ä\1¼PDÄ)iß­`›/î»:Ù¶{†}ÒÙ|Ñ|ƒG$ŽM…Àã<ôƒxŒø þ"áØæ’N?‡Scõñd~®Ñ<éÉô½XžÎôœ£ {/{˜Ë:G]ñ*Ã"|ª¢Ÿõ;üü0DЈês;ú>cn†S³ëYv?ÉpîÏ?ªmœHI_ÔIÍg=ÿwÕÿ¼ßu\pþÐk{Àº»Ÿáè8»éçò[Û‹¦X*|ÿëeh?h“éÏĪw@ÿ= Ô°ø–ü¯¯ÿ}:Èû±¯ÇgÀC[î°,9-íý¤ïOÈþS5y˜~xü•æ:|[lõ·>à–Dûþk03{ý®ïà¼i0z¸Ûô›KÃñ@ýÁxœ£:8:A÷1y÷Þ÷½æˆîcÇ{}ÓlÀñ4Õ%kKÜz'‚ ïÓŽqxü ðAýاÔ³cß‹ºŒë”’Š&JŒld½G‰HjÕdVUJNœš¤Äá\Öfb3sõB\.œ×*QLŠ˜Ðº0df—Ë.—KÎ)¤üX‚Ûb1—øRR©"[­„TJr5ÀÐ8B´µAMeŸªV5¬Ko㾩J‰KIP!_¼Üt“ËåBDæà®ÌdfHP–œ˜SJ‰w\©yð²ÉÛæh[å~»¹Já¤àÌdîÄͤ™v15/¹,%ÿüòòËׯ·[Ê9´]Q]J"Lm(¥8R+œSùå·_E51ŠÁí~Cw F7´¶727,™ÍÔܘ0àVŒ ¦¼a½Õ›J~¹^KÎJ)Û¶™*Â[L8˜HU$_¯—  ¥dà¾nëV•ˆDй:8UˆÞW@ÓKY˜XT†Äàî¥ä’Ê’3‡›^ÍDU¬‰IÕT%,BœÑLn7¹ÝW5ËÌ~qØ@S"DF‚”†%S§VºáQ²1¸Ê)vn.Žjºù6öZmÎdj! ‹Þõþõã›™Ý>îßÞßãÜÞ¶ ©”¥0to»»ÿã׆Å]­Þë}]ÀÔE,% Y¿•§T·?+ç Ý>}¡hª™ƒŠ „xAÌ;®÷ëÇ{ë£3 §°›mëFqË4j`UE"Æ ”)AŠ"ÊŒd%¤aã ¹-d13…FAf6U :‚J›VŠZ”FÒ’¥¼ÞÖS†@ZE¥âЉŒVÂ̶*¡Š©ˆ)j•ZÝD‰r)­v)&º·ƒ ï3'0³Ûýv»ß¥J¸ÆbJÇD˜­Úv­]s÷ZEÕÚ^(õ'2å(g…iwŒ%eæ'U»Út´6 B'ðÀA¨jH:æÞµÈ&#"¤³kŒr!µþáhïÀ`£ÅLE‚H`ãŸÆ¦ó]R»n$J)²J‘"ÿœYºØ91˜QÕûýffÔ.¥V`Pëæ¡1|ûö­ŠÄ„‰‰âà¹j“¼EÅÜ·u „”rIýú«ÉI Ã@Ò'aïîãä_·-J .—Kʥ伮ëÇLJ¹"bN%úNByBîvoU¥P&º58°ÃçØt«ÐÆ›Þ .RͽÙ<ÜŒqࣚ2’‰‚),Æí´Öªjì=>Òýѽ›·›ÞÿBjnM$ /‘ÑØÀ쌞¢€6Ýß ¥4 '¢a"nÍ—ë+&B71^ž(çQÝ­ÌÈDâ##0¸ºSëV;Òè‡0×îVë@ôf575$$ojì.îÖ?{c‹c Í©åнng4^ºº#F`€ˆ™RŸè@ëN07rî蟆…ƒÜã; bx;Q%ƹÀîQ‚4º™#Ù0 ûŽ›œÆgÜC4UDŽω[«@ûX0j'°MWšV?.7ÄVŠi_$êh ”|›õ‘ƒ˜dæ®HÕÎ"´È$Mq¸ n~Ù H;ŽSb´‚»›˜s¡ýXÿýq›í]žôÙS‡NQ仫 ³É}Èä­S|¶’÷¥2îØ Ø›‚;:Çw4JÌ ¡qŸmEI°iÄâÑɱƒ+úÕ;œòý7Û€3´&¢v ¬i6ÉtíNÞ.sœ›AZ’Á w¦ö7±ç³cÀ3ºÜ÷!WÜÓú$µÝwÌœšÚ=‹´Ÿ$Š}€½½EµR"¢8;R¶zè‘Þh³Y>ˆ×£º` Ѐ5ͯ„¨bC¯Êžf¥#ã½{#ý¤J ‡ØÌÍÚ@· F¼b©#ôFãw;pÒÀȦ2Þ1Š#lÓÜy\E{1À$–öAÝT„p2œl½3„²f¢ôàœbß.¾TͼGZÇÏÅž±é”ö= ¼?›´õ ¹Ùxe‡S§ zxr08–9'Dj `óZk›íê?ÌÅw»ð†û=Í÷aÛä˜ï³‰ogŠHø>§ÁGˆþ'v§CÍ4zø )rCw›#>`$úzÀŸ©Íggñó92%޾?nŽUê~xq Ñ¬8Jã !HÂót‰O3ÇG´zSã Ûm¸µ8àÜà1Æ-pð˜Ÿ9åpEüù\€æçS)ï)¨Ká”a.Ö÷"~0ý±ù(ËØhªèé—Ã$?1þû” šß ÎõÑðPÚ¤S?I·Ó+õ+u<ÖçyÍþ¹¸œÏñ€L­A~üÉþĸÓ¹‡Ÿˆÿ~¸d~?%ìøN?z,§ï ÃþdäÀûÿ$üò—þò?küǃý¿«Šû!Nô;Rü¤7~ø ¿ÒÓIÌÿ~¾?½©ýðëû?œ%õ¾ähƆ1x¸¤ÇÒ%2hŒ{vwGã Á}â "ìÐÆÝëÏÁçœê|iº­ÓÑŒv>Â4ªð>×$äÑUöp û—žzD ëÈ)fÑžtx|öú3ülJîG®•GåÀ”ÏÃÃPç!”–ËòÓ—/—\6“°ówž@tlºšš™¢ˆlÛý?ÿñ·—wkbf&à¿ýôå·÷{Ý€ €PU«êº®ˆøööÖX “BMÏED&wð €H¹äºé×÷oDüz}é}`„hã/ªjN|<1  W[Ý×-oµÆg{ÉåÝßïëº,…ˆÈLÁ8!hëc&H=h«G°LØ´ÍÕd“ª&P"UB¦N*%ÂÉɃ%E€M¶ˆ{KÕM6U·’’¡"2 R¢…/ˆv)%L¿ëzÿíÛ»C0»‰1‰5û‘š»*33¦U6fz¹,Uô~[Í€™J^È“™„O™°Š^/K­u½¯·”JÉ”s& ’ „S;J™¤Êºmè²,Å™EœœgB.—e)Kha#>´–®o……% 6‚0 ‘˜"¥8}Cë¼”Bp®ªÀ ®L Žê滓±Ý[¬G•csR»}xjÜõ8Ÿ›Ú Õø Z·¯ßÞ?n÷Z7˜U ÓTD˜YD>>>˜ør½¦œ ç”Ëk·ËqJ‰1vË£>r&fÎb® †9”†DuXÕ"ÍH˜S1kÉ·H3("Þn7pO)™YΉ®—åv_M$,„‘†IΩ`Ì*ÜL5¼;”9å¸i&òæ'bBò@ãX sœÈ\ÝÝØ(æ`í «j mŸÏáTéÞü_jªªž£Äùz½$¢*ê½Z!*™y‹à¸«u¹ÙÝT”Sº¼^\3–j£Åw Ý&ƒµsû|Ç~™z:ܹéQîÌ40UdÜm‘ w¾´‡e>‰š»…Ãmñ›s6 Rªª¸’Ø$/%7›uç27^Ó˜›&æ­Ö(™mzS3Œ´GÊÔxâHŒfTÊ""a¦ ÿ°—v0½ŠTp/e€mÛâ!$ªI%üçUDÍÖm ý1ê‚iz‹H(Ρ‘]JAbBðêÑÒìD¢–ÔZ#å\Pj575'nEÐ-ÌAëøœÏ]RS,K‰ó 81v5!)èØò´=¦ äj| FË(sB³”³©©êœ^vDû„Dœ‹HwÂò)QlnÚ @ª2棭éÑTÀ™SêÍ WAxêÇ¢¦ ³ÛŽœºÚF€í~]’¹&R A®™°5À'ì}/nKQ1j4ûbwo"q£ÚÑ"Ð±à„ØQjÛíÙÞCšQI¬j /wó†RHÛc®än*ÒŠHƒ÷1mXqvShO~!í\D ˆ›“© µ‘‰FÕ3X»j}ŽŒœf3£ƒ›©Z«éÆ6àQPlƒ‚^ÓDÜò[Ôùþ­1Ö~, la)÷(ˆ2•‰CKc뙘 ¢ˆ@3ŸOìa³ó.|řܸS3s78˜û´òmøáŒ5{HW<™ón±Þ0DdœyÓCMšúgýrÐ1¡=ÓGí+SèP—ÝE zF`Eà‡ÆøjÍïƒ&Ü3‡v3ïí;æ{×{ÅC ¼f/ç¾}9±r"ŒÒ'„ dÔZ2âZ€F¬'ôH˜Å<‰ÍÀÈá#a£0*5_†CgG,¨V3Û©'×ô.7ƒã^\¾.ûÇÜ'ïÖÞ:›RBÄ”s<e¥Î°H}>§¡Åó°ûöe'€ìx©…pÈyG Äœ2b]D<9É0æÍƒ†?gCãÚïÃ’ýdtkK<öHá\Gé ÷oà@D½)}òà7ÙÎ0Í78¤TG$Qw÷úÔ³kúó ØÉqOÁÄ…\>|6Ãéæwï==ášê“éYÕ‡iJ’>ߢáëŸØdƒæ:•1Ì¿`¤ÂŽÀ̪Þ¯dx1Ljf—±”„ƒÙo²Þ{yõÄV[·ySÿq/uh> x” wÊÌG¼™Åó¬þ÷Ûþ>¨ÎûG“7 2ö}õëÆÔp|nxð@¨÷½:ñùOt„Yüê1LÚçWƒƒs»ù”Qš ˆ'øl»œ>àÃÀ«ß‘2qBêøs!s®~ž@<ˆÔOaވǗq°ˆ>Ñmö"ˆ1 9i?N |y˜júÓqG|퉽©«Ël{¢à¬þ|ªMâùÿ|pÈÜñ ½Oj‘ÏÜ·ñ²}—­žë¢§úÍáËG‚ô1ñDƒÅ)h…~¬#8ÍBð|&=“°Ÿ¥F?`|d¬øwÕÿO.ïïOþ \üÞËz.ÿîxè §CŽEƒÁCèèé/:F3üõÿ¯ÕÎÿ·óÿ¼ýÿüQïù"<¬»N?ÍðàöŸk‚'^O'¾Æ}ƒthìyòÐ`8×aHäêHûZ­|`øÉN¬Ø@÷ÈxÖ{ºãdÒïïÊG߀·ÎÞÉXQz’CŠ\ÂÜÐrf­ò÷\“ŽÇQtï;@ë÷/ÄÁE||jáÃ,ÜOQŽÏÏðÄ9¥@›‹#njfj–RâD±I21f 7§ôíëo?¿¾zëçÏ)#Ñe)›Êr_ÌÔ |8&"¢r½¾DSepiÂÅÔÞ5ˆr¼c+KI î¶n‚ësÓ|K)ÍV#öK?`HD#$Žæ†„ëZÿã?ÿg­µ,ËeYJÊ_^_Dä~_™Ð¦ªb¦Ñ£È%çXÇ›Kê¶4÷ðR˜/™ /®Æ‰£-¶É—€LH\¨d&„÷Û}ÛÜŒ‰Á]ª\–òöúzÉ˦Ú*Õ«:*c2õEL3¥ÑTi®nV5c±j¦ëº^rŽVRÈ%—kÊb^·m«Bˆ/o/æˆÎ™¹9^J!$f,œÜýýãc­ÛK¹,%ÿrÿUDÌœ%7aŽ ïÀ%ÆY¿[T©w~ޝL9Å>°nèÈ)¥œb&÷}¦E¶n¦F9•œ{^D]¤{ß0õP¿™©J2“Ý"GꣿÔbb.›)árBJ‰™8g¾ÝÖ°Ò‡ˆÈ 7sSå”òÒÒ÷&ŠL‘} '¾ùÀ†,¥QÎ9¥4nU¡Ìª²Ýo×åR–뎴ªSƒ,€™é&ï÷{T§"_r~ }!§Â‰ÝÚ(:lõ)'7î@WQQÑàÝ›7›§ÓT²â™×€…ïùhÜCBÆÄĬ?‡ŽâtN‰ãÔZ5&%‰ÁŸÓ4Rsµfœ‹Îd¶I%$s—Zc‚ÿìrv+×QÖŠ j­R¸­¯ ,Þµ6N³¦yGN‡(q,ÂÜzè…šUˆcNÐÌ]µ¶=ÆS zíb²‚¹¹Æ ͼY=‘Ú„©9ÁħF;¤Ô`Yñ³ ´Õø6¤#µ‹…úkoÑmÙû«Í Œ|”~zb4ÝbÔÉŽçB˜ ¦šàìè æ; $8î‘àI)1§Ôãmˆ᧨^k?&8¸˜ÔÚU܈+ªŒ‘Mm3!²akÇÉÞbÝ€L¤ ¼÷•í@Ã;<5IŠ;bW†DœÒÔ•ë=‹L$$uuëÂhëlÇð€›;'nÜ6EÔ—ÐÔš±Æ}yÚ¾Zã!4òXG¸P°“ºl`AÙX–>.å>­9S}Ý!EßQðŽv½å¸B;˜fÍé“&íV½""F,“È‘žp •Ü‘0¥Üέ1eé~íCÆÿZ¢"Ì+ÄÔ·"½­|¶»šÅÚÃ͵٧›Ž<Œð³²_¡ê'Wþi0’Ô³'ÜŸ«8«Éƒ:56 *2©Ô:<öwä¶ï?‚[B¢‹¶c¸Ôv 6æ0[Lúσ;7|À1¼iŠuº™Fq?ñæPNËÀÏ“£`+çz-¨uPѾÕcLšvÌÝH.`¸VÆK¤q%?ZÈ{€lŒÂÇ9C§€ÿt³ #ÿ^æ<{áÁgr{»v£Øèà"8uÁCÙï4ßÚ§;sîaÏþö?oósˆª¶©Ç¥¯¾ÆÈÿhê"øúî,„ý•Ì=Ø£q`/báœWG`Ðäaï“OØ‹àgqö$ïbWã‰õ ”ÍšÁqÖÑ…¹'ºê(ÿÞIBîs1¬дGÕ¡O]öìÁ'ù8ó‡f¢ˆÊAËÀÓw÷yJâ8·&û™óø„xt$ð<*gˆˆ `2ìÉñé:øŒüÁ‘eš¾Ø&õvî ÁÉ¥û$vá¿ã?Néÿô 25ƒ4¹c ^ ~O¿Ÿ ×xx¿~þTadäb© >÷<1‡Ÿ¤ûS7Dvõ êIaKÛà‘þ5”;ð3WÃ?•Ø~Ì&î¿÷Gøð½ð¿hð¹ì§›Þs5ùûÃ?;ÊÿÅWþÃd}zâÁvøÑÆ‚¿Nýÿ?ØþÏÃn§PÀà6PSî²Ó?;þáØ+àà ‰]d‡ |F%ÌÞ<_t8®{ ª4"í7Y:ÂÞÚk§f{ÂVÂG'@÷fú¤i,hÄ3wz >>.—Ë@ìR¯´:+ÞQ·2%ql Á„1%‡AÈVA‡&ÃÌ:ÙÚÇ BF‘¤I“€`ÕÇB”·-ÐàD|-õIƒþÌÂñÓ;Dq¢Ç0R4ãqÏì±1é[p¿Ýú%Ý"×ë-¼ï»™‰ÈóTUÕì0óZ‹™Gíp¹—}ßi‰}%7¯ÕsN—‚Ü瘔…>ÓÕ=.ÎBÂ"¢*@òŽÖ‰ y­ÕÍöcgæ”ÀÖ¶naw&¢{Ùï·›™]ßÞã[ÔNCê÷Êq´úMjC'¡z5‡ §}ßk-""¢ÞmËY“Šdl ®Ô™!tmVÆaO@£¡mNÆàŽˆ$NqG©ÕWUšH‡ gˆ[»e!EH˜\ƒI{ÞœáÖf‰bzäªéU IDATd¾R¢6„æDdq©˜3(VĦfm¿3à­Ó‚bÝ‹®Î¦!TwG1—æ">MŽïŸör®ÕÌì½ã„lqtcŠ[NU[ D–¯°YåˆÜuP•"øofN$šz]'†(é‹‚I#²<˜Ú-ÌÛ…uB£´2†$“DŠÔ âŠO«YÛ”)…A°HµZ[GEWµ…µBðt±ÙBnq4ö”S ´!¸PÌ™˜½u¥VrÉLÆ¿xjà’5;Ǜզô½ccn@N*M³Ã‡Ì:í"¬yôÄzSI‚54ñZ™bË»¶¸–7Ó–8ð)O7Hôñ±ŠÉU™#·£ }ƒ C}ÞŠ§Æ_¢ÐëmбÈËÔrù¼H$ÊkÒ•©ÑMzÊb·þáh‡î)&Žf`Ä Bo`Ž&ã<šcÐue¬)©‚˜#¥4Œ@o¥>í3qGë…鏸{]*4âMÊ·qóÑ+Ã>¤¦È‘–Ò‡Ó05·9–A­Í»_´"ÝïÀ XÍf%ô¥Ã|‚-»£’éYÓ_í„þ‡œgðÚž¯,‹C»#æ29w—xæ‘àä€"ø4p€Óô=7Ï Š¹÷'×¹rr.#çÚñÇfz(¹=½×ú1~1õ³˜^uµÒK ›g˜~å,t๼üîÇW;š¹—àd† ²óƒÔØ¿¾ÅÌ8¿»3aÿ,ª.Í'y}"W1yÍæãµ †?¡Pþ¨ŽóÁ൴aÔ¸4ƒ…4ËW9Oˆ.©Ñ÷ËiñèøÌ‹qàÏ ¨ïèݯG+Oú3ÆNnœ´â1Vwvôÿ@ÄÄÙrZj©’!OÒXûa±æýñüV^å†ÃRæ?e+üÐÖù‹ñ<ݽÿ„hŽPtç?x‰ß{/òëÿ%Ùÿÿ ô~þ‹Ÿö÷†¸ÓŸFxþ¯óÑ­ŽtBù/+O;½´eå4UIùõ%éÏ«uz2 ?Ncs¹„Jj«ý‚{#¦9±F¸'‚wîÆƒëzuçáá¾÷Û mŽRÀÑêªÿ’~ˆ˜‘ÐÃú# «KŽ›¨=]|áøë@ùÌáÚ?tš¨[Ý®‰"| «ž=ÙÇ‹À‰8ñìW¦œÒïŸjÔÖ{bX'_oÛÅÝŽr|Þï×·m@TÍþùíâ‹Cj­pªÕA´m[JR½‚ܬ1¹ 0%拦Ëår½\XØÝïûq»ß9«xµÛ¾ož/› MÙñ lŽ|ˆhƒ{k‰dyõêÀvÙ¤,Ì|ßïDZùò¥Öº—#cÛR¾Ž2LÔOÖ#Ä`ÚD>ÑáµZdç³&3vG­Õˆ[O¥Uì÷»(«ˆU|ÞoI“WûõóS“þþ–es¸0 C„XH L`5%†YÕüžSº°Ç)ñóSo·»³§- «hþzûv»c&f}{ÛöZ±Óí~aÛçÍ«ÿòåKNIˆ’¦Z꯿ý–DUSqëû4?JùÍ¿ò'ÿúÛ¯D”4=ÜÝ·üæw»YÊJ:¥´3'¡¦¬·û~Ôãëׯ·ûýËÇOf¶wsÿøøø¿~ù[ÔîÏ“YJ­$ÐhójÎÄlfw¹‰C³*²$L=6Âz²ˆÌ  œX%¹:ó¨(h£òŒãÇårÕ¿ÿò3Ìïûñy»¥”~þéKЊ܉™«Uf.Å¢Ö"Q,@!gBU aƒ+‰»7ÈX“œyAX€(Eô8ŽoŸß¬Ö¼m)å½"œ{k+õ©ç¤JD×땘Ëq’%¥÷€\8±nΨ¸o"ŸÏp2‚"øõ´%E/I, i<Ë`‘³(»›YÝ­˜ë8ö8A(b˜©‘°{ð×"#ø5¢+µ²0 ÕànÌiUöcga5!ß>oǾÑß~ù¸¾]SJq´ëÓ^‰Ñb}d»ÍOP‹Ž¦fF·“ïòXãa9ÅŸ¢jÑ-pš¶S)ÅœØËáð0¨¬¹iˆU1®ÒZkJ:vÔ‘HVþetÁ¹ŠmÙqóÞ‘^5¥ZŠ™ÕZaH9]®—T›iîl‡ˆÆŒÒ KUåò¶?-$Ôx#G)Ä̹ãMÜI$ü³V‡Ü?!Þµ%WEEÝÝP$IÔH8fâí03[˜Ä¨†BÔÙ¶ës9JefÝ6P­¶’R%Á…Ü}€5Ìj3¥D׃zkйùÔG¢‡x‘Ϙ†<ᄾwiаƮ‰…?ˆÛ1ý³D‘O×àÜñâ™+#Ö+Õ¤ÀÃlym5¯m¾áäóŸÔev–1U Ìœ$ö4n$I“™9Ê줒Àˆ«<¥DõTãF¨fæ†ÒÞ~J±0`€€ÎÖÿ §bï}Á6&aå‘An|™žÅnŒƒµa(¢‚…Øô‡ MBozl¹]jÔ÷PäCÈkr45œÌ'J!§bQû;À8»vΆƒâçœÌ©Yƒï Å@¸VãHªÎ_ʤœÚ€WµèÙm®pÔ3„?=wµ,á‰Jj5ªí• µ/Ú°;œ›c¬=Zg¨ÿ½0Óœ.4΀%Ô°3 “aùï6PbÃ=µ^`„6èâ?É„}á&ÌüI_œeùíÐ>MgÊ1µhõœÙmó—1‘ï kr6–_=Ôð¥'s(qÌä6ðMâ³`˜ 3Û¾¬´8/ÃÎ̤]Êw™XbêâuˉÓ©KÌ)—7“ ™i)§%BÔ©Bxíÿšþ€±L„O]çGóBt?g"—ѬyüPÕŽ@LüÞžlÆèjKk›í%©CÌò$_æŸÛ¾]WˆQ‰1ιa Ìp0/oèìD äjÈÎq‘Þp "¥Ný§ñ¹ëT —ZY‘ ñGÆ~™în"à™¥^;xgH¢¡ÆH„ÖÞäÙ±èz87Ê®(L¹Y5ãñÝtð`x‘ƒ ªaÿÌ›iÑEÆæXŒÔËÂ,B?$¯Én‹ÂæqòŒ-†æð3¥¤f¨1—çQjåÌãˆ÷²lîW«QQY‚ÓÝl%|“æ†ë0—Ö‚G$M/Wµò9òOE H«´æÎ;5Ž/¼HÖòÔWpÌ(¨}œXÁä´N9œ•ñUgÅHm8YÍÓ 9ÿ´E=j:x#§è‹“¸¿àŠy¹U%Í1œÅËÛ{)sb•qÖQžpà 9áf=ÂYÕe>½ô€¨! òr±‚uLœ`éL¼”µ£¨U;‰D§úÚ³àKñú‘Ð0—i!7ñ«‹ù²O€÷gtÒtáÏ&Ìt1ÖnEðcáÆã…4Í/RæàgŒÕ0™×‹ú® 拤Šj8¿Où9üÅ` ?š6¯RôüÇMÁüýÜ<þ‚üF=düfÄŸ´H^}VýŸª'ýõ¦ß?3„ð¿ùçÏO'üÀ3xN’ó:0ÄýIE]„çg¨óU—©ÝsÙïüy2Ÿžü°úóiV D" THò³áž¸÷†¡sœ—Ú,t~¹2œH»sÏ£x²'Ãâp' ÑØ· y°kÛðÁÉ# >P°:Ë»’žÎ¡€RW—?$gó=V…Ñ¢äþ0±fûy™{=œóêßjï")‹ôàÌJ¤¦°·Hðq)¥ë%‹|ð?o·-å–{M) €Ûqç~äV–jVŽî9‡tË*µ8è]ß‚cÃÄ­´”ªÚr‚""äLòñ~ùÜ‹9ÀÂQͤƒZÛGì¹oîƒ"Ž’s©ìG-ûQˆÄZ½­}ûöIïï×w¤–qŠñfQÑ3@ÐêQJ)ªl¨fLQ"ƒ›™¥–¤²ib–$Œ-íGùüö­ZUM¢eÐß¾}Éû `kõ~Ñ ªP1wózÛë‡jˆ00V–”óæ^‹&B9‰#¹Yº¤‹" ,ˆº óQŽ K²Á½Z-¶ýömÛ¶÷ëfîª%¨ªr”bVáH)½¿¿ÿíçŸÍmßRL˜£Ôk\BL÷®$Þ÷]U+¿½s5«V·-_.›ˆº å ‡¹AIˆŒ™k53ëi6Àª ÊšÈánªâ‘Á@ÌYôp8Ü`D”%7ùÉ‘™$o dÉ[NîØ©¡»‚í€U'Òëå¢ïoyQ5gböeX+,Æ·û-©êåúu‘Ðê׉[ApNc¦õJ†¦d˜¤JªªºåLDû~2€ÏÏoÛ¶gˆà>JÉ)¥”6w˜@–çlj9 ƒ•jAeJÂ0'‘œ4´ r¥v ETäã8MàÊPmýî?JwA¥s@Ý H)¡Öqä 28{¤õ3—ZâÀ\£š›†/%Ma¤®V³û¾·]b˜ "oïoQ*Ût#.Ññ§Dˆógˆ-£½Q1«ZÙ®8íµ@ŸÏˆT%øãr ™Y‰öKcpҜ•^:@”R-Ê•/[Ž_Sk»¸Z5÷L)²¤1ÊßK¤”«rJ*ÂǾ»KTAl[õèírÅFÕ£Ì<À5^k LM=l»fIªÛ¶5h s|ïû½(³°¤>—\*>J¹ˆæôC›è¯5îŽjÕÌ£ùVS’AàI½2ÀQŽÀ騊U ¢®ö„éˆgšC„­ZÜ˺DG[ÑøÕ@JÊ¢ Rá h9\„#ÌMKˆ¯kÊ‹â ÖàJ"ë%yÜXg!DܾÅsÓ!yn“x©»äZÐÀ)=—β˜0é(j"¢¨I‰:’­aÃŒ¢ˆ96Î͘ÉM£Ð-OôO8ÏeëóŽÎõ€€´Îemœ“˜mìmÔ˜õ·ìÕÑz‰7¶Rcµ²€)gca‘ÞðÌ ‚&Ì‘Qá„Û=‰€ÑiA­J¡%ˆK1 ^.—Pîú$ž÷âI¶K}†îþ 9µ v1s¸uHOÈ–ÔÉ+B£ðÁz7òºwfa%Q¸‡›²~x3#Ȫý ¹ÑP»nÛfd C£‹óµôŒ¶I[TM:eÒÁÚ¦ÖÊcom°ÒŠÎ™Zc$Å<,„Ä9§bÕÇ\kĹ9ÔôÊUÆm6•†mi -1æ Çì_w+ôdDkz£FD çäKU) ÅDE¿Sæ!£Áí›2Ø¡ÒÞúémĤùè6½{¤†ibZæ'îC†hFAÓ1‰ˆ¬×U»çˆE‰[%|C²´ÓlÜ$kS=$Vß¹·)™Ñø<“à<ð¤c¡“Qæ ,ÐKº;/¤S(œÇÍ'Ùúûâ'¾/€òSŠô‹Å7§@`òîê0.G^ç:€ùG”úuÁò5¬¥Ç«æñèD˵¶—W‡Y %‹×CÃf:YìtÆ,=Œ»œk »ŸG² Ç®âÕfyFcáäpœÕdùîEðgÔÿ×ÃøÎ¿þ‡î+ûjþJàž€rúGGþ¢týªÿónþW(õüÇßÊý<ÿ#þEg÷˜Èå“èÿò-"þÙÿ[ÜŽ šzø¨k“ãÀŒå‡žøWÓÆ9Ò³ûbÂ’¥O¬ú>ˆ…buAðµ%ÌXàD úï•¥.ÅÉnt1õ\Áó a$Ðæ z‘à© @ºúӨĉCÛ®âµ}e 2¡5Q¥e¨õ¼®ð¹Âg<‡¹À'Ý¿ÿ J¡Y› 68 Ê)‰(Á÷Rîû=YDAZ[ÄpD$çt”²—Æ´d±»×Rêqıæ×¾ßoÌÂïo°ˆ×b?Žß¿þÇʬ© |œ$Y5»^¶}“’›Ý=æÄ“ 3ÜçÁ²Lq·”‡q“SRÕkºzöƒŠ9å”Þ¶Ëý¸ÿþë¯â Ì]K-µh¯ëðß%ø¾ßÝ*ó%TUX1 À¼’3{ÞT¡Ž]T>®_¶í¢ª10q•ˆDU™>â;);ò¶EN´—O="ü¢ÕÑa½ZÊgÓ¡bHF…A¨'I*9gfq«òåÍÜ¿}Þs6b7¤¤+µÔjªI…™Z”ˆHÃÌYSÖ\Í¿þþîf¶mG§n×7CÔ.¥ìû~ß÷ý~Ï—-%½n¦cKéï¿üôq½’Óÿ÷ÿþö~M¢ÖE’Ø 6˜’HJ³Q$¤ ˜iJ ÁJYaç3®°²Ï˜÷dÔUnIËQˆ(焨¯VU¯öû×o*¶qFa‘RjèÑ—ms4ª¶-3l1[ÔxýܧR"/œ5(ê400ë \U?Þßó–¶œ†Š]k-ª[Îã€ÇÌ[Î×ëµS)PŽÝ̤ÉwÙ'`|fqRŽ$2 Okæž„E¸£«Zª,åi¡(¾]/G)Õ£xBOš’êåÒpLh†K­vÙ²ˆÞ÷{þûÕ’CŠfÝx5Q*DÝÌjEÏßn7>ÞßsÎpÀ\T"LÚðÞÑÐáΓä"clÊRPã9w)ˆfô2¬x®pD¾™-šôOMnt3gaŸArJ1ŸÂ’¶”’Ž xÅRËQ"zÝã­ô˜H5唥‹ò"‘ _ "* 7ëÃî­·0çty¿¤¤:×´¹÷W¸—ZîŸÇØe‡çäMšOD”TSÊì½ÖàŸô1³êNf©V³ç¡›´hs{øI|ß8(Çq¹^g§KR‘[u·ZÝÌb=iéQUYâx­ÓoݶŸÊá&ÐDõ8ªéÒÊ ý×ZÜ=izyŒïÉÐfá0V‡@j-¥6ã³³•Ô½ ¥«ç3”º±i$Y˜œ&ˆÜ**w7ÜÖ*‚"L¹o¢s¸_Ï ¯1±vJEàÓ4%éÉ¡Dwf ˆ¶Ó>ïQm´ôhs^Uµ±º£¢ü jŒ…{hg×Áàr@ûR=Ѩ2®Š0Zºvç3ˆº`d[·÷w23Ì,¥„ ÂIÃA÷!Hµ%ñAáEzu/¥:\D›¡Ø³î ‚f4]Çm…!ÄPÉÅÀkp›óÀ:ŒØQ¯VQÛgt3sÄg1›÷´CjûLjÍé}ŒÛ$¼›>?°l`ZÙ&¨U3i( -ï峛놓êA•6Èų5l!­€)TØXcײ\n ~"jpWUjv×hý|¿?äÓy”À´æ‹B§$H?8fUÐ2×Òô]kïþA1ÆL8£´¥‹zco=bCK(ª×Ü4H:/| 8X¢¢Î7¬¾q‰({[Üâ‚å^ùá->Ÿ˜Ã žpï0 ÎcOcÇk'­©e±ç8ÎYHëñ@(6ö棺|”– -ˆ`F"¶4à-’ƒ“©0 ›QB»ˆn3hij” ñsÝ­»½_¤5Ú—1Õó¡úáù†‡+RÇÙ·ÚyG5«¥ñÍ܉ÀÎ)R)mVÛAiô1,[±s¼o8@D*ÊÂðذpo Ó{\OÁÁIky¬¾>.oã»7« Ô‰ñÙ /´¬$²ö,““ÔÞä¥1ã5Ö^^ÈEÝ)²ñ¥9gL¸Ï[<¨ÿ«Î»îÄÌ'7ð ë5€èx|ô¹Ï±û§y×OºË l褪/u!Ë+|‘Ü !Ö|â">ô}Ι¥ ":æñþ3Ô`<ÖÜ2Ÿ”q>·Ì/X¥ÉÐ}YIOÚ ÍúkšÜ¤s¼WÕq~çkèqxæÖ²è·müpÍxØg³÷5—=‚Nþz°~V'‰ ¼ m…ügûуymðyÂbÙ…N~Nÿœ9zXë¢yù=!{Níœü ô/tþ>šå©ÎøÜÑv&XŠÆÓlýÆñP1¯M0x4¤O$Ÿò¥ü¤cº(üdÛ<~‘«QíxÃ_ɤü]|Ó:åóñô¿¤þŸ¾‘uŸïðô¿çÆñŸKîÿ ÿÁÿþO¨ÿÿ)8_ÍËôðšü?/õÿO¼Wþ?¡à;ô^|å§¼<|yaóLvhûë$\Ó›ñ?ò,ãÇðZ´1B?‘‘œ?è›5x ÷ydŽÆãë„è ‚óx Ø.ëmOc2×í:zÑ/ &‚Ä«šŸ–¼š/ñ\•‡îv\Y;÷gŠ•?^ÀÜ^ŒÜˆ±¬Òÿèd®¦£·Û­æ:ÎíÊ※ qÞ’’ó¾ï÷èï¢ ‘vþx5 IÀ@|ù/(µòýNDå(—Ë¥¯óîfîØï{M¯—KÓS……äûí~y»+â‰ù8J­µ¸yÞòÉ)ìp]¦©×#tø°¶œ%¿m[5#¸dÖ·íz»}ûõ÷ß~ÿü¼¾]¯×kÊ©…A[J‘T=m¿cWµ”RÎéíú …ÈJ=J­ ¨Á¤²é¦G9ÒûGNÀUäªHZúzûú~}öm¤.+Sñˆ†Çíó¦)©æµ$D¨æØ‹Y-—-U2(§ÖõGD´mÛår1óZß÷;}¼½‰Êß~úRÌ?ï;¨ÔbŽT°Öj·ûþÿüû¿ýýç_’ÊõúVkñãsvÐQ&á$Ê¢å8jGPÉ8mênG©¥”À"¿áòûç'µú·1圎„hÊcV^É&Êä½(Uƒ ÄÂÌÒ~”‚““»·JÙž/“Æ.¥‡ƒqPn}³bÊÙÝo÷=©~Þn÷û}Û¶-gy»^EÅY[#±ô¬–wY/]rJ#z'’ã8âP“Rïn$ãšsÀÂ,*ôööv‡™íÀ~¿wpüíç_þöå'w÷ìnµ–Cºn·ê. ‰œšˆ³$혅–D ;TAʆ[l¹3§˜îP$Ø”p ª#B>Þ>²JrxDUd/E\ª›Ã"$øy»ß÷ðˆ±w®ÄèOèeŽŽEfŽ©›˜ˆ3äqŸŸŸ?ÿüÓår1«µVâ,JíÃg&‹û`â~RÇW¯1HÄòAËþöã0wiiÎÚ7þs‹3‹Œø››ˆªjê)SÍ)çÔ>´8G™;|/µEErÎÒ(3ï))àÇÑ("c¢ùC šKuGJi»²ˆ‹·vßV`ލ77wIä•Ò–"ÑÜZE™%é,(N)1DGûÜ€Ô}©í2ÔŠQÿs!Ž¥DçÁò,‚¡ÓŒSj†bs=5­ ˆ0Á±ªÃlX4‚&=›[-ES Žüˆ93*”ÀEt•A#JÙ’ï½,:zj±Æ ‹‡eJ)ZÃÊwGÎb6å¶°yDZ«ç(\Ž§Ž´ØæàNÈ8ÊÁfµ5—ô"A?š< „ÑÇ¥•Y'˜ÏÉe± Ûრ“ŠsJ‰„è@ÇPDhYU4éøY ÄG-ÕÚ«|'jÉ׺C˜œ™umÊáèû±Ö ã9æ8..Y4—¡à”REÃ0jS>¾D’—¼°»“/Ý–±ˆÍRÌ ·k#n‡”¤•æAÔz'pÔ;GÉDÏþrû„©e3Bék×(Ê6¨¯ã8Ÿj |;ÂiæžÃ>É@à®™y“6 °j K€«uŸ&ÕԘ̓èpWZ›;qíÝ „È{oÒ"i˜¨_hN0únV‚lI¹¤,¹Ñ9›q4ïÞ¥1Øþ3@+ÜáãÀ©±±M¼+¯ÜYÒÜç-0ÈhˆZÖ™‰Y¯‰ZFØkà”Ã7í–OçeÉ9½8ÒøÈÀ¡UÔ÷î—ÞÖÍç¨÷ˆ!H_¤ümgÒ€çy¿OFùpGŽ6™$ ‘4½O?§=G+ï©è4mnžÁ.â@ Î eæÑ´Ö$9a&?+µQk4"öa‡Œ¤Qþ;Îü+¦sΑɕ&ATã¾Í%Kžw‘ËG'¹3'MÑ~_o˜ØÕÌk»s5§,­xF5­ÓkÁ;tW–µ/ÅNãSïÊ3^ñN§otoˆ¼G‘¢C(œIw˜W"ªµÆ§ƒt8×c±J9Wì6K)ÁÍõ ÃX’søn^ýcüÑl5zK ' ®ééÃ˃Q§òÀ°|f&ãTÑ×Xdzg€´Óèl€xPÞxy›üÈÀ¥"£ºyÖûN}‘‡ó{ ãòY>n×' ¢á±KŒIØ IDAT'r½ôz>…±‡œ` §AüöÐ~ÿ¢%ãí0<³å­žq*$èc¯ä3ž"ÒZ(0ÙGm åö1ÎN—?x®FxT.Û#ŽqRå gá¡;ñ$•½Š²/õ§æ~JóÚû}N8,îÛj_ò¨‡hݶxò{ø|Éàéú9U<ë۳퟇*ÚÃÊg|ÌÎð“`Ž“7ƒÅæ3N O6Ѹ:¿£‰/;jÓçùŠªs&µçkú)kÿרï‹çÅç¼ÿãÏá¿¢¥ÿ ÕöÏ“þÈàï[ÿ²;ÿSê?VvüUÒÿ÷ã_ÿí¾.Ÿ(?,tgÀ'ŸýPž*ûëÂ3;5ÿ‚žQø£B Ý’ÒÈþ땞§KYfh g|ªãrŒ ååñÍ„ÎØÌ>OÜañ¹'ÛœDÚ0m÷óø‰˜šŠJ ¥$Iâ£1??oß¾å-³ˆJúüüÜâDM¨µ¶”®»9,Ö‰¤W"‡qÔ¢ ÃI ?X„u6rÁ\œªS̘ÇÐxkã/²!Eñ/ ¢Itì¨Íì(eß®…!Ü;¨’»G7¦ª‚|iAàjA·Ô#î)¥ˆ‰Ýn·Ûç­Ô’¶üñå'UÁÑr,¥FÞÕ¦I àîX\U‚jÅÂI•… .š4ikò¤Ñ›*çÞVÿÔž†Ö‡EÓ*’zL’zMˆ*3Â¥”Ð+k)q9Eü?hq¤)¥x£[X;c·ƒ½õòFŽ ÁE5,î ~Ä·òg§ã(jÉyã{‹‰ª&ê½£1„D“Pd]ûf7Ó”rÞrÎ›Ï Ç1àN­áÌQ®7jDOÏzgÖ‹æÈN‹ÃX$ç-ú-J ^V;H™úo\K»µ'ñsʵ€ZéK×ßÑ©øl©—.ö@³ ¢¨"èv”GRÎ)¯ëC|h=çî—c&M­ÿœ™ƒ¢‚ŠæXD{ã·—×ófqA™UiMF‹Õämâ¯ô·ïí~–º·õšÇôµq€†¶Õ?†êéb1¢‰éÞ¡-½èwFx…ã†ÕåºayH5‰E½[úâÏÌÂÎÂd4‹<»L9gõàèQStÞKKT¢w½}w 6jÔuÖjÌÞ7`Ö!e4¢ËXMzàf)‡rå§äKC†&eÕZïû~z,O¶çÙãçµWCˆ¦í•ªJL'#&®ý1Ôö¾Þ¿¿Á6ìâYÿ‘ u—Ac $ì4 ÜâPÈ0˜àîæ±‚·›ð…³n™ˆ$â{#ð%¢A¿Œ9wB‡wñ¬'°¹Wt51H«€HÓl[ ¸h–}­@ð!,¾P[óyì›ïaL,¯‰„¦ð) :ÿ~„™‡xß]ðC„&—äb?‡„…–Rn]¢AÜ‚f«÷.8Æ;:G§Q €:†cDµéÑk³a‡±ô C+óX@¢XT~€jiòˆ›Ö>¸©Ôäöõõ'/;"ñSénƒÚDì#{î ØØ¦©ÆÏ ÷fŽÁ½rëqZ!lÈ`ÄÍjŒÐØÂÙxÃ<ÔùAKŒÇÛÿ>`aK‹ª¨¨¦@böÂzø^f5[˶†Õëê0µ¨ëæË¿(²FÔ×^àubµC¢|QÉfšc}%¢²šôñ²ƒ³?hœsxÌKÿAêò¦€ø#ËLÁºóᥚu™K{®€Òp£>&}ž$ç‡Ïh(—X“ãËËzj3f$V½c•‘aùÃmÀbu¡ƒ!ÓÇjæÔ2|ú/<ê¤sH`q¦úôïó¸Þwã¾Ü¿k8)|za²ÊQñhá'ÏË>09KGÆù~á³ÊÏDgæ;ªðøÏž~ø•}êe©Ø8«ÿJáÅwÞ×Ó7ðxñ«áÅ•÷}'à³ÿxr!ø„lüe¡ùÈÁ㹤ôuÌ™ô!ð® ?/´ÿ7æþùÏü'âÿ¼®P]ˆY®U~Z<ú£I²Œ‰—ºàñ¬šëq—žùÁŸîô,)ŸðœÇ{2^ÙAñS½–QçꌌÝi™%¬¦Å(ŒëïÑÁÚáEh³Ü1ÇbÇÍ™¯m ³‰ˆCQ'0dAÎõ¿8Û!/¾¸ñ¿SãµØôX«ÕùÕÅÁô¸“!"¤-o3ªµŒa^¶­¿«nõ€\ËLfõóvÓ”®VïÇaµÆY¹£¥a¥zµ»jV"XH–€U‡#eÓ©±ΚÇBȢ‡WJ©Ô*L¥Vbq÷ã8èBYsˆ€|ºŽÛ™N$‘³Ë¬ÖJ'WÒ$¢B9éeÛˆ¨ÀD˜¼…(a–r¾^r5ks·ì™ùªéîPÕZÊ^£–mÛ®’EÈÍ6³¼]CZ,Å-/_ O’TÕÜ„D™=”8î"K9àµQQR&*^…µ–ºG–tÙˆK-ûm?î{­–¶´ KÊÊ)‰\4BÐ¥T@£QÓHE/Û–Ä’Ju…òE´ª¥$‘ä^Ü!NA9gMù¨V÷ãšêvÙ’&Ê|½^J)ð!%¡œ™¹;ŠYæ\½^ò5½i-¥–BYBÍ)¥œYøÛçíóóFDªIS&@SäÇQÇeÛ>¾¼5ýQ$;{´Õ<¸ê™Ù™:ê´´u ¢ Ö>ãâäCiŠQJé8Ž˜\ Ëݯ×k8Lk/3›Y_Ó0¢îƒåêD*[ÚJ݃X–DÞß®#9LšAx q6¾ßïnæð÷÷wU-Çðî®GßnŸßþý?þ=iRÕ¤0ôp×D"J$,ÕšVãÄæ†™Qk¯#ò¾­!•œANˆÊÙx‘ó fìȤ0 ÄãH_½-jÁcéDûÆàfEýr½Õ"ÆN$š¤Ô*,)i?O°Zÿå(µÑO_®Ûfn[ÎÞ:Z=Çãä‚EC%wš­ §”ãhi¾0z§e?sÿ£ïœEÅáIÔÏ=ŠÌEÇQ<έ×7ü©1qOÒSU ÐJ«ˆˆ1™û¾ªïð6]µÉ÷ÞÂÇ"žsŽŸÄ3‚ &vÐtµÐ,“Æïò« 9f9QGÌSà–GaÿÃÌœsGwU•^ô*±™Ç1šÀ`wsUô›‹;ðZ8åK¶ZM=§(­m9ÓPý¼ Ò•EÏ¡$wä4ä o1ª®u ,Ï í(Ÿ@¥ÖàŸ˜Y©UDº·Ç€¦)šLžÏºuêÎõbê«A´­ø±—÷ÌLµÚ³"^oVjÊySO– ͬz울ê«vÕ5ÒÙL>,ÂrRfö¸ÂE’&"6÷.¨5#¥QèÙY5fåáMtÇ”LL0D®å@ÍKÙ¡»h…àµO\…b3MÍwé€íÏ}UuöC_FŽ+Ìp:ž£vÒZqÈd1-l1mKâÜ+fA 4%Ô[-Aoê&Q¨l!és»—9‚Â]í"ŸPŽ&ZÎm“p_ÖfÂÒÜ–ƒ»¶(ã~Œ½Šr ÑdpBâÛç†à)†vïÍÈ’hÒÖžÂbµ6¹"f¬‚Ù)-È1k*¹L½H#+Òš§¿˜8ᎊø}—PXÂm0¼|F8XÒr'OcI‡Ç…na“·?ñVS:ÀÈGSÿZ§4ñdš³5#±êЬ½ÜýÚX€CŒYb/.unç©ÊbÜÌS<„‡[e‰"2ÃÐwôP,·ÓÓò_'"MI{Ó¬n&Ý‘m¹œ™ í#‰mRa…dv¼X+ºbŒ¤SS–[è|Ì3¾Nîª.uǽ¯o‹$&n0±“L¿äšú§_K醴ô]òºýQ ð>˜Ï87—baÅLòO<Ô‰j”'æópñÝ 3·‰œø-áªøIù^âDcî†E@cGWûs¿ÙvèÜ¢ÖB¿ZÚËLÇpihоNÌŸq¯`Åé¬gÀ§ªgžš{»ñ£(º—dÃÀ‚jAžÿnËÀõÑé^ÝRE<7É#‘Ö-é[3¬ÁS9&H=ä'¥‚Ãy”̲Ë}û×EŒ)ì[EœBÂq>ï×?Äæ—<;OôL÷ì;<™ÏBt»AOŠñˆèD,œâÿK§”0ÏL<sK,£m÷d¤/¿ù…4wrf<ð±*“àS¬ü©—àÁ[èê A>þõ‰ŸÇ „ÀY¦°üñB:=ÇÒÏL±ï‘ÖqzÅË_ø%]ab‰þÔ?{@;«×tf‰tœAbI=èG× ÷ âä<óÚi¿^%ç·zÆû?èü‹¬„×®^)Ûç¾N lð€»yº5‰VÙü¿£¯”l:ãËNîNïÓò|JäÇMJëôäzÉ>¢«žgE¾+ óy–óûÿŸäþO›ÇèùçùϪûüýÐþ?öÛΗ¿úøðÊÍùoŠÙÿ—Çÿù}ü½Kãÿ_Îv‹ñ̳` @ô`OÛþäØ=ÙHˆ~õ'—9Yõq4€3„¤Í/£oBí/è&ëƒÎ¤¢6à wV¯ËÀAÜ^ò\±Ò¼âDë¡Ùò<£0g<µøìñ±ö÷è§GHŸqîˆã±«áÇ??«Œúàßõ¯ÛrÝ+RÎI)êãB 1+Ô%u%•VÊ—F ¤H”ûþ!”鳦£ž«Å~› ÂòardÕ·Ë•ˆn÷ûív3Ûú_XA±¸%_8»íÚ4Uªpr3_FU`35Z'K8‡›\¤LX¸q9e/E ëÖÇÝZ"d79ËܽzÝ˰¯?ç«0+kÊZoÑñ(ý¨0«V@Û¶ñý¾³JÞ²0ƒÙà*§¬ù~T¢’T¶tIª¥š™‰Jι‡Wl›šÚ}¿ÿúùõ'zWÑ@\³fNI²f’hÅ£ê+¦`#WÖ-+ƒŠ¹D¹¢zµ( F ø K)åò¶)'Àa†]®o±?ËY­ÖÛ±kJÂ’˜é²åû^"¹ 夗TSMI¿ÝîµV.õ¨…B`M ÆÛû5.ÛMÓûÛU4m9¿]ÞAT­0±EÕž¹»ßö»ªHš„ÎKN€Ûp ±dM,BŒh—‰ç²Ã˜$Ug¤,†i›8&e™Î„L‘A¨Ç#éYˆU§Ó¥²­p°ž*—CÓìLh­ƒ*Óº‘»<×h*ÂëúìkºkUÍU‘“%mèz´G.¿eF ½Û Ì£*A©´xn=ït"0Ïœ«µÉرØÑjN´dyÈ82E|ââJ_¿˜cÀ¢Í»Ä³|P¿™8%÷಴pnÒF4_»+ATc”'†YÚ®0­kjßñe¥¶“ aE›gcDÍu–ëé¿9 çLdÀsdv¨öëae"`iã 9„×.Nè™~ËöŽß&òaÊD]‘…âÞ"@C/o:okºÿ|vtÛ¬ýÍÃÎ>.½žPsGÌ´ÿ;+FdŒÅ´‡ˆ*é lüBŽçD’jÞ¶x´`~Œ} Ž{¶ íÈ#IJÌ›PÿSâ¨q²Ñ(б-ÝŠð&Žú4º*׊þ°ˆ=?ól`ŽVœü‡:™=ž#¥Öîc9GFšNœ±6RÏ)˜¹Ól¦íÓ(ã[bôDøXÖBFË#¤ÿxE}ÀÜ×§ úî‘ú|3zËî*¤ö%ÈÃChÉ~"v$íŽþ!êÛ•³æÖž¥˜´3{Î*0³°Ò褙|7ãµ5×-¦¦ttP‚µ' &Ì—™"^¿ÏæXB|V°&=ƒƒ4'ø,§7§ 3÷h"ƒúYY:å¯q¹x6ٹυcØ…Ä aó €ŸÒõXàô4„©D§Gë)ê?_øY ê>ÿÉ,8¹nX…ÚSñ=|•Oq¢–=Í.Ç^’W왊óýDïäõ=«ŒC7Yežå2Oê`³4°v®zyc´=äÞìÓk?» Ûç!G9×æÇ øÂÂ?À)^0G~Èþ9ƒ1øqŒæ»±ägGýÇú2ÐtîŒìC„Pße¸3=ë×éf<)q'Å'VÙwµHžùòÓˆ ?ÆyftäUQïÃ[ÁkñùG†Ìê¾’hyªÿ-­46Î8ù.ë¿õºÇùG2ðBUú¡XËO1øuúçá6æ×-/[?ðégåãG™ÿFÅ¥zÖ§‰NÙƒ5úŸNáÿ¯lø¿Ô§\ùScøÌãÏ'߃ϰºàÜžÔäìÖ˜8Ð>Xœ~ܬW"F?Ÿg^HÎOøuIÖ'-v4@@«N DÛÊΨ³M¹O?;(@sŒÛjÍì¼® MRŒ’ëL4¬C4 ƒ5»©°ÖH˪Ï.g–Á-~˜‰yŒKŒëý°Íg…ÿ»WÉü¡ÉÇ„&·Šeô\%s|€ÆÊ½é«Ž8Gp?¸Ÿ9cçfÕ†§ªÒ|€E5§¸ØTÊ/f{ýºßþþ?þN Û¾_/—ëv1;Çåš³&=ÌTÍ®oof¶ÿv'@X>??·|II &"MM!'X­G)G)ßwy{Ë9 ‹»W‡Þ„¸ÃX°—cßw&°°BŽã8Ž}Û¶œ)[V1s·ªªïÛUÀ·c/ÕrJG-QSÒœèŽã( \¶,rÒ‚ ¨æÁ¾¬TcÞœŒ8 ku߈’H !V媗÷÷ÏÏOÞ/[Öœs’¬}Ú…Á!Üs53T¯¨J â̵š°ÄvhvVŽ8¸¤”HŘG­jcŽƒ·”öã0·-_>¾äz”(%L’"’²jGÉk‰Vd–û¾ïGÙ8‡,ì)'VMs¶ZÃд½ë–·D «Š§‹9Ü}#f攳ªÀüvÜ+ܽÆ18±z³jŽ Ç· zu‡&J"Ä,n>“YÓ–³ÕZN^Íó$’ªlÛVkmn4F`X‚÷=ýOf3'DåcWzyæ¾ï¥”oÛv¿ßU%åtÙò¾Câ$â¦2«ÆÈt?H™3ª'fI)I›™ ±ª¾ïoѯ ×03DØÁ¢ VPø`)†å[ÖÉ™¡0u&2Q„ì‚ÎÑNiÂBŒFìáEÀĂƪã@s-51Q1 /0_s4쥺cËšs ±8MpJ¿v[{(µ:<ÇP–/—K”Kÿ~û<Ð@Q3‘sƒ0¸N_Es€õ¨¡ªDDœÆ#ƒ_k1ª°Æî=íœð{ЗQ…7µ£®yâñý¶ÔV˜ƒÿ3äDóRÍ¢0ÒÁ+"R{µé*hG÷l)ÕÝ:žb"6D„…’$€¢Tyäš@ÞÚ/¤µžR/ï™O{æaQôt61E“põ”†B€”0"âhÙD—ëõãýã¾ïÌ’ú`D|,)¥÷Ëår½ûþÛï¿ÕR.—‹´&Z]Q? Fpþ}¤+ÝÁ,[æ}?Ìêu»ô¤˜Ó"‡œæð¨¤Ê" Ì!lýøe¢)h?fUDSw\ Âfá)»Ä&ìƒçŽe~(`.ðûí­¹·Ï¥ö9†œˆ êIÇF#ZÉ)wûÞÑë]üd• @о-óˆ4UI"¤MN”èØ EO•[½• ÷[[îFím+7nµ¬˜Áü&ˆ·”Fêd΄²Íh>jßô˜NëÑ43«V­Vëm(ëŽP4Ú"RRM¹ò„¹2-–eÀEE¦LA“^K2šÁ[ÛænpgÍÇ\Õt#ÜkëêDŽ7™†.MNØ8ý!"Ž×™TSJ=1ÓŠ(¾f¡è#(̪–çlH¤Ž›Á”þÑI±ó”ìYDRÊqG¢fŒ. æø"RkTãHmÅQá6µÑ¾5æø@zyEÛ0°¾÷ô̤qõ»zi Ï úˆ„‡+Dý nLü*ºÂ4¡0£l oàtâèB­O«{ÀËÞ›;ª«2Ô;zðfÖGD\Ø ¢ý f›Â $ÅQþZm§£+kcv"†ðF¢šqžd Y?>°êF€¨&í½î´PY†î—Æú¡¶ê‡ÐŠFùkÙDu_Ðføhéçð>znqŸhro{:OxÕh‘‰¥££]DxkÓÆq16µ‹Zì½ð#4néo,)ë„´ôÃã¥ÁÉû ÅŒT Ì@èp´ùF€«¶>’†Bßh÷W;D´v©ùÙò"×ÎRŽ³Þ¸…:²Üêè Ã[¦=U7ã#¥ì%Ng‘¶hÛsõƒé´º2Ãç•9 ”¨ýáœ3‚DŠÉ–¢Ù¶·Væ.žN“ñ2bvo1çÄÐR‚ t¿sffv٧ظˆÎK« &ˆˆh°ùÎ=~aŒÍ׌WÌ›ØYPÛ¨OÀPðñäKðƒäµ&§±B‚Æ7õÀ¡â–½æõAö´€ž˜LgêÈèiõ%}ùÄ:zºúV”ðC~\NiÄ“=ðŒâÇ öIÐ=q™&P©_˜œ'6))+1‡¾ÂÅ:T5Zå8²Éšf ë 0Ä 7N¨›¥ws×ëõ’-GEmJ©ÖÒ\@æÐ¤DD%¢6C5·X#U„!`søqå(ÌœrróÛí6g—ËöóÏ?;Pjq€¶­µÝ2QµRJa ´ÎQÝ=ç‹Uü„Z«ªš=²™%IšRt•Ç a¯T·m̬ î«ôBƾï¨H Óˆû ¼‹HÞ23¢CÅÝúTÃÂP㉫ÙdàpOêiÒmË¥ÔRj{rj‘÷·÷ÛýæŽà_µ©“ÆXàjfVTµíNÌ@#† «F³ºsÉÍBÒn—åøÔ#ú„#ΟR­¼¢)¦Ã"ÿV͸;ýÞèè÷ûíÿý·ûöûçõºÅZ=À!ÕZ î¢:ÁîñÂÐiã¥*š̪ym&yoÕÔ6'ae 54As×nì¹!t³ª n 1‘ªDùŠ=¦¿MíîÔzÚq€Ê^J§¡¦œ–,ž_gÊD%>¥#+›6^(‘Ÿ‚Qz¾ðÿùÕ“;e•I“'RfoÁsjÅçãÜúŒa[ Ù[™@Æl&7»lW§Æ…áÑÒr·Ö耵ÈG¿n$æ™G-û¾÷9•î¯\T$†mRNm„HDK9âJ£mêlÕs3‚÷Ðvy,Ñò•àÎD’RT X«?+c…liˆ!w‡0¹ƒ…ˆ÷#nF–VNè³f|æ$Âf˜9D^˜9ƒ€Ù#‰‹0ÕËFek :¶:î‡@Qåæâª‘Ìí¤tì>lxD¬L¬¢šUãvˆìm%éeºMvZ$Àñ¢Fåk}F‰1x õo32ø£uyN~@b» Ç5Ü‹%O=H´ êÔn";VÎp ä*‹&…;µãÑÐ>´ñMt…ÉÚA@Îz˜pëlX4Ì2êQ‹;ôIaÌI s¬ŸÝY>ävh|ª–¼63«ÕûÌSœÚMÿõáòÈlÜeU¹\.KÀ}Dmh ‰Óx~1Kì⻑”süStàJ‘(æéN¸>£â&îâØÐ‰Ä¤”Óq8NIOô}G@¡íôˆ=¼ÈǸ,Ï[~´Æ ‡@Z#îRü6ZÑ;zœù¬_ÐpýJ§RØ”móësp8åÓUZ`§#ñø²Z+·cT  É¢¹Ó˜ˆRÕØ<ôÉŒeü‚yôãŽJ–Ùørnt­ñRclä?Å"c‡0&©Ö¹®aÿŒ‡~ïŸhWŸLYw|¡á  ÊÓy\ÕN6IW NÓ„XÂ|·Ït¢ñ³çA|ô®!ö1î…Ç´ù ÿà{ú$Ÿ±òô ¥™Ãx-¼¹âaîÏJá#:b¹ÙOÄ‚õ%ñ“b½@…†â€±¹ÿ˜Çåd¾S9O ´˜$ÕX5Áàç†d<ýu)Sâi£áñϵ•üç ïÆÌ Ÿ_L ïåííÝÜ›ã¾m› ˱Døå—_4% "jCýˆ¼µçù–óûõ-§t”bníØò‘“·d"UEñXõSJ±3%–jîÇîÎ)ew0¥¤"œÚPÌ~ßÜËî_‘SþöùÙ{#^]”Õ¬:HEF`œH4e—z˜yýz«nª^ý€YÝ­˜ÙqÛSÎ×·Ë~»Ç]þò~¹°Håœ~~ûp·_/ gWN’C¡nƒÐ‰ã—†.ÞîXQœ9]Ó¶ó^Žý’UR®î *Çq¿ïªònï×ë%¥ô;c/7"¾hRM^ÝÌ$_R›lêå’¶7Þ4F%àD´@¢éz½$Uî Q¨&?ŠHÚtÓN®„˜W ¦Ïûm/Çí¾W«[NK¹îæt”ã(¥ÖãóöùÓ—Ÿ¾ä÷ˆž…HTö «Õjµµ€›Ãs³Ïãnµ–jI„[؈EuôUÆA.Ž 5Š.T·œÔŸ(y;0%• ›j9J‰9e¹\.#TwYèžIS5fvY‚·a¤¥”ø“Üý1ž¨—Ë2Õž k‡7FâPnœX·ÆNeaa•62ÎÌðóÿŸ¹w[sÜH²tíä‘:õÌÞûý_næ›)I™$w3Ûæ'Ì”T­êêºP«Cq AÀ_¶Ö¿,šoù¤6Àã@Äj›ƒr\ ^ðÀ"QGäj@BÀ ®»šCÉPªcQ‹zƒ°«™…kTõz»Ýïw$Ääà÷ûýÈG7é™û²,9çãøØ¶ CÛ²–¢‘8ö#:…ͽX!Ä ŒÚšì‰Êž ™q·”Ö%¥0¯iQ·ã8Ü-¬÷D¬maŽŸaïo¬eÑ à–’»=¹Aû µèqäHP™–”ÒØ©(Tô3¶šO"%-•ºSŠšuàÊqäã¶#Àáæídï9¹»Z lžjaa)¹ìû=á®&Ô:Aób.U§¶`éTwm½÷7 Jœ‰¹”>ï”–›ÆâEÌE÷}_’,Û몪ÆUk¦aðL ×êTU«·ææjZ‹+MõP½Óm¿XI‹Lþ¸J f"" #0±*ZM‚pŒ![0³›ƒºãà ÷rÅXǵ¤ª0÷þ5_a±‚„oo—îÃæ8ÐÀï qÓ=›†U¹]‹”Ó¹&õ¿WXtÒ1AÅ!V½’#e⊄¢c-ŒÆ:Ba ~w(A^¥ðvû‰hC)8“ê§6ß^ÌQ"ÒJb:‹æzû+­M. j3/ã59ϧËC%ƒÏ®;¨D |¢ˆ¼Ô1Û}Í­ Wðì•óÖŠÔ>²z¹…ƒ¾-ŸuˆñpØÆ'£dx~@ê4±YP¡ó™7zõ¹Ù„›Ê>" àéAlÙãiPk%| Uî3ê Î5ß'Ñrš÷ž³DÖ±eO„ÙˆœšSLd–JOg öðÄkï÷€ùµÖØ.PÀ“{zw>Í|ÞO$ðSƒ¬ãÜŸÿ?œG«Ï€|ŸŒ:Ön€‰7ÄáóŸ›8?³ì<^:>: Ÿ«ª2vn9VpßdW|xïþlÕŸz§{CÇ™ð7æÓ«Ås†`¸Ãñ Žÿ<3ÙiO‚'ÊÄ9„àSgæÃGŽ‘'kþÓÇôððA¥Žæ®Žoò¢^YП6€Ï’¼Ï!8G€ð)­1h/~ÏóÛñ§¢í§åãÅTàå”ðl„÷?)@¿”Ãÿœ^ìߣ+ý«µp< vŸÕÊo¿—ÿrõÿß3 À?óQ¼<ïf2Ï z`Ø?ÜãBݧÓ@¨Þ°qí϶ΚÏ_lÕXc:€'xP[Ûâë}ÒüpôÖJ[™’ÓØkÑûÏöñ÷zŒœëBoÄÃÚ‚ s&1ö+LÍ.]™çªä ÂÑD;žD:/hê?™ãˆÓìÚ§ZsŽgÎ)è¯@YO‹ß별¦ÿì$îs~{æ¨ÆŠÇâ¢*,f`¦»¡ªÖ¨è¡“†è¦ª÷ÛýØ3ñÍà®\X)~§#ÛvI\à_¾~Ù¶Kø€ˆèPÁq”#—=çÿïÿý„“»ß÷ýúåãåèð¾¦ñ¡¹ä@–ì˜w"Z–„„G.Ð:c‹jø ÃW´„ µù œÜ¬x·ºÀý~fU572K!ðeI° ¡f…–e±«ï÷ýªW$Ú–•M‹Z=Mͽ˜›U§šXËIĉr.šU¿]ïÌl ×ÛÍŠ­iùáý-ñ"€×û/’vPÏE šW­†Yz§újªd+È‘Up­ÏýäfJ ŒIøãcÿOë,\×Rô¾ß~ûõW&ú´½º\¾~\}/wÔ$jn9ë¶ „$­t¨ªª#$I׌&·R •L€È$€N¦n)-·’K>ÔAˆ²æ½TP ¨®Ë¢¹$‘Ëe»Ýö¯Ÿ¿ä9\Üu?Š’0ËQŽ|d^’–¬)ZrÎQŠ“õš‘ ­”ÂÍÆ•jûqûÑ×CKrst fÛ»ÇývìlܬÑ·õb8eVƒÌCH„lHÈí©.ª˜=$ISñúˆARw¤¼­«º©AÖâE݉´S6ÑœCÌŒ]ÖQXƒÔ9 –âfÐÈá\C¤èJ5%ˆúb"iF¿’sÎ×ucæÄ‰{ŒD»z3ú™¹—#‘.ff¡ÅÜÀá–/_„åÓ?\¶íÈGÎy»\Â^ãýv?öÝÔn÷»ƒ¯ËÊÌÑœIÌ w;öÝ I¡¸'D v\l#ï_¯û5W³ð‘èí½îCsÈ9—¢aõ]Ò"’Þ.KEý¸Åt§.€-0ï>Õ mƹdY—%N(7WP0Øs>Ž£•Bû¶m½ðÓÔ4Ö¹!ð¾ïqFô*¶1ßœ3-Û«Y5¨ÄÇ¢„a¿äeYT-—µÜÅU•С€GUC ŸfÐD(§µf¹«îá.,%3KÀ.˜%;"-·ë¬°”°ÚÄ ¥ìû~ÜrÎùò~afbqó¢™Û]ÙÜTÌ¢t×ÕŽ£T¼¾ˆ,‚Íx—™0õ9 "ÄÔ+ž ¼òÔÃË#3@d¨Žu<1¹Ÿ6—9çœ3'IfGñš3-¼Ü!ÚU-ðÿ!¤'… rˆÍé86(:£ŸwEqÚ×;6¼SÛÌ— ” ’ r/‚º; ƒ£µapœ-µX¥Â©¼ç¼öl€ƒÅûlO<]Ðí…ÓV¬#ÿÌIq fªµS75sSp`fÓmh-¿ @xWfaE:ÆÄDd¸K°5¯úɺ;èC̯ÍÏžnô£ŠOSh›lPÜÈ1a€’œ™‘°²ÅÐÛãq|ºf±`F{v{.¤“›¡ âAGcn @3SÓfñ÷0ÿvÊMÿþêðsh±.Š‘»›Zóy›„œjw­a¥i;ÁÃÒ0ztxιâŠn{Ù)S[áL<ÍŸš«°m_f9o$cÏ2qÜõgd:œUaM2JŸôÄ¥kµPûT_ÐC.!Q²U÷ôÕû<ÇwboÔÄÁI| =ºŸGÞùø½Œ—¹átfðÌÝÆýMUiç¯: ºÚƒ :^Á " øŸwì[{РÿÓž,2|)@¤{£f¾Õ(ø¾ïÐèÿ""ÍiЏiö*ãvÒ"ƽ;z¿ ¨Æ}ç8¤ÁÓ‰ˆ¬Î2ãïöXaÿâ€;Ÿ•›=p>ÛT+¯ÕÊŸèçel½ñd >F“žîó¬¢Ö€›ªµ…‹Ú\¹í¤ñ-}+Àr¥÷cœTïSK+qÍ3Mžô>FíY|hž* j¶Ÿ©ƒˆ¬žºýôGwS¬×_Sœ¸Iã÷"иË5õóDþðQÊ‹O5gVƒòÈÏ–è'WoÇXRÛNŪs71´Jd„s3b×¢çÜA¸üÐ}öÊ?êé"Zøû9_ÿê³FÊÕÌÑÓeÒYçÀ÷«F/õDÝád«÷Wäˆ)§Ã Í— )ÔíÛîç‘^ÃÔ1nƒƒ=‹l­g¾¡fú“ä5÷Hž"8Ëêçž$\tø&še4Ax¿,ýIæ„m¼Á4,vÿ¦w|F .ágM°¿1_ðØ–tà‰ç±?¤*ºè?UEBOMQ¹ xžþx{E“‡g}¶5óóeÞŸ'O´‹éŸî™„! ‚=ØÜÕø–úÿí¬Á ©ôg$xÿ®¶ìßÏ <‰|gkñÔíŸÓ½§ëä_¤}ûŸú²¿Fý[þ÷_þ×ñ¯ç9ðÕ¿÷ÕÏâÿœ,š¬`xú¿õAþôþ—ÕÇ`Dã6Œ)à)Y‡}4MqÖü5@§IF•>¨_¤ár&:…•*2Ü<Ø^Uü ‡†ç"pCB·ªRÇC>Þ*9X¼¤~×í«0—¦+²e [Í=8?°œnêç§·GZ:}ÁfÄÏSËZL¬hñcÛ¶HÅFð:ç\JY$¡FËŸe-0 #døK)÷ãu)åˆl>4ˆd3ûµ®ÖèòR5/‡C#Ç"Rö« ò%-[‚{ÞÝ]$ýßß~ÏÅ/kz¿\ ¥¤¥Üî÷|¿|¢eÛ–mMËÒØ8V/¶É„˜D*²#ÔŸV^ÊL ¥À¾ï¡ÆÆsðâ.àïooŒhŽŒô?ýô?ÿRÌ4ëÇýVÈ…DÒ—ã 1_–u]WILIÌ\„Ì@ÃRÌ%@ÿµ®˜#“,)Áõ~/9—r˜™ú~¹üÿøÙ@-h-_¾|÷£ î9_–ÅsþòùCÝ…Ã j@NA´@®¾BtSðès.¥ ’yL˜Òb॔Ëû§°.²ðåØŽcÿüùËí~ÿåÓ§ã¾ïû‰·m@U»ßw¸À&«ZÎW6E°$i]¶ýØ%¥uYI˜PU¢DDkŠÓܾ~ù8JâH·ç#»©‡¨Lz cÞKÎYMSâeIæ]¦¶ò¢®ãpßïÛº2W@„;xk½ÃZoHØÑ™YCòÕ˶ѾMEƨžÝïÁ¯7(¥€ƒjÙK‘ªäFT9,±"±«açŠÜw0W4Dm6Z–Jì”yJ@nó*ê»_Äļ»!³9#^sQsF3W$ttdDB²ª(¸ÆÇßD"‡êÿª•ºUG@fp#ópuÙØ -Q(šRJ)™;3ZÔþ5=®óÃY©%@"—°@‡³˜‰U-%ÉEsÎyß1­+±¨ùº¬HÖø°i‡ùý~¿DZùº-kD‘bÛ&DnbV§))%7‘m]«SÑÝsɈ”Žlj²H¸ÕRJêõS^RêÃBDLii:/Ä ",Ïñyñ©n×™šlà~G.GJKJKZ'B-ê‚)¥Ë¶Å¡ZÖµ×M_þ!úHTT›…ÙŽÛ~äCÍÔìýím½lI$æ.½E ÚŸÝUK.Ñš=ÞÂ"©« ÆæàÌ ¥Ѳ¬Á®éJFGÞ·bIïCä~~¹–|äŒmnGHËš1%Áª×ÛGÜ#¬¨,,‹¬[BŠ¥’ãCìiÃ8—„ŒŒ¸Òä‰HX¼ +1âGD„àK´ms‡0‘°D-Ds»)5ÐO9ƒ¹Öð¹9ŒH8Ž|ß÷··u]â’çÚñè“bUUÞ.KÕ"æjÎÝ£€ÌX,(ÂÕbIÝ·kW»¶OƱöxD~h¬„P<ª?jÕF k±0ï&.|?m„È1F6è‘}ìjœ·RzÂúSÁ8ŸÖaWf°-¦†îÂ#¨™5oÌKhìáõŠ5³É£Þ+â•D+ÀœYñQxÐBÐE¶Z}A,IÚ%jâÙ8æ+"ØdqžåxS ŸÀqqÙËFÁ¸´ã®7'®l,guöCÓ°þ æ0à×Ìîô–¨·î—o½µ®ºwÆNc’i¨SñR4f8Š7:1ÜÉ{{Ä£Ö|þ#´{OjŒýWã³™ 5žã¬—>úýŸAK«È²Š\+ýül¡m{öæÏa‚^¬ÒG=Þa>W¬V¼Z][¦–£Ç‘É4ôv&Çí 53Ï0Ü“8?ÌÄô"ÚÿõÎ{‘ýd[öçQÊIrp\ø˜-u#ïIbî@‚éÅy÷6#|ꀿ4‘ÎIoÅè…þìU~¢Ìσ3Ì›˜;æðßÖ¨ü™ ß~¬ÎßägÔѹ—'Ñwbáà–ò]öá NŸÊ`ÍŠúé Žq‡Ÿ,Ó§Ï4fx¼0gÞŒ¿Ç`¸Û_ƒaº~bMOçâÃï¢Ó›}ˆ\à )Ù|f€7ŒëÔSÙscõlœÎy?ý |D£à„ØñǩΠþ"?Ð?ÔÇÆ‘5{ê.êм§Ê^Ç“°î!‘¡a½.û}]ñG÷<>â'Ò†C¨t6Ž8¼Rÿ}ú¤¿©þ?vˆk$ð ¹Ö_ZõŸ¸Mî^þöWÿ³Ý¶ÿ>½ý»Å ÿüŸÿnöüóßßû!øÀ›Á©x½/Š4Q ‡¯æ|Õ´n€±¼Sû6¤ž÷­Î(»!ìn:o—5Â4!í]DèÔƒH5m4Ö‡†Dìq}{ÐSôGð4íXP‡e†»>–âL˨ŸFèxšú?jüO­Ø³îoþ\q‰UGU£±*´B¦É¥ôýU‘‚—eÁfD*¥€yp¢×u©P ³GÂê‰Xƒ±å|+ÀDÌæJ,Ñóy»ßSJt5àòýØ@˜ÜôóçÏ×ýþþöþüöåë×ýv[$iÎ¥dwûíóï?¿ýði[W!Ž:ÇÚC`äÚCØöüTÉÕ 9ǹÒm×ñ×}¸´LÕÍí(™T 1ÿôÓ?üô^Žãóï×CU½Ýï׫øïŸ‘8G)@¥H*(2æèΔÀÀ¨YèhÝÖ¬¦¥z`…è?~þéüøÓÿùüÛ×ëÇí~߯ûñqOëŒ̘ÁoȈ¸31#×'åÊ’Ž÷“IbÇKèÅUÝ!_¼»!1[QSMë⎖JÉ·¯ÿëËÿ^bÁeA3LIˆìÐÌE„u/& ˆ ÜQÿ´ýðå+»iJiY5Ë9—|Üî;ä²RJòÛ—ÏÇ‘%‘ 2‚2'‰ëÔ-kF-ZLƒÒþËÏ?'æ\ÊõvÀëí#}\?r)‰ ]¶´X`ô‹i ì 4Gûpm?ްªí%‘®ÜÓ¶.dÿ¢á ¯EÈ•¢Žˆˆë²:”†eY™ÅÛ¾ÈúÀ©"5\ˆK dNÈ[˲¨ê’Òž[¸Þœ™¥º¡¶$_î½­Î% DhÂdhfÈÍeŒî„Á©v0+Ö`#ænE¹2ÊYc³ Á&fQ!¼fZÓ^uû "‚ˆµÒÜ,²„Ä$Ì/÷ã~ QbÔT!I!„"±ïEuI붬"âàïoop¿ƒ{`ybµ¢ýýýv¿}||T¬-¡©ÅÀTÍ%R’„àëº^Ö‹ZÎEÍLµµËeómea!‰@Ã’RQ-)Åns?ö|äuÛ„ÙLo÷Û~ìÕšhLÌ«)¥ÃÝDR°Ý¹µ ÀûÛ§ËÛy¿ IDATÔ¨ÖBLËB\ÙÍ]ý7 ¼8¢1…ÂØ Ÿ­Â~h¾\6/&‹¼½]„ÅÌ !FãtÈ.ÌFîÄш†k s¥®›¹2UN¡êbÊÎ9a@¦Ðòã. ªq/%›Ö¦Ê•yY·@½r…WÔß©”¤öJ =ˆˆ$-]¸¡(õh÷²Hɰ¤èWP-±ºW¿RhÜzg@¨nÜï´îD!Xñ·á¿ÔŠ×zu×0&#aÄ9Bâá}÷¦©·äe‘0\7!¬iÊ¡ ÷›vízÅÚÇÜžJPÍ#t‚€•:˜8 òÖÒk|ªÇ¥+‡$b>J-«ì#"Ý­_' ‰(çb MÏ7d“ŸA%qÆöç/G‹}žZmišuê/mþè&ô4Xdüž8µ˜G‚+Ÿ&¨—›STm[…}STP¶èL7^×ïE¦¡4Ŭ‘šâÖͶˆÞ++¬ë`pqМçÍ:ÕžŒ>: ¾µAމX4‘›‡ ÄÄX ½ñôÏΩùܾƒ,ÙhQÝ#?foº+sä*æäì™ ZÚ ÎÇ÷ǹ]U ¯OÅöú6˜£­Ý¸Qú#7¤çŽK&r„mnfm¸Ÿ*3¹e~̵¡¹‡Û).mþë&ÖßCÐÚÔu°ÖÎ…=L½ÞTíYbͬH u3µR"@F'DE—i£¦’ôüìwrW­ŸNHؽ ýäî­hMìSç“,r<"„ª nf%lÑTêUÀRRÛA¡uº:Î-¸C‘¯3‘XÛÛÔa û%|G¿¦À*#(~êddn¸ShhvÐW–ΤÞR{Š@DR-fðߚ#:»ß»„ÜÝHàˆµ!xà¡Ò®Î|áT(1öS2û‰¼?· á4œKG:•ȧÀñ,‡vdÿ8ÛÏŠö)tž¶å:N®N—© / 0>ezç3QÔº„ò?f=ÁЧ/5|ÐyøgTuT_ÐI׎aÙ©gÁ§#0Cï c6Ýe±£ŒÏº¼ôšÇ“çH.N|œW[À‡·0‘[êxÍÍX;øàXîhä1÷—ß ;ø‚ì42[=©ƒ~z%ßÁ?1žb8Ûáîd€þ¦ÍFØãì0ç÷‰gËû£äê#í6ŽÅü¯þlgq¨:°|ÅGÁGcõÌzx%ÄÖþIá$¯?ê¾­ÈâÌ…8_€'÷ý<3ĉ‡'K.<êBÁ‡×áÓIuÒîO?ÉêzºOæß©+t$:ïE=¯Ã Jÿi–ƒÏçÀ·åÞùTÐÉ?*æ­0ô±pªÖøÒyþøºçC…ߘ°ý‘þö õÿéÐà_¹ñ¯±bþžÁ¿h´à¯_œÿs‘ÿw¾Ï×ÀŸÍ Ss/ž/áyJcL‡£±»cN“ÄGŸ4î§%«ÞkD Ý…¹=œX7u·óXqb^„@»n)‚×}»¸iµéöy ĬíÞ¾“ñ©¥¨¾Bö>_g ¢è ˜Pi­gà± vÿú`ŸUl?‡nö'²ëXBéÏœôõ/ 2pð ÂéSÖ¦êD‘mgâ(3¦X=sÉVÔki-R¸¡¡ákQˆ À¾ª®¦Y3 §$?¼"7ßûõ~½ç»™½¿½…c$ «T)%¢ _n7-%IJ)Èϲ|²bEKÙ–5k>{[Æa±æÉâºËef3CÇ00=³ïF*„=Bžæ‡k>Ž·uË%ÿöÏVô~ß @8©~üöû¯ëvIkJÄTJ1Ó¢ZL©¶Ø9!›é"¢N€NˆF˜s>¬€YÁŠ-eIi[—˲ýV~GäÚ=°ˆ|z{c–ļ2fHDB`h¨lEsƒ$  ›i©>1Ww0&ŽYó‰M÷û~g¦E’iq&JIÞ.ëº,.Ž2ºœÍÔo·;1ƒ %s%"!NL_nWbtPp\RJB’ÄTM-Üaˆ¨Zªoz[‹rËØ³YsÉnžRJ²,,I>öãøüù÷}?À1¥´n—u $=–’Ý­U=Z=P„ûf&çräÜw­µ-±¨æœ‰éýí’’hÉ÷²{Öœæ‘Ôˆ¼k)Ñ0ïÜY¤ï©bÜÝ´õkçè0MKBÄ\Š@.%*"Üݵ”cG\f.¥|ì·£”ã¾—¢†À„Å<Þ‹X13uD`@2«îxÕÚ¦ŠD„¤1x skF6p¦FP‰ÞT° Ñ€½oo^JévBòê`qnu ûq/fH+UXR"bIì­4KQw¸Ýï×ë~)I Š¢aø~LÄ•”B(f¦º¦%ˆ:ªšK…R,磖‘0‹Twrqµë~‹]B#±`¢¥Ûå —"ÂïÌî~»ï×+§/—KOt1Q„LCÄäu]›ÔN!‘Ä™¶®ë§Oï붺۾gDêé„á±m:ƒíäbI²ÔðŠuô5³ø(U ÜyámÛ∭KºßvG_$¹ûÛ¶aÏçV7h¤R¢ˆ¸Ý‚ÛfÞªÕ(Ô¼RJ+ý£öši/&jKfô1†¤Ôí‡5†µ%ž™Øhà/*õ„¸• wÝÝM ŽFÄæR"ŽºÈ³ïÒÕŠ;˜P$‡ú.¿"YÐ̱V§ÆóLHLæ­­¼1 µÎ €jZÔÖe!â#çØP4ýÊ1k™¹» ½F#B¦¬&ʘB÷£j0NxÆjw@译™šæ H„±º˜9TúD}àiÏBæ(ØVX'óZLU+<¤4ì>ì˜7ý³Õx@• _òDMfj¯žbÁ©"F ›§»ÞÚ}¾ÑÆLs¶ÔÜâ†Õ½ÏH(Â̬Zð\üÞ…¾+5ÓŠç"r‹[‚5>õ³Öä4ÀMã›D:tè!îÛѪµÝ‘*,¿v:t0RQ8ÝžHixØC¥š„Çî´ðž¯Oõ»?¶K•‚Òõ=l:=16*ú$Üçñ´îæµý¥MTºgR‹ö ¨d©xYæ)8žah¨3˜šðÔ*8c?ô9 MùkZ Ñ5ö¢Å·„° <îGuŠfêóì üMØ¢ÁD¨slóúÌÆõ¯˜[´üt¢Ƭ©–†uà¥NØzÂIÑÃ~ƒ`‘eêMµ9IÔ»dÁG…l«üé4‡™¨†AÔêó,×™±Ådô©EC&óvýûµ 0©MŒæ¾YªnÊV!ÿì"83ÇN˜ñ²ÅP³vç´“¶÷ÇÆ%?¿ª'!†OØF]hÆ6$ìz/¸¶ÔS (é ³Í¶jmk-çOvÄ(*‘“:ÆVCô—vþljÎÙÓ}ªp*a> ÌýÁžß#SÓ‡ñ•J{³qZS¨Ù›æe°…ÝYk´±Ï0à\Ðçvåj¯!ÐÞT®þhë®âöt®OêcyAÜ—çV†iÙku íá#»¿äýU½æ”]h÷…“ã×GéïäÌžÙk8à½Ø…~|tK{÷!B?Ú' ÃsˆÄýÓ¼Þ)ÊsÅI¯d<ë°'âàYè¾È*³øä%s‰Yy›\ö“w¶ZžtišŽÛvÈÓ/§Y- äÓlozZœYó åã³!ýTÄú×t·sAôôðœàø†|B·4ó9Â3ôŸGþRïµ}€ ë7åpþïãvì4a#ªé™¿RõŸ$¯-N¯ßç‘¿ÖŠýÁÛìçéÉ »¾Ÿ¯"?KËx{M©|1ʰWÞÿÓûð²«G‘}Hی̇ÿUÓ9¾š%ø?)ðûøìñ_kŠ÷'½óluöâ"ügŽüõäßgÿÇgûÿ)ëtö=À¹1GensQŒñ€÷ˆn³…Ó„µé®ÿ³`?ŧtˆÜÓO³tÍwx¬3î¶£¾JÒÔÐw³™jiæ!¶ óÉÿnAP0¨¹dìþ¹h¬Ï;uüà8o¼½;ûÆpLMëšoÄþ°¼×%7Š®æWý£ÙÊâ#˜oÌë¼Aúîñ¾ïk‹™ ! ÷G̱=n®Õ Àßï$"Y‹Ã@šb} ÁƒÈ\AÝÐI¿\?–%bJ ‹©i»›æäŒLîFD®îÛ²h)D~߯Ûò†DB„Ëî þëï¿ýþù3‰,I˜ñÐPVZßW´Ú#;s&fV¦ý~97Žwx {Q˜h¸—5 G¡ë~èqe÷â†D ‹ª˶^ÑLÓÂ·ã^ß”›ª‰D©'m˺]ÖrdR2t»•û~Ü…€$QZWC¢{Þ?î;š©ÙÛåânùؼ§Ä@È)!#E¤œ þcϬVÌÁÑ™ÄZ ¡½]6»]÷Êî$@&3ÿòõãrÙRZÄI˜·mýôçýÈÛ²,ËJDEsô!@у‰–Ä„I˜‘°×b!-³fufNÉ.²¾/pýõë—RL³p$Õƒˆo÷;#8äbÅKÎÅ¢ßÒ-çã˗ϱ(˜Çn‡—E´@JiII’¬ËÒOàÙ­4S¶;tð:9w"yß•YÛk•RDäÓ[ð¨V ]~?XÒ"IW%"€66´ÝëáÎÄlV,ÏÚŒ­¾ž&7@1Û÷=„*5e¤RJôŽF‰…}|xã/"- Ö´!+ÂØüöT½ˆàèF^EÞ0â%à¶Ÿ12¤V¼‰àHqsdÆøD-öv-éf`=ˆŽÓ#œ™Ùõ¾ÇÏÌ„¶Ëæf)¥œs)–K-cPµëízß÷mÛ.ïïÛºJâvRiJûß=ïµC±˜98 #óQJÀXr>B7M¸Ä2bàž­”£Äö=–ãX7|ê…KIBˆmCZQ“"xñzb'$± ÕQèÔdšH!$‘eY$I¸¹ûbb'éÍxÊQóPÿS"@U-Eãûí8J)XJ9rŽÁÛÛ[ B®·;!õ.Ö8TÕUÁŒ¢Ì€+rÊ­’?[ñd…R¢à¡&XÂh½ÁúüV»7­-Úúh`Z–j|)¥(NòT…¨´»D…ÉPû­cU´Ÿÿ±KŸÚ%¡ùÐÌ´½$ š97ÒwSyÜTcžÝÜ;`ert€#"{Ó’HJR§5Á0&0wè$¢1©&JR5"h"•GsŠ6"´y§g]&" w9Ôö鸵)€Œç£æeªÞá:oƆ÷ÛMµç%{Ï: ™EwHUþ1ð)Õ8Ý•ÂX‡ÌqP^:S:`2i0è»Ñú)ÿÒœøC”oË,yð•Býaf¬gG•râ—T´G“[cá£íÝê_%nbš·Àáè|ÆI@ÄÙ¨[kÆgRŸ‰›¾JÕ ¼Î]ª†z¿èø¬&S0uó/áƒômÓB‡Oº'¾pJ"D‰BSºû|(Lu•_g(4‡UÊC4àÓÔ¢“Ö:Ò ûp O÷&þŽ6Y¼ñ‡Â_˜Ñ[Oä\o×x©LØä1Õ„8@hcéWU|{¾a›†´ñkµíÔ0Úæ6‚ÉCß@4 Îú³ûºþ¤²á Ϲ?YžÇÙ¤ÓV–³»ù¹ë³Šûˆ³vêí\xèFÆ©ÕÀ_›>ŒQißP1Ïm˜x"~WsÃo´/œ<˜UÞªÅ8“Íÿ4Ky¥Sâã¼ ¿‘ð¦G›=ú4uA8=6?zý_ ø€ éÔªSqÅ9štRaÍžU-‡§_|>9ËZþ½$L“¢i(÷¨þ¿|Ô ÇÃ÷N ÿÓ÷Sš)oà¯FB(<ã·ÿâßÏÿù»Ôÿ?7ògÞÌ¿¹à¿\ýÇ¿ô9â·¿<¨ûuÑ= ¦J^§)3…“¾üX-€]ůWX¿Îè|aM„®XЍÛ\ú¢ÁýÜ!Ò‡µL}.sxœ²»:vª9eÈÏ„¢–UgCuµ7C!R‹LßLøÔçÞW@Ä^P—H„‘ÀÓ’hÃ9ïø!ªCkNò± Nኧ«á±ÃÇÒüN¨¦•÷íFΙºžED¡WÖ'ÂØ¡qß®„UÇÜM [A¨©sI)~'á”Z‹e ©i΀~ÿúåz¿ÿðé"¾¿¿_ÖMA™å²®ÛšFAh<Ž#@˜‘[ü*­’á€:šÃ‘ËG¾ÿïÿû~ùå—ß»©B(ÇDî¾çÜq3l±«YQÍ%÷ÌiŽGáeYJÉÙ*²È¦–s.DŒT îùv»ÝÖ´n˪®1ý‘…ÄÀÕÝýþ¦•‚Œ .‹±QC5U×ûý~ßokZSZÁUÍ|]SÉúñõ#PÂ[Jþ~ùâê¦Ùôóõzq_˜Ó² µ\29ÇîGÍ\U\ÑM ‡sÉÀœH‘-qÅ¡š†jÏG2½0 /¬l*«XÐ]–Uˆv7+HŒZ °Y‘Ì1±WÈ™y9rwf¶âù¦VJÑ#g5#r3gD3(ªÇñ‘X¶m³º'#+«ˆ™zÐrLÀÓ’–”~üñG3ÝïG)Å=»'p.%«: ¸–}ÂFk5z€z[WsêÔºáD2„p÷ûñYUKsÎZr+ЫŽ'3c©Y~f.f›À¢Åac)jÁ€¶ýŽms¯š0wÛpW÷’Ëív½¼½Eg.¹™ìŒ´,‹2'Ž¥,Èôæàn(jêε°”ºç:˜ýˆäƒˆR7&±/æÍÕÕVÚëõ+‹4G˜6T©B4×ÛnfǾ oÛ"²¬KXï÷}M+³x)娢êàÄøéÓÛ¶]Þ¶•%yVµHPA=«S¹²/ŒXÜlÝ6fÉ9G[lˆg±4µfÚâf€¨èÔöùÐöùEsبÝ*ÛSJ"ÒXaCÒØwoZÌðå!’8UB\–……ï×{Ñyª$"I˜9älœvÔUÄ658ÜIÍÔ=T¦Öš°”?»®k$Xm`èVÇè©öFH˜ uð; #ŵgÖb*Á'QS  —¢"!ÄQCLÇ¢ÚSSƒ¢‹(’ÌÀJ5%‘änù81&jÝæí‰ÂÓŽû@@sÇxyî¦*"€È"D‹!©«y`®ªË• ”šE”+X²æÞ}ú&ê6ê fYøëv‰â’‰@\$ÃRZºÄ6á}߃–P•‚6úÀ–(da!â´H"7Ó¢qÚ# Ú4hE…éj=,9t|"’ƒÕg—šc ðºÄSS­D;ìêKÌ*NûüÓ† Û¨9»ÅöÕ OPDš‹a‡7ö˜ö Ü—HÕ`V±éa%®$>é_­\®-Îs…3÷¡ÞÇc ωê.’ø#ÍŒ[¿ªÎ,J¼{X°“Ú…wΨ¢íÙ.Ýæ@÷'Ž¥æÄ¶i/#Ú/ëÌcFŒ´Mÿ:ŽšÐטFgh¸ãpô¸[M)µSlSkÝj"+ '¸*!ÅXåä@¯YX;“€¦S©3!*3®wEÔ H-#~«hÈ’8£§©FÕ+­&Îbqh<òöpŽ\³)VÛ'ј"è­q”Q¤šCãéÚ´…-¼ê6îs©ë¨Íü¨cŠBïó”ÚlL(u6 Æmä8E껃Fn™jz­zÎÝ,çãÕÚÍÞ»aBð­^„nÃßv–ßmõâÃQlãÞoµ‹©ì¶Ôa;½-f¹]ýÑ6ùÆ>,j>ýÞE>D Du PJÁ‰ÞY‹óc¶·ˆ%Ôÿµ±úaþ†©¼ÎÒ3‘ì`ޱtå€*óŒ¡5SÁ é¸RÍ Ñ[)BïÊ™ù ²?]´SëÌì@ï³–ý™Ò/F]´8aZó9í„Ó¥UsÌ+[3ü S£ùyjU•M:6„ö'&èî5{H Ȇ}.Ú$ˆ9«ínÓÇzœhîðnóvüO%½“IþYÉ<¹þé”" œØuÃÜì3¥Íæ6æ‹j8øCáé´OïNðöÆ&¼Á¡cThÛ¸1õÜ¿…ºø$4ã |üJ£ypãcœô„³žþÒÚ>ƒßâc´—ó^$ûl—îoħ_†µä¤Ïžk€½t§ŒÞô›G¸ãTöèþ µvnüû’<=‹eÃ<åÏ:&ÖÌf»áOׯÃÔY>iüϪêtŸ;Ù}ûê÷ˆ#òïÉŠ}¢?-Wø²µyäf¶õC´àÕ ÿH+þ¾Ý±]óDý•IšNMÀþ õÿ43ñïüŸµxÿ#, | ôí¯ë3zîCøOHÏ/N½¿¡óÝ“í¹Íô??Âø›^øóÙ>Þnà\~Z¶èé+0Õç&i»¹53Å©8Øû’õ°ç™Ú†gJÏ@³Ð¸)"¿XÝzAnõ×êã=â4$2ŠPqD‡'“ žú[€r¡ˆõ@@ –[=oÓ¾û¶Æ©¶¿¢™‡n>¦]Í'3 ~1JiÇ(žÃc/ÏAô$íûcÉ7~G÷ÎYEÅ(š€E¤¢¢i¨]ÍùA„(%Y—Ú„FA–À„˧ºÝîû}Ç JJÄÄI˜…€Ý…!WUC »×€5ñFôÓO?oËB"€BdŒ„ïþ®7øí÷ß>>–ExáTùOXãÆs…øQ³¢å({<­Y“w1õj2a63fY„rÎH@@ìIõ &ή×ëýv» ËrIi‘•³KJémÛÔü¸ßn™Üo%¯þõê—¥E³–ÛýnfÂtÙÞRJL”˜ÀA3ûØïŒ¸.‹IJooo뺙[.…ö»§„D‰¤¸ ¥$äÉÕðЂH‰XM³–…Y„xzÜ)E -IHTs$¡u[™HMÍ÷ð³Ð OUÖ6ŠjJ€Y @¿æW}ÿ´mk0ÙÑ ѶG>¬äŒž³yw·¢¾¥…ˆ*8 –·÷\ò}ß%†I¥˜é¶.?¼‚hªüôé¢Ån÷=„¿%%Ä‘òq8‚ýz|-ZRJ̨ØuGÎCZ%&$‘j9×ö?aQ­âqßïnë¶ ÍEKì½£›Í8;DMà¨CÉ9 ÑÁ±bf+zä,IB~>ÓVŸËÌzä’³•Â,qpÔ4µàq38XQd,ž #"\˜ÜLÝÔ ÜÍÜ€¸>·=?: Y÷„»{1Ø÷=”,&aò¶Ur´cY$9xÑ’sNIÜ‘UmIË?þ°.[lïÁ€“È’V$Z$ýúûïE5Z7ˆèçŸ~Y–Å8ÀÓææ.ÂI¸¨d" ÎÑ»KˆîÄ’1‰-jÖCïX_ÕRј@põÚS¦]S5 ·Þ6¢ß•£;ºö"ª(7¤Pj‘`7V IIT-眵ÄÒo6LÄLn¥Êîæ•¼¤VrADÙ6¦JË&¦àNH"Š^ bÖR°E>jAoó¼Zô¶kõ~B3ºš›Z°Íû4ž˜*ÃaÖþ°Ú#ݽ~ 1dªi+fi†S0SPÕ(ˆuø÷ihd `µÊ°A·!kEÔÈKŒÊ¢¶KfÚÞLD°†žq™(äVPûqò³ó1nkQLˆûfì㦠¡5n~}Ĉzᦠ‡ÆBÌj!iÅšx}Ú8%”½,"›OŠ;uH8a_Óôà†àà1%íO-­¢ÐA½*.Þ¡ßõYˆgïFت)Êv«ý£mFš6áѯVŸpß§´„uäc ¦£ÍÂ{ÚÿL¿o&VŒÑh²5ÀUÕTãÎöبU¨j8bm"dp‚w¡Õx¶µ7Üí>£„{¨7òuëã<ó\F“pÜSb¢·ñd×~Òý$0ÐxD'?%wë'U­‡ÄøÐíçÍÌãüÿ¦ê:¨µ Ø úÌDF€JlÖ ŠµÆßñì æ`‘ùB¦˜êÑQ°NCòbwï4Óÿ†I4&\Ó<Ê]£OÆV¼ :Ö(ÝÖuåÞ×·cí¤å¹Š0pF±TšBqmÙ­jûpp+ÖÜ:`KmlcާÞÊÎ;§6ßÓѾP/ƒ†ô9åfBýO×µ^¢¡Ûh*Úõ©B<ÒjaŒ8Ž#†ß8áòë;dk³ªû·ËÇÑÉÝr.D˜ÒÒ„ï¸gÒisAg«Åñ‡J…ñ–ΩSjkÐùÞ" Âf„‘zŒN5#„ IDAT@8G‚«1íf}°>€µ²€Þ‹}uëá‰ÀÇœdöú=ªÜ@§ X7䎬z?þÐÈEîŬ%l¨%ŸÇÓ]¦g×É>$#à†@Dë‘G{|Eç¿;Xð#ˆÑ²4=§w;CFuú ãÔÓí/Å­êSéL  !ð.¶Ÿ)ø³ïg^O7”ŸùùÝàþŠ93&AˆS+ X;mš“ñ™êÐlôæ“Ñtüµ–D:7 âhe‹o dÆà{šhõYÇäÐ÷|š%v‚ž)0“¾ãÏÂ4¼r´·w’ÞüÔlü"å7š]ž^Nö~?9€ëãÓ˜ñ<¡õŸÞÛÐ÷žKœ_¾5ްL¯ÓÿŠsy~ ÷?Ғϯßç,ÂÃ0#oç.€i”øÐæ|â‡áëüÁë—uBY= µ^0÷¿¬´ã_Öÿ¢ÒßýKÿ2øÏß®þÿ ?èÿ&õÿŸ°ÿレŒOA€sî¥Ò{ºhº± ÌL³Ñx‹àUPì¼¼o‡ÎÝ›,ôÊj€Ôi†0¾³²)ö' ®Š;VÑðZ`ó×#L8 ž¢CpÆ –9hË[G§º~Ÿ Õ8Ã4,‰àH“ã4&~š([7þOÏ™Í …ðm²žQž,þß;©G„¨Q›qêȽê6¾‰%äèKÄp.߈ŽãˆtkßoѶmÛå²-«jQ­xEs•$œ„˜ œEjŸ*QѸÞ뾧ĉ’eU«;[¨`X¶ ¢ÉÁÍ3/Ûòó*æ~»^KοüüóeÝ€*ÛµX‰-׳ñ(zYÍ+I¹ãGÝÝK‰­š™bðU 5ú%BÈîë²2Ë×üöûï¿¿]Þ~úñpPôÄÌ"[J îEK+ 54W3#D*î9ç{Þ¿|ýJ`?~úq]VBŠ“Y-ý6ŽTú¿¢«ªAñHà"“8¬I¢ù³¨_oר@T°ÄÉÑl7pdtãæ”pN)ɺ0í¦.LÄ—ms·û±—\je(21:ª@EG!&¢blªàÁº±#g7K,L"Ä—u[Y>WÍγ—ìFÈÆœ˜©hApa¹,—mYˆp/ǯ¿þ–KJH\Ô>nw-JŒiI‰VMIÍL„‰8‰¤”!çòëo¿ýò·Ëöã?õØFÂT Ø}d¡FÀ’ÒîØŸrÎDz¬ëº“¬Û ¾˜©ï®¦¡Ê-©’è;1<¶|L$ÅNÊ®` á&àRWk̼©Ë´Ô~¶1+ƒª·O‰à6µjg"vHF¼*ª¥Ò~f,м“hð Z5?m-|nó~r×QÅT{P+=¢¯"^…E`ƒxd€ˆÓbª|µ¦$¹kÑÒŽÄP©FI ™L=&Í“Ýf¼-«#„™êÞ‚HVÍc54k<œ'^|ṯßÊë†ñ8Ó˜E$:iÚÚK“Ú^Šši»åµ.÷ÞT?ðñ6 ó‘25pæXi¶ŠŽÓ‰Ýi6ß61ôÎẆš£Ñtjúíšr{¢^¼ÑÙ5“ëTM¶|ÚaŸ2Bóonu÷ Z³ªÿEèÎuª´1ãÿù Ÿü‚a“«íSosÄ#£vÃ×Ì>q½úòÐG_Öà[0Þ‘·\θwLxˆ`µÊ³×Z’ϳþqÞuÃâW¤qÓUŽP4ÒŽÛ$\LÖ¼™f6îÒòq:‡û/öó´¡ÏYj5[|ïx•gi_éÃM¹}pˆÎñxtû›Ä·…†Ïi–€+©77 ô%:Ìdošµ?{GàÁ¦Ó@ á% }úfó¯Ç,Å„ÌïÂù DÂS€àᣞÅò?–d§vHœST z¼9ô÷x¬ýÙŽÓGëPïú·?@[*ç‰t@Ívà1·>5_L vÎ;ü¹>ü†‚î'2Ô‹c9]t½§Æ£I¾§:t{åýÇÖ¯Õÿ#¥ÙO¬'lëitßX}÷À}Cvý›ÔüXáýCßPÿýŸ˜qüý¤ÿ¶ö|==x2¾ŸZï§ï˜\íþßÃÝßÕmÎ3ð‡è@¿ÝͧŸj‡áÿ=­vÞ!Õˆ<ªU¢2wT¤ãÊã…èõC'œAFsGGçÿ´KÓ'ñ ¾]FpsgšÒo vŠPTp«º²98ZûÝÓ›µ¾2ÏwÈ~OéQ$‚¹ìÙ‹¦ ¥ÇÄð´ÒØwÎûÇL‘˜1I(oÌñKªÿ/ÏS²F•ªºb8ÖuíŸôº®±Û1 ^í ªšsŽzÛþÜß'^«¡X}¬ºñâ°QSªÒÿmY–eIñbþ—ê}¿ÿþõ«!ñ$ëÃûåÂíÄU³bNÕHÙœ¿ñý=t|dûøøúööVJÙëÊÿSY˜™€ŽRŠ–Ë¶ýüÓoë¶ïûµÜÕŠeT3³ýoQð[ÀP™ù².Aµþ¸ß®·€¯i]“l"A_5×8GÂãÃnŽÁ¡%BrFÀR´”¼&!À÷·7&Rµûýã¾ê%Dg|Û@£›ˆ‘ ßá`”˜Xˆ $V€”’º±™[Qµë~W-?½¿Ñ² bÖîÌ,"¹d,j,Õ²Z²,’.Û¡D«°e/‚(ZtÙbBFÖb eaF\ÖwW;ŽbnGÑRTõVŠ.ËŠw…bJ" –\®÷ã~ìˆx½]Ñ]‹ª]Ëå²1³¶‡cªD]e–¸ÜCà vÕlnÈL‚ë*Û*×+¸%æ%>ÍlGß¹ùíÁÍÖu«Ûu7F””’Ⱥ®¥dÇZGkð tYÖŠèLFKZ¶u»çCUÍTsøø¨–¤Ó¡sÜÌ*íÌÜË‘ ˜™R¹«!¸º…^b?I^Ùà¤&¼lbÊECå$0@P+ž o;_åî ¥èý¾‹$B †x,Ü·ûnÕWO¿ýöû/?ÿr½^áó—¯Ç±‡¡8%^×5¥t½^ï÷û¶mhp³÷·÷·ËzÙ¶_ýË}ßÝ-ø?4OÝAÁ‘ÐÈ’{¹ïAÉ9çã`âbF sèªÑ'QÍ¡,².©oÇr.n•3kDL„æ°|U‹»“šFafufË¥X)!“0aƒA7 $ª…‹–bW‚‹;‘“‚ºù±AËDwÛï÷ãØÝ h ÷r‡®Üõœ8!˜1’Y1¬È5CN)¦jnÇzP¥®[„'º+›QµjqÀ|àÎ[u·D|D·GZ.pV½ã± UÔ;±C'ˆá(Rá’ËVÍTM5‡ÐÃDŠ«µ;R'¼Ý,3³ƒv~u…ï35ž–´ä’s)0q"ÖF÷§Úº8n­oä!Žr ª)¶°H“Ì"öV»c­©,„ÈX›uã`ZkcmÏ'ÞUlÄCl<Ÿp]Zë¯þ6"¾whÑnùöP€½±¶»…3¬¬qþS÷,0! 0qû«õ×RíO¦ø†ªŸ×â1³'¨ ø|’HýCÔó$÷t<ñÐáuåùù·ó‡@Ýj-ôìZc%4×K+a1S#f×QuðàÝnÇÆ¡–öˆuÛÅ9Õz?N˜Š“Ÿë¦ëÛÒEV§€³¹gŽk‚¯N ÝUMKŸ‰°…‡çâ.œ´ZmÂnÌ8™9ÂLýq3oWÖ¬#×·o½6v’Ÿº˜·€!d?ŽÊ`„Éz—xs¬Ÿü7uMóÐY…Ÿ}ôÝ{1)ã0‘÷aîɆ†“šºÞ-´ÏØÅ䜩O4‡ê/l3†nðÇFz$þ·mÖN›3ªÞ&>ÒTpÊ;t?ykØñYtž—)R-Κu[5æîón«}¦—@)Ìôé-Ÿû~!ÐY5HÝv7T‡‚î±tÄZÚÖ{¯ÕöÍ"ÿhÔ®âSÍíyŽø¬oc‡™˜?ùxÃÚ2²ñ"úøù(?K™qÂçcñÌ;zbbõ¥ÏÒø¸Õž´UmÏ~þy‚ãó\Ä¿§¹ú7ì¨Oƒ—”y<á©Îó‘‡ÉÀ«Òá±¶¼h!ž×•S¢g>¿YÞpj¸Ò¤çyåìéuœ‚ø'Dí¿ ÉóϨÍ·,î'#Áßó‡ÿiøÿû‡ø_ú˰ÀH¢Ç-º¸¼w–Œ¥s4›ãº{V ¢Ó21òXc>ó\¡ßˆcqcœfþöëï+õîK I¼µ¨Äö &TiìçùuÊ&F 5c@c…«Å]¡¯T‘»Å}¾í*Z{³=žPós,#»µ9JãûÖgŠøð0£{¦KdDãù¿¼¾uô€ €pj9wŠOc ^9EMu"D$ÛvI)Fz@øÿ§î]·$9ŽkM»¸GdVU7@ñHGkÞÿÕfÍ ÅCèªÌŒp7³ùaæ—ˆ¬@Š¥^KT¨K^"=Ü·íýmÎ9'&U+Z™˜UÅ”§ˆ@ÄëºzFõõõJ@bî½ÂZ+µÚ´€ Wí¡ÜγU3¨†™™3&æË’—eAz½¼üþ_~÷ÓÏ?×Z?î÷ÄìêVN‰9ÊçD+!@­âž Ô~x§mú™.öÊ`„¸ï{©å~Û¯&ÊyùضÛýÎį_¿^ówƒDVu—­ #Ñ’²Z^’mR7©Û^Û¦}ûöñNo//oËKJ[‡ ­"£HL€1¦äÇL­=§oß>Þ·²-ËòR®‰èQÊmÛª”VÇH –ˆsNj¸É‰È ?€† ˜SÊF HÀ FÌb‹nUdß˶N©h½Ýp½^‰Aju°52“ª&âµH½—mM« %ë’ï÷óªPk­kb&NK© ¦÷r»—eÍ9¥uIfˆD²×Zª¹’cP¥‚ÖJrNZ*<Û^öº½ßnÿöïÿþòòòþþ.RU5qNœãÄåof3«Qê%{¯ÌLFÎp³”³Ë+Län/ÿQµ”w5Ý·™SÎîÐ󽑗fô…ç'´»^®/ªöØ·mß°› j ~ójZɨÔÂ)“±ZÐj¨5Rº×[cÇ®fö¨; pJM+WUE2ôÃ#¹ëß¼çÝ|;–œ–´d4Ûª©VDP³mÛÃ[’Ôš—LÄ—Ë ˆU«ßDD´ÔRK­L¼ïeÍËï·û]j¹\®Ë’ýî_×õ~¸Ýƒ˜¤ê}{¢Š>Òêj­®•û#ð’ $¯‹5}Y×ZEEEEŠìºØ’Ò¶s’cÊŒ)-)½\Þ¤V1qZT·ËQxÕMd'ôšÀ**UMUk©DNDa&ÿ<º lˆèu]9.¥zëaböI@kSP3#F2JK€²—¢‚F` UJ©¦¶®¿—e!DSEf×10ÍXKQ7·Ö\¾®«S÷K-Z¹ZõšwŒT3Ò@4¯¹‘11º;4d ¹Ýóç¶YdÀ€Ùx]0Îð®qøh!N·-ûr¹\ÖœK­½ cÖÚ¬E%bˆ,ÕÙ4J@>&ŽZfGþržÆÚ®j¥!&Ú¡¸y'-,­Øð „^=êPþ† ±j&U‰G킈*@uŠ"7|(ÂNx0 ^ª‰€ÕÝ’†6ìq†íʨjðñE(W &¢`¦€þ4ýû5z°q?ˆÑÔ$^ó¸›G18á‚Ä­gy"•‡@ßJ&ÀÐf,"zjJ8Çúó-Ÿ‚ϳ¢¨Üÿ½+ŽAmµ¨ï4C&Uõû1¶Bܨ¸h„îšÓŒnU»Š^;à/N‚ õ²å®p…NRR£Å ¢ky4óŒG!%€zCd“öУ¦ :‘ ñÜÑÜ>~užQ÷ z`%ÌÐÑ1YƒýÍÕðMy8û£ÞÛÚ•<+ž<€ð«Z U„—H €­—:´Všqèj¯(õ™¦£ApdSœmåÄ"¸ƒkïàŸ»ñ’¶?QPß8u6üõ3;µFÍp*|­±n‹‰Ýæ|"iŸ©Þg2L¢'»Wàº÷…Ú}DÿÀÛñ u«h9ð™»O2zA.3qÿ0%3ûànžÁøcßw÷¾Ì3ƒéwYO œíö×K.±<øMª•˜ôÒrk–&›3s+rÂð}ÌÐßšùŽ3^{Ù €}6­ª9/)q_Õ{O@O©Êœx;=Ç>nÁ¥À¨÷ÅLMiâÄÌ#½÷k‚|ÓÉp`zü ZT­y/ÆØÄÎä›^ælöék#L4åë§I3É<ØÄxë ™©E4Š|´iø©Rƒ£}BÌÛà´Û‰RŽÃëm³Âˆ ¿4L‘mà%8ÚK†>k³¿Û¦pÀ\¨ '>»ð2}¸9½mÒä¿euïø$â¨d¶¹ª¸¥@ÚÛŒˆ†€©§iH˜6Tõ¶ÄO×çþ?/9n/ÆìŃÏÿ(ÌÛ÷Èíx˜¯älMšƒ%¿d®ÖÓkß%êöI9½gç^Í“õ~˜øÇÖö¨uÛAˆ³Nù³ zØhÌ5CŸUÌΔøþt|;¼%ÏШ'Ér¢N°û¿ÁÊ}¨UˆY%³13Qðøî¼ÿxÈiõR;£6 ø¤ÜÙ~YYþe_¿=ѵà7¶%ü=uøÿ:G¼ý~Éÿ7þßWýÇßòõpêi9z‘7è@xž%a/eŸšG[®M+<àyDÇ í±Ë¹Ovš‰Ê}i8fç}PÃsp+àlýïø(î!€Üzq§œ@4Üâ)RÙ†¾…PwIc‡ÆV¤ßaq R“Ý' Æ~~ÿª?þø»K^J­¥Vsx±‰ª#p˜(Š"Ô* q«õãv/Uï÷ûõzÉ9_×5§Œ­?ÖL™` _:Š"2º¤h‚&ª åvÜn÷í±/Ëb`jNjR ?–ÁÂIEª 3"d"SÄDŒNÚA0qÊ^DUªŠVbz»¾lHmßw€}ßÕt/ÕLÀÔ¹h¶o{NÙX¥Ö÷m¿?¶œ_^_~ÿå­Úåƒ'…?}û3*s¦À•€FDTÔR¶RJ-õýÛû¶ß(Óš/˲’9˜U+祘€˜USÑ̼¼.ˆpY/¯¯/™Ó’óýñ‘Ƕ]/Wïr@DUpzÕè4œ -RJ—ËÅ-«ÑQ\«Ÿºö}ß¶­Ø]jq{Êùåúâ g=a#J y7>Tff‰YͰͧN05,µŠjN´•Z;h/(æRêˆÍüê®@5-*æÀt31ÃÞkh–©ª¨¡‘;)H¨íwÕRATÌ´Ôâ>F6Ë˲,É÷T*RE{®—e!¢e_îÛ}ßËý~{yy½\/îqj ¾¾¾Ô*€&¢Ì´íûc{xe"™i)Û¸ZÀv!8*}n)-{Q³ZKÝKÊ™K©î€s¥IMMË^ªÖRë·÷ŽÞfªT QÕ˜IÕÌs΢\k’=ÓZw«º^®×ë%*²˜<@q ïÞàL%—\»>nî¿02B,54nkhaôþ[‡ë#z3˜9Œ‰Ø—¬mÛ²ñÚÑ eüÔÚ§_¦ó2JPãöOˆ¸ä¼í AN½&‡‘ª¸ÂÅÑ Ð€ÞyàÝ¿Dl&­|ŠC“¾à¿ºÔ²m{ð”F¹Åi L É:zÈM£!z‘5ŒF"î0Žù˜ÝÝY 0õ‡ÑÆÜ jmøáþðhtűiª‰™º?Úõ}«f¨T°Ääõ^náb…ÓT•‚3 £H‘ƒPàÖ^⬨h@R™BïhjÅä]KTON4¯›µø…ÖR‰1w‡þ`Vµgvcû2×Âm†4 sÁµ¨j„FDÞÛ€ãhj-†=íUÐ+Ü£ì›A}QQNåUí낉/¥4¸NÍÔß:Þ›wج™aÆ?(BOH¨×¸`³„¹»‹ãөܱeÚI.m ·ïuÏËàFA[‚¡0Æœ¥u8w  #€ÄF[E¥î!A¢‹Ø[¨!¶I‡ ìÑþÒ@2€@ÀÖ Oã~Ô첓mÅGbã8oã ‘º fª'lÏ}RƒšŒf†Ôt ˆÖÇ¢kk.#ó.M„( k2ªuèJkQîmµ"Ö"*AJ÷ž›xÐè4³˜š¨)Â`¸ AþmŽQ¼­‚ÈÆCÐlXsQU?hÐ\vêô‹#Ö½©- &pIãľÂ+-Ü•ãã{Ä Ò‹ 4i­UÌ=¢¯‘_<”ñɹW0#Ú©Cö‰xq¨ næz¿û+îw¾‹ ³»+`HÀœÖu]–ÜøþI4‘ƈ××(—;öÖÎ|¤þØúN°qó#¸Ö†° ]~„±ÌßX.ËÒôÊWòS•ÿ´þK‘AKD[ßÌ\ü‹8…Š`TMýó²|" ÚX?@¤”.—õr¹DDO¨­kaäEà@òÑ>éGz›Ø´¾=Lœ@D¦ÁüA•ž/õYÌ?úp±W¶ÎÛVß~tÎά’ã½iþ‹ ¬Ù0 ›öxUû7m®Ël[_ªéwà0ªö‰åÔÆ:yqhìöĺ°ÆîÒÿh2Æäׯf×:¶N˜J ?ôØ<?áS¼Î„Sá°@‰éÖ¬Í7gÝØÆû;ýlœ¤üùÝœ;ZVñpsœôQÓçÅ©³†Á§Uÿö}'ö,«üžoüÙ÷ÞW*œK,fOú¸Eâܶv·œÍçxž™4ö4YèÔê'e<Þ©éG›ÙéyÚ¡vûIò,þø¬N™l\êýãjŸ¨ß§Šàa5ùì§>KÃóZ3g_Žªû/«ÿÓ¿Ái@õ1úüW;½ßÃBÙÄÁ<Íˆì¿ØÊYü—ÿ±_ñþÿÕOüïcÿÿ'Ðÿñ¯Üß/™ÆÓ Ï”ž~¿ÆÓ7|!Þ IDAT5Y9†å}W8´åyéõÃý,ÜÇWÌÓ‚ùƒç¹„Ã]>ކ†6² ŠÍ7pãÿŸÞ×iãÔE}·ì©’Û&ØF¿1à˜e‡W÷¸ƒÀ€úl¾2¦±ødèÂðÉ´]6Ißö.äîýÿ Á}þ †±ü$Q/¼UUЪ‚ªª’Sâ”81rb†h¾Ê¹65SN¸^®µî{Ù ±”Rk­¹ÖRo÷û’30r&&@L)‰¨! à¶m·û~½, HHâ³…”DC¥2Ò^«˜)Aâä/ç„Hy]ÜÿkbŬø;tÉ«^­Öš˜¹P%~²8‰•™€ò’l¯»?ùqLlwî²ï%åÄ„+mÛ£–zYrâüóÏ?×RíËÛ—®¯¢Vj圷í¡a1O"f(9™=Ju4PNÐ¥jÎù_¾þ.Z ˆ ‰PŒ- QCd'4ê1áš³+ºÄ+‹nû·[ÚîL ‰–œLÁ8±x×(1†q …€0y—b®Š¡ŠìRÜóÅ„¼fJ$¥–RS\K1Ó}ßt¥5q°}ßÌ`¥ \'2[9_.Ë_ß¶½ªÙ%/Û^ a—²•ý’sJÉ JE†´—ò¸ßï'Î|ÉŒq:Oþ7%02*R9ååB‰Ø@EŒˆPÍRÊ*PöH)©‚™$Ff*¥N èpv””ØXèþx”R¤V"3Y×uádªožÙÔO•à9j ×+ I¬:ß(à°9¥%%åF]u nBtÀ}´!PØ€ˆ@ ´Co—œ=sà'›R ç̶jXz‰ˆöZ­ªRBtã{"UU25°”’TQÓÛVöz¹^.—Ë’’,ÞT|Úĉ³™rJl¦l)%ß;Ýîûv¿^_.—•RNÌŒ•pß«S¦9‘ª«™2“*zÑ«ºd#¢¢L1ôj¹ú%Ç«RZG!ʯ/¯D¤*)%$"Ñγª¢ªû¾·êÎÐ ½“}Ê¥ºí»hõiJy]qå%1#,Fêý´ý¨Œ }ì£;fR€Dd†ÌÔO¶ýœ¯flq2©¢â6òÎÓEÌËÂ]‹1#¦v(Er:"$f¾^T-¥¤&̨`dXöBL„¤`ñìßB>è¦8"'Gì™vÛæ4•^‡£mâBÞ Î¤ªDÖú!¥ˆUÍãlˆ”Rªµ–²;éË :ÍL¤îû®"¥îkîµØ>ð€„MÜÍœ–u³RöR«ÔÚR.‚ !rÊÐkë'Å ;|;`Z¥— ·~Km &ò+Š3{ƒ83?½ ‡ÅÛ1§ÜEùÇÓ'ªá¸÷¨Žš"¢vn°O9Z0À¼Û]rÚzQ‹ Dí/Ú…ÐÌ E›/Ùºk+ÆLjÆ.I0ˆ!æ%5( ¶VUîõÈíˆÙaaêX‚(PÖ H’OÀ¹U;ZdSŽ'5sF-` J1Ôù(yÖx€m âÙ¶ð†O–‘£å3ºÀÛhÅL[fþ‹Õ¡øÀ ߘj‰ÈC‚ÇÌæk­/¡_±n#Ct 1q®~rõq €N°¨ô03cïuhÍ Ž¾vL „ à⯶ÿX7­)¥]Rs§¿£kl–æƒò‰€¦GråD1ÈK ùx11Gî¼ÝÅí°$¢X!gtwÛ7zXWAc`ƒÙ¦CÃ&ëȧQ€ä#´ÝHŵ?`*"**¦.ø)ñ‚á¢Poi÷kØW3ðþmgë©é+2±\ú…ß¡x£ fL±\wF™µÜžµÅÓ&ãPÔ÷°ÈØÞGJE}6ηžZ¥‘ Û¥¨òÅ–F¨¥Ã*ûâé`zD/ÐÌ£bŠ4±Û•ýÔzÞýbÖœcoW[jœí™R¨Q†Ü€?6-t}Ð]ö–΄q?eº~Ì•ÛF®%¨Æ„fØh0{"“Z=ƒvžÏ¾ïµVßdùXŧ³NÎŒ÷þøô{rîtžŸcÝ æ#B]O°{›c>àpødoZž"ê„ÕñŠ™ù ºÝæZ·S%ãª0•¶‹¶þ"ÛQ´´ÉKkp`º ŽÉƒaéëc×®þ£\“ìG¸­ÕçÀz²C#gÃ]眞L¼'}hc©œDæF›œé~³Á“ÝŽ“©yb0_—6éÊ‘t >©?ÓaÌ>uQv÷M°éÒk³b;ÈcòîÍ'6Êg$_Éû˜ØZÆ`6â·¨À"àL—|¹®«¨{Qà ˆÕlÉ QÑÍÔdÀ‰—”ŠTU5K”Ò…›”¯¯R‹{݉‰ U„ 8‘‚(sòSµŠˆRFF¡‰)^J¸]2gd t/¹å$U l­YWÛkáD²ï`ÈìŸàº¬€°ï[)UÅ~úùÏüÓsZ.ëå±ïš—%¥%3Ýïûí~ù—ß/y1°ªÍ´š¨\®×ëË«+'*"WCM9iÈO¨¦*&X6Ù·­Ávå?þðÿsœÄˆø/^©ÇEïÇQ¶}ß¶­”Rj‘Z™™˜3§8ä‡ùsÎþš°°öRJ˲˜Ù¶mÀ «mûfjž=ýQD(šUQÑ‘»mgÝÊœ\›&Jh˜k­R+Å)ÄÉz™Žp{"ÿ±™V113™¶BsD¿` Ì[m Øٌ֬õªÀ„JÄF_Þ^EÔû6¼ó¹…ÄM½¡Ô€`bZQTEêëËëõrB$ 4\sjÜàäz¥D_sSfSðŸODœ5e‡ˆØÆ1±Ôêfle&¢u]Íìíõ5„4-V›6¡D´Âêàr5UÑeY;š¥Š”RÕ±Ú„ŒÉ›Àý©R—¼:Ë%]/9åvoR‹Ï‚±O¾C˜£¦ªú²5õ6V&*í~Ö¸F˜x’h»ôŸ™ dqà6%5ï GgÄKR!3º,ãŽiO~xí¨9%£9‘  ºÙîEŠœX,­âƒ–Ìy+µWöÝŒH p^S »œÊ”|¬•ÓæD‡³¥5 Q&t%o¼ôuÐûŠ€È DPhÜ[Í…“¦ý³nÅJݽ&‰¨•Ã¥”å/#˜zë‘K%M_ S¯ë‚Ç^kaN­¶¨õ ªã ½»Û7Ĥà­í:¶* ´ ™šÉÀôÒ†úMž©Ö•Óöjw¿›cN™s[‘Lâ“ .«o ш„­Èr4çFò-èó`œ©¿#ˆª *ªt( :,jíÌê^uï¸öµ/R}†þsÇõ’Û®¥Ø\‰'ý@qÚsÅ)Òµ<_¦"ˆÐðKíŧæf‡¦„G%(RëD€äµ!‰‚ÔGŒm‡(ýóÔ|Ó6 ±a±œ’ãÓçöW3cDYɯ—­¶¨ã‘¢û q¼<„Dh K˜ŽY çµ^ܧh‰iãÎGùB¸÷ýš¦É-ë;^—ÖÛ° ¥ÀȺ…]‹i?{€dÐY4(jc`ÐZ»ZAØ­ŒCLÆÖ 7t‡Œ«QLá³[æ„ ›æ‹ Û2£~½1šÖÞš+jæ¾õQÝŒ0Íþ‡*ª¢Ý>ßWÎ6z”®/4Ô QƒïK«‘ž?È Ú%è¨øö…;r|xåD ¸ˆ1OEŠq† SˆÆ·±÷7ËNÐŒ®þ$õjÁŠî¯4£‰2ofÌÌ)a»ŽæìלQh?E¤Izþo€wDdHKoE^Bƒ=Ià¶ÝãŽé±-¶MOK@ÌÃKÑâèoÐmIµ¼h1Sm‘…æú+(m3çˆÈ¸´èU—Ôí(aa¬Ïñ‹6ÿ £vüñiD÷þÏè¡8«yàª7üfŠc‰ÀjÍÕVÓ×3Nþqs’ êܬyµ¼ã|Áç­>9ÁgSã`›M™¿sCð\0fÏМ,°}œM~‹¡ƒí¿¹ªaG¦¹jh8»ßŒSÏvUŸ¤b÷ ØI¯s¡­ãÑäŒG!{|âæÛ±Ïå©#GònL.Žm­£Of&€’FAO¶g;…<ì &qr#Ì5ó£ïׇMÍ”]©ÿDæŸ~öI‡3˜tÏ­#qJ.ÌWlÛ°•Þ¦k^™ßhjÆQlÃø×ïÜ?1ßÄX²ópOÓ>çÅniÈÂC!ÀHeF³Z?çvæ X‘Š}íÙSÿ©ý4ó8÷„Ÿ03Ÿd×>ùÉgÞÓ÷Up;­t¿"éÛ'èĶ}ÿÞ `óðïøç©ÿ¿ÍªoÿÈÜÃ/<Ëýÿoøzüœž?¥yg…jüŧÔïs‡Uḛ‡ƒm YŒ¯Žó´q…ÁìyÁ9©Ó-÷•í• !zƨxšÄÝ“þÅt>#£B½'Àw\ØîVÎoŒÔæ8ùbšîÄÇDÃ$gÑí—â‰å6ßÒ„ô9ÀzüôÓ'¬á÷¢+Ç•¦ þ(‘û—‘(Nˆ‰yIœ:A Õˆ£hÎM.¢.øYÈKéÊ.ªfr«2º5¦öœ7BffæËºѶm÷}«¦¥Tˆº¯Ýþûr}½\WE,E  H](ç”R"ö–3STÓRõ±=D¥»iD°ˆ0ó…F&N)1—RŽNc$BdÀ¢ î8–RÞ?në²&JŒ˜3'N†¶,ë?þx¹¬Û^þôíÛ5g·å'JÈd­ªj‘Z‹ê²ähs{/#,”–%oû.*J@‰¹Ôa÷“µjè‰df¢ÕÕäJA$ö'’SF(… ÜïEƒ¨¨ª[ÙÛgXE…ˆ¤ºr'˜ Õ°–Š.™{í)B¢”s"ÄÄÉõÄ”DÔ pýضýþa¦KÎqBD[sRɵj^i}l?ýüÓ£}v¼™¹äÒ9A½¹ ‘\øV&v&rc ˜cÀ;Í9¥Ô=ìŽ[D$J(UŠ'îlXS2­Ý֪ TM°¨AŠR©ÀZK×_:š9SOV©(!U¿suŠñ17PÀ¹@]¡¦uQïÏ0»ßïµÖ”sÎÉ_^'P`yì;!ìÛŽˆ9­…‰Eýº²ú›1¹£B?R©"ÉEêVJÙ÷ËzaDmí¬­†×ž†ÔPQ¨fµ”oß¾¥%Í÷Ù½_`S›=ûÇ9ü¢I-BJìö[è['µò¡4Ô½ f€ fŒlh„ Ž3 õ/¶„dÜ`讥RûªC¦½Ô$ªV±wZ6ŠƒY¨ÿN‘áÏÙI!Š!€YPSÜçlÔ8!êŸ °Æ¶î/r·”¸ì“d uAJ;>Š­*'Oß'@ÕÓƒ:ºzûÿ Àt—=lVѰ¬ˆ‰i”«Z—ª[É#Hç¨Ô³É)بîþh†ôH@ü»væþpÌ—mää3p”QïÙ•ÿ(h’q³ÒŒ=;6(?‡ì@!µ”nÔÊÏ@ìa®&¿#¸?¸i: Âh¡x–0<Ú6²¾Èz'„W_{]<`+縼4D$°™å &’6cv ðâ€h(¶9SLЪ !o)g"TQiÄ h¯ÌÑÔ jr®Uj­8ŒÏq— µÓëO¤é¿êÂIíý®¢JÃ=Ý­¬R{ƒ‚MÀñØ`4³¨yüOj<Ñɬè;ǦÿŽƒ˜96«Ù³!¶—ê;ÂåͲ¼ÏÐ ª†¡ƒìpˆˆÚz鎶'á¤7Î…´þ[£¯Ð9õ]Ä?©ö¡v6 9·s/ë¹™ =¨&ÒÎAñŠ!qJÔ:>z¯ø,ÖO£°*Zku°^K0$¢éHk­¢SþGÁ\„‹s‰ñx¿z'Y—ˆ½Áºw–ϱÂy×ä/ž{ÿOI8Ày<ó@¿)Ž0µ:cëÉi«+˜µIœ~O?`BháÆ&Næ,_ôoWš¾i3_|æiZþ:rŸGÙÏð¨|õÕñ`Ö?J(‡bDœÎÑñ…:Å0û)í´ ÆM‚ìPWŸªž:o­Û’ÇüxôE|ª¼öi®upY—†§AÅ9ð¹†XsØíð]6+$ó{ÔÿÓ„Ó‚GéàŒ‰ÇöØy26É¢8]cm¤™^tjcxÉàñéd$ìöõ!Ž? *žÊ*èsu艹vþÎc3Å/+¥S™Ã÷¤Ô™øtMtc+Núõ4»C8Äwì§|Ç~#óT8q’À§2U¯|‡cϪ¸…lü®¨ÿ‹’®~Ïlo¿ªþ??ü-‚.žòAß}¿qº2ÿ®îv„_qþ‘2øoSÿÿZü?¡qÿƯ?×̶³ÅàÑ Ì¨þiIØ<œ?<3™mZÌéxm†a¿U‰P›d"M¡‚޹ò=.6ŽßN[\€ð¶Âó°nÐ~šïÉ@#_…Ø¢²ÝCÒ‹Òš=^’®ë·ÅV"7hEÛ+x¢!è0û5ŒòéÕsíq>ˆçÛ"™ELú;‹þÒø>×¶3**].×·ë˶Q5QQ°‘…SN¦ªFnPuð4Ɖ³ j-9-NªSæ”rbâ5-jVE Àbû^ùåí-mÛæ¿š ØSȘ— ?þðu]ó­Ô”MUö÷¢í%‹â­V1~D\ !àâú)±£MØÌŠT¸=6bz¹¾˜i­bªUuÚhÕ •~üòõË—¯·Ç%}|pâ½È—/_/—UJ©·Çý¾äk~‰t:A©**&š‘‘#Û‡’šÔ¢KÎ \k¹o»Ã”*±WhªÚc{00™˜C v+µ5!ça1'&¨¦  pAFQcœòËåº×º=6?·6[±‰ÔRëš$z»¼€움&ÊaþM˜—œsvM¤šâî“?èëšsbbx{ÿÀœr­BŒÌ¤"‘í²¬˜¨DxCL™«T¹×ûý–hÉœþøÇÿóíÛû^w'.T-_¿üðz}U÷FF‰¬ªATÑ÷}ß÷²'f¯êe$©5%º¾¼æ´¬Ë²mûÇ탙k-·[¹\.DTkÍyé¶bß©;•ÞeÊ—Wv¨«›ÜmߪUJÝ˾×RÖeå”|5%¾­J%LýŒ—ŽªZD¹ºÛ_M{l˜‚;yÃñýVjq»b?J’‚Z¬j¦µ¸JÀÈQn¬*.Lƒ…öìºEÕ‡Š"ƒV#ÆL,î¡tô ‚ªŠ1 —BSBÂmÛ Ѷ}[–l€¥M)ØöØRJÞïZ¥º:q.²q©’S€Z˲®ÌœS058!U.^ýí’uJlfû^ ¥è ðÿZkeD2½Ý>®—ëÛº˜EvKÙK){)?¼½ùûÒ!á.¾Q#ò'oÖȈH±nhÙv‘mß½+µ”Ýñ„@‰×u½®kº[­¥£±E…Œ+%V07úêú°‹ZØ-½A2JH>ûL‰öRo·u½øA;·bfd/XHží §Š&§ð»k‘Xj©Râ”í®»×çú -§”s"Sñ›r­ÂÜÑ™±F4³ Q`ÞÅ Aoh-¯~¥§D ÛN"ÞnË¡&4[!z$õ2·^Á *RÊ®"´^¸•Ó€’£&b[`ÍYšòA­f2† ma*‚©Hû›Tõpk)|0+µøT¥Ö ¶—RjuT”µgÑ3í#ŒnUe âK)gN©JUiî>"Oñ@¤<šÑWÁ eúÎhÈ1j@È@ÒìäÃÿ…ƒÃlÎ ™vŒHÌl¬{¢–ä·ͱS).!ù¹Îßj"à ÑcÞAí7PëÚ»ãšà8¸´ÙE“+ƒ™ à¾ù£‰c€ Ä^‚m#—n¨Qdë?Ð÷n`€¤Ñ‡Û€Ëz9”dáØÖ"³«ÿãDÑŒ,o_E›1Ä>ɃûþQͤŠ:<ºö7³ã= rö —Z‰ÐÀ¨òÁî“7°€É@ôU¹ÀAí=±h»² ûP´æ¶6ÌΪh{5íŽ@ĦCö=75ã±ß[†H|Œï7û45Tñ‘cÄÖ4.؆ÞÝtGC¿Æ'Ï,UCåkÈ4¼‰&ÿN÷RìöMÁŒ ýꕎi NâÐò|…¦1Aä–,&u¯}èºNhòi7S(Ñb4B@o qA3vˆ€ÔZyÍ3©®¥Zû.çÅùˆ=Œ!îH·˜ªÓ•t"k %j£ >Ñt†ú3{“p\έ®§žk¿"8Lé`01‚ºÝÛÀ2-)±ógZNÊAÄ{ªµóŸz`0ÙÚ˜üö!¢ªeVÌ'vô”*¢Ý5? zjaîQè¿î$pwküä”ÖV˜£HDþŒ¢ï§ù-ØmâÑÅ=Ù Bׯ ½¨¿b½tÝo óîÔ ˆÑ­ "Rk5ÓîƒcÃôdM¤Î#“°¡ŒôͧOëžÇ$ãg" °Ãñ=ÀàË# 8†S;,+û:¤oR±'§ð0…DS‹õ~òÒ‡7þhºÇ™ÕÓÊQÆÛªû†fˆÐ*ãÝbu´´7Ïâ¤r·’h<& Î ªudדsø`¦~ãyâ‹p‹Oè#Ôî¢ï«õTöd0úo¢É¦¡€ŽâÆgÚ+žÉùýåž¿¡5)O¶ÓQJ0flÖMžØ>ÏVgÓ©g÷à_}ĦH%ŽfäcæÂ¦Ždœdî) Ø}¬A»8ú§Æh;‹Íã…?€’ð$·Ï* 2E}N‰ ûD2›ª!ìÅOI;<èÙÍp¨Pè—¹MfÓ9°3,lOªþü6Ùü‰þžÂЧµûWÔÿO^ìÙº¿¬lÛü‘þ|ðôŸ‚GÕÉ÷:žSløs.ãðàŽÏ ÿú‡zZ‹ì³ºáÿµ»øŸxþºÚ€ÿ.Ïõ¯šà§#I’Æã,Ný!åÃBØtú8ÐàyJ?þ¡Óüí0šÛ{i˜å ŽÓˆçgÚ+p)òvý5•oZ”)FÜt¦Ê`:L4­av›Ý­Û‡ ˆÁ4þw¼0Ö_€¶êO("læ¯ö/{ŸÜ!Í{c hªECmýt6M/¾[ÕsŽ=ѯ¶„²n$BÎy)^Gö”81§¤ŒÕ”UM´Ôê"»–.Ý‘E”R©Ä„Qú€ÔZ]óò‚>QBôd6š­ë ¦UŠª9­ôÄÉ¥gL9¢!½¾dNI¤º‘ -²ÏÖO‰/)9¸¢-—KÆæAR°Ýc°*ˆhRW^–œà®Û.â×—oàE0çÄ—UYw)µîef^–t»o>Õø¸?îÛ^¯€)§NÇÞU‰9ŽÖ "N”œ³ÜõN„™“÷ñÖ h@ˆ+/›mÛc«Z˜˜—œˆ!€ÙzÛöëºrJÈLÜÿ `ÛÀ@P3ñÂy«•Y’û™hY²¨îµNz÷a HœtX«p"©Ò Ä”˜³ãMiŽH> ÌÌ^E°æ×·—·œÒÿó`$FÖªò@¬¥š*1þÛïÿ5ÿï´[½½ßJÙ-V 1›ÚãããOþ3 ¾\_±î‚Hùøùñ¸#'1©R•↠IDATê½ì»Š]®/÷ÇCAÊ^Ö唘éí핈Ê^rZ¾\_ é¾=nz÷3沬ÄéçŸÿr»ßüáÇ——×·×WJù‘xÛ÷ŽšñC×’—aðoº§»Ã„ª3 €ÀÌæz—™ÖZ–œs ¬T1ƒªAÝQQ²pº!3¶oÌôÃ×Týbv!˜GOi©{©h–. †&ãÐü^Uˆ”R&bæ~¾2„ “D°íj¦„ä=É¢b*~”Y9³5Të¶Ù¶ï~ø$¢ËÅòëõšÓRdß¶òq¿Ý¹ ªÌÐùö£(v¢iñFeCG[¸uÚ9õâ~jÓ_Y9ç¼,‹3‘K­„T¶Zj-ûf`b–Ñœ Dá4e"bƒ´drž”Ôr+åãããç¿üeß÷*òr½®ëšœëŸ2!朘€ùèä_kU«&!¹õØý^ ¬Í|[R"lþM󸽧(öR¶íŽÄÞvêêW‚WâÞjT—ÌTMMÀ˜PÕ¹ð($omÕŽî õ I¤V¢äH£ÍÀZݱ†ºHŒb¡"ÆyÛ‚”‹ª“ý»©0Ú &)'%ð ]'_wª¡u`xcETä±=j­QÅA®>;€1°ÏäRNÒÆr3rzŽ."ó=ÝM,Á'WÈ)Ñë 'v@œß«Õ‘"?aRE-=Î>9¥u]¼³}æACPŠ]Í5ÜØ¾˜A1òŽ\OY:s«»Ÿp>¬z&˜2µT;7ê;$è4_z‡^«v²_wˆS3£Ú`㩳³-"¾ÿÉ9ªD-‘·„[5îÁÖÂ~ ¬Š»‡Z”|ÿæi‹¨hû4Q:XJ ‰ˆXQU«ÏÖ4ÆÃÖ¨%þ¤Àܺެ'­Þq€ÚÃá ˆ½®—ÈÝŸêþz÷£9ÚƒµÔsíœçû 2†!qŒšpŠ-LÇÛ¶D@÷‰»¸½þíò~RôQf¿âµJE'f4(§£ì¡‰çv®ÀkA~5;ÚLš¼âyŽ&«7¶=§Ñ€M¼>Æéa3`"¨—[ë"Póm†1Š]|ÄíTríÝ 6­#yöãJ|S\ý^nE1aòðEZAA±Ù‰œçFL½+ªô»9µïò•rÀ`¬Ûß,æ8 ë1âtvdd\±¥n ÷ÕÎzö‹Í»‚k,ÓBÆ£±}¾ÈGÿp›ÙxÂ5 ‹DÔ›!FÓ²áèø+ü,+Ï­$ƒ>ñ„’oóé3úú€ÛÑr˜{5Eïð˜úÙz ´ÕÑû„ɽӸùÃÑÇZ3g}¤¬åêôù9 -a:"û¼°V¼2çí]Á½± ãªúö(öZñwO\ù}$î§³Om*AöÜIQž‚ÖpZû=…`nRnȸ?ƒïñ-jç2BæØ±-›¦“ô&}p¦q;¨i“£~âÒ†ï8Úú#JfgêÈYÀ´ƒpûSèeÇxpÆÏ>ù“jk! ÈŽ äÐáÒ²3ðàéwK¾ "Ëh*ž<ǧˆ“ª‚våÛ#RÈø`¶i‡ÌŸ“ƒ@mgkã§CçÙ-SÞI}6ƒcÑ/ P¾Íì!hÙ@“ŽFh³ïŠ쯖Çñ;*á÷Þ“ÿŠøæ¡ü'&ÿ”úß¿í[N¾þcpíd«‡9+wÎÝáß2T³©PÞºÿž#€­ÂwnÔ|šôw·Û4öšˆù¡ŒL+Zø¢GƒrßHcŽŒm1³ãvÂMª-0H` Èý‡4€óéЉҽTæ3 Ž­Ý³k?pF4}w0£ø£qÊŽ£Ž§…t¾ï>Õ |’ÀïML“ЏRÆ)‰å R"bLfEÔP«È^¶Z%%¾,­µhíâåœÝÀâ’®I#5«>öÍÿkÜmż¼ÑÜD#¢ Æ”4Bßæ&@{ì;0©W&‚qÎUêV‹-œ½ù‘ ,甈ݭÜQ¡)%×mË©*Ú¶õ¨f·mó®Fff Zþ×ï~÷ØK-åçŸþò‡ýö§Ÿþ¬"¯/o_¿~Õ"9…H@H‰SfªbŽ- ÷YÛ¶oR¤0g1{¹^ò’Ô,š7.¸Šœ3;´ÿ’—uYô®Ä;™ ·Øå¢@¥Ô˺‘š$$bÊ)@)«íZ”ò‚™Ò™ûív—R_^^Ä=¦XvÄ—Rþòóûvß ,§äcÅsÊ—ËÁŠJUGµø‰’*ˆ"ñ%/ëu]r¾}Ü`½,e¯ªÂÌîÎY¯_¿~}¹^ÿ|ÿfj/zaN¶kJév¿©).l ¸Ýîß>¾mÛãö¸×²¿¾½½\_Öu]òªæþA¹¾\×uML{)RÄ@‘Pª`B7ûÿ|W±ûí~¿3QJéåzåœrÎïfvÜ'3œ;Èd”¸¶ÉLBMUDÜ`NľÒ%J~™õƒ®›ÂbR¬sЏŒ;ý&KˆABBF¼¬ØKU­/×kÎyß÷Ƕ‰˜™–RýAŠ™šyºÅû'ÛAÈ<™ ÄÔëÊ„„Ì)‚w6ä¼^ÖöZ¼jÉ-¾;–ÞŒ nšÏ¤fÎ ‘Çýñþí=圗\k…o·[-uß·”ÒåråDfúñq{{{ÍiI¼£‚™ŠÆÁ€9…¦CdE™’ª¢!"?î73HÉ&*û}_—u]/Ìä x©5§„ˆeß?Þ?¬–òåË×˺€™ˆqÎÉÛŒ«#‚™”Rn÷{Ù÷Û"jD|}{ûñ‡˜)qâ”Luß63ZD¥É†æïõ Jàži"ÑZ•hì»EÀ?Ì]õ‹ZwUQ­"Û¾}¼ßÖËš—¼. ·&CŸð‚ µð¼V¡5ƒY+²%mTiUSÓÛý®jÞÄ€€µV5õVò®8YHD P«¨ZÊÉ…Œxó;OõvÛ¤Š!0aÊ z:PUÙÅe¢”˜¬–ÝÝ–>! ¢ÄÃ'Ø)ÿªº‹¨jÎù²^fJ²Ë¶jæúœ”º•RÜ‹öÅðptü][°–\OCÄ%eÿ « ’]ÖÐàD]7KKŠla^¿¹ÔÆâh…Fˆ¼rìˆ!˜a­‰L£ŒLEÁD•€ºp‰MB…¥NjØ¿9ƒ0ä!¡Ô%XSmüâ)çh€¥VjÁFB"k”Ù陆ö'ê]ãk0žc¿è¦ß ¦î“n‚)6óØªøb祯QëiÝb†;f±áJ$Œjähéj,š1G[©)¨J3ÄÅCI§'‡›WB{¨àäƒõ­>ÆL˜³ˆ*¨ÇÁ| à¦|Nìä7©ÕÓNLâf‚¹æô A1‚¢b}HÆÚzn|™ªÑB¹%·ó{O¯¨EäÄ[È”^mêâthW×mOQSe‚¨>/@"î*ð\†Ýà.ñó5~>Ävݼ*,Ø>ÔN>¡?ŒcÛ"%R-'áõÂm\:u4çA M §îœ®’Gþ,¦IcrÓ‡§îß…tMlòÛ@€ôÄ!Ó ææº¿¯ð>Ðóµ¶Ñsç0t@Wûü‚OµÆîˆ\θrTk¤ÍÚ4lvá·¿ùõ0‡*b 00f"$0·yÈ1ÚçzüÆ7*<í™­ÛçmÜ[¥ßØHY©½¹ö·§-Ñø$iŽ©À€Á§zÊ\Aosy¶ŒðÁTþ:û?}÷ëædÔñ§|Lg÷#ï4­òt Ã-Ñð„ êl4kñè8ý±6§Åp éÚ`\ýÓíÉšã¿­”®Ñ§cÖÁ»ßÒy’~§– î–l”Fl„}l 掌¥¹ N.þÌÔýY5Ó’BÌú¿™»É{°¬•>Î~ÿ§é}öiÃOÂ:ŸŸšsƘÐÓÌ´ÒZk­µÂºª™Ã©‡ ƒèh3ц¶°Ä¬Mƒ"3!'fŸxxË“ÿB!( @žJFÂTk­Dâ¦vD`4%ônÉhm»o»ˆlûæ5nTRó˜ˆ()jߘ6}6NÖܸÝ|JD¦V¤šêõrÉ)**ÐÂÙ2Ðýv¿o÷ív3Óõ²¾¾½¬Kv,ª±¯k¾.—í®^Fg¦ÄlV¥èc¿mûðw¼&2È fÌ©JÜÜ'HH^=¨j„rJDLQ kVT ˆX-™¢åLÅ V+ZÝ<†™y—*¹@Ý÷ÝÝËÍfà|q³Z÷÷²ûY‹SR2#Å˺|¹^þüþ^DÄLEjÛ¨ ±aN9aÚ¥|ütËÄ9q•*µþé?þ  _^¿|y{{Y^éö¸mûCK½¥œö­îZoïÇÃ1‘J)E÷m»¾~ùá‡×úú¸ßýHå¾þu]™ù.ï~œoõÔju/Ç`L>tX·í±íÛº®¯—ërY/œ‰™~‡/×ë¶ï·÷÷o~Ì)ïegâËåÒÍþ¿®ë›*äÌDÚöô,ÜaSjT´ »&8.°žÐGôQDïŸhx53pH§eɵjÊ‹ÔÝ .Ñ^ë~¿§œ)¯P2"ÊÙªWñ>ançæU˜Vd5PT¤DN±WÌK&J€!,±‚‘ŠTJÙ8œmD€ÆfKZÌ/â´?îµÔ¿üôþÇ?üaÛw0H)!ÒëÛëz¹”REê¾ïˆ_F‘º'64ST0TA&W™øúÅÔöZÑ`/ÛÆÛcß±Z©ÕÀj©œÍ´”bà†wÜK©¥Þo÷œòë×/„R"õ ¯¨úÄ´|lÛÇû{©…(ú9ç··7Ÿµ$N?|ý±Ö}+;¨ÔZ‹Ô½V‘šRÊ9ûx6´Íádrw$9¿1 ¦¾ø¸‹ÙßGßà÷»*JGmY—u½\Ö5¯ A­Á¯€÷&:Db"«5%„œo\Wn´¢‚~eš‰TQqltB¨¢·<`Ì¥h˜§ÐyV…vPE  ¹´ÕÌœô쯉?;•¨Óðš_Oʾu,Ôoêh^ªÞ6ìOÕs®Uù˜ÍO:_k­µhx®!ã¶{§“ÉCª èäA‰Äê’¹°å>aìùë‘R÷àH)»ª®ë¥“ˆ 3skj ¨‘¿­zpuKBPDŒÙL Åća$ Ѐ-m?FLÜüï>šPŸº•ßÄÎñ•ZÁPÑšy*ý"—={t¥ë³8¼¢ ‚Ô-hê›IÀX) ûæ:„ û¤¥5©Ûgp~ Œ5Äî&Ø5WEÏ`ÍfP<ôØ&D! z•€‘š‘z‰s6h&Ó¨ƒM†Ð-w2Yì(µu“t_ÁXÅYÃOŸ­¤wü@k?N)•Zúhyú̶ƒ)â¸N´"h÷¸Î.âc¼ÑÖ¾E´Våêü4,é©w$êZ½³™åœsΉ©©±>9@ôÍÇÿöŒÔ"H~*n/»ŠŸ_¦Ž™¹.ïxH>ÅŒðØö9à{|û„ÁÃÛ=TjœßWìrïÑ´n-‹Ù¡øaÌjb44&!v”²ŸÇ@ƒ›ëƒºCQêÁÙ?îjÖFÎOÌôcAñ×:ÔÁóü#Ï}‹`ãëNU6‹ãOðñ·ÌCŒ6ñ”«ƒÇü(X›}ÞäzБÐ@Ÿ„,<(ÍSƒòÔõBƒ!¥Ÿi»}ŠÑï\mCbÏÌ•é²Å_¶ÝGW>TØ™¾Ðá‚Ç7t< Éi>ÍSyòùâ:÷3ü‚äÙPûx" †ŽŸo­…ûˆ£žêôˆž5+;ÎM¾Scð9îçèWÇ_KFf+6,À§äã±¾Ù~-ZñÌ÷¿UŠž¼ÿ3™+Âø[„ì_eýFÙþ?'vÛ_ù•ÿÈ9ÁólðüÿÆ~/ 0Ïû";÷„vjž"u8—ôFÐñ·bc˜W±ìÞ¿rÎß÷u%P4,c4MÑæùâ)êE=@Os“pGÑq\AÝTA‡b?GÏ$#D•Y›a¸=ˆ& ©ß¢¬P½xîVžÚŒÍ ‹?€s«0Æ9mnOÄs¡ =É÷xø/ö7Ä_0qJ.'£Í¾ï"⢠z­¨SœcÎH &ª(‚f¶äl)¹)ÕÛ™×e¹^/^9+"€˜¸é¡µ «ßZDTTˆ‰µ–B½ÜÐ"š[¥º´ÞD 3ˆÒ„¾å³:@ÎiÉYDD! ¤0âi÷l(Bëˆa?ê˜Ùš—­ìüÓÿYˆø—ß¿^®KN”“S„Á˜Öœœi‘(me ·ç,9AJÄùc{ÜË~ßwC\–ÅŒî_®ZA-1Ç]KMIÙ˜™·­" M‡«%eÈ™™Ô”+ )ˆí Xb&2Xx€*ÕD¼ÝÍLAåý¶«*çœ\1È)¥œ×¼˜Ñý~?ç3ù¥¨ ÷; ¼ßîˆhÔ 2T͵ˆ½rc³¢¤%¿13óãñ¸¼\ï·›#FªTñè¿êëõ².k-ú~{ÿöíÛûlj_^–ëå€÷åËÛzyýáË/yÉ‹šªÔÛã¦Ûc©`P÷}ßKN$¦¨@LL\jqô°oÓSbæëõú².ÌŠVM)½¾ò²,ˆ¸m›{-×uõÒ]qKš†™91»V˜˜ õnL­Ó’¦ËïtÒëÙv¿º¸… û¸[´ú¿©ª»”e]0³ˆÜïR«E{!cb@Ru÷oœ‡¼Óµšb?ä°¡¨ª:a¤Ö 1#›š€&¦ŠPkAPÇÖ;-„Íû nf:™¼Ü¥"–s"BB+©"‘ˆ¼:¡Û«•ñ·o?3ó?üàˆ¤mßü쯡—*ª ÔR8%ÄG¢ôoÿë÷éz­ªÿö¸×R·ÛÇÇã.—‹tÔÀu"ï×pXÐËëKÎ˲äÄdj[Ù›n¢¦€¦Uäq¿×ZÕŒˆSbÎ93¯ëº.KbN‰K©÷ÇGâDDU„—uA¤Z‹iÇ;P;à…œØ… ÿ¯DÞ Œ­Ñ äè•mŒœ³›"‰ÉDS^:þÓÂnIÚ?‡Sø»®VA336›‰PÍäÓ(Å^ºöºbЭ(q¼…>”ÒF÷IL"½Ú½w)¸Ûoúþ}jÖÎ7t˜bI}@“cy³{$Ñw"MUVÆi‰;Í?f–šùòe-FÐIe 4}$à?`ÀaÃ$ˆ »”`øLO§5ÁÁ{>SŒ^ãc€ÂÓmœL>Éè“ã©peJ•}<>bjC¬ñÃfd®?$¦Í”F½ùµÙ‘M8†ú~;®Gâyd1ô¶³ßçm6øÚÎ륪µ“·\©ï®î~©ô³NRJ뺮ëùÑf?S¢AGÕ úN¢G*êPgmqÉqjG*g±·ÿ6•qKfmku0!?š“Ͼ“öŒ±I¨îýátÃðØ\ùpŽ2M…*öœ|2hmˆ68؇£{¢C} T±ó#²³×øXü±6nO†0öáëkðžüŸÑåi?¸‚ñû¿ûïz¿rÿÃêÿ÷§þ¤ÿ£”nÌ[ô/N|ç_yâŒ8ÎðÃIÒ$JÓq¿‰O’ 8Õÿv?>´ûcòæÏDcáб¶%6Qml;¯ h;q3éwù>ÖÁ@|myÀ"lxšîdHí^AÍ^©á±<÷Æ÷˜Ðù÷ŠJƒãpòA7=äŽã°ÞÖýÈoÐcüôS´ÿ Ó ö+ñ÷Ò²„yß¹4D—}ßùúuY2§ÅͤjJdpáœ9ùI¬îu*•"UMEÃÔ,"µ(µì¥¬Ë’xñ}mâD‰J)ªŠL¤‰ÑŽÿªZEX)!*ø™š‘‘½Ñ44&‘ ©’Ñè¿ uYJ)¤­°¯Ý•ƒ;AjýHÛuíZ÷ZÙ™†)-—ËÊkâœS^ÐLD.ëÅýVyMöÎV«è®jĉˆ(鮲®“෨겮h¨ àê‰;?À-6Õˆ+@5e 5`¤—u]—…)ન!:9Iè¾o@”k@“m»Ýî RD«ªç0r^ˆ‰Í8çuÉŽú'Âûvß¶] !s2´Ûý¶m›š&Î(V3W2—œâù’—û^J­†âQüôéÓõºþõßÿç×·¯_¿ý¢f´¤mÛ¤Ö··o¨†D_^þr½rND´æÕ{·mË ïu[$¾¬iåÄ9¿ïåFËš9¯ ¶föókJ¹õªy’J53&JLÎXð~`ˆ<­Ëâgl?”ªêÛÛ[?gRó ÎæÈ0«¨qG{göSË¬àœŽa®*J4½ŸÌk­ï÷»ˆ¼\¯—Ëåv»¹cÙ‰­9'¤õ³‚€xÚ$¡8*z‹ÛD5ˆ‰UŒ`Û6ÕÊœ]A"i^/ 4 ¨ÚZd‡Ä„™ Q™2 aJ‰)Z E¤Ô*&ˆøéËç×שÒ5YR×ëÕeD7Pßïw©¦ö3§ô~7µ½‡n»ÆtßîþòSÎùÛû{‘ª"Û}‹æáZTäË—ŸÖ%ÿòí›Ý:R‚è^FNüúú€Uªƒò]ÅYr6³ÛvWQ¢„Îÿˆ!‹A^–J´í›«*äý“¾œk ©*±ÞŠ÷˜Ñ’ÛöM¤J³3Ó¶mIU0…PEØÍ›#tßèfR¥ÄÉ–œT„˜`¯Þ' Û×ô,W6É æ²=ìk^ÇÂä”j| @䨄OSí¸î·ggæ¤&§Ä‰T¦"0‹bD8U/z|N‰b®N63`Î÷¿œÓ¾íˆ¸¤äo´@Z! IDATî|¦§†K°Vé7…D´×†ÖZ-ÃeYú#n=íz /b΋/ª^á zWæ냑6|Ì¡­À?Á@Š)\žÆáò÷®Ý5$ìã"Àphv…Yl$ƒØE§[‰¤Ïœ¨ƒ ünGÌ9E‡¤¡I m&fÑ»ŠM‚¡: ™ …)µsšq›Ð‡ð"€‚BŒ ÙŸ½ø§Ëƒh?ö[f€Ü¼gሾ‚…6gàˆ$3£èpüŠçQ -´6W*Qу2jv ªû|ΉæÌ‰)± njyDOjÐloñϱ˜™[À`ˆÔͱvp%;ÐÇÀŽ”óöŽZâaž”;ÉÇØá“çv‘ØÂ&+wµ†{Ñeœa5m,‰°Q·í¬?Q|Ý4s5b"$ïZ÷—‹z(1àíÐ<‹Ôý.PJñUÂ/æGßwßJ eé¤P÷/ïßYÍN ¡.xÏ$œþû¥bböròB à57}[kOÒÌkó-ìZð‰âÕTx;ªpsí4<”èÑLuÈvl £@ ÅõÁ\8‘oš=Þà¸ÍšúáýêÇn;ˆ›ÖÖ? œæ3-ÿÑÆippb@›æSÏ1ÍòxÒfmôÄvMGBŒÑÚƒ:¢±¯ƒ÷¼}“øñÃýI÷™²µè`@ô)³©<Ö–pNu:ÊÂß°éã÷`\NY|w·~ñ(%ÛÃtÁ~@ÆÅ‡o÷;ôqün±úŸÌåÁúùWüó¯Žàwþ-ü•ã§Rëß¿þ’×,"ïoo²×××—ËåòúúS^_|ˆøË/¿lºûº, sBÂ*öõíí3›"/éB@†_ïÛÎK"ÙUј@Õ(¹ìèUEˆyY˜É•S¯às€•75䔼žWÚ‘Æ?ýD-Ý’†˜˜ý`œR"âmßk­Uª'ª¦D¿„ȳ)Õ»¦˜,*1Nç´N“wu¸ø?µÞ998ÁåFC¤œÙ;‹ªˆ‚h5[R­ € PT+äy—‹¸Ìé&UDªª ©Æ<5pÝ^e¬›Ö8|\D¶}÷C[Nùõåêú/äÄžéyýüé§/_–5×*„xY¯°•MU ©Ôâv3§.PBPúöþöõë×÷Ûý¾Ý]ªfNŽ–Ú¶-åër‘÷÷÷Ä9/ùÛ·o~¤Ë9{AŸ© QJ)/‹«)¥%åu]ÑVë¾ïµ”ÚF•D”S¦…æ¶:Ï*B)^0`-Pî"$˜hðÊ\—7€4ÈÄ6BGýØ.0ÕmÛî·Ûë§OHeBí¶%Åûp/n›f†hVK55ÈÉÂ\ "UEc}3 î»ã,ˆsʉüÑy‘o)UÁqY²0Sà§ ˆý\E0›ù§„€ÀûÐ  ÔbâÁÉ…’¡p5Ä àT©¾»Ðà—Áº¬—ë“çê´.ª6´43/ëâ…4ýæÆÓ˜-ä¶hBÖ‡³8½"jéP¤9ôèãÀÖëPE@ñ²,®YŠ´#h$í§P¯áE`$øèÅ ’Üjƒ>€ÄŒ@ÞvÔaDòõ›%™õ—“Ü­@ˆ”’Ëfý¦Ü°³ý*5FWŽIÑL{ð£MYc~¼i1•w0"#£/‰D>h!÷nP?Xz µšóCÔâä8B¦N—z‡þ1*C¹à~óVÍ j$gêû'×0Š3bi¤Îìœ˭ !8쥶A©!À“1¤ao\õddkŒÁÎ ¸V«Øl©Ïnq9m™GùâQÄŒ$H<s0†"mIÔ€6\ÕÎÚÆL͇èClµ ã‘ØäEö\Kcôœ'±ùöá˜I‡s7ÊùPÑ\ 1±ñ1PÑI8u.¿§F´ û©B»EUçyìÂHNŒ†gO€?oy:“¹’ÒÌ&ôT«U޵Ä?½ `Z+< 8÷¸H8‡µÉ|§tRöûàP—ßæHû¾;à¥;¾ÍLEçý¼L¶zÿƪæN”¶·iý½°¡iÞá<˜Öj·³÷¨A÷›7óP¼0Hp‚üœ^‰þ2Þ›Š¢#°Šs m(ÔM6lI—æÀè’cŸSÐ>´Ý‰§²å™°ÔŠ?@T¼‘¢çDq]W^2€)0Ló™ÉZNs²ã§ÆZ`-ˆª¾fj#h鸭PSNe³¶ät,7Ì“ÿwÎyY–1v’TÄe6¿5£µÄÀ€™†Ñ¬?þ>`iRvgú¶S+ÌÓÛ³™OÇR<ÈóB×nÜö‘wu¸ ›F;}dÌÔŽ~ZœÚ,†,;•Ìy˜ºæž¿~#h !ý÷RhSÕYX>Œ æÙFÉO”ù>èÆà1šÂîìÐB<¼x=ÎaGâ:ˆ鴊£’0LIÔ†Õ"àÁLþ@™±£Îl'‰jöîOEÎA”ëé OwRšzrmÖ¦ìÁ.ÿ‚w ÙpláÉònÏÜöDîÄ_“ OI8 }Úå{,ªx.Œ( b/Qx¦å÷KÁ>Pæg\ 1lf„úoÝÅsBçþ3¿ïú¤¼¨N£Šç¯Åo¾ ö‘’ûÜèÿÀ÷d`Ã_ÿóÞ„€ß%$>LŽ~ƒÌƒßøøçÊÙÿ)º¿ýèã²ìgü§×ÿâ½öøð?öÿc‚Ž+vñŽ’ç±BÜÚYrê _ëЛ`D`äêx` ï¯ KÓ¬òqÂh8blÀ±z¡úwÂÓÍ‘}(ÝÚiøô;°—Û€ûíù]÷;ÉŽy¨øÀß¾(ž7ÍÛÓ–€Tj]rvg´ïÚúòÙ·ò·û¶. 3aøðÜ&DôùzY–ü~»ïu©N  £w+%—M5§$"Ì„† &&"Röbཎ±cžq–¡sE6ÃÔÃÎ ê ™”AÛI³·ªÔ÷û–SÊ9I¾7_RóY !™V˜öñb&Žó'|ýôêꎟE^_^én‰€ïûö®…Þß´ŠØ}/`¶^³û^8¥—kvVIJ®)hf^r~»½‹HæT‚‰dbVMdW P&¨FZKÑoo‰y]2)™)#A­AOòZÀ”n÷Mk%"ÄšSB¢ÄÄœ—œˆ3€Äa½5‰í¥øI)¹³DTË^^Ö럿|°ÿøåÛ]nˆ†jº—ò¾)¾é^îÛ̈rs;°Šmû–—DÌ‹ÁÛ_ÿ¿lùó§/?}úD„ `Ìi v„-y1¯h¶°KsÊàéİdQ`4wg"Q"Ra%â"R«(S8UaÛ«0'rOâVëòº_/—‹_"’RšOý|ØWÚÕq]‚!©šjuq<¸9žòcâv4±ä:鬸a¸ì»± s·C,@Mœ0%&øöí½šUÕ!ȃŽ`p ` 1{IzüèÐiö*ÌŠ© µ"Qr<¹9"â6òæFCeB3«¥úìÍñ²Dl`ÞlhVöíõõÅÙë‰EŠˆ01'B 5Í)•Z÷½ø‰–ˆ©€¼¼\>}~MÌÛ¾‹¨%Iïïï̼,KâTö⋘HE„”Ò²,UÄíey!¢—Ë¥ÔRT]ƒÕÛýîÌ÷ÆùòN]޽…Þ¦ª¦ŽÓð1‰j|Q—'üg‚TE$Õ2Á·Ã2Óé.MF²ûvÀí¾•²óÄA¾\.뺺úߤ1D&bF°ÚXÁOó; cϺ^s»oD¸mÛ¾—%'ˆù™*’š"+»°S…¦zxó›¹1F ÒbyAÞˆ4'&‹üa€ñü.Ò{V¼à:š±KcÆ9ÛdOƒå…“hÜ]Øò&ƒ>?v=¥ä÷¬®Cqû8»¨g­|[DýUÕª‰ËÞÙM¾òiŸ°;èÔ ÷#{Äœ™Ã¼RÔ&yà`q×+­óa§ž@3ûc«V¿éNÒö6ˆF+lgÂï­^@ä³Û@Õ[T`º0Rtì½ûïÐ@U˜IE\6îÜ𠪥J­$ü<íåÜìh”N?Va¢îC4–͘ñ©ÏÇcê[!fv–QœÊ=pC ÿp@¬\#ófØÎj< œñ1G{dÛ^õêËùMjõ¼ ™½-mDÍ;ÃýÅÅX´@€©I´`ù¾$¬·EàV}›c=á¸kÀŠÉ9 œ¼Å£DdTZú‹DG½¹ñ‚º¤Þ`ÓÃ2ƒG“rw„¶üóE4þjfû?Œ–i7öªZã8tZ¸ò}ö… S6 µØÈZ^FƒÞ!× ²a»æ bº4M  36ÕŒ°C½Úi;BN£n•ˆ˜CR?XýÚ#D%ö²Üƒ=Ô:”î>8‚ÇÙ#f6ÝnWí®íXÐÌÄZ]vÎ0Ÿ‰æ?Ø&.ñ¶ª[ìÒ|w£{ÈÒï Žà31$E Æ}F¥6+‹cü9?þîïzryÆlþ›ý9öÓÁ©ŸZž`ß½seué&)|ª:0ŽŠ¶#ËÎ!ø>W02ÔZjüsç}}~Ð}Bá~£ƒÊŒMŸ½×½ì§‡ ¼£¸÷º¸MÄ gªr‘q³(Ox¾59#˜7¯"ãÚðàã²,˲TŸ¢«øø¸-xàÆg-~Ok6tQÇ =È5dlˆ6ë@¶^[S£Á‡ë}½STîd;éæÃl½œÜZ?Ť“[²W³qþ@ŠòÓ~7Fš¦ñÂ\bàŸ©‰éoóµÙÄ>TÝÖ1wãA÷Ý×sï4v΂)LØäHéÌÀºlŸcê u¼¶3ŠF?ÍáÖæ¿èÜÏÃS°³žnγ™gý=B˜ ³ ‚GɨM,q)ˆÆ)%ü ¡oؼ‹zí4«øP΀©Y@Áù'â[ìµY¾nq¼ KdOTéƒâýà?QqÂÙƒ"oÏ‚ ³ùw&óàQ0Änxú’„öÔžo‡èγÊÑgo ÇGÖ¾SÅ})8P¾[ý¦ÄO3‹´wü]Žø_ |ïè”Áñ þ¿|*ñ¿‹ýÿ×ˆ‰ÿÐ${^ððÉ”ê1sŒ… ¾u3ÛMÑz„SɈMd›¾Ÿ²ã2uz°xÐôýlØÓ^jè Ñ´AD¡Q¸Ô¼”ƒc5b?ïR[©±UM}î­À`Üì:¡hb"ª)_vêr§¶ÃꢧY(x2 ‡|O†ã×Ij5NœÈ|Y¯Ìüó/_·ûˆ½˜qêÏA¬*¦Zµš)ŠX©ÕÑÅj¸m»™åÌ= í'–˺lLûÞâÒ-'ïm‡.¶„¹‘ˆ2'CS?h[Ãì&S•Z«Ó\ý»9*›Bè³Ûí¶•’ §¦!&ÎKθïU«ˆÄ1YÕ€.KZ8[X\ã˜Ç”U-1V!@Tû¶XùöÕÍ€×¼ø#_/—WFº,+"¾½ß@lÛ )Ý·­ÖªË‚„HÑ1!ß{¶BHæÄ^ºÈÎÇ% \bdÌ"Šu—b¢íx¿.Y”„œªhÎÙO.ìªuŠhóf¢}þòéO@÷û½Š|}{¯µîu»ä—÷Û;˜"GšÕêâ©(…ÖA€„*šR‚ZêëËõååeY3¨‰Ë+Rª32!Á’׿à¾ßßÞï”YªÔZùž(]‚ȯ´Ã’RØè ˜%ÂRU÷*57AÙË{))%B¼þé/ µ–}w ¿O¼Ì `„ú{¤½¾¢‚¹k»µV·é7Pµ¶ ÙMX #"b-Å ×jŽs¾Ÿå¨Íºt—¯ë:Ì_Óy ‹VÛ…9³ˆ0Ó’ó²® ( núvkhJ\«øYÔ4À‰%ª²owô3½©Oï€S0oÌPKHdjê˜ø)¶;Hª ÖA)…sÊKNUTT)å××ôùó§Ëz-ÎØK©99âMÉÀrJÿöç¿Àׯ¿ˆ(3•Š^! ¢k^6ØEkÊi]VfF@Ϭ__®µÔ R²Vr‚¯B|Þ«ŠŸºÓBDBÒ>,ƒx¦ªµJbhGzÏ USq«]JÉEÕ¥@Œ‰š¯R-ݸÄjŠ„Ž6¾Ý說}m\×Uj]ròŠ–7 4BÂÄ\j §±1üh(U5ìi‘ÛýfªÛ}ÿúþíz¹ÀuY)§5ç¦ð¨a2@Q‰rN3¡3Ø/>ÀAd޷ͯ|BJ9ù/Úx˜¸Jm§ðx²î£í@yP­µºEÝM¤~3’Z]òSñÉ£´%ºÊ€»›C}*PKuÑ_š$4«­~€‘Ü&iU¤–ÝÛYˆ9~D0ˆØg¢Ô·Ç׺ÏÝç#Û¾íÛŽŒK^[É04†¸ pìj¨Í¶OÕ•Ñ®¤>Ä&4€©„ …Ì: #¯Ð–‡u4³¿g&ͦ©´jFá»·î´ƒÛÏE¶þ,(ÜñÚ±1/( VS.ßa“‚Ch’7ª‚‰¸Þû”bñ€ÞX/Ðæxm§Í “y(¢ÙÊ‘]à Kýˆ1ÅÔ–šú÷%ÈÁBÐ3+a7Ѐ®ŠGò"º;ZÛbïõ3Ñ û½O KŸ +C§¨lƒR4±Å°™tzÈÖ{Ù!½äR£©ç»<Ùî®Ç¹w*Œˆ/¤QÞä}µ‘Ü…z3ºÓ,Ü¥¥c“±£ ¢×;UÆïŒ¾mSQì[@‰J±Áz6@ß±€MŸt‹‚P¿p5¢·œp.ƒ'¯Ø0 @Lœ¼¤k&8CÒm˜Ðœ§>ÞÇÒ¹ hÂ}®‰˜{ëíãi3BI“'ý “LVúX`§’a˜«Ñy‚¾xNß3ju{ï$ñ½G$ž´õþ£§Ø\$¼Ö½£ä碣ÓZ}¸ó¶Ö_˜˜-]ûæœ\y÷Ý#Mm&ÃŒŠ_y„½¢©kèˆ)õ…¯·‰F(fÂ×h)åe舤¶ÁF€@É5®°Û#@|"0_$sê´­Î]‘6œš„}#Ñz ´Uw¿ÏŠÜ“af"Õã€HØëšûw_‡OˆëÿðÜGNl¢Ä)ºŸ‡gšïÁÒ>:é&46_ Ç÷o~+û™}Öö£çe4ÚQ¼°¡;MÞÌ]zýį)ˆ†#Õ×ê„GDªYÖün4é©ÝènÓY|à’áƒUd:ü›}eösÇð’O3„à$ûE4š3Íúk:!ub©Úm–mÀ;)Ê#˜–>«êÅf¾ÐIÈ=TkŸa‹qª„&<[Ïñ´ºœìvxM°ù£ÿô×'S]ÅAí˜$ô!‡++쀎±AdzTd{ì…8©7§¯= l~€á¦ßT‡½¼ZÃ3¡!‘ª³ ‰Ü÷ííë^ ©*Äϧî6¦šUoîµBCØWq’¿ú)Ëg~ôê­õX’Hñ#ñ0[1‹JN™Ú±ÍÍѾ—'f ²Ö¨Ñc¢ÚFYR*ˆlfdör½RJlÎK1cf©¢¦¢ºo÷¢GâM£¨I-÷ûݽiŒ¨¦Ë’9±©ÕVƒ¡*¥ô”SWÁLÅüÉìa‚ÐÇ‚5D¸¬+3©ê^6DbfBP²Œ™˜f§<$ΖrÝÀ fÛ _®×åK^òi€°{£Tñão¸–eqK>I)Rk^2.™K-]ʪJÃvJ”(§8ìÛd‰r7"&NášpKô¬`’䜰Ö"ªœR/'W@2åÖ½×z½\ åüòrE¤úõ«göÚë6-ŽbUd¢ZÅ1‚ë}ŒFA‹·ª"²ïEUöºC«å´x÷£jÖLÊ^Á Ô”4SWÚ¤«Î`&R 9¥LDœ(¬Zf€VKõ>g·Ûc/He6Ó*j¦ˆ>Í$NLÌnnu”Ê–œÕŒØ)e>Ò³:$ú^@%®pG"û¸ºó£{• »àEDT|\ÇŸ÷5¥"’ˆªˆ¨’ªiªgD˜ÛÏ¢èÂomN[ˆ&_ŸBsÊùòÁ@cÞ= ò3ÎN×^õŠžËiÇ­ÖÀöû&£P\k„Ý%ˆÌ  LØóØ(Š€¦Úi‰ qTÓa//lr¿âv ¾b$@ túÉT€!ÇuŸfËö¹—Ï—Cno #†8qˆœ.YZOÉ 5<ôNN7€¶=‚›3ê"û ’ÇŒ$î(xìÞø)ÎÙìÆ#DK¡ÿº@[‰:©±#ƒš€£âÎ!PdAG”>n¸ó]§Èû‹c‡œ=ú7òa§—øFI‘@»_7Ú_(:\”&г5ýh¶ûù;E A$½G I4s?Íšÿ¢_¼-¤P¥w O5Á½—Õ7@Ìh‡ª§®uŒø0ç\õ†I;È}ÐtÿÎ~ìbýÓNCá!i)3ð×®_këYië 5£º§ˆf±7¸(#«ÚëF&c~_4ÚÏ7Ÿôë‘N3“^ºüÝÂLËP”W«•úî=÷™43§œý÷=wÕcÝ>ß`>0-H;öƒý g±Ûç<'Ì}ûæÝf>ÿýs7RO@ú5ž`­þmSJóÁ¯½ªˆŒ)¦íNó:—ÜúmÖ9W1uD~@ Û#Œë¬ úsÕóœ·ð'Ûõm"J‰‘xü m9¥ÉÉlúÜó=½†:_ç_øÀ‹Þ¯Vû+™RöýCÿÏé‚Y­UªO÷ÑV§o;‰È§^zík[®g ¶v1ïÕ[} ˆð |Ò¸M²ÝÔæ¡üìýŸ!=ZÀûGy`¤ÿçŠâÏã]¶SiÄ þaû‘Õ ÏŒØñr6Ìÿh”]ÆÜLÙpŠA­EÏB… ‘a†ˆ=О €*PkAh¶³FVx'ŒV_z2ÿ¨ßOCÉS­ùù'zé" ˜jAD0•ª5%¦œEd/5ä„àµ`n¦S3bBÓær%äD¾Í,û.—«fX˜ý\Jùæ1XLÍ«ƒ‰¡Kjm“-ªU”™—e%""v7Wb¼Ÿèp•m/ˆ°æ–ì÷ý4(j¸‰øÓ˺pʉq]–~Px¿ýüõ—···ëõªj¢*¢‰3#»_øýv¹^ÌPÍJDP1f2&Ðj5F(¥ زd&îvòœ˜„ï“ÑÔôº\îÛjUµH¨D”ÖÄÝšQªxC©÷ìqbn(_5Û¥¾½ß½ÎÔçÄ„ä-†ˆì5°„dKC©B£09òÖ"¸à‘sL˜1RÎÉ<#¬º^–ÌÉÏÕŒ¤@Dä±b"@CbÊ9 H-Q•‰º—ZKùåÛ/œÈTð^•Dw¼]®CKì»P4PÇ,9þ ï÷û^ö”rJ© Þ·¯×«¡¾½¿K­)¥œ²âÅåFCDr‘Èk‰HªØ_ÿö··o_____®¯óçL›À¡Þž×ÏÌ>©j§&o-E?:朗œ b)ªµ3@÷ÃlŽegéÊú‰&Z7ü ªµ‚HñÔìéÈ'Ê©ˆ€é&uûûßæœ¸½¿‹YJ €)1ÔR´ñbÕ»›Á”´îEU«(€Y!£Å±Q1P[!¥¸®¤f”3¡§ïï÷{Ñê&Ó”(¥„ÎÕaò¦‰ìv9f"䪥VQÓ;‘ IUŠ”Zj­UD¼21/9€ §mÛ0å$"*ê0ŸuY²×˜ âëËËmÛ–””ÀŒ˜üÓÐl€þ3;NšT/phšÍwçK ô‚âvD'B3­µz¦«Ù¾01XN˜èz¹üåÏÙ·í¶ÝsÎ¥ÈõriY Ÿ9i7&;š\ŠöB¿ qfB’*žOP$R©ÌdªK^˜é²^Sæ%/>EP÷¼ÔRJ©¦/ ("HcŽhJÙBðšå”8%&$7úBä$ËfQëåPU 1eB7';Û£ú”‘Øï?·}÷–rö‰¾gnºdÚß—½Y8SήÆÞ¶m4wȆ™ªñD—±‰¨˜å”3"+@&Š*B |§äwæVù«M”ïsY]RNäá!æÄM0êí‰Ð¬òxØc´{ õ2X‚¦‚5Ñ@»×0Ï1 ÑèAšõ†Á¶AÃqyF¯ Ä4òƒ±ô‚ݥð“h=@vš×›çZC‚šúðuÓð§Ë¾=â!¼˜ly‹Q¼c]¹ÃÐúÍ»ÆUݨº-Ûz.H)aœo3RföM­bª–R·» ¹8;´ÔøøÃˆQ4™w’›Fõ— ë¿EdçèGkw8O*t¨”*$7Q´­@âMX›€mDg]” ɶÉiju sZÔ Á ëû{¤÷ôÚ¹4‘'³(P-¥lÛ6pgS_4O R‚æ-Ø÷½Ü=e$Š̹µûà̯Ÿj–±‰Ýã*õ¨ßÁý ð`nï¹imÀŽqsr˜u 4ÚN/E—¤“ŸG¼Y›Ayr·N‘˜ ={ÛF›š™›z•q—[[LrŸ6‰i0v¤tÄoè·Ek.~:Õ´QsYC%ŸaJÚa‡•¡Ç9Hµ;IdŽ›%6Ѷ¶ˆì¬؆ þ„ezûXvîme<Ò“+ e³ávCœ°*ƒ°?˜Úë\¦éÓSI˜ dq.÷>v8Ç»¯6Ï Ú|'ªqàa†…0Ñ&’üìo×L_cb‰·YØ|ú8·?ŽL"¿yN7ê§>çuâN,þ3Ówˆ(†£»ñÐhÝ$Ò^BkÓØ{”%Oö}¤ÇjOëö³Ði‡öƒ±JDz ›W”º4òT.R*ž…Œ‡¿Ø­ûcD}xpøÌèãr£C‘+<¡'¢|Vkøðf|0@=7Úž üøLÏ鬰³÷üô"Ø€qËmƒ\pJFØ@3ê”é›B{ÞÒkýªÔ'#¾‡ÊÜÓw*þJ!ïÇ2­‚#§?ÇÓØÆžùí½×ÿÞaüÿ_cÏÉI¿[ýÿý"ù«ÿ?ðÓ¿s8ñ#öÿÿ%þÁä«Nö8x;z|ŽÚ;Îø©Ãb×ÖÇ7£ƒ›fn-ô¹?x.iÁs<uðJO8¬™Ó©'lN/ÎmÖ ì…+stnžëp§‡t"ƒ×`ªÂ¹3 $ÿÙl Í“Ñ+‡‚åŽt/¶bc|:rÓ6ïÛìn‹:çì‡@|¼màÀµ!|ÜÒ=VdÆn©cË^ê¾ïN¨ðýâV `Bf¦ÄÚ»£< ¢ b5f~}¹ªJ©›‚47+9‚³V¡FžuåúýÇ@:tÓ}Û‘SNÑ'Pƒ‰€hœ)U©Dõ¼'3TSõS™R»)p¨lò~ßÌÌ-ý—Ë՟Ÿ¾ü©¾çí¬K…ûûmÛËš’TÛˆ˜ˆÕ ƒ«n„` ÷í¾—=ç|]&V©"2 P%&JìMŒEDÕRâR•JÌßÞÞÑöšS^–Kd&Rˆï) ¢DhUEª|{¿ÕZòº¬Ër½^@ÕÏŠD¨¦kJjþªæ%'@U° Ð¢!€VPEEH„”Ud@à•œ¥R« ¾ÎÌ ’Rnk J꽈벮—µÖºÝ#m*¶Ý÷œ‘W‘u]òå%ß÷²ïE¤Öêv]HÙOtÌœdäËõ¿~KðöFÄT¯ŠUå¾í–ˆóë—ì %Eó±×U‹¡(€8ŸXÄ Ë^taè ñîS>£‡ÚºæÈsïå” Ù¬¨ZwQ[:œmU­ö­‘ˆƒ9“cž‘™ÀsˆLTjð³$¢\mTâ·ûmX—ŠDU*Ö]ˆØÔ*‘‹T"˜*(RâKz‘Z<¢ÞEðd}0ÑÚq]‘UÔoª ”œ+kj9±gÛ!»WG{‘™Vñöb7 ªh©µš)TU@âu¹îeßË}/å~ßöm÷ÖNñ(®ŠZ+!ìûîŽòªPË9¯—•‰Ýêȉßî7B"f þ8ú%å Ä$ªn£sbuÇ#¢5iÒrë²0q©ÅWTB¬Q®þ×Zˆ¨V¹ÝnµÖ×××õ²,Ë|a$iè!&R•½”¼,KÎj@œÖuu*ƧO_ñ~¿ÕZÙk&²MmBö@0ûuÖú ™(«"ªBD‰2æ”}.ëU¼‘˜C$@3u‹8 ¦ˆZÔŒ**s" H=Pˆ‰®dƒA¬®†VU(BâµÄœÅSBª2|!:–RKÙ×õ².™­!ªÃ[Úå€F2ÎD~ûu ™‰!¡4L¶“ú 1#â’.˺®"²—݇|MnˆWÕ?kf††L,›ÐDCn%α—QwñÏ7ƒZK YÃ,!1yL ­wªZw‹kSÓ¼Ca|g³Äx¨Mt}¸oÊpØÚ\‘t¥¾ 0SÃâ1ÞÝ/)‡/:8×pX×qþB¢'¤a|¢FÆr9DÍ!ö9?“„q]ýÄ0'Ñ:Byä1:›¡ÿü†LÀSanh>L†Z­/ZYàG–é¨}ì N×±ÁÌy·Š#ç ÿð­[³fߟ2oÆÅeˆÏ HýÅu×9Æ`§'pL@à3kñ† Ä~}ûyŽ,\{ÿ‡úoöÒ3l®×þ]Ñ€‡¸><º BùðâÚ ð{„îÐÆÿ1¥×¾ÿkž#¤~Hr¶?æþñ³ƒïœüÿ‡æˆ'fÿÇaõÑ:'gçÞ.òãÌ¥Á0³¶ž#~’£iœæ‰ÍwÄmÀi q8Òø`zdTéµq„Û¤¸·¬•ŽŸQpw$uÅ^Qê{Ù1BÀVÒæ(  já8{z«{¸3ÑC(êôNu,O÷‹Z;Ã[íÉüÉŸwGÚ‡#ðã/Ò%çD~V‡¢Eؽ$Ô(µnÛ&ËòӗϬ¦ë²@"VØîÛ¶í¥Ê}ß \?]¯Uvµ×ZÊ]ô’—”úu²ÍÎ^.ß wŒ[KÙôòb¤œ8US¯ r{&RÜNs˜7=FèSS)»±›[EwQ0{¿Ý‹”û¶»åü²,"º×r½^^.×ÛF¥ìjÈ’r.¥‚èº.>¢òèš2%ÄDû}ß·eN@hUÔÌ› ¬%j^³Z %fäœþò§?ÿå¿Ø×¯ïûý}ß· «Ãºq‰Éˆ›@bD¬ªîŠíZL …`ÌHŸQN ‘RND J)y¦ß1 âo^HˆìcíÐËÁ€˜¡‰û`~Ýb‹†ø¦ ²j„Ž^+,˜öÿ­/*ˆ ªé¡ÇL[§.Š€i„õÌ,§Ò:3EÄY=—Ëå²®{)>ÎQµZ¤ ˆýÚVÓu]¯/WDüÛü-æýD^XâÀŸ¼.Ø\)qÙ«˜2ò¬¶4U‘fâG!ZîÛÇGMQIM‰Ð3!O´?3o°G8S£Ó•ا „‡=S/MBš`M]Çè,‹>Ë®x¹¦‘oS—¡>Mð3sСsÛ½ãd—¶}JèA¦îI6·<ø¶.¾öS¶'ýË=+E0¢'ªýü½ 4JNÓŠ(©S80<݈dªVWk–oB¦Ä̉søÙ'­»y c²â+„[PZo±rï@ŨÃÄfkwûüÂb#0GO@WšgèJÏÁÚ@l *(E6+ªP«zP0Âm®rö€­Ã#b‚‘æ0콦¾Ïï} Ð&+Ø»ºo­/zwh¬¸Si¬‚€ø3RŸeÆÖrH¢Í^öÓ=vPr ÚÒÐt[åµ…N¡£ÉºGs¬›B¤I’ˆÈž^ Ê´äî˺T*Í’}*¹í¨ñ¼~ôG;ÄSÑQ¥0Nsîî:bsµó©˜AÄÝ-ó¤ Oõå÷%pÏAbwÞçõ( cÿaÐíA%‚~k›z­¡UÂÆâäOÍïh ÔÔ¦¦ªí57æø?VÃM¸yMt?œñöE?t¢Qû4£µÝ8 ÇÊ„NƒlIΞb‰ÏB›a¸i NÆÿ9î<¿ËGÈʱÕ&ÎMF­,Íê²,Dèf@òÍoMazè±B¿˜Ÿ¡Ûˆ©4½[f¨}¦\Ö\xP´ûÔ£³°šj=Ûñúht–Nïl,¼G³EçX4gÇü?ø×1¾?â‡ú šÙ9«?p¿ý œ‘>…Œ €ó6©®áí'Œ’óÆ*?°ƒàa8ac$‹ÓLÃt«V%?ExA |&~M1ƒceBkg±ü¸8ê[±èSâjÈêÇ]ljäAëN0P›¶ºÛs¹¬Ùýìh/·„hü§»Ú‡ß´ñQ>Œp¤I|¤N¥ŽÖÆç ‚ýš£ùøììW•ÏÓdÊpÖ}úœé\ÐË RgG+› +m{ÑíXG<®”CW‡Á‡C¬ÃŽᑱÔñ\geøW_ñ%öÌÿ8¸²ÃHÁ¾_fý]ZðçýÇ‘¿ÇRÿƒ öoÀvN?ç÷ëÖöCùûOé”ïÿ•ðø^þÏÉþ?ëþø0 ´ßQŒ'ýá(çORúñ±ÆzAÓŸwг„>Î$N×>{RǵxxpZø{ìOü4F½ÈSµ ¶(hõgýž×\ Ö E±Li{Éü|D0Ýà¦í,œÜrzOŒ@ýÓ9bÀ'ú?þ}ìa6=ÎÜ â7¿\.±ÝÜMLÒ².Ì¢VU¶RLuM¹Ü·;¥ÏŸ!0¢((š‘‰p!FÄRë.û™‘Öœ·ûmß¶/Ÿ?¯¼ÙͶûý^jMÑæöoUgª¸¾S rf5“*u¯°¨7{ǘYM)1%¶ffhz‡jO ((xËŽô±˜¨ÚEÕö½¾½½}þéóëË‹oD$'æÌÀ´‚‚©æ”ü¢W(Vµ”0KUUû´\Öe©" Lœ™Pª@« AÔ(ÑBDÒZËVªÊŸÿëÿý—%—ÿÿïÿóß~þÛÏ`Š× bIÙ*V¹ÉÂÉ̘ӧO¯ˆ°m¥[¶‰ˆÁ.a*¶äNÃ×0j:ü¶HAJ‰“_~ ŽáR«ë _®W3ãäÁ ?€Ôj„ÈÄ99, !Ö~8Tæä›¼•’­&*¦ªJ@ë’}$µŠ¬y ½î ¸!-ˆKÊ[¦UsÙ˶ßm€ñºæZDL³©sC7Xœâ J)ª5¨;œV¦œ’{„K-ùSn2Ü|B­qýHç,Ý~u­ƒ!YcÚdP¥2Ñ^vjçj·­eÎÌQ1ç‡vÝø(Rc-V͉ú2Sª"(ÂÌÒdkB5PíÚnïDS5Ý÷h‚Ë—ËÕ fš õ*‚j4ýrÊžWóAï…VSÚ‚‚ hNÙ̧6&UaNÖû|‰©¥: _®—mÛü˜ÍÌ{­Rë¾ï]§H)qJÛ^@ˆ'Nœ’“‚ÂÄm¥ ¹9÷¾mˆx¹¾D[@E©‚HÄ “âà¼-ïÿôE†ÙÅéD¼×‚l‚Di&fxÏs)—œÁ@`Y237ˆ™ƒ â ê®xˉ‘ÙUfD»®«ÃÐ@k ?¦ÛBYTˆÈL¥-†‰™jÁÆÂˆ›‚WQ ˜%5åľ:iÛ½M!’ D¥k¤s‚X¤ª91 ÕRUbò)e©u¯Å…3QUK™ÐT9eg ™#܉ÌÔÁOÝ[àB‘ª1“ ¡6;®"¼Ö˜ˆ¶íþþ.LôòòŠ×¢ÓŸ«¨[\CŒ#ªµÞ¶mÉYœEâì)Of„â#eKHï·÷mÛJ­û¾]®×¾KñÂe"5‹Ñno_œˆÏ޾ñì8óÚ"xÐ:`Ù]óý¡Þ©Úq —c°2Ø­ØNîpü5‰· ¸™Ó{šƒä3A\=.†æÔ‡¾§éµÂA’‚²™$>h±‡,³ïjQ}Zabª¡Šù8ÃüF@È„~U˜!¨)Ô©uÞ¯úoµ‰ZLmªžOU#"¢ÆázÄç=öj¡~zï¢1«Æ)š‚íOá¹6ŒúÒH>õöÀ^P ¡¦‚Z8Í©]AÑ­íshÛSÕc“!L5Œ-LCdò䮃î@9ÜŸmMk&÷^ƒÎoªèÕ3­i‘áắðìîþ`úøÖvr^NºÕa3Ú8âùöñ^V‘GɳššjµÎáë†S‡^…D(ê …5\Uó%9­ªáƒ|›Þ½7jGoïôöO)è3µ±“iƒº”Z­-ý~S£Ï0}ž^†¹,òP“”os¿OÏÄDwl¶ÿÎ>«E8€Ycu´ïÓjG‡ÁœN9ežì©jlgíø¯ñMs?ƒ'EÙ?¢ÛÏíGÆÿظÀ®ƒÈSo¿©Áÿ¨úÿzÞÿ)ßóa÷¿8Ÿ<]„ørºÁ=Ò~¦ÙòÁŽ0N>Fc8ƒäènYo»?Á¶Žš Í•?-Õ8,ó„fÀäGe@3ôã À¸ÏMëï{¶1ñå‡ç[/Nшö?iZЩÅÀGwBÛ’H'‹E½Î<±m®ªÓgpýÌž~¼èA¾äËÙ3mÿq0ˆÏ>,˜ªÔÒäÏk«jℤóëõ¥JAƒ_þþõo?ÿ\U>z½Ð Õ˜™p5½×ZöB+¿\_Cv‘bf_¿}{}}.Í ·]kD¼¬«ç‚"ղ˶m9')R¥Ê^ŠC>ü0ÎŒ.ò*¸€ÐüS}O`í  ¯«%ÐÈ:À²æ/¯¯Ì©nE¥ª˜‚f@X×%/Tj1J‰€Š•¶I¨ˆ|½^ `! 5QS À œ3©ªÖŠD~Õ3àš3(«ÊŽt¯åßÿûß¾}»\/_>þéååïÿY]6CÜ÷MŠæ\D¬Ô{B¢ëõºÕ’E1]sr"§6ºÂf±;ÔÓ@Í50ј¨ “ª©YÕê±üt½±©ne¯jÕÌ‘aßkÑ(Þ¬µj‹!‡çˆ‘*ˆ$%0˜3&L9%@ªUö½€%ò¬¼ Šè»Ü¼n—‰ *¨h•šrz{ß«j­5¥œ—M¥ ¸`œEsN‹š¨M.¶½3½o…ˆË^Üݯ'õ‡áÍ‹ÒÈ~!öºŽ˜°ªŠ™ô¿à 0À’s¿ìØٌÏ@Fäj?χÿR«™í"΃³ývOëjµšYQ%öÆf¾¬+”Ä˲¼¾¾è ¾ä IDAT,)‹ÈVJ•ZEj©&bˆ¢‚@9gQôS«7UÄáÌÎß f$dà,¹8œõ\ªHÌŠ‹ÈœØú‰——+½ñÛûí]j•*ï·›K“ž^ïMŒ²TŸj¤œ»¢…„èžHW]UMLö½Üï·××ODŒL [GƶÅ|ƒ±Þ\™ÄÑS²×òöímY—u]]‰F °¹½Ðœ‹ð÷4:Ï¢ÅÇáL1!2±ZXíˆÙMžÕÝy…ÜÆn¦Ä¸®+¶*évòoŠQõùœ"&b7κfOXÖ…)8Ñ&àÓ#V¨ª‰"aJ‰˜Zº'¬•}ß'À(6¨UTSNÉ__#yîÁårJãê¼—ŽÔm".Lkþˆ‚©¦ePàá_–Z«äRJÙwvœÒ§ÏŸþÛßʾs3ÃÂè–äþ’–*wÙÇ, -9s:(E^aì*0HU¯ÑÎ)!¡Öàä:ÚÛÀo6\ê£ÕM¢›¼¶š IÐ?°y_Õ\Ÿlû ›s0v¬‡ ›ŽÁ!èåή4"¡ƒ³ÆÝ¿#§#æ5”-hıaÚírDP€úòçû uù»RÓ:Nä*cG…´ŸîÅ'"Chü®Ðüƒöïý“1—kß,Î|Ýišé\ÿ»SrZˆ'A½c€À¼¯É]î]ÁFé†jUèG-"Fí]1@¦ìûô"à.8ŠgÇäØç 1ü!¤v¶zwÜ5½®Õk¢ÇÌt>ÖÆò…ÈÍ Ù~¸ö‹Ú`r–u7¿««Ó~s¤UÚv'­Ê“½8[Cc„á5(ªÞùAÜâp³EhÂmwÿ½Wµ'ŽÞ­nxoׄ6M‘zn™†’冿û’ E͵YŒ;í§¿RΣ™¬š“Ù¢ƒÝºÿ2Sùÿ©{³&IŽ$ISXDÕÜ#"TuÏ Ñþÿ¿µ»;/;ÔÕ wS‘}½ÌÜ….TOõf7²2#ý´C•…ùc¯J:ÃÖÞûB™§áµŸ2n/ÔŽ†?RÌQÊH3¬Êæ“]ÄôÆÊO×,ö"aiìÁœsøÜq%a­á"ñ:©ÇVNå½Ö¿V4×3ÆÖhô“üþQ0AKëêÄq«E‘lj–‘’8(¶‡ßø¡ax‹NûUü4¤f©;­áŒo$£XCN‰¥/3S´ªø!Hjf§×Ü:Ñ'7_sxDßtfß‘]Ûb1¶ì))pûÂDå/6zˆPøwbbQJ Ї·iñáÕrÛ–®­m˦ݗÕ9ùt?[Òœ–f½£ð:]p§Ÿ9|¥GNÑwÒ¡^~|,—èørœÌŠ‘uH°LœWídòçÖÈÌœXÑ’"ëpÉÓôÃñÜѹ ÛV·à™îKë‡è8D†øï³—¢é=>ê^âdœTûµŒ†FŸÚ¢㉀Š'þF÷ ,öG°ÉÑèès6°ÎŸñDQ…?<ê¨Ãç ÅR óT¹ÅI"é†GÙ×éMÀÂæù½çá£:f^Ž˜çE[Æéý7ß÷ú ?A,jÑ¡[èPën6*’sn5›,ù“tI¢s ­ÍTHÄ“0ó–s@X´·AšÃÁ€¶‘ŒÆ…)„›¦ ˜u†O/È…8hÀ.$MýwO)tSÕJÙï÷]’DßuJiä§GÜáv»GüCUÝér¹ôúÖF£ÚrÎÛ–SëtÐÜ)ñ~I·[ùòå×$r½\@:òžÑ‰á¨ÚhQ0Gð¤Å«U"º¾\sÊIRLô´³ãµåœƒ>TUÕŒEBϾï¥ïÚqÝ6S%¶¶›2"xN)æLD”R«t à±S—@™°—ÝÝì‚ðú'aóVH h’ºû}ßk©)¥×·· x)f–RJ”ˆ\£‹DNZ•3Ôsh” X5ïÝ,¬©¦,¼×ªjnNBÑM‘.ªVUÍüz¹lÁ¬USZ§ÅWdÿ¾W^v\+ªjNÀõíÓå²Y׌…¹˜ÖZÃn*"¸\â¨Ûrj¡³n>Ft* IÒOCwæw=ŸØ´ 5‰À `ùw2ucšb%@)%Ný1œ­5ìê®N†„C™Ì WÓà/‰l­É°i+ŒÓÖ˜#©c ^5 Ÿ¼þ±ÝïZ6Ïpes”gW búcãÆÞÔ<\ñÁÛi2v+7އj÷B=õM tGnumˆ×É<4Úƒîædñ uÓ&ç¸gKj563â êç£w!fT SœµIþ6)%N<;•غö"x¬¯¢uû3##Îßµ•>‹šÇ ZKÂàÑh„Ñ?ä'ÝÙŸŠÁgêiTà+iˆú8YæŸÒÅáß‘câŽ?;†€æ‡Ê‰Y3Þ&0Ãßïë¡FOIøË ë(d/c½¢8¦‡€Ñ‘Ô…³˜îÚ=~‡>ìOF ‡…¿ã™ýÕ¿ãÚÿ»ìÿþñ„™búßczC®'Ó”? „?ýßþ÷<þ°úÿŸ(Êÿpûã?~à` ˜§ösý0®ÁʽÁiNÀý>†Ã5²ô@ÞûØs—¾ qæÅÂŽã4añËa—û±ÐkÇx©ŽaÂ9=`ðþ Éô#ÒHÓaù«¥.`wOTÿ܇Э½±C»pomƒ/Sü0:[¯®mùÜÏóAÇJø4x6mÄ÷fx¶°8üPH]áH"æžD’ÈûýM¹í»Ö¯ïï{Ù]¸”ýóÇû_ßÿû¿þ‹ëm¯jDJdLjĪê=î+€™}¼¿—}yy Híš5–tÞ¶ü’·{-jÍò–Ý©|-ZwS±Z´V ³˜;È5F0W¥p|õ‰}\Uw3†’5ù$K*ZîûÎÌ—|IÂ÷RGO‰dIæn¤[ÞÞ®WÑ­ªÕ skí굪F»otF$Qb†“‚`Dfd®¹±0»5º·×”§ÎõuqÙ÷Z+%Iy»lùÂŒëvab3l)½¾½üù§?r x!'­öåËû^v3uÏ)å°µªUJ›ÚBN,`°ƒÃíNMor­j­zÎ ¹jQAÝL£’aÆ’'ɉȔL`÷rë ±‚€ˆZ•’PUfÎ)¸¢¶úP ›¹U7G"«öqß•ÜÍ3âJZj‰·ðññQJq÷”ƒ%×ëË(o³Ž9Î'­Ö´nÍÕÞ¸©¡€a»\RÊao“Ðw¥‰aÖ ±Ù—ÍÕÂ’æn¦n)¥œóeÛˆÈÚJ?›e(Ð-‘Þfa¶Zcû­]G»õõíÕUï÷{Õ*"q ©¦d¨µ¤”žZw娼ì»AiÆBT Qy‘ëËõz¹Èjèð–»µLôµª·ràvV59ØW !|Þ¿™ˆ\äûýŽÞ›D\˜’8ö³æF@J)ÀDUc¾ÄûÈ[›¨e¤…ZQÕû^â„K)m9ؘÔ4Ò Þè IXÍSJ9ÉåúrU©Ý¾Úä8"»[èœ,’Ñ9Bæ 6T+Ê ¿žfÎŒ”J©¦Fr”Šæ*Ì @5uÏqš‹ˆ·:XIA­Õ'¢c©YÌm©ÙìŽÆÎÞ™íBÜxíyG•‚›MÁl*•]*ïÒ›EÍl÷zT¯ÍMJFuJŠ]Ò@ÈÑ›Œ‡”2ÍÞl‹š‡Øôî˜à¶x;É0JÛ?Õmˆ3ÈE³£)¯´FÖ^:€Åî߯z[Žéé³kžÄHÂ@õYÃðì»Áç­%™z~€zPlØL¬ÇAŽëá{Z7èØ'šª`Ì"¬è¬Š‘ aAMÌÇ[ÜGsa;b4¸0n´u ²y`p³¸´C{”À·ÚÌ>Yº¹:?³³,æûtç~ ^û6l@`¶g¨­šQD0Z…"’ÓúXë¶²•î¸ïM¥ñç Æ «ŸSí.ÜdH’Þ»ÚÞ½etܺal‚¼[ˆmfÂúAŽêèfÅíMÂñÆ£u¡_ ×J#Èõt¯.rõÚ‹Ø=Ø;íÖÖ·#ƒd@ù½¹Q á«y?îž-%vÚËhòyÞ®ÊXÍ1ôÛ–¤ù§|mo5Ì<ŠQûk^õúq÷ž©ZðDH¥³~¯¾Ë|¾ïS/:ô¨:15®Ø˜ù‘b†ÓmïnÞ‹s–làǨÇ8Ìú´ÄϺ’ùm:«fËvƒeËIÁ ‚0Í!AOûDH×J)ªu%ÌÆ…ÝZp¨6}Ài¶€&B§7·‰Àƒ²/,AãñâÂ2ÖcÒ kSÀYîð.`iByÈ;¢)®>CTÏ” QŠxjÎ=xºJß(;ÄÐBêÛ¬Gí¸?p²Ƽp·¯ú|»²·”åsèx·%tкààêûÑ䎳¼øA¾'JÅ—hÌÿŽÆçË´|m+êu8XÖÚæ’9ªÈÏÓTë¨a-3q·^K4:™ýiתYþÄdì'ß&hÍw9ž–Nïäê;Š<ž§+ŽŽxvÓLÒ X§¯v,KÚã´v›¨ÖNI?AG¢Öcö'a ÇÂa¦Æ)Ë>íçe¾Ë+Zÿ‡b§ç%¹þ½†ÿ±ªø{ÍÂÇaÖqòŸ¦þFyÿIO“$þzÈß’Öý½,ÿݯùÛÿÿ‹Œ~Ï·³~‡ßã(Þ?üÀ³>pœ›iØqüâ×KâܧtËÐÌ>Ï?ŸKKn;Dí)IMépy›2Ë´³/¦Súââà˜:›1OᅢŒ XSc]í“d¸$‰Æ2£ Âó1TÿU‘W‚PD'Ýæl§Yš/Ày<ðÒ)`Çž·ñ¡Ú1áö䇾{À¥(úÛrŽÅ\TtJi„kb0\ÕÈ)1;I¹Ýùük©e/ZÕTUk­ÑÇÈ¥†pcfµSÍ9ÀõrmÙL¢Pä¼eucÀ"€Ð+ט9ArNÑÈfZ+ºØ™¹¹©G³mau 0à•Ö7þ0¯Uï÷sjõwÌß>>î÷;€—ëÀeË¥º sæ^xJlZ«š³Óö²iaWm”SªÎm×륨ºZNòq/N”„à$}ƒi^MÑì ±n©¥š!o L°]¶8†~üá‡írea˜yÚØŠîUéýãåízͳ|º¼ Ä~xûAï·{(&êÊ@"1wøÀ“9%IL-üN¦¦ä°fËíµ]ÎÂ|/¥hM’¥]A)¢ j˜ÖN.„‡?‹‰)KÆÎ)U5#’ŽëpòªnÕ…S„˜/YB ‰¶µs»ÇFÆù’ßÞÞþüéÇjúå˧Û~ûë_ÿÊ‚—×óÖH¡Ê5z&¢0 iÛ6ßýn «Ê,œsr÷_¿|µZ"SÂ}ÿ6½ufc°äôûHÍ6 '1•€hÅßjqÍÔ¼éºefi ®"Â\ÍsÎMÆ]¶ Ì|MÉÌ$®‰Ž”ØŒDÀÜÚ3CZqr+5.69¥ ’™yëEé½df¦ŽœR|VNÒ¬Cý2¦ÚÈô‚ ²nš_[Çîˆ@$)¿¾¾^/¯—ËöÃÛÛÿû—ÿu»ÝUmeÄé¿å}ÅqÖ—Zü²pŠÝ£UÏÔܣ؃†¡6˜K÷û½Öò§?ý”sv×½83…Á´~‘17>‰)'ª„„ZãÛ -Þ[ȃÙÜS'sáË%zkK©,á•dfÜïw&P”=Diá¾G)BŠ÷¨µJJÞàº],0'' Å&|úmáeŽ@g0ØL¯Ÿ>ýëŸÿåëûûÏý÷Ú QÒ tLà’60ð0W¢ÁÁÉÍ­iÓ  ”@?Ýfš\RÒª’¤Ç‰ÇqrIÌ,I¤Z¯îì ”E"¦i¿†…ÕªS!ÄIGV©5w®N„6¶œ/Û ª*Ô…!Â@Þ÷½jÍy³²×²{·¯6ÉLÕÃÁH€bÕ†RUë"¤R#£XƒÂ=JWË­¹p¤Ê餣{`ØT‰8&AÞbh¼Ì—Þ¡ÞˆK­w:\ΘxÜ}LNÞ[:G ëØ†Åäl¡¸ 8ÒŸA£Ñq-h +ïÁýþoÛÒ.–iˆC7Õ;7šJô6ûMèãÆ ifpóDwìè _ùlü=šOxlçÃ90t¡3¥ÅØx07 sÛõÇX·a¥- ª,ÜÅGF¯]nÍ M½âÓîm "rÏÔXû¢ûYæJ·{n؇£Î}–™F‘su>‹xŽÙU‰CÚ´ ‡ü4ùå«âÄÔB¬>A«ÉgèÒª ¬Y¡C6²wíqÛ¥H£ã×G+0&f£¹v¼o!ªžZ¨ÈÍú—7½…ËûåàæÈœG‘Zm†Ly’;§¨Ã¸|¼È ¡îò?/—O•­„èD¦õÔCâE§ì\Ȇc€9 oxÉHé´D‘=ZÝW¥ï2~ßCŠˬSܛ֠÷‘ÆÌf±kŒ3Ù{…ÓZ#ì³?9P>ùCß8ý§þùPôÞ`pž×|§¼™ð˜myŠÒÀ1Örd‡9ë§÷¿Cý_éFþ{Äßpòã?üÿÕÿ/1ø{íÿO;±9@xþáìCÝHp¸®±ªÓLhÞö+äzÂôÛè¼=Ù“ø&À¡6åð»ã }ŠoÃztL–9M†y͉¹mašÞˆä°V‰ xZ/|¶ïø“á Íw„æ‘&¦xU3C‡¾u”/³ÏS£ËúÆ[\ÀœæÁò<ñqº02†²8±ÈøY˜3`®ï÷ÐÇ…c'¬HNn`×·OoVµÜî”à_ÿúË×Ï_øô*ªªVÕRЇ¿È)p¹\~úé§Ï_¾Üïw3»^.Û¶ ¯Ð%år¯ZƒÒ.ÂL[nŽŠ@Ý„ù²m ›BÔµiÂÙV–Ø»É)+[ù˜»'fÏYÕï÷Ûý¾‡2›s~{yÙRª¥””®[bæ{Ñx DÌTM?î%±óeK,œ˜LA䥒U¸0åœß~øäZU$r×ÝÍcÓͪJá0Û&Aø4Ë^œ(o‰ÙgqR …!ÏÜÞrbF­)q¾ùݨÜjýë/_‰üº]^®/Û–ˆœ‘?½mŸ^_Ìè¾2-Z9 3'0ÜKm÷ñj¥kM{y`°ÉH"×>&sKB¦n¤jN-ÊðÀ‚k5õÒ|C)oŠV«\´ª ù^îu‚DJ©mÍb¨ÃÌV­×Fy){-UÕ„!9x>ÌI=qºä-qN‰¯——{¹…9ð ¿|üØý_@îÆÍ]Mî¶ß÷Ø&‰p)¦ø\Mœšî´ïlWgÜmßM¥Ö“±õ"¾‰† ?Ðê‰îe&§,”SZmwãedfŒHº{ЛKœ$p'ÕPíµÕ³@fêÑï஦U«Z•¨ €ÅÝ\0Y@fnlä GKó4à(Äh_/ÛO?þ)‰Üî÷/_¿~ýúuß ³HJ RÕ”r¯e‘‘Ì­ÜK+g6ŸL‰ÿ mÄ a2wLn÷›V…‹ÔZÑã" éÍqš[¯ãN"Ì‘ÞÐZK­£^òîwwÏ9ï{1Õ”²’ ‘Ô[& fÛvI9ÅÕŒ™™'ì¥|ùüõz½n—‹€îû‘Žðt甬ž­ƒÑŒÓëRÜ ¾²I1î;ŠrÑûý~¹\ÞÞ>ÕŸþëí~ß¶M†Jb¦}Á­tÓRjæ r30[ß T#víÚáÁœ¢j@ÏÔ[ÿ´#Çc£ôRÍÆ ÌÑŽËÌÞ ´ãÜÙK¹ÝnµÖàùD»š²µ vJÂ")çœ7UõûB3/÷û¨raÆ}¿ïûNN¥ÖPÜ%å`—¢¦…Y(IÊy×ûj×Õ¨U5¸—¶ªš›q-5æII„Dg0ÝÚÉîäZTU‘ ­¦9ÌesŽF¢ë†xêI šéѺë‹ßqˆqh7…a¥n Å:ædQÞI;kþsH–aŸ‡H²ÞŠKýšap”þò†·½©ÖÍÒ$>…7Û¥ôF\ZÌëÓU5Œ¥¾ppè¸2ìKPëâH,Q[ÉîfZ#Ð¥ÛVg2wÅ͹¿ÔöL&hsó‹™)íVÐÒÙÜ$>zöüjaTlœñ††2³T¬v™%KÚèFXU ¤„ŠiÁpX±»½L{ÄÞM9à7\jãecA{wVÆH¢xÅ2}èúQÆc‘f&n•ÃÜÒ*½ê ´`È{Sz°é¦â92 æä¡(X|¼Ö©î]É-Ã$Äí`ííÛ}쇧 ¡Ö/“EZ¦Î{=\F„@èÄåF„EÒÒ¬Kª¤æÜf ð€õïû ö%³ IDAT¾¾´e=@ӜѷPÞÌ03«ê/uU1\9ÃÄdËH¾‹CðIïi©¾ !fðcÌ0¦#è}ÑK¡è2óÃ<õh±TMóV!5&I03ÍÜkö“íñx='—Zo X'G+u72LÛ{{%fƒØ3ËéB(ocÅv!±æÚ§ÞÌ·ÂSä *ÔnI˜µ¤ˆ…DŒÐÚÝdmBŽ5á@½M‰=ê—}©œí HkÍÙ1F Q?‰›×Z«Vs GIÿê-âq I‰˜<Ôá¶N{ãØ”X/sXÊ•ƒ|cŽ{¯ûb„›ä;-ÖìCgô CÐRß×§GO‹>Ã=Ìûrʹé'kdÿ*:V‹•SüÌ®÷–µr÷“0èt-/P7÷ç®ôñ2ÎŽËÑágûî$>L‰/–µ‹à»”ŽGåÔÉ—!u¡Çs<0ÚzWlÎS%î8NX}ÕÀw4×åœß‡~ê9´Á(%zx!Ö×ß±íã$þú‚½žŸÎÁ>8ÑX]öOõü¦8¸*aƒÌƒ‘P=$Î6æ¬ì@ç8Ä(ÖcÊZggáÅ£3ª“?¥Xü^øñeœçÁöpëÿ­ç8Ö{?› ùácôÓàp§!÷`ðïöëÿç ÕøG¾¾øLÄÿØ?ý'EðUÿýØ"»¶Ó÷eÍ0Ùôê’».ÿŠ;vàÊÏÑù¤„2'à¡ø;­¸Bï5¼Ëñ„’ ‚ã2±àEìÆ™ Å£´å8ŠŒ¿o)«åå¡3Žá®¶¼4´ó[ŽwW'‡ó ÕÅ{YgØáGîθv%´yl›°hÀg;•/K& V›ýc_¿ú´ÜjxxRÐÅŒurgÀŸ'MÂÉ›+Œ8±°„€²åMÝçID[N¡ ÇóÛ·úþõ `o¯¯"TDR+Èbp½^þåO®µîûþññþúúúÓ§ªë¾"ºä¼[)ªæµˆ¸ÁÈÛí¥0#§¤aGód)¥5C† r·ªZU‰aªF©M@Xöýöññí×Ï_Aøôéííí¿_/×-gÄù£ìœø¶ïÒ|ŠPõRUͪ“¿ï¦NYäúr ¬9æ ÐÛÛõíz-Z¿½¿—ªœ…=ÝëœÀˆ²$gÞ«Þ‹ºV!rç8මabf¨Á\kU"JÂä’S¦„|É`*ª9çû¾kÑoïß>î’s~}Áǽé4Ffî$©s‡Šžš 1µ[Ã+ŒL:ìž,ô=h‹©Jvr†ZÕRŠ$&R³o¤Y:8jÜxØÞ•ájû^ŠÖæîKÂ}ö¦66Sž8‰È5 B†RëÇLJ–ºmsHœÖjÆ\µVVVSæízÙ¬;çR"ì÷ýåELdÂ,ŽmË¥Ô}ßÍlÂ,S ñ"\`Ô»Q’0:X×Àpú«jmM¤>OÁ¡‰L€n[fDG\‹jÝlö#_¬ÍB4üh¯*®n6B}ß,M¥”þ1'éQsÀÌk§º'I¡•¤a-Àœ¿5´yûz÷Âì'D¸1¯¨ÛÖyvІ*ÝvÐͱ#ƒNÆË_Ñ1çjœZ@* þMµRUgImªÔ„oÆð§‡gÕÆRc"B)r|øã«VzܲÕïe»í€n„eë# ˆ“´q‰àjÍØæ³#y!N`!×4íØ埧Vb:ófµ#fVþXÐÓú§ËqÀ´pD´€FÁ²êä>Wô£z ®¯äÖÓ¯3†ªC©ƒ½&”ØãÀ÷¹j³ã¦´Œ B»¯Hø 1Ê0ÉèiÌEÑÎ[«öòñ·±‡™¹iL׺vܯÂ2¦;ÿ'r¼éÖþÞß›‡ ðxTá0CëïwÀŒ…ûÒFÌXƒ ŸÅƒªKˆÕÙ=û~1÷sÖw?SVq<‚ü¹ÎŠãßΔǀ‹3ù§o®ðÛÄÿº÷ïTüÿôTüðøcøÃï ôÝýÓà?øÃÿdUÿŸ&¢pÎ…-ËÅyÄöôm—øAD^®8¨ïë<Ú›Cߟ¾"œ}E]*_تçr›®éƒÏ£yï¼Ýb âùìsHç>ƒ¡KŒÙCš3áK í|£õ1¿åÞ%0® Áîçt1âZšÖ”õ3|.†<âÖeQǔس€xúXÝšÙ}/¡…¡Ý,ƒhb4s³üñr½‚]ÍrÎdîæC‚Y[¬ָüúù3å”¶¼#e¿TrrµØóתáÐâ¾€Ÿã]÷`†ŒF¿-gŠVL3´ªÁb_j {©»Ã«“—ª¥ìDôçßÞ~,¥ úO?|I_¿½|ýؿ֢FD×íEr ¸v);Õj5®lÛåBY„(™§ªZK%r¥Ÿý|»—b…PÙÝÙI#IAD"d&D ‚;…oÛ îÎ[SeI"I÷¢FÛ¶$Ì[Η¼±°ƒŠÖªd¤*õÛÇm¯·RwÕšSJ’ÞÞ®dÊJÕêN¦Ú§0Ôݵ´UHˆ5ÚVk«&[< hf=#€¶-ç-S/¦³«¼ª%á”ZÏ.1œH‹ªé^Ë~ßó–™Ek½Jfp5E‘‚Ù=Ø'Ì÷Z¬Z­µÜwæxûÉÝût,È¢©»q¨h%}Ünµ¨03XµF“ª68ܼV}½\vßïû]X:Å ”rJ"Þ}Ä£ðÓ—jǹ;~_J zJ)ÉÖå‰0¬'r#7J9ؽ: ȇÌE3õOædU‡‹xºÉÌp÷Z•Ç®¹Ù²Äy‹ü°Yʲm9*^C²(¥Æ/¬„")&|ÃüeÈ f‘MìÄFêž U‚e$æ@Ó¨µ~ûöÍÉ¿~ýz¿ÝsΗ풷-Zs[þÝŒ€”s$x°\äÆènnœ:L9øsB TUË^¾}ýv}¹^¶ ÀÑšÒ‰¶¼MÝ»/±î`-•ˆªÖZ[ã(9±¤”$§¬f.µ6ß.8j^J­ñ,""L—KÎ’µîäÖ]óM€–(Æ®µ¶ëpsØME@)˜H½M#Za/yT7÷æ”ö¡-ü„Æ4s§_~ý ÷÷¯—Ë5§<ú-=¬f”E0ÂN2T$Hbk»}nš´wÙ“0šØ»=6Ð$,£JÓ¬ ¨ZKÄkŲÚ‘0´˜ûý¾ïEu»l6Ä>*Ъ11II2€ÛÇÇ~¿‹p¾\RÊäT[?3ØKÙïw7¿\.ñ…J#º˜¹ÕRÔb`©!O9«©«ÅsùV‰Òø6]Ìc5)zÐj ]è‚ñ&Å¢§+È0†å†zj4šò¬ëbQb¦¥]<²_cP°Ú«¤”¬7e‘¥Ö×èÉiéƒþkœ5ät`ÅA,´h³«ï·%ØTéÀyjGt±{ôL_BèñÿÍ-îsÐ…Ñ…|(Ý]Q‡‡À+ˆ/¸[}›À“žÿ¹6^RŸˆpv¬ òÚzëÓÝӉݵ2ÕZk4Ø’û¸ýßÓd7lòm®Ó+Xbцúfë"ÞvC,•÷±^?„ÁåViŸöÿñͶ++ƒBÄ}Òç`°‘£d$²5s„6JCj¤Ý|¦rëó)ÐÛI¦/nÙ¬ÎîQ8Ÿ æ½ã÷¡5Ë‘ãë™Ù„…ñaÙJãi¯¼gn²Møf&:ὟµAd &2|©i™bÃÙe?ÊÛç\²Ÿ­·DÏä]TX‡†çö ,ÌTÖÖÓCÞÏ+éÔŒøŠêY®þDÒwàdªFO,ϺB»cÁúޝ£„ƒÊÔ®éOµ9, 냓r%øaRH˜c£yKÆo©œ8ZÆŸp:Æñ<‘éWægãj›Çúoں׾ Z­GCï÷£~JXŒCw<ÆI5BkiÂZÃóP±³pù÷>V_†u\°;þÑp<‘ÿxQOÙ3wô þ/4±SŸ"e'n Í  ÿÿUý§sìß­þûwÔúG«ÿþ_à3ûß20À÷b'ãžÁ×§¼3äT‚µþvÞŒ–»PŸŽ?<;ýO‹°ÙކãóbÓ¶zB‡9r‡â‡KrÖßq3û7v%FúŒÛžÚƒ}:)y§Aȼ1€Pwà÷€¡ã0Ël„7ˆîtðÁ¯0g 2¥p%úƒüÞgÀî8&Oixíä»4/“‚'w™ïƒóôLŸ¿|ýôö„_XöRB8ir!Dm¬$‰©¥,/¯/VËý~ÿxÿ(¥¨ê§··U¸ 7èÇíND9ç×ëËûûû¿ýå/úá§œ¤hýúí«©ªxØùk££ÐÆ™UæîÓÚª³£,VÞnJF{-¥S\†MµEd£ŠÀì§üÓÚrú¸ï_>¾•Roûýß~þå§>¹k{¿¥`K"3fÊ)í¥*,Û–.ŸÞÞ.ùr³¼1»ßvæZ¿¾¿{ÿ´º €!ÄYò^]k³0(‹T§tI—$û^~þåçÿ–ÿürÍnMjÏI¾|ýê®—Ë›pæÄy‚¤œª:Ü´˜91˶m¥PÝ￾KyÛÒ–‹$IrIY¶Ëí¶›+$ßjA7’ˆHBŠX¹3$¥\µ8Ô}˜Œ„È5B i•RN"æÖâàÌnª¦îÆ,ÄL¤Œ@»öì«ù®÷—Ë5H¸e"ƒs ³·Åú~Ûo÷Z ˆ»*jë#g‰OÊ\ÃfË‚MòÇÇíýÛ7­u@ÆÝ\˜:`¦n¦¦1BFŸrV¨HŠ#«™úkÝ÷@Î9õ8K€}Æš:œ¶fänä0³RJgkH¨ÆµV³.É81K|tQPLTCìvÔ¢Uk ·Ž­ƒ µ_E>.uSõZŠ»CX’¹«…«±ÔÚY°±/J)'Lµ'H¬6.†X!ó.sÐ*¸ÁL‡¨ØT¹OoŸ¶œYæ/êt£ÑÚ:B|ŒÕ ½îb‹*ãjQê­]Õ½Öú~¿¥K¾^¯[Α“èAvÎ)‡‹¿}D½›ÆœÌ¼hukÉ­„™Á™ñìRÓɬ0£Æl)%÷¨ÞuÕº»«YÕÆÐÒn÷û^j‰Ô¼Å¼­OrÚš¹v÷¿é¸qŒ–ÈQßÅÓIŠxÙë×oïQ§ÌÌ9_¶mJi@ Иì·^¯ºí>Sk!mðjÔŽ¯´oûÝ«¦œ–í…Ř95—­ÃÉZCærc‘E?Š«ôûû˜%ºC˜â`I) õ¿”²aƒ çKXÔ«Ö¨1Al)ѽ”RJ-{©uËEeHˆB²ÆX¢&Ö\£zß«lIR¢ªÖdkgIn¦ên0×ÑÀ\J°m›DY:`ÛRUÃÀ»ÄýÙÑ„laæ@s³ž×D4s~6khk¸&GszY¢µÂ;9ºÍ˜(yá0¦±/ã6rèJ34ý¡-4úÐDH Âç:°7<ª›u b­gQÄíÖÛn®îa¥W‰öåÐy(´'Ùk•ÆÂDÒð(' €MªÜÁ›îvàž;eXËÖÌŠH9ñjDF¤S1Ã>6÷èL×´¨ä>þ · 1yW‘ÖÆ¨i[Å€Y€¦Ùcúsz%ÕR ¹–@ì.=<  áû‡k}&7ñQËïCO¢Á£°6la­I\7ÇûåvQíÙ¯°Ðâ`ÑÄ:|ˆ[;æû-¼ƒ@'YÅèq¬j@kÊnŸ¥ºáÐÙʉÇ)Ö­ÿ+g¦ÕÉX\Ú™{–Îâ5À+„ö2 ÄíꎛËd°´¸ ¸ûÁ¿(´É–*á' Ed5¤ ,ëw3K9Ø\ [º5{å£W½0ÆÌ½gËz"ÖzÞ¡¡Ÿ÷ëX97zÌ&ô÷ ]YF2KÅ)h¥ÿã4^jÇs”¬7ðy÷ÂwÝö¹SÙõ=¸?z«/Ï¢·‰Ôl­C¯%b½ÙXHàP){j ˜ë½E¸7Õεð‡Ê‡˜â·¹]¯sxÀV÷k):­}½Ž'ûxü¥ }„eîƒÝÔþ³ýòÌ¡kê /³%Æ£øÛ*ŠÛ:‹aK~ãXÏ»@Å[s9V{x@Á1'X(HÇ/t©Â>?¥Lò-~ÓC6Ë!:ÍìèÑýy‚áÕŸ‚¦ŸìØgÕŸI\wäõtê>³Ž™š[ÔÛù]`‰)µ{ ÏÀ U„ûf¹O-´ºi#Y’dã"ûì¿*ì Ó·LO T0»5;ÕñÐXèþNèCh: ¨/Yç~ÝQñ ꌛ ùÄÄK¦Žüüp–×O0ýò1˜øßá#ªc}nE«ÇÚÍñô¨;–q¢e¯Q£ý÷üRGÛôãs/±ºuYçíþ$Ö§§žÕ%$Ç }ÏÀz©îK&g/ý©¤z7Э‡/ê»ÞÿgSùÕùƒú¿F>çðä÷HºKŽö¿)Àû?zÊðG Bø{¦ÿ,ï?ýá?x.¹ÿ~ñê:LüNçÿÓ1à2O^n(Ü/N¼¨ƒòþγ­ð<8Ÿà]2è‚û¡ú­UÒ’'s…Ü \B/Æø/íYb9Ñ÷/P‡Ùb!í´ì¨úb}‰Dý1ÆW€Q5°Þ§çCæ}_cTy4r®¿q´ðwÏ÷^Îò´&àÙ¨ —ÚôéÓ§‰6€¼‚L0Ìœ,K³›¥mû¸ÝÞßßmÑ„¡†ÙÌnåžRúñÓ'«úåó¯Vk­%'á~»7(c,”C×% çÇpSE0$œ¿ƒ–Þûâ,„ÂØ~4­¶¯#?½½ýôú–®&àM’«}¼üÏÿùÿÑ¿üËÛrvG¾liË›$‘-§ªæà·×KJÉ@›H‚l)ƒ¥–âF¥3gIݰY‹U®É¿Þ>Ìä[º\.[Hç[¾˜›_¶üÓ?0äöqÿüõk­å_ÿå_÷Zͪ¹—ª”EÕÜ÷]Ë—÷o9mܶ™pö®ûÛëëð~»›•ºïÛåúrÝ.ØvÖ5Ï”.fFØ_óËuK`)eÿ|»Ýö»0p¿9¥vY¶0 ƒ9ÁÝ";³ fqRJéãV‰‰Â9hE,Ûà‹$â’sN,qüX˜Ú6MÉÈU5i†äœRJUµF‰um « Ll˜9©Å^®–‚Qhé&‰£¾@DœPKQP/Fk;„ÄÒHsƒ¤c’Ô“øë¶}¤´J=ôë}¿Ç…ãr¹Æob$ðÑ]cÌœSR3Õð¤khýâ«®„½” £o/™QÛž¯-ö3)‘6ú1s€¹KÙ©÷[2ØØÉ­Ûí{¼À2õ+4[§F§\ [™‰".'÷ª,Âbcƶmëd.>˜‚ô9h3’6]¸9ãLãµÄ1›- "âµÞï÷RŠ™1臷O///ÜÍõÒøìqñgu Ò1Gq"йÎZ×¶|–”5âS)e„Ñ·¸oÈ™ˆj)n&)•ªÚºñ¢n6<¤µºœPJÙ¶m).tU·33µÈm£Í¦f†‚ØýJëõðãv¿Ýnu/œùÓë©ËMQëkæêfÕ¸½zÞ2¯.?XP#¸¼WÿQ¯/bp¢à­›h‹1pP#–y¿º»Кoyj.1bJÞܬ™SºnIòùóç/Ÿ?çë51§-% çœsö%2ê:½¿ë|}å–}ñZ 9UÓ÷÷Ûíþ‘E¶¼µ*‘ö6MƒÕ¡*œ¤WC““Ven6è ÈpkͦÖ`¢¦j±¾_EéË–EÄ&e‚‰i÷é‘iÇÓ·Nȸñy£<÷¶×³hç_ë¦n=Õ,s£Þ­äÞ Ô>dßHkz¬ÝˆÜÄÈÆâ«œuÎÀ–„ÆÀAlto^稌æ¾qÔhjO4'†nAš¬g7F;`NnŒvwwzu·Ä´‡ùZ»xx;«Íy*3 Øœ¨}PÕ~ÞG'.ˆ¼Ks<:6ú:‘‰ƒxGíkm£6A_Ê¡±Ú?øþÌ\zêÕÁ`Žþç~^5r±Ã/ê M;Êj#^-/³óƒ¦Ktüu7U.éÓþ!øè{<Éga„σ‘ïóÄÜýö‹Ð&‰q°5|·,›†9‰{‘ަ'râÎÌ™–!Â*7/üé¡ívÓqÍ<ƒ‡Sq–ì.)ãdí­ç4›Õý`Þí‰Ò B…ªdGCï„í8Y©ÊLIRß ˜”9 3 ¬­Ï[<¯{ùWS ɸg£;çä4>1pºÉÅÌæÑ6~ÆT]çOÇQJ£Ü`Üè;ànrxÚÜ0Ÿ]ôš¡Lv*ZïBw7ôª_àHX@CÃ8ŠÅÂMP6€?}¢†ZYáÇá“+¿ûÙÇØF…e~±°ÑnÕ$Ëlãpå¡õ)f1ìø¦Ý]ähÆ[Œüd&Ü ÆÛä kœ Ã™Ô™þÀÈ”L~ø²õöîÖ:F(&– íJoÔ«¼ç¾f¥®¹£Šm'ô²hÇX¹u ½ƒ³|qÀ’uùƒÐ1ª)&Q kaÄž'=ËN+X¬_sW¥¼¥y@ÎûÏDMùB­[dòã¡Âðð>E˜#Õ:<ÚÅçà‰{¿ß —wêý!ä'š;a(ŸIõx ,vô“„<¯~šN ú úψãÔéÁîOÇŒÈ#t§ •ü R/®ƒÝýÜÔ½@+Ö(†œöîŽÙ¹óLczŒeìÿ~Ç:¶âiÄø³â¤žO[EÞgÃ*ü>븓?5Ä»Ò(DOÎß-Ìÿ1éÙéoC•þ9€ÿ¸ÀþÊõŸéÎ÷?ðþ“ ý¿ûsÆ¡"ìü6ýCJhíÁr3Ñ ˆÑÚ¬EG>ÏA:_ô84ĬmÀ}oÃíâƒse^%=«0˜²|lÆ‹Ö>º9ûæ^oÖÙýíIð×Q ´–ã¡ý‡1:FIÁH@ðâ¦ÂII§Ù.0¢æÃŠJ§©©¯3‰õAýÕxt<7çÔþÖ±î#ôß~úé×o_K©€AšÉ«í‘ȺɱSžcGíb‡ç”/—ËívÛ¶mÛ¶RÊÀ—‹{¤ëE„À[Î//¯jŒL5Ú«Bl¾!3‹ªÞ@Õè?º¦¼Ö¨ÁÈ%% ï¶»ßn·Xè§”_^^RΡ´–ªnTMá§ÛÇÇ×Ï_Œðv}Ë?lIB 6òÎYP˜Áôã§ÌìÛíö×ÿE ¥VAºí·¯_¾Ý>¾ùåõUÝîeâÌp º~ùòÕ\EÄ®î0w¹¾~z¹¼ß÷ TJ±Mþåç¯ß¾ºû–ómßãÓn¤‚Fàq¤QH¹ý IDATº†kµfɯ¯/—¼18å\küýããó—/¥”×—×$¢ªyK"é’H„_¯Ÿ³;ÕR÷Zï·Û¯Ÿ¿ˆHÔÔÆØ&¥”sa'D™§$ÉÀê,‰“‘•âU«ƒE¸Ôºï{УÛܒH’Xr¾l9§¬µº )¶ƒJÙÕ©heàz½´‚”Ó%g0¢SVU‰É]˜ÀÜm³LÕ‚šR>n—K³äGZHX~x}ÑZnÛöù˯¨õòru–s–D‹3D-3«µté¶w «î÷ûûÇm@ù¯—kʉˆL­LB\FÄPƒ˜0ǽ؈Š" >S•Ö¿íæÕ½ù“_˜_^¯fVöç'Á¾;@$Ô-cSGmdÃVUõ&Þ4[d¯^lû󨛎$G ­ÝÚÛê¤)â~©ŽmÜ"˜j5#ð(õèw`FÊ 1æ ëü¨aZ#"°‘-j:æ*¦lã0ön ŸîfE]Ö7ík:~wËöÚ•U…2‹4»ÀmŸ‘~ê`B¥ÍU­'82àH½Û8pLc©Õ`é0Ó9Ó—r³¶ Ô²  ÆCQaŽƒ­Q㬖ýë=¬ØxŠ'hz^\úl©iò4² ¾¸|@KVÃûçÐÑÑ™l¢¥hŽÇÆ€dL¶B/–hÃ(°g„Ãfÿ!˜¶½&ÝÂÉFÑÃyãP’CåeïólÎdø$i.ú¯áM3ODR³ FY}Ûg0!^9 `ß xk—ŽÊwîNy%“ öÞèThîuns€Uõ^cmn„ð²ðª\¡O–$ÓfÞavZ„2Ø|ö¶€PœŽ®Ö½D˜äÆŒá~/î˜ô‚š'ˆ ó³)Þ•($Pn'&Ùæh¦»€»³HP ×~„šÓRTßéˆ-Àw@èÓ2ÕèY+Ž Ú´aÓ˜[ŸÑú?¼^u} »úÿùò¨jñ´*wãý4ü,—U> ¤ãíô,s ‹Ý|œ8Í.t?4,6X@Ž~~zªOÆñSä¡=wuН\}`ý&sd.Çú(àœ/À¢]ûfÍŽà;¸…“œweü»&ì‡á9Ü95СùhÁÙùŽÓÓ«›–ùÉ`b= a­ ¦'sô[;-7ï‡ÞÞgîlêÕþ }ù)ê$™úßø§º?‘ÝŽÓ ~8¡ÿ¨?ÿ黆,ÿÁ3ÿc/ôï~Uÿ¡þÃðÿ'ðûùïYî ž…Ôà㟲–ˆërfóé€<‘ê–€­†C‡Vú ÏåÉrímÉAoV&škÖa¼YÞ—‘˘t ùiÄ•Ñæîã´7½…¡Aݲ ÖÖôåê‰CUÉ¡õxú·PáÙ0`ųáëÎO×·Æ%m¡éDcžÐ J:Y ÛcË¡–sþÄŸLßxÁ‘eN)Ä!„Ýn·Zk ;†OŸ˜GyÚjôPÕØÍK’A<œK€o­7¾ª¢GXƒÆÜª÷û½ÖšsN’Â]¥Ußï7D`ŸÙTݬìûëË ‹dð5‹¤aƒ²ï·Û‡|cÈÔª~ýö¾ßö¢å—¯ßn·Û–68³€Y®¯¯ª°$©Öêj$‰ˆjUI©Üîå~7ÕÏß>.[þÓO‚¤œ´Üï?ùüþíÛí~ðzyùñ§Ÿr3¯V\Q˾‡ÑX]8åÌ¯× @I­º{¾lùza‚’üôÓƼï{U½í»š|«»W#ó+¿¾æ¤V°âvßøØ?JÑàä”R`nýÜ剎^H rIBfHmW®Ù÷w3—^’–·, 7 ?ƒcîbän®u¯&§p«Ç1S‹ºVu¯ª¦ @Rºäìî{)è˜N8É}W‘¼]85ìEÎÉ7T«‘ši©Eä"‚ZÕLwÕRv"œS‚ðý^bËÈ™%TãmãRšYU£“sì ‡r=ŽÕÁ¢!¢ëår¹l~ýü uù¸jc2Y²†çù/¥óå²å¼íûÞ<òD¦:´ïåuÑ—@,Ñ’íD:¿ndQàæa=&t*ŽÇ±JN1lÀXÜXJb‰g5qΑiMjÕÌABá8.¶"BkïNÍ2ÈÝD#9qÓ”J@rzÏ¡š‹0ÀÛ–UußKpH¢é7¥´—²æ º^Ö6ä R«ñ™DÓ@|øÎд©ÕÀòK))âŸvû$ƒì ª1ûiö7'Fô.°ªqsK{ƒO#~ÆDxÛ2¹;›µT¾®¶\3m&S73KINR³ÊIŒVUpÔƒ[Ê9Ô30B„ ï‚­Àst¡† Õn9܃5ÏÓˆšD Ìœ·Ô6kªN®,â>ÉTÁÚö£œ³™³´ C©jîŸ?ÝkÝk}}ýñç_þšSþó?^·K©{ŒŠ{",ìîZ÷©™YÙofv¿ßî÷*ˆ$ç—ëFD äÐM¼‘”q"3a¹˜gHŽ¢¢ºk½'a‘K»Ø 3ì® €Àƒ´.MS³œ1Ô|Ü{ÎOP=ðøæê²îõ i ÌË`³jnŸ:X¡‚bìfÍzLÍAÐNή³G[iË–·£­É¿u¹™š5NûÀ8D|£‰¨ö¶í¡ïn8@‡´˜‡çAPó3""v^D|Ÿ=„3V<„Çt¯‰¤1Ëò0Œ´–kôVAôŒµæi;ù¸ª“‰7¶ýBÆPRšý2®T®¸wÞ;¹¹Ž¶¼ÆŒw,*^|ª¼¬|Ö¸XFÄT‹RK¾¬»}òµz{µ©F'³O˜õo¹U‡Nl1ÍQOx ú ý·CeuwpKÆadk"wíh!óo£¨c_…žyz´`i&3ŸÊ¦ÏQO×ÎS¸/¨kঠ¼Næ=3Òªy«KYYp?•V³P“ÃtÒ²kÞnÓÞaôÆ€sp ~oÞÓ†X¥ûÉÁdÖÑ´¥Ïý¶ûRë9‹vlÝ+ûa EÇòÞU¥Åº•÷H?À>uïu7´BNKCϵœ$Ì&>¸Ó±”‡Ž®ó…ù ÚûB@rÂ"ã`ìlZÌÙß‹®C m`­KôCù3#Óp(¹)¶Î”¹†X·Ò¡-›ÃŒy<)$™ÿ-•ÕÏ÷Q&0ÃvôP\ÙÃ$î˜?ët]ØšºÒ8„@¾pÝ–üÄA™ñpœÑA¿%Œâ||<‚õÏé¹ïÈ’OfP Kû€ö£ky¦Ñ.ñN?‹òk°ñ„ròï Êu$þ{šN±Œf<9žnø­òçÿ´_þŸöœ÷8Ϧ2¿‘ŸøGÀþ¹¿þøÏA5>N&Ïö,gݺϢƒÜÏkmû,¼Å`õ,¢òáÊz|Ú¾þ(àÃe0ÐùsR#rìâ*­=¼8àn *"Í3kÖÓÆÛ43biÏkãåÉðÔ¶^÷Záþ!L‹]³<9&"kï,›Ã€s_ –ÝÉxruù>Vy¼M9Í¡?Æ5Ö'󇮈'a‚äæ×ËÖÙÖ¦dìXÇ? öL?È"Y’¤”ï÷Û š2!”ÓØªÖ½”°y6qÐ@) õËØÀ4|³ƒÌÛÓö|:+4|:+l4þçPã7IrP™Míë·wU»ä-òaûÍ9KJž L?¼¼~»xÕà•fÏòjïû~cÐëåõBËuÛ¶Û^KÞXdsâ¼\¯nÆ)»ªQÝr½n?mI~üóŸóËK&üù§?ýåßÿíýåßïï_èårý?þÇÿPUÅKWµ;¨ÖÞç[¾¼üðcºí÷}/9oñ²œJflÂÙ]%ñõåòãŸ2‹™-Ÿ¿|sS'-ûžþ?êÞ­É•ì¸þË•¹«€îž i;²CvøÍ~úÿÏáïà›$r(Î9  jg¦2÷¥ 8ÃáM¢¨ƒ3§(Ôeï•kýÖ%/³ÏÇÍÉMë^ ðxlû¾¯ëÅLÕ”‹øNµÖ"E®—5`¦¥,©aôÆ]¤¨n¡ù–e}»\2L`@êØ6kºq‰``XÞžb™íÌ\Ì\%_J±Úf‡o[…»£˜[ï* D‹<È÷Z3/,²ÚZª›íuß÷뺊p5²\Œ…‹š’[ÈiTÍÚ(ºrãTÜ[£@Û}‘™í{­ªóžS#@­ `]ŠaÃûÇǾmµÖm{¼½¸;CDˆ™×u²×*"וED˜Ý©”¥ÖÝÌI Ã$+e)%4¦ŠÐ…1¥rsaî¦Î¬»ƒ‹pÀÔ98G|Jz›™wùŽ‘ì…„™¨GmŒ÷xàä-£ÓF­£³uZ$ÀRµž[ªx)¥ “š{Åéþx¤ÕŽ˜ÈEd]×Z+m[ü|RÄŒ­ýB·š½ÁñÄ80î,"¬7ãÒX)#sD¿Hx-¹Á—ÝæeÔÁÖF8-*©óaÉLF30‘‚—µ 6ܽªF ¡Ûš\u75”2¹tsŸ°µ“v)ED–uþɼãVnÚæèn·¤e°4Æ_l3qwfÞj Û2"…R¥d•ƒV͇³£°T{¼Ö ”FdŽé‚;X 1H$DˆpÛ«™®Ë²”òùyùúù¹®ëV+ƒJMd&Üœ8„©›m÷ÇívW³¸ãÅ!Z×Ò·"ZÛH?,œªî) ƒ6s×,wü¦¸ª-kÉ8HHà`5íd¿à)ƒN\¸pѪ"Òj5öB‚dF ¯nLLn R`‰q5cw‚¼­ŽÌÂèU¾6;ÐÛ&0-·>INYéFæ•(¤/ðLÔuw'UŸHF!ÎÚqu`®p¡¸¡ ‚K*8œïÑ~*'‡‹iÎÍS¼eÀÓ&+ú\rÞgCUËÚ䓜^ªØa æƒ1$äÿƒ`NÇ )亣› 6Û×½MöL‹l cÏajîå(Ùkã“h‘¢­1yF|óðr(˜õ ÷ƒ\?AžSGTÜ® ƒvH3b˜ØÈ˜¾ï…„£×l¿>m Â{®£M¦2Íf=§®?Dèb47z$z›ÈDùè*˜7pòç^©ypµ bŸN­Ž€a"Ë ¥·`Hæ~XÀÄ-­Ðr"Swrïef"3;Ââ –.ð¾Ävó KE/Ñh|07×ÌÍfcF+Å ~Ìïó9»:.Œ Ås*&Ž;åÜ×905£+c^øÇC¡±ë|¢ð÷ÜuŒî³oeð]zë.àô‰°°™£Ï°³Â€ûlH˜æèÀ˜KaêbôÜÏÙˆuµ™W¦§@¬ÜÍÔb†ÅÒÎØ&Çw}¹'a˜#‰IÁõ¹Z%f-s±VÎÆýï͈9ü¡Zç’ ÕTÄ^¢É¢æ9P‰q÷IK{W6 žý$A›åLt4ÞÇ ±05FYè‘ ¦V ä1Äh¸v÷èñÈ£X!ÄX%îŠN`²§êòãø¡™dŽz\òìZäë0é=AR¦ÑdWðŸ¹Os\à¹_8í¢[º¿©š9úÎ:¿)3ßr[LdðhSPðÝуa8[©‡x 4³÷/t£ÐÝã˜Äe´ŽSº*þAr>@ÜO…¶ÞgTóc€§±ÊD6ÿ6‘ø©|rX2GîÁ‡=¥€9Ñ4*šz[q¶v?—©ú ¼ÈÓ7 5Ù´°£ú}Ö‡ ˜íüt,ϤADëP’Oqx¬t áìžÚmáAžæúêWÖýàØ^1¨Ö¯¿Å>(h‹ ;Eñ!ØO¢÷dPèW)N“DøJ‚=’˜ü…þûº>{R1SÿÞyL¿í¥Ký›ÝÀ!ûx ŸŒzšüÕ"?^f#èïÿù‘Êñ2pñüüâ$ÀÿÂô_Éþÿòoõ›+2có®N"ÑØÓ§Eˆ`{%ÄÇá²”ÁXÕÌK‘^éì U‹À‡ºo{õmw0.a3gq»Uð¶ïØ©PÆÒ÷nN¤Ö7“¡§“扭µ6×0þ7ö•í»V­”[©lŸHU½å˜ùry³¯»me¹?îû€H‰)B,ù–RTµ1îûùï…,´WÝ÷ÍÙ‹FCÓD± ¶1XÞ…<‡U Òji|vVƒF çÛtˆ#y¦9¤êçÃe·FXðÀ‰ˆš¨ÜðÚÙ|ÈR@€„£]ÙBÂ¥,±)÷0ºMm0nF"µµòšÙCuÛ¶Çý.R"j¬Û¶íu¿\ÖVúš–´˜yÝë^«E7vw¦Nž*v2ŠsÝ÷hç3Õ¥,?|ÿÛjõóvë@m Œø,hÃ'R3µ¨ºMµ’™Y:@€ÐZ‰¨îû{ OtÙEDD¢ÑDÛÞÌ÷Z³U„Ü‹Èõú‚jÍmUºÅóÌ'„_²Â|ËÝÉï®MsvÚu7µF“'³@„ƒ¯Õz3}¼l)¬æ}j”*»@‚”ÌwwÞÙn¶,‹Å×ô›üz»ýôûßïuûçÿé¦frÌyI$ÌI¯{Ýk3A„—"=“|zPt,9\nÆ"ò‰# ×s“P–„¥ ylÖ´2³Æ[x»=öZ—"Õ• é.cOBë:&N~¥­~ÌŒ2Ȇ”@OÄ„&8)QÒÔvÙÕ+ƒ}$þýÞÉ9\\õÍoêî0«fá\hÏayÏíax•©’:yÝ,º‚›vØ•ÞÞ¸T& _ÂKÍáX¹yÍ@ wóê³uNÄáÖP’ôDîB¡ŸªÓÝN9œ°”LDc­9¤ð!ò¢gÒj⌬ˆo(µtŒ™1Í„¸¢'+(s‡ÞçZz ÑÑìÎŽv£g=¾µô?¸ç2ÞÚž‡c¨hÔl¹ Bš,ŽRÒÇߌ–Kn\ŒÍôýXK `œ+³¸‘°ŽQ[?M,Úäã³ÌêNoï7mšF"lùÜ8ЇÑâÐcª=„q,³ÊX ma~0íurUS­k!Ÿeà ž6„U|aÂìù“|™ÝAÆ'DV6ýÆ7.xŸvx,z{›EŽWg¶s˜œ¨¢âÌ3ßüÉBÍ’áM‹†tšâo ÂØdÕõÞÕ̳ªûr«ÜÇ"±Òoa4 ·{%©õ°³Ë€ëîZÕ’„“‚øÈ™´W›{KcF gÏHPàïú$n`ñéžusïªM×®ÛV#é³E)«ÍU­7˜3,ý»>ÔÌ ¿|»\5W&„px¥dŸ{â}ŒZ“ù©´ Çùýøx挘ròtttkü¹Z1&HD¤ûé‹B¿•øä1ëRõqfSüFИpÐñ2éc`xyÓûn£fF€y×"N¼9NU¿Kÿ} |,q‡ÃÐÁÊã^Ö0}Fö¤sçú-;x¼åòÎ#ê®Æâ ÚÊHç#¸aÖBFÑ7u unÀa|:Ýc`N}~š·dŽ¡ÍŠ2³Ÿåÿ©bgˆœÝ¤ÙŽ¿¿‡ x»¹`FôÔÛÖÀp(K˜¼‘/dcŸ¹@Tuñ7ŠÙÆ¿<¨j_.9ŽX ¼<ùëAÈÓùÍ863•â©fæT¼rfãŠÀyxq(¦Ùtø?}œ.pw8ÏÈÎÕ@À7ö÷×›%Zÿ ç÷_Ðy}Jˆ| zòôLò²^+οXÐ;Jóð_o1õô·"ÿ¼}üG(õÙ\áÏ%þ¿˜¾àiÎô+'ÿÀsŽ¿~€—¬i~‰§TÀ<ýÃ<¾J[[Üii¯Aã›ngÃÍÁNÀ|7?ýŸo>{2úM™&²ÿäʦ6'Ý=Ñ'¬D’Ïz6qød:ÕgÌ >5rK?Ér„ÁÿÙNÛßO ¹þ4vñÓÍ× -¼öfwŒbÍDÏMèã÷ž.²žHPO :T/ý©QZùùóËÛõú¢'ÿ-΋4 :ÌÃåG⥔"¼®ëº\Ì뺺[­{aBÔrod"²=·¯_ÝýýíÍÌDJ±Ì0›¬,a"3åSÛyÆ­šÇÓ÷c±úpç†m6ìšH .Ërܘ"¾Ý·O®×åÁn¤DëúñÝG­JfX×j¾mŸÌ¼,âfD>Ï·uEfºmûþðÓ­ÈÏü¹j ³çº,ëõr-ËúþN s¯ªÛ¾oZ÷Z ñz¹p­ëõrY. º?6ÞØÝ£­—@×u•" Û«Êf,² *­úÂu]A(²|ÿþý"Øm÷ Y;q^l`ru2SÆ!F_›šEq%9q‰I Š“¡89¹˜Z$HúH*:‡ÕLU nÌ1'0B­µ÷^~~~ÖZ“­ËÍÒ>ü¬¦ÍPL˲Ô&¬›wm¢{W©+8 G6ynƒGò¥/¥SOòÅ݉¶Bðž Ž]ò˜Ro:žJe›6b“Á/'@­”ÅD±µ6Š5ën_¦)wòç&÷À óÞz¡ƒ•Ôìö4(—DD6“øàº>ÉFîÄè›Îòn·ŒÉMß’FÅ£ZÔ…»Ë2‚&ùºJæCL£ÞT2œxÌÂmqÿ¢2rÒ÷l¢—û^D›Ù”øœ'4D˜tGw—³Yý x&OïÞ“}˜v×èE ÆŽnÔì¼È7–;CóDûHõF*m936Ó}׿lX¢VD£FˆÔf±ÅvÌ'§t<4xÔ®p“VmH2}lÐ$Ѽ&S²7x¦5Ô‹á½ÑäÇÏüA|‚2Ýc 0 "‡§—Ðr›8'y‰¨M>|Šu´¼+œFä`‰á‰?ioiR嘀¶*¦HÊöeÇ'Æð#8©o;ºt‘¥òž¾YgnY¡L˜Š¡Ó‘+¹ óÝï³ÌþBÍ™VòšƒC}f0Vo†.b^ ?ö‡”¢ê÷mÛ¶ƒß¯ï¿ùÍw[Èm ¶]7R&þáý·uÛ—¥Á®bs·­ÞÍÁ0'Ñg­u¯nZëþÓ~»^¾|ùZJùîãcß+¾ÿøîmYÞßßÍ4LNêôù¸›iwUµÞ¶jzýî]˜¿“…ý·ÎjZUípæ•˲.ß||¹ß`TÕ_lÙk%Pa¯Z${Swµè$Û¶MY¾®ë*…áF\Š®!X ™À #ÌõXÊç¦ÖhFå8Ñ\˜™(ÜùuÎX ?5ƒ½°«ªš g†£™Ú!}X£¬²,EÍ™—p‚©ªWX«Æ UÕÝ™¹jݶȖeÙ¶MDÖõÂŒZÕÜ„Øû¾ëã!"o×·IhÌÓ‰à,ÿÈ蕇ÍÎ?Uû0iÞ6çœ 4“¬3psæeáØÁö[ëý~'òëÛÛº¬Ë²Ä6þn-Rh!§Â²×}ß”=„l€ïÕj%‘099³Ha€jMi›ÈE¢†µ89KpN|`š-†DT„;všzÅržBÊ1ÀcŒ:œ:Ñà9©Ù=ê[Aµê²,qÃÛ¶ÍÝÌ.æøúåç½ûƒñýýpUÝÝéñØ(ß5­›jÛïÄ4— wš-öìUΚZ÷èõ]/W)˺”}Ûî·Ï0L-K!òèÍ1a–F:Ìâ_ö!wž?6ò]…Úóv‡¼šZ£EF õ“ŒA_ ÊÀeY¼y£J·Ö¦nX#>ûi¿‚Y¹ŒÔ‡!‘ 6Ws'c'€E ÿσÒÞŠ Dn$¦.'{©: È‚m‘âÍÈ º×e•´Þå¨#ÔR‚±°ƒøýíúåö±Ýn×÷–$#65¾"”¸j–Z+‹X­ªÎ€›+4zGB¦‘…% Zˆ¶‚i!ªj4‰RJ<À¼õs:9˜XØÍ­j|uÛ^µÖuY¥y <=nRHca˜)G±_(²QÒ+Ñ5®#cO¸Á§­xªÕÖ ÕÜkMç›=ºqNªqà²Ü7c%&LK½yrãP´ö®j¤,Hí áÀ¡”,}ö°5Ëo²ù8ËP{D¡ÖªfÍŸM" íXwHÔ†6ú_Ó¿ÍŽs!ÎAù«ËÞªÍy‹›+ú€ìÕlÞÎ`BEˆ$#Yf`*ij ÀÈ̉=0„C¼ °Yx*ç4jÊ¿™&¢ Q6>lÖñá­ûc¬Ûhͧ¬l_è6‹âÄ0nÊþ¡²éµ ¬`rç8ôÜؾïŽ9§÷‚æÉaî³BÊfGª“ϸèöU˜·ã8Mûd¢??Ós=@Fè]G+#ˆH«X¦GOWòÐÍÁÉiÞüf;uvG|]=‡h-æšÂÉˈ¢Çh{­ñx# 9 ž¨ç õ”ÍW/B#wø©m¢/?iª »I@ø(`¤˜¯_`6“µ½²<ŠOÛZ /š_uKûYCj™é¼1eÞ}îßnï¼ßϧ¯žÆŒ§©è!o€ú³¿¹“ôA鸕6áó^é‘càjý.±)B±g! Z”Ðæã{›ï]>¼ëƒ 1ý6¶ ƒ¦B;+GƒÑ˘綋)Þ†—m÷„†Ü™Õ‰1ÅVüùÌ%´Ôù¸Æ(2ó h$ÌFœ 3mÈ36f–3›~òTÞˇiÔ#Ÿ5°¸ÆçSyÊGtâüÅlÆ|ƒÜAƒ—rßä,+ªÖ#>÷ïF;:Ú¤-žâ<QN„#:øæã*ã>ñ#ÁþHÜr2?[ÆýÉ0ì3ã·E!Zðaló1# $+\Θá³ y²ÖNôiVØcW>ûA‡Ol]àS£ø¨§e9†E?p¦ì̲z’¢Æ]bz#'–Á$wãx÷\&òã?É½Ç æÄdèAƒ6£ñ'ýÁÛ6„µ>höW1ƒ›÷è±(~qG2øó tÖ€æiÉ1Î0Ÿÿ²ƒÙn;(Ìþµ]3Êgz}÷9Žâ¯ÎNÖkF¹Çqf€ç W3€oÃx0ÝŠ~ wå§¶ê¿HôþÛázüïí^÷¿óÏÿÒÑøÕåÉM÷/þóìÿø3éÿ8Þ &µ}\¯thö}‚áh±? àSl¨-Iq4ãûÈ ¥ÊÎçyõ:1‚z˜ “¡S*r~Tø¬ÚOQf§fONüì&=*@ÝùpJ÷üAþ¿ øÜ˜;39±æ…ž(eëHŸ°¿0—¹ ·ý6nO&'b9-!F$±Å±[«¨3÷üã|o·óUãx®™ÃoÞËð˨âæ÷Ǿ,K@˜“ž!@ŠH¨BB²Wõ4T3»¹©«køÜ½î»©Òår]×®—¥DÕ—Ú÷Pâú±‰Ž90\Á!éZÊ}3Öu©Uk#³ŸŒÿ Ð0s¨Ò0J‘E–늭nû^ãŃòþ~…áQëׯ€ª­—.b´ÙNºëçç×}{Ø?üwÿëÿò»Ÿþ[0f®Õ÷}ûŽîÕÝ5|Ê÷»“-eØömÛèÇïÞ˲þëïú×?üáýz½\–µ@„/×U s"­ú‡?üôØîPúüZ~^×ÿñŸþéøñG3Hw3‚±\?–ا/K©ûcSÿ~÷o>>Þã4¨{½m›¤)f¤JJÕÌ_#Ìoë…Áe)ÌЪñe)X°.¥ª‚ˆÄƒ ïìNÞ%léÓõ¶Á›Vfìû®Õ˜É*U#3eöB®h¸¡†–j2Uû¼ß;NîaŠg¦­V1wÕÀõ N±#–uU½®5]`"C'IYAÊöøôÇ™×e Ã)‘.V 1Ûxl‰à©Õ¶†ÒiÉâAf—R–²”RŠˆOUa}ãN@Íö×Á~M£z‘+_ë¾ïÛV÷}Û벪)ƒÕ}«»H)¥¬ËêDæd楰ªƒ´š³€»vky3ߪšV° ÷•™¹‰ƒÀÏyòÑ»økÊE¢þŽH9Ô¼i):4—nÊ*îª5°K˺û¶o±åÕZãâe‘ºïfºomûðRJ×boïÍÏ„õí*̀쵚©©2`j=TÑ|— Àu߈`êD0367î„̱,EªšEžÀ¼ÊÂääªÈº#sà‰M¨4}‡Ì¬\;[ä< ;n¥3SµÙàÙ=ŒqÖ‰³ìu§†—’©¥j¹Ùd€ƒÿßìjžª âe‘˜ƒâ?¾Ú€”GëcëÊtN³¿#rãYòHF¤º›§@kFêÊÆ÷Ûí²^¯×… ±p43òP3„DX¬1¢×Õ!Q[lªõ‡÷z½‚ ½_4Ðlªû^ûh­ „ò}EÔ„ÙT¯ª…%ûª’9 —øÊÌš è1ˆj2À0s¤ºGî^Õyòz:¹º¡ ¡"D8ú!ôÚ³¬\D8Ë 9‚&aе®'ØxJEË`SÉCÚ·´Â{\yá å¼ ‘RμÚq3rÒ¤¶E`dzxêwŠÕScWs36kEŒÜ²â“&JdûL=ü²n€xß“Æ`ó¤É…s¯á@ºò+⤅{,zAiœBÎA¨'Ñ*¬¬ìÄ "Dr‹;žC¤ ú–ËÈÜ„äÍ@|’^`K 7BR¾xh‰‚2ütc<ÜXG­z{òÜîÍ¿Ïó4LÅ=tê´“&}ÞªÃGc¸ÓYêu¶-Æ…†¯3“ap“h”Ó©‘¹I°˜ª0ÝZHdê¤t”ÛØVd î\ó›3ŽÑ_z¨ŸTÄÞ웆e˜G,+©ÔÃ/XÄI³î&#$¹.g±<ƒÌº rlTl×RT@·ÙØÉ›/¸uQûTþÜÆñÛ3Ìgž=Õ=Úƒ>@±Ú.Ï¥C߯áðo†Ãýh‚Iygõ=óÉÙ‰´QRMg†Ù! €Á¹føàÅ^å~‚ÖjùÅáÔéÛK3b¼Æ+ÆœqEŒor‚k…[Á,·¹tñNÏëW§â¨Fw Mõ`ù¾yÀÔ}BòdRµïÝ-SfÀ”͘´Â3$E䟦p錱­)qÂGÃB˜«¸Úb=·Î¶c ‹8éŽaÚ$xe·÷‹Š[BË`}PÔ-¶-CËÈïqÉL'zŸ÷vrESЦTGž˜ U 8ºí G|º÷x67OžøSÏì¤a£Í¬0EW0Æ×3è¬w&÷#£­+»µ¤w ”;‹èÉ´íÜ9ΓžÝ¢ ŸãCS˜Ží ôÂ/ÇÖâc¹Ê¬pus{»xRú­tDžÆRc^ìÜi=S& ½+ì Y¿Ìô„‘)~Àý ;U¼ÃÙ†“Äu2IÆTzÄ(籑Ӽ@š•ì'QëøÀ8¿Ÿ×ÖóÌÀù'üIÅo`¾Iã?NèžÔÿ“bê8*©SQÄqÀ~€òôsì¹i¡m Žãág7²Ÿèßßb¦/ÔÿcÄÁuðZÙõ'eÙ§ßsÈüb™.žF ©ý·SœÿîòõŸõ ü)fñ͟ß:ö'\ò üÇÿ~_ÄL ¿æŽ?¦5 ŸTvŒ®ÜŒlØzÐ Ð}iÊ­ÂtÇyéi‡AÈËeïÓ_E‡IOUGxµª©9þ¦ còö7"q²ðøg…‘ÄX¿—Súñ°a¢ÁÏ“vKJÜF,—J¬‘hf0ügØ’žót  ½)Ôâ§P¹Ù¿ïtfñσ_–Ê:MiŽ!™šíº­n,k ê.Œû¾»:™›«©Z!4ÖÇöø¼ßÌ­Ѫk)£#k¬Ô5TãÐïKi÷ba5}l[L`ÂC·,ËÛårß¶?þüsxf鸡 Ô¡AÀáRíN ˆ¬K)"7,¢1&ZÊÙ)’RDXDB—ª»Öª×·K” 7j7¹6èyžÓV£å×ÒGÙÜÁ󎧥>fe¹Yñ½ár†õ®m™NfÎ_]â¹Yu''cbîÍ´L9´>öôá”È¥Ï@V1µ6E¢ ¼µÓ»acÇÖæN½†éXDJMh6s"–Èt`ç7» A&%Ÿì±‹9EFšâ¦NG&¦we)Myi®©º¹«Z_Sê§q'´‹†¥ÄqaÐ%2å0ÊN¤ŽÖ…Þ&‹“iºiP#PݶÏÃÙpÀ†¦¶Þ´w­Ñ§.^Œ¡Ø³Š9ˆc[E!S{Õ Ó¸Ÿj6-ô}¤D#EÑK}~|wh暣oÅ'ó9M¦ró¬{pp¦ÇšáÑRлëÍÛ¶ ·›AIó6= mDJF6üm´Í‰%ÏÉhÐÓ) {Ìϼm¼¼Á­ âúpwù66 Æ¦N…8ûiÞjíæ<ÿ:“³­r[-–Oåà“]™ú]Åú£*›ˆÁÞ‡ÍMõ ðp“pòiâ{‘ŽœÓO†€ä®ä""Ö®‹¶€oÕßYÇ=OÍqÊ²ÓØ&=㽤¸‘ëÛ¹êS¯µ7—Õ(T鳬‰D4¶aÓ‚ cznÒpšø(lÁìs©Bÿ1_ù‘ð ÙÒ„¾ Ký¯QmE—À¸Ø“c$Dz2Þ®©Ž=¦0ßcâ ÊÔEÍå0å(¨WO¥8†“ùwܼٽ¦}úñwùÁÝ Ì¹¼òûAõWœÚ–O.¸‘Ÿ˜2ô´;“>1x,¿û®‡¦Ý͈ƒ8‘ñÇê×F¹¼Ÿ_ü(¬Áa©Ú‹ºÏ-ƒ¹Î<Ú$ÇQy…ÊÇ’€>ýîÙ3þ>âù#3JØòë¬/〽ɱrŸ»èx¤ç [L_á )«'ÚÎÀð¹gz`ªy~žƒ4Ö™éÀ™û‚3 з½äǡȟóLÇhƒ‡«j~A?8Ò§Oâã¦Ño;~VSýdöí¨&j¾s©Á< Í ÇsÏ'“þ¨)˜.“ÞŒ4Œ½Sg7^‚VÜŸ,~êµ>Å*Æ}ç‰Ã7ë—Jô1)80üißRÿS`2÷_ú—9úéLýþZÍÆËàoèÜ ôÿ²ø?þƒã ÎŒuü±“Ï—Ö×x\ãéŽÌó~sô¸{¸¾@§Õ÷0ø·×å§‹.ùt>âròfj<úÏÍð;ß_s¤SÙVnãïŒû%M„{4ŒÞôýª8'"cõ°S8Ç~ô¶c`õß Ož~ÎsÞrÓ)†Ð„Ž|4¸O¯ Æ10vaâY÷ǯ¿pŠ;ƒ¹ªÑ’`ÈÜ|۷ž¬›y¸xBH)µUßf[йîûv<+áú —t †ú–¸ˆÔê6ãÓªÊ`5ûòåËZJ)…&ãR–ªËzmš€3Øû¦ÄR K)bn =±ªQ ˆ &æºï{-åã­¬d&W‘²¬÷Ýï÷‡éFÕ¯ërY~¸=ÿþï?ÜIo·ÏÛíöñþ‹˜1—RX¸ ò•GÊ`)k1µ·ë…åëý^u¿¼7Bû×û§;¶Ç¾”e].¾øxû a'Ú¶ 73»‹TS7SÕëe]–¢»[Ü€ºïÛc¨€¹ÈÂ"²\–Â"æÕk¹ù]œ,oïÂLN»)‰(‡ɪºcT‰Ûʰ©™jæ& ÍÔ¸ïuתy_(…Ý„CÊš²”Zi-%ü¼±á5#S#wµM­^ß®—Ëe)…ªß2 W¹µè}ßb²€7³õz°b"MÜ c][FÞmߪºí[)KÖC8™Ù¾×ºïµVª™0‹°ªÔÔõxöšEekD JB~-vùádo¡XSûŒ4à6im&/¥¬ëÂüQký¼}.e‰Äzì@ŒÉaf¦î™Š7ׄ‡·Å·i€'”<`/Lf Y*_7urmÕzªŠ¸“ÁœÜÌT›HÀÑ$uós'„ ^8æÛ‰sÚñùy‹yaaf-¡¢€„Gu)ƒÜ…TÓ©!D<Î3u¯]0Õªªõq°,KL€Ü¹×5Ñ~ß·ÇÖ? „‚0ªZ%ªñø »´™%CÆÌ„ä¡Õ´6±/ Ÿ9c÷DîMаö1d›ù`ãCy`',iô]t­¬é2¸ Úw4\KúøBpl\¡V"KÌh†ò|–Å,„š…ŸÍ׃nD w?ócZ”Ù‰ ‘P».ëõ~¿'ˆ™¼˜Åä€ÝÝy· \–eÙïNN¶¹B¥0KY¢<×I(°*éZ&½ï[Ýâr‹Y]UµªK)²,mNf)‡9Éì"hJO˜´«jÝö²0×ÇfK)ÒòwŸ]"Ñ¢Þ>²ÇœÉ=fZî={hæDE$N€%&s«u'^–¥?]c¢Í«]«îO^ícâSißãRÛiEÇÑsÈ–O9w‡S‹WåøŽ¨ƒÊ's¶¤!Щÿ'24w)¥¡CZIe¬™º].`ßQBéÈØisë  "3I¨Ëæ.ÑJ}ÈÇ‹x®ÓÐNïÞmÑùáø nfàVYKîAëíèRŠ,EX¬Õ˜©u{çΙ)ƒk0¦fX9ƒÝȹߣ(« (E“$ŽŽjè¸økä!`9Í5{ÝxÒ0_íT¹–+Û5A/6Ùƒ‚?Ìô³7öp3$:QÖg+ï¸YÁÜ2JN2p·XûȪøe) }ùÊcvÒ•¸<åCóΡÑT4Ž0sNÛ.¥3mºàÓbé?؈ëyäã~‰3å$4à€¨Ec ©š›éÄ^Kw¾çÉ‘e›#0â½ø=ÇEd"KЩƶX²õ¦3·¤‡õ•CÿïƒFì€cÈÖt²¢#†v‘_H‰s>Žßì510žÎµþD33„!RºÏÆÌ«o±›Y¨5³>® × gŽÑýë'É®ùˆøåXây·ß‘ìq®jDWÝè•·½– UƒØhÍñqØS§‰Eã¶Ù [ß[C"rÀ,ÙfßÐmÖúžT)´t\g|±ôÜduWJ»w+Ã{å½|ÚÀÝ'Õ² ž:N¢9h¾k5?wX¦¾Ø`lRŸ^Ù-cp‰ã«éÊ=æ1Dzº{ÑYDòl35–Ç“4!|ã¥i®YʵF-¦âìØôw9kšç“°å¶:«iL!ÓwBG9HÁ\š{D'f½&S‡[ßPç6ï>a†h@™QUsÀât`ú|ðu—j`‘§|?R˜ñ…ÑYž;f¦O‚ü`Ï¢ ŸpÖ{_Ò<õâÆÓðo;m³¼ž ‡„ÚÈÝÓÞžÐáÖG¯«O])4ñ¾GæžÉcùo·•àI>~éòÆ·õÒiÈrÖlÛ÷qPzý›¢µû·sü”æÑû7,êþkUÞ9kq LìÁ>xrÏþù®{L ÿ2ðŸ¿@Mÿ%yÑ)_q¸Ò^ ð7z‹ÿ€GïWþ17¾œã3ñ kö™¡¼'¹th¸šsýì í IDATxZÌ´˜Ü¶(>þ°¿4›÷"öÀòtÁ‘{Æ¡4<E‡‰ r¼Ï5ã¼´©C7Œ £˜C‚o=7Í4Óæ†¡ÃÊÓäžÎÌX‹ZV³„ë‹Ú“ó€ÂTàÏUóøžHݾE¤£ˆ¯m$ãócÀo%ÏþôIwþ¾Š™ £ª±ûRBåKY]BÏ3r߶ݶý‚°€¨0¹_¯sÿÃ^—²^–u-÷»¨ªª–RˆÑtJ^ÕB|]/«ª9Q­5¾K›–u!)nôðë[)KÚ_Ü·mß¶­ÖêäµÖ÷·7ä…N®êQ5¤”8;r ꤮ެ[8`@DÔIÜEPu»í¾ò{öä)±Ñãös5{[®N~)˶W&'%½_?.ëѬ˜&,€|!¦"û¶ïûæëZ “±i•Eœ|W­î.l‘º«Ö}¯õr½~÷öððy¯e!sfx«™5Ó´$W}à¡Áéi6ÓЦW.Â…ˆªš>6µaÃ/Õ°¨V¡ÎWß½6³J)Rxö)'ËM]4T9.²4L z+Œ° J)‘$ßkÈ\c¾õª¸\.¿ýñ7£zš÷.HÚqRw«npŠ:çD`çˆ]!EZ‹{5E(õ¯u]3‘ºWoì‘ʆÀ¤fá…VDl¦¥ð© ò!ýWR3 ©!XáÐGp­È—X×u~+¢#¸ù ß®×Ü-»;‘´®O)L uCšÄ-nšJ$DjjÌÍ>".Â)qÈR$ÛGcÃOP"­jî ,Ù¯hFH‘‚E˜Hšã¿wçÒ,"8U<œ¨Nä뺨¦ôßÿûñx¸{¡¨Èu"çì…‚À5ßW£¤ù‹˜™©’{H¯nfðªJáoÒ|ôÐ&DßâHdC@D2êî CgßköcØZQ9Z¶ ý ‘©…£ßr@é¦1s ý|}Õ¨VŽSѳa™¬P4ù8ìí›ñ<ì‘wQ ¾ˆtˆmÔXz“:Ék‘5eÌY„ÐgRIÝ0RßÝÈhÿ^; <„µ$B¢©q¿vc š^×Ëe‘ÛýñØU¤|ÿÃwï×+ýÞ÷mWS€‹pÜ=˜ŒÒ ªä°ø°Zkò¯[€,Kpâ(YÌLȽ =ˆ žA dݪ³„håªjb’Õ½0 ¥ƒ]\ ˆìˆ3UÓÜšqàw"B4NÔ]Õj½ßëeùþ»ï캛ZëJj»>–†òL݇™VóÞ:8÷pÎëU’”û¶7“#s‹ÎÖÙ1Ùŧ°À$ጬ%iUÏ–ÐñÞ4òKÂv›cˆt>ɵ 66ÜÌÒý„Ü*I“ääîNSȶÓg°SXô-y×­#)îf¦ªÍÐÜä:6û5Ê‘›iUgóø¿¸]­þ–½KìžlœjŠÆ\d”›%ì,¦SqÛD›* ´RèdP‚-‡;¸;u}P;"…Ón+îJTÜè1”½¡’g,2'ì%véá&îØ™Lôœ~wñ}”&Æò[[ÁIO’ÌÃ¥£4:6>1š¦Ù ˜ÓmÛ˜'CÖä±IGW¬}¶_‡rÒ'Þë‹á”-ÎÃ$LˆžOÃujÊGʶ‘4T0²À õÖN8‹ûxš8™zS<ã ã ˆÄôÂLóÛŸüÑs¥eÄ%†‘¸KœKœfñ:øÞ»ª)|ÍnjÝ©=Ÿ‰ùž¾0óèï9`Zû;<ŠšsÏÖTz”³é4ŒkV8‰FH¾üHtƒE„¨?°FrìÑsGäÏuÏýÀtju<h×xþΰþÙçfD®êýŒšÁXþꀅ¸Ùw%¬eÒ¸÷9ç3Ê21Úg<óx˜™¦²tw‡j‘ø´sš¶íæ:\êž3­9ë“Ï{›®ý6¢L8ÒLÇ\QÓ¦°“IÛ¦æÑÎù:*´yóÙ¸?ÄÆ±J·¾Qï‹Ù#¼p@ øTŒÔ0õýb†Ílt̵ë)ôñ8îL%#°‘± ©¢Ýâ»Ò=AZ°ŒÙï†\`rj{d‚ë9'èG©l\úY->¸Ÿä¯ƒ6šm1Þü$é`ðO½¯'!µ¿ØAAé´ãÃÈ€°"pzWþ­ ×ÞÀå “_sDŽn×´“AÆ¡‰^9&ñm5Ñg@Mg✞¶/¼Ñ8 “øH=yÁ¤rywœ¹L45:ôЉŸ?9ñœhá'æŠOçÊ‘Ñvçþ­1ëñßžÎÙɬð­ñéipöJ·èÿ‹\áx¡YÏUxbá/³áãï`;ÿÇQþ_ë‰çÿØ/~ˆ_œ³½Ö¼ÿ1ÂßÍþÿÂ0+çšG ³®s>ìT ÜQ‡¬X{ôÎγÙÆ#­w @a`púf!Wtý FŸÙAü0…À<¹M{/gÄBn4eœ TÚFœƒ¦;/Û‡G›ç=háã­ŽOÝâsð¾ýòxõÔUSñ|ÙÙ…7?š`äè­0<õ»9˜ž°?3Ém.>9åÁðJß÷Wuñçs±ÄÍ}€ ˆ¢:²Mm˜ˆ>÷Ðô™™Š $!f®µîº×Zû¶)¥¼]¯{­û¾PÓërÕZÛ¦ªN˺,ëåRµBXÝ£¾™‡(÷$Aº\.e)f&u³Ù¶ÍLùãƒ(j.cÇíD^CÑHOJ¨HM„» «’²‡ÀÝ©P1câër¹Ý>ÿþóår7²Í½ª*Cö}+"dôÝÇG)ëÇõúåK VQXõ‰àÕ„=P§ê ç§ÖÍ̈ª-e µEY«›+©ªÅTƒ™×R–"ñqÌ,œÔáL€YŒÂÂÊÑhºÕzßk)E@pZK¹®×P%Yx«jVÕµVSa‹“mû^J‰î»b'&áFŽ $‡ÐÔa aÂ3DS’AÑ0¤NÒ4`.E,|“fIá /—ËúÃwï÷Ǿ[傲­Õ#"m–‘7‘6q3fV3·¶‡÷?ŠBÝP5@Ä –r¶}¯µ.…ˆ‹ºÆWB|K Dx]‹EiqÛCÄ]¦úYUµùfY—eßw 0È™ç*òÜÎ}pQvºï»ŽÞ¼°‚ò¥,îäVM§sjöJQK[ÍB¡Ì¼ƒ%ÀýsìjV³>oYÖ"ìÁaæÜ2äIü·4ŒGD†ŒÏ'è˜=ÇZä3¿^¯µVU]ÖÕLk–‡3'?.‰¾`Ûv\æ´¼†$À¢^£au¯ÕTë^UMÊQ†ì”p—­Û¶{a²–£ìÑŒÁM´«Í;yš±ä Â@¤Ñ'!"yJIéMqPI> ÇM&n]î®dïH[PÉÝ YÞ@3sWêŠp;WÕ5ßônó¶{Ïž@ ô„9nÝ…ê8"MjDZû¥3ˆZ´ƒ‘‰¨äE3§vìnd¾§‹ûþø—Ÿ~÷¸Ý„ËrY°ªŸ·Ï­–xœ¾¿]×RTÕܹ À3ƒÕÔˆì-½à*§Âblh“Dß0sªE.,p3mRšÈHêµuxÌÛ˜yY—¸¸xÉamý1¹IF÷Öe7¨"äd®~w€ØaýóŤ\–àÜ[¤.€e].× ‹Ôº»¹ªæÜ.HYæŒ4cp·ÇÉ9E€ñiÜA9»n».w‚[t%?íç¦]?ˆØ5f~3¡Ûägð¦11ÇP @)‹13WujÐ}ïHÈcº”ºÊ¡æ[šk ¨W32ò6_ ÃEÖuD“³ƒbÌÓ7®ˆmÕÓJ ¦„“¦b­¹µIxQanìÿŒaKn?Í,Š‚b˜É?ÊÉ[èc}6‰QtÐÔû58±ÒšO8À‰üj-X=E0öÄF>wú¤†“åËë$¥}ìðsLçÖ\5W ;-éæ>{€fð©„2Þ÷å#pÚÙÙà^n?AAsRÔNÀ88SíÄ”¸Åùï5¹]³ ‰f°˜€“ä“2îÎ£Õø…3/:Ã{øÀH}Xš½5q On÷pJX·˜Žs¾­æÁìJ•4+G“°×ÔjæÔ:qs–&a¶^øÀj ¹TOYz´ûd[LP-£©­ÁºXìÇ“×gmh¸›6 ój~èéÇ'¶ê ÀÎ1±‡I7թƳC›ˆ¼…DsÐOo¼õ¸ÇÏű¤o|ÿfaŸòÊ$ƒÔð^Gÿmœ‡èž†ìçÞå<ãsÁЫ0§ Mgýáußž¥Šc·åêÔ¼Ö^ eCõ2Q0d︘cÜß‘Ô)bÔäW8©¥fÖ¹r¤gDzΆš>in™`•'þ“ŸÍíÊñ´éý©N~ oÒëƒSo¹g'ž.Ûi=m5Z-m?!‘™‡Ì—P÷NG•¼QðcÐê’|¡œ'*Í<–6r›FN C/pçêOªB*SQŽOX•6•ÁhC„‚…;jÖ²ÑMã¦ê“à BC žBÅx¡Ô5A—:ÎçÙ:’i½á>M5h a|$$óã Ãúá µîÃqhyzTûµ0ô}LX ‰d„–©sð‹ÎJð^ƒ9Ãø4ä>Hb}DáÇ)ȯ±–?ãîÎÌŸù¼xIÞ?ÓrfyOӼŮü)ðÙ›rúyz4OÎ]!¿ ¯ûë¡F®ñvøêðY‘Çq5{*ÎxMøõF~<;yÿjÙÚÿÃäoÿ›¼ÄŸû*xiKþëÔÿO8zûÿ7&YøÆ˜”&ÁáÕfàrU<­Ó’ÓM‡{ÁÔ1x€æñ?ü‚ãr(=d¹\ˆçîñfÝu<`e d=×½ 3XLCqLUÁääÈ´®«‚¥Qç6âæÆJ ‚Ó½3Ÿ‹3®Nλ‰—‘ÞÓ‹cúáTœbfî,˜z‚£IqŠ=å2HÆÍÛ Ø:sïÙ×oŸt¯Ïªúšˆ”ÆÉt÷J{ÿ|Ñkbe¬NŒÂÑã¶é×ÛçׯŸf¶=¶ÇÝÞßß óR €Ûí¶íÛe]÷šÿ!"aVSf¡ÖÏɱ½Q3bfÓu]·mûùç?†¸0ºX–ußT˜=œïìªd»ÞX ƒ$³#ä119UV6Mjp­û¾ï»š¿ÓR ¸ÀåöùÇÛýÎôRø²×ûã¾]ÞÞ8æ"î·Ç}SØØ÷YŠˆ©Þï;1Ë£ÖǾ¹ÑíñXß—giDÖ½°0Ñ­Ö…96{o—K Fy6iå:”…´mÛ£+•·^Ö5ÖHµZ\–ò¹oæ0"µ-G^÷h)+3Ť‰KÐgǪ1ƒÉUII«j|GN,Ì¡GäG`@-ÉÓæTÍX¸ÖºíAqIãs e„™™–².e­Uóâh6ÏŒû¼:‡›W3Ér³nHÏ…À"%6om{l»µj˜îC(%´‡æÎÌfZ«†™l@a˜MS‡¦ ·ø|ZøSúé”Y€E–¥)¶ØCD¢Z}òp´l1s)¥j/ÛöÒmóéYš†Q3ïÙ(*GXS ÀÙÑÊ ”Íô|À¯¢ÃÔÕ¬î­T6ÿç<ci¡æV>µOâ½1‘Á£ ¡ööIläNjËîû«jŒ=äNjYé\µÊR˜Î$Ü* „<î6D´ï[Y× ûBÂì1z1uõ]kaawˆ *gå¢ý½ààùh ¹{qôŠqµÆ7É ¡£å`8:`™Ü0œyu‰a®4Ây*ÂTµÖ}7u–|f0³VʬFËe\é˜Í‡îÑ’§}ÛX¹ÅiÚšó4p$Œ¾ŸUU&ÖÁ,"sŠ ç²ç¬¥ó5Ÿ|®>ìJkÓõ»&ÕØi<ƱîýƉ8¿C°Æ„ç;ÙGH…ÚüئGZW Y¹ Ë8G³§Š»¦“×E¼©=½·ëæ–FYSç§©ûž<‚ÅÎÙnÐÉ4a±é@ hcݼh™Šk¸µXópS˜±ðIí}26f%@´U„&èACñ¢üA§nïy¢µ7IÖ§ñ(õo¼ ždlÿÒú·ÒÖB£LÛÌ€gÙ;G(æ£lŒn›õÐýÛÕaÓð,Ç'Ž»°}*L^ˆ'ãæ3 Cí hÍÏ$ y°žú–þÐÌ û$0Ž<Ó”ÿ9Z™}:y\¤ì<4„†H?ŽÚøhŒ3döaŸ*r›¿ ?òf!~"L!€‘²€,ëg#â+ןÁ‡K?_~¤çÛY»˜&8SíñÂù)9æE~ÇñZ¼ú,a®‘ÆñWu¡ìIÓ¼üIšqX‡¡q^wwÙV«ƒó댅ã˜÷àùútNwAƒ¬e®5̷݈ü ™÷¹SX­Méá9¹– Ù,—’çé-M,~D„wâ™1Ÿƒq‡0¿>m¸Èz´ñe‹OÔùш©áüUà4qüÖMïOœ‚…ÚW-< ­:´{9F§.‘›³ÆÍöª{ݘ™µª©AÀEäñØÜýç/_j­¥ä/ÚkýãÏ_Šˆ‡ç`ˆn"\5ñ¶ïo "Ó0O'/åË×Û²,ïoW"RMÚj‘p!*,;¹«º©©Ãó]·Xà2ó¾×½ÚºðýëÖUM?o÷/Ÿ·ºm}÷ö‚î¶oµþûç×rÿT§¾ÿîÂË*\SR„”²ïµ”ÕŠ™écßbÒ¥ênº¬Ë¾ï×ëBRX Î(2ˆ¸”Å}‘òõþy¿ßóão—‹™•"ªõírùîúf¦áL6Àvwõ"Ì,êVÜmaa*¼š¡H5ójih8àÂNå"¢ ^x©®K´ègC"Àxþ‹Á÷º‡b«laéMÜNµjI1 O[•YU«Uã+6÷qe¨£¶ZÍÍ I…=7çž½¦fD(ù †ˆ¹…=¶½,‹ˆ´mÕÝ,ÌÎd¦Yc"æåú•mߥA8±»i­QÁ(ÁÊź™Í&¬Ù/^¶P¾cP pY3ß5¾`ÀKífÕmA¹–¢–°®}÷éÂø"¦ÚªÇ¶u*ï‡Nf^D‹”R a 3£·ÙL͵V2gA)"Rúð†@p.…“¥‘{öô»…È#AƒÂ N©GSÐg6ƒÓ†Üd±R²~Ó`ˆ² =ˆðž Í¢Ú—wt@ª‘ ûöxÑIû ÀLÍ4£µ,ÁFP¢è?`Œó¹) RígV|Nn˜ù¨™©r)¥”Ø™ï{­UAÄŒ(®Lû™“ðF)ñÎv³˜È“šÂœÁÄ6¾AsKY‚['"‘ˆ›‹3'/ˆ(ÔѦ ³YM¦ ³ìïm*’«3æHÛ¨ûcÛc·¯j¥,—eI0óR$FbªV·=ua‚¥¬Uw&p)ñ>£”A˜—Ëea†pPƒ÷û®¦ŽHjPóÄÖZÃÓÅ-é£ JŒ UuWkO–ôsÙd–‹È³”ÒIÞ-F˜Ó 82óнõ¨6~‰i8Á˜ ¤HgEnÉZ-<À'¶z…šÁÂp0œ¼nµßèÖe¡Æ l¯7¥)…Ó¿»CØyȈmQrdGZj$ˆ÷ •E#2ßC{ÞË =/ÌiÓ Š1?w*sp}föØv¸3“,*C>È×õÀ‘¦à`Y¹‰Z¯¹c ú7@Bô>x´xP{ÇŸì’Ô¬E¼ ¯Ù¡ ±H¶”KƉÌÙÝÚ”-gØ W“c3 ‹0ZóL+'0Ù1Ù™Ü0Ü, ¦æAÈ:M¢á|rÊWtò£±9º‡¶Ä!|µìˆÉ-ÆÛ6³¹&ÑMù­x3™l'<àÌy5¼½Bœ•<€n-Cèøo‘×¶jîÚ¶híHÏ ÄÿOÝ»­9r$Ǻ~ˆL ºIÖÒ~ÿÜk¾¥aw2ÃÝö…»GDÕMr’6o¤!«P@"æf¿¥›ˆ§ª1WS8±ÒæCÖæ@â•>]Îø¬ .ÿi Í«¬éáKâ(ò¥) Ñ [,Æ5¤KM¸Ó46‰ÔR¿’³Ó¸~¦<íÅ©–ñ"ùCY XPN²›r®"H%ßpIl1SòhX¶yösEŸGÙrrE¯ÎÝ¥-mµp–©ŸðdØøÜ–qÕ<Æ¢eŒ * 0žf7‹‹‘ÿò;n‰I#Ç%qž`½«J»Hÿ<Ê®‡j5šÝF]7IÌ úâ’<±†FA1‘Ò0¸|õ~šFÐÂä[p^rDÉÛ™À1I‡{fÖWæ™zF Œ¯ÝA™s­)7P.5X°nñ1 K1Fƒ™¨h~TV(›ÙÇT‘ÖÀFø`6·—œ§î[þvž;2ÝÏæŠKm»çÃoÞö…œ¿ ÁÌ™^¬äCÒŸqŠL+–3÷|³WD'žké5åêdZ|ö$ÙœPêËÌš7¿Ápöô:qcÖ¸/}<ë1—ˆÀòj h- 3 Ù÷^ý‰X¦·ŽeŒ²²‡gCO…¯•gÉí™Y°FM.bñ‹¬¸j@ÏÂúïZ^!,—vœ ±ÌK÷õ×q½Æ>L\Ì®ü# 3~X"›þ1zþÕ5ñžG,UÐóIÉϳ‘GžÝø¯æÔx}‚!º˜5¶ò:xy>øå à ÑÿµöúªÑ ãZ‹üão?õ½âr¥ÏÄÊe."¿ÿÊøTOfþ‘ŽýÏ’žÿ;»ÿ úïÿ|¡ÿŸeÿÿŸòÿÃ?rA倯ý2h^12Ñ ž£j¡‹¡bU‰yI ð5P¥µ‹Iöë,K ¬ã¨E3_7àØá\nQüä|/å.þ)$2œ gÖèÚxM¹V–Oû`¦ g¦ˆYô9ò5n §_ž£ÃQ&*—ñóCñ‡YðÒ¸¼6¿¬õ¿ë³ŸgÒø m /ÕÜ?㮵۾·­Q!¤Ã; ƒ%_ŽÅ™3ý›?Çyv‚3‡.Œ¦-$x"j­ýòõ«0Ÿý C qÙÌÑ@~äá¡ %ËÛÈÿs¿½©´&-íóìD8ŽÇÙOëÛ—·;€ž, Ú¶MU÷¶©0uú­Ç÷ç~ö°#u£¦ÚZ˜ÈÏ~ªn¿}ÿææß¾ýí°³í»¹vpÛnÂíë/÷/_ØÉÉ ª*½$zÛwÕvóQÉ[›J£öoùe×ÍÈ0%V¦€ñû×_n­}œ§ª sûP&˜ÙÇÇcoíãñáÍí<@;pŽ7T›Dd×fL0# ó»‹ `†q…jjž¤UšŠ0YG cFW™ˆFFÄ 743{<ï€ED™É-öȱ—3 å1 ‹q<`Ý9´p7ÕØ‡UUã"´ß"|»íÞ-¬µA QæVô(JcæàŸ½ŸÝÍí®·óìß¾{<­µÛmQfˆ´Ú˜ùãèfÞZ‹óGD´5«$øìÝz'âûmòKU ûØôFw]án1¶‹<¢Z¹ÙqÉÆ%w88êx‚ ¸fš–¨>!ä¾4y#+.ëí›IH´Q“Æšˆ0×MÄ‘¼Ñ v·¢a¥YݳÃÆÏ"Ìæf­‰wë1ÑqTõB´HP¸Â $ª¹U®pCŒÒX‚“¶¶mÛÖ6»Ý†_8ë¹ô”8 vG^S=Áúi· —cÎÈ ±­¾‰ìÛÖ¶çÙ‡þ» w㪙’Et¶FY®õ.*­éa=zT™¹»9ÜáÛ–á’Åü‚Ú Æ¼ƒ<\ŸaÔ6;“šûqœÑ5ÚZ+öH¸ÉfÿØJ„EV!¡âNG«÷>‘Ìp” ’Bm40wëÂb,QÕÐ͘°·]„Í\DI$é+Ñè€h5€´¦Fª—ê6¤0CfeÝšþrc’ÇÇ»+õ˜»25æ®êQÁUŸÈ4^ ¤dî2³&òè§#†‹ùTó³kò©ÈAƒÔPÐD#ß¿hÈÌE£Vy@_“H¥dÜݶÍàýìC‘°8%ëu IDAT™Öà"­í-½Ñ@@!G²!SZK«¸ÃÜ q¦±OýŸÒ<>—`2¨Äƒ$›˜®ïBL6E꫎ç]fèüIAÊQD'I†¡Y8›D·bæçhu®šîœò;¶T¿eI8 V¹gw†NÄã¢õ^B_üapÖ‚Ö"(:Æó¤Ã5ìÚ" 7.¦¤€<„|‰´„0š¤XÔV=tC§(ãIœ &ã».cC¸Liµ±W8”+Ù–®Öª=f_â4?m€W]4éOÝ—ƒÊµÌš0¯6JT=îS$½ øC6â‹Î&œ¸ÉÆŒã^3RLé+ ìÓ­#«ÔàY(™>.ôQÈTùW³Ê$Õ¡²T?¯þó‚Ë܈\€FõEÀšrt¶ÚÏ#åAÎfy”Ï£"”¶“œ•KâËê~8 Çç°æ ËÆpÙXÒ(ã½F²§9›Ö¶ëEÒ˜šñ&ãá«—ø #`Iª7kÌ´P¥“‚y¹+.¢'ŠŽ]=^:>䜟TjãZt¼|¡q£Ç¤à3­°sž›l;×\Ú¡B¹Ë®Øaç?Ò>’-¹l Ÿ¼ïeš’øI§Ìü|2 ØÀ@åó’§å¡4"ÿU˜çí£}äÙ[ 1LX½†Oã$[òØÉSõÝ|¢RO²ª gêEþÍ 4ß§¤OF¾()‚…«aèh?¨F®JWp –†ÆJ‚e‚âi$4Úf.¤5Œv@¾jÕL„z·äc±qy$ÔcÎ&KÚh­xøÄò¾òrð¢Ú¿ |^`XWûgºÅå^þÔ;ûôn2zºKÔ¹È?‚ð3ÝjeU,µ¯šÅKô|Ä~4߸”#ã¹G`éæ™z5¯gÿÊq[`s%r‘ì+wZ•÷XÓ:øLI~GM®¹œU‚½xPçB÷yíú™úÿ™èþGÅ]þT¢_Ã:ëãŸÍ~ðß~Ô~úÏŒÿ»%ì× Ý§ÿøýáÃô«ÿÿÿQý?û•«£œù÷M¼^ošüòTŒ—\þàù×î÷Û—Û=ŽÃ`1EEqèg?Í„¹µö8ÏÛmg"V¹m;¼JJƒ´‹ÜÛœý$‚Š|}ûrô³G‰d7÷ÛývkÇù8O]rs"²m‰M%úM•<67);>Ç u0‘yqFÌÂuâݶÖ46=Ž·¦{1ô^‹²ß‘&¶nn.•À0M¶zïñ‡¢48Ô¸åNW{N"tw U«Í-tHÏMEXÀYµ*‚èFNãô{R7ë½ Tò&²ü8QÖ ÎN%⦛Çan´As>Ap„ŒîáýµqBO©ã&eðpUÑè<Ò†”U/j|Ô}œ‡¦¹X‚%âfªjî¡Z¦XU·m3ïf¾52à²T×)—a&,~Ù€Ëç …Í5g@³¸ŒCÓs SXe.bªhÔda:Žãt¸ŠÂ½›Å©ÎÑÏeD¢-ߨˆAÔwß{f ‡=YÝýìýí~ñÒ𠃥îÞÍô㕇ƒ™ÛÖ˜yÓmÛ¶lã " r+Ü­“ÝžÎód•·ûNLçi"âÌf"Q© sé§±¸ˆÂ»±Í"Ê 'ƒ;A˜Û¦Efàxvršw"WVØóidÎd¨—©)ä ªtÛvó™‰`I‡è¶4>¦ØÎ#êX*;G!¬;ÜLÄœîæ°ý£©nms€™ÎÀ… {÷´Ç ë¶ K6t3Ь€ "•C–*d.z})ÔéU/ƒ7@îÐV6!.pb:Êà ’Kšš¸)± s0o¨ƒcrQû¶\IÜ.h"ÔÜ aŸöo"f›þèàJ0¸B v W·Ah‚¤àÄ ˜tˆYJQªO<Žd´ñ–©Ì9êZ $kg ³ÄIˆ" Å­Œ„°“°N†ÇPäFQ’²…BÃ|Q-žÃŠ"Ý…Ä];h$jgÊ+<Ü¢ÈFðÁôàgç„'M²¢¬±4%®yÙU™m¥9ûøéàk.Ðܨ''£¯ø1zI¢>d*~”ÜC"àU.í¬2NœÝEÄ@íiÒ”r½ª’ÎÌ^mžëÈlQ]%à‹.Ußüøs±tf¸Ð¯HçU”¤%0)Ó‹ÏM&&MÞ%o î‘㬬Ѹ5q®XdíX÷?À/2ç;Ê«J²\<êƒ~Qoj5Õã2y]68Èû@-‡*'ßíèdÂì„Èc)3:9nõ³7˜Gï.¯ˆŸaüJzô/è4¡‡u……µ²P’.1tšŒ”«£…¿ÒM// Ä”y4#0ì ³0cñ“äÛ*c{@Ü#á²2¼êH ‘‘óîàðøly1†O+ø ]•ØYºeh˜áòÞ² ¨s^a$Ë~¼Ò²”) g²¥Þ–çâ ç庺òp.Ì~šîäZº ](qiÎ@*ïLËnݲ/‰Yö·ú yÜ‰ê­Æ€*Ÿb£ Ê;"ÚÐ7ž0„$•ƦgÌZ0-:+_a–s$Þ¯ÆÚN£pµÜ)eiX|bðŒÔBLy…Ï̸0­pü«ÏgÇÓ£šY¼´/žr^Y.´öV¬¥UY•wLëµ,ø‡ØÐE¿¨ÿ¸ÞÐWôýÕdù¹¾‚Ï›?>™MÈEK™ Æ,˜11=yú—EKŒæÖqÂ’-\!ƒë¥ÃŸ{þ×4Uý‰9–å×΃ßQ\1¬½/‚=_O×OÿŸ¨ÿàß“¾ñGôxú¬µb úMí3÷\ à_%ýÿÏдñ3™y2ªþÈûã?u˜˜ÿ¾ýãê¿•ÿÃÞþÏ?!¬ŸÕúO|éqY­úüÙßçÜ??¥ xiÁ}ýkÛ6jݹ²oCƒ^ûêŒnÕèã­ÑeìQÃ底‘6 eÙŸÒ06vkŸXŠ|V“E¹÷¬ƒ5öÅBÔærcl>>AìùøuÊñƒ/qÐçð¼j¨R¬Š$aRbùwG(ÏÉëþ4òýÖ´©¾¡µvôNd,Bî§ÙqžÌìÌçynaJ憤—Á¬[7¿ˆŠY'ø­mÌÚ¤vƒ{÷óì¿~ý"¬$ìÝÌÝÌTdÛ¶[ÛUäqž;Ï“ˆÌáÇžû¾ÅbÝÜ£¢æ~žç Lô£ÿí·o»}Û·-›É?ŽÃÝ[kºQ=ºýöñÝOw¸²üëýë¿ÿÇ_¶Ûv~;þóû7}Ù÷ÛþþM±ÞÍn{c¾‹ˆuk­‰È·÷÷îÖà½Ûão[S.Û¶„âˆÜïwfò=¨T–Å"Õ¶mww‹]WÙ»¹ƒ˜o·»ŸÝš2‹Fè{@ÿÇ–1ï;y^f•±ÕVQ¢o îq7µnH¯>e«v À ý›Xák¯ÀÂâpdçp™àRÉÁ`úz#çy\µ bS¦3ʘ·D!çªÌ é0'"Îð3÷î”< ›“5±Ðµlmágæ€8Á½‰j4H2‘ ›Ìâ¿Sïgôoý<´ik¹³´&Á R‘Ößnûýöö·ßþÓzÿp‡E*€dÁ!¤0h½;£¶¥\˜ò´(F`Ä/v?O¬Û¶mªÒjcfa¤ux¤+â.Ó0QadÆÿ¾mÚ4¾¯à9DÝw&œé¤DÇPõ@:‘”Ü"LÇqžgÏNÈÈ  Ghpë³ Õ&̼o0yH|ʬ1¨¨Z€‚üܹÌ,¼i õNEˆÅYèNFI°!?í7ÿÞZ´j'eë¦ÒDÝ•L")õßáNŽNU!ÈÒÁì#€Z­µÑ¹“ó Ø‹¨˜º1v#€¨| È2ý¸“Ì= Yu„¹ÆvèÝYU˜RõˆW°|i Õ ûoa2»œ~.¾'­ uLÇôiËb"xŠ|;Div(\yã`%`ñ€Ø³Ö%É>(HúöÔ„˜HÀ9ê1¥bU’t¢‹@ÁAC3ö‘%™‹œ7õzf^z4^4õ´³–¾JJŒ¾Ò+î¼¶sd”Õ‡Ÿ¯dŸþš!kbz«t€ksuÔÑ^™Îƒä=¿•Ò…ó7!fc¤=x+3aËľ0ù± éËŒ+€èÉòX[yŸĹ¥Eç4êòoËòÝȯ1"©4sM›†˜VuÔƒ_3=:½“UÊ›ÎGúòñó7=ލãÒÔ0vW{-SyÛÁ¼«.sæKçPÅ*j1Cõâ'W †`óÉB¤g/`6Ëb7ç7Õ¼yæ-eDžòÁT \òÄÅ]²çxaB×eY¡QÜ0ûÅÌT=–¦ñHˆŠ²äee”0‘¶¦*C¶1-óxXz¿i0—|…ã0¯7š'#øR™"ú(xX±œ"Is/ëÅΗ/¢à,<*ÿ;׋çær½ðåÛžÿ®2‘d‘©#/Ä"žØ;¬#KZóöËŸXÄÞÑS_zùg¤¬‘‡áäHÊ\¤f`ˆº˜Ç°rK¼\B¡ìÏ × W/Á`e0Š—i”VP-ÞÐò2B–,Ìy÷òX™ëî~ÔÎOÞ:q!]T*—¡ÁUzák 8.–^Óë°f­'˜õ9 «Áð8ëéÏË{\O ~iÇø~§UmÃR¦´d_f<ëÙsÏ×¾ßùÎ/u–Ÿ \®üLež×¯E¯žßóZóg²ýŒÍ üžD¼|í kÙõ¿^ýÿ/Ò®ñÇÿíÕ‰@þ/ *üãŸÿ êÿ?ú»O0úuLºÚ½—*®eôOTyn«à—©@åîå%޳2‚.7²‹b©59ÏgçÌt:tÆN«úK€ù§$$¬5¯ð(r‰¿¬W*´÷Ä«}çëS„¸–%OZÙÄ‹9mOSŸï|­jˆ^ÔOÎȧ¾¡ù’Ì?`õðu%Ä?¿ÕñÒ;õÙ°ù§e#¢ïÇÇf[úúÜ›ŠènÖ˜ùAÇí†-õt&ìÌüñxœÇCœŽãCˆ¢´»8éѶ]U¢®ÖÝ;œ‰›&ÿçãñø~<¾Üî7ÂG5™¹iºŒ Ö»=Ô"5ÀÜé<ƒÞ>ÔFsëÖGŒcB]îÝñÝo÷XÊlÄNhÛvkúe¿ÿí·o€ïûývVû8ý!Âùú—­©±ûaÇùpð¾5¹Ýä8™ùqœûÖ¤‰4‰†Nw·NÛÖv‘³Îpß·¶mû&úþþî8·íFÁ0Pæ¶ \¢{BDEnû®!)žýñx4xïÝïçÑT`ÀسA•Þ;xkºím×…A,ʽŸÌtv÷ PÒ0Mf¼Ìq.¡35C½ûØÆ˜u˜¹ws¸8dÛ›õØwþíû;@*­¤¥r‡3Gߦª EËcq8DBSìNá¸Üec:Ï.!V…!ÞŒÂu%<›c ïóq<γ>%0V^ƒжí—vélÀ½;[Ø…XE[’å¥ Ë(ã» ‹LŸ²H„Ç×¶U!ÙF‹†»åFK³Á 4 ­Œÿ˜¨˜a'"ƒ6å™)‚»†r#Ã8In&›Þ-0Ù8‡YV]‚êfDalq¬¹-³hºvAÄê„è_-Ê…IZ˘¿°ƒDÝMj˦{Eb–ϸ>s€^îSëµ4^¡µMDÜ­ êÿSàácˆÏ•µ½eä¿&ÓqòÈÃT†à29u>¶¨¦]„}““ÌA^lÆ¥\óËšžïº¦[rVi ˜ÇÖ¾¾¶Ê129ž|™@F…*q4o*eמsO |Þ9©ž ×NÖ`½Fj’^ã‹a…1‹#&Qm=¨J2Æ*V/… ä‹8O33ë²KóE·Ï%m¬Î™ØÜ5Ý'“JôL ­eÂrÝÎWÉÏÞË`bЇx5òÏç%ÄOOîkCû‹ÍœæÃÎ3MSŸÛy-x² þ jq€fj‡‹>”‹›ºý¼œùs¡_Ž áÅ„ézf?WýòòÝŒ›þ¬àÓù¾Œ¾V­™éBÙù‰¤ý‰~Î2‰눘çva¡g}ªêÍŒF,£&tX5¦q|AÏu<?á²ð˜…}úépµü¾"ËÏNã×_úá¹ÆŸ˜®zôžãgBòS¡ækûê¿P¿ÿoFÚð'³ŽçÓø ý“Òù?ÿùÔýûçéÿWJþo¯w¾èñ4³U €z,”5<€C/vͬÀ²ÕàK&ŒŠ ù4P‹‡‘¬¡æù®À$ ÏYƒ‹“)·WÎ3”£¬Ȫœ€CúÉÖxðì¸2&?¿ Fu>äÈ`Y¡0+Ïö1 ·ÙˆÂ¤O±Åk×ñzºÊuvõòr8꿼D±ì“p óSºà³×þ!Æî\‚MXÌÍ<à?däg»í[k#óÛ•î=×ýH ¨['3•˜nºµíëÛÛ¾o­)1vÿõ×_‡ú8Žoßß7mD”µåû:ì†OJÜ${{ïÇÔ6ëÁ‹ ‰îû¶‘ùñxÄŠ¨¶m#a>¹µíË~¿½íÝ:€/ooݺpëÖ)È+¬zÛ¢ñòaþ8ÛÖ܃í±’†ó¶Ý`Ètwì›l·mßñx Ú÷]U6aw–­¯6?š4QmJS·à3Ü›ž§çép{' ©ºc»Ý5ªE…Å4¢½ŸfRÝË÷Ç< *NLÊÚÚvÓvØCD̽w‹M]–Ü\DzB¨D‰¤Ù©†Ó<)äÝüãýýèã8#½þþþÇýþ¶í;î·=á̳ޭ•þÀˆªn-œ‡ÛJ® ˆ)‹ì"|œ§–ªÛ^óHî8<¡CK/EæcSçp•}Øê܈•›´SX› +€›g¨p7U½³Q–|½Ÿçìû9'¨ÍE íEăê.¢*ÒT㈻€jÒz–I‚\¸3Ik,aïB˜@Â:¥E"`ÉŸqWÕ˜RœÝºõÜÄf;+Ì’<5•°…I`,æä“$B™·"s‹Üº&wEŸÁÂ`nq J›¨;]šV@tœGð?D$œõ,$4ç¢Ú˜Í]$A½)›™CD"Ã,Qoðÿó?ß¿¿o÷[ùGÃzFûï·{Û(¨âbý ¦T¢‰4Ðù!Iä|¢Ú¡™Y…ÍœA‰öòÜW›»u‹Q[*cª+5qÅÀªQÿ*£‚p‘Ø¢ÀÃÜÏà›ˆ» ±¹w33'fÝÚ¦§YžísoÂP²Àâ¸cP¤¤¨ç±7Œm8$´WáÄX#+L¥Qöë4²äpdIJBœ-µŽÇã#ººÊ®£Ý 8õ±¤„Çú:í4t¸è)ôvÒ¼VÚy¨àN£!u¶ˆÆëÖÚ…ÀD•5™pÙ~\bü%øã"jò%=»åó\‘(¦®ª ‚#ÓBC¸)÷58IùܹÀ±„‹íe4…xZšŠ's‡ž0ìW÷-Ëø±´C×€ó]gk5Ç&Ä§Š˜9Ƚ|R}j)R¯œéµDèHÔ¬M;ü å…wÁ3GO¸´ -ž=#Ê– 3Ÿ›9Çz&½Ô0uª`îNyµ ÑL,G:ÁW¹œÛG~*º+W<ÉŽ/džZž,NÔ§†Ôúïäó6Q\þ1 Z¾  ¸˜Çë†{$«ŠÞ”Æ„¥údº‚r˜¹Hõ¸øÃó›ÉñmçØ§s–äMÏZð2ßÎH"~¤bº”y1Ì ãrý>ITœíÍ™˜eܪµ¼RdË=y½MOX~øŸu1Œ©³eÅÌÚ ¸^£ èů“lDje£ /¶yY˜8ËÇ'©Нº}Ÿ]žI÷4§5£´æ•~#W‘còã?óÄ–he¦äü‰ÇY±6”¢sŒ% ={_×1ùgG–é…ä'_%?>xäÓ5VðS“óظ4–’ºdãæÙ2ŸXOÿem£YÞÐ2©áÕ’~M–\ÚˆqEìþ‰_ip4mf#š3Μµ}ŸHLü#‘¸6ƒê¯çßñÒ¿–[~òøó¡.ÃÕÏç#ŸÀü) Ÿ(Áýwüó&^èkÇçü¹¿þÏ„ÿü˜œü=¿õÚxþb 空ürè/7õªÃ½Ž)øòŸ¥î V~ÁkÎ~zðÓS¯Û IDAT3Ú’õ3š,—Û-ÓsOÊHWþÈ Ùñ¸Ã3Ë`{Õ½_ëÓÈ´àäËuƒsDzT”näò£»xí ©…ô²™e ¼~ðq“B-oÄ„±XüóùâˆIøúÍâÇ—æOîT/§ -èÀšŸtê)ÌÜͺu‡‡àvÛ‰HYZcë½µæfMô|<çHîmÛÚ¾¥c[Ꮇ·û·oßÇ_³óãøà´SfÄ™VÌ$Ð6n‡ƒ®!ß :4Q!>£»”Úk~_ŒmßD¤‰ZBWûL3Û6¶óì¢ý·~Z¿ï7V¾µ1ÜÈ¢òñý[?;fÊà—ûÝ~­i‘£[‘"ÊÄĪì¤Ò…¾´›¿É×Þÿöþ¾‰nûvcqÛˆY©Ì8ìqnÂë§°8˜…·ÛÛ¦úåíF„Þ]ET¹›ÝêÞ™¨‡ÌcÖÏãq!z¶mc…°<ŽÃ *Úšn[ÁͲֶ,.3:í4³Qdëð-E§ð1™axE"­3 &ýòe‹E¿›3BÔ¡rè°(þM½> BME™[ô¯ÞÄÌÁÓO¨V,Ó#ê;0•€I÷ngNT¡úª¤é[ÝÝáa- Ç7 =Y¼µ»k*Û¦ÜÉ`ÊêpVv³^£‘ô¹ªê¥¤dH¥š„GwÜØ Gö¹¢í¢ª‘,‘­mÑÅ lÝ,ip¦×‡H‚(çY½d"%eðµò?mÝ;Ì=²õÂW·K)©Ù hžs&†T8«LI,¬!ƒ´ÀBnTapÙ³Š@H[³Þã` §Mc·o³“9;„3Q!£5­“a±Ž¢½(oàåæä+&rÿ·þñx°È®JÂUCè”çSÆ#èƒ,yNŸgß÷M£øÄÌÝûÙƒ\ìî*r{‘ã<…©Éûä­)ˆÞ­÷î j­ikM;+åðñE5º'Ùœƒ £m#PôTU¯›õ‘'bň Âý~KÁ¥äïpL#?üqZ„L6fm uæ{ø”ôù&rx²M‘íâ(±™Œ+ø-,®£›YIVUÈ * WmLâÖc»¬òÓc0Ú½þ‡ˆ+ÇÄ0놅3f#4–Ð÷µµÄÜš´cÄKE‘£ëh®N̺»»9TÇìâ”ÈÓ¹ ×A!÷ g䩨ÚVà±T%žÜ΃#ï¡înÞ[q¢gQ§/´¼ìK3Ò@ÝP¡z‡d³Ò‡™陜´hc÷rr–ï¹-šl—¬­¨4Õ¸òÀm§óÞmzË@I/¹òˆªís¼…”)ƒÐM¨d"äÁîKf*FX%ŠF¢4ì X&ŽK'R$´Ú [ZÛ+kÀ£f*üÙ\\é(® Áˆ„ìÌ¢æÜ%7ï‹#–4bœó¶lÄóØ‹LeJ.¹ ÜÕ,§`¥ñ_z¡Ö¾Á¹ÿ$¬Ê{ÄJ…)fm&=!k ÂCDÚŠ1š­VŒFPŸ°,5QÄrÀ9ñÚ„”£V®î“ÀT¶îê¦FݲaŸtõS¥2ØÉâ"Ïw–‚*Ïi\¥ê‹+Êó Ñ ¯ðOæÏl¤ƒž´ˆéÿM¹*Þƒ€f‘5’÷X§µA–§c5jãFÝêÅjZâuyä'Š— @p½„/™ÙŠaþŠ?¡ªaœ2³šeÓ*€Že…ÔîeÄFRšÓè>y L9-´%LoõÅžnåÕÔ¿.“ªfvxꇦÿ„äÂÌhкœ Oz'ñªs.¸×äiÌfò"ég/ ‡<ÃyS¡‹û¡gñ@M1/‰š)'Ç­¨È~$BÌÖ 9\Œ¥^ûMŒgæñM<©tÙ-ÃÏġհ? ó±Ö­¶Æ‰Æ¬Ûœ"pìÆÔ˜baL?—ñL¹®|-€k) ^¤Ž‚§ÈPg™–.Ó+œ²jÄó?Ë ±Á¤ˆÜ˜ó¥óÓLk—ò@üT8éâx¤¾éAÀjïGEÿˆÜ *q‹÷úäÂÔ’¥ø!æ0Ùö<{iòÖá”·„Ii+¿ä³Œº²€h­†#Žåøk9ž^jËÖ‰ÁÓEθðb.²ýCá3ù´2¥°íFm:®öêÉ>ÝÑÁåÒ³jÍW˜ÚSÊ…õóÀy™|®¤\Ø]ü¹ô«ƒ|Qì'ò‚_|)8ž]š˜ìŒ‰^‹,è‘úÌ!_WƒO¢Ö0D,÷öé„X'—&h¾|­L?;+Dê*[Ÿ‹X˜ýœÏzÿº˜™¡œË÷~ñøó…õs™øGZÙ'R>ùdöð‰Ñøÿ•?M¦àûøá§ÿ„óøÏ‘þŸÿ0þÎÃô?þóçéÿÏ÷–'ݽè£Ï?û̺¦Ï›ïU¾Ÿ¿Y¬ºã¢¶@eôZ:¥âò*Ü/ãø„H®Î÷™P»ÊÙR¾G:šŸ’sX­±Äåˆ*¦`5fõ¼ì8f`aø·’uOsN“&æÝÖ»¥¾œ¦þãØXØÌ›¨›?qv˜Ùmß­wH€œ™4) Ùià06fŠ6coí8wâ­È»‡ƒ—«5PG̬m¬écqvëýŒŠu·jŽ&"s‘h&V‰ŸFî*•ЏêøÒC±53Uu6ž®·1 JÄ|¤؉%¸4Õà b°w·÷w Çú}6­ŸŒÙ5¼ÇE•Îdà8NiM8³Š‚Ù£Øcl„ð8Në=R qŒTUTbŠ YMç¶Dn‚„xi.rX9FÔ©ý‰¸YÓ&*Ù”¦hK,XN½œHHY ÔTcÞ4ÏЈž´Ö˜ÈqáÃ܃:œ™øi=D­€jE½JÐ^‡Ñ|À¡Ò3dnʘZWž'ÿõJÅ¡¢*̃ ¦æîq§œ?T%eᦺ©:!Öw+Ñ*׫¥ÿ2eÁï°< sF.‡ÜÜÌ‚»(éÛÁ^èf³6B·‚ˆÏ*ÙlG$1YB‚ÌÞ)É7,¼&29#1ѤªN¦ÄÆšQ\9!‘Ýå±u]ŽÇè\‰ªçe8ˆ#ô?–œÉGºø.Ão<jµGu-H䋇/8*%&`±7ÖÈ™†wœ+“ƒ=”Ê<ÊÎÓ/Îà`XÄ{”¹Ãv¹vºK b7Ôˆb+—c"w‹¯UxbÂCvÔA¾šò •ǽD„d ŠSÜÄè%ØU stëVíg.cpÉcxŠ0*1ý¿9jÃëÖŒ˜œÌm4,—â7È/¥Ëãé&ǯRÙ œ–xŒÞÝÕK=¹ë†˳t詺(F†Yª­g°××ΈƜû@˜YvzjÜëfUUÉKï† GhŒ8d|ï9Ö-“ñ‹†ÂµÌÕy¿þ¼vÈ*y[+~dL]Z‚Ç.“EÜ<2¤"šÛú'+|§ÏcÅûL+ÿ¤P]†­ûÒñÆx‰.T›ùì@•ÌsüãFµŒ\²R‹Mêª*rŠú—5Lyݬ’Θ" ö ÏáZêéÉ[+~ÐùŒæôx`ɼdGEóE`^Ò„U1^”ôaF€qA£Âð>é9ÐXg´kQáEæ«ù>†”rœA5'a­Jðµ!€”}Gáó3¯ NÛ)r™OÂKÉEº3YAÏóŽ1uFdÑãŠð²TË9ÍþBºÈ°x–êÒe‰é1¼~;‘øBr /­ù¿óÜøÃžX®ÅÛKm¯7¤e€·žð/õKuð+‡±ú]Å¥U ãW´ÿgƒâaõ¿„?ž žÞ^<èàO¼ÏS7ž,\põ—¹ž®ò':–ø@åAn§Ë ïù%/ò|îb°¼9¬‰ÂÏæ>JÁøÉ[S¯o?©H®Ý!ÿ`‚9óÆœ¡w¼µ-˜6îš2 evNv±9”÷³÷į«‚ø<Ï€d–9]U`Ö±t„½{·îîqúåÎYÂÏQ–`^uÌðÞ®¶mÛ¶…{Ì â=ÔYGDdÙ1Ë#p€ZÑ?ø% EeieÎØgÄ0MîÙ«êB‚îV–vØŠ±oº0š™˜IÁÖCðtõÜ$äîÚ={_R"‚ÅÆ%_nx%TÓid急°pËͶ-"%䦞Q꧈n[yŠàjx\öÜpq‰À{œGÜ"Þnwi[æ-Jü(ªqÓÉo\UÛ¦È놶·;J$»| 'êÒ¶m­EÈ µMµE×®ªjÛDdß¶óè'úqÛ¶‰D!Í܇‘69ûmºî.€¶Æªïp%A DÇãÑóövSmD6ÜÖÝ'RÁZˆ¤i n$›º£Ò…Z0Î:ÑügWd׿žõF\ÿŸzp±«úÏólãgz6¿œ5×ñ’_Ú”i™î]x5Q?Kex®ø©püw»øyi^ø/Õ±ùÏÍðGc×/ÿtãÿ³úåAú/ üûÿRÅוÌEâŸe~/ñ–uA>û–žº5&l-š?—™ÿ’2ë£Ðnm ¨' ¦¹'=™þ‹éDZ Žuí' "uuñ«‹YH¾Mž¨Ø MI&mö{çtn•»E2úäNáŒI #iQ1ñ›“ÑW77x¨‰ëë$fž-€²GðÕ‰‚—»ñ’`›Á'_?ÿ ´Ã?Ž(­37³n ÷ãì9ö}O†ê¦=ÎG !TÔ ›³³jã 8ßϳ›»ßî·- 3nKÝì8 üúõ—/_ÞŽóŒŽóBªŠ¨™ñ¦L Ò–Ä(õÅÇí—/_Íýûû÷ã8îÀ}¿§1Í£8š0Nf1󦚰FPˆ„ân g7‹qYt9l­‰.ë “+ÂÛ"1$ãÒ!ÆúH†»#2LÁÌ#ƺïŽ`Vž})+Êe<ÙÓ<ŠdT1¥-’¥É&N·KFrfék”ºûW™1¸¢¦ð"í'ÊÞS(§ÁwÊõÝgJÂUQa~‰f®ëàX¸¢,ú¹æ" ¹4@JÆWîîD"%s-H‚zê¤â¥ k.âc°BŽ…E1¢ÌJåX-ûÝüÖã‹°4âcTIs¡‚.ªp­„ìYM#t—6β—_xrðœ vþa’ ®‘c©©uUÛŽó6Ëd¿©ÆðÑ䙆ŠÊÌÓ3´þ/2~Öy ]€Wå M4¶A²îý– ùg¬‡QÑp.*@Ê8‡`ŽÔÓ$gV>Ìô‡ÇôIª{í¤Î»Ð ,èb´/[¯ç^Dÿ1’y´TÔ¨à¹ø•>¡¨ð©š‰'Ðú],C—ñíL•Óá5¿‹¬0ù\HÁÂÿZ¿ÅQ^Åã»yÚ7'†.,Óƒ,·ZØsÒÈ#yáÀË„>FTϧZl›Gp’q’DôÌ‹¾ðyâ1_ñæÏ‡$úÉÊ~?7¿\õKøÆ †‚—Gb(Bk‹;]z"påÇà +%}½ÛÆ8Ö«f¶vàQóœp¿Kéò´[=—˜“ d„óŒPb0èÓˆUÅÌß9‡¶9‚«r£ºZ8;–¦S?}UWÈV[;¯•ã¼xu@1=Õ|acæ²}fŠÑ™)Yë>qòaW*ÏeÞ!ÉÊÇç˜Û+Qta¬¥½—:ù™çx‡ŸÞÞ³Ò~©wXZ°¾á‘±Ã‚ОdªÁFª0Ñ“˜¾âË.Íž<6©¯Ñˆ‹'^Ž’_fÑëýÉïûÿõï|ò/J+¼W>]Õ¼Z>ªp½²~Ðîû2Uªš<¾¸?G¨Ðk£?•Ž?ÓÑðg’ÿÌ~úŸøGÿöYÁç?*“ãg“€?Ö‘¿_4ÿ'©ÿøïü½ðŸ>~Á½Œ0í×»%¯1šËÈ$æËgOÔ×1褚®óüü'—žãƒšð:ÞX;¹A¬TvþZ´Ú/µÃñnslPO22Ð þR&<Á¿8) ^{·4ÏÆ@Bª9²~•¢ó1¶‹~¬c²àŠXú‘ YØ;ñ–_ÕYî8ü _ Dü:cøtx?”`æÛ¾Ëàn»ÁÊæ¶m_no›ÊÑí´SDDšªžíŽ$"=.ào¿ýÖûy¿ÝÕÚ~ÛÀ ã^æ/VbÂ/¿|ýr»û©¬*¢ªæþñ8œ,îã‘3õ\:;ƒÎÇÉLÇãñ׿þßöÛ}ß¼é&¬§ålm÷í&¢öq0èìçûÇq<aÍV•nýããñýû·¿üå/÷ýÎ*_¸}ô>ó:AXM™··_¤© ›9ÁÈn÷7qŠ ‘ëFL„.Œ}ßÐôì'3¼w?›‹ŸÒ¥»n[Sm·ýV¥—gï ß·½íû¦*ª†w"ìû&¢,b½Ÿç!ÉŽ×`ø6hâÂZÜÚPr¡K ªÜv‘¨bŽýSk-äØ˜b¥*TUmÛ>Þß"*Ò”Uâ=5mæ¦Ä,²kCÓqÇu³bx§¿Ue#,@moÄ¡ø/NŒ{Õpír`€¢4ØJî#«÷¸¾zïi@—!É€ˆE£­Y¬ê(@TèM‚•܈zsÌ g7''râÞý<;ƒ+õap¶œ"n;o,F·(y‰í­D-³y3S‰i rÕ,Ë$hˆõÓÓ¿œ¶æÄá‹ç)-,†È,¢äv ™Ž¸zM1ÒqcZ7Šòˆúª& õ9W hÖx¬jCEg蹪y)Û]¢ ¼ŠAÙøªÈ^ »·ùÌCL¿ñîùêNªåe ÆUR±éŸôyï—çOµ‚Ókó4^Šp}\‹¸ÒÿŸ2tés‹õ'GeñâåçëÐ=ŸÇ}a Ù®0ð“3»¾±…’Z2Oº4˜IØ»[Í^iQíçÝŸ×GÊ®¾¤Ú± ƒ¡­»_ô9æk·*4L6ºÿP{ r]Éì´4À/>òõx\Øa+}ÔÁNYxä*qæ¹w©càQ ö$Ú2/b6ÿÜ>Æ”˜Q=\9;Ÿ`ôœk`Z–DüªÏâE-ÖV\£xVØðCIu~Ùò¹nŽ3žø‡òòUÒñóÃû©ÿϬüÜ¿ÿgÔüÎù¤ÈåŸ`üÿ/ Hü—ŽøÏýÖ“ýÿ:“eþüH3] C—y±,#ýò?scžß>—1fpiÆMg±åU|½vu”뫾 憘ŒØÙ8óR%γB¦&€YÚzG*j°ŒFÓ®œTÂñP #õ$%¦„ó¦ÏÉgÉqx(A±Wßý .½œ›²^­Ì3ƒ/,BøyË<ÿ`¾ÇôÓrþƒºÿ’´ileP•Ð![k_oo÷Ûíãx$ä=Bÿ"ÂJMØaÀÛXDy¿í¢bp0Ý”!ÅUæ­µ_÷/¡vºƒÔÝaðîöíã{Óa afeâD”²HÛ7ë¦Úþ׿ÿï[ÛûqØß¾8³¹|<ôv»ÝnGÿÿúͺªŠ N£î¬ FÄlý8¶Öî··íÖœ`G?Ž3¢'T(Þ¦ûýËŽ’°™ØÀp·¶©š7#"wæÖ]œ&'ÖvRÍDEYxÓöÖ6Ù¶&mÛD„Aï‡Y˜ ¿|ý*Ľ›ÁÏóDõv`@#‰RÊ0Q“Áúé0ÚZ³Ûþýû;9ö­m›öÞ™èÇÑ­Û·ß¾mo7‡[ïá%LPò’°³±ugr;bçÇDÝ¢ÊLÜ;Áµ ø¶oÒ´‰h¨ÇÂÈÚHæÞ-¼e] ù¯‰%Ñ£¡:†,G%ˆ÷n%·Ù€«öÞ7m÷ûÍÝân"œÏ’¸( oÑ­àîѬëpŽe=ÊFC}v"¸ŸÇ!,Û¶ÄaM”T^²TRXÂ`\Å«p'¹í{öJçyöÞF& ÇVÖ}æÌ<`ARR¦]“ïc&,p£Ñ$q­ôÿq÷¶=²I–ž3ȬK6{W#@+ ‚ôÿ”‹h´ÛÝä­Ê73}03w̺¼d7¥i‰ƒén’u+3#ãÅýØ9ϙ݉sg‚Á¼ ¼lfF$Â⇪“󾵸åKƒ›1‹i'æÌUs¨;%ßNEO®Å±)>èâ¹AÚh•Ô5?»¸ ’+”°ÚÀ(Ÿ]ÏóÌòË D×(’áñW1&.iwß¶ÝÉMÕÝÂeY7‡€`ØÐ£ýRS¾òX!Ç¡î„ñIã]mMÀs‚%ÒÌUÀmÛ¤5i¬j[Ûˆ Ξͩ lÛ¦jäÚUãÍtíD´m[%Á9¤$‚ÆÜ[TB@õ\ åyò˜zy¸,)ûý–ê 1ïû-Î×°@6iE4ÏÚŒ¤u‡Ã/::êAKÉÑq7:úŸb4nªÙÕÀ¦ÌŒbÿÛû/ÇÇcÛøÇ/?4Ùˆ¨µF@`©b&ê9º"5Zæ&¢ÈŠìÅY˜l_tÈax´( 6çœlñ¶µ‡L5ð/Nd¤Ñü!²3Ÿ§ñ] @ªi…ˆÂ7ëîÛ~óÑJjêQqÓ”®ˆG´Â,†jì®’³ñ6ÀðXd€!àéê¡Ñ§ÝÊ©•‘OÅäÀŽx!¤Q :±Ë\ë1º8M×9\ҙȟ©BÄØr¥WÇ?šJ@®>ñƒK¿)Ç£)Aç o²MùAª ƒf¯TƘƒ‡Æ:$§•@Èåt±äŽÄúP^í'NÍ©­¹G¶Ìh†VQûWK7cQ†4‰è¼âÖUmZXÌ~áFVPˆœ‰ÉLˆ5ê[]3<”ÇÚïsz8‹ cƒ¢²(ŽÕ¾X [¼2 ,y40à—óx™J“;í84øøƒ#ÐÙ;úQy€µÞd,¹•’­kYlõs˜ò­µd8ž¡>ÿéb,õß&1ßœ“Ñß«Õ0旌ټ›ŸÒÆ-~¸Y³)—œÔÔŸP4‹ZržîÐ1zÏ›å8nq¯'pEÜÒ½„œiÔSxd"LüjÂŤ¤­ZØÒ ºrixÌ%ʚπ1ÃÙÝŒž^³àlü¾ˆbTt¤ª“V«~¼_¶²Ì>xÑÉYÃrƒ¨‹w±ÌÏæLn!â¯Å¾@Íþ™.orŧ¸?ºåÇkÅýv öÖß¿&3.v„' ïù½\>üÐà*`>mÎãŒXfÄ23s ‡L˜?ÌGþ£ÚˆÖócŒž0[÷f‡'3Ŭ$rÅOØòl¿`®¢â\úUÉÃxé ™"9FÓh1IНè/G9æia•c‰Æ¯»~\`=¾Êq Ìë†Q÷g¦QY@ˉTÝÓq0|°¥–pŸ;{ŸóRRíÅï<ç=þ$ƒÊE’…Òcl>ãu?´.k†Ñu0A'Ó€wcó02üãæ¾¸\×5Äõ< ×þ]1Íç)N—Áýõ¤Ù¯ÈuxVuð©Á÷¢Éà2¥³_­´9w\Ïå 7ãòʘ°é'aç“€êm9ÞŸ~½³ew¢ßž'?4=ªþ‰Éù¤rÅ^ñ‰æÿ¤½u­y-“vÿUMk‹]² XOžï5<ãþ{¤Ü?D”þ¿ßýþýWñoO‚~K¢áUÿÿ.û¿ò÷ÿŒßóíá3ïþg?y¥•Ò¬%ÁËíéÚº3Ç·—Ç?ž©ý««(·¼ !ñu²†—7ôôÆfWÓ"‹U”ôš¿ª…±¥ñxôû½´cø.) ÆjyÖ¼•Ç¿µà!cÚ›|zUêˆÙ|G±Ùª!j6Éà)ÑÅ•¹ÊôÚ§’®”9aÿ,(þÒ’ë:{ªò½&~­ø7 ¼&oó‡õ_ÎãÃÌE8š»™‘3 ˜ÜôÎû—ý‰~|ûÁÈþËýKP>¸m.âDRL˜~š™k?Y˜ÈõÐÇqžÇyvùòá- ™7jMÄEâX¿µ{lÇAîÜØºöÞÉŒ`m㯽àŸþö‹™ÚmÛ¾|yûrÿò§/_TûéÖUÉÝ\ç±µí¯ýËýÇÜÕºõó¸í;CnÂü§?ý$,9G^¡[#÷FæÆg“Ô´¬kwãr߀±¬ª¥55cö·¶ÿðåKcN “ªÇÙZ# \5§&HvÜôÔþþx„|ßo·}+D†DËh)ÎÑ”jMºêãø¸mo Î]Ÿð?ü(‚®ÝŒ™E{.8µØwPïÝÍŒL{'wáhôMÌŒÈFlNÖÚÞ–ÓÌÕ¶—Ü-ûxCfEw'3®•i%3+@¢ÂöÞU㟻V¢xÝÂc[6y7'Ssìˆ% ØQ \q„Dú˜FSnf Ù6aU36hA^A‚Èu"R÷S{N#kdî,!gHâ°?9ýcŸ©ª!+-.QYÉÇvt}‚ pPî¸Üíì’û=FEæ ¿±HÄÉÒÞGÑ BÄ Mš»i‡…§ÌU5ï¦Úà Ï-FWNL¤ÒÀsËYNªpeÆ-¢ÔÏQÃHNæfšÏ‰jy íX³r0^*\í¹üïÔZKqÇr(ß~t… êÏFÃAô-Ã^½ fµM6©—rí¢>w|ž4bG³õÞÍ´m›» ¹›ZÛš4qóà.1ûÙÝOµþq|Üèfn›4ÙDî¤æ=­û`g™±÷3ʪdÄÜ$cI±OdfDè|žk‘q?ÏŒmkB§@lS¦‘&çÙÑZ ¹³»€Íñs%™Ì^Ä‘s$qV`e5óÇ1 ÅD. êÝÈ•‰Mä"|»ß÷¶‹°šrºÕ‰MÄÕ¾o÷»ª=èŒ×—Ф—5vfΜ=ê¾Ìä͵dD33ïVHˆ· Šjè$,Y–К[ÔLM¼7ó¬mŒuƒ¹™›©n""¬f!¹‹°ª©ÅÅO ¶  1ƒ‚ÆÄ@±Ä/  yÀ—̾‰¬.Ì'ê4}šÇµVn%w'ù¹²ÎÃNó±®*£‘ÒiìýÛZâæ‹RÕ€–8$'’œŽ¤lŠ•(î ŠV'cpùÉgQ¡—nŸŸ¤7£ 0æÍÉ^øã¶ÎRZãX™ÏÐj<ìÊ|Q.,‘i`af1Ó:Vº²Ãñæ³Ê1Ûb=ç…Ã…ãuÓ.Z=£Ú!~¹ð±:·c˜2<œî9“ÔÄš>Iéö³(øcKFŸÈî—}ÒÊщ ðµê†^Ê~œàèâAãɳl =Ä Ú¯e0¢KÎa·õ]Œ©á‰mO¨íêuÈàZ2v0Çzö¤AsòéÖ<ºœvŒÈY)åà¬Ì¨€# 4Ϋ ÒXuýµÄ.žÞ‘ó‹mwPôÓ4•©ûò÷ç³Sô1Ö¢ËTk(XŸ·Sæ¹H½# w’ñ¬ÐØŸ#‘—\’3w³ºägwpŽ&oÞ3@Á‹|Â9RìÂu°§üˆAUÊ—‰´Î@ŽÌxnVáïÚj3’<ÆÙ=Žª¡¸ÐÖ¹ðA–ÿqÉùKçêŒt=Mðb@\{G‹.S€A)óõšXxñ>–ü“à6Z‚.0¾OÝúŸ¸ïéj#õuF°¸›¿­ÆøÅ[ë›9]ù×yË2µ"\%õñG|Npñ$f®ZÏsÁ/.ý™1}Õ²›qtŸrL×õçHáÐ-îþmõZ 6çOz-ó¥÷ÿ5=ðš¢ø¾ôÿô’ó_Û¾Ñð4_øßÓþš9ð_ (üaù÷“>Ë<ýÚ_ü~â?Dýÿ'Qóß¹ƒûÿç¾m¼Tå®»ŠçnX\7 øü7Vž´Tþ^M%CIŸ КñÏ-þ~x”æÍ ShAºåu4©Ñ2茠ÅÐbó†+úZUû þÏ&-ñ™B`TŸßôG †j«~äŠ#êg>^tå²?iÚøãŒÓ–¤Þu¸+.{Äš™ÃH}Öñ¹Þ¹–ç_Íþ à¶ÕPÂjøõ¤5=ãì§ê/ªzGà€î÷Ûý¶™u®€ƒ07nþÓýèÇy~=>ˆè<Ï”½bù,Q4j‰÷”°ÇñóÏ_™™ˆìêþ ¢/÷»T‹!ÀF.ÆÒõ43ëꀙZíß·mpññx@Þ›4öÖÜMíC•Afê½Ëvà|ÿˆÅêæ"&N2zûéÇØ÷pžˆù& ˆÎãèzšª©Ÿ]ÔNf±b€”L»Æ:Î !0;…ɬ ÈüÃ:ˆ´w¨û¾ ™ÿåoeƒÍÉLÕ]ÕGwí¹ÏÖ~võ8MÜüÔîîó473m"­‰©Z÷Ýw¼½Ý÷v»ßw…UªÚÍL¸…ìÕ{益=b§u={cÙ7róÔOM؈Ô<ŒL±DˆÅ°š“¹wÕÆÌ*¢àP¶_eÙ¬ºS·”$@ÐÞUUU»*õ” bÈANû0Óûm'¢³÷ð}»ÑÙµ5$§ž #¿P;ÈT˜Ìé8ÇGWéüå‹lržg?>ZkÇ“%æC·Û­«žñ2»›°XÜ=˜cŪ©Rxäÿ£4ÖL­5½kkÍL©ú1þKÉíТªãÚR6p‡ˆlÛ¶È‚YkHî¦`—…-¬Ê椦äÞömß÷³ƒ™»icv3àW8‡à¢¦¡]ÌdîF ¼”¹WÑ#Ń—š†{ÓÍ`€°xÚ “]ïY?½Þ’áø}Æg_ƒ-ææ[Û˜ƒš€8Pçy¶ÖÆž<$rr2ë½kàƒâé3¬‚Yò¶µ æ0S‘¸è¢ï„cB©æf*ä€lM˜ÐÇqçÉÂûr³£»RÑ»Åd«É¶56Ë,H2˜"ø‚ wK+vÈÃ~uè0šˆZOãfKX·QÊÌlnàiÒ¢ö0°õ!°™v¿ üéôðdRiا$7æ8p (õÛæî÷&DÀÞ¤Ý÷[kXu'»k†öÒÚÇãp¢·v7÷Þ•8j,˜n/šü¤!Ÿài¦ jqh[‹>f‰{ˆ*I(—2މ Å£%P'>Âä–º¡¹©ˆ¶Û– ç Æ©i-À,‘”djaßw3ï½ÓT2ÉÊ%ÍÂn)Æ–9nž¸ºJ£&°Û 2²Ž,5 [:îÒ² w3ï­ÑÕrŒª¶ªÿ^M–È[qõ‹ñ|XG ƒŒ$…)ج éì%sÅØÙª%bˆÊéVøESbg %Í6Væ82£hN€Ò²øü/ì#²:Šý²€å)¹†õwææ¦JË ³ø•/ÛdLMUóFì€SôÑìb™•YJ1Ú_.ÍV‹ËÏ—Gó'¨öŠC^ÜÜt1M?³R´‰#7ód‚K%›i4óßÒeïK ;êÏD6'ÃY=°Ú¯»îtf‹V9 4ÎCŒRï™+! ¨M aÀÒH„yØ s¬éL˜#ÖX Ä…ÁªâÕDH•§¦eæFš…áS£.·hõ°L|jFʸ}iF­Ž’ÙU|)ÃÍ'‘ ö”çxÝ~R³¦°µj¸póëÚã˜à×Iõ쯂Hdßíó„`îÌ•C3œGaœžlïÕuïS%'³I> [Wˆ‡ Ä?[y—ÏåkCÀ3U•­üÛïü #µ}™„Õl¥ !{FÚ×J€ -?ÖB…Õ\ë¦u$ªYÅ×wêeOׯ;}üä¶ÅÜýàd eØl${ £”äj÷ÂÕäɵžeöçt#ôQ=ªé$oÌ–ÅzˆÀÍXb.ì\Xü,êó‹›·&â~q²¢¼Ñ 3ªøÂ,ðÔöYù’!;Lm×gË·UÎbøPË‘qh±õ=ö·Ïbžq¹û 2Z®åF—8Áˆ$\‰Aɬ&Ÿg×¼8ŸwrÏ$ž5bÕuüZ§X0¦X' Ÿ¥¾œÎ÷«¥þ¢seê†Qƒë…©9¼XK“ârR®A‹ëÚGˆÆß/ã\%ýãWKëÊO¤×xîé~V¼8Xý[ Ê'¶Z_ýS^U(ñòkGîß›þÿGÁ®‘LºÚÌËÿÅ0þ,U2p}oiÔËÝÌeºP~Fá9ƒë§¾ñk1òéÌ¿rÇ=€s§<³ëërî^×]úð"ªG%…YˆÂ'¼$3/÷r‘i¨wštBa•ÌR4¨›ð(D^CGü¹ØÅ¡Ÿ‹+Yë|×ÌžÌû\º«pmû·ã7ÿùß„ÅÂõJän‚påKš¿¼Ý¿¼ÝˆH„­ò$$a§ ~z8 ³ã1Vù‡e‡{ïj,fù©ýøv¿‡û©›ýòþõãýEn÷{ci,Ü„UN]õ¯ûÙÌ\íññèz`'Um"Û~s7#WÕ/÷»¹ýíç_²•cß6â ÷÷Û¶Ó¾¿»ü˜¦¦Âpëc¾ßoLÐ`Y÷ý콟î¤j½wŸ~víá£T 䙩1ŸgZŠTûñ°“;Ýhãöñ¨£a®¦m—óìÝTUûy™ˆ8hkÆ"mk‘+0‡pc‰¹Cœ¥Í8{D="Bf@W wš:7–÷{r ÙR« ÕpÑŠ»»ºvu·Ž“œ¶m§Ó…A€v¥U­«ª R58ζîßÜ¥÷óìG“ÆÂ‚‚j3¢wTXNï­I¬O5„“Ó"^àKX;Î×e‰Íhqb‹›ÅŒƒ™ï·[lbùúµÚnS…¤¥À邼ÏÄ sü3ŽóÀbêV#Eüº ¡Ÿ”k#-AoènG?(šcÈÔˆ±5ù8{Y¡Ù¢{DZ½g¡ ¹wÕ`ͨ›-Æ,>Êæh|ŽÖ2»²÷® of6wv¿ÝnæÞÏnfÇqˆxg–Plg/‘¹G‰13oû}' Ù.:/Çkº“šZá+‚„£¦LÔD¢O²5é]‰L„=áÕàt úKkû~SU'³®däa´[gSíçéè‡OµâV±šB3ææ€¹E×63ÔâpvNžF"âxIÐê2WíDdªñÏ£v1Lu”Ç3œÂRLŸisaÀXrœKÚ$ˆD‚˜Õ13ƒ ìªÃ~ÎÌ´‘8E+«çxžÚž~C›oš!R•­ÉKMñ*dxMlç¸áLBäU¨˜åÓ¡ðô˶Ó2»Á³†ŽÏÔ9”Qôé'¯gÙYû‹ÏßתÞok–þjÎÇì¤_߬?_Ý•£èš^uy-~š¬\Åj,6g\’NtÉÍ/ –C•¦€Tÿ±â1_ìõq§ÁH­¥í3ò¹²—ÒðïHÖþbžÇëù†ƒýÓùÌø÷4UíÝ|Õ­ŸÚ’¿e°_f{žxÉ^ø·Ýùß÷ïÿ~éßëç‘ßðÇî+â2 IDATÃįüÓtð‡Áþ©‚ÇO½býñÉWûœø”ò˽*wBXüX*“fãazy3¾0ýñ)‹s_DOÃùèÖ¥ šëž®*‘MÊ=ÂW†>-!,ï ³Èžkà¾ÖŸ¹Óô\Ž’)NŒ.ûKŒµwpsZDÈÖ±rZÃà'þÓíðZÚa#î~É>]>Ϥ­þ Ÿ«Oîß)ùæ ¬.)‹K“†_UݬµaÉAò ÷Xš7i¥½½9ÑÙûííæáb(¢o)’¶m­91c“-—?üôåìúõxßIîoÿÁìÏDtÛn,æ}ß"(F•}ÛÜý<ÎSOímc‚‰1ØôXUßû×øú{ï];€Û~o{»ï7fvËM§dà8õþÓ›ªÞûŽÆNÍÜNò&Kº¢È”i6뿼3„ѨчÍwk²mmß >ŽÌY”zWùf§ª¹º»W”Ô»*3Ü´õÞEX-º-|kQª]û.›°ìÛÖUÓANdjæÖs;GÈ]#H`ÿõ/½Ýö¶ïfÆ@7wòÇq¨Åí‘yoMDJ³µøÑ{\·MY¸q‚;Ü.ˆB-&—¶ óÞÝÉÏó‘Й¹A*ÝS«Ý“YÒ66¢`õˆJ€tâkÒšHl'‚_zö®™›–ÔEÍ „ãQ­g!vD-§lÛÞÞä®È&"¾ÝP`ÐÛm7§ãñPSfaîfÖ„™`™i¢‹ð‘kÎþéArgv÷ã<ãÜ{<ÅÒòè 6[öZ‹Ç`­ˆÕDî÷»©ýܶm(¤µy6’Øñ¢µFž,xªAêyvzÙÛÇr¬Á ᤟<p: B¥æ û*xAàòö‡mMÍˌܗ\Üæïz都GÊj–ÖTë ÌÆ×2¬F¨ÊŒ’¢ !¾EÑ„‡µ•ÈÉ iñêu x&H“àܪ۶om‹ó°è[êö쇯Ÿç¶íãÛ4¸»‘Ûá&g“&„fjïÉÇ«÷’¬ÜÜÞ¿~ ùÚ’5N®jn·ý<ûã<î÷»gé+õmfi$8ÿu)†%£dæ¨ Ûˆ‹†Žè¬Å¨W|è…ütõ›9þÇ×å#W+¬ÓÀ¯ÇOñÜbª¼3BcÉNª òUÐÊ4#WN³i¡Âu²a|v\« ÇûËŬ§%0Gš)„X7_ðÌ££ô”§ESÃ]Ôb®erFPÅ4ÁçË7\®ÿñ4™+©›“+;§‘ $Ç…Û)KÞãàšpµ5åcý©ÜÄ×’sŒéÚbxwšì˜iÓ¢ÿ%ù±*ïCo ~Ì6Ê´?âI œ³_2Vdüu˜?f¬;Lscã89ˆ†+ú3–ÌPÃ:$ps%±ÈIyUo .vq|cÁ’Kúðl¯V®Õe52I)©0›Ën©dþšF/„t§ëa.Ö°| sbƒ©fz%¢¢Y¾JG&œO£ÀeI™°<8µvº˜ÝsæÁ€FFmŠ?õVíèéå~tÞÌ`}Üð€%‚~iˆåì­Ç ®Cçƒr륀8ÌzpqaÒûêÁKû6²öЀè_7ºÖi^°ó‘ûz7‚ª£‘(§ YVc~m|Ne*òXGMãZ•9²£yOÙ†lgS~Iù˜@>µ9–óÝ+ä4'!#øRíòcŠW?3cœZîtfë‹{òâ»ÞBhZð=Wþ«åœŠ´æ“-ÄÓ3:Ôîµë‘¦?ÂÇc½&i+¼Î|ne†à¼ˆÒsãŸc*g EN¬àKFb³¬öz_“<æ«™¶NÕáPCÁëæóš×w½ÂÖè c6Úª—¥Â¸ÚRñ2ŽXz}Ýé{’¶Ï‡×º|:Ê´D%hµ+}¦`ùgEëþI)óÉÖ5Æï(ÅþtÊà×íÿœìü]ÏwÕÐS½ówÞŸûwÆøITà»ßÈoUÿÿ½½ÿ¿ûX|þó„‚œ7.~ `N«Ák&éõ­MéxE Åêk_À"ú_i[Ζ­W ¦mãé£`±øñâ+K·û0R,gØuÂÁKG<ÏIçâ”÷Éäø¹Ê«_í£Ñçî4_Kª¬4ýÒÚ¯ýf™(3ÅxÿßŽáøšs“é§Ía—` Í#Ï ¹§T^ä~ÿ½ºvö³«(·`w¦DðåÖ»t'NhI¼·Æ²ÝáÇщdk»™˜õF"!Þe'"…ÕÆƒÓÑ6fV?£>ñ~Û»)×sAM‡wµã£I{»ÝÿåþÏãü8QǺ훸ýùëÑO=¼Ÿ§ºÙûÇ»iz©X˜Ë+q<ÓžkV¡­ÉÇ_ÞÿÃ÷/dÆ Û¶ÅS¦Û gíþõý±s;í`qfsÚ¶»£„¸ ýìd#VGô‰dï¦ ?ìÜø¶· õ>Œ ŽÄìIhÄqUöD v¤Âû©aSÜZa0[Ò{:YPYRA37樂ÐMÞ?¾ví?0ý<ÇA@kmk Di­…³˜ ÛÖ˜¹+;ƒ\ æ9“ÇTf0EÌ5¹,Ââæ$0í½Œáq¹1‹¹ª“z·j‹æX•‘™:­¥m–ЭµH9Hk ˜)Q ! *\ibAùñíK“- à€ÜÉh75eáX~©›™ÅÁq7† ¯Å´sú¹­ýB˜6 ”í…Á2z<çy€yßöÐ [k"9SãîŨ¯×çc$»ÃèÜh^ÿ4Wèd[{Žþ øñÐDj œ½'³œgÙYcÞ˜RKÍ@Võ> áªbÔS C†¤2ÄéUX@L—ÍIö òŽÍŒÅ©9OgZxI‹¦sVc’4G,¨èIœƒ†0ÜÓ}= î3²ž«â>î"þ”–yîXªPÃsÂ5gPã嫈Á/ÆðÏŒÿ3Ãp‘;Wþ;üªpéxúí<¢3>g£*é…O†«"^èý˜]½×¸TAEΣ.™ W o¯_ÿ=œ.íÓËd4C0îË ïªÝûê¸F-œ^«˜WÅÉé“ÁCý˜ý2® 'c„ÿ6cõ·ôè•þ›•÷qåú§Õ ¿j®÷ßëßÿU÷î7ú“úçOÎs$äùEUý÷|9ýÁðà°ñÿóUàøQ<ÝÏ?™5\úP`E Ù:hfŸ)½'‡:°Ä–¹ôõâ:ðÀlé¡Áå¹-0KŒ@XGcJÊ#æùYœ'A••W †¬T„ƒð‘¢ËÕ~ káÕ'™ì\­(¹Ò_Ö—TÒ_T‘Œ ¯Ó«üC#œúÌË[EõÏM „×4/_bfcêó|QúãøGc9-Äbf³p˪âí~#$,{,[nnf®qRüòñþõÿWý‚;³0›?zß#úóOoçã0õH(Y€†ÜýëÇñõñND{ÛMé<:³ˆpìæî›43ýË_ÿʹ¼ÝŒd—m³ó ²&„ïï[k÷·/ÅÝÂþ8äÔDB8ÉQx×ó¶mJ•0]…HƒŒûÑíªjN.² o`ß›dûéif.NÖ{?{¤QÉôìDÍÜQs?•š3 ‰S(qð(Uî¦ÞCÅff¶H 1sk²µ–ûÞ@å«’ËÀB†õ5F* æ¦Ð­mÞí¿üÛÿužSU7aþñËŸn? „7–mo[×3÷u6÷³ƒjJ#xÓÐr.1rH:™yZ‹csÀTÎÑ‘©¹GwXmz·¸}î*¼51…±‡q;Ö‡ö/ûBc!! òr±""4\©›†éok-äõˆ; |ufÞµ³¹ŸýŒnü-"­µ6ªnG‚n˜Ý|„æáKD9 1Enû."ïï›X5mÔšH'UµÑ>n8ñ&Ý,æo!BhßvPö<›ÛÖ¶¸ìôì‡Ú¶ïÐSø…$µZJº©âH1qÙÑpª Á8Á$Cšób¥³Áb0ŸvÓAé ©Ew'tÙyz>¢ 4a7¦–>å6ªéQ€Å¨• pS‡}PZ"#½R]ÚÞEZk :UM-B“ìäU{bÞUs$¶maxõ –Ïê.b0¹õ®îÝ)µ©žÇÙ›°0À­ËÖ6' ÒWCóæD{ ~ü¶ßö;Èþöó/ïï¹³·ÚX€…é~»yèÚæXX ¸µ†u›m œœ÷¨âŽ{xã(x'µm¿51÷ãxÿú•6v‡©²È¶mÀ¦‘‘ÆN¤ªÌhÜBúŽ×ö†$©[‚ã²µ÷ÙÐî~íø}çG•s Ÿ cû¨ÓLxæò· Øó÷Ì 8¸ƒCN8¬ÚÈAàpÔÁšæOŒ À²öH6]¨3uí­$´$=®¢M Y2!àD¾”¬&Óé@ ;^tÈE¿À¥£+2z‘Ï/݇³òø7ˆ~ßBÖûs“bµ7èxé=®TD±gÒr4\Ï^bãOÒ çÐZð|ÃvŒÛÛuG/ÆÝÔ³@k¡;­E¾~M7à“±Ézê/êÿU]Z±HNôï« y™ øåÛÉ#ït©Hù\ ªö}Q¹ýÓ?å³!åUËÆ È“ üyïß!Eÿõÿ[?ú‰úï߀ø÷Cs†þ+Äñ?4ùð¨ÿÿŸµÿ?Kö/Á€i<Ç'S<Ùžfø4"¶¥Bï‹€þùÌ Ÿ\Z<ûŽ,ù³?dmï àbú¡ê!Êóµ # ’k00ñ Ì'A–?é&£±†ws,%Žop+Ðp™—¤«bõ;eQceÇ}–]-ŸŽàå«á"ùÈKUïÌ" _\õÕE /ƒaÏÞšT7ïûÎÜR8HhIŽþå¿ýOû¶i?ÿúó/Qv w‘vœg´ž€ÙÁGWfÁ÷?¹“€¿¾es»µ&"ÇãŒ?"qf#§ž-÷«-™û¼ë`ÔÀ0ž, asc ètÛÚ¶µÛm“÷ÇãDÂØïoÌrÛ·=Üf1«a7‚„»–LよkÍp¿‡âGJÄnÑ[¨vôóýãcoM‰"é忦¦M¶PÐÞßvGÛ zN„&£ 6|REñr›µ5mŠÍÉP‹¢/޹È…U­Ë8vDÛ¶e6…VšjÜògºöœ'˜«8`vŠ>”:´åiõe/î¹¾d¦`þÍ\Èžu¼D¬9ŸÆ[Ÿm¤NOÕ¿Ke¨O°®æÇÅMìÓ_˜ž ±sÈTÑ‚É(»sm£ìwj’d“1ç…Y¯lC˜… O>O(ÓÊ$0«Þét8¼ÑbLdj>üñqžegú8ñ'‰©¨6µÙàb€SfMÊ”¸ªš]Ñc*<þŽw“3=Ìœ¯h‹î<’6œêÙØoÕ® úI,Ï6ÐÅ(üd]œ‘–RÂsa3£kñÄsOËEÊÿ6 Iù„"ôµŒ7ï-µcË(3bxaöÉœaÈ£Q…½VT²Ë>íÙ>ìi h­sÀ¿”ÖÏ0“›=‹1‡E‹uù8˜”QTÎW¡0Wjy¤ñšJL%ö%Ô”©6‡Ã•eN,Ìî#(w,Ýhè‰Ää²m#Fj3 ³÷f jú"²S…£šl¢á5yª‚õ•ÚXˆÞK­ÇmîF×2QXAFš|Àëçc%}ŒAV9«MaýkGzŽÖGαžs(JÒ¤;ùLÆŒÉâ^4GC÷}ŠËÌ&¬“ÂÅ šÚIº~’ªW$áðYT{îÀÍ[f]Õ\¼£æ¼qÞ-êY¾ªt^HÊ .ÍcÈR}»Ä>OšERÁºZFUNà~™Ï+ DëH./z*©£®éϽcÚC–ÑÑà­­ Ä×pÃZ0ü™îìLS›y~/"üi&¼êóxÆü/³@iV^º¯e>Ëù½ÀøFÚj婳\âhÔbë÷KSÄ:¾zQÿ—à¯Ö¢´ù§öÿ½EËu¹Ï~âwÿÖ·pè,ÿëXÃW€èËUíǯÚõ]B^ 4ñmü—©èÿƒÆsÿí¿îSõOƒÌßæ2÷φ(ßqÀ?yÅ?HýþÁCöOd÷ÇßýG?=¢¸8ôçwrÛ.£5|rT磾ÄÂ_SV˜™p Æ#¯¡¨57°.O|b"ç•“Ÿ²ùü›y·]ßýRüRäHrÅ{æÅÕ¡„Vë«qýú1b¢±Ô 4 ñ`7bÔ1Xð¸‰Õ³¬ b¯0ðz&ã…ÀÓh½z,7t#HÅå¯ñ7[žI—:ô§&ÿû²(­wuO²H Œ>Ó®gרî©F ÖÙÌQ´R©‡²ö8äNowuß¶ÖÃ$]fí= °ûÞDBQ½àÖÇ9¨f®[ÛZ“ÖD+š«ªfÝÍ£pßwfêý8>ªýdç±Y“&7íï_¿šÙížÕ»ì >ÎS˜ÝíÿøÏÿú?ü/ÿÓµ°ˆ†cˆ  ËÆmG˜0{7wÕ¾ ƒˆÖ6Vpˆõª{kÐ|U'ê½³ˆ¡«CXØ$ª~I2ó.²¦ÝÏÇÇ»<äv»«êŸÿô§ÇÇÇǶoÞ5–œÐPÊ­GmˆcÓ{g?{hÇ·ûýþåí8»uÍFP&3ôó<Ïþ8ñœY¤yì™RT%˜j,L`¯ÈüXSº+Óº |&câ°5«¹=Ž3 †^N ³£÷\fý&‘;H°1om#À쌖E¼¿ŸêM¸I“ôwck8páljDÂZex9½{çl÷èDUU7gaíÊÕi„úXÇÙ("±P‰Lœ—çyºð~¿uU3Ýö)Æ…•›ˆ“øìgˆD‘‚w"%ß<ѵ÷Ö!¹%°•ž&¦â0¸‘úP:"Ë'[× Ü…&r#o"~’ÚÑy“&›døYn) s>¬31;i†b ÈDî!)˜v-5"JýЧ<­0^ L 9—È«ÅNƒ!¦ƒSœ¼j›HèNƒÔßUZ2p€@¦f쪺 ˆæ^RÕÈ]¤1çQJïU( î£Z0ìÒ£,4G›Úá –dæm¿«ëyF\ƯíþxÐyž!“‡• aøˆ>¹uufoŒ£ªÆM¾üðå8{œ~C î]Í]¤mÂ"ÍÉÏãÔÞ( UæQãö¬o53ÇøOã IDATv"s238D´ãx„ðÐD@гË.LÔUß:©e/ ˜ÄÜÌ0D¶æjpîǼ›qÚ°k°DîYö}‹¦ñ¸S‘9öýÖs—KR35ˆ“Ìt¬RUÃñj°QÇ [4,sSµ³Ÿ¦Æ‰¡LM;1ó©3´­9PÍÆH¢ Ì)+Š×YÔ‘UÉ!ô„ZaBBì!sj֮̽¡}$I­¢aýœÈ9¯jÄ|Þ'nÅLÎK£¤%·dA>Ó"ØMªvcHo³sµ¾–…)4«Ñiýe(oÌX#ææ;¯ÊüiG2Êp0…hž;õ©\çu]Ö9«©³ß|Ì®óÆ·ŒKëüðb ¨‘e©íÒôœçÖhÂU¡œñ¸"öÆ!@{ÌŸêÛ™Dºê±“ðñÒ×|Lµc6£,š´øUj«ãÅõ ,3…Q^‰Koãs+îê”_ú.'ØæB0rºTŒÅ·ð‚¢¹Ð|1ø«¨•+Ðs-ï³V3å~Zì«WRÎJÂø´.Ög]ùXAÌÔ^6üØÕ²ž7%ÿL÷ó _…ø2¬ój_jé¦K^àÂáùTÓ÷ç¦]ÿÜŒOWÏé“ÿÀ‚Dk΢Ÿ~õú/oìš0¾7X2ôbÌ'(ÇoÕÐ~¯4í¿[+þäÿnáù·©ÿD¯•kyãþÿÿÁþÿ¢ÀÿÞ?ðk£•ÑUŽ5àk}§ÉªÃ?+ÐК¸ü*kãK¦ëó*Û¥b @Ó¦°ìB‡=l \€róZ0>º¦aÓÂX·ŠðÓKx ٠ͱ7Ie Ü%»°žKˆ“qÐÓ/‘µK2V3X‹õÆÇÔ§"ñÖFXöâôOÓ›?ÏÜœ®Nþ w¿£ø· ÎÞî̼m-ºG·Öa 2UëÖ‡óhz0-Wð%ý{zcÏó$ô®ùË_~dŸXêk=,–„äΫ+l±í”“%Ü!-U8Qµ÷¯ïý8BÝo™o÷»ùÖ„ÝìííMZÛ÷Ûqãqòyç70›;šÐiÂÌ,ûí¶ï›šÝïû¶µó¼ßÞþÏý·ÿæ?ýÇx`Ü·»õþÀ‹PaaÞw'œ‡[/ÕÛÂcËàxci ‚žN¸…+ßš8AÆ&Œ9 ÝhÀjœ¨1 í··ÝÉ¿Üïï÷Çãèfävœçq¦zk_\ºô÷)tŸA Ú¶/æjª÷·7ðÖÎ# ƒáw2S={ïlvœ&Ó©½Ÿn&ÓØ#æ©áÐÚ3‹—è;ÌmdžˆS£T5ÓîäÇñ`áÛv«K>pé r–Âi¦Ís ‹;Òø|~<ÎÇÃZ;qÞï7aI 7Ð@j<`Éd2dýŒ1è]{ï-tÞ85øýäÝI9gs޽¾FDÖZ BA×ntQSXÄâ;ûÆÎt>Î,1&ÒÞ[Û2 SÌsdfÛtU2ÕØ¤÷ÉSÛ‘Öˆè<Ϙ»êíNÌøøxŒJÊ|"aW7×´Jš+9ýì*¸µ}ßD’<«DGl"hMÓb‰µcÖ©V>Æ]KÓà„Åb/x&ÑvÇE }TZ™*Cˆ\{Xã(ªk înJ¼j?»2ÃT¥mnV˜©JLàì®mŸ¡WOTKô4v'9ÏÓÜ„À"ÜUÍ;€mßÝýãã9€[kfæÃ"}ÖmkLh»è¡Fi« “€ä¯ûÛûã±ï[¨8BcÉm~`ÄÕÌ]­}<޳w''–}燪©žïïï"²m1¥ð«!˜¤5Â7ËÂckl¾õã<г&ýíÜÄTÍáùùo½÷ó8š48éÙ‰íãçØ¶m£6Ù-8Þi\|!Úñ`K; 4WÜsýˆE%)]uèJž‹‘áã™)Ц}†Ù˜â¬ûÜÛóˆv”»˜õ^þýÒÃP ïB_ž hp~h4 ®¦Ÿ¨(²¯$WÜÔ.áâÂQO‹î*7sÍPÜh©BÅK´‹FúdÑ¥WTy}ÈhÖgĨHªÇºØÈTx½[ÆÕÞT8õ,@^Ω)ª·y]†'¶(|N,4ë)R|\@LÕ„ì“:¦=Tôeš±™óXÄÖ™4ÙŸƒ¹ÐPF5‡k¤f2ògõ•OVÌtƒŽ¸ €‹/ f¾¶ ‹´kÄ#U Ýh¢b‹ 6¼žÙh>•¸øµ­µ…*‚µØ`ÙÁùòéÒÉ>^wìí†é=ælfs°@ncJ±²&–F…ÑåBÅ{höù ©ùÛÌýŽAüþzE™»*ÎQ$Â’wÍ3ÄÁQöYÝêkÌbísXä÷š³˜Sd0v\=ðìi_pç+µsdµŒ èI\TÊ'Ÿª¯ ñ¶R]ª¿vŒB€Õsè£õbð.±ÃU\Lƒ#,»V·š{ºÉiñãE¢ TËW\€ sT‘­[Èô\9¡s8XÌ$ŸÍÈk’)—æ9Búp’=L Z QÿK«n\ŽöLÈ7ñüW`ŸÝÞy#_N švþ„§åtšÖŠÛgõÓçÔaqF:l)jB2ž¶x"ÀŒ*_œ <Ä/Ä ¿¯pˆ™©ñþ:q,C¨Qx‘3?–Ì è¯ñ™·}àŒ.†zþÓs¥8­!ƒÅè~eÅ¥2:*몖A¯‚H¾¢±Æïœ)óõQ¿&ëÜ/c‰Ë T¹ó"¤>MAܯ ‘Ë‹~nh~²ì¿Â…¦9É\×ï¿_ò%¿YM®žñ¢'Ô¿ù[ñéÏ}*½ý.‘ÿïÖ¬ñéÅ3spú”öïÿ—ÿÓG~‡úÿÚýûšŒÀ·þ蘯­sÖË$á,]¢kø¦d\YÁåáô™¬ÌÏå)ÕÄ æ5PfÂS•4¯ÍsôMD,ë§O¿]®˜^¾ððI\ûÈÅäJů»K䯳ÆrVqúÞœžWPül¬¯à@­yJ¯¿°ÎÖå½U€Ÿï+¸&ÔÖµ¯ø£er‹§[ë+ÄìÓÞŽß6UojÎà;ÊLÃòJg¨5iã)ÄÁ‰È=2©öó¨óa¿ÿ ‚ÓÔM ‘”ì.u3‹PæM¼ÚJY˜‚æÐV*TMšôÓ½õM61ñív3":O=ìç_~!·¦x7†Œ«ìÑÔ‰è¶m„è¶&›lû?þ§¯çGÈ{“ý¶”FÕº)|#FD7\M™²>ÔÁ’*šÚDÛEö<Æ9®”M¯%‹ÄÚÕâà»ùeG” ©yôâví]µIBtÜí<Ïlé0‡lÁ£3µà.°Àg·óìY ,:ruZãHùPè­NL°HähˆŽóŒwÌH䋺ꩪ=nTý ƒâ7¹¹ºÆ¯á-Ü]«JÑÝ2í‘þgxT_»{‹* b¢Ï„œDZÊ-ÝÎó´¯Ú¶æ ¶Ýó.6}¤d1ÂI(™©UŒ`í½Ûû¨g‘”YÀêvv}?½÷aÜ‹ö½á”y{޲˜cKdV踒–sîé~ö~öžî'aˆH<<ËqID˜›Žó°nD1D"&v€P"5íÇ aáæzVX=zY]µ ï5¿$¢C»0X©Çƒ3‚DP衜úŒd×ɪZæ÷–憞^·öõG†¿&M¶F)€îné/.C-jW9íu^j!Få#² ”¯5aƒUñ ÿä`05FºAù%0<(óƒ±X¸°'Ë(­eÎNÿôs8»“pÌðÄTid{˜(Hýá SxN[i‰dtD…DŒ0ÓŠOÙ~IÁTJG¯ê:—.ÙÈ·ZÈàL«SÛçwBØÈØ«¤/žìáEŸXŸÂVz’ŠÂM£ô¾&mƒ>—Ù€…¿ŒZ£z}ü«æ—Wqµñ É«%dmá¤Ü Á/Âܧûâñ\X¢àžäÚ¼<Îu¨­ªt‘MòéA/t ÜÕ†5xQ=»jÕV^ ÎùVBsZœ’V9<­Üðœ/ Ó‡8K¦ÀZ³|¬DÎUí„Ä8=jŠ€LYVÌÈ¥Œ5/ó ^ =+!|ÿ7uoÖ$É‘$iÊ¡fî‘@Õt/íõÿÿoKóг½]…̈p3á}U5ÈÄQèÙjP HÄánn‡* óÇ£µa|0qM•ž¢Åm“-Se‰W+8˜%.“sѶåÎKW“x À‘d+b~N‚1“ çršýÞtc’lYv9Oª–'‡¨rç³%)´ º×ñ ´)˲³]™7…_f1@Õ¹³%YÜâÑ ³‹Ô&$o)îM7sõÀ_ØDXuB³tÞ‚ ¹ûwÊ(@YʦbyíëÝ5š¦Zv¿ËC™F­8®¬¹A­¦¯œðB0“K±õœpVtÄ’{ÌTÈç&» ¼ng‹«uQ±y 2×äyNn"^6H7\çU„fÔl?˜Úëñ-s{Ìw ÏÛmމ—ÂP ºïVŒ¹Î ÍØA†KÈWšÓ¦œšW`%åç4Ì ¢NåÐà9äÍ÷+T¥ò陟'°ÏÙ.}追XöyÒ>S¯xžÎË;~‚¾;M@ôpA>CþŸâ&CZ¿N¸'ð‰.3䤟QI‚Óð]$ž„±¹ð X~/˜/)œ)ýã*_O¹.£'N£ù;_£ ¼ŽÄ“”-×¶Üñ(ËtÒ¼.jq xärÇWõiežWÓ“5û#ý?xà_¸ÖQqt_O½YB÷q.ñ EãÕ?ìï׿^5¸§¢€?OÇþ R¾7øÑ—ógŽß,—óg‹?O&ÿ³ìÿÿíÐÿŸ:.#KûŽž×õþ¾ºé§­ÿùÂü0(»Ã `Mh¶f\,qiéïZæ¹L],ük qÙÖSÖ‹éõäÈ`|íºxm%¦9J_¢¶ü@ª2õÄU¤¶¦òcsX÷ÛèSæY]FLY¶x£‘Œ4î»ù…¡ôálx²€`y0Ößi "àÌ¡>¶ÖTåíýj“º¦—™ˆN;Câáˆâ“Ñâ²ñ¯Ý2 aôË—/­5éî­¤ÒøßÑûp‡¼RëþÙ$XVônæ®·]nØ·-Êã'H=ðÎ~º»ˆê&ºÑf»õ~ôÓÝ»‹:|Óí~¿ïû~ßo·¶õÝÛ}oºýxùë_äõ•˜O?ãÑ£¸ÌCgwߘŒ»ˆD¢93)œ"Šà“º…x©àa&âî0œêÌÒXK3ˆ ÝBì]VpÚé†Ózaª‚&vº°þ·_~!¢Ÿ¿|QmÁЧÑ8NT7ë¦"|œ§pl¨œ›k!¦ÎL~H7mÒ„¥{77ò‘ÿ­5°0Ø›êܘÁâ ]¸®Cøx€;ùa]€Xs'ßK´H8»™w󮢥(¨e"s3 1‘[xÍ¡JDt»íûí¶mÛ/¯o¯ß^ï$bD"bnMл…=<Þˆ™Çq»íAðÿë_þbŽó<Žãp®í‘ªž½SÄ87Z1ßÄûøªµfÖ¹êXÏãàJæ»»uïïý<Ÿr\RÕCU‡dЄ£¼¡ô@¯.ÄIf–°Ä’‹ê¶í±w꽫¶êá°ã8ª;ædÏéc…ªªû¶mÛæîU7s*I‰IÚ•048ÌdîÞ½{ç &Š8c@åY7³Ì8“Cû¶iSŒ~vGn^&Ä­iÓæpUaÞúÙãNÒTã~ìcÛîŽ2Egï¿iÔ¬;m‡™çÑÍâk:röxï*¢ª*qKqo*DÌÙHµÅ-_UY$& Ý“¤%  @~ „¢4ôèLb;8ÏÓȃ%Ñ­ÿÒO&Ú·ÆÄfnîfFp3ß÷vßvsœU5÷ÀÚz…´èã@1:ÃCïEhB®=Ì#£¹£5 x"­žKÕðßxÂÑ—Ö¯dçpÁg%?iœ߈VNž éü°èÚ[‚0ÍkÌ73W1áOf?–÷°Ò?m´C¢ÊMŽd¥S¦*ª$ÊÅa{0HE/ W§"†…ô"ÓL¢v-ÌA¬ÌÎ+îøSÂVÇ/¡´ÖéÊœÄ'š ýQ)<2Ÿ‘,/H¦00g9ya:DðÁOÿ'Vˆ˜92A±¤f± ™"^4Ý÷¥e—’ÞÕ¦Ñ$”3|·ÁMŠGªÆL@˜û°J,€~©b‚±‚Œo9ppÉŽäÉÎ^…F¸%kKe‰®FÌØ”®³†HY’÷¸Ñ.1Ÿó–Š‚ø%5«jzÇÃ|HáE¦ËÚt¬IÀT.ó YÁ#n‡r´õ†S|œ$á<zèºLäSIçœAUSûܪs}PŸk^º¡ƒ¯E¹×*æ…:´|‹o~о¼r£¯~ƪWáÚ±@ð1QP*÷¸„ø#%ýÊʸJaø.aþ³ªÓQƒðT °NRC.ò‘I¼Z0F4(à ã"ÛcÐBŽâ¨ZÜqõècMyðÓ ë2ì½>ê*Ü:†Ft!Yã{yàÇJõu–v1§>I‘ þŽbõ«Å¸W¬ øÇŠó'?{HxþOüyšä×O›ß'çó¯Ï.cˆ_øø;¿ò÷¨ÿë@¿¥ ø÷©ÿø”0ôgÅþ3üÿNøÏÇÎßï}Íå¦p7~–˜À:~Êàâ º6W:-îöKÃ4– /•ÕÂóñ¨Ç1Ø·MDàÖËB¾o{k[‘C$Dˆ°ÈmÛDv'7÷¼U‡ÚHHB¼È ~œ'nÎÒÜ8ú¹©Æ‹‰ À:8X˜YÔœTX„TŬ¿¿?¶Ûæî­µÖ¶]¹ŸçéêY ,’ß<@"ôPßR{•¬–u9=Ž~<Ž××WëýìÞ”o·­µ iAßâò¼c¸€Ë@r2Fºí*BïÔéd’¶iÜ-RÉs°°ˆÞ661å-°<}Ð+hà/ÌâæC*¢yæg{¤HàX ²‰È¾5–÷··÷ó|Ó¶©âˆo·[S=3òû¾ÇX…™¢¸•¥m‘®énB.ÜÀlîÖ{kíååeÛoîVþTÜ<¼¯”ÍÆ°œRPîß⪠¥¦¸ìäp7O‡_ ñ*³fäˆJ½¨{þ4„ ÿvZÝG‰ .öœ°iªðjL`’ †äôŽ'yÚGsé'™ÿã4:f`GâL=T¹žöÌê››üû”}B¸v°àŒ±V…$@Ïi˜çòù¦W2W‰ÑØà<Û¡¤³Ä¢yð/¤ˆÔ;-ˆºfÀ?9nÙºTyÓ‘C ñ£‹Õ×9Bî<Íy¹Õž5® 'îzø"K®åU­çY*?WD5~]Ö÷²6Q-¿©ü+ÈoâÅELu6`Ä@HY0 þqfË‚úVcÅ•ƒ°1ÊŒs<õa³9bƒÓÃÔ %…¬.–>8»”ˆB¬2)ÖO‚Â(/˜TE^Z(Ç+Ëäá™&½ $/àˆ©K{ƒ/ŸHÑϯ¦à¸š±Æ c®]8E{¦ì§‰è@Šþ2™Î1;ç¤l:»Csµ7ó€]7S•`wïÝ\¼ú´Òލs¦4îÄ{pøúÔçä@÷Œÿ4à„Õ~”uJu{çÑšÀé£÷hB‰ä‘ÈËóÆ\ï«^½V:[&D3¥ ÌsdÈjS§[ŒZ³mL/«èÆLKƒ4TA’ëj;0‚L‘×JÅOUÆ6¯vs¸’hÎ92Îâk&Mø !Ãðåt¨ÎEí_qþWÿø<šSS"~F­8±KC.è’e@†DgØ‚è‚gËBkäx–ÕÇPó?‚¼Ô<õ `ñþÓ:X­”Yºs™–M[84ö_»CVþ‡²ËgAoù©XÖ5ä¹ö 󘯚vàâ;Ì“O¾¿.é®gà?ΰùMZÝG{ãò¹ýŽ£Šë‡ÿgzÿÿq9ÿŸÄþÿÇÔÿßÿ¹äk•ϼ2ÛV«_“¿Oo¾Žvxñ§_nùÑ´9r]Qß6Üá»þ9¼Kìç©Ë—?•«iö÷®aârLí–ëïeTN™Ë-`gÌt}{V­i”¾ÍÊöAýY׬ùæçSLä+ƒ.~Ÿå-8Qcžûõeœ]–;,øÇeü°¾¯Lg.€ ÆuŒôqñ;/÷uß³ÜhªM•((-®á—>ÆT’Ê™-p*î¬P™•ÈÍ{rMðx<ˆè~Û·mÛt‹§…¹ƒ‚ éÙÖ\ùP‘TÜšÊyž`™ðë.Knûíñ5F@´µv¿Ýµm÷ûÍ€¿ýý—¯¿ü=æðÃÈå!A"R–¿ýýÿ}œÿöúúö·¯_ûùxùûûý¯÷8åÚ¾ 9àݨ©¨ÂÜͳ `òÈ ³ˆ2òßÍÉá"¢¤7afi,¼ 3Ȉ@vºæïýŒŠnQ…’‘Šš[*•¸÷Þ³o¢"7vxšTY÷$ò¬­1ËãíÛ¶ÈÜÎÞ¶Þc$ÂÖÈÒ<Îå ¶hþ,¤ž> ÷ŒlMN?Ëäwn@D{Ûº™Ÿpaƒç…¥,¤lÊ¢Ã?š>“XåÁ­»3˦[zSUˆè°À}oá~3³óq8ÐZ#qsƒ‡œ&"û~Q±÷þöö~Û÷ûýÆL¯oï!ÔóÞ'r*@`U~‡î^ìƒ$QìmÓ¦¯ß^C ®>apGïÝÜnû-¾7fiÓC/i8uKH‚ ô¬Ûê[Ý…BbfAªæèlînÖË»—W_RÑËévž'3ª* e¥n@÷T‘¹àNB‘&ÙlADÎî³±M<¹>Ë‚ú™–¬B/„,#äNÒG?­Öd"Ò$ ñ\J+脳GÜá~»‡ÔxœÝÍUô¯?ÿtô_Ý«CÐÜ‘/_îdccÕˆÚ0‰È¶m îÞ½÷ó|ôóq<@¤[ûéËËãx¼?©±€Ø‰þç@H%Ù#›Šfmm.D;»e´ŽØ=H -Ö¼ã!È|vc" Ò8CfáY8ø¹xû²Ã[¹ˆnʬ"÷Ûn½ŸMÞÞ:‹nªÒ´5mÅÒò¦¨À9ïæ 2ëðHE0ÌŒ8ÅA­µmߊø»Ð'2D¨#p_û0H8}²$Q¥jhVg9ûYK6ÆBŠ7`ôW®ÜMΓ15Æ<>|”yÔ%™ª$oÖ¸ôæ‹%!u 9#Þ~Ñ­yJW .¸>‹ƒ$n•akŽÕboÕJ)Ù.)¤ÍA’ÙD(”ÙxSR–|ÉybN ªçWbÔ/ 2Ô™)ú­|mJ9$dÀ‚_Ô’I[‰`¤g„œÌmJVqÌ%ÝÙZîáÃ,¤!0µŒ›º\NÚ&ø‡ωLý>õÍážÅ»XáÏO~£ùq–GãÜBx¶ú0Ì‘LdþŠzÒEÄŠs6í\™G–¼Œ²¨«°3ëÞÝ$¤2vT'¤²šA®Bï„î™4Ç,Ö]å²ËÔª$=̱«SŠ%Ưqh,OÔ€løâÀ™pqùæ³uTÕ:‹hk*êp˜aöå^ÍvÓa\¼É¦ËÄšªˆˆtwr×8øáå÷ÙQ_¸’ÄJeG}tÑCUU¼6. òe‚ž”cx–Px.^jnîµD‰ï¤z« «³aåÛ, l®Á<˜ÅK>¿ØÛâ,›Þµ‹-rãh‰Ä,Ó®„b^›Ïâ¤n”g?ˆüÕù¹l%Q“º V12sìnhnÍo Q¾LD’—§Ѽ3¡ãC8>XøsiäUZ3Ìâõ¬pzÖÓ˜?xo™?uËÑ[ ÓÊšÉ^_MÝÉ=æZ5çèq§CÑs1Y>£{ù,-×L Oׯò!.Œ.{r+Š‚dLY…ÖÀÜ|ÐÌ!qb÷ó!r¾<©œ¿q”‘;©.©ÚšžŒý­.(þôòsµÜjàQvÉTÎëÊâçåÊ‹Ìä£xy&Ê EÎ4°3=ÕmOwîÂÌ–¾{©Ð¤àËÖÒ˜u1d½ÒÜ?Cò€°Ä >S¼/|3àÇj2?sf˜>GóàÒý,&âCå“¿äûZ1~»~ÌŸÎ>)ü£J÷wÿý×½ÿÏñŽßªãw¾vùü×üÙðŸ?g„ðODÿçßþ-ŸÚÿ×/=µ¢ó”Ÿ±àñÇ×2?fÙaûé‹n] ªo’Û8Ÿ\š Ó¥K"A¾,y¶ÿ>;Ö—·5I’²++7à`‘Q÷”Éj/ ùþU_Óq¡ÅK‹Ú‘Ëû¾ã9®W]ê\õQc)Gšæ÷qÓNÇWhŸ”ŸËz¾Æ«(SàwÆ`ÓÁ´Æ¢ø’‡Ã÷R•C¿/-ÔÜ!JMÕdÂqvË*0´Ö¨ºËPöüñ—”ÑN†P_ƒ›Ašîq¹ß}{}eæÛmßt coì}Y¡ò%¦g[ŽŠ&h˜ .Êî®ÚÞÞÞÏ~ôà±1³¹÷Þ7Ñ_Þ¾©êÏ_^n·Ûyžn]TgÔTÄáÿòüK?úy¾ÿåË_o/÷~œúexóðEc!©ø¨… ŠŸ@rfë]DÜÑ{§³;p Sk- ¬£V5µV¾ïºí*Êžçý•ÄÝ[óJ`ÞtW?Îà•/~•hUU3 AÙÝ{ïvÇyÇãv»'â”f&½Ÿ]¼÷ÀˆTôv»1R|ÐÝ7Îͼ]2õK²~¼UU•¹Î1\Þ)™E²p˜ã‹ƒ MÕ¸FDݼ‰v7w´&@7pô·Aöç­?N–>››™=¯©HTD¹B¬>EØ…=¬”D¢Ú¶FèœHˆ»Wl͇$òT¡„²î»“›'8ðÔ¡ 1Gâ!œQQ}Qï"R[E!>á1‘:í„3i“*Mé¦#/M"uÔ¦Ú݈XXÝ{G°þDݺ™Å'+*Q‚Qu«² ‡+‹A1[Ì3ÊI¤ú¾íônçq½Žêè½E¦†ÙÌ®¢Â|ö®"_^^Àôúþ0ô¿ýr<Ǿï1yÕ—û­5uÇ~»ýtœMÛMwθoc,6pg¸Ý›*7naQñž,ãÖT»6úì–VÖ*²t L4™CîFV.ò‰xJ6˜z‘æÌ“xÖÅ?éd*ÂÛFÙ3÷ƒ"ƒvNh¾;¸ÈK‹:ûË*W`&ÝTÆÉ']GœÉ™¸$w0K,=«8RÁ®ÑbÜúrÚñF mmã]¢–‘É™j3¯ ÆlF5y’ÏŠÆhÙGUûkµT˜Fs¹ïÇÖ[‹äC xH2 @„ܦ›–+û“!’!Z8V6 —kG ¬€¸¸öÝaãLÎ1U•+‰Ÿ¥á>¡UÍ ÒB¤-·ÞäFaÄËx¨ I|Vq©2H‰ÓÃ5'7yÛÄ:‚á kk¡áæÖiIOS{>lrµ,*™s»Ëöz5*g¾¥pYË„|IxÝíy`,ÚEŒû—ãɳ«v ²æïŽ ®jÌàѬ²pw²ðÇ+-ÈÛðŽW·t©âxÎGŒçÌÒ¦þ¹¢ø‰ ñ,cÆ ùcïÆbè¿ÈÊ’ÿý†ÿ§îôš=/Ù·_&K0=9ÿ—?ÿÎxáʧyn ¦ ÿjH—õ޹ÔíÊ0ãƒI·TÝÁ„çuÿA*KªOF%WìTž•sáKü‹|0U=Ÿ¾Ã‚4 Öªc7Ñü‰?$)«Ëºä÷ˆòsÁ<óêÃSéÊÔÊô|¸ ùÙß¶büùšŸàÉž}™Îf ,†‘ßfú= `6¢Ü?ÞU5ý™õ‹þ%²Rýb³Thœü§Xg"!U‚™áAˆ÷­u¦þ8­÷ó8¹;³ˆ 4MUÂûv“.i6}`qþ‰ÃàæF)%ž_4Êîw&îîx{ÓÖT„Tk¯ &!³Ž~%aÐÖäñxœÇck;Lb@ï}k›nOÍnÎD½w@` F‹ª îNÎîÆÂmÛ ›¶æËeÂÌÚt“6¤‡]T›’ÓÖ¨vÂÎÄä8z¸ªÁ*^|%fw‡ã<­ÜîQ÷JgïDÔZsGS>Γˆzwv?Žóv»C©mÍ)Hë2K©‡Tw.XÄ„k—v]^V†ª Å„ ¹¨Ìû¾Ô­Ÿný<·m¿Ýï]Ž¡¬wr|}ýæ”å{¼ßB§s+–¼;6f1;!Îðã8âZ64.ç^€ƒ@ mÛ‚œÃªbÖ˜Í2ËÙÏP AÈ#iÃrëÆ"N°Ó‚ÖrvK­ÂsèˆÆ`VÞXT–NsOË“ŠÌç¶mçÙEƒ4ŒÚ³»8à-¹‰“€þ§ù”RÍ&Þ°@FÄeP,f÷žäž-fçy¸9«nÛÆ"Ê,,o÷îv×{Äb¤šb±|ºe•´R7snM»yï>üƒÊ-9 ìm‹éSÝ÷}Û›ýq=zÑ8Ì‚5DÕ>óBŸd±*s<ÅÜÉüÛ/_›JD@M´mÊ ÇñW4×õ¶ß¢3`S}{œÇü‘&ªÛvÛZ·ÞBÄt0ÑO/_¾~{}=Þ ÞXÎ8™ãFG·#Å”Îc÷¼Üÿ•dS+õ’óëD÷¦ 2QÞó9öæ#.nÕÁY®­ßÕ „,“T8Eì~»}}{ý÷ÿ_çùø×ÿñ/ªêDÊÓz‹@׳°0úèñ kS¸ŸÝ°à™¹Ã5Kûªœi4y0ƒYnÛ¶ßïÌ|>Úš§a×3åTµ™ Qñ˜àb‰m¯íŸÄóµ4¨¶KçíÜç^t1a¶áŒ.¹bØÐ P¾”µr*.« ¢ürmŸQ€² P{Ì&Š3Pª=k Óª‘RÚb\Yx–uiG{<&w1pRÏ2XJwÉBѭݽƒÝ-&8ƒ¥;eƒ±z* ÃÅNñwa^Ôþ ™û¢h•¨nns»‹õP&¿©“k0ú޳#|:DiÞCž¯a&)hvr¯jcöÍ2ËT6É3N’üé ËsõRÔ£PÃ5/Šý…¹SPYv‹¾$zaI7‘(É©Á7†Þ½(N#ͼ.»ãóA‹)æx(Yá·ôçœäyéãìƒ6’Ó™¡[æÛ.9¥bÁq1JUcL_uHa›[Qï¹ø—©0…nâ , >@ÚÞ™þ1|ÛDïÝËT±‘‚Ž•Cl}QÃf8Gdúÿcâ‘UÛ’sÎùòb‹ë¦SÕY(åžKåü¥e‘¾VB¸O••ð°Gñ…ªOK¡ôh E"ù¯5Ø™Zù€±ŽÃ^¾°gsd´¦ÔdÊG…0¯ÙÒssâ¬ÂÕNAY_”ÕÍN´µwur·è¯©l™óÒåV·A<'ÛU˜§¡–ÖÛ_Àc>ÿp¸ã—kÁi4ãN#0fž‹^¥c\ú0A;“ÖMBäkÛxJÕ‹UÞ·8nÅÀ¥„nŽn¡5'9ƒó¶¦ópjí¬Rîéé„»“ø SÐÇH2–êÞÙâ>AàŽIªoĘXŒŽçú(x9à9ç‘Õ ï9žÃŒ'egy³åÙα~"êj5DÌ"öxT­}‚#ܵL¯RY¦ç¼j…*T3Î.Æ8b´èÖxêÕ vmá`ÖOxPZчæ?þ ¦çÂJ×ÝÌÞå,†×n£9°äù‚Ç®üR!1è¨!;ƒ?µV/ܽK÷);?®JíšñùžÇ}Öe¦ùÀiÉwª¤1h¦…Äz­G®{ÌpÂRëñ‰´—.•Ì£‡å Y‰ÿÀÔd\\ólú̵}y›Ë¡]F—¿jTçï Øø\¥Å÷œ°¸˜©ñ4º8iÿ1Gü'ã×ìãO¿ùGêÿ¬þ¯¿Uýÿ#†áÿ]öücÃÿjíÿwØÿù·}%>¿úû2}ç«jÎOº>=% øcÅÈ‚F>¬Öx¦y™ò:¨ûéJÞ'YÊ b糄–þ'*ŸÿpýÏ®ãù'D¬Ó/ <ﻢ``;SšÑ4©©Bv謠C"Ñê)a~Jb­)·Kž’™œ–ÔÂwŽê:¬±Ëë×cqö0®A‚…?÷<Ì~ î}Ìüö`æ¢rúÙ­tœç®mÛZù×àð&8Ñ0×0s µÝݺõÞ"ÂäÓÕD‚Ïøå~ÛÚvô3úQ[k,4б›ÄîõB´K\2mM!ïï ö4ó&zôsÛÚyšjs·÷ÇcW5÷óìF|ÇÛ¾'f)#"7gÁûÛ+ ¿|ù«¹7m[Siºïívq÷G?„yo7¿‘™õÞ9¡¨««°ɶiï>P0ìmÛYÎSaý8Obi­‰¶°¿Ü];) 5&ƒç"RÄÜ{·³wv#3 ¥é4mû~+Ï3‹¨÷Îîý<ÍÌ­³¨·ð1m츅i @ÌðRÑ1gUsïçÉ ßTUáf£îÝÜŒE4’Ì¢JŒîFîÅUë© s*þl$²:Ôý8ÏÃ\!ѦÙù8‹ªêí¶«j7|ÛtÛZ72jˆDâçíþå~ïvºÁ=pç»·¶3“ÝüýýÍÜŽó  ÞQˆº IDATµ=o!/ÂDçi‹ÅÁ·¸Q¨6U><ÁL7ëfHìýd ™Ùkïœ=Q¼ ²³âX¥¾L ,ÄÝœˆþò—¿”=Ÿ5a²¢›Q«ÚS|ùåETcÒã®ÇãÁÌÛ&½÷à·Ô<à2œ éaõñ‚²²ÚÚðÚ ! 0"„Æ¥ªNVÖJw÷nF’(ï‚»=HXYYE£¨·Iq‡07‰»¶mKõJØ¢_UÉȦÂD}‘(RRD7QœgïqÛ³nÄ´o½Ç#h`½w&Ú[ËÉ1káC¦=3n_1ÔbáãxÄMlß6Ö¦mk­µ~v:Ïãè­(Ðwë~à$L݉IZc¡­µÆâðÓ;s ¹È¬¨ÁÑ’@lîsIœÄ`È$,ÈÜEÔ»D۾ﭵ&BÜaÌÜC˜UÃÏ?ÿôÓÛûû·o¯oo~öÖôËO/ª-üîèÝTªã´Þ÷Ûm;ïï¯Ù÷mèu™Q‰›¼¹gcO=%nYµ¬û,–e.s4G“p°p³ál2 ¦Q”¢:õ^OK$] vkˆ½'sô/ûíÞ¶ÿü{}ûr»Ë,)ÐÁ&17Òj×&‚ÂϤTÔAmkDpX·³wu¸„ÙœÀg·Þûiç¦ÛmßÚ~kMÌàp{DdÞÍ(ÒgA#‰%‚h›"±ÓÕ@¸ãj¤ºøÁ `}Q™†ø†‰¬‰c^úþbræ¤qú­‡ñéj5Ÿè‘AÝ \ȇÀÅ“ÍYTÀ‹LÉUð;^6R‹æj3^¼{L«©!®ùÃe˜í¥ô‘ÑâT{Ýl§–ežQ:ã0  ¶â‰œ—±ÙÇZu8¼S\^Ó•¬@– Q‘ä°,žäïO\_Áàņ?ôç”ýrBƒˆÍ‘äc%{3()>LœÔ—Ñ"‡ Ãœa(õƒØSÓIÕ« :‡—0ožú¨Ž¥¼OÔì À;AÿÈPŒzÝUÔOT6f¶ãÒ¸ ÇlCTÝ]Âà(áÒ4ƒEÂhðÉÌ|1žV=p,Í“X…K6ûb¤ä9µµ)³.n‘<ñ¸¼Ø%Šú¸ªK e‘o’×ñ¤›ó[— M G #t&ޱ:[½Æ=Kà àT9böZã*¦H2–ÐaÄ)§Â„UTŒc]•?£Ùra¹Ïks­$NUI>Ð<ÌEStŸ@úõ&zê‘\äïùsjµ|Y„³ÆKÐ(‘¦Ý‡y + ¢™äÃÎ颟M+ÃÖ%ë»a^(±c 5wˆ—. L0ÎèE½rË ùZ½wí½8]«¾ˆ×síf¨Ÿ¯ÅÁkg ógº­žcÌ¿œ(ä%» ·šÓsúåÍ \ý †Ý—Gk6$§ƒ£m=B6<¹CT-¼ ±Š¾ƒUm9»Å;XØ@æó2ÆýŽç0]®šÌiêÃé—÷>Æ¥šµâmXXLÏæðòûZsŒ<0q³öJa­5¨ù ¦‰ÿâVd&<{Œ—ÑxBèJ°³ïðM>(„ü¤¨cv—ÓÓ¥¥xBl0GdëŸÒ  üÏÏ26fóÀ«ãsxìœêâÕÀbmÚ²_Û½ÀÕè·àé¹/0/檨ÇsYMzm糆ÙÛ½ Ç\i=¥Ó|ð]î ¦ì„_Ñg¯‹'JÔ,ˆæk…];šMíýòäyõl†ÿ^Yâ$¿Ntð'¨ÍÕæ_Aúð¯þÖçÉãw.7¯È×þ_gÿÇ϶ÿöþäŸ?±†?IûWS¿ð%£ÃcH¿šþŸ ÏWù¥þDžï‹¼†¥ž‡_¦aO¢FÓa˜¹"Œžf_<ï 3KºÄ ˜ç«¿Ppb™$ñÔÈS\ev@…»J*k®ÉÏø>¬õ$naÿ炊^“rƒÚO—z Ï+ÌñaíZò¾$:hBf/ —G" –?\—|]ëþh °›U¨Û pDUcp·ó31 ï­…®ÙC¿Kõ¿ŸÞÝqo*i(:$¡Àq<޳Kšô-»fÝS»T•ï¼xÏ/‘»[Þº»ŠZ´x‰´ ÌÛã³gµõÓ¼»“žzžgè^Í·D µîªJÎÞMvQ‘¶µpwܶ]Eé ï ådJYuw rƒ¨0©êFlš2%¢ò³Ü°4v€=B÷pxÔdS3Ë…ì& ³BN®e 3q{Ñ}Û»Û`4™mpïn8Ï X¨hç.Mn:Ma2 º°Ê…ÈÝìõíëÛ¿?n_¾|1sf²8ÂÞá¤,hʉp¹Ÿýi*$z ë:˜Žót¯ß£ÌAn Pwô! €È‹Š{äÓÙcÜ÷ÛÖš¹w¶]˜î/_š4:½;³:ÜzðPݾìn"IðŒ®**jÅš?ŽÓ¼3sï§»½nh»£µVÎ_;ïMÅÌhäÃÁp7·n&H Ôë{ïaÿÏKÔq>":Ïm îçyÎîD÷]›2omÛöÝȽ˜Å¡iF¼€Fõ ¨ªèXxÛ¶ÖZ杻øñx>mÒ”™Éˆª Â.‡OŠrc þqïæpdh+f1žÓÚ Dõ$àÝzk„E¶M4<ãÄ*[k­µè`âh öl‘.*+„óìg‘M¸m/…°‘ðJ•¾,r\°ÞPL@佇,"Ý’–@Çñ°n`²nîµÝ,œUDÔ½ÑÙ- [‰Ú¾Å8"Î.ˆœœ”÷$aÙ[ƒ…[=-UBˆû¾‰ªÂìí<@ôå~WmÌÔÚ¦"g?J5ãx©Lq}…AZÀ…Î[6æóìÙÌ©N.ä¾ÎmÛÍNÖí0»™½ì·n憷÷÷×÷÷_¾~íç¹é¶oû.Û¾ïënvˆ{7½›õmºµ÷¯òsß·—ý¾o;1ÁÓpíÛF€¨è½;,p:\Q!«ÈNuNÐÐÄÆVNTÜ]”@(+1sÜ͵)@ãNèî­‰¨ˆEŸž¯Â”^î÷£Ÿýç“k¨ôÈ fÍàK¨‚f!N;­Dˆçg ò¸'D°5Ç™¨Z”J}ÄM1?Br묬¸|¾¤mVŸf< @‹ròÑ›µîˆ€¥~<жëè,£©x´VSÈ:°ãé×D£œ—e”P>Ú6²þú²'©ÿ:¥¹×ÞT8ÛË1.+wÍ¢èÒh/XTu~:z—9O4<,•jßKl@§¡ V\ïXR¨âæSÏZºwI. ïë‘›ÞÜ%N¿n-ŸõäsÏ??É|ɾ*ï9©ç#-·‘ŠU°/vëL÷T/% Fø2Š–M4eUÃrØ—ždZmãsp:ÀšX0;î`•jÙ¾†Ý/Í¥ÀeüÞ¹1ÑuÔÁ+¹„ í/“*ªì€žU¿g&Š˜#Õ#›IšƒùÌ™ð‚¨gZ‰A‹E~ä1cÒ<', 1a¬€8æ× ÝÕûNKô%ïúø³¼Œ!¯ òÙUÇMÂ1ógÊÖ©ÔHÀ•@áXáñ˜ƒºŠc€ŸŠ€/šþe¡0¯ÞJð\À?97S3äjg \WÃ>_ jÁõîK㥻{ºØ†õ"¼NC{9cŸOK<Ýø2¯› 6²éæªÁñ2»Ã›_­ÂkõG\±#ÏÁ´¢|xuÿÏ~ zæÑÇzeÂgìŸë¼5 !¹4 ‘­Éqº› ã³ê]‹‘9p"q¦NɧDµwÁ=Ä¥Mîoo¦BD·½…re°Þ;à*bPáîÄÇ#ÎCÀ›jÓ'›ÃB@ܶMD~þéç8IÞïïïï_¿~=¶í?ËO­µŠ9ú}{ý&ªÌÒšÆö:SÛîvÁvKÆ,)Qý4³ó)9TŒyI´ÁÓòyqG;ª·¶,¨€#Ü@L<»sæ.$L‘X4ÊpEH ©A¤´_@25 ªä”dGÀŸgK{<$dñN ]ªp9ÄôXÛä‚2AR :K'ÂhÐڦĂáÐ9yÀñÌÌÌ[S™xž‚/xZ"‰Ò¢Ò潨¬ÍY†Ë…ú§@€ûäeÐìÏtJC¨§fÀS¨àIݧk…i$–ìî¬P¸:A°J7œ¼&.nð«aÕ½Z£(¥äÿÀ ž½Æ«¥7ÐRÃå½B“Ò&Z«J.!àÌóÌÏ&‰«¡Én“x‚t‡ K?E¡Ú2¼XTÿ¨Ä.°dnJ†'yÔ0 É©>™¹cÎâxC…è‰/W"ÍÆ„@õG'z¡üydX€g×y8Cq¯ß½¡+ˆxi º”NÁcöV¿Èò™Y__ÏÖøí¹™ÑŠÕ¹»Lょ—+Z„Ýå”L'{! ñLË™jÖøžÑF×ηù=3m.Qƒ’ŽfY%æÑÍ+ËŽk))°ó@ùúúócÂaÌkªÎ8ww7f±gÚ%E‚Ù€1Jbä’`©-ðÒJæO¨cÃÉ«ï–_åB,ðù¬ǺEd¾„ÊÒüÿÙ)Î×÷UŠü(–ÅjücZ&˜åf¯*©©"ò¥h4þ.תÀ܈¯[éÊxLÕwmuýØwºØ­—’˜z¦)rKF`—9xM]ðo´V¡ºò…,]³> ^&ÓŸ'g:Öæ¾ÄŒ®eÌdRÜxÕí1µÃæŠØaò8—¯|õþcfÉŠ­°ÈIù~Ìöëˆå AÁ¥«zyä^‚4îZ þs)€À|‚?³l/&ÑEág^xM뉜!KÂn-¹_`:ó›ó£ñ g—1fŒŸBùC®l|÷®‡‹ Y}õB`¾@¹¦"À õgu]gŸ –š?Õ„kKÏ‚=ׯ¸jKE4Ñ+±;ó“pï¸ÔéwIùOò»ðç‚ü¥I„? ༾Æ~ÿYšó÷Õÿ߬É?»¦/‡ÏÞÿ“sûÇ£‹'è?þÊøŸCtÿ'™ðŸö]LJTøc6å¹%àÉÛ ^)™—<ÁúŸÆ-mv ŒÎ’%#ÎÖÜ•Û7ïïò¼(œkŽçÂXTT 9jÅ~-¶]«zãÏ×X¹æz¯V}¬c¤žz]üIåm?€™dzÛd5ǘ½„þ ÿ'~)œ9‘$À1PaYR ƒÄÑÉOqš*x¢|CX*‚ FÄ3“Æë ßIÈ|Ó:Âû‡P^M4"¯Ì*±’;=ª©•³3 æÞÂãq<Žã~»µ¦¬âæÇy>8(g H™±oi( FèV„1…¿ødÚB’ችœ…Ã+ýŒèø N…ˆ6U±“M¼µH{RÛwé&’ͱ’¦*Í‘E¹ÂìL_ÿó?îÿ׿mmcPƒ™ ¢êlñ«Y;uÂS1˜ @ÂÎe€+Œ¥Öì/g³›Ç©àen*0ÃT„I„sû‰Ðž`lHO71³1úiæ¾o[kí&@­e—L”ò +0ö€Újâ&ù”²(Ñ­¹ ,FÎ\DÀÁÀ&f7‹6éÐÔ\YrÝ„¥Õ1Z»•©˜P¾ýP\;²kÆŸVYtÈc:+“²Ž˜(s‘HóYtZo¡X?cO-ÜHç&™î¬Lkýä¤k$åÂh³š½r#bU޹q/Á¶Ža"†¦A¤p M \»ý‚òøâˆ}¥;aªY>gµDg#fkAê©kó0T^w3ÍŽ¼N ,cQÿG¸˜”˜±tÓŠÁ§Ž9êÎ1$NÉó%•©˜±ÅSaÏÙ„— 3ñÄ‚s CXG«ç" m¯:ÍņN>Z!û^Ã)Ë9Ù!ÊóÄY"|Ã5ñ¬FTN·LÒ:1Æáö'¼FYé“;q`×k U->3†ÙD"Çð¹,&4R#î¢R g9vóºÇ >w.àÉJœzÇçË9ŽÏììÝk®™¹LŒà÷XáÈZYóûCÀ*{¥DÓo€Õ(ÏW¥›gÔ&‡@Á |b‚ì~@žåAÄ"^-§4V8K­ŒB´ÄâÕžohúX)v‰¯ž[¬<úá*¦åÛïÑG—ˆ-W¡ª¤¢µÁM‡ÂH ?­ÍbEQçV"Oº¯¨ÝÚ²®È˜§ÞI|ªß]6Ü3´…Ëø`°xhªÄƒ=Æ—ÆuðhKZÑ•rHü;0ý0äÉp¬/” “œË*3mTMíW.ÊùЊ´Yü4œÏ³@£ÈNTÁª)dòê›JG"¹˜qUOcuÉ‹<Í™vâqÒA®/\ô…&ëÙ*Çž@ögаaæ…Ë6NìæÁ)‘¾u¯ún.2p¡9ùh`ĨiY•{š° NÜOÃ÷r•N·1.ÆQ¬ú9®òàüCTÔ)/¡‰·[8˜+K ñb<Ÿ9ìãñ¼J:ÌXÍfà‰w¸¸f1>)¾ò’GCñlÜú?+]r“—C<*”Ö!Å“œú™ÆËW{gM=âìâž³0¢'ÂÇÓ|™}Ö0†Ù˜„µ/Ëœ×z%5°„KŸEè’fEÕ“ ×)}džü ùŸ”N£¬Â×xž+rùzꬿù×UÜߤþã7¨ÏxJÐ;ø5õŸ~(ê}2jøUûÿgÚó?£ýÿÿ£î]š#I’$MaUsù¨ÞCÓæÿÿ±½ìc†¦§+3wS‘=ˆèȨÌìšš$ê¦ÊÈàp7SSeaþøŸnø€?; ÀŠÿW½°—OŸ2Bø<$Àª÷ƒ¼ù½ÑÛ{0-w¾½à•9™í¾þT”¾ ß±õákÖ…—i=ù:œ:æÁE”®¯!SwÍ#­ÚS@˜AfÉÜ|ªñxz£W2kõaÿk<)öÃÝÆ9zŸ”ùjc'ÌNÜOucè;H‡à3§ê×ÉÛe²þiÁÊïm;kãú7Ÿfôóëk)ÅÜÔìÛÇ=ö>ñ‘Eß«ŒƒªYHØÚ{×ÇyöÞý8ÒL¨Å‡û8 Ó^ŽZJñ‘¨ (¿…‡Ú¼õVD`¤ê~óƒŽa‡HÌ:ÞÝØ‹‹sÑ©«zo/Ç)jÚ¬µ³÷®ÂÅÙˆHB ·ÖBi0µòRþé§oïïQë‚¶û·÷Ÿ"â(Œ5{½//·××—ÖõñxÈ!ll¤///Yö¨ýmÞMj×x‹Ø]{‡‡!Ú=‡+jL`%w;[—"Ç­8ÂAhQ½èŽ8‹\ƒAx§èàmÚµˆæ¨…Ì­M»w©UEx ƒï÷{o-:6_ß~ºÕÚÍ£iU¤0#jHE˜Q­DÝnˆÊRÖhôcó]{ì)æ]S-ßWd (þ ®&¡¨)æô“s‚b•Q³3wS36fv…qŽfê`cAŽ‹a¾“¥Ö#Nƒ"ÅT»À,RJ© j­µÖBò¹7éªMÛýþè7„”+ÄãœʈÙûã¼’|ÉÍ\DÈ’U泩ˆƒæ$™@,qÏ!y_D$©0ŠDÅøËËÍÍÏ®®¦n ‹‘õ³Ç/_¯ÚÚ©z}}-Gýéí@W—ZFÅ¢‰ÈÛíGèwùv<êqSííÑÓÀÂÚÚƒÌj>3ë®UJè&­Ÿf©)©Zòðú­“Qòú§Æɘ°Dàމ訷»Þ#y¢NÐvÈ- 'ÄÝz­ Û#tF}?Os-U{—¼0QÑîäÝÔt4Ò'"ƒâ¦­EÓ„š5¡ îi>7r¯µª™umh„ÀlbÐ{ùߢ$ø ä(¶JÆzT;¹Ú:¦‡‚f~A€}¨_ù Ypdß`5f ŇÉÉÉA–YpÜáS­›grŸm!±ÎŽšE^’"Ü !—e­±_˜’ó— ‚DÞ#?‘ f§-®œ‹ ~ø¼Ñöë«T6ò‚dcRf)ò$D33p6«™›eIl”|2sÂGs\¶¤Ò ½OãÞ»'Žú‡A‹ :a{ßÞOS?\è¹!¾3–´M“°•ÕÈ—yÀ„f¯ »v€î×¾¢Jøš$øn–ÇEW[ÊóÖ/è +~šgÇÁÙù$¿Ü÷ò…¡{æeá[ègglí,ó3pþ‰Ù¹Rfb[®GºÃ&D%ÓWÓR¸5’ú&ùo¢óV`‘ê&œwRYŠòæ”vË`ݬû…o"¹oŽE,åU¹¶ `Ç/«þx Åè)˔֓á’@ì'üZ|òµ ˆO¦ýMšß¿þÙÅ~ÕfñÄMñ *~»ë°Za}ë*Zòû“zYúÝŸË>_ˆ±ß«ÚÜôøY¿ü¤I^Üö’ï(Ù¾kЫ3i}†—8.Y•Ï:÷…ü³btO •Ÿp0[†p$D2¬Hùp'Ð>¬s ×Ã…ùDÏÿçWOÿÂ9mY’Ë“æ+ñùÓ¯ð¬”ù×®ók9ñS#ïõ¯lZ©¡?+¥”áþ¯ü˜®ÿù¿útdÿZˆvÿŽoÿË&ü Oû?“ÿ¿˜þúË×¾ûG—Ï_Þ-ø‚FO+Ë>3À–3zª4gÚ:›–ßg/Hƒ_7ª×Ùên4Ãg¿ùå2ÎÃ×åÐÂò˜t@lAl€ÁÛÜÄNÉ ¦t”_™“6ŸÜü4ö¥`Žö極)ÿLdšJót78­k²2 4ŸjƒyIu柗'I~ xNyày¾NÎWÊ}ðçi&©€™ 3+róïªÌ¬êªö8OÇqÄ» ÄÄ›¼½¼Ñûý#àȇÔü¬…<ðáK¹[B½‰ˆèHñ.0ÛdªZÈ‹”©rÎç!/ôþñÞU½¹ùýñ0saaNùÌ\àD(òÞ»öRÊÛÛëã<ÍL„ϳuµŸùÛy6U%F=ŽÖÕÌK­Ndn§iU¾ßïï÷Û­0DЬg<’MÉÈ¢GÒ\XD0ò,ÄDÎì W_ĬßêÍÉ’ D¹@ïíì]/ÞͨµVD÷+4a vžgk½±5ðµàl­Gë/д}||»?NW»ÔzÇqU¤0P¤ôÞÛÙ¼VŽÈ¬”bÉ0¢ÐŒ‡ã)rªsW}œ­=N)%³×··"|»03åf-eµÎ`& *#çIá7eÔZÏ–Ñá¦í½µvº{­5Ò÷"’ÕÓC§áõlçdƒÄöq63êZÜ<̦æ áB%®¢ZŠºu¶û9ïÌ(¥fì}\lóœUÝd!(ÅUÕ÷÷GŒxÔŽr9$M TfFk±¤ ˜©CÌ”ýÍžÃ¶Ô †ù6ufr/@WÝ6Çã8Ž˜ÇAäµÖ¸Tzïjêæa'ÌÃmÀ78z;¦a²ÎÌ„;•£Š3l´šåIyâ‡çq€y’^=+Í ”­Ø3|æ$X¿?`~ˆf²ªö.R#« ´eãï¾K50³,ÌöˆþÏCuŽ÷PUãºb¢C¤ŠpèÚÎóTÕZ˜™¡£ó8ÈÀ,§tAu8E("D=€™!§\è=:ls`ê±.9A&R‚,07u7ëÖG;µ REÊ!Þü¦­©½½¼·£–êæ,,3å êÝ ØA©I»»»j7w3G-///Vô<$¢ç=Jân"ê­!KGg÷äL¨§3:?)›9z8<þL¬Þ£pÐÝ›iW̉:ù¯Çqy<ÚÙŽ—×Ûëí ·Þ´±—l¢åºÚÈÜ@<è#¬ÓzKàIÓ™•ùŒts ½€£}vð7„#€@Y…È;y~¨ìjJäœækÊvÖIc 5_ÊŽ …‰‚c–€„Ôìò„SŠÄ8j*n³·hu &¨„° ¯àq§m®ƒ“Û2áïé8°Îÿ(‹‰²ÒIb¶!‡¬Q®dXÜ¢¸ù‡o–J€8̼w1|ºì#É+€qNõi©ƒÃ]ÒŸJ' 6ÂIŒ£ç42´T©éÓš9•[¿Ú’afäAV3V¨z&!xŒ™R°bâtì»éÒdÇ1\ý,ذ8[È~úm5Ì×/ö¯6‡&CÖ„¯Ál]Š Š… N:€ïûØÔ\ È€|U ¦ 0I~eÏhÈ4fÂ"+±ŽáîÓ“Q²œ;…g0®»YÑœ6×,€&âÔÍ„Dco b²Ë3˺ Î'í<%²¡óe6'pDd07‹DŽ] {îAÅa‘R‚BЏ–:é ´mä¦knîF62öø.gU$_lŠJ‘°,Ïnàq@,…Ãscî{1. ¼Ãl Þy7ãÚYVìœö1õÛú°m9âÿÙȯ<çl¬ÙÕ :­lÁjrΈu”Ý,ä¾xwϧ_Ÿ~v²p@“™?“³¶JÍÝžðôÕx¼Z(1 EÜMö-D²Éˤi$æï7w´°`s¢0Þ#âYK»å†’¼Ù®}E§äâN—ÐÓ4ì_5~øNNYQ±ù†ˆ9 Çw=ß'’û–ŠðÙ9˜¡ªsäA뿼ã}Ú*ÉŽ›Ì‚‹kÒ'?¹ýi/.ƒ”gÈͳ‡{:¥üYKÂ'ó±ï´¯µïŒž è³àä ópñk^ÌßOC2ß'×øÅ4§Òå‚ÜTö¹šïO÷º±†:ޝºh¯C‹5_›‰üüý9—±óüy_ÓgršÉ”lîfi6a pmº÷“±§>¥|íûi_Ëükù›#bälþ¥æiÙÀçJ€¯TÙ§ø_c¹àkÿUøG¿èÊž[}ñçóþ×)6]j÷«úŸ`ÿÿß’þÿà?¾5å^úä·ª_|/¶±±Û°ëý0Ðu¹uzÆõäb4.î?ywŽš¿Ö¹ kqÍõ |_žXh~\\— $æN= bG`FŒìVâ‘ôK^¯~v ¿Í=Î|’Ó´½äyØ—™™]ÈU^Ç#Œéâ¸wÿ2®9[‡Ö†ôS#Õ.šŒkK†9]ž¼û¯–Ã>-žø{ÿsÐ{o}xnGGn<‘ZïæzHefu½ßOwˆºµÖÂh<«8gº[ïªEDD÷)@Ð6jn %"aˆHo ਥp³©ÎhWxÉsjæäM[ØŠ.7¾çùq´®µT‘R%sü,lùD5 Z‹ƒ·[%u,L‚¿ýí_~ùõo¿ýþ»ºa€{ÿû¿ÿöï÷v¾ß€Ý[c–ßþþÛù/ÿg·Öô„‘ªž­QôNæI™4PÒ‡ƒýÌF°n|Ô_ù¹“j÷8Ä.Ü̵u .„™YT+s܆äÔRÜ”¥"/,¥¹qô­·ÖK!RVíî^¤üôó¯//½÷Î sk½ù!æuÐ[ÌÁœƒÛœþbuˆÌnˆY‰Á"ý<­µ` ÔúËOof*$Äâô0óZ ·¦bá®õIšp7³ÇyÕÖõl=» œº*Z7³Ø ´G·j»ß—[$™ó6ÙÍК¹Ý™HjÉãkV•2ýú·9Ž£›ž÷ÇûýÝÕ›özn–]LÛ)ÎÌT%‡“?p½j B)Ó•™9ðû·ßK) –ÂpñØÊƽd W"…1ƒ4vi;ý€)¸ÛüaPJQUájêÖ-µ§³îî݉¨Ö*\T-HÄæ&aÙ¿ôLÂÜ¥”¨d°œ¢Ñ8Þ»©kØ+ƒYo6«LK‘¨av< eg4kj”•Ùàj†æÊ‡H9œ{Ä8Þ·Þ{)4øÐ¡èA¸¨êQ)g´ÖzïN~¶“‰Zï½wÕÞ»Æïøûûýqö!X»©ik­«Ç§Ó…ÀHä½›» iÇlŒugp-ÂÌgk½·è,)! ‡ÂŒF¬ä°h>p#•RÜM5% 0„oõPSUsòHíD‰º•ã(nÄ~µ–âqñbQºØ>>îÁRU!˜[.•ÁrZíðÖPKµ4<‚ˆŠT£4Š/7Â!â€ÆjçHÃ*ÜÍ:!„-d!™w×®@3ý¯ÿ¦çãQ¤”#ð;þxœ]ÁÄäv«E­5Ug¸"apØÂT“Õ(qd–®=àlž qÌNú yw/1§8™Äé‚€Î613Õ×ã<•;PX“98ý¼a‹;>æÄ†ˆˆÏê…à²ãtåf žÀe›Up` .ÅMƒÙ ›hFb¦ðŒm½¬0el[ï>ânš ¸´ »»·$‡À8b “–èˆA^°Û‰†œ1Ì,–`.—R,ÇØ›%lsŒúŠ»æ8Û_XFûѼí[|• K¬ˆ‰\”2owóýl¸-Oœ½tT´Š„`3E²í×ÂŽÏ ` Àœâô ìö™¡¾o;ä‘×ÊèžÎÒšUÄâ4l³+îO‹i´Ä¢\½WêõSš?8‹±_7Ù1 ró®šežñnn©áPYv|Ëòñð:¹GpT _ú*§í7Æ QÌ»|OËLlg¶:4suSÓ ûEïðÖé,ÂsZÌ)÷ÁÉÏ”+3#FYB=ça6îË8Q˜or‰YQ,Rz¾ý3»B¦Ó|”ߨ(Ô‰„6A16Ù'Ž'ŒÆì· Ÿ³ˆ©PÅk˜;,UO2âÅž²£eýŽÞnϘ¸e`b„ŸpÕ—‘Ÿv}~cæ& ³`t×ñíÝj ¦´¾¹­cÆž#€/âøXxbgEÆ2‡ÇÀwªØ³5'ßüœÎœ6jl ˜ w%3¬‚L~`sIû6@Û žþ°øÛm׸hùôW»à”Vv¹xÆ`hr¬FèµØÆ.¾SÝgSÀRÿ}Å<é9Þ³Œñ[nSAÒ…ú¤uø†‘º¨ÿv ®|…ßðmu €-Ú>õ­â+ÊʤôÔöûT-mÌ´ÛÞ¯œ—É:]‹K$çéW0þ¸†æÀWaѓތìù™Û‰ÏÖðØaNý¸°ÿi+T¸ŠÈO ¾¾æÿ›HvñÌîÁÇÏÞrà*÷ÓçSÿžð;6dŒORÛ¾¸=±ý9ïÿÒýU¶Ä¿š €ž‚6ûwXã'ÿÁÏõï`‚üÙîTýß?ü9}ú‚Zþ—´{ÿçÊ"௿ußýR\ö;×lÖWðŸëm€¯r5ĉçTö€’_û>5J_È•c;ßÍ—òßowº6ýzd”±‚k¡Ú/ï Š8ìÐl3‘mAÆõ±0Òud:Kæ6£®a+ÇYŸ²fódš°Šý©±hŠXÿêa³ÆBZæ–/BÉe>îļŸÄ2`„és„€®&l ÀØ&2ÕóƒÀGëý<íADRD¬B-‚*Ì/Çí<Ïßß?³à¶Å£ä%qíf¥HaŠ@5WáÊ¢ØÙz ™XêѸ;¯“9D„ëÏÖççÀàÝ»»õîN­kï]DJ8=óÄ”§°PÕŒ®dDRËËÛ‹G±œ›»‹ Tùùç[9ÄTC\6ï÷÷¿ÿýß~ÿøí8ÂT[˜ñúvû¸?~z{í½3‘f…Õ:¹I·¥¦ –3ÃÝæš2$e…ò¯¿þZŽ[»ŸNJd—træZ `°0³Yw£°£saa" °uÖRyëîj T©DAÓöZvsU‹íwÓÇ©fJ>>ÞUûqÜXÞÜíñx„à^kó^ðvÂrcDÔãû€Á¯¯‡Õ—ó|€È\ß¿}û¿>Þr»½Ü~z{ûûo¿­ýüÓO•ÊÇãî¦Ìòq¿›™BûPïÏÖ¾}û™ƒäÐZÓãaºµ¢jÖÍœ? 8•z“™fÅœ0³¤0=¼ÌªI0¤Ñ—(¨H ½‰nì–ë1г› søÅC?¬"½w3å„Ѱ*µÇ‹p¹<>îïñ’âiõ/¿þíýããl­u}©7…ZWf1X‘£ˆ„6ØTÝíìݪ0CF»tHµ›I||cHæfK‹hï1ŠWsÔóí V#"2ubïÚˆÈÔxôS»(EܬÔRJ‘’ó·ûûK=j)ÇQŽ£¶Ýg­ÇQj ½bÿO¤˜èStXÇ¢Ï\ËÑ[Y€P çÊo.3ƒçÓtUÚw,IðÀuŒ¥¦‰=û3œvy7üþ¤B÷H) ü9Æ– \dVÍÆôâ.Ý¡{ Ç컇 vGæÆNt”¿9FƒpÄ E®N»>9%ŒÐÆÈ=£}¿ËÆPÒžhò J_ÆêM´¬†ñÁ_ÏÖ¨œòì1vçÁXìçc¬T «ti©vΉÉO5uiˆ+KA2Œ˜<ùă]?p Éä ‡šRí&"f'’±‡¡DäS6MC±³þ}´f¾ùÖí F«¾5H“{1»#»KNÌQÎ0n®RÜ…¡NRÆ&4‡ÝL •<ÞKGð SWpºL$ †×üØèû§ˆÕƒ5½‚;V9_™ {$™óJ)$rš(3š\6+“çÌ$c$ÄL’ÕD³ÔÁçÆ(¶ ó µÑBˆŒ"?þ9›ŸTý‹˜éOâü¼ ·†ðåmŸgÀô¼›Ä¥ð8[ÐÚ!\þ x¦¢½£Ã·I§¸_º¤geÂï&\ñÕûá Û?Ë;ޟᢣÐ'ÝéBÑñaâŸÎ~Ì$bN—|/ß]ó‡!Šeý.‰# t6žÃÔŸ}-is˾oÐÖ¼ E>£fÏÙÏ–;Á5°‹\óôOèÿ‘¨[±û8.OÛž í— /ØŽgŒ ¾{€d²6¿‘ßqm ä ëjUۭמY»¡/øŒ7åÊèkb§[_qŽ„á¯îÚxí“g?&G˜}3Xoã`fÏ·åhd9"´‹‹CÓ…-;õôÊ;Ùˆ9Æ€`8Ç£‹°ÃS|‰„X!óëÚ»ž‹›ª˜á `šÏù‰ÛɽÌüAQeç£Ecƒv¹Ð§v¾yç´uéǸpŠÇŒd3FŒгé}êl<~ì(ñyûŒÌߦƒùF€÷‰˜Ã,êÞvP´7L¬DÃ>·ØöLKß¾†Sö¬„Óö¸²þ/(h¿æ bï¶}G¢Ý"i¹M£_ëÎ6íúÂm6 Õ˜œÉ6Ƭ–~öÇ«ÁõaäWŸÿuÚÿ’æ²6~VõÖ%ú=¥j(€vÔ.e _´)ડ¢á;ôý» €§>„dÙ§g˜ÈLà àþÝ1‡ÿ¡TÅÖÞý+‹_LþªýÿŸHüÿ‹²*¾Ìù<]tŸLúû Ï ¡Ïж­Ocýio ™mû4à+"piªÑÕÜÁ—»zw¦ãSÛAþl#Y›ÀëÀÃi²fòý|rLJÉüžÙA:Ÿ›æ$[0Ž»v©ŒO°bTcÉ/oæ\}+™ŸÅz4‹ hòš˜|Z–ÞÅLᮞóhã2ñþXôOOM¿6"̇;žÚ¶þl4éy`Ú‰<@ {¡YØŽˆÜEp«Â|œí|<nAa"?Ïfªg)|“™P‚B3àGa¦ÖÎ~Þg-rÔ#Z4£·D˜ÐgˆH~5m¡ŠâNf~¶ÆÌ¥”Ab ßF”7r¢v_Rå$bæÞ{ôèþßÿÏÿ{”ʵîNôÓëÛß~ý•œšõRÊÙ{o=Je_ßÞ€hñ52¢GkÑ)JDάî©ê+K›â$‚!ÊW•ˆn·ÛyžÚϘ(Aø$zóí¨ jÚãÔëD‚t1Z².HâÔ*ÌÎæ~9Bt#²Âˆ[¦w“*U˜œb¦NÔ»šêýq<Ο!·›)ÐZ3rOÂ8‰p)¥ƒÄŒ´µÖúqBäÀ!BExT…÷Öþû¿ýhnøå×_îÇãßja9^n…¥ë™½¾ä ©\â2V³ó<ßßß»†r*ñùÇ¡¦œgÞükÇí`"/¥0ÐzO<ÔÅe„e¥âC¶!âôGó"%ÃDÔM÷¿y²eF¢Wb÷™˜x ¶¹{)Å·~ˆ(„˜ -{ØÚÜ][‡dÉŸ›é8¶?!cF°àcñ‹÷ˆw`Š bžå{晜—°Ç©œ™ Æ&¥¨ÙI‘¡’™j0î­ “kw.pw.¥ˆˆ¸4nê®1*̦•,Ð|‰@Ý Íb†tÔ*"Ú:;·È1¤ ›ºö°¥ —¦=îˆÖzÐB¹-•͈K)G©àZä<Ïx㣿ä¨õM?ìã÷o½³ãvTçH‰€ãþUÓf]XÈLImà>´÷SÕ#À¸f<.ü›ž86/ KÁ/ªÚ n&Rj©Ñ-Ân(¥¶Þ»öÞzpºÕ]¤.TbŸh"3E-(õ¨€!dílFDqáO9¹d“kÀ£&C9á=ªXq$cf’ b’¼ Éð¼SŒ²‚ü¬‰!:oîþMUtP×®]k-‘ÉJ˜¼ShãËE ¸¤jD¦­÷7ú⣈ÅUmø!]Xæ×çëÁ#Û2=D“í:“ëQ<±ß«B€×È´YÚ·ª7lúÁx»²T»FAPÊÁ6ÔPÔÁ¬“u,x<]ç«[1þ%Bãa=j–§4>Ü›ô¿K6Ø ¾úûéËWê}1ŸçšŽ¡|×LÁ£j6Œ7+ÛGÈ9æ4Þ™Ù‰ìOøéL&-­t¹ ÝmR+’k'øé™ÍFú©-Q˜bZ1tKOϨBÚiÆ*ÀT~wÕpØŸiÔïΓ˜_F n±¥Qˆ¾2Æ?õ ?±¯£øWâ4è;þÿ?»÷?ô׿‡sò¯ïHÂþ‡Äþ?¢Kû?Ôëÿ :øã^¿<$øÓ?ú½úÿX÷/=+ãtÙ*¾ô~ã¹û÷ë࣫ä:gûÔÒql~ú}xÔz-¼í¨|¯¥`¶~0= n#ã¶ôëÁµðyùÇý£wåÀîÅqщYH„ˆÄœ…E°þ@[£³w%*"ÿí¿þ·®ý¸ÝÀ|¼üÔº¿L–ôi7HNB QD$Ü·<JfnoåõìgЉ…+‘÷f¡.x:šÓ‰ÃŒZø÷ÇÙ㔣wU×÷æ‰Mà¢é­õ“J­QzL2¹ö€3à8nÿú¯ÿU½¯/¯/ÇËÇÇ7ÎöP372²Z^Œô¼?bÜxš—RÈÔœÁò˯¿šªª–RÞÜY$ ¸H¤õÍL¤X½«ª2GÒ†|?€8”J‚‡éäªJæ÷®çyÂk¹G­Å­ŸkWU0Ï"y<Žë$¥üé»G6‚©™¹ KºGU5÷, ]gS˜»ö¾;÷co¥Óä%¿lÁ¬ü6fÈ­í-е-ƒHH”rÄ×¼½¾ªéÇÇãÛÇ=L|"Â`©2½7AF a‡ìÚ ­PSïZKeUÂpf›ªyq0yRˆPPŠ”8Á™º“÷ÖDT˜¹7rW \³æ,Rç 6£RKÀ ’E°Á=N±E¶HJ)~ŒÔL& cö¶8=Úi ®¸ "‚€Ir©ñî1̼5­Â"¥ ™ö觺rw\˜!˜­ã@ Rs÷³Ÿ…áTÂBl j=˜ÅTMMµkï…Ž®íÑdqŒ ®§¸«ë·¿¿¿ßïûƒ/¯o¯ÇanmíìÇíЮ½RKØ“…ÌÜTh7ƒ-žoŒR«“¿‡6=‡W”‚ÆÍ´i#‰1¸Öª½?Z«¥–è„`ß½›):ƒXŠX4OÎçyÓP|ª$/å&ÌçãAÅÌÈb2ÐÜ -·k8BC '7KL‡ sk§™«ª³Ç„-Qš…hèNBóòf!€‰ãÞ´L÷¸n•«œ0Þt­ëôíBJ1w¸³D‘ÆnËrrb kL]»hivù`íJ:¤ N PBs<%ߨê<Îx©9`a¸Ç4\N’ö^ñ”´/X×PLŒÞ1‰èÛ‘oå:SØÝ  ÍÔMÑ©<°CÁþ¢Œ”ö=äò,ž¤¼Jy“ƒ ÄÚÁNcoªi4vñÉÕÝ"»óœlÝóA˜ÄxÇ÷¾Ë+úyq!—Š? ÞJê»=_ö¿«ö1 »;sÀWHß701À£Aæêç¼pí±‚²Næó@q‚$¡ †É¬ÅòÔí'ià¢xc†|á(CØf$ãUâ4fÏFÌÜ3O>=ã‰yëÃΓ¦æùÉîÀøä„.Ê;—Þ£M”=ÂÓ0ì[)b¼fU -$ÍöÒb3ãó0°¨.|Ec™}SgŒÀäê#;£‚-O³CüžÌ”ϵKKóÊíD,—‘yÌ=s¬oKžlš¾z,èsê™êŠ:ñý¿)ˆ›Ï±À¼ò×¹\Ê+°8  (-AŠ-Õ©¶GŒu03ýRÝ8ŽšvAïG\ϸ.eJP­oœ§€šÆ£L”¦¸ñTµ[7"¸‹0sî¶s ŽÁ‚vômòø¦ÊE9¸LtF"òKeÃ7lË'£çœÓòL6\nºc×ëÜG'_Ê×sãX“ö«sŽŸg8-žŠ¶U>1æ `dÿݯúkÊÈàu.È· .ªåd­v ºŒ]&%-ÐaÕw@ç,$°ÄÓ,íž %˜Äu‡ï¨uàê*žªc+r8VP &ó†['ö:Íèà `é­[P#Þ¢}:âÄñcmÖêŽ4…?M4ת‰9AõD6Š·šE2l¡'ßRãm°ç†Õ}º9#¶£H|£Zì2»4ZøÂÎwëk›ûšîÏàÜLœ6ÖÝôNäç·¨]~•à°n{@^¥UÿÁ$aÓº7DávýïÂ>zßR ãöšZ3z²Vo3Nš`*X¬Ù¿aŠÆád]ÏØíF;†îi?°ç‹Í}ƒM^³MóPŠ/:Ë×"à?\ñ=\Ðêÿ'½úO ÇNßsò÷sþž¾WüYõž¾ÇŸ¸)üPwÿ¾+ÿÇúµï“°¯Þÿá+þîlàÏÛÿÿ™z‡ÿ§…ðÝ‘$®•%x6þo&wºd&¯š<_-ù4týçsmÎÕW-AZ‡F'Ùç׿˜Ž±>Èó1}VsûÌÓIÇkÄ0ö׿ËÐë m|¡BÝÛAV ‚çs•²(•vWcÞð\¦Í\–´"º<,v~Ø$'\öz+âúiîqCÞ¢Á?uœl-Á¾ýoì{Û>SÿGį?0XÇlß.±,þUw?Ûã~ÿøöþ^D^o/©q@˜zÔëš…4@¡Ã´fdé`yy¹G-\R³Ž3±ïßèP5UýøøÈ¦â=V·®Z¸T)$."¼zŽ®GÍñ»”RJ)ªÖZ3³Öš¹çID¯/?·Û/?ýTo‡©½ýô"ÂdD7`i,F$¥ªvÕ Þ[Z‰â<æÎѤºNì™ÿ‹™jïÞÞÞî÷ó|<ÎóÑÎ"¥G•ÚO5Wr25Šˆk^ø]ÍM)™ ¡ö¦'¢·›Å!§Êª=¬Î!Ž7LrµJ=ûùhEêíPW3û¸H‘ôª—≡02J¾“jŸj)"B„SÕÔ»!Œãv»Ý*ƒ{Sùùç7òá"¿ýö{?{€caHˆžµVàŸ[­åÛ·oDTëÈã¨ff…%ËiÁ¦ý®ÚÚŸc)"Éžõü}T=è=fJp7 c «YkæêçýMðš!{‘Þ;˜µ÷¹?Ë@îµ1Ò³<ô¯*Ý:SjL%‡Fä®èÖzË9'Y«÷´šñÓ讜ÿ{޶¢ˆuØ—ž›…¦Î"À  eÉvÖ{¤0ÀQ)ææQY˜á@L†ok­–òöúænÿßÿïäTjaÌÌ¥Õ~?nÆ"Ìó«(55Ó£T2ïÚ9YJn12r#‚Ä\I§))ö•¦êĦš¬òI5ÈžKDéb¾Q`j7B,“f77ê­‡ÇIDÖÙ4*%Rmv‘l}"?[ÏÏQ•. Åq»µÞ³ñx™–,u¡È¹99œ™]­T±®±‡7Ž´¸ VP¼¿Ÿûý¤ÓÔôóÏo„‰V#w%‚uUWC%3ÿöíÝLo·ƒ€Zêí¸ÅéKªþúò·ûãqžçyžÇq03BÃPsÕNæîG)œ .„Y¤D-óôj‹°{¼û=E„ffê\jecáÃËq³Ñ•“¤l3u§æ€â¶ÞK‘×—wëªRD[s–âd ~HXÜÜáµ”Ô×]‰®Äàœ³F,<ÈÍ™`dÝ4`á‘GׄSyVG°0›ÚÒw‡PŒÊ" pžÁ^±l¶Hâ*LëÈLp°™™+ˆç¬ׯïþ64Ssc3ËH0ƈt _Óo.ÂwÕéæ2à Nà–¢=" H xzZ—a01F£"òÊiå¤Éeผ,TµéÙòŒ7Ë´ïU  ‚I`ÝÒoFG9Ù&- ó?ÇîŽ7úÿü«›ˆ?^aŽÓî³[ÚëNœ“8yNÖéyI8£rEŒžˆ°šÁ•œ±›T#dQÈ äŠ[,ÕjÌ>xÙ1&«˜‘0–nÏâym>uÃT ™@+É=(U ›ŽYà=Îé©AGûc‚ÜLLÂB@T¨š4ކµCŒY¤åk‹>I6“gïD}[ü2E£9\ ¯ãx'ˆ§`8²3¥œWÇØi«'*guè,ÚˆÖïÇôAÒÔ?x–co‰´E,±°ßºåÜñ"fùè# ´CÒʄˀŒ³¤šxEðk<¨(æú»Ã>+ÕÕ.rÿn'§Cň0ËÜûÀÝÓû–çŒUÕ<ša}UûÆÇc‚„9Pñ¥þgˆkºù§š<†D„¨HÁŒ­…s>y¯kÏ‘^Bªàyq“ˆ§ƒ%'ûE/ôË•º}F~-™Èõedû–ñ~ÎÔ²fÌQÖ+vÚ³;=6±>§2t½¼6—®UMýEe­ñÒÞÔ|ý«øÔÂùµþ‰mØÁåkÙ|ò’víx#®çÐꪾ$UV? ˆaó“á¿‚9¼Ž^ýhMý.9ƒ½ d„]f~jo*ݦ•»rÿ½e ?R÷ÙÞWÞÿÌŠïÉÕRûÔ"àR¥ÆWîoÿSŽùOŠý,¨§ ¹ö¬o}%ø±.è׌ÿÉy…ÿ`,ü9ÏSƒ.úÿ_ú|×þÿìúÿ\‘ަ—VÌU—ø3QhµÏÝ–ë|+Ê[ Sزð3¾¬†øYR…=ùêãÉ9;9Ý2´u ±L ÿV+2T䀑¡Ü…'˜ð?¢™÷GˆçIù‹¯èCê ¡nó•…Æ”½ÄŸ÷oOÏ ¿ôþâ:÷ÄÓ’~ÎÍ$vÐ_{€ÿs¤ÿdÆœ‡Û0"c°‰Ó¥ß»©I=D8:?Mz èaýK)ù\ Ö‡›é  #;[]òíÕÜoà•#Y-ÇCUãçnìÝÓ7)0s7W3ˆÌ3À$²r7Wf¾Ýn½÷ÿñïÿàýãÝí÷¨ÇQËÏo?ÕZH©›Bqz723R'’ U²v¿·î½½–•-ô ‘ÅfÙÒ̬jA§ 6‰¹ÕZ ¸/D¸½¾š{;Ïo¿ý¦½¹{)ÇËK0•ÇvUGÚµœ4wÞJ#³”2®L®µ¨FDÞDçÅyª  œV×ûãZ¥/· DJ#\èa‡‰kÚÊZïí|„d_£õnjíl`08,`½÷':ϳ”bfEøq:€_ýEŠHt„Cùë5­//¯¥”øVqÉ "¼››öÖUó8“^nÃZ§@iàGÒ¹‹¹Yï\øv«F¢]‰ÌzçhÌ´<Š07fVSŽ˜ÞTom–é©i¼6”—Rb):Ï3”¥Ö¨ÅL™«¤B]DBÎâ"Sô÷ th Ä0 ²")žæÝ[J4Üîçÿ¨qŽËð<[Dˈ!;H0C•Ùaæ]˜›ˆTTk%¢¤f#ÛQkåäÉHÄcšö)§"Rë¾›ZQM”‹µGÀŸ¸™“PJHÕˆp”bl0n~ši<âjoM…æ¼ÿþí¼? s¶y;Õ"÷ô'îj7°¹=ÎS¸ùqÜj-ñ|>{‹s€ªzLËÚ;–àb!Ѝ™‚ ®æ"]›ž) ±’vínÊ"\o7nÍ,§ëI`Hy|·ÿŸž»€‰„£Ì H–4Ô[Dâê,á¥;µÄMaêîJõ8XØÌP0—0sŽ€EÍÇÐ`ôðSZ¨ÖêfÌÂ`%3WÁ‡03×I•µÐ€” ñ#þ&g" ”ORæÜzÄ’f#N4‘†°®a.6#s’4ª;m‘1±Ä¾)pwÌŠ”hTúÞ¶8(ÿ{>2þ:O‹Øvibµ± <Ø$@PŰ8«C¦ÇZ*CßÚr ñã}´_@b žÓú˜Œ •Àw–ÂÀ.óìrWAÙ¤M`ÉHMà â¾NAnê¦Õ‰3àÉþ„Zp˜°Æ§Üºê™yÈý« u)`;3Öáø’‘¸B¦CÉuÙi3Rî¢Oï¾'gÌß8ûÐ}·çkBІX9v±äDê¶ì/ta ðâ^L½ÍÆ«ç¤bìkPÛ±å"\hô' Cv×Xmø¶yœÿGÝñ„W Öf\$>Œš¤”óôiÞù¾w¶®îChÖ’çâC°ìðÚ ,Ž‚œì[;šÈé1ùØ*mg‰çæâfU"éZ^£7¤9§+j)®‹gåWTÎ,ÈñÎ0t5 ÐðÍF„h¼ËdÜE[¾úàf4’ˆÙsºüÊ맬úÝÚå+‘¬Îy­VßÛ…§^¿÷´Æ—OßNï‰FôMâŸ|§ËiFŠf{~:îiÜ0Š#æ9Þò¡qܦQRרw‚ÄÁ22€óƒKù~ýB6*ÎíyÞ̼è­ ÁDz \ûK>õ@úÕÏ1G<»üöãþJÌçøóR#¼ûÎbŸÁ5Ä LÞd ГóêÊí+ÂG2‚Öó&¯këîâå¥cC—ÞIïNX£GÌ=öˆÙ⥠¹nÓ­?Ÿ¿~ׯöͧeî{ñê”+Ì7uvËJ]Çïüqzª¹÷±Î¬aÏ‚¤Ïb„'§·ã:Êz’êWUòn·!}6®àgK¸aÖ6!ïî-á»9žF'ijG=¯zòào´Gξ Ïûªmò)íû¦âÎ1šØ<,/Ã\÷§²µó\hQ{WöÞç°Ãð,;=0¾Ás„è—¥óûŠ;¾÷/þ¤–ú÷Á5 '_ýkŸÅ?š à/9¾;pÚë#ÖHè¯Ë¿໿™ÿ!;ÿ÷¥ÚÚð£ÏúÃÀŸãÿ|gèäOi@:PBÑ͘[SaΘ¿YëFqˆz³R1œ˜P"‚q'†•r{yyé­Å !Ð4R˜œD¤Ç!ÕÜϳ‘{ÖTç6™‹03£Cã~ÎbJC\%2dnæ½µÚLйš;™÷ÞÝ a)%Õþq¿I”àGéÙÏÖî÷©õ¸žô# ÞÇãQJ}}‹cc¬€½«j7wÕNŠÛí&¥ôÖÜ "yZÄ=››@T;¸ªi»ws³nnÁ­i;›¹2¢€]J=ÔÙr¢žSŽà—Íók¤-Ô:X^ꯅͭµf"D)K4²” J‘P™-†Ž!“I ˆªÆpp ûÄÖ5´ðô‹ç]-<ÜIFƒÇŸP‚ 0Êlà0óð Æx)îËA^‰!¸”,”Kg“lFD ©šº Ë+¢ó «Ö;óc$rs”hª6¶ žDžñm¢ê&î½,­u¤yÅš3›'ÓL¸ì6#“ó'LöwÆÁ[«Œœa<È,ª1Û8BB¾º,ÿÀDƒG²&d`žü0‘^ü—›9¿¡‘uÅ|;·¢š1¶žÕ­UÉóêq»Å…fL‘{Y࿇ßϧr›ÏíµODQH¹×q›¢bl¿ª,v€fëe§c„';cEc¼>+wÍŸ£ùÏpÉüï>òx˜sßj<¢ƒiCê»b$Ç~ã‹ç”Ñ&eg¡p.*ôÌ]툦« O™œ3¨…±cV Ì-–ΈØÖĹfxi-^"fmò×bµNfŽ«Ëkß|e6.›•h"^Ù`÷Ö]Ïî~a–¸îvúü®¬ŠÙe×[Qpzšä¬ˆ ípLlÉêWÀ¶éN¬³>‹IgÙœ.}Ëæ?WÞ|pOMþIܽä|ÐÆPÝqòx{æãe °üŠ*žsvŸfä ÿætFÃúޏˆ–7=Oì ¯ñ!ž¬°£ö Õú„œ˜þÇgˆŒoßK,/÷Êvå 4ΓwÈpmgÜ Uˆj …=•iÜ5?ÇalgöRHŸž…âÙT³}´ƒË¯5Vo•ËŸ<¾ÃųZ _Âê ×ÁÀŸ6¾¶zû“ÿùÙFëVƵ¼àG…·Éû"vþ¨€í—vŽIÜþ•_ÿ™ÌóäƒÿœçËVÐø&ü‘`è{ùŠç¯]“{ÿKoÞ?•ýÿOÓÿ<šúÎ÷ÛuŸïA¿âq®MÜ„ç6ŸçŸæ«G÷òíלœžå1ßÊ…®¸‹¼½c`ÍvÓ°&|};}‹ý \<¥'o6¾¿ðZU#ož69`Ù¦O;ÿGVn¾©fÄBÛÜ8o=bTþR ÷­o|‹°åÆæù`L“}â}7ù§§êeæ˜Fß~…­á|‡®«„ã;ñµÿŒ€;1SŸ™+uòè`|õÛ;<>îNÆíÚ¹—Râ w;êQw?{›Dfîýlªqv 8/ˆŠ²¢5µÎ£V`Z= ËDtÔ›»¹›ˆj­¯¯/¡¢Î63Q-%X¨÷öhí ÉÎ É#48v€·Û-²"ñŸçyœÿöþúöòóÿòÓq«GëêÚ§š¶vzù’ˆ8Ñy¿ãvc9n-L”Lð’qCÂV-ÅjJÄp|)ùåvð¿üÇýñ¸VûÔóþ¸÷ÞÍôõöúË/?«™RÚ·Œ¸„²æ¦(rveæðÁ€F€ÕZðpÝjïQ} :…(/ÌgHíF‡@¸p)"Ì|¶¦ªóqÿøÐvžg‹k°”jäg·nš;Öi$c–ñVÄÝPz«G­µÔBpU9§ºÕRXäìêîU„û#2R‹™µrÓC·x˜ ã8âÔïjBdÌ[oîôÎG wVÉ‚ÁÆaHS5)`"ăaêçãì½—£轿¼¼¶Özïïïï­·Ðëã“RÞ^ßî÷Ç”ö`»–LB6_Ò1¶qbÎîûo¿ý&E~zû)¦#Q{ð¸ßãrúõ8g»?3×Â!K:y×êW ȼi'÷£go ¼.ÌÄ¥®… Ý:BN­}Óî,v” SCJí½X ÎLBPމÃñrpÊ7ÞºÆÂ%ép#wc¤Œ«î<>)b©˜„ÏŒ3À2jÝÌZSw“NÚŠTw×Þ)ÑC4•‡Ýã×s`ÃD`W{øãñ8ÛÙba‰ƒ ¥(¤+*Ì¿ ”#–3ƒICå±nn­w€`P·ÐÏÅÙÕ÷m}:jb IDAT”¥HénnÞÛÙMͽ÷.¥º;xÚoÜÔ$,/·ããã.E‚™-Ì@%tsí<‰¨õþrÜhb ’Á¸ zf®\ÚBäíÚz#'bs†ŸíT3ÀMM„8ÇÚL`2«VáDì‰Éº`SSn¢¹Á(&ò<,Ì1FÊŒ™eÍ-ôl j}`í¹H©dpÍaÖtÑ2Ö~ECÞq/ÁŸY{Žn‘©ÙH 2Ò—gzÿººtêžr›†Ýyøè@ª4`yljT˜= B=ù·ž²²šEI@<˜;é€j Mžà`qÓßÔ‚hÏ€”ÑñšiØÉ3~ñ¼n9Žýí6x,ãè:—mªÜå_/“ìU9›9sf ÆmñIMô ý®8îŸ02¾FžÓbj°géjkÖ² ]œh]î)ß æ_ –ÏCÉïê™ø\ýûYÀÅÎnókfÄŸÿf6Søw@:ߣëücû½õ_ÿ‰r³ÏUâHs?~©_-~`áÇ?J,|ï éûÝÆ_ºþñƒ‘À_²ÿÿÓzÿÿÄ|!ø?M?#z. ÕK“ï5%°"ÞÀ¥ )7Cx¾”p½±G>±ßµÀ—£X¿_~.®kš¯9óN·!|šj¬ Ï mRV·-®od ZóÀ²R°c£CØó;ÃJòѾÕÁ¨&Þ”¼–ÊÕ0hBq0ç u¤mÄö.ñÒK ªöâ]Øó Ûä2µûçÇ#‚ÅÿùÏù§˜5@Pª0ƒ¨(lɮ檵T¹q‘Ò[ . C¤J½ÕúhmÆßgÛ˜v…xœ×¤ÆÜ´õKÀpº†È¬pæÖ»ºÞg)åv;bÌ ƒ^:’ë\мÜyÕãÛÇ=<–ŠÒnã s)Ü{ºö£Zo­÷*áòÄ·ûÇoï­·ÈD·—[9,*[oÍÝÌâ¤[oÇ#+mÙsS‹-‘BdQ×ÖëQlD³…áºk?n/ÇËí§ìÅ¢ÇýÁÌó|ø½€Z#®Å˜L­»þÿÔ½Ys$I’¤),¢æDdu7Íþÿ·»K;SGà¦*Âû z™È£+iº7û¡£"‡ÃÜUæÙÍžÕÔ¤7Uëq!ÄÆš;2i j­PU¨ÑUµ2çÁÃi!Šô¨© ˜ ÈñýÛ7üÛ¿ ÙÜ!|Ãô!6B <¥¼p‰·ÇcâMU“ ÁÚR²p÷~?JkÓéˆXíü€Ô](D5(ÚŠñðˆGœ-¼µfy3t PŠ©è[ýy¾ŸÊt®« z¦ÁŽRî÷ûý妪ïçÙ!ÍP2îÇí(#yñ!ÌL+%ûØñòúZÏó<«ˆÜŽÛY«{÷àT%Khå(%²ËSU ´@ÊM¡õ<éAõJžõÌÆÄ^O-ˆ@$r'¢˜•£%juwdMK„‹¨)BÂCÔÙvÖ)*ý³ !P:#U^¡Œ©‚ ›7J1qq¡Ò1>¹Ž76 ët2<ùLƒÉÂ1 (dкRÀôðb‡¦ö%„èQŠBØ"+1¼µˆ^œVu þ„š C“«–ˆÅ=éù¤èT¨ˆ(ÌÅÓôB¶êHÏ.·,ûä`©/“DžúÓ †HÑbf7FGßÖb&"º,71 so‰YôÆ z©Ü(¥ë ÑðlP³.ëA5ÁOYöKŠ»+T-~”5ž˜vÓO˜…:â™}È é±M…ÑBf:Øk’…ŒÎÞã -;aÞZV¨½úWHG§-å6_ 3å#Uñë3ü(ɕނô§Îm"£–CKûîàѱ9TÙÜú™«×d;cZgÈÞý³Ð2èä2ÒHºçJM¨k‘6ì¯Ä…Æ.W#ÇùâœðfÎ=v¥;Öp©“Ùœ!"±-Ò†½hQSÒ#;¿)Oç1éŠ$Z %?s[±ó)-O* f}º¦}Øá2Bpìü„mI=Piªé×å(õ(­ü¤&ê;ÕãàbªŒèø¾¾$†sü?–==ª;ðç{$Õt3Ӿψ¿µ”Î1X>ûvPúN µýbA²/³…¬ÉtËn n¬Îp Gõ,ÏÈe²Ä(?˜Gìcl à¾å î äÑ´½m¡œ¾ú073Û<ù&F$R¦Ç£(%÷¬ºFåêŸÞ ½²òfµ­Ì-,ÖÔþrV\ðá“?¢{Äs×ÓÇ\§dŒ ¾¾b.ÃH¿M÷ï×EG¹²}f»ò“QXv»67$ P±u¯p͉BçÔ‹E!LjÙ¨ÞÅ([CÝKxg í¦l)œ1¸æe÷<{‘‡Òq—“Ñ1âêó'.˜q/À.,²ÜŒÆÌɾ“ÏC4óKk—¿VÃð²Oc–ñnÃ×Ut¼ `æ¸L”pç·lY¯Ä´c«¯YQ0Ùz Ƴx“|°\ý;g™£—#¹¿Íu>é”çPwsŠdYÍ6êX-öÜ ˜l‰}vum3ðœùÈ*Ú±óbË®¬ÇÈv>74Ëæ ¸èSøLç{Êèpwó¯2îO íOªà¥;¸È.¯8íöü˜à~!nчí>Ö_o¿þñ‰\‰~&êb«GY×ߺÎ~íï–»¾|½A^1ü¿áyå3»êËÁoIÒü½bïg_ÌÏåý/ùú¿Fðàï¥ñ«þ/Ôÿß«Ðã3éÿ×Cÿ9ûÿþþ7Êÿø^l×ÎqàóŸ}Y‡í®w©DšO†ýîýa¶Õè;!sÙ¼Þ°’Ì·0)ºK±çm´nó&3¨AÓq?ÃGÙðä¤€È àš{Ø­ù²Á5¹ýB0VÎŒEÿó(^Vým7,s-·.ê,c€õôÓ§¡Ö´õ““_?LÙ.p¶?g "ÙÇkf*R[óð³±6j+Åî÷›i òôá-3Ä"Íýlgs?k£j÷;˜©ªÚÀßç:«B|‘|ûÊ.Û ]ÚÛCÞßSÕ¼Ë-™"ì.}† DÅ\šGO"Ù:n{eî`MpäID0e““)2Û|;w©³Ë†e5 „X4ÆÓ8z59ŠR&dÐMÒd¯Ø›8 ¹¹5ÌŸž‹L,U†lŸÍ5†b˜Òz{öÛŽ_ £‹`†Ö0Â{ŸÐÜd†wafŽW­À¼$Ç‚¡¯(󪑬½·Fç™?Àöqµñö«`ÎeeÜ¡bKZใW­d°”ð¤ca HØÌå›»D9LjÛ.|5Ñ_p—ÄÊæú¿ c²8» y1¡‘™ÏÆ]ó›m8³Õo ôÒëDVg;%Fr@Wm½p5™ì¡g2Æ\:‡lÐûm0°eÈ­º`/@”M^¢í#«wy ûeµ /¯ÂoýùºÄÊ_zÖ³÷Õ_f©·ƒ;âh.°:óY§M]éTÛ\_u›#”( Å‚”Nõ=·Û:à‹XŽ~ÑqmE†À··¤ûÒ'U·4«®qá ¸Tá1Kúºoír ri}óG\€Ÿ`Ëžn‰ó™×.ð?£ÀŽ#Nþ|¼§S‰d1+¦ ¯Eµ6o§·V+z˜jx¨jkí¬µÖ³ãG£˜iúSûv(×úAj(´˜õ½Ø\„D¤4“Þðè%´q;ŽÃŽTè´Ï…:XTUsRôhžøÝÖΆG)FáÙ\„iës¸vƒò8 ùå/·bjJU{¼¿ýñ-Bˆûýöúr‡Ù¡…æN€ªör{QÅûã¬ílÉÞA|ÿË÷vžÚÍ#Ý´Aw:S˜‘oß¾™éÛãQßγúí^Sœ}{<þý¯EË¡¢Žb/¯Çûég­ÞªÐE¥8#Z¡·T¥ØPR AUe8ïç™X2.rc®ª’ ~)¸ô?ŽŽæ”äDÌR{i— kT?ë£ÕháPVHª™£1"/…üÜ‹Yù¶óA†ê‘lqUM|y2²­†{¾ƒÃ žgM¢zç–ˆà@m5‰!‡•¢ê:xË$Q(jš§Mmáéçø½¦“™‡Â[½Ýîf…Atª¦ˆ„™ÖZ¡HÎ~÷kmª&OJÇ#ßíîë‘üݧ=Kç—ÉǦ¾q÷™‘ó)ÃLé¿ÿ¹w›„u¾pX)BÖZó²z¼ýü窕Çãüöúb‡FR ­9!Nzsˆ4†q"šíŽ’ÍŽ$Ù"†Ê@ª(fŲßÏL[xm-ß_ö²:˜<ŠVÝI*²Çž1‚Ô½•/›Ó¤C³ˆŒ…PfB1¡G‘[˜YIµ—Þ%[p1íÒýæ÷<1º½ñ¯†CÔó\$LR éÇÙéî0£H¾Œ™Æˆh¤¢úÍ&ÞN2wíˆPµðx÷Ú'zå$\M›÷Žt;Žo¯/-üÇÛχז•†¥¸D¡·Û€ÛGjÔ-×ñRrLâ­µûíör»ýóǽÖú¨gnJ[DÑ¡F†„Ð@UhÐê-&¼¸eÃ5ëÞ#äÕÁpµ¬îU kmM=?)g;0fí0ˆE²Øš‡±”¼3t´—Óϳ" +SËnd¥¦J+¢Ú¼9Äõ|”R’EZr¶–ï9òF@ä8ŠZÏ?Í…j–=¤5}ÆVŠ* ¾v0"[8„ªUËþ7#{át¦‚¤"(–b‘gNÉ §aÀÈ>‘ð\&ä)ù¸ãˆ*[äæ½‡¬. îW'AL6ÜàXÒ<¡J+åIýßfØ~Ý¢<àæÿ'Ÿ´OpìCÀÆoh¾}¿jÆnàY#Ä•ïò¢áêªÀZ }Àöpt4m‘Ó≌\puÛgúqħ9ûæùçó¼_eð{a| üÁgÆý/zñk"øRôä Çg,~Âÿ½#þй÷ÓâÓ‡ËÏÃ"¼Îðõ\ãS±ž_ÈÕÏõ¿• ¸Ž þ“E üï’À÷üU7‹zÿþùÐw|òxé[yüáZ`KÈŸ½àDÍì™§TÙXC›9£õWä:r`mŽÜvWÿ»ojÅ.-Ùš+PJ÷è®Þã¼é#5LçÓtVEŸÈ•›”¹ÜXhÀél“ØÏòTÙz‰¶A¬^°d³lý^“Y¶ Ér>É>< p¹­ÍÏ›)ä©òOÿ§?ðWç}| ªfZ¨HÃòØ3d(ž:¾à02íÏákŽˆ÷÷w÷v»Ý_ A9ò<š´ôL)‚Њ{¯NM'‘vØS·Öæ÷ÛÍ.¿ –mÍï÷r+ÅÔò“p÷¨Þr#d«4ÇíVPdÚ¦š»™ÖÚJ)z”|DªŠ¨ñ|{ýŘy"Ÿtuª¨‰{mñ~G^œµ5’w’¼i9RýNW¨iG²†GBi‹g¼¼¼”béÓ—oßÛñrPnG“ð¢éUR…X´–,!w‡ð®V•!Í(ÖÝÕPÔ‚”Zs­ :œã Ss†·ÀRŽ[*S}ÿ>ŒZÓ­Ö=MÎî ëÙgÎYâ¡Æ!²„j É3›J)ªëj$ã~»¿¼Ü#­6iµ¹{î„ãÈý€*FÏÆº&l´ÌY £Xèq;î·›{Ôz*¦çY[TF0ؼ©(DJ¹™hHCôÌo±ãõöZŽ^¦ZéI|W Z+÷RJÙwª*”CåþvÐxKk-µæ®Å«(¥ÔV“T>a°µ€ÆªËÛ#ç÷~Ñ’ò(åOa­ÞÚž8ŽÃ̲® Üî·RŠÁùh”óöòÑ³Ö Ç„„A„æœ>É3@¤aKÔ„aУØ/ß¾‡GÜ¢Ec(L´ë˜¦³n‚Ûqtj–™X!m i”&QYÄM$DE¢Ñ…‡Koœi••®ª@…è"bV†Y1Ïèwí G„Y1- $ÿÆ›ZŠ´ø7]Dá¶æÉkÈ £BuüìæM„ðôze†$ £¥µ†@$G¦6 jö“ïZU‚!' âŸ?~–Ã~ùþ½¹¿=ÎG;;͹-%DT<"á}J‘ãÆó<Íì~»å××ÚŽR•Þ`f𰬄þtå­yw¯d6KƒáITO³y"èF_õŒWd$EBž u³nt…S"äåH©¸мµ¤é»‹éí(¯·›þñóGmU!¯/¯98 óí^­ÕKnj40–wY ÷ä1dMz±^p¬þÐ%aÓð<ŸÁˆ úVsOí¿¯GTµ·isÛ“…d!tBbÌê6ëô0’+ÑSb:šQÈ€h>$‰‘…N>‰é̈¨Agq;7*WOÒïcs…AF U¦Ñ!èîráÄCLÿ#–æPPÍGÓqlý}áó&& ¸Ç¬Á£w•6Á%—~©ü—£b¹"Sß”P®NT$t}…WiÔr"ŽåeÌ…ï:4‹¡÷,÷ŽñŒYÅ=„á#‘j|8uu['W¹ŸWé(O´ÿ’Ç”«ûcvŠò¤Yp, ?«†L¡f討à‚ùìäOèÀÚ\ÞÒ°ZOç‹^ ôýJï•™ÃoÏœ t ‚E4—<7€«žKf—ž Ûºv¡›ÆÞs²f8Â,D?ç{qpÇS1;’è"¹NÂÑfŸü›‹lsb’Ž ¬~&‘æ>~Õ±àäƒMmÿ›Ùqù¤îK ãýáŸßãìcX/ž¼±ö|=apé X d?Sy’õטmZÍ;khJª«{ÓΦ´¸ùÕóBØ CÑçðÿYwǹGÚ†’Û&hã´nyñXq$‘€Ú¸À•× ìh)Á…/4ÌÝ]u(1. IDAT¥ŒÑ+Ü»A½§ƒ›¸wb6 ÇòD‹ÏÞ…î»ß!±î¹‚-.´üÆ›ð»ÜÔ:/ªìÂÀµªv3}JpÆÓ±¥J'æÉÇÏ\¸Û6ó3õß³ßÒŸݼªšÉŠL—*Ù%¾‹KÜP%@2óž'Û/ŒtÄwa¼W k"‡ÖÀµwSH Öp3Ì”]*Cãä>nò‘YÀÒQf©ì.(W?¯Ñ¢«ÂÅ-“Þ3< ÚY„Ùsž6Yù;ÕëÎ#×àpb6ìW-Ëξ¹À`6¬Ôv—ûÒIæY÷ÏqŸÓç>×k%âʨmŒÞ™ýY°©±è‘«vÿžÕyŠS_l·óÎ)£~ú£‰/ÙødÜõ©”9ÖU|z8o]ÁŸšÜ“^—7»nw¤KHˆ3Óq½Ê>”örKH<½)—Ã… «…5"Ø«'>3ü ‡†_ÈÝ´{üºãü«W¸(hŸ£oÈÏ6øUÑ™xö¤ã·\ñl>@\'ü„ïÁOcüUõŸŸü`þú»ùMýþw‚‰þµÿþK@b÷/žMžr*WÝþù7Ç_Àel‰ë·óùû?ˆÃ³·|Ÿ2\&Àó‹e™ÓÐîVq@ÿÎñ$ìÖx®.¹5 ÂtZ;âxÿs¸ ½ŽIúM‹žêþë*l;>ПJíž…¸n)ýÛz(9Ú«ÙfzŸŠ_¹ÆýWŽÏž¢[‰Žý5.½Øîž«”xÿj4÷iÍ#üqÖÈØ%):鸟XüÌ%#ÑϪ¦’p"‚DÇñ›¾²W›·æ-î-©Pñó S+V‚Tèí8¾}{­­RÌ"efàåþrºÇQJñN¡ÉÓ/m“˜@žÙTd…PZ«B9kæ’ T[xxñ8Ï–Ãe$\¼/H¼Þ¡Š€¨ÀY¦d~›q*jvD‡ú‹³E­cg§‚p©gñÄeT½ë*¦ä èOëLÑUÑkm!¦¦–„œa/N³pÐL-®ô•w1;!$wVAS‹A(¥™»XŠUB’&'Er|r oœ66¨vhwê8阎nœ#ºìˆõ°éNLMG„ ,+±±v•<ÎY²ïS9¤~ "̪=䈾S !\:&Á&¿ hÆ9زûs‹>~êX§NÎrX°·éví#ÊÉÞi¼1o¢—MhFò¨‡"67ñ®0pBz/9öyOhrÆR^µßú<¦/)»Ä9üþþ†c2¤„¸µK ãð¥9#«ÜE4é-ÀÂ\:ûlâ´Áôè@üaø3 òLÀ cr[Ó¯ ²(©ØvèºDÌ!‰Îâ챟X£Q¢ßå›L=gÌÎú‡>^%óLHÄÜu …SiÚúÈ€®µGlz7¦çϧ dæoþšéØ¿`b‚žFþÓo5gÕÝÑ´ôËùŠi¹Ø|›!Iwd/ì"2Æ6 sÝ2 ‡3nS¯ÇHë`fZ±ª7¹lª ¥2XùÛj}¢Çç‡cì¡ËðÞuÉÎÿãX_q'ùHžJ:àþ” 3)MЉ³Yþã"t.§ö¨ü­ÕB*£=k&K’NúœÜŸ2 n§¶ P±íÎÁÝIveçôYè6‰up5‡—ÿRt·nL¸Z1tƒÉ6ìÝOE®c⸑F¶Öí«ºQĈ«>…«‘yT,V~ŠðØàæÜ6Ø3E¢kok>¶ñ\TúwŸUPBs É­;Ü»ûeͰWBx}JKi#pV.Çl³Ñ‹‘rãxαÔXgÖëŒX<šþtJý]3ó»äØ1êU8YC[uÜ„±ÅäBeßšX×ɰn_ès£¸aõØtëgßÃ_ MØñý¹L,\Ñ&ü~’[“íù ©â¢ê~þ†ù¡ic]¥x^1\¿!wîSÛë4>QzE®MËÚ-óütƼJ 8Ç O¥«4üzéî‹¶]Þ–]›ÔÊï]5VYÓ.urÏj~~À¸;—?JêüløòÛõ¿X̤ý{T¾ì.øí.€§Óê_S­}¼ð)çh³ o]_Nð»~ðçêÿW“ƒ_É<àÃ×@¶æðÿ_ÚÿûJÿ=ßõI'ÈÇ`žæg ó ÂÌqo“âß öÈÖ ða¼?¼ñ¼|ÙŽÓé‹Ã§Á·ÙÝÈU] {Pmeõ¤¯YE¦“'_.¢^¦–cå†t¹uŒ$¾8õõ“ âHE`¯Þ_d"î†*ñÈ+Bø là’ógàà:-*ÿZ/Ǿ˜cƒÊÍhò5ŒwIÌyÃgñJÀs—ÂTùÍÔ’4Õ ÏÇ£ÖZÌ"¾ßn7CX ½Ç·——ﯯ?ÞÞó…~ùþ]$û{iA€Ý• ŽÜø(÷GZ±@jjÁænª¯/7KV;$ wª–BsÂOÒð+¨.ãQ^_ÏZßÏ÷·öþíå›Noµ¶`tÉQQUמ4 ÖhQÛ{Ôz“›CÄ[t¸‡èpàª~ÿöMUßÞßZåÛû»U U£»¥ÇQJ O°‚{;O»¿ ;!ÕF[ áÑ »Ý3!’aSÀ­žíQßÞ~F:š³Û oïïÓîå0Óf0úš?Îóý!¤;Žã(ÇËý^,{tYJ2Ù@HM ÉÀrçÇíÁùN×õ±ü‹î(s-žd’ìí@x²Õóô„&Á·ãæîµ¹Y¯`f8 ô6øÝ’Þ¬¼ÓÎ*A4÷ˆÛQT;i*š“LkKKþ`DD­VÌJ‘»#ò8ªê¤šú£š•ÛqWà~¿™U­µÎ½úÿG¶í÷‹˜ÛÜ.c ̬ ÃìÒÂ* š˜š•· V¯µÖ\¯½¼–‰²ÉŸ{G¯`âbæCS˜_á¥Xf`¸{<âv¿«™·FaNq‚›•Spâèú›»‡#4) óy{?_îG y«.d±a0URÎÚî·‚,“°ãnlf÷wÏJ ¨”Þ iy§ðnŽf0$Òè¤,]nµb‚sRjso­˜Ô‚J9\‡cqnÅ0ö’dZ¿#ŒR ZrºYT›{#‹ÚK’53:?Ò ¢ì(ªˆìÁ PI3CÐÙ\B( U•r”­Õóñxüøño?ϳŠBÈÛýF‰¿ýøÈé-„¦& R<‚A(qo}æ-jçh{Ô§HkUU“sÕÂïÈéAã%YÔL¡wG­í<-ôU9úÜËÅU æå¤ÃŒÑ=G^†´„ˈÀ…Í]g=µi)E¥„“îyŽ4»ø?ß~>ï÷þ¿~/ÇÈqéÂ=r¤’Åž#¼NÏŽK2ÄbnA¢e HSª»…®4“Mw XÞbEH÷Þ Ò2¬ì Cdê¢(°Âå·Û--§j}Äì9*ŒÜt¤ùvRe®x…Bº–^¶’õTï“c?$‹Ñ]’Á¦±uŒ¬ˆEèjÍH~.§f`ꥺ4 æqšäa§< ®Ì=¯ZØÌK£í“'’ËÆ Ç73fL¡NV)}å=þJâÑ»c7‚ùæÿš$ZA´-ÑW«:"»ÂW³tÇîX'ED®”†Î:½~»€yÁš*PÌÁçÁQ‘LñäN~ÜYm€Ub¬‹ó€tu±§U&Nˆ³‡rmÎ'²eì7y¡Ë¾1løã¦0ÅõÞ²¥‹N¾“‚û¸y¹ÖçPh<«fDqŒG…‹Nå¹ó˜&tÀ‹…ÛI–Šcà‚6AùisÞ‡½-Spß«VÓS?–æ9L»\æÒ¥µ ÎÓ³}J~ib–ù¯ë¦/3¸~_î#±ùг_yShä¶Ûjs'³2‚{ì@ÍŠéœyÌíGô9Z—1Eÿ=ÝÿIa Z6ª÷øtó)4}«Èq¬|Æå¨Ü:&ÇP*z ÈPj³$y–dd¿D,ÚËTÀû†PUf³Â‚\ä9­ÈT.Èlšßh0ÀEeLÅhÄ5d¿Ã¬~ïgÉDê^8õ¢EUZpYks2ìrbd‹ŽG@Ȭª×ÈA.—ôÿ,þ¥ÃmÜ*å¹Op‰ßKØçK3ˆÁqU}°Û?¦>S–º]¯«ÿ9…¾¦Ô6! %F}ß²0ryݹÙ$…*ÜîENðÎÞ“œ›=΂y ¯ÌÄBÔwëN É`B¸ÂûÍ£"$o?˜•‚óÝïW¤G¸ÌM6TÖœHè²Ís—Ú»¿{ còtd è9ÐÍk2Æýq/‹ãv¬!ÀèÂî¶’aà[“Ì«2´¸2›¬‰g ÿ†ªÞäÆ\_–Ø5\Û¿<ÁÙžBÏwá¯Å|æ;د•/Ç+.…ü A_ä5¬ÓqÔ~Ϫ†ì-œb÷÷÷χ9ÉuwýùøÊ‚?y× Èå'^ÕÿÏÐ+•äÙy«ÿÀòTtð‰÷ÿéáG¬þŸ$Hó«®ß-sž|¦Dó³0…ìÑÿºµþSïÿ¯@‹ r ÿºvÿ_[ÿ‹ÿì7|9;øÂþ±Ü_MúOá=Æ·úîždîË%´]؆}Ãi±ýÖ×5@ød¢Ä áÑ-l8cᘠr—ŽÌñ[nÇ0L—f2½n®:_H7é/@Ñ*v»àëúj~FÀNìë³úAžMlä% ¥ã§o£¬}. ½B°æ¢"»ú/[ùúɨ|r¹/Üéµ¾ä”kŸøø3:":«>Ñ+gmg«EË_ÿí/"R[ûñóÇ·Ÿz”r+EËQJ-f/÷[*†Çq”¤Ÿž¿1ÐÆ`IKvl B»‰Hm§{h8Ïót÷ÛíÖ+Ô¬ah(uOëÏ÷÷nªê@]…ÎãøöòÚ¢µ¤õØ£ Ï'ªq®JŽãF©]H½Œói ¨èQÊí^4eµ\óÕTÒwí8SŒA9_ hn̤»g AšI5Äç5.a&f÷¹¥HI©vpOóÖíŸè-©ÉÉ13†Ïí:U{ÁئîŽ4¹3&YqwÄ ».±º[ŒN¯†ˆ K„H)Þͤ·ãPEs{;Êñ—_~ùÇä~¿ÕšR0ÍJºëV+•ê„ÌÄðÚåi“[î ÆìV‰î1µ„kQÄÌúõ@f²e”Ö¬w«–Bà~¿ç .s33½ãRr<Ó«Š™@_^_¿}mgî–94 ¨š‚ãÊoDMÕéá åðÆ»ßßåó^Ž}©Î¯ l4Fh5—(3Œ¸B d.?TuœÅ`+™Q¼¹\1³dêÚääšgDöòãäÉ o~c<àcýä*QüôÊXöH,°ÏüPB¶f‚½w(ß}ÎÖ¨nöfÌÍÍ€Bxp  LtÙ¦T­»ñìÊÍ‘BN<·žáY·0ž™­ì²1t.V÷­^¸3Ï·.ÌåçN~Ø¥ ëvÝÚ³ì÷ò«€±Óý9)æXÃ7^³ ›c·»ÉÀËæ 2Í^þÒ)20ç®8òé7½øûÖ!Ž™›Øl†ó¥ïûå8oŒ²UL­ Ÿûù\-ø±Ï¢œu¾SQ\»5 €lÅUî‘E9ïÓË^Ú§«z°õòznžû«¶Æ5½Ji“³ y¡ûg&“å[{…îzONú¼‚óZœ>.õ²Ckà¦óa<FÕã¡BÉô (z%&»±³gbà ¸•î®Ö£ùcù³¢ó™‚'ÚÈ ?$4í"bìÕ‘KÌZm=Û­BžjÇ/šgÕ\³„²£ñŸ%Ä-­wÕÃÉ%làØÈOlY–žž‹†‰UšŽƒØ«6‡îµP}kvéo8€8«½¦ë¨Ì ‰ŠÀt”ìý¦W$"W²ƒŸê—Øüû3:¯‡É?³=óÚÊŒßPÌ×/‹gmû£¢üd8ç7ú'ÂñcxÒü¿ÌÌß%¨IøƒêÿÓtbXÀöžð¿îýÿ0è ü³:¿Z|EÇžòù4ÿÿÚ!ÀŸà‹éð«öÿ/â*ž/ì4< Éöð|!ÊÅ]>˜ûŸ¿õGƦþ_g›×ssØó¹Ið!ÉðŸ¾R]°~>ýšÃŒ8ð>s8Ñ—M«Q`@ö¸ô}ÿý`¥Í |*IXCÖ1qNŒó\3Í%Èóðw¢YŸ-TÖ6…ª—˜Ëäåéw9ÊØñ—¾l OÈB/ů þ”@é6hЛ7Çq¿ªúWûö×ïßÜÝݾ?ªWq?ÞÞÿöãÿ_gÄq¥ `9Êq{QèìG-fÅJ~FNo­Õä´xkçyB¤Es÷ó<»ÎK~{}ÍÍý·LW2Bß%˜ûíI"ß^^Ž£ü?ÿëþóÇO3=:»f"ÑšKYqó0ÓìžõˆÜX ”ÞÌL 'Mµ”ÃÄØäqž."¦ö×_þR[Í­X•7½9º³<[ŽRŠÕÞª¼¥gYu ýÞ‚‘^Töþ¨É,o­5U”RÌÌÃÕÌÌTÕä@3-G¨ÂÒ9ôx¼?§7/ffåvÜŽRÒý-‚ð–ó˜nðo-eˆæ!ájvF3ÎŒŒ 4˜Vg¨!¥ð~ÜÌÊ Î·„NX6 ‰®nJD´ZOž¥•ŽÚ(éù•mÃsiÞ¸4+¦É:`ÁÆ–7ƒ¶Ö¢“ ¤5¢…ÓLAQµˆ0#(Þ”ˆè=½äûùx¼¿—ï%]{ÇífjUš»—R†¹ÏHæL"’¢÷.Ün·DDÌ";ø¬6ã`8&}b‚qá„xxox<2Kq¿ß“I>¡½Í^ÅñQìæyž<%*jkç`r ®éë5Ž»³):1#h­$5„øÓ¨õÞÌTIJðù¬Pe Üî^ÃËÙô°ÇyŠ$1‰:{C+¬Ó¡¡z¨Zswo̾Š!EtÍ4c ªÑáÕ H¶4³#ÃB„âá“¶œÙžËq†¸ ½”£$y=¡`kg°˜v´BB•.„Øaæ)AŠÀLÕJ8Žƒ F­‘ ™ï W‘ü|+=ëœ×¢³†‰êÑ\Í=<î¯/ß¿ÿñã§GW3`¦ ;Ô¾¿¾fÑtó–®ùIømîî®f÷»&Ù)«\‚¼÷”`Þ÷÷w—ÛKýû –ìó„À£ žSµê?éú½Že™ˆü¹ü@/Š÷Ò'Á¨{˜©FdûeGJ'~ÝLÃÏEò¹Î£”ûí¦–ÿ}Ÿ$ýÂDÍguÆývÁÙšô†ÏQÿg={Èe0fr€o-c0(´ŸŒ€Yñ\bjVÊêàXó€#n/¢šfƉ>õÀ¡‘”!É P¡xŠDμœ{ÇQ¿Á%;J$ëÖ‰ïHctA\+¶ øÒűãR=4tÀÖ"3<d\ïÞ¨`P¡7SQ¸§Å •[/ç(˜Ú™¬ÿ—ýM½5ª;‚Ÿû³²i0–|†˜dªy aÐÑËÇ%Ø}ì$NN÷Tÿ¡Ȱb:¨ÃÖÂ+£NêÅ@‰©ùakÓ[U¢@Ÿ.…b—”†HϾÀž£2ý‚y*ˆÞ|_ñ²œå{‹> ’Ä r£3Í!)†ÿãŽI4çü'Wǘ¢@žKqÙ7*‰•^r*.­*ª#\2 O]ª +N/-ž ˜šQ!]V¥91èSÖQÍ5ì½|Fï’ϨYh†å{êùâv)ä‚êׯ'uš{ƒó>*å·OÌð •Àå÷N­Ò½åÚ`ÿvƒú\Ø÷cÎ9º0¬{e†UTXEõ€9=CBK ^s©ÍªÝmLÝŸ¡|¢g,€Ò4÷v¸pÿ0fmm¿”öÏbªûÔGXÀÄ™6|þõÿ9õÿ«7ÁÉ'×'þ€°Î?ô½¿>$ø­Ÿ÷¯(øÿUê?þ8ú¿ù€|¤û_ƒSÂöãC i´ês1ô$Þì¯J,Î>>ûmñ!Ä„§wÓ¸Ö»ÂìÖðA± {–smÁíÔÎÅ÷Ø¿L´Î>˜Qf¯Íªí@éÔ'æcUÇt¾çUep#9ÖŸ˜»÷‹•dšÈ'I§üËÈåsŸø‡àÚмžkF‚/ËÃ÷áÙ¢ÿúÓ¿šÊýË€ï¯/ d¯íáî€ÜìV’}!"/·€¿ýãÕëû㌈·üôÖTõQÿÛß)RLï·; q”ò¥”o/÷æž]šÇK F«­ÖöhÕÃ[;ßǠĀóqf¥êý~/¥d© Ðyê_­u|jþÍØtõ1xªáRÓÁοÿüçaÇ_¿ýBòíý!Í P!/÷û„ú勇03ËÑBQ;^nQûÞÉ$<ë­”£µV§Ã´×‰©–ÃrçSþã?~üíïçù8k@ƒ>ŸÇ­ÕêkíÞÌJD¢Ф¡üÄ“ IDAToáŒVŒr’0p˜5ao…áí"ÅJ‘®')±* †Zyy}¹·l`î`UÖÎY(7e!Ï4¥63QÀ©Iïeä.3í’BymM€Öš©‰Z^j¦…½a:Ñ®€{SÕ„w«*ØwÝ)¥¤ªÞÂóýä"µËð¤EÅ¥¦HŠˆGœç£•ž¢[Iq®v‘¿×YO=UDÎVƒ¡ªó¬µ ôÇÏÙ7¹½¾Ož{zó]Ýo·nUœµåS8ÈI•5ƒ³|5ÿ¦n”¡ã8þýßþ-"ÞÞß‹ÙY+ÉœŠ¥ë_–JDˆ iô—‚@¡MCPÒÇ­ú8ßÏvF°ô)+èž@5)Y¸aÍÍL¼U?!r”[V8FPlÞÂå8Ž£”æâ!ÇQþ‚—³µ÷óí¯õ=R¼ŠåÂÒ¨Y:|ev32ÜK‹÷Œ¤z° Ïk¹«ª4+"âîÕ[=ßM ¦‡&–M¼ÊäÈG$ªH¡¢¥ÉæM²@èáÍýV5AŽø¼µêQ,^ô¡TB‘ºªz3mgË胧£<÷óé5‹¥â­ÖŸçif-³3y†¼~{}}yùñó§;Õ"`]Í+ör¿«&Ý»£š·NupÏ (jWÕ—ÛËéõå~KOÎ7{·®ªÒ¥I{0"jälì~ÜK)lžw9KvY»+:͸،”=2 ˜I‹pošÚ?`frˆ…õ²‡Ó½”1fCZsÎãTãÝbÝ‚š04„ÂÚã„Á[¥šõL»ª†b©M˜.Š )Ðt1ÒÉtÔ‚JD±bF÷˜ðU–mêD6¤8[ÎHLCsº„u½)Ò·JU†”¬M% Öƒaª!!‘À •‚.dç „Ño¶‚"[kU¨’¾€<{¨9WAŠE¨ˆIeœxpîCfE_’%TF2¥†0jlIô…ŠÆFÍÐÎöYùÉÉM—5È|Z×ã©ÀJø„Ÿ@P Á`~vÑq¹ª6lœ«Rp‹Þ_’–Ý’=ç?sp%(nx ‘ãšþhÅÔÑG™Äþh™õCÌëtÖ«vÉ›ídÜõ9·ìy’*æðàòìX?…ûØWVÃÅF(Ê1VÔnUHðÃÄb~WL6¯â"7MEdٹΠYåë½F–dQýùÔe¾=qñQR¾Æ¶Góo™GùÜÖ<Ë¥?È`¨ßÒ¬>wåˆ<öâWó_[Ü?QÙKeþJËÆ¿ÛFýÿíÐÀ§ÆüOyüâçðw¼“ßú’‰…ôßÜëÿûìÿ{mÉç˜-|2u¸jߨ/®=Òõ¡5èãèú_b¶Ï—Ë^š›d^æKÊn V!t9÷‡-‰ý¯?™« «õÜÃË:4—DÞ—›Í¬«Ëí$ÒæD•N±q¯ÄžXc}Õ>´V›9Èi)ÂÓ4¥ãƒôHÂ6}ÑmÈ Õ‰ ]÷MEóÝÍúÙ ÈßúÿÌîß5¸á³Õ³òË·o/Ç "gmg­©Ãz´÷ÇÙZËü²Ë·óíÛ/ß¿ýbVÞÞÞHz´pœçÿýýŸ¡PU¨Úý~7³4éä+ô‘²iQSÓ K)y¹ßR‚4Õ$0‹ ‚ u2× ÓiÞ}ÐÃù“%ž. *è­9É×ûý(‡Q³"µãYÛQ8Çè¹sV E:3K6j–(É"qÔÔÙg=n·bE¡Þ•b_¿½DܽÕHOq 5EˆSè!0h—<¨«.K:•’NU pXQE‰pU4@"üvyy5ÓÒZöU±ž¹—Ûív»ßï//¦(ƒu+ל"´æ‰sîªÐ\*®m-"ÂãRö—À¨Ü¢?ÎÀqý‹Ý58ãfâ”bZL)ò`PÄIŠ•RJI‚Íøt9à°5û‚#Ž‚ÛQrÎáî*P +v‡ÿŒ– »KjgîŽÕ0bf‡š’µú¨±R’e_k}÷æÇ!Ç9À&⣷ Õ´‰WÕdMq4ýš­µZëyž}ž1¶©Ê?yG½Æ¶ßû0 ÖŸooù-oïïD ")G†«}o<"bÀIyÔ³„•Ã\Ä\™@Ò˜‹ÒýQ«fV´¨ LÒŽšr$`¦ÍcDÂ{P¦ZŽCŠªåvàô óC‘J׋“a1U0k10pè…D w£5­·Þ*(I‚b²@Hà0 E)¥ÓAØTÕJÉš‘-§Ò/Æœ!ué*ˆêŽÖ'ƒ2%-@‚€Þ­ªçãÑZkµ%î¼”RJéežªZ,y1ÍÝT"ëSZ2»¿”ãvy<ÂüP{ø#„¬µ‘¬ítz¹» Žb·{y<Οoï©Ó¾oÕÔ„Òja h ¨‰æ‘ê\ÆžLµßÓP4âQÏwôÃQ½ÝŠ©U£#¼A‘üðýyè,ù„ê´hÑ pç ‘q6fgÝCZÃMàya0Zs^î/$ëã4ÓŒHˆ;Q˜R°%™5ÙåuÓª§äyXqFëRYJ?Ëœtd „P+¥wB Ñ  ÌºNxÖ¡f‡©µ •Pœ~·P Mï´ª¸³yƒ–¯úr¿ƒpд@2ã@B<¤Æz£Q5:¤A¢¹`ʵ©‡¨@4 È©ŒId—¬v­±oiŸÄó^°û õB¯–nèµáVö6îë…ìÒÙJj‘}˜ŒÙ ) 6<ÂmI†QDП»¨?•–‰@6èr­~æÖÉÕRXÐýí»,7Zˆ—D;L½Ü(#ù`é¶u®´ë™Ô<1ÐóðäºH)¢Ä8ø\½ÌÜyžRt Ù"žpž”ül`'u¦š"ÆtÐl%¹w2múj[Ll†ò‚à¤Ä0álí‘ãjŸÇ9¦¶ß€g¼Å ãúä»,´<õ.ŽsDGÜDÿI]Ö›^Ò˜¦£nÛçRPFyïD÷Dô–¢‹ÿ™$}ÑI®€ÖqxÇhËT÷YIßÞ̈åMV7„3ƒ3Ι9'[õÒcj‚Iïaè²|õΜulsÌ?Oinpk G«éaÖtÏö2ÛoÔc‹k#;Mô2;Œ9sœ¡t.È|¥ µ—V ‚ ¿„Áe|e‹\#—XƒŸÞoV˜5>Òy›‡½_f#ïSŽtHè¥5rÝt6|Ú_Mâ,EG¶cž¾O™sYl+b…oÆÝ8†pÍÙüÝEþÔeuÝyW<å·Ùxœƒ‘¾ÂÞª¹"#k’½€ùÛÓ¼Ü8Wðö)^ðh»ÑðZR:µ~<÷ÇÎIà&(.}úúýØ|rÜĈîäz|Ê阻9oárRf¬a©²è·Pb^ãXh"!Ö}tÎÇ8H@½SfÏØ/.\LÇœÍs\9ÙtÓ 9Lñƒ™ßw“ÂÎîãŒyºÄ“~ˆaVÌSI¸Îžñg.+@¾KaÿT&Ümå± Ÿ÷ø÷ÜùuôÂd =¹± Û1f7¼ +vy\¯¼ª'öPf±ŸŠ—Ÿú:ð¡–\™Fîa|¡ âCˆb²É¬ô¸`#f vcú‡€»lµ:+N'¸¯Ñ•à³lÆê–Þ›¶+ôÃAÀ¯*¹ÜÑ;¸Â‘0t³'>È×.×'õš_h¾×Âp?!|!€þ× ÒOÈˉO2ÏÍ*¿Éÿ†\#/€ôGrüç+ø¿ç`ÿ‘3è_ëþýú”üùy2Ä<ƒð¡jXд'ÜÛ5XŒ ûþó_ïIšÇ‡>«qãÞZy>¬¹Ö7:+•07ª 者`ö݃?“3 ßÛëu‡œ©b¬I!{çÐÄȧ1Cuåñvo\¿%êšÏ2T”àÄ ð–›.îa^×=óNËazšÌõjï‘=y({cÂS]ÊnWÛxokü®÷¿ÎZƒÑ¢㯿üõ—ï¯Ñüííñ¨·÷ÇÛÛ›»Çñr»Ýo7UÊa%]“·ãx}yÁߊ+¥ƒÕý<Ï ßÞÞj=÷öæ©õ©ê_~ùËqj0³ã8^î÷æþ8Ï» G9DÄÏZŽcQ³ÓKQµ\ËË¥•‡šFþ×Oþ?êÞuI’ãHÖ45󈬪HÎÙÙÝ÷½]ˆîÊŒp3Ýæ·ÈªCÌð,"®¬Ìȸ¸«©~j¤ÿ¿ÿùK²åMUîg„)¶mƒ6#‰r+Q-ªÊ>ºЇ‡ªn[‘ê<¢†}Çao_<ªPý䛇p¹ÕZ«;T‹ˆœ»¨žÇƒ ô/¦zzl[‰î‡ôv–µÍâ8¿ßÎz¬µùV“Œ”ܾٔ&+e„'eH57."÷ûûãñ‘/_¾”²å¡(¥•u»×©¦a.QJyÍIÛîyw„ºC²ºƒ*”‚ˆ¨{sJ5œGne‰”¥²¸löZnû¶uK7y”R((Ū·€lxh) öΣèˆOFÜš¼tJe-z7É)ðQX¨ˆ¶9RˆCTtSs¶ú‚²ÝJÉÂíi©A–= –oC¥` ÁÀXT=ã;¦éôäþx<ü(‰ÏÚoí::"²­U¶æ±¦‡'MŸgMX1ƒfVŠyD‚›#"êéµBPÝTwº[Ù„<Ããxȯ¨^O¯_^^ÏzÇÃT·Û–»ƒR6’û¾Éd#<ððœÌikb5µlãH%½x­ÕÃÌjDÒäÝkö GõÃ}/›® {°yÑS“ÍYì~Ö 3ŠšÂŽã¼?˜å¡*Ä#Ô‚ÙU-"”­lÝf˨¾©™ŒP$rŠ»•}+„ÖZ(<ÏG8y»ÙÒü,d#™õÕ@¢¶…<á–‘r+Á€©E qHªqQËZˆç=-­úYòádŽ‹`Ka^"½gûkk5èL‹¬ ‰^;0:{» bIÂc(›Ý–«–±Ž&j…îùÊ>îò`3³Ž²(»!—}ÖØôòQ-9Õ?tfýZGÛ íëaûÚ»D:í' n’ýR›á~l¯"‘·ˆÛÆè:…D//V .êó¦`€B’1°ÈUŠ…¤@Îé ‡¸‘ñjÙ»ŽVï’¤?aˆó„˜H„Iok‹—Yë2ÔYé_Œ:R,ÚZo¶å`ä̤¢õ"¤lŸ¿hl-ÆdÈ$› Ó"1Ó½4“Ã2 çòD´_Å ,x|ØE*“ÈÊóÅ"‰E„[4ë‘<£Üøº‰šN W„ò¢ÌÌÓo/çœ` xº:Ú¾÷ü¾Æb »Ø/ŒÅ™>(¸ €ò«ë/8ôîvb.é—FÏøÅýÓ-¡ªOz›í€¦Ó Ë&aRÁ'ßë²—”ÉDZrë™Yá¸xПã}ÏŒM[ùxSrÛÇèSOô0å4^Ǹcý3Ú]ª»û¶ï’ a ùXû½«— £'8Ç@ŽsдÀŒò}„œý‹ØVÓœâºÉéºL¹*\èÈ£®¨ÍrêÕÏöÚðy^~3f±ìy97­}g‹!owžF’,ÑYxÇÑŒ6åˆö{Á•Œ¶ˆ›ËÈgõ‹[å5OÃbߟ`ù™JÌßsÓË'³…-O ’Sü¿PÀß°õâ‡_þw«~o4òc¯öç;ÿåŽÿßÊüÁSá»È½Åþÿü¥.bÿ•%÷ôçø˜³µf «òx÷/öÿµph®b¸æ|®t³…F‰9&—^Ÿ2R—7@RÔ8T—Çp×4±<ýr—щ˧Àl0’¬¯íŸˆF £ëù¸Lž{~+Riw@]&'KË_ §óhŽ[ôš¯Ò§ÕVïhŸx ÿ/‘÷QÙ£k`êzÛäÇÑÇþ[¿¾ß³@Ò´Ôê_¿=î÷÷¯ßÞïïïfÁëëÛ—×—.ÝÃÃmÁ^É÷ãÁÇYþù/o// X8#ŠYÒ«…ï÷÷ÇãQJ)¶åìÇŠmÛv?/¥le/EIy}µÛ~»í{DÔpaç {DGf”’Úx‰öæ(ad@¤$¼¾¾æ¿I¤[„žnc¡˜ÂІk0ÎãI‡ö²•RÜ]­0y5Š_ùÇ/¿üš§ÖHîÛž-õ¬ÿë¯?ó¨¤2²×J!ÂÃ¥Ö A•neK%ÔÝUaV’-~œU-ù6"d)ZŠ©¦çqµBÍÕ#Ù/ßÞßï‡úË__^_o·IAFx ÿ°¼ü4û’Þ*­Œ²ÝG&TÓYɨ R{¿ª+iu¯î¹dW•b:–:ùëá¹f>Îc\§çy¦ž šª¥”æ§‹V$¬:‰ÍôðVô ÊbÚ78mx fûn¦â,VNçðëHƒSTÀVЧ„2¢²Öð—×W?+m+¥êõÌOÔÓ‘ên"çy¾¿«µîÛ¦¦9u,eŠ~)ªºm[³:FlÛvž§È‘B@Öl4—¯ˆª¾¿¿÷<>é—{ vólïmV¶-eˆEÄé§3ÌT‹b@­.$Œ[1Ó·ÓkîÊ+âí"×w¦â¬~æMÇ=<"ü”¢[)t?Ýψ¨ôD†­eÅ;o¤—säG£PÑH¼JF:ý¼©0$ÀªlÆ3ˆ\ð™­C5AdV,û0¤5C6 G{5Á¾—²oçãÈ[³A¤)!0ºg›b(p¨*¬”4)¥(äô ‡ç·¹EKÈÈÓƒá§W„4ÞvŠF?q¬˜¢@¨*Û¾ëfá^¶´X·m»íûVÊ@·œg5ƒªµè3úÇã^¶íeß7³¯_¿ ¥V‡Â=-›RÄ ·Rò¢H%ùåv;€óýK …0T Ñ(tùý¸»(…¦%MvÁ°b·ÛOB~;¬^éÇYëyšHÙŠ© èðÆÙÕm«áeßzý8#¨  @Bé]ˆ‚*JЬ˜R(†m+14§É­ÉÍUo­æzß,A=ßÞOæ9 ήQjÐUZÈ1±Q5¸™l&‚âõ^UµÁ €öP%gx mH¤’£+θO4«D+/iw×Ön™eéJ«7ßòøoÂ[óp•b1€ˆ.­.€¶QoÎMµÿr ‰–TJdOÒpßiçfKï³LsƒN „­º¿}YŒÍx†´Ìn†>ÈÈÚÉ®hšuéóФèo7Wq­ê@A2ƒ,˜;¼ÂCÐW2+}Æ]Dà3sÌ –ò€‹ãî“iöÉíò*Ârˆ¥ h,©SVޏt0^tä6ZP2èQAubÁtjwÐL O‹ë´©AêË8™± _<·Ç­"¦:Ævn)Цœù€™èš—1aÇrÈ¢Ñ÷ 3W‘¥a ð¤:Îó+/H~—ÈF&ËÖªëÎyo/€`bþ³©¡†p}å6×—+?j¼Ú`fIB\ÜÑs’Ðk[Z%$aS"ëÀh™!\>¬P"ò”o ijS8‡äáÄsËS0bŠÎÓÞÓ+pªûs9aûûÚ”÷{;GÀ|M0´ó|vª.¼ƒÝBuívÜôÿ.TaçôaPÞìú`H¢X;Ø@ãµí-š1}÷mÙVëgJÀhe¹ÈØ\ÙöˆX/—©ÐlYäéû]e,dú¥Ñú¹›sèX9»{µ˜&XiÁSMÉòJ;Ÿêû'"áõ¾=•‹ö¾;]ïµ]ŠKdaõPB{’rµ˜Ïò¡±v™`^,ã•–i.ÇU4™ÅX;Éó¡¦M®'¢ˆ×–~õeŽˆ-ׯ¬ZTòâƒçj÷CLNÏô§S–βò„^'gyeûLbqƒ¯‚ý\P–ÞéÓvÉTŽ)MÛ@]ƒË\fžz½ÏaþúçêË‹þ4› W$Õ~aœpf …OÒz[ØÇ1ÀŠñÏkÃ-¾#GÏ{¬ø¤Oä[ÎÅ€Œ!t¿™ÆeŽqô=qsx‘З”Ƴf¾NâWoìør°HO£ŽfýéÙ½$ÏsuÁ“ÿY.Üìß—PùÇ5c<-f>ëŽgÿüåSðGU~þ9:öwÒ&¿­Úÿ¾©ÿÇõv~PÂñ¸Ð÷íÿÿdà_1ø¯Øÿ?±¯ÈïÌð,Î/ãC|6ÄwëS2@díøùdŽ9N!RþâÐ\%íÑ9æ XÂy"ó%Ö¶L”\F.ÇŽ¬/ÁòélËãÖº2~™w_÷Z±¥—N¦l{0~6@æC¤76õ‡ æ”%oÅègäÊ;m擘6–¢—|Õœ:pa—ÈuèÒÿZûº ]øaT:r~›øÙ¦óÏN<G×Þ_~ýõý~7UÛ¶ÿ·ÿõv»™jÇYóqœ©/©«ˆýË_~z{{͆€—Ûžƒ//·ˆ=;~O­oúöåË3 Ó˜Ze=Sˆb[jLffз—×}/õ¬q2Ü…Mµm{­.ù2ål†Ùtx iC¡¥h­ÌVáÄÍl[)ÅH ´=»ƒ §ŠiNÖlV$`Z ˆ l3ÕòV¾¼¾|}¿×êµ5õÉqH‚»•òûãEqŠºŸ‡‡qÛëk){œGòI#ç*ª¥l›BÈhœµVwg¨kòTÍÌDÂÒi¢8ÏÚå dw˜ôöúúö勪ճ&gUQ*èjUîáC¶mG‰@jQ‘´ú ´˜Ö“=»5$©@DèB@‹%x¡¨E8—æñJª»‡×êº;…5j%ø¿Mbg=SO ôY¤Gl¥ä#ªž';³³:ÄE-݃™ÈY[³¢¾|y‘xœõ™¦ÔB ¢º§ 1ªž©øK6¢Fb¦Œº•ñUû¬¸“I#¢£™ZÖ–¦­)(Âð¨áq²™²cmrH\!ጲmPx’`F|?k.UUÄÔ¶Û®ª5ù) gy‹Š.âçQ}ßK)0XETH)vºœ£n;ƒîÕ=2]Á!h²ZrD¥Î‡éæQ³!¸Œ ÕÝ«›©Šȉ‚z­9û,Û–é úòöòòZTýöŒênª·Ûku÷l¼Bä¬5"ÌtßnÛ¶CxÖZ´!¦û¶{Dvº5w¯^ÍŠªªZRçu¶åH¤Šdô§¼YÖõQB”Iº‰n·íeßõ[ùûþ=g///š¿À #kšk^0E UZ””ÀmWAöª¢JsóŽÇãÈA`FvÄÛ~¼À(J²ÞßËÛbHfûÚC¢v’ (PÉ òÙJQS;^Âk„x=¬§("¯d³’™‚`¸£´Xñ,\' IDAT5x ‘€¶[CS½‚%ã&œî}¿žânRù‡¶9Ö=ØxþÚöAÁºçÂ4ie!è¤}¶d¢ÁEŃ˜‹”…¬ž z÷?Né»fˆ.¯š—°¸DIÑ`kËH½¿÷M–.ý  ]¬ô#}0,'ú¼Çäœö‘ƒÔ´˜ŠÀ!ÝÐ }A2V ˜Öƒ–1¸á¬"¼ˆÈ]Ù]%좘žØåìÊ´êÚ%@~ào¥r±™wkyû¤ ˆ™™å9¿hÜhÂ:§È:@F}蕃.ÊE@ìýÊìì”uò*¬e –£A,ä¢n·'®Gk›è(È™X¯Yg0cxÐZm1dÍ+YeÉ\ òyžú"žŽw˜}£˜ºÿ‚h¥·½X§|¨²T– ž¦ m›cff9Ñûè'U}i=Hgs éDœÑ8ªc«1DÌŠ rZ9N©)a.¼½©uô{bH‡àÍfàê¬AåŽç§zÓQÛõÕK—ÆÜ @¹8\û{üº„›õ[2‘fv¡ñ‡‚%9<æ eñEcR_— ÉárFˆÈÔ ö®@°TºqÕŒ}Ŭ _/sl4æÏ]×[ÊRx™f^ű9Zƒ ¯øÓèq¶[¢·¨:Ÿ'r=©¦ç™\õeC¼|«CnmW®v›þ3¾e»>kUÃþOÊÀ1‹xW™ÍøÕ>\Æ]øàð{KKÞqLHÙµ¢Ó|LíDÐüF3ŒõeHFî‘ ôš J¬’è3$^PSä‰Ñ”>GýE„Ôþ[¹Òiˆ†, \…Ü© ³—æ£KùéÌé}ÔY(5\³Gc7~2¦+>§q*Ë]bèˆãò}ä}Ÿ%V³å<é®— Æü¹8;ÚaGj-Üå¹’†órýD˼Э>H~ë!{Š'Èuº±LÁ„«V¾L¿ù 0çùÆU›½´_ÖåÒã:ùXV`\åùËœò™Ö¿ôx.7¾õƒ|"†ò) €PWŸXØ¿+y‘¿g•çó+ó³oú»jþó‡¥e>_ÃËHàÏ’ùáàC  üç_™ÀŸú#øŽýÿ3øÖ‘>,‚/©Å‡¿ŠÎÏ[ÅëÚ¢8]l6ë y¹ÏõDïÊÃ\‹ žÓ 3-p)…»¼¿cÍ¿£›íûÒ‰8Ô™šF§eðÁ¹–Äf.³…Ä·xnFJ~t.ÝÅ\j"6›E—€‰Æ\{æŸ*ðÉîï)yö]nåZ,÷ý6à?s P¾}ûVJ1³Æyžo¯¯o¯//ûË_ÿòs¸ß÷MÝS/]$·mˆÇqP«¥PMÊ×÷¯÷ÇaªÅìe¿¥×¬¨eMD­þþ~xmßÌ’ú+$+ý×oïú¡¸DDlVÆ6»u·o%ɱTŽŒiçhÎS…Ë´ÝqžÒjÊf€‹S¢MŠÌT‰³º6ίKºÍÜ0 ˜DÈË~Ó·ÒÏn©ç+éï~Ùo_ß¿ç©çã ½™µ}²ûíöÂ}÷4“€hPÔ 0µ&M )Ü‹B5 ¤·× ÎZ#±¯Üï!Þ¾ü´•A•hÔeÆ^0ÙêE{ ·–bˆdܰQúÞÔÆò*@„$l·˜AM€Êã %„¨NQÍØÆþÖ†VHð´YRšYÙ¶%S=«ŸÇ™ßì­ì¦Æ`UQJyUxõZ+€ö:Ñv–»@q&‹Z áñ-îbj[I=/jtjËëõÇY±­Õ£õ”@ÉÃN2"cyyçõ2hþ¥”œ0Qèájf[i—©‚.Uö—âµ–mÛJäâmÛjIUË…mÛÏóܶíååe¨9&É3XDqÔ¦êfGRyÚ^7×Ôγãâ-fEË¾í·²oªÍ7âÈb0•ØÔÂ}Ûöô¿{==O¨©)„^Ý‘3ﲩ"2M)VE³²X(€¨(Q̈6 É}Љh"…*t¨&¹¥z Æf ¤7HVòn ¤zDÐûþ{ =DaÂyžG­žÉ%÷PmÎÆ  ±¨53$¨$ó›~<ÎãVö|ª¤.LC´¨&´=[N ‰MeD­gÔÚnLÖ ¹”²‰j߈ô«GgÜ…r?Žð0S¬¡E\!j[´úy2âô*".(eS…¨ŠdT«mÝ’#=B¢¦î^ŠiRñÃS4?¡ ‚¦ ß ³Ìn˜çyæÍ:ªçC³MÁÀ4§2jY¼`‘k ŠmT§Ò¼Ég.FaRüU„ÒÚ/%Ûjõð0J¨¢eÛó8pV}ŠªÁæÄ±îéö«œ^‚À¶ ÍŠÐγç#Â(£Â`ÆêRÏóˆ¸íž• P$ð?dM>ªRõ¼6ôVvП¯‘A¶þMˆ¥Œ¢­b„ôqn났–BŽÚG›i?ÑŽë E ×H6‡8ŒT‡[ƒÍx]ݰÕÇ[*¾Šq ¡o1—HãÈöé€[v›ªM=—½2Ia¶Ä¥©Â»£ëv9fkz_/ r†Ì€Pò ¾Š(s µN“TÕu¹—QÜq¸´‹kC¾—Ï÷srÀJìBt_?ŽUÍ0F#yžDÝœa†Ðƒ&ͽZð†”Ì«t}‰ëv1![6’>“^Oí°qv%z,ó†¸ÿäj´%ñÜ{õÌyi} ›c˜ÒÊÖçµvmD¿ S†Ó®7Ü®õË\@»ô?±]§Ò±z–µH·÷C\*¯º@GÝçåR{=¤£8¾Ã¡žõÛu°N5ÑënåC„ Ë°2á@kÒžë°£ /_W½"Ÿª]µoÔœþkÒ(ßX®ý‘Çiþ– hm1&Chn] ÔM¹hIU’ª–<ƨ—^>xÿrâƒBÉÖL8j: ,f“ãuÄÞÍÃIdz2Bc7á*g’ò‚£×çöÝŽ¦o­-køl‚Å2.U$þpl¯—Š\, s4‚ËÛŸ#\å¯öÜ^îKî=¹v}0áiX÷ hºÖ˜ÎG]“µBÙæcèCÈ0‘p.ÙÈu|Ї„ÓÇÑ'šKK3/IEᜣ= ¸Ä*ë^â>3*°¼~8M®³‹ËxSä) ð£u´¼p½Ë”Ïçwòãÿ™H¬Ñ–ÿåš?è–Çøñ¿ì·[þ¤·ý›_ïÿý®c|ïç.iš¦~<ù¡ðñæ°ø“²ßåÎö¾ÿ'#Ê5á„fs>ÇMë` C)ÐòÀ묀ýæo”%ëYÿ¤tÖçÐÜÛÞ¼Õ=M#ØÒ@6ZožœÙ·ÐUÊGAñ°nµÇ®¢ ôðÕ´?öÛUšk@×üÞ°@ŒÃÍ%*Ð7†ÚWòWá^ŸJï?ZûµÝªñ4ƒÓåä;ÍÀÆÀív{}{{{¹Ýþò×RJ*áiÐö`:‘S…´Îcɽk6·çñ.bf"RŠAµ¦1Þc+EÅJ3Ú3 zÛ_q¿?~ùÏ_ʶeŸ§{4qŸ¬gõð­le+›•Åi%"b¥ˆ°Öă#r%˜Û ´ž€ÔU¡e+"‘¯™U­½ áá*šfÕÔÉs©{ÛŠ¥(a‚Pn=¹ñqÑ jö‹Y)i09Ž£@…,fÛË_¿þò÷mÛrÏ@A39šôª„÷û¥æ~­ES̘–dSB=¢HV©•Bô<Ï”ªÏóøöþþóÏ?¿ÜnçqÖ³ê–=»–ÃR ÉD ƒŠÀ#6Ó\MV2Ç™;¸*‘è˜4¯¶Íz´!HÉ’ŠîTÉÖ¸æJdõ–Àq¶¨½p³3ë‡YÙ÷"½Y áäñ8‘*Óí¶I‹Ðw2Ba¡‘Á‚RÊf*J÷€"c!¬îq<±o[K ewD¶;$°ÆÅ…‰¡±}ËK³z5Úãqä (ìpçmÛJ)ƒé¿â}^n/T¼½½‘¼ßïùõnÛffçyz­I¨ýRê•Ô%uÕ²mÛ¶mÍÝQS8NÚ@–Ž[a‚ã³[µíGºsM‹*@±±½×fU´ÖcH¼ÜnfÕ߇tp@bÅ*!*„ª©n¦ªö5µWUe„•Šm+·ÛV "RY«3„Áðzª¨ )h_Pn×£ž§'ÇÇ`ÖiÄA6´»©‰Jxxu$qKAB!k­ 5+gu÷“!1àË­ÍXÃZg‚»{­y‰çŽ(½¨L[¢ T-ë#Úd MaÓ"Å÷œ ±X2âQÌZ³ˆÉ^ ÌÒÂ"0ÔZ!Øö"'£5b7IÉTUmÛ¶g0« 5©»gÔP3¯žbå৉7yêC‚¨R-º—Ò žrõ¬g=«m<«rAîÛ~Ü(Û®d¨†xò ºDƒã<ȰÄ)Š•bf¥ä£úñÿüÇžµ÷û—×·b;«îR¬”"UUÑͶô«v›týF±âUÚ8yÂFŠ& F'^èág­afâëí¶7…yƶšÉi< ² ëú‘JÆzç«ÁBÂ6ÛqK†¤äÝÂϨõ®VL›ztº›¥°"EZÎzÀUYœÒ°àî¢ÖjÕ­@¥° ¡µä¾kwp"‹Ai­3jÖlîíJµkebLÖrv¨çJ´ÍE §§ø è%ŸØS¬øoë›T »y¸v§º²8›…•?›k-ĤT£»Ù“h|rŽ+´”’³ç‘šˆÌê…æA@M°nóSj>?ÃÏÄhÃí‡m3Ø„“5Ødãt*Ñâˆ]15XÃè9«^íkåéS2àº:oÅ$ó¨JÄÓ ~(Ú¾Z/ט‚v–ÑBœçÓî+Ÿh$iS‘ÉÑjf¯¯Ívû ´жÔäŽw®ƒ:5 â-¢„K¤öƒY —^çç·òä úÃì‰õßy‘¤vG´QÕ:ôŒX‚ ƒn?z(’Q˜šY9Ðn\ @+h§ý–ÿÃvY5fé(Žðµ;`œM™êÎf¼Çª¸p‰“ŒÖÉ`$&ÍÝÝ#¯#Ðæ© Ëo÷Ö0ÖIÖŸ8ùQ¥Á!µ½éX’Ò;ª—rl,E–}[ý†Åõ´—Võûá™`ŨE·‰‹mÌ|ˆçËzÏb»B‡ÎÆÕEss;ÌòX¯5^}œ¸&oxy{}âóAúÂ^=õYç5;FE먯åtÛvá–`,'¯ú+ÓE¡&/‚9‰cZ‰müˆTi³W.Ô ‘ÚXRj\¹õË”`¼ßQ­7ÈÙ§Y%³àB#á€(çÏu*ÂbÐG'+¶¢³|v‘Úî}JÇ}îÞÓg•ÃŽî.sÎ"tÃÊUÉÚÂÞÝ‹ep+ѤŸ ËXiÈ%3uõvOÍfí–qV±u/=Ñúôíòj+˜ƒï‹]—’h.ß- Ê>Tçúß–?Ñ&÷Ÿ©ÓÕÚvx ´^Ÿë§]° l„É–’§£6B3!"äü‡ÑáJZÅì9<”™ÈÀ(‰çÚˆ9‹=ž®ö­_¾‰ñ^¸Ëçסâg¿ˆ¿«ã¿Ð‹Ô3Ž.?êðÆDá:ÈúC2:¿sÒ.)ŽïÍßmýý-ñ?aÿÿg†¦à* ð”Z £.2.®âûª^>¤„/PÒÏ .Ÿ•cÍJ-c½ü®Ö€çt‚ÌââªÖ·g».¿|ÛK)ð*êv“Ê­-tì7Ûjx:âGU@—Ò±Ì"“G¤`Œ•ž.ÇOÛ£ú|ÁˆÏQ.0}KªX–4h…cìŒ5÷…¥qsn8žú®df­?d¡žJVÖÓï©#a.Zx½-ðC èOL¼KÙâååÅÔ”µ²ª™™U 15Ùh:øÞ2+ÇYS€~Ùo÷ãñן~†ªG¨ñ§·/É@ŸÍxÐJDõfý·{{y©µžîBCˆˆ°­Üìöó—/Û¶mf§{­ç·÷;ÉR,™ §×ÍÊf˜›À¬ŠM0L±¢ s¯ î‡rç(g‘÷û{î> ¬u¦izxH:UÑ<&mÐÃæËNtePd³BÕ‰ô; …üòó_ýåïe³†²U½W>î÷ D´ŽÜÖ¶*„ÀT¤‹”ÈÂe6ÎA"68ªÛVö]ÍÇñx<Žc¿í?ÿôHº$™¤ŠÑ±§š$XÝ!¬Õ»× ˜•܃¢&‰ˆÚ÷¬jÚã·$tF+î‘T ‚T“щµV…0Ĭ™îÏóÌriº(¦Û¾—~þ¨€ày<Ò\FwÍŠ(âŒ`øS‚aHÿv¬¸ ”Õb¦û¶=Ž*÷êõ<Žó<_^^0\öŠRJۙ呤4 Æt ¥Õ·üO›YIrH)?¿¸ó<÷Û&Ùø*\GhÖ ž’S¢«Ý’€Ši‹5©†ÇYë¶meÛ¤! hF.6Ë,ï÷{„o·Í´$ƒ¥XÉj¨ÕEØì® Ur†8ÝLóòVÁ²5S6¬M&Ž7+¥(tq?!(ZØKÙ¶í8«{M{pæW²“W ÌdHzb­™3º‡kä>ŒÇYQOÓ²ï{ë¬V•VÝN³ÑñÐ#gbŠÂèå–"”šŠšµJx¢ß˜©U•lHñÊí²çìdä°ÅÊ¡–~À¬(jfÊ *M·Z£XÙ·òúú¢f ržÆB®hÖév" áA‚! 53Õa™@²¿WV é^Ã%º—MG­ÁðLQL¨5ˆ¼žõÌ[z1;ÓD6+b·(„ŠJÙÊvÖcß6+Û†b·""ßî÷ã¬Ü·­h1hõ3N‡Y)¦Ø–1}{š¡FÛ3AÄkDñ(ÔÃÝ«$•K-C!ì†_Õã~<Îz–(Ø6 §¡’sÍÜkó¦I4ú>gÆi·²ï%“¡ƒæAŽÄd¡f$­ÂáÕýÁbªº””˜ÙV j*A¢ÉUÕ¢ cÔ¾Þ@h€9âRK}¾”\ 8£uѸ·ÆìþXR…("TÄU:¼¯ËFk0¹ömäÖJó"]¯OåbqUÕˆ„ø÷zŠ=Ö9DÓƒ‡éjÍ׊é›oé~Í‘Ì|d³­¶Äæ¡K‚PWq.û‹t¸“áÃÎ;p7‹]zÂïd­>\œë¦š¿%)JZ¯µŸq¡Šˆ%BÐD”Þ,­O[áUúXU¬þ§|ÿ܈0üëÚu˜|e"Õ± Ü‹…™ø^^‰/ÈbP]$ò¾N÷nzž’œ|¦þ¯oc¨ê³¾¸cmz‚!Ö0¯þÓkòÚ±ÿçè¶ž®›ë2¾º„Uçš]d UôëkÜ:êyE~9`:e›í:usUˆxÄ]sÖë34I9ó7½Î–ÓË;Ü×QèÍŒXdv1YœîQ¡ˆHRS›IŒ]f:$x¼ ݲ[kX¨ØË¤GÍ+Ç8±I:é6hݺ‚FäÇRÑm¿ãT¿ÚÏs’2OwLNgÃì•‘uÒ×E½OÚ¼Ù\^_(»lµÈli^}ùÏÖ¬¥ÔA.Ì£æÆøW²ÔÛbøß›µ~¼N1ee\'³Ø!åå&⓽ª¦·Œ èâÖ“§«µÆh–´Ô£m„§ôBo‘ÙÇ>á7œ0tâs§èÕN>mÅ«åx)µÖ1°f¯¶™Œšù„b¯”i­Ð}ö•_Ñ£0­¡ŒùEB2Òs½ÃŽþƒñ{ñËTbû^‹auV/SÇèE œÊFÌs›X˜U­ô™\1ñ}²Ü®ÁÕ°.œI˜e¨‡ö©{CÐH0¬{®ùÏ]\{~—öG±s\&E)^ª®CƒE[!tc¼šËÄ©^Ô´U _H:”˜µ•ýàãâm~ê f ö¢×Çœäõ»Î§J>fWJ _J\kn?Suù”áI¬T襱¹k-³+£bâÚSÿñ‹X]SZÄD<¥–ÓàS–r)Ö^ÀÏêÿ´?sÊås,Ð’…ù;2ºÈÇ÷óÁpÎKFá³ â¿]£æwæÿä¯ÁÇ鿼~[ýÿŸ°ÿÿ #ø¯þÀ÷»ëò*ý?ÿ‘ ¯ŸCä¿û‹úM&Ó²×ÁÂå,h› b]Tô™~¯'#r~¹—w#þš4ÂeO!k}ñì`ÿ—¼ÒÑ»mÚšß!6þ{bœ?ûÄÝ2ßp®~4Ûc›õLD¢ÛüûdûRÖ3ݱV™÷ÐíeµóäG ÖÉMÂrïùÌÐ55°ž=ñYÞõç&þýÿø÷———RLDã!‡·ýf¥DEÚm0:¹>e€­˜©Þö]UùÇ?^o/û¾'ÁÌöm«ªçyÊlñzUEþío+f¿|ý¹£S³ˆ0µÛíöÓ—·ä̼ˆçùþx0¨ª÷ÇãqßÞï¯/73›y­kýùÍÊô™fp÷ž;¢hâìê?R½[‚ õ”žGWoÆÃ#Âë)TÕ‚ðæõŒ¢ffŬmöØRªZ£”r’ág"<Ý¿95I\O6+’hßE´û[P¡>óqlûN‘óq”­”RÌʶm<ât÷ZS÷Om.u„èdd1Óˆ8£ò”Ñý;"I a oÜ’l÷¨Xƒk•âÕk § û~Ko`Ö!¨ª b4~ªæÀ€ÓÈŽV2€vQB‹²Ï;©Ý"÷ð¦ãÑØ­¼ ¸WËV²·¶Ö è—Ÿ¦»0´”²m/·—»Áˆ*ñhÈò6J--²ãAQJþ6 £–ÍØ Ž)Š{bdÔL5 0„BzÞ´DÔZZ÷­äÓʬ4ÕæÉ0›ÖeUµ`ÛJÙ6F¨ª ÍÖ Ï$(bú²ßöR²á\Õnûí4cD))hwOØKŽ@òë÷ åI¦æŒÄí7ÑÓbåõåF‘£Þ2Å~г–9+ÕÒ{\½ª"K Y(DKAÐN75ƒ•mÑÓá?*„R=ë“]‚ @¶ÔЋimb¬V¯¤Öã^ÕPTa0Íê… XÑœ³¨j~¾lM )µÖ}+¯¯¯õ¨çqç¡P€nÖ96Úv0R*ôè#“4Е²QÂ÷ókM&yêÇÌQV)[ÖoeßJ†—°ŠÚØ[Q<""ûR´£Ç›A™ì°ÝVžâWOúw¬ò¶k œõŒpR­ä=;ƒa¤j/»f÷oGDø^*F»>ë:Aû„¢é;A¨y³/¨– HÇú°·ëª  🬳LŸ^ä¦f  @&ïÏÒ)ŒMöXš{#äÈ$­U ³;PCÇw‘Bx„ ¡VúéºwÕMu±i·â.ö™n&‡Ÿ93"=¶‡lUžX}‘ÝàÊÉ!m£VÑ¢iè7€Gh6ß`Ôu·ß1‡ñ ×#+Gáj˜ëx,›=lˆãytáO¿.=ùíF4M[3öUÐJ¼Y5qöò¤Ö™‘*¶i<5 è üE[Z>iPðô>GzJÚ­¸Ž‚a² ž8ñ U© GcذŒõÚ¸H>Ì(FðâéË©•-§7¢-t×BÚ%IJ|´ñæ pd#×YÅuÚÑÎŽ ë3€f0‰EàæcÉ(ú?ÕM'} Qk¶]È `ýÖüP6ÂFy'vö£ç`o)àL®t`NK~Î]H\Q9˜®Ò©õ‚i®6¦µ1äÕ±8¾W<ÙàÆ˜h¸¨×ñÖrâ ùz ðQ7Ësn.»mralc¡ÒôŸ¿ðt.†B.Ú‹ýT[•66H$Áí䌾u_ÄûöV‰Øoƒ×Ó{¦Ëu0ýŸ¦Ó d]åž%Ãã}r‚é®N¿îi'.Œ›Ïb@Àèø}†U_$Øîéï©¥im½\|‰K·gLâÒ†ÃQ-Ó‹ÏGe 8´ÚHÐGL­»ágBkVÜ,Kæ¯f½ÇUî­Ý#[Äó`sùРö.5Yàcæ½’¢¦†¯2æ’6Oj ×VŽƒÞqݱmôà‹¾ ‡dMÆð*æsÞ„»äÓuýOÔÃîßä‚H›Úf…•Œ…Å‘•û w„תŽ-ø*>±4VÊø}iiw¶yd¦Ÿ~Vªôw'ëæ˜²µò†V¾ÖϺ¥È‘óêó˜x¶–óÓ¿L.¹FS>J»òĦA|Ǫ¼@ð™ŠïKí¸úÿ1מÕÿg‰ŸõÌþ†ÌßµÎãƒ?ðÊmŽ‚i²å÷ÕÖÿ‚‘ÿwÕoüáÄï 5~XRÿñòß9J÷¯ü ù?ø3~n½¦>ñ„ÖGÑÏöÿå2Ÿž–+Âþ#G«ûÿ“Ú& 4˜ IDATç7»¶ã©>ãV×e¨ˆÉ3¿ù¨l<ˆý_zMŒ¬ý'¹ÁTÌ›OÃà.ÞLÀªÌXêˆÕ2¼—Ý­Öž }òrh¹EÎJÚ <óDÿ1¶'ýÀçy¶ä®)R^ŽõXœ.Å×äÄÓ—ö÷zz|ØŸîýo€ÿûÿü¿¶b$ÃyÖ:8æ#>-PÕ­”Zk²8/–óô7Û2æ2~°Ñ9úéÝF]ý‰l ¦@af!1f¯¥l[):õ‘‚zzЬP!ž’½0@u´xŠ(ð²mQLœ5ÂÔ^ßÞì´Z”ÃO ¬äÀÀ=ø8îÒ‚,M9ˆ^t™öa³FÙH“b#t0L’ÁYÎaº,Íô¬š¦ËÃ=!"Ì¢V©g=«w§`¨¼UeÛoûff·`¤Ï|Ð8L¡¶©énÛËí¥Æyµñ¬UŒÊt`÷#çÝ(t‘M…¤WgS XÎêÒ@Ï*‚¤–U¡E¨ò~<¶­(P™µÏzzm›} @·²«@ _ïwXn;ƒ• )iav$vLDT<<×ÕãqV 0hÊ΂pÖz Ýù²ÕÓEÑ&j^³–C€£>ŒeÛ`Ùöb(ÎP 3¥¢lET âÔÇy]¬ìç{<÷`xB²b¡OU²Þ6ûƒ.Q‘9~2J)Øs EE<éÏ0³—[É=šJÑŒ ¶<ÓíØk_)Â’ymá§Æ÷HÍ«˜Âëqzõ³¹t@ŠªWFl¶©ª×ó¬^½*¤äœꤸGˆ%_5Õ³¢¥h±­x8֘݉AN:”¡z:M­É'ù:¬î{œˆ ‡$xH—&9Ú‘ÒàÐNDö6ô¥bÚ –çpµO©523"×Å£¡ŒÙt6w•¢»3Á9OI:bþÆa—Ëè[>ò›zÛ¢ ‰ˆnÀX×Ts÷Kr•1FùgßÅkO%D?ÀÝ{búlÏé:Ïô³»{ŽŽÚÍã/‘ÏDýD³~sÔ* Ô{÷>íËæ•ò,ô¯ªñ"èwÅA¦Ë~ Ÿ&è™?Xö]­o«{i‡µCÔÆqæëù–É >oy)ÄAäb]¦=dî¡{2beCse¸÷¡Tú7×¼Åz ±'zù¦¬#‡«Bªk¾#?·óÉ2Õ^Ÿ­8 EáÌ ‚ˆ»Š¨Õ˜KøcþÝ|ím·è•G‹õ$ŸÒ×+ÅΦE KnŸy°•4ÍkQZó®vkÁã"ÏPžfè^Dÿ'QA¿±d»&º”gÈl“’´¼¬[7@s„>œ˜P^­Q¾ºÎÏ®Va.‡CåóBŠiÿž`[..ýS-X 6Ôz!÷v´Y¨,S]¬9‚~övBfù:gjùÅ©»sîÅç=aü,ZD´3*ŸOÛ‰'éµÂCkžMæƒÜÊUyRF»Ò1UÚ`@u”ž·×Êå¡’O<ŽdŠÄ(Àˆ$öUþs ß×l[¢—4/0{ -±E0éH5¾¹r”^²žÙÑ%[òbj~~s,ÙîæJ嘠óâÅìt­K÷épréh^øN#†4F¤Ç'c¥p=ú€Pž ÈǾ_~ô;.eÄsëꥰûR¦Íž‰’+¥—./s‰ÑÍѳ\ÈöèÚ‰Â4ânû^ðAEŽctЫ€†}Í ,³ß ^ûCrƒW|øUeEÞ—+v™´.Zø¼¿¯¨_¨^×Ñçgêÿ‘ú0”øÃºð÷ýâü1‚Ї?¶¢Éþi„ÿýi|§"â‡~ g®ðC!üh ¿Ýü¯ÿõüG>jëx6éãCÀZ`ô¤ÿ®fü•óñ–É•,?mõÀµQør‹Å'&þ‹”ÏOª Ö{øb$‚ÌfòéR×e×oŸ]Њ8\È ÿå®J—˜·LOßÄtæR%´M[ëœ]wÌ"lY6 ÊþD&¶ä8pÙL¬hÖvñ%=ÜZ¼:1da÷_r¥Ë´qáÀ)Vޤ(óÒÇëÕS(ò8«¦L°I„680‡@@!‹Ú¾oAñzÖn|&iY~Ø·jÕ=½ó©¦å~+[Jy$YyžÀmßšJ+Ülë–½ ©Zýë×oïûqžßÞßǶ¥0j¥UšYLŠÚu3ïÌÆËÜKÙFá)‰ªÈEôûãQ‡•’´0SÝŠQœÕO¯ l¶«Ñ îÛ²¦k”Ô9mÆ©ˆ8Ž#}aªšo 1îþöÓ_ÿñ¿‡;kͶ{„³Ø±`ÜS»•²e ¦µ¬àìÆ î”QN‹ê^6S;ŽÇ¯2¸4Mƒ.¥¨¤èYLÀàù8Îã$ÄP¹±È0ˆ˜˜‚ÅÔÝC£'Uã8ó;óp’5BÍ6³áQ€5¯¡¸léëYU5<"¼Íxzˆ½-O¡ œgMKZÆôkxMPx²±™µ ºÆyV÷jv&â™î.Ò,ÕDuÕn4Õ¼½½%©TïšYÎ*Ú–EX¬8kK§±åîžDM¡;ÿC¾Ñ^¸*2©Ý?ûû{š:IîûMµé•y µëe5¦èâÔXö&°¨3,PPÔ ÙU¡Á7öð´dv@ËÆjÛõVÍv2¼æ;.Z4‰7 ?O¨RÕ‰¤‹wÀ«ªAjÔ¨~Êa–Ì|DÏ®†{ú¸‡ý6-qGò¯Èˆ¨á3¾y{yÝ"j=Ç])×˽\‚’3:íÇ–XQU˜ŠªŸ!+ŸN"¡F&&Š ëáîu/[1¥'Å…½›L4ÃШî~: ­# ½ÖæØê¾W3K»Ó÷Zj¡×0CbƒrØ'"VʶD’A5Ÿg¯©2¨0Bj­M5SÍ3“‰†7M7œAÃ$a,Û¶=ŽG­|œE¾¼¼ýôúr?Žä}AH¶B U{ÝKý%f*]UKÝïq¼ÿúþþþ~'Ä4„°m»™Rø8ŽÝLK‘E…Lè_ÎRu2È jÔNÞkÜ“¬ñHjPB|L¾Ñ§»j¦*5h!R½"×!ІUm_zô8 ºCs’… ¨‰bˆ3Ü (Ô fˆÁ–ˆ€a·Ý‹i­õt¤à«‚¢€¸W§€EŠŠ+¶ij&è=lËʤuî¦î”®Æ¼v‡¿KûÑFðM¾Ñ DN~úyöäùÒ+ËÉYîå:¾Ž¶óÂxÀºä¶LŠ ÓVÙ6é:ùæ‹„•ÆŽ.¸CÖÕüX£0†÷Ô&ÓC–îщ0Âg;Ñî°œ­L !«0ÝÁ©-æÊùE¬xY2Äé}+ª¢0¥ÿ¡Hê°º´ªÜèæàeóÞYd¼HÍ}þÁ)¯Ôëá©—O[BdquëÖ“îߨñ«B/Ÿ¾àDŸ/ò¢Ì±FkÞÈ,?U³§ù²ÉxB.`õ._³²BK×4Áò””^_ö• õ篴w’‚ ëü"Æ¬Ðæ=õ'<•1E&"rÞ[§9ŸÂãÑ<€k CæuðTá’guéÏý\Óˆó>/9)o»ìmŠÈÆ.>yâ-5NÔ•¸TL2Ü9R‰O_[ƒC^aMÊç¢ÏKÿPžÒºzÇ[Éq ׯÄË ‹$Ú%ý> ½„ÑçÉ3ÊŠ®N»Ì¦]=ðƒö3 <&_m3˜Ÿ*²;ëª=!;TâÿJ0.³Y1ÙñSÌ\˜6øãjZ-³³—€Ê«k²e´>]ñÜœ§õdϱËg °!ëÀëØü·²zà•àèZ¾¶|¬^Ðë²R@:ʫҺây$ÖËNXÊ/—#É øê@òÞñ,vXêIú]r¯“ÒN¾éå§ >&gýÎú¡Œ¥ÃbØ9‘s0Ne\ B QðT±²Ä0F›m=±ðíCõ6YXJ£³‚Ó߀ÈKHg~šk#5)«U¿=øt£5¬$º‚lzÊdÑž‡gË)·ˆ$:#8Â'ô/·0yb/,¾dÌ'ñ¨TÎû‘± ‚œg6FëŒÎ#ƒe蘷°Å­p 2õ)×5xá1‘ŸkÂë¬ Ÿ ëcn®“’qùƒ¥7ùƒ ^Êuúôô–(ò"Ðwõþé©çuì#ü£fy>Q/~ÈóÂø':?>û |ŠËü¨ÄbðûâóÚÁšðOyÓü‘wöÇ%}~òÿÿÿÂÿùþO=Ý€>í&Ás¬çã”\>œ×WÒåøiØú:z¾¹¼^‘Göri{º¼Ú,ÿ¢ÓÒ Ó‰ý× mõ»` Ké%ŸvÛ¥Ž OKÙ@#Í64E*Óé0GkqX~28Ü1J:`Ï~™“õþy(Úçîᙦ‹¤Kö'Þ°x®Ýïþqêk¤•…ùémàdãgÿù¿gp?î$‹Ž^Ó4dI¶Ø¡ýƒzÛJ)åq}+Õª¢iH¯áiü¯áþþ­m•É­lû¾“qžÕÝkÔoïïû¾ß¶Óâ™×ij B‘5~ÖzÖZJ¹Ýn·}Ï9AD8½W§jÂgÚçQ› ÍnË^б˜Ìýq÷ÇCض‹ŠG°¦ÅÝ©bj¨QK±-KgÝ«ùyÔ4㲑Ræ™Á里ÄVÕ··ŸùÏÿ` ¦|Ù•ÔýõÆÈèƒA©Ej¸ªLe5‚F5UÕÃïG=îQ˜ZDüãÛ¯âíÛÙ÷ýoû[júî¾ï{x0¤?ã<š¶f*NwOèM­UEÜ ±ŸÕ=ÎrnînZJÙÎó"²š½–bfÛ¾3ÜÝ»%ͽÃCDÞ¿Ý;´7‚´¾qÊÑÉf¥ÖZr/ï””¿jÏ3[—s¶¤h ™WZ*Cû¾CBTñ8¯5ï«qömÛLB‘X!Z#k…G†`èf‰Š§„DmÚ¯ä¯Ï…~a£¨™Š‰áR£ä,‰©×˜Zxlf€Læ[¸‡TVßöÛ^JšÒV‚{Ù÷²ýzÿöõÛ·/¯o"rœ'#þñí+·ýöן~Þ¶Íê¿”ó?þ®›½¼Þªç D«ûÉÐ .A‡[ÆBLTŒY*RÔ¨Q#üˆ\„PS­¡T:\H)€8DäD¤[6ÂÑù6蔊£õn ¦íD¨*!á %ûþzÖÓŠmVT-´æŠ¦Œp 9À¦/Ò§ ˜¡Å¡¥ø‘_SË­g¯/¢3"Y´YdíºiÚEóK+¾UpTR·à?s¼¤–^ÑèrY«êiø T#’„UåS(…:Å«w#©Šçe?²¦9ˆó×jd¢2ÁSCmà D°ù™±š;¯Þ£Ž'Òá¶È»sNœ TM‡bÒ’”ã„éÎב'mo±C$–È`äsªu¨a° Z/AÞ± ý×…|h×ZÏÏ ‘KÙêNô¯)×ß‘w÷´BÈpb²’¯.éç:€1!€ÌÞ gçj5α(­R#ßX_÷e{ë÷µ'élÙtc U%ñ)â°þß'CòŒÓ ý¼Ç2TµÀ®ÒTŒO"\‹®®Y'ùˆõ”«”#ãÖÁÑÇq o|☵¿Õ…<±,z±nþt¨jp¾S´î´^µ!¤÷TJy™‘ ¾˜\ôçÙl1tÑè¦ÁÀ™cöÛy›ªp’Ì9zSºªº6.2PË1“ra£ŒajjïMÞž\å3^Øø±:Ø,/¤ËÊ¥.l¿9±•^]ÐË”³ýa,­_`êÕùfûm”ÏŒ»þñØq²ÌvÞëÍVpÃàû¤ìÖ˜€Zjl'´vYõûIøêüEý_Ýþ=%1ÃɼëQA\=ñÍ\‡—óOk]sšÒVîC1À%özçÏ+®Å«‹x—ÍwtÎ û®;-âÿY50¯ƒ"Žò§•ÏE}'¿ónž`‰È/Î4“O%[Êg‰ç$Szpÿ è:sÿ ~Ç¥ÉâOBü¡÷Ê%ôÏÛÿÿ7ÌüÓöÿ+åì7~h’>ID}ˆ<¿þµÎyqeåÑo׊-š6% "ì, ‰ÆÀA6ê50(>jÕíò×µ™ —¬À(˜áËåÂÅòÁtéLîË¡¶¤Ä›ŒÞ½S½âËò©£—'´U^ €ÏXžµ™Õ‘ÚÎqmÓ.ýãcÖjY—.ÍA“8¹rÓ’÷W½®¶ž¿L¹fðIáVtÿáC©oœÙhfðA Ì/5ÈûqÔóô,*l¡ú¦TÖðÇqd•kR¬×ì’¬ÕS¸ðöúºïÛ¾oµVåD©ä0À:û®XöjâìÇZ<ßÞyž£J7é–ÿ ($§Uµ´ÞZ>ÎzžGRù)ÿwo¶Ir,iêbæ@&ûªçûæýŸpÎa%áfª2j«#P\ªHžîºa1 |5ù…þòóÇo¿â·f"Ô³*k”æÛ½Õω©}>>Á¨ÕÍLãšf R|\±}™Û6cÂlnµçDtûéåÙÕHB¸{&Ö°ƒ¡‘ "¡Ew¨µ ±‘ •üñ<˜k¤ÎÏó,'w,àÇíö<ÏÇãq?î­ Œ#ßP+@¥QŽ:M«%rè±fýü|4¸¥J-gæ¬9!¥œrf–”ô–Žâö|<7«ÚæÑ19a[Š–_é´8îìDTj©nš’ˆÇA 7'‹˜ùy–RJØçsÎèæúÔÛ%$Ìê9TS·»‹jœ°±C.g9ϧ¨oÇÀúÇŽNE$g·©1ñY]Dm0®íõNkµÔÚš„ç`µù°¢ÃVU‰4eÕаS´.÷g×\fy£ˆô>mv35Â,äDPjÒ.9Ú8™`ïÔöͯM±LVfJìÄ2²Z,r-rZ°$…ŠŠ¦Ûíp³be<½ÍáX%ø&”˜ÀIˆY´Ÿ¬ZÍ›åZrÀ1¢“0`Mínóan^üù|ºYŒDÕk««ä³²•¶iÕ$‚x®…I0(R‚^×J̬¢•PÑC">޼¶Iwø1û;H$‹TQ•om"a"Ö¤Yõ”ʼn‹ÕjFÄù8˜Åª¥¬)e™ítÌ x›-9ÁVÝØÝ5ÈN•ZÌ<¸±š•Zcín¤£»0ˆXR\!fͪù–:³ˆR©&šÜLƒ áž$1Pª ?ÞÞŒìãóánÏZ???“¤œòÛýžsÎGÖ¤\)åüóçϳ”¬š5¼Z/øí~ª§™¹¡H……5Ìï—k¬Ej­pœ¥¦HÁH›¥™{'\{$ÎQm$g"ö0¼«³Ä‹ÛÀ­mÂ…9žò*ìÄ JªªÚ¶†o± ×A¼ÈT–ÍihŠ(ÅD¹½Ñ’:ääL“0àÍuîµ–¦dsGú:‘7,GL¯EÐ!(8u&4‰ŠRWÀ „6&¡ÖCCàaÔcðØ,}d'ï•{$:¬ˆe÷¦ý­À^‘ɰo‹îŽç¹ÌÝu  ÀÇ*¦sNz!æ¶°íߊ×¾L$QÛF|kIð£¯I´õô‚Lú8J+ÎÞ±8v·>Û¤ ?è#†:V›Ë÷kT‡jèFÿ‰ÿ^…6îQ|Í­wÚR/œsÃ)c-$Ä¢–Y%ä.i~íÞc5nZ5cmímŒÂhÌ*#tÛ'¾Ù;-ŸvÍ^ i“Š7‡^Õ¬f év'Š·ODå‹ÕÕ1Üê<—Ë›$"Ú*+8šOÆW.¡Š E‚½`Ò75nO»Ùs£K]œóÜÑR7Ü—m :b'딆/½Œ£´³KÞØPKjœG;96ÔÂPNÑLqnzp­èhß9²<¡_&Kär¹.¦ ·•”®á“MQ¼,ØjO¦ÈÊWÎðâѬ0i'1&Ì1CŸZ%§‡m?‰5™³¿ÅŽÕ(ÏÂ×á竽ú‘Ž×|Ö¨ø]4 ÓÊ"dX þ³‡…¹©(¸q ¥µ0€ö1ª& #x{Ìò<–Š çE‹·qç§5rŠM)ç7h ŒNê¢%ˆÀ­»¿ä‡íšúl´²ê—Ó¸?wWg×+¶«Ô';yÓp¡R¡¸›ÜçÜ©ßöÂ_¦rË¿ðz¯Ñî]&áë7½® fl©+þ¿fDHF8`ä¤&1Ë1ÄËÐRåË#‰¿ñ÷o/W_:^~ÁŸZÌ Ý‘ ݲ™±&cstu ;6«Žæð³"Ò¤V­”•eGÎISXbÇN‰™oÇ¡"ëÖe}ÅI®µ: Ì)$RVÕËç㌚œ³(nn°&4$UNÌDÚÅÓàzG䳜],æP!U4§ àóñ,çó¿j½Çûû]YœßßßͬœõYO3ù“Orªá£ Â¬Ú׭à;y3”ZK ñZn·›ªÇ;‹YàtÎ_Ÿ9§··7w¶Pá…̉`nn\)—BDBÆF,vây>Uä~ÜŽÛQÏg©õþ~×SUÙÏÏÏÇãóùtóÏúÛq™ŒòL€ZO"Ϊ±¾L)‰UZàUÏçG±b,Ïœ²ª¼ÿIIµT&~>ÏR*Ü-ç|¿ÝÂíîLƒÂJÄdæc—B˜£†ðWj `Ô‘ÛíÞ…owÀK-¥<Ï}7ûöv×vùáÂú…ÕÏó 'lpök)1œ8ϳ֚Tï÷ûý~3eæfH ¼#Ì\«”Zb«kÚUJ)d÷h¸a÷P¥³œñƒ‚a2jfÇîOz*EUM5ŠDc»ƒ²–¾Ÿ•TãÉ éxö%v!a4 Ån9¡Ð¨bGÌd,Qb·𰵪¬ª †9Á v–¿xÒVêfU³|2«gµZÍ\XÛa±tµ@óanñï ŠÃSa ¨Je"BÜD¤")çÔ"qbœ@å,Ql 9 Ëí-YuÉâ ""¢ÊfV+ŒRÊm›êQqíÕîÁois#‘/¦œÜ`ä0ª^Ý[º"¶øNæÎîîÕÌ]TRÊX-p/bWVfq8që5a¼ a`áÄ ”-)¥îònÉ5Uqh\c,’’J­Þ0KIhFoqF0Ý%ÌÎþÝA+À¢9Þ¾Qõ@fŸ$¬1 !Ür&¡çÇg=M‰E¥#Å8ç[40‹È¯ÏG9O3—›¾Ýn·ûýív”Zj­³v«÷||<Ÿz>–j%PEªI[75†öÓÆrQZ ÂDJ’D$%ëà”ð:…gÁ[8@¹O_z zG™c|ªÛ IDATÛ¥qpOŠŠBãwÌÑOÀ1 IµÔ_¿ýªfoÇEDŇû¯Õ{ó›ÛÀ-0"äTàìÖ(¹ÌîíA kÿºRÍéÈÂ\kUQ=Z‰›¨A™5Ȇ«Ò•‰ž¨lrp ¼£EfÙ-}‚}B,Ýà¾Ø7:2añuc }·Ñ§Èh(¡fÊðùw:&rä77Dã6(¬Y„.÷HÇ#Ñ0luq?1ÑÇÒõ_¬óà¢úM™Q„“F­ƒ ¦Z4cKÔËy_W2Ý:ô¾ A{$ì×íÔ(é¡Áʧ« yx0‡j¿£Ê©»Â§9º>×6=žF{ÞÀf¼æEÙ/)Ù"¸íƒÊqW΢º VÕŒ4-³´%í–x̘ŒÚ‡]cÿ(ìö_·SôäÍÝÿÿÊwŸG¶Ôö­Öeí8Jm"³;z…¹÷ÓácLÃÌ»ìçý•½}Ÿklbm“¦…þ?h¿ÜânuuŽÉµÂaó†àÏÂ{¥f{¥èLl›’>ÂK?ó¨YåžÎ¥UÃ_~S¤q9±¯”‰U¶v¬á˜R€¶¹YTWÍ\öÄ= €í8þ›ø½ý¹™'¶çã&Æ ÝÑX-ðc²ꢼ{xGûõdØŒ[ÕçÙYÈúíÁ1oèxûñ®à5s¡k–Ãû¿<$·àÃÖÛá«¶ÀWˆÁ:Ä›¤¶¡¯Q­GÖµ_t-{5l®é•…‡Y‹©¼uZĆ˜Ùç,³À¸ûÕeNÎ1”|^NäìËÁ€5õ² ûd›È4«÷úq–iéF«ñ|Í’^f>ä:Ü4ù^w|qÈóš wÂE¸^€W5V.Õ`ëo²ÐjY߯ÐÓ*¿ Þûïé_øýXI(³Oˆ‰¿F“fñíZÀ ƒG2‡fêg«ÉYý´GZ›³e™¶,cËjŠu>n|Wÿ[àjÑÙùª¥â–`[Ôá¥Z ½©ðªÎw^ñÛtìz/ñ:lÁzီ­_ƒ —?Ár`÷>uìW æ(ãU,;Oû4côüòïËöß;V“ÿZ¯9¾ à[iŸ_•\¿ç¿CIÁ¥ú§Åþÿ ýŸÿÄoÁW\þ\ó®þó7Vn~ñ_Ö”Ù û;Žþ/Qæ×I–uG´|Z^’>¼Oçã…:0¿UæöŨô5Ü ððB xìzÐáŠ@ßPH3Nf¨±U`‰8Y.Yn>A¥ÛkãçÆüA÷áyP€„…àò&f‚lskŒÚaï-[Ù/‘Ð4vðÞ&ÆûGA?Þ¦–+Ap&:°ŒMäòùnhðç g¼¯­UUEÂÒ^J Q2%E7)k4ìY5Á­T+UU«hÈ"Ÿ¡w÷b%´ZqXQ>r@/šÙ)²°£ç^¦áa9Ò!ïRJyžQpÛŒ]`J©)JAø cx«WÊyªê‘ó³ü Ü‹›;Hšn÷;†üüù çólÈyY–*!(óq(uÇM¸Â6&Yì‡|ÇqÝЮât»å³;ϸ€Ì ¤»ÝrN‡Ág)˜ÿùãÇÛÛÛíò=œÆÌÞ2Ê""N£u1@¢Ð¦™™Íâ¿–RâÀ:DffÑ  :Ö™²®/»†bÄI%. ,¾Ka–ïs[&_„„ðǶΉÐàZ0† >2­÷1CH‚ÅNfq7¯*™”©š»U÷ˆ¢´Ûk Qû`Ïhbx–³'Œ;TÀÖæ¹f$· «ÖàiqK8ˆÈŠ×ò9‡–` ˆŠÄM˜E’0ˆÙHB='CR£ÿªã\žO7o6^n®¯p|‡›»¡Ù×–N8DX”ë³:™†ÍÙ¡È_jéO$x²¤D)‡¹A¡¡Ls.˜@V 3gVMÂ]}nFl³'CJI4ꩽ˜Å6YE9‹'(©ÄxѧA‰#…áp»ƒ‡fójn<¢s"(­ÔÆœK­, s«VQSÎYSR‡ óóùL·[«X9øý~ÿxpƒ…šÁá#§•CÑLLNPo`äÐŒ(èÿñZs Oj¼:ˆ ˆnÉ”ó‰úy>nÇMDÜ,n±Ê$.ñJ☓ÞfnóƒJ”Rü_¯Vc@,"†h”wgb‹ÉyJšSJ9'P¬rÃ|A„8v຤iøÞæeù‹¯Þ ŽÙÉÉÓG6-یɬq‚4°ðªýò\‰Jä(†Ie@•W .OZ3·ÙË.ñ°èYÀµÍ†§"‘¬juŸQ·Šù†+ìG_Ï\À9\8ž´rqšiXµÔ¥!y¬ÿx•'&\e³2`$xÛϲæV|¾Ø±·õ2óòç-Q³¸×x6²Ïè’V ã˜Ö¹MÒ«‰Ûr—ônJyºÛØz‘`âZlm¼L…ó×´ê*FïÂDÈ*B̉ÈÜ'¦“ë·ÕtƒG B™£›Vzç—pOÄxmóÐ|ú'•Iº áå8îXæÁk‡èÉÈ­¶`áÛ³ÄH9æTWöN›$Æ¿ö_“ŽãH9™Y-ul÷br³ö/Òÿׄmõ¿=º²¥Rx5¼oN¥WâĈ‚t/2öˆáÅ_&j4ë``½Œ×‘[d4û£º•ˆ¬ª9À¤wyÏ~L,n³%ã³ )ײäµþcAø:ýZ¢,¼Ïð^Ésk;Æ/Ú÷.}¦xÍ=^=äK~`Ðõöx` uG¹BÓÔzÑL<¬0½sk©ÀKë!]kì¦úO£Xþ*DÍ‘¼°Un<ê®0 ÝÝhÔÓ# îT°¶X&f¼³6Ñh'˜óêù2ð{`[:VoÞèÿ]†/;õ ?:o–yÂyŽ×Úeæ¯ßö£X[cI(Ó‘Þ{ˆÉ½uªL³wmÈ €ôX(\ÓÜ>—ݯ5­Ý¹¨ VQÓz0…µH6âûæç¯ ló¹¥(¡sV3)•ó”u¼2ö—†Û—@—Eåæ ÷Z†@Ljço1êšÇ;º~·¨oæwæ¯DZž:D‚ÆŠä"ºÆ×Ö°FO5IÿËXîJ,Æ’--°ýö¸úúÿ¦…|enF„.RI/ßÊ­pMÌíŽhlƯ?¾)ˆü;RñRFsµÐ/YUþÊH¢ãLÿ‹•ÿ?à‚ÿ.ÀÿD¹ÂûGx/âúŸñù7Èÿüúÿ{D¤Ýœ¿‚Áø÷Dü-XÆs1°%Ï'nu½hº¸|ÿ¶É‰]åò»_ •ñBiN,<ÛØÆr›‡HÍ ×—ƒ#ßÏ32¸>µtÔ82ž¹}ƒØö\}ÃÛ>ÏXª¡ë ñ)v¼ÿË·€úì9ÇÞ¾ÛJÞötk;˜Xi>á°¸ Ö+/ÃÛ¯mËãÛÞhLW¢$Ñ‹œñW­Ÿÿûà €=y]JuUU1sü–n*Zªõ=…«Šy%ŠÞEã€È ‡·Ô+†mÐÝŸåt÷çyžç™s:rŽf^ŹšÍZ.b'œµüúøH$?Þß&ý<$ݰKsJ÷,ú|ž%¸̤šrJ aÔ”šÖ§#tPdj­¥V"ˆê‘SbÍIsþ‘$1Ë£<£sï<Ëãù42«†P(æ·^“‚…¼–[Ù«;Ùãñ|žfNù–’æœUD¸ ZB<¥ÏûÛÛ'sÀÖŸç™»ÂNf%a¶n¸uRky>ÎZjÒ”U“ju¿½Ýqž"Ф)½·Yï?>?>?>~k)&s‚íìsÎÂrä à~»Ý[pK[évÜr>D%‰xã¸ÝÌ DnøYžçù¼ÝßÂøÿëóSŸÂDÕ 0¹ÝnDlîîv>O9)̬1x03&þùóçûû…#ÀѤYk!ÕL,AUr7´ŠTwwae@T"D«*3&Ï4`D·Ûð”ò?rŽ2 ¨hD‹H$Ë™—Â#¢Î$ªª2",Â,¢GN‘S¹ßnï·7MúˆÉYÇø|M·¬Ûï¸ c¾Ð|ºh†ÈˆŸTAkm[ã°Íp(áóoøœÖ?‡¡·«qð¿ã¹ÝŠO„˜¼zA!e5"s¤œMg5Ñи;ò˜¹” xNY5ÅæÅj58ƒE3àlH)©hž„ÃÓÌQ­‘ X…\D95ñ¹¥5C«¨†ÑÖÍKø™Z¿A—:œð|œ±©aÑpž¿°B·‡›bÄbîµ>=POŽ04kÒhŸ¯o¸Í…-¬ùÈš„ŒÝQ­–Z“hŒc‡c•#·cVU¬Á±SÕ”4úY$‰Ñív˪Ïóù8Ÿƒ±ÊÂ*ª$pw8;ITÚžO>rÖ”“Ts&xq!:’žÕÛ#ŽYEFó·×”˜WnãrÀ͘Y“é(õÌ9×ZªƒJy{»7毿ýöËàÌ”Tt»Ýo¸ÛYĪf©p·«çç'9ŽÛqO‡¥‚ àÕ)‰½º÷2âî XÄ’J\r•ŽN>fVŽ:N–ŒÅ¼‹ L¢IÉ!YÝ­ýæ7{-Uq±hú“Â÷ɬ8RçREI‰Ib@§Z ÄñØMâØ_·j2@ h%,cré>ðè M)æìR­VC1ójĜڂ7ÂO¯¥k—POæFK¤«d”ŸŽÔ@÷’ wÊÞï7í¦<ˆ÷±Ô›:63ߢ @Ì“¿¦´:¬Y=™{"jÊÇÃÆÅ 8‹ #dWw‡Ž²˜kBèfvê4aîU`*Æ|ä†#©Å¶.vé±6°õá¹k!Ñ-e>Zy—^–UiXEÕ™ºÑðWCärfö1 Ë‹d§þ7·*p6ö–xjƒ6Oz?°ý 2êt±šŽÑÚíÙiöyTn­=Ã.„DùÞëÛw*mÒ¤þbéIêÉ€î¨í¾ìCdj6U]Zgø—5s(LàÊîŸZê^iýaŸçÕŠ¹@id»±¸…¾¼ý‰/¢3,"9·Û!¢'N¨·ËTù§¯ž{)¯»€—!æNQ¡~½JO¡,ü aÙû–AtU„ž6¯va _JÏ^C­Xh’mjÆ’YYFk½!©oßvßh{òtOÙ’™¬ö¾0Ž^ñÊ5É+çc‡|# ÷ÌØ’\B7‹;¾m\çó×ì7–€ç®s™Æ8cÓڥ߀$<«Žû#ˆBywƒÌæîd_!emׄnvÃ8DX†¼±8gþÆü»‘s6NÑB¼ÇðÅK´úndƒiߟA¢ ë&þOÆ>Ð÷Üý´û¸º0 2½™€¦ƒ%þwÎ i pñ’ßÀâQù,ŸGš}´µw¾^äÁÇ5×ánÄ/@'ág ¶<ÙB2šüÿy¶9Vç‚­#øM]# ÷ ± as³Âà :4”ýîYÀ6 âæ¤’Æå}¼|Eë¹ 1xã û7¯·,cÔ×o¶j¾ÎFX Rÿw{Ž÷§èË¥M_í©+ A;8 [ýöàëÅÄßôÏù’|XÍóK¯6mVzAøõáki!3Ä{éùÞȾ? ð·´Ö5‚ï~›ë|öÒ®t±2¿xìñÄý+ðèÕø÷ÚéåÁ¾ØÿÿGtÿòßùwøÛË”¿·ÿÓ—Áè6 À—Æà¯îü(JÛûpÿqÓÄ»ZÜ£±WÇU a>œ1?<¤í¥ô¬Í×EfH`vÇ¡ÙíÆ²~Zë[ȳ½ìzq09N2J—ÖŸÞqNÔ;úÛk;;ÓŽÑ­†s Á­iJ¶Áàì Ärœñµª{óT÷Ê ¸Ð Ú}wá÷Ãïm7𺂿º'dŸj,Á‹Á?‰–13/æ&•R¦»ŸE­íÍ"AÌ¥Ö[>Žtô¤yßdÝö¨ª²œõù|>SJ­ ö&¢5t(• %4­$XØRR—]E„Uš~¸3ç¤Ï§…„šSRрɌ·tPƒzA]7™÷Û pMªIUL’ªç³Ôú|žÿßÿµÖÊŒ¿üüKÊYV›ßPǺߋ@ ”Üj)î.,)å÷,äîd-(qŒ”UR¢ûýñx¸“ÔŠ¿üå™ÏÓfAL’-òXPK­fU”E8™Iä|>…YŽ”ÓÁ))3Ü­ÖûqÜÒ!ÂfVÊILµz-3ô'Ñ””˜Üá°Rku‹³wÐðív M*Z”«YJÊÂ?ìþùMf‹åBÍÏ ‡Qkînkvà,E˜)¢NDPf’$mè#$"÷ÛMDj)fNLn1ì±VÝ wrŽC‰¨ž•ˆ²ª¦CTØ$¤ $ì]…4eáj âcPǬ‘P›oå 'ùÿö×çãÝÂæÈ¢œRbøY¬Â˜è4ö#©¦·(Huw+Æ ÛíÖS' 8U«f–S(‰¯-õÃZ½U(·ÀpÀð½€I™‰DSÔŒ«*G뱄ÏGbU g1¯ˆKˆà€ªÆƒ¢Âš¾"/oÿŸãY—³3‹²R‘2KËÎÀÜ!’š1±«MVÝ£0©•± •>þR sˆÎÝSÃB€Á[·ˆf&樟²*c;:Z »W¯«a°NŒ8"2&K±¦w§ZP3vßÜCk‰,G3ZSÌy"v `´ÕÆ_mUyBJ£”xÚÆçŽkéÅfôŽCRÆLlL‹s¨‰A÷Ç4G£ïêÿÁÃ1}Ñ5úªNÜÁÃÓÇ!CÖ2ëÄÊ︋Upi‰\áÍ4¥pf毆ú¢ÐÝÓã2@w æR¬MÚÚán`²± PúµÄC/ƒ™ ­bû½ clMšvùÔ}òиtí‚tÚ³v™ ÞË%9±ÿËÔ‹E¤#Î'ª¥¦¾ÚþÅÉû`¾¤¡77ý6ˆšL!ì¼O#|çþÓB1↛›;.ž˜5¢>•ï¿]¼ºÃ©0mËc=”éhÿôéÁ˜»ôšÅ¤¤×TÒ éxƒ)b½“WQ ö§[½Z"gŒëvšh“p"ë…w[Ûx)¯Ôy¶2ÂÚáΣÊ}V¹ò”lG§è¢Jâaÿ¢;Œk›…w\+˃i¥haÈšK·ç^½NäÀ+»ljï“G&¼ºý7É®í€eIžt5xvÖçå–îà¥tbeºF?¿7I§˜Ñ˜ïît“UCÀj<µ…ͧˆ\Ù1³vaù4ØóbÇNþ"};=ú&ú0ƒxUa\›ËÅÛÙ>q†&¦x±Q;M<µž¬/jÐ{: /hþÞƒñš¦˜YJ†1|ÝÄ¡òå²Üó:X ÆËháÕÏ_èBóiq ßîF,òÅ-@›g&Dùpuà¬%¦>)¥R÷ä’…®í®MB*b¥¶Bf‘ÐRJj©RÎQ M#"áhQJꋸ™‹„‘¤”rÎB/½XâYÎ@$Õj¥TÎÇñþþ."æöù0 Ár†Ü†ûåÝÍ›,IUÅ„,vGÕ õt÷³?ϳ”2ˆ=+hbZDåÞFN­Ê4Z'áó$’Z_¨& ZÓƒ¤)”2çVúÉ™1¬nhܨÑÉ<ÒÑËÔ!ÄÊI3)'©š™WËI‰š¥ÙÜF_˜šUØ Õ;îœzþÀÉ‹Y5Ymû„ˆ,«0q9ËY«ÇAŽççóñ|Æ7;ò¡šJ-šä¸ÝrʬœHEîN f„9çCUßnÇ_}Ðã ·ÇYøã·”RÄtt!í©¥^SßÖš]³¼È¶õÈÍzIýÁ†ÐwÈOSIâÕI¸ÕV¿Øè…ƒ^(sì:Ø*X„þk¿@Ïi "Ð òGMu,Œµa¯¢¢ AßW†Cí¢YtÈrË“Iø,ëíÀyo”eßµéXç& GreýQ×RÖ04ó®éÑN=ÂB}^_Ö®ãD'ù"ýPÆEÞ‹v§Ë•zÛMTÖ‡p†ìvþ5s÷<Ü'w¬ãÇX僅9>÷Lg¹«ck+i\{1†’Q^ÚÞ¼îMmœÆZw/¥DUÌJç0©·ÌsÙ%ú{À[9Pœ¾ÑëËŠbäaF÷rÝìÕÉ2á]qÐ6:ÿ~ªE†<ü³ñ£¥›Fr‘Ö,-ÙóV~.öÿ*Þ:+ˆ¶WUÁ¹-h^i´¼'f¶“zQ^7ý~Žœv™{ý‹‹ky×ó Ž÷öÎ~Ûgfäõâ'îÚýÐðxT‡ŽŠ…0€yó­ÅÁƒéÝôËMBÚevP'²ëÄrU Ìß¶W~#‰lÜcv<žEX ®6ò öDN8Pøk°j`דØmmù³41 0ûÒx²ôOÑ}irÇbÁ”D­Ð0M— =·’äv½ž²-cFÂÁyý1]™•¡l¿ ÝLŸ–j}óþ-xúóœ:]4'™À„aå•Ô€‹J2q\ßðYFþCD¢âMŸÇdÚÞv¡2ˆH¦g ‡NEÎÆï¢O™Œªùä> õf­™¦ØÈü€[)•Žœo9%6„Ð`”sŠø.[­Ò¨þ MTD\”½mlXUsR€?™rÊ÷ãž“FÄÂd'ø9Ê^¹iˆbx¬LãwŒm0EJ– H˜Ÿ½TR‰˜D¸0Ý]DEÄ ð †“ ë0) ‹ @NÞ |nNñü QÃ%ä¦fÜö*9Á­²(ÜY“@@^jª©'¨ºS e’xß<ª2«½¢|!±;›×œRˆH¡×«(ª£Øéª¨èHíˆ +'aÍI™³°0`1Óuƒ1QÊÙà~Z)Ūé‘EùYŸg)×”Éðv?Ìý,xûñþöÖ 6"ï·›äDL¿¥O¯õvÜÜ­îˆXå¡è#q ©nµ9U½K2­T–™%©HufvbŠg§[…_›ñPc¤™Èá,¬îI@¾ #§¬ªÕª;Üìù¬AËI¢g¸‰N-¦Õ¶\ýÕ!.0HT›æÄbäÜÀÅIÃÅ^ÊèXq€kƒÌjÔ 7¶ÄN ì@O9ñôÄÅû¿×|N ½fbfîmÞÍèNuê…ºB "iw¾,ûì#,•ºcûÍ$CN¤b€„;Žc–4Ô¼hk&œZFo“nVßûNg4ˆ¥‰ëÒYó[ððiðìŠ I{ÎõÂÌv_©nMÓn˜UAGϯe+DãqM+ú߇ŻOM&B€yiž¤ Õ¾Ê9Ü)L´Û·ÙÉP¬—®É‘³@;ñjÍePN†È=f<*ìĘ…›ýÔñˆ LG> ÒΊР‹ï†}^¶ëÃ>ñÜëÞÎ;h40´Ãß7÷5Q¬ÜÌ|i)[üÅ+!Š^x›ŠŒ</í²Í~ÝW#û‚1›ïyå+©oôÏM´G’"ĹM°Ê”µVíYŸ851{ ÑÙÜs·ãi¿!XvÑpÑN…¶Ûþ#ˆÝñ#í5ß&ÄóeïèlŒ†dZ®4Zz,y* <çÄË`Æ0üÌýäöiT0˦À¿bý3gÐŽÛšfX¿ýßch¹dºÿ¼ïÖÎVÎÜñUÍô¼ÊaKÆ,›âÕ\¾âr±¼ ±û£U9¢‹>Õ®Aî@£æWž³ÑÕ8éN¹Jõ½J}Ü/ã€W^À”öÃë1ÇB|Ù¬^ý¹|Õv ì#âÁ›2üJæ½H¸L›F  E‰xxx“а"¶=8Óœ~w‡¢Ó¨£3÷hS˜rl„°ÇkpNó®QÚÅŠ¹ ‡ëÈpŒ²ÚiAÌ)®ý™mX&Y!@ã1ÏÔ_¿+ðad×fŠ¡ûÊWõ¼2gV¬Ë&–\(*K™*3CÖÒãÙ>óœ6ðT+Ñ®“²†ghL’„eÔ;øÒþ¼à½Ö¾Ú%–á<×¼¡ÿcЄ™d¡“p *`á:­OZ^Û ®è\\¦¨ÝŠ.±¤cŒÛ°&0x}Èñ:7œ ©A³Â¾†Y5ð­S§Ó e›Yð¤:1.óÞšt·ßL^%&¬—[ó ÿj¾š^ùõ âëü`Œ`mψ뼀å•ÖìÿBqùOÖµAßÍÿmöÿ¦þÿ™ÙÿúÏÖYþÎþϯÆZÌ¿7€Øee,bñ²¤ž™µk{o‘Î8Õ:ã®æo:‡W×ù@îÄÒzépéf/¡æí—æ§Á¥Ì‡!,¾Ÿ{°”燗ý9åŽëo¸Ô Mí¼¿Iz%°àEÈ, ƒBqƒþó,†éSì l^›B—f½¥èd|Ådò\,R3°6ά+ùÂýß kFÇÀP&åKæ‰ÿÜ aÊšŽ”»e¬1™9IˆÙB­£²ô’[0ó1 €»‡´$Q1w«¦š„¥:î·CU}>ˆ¨¸å¶…c&©ff&Y'ˆ) ë"g©£ª.>[ô3±“Ä]T…TYCÕç) ³,Ñ+ÉÄDunÕ<×€®1RÒ[«êå”îµÚ“žõQ‹Õ_¿ý"æ”3/µZub®¥šûív䔹ŪMÍD$Ô=Òáð@‡³Hë:r3ðÏ÷;)>ü³ ¥V,ÌG¾¥”>ÎÏRвT7Ò‘cMžQP‘œS-À½†«ÜAd¬w&áx³& Ô±YõÛê˜H ΄»:¯°nÅM I4 L ®ÏLîÒ&&U+'393 Ì=.«æ“1Ä­Iœœ¬úù<ͪ¹å|ô‡“ª˜CU,Š(ˆ;Ƚ5!ßî" R+½QnÌD$˜'œŠ9G,¿EØ|ZFÞ¿KN +Qk=Ž<öêøet)jTúŠò–¿-:óàcе1C‹ŠÊÌ*ÀA‰Ç˜àPa"ÝçU±å®Äæˆ%ª¾A‰Õ`ÞaÍlö„ÕZ# c¥äœoGN ¸Ÿµz­ 2«@N¢Ääìn6½œ“¸§fôÔ4ŠÆïGy(åt×áÀ §a˜d™ ¹Ý^I xHÏ$dVÉÙÙ˜F²Œ“êH¿{d‰àH 8XÍMaJÌL|Ç£Æ^-#…ÈLU²fµrŠ]o˜Ö‰Í(J¼Ûô»=c4|¬Ñeªñ‘$E»©ÅxŠLTc÷î©hö1âjÎlIôíxcV/'@Ñ% "q§è¤½`À¯@h|ãj é-‘˜›• Gh}Ö¢¢§E8¦Z)±uæ³ÔZËYΜ3³¦Ì`P¦·|„ Q«¥,Aì5w!w Zmƒš$GÎÆòô'€çó<’£ýHŠf¼w‡+)1éÌ÷ÅÅO"JVAGS´áAËðVQ+­†ZKsiÍD Ü#k~–³"²t¤¬Š“˜,†G­$ƒEÛXÄ•´Eòe¤Æ˜¹yÔ£1l¢ç€>8@ ‘>” Í:lï3`Ï" wÕþl„™)> yg×¶»Ó‡d&Srí:FðØ—&Ob"gÕ4íËÍô:„¢´`Ÿ ¿<¤q?MŸg׿/~·Þ1À3ÐsEÆoêú>¸³´¤çWeÔìñÚ¹¸”6¦‰·ÁsS<Û¶9Nb›Èe×8¬åqL%<Ú‘©Š¿2•½‹øØyIâ¹Dç™™X Weˆñr#<…°Ø¬7FˆO`6.¦Ü¥ùe°nz5k´B´œ¦²,Pî~ÞG›í¹C”W—¨ðÂÅ] ÇÛd+‡þÈÄ’¦[E Ð Péö_ÃT‡BÜ}ÖÜëm¢¿÷ ^Æå{¸ û:™‡ýÚ¶ˆ&²¬Âú”}E(Î0öŸ±E%½ýoÙªi€œª‰hì`‚E6ŒS@›Ò£ßÈÍoêÊt•λŽÒúX*m»5~ éšößuù Þ¥çŒÚÄ`«aòñ\`oJM /G6tAö Ù€èÅ"#ÚÈkî©«g[àzÍ'íÍüø”9诗!AŒÆÑ1£ bXº:À½[µ09é¼ù|×òUÞSô ò“ÉÛ¬mÄ·¤¯–ïeÐ8:‘ùŠÞYvP«žÍX~ü<,ëGâ¯~[~aꟓÀ6[êdw;!±Ò®½•-¯ÓµÒÉÞ§Îöò‹$N£Â‚FK{ m3,¡†²ï°Ÿ1¸íÓ¯a0²EÀURäMJíþü¥¡MÖÚ“ÔijI/œ’ Øizž# švôêÄ>ûô)ê£Q0Œú—^ ^ŸwûÏ^Ô;AV~ ¯q¢Õ.?ÊëùÕÿ2÷p‡9ÒB`ÙÚ¸…ÇŽ¾ðw´õn^(S+!yŒfÆ„ x‹í½.Â#‡‰%ŒZ!^& CËÇ, Þ½ïñdçÃÛÌ›3X1øK땵a—®bû˜Ñm8¥ÎñöyVz ȇZ‚XÁßiÈÛÀý+«b]‚~51SW;¶}%kŠû5@x™à¯´ß§®•µß7øOóàãûò‡Õÿ­oú?ñÏÿEôþ‡þ^ãÚùå ë"¦óxýÃyqÍó+o7ãúÐÓÆÐOq)eñ¼¡V¼ rwÚjšfûÆhÐ^m 5;ÍèÓ4Z{†®Å˜ß|k„-dM,΀å(킨 •9Ÿñžx›S“>ÿ@# à_ë+£%œ½4•K(:´éú»kl&^ÕŒC¾õ`Eò¼ïÔ|®[æ´£¿§}ŒZ—úb5Á2`À«œÒŸJI“Y`‘YYƒ¿ß\Eænþc%“³GX8Çü¬ª?ÞßTuìg¨w"9êyžôöò(î^ÙT”™K­ ÝC/oî@±BDG:šà‹Vë*"mª/rIÊÎæ6öL¬*£6˜Û¥žLüë×gJév$ôé…ˆ¨$fVMo·»ªV÷çó â”sr#FõZª%+fˆaw㹪Þ[ÒÀ­6d9\]£’4‹ÞîÇûí~äü_ýëçãã|aQ‘÷÷7;rN¹P9gu‘[¾ÇVÕÊéçyžp2˜•êîðóv»é[âÖ)ª”óA¬*p€Ø=à~‡¨´„„ª¹)‹‰Ï3T»¸ùî·[B|‹Ðƒ©–zžg9kÌ£ÜÍĵ£x-žÚ^ŸaQ¢;^QÞZjã37<¸ÚÃls£€FVª ¬  ,V¤MÒˆªúÀd0‡{Re–Z+Ü D"R«Q϶­SÜT}ó†9Ú•ˆ¤¤¹mA8"Þáprrsbx“f>áÌmReL)'3óê§™WW­5šr…EƵ¶„Ùx;#kb‘s·:Aboã+y UÚn¦XL œ@Õœ98¯«ôו‹²˜isþRYÀF„ÈÃxs#!:'ÞÞsX)Ü;N£ŽBT£'ƒ@Õ îÌDnLĪÏçiVÂQ¦,g50kÒ0H·a©j4ĺ)¬jîîõ³ ë·;3±{µ³jttˆùH¿hRa&U&Îä”’:HˆI…Ѥ0ã”Y¤eIî^I)ÝÒA…"}¬“ú<‹H-•S:@;RÊ¢À<0_½Ò€Üýñ8‰ÎZJ±q v2LB¶Å¡© 4%%¸j‚[Èåmû0ÇÜ*šTDÓÈR[u7s@•cÒ£ˆ{02ÎÄÕª¹ÕRSRMáújNTHb¢€³…l"ñ:  àÂr°€E ±fU  D¯A%iƒ;mc ž¼ìN¥–íøíØ›·r‹°C+Ïäúì|“ùÌìôÜ&ù´ÑzC;5HTcÂÁmµDø‚k˜žä˜xuö¡%*†5¯íë}¡3ÊfS㵄õSš(?­ L-Œ²Jβˆð\<‡yº‡âÃ!þ²7 £ff‚¢nœGs 0ï›î±ìnîN\Ú¼x¡ì/ªÞÒ^»J€ñ"kÕž“üƒ/ ¬CˆËæð.Ì=HÿK u Í P´•4%9x*ÞMËn¶—îÍŽ^¼½›D» >º¡F†)ò:m­:‹Ni˜/ÝÎC®·˜-¹ 7§½‡‘zmÏ>¸·@óè£ÁÀÒc›â˱†C„¶™Á’Ï~Î׃0vm-êz)½d{½|÷²÷ëº÷EB‡'ÄÇmäÖÈàD ­$í¥„ûM×r™æ4ŠÅ[E(÷^|ì°ÔШ­ðÈXíöÿ™=Ö-Þ¼²}€†ÖÐÀjüÏ5îŽìËjÏûe³»V¬Ç¾Ì]–qÎÚ4O–öúï™m°îÃ/ÃI”>ØÀLìôOØG9²%èbãÅ´öó&âÚ=Mãæ^ab_ØŒ‹ðŽù‹ÁáùˆXUú-BBk;7ï“~™À¥Ö“é²çu9¥¶»S¹½ÀVed 9¦È¾žC̬Eü^~-=Äf ß®²!¹zÜ µñºrÊÓöàA¶Ûùí¼9!;s–±*oÎÊ)ã÷Mý47¢ÁDZ@'È­c*߇ԇý>“b}À_«Mim5h ûíqvé}èO´qm.ò=O1©a3eFWéöÚñìÛ…µ0©ÇÜ×ÛÓ¼ù.¥½sGpÓá/åÆ;i¼ý{~¥ÍM…öýÁЊ—ÞÔ‘=‰/Øxúã?cí¬¾ 5°Tê.„ ÐìÆ­1gÙCã¦ç-n·ô€¯ÎXL´Ÿçx†µa˜®&ÿm’ÅW!–/øzþ0âëXóúÂÜ' Ë0ëÅ×ò¥\zM|ƒ\zÑŒï]äKà ®S¤Ë×­ú'´jò·R÷?§±U›ù?ç¢ÿãöÿÿ¤ïÿ÷r&ÿìi^;Qø›ŸrEÂó‹¼ÿn4_ù»¯|þ¯=Â/g¼¼ñ—®—%B¸¬x— ÜÖþ²4 /÷ Ã@‰$Ö-Æ¡K•~Ÿ-ü%ªHĽ(®=Ýñ•TšçÎíkZ³†úÏ‹wž»ˆ/}MÀ Z6wÜ}wË’‰(>Ç*Ôì§‹áaKl Ip‘þ›ºœ}Có„ÊÂø)Ô9ºÅîúú:³~5&ú£fJ)ð/Šnø‰ßÉÉUURÎGubVQv62éÉ=U–ÏçãóóÑÁ;¨\b?ô,ϬÙ`}‰êUˆ«WsOIUˆ]½ÇÏ}<Ÿ­( ›€T¸T‹ª:–ɪÕ(`·XÛÝUÚ¼"*R¼0ñÿûÿüoU-õŒ’Ub Z¸ªª¨›ýöñÑJçÌY8±9Ÿ¥ÖRžÏ™I:RÎYE5é!™ˆÜê£aÑ”’ —Z›øxœÄôñøøM3ØÝüãóSTGd‘…ÁHÈOz朘սÞõþñù8Ëç™ÚʬjjNî  ¼{p-‰AF*jæ;c%ÉYÉA@©åãƒà¤Y9 )‘4ÓMXQ;h:—±µô ¾y&V"|qÙÌ7„»fˆ:b }'Xðí½€ ¹[ú~)<Ôîˆ0ÅB,9KV%U7SÑÈÓ Ã¨ð¤w¹þ<5%jz ±ª2'ˆpµX>²0›»¢\*‚ÁSP%I®ay’ð”JÛ:9 )=¡Ä’ôó<ÏzʳsÝ©Öê,Ä,*9§¿üøYan¦ICþ%ÇÃ%I~{¿W³ZЛŅ|>O#g'wœÅˆ=iÒ¤oz»Ý˜øñù˪U·ó,`z¿½}ú§”jùH½·–ÍìД5CÉ€çyð8µUÍ9ÉýR¾%M)i5‹”¢ƒ,’‚ÖeÚ=Ê.­¥u]Æ@4§VüÁæ ”Z£?ÀÍ[¡®C³ªFÛ ¥”K-0S–r"'#C%)k[0‡/6Œ®Ü–Ý1(,¬0ˆ*Î`ÒÌân•Ì$œTš\?ÜQfßL¿Ãõ*<†Tºû²¦˜VÀ%æÍ“ ‚ hp¡¼J:yÊðZ}…­ ë}ÛHGh#ñèž¼r–&Ø $F *¿ž_ïÁ¤ íÝÌ}]IœB!d6 ì\zÞõÇH5Š/ÚÒ¦$ÆÕßz Á¼6¸4ÿ ¯´tžÈvª­x´ÉéÀc \0}¯]lëÂ/¼ù>±áS¶<6Ê"§¹û É´ôÓ5à¾XQ¸UãÐħ8Í:â zïñ(ã´'iìbVSóÂT¡=¼Ðdæa¤[ŽÆ32Ü,_ˆõÇù¨Ûô6LÅÌL4‹Iëžæ /«µ÷f­ÿs­¼žÞ}e. \ZäC±å½Nv6ËÿªP·ˆŽ·>wÛ>ñöŸVkKp íª9‘­ß¿§·@ §M'W±»ÿšq÷9aõ½chìf]cÒã gZj}]Ò:¸Ôv¢7²Ž{@¤YÐG©íØmb+eÄ”1iõc˜&"£F»_!W„y·ÿ^ŠjGh‚¸?̇)»A:;•£ Ç$©å6»\*<[JGM%ñÅ{¿aA½{íŠ[¯¹îW[j]V­`xÔWqy †~e~/õµ«R4A ÷ÿÚ•7\·Ä›Z1·¬»Œ¶åhíÂÅWn¯zÞ5ÏÙùÀãiÅÐ:kÅ y;ì/×_ÔC;Å !ôŠ^hæD ©8&}ƒËƒš¿‡žñèÕaŒ~ïyëkcôE`MeÄgï´`"².¶77ËùŒ®3b‘†d›&ÈqtÖŠá½ ´ #zƒãv©­ô&ð&/E/ …Å@ã—ákcüÖ ÐŒÞ+ýHäØ;*xJܳ²d!Í4PT» ùÄÆcªÌKþ)Œ2íŸÛÀƒ—fQô²¯—‰öú›](üÛ`úV¥yØHwž?–c‰•ƵR˜–Ó4*x™v²ãXh}%|¬°Y3•´/Ìé}зKÿËE‡Ý×Aÿo|¡ä/ñ‡oèüÚÖùâW úû½ÿ§&ü÷ŠÚÿ€ø½ŒX^ Â¿Ënü`ÿÿ?ïŸW*ÿë4Áúnå×_ùJÇÇîYøjXÍñ}Þ Z;Ë`1ׯŽú5.Ч²ýþ—“†A­½~xáK:‡;©¿ídLâ[ñàWÒÀ¾bv­ÏÌiG„ö‚±Aj Ý iɸ„3@Û$ƒºm.$šCŽéÂSòùy†ó¦…èÕtñ”ñªûù…;¤oµÆlŽŸ(KÐ]–“èûįQTF eª!Ü„ÐþÊLš&âÈM2²¿¾X¤%s®VÌÑl–R¾ïIS|MßvR7q€#rJG:X¤ÖÊÄ ÷ᑈ Kó+»{¬ÏÛÖÒ~–èÒmÔš¾Q”¸VJ©¡$|<>ÿû·ß~¼ÝEÞÿë·_o¼{or’ÃÉàfÞõ!Q6ÃùxÖZŸ¥½½½'MÎÎFLlnT³ˆvßò‘RxÀµ”óóñ‰YUÝìv;Tô~¿Qµ3>j-ŪQ%¾kRå”2r<§T…Áag9É)ÿx—$ï~œ^ÍœA9'‡?뙑P­z5A±g­ª2@ù¨FÄUÁ#ˆèȹÔPÝNsw&$ÖÇãÉr'8¥¤¤”(¥ü~{÷à§£qöc¦"ªR+—ÒŒžÌvwws5·f:¦Èx÷À˜; iR‰~?8œ ™¢•ÄŽ–Bš]Ž,Þ"ùQmÌVõYª;n·{ü×#ª·l«©è×|­ÕÌbäKZëõì ªf&ùSkÑ!½@Øêhý]; ÝG×%àˆúëUS'BcdÂKo¤›Ê²QbÕf~¥Žõooæáikg÷°Ç;DÀCÆbPëûòàµ<älÍñÌíî“vv kUÍï7ïYÍ*»“³ùˆç†»¯p73sO¢IUâþ%B̳z¿ßŒQ«5ü7P],M46wxJ9+›S­fnnUM¤@Ç3T“Æ»#~†YMš”¥8TH9ޱÄÇ£7—É!Q‘œ§Äçp¤rÛBK™¨TR¥RK 者ä”anf¢\«9XÔ+Xc¢ÍLÊ*ê0"XµJÎÊ”Xˆ’J:U}–Jî2Ê·#Ú•ë³8QJ*ÿ?uïÞÜJr$ùÆ#«òôC£Ù]³k÷û¹Ý;¦‘º Te„ß?"ò€šYu÷jV3&µtxH¨ÊÊôpÿy¨hÎDì°\³Ìzl›•;oÛvš×¸½VóMUYŒ\ ƒÊeߘe§"ÌQÒ`qº"Ñ«lØýöñùa'¹ï—Ìæf‚â²oÕêý~f˜Qz\ã} ¦–x²9œ‚(åpe“(;ÜÂÁˆÊ$#'¢"¼58P«×¦µ'a̳û‚3¸S €`dâÌÂVM’v%EÅ6zWÑ,¡YÊà !DªÆ‚“ÏbkÀ`€&U„ôï‰õEŸdÄ$K¼`5æCE)Ê×ò¬ ·:EK[ rîõ}Üèù¡ÓùBPßjv IDATö~°ìûÈüŠö µ°Q‡Ñ„riß±‘ú9K¼¬YšÃ“<§þ†¦Æ#zxIJ@Xýž± NÌ|¿×¤øÃÙ¨=ñ‡úÔÍaù“ùxvepÛÂZÈ64(ñcÊÒÁÃàOk¥,$½ˆºIÎ<ïôFefÖg¡“OZî$†S]´jš‘[÷‚XdNò6üCzê‰ç‘pW‡Ý3 Sœ<Ÿ¶éƒäÀv„.úN/.¤Ø(b¥½óü)xsÙ6L 4×v¾ÉÉš¨9©Ãêƒv©¬ïñP13'7™É;ä»(<%XhÛ¬”§q‰d]ÐìQí#´>%hè>¿§¥ì™;Áy Œ¨s{@ÏXª®P5/T.ACimæŒÁÙ@ŠC¶ëëßTï+ÌBí›dÌA&_#üTÛKcþÊ¬Ž¥µäùGQ' KÄ<•zÝ%2:lð4`ú¢¨˜ÖæQýÇ+o6žäq?>®×«[UR'fvÍ–jÔó<éT¡ûÏó¼\.õ<Žû­òq+ª*ŽdÄ[5.¥Xµøèv~û×ofvÔSXEB¬ôûýVkÝ÷‹;`-WUwP=­¨Þû§}’p$ÎÙê‚6Î D%†u`0Áýñ^ 3[­î9TþÏ+æ€ë%1¼@è’sÕáȪ·ä*p“D5/`îÝÇ™†!‘’ê\'‘aÑ1ȃÏÛh<ð šN±ÀÛ‰ÃhO…tSÝ÷]„EUE+̪ŸæµVs’†ƒ¿ì»ŠÜ΃ n`& IiÜ™3a©„ó¬[Ù´h%389JQ:Ž„¶+†]‰È* '«^Ïóúv ¨dƒ1‚ÃÑ"–(Ö²) ÌÕì8jêˆ2+‹0À´I±jÕqœ§ÞÏj–õ Qða2sr§"Ìšù's'¶V÷“Á¢jŽ“Î‹ì± •¢^ÙájØÞêYYØE7Ǿ_à$?¤®µ~Þo?V½Š–(?( ¹\\ÝÜüóóãû÷_î—÷RJuÛJA;mZ wµBˆÌív»}ÜoÇqºûåòöíýmÚvsm+Òå*Q€»i!¦ó<vœg­UT”UŠÕËõ²ï»W‚‘õˆ)“¨†ÎÈxu)"ªælf¼…1?©VP·x”ÅâìGÌB…HEá&ÒÉ/¡‰·Ë••|7B!a³T@C¡Ÿ±(7ÍÎ9A g=á`bE¢âCÆ52°Ç|-mæÂ0Ê^bRj³·¼ap½3TrïA|\›üÁÇï7è˃LÊ•„§›;"Èa)Ù…_†O±é,¼:B;Þ „äÅú,$¹ñ˚Ķ!#«Œ"¦¶ÿÄc ²ÙíMþ;º0'{ádüL"ÿ€FäÔ§µî%¡s'af+„¼‡6Ãx2Nã œÑ>0[Ù1š&Óþ¬±0‘SG½i)îsã`’¼eèicà€%Ò䯻sòb_‘y¯îg[}kZ‚ýU1'Э±"£Q]ŽJà~å´³1w]y¨Fžàtb"[ópc³Þ§+ùâ2tÎZÉçx¬ÀiI*tmŽ’Ò>éª:Â\™Û3v’U?]›ÂܸÃý¬Õ`\LBžhNiãŒVÉ1+ hùP9 ­w—T4ÆÞçætÉ'F¿' QÒ(y ÄF}&=ûÜ»¢á½EŽë–DwûzL̨_¼ &ÆI³„ŒÝx¡‡~Þmþ“Ùð>‹½x@Á¹5Kçgέ´ë¥Ýn•Ͻi­›Yƒ{ôÀ¤éÊVkoëÆà{ÌýN !Ç÷hP[Qœœûóf¨§Þ'|½Í{!Çå‡I$š¯Éùã â­µX<µ‘iì™jB˜dïî—Ãxß'àB$h ™0¸_i7XíÀxt7þø$Ãÿ奸-zo¡¡ —æs%TdÜçÎ3…§å"0YóZ˜Ðö Q6ï_:‰Y“1\àišž÷ÂԸܗŽ8*æÌ)xìÂ},güü³»Eðàð¦ÅÅ#È‘ÓCîã*wg&mOŒ¥ v]4æ14 „â‰ã‡cÅñ Ò`%xi§NÁÑ5Ъ6V×71Q˜z£w{ªLdºéFn9‚~ê8CxKu8óÊÞ› eÓé´LëL¤ó+Ëÿ‹œÉ¡¤ÖÌ&Éy45ìâ«@Áð2Ö4½4çOâ·të:“òÃ=Eow´¯ëĹé§‘YHÀ¬‡²ùÚê©BñgÊÈjàtôeÊ:õö$ ô…Š@¤@Åy\'ëòÀSgJ§Är¸í´ ´uï!}14ýN4ÂòéÏÿìó;€•ȶÂIÿ°îß1ø¸}Æ™¶3s•p¿ÝŠÊuw¸×RŠ;n÷[µºo;iéwbvUv~»ð¾ÙußÞ¯oçy||||ûöÇ’¢eߊˆÜó~Þ1¢Ûq£†þ¯·Áw)ÝÒeff•ÄVe)%à-–+jy|ÕêU$ÂÅ`eq®µª–o—psû˯ûëßþfæ{)Fnf×ËV´‘HTxöOWÜ-Ì¿ ùAöëõrÙöp"W«aê€_¯»9Žj¿üò‹²øþñy¿Û¾_/—¢Jfe˜ÕÊDªº•°R²,TËv||’Hµ ¸ˆÖ³V¯æ–:§»›y°¥…Cy4· ¨Š; 9^Š8LÁD%`¾BâSÅväëYʾ»U¸óNßÞ¿‰ª»•RÂý'ÂÁÑf¢ s÷Z?c#¬œý˜áyÁyŠ»÷ó¬wsˆÈý^ö}3«nÄL¢zÙv«U%>èXHšÝ@ aw•ì}m ]~rù0÷¸z“z`Î$û¾wúS\ÕhRÈ<PÕëõ:ª­…¥ðÂööÿ˜@v oüû¾ïQùw„F¿ 0– ;î°ˆ˜$¤HZq+ Å½6¢•­ÑûyÜï÷ض¦YRrJ/Ña—iû¥› +r‘g„]#ÐÐþXTànã÷€ÔÆ.$Bä?êýÉ Ï`ª|¥¨» Õ3¶çÇé0»ì—}¿þùq?ëyÔ²¥˜g‰lªr¿ßÎ38æ²±HÙDDõ8׬"—DL²ê)9l©d7'ÄãNæ´§>ëEDdËjkÎÓI”‚zã}Y­÷ÏOÀ„T8÷BÈå‘TÔÎÊBÊä¢Êì;,$Âêîª[ÙËÅ`Õlð&.Ì&ZJL^B ),º·Ôͽ”xT]Ÿµ‚ý×°^÷=X!޳²@ õÜ6¸ŸÇñùùÉD—Ÿ*ÛÎÌ8`vEè<Ï-Vò〣l —Ëåòv¹Æ<¨ìÛúC=«¹™ÛõrÝ÷}u¢zæ#K´\/;ƒ«Õ¢*¢Â 23Y ÃUàBv"eRXªVÝ™”)r]ÑžÝ}@gÀÉÙ;¤ZU•}¿¢¸¹ËiEÕ³ÄÍœÂ$Qh Z´DÒ„ÜM0),bј…É%óöVã —Xž`­p–4ÆYÑÂ]ï9 GN!ªÄÊ-ý/Fͤã¾tt(ßÂäÑ9«f§®Oq3ær“Ä#˜&D"¡NÔx„¶áÚY™˜ÅÓúˆ›6¸•øoŽ^wÙ¼™EhƒÖÐ4P±QwÚ%É–‚E÷ºK e>OÕ´V2w¿È²[\ `iäô¢Äú–8JéfÚ|–ôÚª“uÔJ6á½b“ü1°®Œ®bÁm÷Éitœ`Þ«wGu»í˜æ"ÎñNçê)Ý`=«²'†ºÌäƒ:‘B@kœ­%X÷i Ùæ£g%üp×ÙØó7 ‰]³d"~`”»`¸G‘¸ÃÐÔ ,;3yí`ƒÌ<ÓŸ0Y§¢×¼Uy5݆Àá³–†6ÁèÂLB`Íòç\Ù›ÆÖƒtS¤cz”Oê'/Înl”Î aJ9sg$eÀ¢5HÖ@k@vfÎ G?‘ÄÄNF;Bo' ,´u=Ê ­Hœ¦ i9’<+(³Ê‡xv»Y{QÅ,Å·K;­¿³%Mð+t~<>8xâ)÷[ıÜAã:Z!á 4ƒYYzjþR>Ç9:*ª¹˜3¡Üs89$n~åñųUì9 Þwª=7±þ¦ñ¢ßyôrè¥Ô„|ï'³_—éa0妲‡å%a‚‹¶ñ 0MÅ«»ú‘Ò¥LžráÛ¦Þó …<[u§*†FÿäÝþr1˜.Þ‚i@5\Ží }zoDæ·)Ð[ùQû@þÎ cô°¾çSoÏq#²½ñ‘Óq‰ùÌ|É«ZƸŽiÆõFY>¢Nv®L¡ÑMëѼ»G;ý‘è·Inž“VCÖ¾Ii#˜·MýÇJꉱ©X§Í9±Öƒ /G‚·ÈzMñT¨¸dê0:z¸2{´0xÂõ*•Ç& ãGœÒÉÉc"°j:OÓ1<ŠãË0è‘fGs­ÀCA8(È ùÙ\ßî™FÀâ§ÖhZ‰G<יϠ‹Gá×3‚"n?ÉS»u¼äOŽ˜M¬Æ³&rœÒjZ­DKâ†;·µ“Lóªe÷AE2ï=ûM»óµ)Ø}À…dzxçAq Ù•e'H’Kà@Ì zviÃD?mdÒž9Ü÷T]50ZeŒßïõ0Óî/e¥X6ÉsÚ"1Ÿ¡²©ªæ1Ã=Å5s*Ê"EY¢uÙ̬ºÓyž¡ ˶•ð;EÂåZ6?í4«ÆEÈXÄïGµJ†úyUf-Qa¨µÞo·ýri\øäÛºùQ«ªöªÖ €71óÏÛg=«Ù´le·ÝŽó¼Ýî×}ïÕÖ½ÐÕÙ™1ª¨ýð¸S̈ÙO¿ã` ›|¡.É| „œ{)ÊgŒõ%üaŽ´ßa/zV\vñ^˜Ò?YDT4´ûÐLÈÒã‰y=½ˆiᨅ&w¬>æp†µÈ JT®{"%°uÇyØiíAÃ"ÒO”fl2·»x+Ý 'ÄæŒKf÷åÂOuGTa·,{Ê¿ÍÂ(í¼Ë½  o°€ o Ó[®K6BˆƒA?ãÂ)Ê‹ÿ³U϶ ½~àN ~û¥sUˆñö”Œ úìmiÇØ¦¬óbø–ÅEÎ4×1Rg, |z&AˆZ‘Ô‰8g>¹vksÿ{2Àǘ[(§`{ ]|^ŸŽñL™=Ö¤ö 7ÛvSÄSn¤´Þg¼µûÓc¾WUs 8ªãÓú焈I¹3yÒ÷ú !¯B´},8Cv1r- @äYÕŽñ“.¼òϧŽÌžèÀìYÏÌ*èlnò•σþ*Ú˜`úí‘=À™ç[Çó“0ùô«[1Ço.-ÐúÞc[Ã×¹uÈîËÌ’ˆ {jœ¹hi’S.+ÞOm€ÈÑBŒ¡e53­·-ÖЀíT7œTë1†ûT¡ƒH5(G»²1éûq© ôáøž8N´ô)ð<Jh•ð04Ìœ™)MòH¾]c鱉óL¶úî7…ë!i œ[©•ißÖÁÕ…¼à7&ö­è8Zʤ ’ûJ'z*Ó}˜QñÑçç¹Ï·Ó<‡[ÇüȺypnÓ´²ñúKÏ Ý ÷xÔZ1ï𣱒|ºó¹O+ŽÝ ;Ó|øÏ oZFGÅ׎ß|Kc]jšîÈ rr=ËpãIÖ›K–^EÀû4‚Z_N¿$c˜Â"CDPÑö3Û&*Ðc¢ŸÕ]D > jßͽ֚ډ¶ôÒô€i©jˆœÃâqtˆ ó\,>>â¹ÿ„&ãÿøÄ§ößqÿ¡×ˆ`”öÆ~ =íjó|<…s&‘¥˜émœÍˆú€È;f¼VN¤SµRM 5ÁqªÄ²ñDÐòŒÅ/øžÈŠò(Ö}Bµµ1P»ðx—Ž…òkmxðKó³ú?î~Ýñƒb><À£ø÷+ïüè~™þòl ™£gôzìUXeée†‰|—±40/þð'¾5W¼U›¿;9žæ‘ÿ±¬Ÿßá»?WðÓ?ãå€vúšß ôDÿÇoz‡ðORÿù÷ûlìÿô éóúÏÄ<ÿW0zfòðtc=ÚËŸš=æ‹Û)p¬C"^ËÒx<™ú«Å”ïc/Ù^m9RÐCË/¯¯J溨ö4ÈßDòΟü¼’C…WhüØ j?Ûõl/é¹%WщûÎ D™¢ IDAT”™˜Œh›'ª=ËÔuyi´¶YŒYzˆuâ¤ò€>./ÜÞÌOS™#â«CdŠ_=F„–ùCï–òÓ?~~ÞîÇRzŸÉ¯—ke‰eº\/ªº•ÐÿZ+Q‰CNõš*|a¹Ýï]**ÑmÛJ)µÖc›S»9­Û>F„¨߆$.P°J)Eâë›EÕìãóûe¿Æ½#ª rómKƒvÀõ{íXì|"ôpÙ÷M‹HRæãwGôçZg7îüxÛZ9u&a¬ëh6Ezf} =VZ~ÅmÐ.¹;ÞSˆfŽkæfš~öCwí³öQ^ài ûDþ™¼µ¦e–õ;Y½í2'ÎÖÈWL³a"NU¯©çÜǘJQÃæÂK¬!vPݿ̼¸ŽÝ„bnA³þ;z®9²\qذ# çäÌ‹ÔMÃõ刨Í=ö[’èé|h}Ày·öAMÏÊÎÇ[u‹iº–Ö2Ò);ù¥‘ø —}—¹;٬ǭÒ5»´_‡M^´G,Ì¡…Õ†l Vù“îCÕÈ ²KÏ¢M‹ý¸p¥Ç…ºËF§A€è¡*½Ýާ`Kž—$ÑaˆÉpa Þx„—|̤9ÍtûiW…îÄÈ ÃOú Ô²D^@r06g«ÇàX…±þ1ÝÎ#ðbâ· åÍ5òB6oš=¦Yë„Øz2}3=«ÿKl€¿[¦ xjX°óÆê¡¯ˆžúþ™ÿâ î¤þ»_ðÕø€'“ðïøš'ûÿ?ßûÿÛéÿüò“xø¾x|ÏiŸiµäW3 žIï/XCó“\dýS™he!ˆÈú1p?à¡nx®¯e^~Á¹–¶ó¥Aûèß@x¦ŽÔuHüðTçò˶–â’øKí9f-èû:bÿgò0ÄùEÚT}Eõ¾?ai ,Á‹)&:2|ã$8ÂÖÿN<œ¸UÒtŒàü–.%)Xp‰­|yRÿýáóøC¡Ël%@:¦Z«JÙÊvÖó¬g,¯ûVþôãO¬"fQ&›ž& P¿Yˆ°Y‘JÎ,*ZJ!¢ËE®×kœÐ~šÔsÏ;ü<ÏjFDo׋Cn7báò’šé ¦}»xè(Í înÇa­'Vú%:Ý.E•åz½Dr”Á΀øZkжí¤ZDˆIJ)ÕlÛQO£ÐIA¢•‰·²ïÅó07#®f·ÛYO&>kU‘···}+¥l?|û¶—rz½ßÏ_¾ÿZíÓÌγZu6Çßþíßÿü?þ›[=9ª?­V°ƒ”…”÷]„¸º•”³{ À$Õ«Ù÷¨ÕêÊåØȽV;k=Obª°ÂBÂÇq/ÍäîîE•U„eÛ7U‰• žõãóóãããoýëYO³úv}Û·]K¹^ö²íB´m"R~ÔjáÕ‡À-¬+@|S9ŽŠ¨Jµ*"aËdbm¾Ea†S­Ö­ôçyŠÈyž·Û'‹˜[8½{b·; c³›€ ÏFB±Yv]dÏpÙ[û¸UÄ=ûÃrožè¡ÔèÏãˆ> ZJ&x'n:ø˜ðБ˜œçáfD´ïçh ­a+4B3a3P‘2iøâY”.@¯IT2Ï%Ï18nÙQ†ÉÑ«¢R¸ha'#çL »1 ‘²U«Å6)"ZTÍÝŽ“„ªã¨ç¦EŠÇɤûV á¸$!̉…ŠÊ"×ËnfµF!t¹é0KÈX›ð) sh:ðÜCt¢)AY£mLV«€Íñ¥:Ž'±&0‹›Dˆ›yk7O&zVßÍÆB’%‹ÑµžÙ…ûÉâ“ÒZÏÑ  swDI­„üg#)ñuTr5§³Vs/¬B"*<™Ü-ŠpdR‰YUöMÍ,4ÀÂZDêý<ï§§n›ÅLȳñâííúöv=«}ÿü°8n;|ÓR¤ ¢ìp· <íÛöóŸ~."G=Éýíz-UϳnÛvÙ·z:Pã¥Z$Gø#lÂ*º•-=ÌÎãðj*§óp† ‘1` r¸²DÇLuËÂtWMy1ñ> ˜›™ÇU±{ܦ•ø¤r× *Ìšm„êÆ^À¶±ºGsªÙÔÒæ=¾ÞM“DÄTTÙ䣺•R@¨¤N &.R8"uɃw3î¾ÄIk‹¹øÜo$·Ã1æ]!¤²8"¨— "iY¥lÜÌ‹ÛÓÁF+ž›Ù'¥‘Áz\ ܧ -Ö;h=Z:ù ‰»LIÈ0Ô3•ýÞ6—ÇyæŽNüñTš¾y.0©íêZ/›dšLÏS믋ܳ 0å`ËJÈî{é²1>'ž ¤&Í<-ŸÙ,‹žªÕ¯?\¦aÏd#‰ÁŠôÃ/è5¨ ÁÕÜß¹ð@ä Ø¨¡¬†§O¥(S"“*7ÇÜ8¦ÚM滋à3îñ©06D–W7£ýôõ½r›'ZLcÞ´®ô)xzpçãW   K_šs©}™«ýÝÞå0_ M=ë3Ž ]{\ÿÈ Nó’'P»KßÃ󞟇ÏL„q›À=·ÁÒL>æ2•BôSßcuwÍ<é­ó•Œ L|ïÉj=ayjyÀÔ¸ÖpÚÜæ&ÓeÉö{6D~žÀxþaiüÅÀJððr5í•×—GÓ«Àà´L%ãsž¨Ýy¥ñ4gäXš€?Ô+xiWZxûwÊv§ì£sk´úhi”©ãkmÓH–F³‚òÑżIæÆƒY÷EÐ}¿XRO^üa¸ëeèóìr•øéÚ )£Ö§8£*t-sˆQZ7I†P©½21¤ÖöŽÙž¿€‰–äÄTÕç rBšq&ùv2ö¥ó‘¤×xò*ó,,ÎoÃdãö’ᘼAÔÝ0-5kiêIráÚ%Õ¼CõŒ§SjÜÜÜ"IaÊþÃûVf%cÁÄ£„Üói’ kއ k¡,?*‚ë O@~CûÌû(oKA"k÷ecÆ#“}Rrf½º­]SH7ì/+Ä4ììè…6‚ä–é#Jî Ç\e2Þ™ö>«èîŸgEñdíˆ ÍhGQ¿Ï3׉䒳¡¶HÑ׬ŸG4Î+©372ùÄ ë5;OÅ%_@ê¿2}?4)? ô/l‹úÿZifzLÅsùcéÿÌ÷^ù_Úÿ_¿Ô¯ýÅÏ•—ó˜ð×Âï¤âÿ“†¿±û—£CºöëÌ/¹Ïç+ó)„ójTÁ¯‹)AÄäþ$ñËZͱÊùM¥Æâý†’¶ëjþ)ùÕÿÜѳ#?6óÔúî‘æy–ái¡)E2óO#".ã÷œþ(žT­Ý‹§*]Y§ÄDÜFùì4ŠÐX¯'GºeëÁH´%h»±"­dÁÙ¡‘¹½Ü®¿j˜âèÎ~±áÓÒƒÆD>Mš,™Hî‘?ª  Ün·¾ßqÇý¼w‡‘ª¸kåjföqÖíÇoßöm«õÄHtõÎÔÐVÕ}Sæ]DŠ*€_¾8ñûÛ5dD1÷jÖÏZíèëqB3ó³Ö,í泞"r¿ß/ûe‹ŽË›Š„Æ ¢à˜`†Ø0-ÐF§µz?ެ«‹»ÕæQНœ™ãk± f9Ï£” ©Š™T?ì4sÔzžµ¾½½!jˆË¦¼yJUèµ~Çq|~~n¥ìûînäøåûÇYÏûý&"eÛ„^ýõû·ooEõû_Ýxó¬8e Nu©^£hDêL eeåï÷ƒ EY‰·aÆ"p—¢ÌJ›x5¨ˆòÝêÇÇGð»¿}ûaß €³VeÝ·â"N÷MÓœVëùýóó<ëÇçGüàýýÛ¿üé_D¨”}+…ˆn·O¢xokæÝE˜HȽ{c–ɬ"T«Õê ÁLÄìN*ã0§]NÚ›ÝûÇ÷ýrÙ¶²ï{ô6sšad]¿ó»TswÛ÷½•=0S€i€6óøþñáîfVJQ–huÃ~iÕÓµV‡KãC—R,*IÛ_Ù7ª) /‘8òy­ÕØ>??ß/×ËõM7 %ƒÊD Z<`å‘«p´Þ6xÂ=©O׺ým²ÑõâSbÒÚ‹Juw#.BÁ‰2e"®æ°jÄ•k)QÆ ¡¨ðµìf ".¢F*»jÙ¶³žî`+oªÂrRMw.¨H9½ÖãÐõÛ–þt."§ ±™»:[(…î­:Àê^a@´¤)H2N<ÁT„Ò¦O¼ZÜ&â1wp÷¨«çYJȵ73T ©%E‹¯KsžÆ§ DnÖrÎ,$ÕªÃkµ­'08†4æ$JE£´€`^­æ‡bpöœ…âæv7¸³°Õ|°êP‘0zÓqÔã~AU na:­^¤¨JÙwy5œµºŒZkhº•R @›êý8̱‰Èuß·R¼Z=+¢¹Äí׳Âѧr¨Dƒ1™˜uSw¨°2„Y„ÕÅáZ¤èUHîǬšüôl ™X$[s×}‹g£Å»`ì¨Á Fð’€´ Ipœ5.-›„|âPUŽ••K†Í*Ѧâ¹yQawj•´½˜6ƈ‚bÑ.¹œ„ý4‡‹ïyªŠ[Ó…5É&"q=ÃÙƒc`ƒNÉ@ÐÅ;|>ŽvÂb³q’ˆÄiòe¬ª HeËa¨uƒ%<8½í?$È=S­:GxŒzƒ^`weÚK"óûÓÖ77F´6OvUM¨Ÿúlgê/:ä1~ëÈö ËtÌ]¬Òäã·Óv»N´Äì´j˜Ôfä†Cʲwò^”*­D½):¨#VÖæOl®JžÉ1ÄD.Q_€ ;Ÿ`þPŸ³½%v‘ñX¡nßafåQb›½˜i´§I›°ÐÊwÂèõy?½Ø½?'™q§Ž§”ö;'±Å—fÁebÇ`jB¦Þ ÐHóš¢åàν$£l[‚fDUb[ò`áðx:²$³±§'ƒIu›jCi§€7'n”ú,ˆ'µ“Q5ç©LR¥u}²P»–ÕÏ5›¡Ðð”âZ(5ƒžÔýÀ­×dòó¤cú¯Ä•UaÁ< z>³,Ù—‰ ³”`QÖµéÝ4hr‘̨ 6› Rs)0–JŒæòà‡pÖófÕôfüÈÐÿÑÆÀ4ÔYŒWxȯÐzb_^ãwŸü›ÌOR×ÊRïÉ€/ÔÿW“äÓ`éR^ÛG'ì÷fŸÇŒ5«;wôvÐÒ|Œ±‡np–ìn㙩[žK æb€™ÍÍe?`˜M„ç‰!š<¼èfŒˆ¼†š?¹­i´¢ó44Âs£)&Ê9ºo¿Mœ»Šfz@y:Â;CÀKÆ$–=–̬æ×e-F¬H[†Ì“ÉÓó=¹aŽÈûð@æîf̤ÊZdí̵‘ñ(ɉqs:¶ysÃeíyŸdÆÆgqÿ+mN-85‘¾Ðxóêsã…±#ÎóœÙåéà³ÞÍ 5ÑZþ¬ò <¸G ©¹a´},ªm+sWÿÇèmîŽ1À›p!y!×N³-<¶ñ¾Ð>'å6|¼|}Æ.=ÂöyD¾RÉA ‚—Ò÷þ!^ãÔÚ«yU=y.mˆ³¥ùµ <“0ð¤kãU쀰âóWòWîóÞþò–åâ?ÿx¶VééÅoTÑ ¨Û,þo-þ¥ßì–~,ñ}9Mà/ï¥Wð,?^×!À‚‹áçýÂãKBÚ•¦'Óó7Œ)Ël€ç8WÓî'ïÃúú‡²!v¤o„â„:MÜÁAægM—[dúgbçéûRÔwÈМ©L¸¥ ôÅæª‰†"KWJîjX—Û2ŸÒÄ}€$›·ø¡%O©-‚ßͤ0§¢øÕâ4ÿÁë ½ #ýQ €³V 7›F+£¨ˆ‰¨ª»çyÖk)Ñ+«¡¥ÞÏÃÌ·­„ £¬]ý a€¹Åñ©š‘‹÷#\xT¸Z Çç½_öoßÞÃùÛ¿,,×}¿\.ÁOŸBˆh³z¨j·t©jö¬{—ÏÏ€?¸{0Dd/ûý¸ÞîE3¯åœ&”’Õó<‰ØÝÜá&ˆ°Ããd¥è‰m-ÊbàÖuL(ªªå¸ß¬Ö¿þû_þ¿ÿõ?ó4÷¢JÌïïïE·£žfõ¸ßÞßßÄî÷_¿_¾½·Ó"˜ÊB»Ã«{)[…í—½h1÷ý´š€|ŠÎ&,"¦Œ"L^EÄav³ûçí²_®?|#wa[îÅN3IÞ?>ïÿöoÕj)[li·R~øñÇm+÷û}“òÓ?šÕÓª!ˆKõ¬ÕÌDƒ¡Oáè¥ Æ§pÅDHU,ôábf• ½Ücá¾Ù÷ýz¹ìû^¶-4ÅÐÏØGº8YT¤š© 3íÛFDÕ v¿˜ Y\]‰åuPÝšO?ÆK>J4ï48" iÚ„a&Šýýý]³Ü+Y4ÙÆ ˆœ'6À›¯¿JE­ÄÒ*R£y¸ dO$QÉ㳜f9̽ÖZkæ"",^+Îúy»}ªnÕª(|1]'Î6%&βnTÉ@tžçí~§ÖÜPö-ö‘µž§Õ]7$b…•Õ‰Èí¬Z„ÈÈN«Ì$²'­Jv~27ae%ƒÃRbÖtsö…7 „¡È’[º”ME‰É5:`Š›‹”¬JsH Ž!HV!ÁÁ…YYBØuƒÁ™DZJ4¬JIÍf€”Y‹žÕ`øý¸—R„©¨9Et&:‰™ØjurÕÒ½ô-Ž{€X<Ó$Q8Ñy8*w1uÖ"È9zúnpsdKDh£ïMB‹VˆBÃÙ7{<ÚS[‡!‘Möoªw³ptu­›ö9®Î˜]poÜK•¢)°–½ô¹‹’TDxlbZ–¼çÊÛ`v*ÍËöÃfÆ“ä¥ÀXáBH嘻[rì_1œ!ûìéTÚ 7'½zxÒ¹MDSF žJ‘[m2EjiH›<‘A:“ “òË­è±IÎÞÔŽÉ¢s+jNçKC¿a~Í<Ó_ò?ÎÂIãêÅŒ´pbPÁGò®úvN|÷Ø vÞgÑE ñz­%+„§óóÉì¥>õJ§1Ÿ©! »¹ ´ƒ¨i0A»4Ür%ýýî ªVF=¢ÎOGOð4ZhÁð4H[•ž,4ù˜är·ØŽN/&ï'³¢Vu=À†˜ÿtD§/’‰ïÀ ´‚ë.ð¿ÐOÐù‹Åw¤ð ÷À3»>?•ǃ¦ð,˜5¯É¤¸õ¹V^§“Ÿ¹§¸¡J¡a)…Á\yK»=Dø³ôÜ™>sl:Þck4]8~èÔÙ)×› &Óì†æúßvÖó)j‚–{èõŸT.ZÜ¥Št›w£ý © é2Ïܸ5HOÐÝ)qÓ4õ©ô¸EAz¿ËcÛ³°Ê#6÷//"š›ºÉéÚSöÂs9Ê?3s7aÉã4ƒçÄO{²‚ is ¨"ﻑ¡f;ú.b±[/zl{»h©×^Àw}ur‡·•^rÃÑå|ÖñóczŒc¤IÂû908ãfêt´Ö$á¹nöèÆ¬EÇÂÂIõ™¼ÿc>郌ÔåòVKüT4Œéòž×Éu/òX3^k–þ_9:‘¬ ¾ýïÈÀ…;Ó²‚•H‚/ÊXgùÈÐÒbÌôw‹O¨§oñZ@å¯ôÂïüj<ò¥»´¢¿àŠüîzô?þ=g®V ÿîç¼þÑxªþmÚ=þ÷þÒ?Û÷ÿ|eüCðŸ¯íÿ‹æþl˜“®ó?óÓÉëxnþ»<ú|[¬jñE áñã§f‚ée=Þ<Ó]9ÿ²üÆéµRë„ÕCôoçäxú s_›…ʧ7!ÈpH?ûÌóJnÊ>–ö„fÀÿU´yÚ€2›Å$ÎÔSaA$¦òµößdžÄ¶ïñ€Êì7(†¥AÅ>Írã¿ciúííCËý;óæ¼eü Ÿ'è=S(â¤Ì×Ëþíýííz½Ýï¿~O¾€QTÏZ¿ß>DäýrÝ÷í²mÿvûøøø ˳ªîeß·bîfþy; IÑaf%¢ûñ¹•ËV4†ŽLÜ\„U‹¨ˆæGæëåòývC“beOXÿõzÙ¶ív»…äÜ÷U‰ý\.{)…g9sßJᑇj¾Á™¸ÖZí¤ÆòÆyÆ÷`îg5‡_ÛD„½Ö ;†qRE¶RzîM äÂÊ grómßDE…γŠÈ¾Û[cL[­D¤,¿|üUUúé§wwÜïÇOÿú熕æh¦=£ž'ÎêDÛ¶…êúãD`ó w7‚¹Âç)ĵV‘29Œñí§¶m/E™Ø¬Þ[št¢"înŸŸ7x­µi¿ì¥l—˾ï» ÓyÚçíc+»ˆ˜UÙ/—@ó7û¼‰O-oî.:|~ ½«sbF“ÿ›T!µì˜vbÕmÛ²’TÄÍJÙ[ؓǘ®…S¨ }ÁÌú”t„¶šY;æTÖmqñnÄý}ôÃ73»÷Jêu®ÌͤØ4»ö®ìÛÆí’ã¶Hªª±*ƒænјÑÏ`,š5"1dí­€}[ܪ×C`lÓB«ce2úT5ÔãÀe'f‡“ÁÈITXYYˆØO3¶’öm+¡]2òldmEî— d)“ŠZ=ªƒ‰T ŠŠj€bŒ«»ˆŠ&²'VG&cìt£„WŠQ­VL¡DTÝàœ%ùè «yÑH¢åÇsl#­Ï4îTá]PθW¸„¢fáXIظ܈óÍCQ%±ä™ø5ž 2¯YgßGMŒ]TE«UÎ%0Uæ £\ÖœÀF^ îdNàRô"»»ýí¸‹ÈÛ¶{±òý¸ ñe¿„bÕe+QÄ…î^ë ÇvÙö˾=«Ýn7aÙËFµjE´’Õ£²äõ–Z&q žè4§Z ÞÆ^Î IDAT«0™C……¸†-ÿ‹ˆ·ŒÊŠ-íš©j‹AˆÁ•Dd.ÊάZ”€ê,Þ·úªRŠñY«¹1Ó^ ±(³g*­Z¹·C‚ƒtGMàkºjŠd«VM C¸ºc¾ž)D$€! +²È7WƒsJãÂLtíBoCŸÈõŠ=§T­—ÍöÊy§ž˜ûA`˜ÔÀ¡S3ÓÌþC–¼n( æ¸n˜IºmVƒ³ Kæ“hø5ii`¼Œ¼7>D;<7¼b¥åç#¹ ãQDJˆöCwƒ;ˆ=kWÔ·úá¨à)s–ÚL’vVûêЧ›îÌ*]5p´v–aªåþ ¦ë³+/)cÈçÐ4#½ð²ÿ²)) [|xæAs?;zcŽä_í¡Ý´Ë™WOΆ±DŠQ ýÄ‹`‘›{oâ ÎÏ´ãuZ°šMÍ«¨ÍÚûø‹=ý–("]aýsšm‰´¼]Á›ä?"&O1Iz uWF{rªíY¶I@0}Úø{ÖodÕhLÇ@;.<ï×ÌZ<ø´Fi²ÅÍ?.ÇÑ=úúgÞó9®€aÆŸS5]p¤çŽJïêÿ§ X$«x©ŸåV9ŽÁ½—HN· •ÌÖΖ©~yôØM;ˆ ¾_VÜ­k¶·*,ºS“•ÆÆC~žfø Ítµ‡¶EY“ Äm¬ÁÝüÝçƒõÄø2«9œñÆ?Y1¸!È£™{3er`0Ùã|?ÈT==ö*¼ÑXF¾* eÕ‘ó7H[uľúx8ðµ±3’6€4·pÅ©L c^ëscÔÞ]8.7kW|˜¦VsôË µ¤³K‘±[¤¯6Ž,º|6KŽÿ(zå™*ÏSq¢L¾_2áæÂÎT’w;O$ˆQ <ÑܸywïÿD lVîå9?Òê =kµ°êÕóÕÈ…Ef"Nƒ"ÑórÁ¯øÇá¾À‚È늀u¢ƒE~[úRóžfRÏîï…œõ¥¨ÿ<ùZíþ’©ö ‹òï"‰ÿ¶€c%Úáá {R_M°Ÿ›@_è÷°îÿç¿JÃ?xmÿÁç™Øú¼Øí_KìO»¯/ øaÆöPùóÕüîÅ)ÏØâ}ÝýÿŠzDË`žy7ÝþŸ}e’íq•–5$´êŸÞÎ32™¸È) A§B{À5WO>ŒSpCÏÿÆŽ'ZΔãÄ8õ¦µ‘6¤©(<«M pb~š²„m÷©þ·›AdúDxêHŠñļuêFŠçzïñ’0M&ÖÁîj&'.¥üðþM˜JÙî÷[rN8{wƒÊPkuÇ¡j­ùË¿—R~úéÇ"É<1÷è‰=í43a.EeŒt$Цðåg€†žÇ,Ì—}6YfÒƒ«§—6´oõŒFX¨÷QÛÛ}Ü{Ù¶mËÒSÀªA¤…c+›ßÕzvÓw§Ѩ{ÕÍ Žã8.—ËÛ[–ÍÖZ?¿–MÍœˆöË)r#ww 4|RèÅê)¢Mr‘R”y/¥ˆF‡¥œçyÜó<™ù‡|{»žÇYÍvÝÍ̬þûÿü_ÿýÿý:'6Rn úññ¹u3MmÔ½ž‡^¯LäÇA"dVŪ1×ùá矷mÿå×_j­î56¥ª;J)ß¾½ søaRáì†5»×Ó *ÖVafU".B—Ë¥j½Ýo÷ãÞ’ ¹1l8„÷Ÿ%ºpÁLQÅ„¹5[®î¥Ät!kl&ˆÊq"ênĬ2É,äQ9áJÛ$ÀÌÎzdîû¶›YLŽãŒ Aï±Àdea¥*¦ªêÖQ¬)êJõßG_"J!qö¾Ìf0‘pÛªŒoRò­‰þgÑ£BܯMµ“D”€„%lqèè‡\•’ÏN °q+V`aI;¡ì[­gw J XZŒ„‰¹l**‹%’™"ÕL„X¸h–KÀ£ã tŒd[å2ÓfõdQ–„RÔÅATÍÜœˆ´4˜S܉æR¤¨î»ÌÝ—ÂÄœ¦‡"[|=^Ìnæî5ú×D=ÏY`ÊÒêÍ£­1[ǃâjÀ¦îÆÂ"ºq«ÙøpÖ3ºÇS ÉSKf‡ùL*âDL¢B =¬ÖZ™h/‰-¥œç–¥¨` ×?KÙŠlæ~:™qÑ6@ôÄ̇·MªŸvÚqÖïöíúþö÷&CQÑËå¢"çyFìÃ'W«^ÉÜÀéÖ'ÜÏ»›Ÿ‰Wsqm€l§Þ r¸Y5°)« +³ÀŒ"1;£(nOÑBZGcdÅû†™'`÷Èa@9V§8§Á£õ€#/$Ha6' Òµaw*«u«­E@¥$ja‰IÁ"*%—£V"ëh¸û"Â".@f&v²v '=4p„h0õf¡pwbh‚A\EãˆîáÝ7+Z˜ÜúAœ¦fE„d)œä¦ŽåRÕ÷—Ò­Ë¥Óo;ø¨Ó÷“PC :“2¨eü¿RmÈú¼Á~òéðÊ]0l6ßA8j¾êɯÖþ KRyËiÌêœ'³äʰ¦=gù³HŽC‚ŸT„Æ3š¦¶Ô%¦ü•}=Œ¶Á¾0 drW<ÚeÉ9Šs„±@qy4H ¦Zô¢WiàšÿŸ¹·m’äHŽ4MÍ<"³Àp9<9‘ûÿ?ïDî¸tUe¸›Ù~07wÈ,ÃH@v…dwuåK¼¹«©>z®oí—[G .XlºÈ¶}%«Ì’ÂTŒ:;ý›B:£§¶hãË/éZ„P276@@£îVÝ/e­3±d|½†+HŸ‹Õ—Õˆ‰·ú”8y!fx–ØOí*ükAܘaUú N='¹NÒ|<Ý_îü“õ`±X6>i+>›N[™KbŒª»Ô­®LóòŠËr|'†x±d(ׯäÓµñ´23<[ç É.Rs~9˜{9ê C+ÊþÒ™­³c›h™K,ÈÝ“vÚK±òuºlN$ò‡bPê³2ôÔêçtñïö@ÃpéO•ŸF²‰Œl•<Á²ãvü, ­á:Ë8«~2:ΨÆUiJ‡õ¬3ï·ìS;å”eGëÉ ÍË˧DµEw÷«óyè}¾•õÌ>oV«J>ÊOU-]éæÑßšMÃHœ™”9Œž{j½n‹F=x¥—ÙêHîçCÜŽ5”s®7¢.=8èf± >s‰ÎAª cÉ£!¡xºzÚ,2æË\3§äùìÅriëdÝ/G^xÆt–A6ÍRlœ»ž‡íÀ ÿYî‹~­Ó^3O£ý#Fíó<#‰'D?Žƒx·ÒQŒ| âcÛ,<ïT·áapŸáž%¯°VX®¸1Š%é4›,ÌgßcÞÔp‘½Ý×ÉÁ¿ÔÛ—F,÷Íg¯éi’¼v¡O•ÉéÚúŸ#û?õ£þµáÜ_E4Γ'ÅððéÿW¿´ÿIø~ÝÒÿÛÿø]öÿÓÁ¹šôŸâƒ~±#øôÍþ˱}ʰà2†ö¯Ç ëâ‚—>€ÅEöå$—>¨õ/yùsÔ1îžp&f¸Rwœ_Â;Áv˜òuȱx‰–HÖi°½¢e]û|p$†­B=•nN#©;GÆk«°ÇÊÅ—ôPHñòñ£9ìÕh`ÜO|_HgX>¥Ó’n;VGÆ‚ÏW3þ+'õï¤EºïÁ~þþýóñxGÓæN¥”?»;÷3ÿÿ>fv¿ÿý?6Ùˆ\­5u´À\XoYeîäôx!SU¥†Ó","äÄð¦úñxHnCcR~üImUݹ«ÿ<=k»£#vH½”|vj$ÒD¢ýµËʱíS!A"¼mÛmß™¥~»¿½ÝŸ#*à°H†ÒOî­*Á룢æ- ²€YU?>?]ÍÝJ)ß¾½u§9Ѿ•V3ÿðãûÛOû¾[ÇãpwaÑÖ¨W’ƒ€ïÛÃôãÑZm®JvRÓRéáî²m¦Z[%b©íçχ€èÿ»”­ÖJn¦êîeÛ¸”Ð%ËVöív»ß¶"Uµ>N÷Z+3ŠÞzÍr0FûS­UMU[ß"tœ ï©»·f"Cp·u—²tAÓê7´ÎÉ%U}<ŸŸŸß¾}sÙJ?”]€á(½#w@:ð:¶†înÞZ3'/ý\Š£ ­Å1š»F§°ßˆ0•ûõè_r“å€p Ïê_\‰Ø'˜»$þ×Er—î¡ËOA  5uêE¦e¥]ŒZlUà‹ÉIDÂЊ!DŠô=ý¬£¤˜C¶M8æð`»'¥w ÁQ¤PhîÌ[ A8ÁGnÉÌbÜ­­h„[)$R˳Ԋ1ça…DÏ/PÜÍ\Í dÉeÙ;ŽÃŒ3ˆ01ñ&Å]661fベ´ºZ¥Äpq Þ?]«šÈ9~ž§Q¨qã C‚f¿•H·ܬ0úÀ†Â­^âD/"æ®f‰ I'?vÞ*µ£FæFû¶1£ìÜ›jp‡8'åRv÷êdÆ$D(H}SmÚZkï¿|oÇqÔä®}“¦ú÷ï äZد‰:Vò"ò¹HÍÂ¥ pJ±/“Þ IÒ:͉j£Ñ—•øy{9µ©,“—ØŠÇ+Ç"ì—à 8"mÓ§;AícAÞd6ÆÃ‘;Š`Y(ôáqì๮J¸!i.éÑ»09†&.BNTúMmiæ6jÍ `K~.…ó 6FBI}-Q –/Ÿ—ûß•_¼ÈEýo}Šu¦J™òDx‰5C¾Û“ˆ?ܪ¶rèi¡óûrpÏJz¬SVG:ŠðÉÀ}Ò‘OÿÜ—bçþ3Sx$bX'Âyv©M…t6y.¿¿‹5âó§ÀþZ9i~©~=•/`Õ¯’lv“&Òp'qg°ê†ÒšÊtú‚ûWÙ°mNˤž§×«>¬º–B.ò™]€O 3½Žp1áÚP£lý´oM‡ó²óQ«¾¾Yà9É>À9O ŒK!ÃÈ4ÆÉbì}ÊmfÀ|P†Æ'Òk³)aHûw‚i®žžî¥»a•àç| º.~ᥔ—\Õ»äúRk±A‚–6ç?XJÀY& Ž€I7<Ðë g_VMuVF̼ßdjõ¹D6:qÆÇc^,§d'Þ”"óuxÔÏt ÞfU|ïöÑ“ò1ŽÊ2^†~\ŒÊo{ ïó ƒ­Š]`}P`4¾8ßÓ´‘—$yœõɺ¨ÿëxÙèY¾£UáÍòô9ðòÙ¼²hasöó¤oÙB¼Zª·¨Ã—VþŒ_¤æ17Ê/dÑ”-_‰1ZÕÿ)g€—/ÿ×nøK0Å×Ñ.|h»v.òõ zLûðZö¿†NR?¾ ü\¾¨8éÚÜæ×Ÿ=«N¿fÿÿmqÊÏ\î£îO¢ò þÏìê>ãƒþTõßÿ©¿óßÊ0`ÕÏ1]Ëôyðz&ôßèþÿ+Áè_Cÿû¯ü2|5\8UŸXï_L"ð\¯~Iô_µ¯.™õÁˆÓå¾–´œl'½´bs"›î'LìØ¤/³lxFDO†Ødöàb§&/Þ” ¨¼Ì?f1;Ÿˆ>žÀ“ÓgCþA'>;=ÐlÇé¡vNG¤Wã2‘yÆ»•4J‹GOñ¼5¯ËÝõ:CÍk.ì¢þ¿¬ðø³@@ÅÌÌÕ‰ìýåûûÏ¿üòùø–ûý4üxç¡§3³µ¦n¿üòs ø¿ÿÞZÛ¶-ÄÜmÛö}‹ñ /"¾ššixD2iÞ÷……»åß-(ò-ŒÃ!ý,ˆ¿LÿÑÅÚ²¼wÝÝQxºÍȹC)<þ:gæ}»‘šš¦ÆEFûY)Ò·s„-¨ñMùþýñxÔZ›¶Çãaî*Ì"d¤½€Ñ€p=ª˜þÆÌX˜Tã¨Gu³R„E…“fNnõx¼}{cš†»Z-ÊuÛÇ'¶MŠ„ƒ¾ií½‰Ì„ѼÍ•ÜÞ?>ܽ¸Ý Gm€ykfÛ¶Öš»)÷·7ß÷[mÍÕ©p)›‘}~~¾{&]»"u"½å’ˆÈLããÄAm­…=Æš™[7ÚSÈ©@kÊàÚjGodCìKûÁÉÝ?Ÿäx|>j­«Ýþv»í·[Ù·˜]›ƒ!€Ô4ò ßbäÐG/ïïï>>?Ǿíæç|œ`BoxH;QËIîàØ÷"SaƨN†tÉZ†û%¦Vãq06E1ÁŠK&Îáì'ÕÇYXX"ÖÛ9ª-8$fáê™0j§}÷ùþg2`5r5çâÂì"p‡0yKÝ…î̼Ýn¥ÈVŠ>šE&ƒ‚[)æìwI޹0ƒ-B@Dö1 Šî3†‹lØ@5mÚ˜ ”uk­ö6¸™%\'n4B¹çQU‘"DN(¥lÛíÁÇãóÁ`7w4C9¹8Õ{Ü„¼Å4 V*Rö½DÄâÆìwíRDH¶­hÓÚš9¶M¤DÊÕ¬Ö¦¦·Û]¢²µHav°Ã s̹Դ*¤ñý¶§gU§°êæÖÔÔšø.2B|˜mûí~ßµµ_Þs{{»3J¦µ•‹é•F‹“%ÉÙ ]ÏSmNDÞÔÈ ‹ˆ¹‹ãÐÚLS‹¦é¸³‚ ÇáÊl sÙ6Ûz%{aa?1CX˜™Å½<£ùÜϪ"ÖBÚxŽ¡¦rM“Wã7d¦¹nÄJ1„ìhñ±<ð³Ly¦1ù*ƒŽš«ëþn¨t+±*–}Ò<²ÓþK‹øy‰|é÷RàÙ6š*d/ AÌÌVó$²ª××9\.UÆü®3 Íi­-:o)ÇEî9í=%èuå~BF­¢ïܘá‚wTt:NÌ ÷cžÉG™ñ£ÙõÊkêtéïªð0.Ï–7ŒvŽ/-˜O•ÂÏÚŒ_Å…!ý/†qʵ9°#$Ø”ÌÜ._³û¬û‹zŠ& Ágâî6[Ž×iÓÙÄ;rgëµ|¾ßž¾2GÿÁ0™cÂYà4bã^2 6ád´NG¬rpb%Í#ÀìkE)Ö‡ØØç÷U…GgúJ…Zµ^s'uŠX Ÿ¼î™—C`㺡X,—©þgmMÃÌÎé(.ï·é™K˜vhû“ßc&ûÏ{ó‡?«ÿq£ù¨èWƒöˆ.z”_ÎØ(,ãÿAH]ú”AñÑžbý€ñ|ԟ䨔Oz‰-3ЉÐÙîQb`§Ö‘\\`ÚÆÚèt¶;[òÌ—{ðK±tUÞ{þk¹—μò8Œ¯®¡?s:üÙ½Ò¯Vñíµ6틈uy$ájÿ§ ®ü¯j¯c~¹ªÿç/îkÌçå@¿âBøo¢ýW² _þØE·X_ü‹WÑÿã?Á?ûþç†ÿ"ýÿ%HçËPèy9³LæøW¿ÊÄþÅ{À«qÏÅ€0}F‹×æ:•ðz¬ñü ô~8^‚«½” ”=Q‹À{Õ„s’‰—4`üºŒ¸ã"R¦¿¶%wàO8VcG¬ÞrÛ;.>œ–8e;Öàìóìðé†:î] äÝ_uIÄ K>l<¿Æ´s­°WÅ¿¿Õþ¯ (·@‡65¯­1³“‡Æán‚b f<UDLõýã=pÒ[ÙTõóó“¨+¡Ý1(þÝt§ ~SŠ£–Ð]•ŽÇAD·}737ï”)æ}ÛD䨵ÿ†Ðþ™™¥ÖzØqjÞëÚÏæº¾ V†×ÚDXÍÔZ8 E„ÕøâÍ̜ٙÞ±(¨­„ÚmîG=Âá^ë¡æù¶ob5Û7ùáíM ·Ú<|Юڔ*µ¦ À §Ççƒ{)E¸V%wùöÃ?ýøÃm¿«U3'°65ëq~×Óoßþ®ÖL“i_3‚Ì@´o·"V[5k­©;mÜaÄMÕkmn~c‘`i³f$E ­5Þ±I‘ª¶ØUÕ€ÝŽŠ… ŽÌÉcn Ì´¶V„—a>Ôt@uJ)Rº †“ië„£l`V™EÍÔZûøøõßwØl¿Ý´µ}Û@Ä`7B „!‘£Uî«ùä|:¹£5 "~œ6ß¿7³÷÷÷ÿýó?¾½½9ù·û7)r¿Ý¥È¢ZÀbŠEÔ¬z^qÀ%Hß±ëžÇ†égÄó3¼Âîºçí„"âä"¥0GÛªzs³ør…H¬¸FXD„‰·èÂÎïÙUÕà]¾ðPÀ"jÁÄR˜Ó1J#r+"I‘Ò/‰{‹o2U ßàV¶¦-È L½-ä]sÀz²“;s„¥·UÇÑoÚœ,J!ÌœAªªDª0¶¸½ôfã^à–%4Õa‰>FSS71ç8$6pמÎe„íB8¹‰8fià{awM[œÿ… 3 *”ÿJ‡‹pæÑ½ûp Þ¢M5ηû®æ*lfµµNÞyàG{ÿüôÖn[“FYœÁ£W•ˆ[;@ØöÛíþVE¸ÚT¥—}+ftGÐõ¤Þ7ËMµ5-¥»ÜE$ªSö[è@õ{{||èþvÛ¸“’²ùíöFî^ÉÌ#{Ää¸úr·VŠôÖSá~Þ¶`()›Æ8]×`†º›{«-XYŠÂ¸+±dª(EìÜ´q¦$)±DHt5ÃÌ]r5`êN‘ Fyz¾jm#`çˆHÈéQ~.±›¯DDÔL(Ú~ɲpbo{x3ÈÄ€‰8ª ±ÈîÇDNfwR#ÂAoÑò/mì¤îf}Ür1?-m0SÜ¡¢uØ÷ÌR_›äÿgPÄœlàæF<ܱ_Tòé„]rüæ$yæÃˆxI t©ä´yŸ/_|ggB%Köd¥/—n ]@&ÃÏxV›†šq*¿ò .^÷lóÞ>6c0¦IeñôNê” €žÚ/ûàdžM–°êR¤Å}h q–µ©g¶é²‹_*Á0S¦>xçv•81ØJëòÒåqr‘}>‰|‘©ãZ?ƒº œ“bæi õî•/«VLð4%§†<âNÓ׿3+¥äî6å3Â2™X›d¶ÂîŸLåËè`L0=ïý³rö]Œú8oGÎN§I³±ÕÖy현}®”^ZO'I±N›÷ÑufÏ;JÖƒO'ïÂ|ñ_Û£Ïxõ¸Š“76Oâ¾"µO¼›XAÅü‰ûò‚$âyS·\b¾ÚÕ»=b¸ÏRùõ—ÂÒ«¾5äòä ÅÚ÷Z ]»,±àÅ—-qò9Üó™Âg$–½úæÆÍ¢ŸžÓÓ¶Ížw´Ó›ºF`Ï Œ9AÁ9£tù¶W"Óš¿FàÙ×N“¸ú²ØÏ>BW”³p' À)J›8GábîF4Žç-†Ãü•Ò“*Õ³‹Ù¦$¾ xskäαœ0^ Í‚|2%ËýÒm±ð/D¬¥„fi8ènƒ3s¢ÚÌÔŒˆJúÆ&v̇!`ÂÇÎàáSCÄ©æg~å±t@¡)cÒj|DÀ/gc·#ŒQk–VÌ|ÒYý?Cæ–¹$ig¹€íVõ?£^4Gz9R:‰™KñÏ’ð7[^#·`«îOÒóèÕY2D—æ–³Qöª`çäëy¹æòû÷ç åy­³’—€Wb§éE´·_Ç¿|Aÿ}yªÿ}lüþæ1ÿË¢»%Ÿûåþk‚çž•ðô—ÿø/;Ù‹NOù¥ž÷y©&\ IDAT…v)}¼è×/þÁ9×eÓq£Ï—-œÖ¨À2Å^V;žÉð¥{ëéÃÉc…D@N±â3dž‘«¬~÷„Ÿ†‹ÓCwAÒO¶èÝYÌ5³Sö²Øu/Í>Šð÷?oN±\Ïé…;±Ìb¢±jŠbD¦u§Ç¯ùrhí¡YØç“t ãÈ ˆx1³ÇQÃëÍàŠª- û^kmGýù—Ÿï÷ûßþöo·Û-ú’ÿõ­°ŒT[”/æ»ÓŠÐÌêq4mŸe‘ÚjH:j¥Zc¨›¨£†NÄšÐð¾a„pÌê ¢sïNDµº¹Gµ&¾í7àh-dF7£È:„ ü8Ù¶-ìÕ,¥lÌÚÌ…,®­6;ŽŸv¹Nqw›˜UcêÐÝzz7÷ù¾o"læG=D¢€ &R˜µÐæ>þñŸû?BÍXô8b-ã`È]ÝÄ·Âo[9j­Z» Ý´¹) íŒRØÝE¶Û^Û¢ªºísáŠC››oªͭ b)[Ù:OisŽ-·Ä[Ú÷=ŠvÝlÑpú ¥Q­µ“ô™³L‹`]ПŸŸG­÷ûˆÊ¶}ûö€Ÿþ9æOáÖï:Ðõ skº4=º››ù8 ±¼ˆ¬ÉãñPmÇÃÕ“Td¶$ÓÂÔœ½l¥µsº»YbªBÙÕ:Ú†×ÑØü?ÍZ=+ OæÇLh¦“þ³,г¦–n‹–/8©+DdØJãZf–ân¤ênª¦Ú̽Hq‘ö- ¹š7µ½§ (ؘ̢¦B˜·"\"ÙÒªjUEªŠæ´îd­6)E6ÙË]ÔñÉ%ÕǨtvrA¹Ý·¦½é»öRÔôq4ǬK~heag"r31@‚È„ÉÊ,t;Âz´` Âê¾Cf[Â(¸J;j«µ)Ä$ÌpÖVƒ¨"ѵ@$,>HünG;œHÍD %½Ì±Å”"…Líã¡Â¼íÛQ£~ÁD 3Æ·ýMk«Ú>øz„Ø´ÉæÏŽ…™Y­õ¨‡0«©ï¥èVZÓ­”½ì®þíö˜¾Û2³ˆ”Ñ8#v55í3¶"Òªšª”",ªò­l®m+RDZkûÛÍÙM;ôNj‘@i­i«Q[W˜E ‡g™¥mM$83äÄÆ™Ìëmp‘H-ÈÿææÛÆ=\ês8"Š”®ôX=õhK¢ÑÝ̘bKn·³¡ÔŸH[‹)o8ªÝLëA,NÎ.déeÇÂ2;Œ˜$Ì¿w2¨nŽ,­éœö(ƃ!AÂE¸¦õ»ÄE’\5g;ñ„m\Å"Å=—>@èg`7Î…‚Ó·e½„©+$XÒš}…! õÜdÇ92–¾lJâÿ4úN†áMêë†ßs}8%Ÿ±–›;ï!´ç¤rŒU§3ºóš25SVCY‹`Y •¡Ó\'ÏŒiñzÛ¢aùÄVó²ÒLÃã°ü…GÁÉ/YLÃ#'ÍÆûjs},'6uÕ¸ivìP–²š«M2Þø.bùÙ½ü]«…‰é— º–[Ümž+[å$mŸFÏqJ Ü–¿ÍƒHéÄG"3†ÓµRD•©“÷tõ‹yb _Œ{P›:d¢ÿ„ÍŠÇôΠ¯U:M«Ùу³]±æ>ÿéED°ìOGFXOmj¾Â€z¶È§¡2s;ÈzɓؚÝÔÔs!¹ÒÏÖ Ì2IŸM”ÃOqÚ=¾€ ­ú©¿ÞO^þá“](•úÞ¡½XXSuå±òµ?ÀÏ9÷¡ÇZö~ÐÊMúÒS¶xŸý Z~ïpÓ•xðÚ}·pöÒ§axõ[½2¹úD°œIJ¹Kí»A\Z6 ·Ä\pvúK‹ß¼ê&Ïm¨ÌlÅj€\ç«_E€Ù;áz¾™¾0ݧWnôå Ïɤ?w³¸‚®‚êâ”_»kËÁ”€×³73²ëbÖäâìô]°®S!™G^–ÈÂÇ0ÿÊ™$S”uw5Î@ÌÝ‚8kjÎä®Ó…(J¼bátâÙ*ïc<»Îî×ûvv#f‡of{™bèQ[í3 2ˆí¾ÞpÒ’ïéîVŽãôVµ~933‘n;ñ—á#³;™jàâbU¦ú»²õ)<«¨Ýs‚ŸÎ†™ZnB˜ÄNr,œÎ%ÏÖƒõüÉ|‘SPzÿýìEò‘µ1ôÎËfÀ)G¼ódÀ:€':­Ž&®kåA_c…¹ÞXܼI± ñŽ/š¼‡:Žu6C mh—£pèj÷e87- ËE;9Og˜^M3hl²…¹ïôúß¿”O_ü~Íþ×cæ?[wþ#;wý÷ý‹?Å ü_¢ÿû_ÂþÕþÑ÷ŸÔß×/8>Kå|ÃÀr³Àúן_½ÍsIӋ׿,¿žÎ”•k¿&°”å€bï,“ºC£æºøØ&Ç,ö¼j«ÒŽ¢±˜µfáßgpØ”aWð„ ŸÇ¡õÁ,‰jÛ·-@Ïo÷ûýv{ÿüøþ½EÙ€ª†¸¢ªd=l)EÍ(¥ˆˆ—ÒuX'#˜¶Zk)[`‹¢`Œæ¿¿¿k«±à‘Îqñx¹°¸–²ÇáÎnä ª5†[N+³èûgÅ$¦ì{è! »VQ”ýî·]›º“ª1 Û&ÂEÍÜîoõø‘øADãŠb‚5µQ¸hÎEÒ$ÒW“ýËG@ש÷ŠÎíÌò³ÖZ/öÌ©LÔ)€ÏFß·-^â~¿ÿÇßÿþx<>>?˶ÕÚn÷{éx )y¬|{僙ʊØ-‹ˆ©Åî=T?3c†*íûÆŒ···RÊívï!Þgç>µÆ<&Jp·ÀAGÅäbl‰ƒ?2'·ŠbHǪ¾ßsT€“‰¬/¬™¹C 0í%Sã9~Í%´«»z뤊Ö"  ÷Ð|Õ(è nq+A (9!ìí>·äM5ª>-‹²A&o­º Á05Sõ&­f¨%´Û]6vJ×|-Em; ž$ŒÈõyÿ|:[ܱ S¼æÕÎ"dÑR¾ë¥Õ8!'úÉ–PÃ&0³ì݉(O£hQûúU²äg‡¶¸º¼²{iœîAä[ÜW+%ã$faÉŽ¤ sƒ­û—ÅiæSìž©û¬áÙ¼5ôÐíù‹Û ³ïuåzL»zïÇfË»e¢ÉÜÏÂÖˆÿ˜[È:Ã0O·u› À͆~UÉψK^C~Ä>Ew"À\ûÎŽå#ÎÎLÇìÈæøôh/Ÿb¾ ;?èâ#›É«üˆL~Þñc ê Èh’¶g‰N:~c¤”÷rÇ ™ÇÚbå"œîËÈú¡ì¤Í•V6NîûyçÔ)»Å<À÷f®Ö'ÝÁ„ò`• Ì}ßÀBN¥y²<«aÇh©ODàrºÑ`ë7çFd¸%F5"ݱØÝ >fÀïš´›<¢>h6rXŸÙÙ¤½2ñÊî£Y¶Ë3£¤·×˜›uòODwyi•îßýäþ¯öÓb¹eøŒ¬~R÷º‡ ƒMóº>=0{™úÐûzžœOZ¿ŸÒ群ÆG|öò¬x´þ0ö´ ·˜!˜!߯©›…9F'«»ŸnÛëxä2T›\jŸÁ=?Ç'Ýg§ùËÄÑ¥;—Àâò 'x/RJKùTÿÝç#î`d”ht × ü…XOöÇháÿÌ_Òéèàk‡ø.Oÿö/\Oø×þïùÒþ¿ömüÅø•?{9‹º `~Å{ñJý_(ÏA3«6n\×:àeÀ‡—QÄ3ƒ«*Íëßal>wB?’’4בUâTÆ»ðeC2¼A™Æ²ôÀñ0œ>½¢f5OIØhä{¥•¯uÁ”`8_‚æ]ûÍ­O¢.ôsZÂx<æì|ÅM«Ü)7…'¶΃ÝWW®O0ÛóTà˺œi¦úOD#~Ç€wrN)"¦¦jíhïïïÇñ(e»½ÝK)û^îû½³ÅYLŒHÇnz¨ á³Y™ÎŒþPâd*žx»¿íûÎÀã8j­Ë‘ŽEL 2H˜yf½iX¡E¦Áû³Fé™ZóØþ‘ÈçççývÛÊvÔCM·²Ýö½Öz‡ªÖ®”1E$¢µ6š„Çÿ2û-¢æ[ÙX"CfJfÌE[SUWß$8$€»G \©ÁÌ­6*ÔH£l€ˆÔzŽüíöö8Ž£‡iÓ¾¼œU[Ê”Qãi‡>ŒÁÎÚš©™ÖJ m/nÞ¬6µ"üøüLÉcAÑmßܽw-„e4ÖìA’dúötIì3¤ÙaIBŒQJ­‡™mÛ¶m˜­µïßµµ~üqß÷mÛF¯ƒjDˆˆšÇ%Ìæ$²í{´ÏñO?þàóó³Õ&"î~Ç«©˜>%¯³kúÉ^ˆ M|´€ ÅDgß÷õŽêI &Œcœ™¹^_\NàÖôŒ ¶йv4ê­”Žr5Zñ Ã×6íYÊî¦,Ük R»ñ®@…0xÔná\ôöô=¹Cr´1ì³¥H‘ÍAÚ4J#k#bÀ±™I ¥ï=ÍÕ ãðÔ—xWæjNq"s‹O·•âîª^6.\ú‚ؼÕj®E ¤@5£Í9 .0ÜÙT ­Ž55sW7Œª¯ÞSiÞz÷±ƒˆÝ<yɱ [O/qŒ‹:’¡:jbÂs-©¼PìO ‹‘‡T¥lYôª x¡=G{lØö²q)s›Ô­f®µ…É]a~Ts/…Uû–ÏšæR¤SeW³R¶¦ºÉæææöñxȆèºj¦:|Ú29²™p¡…œxnä½3m•îÖiõŒlãÙX›¾qàΆzO}tÈïqFÚÕjWKG§xóÊVçÌô¸I졆±~Àyˆ²[{n—ñN·Ûb³uÇú¥ùÉFÅÑ»nòN= çÝ©Ÿ ¡ýD;¯1ïÁ¥RöÕîsõœ©]SE…_›ñÜ—+ùÔ,yñÄbøqÓë:ÿ”ºowö{œ0§óÿMÌ£ÿdæ0º|wâÀOÊX¿oÙZ,׈gqpÎX/í¨„–ÎÛ’ÍÞõˆü>QȯŸ ƒ˜ûê§(€P"8Ï<ÏZ2T]ˆ`ÊÏBc ‹Pè)9àE%õsŸÚ®¿aÁÈ,gD·ÚhëÍH…÷ËÈà»ç¾Û\fÌ¥×·ó8ülðÅi è7Ÿ8ÿÌ´—!.´ãé×°ùbßéÙØôIcÀ°d#r>…yL c‰ãËlfá9Yß•Ÿ²89™tS³Z ÷Ú£ñ™Sý_FR .ÿ|>é®ÔX…-ÒÑr‡tšì¥‘£€Œâ›…¿0Œÿ'Æ”OF`ž%ülŸ“é±*0êù²4:ANo2Ï®Y™mWíb‹ÎØ2-í³óIr˜u×sÀ0À\ã; Ë,¾¨{õEñŸ3ÍXKðrd£‡?ß6ÆÃÔ—Õ V ÖxÁúcóݾh%Öº[Æ38èz,Ëþ¿V8áÕëþ‰ÚÙo~Zÿ—ÿýŠû¿bÿÿKü‡éáÙçÿêÿ¼ÈþOZ{n€—ƒ7:[/‘I<z¾N‚àâ@Œu”qZþ.+¶q=Ÿp'0á4æŸ\K›fm‰äby(ïY†ž"[š – ÝåvÕ÷›¹Aþ"v1fX«Œû#žá ŸY›”Éø±ØŽ•mÿì§¾OÏ©$à|C¼”Ë\úÇ×(#hæ$§AÊ÷újóÿ†ÛW‘Z#¢[¹ K˜Œk­ïúùùyÇqJHµÍìV6s>Z3UxÃ~#¢ý~ïE™=!;k)ƒ§ï³DÝ'ÈÜ9ÀÓéLù‚HÂÊš"•¹êì ˆE­0ûö–pˆwÁ= ñ CW?õívgSe–RÊã8ÌìûûÇú“ó`EE° xû˜6ɘFÄ¿ªµÖZ#Ò§A­ÕÝãUV^03¶mK¬ŽÅ¨ v–ã[¥ŸHŸ3Z—L=>õO?ýôñù©ŸŸäÐÝB½– Þä„ ÷¾BÌÄ e&QæY­è°~vùN¸¼µg]ó÷y¯f šÁÈ€`Ž÷À k°t¸l[TÜ›*ˆ TDn»¹›F¹'ì‘0E×®+‘“©1<üÚq,n}G­qñ«¹Îäæ,]>I=¾óÎâÍa²sDUSÕ 10¦%Ä€ ƒ™ã ×92xtûDÁ¶Ç “3ÝQhf®ÒF&qµÃÍŠlD¢ekÚ„}'S%'%'÷bð_`âÂa‘§f *Xp陨½ÀÉ«ªiï .$åo?ퟅYõЦNÎÂ&§Û¶ßî·M¶ÚÚFdn­ª0G ^kdøçkm[Ù̪*‘(ÁF¬nä^UcPrjˆ‹‚Ü…ÙÍÝUŠ€Hb"3R#æ(1Gkº—­<>ÍI]µj«sâ ØMÃÖü¢²E£¸HŠ‘bÉÁ¯»‘Q¿ƒa˜…e»<}î.Bf&, RJìâ€\iD¨œœ\=tz&‚ôÕ¾ ƒÂQCw2wNo³‘u!1àsH¬Bq×^ºŽãØÌåè]>ÈÒ#ŸM€]xư§`à£Æ ÒeYB9 m:“<ƒ“%?Ø,ËNúy 9Ä=ÎPƒ‹+zÓ²çCŸX7~8C,Oݼ£Cv¦LÀZž5ñàgO]N½Ò92A9hï˜ÎégE˜y8ÅÆ2E5 ®}bâ| à&vß/À~еÑjÚÏûg÷u5êä‚Yà€•Ik «ðp^b øûIÄŽf<õ8òHÜ?}%‰bZó£s§ßi5?œ’½66ÓlI·ê›_Üõ`Œøì™Œö MŽåçZák p=Ù–ö྆t?Y¢ÏƒZ*‹Oˆ€—–N¬,u Ïr·âöºÔTk&'u6g­®O ‡­xä—m¼ŽŸcà©”ãy×zQóá³Ï`¼h®´_@o—;ï^Ç(hå-ƒˆ+óO‚Ð ;;Þs€{Âܬ÷’Ó âWú-ý{LMÍàk É"L»õÈ“§ï}PWN5Ñ£D=ŒJ¶´_˜øË%ü넃…Ãä¯õ.Ï ãEÁ[Ï|œ ñj~s³iG Ö‘‹ød60[<|‹³~¡Ø.wÓY²ª„kõe..¼’´“gÒÁ,òܹƒóóU¬¯u¹ÓÆ,²n1ŠÃéÊëôŠÆž@ÚG#ˆ4û=ºÜà£Ï§;l"ì§}¥9–ê±y·)׺²è÷!âIö;*žo“·ÐðÒJ&^3•sÐÙ?÷;X O¢Ðï¯vÒ‘.ôô…KŠë3–²xìúèžlÞN#=øÂ݈³bèë4¾ÙnAX®£slz¬AÎw­s™Ç:žŸ·÷n'íaÊ™øLdÇ;2"X~ã¶èéËœlšë}ÖÕäñrr?ÃÎ ~¿(@§¢ê—ÎÞg5ù•ûOe/Ê;Öò„™Ù:ß¿îâà VÅÉbñÏèÊ¿Ÿ ƒ_ýF^üÿEüé/øËyøùÿ§>þåîß׿j¹b^±¯+¢‹˜'0àÉ|%í¿äø¯«Oz.¦ŽG‚êu_tùHkŠ;˜ókwÆò»³E€Ö—ÃÀ™§vž’Z¼¾ú >Ö†,óórn4Ûb^ÚãƒÍ‘ÌA%¨Sדó7s‹ëd\ræÅ ô¼‚šW_¢Å‹3Ìr¯uì«×ç¸Ma. ø‹sã4mõ¨`'{ÿøl­½¿¿›ê÷÷ïßßßÝýïÿþïÿöoÿëo?ý(" .[ ã|tE Â>3rNÌK‘m(’±22'o½\”¤?¹[kîÌØŸ4‹ùåÑÎ̉ž`wr÷Ö´ "LfhªA;ï0ð/­5fq§Zkmíq ŒÈùO?þx¿Ý>>??>>ŒP„3»ÝiòDÄ,L1¼µ†ÍÅ2m™Átf.±Ž:\€T›š•"ñËã`ˆ”BD·}?ŽG|49ަªG=,× ¥”_~þáoÿÞ×á…©`bRb S«:XÝÔ­šï[¹ÝvaæjÊÞ;ˆE䦭lh—îfÍÇÁÓůؤ­†u–ÆÄÁÝÍÕUµ ö­@û‰}»ÝBšÇ‹Á%g1YQwUß6Ù:ñƒ™ýv¿ZÝMj #ˆ &F”þ8—ÖW‰HÁ€ÒºÑ¨#¦^ï\KÙÞÞ¾…÷ÿããˆ"Ž€ ®o‚­ïÎ`Û÷½Q53ªµ¹»šò/K£(„ÁlsQKÍM€ýv–záì)0¹:Êq¾‡ªÏsŒ™e’ÄN.1á„V›gR¾Ç\dLA¨÷kg¥ 5Õ­0˜ )q]ÛÆ[”j8y³*½±Îâpª­µZ£“Kl‘Êý~w·ãóˆØ ñ|¶tK{{ôTPmêd®dµšÕ«‹y ÜÁLæ*e#¢ê!fjÚB†¾È04ì›d ¸³üÝÝ‘i3š¥Ê”dsÜMJ½)#2‘†–ídÂ,Û¶î`½±ææ¦­šî[ Ü#ݬpH)Fnæ­©EsèM.…áÄëƒp#ºî¸i- 1rcÒ£jÕ~ž™³ÐV îo¿¼¿»y$®RÀŒûý¶—j`bua–Ízß̽ªY«‘"}ZêfÎh¦nZ6qU¸çŽßU™KS »¤@Âé#çrS.woª‘P©‡F0Øi»•·Ûà_Þùü¬ä´í{4ÇÂ7·N.§Äˆ1,P¢ð‡û·Có]BpH‘âÞŠ„=¿ôÌ£“¼½´›q”ãæ˜ÝÉÁÜ}…c Ó}»ô6×8÷(0y2üÊÝŒ ’^rZŒ !ð-ètЇ÷£¥†… äê=³Ø6m´cé~)º=œ'iÞߪuàg $C#k³†”8VÂZpœ1ªëÞÒ°†.Ý6(K”a0–‰œ…@knd„%N^/\@ä}Kbv’j¡ÆÏÁ§þçuB3®È|óãwö“Ši!ö ÐBosÝI.âœmE ´¾Êž¯+§ólÓX; <–Mä—])ç»Zû °°½Ö†ä1lX—ñËY3·É1¿Yü,-8c´žjòü:£Ë+}±%ÎÚ÷¡âÍ(J^ çÚÓü’ <–p̉0fÜ‘k#©³ÂÖ/ïóò&30D§¬Æù$^}‡t%‡$Ÿ5¿ÙÂîK‹r7¼-…¼'vm„í/cs`:ØZ€ëÃtEçvõÑR;ÐGã1ó‚V’æãAºáxŠ"Ÿ1ᬱ0;ˆTbÅa~¨å¨K&!豈„-eBã›ìô!gHÿË%w;PÆ7ˆ¢؇Ÿ~&²Æw9î­ùáÃê±¾PôùhwYK…ÏVCÎAºŸB9£}·Suûf§o™é¬ÞbÜø˜Îƒ¶!Ž¢Ç¡þçX}¸ ÜIÉ“4èΫú?GN~­ »ž"^ÑX+“꼯P—é9| Glý@S‡Í%C‡´4Z{®ÃçdŽÑ诈´Ó«ûé¹|†‰úºL;¾³2.ÿûH8žÍï9íñkÊd>ÛÖ&ä³¾¿Üt_ ¨žµ_§ìüVÀ÷Ž/º/ýE+ñK EÝýŸ#ùüŸÍÿ”ý+ÿzò¹DRÏã\j®%ðËòÉ/]XF¢Ë_œ4dbÁcíø ó¢v rcµ«L ÊsgÁ‚vK¤}Z!xqA`ù¢b%4fÌèzR¦2®7ª¡e‡jÐ].aTµù†}Æíh˜žÖlb<-A«Žß;² µ±æy{êdÿü¨Ö÷¨Ë¾uæ°)÷JKrâbLQ¶só¼]l)´¦Ñ_Ý=_“®Ã§?ôýý#ŸŸ£ÖúÿüÏZ«¹ÝïoÌ|¿ÝJ)ÿûÿõ·Ÿ~¸ïws×ðÓšR×5ØÑ¡¡"R¸D8`} Sµ0”«&ü][SÞ·›çîtÝN Q5WPÚ…îywµÖ+Gç’[lÎcõ³YH,aˆ¸í»û¡¦ïj¢þ¸ ¼m[m-°?á1Ÿ¸H‰ ¨®Ôà©jkyï.?rs5efrÿr=ªj‹B¹ o3„@"\¤Üöý—w~ÿþÝT??>?>?Í”²öV$¦øÇÿÿÿþÇÿýÿDÇow™Æ®L5¼Ì5XMIÊöÃ?‘58)̲ÉÖ0Fq³>vËÞ,AA„£¯õýóãýýýv»ÝnwEÓlk­3`¬Cob!¨‹ÏnÀp,k0Ý-’©êfíÂ(,fêa.f–R@dªMDx?=TAnf,Øo7äÉþÏŒÖ:œ ÌR¤SΠʸÛÛ]XŽÈ’[è›%ÆKÁê-²mÛ2Ç'h(O–RáRqÑÇiÉ'÷mßœüßþ¬ƒ¥O’xyÅåa­)ÿœÔ…`yn3ca¸Wmý— mr1„a–èÃ"³Ä2³^ê*ÝïîÆD VÓ£V0¹‘š¶Vyß™¥¹‘9AVÆ æ²!ÈUÕú µ€!Ü‹™$ŤÆìTȬ„èíæjwÛ(R5nÁ=0‡s¼Õ7sS3S³¦´í"LîEăŠÑxßwRyÃ]GG\³¤ÃOë¯fÞZÖR†³×Öš»¸û38Úƒ«YëEŽp’¦{!hSflxo_eÜP8µ­Ñ1‹ëÑÍBp!.4íY (ŒóÇãÑŽc²³AÍIdÎ%’ ˆÇƒ‰YÀG­æ¦ÍÀ¼i±ÍdS#a6£¦µÖV6uÕ–Ñù]8”¸8Û-"?̤F„ÉóÚš¹>{»Ý:¦É”œ)¹s)`b&m^€{ˆ5ÀÄL„Ú*im£Ê}ïeª½³ÓÕÀ,læE¤‡?ì=1XKﱑQôsôs•m—>x³ô˜¹„ù1«0ÙÉxf½»C,0;’ä:ˆfÂÊê3€dèêˆi«¹6£BB`ê+Ên:ƒˆ{×/eÞ<žuœ©iõpÛTþ˜˜Ötc×ÿé$FúœLÃ-ÝÙXˆ…+r6ãõ ü ælp͉G&þ©3oXIOdþÎHJ,Õ€£p‚ /òôòaÐÛ;Ór‰+å:°îYßç²0sʳÄݮλüEƒãÛ÷ÞË D4šàÞPÿ±Öwº™çPá´C\ÆÊòź Ã'ºlíyÙE§8š“xÆFúŸdÏЧÚäVølÀÿ˜g7Uîù­2wЀ ¨|p™’Áà3ëæ³1ÈòØqô…ƨZ½üÑ&²ªÿžçü”§Ç9œI»U¯Çðgb(§(ª}’›gP²Ÿ­K6öÄke'$+8ç7:³,ákXùU=õ—™/ý ÏiôËÆu’ëqiùrŸ˜›cfähÃ.¿ri5àu‚˼eÊ Ý:]Šî—HA—:×Ï·¾¥µ©`XÇ~¤³œ’Cß%~ﯿ«ü#x3ëë¾l¼±(Ÿ¾žriÁïÖÏ-%/ ?Î1€! {ΉT»Ì |¥ûœîfæÐJ^޹yÎ<Í0ôÇã_ ZFŇE ¦?[ÎÕMš̖Á•5-v£]Ž2“M#Ù—ÃSö&"4µ£Ù긦Ì鯩ËãÔ2‹2C\|)ÄÛ-kÉÉNJz4õÏÀy9Äyc½ZžÏ§¾º^Eð¥Í—œÎ‡áÉÞÉG>G‹¦·ˆ™YS…¿ ß ËgIƒþ„˜N»Ñ6´ªÿùç†ó[ øP˜ëÇÑ3~÷Úb…æ\Ôÿ„ÎEZbí¿´È¼,=ÿZý?k'ùþÿæG9ýÈŒÓê·Hü`H–Êu8Ö¹+. "ø*ßçdˆw`S ‹gP);0–ýû³x”Ò+²´û9¶tA^™ù„ÓÝu–ïŒÏ™Ô|ƒXÑhÆò¨•ô…µ3F§dÆ5@Ûgè8pú,tZœqßßù9 ‘©¯² ÏÒÿŸþ_yß·òxÃøßEðgâü0ëžîÖj­-eSµ¨·—'CürYÀAÃB%,A¾FïàÀô.DêÍ´o÷ûÛýþþñÑZë»Ï HD¯š6íôçÔñK)ñe01… ƒN´mÛPÇãñù ‘½½½1³›Ån)ˆù­éÇÇG«Í4¸–t¿ß·m žf¶ïû¶ïe+H%#s*ËZ›^SÝÉýÛ·o·½GUc2á’Ñr˜›·†RL-<ïDî°ð§F(àUÀýv/Û&Ìîfí±·áÌ^Šˆ<ŽšI V36;ŽƒóàîûÞT1Fß·ân"±»²ìËêW¬ŽZ‡¬F¸Ž/ÈD!Ð?U-eûéÇZc&TJ¡BÒ¦¹íb3gžû±Y^gÃ÷"¨Y$KPÕéôò!Wuaˆû=¸PŠ0µÇÁ`7£¬VU7Ûö½G\5Y› a‰Êþ±!ã«ÂÙšlQìp¢ Dà ‚ŸTnÞ¥ ìM[­£j»ÞJA£‡54w'Õæf"Â(µ)eÛvï!æH.°>Ž£šaÞ·,-ñOdN^€O󪺋‘ZSxßKP=Z穳ˆDM-‘’ÖVÑ*Q¢ÁÃíÔßR/]¤p§´i}»cdjÕkŒÑ¼7q{o¹`©­ä°‰ÆQôÌ•ÔL½÷ÁFc 83ÇTˆ²æ;Ä{rˆ!€¥Üjk¦Mµvè¶ï j¦ùêFpä¨Çc+ÒZ#æÂ°(ð…õmÿ&·M¸¶‘X7"&´fNKA]O@3s©UÍÍáÇ£ª6soæLZ¶mß7a‘ˆ·¦jî/ ‡WÐvÛºk؉Yêq¥|Ûoª*,tò½?›Ù<¦nLv'!%lµÕÿüþ ÈÕÛ·û·R¶¨‘ACêIŽB¬`I»–ÅšBjÉС¸1ˆs/ ˆ|”ƒLä0õ·, ˲£ÐÜÁ $€¥¯Fr¨6„p[| Rb›≢RµJQ”‡‡©K–-ªµ‰ÓÀw3:5èæf¼—dö¶çÓŽ4HHjŽñ³ÖW;œ4!Ozu¯Ðô ôv6Ï$]vÒ˜v‰)‹¬Ë%"óüîh~ò|– $ëh¨;X•arOªÍ ËŸqTøJŹ ä¯QÚ@B1´Yor¸ÒTf¶8gÏçJn-‘þSÃâ<‚`_x6Áz2ìg= ëë`&£ca1êÔÀB-¿$:xQ„»®Ÿ ÒóÀd‘ŒCÞÎ5¶/£ŸÑjùÂK5äòûèG/0:ó€&‹zÈu“–?½e¶Ã3Œ‚Õ™>̼XùMËúšÏÆœqGa=w²¨w«_Ï2ö™xòÁ9¡h)\O®xÙ¬^£“øq*0xa†¥W‡5[?.Z:ÑÅG~Æý¯Ãƒ”-Ç‘ìÖ¯ˆZ/cŠŠÓöÎç݃f»÷“î3 Fkwfg¡ûœ7Ë¥gûnú²}Á75U¢3´‰NŠÜSê«¥¾O÷г.yÌKï4Êb[>€/Œ¬eȧºÑY^ÐÅÞJ‹_(Hó þ, á•fzÔÖolLSá¸Øœ×ŠêË©4)÷f!›3æ<"+WŸpçIYÂ$´õ ¨°0'«ß᳦=DêÍÖ¿@?3ÜÃÙ—–ð•70ZPÿ{¹Hé&øå¾Ìh˜J/šÅÝÖ›0³Ìû`Ú®ûÉ‚ZÏ_-½Rø4ë9¡ ¶ªjÄ|ãÃŽµð9š3`E‹ú?¬ˆŸ##$˜ø>Œˆd8V\ÝeÚ¶<ÿN­$¹c™¼9ÎÍɾùëhÓÁ~]ý§¡þÓôÉõ¼"c×AÅZ nKYÆÚžô?Í£Ï-BçK÷¬+á¤êÑŒyá´lûJþÄ%ݱüy>éóKå5°Ú”Ÿûg¯Zöœß/ÿº[ÿë¹Á—S†—½ºø#ˆ?I¿Ì¶ÿ«º9^bÖ1µý ï–ÿù™…ÿ%† ß=üù­ý+Â+ž§Ú¿ùjgÊÕtÿ,í¿|[§õ÷úÊ«ÓrëVƒ|î¥æŒÇZQŠË§5:†Y+­¾KE~ZŽ‚‡Ç #’/BXga1=y,œâ©ÞŸÎQáû‚SЈ«Í¬ªŸ)I‘Ú3_ ðÖaÆü¼zžfFø’W[ÛÊf ú2È¥KK@O*/ˆÄȰÓäÿŒQÀŒ¦ƒ.éaÂoÝ3ÿˆÈŽãÑÚ_îOûÛ¶m”L•Û­óF*0 Ô±t3³zèEç0VªäÎ"äk ›—¼0EIìb#> öñ€°à%À,|2ò‡Òn«P[J¡Öš¿t+…WÒ+ù°P .¬ÄŠŒÐ1Ag÷P@2â ·Ö˜[kmß÷\Á!íä¼m[4%pr]â#Lu—"•œöýööíþññ{š£V3YS ½°°3ß÷=¬ë¹7•RŠ„mÔ´¹“CvWâ‘àî¦îd¾ßîûíÖZ=Tͽ”2ö{,Ü%Ó@$àˆkg듚©š¹•RʾÝö=r·ž"Gà Ef'ˆHT¸ª™”âÈdÜn·oß¾©êçã¡ÚD$®éªêâpw cšúÔÚ¸V-û¡:( ›ôÖ…àøæU•ooßÞîw" Ö|4ëÒ[TL‹Œ³e2ôA®ÊÌÉw5â±D“RúÆ•küW5üþñ©ÚZmеV‰Ðj E"è Âã(ô°|?1úrÍ­pé ›ÏiÝåK;eèÝÝéjZJ3;»;‹8Ñ£VÔ5.Ñìö˜JTãm[ *”÷Rœ|/å—£j3*ºË&Eúõ¡„™R8ÜTŠ„öx›–"ä®(îÕ &ÂÆ²ß¶Y•RìÃjkݦ½Á ¦½»sËS€ë5ãD­65ÍŒ‘·fªM¤Ü¶=¶‹Ón cîdÝaLÞmã´1b鈹j륾NÄ(QK'•›6uf‘}Û =ÚEv˜ÄÉOÖPx‹¿F’½0;¢/ÝÈù¶ïÛ¶‰@Z«æîø?ܽë’$Irœk¬êÙ ø $ßÿŽœó‚p1—®Ìp3=?ÌÜÝ<2«§w1³ rDÎNWgeFÆÅ]MõSRuëÌÔnG4 ÷n œð#^JÂÊBìªÊ*b ëÐ& otÏ.ø@ÿ¼ßn*r?OZ~Ó±qTiB·vpž]Ý„Úì<»Ë7öÁf‰:åžõÙnd3&9š’ðyž³Ÿçùv{ûòåoÇÍìÑ-à"3Þ>r(››yÁÍ:©8ùˆÉ± «LüÞE)Bä=zZÜY8Õ¡ÜÛ´³ñ°ƒbÊÏAWÈßÌu„ö$Qó7Ø5ƒ÷1[~g|2ÎTafi1 Ñ ¤1Þ²)/ŸN 'dnèSF‘܆Ä>ƒ $LB5³@Ûò|4ú23 ¶òž•ÈdZŽóÙ§íÊÑ6IZ.ÔZÀtÁâºg¬ËdREGëéœ=ÈV @(†Ê{ cþº9)) µÊum³Ä¥HÎsŸzâǾ~äoŽŠ7"£¢Ïš7$Ù+Šä½¼/¢ ´Nék?dÌM|Cö­æüàsd˼Ð)° ¾ÌÕ̇]Ô¾p°Š0Š!OW»?¿d‘&¦í…$WpIyC)§ú³õu?s.øÎð•0Ðút©H¨Ä²bäš*âÞRŠôÖØ1Ü $=gr„|ÍJ°Wî©„9¾ÃjM¦Xuè˜ËÂA€™3/6!.÷WÚçù hKL(;<æš\ç6Ù-Ì£fîËÝæ¼¹fIôÔȉØy²æ^¸†Y4VòÂ…¹Ÿ3ì:€)åäØ¿£òÝíêÿ<3Óu—!ýtÜlYOÙMª½2\ÄXM%7ʺ{ægÅÉz±®`.Ú ]:ɯe#·&#A˜Cù'õÿe&`écÓõTšyòSÒ’/úrWÑÌÊÊàJÄzéúæí¬æË5;/ðÚÝ9”uZO¯"û¿¿x|a.‚Ÿ…q¢Ê…¼HÿxêJùLSŸå>Ÿ‰ë+§uý‰ïU²ø9zð4ÖåKžüwqªã;Þ<¿™?bnqˆ—>.ëã11ëz¢TSUìzƃ©ÒR/¯CíwÃ=â‘F-ÎõUbŒò¦’ºŽMlôÎÉ«n^Pà=XWÎÜfå2g’òdŸ¾Ñ-àë¼ô:°›ƒ]lE5À´Ý~}°…¶ÍÜï› h¡3~ùòÃÛÛ›ˆ­1ó/_?ÂLýåý D¢º63ßnG“f°¯÷GwSˆª„ÀÍsÉ5èT'9áñ…iIqg­30ÕÿøùPóc07uM…Ò§ ´Û* Åߎ¶Âê PǯP‘éÑYñ4±‰½Ûù8͈ãÆ"ü¸ÏÂá°¯²ðû—wO>Œž½SêàqPÕÑ FRÕ÷/_Þoï·ÛíOøáü¯¹ýxôÞ{¦nFÌoÇ Dí8º£i0‡ÔÜ/v€’;™"›±zwRm¡\tswCø4ˆ@|ÚÏÇù‹6Õv$™<!ÌÄÖOUeQ;ó©,‡Ò­*0¸9±õG)úqžÌè¡,F1SáÛ-Z˜ÏóŒG¬J¿~|„üÞöhG8O‹4F¬Ñ{·ÖÔkÑ'Xiðý§æ–KºÉmˆWˆ3ö‡/?ü·þ¯ùñßÿç¿üËyž)>–’ÀL‡Hž2!JÍV ÷ô„z€ÏGOoä?JÍGçí \a6¯‰‚ØrÉiέ‘uãQf{>útIá)b¶y'õ û¤JÅg Ÿ{¢‰‰ s<²€ÁÕHUoo7‹#…j€‚ˆXUo·›¹÷óüxÜPînnñ¯Q"&>ÏÓf>Ÿ€u¿µvèÁ#h؉ɭ›±Ã|4sr+x{ o³ˆ··ãøè§“[w„DÑwsj*¢ÊM„E­õÞ;‹€éì]U}ÔB†Ðb¾T(܈7·î&CËøL\SZ)ò ±¨j;2ñ$‡+‰“û,« ô‰Êûí­‰önÝ»ª4iƬd¢¶#væ¬znÇÛÑ»=Îûy¿ßA`:ަ| ÛÒq4wGÔÜ©7m_¾¼Ñ£÷ÞíìÈûiævD.áív¼ßb17mâ`¥ì>ÓÆMQ!y“›0 ‹ƒÍN0©®“9ºÇÍqÕñûívèqZ§n$"„vèÇýããä$7=Ž£iÓï†Ýœ™UEYd",Â"‡?ºç½©þð彩èßï_£\TE˜È,@,¥¸„›3 ÷¼2‡v· Θ³F´".«Ñáâ"ÑÅQøLp¢#3- ègaG¶í刘£Ø`U%Ú ˘eÎ æ¾–BÊê©öÆØD¦àéf£uÂIdLÊg™ê„· ð:/®~q½¢è°<@󼶦ˆó}N7¤À÷¦W#“ UC1\ÔN&Úr‡Ãtá‚xÀÑ—–;Ôú„¥d ?6»á,åÝ£ßL²˜ÿO•M\ÞÉêsZ^‰Ó„ã|s‡›xÄæï«yÒp3H!W7\ee®OØž¦%¥€Ò}°G±Š†Ë&ƒ—lJÕÈ9Ê­P´ü…¸¶Ž¦¹G¸<ë„ «¸Ç?M‘`RæQTë+¥ÅõçVzd”]"ǸÞáˆ_ø‚(½,ŽI^º9¯PK7—Æ]Лú<®T5v—Ø*â¯)k^0Q/F{÷mùª '\xKÂŒ] Ö¶jCJøøì2~Ùè­¡•¿)ä°ÆK±5 ±¤Hÿô¢A6ªá:2L«ŸàÒ“¼d%\åužMÊxÊ1€ð+ºÂú´y<‰Où%‡5aÜÉhp˺w ò_òÝ›¹fžöã+ØÛGÞgZ— Äì"Y$]ìšZ!ïJÂcÍÆV1ûÌ]"%[¯Â¼Á¯gÈš‹pvV‘ mØË]q \xiãäáÈÁ²ïù瘱Mš7ÖÙz Ì¡þK™FÄš*c€9ê¯O7à;y˜u‡=KÀ…[(å„\G„@##¸”˜QŠ6=2«}=á*Iõ?Œ]Åò;ßüÙ»˜»›Y}^nž³ž§ú_.‡Õ@¦-Ÿ7O-9,³j+ˆÃÌOì‹^F¥>=“³ÛðRÿ1baLõÙ¶«÷‡2ŠÓsü&ÅŠë”Å“5DÂTÊ@¶¦ líÜÅÐÿð99ÓßÐ*¸•VãÍÛ»1<¯Äš ×†öÕ,¹a'^J„Ÿ(ô|õ8ïßßuNx}Ù§VŸÜO_,3¾-!ï¯ö\_«þÞ"ôgÚ2mø–pŽo¹¾ñë] e9ü÷fü>÷÷‰üí?ȯdyþ$¬ò<ÝÛ[~/ !þžw1{Ðù›o›_Oâ6Ñ¿œVaÎât­[í¥‡ùÕZ¨ æR€) ã"æ9QTšå„)ÕözÝúªÿÃoŠJËœÃ"nÊHõŸuVôëÁŒ¬éZFßµ üR#k ÇÄ•°¸}†bc¬…ý~£@aÖñ¶ñξ‡Xö§–ßÔBa¿ÝnøáUýøøxœç#Ò瘰{‘x<«*º “a.€£ÉpQ÷ ¶ìuaíÂ< ýi =?V‰À¡Llb91ÃÇVîéEê½÷ÞÇÛû{¬¹Ü–n¬í]h£¢ªÝìqžïªáâ×A"Ê7LÔm¤¨HkÍüKïÝÌͺ¹EáîûÛ[NÜ™ÙÜí<Ý]†6òqøÕßÞÞþéOVѯ_ÿý§ú÷ï37ÍEOkÆo?$%’ÇããໃÙY„ÝU$ìüMõëã"¸±0vÈ*ëff÷óüá8T£äV„1®ˆ*8¿Ô‚¸&f8ϳ÷3ô ‡uü8ŽûýáîM[î%Uá©0›»™½ÝnïÇñq¿Gök‹ IDATg¯HkÇ_þòã—/_Þßß„ùãþlòÐo·Ã#ÇšŠ”” ïåg[ê¶ìTãLþòåË?ýùŸzïÿë_ÿõãë×ãvÛ%ûµ ÿ}xîÊj~Œ²&‡gjî>®•øÞÇ>%aÒÃM2HõÌÆô8Ït|æ£5ñQ¡=äc~•nù§yH˜GkfÆq®Æ n9‰r¿#ê±Y4¸Üö f4!æþpVn¤Ý,@IÌD"pS‘îæff~ž‡;Ìíñ8 €†ŽanÁ‚' Ï+“ÃÝmÒ Q©ðííDzï0ïnÌQ"wr3:ûãþˆ¶l‚wi¢ÚÒ¸ R!U™‹|樮hXˆ¨dC<³ê›p7 ÞÂ=jB☠Džcf³·p¶ÞÖv‹¨Gœ Ý┈šjÓ£ïo?t{œ÷ݘIÀˆ©‡á 'ÀÙ p¿7˜pZï÷þÓ#ZÄʼn[ÇÓLÁ­ùýñhMó wëÂÜý‘Ûq0«˜5&Æ,ª±k3·¸‚ŽÐÀ'uíP‡ÔÝÓN³<9•##÷8ÍEn?݉ùhÍ»™‰hðèJÇqñÚM4ç9Ñ !Ò¸ÅÔ5;ÏÇãþáÝøò†ôn>! ”œ‡†N˜œê€Å9³De©07ÕÓTÍ¢Ö<¥ƒ3Åœ@C*”¤fp¬gŠÉpƒ XET8 iþåÎppÇäڮǕ([‡ˆL°xÓæˆ°~øˆ‡w/3“N rººqsÖ›?P–KÏ«íui0íV–R"µŠxi³>Ï%T¥Ï”HÜSLΙÊWثѶ‘ »Dƒ”¦Á)ßÎkÇ?m8ç4º¤ó³@yìÄGïn ÃAâíFŸ•hãf#ð$\¦à4¼ÞUÜ-!Ó”¹gt¯=½SÔ.^Ì|ÂDOÇAK_‚O úÒ°£Šµ¬t)íjvá^Cºc‹ãÐñ¤©x°C1‘ÏáŠ) Œ…MÂÏÖ´UŒÉ«¢‘K Û¤^eÛ…Ç­Ù¾S­ñšMU‘>U1ö9ÁOBÒ“Ò„únÇ—ï³ù¹"íçeÉUÏ­!éO¶ÙqKãyvòŒ°È\â×ó˜¡Èg1§Á³ØÁûþü{Y„#6Šç”4Æ;ÖI•%LtYwmïéB³X½ ´ÓÆŽ Wå¹\‡(^«O£«Åþ’uxQDÛi­- ¶™á‹_‡'épÇme ]&£-/ά¹áâ·”1UëÎ Ùx„`T‚®bà'@˜çÍpîæ˜¤xœ·ÉVlÖ݇>>&J kh® Ï„µâÆçEÿë{{u@—35ítyƒ³Ws¼¼`ï3ˆLŒàååÁ³Ö€Ìß«KmÖOú…ÿ*3èJÞû]ïü;¹áñ²4~Ñ]þލñÿêÿçr:ñ3¢WXö§ÉÙe PK]èEFèÓ÷ËôÍ;[éœÚ~´üRTÌã~ËeLëoååNÄábòá*}3_“ ¢›1ôÔ0kyÜùø±Ñ̲v)|—ñDM¬k ò6_­dû®h¸½º%•ñJðU©Çv‹}1È{ÎûpuG<Íæ­Z~?ÔϧU pÍyžÇã§_~ “uì…{ïö6¦ÔnÝKR˜™t(Ó¿YëÇŠ*$ž4Ñ/<ÍúµÐ[ÏÇãëׯþóŸnÇ¡¢8l™²ÝG¼¸ lNªr½ßÜÁlCx ›yU~Eî÷{ü‘™A £ ÑÛ-~×Xvgš¹ éçŸ~¼¿¨º{r³W HÓôãO?ýøãÿö¿ÿí8Z?»h»ÝŽœ¬DÅ("#Э»[œEÖÍ™“­«ðì»c5•`Õ›“ƒT›õ°¢ŸDï·›ˆŒyd´ì2KØfÜ< ?™Ä̲†Áq¿ß?>¾²ðívƒ«GŒpKXE9ڜѻÞ{?ŽCE=Né­ÝæN^UãkMmˆ%È©ù=|ã_tŠûÌS”ßïwù-´¦"r»ÝþËŸÿéËûûÿóÿý¿¿üòóûÛ{Õë_Úæ_ܲ¿aœ¦CÖ“zz×A—툋åý°„`Ë—Rò0‹Hj!„Ùš×‰ŠŽm@ÝrK…Í æžèmD¤ƒÜyœŠÛ˜˜r° +0³ü‡jS=Žã´þÕ=Wä õS£‚‚@Þ{´ýòõkú½ÌôÐ,û= f 2ïKJ1ã0$++„ÍX Ü-N6O]4Ì„\ÕÝÏóáÞd’­µQÝæy’€$–`Ó, ÆÇ ˜Ï8no<+ à*õ ‡ÌìÜän!]t÷PÚе±Hƒynð3£FÚ‹¨D@ÇìÑÝíh‡ª’ãì&Lž- $Dš>6œvrÊÜÔÚÁLÔ…@çy>=‘W½¸÷~~ÜïÇí`æûý3Ñp¢IÄÜœY X7f¸KN»ua9ÒxÆIL"ȉő,'$S‡˜éÃQ þ8»›õÞµi5µÆU ’zE˼±äV^˜‡ƒUÏû×Û-R^1QæÖÚÙ­É¡ªúRAàdf$¬ùkŒ<ˆàÞÝ"= ‹Q­›àÚ¹Ñ Fn®¾“»9P‰ $ÊîpšìvŸR4¼› ³œsÉÆ º3]°È! o@7öß½E5½càä¡Lê}h28…4e‚x/g/WƒjjÒŽ­*Á¤’kµ,{]Î3Þb¥ƒûž';cÕœÎÕ̲“r £Qrpq²©`H kº0}Õ¼*uyšWATknc¸§|'oþ¹ŸE¸zÿë*qÔÏf>„–ýd[[ n¬'SIeóîÌGé?‚÷D[» ®&èªfˆâÄ}m|,YÌl)ÒnÕ@<šµ‰Ÿ¨ñ¼ì«,4ª€R}O0[À÷ÁØŒŠŒÕxʼn8 `y`LW0Ê*ßJCòsöƒù)|±Ñ<™Të$†ˆ´¦»ú?•1Êö³þY½}fíÐèëZ¢€ p¼’SùÜ ©M–öe8âæŠ¶xb”í«ÿdx•½Ú.ùì•sË©,­¿¾xG5;¾æTÒecÚõ¼6¾LÛ–«ŒÆ1¤ –«ß%Ñ d®N˧)àå£<7ÉÃÙ„Z0Pþ.m¥¡Óu‘çöÞ‚+¹£Hz\Ü{ŒË‘_uîÛçôªugÂAí{ܼºeŒ‚fl‡¨ÄàS§­Ä͇Í|ŠÝ…ƃv/sŸâ/ÇdU%;¯ÙrŽ¤Ø‹ªK¼]8ã æƒ gâœïÐòÛƒG4ëúÉt¡Pÿ#¢4æž« Ð3igÙ#”+ù‰ùÊ Òã2ò,\\Ýíðóås€yІÑ-Ë âÉ(¹¬ËíqTˆ4ôã¹*ó-¬Ó˜XdVÒäTÀÝ3½HrH]¯¤„,y£Ì~W®4”Œþ²uÝbÁÖ¶¢ûO«7wa±M¯Ç2©VF¯&è1_X»cƒß­B Zâültð룦Ìós…´"*t¡“}ÎŒŸIÇUíƒW…¥{.‰. 7¨7ÓýÃÂÛgäàäÍKßWÀ@ô™Ÿõû+|_*æønø?"˜ó÷¼C|ó[ûÕâ‚ïQ´7ìÏ ÿï*øŠ¡Í¡ÿ©:ÿY;ðæ õá_{ûë‚â]ÕÇSà‡®¹‚qSî*žN[. žžƒý”õFýûê>æ•'_÷u”FŸÍðÎ+‚¶¾6SÍ„RÝ„J4 Œ‡Ð°›•=žHð—Ë–ÁD¡Ü³ðѧ#ksè“ Ï*ª…Ð¡ë»ÆªDí7þýìàuC_Ûˆ—19ÿýÕÿŽhÁ5wùòåËÜi‹ðqG» óã|Dþoª™kÍ °pkÍÌsˆ¹2ms*0È?2=×i§ÍŽDÏMff¼½·ãV <|¸`ÿÎóŒq»8{o#µ`…ó¾…Ìo·7zÜÝý<ÏÛíF¥÷ïRÕïöñxÌmÀÛíÖTÍýãëÇO?þØŽ#:BÄ:Z³€¬›ÀÞûÏ?ÿìî?þøãׯ_[ûÓííý8ÚÑŽ¸†•3¡´æ°ó´~ä8hÔT=…Lb k Ás—ÐC{7P7ÓÉÇ'Hô¾‚´ I3r º;C‰H„Í(ECwwDŽAEÓÖôè§‹p7“Xsf ½ß{?U[kí8ô‡Þníý´3,ü«‘ùhíh‡ÃçÉDÊbEЈ}¤Tä¡äg­{³™&©›í@:ýë¿ýÛÿþ÷¿üôÓoooí8¨´òNÈÏ¥^‚6Ø'g}îÅxb„F£yø³Uë6GŽtaO¿ZTéa§xÙ$ y”3³.74`nqý†7¹[»ÝnÚh$‚Edft’]O+ãpf¹µ[xëBL*JÇÒÝœj(i7?­t´µxP‹ 1 ‹â2ÇÙÎ,fFï³³û 'rT—ÆdW˜áÞƒ»ß¸‘âþx0ñ픲Ó'ã°H7&’¸[9ƒX$Ì`1!âÇy†& ÚŽãPm§‘TQwHnÖ³kÔít§¹šJŒ#nÂp6ëqr~|ܻۣ?„ØNkGc’£ 1ÙiçÙ[Sn-\æfNä¢G1²¸œçÙ㌂3˜U,ÐM¢SjOIÑ!Â>ŸÔî vw5Ѿ=úWÒQÈfN¦Mc”ÅDB"*LæÞ=ÎdCwçûã!"*zGkÍÂß'ì~'«*ªü"ðM4&q±ßcs÷n7•Hr8[ç¦DeCAîïFª¦E#Çài€Š–Y‰åöèþ©x*K¹qhe’EEáF¢¹OO.OK½S´8£’AÆŒyˆ˜Ëž‹¨˜ÍAé?L0þ\-ˆÏôíEh&õŽ0®NŸ:Äó>Wà“•> üÓJ¿’Ñ»QPC® IVEǪ¸l8Í1vi¥¹Æ@©‚O$WJ9e©5·òÀ0äòbüpMê–ÃTHµ‘²ˆW¥a‚ Ãþ?X>ΣLí®^Çí[Iqa¾—‹ <4h  ¸¶1äNr´—;.HT³ f­í4$®®sJ ‡weY±Òµ‘ ô±*ŠÖÇäw3)kY2ñbü™SœßšyŸÍ<˸ð‡ œÇ… 6ó¢¡ò\;W—ùÕnâ˜ó°ùGÂÛð£ú"/É[Ì¿uQ›f?ùíÂ\¿¹ÛÑ‚±²cü_#ŠâÓÅÜgnAØvœfMânÞ{OÅÙò|*úJÝZkQ0¼nægïn®M™`ÆÌü§?þQ˜ÏÞigN7è4D4™ïBˆÿòþv´ÃFáÀl!Ž˜h|®ˆ2¸#Ù4ã`Oö±Ö;ñ¦»ûýã^ÅÇׯDôþþ÷Ö¦Ô=øEó_âüá½8©øcÂ!¹*Ä\†ÆZ³›8ÚÑZÓð¬ÔÝ£° wP€ŠÆ¦M˜á†£© ³ˆ“0à 9„&"†<Šàènx‹«òþþ¦ªÂâî­E™±Ä 91z?‰ùh‡F9’t?-ÍØë‰sîqöP«•À¬eÓ‚yÍ|ÆW³Åa˜WŠÜïs-ÎÌÇãçŸ~¹?îqnÜno·ÛÛš6SbßõJ•{â+Pæô'Òêê8Îzëc´æ>ýÌzÂÍ-> /Ý”¢$`-ášz˜¸›9Àƒ9‘ 0³P@€ˆXä`f‘Ûíæ Çã#?¦Ž¤àƒ)1%âlN#eÐ=æpP•ØÉÁÙ«áäÂ?%Bkþ`Ò8¥)¢é &e’ÖÎnQä³FÇMIÉé„ïskêfÒ9ÀÈî7ËF5fÖ J4N¸Š™)Àò£÷Ø EG'!ÐÊÏ~ž7t³8à0cbMH>kãîJf¡YÆÍLM ƒ¸±<Ü<ÚŒ9'ÌŸœ}ϘP‹MÂó}y7×°Ñí\hÜ{Ra[ĵípƒ`wÄšŠ'F9MÓs®°e5Óß_žÈ9æ¬{ÎiØôqKb¬ÅX@‰ÐTòAĸұþÅã´¶;·»²zh ’ÂKhóДV/vêŸI½³|¯ZKš iÞ³#ËB•#ðÚ€Á(â#ÕÀ]U/ŠÞËÅa%N'~Ju‹î\öhÙ^œQi_¢ZTP£#cÄ|AâßçZ.Mz!…ÿá‡?„ÚkÖ +ñ2³hÖ#"ºÝn·Ûñv{o*³Ÿ8ÿ;´š~öóqžîx<>zïüãBv 5m€ßχ—¢×Í>>>B‚?Ž›ª†èñxDŸjD¢ov‰q¥! ßl ®Ñ&ªDìæ¢2!3‰(àæÞ˜ßº»ÃÓu®Úzïç©Ù‰ Ëë Ús”޵OàQ:D£‰Ûq>º»eá+˜ˆ:‘¢*ƒÎdf>v—!e²°Š2Ód×D5ëÙ­›ù0¸oŽÞÍÅÃŒ|Ç$ïW¬?è8ŒLdÖÍŒo7fSüÜ$Oå]U?>î_?¾žçÙZûá”™Îa”™' AË©J©–%÷ÔUuº¹ÅZÙŒó{çº0ŠÅ ³4ÕD²€VJ†À‹eCcÂ0»“ÀçÆÙóÎå¼G‹šªˆ2pÜÇPÄ„Ìz@²ÐY«íSÀtÂÔÆÍ/P¯¢nèæs2šÄüììH,ª›)sLm4ÊŠ]œèqžª Âé ®AîY[h»€úiÝ:#6´y¿ÑÞϬe3±Ñ;´u7x<8{ÄLfuܹjM¢âD0#¢ó x?kkÌÒZ3sm ŽoDTÄDÌ"*¢D,öó€-¸C$qL ïFÌ¢¹32 wë¯eæ£9y~Ã!ü sÓ†ã‹ÔûÛ¡¬GsU5™‡‹4e°ûƒHãLrÑÖÂÁä*‡êÑšƒºw!Ün7@-§•N‰ß¹ui±g5¾µ[ H&9½›; ¢Ë¡gì6Íà&Âä-.ˆG76w³˜žÞÞŽ O?мYêLnÕ¦Ú˜$DÝûyRп„oG;Ž[¤¦¦-ÐXî0³p]ºsizÿâ.1lc V«æ,13â Þ; BŒ…‹L(½{'ÒÆ2¹YR¿  ° d0ËcQ¤zKÑwˆ“ò›k‰ü¤|øê=ç–‰b"Ž{ø2Œãº0Í‘–Å)?^±OŒLûz䦳ʉ§í#À!YÙšhJæ‹ÐSîi-q¦TVMÓÃÃî6“IQÈ@£9 :±Ê¢MáGÆ=­Ru¡ÍhAK¿‘Ý<š~†¢>O“UFÌs2­lª†x@Ä;f|¨¯™LSüð4ÖŒý”³6 åŒcö9VËÚD3ðfàîýÅ'žs¹(ÄÄP Âm*{Et²£`IgëÀ>³p–ïJµÞLifŽÈ¦0÷FmGµµÏÒÎXñúˆH²%a©Š1«N2ª‡zã LYE1ñs<«¦¸(ij^P«H”ŸÐÿ¼ðîׯ€Y²ªWQȼGÂs´5©Vë¤ãy_cTóiÝå0Y(ïØ>"ׯ¼„ïk,€6óQm­Cžç¼í*k~Úô:¨ #Á!qs—å®Â¾Ù¾˜ñ³ \;|†,S%\aMµŠü–¤¾ÏO¤ƒmŸ‡™š¡õ­p_×tÃìül¤eb³ÃebÁ3]ôļ|dï³6hÕÒ¦Eæaa³Ê\÷’UP2ÏÍñà_;è‹Ê¯Uó¾&"Ãó9 Z^¶™tßÒE¼zqŠéëö«´¸<”f²ÀxâË Ö$¼Ú¹Æ+Gʲ¬—\Äå|*r4gmo¾>Á3´±3áÙQ³¥íR[_¡¢KýøŒrñ®ERUr$0Ä"Ué(—ÍÆÚn3sw„ú¯-ø»˜ëÃþÈñÎ×ï¬8h£’$S]WÂÅxc>Ìv’É‹¢c͉$Í0O™¢]ø€ëª^ÅÂ[ä/O\YZ|!e1½pMnCÃaÆÌƒ†p¨®/$:åN0Z¥±’^Tß6ðÒ+?ž‚ŸâªK•ùµlôÊÿ Ý–?éZ ëjq¿ÇMöJ2æ3aõ2â-µã°ëô¢R¬Ÿ&ø«Áü _Óëñ‰ïš·‰)_–®ß‹*ú+ÄcüÚ÷±;€?‘­ù»èOkaù9¶øôvðÛšŠÿaaþ®PÆ7ÑnÙ IDATþî'ýºŸÛÿ_ ÷¿PW–T¦ßÏ34¾Œ1øúµÏS÷ úyAÿ_$cGªY¨âd=‡5ç퀩dþë-nÃñoLŒiº ^—ú¸Z¥;‘võ¾26ÿžV²]^Å|͘ð¤©É\’ðú±éùøžçv@`ÁlH!øÜP Ñ@Å嬘¿dÚdÂVËÅWQ¸[®³ö]YlO'v¦Ðïh!L‡4ÜZ JFØ}ðsš6§ðËûªå£…k‘Ð_ëæé»§²Žµ:öWMZkM˜Íí¸üòKúyó'ݧùzÆÏÍm4maÞo­©jõçãþÀtdÇ/5qÍ…ùqžá…=χYϪaÕé%o­¹ûÇLJ™ à³9pÇû—/·Û[p‡T5EfÕ'YǰZöj"!™’;ßYZÎL*Àfvž™U)­»$Ç̈¸÷n½Ûؾ6•d­5,§U.X1v¶ý43ë!d›ÅŒ-úBI¤I°ÅóŸþè"½1E@k ‡»Ÿ=3ù=’(<Ùø2÷ÄÃŒÏãçcUêåºK {^*r9˜Ë®ÂÇÙûãñøÓŸþüöövž'íÞw#¿ˆÎ Á¼|}u 𬦘šË”…›iîîcb!a%žŸ"·,¢ù­j$&µùÕ&@ž´ÓŽ ò¤‰sDrAÏ",,Ú”€¦íýí6ôĸބöÞ'¯Ìl†ƒEYŒ‘° ôÎ[×£KžÓÒGïfD/3ÈaÂB0âF{¥€ˆÐÍTÜfn§=„ÇÍ5vLšEŽ`Y"gRrH(ú¹ÆFÜ.z÷óì©A‚ܳK4¦1Y”Ù‰ØI˜›h¸X¥é¬-‹ž™cŽ{–2ƒØ³;•ãÔ2ó‘*¨ÍAýþa@L½ú£kSx$6a­M$ˆZÚ”À_ïwfî~ø|XÐcD´ ±(%–ÖŽˆ§Xbyé8n|ÿò0ë¦,r´ÖÍü<ã>IY³,,QÃ,£ai*"-B†Ãî‰ç2ËøVÀÂÄ¢Éd1óÇÙá.¢L§~ +Ë¡ÇÞù.ÚT»ÃÈØI[”Üûýq>ÌÎþx¸#JŒ‰…Ì!0·àƸÃà"Â"n61<ÃOFœ<ˆœE•Ä5ÊzÔ sÄPØïò™5 ¨Âvf0µì«ˆTÉØ= Ó°!D¯„“eWÇl² î’afàhf­PíܚĬq· ¥qr¸'“ˆÙÒD„—÷&IòÉÖ¼½Ws;­ÂÒá*v¢|k²íVç3"ãŽT°,¨¬a^3†8˯£êŠCÝqì«#8ž]^[rr„år”mVb`2ÙÃþ¹`Θ´•h{(:Дª²zT33jS/1cúSY‘6a7\ÍnŒBÕ NI†´‰iú¥HÒ´Ox­T‡ãqXˆ† ŸV2cféQ°óéVtp¡¾ i9 QlEµuaü3¶Œ2(¡b7œl{ÌÄÞôçз[–¶X|ðgOY$—Ëy‘Ö/c´eÏ…µWÁ[¯Ó“b]õ­bZ\ƒ‡á»â'±@Fpu}$¬TJz¬/ùn™kíq]bbòé=¾3ÌVn¾0Õô¢·'&ç|6g*õdÒœj­ÈòDUívœc\ÐFT%(QK”òì¥2ÉÓvºÄ5–W~˜¸òBvxy·Ø,ù  ò5âîVZ}dÌÊÄ“7þ“â¯|¬>tk/[¥êr%©OªV¾$«¶–kà _>lBmó*žôžñíÃrVêaMqYu¿t:׉ѓú?hõñôáý:.Z„þÖѸzÖ|y§à¼j{Ǹ`vÆ„ah!ãsÊì´Pq¼][e]ŒÂ¦‰b‚dáä5‡œªGr6;±ãÁóeªÚ…U2o#ö0úD.µ4ÚÏ( —š”2‚Uâlw‡'W°µÉa¸Î&9J´r„à—S_Æ»/˜ ë +SüqHW.:X,o·Übôö¼k­@Ù³~†MÚÊ#ƒbï¿Ü€Ç™<´ÿÕÀ1~”'áV[r6åwìêÿœcóÎâ|*îÆ7€ /¿æ ç5Mæ§¿5G »t‰]ðÅ¢ía`/C±{**ÅSÕ=Ûñ[bß«)ƺS|ϰãIÞüŒ›¿-hM©Þ«w~ÓV¹Ð·tú¿ÆeÿÉ[dü5Šû7¦ ûùJþïú§ÌŒðz0ÆŸØÿ_¢„ø%/¨üO~5~øÖdaýðl¯Ù¾B^›˜Ó—ÅÓåj¯î0,` —-é|qTë}®=¥ Edu¯õH4ˆ€Ä•b"ÛT|’e!%9;[yïå«a&·ø¼ÉBO%3–<²uÀHd¼y’ì–yv.ýV3‡Á¸,&óVˆÒ™Œ—w”aÐËuäÜŸyK ÕAÅ‹t>‡ýÖ€ÀèŸçîãhӮ͟Ì|;ngïF=\CÌâSy»Ñ0Û2 õϨ¸²Ëò ÈÄ?Uÿr´EçjO8œ¹éõžÞÿr Ìºåø éíñ.¬wtþÄð`ºHbƒÖZ›ñ Å27Kü<3ŸçÙ{¯ìv#U¹ÝnÑ¥/x¿ß'öGŠ}ªºñ"ñygÕðq4À5‘¤Ã€÷è$œ¥){†ÞùÖsûúõƒˆÜºY‡; ;¨eÑk~¢âòPšç#]zߺw3"V&4&À¬ÍØ©xtªš%@Üý8f ÓíéÖû9ñD‘e…esàòX^€Þ™2©à«* !lðJ,©ñp7oM'ªþá˜îfÖ;‹ªêý|¨jòs˜+è1~QÖ3]x2"Æ<ÑðÌbIðÜ*Æa‰U·Cš¸ƒI$%!$JgºG³ýØC¡6Kª2“*‰˜õR„œ*ª½»ˆ6mݺ0³hîiœŒÁåF>l¨Ñ60™ÒSÒaw3ï¹éÉz^îì­µCõ<nÞT¥ ºÇåXpJa–Ûq0óãîD#fë'3{ ³x€µ)» 3{ÓfNMõPiBMÙÁýì-â~̬Z /<;[EP'8CùÐ7mÚUTR•v°ygj¿<>úyžžæH@ET[¨g☡zìmâõFni .Å Ê]¢nîÜx[¨ŒŽ?§|¥£5iâÝ%ðT]ÃK9½{;E¬UÅáÄl0 'bÞm$vM·8á7»„Åç˜Óøó»a?ËavAý²É­…éÓŽE"’ˆ§ŒW^¢Ø°dsîð>—À¥ð"'ó!×UWäÏ ø”ÔÃ.ÏéÅTŠŽø$ÞÃJ`^ZM+4ÕÂ*­ª£ÒoAµÁƒM_üÄc$éÙDD˜c(m“/‘ü#6÷üª&ZЧBV`˜¥YB™‰›I pPXðŒ¹ôM©\%$"3øUÐÅpÔԾJ–ê÷fŒ7‘}X|’uEQ<¿JãØ,€¨ÿ%?Pɇ[w¯‹>4xoŸh~x¾óO‚à}1nrÑÀ¥H|?°¯æÎÏ«—MÆžY½¾—§EßìùùËü1z\„ߣì×Ègó˜¿-€o¾Ë½ûéýü Tý<ýÿ·°ÿ_ew~YùËßñ7Ÿé<×—~~;/ç|È+ÛÁô½®O×ÿvMW =Á9Äz’á£ÕY‚24¿ÔüRIœ׿¿P@&æ°5|xú‚ÏÃÁÁõ™ãMSÖôf­ã à!+>F œDV‡Ô¼:Hb5&åÁPyj ÇIÿƒ™ìYµ9˜^»Ôý+öèåLhÚ .»,¢WT°ßýBkS²žþ›ÝŽ£1ó¡È…•(åªXßø2ƒ0|JÜdCÄïæÙÁ»ûâ×1Cø¬ý‰ÓiÝÜ£$Úº±b4ß2Ýýþõ#pªY*àðÞ­µfŽ5ÁÊÄ-¸á së vÄÈ "lŒÖÚï_Ì·9ÜvpZ7ïx3o¬›Þ´ÝŽ›ÌnÎNn–g…ˆ†5yfBÀîç ±¯_vP{;Ę ÎÊ_n·nîÝTø¦Ç£‹›ýŒG]ôjtï în÷3g!QÍm|øÜ‰ãôSQ±²‚éÆ7„Ènž$!D±®ÇCŽÑb§~ÿúu\ÎÔÝš¶¦­-~E KÝZÂx˜ˆ¨!'dŒ¦”t‘ˆ(Hµ ¯hVº»wgmÊ,äÄáï‘  K¢W#«(ìì.âU‰¸X–6 g ‚¨ øêòF“#"ª½y ¡i…›ˆñ*&[§Z0˜ñ¡ŸUóÙ`\,߆–œú(¿ØGdmKM„1Køò|å¼ óâôA¡¸ä›±[qgŒ?1g ­ƒc®!‡å4h(“lsyÖ£ÁBˆ‡døèü‘€ƒM¤ÒŸ½V8£#š 0 's%#„M™( NÉ)Z‰{Nþg>Ê+tH0=µë%ywãå({I>‡H3‰B´+LQÁ,šÏâ-ˆšÍ'ËÛyƒw®HíÚåœxñø,Õÿž ™{p§*•nèèéËLüNíÐ\^§‡?çh³Ðb\xKÿØ^ÊZ7QÏ{xNJš1!šÍ\+‹g'Dy¸T.2ã,â1éˆØVÞ~fÙ8“Û/1OV]î#H諯EóàKÚ¯ºó¨°ß´Ä$Î TvÑÇH^„eôú(Ä=¡@ØÉÉDîpr7g"Õ°¦dTð"ýSmHÎæU|>Ð}ëF77ÎÃuƒ‘Ñ FO¯õqÀs€ýZ@ý‹×˼äIÅÚ.üjð|),¨Ã¶8“¹¶…,Ácø2ëØÃÿê»úÝX·ô2U¨÷ïrÅ_ÅÀ§Î¦çÔ:©LMÍé“P°ÝÙF²Šì|±Úøv>]aꥳdÇA–ÛVzž–ìzWÙì:zÀ5ìñ7K[ÂüWiÁÀõ‰ð›Ð€¾Å'ÂwÉÕߣþãwPÿCöÿÿóèÿümûÿ¯¼Þu$À{à™ÕÎßóöø@™ÒÖÚƒš1š^/2jŠÆsföøB³ÂÖ@wþ 2=Ì›±.(¶8”døŽìzaWÚ|6£ç`®»Enš»_”Ÿ‡é‹ØÚ>;žßŽ\Œ b‡(²ZÄ.7«u&C_:–©`2–‹Ö• ¢—çÑ{•SÚþó(X{]Âõ™þ· ÞßßC›>ÏÓÌç ¢£©ÃÜ”„Õ¼‡Š¶¯±ub":šÎšÖY²Ú{׬öËHyöó,z#Qïöññ1ó{µÝú’,·Ò®µ!wÌ AýuuóàÃZn÷»™…(ìQÔy£@ˆÈ6®0¢ºóívÑUU-’Ú̬Û9¥|s…ó<ÍúÛÛ{Àñd ª†%eUçEú÷øŠU3K1ÿ4¯§à®DÔZ{ÿB˜û;ŽÁÂg„K Aj]ÙîóŽs,Šž†qŠ.“a6:÷Òœ¯’›Gar|—ä"´t-3 q€žœEˆj¨Ïçy†¨›¦éÐI8>s„\„Ù™ •w'&‘cµØá<Úvc†Ù ‡²sÞóx»…§Ùg&,7놌(pdÐ݈‰ChS–lEZÕ¦I¤w¸£ ×JE3¹9mõ3G¯§M–Ÿf1pw3fIy7:ŽCY@P"nª¹.–ðïÅÔW ˜‰ßïî¬b¶8z6KkCý˜’wX”^Çà%JQêfv§ÑÁD­i“ÆÂ1)lMEÄýî½ú&· :ws"îݘàî*jè >nG3ênvv"E óœÂæŽN•‰¢&Ý>¼÷þõã#¾ÔÞÍf]DÚqk §÷£§Ÿ¡Ú»ãí­‰Êãì÷û=^ð<Ö[:¢ 9ô¦C´77ŒEA°n{v¸?`Çýìý‡·/ÇÑàèÞ=sˆ^Þûù ÂûÛ[»µ‘tÉáÑ"L¢é4·îDnø`ÑÆnEjNõš„it1ÀQê5³‚eÜ— ¼"ØNŽ@¸ˆ+”Àx˜$F .#Š6„ÃÒ7e鉭¨ˆÚ0é­žÞ‚ÌÙ’Ï P6Eç54jòòêºð)—ýr©¥4jš|-1Æw|bEб:Z™€‰Z¦Y½±ÞëÎ¥ÐWhsFÏeiKOe ‡³h,¹ZºL>’y‘ÞÇ(ù] —\ È ”Mº?©r¼„Ï)Y{ _šYy"“Šù°d§¿´tð-±€‰|«¶"ªXñ­³`´^Ñæ:¼”…FΠ¶/ïñÅ:Ú8”ó‰;3³œ§ôp[.fÕÃÊ3E+›Qv-ÂEѽlÖ‚W)I2È&˜^p ÙäÉB•Dê 8(;§ú,/•²»‰€b;õ×IÔºœÄí_Œ‘ »Ó;?Ê[KñÁ°X¯žG_ÚѬ’ŠÌÝÝT´Ë@žAB¨¦¿LA–!¼ŽŠPG“N2F‚k¿©ÞWÏFS†ðvôÆtèÂŽXc¾ýj†ä ˜Ú°û¼„÷W¯Gi«‘ÜYpµÍ©ÎúdüÌÛæãÝè·‹zx}9›|‰¬»à ¾¢ +yÏKúß¶ŒØ d<n<ôPg&Ø~iÙÀ¯[á,ë˜Ñ’ñ##Š2ÕÁÌY%<¢\&nûŒ8%×M3žs+®¯» âœÍ-K'aZê¿Çs]Æ<–’‚ÔÚw'Ú˜æY»à†B}/¾‰áCR û-vÜ<‡¬öS"Þ¨ïX˜Ü´ŒG˜Ö±ìEÇe&Ǹ±­ëzìµI„bûÉD¢ûÓ:ÁÉkìÉô÷³ÒœÄ5CS*‚ñ¤hó®K‚}8»:|Ÿ¢9ø\‡«–öKØú²Ù ÏP÷—´—ÞoŒ Å(®˜HŪHcA¤H ãiÍ€ÁÅPž¼Ù6‹½ô%«ËðÁ´!Y7£îÞÙ^¢kâmš0F;6æ¹Zš¶ÇÌäôUˆùU»ÏÍÝÏ’&ñ¤þ3*êZüdwÅ‹ ÁXe~y"•Sî?¨þÿ"øw¨ÿ¿ŸŽþÔ‡‹ào¿ì7Ò$û³xçØ]ã3ß\~`Þµø9£ðª~ Ì§·bâoŠÛO©Ñ5Žj”õ{™ç"b­@Ó¶1ÏJI'~VWI¥úMÏÎÚe“j9Œ,’±ûÚ¦3ëM>3’œÀ©ÑqùBÆBöú`±ûEØ=yAeôxHŽ\ãªÞ/„ Væ£ÀóŠ—(q,_çÌ3,¬YÓ uý¡¿G:¨ý÷þ¯Ÿùþëóì÷ûctÉ?üðåý™Ušˆ¹‘Íg¶xâÜÐN¥õþxÝÒMeN ³ŸŽv¨bjýg?Í,€<3I0 Ãe«£áÅ-ÅÖ§ôüù¥»º^§¾|¿ßçé½·DýD­Ñ¨7Æt ®QS+€É£?Ï3„‰ž¾~æÞûqÓÆ>ó óÍÄ@Ð|± F¨êæ0³;ðövr<î÷{ïænñ+Zkn]T84–‰ÄPïÝÜšHø\¹‹°YWemz?ÍBËõØg,î&p6îöWþãaÌüöþq\sçLX’Ü RVf6ƒ™ë8VEÍßΓÖÚˆ_L?ìà5LFÚôx˜{ÛÜ?>î*]Z–è¹; ‹P4Ž°È¡z23 |´SKSyœ§Ÿý4ssºq³x¤"n·£›ðþöåýý}’ÇUEZ#‚¹+k4cwsrˆÍÈÌ §¹k€«‰T¸9ÎÌ…£W”ÉE"ˆ ¹9V"V ä~±lŒúÔ&Jpeq³8\D›ˆÁÜw¸„ã[E}¸Êy+hc¤2#ÖénŽùÌ€ÀLqxq×nœeeüqÂ%eǘ¥Ñì.Y„…ë/Âô–7Dîf×r*S&åfe@^5›­©`ºt¢Nÿƒb'žhŠ’E_ž5oÜäiô™3½ÊîÝ<‡÷wórbOvÒØ³br7Š«öâÉÝÝ»^ü}2²!Dƒ"³jxÑ$F sÝ%J.· |²’~´Bc«»hmhJ¿Õ„Ì¥1t@.Úï`»,ödò‚&#*xä·áy”0i…Û³>3M¢Â¶ZN—­/ø"ž•‚9a*6ñÜ/,ïøx½1˜©\Îòf×ï/¿B.1Çż¾ÎÃÁ¶æÒnUÄÀd;‘Þ‚ ¤SfPcÕ¿ZC£cfBŒy|Ïžp¦ÕÄPê;¶¸#ÑÕ%š{:/µ+?3ò$yŸà ¿Á™z?ïV¼†ƒ6µžçSoŽq8Åù9hØòô±ÄX7)Ž è¶o®ÂhMz¨ž £ ¸X§ˆ¾Å¶±Èš^ѳ ‹¿¥Ã<«K¥Ö.mº¨¹Å-·jÂço¤€.ÔTäåûYWO“?ÌJ>f‰› Þ¼ÌkŽÉRZ´š ¼ö§s©ýZúŠMBFê ûáñ Gd>ûlšÏ‰YH„¿ˆXAE¦–f¸jÜ‚Ýá!ÜWûø wºÃcÏBžd2"Y”Ê9J†ID´ø#÷ IDATcQ]BQav¯…ãùEŒú™y®†¸{ÊðŒO²ægLóI³!†­ž„©Ã ÎD¬ÒT‡1}=ú8u|ÌŒøä%Lß"0#›àí]+OŽiTeýšZ*_=..;]û)¦³w }Cø+RývjUª¶«f¿]b1êÆµ2ëJzeî.›ú?å^yG54ð4$¨§ צh`‹ Ì'Çå“Wþaê±goÆ »²õb¢°kL@™›ìgàSúhªt»šöj¤‰Uzžá·ÕxUýÿÍ^ü·øÙoG þ/dîÿcFü«ÃþvÇïåkÙ¤üç>…âJþÆ8öÁ_¢ Ÿ\ÆNb=—«ƒsñº :\TrYHØ4¢T„ «BµÃs1×Ӆ͸ׄ+—:¶‚P£Þ{üÏ9Õ@ɹ]Û?>>BpïfÇ!¢ÇãÀý àŸú1^ʇZífªú8Ïx~>Ü?>HÕ{t¢Š›Çe€¸wWxïæ¶¦wáÙgV?:œ©;¾µÆ·Û—ûÇÇÏ?ÿL­QÀlʯ@g!õÞ‰·¨Çul[ìYŸ9è;½¯a‰ˆ¦äí6¿q3X?ãÅoÇñú­5fy<ÎZ®°ù €µ^䥙*˜s…úíhp‡vÇÊšÔµæÐkÜ-çùûÜÝF#(Itþåæy, üã#ÈEyÆÆ\I„‡qøÿ§îí–%9r$M(Ì<â$Y½-{1+óþo·³Ó]ÝÅÌãnöÌ#’d‘,V K„•$ÏOüx˜›)T? ÍŒÁÔˆó ”6«ÂÇ#P¢Êd ž-©C¼l»scb‚5šgS4§ êó S Š™Pk0%k!dzͻ;½¢_:D¤¡{]®èP‰ †iãc:zÿ 9ï†Ø:7ö·Ê’ŽõAÔà©2ÂíüÇqœf6®Ë §Ý_) SŽê!мmÄ'Uðë ¦¦CˆMyZêˆá²3™+)‘hLUùÁ@"* Üzïýøv}Ž¡>3c Fw~áÕë‚ÌÌT‡‹¶*c1Ò6_4?ý4hž¹™HÙZ÷’sL£´·Þ²uTwŸî0"|g £þ8¯ÓL‡ŽÇ¢³Ÿ½÷F8· ×¥³ÄØ3qã]âjöyªê·,r©60ÚdZÑÑ›‹>ÇP•!Ãó.3K! çó9ÙñF§2–î9õÂõ©f0ØÄL‡,¶5 0xö `Ù‡ÆíMO56ÊDY`cªM¾LDh¥sÊ'—/ZU¾+öŸÆy£kÚ~¾m:\®î/0ƒ·ŽRÏ[£õ“AÛÈ£Ly— ©ô×Ñ œ6¯CÿÔ{ ÐÌCù›‘¥5d:û "4gÕ¦¦¢â ¡cçëå^Ò,Þ9-ÓÌT&W?_?¬Î0¤ÄƯ L¾Y­_Ð5ö­>ØÖDf•çpŽò0k÷sk~'Ú°·ÆôªþÇm—Ò>õJn/ÜÔÛå7‹èjÛ3Æï;ÛÔöósøSO@s³]Ü’77ÞK ¢®5íˆ7®ð(¤Òdp3fÙ­f&œ¢Eå/O®Ô¸ÙëîßÇ%,…WÑœî8 7Ï}»§–aÀ¾A‰2lÞÿÁ¹†[€ $BûN ÁÞ«ñVÈ/’tQ«ne÷ŸPÖ÷| ûã4ö¿_ýÿÝöÞ¤kŸÎ_õÌÿHøo°ÿÛ¿Þ\¿ç›îÿ;«ÿçèÿ¿P8ñ²2þü#ÝBÔ ¼I¼|ÿª¸Î–ØH)KÑÆ–€¤ÌzÖpÃ6ͨÖzP¹qyfu6r#éêxŠ#݆œˆà&JóÀªÒ¥­ `Ú>rmÄV1°m¡é–RÞ4ýýåFeË#øÛO7ê‘eºdiÅ~÷ÕÍö~«×ÅÚÍþÜÇüOjé?ýôÓãñpþÌÑûóñADÇ!éƒþ¯Ÿþû¯û¯ ÃIÜuïØ:Î,åñÑx~QÑk bV3 ó¾;r|ªØªçyúì!·æªz×…'¿)kr8=š«í¶×¯÷ÚhÔ䛫–“{ïfmŒqžŸ.Ö»CßåׯL-ÔaØuæaêÁ”^þ‘“ª>·¥Ou~Œ|`?>x<DæZ?Éÿ]­µq]ªrŸD¸ÆðÑ;&Õ ·Ü›‰ ÏÖƒÎÖUäh¬~êW#ÒÑkŒÎ­µQLE™× Á÷mFF“ê#fìÜzfýù021²Ìm„y,7Ùàé="júº#ôŸãù Eù2ÝÐÓx¶@_³™`òßóÒÊ À«P‰ܦ´x 1£Þ»©2шr°á¯6é\·Hl&AµrNþñ—¥õh7Ÿ¥ àqÍ‹¡÷ž†AUcnsÔ8¤F«éÄp¹äÒŸD¢b¦C‰ˆºƒP‚vA n]EÎór'5ZãÞ DdPGȈN’û¦Á]#mÔøñxf¹EU³Á”†Ãˆ\ndn€ qïÙ{3 1‹ˆŠŠé¥òxõ0LUlˆÊ8‡™L4}ÇÒ[ï¦ÝÛZ"ãÖý€=t¸—œ Æ$`5ÇE>à ˜Wä‰lÀ1‰…”ëçQR?¿YcS¿žEÕp°£ „æ3Ee 3O«7Ooº5þøòá+!†ˆ¨xnÑUæ£×)§dÖCI=@à `>zo½÷îßfâÆ µ•ë}¢[LTÇçç5äËñ f½Ä?¡½7nÜ£=£ÍêtóÁÔÛóè³Уuf†Ù0ƒ*·¦¢ãº†ÈbÛ€£¬÷Ö®A½“ªÚ%"×÷й 6ÄT‰3»É˜WÒ9“Oc¼k—3óN€ ?™Ó Œ‰—Çkæ¡™Ár¢e p<|Îãä3RO˜)‚v°Üñ"¢Ö½iN…ˆÓAíz†~>^ŽMÕ1¡+‡¾NtGˆÓ¾ÑFÏ“ (t3 †ãw^´Þ?ð*"óPfëg Ò6— éÃ{[‹Ô¸¨Âì¨b 5tžUŠSæ¬'í|ª–­¸sÛ·³ŽÜ{ËC$Œ @ 6ro4¬ýFŒ­ÌlÕ¶”]š±mî°Æ‘;\ [ȸT<ãÁó:ìB7E!v·í»»»{¹ð(‚øç$d ÷šjnÎKUârŠGW¸Lv:5—ŽA&£Ã»Z66RôÌ‚±Lð¶@)aávî6­ù}½$#å0©úññút_ó”˜g„yŽ6”ˆLf 7®ó±[Ľ  ñÌC¿ùPµÂ™}ƒâM“,G:«æžm´ÙëyÝÕ·>3£ ¹.¤ùø>ˈaî’—uÀÊCâ—c–ób°)¬†uXiK1\âW±tóÊì¢ÆVÅÆlP}cCÛÇiñYH„S6#‡òÏ¥†îù<(.6–‹Õj½¦%@ʯZ-Çá©Æ^ËRµîÁmʉTLûèþgé„§X«Í¶Ö¶°“Åd«L_§5³r˜aÕR¿väyz§LÝ:&R¢àY°mËa¼æP~ªÂ•KéÑ)5I*Ô$K6%Ðî‚Û8e¹äe|4öÁós!Än­7óô­æaKÊA¢«ÇTE”t±ã¼GL£ˆË«¶8 ÖãŠW¸Á?Tr4úÂ-¾· ÀFg=¦1Àø™Ó»¹æM–í\ìfYÌŒÑð|[‘F$woÆøJ}ÂíTõkYÂLe.98/$lÁÃÍó¾NÇuP³ýõPÕe·¨ºè¶ U‘-^ã0(D>ÚÃM¢µzÛßú/ÇX78Ç õäÿVè- ï–ײÊð*7/™³>þuv(Öñí;éùŽ2F¥l×HD‰£R-¼‰½×ë ³:OCw«Ã¹½÷oÙü‘“ ”ZYÂèµ¶áÝ¡ªc··ö;rÿk½etXý ê?ýþϽÈ~ËãÅß7÷øW üù¿»û÷õßãnÁ;&Úþ°\;»/~Èñjÿß`‘Ÿøeœ±Ëñ‘Ïcʪ$pyàîÕç5˜ÞX¿Òm»Ö¾ê—86¯îQSpóc‘Ft[|ÝG³j®f'0mõ hå3iDP‹¯»1íðQж^eíøë sš‹ËîvÑÖýg–ÜVè|«4^^{æøãÇqÇáÊ©¨^ãtÕpW¨ÏkL §jo' ÛFTD :wÿFÃéö¹…Ê\yh»’`×ôÓ¤ž§C]¦Ÿ‘¹wwvN»¢\…6Ðç²ÿ3XIAS?BÎñgí˜õ1®š!è­ûÆÊ+çu¨ŽÔÀªâ´ 2—‰]"tÞýd`ôî uûúõ›È0Sÿš1®ì¹Mö‘ ñmòè ÉPÍAÏãnýè½7³É)î} 9¿^_>¾||úѸ™éy]­¹ M~´îXkž~`·ŽÆàÖ= àë¥Fž7Èçñ8åÑ“®€vÈDµ7è8ŽüÑT½aBE%óÌíhÇDøöí«ŒË<+A6†èCÄÀGoÇq`rE¹wëÜ`f"д·F`Um­3s.5a²q]— Ðy<úãñdo:3?:˜MÄ ¥Ã ê=®lQ0êw%ž\B„V¦Œf³b€ÈÍ”¬û.ÆÍ§óÊÉn@`àšeº²•Ÿo“ó7ié‰Â·r, ©, ‹o“°Î±« |;‡^­ü¤Ôß¹P¨wôMøÕßá€1áБE 09 —}ìdÎ]¶<íÊþ3¸£²ƒ¶u›¦Ó3¦H÷qöÍÐ>/¸å»¨T'’å«0wÜ‚=m0äd Nk%:/¯ µ-:þRu%žË¢ü–µ›ßV.tÍx&„mJ¹ \JhðY0‹ÉTúj,]÷ÞÆÇ\·‰ÃH)/·æ¶ŒÁ¶ÔºJ”8 –MbŠ»t×—“1Ôh®V/1Òï;}µÄ–á,ë­Zp®Ò—­Ó¨Žlî¢ ™Ät L–^Uø|»@Õꣴ͖2[D!O[!h…s;õê‚|mÂGË m]GëƒÈ…=”ýg!Ùâ&N½X%¨²0æ0“ý]å?,®Œm–¥ÝÄî‹_E“°9DH5G‘Á£Ðô½8Ž Œr–¶FAHAÝŸWÍÜ¥ê½V4]ø¶—²î§±Íó·^Lì ²¬¥Äb8‡»ý¿´kW;ï–‰ËÒ, ª‰~]¶ô6-`§Àp7?°œ5€̧췰9Å^xZ,Ö’•k—cåÍE#誱¢•öŠ˜’åS³qXç}¢½z!@ÃÎm£Õ(Í(yøùq÷WD˜f<š’œæœ?ÿo¦˜.Ÿœ±’ªšX ®,àOdD&¸yçm<µß¾O7õzæÄmq)M¨ïȾxúLmª/~ pVh€×`p^§_÷«ó˜#̵b/By~(s|ÖÈi¥„ XoïÇ~Gõ¹@×üÍÞE‘h%æd.Ã&·b•´¡+ìû1«2o|;ð6ˆe7çßËV'x×¼Z©WëÅ͹~·ÎÉÏ*K§›qð÷ËÍzkþù…½¦Rª»…pÔ¬dPö¯‘ë¦{µDÐÏC‡œ2&êg|<Ÿ½µÏ0¶Ï!Aïc ¯î½·ÖÒ#ŸX|fîç€U½Æùqªfóyžan܆ŒæÕ¸hÊê(•‰8(znk­µFæ…™jfÇqø»Ñ{ï½ixü1u‚å±™.pã#>??ýwýøãGï¬!•1\®ub‰7{à•ˆTT†è1¡ùl³=uªNì -6àDë€ÙZk½;ÜÌ­©Ò¸†ÈøöõÛ_þýß¹ñ8¯ÞÀy^ãj‚Љ’Š=žni…*‰&R3†¤€Sf¥FdcØñ`ÉÍ·o߯¸˜›Ó“lõ73ÔÛŒ¿³[²m[ãÛÙš0»ÉAÌäWK­Ïó̉ ±2¸‚†¼:ub.¤šÀ¢>U’h‡ÎÈÈíó pðD×_®Ñ·Þ²þëÒɲÎQޝü§¥5…ÞY¨Ë,2 ~ÓjÆŒÆMäR53Ië–¨]ç©ÚŽÞ¹5—fLͺͱœûñƒ˜?D.Uµq]00w†™:?Ÿtæ­ý1BÎcïª ‹9ŸÝCF2¼ªaÈå@ %jÌ 6 {ëâgBÕ~ôÖ›#†ˆ»ýU¥sãæM‰.F_ÿÜ™­qg¾T¯¯?‘ 2ôããéa&ž^B¦<§ÙFhrsœ~켆€Ì¸ñ#uæfªfh ƒÆóñHC˜˜‘ ¡ùËK›ZT+b¢vŽa Òãñ|z\c*Êܘµ±ª^—˜Bgó©›è Ãèq4‘ž|šµ~CDL ëªC.3Pˆ|}æ _囌‹¸M«9HDHIWc";Ï‹QY~$oPõ†ÖÀ£ØÜM0ðxÀTp‘Çd%£tv÷£ØÕ-Õ¸¢¬ó¬?Œjù؇$¤ê¢Àü2-ÖÔ[y[š@£’ØIñµú\˃Ad„«öãÜÁ)`¹©xmS¹‡¹~Í?Ó=7Ÿ(‡’zgÊ6f5þY`Õ…²^´¡¹sà_æô'$§¿JÑ&JmšGav?„¿<ìZ·¸ØVO¹j”wcöÈ Eôja|Ê›Ä> a@“2¡Êk6•Mf<}މÄ\@õòcŠÄ~߆ßÓ¶J á¯cÆÖðvéõ* Ãê m ‹f5Cl-/L•!s4^)yêçò…üç»^M_.ò1¶6€©üE••Gfˆâ¥m¼0=°+•èó€ê°9HâmŸCªÝÒ‘ ¿‰ÀA¤hq§vwi^ó ÅS\íË@àÈïݦS¹ ‹ÙU|ۛȾ“¦6kíÆÒÞ«0ßYeË`;éíª¶Zy¡ïO­Q(]›TÚQÇ?»‰˜î¿Š’¡g9Zpä7fX± æUaX8 CšTCp…˜¯ê 0KlSóAVQHÁvoS³=”@‚B/jÚþ›õíÖ°ZÖk RF1E·*>» j1Çš°M\!näë4É\îH ”·˜x†ì,V-µ&qÚ/=ÍÛSC%ó¶Å«ë/c2ïO1ìàÕ¢­ISb6‘#Ñ(“²´¨%ÆÓŸC#¢ÃƒÔˆ©éúü™ª·‹-ý4žŒê´šżhàt‚óNЩÌÏÊnŠYd­ÑZ’]gå-K¤­ÏlnWÊPaÝT¼â+ˆP˜€ÄèI i;³nÎ,moÝéà=‘†ÞZ[&2±ôÎ.ß¾ÕHJÁ‚åN6-ø»™À¿ƒ%±Wñ5%PÅ•ÍbX @5Bdu‚º]êk•^õì»úŸtßþ7wL÷‘¥½¦ÞîpJ­ÛRÀq8áe$ƒM.´—9ÅÏ‚ÿ‹Å£ î þ3AŠfßsÏ£8êÊü]3>~Vó^–»ú¯Ñ3ô+-ÿ?£þ¿ývÕÿ÷ÆþÕ-üÿ‚ðŸ¿G ÅËòªÒã—íÿïü/.þï‘{îÛ/¼<’ ßy¨oh¯&~²1nš›E}³½àø!"påïØÞ0"Ü"=¤@¡ò-³{~V‰Åƒãm—¶½ŽÞ¯1Æuª†ç-J䇙5°1”LÆ8Æá Òa­£5ÈEÌ0&˜ËÏF P1bÂÄd\ç³·njS.›¨€q‰^CJÞÁÜÑ™EõÛׯ“VË­3=ŽnFÊÚ¹ç9T¿~~þpôk Ui­=*äcÅç­¨7³©¶Þ|ÍPUm Þ`3LM$î¬Ïc·OŽ&'MíºÆó8˜¨ÝTéPk u“(ãÛyýôù­5>úadã¼r2 "O9¯ë¿Çõíó|<"´Ö4æ¬ÇqˆN"2q<’ùê3Æ05v`ÀìÒ*ŒÐ€Ö:‘røåD”†ŸÒ™=+ðñ8¼r#: ‚ƒŸ÷ÈðÌQ#Þþ‰)Î4îO!ÞT¹µI 0¨ÅŸ©!,ÓHz{𠉫b²0«ª›„‹.,£†f÷Àh9Z§ ãDœ1e¶ÐË–ˆš­Gnî°v\aP‰wÏ—2òr…Ǹ#'3ˆY¦Á©÷‚¨ $š„7‹æÏ*^a)ÒKœÛœ­=4Ïä³uɬßDŒ¥™q˜g†…Ó¹ŸÎJW™«i,Û¬0avJ4{PôUηD ÜïKKŒZKKBøôûÏ"Æ0ê.Æòç#ÄŸHì%½þ4V(-»80/Ý0À(ˆ§f»›7Ws–¢Î¾ŽaTÉí+¤2ßCU%$¹¨¢¢b£Q•ÕåÝþùŒ)ÅÝo>î-jdäø¹‡n¼Æuwüfž/¼lʦآW4äc IDATõïlKϲ¿ÅD˜Œ­DGq‹§N‘!Tz…]ì>ßÛµSb>NÓØËz²xèqLYšd­ÎÌÍš®`=«‰=Ãf?³—W T$W4™ÛÇâ³Ä© m¥ Õä†:+ÝAvÓÓ‹æ4÷Tù˜w«”)ωÆ&Ï×_6³’s‡V[ÍKÀ5³-HÞ¼-¨¼Ü] Ò¿½ZdÁ¥kõÆîÆÝŠTSÕ7+À‚Pˆ“@t»°c.^S^aDÅ•ŒÊ”!±¿ðϦmÈò(º%*îª\ÄDVȨM䥕ƒºsÅȉUõMbŠù6ícj¥Þ§¦a$¦:t¨ä<Ä_an †^CT£¹—Á”Í7óÜZÞ †¯p9c˜  /µÑâDv­XæcîÒüv©HÐÚn›Ê»ðîTÈQµ>d¡Lb¤êZ 0VãâÿÜ›,îïÖ>6X§0Ÿ£òKŠ «òÃr̽BGá¬Øf„/S̉å^òR²k;"?^³R4M”Dý£Üæü»ýùæ…¯K¼¨Ÿ¨Ç¶Wúçtç[ðèe;÷'(Ï‘n­¿õ[¬¾2–æÓm±±[™pv d­Èþ†7ç÷4_ÔHÝ=õ=Åô Ö~û^Ú€þ.õÿ³?+…oŸ {—@ù;ó ôGüÿ˜üYHñ¨àÿ{èÿ¯ô,à—ðnór½»¬Þ¿Ø÷ÏjÙÚN¬2 ×êöCñÞ¢>õk.³4~)3ʘö>GäÛKmy&´é´›²C1þÏ Lõ\§?‰QAI·ÃéöêM?ÒX:b5T¥Œæ·Hž§³»§Õ1ŠQn4Ý‘ùöØá µ5iÉðvňj¨.Ø/)¼(ø˜Í¶¼ñ½YøŸ÷ií×u¹«ÚYá®ä«Jk AË`…JTÝ®­Sq¹&îYE„ æ&n¦äýíÛ·¯_¿øñÇŸE¹®ßÅç0ÀôhGÙ1‘[h‡ ÷\ÇqA"ùj¥ðJL¢Cí»ú?¦ÎHY8ì6p‡õ_×)"ûÛßì?í‡~øøøò|>½šúIÞtŒAfªr~žã8ŽîøËÇ32¦I<ž¾ë‘£ÌÜZ<žÞ*<Íà"g?ÿÈygó/p3ÛìÄ Ò¤lÛ5†ŠŒk¨hï‡oÕgGWµ¿þÇ>ŸÎï†éqdBÔDÁmæC'K}î¨},¤ ¨+ËLÜ›™T2K°Óf²z÷¶ï©žˆ”þë—ù‹Vq‚¦™â`öÁ@Ö2! %ØÑLÊz4„ªæþMÉãÎýÉþ÷Þš¨¶x­\áé/šóÚ9CÈ®êªGh=ÅJfÖ)J¤Œ'}'J½·µî_ày<ÂHYõòhæãlW¿“˜©2”.{eˆ€ ¡ qo*z]çÐÖ½Ž×U1£ùŠ2Ú´d7¯Lð“Nc%˜q)ЈøèNhµæ±f0?žw¢áœ1Îóì½_ãôš™ž&wÅíÄÈùâef"Çñøøø"&?}ýf¦—Œ .“3wýíüŒ6f õ‡¤b"ÒgpóaXkÍHMÄ)NŒ†Ð]¼î•ÄÍkØ`™zs£°ØU dø­O‚k”ª¦dªkêBÕ¾1°ÌÍJ†my‰äÙ2GSuLÇ“át­Ï«ÐŠaÐ7Ý+L–ÃR20™4ü+VK3B˜ùTºª}h¬$Nˆ‰3;H½Ÿ‰U Yð⃂Xн—E‡ª -Ý[øŸæ&Ü`æ8+5]Ë\ ǼnÎHãÝÐ"©çàÓ#ÎØ¼ŸÙ& Xf9ÉäÇÔK}NF1¥é:‡ÞëèW*i>cï: õ¾¯^ñŠï½¬Úç±Ö´[Õe1f½!TÕ™O¨ýá/Z{­õ©×^»i+ï1;ë”­ Y(qǦm´ë9GÎ±å³ØÅnxÁ'4”u]þòÁ§úQ‘PÐÝ ú îÙ,¢.ýg'S¾«á½Öbf1•ÑåKaeuöㆫOÿÌî^ÿvíÅv |ŸùÓÝÕúÎ/nïÕÿ Eæ…ÏQ8·í¥Ýb53ø¯lØÿÇÿ´ýÿ÷|#¾÷k î;…x™šÜÜÙõ‚)¨úïÎY¶ÙÞwž63YŠð±%{Ï ™•gHû¿ï_,±û»gaNJ‰Z}¦£ÞW­¼ÿo!à°Þóäq¦ãÎÏî¾Rm"ºò‚ÁÞEs ³#oãÑšg¹šÅ ™Ü 4½-¼Bá±;Ëà3È5¹¹ÈÍŸ—:©Ÿiƒ–H¾þk=@áó”; mÇŠ:}³â¤ú¿¥ ð²Þ¼NÿÁDä\ž,ŽÞým¨…·×5ê³­ç™9VUš Ä`ò²…„úùùùõëWWo¿~ýêü¤ …#~Š­’÷Žb¿VÙxÚQûáû<—PÓWž±ñ|.;¢'T~ˆ0“ûè[ënZ1Õë<Çuë ÙKe&ÃûT®{ïÞ%+"¬È=Çu~~jp3ÝØæ8ÁC”‘‚|"®ñ ëÑŽÎÖØ˜fé(¥×ÌEs7ÚŸççñ|Öc›SŽDäüüɬ©—£™qkÍÓ"cB™UÁÜ·Kf™¤+e:DÉ\óÃÂyžÞ ;ç(<³Þ=KwÎò˜„Ü_'†RÕDý4n¢â*Dzøe¹Îgó 0]96{/}]ÐyÚPº® ‚Êaô"æÙNÂ9w1ÿùRÛl§p‡iÌ-|a Ö$¶ä5–×bfIêQª¿·&@s°•ü‡™/}Fê,®)ParTÍ[µO êÅJ×rXÜæbFP·¹ÎnO_Ÿ#NVB?Zo‘ž×es¹tŠ+“—axôœ 2<@Ì€¢,bÜp*ên‚»Îk^- ë\ñ `ÇÆ™Œ™¡ñ1t€TAb3Q•1ÌðøˆÖ.Âçuªj?ŽnÜŽvÈç5TÅú†YUÒìs:ð¹q×f$Dû(ÅZk×A¦Â}Ýè½G#4€|¹›S·L·uµºŸ¼¸¨˜ØÅÉæåÍӞΠ3Õcb>€â¿£²P¸pe«iˆa*š òØ9=s€Ò/ä: š¸ŒÔ¦Ê²ªt+I´YØ\ôŸÏeêÙªSŒG2¥cƒH¤óYÌtLJe®¸÷PS–{ÆÓu$'ÓÑÖ$Ij³Ô{X‰«¨XFo¥¨?êp##ï¡lú¢h&ù¶ØÒ)«™º¼h)ÅâÌâ¤iŒ¿(^ŠÃe-¡‚0.°Æ¹ž3cÌ)PkØöûaÑ÷¹?/ þ­ÁÕ‹æNR×q9dA O@˜-a‰T¹åMÒVtœNçÉ’øRýW«Vœ9‰Ï€Œ!iu¸Idè=Yz«:ÀŒ–7Ól¶è/@QÉÕ#b‘vÁÜ“S^yìÐt߯{ÏE94}FL;“g™ôãÏEVZ ªÂ:?¸‰ûûÉqªôØt»‹1µ.¸|ì)ÀÓÊ[Ì•V¥ðš*bìÿOv›@X-pÐ;Š>hXY5fç©Ú>ù uB£ß#â ¸D«èx)‰.'¢»¦”Y„eÈ^/[™‹µg‚Œï¤Ú‰ÆÙÿ j™¯“sLÌ(/]¨¿¥×a Á›ÚŸ7²l륽¢Âü¬ó¬ûî…ë«Ñ{o_¶ãå×Ö¥kæÐƶ:ŠÔ*PaD¶&Ó´Çx¢y5VîA ¡³úª£ÛÖkü¥¨¢”þ©ÊC]uJ'íÝ×~˜„ÃáìXÿAn6 ˜Ö3SÑl'÷J¬ ×°ÁE”‰Bôšâlå°Mäq»­ß·ñ÷“ïA{Uÿ}ë‡U!€BOÝä.È­ª•M*³ív¹ˆ©xo¤EÍKàº(À½{Ъœn~^j½Ê)„KQ¨v¯Ná½àré·e|ío JàóšҾKw ÚÜ1ƾ"p„a» õK~¡<ËyàX*"†æÖ„dKÉÃ!×Öª¹o²ãöÛ=ëUê݆'¥‘™ m䵇ê}s1…þyòË|ë6|z±w2íš¹üÙ"¸ýîñûÄýÿwNì-¢çµS¿"zðök–áß5æ¿É ¿þñ× êäbÿ5°—è ’Sz;¥í/ÎÜšäWp=2òXW­–`QN‡?ÆeâôÑ<ž€™rªcÆãN–a…ùwZ›æ4¹VY±úW25¬«ì$Æ>Ai“±·ŸùRÇ´v¥«¨}eòdß¿ˆw¿?ªëß~þVø$ßÙEÛÞçX¿ðL@ÔÜ:]œÚõð뿯ñÁs{D©NгVzïrq™¸q£ÂÃÉœA¾½®Ú׸¢3»34àík’¿¨þK??¿Ý~‡•›[3f2úòñÁÌ?|ùrÇçççÿ÷}ýú“wööÞ§Ï*¸µ~øñq<ÂCÄ9~ÈQDz¨õÞghÉGø€|xPññÓ§à]|òð¯ñL]ÚóËðÛùÉÁÇ/þ†.ßjLÝû‰1®¹±S%µáûøéPPsb:Ðb’af¢¸ÑûR”j‘ƒ¿úºÏc*ÿ'ÿœoYæEKâ%  9g$#¯‹¨ð}y&<Êupù±Mûª*É<3X ^‚úè‡_À¢r]׉ÓßÁÇãñ|<ý¡ú¨†™¯ë"ÛÁ«Âl§®nï4%MÃX`R^¡Òù6HJ`pã!zé˜ÜWS‚µ~ y #Rõ+YƒäO41éjBhZçhe#"ë­ÁܼúºÆu ›1l4>D˜‰0ÿ‘˜ãlu5EôÑIs¹!½dŒ¿‰Z;:,WB>Ãð Ý+\ ¹x®òæY n,CÔ™¨Ì:wËÒ‡µ1~—Þ{ëGçî+GïÝ©E¦ð‰73·ÆCºš¸‚Ça¤bÖ„ÒòàÈV™rü“i±É§—8\QTæiJf pèk8{)£89µ×x,—:ö·jn˜ž˜ ÅŽnÞ¦iã/·† ^€%c£”VϦ djió)ðG%MZu%Ì6I­Âë—ʰɘ(–wŸ¡Ù"UäV*¦à±“[ý§)¥„YY©iWk'Ö¤Ìf°—ÏDÆ\3ÂþþƒŠåçûcìE¦[ôðu€Tz}oq–ü—[Žw^C|ÙÀƒþOš«ßr'½á)X5…WW*nLjØtå.=ÿ±û‰JÝÉë!¤Ö'/ QÊž+©íQ´¬¢¨s:,§Ð÷d«ž¬õbbãtÐV2ŠlBô6K'C:”á®4,†Õ-MK,vBÕ\ÜVH¶x½é¬Úçʦ¢u]dS°­0IbÉToÐØ}~êÔ¹Œx-h»¾J/u,:åçݱ¾°‘Uª¥{Kî‰QîW[Lt’Ívtp®šÁ|äÄ0Çóó¹>Ö“‰¸¦°h½Ð~5*üU%¢ÖÛŒ‡ÆbLÁÇWÕUka G&2²Ç ‘xbnž6#c5Ñ™•…˼dYÝ óóËX•Ós7ûU õTí£e™1,9y¦öŒ4t&&ÒX­SÎ{à¦þÛÆ^¦Ú/RnCsf—5›9IPÜæð’@Y ªí3PøõóúÆfФ}Ä^u·¢ê{ñ­NòÜdÍÜJ0^<ç¶]ys–;m„3`_hÍê¢Uø¶[ê§U¶Žý«ÕS‰ÌØGR–ÿ[o1¶‘LÝc`¿³ÜäŽs²(ø[ÑÜ þœÏ[Wâj»­pº"^nö3’ê?]ýßK_ÞÉëøžä†ÛTã7ôÿIºùoÿ˜ÿøý€¿ó‹í»¯Ö+¥f6÷ÔßQ8ü½ ‚´êSF~J /eŨ³Þ5!ð£Mn&±êzˆlw!§ñk˜B<3–% 5¥ZæT-ÿË«²t|šQƒ|°<‡óVœ¿ûP5dcù 7ÏßÍXš$(Ù´ÿÏã5W̼¥p$iƒ÷¬aQ•\‹× t_ýoŸ¡œG¼ Ð ÈþÌ@çOgû®C<7P;‘¬V<[3$v¥é×s±tòÍe¤ã;-óNrÿx~Go­aŒë³pðSrM šî-ÎáÙ Pöß+{®³>uð§Ù}k£Z¼Üß{>Ž!JD÷w)ÿ}ÙÕy;Oz7o:ª-<#Î ÞÃUÍŒ£ä¬ØLI3²¾Z@'lNºEZ²U?W‹|ר„vðÈv7)yªr1$©¼é–¿~îËK³9lÅ*Âc5¯Æ§«-÷RâÅ; ­ªÏ•žëSgnÅ:—:@’JôÙ6up#üS/ð™ì\ѽ9ç@"m†V e¤2!Ÿ €LËs?‰p0«Èd–ŽE vI–7ÿB]Òç$ Ô’Š6Swè@MlÆ¹âÆ‰›'@Ö(\Ú²iÑoé¯ÞÌê´’ÅÀ¬‚7‚GgÕ2-VÕ[­ ÷R­“œµ ½Ô Ä.ÛVRYç<Íf8f2ü ¹*¶…T¸§°n@Üj·¿§ÝÕ…¢VdÔ&½SxÄFîm¹ÕáæžõÏ‹˜õ‘K“)Ù ­x NcfùÙŸzT}‚Z?©’ĵ«fyÿ‰jÕöÔÕÌ²à•€¿ʶq‹Ù¯Iu­Î5"tS¼•Þû\­¾R{‹ò÷ö=bú§þ¿–6¿»DíWJÇÕZü+dò7³‚¿³ƒø”âsýïÿYöÿýÍϨƧòYYöÆ<{QÛ7½½í¨e<ï-ÿkÍy[(”ßè=œ% ¸_̾›*fhróxÿ]ø"2Ê(ãåƒ9³Íp¯3öeGœq²—»`’73²éèã¹Ç)lËž¨&D±‡EºNúl¶?1PáùpYV½Ï`/º ãmóଽ/†*ÛˆLÕàCV†[1UÍ àÝ¿'ókÇqÔþÒ½ŸþosÛ-„¦Êœ© ´ãxݦÂeŽ hÅ“§#ã8"ºÆuëfŸwлÔ)ð>®HNã|kÓ„nš?7æD ºïÃLj­ý1ÆuõÖ¹d|Pá¹H×Ð]¸÷†WšlŸãßþò—óýë_]Ÿúüü´² Nçþu]ß¾}ËÎÛœ`ø£ÍÍW$ìÞï¶Ñ";«tÅ´qkÜxi°ÿÎÖß.þDäW€+&›¦zå,Î:(PdsW¤ÿYÄÈÛq9÷^{ÕsìEV±s¾›Þàƒ™ëº8æ"9õÉ+Ðí<·V½š´H2U6ûŸ?ÏÏ¿üåßÈ»‚UÂè8PÊç1ã¼zïýqxQðãñðDÉ:‡åE(Y¨6 ?æ¨Í/ðFËyóÌ=yNÂW…?`ªˆŽP›|x+n°—0ƒÍLTÙr=7›ªóó󗚩ˆZohQž²Œç‡ˆ¼CLU†À°17³+[…†¯ÓæêÆ|óÍä^ Þ¦¡œ†è„?€2žTh‚Ô̲Hvu£5†‘w-œãê܈!×P¡vt%´ÖÈìh>¤bpkÞ¬ð8&24P“y¬P†4Vñ¸™M#®ø|…}¨ÍÑoI`5a#ñè¬*õ™°ö÷_„ ¯[ð-¼¸MZ®‘Ž¡"ª‚Ÿ\‰SÔ"óû#üB³ÚdsW©'Ì~3€ž½#ýúõ™IÎ(CH{J6ÄD†‘qk ö¨€`Jæ•ͦfŠF´Æ}t‘ÁÄ5ÌåÔ“A¨µÞ˜wQ=]­÷Öǧº¸š+îç54%AUˆâãùño?þ@f§È,òµ¦2<˜?{8f¿sŽÎ`r †_'½Œ>«QOéØ!, þ^g8jËc†u.åÄL%[ub2ýg¨Ç·îý®Æ*Vù :Û?·Ý¢÷wëVòqDpŒ¡Ž#Qï'ˆ†o©UÍÄ|êxDìE€H“óL_†ŠÚ°‰d”\j#ÎB²¼#Kð%s'•’’:F¸Yrpó¤òiN IDAT¢¥oSŸBÖ38¤xn ›†]_S–d›Õ~ÛÒ£÷ãœ%D—Ú¼yíKà!ýtÄhÄI A-F7@eƒÄâC—Ýï (U«J¨7±µfN}ÈßÖ¶2úUÚ1©L/5<àÞû<B×õbÿæC&Ï:„ X±"“—B<Ë+±kó³S:S"¦^$š¸ÙG!†ªj-í釩þ¨íg¢hڜǞ¥ÎP &ç^äk+9ðr`Eb\Ö½ÚÞÉì­Û_ë]¿^£5ÆZCUùò9t‘¶–jǼ«“ÓEkÙý€{ø‹šþ½´ù6Ç£Mæ‹(êñ¬˜óÈmj\³@#?ÛÑY:±Ts²íWÜW $‹ù2ê ëULbjXZÊ'&á>KÚ[T$,žÂ#?#[Ð[ÖÔb¶¯4ÙËÅp‹=iYž—ôzk7,FkÒ>dÀªÛ®°ŒH bEã$‡tÚú°Ðˆk‹Jª}†3˜àµy‹¼ÆabfGzଜ×L#!¢°6“«Eš @/zÉ'nožéçüpF”\©_·ƒÒ¨<7Ì2eúL,QÉø˜÷fÄTúÃ)%;´•m`Ÿ¤ÌçTÓ ³k¹ºDN¢ö"ãU8-sùOèB^ÂI¢×´GTÂÇ1ªÆ–ðeÊ>šU0¼$!$³«ÆïÌj#nÇ2‡ØÌ%¼Œ,¶»§áÖŸxŸÒ•ò^T|Óþ=ÓxéWôõ$H[Ë:Ê¡“»ª›oƒ¾Ž„ß,’UA«bzÆ9wêþ¥lrck¶Ì‹¬$æªúŸÚbq½a îÖãºì¿ÔŒÞzÛ_f ˜¶7½ÇúP/e{'¿òÛp hâ ôßh{ÑþÁå´Û(ýý«ú³úÚ/(¦¿Ø+ü¶ ùW‰ñŒáwƒ[ý= ºýÜãÏVýñ;¾wwl¼—ò¿û ¶)Þõ_¿àÅ:þVß¿ç ^A”àZr {;Ù@¸ø—áåñ#íÿD¥ò'ƒ~Yôû"P¿„%Ýî4ϲaåøÖ½"|ÜHu¶…+jíõKÉÂ>º,{Ü’ å¯sÌl .“.£ Ï}àƒÎš -V*åÒÃæ¨1Ð/ŽùŠóå͇ÛÞEþøáÍÀµ×뺇¢f=N/éNÏ@ÊùøT亮”koÞ1×Óý>ÝZyýß?ŸÏyk2ÑõßZ2\q@ýk±Žçf¥6¯Oÿ¢ˆˆ:VþüüLjPñàOûCÈÊz]çyžÌí8ޏWÏQ€1ÐÚðM¢ÃjÜ·ÎÌ2†Dæ@>&ÿÇu7*r 1øCiŽò‰ýxc¸t mÍTiŒk qÛ‡׸Çãñôw‡™)¦8®ƒð|>¾||ù¿þ'M?ŽhÄ8ò]ààø;i>üÓ9£›q£K•§[Ó²YÑË»¦í§$6>??]÷/-ÒøÈoÉ7½"ƒ®ëšÀ•Ú§æ¶ÏÏOor×¥¦"ê¡7øŸ"þ]Sßô Yëóâ Ì Å²ê§h8_¹¡L³IÞÄI4jXñËiûN_ JœËhš\4 ^¬¿”¡2óÌ=œz1£qC¦žºtÑ8PãêÒûqd‘e=T Цðrõná93‹ˆyùÄÜÌæŽÒ[˜‰ZÃL"Â8àóŒùêqc2’·öN JeÈà‰3Q ÷Fj`˜˜ªvBgÇñÕˆHŒ¹³WBÒóèÜøó<§nÌhÜ|aÌP¨¡ Œqžlôü¡£±™÷Æb$ ˆh‡z¬q›¹÷©±×«KÁGëQÿâÉ–ÐðjX5֡ʪtt¦0«‰‰ ‘kŒ£uó 1%AoÜ@ÆCÔF9Cì>wÆI-ƒ?ë’¯ßN#û÷û¿&F›99W©užß‰´ÆðDÅ.ã6¥G‘ËŒ”0¸¡9$oçÙ˜ŸÏ‡(3js½µÞL½«Ï~m1ãÆÆÌݺÓLMLT¸5Uýá/Ïçóãë·¯"rôvQñ—Pç´PMµ)ÁC<ß4¡e4tˆ Iº«#Æg@s¼. ”µ¡…^OSéÈóG€×5L³ü±ö¦)ÝɈE…§VŒÒƒŸÄTN™áåß)[p*ŒF÷°7° ó0ÈêJŠa¾ƒÎš"]J[ÙÞGHЧ|ŸTÐ S`$ 2W†uÚvK¨m…Áj¶a© Ó{»ï«æB½J…ŒÀ³ydJÆZ y÷NOé­6”(S¨JDÕýmµpkÖ½ïÇoâøß%—©ôÄÖû™hg×ÕÓ0©>Åœ)®ãX«}ÜVkC1RÕÆÕ¼´„ Ö±ÍÒJ¼ ÕÑv*•°¸Ì×w^jJ (T÷!C3e ®8ãQešŸÃütd‹£sC`¤¦OEuM^…yuPe/Wõ¹œ0ç>^ó8³BE4_Õ—ÉOa=ÞÛ²ìgÈÓ¿SÍGßKH¬½P^+³á}þ€–Ú»¬¬öÄ^kYó- %—뇽óÇâ“ÇGzAQ}a7x·-USSwŸÃÅÙ°‚dŠ¡`¬b ´ª9#ÒÍØŽ*Ó¼Nbî¸ PÔ™¸œ½Uén'¯ZñrG0å Á³Dñ” v/3@æX*2­ö£V™%øœ¥—¾ø‰ë*`Ë’2™\/^xF¬®xžý¢èZer°ù!‹ÜTU'VœK\ˆ™²5z/-­<ƒ©ëέžU4Ó˜ƒ§4ÑO3(Ó41‘2ƒòµÚ úðÊ¡ùvJ"(à•i©˜b¥öçÝÅ÷È:‹|ç^U=–ekéS)ÇìõÑ…®å…h~ûfyÉr65Ô*y‚Zû€*’Û²yn3 ô›Ï³fÅŠ%;™ŒÌÄØ¹Å ÀÊ £ô—º?1hKÛê7¯¬Rí9‚»Nø5sЭ´M5C—åãe¥µmi»¯ÀEëØFû›úoñ8·Žúc’¶šEñ÷õóVÉk7¿ü®P—åáÑé˜åme,Áb´ÛC){tÌf ˜•iµ¬ÜúVÔfJ~áËQ¤í{Bn¥3nëaíx¿‹ŸØ”ÿÁÀ]ì¿¿Ÿ¸óÞv‰ë³´ãg´ï×Þ¯ìIûüÕ®øêeø»ŠñÇðö[’ö/fÿÿMÂÿÏ]ßÿÐn ûűÀw¿»F2r»t}¼|,‡çuìW™gûÖ™¬Þ‰VƒºÏ‚yë ˜Š%›o¿ŽóÇ&Éî Z»減¥Ì_³VsFmà$ú”A”Üël“³wàÍ+öJ¹õ™äÒ{Bçy~~~p­Ȥ¦|ýúÕ/7&LþުΧúï¿.oüU»÷/yôîpv\¢c ¿·µÞ»ïØ=ãá§Á˜*8cy`ˆ˜IïnQïÀ‡Œáž:ùüü<¯SUÇãù|>ŽãxŸçIh¹gñ—;×ó/Q:=d9Ôcfë¬ç§ˆ>ŸMW*rÅD†š‘ÎgÔ¸õ#Š—uiþÈ= 2ÆpÛßëTÿ™YÊ[_ wªêo–_i9úÛOóWæ¿þû¿´Ö›—/ÌkWÍÐ[<½w¹üv™qù,Á&ˆÒ¼¯û¹´îPý…s½ÃyâkÄU6’á0U‘q€T%¶¶¼Ì!.¯‚Ô¬u>èÁ­]×õíó›’ýøñÁ`# S’zÛ¤TÚq¨ŠÁLM ìµg e“óz4#ëÑ‹¦ùžøÌÍ×¶Æ Œ‰ë%n²Wccà8½Ù5>‡Èå@‰2³/×<õ "ªÂ¨R#5Ã>Ç'}<¿ˆ "÷Ü£µnskJž$ËÍ3˜[oHˆ $D$rçmrÖ‡²1®KÆÁÝŸâtîFd*× na •Þ˜q˜ @LH¸õyù¹A݆lÄL ž§Ø>/uæ9x11š°63~<@¬r©sÙ[WQôÃÈzgOM%¤,ãs±j̦¤P#  ÆÉðÑzkí§o_Ïëê­OæÆ"¤Ãœ–Î #4÷ÇàÊÏ•—|Dñ¦¹\Žá×¾©Hw{>Zk“ð5ó ÄÜÄ„TÀ0QO‡©){d µçÑMèëן¾žŸbÆÊÌh­9íßGU€’L“€’øjé«´KîÿOud’p¹Xn 6û§m›MuŽ3Ó 0ãØ«röL“bœ«í½3ÕŒ…FuG¤‰œY–dämÁ10Ä‚P/åÍ(ë‰iŽ‚BÔ¦Õž=öLl¨›—t®c ’Ö%§¹rËgfÀÖÊíÓŠbVÛ#ºpû<ü-Û­U9l;Y!'²µ7s"\F%ñ <³Ê•…»©ÄÅ~Rñ<±/6L ÏJ‰°´[i¿lA`/§ñ¨PžïkÁà-›R‘7‚ø¬³ˆ™ˆ‘±ÀþÌäbÞE³Î+5±ª§«7‰ÕÓNœ­Eé`±Rk˜ûF]½‰ŸR‘­zIìp€„já¼äåQ/*~ß3³‘w*XÉß|æ–Ä,§õ`z,=N´¡½ ¹[¹u+;!ƒªÌ67™¹Aß„€*9mèÍï4$¸)JÈ+š',;^èÍB‹ºí[Àq…TʉñÖnµ¬â¸Sþ˯Æ,XŽ±Ùæ&£[Þz $-®›$ãøŠ£ˆ´f<Ý´‰³$ýÌàH¾™õ¢»U]¨wárjÉ«ã&î ²fâUÊ,ì)/ m[N®iªo-œÕª\½#]¶m¹>mϵ×u† øjÛß"ÍÍÓ>%÷èä.>¨Jþq W€QvŒûOP«ZRò(jq}¸óö©aIÿÄÎ_)ÅOsý{†HÚjl˜ú¶¸asÅ©]Œm"{dà¶ óÜ8C‰0hÙÍ«áCZÞmÜ…ê8ík䣤-¤Æu*¤¸_ܤåwœM¿ûI¡^Bº~µ“:àPa ¦1Å<;v9Q[G³(„«vRÍq!#ÕlûÝ>Añéäµ-%¼M ¯âz¡½9ÄîÃ<ºãÌ(eU]&åˆ+ÞlOãÿíSfV»Á䯿Þ> ¯÷§¹zèq›%äxe­¢‘\Ê첈œÞ‚ågË‚M׿¦âÖ6©¨ÿw»é[ë=ð³U¦okÛ{bTBëÞcK®ÖW­q|'˱÷ÞG12¶Mˆý%æ;‚ï7™à¿#ôþòãmuô[J„íw=÷ßùÒ‚Þ×ý :þ?Èþ|GYÅ/f=öeû³€û7@ΆµyË|;Óºâñúé2«X[?ö–1³ß Ü O‘ ­u\ˆöîG˜­½¸Ç´Y`Y¿(ز“êPwâœ^¸Ößê“™el³sLÁmno˜\“s¾.¬L2ÜàÇÝ;oDì¿ÒÌ©¯Å9rX;?­r\6Š/Í|–yÝ'´Êì`oï';Š*íöëcøÙpÜ:H#vVþž×üÀ;&åÑ;5&¢ªãº…q«®¥=ûÜ{<32SÇqôÞ†C…„Ó¸UWOV¾5­p€ªš=?¾Ñß®ŸÎó‘ã8\‚wµËÔû{ù{]K{”#,óqî.7S‘aÖˆìy6Ì`¸©÷Ïëj €{ƒ0‹h$2ØýÞsã6T4ð<~„€§üÓàÌ@!f4tú[•ÔD¹7€žGí3>DRCSŒ–èU!5 WHÈpô£ÍHˆ|G­ŽÉ>¦ñZKÅHT¡Ê€r33—*Õ `•k8‚ÀŒÇñP±1„˜`˜­õY°!jÄBÔ˜æÅFkŽ pëÜÕäTUS¦FDC„ÜxZÄÀJÄtÕ²6„}›ûáã”g{^×uŽk6ÅéìTpE@ Ú’ŸnDdN=œ¶<±W`æfì4³Þ˜ÁŸçç5®!_¼®ÜŒÉÆy5õ¦q‚rë`5³0XHU”'»m^ZÆ õ{3Óƒ!f"òñøè½«:uVeá'¿ÆO§kÂÖ¹iú‡µÆçãÙúÿ¹{Û5YŽ#9ÓÍ=²ú”øhïÿ¥‘vHtWf¸ïÿ¬:’š…$Ž†è®®ÊÊs³×Ô>¯çõ9;VFIa6bº¦™1¿±Œ‰U™µZ*”1Åc‹ó‘êÙè"Wä +¤ÏjšDæš¶`Ù†Ò¥ IÈ=R\¥\‡õ[kKèõÈ`_êÕ>ç IC r…ÁË5@ÀHƒ~hV¨P¡ø“Jã—z}¢^¾¼ŒQ‡Ù äÚOÔåÖ®®]%Ù£+.g¨z%aj‚I|°5 ©Lc¡–ÌGD¾ó?ºÄMÞ੆T½ˆ\QLÛóæ(cl`ÇKÒJ§ÕrLc¡¦šUõSh° oc' §9Í„¡wO êuX̉hƒ  [›· ±jïϯ’ê3‰ÍƒÒÖ‡$ÓøíŽû(»a’J¸t®Go ¢V÷Ðö-ÕÁI½ò*z©¡ ¹Ô¦ò9‡r/IF$´‘ÿ ¢èB÷7Dn2ýV€î÷þ+ÐÞ `æ¾ô›ˆ0³T¥ö8UUÿNKr(f¨qQ°˜Ù?ŽS,AUÒ9-f?$"^ k ˜Æìñ8†È5õüú2óó„Ç´©ªvÑ1†“}1žçy©Š°çÅ90<ç|×¼hêÅÌqýꉓØßƒWòB¯) |÷RëoLJ¤T' ’A`Åtþ„‡GË J6½Ú ‡ØJ‚D˜™}b öÎß,–p@1Ø;tÉ©ákcï475f&öY‹QÃb+û @wÖo JÏI ¶tݪ‡`Ë,ˆÝÚ›ÚFw©•ÈC8Ó+Ößëlrþ~–±h‰?d ¹“æˆCqiu'nÔÆ¼y6¿T3æÜž2l“þP+°ÀÑjIpDU†"j¥&…Ü|‡gi§W÷zKÄú,_då¸6‹q‘÷µØ÷¥"ÖRÙ81TX‰™S°|ŒQ¸?Ê|FÇЇÇÓÈ’>­ñÓR«Ë8Ÿ8¯ñö}æj æUr™\uK#;‚Ã:SMÉe Üw%›œi}ïPîƒxß»f½ê“mu@S‘èW³eËd´™·G¥þc«9HµV‹øßù<¨Râ|Ä/¸GŒÙ˜¸!öv+—¯¯«Lß6KýÝ LSÈš‰Î Ý“uyd™G÷ã÷õé^>±Ë̯ê?ZU‡ÝLëý?Ѭþ„}üBÆÀ®ÁÑ 7Ã-ÉoWÚ¯ÆÌ~s©Íbæô‡¸iá×70›Ôg¬Uí& ãæ¸_[i^ÃZk••¤ÝáÐ)=Ûw âägåØHÞ3Ýò~¨Ñ$§&V‚öÄz³s‡é«‘x'Yàá•l)72ŽNÿàεÆÀ ö·¤!ee9°ÝÞc_nË+¯qÕ* ®¿29ž½.j|X|W¸……$¨O“Íäh _¢‘½ÜÍT£âð®ôïÚKøˆ'¼æý4œkÓQÌ¢•ßÕPöQSzp×asH¼ªÖ9:­.9ú¬Q»j>Êà¥Ðë­ÿ¶€Êa§ ‘qu;æÓŸ·w»F»p½ª¶^D!sªÝ¢TMóÀ[RJ;“Ûzg?ëߊœü½‚–¼Ü¯øõÿG#üP–Þ ÍøPC¿u¿¢²,?³¶[Iý©u¹Œ¢¦ˆŒ0­2™È6 ŠWU=ÖÐ+ÌIÕaP§½kžoeM¨Ä$¡û8nÕm„ô+vï;RfMŒí×`qk’º -¿£wô`·(Ö¼Öÿ(èûí©¯¸)û­/øCXÐo{•~BÓ¿áŸ?Áþÿoüÿ¼ßÝý/sm ž›¯#€BÛØKKõ$ôN{í9C[ÐcÇäWÝ.^ ZûÑKç’-¶þÞ[³Ð)_#¿â„æ÷,²4mŹ[vÃŒúþ* B–¸!ö‰= ë P~Bþ°lÏŠÐ{¬"¶äË<­ÖfŒ"Iý’ÐÊ¡å1÷„í]¾[ÏXq~‹9úk盽N~Ãͯ ²n 6!´| ®&Ã$2è¹Ú32LÖRØì8ŽŸ~ú Àçç§d£ií·Ÿ_O}||ÑO`>ä—ø‚‰cš ÐÖ¶ZÞðÁ·-#øÝ÷ýøùçoß¾yùêWÊÁà´o‡ãÞý§\£ŽzþˆÙù0çyú‹÷}Z‰¶­»˜ªÐõ§Ÿ~"¢ó<=IÐ|I¾¢3š„¼löºN÷*º+™L1FÎ'ºS/ B^È ÌódMo»Ç期ŸŸþž:{¬ù½êÙ½ü¨ˆÄ5åøs@f_õÎ9Çq8³”%bÔŽÑbŒ#˜ hÕ…¢ëJ›¿¥îú¯oÄ¿kÙ*¸žçù|~‰Èq<æup_åwä€)OUNÛ‘žç Û;ù¹š¿(Ì,u‘'5ÇÚ’^×ug¬ˆw7†·'Jª™¯ë¼rèw—’Ê5&’4¬ñ2Ouº-p0Ng‹0 ìa_çóëù<ŽãCX†‹ªø:O¿:œÕï·³´U@óšsÎÁ¼ôÅÇäÅ)6ç$˜" ´lÿ7o&VÕy)D¯€6©ê¤ÓWÐŒ!ÂfrÍ9õº®éÀ›CÆ1XÕ.=Ææ&¨iî”&‘žSÝ´«ªÁÚ6Sec‡<ÆA<ž2Ä<žOªŽä+‹o¦ÅtNÔµã©*$ƒa,ó<Gc.–ò`ñ}jŒÄâ[Q€BBçy^6½ŒÌ BÐZˆtM?Í„Á2†\×åV[¹Q IDAT-fœñ¤sŸ']ÿisªŠ«Æª¬!ò2soX`fRJl1®9¯9¯ G ©±ßÏëCXØF5€ Áu™0é4“®ó2µSu€YœÊ2hÎÔ°ÃY7çT2“ŒÆq  ™ã8†W0笜{æv|¯îUßÜ{Á»ø~„ãÇÍX FÊÂf¤d—+ÑX†öj|d†©Mµ™}· iBËæn™>¯M^ý˜¸YVWŒ—Ã|9ÿ­P¬í³s ¨•ñкf´t‡Ø'¡L¥ÔkFkQ”¿îDÔE× ý›Ñ<爤~WgÉZ‡ˆÜÇä÷ja"ñ´t9´+-ݪîë˜Vrmu÷K¶NŠ/„† Õõ¨±-ªo-¾óc±Ü@ð®j ’2ËkŒ'*.X÷6M5z»~Ö ±%[¨?j“ŸV×¥õ^ïíNbv»Öíô­hlÝdO„,l("˜neÄ][YÎòÕ@=Y×S¿7Øò’.É­[x7n³U‰tD‹ê1K+¯ÆÎ0ÊÒÊ9(ƒ/ Fuòß6—õ…Ô1Ç÷+6‰Í£˜wÝVwõÿΨïíCßѧlÇÜÛ¼YwÂWUõ{“¼?¤õZÎyŒ~òçÆüSäë?ƒl„'‚ÿ¿^À Cþÿ­óúåtz1t÷yÛÒ~±Æë÷ñ}òþv¨ðšU»Ý‰Úurë00O*ʵµG^Šmû|ʰ·ûbå@;0ùþX-pE³`o–^á‚I<ÝWqÈ4› ˆW¿doY„ð©Ä¥ÆÚ†Ö‚èq?Ž[ïvþ2¬“™x[ž¯Ýþcµ[vÝFãxs^a‹½é8~½þ«C£o?j[â«ü9§WÝ:d¿ÆÅÙ¤[âÝÃî »Sw~úö À}~~2x!ƒLyñç×ðsÎBôlÌw2ñº§õd0˜¿üü³Ûù£fVM§Çñx<úN¦ˆªˆOçôo²ÜýWöDCÀuQÖ—Œ.ž ¢óù$¢ÇLJw‡¡˜´¦™é4o'0§–"ï”óâÀˆ]`–Ç#{´ìLΕˆ©‚K®ëó|ú(â§o?Õ_9Ž×úÿã?þ'3ÿõ¯ÿÏuÍk^þÍìÛÇQA|j›\pÈÄÌHŸ%° f3"»ÔX¯™\T ŸÀT´Âå8.ý¨%sMÎçóùõüù/?|||Íëâ¤Wm§1'R\UÝÎäçgÉúa5u4D½C#2Í`:!‡C|H  o.»jÍuÖ c‘8Á²9­>ìG«…ÐΨ ~…-€šºä+¦ÇãoûÛœÓè–qŒkN±(Û`¤ÐÃÔì‡4¯º5㺮Ó18—öªþ·L D3QÔŽä0RWÔY¢íjS10Ƽæ××§©Éã8“y«lÏi cÆ8Žáñ–Á—Ò¼NS%5ÿnf®ä|Çá÷xJŽr’·…jô óiJB&ãð稪N ÁPlyó¹®Óßž? ¢êÍÔ¦›ðD@t°‘é‡CÇñ8~–_~ùä¼M3é Õ¬ï…Mƒ™ãÒ9ÏËø8F6g˜‚ÁR¯ã1†˜Ú5§ ”"~¥°æÖr !caD‘õø¼ÈžD4/¯jà1ħ* ñÀ=™ Øó<™ˆÎóó:ý$?Ñ1Æy²ª]óš¦ò8tºûlQ¤žsŸªFªÞ@ȽG*,"0ž:ÓeëM "Ó®ºwÂ}þâjS' X·µÄĵ-ƒΡ•@ÕÀšˆ™Õƒ›B¢¶K‚Ìè¹zÐ`^cãU­†VÜr^.·÷Þm¼ù·oüà·¹ÂZZ®Ü^Ÿo† o~€v€Ìj{º7ogŸWÈò=V¾ íšÃýLo Í0ª ¸­—¯ãT5“ÌëÝH)Ò‡§WÙ/Ð;Q}¯c‰b^+˜Ü©CŠâᦛ¯>ÓÎÞKè½Nò¼±n„k3ÏtÜuoÖš9ûm¦—QSŽáÁo•ôñRÖò¯¸ô†¯„ú&¤+Îf¦óš zã»T5³Lë‰èÅ¿®éùH€ˆÆ·B;ý¿þQµÂhá$Èq#e´w<‡Fs¦@|ãyžD4DÊàïõÅþGË>_òîyžîûèîþò ¨-dPázÜfåí9`PUó¥Þu]¾ôÏðõõ¢-›¹ª‹Yâ«é9Õ8þã5£W\%÷L5ìLÇãliqÕk^¾~½®K焘¿}|<>>Îç ·œ3³™}ùÉõþÏÿ:ßbfÃ,Çc¨–©3éÆiÀw‡ú4Ž!ŽuVõ§¼¢ý‰˜„ªo6¥36ã[ *tý+¦ Õ"±6ŸNLrËäùŠw¨– /™1K¾ ¸p’¼…E’3㲆ô±Rê™̃€K'“q˜Û½¨ªø¦z^×!¶öák¶x; Œc”ÔÔ¬¤h'Œc£LÍhª) ~|<ÉHÀ&‹üiªªpÛ,ý<‘ „Í9=̪5(æ ëMf†Á¦18DÄ,Ì“EÉTíâ&Êk^ÈAE 7Ä"CÜ%Ï !;£zM˜@:ÂÞ›‹ U¯}SR2RÌ„á}Ǿ/zêÉ<2ü€OFÆŒ9£ƒwª·VÐàAjîä7Ê™P,‚Y˜e ¨ ËÁ|^בdá—øfœ".!FÆdd—ŠÛ˜ ƒ>g–ˆø3{Œkš™’1˰Òäôkìxt­ÜXÄÔ„˜ l0¡ãAD—^SõÒËN…?\-Œ1>À¿®9Ï“ÆøÛ×çþíïFöí㩉™ ó5ã¢÷}·@ü™"€M› ñMc@ jf#.5Ò91ÕȆk‹ áìÀP_¶øm`ª™Ò!ì£SS‡…@§‘M³Ì¡Ðª[«x|â Œ^¦H[G8%§„u°7­u?W]PNß t£Óh°XRjUî¹;-ꉬX»%¬Wó;W 7ÌÓu»Þê܉ìäL¢vm´Âð»t«>Z*_…ªÕe[÷ó@.Ô>)iûØ)±~DÂmßœ\ ®UG!.ÕÚ žj[6¢I[~µ„ŸåpÍ´½LKÞ².iDÙì«ÇgqªyN¶}fjNÕ–Þº ˜×œ ÖBóº´-’T}a¯ç”›˜[šf-e«Á«¾Qw)Ç5âoÄkº£sȘª:¯6n ;­ú‚[Ó&Úª™Û¦|qæÕš•8ø5À1–™ªöY4åD5¯—ñßâu"ŸÓù á’;APÒªÑð«Ô?{^â7†RNlÌ3,E…Ç !CtwMå7˜ÑÚ0×·œuº¡ì…Z`•5È´Œ­)a«‹ÕfËèéUÞ;:jSÔþ[CÁ߈ÿx‘ªÀ”f§Hwï<%ZH+ 3L÷ŠÎ¨\#´ñîý¯—²]Á±²;å=ïTmäÖÛnßïè¸ËU„ÛêDZ™{xo¸[ð÷«¿Ïé…ê¼4ÜnØösemÁ­%Âlãq¡â¸"mD§n(i`BzЋØ)Ørº›çòqæq$²­$†0ÈÖïÍyÓ6­ý­oŒÓ枉ç­*cšßQ‹¶¶†»þäíܼÞG¼[ÕîdZmä·*Ù>ÍI~ÝÒ«L8¿ÿå-K¡»fýµt/œ&˜·±æ"ßæ÷­†"BB-ÉÕF·þhP¯EY7Ú¤Éu.Öóyõ'°8µYïtгdqðì5Zâiª°Ví~—¸p Í£¾ €¶MÐÐÆó›]Ío…Ãmvµ(ï¯`t?_ÒÕдYwaKnnÏœ>“hîÜ ²"FS»"é½Û¹wWÿûè¡bÔ·zž@¦¼3È]ýÿžE¸÷Æá;%-F¶ÆsÝG/Ï»ú_Šš©w9Ûš„D/½”k‰™Cç›ú¿¬²=‘Ð Ð:Êñ[¬ýÿl³ûMNùÍÓüŠoþ èøw{ðÿõê?þÔWÂ;¿r¦áí;Buï¸,ܺD¾2xñt=zŸ,PÏ ¬XìödȈº¹“Ý÷éѵLP‹ÿ3„ ¬®€Râtε¼¨?g¾-Of¤z¾J$ÕaPáU-¨qªúññQS"²©êý €ˆ Y#Ÿ8¼M:¤ª" {yqÙ`Í'é:i°¦ àíÞmJG]²hyVÊíÂýî 5 Çñ…­­ê¥šó_sû{N™¦dL<øCD~þöíëdŠ]Y8„YŒ3‚°&§`e‚N‹a‰B `òjÖ¢'±0)]¦nóp«‘7ÊhΩ–¬l#†é¥×¸Ì8ß ˆŸ¬çTSbà#bàc0DŒ ¤×EsjÁ#ÜƹNWS»L< zjfÓ0H Ókz¯ƒ1Žcª]:Í1X¦éyjÂÃó¼ÌˆâÂ+“49â¦ñf4ƾ/æ¼üí°x@Í|ÎÄÌ.ÇžDbæyfr›™À¥oÒy}êtñåa˜húµÌ©FLUÓžO «©^.'³RðàÃR|sÎçõõ|žŽYg²/„¿}}‚¤Ï¯'ûŸ¾æ¤ˆ@|;>æÐ¯ó¬ìc˜Ù×ÊÀæV¿¯‚¦MßüšÑ1Æ5¯ ە;&1Èâ$“Üj23gÕšÆEW·‹²¸,^6Jöqû‚bŠ3·ýNýv¹1RI€­X¸W‘æ¥yÎÔwqhxÊ®_êàéà67•’ÒfGu´‚´’êò/cqÞcÔ&²dÒyÐ(Dþ¶¼l^A´êRÚÊáþÑvßœ“ÔêWˆ\Dù3Ø~kõÌÉ€NMõƒm­¢ÖÔ¬6ßêB‘„²^:]È–8l«Ò]Z´Ýb=.D¬­JÓ iˆOêæê«9¿§£K{éPõ§Oç®p5¿·gÙå½/MB*6-àÚò±ú­•â”Þhx­$4DBoŽ ºmu®ÙDMN¤vU©©-¦-¯âD ÊV4Xø¹‚­U“çÏëëç£WÉSM„¢»)¥†Xªÿ%oüìVñ›QV5]GÏaß±¬Kì>ìMT´MJì¶Ôi¼þhS„i3]nTŸXÐñN²ÞA2}ÿøNƒHU=¯¿Âøåoµæ_ïžû ¯ý¢ ÝÁV¨¿rÃwùÌöÛÎí)I± ~kï†J"‘}Ï™YÉ[íèíǶÌz#jiüI^‘Žüš­ëa«#¥`Ú.ÕúÅEwé‚›4 e9•«Ïõ[—þŽêÿ[ u¥Ò—Ÿ+™’å*Íļ5®¡úßÚFÚ×§½É3Û¯Ó¢î}c¾¾gÄ%ÉxTêXaZ[¸_Ú%E¸ÆŒ¦j“2ƒm°P'í\®YaµMS#8UýuêþíIn/Êmõlgƒû¢ß•÷ßVh‰ˆ<å=WjŠQwÑ­{¹)wˆ¦` luÔëR ÉX5ÏR¬»Ûº^ãôcjåÍni`ÜFmœ¼ϬÈ/yÑî7zÏv.ÿm'¡ÕVnéÁù²7èZKDá{R‡—ïöÿ†W8«ÅV$âmŒÖ*Û@ië’»;*û§X‘—íªÝÐíÛÁéBºQ«l±2+@-]wõ[l¼)‘z1Åß$[8ÙX#»Qã^_¼d§}ˆsS÷­ÍS·[Û‹ReXäüiÚ³\»d…«¶e_ÂËëÿëM õo}±Û àOÒìíO~½™ýÿß3wÀŸñ‹ø~ àá‚ïþÖëu |÷Ïí„~»E)ïÑô*Ý_;–mðm˜©î}Ö~PܤäÙ7Ïzþjü&¯¼[‚Z®uÀÇŒaMWªôDªç+vu›Ce¤¼û«‡€áÑr€-š¨ïÀnÓˆ2*T ‚Ý<þTxV«yÉ"Åtrêóßõk³†Ùï'¸}\ÊEŠßêÿùë—ö¿"0V³B>´ªv×ÞÀTíü~n{Û«Ûçç<“뺦Îò°;'(@qÍ…H eV'Þœ39é…§¶þž©ñ“ˆ¦ñ|^×T=Æpr‘Ûÿos]…ÇãѧêñœÎ'½ª^×åJôO?ýäi§žCÜGKµ±ãq¸/ùÆn™©a øëÄÈÄIGÍ^õM_ º®yžgÂe)DƒØ{ ¼3µÉ†¹Nqœ…\Ì|aQ³y]  fÆPæ# jÝÈOjªfl®ëèæôM|-¹ÊïßÖ žFIŽÐµM2Ó©^ÚI/ xýÿḬ̈í¿CÇáMÎùNª ㌃ي“„ß óšUÞ'ë2î†Ø6s¹VX›n¬;ŽGÝÖE¤R¿µŸ÷ïÊK2V·6¼ÇuySæaù‰L„¯,f0Sšvž§xÈ‚ÈwmÚ=qMV†f¤Jâ± Õi3 lÕÛ˜Màóü¬»¦zÿ²©N'ÌÔùïÄ&¨Q¬%ÜÔ¼™Õ¤Ó¼1‚5e“9•„ÄÈÕaÓKYÐab4#\×d"dĪ:8¢SgØu~÷°—Ns2¾ßŒêT™? 2OS%ð8ðíÛ·çóü|~‘‰@DêLo2‚a IÖ!%#±CÄk uª Ѽ¼@|€O›¬q™j º ¡+Ü“eñÁ6•FV¾M› &情Ǡ©j ¥CD„uNÒ©¦ ˜ 0Íé)8S?qh`°L¥²O½ÔtN22žð‰†š×¾÷,¢è¾É '©;ßÃUï}z»Q5%âÕê2ü:‹˜ß*5Dغ\SžF4áÍ\%@ 1\ÞÚå±% ²åh´˜ådAÀ™¹%Öbðæó•„(¥ÜÂ.˜zÂòÍEÝ¿² Š/|ÞAɈXV OÊvÕ‰Ék;e­Œt%—‚ªôR °ìñd­?ªí%›¡¦&å &7hi‡%ýû|a¥lín±u§ŠåBˆmP 2h:*ÅÈ‚Îé£×¨“i¤Ú ;4ÐA4.ØòðR¡-wìAXh`ʆ>ÚàæT¦åýWŸÌù³˜ËåÏ-9=pæ,Á.•‚½>²)AäöU5¹…(.UI̽U*¦W\Ýá¹gnËÏ «[³‡•Ï_¾u##féä+?‹œ¡—;Ö`(m¾Âu†4ì®U ¦M•Öb ]æö•Ab÷Ý;J´ Õܵ‹p8Õ,èe·¿pªx³Éß ¼·Ý}¶HæÖØñÚAðùG;Û°½‡‚ Yo±êŠOtÕÖ6)u*,M}jt+¤]R_,`ˆZÓiË,–œeËØäž]KÚdÁ¸rï—û±ï¶~¢ªÚÔ^úŠí­@¶BñNâ¶yÁ–ÜjX¢ášlÙŠ}®Óƒ4¯ŸôJºmcÙ[fmê5áXð¨ö¥Ì¬Ë¶îó÷wÎÑp‚ BR`qO,1Щæ+)ÕMÇÛ ìgyµUl«Fj—·–1¢ªxI³Qγ piß‘¨‹a 3z{Dz‰¯³ƒó±ÕMÍKh®‚‚.90aÿ¯| œ—e¼NMU“ÏŸÃC3¿q‚…÷Ó yíP[õVžŠ ¡¾Úž­•¥[Í’­Ú-¨=™Wã¸×*löaÄ'4è4- K/¦.ÎÌBѵ«ùF2餠7™?Â}æ¸ò|7ÒñαY5¼/¢E=t‰¾RFTîŠ"¸2+­€rè}Ý–­rœõ2vï¦íØ"ÛúvÞ‰-ugËûÉ]Ý@¡þ[\;´êâø~/]‡áõÆùb<ßf®ëÅKã^힃¨<+½Uÿo£ZC/Œ±[mq²MíßÍÃ+°¹–ߌþ\¸ùú\Úð[^øWÇþ/õàÿÛ?.þ¡ó¿!HðƒiÐVáѱU·±þïk–ÀozÃo©y«Ã÷Ø´!–¯}ßB×poËÝ?X-Mø>ô(Ñ¿jèhUè¼[C—;‹lu‘Ø’ÔÁXÀ±`ð’õkËk„PJ³þw¯\ t ‡­×7Ư֩|F–oÒ똜LÛaö˜)×9·€½ûOÐk úäôuÔ‡½B埛‹ÎÇðõÙæ>3ÓØ Àîé6ˆîF˜ìγy]S ÇOǃ™u^¿üýïnŠŸ¡=3ÿôí‹–™TN™¶²ÜŽAU˜¯4€—ÊLD.ô3‹êÓgªúËççu]Žþ¯:¾Þ%àÓ"XÎîmÀþ1Çb•@ Ò;â€Z¶—ª0*Õ`s/6Â^ÂýœW}Î13™¡^/1sꜵð«ç÷qõ玃ǪjçTÓ뺎1 L€[ 3šà'´LšÓiÓL×.ßl 57±Ó$öl©©ùµÑ`Œ­Ã×ïKÓ!óçdœ?Ÿß.eê0‘»°5œòøöíÛñxtÇÇ1Æççgà š®v¿)ÊrŒyÍζêóÍ“°/lM•[†ca²–+Ä&Þ¾_ÂRð¨8W]ñÇò;8ϧ½0ø¢Ë5$¿ø%†N¸'#»ô¢çu]'ˆÙÈLÙ§9=Ï‹Eâšž~M¿?rØ£ÙA÷¡£M"2aMwq ·Ì˜Éü<6½.%2‘µã@ÂljfzàÿO˜1Ä‹Íìš“lîVRè5½Û<ÿkFµY–"ß JÓ9íÄ>&¼.–cª¦†1X BDF^RË2±©T„"ï IDATáÁBDS§ù|DmÎ!‚È+Ô(_„©ê„CåC‰®ógAž¦f*Ä>ƒa!V5Ât©×¥e¯ Ô7•ŒH˜WÊ*b`* ñÂ?f6fñzóó¢©Lçœ'ó0R#Òi ¨Îk:s_¯ ÂÇ·ãñx|Ÿçùô©Ì`vÈá;waa˜mÚœz]sÎIf__çäkÎKãZ§9çg#±êðÔI„1Ä7Ó~ rE±„ˆÌ#,ÃÎËa=“ˆr ¦j`cdy8ÏZ#9÷_ƒáØ |xEyœê¼T2Ñ$ƒ±¿Ãt;Ì™'n2)ùȧþCÛ”ÉÔ<0fÎ^™¶r~©/°³rŒ6Á`Ū……h]h«À¼Ÿ{ÍHh¶XØ‚P.`+un9ñ­Ââ[ªÔIŽÕ]UÓ–†¿ì¦ÕŽZB{-JEÖ}4l“¨2BÛ_ZÙXÍ’ò‚U Ž™_¬µÖg<5ðÑ¢G€à}-ê×22£F5™‚ßê£áÖ¨BQYŠ`:}$¨åÔ–c¤Kµ°Ý±æÎzƒZ¿s|Ù»KY¥‹•ù°[vh³6n¿µ ¼.¯Kýî>¬¡µ¶È&çøÎ6ý[.Zïw€HÛЮý­Û¥·Ð‚yv½òî±ÿp×@_Áľg]|ÔéÕ\]Õ®²†mßSì¨,¹á:Ö‘Ù[ðæh½?ÁîÂt’+¶å\p?ViÖÖô&¤+|e´~¸Üâ6$ÚÛMuQź¥^T_-åoõ»ŽèlJdØúãÈ›úJþåše€Ú\r…dÌñ¹¤²ä‘7ûy¯¥· ÷ª¥ „G%c¿Ãpô5¶jÊ¡IÒeq#”7[ó€Ú¨R Ž×(Qù{ï0À‚€bU#M´Q]6È4ˆ{ݧï÷yoM³w‹YùͱœàÕ‰Ò~t.³`ðQ¹í,oT¼5¤­?ìe¨]=êÁúñ-æí‰·ÿÎÞž!ÿ¬€–³I}ƵäÍ"\¼‡“^U³í¥8Â"f®s"ª,Éez!fŠ2Rg ¹nîAS÷§€È=þÏÌÿí/‘¯çÓÿÕ•ý¯çó?ÿó??>>nÉbÈøÈÁ=¼\œ©¼ûû«ýüóÏþÙüS3j?æe¿›èÏ[12œ‰“{‰jÄÝšõÈŒlÎ…¿ïÑQmC[Ç­ú·×•ÇÿG1%æœÞ¦p]—ÎѸ ±q ñ2®ˆñçóªÛàÒ¢™Ù`“1ˆ“4¯iy¿Píp1Â`DÃ;€S'©Úœa÷|-Ë2r‡õ: ídíÂ}ãœegJ(+V`12Ë[ñÖ aQß™¼ã¸…q5Bûé"Ù~=Ê™Cˆjß©.+ù·À!W¯@ Ž´A82êDdêk{°„©«››êlÀHÇ`æÇqLSË`›úÀ`¦çóT½˜G€èó‰`0{-:ˆ5 ^ÕdB§žs¶±¥žè H9àÇ“ÝÈ?U„]c…:‡ˆ³“‹—:UùüÄÑX~VdY„‰ó®‚i*ðILÚw…1iÚi:qúùgƒIˆXØ1M6MYb´¡SIÆdÓ08kxX2®¢LUÔ•.08‚~2±Éªzp~U%i‚Àœ˜ ðÌ›€÷ÍÎ9¯yMÒ€T/Âp˜ÈÈ-šM]B¬Ÿƒ`g¿‚ɳ.:ÄrpÍ‹`&#…fކ<µ„ŽÌ9çužç×õË×'Ç1ôr+<ÌÁ¤ªþb¦âº:aN½Îçevž2†ŒÇ#âÿ‘]—š*XIi<¤(î3:ϦL®`‘·…rñÍÙ]¾õËÞW&ºÈüî”lŽìPÌж]>˜Ø« üãRBþ%OÞ4ãc€9Ç„eå*ô¦¤0±Ed«õÓ@Š|®…µ3½Ù’ê!cljÕ¹°Ú푪ÚðÛ´èÔ¤L„k¹–_HÝ<” Î+nŸ¢‹9]ëÒWrD¤\»»t6ºCЧ³è– $jÓæÍáë²Ñ¶€Å²5g |ÛýWyCL¦„S"ÅÏT˜_¦ôlZ£xÓ²Ô×UØ®/ÞƒâÇÕW3sZ[µúÍ#»%)¾fn†ûMIÈG‹›[9SwÝu½ø4œò¶'m¢¦ØN¯òYoðÕ‚;(˜ÔV=[á6Ši™52fK3ukZô&û-œ—ÍŸ ĉmºÅnnŒ˜­¤S;%· ž†—¤t’ÈkRä,1¤®õf«ŽwTÎÚ{ÊåÚ¶Uæe"o„•ízM¤.¨m5fÜ!ÎÕ–¡fwG-rôîíj/b/.á5À[m§þbŽc /µ ´{VÆ”–ݪ›Ê Þj=oÔG/G¼«‡{ÏóæËÛ¦ÔHð G‘wTæÞ(nðÇ(h±W+¶€Í‘ÚΜt)-O´šq®0©YjónƒÛH&æ‚ís5$fæz LÄvéFs k:Äëï)lF•jP^Gðt&Áù‚k*Q´ÝlMð'(ßpfm*àÊsQv£Õoåÿé«ÀЊJV²^8à•jSÕ—åœÏ/;‰v{aXxoØ^jQˆßº8Jè·‚ì·Ë²Xb›Ãsÿi¬2BLñéžÕ³‡ ý’Ú{^MV…9oï…_®D‰µÔEÊÿ1bZ±âÛ0¯ß ­†eþ>ÅÖwéÌíÎz·Øw* mñ>ëyî{ÞåÍ0²ßù­=^R;¸+£†>ÅvjÑ‹‹¼Mæ´YÎpc7TÓnŒ¯l±Mý§ ýó&³´ ¬aqŒöò®þoñ[Åù{îá7…·Ûö\ŸÎZçÂ&½uØ}GµÂJcô«¶5œo.V¼ÿʨ#€~Ï$à5îðöGú‘µß¬ŠwòÕŸ ¦Û‡wü{~õ¿~ø¿öoìµ×?Ì ànº'æïO~èf>@P¾?çHè[=å:s¦âSËCƒ5gØï0ÅL[—à«=ÄÍ¼Ž‰3¤·ì3“µù|ífÌLhA„]N"]M“±xG«+ Í$B楘³œÆŸ8»P„_uí ü]%Ÿ‘ÒJz€í¾ƒ=ò†¹•#ãü€žXGv·ä#Çlo"æ·ËÛÈÆÎúQåwûğSé]pu•Z‰_ •9pç¥}ûÆ{ª¢}«vÔôºt’ èº.o 5£ãˆàó<“;Ḛ̈ìøeÀ‰í‹2”F˜BèøþaªÍ°¿Ï¿ýò÷š.œçé,uÞù-¥þ÷{ ªÈLƒ¹ÿbMDÞ—}yÑq*æ>ж«¯&µÊ¸B‘Æê›MU»® Á~±2ˆèãã#†õù|Š f0KVï.ø‹æî:ÊnŸ:¨Î`h¸„ç…­ùW8 âÁ3ÿíço¿|~êŒ" BI¤x)¤ìïý%µÑ9Éw&Œ!$Ch2+ñƒäñ“J~ío5ö6žf0ªj‚zõ1ÀCHÍ»%<É1Fø1WŸ™j|4%ƒ ØÕÍÐMx½ÁZîéˆÉØE%?’Mn5¤aæjŠ®77™š·ú±wƒ°«*ÞÀ;Õ¸uªD«i5Å™2ÃGh’¼3u03›‘=Ÿ_ÇC³Àm°<í9UÅ©ð65‘[dÙ2Qµ ŽçHþÉ"úÖ™1Õ„Œ„%v3Að‚ÒTÓkN26¨°8­þR=xD³+¼‰E\‘“MýºNS£DÚ ãñx˜éu^—oeÙ<Ÿbá'fš_ç4sô¿Ëª6™ e,°²CÄØ'¦l¥2äí?^ž[!™.6ºÑÔ«Ñ›NžÜvëÆØÛv{Û͵º<¤)+›É’ûcôöCª²Vj™}Õ{ûVÌ kN“«`û–.†EQ¥[@ïuªÕd½<ºåµÓdA·âMëéYÞ#bÄ#µ‹ÐA€±Š˜G‚˪?ÆÔOÈŽè¡V²\´lÊà1ßw×q?Ƀ_yÂã8$ˆ)E§°Ñ%]J€ümý°«ÿ5a)#KÝûs<Ì| ™Ê¼•4¯BF¬?I+€b¥…tW¬p§ÝXš– ½Ä-_Û ÐIXt Ý¿I»b´{KA¯²QW:î ˜[^ùž6ô"ÿ§N³ÙË|ÐäŠÚ„é–­Ø«1js…Þ騣ÅÔDs4gä¶2±ÍøœÙXzWWº›çÚ÷>»G¾$Xæo¼^|œ7´-;ù sC<‡+‚Y<Ò¶¦fwPðr£ç.ªßË¢»Ðò«FÕndp³WIœ6su³Ç¢¥#Ò@bZ°ÿÆT«æ¥Mƒîèo,Û¼õÓÙÝ£ÙHÔô¾®€×©RÅæ›•çVvUt¦!˜jÖÕЭù3³ë¹J Dº¯Ä‚Ϫiž¨Ó—ã¯æó®_ iÞ-ÔÐ õ^-½Üª ÑCA¯ê±´x¶Æ´‹j3Onæ¶Û Ê™ª1³;å}'¥kJ¹ÅHü=k£Ï7øìrU—í?çúTä[´„¼µ¾‘l–Ê‘_%â²=¸xßfsnƒAç½ø÷'ÌÂþ,C”£àåÄ™zY!¼ŽrÈêlu'̨dDÎÔ­GÊš¾Ïú·®õxþ¼ÔúmªÉûåÇ„²mÅãÛ»µgÓËDð6¦® hu_eYdBÂnóÈxÌÅmƒ¹}O ÎÔðÈa ãë–¸éh©Ñ-ž‡}L¹mé ì~à®ÝÿŠú³-~‡ã´mÔhÝ1¼¿ÝŠ‹ª üèZ÷6x+cÙ?*ý÷)øo˜¼øqÛŒ›üj¿®߃ýÎÄý¥à_ü¶ï²øæÿ|ïÆ÷<ø/ ª`¢Jà~òa§ýÕŸPº‡yÞDv;ÿÝ£°Ø¬·‚Ìãe>ÚæýCº-â}(Ÿ÷L‹é¿(@¸¹&Z¨‚3æëh·è¼[3l_χ*š™"z°Èþ9²Œ0.oB9r™i­²Ä"%]û…ݳßúxQ»dmႾ×Õöa_’cÖ2kö6ÝÑ^³U @¯7üøBÄïný‘À5ÕÏk ½¾Ϫ»6*SgÇ9<Ú´:ä©;¡â¡ù<ÏçyýüÓ·oß¾•Þ¥üóy²ˆˆ„‰Ë`äÒRñzÎ)q ùæœ :¯_XØÌæy>ŸO°ø©QËÜÒ»k£P”HÍ(õÖ%{ߟϧ7úÞÉSõ8av”•³«]p_Emíù]µÀªúüzjÀëÆ‘¦Â…¿cÌ9c  «ù˜5’™ D$>ÎIúC„8ˆq¹1ØÛhó0x™óøøø8Æñ<ŸþšÂ¬ó´‰K#ψ”F°¢.,"—Gm× 0@„H|(6NœN½ïŒ‚d¡Ô–˜bEï5£$¥^óª¢æ aÔä&eAª í«Ì[Å\«J·pŒr,¸dšø1“\ͯ$~oqÌO kKCñIIÕLõlêœê×ë×ç/Ì8Ï˦>ÌL,^|<2F= †032®$³ŒG@ü˜¾Õ7:穦ÌÚ–ÃkùÀPIzïòðÊž9§+ç5'äÐï¼w!T)ÏMĶúikm÷ä¨X Ð@VZH¿ãX.cÌAõæ—s-‰lùذ|¯®“4!<=aºíkÏ–ƒáb»ü£,Êõ³."GžëüJT®ŒöιÔjóÏp7ArpÆ@–¸âØ$¯ štÖå83ó:R%5¨£>'XÈÔ WÑo£ÓÂŒÁ5X Ö5¶ñ÷Ÿ™›X‹µ2§VíÇ*T±:\E 5ö$:½:-hëY]älc3(@%iæ=•ƒ+óoËyèfå.é&Ù#ù›‰?Ö’! %¯n õ?õ¾âDÇ *¹:´Y§#OTìëžGZç0*C”¶\O 1mšT>=wGáÖr˜/YÚ=l÷•†o—úܰ Ũ"·­U ZxR¬á]QQZöÍØÕþX÷ª×"Ý€ QÚ’ˆ­glu_`uÌ´¥6cUfAC‹ì¸ì.b„ðʸMnò§ô=ßWÕípÅ×7³tÿzx'eT5HVÅbk›”Ø$ÚÖdÊî²Üutj—Þ*”L½&v„å WzuäÔ7;ÕV)z¡ï’ªS8çŒwm¯Ü쬴œ…ä,0ïBÛ(¥A™r|wWâ>g'ÿärÑ:i§‰®VYlZ•ãY쫤6éÅÙŒœ£eé—æ»8L6£˜ž†Í%ÔâÊå-J·ÕîÖ«ƒ:¶½§ÑæÔyMœqò‚yÝímåêó=nqÂH-¿X,vãv·¹'"u¹¿™ï´]Ý[(,aƒè+|º×¬>ì3Y^¦Bì¯á+nü(?àªj ÒC/I–ÌâÔ¹qÑí#XI ëFкӫnàÉ üž™½E öF“· aÛ¡Æ2ë>³uúÞšÒÑÞícß‘w]Uh5Cû¦bh•i•mŽØï›oTûI½M[îü4{ÁþÜæ!Kzë"·²úÑfö‚qÃÛÒ‘×À ìvs4÷ñÆíýß w~M^ZýÏ[^ëÞ¿ûû/ð¿ò“?N¼œ—`Åk½ô–~ø§¨ÿ\fÿ¸‰þßñ ´ú¯âûÇ?ë×nK¤÷£} `¯š<Ñ÷þ›÷ €›Ö‹]‡__Þó\†ö.+CëÙº‡ÐFhþý¾=áå8ð¶lðžâûH¼)õ §m…H­IvKùðó™Û@iÛ¤¶yI˜ýé^¾&šF…æF¹ÄèÍ´Sò¯y’ÆÊ½Ï?º’ßwоÖdtVlÔæõMU÷pwÌuã¿Ý¯K¼9A¾{¿üPèO˜éeñ÷E!§ŠQN̩ӵÅI¡ŒÏ벜 {B‰«a%vYýÛO?yIï¶b˜éuYi‰QàÅ\¸:Wù™yW ›Ð>¯é«ÏKUç5¯‹Ìäña„çyŠ0(àãÛ7®f³­ºãÿé¿[ï{¡âÔÜ…™ Ï>WêImóUïtŒÒÇãá&ýó<ç5qžW6"¬HA C®_;ƒUºPOþÜUºZQÃhGû´fm§<â C+§làÛ·ÇǬa+o¾™¢5„¤wô iÔjG[ÍrL˜Jà†¸ÕAFÉ›Ú)iÒlû0®y z¸æy®Û…÷¿'FvÍ‹ˆ®y•ϰ$zeÇ|H‘Õ9Ü]м«Ù R³+¢6gïÈ9ÇÆÏbf2F r1ª13¦Z+“žˆ‘D&v½¯»õšÄÏóKàT+\לSÇçç'©Ž1|û4 Œ F)ÈD»©Å†BÕÖ@ªú”ÒPãm±jÓ¦æØGÀƒiÈÇ5¯ó¼¦*ëœS¿=Ƙü9£ÞØÍ_âš0Æ80Õ¯-;Y>ü+>u ay,SU]ùU:=˜mÊÀ×eçœb*^MŠÁãD %¾æyú¶Ó J`>dÈ!s*™}_xŽã`ƒ6|ŽË—ÎËö Ùµ½ƒ¦“¦çe°©Ã練’Ú4˜j¸íÔéTðmó.]sBÕ©h#å*ææteaw6cbò]#30A¤4À$|×óú k²‘ÇãáGòzª‘°´˜‰_k|ûø`fªŽ—¡cÈ5™‹*HÞÚíÅ¢y…ºM™Eô¼È”!zN%Me.Q²ÄPWÈÏzc¿ÏùÈÈYX¥:±Èš ªÅu‘ 3RÄÐI]È`:üƒØ­Ïï¼f¥¬ñ~¹iú/ ä3X/éÇÇB ]ýÏÇ\tU,¤n~áu+Ä–Äm°5º’×Ô§¬’ÚMÕ2ÑîÈJØþì;Ÿ”\K9mt”Ò‰ =æÅÊÖ#)×ÔþX9´—8›úϬý*UŸ[#[{pJ륬›éÐŒ ûÂpۙ淣±ˆ ~=G˜Qƒvÿ_Wð*ü},ÀfÞ±í¡4Ÿ°(LöºÅ%sJ´|’ X=¬gÐöèëÐ%¦¼F0ùxͨ½e¦kgЗˆ/G¢v5JÉB[ÚZMD Ó™jQUÓw&4Õ$ >ò26Q¬ïªj‘žòqð ŸS- NS*-Ì¢)ÆH9zk+m«§Yv:ñНìv»W¹®R„h5Ú½é½Ib]ÂÌ”aŵŠDóÄ ýÓÞ1 踱Zx&xbX ¯iꉸI¨½(P5‹èEÍ}ÓZW—פÕ1o9DÆÃÃÔãçf{«6Þ6ÞÖ¾ÚZêÝx%qª³}O¶ÔF*aÀà ìÝkÂHqi‘³ntÇ ^OÂY,ÐÎê?¿c¸¶’Uíöi :™Z‚Ø¢…úÁÖª}GNAí¼£Žc/[]3¿ñÞ S¦j¶ dÖ‡bYC·¾«·Æä¼ý¯]«’éÔh€qÀ<9V}YçÐ÷ûܘÂÅwi1Y‹˜4ªvB¡gAî÷3꾯ó:¯ó|êœÞdËÌ×yp<ÃÒ_ãßá8qhÌœnÆW³¿ÿýïþ–JA®G gý ¯Y]e>Ž£˜œªÐ5']“¢~0…cTµÈòþoH"A6‡äŒ!XÔÌŽ!k•€­ÿÇw8³=|±Àª"âŸ4 ùûlcËトè<Ï_¾>uj&gs·c A¢‹ŒY0 Vš“®Xº9d{Ć‚×~ÐW I3.5‰Ô'Òp"èõ†;ÍûùãÉÄ`CyŽ1ü>µâVKÿ¤Í¦á­ TufvÍ9ö¹KGyZÚ‘Åu´½L"þè75×c¨“q¨ç̘“ïââ³IJb(f&µ欫# #®›êiD6d0ØTçÔ¯ççTýùøIX®yŠxç1™3Xv%Ù¤€£¸/Ž] 'µÈ›§)ú ™‡ Ë 9€óšFŸ†oq ˜©êuIR"<`ÄŒ1 ìâ‚¿—NCãÇa:lª™Ñ4z™±ê4¢ydjÊ×¼Ç[)_€s½y¨^ñ–ArðcŒOÆÇ·9§&É!35»% g‘©^×T£9ÏëšzL„…`c) §V%´=¥ 4²6ÅùþΧ€é:Â9¤ IDATë¼È²‡4„›&Èjs*‰€tF‰bÂA >¯k^×Ã;¢EÆ|R½¦>Ÿ_Âüñ8@É wì"'ëÑ5MUy°°èÔ9MÄSˆÌƒl*7ÙÒL3 ï,$òwìæ«é5Õ9þsv‰Ì&ÕoˆªLÇxØÆWk”ÎZ=жšÏSÀ I•ó~½ø¹¥,ßrïN÷mz¶«F‰@I¨È`ÇXm{7¤÷/ôÏ©„ÿM+}(ËŠyФ8£ ?bS­˜œ‹Wn·¸h­Ą̊š‘-Äz¥ŸpK›Þúh«Ü©-(ÓoD7Šnží™ÇäôSFèÞnÞ9ã¶R2êßMUæ0¦-‰ÍÅ(ˆIPŒ`fb6UÑÖ¾x¸aRn–:f˜eX0ÈwfuÃÆ~ÛkYÏ~¯^صˆ‰µ„Ä;wy[öô¦Ú¿Í‰›o"3œhGdKm¯Æô6«ñ.€ïâÈi­t_]ð·v“iÝ¡Íî㟵¿Ü_ òöVTÆoèE½}ã5r2»õTßþÞ.œ@÷@QóKúU#¹ý–ÀKÐðßøÏÿ?üß&ñÿÿ³e5_ϾmDÿ²l¾tÈÅÛ³x½L¾ؼkoŸÄVû÷âââÍëmÖÈ´ê|ûçhá´þ&ÖJ®˜þ ¥Ôßë…9Wv·:÷ØAÅ&[{ù‚…gP5 .àu…‡þÑjÞ«ÿ‰™TÔ÷0Þ5Ëo 8:­¹[Œò:¾ÿ„V@¼]MûbȉÃÝûïÎ4߬Ñ~•Æög Tu*„)zUIÜ`¸þ?Îy¹Úîv_wº¸ì†ÙÔþÈ·È"¬F,"ct0n 4›ŠÔ,Z$‰D¸Z¤(¥·NU5ÒfïAu™©¡G”>Ÿñ^ìïÀ$Ó9???‰È+½=}0Ü€¿þ‰³ÓØçBñw×YÎEjûñV~>ÛÐ<õàžJíµßm³ž‰6îkÞ+â¬-¼Q¬ü‰Éåäa¾8Ôi? a?%âf„[ûç  ¡Ý<0*ß±ÔÖ̶͓ª¦YóS\¥âÙû¤Å±;!…Q¿½.‘1~ªz ¯×·„ØŠWG1yî;ìUý‚ˆŒá Hõ3 wqôT~p6@™²»Ê¿ObW•ó~š,|óªñDèO¿åQî7¬â÷Ûºj%;ËI°kf+&¼d#Äã3eõP{‡Ú~'è}€­Xѱ®”Uí¨U‹Ñ¦ý5àUJÜýX+qQ=¸ÁZY˜‘Í <½ = °êЬ†FõAȈˆ•»g9¢êšoq¢öa[½¼¸áúwÔ[¦!g} `·ä@ºå›;ÿfµ·»Ô‘Å3Yv–’š8”¼'éoÆÊÞ~„w¸—slÓÜWó{±Ê êÐè/&d·V[l3ð—¶ýK+âgºôkóûeøÝv³{ð¤Op.ƒ•ÕpÚFŸKÐ?£þð±•ì;¦ÖÖ¦e-dòzàñ:ðã1~0äøÄþÿÇäì_x€Ÿ°¢ÿOàç@¿02úüM´¦Lû4àŦ‹ñõ9’åâNé˜-M p¬×=Ô.×a>ûs³†¿¹þF=‹Ô.c„uã6ÏýÙÖõß²HœîÓW W”âr“æ1Úï0H€Ñ$¼oéÀ˜ïãš:{Ðz¬!¨AkŒ¨ÏÁëKÁÈ›ŽÃ`Ìí8Ú_Y"ØÎ­µ8Ðë¾ììýØÞÿ DŸK˜àïú3|’î#S360PñFÎà;³©BÖðúJì[‡D t ’¨3:(ƒöÄ̹åÍ¡–›uÝÝØ‡†nU®ûRìL‚ð‰Ç0ED‡ÈT3ÞnñÛnÕšVûüþþ|÷g5FÔ ×žµDߨ"¾½½•>kfÜB‚r<ÿóœ^Í”ó­,å@DQOÂ:íÝÆ8ÆÌ%—cDP}¿Œ±Aó ,(vB.J%GÄó<#ÑCT+—ˆ÷Ø9Í×Ä u£IÏÕ7x ù)SUËde¦Œ0E—ಮøNÕ¨jƒÐ™±,HÆbÙóåD:† Š‚y«d>àˆz>çTs­Ç™ßÞÞñû÷ïçyúKž”6 €½Ÿmd7h²&½>A•‘ §§B•öF`ƒGQùóÇvh‡ç†ê$„ªS¦¿SŽ~ë ÂèYMý¥çøã ‚9ÞBC×r1ŒCÍTÍ'HªzžO€#Mh f" NÈ@ì@P9q¾ôù[»*ÅBZ@"aÀì¾"Ff&#&6 ›) §( ¢ªSÜâ-„^öxÊ3=ŸCXUõœÓBŠU³9EÅuÕÊ€®6Û`Ìø~ „q8íyŠI£.˜ˆN~šÈIƒ;‚zA8ÉL µc5s ˜óµ‰Àß#²4d „Äf¦*Ñ"êò–ÏIp0˜!°Œ%"KæËwøÃ‡éi0‚œ“ù˜["L0;Æ@3;ŽÃDÌ@T@ìý|ª)ûX¼}ÏDlŠc Š*(2“³’ INa¬š‰‚‚؉J‚é&F?|*£—>(ª _Ùˆ‰BK ¾g|‰WÓÐIAEcx‚˜(XÕ°ÄW#¯-ï‘yƒŠ¾$ù:ã¹%ÔÖ®)kË¡Ù'ˆU=ö´uŠ‘ZÔdÛRÿ õ^Ðeßs¤±Í÷* ‡‚•vD¬Üƒ?Åȩ̂oBjø­©àТô( ¢•Ѻél×Ì~{+Áóküf˜ª=¨i'X|à° L™*X;e«‘ÂúAynì<‡þF`u(µ>¸O…w½OØ¥ÛìäÆîåÙó½tÇ^9/¸pÖ&{Ýô×$¨ sµ€ë&é^•ˆÚÀÆkb×Còëhÿ&§¯MT¦Íö'ßdå¥ï„|J{“A¾sjÅ/ nb± ³ÜcKØ*6üÙÒêpI×0¦MÑJ Á˜•Y{wº&±¼®­"u‘Ÿ6&K»Â­GV  GA6ŦŸÔÚƒ·ûH;ϵEcÕR,×ëM†«¦» tìjQvíÆ +I½WpȲÉ×…ìØÃ–‡¸Ì麦[y!®äJ ‚Ú­7e¼M'Ò.¶ë6XêÄÚu«úµ.Ick íäx=k6«D²s‘ÔćÈQ¼ÔíõǬÉYTЯèMQýØZ4Ö[œy+Åœ^hžgÖ«š ÑaCNq B@l À¸†/NâÑÅ4§bì|­Ìšæm†ÌPæ;‚Î9>SýÌçóùÿóã8Ö=Þì<ÏÂ\ú[é5ÑÅÕ¹`^y '^‰HVïÓèIÒö‡™RSÈs6"©Jÿ¤$ºFá늈0‘¿ìë®`cð%¾šI 4(ˆdÅ<=•2øÅO'"¦Ç”ù|>Ÿçù8†CªE„æ6*c-ÈT5€xÝ€cÊL$sºÍ–â0#„<Ì3DfÆÄþ$ÇÁDÇ  "n ‡ç™Ô.¨¸Îéžþß¿}ó]ºˆÒ@"Ä9uÎéíº À@¡¦3 ’3 ‹Å*`KN_$@fƒ9EÉ|äØ50db¿H,úd³‰Ò:­fjUÆŒ¨F„&`¨§˜C‡• ÀÈÈÔER>#S™l,4A€Y‘h0l3òF"úÜ‹Î)ÊQ &ŠYxhÀÀ†êÉMe™Æ4É Tôù>tððrÝç!ÏxiY…piŸO&,V¢À¡uˆx2-×Π<fÑÔ£!ˆëD–ù[ã Ìr“fµq)˜FÄcœ¼B {9}ZÙȳ¯áU8£n_ÕPô«6—\~2q¿OîÃ^TŒ}vÝ,wPŒœØš,uÞö¦hÀ}T ÙÊ´+¶-ÎëmæªûhçÖßÛæ¯÷Üm(ffkü‘¿æª5¶¾¦¨ÙšÒ5?E#¬®·%÷ß:dž±o!lÅt<ç'ˆ-7x5v@›A…v-o½µ‡ãuR`7Qji|—*a¼›þí§<ÝÉZŒ vc@¾èËö²¿¶)|öÓ.ò?hŸÿòŽ¿þ›Ü¨Eÿ~vþu_…Ÿ¼$¿ÔB}ï»VýÍ  ^½ù©-Û}XÎ:ЛlíÁBÛ|ûy½Ÿ¨Öþ”hîsWQ‚†d\ÃáÛÔÍÚ>oÞšÅkô‚ÒxLZÜ ¯§' €.%âÅX%Ü2Pñé+Ë­Ÿ«C6ʳ'µÇ¼42XÖeÕ9©»µ>®÷½ø¿BÿzÚ„ ètǘ²ßµUÉLò]Íý[‘ÒACËÀj*"¸F1Õ©~{#$ˆ2I@¤™|>²ÕÇ‘WûSôá©“©Â ”î<"úýÛïøÛo¿¹¾v«j¯]»ˆ<Ÿ§·ÿ—=¿[{êëËô|>++·.šµûÈoW«p<~W–ýaÇGÚòÔ ˜™(wš!@TWA=%DÃyê=Ã^%JÌ`@Ä€0e¢¦4ÐL‚oRKM| *üåñ.Wy{#fŽþá¶Áˆ<ø› ¦aÈd"Ôâ øIÃû"; hg"ø'Ýü ‚ gϸúÇM3Rµsº¦=dÎÓÌLSÔ~ÔÛíÝÕd⣋çó Ù¨\ªW+Ç+ƒ8çômÄ—ä‡r.ÆPË ½ ‘êfà1ZÝ…CÅ]?SXÙnSÕ1yÿ3³ÂÂÆ2#"`r¼:Å#Òj›j†À8H¼`ÇqŒ8»‚eÄô9=nªH  ~“0Pñ˜Ãy¾óY¦È`æã0fƒ™‡.ƒ£Ñ`Ng·ŸÐèàÁ°N?³àqÕlYƒU¿39Læ/þe"#W PÝöކ¹aä—˜ÀÎó9§ˆÌ¤ ‚ãj0û3ÍLÁ5Þ9Ï'#¿½½€šˆ)9yÃâxæ©CS1[‰<˜TÕ€ M æ<‡NÿÌÎSÔ„,ÆEVgƒ„N!šŠ p,tqÀrš ˜"ÒàˆSgðÉÍŒ$írZÅÎîSШïÖ¶xM¥˜(NšñŒ‹Lñî[ŽnµÓ›{™IC>ÈO+QlBr6"iRDEçhúbÑÓbµï /WÓÐÐýú#¬Txl©³(<ÞB†,ÐFè¡ödËc– ,ùØ Ë“\lSÛœŸ–bZå"-ûêp-/–È{¹-xÉ’b² ÇñP´&èGÿ¬;ÌAª(Ä›õÈIõMãlbo½ƒ¶:`㤷¨j9â×Þ;Kdói\žÈº³—­²â· •Õìe)ªÐžC§j›ŠHÍŽd­ˆØµîjmsá…VŽKËÃ&ÇS3Œ-õ0%ÂHñ¿Q§Ô\ øØnD·Èÿ,n½ß°ÃxM ^~;k!¶ú¯@WÉ‹@yq4×­0i†WKfuÙÃŽ¬msÑêaqÌ îLÛ¡ ^º4 åiE„Í£ÝÁìÅ€ÈÈ]Ÿ»ìÍÐmÖ€—ÔêÍΟ×írMáõ)oÕĸJ/®G*܉%ëŠß±òw[ßh×Yï(5È]gü´Ö¦PºÑ6îÊ5i½ƒÙx¼èCKF›ÕˆÖðÚLj›…¶‡`ìb=« …µ?OÃFl®öF¸O)nw­áа:ch¿¶ÌÁ&…×MGHvЊÒz bÞ¨`Üz/¯/G\¥ÎÉc¦ŽêÌ3%.Â.Þ×u]µâ„ “g—}3tæìÖ´øå2ç5¼y…+ͱ2,ý(ßãËÕ+Þµeª{t¶“¹­0MñjÙ\•>^‚˜û‰3à«]Í3Yö`¶y™;6e¹”)½0T„zk2³ø³6[-‹{Ã3ÔÇÍÙeÑë•f5ª%è¶*g¡×hîØú"þgUxÔ>§ö°ÖûYZ7,Ä­þ(9òtcîë¥xCZßÚVwKÚµ[ÖjÔdíÐ6ÝiÙÊ ‘÷ÑjLWÓ¸£¹ çòÙAlëX}l—†Ê}ù[ÎcQøâW£/®VéþX¶«|vùp½4_05xWêîì›v··Øê?2.çÓ^ r|µÂu T;Uéc ]åÝ!Ùxy-¦ð‡òÙϪj¯´ýÝ2`JÇÿ5øÏÇoßUðÿê?þ±§{÷ñ×ËZãÖ«gƒ?æ+]ÏØt)¾„ŸÌ¹¼óóO{óžV@ÎöçH‰‡}öLž¶†Óv!º~‚æïE~V? ‰¬g_“çQêúº‹–[iO¬Òbë%Âý™Ø¥‡ÛRŒ*e~¾Hìµ9$H‘)(}=CptHÒùõÌÛѵMÃϼÞÛŸ¾h™þÕËû_òyy¦53Yž)CpݶÚ:µ“3a*““ò¸¦+*Ígâ¨n5PÓ9§im© .g^Øf\«M-ÈÉx@qcàÛãÇqøý®€ÀÈ*ÚOÅc0ùc†ÎÛlt~ªó¶ˆóØEU­B‚j ¬W0'V!Ùrˆ‘ÿÊszÍ@Y<6¡Æ˧1§Ü*ƒp cøöš0Î*˜°™«9ÆaÑ¿í޲[pïÓqSðŸïß¿Í9ßoÇãðaa?Ûóc0#â÷S,‹2© Ó@YH̹Y÷fPïYµœÓ¸QTÐY `+ªˆ$ªB€Z¤‚ã8¾¼½õw°4í¸È^ÊHíl6F3÷}‹Ù8D<ç„ZLQ6F\ÎDP3VbD©6fU•9½pŽ™ýòðoüöýû×/_‘°#}}ÁU@|>߉èËÛC£Ô-I ­F*·ˆùÉecü(#Ú`?Ÿ¢**ˆ‰ þ˜yêô3ƒÀf0Ž1ŽŠ˜ªßŒ’ènÞr†F4ÜýDHji4I ¢‰Ÿ” IH)—~6Sbò¶[õ’lŠ“è‰‰= €ˆ:UMMŒG|6ÕÒSlHL*¨ Q©+6£™¯qàe´1Åë­=æïü~Î-˜U´åPTD5PfUÎÄŠxªIQ‰Øöj¢j>Ð ¸Í ¤8¨(=ÆÐ©îÝ&C š“™˜ö¹]M€˜®:?»&jdêó ËÆNS1@<Æ1UC刪ÂÌÇ›ŸkÔ갢¡|3Su¸¹ IDATÿ@#6$˜ÁþGȾ)#BÕ }µÏ³'TG;V>ͪ{U7Œú;é± ˜ñ%Š'ûàƒRŠ&EþÃg°l”EÊðuE3ZÉ2l†¯°6‡—ÈT£: í:2¤±Î%—Ÿz“»‹Ècyµc“LmÑŠnW-a°éÛl%„£èe©”PÍ›êÀoÕÑ»µPú›XÙ$+Uwe‹âYùG¢UÉÊŒÙÆi«oRKòò;#tÙ3Äà¿…÷9ì{æDUÞÚ Û¹·#bîŽþºÅúͨ÷.ð·j/šëÄ?ÓÆ›«_T¿¾”í–ôiû½µŒØMî”lU×kÈQ4²;¤4޽à7U«ËÀàJöhœñþG/M¼…GoLÄëÙÌÇ`w Á·¾ÏNÖuÓ†·£w܇lê`cç¼:È]]»»¨Ÿ6né> °~ýöÐvkßÑʪ[Ü#¶oÃ:x­øÜþ2;ºCj@’ŸPìMèù$¶Á>¨¨µc}’U}'o½G¨µb·O¯Z}%u?”hëpöfnm ü[[F2ýëõ÷‡¢‚±mY÷íõÑPwO¦™‘°XYˆH@€f附¢;î©“|.ƒ¥õÊQ1A”¦*· =ºGNagN÷±_×­/.Çì§h…èX&íLv'?.]ùÛð;ginN Wˆåå­$¢­>&±–ú©-†Ú²-؆"Nµê‹a$©o6ó¨U™l-S|â°î+p±†#|Ðoû¸}‚+ÓlÚ¬›^™Ø½Èp‚6Ö,ŠÖr]êâ†üuKé4ÛËl}4S²‰_JT#5Bå¹›•;ë’"ˉuÏÒf·¾3Ž­Ç¾)òx•~Û ¶µ°ö|{%U` C¢ÂÞ2½P3[g5N¯)TÃõiÏ!lõß—ñ=§Ó.«Õ#œkö°dk¯Y%E9g„¶6ÖÔ'æuÖ£o Í6+@eD–ÞÑjä>c?öénæÛ‹—~I\¶Ï~ÖEAÛâž=ÎÕß_ûUmo•€–LzýCñµ×ý¥è—PŽ?«úÿ’:hÿ~wþßñÇ>¡îüêРïž>,ßý°›vR]¾òõHàÆÙÛâ+—ÎÝû#„ôbør»Ù ÚH ·éÚ˜¶%¼ˆh­Ïfùâ3=ßöÕ¾«ðy@|¬ÌG̓óI<mw¬´w‡Sî­nÍðPþÛ!Vm­h^p~°îD b!D{5—³h§23d—³!”ÊxÑÕ'#[ʹ†ëŽí[r§—§äÖ‘ÓÕzÝýk¿´ü‹>íÃïAª®–¢j‘3¡Ól XV+«©¥hNPpº­Ó>8¶…‰i°—®>Ÿ'‘W¯€ÿ%t€†bâ…Œ®z÷˜…y¥î”ù19ÆA„¦>Vˆ'd™Ê”T]ÍÌY+Àc¨ûš™Ûõ¤µÙð­Áœó‘¢¹°Ý‘ï:~Öa¡®Æi´toU)í Ùù}¨sž‹GOaÿõA¸þ‰c°öd®Ô¿ÿ~Î/*ðßEU™€ˆt‡Šœ§ûæÉ'D4¢‚ØÁ¾©fŸm¨êãx¼}ycÂîl÷u;ç|>Ÿƒ‚ „†Ì¦à“•H@7ì6 J󙦪W˜L2_ÌQ0wè;s‰ÐŒLd87éíñ@€1Ø}ÿ.RR–6W—šõR£4†ÂuG¿¦³2¶™ZÀM곢؅#™I9C‰É;-˜ÈÕÿsN‡Úû=xxæ#¹éÄÇlUpºŠ*È|óY‘¡ÑÂ笖ÉTÄTE4°-D„,"…°ÁpV™Ä˜­ÊÔG ˆê`+C<Ž¡‚ªúã1špbèë3̆ŽB#¶@-•=7A!…2šQL§ôô´„¹á]ãóŒHHbª ¤ LdÑÛ…/bö~žƒ §Lô"±ŠDe!x€‘€¸ýŠŒpœóé¿,˜ ÿÑ_ŽÇsÎoïß=‘ã ¤nƒ æ¬Ói˜y°LQU15E;ŸæKþÿ2©ªÓ„YÕŽÃ%uE0"6U$ðÐÎsúõ¦€bЦÒ@÷ù!ÐëdNQ!jDàu¼¡œáÁÄ4Jñ¹, ¨™ú꜈4eÀ,3q@j ƒ2¦àð5ö3+8x-e¶S‰èq°™*³0‚»¦¨ºÙr,5qÁEµrkÚΩ'‡%s4å…j.]DòqIlPö9B†ub[=Þ™bØ…±¹¡°Z}½SÊ.j?º{€ ÊV¡˜Í-¨HÔYrËTn‰,I½!èç¶’ï ©¿Ù"ò®§_EJMºô…"*”Ü‘ÊÚÝl’ìýå9XFÜžº\vˆr+êÃD‚¨+ß=þñÕ4ÎÚÒÁ½F<¤ãh0ÕdPb£ZSúšNêâE?í¤È¯ O܆»…{èh”äçtÅÿªîhš 6ðnŸôQôÅFp9*_ðuÛ½ô=Jx•Ë3Cà9†f˜´…H ïÿ6׿ n¬¦–™¨W#šº·\BÓöÚtda_ZÜ Q…̓i“ÁúÊýu¹Ô²Ù«|Ç+n_ø"k‹Ÿ:¿²¤²Ü@í7òçèõö7‰ž¨Ÿ;šúßyÆ­‹²ÿoyùPMïeí1|¶G»ƒ×Zçk ¬Ç$zîÁ¶¢3ÌÕÖ2‰g¹Z¯f«^%É$]ˆæÈîßÌëv]¢ —(!ïgÉh|q¯ÅÂN·Ï H@[6å·Ž| Nƒ9ôJݳçmrù“£Õû¼0Ø5Ë~ áñϼˆ™ŠhÞ6'ÛŠ 27­ âΞÅõMõÀíQü!h d·]kÎB\ÄÃÎ[Êûà‹-ÜP[?³AJS—‡*ÈêGóÞY-qùéÄMq8‹f¯ zdSE·ãÍ ¼¬(Þzÿ¹™«ëóÇö¾£™{ªrÏí­nÀõ;æ“G]WÓ‚ì­Ä QÅkÌô.T©î ž§!Š5§‚ïjŽ–¸¡wz’s–^ÊÇ–ŸÙµõH`O…:reOßgµEù©¡× š˜áÍMWèâ9¶îô¼i¸ÑQˆ}¼Y¦úü^ËÏÖðDí·Bè>ýÖ¸ÙáÆ¶o Ö@n±/Ö*´<„¾ÀBy[ÏÍl´‹>~¸Ìùšc#‚8^šÚÛ·"߹ğêRK]?ôo׆7iíÖJÜ]Ãö¹œþ§ µWû=ìs¸­vnKÙmèào´ÿÿg?;Qøoó‚ñƒ/§/¿àçÆE—¯¸"ƒn£}·»¸>ë<‚þ­²*7ºý/±S(si4Ü+1Ù|<ƒ¶=¾òš‘ºBBÜ~K´ÐÔªÎIÃ^š¾í¼¼‘b>ÐîG è^ÀÜþŸZËßfœè°~G4 ®‰‚Asà>Çk'î´æ †·Ú©þíx›TÌk,Я_Þ} ÀpwmÚ»¼u–ºí­v;j0¼ [R‰,z§Š âáÆ1QUZ–í*˜ef—/ŸÏw„EÀòÄaÞ¨¶5ª9öw;I;ô–Áål8øÖ÷Nj€ã0 crü õgëw—ó<ŸsÊ4z<ŽåÇ­3-âx°™=¿=}ÑùþíÛãñFDH¢¶6èªbhsž~,|{ÄÕ•iJ8Èë$Â:U:JÐ-F¡"áˆPŽƒUi 63¡ ~åû½Ä=äÈàö.1˜K¬îjFHHâ>çIšM@à!MÕóùôb3¿E1°’"ˆ[¡TÁßßF(wILú2O*S&¥FKy¾PDd&Ÿ²«:è ͨô)SÏ.’ÓŒCÅóÙ¤ªk„¦ÈLÄþô‰DÄçûsø²ð‡cpÞ}(ˆ† ‚6àµsš™!3 ›ˆš¢Á”S¦²ªñPTff"ÿP?ƦÏsNQEBê0dFUŸif&ƨ”ô‚ÑÆ¿ x|‡÷»ï•F¦3x4×´€Zïpy¶Rbk(‰^j›Ðš+Aª"²mLpºÚËú3[îè+ÖÛþÜj㌌ڞð²u®öwÐ%!c?ç{¹tm0 7“¯ÙÅbm{oa¯Z-ƒæ@nœî»˜ÞvÄ*ÖÂî¸_ûz–¯ûWÒË^ös±§Ùª¿ˆ"7Ç÷]î/%ŽZÐý‹7dÞvÓvÚwé5Vid☫ÞH2þšäOÔ ¡5€O£ÛÒú±<ªkizɬ'FT2Æçš2”Ýñ2°èØß«`M»ª6tz…Ow{þtl”^vá>鿤¿6µÆK Ñýz¸Œaz@d'G¬J™©UþB“/ FËC{9]˜W½vÏ^X±@/ Ý+nù©AØ€ …•Ï4T®J5°ìκ¼2ë£ð8`»"/lñ¯£¡Û áò.\Þý®&°ˆ) ïÂ}Øã›JÎþž¬oÍ m{âWW‰ÍXÔ!ZîUüVå«2“Ùo‹/`ëŠ^õØ Þ9l—ò׸¦Ü¥[.BäœoŠ­Ñ–íÅ.±®g%}Í” ÜjP‰ç¸šµ]xíåYá¼¥‡vÀÜnü¯škàK¼½w—ÕÏ}f—Iö%g[ŽìÈAòÊŠù•Òæd¡ªxVÚ³úÍe“Š{ýX<øÂ©º¦Ö˜|> [‚‰#«½N$X“§5ý"*”Y¾×)µWÅEÙrN¸êœ—ó¦WNÃúhÍ6” aX&¨É+/€ã,¡íé[ò 6L¶G®pyd/äWBée±½Pùºïár¿«çZ—çe9µæÂ侮. µzù¶öµÉÔ4¥·+à>H5­_ü1 ȼO§ÞßðGŸ©à?ôì7Qð¢þÿ´ŠÏ‹‚ñýx{Ùñ'„5ûà‡áçrÛ¥9«µiÙŸ{þ”ý7þ¹ý©Wÿßø5i?ú—Ÿa¦F¾·Ëæç¦øÊÝo€pÓÚmY€@Ï¿ `–Ð"ÀV Ùª‘úoA„âÚ÷‡õ/õN‚ø×î ¡Üy÷ß µ àÖ¬uèM6j¹XgÌܳ܅ÒE@ ôžå­³ùî«Ç¤nà†…uÞ‚&ÑÁT¹GÜç2Þï—~;ÖæU¸4 ,\@£<Ù Øm¾‚?©äRùû7”ûFn,g%5˜f?R–k)Ñ禊 ‚yâN¹Tt‚02¡Vã—ÉœîŒff:Ž9§_‰èGðÄ ŒÇÁ0{®QdJÚUÌÔHEݱ¥QI·Ï;±È €mŠ DÕçm79ŸT±a×D ¡ÐûýO2Æ[’(!MçÖ÷÷çœòõxÀ`c<†§äôc 1á ƒ‰u­ÙFËÃÆBÆhsúÒFyFJcÍó”©~Þ">ÆqÌST!0Í£bj€Æñî†)rU {Kqê)&sH±™)("?˜çóÝ'|ã1ü0fHuDR=ðíñ Ä©‚Œ‡¨øÏR5‘9g¯f c "QÑ©À$¢ÞTêò¼ÉTËVÈc Gf9Ó*8f^nì½yŠHôx¼±êÔ¼3^¦7“ú! ‘¼™×+—$.n4lÄ_˜æùœ"j:ŸÓb[œÏ§¿ÜŒHHÇñ8†…LȈ§¨7˜M;ežç9ç|‡úðàqÚ<Å“ù~ŽL>íKí݉ ™‡©é "Ñùþ<ý9ÏSeª*›‰ö”ÔÐ'p8[h]¢¸Vy L5#ptOù«h$R8®€4 Ûºågx“ŸMóÐHÀ{aÁ êf®¡UaÉpxéKŒû ¦Û‚\¦Æª%TKQ¢8ÿAM w¬ÿ AæÊ hÚ Ëy½~3¡ —~3ÄeÉjäÝŠÊ×Qµ ¬€;$½+«¸DNÈÉɶÖ.2nü¬lî·VGF4!3~0­Î͵µÊÔ¿ä[·Ië†ÞÌÙ§¸ÍÅzÿ¯p#øw›á+Ü ô ÀGÇ€>iè*ÿ½!àú¿ûñò³¬ý¹xˆîϤ63Kõv€E“9B¢ÕHƒéþÈÙ¼!‰–¿#±ívlÅFl¿ô(|˜Ûÿø¥ØÜÙj·ˆ@w[gä~µ­´ .MÒú*•uÛ±ü’‚HW(Ú=˜aCnœ¨|õª%Ö Uñà–¸RøS9ºt…Z¯áíPùf"~9BÛ…×õš’û Zê W«^Ä5á:½Y]}úÁ±Œ¼ Ñ Û. 5Ãß±:àä`òz)®N€RÃÑ(Ù@Žbݮ٠´­aÝ#Rõhš)aKÂ"ÿÐYbÐü¤Ú~ùÄ všŠad¢3´Ú®„ø#¾&ÌM ;ß·QJË @¿Å´•-þ"öönSDÊutSÝÖçîÖ¯»ˆµ8æ{µ ÝÚÈCºNVÎNl¨¼ESŸFô#ÒãqxùŒÍ)üyMùQmýܺخ³¾hfZ©¦=ðÑÌû«*Ü4·ÇºR•‹ÖˆØâh9M/³¸d+¶nñZ7¬ææm†·yÿ/ÞP]ñ¿¢ðowü%X ´x‚]?â°WÀJÑSÚÖj-¯3[–UËküœ%†–.†veZ»FV­ë~iø¯I ÐÉ?›b×âå§V©±)†U ýÂl)÷ÃeÌÐÖ¦‹ŠT϶2ýõ¿2C[ÿî_¤ÛUc_;L„iN\§{}ô]–G|ñ=¯5¹ê¨È)gA9oïß èyM6Â?å¤ÿï¿ì~@í-ùã_ñC«õO>ok‡W|ñ²_íR{^j¡ëüµz’³­Yp§Ï»RŸ‡:Ûø6×ꩌNQ } œ¸Î‰ù»X!r“?·[/V—Õ l ÑÐAí>Aå»ÏÓ ù4<-.FŒ/\ •~ ìE-¹‰º<{Ë) ^{ðvþm½'ˆ—üý”Àÿª àƒO§ýM¢ÿ6ÐF81U%$k[4Ý–Ÿ <‚ª9ßœ\lô¡å‹›ãqXúç­15¿¼Ð–\Û;Q«ƒÏ·Ù` ¢Náäfu›^—Khã@ä)STÙSlûÚÕw<0;*$Þ.`‰†œx騢zS‚®‰Ã+mˆÞ)©:x”fDôx<Àsnî›s¾¿7Õqþ-Ììlÿgf>Ž£o×¼] 6Ó"âýÆ–¸|3{‡&½¶øL$¶j<0q‡×»»ß UðÖP5c¼¿¿û“÷BBT5~û" DU`ÉeI¦‚)$ XC … ÔÈ»Þ?¬ªH4eâéU¢þ šƒwbÂ1F ].zÊ:\iÑVíîÐô¿”`…W:…àÜákúÌòŒº®pŠ(¬×™ €x0`´I#Âq<ooÏ瓉­¨ˆª"¢ÊÓTéËâ¡®(5Sbçwm0ƒc %d?2‹ªƒž¢7Ò‚ÌLÄœ0u"…#‘€üDD†ŽOPÀSÄ©öf ÀÁépˆ:â*Ë"`cÄ̲ „ÏZ ;§9OUc&B± ;«!## Tã¼i=x0 v¥!Ð[ èC;$b »i=¨ljb1%˜ç<ç;317/)‘éŽÖAƒ ÍÈ»38jcÝÕ? ”LíÝN=Íм8Ôàí<˜€«ÁLUl#æ^!j„bFÏ' ÎSt F>9P=eš<ŸÏcã>{Çã˜ççj뉓ÑÞKÞæ0S[ÞcÖj>›6 ¤ ˜S`õÓÖ‘jØ™FT+Tó&„'d+gН‘b¨+ŠÈí¬ÿº~#U [p“÷6óo©U…rÚÚö¨;Ðr{-ýùP;Ü?î·¼<ÇüQéîûпwPžtfÎk€ê„¤/øªuhYFsé0·U´•Î`s~:îúÇä­›Ù8ŽÚýŸçY?=ÌADÛtÿ‘ª*¾ßEt³¶™‰LßËžóœóô-©¨L§„óðÇBÒUú—QÑ)Àl¡¯ŸoËë æûÅ£¸ò³a^/Þ1Ž/o1Æœóýùô§t‡ëÚõâ»zëÝ%X÷#n?Cæi >àûrO•–s¿ž$ÐFDÞÞÞ¾~ýš×žóÔ¤½«ÇG Çãœ'¾ˆúü}üö–ÇLŒF†ßƒ~Ž‚ æ:cñd•R¡R•:.Šh7ý÷!U}{;|¿ËfDÔõI”U/\$’z;©³›@Ý?[r'ˆ f×¢H<_Ì~=CØÅYUã¤!q.FÂã8xeþ8ÆÞÐð_ÿë?€è—ÁÿA³¯ÇãDVU™‰íµgtG8qyÜÉBùT`g|ÁôÉ‹¨ÓEk•VST"ru2†ÉjêFó<Ž¢ 1"ž2UDU‘@DQW—{6±–hë¤`C|œç³ØöF¨&:=¹0ØÅ&E‚ü…$ª bƒcâP$P´©“Í›…ãÄ+·eDñÊTQLaãR8åÔa€€Œ&ò" ~ô¤8K:¬6ä±\Ü@UrG¬"ÂÂÈ/‚‹Db83ÓùÔ$n© )²Á4S³1ØÄ Ï9ßßOU‰ÓäH("2O|3UÇ¿,EÅ3 #Â4ˆ§©¼¿‡Èî'w2PñškonP„óœÎAbBø.6ÏÓ%ýÁLf:#Ee¨h&?Ô €`è2RŠ6VÓ5êrdXö\HŠåuËž 1ù¨Š(ÄéÕ¡&ª ¥o=S³òžÆ²fòÇ–K°~2ì#,í¢cW‘.›ò²\ÆËÝGíÔç³iëÉÍb²Da@ßÛ¶ÃÏR|nÊ삲´@çR7åV¬…ëø{˜ IDATÝs©FˆÑàê˜Å,I^Î?Õq*i÷yè²~ýsá_ú÷{†ì¢ÂÃà¹/¹üý™tõç2ÐÛ3‡[ÇÀóÊÁ·u¹ è¿vc#¬X§yÑ‘ˆµéˆدšÑgÛØÕ²eMä‚ÝÀüú`u“:¯fûÝ›x‚XƒÞÿÞö™†ýÝxÞºÊ/χÒl9µª5%è¦%UBKØ«R‰ïW嵡¨ê"¹Ÿ2_]€F€ÚÈë½sfWs…bG„-§!›²ÂÚÊê³*.×tõveÞ…ÃôÄyd3Ö¶›…UŠŠ™wl‘èTž—ywýHMC´ÿjý"ÁW [+»¾×f\>ÎI[ß–—œ¸z!‹µæ€pÜiT*ùÿ!2³ûoÊ÷ºÉñ‘è[• Êuï²ÕaiyÆWÅ÷þûÖl®ðQrá·ÇZ˜—9EØÁ"B­¢õ„i•€FþM‡ 6Hp¡Ã’ƒSÈŸúOáæC_\—m·ÛcöŽ­¤LŸZ5ï ¯àíÜ¢êˆÅpfe22ÞÓ¨‡c"D¸ÜP®Óq³Y•}Z–)Déz½?º¨R*åš!­Š.Çü,º:rä™ ?å\!ž{-‡…eõ窺fa5í^é…¢ý{¸Ò?¬+Ò·˧[kcÂ6¦©‘]WxQдÅ>¡¼§]aAëc`„¶$7a?2ñ%”·IÅ.á6‰q‘á+…§ÇVp¬¤ˆWý¦>öˆµWÊAìZÊR—Ò9`WXaOjY†©¶Íœ…“òJ¹oTÀ^Àå>ôÆß:ñÓBÝŸ„ÛØG(ÚþK߯-0÷B@³»Ìú“š»õ—«9çòlÿ¬‘ÿ/>þTÿÿŽÜþpÌsÇût=âõ¯ïMÝÿ°!àå“°~ËÂëRÚŸ¾*n}l.¼/.`êcXæ³{ôÁœÝ¡õ×áN±SuýÝ¿íBzLÛÿ^@PÙiƒ,Y-è>~È…½b§3w?~¼#Žâ¸œLó)pC-©?9 ¶¿/PQ ) b’]ö°Ú‰û9.è­Oÿ÷ÂàçS/GG@î«bÃZ[R³.!wâsÎ9gî¹iy},Ó¾”‡‹Ý¨Ùyã·¯)J·\j©´˜+àö_/Y]³`qš? §8ÑÙtSUScæ1¸2tjzAýØ|GÄ÷÷wA‡©IB'³®ÀG¼Wé´¥Å#!Àœ2çty½Ôÿ¢N‡Ñ>Ÿ‰Ç:í·ð5ìÆîûîŸL??Ô±ß_·óœ¦ËEè3߉úÿžç©ªÇÃg!næ­*‚òúÀôãñ "5jÙ@•Âûÿû'"ÒñµnñW_=_–ûT,΂ń"•õõH͈xŒÃæYE¼4ŸÇßÞßÿ)ïÇ /oo`0˜Dô9Ÿ6ç·ç;ñ<ˆ€Ç'Íf=º¢2°™ —_}O¯"äxŸ‡e:毉öu_l“÷Ë "3R$t¼ªˆÌÀÑ‚é©ç9‰Ù"€¨ ¤ˆŒ„¬fDNþõ%¾æ:~”B{žQ lz €)ڃƔ•aªþú Æ6׈xªèyš {ŒÃÁ;ƒ‡šw€ $SñmÇ D•˜ðíÁÇxœò1“>8µ9çàá¿F;7ˆZµN5L!eÊ$z€:ó<“L€¨çi„‚„YP3A5SSb`å¬6B"‚)úûᅢáû|<˜Ù½ý_އä1Þ‡„HS `šN™Ó3¢Êô DC™2íiFŒ ¤Ç1|)ש”™ÁßÖ2ú"1BfF R1Bµì CQeâ¥/ šÓ Ö 6ŒÖMÇ!5‰ë¦ôSªhPoPQ · Öi2uY+R Go-]ÐRe²ì vwZTîÄí‚‘t³p û(À6(góµÛz%|ëR7 '_Ô¤(6X\g?¶¨z–z÷ÓR*ŒÖ(ýÎý@£(5°íÔW¶Ýå#4„ÕÐL¯‹•Œî ¶—Mc(­ºTŽÄ×XÇnÿ‚wøFkGE{ÖâÁ#öÑK›¶rÔ+jÿN|îÿL{¶Òë¶ÛõÙ*ù´*û–©æÊ/P6°“M¾Phš!ÜÇNØ=zË™¶í@j«P¿#ÂæÍÁžÄIׂˆ7­(ìÃnYxѶº–¢Zæ—Ö bw[~ý§­x‰]â2†¨;(_ò”Â9 ›î¹tçKh`ï¦e§-½.˜ü¥ª:bëÙFxQ\üQÞ·è<`7MíæÓÞÉ*Œ) Zƒ9\õ—ü®mîU{ÙU´»š{_œN£t“f^r¹³I¶7r=õnÙî ö Z:œ-àHÕàåŽÂ>BØm­éOß#—kÃö?Ejúò#O­ {ʬ¥ƒˆ þä§÷­öŽ^^/šcX=I´Ÿ†û|z¥Q¥×~N£·ÛÐáÃIª}0sþ:ÜP;cuˆ tDfÐO’¹aU•©<(¯cë•JË´éÙÒ d BbrN3¹÷´7sN·°ãpïÿ=Ä];•ìb . À!&çy:ÇwÒLöifsÎåû£åºé&Z3#W¾˜@}ÎŒ€þmÞÁĘ̈²p]aÂôyƒ×tÇ}™>Ôôyž„xÎùÒ߇ˆÏçÓå­ã8j„к¶¨4úæò þƒÌìù|Ry‹ü/çÿ^ŸO¸8~ÎlÚå]UëõÌCήFœßÿy|ýÏ‚T;U;BíÆï¿Žog x w³‹ J÷ЈDÕÞ• Ô•Ò^ÍZ\ ¶÷Ãë°÷ƨ#Åý°…ˆ³NKUER‘)’ík^OÆ-7ã¨!–W Ä2öíÛ·÷óüúåË·oß¿}ÿ.s2ÑTó¤Ëïßÿ _¾üö1#RÑb‘̇<ŒŒmÏ—2Ì)N[21u‰xÍ5™Ã­] ¨Å !bd`§â)2˜UtÊôk0¹V+*è„#ï𑉩Nлe*Às# °‘LRQS›0ˆp˜‰Àô¨”òv E„È̓é}Š}|ËÈ:ÍT¦ª¨!x¿‚M8Ïó1FÞQmÐûûû|ž€DNÜæað>O¢1Øá*2‰ÈõÇ1ü”Åc0‘˜MQQt\!>ϧ¨1Ge*Z]óx8jV`NAB"þúå«Ï±UåQØÒcûâÊJù¹óÍûîïr¸-…·±¦_æÛ}°fî –Hœ"p¾Ì2R©‰°ƒWòœf]0׈ýׄÕ÷ìwÏØÂu›|Í7è½Äý—½•¨^aMxñqÕ§ç6ª ÚéñnhɦúªU¸oBïL§ž6¨gMT±+@Moòúê™.•B»^½÷¾yÆœ«ß–£Ë°já6B6ô/_žÊe[àû¶òí•äx•ʵa+Ex-eâ¦w“vÍàœ²Ž*IȉàÁŽ]Zµo¶>ãˆCkµ¯›»@+”ØbsùjäI*ÅØŠœË0^-å¶Xˆ¯nl™ú-du¼©ÎèÅ­zhgÉGD¼u­Ä2§—Ê"ÀW"Ë ˆös§mF[Øiöa´í¤ ÊÊÛ¥ÂFo€°Z7Zâ­žÞd.ýn_uûß'f``÷u¼Ùþû¯Ø?à·VåŒÁÜ÷™2Œ?Ô…_î§}ý©Ðö+ô|Äëîtc }Â}y­µý,#o«¨ë_§þ›ý œþø/Ÿ ücóÏ ^mï†[^*ù´†¿ò„ðå{GÔµþåÖ^ —¿,ÿÙ ëÞÓ>¥°Š:]·Ñk³¾Ê¨Ùù/݉u „Z|f½oÂÀz5Š(ö%TÎÜá 1ZÜ ¸‡ôö>§¿Ä•O0 ݸ è‘16ZU€…;24®„ù¥@y›=t>ðÅk5…„ý¥»e•_]Îýöâ¿ÛWÖß½ÇÁ}éÂÁ‹Í¡ÔÞüç{ô€Þ‰0-¾ºJÔÄ-›è˜iæ†mñ¿G†ñ8‹ßoeŠwˆP€õ§¤ÄWÿñ8ÜDSà$Ž*[ ‡êNEŒ“š+û¹a"b¬h2"2cúT™Xeú–YÕ˜‰ÝC¸Îäˆ8ŽÃgDdº•ŠÈ\RuÒRsWÕó|2ññö`æ1Ž.@œç9Æè,£~(­âb(w4û†ÛCþCy0 “ç º˜~Y[ý=s0ç¬SÐÿFDäŸÿ€·ßþKÕ 7àÝzæÓàÁ&:Æ8ϧe•0i >a…Ú÷¥ï\Úü ²ÙÁtA~$µûŽKê>Ê4 ¬ 2æuá[MU¤Ê!³ÿ}ùúeŒƒŽc$ Ã9éþ6óÓ"à÷÷wg¡011=ì‹!˜*ÄÓÒéÃ~„ d5CPŸ SÜ©¨š²*=Ö¬€4*Ò e#r:=GÒJÏçyƒ‰Ô¦ÊyžD48x<·"U™çt#ž+§Ì  Ç÷–œ¦ª*Q“ÀH<8|­†8Ømïó<Óqf6Q}×.~šˆÀ4 Õæ”SžÇãáož™†žªjˆâÃ1õšZT°a¦óùD49ƒ Èü™#Â@‚!ñ4U#4A&S%@ðJg¿œr ª33ñ`öبØà$+*G~XÄñpªŠ{Ÿ¯H¦ú”óÛ·oj¿3òãímŒæ5æ&ÏgÞtÍg3„H j ç)~§”)Ïy2sIƒØÐ/oàÁ| ÉT2Sf4ç$Aæïz ÀX8`Uue–ZÞòе} yª¦TaáIÝ}J‹ƒ’ÂDÎ[’~ª¦”í ‰xëÿ­ô ïs "z!”¿~:JKÑ£÷ŒÔÐÇá[•*ç ªq~ü- Y¼¹%š}(¡¶þéŠw¯_Ë…?‘„!-o¥vÅAb“épÏšõ`{óè­JWÿq*¢o¤ Êî>k·~à"×îv6H'”4º!‚»ay3ðµ;ëè X¼{?hGõVÕÅ êˆßÒ1ðaUÌý[wOéu¼òÝÿà<œC)÷ͨ] …ØŸJ#Gõß›(tÑH^CoR-·ïšðôiÄJ´zÛ ¹)Ö¡ÞT5K™Ñ[ü"¤–ÈìQƒu#¶W¼‚ŒÍ­t©8†×hÔ¼çü®Ù‹ŸX-iŽvÂÉ­5án6üÜ'Ù_mýPæ^>å>:Š_A{bj‹ëhäi«Â¹W•y‚,öÑH;å/nÖ¼·U{‹='´>>…WÖgd¯k®<ÁÅ´&mÉ/*—TÜÞkÞ˜·‡žŠAxÑ] §­Á´Lc!V=Õ’J—vß»/ø\þôÂ#²bI}9(é1Ü6X 8ÞOW«¶ÙƒGOèN/)ÙCQ³‡ËÄc¼Ë|xèWŠwP¶me{ {è¢Ë„Ù}×mÉ‹^•NK6:“[azpÛjà ËÁÐU“AvÀÀÞ<¼(ù¸*ê!S)³Étµ¿é1™Ã©kÍÜŽ$Üî#û)#‹¨–x‘ðh0L÷[O ·åwM@mñÖ®%¿ÅwJ R6"¢7 ‹©¸Ÿ,Hä=ÍÒ/‡ŠôèE±G»rE”¬}l—ë6VÏ÷:Õ,•ß÷,ÑÁ1®Û»O@ª>·ò„h-DhÐoãmo µ­‹9ù–i¯ÉqÐ`F‹~³L¬›xÓnýW= ÷˜Üª¿Ê2ѳm­¿-)@+– qz“oÜúÐy9x§q›7X]Ók×{)·ÏÜßåöÝŠ¦_ê·om>Ôë?·!·Ì”Õ奂üIÙÀçÚ÷®¦á&¿á‹»U½fv)°OÔæJÞvÏôԿ¤ßî9Ÿ8ÿÙÄ/`‘þ»%ðW ï»Êîû]òÝÂøraû¨lSÿáÙçæì€†Î§þ}k«¶áû±@sô´ÔBµ mÉãþ`½h ˆ³ÉÔœ–|OÃc·¸÷y]¸ýÙ™hIˆÑ1áº=Q3É©kü¶jíòFñjÖç_FÍî—qqÊ(‚B,Ìáâçøß¾d ½Rÿ·™PXìì^ü+þ ûU ÿÅ#!ªÇàËUë8Ë‹5>¬¹U*Ð|ÀD¥(©¦`FDtŒƒ˜æy:9 æä†^zÃ4©:l»Ç·Y"¢2³îøHx, 3¤!Šø‘Á…ÉLÓ9³˜Žê~ì{UÉ_–`0©Zy£|C§ ¦Šèe 㘈v@ßÍûí½¢ ûYÔ;Q'1û´à<ÏÁƒÇpu¾;ý»OÐOåãHœot8”dš–|ß»=¶\S–î‹©U¦XCÇqøsþöí[ï*(<¥Ïi<ýþ|ÿí?ÿ·ëÚ„”aôÔ©< R·›#Ô@}’Ä’‚‘ê``¾Ö!,‹½™'朅 :ŽcqìêÝó+¤ÿ3ŽÚ> Í”ˆZ:Ý9I9è Ç fBRˆ†¢º[<ÕMÕ¼\˜|ŒLžsž ¦`IòsøsNö)æf¦HŽvU}>ß}§íÂÐ15%ãñ`@"äAª*‰ÌåôU…!;ÐC6EÌÇàÁƒý¬Ià©0Щ6l0ƒ©¡8|_Õ¦Lcÿ8˜ *jÝ1Ãþ!Q1"?_2ZOoYB£u$²`ޝ@±ÆMQ¼P!û!y°0†wÝå K~'!4K;f71¹a«»µÀ\ ÄF³(‡f’ËÕ0æ7o!n‡+ æ ÕV߉ ÛÓ3HØmÝëĹT­æL£ ¶VƒØæà@†ëÙÒçŸZæÛ"&”¯ Œ÷ƒRmv4I½Mu ¬Þ=ª½oŽ=0ã „[a˜4‘Ò§¾üí±Í¨SaÕ›©¿¿î½¸Óùû7bÏŠ•ÛEœO+|á"3”Ñ~÷•¯¦èXWâ³óBnMÅ\3Ôâ?›vûv¸0|çÍs™¼6)oB!FN˜iccm‘ìòRÕ¢zç `]?e2õO\¸ë=îÖ"¿±û¯qÏv;v–cÝŽ{ö{ý.ì µÁÛ´f{Å:NI¥t•W…ÒÕ°¹þkÈq¯RÄÕêaé쵂ٴË)vw`k--ÄS~«ƒÞC¶ó)î6}‰g(!ž¦¸öãÚFìžÔ¾:å‡Ù)ÿ¦¶~o”([æÙYý«ÛGq[ ÛÑ4³[5p`ùqmïEÐ|GòŠŠý–³é”§Ë¨êå£ý)k΢:WIB2´¾t$:* ›öÜ›‡ÿ?so¸#I’#iRH5÷ÈšnÌ.{XàÞÿÑsƒ®Š7UrJ¥š{deUWuwÐÓ•în¦¦*ù„@Æp: ûãŸÿDãÍTÝüßQÊŒ•¢#0sn_óX‘u[ Âñ}é0_l™B©Š_ÉoSL;¦ëVÇageÑZ'‹Rò;—¥ƒ“øR¦°k1¸â›.7‘]’(ÙÎ^ôZÓB¾M˜è| ~T ô ûV=ƒMبê°2¸\] u!. ò”žÝâãnåëý>†'îc°Ý{„ÕJë3cÿ|Cµ ÿó`jæHÅ'i‚áHð³É4ñDˆqi±"YÜzÓ¡I9/1Ò²µþ¤’hÅšå´Õ¢,-Å¢¹ÌâÃó¬te0ìæwt‘šKœ`³xÏNu׳hr‰r |Ô#ŒxNKHv»q¾kJ•V$gŸÔ¬cAVìJà†aºê…@E•[f›ïÿHmïµ¶`]ØjÔkÅõG&[Ê õŸ^wužžËß5µã«‡¯äðý .3€?Pz§™‚|]–ôþ`üsføcþ€_WþíÛ=ÛÿëºyŒýšî;£Ë»nû Ì)ú={ÿïÚå} ³Ì @`nÖsÙÒ£c0‡·`¿s¼¯¯Ô¸s~f®sS`ì•$ó9È òƒZø!f n›Fo áIšO U‚,a>º Û8ߨG,øík Î°ù|S´6Ëtάº’"/€eóÿBvG^[™Ÿ3!ö«öÿïLéÕrô‡&І†³ Ë‹œî€<ÄÅniz“ËoDìçÐÔµCVQU4áÌì— Ö¹Æ÷@«Øv¾Yµ¨öÉs‡yz÷,7± mçܹÓZÚánš @¤C39ëÜ!³pÍÑû Ì žS×67N#6G ¢'#Á¿6¡÷ÓÂኡÓQ‚5T¡=c “"­µ£5U=n·Õ=PtÊòñLVKU pÎ t¨­@}dxÏó<Ïó~¿ßowa ¶Wm”æÉ|-:”„„Å­Ê:TXL̳B~&õX†Ë—žöŸEÄèMŽ¡½y þƒ¤µûýÆ,Dô9V%¯fòGárlSHSjˆløÇzúbRç>Òp$TZ8ë¸å\Z¦¶²±«Î—¸v4çaĜꚢ„AŠæ÷Ù€Äüѯ1RõŒMìÈ “’ÝEÚMDÂ4 ªÇq6Þoôv»‰°˜çU"òlþY˜™ÂOhœ'WÿJÞ­‹µÏõPjM@|ê©ê.!5èÐO:›Š4Q‘I“Æ¢'u XpŒ>úСýˆY„I-Æ Þ¾k:`æôùy8ñÅCµ+3«ÁÔ˜1 3Ò.#}Þí¦C•Áî$#2£«&Þ· 2CÀ`õ…ªÚ¨y•|Zr¥ªYƒh%8T~nc¨­`Þ±bKÙöȾ¥u¼ p:¢QϤEwŽUyZ¢tšéÀäÙ+~ÎÑìM¹6ê3ù¸:ZÒåG_/õ\–›ìf[éóçʇ)‘¯!@m˜È F¨´ˆÅe]`„!´æ•S»mãÜ6'ýVkñ\[Mùªü9Ö’»])µÍˆ•î_æwÎoTÓqü{‰Û•ÅVcÑÇN»ôó° ÖËI8`&lÑÎCeîïóE&[kQa]¹ae¤ Ë‘‰òƒ 8f”±“w¶]$w}ïå7>ß§EAôÿó]îêØÈ•¦ÚÍf5÷$ãû7ð—<ô¢•SYý²ùÀŒJ=µa=CŸ#îTùùÐ ´Q”‚Z“}}ÈàV®{¼‰°ÈÛb¨W›íGYª ¬‡SëAßjtiÿ«hšd5ÿsñÍüLë¹Ù@YPŸÔQ|ЖŠp®ånõ¹Î¨ùà™?öÅ͉ ó<ˆì!Óí›ðnEZÏ犞@²~€1úÏ'âjØš lÒ€hÖ˜QxöV6ò- +Á§9Jšc@ðó•’¨§Ëòˆ«¶M…±†Má¢s²òìÀ´¿¦Ç|rÎéŸå©´øÀí*¿L ¬üõ-:{•|‘“0g/£"׊“®,³”Ühá"œQÍ<^F×^Û 8e/9#ö¥þnf? ÛW>ùv¬þ&ùx{éß§©¯Ã×(ÁV ðÝ1À×¾÷W/Á¾àq?Sûûds|—°ô‹þ¿ë·øµýÿú ?xþ˜û‰ßOÏEV¯.`l牧.êò«Lò)T¶ªUbÇ6DÀš>XI@¡œ-_,Ù>³NˆêäÏmùˆÞ ØðúÝ›[5®r<–y X¨ÿ3æè5Â…®V:°hrq§¯FpÇ×í1*øŸÆ9šAîoåý_f>¡m£ºÎ óXñlšAzä¾¾^öµÔ¾X_í)½ð½ñäŸjËh3‹æDü `5…YÙ Q¨i˜ñÉ5-Õ8Ae0=Ï“Çpsº?ûîˉ`é°,|‘þç^´ðU á˜Ex ­Ïs³ìÐ"oH­áò¾–3"lo¬ŠJðp,˜xæ´æ–Î(=õ)C‡vZ´…T¥]Üg棵ÏÇCuˆÜŽã` ¡:f¦S½¸ÃuÌpë}AÞ“ªÖ”@þô~FA™@®GÙ™eöäÁ'`íª¥‰§žý{Ž1Ü)ÿööv»ß‡[†ÇðÁU‡•‚fv¿ßúéí?þëƒ`©[ÙÄSp“ûí&ÒüO[8‘½•PÙýÓ­… d¦ ?ý* ÓF¤ÃTM¿­5„ÁÂghõî­2†Yw¬s´—/6±¹ŽQYÚ {Ò"wyüá‘Â2wòn[‚…¿ Íš°ÜDÖŽCoÀƒ¸µ¦J~žýaŽq‚{èãHé¼“ìíHL“ 6DÂóÊ•ã 1>UMÇÉtcDü{¨Ž‡ F"LbUܘ!‚AÆÆJô®@—&§t';íFœœcªç8ó“7C‡üô†NÃa5ª6t ó+Ö™­ö¹Cnß¾Ýøxp„‚+,ÚE‘ìÿõŠ*Ûak~%†æ#5þÑŒ"I/гO<˜ ®<û8¯<ݵt,5¦JF/!¿xIµÜ½‚.ˆéîÔÂs°ò&çÅ^Ò\Ç}éï³:k¬ãÅa %š€«?9ƒ_ÔFÈÀâiwõåa†Œ'§^ ÞÍEÓÒ2Ø‘=i0{:ÅRÚ®%Ü´«¤î9cC¼ó‚®mÀÓ›2;Íf/YBÌJ“,í8ÒM¥œ¨U¾9]Ñç×ë9¯Ÿý’™]#׎©*™gN3/H¨xÇÊ|qvÏ&ÿm}j«¼œÌç“,ç’¨k­QîPò5Fc°ªWká¹½ î”w†H£l¸¬Ï˜èÓº\8M•…Gh¯J™]AºsTŠeÌÈ÷Õ9€XsµÒF)fSUsþ‘ú¼U™/œà)4Ïw~Z¶Õ^ õ¡iû¸ÖL‘Åú_ îg$ù… ÎOë½m—zkn™=$d¥wÊì„ê+¯6s³xŽÏùÎÍ„SØŠÊ}§4Ö ¼º’­„¥9z ZM 9 ÉÞ‹\´ÛEyÝ<\â+¼XÁèµVÈÛÚæÑlaZÐú±\ë°3ûD3>uã)P}ækº™uîpz5"}AÓÏs}½›.Z6¿À±—ÉÃòÌMŠÃBDX9nãù™kO‚ÔsWC<‹÷tˆh¯áYh¯u!_3t‘úê‹ VÀÖ¶`/¥öMz¶‹Xþ•ù|WÿŸûi€ï½ËŸð‚¤·ëP\÷#—d¼ùÇ·²ëé·JÌøµé…ýZNâ÷ =þ¾‘Éö{ýÿŒûUoþ=1À'|Ïì¿ñs.åyœ•ý³{%ÕAÂ^á{݉]Œ`i•G>ܳAÅ"á令 ÈÙ&—ïp‡å×:bºTØZ#"FË2ý^Øë ©›(¿$¿æñ¦tøp^ÖÉÃE›âìTðE,çš…öä=q!'é$“ÎMh”ÜmŸZ¬Ön«ÞÎ3*¶RÚ_œð+b½½ºñ4Y¼&þÄ1`›'sÌmg^Ug€ÏTÃ1£ ^ãÌ,«>+Š–x…;çPÁÌFt6•,”ãƒâà¸nWª×5V^Å ô³›‰™ª5g€¯-†V¾Âõ…xS‘i!XÒpùZ̓.‹£Œ<@Û *­÷çyúK{{›M°q›úž^5XóÌ캀o8ZU0³Ÿçùññ‘ÔU5¾}43f‘*Ùk)4¦½±pf÷¢àó<ý|~~þòË/Ìüí§oSâs¸äPÕv´1Æyžù‡`œçùþñî, Ö³uà‚Z&ÐÏ?ÿüþñ>úø||þå¿ÿµû†³,<‹œ½{ 'ƒ´ÌÁÑ í½ ˆSY!"† ¿øXÄX˜„IM‡úòš Ï=øço˜Á‹ 4/Ÿ@Ìi%ÏdÔ}œ§™ÞnwAÉÀ;\œ°³§ì˜rFQF(#kíÂgªošÛ!hôŽó|¨Ùý¸ùŒ6á÷¤ª6ÈàwA%r’‰©ˆYŒ†©ÁpÜZ¾NšÒ&ÇÉN@L]‡ê`ÜEb,bïÃÕa£›Ò0j0 ±ªö³«š ãjC¤LX†Žn:kC¼ju@ˆàã:wš‡GÀíæï¡ãÕåh͈Ár»ß‰ì›áц€>Îó|0CÇ`žmDæ&6”Aƒ‡c2„@ /6nÒn÷»šžç#ŠïTç^fnDúùø4#‘f3µ°Ž½·ÁÝAKsºc†š°ä@š‘&Ûí:>?Ó¤2¨ÙèÀ DÒØñNö·1˜¹µãý=:¢¥µÛqs‚‡0Gc¹™Ã„HMÁÓAh xk…¯ C;³ÜŽ#B)Â4ëXÿ 21‹n5µ¡Ê|°  D‰@Ь½ÑÁâüü0´:µÖuÌlMÒ-\ ù H¯¦ù¸FÇdë„·a–OZí$ jM!9ÌSí…ˆp²?Æà.‡¤¨*yÉ{q.=”n1LŠ€ÏZÈÔWªCseŠíù|[ŽÇÙÍ;ÿWˆVA’+5gá1L»žé&”ðº©ÆÄøGo6: ªê¿ v˲"ûT|õTò¯ãY‰RåœÁÊ`B6'—í ò]ßñM_6 ôíè¹Q£Jt¯OöKíå[Àî‰ï»ôÉ_´¬s\»s \„þ†È¥·¶øÆ«å½xZê²Ç4ÛéÃÅM„‹³{3›«yênNìÆG^nm/ïw£ÁÖ-I¯T˜—æÃµ?™… éH¨ ;&e7 ¤óEqkeAxêbî]Õ¨LP5n[jùR¦±,í2ªB*8ï…!ÒkÆâõ$iúªíõÌ)œ»ó‚§í"Ãn?ªÀÃI”ÝŽ•[¿ÅøBçàøqØK«JwÚ2rU›)SS¶UôÆ®­$d†viï˜ÿ¦v£R7“&‘$vÞ"áÖÄò‰KQóÕNl— }JäÚÇHÛ87 x^h£«ÔÁKÓM‡U|—RïaÁe2Z°¼•…¥<3ç¨{PiUÌŠÑP*¹å%4sBiògÁ øµ3õ}ñ5«³˜9ßp”u( '@¨b^1NZ!nÍí^½9aÂJ-ªÍœ Šìk«}ÌT?e5³]ÁdÿÄòNöªU¥Ë4iúâ£z΂¤ÑÍY¥qYík—À"ö[æË·«½€d_1 Óà••6ÙW¼¥À)›)5G uáâåßâ@„>s¹éjPnMæ°daù°†ð¯èò>ÜÚñx²|Ïp%)º<³âT/¨i‹Ùà‰Ô^ŸïÏó‰}²[Áq§?×¥M$Û#]¸FßðTóS‘#½‚/»óc (ó«Ùi·ƒäFî"ÈìÍœ/¦#xUo˜V|*\,KE%&p'IZÓ±Â0t™²Àüކí‹ÿ”†Ytó‹-á3zW¯»‘tÊLÎÝë¤PUd:ÿýÔ@ ]ò½gD'<‹êŒj–½ÙZvözå2ZHiwý?›gä~Þ@ o¡\Cs­@v ›YiΰšrˆñXý 50TäH˜Z°K;Ìê9˜²àà[c7Ñšå,7- VÖ8¼ª™m-‰—ù\<·iNá-1o5Ü¥UÍYC:£«Qõ *=€Ì‰ŒyDs‡T­ŽÙTG†§½à²Æ”‰ì,7]Á ÔЖ ±)=ï8SÕ¡ZynLÛ#0vˆÙ+5Ú$ŒšEÇÊ‚ëºå81Epg4ñlÇÝ¢`ª¾7¹e.ü¾·×¢ô×_Ì Üg¶—m’Hž:E$°-BV‹ˆ¬ôÌeÄzIΊi¬LÀâ#ªjM Ø´¥•”ˆfîÔV¶rþh3{r¯…qokÜïéi–RÒ /ÂW¹¾ä„bÙSb"¾PS¬D§rƒ=!wñ…æü¾Ь¤éâmµ2éʳ›íOûËS°’;*6¹¾‡åÕàéñ_ß©ýñmûnçÅN§þáÞÛB/ ±í2ì{Â.Ù¯»û_ý2Іáÿ“p8¿£©8Ý4FDçŸ\½ûOú=ùÙWäºGýMØ\a_ ý_É÷Û–úWåZ«nìì ¢ün)ì´º{òrùáhßâbMSyóû˜Õ’ð"óg ¨;å÷__ÔV¼Ž™»œr’*I«á«ÄœÅO\‹,ÅÆØfj@¸À‡Øÿ¾ÿdÉeÂV5m¡±œÿªB(rÇ´3M³ Ê$•§ ¼Ã+¶ ^'£T@…ÍÀð °öÝÀ÷.ûÞUþç ¼œdUWHGv'Î-ÔpS,­¢¼M˜®ý,·ôFųö"ëªòãdz·P˜î£‡‘UUXPÒ—Îj#pï0À1u Z‡zÉ­ªúÈÁm×áCµŒËÒ°a™Ù´°ù§7Yüæÿ^‡‡’_+yžál;«W¥y¦–fpk-cž.99N‡JAœ·û?žçéo×ý~ÏòwrÕ¿ÛT€K¨jýh‡@þò—¿Ün7 ÉlÐÕ¡.Žãÿ=[kÑcVT’˜á½# Ù¦{Ï…™=þë?ÿýüÏ1ÔÌáÚæ(&ñ™Ã<œÄÆhèÃHGk`Ç'•V? ‰‹5"à~fsu²\ã-ê”Фú‰ÇÞ!Æ$Þd Dôx,VÕ1ì„òñ~g ìœÜÕå–ÞU%6Øõ>Î~öÞ½[ü¯ýëný<]ɰg?4C‡™ø7]¾WN»¥257i"L á&ª6ÌX ↪îP/g'4‘ãà¬óc¨pC´MÂ!ø~½“QïCm˜PÜ©”Gz“wk#“ÆêÄ šM½Ó»Í¨´‰Ñ÷ŽÂ-d-Ôã~Åýn{XDÑ’"%5ƒ©Gû¬½%@ÝÔ>·#ÁG0QW!2ëjj*,TúW^| úO_4ïÍ ¬–°PU%Í”´è‡éŒpne[:Dó¦ðšÜßrˆ[–5ÔöLç¥ØCAJ©ÕÊ8ÙK·˜ò¨€5–ˆ–×>X¯(4Ìð~^'ñù]%1ª;íØ«Uy‹vß.Í"Óg öü°¢+%P¶ŒÆòœÙEð­I8z¡3®²Šâ[´jkL;ö*ð|Âa?¾È1Ъj:%o‘]â&ZQú–Îúêšœå¬:ž#zøYë¿/hC{u|53°Uç]O&ë4e¤›d·ýÛ-taš”›É»âR±œAŠ­òÊ&QÇ× OÊyÜ;–Ša¶nZ¯¨ùžÛÞ¹==Ï%ù¡º¤œyÃjr¸:£L BeÕ¶•! ìYpÚ•K_lÕ–ñjM¦›Ìj£Fpê¶iÇND±‹†Hu"XÐã!çb1¸ÀJBÚºmö®"$Mçe<¦VÈâL®i‚®•Ùq¥ŠctçÁQ#Ía«,—}%HfN„¬,©™£ÚœÅ>“.Œ ?1Xd28ïi®°x¿Š¹èèõ¤¢B¾dæµ®yÙZk]v…ì-oÜP¦¤6æ,#Q*ÖûlØr”oS›Ž<ÿd9¸³¹Óçuêòpgåß5í^Qæa娳rÕäÁcÒïl·?çzIžUÂOžƒüØucï{éD×'.yôjʶ}äsr7åaÎÆªöø(Q/­±¶ÏÖ£§ÑçRS 3×xy@äÉz¶'VòÓ6÷{õDÐ:> ù¹˜§9Š€WÍ¥úò9‹L Fwe¡}­æ˜ ¼÷é,ÁÕ¤¿f¢³q y³¿0þÚe8gaÍ=¼‚½ Õ å[ õºOqÙ&\3—5~û·?bxÿ±Â᜼$ ¢ú>¾ `ü>ýï×®æ}ü (ú¿úª^Áþ)¿/þ®ß¿®ðEçóõڳ寰?×ÉÀ–ë©­¼×kþÉ%Sw‰OÓ3DœrYçðü¦ˆꙕٌ0xš¨¦s´…u.?a݈“Ù=5z@–~ë#ÌV;ƒX¢ *úS3ékp©C¨ ¼f«SÍó$V7¯‹uåC˜§Vs^FÔ[% -ÊÂ8÷)¶Þ­¦æ•k¦Ñ&µåûWçÓUnç¼ë ´ijìsÇ8Ƙ A÷î ̱ë5Q-)è4áf¼wŒÁ€öàØ ×îÍÀìÄE)Sšv ¿Ã¹Î|IŽDú#Šzˆäý£i ÚÚÿR`ö`xl–̬}XZ-Ês¨Ö7½Î¼'…Ùj 3l#¡}3Ö„£8 Ör2‘Çû¨5&C{?Ÿ§ë "⸊JƒØùû?¶Ö¦ÿ‘Eð\QèËìˆÆ©ªúùøô¯‘&ÇqøÛgÌÂŽñQŠKÿoooþ3vð’®à(üÖ•^¯ãvä¹eôàÿÿÿÿíÿü¿hô~v#5¥>>ÏÞmÓDjL.6ƒËìaâØ¹æ~Ø€*ÃwÀÒšßß/Ù V$¡%S–í37i™†VÕÏÏG=ºZ´7lª¦ƒÀÃUm™2K8 ýÓc0A‡òÔït Û›=Yf*` Vë '‘·£ñІ;ç©fBqfÒ𞬬 `2å$2;Ú«÷†ßµ]¹‰˜!FJNœ=Î.üxô!BGk`6"µ1ñl"iÌä1j,,xœ=N‚¡ä‰G ââs2«â¸õHÞRœH>Îó¦J¢Ã¬?ˆ#Œf›ˆœãü8¬ À:ìo€©ZWbæÛí€Â#8]G¬S` 3¦ ÀºçÌW9HŒIu +Y?ÇyŽ1”ÐéãóÄjÄ&MLÇãó<šRk€=γ«Ú°ãÛíÆàÛð|Þ?ÞAD,QS‚5†¬ Õññùè}œ³koMi‡Lƒ:TZ3¨8â ·›¡ÙqÜšðÙäìÆvô&Øe3#¯˜µ.ddÃÏÙjÇíNdÇí8ŽÃÅ&Ã/6í6úcÞl.­°‘¬ívÜ„Å×|ÄQG}êK`4bŸ x5¢c˜Ô¹Tú4â fJJœC õyÊ÷BƒE VÒêûD௦ÕMê¡d¤zÖØÃ_#’X#rŒî8tç?`3ea°MQ&F£‹´ ½_åõåÑM#ÚÄm¤žËÅUløë´‹U,5Å‘h-žÎYçŸÛn-3›­ëÓ´1¹3>™(eÃßéþ´›Y7²üÔ ê,£»uµí3‚0;uRœ[ûøTÿ§êɹ‹+®Ãùã rwƒUl"J&•æ("u+zúæ< x&^aAŽRù IDATÑr溪ϖy³×Êõ«aC swŸÑ˜Ù??CªØLƒû«îÙòÉYµ/\¯LLœÚJz | J X‚÷³~·{>1Û%®ÖšIn¬wÁwžÞÌ:Å¿êhÕ…@öä*µ½Æ’v€ùžÃXvóálj]×@9½$ϼiiœÑ:ˆb¤²¹™®f„Ô½ÇËñН—SjôÅá„DA†ô|5É»o1¦Pì°õúÿÉ6]h뙥i+¾Ÿ\–m^³>ýrô¤%ðaýªƒÀ:кJ¤…1š³”ÈjŽ5yMA`õ‹°¯ á… FbŽ©JYQ¬8SÒk2[§€õFYÂ9Ù4ØÝz@ãyßå’Åà{L*GÔÉÊ_‹æåQÕacúZ‚”E§Óg¹ß­5EäâÕ´§Ž„u&²ššÝP5£ñHsšY?®áD‡D’¯i;ãàvûyà·ÞǺ¢@D$,ßg«ØvÚrQfýì:†ïRVm¯Å„y|»Ô‡'yžxfW¶Y³#eë/j;SN}. ¶ç •í °ê-«2[Ž.C/A®Ù 6ç–X5õñz„„ÊÏWµ]à´UI1•„¹ÚŽ™ó-`ÏÓb%;™öçÍø¾—"º[t¥ýø–;ŸÇj@’Ÿ‹ … ÛØ¶ŠÚçµ›¢hèµà7‡ÆIã¿ý€1éÿ¢†WeÄX Ÿ^*¹/Üf/†å—Jƒ'ƒEwž½ÿ?ªAïÿ×SŠ'U/lÅÿröùÖüküf¿ëwÿ'LþŽ¿€¿_Ò}.ù¦óÿZ-õ×þ]}vºàs¿õºÎ"ç¸x™¢âÜ­\ÖþÌ­»å•¢ü]Ûã5  ØgýdΞX9¹µµ]W¬¤lW›ýŒØ ZÌQAjýõ݃ Ô]%cÈ– (¦²p£­Ó–Î!a¶ÎlÄ$.Ré8Ã$8¥ÂB¦ehleLtµÆi쇄{üÊ÷½ëå%ýÿ4 ô³™áû‰z¬'QRÓs¨72¨¸ÔÅl8» üé1T‡ê"Ã$ÅLû0l•;þUT𙄧-»˜˜ÅgîÔ°µ!Ÿ ´˜)Ws¾„-«xìÑTßöM—=Ó¾<ÏÓuðB½tñ"„07×6#íHÅõ™ùvDv>ú¥„­H"j†ãv˜Úív/•rK{¹Ýn)ÐÏOa9z.IçªDDÀhôÑ{¿ßãû{¤@X² á8ŽÛíæ 7X‰ˆ°ø³ÙóÇãìý¼ÝîÇçã|˜Y“æÙa§=³b’ÑÄýYDôŸÿßÿ}Çí¯ÿÝŒ‡õ~Rƒ°u]b„)Mú¶ªaŽ÷‰Þˆ Äl°’”nCŽ"Dö‚™€1ûœý?>_±ÚîPi2ž›,Õó|ôÑÖúУµ1†šŽÞ /fV&2Ícâ"6²;{/t2µf¤Ý÷ѡʢf†·ˆfƒ!Ö´Í™å<íƒÈÀnVÊG T-Âd¾ËzžÃÏæ£ÁÆL&ГTEÀòùþñ`Œh–Ö„¡c¤E×3=ˆ$` èÀ~‡ áså¥àÛ2„ÚÔ ;>áoÓZàrz9öÙÚÅE•B…–x˜–ÖÖ%“噘?4Ñ>i¯(ÛáÙ DáA+õ»(ÉeÌ&ÏÚlx5U%·´Xšê´›.³o"Ì”¦muy­SñŸ-¤(n,¤×bc§—8»éÅŽLBÎæZ›¤ˆT$ÂÞ~ç°Åpeݼiñ_¹RžÁí)>ß¼8<¡ow­tÄ5± Ðܯ®<Êv»¬øÖø,¾o9Ž5³ÊS]’kÔq"¹)óç´‰ÿB¦ód0§/1U1Ó,Á"ÂÄ탙ÖZÍ}7›sk¢ad,|á™_¼¥N­®7[4²Dw–eÏT¸¾˜°¢ÏƒLÖ$pŽçª¥ ôLM®¡ \.¯9«È‹KÒÅ÷^1g1¬„à|À0&E–¦ÕL–†ÀÈ+«nÓP•¢Cúˆ~2µ¤ÎÐjê.»ú¿ÚŠ£t„9j» o#Ï\%Ï Úª1ã<^¬Öó£ÙÎÝô¢¤z[åT‡FþrY&ì_}HfÅØ ˆæYô2WXûϹ¡Ø{Ä}ýZ{uGE©Â¬Æ“„]ê"×£‡ö‘}bZ×Îð…´j¯ÄÖõ<Øç¤pÚ — ÷Õ¼\¦p T&:;ökË“¸ÎçtåÝÑ"n?M¤¯(Ä¿ÒVàqM ^ä%û®žt±*GÂ`g•á¤Õ«îrõÙs•ñkMô;ƒ5SùJÆ(¿Cɶ?FÿâÔðÂ% þt=þÉþÿcŒ|_õÄo}Ãô+ŠêË1’Fó ûÿKÐÿsH`óL|9Ø6›Ó|¦\^øÉ—JŽ©çï?ËŠ2¸jxmØðº“ãmD\³-‚Ë(‹˜VøÞ2`´[ÛGÅO*‹0»S$ÜmØß4SÃTäã¼ —”)%®HÓñšÞÎs`¸üü=]x´õP`º<áE¶Z ê t"<Ûð;šÙ«[ûëË¿i5øSîÙõ¿˜L]–ARTmî&ö‡1fVùŇZq­`î°ý$s‰4"ª[ Õ¨©Òú^'ø-Óï’A?ûbº0íçBD¦ƒïèVz_CAªÃ÷OjfÒ¹ý¡;< |”À6Ëc›'mK~OE‹Vü—¤ @£kM-øŒ¹33öšÒêÅN"ÿM|@«z—ÌFvðæ#£¾I¿QÕó<ßßßÏ~¶ÖnÇMš”ýºšQkM„ýßöÑ??Q56ÆÇç§MÇ+€ÏÏǧ™¹Ú¤Iw Ÿçér* Çñø|l=Šj•Ë`üò¿Æ'ßz?™…†y =SßëD`ª¾dê ñl›_;¤µ>î(P…y‡@ &t22­¸™&ßV‰8ƒUíÛÛ·Ö¼•Aßß?̬ÁàÆÒš˜q8­,Ûƒ,Lê+W\ZN‹Oд\ž‹¾l!˜„£'¾36e¢¦E€ÉbÉ•euÎ5 N6E`ÆYXÁ2Æãl"bþN¡1À@ã8Jgï<幤þ+)G‘2»Ê7<3†k1ªÌ°It2vf9†ªIk SjÜ»Y$Æ8úÌ`ZÑŠ©ÿˆä¸1zW¥aÌhÂ} ÕÑÑÁ<{„"|Ú€½ È«ì¡Ýœ¿#Ôâ„i Qf6£¥Ý&6†+¨=¼ü\˜¡~`³Çããýã£1Çíì'ÁX˜I ½÷Çãøé'áF°¡ &3íªí8Žã`U°ø‰ËQ} /)æ¹5ñFžæ¯¤×¤,ÈwÔ?–2âîacÉLF!Ê$4* "HQ"3Óûåg¶4•ÕÀŸ6G:ëÜE¯›`ª·þwϘšˆÜÄâ#¯ÜDyb½ÊNù/C±ã­«êuW¡\T΃A^šæó:à´Ò*y™=\bdö|©ê,&0:‡CCÕ û&ŒmŽŠmÅ5iÈ&šÓlÌMke‰)Íc°%ÔÔǃ+jó Ëá—iœ³ÓEÄÏjúèá~â^¹0×ÏÓÏEþ&³°«Œ Ü\‡2U5ÕÈaÐÇÇç·oßÊ.3æ3½ÖÖÎ>))÷oÞÿ¤‚ ¿¼ÿò·Ÿÿà§Ÿ~’&­5¯öW%"÷ûívÜrpíããÓ-H,jª½÷ãh½¡£µfj"â4|ÿ¡^Pœí»­µÞ{ÝTðQ¶ïªê;w%³1¼æRMiZ8°×îæ!5S6bR¯Ì3µDˆOÈyiÔê§y—£'EÖ†6·\1ü ‘vm6=’£…H Î4^1XÄg2ÓN>†¯ö’^¿v¥µ£Øp'˜N š’‰šÎ¬¹/ZcB*ÃÌë)j¡5T‘¢îäÌXØ­Çh|£àO퟿}»¿5i>… ÈX˜ùh™9œj˜- &ƒ”­?ÎCŒu6‹©FÖÊ}[ÎÿÕéäR'÷Þo>Œ½ÑúÞ0>íSm<Î3&‚Fì«¶ß½L6<Ö/MÏO€@¬JþWŽv3û<ã!öÉ ܼ@ÁÃÆ 7›Àˆ°ðŒ\¯>nwPäWxX×qúÄDìÏ9ؘ™¨õþùñ8ÿëoÿ¥¦í8îÇ­7˜õ>„Û!üöv?ÏS†žçã¡Fÿí¯mDz>ììs‚½†¤çEß.%ØâNs$ø™U£û ú8}¨??"ûéí›ë8vi’JÖûpþã|Œ1Lo÷ûÍKøÌsƒníW26f˜ÂX”LBcVízµÖüòîý$Ð! Ó²ùÛÅ@áóu¸ "ör$Úè&šönß©¨)yp!U Fâ-ÝS‘ ס`9 De3×c›ðgªDh,«…×ab¤d¤C=œè„®´Kû±áK«ûÍ£´&–R¾-ýÊ &µZÇH*%QK"Ë!ª#ƒöà*Êwެmã®ÎzÃ:ežšRBçÓ3?Á‹%·MÌ]ç÷4Âm‘äT lІµ+ÚõRJ¾‹†WÊÏ]Éû\U3—ðT7ž æ;¾ìºdeðäî´g'ûW–ö«ë¼ fWÆæ­C‚…Ùœžýg*=uÓÂMäkUxžI»uv\¿ÿ®‰˜ÃÓRCüþgÍH°ƒAꃕž—ùP4Y¦.‚¯h˪\GõC¹:ým9|O¡(ûòZé”:¬åVðÉjió¨±Ý’åÖ ÉPZÑë,°Êñ¨AíSˬ÷SSÅþÁÍ;sª–KÈžÆÛx£Ô¬Z¹m-k¾­Ôù•UÚqÑõhã$®HèÙÒüTc5ÖYð„o%¸|®(i8£ËòåÀä–„Ê6¹¤4¬D nù¾Mk©8• AY.j›ˆmèó˜s@n×2…èŸëš©sª4—5ÜH`aW öF5ð<-õ~ñ¾¹¾äøµ+¥'„hÆb/5„’'x®®]®ÅÍûs£1´`Câßú>uh4rÍåv1OsÌ*^˜qˆj¸ºyJ‚7¥•gQ…5!–ûüàág,  ªÊúB£,øþ•N›!׿1wÕdá°,¼OdÞ¦$ïWÆFÂ6ë|ù õ?Tm&SAs‚BóC,©ÍdËwÙÖ¤át:(žJéó Y!œœ”§«.²sú^@’w-¿4‹¼vH¾Tÿ÷,­ñT> ÷^ßÚ Ìx¡¯MïièW%÷¶í]·±þø_“\_ÏKö×…KäbIk ‚ùýïü4CyºÔKtï2®øŽˆŒ_@Ÿ4²2Óz©þÿ.þ¯ eø®Í¿A ÿÕ¦ã ,ü¹è §ðÏfý9Ùü¦–h\àøåóy‹m‡*üŠbûªÜe«±Æþý¶sÄËú+½²%Xf©ó¹0㡹{eýZµûB‰°L¾‘ÀwhffP׃A戂ç·âh3^tIξ€W•J:ÈHæ³0aÿël&»eÞO‹³­²Û0#˜·šõK"Á§˜¨"ÚÕ<ç„<B¬¼4D<劾Zfð*˶}5ž¾çŸ•×iþà›|ð³Æ¾æ– I{ODNrãûã1Õ…<$DEUÙlq€ø“4°Ü%ŽPÏsa`R¦_ #¤pTHÏÍŒð,ÜC´ÌÖºŽŒ"ÌjjÄlcÄ+r~1¼>—·¤Äö7Ô°8Þ4KwÓ¦æ'"ÿ)±ë'öú'ÕÎõ¼¦­É´ío«W§_Æ5¸³e9Ïs˜F˜cŒ÷÷wUýöí›÷ø«à ÑZ;ÚÁÌ?ÿòóãqŠÈívÇ¡NyšŸåyöÏÏ"ºßßr„ãûrUígc°¬Êßã8òzpvS^…™Nðk öËxœí¯ÿNC‡ª7çN7Nt&fâyM9 \ lÌ3ŒþyÚ`n색2p:{Gp Ju|6”9°ENUòa 3{‚{*hè ˆX’Ëç;0í¹³lЛ©­O?ó¼yá|{»7‘s( «‘ž[vR'¦«:NÏ©h°ODÁD:†nN&¨¿½|€˜S¿çŒMÄñBXzïãN³ ¹m »µ[ש4”Lõ7X¬ï+9ËÐaæ=ZÌ¢$@@Ùe£¦£«ºÙ¹k·nG“ÖÚ·o·ãv¼¼Ç}a>Q0¦AáßcÇ„‹¸§ªG·“Ñn·ã~¿Ñçç\1(rc¤DÔ\ïoÈltU’†£î|†4†yL»»ª af½ÝODUÛáå26†2ì4»µ&|òé3 Ñ裟ÞÌ?ÿüþùy>úé`(5}»;n77‹»M,íÑÑš—Ì ‹×ÓÎ^P‘{ÝAÍX¼œãýãCÇ&òv˜‘Ñ„°Ã«l‰˜½SD½ý·• QCÇèqˆ×C43©BՀѻ’ ÓÃ$÷."È8€<šN—D¸tæ^Ä:ê,‚ìr©OL$©vªÁX‘Î9º2ÅLÉBéȨ½N7›•’JÐèÝWy_²âW Æ8‰U0a<»—HÉ|ÔW"˜«ý0–ÁªçϹÑÙ¬Åד³Í åL¬&;«9"p›£ùº‡¥*ÖG*~$ÛsÑîL¶­ñB¸È‡¾Âm¹V§æ¸Wî[ö,TÜ;ªRì]»Û a?sê9‘†åýë„Í2#U³;å–œQfµýFœ¾-ÿá¹èä"ÑÚàOË΢¾©ù‰É7ù>ŒQÛu÷bižåzà©ù±Ëuaê³Õ >9œ/pE±)%{ò7•Ö‰}Zd;µ%â(MlH|³„9ÅÅåâÿÔFý¹ì¹P&‘SD[R›ªóãÜA/óʈ„„35ŵuU[³.\[®Ë0VwXöôÏ‚ Xê¹ó7YRDmN®oàòrÙ싉#^lu6uyóÓ*—€¿¢¢"ü””ÐÝœ-åKÈo å Aò½Ç|3³«Ù2Ai—©°¯¼ ªkgÍwÌlž¤Ö¨)Wsv3]K;èö/İëT¤ØòQYÙUXtU¢úJಸ1.‚;]Yšõ ÷¶w'@Úö:_¨â?ª¿Ô"Ͱ''àÕ¶K|gb‚«¾«ÿ“‹Â_ÛùQ§'¿Ï`þbh]†‹?&[e¸ÛÙdí»öÿÚžSƒ¤Ž¬ßþ•”ÿß«þãw!v.Í«ÐÉKù޾Ư'öµ(ÿôÏØû: ØŽ è§üª˜±õc;›2zœH“¼?ÿia˘²æ~¶®­rÙ3_ÚªÝFÉ­˜ ~P)¿<‰×«J=­¦¹•XÇ,Šìo¯Æ-J$“Ù³Ñô6jâô‘glï™I› K©V?Éñ¾¯|Òý¿»JØÓhß1úÛ«i蟋êjÎe`nÆÆî¥½«›Í´z,vøZó%ަñ&áûý¶íS'ÿ!w0as5R‹ßa ö¤š™I“ߣXUÄL…@CÇÜA–ïl!–»¶>ÆÁmìñ yê_áõ³ Õ323³8¤"ªžy±9D A=?¤8~qóùŸ¸ÿ=}ë0Æìº^:ås½²‹³9Ì6ß“Wï^pœ½÷üVß¾}ûöí[þè1Æyž·Ûùp÷±WÝrªC€·ÛÈó<Ïó|ôÞ½$ &k€JÕÀ^eùz[k<-ÿ¾e<ŽÃ?‹5Aúýçãñxû÷ÿ`áP¾ÀMd¬Šô”œuí$ï8Æ5¦¬S/—fw½^é€í¢Øšû•Ü'O‰é?­.Î40Ó(Àó½jhí³ÿÙ/ó ¡š3.TÝæFtfGì£Is⓽s•˜HMšêèƒYŠå¾~÷6vF›¢Ô\“J¤ªÌMš4:¾½QïgãÄȹ›0ƒÅz7"U ~…³øm)/ïŸVÃٻ߶ÌÑçæ»Õ~²©–Ñp¨êÐññù~ŽC˜ÿ&"j,­©‘ Qk‡0úId¤ln§:ÏÇù8ïßÞÞn÷ã& ´v ®€1æùÐã `bn7PWc²M`F°á2(A]5/œg´cËÏïïQP¢tê#¨1~tüõöoÀ_ úøìc¨€ÍÄïöóóóo?ÿmè¸Ýîž¡}~¼?z÷Ƕ+&ýÑՌԸ ³°ˆA|«êgÌn½Ÿ­.­CØŸˆooôþË/çãüöíí8î·vSZ|X?7jˆ×ÆÌooߦòà"™‰°˜˜¿ýEÄ‹˜aÆÃH{·i4ƒÙ kÒö2:ˆ|Ä æ ÷LZZè†À·ãægaÙòÐa0ós7ó¾–8Òh>å}sãEÌSáƒRÌŒ'ý w~oz›ký„ÂøÅ£f<ó'Â|4aˆRf­&,›–ù1ã–™¦rU-S†<ÛqÖO.<öR>GHÅJ[ÂJ¥(0¥b»^üþ×r>2¢¹N5aÅv‘Bê^p¹é«ƒ;uÝ,ßÛJV- r™ˆgj5{D‹(:m#EÉŠÁª¬.P€=GõJÙÿ#D+ IDAT_¥¥Ïbnh¬×dGÛ¼ÿØð÷)@˜ó½­âÁ/O˯ùe©+ðs»9RxŒ /ì‡_« Ó£¯@ørŒ±éïó¢¯&tDÁÆuîR\ù¸¼φkè¡ø^ŸÏH8uAmð&|N¡½´æbgX]~Ö¦ e|aå`ðuÃá*oðiÀËÓ(ê”``úkR+@ŠÅ™Šcˆ"õ(ذšÏ@mð¸è(Ûø!ø†Ò˜©ª^GzàQù¹8¾Ì^¿Öð2Sड़ðSЇkrl;Ý6-•jªi7¢ÒhÓ¾AÜV"*!(Z¦Œ>âø {±"y€• Â('h£*a¯‚y§A.I$Ì,*-ß®ÍÖ;s™¶b3Þ®GW^_—˜TE‹L·–—´!ñ|„Ly$ˆˆ¨÷MæÈèy’Ñ]S·: "3@cê³ ‹á¿pL.4®R⼇vyU‡@QšÓóP \ú¤é¢_Öl®Ø·yÓ[õä%Ì"³y„˜ž}ïûÐH0ØD*­IY¥ã4”O©ÍÃUé8F/K/EZê ì¾NyÊÓ åDóŨjˆ¤æœìÂó¹<&^½Ÿ{,àÙðšnƮۥá™ùó<ªÜÿÊf.†’²ê¢:m­Þ ±Œ¢Ë–bkµ9QA4*=?"çc‰žÞõçvÑžnÙçG‹] …ÈÉ#UÉâv\ìÂÏšR–•Ó>=ˆ</!?_«Sö{xõsùqõmLUí·yÀTh¶¯3¿-ðÕ«ø1RÐß? øW,'Æù¥ö›Êÿþ´žÀq¯éÿ•–Ñ*|•]tÏßmÿ¶FŽ&¹Ý/j kóAÉsDh¸vÏŒu1¸¬ïI“öÿÒ"³9øfgÕáÀ «Õ|À2{À»‘2:O›º_@ó^Yå™BV-5¾…²õ®æ@€½äqá‚ÒØX<¹ô}°­DlOM Õð\PÁw¿oö¬þÿ93ñ1—zýz],ªGÛê{7]ÙØ}cD©ðº-=#D¤ žÛnî½»¢QƒŸ¹Í°0Ç…ŠJ«RÚ¹]ƒUzæì£ËM’*öëj¡þ7in; òox€…йI§Òär*å9^ ©@Ø#ƒ 47ÃA«¦ÔbµðÍEŠûebSåçÝ6°ÿ—•^ÕG2ð÷ù8Ž¥ÒõVGÙx»ïý~σH¤Èÿä~?RÜ÷wLUßßùå—÷Öä8‘–!ŒÄšYk-íÿ•ãiQü5MÂZÿVäüóçãþ“¶«ˆÐд‘¸ wîœLE­@ DšÀ  žJ!‘“ƒ}fáý}þ+1`â$ÕízïNï1RvŽ­ªÍ÷ìôãðOéÈ¥Á×Mþ:&%_ ûè¾úˆL™yØä†¬yŒÎ‘}‰RžAL›±B„·iqö£§§OD8Ý~Âw¹ µOðÙûÏŸ‰øvãÖîÇqWµýt¡ ÌÚë­§!OŒ~žçyˆtMØ\Pw+ÔLœõó“‚, ԅȘ¹ ‘1Æù8éð:_u«µÏÖÆ0fîƒl1C½gÀÜ.Ìo·ûÑÐûø´óñQJøÇ4 ftöÞÏÞ„EšÛýä £æ™‰Q˜˜ØMûc˜©±:ŒŽåh­}|>z?aÆ,c ó…¢Óqk÷v¼ÝïÜÚÇùiF‡CHM˜ç§‘SbDçãñ8?{ï½÷1zkív»¿½½Ý»ë—,ÍÔTGïÝÔÆ¯iaÝŽvvO<«˜ÑqÜZ}|~˜á<»?ö˜¡È§WìVOÆ~Ë{ýïpd“ÄÆ"¬È®Dø€t¹á%ió2šC 25%)%¾ƒ/&`š!•~’©´&ÜÆÐ¡=xÛ½Û¶vÖËJ½ÒoP.¸’54åá¨ü ¥›—=ÿj¾ÏÍÝgªÑ …ÉíÁª_¥d)QHçþ”ÓyˆÈêš ýøÀÂ;€Aëù§Öúa—Æ +ªÙë³Øhvq¢ôX,ù؛묈.ë^ó9¢û¸ñúµvýÛ%E‰ZÐ}™ýdªŽr;Ìhf7‰Amüpº 3u°æ±eY—aq®Ú/§¯„¢¢2—ÁÍ }Ëžj×çVQÓʃL_ð }ûÿ;…cØw$û'ÿìUÿM*W>³^ÔDý‰Rp%Æü‘²ýŸúfÄïð'N ^—«ÒË‹­(jÏØÿ§¼Àö/@ý•°ÿâ‚ãêz¸ü_{iÕ&²5_øB@Ùì±úBPö‡‰-›±Ð$ã?õ«™)»‘™e8>ðÇ-3b!sšá2c/øØØ\¼B()w"Ž%m{c°Í|u‹ÍÏz™;ÇÌ"ù†ó•¦ß-°¼_ö*v€Úðªš.ôuäú:ðz¬øÕhõÏé+Åo37Ç_P35æ>²1†©ú‡W#ØÌìöð—{…|Üñ°Âµ‘ƒ±Îí~þ=á~¦¦6â´ßGgðýí*õyoÓ “ÉSpåóñs¯J³uè #i"ï{L sÌ¢&‡(ÌA¤—Ó53û)ŠÁ)…\ ›ÞïꜟtZ¬íÞ0C—ñwùåýv;î÷{ü¡µö׿üÀççgïý8ïuÈ튀 ýõÃbp×þùùùþþž ¨oßÞZ;Ò,ŸM\Z;Zkž5"ˆÄ¿cdþ ÷^k²ñöööÓO?©êCOkw2bçáú÷QίNù„TŽfâÀˆÂŒ0†Ø`e0cˆH˜u€Æ°ÞM„}¦21f—%ô¡dJ3ò‚Rç2Óè}u³Ì`¸˜¦ƒäH› 3½Ï‘ˆ)ÆPï6OcÏ)š’RV,#2¿€AJ:6À³­±m†aÕ†Cn8ür>ŒŒpkGkGªÔçÕÎÜZ3%õ[ß*›’aèPföè'n·Öâ@–×`ªÆ°n#çÛ ó@Ò¬HûˆüGósïýóýÃa.­IkÍYcJª:pŽehÓÁÂ̽;Šˆôqv5¹³Ô:ÄÛqÐqÐ8cØjM¼™úP3 r ³óq c¨Á>ßß•ôÞîÇÛ[#ˆ´S‡}tSkˆhcèãüìg'&iMí1tذoÇÛýÛ72S³at¥݃pÑã<{ïŸÏ~0tÑP‘ÆM™çãóãqH;ަD¤ƒØ@x{{cçþ8?çËÎÞ,­Aæ!HÜš˜*1 âÏr3#è@º@ô3£T@bZë%Øî"3[ ¢âdª:\šñHDl¸`oFæcÿ›¹·]’äÖ­E±@fõlûÄ=qßÿ%O„}¶¦+IàþÀÁÌìI–öÝrØ–z¦«²²˜$°°>”À¶õ4nÄ]T|Hc9ç–ïm>âî~Biþ¾ç,„»ø †ËDÔœÜùègE°&¯‘ˆHDÜÜ Sçy¾?E•aÆPè^4¸µf¹„Bõ¨6¾ñ¬ë•e.ÛG¸ØÐàÊÞÿCWDIyî:;÷Ò´jOh“ë*'•Ü%~sãÙ·|^I K-ÀX÷²éÁJåB1äAäK^”¼'§Mž«×)êó;Ð7 ÿwû þ•OW7Z7Gh­‡2<°“úmb7gt_«TÝI¨’t’ä~ax¥9¬¿2ôîߊ=3Í~_¦*Na˜³o€iEÑfÆÐæÛ踹c ñŸ  Ç/Š©Õr¶¨Ù[ö‹s®ãE´6áöžVçš+ŽÞ–2°{ÅIȨ絇¯šý¬ãç”ÜcƘsÎþsüüí§Ùøè¡2ÅÜ?L(¿Ë`‡hæî¬À9¦]™ˆ¼ßoùüùùù~§˜÷õzýøñÃñq…R—¯½­Îé–áécŒ÷y~0÷Ö^/·‡j­•ϸJp{ùùÏãèÜáe†;nåãktˆ£‘š62¬^UE ˜Bv¬Ù³ÕˆTY•… ]ÖjöØ{‡OnVsëeŸk>ëé[¼ySš»&÷˜ypkÝ jÃU…¢™2N.@*S´L:D€dÁqãÆ|N5wŒÖš™ðLÃÄBbæìÞc) Ë^9UX˜Áý@cãTBëæ÷D­7RýÏóí/Ø,?ÕW¤.EàÖU•-Òf_´xšqbn&Ï(q7ù·[ˆ1¸A…$LPhãv´>­)BDø‰L(+QãŽÎ ‚ú\@ÙR0HUÀhn LéÒÕ†½±™ç«ÒTís~ž“”zëÌÄh‘»ŠFí}Žæ» ¦j?bpëcŒ~ïó­¤Sæ˜cª‚}|¼ÚqÌ¡ïóýóý~¾Áü:úññRzµ1øè¯ãã8:÷vôþc޳¹³V÷#iá)¹É¢®hp{ÑæH“¨ÀŒ^¯C•ÎÑTÄðÎÖ Ôw7vÔ û˜z©q³þ|ŠôÖÄ’VÔ[eK €;ô¬¶3-cÎ9T‰±z6fž2W¨:Uºê éÍÂ!tžÃì½µfÓ‘do±ßfgA˜‹ §Iy'%…L²®…ÁͶÓ)­±§ÈH„Ó{ðÞf”¤O²–-ÚÌñÕD«ÊCyØvГ™ŽÞÉ}ì#ð@K<áæ‚{‰=Ó,«”tŸæ²rÉ«A.è,@ŸByg¤­çzz¥%޵!Y#º“È"·0QŸ+~ª$U}~`aè¼æ`ý/¦ –y‚û>¸ä¢5fVDÔŠJh8dFFt… Ÿ)áËœ›=K¡È¸M3醓 ͸í&JÁ›p¡^Q€/uzExõëïîRò( HÂ5¸+.ÞÍ_¶ˆÏSa€np˜¦(W^|‚ï{i]iì—‚ó 1¬˜ z~eúÊ-'CvKïCwvbRÝøHÛä/D»I¦îü+¥š[¼œÏ7Û%l˜,Ýâ"tLØW™Ù ìÖ$~—©‰V+ ÿXFõ\Þ jF­læþ+ë»ìh©,#­~»E³'hÅëtúÐ1G胈Zƒ–ù[ tÛþËLãâ~YW£ûUÂ"rŽ!ȘÌJVŸ”†^Õ~‡9­f•{ë­Áñ_MŸùTiEËwy ¶XD»Y½±Ú¤ ·¦l‰3´ÚÙB¡ÌvrŸ®°vM§Ù«‹ÊÛkªf †Ò£fŠÊqùîÝ“°)V¢ºû /çšå0…0Qri‡)½à=—{(pTëRövZ¶G(íz²òófk˜8ÓÃ1='yé1jÊÁ"†È„ ŸK™œÁ—™5˜´‚µë†”öf–ôfç¯û™ú2#ïÆÝ!9$ñ¼I^–¹ÍÚ8¨2$ܺ¶Ìס²Ñ˜D5FÝë2Ú`~ÄýëÆ¬JçŠ4PoxGY“þ•¶«³T÷É®[$VX$êDíjöSø›\{óƒ w½_áϳ³[ô+ú>°œ©·RJ7T§{ünŠ´ê›=Ûàænˆ¦>ÓSµ`ƒXòêpõK<û^·€î4sý¥e6~‡ãÉ/ïÇC´ÒÕð— ÿorï#¬ø'"’ÿíþÙÐÿ‰co¥þˆ& ¾5¾ºüÞ%˜¤r´î`Ø»¦<?{<`ö_ï1úÝÊùnËÁ¯dúw)LȪΤS2± º1¹Vc.M*`“9k¸ïzH‚°šo5JȘ…lds§_šþdÕv‚⫊Rlyù)1)MÙ´33wn^HÍ QK2e¤l|©rk*­õÞ*¤Ä^¹‡)w®rŠ›o€‚YGL™S˾ ¶ˆUå $š»eШ< Uõ<Ï1JÞT:æ[üVr ¸éËÐö9fMr¶aÉœ“°ÌZã5ið¸QýùóçÏß~Ž9˜Ûëõ²t×ëeÉDíc%˜ËÿLv?3ÇayÙ:¥=‘ˆ6« P½h“«elæÖ cØLîÌE§i€¨3ûV†ú0÷÷ºåbU·wœÛÈŸv{™$D;íО6‡û=CuJ #AP“‰\Z¢ª2¬ð±)NHã>¾?ЯÝü曢ˆ”<-öèZ’– PJaw¡@Œ@P/ìÔûŠ®ôèçsú/œAløíÖwiÙþ+Ï÷ÂôÜÍÈþz­µ¨Ð(¾^­é£;·óanQJñâvUB,»*º~ù¸[*©ÞBK_ÀXPÆù†ŽwSoÜIÖ¥#ÔÐ ºÖØ—_ìv®Ê5¡´¾ ˆz”š¾R³¯´úB´{U¬ÕbB¨B·…ŒçímÁ\æ¢êI#×à¸:¹&%OaÃWˆHrûÝû?{;››dŒœ×@M—ÁHîQYß–$ÛeÅiƒLZk½dÒŠ¬Z´]ÍJ®ÎLw>¤æ£¸TCØ’ QüÍÔœ e%5ÀYF—®¤ò÷/ »« Ö‡Þ ±ª?^Pø®šº±þ‰TgžáSš÷ÐÔÇbZŸsYŒ±Ï¤¸–™Q¬G½LÐ龓¾†9 ·h_ù†Ê­4)ÀI½[W¿p ’…³£9yKV¾å:ç!Vv†¹wÌ›ãYt|ÈôizÈäŠí“ )y2ô ¬=„ºDƒd]ÕTáÅë±pU_‘e>iQÖì8òb"ÁN{_ªÿΗ7¶&a¿ÄT¥Ô|îš-2ãßMDPôE¡S­Þ‚-JÛ³ˆ:ƒ «KsþÙœ²^¿vª ³òý—rƒ.1ÛWXÎñ-†ýÎyW,µba ïXQv}>‰Š~ÃB]”|‹?ßÏG|í‘^E¢¿Ã¼g«=.‰G[ðôÿ¡ÿw¨îÏ‹þxþü® Ù•üùAþ8½ÿÏ °UøÕ/à ò?~%=¸Íî~:¸wŠ›XUP£Ìëê䢚޸ٴf%†•¹yýJeâ”LBË¥á7›×)Ñ/æG€cëK“tçÝMÆ,&G7%„{î/17‡òùcžr­XîÇÊ 3‰x¥zéE&³üÝV@ üŠ·ÿû¢€o+è‹ÛÿXÿe:€Ó™‰ê¼·2׃㲦”¶Ð\䘵#·¶Ðv#qS‰ÃuwÒÒ)IЦugíQIp(À¸È”ŽCá;êKª¶Ö r\˜}.®µÞÝ{;+5£¤p³š œ«OrC‹²Ä@Q'Pd›Cq[VpvWKNj’ªBBëJ’ðµÄ\# ‘ÖØP0fˆ‰dÉcÐBãþ{·µ‘HrŽRÞëÅ1‡-îó<ǘJzôƒ[3ôßþÉ^¨÷þ~¿kËÜz§œRpÜð1fâdÖ:ÅC³&Û[kÿüç?Çö¾ÕbÅó®B2q8ˆŒä%êßÍÊmTÆÏf ÑFÌL¥"j&;n  iUd h­/#·»‰Ù:± ²Æ!™»ùYç<¸µf6喔߭ôgÚdü«4bűƒ0;,%A*ê…ûÔ÷x÷ÞrÊ©ª4éÔILÌÜûá_‹¸,ËPxøLA{cÐ ²A¯ÂPm^–iÚûºá CA«Ù„b2ÔÏÄ $PiÌÌ©ÔÝðêà6)Ƹu{²Æ7ÞcÎ!£õvðAÄGïGï¶·X-;U!bvíŠþóçÏóólÜðã£sCãÎ ÂQ™–¢ðœSˆZçÖ¹õ~Ê{ŒsŽÙ¸n<ÆPBïˆæœ??véÌ<Þ§ˆ|¼^ÇÇë?ø8HIHþóŸç<Ýœ„Ó…@?õ­¤!„9‡(ÑðMCD¡ÚbnÔ&Ï9›Ž¡Ðs nÍ&%ÄàhämÀæ”Òëõ2íz6‡60:·Ì²O#SòãÙÄ_àÓ|UÈ‚@ÃRVö3ß`swNk(­)»S­óSCb¶QcÊÉ®°Ì 3b˜MƒNC¯eµÞV‰AÉÜ#{>qÂè®æífÕ@EA*sÚ¼Š›ÛWIÇž-¾õ(vÙ LÌ*na¬¹…ÆAÝcˆYß4nQÏX|=Ê5-ÂW¹ÑAVä•0º!º^ÉR’÷|”‰È¯KK ´Y÷Mã(ô¸?éö>gÉQ·jµ؉á ×Xãl¯j“%´÷0 ähüªæ·b4cŸ¹oÈÀQÿçÁർwr€Ÿ}šXØ%ö)„öš$‰Ë´>ü¬#ú›^ô–€b,|HÔ *˜Eå(b,=Úñå `ù £ >·H;ÏÚEk*"¢_It¹;Ò…"ªwt{÷%fÏשyu\~e#^툋P+oæîN IDATÜYç©a(¶§¥ÍÇý&uó/_M~ä½¹i=D'H3¥œ%”GT‹9L’gïÜÒ«CTF¦À:«¯ÍÏb͆e³×æ¾cWò2.ßT‹á ùà"xc‰8³‘Z£KP–Ôœ,µê/v^PÅ·-.~±R­s·ÊܾÜX¦ˆœcN}pPLÀÙá/òÔ,Ô-ë²*$¤¥L+U’ÎözÏW7>t'4ÝMM³±ÂÖ}¿ò ÓÇTðu—4ívBù™a+æ7–+»` D4fŽ(æðº™0:ïO¼Ó"v_°à²]Ôãu«´JÒ³èâš»¿ÜÌÒRÑŽ,uP P­!õD¸åH㵤s¬Ÿ¶ÌWY|ê ¸_¹}¥/Sú#e4‡ûÞ‘Æ$"šèÛ8Ù航¡‚¦RµGq3šMP6Æ;†}Û(°#ïú ó9Ò\•Qu{Â"ðëÆÒ×ô\À*'Aº+æÄ©"uÙÈš4è–r¹n…+ G7]©Ý­GÎ9.ÞÕ?q©á¨šíÐ6°«#‚¡ª÷YB…¨nË÷ù‹Òƒ…ÝöÊ KÕGtö E–}ÆNWzÀr°"z0¥¹Ñ¯ñ«à.5¸ ÿôäjó+ôÿ[Ú¾þ‹í7þÀœáOëÿÉÿŠ¿ã »sý÷=íù ÂÓZ½ ™®!¸~ ,Z‚¢f#ïKáºÂrC; ûȰœ£¡ÒðßµßsìËöÇÁî7mÌê/¯¸†ô8ewüÏ£9ÍvTˆû¾ß£8 QC•_Eìð%‡åVmšêf½l1%ÜÌ ¨¼¯†¿ò×ë&Lws¨ýBsðˆþ;¸é\.ÿ®ßL¬g׃Ýót§š54²ú)Mä7†Èfq” KšC¡U—f¶PÍ’¢âÈHîµ^O=]ƼÚïË«5­¨¶•ˇH3Nf ©"\Ô©Lô¹Ô¡n>Qm4¡ö¢–a"³Qš†Ïn–¦¤ªS„W©pƒ÷óHnZ‹ëø¾ù •,e{ßœ¦Œî e,î¼}SK”<Þ0Ò¸¸î*æ•6®˜ÑáãããõzU ¤®­Ä §£œ¯X½=7Tlë@ØÞµ5":ßï«ó¯êûý¶Ñ…}äLwÌšp€h’6"Ø@û‰­R´¶8ˆXàˆ,$Áåhí±á‹A÷ª“HÌã›Á¯×ëããõ>Ï9¦}éÕß–mÝMÐT^ÿx½˜[»YÕ«¶Öl–=vו4œëæœ2Ìž=õwÊŒ¯»ýÇü'ƒ•ijE…ô`¨åì,º,SØ šYé0©€D¢I˜! !‘LåfC€Ô‘o‘i#%å†nŠ”À£qÞ‰õ›ˆYü›œŒítP!™*2µ5GþÁu6lý´¼Ï€¦E³ívOË:Z’ï–(‘ÊÓLaÆ8GØÚ |ïáÐ;o<‹ì&Cð¦ˆûlš]ƒ#Úc= )±X›u«j¥4høözz) Q8æµO\GK­¦H ¨DmUK~Èò µÐeÕBˆFêU+ªŽôŽ,°WÅÝ.y­ñ뙵ËÌœg sbf™²úÄÐl1Ò4™Ë,dCÍì@̹/{]0ú•Ü'Kþ©¤yÉÍ áàÅÀ•‹—á‚\Ürð÷— Ïiý“›©xr Þ µ×¿ô×Û²GeªU ‘¡FyÔÔ_àË' e±_&ºÞ®²ëg¯Ø-‘îãUý5^P¬6, â|% rÅgëªÒ·²)fôZØk¬tIW¾ ö±Œï¦@ ©¬â€Í¬òÂÕ¢›u¸fö÷ÓpâúäZçiæ²4\ß¹·ØšÖ7q««é¥O÷·p“ÔOãÙ-D ÓÛÖ{Ť6CQkrI]`ì^-¢O¶cŠº¥®šÝâ4ÿÞû9ÆÃ&éEÊ¿À쇭1Š£U€°áèE§~.ÎY Ö±’Smé[hÖá÷„­Í¬ª¥ð¾P¯¶äûNXDb¹‚Œ³bU]ùnÛêízy-?¶QT…9„q±d8÷´âjh¹°)]£™C‡ÅåÝ[’reÕ!,æ@ÅðVÜ—U澆\ÛͬcŒÌÄ]we‹SI­;câˆKÀÔc_À¢r°Åsì‘á¨Èú\‚‘ÃqFøÝgÜw=<©ý(ÐÏý +«uûê'-ç[Y¦5ì'1.ÃYãj -jÀP­™.žw°ä>áVÈ»/G¦L®ñ¶g ä‘U˜&´üã‚þQoõ‰CMû-©í—/¼*ž–í÷#º¹´¬¼ArÉ=cÆzŸÃ¬ª&ãî¿vµ¹ÄÙ_h3·­†j°Ó%$ó:·Ðßáû©è¾RI>þ\U‰¨/úÝŸÚþ¼¢àodæë_s…µàoyÜu¸´.p-~ïÕíU4¾xE|9b»\ݪ²lL޽Y»{¿øªÌ.5ðÀ‹h¸ ¶½%7oTŠPboIÍ(øÁk2³`½ó5¬¨uR!4‘<9`ªý8‹JO…Ä9ƒì†×X+[öšR¾î,¯º»´S`Ò©0ëœ7h³ô@f/DNÊdRÒ“ïßWèÿªlÿÞiì9~åòÂß=²ÿº9^g·­ÜTŸ>·W LÌêLKk¹ ¶(kÿefî‡Ñ [kTTiÑX…À¬®Âö ãiÍѱúW%o_]Ò+b ‰ [¯Ë`nú_ŒÓ+ßjQc ;èLŽw¹}NIÍ„aÑÔ7‡ ÔR&ãwüb¼¦äÕ–½õ¬æœçyæ—bŒ¤j‰c )ê÷Œ'uŠs¨£Âövµ¾ÐvìóZ.´eGcï¾=ÑR¦§]IJR\ìn/kiѳžÇÙ¹|· Ò6J‰Îó<ǰ¨€•byœRjJÔ<þK%@÷s­ù=fÐÄ¢â›I,\{F¹k‘é|$iˆgñÅTö(ÍÜó‚_0©rø#…Žÿ"¯P„Õp…d \p™ÀtΩ*é@ EØ2©ÄÜØåäã1T@Ót ¾ñâh}ª4n­‹=Йqž§Ž·öNiÊ ²MÊŽÞÀ´|9(FY˜)ðÏ!禘Þj›o˜)5C$™[;Z{ý=Îs kª‡ ›0ƒ™™ÜÞݶâÏÏOb~õfùÌê†TŽ.x8èÇë•ô¤s Q}‘6îcÎH,¦~ر¬f|ò>OŸT‹M™ÕƒZ#ÑããuôÖÆ f+v  ?þ!¢¢óó]kv"‚%Ò‹ÝÐ ÷Üæ4a'Uà8ŽöÁö9(ÇŸPÒ\ëãî°ô0?•)Ê"&|©Ö˜££)DDÏqÊT—UY T¦Ì1ZcU9evˆEŒïïüÅ5à”iVOÙ³Æ̶^!æ0 ŠrHdª”LQÛ¤ÞÍÆsÙ†!€¹•ùàH MTæœï‹UÕbÀí°>wŠ£pr ^Þ•f¦vÑœ¢ f\¼¨[3/)Ÿßæ +;._pèlPgkºªq‰%µªß7c@9Y7•F()!Ë=o÷œ)jŠÌüôB20\]³{ѹròŠ}«&ª^!F^+UÂJù9³˜ì{+%Ë’Tê˜áâÙ‰ôØéœµZ»”ì~ă8ÓðŒÕ–äÌ\Ÿü˾DíZõfà~wЧ›sýÊU.c 6½àVºY‘~aKœv•=GÝeLh2~)`¡o‰+ä·¹UhˆDŸZôkptÁ®½Îؘò%P„.îûÔ¡9æÓólX¨à«è-¸Í¥ÔB‰¥ª^ÇJÓš{þªˆÌéÉªé… ºÙÇë9ËBZ™Ïzit±¶×o®€Î/Æ»¯Ttî;"u¬Yл_e iÍ3çOóÚ]|fp挆(¨ãçIƒÓ­ùÂåïÛ»?*ÜŸ:ôP7 JÖJBˆ$Þz¢YþsÈ;‚Ų ½–¯žk1W³LTÒ`—Ò.Fìe¼ŠNS–ã5(@k–¾’Tô+ìùñâžÿ\4E6P<ÄÐÌX9I‡§LY1)„ÆçZ†ƒÕ’ãªo[rvÅ-™=Ôº‹×„˜œŽ–—¦T¢S™ Õá­Sxe5µQ/5]ŽUô1ƒ;ŸüܨþûpZµÒ„—>¬ôæ@,K©go­(æï´¿¨ÉóhüW¬ÿ Öï­‡ž¦×ßå0á.êøùÃÿCXý;`^ÿª‰Á¿•2à] ¾^%õ”JŽÔWow•Ð]E3Ûüà¾<–žLQÑûâçsþ¥¬l"³|qÝÉQèpþ}ÿøŒ ÿ>ºe³o¬ s’åÂBW£ö¯d0÷ òÖA 4½ÜGp9Œ¤¾æÜhyøëˆ#µ¶>EÀnꆂ×Ûþ •ÈA°dÃŒµæ|DûŒº-Ó–Rb` EÙzê« `i€ÿðŒJ¿™|³ üín‡ÓóQI÷Ǯ֘ïµkËÈXÙô  ç{˜û? û8xAþ §ÉøÖÝ©11–ê—!¦Ò13wMŠzâàïóí?ÜÁ–“lÒaÓaǬð’`z¤ß=Ò®Ùà Y˜8 Fq”—{aj_ß Ø­‹ÔîÏq­5™2æX^I‘K "BuÜr5èd°°(ip—pGkr@:Æè­çäÃ~½Y@h¸OÎ)cœ%˜’hI%M!%ÀfÑcÚˆ9Çœ³÷#¿Ž$ì3³5º†iVbcŒ1xÇ8œª XúnÙÍ|æÌÂÁJ½GÃÉUb¢éààŒ&Öí˜,0VHšñʰò\‚O܈LW1DÕVÒsLT­J4Ҭؠ¨š,†%€óŽiÒlÜgðÕÎ 2µ¶[äöŒ­u üÃç2B<5z±™q„½šÆÜÇQ¼,õ gbsQ!bï÷›úË¥ ¦~¾ßCfëÖ4Î0Çr†,G3°T Z󶱋êÔ% $*-ô@Ú¹±Ë1Dgø’±¨ŠL;ŽF“u"p'hS{Ã=iŽ)$"3R"j@ëÝ?&‰ŽÙZ;Z?iŒ1A/ ‚Éy¾iˆwžSèA‘b0H…êôãÇ«ÁæKòó·Ÿïyv&´Þ©+Ñœ§EÐØXMA½5Ñ9¦ôÖ‚"›¤Y›cc™£ì÷j‘ë4í[³­2¼$-O+ÄÊ O™ä†@¤: æðî_[û9N6t0“¨ºj[Ï9pzz0¸ñÔi™›¿RcL1ù}ÜH$@ã‡åÚñ²ù²†ÊR=I¡zôÖÌ¥:çÒ·i£¦È8Ï¡ê 0G°˜ªò>OëmlÛ?ŽfwySÁ „&Üš› 2Kö¨Ê*éT!ŠF èœJj¹&ÖÉ,£â± UÝlu–òTùJ‚.Ž•úH¤¤ÃÂÓèZ5$QSCôî'2Š [“U·¤ñy]RþR½-º¹ÏUåtØô.hÜóìHv#–ø+5UœPµø‰Ê"Âîåä€5lÜ;"kdß71¹W{}}.·ž!ZŠT…þ^­ ˜ÏÕgãrºã­×9mç;ݼn@WÒ[ñ©r7Ý܇*6ú8/yh¡ó¿x ïµ³8Sâ- é¹ýþ*"«0×¶íñ €r-`¤'Œ$Ÿä˜ oŠjr/þ ør{|•ÇP\ìA‚¼Š»ËãRÜý‹£~ÅóL¨ÀJ[‰[¸hnËøDrƒ• œµ].”¨®µð4ꈕ«¹©¾ó{ [˱Ÿzeå3€ðvRžK—ª–w½ºå0Ãt“þÄFLª4UÝõnˆ&ôhuŒjÌøÎ¡»*O® ^»…=l¤{Y†ûá_¿µ|ZNWW³£Ø!Æ]ô Z{žl©ØsUÙ,{OA—7óScO±¼*ïþi̳mȺcŒ¢mŠÕjb"@ÉkLœ´AI¢ß4F+‘~Í[‘;9mÄG/KJh“»•a­ß © ·1ÛÑšÊÜ2ÄÌú)ò=“‡)AšÐÒÙC™Æehá‡;/:7vï}uͰ/˜SÐ>ª!´@k³#Åi… ”f{Î /…–¦ö:¹Êì™'[’Ü«=.0k"òkk:Vd(³I®kxÞZ+œëµŽçÍï{EFT¼n¢©ìûË­¥ÊÜfì2"z†¥×¤%J±êt§y űԵžéZÉ»)•ÁFÖ_w@…L^ îX©-ù>cÔ²ýâ¶üžo*g.ÿ7¿¨Wã¥_ãÞ_U·ãzaÿ3Îíÿâ,6ït‚hæçaéT1ĵ™C‘N-†ºÙzRåò®ö8cBÉYõ\®Ü\‡Ìá\ wÚÜ­5ÃÜòYÞWË«#JÎή†Û=MÛ#-Z˜ú ]·–xÈCu6n½7%=çùù~¿ßCI{kG?˜ñññúíçç6e1ÆÏ ½5ˆ(©LÑãD„VñsÆ*ì·º·¢~4R&ÞV%œcÊì­ÿøñ"°;ıÐI“D©iã.:Me1)HaÆì¡PSÓ¦‰9ìpk£wWC¡ÍuÔ"6\M’Æ †¢¡5±Å›Sc9y“äýþœ"sNòèS>_xEû%š´Pç2aï*’Ä]¨ž†·/‘Ú€PE¦èTO¹H ‘­+óø ›eVnKeöSTIó9GÒ \™-¿¡Ó‚™‰ief¦§ƒpoÙf¤óBS†‚Á| à 8‰€Z³àFšsÚÈ!ÙŸ!ldf¦)hfn¤§Ì÷oÿ<˜[ëaÌMÍlAuŽ©lÓ=4Ï„ÔI,Ó£“ceªÐ2ˆ…ºx?ÐÒ<1ök¥1§ÌÉpÈšÙFM UÞ|C(P ˆÄU“¤áá0®z!U(J"Üzé(·l´‘i‰ØË;À‹s®Óu9Ì%4zÜ‹Û.æÀ÷㨠;š2¥ËÍby’ËÄÍ-¬% ¬BÖFÚ²ìÌñ`‰æ—­åi¾¸Ì¢^{` ãköÖ³± 6®Î]]¾¹ë„ím,Ó“'%½‹¸›§ø«>öò^+õ¥ž¤‰W.üöѾ«}ÈÎâó˜¯È›5 ¹Ø÷74ðr¨QÌ_¸Ó<µå»\»&|Ót]'=[Â]d.zg4^È^•ËY «æY+€‹éø¬ÃïÑÚ¼©ÊÌ(Ø÷4S 'º&o˜}T¹õbèæ)ôªR<̶kûfÓÕÓIh¹Çøn0›¼Ñ¡]Ú§ÚZ3LÓö0în—OÚ%‰$ÞQîšã ;1Û§´È]êˆB-2i¡üÎ…ãà»&’ÝŸ<¹Ù ÅkÑ®X9o=·5 Fö÷#]S†¢É»Õk¢‘ïxë´¢ú­Èû2^t«RŒCß½aÖÛ¸Ï:% àjwuPVÅTÏJú½%›fÓ÷U'c¹¢Â³‡”ª·;˜Ùœ2Ãlå±E]Í–žVò¢€j3ýý©Ea/Ä U‘1UI8=r—‹B”ÀØa[ƒAbÀÍ—Í!Xô»±x&“¬^…>+×è?‰}“œ=¦Uvöè…ReRöñh¦°IWG¥·W à‰Ös–UapÙE´È¹Lïhqè-F£>qT”ˆ щƒ‹­Y˜öp‹ºçs¦¸^öHŠ^¾Ö.ÙÁi%p.Ü&箵”*÷ù(»6ºÎø-Ë+cÎu‰ñ¢¢=ÀV¯'Ø*ð2Ì22òêÉAŒ˶:´¾äh\NÌJ|Euh»Ró# t…˨¦Ì…®öêE8þŒd×ã[o.E ÛÖ¿^ªÿôû/ýú/êïü[äõþMÿ_ïÿ¥×ðýWù³{uÿ2y[¶-õËoW¢¤¼×‡W-ÕfJÕ¾;w§ÖÅ­ìœøwN§ü-š#‚.QÜðßÊàOF¡Ég²¥eüN´ž§Rýt«²Ïɱ]Ò–;£V‘uuׯ DîP‰§ ^Ä”Ã6·è0#b!áH:Àžñ+1YbÄ›O‰¶Y‰zßÏð~羃Ó=Mú_ôO/$Šê¼,VVMi@s5Á§Pò&¦ŸmFÁìÖÆÒ¥Óç`LI[ÎRu$õoµ(µˆá‹T”[p®AbÄá]ìÕÄÔ™‘L—à‚á¶ûb#€iZ`g´9˜II}t¥¯Š—Ö„Ps«/Fb„Õ¯ªÎ1‰ÌɆäÔIÑA£œÜ›ì—£žåšÛ'5pÜ.Œ”U^ :—ø—HÏsªž¹µfTbÃâ{ïÇñrÇT÷ß°ªwÿãóóóõzµÖ??rX,]ÚÈt ªA¶®ü'Vê…=·žcŒÌ1¶÷=ÏÓ 9¨°uñÁ¬*S»0AYH² ‘Åš™ àõÑm %ÈT,jFg`b¢!8ET¤1 ·òWµN5‰t¾öD’ýÎãK~âƒÕÇT4Ép"f»>Š6ÙFµÓ$-‹3ì9±‚î$qR(EV¦ˆÊT!…›rä¶Ö{Oîsç.:‰Ø¢]d1zïïóÍÁÕ²Uýññúí·Ÿ:çëu€y&-F\ú@j>Eþ€KÐC™K7…B˜H™”¨5h@æ)?D˜A*¤ÚÐ&"CTˆÚÑŽãGW¥sN¨NP' FkP¥Î™ˆ{cêÔœ×éGµÊTQ=˜öÊ e™P9§¶Þ;ƒÄ[I±™š’öÎÛ€JŸç)˜a<#瘯ÖúÑçûÝ_ºêÌN"%qª—…¥›-˜ñîMrGcÊ4›ý©3+^÷$hàvÅîò¤S‰ÝE2vL{¯ãx5¦Y²éÔOU´În•¦$2,>އ››so˜ÐJ¢"ªÌÜÉ‚u}Æ£$DêÂnP ‰9ù–Ì(ñÕÌ Ll7W”¦ÌŽÈjfà4ð9ÕTŸcLš­ ŸtN Y’ µpg( )«*±‚ñj/CWZc÷­bXc-¢sœÌM§FêA¦i6$ÍE”ÒTWö›õ¿ÄûĉrŒ'aª T™òðÉô5>¤")‰t·gArl€PV¦GƒÍ.9‰Xƒ#?m×*GR’Kåßqâÿ #/þ8@+ÑÍcÄ‹¬º8ÂË©o%»Ñ†¨ªŽ$z~8Óž ÿÄÚd3e~‘íx6ÝŽ¶âíDÉ7‰/h³Ô§pùhY»™†_º,nî3€¤e,DõÄ÷¨3}ܯ°²Þ°¿TºZ§ê"³:-‹´Håæì•FÒ—\Ÿ_¶Òߣÿ×~ÞK%\rƒõÒ;yвu¾òrŠ™û¢ðWÊìeÿú¿¿·ì8¢ªpÝGT2ÐÿújÆ )e^*QzЕְ'-=f<|3³Ùf Tm 6ŠåMè@¡Hh-vÖðŸt#ÚÙ£±ï!æàÚ¸Ö“…%T<JXqŽCÖ³’eof÷ëñý'ã4ª>ÁfÁµqE‚®îï-!VfÐŽð *Tq!Gh–BB'XaK+]ü"•NVMÄX3Ö®Qg m^°(aëgmÈ,óÍ-#¬Nt…½/1Bõ¸XùØX<ÿØØW)’3ª»ý‡‘Ê*4!¢§Ñ; ù!ˆ •­å…Û¨J“;‹Íþ-Ô”þœ ¦Äa.Ù“n´@ô™@yâ˶TZ+ŒÂm' )Ý>HÞœ ˼ÙQ„kè6³k¿8í5ìqõÚ¦äjn8É]ž¸‰‘g IDATSSH¼8£ Ò¦Üˆ¯æùiè¿$Œ–&ÀØ$ÖFhÞÙæªK±Ò.6²•Ÿ6ËNÆ“Àz–‰}Ñ´E”NݺqsuK;.ѾÆ3Ãvì¬x)#Rñê±"ñU)¥¡–¡ë±¬K`°þßÝdÅ" •A°VÈN‹/ÇGb11æa·ÛرÍÝ='a_eõ³Á'äü;º=@mÆ/¸èÿ#ôÿ œîû1€þ\ÿ_ 9¾ø8¿Ã¸ä_¤øcw¿µ?ò"Oßú6ªåGú?Õ¬íF—‰ZYØtwê¿]@¨–»XEÌÒ1Ò7•öàŽ=^ «­ -­9ÝlhkªYÍý…ž ‘ÐÔ­%Ü&™œÞZ¹)¹ƒ›³9m¢Û-Mh1‡ÌdV~²ìx,9œI®Zì5×¼J(´¨ j®À’*8dµ}­6qß¡_Óÿ¥:y6w»P®þüó‡I`æàw,£¿{ð…ˆÀ1ÿªtooÜðg¥­¦êÓeûFx¤LGYÍ‚>˜›Ë!«:µªÏ³™1G|‰NÜæO qVñê w°—‚…xŽI/5â:«Ød¬5æiþIô6Âf˜5æïZàí»Õ¡•Ö žaˆå¡Çm!€Ü˜Rv±Ø`¾5dsž¤$›s´ÖúÑWeòœsŒ ¤¸0â8^éác#Ú}T“騹ñ4W6p«9Ïuåd–fÞê”TN“Õ²ö–c .!œçyŽ1~ûí·ÿý¿ÿ7ûÉÖp’|àøí4—êÝä¿SQUn™êlQ(|G²@óT±Ž(AÜ#28ý0#e@ÒÎlÌÁÔÙ,`¶×8v ݃Ù©Ø×Šæ.0f‘TSÚ` ç §B ª]7;F(EU,óÚ|«löi1× [cÑ ¥yoÌËÆt#"ê­g}ÿ~¿Ç?~|4ðÑéè åiÎsÎòpRY‚™-Hƒá|´F s€1-[Š pSÁ8goN’)6Ô~Ÿçÿüí?ñ¦Pwô’IÄ–dßÌ ©Y¥ÞnÞJæÐJÀûs˜ÛÛÞ2…dŠ=ˆïóçóŽ×aþ\sŠ0}áq³ÿKc lœ|ž€™Û4sƒÇ‹XÕ#vEäÓ„o`æÆ$>¨TR4è4«:q Ú¡¢°QDÌÉZïJÄ>pnrÜGgX¨hêd £Ã-öñê}ÌiÃ*Rzk‚ŒEévÀ‹Š÷bn¦)d€¹ŸïÏ1fc%so­5#ˆ ä•ÁÇqˆ¨ð4n¥LBF>ô¤CbÁÔˆŒ÷ÅÍñLz€¯ùà“íèÿëã#”d 0¿ß§šëPÓÂÿ†´¡¡‡=D>c¹sÊŸuùè${ÛÆxb´“HT< ’Ò3[`/V8H+þä:¡ÂÙã;Ÿ“‚NX,z´š3VkþìÏvgôÅ‘§52WÚ¹«NA.õ:6Æ+Ñ…®X3N-sOë´½òJø°—„Ée’ÆÈ*‹Ì‡l,S¶ÃBeŠP8Ѱb§°lÖìÖ.i_ÌUn¾:•Í·Œ ÒK¿Aœs|¸²ØÐü²<®ÖC~¤’^q‘+ž¶„ÞQ~ÙbËá47 ¢+ÿo›í(–J¤ó…=ú[¸N™I ‹ØðkÎøÕM!âèWæ?N¡Ý’¶K ¶Ä0oºÄÃÌ©äÈáA™DUa¶<@ÿ;áˆjÜõ³ âª2qæÊ2 âøÓ‹+ÃHo#ÚÕñ6ýw±Âaó t•‘É;ô¿‡58‡áÙðJ“ ›¯VŒj:Á÷,¾ =IÔ~3ý-€Ÿ3$Ûs‘*R"¼fA>ù‡E™>Nh(ØQ´WÜÿæPzóÛö©b éËÉ6~î… ‚5¯Û÷’ˆ|™DJu·¿6%|Y##P]-ªxÜQÝßÀ%©$W ÓB'þ¯/ÍuCK À¼Dåä0‡‰áoÊ#ây‘:Ê®ÑF9MÀ2ÍK—¤ÈigY/Ø/¥ 8¾ß,ƒVÌ׺jlÏ Ì¤Õ!-·•®#¬¾Q׫֗§²7†?]J{8ÁW¸5°‚Í‘k»L*ŘÛé%¿~…Ä9IÛ`Ä*#vü¨$œâ¦´íðT‚‘ëZåíð, 8dZÛëXeÆÕ*ZëÆ§ZÒk ™ÑELÿ%*_ -ûÂÅõøÆë&Í_œ¹©·ë»ÈõF±ßÇÐÝw~¦V² =Ÿª÷Ò„eF]ªÒ‰>#Öûq1çÞœ.wh7סJ³(Ì߉¯_C|ê0å÷£ÿœé¯¿¸ÿz8ñG@¼¿êÜOñÀßö[•ÀúÆhò«QI6h_}mªÖË‚Wºò•Zû"µ`9»¶§”÷T]kð0ûY\õ'z¹wdÆTg¡ä1šj\ö0 »TWRù+°þ¾y3ì3G‹ Ó{N ©[.çGI-ƒÅdòÓ-‚#õX£m,‡« aŸŠ%-‰üªõyÞí>%ì(é1„åw\’¾ìÚÊç÷꡿s°¤B;ªý@õVÕ–òål,ÜàZŠ!*s¹Ú*vQÝZŸ¿^Êd.¤î;ob܈NN ,¢­™F^ŒËoˆ‘ÓœÔ)CÎÃ-–©ê–)Ž+Ù,„Bw/$¨÷Šè½ÓŠ ssÆÐØ?Kô‹A0t¥nó^Ë.Ø#j­Å òÝyž 4n†’´ÖK1ꬷ@‘d oizïöãó< ÁLã#óÏñÐJÃ28å4 -'9H°µ’ €Úpº}ðññaƒ™×ëe±É&y4´Í¨ÀDÿﱡÌüz½ªbÀÞâÇÌlÑÄ+ ™õ©ú~ÿƯÿ0|J¢ð=UU¦]ʃÁ<§BO"e¥fé²J L€H¹“ â!¯6âβªc·0µI‰.¹+ n{¦T[YN™[9•!@ã<œÜ»<÷’i$ !ñô ‘9‰Í% Ì>‹r­ÔÞ¬* ¨©‰ºŒ‚STæ³ 9Ïi@¨ùƽ7VmÚf% U@ îÊ:E¦6Vb¦fV:B2ç[qk­=8Îršs˜Å< mÈ8Ïó7àÇñ!$" °u¬BtPsRp„;PsX¹èÄ`æAÒ†¹«ˆ’6"¦öÑgŽ™bÜâæÖ=wD¦Mz,xDU,Ù°™HèhÌTÇTXÖ¨«s“U:÷©$cÚ6飙jÁ:ª›1m”\‹¤>fGï-‘e…Ÿmàªoˆîš¥*ŸïS›Z¨‚éçí¡BóŠÂâ ÐC:“ÅL£Ñëð¢)©ŽÉ% ¨Á<ˆŽÖ{?TdLâFsÌ9'* Ž39úª½sv2YT[4>%BàD¾‹z=%B2†G+ª´×ëãxY5aÇwû šÓ#¡PhC»øl¶–¼ZÜÂHæ0Făè«VϤé±Ä‰Àë²GIüß'[Õ™Â{pQOKÔ}†½S½v·À’ÙøäK¾ÒÞ‚6᪸º‡rYc‚Ù/,œÈnù”U´õžp€$l®®ùsW BZ2hcŒ!¢`t^1ÂZÜ.¬Ì|B¯ÎC&º¬“Áµç\v[üc…†xбÅs\Š»ËM=¼Ì…/ßHÂÇWIA$èCÖÝ63¸‡´p9^Q’ «Až JŸg`õŽé“ô*¦Ÿ^$DlD…&/À¨{u‘yñÃe½ýnž;_/#Ð-W™h#=¾ˆm>9;¡vùÞ'çÒ &ëâ+ŸýêÐB+Wi7è² âAºAÉí¸Üä ½¾s ×¾=÷»»qßFn/þÅ÷X3€×øáò—óiu±#]Y¤‰o&XZÖFðVEå!{£ë*kÌž´Óè°…!¢$T}+êŸ×‘Äÿëךóââò_qÿûά¡ZÕ‹¼¦¾)Øtå„ßÉn»TÕ'é3³¡cu—.4ñ‰ª¹‡;ÛžÙ8ÿŋþÔD¬ƒºBâR©D:v\?€hÈÕ¥”ûtÓ—…Š Ó@‹¸ÜØ¥çkd¢š¯@€Ô%ÛÚÕ¸)gB)P»Å¶{RýÒœR1Z½’Kf:é‘M…¼üÎK“LîñÜ2ћ٢¤àÌ[ñȶ»@#JP\'­8ÁE«Y _*º1<}ÍäïÅéF”&г1ûÆ™‘žªzMîÙž§tÙuã¿}›<3M¤Õã‘–€EÊvDûÓA‘Ȝϑޞ¢_%4Þr‰‚}^rª‹Bâ†þ¯¯åqTŸ9…%ˆØ,º—GQ*®8»nF{›íäfx­º¼‚àë#ƒ@•¾dVosý´ñ«4]D« æûU½º¿ ´ÊÁ³ôºúÕjа"Q¾H!Vº0û·A[1„]mf*”4’NëÛ—ÁøJÏôœÌCÙÉò.-zÅòRè¿iè2,ñ}TÍ<„©¦ÄùÿD³FV­-’þEF]RûLçªÐ±Š–€|5)ûL 7+Âö¥k¢Moð‹ÅŠëOî*¾‚ûÿEÏm·‚ —¼XÖ~#&A—Þl‘˜ í>µÆ­½wIŽFÔ#i8  âFw¹0*ÐübŠÒž¾~ÊZÜ0¤¦Œ½Žæ/"D¢S&f®-fÅUEøõ2'nÇ+mxg“øÒZC°é îŸsÚH£÷^) êG½ŽÏÏÏ9“?•1 tÉ䨰/x‡Áô¯×+ç7—DÁ°\TuŠP™œ¦¹öì'€…7"úí·ßRFPÿÎZÌOD©*$ˆšN:£TuéS]_2…&ñ$åÖhްΡO*¸W'P[>EQÙ;iËŒvزá¦*+úIÓñ›©²í)`RåŠz9Å,¢’ž2;}Îi!çÔ21¬xmgŠPV†’6ˆ³wÌGAh½7´ÞQ¡Þ˜©Ï9?þÄKÀÜZ2Í­;"8ÚfšJd‰­èçM´hyŽ!>ᙘ0éƒ%BOUýx½Zï&´o³9‰À­uîŸçP"æ>¦(5(AT¡L )ƒN0ÀLöÌ ¦)*BC&ù8Ö…[S™ÂÄðÇi†;œhŽ9E¨§Hÿö©ÌT2[!0¸µ|¯)r¾OR˜ìCs¤&KJcqn ¥i‹w(,¢2„ZcfcÒ›ê$†SÇèGóœbo§ªïó­Ÿ:<}hÍ6‡ç9ÄD=Tÿ2EZïº jÍ–"¯¦JsNcrû´Ÿ‚}Ø:ƒ´qGŸc sëMæ4¥Œ9¼M¢¤x1¸Š:çd`ˆÚPTTÏÏw$ƒˆ†¯7Jóëu¨êì­·ãÇWïsÎ!c ±r¢°| ôƒdó2õÜuSxèÆø%VÔœüš~xŒCàs¾tÜAÑÏÅŸø!Æx-í´0¬ñ _`s”MI¸¦UÀ.®ûjc²t§Ì!uò>»ñôNy¨N÷K®…´±Ó'¼3_œTsÿU F¼¼‰ë©á±7áaÇŽaT¶=&Ž~Ö›ïäbßo±¸œùÆû½M«½ù^_¡‚õ.«*LzJú}â/çã•T»3mÓû¹×Ñ ¤³!Ú€ÏØ2aKvàƒ“´e÷%Ùu~°¡¢2WŸ"ºG ƒ.&HÛÝ`ü’Á‡ÝCÖ­öKÚÆGsñç2 ë®ÈN¬51VÅTylm†$$q\]¯2Ù=žw³TÚ‰5µ‚ ©g պǘd>ß™û-Í@·d¯ÍK3ŠºÇ âËõß?WuÀ÷IL¡Þ›–£¤ßfŸ„*UKKôl½0½S¤°F*‚æ;jšˆ˜pÁëe±y¸‹„@smxHÁÓ6P))ßÛR1ãÝ(ÿu3Íï{K(6oÀ¤:-ÚóYÉÌÉ,ž,EW™K®ú]«.Bœ\ùó +›U½Wøül,{%š’æþë-ÄC éÞöòÕ¯ùF&Üì#Ÿ"±nSdΡŽÛ¢ž[lÓ–·@Eÿ/[tµK®·"‡Îe̦™]Œùˆ4LÌéê…eŠFRN±¼’Ãþ\ò)Õ5{ ü^êòÎY¿fFN PÎBg5ïûÉj°4ÉÏÌù‚ÁGP$XÕùR1d Ï·í‘Ô*êPmÞ}lgUýöw|Ÿ¢îZ!·ÝcMº*¸`Ò¾äÖ0ÓÔðnw¤@þ×þ¯Ø l+hÌÜÚ?>^¯ÿûßÿ}N5†•g˜L4›¥^[Vo ß•¨ƒJàÞÛ-/6O"Ì­ýk€E0³[LÍ9 ¬2iN9,«š0EHiŠ ƒÀZ?,Ë]U¹Q'™ÒAla¶­Éä×ÑÍhLiÙûšô* €:°åé/,$qÕl•Љ²5K°žÖ¹£AhK¿?émZPr‹™Þâ»)âA*³teÚK¡=¯ô—ˆ‘wC"¾‹Lý2+é{Ë>š3ƒ…âtÕ£/Íý3¸P Ø_ˆ_d½úíVGÇâ³ üd“oÛ®wØ…/Û8@sÌÚÍb9b?‘ý¯F.ÐSTžÚˆÈ¬pÉÞ0d¸%¬ºLœèôofý ¯øìЯú,.VO1æV½±×]¹wÈë]êmw–úÞ&)i¢©ê]=P*Ÿø[¤ßçâjð<º ýºƒÞüî‰5ŠA‘Y‰ Ç5ë²â*±Ð<73 ‹Ôç‹ÁF§JO0ÜÿÚb·$¿(È Õ>ˆ—·)ˆ­ñNÂÒF|[ZØ<ô ºú[òè/t‘äßÉOQew¹CBà ¬Ão…V‰ITÝ fº Õfqk˳Ùt‘ÊSíýz³}ÃI3R&¢žØzàà Ì©5YIàŦ†Q ùdŠeŒåÅÌ­óš!jÈŽm•'íÆí= 5¬•²YšPè¡>úÈú¿Ì¥’j“VBÛjY®n7â©úÛ.ó•aÎè×en¹dOËèµÂôûóhÂ>Í ˜š®ƳN„â0¨Í×ôVËžîSزԩ d„ûd¾ônÑ—S¶Émß‘ÍFJ ìªïÌ2^ÞJëôQ‹,ìÁ\0ókò›¾ž[Í5—j¬PðÊ`ãHÒ˜™£ó&ŒÅœ'…«F¯¯›8z_æ½îš—¬Om~Í𤻺—.|îô"1O—ÿÇ](¤Ÿ±±¬Då'ÉR–¡…n•nÅå9Â0Ì.UO’ß6iºìœ¸ùO–­V £ªÀÈÊîîE²B ¶ç4鸺&ÝÁ㥠&JÙêØïî K-•ç ô6‡À¯P-ü*ã÷>_¨?ÑÇaÉ}¨ð{±5ýšû7bê=bû ì_Žþÿ¥#•_æø>L§ðÝ/”ñéÿ—§þa]Tûx|£9À&9@eÈ/Û8¢'e'ÒÎ[&I!)—_7†;kºç¯w 4º•9f‡g:ûÈõ¶yîÚÔ=L#û å@oŠ¿Í¿u±Ý_÷…÷Û[3à#4™ü° ÑP¼Ob"éÕv¾ÿp$ÓîÓ¯ñ‚»è¿|pŸ@üï|ÿ_ê_¢0£U9˜™û ÿ‹ 0“Ô¬-©Ì œ´FèéùCsŽd4Õ>¿t°zï+ìHâÆŒ6æÌC¥–µúyE¥ÞΓFq«ÉÓL§¨r[ÆœN_ºËàqZ™é¢^4 ©AµUv¶N8^"ÖUÍyO5ËÖ`•AkQixÌ9ÎÓzv[.Éb—{ïö%•~ÎéÎe±N³ì0–†]ª¾Ïw–\FÒ's¯½¥õ!ɯ7‡û#Ó¤]Ou‹Êoªµî‘Ëñ×>>>2ÄøÞÊZª°ˆôÞ ÜOW¢ $¨”“——s‹ú/GÃÿùÔ9¦»¥f¹eq·Ên^Ùš’È$¸¹…ª)C+©­ “-‹"Tcj0Šíw"ÓÔ={ÔÖ<±¯`æ5Àe0 – l—š†&,͔Ƣ-÷T‚P2!U†HgÑ[CO{¨È€¨¼Çy¼ºª&—Êñb»°¹Yó6˜O™êÖõÜãÅè[cU ˆ£þ|™Ýçä¶vEæ{ŒÞ;Éü^ù5U`£;Õ!òê½5V5o7n æ×1B`h›Äʪçî‘ô§ÔZ V–w9&A»Í¢–8ÛÀê>` òëäÌ"Rˆ9Œ«QÑàãhV3Ñ @ÅE¹-BéU•{“sXP0ˆ'©ê)(4nLPž;) 9MÅ-S{ó³[ÜÎ^¬L2æ”ÉN\÷ÉÉ´Þ†¦P>šˆˆ«öÞ ¢Ú˜µ1ƒ[³M’朽q¤ž˜i01HI ½±Eæ²æö¯Ü¨1Í©¢î’ÛTmà-ŠŒiQ0Úz3ƒªpøÇ¨ot³·Qx”N¤¦µˆÌíuêüñ£hù%†ƒCïž^>Õò“uÈ´VGlxG@cš0²'»&QÄŸF%˜ÞÅV7öp`µK‘ÀìöâIÕØ lJÁþj©²÷®/K†-þ6›_Ë/NÊä2'/àqö{9¾½v;;ɺ̘ý@ ÆFTPÛÀ½ßI¦Î¹Ë[BŰ‚Ž»¼©Šà/(Éæï?gÅžC¬£åªúÊ ˜;ÕAåÔôáÙ>2!] —)Â.Y¸hrmÂqsìæÆf3¨ÑI\rbïL¨«äâfmç?ZÿW›;ª^d£z ¦ÒÝÕ!•Õ½A‹\(n4FX­“‰{_—ÞJ•2õ=»][JÉab[|nÁ•î°™)ņB"ÅÂ÷ÖmØ©‘[Tþ7Õ%â0oZRåò(Ïò£1ûDE\P²…£ƒÄð$­GüÌg÷=ãˇ’9mÅúØwÛ¡ãI¾ä-óPV…°FUM•7•öÅ…–_AÕRЖéýp÷öz]ìš½¢Ý¢oQvvÁ66{&¹ßÒh™ô*Ô¼BGu¥È|‡Ã¼Š ´Z^©úÈ¿_N”+(uíªJ_àO ü.œz]háÍ|M¬Ö¯ƒ6Põ×@ðõ:ñ]%öåçÀö‹?€ÒÿÏ |ýƒ?ÿõßüÿÙ;ú¯TXü ÇãWçEý0ê{ÔVf¾=홎[o¶1ý·m…êpýžOl›%kÃfTFë>û Q£e¼Ùï`›CpD[ª%ì-œ×¾!À¬–›Ù¦Gû`ÚñˇAö³ÒªÔx ’ÖžQ¶?õ`¾”X¤ž61´L ÛòvŠd~Lˆöź†<¹íßÌÇðäÖZÖ IDATÐú´HŸÆú„üK×n¶!Ž­Ì9Æ0„×Ê©ÿú¯ÿÊJ4Ï-%ûb…3«3”ꌃ¯•HÒ6Â`©`kÉEUÆÅL€DÌÁîµ-?Ý æ¼03ÊPy9i{fàX-FÍ= <’ZÎb¤¬É <Ú3#DH‰›C9:§Ï…Õž¦Qê_ô†)–íA1j·/å<ßn†¸ âðõòü!@Åæ7"¦_©èNù¢µnÌñl´˜âÕ–ÍÀLDc [*¶NVJØNä¯ Â¤(³…-à·æ èžçœsÎùãÇ?~ØxÃFÌœ)Ó¦$h­çy1ÿIuB¡ŠÈt¢Þÿï[8ò3ÖÙV>r4¦¨G¨ÉœŽÑk#1l]±dÝHªÐn9$ZfÔéáŠáý™˜h‡ˆWú–ÉÕ‡ZÙ¬@âêuU!™Ã0PnMæD°`~ûüùããÌÕF¤ÓÍ$ÿžï“™?èÐÄH»|ˆÍ¹$Ðv6¨L5É E.0õ©@™ ÉÔ©gëíÿcîK›$¹q,qÐ#RÚ±ýÿ?sg[ª '€ýéY‡ÔšQ›ÉZYYq¸ÓIàáÃSpAÍ€Œ™¨›Lª ÈØ€ÀŒ‰{g>¼éëÒŞϧŠÚA1«é³1#¨„¸w@Œ(fî乨æ¶9"z©¸å¨©÷áÆcˆHª"d jy² "Æ„fèi0,ºü$Æû@ʆHКë.Àt\G0P')0·!9S;P$?9%[Ž€kPAiØÂKÚ@µ»9¿™Ïçh öžôë6¸&FÌþŒ¤h8ç[?O‡ÄÈjÔÈÔˆŒ°PbAm`е{#L®G°Áªu·}oâ©1û¶ïþ[¢fæÛ5šqk>õÑ;!ღ:\:“š~!O2ƒÞÅõ/³‹gÔ†mÏÔP Ã; ‡³–ïÿØEa¬DÂzNq-ûj=6„…6XiXÃu£LÎþ—ï—¶hµxYÄd)˹}•†ŸÏjdÕG(eÍ“Àž–6áSP¬óó8†¾†+”Là•ên T²¶AÙf€ pUÞ9 —S Èm£Zÿ§×OŽÆu~Z´«q] ±jëãÃØ|ÁmÙŒž"½~z7GÂe`ïžÃÛÉÁwgVv7}üGaJ©¸rÿý¼üÿøïÌ¿}û–{¹HÞù%V‡bíä ­ªq”IjA©ƒ5—-fi±” Ø†âªsöG –y]p*â?J=¬}^t,i[éXáøºŒhjNZÕDÝ£Ъ1!˜Ç<ŒôÐDÿu$’G¼‚ª 4vÎ0Äg*ªÖZ%ù–!±±{üO}pGeî÷Þ™ùóóó›3@±½ˆ€èÄ(3Qc¥v2=Fççz Së¢ ÊCÛàùod>B0UU×tí#y‡PLA6Kþ÷€T‡ºYSddB·$öÁbŽQðqëxx´æ8 "bJHàžQçÉÌ<|À¢qF@k̇æn­ŽLukG”|±QÁän»·oeC.c¼™2Âlpº”H í<¹…`R‰™¡qóž"dHˆŒÜäÌÓ]‡m!’1ˆBŽ|ÆMs5À ZŠjí̵Al¦Æ‰ÐžìŽ#ó¹ð†'Sá¡qP=ˆ¡R¾©n!®–jÿYNŽáš–¬ÏaäS†Ó€/.žpˤޣÚT¯§U£„ñ®†PŸhxeb0 „:.ªÅÀb*È/z1v¿ÄÏ^ùøÉÔNXån_qyBšæ «÷ŸE ÞäÅ¿A¨¯`åöO’÷P…ÕKl•áÛÛ~ãÊÂ~s×ègß<^ßGÚÖ#x¨M7ä7¿×À3ó®áþÝo/K¦†Ž€Zõ=_.oÄ>ÕË•÷ñj•pEg°ùÎWÆ´3}R׸¡Ï¤®s ³‹ QØâ^§©hyh°Ìxà†‹ZÜN&Ç‚¶yTAª"JtEZaU¦lzYipoiÅ5¸á%îüR%:Ye·ÈUäqãà4î&¾›¢GxK×H딘X²Ül“tÀ"=dð묢J’n<Îô,™º«ý•ŒZrvƒ¥"ý.àÚøñºQõ²™#…‰žƒÖ«íb]0%üáFn±l)~ëe¦Ø~­¦:LaŽéq‰¿3蟢4\Rå1¦ÌËØ5µ/Û–2Î s³Rކêçe3œe¿J6Éï yzØVW­!ö³8ïîÔg#7d´wSH[ÍÖ›☓ߡ.m‹´ÞLNs—uhäT{˜&6i´?‹"'‰ ¶í4-­\+·ïžq+yïO^=¥#\Hvš4¥ˆ0µ6£ðŽÏTœ[ÈoÖ © P Ò6¨½f*XIY¨,óâB»yLN,.éœ~kÞ¬­[Ë’>¢xL¼ Êüf†Å•r©Na'ì·ii¶½ge0_®KêÓÂëg_Þpÿ§¹wáPžšýì¶+µø%½y“êøKè¿}½ÞÚs–ùúÿ#åjþó=ZîÕÈþý3»ýþO±ýÿÂOÿ/óûïÞø,v.önæõ&i§ç/Äþ{Ê>~»Î˜ðÊ‚Xov‰yÂÒòV©¹Î ØØðrФ=§ß9Þ ezÃÌ›šóý×ôa€šäÈ>†aÐmov’ý'S:O  ÿ¨êéu„¸ #fò;ÅÁ`s°ÎrñryMëlf½=uƒÿ®‡Ø—{…Ýmˆÿ]:¦*~x{ýAeæ_eøfvž'‚=Ï¥c%pµÌîó43‘Ç8•Uqáß,Ý‚[X,]ÇèxÈ)Òšì‚éÕhWªB­,b]«#œ¾’†#º^ƒÓMX<[Ýu„²Âä°{îä8G½õôËqa‡Ù£¹Å¦ÄWfæéT¹øNŽzQUÎîøNWah£÷‹ß·ÆÃ"ÀÜž¼Sñ O6,, [óçÀ(N &˜èÿµÙóÒÐßÔÂnÈ?äÙ{€I©¹p×`U}½^><È‚ÞßED¾}ûæþþÏçSU???s5癚ƒü`£ ÿÍçóéïËá@ %9À§ˆ DGô;#ŒË›3Öb6$£8‹ Êð{Zÿ#_ ¤”^ÇÐ¥'|F‘ªéY!œÄœ>¨HÌ 3\ÔÄTÌkÏó€óì§ô°±z8@OÜÔÁ¤‘(5¢xš_ŸLðüö:Ž! (™»Óƃ&Ც Òåq47FçÖA­2(6&1°ÞEDÜLÍDºŠðÁhȆdÄ63$ƒÆOYŒî¯ÔEU ˆ ™¤ ¡Óóñ ¢SÄÉW½Í_Æî&¢­5§/ÐKÎÖ0¿•ôóÛg;Ó0ày ߈âÔ~dv¼¨Š ¶ÆbÖÐcè‘hH@†¯üÀ(Ñwé*€‚r0{/𡹲žÐ@MRÐûk`MÆ(¦¡Æ7@3Abé'˜²CÏÄÌ'ô~6$òEÈí0°ã8³¨ùqø04ð¾”<$ÍR¬¾z ˜ } L“©6fÍ`7õaŠçAdŽLxŒ¦ðhÂS4ð"±G=Ïãe˜Ãš©&ü`¥Å™ô€hÔ¸12¿‡tŸŒ‰µüHì+$`04bPåÖÚ`°i0(a:oÌ*ªqS£¶†­áÚqØò¿PàdsˆþLAG5O±H²x«*îf ÛiHª¸°ù §¬üÄc> ¬Ü“R…ät`Šà˜]Xi2iÖwÚ¡ ?wí®Øèo6k(NšyIù‹Hݧ~ÓÇdÖòغý·ÿy«Ü¿ÎþÕ*ò‹÷êΘöL×5”ÖÌá¬Á*öWÒwà:À¸^óŠÑר°eñÞ-ä–dÓs©®ÒÛ™Ê;ô{ñü²eàH5‹Û¿¾*ù þW˜X¹×ºÝsÉ]1Q25•b½¥Wãó5ÉcÅLç=Ó~im<¾s·þa8ë £*y.\“÷žöö èwAïÌâ¿À‘í+8þŸ†á nýþaÂ/J7~z1üT‚øƒñî ˜áçEà-Î_gŠJI¬§¥ä˜™"µ¯Èý%BТ"„ÊNŸ_šÎB8'«"að?'ú¿X^*xóe†î}`u Qdä‘H€ T>Å êljòü6Í$ßù%= iòXÄϼºrà®Þ?#@–Ç7À­ÐÜðûüxõ…ì‚ûg,ðâRó¥ÚþZô¸gV¯Ð?ú´´,§ðòE(Ïš¬„ó<ûùBÄ?þøƒˆÇãñ,§×(ø`( ,Èç µP†u•áÖæ2…E?O²9t þP+ªˆÁY#q×úI*ª¡qV/.“t퇧×C0TÕFˆnæ Ô6’^(à ¹"Üš´ã³nÈY¬F«Ð˜è8Ž%ç­Ä Sü“‘_Ο)sKÈ1”æð¹7b‚Ò‘Æ«UÙøøTéÛ3‰l°‚WvX²u²[ë½W­IïÝM~<Ý÷<ÏçóéÀÍâo/ëŠtõ=&Î$\'«’á1A ›ãCvz¶™!#Šï;þhà0‡ÄÞ¯‘™ª{Ñ3ëXBp‡²à‚tc²$–”¢DÄu¾n+*h(½Ÿ½ûØÌ}ÕfK#êÒ‰øã?}Wgb1eb €Ou'ùóÁ>MÁ µûìå쉹1yN=A—n&¢ ¢x¾Ñˆ˜µ ü‹)!»Í "ž§g¢‰ð€ÖŽcÈ~¼SWðŸl X?ÅÄD» ôÞ‘¦1¿ô@´Aº÷£RF4€gú!;|€':pï+D»*ˆƒiKLHînïó•Î>D|s£Æ*Bªâ&þbÃÇÖHÕÀ4-p¼ÀŒ ’/PïÙÅÀDb;F ª®Ì8VB2r¦gÓNB,öD£üÕ¬qÑšºÆ@º ·„ä]?9ó·ZMóAÇám¿€™@?¥‹ú,Ó̈7ž{!uü>lÍQŸô±M³@õ(è¶jØ‚k³È)ÍÌ€? ÌS˜Ð¶·¼¦ AÚP•ÿ†ÍÁ%ïoEÖšco„jËcÅ1/Ã*« Âä–V—ƒ«EÏbŒ>¬m»TF Añ³°ª'¤?xŽi—ÿ% { voù¥;eç‚þoöô‹Ëк‚*ë_UU´ZçmÄÿä§_­{®Gað7=Çò}1µ7\Ýr‹ŒÅ®Hëp˜l›P®®ýÛuN¤1)Ïe~CçWcñi½e$TP’H)ëEÖ0üôÚÿ&~ŸŽ…>—Yf ¥ÃJªF2ûÏ…E°gN¬”É ¬ÄȳJûf Sî·=jAÁßÃoP£6\¾]&9Æìj.Tïl¼þÊ Í›k+¾ƒ µÖ½7ý“e¯ø¡G"­>$s˜ºf—ì¶œ&bàé8 Z›B‚ˆ8wà?²¶iŠ RM$Ç,€ypi]w2§tÁt¬ÿ:áºzêwUÁý0’fþI´Þ‘u§ÊÔ‰èŸâÁúIóŽeøÏ ׸òÍ¥-D0›cÛïl¶ÉmsX[S^ý¯¿¶'ù]lji ¿ å]Ôi[jN¥J ß³ ‚á_·Ž™ûóã%CÓ()së£af¸8·Ø&’ÞófÊn`°FïäÝ‹ÔéUä‚ÀJ®4¨i¯s·Y Èæn‹ÝLkr‚Å,h£df@s,?=…¼ ™¶8ÃÙ%aoÏ] S.àfäz/6y£¾A¼ÁqñZÌ»oËa¾ÝÅêÂ…N[ªSY‹e&ÞAî7˜¹KWÜ'g¥÷ßíhî&£nq.ou]™d¯c‰²¦n1&ÜØ÷u¾n§8•++`¦_õë÷ü!þê/!ÏÕ) î Š¿¡ÿ?Aÿ·/8º_PËÀ~õ Úß}µÞýEûLJ_Y>á_zÍ_þDø³/~ï~‰7)Á3DñŽŽ»&×ß³-ëmýÔÕ'ÈŠôiú½aî›þ$ûËDh¸Š$ÐÖXÂëåp:ÁÖ)ÇÜ]M‘š…fÐYããÑzÑÒa?£mBÆ]¯Ødìùñ§u©Ö…®a[4±\~ÿí÷ççç Í#Þ ¨¡*JêoÏ'zZ,˜?âFENÐkDÏǃ˜Î³%K98õ†ÂT™¨wqÜ™ÇÄã=ºzr,!ˆ GE f#ÃÖ¥Ãë”nçy""ƒˆ!Š©ö<ïµ÷NÌ0¬á‰šG- žâÏš™‰9¬ ðê¦fG;TÄDãŒcRH„ÜL¬‹¸>¢6lè  ‚O=­ sd5 ß^&sjž“ÈT¥qS0¯¦6|‡¼Ì{ì¸v\pPUôä\A“n€ª ”T»¨S\}”×{g"nüùí2£ôS»ˆ*’G[ ºF'9Íëɱñ1¤+*h†„Íx‰°ÞÐÔZcbJ$²‘ß(§ˆæñÐ:ºúñ b÷‡…Qºšéã8œçHÆ#}×ºŽø ñØ2ñ°“RÑÞŨ1·fá-«gïn“æÙ@ÔŽ6ê´  Î<º:aæa–†§Ð}:UfdH ón£+:S >Q›´(‘ïãpï°<¶¡cº<‘šÕC fôÖ‘gµm†i-íûQ8Íô=Ls)³À Áý¬ Âoª½L^¢Éⴠ꣚n¾7i±²´»acœ!g^ûø5ϪZC¬ª£ Þ6Ò—&hùëGßv¤{¾kø¹je¯hWã”!3Ô‰$‚'~×~}§á¯ñu’qk t_˜n=6ìnïVVqýM$ï µ¤/Öîä^ÐÿwÐÿ v¬s‚¡i["Œ8ï‘aCL;'°Æ2ã}¶[®ÌӇЦnd{r( )£CVj4ܱVßµ”Ûƒ¿Ô£¼#£møHBB5ÛrëŠ,Î!ÜܯL­oººÇ`Ò 2ZeÑJÝä7&Ž ˆTIÓÖj鋲Ý÷ºµ–ÅiÅ•Sµ˜ïƒAv.PD®>'Q^f&Z'pĈ€¢óëÕs„…w|¼Ô0—ɾ)‚‘ì²nÿIs"-!(Seuå+˜9i`x¾ÎÇÇ3Oã| ׉ûÅwX_#)nÀî8KsEKö‘™¼^Ÿ¯× ãðaÈê ­ íUUd|kÕ°1à Ø}‡ÊÌÀ-kTD˽ÞÃCÍÔéÒDÔ{o­¹aÔóñDÇ@ Ìsz=ÜȽŠy  ȱ÷q“Õ€|€MH¦æ)>>g"ࣱëÉ™ÐHGlrx¦°ˆF^·Û¯y{)fÖ%I„h"ÊL84&Ú ‰ºôóó?>˜¨Kgz‘ó<‘ˆ‘}Q2“¨ŠÆOÍ稢¦çóñTpw°ìÀü8÷»ã#_7Y@"jñºDÔµ{¾eÒcÜŽ>Å—|ê]87[oð:*§üFì唨ºD’mTÒOr¡9;lâÒv&,!Ÿ%Å6›Õ”vÕob‰ôO}ê±â˸"KYª‚Z|W%âdüêÆÊ½Ø@Þ55Öà­Ã©U­ýª¹§@W´†º¸m–~w¬IHÏILóëÜùsæšÖ…S6’$²˜9M®¯ø+¶^B‰mF[WÓód^×AúÞÙ]øI“°_­r¦ct˜ÏdÈaüRɽé5³8¯ƒÝЦvpzÅ÷&(‹š b¼\À…×oæ3˜á¬=€³”MT¸"X:¸çÀ¤? hy8°8Œ.ÙfÉ5ˆÅ¦©`Jøf`×»œŽ%n`¸ÍRÇ9üBÔ­ì„ú¦.%q3¼š{­¹16åÀcºM†dj³5¿>˜S^iŠáu–$‰ë€gŧl>-æax³Œ3¶9M8fÌ'ÔuZ ž^¥ ßEmæt¡Ø‘Ùã5½’¶ç®8rPÿ¯Ó/±`‘i[…ŸŠ$ÑÿÙÑ03Óà‰{M…P¾‡8Bâæu£v•JråSî ± ñ|Â’i΢Bîƒk1'+^“§3ÕÑËÀäœ^”£z™ëb¼‘‚Î×}¦¸Bežq@·ÕD>[¤Ml´‹?p±þ§Ê«*#ºmÁØT¬ù1X[°©ÉÈ”ÚÔÛJ"œÐ¢û|Þ1Ȱ`g‰ù ˜fbå»Ô@‘)#Ày»ÃxjhA†qÔDKMÄ©Ç(s”,,æ4EtÎÖÌ(s£ÈâY?ØÐ ÔøåHª TöU[?´ûôÕmïô$¸p!†‡fÀÆñ%+EU]ì8Ž•«ÎO˜)ƒ˜¹æQi©§6 fêÖªé?Xõúä€ ß,_=çà—®@~ ‡‚ Ù•fnP½",Áq] êKõ±îÕv¿É¯üb,3§rÞîлµÅîà p¹_Æá­¹µ} 6#þMÜì|Ín|ùámöMà¬}Ÿ oÈô¶´/¦ó?áÛÿ7\.ûá›<ªý‡=ú¾9þÄ;~åès§úÅ7nþïä#f7³ŸQ¬=Ú:؃ÊÂÉ'³|—OEpëŒV_?øBÓì|Žì €@ˆƒtï,;˜$8%Àªvº¨fh€m4.Qº;ú¨4 å:ÀƵ*AÁR°…u„×ùÞfìN=éØu’´þeµ9:U'BK(qB¼ÃPÅìﲿÐÜáø ÎoofTöß`”€jàŽ3Iu`Ýþ=º&ÕÖšÁ[ìzºôr¢ xK™²0ªÎ6 ʘyfÄñx”Ž1Š0dqºj$F’GU¥‘)05Âj†Ú‡F$º£XÃx@]amYÔ3I!ºI(ÅWÒa‘T‡î6K'Š=ùàH ùû°éÊf5Õ.Ú ˆe«ÈÒ²IDÝR¿ÇPr"3!rãóìý<ÝÆ”Ý\Õ ðáDiÐZóœØÚKäº20·QI'V .¼åµŠHæÖÚÇÇÓ}çó¾„ê ©‰ˆ©¾ÎÓ­«˜‰d¥Û¨YCdæ3>%Ç?+qÉÐ<–AI °!tP5õ=z\öT†#¼„&õÕ Ù=ò:–¡©ÕYšmŸžÌŸ”޼·ñ|àÁ(ö/€,æØ„!Áѧ¨»y#¢˜ê狉þøöM ŽÆÏÇÌZ#=_/=û·ÏO$âãhÍ/…Sk+FQ}¡†(ŠX7”ÂhÞñÙ×çIŒG *âË Føzœçã8~ÿø0"q&;0*žÒ‘øÉ[#ö=A©hÞu ô[ÑSÔZkHhˆ"ÒÌè8ŽçS‡¯¼^‚öÉŸŸ¢hfGãã¡"so@14jµbö†B<‘˜†üéÙÔ@ò‰@ Ûñx´ÆÌÚEUFÿOF€•lj ZrÈóÖûyž=Ÿ¾ð1Ž„L3ôÜld泟§Êàì]D úŸÞí‚6ÒkÕ¿%µ  q£†jF„ŒôÒNäÁãbn_&]™ÀD:!B71ë¾¥ÇñŸÿñŸöçç·Çñø|}ªH±ÔCà6pŽ´Ã<§—ðCS v[BÁ¡ç¢Ç{l1š0“ƒ¬ÜÐŒœÑF·F‹—F+œ #ðj\6u“/9ê »ð“ ø½x.sí‡+OÜË ÷°•Ëí¯ž„[ŒÞFí®“¼Ô¿¡Õw4$›cT]]ÈmúfŒSqÌ«h$a‹U"Öp/"¨Î?Q² P*Ñ8N<«¶l³ïÈK^)ä ,k!¯&½ûâ¤?9;Ùß´¾›KÏ Z[x²4¯üýJž¸Mà;¢0v³t žÁJ«WÑ.ÝMÌ·¨ä‰Õ–$ÛK?_ “Þt3)­WޱsnaúÛàúõ‡NÑÞNz<ÀÎ_~lsíÎîßJWâp!CØ5Ô×éÓ­5§PLÕf±šNA0‘ÛªËiÖõ9aêž{:ø)KØf8’-`F†Üq×[5â ¾ _»²ZˆpIP° "؃‹ ¦Ã ºLraJV1>†ÿϰô×)@sÁ2¿¯Qf›|2ñ/«z¤ÉÈx=ŸîêT¬“VÛé}½{™UóÀzÀ†•ÅŠ³ì[·ÝÜm© ®€ò…oSåÇÝõ8¸—FÙ´oÚÆ ÿ”Ø?ì.ü¸#ฤӃ­PöB¹Á:q³ Ú«÷ˆíuóùu8yYQø%foþäÇ¢låÃed'™ÿ4`÷]³¿´·¿óÅþžqÀÏ]¤ŸÅ@¯ñÓæÝöþµFÏÕÔÚî®mM¤ö¥oÕF]öÆ+¬®´áªÃÿqæÇ먈œçYldЭr—9ÚÜ,ô§®qü¹g mBoOfÍ€\ 'éDÕpà½3«bŠ ª8h#ã*‹èVF /iËH®o¸©Ô½úÊ0Û,7–:sC© B325£Qñ¸ÿ N°c6¥LìØúz¦ZŽ)‹Š”»†DdžÙë+¢ª‰šJïý̺½ÇÑZ-¶ºHk-/lšk;áÖ‚èõ·¾>Ïó¥ªÌ JíãÿúØpVñ(ô×0Ƙ ¬Å›º™OPþÁ¿Ú˜Ð”Œ‡ ~X–þ]ºk½kånźÝR†6ܬG¤°¸e«{%š*ª„ÈVúEøo(ZqR"tÖzüzÚDÚqdqìc*C4ÑnaÆ‘p°ª2Óy1jÃö<ŽÑ~¸¡©z¬ôçç竟ãñÇ¿þü<_röƒÛ)"] ðÏoþŽ@Ï#f?f¢ff €l¨&ìí3ùЇõ“/3u•‰X—~ŸÐÁðhnå΋ E™Ÿ¿ýöÛoöíOý¦'ž/…ÿõñhu µ%cuVÉŽcß²¦WœS>ó¨¯ï£óŒÕ½¶7r–¢õ©ù2i ?ÐÿÈú*'ÊÒ¹“." ]P@ÞãâàyŽ Jd/c!Ûg³’¬aÂ4¯á¦Nˆl­ðiÉÁ äœÀ!˜1n)þf¹$¯ ¥y„^¢­—AZ1]ß!ÿ¿˜#eYñÊ©U3µéƒ3yx ëßÂR–7.JaÝãb§K´èp ì —3(n¾–|ûâFVÆë˹Y[x\œ®Ñ n,§ÞÀsVMoprðC`[Têâ£_à ê:] ñ…Œq!¯–<Ås¸ŠWxyÜòó—šêZÀ:'ɵx‡ó¦ê®*bØ×álœEï2ZƒÛ…ß±Áø5ü8s¬Þ“ma×;î.A?ü™lCâ6ò÷€9üÑ+ðn `?ò×~p·ÿ èÿþ-ñ'þâ_@ñKÜÿ­­â›S¯ ÿ‹CÖFíÇwcÙ¦ g”îý ‚ê›TöòR£‚‹ø8<>L-àWS¤x,¾öZÕÙ0b‰z™¼0¬¤þôô·µ+’ ý{1Йk““Þ|¥y05Wâ!ãq¥ãìè¿Î>¥Z ë<úíê µD¥ÍÜL&~4êßþ‰]f“eÝýêìW³S©y …BFQ;ÈïyRHEÂŒ§³É¬ ÀwÉý«“í(œÝPÎâ­’Õšè‹N¿p ‹(^‹Ož·.£~¢¢/3øèÀמMUæ…›v;ÆÏ·¶HäJ€¨5È‹dD6S"÷ Ö>ïËb:V¨¡*ƒ&gìrDõúÜÅǦV-V]ª@’{•2¹³})•Ü+?#  •øt®÷þùùrÞ vÏ3ˆåÖH6»Xha/¡ºWä%!!÷xe7sçt"æÆÍñ®YD[kuìçéù­Œp*5ÕT¨‹ˆÑïäÆ0ˆƒµè®DÖEYº[ (¢aXÞúD›€™ ¨ ëñžZ󜵋 GÎ!Q®[Ï"A"z~<[k@ÌHèÄN$„n2ÊŠ"‚†Høú<‡~‚ ?è÷0ª7¦nafdFîÇNn»cC÷‹ÈDn N¨@5füýã‰ÈTZkh *ž®ÀÄÔˆáÛç‹ Õ‰Í@ôó?ÿhí`f_1¢ Ö›/ôEÁ†NÁ÷@cTd'Víý<;y¾," “ŠŠÙæQºˆØ»™vx0ptMj ¢èpfCu *ˆSädĈ)(!#†/—ÝÉ[)±8‘ÉÓl ˜Ž˜ê Ý©!¡«Ðèù8ä8䘢!AUåv¨ª˜b¸œ¯O"îÒ'™Ñ¬‹ù8°*•Ѫ¢€ÉÙõT™yéèÓ5B<ŒÑPD¦6¢ MUT˜ÉŒ´wEjþù‡Ï>žOŒlpÈÜïÒõ&’åéÙP\YÍŒÛÁ¥BRp%I6^±ÕqÕŸk'd‡Í)ìŠ'*ÅÎÃÊôްÔ‚LÕ§QÌ °ˆ 3ò:nX`qÀÌ«¯ ¬Fÿ«‘n­r R ¯€à]nÕˆ+H£ÄÚÌp™•ÌžnZF¬T'w±[1Ç{·Í•¾ž¡×ã`̵Äw¦v1 od8M@ØWùYUµ¦{“4ÍÉ„ë;Úu|›ËLÛ£IÀ4GòsZHëÌ£=ŒÇŦ ËPSÏ¡ Ò6ÂU«¥Šf w9j¯{Z ƒq6Kl¤Ç{󽈚¼ØCYõੵ VY@©1 "6,·"K²(B Ýùmr>¦‹ÏÆ ™VXVô4.!ä#y­Ínèä‹åzv¬#î<åß’˜'ooß «pV9h«™ùr/\©X¹±åsãxËÛ~äÚ/äâå«~BŸ´†›Où&jP ‹S|‡(ã[ïÀâï§öÿà«þ÷óþ«ŽæðüÌìÅïŽn‡cˆ_½B4ï’^-þM×zg¹‹¬øýK vòb0Û¦òi0ÐSw;e\&Ãp31ØR_”75Xö oöFpØb‡rÊqÀâ¼Ï|©$©VZ½©Ž×¡¡YF¢•ŽG«ø¦(¶J[úÄâDÍ¡¢î¯=§î¶e8,E}!çw˜ a$ãÉš˜1Äó”†Ò%WÞdñm!rù‹©r¨”ÀÉ<ÝrØT‹Ýd4d„(áäឣDn¸ƒ±3ê×Qu#ÂùùÉ­­ 3Ps²¶øãò|>=>÷ôLQæ¡OGªQZ|:Y¾Ÿ§9Ò÷x< ™w^F\¯Ûš5‘mR•á5p8\~Ñ~Yº;å+2³Šˆ9@oBDˆÔ\ÐX¿›UÓdµaÿjˆ*‚ˆý<ÙþÅÏßí]ÐÆV´\é"&:,@‘ÛŒK¨3»4 /¦jìàþ¿eñ ™±‹ Ô)ë-¶žá¶4PÚÆŒ){BP—3Ž<4WìAÉäóÅÇ1âf˜Š"ž¯?ÿõ¯ü/jÄÄ¢ÍcoÜÉ´3z'ZRkʬ½«Ñ¡|8ŽxJC¶adÏ`BHÈíìúÒo›ú éðqço¨ æ™Õ¨ ŠN·³«YÇæ*}ÖÈ CÄ.§žb2ÚFB·•7CU#&24ê$ît?ô:·±¯}#P†ã Ia£çñ¡]ݘ¿5æöp í:GÝFÄä¼i<\v#2ì•1³7 *"cZƒ–AÓhDfÀ$¢DÔØy`¦Öx4Û>Óêf#nw(°‹€;_¨éã8ä쌄3¹Ó—ˆ]!©3‚E^ýÓÌíAͯ¶Ö|§$bQER4:Úh¤¤fÇý<átm¸uQe3>Lüx>=$~Áö«-ád–SçVüXQ_0ßsƒÕÖeQnVÒ2€w¥8áv ›mDµùµJOXúÜi cÓG&FDQdâxâ6°¼^+\ƒø „s–O›ÿ‹F£ÍszŸ€G9%µ,ñôŒö-6G±-¸|Òü·@Ë…,löî>ÎìÜbLlÕÚˉøÞu¥Õåf[÷y§X ÑySÒÛ/ã`Í£#ç[Ú`þC"¼W°{F„`ÀÈÁ±çýÖ1ÉÕ¨V#×…#©ò-¾&;tU¥ø醋³ÃµMË‘„tgÅVJ7Íq ÑdÕ7䜉®ÁËõ´· é˜ÃÁÓý5ŠyÁgW¸ª°n/¼—ä›CÉSÝn¸¦/ª+’^o}-c`ØŒúvâ°ë½ØÝ±¶å¶}ñÊÜupBÊ]&%× ¹N4«Ó:0q"¿©ÔÜ' u¯ˆo,ìqšøqnó]lèz ½(ª$¤²åæÔG‹GM%. £¾ 4(Ã*®Q•Q]ù´àoø¸b$Ô;úk nŠ$Ô¬®Äz€¦¡ñ‰šŽq{Ã7cÈG’—(ÁùKç%‚ò*W5X g@|õ1¬Ž{SN½B^Ìf Ë]‡4€²yšfÍ_íy§ði¤|Ûì -$89BÁp¿1sm«EøÊœ†©¢ ¢ˆñâÌY¹ðƒ®D¸$¸ŒÁ¥Oã˜N¾…·£q+’/Ä‚^z38z1M«h·QÅÊ’[§9±@¾Fß8?)íjmtiT²Ê6®«ÂfTÒŽšfß|ÜÄehò5b²´ .3a  © ’˜¹E^n‹þrdNúw¯Æ³b1CË/Zê·¬áz@@™ëÁö© "N¶£0# ò¯µèÅKñG8ÐË]7X¤wxµž¶YَжœjØšuTË’²Ö nKè{Àz‹ž‰þýß¾È.ßðÇí :ƒ…°Œø#ù˜ïÇUöƒâ¿ëÿ£0âŽr~úá_ùvx½fwôÿ›—Š?ýê]bš;âÖ‘9§ kD­•dôú›PVGWÃ7[„JÔ§U[€f€LËßBXA¦ŸO°æW4Ú x‘³8óÔF¼`ró‘e*6n$h>EÀǧJ!ò«Á2³°© (¢ºL­x¨.fRAuÑÛ~Æ¢z<1»‰ÐòØiy½N›ÞÌðâÿS1„u=Ûm_Iþ­wöš˜±pL–6ã<;øÀ³•ËшÌ-Œ;gªO’¥þ{}ûÓ‹žçÇo°IÉŠîÌåŽ#Vü*ùkzJj>±ÑWkDçé°Â©gÕ 1Í’'‹Õ¤ª9c ¶t‚ ¯¹Ý\²ß³H“ÛÈ__ç9 µ÷ïè«XU‰P4ÛÏcHKJTÉ‚RU¬‹œ½G@õ)ŽHïÝ=sÓBºÊ†+±#nf*’‹Ñm’MïoÖZóx^/(3 ¤MUGôÖt3„¹¡÷þ8'ª˜*·ÆÌ2'ôj4YG ÕM‚‰˜ÈBõªª½wˆÌIçmeëÖ]•3¿wîA£Ö©Ÿ ÔÁ߈»°™¡R‹t@^ô©ÛºXغåúÁ%ÛÙ -HB¯T‰’QD Ö¸E6ÖǤ‘@iìÆÁIŒÙ£9Õžˆ Ô;d{Ùùÿ¾ýñÛÇoül<'PˆFȧœ®á`b&r‰Ž ÓpE$÷¿—r´ÇóÑÎÎ.j¨nwdJ@rЍ5fC445=ÚñlMM‘™€‰ðàÖ|E™v‘áƈԺ H—îÎ5fçùR€ó³5b?ÀºˆÊ'#"7³²á%`íɈÀˆÐŒhŒ‰Ø‘wEC #<wdƒÖH¦ä!ºì›!ÓHG8Ú+L']B 059»s³Øÿº‹uP$ n|x–¸˜6<ÌÀ‡f&{’)ÀëÏÏãñ` dF„̯-m—KþÙ̘Ùg D ˆ½ŸØ 6UQk QÀDåÀ ˆ @íA*FŒˆ$j¾ÏA±ÖÌeEÜônE¸·{TrèÍÅ Ö »pÄF9Þö ûɼöZ®ÞDˆ?ÕtD\|W*c"ã–cL^UÅpm‰fy0]`ÜÛÙ,öw¸]Æ€Ëw™ZnZw<ñ5]Íî6ܳö·c7.èÛfó] ˸:–,hf¨ª?•–ŠýUl·¸ËÚ²B.Þ|ñ`Ý IDATüdº.îÛX‚q%Àt;gÜz?$ Ö#0etÚ ïÃÞ.Л-¦={*rydÆdÂííJ¨ *®§9\ ±Ú%=Æü[o +•ñG.m ¥ŠÑÖ‡jÎ<*É<}Uòïò\ lbÑ)¡¨ªÍù¦ˆxp;‘ª²•-âèŽÉ;ÉÈpý¨ëÊ }Àò¬ùRñ6'0ìlY(î0É1U¨”×Ê"³›¼“ÉÞß@¥œ Dy»¾“)¬ôçQÏmÓ"·%FkãÓÔ©ÖýÝv;ËùAŒ©ø.Ð÷d77ϲÂ…raèSÜGXíÂhê6T¥.gŸ»kx÷ó°Ÿ»k°š2T@ýf+ÖBѶÏuÁd_ЉÜbd³šá`1Ò¿1Iñ:†P5 ‘v[Ù‘Ò–»ãŒŸó˸vðÞ[ãEçÜßu1ÿpP>³/píØÒtfÆÜg²CH†w ãp6«Ù­Õ‡ %Ð{„”Yø¯PÜ rÌŠò–Ä2â$°©Ý ð·Fäk&ÕaªÓ$6ˆ¶áÀQ`L˜çÁ·÷áX‹”w¸j ­®±¹Òä® n°Œh—ˆ¸H*íZM•i;",®8ïáLÄkµs‹¯)c1Ÿ°pÝ4¬V@PŠ6òñÜ[Zð›¾>#FvNxœ†÷L»ÁWz‘¼C1ª¾xãWŒøCYeÉ=¹\~ƒ‚þgtAµËkœÂ÷ÐW¬Ÿÿ'"r¿¼7›Í©þœ'E–Ñc3ü VËEÍ£ù« æçy÷?øýàçÂÿÎÿëHâ=aÿ&×ê Æý£þFã ï¥7Xùû»o–õûѦ'Ø@ôæ›Göô`RAO  K‰À`PŸ;)òúͽ!ñÖ¡¢"Øô‘æµ’ ˜ž¢òÐß½†Ma2×+GlU2}òÿL|?<}qeðkþf<û+r`4±ˆH$Ãvؼêñ›+<°-Ùï/•u‰ÙÛ¥iwð¾üª’á^$E|¬³þ%={ï…¼†åÀ®!¦{•Pjš4w®óõé÷ñxB ‰Z2µ—@¤é°!TW¸AÍF¶aµÐ }ð`¡-$gœ¦uu+œÂ׈·Úø\ª®ÍL²Àüëg”ˆJi6,È,]„‘qªà“"'2¸#ÜlØ2ÌC ί³Y‚Yñ;¨î¸mÃgSEÜ`$±{KÔ=çÊN‘óõróúã8<À®5Þ ýóSØc[ã†'ýùù­Ÿ§¶æ+ÉÍÄ[;5í2Ý>NskÛ`N)"»é ‚ 3­±r;Zk] Èà@RU·rïÒ{Sc g*Ô”=½ÚñòŠ%!°v4~48Ï×ÿ3ûíùÑÍ»@3SÐÈSS6TÓSº*ÐH R d¿¶d䈇f·®b#záy ö_ÿúãÛ·oÏçóñx<ÏãKŠ=UBUMG."#›½Nµƒ‰ÐÇ) vš#PG¥ébâ­Ñ`C)!7$µÖ¨ÑP‡ÃHh0#CCr`AE|lâ˜"ˆG@;ßLLL©¡š"˜Š‰z¨æ-*œýl I}æt€d&C¢ä¨OlX®û~Œ„ä^K($1s«£ãñpØHTÌàuvöP´¼U5³öx¤£4…53?ãx*èÇLJô~±ªÇÑŽCz70&òXZ ‰ q; ´íÖ—ÆÁ`F AžÐ¸7ö"ÀÌ’­çaZí¤Pïù—ä´‹c†]„ÕWò…­dÓö¤£µñXZ ´ÔćC¢YÕcV$¤&6—Ü¥Jy@¼/·šÛTÆ:$€b4qeF_‘úqNèe„;Cùí½½ùÊUçôÎÌäÖexŬoÃàF ²Qãëœ;éÕ<¦ÑÄJ\¬wã Z)ùe=Lñ\eå˜`n&k®C5œ)Ë24+÷®~€”îèù{÷ÿôlÉ µL†îÐÿ:ÈÙZ·e„ƒii•Ut™HU %t@˜Â 3½ŠÂqéÔ›[þßÂü®Ë@UmÕðïÝv>~šÝ•jwÖf#뎱Ú½‹K­÷TgÊpcŠ,+¼›í’Ž)’MÏ”…>?*Õ°Œ™KÕ1­¯*I³Jµ‡¥ÜèlöfWAÒ–Ö[&0k¯—"H[ÂpeüZñ¢¼àeQš®ìx4È:òoTsÁ¹V“´u ­g¥ë°m¢*"¯é&5½ùrT¹Ì¥ÆÌÆÀ‚áæQ¡ãT¥j ”»?`ÆÖŠÁˆ®Í%¡%á}\È4¦Ïîæ"$[f¦šg¾Ž…c,Lgô8ñ=x0—?µ¡ÕîR…5® C2‚…³¢""*Z'‚Cv“…±jrÒV‘ÈðP$2ÀõÖ;#„ö¤âè0÷W•¤ T/¸“QO"Tþþ·b¸À”[¬ él†×¸ÖÍUo™¦›Ê òLžŸt"…9§'b4ƒALY#%ÒŽ¯*'–0Ÿ”_HÍ”D]»L¯ËÙ;fÄ‹]^¬\*¢½)B>Eùب·É ƒBÄÒ–M8ÛR&Rçúð÷:‚‰¥ÐvÂu–|õ^ˆ¶Û¥¹ó¤É ô¥®ÙÏußöéP$KW¸§Žø*†Œ_÷›ïô»ûµÞ¸)¸p5Ùì+UÄ ÷ãýÿ‹Dzû%ä~ŠtþúÿŇÄÿ13€¼Úðs?І3¾±Øã8PÍx iÌg¨8Ä4„„Lä’k5=ˆ¹µ×Ù_¯ÏãÐ.]ú«Ñïr €T;}<ŽqC=¿};‰¸5nÜÆ[ŒŒºÑ­3ÂáÆ5ص[ïÌDFÎ=¤¦ä0J—té uœ"yL²Ždp¢FÄ3¹•€uoÏ‘ššw‘€¨±_G Óùêfçù2Cb¦Öhd>¢¾Î~ž¯v´$™YwæàXÿ fDL„ÒÔ¨q E;3ŸpfHW‘³«=Ÿèº¢Ö˜©™'¤_íèð)ù€Ç ŸíÙˆ\€ã¿æãŠO3á!’¨zÕ›™†Ü¬‚ªÙ@ÆF1üsã2ö°õ @ƒ‚µ\ùì¸üÂ[°rÈlÛTC(Æå%tÉ9*ÐŒ­®¯s”X}üWÇ(V4!$´2ßX¼f.8ÜZ†¼CÙª­üvâLU\ü¼²ò¯8>–Ê ß'Òtň·”è½oì9¼Kݼ,nÃu¬èáÎìhÁXM·—J_à/ÐÞÈÇšåó× l¡ÌI›U ¤†V&ÇùšŽ{¥œÇ`Zá⋵ }^°À*hhSQ ú¿II*¡¸@ÿ°‡<Ùö`Öh&b¯—ðҲÁnc  ŒmvOi[!5­AMLÀ®hÑ÷{ãE×H4!•2¡©hìí][9 BÔÎ÷¿Îc¶Ï@Ú¬*Q»Y?{`jÐÛ¢.b”)/ gÎ ¬~뢟¿¼“5/›’‡j&ÍxÂjôEºÏÇYë4…›$›2ãÈÇͶâÓyÊ3"ÌLEuœ>0\g¯dÀœÍÔa[nz)=©ÉJŽwþœæT`\‚IÍž[tá\çw·ÐãÀ/>Í0«|³WÌùbûQnÔî ¨¢Ît¸Óˆv2Økò*à°ÜÝBGÔ¢®/ÇcýãÈFŠ® ˆ4EUå K3¢1Ûà ¡»Ÿ¿jï¿¡‚Gµ Uƒ¾FÅ$çXùÐÊGs©¯öÍÀ3V#®¾ëí2é¤tÖ9—Â9±Aõ¬&¢ŒôÀµþ‰ðöyÉÞÂuW$&¿¹G™hì “Š$>SY€ïáÈ„n›“³Æš’,·õ°ÎÓÙù*WÚ¥¾Vý¨¯î"Xy´x±Ï_°ôBí+œÐåÉ“l¤š:` ÇC¸0ÿîªj9zK•Xæ7u-ì‹ç#¾Ùæq¸VV#L³?à IÞÇv}ŸÁvÁ{x4a¬\Ÿ"¿ÝÎÚWím\À•7[oq®7,{çÍ•Ù&?²á‚ó?ﺃ¿ýÿÄýÏQü,£ùg~y]øuz†_:µ1-¨³&[7„/Oį@âYIï*[›Û]IX)c‹MŒf1ÊD —¸»Ôbxý"šÏ¬™"¹Ë>á>@[Üq ¸ !0rl/VCX«Xm°c3Ø*)ñÆÍ<Ž”äƒÜE€nuÓT;æ/¥³W„…=¶¬êTG0Ý‡Ý µÊЯŽÀWj' »'—v8±¤/ a˜.Œt9Bø»:A&6ùÅ»U7 âjbPæ(§b`ex‹^Õ6o#LÕRDœ…UK3kÎÖÑÙONÍø¸ª¦,Ÿy€7Ž4Òó\¢wÆŽ¸²ý÷]£P3 òÿ»"Ävf1ºî YI'‚Ÿ"ͼ#çÓW]Âô.QB_U*_x^äXŠžT|ž§¿¬›Àp]¨Ã¾fÜSQ‡ã¹.ÈQ ‹(@Óÿ ßQÍh(¥ ÌUJÙ­)4Çqº ‘ [©,>ýª10…™ôóìÝ äÕĨ17v›—¡!ǪajQU;óXTm—:“‰­£ZK=µ¡G÷[cÄG{þö»~~¾Lµ‹PüUŸâ"4·rS¾ÆáÂåªÿ2é©4¸üà¦û¦Ú»‰öSœ½ÿùíÿöx5S3$E´.ÕF*`#Bb`™ÑrÐûç·??íhµF4ˆvBÀ2Üz”€óPxH‚Ϻ‘̇É=Ɖ›ˆsHÕÔû+ïÃ]'$h$ Ü@ÑâãÆ*À9 kPøJQ¥£ -TÄZ˜‰ªŠ?µ¾š0"J¸jÿUU±FHÄn(*¯×«¿Îv]ºŠÖ˜ÉŸ<CTEاLD`cN©¾¶}UDhÜÔ”‰TÌP 5V@qÎ.¢©¶£y£%*†@Ø®ü&",1{…l]ôæ3(n:û—¢àÂ[¿å°ßPû”æ¬å¯-Çò"FaòæJ>BÅ ƒ Ãö=ñùϳ¦)Xb<ö¹…Ù ¹~ëœIoˆÕŽÃ›—úÕJGÎùò×+æõCüÎhãþ_rûw·R¤ t†ö÷&z¸¾T &… ëØÂäÛ©ëéŸûf`¸šÌN€2ÃõÔ6“ÀÍ=³|78.y ×z…,ç¿ Ôtû!®ó¹¥5Mʧ‹}ïTÿ?woÚ$G’d‰éá‘ ÔŠÜÿÿ+ÙäNnúøAS3÷HUÕÓKŒÈHá§™êÓw”ê®óò•Ðýyyñ*ág‘˜´$ÃEv;_œ¬Ðíh¦þ‚y7bš‚Эh`ƒšøà¦€¹ lú[ÓçÛbh¦ëÄîZd²pŸdqþ:5±t;-Üíbi5b÷¹!•„„"†]ªÊºå±v¼Ö^F&&VUíÅa£˜`‚ø9kÅBìÅäÕ/«¤!}r`cÔ@.(ÿEä¿N€vùÝÔ‡ô••å’Ù¹ÚldÔu.E™ ÝUÓÀ'MåšÖ‡rþaÎÕ°ÍH+¤Q¸šm”zQ¸Êüúƒ¶Ñißy³ñG£Ð•ÿ_ÚÜ šWH²g›c Hb½Š2¬Q§y^.a1²1†êsrg s8\ršõ² ó@Ó Ç5¼ž rð4ùéïÑm×s M)#,¯×h—”11º­Ñ6Æ+‹³EéUÊмÐs8Ĩguq›S–e*ßäÑ|îj€à ¯sÁD)ƒ§*F’Cæ<ü"DäÃ=œë C×_~Pdȉ¦–llŠp­Èè/Rlqgá¿>ø |ú×(?öö?fð7ü0ßz5-Ðígà>ßtôIü‰mÐR§­j—ö¹»t†¯ðn¯ð—€‹TóàÚ2V;ËPRA#SvEä.·F$šÃ#Õøp&j¹Ö²…¿X^OÖîlçýcžõôrðUJbJÁÖ’• ×F±‡ 5aÐt,ãUR@–Ùõ~ÊJ_ª‘À„¼$èüDô ^N¼ö‰Ó6¯¢fâößðÂÝA²“bÎó|>ŸïÇûû»ƒ¿oïï_¿~uŒu#l½kšœ5œ²úNí »ÏzùÓ}omL¡èãí­ þro T˜/ÆÙ¦E¤¨S‹–‰RŸ™€ïœì7½H÷­ò}ršd'¢vŠÓd¿v³É ç­¥œ?ày¿|1Å^‰“pÖ‰šø#(²¼·ÙÀ»>¨¨¶öñx”ËÓRý·û+Âu¼õ»Ý› 0â‹|ÀÁnT™x½ºÍ¹N0ìÝ¥§«‰7B+€çsœ§·Zko}f(`%œ ²$B¦qùCþ‘ñÿÈãé»F#,¿%´±™ý§Žéjö@DÀp@Qzc ‡¦mœß¿x®­ªª•Žg2±ÿ&À„ðæf–#«vÏ·…9CÊÌ©åa´¢Ù'¾<˜N:ˆõñx蛽1óÇÇGÌ8T™h ÁäÃ]ŽÇ¡âÌ|W“ #aŒ1X$.ªCz<<Æiédwƒ}|ÿøöüãëÇñˆÆŸYÝçF•™UYEED=…FÙiJ6Ìøè<‡è¡ê>dJ¢,b®‰åÌ*iebìü3&Ïö / BFƒ‰Çú>DJ.w?|YÝ3‹™•9òáæ•$“ª0™aÄ QaòqQùãýëpSÜs8?úçÇLJ/4N5ŒŠgt¹Fâ…ñçÉ f ³s||™W†e›¦<á`þÌOio£6fºÝ@áE®PÅVÒÌkåú#š •+µÂ׋üûT‰C…`9C§=.-ºämâàöUr×FË-ê×ò”Ã%’j*2=ðóõ]X²4`Cr' .-u…𠆙[JÒê¼:ss¯a“Pؤ´z ŠLà´x-]?M}OIU9w%ß9e½¤ÅŸ­=\tn•É<]ÚòY•êW/r±-êàºõã.BæâŠN7“ø)ÂŒ%nã⦸š4Éa£üjº†c.›ë ìÒM#2wnÄŽ¯‡‹„;yÖB Í#bÛ¨© ÊÆ ߈¥ËÈ.°[JÞ ¾·AV÷‰2ãVƒœ¦S@:ðÜ©óX†,Ýs'󎛡9û¼å¦nÄ4Ìà*ÙkkîGÒfNø4þŒË—›ÌÔŸÖ'÷JM¦i2ÝŸ¨³°KHÈ/Øo€Ã_gëþ.À‡Wö1·ûŸãÿó òý÷MD^¼¯z°ÅÏ}蕪 40 IDAT€?#†ó‹$àßÛÌŸ‹=¶X¶nQóÓïÒ °¸‰¶ µÅÛpýóMg!ßß§Õ )5°«óþƒMÂ-_…³mžGbÌó†n¾”|#hÖÒ€ºEkÞ:Ù¨Þe’’þÍ>ÆÔèØ¹#ìÒÔgyƨ]ðzwxå{üäøŠï)þk¢ìe%aúÝ•å7"Ji+Þ|á_Î|‡??žÇñöövE®7ëáBDTõˆÛ»ö´½gð Qñ”Kæ­â§fà|>%½Ýß¿|¡Åµ3qçÆ-íât·ˆ´>sãðsà e¬tÒB¹Zéù"²:G¯•JG—0iYw2¦óÖËŠÁ*93W‚ÔEFèq:5õ¶gœ§ã­‡*µICj&¾VÙtãÎì¦ùº[OÎ+ì˜QÍê» ®ŸÂ9 0UÑóù$"'øPPMPP…/ŽÎ¥³ª?jdV\­s Ïzõjºû~¬&¼qñ5ß-¸Ò}‹jL˜qþ‰÷ÿq8tì®Lf‘Þå”x ³7"ó ‹L”:o"˜=Ïç9ÎÇqœÃÇ1Æ0fœþcŽôPw„çP¥[zH:± GOˆhàáÌ–I'zD¤I#<étÊË!{ ªìçKÁ–—¤(+":‡±%ÿÀùñ4‚žÏó‡ ±òyÂŒ=DŽoß¾ù^¡ª+ÌG¬"øãñP÷ÿ'ŒO…D[#†y_ßÞ&›9h¬—Úã­p´ôxe"b3·îa" _Æ‚ó'j^) “ˆPÆ ‘¨¿aušâv:T-‡ªù óƒÇ!Ç—wùþ9éÔÇC ”µ÷I˯æ¨Î<̞ϧåˆe6€èÄ˺TC¸kšeö@¥‹·‹)%óâË»Vï³ªÌæ0e µÜÕ[úî–mƯfŸP‚^qÿ[;(t3W•­]]Œzdû43ŸMÈ>Àé8KÀ2q¯ï u¶²$©WÝžâJ¤÷k#²vjܦà bœ€jóý:`% ±Ì`›ùšËÐb䬅Å)¤U€•„qi›Á„ÑK›½$пÐRN8"ù“?2ñk/_ÆzüO¼/?57xIÂ9ïûñxàë×ÚžÏÓ fîdzPÌã”´…‰ÊßÉçé˜X¨ŠùƈÖ!énß¾‹ºõWåùñÍg̬ÇÞRY–Ú{•蔞d6Wun£êÚA9u£ ›NΑ+e²Wu" /¾Ä]¨]FŠª,¢(ÏK&€ì<­}]õÇqT©aݡەæÌÆëo´ Ó)feõEcŒÜÇæ_ìì`y>Ÿåæ H¥ÏFä=ô‹Sß‚H0‹ÂÏÍ'Ío­Šø¥sÅiûRCË”wÔ÷>ÏóA‘Ìk‰`RÀ€ã8|Ýô>ìƒßÞ BjôÂBÃŒ3D¥”u‚–ÓØ(x`' Â×ÞßÞãñî\ï[yˆê¡ÎZw¯:-&¬Ê¢ ‡q–uØ®À÷eÒ @`‡è!¡­6vñ@ðª,oµ£º’®¾§ ¹ ˆÍÛn1B<ˆ>>>UˆºE Áoo¢:ÎÕ‡êñx`† #bÂpçc²sÈÛôöNÀãtm8›  ‡¡ÙÀ"6 Ù0f‹‘ ãÜ {f¬Lx^1YJÌEl#Ë þh©"bÀâ„Éì5‚‹Ã­ÉàùiP‹‡>XTR9àÄdh=Ç9ìùü`ªE†¾¼¿»{1»«™™ …Ípž'_¿~ýã¯"¢¢®¡9Ïá Î EÞÞß]Œåm°õ‰c_ЉTàb÷Q.¦í»ç¾pn®ÁOÏIH`,î†ÙzkOI-KavÉìešY…Ÿö ·ïÑ\ÑÊ…ÉAÛ_^%ˆµæÉó$Ñ›ŠF³™3ÓœTúBÊEÒylª ×Þ;[¶tãÙ®Ã Ž£[¾lˆÞ7HÎŒ¹é¥h²2wÜ¿[n\À¯\é7~J@N)éÛ€ÓRbôpÜì'Qƒ›>U*lxÑ”88˜§Þiþ×g+ÅÂŒ·‡¦ECp-pÁÂv¦ùŠÍôPi¥‘²vÏŸkðÆ%¼ÿ»³ûÞñ×ÀÛÍóDFVöýW¢ñdê4ßË‘ÕDÿ{µÈXÍV(Y±€ò{Âpžé¡*”í¹Óµd—b°Æ F„‰Tyµ’4©®:ãK½hëë£wî¿# ãÉ@>Ïòa™Ÿ%…:ÈGÌë:2³¶UEEüȽ²T$LñY‹ Î7h’xÝn?NÑ‘CÚJ"ðW"‰C™6©Ä "ﻩ9ÌÆ9|b´q¿òë¼z 7*eйF­¤E›c" IÁÏ1˜Ùå‰Mg–bn¢&r äÜ‚—9}ùC!X‹uVÔQÍ_d[ñÝì‘ ¬9 ë6)zCo]»ƒâ ½a±Z8-½ârÑ‹„‰’ÜeÔľ:qø½ SXiÕVu;o^Žnû(aÚ¢>fˆäúîOpi Yû”nÂÙÔIð¸ÑæÕsõÀæÀhà /ätuá[zß¼´P7`r¾hñ×Á´¼kùU´–aœOܶùN“£íp‹ërÏ?à4ʤžÌLLkÁÿcÿü+¼³c÷÷¨lÙìTÛ,Ð ðw(ûêîoùòo¦ã¿~$x}lüŸ¥ø§üR r7ÐAÙNlåߦý2ÿx&Ã--ûB´_¥Wˆ’bÏ.ž8/󅾺­ÐuYþ ¬2Ãx©gü¦A4!sxÝ‚m@\ñ'µ~ŒDÉŒƒ¥5[-½ÌGÅMÌDFž:I™¢\ (~`õŠ˜³¥¡¶>?A³‰6ªîÙ½±Ýý™xò¢YùšÕŒO˜ø•ŽL79À´Ï•ðÃa.{Ñ¿Uü¾ó<+ž‘™ãx<Lô|>Ïót@VU§‡þœ°øIFv\ÎlIÑ,ülSÆuÁiç¤×¾€ J=5€nÐlfÿõ_E/‘Çû{Uз.ÉXßü|äÚ3WšßÎÏš½+™mSzÅÙÌ_¤^0ùÉ–ß(0èü7S#žþ­æ< ©7·¸ j±™¨JR1ÕX¸ Ä_³æ¡´m¾Oõ÷Wƒ‚ÖñÊ•ªVó ß¶Ë`;?“‰fF±Ób¬$-Zý‘G NÎóÔã8Ž£ ŽÑÉ©>ÕXJ±FªÆ:ZY‘ÇqÓ7O†õþP™ŒÃ 7o!c_ÍÒ6&mÇ Ã=Õ‡¨Šè#¶ ê6ô"r¨F;!Îã¶ãñ xAĆÓmIm`ŒÓ cfoïïo8’ߌ³º\Hýòú<Öˆ‡NR«¥{˜q¾_—Ôôæ‡ JD*<@Ê â'>ÎçÇŸÌïoï=„YDU&z_Ž·7=˜I¢¡#–\‚qŽAÀ ç9³Çq†Aø’=TFå#sdn_ïˆ~ÌÞŽÓÉjó@r „gÑ!LoÜìN™㜭j÷c‘Åí×$±ÂÙóLÃ`ÊiåQ×Ênf™çFñžS<ïq¸3 0Ń\3ÎqŽgy1ñ<ŸObþòå]Uõ8eq2ÿ¡¢Ç¡š‹ªj‰l˜0Âú6Bžy6óÄ,Âã1ócfv!½d5à’(À¾3 £4½^j¸úMuµxE¼ØW^µy17œ›r£y ÃXËüÌ, 14(V.èÎ…Uøt¤âL•I§€Ñj©;>Q" Úö£-AWþû+>ﵓ¿ÚglÛÁø‹Ù‡²¯ô´ZñÜòI5Mú°¤ºôÂï‹üRfNáܬ¨;‚ ¼ø9NobêNâÜ«±à¥ù\¬ä{l•™ÙÉŸÞ)AfYb24«kOÞ’3Ùß—-à2Û3¶\„Þ– ®sœûí[ÞS¦WO×Å: í>VNâ”YT'5¾ÿ$vV.6È^X6·+0Ÿð:¬ŽÄô"p‚;ù)¯ˆùý»­\2G°Ç-ÖÅ/_ ãPÿÉ Ý]k ó¤©J–+³ˆž-äÒ¢ºû(q#àa¿Þ¦f‚*©¬:Cf–ã`â1Îþ¯cŒîØ(RFÞÍ2¯ð°1¾ ±ã€Ì`‘Qfa$êä¯PH‹ûY¨*ÌÈ2ãˆ*” Q½Iªã\Bïÿ4Gwñôð#H&c?TéA|ùòxÃHaD`¢Cc3¹I>̼C½óA–è-Y"æ'@"¬Ç!1*³xÁƒFÎpˆÊÛû»>ôÁÂo÷·qóVñæ[E l°ç¡açCîP¤ŽÂd3àƒ Ñƒ ü8Tuœ' d>ùöèÞš dB 1>bëq¨0KÜ}&çõK‡cœ#n›f¼7ª¥Ý%¼œ4QàPõOp«€*«ØKÖç8EDô0&L#^–çÇùª?T…éx{{¨žc8¬ãØ,AnÁÜ+”°±Û¦_Š5ƨ©-žõ)z”kTl%’µÉĤ»æð‘'ïD§¤ 'ríPƒ‹’}ßÞÖ«¼pú˜ÝLrý±Â®ç¢r]o+ÛÛT—äÉåôZÆæŒwÊŒÙu¨±ôO#£ŸnÉ —iPXœržw¶ŠÙØd‹§÷¾†_{ð`)âÌEFÐ{ ®´èø©%e¤/÷”¨÷Þ0ƒ F¶¬¢D€ae=Ó¢°½TqDµ*ðœaß,ÂÍ‹ˆ–%+t{üp‡êV,ÿ§;ç‡2óv>ŸØø4YÇFå§3æLhM'¡îcš<15X¥FÍ®iÑu«kþ3,ªªƒúoWº"¿KG;zZÎu!ÇþY´™â·Õ}zap²]ÄXOF‘øƒÍèsž›KÁö<Í~o¶ÍMºq[Uþ€^}¡Î<¯„|V‹°úxùÕ{jÂ휃~ò¸h,ØÕÉ÷ôÿ_˜Dü$’¿D(üo.à_€Ao“&~ØÂ(þÙg~âTõb`À?ÞVGÄ7€֤HŸ0d•ÎÍeÈãÓ…E ÈðfüÅ÷丹n#…9‘–båg3iB5ˆ÷º7Xe­0JyA‘óÒcWM$ÛÒæÝ´`íµR‘,Ðüœ„çïZAýÉì܆FœÃ‰ÇÿMÉ}Ϲ…ƒ.ÆNýp÷Ðüó €Š„rø¹EƒÈ£€Ý‰Å ŽãðÒöª#ÞÆÝªÊ„.˜1¿"”½hGŸ; ® Îîó/©+Jkúã›ðPcH¹âŒ¡Çá5ñÓ°1™.ë>q9 5I©O Šx~ñD.±iR€«J(€l¦f Ñë´|i˜ç^¸CW[‡9þyR9"­’9Ñ–ÛLg‰+W :rÇß¼Âk´â&à(¬ß_×5SNzžD¿Œ6F ., BÿÖ|< 27ÊÉ„ƒþq`fUzk‡”â¤H"î[mÇø63Õbh„y©<,Œ‰HàÖ*`"Qeª*÷Å &,f#bSâzž,XäðvˆPÙÃ;w¨°èqø¼èñxˆª·D`8Úã{ª›Çñ ˆï"ü&ç!ÌÊ00dXePż722"(¢Â¤oooÂL";Aƒ„M„è8äyz0… ƒÆ Q–CÈD•að¢`Vf9ˆEU˜Øl°è¡‡ëÑÝ'˜‰„ÕÈF.’ãóƒÀð«c°Ä4Æ-aDÈXÄÜxP ™ “CÔ…l±ulHò[Ãp‰ÕŒÁæ7î<Ïqž>5ð·Ù©åÍûñ| rx·2=&~žgUîñF{µ¨>ˆí<¿ŸÏçÇùüúåËûÛûÛۛ˭Ÿ'TådöœXb¶ÓUE†›€4hƒèà öýããíñöx°‚9NÖ#Þ5L‡ÁÌ{ûâXµ•·êæ‘…ñ¢ªÝHÍË>ê½â²¨ÞÒ.Hh½_œJxKëª"ýïñzÝ©78éÒ³IS.C}=o&,s©”Õñ£Ÿm"V‹}m]Òë^S¹€¬‹ü¹YóÑÅç7Ì•ó¤û½P’Û›Õ÷÷¾ûôýHš^íZM[‘Åsè–7½àð¸¹ÝŠnæUÉ›ò—Ú“v£7VõUqiÝòÚº  Ñ~Èä6˜ÙR4JC°a¯ìÛ|â~`Ïl›ô°5¾U;Õß§ÂÛ˜æxkÒ5“ ¹™s”@ÀAm§ìb¼ì¡›x¿ËJdÓXÏèá¨ýºŽQ7w™#v¦íB¥Íö;dгx£Ïc¹Âî`s;–ÛžÒb÷7þí>ŸX®Æ*ª ,OÑH¥FTÅR–”£³9S:ût­±zûPKas[p¯ªÙÒ’<ãעšÞÙùˆ„þÃl"¯íx¤tµÖ|Ë(34aqÔ¢H“×Ïè Þ{ñßxBXáõ‹*+N"¾p´[T‘ˆ@¿";‡ÕÉeðl —‰ €¤¥vº 2L‹hꎹuçWISTTìlƒ ›N„&ê]²9ž¾Ô‰¸2\–aaÝÛt‡çyŽa"’ÙK ` [ ßÊV+ Ô<<œÈÆ(1 -Ýb‘€äz*ºÌ¢…û™.Jó9ÏEAÖ=tvsÛ6 2Ï‚Yeg5‚J·šÖû¡O®nÛ<››ЂŽûe^îÖà°érm™í«ï?®z¾®:g²-tÃì^öÓi€ɂçnѱ¹äÍU—iÍlˆo\ +4`'l*W>&’#ÆQPÍYÊfp¡©.8z“!âÌx#›X£g6¯<ª ¬ª>Öˆã9ÅÄŸ°AÐÜßG¤eF™s‹ŒçEž9й´*ÞèB„ xŠoáù«±Ñ:Œ¸×À¡–x,óøß•Ü€âÍŽƒ_Îpw^Ÿ@ùx¿ó/àòwyÁ?öù]™Âú““áóÿ³?ø4à§úUÊp_~j7óyÉ»Zhït/;@gbdxû½ZË£qK¶¨ Ì½9˜Ö,û(6܈dæ.À—všŒø ÏOcZ²|™*â²Ï5šæ é¿1@‹%g¸â›0‡ÏPî{û’å›2†" 6Ö~S“4Vµ¸s¹Hqêÿ[Ûsföé½Z‘~\ÖŠ´ÿÕ àß ˆÒ°«zë$ƒÓàÒ‹ÊõÚ¢«®è™Çq;;¸-U³Î.fUu¿ ‘6\«×m¿÷=£ÚWkTUU¶ì™™~†FuãNÞþ™}aþ™ÀñìR,¤$éMñ°EA®3ªêZ@bRž®¬xØ' Ëëôü@í‰GÓ4÷+OÍhøq§>Z¨¤ÇÛ4ÂÛü†ò0Kªéĕ܆l­¶iåŽü"f<’s…M,â·*0 gGÞ=µ˜Éiª¶á=ƒFTGÄ3„[‹|¾A"<„˜Ù¸×Ac°DÆa§ÆdÆÊ  ±Ñ8G*¢Mò¨X¤G¨ óiÞ7Z£yXŠ‘Á &Šá§Û&;Ã^Th€…}¾GFÃŒ½c&ç ºòœ‰ôPÓ€3Õ3%…œå¤"ˆÐfUùãë×ó9†çÓ¾}ÿsDè¡_¾<ÄHH`fPbâ‹Ãå !eq§Z6ÈtÑqx¾Cô¨‡Nã¶1D‚Ââ8?U˜˜•ɆŒâ9çYUƒÁ%ûÍ<Ä¢~Åå8*…QŽ;öÍ`œ!™ÃhØ©¢NÝ×ãPUa‰T:³Á¤š¨ëãqÙs ï\€‰fTF<D…U”ôc°ªˆ|¡/ïï_|ìjf*LÂ"®®ÿöñûžð«²+ØFU3 «<Ô}xõÐw}ÃÃ×䜾²•Š­æ+R·¤ÖÉ\ÕЯðÐË?5“ý»ì¶’õyáqQ‰ÕwE|w£A©Jò8ý'‰…™Uˆ˜‘yÙcÓõU²¡w­LäQº€³/_a²˜eQòñë²"¹„µ ¾àƒð\ü/ìþ«Ø…ˆ IDATk÷jsKš& óRíåÊ¿ Vcúí+®Ký]ª0­ùÔ̺üÿÂI~¹ß–û‹H"Òµæai¼¿üpTϼ§°òzAúMö2$è:˜È ŽÐïöv­úñ’c|[–ÜT2×W«Åú¿HÖ6,¦¼aƒa$-3º‰˜$1ÁtTàŽß”,`£M&~7°±¶ZâÖWÁ8Æ(|»þÌ)ƒˆl”Õ9ÖІ+Ý»ÛÕp]DîZž–QÙ³‹éλ©¸ö@ìwwk¬wgˆ 3BÏR¾p0'ª´fv¢le¶µ»wõ0Þ ~™™]57SBEãÆ‹!’‹$hИØ'÷Ü:î3X$Ǩ<ì'ˆœ†þý—ƒ9Õ~7wGÇUBÁh¡«~hÆ?ìê€*¾¥ë‘Jm@fž’@uvÃЩBq¯ ¢aåçØ¿d ésØÇ}[KVEûz,ZëŒÑ=^zâÇ2›à#•2¤™‰qrÒë@-IÕ‡Ÿc„?R¶9ó!i½@¦Ì¡»“N‚Áò$³É w­pÍäšI|‰œ"Ù-„¸2}x6kV‹Âl4JàÞ8†M í5ÞBJì¶‹ãJg;6K°ÅK r| Ò WP¦YGE;¯øTÒ,ÒÞ'®ñI2 FDŸ‹kVwmÁœŽ·´éè:èLŽÜ•R1FØÖŠ6‹Šƒ¨@Ûҧ@ï9²Hbç%«<–Tv”n¶ö`Æ|÷F‡æ>¹¤A‹á]þ˜¬ÿÙý±¢ÛÜN˜Â“úçàêçg>ÕÔµàjH°Ý«"oNhü A~»D}ŽÑŸ¦~À×ÿì«qƒúÿ€ß€r?ôôÿÍ+ñòC·—¯ê‹ÿ Eü ÿô‹ éO&+Ó÷æk¶êõ‡xyÛo&×£G„É1Sw½–¿”õ‹è.Šèrl=0g^„V%Vj’r[2ŸŽ›ª¿¬Š¬Ò -R«:CKY¶’ô “žÞ\ó=¡éŒÔtË õ\±t¨£"–¤­_ÿ&Ø^_¦¡\«lãçŸÞ×Dÿ=ŠþßýÇ ýeiμÉÅpì)Є½Ó¾ÒŽœÞÈe3W–[]°0ðçŸö†¡“w:ý³!nf§¢«êãñÈÌËçç‰fëÏ$«ª£Q2éÂôɉÜáê€ÔMðoQïÙ#]а:KDuÂÖɪºÕ&½âiv÷›òž'«\ì§:€„þµƒ;W"gVÔ'}à#œíŠ•tÝÀ™ûx¼7Œb;¢›#µð+,Å+f6àL0Σê\°ã8žÏ'7 Dçy2óCÕï¾;Ë—gèÑ*¢L¶½3}K›x¸£‹¯2ÃÀ »!Â0†=U™Œüú§;ãq±˜Àc`›öç9@°1üÊn:ŠèK%ÒÒä±<Ïá æð!¬]ÀD§ùc¦"‚ÈêpÖ'“9ÚÀìv6Ö½ÜÂù‡Á¬bq[€ŒT”Œ:ê_ÞTUÿÏAÊÂböþ8”eÀXø!?£D& Óž8‡ á+˜å`AìbØc SwÑ7¿îà+Â*d‡öœOŽ;ý³‘1ÎuKâ…úAdv ‹Ãsì^ìç™3uúøxº ‚•ìó9ăI„E4þ3ñ`Rc"‚°D˜Àªú Ï9Ã_l·ngD쇈_S b~{{ìýíÍáàiíE¤n‰C ss(šÙæL~{4]Ó0‘ÿëÿx7Ã÷ó#u„]ZÈ܈|C¬Ní:pÃ=n’c·ö©”gën·çqК@Öµø¹/\fái[1Q âÄÅ¢‹âI¡Û: ·q-¦¾§Wíp±é¨÷s¼FPn¼¹‚+‚bOÞWºÞ‹#û™Ûò¸x%ô”mie&!ËmàæÈ¼¾uÔïz»¯Îõ‰ÂÌ[yõ÷¿Ò¸níËo÷­²é 6hGð·ßÃÊn¾pÛyIy!ËOw—Kæ-6]$VØp=/)¬ˆØ—”lë÷w+Q6ãì‰ê‚øG‚Õ¸S˜àò9Âéà1¥„þ°©h¨Öǯ›x Bõ!{h¾ØnOIOD;¡¥îæW_ÂP.|@†õt”.ÚþÎ&)Tá´›ª"€Ñ.ËàØ¯§€²»AÏ)<@ÛäcI±Fø£»ÿ5 ?=ôƒŒÐëÆ”]W²‰H®àK1Övq6¦×œ~4°¯é_*+jI'œxú^õ¦)»ß³œÚˆ]^ìvT´”Ù­Äê—Àç„e˜¾%HTáuàÚÐÖPtUÓÌŸs{+¾D]{^"Î¥†º?êÃÐjçlc„ê!!köV©ùùa?f $ -¯&˜ ‡ô]œy;aâT›eºï2ÑŒ©gþ]ãÂw·³[_†ÜáçXñ¸Ö9Cìc6F²Ôóê2à³ðÔvû&.K.s!oÝ ƒÙÊŽ÷¦l™Ç·\7?p'³Q _´ÜÈêÊP'N";W¸Á:~sVå4ЋªÜSÂøî÷\ߺ¢ÆÞÕžûéÄAZÝn°i=„¦SQ×ð¸œb, ¯Q(¹ž›Î*|2-VbÍ÷çÔUÄ7_¡7š‰ûœ’'³ó%Ô™ópXù –ÀÕy°sì®PÍ•¿œ-˜~Ÿ`4„½y>p2îy¡"·ÜÆJ¯ ^Õ¥ù7ÉU‰TþÖ“å[ÆU÷Ðt“½¤©ãnB]›²ï,ÀÏp+‘þ>ãÅ)ý‚½ÇúìÒ½Ãß„üÿÄÕ ÓWý>žÏ¿ˆÕƒ>÷äù)Èõ‡ÅïÌ»„¼þ¬2œ½ËåíloÒË.Ǧ$¿pJ—dãd¥,Ä+^ ש—¶©€ä¾B»ƒÃò±Åùãuáô•Ã(ØüñërM0ðÚyÄ‚f{~ï4êZÉ]¹§¢7樅— ‡žÕ7»îA¤T> ÖLnRv/NüLd­ÇßÇ}›ö¬O&^¡ÿm%`&ºËød†÷o„þkà ÔàMÀ =Xòè6\À»_ ÷g» ä–~åÓ¦“gÜ%úO~||”2`‹³[Jº;va'¯ÃÅ‹Ý5ÞÁU“Îóôœ©™ù1g <`¯[êu˜,9›ó¶=¯†.¿B9塯ª‹Ys³?ª$ÌÉXY ˆ¯ZÿSFL9XÕ£_RO3îD¤•¥H5¶)óŸÅB·±ò¯º€Š´âJDº1oÙ¡WoeqTB2Á¯§Ï{ü{;RV± œVýBi$Ÿpñý+="£nãÓ°ðÑ…ø*òÍ#‘Àƒ&"ÖÂ"ˆº’€›c&ŽÃX0˜Y\+s¸°„Ê!Y>õA%Œ”1£xô3©Í=úõúïB½®6œuHJ ê)»îÇÆbOš5˜Wø˜({¦å°á„w7²=äÇxÑãárõq(ªQ!&`÷òÂT&†A”Ü£†™Y`"c³À,ÎÔWfˆÐ87XŽJ™Ã±£úiGbcáñÂ.™Å0&†ññý´1Æ`–ã8žÃÆãñv"~<îÈtz|…n(õ™•Hõˆ{L&B>pœ8ÛÞænDé„.dÄ,)v)Öd7õïïu²ƒ¤žß›‚ÃIoõ‡ÄŸ.UÞŒëƒPÏÿœ½%ªdÐî*»”H²ZHwPøÊ_Æ‹|°×\æú(ºæâö™1ø²}˜ÑJ€í]òÕhn›1oTu‡rk ÒŠ<é·X\RdšG ÷‹w°LäÛZº  î|·Rš¼zôlï2jÌ•xÚ)ô«õ9¯3ˆ+pí Ùª¾þëéË7÷—.~ÜËMÇ}Ç•˜ý±>À0²+‰¡Zõm2E‡ôº¡åxdp·“îç²ØoÚí‹S·û*ض~¢ŠøÉ¥èÓ9'ff#8ª.Ó*¬¨µ ÖgAæÖÌ#æñÉWÚfEWºçR‰uÊÞeûŠE!"·š¬ë™Û}¹ôÝI%&™9;–Nï'ÒÔˆ¨Í«’û?=ÊSUµ Úè±OG€-4$_j^ì™–”LSœ‰w£Ñóùû‹ï;\¨˜ÓÊr}ñ%²†+góåu‹©¾Üu‹3¿e?¥ñ0·»É+oM]ž@mŸ‡ ùt‘1¤LÛ‹`QGÿÃJæjÔFEcŠD™Û½¸PoYæ›'—/ÀcqÊ3·lõU¯Ò]éÈ[5S’òm3 B¬.ÖÉCcœfž Pg7`íðÞe5w¼jeưºÂÕüpÍ›yqK|¦Í4,ß{ÀÈö!ÿ.¦¹ÐÁ_¹Õ-\j¦fé P^õE³8…S°a#ëqâ5»Ä¦#âTr.h]Ð™š Æ½cÆ£ëY13ê);X¸\ ›®zo¶þ¸0ÍÁó܆o&¾„n¹g=¿Ú}$ÏëhzÉß¼CZmìF×}‰H'lØfív_•‰’ž´ßtÜ¢™èÕKyWnÁT…kUdx×GaÓ„-ú”W†„}à÷ÉœåWã7èá?ƒþƒÖ˜„Ï êÝò§ fÜà{ÿàüúÿIúçòsïÀxüàžß<‡ ߯{—¨Øk¢ï[º8 Ñ2\œá$»ï ß´L“wϽSÌ7½ÖŠò/c^fôœÁ¹aä z—KʼŽÍ|¼™=2Áˆµëûð,wÀ—*θ!øF,SÔçÎ7\ ÿÛè2Œz&g Œ[¬/",Yt/î¼MÄß.r„ÕÛ’Hâ¢5ôÿ'QxéÁ…OüûLJ›y¸‹¹É…Y)%­mäEå.­mn¼ËS>ùb] ”óDÞ‰H#û€ì«ÅÝ 6óŸ²k/;ÌD¥Ê¤ú'G~ý? &^ü=söбcåŠö¶ÆåºÔ¨1nê’xÝ:öv´ëU¢ÀƯy9¥œ×dÆ'^€B¯ê?ËÞ'§5zÅ¡RG´*UqSˆ,ƒ—-²y㛈V;´Hë²·ƒ‰·kŒ«ŒT ÜÛ†Oþb‹h˜žÏgè„c€¡elŠ:ììÆ(Q —ÄôÂ}¨Ì‚¡´úä‚6ª½òŸpS‘‚Ììù;ÌI>FL¤±úDŒC”Þæ[L`xéw>ÇwcÁP©wibd—›ëX‰¨F.;S{‚«ªðAÌ¢L'› ܤAI³ê§Ìá9K‘À­ …D©ñ^½«µåÇ7p* ³`è¡Êáõ#r 3ˆ+³“4üè£0ˆ1XT‚¡m$€¯é+öI4˜Õ/sX «1„ ƒ‰ÈÁbF`#çæ‘(›‘*»ñÑx23DEEäÈËã©ÇãM„UØ g¼vÌ¢‡úz€a|h„Ñ…´Ùéx¢šà ®¸­È¡šÝå`ɺø:(çót'&¡T“xèǰ²2hIƒ\6{ܸ¡™š½s1OK‹¡<ü0R|™z=±Ë›ãÞ¨:Q-véžWØTG/z~-W¤«5-ðYu}ýpjÎ! §’¶d<2Ñ®Q¸Á>–tPË´Z½Ì(¯ÐØè|ù3{Ñ”â¹à£ …®×óªÍºEÃûÿˆç‡é’šKiNcI’¥éçiêðúýª¥åuØpôyü¦a*‹¿+p¿¥àìÀ÷m/}é¯Nƒhdž²XOªìÈ·T>°ÆeO ª­s% t·÷ÿ[ ‡;©¿°÷WÃŒWÓj·VB,\¦==¯Ï<Ôè4"Òƒ"9Xø:¥ë±´¾@ÖÐÝ·>a)P2^FÐtÙº˜#M)F3Ê*k ì¥Ø]þ(Íߥ=‡–Qk½ÇåzÑÑmj GОðÄÔã+gZ²ŠT©¿½†—2f¯f»bƒ‹!ÚˆG¾ƒbsCtþÎ4&âÅú…Dyú~¬ZU~‹éb|äC1â{”qCA-:˜Z÷h6Ê£” |i™k_ˆeÙÙ¡ÉcvŽ5Œ·çz1ù¥†,LBL|ž§OžJPܤ9)ôwd:Yqy——/ª¬ôÿhÒ£öÇ fçy [÷èTÀâã ˆ‚VÒצÂI)–æ#IBõu}D.‚L!p™}´­-%?jVÜædiŽæKa‚¼`NHÚºg)aƒ<ü•‰”²ô̬ÛÇ ƒDÄõÚ’³F˜1Noz8`é°×xzQôœƒèPüF 9­cñÕÇ _6â#íQ9³ Ô¶|³o¨Pyˆ]õ7÷”çÕ“Š»ÝSÑê6ØUÌšb_+2O=ºöùÒ½m:  †¯ýÍ(ùÑKn­‡Aʶïð¾˵íº‡¾®Þ£)wSs\5)+GkÈÞ¤­~Noûº 0Á³¹Á­‰Ä¼ÞÓ}ç]1hPK !ÞÄX-Œª…WŠqIq5”oƼ¡Ã ÈC÷¦n‰37u›ÑásðtËüçA«ß ÿ·½‚]¿OXçø)Øÿoãñ#Äp5†ÿOûó+V=¿t7#Âåýúá—Oú²»e%Ïwží‹6öŤA§äú}¨ñs‘³—ÅÆˆµ<}x?Ñ«î˜zgý7à˜Cì±½E¬®®mê»ùýo«¿#;—çydžž;òëÕayÔøŸœ­pÜ"pÝÓùíí¡ÇÁ"ÿú׿Ze#-…fÚ‰ˆÍœáeLu¬±&ê,¾Æz ƒ]<˺ýΕçuE‚ºþ²é¼ï¯”åQ˜é<‡Ò‡(ˆÍ6`š=æ¡5™œ€mƒ ÿÝ$…‰aäî¢ù[.èOyIÿyÿòõëW"úöí[©=z‚´áƒ3¤¨åg:êžH’=†·bÔ”ñ“ˆÝ<ý¾Ìü>|ý2"¶´DóÉ!;åÖ‘šUúÞ`r14ë¡oO‚O½ºh. ž+›†±¾¤ÂÆš5Ÿz!T¹/°q’7 q «­ ¾b &3Œ1bV 0ð8Á$ åÇ-ÕiçÛãx´°Ÿ†§A™ß>1€„¤,î‰!À#SRˆÙ°„í`QŽb5a!¸Û>Ènz4 r ³(j•„ø fŸaˆrÈÌ£*E\I:. !‚36bœ,ªLÐCÞÞŽ" Çñ<Ï© ÈL‡aØÀiôx³1ˆp¨¾ñA§ù€*B#†TÙ AáBËÄD‡Îš$¾èعYqO¤„ 2[˜yÎ-N­,+6õç_ÍÂ`° ÿˆŸv!«6гÛÔT|!®}ÂÅíDj¤÷*'`MQ£ÏUëûÜN}ídê "|ïtÿŠît…;Kÿ¾‘ÚlÏÝ-¬«‡•ÖCU½±ÚÄ]’KoŒ>¶«½qõµë5ï‘9XãÚîÀ,ß‘÷Žöni@AlõÊ<¾.½@ö·3¡+©ù63¹Ñíî'"/?¹ßœÅÈúJµNrŸ¯äÊŒëQÉ]1P>6ýW„…•qA¸%^¾&1Ñ5~ù“¶¹ePÏâ &É5 >ä¨ðNxké×DmP{‚¶¹È« "L$rPÊ,%îp}Obh±ÊfÎ~i%5Ç[“ÏÎ=kb*fJ$åÎ[Ö.)]mËa"/R;eØ3™{uäÔ O+ F¸É‰Ò‰±ÉVÊ"á·"ñvÊg}~pÏ™.–ô›4ÇËæÞª–ô¡Ö.ßòËg)àB"ÏJ™¹tÌÒCÆ0f={"ƒ¯{ Ò˜9“¾ëÀ¦ÌÔ³4Ê`ªø°"B[L}Âß¡_©dû»±b¸ƒ6Ms¿òþsc²ͼ]g´Oˇ?’¨l§ûÂ/©©Ð¡`J>RÍ¢r({üž–NPÈ´ÏgJúˆuÇžÑæaÔT×¼ ö bm£ìø²1ú´OsYà•5ßÖ@œÝø´y«ªÀŠÔpóã9PÂà5ÄzÓØm~h6žô–„ºwcbfidµO ,ãá`WÌÂjZÒ`#P©¢ï £5_zRç° 7ϼaî›áŒLA;k;ž‹)QA¸Qó3TÅ-ì »ùÌRlÒ'LíPKcV„¸â|±ÉÏö>`ÖòódT £(¬Š4m‡²^]rwãX_£kèŠRÿ ø²óÖH@nT´Ú¡‰!(6Ó«ýZÏã™?Z½øèc.4´†¶jÛ¬Ðù±»Ý-—þµÞ⦊`¦²æñWáûßÓ_e ÿ^(~ó@þ2!¿øá7ŽDÿ{)^a¥¼ÎÒnÈ÷/v~Hÿiì‚‹­“¤ž Ï·©á¹­Sõ“ó•K{(mÎ ‚»â¾e¯W¤¬"4ÿu“ˆm·Á"W„{ŸT$ꬄ-`÷üoÞNvËm—šª·d÷Cš‚Nþ>7°¿m`X{7çO¨Q½—‰»kËào)™àICT%íN¬6»>CÈŽ”`ÃÈÈÄ ª‡2¿½Ñ9Â*D¢ïïJŒó9„ào¸d›™O’@aÖän.!ÃÄ3À N¨Í·B˜+:˜RÒrÒYÌNö¾)|‚K"ã r¢S¸+â½áñÙœÇêñŒÛ»0±ÝU„\Aç•f&Vf®èÏèîÓûW&-ó‡„?)‚y‡ðè%¹þ¦¼¡ÿ›×Ü­`¹í·¸Ö·b¢ÓòQõK”Jް÷²mãŠ2Ù»žàž@˜ë^ù¢ÐrØ?³ö…ˆu¬ø:5Ï›‘Z‡^Ü-ÝTñŠ>××QÙãî9N¯ðýëyý°‡äºq”ºQ¬Ží}KíWx,&ËT…ÄòË/qöŽø‡û…IDýLas IDATAñ–°ÑÆŸnÛo2ba“˜l„u@ ™Þ’ 8-ÜßE¾DáøRÜ[zt_|SÌî˜B,ê*JÌæ‰Ä0Ùi¶ÁÂd˜ãÀ™…}"`&ÌÏÓÌ>Ôÿ°á<8þÒµ YÁäF´D"$n9ÏÇ!‡„µŒ[IØç0V–œ®‰‘Ö#¢‘¡Fc ‰ÌÄôå`œ6 DÆÌ°ÈŒc÷¢1Çæ“’èÁ̇bÌ ˜OÌ+v&æƒÙ@B§ÙøøÐs ‚0 ™³zQ÷(ò©ŸçG@ØTï¹Îsˆ0Ûp¬hT-“yBRšeoÚ9‚™æ€€Ì½½å£JÆnrAN½|iºy7 Kvh(VÖ¨ó ÀfÆt{J´}³º®p”Û4ø+M{î^)™´¸Ã_«7ôq*]œÐ?Ñ ðêm½Ëz³×k ¸9w·ß 8šZþB⊆yps0H{…X˜ø®ôhÀ®ÔVÑ͉b4XçÆh.LØV^JÛ=gÊ}Y\TøÃôHYoe§¸Þ²Îw0h ;–À›Â¤·®ìÖ>èÕüf!’Ôã‡I¬Û:L4õBÃ_§ò»—]šjÂîâîË"p5ŠJÆ\ÄÀ«sQžÖù¼Û¥1íZvÓÔ(;…6A¹}ÑŽüÂrê.dø÷çŸyôÿM+̱4y»Kúf-®þ<©ÈD¯gÉ¢Íåfç…Y5çl6Î3±æ#Ì¢~)â¡cµEÏá»@!3˜@¶¶O <-öù|6ì›gˆÜÆ+IR•W#F°1Xøñö¦ª1?hNÍoÇCT<Ö˜E·¸(OÏ„N‰éæƒØ³¼ÚÀ£“ +¦¯ƒqåêÐm ïÓ‚ê|êïÿüóO3w‚6f>=ŽcŒùÜG‡Û¸Se½[W#¨;’´¢›ùáUæD=W}NW>)QEr# ³ó¬‹óåË"'«j©I¸Ñ—ªaíë$€'ô™1Y"rèWI•»u±Á¸ÒŸ ~!|#y )ç·Œ#$Ë”Ø$¹å«¯B!!®À&Fx²Qfr·/x‘€û+eéûâ8-@=hœD`U2€1Üg‡>\¿ÌÍú‚ˆ16ÌŒ…Øp±˜Së!ÌrZ1"ådr‘=.ØÊŒã¡*ƒÌè`€ÕA§ œoúTö´²ÛžL–à »CêL؇Ži–bdQïòUõ8¦zˆ“’›1‘1ˆŒY‰„zx¸ô ÃÓN=TǃÂâ@’¥ÈîÌk­,Âð`bgöS¤¤ÕÛʧ¡Õ¹Ƽ÷V²a1-bÍ“Íy¼Š+äå"îDÏÚ6.sl“ ïÓ”q~RÕQ0³o0·MH«Ü؇â“gøÊŸOHiµíQ™bAY 8Ïá„›`ϨWÑ›[UÁ‚Õðju[[àVJc¦L„æk ®qcFd3¬ãô9èã"ZºÎˆò®Å¡;Ý Iµ v ô¿à-̓+.v#¢-DõÉ@'^xHµŒ_Œã©³ÙfIœuXÎ2[:ºÔ¦Í«G®ñ2ðÚ3žVí8WK„Ôž<×’¥æØèBËØ¶é ƒû3$öÖЯׇYêõÍe'Ýö€Ì^*Ï="ßKÿOÛˆ…W"{fÏÉ Ë;È;ÄL´r@Ëì>Ý}l‘£åøÿ2òíøemfBf„×<÷¹ÔãêêCSî°Ä'ü|ïçò‚»ò×Pö¿Îùç¿ãCþ{Aþ$Úw±ž[9ËËùþ ɶóŠ¿ÿÞCñs¿s¡ƒ7„õ7ŸÃ=Þb}¹ÓÓ¯Ž?[^ùú ÞÆ/á sñ$^ 1Nx9ÇžôÂ݃nþ¦¤ógÿIuøy‹‹QîšAN%Ž-žÍüo&=zÈ•»s× ¢í˜7Ñ€fÏ]nÑ a'o?Çð>ìä Ò*ç!äô¼)϶ #’IyÁZ·n˜ßtõ ¾<¯w?^Nî^Ü<9ÿ耚dbfÙf e“‚rO ÊVw²ò­’nÝê¦1_^qC´ˆ3Ö{Br–ðõËQýøþýããÃÛo/ÐÏó¤Å=@:¨=ùÙÇ!ªÎir®SÀdKÐF´Oe1ð|>ŸÏ§|ûöýû÷ó<ßÞÞø+«(£'ãªóãx<ǹ1UË¡hgR¬öÊ×´®MÁÌ>Ìp‡:ò.nð̃6@kÆry%%Å ‰õˆˆ²pöس³5 «IUn†ÝÓЕW›£8V±ÉmT`+µ–Ïs”ª0‹ƒÂNä1«‡*wƒ XŠñ—þÚk|u«b .’ODè<ÇñˆA™t2s&g0Š8(âß,¾"z#"¢ï,–ºô °FÕ>Ù¿ôNª&ŽžŸ˜ŸÄH <]r?@ÇpEL6H÷„ˆ¢®ÃµÞÂZv¿62÷œŠä´È1êÛã!éÒËÊ05ï±,ç@"ÄjiÖ&PÃÉÄFü·……™ž°ñÞ±* +ÀjÃTØ2³ÝÜ“ÞHÕÑOÔªv7s¿šD¾|ÕPF:éò€Ed3+Cb⌗³xd@$3x~ L†ˆ 8”Ç¡ ÑùwF` !¦s˜F$¢,©hº°0„}ìÂÝ@<},€:91ÉL/ xèB6A„Ùêì¼s±»j¦šGW,Na&¬4‘µ¿Jâ2¡¹ú†oTÓ³UZÝô²Kª–qéè&ó³V0ñ²:ñU¯ukzÞBhÚæM¯·ð»ï¥…¾€ÝÅ#b‹[ðbO¦ó@€;é›Ðؗܨ®P‘9ß.ñOÛO…ÙSç´VXšœ¢þæs²»ÓtŸ½þÀXð£_ä”ÒÅ©†øJ}½r^é?¶’ƒÖÚmp§H—|žÁk-ؾŽ¿e·|Å£©ÍúE«Ê‡™DŽˆA ¤µ\>z¦hÀ›óx¥ªÒB`DÁ7\ÁÈÒrmKòPÕ‡pÁñW_ïø-âäb'ÈcZœdÖb£yÒºeŸ[´ÏuBãsÞC5LÚÊ=Ðhá8´ŒC8¹@=~)‰ùý˜:[fºãy­H–áÏM3â4z(ÑÝ¢á}´0†Ù8G¨-}‰VõˆÖôZ©ÂØ+ídXê¾$,ë[°’2#ŽÂqy‹¾¬G+>­ÍF¦÷C@©­šÝjKaçõö¤h6ì´òÛ¼ßX¦\}D$ìbÀ2%-”mœ#ò"2tÄoYj³e‹¶Üc:„·@ä-ù¶²±œ˜åBÝÉ=>¯*ýf¡ù ª99•£häî3[‰žÇkSÙK!cŠšÍäáÍ Ï• ó­©³ÌiÜܯ'v_*Ï|Ô-"¬Ñœ%còî€ÌHÊѧ˘ê À»f~<zh7²×5c&É/ÔжÜJ`“™ç Ž©3Ò–jAoËŽÌÌEKšy‰yyÒŸ&Fïo¢¨TEƒqÐ"ky"ï¤Î_‹W`N¯W㻥ÓÇ’ƒL—-Íe „"ÔœŽ¨•EZ‰ãsÈ"²8>GŽcc[ì™:Ä}»¼ÞM¦«Y6j\°É=yª]ÓŽ9‘¢E¹·î_«.¡4̽¾Í äåpÚo1OÂU?B­Œ”„îº t)\TÊÑ]‹ÆÕÆ®¤^Kða¬è¡ÍØ…m˼¤xv² DxG6qõÅâ+»Ñ ~pÿ4¿ønBÌB3ù§`nB¶Öœö—:•nxðõ?ñ/üþN¿6vÀ¯ÙßzÁö\‚ožþÿé÷½Dzff°¦Ðí¿Æ Á—Û`0sohO?:~ÐU!å†<Ó†¿¡Ò½ï`¾3Ç¡-+AÂ[š-Ó;‚°Ž)Úì$ºËaitûmAòGHætef/œ¿õÌxÊl˜$?äŠBÔ2É‹Žj_]yÍþîØÿÂð /&÷¯ÿæ ð› €Ò6¬ü à¥oL—ÇÒ nŽqÑa÷"µ?†eÁ_)w+ºDçy^íª)Õ ¯0áEf΋ÿ~·uŽÚWõñxxÙw>Ÿ~u‹Ø^‹D¿á³ ‰ªO)¼x{{{‡4T0Á8O¯\ßßÞ¿ýßþë_ÿòÊþÿüŸÿs“ô#¬øÇTlWü£l#µ6'ѳ²”#I2«O3d·ÒD÷Ëô…zsè,ûj–-Õ»%É+,5fÏç B72ºæ;éÇ#|eðÙC;3«Êã¡Î3jôјËx ã_PúâJ„-A8ß'yGèŽ)|Ç R]œ4ÁùðÃ;Ö±ääÁ%ÛÕEÌù-è]쌔g"4‚ÔóB 0ÂU4-~¢7¸fw<rªôùi– Ë.rý"֘ܧÇ}`ã1&ìŽq’@J „ì&t®! 7ÐdP`°ÿGCñ®éHFªø  F3Cñ%È£Z&™„e™ª~à½.›ˆ€ã˜õæÇqÐ Fš…$|¨¦!“@$#óLí+ æJÙ©¶nÃR•U6&¡â{ãz¥HioˆrW»abÜ1ã-h鞉»À,Ú¡bÄK_ÛÁRûß¡õ=ŒÖËÏ…ÿÇãŒjŲ[ñÁÎ 2_w·¨qC= +ä‘‹À!Gïr›Ò{÷ œ.éϘ^Ë–ÖÖí<Ó®!KMa¹îÛý$Û&ó_¬™´<é6T¶I¸ó=#õ祥Ú-’ëZZ+s^ãN 4Ã@•G£+0¬“ôÜ™å/¾¤Ç²á…Dñ¦ˆe†ãóìDº¸Í¶KºiÖ *ƒtîݨ‡ØL{4uU=^{®#5ããÍPŽÊVMCÞÌ\ÓÂ<ã´™¢&ZdÖßv퇄5ÎŒó¸@ªØ£« a‡‹§Z7·Àúwpó[ƒï¼\ñ]€þk¼þ‹(¡ï½xm¬ðð—3=^¿À’]ñ‹Ñz¡ëÿÃþ_‹e¾:ÿ팰wØ~ëåšÎi}L¥°hóý´Â§5Ù›øé΃3ûõr]¸)6ðDãå¡A*€Ýßë" ,Ã'×õÄsÔŒG 'I[öÎqV{$èabúTăMÙªÖ9Ûç5 G`w A{‘YYì‰Í 4›E°W^ÇC¡·-F £å9¶¶ båÐ;š>`Aíñ-2éwòü¿X"ìoåjÙô)’ò|Œè†­§šGÞ×@vW¸8l[ãztU¦«Ál`)Ü n¬C´ÏAfÞÎjmÕ«`SŸ¡ÇÃê¯ydÈûÍÇøP5ÕþóŸÇq¼¿¿Øõ«¨3*4;q<ïïïÜþ‰žÒkäÈî Ý?þñŸÌr>Ÿ}ü×ÕÄÿÿñ?Z1ñ¼-—‘ZU=ë|(ã´º:Qjf€y %²C$ä<ª@¯©ÐñôV~Cj3ø!™§Ã´k$¿H ¬Y ´8‰AÎau©i÷¼)N­nM„£jñ¶K+c¦ÁÎaÊJ¯—P¼›™žÃÈÆ9øà÷ÇÃñ/ƒ³œÍCÕáÀc!h„lìÍõ˜à ôL´û£5($ V[š)p 4[Ì˪̪ÑBáá°ÆùñHØN]P~ŽñÀØJgr¬îV"#Åù€Œ[J)Α“‘8Šójâ>‹°‡çz‚­Áìð O鄲3H «Õ“†ª &qdZà›wó!ß4PW³iëÉó íq<އùÙ:Õc ?žCO¯„ª %f)ÁÛuè {0$ž¾ó³‚â lq*HKúÍ9Oóaž}ÓPƃÔ<ùWxÆ©[KŽ…±_X3ṴŽPÂå:ÊÍ4’ßÎÒ‹›{*—À¥Ð·)­tù³-ÕÁ€šÑèÑRÔS;RߌJʽ(wÕBkP§&H熃ßô¼ÚT¼Ú$4±!zÏ"ˆ.ôjxîé+ ê´>áçÕº¾;-h:§®‡¬Vñ¢™/ƒµg^º¼ê‰éŸðXO´_(‰†8oNFOɪ(3L[Éì:$½áÀgó«]|³(×,°¶ —éšÜ £šôrÓ /âл¬çe³JPÒÅüÊë‰sËTý°é­ù ’aP–í(LaÇ•*Í U—Àçíqî¶hrÝæÁ µtêl Î^ÕI“mD`±Ñ•¸M\ÖâÚ{þI_P/T\E‹ºsðnpiÂu¢˜u“b±)û>Okvú–699E'“ïš™­ü‰LL2ÍF‰h˜1“§[™ó·íé…LùÓ†•<-y¤o³Ââ®9ä¶GÄ7L-JbmJ¨³Z0P+ê¿Õ5ÝÔ;´A¯š·Ú1×ÄZ Z)2—™ÁĵXÏ"qˆÂ¥Ê=}qÉJ'ºÊz¶R®’2ÇU'|È2Açcƒµ:z‹¬›b‰4b™ZB‹‡2Ìì¿xïzðËÒ糇ÉtÅê¼awO¡êµFe/ò ø}Šj ú2·ƒ–¬­}ÑêÝChI K[ï|Æ÷ÏÐYã\§•>1#,Š¬Í¾ÙèŠ*´h}è"™4×ä4²ÿ«r¨ ´@€mJ±ŒË°0o¬Ïôõäìë,Ïx[/[3îv³Õ³e)”³%²µµòZÝC bx×`tƒ }²?Y(¥åÑb÷ÃÕeRÚ†´ß…ﯓüBÞ_|—¿þÿ;¯üañÿö7ï¿þÊ_ëß¶˜œ¿û¯€íëp,kÓÔ7H,ëbù¾œõ ~ß307¤ ‹|-Œ]«Òp÷Ù.F‚*ùžKÚZLâFÆõ=júo΀¾Â/í˜ó×§B¿"nc>°<Ӛ˿`aÙå5‡@%0ÅÚγ®04/ «ú§Eý)4¡® ŠÕ™à&¹çi2ØL3÷5Ú”=‹[?ö†ïøV¾º¾"«ÿ^M…æR“8µáZ*R5ð®ïë{™uÀZéUâê³Ý!2Ôa>¶<{„ŽŽëþqùI—ù”[U®™y"çÇq˜H‘þjÏç@åUüñ¶.øÜécwPQþ±Ã÷¿ýöÛÛÛÛÛÛ[¿Ï»Š€sŒqž‡c ›ˆ<ˆÈóããñx;X˜ñ_Õº\/Õ,¸rø”éô"\žîÀl#àˆ,Á„ˆBÝœ™Óf¨jæF3­É†-Ù¸/N¾çáÍÎ\´ÁH‹4eÎ)‚iÄVMVÑO™M•.µ…5O^¡ð¾ ]꩸)TUBùâ⫘HXËÌÑЯGŠš)Ëy>‘ʬڴ;R›ï(|sñ {:þU*,K+8IdçDÀ ÒÔT–¹›’¼PCÑI"qDx¥ËüYÕ›f#È—f€ ±KÐ*R`™ª¢•WUˆö€ævØÈ˜æ^4ãÊ\ÃÉÄ =Ç1±šá€c›vD$å@Ït —£»3m=×¹€påã)vÖªEô¹Ô5“Á-o!Åþ"À¬¬ðga<îºÜnvu]µÜ¬˜B8Ú/ûwŸóätT$QTËË* :ê³&®-g¤™ÿY<9ÓcÍóȦ«:ÂðGL°%CƒÖ ¸f¹î­M OƒËlvññ¸=zˆ;A蟬¾K å|)*ñJ©À8@B>I^¯¦:ô§µò¤»QÙÿð|>)-ž}³­!]ºÇ7] Z5×¹sÔ¹F1Ãü,ÄÁ1"ò`ÃHòU™ÏóC‡È1—\î)|áG½LVUS mœ_&6P0RmÏųfpœ•cÒË IDAT¯z.°õˆç¤T}ás>&Ü8[RU=Ž,`¼|šE«‡F„?›ü`êЈHòº,ç¸ñLë3Á>kl®·†cÐÂãò\Ûbi|œº¤]cRn¿éª¯Ø›{ívL“™în¹Ud—™ü¤F}ÇÙ癲 šê^ëÚ t ‰œR¤xÍiÚÊÉMÔ»´k³¡bJ÷î%æÖb5A-ð‹µJ†k¶P CÕ=ɓͰfm˜=2œÚ/²ÙGk® jV†e ÖÌ{L×ç8‡¥«rƒêk L[esÕ†-?kvÓ‚Åm»}µ{ö¢Ë¥h¯†L¬ç÷¾hôKèÿ‹lŸ_-·ß1åï‡ÿ`¨ú[>Ï¿Õð ï Þ¯dný?ÂQàb—ö¢Øö ñ;~—¯Ú>$^°ZS&Ox…Í~YÇü:Òý®êlí F#)ÊÄŸe~¤µ eѼ;òލ½mí´•á_€8‡§À›u=ý?ZÊ5°û2Á¯ACH~yVÄ箵3¿Âò T9 Y¼ÔtcÅzÈâ³U™pf®NW¨e í—è$Š—ÂÞ "ß ÒUrƒ/kèZμçÿÜ“Û_Û¿!è¨,ËÞpk8ŒýÌP…j…X_G“ë>aKàñõñ·–ÊÏÜô†Uà©;föx<ŽãpÁÂf~Ÿ*ùßV|lT˸àîçóùãÇÇÛª 6ç`‡øQ ‡c¶ªµ_ÑC"q!í!Z­Âãø|>Ïçóããço¿ýæ\…ÿÊrÆÞ†<¢ž7nÀ·ãø\ë º¦¦åÁ:H4;Ü1¿¾o -﵄¾ÄoM]|øŠ¦¾‘ÚEÒ!FTß+Doª/Ïæµƒ2@i’©¼£]F×Ü¥›î`Û½F$¾ïƒ-Çç(åtp†$|Ç¡òNÅ¥ ™âáµÕk¨vÙv} å …S Öbà×òÖéöÈÛvî˜z ¾»´³Ý¥t¨·r Rt4·ô¶î¸,6† ¶v9Ü[3g4BJˆpAäýTlbÛˆ5s—lêF|û¹XÃgjÜ„á|V™Ï#Ë( kqtuÖiº/k `ß /¶xNõé|>†¾V+qIFã¢uÁ2;€+©æßÑdéWÀ–1b´'ã,ÕŸ3ÒɾÇcõ^ ë÷ìkUþ­¨ÿß™«óG…6èÿÿ².üR˜ö·|Â[àO~rüÊkàU<:îQ׿t™íúºm•[z}Á— ÷¾!Ý™ƒ9¶a´ýJ™Öû[o<ìJs´¶.š]ºd­êk}ë–TVc$¼žWg¶Ñ|BðŽŽ;n U,ƒ¢^ç^8NH¼…1…™ƒ!€õ£¼Ïö¦jÍóui]°Iöò;>ùam)¦=X3Ó&êŽX§¸ƒìé&ý—FzÜ^¢k‹Ý {ð79æ&aª7\aÓÃŽÕ?}y¶´Œþæ¥5Ÿ­›Z Îñh5¿¨Â´xYÆ·F`F›3@DF&Ô×´± Çñx<Gßx—öÇžáSU>d?³´ÿ™øÁÌb¦"õüÅ]þßÓ +$ç|>???Ïóç©MÕ¾‰}àï¹þBcŒãýÇþçŽ1t ß‹êÏóÜ®˜Šòls6¹¤=öW[N®Mo8yˆB”B.§j3'çÖX°ÿPCÌbZS4Õ1µL¤+¸“ûg{<,± ÔŒ[Þp›þ1NC:1ûºŒà±8”è$3Èøl+ø¾eìtQö6ã‡tÑP¡ËAÈEÀqŸùyx™)V`?Gí+4xj9­¡•~‘”î…2õ¾o)¢žS`hͳ¢QŠ@ˆˆ¡š æÕèz„âˆÖ4-m ¸;E0ªªúabá¥<ÍÏÌyZoÄì“áézŸgÁ³BEhoŸ¾èŸc|~|øÓýq€~aï6OÍ8­ý8tÕÆ¤C¹fá2?’·hP¨4òr"e­øö«Ö;¨¦hIúáTˆréc¹¢¦D·£ÉÁW5ÏÕWÅåbò0ë×pm¦üœ–øÄBü»’ÆÌ>~>Ïó<Ç ¹³>Ÿÿ‘|ÏR?ÛèúßJ°ú²¦fvž{ÔšQ6©êv+÷¿zªËo±eßÑq°ª:g±TÉõúw¯]FÛmAÎâŸ%H,+”zëNš Wµ5 8Zþý5o¼¥I6 rYpštú¤?‚ãvv ¦†æ:ñ:Vŵkçã±ðŸ ÐdW54ö•8ª³ü+ëXbjÚ£€ÿè¼Üî+™ƒÞėϵ¢Ö4]"79M‰ðì«Vû1CSê¾èÿ;Q<Åì+ÎAj1òUSÕt ½loH{‹p‹°›çq1šlâX &ø†²Å3—–e“ÀŒ6ƒÀ*¼óØë¼æ#'š>Ÿz??>ÝT%%¦õ”醖M»ÁI ú:ãm½ÑˆúeÜ F–ì®Cr-–ÿ".ßñ¿²ò¼¸~™ØûÒõ‡´ÿÿÏüƒeൿÎ.ÜgøÔ-ø ¥ûŽ/Àë¸õBÓñB9½·æüŽG¯#†쌥÷›ÔÂMQð²’âò“èÝ+×v`ÖÖrpß¹£Ä?X, ìŸÑ@³׺öÅ]Ãm|] kLmŠLšõ»Ì+)#«òžƒ¥1 ‹ I¢¶úúê!X˜)›LF«(w¬Í’ß;fËVÊVÆaïhuî3ŒÁ¾Fôï/jü®ÆþX²Ð_&¶­~lÆ=‹Ž1†ÚXqÒ„Yf;ÿQ!?}»®VQ!¨¦ß.´TUìÚðf;êr{f9j¯ß½¢6Ñ3,ÒaˆþlŠòèuOÀqþÙ|`ð"ùq–èüã8;9Ž÷÷w3sÄ¿~æçÇÇyžþ½*8¨Òl:fTy}húøü:<°èíí9Ž1Ç9<žÁŸç³£$e£ªj5,nYùQªgFÊjQOÀ2Íüq¿¸%÷Ä3L;·™ýÂŒ‰A"<]K(æ`€M·ˆm™y Ex5èFä~™ CúY^m»¬hK¦VV>5^¦ÃÀ,,Vj¦qªÚ1)"Þ:2Õ1ðë©ìáH.³½ò4øÄ`©èA¤Fn±÷†dÊ*8ðI0jíeY»ë[.°Gô§ì•}©ã#çfÌSz|SlŸƒÔ«q£‘Èx€LÙU`ÙcqÕ¡ò ^ŸÏSXˆ¢LûƃC H„¡`,SZ¤š ƒ=!ã{È>ŸjF6„ø õϾÕæóT¯ðô "ÝÓqªÃ|&a;˜ÕÏ5C@Hç…‰ù LÛ €Î¡¦Î2ùƒÅÈ8M/JM ÛÛ†M=¼xG¤§¦kî¥#ɾx4.‘“fmCƒ¨› ±W'ùÎßRô–?Sškç¶‚jMGBÉ(évÇï–±@DˆÉf€’RäÛÀÔìß9kó±XDúŠ˜T ÄŒS¨¬kŸóK-ÒWº$]ëpK [Û¡|Ù«ýüF'ÜôÓÎÜ›¸ókÚò5º·¶6³P´bÊÐßCù7`eKÞ«sýíH†<ûi»Z¼>| æâÈÔF6ôŽË–/ª-ëÇë•·`¥â›A; Ûm³ƒ,Z“èÖ|?õú_7–©gv•ƒÌä꺰õQUÌN70ØÖÞ¾àÚ?pê,cð¿’ˆæ¬ýùR94×åÌ÷Ø<1OKèKvªbÉxf¥uǯ n=fjÚû€ë©*,!CnæO_4ÎqÒX#9®Žs®›:¾ Ï2ÿÍŒ”°˜¡:lçW·’Þ:—u”úÄq”>݉H x%.öÇ­zÝψHavké,X-‰>±Ô%u/lMš¼f-G»Š¼ï8õâž±­ÉWªçÎÁį0ZúÙDŠÓlT+Î.’í2brÍ69o[Onì H/¶hasôªÇvǵPD…Ù8Çèþ|>Ï1|[ÑÄÅ$r,oוp5“Á)cg<4&…Õ–1>çyæÞy\M · X³ÀÕK~ÑæÍÛ\-;§ËU.+*oí¸­"ôR‹¡¤øÝzv\hM^¹_ çH“´B)r =³w¯Ü¤UGŸ‰•‹s%€ô¼Åö”+L¿ã*¹È¶77Ì&^3›:œ-½.òÍ¡ÿO/Ù:þXöË›³pæqÙŽõïu€ò{>’: óºŒtõL{2a ¥©;®ßt•ž×Ó¡'¿ÅÊÎ;ÚxúµÀ£‘Ä3c ¤Y Ù÷Öâý ÂX"§çõàà“m˜7m4S&YÏ—ž+°ª"º™¡j/ls>½Ú”âû–äJ\ÍÔèt&š¡¨*Cjߣ}µ%õ©?Η§¤(fÊõl¥QzNÄ*é Zni‹ÚÔ¸a»µÖZ½wo-˜o' h‹ûW³x»ÕÓlhûZ7hWbàCÿdý~ü>aðoTÞ__è¿§`¶ÊþÂÿƒþ¿F}ü^¿ó·ËKÿqÀë¢`›ej{ Z·pVbEÚXûXô™î(±'S"ÒÆZÄNBúQíRKèE·vþ.¬ãBD4Ð%9W,*O9ikŸ†f¨&¶6Wúu× (ŒÍÄTÊMÛ‹r²= 7W‚$6kS«ÈW׃nÑ?¬…íátY-±ã~ß»ÚþÀ € ñ÷þs\úa¬jZ‡÷1U…ãZö¢Yã'"ÕøYkr[{¶ØÍ6O¬òCöðÎ=˜×ÒÖø^¸h0êãÇ==¿«ÎKgäèFƒøí·ßºiK¥ïÏŸþíŽãèӪǎ¿=TÙ÷!ÿ9|{zŽAk”gmrüžçùóãÃÌ„ùÇi…^²¡ˆ föC©M :ÂëÛ’(¢c€Ÿç³R"j«“s7/³ÍD-«u-dh V‹¤yõ’G ܇)¤å€w͆®çéøÄßÍD8ïÿØ)ui䪭§žW™aÆ%›ÇZžc˜jø …= ȯmò@OP&:a–¡óÒÒÐШ™qAK.·Þäÿž }ÀenÁ…²) n¢n(À`KÛ…bQ3ŠæDLé1‘ÇA<¡Ožj/cF5aq&àÆÔnj6LEq‚Äš ™"6ʇNfªöqÒãƒÜ°á‚çL;ÄþäÁÔõ!/ÌKΕEÂͳ&Ê䫿ÃâLs°Ø~=“ tˆRu#0yC€±=¢T$Ä¿‰AuˆˆŸ g>ØŒÞõ†qLF`9Ì@Ñâë5fwæs^Øj?R(¹eÌ& ­äèüõBˆ\©6ÙT÷¶KÄM   J¦:j×Ú™¯]iH€¸K‘ÌìÅ"ÐCIÑ6¿~¡ê¶eZáþéÊÑ—-ÁµÛ|•Hp³Él{ÁWÍ.Co¤¦›6cºD]ßqZÅó.æ;ˆ¿8Å.¯.Qç̾£ºv<ðªÁ×yÌ×¼€¼B{nn;“[Å®wÑVöÓqFÏßÕ-lÛË-iÃM*ªhû•y"JÈŸdõüÎä‡2ì›yJÆLdwà€è`(ÁîòUÝ:UÅÅY™A5Ë¡®Ë€§ø1U$äe´@P½Æv#鯿ŽBú)©´ð7jµ´HÏe! Üj¼1ﲉ¦—îxq ô¶§âŸ’Ú$ (vÖ(L²A¤ÏÞ]OZ¿øñ5óñxø¸üÀ27ÒaÚ$f:ñÑÂÔ¹ªÏó´¾ ÏÊ «´FÎd˜}™î mO¢K—+ÿ‚þWc ÝÔnŸ~Lp´c" -“ú‡Žš´™ZTëè¸v[°§¿¹>æpŽÖAòŸšó2´“@+oRßÀäÑë*´¢ â™Ûy¸b‚.™3ýÚ°ÕÙ–×m–£¬°”jÇZ+XÔlˆl^á¡>’ˆŒÌ©ï÷T××Ùý¸ÝF6Ÿ¿º«ˆ“ÉÒµñ;J³Ö¯ÜÕÇÿíT®åöÃ+:fö‘õ~§ ?j ÏíñdV ›ûY2·À6U{€µAeÃÓÛ£>þåÀÙ6h¶ª}-ôõ…E k$føAƒ&uyvl #l6´’ù–Òµ‚ =½ý@]žòmËo™Ãfíå&°åÕÖ”¼[G÷ÍØõjïÖIoW/·u˜É“î5%¨Z™»û¡®5‹·Økg¯Û!©&$TA:5Ãgü醡/5¾ÉY(4)È5Š«2,=43Z`ÍM£.´ßÖ’°¾Ý•þX?Òn_žÑv WªÚnR¬ö#»ÀM…–ÜM¼Íb·—:hïù2ûRü;µ½¯ú_]ß´|aDèÐ/¬ \õÿ+‘ò0÷ëø‰?ô+xÁüY‚â×/¼|m¼ü‘o¹Fp‰[6.íŧM‹ér•¦Íò¦'cRXlt/¿,ºfNg3@ k}m&ç¸:‹:nJ| › çÇh“dsD(€4ç¶`z%ŽNôü†N˜µ ¨ç7*Ú3Š⓯ øî¯'A³ö6þ†)dD0R‡¼ÕYÐ wŠÝ!pÃ-٠㊫þñ÷Ý·Rýqi)øÛ›ŽÖucÝ·;óXKá|ï'Täè›)Ç }ç°aè®jWU—ÌoŠÎ.r)MMƒV†ÌçççyŽ’å0¤…à‡¢j€YÄ"žG¤zª›À! uFÃÜŸ`h®@µg?DPQP¦nz88J¸}Ö#‚=µ}PmwCaßj¶jž¶pô.ksŽ*3[½£DS~ãš_ù¬ë[¼áÃqÅ–ZE°\EŽ™»ˆ™¤QòWŽ™oÑ ‡HÌÇ2[ÖI…¡Ã¼oÐ Ù†w„ž§Á@‹ë`~žP,p» N¥Ãtd00‰*#HºÀŒ†*),.ËØ#h ýݬ÷%zÌ£| ÷žŽ˜†½ÐÚ£¼}—ªóý8ðPT?©¾t°ÂZ4#æ¡JF*‘ßPŸpLãÆy¨‘@X¢0ÖËp<í—ªaË—!YS%s¢ƒ_µŽËâ"1Ó^–Û–¾LðZõtÛ&°ó -RpVëø“è_”‘T‹{RüàG-§-eYQa¶Ä\ô}k­lwåÍH‹ Ô–¢Q»“×Õ„“_öFâ7­^t¬¢ïGâªà«p»É™êO´÷ÕÖè¾›ä²çÙlW¸„hVÔ+õá¢).®c(q·Ã´u.¸ü•œ#TÏ]FºDK¯þ<ú2p©‡zºiû‚—Mþ¢,Ûœy]LεÙKØž*+¦#šQ ÒÜ\–ø1f¹/˜¹¢bá6S·SôzFÆñÓ}äYS)ºmÎZeÂòmAÚÅiK5e;I ç â)‹¿Ž–!Þ‘Ä-R`ÁOï¼,׫wN º>‡K”çA˜Pf]ùIS3òªô-ã”[@BNù~ùté(F4Ü éÝÈç)N¬Æˆ›‡E•W<îŠ7t^óNçeÚ-{邚ÙTCÌdQ±³\üqIl F×Ú£XU:ôô*¬¢‹·óV^€—uoÍï¼Ãé–Œ™-2Ø'xWZP˜TÑRßÝ;·‹™JáÎ oä„‚™8xD"©¹h£'ìñýýƒñ8»O*Â#›AdŠxL t,Í$F[R&W#o$n]ˆä¥Ðµ·ˆ¯_»ó¬îåeFˆ³n͉²–¼v£U$½@ÜæWWÕ$„ëâ³Ôí,ùQ‹E¯ aË'÷Áó6ê­ìîÉ–® ˆÁ®Ç¤EÁÞ?ä mA÷ Ñgwøú)Í—} £jfg±D9à{êÃL ÃV‚ï˜ÿÌ2XýhÍåmÍÉ—S¬ ­®˜/z×Àuméûoå-3­âÖÊI×hÄZ‰{öXðùLnת^ÆTó5º@Õ³¡¡ sTv‚]š/lÔ&Ã+=i-ài›OÆnCl¥"´°77@QëµÙ3Ü-„ëèþ"НQû+¾¿%à}‘Ç’âõÍr;ÀŽþõQEAeÿWý^ÚbÕ‡`_Êìÿ¯¡˜¶¦Jüö³UÄLÚøœJOý"ª˜Í_¾h ø&k¨î-]¸gÐI[•Xr Ä´6µØKÿ@ù[5Â{ý/oùù”§$&‚ßò…€‹É"—è¦Qle©À[˜lù$3K[r?*ÈÄ«’%¹O†"»8ÂÑ6÷×/Vnûµ—d¡ï²\ø÷ÐÇu-˜ªêPñ›—`•Ϻ†•Z‚eѧ³¨êçççóy:JU-v™Ïs¸æ¦(—Ø(‘,å‡Õ§…ÌT³ Þÿëãã'5×-ÎólE»¥ç+u­T×¥¿¥‘ÜQòüãoooçyVnSb™gX’ ÔVÕ1ÎÑççó©ªÇq€YŽÃ²U•4ÈÉ··7ß4ZˆèÉ U}{<"ü'7-þš)Ò);¸1ÁÆ|êfýlLÃÓÉÎüóçOy< ãd>˜)‘](¡©Žt+Ç ãðør%£AÔGìä $ш«m gÔðV&&dª¸ªšÊ°¡>Ñ…ªXõóóÀqHMŠ®ÅpÉ5àBu]F.Ìcèù|vomiŽ|…I À–¹äuŸÏ§=ñŸ”ãp}n;ËVÓ{ž½‘¾8º¸— JFÑÇ xí¹ÙˆøÿlNpÀ>z®X9"m£›ÝØà4@ôÅyr<²qL §‚Y f0ó¨\†™°Äú¯fÃ< fèÑ8ÇéM¹Äô`—à C‰ v*Ñ“·Ghô†AT•X0””L` b5e0Çþ¬f§»ªƒÔè8Èôdö!døù3##Õá 6S%= ‡çÕ“É#` IDATãðÔ}G~yÃîÊÏÚ5+ØŽãd·ùä¾ÏÈ`j‡W@hNèJvÐ(…ù7h¨ÙÐ)ˆcf9ÄkSk•çlLÇ?Òì°¸&¢¶\Wh÷ÑØèø‘?3+ª‹ÅVŒtÇæò'§;¡žƒL‘×Q÷Ígí1C`%k¤/u±px© "i¾4 çlÚñ‰’]÷ηá06Ýô7ÓêŒà^2dï÷¯þ´7œë*ïÝfC÷¾Áß§ê¼ÁÖÿ–~pNèv+¿òÆìK¤LTp´[“+ˬ`(ÉfGegêg¶Í×s¿ƒËeóÜ&iñè’BßÖY—(ŽuWßë‹¿ÈýWU'Z®E/õ`ŠJÉšì°oëco±×=²ôÊ¥¿óƒpŽaÑ…Îý\hfWòî{ »\Q  ñïÇá Ä/„™¾(Š+ÞF˜=Ä&*—Œ¾{‹™†ª]E£Å‚`EwÀî53ÿ'ï `[ÜpcÉÑ,¡a‰¿¾C=G-ૉ€r˵à¬Mcî:ŽóÈqGU§ñcý¶Ë qä·%™„HÍ4 #¨DCt×L†¾«šÓ–@튯ì)î7ëRVSk÷èlŽ™’„U½ÓK¨\Æè;mÓºH}€®±‹éœrîq‹”)ѳ f Ù9|*ê—úžÙE[èöäµ8Ýv¨ËÚ_dŒá_g arKwZ,&² $äÿåñxP³/S¤SºÑª*öŠ”bDhÍ#ííµ‘þT­-N¤ðý«®ß눶îtéËsÓùíëƒ0錵¼+w %Ÿ6ö4Ú’µFÕH‹Ùé_!t}éSUzQ„ê§mÃ<çrqë‹ßyè¹Þ¤<ïA=£ï¹¾¯ë|­m¹(¶78m €>ÅìlwÐHs’•KõÌÖñ¢Óæî·ÊI:àÜ!Ô5C¢®ÐfßÏ6àµ^Áý«Æå<ßL¼ˆÿC;•hü{µa¬¿í1 É\ZªÁŠ~È¥‰¾ÖéÎã¶æƒo&ÿàoìÿ?U<ðg8€¿@z¬Âùoƒop7—ÖÌU›­ç×7ºyq,ãáµ,ír/ëÛÿ¼]¥(²¬/~‡‹½Øò!M’#}ÈYsĶ•ÖŠ%^ü˜Pçb–‹ú8@ˆU¸µ`@–˱×I ˜$þ‹U¾s˜ ©uúøH9Ûw§”Áû; ¶žÞõ›A½@sîÐ/ÕŒ-ý¿û ®޵l§ÞçnwL^® øC7Ì¿u=9FÛÿOä+ °¾aæã@ê‰B4Uù¾“W3ÓÏçó_¿ýŸŸÿå!6=|“ˆžÏgœW„}ƒ™???E„À®ÈÊÙ¾_õA¨’j|šF!È-΀Z–ñqHB£ÙÕ©”Dx>Ï®öH«åÈHÜ Ç[lrœ%wz>Ÿ^àøxw›®~8Dæ^%Ò'Œ |Hµªj•ðmÑKö<@„Çûƒ}OJÕýZŠZ§9§ÓÐ{ZÕ«`jlïUpN#HLþ^0 Ÿ€šÒÈm¬“^‹n•œ ÉCºÆ_• &~/0{F3" ï·ò]rÙöÍ›-ħɾ˜%Œk»íŽ À£šD‹¸šÔÈËv9ÆMBæ„Âs5e~P:߇)+TõyžáQ^.­OyDÍâof<ä VýtÒ†” *1? dt²ŠUQ*¢”LfP#‘žŠ¬¬˜N_]#£Ø²„&`qž¬YA !ø8`4²ä0c±à~D0Î:a‰ó'1“)™2 ù¸<Ïj,œž¸hB°Y)¦tΊ›t>wƒÙè]²‹¦2âƒ+_­Rž„ë{>3µpŒ’—,«Ô›6pÙ{˜²D‰¦þŒ¹ svÀzŒÄ2m×yw>óZ7™}5ߊ¼¾ÐeL„¥"Pµh ^:ì¿Ê™Û –Ø"š5}¦h(µzûÚsÓmx%•·mkÐ&Ä®”§µ¯r;³EL{eÒŒ¹ÓauÇÛ-bwö…¹íŸ­P%d‹ ˜óA¦Ù¬³8`ˆ®æ€k@Ó+À·À†YçwT3VV+ÓÜZ·¬¡¡#ÊÀ»æ½É2FA-™]q%œU"„{WG•¦NÍa«Ïafã»aTLŸu ù†U) ¨dFkv| ÇýˆùÅ#Ìù$Ž;ܨUs]\)h)az· ï×OuuÀ²Ìx¯&ÙN‚"³†nØj;¥ýFËa¼%Ydc¦O¥-5=9Â2e7$‘Ž4¦µÙ÷)±DÛ)ùhE¸{ÀŽÎQê8޾ß+,iÅmgnÆÖ|hQâ£v ÖpSì É!ÆW¿T&¸\I'Ü/E‹˜¿ðª”/¾Ÿ”1´ÁޱÂjƒ•Kq1Eª–E×òó´_”„ß*‚,Sw"ˆé.‡ºkð Õ³¬0]"Ó±¦àH§ÈôBy¬Môéß`Üi‡éECÉ&/äD#W°®å§Ör/%èÆ¯*έž³ð<ÒCÙu€®î \öd úÅ~æÒ_5ùžÛJ’Ëúˆr}2îFÂ;9À-êzûø˜ý:-Aùöw÷•p2O4¼“ YBfÛjs÷‘.¾hôÂjdg79ö<´Nk· ú’±àCнnuIXöÀe€Û "Å;4Óe„êl}ÞV™2Ô¦ ^@ñ³W#ÈúöMNWÉ"ÆHŸwãb¬è‡°¨­%‘쮩¸ÐªüvÜ?Å%MUCxu–0»ÁlA~:ô¿.›d›àzu\þzù±…°o€ÑèÏ++p«î§DÝï2·øþÓþíýåÿú¿õ•ýmêÿïcvöKÞøúµÿ¢~ A·¿è/ø32fü!©þï„ÿ¿b­VÈõu.ÖK‚áwiKÜ}èëÿÄ«&ùÕîÚïüÁsKšÊÅJÏåXú2W±z8÷¢LàP úÂ|=,È{,”lEí• fó8dFîlƒíC`WI$0ɲÚÁ!®õ-x hêäMJIÁ +À êvÓ—aW-û†©1üòÖÀÅ$ðû÷Ý¿›M<Î1°ª:71;Fà2'2N1n|vùñã‡G}||üøñãÈÊßÊ;6;›áÎ2g™ÎsˆˆÿÛúi{Éøçñxøw|ŸºT'‡½çóéÿ©0ˆçç'˜ñx<ÞÞ¢® Àépô¸_!KQQ¦[fÈ Ž z{óôÛ²-½ÄSTu23 -ü1Î}/ã“.‰Ó9"{}ÉH—ëvÁ©§ó“‘bj:Tm¸lúTó˜ 9'à+œ0·þ‰rWä†PÊ}n4R™Rߤàž‹kèåôä!N‡ˆ/RÑ.¦N(À+„<_œ]å^r@"¤¤!ùr0ú+›ŸJ‰~f!ÀåëG:8VÒ(@4ëÐî”2_ñλ«[‰L©ê9Nƒ˜É$㋽ ~¼?ÞßßžÏs˜šAH`‰Hê±Ax{­±Höオö>ãC|÷ÄnnJ’É"þì2&¥x ‘ à(¼UeÀ¦á›†?*`6† :Ü ­põ®kJ×pí+•‚ÇYë¹ï¸Æç³2C $•ŠO"aq"Ú]ÒªjÁ¼x%‰ªš×VrpÏp§Í$ 7 ®,—l.-©²ÍÍwÝõ×ù¦{ôâ96“?(S䀶ìâ¤äÙ¼¤}n;¹i²Z´ßʇ7}ç« ž:p¿í©¯*Š™jj«ê¾m¿Ð í|Cs“V‰çV³¦MÛè½Wè!ö¹-û6gSÔ ˆÐpG·7ô|ƒù"¨:«69¤ªÞ‚eË Y^˸ZÏž®ë‘”†;^‹ªÒ4Ù•pu"¹kjí=ºû—ÚBŠîDw³ ôªXéT=6,’ÙuLÛ\å×WiŠFÅŸ£#(n©ümó£‚BKò×,ѱ›dr\*§H<×ç^ä@+ås¥°À$$S0si¤´O%AX:JÚÔÓ%Ö–Njõ55{ÖÑ µ¢§TU=oñ FëÂiÜlÏí¹ÎüRK´„äm,†6d­‹ŒpÁEÖ)ÌÖÁǬ%ï7Wº‹›ë5ýQÜðMNÉþÔï§Žn¼í?b›çA³Z`ÂÖ{JL9t©ú`Öûu¦Ç41ÇîÞСW‰º‘qÒiÊ­ú™>ÓUXü²¶\và.8Qۣ̯yb[¡që!Ð"Ò,ÏÎæß¸ñml‹¿•‚}:³ßWÒ­ß¶Í“w]ͺ†]×(¢bS¢¨Ù‘‚ê«ýÌPJî¡; ®ßwÓ ƒQÌ8¯‰=~3v‚Ä¥ŒkÔõßÓØj˜0iâÐJWô¿>É9κe3­½Bˆèš%KÓ¦ëçž`¨'ã’mR¢ršõªF‹§fã ©9ðüîæ9v6l´…ªçD4ïv\¤•{±¼-•ÖôÝ­ã ¼l³á¶N讦˜V(ŸªÔÛÝÓÕ16ÌHè^¾JY™^#®…¥ì U¿ÜÈè6Íþãh”H`U-ë¿«b‹o¨uíé DvûpÁ –yô³?û:Ð/ŒfŸjŸd N»Àw¹é>{ ô%J]:èd¾í:>]5ò·zm“o3*íE×w¤ú·çè;jýWŸä럼›¨; t…ñ÷¤ýŠÌœ_ICØŸýüv•¾Hžÿ>Ôÿwµû÷/jmþ\~ú¶´.þƒk6ä,ȹˆfîÑÿÖñ¾Ý§ÔöiwΛ‘ùÔÔM£JrDÉM(—yfÚDÔ~R h EòB ر„þ±´D~øå:1º©—8bξj$l­R€¬‹æˆÌ×!¹B&᱘ý,ñ}¯ý 3K/Äö¢æ BqQëmN½8ÞðíËø›wËßXppº [dÞÇEÄê‚q‘u·´De›|özyüxg°ÄÆ D\¨Í6͈”o"‘% 2‡uO9uX?þûñÍÎóüùóçÇLJï'™Ù[*E¡G:TÁ€ˆ¨ªÿ¤OÞ•ŸSw©¿Âq¸¦œEB}à”FU|||ô¶Æó< ‰XŒÛf𻝑Ñÿþ"ÎIÄqh¡³4Ô‰ÙšßÚ·+ù?~Hý?¦f;¦®sŒÑÏäÊÊ´KjüýÅ~KD¬UÅͶ}ý»:ò°Ö…ŒöJÒæû.æÂ[uÛ>ñÑCZ¢š{ª¥ /»¦(€*ÅbnbiɤŸ°HåÌö\Ãþ]º ¯£ÿYð`§Î <»1³eŒWiÃ+Û}>+’ÈT-±€¨ÇÑ=áíFØz ¿ð+\·0þXtî¼~Ø¿¯/»ÏÂ\:È(‡t‘l˜AŽêª«Ö)Š­Ëo¡%š‹V}åfèÆƒZ¯y)7·½lŽz—Oý¨2›Z/vã…J)æB£%$T¦ÚÖª½¤™Scì¶  „ì€ìÄš³ ªÎZ?›JJë˜%'î* h²ô5*øÒbý®+Ö²ŒE¤ÛUöÖª™¶…r ¼^±?nV½k½£¨Ý Dv.C›l›‡uc…-«¸Y!{¬Ê”¯zvD|\)#-@†ZÇ5¦¨5;G#}¦MCí‚yÉph™ÙÏ}î°íg7ïŒy´kÕy}»ú<¹…óëÖ"`©ò^£5.$LK¾òÁ½>Òð*¤H„ŸWËÐhÎé}‹Nÿdßa×§RÍ )ò^…•6kéR"=Õ:^•âîy{R*Þöª‡À[a0#†—ænÔ¸r 3OÝèÖÙпB/ffM’/=1Ô‹æv¬uÐm§R¯Ñ|ÞÔT¯¾%*Z»OcÕÓh›:Êè]ºh¶´€âíî$(˜œÑÌÁ£O¸cý' cÜõ£IÌ“ÝòÙFõ“žÔ?þ´éÓÔ¿P9ö‹¹Ý/KêT;¼ýfT3øîƨ‚sûz•âŠ~5.ö€nü(  î¤¨¦vñÑÊDlôʧ~©ÓA ÛÕU…VF¾­=»™*®Ð=6,KbÒÅŒ2Å®TÖÁ)Õ|™f_:ZîVþ¯ôWÆš/Fë ñ¿½J¯«ݪ~~Ç|ý ¶¿n‘[èžo¢qøTÁïÊäñKLdrƒ%í~`ü]®…ûú70øêw¿ÜÞü&p{xl½qš¨æ¯|¹å2K¨}÷™eØ}·>uÉ]­µ© ù:çßJÓ±¥E ä¥ñƒSéŸDãb*ƒ£0êe¿\ÏàýôæL3JùÕ»`Í9Šá¸Ö_…'ÒG|ÐÌöŒB;ßÂKF?VÁ>Íz†àgiÞkÕE³æutÏú(¹”coäîðM$ÿ‹Êß¿³˜Y,â™Tu …9äp‹òû²—ô–œÿñx˜Ùóy¼ÞªbÂcáóóãŸÿüçÏŸ?ßßß#p¿a=½F¬4þ Ä[Æ>` -ݽkÿëiêÁGÖW0‘ÿ¹íö¯RTg@ šCU £Ï—z>Ÿ>j?'Üßpªžcmk™•Éš®Aë?o©öæb20²,#2íEG ú™uäfZú5í#^ßaU+O­]G.&Ì%ñqmTøO"ßÝŒ‰¬²Mf1(ŠÚž#Ó$MöÍÈ„…EÏ1 ~8¼ü““ *à4”†Pqp FOÒ¯Ž$¦8Ã7U‰p2 ,ltªÚÑ Î½'Ìðy33äŒx%%:„± 3Ã0Á˜¼¥–`:&8À„¸ˆçþ,T{DäQ ¦’©ÍÅZ†ß»…FpÔÔ‘ø‡H¡]¿ã´±ÍDãI‡& WiBYž¿À&®¬ ëÌ¡¯t0CsͪØ×B›þÁjQUZZÈÈh4ÛÁ¢~0ûê¶S÷<Ú¸“/ƸmË÷Êz|ßÍ{)F‹|§‹(KP¾GXõzwA:…ÿ–¿bUŠÛ–B Z­™áƳ3Í|À{"RË—Hvá’̰ú,thJkZ;bQEŸvÝó—Ë|‰ŽûDW²VGògº‚þ¶v ïé:<ÓŸ2kÈ"Ç}É/šâDšÇÊS×Bƾ’g3â†&|s95/ ¼}Øe¸ºfq{X+R¤õæ13ÌfŽìÝYÓÞ± œÌ+û-x5m¦ä¼iY6Éï~éZ\Ù¦æ=ò¨BBzÑhÖrØí!Y¦i30„dÅé÷úôבÁê)ÏŸzö¼wæ‚â)O+°‘¥Ù¼1y»º©%ŒO{DL¼SJ¿üä¬D#ϰëˆIïäE¸ã¿n®-¼¸û8[¼¤vfå·Ýæ-%©…Sg)qÌœ¡ðf¢H˜¼—³­ § ³¯À[#K^É˚ɓ8É>a õ:ýÒÕÚÙÁÎ_ˆJ2|GÃ3³–q+ÉØ$|I$*@:¤UëpáÚ›- ŽX=,VN­ÿÊ4}$Þ¤¸­Ì¢ãnjJ•b³û´W¿êêüÈæb¼Clës·GQÙýß܇Ӻá2æ"n·gâf¹¨GC7¨a©BYѪí1úÍëcw"âEŸ¾¦„õþ˜&h ½ý¹¶à˜êæµeäVkÓ#b©Ò\êÐ…i]ûŒ–;Ý.Í:ËtÁ ”u€{U@G.@½¥‡»ë«UOõÙ°¯Ë²þ« (î hß^-÷ ²ó¯f¶ZÚ7½fdßX@Ê™uÄzÅpWýæ½ÅþИö‚KsFÞu+JØØ”{J£î­Ñ¶#R-S›ºãÀµ^z/œ™ƒ@Ôs~®ú+0ôz;¿Rý[+?¾J[¾ð \2ì]ñ{`4îÛ{ÙìŸQýÿñ_ù·Èÿ÷MÚƒì?mk6:~µ³çÀ«Ô~zûóòÒZÓù_ÀµmtñJ_]ºý‘zñÄÞýbýHµéwßÔzViàC&á}¾ñ K‡ß´‡ìû­–®ÃÂ1Kp%lÁH—³Pˉm¢ô6‰ªiJXeõ U/yÔì^HE©§‡9 µ¨ÜE—á%ß}/7‰©·¿À¿Óö{Ó×þêö¶¿ùÞY €Œ¸I®^§6ÊçD×Ìõ-–?þ™C›@>Èe¾JŒ4ƒóÔ/–ÈË!,ïïsÐi!X5ë›Ùyî¶GŸ} tÄíñx‘ÏÏψßQý|>?~~x믘Õìù|NÛl6š€Åóùüí·ßþõ¯}~~þüùÓƒ€|¢š!B€fú;.5bm‡s<oÿóþ¯Ç㡪ÿú׿ê«Us@1þ­Êx©,p¿ÅüæÍJMTпËãð¯PÐŒ[(S&9eVÜ:Á÷i^Õ2µ·™õ©š±-²xžg9CZ„©t•×ìxØPëûF±u`’Ë„jæY{ ì'¦%â×PQ¸½4äÏÞÆ›†}ˆx¶É 68Á²" ¦dæó¥Ã,ªšèÜ:àÀÌCcpÔ1¢x]• ¦2×ìÑ ÂPC\™Ñ!šÁNªšï(†oAÆ$‘`"X“l5 óíÐA*ÌÊ3‘™‚`Ç%e&%’ãS<&"ÇÔÍ:h( :l< žoÁ&*&Ì0Lj‡ 6¦$ì°µÙI$ fb‰iì!PcÃzâÔ™©ûñb>üÂcÄ~Ï/(°¼½Éã 5¨v’ÁL]­OfŸ µøÎN…ÀZ¿_Ä Æ×üÆ®8,\câ\¸ÌÆP ËWs;æ@Æy"i€( ôÇßk%fœŠfÕÊØõ€½í»·FîŽÜÉq0ÖþŒL’ö'—ˆ³ÓºÖtvM™bÈÁÂ;UåFì©4Ÿê“âÃJ»0湓,YóQúšßƒ«/­’»”yK Z¡ì«|i6íPuóœÉ5ƒ‚Ö–Ô¾Oë-¾Ì,,Ìì)óN³‘ÑfݘäŽé´Î•›:ٜ؛Î4êz(§î*Oä\Í+Ò½ ÐÚ«w¤³g¬dÿêWZd‡L™s5¸Là»-Ô›ÖÂ䫜ªçYß#Œ›9=q´’¢acUëÀèÁèvI™Î3U•ŠÐj&ôªéëšÖF‰%¤ÍÅ #2Ùho›`Кw½þ«] ZF£*zí%öuù Óæ».Sm^+K2v¥Ñ߬_„˜_OÖ‚Î+U,øü[[âu/Ì´Û¦¤-oºLO..7vz÷{º–t@¬ëaú™U2ÿ-UOü€ó˜¹Úžk…Rmñ<¶ÅIg sÊ6±ZúüÙï…: iº ¸¸ÆÅ¹ò82 ¾?Wn5e+¦Z_­L®¢úiwŒuì¢dw-K— £;`_îq3¦f6ÆÚ[PÑÿªÏæaíDµ`«°¸F$Ñy•/êûö8©›´Tt=âG›”´WSäõÂáóP}µ‡¯#S»?kÏÑÁ¾~âí18¸òߊ±­l øë¤fÎxf£Wì,Eç­H¦68})*²ð:LIûTËC9MÞMÚ£˜eHWVšfæûÏrjóW(LC¬¥¯FKdÿ4¬dð’óPñîm UÓN¨Üî%×N”î…yÓ…H£„Ö ]ž—Õ»ûÂM@cÔ@åý¡X-{udÐ< ‰ÅUUvFó·˜—¹æë^pb‹~…v)zÛhcvVQÖŒÙR3ÓÅQí¨.Úð†ûS¿vF¡c¢“Y†WÙt l·'¥pÆtw¯òb»t“ÙÒsióÁs§ýoŸ3¸Õ)l×:®žJk2¶+öŒ¬ùç;Këw4õúo¿h9þd~yí¿)èïÿe²¼Ë–o4Ð]Ö¼½v$| …þY远ÀåöªâöÖ•rm¾CgqÕ¬æ>À9 IDAT´¢\¢î¿¾˜±ŽkÇìþ[عœØ˜í5.éiÁª.s‰xÿ)›OÉL ¥´4Tª>Ï—­páÎ¥åVëìÙÒ€ÕhÉÅ ‘¬+—k ÷ïi?<Õ÷Öj÷@Ku´Gü|åËÍ—Í_ýƵ½Œ[[^ïÖÛKKÍ· ÿï;r~50̘@dç–ÌÕƒŒL"™O0\¬p©ƒÍ㥪0ˆ+Vb‰ödjI ç#'¥…ˆr:‘;ï:úˆz<ÞßßüÛo¿çéù+ý?>?8ŽÝa("Rû‚áüoßßßK·â›19Ž:úÅ¿P¦{£ÝŠbÔ<Æx>‰",r¼¿‹ÿÇÙذõRÖ'úÎCø§êÁâšÉ?þ™™¹SuÜŽã(päÈMf• ÓZ©YÛÎWjšÂPfLä mÄ÷÷Ú%úÇø?ÿõóñ(¸ ƒ˜í¾.¬cbŸÚA%¦ÆBÒ­¬ Gÿ„y ½+q#Ǫàƒ2Ø…¦æ©Î•PÝÜF¤ Fæ9tîrûá@píÖê'¬.TòÃîy«S† ßíÑð[ŠßQ¢AU­A&VºÈg]õ:a62âÆY½Jæâjdc klXãvví™AÀ社Ñá<+Ïp"Q2¨1˜UO¿”ØI 4Œl0%Wp€1” Jªv°1‹c‹€ä2ªP^,f&ä’cU3&âCÒOlL0eÓ1tŒˆbbn6Ž‚‡12"&9 O·Àyc€?8<³Û5ngñópp‰̢e: ˜1¿½Dpô©žã¥?õp1 •=¨@·Ù±Î´ˆÏ’ÄæÜ$„&TõLX"¾…ê®öZ PÕ¹#Ôð1$ÎE•ð¿µÙÄm°ÆA A¥øR@S›‹»¨¢RÒõíDUZK4^)›Ê¶Õ"\TZ×f`\4\Ø é/”PEÈk[è0ñËrŽS­µªd0z´-Z¿“b`˜yó •„?9×Mú½¥ç5PÈlcVMèAKmoÍ£ïWcƳxðq¹ÍÀÕÚ1íkÛç kËyÜ.Q ¯¢f;»Ü#V&¿”2ZGÿ#8A5à{/‹o¬O –_¶WeÖ3«ø† `êgÏBÏoðâßbî·$ÃIm ¾æü{›À¼V º?èSöÛKs´P¥‚°]Ÿ±uúmEÐêsŒöÕ¶ÈÍxÔûý¬•Ç.o´qŽ7ÓØd¶xЈ"’”3„cúàœŒ…=f¨‡½§“fs-„a‹’]³iȘ3ÔÍ©…ˆýŠ¿á? {e”c© êë6cýy8˜¹$üþìØžJ擞-%±¤ä¼Ú3ÁÖX˜æcŸÞœ2¶çt+0wœ2aë`8õ(k‘›€ cØÚñà|Ïh6ðºWŒÔ.$óOW;…f„éê„›ÛÏùFÚúâ°øŒ¢2ưƒ™­]<ŸxL%u÷®iZÙý{hV•,ÿ ¯ô@[L6{eŒÌ ñ'ÈcXê—|¿£`.B@I$ÈÍ ÌNTÔ#¶$Ý•N Wäãªï@©uŸ—™¯ƒÈŽ]Lõ+¸ÁΛȺ+íê…¥v bP&ÌÆÂÞ% ¯~¯Üq «Ü)LíB‚nv¢Q‚ÌåU—P×Lú ´H¨‹Ø}J —&N£»ò­*¬é„J\f+7vã´» ÿvØ{Ïð¹ÄŸÞŠÔ±ÊŠÿnµ>þ›;¨Çõ_?Ìè?þ†ïøçÂðëÿN†Ï=’~I‚\!õn¡y©Ú_Ü»^_ÜõÔ¬ýb#†17V·ö \\.=ž§îÿÍŽíLôôa)¾àæ•ü“qA¦Ú> ’SM*@ ê)º*Ijt¥£âóÄûÁˆ$Ãúy6^¶¼]ö'ûúè ¹æ‹0­m[}©¼iX¸g¾*,!*ZÝà+È~u“lîš/Ì6+¿üýä ¿J|~<™YÌòñ<ûí7fþÏÿü‡‡Ÿ8»Ýcë}åÔ®Õ¼clFY@ó¹¾_õÈ~USXs‹íY“ä¨G¦N{b;«ªêçç'ÉqxÍïãÿ󇼽¿û@ÿ.¯ ffÓÆŒª£+¹~þüYÃëóé}GbÂ|U/¾ØÃ^ Ž×jX‘‘zýŠ!*´"ƒ\¥7ôd†z£ãñ ¢CäñöVÖç2Í¡|ŒÚxThÉæü½“Ö.#~f"Ÿïo‡È1Æ9Æp„€‚–;á²Ä”Å"iÈŽBWayÑôãæ)Ÿ…œÑÀhF"œB6LÊg’I.8ˆŒÐæ .HÇ”O²Ê‘ûÏÄ0†f‡ §× 3D\Ħ¦ìiÒ–%“Ø~$PMYU—_,½e´ñ—"c& aÜœ*¿c‚ƒ®0‚¯Öã4ò f°’áx€à:yRò "ï4öOÉì´Á!fö>D¯ëUUõsù‰Ù гc ¨ž !燙®‡3@‡iäÖæLê î¶=E–SºÜŸµ»à ,ÏúÎõ¦•©&1rúËmF±…@Fªv‘ŸÈWAáÔ*(z5Èü^k“Al%]a­ ûqð¸îÝ17¯^þDf6ü±x5]/#­ÝqjJÚà¿Jšò&«¸JÒ/Š´-¸ÒS>ïÛÍŒP»´ù_ù‡&£­a"EWÚ¹uk„§£PiUµ´+ñœ o4ÅDšS®KÂR×aTƒ¶^¿„ÐÕ¥ÕŸâkrÝÆD®òèæäè·ÍDQÊ'œ5d+¾IÖùhÌ¡¤dŒÓ(8a¶(÷¥fG”p›xÅX'ë?÷­†PƒYM@u©dÓFKnö…I¢ÂÄ.EYé6ùÙ¦&@ÍÔwj×'š?†Ô +ÁPÌÁjL™J—u hûtÜj~7¢ðp¨·85v¦û"A¸üîçFDê¬nÙLUZS[“-÷ ‘ÁöOÔüsWÈÖ~_jӧݾ/Â3_¦÷Üô*ä…±Õ„|CBKDD¿4„gík@·ž€_Jdü7@ÿ÷û?¼~à ç¶o—lzç?stþ:~‰WBÿ/ îiàöjºèÕpq\Qþ×äË®/…&íÚu¶*þá£)¼Šÿ,‘VH9 ‘„±d%ú,çÙw³W]ÆîDZ˜þLÏÁ"o7%–©22(Œû©£µ-Êů®Ãœ_°/A<‘ÁTS'nó© ÃíI\ëN¢Ýð¦øúr1µdÄÕÐý_ÒTß$³&!‡ße¹~àÈï3 4þŸÿ땾OŽãç8ȘÅp#]×LÕÆ8ÁÝ®åÚ–¡ó|>™ùý‰\¦¼ŽËž¶UO¿9çóù|æ ðM¨êçcŒÏÏÏOæçó4‹`Ó·ÇÃ[ym©{ ¥Þq[.pg8üoCƒÖ¢ÿ]úTé:ÅÐç„jU‚äàS8ÿqž§ªþüùóçÏŸÁx«ífv‡°¤B!öÅ ÜÊ?·r‚jàL™ØµŸÏáííÍõŸŸŸ{õV Ÿ¥lž¼Š•6a Z©WTÅ‚{Ü¢qâQRÃàØÛãq޳EP )YJìˆÃã1ÔÔ"²F°††gp¬jÃÃï\0l¨Ë¸üœðlÃ7BÁè\æY÷Ç ¼ŠM“F®îÁüÁ&0#5{‚ˆÍÛr8H}Õ5®Ý;)AŒ#¨÷Fq[G‰«Œ‘•FTŠ:Ù(*DfC„s@È”ÉN6 3”ÜBïµ " ÿŸÚ ‚©?ÌYá#ôÁªÄ$fPƒpŠ…èˆ…Û /7Â×:G߆ù¾Åt °èé!úÊï"ŸîB"5:ĈaÃÜÞå44„ ò„0Iºs…=Ñ?èêx´Y¸ÔÌ çI1œÇÓx …0S³çyRÊíÛÀÒ”WHqŒštZëÇ3i=i"bÌçyªÙPˆÔ ®?<¬"낌\Ó®™YÞÑx~GâMÍ{‰UÏá¹Ìïo®~o"k­5oÐ üa†jåY˜ýF®`ç–Ü[ƒÍ½g6ó‰§òn޲ìDM™x«gx/Vÿã|6ßä–¬(¼ò3Q/5%ëùõ±l¶Ìe¿ z>öQf…¾w„nön÷rÚ¡ðtÉõ®ëm … MäFÕóÌz=wZ.v³(ÚÇ걇‘Vi?n H¼|®Óú®Y‚G´¶^*òd°’^ï»fH1W@Ì#i³Ë:šõIÊŸ%jõÅ»‰yÞï¹ g—ø=¦D¤C}OTzŒÁ—òm¤û®kÖ›oµ 8bÞ#ƒf®BV”c‰k[búóJÞRª0©K¹ éíI¶±»¥·{O8…¼¦ ÎSB‡®üœ{¤øÄÚÌ:Þè¼A=7sÊNóèHƨ΃“æ´Ýâµ›áv_ž—ËlžÓ•É"E"pý]3ëaý ¶¾_DÉWîleåwëÿŸösÓ‘² ¦¾"äóè4oÊÚåk3Å®{èZ¦æºêö mƒâšåî*yÙZ`¿@xç+X3¬à‹¾®¶ß“W¤íW‡ï÷Ñ÷µîû[2ókƒôÿäÿö \ý«ŸÖ€?Ž*â÷ì¿/ÌÇ=–¿‹àÓ±ü[ üÛKl‚þ{;¾!ïÔæþ‚{oÕèóòSb­‰ÁMÒfˆÀÌíá*Îæ³cæõ·PØÝET_º D 9¨ßàìˉ,kR,Hœ„y mì)<ë™0ší+•×ïï¤ nÞ‚T\0.­_9O,Ó“vÏÎÌà~8¸y ‰ÅåÌÚÝ·ãÇŸàÁðwKþwÀwçãóãñxüã?þC?õãóT59äÿcïmv-[–õ ø"s®U{#®èѰd‰W@ÉôÀ@áMxHH<r:¼„ݲ–´ü¦C |¯táîªZcdøÉÈc®ZUûçtT{Õ\sŽ9~2#¾ø~ÒñC²]:ÏÓÎСp6°¢çÑé&wžÃ,/DdŒóååÅÈ;VöE¥n5½™ÉøÏÇyÇam3‹ CZíýõõEDŽã|{{cæÇã¡Dooo¦0xyypk_ÿ꯬il­á}>ôÌD°‘fWšQÆcjGx’èDØÃG¨ðñ)ù5Y³:ÎbÄk~˜ùÏËË ‡_s²Û66ýf#à‚€òú¤ÚU|? µ¯ìª éF³„R‘aâ‰l/7­V®ÕW±j 2åŒÀ2†FdÂ|* 2D|þaó½C¬5î½g¥É­è–öŽn¢Ã‘}GΡpÇjÖÖ1Šîu³ ¡Mjw7/süMɦ$‘[•ÌÎnÍœº}Ól D#¤Ù‹¡FŒSÚŒ‡;@Ùß™ò‰ADebR‚‰·‚7Ü`s˜U–[³åJ$C‰ fñiÉÛiÁžrPç7Ðhă³6™˜ÅsÀÒ_àM)q¸ Qb[Ò!`Ñ!è1ê”Ò%wК®Î$¢ÃYâ 4‚’œh<”„†¢‰@ÔÀjsåÆhLAȈ)âp•T†Œ“¸ñ`ÈÐÖÑ:7öa†QõˆH¾?<”ÄZc§§%¿:ìzœ¬ÈáÎiŒ6ë~ÍÇ€ûƒ¸A„“¾7õO-LEÜ Cꧪžç°GÂ/ }ØñÔ§ÛÞŽLdp¼Í罿Ø{ëM†ßãh"ú˜ïqœÎl‰¬™’è±·J™ÑŠ@Ò—8‡mᢜB¨™…—j ”Øì“ëcÙcqßM_m½THn²¯k×%D¨ÍömY¶6°º5[Ppý ‚# *¼KƒJžþ‘ycHÇÐâI­ª-.eÜf†t•&fàS ÅV&š¦c•5ž‰ðï4ÁØH[5¿½ÀU~ËgûLjHuU˜bšV>·œz¹8¶´xrý Œº·Æ=ñ:Üüq¤*¯´h²‚D Öœ.Þ2G)¶s9¾É0-ZɯÏdûׂ»mͪ;Ë3[¡TÝ„mÄ]ýmèâT^—¶Éçvž/Å{°¦8ˆ™Ùånî=e3“±Â–zj«Aú V§uÔ$îrÏäm³Fªª3aÍv©q2»5˧JÞÆ\ ¥ÈaF†: ÿ:šáivˆy¨¸a1P™x,£HQÐû,Q·´˜ŒËfš´ÁåÛ`XTØH¿€YZoÆ,·“˺U*‰NÏú%AOK„r}¬l£áp‘2a¸¤Ð•‹SËu…ïÙ®^1]œ}™šÉó&SsÁYÓË07#±ÉõX唣ÃBWo‹8ÖÜÄ­”:zÃ/³½ þ ’ ±êÃ"õÞÀôkÇäZãŽW±­~×앜!eà!_{9ƒIÝ/Gäcꬱ”Ú ’2<³Ò3ÏŠ|£$#6¸¤+«]•¨ÓhDƒ\Ej"zçÛƒkÕôÁ¼€%Sˆ±)B+¤~÷zÏVÇîb¹*÷ƒ¶hßÕ’+¢Ö'9[òù=8ÄgNÞØ`‹ïFnU…@Ðk —ãÐKѬÁ’QŽP¯¹¾!ýÁ6©_û}Âw¹ÌïsÿéÏôÏoôTß¼ î®Æ3tŠé÷ üÐIYom}×LXñþ›\³^éNyc+…péoVGz’üD“PügÖ¡§‡[â}¥ƒ.mm›1‡ËWÎa¢Â­Î-MsñÑ`¸CuQ-¤µ¦ö¿Å&® i[wÁÜý’¡yµ˜ÙŨ‚çß QiY–/³Ñå~+q˜·÷Ò­‚&{eÌ¹æ¶æ)þ­¤û"ˆÏôÉ ý{ú—/o½³Îs|þüùËç/"Bôúvžæð¨ê=¤yÿœCp½w#ìÛ]`Öüô‚oî9s«0†Èœ÷÷çŸóçyDþ*ç8ŽÓ¨ççyÁù<ÏÏŸ?'®ýúújäcÿõÞ½¼¼¾¾¾ÒJ<´GÑ5Ýï³>ß*‚á® TxJ"`4|¬Î†d™ŒÑŒõKƒ~› ˆ˜ë"™$Â2…dây"™V?VDÇ1†Ø€Dd²Zk½÷¤§d~©ÑEÆY¢Ä7t²RJÅÍIÙõ-"xâJ³õÓPî–yþÃ"ªw3|.ç½·-rðxûÚ{3¨Ö@æwLnd‘Šco·ÕA¢lŸ5Æ e;QÖq+¼†g&UnóÉ76$‘þ†GPñnpцƥpù³‹¾Ã0–R6ëyqlãl]„¨0µXÍr !éÖ›V®A6¸/±­p£€ Φ‹Ta'©_†Z¬0a(+†{LGj;“þ€Iw˜)ûVý"@”N)½‹±oD…Û8I!`„ä OŸ ·˜'¡™c¸m™¹›ÄDdôÞOf9 &ænz"ˆ:@DCTeØqÛÐÑòµÖo•¬JÜzãþxèK‚¢A¨çÙš_ûÆfDÜ«îÛ½z·ÿè¡ÈÙxâÞ4rÑ»„o‹#ÜINâfúƒp뎘swjÝ–Îä F(1÷÷½úñƒˆ:7O±&?Q‘7Û«uzk–üûm™o‘8§>é{höÑ6³WŸ‰5–+ÏuC 78Š˜Ä=ø7-\n:H]9±‚M$(ÿÇtuUö;¾,wn“b ¸åH×r¼ˆ—j‡¬;ÜÛ•/vb³«·A Ò …&YUiM¸‰$¦Õ8¨2@V›FNO¢JʳOïÆ7_ôùaÍ<|d›ÔûõÌ«…^Ú²é QãÍɤÂ.„Œ£pýNgŸ Ø,–YKìÄ4ÕG´ÒÃSб x3ó¹e–I)'îT”ŒñÈÄæ‘Zü+Js‹¨˜_6åªb)GsaU=ÇH¡¡ùi‰[tK.+)|D4rÅ`f泄åÚ²ÖÜŸ±òâì2g=³8U+ \ÐÏT˜uÏ‹NfcÕepküòx¤2oæä·¦øVtw½ç\Ý›ÌU«7f1ƒb9)jnò˜îên­Ú\ûÈ„öh% Xk®¯óBÇåvvkeå¿“}m§w„ÒÁ ÜIqu¦bfqC@bB”{û€©ÛÜ'“aÉ¢ÑáUžØ´’éLÑ∜ée•d”‚´5¾.QR:¢þÌXcËÈ1µqúå­%‰»‰rÌÒ“Cz+¦j×DÛkU¹i êɯiõUçú+Ê¿ uŠ'áÍ ´hÍŒU×fá*Y[â²y')/hø ²µýEóæDPœ´®«Åâf‘Í¥s‚h¥Xô¶Åç!qú‘Š(iã–=;›çÜÚ³ 3­ÇçŽæµÅì"Âmã¸ùÖ×>ÙËMÛ ÙÄÅZ9o¢|©Ó èÉÍ]±"Á!²šÚ둺³©ÙÈNÕٌꃶÉâdžZûùYD\r;ïñOüÚi†Û‘Ed‹õm¶`3óÙ÷ã~…cÃ×d lýo“Ý‹¤àw|þÌÌ—n£­/_ß~ùå—ÓðgKµ>ÏCÂP`Œƒ¹|G E$c$YrŒÁn®=¾|ùÚW¬¹šÌ”†ŠÂOÙ̬C+jmRk”ì¼Ìj‹öÜ ûþéçŸ^_?ÅŒaAI*G#Kpƒwm/ùù矉è‘eeN¸B ¦*vUé Âbƒö)s¥ç¥zÏ,jL¿øâ.2 Q’þ{D{¯7w£³DmrÔ ´€´ä\_g-šïb ¦Ïµ«ôŠDƒâk&u2ƒžvÚ¯¯v/¦«Èü»³[@Ü›ÎUE¥VV„XÕä´M3IdséòñC‰å07ŸÍ¸Üók±Te޳6X½æ7FäΣô,“‚É͸Ñ'™ ©Óù5­7E,ë VÍße 4%’!~ùn¬>³¿c—'sèþÕ¡H_LJî’¶'AÕ‡BNÉ0O˜EÑ+®>¡‰Cî7y<®UdÓ˜ã8„T‡d£ÈAo×t¡I£O*KŽE€õZB˜{›§»0¨0Ó~c®¢’š–äì͉2жY§PDV¯óŠG®²É¾ì®¦¥7æÞ÷¶=¿Ô§&T• ‚€&Z²^áu¸ùòç2 kG£¨kÉs®¼†GMB.^aTÒ¶ÝØ¬K":­¹Ç«­×JÀ%x¨³êådsa½”uÄöQ>§{[åGº2EM’\uØ&t1l™Tñ5À6©åˆ^ÉÚ UÙ¬™PvV 6%ÚÈ•Ë4q®wܲ͢"VHúÏŠˆy™«9õ ËB‘¦­±9ÀEÆ\,æ“É•Âi9 ¬cï,ý' °âËáE†ðÜ÷)]¤DX›Qä¶ó“×`æ`£D/è2«eyÁ*¹mäYý¦&`±0G¥½–X‡ê_e´“ļç‘m¨¾Ã#_¡¥›Q-ÑÍw†!ÛWl~–7‹DîÕm'›æv:%ß^W8~©EW¦LÞ?ßæ߈«ú”˜úä=õ92ýc¤þ›„ó÷äߨ¿«6ø-ùßopOnuÍ·Áz|àK}迼¿ oºŒvÃ3žÜ Oîà¢ràú/—™,mTü÷¾]bèà™Á4ȤþÞEufÁû!\öydÎgR± 1ìé§÷nvFû8!Ö.s,ÉDÊ”Ž‰³@ƒüo[[› ¢ˆò)ñ<[i%臑©~Leïñâ4êZ«2‹ÙÑ]êÌÁWÇÜêF?ÇÒx2 ›#ÐÍLäÂð×å^Rìo‰Ë‡èÕ(ëËþ€·ã|3Ýöޝ_߯ÇÙ{³œ'€þxD}-Z[ëÌMUÎs˜Å —ÉAîRCÐó<óã___™(¶û²Š¨KÐ…TdÈ\$Â.c$(“´z5•±Å9á N0èåååñx1RÍõµ~¸XÛ¸®R úób@ͬÍ%Þ!|0¿!&K P1®¬:2U·#rQš¡œ:ãæ‘F„fNYâ¬~‚ª»YAÉììV`"´&Ãf*£·F,éåD îÜÍ-ê”1ÔXðƒˆI­w 5 1ÙKrïÈŒó "'=”À­õÇ«ŒÃü•ãFð=d›ºM/))c ˜wàHç‘Y뜮4í”ÑÍlU÷•grC*¡b÷«!DRÓ}pÝçbGCõüZ°ÈTz$¬9U;!:ZkÌMÄf·)`&÷r0·ö ÜÆ.»ñ=N" a ’Xzº„S I™Û·Ï–ÎÅåAîg 1Ö}±ŽVxÉVš¡¸uw°]q°OÔÅRõ:,Àëñ0xШkÚˆ`k ÃF}Å•³P;ÌøBLXàkµy²&AføàÆœ6¤ª·•Ç=OKøø»Ó—"æ5®  …a°uàQ ªÙ6ʺºÁ >r[ò_{ïpóî®ëÎÞšgð´3V¨jkçIioÍèàõÝ(mUZ¥Ü–]£ØÙI<ë369N¸_gDÆ¥s÷¬ÙÑ;"I šäb6—øåÞÎ@$bôvÓÙ¤Ë tÖœ`nmñp€Ç (€L ®x·“Kc£_nìâ¥3ÃroGâþŸ4ÓD©®3§m…z_¹Ž‰§NМ´©;(':¬zt@Ì S6JÌh+ÛdÈáRÉû^µ˜^]LUVþCªÆ_Î;ÀüRJ:À4J†^SV2Mƒ85’<¦©žR)ÙÂkgžišą̈u•[™J äºû }ºHŒµ³ËS6Ì;äwe%GàmE#Ÿ/æ§!¨ÙŸZ¦N$óöÙshiµ™Ú…ò¼ÅˆˆÊ‚Qαiùjö2¢i©tûfê/å¬næ«ïÙÔ‹£÷¬©.P»“O<ÝU¶E+¨‘š'TÐtºíÉ1—¢†Ú³Tp6ÄšÌl¾”ñµ)©ÈVÒ"f5õRÑôz QTŒóIsê¹õ¹W§¦„q«Þj?KtÀÃo‘n,íJùL«ØF*jÆ ›7cÂýnž˜DrOüJ¦ALk\Qò*P"ˆ<,bqY„œ’7f³B]pÒ%å{’S‡”üsÊ*³£Å}ñžŽb(ŽiÜJ‹ÝÙY>võRÑY£¶uÊ ìÎ šVÅæò¢±˜áJ…ó¾KHž°¥Ÿ'OŸ¬Ý/gÞö¡PÂ…t¿\¦=x‰ÛÊ9 6âè4‹ú8-ýÏÎxçVzõñ£Úù]>µÕçþôã¯yFö¯׌Å(Fßæõ–´ÿ=øå;a¾O–ó°ýN¨tOý}ÎÎÇu@¦DÏì~®£tçV+‚-|xæx7R7ϲhÔ jõ—Z‰ °]Œ£'_ƒ-Üx©õDÔ0¦‘›9dÈ0´*¿OÃ!¥Ê=IKŸ-êÖy’CŒåþM³Ÿ9P)‚,§ú±sð5òÕ¡Uð?Å÷á ÷º ªóY~ÇŠjÉA¾ `§õï÷øu  wQÀ¿Ï`Õñöõ«¨¶Ö^^/Æ8Ýr}oÇ3qªèëËëãñ‘Ag¦MEëÛTµµp\QÚÜíÕ¿ù›_˜-~ñúªªŸ?6oGC¬ícŒqJI36ÀØŽ†š9GÒþ^î:U2ÛkéEÈžj½9 Ñ?üòË/tKúð¤Eue½÷§/myqÔM˜ÍBÞÞÞÆöÿ©ÀŠ&dz‡ãxk­Û{¾¼¼úŸöJÌ>6±2`ŒóíxÓ¢…Mב 7.Ð O?Y›¨ZW|ÃpÍÔBÍãКÏlÇ©AàŠ·eݬëÉY_£„ÈÊ´©*ÐÐó@Ã@ŠW‰ú859I¶Ecm%1Šy5Ï4%Ê)C†¸’ 1É@Zp{¬›)ÐA¬¨¶'ÀOf= npoëµÍ3Ù1RxTM|©ÐƒéëŒöó­À¨X4djÜAç  áƒc—aç®9ÄÙ%34ÌÆ¢–‰Ëh‘êª0ʘr†×¸¯BÜzh€#?L0$|ÆeŒ¡Í≘ÃMbb[Iß!'—ûçXD¥‚…˜U­u0‹‰¢ÈCN3R­=¬"`7Œ1f2ŸŸ1)EÞÇÚÉn&Ê=O ZîÀH#}¢r=Ï`±’g¨:Ü—wúfW§Ö:Ó¢…ÝD¦¡Bx „ð{wóôŸvtnm<¬9Î[;iŒÖ˜¸‘’r )7Z¢Ô#:Z'¿hˆÐÛW!¨ê~³±Vr—¾æùäé‚\P=lGI”Н=v|cßcm¢`ëm†×^«ÿD wì­ ¯Ló4Êp#ßz¼½…Z+º±Úû"±‰Tz¦˜ˆQ¬¦þÛˆœêæiM/æ'ã<“x>5þÅ˜Ž‹°´9ãr¦!4×;•Hž8ƒ2}C8&(K(e¾bˆ4vŠgšé§µ÷4Ä·7'«ùÔ|VN [»>8™¿ Ž1 7ÄÀé¢În~åLᤌˆt¨aƒ“è^ä¸.Î\Qì49š#ð­ÖkQ—X›çîi ‹¡óT¢ 0öt,œ¿ˆ(oyÒ®Î0©¢“’!Lå©;²ù§s‘JÄSÓå_Ò$p}v,LÕéöV½Q™1äÃb#3TGí¼m̆2r´ØU%7“J›ËD_ØRŽV"ædîÛm{uÃl#õ!ž2å¥O‡ô ÛˆÖæŠ8%³O ;â^§9óÌJ­÷‰³˜‘—û|ÂØË½ãÊí2oØ–‚Ëq%µ€wst<#ŸNZåŠWG6"1Ám:]üÑ jøàä)g”«_©Þ,[žŠSÙmãž•Öìí©$Ý乜ÆGh×€w“X©Luš®Nè·r·e_‚²kB/ê ¡& d9=©*XxÏ1Ø·Æî}lž%ŠŽ«5ÖFš2VÈ»ÞâULæÖ|„´ò×bhŸsŽŸMynY³ò2O!¢j™(ø¢ä™[ä§¢Ž{·ÎhÁX‹;Sݨ®¦"+ЯA^\nûU€ë&Xá°*$ìo±óòÅù"Mð©ZâøÁ'ôu·rÎÅê6£§úúóáS”å 'ðÎg´xÙy"F2!J¨âJªb…yÛO…ɪAIúºéóö(§¢ºÃ=s_©ÕÛG(äáÑ´º­0•®NRIfòºûÇÃκüwÖäykXž,Q©1°fŒ&%& êÔm³×È^Æê[ÇÄ–úBÑ­8—rQ¶€`|ܬLšg~~M-hD\èªe ïà¥é]ÙÜc">Ý|ë“þœY¾TÊÑôö$üŠP,»•½›¨ðj’î3¹¸º¬é¬—‘Mó’]O%"k¹ì×­y& H#V*EJÐbÖèµ\ô£âD(™Åäþs¥?@ªU=»,}Z2hK´ï$;©ºå1ùêçÁªf¾´pòëjgM.¦=&JB‘$©¥ˆXê>>«¤{ÞÿºÞÀëËsú ÂÓ¸%ë;U®ˆW®|ÞZ¥Î/¢¢zPº¦àVuN™£Z6m㈲†=Vñž·¬˜u„ªƒfÂÆù˜%º;£xÎe½ùÏg 2p¥më¯ ¯ÿab‚ߟÿ{fè7¾Þ¬ˆçÔL¿5IÀ]´Ä;¿YàB ÖL^ýMÎ…êbùfÇåÞ~âì?ßet÷,' Î±¾¹¢üø*+xö¸ùÞ´:£,¿…]¤€êGwrè¥{ ¦éÈÒAý°yIÄ»sì´hÿW´æVþ3L¸MY)t܇M½f8T× `?s¡áÔâÅ-¥qQˆ* ŽaQeAó­k(®~ó">»æ÷ê’Änÿ7«:î3{õ‰<Ϥ9tŠIo­™ÁqT·R©ª–Ên£gà1ȈëÔtè1¾Š!Ab»DÔZcÇx}}mG‹tMs¡IÛœM²í ,ؼj ÿ2ß¡Ykdâü1Mƒ½‰Y ÌÁÜ`È 2t>ÌŽÍ1óËËËËË«Š|þòåF•p)Ŭ÷_"šW­yœ½ n–žªUí."z'€Gï†ã_ŽŠf»üß(¹9²m–Þjh¯ß¶cE«£ \¿”ýçÛq´Xc·Á°ÛÄGªæÆº)ñv-œŸ˜>íTñ:,Ÿ—u½` aWŸtš[ü¤ÈP¼—Œz}öÈÌd íUBö¾£]ó ÛTìA°×pñÅ.ø¾–y!mC‹Í«ºf®n˜É 7ÛñÆId†¢½ø<ΚFÛÍO?®‹—õJÛ€¤úÔçeòGiÌãiUDP‘A0¸…ºkÿ7ò*ÃC߯'¡>­½Û·Öa5è(‡<ù•nïá¨Ü3¦ŒLuÒ3¨ÆOäwFMè>–µùu«ãy”¡©q8œªR¾£É¹®#Ÿ$U˜C%óÕ4yY¤MÎ dµkk­Š Œˆ”fŽ®6²? ‹&•oâ—oDþ5[dVËò‹<§DcŒ¯çy§}âãñèpŒóãf Rú Å"å'_Í„GÙ‘’kí¨6}Óš’JÄ÷-ͼqK ;é)^ƒ“c+ËðX·CfÞnúfïADÇŒ™êÛ9HèŠhuÊ(\¯‹ÿEݰ•РRMVsgqŸú² Ìí)Ô±æôó†Œ`½I9šðéÌÆ€”Gd83ˆË÷©Ç/Å¡ö—å²^°=;»œPgjz) VGÆ­ eÒ˜tó"iHnuÈAÚ4¬v º# ¶‹Ž¹êš»$2 ~N4dJQ(\ mºb3_šÆBV RrPLÈåÂ;ì°ÿ¤±T¢Àj[—Ïy†™ïTåÃPµfÆßc a?3Úó™Ò_$"Nç TE#Úñ0¥¥h,'áªø»pfL¬–§·£ T6.Uv~ÒV®è;4á9eYb?V´R¯Ný‹@M×)×2ã]U‚¾‡vyç;ÐÜ¿Í𻿽~§×•þÍaÂÇdÞ}Y½³P×Â2ñ|Uø±û±DhÅ4™‰ål³Ã¿;q“㻀§§iص0–¼˜Ÿb2Þüã7§<ìö29˜Ó¸zß6Âé9¡†XJp8P¬rÆ”Ót$6W8õ>ÆÌ¿dXÑ\ïfœ®æ"¹M>|·žWLÓò(Ñ:.&ùJ×ìe]Ò'ŠÞâƒs6ž¡Ïºh JÏ5{Åñ7âÿNÿˆÁ@·ÊdŒýE•j£Ìgáñ%pŸ”a³7°C…sÿcQT3þ4ÐVC>†0…FÌ ÈPuó>¸9y&2ä˜Æ (q·wf0bà8òp'wOO`ÐIÄ"2Ln¬ å…¤ÒuUƒY tºKº#[áø`ÑÖÿ ̾†¸5ãx#(/fBÌî5ˆ? •1äS³mX©p©¹UMÇd‹H¡²âYç•-èÒW›+W„d,ì¶Ö\d2õqäW‰;âföq,³þW ™”¡n¯¯íƒr'úƒ”, Ø/n„L«sU0£w§£ÄàÖþ0=nƒ[;Ïó8O‹®h[kÄMd6_n% ,E˜™÷<ˆPÞØåyê,`S ¡â),ž‚]Û†ÍǦb1·¾d£ÄÃÔ¥)¹oRhb[Lzú¥­®ÉVN9—$ÆŒð[ fµDw:ÏST˜ØƒqÆ0-¯'Ü­o ¡ÃMÃlÌ' ŠjávΑI¡I¢ˆå±bO°èéµ²6ÐßFW¼»èNæ{šsH`g¶Ï6cÛ €2Ò6u:Ø´‚/ ¬Sý£ÂÖ`s€uÝC—Aή¬I¿ùÓs䯻€µàòµdŒüº%êÙý£.@ù"PCQrxô6 ÏŠd+¹Í*L„ ªDDÇyl ‰ô¢Kšt]®fDSOT]ß¶EõJÜ®šM¹+¶§†ÆhJ(1)ö¶xM%©î³Ÿjú´áʼnnç .,‰&Ñ"Í5ßœ$/SfXÕ+ä™ÞâÓÙ)€[·ïð?Þ×ÌzV·´’kLItFIA*TÄTÅÖKYf‰øóî°¼.VÕcŠ4FÈ´4‰‰_Ì4%?±ˆP("[NBŽAR!¤¤5h¹ |2$ah»f x¸býó)‹/ïä|0‘%d ÚÙrÔï’á|{«ó¡ÛÄæ g¶Zx-“ÈpëÐzr úÏ©•Þ¡Ðúnu }˜¨bѹa…¢n ö»)Èò—'6-Z’«Ü·6å [Jï>;)Lí5Ï8δ¯ï±Ïoc.Xîoéó·ëþn¿÷c(á·~kæk×ñæ}Rt¹ü?zøÀ„ïŒÍ¶§ Wt¾¬ÿTí:Öµ] ÷.ÿó•kârúüNW\ànx°Õ[ŽB=©W5D ¾Ì€T"wrFaàú­ o7‰y_Û©FPê ýHÙ@É‚n©žZ;‚ÊéW§¡æ$vñÿ!Ï@ÂréÞ£Eã zšp½ÁtiMiÞYic0,·Áw<š·¦n¿ãBÚ¬€â]š03«[ŒlŽÞûËëkk{‡º×m@½?„½ž Â :¤!ýóçÏáGÁÖJîoTîOŸ>¥%½UöÇ£÷3‹Ì¿MA?[qRCa²€Kî|âæX/ ’µdooGöãn_*¿Ä˜*íñx0³¨~b¦×׬–272ìŒ&ørÇ×·¯9=—’A–”®Êô·óvžöéh!Ï·7é2Äã:¸wžF a@Á*bgÆL–—>ÄòñZ3¦ê8ŽHin[Qîg ¦Ç¿z'…¾]b—ó‹¼¼¼¸%ñ4¡–N!}¨íœØïÖ“Iª®Ac #TÏÜ¥-GˆZ4ÀƾÎë G¯%l”g=ƒ*$ ˜”i3Í©@|4ØÈôò„™í®z “ãâ¶Ô¨ièŸ':}(:Óæ8 k$J.˰V!ŽÍŠ"…ÓÓ7-OœéïÞýFê7Í8̳¿1ÔÜ ØÔ "ƒT †Ì;OÜRH­É!%j"Î×1í0ÂóÙl%îçs˜{œÀï8n ± “¦Ñ†/2øáÆ$Jh¦ª ³ˆC E¢$ÑâMc#™fâÆ*dæZ޹”ÞÅïâò|s GÜì&7n˜#û éÈ‘Rb`IݳuƒÃÓÜ•7æû@ÌÞs¸Ý+¸ÑÐtž=3’ŠÚˆ©5>ŽCJCÅü <ó8áÎ!aßó"pßrQe;ãc¹Ý}²ßMæED€ÜZKµ¸žgë¾ïúhÁÓÜ6Æx«ÕÖ1@õïe`®F‚¢¹S9ÀA3†t"àEpm ù8^€×II_BóÖþ“–r§f¬#ºÄo®ÉL„Îð›-‹ÞYDКf¹UÂ6­·Íê´˜ZdÌò(á‡S á[­j™‹dMb!þV®?›ð«gÛ™œ¥±Åq1é±Û%?kº0L#êë˜!5Wëð™agÈw° ŽàÞþΔ/f^“Ä`ÞÁc ¬ép¢*chd~:»°LõÒiP œ‰‘ŠÅS4Çý.òºA•­qNþfÃU–ë``Ô`èciˆýg–¥Þ¨Åú·˜ÐtÕoì©Y’A½á¡lZÞ¹GÄ3D"¨Ìv´›€N¬ªÌÜ3Ü\hHý “ebÔZ&1Ñ&'šïÏÎÒQ.9Såp _§;õ¥ á#),„5kë2YÀ‡Áî<Ö Ù<´òntáÃNÂ)6òîŽÿ“¯OS°Z´°t1•R7ÇóÞ @ï¾~þN˜Yç‚õÿ#ûßdòÿVŠ€_;`øö…ÕËT€.Z­÷ý¯V¼7«šk+>69XÔºíl<¶!î'\ßzá¢ë~éjÞžYlú›Ü§=Nü¾,‹£ô>ùP!æùªDð´ DÐéϘò³iŽ“SØø_Ø3.N€ûý*êî«ÏN É /eÑuÕ ˜h`²iC2•ç†cQµX‹¹»RÕØJ\Há‘w¿¡«öår•õ©r뉘F»Áއє™&^Gë Ȱ¿qïÌüèÍ:a¬%šº§ˆ #[ó<ÏÓíEœklÁtÒZgæÏŸ¿XÖnkmˆÑÖZë½ z#§lmhœuýéE°ÑCì–¯ôâöL(¾Žù@r8è‚Ùo¬ÀP¼Ñ• WT¸Äþ˜WÏÄ¢Q·‘Ƥ&y £P}ýúÕ$ÿ?ýôS´~޶Œ1Íð[¹Ã}®–·0˜sÎÊ ²nYDI?,\NšÊîÎ*©šÔ] I3‰–]Ëá™> U?úd'íÓ§O)ž˜i€¥/0…§ÅÐe‰/ÎP¸ÖÒöZ7s —yÒ2+P^ÞÕ†J¸´_It„-,D…ÄÓ¹<˜–s¤Éi¦°—¨X=È +¹ÿ1…,kƤøªÆžzÛÀ¦¤R¨Ï‚¤;êt §iË’YÚ˲Š(qÿlꆱ˜g¾RF\4@i a´ÞL9@€'­¢ÐSæÆM[“aî=¬6z²dN‘[ƒYˆÐ 0†{ï+ØÍ0¡7ƒÄÝÌ7ÏSÜе1ïc,ÃQBn "ûO»òžR؈¸ÉCÆ9BS1»54hkL3‚ÏP¤´ä†ÇA3;é*:dQ5Ö¥áÝ>Çz¼¤³5­ÕVHÅrRI>‚·/”^º ’AýA"Ô:ŒB[rgâ€ÇD7·^W¿ÛWýª819W^Ü“oúÉ´ÆÌ½µîӽŭÌ&(E9œn+g$‡Üª¨5 ŸýÝn"Í q^ 1EûšÉ®å^uŸâd®†æ“¹YEœk˜k.‰f¥fÊ$“K^¯Ý(FµbHBŠ¡Mžm 1nžqL°Qhµg±0 (ÙBpAñÌ7¦€nù8d’!†Ž|nüÉ"øä@©ÄWîlÍŒ#J­¡)Â¶Ò € 1´·jqÌÿúÄmÆS¶×iÇ&®Ÿ¾ˆ*iÖ4Çã1Œ›™Ìè“żL¤Ô ÈDaõƒåÀÂöQKâõ*ˆÍ‡—0æ™&M±Ž©¸­åÌÑ+h­Î28Áï(#:Ù’«ÅLßFAÌ©z´ã¼ôØ’{I©&šT S·ÍŽêD-ÇëË}žW„•«Žª^‘ÂJi ‘Œ8IgŽ %MWt "RªnTiçÝ[ï½S!•qooo›)S™.X”·gl1sWü,olÓÜø½M¤‘³UMÒ®½›^S±ïM"p!Gï­_Ú ùƒcµhÔâJK’Y™nÊ–‹ ¥gI!O2k:MÍqݤùWª¾ø›§ƒ #æ“Ë&[\Ü–­ ðó÷%õW–§  _%íÖX& S@ì:zæÜe0ËÓ8çP-kwwD`ÈfËP\¡¡ŠÆ6¨éÀÛqZSu CЊQŒ“XÓÂGHY‚–¤œî¾@*•̦E‹È+cל¢fV¯ˆšÍÊpK¤ (ÜwÙ鹤dW2àSK80ì«9›i앳B…¨iBv  Ÿr@hŒ0%2õ͉.jnfŠ!*¤î%LFd.I`&µ´Uj 1Ž{D›*1ëKkî $*rœCŒgêI/*È,5œàÐLkÔªÂ8HU[qÈ=ΰ`vC7ö𔦩8ýJèl6k´þMEfsÊyåìð¸)‰’ ·fN·Üzž(I§³ó!ßtÎ~‰_#Xm[£ã@ôUzžÇyØb•~Ót¶1Fo ~Tjqƒ®L2Î0=kœ:|%fpŽ˜,‚«°¯üèݦ1Ç.90p( ž†J\ÍYs#£äÉj¸\ü¾&Ú¢´^[*ûûÂ/Ûqÿ-Zs¦¾/¿KÕÉa+èÓ*Ü&¸¹xÎ …Ûî/6; Ö´âõ¡¦ï &§‹¾L´ï¨‡âd±°EãºDHÅRÖ‘ÌTùm`[¹”øú[ôߎ3ÎãäˆÁ%žk ò&¿¦TÓ .r=* @ð‰Ô‹ Z¿Nx*’§4g$ "iÄÛðÚÆ€Õg[ã”vó­qø@È54h¢Š¹mÜùG•¡™ˆÓ“t‹YJjÓò=·=:A%gžá‰Ï4Sj}>äqSÆœÈë#Ë1MZ71±Ç¦¢ô¿ê¶ÞZo™óœ§zÃÜÃE¼ÄEá¬gûÝÖZ«%ØFigŸ;d¨,D-ÏöŒQ„}S‹áU"ãYJ¶£ ­.ž§êîð‘aÀ­Bÿ©ÒHD˜fջܢõþ¯Ç`ÇÙC®bU»KÞ¤áh 0ÏÞ'ÅL9XÁ G+N9=ÞH¬¡\ÒS€E‘‡­2ŽqŠjï#Êû1[ÔÕ(É ÕYΞ‚Ñ|ë&·Yèluòåy¹‹S“…R”k¬srƒe?J¿AÕcHhž¢z7>ÓÜó\mã3š>¥ŽdÚèç0¶aþÞ*¹›.:qÌžiq©óçöQZƒ|Ìxw?@p²q¥è¼5ÍxyV,ó¸Üy/~Ínmõ<‰ïö>q¾|öA6ˆ@;Sñ®Ù†¸A M*™Î'Iõ8ÇÍ̾:Ç[ñ—³gCKMæaýº<« ý{ M¸™âÏ×'aÚôîXî·ôÞÌ:;Ìã8­—x<NÌPþ8’æ×~ŒÌæ6>Û-%Ua0wº˜½ Y %z·¡5U±ÛDI½<“ÑjÖjÕ¼²t‡Š9¼X¿§K>Ó}“í”éˆÉÇt7"óa`£òq¸:Xo–¿ÈDÇqØ;|ýúõÃhìJ\ã¿(l”þ×ܼºL$6±ÕXÙ|ºúA k†"ü4J+1wpÉXÄ‘Hb&ÝYô.昆…U»m\8¶­5 rè½[ºƒ¥8ø ®>qC¤š“V΀ÇÄ9ƒ½¸åN&/ï>p†m¸Ø’ãeUâ¸×L j=¦y|»±¾˜%Qwúšª±†¿Å§À¾pò¥ I§ß~˜´ Mûñh_Ça- G»*50ÃQð™]Žaò jÊD$¤P4ƒñ ÒQjPGøŒ f¿;ˆ˜„¸u{°ì7€z‰ž"ä1t9(4p°ÏD¤*Äí].úðf›Ì’È0!¶1të̓%eŽš˜]¬ ªægæþn}g›æ9Æ91·À椑Rîý¥SµáThÂæÞT©Úöã€D’¤8Â!'FÊ5‚ Ð"%= 3ËDh\œ`ÑÄþέ5À ,I´+µ,ãË×bF,Æ Ün’ ¨œöÉ#˜éG÷›¶<$§vð‘r;DÜRIôñèã”à ªE…ƒ™ˆ‰¡ç²}¸uZ‘ó8‡èá@¹¶ÖÀ-Å¡ýsËêQ*U—UM0w݇kDHL j 0Uå ü ê~Re[Î4Ùtu²ÛoòË Ç¥.]P€IÛŸ˜¬&­?ç©F`Wž!bbêõÅBLv°ŽÜDig'•[ßaCö·µ4ý†•wÏÙ(-ô±+Mâdë·òéfcÏlŠ«§û ÞËÚRÎ>ŸÔø­i/¯«ˆÉÝiÅÔNQ»5X4ÛT7ý-Ä~VØCFðŒ#¡ñYl-›RÖˆ…Kî9™ÅX*¬·†Õ!nj·NG\h²e2Ç>˜¬*¹iåZÈžÖy»rz׏鄯*Á˜ÌZ‚%|2lÌÆW¶f²—ÅëæËGJÍZZÝU/ }æ…ˆê~jå™ÑZOÑŒí­¬mªŽùÉüjtã&T*¥z·Øíļ˜U¤ø¶ŒÙ†Ÿg7«y±@º‹8CEÏqÚ×cÒ<Í'óÞæy~ÄîýZ UtæìH=½#têØrëÄúM[dE°õC}Eäˆb\žTÕ<\€îxÂÕ©(X¤¢Îèðw^RRçé-ßݼËÒ6³b­Á¨Ðx(kÙë]VÛô!KôÅêDˆÌYIE EýG•&¿™€Õ9³½`wæ˜LˆÐøÝZè´X¡ê 0]D–p|3¿¢êÛ3²Ô]AóMVxSºÜÚÙëE,ßAtÊEômª7‰Õ®lÚ þ¼uþYC—ô:|§B{ò/Ï ÌêAH%Œâû è—Ð%2§®cuK¹ØU,õÿå?ú{ƒô¿3 øÙÛß±›¿ý•ñ‘§à# þûî8÷7ýJM¯©èñøÏˆwÀbÍë¿>Oºý<]ø1±àofDäÕž"€'W'"j3‰“5ö>ŽôãPY]jðŠ…^"NNÉ0ËÝR\ÍÔ¶VÉÜ#ÉX ªRRöU ª~ÚeuØë1v‹F@ç ¥Y$–Ûo&ë„ÚIi׃T£g¿Î=±©a’ ˆ"Ô;L¹XH?B½›FÝ^ÐëåþƒVÅÞ{#j½÷lðŽ·ã8GÿUUõ8Îôï Îiª&çÍ;wz€ˆ3LXD,*à Ýè0UTËÜÖótžÆ[C¥ëÀß*2&#¹~ȸª ÙÆóßzw¯jŒƒÒóYÖbÖš> ‚&idjK™ÝB7 öó<¹µlGiíÊ™•ÚO«ÉCí±“)&2ÈY×Ⱥm%Í'x²È0%“'êJá¿Éü­è½›ÞbsÞß…Ùù¹–°///ÇE4X·Æ³2HU¯ŠHf à²nfÈØùö¦DÖ½©4 xëU„1­3‚»·ÇèÑÜÜÇ<\~ÁÆîtÞ±Ü2†-Cc ›T‰Èëë' ¿ã€Ñ>u[ÕP–¸Ptb" TM3ƒ„¹sUÂ3•¬AŸˆFnXî±ÃS8&°‰’´ƒ==€Zkª}èðέ1ÎA$ÄèÞe¡W…|Qk*ƒÁô`JÂùHÉuóiƒÎªŠÆÔ˜TXÄ&fC•„„Þy˜o5qs¿#ü͘ÜudâìlhnÄât9„9’:ÈÊOIÄP_SE¡¢*4HÅl èßùGÿÕ2åÖ ÉçC5Ím’û#–¤×»žÿâDïd¸Fé´^¸íðAÒ©Ì”’)˜¿ÁÆ´æó"•¸Î!&DDëhÔ:EžGö§1‚5°{ôÅê1§¹S:6»ÝÊc]tºŠV_~{s‰?¨Ï„L¹GOÜÆ« ˜¸ƒ ($‘MNél m°qÂ0Ä…k§õpL_‚ÆyR„ù˜*RâàB#6燰,»(iÆ \¦SG5Æ0Ï]b§ýn®ê%VaqfO»Ä­‘Sõ-` ¶ªåRJÙFÚBTì#f'è¿áu<Çl>±~GCÊúŠ™#®ÄM¬³•F7¹pŒÎ}aÜÅeopF^k+vR5¥LµT} ÒìE†ÇaÅ$3¿¾¾¶Æ`Îo´yòÌ4…¨è2 ÓtçDÓŽJlö*+Õ W§ˆ«+Ëö+ºÚaO—üøïØh‰È R,àݯJ s¾êû”÷ÒU“P¶ˆèðkaæ6VfñDc#⻺Û××p„8¸Ž-¥<€ñåGŠWê]‘ƒÍÚW®:¶j"'*U‘`SÉ$à‹Ê¤1ŠÖ<€ _›eô¦2+]O®›Ò¨±Š¸ÔÈ)ë<#¢P&«øväìn‡Z§½Z7ñ9´ÛF‰¶•»NJx}Å—(ƒ¹+—WÛ’¹ôw3Y”@6Åt ˆ’÷lr©iŽ‹B„ ¼hüt" 1P6íNQö«S蜓Bz¸K™­›õ»^—Ü2T‚Y¬WÕÑd}¡ôÒÊô×[’镈Fzî.Xõ[\¿mýOf 7“ƒý»ßûáë-°ÿëÜ¢I½å…õ¯ïcÀ{(å& ù0Oü#²¼C?¿N ôN °?Å[ ò«Ÿ<fï½Ãk4«!Óû^üg†ûÝÿ«ü?i’‚~Ø€>ƒ9?|»^eúÍËŠ}ÒßÎ Ê´€.I¼(^|§Og‘Ø]c–ôÞq(‹ttÆ4ð™ÖÿsÕ;–½ƒëw.˜2sÎ$Òg?O©’!x¼Š ¬y6ÔôŸçCIØÒ/U©ä #Ì“u~£X*ìÊú‘›zˆãÕ°¯™G]‰€Š;}& Æ„d\ü–ötQ¢JUàöFžh¥| D*³ IDAT|æÔåÝùî × €×/ÕFïýõÓkèï„ÍlÚš]üNDÓ‡”×Y³Ð¢ Õ!c¨´œ±ÓBWªx%øÌL!Õ~ £UqœÉlÁû¨"ÜZ‹粑jïÎg<ÇIXuÈ¢Ú˜AhÍ6”†˜I¹HL@5æQ¼oôÀáÖº–ÀÀY´ ©˜~ÂFÞ#‰P Á¿*ñ«˜×Ò «Z9_ÑÁ˜Þ)ó<$þ’%”Í{ƆðÚAÚXÈTê–€w{¹ó¢Ø×GQŠRrZÏÌýñ8Çøúå‹1§Ä¿\Ís .úñêùk°'R­™ü´€Ôm‹„"l¤.Ü¥‚¤TðʳJHýl;Ù^ä „” N 531kÿ˜™ÞÞ¾âx3èÓë'5…O1•˜,­"ö3…’Øz(DLüP“è !à“âOçâèÀPs°Ÿ‰”î¡Æ­¹Ǽ'ly5™{WâF°!ˆÑ¼«!R¦¡ÌP#ì w¶sBDŒÖ¹õ&çPPD܋ιIÜð" V^Ã;{ff«C•N±ý±!uÛáÿù·þáŽÖgÖWx¡$ùJS¦§u[DAüÖeԃŠ›¶î¦ÐøÀZüí%þOVÓõÿø¿ümß°}ì‡ò/ÿg"ÒqfhªÑÞæ“‹×£nQ'ì!+A/AÌP¸9“¦‰þ™ÑJ‚œLÎàpÌQ-k=wCU.sk- ŒóõÆwè'”)ä3sE3ïºÉ¿Cíä§ÖÍ0 ;¦QUhfß(¬¯Pì cœ;ù6o®òäárZ‚¡z¥6ßFwN­F8·ÏµÕ¡Ùù_SymÁø€Ék¹Ê|Ü&Ü[´@.ñ-¸Ài˜£ãsË^Ü¢hóólP_lª-ÁÏþø…”Z8ºë7Á(YncaX×/hsLv²û‹L‘Ý¸RGsÜä9N}žTãL”9½¤‹ˆí¶†à1!@u^¾~ÜrMW õ @ßÀÊ1Æ(Dá`{ŠÐ•Ê 0D„74÷'ÝÈ%„…9þlV‘ ‰E¾ÀlaÍÌ-;uy+̼-V€¨–œmÄH&xáÅÔZ{<Õ”¼FnL©õû¯sN,»*6>{öÝk¾ÎA—góÌBhɦÚlOso-½U4ñJì—`…g ¶Û) ×gX¡Ý.ænʉ±ªJØÐ×g}v&‰§®&Ý@5[kÍHÉV"gÑ 1 QO®bA°¥&d[&u³Í™ âàa~žJ%³:®‘6˜¸hÔjQbT•ÅiœŠâ#X86£JЦºPé4-¦_'+›/Púõ»t p”s04ÅR6UfØx9x…j‘èwáúÔžQDÒ-áa™³ð÷ÿ‹ÿöÅÛ¬ê`Kk¤íjÅ“œ…Ô^f—Þÿ¤Þr÷>å µ.©åØ|Útùõú‘›Ÿ‡êoÙ£¶¯ RZ³ùEþÿåŸ=]KŸ Äß¡Çocé¼ïc Øü†O.=¨ þ øBµ}‡CŸÏ\Ü*ç®ýÄ6lMdC¿Ã þr=Güko>Gq9í×3±9ÌëõQÐu¸‚Ñ?#ôÿ÷xý·èî¿ÍŸ+…ù7>òßèËá)Rz³¼nƒ'|äFºYp€»QÔz]-zæÓ¹å]ˆ¯®£ßBŸÂB‡EÏg6¤ÞÓ¿rä«ó¾ÚdÜßÍ@‘Wn( ݾtâ$Þ_Wî¿zÖoŒ¬qN´[ïÛÌ.¨œ¬zH¸^]Gê]MQ#†K ½¹þ¸¸@œêŠ+b³~óXúʨ×û-Žs@ ·3]Çá:¿×49x6ÍÄ»a¿;U´›–Úâ^ ÔàÞ;zkÄÊÖ(žç)ÑïËíM¯Fd¤1®y%{m“ÌffD*ÂìmƒÅ½šŒÜìÿö`v‚Ý¡|‡Õ-«´ýBôL\"ç]”Ø¡êÁn;³£Ìþ¶®p'•1d‡ 'N±8:[‘Í{“<õò.QY÷V‰tK–Í™hûå·âû÷¡²! ƪQW”b‘òW¿i¾¿9>çg‰»µXòÁØŒM#}A¶þméE3h/‡I Ä],è<Ϭbê cl…V+Õ‰ÅÔòéé5¢s#¯ª…†0}ŠÌsÆÕ!D½ÁÈV*Ü2 šA§Œ€'Ôl\!ÁüËç_øéñIB(ôqq€e¾‹Õª Ðí`¶Æ<õtbͦÁ¡u0y–0iÁá¹+ÍÝçNGe ©ñ>™˜ ¦ÈbQ£f¼4¸Ìžy ÖQ3½‘è8‡Ú0Uôïýÿh¦¬øI/. ÕÆ­À.eÖÙÿEÈú D›a8Hu[ª×²õDÉpŸËI«åBYľœÆ>W·mTª^íÞ>ÎfÀŸ²¢ûsýÃÿà¿30øÈŸ_þé?‰(Š<ƒÎ%*©í§3‹Å@nSHˆT‹¬¸Ú23¸ÙpB—7/! ÞBDÓ´ôÞDœ˜ÜæP!]j]øhì­:Ä‹¡yg‹Êp37¢²0Òj¿pL.8iv-Æ´©6sã ‹´åÌÆ!æ4²ñìH jÈ]êÁÓ$ ƒË™‘ þ-ílÝB}Ó"´‰_£2Ë0`vìYýRµIœÔ%]¼Ãr§ÖPªËÓň¹U°XgîdVú¬Ù¨h¸)ÉUÑiÁo!Ì_ß.T§½&D^ýL}2M;­xz¿”9ɾÿÿ{ël±é†ƒ+ÉyŒÜ¦3¦Èó„ „îò Æ9Œ¼\󜯒+BŽãcRëm^ U­Y—­ØZDBra3tN5¼q«¸v£v¨Ð z’BIš¼]áè˜\¨Q-Y¯ß=GE¶ˆÞûM&ÝjxE«ÛϲÏW¾H ]Ð\f|•”×ÅÍßvd¢–>ã䑺µš›f¬µ0Ò¢þ©z£íÙ S´H¨n.:i=²Tìlµ®Ejç‚pVÃúzVzMý§Md°él!2'‰ûy®ùÒLÊ]ãaëÅJÆÌY¢›#xÕÓ_iª=jÌ*“K:ì$·@®S³»íY¹5ˆêÈ3c¥/<˪„Çš¢k¬¥\Ãuò3þþ?þïþXŽêadáÊù»µßý~nu Z'îk«)G/ð2 Nt+“JÈ…øYö”Eàª;åò†z¢nMj¾QÏò>±xçz%³µÌrƒþ{ÿá²ÏHÈò!’²)3˜c2¡4c¢ù¯ÿ·~eë»ê ²´½b>Ë· ïÏŠMá þþ>è7y½3«dsOMÐbýï^iÝϾe*³E_<Í^þ»òç{ÎýËðû¼íÂÇ"v ×—gŽúä‘?©ñªîÒ·ï– 2^gVóir=ÂͯOÇ LP^Ì…®^kÐÌÚµwI0­ïN–ôëžü}³w³oa‚ª¼}ýjŒ$§ô[(ñáknjkÿ÷_þŸ¶°¹±(@„û/þ"4KjÇ %ÅInëA'@_•˜ˆ‰¾ú œÖÔ8aìΠw:I7˜+á<Çyý×0Ñ’ DƳN‘J¨ Ç}Èþx|úéçóoþê/ÿò/[ã_¾œŽcèÿõE‰è•éMÆ)ôßÿÿ5K5p-u ¡íÞnä¼@bÀÆ¿>îm¤ÐËÝ ù†½ƒ§3…™LÁð8s2çc͘co@çÄ/EEúåÍ}nŠàp]Ûñëòßí"õùóóú_ÿÊwøþé?Iõf$!3æë‘\'¢1ÎôÎ…´”Ê3· Y±Þäà0“¹ÀšâVFŠg0@š¤=J!ñŒÙX4û7î+eLKTª©Øqxµ˜KHáü’X‘psDžè.»oÇyþhGFÃþ[ËôffÊÉ„œ†Œ›Íd~€*JØ/-N,{ûZ«¸DÜŠñE kœMjÌ pmGá"³ÂdE˜O!ÐæKK_%t¹=-vJcœç’³>º¤DH¦àæÂ¥ŠÙ’4 50==a ¾x†TsùxѪjqMNü÷ÞÁ7Ø_µcÊŒŠˆ©@f=ƒ½”çËŽÃcEzï½µ%>À¢^Ï3•ˆ™ÆAD­·bÁ!‹‹:-dÃd”çyɰ-Á V·xýÏ@J+˜™NL3Êxvjµ7nñÙ s÷÷•š]¬çßAaÂþ{ 3mq®¨RÅWsy;ÐñZâ·&maÂö&·v:ùó3*Þœ‡•¥Ü1Eç·c’Š §Q5Éœ–;½õÖÚã•ÚÃVùò7Çqo‡®q”Jºyøì«SmQH\ÍsrX [¨©¾§ëâ kÅXã:æÕ7Ñs뽇¤fŒqVs¹*X¹/™ aqÚ[+"þú^ã…¥$ý»ÿÙó·¢.À”ønÃþž£¾¿>ŪñܧžÓ«õ_+-ø†ìƒ? ¸;E´Î ¬À¸=Šâ¿¸Í¸‘Œå³’pú>Ü«‰D‹yRüÖÃâ®|™—нâSÚA"O†zzJ4–ê¿÷ïÿG?ŠvßaT}7·”Žë?ýïÿê}®1+„7•€V ¡&Nò$òúW å”6ÚuKŸ‹6¶QÊ¢yý3˜üT÷ë¸ÿÆáwû²ú#¿ú«µ+=ïr}d3Ð%ÁåÙÙºAÿ±!µÓÑð~ηͩ _.ªØ°i†ŽÆ£ØÖçV ‹óp:­V/ 3Žh‹û¦3ÂüÝ ðGìZ=-ù5£½2Ê©¬`3¦(1J±›Ê35@cà‹£œ.#fX®ŠÍP‡ßätRQKÁŒÏå¹b‹±_7q-"ÈeºXW³Ô\%o‰ U‘P¢,¢tƒy{{KüeŒ¡án‰Ðöš »ÁÂyÇ8«¶ ´j…‚“kb­øTÓÜ ”Dä'ˆÎ1‹ýHàð‚Wþvlæ;Ï Í?ö÷Õ)ä¹”£Ó/MÀúÀñí¡ÿþÅÓH¹º4Ù‡Bõë5îø¶ÇßU}à·4È/ŒßûàÜŸáó§ù$œ} -zc­³ ..ÆUäÞꪷˆ(’;X,uß½ƒôA¶ØK[ÀÂÕ0÷2%k úN€ïF9è#Z\™K :Þ×iã”F§>ȵÅÕ1mQPì\Á¥ùú[ÌæK9ºO\¯Viz-믲–5Õ4̯’ÎÏÒéñÄ´×Gìê–®>s^{Ñcݧ Àw=ÐÅ 8­"4»â|i9)Tɤ–¼§z_ÏÖ?Vrž¥I€*š¿™ÐP=¦I„ÛØVàXtî,<ˈ3 ‡Y…úü=¬#r ­ê›k­£.\yo¡;g_ìRaìÆY”t5Q IùÊrÑê Áw´¹Öͼg€”@´u6—åë’0ë±Uð=4iž÷~É^íå÷ }õôŒ˜Qš%lÕB‰ÂÒ}¨€;•¨ëÕæ±Ø:²e*וìg‘ ! â@µúÐpqßF.¢û|`ݘV@°Ê’‚•[mI`ÂŒ1Ú­n_öæõkSb¨ÂÓ÷ß·!¡Ö¨“’Ô®ˆ¬jªeʶ@@¢¢l 3bù €Ù² ¡H©Þ@ÌY ‰PtL¼»½RÚí»qº›T¿¸c% ;EQP’ÛƒÞL¢€*B!Ds&B¥’ÊZãµµüXôÔH¹J!{.vD²h—â½QßFˆ@]$}¶p"È$ƇÏi÷âs×ÜÙ‰Ž½åÏûû=ßãxi¬ZüWþ=ˆÿàîÿú{ð#tk2T¤!ab1  øcäävPPªþ%69—˜ÚÉ´ðRÇ̵ôðÒŽŸ-=ÅÌPjÚ²hÁøU}OnlÏ{yXˆ³›|qvv„xi-€a¦«X!@‹êÃb’.Þ;~†AWÆ!Ç=Jqd¬¥‡è‰@)]»²ºÒº‚­ý'\Hn¬ŽÛ:ëð:­«¤{ƒzsèN¾=ò›ß6˜•ªø^T.ç«À\ Ó _ȉ—1BàLHf½m$¨¸ÂJ”‚Òd4r ) / zNœúò5|?štÀÖ*#1`™D$%.Ô„Ì%2¥Ä,¥Ô¯³4Q?„â~¢Lpæ«>ì€ûYÎü‹ØÍÜV»5©¬Þ‡Å8GüîÕÙ]Å*6_ø6 ³0Ûª‹õ܉‡Œë>ûõ8zé¸èÑšKQ“R½~|i¡„­&˜h)YíÛ …wƒ¶i¡ĽQšÒRpÓ>Ã|6(SôÙ±µrÉk"ÚÄAU§dFB%_ZD8qÄ@Ägñ¯]Þ¿mæÆ«ëðÑ©$¦ ™KŠÃ“XÍÖ<ªëâQbW$ÿÇ÷'~ÙGÇ uuW÷ÄÙúã‘#ÅhY‘«†iÕÓ¹,ÎT õe}Î_œ$b®ð“ö;ܸZòty9AäøÆ÷-‹û×ñol þçÏeliðþ¡¿Oõ»ˆ[ˆk;ÈàtÆC/3eÃ|ß#Ì÷Ä<áa÷ö>=Ç€ú#×¹ãð™è?yWÏÑ|<–Œ¸  6§Ì/ê¢u]pí.u+›Æ¬‘K:] ®Vçýfüؾ¬âÔ^7ÒæuYX ‹(cN-)0öÑj1mihæ €¤êÉT/ÁDû Õ2)*eqX%(:«eŽzôÊ6—œzÀý¥@Ïö…DùeÑ¿yU[©Â 3cnfìGaíÂŒ|L»Óþë‘´ÈKÔ4ný3?ç¾õ/š•­¨¦¹žZ•½—ç[º”-Å[4³»l†¯-6! •ʦœà°æx^Ù×ûû²b5ã“ÌdlZAj½†"çç(tŠ@Ì8p^ô©B©¯¯ q­+÷« [ÃIñä-ö ªÍ§ ßÌ©b%9¢¶·X˜fvà5z˪ì2L¶âÉp?¢[OC¨­š*ߨ ™5ŸýúA“,1³9Äʹc±®ðëzÌ‚ˆòÒÝäÎHGëÂ/ä·f™  v½ü/½ÌÍ”}¶ó*ð7wŠšÓ=[ÜzŸÉD#`í¤D€+@o„ž¸Á‚´31"‹¶,@f«ÉWWXrÍd¹Ð…F€Ú¹T£$óE­£˜€E©a]Ò¾~õ… Á{ï?3—ÿêü†@¨è0mQEE95Ž€0bÐâj¦œZo*}ŠTÇÄÂcJéöæö͛ۗ‡Ä ·“„Gþúc|u€W#S‚‰! ˆh=$€ÂÇäâ2@ ÅÜ?ŒÕŸ” ]è±—̓ÙåÈ ~K§„&_ŠòþÓÂûù v!ï £?ú?pl=†û_Ú¥o×þ¬šƒmÿãÍÿùßÛ»Ñà0 ÅiİRGº’ªRõði°7xíê C¬o³ ÎÆÈ"˜Ý ‹iŒUâae;U,XX̃*¢R+nË”gëj"Y˜œ¸W!Tåµ¹`CTD¬B+‹™o,’BÕÁóEÐየ‰ýó?²èCzÄÖMH|‘‡_í.Ä`Ä<Ý0;„ÊßØÛ¹Pé@&‹L® ƒLœ˜TXUÓÄ@–œ”[×»JÓæéC≛uOFö%cî!g—@v[ªÖ7Þ,Å*$°Ùç˜ö¹ÃR]¢)3 ÏHB B²Û5”S.¬s¡Ìc;§©Hï=Ù«è@Q±WÖ”c3½›¡í.‡9#!ä޽ȣ¹ÐÌ‚L=<ÝÐv5»úùI½É«ñNÖå<Û\H‚°È)ºcP°‰ôòÀꔬåά`fôMï4Ëø]_Ö7ìÈG ·Ù¬4fbÕÅÈ«þ[/)@±-òÛTõ½¯/i[VÂH83Ñž~ÚÈp‘ÒÿSýŸpòÁ¾$ÿuÌ«Ç7^h¿wXÛ,î 7Ví}NØà,•VgŸÉÃÁÈèϲMYÃåHï:Œƒ"Hêzu ^¿ñ’ŽG¯`]௜é1ÚàD‘ÁÉ€ˆÓÍ—#¬\Í“e•J±rÅåõB¿´}¢ÿÒßú?»òû¿÷.pô²'ÖcØ s¯8­µÃË÷7ºéúq¸rÙ0¨¼”ßð-ÿÍu˜®‰óæ+q›Î³wKîcEpûâ]õÿYãWðž±·ë6<~)ufº¥ª&Z¯9Žý{Ìà{\ìÄfÕ÷X3:ª$£­ø°²Ô`gƒ1kѳªÏ ® Ø• ÕEe‹äµÜ-ðQ%V(°NéO—¨^„žùê³”=ÐÞ×ßÔìb7ŸOÌ un®U¡z’Áêül5êÑ(j…jN}Dæ¿fF÷}Œ3FèfƒªQ„Ë"È@Û1JÉ+Z«³0\+OPÜðóK‰:¸¶’9FmrU/‰H^Ø·øW¬AvÊÂóå„¢ÌjésFE4à/Cþ-JË4h‘CˆJÒ^0œ˜SYœ»º‘œ‰­RÁŽ’ê8[eÕEþ,·’U‰½{Ïå»3„¡*¤ €^•›q°ªRõÞ)f8yIl L1qMý1†ë¸cÜn·Ó4y`¢Æÿš‚@¦i²o±ýÔ€ú[‘Öaðš× ƒ‚“w_M)Ù?ª6Ð×7øïò9€LÛØ‰8žÖ¯9©‰1¡¹ ÈT$z ,JÍX@!1‹°y(sJã8ÖÌCm¥ñ Â!D“üçôà2oñV,bNXHÔB Á„ˆ–:L„ ¹ÔfJòâÅ‹£U#(è“÷Þ#P ‹a©ž†ðÙB˜ ¨`SJ YÑÄ bˆw»¨&–çÏ¿~}»¿õÕAF»œ%I IDAT…èz€=CaF ¼õÕNpPÜ'`ÑÇ|¼ …ˆJ!:ä‹0µ½$ D°~«¼qû{{¾Fßq‡Jd¬p¸ÁÒŸáþÝ+‹·È±Éë7ê{i—öµ'ÿê¿ÿ.óü· ̈́ΎK ŽNÔÙõkÍѹ=¶÷Z+4Ÿº¦£¨±¥ÔûøQ°³ÁA)%áXXÃæ‰ à^¸:[(‡¥f°>VÕ.«+;)y)6š»~Ô.€V¢UqOg6s¯ßËÌ)q¶¸h¢o¨/Ð61Ëo[ßÎ]„›8„‘Š}S mÚ@m†œX_y&§@V§X ~s#¡@iJ5¶¥7ÙÿÙ|/ƒø1ä©åaRÊ,M®&9þºwLœdòhs5+jßî'ú"šÒ4뙊H ýxv‰³;°¢jaž¦fDx™æÍ¦Vj`‚åðß@`´©í³°ÉɬžÀçT™¢¿%ÀÒl³üYЋ*2/E–Õ-'{ý ƒô© }J°…*ƒÛ·?Œü¯½Aç¸ÿš çÙ™•8 ×y"FŠÐD,ðô/ü—·À¥=Æ:=£;ßÏz½† 7J™mžµ+@|÷f¬’w<«ùÀÕÄ£NsW˜€ÞHQ·ög½¤Vw5;0‹8ÝV-€@©pض€bI‹ãŸ÷LÆìAŽÛÇÏ®¾!àößsvd±˜ AOA¨xäÆê²šW;g‰Ý€òýw·#œVóÊmsô0—ÌèÿÌ?×Öú‡ÿßï¯ïaîªþ­@ÿçðßëðï¯ûÍ× 8yûÒPéíÔúz¤à:ì ðÄŠ;ÐÞæâJʪ ¸¨ZWlP sƒß#ÞAØ<¨Ç•½¸{=ýç©Úùã´3Ñ"t)çÌ‚æ»#ì1óÍ×BøË* ämr´¹ÏaŸ=£ì&pN XÞ˜ KüÕ ˆêJIM—¦~cŸLÝ«°0 ý ®Q¨KD×ïžV~Jºâ%Ñ JO9saÑþ»…Åãô£÷~‘šh›RJÓ4ù.È€l$B³Ž¢XæôΕ¸8ØdsN¶±!³,"ÂÓ4…6›MˆÑæTšAÂ&ZÌh33!iËÐ%ï gYj¶Â'Ã@]Ln• Ö ~TdÍ®>UŽç‹—Û#jê³\ÍÕß¿{¿£ºT# ª¨*1ôU<lí£ «‡¾+×¥š—É×mD:©W]¿™Ï\_À98gnÆÜxc¬F϶엢%Œ1^__ÇsÊâ8Ž"b@¼I† o _µŠy–•¡—AçÏÅ z¿ùóÄJW U§ï£¡‰B³VÕ¾X œ‘ͽ:O„—éœÃ-Åh•C  ,‹0|1ê$„ĶWRJã8Qà!ZZ†@* šJ@bŽV&"ó.0Q¡¨ dI,@öÊP²»Víþ'›¾ / "UAµä˜W_¿a«ùðÃȤñI¦$ÒœmHfæÃa !n?Úí‡ñ@_¿|5ÆÃ8ýÞóô&éãH›¢ðxÌòr»‰¡€@WAvŒ> ªâ“?¼Ïž}xss‹yÈ«,‘ô¾i ÿÕä\€†„ja1%[¾‹±æC3Üî)î™Ýžã«³ç&KŽÇ9º8<›Ï¿´KûUkOÿÂøŽ{xñ¿ýü¦C¤ÍPA-Xp~ùuÙ}˜\T«/wÙ…A/´^ŠUó¢\Óß­U#ìêT«nºO_èÖ÷ŃüÜ6‡÷ä"„6ŸŸI›³Õ"Ͷ©S»"_Èá=6ÉdÎ3lµb¯X×ä–Ä ¼6•’†P”DX8%íYp?©¯4“L Í/öýÕÆ¤âËSšœ§!¶Y` 09ˆ¡¼å[}dæmX¹˜Ê´²ÅSaLOÒù²G±È.¥0Tï©e’mUrõ âÝäÑÃëùî-Ëž–îKÕúÆÌ“»ÙW†€D]0l™üè4%ÀΙªVB™ Ú®V½ƒlcì23ÛB•®Íi½¢-µµZÖØ/±f)•©þÐ ükŸxè_¡YKAïИ¬psšm–‹k¿|ïÇœK»´‡7=î샧äÕ+¿žmìßlP–•ÇI…Š8¯ûÏè8×qÃNA_äùE­Ùcñk_4Op¤§pA v0÷±-[0a&Nø#™p, °çaÎe&N߈=ˆ_€P–÷ÜÓ9¾‡½Ï1’@‚¸rÝWþ©÷âéºV¡b¿ýgþô?[_uØÿÙüã¸+<Ä·úÿÒ³Œßíè¦÷¬P×<ÌpéÉqü,p­|êOÏXf?ˆê8²»>&}œ}["ââU×ÒfÕÒ§˜|,B­3’¶¸Ð5àpI,¸èÝ2“s9 ›_Ã:Ly™ß^À–’ÎX DÁ¡š €$`Iiá>:}“T}E…öÀ%dÞõâ=¯õT<û¬BÕ iUfQã…Šy‘§¡Rä@íùêQþΪãtqƒ­ž.Kqf4ÛŒF•£x¿ Æš ³º‰¾!϶rØn·ÃÓ4MÓd>¶E˃}øav%U•4M„8 ƒE¼š¡ŠˆT‚A5‡—švÐÖç5N6¯ÊX”4RÔ¢jožXD!„É‚ï,‹¬7hbÃH¨jy}Õ­^4]«D$,^ƒ_«’½kAÿ ‘ˆ„@D1!™6Ü›éƒS‡UI»›¨ÇS­„ %¿)™¢Ð4þÙI‰:ç¼âË_Çsí1¦Êê½°!þ~¥mÎ?%ã"‘n¯ìá¶zˆ¬)+iÚ¶H!PŽuÍQ †þCöƒÕl£ ŽofD¶ª%³ôµÎð¡›5¦¢Ö  _+ Z*‰›Ô|¨-÷2ãì¼máÏÂ&§Üï÷!Ä MIuw{wg£UbQ‘B4…g_ «Âö*ЦP„®DÙ›;WŸd€>¯íË2›$NÚeÅVÍgTøSJª‡ ªcJûýáË/¿ú£7ãë {Ƨz¶ÑëH“ÀËÝtË$(?¸€°!xo¢?õÛ¿ýÁG=þõó¯Ÿïîv,r»wãhù½Åc§ùb#aóê Žõé±Àœ\rP 3êÞeTÄô/#´wþ›íê~«Í èi—ÖÚÿÚ_÷¼ú{ñ]SC»—rŸ¬Ù³p½Õå?{Ô„áöøc-ÎëfçÎAN³Y‘ÑÏüÊ›±Â£h$±_!x':òz—ºüÈI¹yÚ¤¢öz2 ¸ ›Õ4%ÙÉ[ WÁ©­Ø\uJè<ܧõrÑMäCïëë8¿C€S ÙëK¿~ÐÜ¢J «ÌUT‘ìŒWìõ½ÎL#_Þ¿â”J68ÓPÕ”¸Ñ8N¶3«8œå¸¬ÚžˆAÄæÅ×"gWÅì9XÄÍx3’#s©ûê™qPÝ'fu?R.øÈ*Š µ+'­'LˆZ‘êØ U;›£Y5+ûû¼ÒżþÒþX r0[/ íëkE$ýgÃmóõüž¯“»Vk´k±±«pÿŠ®V°öuÞ ÄÚ:¤fHΊf.@Çk4ûÏ ¬ô"PtCõjZ@ïZ¿0øBŸ{ôäæñ¦üç¡ÿ«wÏù6R÷ÓT]o­p £* ÿÝ1ÒÕõsíôßü­?={qú“?˜ç[>쑸´·‡þ Ï@èõÊiýæþ{Å{þ¶õæ+€Kw¹GœçúâúÀ뺯Ðj£#¤âr¿}Jì¼G°Z&t¶ng^Î8ۤє"¨ Èx uɽ@ Zõra:Ú¤É,{4\–DÙ ‡€ÊÀý[«„ß\Wãµæ2ä¥õ¥Ô÷*ÎññZ€õ Y~• Ì*0`Å«ø]:XÝsŸôãw©€xOÊõJ1qû9a]øP%ÛªZÖ*†Ú›îÏ*˜“—ަSV±%;’RáêêÊ!„iš4ѽ¥FÚš«:T°»‚Ôuf¶’ÏÒ$ ¤‡$¦ê,+½Þ¾{S×â.>·èîëW¸Zi0Ùæ™±XY¾¢ 0?Y !Sx©ª+#0.¡­*;\@½€½Q2µ£  1#:tïu…šÖè*“VŠ¡Œ ‘Û»»Ê%ÔÆ"X €@d·Ä8MH¤¶ôHÎÊêÃ0˜ þ4M¢ŠH B^©;J¦ÉÓYÙYÂ%ói¶¾ ˜Ð"„K’Šˆ2#…ƒÖêPD²ŸaõÔf$`QhŠJPM E ?ÿü VýÍßüMÈ!æ´½ÚîvûOþÙ‹/Ãï}5~y`VÜ~rM„ú‹€Ç!Я=Â'ÃðÑã+å‰ð§o¦OnvW§¸Ý<}úL„Þܾ råv>jÞ»ñÀ%©»³U£6ªC&uæ/ŸúJ4² ›vÜËQa^¨g*. ÿ¥]Ú·ÙÞÿ¦Ưþ×ÿše¼þµªh^7-±´&6`½î!2ˆ¹­uE¸²õµhu^#ØÇ*äwP®fM‰‰°z¼8ÞÓ”¦4ic²)3ˆ!¶w»Zî¨Èýï”ì_‘yo]í…9•9  qÂ:MÓöúQUt1eç¾ä¢hªnÐ’‡ â®>.ÓÄÅÎNÔÎH<Ó`^=v–Æý×Íu\}@ƒ¹IÍܦ¶¤Ò µcýì Û}—ZUŸ' „H/ímÃ0@o]Xùe`pѵÅ«$*yzIUAÿÇé?¾Œ*—vi÷aHº¶êÖŽ5= º.bº £€OB·þ±nЋ˜[Ã]ó§cVðwW0;ØÓÎB%k+sýï~úƒ©ps.­’•“h˜‰}¶\‰Æ.ôªüúÒí¤ëÌ>§·¿dóº„{cð¥CæÖé«T30 '¢ŒÑ®xaѳSAÑR‚"Nyi†}p‹ÿȯÿø·\7fåÓŸý!܃‡­ÞfgvìÊUQÕ?ÆcÙ™èÿC`ô­çqUú Vë~ºáž#žáU ví]×+ŒÛ)~N{ü¢ÃÀfwV3 Wèýƒ;…îü)nvL­P@C s˜_—^CµäxE ^ÝRs°;xªÙ¼³á"–/ …%äÒ+ÅpœÐc;ù³HԼǰy›ç’nÔyEºù¸Éb‹ì5ÿ O1?jÅÂmMQOŠƒ¬!Eól|„-v=õ¢þÕàÙÜAaqCŒ‘YòQDCˆ"’¦É†ažTØR¬³–0ĘÁ À8 H$2½`w€‚ª]{êÐ IPP4#3-ÅSYÓŠåI™äT6s'³ŠNûœiðOþð'WÛíííîöö.¥é«ç/~òFoFýðŠw¬A!’&æ+|q§;¡áãÈ‚,ød4^?ÚÆxóú N2~ú‹_<ùr·SÕ«G¯=Ùn·›aÀjÉvºË þ×·º¡Üy‚·‘ºÙÉJËÆ®°ïÈ+sôKÝòŒÙÇý¿´KûUkÿ¥¿ñÍîðõ?øoj½šE#¢®¸ÅÛæ™jFCèjéül¡óû_[ÀÖcQ©Z­Šh—³\€¥¯UÝUƒ£Šª6…ZÑï‡SÀe„aÌ·ÛmáÚ9ãìå`MùÐ(-SgJÐǺ.HŽ’Ìd.%¯UE[Q`ïÕXàÙ«Ìߣÿgeò@8Kªè•XWs± Ô¼êF" ¡Xõ9†DZÇv±Ààï€ÿ¿qy~/íÒ¾+2@»Uøl}}ÊïW΀uyÏ u<ïäþ«×Š.D÷p2¨ÖÜ ÷~ÊæT™ ¯(÷ý:ÇšW‹ÎCÃç};“óß¿ÿEÏ$èàÿæ9À÷ œµå¼ óЦÐ}Ê óÇ8²¯Ð9fÏn”ã8•±y¦ù|¡çkž" Þ‡°—G ~ô'þä ”ÿüç?{¶ýèö—o’ ¸¹~;“ý£ÿó<{ï^<~šë:ë„ßÖõÏä#ÎÇgµù8¶yÝ:X¼Љúq¹M¢»ã÷£6‡z\QûÓ[ªÍÛ? ‹¾×]FAV‹tŸ U£®·>•Ëj¶œºÛ¤9àatQ53jT¨Î«èÞJ ²Ö¿R£™«—0X/5 %÷6¯ñlî¦!Ç’h!eH•¨˜ÈI®PðvÓ¥Bïy1!AoÑgÇâ™§¹ÝZYE¸—_ðUíþ›m}o9àwiT—‹æð’˜©¨œl­¥Lž‹,=c"æúdƦ1F[Ú©j@Íí4¥dNúy?MÃ^,ø­)[­Uøž°YÁ”¦)Ó–é†Þ>¸ÏvSU2íh~ÀPÈ:ðkÂ-h8¸± å¯9¦u¹°·,Ül­;Mö¨±„9 |<ˆ°ª­¨ÍEÇÜèˬó­cë/¥ò•TY¯ŒèTlÌ}^VidT«aÌì¨<ûj‹Ëæ5 ü\ÌXÎKUYT³ªJ†Å›F-  ò€+ª:Mãv»Í$eÍÈЈH„æO•¦DT¯(³ U06'i DÙ6G•Yâ“U$²ˆª‹ 1¢ªŒÓÄÌ€d¦:ˆUŒ·É¡Ñ-lÎ *Ê ì Bæ$ˆiJ¢Ê"Ⱦ…‰Ìñ_­g‹ÌTA™J‚ k’iM„céc^ÑŒŒˆD™Dâ¼Ûí¾þêÅ~_¼¾ùr'?Í#ˆjÄ@!±ŽW›|ò$|p½ùíþwÞ¼ºùìÓÏ@aØ Ãf»ÝlA‰AþL6WWÓxÛ-O „„a3\13RE¤¼ÎA"/þ„þ5Ý^Þh`P£7<{î‚Ìx¾{1ÛíÞáxÎÐyý/íÒ.͵÷þâ_}»¾üßÿîÌ¡žB0k>Cë™9Ï[{_šl$¬¢,\à~ !-'½øõÛ›=¿ú¡óë¯*xËSÉ•‹NíÓê‡a@Âc QURâŒV+¨jŒŠLž…­ö®Bÿ¿éÒ{UÍ]°™›“MèfTŠ’Ömª¤ šŸQ¹û®jÀèùø„c2Œf)ñBÞ†ÕÓ‰Ùh™‚!!†@ÞCI~Ì~óƒó?¹ ëÖ~aÈ¢«tt¥ê¯ùQ®f±w—#àßÈ?üß„…ïß—ŸýüÝ¡ÿ‡n¸ˆZßàl¬þü{ã-5¼³#%<û†ìÂËõ8—©o2â¨åýèèƒFoçÓ²0›Zõ–™aÞk™½µ*õX×£ŸÊ.¥ýý9ec VÇ9;„žXÍPÿxf渲^ÐÛ iU@V¨^ÇV `”€ùöܯ KBÃìÖCØ~o§FUÍiwyü*îŸ *^é¶Ç  h¾¹„B3ÙÞV³â“º@Ž(~ýíÔ †Tª?2ú/¶è€üíÞ úب:Oòue‹;×Ҩγz”Ù“ÑYâ<ùÔ(ñ]»©E´ŒNÍŒ“VÈÑêÚdæ»»-ü¡R¨pµÝšã¿ÿ$U)Ä@˜¦É´]$,ú§”ìþ7½9ÍE`î«ÔUÀëy‰(’UX8'i]å¾»sŠ(e²\ÌíÇÈ Ϊ±\ؘë_åõ$tKÊe䋈$(ÅЛâõF,]Ø|ÃÕ©xdáÃÌ‚ íbÙÃ0ØÒ D§ŒŸW™uI^,w¨cÀæÆµ­ˆ!F8>ì·¥1×zŽ’OˆäLÿ=mkôJ%9”Y¦)1KáDK tUüãT™" !NÙŸ DÅ<bˆšR !°ò8NDˆ)%@xñòÕv³ 123f‡b¦‰9 Kbâ"Íi ⰩEb*†`¡‚”B ü:å\u+Ó8²>(†8l†@4M9ÃînQÅÌ()3#!'€f¦ì¤0¯]sâ(Lãx˜&B¤}N‡1½yóæÏ_~v#?}#‚@bvˆ»‰7~8Ð'Âv; Ãæúúz³¹:L|HéfœÆ¤ï¢Û»Cb¹ÝíTB`€íÕ]!³‡qšãhÕ¹Þª¬e6Mˆ‚W0xßí"a²^†{\) Ë~d0_qá²¼îÒ.íÒ.íí۳߽ÇÝè³ÿùoׂ¶jc“âÈ¡ÔYÆ1äiS3É/ÙÀ‹Ö–¦Æ'gá?5¥|ìcε×kŒqJ“Mœ„@ªïŸ} W?BQ±LàfÕ\¡v¤œàä¼€J<ÖB-_¨¥¥%§øÞ”ÝÓ«Û‹›rÌà~ÏÌšŒ¹õÕØd?·)ý]=òN~øoý§—;üÒ.íW³éQ`ËÒw\x/Píàõ%’>Û¦³æÐ¹ý9jñU°> 0e…èàûª¬/Òõ:ƒÞHÒ{¨ËÕh=ïWËãtQS£ÖÂÝgõ­f8þ ÑOÏìÎwÜdÍ¡eqAE +÷u•Œ ¸”)XF;œ“޶ýž}½'ŽâäƒÀ´€Ñdî|Ž]…|·Uëþ"±oFù¹ŽÁ98Œø^0‚z¿–!¹¼ä’F¼~—Úðèð¥:>矖FLº"=µï÷‘«ò‚Ùg¾k„*f‚©(¦T\Ú‘Š°$WTŽÈìq”Bæ¸3 ›„‰HÕLf8NTýÈ•uû÷„¡Óš¥qJå#"ÂIrR.ˆIè÷o- 9”`ºÆ5dk—–HP X3Ù¦ ã8ª(þ[}Z¼w­Ôк,6gŸ(`27‰Y®•±¨8šV)œ …Pü¹Tý{ ”à ߪ$iØl-.°lƒ¢‡ÍÖ²50eÙL]%•–òÊ=°ÙåçÅ|ígíÀý™#@(Ë~U% ~ÎbêÈâN`ÌÑ"‘ÍX‰Kö£ãE¡°BØl·hJ‰9™uÝ£y+›¢pÇb $ÂÓ¨ˆÈÂ2JbÐqíƒã8æ{QT„5%6W…a¬ìD´øÔKž‘0#)ˆ"§TôZóo«7ô8æ?¨ Z’ÚG­#abaÕï Ë¢°÷]5¶gEÆqT%ÙïÇ”xbÇÃçÏ_þìµLI'Àݤ 0%øðÚnu`щñ‡×ôìÑæ“O~‡áîn72¿yùòÕíÝf³yÿéU¶æÃBD¶;]”…a0‰Ž‡=æ€Rz¢Í+CiPç"³!6Æ¢‹ü…öö)Q<>è}í½}jʰ>sY_Ú¥]Ú·Ý~ôoÿg÷0ÿoÙë Jø4cÕ”’¨ÚôEÅpü,ç *žŠf1oÓlfˆmpÎ3µÔß<é"« Tf.8•"bˆ¡NP›Ð¡˜+.ý/g9ßwC~#6j-cþ7(BçYäTØ{â³°Oq¨• ~&cK`ú€‚P|xñп´KûcÞNhº±úMα™ê»a3¨´ƒø`wzD“‹Ô6;×ýQÐ}µ˜wóüø;+„ö#ê¸ë+V-‰Ö"‚ç rþž´¶?ÍW¡züÒ»?…œjjäÉÖµšƒ·¥ŽqˆÇ“•g÷c÷­+NJGú§ãfÖ»W½}0+~µT hÇÕœü,À±"€3¿ý£þ¨eÞ«À×_~ñý¬Ô~9bìAÌ.úŽ£ 9·%‚‰ßêüð­ñJ`‘ ¬ýçf3ÉÒm3JpNÄŠuT\ØáZüØê9@e¥, AÉþApG•Ýð‹€¥O€"¸GÐZU[Õªî_»ÊÍ»[Z@ajx€êâvp/bIÂöœ—zà üû,e—›Œ„6Ö¡ ÆèÁœÓu)ˆíuÓ¡ê9s;ˆnãåN´ÖC4”q!çïŠoåŠ IDAT©¥…ûS5PÊþãý¶º:¬,(界@ºóÛê1qR‘š Š¤ÀÀÑ"¢“Cíƒe¼fÿSPU-¦´hQ¥RÂÐÀâd 1€^Jækx¦( š­ ±§Ì; ÈÔj¶´%¥­3 zf•º$¥Qµ>“5·úð”"qÈýÐòYÍ|‰‚¢Z@«"B1 G÷½Z¢2òâ» þˆ"\MuÜÐ@æ„“FDEÚʶr ^1§Z±Qu©xBD (l€uiA,乞WݼžwÂ:DpfJF´øx^èCëÁ—t_íG^­ëTuŒ1²` 0 ó+ Âî`D2¢AÄ"Ó8îED„YLi:¿Ýn,œÆˆœlޏ!Š*LDÓÄ0M“ª¤”Œ™` ( ( ‚¹÷°HP§)ä ¨  Áð|)@Tri…(Uß*c/d”’‚‘”T‡A‹ ‰½3@Jô3ƒ*S²dó8l„IiQ–77ûçÏ_~ùúöù(¯÷x7Á>ñ£!0*¼ñÏ~¸ÙOüåNã ~ôèñf»’xs·SafaVDÐB"1à°%JÓ4ÝÝí„åýž©*³"f¶²’í÷/BŸ²ÙHë™å^ýE&  sÁóÁM¼srd¼€û—vi—ö«Âüå¿yâ¯_ü/ÿÕlÉAÐ,ëÔQUA 2Oa±yWâ4[–#¢•lr’#²@­®­ÿÍwóËРxõPs&íâêú÷‚IF  d©„‚É òÆfàãƒyíOyò€í-óÁ¿þ×/·Ó¥]Ú¥= Ì{¸¡÷Âg-NóXØì*&[–K/MçzyýŸíp‰>¯ÀÁÕa–å°8÷ñ¥ùþògQÀÝ–ùïÏ똹–´/ØbD½›tañ£M`Õ÷>øäYOowH°Ý^ãx8L{¾ÝlP ‘HSbBš¦i§ãf0 ¦;U¦ýxØíöÃ0ÜÞÝYýe"Šò”Ý—©Õ0˜×Õ5€¶8:Xyú¡W­þ/ˆÿ¥]Ú¥ý1l?¸Ï…æ§ÿãioü@!ÄP…ÙoGÙ[Õ&cqÈ¥rÃf¨Óž”¸ø£•ú…@™ ´ç7¸fg>Kc²‰‘wöïB¦P-|X¸q5Q©˜.š3’IlVyQë_Ú¥]Ú;àSu©Õ7zÅ€÷(¶µô’#'®N~Oו(à¶^ãæ äBܽм¯zVtÙõ[¨Sß/ÑG€uâõ®¢S¥ }p«zŸ¡ÒõëpÌÀÎã\³5o¥V²!œ¿~]håð°Vq¬3ÑicïC4OT“¬í¶vEϬØÚQQ®Je@ïá Pøé"€Ù_ç›™âõX‡|ðÑGЇ ¼zñâF‡* ÄzâøMF ¿%úOºëÖ=ÿÑÕñ¬[Ž<ôŽT³*ªoʾiͪ ×þ6÷÷Ç™MŸ£»‚{Ø…#ÒU¨— Z˜Ýù×b„g¬†ý·Â’ˆ¨n•¯@'¶N&ÈîÿY^©Ùø_W€o3Òæªß:@‘´ÄÍÎZÌ´7OΦ=€%õ°¼t°»ʧDXK!J A¥Õ³øXbS¥†¶O îÞ³0ý,´ØTZ»oï¹´ÅÃ¥sûïc¿Ð|`qEÍGÄý§žA]?}w€*ĈÈ\–ˆ‚T“ÖRŽ”CYkÎ-XöhÌú¦T®›|ÖõC)k‘òηÖ,‘¶XT«p‡&ÒÏ5ã)M)¥ÍfS†ÌàAÑàvU3å·ãÄ) ›J±-«(ÛNÍYñˆ—äW/ØBjI¦u!xùË‹Ž«++>Ê(ä€rF¨àS ÜÛQ™Ùüp,?Kå`ÕòÛ3ïÌ?ß5ûý¾°XíqB"b˹DŽÅ28¨nÔ¿˜Ñz,û5Q©ñ C¥p E„`[‘Í]X%*ù:R/¢"V¦ Ì²Ùa"fŽq ¢»Ý-!eÖG5£ÙÍ™‘RJÓ4„(ªã4‰hJ“°0ón·›Rbf,¥DÁ.ª¦¤!Ú ‡!h.` !X­TûåòÿDeš&aF"PKšlH"Dˆì:Ä#!ØŽÊÓ‘3Ð'A•B1 ›í~w@ÛíÕ”Rb¹½½ÛÆÛ7ož?ñéÍt3â/î8 7„\Ó‡›®7ñ: ~¼ {Ñý˜†Í·Q` ¯on¿x³¿Šø£ü n0%C$K›T‰Ã&ÆÈ,²);ûͰ‘ÇO®¶Û»ý. ´Ù 1y8&ì&ÙÕ§¼º7wN›A™o®—l/ŒþæŽupñô¿´K»´ÛŸüwÿ‹ÓX fOL?ß5FÀ^¶¢¢¦Q{_«ªy¼5nÛ”ù|0ÆgK”öNײ–ç÷ÆIØÆïýî_½\¾K»´KûîÈœ÷Ç1å¶8Ÿ9ÿjº¸\=âš~„XI ]¶é>tÚ²_ÔÆt¾ +¬ùa¸ÿ)œryfîe²Z0ûº¼Ö8á´@*9$2ôÖS=ï k÷‰Í÷põ÷çzσS×u°T½± Ó:ºÛP{žñmðqŸ’xj?*ˆ¤Ù¹^O²y'ïðÁ|ª¯_¾|; Gwá{!Ã[ÜuºÄÅíV=î?St¬ tsm|ÀÏèå­ÔÀ\ðxÊ`¹Ïs½ò7Ko“ïxÃ"ÛϳÞy`lïD¤UÔ¸tÏ^ä+)(ââb ™‡¶$aHYê.‚„jÈ»/…œ ºìeÅ|6ˆ*PE –O\³½.ôì†-̦|U³-E°yÏù¾q<Ë,ôQºï©yijAxIŠ7%újFAG;¢èH’0 Ë˜Ç•ÇÏ|èpzü·¨Ùx&ß¾·f&$TPæ4¥iS–á8‡ý>ÄhøiÎn“’çëla¬Ð a}5wÉ "(XFœÙ£ÑပP-æhÌXgQÐF+(†  ›@^ªÎ½'¨Mk¦J&C+ì«}UZX„ê<ÐFD¨šÿ@9éL&0›g‹ùÙ ªØª¬7´âûÖælã—ëõàë‰ <0›~A"gp”Ñttö@n–âãïKÐ~o»¬Þ8•c@32s€ÄLåKIý5êÇŸf†¼vÝSJUÞnå­r®Û¹OSŠÑ@{ž¦ép™™ ŠªR a$fa‘ÛÛ3¿zs3î÷ (NizýæfÇ›7o³ò1µ£õgAUyš$ƈ„ˆ I$«N  Ù¡²ˆ¢lvlÌ"2Jˆ&ùOÓ( ›Í@Hqˆ9*CUÆr„¡hÎuR‘÷ R¶œÑrÕ¯=žRº¹¹ýü‹/?ÿüùOoùù­ÞNˆà3"R¸ô4Âû?Ú¦>ú˜(ÞÜÝÆa+,·û=MoŒ# IYa@ˆûý^ÕžJŽWW»»Ý8<û€%½zõjJÓv³}òô‰Œ)QÛë«1MûÝ~!±YG?޵l\溘—µøO=ÕµS5§[g .èÿ¥]Ú¥]Ú¼Ý[Cð‹¿ÿ·U5Ä`…}WaKDQlSáÄ,“Xù"B‰P­ë`€Š¾_*ò¥]Ú¥]Ú÷ÑÔ-ºõhF:Åý|­®3T¦€ G柫”9|P«ÁªºîwÕØ%úÎˤlSNÔ”Kÿý¥›ž¥: PA©òŸ²ÕtVî­¥ÃL«Žë§¯ýÆç µ³"€{T+ˆGàØ]á¸;ÙãXm­'è*ð®7q:æCåðÊuþÌ÷ßýx,<à,‚¡‡éWjfØ¥ÂzyŠ+ºYmï={6ûͽ”€¿éµ‡tõþhЇó°›Ç…ï>Î<¤cÜ Úãú–u`q®eÉ\>º ÷ðøÑú@çYÿ¥™Î,x6ıçÛyè·3Ñþ—þYÃó!ãó3ú†ì‘§¬€×àãœÍÛaßåo:Í’`°»ª¥=ú,FÈvTõ󊃢¢z¹=¶ó&÷‹úÚÞ •ž vê’™Õ]BåBÙ§ågJÎ-W‹øÞÓüüò5{‹".6ÔYK÷-ê௙`¥WKuÎ{¿5 ‚˪: J¶ý²Äee·ªÆcŒ ”Rš¦)¤iØlb ätï o8u/+ïè/DD ŠFiaÁ¾Ýþ0 ƒéÎØÛùUcq HæJ$ª°Ñ0w¯÷‡,ä'(ñ¼•™Èæ¹ùLmÃ`žCÓ—‘²EÉPó­%4ເì!„AµúæàxÆ„[ïJµ÷†¡¥ó*"Áˆ„‚Ùût‘¬QoÝ‚µÌ¢ž æ ‰ö„›ÁOfö0¡_)´ò‚VTEæ8Ž#  ›,‰· ÙD¤àúŒK(¥5¸9«s6›Ä’8PM̯ÞÜ¢¦q"bUÝ2G!;ë×on¦Ãx˜Æ@´Ùn­öâ°ß›ÄQUSb§)F%!ÁÊj”h5+|F ±D/ Š°èfŒlÐòŽ3ŠËЧ²±ä›q €!n(„â°\Æ}ËwÈ߬`®ACʼn(Æ1 WÛß¼zý“ò‡_>þüë¯öjúé¼Þç`ì6AßßÐ(°ðé&î&þâõáêÉt}½‰ÃÕöê§t·›’$fޏ¥asõáæj#"ã‰uKb”È!¦q|µÛo‰0„qJR²¯c6›«Ívzüøéa_¿ºÉ^ÿFø`?ÎTÿ‹YÇZ5œkN¬êövú/íÒ.íÒ¾±ökùTLñgÿÓß²÷Ôoü•ÿüÒW—vi—ö«Ù°ß§1:…#h¬Î„lŒŒàÊ¦Ä žäz¾Ž°c3Ìíòr Ï7Èýšy/ <L_ñàò\cå8I Ø1¼yõê^2àlŽó7gu~QÞÕ}¨»Úø-ä8;”bWºÎ ÛÎþpÏýsôö[n<¿gèĪÉûêëÖ(\«ePP!D€&¨éáͬ³ˆ(Q³ý¯PÔecÈá[ØF ,ÖÍF8ˆh4ÊwUþ£ v·…3Í)™•€rnT¡s$¢•!Ê;ÀY@÷·š÷š÷ùšY´ê‰ñ®ÏŠ^¾½g個Ãð¿Ó^>þ•‡‹ß|?-×l¦èW‘PG[¤A™yÇišÌãe»Ù‚*ª€ "W»‹ú€HH±þ8À!òTâ,Z H6/ׇ}R(eû'Cðs vˆ!”ôÝ±ºÚW“y<º~µÖŒÌ{†L¨…¦TLÛLönHºñ”mv ‹·úƒ®h(s$`©z.&·Ì;„ W˜k”*•Ê%”úiDbNük5¶YMß…>n¡œÌz,û~©Ör”ReD8Ûî[Ò@ÞC݉m(K=ò0¤ Ó”†aRâ”81 㔦BœÆi·ßÅasµ½bUffƒ­‡¨ÅÑIoonvû¨!&–\Ž š˜YäújC aC1ò8ÚÝeè»ÝÀ"Â)©ê0 SJȼÙl€Y@QAídC€”¤&ô†@–‚Õ0ÄT5¨R¨w¯õC“Ü[b€J j†hX,$Ýí 7_=ñé}úûÏŸßémâD HxžnB’ ¿ñ?ùøÃ§|@„ø‹Ï‡4ò­*î¯CŒÛÇWãáH¢*€SJ,:l¶¢‚HAoïîRb 6ãëEˆpJ“- âaJã˜XpØl@õ¶òõQÓÌ«Q\&y+GPŒV«¥,Îe>j_pÿK»´K»´ïºýèßù›—N¸´K»´_ý¶tDÁ•<€£˜—Î@—ž¸jý{w8¦¦ï~ã6ìkÀjðjÀ<–š‘Bwx½å,R*p†/PæU0³}/¹”ÞpßV‘Ë$€UUø±Üàs°W\¥|L ‹`Îô‹Ü#¬ot"ÌT¸?"¯‚ètOÿ«v&K‹ŽZé#ô6ý¶|;+ ¸àòØ ONxþ¬d]ÕÀ°ÀÖ †³þgRdÛ<}ÿýz$¶û›7¯ÏÀŽOEƒ¼] ax°^gWAáá{;¼ÇptÍLå\ÀÜçnŠG¬‚ï£Î/ðn~oÎðÿžÏæÿ.¾öÐÏåÍDÁ= ³²ðNøæºãë+ÚÿwÞ/µJn]‚8\¾}eÛW(Pœ™kr‚"RŸŒ> Ù™ü@-ß¡òVÅjs¤Ð\Ð;|Ç_`?ˆiÉG˜eô!ÀJå+ŸÀY`Õ·õºü_û1éÄC=ÃõÝûÚûK‰éi¢à»%TÉ®.DbåÉ KUi¾'„hÈw °µhSDVXGØz=@͵_D± ᩊ°Wia-è>(`¡#bŒ¦g‡–" bb|ÌûŠˆ)%tYDÁ \<ä_?€Þ¿¾JïË‹E”Q(–*‹!EqÂuv7™œkaG¨ 157Û¿Á,_¬£˜ˆˆ…œ4\^Å,Ró,  F#W¯ŠT-ƒjòÐÍJZñ‚#š{æä=û*C ªæá“ë?æƒ AóµWDœ¦ÉØeNÌ\¨`€$¢‰¹f Ñ8އÃa»U@ÀasEÂ0ðþnÇ"SJª‹Ê~¿…iš˜…!'Nœ †Èˆ‡ Å!¶›…”&Â\Ÿ*(h¶A1Ĩ)¿Q96^QŒ˜/ë”óDÉnqV$©QT¯7Cf D1MB$ 1€ Æ™™Åï{›ö¾¹y³;~öGŸþüÍ…>{-cÒ;Æ=H ñÉO¯)P¸ á½Íp5Ð.éÍNž}øÉû²ÙlôÉÓg¯^½N‡ÛH11?yïéÕp%ABˆv•Cˆ!§¤µÒQñn¿{ñú·›«'OŸ†a ¢‚HñêÑ£4N77·£±l®mîvmØÊA/¹­— „Î6®½Ò»ÕáýïóK»´K»´K»´K»´K»´‡[ÚÁ£xž!}ÕÝr¶ŠZ®ûϦf„Ïìö]1 ^Ca…YÁ…=¶1÷!À9Ö¿z„3Øý쀮ÀTeë)ÄF­ÈQœþ˜3ŒêihôäºæŠ£‹Îº}^ðñ$žÒú%^nÖWT¬´ì¿$€‹§à ‹jqN"¿d_a/NÀñØ'±jg.§ý‹ÖîùöãÛÀ“§Og7ܾyso¯¹ ×™S6A! ïzïÌŽøm¸„sHf]ÜQz$¤÷ž/]ÿ 5òÁ‡\wóïr€Ol°zrhžxâN^©n©yÚo¤…œ?ãâTPG@¬–ø ¢=,jغˆƒæ;͹* ÂUˆr€|?Ôd~‰Ÿ¬q¾µRk•§t•ó_Jqì™_‹ÜùZjt@Q;)wž• ¦ÅämýɇŒµª”Õ'sö‚[½Üµ^ÜS«o"¯ßו+~ü)\–Yé)+ìï¤E;ŠLù jΈcÍC¢ŠÅwÆD(8¥¹)±cˆD¤¬J˜Y•šŠ¡],€ 4á¹ÙÎÐÌ~«_HV‹ Š!„BÑgù¹ïuÁ½õ7 „D"DˆX¸v-,¨É&™/¿$"ª¢o*0³ˆJ=ÔêzÓf•­eW£ª_DÌÜÊÛ†²Â0˜[›Ÿ”ŠR,ŒwPÎ9´€¢¡®E²½aëÖ ‰Sš¦iš|A€Ò±ô”AÄãˆÏC¶£­†Bv¦Ìl~ö ‘²¥~‰¶mDĘŒ¢y׳eÛŠ°”„HDa`@¤Ýn?iÇÛÛ3,Êå”ãPÐbjtàÑÊ/,˜B|úäñöj£;51>"„-y˜B€RÞAˆ,B!DP! Ó4K¤¢9ÌÀ"(Qˆ¹rJÊ(/*J ¢9!ò Ì**D 6›MÜD¸%áÕÝþ§?ûìó—oþŸOGV$Ip‘HâGžħWôx{ ˆ’4`|t?|Jž<™R:Œ ¶××éÅ‹/_ïß»Td8Œ‡ý8¦éúê:" Ûëkaž§Ä1„H@ŸjÇàõeÀA¬Klzí&•=Ú>çæ6õ÷¤Ïל´¥þZc ƒmP.ÚwT¯ )ë—¨ÜUQÌ"yWgqߥ9Õ§:-Ÿ·?¶Õ¯ƒ*ô—Nfÿž²ÄYüræ²07ýw›õ¿?–Œ=óyB¸¿57.®³^|üäI< zw{»X–j¿æÅ#ý1gbܨ¾¥kÐqÿ¡Ç5{“Ëm]9ÒoÃph Ó?çϸÆø‡o¹“ÿ;8¸éº¼9þbç3 ûö0é|{QðÂÿü©@ÎGZB:g‡ª@ZQ€(gaúPù‡šó9Æ•žb€–€XÂiº2„)Û,n®C¥ï9UPT†Y´€³,Ï>zš}Dм×rB€PÙŽ_B7.,U¤³R¡£(“9á~<ª•=­=xzð®ü÷Òlð{€¶"PΦMÌ¢*ʆ`køÂ ˆ!ú%™STÔLäCȽhîæà-þ‰,BŒWÈ^=Z°x¼c‰Ì6r+5@¶ôT—mÛ?u9«ºpí¼w+_0½}yv*´íâ ÔíÞ¬{@DXÄ„á¾).k—(e}¹¤„*j~/ÕŸˆì€Í£ß,¬k(;ô×-iÃW»qí›mÈPUã÷¶W×!„bLÔÕº@­ª¨ÆöÄçêú§ŒéOÓd1 %É@CŽï¶>Ì<2§ZL«êUDf@LÌHÊÓ8!‚ÅïîvVa#ª’RÚíö1„iš‡CjSJqÛÍ6P@B‚)1²¢B ÅC)>à xÇãÇ×»Ý!¥;¢CDD†f¦†h¼—ãõ£+3üQ‘b­p´“2*„Fƒ(Ñf»Æñ “ù1Ùy ˆÂ4iš¦ÄŠÀ‡i<ÌmêçŸþ"n6ðÙ‹?ø:‰¢r ›§ áÃkÜúðQxo‡!ÆÍ5aؾw5l®†! Cæ‘q»Ù~üÑG»Ýôæö§?CŒ···œ)³( îãÕvKÌ J=}²6/^¼ØÝíH…(¤)â~wâæé{O?y:ŽÓ0ÄÝn?¥‰Eó0틘VÿÍ>t–äGÙ£y'ô5ôÿÒ.íÒ.íÒ.íÒ.íÒ·ºœBoU°;Ÿg®ÿM‹«se?ÎQ+w¶ªýá\^g6>Þ¯_×ðë~oâóf3þ¥§=gfI% x¾åüx–nH*'½}í!€¶:çñ¡s§üÇ Nû¯\t3¶¨(Uíá£è–àñƒÔû¶+Ù(Í #(ÀâèúbÅãîcEÀy³ŽãWJå>¸ÿ~äQW"1°ø«Ãzqo{uú«OþÕ'.¾ïÑãÇ]§Àîîöì/Ñ3â‡ê"=Ù IDATyz QßjË^øüM 膱Ïm‚z?8œuº œ8^\ÚÙÎxS o´d¼ŸörFÄÙ h_耋þmìžzþ+]‘ÿA¤U³N©@9ËÈ0Mô $,%bH¹ ÁúÕÒ_ó "©¹D@yMT×þ¾à UdN´üòBÍq+_XsêSŠª Ø\Xî±âòÔûÊ•ox¿+ µaHq…Ã{‡mlùư–1𤠄9¥d½@DÐü\r¯/{TPH,Bs™DFð龄Hsþ*¨• ]P-k@;U†ª²aý¥kìSÐÛÜ«+-è_*í™4Às0Yºˆ‚Z°-¨Tç"oL¤ ª’W.ÄÚW#"b `ùÅV  Ì¢R vr¹C1É15½š“¨Ø©çœ^¤v^èü½¨ 1µŒ ëÒí’õ0ljÜ‚hÁ.±åôÖ®&WÒQ«"¬_-êâ°AÀ\„© Ùn¨L"Øÿˆ i"W\“$ñÄ< Ã4ñîî.q®0¾g§Ýa·ÝlÇqTU&"“ý[³]wû–@!ˆªÕJ¡á"âÀ··;Uyúô E!á@ÁjEÌžH8g!  KžŒ ›P" =c°Ž5¬?‰D›#‹X&ÄtØ…#mDe?@1Ĩ,,üÕó—¯_¿'ù‡_N1ÒÏ^ÉA! ‚âUÀÅ?± _Ç'ï=}òäéíÝîp8( ` ›aØl‡! KbÙïö»ñ°Ýl†q¤a˜8Åaøäã¤Ä,²Ýnw‡Ƹ9Œ¥ 'd…s š¦Da¸º Û«G 9úøÒÍ›[D¸zt½;(FÒ°ÝŽ‰Y$n¶]IÝZFN3}[¢ÿ+£ìÅÿçÒ.íÒ.íÒ.íÒ.íÒ¾ ôæ5øºn6Þc^¸ð6ñ8ÂÌ øÓxýz n/u_bîp¼`ùÕæîà&]+˜«sJð¾ÿ…î9€cvï~: ’£ëûûU0—]cµàˆcz©è.©@osê~”¹ÜPX<Ã:òx^ @N¹;½ h9`]GÇüÚ¿ë+sj2­šõƒyõ0DNýœõòüD1ë“_7CüÏÁØ}wHõ¹ž=kûô'rýè±K2ØïîNßÌ1nÞ‘ï·>™}ÆÀøÖí-È€åòÿtÄï}À€ŽÎ›ùð¬˜ÿhoa2ÛoCÞ×Â{#̸8šî»Ú]Zï¬íϳâú=¬…âZ.‹? õ& Ê»ˆ*á/¸ÕF÷_(૚DU‘´šÀk¶íj^ñß'ÊÄ´„ÈþÂPbu¨Ÿzlˆƒ®ª ûÚéJrdå³ï VøÈ“ ν|îîg3XücÅCé;hñÏÿËÿR6{‘ìücFóCbŒDhJêŒ\ÓkûÁŒ_Š/vD!"Ë ®’ð”RÝ nB0qy fôb[|_MöÅ??ú7f¢8´äëcŒqˆ‘ %ž¦©ÐÕrË"a‹Œ»¼õõ¤¼¹P0Ãw…Äœ8©*avÞGj&9u'™{ðV^"ê–šs•Í^³Ù 1&>¥dÝ^w¢½—VÒ•Ùù<ƒ™Í‘"AaYÚÅ%£jÐ~_{£vZÉ `Së×K(3š{Ù›,¹(ü-:w½=û¥Í5íÈíðŠá“–ƒÉõÕ‰ˆÊo4û’ëfu§¯`%&Zîê’;KÀp®'µôI¾a˜ÁE[[ýD Ak sš&V‘¿óßý½”ä§/Ưö)„øÅ­\ ôÁ“ 30ãéƒÇôãgW¿ö£,oînYãÇÏâv‘÷Ÿ=З/^Žãë$òìÙ3F=þöÞ´Iv#És÷@™YUwk²Ù­™ÑÈžFú¬Oúëú/2{ÏæÍÖÍånµä„»>Äæ±™Å&©¦|Ú8u3‘@ ˆÎq?çl­ÅÓéåpàÉ^.Ó×ç—¡ï{Á–Œ°%c¬eì::-žÎ—n2ûý¾ï»ó匜Ø:£€érúúô$,øÃ†íîû>Ž—‹éŒ1ý~?M6ø®//í8¿bâªk¬±Æk¬±Æk¬ñëEK£÷JÀ¬Î…« €¡ÄeÏy‹æ6µëï2šìLõ®Ëw 3¤ËZ² °E É­€E®7 ~¥tH¾^.P°:çSžW¸š‰€¡™=s‹ЇÂTÀ D¥Û¿½š%.¹Z‘†Æ€µWzƒªD D& ~T™Ïþ@Ü’â^äòTË$."­ÛÍÁs²l\²Òò †Y!#¨…ÀâQоŠÿ¬w5lwJ·ñr>U-i*½B(´þ†”|ü¹?ùÛ¤K°yÕs'Ö#.ý³Ê $é–þ4îþi'2Wš;É'þd ÚŠ ˆ…#DMh'£Œ©R l›!ÁˆXéLåeIHÙé­!EE~ ;—øwPp!BB—µêô*\>2ão¿gVïFeEÓð!7› Û§ìûÜ,ž¤_Ð{Ø`â\Kè@¹Ú`ªRlºšm‰ ùâqòY¯9|/QQ0¿Mgoˆ¦ú?åžÀ¿utÅ9F4™½¼3ñõYçâþµ€΀âmæ÷ RÜç>Ù?LÍÊiÖçV£ÒÊ ³ì®kÈc…Ló¸Xˈ6å ÷0ö7qbÎ\ETãs9 ÿ¡+J ˆö²0r”>Šùjªç—¨eЗوwÇÍnסæû_³ ‘4Pt—îv»chºþJÄ1}ÅLZ·Á©'ct ¸ä¡{  W2‰™å07RùW³Çºª1+ùr ¡0ƒ §ž©}C\ý”€Ì©y¡ß&9yÎPêD>1†‚G68Â…þŸÿ÷ N,ÂlPv½Ùó¾ß=¼y8/€]·é·û-m÷ããÓóñÔo‡¡ï꺷ï>œŽ/ÇóA.ç³u›ínw³5`:2çóh:Ó÷CßuÇÓ™¬µ—ÑNÓØuc€EÆqüð‡ožŸŸ>þôÅ=/îïúíîéË—/¦Û mL×u]GÆ Ñþþaš¦ÓéÜšÔ°½˜Ï>4¬Ðÿk¬±Æk¬±Æ¿FHžªŸÃÞ‹IüùÏe® ¼DŠ’`ùJ€å'á˜2) •|ó51d‚ÏçÚ#€P2]ÌX„:ÉZTªì«$zÔ‹SCÝeNhîÝaVûoDÕÑ¥*Z«òL¹tA¸5(CÛ!"”¯–UËoI`×=߬ÿ¸nW}}ceH]„â á¿¡ù"Jª¥ —Ãu Jóg’½Ýߎ‘ß28u€,í¹Ræ:P]Ì öÃ唂ÚÅ­¾}›×vÃí°c3Û9Ç ×zlA®PÂt³ C…V-Æ™øOUú?*6½¨”ç™’î±ôF®lü¨AÒmó– ú¢ >e÷=yu`@riöQŸâ^\™”O“ÏæOMnB@0ù8kŸ±šDÀƒy5)Tß™¦ †â åÃ’úP©Iìm žñ¼µZ’¢z$o8€˜±­ ŽÌ fn+‘¸|'Ê»ÅTn¢”Ûg¢š3£êÎù­™€4Äœl<ª­§6÷7AÎKü˜…È)±ü7ÚýqM’–Ë‹‚ž3u𦠀Duô~©"r 1n¼*¦Àž±û¯ˆ¯ˆA4jEJ€Ü3KÔ/r£3*:£ÄO¸] „€Ç(R²"5—éôyÈ»£î%™¥bÂ=mÓšO —sïs\ÔÏC… ¡!ƒ Œ×Õ!sO³9«¸MŵgŒ©ŸÚ÷L”2ò-BU?W ³Øl‚@F‡ AìDØOCÎ6A¢33 $5*"ÃÐ-2†ðaØÜo7–Åô»ïþüOŸ¿>³Èþþîëãã×ç#šÍþî½ /Ó$¸†ÝÓó³#r»n°‹€eÁívË,–ùáþ¡¶‡ãát:u.Ó4l¿>=OÓt·¿;ûû‡Mßï†Ýç/Ÿž_^Œ1ýÓËK×u»Ý~ÓõOOÖ2X–Ëe|ûæÝv»=_.ÇÓé¿þòý8ŽoÞ<䎥þYMöά‰k¬±Æk¬±Æk¬ñK.âhêe})ïOš[ä6^$åf¶Áß&jèßÁ‹’jûH)².¸Ž) —N’ )x¹I‰DGt¦Ü7¹w0 í‰àœhÝ›ä7À³`7,‚¾× }¡%ÔpçeÊmen`pþn~•ÐáÌQ®¶@&kg«ä"ìP5)SË+À̘i"õ­ŽÈ@²›z%ߟȼ  *4 <µ8´ÛËÜé\ÙìuýSM9QéJ»|•{q³áõÀ·Žrí+ü¹ó3*˜'ßÖù¯±þR`¦{f¼ç.wœ#ȵ­oõ[ ^X+{>·}­W* ´Wª‘Ÿ'™þ@~/¢ªU˜dšEpv±Û+¡™¨N^HW¿MD:¡Ü^þ$µz߬Ñÿ²Û_û³X µ°u§Wjwîö¦£jú¤­˜¤/.W´ÔBªyS'Á¿±@ÿôÆäö+€X_«Ùò·ÀýpsÀò¯nØ 3j­ýÛÊ_ôgŽp|ÍÝñKgé½JOhñFQ `ë^Ä-KÉWÕ(8³Q–P;‡þ×í.nÕNÑÞkþcLT‡B¯có“í°2×È÷™vî[ÃVL§ú!®N h”‹ øL|T¼HâQtQòGþ+}ŠÚ98þKüRbÖ5’)DþA$0—åw¡F!Í~(IºIô¾Ã5®-µ÷P0'°1¥#Îx`¼˜QqAÿGÚƒ&,ðöÑß4 ø­¡³®`e3iþ6ÑÛ$ÌŸõy[ ÝÞÝB'¡Z`©¢}' Ì^GøØ˜Ò„@ÛGTÊœ$DFO$h›b®wž´ ¯wÚˆˆDÃÀ‘”!.IoGSÿ6[°ÃŽ)×buE Wä§Jò,6»iƒ#3Å}µ¡MoÁ¤ä-Qê®Ç¢ý¯3íeËlXÈ•4Pƒfȯ` ?ó ¡¤ÀŠ“-#^‚0T¼Ù#‰S/‡îD°º ayN®Âz=«xÝnÍ`é“bvšR6^M"ú¿ÿåÏŸ>=tÃÝýÙÂaœ°ã®ë7Ûáîþ ‚œÎçË8™iœ6C¿ÇûÇÇÇa7ô}? Ûí°ÛnwæßîöÏÏO‡Ói³ÙÑéx||9|ûá="’c6C÷ðp¹ŒÌ¶ë7çóôüòr:ŸwÛÝx¹X†ûû<žÎB†Œ€eêÈf9O|8Ÿ¿|yÿáÃ0Ž'ÓmˆÌv·kùò¬±Æk¬±Æk¬±Æß[x\€Ef¥9 õ¢^ ›s;Ÿ}kl"þ3j2§÷IôIšóÅòÂŒÀ¢î|ýn]!•‘¢XÒu EY˃n¦2ù˜þÈŠŠÌ{ÛW$Ü ¤€Æˆµh:±6Ǥ~{›pËÞ@Âe½åˆ¡Cæa³%“Ø%Ð\¹ÿê:ƒ` Aìû–T÷%rVÁ2ÏCÜ.“¿h+’àÕCk‚hQtNÔn%T€2ÄInZøz]yÕ¦ø3ôËfIâ˜eÊ–éÁ%ž®2,KX|¿ þƒó… ¹‡í¼Õ°ú6=³º=ª& aÛâmI³óS­%Šy–è±{r¸¡r,ˆ:ûÆããÄb^GÈ OËëÚˆUª~hi*]lB@ˆg4€lºì†‚°Ì¥ ˆÈÊS²I©DŸf:_Š2™ÏI]xh,×ó·ÌUŸöl sÙ}j¸Ð°_5’@ƒ†Ñ¡¡·‘ÍPóa#È>w ¹çsÁ"Át×É÷K>ffcŒÔ‚EÌìTZDÛ²ä¬W LÈ2Œœò»½3­ç 6]ç꜂? ‡ ŒTW¸JßxËLŽÈ*lxsâa.åœæ(MÕ'º«›eÐr*N!AàuF½ÀPiøÊgÙý/š‹£LD rűÑ`"ˆãÄÖ²+ª©uîÔÄh3®ÍÙ!V°D¬^´î¿ÖåTÙ'º»"AUÖR‚bnÙˆ}¢5‚Ü™À?üóÿ.æ/Âüùåp¾»cL'»öýö|>agΗË@Ëôô|በ@v¦ï†ívÓÿÃ?þ“1Ýùrþüø8Y{÷°EÇq;Ú‡‡7ã8'@è;#‚}?°À4Â8N?üð#ûÍ€HˆÆËšÿ<©yeúø­›é6K/h@† ØéFdÔ¹—º„l34üoƒRIP„î.kyt ª*d ÑG$ïÛG©éÐN2¯œëp@ GªÝ-HfJù[ {tZ”Ú~`î‡j±¤5TV/´äŠVÏl€Üryo¸p?lW­4^.7£>æóâ¯Ø‚S¡Dã’ú3¤üb IõM4r”Xt[ŽÀÙØ˜§jSê'9¿"*Ó_¡ç:O—‚ò JšöÝ à» U‚®TÈšÀN‹GÛE;yo 'ò$”ä’_»pǡόGÜ$6–Ǥ…„aàÙœ˜Ž¤ ƒt9üÔªX–8ÿà•Q$Œ¾I‹—»PÕÃyM¡k#EÝŠRé¿]S-jÜÌIº®Ê-h ž_3:]|¨ï+_2C×a,×SéöÕÉ¡e!ÊÀepÎÞÔ7ÂÈXJh…ÑJˆ“µÖÚ¤G„˜÷P‚ѵ¼ ‹P†Ìzœ2°ZÕ¨Ú!Tw#)·âúži즗,=?u Vò5XŒ+ŒJ«^úÌ!á½ØC]$¡/äÙôÁ~™ ²]/Zºà@ïMª•˜¥H&ˆˆ!󀨛%Dj/D@˜…¢’>9múx}9\b«Ú;Jââ*Þ±Ü'ýüîŠÔ–œŠ ¨/ÓmY¬@^ý ÂÑ"ÚO+Æbaù#,Kª¦’È2ÀO/‡Ëôçÿå»û»‡ÿñoÿöþ›oúñãáåE.v€¾Ûtèp3 /Ï” íïÇãO?}¼L¿>~µ–—KgÌé2m†áÏÿð?þðãh­¾}ûa/VÑ qGÝÝÝ3óãÓÓáù úóŸ¶û»ãñè¦f!æ‰/#  &˲ßïÇq¼L,f3X˜ÖXc5ÖXc5ÖXãï:Z/è¡Øö‰ ›«ÒIµå8+žá|³·ðB¼ ŸÓ¸|&§ÓRØÏ>œK]oxœbL\…[ÜwUÚ{ÃÁ›vóâ6ú2¶¬’ɉJÇÉVµÍr›ª ®Š a‘|>¥—%¦KmK U§ØÃŸW]ƒkÇi¹­Æ°r™Ë4[H@dK§úµ2ÂÜ–3²B³9þ |¿Ú¬Ú敘Z‹|ft¡´t€už¤îÉ$¼ûØœm–f•¹yî¦=H‰ ·ç˜[½œ_1—}\¢á8«²Ž‰¸)Eÿs`Q´Å0]âkžÀùàQè¿>Nrþ•¬½8;úµ…t9CòøÍá8È• EòA¬ ã•°' ‰¢‚Xîåëî>“Ö¿´ b1r(žš ‚ñJDîÛRó$–DðB²¿ª²ràUe iv™Ä…;.-¬KÐ~)$ÕbjÈ^aôš®m- ,Ö³ò„ߨØûKD;Ü´¬‰HçØò æ4Ü!ÙÀf÷€Ø+Tq‚È+ak÷_Ö€sE3DDà"ÀÚ6Ùç5BZë&lPc•YNDÖÚh '—Ú ]-‘È[§u‚µPL¡#1áßk鈠‰xM­å Ò%_>ã$4µ¸ðÃb×ÅóCè0‰‰ ˆèª=¢ŽS\k£‘r<º³ø%DC(‚ rÝžÙSƒ@Õ3±e!’‚ªeÁ8ÿ $«0Cæv1ä1]k“ƚ䋹lyoe7«bÉ3ct‰³ËñxÙîïîÞ½{ÿ^þõN£=ŸÏ/‡Ãn¦ÉƒÃvwz|™ˆû¡'";ÙnCDt´Ùù IDATmÖ¥îs+¢+H4Sb­ ½í‡µ¬›OJËE“ƒd3ö£‰·ÿ¤F%ª¦@×i@Î0»T}qM9!PYò…P¨ÊeJ¢ŠŒ‚•jRÈûØîöüî»———/ÿö—‹Ýôý7ßþQϧsG8ž.—É"÷öÛôãt$ÓÙiz9E„€žÇaØŽ–ßøæþþîñéÙ õ}?üå?Ÿž-[@³Ùl,Ëát/S?ôVàt:}9\¾3]‡fKô¦ïß<<üðã?}ú2MS? »Ýnba„í~>_^žžpÓoö»Í8Yfy9¼¼y÷a»»ûá§Ïë«äk¬±Æk¬±Æ÷Q ,ù;_D®äÙ7t~œ«ÓœgÀߥšé2Ñ›ˆÔh¤£NçëгÞÌ[+@æˆ Êä)ŠöxÌØf6u‰ƒšP®ñ‰ðM¢%T¥h°ƒÑor[Õ@«»4zu=”ÃÕ ‘àí ²ï°aG/ì ßiËÎÃ…t’Â×’PR¡Yߒ虿#|ŠÛk´wn¨eI˜·à–tú–op±ÃE`N³eF·ÿš#±º{Ù¿uUÄÜXÿò™¬}ÌqYF(ËÅN–oWA–™bsk‚ 拹>´üDË¿•ÒFìçêo¹ ùu/½J¿P–ˆ¹¤›óãušü“pÊîdÅ'õÒWü½= •¤>‚ñxE;Qÿ%Ìæ[‡È‡[QO³â…ò+‹( ¾Æ pMÜ@Å6E¾3ºÓ§Ú‹ÅeRòÒÿ'9AÒ%X{”V:Å‘Jèßáš°\BVÞÁÕÇ2'ÞÓ!ÄüöÅ™"Â_— è<:JHA¨G+×G%u ^_å¬MÚŠFw@m’¶gV;D-…¯õ ÏšŸ—¶÷B}¢Ê94<7 çx!&àc—#0m aÐÁC@BbDŽ©îÂã®›]&Á,Z—>þ„<ýwË'ƲOü§!?_ÔL/VDD:Dç£Áî:þNË e=)Y¡F5u& ·NÞ ±”$*Å퉈Y 2¦9¿:žï1…6«²=·4›t÷jÛ‚0ç*9 m'Wež :G¢`ËÔÒ€ŽóŠ]áþ'Ùß=|üôå/ÿõWøñÇà4Nçóe·Ûowûýþ®ï·Ç——ãåò|< àv@ïú°¿»7džO§O_¾c6dºÉÚà݇oŽÇãǟɘÝ~71o6Ã0ì7›nšì—Ï[C]×ÀóËaÓ›a+€Ì¼Ùl¾|yœ¬L“µ“}ÿþMׄ=ý…sPJ.]•0!×Ê'HI™¨9É]qc*Ç`L=ÁŒÝ˜œº¢Kö/E š Ê÷‚?uÿ«‹‡¨–6]{¡ás ‚JÔ´EÇÄöˆ5 CÁñ³ !ÃÂ`…arúE"̨´ƒó,^óÈtjm™äy˜{#ÏKöSš ˆ°òpe ÎP ¶@é;y¦“³ºö€êç…íAÚÃä•_;(} c#5ãÇ (‰HƸÒO¸.bm;Uz¾&G‚µ/ys÷ˆÁúÞu׋ º¾$½³ªJm¨ãýøéËãÇŸ>].Ó4q¿íúôu´£X–~Øm:3NöíÛwÌòôòr>7}Ow†èt:ÚqÜîïȘÃñ´Ýí™åëÓ³cì¬e9_.¦Û Ñ4ññðuœ&BÜßÝíw»ÿö/ÿBD/‡Ãx¹<>>í÷wÛíÞZ± oßœŽÇãñdˆÆÉZk7ý0ììùtÉN"h™±Û¼N£‚5ÖXc5ÖXc5Öø{:qOªsùüC¨|Yµ³`TFu—¥Mô¿ÿÉ<¤›K‘hxö·¼N/E"ΠXîªÔaÇhG^çL²|,áæìÕ:«H-e¤e¬_®¹,¼&ÄZ4X[I¢¿Ê ¤ÿKUg-G‰¬ûU÷6ÎZðw£¤‰%WžÏqŸ†`²sðVƒe#ª ƒÛ¡ÿÖËry8µ7©zýÔªÇTQ€5¶A@qÙ‚Rqì ȵÁÃH4;ðÚ;¸ô)¦É ”ô&£ØlRå.€?c*ÎÄÞs =YsâÌΗ ­¤üƒ›®ëÑÌ£ÿׯJ„ìækóæl@~¦-;U©œ $Xƒ;ýœ@a¨DÔR¤rý”Îäýx…¿•6‡[†[\ÄÕuåÔçfõÅr¼&šöЪ³ýÓä†å¬¥ƒ FaaÀi[û[Ñÿ( ÁÝÖæõT>³ .¬²¸xÍ%þÿº@¯Žšgcu’ë.†5³uíT}4öíÐIÊíjµâ[|fb¶J¾ô®)» ,„ö×âõ®1Å›½„}äñÒ=Y™ÛX«êE’T‘ÛÎ ¼ˆ0²°ˆŒvJ.Q' &æ—ÖÂJW']_èçºÎ:7Ý$yì**ÔUˆUXÉ(ÍY v&hÎh:ßß]ÄJ¬É'îÃ5ª_ÝéD!¢/þàlƒ$BŽ Àø¥rŽ€™¥4ÞH讦û‰k «—«2An–˜ÄSwS°ëœà†—ËøÓÇÏÏ//€H݆ˆÞÝ}$yÿöí—/_O}¿4Ûíî|¾LVÎç‘™&;Nrÿ°ûðáýÿïÿcØ 8NÓ8M]×íöw/‡#Q7lwÆÇiÓw›®ëº^Ù°ÈáxFD¤î<ÚÏ_Ÿ¬ ézk™ºníå2m·Ûãé2 ûwï¿ÿáÇóùÌ®‘:¤Óùr§Ëe\ß&×Xc5ÖXc5Öø»¸kk[xc—Bj8¤mjŒ,{I°"×)‹›E EÊ%}¸wÔ8{íì÷Ákm&Ü[RP¤*/F“€¢Ô@$?I€ Î[%K—ñ)¬—~‹×ä€dæ¬PÉ Õ G¬; »pòÀ¯9S¾Œp¢Ôî¾¥2~ý曫+Ï«Á53•M¿ädÛj§×¹]»©y5›–óp@`E®M&P‰ç®¿õþs¡ p™ø¯eõ Ü ¼ÒT ûa$pi‚œÛ.tµb°Þsô¬‘w_ÿ3ÖÇâ‡8;òg3úKW­ÑlC‚R¥øiè n$“¤„zhsÆêôô-YóÂY ú9?Í9É©6eþ6¬}•vQT¥÷i¨Ü(3ñ3q'@„ʹ7QW…ÊÄo«Ÿ›é«K­WÛZ8ªú…Nì§v’ÿéþ9lX ÿ† ×|g…ʉhÔè¿ÑcŽH¬] µ“t;³²ÃÍ‘2Å=V–°“wŸ“ç ÔcS5…Dkïàê3/²ìu_¯aµ:CEYå!¹±Ë @IF?‡Ñ.ß«`,\ˆô°û’qš>2Ns¼ñùì¶8íÖ«Qu•TÌe÷K—ÈÎÚù‹EKDXĨJ…Ú%xnŒª>Š€É}0³4©]Zs´7ú0®yS0„ŽéöFÄ"M2EúAuBÓ–9öªck2ÅžÈ䀻â…D,Ä«M´",`ÃCE&<—.e×}üò…­"cÈ Ûý°Ý<<¼k§Ÿ>N—nsÜï÷o·ï.“eËOO/líþîîÍ›7ݦßîöû»;W¦`YÆÑžÏc·ØÚqbf¸»ßïvûãñôÍ7ßî÷»Ãñ4^.ÇÓ¹ï{w­»MÿõëãóÓóe·ÛšÍýÝý—ÏŸ˜¥ë6“µßÿûˆn÷;@_¨Ñ÷=’DZïûõmr5ÖXc5ÖXc¿û¨õ!{êG¹ kH™âsïà 8²üKì/ÛÀ«BÏbšÚ&÷zDð=É/²‚¤Pqyc\ös›ֻH™pó[€YoäHTè-¡Þ[®¼ïº?:ܪÔ€X›»´óõnèÕ46/o§>™`¾ôA2% ¸ ×®k) ̽32Ù6ÐÙÐÔ•Ü%øJÎ\SlGCöWÍtN=Ô~­ŸÌ]ßj‡í¶åJ¼d;©*‚TKnÉ$\„òç¾LÈ»Ü0¦õˆU&"ø7$·DÔ^9÷f£¬ÒèW[§F–èžÛ]%•+ih¬d| …ï'm¨úÐq„<÷<*`ÏÝA„œN8ãBr# D„¢‚§.ºÌúT£&~vaò òA‘HT»óÒ!Ó?ÚÀ¸ÿ°¸Ü}§ÿCñ+5íÇ“G©¼‹£y©ò2ÈgNÄÆUpHmy(Qê|z ÎÂås¦í1©éÆ(Ö¶V¤þ’>XùI¹=Î<“ÀÏ»»þÆè‚÷¯:¾UYu §TñàÎ*DÊ©6_ôÝ•0’€`ÉdÆNØÇiÃèëš4ë©ëÐ"£öDxXز³: ðyƒ}5 ñ¸µn•j" #9™Pòãqf,’Í @ÂAáŒlȯŸÕ¤ƒLÕÇq Aâ&©íê7Ñç9ÓèÂXvPpïî+ÊçcW«!¾$ËÇ} ÎÚ™uÜR$˜œT;+"BQ7-ZDt]gŒY|j§£­fÜ“–°±r6먴Ö|JK ŠH a’‰ŠþѸà‡\·(§ôt^÷÷oN§±Àù2uÄ?~º»è6Ã?|üëýµ†ãñôôürw·Áo¾ùÆ3YÞö›ýÝÝóóó_þúÃáxÞívd:km?lÏãåññI6]‡¦;Ó¦·Ï/‡wäp<}|ÇKß÷»»{êúq‘ŒA²–»~K݆È ½ŽÝ0’A€®ë& çñbö»ÝÆtÓ4šnCf%ÖXc5ÖXc5Öø½D%œ€×6˜°®.  ó®©×’ëk éùä"0O€J¥/ôT Ϫ=qv@3ѾhvR:`Aº*'€«@Ûà”@,Ì%4Að›AÖ ”™{Î)µƒü¼˜ÿ8f+:]™6p›~ÔlSéŠGtu>sZùm/ßpÜW949€¹-‹ãÜPÊÐÖ zU™ÂÂfY‡U#AÞH`@W‚~ÒÕ!u£ûîmSÕ/±§epoúaȸ} (/§ã/|š¥ù矺=™KD¹}–Ž% -Xâûù #45‚ª§0á —X ËD œØŠõÒ=¨Î.ÃÁléäøEƒ¥’lA »$/V $CÕÜ’½ö7ÔIÒlÂÌ8‘ÇH§Z„U†÷m´«C³˜CØÀÍ=¨ËÇÄŸê”,%ㆴ°8¿6µÿ7ñ¨oBñ¸¹í-hî rCåSü…æÌø”hL)%èþçè«ÈÄ XÀ`NT‰äÚ€Y¸ÌA(õü!JVÐ@Ô rr4Å“f€»;Gð#! IÞ~„Œ™ð€¾SÞà ëc#ƒæå·nŸÒK]þ؈Ɖð0YËyW¸d-R‰aتB¯™‰(Ü!ß‘41¤zð@ß;™’? îÛ®¤ÀAë J@sXQ&¶l™ˆçÄ`LÐÒvĺ"¯±D³8Ê$ø2xÓ…È`"rЖ‚TkâY›º4œY$? 1Ö«ïB²Ìo¾<~Ëbº®ëúÓét²üÇ÷DäÓçÏçËD@ãþ~ß‹>Oýë_§Ëe»Û].£Û1ÞÝݳÈét´"ÃÆÒļ¿¿ïú~;ô/§ÓóáÐõçϟ§i²Ì Ðõ±Ýn·oÞ}üôÉ;±l† ð¶ß¾y÷N&ûr8°LgÖ÷È5ÖXc5ÖXc5~'³ [ýv_¾46Ë0ð `[yƒöçÈ4Õçø•ƒ®Öã˲nj(%Z W?LþoAo¶%Ÿ5Rfáû[/5²ûC“²·@¨«ÜœïÊ"puÌ×M\z©Ë'#–ì”õoj¶Ï›'!æ4lfŸA`fË``‰ÁDÜ ™u2ê\gqUh˜¯•Ñ(dî’͎˦0¦YR¨ñÐŒæOl@è&™»å³e¡jUfÒ°ÿmÜMÁh=sü:·è|tzÌEÖ;™†µÄa¡M€‚…=„_Åø‰’Óͳ¥£zLf!«V$Í€  )祱b½¡˜È4`Û‚š?ƒJkwÞÖºŒ{بÁÆÑô“´OT§ 6¿™¾|'B OD°3®‡Ñ0Ø Y\jB´’•šê¹Æ£Ò®VÀO^FçÀ½D°^ÓDŽ×áÜ5·ÆÍç§sUTá‘qTžïÑ$¦åäwüã"b(u(×0w]Y¥8_±°°ˆÃù ‰™ÅZ&²ˆ`L§šÏBâÀ‹µZîxÌÌ,–ÉÑUÞIŸ£e&Çph ÿ¬ÅèÜzÊ©š ëÓmާƒH—ñr¾\.ã/Ï/„ôÍ>üÓ?ÿÓãã“~ÿþ½kïå2Og2àéÝû÷±ÚãÓ×GÞîvïÞ½»»¿ÿë_¿Ÿ¦q·¿›&ûÓÇÏΉƒºnCÔívw?þø#"n·[°­ÈËátÿðÖŠ Ûý8Žh:A·êŒl’Ô~ÿp:Ƨ'ÜíîÖ÷È5ÖXc5ÖXc5~Ÿ!m` o‡¹$‡BtÅökÛ’Ã Z‹F·A!>³ªœu…sµ6&±˜^!Œ…Ç€ÇÕýÚc`Q¨ÞsêAÿ¡{nÛä·F˜ê¥Ââ\[X0u"þípö›\†Ò9"@”¥6fªù•-Ïm³#»ã¯—¸e¤l‰10MÅ««†J+7à5k@9¼P+íˆFº“½µhÃÅYÐÉb7ë+Eî¼Z f9€Ùû7;µYÿT)q­Ç m%¬Ü ná•È‚ì"ø3pEœD®þN!ÏAîF£ÿ…´¾v>måÎ{ÜŠì{½»Bå?Š›JArívì[ Ñ`¤j¨:·¹%º)Àå„§£ÒcÊU¾$¸/³¾K–õñ–‡¨Éã”Èí’<"O¨'#'ïhügÌ`Üž½.¶?g! §s£Sž7zJ|«šFÆbÓ!¯  Ø<ŽB#¨¹Ï° ,,jê[[ÔW§jX’*T{¤¶”®oIsùÆÐº{Š[Jæ·üu™€Nƒ¿Ą̊ã(Ã"¦˜«ùÒZk:ã3ê“j¼Ãû•ÿj*Vzñn{…Û="Õ°OpH¸Kå®ï4ýwø'…•‡¬Ë°Àl¶ “؉üdµ¿1Æ3%I)H+Ê z`H:õ–ÅP‘¿ÏÑê6W–—p?d§ã~bT "2ä©Ï&‚†0é«3úãÅ¡{toÇßB^ÒQŒvÎz ‰ˆ$¥Æ;F´{p³ ¦§I‚»‘qÕ P¯XU²@A ôUQõÕ}PÉçOŸ§ñb™÷»=’™¦i¿¿ûúõëOŸßÞíñtžD€ûa{>Ÿ?}ú4Žf1Æ|øð~×G7‡ÞÝ#³ Âé|Ùôf™&‹h¬¦i²,?üðÃdO'çýk\š¿1FYˆ­}~~¶ Â# íöwH™L·Ùlúé2O§?}:œŽŸ>}zxó©[_×Xc5ÖXc5Öø=G0J {öM>KåS™â.©lÙèMyâ µßÚXšˆr†§'!Ú T¿(qy•Tž æyÅùà`Ð'õòpyEW($‘¤ñ«Ö“IêF%òÎ×¾èÐruÍßä|bªè³hž»£Xào”UIÀ¨Ns¼)]½èñ:i3iûmµŸ9Ü2¯µõ Tdö>€ÄlÊCuçI‰}Ñ,´Y£ójF®„çšþ™ v£Ô#)j;q†ð_}oJu‡ÕÈà­ƒ,Û.Ba™î.ÌÍBž«,?k˜ƒú±ôã…ܬ!K]¯y¯:ô&0½”èq¨µ‡çöù½‰yó•„ŽÂK³¶Dô?mD V³ƒ].j@<ã3<È.¡›ò\ø25˜ÅÛŸ Þ¹)òüQ;ë! î“â!ÆçÍ„Q’§¤ sÀH ”p¶ÂÍUÉFi®n%/„óN‘"M-,Åþ¢iqqiôr½äÜ[¢T ÂJâ_*æI -üuë:&¤¶RUÌëÎ%÷#n+•<›FuBÅåƒç­8þL]0¤±Ç’0—˜!lfïg[!Ú=×pt»î,•)€Xf/rQ‚ ';ÅEŦ!äÚSëî]p¨Ëà{hÞùàÝ{UwåŠöqQ¬rvX$wCh\AõëÖ6ÓÕ!¤ÍC¨:ŠÆÎײKéñF$…’ƒì)>g¨N+´QpHÆW†ìN«Œ ëº` ó ?(²uj!r«â/š!&“½"rçâ'Wv…YÕ‘UmcìXß-çóùéåÄ ÃðêÞ¾Ecö—Ë¿ùæ|:ùòUÕÇ€µ,‚}ß_.—?ƒÓd‡aØî·ç#²Àå|þéã§ç—Ã8Žˆôr8MÓhº¾s—&Øn·ãÄ]·±žø7،鎧‹ˆ‡a;|ûí·_¾|a§«4Y;ΰë u€ãÝý›÷>l†ÍúʸÆk¬±Æk¬±Æï-r±­®•¡ß"Φ¡™Íûkm *@ è/ Ziƒ… µývfa•_d•Î|>¯³p-– ÀtV1@YÛb•¾­Õ„2‰¡¼÷æŠ C`ÝžðG•Nélê¼í¦ŒÚ þɽ¸@ÌZ=FY3d\-úÿçFjäµ½8‹}:ÖB+m?3nÀ©y8À"&t.)é7’â Ħæâ„9ºJ¨b9U¶°Ö8~ËApN¼¨D‰% ~¹þ+²^¢¥pÚ®­þ¶ˆƒJ“‘rÝe´Î©^D[—÷3–§M)6…ïê*D `1äZ’> sáÂeXJ !¥4·«ˆ=TRâ~ºƒ(¤´¯)¿÷£¨UB´Z–)é£J·Çtkk‚%ªí«-ÔüD¾Ë³;*GØÓ¹Tc¹Hi« Ê–­l,ˆd§ß¾e%C;S=”©ýºò©þ±=! 8{hæR»'Kr®„1+ÝhËÎøÏœ|-!÷ëFWM|¹î fŠê Áý5Ÿé¢ {”èq]¬üÝçÆ`&Yåg©ôÔ,L°MñÐ ÌL—Ørªê8h×øPD#ãd£ñEHîÀÊÎZŠ3*Ž˜*ˆ$DiIùÄTt¼âPÔ9y³Ù8³DÄ<ŽÑËE@O—¤$´$gnªEš‚: ˆ }:£?Ö4:nô ¥ö¯›¡qÿT²(‘K@ $áRű½Ç²ŒÈ^ˆ÷ çÜ2”%GˆÕ¥?ŠÅ é2ïvøí¿Û>>öýÀlŸŸÜ¨ë¨ëv›øæx8>>>žÏ¤n²‚d6ý@vúðáÃóËá|:â¦ï6›Ѱ€µ¼8ãùbÇqbkÇi"DcÌn·ßßí­ÓüGüôñ§óùŸ'+ˆ4±íd%ÖXc5ÖXc5ÖøÝV’Øó_¶q[Ìе³»"7_—–ÏòÎqÿ,5—J„7ªé—b”–mlÙEåî +ÐP—f#\Ú~4°iéËÊ?žŸ¨Ä‚–.—Ê»œ-h^DaÎM2…¥ˆo¸÷×3bn0þ¿ c&¯H€9K@áé†Q KƒêêOØL¾¼Ã…1 ¹ ТHNùåWÚ½ù Ðíq9”sõ2é#bÉy^v¤¢J£Œ9…þÛ]‹¡â ¤ Ì®O¢PV.´>B@‹LÀµ±‘‘"·jýB)ÇúŠÔ‚?X¥ÿcÊîÆRÞG’D>D‰æbö:Íâ¶Di”€Ám%ÿVS1b²8Åbzõ€B»0Ö6À±Ku>RiSœ®©KŒ%e÷‹UKÃüìôŽœß Qf ‚ 5$ÊëH}…UÞ:d›‰Jó×rd³]-)ý¾t 4 IDAT×iÆ¿á<é^ÿ]PÎ-ýt­¤M^ŠC pÁï-šqQímî™ó€_Ȱû¦èÂek„9ÌÎhÈdP¬h—lÑß‘ÆhÆ7v$jË ¶. UoNI†E@˜€4''ŽÃ[+ÛhÕõ9"¢³ÃñãHB¹ "ÄΰÖ{q!Dí~<£‹7Kš3;°A¨' Zã„À”¸c)å?¢¥A¬xGvݢحµî²¸N‹gçËóéO Ýèˆ`â=²¯DÄuEkÒÏQ¾mÌz-'cTÝ€c*²½ù·?#ð,‚1ˆH,[æÈ$óÞÆRŸ€ÑÃ"$BDFŒî=wRua„þdr%,áT™ ÅÕC%ÇzLjª!ÒCÉôßþñ»¯_¿>ÝfÓ÷ýù2O‡Ï_¾ Ð4M÷÷÷}¿yz~9Î"|<^ö§Kg:Þl»Ît›žŸŸÇq ûûý¸ÆËÅZKdº®ëº €X–ççÃ8ŽDxw?Z¾Œ“éìf át8aOÓÈÃvH›~è‡áp¼œ/Óå|é6Ý›7;¤îr>¡1Öò™'f9_Ư_Ç‹]_×Xc5ÖXc5Öø=Ç @ /ó3¯e>o h(ÌI”,øŠ%‘¥¶@•°/(£±‰·äQ塚yöFWU*è €ºj^Þ\•¾}†´b¦t¿¡n; ûx,NpÓzeÿ¿Œ]@b]Wá£oZÜ©VÊ¥ñMñÏŽ¢¬×[bý ³F» —w™ˆÅ!Dùô6Øô X'¨“½%üW4+2oк˜9ÍÚü@«d7’÷K¢¡&N 4g†Â¡œ7N¯Àç´Â~¦À«çÕÜ]vý¯íRAéÅ”©«þ*¤ÖLü§æêd~,‰ÍŽÛÊëÅî¬Ô‡ªí£G ¦Dñ´ç<É«C¨&y1ÿ| ‰TmÂâݼ‚âÝIó1œE’ö (Y¡äsà(*¯×;¤» ¦â˜‰ê`-LHÑÕ‚jPsT«êàÌ °…é'ûJ;Y"öj¡ÿr®I˜7"¶o¢$a$YƒÛZsÒ’Ô‚[ù«–tN€>Òn¬êÈX˜¤LŽÖìœÖˆÀ>¹š2í‹ë´ÏPX´¤Téç ׈3r#«0^{Jié™ð½š©U³ƒÜ‹„ñîìNÅOˆ.o]œ ¬¯>Syâ^þH øäÓ½8æm-"7\‡2__š*GU"T/ÕDdœoA$_D$²Ê8ó UÍts|xí‚›•"`niŸÙˆ-=ä¬ 0ðõ•(8œ|º'6¦FF¶v²úö(²ïµ BªÈ˜V4"D® b°²1½ë•}Ðõ!æïØxˆùüå ö}ßÃÛwïÿô§?!âׯÏÇÓøùË×ÝnÔ ÛíÛ·ïž^§óy; ˆørÆ•²SÿGáËùìŠóxz­Â¯ #æ¶OÆ -! ömˆ7Ý»³ÂA¿ptÇ®!Ë E~B–å_þß3÷™Ó)2ÐkAùÖ´U®<ûä²¹ã–ÁË׺yY#ȇJ„ˆ ÁWþYvëŠËÓ7ÆAbòjê:÷_ gJÌÂMq/°ðÂd&>Šu¡¥èê ,[=K’ Ó…)¹°BÛ °`Š^KÆ×ýYKåÔkg½þùšDB´XÖWüá›ín>\•éeY‰Œe cúÝ@Ç£µö|<û= ±°x»¿c;>Ándާ³šnÓoz$2"›M¿é4ëç @h`w·??~BÄ®Û Û-ºÊ/¤nÓ÷Oë»ãk¬±Æk¬±Æ¿«¶&Kr§1)^˯à!"õküèÜü<¼ùgYð wy fûPiéD7à‚$P_‹î‘ñl:ÔÇŠB@e²?"´¬€½ûôꀧDd]Jmû½F×Â’u3¢WÒ r»^¤jÃ|@f\Y€b …lç9gõY3aX%“ ÇÜè÷[¡1* 4;I…bÏÝ)¯ñ®`"¸V¦³56ž´w`†-І…Í>(kÒ˜Êþ¹xR™àO#åþƒNH Ñþc©å‚-x ÿlûÛ@N¬áœêKÕö<Í‹íÈ’û:,T]LØRgù+sçÛû¬Ëš•`Ÿ$¨¡_Õ“^%îƒ+jš”Bù$Ja0ÆO¿ÁÔW¹‡ÓB=±‰·fÅ EiÑÍËAÉÜ"XBE”¢< óSìÎLž™5‹Ì^bÑŠRš&Ö0–+O±Û›ó|¢C~Þ#Šü6]Žíº’®ô‰ÃxÎy¤Xgž-@yöf€iŽ‹ˆ·ò¥&ùÔªI“‚ò™ÑÔŸËw®³µï¼.VˆXs¬H:0‰p7<ƒÅì率ˆÀ ±–XF-‘S?;Ä#µ@ˆ“ê.²l gËÌÈ…ao<5C&v¦«QpùëdOYíäe÷!èà‹w!þS\XÌ3ë5Ìõ‹Ü¤AN¨©`njq¡ö‡­ÔÝ*w±´“«á€ä<û˜‚/¯&B@rÿG¤¸UüUð:é KÕ©$ž‹ê“¬*íÛo¿ÃËašør‰èp<âv»CÄóùr˜xË|ºŒ[ËD†L7ôçOŸÝ‚Ýuá­¢ bG÷°|}|aîúé6dº¾Çq²_¾<cˆp²¶#Ó=<<D²ÖZ;!ÑÝ~7Nw/Ï/,b6ýápØl6›~`ê^^ž·Ûí~¿· k¬±Æk¬±Æk¬ñ»ŠýÇר@îÍ…|4Дš±X££J®€˜¹U]'3ë-ÁåÌq—Ëm4ž))@mIW'ì fTû <f8•JJJÑž[]ªê¤†ª†Ì}uÉÎÚ³>±x^ìÝw›ü’Sò6ÅYÙþ5 ÍŒ­J׺²"€h¨ Ns†HÐ:Mqž™¤~É:{>m_gŽx=0‡Þ6.ky{5v‹XÛ dgSßÓ¢—â–sŒHv¦¹#r^ áé¥ $7În7±¿$´˜‰þç]—UNDÌ_ çÌÑñï2·r!ý¿¡výmÙû^OÜT‡KyÐàõB(ùcƒŠ/_ãçZZHëFxA°¨ê# êTø·Æ…Wà`Òf¹X(cïið9Í@(ÉP€›úPN9=ÝyÒ{ƒË„}ªk‡hÝY€ÜÖ­Ò²?PÕÔƒ>oÌŒEæ¿¥•ßB™¿ƒš-”FXõ°qýq¢˜¯›Ýò‹D§Áz†Æâ¼(l q%÷Ökvà•’$œRËÉ–¯êîÑdq*ózÑûÔ—£¡„“'b3³UzDþv@Àè( `™€ë¡tà–Ûm„rw1OºqY‹•(b™Ùí3÷ˆ~5Þ¤¾ú‘ôCÁQÄ7ÝæN •+ºj¤¨×@¼xÏßÀ¿QØ¡ZÝ`6;%±HÄ—t¿1³¹ËJ"„Ê? (¼ÒM*ZË"ÈLDҢ륒Š;¡€þÇý#BÕ'Úº~†Ð­Šž¾Ç¼—¹9VQíÏLhîîîNϧóy/ã8Y|÷îm¿éàr:wÿðÝŸ¾³Öþðý///dèÏúÓp<žÏ"B2,þ rw·€iºôÝÖNÓÓÓ×ÃáäËb‰NÇÒ¦§ñEäÔ‚$f¶Ì€8YûøübG;Y¤Í°y0æt¹c˜™Ùà8NÃΰ@߯&Àk¬±Æk¬±ÆküNc&‰^‹ùJ«A)ÎÁáèø¶œÉ»€AÏAçµÞB…4…A•ÞQ#Å¡°.ù<úÌ< j1¿2‡Ýc siæ$:Á3*V§ŸwþÎDw¶´Â¡:”œðªicU´ÉÀO©f«Ò):°žÅyt@À QA+Kè¯Fí e .Ì¥Ubå¼^àò0K`Ò0‡[ñú[KóÀ"K¡6vf}1f"H¿èL0W»U5®™ô›º@0G‚¼Vø¹§QñŸ›ÐÿùO§?Œ¾¤µ°sÜÎIV jR¦,”#¾%&Vç'¨†î›«F¼x±ÌD"è›5WáFðhù)„œ k®ÍL€æî@:wpŠ*üR¨ AQéºN"g¥G¼Òz‹`BР…™*A|É‚A­MXãþ³Pº.~!©¤x€}Ï[Àm%ª–«eàÊEéÅÌ–Ê—o#¼Yú¿¾ñו‚ÎNÑ¡€[“×íÜL«hÌ}¨£P‘’ey ™×¢6È-2©çFýŸŸ.’²÷•N-¦ç_D$òºN¢¶ÔG!$APx©Jœ„2Úæ qUé8EУH¬'ÒÓ–o-‹€÷%çömÅ s\Z ¯KpÙõ¢ÎÛÙ/öÀþ±¨SfÖ^LL@a†ìºin”³Š¸„ùÀ.”¤EÓ]9Cíðù$NÅ}ªjLµ™Hrßê0À²€!ŒÒf¡+Üà¤:9CGºmâ˜ô=éi!÷”ÍŠKˆôÃù<~x·%2§ÃÑ¢üë¿ýûe¼˜n#ˆÓì‘:± ãdŸŸ/c îö÷ˆG"³é»§§—Ý0<Ü?á¦ßÚ§ÃËËñ›?>œ˜èþá¡ë:8Ovšú¾ßm÷—ñ Ñ2ð8Q×mÉŠ­†­ÇÓñ("ýv»é‡¡„Ÿž&Ë]×9Ž~ØçË¿þÏÿpŒÚk¬±Æk¬±ÆküÞ¢Pו;j oŒÝ6þpól`åóòM°>zöÊ|¢%)ÁJ³~š/T€ Ë1wº ÕÉZ¢p¨™‰øO§>Á³ŽµÁ· ¦‚í­W›¡‘ï_êÉ,XÜP‚¤z1'è_áÃùoóq£›„îµ4©!³Ï@«d 7ŽŸ;¸Íána'sZ:óùšæ>”EÐö(ßà%Ô”Ì5à5Õ5WroQÔ—Ïe¶ „P¼^Á%TSV']Ù‡6ØÄŒ”kbý9þBShø#K¬_Âú4XKã`Ky¿/¶*bCé±›¤eP® ãÖ9"`}Öª%ØîzŒyñH"âD2@eÖ¶'"Îh0iÈ·’z&×ÄåúŽºVb¥Brz τ߫ ‰œ„êLµhÆ,—2YKÚ#,]¶¨Óòü}2yrT­zPyG:³¹#–‹>ââ­Q¨Bnt¬w&ó½^®VðÔßâo ÿé¼kÌ”×Õ…V2ëÊÑ¡ž*[«¦×E—ÃÞ)ü´6€ˆæB*•ƒ«0KL-ÏEl|ïæYÄZk­Us¦ù® 8$׋ˆe‰4n‡á€Rê¿W"øÊsÔú¬¿nBÒ‰2îþçÀí0j|ï 8äž ¨hIƒ(ØìætP÷"ÅÄÚ|¡®†+˜HÉì¤!{"²Á;(6î:Rê`Ñ[fdR·8Í%Öœ0bÌŠˆ^êíųíOà`úX’2úÝIÑ̺÷–æ) ‡f–0$ãä“iXÅñ+ÀtÝÐïß½ûéãO»Ýp¹Œ |9Yäx>Zk÷û;ÓmNÇãü×_„¶»ýý°ýòåˆö÷÷Çãñ?ÿó/§Ó‘ˆ:Ó3ôÃféûÁ±fÓËV,ÑEF@ë"Ñlú¾z´Ì0M|:=šnƒÔm·ûÍÆ0óåb‘Ìå|B¤aèÖwÇ5ÖXc5ÖXc5~Ÿm´·Ö Á  @ ÚÊî)ûT4ƒHäÉ j¢¬hdYX‰ô9§$y 9&½ø¦™È\¯Pç8§”š“.ƒGnF6àRÛˆ€YªlÓš¸vɲŠiaxñó`˼4^¸u\„]ÃO5 KÖÕ9v‰Þ?™–Ü›o¼2ô:“†V…%¹ù_†K¥ö“¡Þº ¾ä×î\)@óCÌ€E!Ù¯’*­ŒK5ð‹K&擄u;sàÖ4uKU@ãvPÄáÒ@¿qæ„úŸeOW¹ÿúÀeưjx©ªŸ è‡\ON"Œ%*˜C«jO³òAj°)A¯PX ¯M#59ÁÖÑáÃCÚՠň÷©«Œ¢çF 㥳±55ÐìД\ºÇº¡Œ@Û0€©nT }Ì”Y 8Ù²¬”A£ÿPåØ+мj+ã gcºŽ°;í¸†œöÇà­€­ú¿Âޏë}&prOX¼Õ¤õÉ‚eñ/Në†ÜT2ôÈF\Z$Cš¹*O4ˆLŸu4@k‚v&„DÆ µ8ÅÎJÀœT‹8™{·Ø=£¢>{Ô‚@÷Cã‡ê‰•w•†ýú|ÿZ š¾Êz a.™ïÙµÄÏï"ì×”ô¬ÀÉ•¨r°h-`ÙÒÑZD1gq½Irý!×t*,£E€ õfDd–¦ÉpŸÀt cDÄóþýû——ã8Ùí`&k-;^Œ;C²ÛnY„™Ä Š wjÀ€XË‚Q6›› ÑtŒv:ŸÎ"§í°z¾ŒãårA¤®ëúaÛmúõ­q5ÖXc5ÖXcß´ÄÁ«÷})Ypµ|{_Àa«\Å9 ~ÁqnâæzÖ@Ã\‹°ð­Õ8{Ž'úô|#bBFñ'SÎĈ(@~JàuëÄEà2U;¯”…:w™FcáB*à+:Qâi’8ûU§¯Õ܆n59±<|y@LÎ…hŠ1®¾0  ýÃÅ(/àò7à†ŒðD4vZ²þ8„µä&‚ Ü\¯PØg'¨ö‹Q¿!ÈZÕ#sžohÈ Uf¸Ü£…3ðµy«¬KŠèÉÌüÖÌf¿}ª,pðbÆ«ÑÿÂã "ÄÊÝÛ¾Á 0©zÖüA™]EðkQ öPÁ|.Éd…²nÈ€e¥‚pBØ+¹ªˆæëla/CŸ¥ùäˆ&ôU×R0ðºôH¥›÷L¯JÉ ÏÊç)äX}÷úwjÅM ë Î¥Ò‡“fHMaQãÃÆN@®M¨ÒœÂqiËkõ7ò3ô23_õѧsXgíµ¡“Ü3µ“„wÇ;IŠ5¢Dc=ä­„•V:׺ð^Ç%í£»­0Ê%—CˆPîn+Õ­mlÝ"’ÁôXJ†/”jœ € õ•–½ž@4\ÞÔa–²"aQ±ân´4 :ü=$@sMeinÆ,^Šbºèˆ@8÷«š)¡»ý¹câÞ"Š ,ºÚq dñ!P º‹Š!§+6ôƒH-T\Spz?P3×Ñÿùm$:½‹S¬„ˆDtÜO¬@ÄË4ýõ‡Ÿ¾{÷a³Ù0€e¸\¦ín˜€Ì$xº\¾>=ïv»÷> ÒóãWgùp8œNçK?ìȲôÃàic­ÑýÛpQèt‡c×m.ãyš&°nB'"w7!;N§qœœ4ÐÆ˜®C†ãñHdŽÇã4MÓ4íïÍ4MâØˆ5ÖXc5ÖXc5ÖøýD HûK)k¤çÞ[‡Yö⬓ýµËnöÕ\Þ}=£ñ9ÝiŸÜ>qi´‘km' ¯´@ó“v[º™~ž´YÜ"ç­Å¶ÒzÓ 8"*¡+n¥üÇI>ÃÅŠÿóo( ’1€$GårlERdˆ¾$­Œe‡g2À6‡Q•c_óR ëÈ41‚%CSiyÎõ·ÈÂ.„ì]XPW@‰^µenjîÀ 5ó¾5ÁSÊ~‹Ë'QØ=q˜¨E±JàÈc,Í0 ä­­ØÊåyÆC¾„ÿW"‹mè®Èþ&½é·9‚˜Ëéª>Ù98V2¾ÿóʃ„RVŸÃL‚ii1ès“äXPvj²”­J>¡ú&jï$£“)ub2#Á<ƒ>Î6Þïˆ<+@”Ïÿê$‹>$œEÁEœ±y¶TzhR©ìA–³=Ñ«åŸc¡Ê²0xçÐú»>ÚçñwÌæ×ÅG‹¢coDß@ÿ"ØZåÅgjìùÀm. ü´¼Å£‹DSù=‚ª¤Û¡ÚÌñN–]\¢·ež;dyF¥'§R•ƒ³+€Ê$ öC&TM`’n¬_z±ò7 ¬/Ÿ1¬ä¬XYQ\&qŒß«/šg%ë5/«R¬èîøBòf@ TâZôAý¤éAi(ö€•»KsEo9{蟃”S1 ¼Uo²y.Édí Þ€œ´ÅZ“r•¢˜’P 6Ç’ééëå›n²ö2Ùqûûþýûwÿô¿þó»w?|ÿý÷?þô‘ˆÈ<ŽˆÈ€»ýþpx¹L“ õ»íhíù2Zæa»{ÿá=Žß¿y 2ÏOO_^ÆË¹3ôöý{Ë€ã4@·éY¬1Ôu½—Â4=ØÓ(@Ì@ØÇËe´dzÀ ’À~Øn·[8Oçó¹ëV  5ÖXc5ÖXc5~_K/üs8ŒhMÉ!!@*@Ã0}‚Ö(pÅgPá™ tS" ªäÂ> ”‡6f€í¡÷І§q–*˜ æìWE:¼“Å-Òupî‘€ÌTä• Ì@T¤d«¬ùн5Ù£_Åõ!jV[èÜp„ëÎÉ‹?¨ƒ$\8?/ÆŒé.c`™0TõE;OÉwJÓlÀ‚ŠTVŸ‰} }8É/ÇUÿ^˜±/®³øµ AR nA(ÅÞJægú=‰ åÂAy[Ë#®à—mçòŸ.þŒÄh£ÿj‡˜Cù8™iB%¶Qâ-i¢®”B&qýÛÖEU–¶Lq³i³7wÛòIQ“’À6"D~®œ]M3c, ˆbý z¥dLâ».× b8y¶¾WÕ'`ȵÆãul˜Í ’›WÅÂéôÕ—&&.-"}%þ—sÛ@½H×Í Ý‚’YíIEmV?¥-σÕf7ÐK÷nS엌ΉŠxÅ’¨w®Ò±µˆ¹žsC>1 ƒx%¡ä—ÐðÝÍäÝ¥ 3P> HùŒç:Ô•ÃfÌb-‹#»‰LlR½ÛúXÇ’ó*ÛÝ"v† ¡…†f¦mk\ »Çf®GsœO‰@Ûö¦ÝFÜL¹ØTRðUµ"òÖCø1s÷ ±$©‘˜òêµ[DÌ»©bÐü¬êž4ÒÔÑ&ZÇg·˜©jŒ±@µd§õ(ŸàU—¼OÍPe"c(r:‰(+xVû‘Ä·&…ô&:¯~ò·B?IÞÅ¡$ª3³*13˜˜Ù¦®×Ë,¶( Hœtm`Àúެ÷¡l˜‹>Ñ>}W ¶½ÅgÖE “‘@v[l‘|Òu—>É “B‡Þ'8__D´DÎxB2ݘ0XáÔh( "Äé[¡$1UËÊàË£.äÌ¡>ØiþXÙ+©ZF†¼©:Kš=>ZórU%.Öר6þºÆõv[NçS`e<Ü=†%|ÿß¿|ýôùˇÞ½{Bx¹\Îww÷ßÿá™VéýÃãrEz~¹„e¹®ëét:O/—Tòðry ËE?~üîþÝ;Šòùóg"‡÷>\¯×ï¿ÿþr½Ñétb뺊È×§çËË%i:-÷˲œ˜y9¢¬5ÆdF¤é²îŽ €#Ž8âˆ#Ž8âˆ#~iÑýMß½iHx`ŸAh›Ø(Øâ&ÐsÁz¬Óàøµ=çh»;‰QÆß“—1ǯº4c;'úõÔ0ßjQ;zÛ³Wüº ôw¾Ä70ŠŸïwØig?ÐuÅ––}SÿÝz•6@kz£—l-¿èHN,h »‡…¡üp®zMŽƒ©:*ó†ïÌ4î]2z• š1 s–aÇ“ÀÔë·ù¶•øOõ[<Î:Â:c¿æ`™!Ÿû_϶Yn±[°!”ô7­“õÇ­Üy§ÉÿFôß|ûê7˜ þÐÜ!ÀZ½VŒv(öÆñ—äÊ&ž…É©¡ÿ½ ²ùaB7·¶åÄJæs7\¾z‡ ñYp? zª ñ|JD¡²+™3 ²Êåb‚¬^¶(!pYItS.j ‚o¹¡ q7ÉÊj:­Ç,ž“Ãb£2®k7Çà/ÛÀ$·—¦ÑÙ9lõÏÜPᵩ÷ßIhI`¥Ë¸hH–OÀ÷¨šb$×I$¥F¤ ì¿”Ä+@éË `âìôÛqTrѵ Þõ‹HÁDÚd[Ä_—ºb–üy5‹Èï·ãâRä|siBƒ’Ë‘Ô£Û §ãeQì FÍ0˜‚kÑšŸàtëNâ'º¥sZ Q*,ò/l9‚“ÄÉBIÍ? éù0 °^Ýǽ–ˆ“b›¼_D0½Jw êj²Pës ™”]‚† Œ"õÚó½cæ:´¢RQ7ª@YÖà=˵ØÕžn1FÕ]£PX–ÿù?ÿ织?éÿøþÝûÓé„5Êår¥Óé|>ÝΧ»û‡Ôª§/__^."ôøøp“H¢t‹q½Þ–Ó2ßÖ%>¿\>þú7*‚§§x»)ôz»®"B´Š,Ë’0ò<¿\TéûOŸïï–Óét»…Óá»û»ÏŸ¾<=}%»ÇË×äðøøx¼AqÄGqÄGñËŒ±²~† éP!ÐKœoªsT¨N¯à³oˆu¯W‡¯ŽùõV9G©¬G\ÞÁͼ¶tÛÇ"€iŒ€ë¤R2>ñûŤ`8:AºK'‘Üþ”o¡Þö :s° NÒyÌâ¨Ý»õ|ˆ é:rf\%+àƒ”™Þ‚áÈ*Öªø”Óÿ†•€úWõgÔ$h:¤z¼4#y³Á¤ã‡Š¡¼¾žbˆ3^ïÔädüMŽI£9p‘úrb ¦ŸFbA MaÎp¯2¤´¹‚ýø…±AÙ3œl¶>z’€ 7`Ñÿ$(2U̧~fÑfVëð3Œ)éü3º‘ï?üÜÛüŽy¨ÈnÒüÔë„}R²þÊm”˜D)룳Yº™H‰C³6ègµ.ÁÜ·âãD”´ŒŠø÷^e¶‹ïy¸E”Â+ çN|­@.àñ“Ý´”]À qv²H¶‹M»Éõm¼l†&ƒsœ^:p[“¨=4Ì•ƒvzsC è'‹Åxáj²hw=åƒv¬Ó=1ýÀV=Í2}Yj…lÚx>/ê”䮤’sÒ)'­koܹ P†zsêwÂd™·xfÊrðyNÁ»…¤†¦b…É6£hîšäe´dÙkÙÄrž»ÚÇÃ\ÅÀHüIVòOT+ÑÄb÷3¹ùq¡,MZæ¯D"¢TD`­WFñúŽòšÛõU_ý‡kÊÿÔkÈÚ5Û ·ké÷ïJÌä‚Rç,=ÎÎÌ@1Û‹ñ_IÄg!¬\õbV·²LÁ™ ø2ˆ&åt:”øo¢ôðÂrz÷ñãçϧåÄay~z~úò¼ÞÖ—ËõÓç/k”÷wÿñ÷¿ÿþ/~z¹„pº¿çÇÇÇûûó§ÏŸC¤8"¬ëKaá°ŠpX¾|ùò«—§÷¾ aY¯·õ¶þ¿ÿò¯ 0èþþááñQU×uÍÖ  àe!àéår½¼ÜÖøîýû¿úNÁ×ËË5êy!^–¬J‚Cèˆ#Ž8âˆ#Ž8âˆ_zìXõÎûÆÄó!Üç’B(7Á1ËþVÃKt޲âð ªYóåó Ž8 @7©ZcL6ƒ :÷þ-¸üVцªÏÌ ¿Xy! ýDû-3€‚þgÈ{bx°Õ<Ÿý­-åvÀw¼uóXÏ‘°¶­3VP¾ª@ 4 ê² g~áMÀÛ¢âã™Ð†b#ŸÑ4ƒAâ.ÁtLsô¥"²¢Û ý0¡™;ðFÆ}5­‰t[hûDÉg›ZØÁëÇ?9XÇ‘ /ì…€tFæ,F'T(·„6ж¦ÐoTÚüÀÞê7[ìz‡Êþ›Ü|ÿ…ú§†þOíêJÙûVLÈ~xâ'Ë|î¾jÒí½œYßp­AÇ¢Fb쯹­zAÖ48ùèf½~nÒÿv‘r2{-c²NæVª®–|…P>¹ó¸|½É+po`­†Á–žTU¤|ážcð¢=ÎZÆjÅbY7ûÍІQ€»pó-Õâ^ÜQ¹.ø¤¾Š2íÀòU\[’ƒßú”B?9 °1œŒ?7Üßòºã³*MÏ÷÷$ry¹„{^–%03€ïîïo·î–wJ …™ÁPçåôëÓÝår%¢°,©·rÏëïîîÎw÷·Û-®Qˆä|¾¿»»ûúü¢ªË²0³‚NçÓívI"BGqÄGqÄGñÁ ÿýß„à¶gjé{Øàu¸ ÔÞTª¢œb9·ç¢~4Á ÕÂâ³-t”ƒ¯ÓÏV¤¾ÁúC ]úo1ÔšÎv1A-ý¦ 25„¨û¼nfî7hBh}¨€×x/vnØ­ ̉Å4ÑÝ—„·ä@6ÌFÅû3j§ZžZˆbœ+f¥”«jW¨ÃÓGm}XQ4>¤®Š‚,JßÙÛ÷ô-Í W9ÚÊœkå©ÄÉ®»9ÿ àÞÓx¤ŒvæJeo¢ÄL1üešøß¡ðö—þ°vµ ýßÐ߇E M_ÎѲÊ9µ!»î®Y1œ”T¶&ŽGfÿ-8²Xƒ9”„œtOÆ3`¿µƒÅ‹¡ÝŠ)ˆÚDíÉÎ/ITEð9˜J#µídý›@?,H—ò´§-çÊ:P_CÐõXÄÇtþÜ6½íyñt³ LÜkÔ.»Î`¹Ë‚¸AÑWÒFú¿y\ÐÚôø~L)ø; -ƒ Œ§F™µàÇðبn/¯k”4ö˜a]CC@Ú/t1gÁ¯E'<ƒËL>vãsy+YÛ’ôKOÖJÚ<(mÏ€u•€/ K—/…ß,8Y×(d8¿ödCÉ»EÁnn\ÑGÿƒ˜+ë_³ÃmÚs©ƒ;…hµ=á$\Ôîaöø…(‘B’l¤´Nã…cŒ1Séc™Íªìh›¡PM‹+ aœ¢˜Ê  ™£H¹ú••©ÿ%‡ˆéøÌÐâ*¡¾IÄNégM¦Ô–®ò¬{fw É÷XL]5lÎ#0é •¿¤?—^Iÿ,&5ÏZö±H8Ãé´ˆÞÖõùòò—?ÿõåå¢J¢r»Ý’ÿé|w½­¢ôûßÿþîÓé|»Ý¢èBty¹Ä—pŠQ^^.‰ç¸{¸¿|”§‰ñþáñr»=ýûŸ¾~}ðÝ»÷/— qPU†‚–å´<®·ëóó³ýõ‡¯ïÞ-çóíºB# þó_ø/ßÿx÷ðÝûw—ëõr½E¹*áï/JvÄGqÄGqÄïx£üÎøæoÿ0f;hlO| ÷ïÀCÓâ€Î0pšk¯â^€H^yÆ`œ¢½1«’vÁ#sPÑÿ7êa áIMK¨˜´s±…ÈÝÝÍ`S§ÞNšÞ'˜©˜=DKFØÇéuì ùã}—9?¡êZ›À¾ìÐp î·aÄLQ†¡Ò%þûWb[åà˜±ÀéÓC‘ÍÍÝ[6_º%çÍ—ŒÊuÚy{öÔ õྕëé>FÎÀ”ÌpY7ÆJrÂýÙÒÁ73úãI­ q92Õ šŒÉá¾½ lœ|vÏ#w÷SÙ£â®-Õv"¹rŸ³x?F/^,ÚãMª MÀÖå'Êâƒ"E/[- :ÏóâîØŽa­F$Ú ·ôjR9®—*†\È­΢Æ.z<F?g®éo‹ÉBþpS±çì²iòêÝXÊ ß=õâUú¿eÈR¶ý‡´×Fj‰çom™½À&Œ4þ[O–¯Û¾åidný)O¹&ž'ìýýdr`ü»ëP%Ö9skô6¥Óö“Ò“U©ÏÎ -Í„&j@íÖJaÓßk%ˆJ‘ìi{”Ê&›Íúç11ü¡ó­uÂm“ËTR(\*}–¡¯(³Zz*º=Ö²Øõ{+­Ís²&BHj {I¥&¡Sm„f$i ÜcÌ "˜‘‡B²g&"PÈgIf¼DŒ„šk)"Sñ>ÌàÀÚö•½Ñœ€Mo °Ù= >ÂK¹¹^%!%hÙ f´NL[²ŒŸ«m…™UJËNåZpòáã%Š*Jxy¾þßÿ×~øô%.ËÂà—Û…”®·õýÇ33øþá‘™ÿùŸÿ뺊Špëm‰p:ßɺÆ(÷aYîÃrŽò$Q–Ór[ãçÏ_Rÿúý§£’>Ü?€™€ÛM./_oëúðp¿>¿<]âõº¾{÷(JQätwwB«|:Ÿ‰Ä/OÏ7‘>*qÄGqÄGqÄ?@ØWK}ØÐºß‚-^)¨¸çë¶±ƒiÿrƒ,ÞäZ¶/mÀ´Í:xГΒëëWP~°ö¼[à¸Ã »rí†É„Z<„‰d’¥Ö½Sq{qÉh#êtz||†B84?÷ÿ›æER¼àŒ™ @ tM–j`ýFD±_•ŠÞZ:0ŠqCˆf@ßï RÕD haSžœÞ¢Êé îaݳlQÖ"r•SÛ\ø¦>~WG¨×Þ!êë´$̨‹Î´ i]¨›±Ýaó%Nkਪ]&ì™–o­v{+!½Aó§Cq1â·ÛFÿÁ Â/0úŒiÇV‰Àû %'_íHŽW1Oí»§,¹Ö¡3°ì:¨Ú¢S²G%S¢‚Wf…ª®%6eÁ é¨B¥?ÙÃÓBÊ)#»(¹Á0‰ZeZJ}€iBõæcÅÎÓjÍÒa¼ú]5Ð8æŸÑ¡¥´›—?¯ÑJq'ÇHt°{cPªÆr¼ýùâ[±û)ñü÷!ŒRJZ^A©…¨C¼«˜®ÉT&в»JÑê÷Ä„!C´Õ”Á|·J¼“¡GËIÍ‚ž&mª j×\s¸­Øª#oʵ¯ÛOU62^1ãc__ERi…‘©Ñ©”å*705$PÚtžºìfu…½³éòˆ(4™Déø†Ô" !hmžï}0W.!™ Ä=^©U‰ä¨õV‰›1v0ºcšÌTê1mG5ÎV'†5ý?•nðO?¿•wàO>«4õq~x¼\¯·Ë%™d¨ÐÝùLDù¶Êíºþú׿~xÿøîÝû—çËõz¥õz»\×ÇLJϟo´Þ袸]¯s8‡ÓÝ9„°„ç§—O?|fÆo~îÃãû÷ëzûòéË×ççóéDÌ«èZãú_ÿø§ÛÏw§ÿôðà|¾®‘Ÿ¯ëº,¢ óýÝ=ž^®*ñ¶Æ¨t:àˆ#Ž8âˆ#Ž8∈Øz•ïr̆Wrl$¤yœÙámFólè ¥²30xÇT[f¢ºã/ Cº-\®ê¯oŸã‰š¥ôJ94cø®áÖŠJÓ®ºRá˜Tˆ*vÁ~;gá{ßÿƯono`1õQðÐÆD Hw%¡òçsâq’†Aÿ=€NJ¸WÝÃôZ;E´oÖ µÉÑÓâ}Zm ÌPÏÛÌ^s¼¾û“÷ãÔY<Ò `1ëçy«(’ýón‹ z¦¡¨÷ù¯°Ú”ÔÏg@Mf Æ7Ô®Þ RN/Ú'þ7&pðSù²ÃLEÿG0E›l †dP;8ùÄßW²`M7 R «“[댱×U÷ø–B„PC¨RÂ$q¾Ý´åFaHµ§q‡Èƒ•@òñ“±¶ qùo©fp¹î$I]ɰ³êŽËÜsE¨ ÌwµY()ô…Þp«{u¦šïÏó}Ù:Ðè*ŒÙ- ÿáq‘T³M››«F3©§u8W9HY³Íµ¼EhLù׿“PO˜”v£7Ç 3FíZYØ;ГZ1ŲÃêLL°›Þ à¶ÜB‚’¥|K몈þdÕÏØ!ÚfÆT!H5YæÞ ÃEeÝ¥Äù´*úÓ&†q:È£I‹›Hñ÷% ‰®ÊòTk&†>Iû-§5’ížgíj[wrC‰Ä‹U+`[™!"`NÝbû]‰§T^ÐìŒý^Û5~ºâ~¢Hy‰]{êrÔé˜ »²NÒÔr`º” £¬´º%eÃu#<Û$ÜÖx»ÝÖ('U!¬×[ŒQUÃù|:Ÿî~ÿŸþ§¿ÿÛ¿ßnëËåzz~ùðÝÇJçÓééùåv½®‘˜A`3…*8Nát¹}y¹^C/×Ëî™ËÝù`æóùt»­Q5о{8ßÝß=><~ýú¤ª¿þðŽÁÿú§¿<ž—÷ïÞ8\./ Ö…¢Æçç` Dw ™8âˆ#Ž8âˆ#Ž8â—˜Úûö/c‘À•žØ”·?ô >íŠþW‰gÝ.7ë\žþŽP‡†íì|ÈäøCI7‹°kH0;3IìÝ&'°ˆÑ‚4—Ë),›+ºº iþo Þs¤¾þIweý§NUë¿ÏêKhxK÷%Ê5ñ£ï¤Cc¤àU€Þ: ÒK± oä¼@»¬ÿR¥¡~„)~ÿõ(y½»Òü´!Їf¹næÁŠíl m) c߬Èh z-aLÕŠ‡ÒEÛ@sa†5%þVàn„·lÛd÷pVÓÿi©üh꨼ƒþ7¤<Ë€5´4ñ¹õ6`µzÒ ±¸î$·*FÏ•_&‘Ù爐gq9¡D¢ Ó+‘5äÈg…GÞ3KLÕÑ$'µÈåו‡ÙÀŒophp·õìW§Ê pcà–kïruõFú?-™îH×;×}éSs–‰õê¦4ÏPbT~¥³Ç¸ÿ`ÈÂoŸÚ4’®(D}“nœò§6žÚªÔ¸I©1Ѧ™úÍ~­kVT[ÂñÊDm‰÷Fݾ¦®ùþc¨,ÛKèTo蜟L®ÕR#"0çI™š'šóÈ>_’ú[AÌ Æ!WÂ%íª©ëI„?µ±Ò¼æáq4#Ϙó”6oãÚöö¹~˜Ý¾é?)1"ª\FEº+™;‘dÃKf‘6‡ºüêîÒÕ¦$’XLb½o¹N­ËíÄéÄš@PQtGë®ÚŒI%›ûQ6<&n}nÎ.Æ¿ˆ„(*­q á”~»FY–Óé|ÇDOOÏ·Ûíü7U¹Þâ-FQ]×õK”Ûõv:ŸUÌ÷·u"QÖÛß½;-§Sˇ‰èë×çëõÆbŒ!ñv>ŸÁ×–Ó9„“ŸŸ^îþðá㺮îïO§¥°o£TT%VžF¯×K§ã}ñˆ#Ž8âˆ#Ž8âˆ_lèp÷6 Ì½ªoˆ…ÎpòM0}„]ê=:Ô (Ág'"d9 nÞ-B˜ÛÕÂdT(Ž»’:a]‚µANú&œÚÌŒ‚½öLAA…x!¢Z`î‘ö´ [`_?Å  Ô:yZÎí¿“_Õ1ªckSúV_LàÞXC˜’9ýmw~ÎüMŠÞ¹Ÿ›V5´$ˇH®Z×Öî©€­ (7Ô+jíözŠN±gçN Ì\Óã¦é+ÿ–ÍÅ…ö¬h¦&D4Bü0¬ºt@‡KXQ Y²°¾m-›@üD„ Ý’¾9ˆÔý_ÎŒÝFƇϒÓHÙAÿ:ãv„¯Ý28\ä¼µJĘO”’§»&Tdj_TZq‡“KBhÙ©Æ×6׌7šKÁ¯][—†fç«E(·ÊØÔ)Zbø”sö´®\.•¢Rç h»ç3ÚÍUC¡¼Ë"Ö©xcOÔ¡ªÃ*ùt.Êvï+ì3SG©Tô¸”œ ó7<™l=¨ü”ÀÒ-O& ÔÔíRСNî¥*ØŒ€r·’ãK²]͸¶ŽâBÖÞ6¹ öJnAœu¥ú][·wf‘¤u-I ø¦“8þÀA²¬ªªÄÈÈŠW/[NB ¾ÏùÂEzí¯no«ÕCÌaè𡊭¨rÛ5©3U‡]§Ê ‘DH1(¡1£¿P^"©Íâl!L`ÕByÝèꊶÔ^d‘”T §"F*Nb;<Ú3”+ž S%WÕQÖR0sªéHŒ…fc;µøïX¡§ìŒlêP'ìÈI( «ˆ-L¤Ëé|>ßEüçOQd9ŸEé|¾?Ÿ Ì?|úœËü˜ïŸžž^®ëÃý£üðý÷r ÖÏw÷©“˜c¼]o+¢H<ÝݘT8œH„½<_NóÂà%,‘èÌa9n·Û×§g!  [Q §»;R!°ÐGqÄGqÄGüR<:Ï埿Œ¿öön1p¯X2ó}kþì¶ Kÿ'¯Å¡úF„½á\;|Àhêk²}]ÀÈØX3€žÚēʒNH¹V6]'ƒ¡BÑðÊÉš”$k¯'ü‚ÑTtš¬ÍóG Ýã9Ts秼ƑÖcx9þ£ÐŽI@‡Å›[?מÔx`¢ ÔôRÈ+IŒú¶ÒâU pŽ’W|ÏZ>ÔÈMþ¶ÜôŠú…{T¡*F6T& <àpU量\¯O×xZø|ŠE%€U£êz[·Æ#Ž8âˆ#Ž8âˆ#~á¡3{ß×€øI–íD ¸Ø¸V4»J2£³.hb/6µîô|¼ä@|î—uVÜ¿lé›úV]Ђ‰du~ôMq¢¸·nðE“®¨¦¦2#¡üÆ  Ã#'òJâ „5ÉÖ—™—òÈÔ"€I¿Âô#Or…‡ÂûÛ-:±7Ø>iNjtÃz'+Ÿ&„P|õû5SÓ&i–€†]ºÄ| mwνSqS^@ (JýãRyu’È?6c› í.º3õ¦ ”ä,|Ñsä³? *@Ka€™S¦vGԉĔüBHšï ´~¬[ú/"Ó§õqI…QŒ Jåìa³Ü½ªjŒR º§K2(n<š¤ý‚ÕK B®ÒöÆáƒ=½H?VêÚ—(U0¤i->ž7uÓ©¬¨‰çP7eí íäû‰¤¬÷©¡6ª| ¬Os „Ðî2@¥²&ï©–G«QA2øµ† £„ÅÍÓµ!:3´®š?– H$Dºü¶æYS‹²$C#¨ª¡± ‰Œá⡪ŠììÍŒó½+µ ‰bJ#v sv‚P.jN CtffÆåårùðáÃårUÑËåªsáv½ùùåå/ý«ª®«,KàÀ˲(éU}y~‰¢!‰É§w¹?ëûÇÓ²œ®·("˲ˆ’ÜÖëõ–zòãË-¾ ËËå¦*Óaòœ¢èz¹¥¡""33sXNÞ=ÜÖÛétN¶À (©¬Â€ÈQpÄGqÄGqÄ/=º<ªÝôþQgÛY㪷œÃŒ›Ð*0çz„w`,&_y½N¡\÷VÀ¢ÝŸÎ ö3Y÷ÅÔª)(?EÆsÅ€ ½Ñß”T°Î…¢h9ésC`çœ\z¤×²ÚîøŠt 4Àe³ÿämwåm:!÷^¢R ¢÷& hè'Õï]ÑF÷I«ùß#ò:ªú ßyl`ŠÅo¡Ã;ž«Æ àÛ ·w\hC,¨¸«óçµ,Hê󪃴ÕÒ’g)®U(•8:7P¤Qè|×(Ñ'ìÏô‰‡nE»0!Ü%ôYï0žŒØ×êé︕žßþV?Gdß”€6`ÙÊU õÝQ¦ÀÐ}É‚ùÕí®b> AÍ_‹qºS®Áp+fn·]e¬<Õ`q®¶ÑbD š—ˆäÌé¿ì+”…®Á³Uf6šÿE¥ü¯Ü<Œå:xI ¬k‰ãø&×Å©ØÎ##MôúkóÍ#âmè½Î~Ö­Iú£cñó|2Ы4JŒ1)ãgˆ–4-a6ƒ{ÄëÂd%VjdüXæBð ÀæDrªµdÐÌ”PËJ9ø¥§ºÃèÄLVÆ®ƒÓƒª#™8Ö¦¥Vº2f®Í¨E `ªº:m-F>—RJä\î UiZ7¾«Çý­±2¦3MÂ>X–…Rs9DZ’î3%€~M&âÙ"& _D˜æê÷«Æ™A<;on4‘j>³%Y¾ø 1m€”žWU¥H (HÜãsªŸ µË}%’zÙ¤Ko¨Hb·²žRý}ÛK_(¾(‰˜ME¢éé²NDó†T)IZ¼œQî¥_ÿú7—Ëå»ï~õùÓ§¯—çç§çû‡‡åt&‘ç—Ëù|>ŸÏ1 !0Ì—ËMˆHE“‡08,×۪כ0ø×ÿô[??====qÉ3à¶®¤Êa˜Ÿîîdk\—å´Faf%<=}­¶1®ËéDDŸ¿<¥q Âû?ú$"1®‰1Zc<€#Ž8âˆ#Ž8âˆ#þ±Ð×Ðóñ#s¡&ê­¯½ÆëF‰À˜ìß`zAãKÁøë!l uÂ5S–¢ïèfûK²<‡¬ãlÛ?Öl¶•0ïÍÞÜÒÖ[lqF¼Þ¼B£÷б2߈¡èæw¶{ÞU`˜>ïîì+ã¯~q(‰±‰ƒ§:€=+ã 9 j&Ì’ìæ4p¾%¯?Bê4(à JSóšÚÕë§™dŸz{³lTAKݨ0 Ge†P´JÞ'q«H%$êl5$³zl”жö4Ùs89HpŠw&stbö ‡¹Åu‡<°ÌÄ$=Õ]»á0ÅRçQ$õ<Iv¾W/2@á.úßnº•ߨÿö2×ÍA!Ƀ´)¢aA‘špþ½½T=2¤ØrÞ™ª“1 –_5gÚU0;Yº¦îY²ãÙV9Àê¾d{FË“ïý7+ìÝÛ ÒJ2xo$¼4W«Öšú]AÂì:8ü´ã4ŠÇÏŽúøLñç73ø{ ÿD´li÷OG|Jøfæ< a=U0¬Îæ @?Ò5ÜÞ—*럀âUkÓB`­ÙèõDU®¦Ôœâ›¸U&Í0‡%˜%¤R‰tùå2³n…åk&»ylhäg¹XrP~F¥ƒŒu|ê“¡aÜ\·ž'“†ˆ¤]$‰ÿÔ"€ªZÓ†§«F+ø,8²–E1ø­JO¤šn-Z•”*óUDñtVx#Û°…øU(·_"Ôô}©Q;ˆ¸l«˜<77:DT˜3ÁkÖæŸ±RâD¶ Á_'ÇéÀèâFÛŠ ¬ÿäzÀÐÄ_wæ0(?æêö9CÌbpâÜÓFûéçÜd‹ÞŒ^½>…g2’ @­»Ýu¯l6²JŒóaÇÔwg (|Ä«·œŠötà•Ϋ LJþ+ð-±€YØWƒšôÝ5•’˜°¥Êèëm©É:˜ƒÌJf+‡oéü è¿—¿·Yÿ4—Í!KAÖLð ý—_6  Y^?;g['AãÏ8«]pJ÷˜™ bŸÏ^¹g^ƒ£`Á♇²:A$‹é2SBûs—Ú6ZduAFwÒ2= JÌÉœ`¥Z}ÀîÎ$“ì~ÓÉR SÐܨñp^¶1+AÏ )o¢–ºÔŒ v.»aÕ*‡\>+ éÒaê‘ttgè³ݼÐßVÖIí<|üM±pQté¯)—h3ú+hŸ’µ=B*Æ6µ_hû§ÁVŸþJŒ‘9¦fÖÛ"¢V•,‰íT„:³Ë€…™UI$Žbp"BÄ黣ƒˆDPÜæ\Ê¢5ª*©¨ôSVxŒ‰„@qá5óH„¨‰ð´É%…d36ÅnWªDOÝH¬UCéFu–èJ`4O`R¥j'S»½[Ÿ ]PqÉMš÷¢**É1W‹P RÕXáû\çѪ®rÝAΡOF#ýˆª5%[Ïå¢ !B¶êÕB{¦b “ãŸôÓTx|‚«fêùq&oh‘ÕT¸mZÌPEQ#rr„©~%­ßõy•Ó Íwá_ÿåŸ?} áôî»÷*z>ßÅ(ª˜Ïç»e9=<¼SÅm•W0^ÖÛªªëº†”øt:óTu)ÜXŒúõé%Fáå„p!®WN§sbz.//·¨—ë5fj Ä_®W%:ƒy ëz;ŸïÖu]NAX¿<=ÆÏ×ÓééW¿úøüüò×/Ïww¹æ8(€#Ž8âˆ#Ž8âˆ#þÂæóéÿÛ¯ï€ÝÔpÀÈ@`rð-ôãýèm:'Úã¼õŸ ÒT×ðîóÍ X г!=¯ZTûÙq9…R¾é8{×zÀ¢ÿä°Ý$u-+u†À žßùŒðÄÂ󩯜ò“;Õ¯y/¿Rha‡søT¢méÿ׺ޚóÖä5’9J¹¸¿*T XK,¹±gá©YÒ÷è¿ä¶™›N_$ª#AÏÃ?  ÛãZ[äÇŒТ3S“ú›;…¹@/£Uä€ (Ø/]0mß=çg:­7}¾ìßq‡þ[„· ÿØÎÓ™JN‡þw(?&•3TÚ'\[E tŸû:LMkVòW8¯™Úpwò2à=K‘Œˆ§\‰zW[ oöç*“漌Då<ú4H¡iM!UY]kt 6IŸê 0®¨Ã¨5eÇÙ@ÍÁ¥›Ä_õDÎÈZ[&Ûf¾½€!hv.Ag ;Ü&¬û7$%K£–Ð:á¦é«ûµïÙÿ °¸ÅÌ —ß±úþ]!•ªÄÈU–ÔKÿW¹*f¯o9¶”áÝ$"‚ˆh±ZÍ™ÖÕc òDc´",¢!p¨è ‰¿ØV’ÒÍGKäDiø¼ó¼5Š ÙÔ·úˆ(s.G¨ÐsbF4ãñÄ…a’„:K3 HK'@1VæÀÒ ››:üÝL™Ì)?>Ÿ R4k .Z`©0ˆ$„“òH³Î&Á QXB‚°“P~™ÚYGEHEÍîCI‘€¨øîÖZ„qH¸Ÿ“QÈ„ÅàWË•× ò:[Ƽ†ëN¯ªQ¤*0Õ)ã>˜å­RÅ#¹µ˜ä3ÑEšˆš‚…–Æ9Ý3?_×ïø|»Ýž_^î–eI³äv»=_®·äzEIÎᎢh¼Ýnë¿|yx|<Ï©ðâv»- _o+A^.W•x>ߥAr»Ý–åôþáž—Ó°®ë§OŸ¿|ùœünëª"b”Äí,ç{‘•V:NDt‹ñ|¾ûU8)Ñ_¿ÿD*ß½âÀªJáxY<âˆ#Ž8âˆ#Ž8â—Çü›¶n~£ƒtŽÎ[ýS ¯ïAÿìÀýoÂ×›ª~Bmf¹á£@¿ú¦º"'íŠ P•yÆ"€^¨žßšè6À±ÞzS¢ˆh$‡f_KÁõÍr‰€]E*¼µ­<6# Žß¸–¹H¸Á~;“k û Ç÷ßêlr öÔ*{ð®C´Ñc`ïêL‰hB/ô¿Ñh«ê½€GÄž¬l]ålÖ,Uµ ºð°óü¨¶Hg—Ùç4¯t0Ÿ!m¡NÇÜö~pø¾v¾Ùu  žzI¾åv› ûƒ¯=c£ígêèŤyýaáe]f[èœÀØFU«†o³0>B †½Z7Ão•i‰ŸXhÙúƒÍ­¶°rU“D„;Ûç¤3cŒ¢ŒN lsÝé `)Þ¯Uúª8p·Wù*þõ¯™ZqÙ¦YŠ5Ù- “çf‡ÀšQæ "ZôñS‰„$ÚWwo~àŠJË–¾[7C-±Y¿8Ê´¥„nR³ºiäÓ³5ᦘi•|¨Uâ"’L –%$l^’žc} N¤‚d‰µêežªÊ‚ U Èø„çåµ4Þk‚™{0 Ýf¬¤Ð*49uè\£“ÙŽ63ddöèÀåF`…´ªW@)°ÛÛoûQx„°,w§%ŠÜnk¹]¯KïÞë"Ÿ~øá¤"r:Ïwi«¿­ˆ_/Qº»»»É-Ñ5¥ö+0"z¹^CŒ/¢·5`^²_s ¼Ü"ŸïÖu  bŽJ«È×§+ëzûçùÓ¯~õþ÷ÿá·//Ï·Ûš–„ãeñˆ#Ž8âˆ#Ž8âˆ_~liãmèÿDò§á°¡2Hé7ëLßgJ>bÜF¡wOüÝ ñc¢SßÁ¬g@ýä´ oúM×2 ‘EÁ¨×ªYX™ c ³ÛÑ›TãÙ óÙ.÷¿äÆnÌÖ̼™kî„u„†Wz×¢ 0½¿ €$&§»,!Rÿ;ý–ßWõ§837"þ8íÆUß>ꩱ‚àÞ,yÔ4Ø;‰Ú@Þ;ã½-¯à™ ‡A¨”F¯dÿö–Ö?v†·{íô€TŒhm$9šZ}û”d õ4¥š˜2SfüHœ©–ÏÞZcÐ¥·»î…•Ëo©úØÔê1XbËé3åÝèÌŸ'õ îàY £-Só:•žÀð üŽ jÙˆ­Š¨5:ŽÌVIP‹Lòý×âPšsS«û(•í2åµ,î0)ÿnV“ï¯Uk)+¡ŸsiÌù´05<ƒëÙÜ”Š;Û]´™”ücÀÛÏf({2ä¶€î·ðsnЯ†^…Üž…]K_4`ð>ôÞéÉ£VЇÚoö§ ã`ØžjÀk¥QêhN5ne7§„ý3긯pÜò*±IëuÀ)°J9æ67¿V¬ëJ´X‰|¿#ƒšKðé”ú«ÀÎV„—ÉÑ´À´Yù€2CD)yçÆ†v ‹ºu–Z¶oB`J8 rQ"† »±e3^ç@;'ERKò.6µõ¦³v&à-’ðÌz»­Ë˜CKö°Žª+ãªJBeã8Ð †*Í–-s¸ì7ÜÙEq…ÚIó·ÒeTj€üœqâ#D•³DZ;ÉËøŒÛ¼y¼ŠRªî*âˆ#Ž8âˆ#Ž8â96pÞ‰ŽÈÔ ˜h¯Ø3 êªæ¿J‡€d)æðñ\ñY‚Ò97Ê€à›V·%Q´´Ë™ü8x¤ZdTZ=PedŽ6¬naL|Q"&~Ht@§Œ”²ë¶îlß´é´œræZ)À0;Eýo£%FÀam䨎½LN™];´tÐrò+¹ˆ?7sÂ¥ÁCmhaôßÄÜgŸ· úýÀ—Ëõùùùz[sÀÝååòÃç—wwßýêãøÝïÖÿú§OËr¾¼Ü¾|}y¹®ßÝ1@GqÄGqÄGüƒEÝê+ìÙ7ýyõ@;ì=c0|aS~"2SQÀ}øxD1¬¥­Ÿéóg¹ÿÒ=C˜$ý©Ѥò`49×{9ÚN—ßÌ׌²‘4÷}O*¹#§ŸÚk^³®ÿÔ·èSSí˜]£5ÓGXE¾½‡MTQÙ(Œ°â4uœ¦ 3I̲©]{Iÿ ÆW‚ÒUìs5GºÞÓ–j½•Ë¿‰ ÙtÒ)¾¤SÎ̺¢ï€6 €ŠNÙàü¢òÓüfšò9ý»Â§š^îÓÐV»T E¬IäM›jo4ŽH½ÁH§ª;æ+Üý²Èõ`ý»³t°>†rªèßÒæëJÊÌ¢„>«¶±#Ë¥¹òÓSÉÐÿ ´lÂ;eé€í@­£©wS.™°ÌZ’ç‘ét9™öC`·Çä*Œ2¿[>ÐV0«dÅu ÅèSBDă1»/’ÙÜWÒs›(P,ª½Oò°š”*{G gŒÉבni•Êjô«ÃÜðY·}Œm¨mÕÔ ÂñÖýÂò#{ R?e)À2Ö !£>ŸÒç3ò.J¢@‚—›wŠ‹˜e³HõJžvnï…yË5›"€­<ÑxÀ¢„#DœIeS¨þµãZTK™ª4PW.PÚÆþó­ý]M@gÉb.°Mš$Ÿµ®IÏ0±, &Ëž¹É Uóòùþ\yÓ°qq'UXÊ$¦²³öåš"I¦ê*²®ë²,§eñ*³.Bm'å_†ZB§óG#n9•³INÇL$¢MG¯MÇz–Q<©™ýŠ2SÒ‘j£¨®Üe|ô{‚“¹B°z-g6ß}"'–…þÏÿã§åÂ×+…å¤ã0!;40X¸¼Ù*ybœˆ²ÈcÓ̻ۓâÓ/"°[HZ-WòŠˆB²oSbSÈëˆ#Ž8âˆ#Ž8âˆ#~É¡ƒÉžî½›ÛïØÐ|qJtÔÁv€…Œs5öÚÜѨïx;g©à>YÅmuÀÊôgÑΙ‰­!hrPsЛºîÙá:¤{nL¯{5[É~"’5[yú¨}æ¨`=ã9á5¬§O±O ^òHÍѵ²+8¨³»Ð u?ºRæe•x’žDƱ:¨‘ æP« Psùîa¾Ø¼;©%:k"й4•Î-£úh`‚u/õw‰Û¯¹òš†ÂØ¢*5qž:bßà3*ÕR=„Í·¥(<PŽ£P(£6u×Y*ÿ[²þؤs5Þ„¿ý @×óÄ_S'uÄÓÛ¬©–¶[€{µóì“Ä“†Ïç1SNîŠpœ4P,Î…Lf\™mÖsõk¯»©¥M9$D¬Å¥Íp’) FS4ÒˆÆÀÈu›ž9#•æNɽÀ·¢`î Ìûf½¸¢"ƒn¢ô QEeÍ“¥{›]]Átÿ7ÜF5LÖê¿RG‚]Â7ȤqÙ¤IÂ}>¼õÌ@ƒoPgðMÀݾÕü”±t«gKuw€®Vô¿9SÌÌ„ !hÁ¦‡$¶ƒl±Š-6vLäõ®¨)á)ÈT$H¥“*N\Wîì2=€hñZÊeÓ m~Y]Æ*†TŒ OVç®`jkÇJk Àï˜YÇLB.|ÈÏ>¢éþIÚô´jM÷‘Á)ˆ&:`JD1* å#£/ñÔ©¸ÛÛÓ™€‰@MàO÷¿þo¿ 7¡í?âˆ#Ž8âˆ#Ž8âÿ-ðx/Ôb¡Ý¡´ÃÓ«ÃÚ›Þê;O`R{I™VO>X8:¼xö}Ã¥7 €ÙÕê]ª»¸kQS°¯Ôµ¹ãlWt[- :·:€üÝÎ6 ¿ÕÛª±ðœHר¥h`R°©•EkJ¹j¼ŠË‰ò»æ†"h¡\K&Õ:ÿ¡<œºïn(Áî›ñRÕ7pW6Ÿ_œÚ 0®‚†|28¬NÝw H"z›~Ù¡½TäLˆšƒ¬-T(huã-fYÆ9Q3ó»% Vg‚ZÖ_Jé¶Es%m—ù]zØ/5MQiãý~O¸¿[‘D˜M6÷ä[–¿îc^÷¿äd_î…àwŒˆ;I ~y;•`Ò^-(jÎ Ÿñ&ôýý.ÎÛ°.JdœlÇ~g;_7qš>AfðX?âªõÝtŠÀ]®û ›Óxè- ~WÊsÓê;Yì~oåo{Ê„þ†W+j[ˆ!A IDAT¥E­Ú&‘fè„ï÷¿6æ¤Do± –’ànö}àǦÿëÆúÉT€–n¢"_Ó s?hkNw2~­Ùñ !Týô¤_SÛn—'m6'™Mí\Ml«§Ïž™”gb1'5”,¹E’tMŒ–ÅÈ¢@¡ …i!Þ1ž=ÿY%#Õ\l`ú•—‡² º£kÌKž>‰ ™‰j¨»–jL~’WÊŒK›lUÃáV†À,¢U(ÆØ9Øõ±ªú +Ú)”"å²-7CͳKJhWàj,÷Ϊ< Öý7 æ@$iH”Oƒ¹àù™¢s23IUIÈúñÌ—X3'ÝÕ{$Ì ÜÌ\ ï€m’§ˆ«|)·Šá­àˆ#Ž8âˆ#Ž8âˆ#ŽøF—v·o¥;{[w@›ƒ;}jõ.0ØÙ€P‹ÎgÕfÙ;óÉ šTôdƹl™lýs£`OÈ(u@‚ãwŠ6üS:ª)˜ Ôâúasu “‰?y¥Lž‚¢s ·3ÎïÑìFC¡z8/Ñ ¤ƒÝï–¦Óš¯UE o²öÓƒ[TCñˆÄˆ q”ÜéÞëÕIúÌsçuKçªÒ9£\‚œ[l ö,6 Ñ´­¬®4Ä*ÀÂŒ¨Ù–¹8Â@Uc «N›*K\~¶ öceƒ“+VUΊ¡2+ŒØºý% ” Ä)ëÒ‹šUÀ÷×°^W‰y‹ÆRÀI°¿]È$KÙ‹¦Ú梄Q¥¬áCÆ$ £íÆ´–j:x71Ôë5•›Ùð­r= 0/"J´²²ô(¹ÁÕ– É%Z$­ã­o“p] 묫_¯&´¶bÀ°5ÌȾÂ`eåÚùZ PÄ ñÄŒëî!*P”Dü2×”D¥»_0MiL`>¼uÏ€%TÚùkmT[Ô>£&©þ¯VÆ5P~Ë&hÜí³^ƒ3°«åL÷­ûd2Lô&eÈ#Ž8âˆ#Ž8âˆ#Ž8â¿{èFV£¾^ 0Ëêð¡¾ox7¨_qÒ@ãpó =xˆPãÁwð7²Io"oéÎWq§úÒÎ#qcÒØAÈa÷FÈAWœý TrR.3º—è&‡=ª!¥L1HCM€u~{=O9qÞרcY¬¡å^b85ÉŽ öÙDW™{!¤w|‘Mˆ­³ôCš‹NÈT ¨Íø¡ÚQ€H›P;Tعè¬wwäû;}üÁ³.ã¾¹Ø7qê?<œ¢¾ò× ?´|¦j:¯L—³ ! ëaœ¥õÕ(ŽDRwi€Y(©ÑÆÑ”éŒr&ãd¿ y<½[Î̹:kʼnÈ ý ÷2Iý±z¥À.Ý_'ÙŸ^gÌ6dlì½K­û^V§âê˜zHtÃ\צv00éxíi’5e¡ÉéÝzA=]þ§†ýÍ‹yª“…‡eM ñéî­”)J¦ÃÖ–ªòâ¤:S3s]­ØÎ‹)ø>ewjÑC1NÑzû›9oX"è[rþ‡ý½ÞÇÑ¢ùG<ŠèÌOø'—&žúèje3ËÜ[–E²Â¼HŒdÿ«ÏHª¼Õþ³´Š+ݪ>ß~ËnuA7ß’(…1nO)Rôýµ”äÊ; €~w]­‰kÄ0Òâ(V˜+éµ- âNL¢Ä†·½nM Bà$”u …_Åèš&‘¯zãBDH=bæ Ò³&¨fWxÇåä/†ê“Hj|+õÌzö r—d›h’’‘QEÿ©VU !æcý Yš‡ìõ6MGô´ks;l­.ÛÖ4ãe,ä{WÓ7°l¿õ8ÏõúŠÏGqÄGqÄGñ?.ÆÄÿi)ÀÆÛz¯Ö;×6ñ)Ëô&'Lö ˜W—s„¢^óšäBÖ‹G‘ÄIïMúŠ»úÌn#å°¶³ù „’m*DD¼4JÀY ¤«cDdZRj>² uŒ¾Ñ\$dÞáù:ÊŸ0Úñ–ƒY%ö!lQßNrwp‰#L¯Ø¿qz ¼±Z“'8…ƒ9Sw™ƒÈð"Bý»‘çt % îÇÆ›6?[¯7­Ús&dï/$Ô®÷Ø|Æ_U-> ‹{ÏÝ“5]©wW“”‹Œ­ëäJûac×l„½áœEwë3T ¾Ò¢ÃïD&÷=%shÆjІ àº*ýM›Õ^‘´KÜ’š*³otfí¢¦©n:lÓ7ØŸhp'v¨l§d™¶dÒ¥ÛXlcKK@)[¹ ³†mzƒ’‘Áî›DMƒ‹©ªÊÃ*XtÊ<6±šêRh `r¼¥S­!/ôD¶ ‹2d#_}0Ñü7~¥.÷*Èck‡@]MD«þ!4[ZŒ}kÛL{`ëL§¨âSÆ™¡­ü™æ™Ëšµˆ“¡A//Ókè#Oç¼<†üâ@Yj›[­@SòÑ +Ü„ôkF¿ÝØ^¢Qg œ»"ÕqÍ, º³ÚI»åßÛ¡ünì&ASE)ÓH»Ãk5@ÖW.sþË $ìlóQD÷zéoˆeëpŸíREX$ ýW9—\ˆ§ýäì]U‰(¡ìDÅí²^.ÆÜµVÖ"‘ ®_‘eSéFõ—×Þdº¨íÇcsbiÐÙwR?¹\ Ð]ÍßÕJJ€R`C––a­mE&“*Þª”’À`-IåDVú Í¡Ç֘ͻ.­¹öQ$daA(© Ásäm(ý\­‰SçÔšU).½–W‚Ý5«ÊQ’r{Úg{¦] µæ"`VE’*J@Þ~XLR;{•÷!JWšj5H„CÈ.ÌÂø\bŠet~.6 GÀGqÄGqÄGülc'Ûοïx£¢Ãx5rgÙFÉ+:Ü )èÐÚ}Ÿ€ªVO¯‰û·2ö™y€ÊNa²¤·¥ÿ©ˆö°¹ ëmÛAØíýN$§ÃÙ»¨ õÔ ¹óéM@–rI+°^dÄɽkè$fÏ[½Q½G³º ú;îþi«í"€jK@3Bv¿hþas6s BÐ(¬YfŒar’¦I˜8‘À`š¨zýsÓà1%\=Œ>ÔTMøñèäû­Ñ㎴K—ï?•ËŸ6O{ر3L U T«Zù!S¿Ð]À¬‘zBÍ8/ ¹Ú_mH ØèœžqG¤ðó‘“ŒG«Ë¨÷®Cö60´¯/%輨ò El p šïí‹}όݲe;ŒN¦ UÉéËæJòt© PÆÞ‹N©Vë^À¦Œ€J<àêr”oœ G^ÊWÔHmÏñdßÙÍ™ywæmØZ7ª öì=Ü¿W%Pt“]#Tg+gwêºI¢@0²MD~²îǾÃööÆÆCÈOQ O£ºóÊ‚(’Yò ï2„4褷G‰€H¬µ/5š¸;£­«KBi3øžZN-{º¢iú*ZŠ|=nÒ%D)ÏE*JH®ÂIÆ]tº[Xn Ñ!]¡CmRUš°ÖþßI3§Ší”tx"RŠ™ø_Ÿ.…ìh±þO¯îd¨ *嚟ÄБÆf½Î¸z9tâ<žÂqµ`ŒR­cÁŠPQuwÜ"«Cƒ(…Âc§*°@êÌÂÖX:*ݯò|̃ØÑ›ú¬qÎ‰Ø U‰¥-÷ºÏ ÂQpÄGqÄGqÄ?טó¾í1^·@v„NÛ@'<Á :Þ’5hܳò…œzË–ŽÉç/÷ö1Foïò-'Rã9cy‹DÚÖþ±*Rôš7ÆGqÄGqÄGñsŠ·¡ÿ¿õ™@SµgRݵØ®æ Ô\·½CÔ ½ÜI©4¿Ú™FÚ~šáá£eïl2ö%3üÄ0oT´'ŸPŸ2îÇÏtœö‰Ñ·qXTk”ººuš'©]!ˆˆÂbš¤^ž»Ýø9 “Ç”t—ï)_¬<žWsjUmLuJ°Éx£J”œÕ’@*Ê !¿J‹êT)k´éÕÁlÀ %ºQ"0~fDZ´óÌPÝž¥ë]ÚÀ|+D3=µÿŠóP5Žd % ù&;2Ãúd«‹ jÚ&£©ò MDÛºõ4|r/÷‚3¨‘ù/YÄo÷ ð¾ÐÙB×—XãsîHM^ Wí‹ Ô{u{ø{«îb¸÷ÖoXmOµ |›ö^WcvƼÉ'À9”k&CjH5-¶EäÃÙÃXR[ÆÂD=?Ñï"ùtýׇÃV;™-ð[„A'Ó¿ñ1¿…Á¶e$Ûw€¸IÉßN>1è (tÞHzMLèõ§ {ù?Q@UIIëZÕö¡#ªFî?A¨¢YÔg\:;ÏÞ<½’ú¾Yç"û膒ÇR‹`‹$Þ"„à9$5frÆ­ eæeYbŒbê ´­Æ€ÌßÒŒ¨„\‘é¯×‡B(¸fÛõ;ëÞa_7ºF-a¿ŠãÛéìšÕm“ÜoeéyCŸøú¯W[‚iþÔ– ž‹¸G«ó_uòõ,¦>zGÓÁ¥j¼áÑm¨Û¸i%O{‹¿z»8¸ê„Í;Ø«[ L õÚ{ímM<Å–u- ÊСëOó”Û¡6¯· "M åmâVƒ,Ï]2ñXDÐØ¨¾oí¦7#ÝSËØºªçÆ»‹t¹ê´!þ³=Mó«]¥ÕÁ¯(e†Â*\mü‹§%MÌË”Pl¹tù¯/-¤&Œ=›;í‡WJ †ÄÿéÇj× ‹(â4±Ø[î:Ëàq™Þi¤šÞë˜ ¥ôVM¨Aÿ‹t·Z×Ì…õÍt3¼ŒO”º)„üÉ4‹DR••VàLv×! ¼NRN®œc³‡ï÷ö98ã·ojTE½û)ÓhþçodÚ8cþÌ÷òyyC[·ÓWdÇaæï…O#£Nàß-.…Û,¹Ï¢y™ö®­v)i²›Œ¤ÆsÕ~8–”ó¥h %´4»ï`ÛM «e?<YE R½‰ˆD4F‘XÀbU]3ù¯s`À!0³ŠÄä[Ëæ¬^HÎ(B€"’÷ÚÕ27jkCQ³1°­õ1j&0/Ðb°rqG |S¸Ê!ûz«1/‚éÿq¡ï˜˜­ßØê¶qÇ ýÛíЂþUˆ‰ŠlTÃÓ=J^c1‘)£?Ö‡ZåÀàØ?F)5«ßÜ6(7KâÜÍHÕ§%0ÀŒ(åžæ>Ͼ„@ÚÊ ´˜H+åášÊ 80)9q9"­"u°°> ÿ#Ž8âˆ#Ž8âˆ#Žø™ÇèŠøæ^ ¯úý˼v€‚ê(¼ë¼õûÑçvÔ %<q.O¤LT|wû°û|Iµ‚!ímÝX䯡Ë-:ë9€*õ£Õ›Q[nþXà …Ÿ÷!™#ï ÜÐÖ À^‹•<ªþœYÿvÎ1d¨„„ zŽ LX|PdCA¨¢¶ow|žýØŽ’倪(ñŠP‰à î-ÜÔF$A*ª BÕ ž1cÔûÊZý"›hŸ1ÕJøê ޹Ãb—K^³¹•‡hC±Ù·C ç•[°²Glf¸ÞИAá É8Ó"Uj=¡[e(˜j¸£Ýè¬YÉjû¿‚û¿*¤£ß)@?=ú_æQCNЈìJã÷;y—-¥ýÏÉ¡æ€eFv„ÍêÔzôï%õU´.³•1à0Ô•s¹U^ïÌÜ`Kƒ‰Á°FRsêvnwØÑKeÝfv’IK@mîh±°B}Ðñ¼þÒ¬ßÐÕÛÐü7ƒöºýHð7WxÑnŒŠ«clnó%ù (=î$£2¾ˆ .ž¶‰ÿÄãÌ7œ›Zò$ËË4ؾ±˜¾¶BI)ùÞQ¢éïVI¦@Ö‰H¯‚? n`åü›êP0çÀ ˆŠŠ¸Zª:H nW<åg&%p "EÞìUÁP‘:7±—­”S/ê,髈MÇšw›¦ˆ¤Â…ÔÙUî¿=dâŸ3³ V­¾»¤Q@ŠýÛí? §&³cÝí³X”H™ER{êfŒÒ†Ì —B£â³Àlõ‰˜˜»‚ŒôxŠpSAT¢ˆÄÃNU§xü@Éê—1Û¼ŒÚGqÄGqÄGñóŽi6!¼[¦n¾ªOþ‰­—ùŠ+z¸¯`•“tuŸÔo÷á-7`j©âÍ-`&ùÒ0}Ú>Íš7\üœm¾¦N%f¢\T™4@«™°Nêª!p>g Vf"%鮢¾¥&›¼Ø.\"ñB Ë€&È^ 6+*¨Ô¿E'ξ,#¿Z>ÚÝ+uãj[#õgªip“™°izàôœÿëE“Àaw²ø[ÆsÖaÌõ¤*Ñœn%ò µèj™ ÚÁÜ“tò-u ã*Ûl'|'Líì; ýï® ~ Ìt{*¼¨Õ«’\é:,%ë=¡Pm»u¦Ó¦.cœœ°¤Šƒ§ËýáÊÁ$Î)X×uˤãi@Þ«¬vvëô‰ö.Ù4Mw¥! ßLѯBZVdL­÷²›­—ð– “§ìœ’38Î'·‰äjÖð±V½.+÷•+–X.ÊZ(1´U ¿õÈ•Š…qJFö "Mè…ø7—uN°Èí¡UîkRCàJšö7çäRcédÞ€ÃuÃìÚ×É9)$Ìoõ¢ö¸¿t2©0 Wž^{ÑÙýD¥óYŠšäÒ&RNx¸]·ÔŒ<;WG¡šå-$P$e—î+yA“ý™ßJ³4À!sÅܤé3T³+AZ ¤AÑP’(B뚬*ó,Y.¨Òu÷ek¾½­„òi!Ôb%3#ô;ídRœ’…D•CITW²Ë8\ý—úï…)Å9>—ªŠÕ¨Qˆ6F Æí\·c²’MÔºÛoc ‚çÄ¢YkkŸL›+õ"B©–Ù €U5´¡Ø˜ÕV|æT­bÁxn²}Íѹþ’ Ns^dU­ó?m Pfæcù#¨öàxË›²‹¼ªSvÄGqÄGqÄGüüÃkÖkoð£tÿÞ>âoî£5ªåMvÆЫ–†aÁ.¬ð*2åÝ€©¤Fê¶ß¬70íÐÉÇh2X;E¡,Zdýr+–T9€Öù9«5™dz(Ü{Ô&$Q%›pÈf4õ0w³S1ê.! Ò¦y•î ©DµŸ¸×‚òcêÿœuÅI|NŸÚ£ãfLFVîAgÜîIP•Mëiò Bid‰î¸;9ŸÜ*•ܪ^ÇÒ¬‡âü^P•Pw¦êF¦ö÷¸fú!kk ÒŽ÷ÝèѰ¥é¤„F£1]umF/«¢I»W8Í“~ ¸YeRæ Ïõ³6ã3)gŠL£TyIj[ùARÞ7 Ε<Ú9´‡V¹à?YVµee•ƒéoPw ½€ö$¹¼­Ø ¦&÷/J!P ü n›×.ŽX®œGJtpšo–r(÷¿+’(Çİ35ÜxUS= Ra}Æ’…~>[i n uRö<™˜U¤n¶s¤"¨Éù â̈÷l~‹“ësWÈ›-ï­dÇÝçBlõÌßÚwkõOƒ0.uˆ[‘­Z”•JjM²Aj¶I-«íØÒV+P€æº §ÕYÒ]!¢ä(°„Ðm|"ÊÜ­³'µ"R2Ö²5m_(ÃÒ3Ö Òa3Я¤P)5"í *Š Þ! 'ªWç—¨^þZMw¥uŽŠ€:D»É㡺š—1wtMI%ê9x''š×£ìJ¢šž7›VQ5‚6ÏDéÿ{ï¶%9Ž#ÂÀèÙÿÿÝ­°¸ )̬:{¦zˆ™“á.Q/’`–TНs¨œê¼Ý.ÊÑ6“§ëóøÌl‰ü*¡R>ÒÍmDôˆ™`‰3_ݱY^=DM–¶aS/Nu t@^AóJAôMTÞŒ11•pŸ ma´AÎ6³v;ņÊxȼ~xõÎêRu'j×xÌô÷ €_ Š?l…Þ´ÎHTª ô?h¿íxÆ…I­kqCQmõí~éÙù$*µ­ŠÑVU¬2AòÛO¿ô…ãÂþO3 ÝáN«·Q&VÒNÒ’–R€eæ,þ®9v ÉuÇǪÍC׿ÅyÔmbÁ¸Ç¦`ÃÃÈ-"ªîz­V‘”@ÅÉó/5Óf„Ù4”üà ºM]¾‰RÂÏûʼnÁûd N1ýZØq¢X ?‘»çL÷Ÿäó´îhþÃ1Zæx©$¢Ä”zF¥Ö)è.Uf3Y1+íPUyž™óbuUáÄΓ߸qãÆ7nܸqãk,x=~ÕøœÆ]Ù-Pó¬©^^r_%€T0~kóƒ]¤Œy匩iºný¹‹î°y… 5)ªU‹RÛOI¦¹€ÂÁ®˜v°¡yãÆ7nܸqãÆM,8Á»~öêÛswp~ÑjзW߆ˆì:ÐîATÌŠíûÒì‰Kò[wGÊêB$ÔŸbMt¦d/5ÀA‰*Ç£0} ­R ˆNÚDQ0 2àßòã~Ò~y(”qÔW#Å[vgAê«©Ÿ~‚±*üÌ_V˜~7¨–a¨i'ôÞÎç9ì}hØì’@œ*äòªbÿŽòþ%MÇãÃ/ó{E¤Àé˜ý—‰œ”Ÿv tRÕ‡÷ƒÚزû5ðâˆ3±e/+õÌþ`Ü¢;- AD¢~3¾4„åp$0'Ïš=!ª#gcéîõEÃÇÕÒç& XýTâ¶csm¥^ŽàyžHTŸ¬õ*ª’Ž=GJ%"Q ïèJ±¶z8­:uUµ…°O˜æO°»^Å)JuQÌ¥™óºÁÌÃôú½œI§]P½»ÏcZFä½awÜŸ÷Pðü÷hsQ `z‡Æh‹<µÂ"YÓʈ©7$üœß*Bê¨<°«ê˜!°ê#ÄÊ^5rBñÈ)”Ӥʈç^X; úŸS´ÈôyåÁ´fð\¿"³`åéX<†÷Î|žÇRãC$'¿"ݪ V˜Î½Ùsê}=›·gJSól¹ð¼ì‘ôÎénS:‡)·~aÉÙM°\Ä@EÀ¼íµ~ø,à$Äy–hÑÓœcRD‰d¯\qÿy²â„ˆ£.,¯ýáC"s Yš”U%íE7nܸqãÆ7nÜøWÅo¾x¿Êø*#ØòøMt¨¾»5“€‚MTø;ÿä²ù"õ’š½rƾu‰aU®¿º@áýà‡Œõ‚{‚?T¤»V3üÌÉ#¢&Ž’‚’O½ì<à®}´€ïyÍ‘ÌÞˆ¤6u›FjÄåqpv6®ÊûŽ‘ÅÇNKÒ]æ(ßv뿃éyNÇq¼eµ»ªÞÑl*5ÿH¡k5S)èÝç9÷7çŒã«ruà(×C§L4Úâ&ŠÔ`É/:Ô¡™hº7eÈt膳”#ÛyüÍ[Ý@¢ºHŸLjÈï”ô©J6•wA#§0§À×1„‚_á­1Í)}4Ãæî;‹·øñ¯ú2rR¾bV(𘟵á=˜ª'mõRüYns€3ŒÎ:C€{ÁúÓ×cÀæœåAË‚_v+¼ù1|Ú*ùŒV‡Ø÷¡7ö#kµ*i’zýò!cß. ×ÃÙZýt$]U¡zª«j›Ö4K¼ô€”Hã(«'ô(ù¥¹!oÐ?ôrL/Ö®žxÜîًK¬Ìbû˜«?‘6ì´a¦¬wq8ã'ì‹r_ŸnܸqãÆ7nÜø·Nïñ?ã uü9U°fUÑ[Ö$ÑIFýû8wÖG¢å‡šÔÙLƒמƉÝGxGÃÁDR’ÁímŒ›5nýÖb¹Hð/>üEòÝOªrí8€Šª6qüOã¢íÏ´úv Ü*JS¤ @P]¨–ÔÕî÷Ïí£}écrwÚ8€1èyN6‡:4TT%\㋞G?õ^¿H‹äè2¼ÔZEq (‹TtªÜ‡~l<sИÍÑwê¤þœ±=¹`ô¡7~²xÍ£ïÊSgŠue$ß®À=*Êü²¸t°´©ù/ÔE•^P]1M_ 8н8U4&#ñwð!Á¿9[xÕƒ5F‚­nðn;F%jÖ¿™|çEéÄÇqFx+wü‘äŠî6ÔDE×á‹BáeÔùô ñ‹> åá¹<™{ƒ–Œ~*6›UÇÍ8Oò8Õ’J‘ÁÛÆÖÊ# )dÂà.¬ß‹’>ªI÷³ÚuÆPøzž×¶õêûBDkY[«-ˆ¿.ö'IJ•®²{sýáOƒâ“0à/>~ü!oð_4s…>ļ=@u‡ØÈßwSïÈz&1á…G¨€ýç#Ï÷÷·%€ dõ‰ª-IAqÀw°Ï§e/z7èêŠZsº •u5—2/ØW=¡X-ù›ÂÕÀ`nc9ˆ=} ö‡X®mQfÊòÀ\›ºQiñ#4Uäç“ lùçáùé*ú¨KzÊùóH,É®2T‰ËøEǾ1!òت;w[”îEœ$ãA*Vƒƒ`ðê^5çœ)Ììî ñkmƒ×Æ×­Å´™¤ºE¥uøôü¶2.€­€Df½`SêÖ¿lW^WI#ûýùNölfΫJê*|}€oܸqãÆ7nÜø·EM÷£_ÍÊ×ϯô«²pÍwWýémùÂñ(Ë{1úÇ&p¦ôcÕråÚ¥¼²‚à¤Lñr DÎG>°XŒ—TýRE³¶aI¨ï¥¬îZ)úÁÓxÍ sá¼joÞ÷óf@‹«±keö©:% 4IÌ´\SMnòýÒû gÀbØ›»¸/K…)ûa·ñ 6´–à"þ*Š1èy>ïe=Aû8”ʯ¬yÔÍŠuº@è¡ T˜`¯Ì :-©ö” z@ÇUWkJgkj>w”epKè”@ýo‹º|+~»J É&\¿*ù1£C7*À¦³¥Àj»XKPd4¸lò+a@Õàóh]ïˆJ} ï“…•&œ[„Ó{]ÄQp\¯&°ÊòœÓùóF¢]ïOkÅA1©k4ácº8:Ø1xzGnÇØn¦´iÛV×~AU›D{YÆjE¾¡ÿM¿|egv¸º‚õ¼#•:»À5{°­Q‡½•½I¼-M¨zpŸo Ví0½£Óú•¨gEjëù‹¿šÄ¿?lü*B_ÔÐXª~ ¸4:ñ¬""ˆ BÂ#‚ˆXÞúFHÎʹr¥(³ø uÕíP;,»75zúÊóh YÏ!Gº½À RÚW‰‚£Ú–!> R†ÓÖ›«º`]Kº h>ìê05Ìw÷)šE4KưõŠˆˆp¬9 ˜y0K‘š8ûZºABóQ¤hÕë„þ“ψ¥€Jͯâeó0´¡Ä8À Gsšê$÷Ì,!("3N ÑçûÉßÄøqŸ"âºrÖôyRœgþ%)Ÿ”È 5œ¬KÁî–\Ø~›é¼¥ý§lº#øœ²JßV±Á|ßœnܸqãÆ7nÜøÆ/ˆüßùéø½U¨ªÂÔÏ®û&ÑÓæ³+ã‚e49 q­€Ô¢Zª¨ÈñºVP0 ë`ùP±BØrÉÁÄ_DDò}8Ñ|™-—ì¯ÓOûp«–ÐÏa´f¨>ù‚MÌ$Z!ø0MÌí¢BmyígŽ!i€Ÿú/’¯N/÷eu>tB¤„w8|¨ª` «] ‰Rƒb0 Mpštâ*&ôì ÄLò¤–¸áEMñ¦û5RQ;Ÿù ž3˱½Þ¯0Å\—3Ò×XuõÔÞ5Pžè,‹?Ôä=¨¿°­Ð[F'Ú£§o%O\ÒÄí…r›&„%œy¦½ÂÄ)CêÙ³\Èuf•x?•iÛkžx $O£_Z9ÕÕc9“g±å€>BÌMBi½;hÚÖ­£©Ä’N4iWÔ© ãx }j¯ÒœºèJA½ñ3?ZŠAÅ6/Di 7Ÿoâ/’§êï¿a¾e–¼šânf¿ ©/‚¦ZfÙUªÔ[— CÚŽâ)AD³ª?A8ßM8¾kbu Œ6jº-£kõœm]¶:úÊQ5‹<€žò’ã ^a@9Œ êG«ß™¶"s¦ƒiÅ‘÷ ÞÖ”×»ÿ2$𦢑–ÄÑÈ¢gK–_~_¥ÿíDYfÕ4Æ›KmsR†Õ?€ª}·1BÉåî {Ì8m^Í}‰k féÀ9sÓ¥ùä"Í®|=ÜŒËyÐ3ð_N¡Å…˜Z«–¬}þ`[÷|®ÌùèðÛâ=‹ûŸ; ìñµæÝǨ*ð:×*y ‹7 ±êë4 Prð`f⾘y2®óª«÷F‚þ4ÀÛ ®š‚YÖÆÔuaæ´QJ¢ ŸL‘±\QAMbÈ'†:Þ­Õ‘8Ö9]èåÊ(ra;–m©IAÃjh‘9ø¬c ™¼oÀßF$øS ˆ™Õ€zÊR¸9˜`„†ºwÔŒ’¼P©HÃÁä§7™,É#¶vó°5E}§C±6Á|ܵ~6§à`’´>ܺ‰pô„IëÇP"|»z’hIÖGä€9kGr‰Æà(©Óe¦šÐëÈZ¾Y+‰‚`ÂMæÿŒØg­K¬ J:KúMÕ7nܸqãÆ7nüÿ8Ážµ@?¢ŽùÂ4üwau0²“ ë«”ÈÌaÚå†ôE¯Ÿ6p¬¹l‘ÂJóµˆóUõµsš'n».Ýddæ‹â¢¨9H9 yVGÊÔ³uxÈT†díð¸%­Jƒ;K¡2»ª&ðnµñ¸ ¨ïJ-Ù9åvû%ÉêBÄ“þ IDAT<é“»4 B3û­È›ð"òœu Ô\s'nZo;»HïëmDoár‹Cã]p\Kö±Š_;@ÏcªŠñ¥Ï÷½UìòýG˜ø ‹—tllGX¿®‹‡sêåGIDØvi‘‰z—"Sù—µ©&ÆÇ7t#0*&V:ü¼"ð…=_Æ¥ùýdCJ´Ð”~Õ„Gþ_År™V¸vsHìf’ÆÆË’;Ð× ݆Á[‘VBZ”!ý_Gõ‚þn+-lJ™þmÅö¹1…z@­yX;·™ ì‰ö(Ç _W¶.Ï4åƒ&=Àåªt%4Ðö)AÖ}†Ï£JGñŸÙ se¼njKÏ”Tgôo^øPC0±~üPÀñSMÁJ÷ãŸý_â‹‚ßKp9k‚Ò:<)ÿ%+ ËÃ1c ŽÐ ‚iÔx¾}xáŽ1lïc`tŒ¦Ðݵ0-ý°Äþ:ÕC æ4Q‰Ì}“<"l(¶W<€,€Oá2àݢG«%²ÒóÈfGüÑôµÔ+Ôò+Zl5)ñ¿Ü&+H ÉüwÏ‹÷ü ÌÒ6[@ýÑ@4‚Ñ¥¬­íõº\–¸ã®W¸®ÚƒQ™À˜&Ž añ=v-´º"3û™]¤¦33Œˆ6Ï”*õÚÓdY•ƒéŒcyBh "ýÎâ‘ÇU˜TÍ¢ˆB’ª=Zéi]º À7nܸqãÆÿ1_U~íÿä†:ƒ–$ËnünBPAÿZ>p èÅ X©¥­ã“hÌ[Y@ž}ù–t®¿_8€® ™ø¥Ò(ŠùÂìªÒš9­.)#'% sÈ'-æ£G˜p¢iq†?h UbÎzRͲñúºKš¼Ö_^§:Gïð‘º@@©ÆÌ.¯°&WD¯1%Æ(0ÒX»4ÐÌTor¢ú.N•,Ek¡F¢;—¹S-I© ã2ÞT cL8^ªéÉsà à‹Ç¸À¦ã°'¤¯ŽªÓIXxêu\455ŠuM¯vx6®5”´Ð4s¨µ©–ú¹ˆå¤’Ïl’–”|SnÑMñ?oTÛÅMc\Ù.¼ƒ¼Å÷7‹¥vkÔæã[ÆÐvþ) 5ZÖü’æ¿¥Oq°­òc—õ´(…9'MôŸBhM¾’0Îw¦ö/äG«!ˆeð_Ëc«¬óÐÝDAdž9C× ¬•/ˆ¼qÕ&ÂyW´6¨XI±Z ä,FÞ{çÔ‘?½qúWRMdÐ ‰û}€C¦ªjmÚóôõ¿Ð†žøÚW· ¹†È€ùËr±¿˜0†˜X<*è÷‰Í7žy<Õ5Å0kK£® H™õ¤ø£xz”&õb ,C5(LYKÁTHúSAäUõ!ÊÙÙªpe·õÚ T5õôÑ7žãSÍ™¦^nA6FDÿó5¢ lÚ P(, k°èó|?-• ´>6!þ„†Ój}¼š¸¾æNdš?Ö×___Hô<»´,äÝÇS/yÊÌtù—†‰ˆ­$Ë ƒ £‹južúc üÉ-¨øóDc]ßÉþSDžç;﵈Œ1`5uIÔ"QµGîcãðZ߸qãÆ7nܸñ¯ü­Pïj]ÙT—;ŽùáD]žeJîüJ ¼®Å­÷Ï/zýÔ•úwEûÑªŠ¾çÅî_á®›¯›!0&ܦÏj*KÔ‰‚Oñ(žÀÕM+ÚòuCÖ¤¢WRßçU¹þÒ€lÏÕþz«]Ÿ6D?û„z:ª¾~£Q/.(ÓFÅüQ̯nEïã [ÙGw‰ð4¸ÒB7I.#­¤ C#]°~²xV µb‘>þѱ–|PÇ: "R†=%;…ßW¥ÀN¡ PÌ×mé!„O^æ)ý£Ë ¡¸µPÀÜq½Ö¶Õûþ!¢ˆA²BbŒaÅ¡kß*fÌ^øyžG„¾¿}ÕîÛØZÙ ÖãC\Å(:Jˆ"Üïå¾5ú%¦µí¯”Ø9×RxuÞ^c<ÈdrÛ‰ !¯WóUqž¢lšŒ©"µT:ŠÈ#¢"ÏóHÞš1›ñE†ÊµÎÌy®ýï7nܸqãÆÿþø]åãgOàsÁ °»¼h«¨Ký¬ *JD{í¸|À7  ×v…€,ë\£H§q$ÓJ¦h¯ß­8Z{߃?F§¬yªð¢Ä~ |hù|s¦f ÒF¡ôøU4ÉøRʰXžV9 ‡ÈyžÊšÞ¹E¨~Oäµßúš—¯ÿKL€ÖN0‚yã'Þ„ ø„UÕ¼æj—ú&`u¢mH[Ö³ùôfIK9)ñ°üDƒžçÜÆ·7ñš³ -¶¦.z8õÕ~Íú¹”>ŠÑïÒDô0Õ%ÒÕ ¦áÄô×ÕȺÕ©¢”iÙÄ ­VQ¸¢OY™º®Œ^¤ÚWÑ#.YὊ®«ƒ+:ëT“»Ìz#„³U¯î.u@b9ÝÆXtªf- 91‘kªu?SjÌ80Þ3åG‚kn"HXqâ®´ƒNxLü,¦Råü„0%+úš¢?$§¶}¨|R„Ƙý¥\  ÔÓ3€ðy;MGZ^ï¸.™Âqµ¢H·Ëù½]žêxëDÖ¯IéGÿb§"v»æßޝ„ÝÝNè9õyžøå××W˜Í€È`=àçùyìã±áÊœ:›QÀs=Z…”äxNz -Gjc옩~³%M}{xª~°;ëâë´µÿ‘4×^EӪ葚à’;?1¦/s1È[9eÀªz`VѧòÜ8!‡ù•D•œ+ã‡nOms÷¹Õ3ä¸ý3)kóoðÆÛûÐuq£çq äû[þóŸp*» *,€û]îá¾3ݸqãÆ7nܸñ¯ ¼üæø–¿ -ïv¸¡ã“ÕüòÈV»¢³'ðªIÝ€¶R©¿Dg×cC©§äçw?Y Ÿ’gó“Ó¤¶:þ"™;ª^.°¼Èjàr="ëu­÷*êÚå€R0ÖÒ€U#!ß,sEжÒ4­ˆ*i©0ØÁ×ê|@U%©lv!žþY|jà±Ü—)Š2¢J@Bß ™!÷‚ÃýˆNgщ,ìÔ¢¢ÍX»ÛÊv¢jˆºŒÿ÷˯?LàÿX! œ°€ÝóÎnÈÛâUGÓi€Š¾Ð”IÈ ®‰©¾¥„a'³CKçš‹Îp¥n+;`TË´ÿM¤ KÄ&S¡90ׄ&Ñ‘ÈO³˜墠î2§×ô¶@¦¤í–$”©áŸQìn€¼8tÿ ǯ1sH™©É-5 Næi¸!óÏ `´©á.³žÞXÒ]AÈíšËŠ‘ö—s: ý T±f7›„ô ÆIŸrÆ Û«æÎ²V°·›Cu~»ºíÏø­]>yÁÉž ø_ÐêÁËãç/èöÀPþ<Ãø‹¶Œo-9ÏÆìûjºº•oÏ@'•ç!ÂS¬¦(çPóŸ6>3û:±Ý¤&¬ï»O+à‚ÞbZSTìÕÄû)c²o"ªà‹¶ˆHF7OaÐüýpêìÇjEjÇ 1˜RÇ-÷ûß¶Öt9¤»÷¼ëVyLu‡­ÀÇèÞE±Çrâ#ñž ´88m8 h”qØ£a9w)D0h߯&,†‡ÆŠÏ<”DDœ°I'úÝÛD%ô‹Òž uM"—}s¹"è¨Åð‘3oY9ˆäÑäO Ð7]TQ¦™v>#ÏöŸÿ|ýõ×w6uÃbMß _íA ¤€ˆÜ¦7nܸqãÆ7þ+BcÕï¯úgÀä$÷ 謹qk®+Ÿ¾XÀå¾?‰þs‘éßZ2Íu+Æ®½Zmç´kÙÔ/®oÍh2ñF ª–ö,b>èò܉jùhrPþӓУyZNçyý~!BÄÄÉUìÐÖ:“ï!_~¾õ0 Â5ôÓ»§vf¨®ŠaÉ™ì? ÒG¦ž¿>ËÊc¡H6ÕAÅ8_‹{0ÉnÏÐÀëV’…ó„DˆGÖJÖgæŽlžfŒ'¤·)Ó$u@Õ“¶z| – Ô]Aa&N I;à:S¼Ý cÊgà3´Î¦8¢'Si£úqŽÅ±²/-EÄ"Á.}]£°#¬q ÍÎŒÿÑ"Ð\Ig×:þ&ÏÔq¶.ëôšzþâde7Ôk2û~Q‡a>£ºÁÒE€úÝ™Fši®;Áº=H©¤Ù„Ñ©è½%ÂOgV=} ÛÇv¢‚SãG%ºù /qhTøt3ú êW}Ú6ŠXë:¸µ¬ÈP©Ò&è‚OËõ~°?yÀÐÃbø·ã‹^ò¾{çÔì\ƒž™YäQ-ýRé†SGÞ9O zu€93©ý“®`3ÏÅÅívW«'¢o£´iú/ÊBJ4x|!ÿ³ïu)yj‹o´%0îÁ¾?__ýõ—ÉÁPJʘdLs(jrfñïË z ü6ž45›û1µ´w[Ô8»½n²'Íò€°öAµT³÷ŒwUÀ”oD…J±‡«™ÕÃàñ #Y„ÙÊJ8Þ|öQÝkXê%LÃ1=3ë5ë<` 0Á¼œZ™( Ä—Ô*àx/ÁË­Ôä\Û(·½4 ZánÌc<ØÈ,«Gˆ•çéšBp+nܸqãÆ7nÜø¯ˆýƒÑõÅ/‹Ð$:!'¯Gñ·‘Z °XТҳýõp]›åo¹ÆIÇ„Gž Ö§–më)‘DXAçù"&kåÉ9ï{J!‘{„MåZ ðri`64Mé ‡]r i\Ѽ‹Mèf=0iï6Zô}T^ ‚Ní¤‹‰gÑêšh?óko¾DbZÏ•kTFª¦¤ßÏ ³êÝ~—àÒì“bÕ> ­éæéër Cë›C@ôX\èB[‹Nê=Ž*9dÒHµÅà7Ò´#GÓìSì wŒîÊBõÔ™üZ¹„¼ a0 Í}Ç|æê3“À,)°#Wá~œ Áôÿ"jä" ø š´O§ê9P—ÐÀkmœ¾žd?ˆVOà÷%zjuÁœÃ絯Ùþ_E¬¸.Âéõ‘mÝ>çÚ/€;v¶ r/ˆ$Aë¡ø„K†¬7²ýÕŽÓËtÖúžœ³; ¢þTOŸãÿè%3¡É£àà?¬ÔjbŠÕ¼ö ?m·ØöÇe/ø„þçp@á2Ž(ü/èòÿ6t_Sþ|_šwó[N‰•² >ô4íìÞÇÄ  (WW±ûuÍÕ\Å€X r€EÀS‹ Ž¿Cÿ%y_UÜyT? cŒ/ùV’ïçùŸçÑÁ '?Uõy$ufþÃÌ0;ú<Ï_ßÂÅ »\Wp&~Qé²»=$ž×PÆ©·°Ó“ÑÆB3³¨hTWXMêCu•hPVóM¾Å¼šéy PQ‚šÅ±Òt"¶Š£Ìy¿Ø¾—ž Ë“O Õ›¾&à3s–yX½¤‘ BúVÙgÒ…;ø®ªÐØ–ß°üMÒÑLž5­Ì>úë ÀS7ìÊ¢Ï…ÿoܸqãÆ7nÜøï œ*ôhíöÞüŠþ7H=€!‡ƒ.–¼ÔT\Ñ­pa=SÑpðw³€tøÊ†ØÒÚôù1÷(ogZ®iK½§M~£¬Z@ó’™@$Ϻ˜â£µm—ªŠÿéž&nÌêß )rÛ9€ÊÊÔ’‚Læ]îKst8šlw0ÍPuA| ;'¶Ñ«{¥ˆ_cû®>Jc¸/Âî¸àç2­T?åÉZç1 ÂG4¥Õc8Á!äM!ÎÃÚï«„”ÝozS®×Ý[ìuµføé>C¹¸0¥š:Í™Fôvä}ìéT7Pq*TÑÿUáå ‹»ïžIQ±ƒuoèH ØÇ)å¤Ùk–*ªߣª rÀNʪ j(y½ˆìHô´ýþ‚þc[úŽª.Ÿ­e5[”ø”koÂbh“T“^ÏU4Ùæu‚P¸‰¤Ó¬EÈëçÇ/ºR‡õ¾—+tƒC˜!ù±÷R4f!ͼx«–¹ô³®mïSë×¶xÝdDŽ÷O ÇBCýL€ß\vs~.¥’Iè6§ ú5˜{p…©›û23u9õü3‹¸q­ÂÅM¥f;MèFT9NÄÌùøÜÙì¥ ó×`R}žç[ž¡_yR‰¢6Ïe÷ÿå÷׿þú+= N7fÒ³*’’Aû"[…ö½ƒ…d5L.üòÜÉDA`0᳄²G¥µLØ :¹Àîêâþ0±-üÏÿõ|‹yhÙþH•8Än¬(RT!bâQÎÊP*õ–WgäpÝ¢ %%S,c0 Ó­]•ˆUE…ÁDºˆ²H2Xá7Îl2NËZ£ÌŸ¥ß£à®µ’1nNªT•QYl º`§þ ×7nܸqãÆ7nü/޽à ùrPPêI‹ZáPcX÷áp¢¡›CÀ«:Vi÷Ô'éórÒH ýû ‡lØÐœÌý5˜ÝÒvjD¤5_ˆSÎ6Ïk¸ü© aíÅ,Ø,T¥ ]oöÓ 9DÄDgÎ. ©äûÿ|_Æ)ÖF¾Ií÷4tZ$³U ¬òä»má`Þ¬zË*…C!YÎ áõ3óŒ–7mw_pQ©gm¿ûÌ?ƒtàF)9ö'_n7¶Æö†žŠí|²ë0÷`÷®øT&¨Â&(˜¥ÚËÕ$t°¦À÷)¸'ÚkÞ—_Ñ Ø!þ,¹°lå6Ðã¡Ð4Xàw?Þ2= ß1– 9Šìo¤EwØ=B±†þHÔè¬wÁ–:ÚŒ ¶®X^D„@¤àá§Æ¯‚¸J°n47‚¹F½˜èDé… Yé’ ŽÒ6¹ —PRìúœÚG†ÆæãÉÇÍS}Û|6Ìÿ#€J£¸±5e-½déW³ß‚‰ã]ÌéG1¢Ã¶Ž"ORs}|ÿ“Ü==7èßTÿ·øZV —Vê¯%;«6µ:Á,wœª. ¦G¶–å¾âE1'*¤öêŽB¬+Ì"¢¤V½A±î»¢ûs’VïŒR>â§.œŠ ɦ¿Ï VhñN ü ¬òMª€9ÄÝJÙ,Ÿ±Td±¾èÂJÒ6×¶-êVÛ²ù{KܸqãÆ7nܸqã¿ ò•KO¸r};%ó­&·ç—…-­_?:¿Ãýëï‹i*èð§¦&ÔÅ+jvü^ð#ÎÆ"ÝC›/òžùFä~b–Y\X£yÏ„º–zóc¨Å›KatAŒ`(–Šê͛ޖVj „Aô¸R @KÙ:J)†ôj€uøm1YÁ»áÚÕ”¯H1‰øÆÕ„7ŠîçgNµ)4œÐ'tœÞ'”37­2áC×(“[SMmiu9Þ0Íñå=Fä•™bVjž³š·,-À“©;eÓï®(*Óâõ4}Òzwj5EŽe`¼­à(?dGU$àU‚Yüøh¨å8.<Ñü}-5EÇ…¦¿=ÿó†yñ¸Sœ–.mÜÌ©¬ja*Úó’øoD”Ýn"f Þä\éݾ¶¼—5ä93é>Ô™*ú?M8 %¦G,Y+ŽÕ•·áÕøEˆ8™÷æXþæ!ìVt¬ØÏ¥ B±4z¸pã+|Ò{ÛtþP{‡Ž$ÇÆïµA_~ƒÓîÿ'ñ•¹ÏöÃ21,¾ÆxôÏÕ—¬Hˆ6~Õ šð.cŠŽµšJ;ÆótW÷•œ@0’úÕ¿· ÆÔyt>9__¬ªŒaZ.]˜Jq Uq|Ø:ç‰m^U¿ŸÇ7~mZð¶43ûõŠJ®§¾%¤‰qº«¬\+®ÉÖ¿¥b.€c‚EÕ“6î!¦ÃrdÕç ¨aÞrCÜØ vŽ)úB0"`s…ñΑ2hèól9(¯k.á©[“³"4ìŠcÇò^ec꺦SûHÁ}{ÈA"™•¡úÿ1äBGÑžÆìÐmM Y'Ú‡Yµ€þ¹®7nܸqãÆ7nüï ôu=üqO±WtÐû*d¦úUl/\o¥õ 3‰¾¤–7Ä¿ äùá÷4(v'Î~¼•zÀ7Æõêm§C×|ÆäÜivÌ”ðý® ï‚N’`U†áyßBwÞ1)ÜOUòµŸÉ0¾Aú¬V Zæ±Ëí3À­,ÀX™e%Va@ÌA^Hd_¦ú&~w–Q:‡ñåmNÕt§Y+`ˆ¤ÈaUS: RÌ6"ƒž›xIÁãÌãYÓpêÙu™Î« –¥°0àÚJZ:]qÀÓ#áõ½;%àH•㊤·ñöЧÇyS_¡á~ò1¥¡®Õ¢dÞ|,ê0;óöa0Û >´“áclÞï¤^xqÖÕiŠ ¤ô’êž8øGßœ “L zÜ2~e) ¥H#5™*íóÞªŸ7¶ãhyÇÁõw.¤}wÞY“ðÚ^Ї‹ùÜ^?vןŒ_Dd¾®RÐmÚ˜1sdÍ!ÜJmqµ­ˆ|î WOôŸ<‘K.¶Á§êÍÓçyò7)Ü%ª&U“ziGrÆŽ ¾ËÌ__ãk|}?ßJjÔ†ŠÉÚhÂñ"*"(Ñ÷÷㬃µí¯ïo"ââ æ’ãÞúÁŽK½i±ÿMW–Y”¤T»².«\;9ÄhjV½5lP¾R±ÞÑL2J:|ø6—Ñ3Ff·!‚@1 =Ì/ŠñŽeD\Ì"’±Q]«UDÆà¯1ˆè±KÐ9m`&£CˆøÛºÚk@Dkú*äÅNi<­cØöSháU’°ÙæH+ô›þϧ§õ7nܸqãÆ7nüûc‘ýÑOà@KjÆéU1ý›€aÑÔùÉQîUðgùkUÍHZíŠíKH`ëi <Ó×€ ¸>…J\½9ˉN,2ÁÙÐŽ¯0“îéö½d!0÷Õ€ºmbú³Ò¾XôRÝ+Å#L¶À.ß¼ì Øîyßò®Hq×ú U'èŠõLH©ÙཀA™¿l4@åxúÁ#«)ðAúqŒ- `¥LÖ\>Î(ÏŽLÀ£é‚D EoÊWxOéÕ.ìœcÎ^«°$}cžÇ…2¤É,’;ºª“w¡s-ö 8¥KfkZþRQMé•EÈ6DK¶:„¢ôæÙÛ›ìæ©QÛ k΋OÂŽž—)ÜÚ¿ô@1tÞ‡N/ÛYr^Ï|öãôŠbôQ”Ž<*SnqEÿ'°Ííª‰Öz‚9P‘WŸ)‹º×LŸ·-â<;óe!`=ýÿôKjéÿ±Îããš´ì,PÝ‚¶»:ˆä|qƯ¸5XWÈF}}^ õpiËñÃRýËOÿ@bñWâÝ5›g­MƒãEäy"2Sܪߒ_Y¤lŽwÃk–ª!5o êd§XLƒŽV¤Ç-塿W¦"J]‹Jî®Kcð`þ–Ç/ÍŠ¦’Ÿöy<ˆª]¾¥¿‹LíÀþç¸LkeïÛr!_â.%3?†µfà°ôA.Œ¬=˜"øt^ÒÛ³~žÇ¾Å¥zËê¾yù1ìÿýV¯¯ðp"&“[§’+l½¡¤L<ÀjOp^ú@åà˜È”‚àÕ$Y¤¥I“S7{YÔÃR«Ðl†ýDÒ¨u'E²&BëƒDd¬—¸qãÆ7nܸqã¿-–$Êb>%½rM÷ÿ¤ÿó&§ÿQ·}×ð©Yç²L:…•wÈõx’ÓkÖêlÒ(K·7dnIô å'g`E.kò¡E O)ãÅ êÎLkÓîø "üÚ…×mæ“ÑAÔ7¼Ýšå¦,]´ßqŽ´ázRÝá§è™1H…,ÑY¸é¼WìÀÑ瀔3M{çZ˜ËDÔÊ,¦A$½QwWjOD'ç J@ €ä»à•Lòíêÿþû—šU¥È¤Vqk©Á ¯oåhZ+˜´Ö[¢ºaúwl‡Š(ô[,*Wìµ ªËW–i«·d> IDAT ô´÷ù¯ªjR±JO¾&ò‚JnèÒ÷Ý?œhiš{Âvg~ç⚘h&/Ž)©\dÿÆYv? éô^öÞ|RkÚm`km5ªÀ?´àïa!âø?£ë®¿@¬¼ŠíGUDo=ß&ø:H^w1 LºO¼ ú{Û Ò©TØVWôÎD&ðÒ©±¾_œÔðkYÉ’tÿÛÕÇ;Óÿñkïü1¢å¹‚þ¾0U`BùÝ8ÜT5Ý-™ÝÚåÑSï~‡¹ëýcF'z[Âó•‡ÕWÍ%.–tŽ=ZP¦´%ŒKψ÷¬yf×Ñ¡"<_5_|ú¤µíTºŸSÉȆå1D¨ˆ|A…,MGÜ´/¦å:Íç¤>ÆÌ¶&R/…7\Åå'~>È:M[¶»>a|LÍ®ŧÕ;eQ¾ñ"ý±oÖwg’L(¢Oµ¸Ô£•þT¤BZLJ€b„UŒ™‡îÂSx]²êOÕ$ï˜à@YGå~ÔIÀìž6u¨/µ7nܸqãÆ7nÜøï |2N«‚Aí‡C^Õò©y™§“¾ÓoÿyÆ/ôtQzbä§®8d\iùn£ªçðT¡èuï¨Ó+*Ò´UÆ”‹Ù9Ï3•>âû¨N‡ÏT餬k‰!dƺ,ˆá‚6fIk2Y½ãÁˆœ¬ƒ»à¸X'®-aCštƒËøÔÍü6µ–m´ìZFµÃy=8=07„nû+¾þäPõûÕF¸b;•ÀÂHPyÖµäu•k€KAÙX8´@D —¦…!¢äñ‹]ЪY®ÔñI_òRXÔ¹wÓÊJ!|T¼Ñ‹ø«b>õ¿¦A!g„©Ò“SZ û€—ôÿ#é¹>»œøDÚX³éèýy£šæUjX1°T€×Ö &ÈŽ£Wªy•c]½kZ=òÖÕmׄiSô_e.Ç)—À…WÈ´Ï Í—CaAá\f áΠ@·Cpï÷^´PÅåº6Q)JòëÎaWͱ¥¨à7Ðÿº´Î±ýw!=Ý4£1Çý­øJM»qÃ¥lÞj6ôyû€éÔk7ØÑã¡l©r,Øás‡µÅWC˜—öÒ¶*ÞB©zï°,e)BÓ`ÑeL<ß4¼He ™BNDijø ÈëäÉ1Ñ!O÷3 ëà~(seDRI2yAÕjé4TÛ($ôy8ŽPýNÓ°hù#WÛ‡%>Õ„².„ç8Ô† 5| ê*ÁŒ4éaÙØ‚x2F<ô;e1oãéA7< ‘¨6ð2Gû–ñ-̺®Œ@¥¯5’Ø0ך)u‡ãv˜e ¹>ÏsßnܸqãÆ7nÜø??VœL[×Ï64sj¾øÏ`ÁêñKÊÎhˆó4(-ÞágMÍôÔÈ»>àPÕÝWé¤kß?Y½ ˆZ~zX¢Nm`-°#˜:ü.4…=Æ}sËȬo@÷¹ê~Ʊªo5 fá_„=*C%$ãŸQi†mÕˆÄv5{ލ!qÍœ’Ø^6Ý©°V¯=ŠœžÐà4y×äC·±úó~½ÚiV’–3Íë%ç±Â}AŠQó\rÒáÖÔ¾Æ@Èx9­ÂDx½WM1CU¾¿Í €ƒÛð£éì‚fà\˜žô9®ÏóD1ôÈ!U ýò†ÖQªð’RyåW> òdþ7nܸqãÆ7þ»âˆþw|“¶Ðÿ÷à„bÅۇ³KÊùñ=åÌ0`"f °Àˆ} ÑÔ¬mïÉžÞ¶ŽÝó„€ó˜- |i-P¶*hãK:ñÙš“¾÷§‰2UçØ#~*˜@¤º½ªÈD«È¯‡˜Nþe­.šŽ¸(ê‹ZQö÷bK|LÑH‰¤;:Xã6àBÜ[ðeÀ$†£ÓÔ:$¼C7§\´ž§žÌ‹ÙŒ³èåÕoÊxQïÂÒ¼ Cõi¢x‘¦É"ƒIQœtÕãžÎßäµíÔþjIÐÁ4˜µ@5.´ óA}ÉúÿJ¨öéÑrÀ™´:MêQÐ,=ݶiM\Ô0¬Ùº²›‡"5±£$…t»¼Qïñ{î¿ÈÎ4èŸ ¯`T¶¹€„7(œ SîÆzu¨õ vºñ" _ŒÛßÀUôF©?±¼§ªŠÃÏtrRæ$ˆ€e«·µ®Ý'[‚²¶ÊùdÑѾ®áÀ‡˜Ú¸ü°wžÿc^εχùÉŽGˆþ)ôŸŒXÓŸãþIIߎ›Í(j9Ôìi«’½+úïÅËG¿E´C´¹HuÐß¾+ay¢áŪ"æ \õÈØçi|ËòñÇiu`~†¨;i¡HkoJÕØ2í J-£G²(É çï￈jš~çr›RýêJjJFŠhý,µ ¦Oq³rH ‡‘˜ÖÍZU•p\ˆc}µÛç‰ï «êöàT=Mjg/BËÂ3€ZÒ³ê;…O,G*v–Ë¡óéETÂ(x(3Ê®¦]±g!ê€\!~«q±‡ +ÝèdØf”eFÔ ƒj)Ê7nܸqãÆ7þB·×z=Ëò…Ä×OýÒþž•D)}Ú‘‹õ;?k¼ .\sß ÑrØ0¥ ¸A},?k>‵€6àRuų´'¿¿¹Â¦® 6+uü‹30¦õ¥ÌTŒ/ ‚ÆÍLaìi4›8Äü×Ä‚æ8ÁÄÇõ]ýÉ›ÚýxÐSßÔûÈéÚ2öÆ/^^»Ò,ÂhguóOOëö»ä Ÿ!³ZØq‘Mlg`P$Få«wÖgæn*=¢SàÅîÔzßé#Šê%ëÕ—´”­P‡þ«kqmyÆç±ŒA"ŽÜ Û•…˜Ô‚>OÖÔ¾èM›ZDSaÂ32APPQÒѤâXŽ­î¸Ýqftj=ûÜ—Ú…PrGæÅåbq$>ܯ÷g^h]ã©­ÞÈEyM£UenFÊjÖ9q²÷bˆz}meX×u˜¨y<àðûÖ! úï¼Dì–ç=âþžœÄÙ©xiŠ'爅¨ÀéŽ~˜„ÀyÑØÑÿú×ÑÿÎ_ü°ýû;&o›êopU|ïSÿ·øÚ†Î &¼îp*™.<[\]Ÿ~M>,eU ¯aှTA›ÞÉ<ò=·B$±*Ívùþþ~žÇ8€d4…šë€*{cLTËM‚üÙ%ž‚TUTܹÀøoɼ¢Å\EûHç·fG¥+=EÔíT»…¹k!WܨY•<ï êèb0%ëT3Á5[…«–Nuö1Yšª’”ªróZ ˆˆý?E­Éæ‹yDÛ¨…¨F ÄGÎó<.X”’‚3¡ޱł¢ù*w•=w§%@ –Ç)^ÙDé\CÍŸç] ôÆ7nܸqãÆÿÞ@ÅßÑýo÷‘Ò"Yr>ˆvëÖ.£?œñ yý|‘ÙÑ^Ѐ_{§Q9wNg©íL¹ïf \>?SVy¢L±×)˜S<'¥à9õòªl£RÕ„šód¡È@gœhŠÌYQ@û;3W—RÓ|5F³ ri‘ÆUHIu墬öm'Ü%Ô,hh¢UY›Ûs{·Í;¤ @ùVG2Fñþ°­: Ä »³±Éªt4c|ÍËar…‘ýgZø¹–tl£AuÏv©¥9¨´§Ø¯°2=!ÚЭz5!õU¬•yù€„yC£’*pyukãÎW<„¡¡"•X¨bB¸AyíÂAHÕ ¸þrHáx1HÞ=]W› “àâ)t4òÍ ¸ÿÕàþý‹K}ÌihéqÙ<ŠØ,Hc'%)ûpΜõ£U@·š£èá§…}׫ã‚c€feqïçî2¿ ù³=>MvòIš¿²ý¡Õ¦¨?Ú½,§hƒë”ºÿZñÈ{u\ýÁ-ãå~—ëým g ŽžÀ_”c%:¯u:=ª0Æ@r:ó¢f’µ»ÔñôÍ6 æ*Üó䩯Pñ-V=ºÁŽÐun¬ÉJêœ@Ì<˜¿}éÇsÛÁIPy%f~úVQ¨ÔУWý±Â­ÁÌJ‹àO´ˆÀlÃgQì1¡™âPû¦'±Z•CÉ©?ÎclJˆ,µ.¬|Ïövxaa[ìžÆ¬žµÛõyÑ$ù™—r$jsÕ8‰«39ŽL:={©™ËÌmÖ™™¦ÈZ{j¸ç’)ï1X5¬¬›K3sâ‰_&¦Ï›õƒ¼'!öSÆØ¿VPr|¦±*“É‚à“(Ö7nܸqãÆ7þý¡§ áMh»×p?HŒ6À'^s–SÿÎÇ«¼;Ú ÎÞ¡qo™ÔÍ ¨éÆäw+˜µJógV}¡“ä‘–ÎE¹º´X®Úti–Üs…;°ÊîצîæAd¹À2`,ýÚ-j‹‚ü‘œÐά èæ õŽf?] Lx.Õü`ÿàÉDø&S]k>f&ùIô©^»á­¤õj˜ÀèšÚÏí~Q󌡋Ì$‡KXDx–¡µLœ)ŒŽÃ;NÌc;‰ƒÑ9 O‰ßJö„vâ¡òÐQnxù…1”¼•ב uÔ`˜ñáô<1ÉâŽÚW¦¿4»[rž²-W³Ù>–º–ã0|qôeþ¸ïöÿÕiš™vÉ*ÇyJò¦_mØsäþÓIŸLƒµº4Ôœ7ëlL—oê<Ù<Â;½Ö„Êù ÅÓ%€úôÜÄÚÛ–TkTÔÝ•¹•¼W*í~¼ç/½¹J,_æå øG’ïÿð ¯E _Îñ•ä£xí.JÞæ¬â‰£9m}Çse̬ü1FŬƒ²ê«ØSô¦lZ­¨®6ùyx@CÎ~¦O´'&0¬:IUTåy†[TONãTy+¿EX•¾Œ1XuX>»ª>¦P_Gp!Z þg2!5f¬ƒç%UšêLªlf÷]ñÑL ªrÛZ¥š\ªJ”Á¥˹­N `ªtî;‘p„>¬›JYbйŸ@Þ T:ž:/àûeDˆJº„4E*³ (æHˆB–ÃÈ…2>Ë,/V IWÌ áW`*3NS„ÏÁÏÖHס7nܸqãÆ7nüÆåÏYþ (¶§`½)±ÿæ‹ÆMþª€NÙ][|WSYiyQŽQêY}Űø’pº–¼“º@ÿµJ`¨¬uË•îÊEÀZ.À¤¢a‘z–Quùl„*½VýñÚǨ"$“ 8¿zö7øwÛ^µ±köA£ª“T½¸`M‹ê2V Zô¨ZK:ZåJ¦-0/vI®WY£9Ú! öÁ–‡·b‹¬*ÿQÆË¤!d†>˜O©˜‹Ó8®ØeŽ¥r£õ³møý†Uà^„x¤·0DJGZÊo!ì‹©†Šs0G&=ÞŸþyGü“~Àäx¨<CUš&OÒfy4[F ZaßgZ,V-{³ùÅi!z·­ÆàMñe]®÷qxE#·fD Î^ÈòºÐ&ÚƒU/k_(øµPËþÑzoã!ÀuöFbÿ@f˜C]WÑ©÷›$¤<ùÚÎ%ü¤¼ß‰âÿÆô¬·lI®×ì¹€þLÆQ Ô?Üî·ør_‹ þ."æoî"¨Ðt${“ »R`SuºàÍ™ØÏlYbþóLïü§10U‰¦Z©êà¡ µŠ;Dõލ2Uêòé,Ý”Ö2³Úó‹0ø=ôB½~À| ž$+§@7O¤¹àz2»,eßBÏó|?Æå³ê`¶õ'ÅŒÈÐL0ýœè¡•(lý/êš66#¡Ð&ÃÖ†e(yzþ2€Mü©0PQ[ŠréÀËÌ•¿©.nvl•x3§?Ï¥¾a;ÿ%>ä|ñ1Ó†êúET p.qÕ³Â1ÝNj^Äê·4mF5##Òâ1#> m0AëV‹þ߸qãÆ7nܸñ'6Œ4%þ^U\ŽÂÄd}wðý©Qý›‡]é…¢¤Üà~z5:Þí «2,R+B“päÞBž€]Ë’6°6-Þ˜«`Qï7$lå@ë ;—É­j´„´¯PíAÅÒß´IçDAÔ¬l¨£ ü¥ÿ *mN­Ÿ÷üݺþY³«mØÍ´Èxo²þD©ŠqÑ ™¢ö³~¢ƒ;Œ ^Mƒ©¯LRÞzé*@s30übOÞâ‹¢ê®ÂˆR +2@©N˜âàTîлÚ0;ðdѬ› Ò{’Ji Š»+äŒùÚÌ~L@ö ˆ-“Æ0ÄðM¨øMäb:9„1´‚¢_£¤}±þ'Œa‰RÔtƒt|Yž+Sh™±j̲LÍÖbä+ò3þû¶¤¨¬¢û9‹Ó³7×@|‚Yµ¸þF3ù¼ð¯ÆvS*6ݾòŸn6I`n‡ovʬ;5¸ ­Ï°2Åsd"4 O—rLÍ‘=É›ub°/ý+ªzZ ìô¤ØôÁ'y™¡ZÒþö³Àšøþ¹wðçø2AvOÇŽ¹w4GÌ.ˆ/.Ó{hSò±¥P•„4¸’œ=å5b¥¶…sMÙNöš@·‹ºˆ¤Ê½ˆ°IÄx3‰,ª 'x›<ñ`BµÓ»òtøAˆDub=…zLT§‹ÂÛ•?òªÈ#òüõ<¤ÊmXÎ4yØõˆˆŠpŠÝDWj¸4O @ó³}×f,¼ÈŸUÝžtzrß]øã‹àtLñ&¯Ëz ªÎÈfâ+:Ÿq¬‘Ïf#ãçâ™8°zפ\@ <†¸â="à™Ec}Bª…FK‚Y:¨ñÙéoNÔBÕîx6É u¦óÒ ´š.߸qãÆ7nܸqã¿+–üAÐÝiñzNú[‘ˆ³6Ïo·wÏíˆUuh¯lÅ `Çv}óÆL+[J©ò9H„k9õʈÐkVo½¥ÙZ{\h*’ë M® í‚£ug`:¸D5€†T½æËkÑê™ÅèÅv8#ÅziÇÿ†!ÊäZBÜ??öª–þÀé’oèùs=uÊ-óP¥”;4º!¡Ò¥œªÑèn:ZõèM&ë­™Êô±˜ž‡Ø$„Ö)Ô‘F¥í5' %"˜„TrH.'ÿù8ãDË\Èn,“ RíBXy§˜Hˆ¹°kcÞ«:*ÆX„ÝAD£€< ãÚXUAjÔØäœ7¢_Ân»ÝPJÌUÍÜ€ç5€D(*a¦äú§2pŽû¿ÈžðD¨Î¹|*˜©ôº¯~…‚Ë”|è’²:¡y-ž'ÌGJÙÄ–]K´ÓBupÌÁPÝnA Ü´f9ï …çGJ¢nżnq‡Þws³–^·›ªuF‘¥¢M»ßohý¡àL®obzÐw¥Wß[µ,2¿ûDñw²ÄK fKjØR2':Gˆ³ÞS àÁóÙDU~‡'dŸ%~z®À‡UûW‹œÿ´1-ü2Ã{5(\KÄÒ”Û€é¶[:»)3³ « «Õ6åw-“>ÔNgRdrwö cx—ôÇ J ]çêy:èy,¯? r+YãjAîW=Èt«;h Þ&æÌÁ‘ Ä3‡Û€úU‰šÁʤo*…CäÅ ™õŒ•½M§ƒç¹,“µ®§úá¨è°gØïç…Ï)C XWZhþ8ÇàGŸi·°ÒW¨‹Ø2TÚ&;¨šfw³`v •g#‡!¦…VæL_à7nܸqãÆ7þ«Ûëú ðÃè´ˆˆÎɯ'5ö¿×®Çk‹tK™tÐð-=Sš`´¾·pÑ šê(µHBHLƒ•%Å~Š"³£”r@7ˆˆä9q]gw0ïyÒáÓ9}C ˜/©‚)?@DdL‹=@/wx×ù!b²~mF£zp&HmwZŒm›ØÈ€9(!Í!N˜¦HzÒ¯¢ŸßÆÌµ?kªTº'£Ú:ž«¬ù+è‹#h1c¨6<°:biüËΉ¥j-¡.¸„Ÿ³6b)]y PÑ¥ÍÙžÿ:‚O‡ÄgJæ€çÍ1Íãe½{Eˆµb³ª=WÚ.ªˆÎ/x´®ë -"ë=]]k¥QIÞjöëˆuFÇx”U ÉsFÍ_s:Û,ÄÜOjÐyÅÌ}¡Û…àñòo™béú;*ò®¨vÐ5RjéýÓÏ Çý¤O–™eûIÙºÃîàm§êlw,hÒbx9òÆ¢yÞêLY®,‚Ø|Üïö5d]²^Åz>öúGô¿ð¢Ÿz¾i‹üÁQ–øJY}  '"*[‡áú`3wÅùŸ8⸽:¿í¢ô”°ö5DþfºK¾–4ÿô æ^QÌ)ãxúøfÛŸ'ñj J*bâþªajÓŒIkwm°N¢(<Ðe0lœ?Rÿ'6Š}Æ„‚Ñ¿žç‘Ç4j¾P%‰V‡Þ0[VcW˜©‰×ü­ŠFkecM.ëˆ Ž  +àBR¢º1õF¶½wÔU‰¨Tß¹ÀN½Ýン\N„@žÇ|Œç‰Ô ÍQPB°KÒ„: {*¡Å‰b"þ;µø¾æJCÏó"#<Ÿ°¸Y¢Š+{@ÔaÐMÿ¿qãÆ7nܸqãÿFà€¾#ú‹èÿš ʪÖü‚Ëèñ7ºˆÐy×sßd໵/¯¿™_Ö&ñzЮ®°?–?,ÖÁ”êÿ8P`Äçµ–Ý×+ݛݴÂežÂ5X¨bÜ©WëIa‰L%t×@Ï´1ïV_´ÇCȨ`^! Dµ*¤hòL(›©¥Ç¥›qÕŸ³:ܨš}ñ¡b£Ž™UÁ)I—äÑ«L$$žjo—7aô—왆U¸&ÐL€<ýÞé$TÖ´b옧£ö¦E£ð‰zE©‡p !±@ D¶"¨l Ž­0(¹:”1ÏÅ—b |mŠL1n`uAÑÃY)ýã›ÐJ™ŒXÿGÛHªlÍÎ]ÂËe²æà¨ïojEƒvØ¥oã,»Æ=ŽktS)GÍÁÇy½^ë]Nããê{*x²+m¶½)]+cj ËѶ;…é<°ú÷¾ÍÄ…ñVÕj'Åv >U£øië§øÛO蘯cøl@?%ÄÝžU>˜"ÿp‡×‹øÃ£î:{}Ýþ;®ÔŸV¨‘3N©;¿‘Èo 18^T5³¡í“C"‰ž œ©iÝ"²”„Ëß|¨É"·ÎÔòîѺmoi;ì’XBB¨*‰ˆˆ<Ò¸*(óºU¡À— nn``-aWI24›ì”Œ(ÐL^ÏYEJŒaU&Ì<¸Éò̬v¸‡‰( Ì[aéóXŽ»¤ |)¡4³¡§ôÒ XU‰_ÿ Èö: ‰ ¯[`bB¨#E!•Äj…æ:Àfsœ«Û)bBdÁÄ£îß¾¼¢Áò‡ï¯øq]Hrª›ÍÊ ÄôŠ&ù¡ÅO!µ‘V¤3=æöÊmqædJëPï|lJ`‘¹PD7nܸqãÆ7nÜø?Çj€ýxATißÒ÷®<¨Ÿ®š×Ç?Òüñ“ŠBÿÏšø¿c‘Ži@<1M¿«åDni-  ð­Ò=Hàr.ÍläwpŸHŸÓ‘OÓ‹tãûÒ Þ©C¢\Ý’?*u5à)»d픦ìëÂ÷²+5MùxýGQö§¦6ž½Š]thKá‚V=¨š& :JOËeí)½5»b‘UE#ç‹-+Z÷ù…HÝÅîCÙÿCâölíVÀ|¸ÕùöïwNáyôUïÀ¼ãPQ [B ‰¸ØMkÕŸCë[[åDMaü‡¶e P.[á°ZˆÇÚ¤aÛ)• q2².¦+C1üð²9v´ljÉn¥ ?FäÿV&°þý:‚%¾´Tü%€N]oIšé®¢U@Ïå'¢G•B3 Fü·j¾Ûxu×X ÀÃñu3€KàîV‘¬€/ΡÆo8³`š› qSÆ¬ß ÷ IDAT'0gº¨}Ça fûý|›ƒoôˆ ¡jö¢$*:ebêR=Œÿ¤ŒRÆ~Ýž'§Œ4¬'L§P¥â§CDf ¢'lš)W«c°2œTPµ6i«JÀ©3t" ^Ò§iêܽ"ü’EUež.=¢*¤çÁ˜’Ð/ÒEû,]•Ì\†ÃIXŸç1~ʳ2ka‘9,‹„\ŒCñ`%U1;’ýÏû„Œ‰@©Å„+tãÆ7nܸqãÆÿ¡X…_ƒ#ˆ64í„Ol"þý… €HÆ«¹pÜ]þÅÎT ”ÜÕçËÕ,r@& ?÷äýP›t¤ lbñZÑÃ’z_z`±nÊ3Ô®qñvôµÁñ®†ÖLE'Ïp !þ4žo´Þ$=u3è1ôÇ^ì?¤Ñ-ùßÐõ\= á_¿Ø¦²" /n~ò³õƒCuËèeø>úÔ´ž&VÈÂß5eë±Õá`û«Á¹jiK[=A÷ËŒhÓ ÑåpEžTþ—6Ë6·p*n±Ž/K›}¡¯µúµ«W é\¨´^õžàŸ¼Ô´F@Xô#„…õ4 ?ÂÍ8­c8YX—ÏKôI£‹¤GiÎ}tiÇÓ_ö²ênk­˜Meœ×熢ªifVúù­AÐmÑ+ã^R˜'ǂ߆¹7ßã_Úò°÷v*\U•­_Yùú7ù‰ß쓟âK{YQÕÞ©yÍ[ŽsO’/ßµ,xƒÆ)²ê[:3g¾ü¡£’?@ERE&Ãê&Ž5ñ=ŒÃḑ þŠ*CYؤŠä1!šÒv­icKág1ó(µ06¥E„vÁÕ "j´4Ç6iu¦läèøôýY9jé”kPQاY’”`BruÑŒÂAxy÷Š7&¶tû güÉ j5ƒµÀ-‘©a•†‹–äÿ×[lt…ˆ5’ :ŠþYYý ᥠƒŠ>$äÃØ÷N6§èDÿñ <ÑI5q $v»$)wS‹º¢†ùqä&ø!oܸqãÆ7nܸñ_oªºúÃgõgèAöW@þGýŸPûÕ?Ò´þ©›àmJ;CÝŽý) ŠŠùv•Œ ‚÷³7àÞæÝ‹˜ªj<“>S!]eUJ€h•ªß¤¦NSî8s LÔPíÃ#ñ±,¹Ÿo¸Ž2B©µ“C‹€Hi zä$±7˜_Ìiù¢ª tDF£†‘«Ný$­ÉÂ^ô&|m¹Òµ°åràâø”)ns( @Å•Ü(²9*d]ÿÓ T•ž$>FUbÒy­c~ÖIhÑ\ ¢Xè(wæ§Y¹PeH+i¯Ì˜)ÞiÀýtè“h~TÔ“|ðω0ǺêÔ®A¶^‚j&ä¢hO¡^œoþägÇAGóþ㨪L¾…«ø>»> «ºöòºÔxu£­éöáúžß­Ah÷ÝÞHÿåF– Ý/>ŸwIœS)W­!¶­˜ûX tœuè€_&¢æNÑ:óý.ÔëÖýü2ÐÞä¹pÚpk Ë/núÿl€6ÓHTükEe+€[Ð]î»qIç×ê+»m@Žä†z¾qù-ÓW©Jîù­d&°‰qàE$Œmƒ£* -ÿ{o¶ 9Ž+‰ÂÀ8ÿÿÁ7Ü,HÊ#2+kºˆ™®é‹Dq“Ë 0ã©ÚÏDÄdÚ4Â…ˆ<Ó’¶"û™nó7š“ͨ܉¨@!f´ÓK•4¬x=+Ü8æ¸ðAÜ:wPI]QèÌøíÏuÙTT!¹å3\TÏZá7ÔJò\z®÷%OËw"[ÎD 2넨 xùáˆ(ìÚÖtÓ¼¬ ž8ÏPUsH¶ Ì_óÎ烞?tþ|H gÀðƒôŸGˆh Ž®®u,~glõ+ßÅ™ùyüçãü±jxkûm'ªp§—û,tãÆ7nܸqãÆÿ|lXðú¯çÏb Â&ì£0¨ÎÿŒ8Nw ?;uûŒn`Žºÿk'¹÷*S‘ ?‚õ• »c»)Æòúuô/-áͤÛÅÿ½`&¼kIö/³_½"RéçØ[ŠºÛ`³ðŽcx ªèÒ„€z¶2Ö¤òƒ%Òy Ì–ßÆ¥“êêÚ<3ô¤ê¬Aôñ~@s~³í¥î;Ý<¨1eq«n3íi˜xMZÇ(“–™J/‰e5ˆºÊKv§¾Rk¡Ô ¨[/èšïøØ_‚Ýø´¯,¯ëò•à NétÆpóE6D¨,Òó!Qk_¨&žÇäÝ´ôT.“km5ÛЃ¸M®Ü×}©N¬}ªk\ZÕ1çí,üv«Ñír^ŒÓö<ψ}ÒÙœViõ|t5ˆ c ;^®´Ï¨“þO'Õ ÝRs©Ë5Q¼¶|b™À˜ÒRÓqšëˆj£.mH Ö‰†O÷²ÃÀéËXÓ_öïÔß=$>þfп dcÆ–ÕǬÊJIáôßvÕ èv”Ф7ZÕ²ÝÑòð)\°Aª*JÏc5ÒÁ¼ÒÉ}vTåzK`'"“g¡ë#‰ñ¤ÈÉ^‡Ôü}õ™†`‰€9è£VÄ@žtÀi:å[v#ËE˜-k}MžÏX å c§ üë’µ†–ïÏcÊ¥ÙRHÞ™¥)߸Rëý'FþÓ©åE*ƒM)~2霄ip­¢ ±ÒpÈ;RðWo¿NŸߟ\àÆ7nܸqãÆÿPT}b¥†øù³xÁù¶¯Nm{¼¢Ã}‡p(Ï(º·–o¥P~ÊSŸoh€– f¤znrý—NH ñ]ÂhÏ)Nøc“LgWšº%6-&ñw(¨4ÀÑ4Q"Ð`9° zÃ|.6d–›+쮸[bãkâ\"M-‡öLsnКV4ú™€AÏÓÇs┡ _@7¼iânýËô«óŸ&î)aLu)Ú$ÅSK‡˜ˆi°»%P„2R1Uß Ün6Ù;ÑHIÑž¼œ:+\ØG·R¡®C"¿Š[ïóÒ}7˜Ø[¿kMÔYè5]egÆndÏÌÕmÚIq:ÞÏä§“P¤&™m*R9É&ùþ¶©wÎâ× ÷´ØŒÎÜÞ²¸«éñaÂv»pKŽUQ3Ó>muà®›´Ÿwù@fã. ít®Êe,øþO2å± :-*~ªƒÀxcY@Û^„íÊrÃÄä›õµ·×ûâòâ´Øç’vŽä'Ÿ»ôÓ=ÿãѶMæmgþÍøª”`ý†Ú+v±É;½É£sù²+ÒˆÌÆšè{"ØJBJ"‹OYFç­¥†¿¦äN*û3ó×}j¢ÐÏš‡©¼BYø¬ª¬„ÇýpQ^î2ÛäHnR}Äóã™Ý=7@ê¼72xž_θ"TúÌ; Z §£¬]5ó—ùØG"z‰£ÌjcG–Ü®¹{H³<1ºbþº1¢C`Ã+d&í×êúKÔü‰ˆNQr1P¶xÄÜy-_+–TTDÁ Àƒ™ Å’«,pI«°,{.6;ñûˆJ^Š*Ñ# ˆ;€XÔ‘I¢’LP¶I[~€M(*JŠþÕ~°.ÓÕDžî£Ï7nܸqãÆÿ½è§»îù è·ˆÞŠªÃåÁ¨óDòý̨~H.4IR?çMl½ -ÿÛOÞ©¨³K„ÓKQƒ¼d´Tq¢ÍÀ¾"¤Y@›O²f׺1^Õª=€'§×±¨"BÁt¼~‚'i=ûê‚îµp& Î>ñøiÁ9!ªij=þ¨Œª )©w$â02JŠè¤…m궬ÿ-uºúo«bŽ/ i s Ág—Iø° œ ËOùß–µM‰æöÜXkÚz媆Ñî•Z¦–š5<š|“Ói‹VóÝEAÉêµ@ …áV8'àsþ¦ž"úR•“Ï6Rw+†¦p$é6áõ7_‡+ß©?bD„D…žt¦ú†v* òÄüÓŒqIzfµaû/s-˜K$LžUgƒBù¡ŒThU1#f&ÖF¨,kÅ´õ-¿þÿKm}êâKq-™À‹¦Óœóƒ9“eU‹6 šu$y“À"/W7u)c)ª¬V‹é· Ôà~»SF5m±j^!å“;oÌ[(™„úTdVU™ ص¾qãÆ7nܸqã?ú’²§tÆ Op„Ò ªÐoF÷'pK¸Æ©|רZ>»+ï ôÈì-ÇÖÀ›{ªÒ¯_b€Q£,{ƒ}¥Cáž!NL”î¿lYó@;‹î¿±zKˆh0Kˆê·&ݧ_u9v_`YßÉ7Ú~SµŒ to~ã<ö-£ú<§¬“ª)óÁ"&fþ¿¯¯èá(òhöÎíÀu猂¿ÊêÍ<ȵ•fC2͆³'t@#Œ£”MÍ‘¨ñ&B[Ñ-Všw=nܸqãÆ7nÜø¯E7Å<0§§~ÝœŸ?£'³Ìãÿ¡ÂÖ´åUÁfÉÑæî§š,ûuùS'êSÞ©oÁ ÙœªúQjÍæÞ:ËŸ—L Âd÷å¹´Ê$X›ÁÓk· ãPÅau*Õ˜ˆ6ºJÚþÌî—5“Ú3ÁUÔìOÙµ†‹¾xq|ëA‚"`6;X9€tªMÖÅ—ú¬h@˜¦ôg¹\Ì’Ó %s ôätiÖ¦»° •Ê¿kŽùë¦Z6Q5”æœ t„ÀÐy½ÚL}]8è#€¸pz›*5(=‘ÿà+[WÇ”û_•ÐÃŽ›"_ÛÒoµ’jugYLCQ7ýÓÈ)ökYÒ#sÓÝ2èåcýõœ ‰uñÉ€OªÉ‘h04o3pÚ}óvùVü³gP²ª_n} ¡ÎÅhl(Ž>·½¿¿CÿßIĹY/gËîMŠ:ÿt}VÍ*¬^ɶ²Ê¦ƒ*Žs?ºŠÛ=ˇ>» øÕ.Ýø @÷ƒ €ï$~þý§¿˜ò¿ÄW±ÖLsf–ç¡Y6aw„£ê®ª¯?\J×W€XC;%5pêôêI÷¥!{" æ‹18H1/;›ïke Ts‰dòûCDLkþ×#_[/ÌDMŸ'héË÷W³I´}R<ˆžAŒ@ïQ Œ@T¸V¯9Pýøäôñâ7RnŽß7!ûÅ~‘}úíLFñ©x6”‘ö¢…ØñVׇvf^Äät@LŒñÈׯ_¿¬ÒâùÒ1ŪvÌfÈà—&¨,* ‰2·Bq¡þªV/[ÌÔ~ac êüÝ(J°² )[íd8ŸœiÞà3ñÂÿ7nܸqãÆ7nü÷bǤޓ6·hØGc^ÑŠòœ·|_ox®¾Á0¯^.c^ñ $ÓäÕõÄ;ÚPåAÜÙ=6?ݯ%Q'K‹8‰?̓H#³Rò»©†%@Í/Þª¥êMX9º)¥¥/Ò½¨Ê²Z¥Åeíä謗LëdHy€.s`‡™¯| ‘#ÇyÂ8ÑaÌPœÐÆ€;§Íá;æ¥ëÌÈÜ|‡€ù4'Ëää Ù˜Ÿ=•¾2ÇB“B¤ѤàÐÿ› u«¬@ñ ÖâQŒMñcÅ ý=¥FC§fýZdsRèªð+¡öV´”c¾*©]oD@3íR•†w£Ù)0Wg"{v5Ï‹¦ÚoŠ:•Ây45œìRûBNy®}ÿñ9:>°²~1œ¤§ìÏq¯è»Öò:R&+ÝGkrXl®ëˆ{¥ àûÕ=›ÎµD‡«n>ÛxåÐk¡Š” ±’`iÆŽ–c»ung˜º=86•?^½Ü@±µi}åÇŸn¿Ÿø¯/­ý;”ÀW‘¡ŸùÑ"2BÆ=Õùá©Þ)†c]:ï§V<¤ªu`&ÐbÖ¬RÒ­Aô˜ìc汞¾ä¿/´Dòó –Sr ª†£k"‰ÌëªFS5-Û`ZþÓÀ™Ç‘Ñ/€ªîE](Ìg‰ˆ±¦ˆëÝMßH\'ϳç¡1¥wÒ¡ŠÆ¤Á*YP4˜)ÿ6D»ëóœI¾.ùsü€ßÈÅ÷è/¯£_w'¬E.ì3gåxD䆉%#¢>ñžøa6LöÇôxŠgL¹ó*ˆ•Êc)J¬p«Þèrã3’9)!È=ÖþJ#ig#a^¡"Î Ì»Ü ¸.7nܸqãÆ7nü—âà{0áG¹þëG=ÿŸa?øæ*0¤}† Š1‘LL`îh `9[˜ÊéJÚñ=>7L;–DM bWýI¶xZªlˆa=]S¹Qœ˜@¡ž( ÇRM&àl£jùøBÅ©’ÖÔõ ‡U‰%î¾–¢-õxµO@U_0Fë’šm¸C Ú0#ÿ6‘Ÿ` 0³Å›xh3ós(Qkõ‚çC} 㫨âLÛGS§å¬E#e/^ÉiVëˆL‹)¿hšÅ1ESMC(Ðê°­…“vÓ¬ IÀ'h6­}µ­‘EæeC§ÌÝÖ¤Zb8Q­OI· ÁØ…ð°|É9\@y°2§Ã6V¯ä¾œ÷G`èœÏû¯ÚÙâ„Ûn°/‹¨ÃÇ‹wÓ;:ž°óºòf×c[¹´ø ì·þ´[ÖBó'W!£€ù´ó»¹æˆˆÁJªáÑf Þï€hé*v}©ò:¾« ×-b­„Ó…­ÿAÀÇÜú³ÄÚnÿ?øåðãø¢­¦cˆ{¢wr;³ <]_E`|³èóhOÿ¯`ë (uT B([ûÈæAY•F ƒMcL°…H™³Ñ¿ž§šÙ–†Ÿ»>Ú+J¬)|4/ʤk,»~,×»H0ÕüzÙ+¢xø.ŠÄ£óù#ˆÕÈLŸ‹J{ÿ{ÿp=š ¿Œ\ aæ5’»U9A±&Uzå®=ø¤´â5%ÿ;¸ mgxÛsR ›so?µ¨0ïÁënßûüþ¨úϯÛïéÿŠ Ð—%¹W|3ÓÒ™—KW«OìòÙ¨zÒ4‰©ô¨r¢®åìɘœºó‰’“kØSPè5µÜ”…ògàÕzÑÿºüh’p¯H("é.¬_cÐæHÚ€éf q¿cHÝ1eõƒSØÞ–¢ |ìd¢ÊÇ©x~=üÏÓ5I¦e V>ÀÕzÒ°>ŸÂJåZˆ²úDýàæ`Ì _2«@ˆ«`]M®~Ñ{º jGtÚ´ˆAm§àVD²¬ÄÔÄÒLŸnÒÒæ9¥]¸[Ô&uëqU;‹™Ê¥©¡€bŒ¡ŸMÌßwVDN:FøŠÓJÝкBgåÑ™æ9,rº™.„¹B%?µØ¬›£sT½wûÍ¥~¢oî¹¼ßxÙ³øÏÑüÛ[Ö™67$n¾"%eïùûñÚ“ó®¸|`I¨ÝûüØÂ7cá£HÔ[Zýo©öüä®úOt@Þd‹þQ|-Šóg¤2úb ÐHõªÍcyª½09Gí ×–«>L_H‰¶º öj:AižÃ³ÁÒÿEÌI8tZ¬ìDGΡÐü)ÕS´^5ˆÙyXUò¼È‰pbŒÀy…jrBqàÁ£Ì_dþ·"†&ͬOÊ  Œ{YŒ!Nâ‚¿^²AP,†ë%hÜZÛ]ÝŽ/®AÄDH«ç~¯Naý¤(§5ïºîâW¼$c¹f'%Dˆ(•­EÔ‹¬ì¿[´`Aê#[¡x[_ÕÝʺVD”ô¾0ãëÇQR(Z*„+ù`ûuå|e•ŠV»„*ët}nܸqãÆ7nÜøïŽЎ8`œõM¬•´ïïNŒó´º IDATª[‹×3žÿW=–o˜€í+õJi‰]¾ì}6S +òþî*¼êEÌŒ{RÝžkó p(iØsù3˜@¤OC–‚ê:Û²Êþ"WÌP”Ä1×ýig:ÕSZ:ì^=0ijw´äúM²ƒßÀPz™ŠKY@~w0­9æ[GcI{…Ë}+jÕ5KáEa†rà°ƒs—Íáâfú”«%þ C‚âϱÈú/¤…*¸»8(­KlãXަt6nÕÏ+*àoêváœRZ jt™éöÄÔÚX·¨G9ËsñK–w1­zý´T½Èº‘%½1Y‡QDö52©sÚÇQ’k`Ãjm@›k«–[÷މ7QÛ›Ðé4óòMÐ,Ű ÇM!>/˜7ÅÆw÷¦$gôß©G¯ç 7XÒ‚{ÇÒºrñÞ˜}ã}ÿ ÄOÕ5måhúáv¼ ½?¹ÁþŒ*ø“ôÿeÂý5Eñ¯Lt¯Bü´1Žü{¨ëÞ) e-–T±ç6-}oõý8ß«P `YÿKœ*¨öµ{ E¾\‹¢ãÂÍ„ŠÂqf–ÁøE$$ìõ ÚÁútyOB€”mº5,\IgPS3Ì]â’µ–zî!D¬*æ\x—Ę›1Cáu»£*‘”QP3)ÒÂL¸ïn­´ê“Z·_¢~ HÎSd½[%}­?QƒóWb0Æ$Zh£˜…ý—‚«"Ú/î»­M$ïmQ"’¯,:!u.XIIÕÒ¤Q”Ëê NåÕ2IæŸ|nܸqãÆ7nÜøÏÆ[£Ò·]yQZÁß~Xtp°{ê¾û(8ï„`Þ¼R!þ-}³rt”°×!±¦É¯¯…°mN IÕÓUˆx*­[!‚‹Ñ„,»L›…(ñCU÷v¥(²h-磱å Û1«Šg²ïˆasÄå6‹÷ò!>Ø;Ë, xÄÑÿqúü#n6ûDB½A¤ÄöG$F¿‚jz²Ý’³ŸÝç9sç{"%ÜäO+ž”#0 š]*JqJ 4µ™tÓ¦O‚f‹ HT VÍ"ÇxV/TH}Ù"´Ø 3^vÍé¶PèºAÌ^*˜¸aÒH4ü¤ü³*õwu¬Ã6Û¿’µDô¢„7šlO—™ÙäÛœ ;é´¯?߃ôPXF?8:¿Ü%õµ0 ÿžûîÿççÑ“ÎÞ_ˆ¯êÅJ›@ßNý³àpR%b2“‡©Þ¯Ó&ïJ®2”`¾–b¼ôò]¦š5€Iƒ¸Ò¹¥KÌjvª›¡hÉÊ[&£‘ 2›Œ]é\!i7™–Ýný6/©JÄ«’Èji -¼|KDä©ùâþ-fuýÓøQ:;G>æ˜ç×n™jí&¡Q¨‘ÆuDº…Ã<„Šä‡Ñ8˜I2µûh+E ]l¯1ÀcˆMUFp½–W"<¦%%ràdžGD]¸0©R5kM»ã4jžnŸwË*&Ei—¸qãÆ7nܸqã?oñ‹ ý;€Š#OsÑcöØ®›blª 8ñ"°‰;¯Çڇءv¸e®>/ˆ¡,_ééëýÃt’ìorH‰êIWbÁÖÄ“úIVÝ!Z<9Mû—[—ú'gò$­ '‘‡ ik#C1yfJo:Õ8¾ŽTz//”€³C3-ÝM*ÖV4‚jrtjÕ)æº}Üçc6Ìþüú: É 0Ïa¡xœÌA(Oxj¼<ëÌäá {~Moƒnh\E‡<·}vT›»¤áþ‰„  Ƨ¡\D¡¿oÒÉÃúª’aL ×JBÑèo°2 ëÇoFÖ^ÓÀ›ÉD5{ ”-8(.þ™¤^¤m@e²!}ê ’mdÙ$„€ºNu·ÅÄ;Û¶Ò$» Ê«Åk/‚É¥X¯H›u:ùWômÆ×³ÄoGÔâD2y%óW•ªß+”ò–®ãb.œŸ¨¾Ú'v¹PÑçyÔI˜“°h G ‡7MITu–׶ǬÓfÁ²®ð7nܸqãÆÿå8&lêI¡xƒæqÂ;ô(ð1e_¿‘ZRþU_A¢Cêî‡Ztôßh!%]{ç #0ú&%TÁVtU¥ %,ð :é9’HÝj_DJú8Ãa2èÚÅ©TÄŽRÇ´Õ P­âW ”<ô­ëŠêQ}†ôc ª]– :¾jàtUÐfKЮæº{™6èj¦£—˜H‘ib‡}UKr:ˆ”\³7ý Ü<Ù2¤à);…7Éo¯½À‰V¢¥ÚWÄ?‘ùÑš‚9"ZÔíeö^’"4BŒ€È¹Õ8‡4×ÔLÃ漢ëÒVZAÏ”{¥Ñh*€i]‰Ý”¢&H§®{HEg&þâqšS±y†oúÍ¡·ì„æêLG3 h×Ú dÊN|¼¤ü+í·jLpL©C•%;žÛÏ……ähTAgöôÿ5aÖÇúzþ½û¿ŠãMa¢®ýÃ;à'€ujøxÇ¿û9¿¡ÝŒ–±ÃOš‡^$ð{Òýod~¯÷>ÆêðS¦1¯„öKñc2ù–b®ëÔ™çrçâö€l²<†ýs¢Æ"Ù8ÑNߨ¾Œz‹,„©ºXó[>¾`f!͙簛vÅyUe¦¢~Cåg„ÏF5'WQaâ~vMS\5\YÕåæ  o¶·è"þuFiñµ“ ˶ŽÝ5×G§jLÿ‡5];+Þ·ÝÜF›;zSÑi¯jž:¥måvªd!“‚Ÿ\o­XºÂ¹yó¢ÞÚfïV¯0+^F£T´ˆ•/ð}â¹qãÆ7nܸqãÆÉÞw/Ðö[ª:NÇ¡7ð›ÉÉŠà‚ùP@»*li ÐÖή¢³šAƺ&òç[vrœP›muT]K]~ÏjTÕ©S<‰š"î°Z튒ÂLh¢@Yå°*h4€.tEÕäQYÕû¸–Ž":{ÐIJC´Ð0Éð¿]«ýW'…SEª$½jså¥Emª€Jÿ¤uõó– ?©‚Høœ"ûm°(ù¢ç—ßL‰ÝšxŸÌ|òáMˆfÁUwµÎÞb{ÖÓRXUœ5IÝ'€ž˜x3e~ôÅLq|šÙëÕ䥅Ò?V‹¥‡l!fµJ]Eó\[FMBáÝø×0‘97™_1P£§ë2Ñ€ûF ó=N„ÜV3É€œÒ~AL0Ñ$$VßÖïg|˜NžDT”¨Xgž‰Ð©äÓ°¼ùâîq}ìÂgðöÛ»Ãy+«m*$V;µSP¾%f¨ªL?¼Nbý8Á‰³|g3[þö2›gíŸàæ'w÷·{µ_þì(Ÿã‹ÂçÀØ@aJÓ¯¶?y«B¬5þE¨Øjc&"Ö‰_ ÍÇßÅÀuS¡h.'1çj…U.%Sî0·É»X*8Bm>‘÷¸ÐΉ3C„´!à¸|s(0ñC³j ɹ¼LZÝfóêÂÚŸb7‘ŸÕÑ*Äë"Ñ=Ò!y¯r˜ëv3tÆûž"”ÙtòK·,wŸª«¨0Cpª®D´œ¨X÷e§$Æ;ÉÔnZj+Û¢óÄ ÕÎÂ$‘ L'¾­…ûþ°ôwÿ3œØ{½%D—·Q< ‘TIeºÈ.×Àëmcff·œ}“sÙۀ⠼ü¨ÉœùÁ,DaèÝûÜ6T¿`ÈIj˜ú›IÏ+é”9o·órê"h“T4÷©ÏÂ>êEvAÒŒ@v[a¸§rÈñ‡È|*ê¸8œ;×ßq§YøÕ™Ò]o÷ö®ü¸U´ZÉü…W¤ojGYe•s9+¥QöËN@õÉip¾¨êÊ—¡äîÉ%C¿¦ÿc¯W1&“²q«7Ô®ÚôØÏ-jC9?ͽ@7nܸqãÆ7nÜ8Á£zôùýà žêûch£½“ž ‡Ly÷\=ûäl ¼´__9€Ep|*ÿ %¾-ù§ÇDxÕ&.ASUÓV+\ ZMàh2\«-2uºí68{ñó£Ú}Œç|ÝÁÙíÔ–À©ëéYØI†Tm^¶¬>%!.§3àuQù_!}—?ò‚VÝ”~ãvi´@PÚt¢ÖIL+ÕDÅùÖQ?ñyõ•’;üèh|•¿¹¡ÌDK1AÑäѶ¤k‰CC{K݇)•|%cö<ˆx¸–ÎyiÀó™¡“=RUâ€×³$('íEE2‘ñ,6`1¢­ýaÆ ÇÓÜSð¥*Ì_:°Ãù­…Ûä2ˆƒš³±!Ô£§ÿ˜{XSh[ì±zªï#E– !…z?¯;mµù(þ»¨/X[¯tq}Z¾‹:X ÍB—¾Â«¥ðîi¬I+ô»æ)'i“†—­]÷ý)÷Nõz ï¿{¼1ÉÁÜŸ›²:›þÄöþõhÿ¨üà/§ü/ñe»&TZ+zZ¥mRí*¤ì’?k¹¢–jEUR„\OЋ„KÕyO<l½i÷´Ÿ*AHF¥UI;(³Š <:Ï {ßWCð] æ]%©'s:$“ƒÝÄ© Ÿß- ¸º¾¼Ëì°ËÛ9üüëÑôv 5”¤y,yôZuÓB«Èë*â¤Ø.¥h«áÙ§±`€ÀE˜'I¹Àå£4 ªÄÄàj‰¼4+ÂnÄ_I5»­ÍR'Z˜Û° O¶·‹e0êD)‘Dξ4ügÕž‚9ÿ¼"J7nܸqãÆ7nܸ±`›ÄÊG¾•-Gòœv˜uóÄ]Ч;dúw¤äC „]¿[ òRŠ~Ö±Yä}vÏcuò·U¨]µ¥ŸÏìæÆ:,`G4€+æ¥fê´6ø~³U^{سp¿¦G~aCc°š3ÌVOÛ5ªÇnr4D½Jc„‹ó>òƒiÜÿ°Äó ¾˜Ô*“æ$<Åš^<±–ª™è«3çºz&G*{©™Î³ REž X0> w$¢S†MÓ€TÖ×¢±žÚAÉ l3_>%°F-¹ˆÄl&€Õ'»O² .KÂ'9±¹Ú]²‰ÛJHì¾õ‘ËßD–hË‘.åedÑ€Ø#îbÐúÑ>ý´yíÃØß­iþtȼšPÏzBH¼™ÙnZ:S&DN#Ð÷–-8«l&L»Ê?}—˜oÅ«é1À\ xšgr¶X×U*­–­%øÐ¨ ÓWþˆÚã£!ðÞÿI6ÿ?KÊ]}üÖwþäË?/8Qõ£eÃÅ©+ÉÄ9×yö) Úš×ά³ëˆ37W[¢£C­¿!Dì6»nŽ "bX9ŠýHyýÆ¢QröëÄËWÞNz²“¥Hš· &?#jJ4^Ùàì*3* î9ÿ̵«U !6ÙðÅ.]ŒQèTÃ׬«à8)Çö”2³Ú1ozyÎÿoÖ <¥œ@…ÚÑeG…jqâ!ædV²×ú¿íÚVSÂÒ.xqP0z†½º ú*÷ß7ʹGgîÿ4\Zä€ú\[èˇgز@¶yrãÆ7nܸqãÆ¯½ƒ$€I… xÅÁ‹Ö|ˆÙ ìÏO¿ókdõ©à¼$ÚÛñG³8âVMüÒÍqí©_¿»„„|oÕ'8ÔŠómpR¨ë±ïés‹ª±®¹[Á¢#§ž=Éûmt ­¾!Ú –€%•ˆTP:ÜÇ WiG5Y„z‘3ØÅv§VªX°…:¼Ñ ’‡˜ãu=)V‘'z[óLuÉÿ鯧”‡ÌÚ‚Šï’G³ Bå$=r˜`OÊ× m_'@åùé‚v‡d…zJÚDòx#3*v9©—Í¢À{ ë«0“Ïgøß C]–gD:?M)§ôNâjDÕVêÎ{}Ï\¶‰þ³6D%BŠŒ»Ü¼FmJŸTP}G‡êöÍÃ8%Ø:«h!K¹ÈÐWÛ[`Áíky„nnKBðô»XT‰8w"¬éÿ{¶t¡öZ·„ÖXÁqÓÿ-£žuŠ‚0 QòoÓÿué¯î‹®'Ï ª—â¶W(?þå®z*Èx¿/5E¿9£ÊtĦæËÁÿ­:€¯Ckµ)«”ù\är6õöãí6]gwÓW±Üx[s§¢˜ï<¡¥t¿5òØl»IÚLà W"B£ì´Fr#„;x<á=°HýÔŒu-¥‹ú ÀÌÌ-kTíUJ;Û°#°ªYOÁ€2Tc(D™§ c~zÙ^¯ç1ÚÖ«GsÞÎÝ¢И-Ì«–Tä&ÍϪD4Jƒ©o¹‰Š­¿ÆDÓzrLD'´½pΩ5Il}ÿ¹½k=µÝvËõ(³BtÞÈ©ûXsãÆ7nܸqãÆ÷~ô‡ýS [éâ3Р[îõŸ< Ôè¥Z÷\ø*¿?=M¿ÖÍØ€_ýr@ÇüÓ EéIÄÆ«µC5™oì Ñi' } '$RShCÆ©H½W„yFÚ A"8jœíƒ„ƒë‹Ñn×Äìt: \N @-ñ\O)âBZ²•U&¦(˜=’˜›M;-×0}àÕQþÒ Ëš—jB DL¬A oÙ9»µƒI"sEOKg.‹Ê !Æ_ŸAƒTU£Žì—“4•pæ ´ZúÏÔ‰ªfœ :·—Ú,Rkbü[j ·Ì«¯AnË1¦&åÏEC¿nò2ú‘<#”ôt3ƒÓrC_‰E†ºîGZàþ¼FmDel%Ek(ûùUßÍN ùÖȱ/ZNHqÊj“</’SvW]wØ%7'¢ Ü1¹ ýß Òü£OÒÐÿ<Ì<¸i¹ÛêÕY¸Pð±6mäTˆ€#ø;aOI¯eC¿ƒkó¡"8öê$Œ¿j °Ý¬ñóOÓIð/ÇWb”#2ô?ý0± ±8E•õf9….úiÇܽg!"ªÏú ¦ýâÝ+b:<)`¥Ù•Ð#Ê­Æ• kúÞ¶§¨ôÔ¤õj´8¨fºü,y (8pyœ –ª ~]¨nºbôªv¡cñ6Èwµ’…UˆJÞ¾8wT^o6Q|”³ß\LŸ£IGDY[‘¥Dn§ì¡djÊfëû6%ÜÊþŸ9K#ØcKAÍÄ?ŽàÑÆY[µ, kRyW¡¤uçà¿È¤Q„Ãó%nܸqãÆ7nܸñ*øÁcÿxKùÔi9 ô–;¿: ¿Â+ÐÓ0JýØhêøø.ТœÓeT(áò©ÂÒi—5ê çÒÎú`Ù¤NÖbîÀ åxtDq²2+Póµ7tÞJêÕq}j ÏRÅUÀ 2RH—i‘ÙÊS…_›–7÷± }Œ` ÖYÅyjú&Âô'à™Ý$^aRæ¡bscjVo"ØD|ÙØÇ,LQ—rÉûÔÂrËV&„—@õZxㄨÚq[%Á©„Š‹'é;úÀÁµQˆ~à4"¶J…±*å@»ó0¦å¯ñ ,DL#4dd£²–ÿRÑãr¡iV•j°Khýfao0e µ†Š·¥‡‡8¶£¦!žŠàÒÈqªj†œmè%UØ:ˆ0x®¶:ýªÑH½(íûý/À&÷Ç Ú¶Ûó«¯q߈Öö̬YSîZåVp3Õ/üåoæu+ÙéJ&ædªêÌŠ6î7P¬_Šýo½Ûý‘Ãä‚>r‚Þc3ŸøW Ä/"zs¸-w¨y l)ç‚a©€üzž¯M:!­Ý×ñXæ=³ò04áuNa»RXä26‘›ï†á^¦¢Eº&+Et: QU›I˜þØKG”¹É€>µïØzÞÌrSCŒÇH|{q î$'UV›t÷’»¯ƒHŸ§®Ý£:!ØÉ”*)G½K³[¦J–Ä,.#$>d` Éâ«¥9)¢Ônjy ­öÀض./C)Œkõ^ê6jåÔ>÷$nÀÙCtdìPˆðT£ºÂ?7nܸqãÆ7nÜø„#ì ßéò¯Eº=ž¡ý5UÚ$Y¾“:>äüP hýXÍ"ßNþ¡ Á£‰áA¡ VÈëqVÅyZ¥ü§îüÌ%ïàGÅÓ-Û]:’ÿ=©í¨h{w!ÐxUWf§’ìO³¥ªè4йëË<èü˜4µ™LAhâk™þ¯Ëެu |Ðü1öâë‹~ýòÞDÏC¸Ýn¦È›—é³¶ šÁrtÂcöÅ\Œy­Œ`PXñY&IñøM"‘bSb8Bƒ¿ŠúÐfQ°Î¿ROhÖ`4ûŒÉiiLNÚu¢–R’è½Ep†Í">S¥C¢¦(‘ Ü>í]}Eªyý\,x ãØørŒÅó‹ÀÞ±•xÛg»{·µ"•«s‡ÈV=È 5ü‹R„abÍðˆD°Xƒ KZlQôÖSåÒ`ô¦ºm6ظ'³¿HÐ`O½÷oŒ>œèÿù˜ºdëÓžþßÒꩪ9­òGsc^ÔÿûÕ¹Õ†B_€QÑ˺Cv"›Êÿ¬¹uòrÏx3 ÿ©|þ®Y€þný«ú?”~_Ù°yî—[`ÓtÇ¥ [o¶®Ì¶h¡ª¢òŒ1^¯¸@íÛ’Ð.M¿T÷øíGž‡M—öyägSÇåëR·[tWjàï‹pX¿–*ŠÅµØ>$¡_cNÁcŒ”âò­býcÙöæ«þK”~LÆlÍ|¯ wFü¤DŸÚ>YC¾ðª}p©ãéýkí £¢Q;Ðz@”ØÔåÔT g‘ÁÉ -%üç·³˜Ç×`òN"ë»CuFM¤è›QNo;à¾A×8Mb àÙ+9îÃÍ7nܸqãÆ7¸Î-¨Ö—zø’¾gÕÓ©h‚ªV€£ÛœÒYÖöh tTç[Dô“#Ð)G~Êm‚'k64.=0Ê©ô¿¦êŸ¬w©Ÿ®q„®4ÀqPð*¯4Ó“G1Ééö@œW­:srë†A©lÊN áH—Þª7ÆŠ¼R†ûËæY] êi1(ž2â˜Îé60¾æ¤u˜è­¼‚§¸h•XIÁzˈÏΡ1`¼‚5†ãuÚ.Eog1VÝMK½_²€+„2^:•âb­³ËZË’&0 ¦ç׺(¦•ñ³¢ê©àŸ˜ž%+PÑ1@¤"³Ö†ùõq+Â`À´«b/JT…aÊ«ÿç^Ç a¨´ÈŠ­BT51Ý «iP=,ùÕZÜ–$S•B]L3³^‹{¥f)@RJÄß œwÏê1ív•aƒŒ2ÿO~×3Y¹Ò—Ž4mœN›ðÞ’s ?ßwj)ï[C6J›!JSó5ÀÇ»ó’›Ú ¾½Ýn—[ÿ¬zDnÁ ý?ëQýü÷À¿~½ˆÎÍ©#Ȇ@›ž>½ÀÊ÷|M–§ÀÄÇ©&à­P Û Úꄘƒ%<œö¬j6[žþšNE>ŸÏmîȪê²vÂ’rþÅ/*ºˆ@´š‹îÕg¯`Kƒ§þÀÍs¸èщ pe’8\õ6@À`¼Ç™RöIW”–¹ j}¾»÷e¶uQ [&,hD ùÎL8îW´f¬/—\ûpRUNP¦"=)ªÏþlÏ÷þ#²ôP” ldCMCLt¬IßT×Ï:âEÀÝGMC?1d÷i1çgÆhÒ%@T6héd¬×[0œbGXÊY˜IÄ%(º²¬Œ€ˆT4ôçU <ªÛåÆíá€zšÛ3wxÚè ÝëÅ@ÕX˜µÍì;‘ƒšM…j7Ñ ÷ë¢,D«ÄaDù蔲RD…¢HÝþ”Ç)GXü‹.ÜÞ3l*Ú:B•G›ėÕÄk_½¨ÿÇÌa4ÎïèOP,7‹åq;Ñ'ûßiž¼^}÷I&g1× ™~ …ë»fýÌþ÷wmðÓ7ÿüWœ ¾¸ŠÝœ÷2,iþ‰íõÇÂÑ&w`<ô”™û*1Ԓʧ~zãTËÏ ]ûÓÈ~ÒñèZÜ’yýáîÅÆx¹X-t-×ì U±Ë³¶¶©ˆd‰Ceòº`¯«¦µ1Š @vÅ,`myXä1Þ|f­n@Ëö8Ñs€ù °-¨ÈÓ»0ºàG‡¨4oÞ“BÅj0›úRÈQAp1ÕþšLj†ª“îÉ|ÞKÃt< [„ưÄmUZRÕ§A°ª¦4<0{H×¾RüÀpiã.:“è-¡þ‘âZ_¤¢ äÙå$ëwÌs™ LJ*º¡ˆÔØ%JˆwÔm˜QÜžmP·K°x¢†í<ühíM+=fdiI&6n¬S"#V‘#θ3P |L| ìv9VF@žp (óЗÀ„™rgµÇ²`U;5VÃåóY(À£hHïãXéϬV¨NÈ„tlÕ-ãËSÿ–Ág횣òÌáhÝ"€¹L>ŒîÜ!Æû»‡ÜÿÃeŽŠVÿ] Ð|h[¿/Èk@—P)+´5œzFð©Kq*t£œØD>Ýjÿ6X÷›¾KÒói!ü~îâÇMì5Ó¿Ý ÊWÕaê7ž½Š°WÓZSÃÿ „TºéÜ©ÿ`èrZóg‡¦á0§W•ÿ EQýb6õ*µ¢²óf}uwlU‘ÙŸ]ŒhÎââoë?”Téч²Íñ,%³NUvvÞì“©ðS Ñ5uŠÙYX5¥íÅŒ lÃA˜¯u—éj²Tö³Š™®>µFdŒÑ­•w2 &sôÅLªùõ´¥îð|ãÆ7nܸqãÆ?Cvì[ º³.àÂ[iþ„v>`KŠ×z°Hí¯¼5õ¨3“×73z)X^l=g€€›À5&t€bYÜ`¶‡M¬øzAµ¤Å®ï¿Zpy_dZŒÙ)WÒç‡fÚ;܈m®˜AŒØ²é-yNAD_¬.=Oƒˆ4±r-ÏüŒS.­Î×í¥Š62HˆFjôã´ v7Dýf9Ìœå¤ ¦/ž½1Ƽ˜ÁmÎO+"¢IØÇœØ¹½Ö wjøÛ.vÝ ¹bùë“ç™8Škèó ùE`%A¦“¯DêÞà(-Rû†³Ô«7e§ÐÌ"8Ý)(Eê -'-Ç[úü\ ÓF”˜Hlê 1w+ɲSM…¨˜uùÉT›©Ú>i_ü%"ª"’=,ºçE(‘˜-ާ¢Óô1n?ôzü·ýF€—zÞù)HN‰þX.iÎ Tãy#=l·<²Û¥Œ/ÍNó½ h^ãÙ0˜¼“UFDmÁÖÛ„©LSU£`l¿‹ZŽ6 6%Œª¡>Ö‡ÕA4ïpz­oܸqãÆ7nܸññ33À#¤j€u;`wŒCõ[èB7˜æ(õCÓ·––LÏffi[Nw¨L<è¨8×ÁVwI~¯˜Þª´©‘Ô )S”vLíͯ8T„§™*I ó‡®m—™ Ëô8*Ù€êJÒÍ€ëF©Ñ*mØÜ4Ê[eP4Ot^¬• O¼Òä1º¼Í¢™µð9þîó3#¦ôü <'•—6x=ÊÑ<£6¾ LãžšýÈÙP3U ì{XgI—éúCIT÷/»%&ì¾Øï']ý‡#Ç¿þæ1¶åyž1Fá0=S¼$A0÷‚ü©×½|™sÏwÃÊ{ù×.*Å~_‚†*.èò‹T ˆ0ÀijXdaPíyJ¡næF$À 8ñ<u«ç:²uÊUcäø°–$‚üý cŒô²Î+nu%Ç_ÊpÉ&ÑÕ¼ãÆ7nܸqãÆÿƒñ–¿ß1¼xÿ®.Ç*¥®tÖ»xƒ<>p»!ð©Z»>âöÏT§ÙJlÌüb‡PÁªKa&‚[°N…ÔòdÕ ©U,Büٞݖ6K¯9À!×[OQ1 &nV‹QAë¤ÂLÄmž.Le!Q{N•ç0S=K¦0k{wµ_–›æà ûß]ÊcÁOûÙGšú"%ŒÚ;˜ötF;ïÌ(³Ôò7±gt049ÑÖ*bAº$#÷ý-ˆŠ¦Y¹À(K@­aˆ"°ÊEoÀÝ &ŒÛÐEjݘ¶ŠMK›B… tjK‡¡.EÝ>Û?KQ]ªAžZ,l©¡;cGkàlÕª•ý/W7ˈO£™µËÔª™†šòo{ïöŠ*xìŇm´ &ÅšÞŽ†˜‹¿oïò–û¿*XÉUñÑ`ù”µyŸÚÆßÜÍèÕƒþg÷CÞnT'¼!½Å¤ìê÷oâ{ü¨VéoÄ*¿ßÌ:Ǧêóˆx½»g®4%Æ­ªšD:©Ú,%«="trØéÊWa1ÓÆ3ÖÞ’ÂÜÛ¨uiÎÁ¾ !ß¶±)öç媻ƒfªm¦z"W–Ûü„ ×é8$¢™CÍÖç!ø)v>fˆ¬\ˆcõ¬ª(7h3U×ô ÈOëüå%ªP’…;‘Q|ÉÒ=¢*ÏcœˆŽáp<3)†—˜Á±U.ÀD¼Šì¥kÿ]–CíáäWŒß2€ÎRKÅ©672o=‰ÉSŠ*‡’šNáXg×5)[‘ÆlöÅ)´zË•gÂ*1DüõD&}BŸ?¥ðRês@_W†Û^¤Ðh‚®¿‡w·~û$ý_.v°q=n> >гHßôÉ[úÿbcP[ Ô¹¹œeMÿÿDÕ,»NnWýú‚ÃÝô›èœ¡NÜãû¯Å$³åöó{Oí듉|öÏç3¸Ÿ­†êdÁ"IÜäÏü‘šŒÿÒÉÌVEe X‰ÿÙù™µ-ª ÛÝrð8]DáÍgãÉ ˜Ýr_wA!"b¶päþϬv¨¦øO÷xÇÏæAd0XG”Ò)žçaæ1ò׃/^Q"µµbüÖBb°2™*NVZ˜ˆÚ%÷J¥ÂœŠ©4NÈÄXX¡Õ.z4F)x›Q>H!)µN³[p2£Ó½üž•éÅDJ$B’*Æäû7Ÿ°&.Û€€ Šb@™s‰ „dÊ …&•U® +Êh0‹X¹„Š*‰û0i+KöÈæÛuŸ_nܸqãÆ7nܸñ'ˆÃèš]¾Ã‡Räú!Å  ½½þ3âÛgÛW+Äs´®=¡5 ÏÁ²’´¶«Älž¥{³_]ŠÀüéK:vÓ‚ªDótÒ×GD.å:…ôÔ~0ÉC›°¸¡åS‰`|Q%ùß ¤õØbnŠð!Êî ÝKɇ&PØœ*;ÂŽDï‰ü ×(i$ÞM85Ρžsº†Ð2g”\õ¤¢: ¦ç¤L:ÓZ‘ß\»]]ªyN€2;ýu©8^d¥'ŽOq$•âhm¦»n½[àÕõ檞Ô9 Œ2|ý' ýçh¤ë)%·LÖ§ÊFå$±±èÊÖ jÚÖ£zÒð\-xÓvoWª'[”ÓžX‹^Ú„7!¬ ñßv0¤IÈí<ÁšøÿÝ.:?ü‚þ;,[÷¥2|âX¦Õj}°ñ Õ tUÿÿ‘JNë1q(8€¢ÇÎê¡8”~»Î`';!´?@pÿtÿ¯ä· €anìoV¦®ôÂL=o-ù¿“9 <)ÿ²ÝØR3Î܈xÊ=r^¬kU÷½Ì´iÊÙShѤô|k¼šþ¼çèûÏå'&ÉtñME ±ÎÝ«!Á¿ùfŽ,+À÷tÈÞ Å3£Hy(=ÕöW•TŸpe`f”¶aJ;qÈòSÊ2¥n}ÜF½óa®(UeǯˆH9´zr$ÌÄÆåp”¢‚ˆ™EÄÀr2€bºYˬJ@@\~r8{ßRY¤**ò¤ü£öÓ?Ù´tŠen÷ Ͼ—&Íÿ¾Óô¹h`‘¹Çx…ù–¡ÿÅ=±ÀUXìÒ+˜Ã1˜ŠÔ‰¬¢:ZÅâ‰4“²e*ëZÇ`èGÉ/–®3žÇ÷ÒØN‰e³^¨^ƒ!²/èY£|kî¥+Ö'ãEù“Q˜¢ö§<åЖn9æóÏHÜK ¡ù¦ñuXÌç¿)¸Áôü€¨d§Hnöwßé*¿’pÆ 5¾gDË«.Óœ`sþY¡Û\ ëìpû‹‹Òø"‘RÍ"3Ë›Ë> o‰ØÔZÝ˱àÂítØ@¿´o;Þ²äZ1 b33žLʱã±Ê³ ­2wW^'!^·–>@kî?«á$¨6¤ÛK.:[0çtxL³­ §.M·ð“ Ò‡j ‹¬ug%‰|;×ñÎ4qÇ“aÀoÜUÂèëÝêã­ìg÷w= é¿.Ä–•ýÒ_ ÷¿Ù¢æ‹õ+Òífý)‰º¢K*ìüVÝúï‰ýWÀ³•^‰ÃT\H7Gêök½ö¡OÖp:KèΛ"¿uÑîu\ &Ì|Xwy¥.Ó¿Î{ÍÕfuš’J“·HSâ2IýXÖñB¦ôÌûhõ¯E«&ínDUým¾|³í¬Ï9õ°[;3„–a%&QF&„a ¨¨Šˆ2¬-NmtHÙÝ­Àò)l`=ch=%Ër‰Uøÿªs‘³JÆ#(¬(Pó&`0XáþÀÏóê“¿ã‚ÉÈð®1§`¾øÿ7nܸqãÆ7þ,~`,8]XWÛMaàÌœÐÿ#¦óŽìW4ꀌè;Î^|w›jÊÞ€š–Þ€;ÕùÕZ†IN|¤Ž]zȪRR?`Ex#õÛ”vãñ¿÷aS…±¬=ƒûëŸéÃù:Å[ ’š žP µ´ÁjÛtÓZšÄZRúƒ ²™Žú?y¸x¦!"3é̼9 jЧnù°tŸæáÑ3S7¡¡äâB¬ß<ÙYJÅæ¸Lœ}ºúá«a@ÇÎüŽz +Þ”¹”HÅ"´¹¼é“^[/Õä}âòýHb!¤~Õ\—«±p Ä,øèÂ\‹¼ŒŽ.ÊE —ùp’K$©Aå¢<^ðÒ$ÊC´œfm€ñpù1|p”ójf!;Ù†ƒÈL\N:!µú¹¢i§zGéfüK‡I`1„ îŸÐùéäûcµœ6üö¬àýÖ‚Ej:¼.Cƒ~óú׿7œþ©ÐÏ>¥¿¥ÿóÖ¶AH6—GÒËÝ®.ƒˆST‡™Owöé@DƒùIõÿi㉰‚à^פª[1‘:œzò}Ý{±’b™ÿy[2èÖ¶±”6J6.!¯+))/¯úC–É^¼j• °cÀ ³ªöUß°fÿ›Œ–AA$;<23‘|›f`°ùs˜9) ‰hè2‘‚‡ëíh­4HÙE¼u2rË3«}rg´ /Â,&ÓåÞ¯DB«‰>yDTœ…×ù2y¦1˜a&̦Âd_t_"#<äyðÃQHX~ˆÍš¿fw.&"âF*l% dU ¥bÂyRƒù>¸Ü¸qãÆ7nܸqãOã³Ä~÷Å]G¨MuÕÿQ]ðˆ Ø%ÝLð#`øì’k¿W?¤J~y` \oS‡¨ HåtÚh€7ãp!¼Jiú y‘È~âUž`kMÏŸ!iFW¾1“¦¼ž\¯ ÕÖ°üÉ£72•ßåuü¹ëC|^¦§î’ <áïâ™Pàë„ùöÅ2å¦m/…lÃ|\‡’nII¢2šNȤªn>áúâB8Óe£P „Yê½21Ÿ€>bOÖÁÎ8" æ‰ô’dš3ƒV0ZÅ%þózQ/Pʤ­O#'KeL5ÔÔf1}XzT±ì´£ ”qñ¤,0sÁ › G‘¨¯Xþž%´¶©²ÄÖ™†{Nüïèÿiç9ï¥Kú?Þ¿[vpÞxjûuóW]ûe/í:áß`ëEñß¼9^NÑuÛÞ*ðMùÚ›óðïèÿà÷Äú߯[?nNç/àËüûñESÏ=˜[¸/ŠÁ¸û+jÍýçn üÙ`æÿ»‹‡kÇ“†kkèÞ¥‡‰¶þu“‹¼6,N¥ËîQ[X Žç0™a@Qߪ®¹ÉphÏN…º8' Pª)]å&5¶BµKIãIî±:„€zé€Ni%€«ØM"¼yso¯E³“õåÇ“u‚ùë&?FQBV/øxA` ôà“&]xH–ᘉÚÆÔ¯‡jÉùc fFl¾îá< žºSz±Ø$`â¢åRUâÚ ÑÄÆ=k_Òà‹›Ê\"øW—ñ7nܸqãÆ7þ§cWÁÞ0‘á? 8ÁŸAPŠ[|¬!hÈËf(¼žéÕ{ÖóÚf¼B/Ó1¯®¸ãý¸Ë7Q£ÊIÔj€)—/‡ †sžõ4 8]Z% N}ÁU Ë[:Óp7I­v~³êqÁœ:! ’è:¥Œ ^/˜TÌÄUS‘tð›nrê•>Ì]úTPBDª`ÖP¡ `A]À5Ü'Úh¯{½ù"$àÇTÀ_°® B ŽÿõU²øµÙü2;5ÂEVÓy§ñRQJÌ$ðÜH–W3zmúÛªÖmǘh5£Àbe~¼K‘¤î—W˜½ŠÅSõ³V k[MƒhQU0&£·ÊÓÓ²“TÂJ ÿ7ËçÀàõ€"åŸGQš^emÊ(ñJÚòÓ³Û¢“èÿòÅÏÊ?ôý÷É?_äšÖLårK‡¼éín …eùàý[—ö5š´VBǧM¾žšÂêë>ð³›Ùñ’ þO?2ø½ÐíV¾«ýe ¯VÓ•Jô€©ã PEêñúŠMSß5ô½€`éøõf¥Í·ÇfFjñ—äúŸñv¬·½pÉ[(ô Õò´«‘¸+¹ï û1êê2›lUUw"›Z»Nõyž1ÆŠAGÛDDäù¢·ßˆvu“Øý{û4hýnæÖ¯h¸ïR+JÃM¬ŸrƒHвð4+NdR’+¾³ƒA`æ)m=ˆíqúÌ&.ä¶åþcWÞ? ÿ‹¥v7'8_HC?€“ëÇzs¹Žšûÿ¢SJ jÁÄâ!¼êàáòƒøÁ÷ðýûúÏoî{qÞߌ/›5H*ï/§Úl´Wà{ï° Ðïë‡ÊJ_¬4‹ E•Ø×Ý&7­‡M‚'öäÂ%`t†+ÅòZç”f¢ÊD¢Âµ°îtíË+•,°êQêƒHß™fÀ–‰—™ÙªCîR0³9{BTŸçyžçc0ê•L-ÍۙǗ$WŠhÎ:G5 —¹©qQ0]"<,7Ÿ™Ío¡y;;pï‰w6²P>­b/îïØfWþþÃiÞzWqanUUHH¼˜ Tæ•:µFä\Õ2{Té‘KܸqãÆ7nܸqãã%_ÌÿšþxúÕŠ‰lJ-–½Z¿Uôž†¾± Xala IDAT0‹EA%¬ûvdyƒ¿oÀÄ(QÂj90Ÿ4O»ìzTö´ôY³Î/_,YŽÀìF¬S%éTqlLµ¥œd"ñ&}Ú5–ÿÿZVy,gOŸ‡Ä ŒðŸIÿ*˜{í t³ñuwf*(ÿNü¼ Ö«wN³ ÙÏNx¹œ‘9ì`÷mL³ ‚ÛÆ*­Õ-ØŒ%ì·&4䫱#h¦Ü1¾^ÊKòŽ¯ÚŠ-& Ï¡½”jýD+t>i°´Zåuº¸5î˜ä8H“¹X_””×Pýw¨ì_[òktBµñ¾jtZeÖ@ãbñÑØv0çÄÿXÅëËËdë Aû[—œÒã6í[_“ýiÝ4©—#ñö2ó·+ÆÀhhñhÑR¥t^”øtE“àu|ªMùQ2ÿq{øY¾yŸþØxÿ§þ+É%•4[)ð1QÛi~p§nê(ù7W¨TtÊμ\ËM·6•˜­4!ul Ê@E«gœeðRzêÉûS€HI¡( ïî² ÷W±šå’G¦–3~ÌÖWÕGˆá÷5s–™¿eÐ{5I‹å°µUVðëù5ƒ‡mÇœjõPFÔ7DS…ö÷Tw”@'AФ F2Û"13Ç-¶u¾ˆ¹DlÒl$¶ MŸ—F‡z‹h³ ¹ÔÌý/=åª#nÑ'¢ae"€³…yÜ¢¢Ñ6ëæˆÑó<Ÿ~‹Ü¸qãÆ7nܸqãÆo„¾(ƒëÐ%×*@ð)4_i©øÑ7›¨²ã„½~ì¤4Êmøl °×1¬«VF3]²ì|Õš€à ©€wÔ•Ûa›€9:2ÈÚuÎeGгʵ£]ãÂUDS]GzDÆéÚ;ú nž¿ˆ+ꎺ†ŒÞ“KVïwUAŽ@¤nH}MØ/N £‹»iø ¢Ñ¶”ô¤€4JÅÀœº¡& ˆs'd>Æ2›Ç°«n¾ø {.в{G£¤ù.–¹*Ò/¢Õ £ºûÖ ôúùô«€6ã ©òú 6…¢ƒJ2ºP)û`-uœDÅz½Š¥¸V _x-Ž¡Yÿ´'þý¸ë»Ówws!ž}JÒQ2¿³9+²áÚù|H*Çq,f¿ýŸ‡5ÅTöÙuÇøú4çïÄñÿ¡M®ö‘úýÇ¿Åo·êm^ý&À’2 ô‹r’¯Û#>@ØÔQÑ!5¤¾æNÚÔç¨Iü4`*7”éÕ.d®ÕDÂDŒPÅúuVhk[þû×ó¤p¼¨+òd3>ôF^ç5:«Ñ>¶$‰oÉöJ"1¨´´%^_˜‡bD»@ÏÓ«9Yaap^XQÕ™Ljê>1H¿¿öR$5ë&@HTôef1 ê­ªÏ¦›tìv÷ŒNM¸ÊŽö^Ýìbº¥oÔºò£q¹1?úLêkÈ€†“ ©Š¨ŠŠUä¡>#¼±Ånc £G~ýúu €7nܸqãÆ7nüØÝõà Gì/ÐÆYÜOVV¥ƒÏÇæ7Ó’&ß!×#ÜÓàÑco4è¬ ÉMãE?¥óLÌÇI‰þŒ2wwMÝ fßÔu¶SÇCúTiPø±åàγÔ¾E;>;o&kŸ*6Öš†?ÍÉNÒ€yZà?À‘à@!² "€ò W±õ%å<åhÆ{?ÛÅž¬è„#×ykâ—SuÉÙ.±ý=§_“QÒ”ÏVEÊ3ªëƒµ$ú™¡J`v± ûd~¾æz{J(¤öqüµ& V@)!3@(ÎݯBQ)R¦GêÔËCX$n´QJˆ|,æ|‘Cø‡xfîçpî<)Á”¯€×a²V¸­¼Ypâ ŽïÈÕžD¿`ëZÿÝàÁ'ð~NôÿýøÓÚ„H”Ø}LËz)Ó~.zKÿ?Ü 2ù÷Lž•4 w×îE›Ñq»ˆS|PÊi²u“Zv•Jð ýÓ»7øn‡íÿ·¾¸—hïïob¡ u»mÿý˜@V@kþþâ4¿ßþÊ.¦ºWT¨wÒ~ðJÓo}rŒU«½$‚¯¯rçÕ‡”L²…À±…Á‹›(ì}œwöà$¥èöPÀÙª €°%§WáÁ^™µÐ!…爃‹Èl²9ÎgQ?µP¦Â^Ê,ÎFÖ‘öBkÔßUÇ l‘ÇÝ‘7O… lÓc×Òý:¦TÒLÅp¶fMÖÙ³ì™8{ÅðÿfükÅ"ªœt”€9HDMMzîû %“ ZhMÿGÜO$;Ií\å3L¤ ‰ŒQÄE„¦»D©¿óê-gaâhjºr¥·.pãÆ7nܸqãÆ¿º]W ú«ÿÇAI¼æå »~Îî \Ÿd;±K|¼„HÔ.œÒ2Æ69 ]ªèC¶þŠ3¢Êªô4ØúZŸ€ãzÝ ˜Èôp*ü§E!§ œ=qÈÒå#¶7•ˆð¢³„F ÅŒú¨ÿSçM"’‰” Ö§@U…dË\Ý>OV€ð£ÓAR¼ s‡Ön8~Ê+Í*q¶ôiÒ¾0^˜IÛçÓÚIb@ó¤#­ÚäæI< v)C¡bÁê$n¦¬zàŠ&â¯eà\2<–Ò¦gÕL­ázDû³ò°RxÆ:þÈ­X¡íZ(ÄŠ7bgÑQÕCÚx¯Ñ@¸Šî-)þµŽêƒÓo]­Þ¥¬‰ø§s){~8HGÿ?ªZÊY¨e²âå*v3ƒÏéÿ¦]þýjZ1äœØPï•h|Y_?¸K½ Ü÷ßh=}Oü‰úÿQÚè_á¾jz;Wt>œxÝ–€‰O#÷6ë¡´ØÌ>†ùªŽAQ0ÛÝmØá]€ŸÇ-bÛÙSž>…1 …@Lr1wäæd™ëDá Œ"”/ PûMªO¹Šübl˜nc'KÚ-lŠ$yYž¶èæ&,²}MÉÑuëÏr9BâwãÿŸ½¯msÝÆ•DAÎýÿwgšÀ~$%»;9'É<ÄÎæúزDñMí* JDë6w$bU"©!‰9õ„úá…«ôºÐ…q¼"¾+þ?URb¾¢UQ¡ÉXÂy+"$‹!݈ùôãqp)j¡¡´¾ÀÒZSQnlgSêH¾¸Ã±ˆØâ˜(‡^¿hF"r€'Nœ8qâĉ'Nüu±::¦"ì iýQ¢;éáµ°à³áÞ7pŸ&Zm倲øøªžÚ<ä€Vi£03@Ím¤r£Î_)•¥Cõ±º"²¼µ\“Žÿìž?Mh]¶ŸuJ@öߺ¾zÆ9HnØšH¥ïèÆâ0#V7šNYŒ(a‘–/iJÂá©ÞKE×— ž>çÔÒ"Õ%,“üVba]hS>x—òz”R¢CZgBou¯›Ÿ¥‘Ózôj€ÚóÁ ©3;¦MLÙÇ8¦1@|u)žøHêÌœqNNh2] €>zãÁ0§Oï7ûF-©'%®^äÙ~Y;¤[¤1AW— ÇÊ.y¾õh§Ö|Ñi®ân9Ï÷ë±Y È ÿ,š¯ÑKFˆ—cÌ7¼Eÿ¹*ôOƒž»]÷kUM½zÌ»·NäÁÆA$o ow‹!gkÉÅžfðýŽþN>ÞŠžyŸØØÝwVzC™@•^)#ÃDM#‘ž&èöa _GÚ X×}"úϬQðæäö¨V¥št¯Ioúb"ªì†¥´¹PÆyì¬âAEI©õ»ˆ–KQÚ¶¨M€o á&;‚Ti%o­=™úZΆòÃ&Aä–20ÚÝ„í/ yÖúp>íDzïIsæ~¾µäz t¾š(0ó××Wk­ÓõÊg+2ý”Ñzk€°4e¤!‚5T¨ËPfë/›[¥¦•4õƒ…\£hÀ éÏŸ( QOÍ3p/TðþV6‚›‰åRUÑî|~—œ8qâĉ'Nœ8qâÄ6c›ôΠô›xÇøÅ¼mÃwÀ‹;ÃÆ74@m䚺?|–8>p£pA÷ˆ’‹–ÜŠ­‰öøÕ.×GAÃÚøgSbÚyÿîL P;µ6ºXU†ì‰¥nöqÛž' f]Aþašd ˜¼;¸(6°]Í£q²§Xn;±ü騄Š/Žþ£K'A'бË!›6”¡çQÄ›ù#EHÉYÒü®— ‹Þz þÖÚžâQ«Ö®ê“'ù54‘(cÇ ‘:@×Ež\?$½Á Ѧà‹òo’¸«ª¾Ûg?#]îØvª‰dÚœ²Î^ ›ö­ËÂꥱ§ÍPý™WόřyÞQ·s<áþƒZv°»Ör8H¹ü)õy2[ÅÖ“€‘œw'è_w÷ò辋ÝÎáÅ4 «SúÎ3€>@ÿKSy÷@ÚÙ‡XÜ'Œòã°~–þÿøPÃG7ßÉOb|8÷þd¼LtÝ6(ñíÏSÄID´>& —í¥4€@ß)ó4iÊÌ—g¾Ç“¸³²JØç>_:Þï'$‚‰Ëxóp>`J*”œ‡³@ +Ç*—ûЇÞD(¾Å -¨‰z2Ae‚Ð$PX-m£²)¹Q/_Y©þ}‡éϱî«"B€*¢öôÔÂílGͱq&ÕFCŸ:žNa+RãH öN¦‘úH‰ýùeÊ9Av ~#šÈÅ f¸Ž¿•L%ÛÆS¥7£ ¸“®GÔÞÄr')\œk ‡ˆ¡yýÚsIÊ)'Nœ8qâĉ'Nœøáéÿzƒ³ëÞ|™u¼k芰|€Å¬ŠóÓ‹gXÿÓ …ÀËpmbTfµ–œªÿ6=X¡òH·ß·ÑÚßÄrݬ´þ··\\¬&ð ÷Ý¥ &\Ñ“º9O2˜Í‚ëE«Ìsµ_WDºÂ—¡“ã}Ë)ã{¤T'Í™‘wßÝQHHš[þŽöš] ·=P·œí9òÞŒn“¨k6±k¼ñ RcT„Zr1§õöǪ¤œ•‰˜§á á¹üUž~Ô‹D1ƒ¿@ª0Ë .%']×£ÃÚ§qfbŒ"\•B“cDø1PªB5íh"q`K¬A¡ xçWQ>ªN·èZŠñ¸Ê§$ôjc žª|ÖQâ¥ÂÆWM }ý@çÅK»$ôé‹}„ß¹W¬ d!nóú‘ì¡)oÓ´ñkûƒ£ñ^£è1n¼ë7'ýëã5VŸë™dd9²òeî&Åcªþ´P dïZüÛ×ÕñÕÚÕšĨè«®Žˆ(é$•ƒª’3F £Ðee©Ñ&"B¯_Òî-Õì¿ÕxšÈ뺢Dz ý†÷ÞÈ~Èm‰Ò,DÊîÕ€£í¦¯¾æ+OP7Xæü ÷݃Ík"‘¢çÝçž^ôar µ6<T‰èr¶ÙÞ±â#r óLK}bµÔîÀXÝ­Ikíÿý÷?¢rá²Ê¾.Óbb'r雂ƚ®÷š3^cÿ{¶Û€¦P¥¦2¼+°ì2ÞÝ Rk«M(ÞÅ'Nœ8qâĉ'Nœ8ñ‡Þ( dÁNØÛ €éœ”‹Ô3ðr¶<ºoà°E÷_õ¦s£®¾ÑŠmMØËìæÄ¯hˆtŸÁmêðmË€òü™”ëï¶øæs]U?ឿϤmî^$1Žré€ñ0í«*–›¯Ý-/ôOdøÒëu’8Œç&‘"J®Âaÿ ±ò‘f/£FCr$“+Cóx98^}bMx§ú·Xl h¯¤†`âà‡òòKÓÜŽI[‘Ÿ¸ +˜oÖ%£ÐÍ“ÉÁh¶³e·©„ª½KnPqGìäh˜c´ú;·Âß×U.s"3¢eZ©¢iº¨ËD£Þæ4'±Øíò²ÌSâÿ ˆš\=–e>í&ŒD`ï ¯Åjò~™®Jô¤´³ .î[¾¯áùÁéöf3ÅÝÝ=}ãÏ¢ÿøÔøy~V3ýµcf˜>zˆ¹ZÌ€–û¾ÃûOµë÷؆À̬ÊML¾µv]wk_d˜8m½îKœ\ý£³y@Ê]â=ñ”ð5 R*~°þÛÿlófb†<Üx7LV…·ðbn"HR7‹:P)J0ÐÜrá‰8ômÊ×ÀÙÄqD¤‰PˆæÐ—2%]#úÿì#SÖa9õÕÀŒr/Kû×î0C4ëð${a‘Q`äA¼¶Ûïõ¤Ô5úU ™{êÉþíR!!m"/U ¿/$PÔY;ÒÕ{Ñu¢ %•{྿ŒÚÎßI¦£ÿâĉ'Nœ8qâĉ_ØýsUóX¡ŠgŒþà_ éýçxHù«ÔEرc'&Ô)µÊ’¸öf˜Ø·¨O|¬Š¼ŠóèNc~«Â‘ûn©¨ŸÊmmµSŒ 0¼[*ÐSãg+`Ô1˜T°ÿ½ìʉ?H°ñC¿¢,^9QFõÜë:Rï†ÌzÇ‚x'“ ñÌÖƒ5YDŠ:΋TZQ8àŠLyÇ:ª'sš²Š †Ô!|4ˆ1o–g‚ZZ' Ú‹²×Üe5²÷ûd.ºCÓ¡u¬ì†Pç-FM ¹äKL‰æÇ5̬ë˜I|P›i¾H{A"BˆfÝÿúÚ™&§O™ì.v*G1&øÒQs=á³{Dˆçµ6­÷éSvÅ©ä׋”¬Löéy÷‹OÎÂwèÿ8û¶©¨N {…ªïÏNéø|3Ü$I+–µÜ ÿtÛç?yJ~þ­{DþOAÿ´3:ƯV9œ¬Ûö| ×\{ª4k¾ØÀN PUjÂ;/"I3jQ¥µÀh©&‰Ç.ILL¹ |Èâ÷åÔ÷¿±²Ø³ë™u¸ËŠÛP8¼:Á'‹U‘"ãJlåAÖ¿œ”rFÿØwUÉlf°pÓ¶fß”Nô3ÛÚÅæI…è¢M1Q?5@ÅîŽ"³[r!Q]Ãñ{Ï‹€Ô® ‡ëHE€pJÏ_Yè)~û Ð.¾ÈË,Uÿuqç¬a íÙâ Ì"ŽrÆ I£#»Ð¹VÌÏéî‘=™i<Ç““YSúˆfjôĉ'Nœ8qâĉ'~Ilá’* =»-êÌ (-n„´µ®¬¿f^·@'ôžxþµÔS³é>Ç?¡`S¾…fØ}xÌÖÜí¡¡Œ|=èEÛò§¼3Ó ËPbeÒEã{5%ÆÒ]ÁFðUÞ ¥ Dr4’Ó¬·“B\%7fb;²`½K=/ŸXÃ…Ö»ÏṲ̂QŸ÷IÉ{{¤-“ˆOüPjvÆÜQ¤%1èÃHT{#Mu'¬Í$Pë2³"›oéÆâHUwò ÛWê²f.&±´QŒ„G«ÒС]­›…ƒ:ë  âjTƒÐ³L,c$ìžã¿ q)e"º.('Ä%t#ÿE[%}-üSùô $¹„º¨Ž+éÛ„4ò`Î_¹·i'ä7»–#B©éL;‘p 3ìN5½kÒé£YˆÔÜ¡ÿ»y÷Ê!1‹x©FÂó_kzr!Ίzg©1¢‚ßöü7íéÂETàOêüúпū$ÇÑfT½”ÎÃùd›žª¢ VUeæëºjÄ]x]¤Øö®ˆA95~{Åœ5oè>@×ræœûïû.˜™$¼[û…¤"ã»Nú_é |q˜Á*‰2â¨h§ÒÅ3«„=-ýïJÑÅ @ªô"újbl×®$¯YÃ:Òt‡8Ëñg#ß›åJFÐ5ñc•lb65ü'П†Þ¾™5{n®XD ëz ^×ÅÞz:{ˆ‡£Õ%¨Rv˜ª(Ùƒb¥Wõ“­2U54¥ 龜Î=%'Nœ8qâĉ'Nœø1e¤9øx£”Ðg½Ñ^Ðpg~­Š·ßÚÀ7[%‘'Õ›¦¼— .$— ýàj¼˜"LZS–}ÛÙÂyÎ`A”6™„!ªtÈ–ÓW |þŠã¡…º˜`ÏI)…ƒ$àžÊ=‰ž›ðK¹ß‘¹"…ýðgo¿6† qQ‘y6ͯy —´â$A]˜HE-û:¸JWäHf—1£†`óž¼VÀ} ß7\Wãº×PØïÄ@ç]ÆLóf@Üß`¨4R_jåŒL%1ôáë`U2ý¹8ZW} ©$Þ…Qkã.JÁM†›Ól Õ(Éȳ½¨Éh-d&Ê’X<ý×p-¨(2Y˜W´¯ë>Ir*½Þû¯ÞÈ7Í{/ÅUfl°QퟲþoÒÛßÑ Û#Ÿsÿ7;åD yläý­.Ÿ\T.zתç§6»Þð_Ñ{*ôþ t{QýåÙO~xÿràEæ]ÂD¤­ÙÂT0Õ\Ó£¹ƒ¡ŒÈLP÷~3A¤qá Y8ûÄv€ž gºÕ)Ã>*¥lßVm¢*ûòŒ5Ã= 1YJ~‚ÓgõÕ”.^38pæ•úuš?À ÅænBÏ]€¾XÍjšÜŽ7i,`¾p1÷¿Q4ªÃü^“ªŠ¨'Ï“õ§VŸgZL†©r-¹êSfÎ&3ÿñz1š¤Ê€•ϰÎ0$Ÿ$,~TH9ˆ•ˆÁŒëzÀüzýñz½.6Ý~mMd½‹t‰Ù¼ȵWèÍhaš1ì£69<Ç1‡ “=/¥,„÷†$'Nœ8qâĉ'Nœ8ñ×Â9?UçߢÿùÇ Üy†Qžò»ŠOägf“\û îܙϠ˜¾3ˆ_œY>Þó” éD†8äš™.´¿žeú‹ˆ ÝK´¯R’7'Ý›3¤aí¸¼ÀÁ>5°veVÕ’ñ G4s3îxëȬ'—hÇ dee‹2wÄ Îu ûÉ«€M‰\ÍDÅvLÿ®I%b¼“] úíòï;¢Qrºýª B èowjdF0"ÄH¾2Ïî|Ë ^HÑ{Þ…¯n'€´™*‡à«Ï]$É#2/Õx3°ƒ]bÆdbBÖl÷! B0„)j#Ê6Àã«¡ê\æÝiË¿ IDATŽùc&ÒÎHEóû›\¶Å:ÚBÖ›hŒT§•¦hø5»/<ñoË5…UŸT ÿh›’?¶”ûpò·@ê½Ü¹¸)’(ÛöcëL+ñ°0˜.úÞaxÙÄ´>\ò$Ñ!±õ,¼ó“ÐõÂg þ‹Ay½oÞo©ð¥ àšoŠíÖ]Äëõn¯ªñ]úFÕôñÀuA&Àã"1v7†@UEZIÔSʼnˆœ9X|VÑi7Æe4fâ'FúÜ@ÀsQ¿…®µOùï€ý²#éÀÆo›mO“A}Z9ƒTé|Wµa×*ŠE6ë$*_¸KàcÒOè=ÔIq#„xøª  Û%Àu]U˜ˆÖ4ùIp-Ê¿’<ÔœœáI÷dª‚qƒyæD\Èþ6ôñ%{°ÝüÌ×u½¸ï¬òõõõõ1™C¨ˆ¢Ô²¸ ÷gDzM"¨%WëéÔ[@Ú%Ã!¹Pàĉ'Nœ8qâĉ¿3`ú‘3‰ô ¦`{ܤ¡“tý9ù'~ï5|‹ì×f#Iå<» P– /@Uü(Dé^›Î¶•Ýþß×l‡iE-Çå2€Ìú@Ùa Ãñ `E§â÷¹VÁÜEC‡Y»-£™Ó2ÌEÙX„8ò@‹•Ašˆ‹øâK)§«×žÌ/ªàyìƒp€yðŒC‚nÄ©¬ƒX»ékT‚ħ&À䀬á ]”Ižn¹ó6¾×«ÏX~Í£Ó6½ë´²æK¸T¸æIéiŸãºäŽŒôS] ¢ÀƒíþpHÖblj ú!]`s`È`”%¦iJ/…DÙLšh.2z{>•[>,ûš[\óêÔ˜nyÕO^¾ÓòµCÏ6ÂXqÿ§ÄZªsvæ·X ‡7¹ÿ·)óaMQ?ÂûÌz€ÖÖÐT0¶g:‘3ú{¾öÞ%••|FÃ|*¶~ï­À_Úëïþ-^]vEûûµ/¢,ík~’™’èäš0å¿Q’ÙõfW9$'ãqÿä"ÛQT³WPx²×TúÌMñ¨ºâ-“¡•}6àº\"ê™õC)©JF¦9_UÝ¡2ãM]^µn@Ý4ËoªW÷Ugd}”æ`Ôˆui!(€‹/ë©QãdSXJU 4mÚ®ëêèÿøhá{¦R€ªòŸ÷<˜ó±Ó(®#Ÿ.%R@µÁ ¡|ÑÐ.¶ŠQ«ˆ°§“F¦ðs½H¤ä\¨*)¯ëòÂM«UÄþZ©nâªLK™Ã8›N2ÇÀÅ0ÑÁÿOœ8qâĉ'Nœ8ñ›b›Â?¡-7u\,®Âãˆê;kE,…Ù{Ъl³êSë#¤‚‚Í=”ÌwYÒT- "ªIdS ·u [“€mÞzV³™(,Ã;Ã[‘FDâG™so`ÜJÊDf’ÉÚ7r«‹Ì Úù]Š”0á¤d{׬Gè·áþ侫LQ(*Näò;+PÑžac;uRr<²—©Æ1‚gŸID‹ˆ,Ñr‰f¢ÁZÕµ€˜@ýõR¿ÜSÂr@ÍlÙ'ƒ©" ¦¤¯:ê¬@Ù™¨3M³€þX C U:† èjEªjæÆól—®’”¬¨Sjf‡ [UŸŠù0Ÿ0Ç$'Õy2]7©{¡¯¹Œpÿä?LkŠ!§BœÍ jG­*º‡þó™§äæÞ Kn5‹fï„ýÏK¸¿Ð²)ѳþÏTž²˜ÕcU¢¿Ös·oë|ŸPo|€y¼ìÿ$Oψss’ÏÐÿ·bªw§H²ÜíÛª‚Œå…ètƒSÞÜ ²ü›¾»“ÁùÆP§,Úm1GBx{Sq uûžê‡ö†¥Ctu¶JM´@HsI{ž¸v+ÄèôSq?3ÐExz2>´'ª›,E•PÒØáRBq§ ÉÙî–ΟçÏF„j’Ÿò ­«f(ïçIç¦&ô¿Á‚ŒwlÃ)¹7EU—›óN‹YÓ{׋Œ„®V”Á²¨“°ÛjSÁD- 0-ÑðŽVAüŒ8`-’Š-(˜ÇÍj>ƒnz†¤È|ѹÿuc žoäí6’¯N´¿§…7ƒ`¥0œuÄʬ‹=Ë}ëWÚäøoßÿMÞÞo^«Iî*ýÿæ !•gÈ$»†4¤3Fw¦ëOŠOŒßß=­>xzÖéÎÂàƒ¸©~ø=eUµ- ß"ªVÏ$D¤Ð «†½êÜç~½›Q4 y;¢ÝZ‹ q!jDBª$ht…æ˜ÑÎ]ŠNÉÌ~ÕÖ»m‹ˆ0Õ›@ÂxíÒ ãwhÛrÕéë«gˆ°Nà‹X¸k‰ÈWk×uŒ°~½qwq=ª8&¿#ý¦Æ@ —c°9 33¿ôRhØ 0ZÇXDŠS$BÊÔYR××·{w¹§@±ƒ–ˆ ýÝBëå“|UžÃ8;¡½ï¬Àà”¾ òB¯jˆj‘þ¬ËÚAÖcMõ’+Û't~üõ ‘é(ù¸®XEÅmêµ>Zú4P;iÌpM¸UdÒ Âu…¦ÕÉÿ?qâĉ'Nœ8qâÄï <½‰ì ZôýXmX÷h U ŸZ€7B:è£ú$ô†À@Ùol'NIœ†&2À]tSñõ›|w·Ç¬_YÛ»ÑjB¢.x1õ†j Î5 v§ê+€D#y~è@xC˜=DìcbæÑ‡ Ûþ‚½)6áPðD¹ùà*•liYäÁ\(ßÌŠýÌ,f¸<§ôŽÖñ zȼ6êLv±zÖLÔu­yŽ*ÿ¢ zàéÉ· 5Xey,µ`ͶÉÃÍb\bÙ*Â~¼Õ*ëÀ€°r8P]î} L–ðê´ÈU©šÄ瑳˜£nƒ–#5¤«ö‹ÑúVe”q¼ßLæYHè@ùÊz—õ«¬¥¬É'”?FèIüg ÊÔ'–ûÜÊ›a%vìæ" £K™BM„-)úŽÓïÓ#àOâéw†‰#ÿyú¾Þlå¿6^9s9ƒø.¼£èbcsk®l Z=%\ÌRaî”N7£e ¦H'P5T€TѤ)ÁCiÎ&"V6R (^ÆjvÀžŽ}õ¢Vhk]Š¿‘«Ó0³]Nõ^£š4U}]sV¾Cq5Q~UẻˆDµ‰°I*ù*$$ÌvA Ý.ѹƒÎþªyç’ ¡¥!@“Ç"PÉg×ß×u»Žu¦VݧÀåÉÿèÛÖÚô33QjÞªÞžÀÓ,‘ˆ0›ÙžÓ.ȵBÓÿ,ê· ‚šqt|{\Qz B—æó”0‚öú ¦î™c_(ä÷Iz8qâĉ'Nœ8qâÄÅÀŒäθË7ö@ýÎáó¹AìwB:wçzFئZŒê}‘0¬F»f~œÆE´=“òö*TKÈEQ(Ê[&`«”‚îܰv÷2òÉCXÃ7Õê)°æ§£¿£WjExsÆ=U¯Ñ'À®h;¨ Šù™N•î±7[.Pà4“B@q‚ÍŽ/=L§ @GS-” ƴꆖw fSI¦\fáÉø (a±†Æ 0ŠôMÖÞ ûƒày´3T$¡ÿ¤íì×H0ÖŒW1ËûNçVµúYÌG‰AââNÆù õ›ŽNèòð¥ød1I'Ñ@MÐ×Õ+!†möj-øD¸fÖùògCºz¥vKÔ TšEo&aŸˆ› †Å¼o›ôß9¤÷oÓÿéôŸŠÛðÖäVwØ7ïáöImÇ·)ïª(ôÓ?8¿þn€¬R}_‡Ø;…çKp÷;%ôI÷ŸwÒ1!H3I³…«ï8o×êé 6¡«‰ˆHGaH¦Á–ôøkÃó±™”´¥Gk›Š*+±2˜HÛe‚ŽË³˜PånfEkMI›¶ÿü÷¿Dôz½‚>ÙfÍ_NdwYÏïÍîž ÎpØÉ"ßêÿx½üç¿ÿH½ýž˜ÞÕù­°ê‚°{ªeÝüPÚªßD“&ÏJ÷¢; ÜùTcíÊFÁ¦ìÊ-Á@3†ªº-”»¹Kûƒz¿E“‘“@ˆ¨3=åöSkó|ÓQ+ ¢½¶ÎýˆAt±šá2ƒäœ8qâĉ'Nœ8qâ7Ç6ÊÒ7iŒ  ùÝmêãFhÖe}# ´E[ô#ˆøŒ ’4½ÉÅ^ý‘× ×ô[Îr·qí/vøÁñ‚ßUÙŸ·•èöPOÀö¾Î £LaøËü42¦õŸ†y3bØŸgàïºÐ!µT¤¢½XìOMã¦gÄ«”t{JÿœòÁU7S“hN:ž;'·Jf{ÚiÊÖ¡C4 w!£Á)ä®È–“^›ÅšnóqáÀËô"j «]VG¡J†xºË(%„G±Q£—dë2—#’)y˲¬Ìd8ûuOÜIôR±B×ìu;Ò@™ !¾‘c›—([žg ŽEVÖø}u”Áf·Û+2ö:þ[§_z°/n\Êî§]«jýôé’6ŸûÜ¿§q¶ÍeÙp~(ñÿcT]¿÷õOüŒøoŸÈ¿«€&¹ÿq¤k‚_:‰ÿd°uJ×›‡.º8 MŠ1å'%à\T–&®’ª6Q@r2;%æN Àš™H8w­ù“)ƒÄ| %´:2ÊÙ­]œ ÐëŠÛçë’¯ö%*_íëIÉ È˦Äùi ÷úþ/"¹–¨®dŠ.U €¨(é ×Å]$"$ê¬? SjröHxûÞ ëöT^’ A˜—¯Ñª*­‰¨mÜyPfÖÜŒQѯÉ|%"ÚRµäÄ.ã=/dUoZ¶¡éo'¦?žËì‹*4ªXÝ 9×…œ8qâĉ'Nœ8qâÄï ­mìL±µ'Ðêâ¢qrœ< åÏr@ôœÚOûËíƇhREØé­×z2-câ7ºÿë·h)°ÿªl@´-zw>°œuLØgk¹iÈ슰‹¡ÿAvl‘Íý)1f¹ÿ¸±#‘å÷õdz¸ŠŽ¤BÝ;R ÕÅŒ>q ;PøYj×ò°@bƒ„˜=0µã¸JæT¦52qMËp繊Ë‹1ƒó zÖ­e_’J× ê§mêB îÊP—(!¦¨íÈ¢=†›°Ëüc…[ ÔÁ®PnN$PªV¡°Žö´ý!QÅ£Rcx»+$g”•Ó8K¡ÜuÈ´0ÍkŒÂ0íŽÏ~¿¸Õó)Z:øø;å ó¼ 6kð~w\]…s IÑô¿Ó½A-F[ž"øŽ(Ðó³P?/øpïýäÝÝ»¾a>~A¼Bì%g[oiì9‰;cÊY~Õg X¾åX˨{z.ê r£‰ X‘ˆô x>ØÃ•æH_Û‰ÀÅÌ4ìgÝuÌŒ×uý‡Œ:ÖÚÓš’â}A1jGQ¢Cz§ÕÒfjÍêxJKa}“ljŒ$kCî%0Ú¤§?—”)©BĹ®ã!’ks"n¡æÆÎ6ÎÊ,ªÚšóÆÌ^‘N_Ô††0Y®à\eæ_aµÝLâN(¼šÉÿ}j+2;$þã׿á¤Ž× P¾a·îJSç—lj'Nœ8qâĉ'~{ÜäößÏ´³0­ØÅüqUp¾K?ž†'î°X9€ÜéàÏi€÷uKÛ4)ÀT`+ç×S†@|EÖVmM>·ýDÕ맸‘¶“ÜÍÔÌ:üÛÜù Ê_AµÉ¹!70ÇYõ3_ô8•‡¬Ñl¸ÇåÅÌ X¡§Úò1ºxü.k£ëð tݸ)ËM5|¤¾HEÑÿŸ†úPT?„e±C*„‹´Í• d¿±˜ÆÚ'âsLúi©ùzQŘrÀíú6ÈIºŸÏDÅõš6‹´w>DI N£¨]#ˆ%fi¨öW㊵ ôaFU•ú*ÞŸE~2þ‰ý·1MjWž =†lƒûS½™z‰ÄHô)Y~a%©,Ãq-Þ?Dên³àóΉ›S݉ ½¦½=rŸÈÿ±0ÞÓ;Yî=´9ñ·Ñûéhý)ÿS¼rvvpD“ª;+Æ#0==%”öëãØµe:^Ké û’è=u»µFõ¼ªZüp~{_tôx—Ù!—˜‡‚”‰‰ABb¢,]•Æõô%ËŒ÷vƒf'*`¶©:{ØjðO`f¾˜/0õ¢¨‘`žõß›H`ØÑKã£.7ÄDY"Os…DstÞPò¯ÖmýÉQùå¶$“þÏ`ìé» Y? ‹ ¢­ )IˆÛÓ z¥FL€áÚ¬e¢TÑ!ùj¨CêW¿wÎcòV/>“íIœÏÜÿ=ÿ¿÷žH²†Ž?ç}€È837ÃL}÷Ó]lVJu±)·¯Ö¿iuŸ8qâĉ'Nœ8qâÄÛÐá²$ú˜‰ÑÐ'„‡6Ê1ù‡ìßs«¯ïÌ„oážåBgßžS+½ˆ¥gÒâ/¸ìWã­œÄjØ›UwTöIÌŸ­+£P\=±Z—SMô %5›j Úsÿ¯®®ËÁVÉ—æ# I*LQ‡þ @Â:P%E/#èÿõo™y¯v‚a­™¬ŒuYDeZe!jq«Þ¬-êB½1Õ³çh/ÂP!Tcý†ðc°Ù‚?w–źœ?“’ç/AAáw}‡€Þk£ {göNÈaš ®íÓ9"QW^îØz'ÙDM[ r@4Ë]Øñþ­‡ß¡Ôét]$£œ`ÙÞ¥½Óý?Hü¯Ô;qé×ßiKazF©°°=o ÿ~eSæp ¬¼(¾ŸË¯ºï™7BþÊáSÎçY°Œ'~ðx¥7&ó¿>º%õU'o³9Í™,5ÜT"¶ÉæÙ\÷bíiÔàZ9¹Ô½©³\ÓÖÁVÞÕqm"Œ…¡y2 ½¬Éîâº.-LªÁÍ{I™˜Ÿ9›½,;×ޱϯ ×ué—ª‰É‚p¾F•Ô&2U]ììpú[­5ç_×%­i|«Šì_‰5Ùr3Ý“ »¨a èÁŽÃûÇÒÉp^~üc¢5 î"×v&¹ùê„Ðuu¿7;“«x‘Ö¢$˜$Cþù‚Š€¯üÙT}iìŒˆèø³Œ³(‘U´©p]—ºÜ¿_W™Ùšæqì=,}¦It¿8qâĉ'Nœ8qâĉß+Z]Ý UÄc–ÿ‡  mãw¿ÖR€w°þFªuQ®Ÿ`£[4(¡3àøñ_ΰ梣ú?ã°r(`èªcqVXn'ßB—°_ñ8-zèc &ô¨ÍPûÝò¢)qê™{U±î-·VV‡†õÍü©™ÙªëUÐÿæ–‡uw@’ üŽ-#–LµYšÐ*]ugvH D1®\D„ØÓ*wÝ`¬¹+ÇÝ4ñ:¢M±Î1ýŸiÒv Ÿ É9°ìn< yµSè@d\°ÈF…à…éq4 é*»¸®Nz ^€`·f(ÏPÑYñ÷÷{ShŸeø‘ÝO‘ÑYs·—™yýgBbʧ¿K{ß9÷¾ýÏpbÌ1T\!hw•µõwƼ²Mÿwu r¢ä>»Ÿnl“oïî[Ï5ýú?Ÿ[?·ÿ½›ŒGUŸ˜²Âv¸¶ó°¥ãìK"ÈÄç _V×¾§dŸû4º.—ßZGT/^àÂÕ¨Eþ;‰*D`z>„0èµ^LMHDCR?1‹pé9¦”Ù-ªMÇhJØ %¯ƒ`¤U5tlˆÀ|]—ªv ÿ¸×É-$÷¶ë ‰ÝTßÚË£àéþãë¢*Ú.b—ëü¸Ä»¸™ÆÍ#è\ˆ§DÞÛ2."º.!êö¢JQ°8FD‘£ªÉ/¡SɨúýÌÜù¥®kį‹­4èž ™W+9á´Mm ¶ÓÅ…zÁ´!ŽM‰UÎ 9W÷a"S®Š;e&½ˆ…©)iŸ/ÕªW}èM ؉'Nœ8qâĉ'Nü½±bî RÄŒJ~„¹Ô_Fú|¹É¶'µ0ýº{vôýœ”ngýxìÂl§¼~d!Jén 0p‡ÓmœìEÖ]™ró¡ž §wb{3‰áÌš9Ó©nlïn-ô€:Ξ‘ÍžíÙå2ÜÖÿŽ«”îå³3êˆö2ÿN¨*)À ‡ÔóXL%2!®¥½™HÌÚ¾ÀÜyˆ.¿/ÄÕf€yã–ÌRÏŽ õO Sr¹KS‡¨’ñ”gTÊÕ ªÙŸ6χLù¯¸¿è&ñu7™F!ÿSõ~C °kÁ<÷v&Éo…¦Oùn·Ä º„È“ƒßnÝŸ0í6÷›Ôªÿó½=ÿm|z ~û‰ö‹ã•ó#g|’VG]$¤ùf¦ª€i€À!$ ¨ejë@º† ³g5ñtQ¢—^¤]_žú®£½ÞÀÀhÛÙ²»{c@IŒÅ•ã­¶!·¶g𻽳0ôŸuHÂ'9ß ;ŠÝãÈ izÙ ª#îh[uP½ zY ”_HZbeérEYhÈ8 S×Ѻ)O×Õw0V¶ÃB&m–<«ÊÑù!"4íRIä²é´ ¢‹YØjÜbª0’"Ûó-¬®H´Q#ÅE×4™‘<˜áCßé@橌РIDAT3CU°lÒ2—ïšOƒªRú¼Ód´j]ËMNœ8qâĉ'Nœ8q⟠h‹G[õ›œü>£.1P¯‚Bƒ&w†À[hé‰-˜Ú ó7°Î®ƒVZ-)‰Y9™vfAæw=°z#@auØÁý“5(í„•VC…µ¨bÉùLñckÕ@U¡dO`q@áv f0@ÚM†ãýlƒIªÝbvt0ˆi±¶õñ*ó¼àšz®=™ˆP?©„PåŒ÷·û•”‹âz‘ªéÞ>¡ÛT ÷Ûµç%ËÇÑ,l5.;.,ÃT˜ãZZúÇÊå”É6f‹½ŸçäR[3&ÜÌ`’¥ï¼SP±nÔqh-úÆÀ¨î™ËÐôß!æiÁÞ\x’ã¿“ÜÿTUs·RÞ„TkƒLåÕŠ]î?íÚÛßÒ¹áª"Nƒ­b÷úÞøn£øä£›­ò#Öày:}ÿ¨wÏË¿G 䕤躢=%q•÷Ùâ.zû´¥©˜ÀðtRÕ®Ó’óµ‰h…}-Ï^Tš{í¢/W“ÓÐ|gu§\°jSW‹'¯?qñ)s`Âj•¦G¿؈ÿõd|L<_Uˆ?a¸w¦ºlþ²2jâ<’ómî@ÿÑ™2ˆŸpýᇱ— ý%­Õn>þÙméà6ɺ @Yˆ“EÉwyWïwÛ£"ÌÚ·NóZ0Óè<ÍÜñX²›ôàú˜*c½LEʲõ­ï¢%„ä† D')Uµ51’ O¿˜cfF¯ÚZ×@¢QÐ+¬Êà\ØŠê_ 'Nœ8qâĉ'Nœ8ñOŽjŠ[ÒuïM+<~¬.ˆ°×A`Txá™|X`©­DûÙOj3{uû=ú5Žÿ†š xd˜!7[TOKòå#²$VïSzCÛÃ&[Z51ôN`‚ªš Ås¦Nxÿtu §æÄÕÕ#›]Ó#Ù¿ú–£– åJ]Œ?u?D ÖÎTkbfˆešKkDsÑ#‘¯/ò¥@ç}ZýK«Û-÷Ô ž&Ÿûg“â»ÛWÙÖÿæÌàW—|q§SJhuä_Ç›X"}a; Sc¡”–ð±À8êµÎ®[Þ‚”^¸º›®JO´w÷]¸J÷¦„YP@¹¦’yîvd©÷ÄwËòn"ªTçeøèN›‘‹9ëèªIý¨sÒ7ºüL"›‹%/Íï[#)ãàMš©ßüñÇÿ×ZkBsGD¿¾L&hRš€e1 p€*OÒLôŽ&Íçã³±ó­s@9€/î2GäîêùøWb ’y×ù Ê¡—ðÅÎwkc+ò€h2Ž®0GžÒ0玔:ñd{¸—ŒÄsÙÿŠr}#ÄÁ’ÿlXÛ}âĉ'Nœ8qâĉÿ¾Xl ñ£k=Á¶`ƒö¼ƒâ×TÊ[-ö Ze@£‰*¸£†@Ê”Ù)±o‹t¯)Ÿ!÷¯",?Ò½À~ÎçBö.؉ü‹8¾ø¬ sC@ÿLYÑÿÍEölè0™#‰#ý‹†Ìn7Æ ®™0Ä¢Q|7¶ŒB>O·™S_p53Ьí“Ñtî_Q‚ˆš„*©‚X‰€‹\ƒ»Ÿ“CïEGƒD“%râŠÔ†«p|ºØl,S78oG]Úó¤Ëøpªtð2ˆžìΤãåŒuÆVXaÚ_nÜw§]ë3u—±øæl4†~Òž*gÁfÛ5²æð(÷Ÿ—86»$meè­îÿÍ ãý_pÂípàƒÝƒæÍöaC~3|XÏ÷Ù Ó{\þÛYûzs­¿› ŠóN˜/®˜xJcg'ºúûØÄKš€’*Ô%\ŒÅ1³í_ÅW {[ØðtÑ„ö¦In'ôÍÐÅ(1Úþ¬D®o(˜»ô ”’¿­‡°Æ3z¡¢Hzß¶Ã÷Oâ<þä,%´ěΆ(sÉÜ·lwkÃ뺼D &Ä _ü”¯d³ÜIæLkqÃ47îþÈüJÌœ¡ÛsóÅAf×ñ“-]¡2Ø©¥ ã3ï&!…ˆŠŠÒ• ¨­æÃIo ¿‡lŸ£L  TDE•»ÏÄ …¸\ò9þ¬íL'É«‰'Nœ8qâĉ'Nü“ l¡;™óIYåßÀ 6÷FfªDOÞßDRv˜WQ‰Ù"n«˜ ݘ l•Íé1ß|ß?If}Uœ°ì [ûp$SâøŸ@ÿ @ÄI4ÛÕ~ÔµÉ22ý$v¾K¸˜Ž LXxžcã$ý„Ú¶3ƒÖúÀÎRx#¼Œ¡0ø€ä¿¼á{Â"bcâš±0Ó°î(QÌ·d1Ê ”˜Gö5ºXqi€Iâèb>8jPGT$'X¢ Õ@\êä…ÁšL­1*]zScrwÞ²1Ð"¦·ö»UÕnTàäBFØ¥˜‹ú?ß ²L ðZ9ô¼GQ¹hýg$û»Ûu™«’gŒ*Ýéí€îtÐÊ?ÝÁØÆZÓÞ’“'kÛÇ»s!)ÜHy6þík«yß“cϼ¯Õø³I?°ÿÕï=¨Üƒ[û{â5äVˆ¸Â¸H¹óÌL­ÍÓÞÑÿ„w¬üRmDš3ëÍŒ„Ùá¦jïhÐG<Û‘&/¤<û…Äl’B!“wxçAKHª>ÃÊÃ´Š’®}FÛ³²úâ.bOªº4äWØ·j{žhÉ­—f`]U)ô¬:Áâº.fæëz¹†5Um-Ãîñ37];{§ ð¤¶u—ìŸë'ºšÿr;!Ù?½™ ·úB‹cn™`ÙTYâ¹…O³×ëÕ‰5[`fÑbÆ™&z„ØŽC˜¨çïw-¢ØŽí/%QbÊ‚ÿ.Ô—Š|)EÖ:àÿ‰'Nœ8qâĉ'þ•q/[ÜS¼ cñ½Ç>>Òóy„ÐuƒžzgKŽèVh*xªV“84–@Û‰oÐRhw*]úiòÈâ-¨"Ýfˆrâraûèp%¢Â`Ê\Ô9\$¡$V’»àöÛT%¾ Á]%ˆïrR×ìÉñwσ o¡*¼L`êã;S¾c?-s²ìÅdP¼NÞYM`¡òD]qykTdÉÛÌC«4#{ä:s)ˆTg2“QêòÄÃêœÿÛ/õ“˜W'ê>P"¶ìÑ Œ‘aÀ|Р,ø{!Ÿ×©|_¾}Éñ÷ ù1:JiÖ,+ ¿†Åôá¡%3[iE-×Ü«Eç7·þNr§òu NqcwŒ îÇv{_/§·éÿnÑŸ=¡þåŸçÝýçSú{‹^õyWä\ò›É_n=é?2Ý3`õºîÂÉW`Òq;V1–N€¤ç;X[ZÔ»OÒâ·'›ÕÁ½j÷)íñ¿%Z¬Ùƒˆ„I-gzuÚ@DOpë¯›É J’÷Æþ {b£{éZÕ…ª6¢+ßB™ô,*â…Bt¥Ž£½ßï¬ÒCUÛg87,Fkbþ&UØM«ñ—^–XÚÀiŒ;-ï@0HYóÇ©þ€ ÁW5U)éjX² JáÄÌÅéZœA!âÚõ›êäÅÚÛ´œ8qâĉ'Nœ8qâÄ¿4&?}“z»ÿ)„ ÙLç_.¹hø'DhrnüÑ®5Á <­èÿ§ÈTÆÈ¶01æ¯Ìgžµµð“ÌR¤“ë^ÅÈÖ Žä*-™ÑœR½uQï×ÃíÙØhw†[¹büºÇÜ!•NHWYfÒ”ïœÅ§„I¸„€Üªa”ep“ùêjB½¨*X­¦ñ5ež½ ò–þÉŠüUl€vYáñß\x‘í:Ç‘R x’Âx« ô«‹%/¼TŸE:4ßï,fOàzïýv®rïYÍ‚ö4Ûb` êÉÿÍï¸=äÿhÛ2ÐU‚è¿äæãm>þD:ªe!ë0øU½V„·–¿4¡ÿ«\›p“VÿÒŽ¤–7áï~º;íGßøú¿äé¹í±ß¯O™¹¥ÜöÈ— ÝýŹ»¸¶&‘}b 24?ÕÄ›i‘jyôÁu†DÅ LO 7ÛXsè-Ó±ëôOïøµFf:aµÉ]qÄÝÀ¸?ÐÄa¬JAªµo’J#÷ö-޳å€Õ‘¹Ô|rQÕÖ 8'/b`OíUóA¦deq"b BÎÐÏG°O:þæ9¼e‰¦ãב.¾Ê"œ»bÝ\ÆyT0®‡)‘H#U¦‹ËàRõ?Þx ûÖç… ­í·›öy3¾®kû+Õ‰'Nœ8qâĉ'Nü³ËmPäÞ†g±šUˆYŸ!²{Tfûëë1°*þßb8º‘¢gñŠ]} Þ”lÍ2›/¯­·'"%âšÖÿ” ’¥0í• BYPθNš6½ ‚‡î1™„€s;þøG5˜6iŽ<Ò„áR*=ãÞV <<šÑªêÊ›)‘ßáJ/uV@6–ÔÛYÝ!þÔ¼íÂPÝ˼»(†M…Ä~¯M¡˜‰kè æº¹4ŠÁõ°£ØI$©×Ä€I€eqmü£5kÞ5—±Q]`ÌÿÍïoVâlË̉Ëù' ¤4;w »û§Ðÿ8±’Û_] °²Œñ ýÓ®äH üÁ–|Õc>(¿>Ú¢?b}ú{I¨¿,‹Ww®ÈŸÐ×NËûI½ ¢æö4Áëà š7F™3¨›•v†‡mÏ£¾w¶Aч™KÏ¢ŒmµÞ©âA`fúÝ!I%)Þ4g&Â`ÂÍP,êÞ-±¯MÞ¹Ò1q43î…{-yq@!Ò$êÿéåŽ'·ñéWi>tïl…šPîiîлµ~àR D¨‰i+I7¹ñãÃ6`=s¾hè5…@3+‚ëb#mD”H†¿2%³£©l°{Á¥÷Œiº³!÷L÷yPu:0q­Šê©th€'Nœ8qâĉ'NüÄ¿¾Ë Õ-°²¤¬TúÉ`TU ý¡(ÐsrnnÍG}E»ûÕ‘¾½Uz*2ØÕ=`BçݦŠO²+°g7 «%=es da±ÈŒ‹Òì%çžwƒ= °Ò4Õ%¾­³bÒ ðÔ]cP’ ÖF3eµ÷ÀCgßÏæÈëˆtI`ÓŒI8hzs±¶¸‡uÔ.ÜMKªÙ÷Ùvx H]L™Ôç€jYÐdksëo!iŽQ¿P1õ³V!~¹ÚºrQ)C¡ÄÊìØº÷Ô5[Ý öuzs@ºOܱ€ê(yö.¸ÝûæRÜn)}E&Ê*ÑWCî¿ôÀ–HÀÿG»Ó\À°Gÿkƒ-RãøiòrEñ]àû›¹ÿŸ~ét}"á;]º±VúÀ-çWÇkB± `}]u V¦Ôþ1ýE(¼ëb!`Q»ã‹CMHÄgS¼Iu¿”BI‡ÆwÖüaÆb™ÐZ ›ô©ô/ˆBÍÙ7ªÀq" I»9RO[Ž»U—±Gš>ýqP€Ž_wî„1ý]QL‰‹ß€Y«š:Öšu7ZüeX醊šÛçJ…ÊÊÐÔæ<ÖáêÐ37=•>X5D⇳[ƒï„œl"H”1¬„’¿ÿ¡“ñø.@ä[¦q.jÞó"æ  uø˜)ܧE4‘jë”r¤ €|Ç? À‰'Nœ8qâĉ'þ­±EDôéØÕëwü* ™Ü4O~“WkOÞÃ1ú)èC;` ÔNðîš¿¼~¥4)CŸ\Óöôà @Œ›“Gê=*𤣠¾_:õ¶Ñ3ÈïøÙ4Cy´/¢b =Ì è@'’ê}aD õÑј¡u2>™÷b'b xv%ÍèùÆÎ7£ÐÎJ!„¨if£z èC’þúæöàÛYÄ%ɬëkr´Ýi¾úh©*put„¹jèO¾ãÍät9M´°;–1Ç‚Mé@¼Ð”ø?ñ7»¢–O,7„Aج&lŠ3¼‚k1ÊÝ.õ&‹›$ýåà˜õœéŽO ºQüÿžìOÌ´»ÝxÚܹ~ºï ½/­xjä§ÞéOóâ³gÙ»£è»Nz3=¦>ü»+tOßI¸\ %g­ïÎíTSË'çƒz¯”Ÿnt]´ƒÃªæ¾m”ª ˆ(DÆñ!´"(ÐQls6«_û¼5Jö®[Ï<ù÷vA¢qnmÊ÷Üo-òoḃ: Œ…¸ÊªJpç­ýÙØ¢ùýÌF•’Y¥&}žá­ŠÅ(:dRUz`29‘Ä‹œUíõéñ$‰ZUºÜ lü~î=ãF7ØšWå–Çn B[¬2ülOfQбIÐEý ü­ö'Nœ8qâĉ'Nœ8ñWn`#‡6t9j댜H§ÁU¿Çw°Gذ»dþ觉YkVòÔ¦Þ}S"°­„H]:iÖ?ôÈG¾ÄŸO+äê.™¨ÈDSøžªˆß€WÔÞëîJÐáv;!Ib¾€€¦YÔêØóî¶ÒP ø~ÜNù–ÎÓht8†ºn謭…ÀGåÿE e4qï›]?Bòo T9'1'€žá¯f í•Xt„VëŽH~ ˜«c-ƒlˆìõ‰MHd(©ŽA)~³YÜè‚Ì ÷;BþgðéN ¦l…¸åaïÛÌzìí‚ï>Ý/ØQÊàÎÏH’>¹lËdÀëzÖÚÞà8 ³Ñtš]þxñÍÄÿÕøåýþù¦¿o¶¸ÏýXOwgQú»!ÂAhÞ¹u­º+–=yº:jÊ÷#ØE~âàìœm§'c/†J™ ®"Í·ÀåéZ-ö&é!)L—©ü3gT}b5”TT È0I×(¹›_®&’€š*×ÔøhmôÞ¥ÒÌ·"Œcò 3ò-=Ø g—fç6øbþrP¾Ñr…0z©r‚ò["@P¯¸je@>ä¡&’@<[?íÕ˜d”‚:˜zŒJ¥Bà²;Å>ˆ5æD­J£¢òñë( !®• ѽÖl6ž¦W-2 ”Ø"RàbNev»¿Nœ8qâĉ'Nœ8qâ_+R"@¿[¡£;9 7HÍô[’}WÐÿcW€t–7ÉÈw'ùüxº3ö\²¡?òøÐ¦˜Šñ/ÝÉ ÷Ç›v®59›’slþ––)‚ð$HÆX4ñ;…˜~_`ž¥ã˜Ü3BE4Z7=”aôŒ5§3(­ÌMrÓ}cŽx;”ŒQ$Œôý7Â¥J@EÁHèç\²‚—Ôá(ÊNØQ°‚Y¥y›/ äͤ‡ò òUmÔÈ~†«Þp‰4—el׬v”&F¢îI}UþþÃ4ÿÝßèü¬YíUö§ãþ©ñinlѼi înæ®…·¹ÿªRÍÃ'‡ãúÿ öõÐWíZOõaïž_Ÿþ‡–§Ý.¿+^S3çÄí¹CÁ‰9—m†ø´ÙÅi_a–[#*ò‰Â ˜Áîì(sëûN­?Ð%‚`0d½#ÐjZ=¢Ú1÷¢žï5*Ôñ@¡IkæÑ=˜¦0·Þ+ ëÓзIvÇ;…A IDATÇãÓQv§ÉNaJáïTŠHó'öÚù!¬ã5)Ýø3ÓârÌÌHîÐY‘??ðLÎhÛ3KaÛ]t¯>¤kíYèS•'1C€€´ ©}Rtÿû GÏôÿQµ`s^|Ö}±µØÇݘ ³ ¤öŽþω'Nœ8qâĉ'þýñ€‹ì`Êm­B«²<îàžç ÑŒ©æŒµÔx}F‘žNº•jY¡ö@'\êÛ|À¶ïv·ú!+ð‹Ž›ù¦ ööHì¦P}Ó…‘+ àRQIU“uÁv|«äQ©®Cú”«+†PRq)zHßÌU&‡Y0“Ç –'î<¿7d€ºK­ªdùõnL+Œ)Ä«ƒ×i·,&ø‰]€c³Jº6ŽŠÞˆª¯¯Áz[Q¬½˜ÛÎaRï±–½®K€æÔÅ2Î|Gï(7KX);½Í‡u͇%*ê†ÀHÒ{îv”„bFMBeÏVér-„¨–Ö2_µnߘîYcç”Ñÿÿ‰'Nœ8qâĉ'Nü›ãÎÈIât‹­kÅ]µ ™“·f:O9g‚³¾õ#kÂ}ô/ø6KxßXYÝåçLQ(Ï=°aE’.­V±Sî“ÞJéýûøZÓM˧×êÎ}$Ar Þ›MOÓ.“L“ŽyÆ7Õ•§¹¢Ò \©µœ²×y8Œ‚ÒA9”ê³ÅIb-ØÔJeŽ7Ê&¼$üìDìéþ`~ÈZ1~ªÌVR.jÓ»µÖD¢}’©õ˜Ò”íƒpâĉ'Nœ8qâĉÿ™¸q v¢{O_Ñpý¢wº#§þæx­ÓÃàÎÀˆ/€®k|Ó¯h,Á’ëß_Ý€çŒ)3Ç‘¢jÈ8¹·¦ìfflӄ̒ÀtuLˆŸ¹ë¯÷"€µ‰øº²yoë9þ&¬ohu ;âHÿ÷õXAyqO`߉ÂÏ@øÞ$èá0pÖK’$8·@áw€Z}WR^êÌ¡Èú­×u '¿kJêCì½—›=™ñ®;ÉP˜ÕÖZœðå$M.ÇùZ¸Y»+çÄÌÈâ}½ÐM›ˆŠ–š’ºðºè»Eòù),ºf×uuÀF?| nÛLIzïĉ'Nœ8qâĉ'þ÷b‡ÿNªÛ‚É©½#_{§ô_¢`-´ êåñ=¼grj^|’ãŸ?Ý‚•·_Ç Þ„¥s´$ Õê0<¾%õsMF¾)k^ت ’~žж>-òLÛ[µŒz2ìþHG2 ¦ÒHT/bÓ÷Õøè11|¶© › “%é§j€mi‘5£í1çiË*aÔ@Ø`iÏI§.hy¡DòQ˜' ¶Úéc&X&.|ÅÚ?Mß?{)Ãë'BËL$pM$½CHVÀý­A‚¿vͨJd—+R?uÝ»\~«¸7•åÛVmÏœQì ÖÏbÔT¨ÍêÞ8Wï£[6åÆÈx1ÞìäÙófâoêsßÞ>(ôÉùWÿÒ÷„ø‚Õã¾î¾h)5{lCº!yt䦩ƒñôšßýÐŽC`2A4©¿PwCý¦ŸÉHƒÍc@˜ßï43;1d|DD…Áû×ûÚÿ) ª¢¢ª¢M\Ž—…–pꀜy…Ô'KÞ,ÓŸq| ™šJ½DŠyvlvz¢ó¼^—“âPûWkfl¬I9ç#Z½Š5Uó^ ñŸm^|‘ëòz;IòI¬O®¾–z)X\TDÚ×WsÀ]%Òv™9ŠÌa¤ê ¦ €˜çn¼X|,‹*…pÖ‰'Nœ8qâĉ'NüÏÅ”4½ýeT_oÐÉé¨IhëðüÓuŸmï/Vņñ£Oõ=pÞ9+ù²šR¿‰>ËšßÂT7áÞ]Ywù§“ómRp4Ë UvGæ°øÃÉwõ;[×~pÜ *1†Â»fb ÿ EJ¸VšHB¯\âM­eiB…Aéé€kÿoINšgsó]ï N}RA²jh{h%Ñ´ª£šAy¾?ûOüzÃá–¿ÃÎÓÜ:#ýUòý?/‚ L ÐÓÚ¹Å÷ˆ‡îfÝÛæ=aÙ54Xû¿ˆÿ<äòÇ=^}%KÖ“¯&ØuTÄoo9 ô`6€Oñï{N}ðûk€ÿAÞ¿¯¬ÊB ¾¯›mMHwñ–™3ð#ÿ&‹|ÕbŸaLdâ0¶‡©(]Äñ­,1”j©¨4I$VT ÿ!m? uÕþj °ª¹ºêìŽíŸM{'!â„ û£ä)}~í:ª¦»ÉT Œ‚ýST!Âî(†vòÖZˆ8Ù #¢Ø‚æí ÊÄŒô–Õ›-…C8ȋ旞`ýLÞ¤Û¤õ‘Ð7¤¡“ï.ž´§ï’wfÕÛÆx©êÅæ*1.²H¼9¦ßñúÖZ0[ËÄë| u¶C$¼å‡¤›oŒ½Êäĉ'Nœ8qâĉ'þ‡#Ð+€>I{×£èØEwv¾ß+H©Yº;yîÚ|wö‡¼æ@œÞyP#™(Ÿ¤”aù/-=®³T2À=õ»²Þ\%a‰KŠùë9'v,ä 媅~¤#ÇÅSf½èøaÞët3³h*GHº7#¹/ýŸBÔÛ‡1ZxERU FN3s¼©C™]WÁi²„’L+ñ˜^MoÁ^ã¾p©K ÄLÒ: Ƭ°„ÍFq’@FÀ8IV¾ÀRס·«”è{>x§„Ó{ê]‚ùƒuÁZå³~1¾˜„ Jèówò7µ(Ëh›øs;ô¿®÷Mâ?æ¡Êmج«é^ð“ÁúÖ§6>ó|þ9ô¯÷›á?(^äÈuØØzó Fß]&¨÷^1ú ˜Æ |<´¢¤ª_–ÌN=õ~\ˆ”—´ñáš8¶ €|\랯 ¶í]HT44ð"…ª6éôøå6=O“ÈáiÈ‚÷ûùýׄ5ç|ó­0%¬¼‰˜»n¯ØX\vE…䎟:íî¢+[³~=€rÍ»«‡ °ç¥äMÜÍ}³ÇÃ:•/(‘“±‰\§‹šƒCðXÌÌ¢Åi ‰pa‰ìÁׇu|dg F¯6´GËŠÕg3™'Nœ8qâĉ'Nœø×ÇŠ)ëdßâN;l¼o½ß…?1 ¬Ó[ÿaz+:”9oòšWƒÐ­ ú…ðc³Ð¬à;kÐ;A|¥®??ëu>yÇt-­PÑÖbKf$c€ÒW<䀘]Ö&°Tt! ò<÷ãOYü©þ@•p‘¶E­bªSáq-P?ØÍ1ñy8¬%ýu(ý»ÿåÈèOÁî÷²“ÇuÝ­–Hï¸(û/› ?uëINã5p'NµÞ<ð(øç¸r”JO‡'(e7fÛC;VàÏîOèÿªC• zò¼¥Æ1 ½Y×Oè…ÝgHÿI?ó>LcÚŒEt·ÑÝ`qš…£ð¸›|ßÿ† ÊDÿ?y|<_„~Ö¶Žèÿ/z‹Èc–z¤5òÊs¶õ0ðM™ÝPòŒJW Ýq.1OÙPé2ì˜èZOË ·ÿ^^¨‹ä5lL²ü=€‹µ ‰höp)äìM0HÖi,¢Ìêα„š¼¨^ªÌ!JHMzÀHϯýßß$"é–>LdRB¯€¿û_3ÚDRÛЖS¥~5r]¦;‚*©nÃy>L#Û•Æî=öš[”\Ë<É^S Šˆd|¤ó+Á°û èºA¤>—\ùë½ìä@/¤PmM­¬E]WÊš¡öÂ`JBÄêæª¶‚øü"8qâĉ'Nœ8qâÄÿx`þ>é§/Êú?Û¿-ØeAù*^³e$>¼õÇÔà;èÿ“³Ý)“L û['ÞŸƒYkÅÀN,hV¶y>çÝ<Ù B=Håä÷x6C2ïš ˆˆ‰5eåϹIp)õy$ï'‘}]Ú)–ܘ\‹“à,ÂH¨؇À§¨<( ìPãY:Ó™¬¦eÀ¼#Q®‹RfaÆf¥¿ð’ %9é™îÔÙíIlY¢xS\ªxfnà²/¬´åÍÏp5?ÌÙpƒ2;Ò[«MîôÊ-àåÌ«sÀÆôñùgÞÌýˆl´žæa’E*ÊuˆþŒ>?–5#ôßZ„ꘛerRë¯2÷ígëPÈ"hñÂy¥îL`ø­^ñƒ Ù‡ —ƒ4uëÆ±”ûÌgT=}3åëÍæx@J•ÇJÒårÆlÑê: ™)ʼLs÷•%X5ùÓNŽÊÄß´¸e£‚Õæ0FYÓZBûñÁwaCè·3«‘!qÜ€w>—Œÿ<¹’í+ÌJó-s¯<³Óüq‚{¼1Ep—ÑÛç£öÊ?S°õh> Ù«ÿ»õ· œ{âÞǹ"žnôÆÉ¹<ì~S! ¯ÿé;Õišd jó2¼ˆí:àU,ÍMTÍ›ûÞ%Çu8`•W:=JœMô^ží'ütãñc¿_€þO%•Zœ7†’ ßúÎ ã¨YùW³~LÉ@§ÍÙ¿Kƒºäòù³6pÐjts&ˆ›‰®ªþ)‰¤¿ä-ëÖš ŽKG‹ª;/¶Œ Ê¡Dw«nŠz'ÙŸor–T4îÇÓ½“L)½GŠ?ŸÇº"§,ýæEÞõõ<²®™AýßÿÞ•ÇêQmqgú^DjÒ½ˆ€Úe÷é) Á;‰¼í»~íaÉèOÐþD]'ˆÖx{®Û(ÑZžTÓØ½ÜsPu„@ @à?Wi—)ýç³:þn©é*^²HíeûŠºèŽ`ŒìnK£oè]üà×Ã]Ž­,‰Òæ»o¿gÃW…rÌ'6”&ÎBUðf–­åû¿sú?RK+ûMvØÖ–ÝnÏ_£§üSè‹ÿHúÖÁüÞúK½] ´ß—ý‘/­Å„ôBzCå-J…àý~—¼è¾t—×& “Iáî,ÝX¸ì‚ãÀ5gÚ‡…í¥4CÔ0GÜ2ùÝ“ûú9Ûdzµj¦QzHŠQ6h¿æ›É»û+aKËòh•÷]*h“X3ù»–J'ͺ”Û>©ÔÜo ^ée…z`Ã}Õºí.–6çaêwZÛüz½´úÀÄ3sŠ<ׇ"W$B2§öO©÷¹{µÚ¿ù–·¤‘þÎzxSî¿oÕ*7OŒÝ²*¦§,úÃ’uÜÓôο½k…ÇyX®É+¨þ$´˜NyÞQ@ @à¿sÒå*ÚcDÆ]æÄý„HWAq.·žëÂÈwª XïhC)óÆ+—¶I̯_PãÕíSU¤EÆÀª/dÅß[ft#Ló«€–5ßíç¾r•Xv7îÆ3|ÆY¶w½’u+“ #ÿËe ù¢jAœÐE‡dŠcÙvÛá¨,­V"•‘æwaØŠž~q hQ„ÔL ò¯U…_9Ü~-AÈÔ¢G±ñ‹>-Þ©Ìbu0«È¥ž›E¶–"»ÝæRx¤Lðd3áJ¡¨Uɦ¬}4šC4¿ê å^U"AðšS]fޏ‘]žÅ¾ÍH®|Þ¨pkg#ûu<ÜäÌW®»nÜÔpÆÍagŠÿo?‰n³ð ½Î¢g¿)¾Þo%ŒL9D_#í+>KÛ6 Y,|m²vÙ]5sÇ]2¨Ò©–GN5¾~Ž*j¯w‡O¤ˆˆ©• ©–8b“?*Œ|¡|ì:EM`/çÊ«”¦JÕ†æÀ`¶œõúЬ7™P­²@Ždéú®QÓ5|¤µ² ú· 1gõqJ¢o1›fö;´ÜHÙâ|˯ڤÍh»ä»ðÿ=Ö‚Ñažä ÎÔ?“ï[ùÂÜQëZϳ6¾©ùcââM``×Ezm7ûnSáGx9¹TG»‰.øS+ÀÚŸÕH wQ ¨”¤Ìª“CrRdZ}´«¿.L?$˜Å7ÄÆ`òX·fëSý0­÷³äÖh,¼›¥¤QØoÞ¨¡9•ªÌÜôy¨Ìb õS¯åĆƬ‡73Ù=Ñ‘êÒ4 à”’\.LÇHóð¸ôCÙrqƒö*Oõ¾WüôÐû÷žì¾y2ýŽùþ+¾ÞoÊK…)B!h¢° ©Ð)Í_êùH´ü}U£q£Í—•zgÛTû²£Ó2>â¨í—© p´T!U5 r‰C— ²›¡Ú•SnOy%a2ŠIr†Fîö¼£çã¹cUU’€xáÕû?¥´ôMŸ‡,²þk=I}±ÁVkAœñ®ì“²¦åC˜·g m €·‘*ª‡ä6K@I÷ï;š¿ÚÞ‰E:ÍÚ,çàŠ?n¬‹ÕI@šÒ+– ò–·h”@ ÿ6Yý<}bÍÑÞjqñà]eç{úü¯}‹“Æú|iz ø6 þ®³Á=÷¾€ ž“’ÓH` ÝLy߬Ù{MtwÍ5Æ»¾lŒ{/S `J6¿S@0k H¹/{D $˜ú€®ËÏîý;/‚Ê{p¸/dz²Þãj/•R ;µøQN>â®Â—h)›S¿¹ÎÕKSfU%ÊÍ›mu7)êX´“ŽÙâçé#¥o-4'´ðoR·ÃnMŸéMl<[_ŽÜÿ™“A©Ïï¢}pá©uɉÈn5¶šáW7!r?Œ<8óù±ò;ƾƠ—/o5âé‰ö#I MOÔÉ™ßÅnçôa›<ªh5Iúµ‘º¤W§åò´Ö5þAJ/R©¯Rs´BZµ_kF.Í*±«>^tÞœk¨Íö€CÚl¤ë°aHp·\¼ˆx¥”N&Ìž:ÿÐçæêÜ[ú°õ3ÌSǺ@·cš%@¨ ùE_ýSÁÁZb¢%4âªvk.#·7Z§­]©|s ‚L%}˜ÚôÍï%ø÷“‹Mš1²ŸÂ›¥Š&þæ@ ÿQøRëwùŸƒ¶¿È ºîKöó¢æ`û¥õ$Hch)XQÞñü¿ò‹àÎòWä‚Ôv=ZÝí iþj{fwO¾k×2F¸-¡®ëÃp)8 ?$»ÑÚU6È¢5Dn‡Öa™½‰goUl ÜQQÚï‘å¶\¤ÏäµÓà( 7Ub£]3Ø`‘Êo5Ãg5ôéb}FüŽRS;㬹´¡õû¼½d¢ío–°Ñ™.´Æ!° Ì^ü‡Æ6Z¤H×ßù¯÷’â—¸”+^]HxxkpÏþ;c©ùã6Ò-¸,˜ú†òðÙ³æêØÇì¿xëGþˆ"€¯¬ûÌÐYc¿h¹ˆB‘Æ¢˜Ã{ÍüŽDí’__k €´·NŽ×>#ðJ™»‡ÓN•·ªRX±ðÑ””ZyZ6OÞâ>¢’c§6Û»IÚ¹¨\º‘Ù°%MÀn3ß_Vª¨±\°gƒ(U-‹ì׿6سÑÇ*?—yžv;Uæ»LûBY¤x&O…Lzgß‚ìÒÐ@áÝU½züæ{y¥¤cÜHD”0fÂ4» h“îÉ¥aÈR›.à(¸”¹ŒªV"‚WÊÃM­¥zU%AyårIšãMÁÿ@ ÿ,¦d|×"x÷ëæK$½S¼`Ãû9’=ž´ÌNžtÉ GU÷ÊÎÚÆvÍžžîde½¯¿ÉŽVÀNÀÀôCc;‹S™Ü"¡S»+½¤¨·s{ïgŸƒsï]† ÖÛ™‚+²Iëî*CÕ6ý-™ôЇ0OQu¼…”½|“MÕ%uS›Òl–Õ4WŒ„ÔMJ×) ðô Ü ²+Ú¦åÎZ\FX͇Ñï—Ža¯GÓ[= Zµ±–}:êáÌéðwRþw\¹™r'³_»Ñ ækYÿd¹¿jnåûWùçÄþ?Ôÿ¹q©ÇDŸ¶ü·ÂW »–„ö®HcÏ–u¾ ¡”¬üœEÞÇ“â|IqÏ{Vâ{®`NêÎi×@[¯¾Ê%£ïÒОڇÙÝøN[_Œvÿ0ú-ú|ŦöÂ'”Ñ# –’ͳ¬Y¼žZ8Êš?G5¦ùh‡³tå¨ÿ㮄õެÊ?ŒŠ×°¸7Lus÷©]CÊ9¯_†N·Îã»íá¶„.-víqÚEw̾sæÉ"劬÷ÁÒàÆñÃB»„û¦ø<ÐôÁO=ȸ¬œß_¹…™•ÆA•³ñ¯Øi¹ù•6†š5´VHá×ë(»™4ÉÎH l¶œwŽ…vù*’ÀyQ´¥´“ HÆ;* йþ¨…%À\¶e$pºG€¡ý”ùv„þäË’7‹¹B“‘©¿-ÎǃÍïvYú[•¾3i.RíkäB¸;ÕæiZI9h¡ªHh‘”5ÓBJæ-RñB…€$ÁÛDîŠ=M°<νÇpSæ°{òöàŒPõ®U(Ía‡Tê[õÿz“@@ @ `¿xš0€—{|ΚçÑM Kw`OÏäØW£a‡ Ç­¬ÙUÈ=3-ù\ÅèºÅ»·\ëW{°ë@`í¢®`ýR¥F…úBµ r\Fù—A ¤/ý↕§vüuoôØ/q£#>U²!ñ‡áýÅ"ޤh„è9±O2‹EcÑÌ}&Ö¾¯¯™_ÖêNgšT—wWDw¦Ò^½š!ìRãO ƒ°¦ss=ŸÊ[ŽÇ›áûlݳÔúÎ@™†ûr'ñßdýó˜û¿œr%t¹·ÿÔ“åFîÿ=¿þ0|-·R&DIìfŸë a ~ëZîý§ÙôH÷…£O'¸Uµñì5%¼Àî†áäŒÛ½†¢Ê”F£Ý‘tgeœ_)Ù¿<Šž†}³_& u•Z‹Ç].@hÏY'™÷¹ú[ã³+‡lTkZ:ºã 0\z¬PÛeÜKgÜÙ“çë5½ðùð‡ˆ½Åó)1­j–Â@™-"ò澜¶¢O ¥©Ut>Wš®"‚<Šß½¥RŽ1‹ÕMäc[ $¥*¥/PTrI‚èûýn¶ÕïwØ@ Àú={ßÍ‘Gç ecú+5™gÇù̆+:}›Ë<ÄžŠœs”ÇàË_Ý&ɯr>ÜÉOÉÈK:&¦.’ ÉÉh5Ô¡í;ŒÁ‰v¡Iá}¤0\Öþ”®î sJŽ ®kÂ|£¿iþ³Cï4Ì<¾¿ˆ0Ê/c4 æ¼<¬ +#:Ô˜ˆ5 ÞéDÝê瑪nô4ÆEALiôîþ”ß\ߤªÛϨIÀNgöž”ïkâ_xüŽŠDmžg™¬»—†?ƒÎí¿cç{2º¼ý‹ ùV6{8N ŽÞ“ç“Ç–Ûøß=*ðedÙ¬úÌn¡0ûШÓXö¹}»·eÂËn'LzôrÐ…ŸikKqv5’}ƒ{íP³Ùz®êa‹n¨kÅT³fFuj é˜õÖ¦gGk\‰©$!ßùS À½yîIñæ£&—šƒ:zdrým!ÉѦ ï¾ås ‡.°H% q²ßT“ ×ϼ½i5j.3gLº}/,JA>Ãècœoj ÏÛÛŸc*X»ˆ ‘ªªoÕ¤"òøÃ@ @ ðk€E e#>¼è%pâÁ±GBçNîÿÝR€8~A·Jî2úƱŠèʇ¸ášð{ ´Ûák þܹQxoM*:»ËnÂ6\sÓ'àÀ_O ï;‘£È¹£©ê‚WúT ô’ˆÁÕ¸3ÁërC»ÌNÑ\bR“„!ιëL¬wêÄÉ”Çýåö%K€pvš*0Þòlû!\j°›ºß ýÇwW%þaª”QK@`b]‚{—¶až{wÑ}M÷¡”Köÿ™o/w1€‡O\ìñ²„•?ylÉ>bý[ã‹JyÍZü2J£÷G!˜„%[ŒK°ŒŠ@ySEÝgÆ¥]‚ªº:ØEÏÀ¡Fº¤L ÀD1µ¥´Ûû1•õTedñÔ¨†¯GF^ÐÙfÖªn~o5™ä»“ 'ìæÆ³JÒšæ?1ïD{®Ú?ø«@ ¤r”T”V·Æ*cƒ'õ‚UI© Éñ”#O±ÀVQwj›×èo©§)Ó"»·ÖöÛ¥fθÔX…« à›šTSJ镾DU#@ +kÃ…F9'¿ßà¾q÷À岡uÎj<ë÷÷ù‡öqÊóÞÖ¢¾Å%¹Õ/÷;JžôÂ?Q˜rf±?`cܨwè½N°¼äM~ñÈÿf±æÙ¥·Eê1hò\ÄD‘Ø[oá–£Ÿje¦7¬7ÀZŸSuîÜ0Ì;,y”™,.×;õáJ ?«˜.+ÝKÀ_Çhæ¢Ëçiø4Ï,Í™p~øaÈú?{#ÇÌš?¼¼—¦øHíiG{°œ¶ÊãÂy:d<§Ü¹Oú¯à‹9?Z4§À!˜yâi&¾Ò«Öc×,o`ôÅ€¤TÈk± ß”FŸ¶’œ³Ky»¨JV•A"G½ýÍÜÎÅ9¬Æwz½æüt2+I'š«¬5Aiÿ7ÞoýwèÌÕ›CÔ±vT9§áÏ+×ì÷À¸UäãUÚ†.W¯^ˆžùAÏÍ—ÔÅwú“¦eöÏw”òí+›î–¼o)èÝ )U*-‚ű€C»{1¿8/uÏG¼I™@½;¥¼ßúJšRBz%†p @ 옘½BºÈ’ïkÀi +Q³#̇Wá|ÓõÙ¥Ïéò5k|òÙ݈Séeì¢ó+î-ð‡”Ërßr,bØzWÚ5Ÿ ͸?3ŽzZÕ‰ê>xK)³¢ÑIHlŠ{ýÍw¹À…mì2ßziBm¼øD߀”£FÐôÊ3 eÜ>€WÆ 7Îv3·ÝÜéÒËÜ8Òín¸Ù{9¬ÞMüPñÿnK¶]ñ¤rŸlKÏ7lïW÷1óHU&Ô˜Ó6Ê“f}6Š˜4îÏýÉÔRŸ…T +ê¶|gãuí0ϪˆKÿ¹ê³ÏbY™öή¯cF¶«w_rµsˆ@!òIU ˆõ0é’ñMf ¯ôRUÁEÌ8ŸÊÚ· S`$I’DsbüfÉU>½o¯%Ùÿjµ{s“‹öYù¥Û¹ùÆR^ª(§ƒ6ž5V¤äÔ6Ê›M¨Æ TM£pÚa†èûøüÈrRT:FòvW¼g¬±€Ó¯2‹)ex@ À‡‹ÿ-6²Ëœ_XÙòÇEëç'é»™òž³9ö ‡5 Ñp30zAÜè]&Å»ìÕ®[n¾õ¨J†89´Äå×Ζ \Fs¹»¦ äX8Ê…,ŽÜ„,iàÓcŒ<å±oD„üÂ(a TË^ç³Ö)Ôd¦Îë ]Èžær·6Ç_L¼ëRvÉvþ}ßæg[Íó{9[ô‚ý¿ˆ"¤š‡»÷=W'|/ñÿ'†ã޳ÀÕ–µÙ¥>ܹáí±n¨ù·—ªÜ4Ù­Æø5çPsd™›tOB?}p£á–¿µ€õ(¯¯Ìþàü]¼±Ú$ß5/=sÙ0¬ý@Z·ð« ¿ŠBís" xÓÙûWòžµaóôuN"¦¢¢IÙóÛLsO°v;¯‚r[ªYm?¥”åUÂ=’1.l´íçíPºE½þš@á6²ÇcÒâpîæ,ÜgÃè¬PoŠj—•{SåÿÞúJÈ‹*þ@ pâ_È\7qœ›lÎN>]2Iðê >)7X¾ª;¯L ßt¨ÔN•\ÑÇkãÀ ³þÅŒB9íØ¶³ª LÀàÒ‘Ó= ‡Ô»õ†Ã“#"2»LA«HÓ9-}Uº/xàL³ýp‚ØÖ ¸”[neî ÍU:Pìˆ dHi†:CY¼‚S­ z‹7Ãn)΋¯ a_;ˆ3.î¿wÖžd⻋Óåm—:u6ÇË5ÒÿÌþãèNŒ·ž–þ=“s·ìLS®xöyÜHñ“«uùŸ/ÃSü²]ü–i­CÏ!ÄPRµÙiµÝ×’µö‡g×ßÂAs̲¯N´ H’ÊáÕ‘5ÿj/àSÿ’jç…ú~ ™R‘ª6öQ†jñ*/? b &ŠÆPi<[„ Iä@óc©o î¾RkÄjWôöc-zX¬Ú 1[+·ò‹bÌ.q߃)%øÁán¹` ©J@‘vE~ËÛ“ûë'¥³o1v>æo ¤üáVµPû[{D§­ì¦ƒU9*2‰©'€é[´ˆ9 y¯ŠrƒŠbô+@ ÀMÚÆU÷wu™oð>ôÎzáï{¸ õ™ g‚u,rJh–P½4à•:nôl·,®_½e”*Z?e“]s†)hq¸“£f·zä;—83ž;–yR§YSËç3$ØÏ1œ«þ·lV½ùáBÜ/ )›=ÝŽm û¨’Իȡ–Ÿ‹ñas3®ß0Y­öÃ2‚[0²=ÿøÞƒC¨À<ÎÞãŸû­ýpÙž³àî¬\çl%“ø¼²Ü«?¶ü•òÏóø.bøqY~,[ýŸ„¯ÒÓÆ˜•Û±îJ5ö•)PTV@«í3þŽ‹¥Ö¦Ÿy"¬•͉Wªý®h¢¤r~K:›Ò98퀔„ÚÌK”HÙE (·É´ÜVãHÀÿ‰@‹ÌÖ² ŒvµÚ­fMmAÝCü‡ã•Nƒý‡]¯áÝ7ØO¾ò†ü!§|#”âjYÌ#•¿²ý ¼Íhl¢½£TQKTŒHñ„5†b‹f~°Db`DÜtõv|£§mîðÈY×­ £CÃèÒ7CÈÞ*à\)’i¸œD¨¸Ÿr\ú¤É˜¤*"da9ÁžÄvû~Jcº©1†Îï,÷µ ¸;ŽÈÌ7CÇ Ù|w£lõBý…qü·jÔäfÖ¿¬96Ýyl•çÑzKñÿÒ!ãÁ6þÍ3í¶ßͺù.è='ðû[þ®øª'4^,Û¶ä&‡‚¾FïÆwší­´Løn;l/§Oõ‰Ð­qí@ g˜O.Õ+×ê·Èzf0!´L «ñ&RR‹a¨V(f´ÍÆvò0n ª5ˆ×‚%½7„gá6¡1-Kc1aê1M}½d1È]b6¹8 M Û˜ÉC`.VhÁ‰>j•C)=)3`C5µ!¶vmZòÆ"e . Ôÿ6éáâf‘Óãªì¯%@•R"„5@òÍ7‹ˆ)ò0q,ë_@ ‡p-‚/™—cÝœÉýŠ;±×tX&¹›ý}Ýúžx*qÿÕ³Ö¤KöWQzk5<‰®Wº–#5u Sœ2V-ìC†Ü©¬µú…éí6f=¦e>´áÈo©ùYö„<¹'zÜ/gÉ œŸ%zÚÙŠblM’ûáÆlár_mÀ0Êò´I8Ç%'SËÏÙOSÒ˜þ:t¯—M‹µáôí–Ïn¬,&ç€!T‡^õÀ;lñ´<ܪŽuu "þ%3xiáCyŸá€Û¤ÿa—ÖÝÜ6‡»³Sá‚­º¾|o?ÿà7+¼•ú¸©¼Úêÿ$|9XXïz3™y/FYR¥ëöpôª5k_ÏÍyIÒ¿-5Þžc጑£?äÈÿËÙ–­á“P@¡E=¦mS-2JjÓ¸‡¸Àt¿#ý_·ß”jn:ËrtPééñÄYTªU<˜þÏ  $ÉFMÒLjîˆQ -Š7²°Å—?&J¹Ã0:xµVJ9I¡Œ§j.¢)-[¿ôƒ–§æÈÿ_ 3²Ù$RÊ…z@‹,êFíjÚÂËJfÅ<Ö@º‹TÕa¶ú­›°ùÓŠ€@ @ ø¹ÿÏsí¹ìÄüqøJw(J¸O-_¼:‘—ï¿àzÐn†9ÙzÌŸ¯;8 ä¬ÇõœÓE›‹€¥¦ï[[R1ÇJ‚Õ™@«a:TøÉ_ÚVè~ö˜ÏNñ ˜+)8‡€QٚɮišWGÏ(ÏÍ%ê`O›š¥¦HZ²ð˵«“éÒËéŠÑQcÓÏ0nÀF©G;ÐêHŽ;‚Œ’F“Èø#ÙxSšàŠÎ?Ó­¿K÷»k˼Åt”»~¿ãP}cKþ. þÄ<e÷qõô¸øäÿ{î=ð;á Ðg“)Yþ0ëÖÜ/ï4óÈ®uC«JS¨¯W¥yÙ¬+òê P|—§î¯±ŠÆþçÆx{‰È&Iyªh >[£áà¦;äÈÛ€Ìùø›É–Ä5û%•ïl Rí $@R™ZÁGKen¸w&UÊŠæQ¼Däý~0†yÝØ™€@ @ ø ;_K ­Zó< ËG±0?¼ü2wÇÁub”&Âþºj¤|òEÒ¥Ò&jz™„Uv©Òn‰€9ë["×IØ»°Ääa0%Z‰I¯&gÖH@Zy„EßF7Á$xæÑâ«?¡ùîÒÕ·²c¼s³†~kê‹ÒÒ 1„:«¾™ð¨t)u+ $óÍçÖTÖx¨J u™ÿ—A§IãÞ¬º.$%n1ÌŒåøùÚna¬Ý÷–»BW~ËVs\fþ‚LƒÔÏåêÝÆèvW¿†|$ûsÿîHm¥ÿñ+èt|Ǧwuyq«‚þ0|Ý}»ÿ.Nuë eÿT ûIáÊåä4tªŠ 1¥W“X¤3Ë–ÙxuÓóÞÈ…+n©ú•‡)çà#ßjšýNh¬ÆNz[³=lmG–ÃÏ{P‚÷(-]ØîMªt’û‡J»7 “¤„¤¢-0Pl (ª|ËÿÉþ½¤”¦R€1_ªâ‘ó”•Ùó`d”®ʵÎÁØ3sΫ`+\ØýÕ•ÃИNQ'J…oMùyS+?h«S&G‚ñÙ…•²,Rh3žnn¨eCéƒß @ À\ÎŽBš8ÍK~OêçLá¦O€=–oðÓÅxï–Ï{!X V]#[÷ÝóyÜäèê^Î=~’|ŸØ©"íLYþÁcÀ+ôÈßæ§qY+\+]ç¡'s_䀌DOcù4”Û³!ÖÈÁÚ’™¯/ šô®©¼eÿ.rÑ^¤²K¢ùíÆlìîÇëÜçØÿœí¯¼ÜÄShÙ1¶·|­¯'¨s¤G÷ßgÿý5†Y±‚^(äjM6‚ë[ìÿ¢¸E{ý5Æg¹ÿüΕ]›ø?žàû–øÀ]þ]˾d‰s8£Ü<\IcöÁÅ"XƵˆbfº1æËK÷é¡»ýºïê@©ÓÆÍÖ6éõ¯£œ¯ü&©oµäû€9OZ6/t2¼lQJ5z[$âõ IU]Èpîh¯”-}]‘ÝýÈõW XK6v‰¤*I ¹A$é…×ä\}ªArEš«Ýg6SN6œ "ÊœüÞ\lÀù»Íw¡µö8^* ¹*3¯†DôMÍnÑ9îÑk¨7Vp.†aJÈõ1!ß%r­$±aó<ŒH@ @ ü°ÿ™Þ74~÷"»+<=éßñ+®[Çàæž¯ß¿Ý¡e6ß?gývZÚ~öN%Z)ÙÆëDýë@Þïw2Tu^Ç.àø|Xƒã(gö¶¨¶PU4'ÂgîÛæÎÃX‘·Ô^aHM¯Wªª3&X²-)¨ FTää‘,«ßâØuoî(Uí΢K}L3šËÚåXNJ)%¾^œ„zZ+ Æ½¸;æé•r¶1 8 DÁf‚\£ Õþ˜º©¾Ç»’îaêà7ƒ˜ j£ ™ïWvׂZ`˜Ý‡_Í¡ SV`£JÖ®YŠÀR Ê0ï—„è<Ûퟳ§Bß(@ oRPû±p©<æ´Õý‘§$ï6m^¯·kÊŸ|›«ÂI=éW.œ]¡WÈÍ¥ž5­kâÿæ+úTraµ€Ò’¼†¦‰Ç«ù`e&Й‰F·5Yc¢‰YŸÚyFIm›ôögê¿0×<®¦Ú2 ç²€œè $ò0o÷cßÉ¡v!õËŸ~s^¦wY¹þû¤ÿ¡¤eºwK Á&¸v§…Ô{§&á†üѹù¡LùU¨êŸaÖÖ}@þhõÿŒ¯î%+Y¥¨®¿^¯ž#_kj²&{Ji¼u“†‹¶»fä+ØÝqí@š$÷,(ÓIÓ1/ZN=­–zÒV"Òš÷RDYRîUUUS^åâeß3òGe/×Þ†J»'$6G—Q7?*ºhN#·ÆK^ÛH—Ý»hÌ@ôçm×<éóSk, pÕ sª}˸uË÷ IDATÏ=`j,$¥“^2‹2I~ØPk‹(TEJÕnÙÜ}¦Ü…¢È)øÉ š©j˜kƒkœÇ´£ÞL÷,PUU!éõJHL@5L† “öb;„²>Æ}b³|´øZ Ó·oŒî¬’w¬Œ@ @ ð-²Æ%èÕ`¶Ÿ;“W¸zw%Ì“箎9ŽÇó*Sõœ¾ºkâÝ€ÆÕí.º³Õõ?µ)S9Ç'YïTht“‰ ˆ “¶Ó2Í’Iùߩ͸¿Òkä¬üd›âG‰z)Dª,ŒKŒ.ú…ÍONK¸ÓÄ™cSr$yžäöã»—é%«õ¡]%étéâ÷ø_Yþü·,^¾¹¯`s#Þãè/4.9ýsõÍómùə֕…ëc¿ËÒs³fñwx™Ó¥!Â3×ßQ»"Ð ²Ãj„j×¹šFRE›“mgr ÆÍc(K”XÆtûipTÛbJT]Z÷‚LX—tp‘wÖ±9>ÚònR•ùóöê¸ÅŽ  U–ù%’ Uê@7wÏÞ|#=Ôk¾v­1@Çò)NêI¶Y%fcÌ{ßï÷$²”r®<™õˆíž½œAHêÇ÷•WyP¤(*I³k¼9¾•ÆêÑ,¢Í]y,:ТO%¢,TRm(@IQP«—E‹ß¨h+,úY–`PjÆÌ$©IÙþ!‡ƒÈ] ¢@ @ ðkàRc<ÚȽ·¼‹¬ß]ÝÚƒ5p7*0•ì\VkÊ)Õš{Ûûuxî†ì:1ú‚žαƒ FÌWZC•Tèº5¨0“.™Ç¥³W¥uФ½ЕAôTÑ0€Q0§äÅ»dº;¯¬¶Ì(±tkBnFuµ¦ï½ä\ºËéÌn»©ë›ü‰¾_ýx×\~÷ÌŸqý..È q íT¾GliÄü‘"ì5šîn”Û•xî¸gœ;>üœ·wËwÎõÛâ«%ƒWò ÍK4¥×Élú“,~Nˆ„1Ë>gê+×@ʸu´¼õʶÖ0c¢xÛ…5¥T"d¶´ÍvÙÌ@A–Ò¤® _tâX3Лޖg ÓŒnû[E¦EiÔJ}CfùE'UýLÍ‹ 2S¨ÒÆ¢í,†ÍEh_DT©ª¶H¬õFSç7šwŽx‘*S’7ßRùYØriÞ]S‡&ÎÓÎf/U­òþ Ð6†÷¶¦”Õš(TÉþÆ©eÛסÌãZ„ž„DB©i#ÙÞšç‡J‹ÅÔÿ Ê@å5"L-Oy¼²Ñ4J(„µTîã6èÿ@ @ øç°ÓØámíž+ ñÈyñ²Û××Ü‚ŒW ½ W'„^¤bw'nc×9ØœdíC7*ó­Ò‰íøð¤4r;ý_1NÅFË­V  Œ–Å@·Nœ¦™l¸Åe¹A“\̪ƒñƒR £³1ž¸÷¢ƒµÊÀû‰³T‚ŒÑ•‡zð7îi¤ïWÿÇù}¿x°º›Ùòvù˵àO9hpúýËß»wä®ñonà÷ü‡ŸÛ4{Ú?ÿ’À—ª ³iæå¥³¡€q/ý=Ää›g‚~؇N(Z×s›ì.ű5Ë e¡öþŠ š-¦?IËvleÎÔª2Ûds ’¢É¡Ço›À!b–õa°Ì‰R¦Ú³ÉUsQB³n'I©dý[#Ôlw%ÑŒ’q¯"E¹ç[ˆ#»ëfÁ Ú-ù¬-<“³ûSÓVʱ÷»è5½=<ÙZ ¡6µuÏvWÉV…¶’ H,ÚbME*­s•RÐPÉ"È• %ÎQ"&¥ ÃX 3w\žÚD $p-e¨>u’‹&Í’I­HA!YCkoR@ _nH7ÅøL7ßÖé•ψo_u½q𖻉çÃañJ&:{Úàþ<âÄ;Yñ®²ë²ë~´ÿ Gئáì« µÜÎ|ð6Z!Ù+ŠL"?—úCä±~Áý`æ²èvßš×ÙöX~l¦ánÔì Yµ¦?”6™dô·™ò8½wE\]±^´JjÓ²ÿ¹%þ#ò}ÝÿÇöÎf.wãOž²ÑúKê¾ØØY)}€i \‘˜V“È)ÒMQ=Ó²’ÊH«R©y‹+IÙ…¶~,Ån8Q 9¾*P*•Ó@Z꿼Re€LÒ} *¬N wY¦”ypÅ(XžBhf²&€ BQw~GÙ²ü”|- ˜ˆïn)ºoå\%Y}ˆ—ŽÛë˘¾ÕÆÅ‹0eo‚bŒÌÁ›Ù\£šÇ6!å´ùZØ-›Q**Çr˜RßCšo@‹vPŠDÑ0®Ã*.‡e–¿Mžâ JÔ4妖NìNÅ)1×d}Š@´”_3ZMŸ)€ª$ª’ãEúʶZK${ë áêo@ @ ü4pâüÕz8ø6¹×qñ3æù#&»»`†|ê“éÆ+\•!9 ÝH矩a,IñÓ»w,d!ƒ%åz†Ã]˘ËïLË’ Ÿ•ŠS=x'$7 8<}ô‰=½Ã’ßà ?¢³HõIt˜3ǦþY‘€•ÛÆÙ?Ä]Ø)Ý™;³é™xÄóžnJîY§Yý KfÜz“;×yÞxnéßR`–VýA•U9*û_?öÚœ¢ÎIø™>nì|–W©Ó¢—ª!§²çZ•·¼×noê6†“¯Q…j'ùà_Ùf™Í¸l‹¨z;€J’RB0¦ó·ÓÚR’Zf}cÛI¯äp©;á°T(g5ùÍ\ïê6ÒÓ÷DZv0@tXZíÁ 4ïS wóÜ›’Ïœ9ëª<=f p¨ÌèJü„ˆ •ˆÂ¬kDzB“±ªGÍ2GÍÓYÿ§ò†J×YšÿÌÕñ'x @ ü‹à={=ñyä]îóDEÝáúñFËìÈ8>aÈ&Å!nÎŒM)ÀÊÝÃkÌ*O„«[›”Þ¯öÞïñ@ÐP(` \Õœõî°/òx˜W~ùã?Iëì[)–ï*rÓò8Øà,ŸiÑœ#fÜò_!t¿Ï'µ¢‹ÑÁv¥\”ðAâ?fyŸkÖéQþcÂ~;™í¸Ý4Þ¾µËÉíñÏÆ×vÈTYRåe RÚÞ×Þ{á€@Õ!Y¼Ed£ZãlÓ·-9[ÅæíFn8Y¶óÂÆJfâù~›-¢»Rõ_TÖ?VºÜ»¢Bl'f¦3«ªÉdçù±’ß.ÿM4§:%L–è¹0 ´³²í¹Žá•’49zÛGõM¹¿œlÜç9{´½Ì 9%—`øŒY5´A‘êyнˆÅ‹-̽ÁÞa%ñ$X5‹„d`Ê+Ä(M¡Ûýp×é&‚@Õ"ˆ4ˆÁF»Ô>üláBv~®ÈC¹G.Vx¿Ù OGš¿JÜ©ÿ@ @ ð/à’ —M»Œdúuî¹µó‰Q"^ö¿¢—ùªø6í.W€]ÄÙ[xÓþÈÑa=ë<vݳÕ¸ÑH³UÀL®`.0(7ƼO(Ò©aG¯Â³ ¾ž@åSÕyº@÷&au X»ßŸT›®Xƒ-k~ú9„F.î`“Ñ\,GùËÝrÜ(ã•Ðüf(/$¹§ÙyŽa|¤Ñ³ŸØOÙÿu¿ãíú‰¥#´|·Éÿmâ?_Ò˜ý¢9o'¢Š¼j4€,k¯Î²,¿µkRu^EÓ´á¸0솈™÷¦]¢AòÍ:Ò4¿P+²ý8=#ß.S£ÌDoS¿Gß×±%ž÷…·ÊÇWÖ8UÞßæþŽy›]Å„ÊsÕ èZML)åöµÞdJkùCSêá–FÁ³ Š©n ©¬ý_ä쪱E”ÃzIóZ ù0¬Î”Ï%úžž4Ë“9 p6Þ†šÚÒ<¤Jµ‰°—˜û5ç0QJÀºèQöÔ±kU5‰è ¢’%¤ºIC®·H)Èÿ@ @ ø÷piá¸RÉXè‹>¾ˆë‰z7Rü®'ñ‡Jø—½qÙ97;Í='7Lýø6Œp#I¹»ÜÁGwX¬a€K5¡‰2ÚöøDÉZ¶|Ô°QnôŽî æó^²ó–.¿ÁÈæD^ Ä•ºuÏaâ@¨RŽÁO³Þm½ÖNãê)¹Ÿr/ôhŸqïæm™Öæ%÷>~sj}wWfèmp㕽߰§=àÙŸiDøáý9ø)cL+sʼ®èbu~ªßy~¥ç[âÖÈÁ'wë°z8ª"’Rê¹ðÕ+ ­^PÎÞ‡Ymc©wYøË‰É¦ŸººÑ²Ù …†ôŸ…hz@"’Œ\š©v¼ÀÁË ‡j’Åæb­Î ƒyBmL¶ØMƒò³Òl9-m`ž×Rn˜^Öâ$¿‡åÇ"4׬€‹0T‹»ˆ$ÀÔ”òÓ¿À8h6*Zž3¹…’Ë Pâ:í4õÿ Òã,ÎæP* (B}SDä%/yað2Ûiá@ @ ü p)cWžß•µùô˽ŸÇ þù­)<±ãêïký€#1ާõetŠ´±[eÁMͯzæœt·Gò–8¤ýÊqøw& ¿óî­ì–ìoøöð,F×ûã²Æa .³<ÑâäÕ Ù°¨«öÆÐåXúàd1Ü=˜>Îïï‚KóvJW8‡Çnœ§øýÙÑ(øñô¸»…Þ™V7÷ÇËÐãfWþ|+£Œ•Ï ~|• èeo­Ž¼Sn¾d1ŸFRYð¥}q$@Iáïm¬ÍÎö $@H{ËLŒVö‘ƒ,ìÖÊ(ŠT݉¡VÅÑ–°Ö5ˆh Îp¨‹ö?@ þ]òÓ9¡7‰¤«wy¥ÓeÏ$ð.ùp§-; û½:|§×W*uõKØj¾{ $ô_Ïõ #;[°¶chˆIÌ`×MØx÷NÄË¢ÉïN<*Ç“’/:ÑûÛCãš)#›ü-}÷å[¥ÅYêÂâû`Úq©¥µ¥ð·—ÞEãN´4>Sy¨.}_ÒçCöKÖdùûä蟑äq#‚?|ß_§®'©ÔJß¿^Ý  *Ñ‹téö¾Köª€:l.¿Žê-ù]›ö£Ñß©Øòk#o[º7§«Êô‹È»òþâ’îèƒù<œ° àÑû„—+•œÓï‚&H2µ©*ÝÏq‘&F4 QDTKyö·i œs:üè€Ðôr0õ$ª T>v12JŒæK … ‹Ô>„E³‰Ó˜¶9–²VO‹ôèà=Ðýƒ›Ð¿( šc¨Ïrþ3OI©N å\©Ü®A Ð4PMHúbBiÕ¢A@ À¿—åÁæ]û)ÞK–Íî5j•‡9dýO7AOǽÖPÁ&åÒÞøY6íärÑžìÙ¾±cp”uB —„ÝRê1h_ïDÌ/…ƒn83t5æÿÙô,½ùv“ñïý0ÀÅÜ8œ&:_Ôž9L«i?•ÏæÛ1™t¯oÎvo3|.Kï{å¾6\¶"þRZRzÕäëªd…€&›Yc´Û§8R¹C ”©OiU¼ª‡Œ‚Ë%ÒèÊ2pÑü±Evú6Å­"uÄá91dž,½¡ã×ý¹ºßÛ016~¨VàöA=WÆë k1§²Éòí„¶‡Ì‹ÙîYDE³ã3 àõêyðªjŒ`ƹp  +µéØ”¨Þï\;L¦ÍƒqÙëgg‚H²q‚|AÂj8QßoU͆Ȁ¼$eÿaÆöš’&{¿5߯©õÌ~"@ ¿Ä<ºÑ!ªŸˆô?äs¨xßþW/‰×â&Ò£™®lì &œÕ@a=xG¯­ÍãØÐlþèðw¡ÐÚÑR++Pù‡•2æž~^é_è ÂbIš}, K\/‚çžDf&èÁ€å®îMîÝ‹Ë`ƒþQv0[|è\7€ÕÖÁx5xX±rwìh"+coãu?6þÅ6ψ|

g*2˜4|pÕC²)àñ6å†<ûZàJüÛ°—Q†68µKÖ_ô>A»{ûe3}1.¸_=ÐÛjd£e)yX)»Í.We}²ÌÔuZܱՖsúI?[ê`›šñA\áƒc°õ'ŽþSÍŸuçº:ü(ú]M“[ÐôwâëfQT˜¨*•öœ¤Wj=LµO4[Áœ&ßcVÄLýK1&%9 Z/åÕG7dxŽ1¬º,&T`æÝÓ¯˜SÔSJ»eicÌ~°h6N£²ß=ýƽXA¦M¯ÕêòStök¯æ €jé¤ÌàÛ‡ =dªÝh4õ˜HÊ­Èì?«ê¿&™¥rÈÜÿ¦²¤uöŒ/"JÍOÝû€ÕÕ@VÃáúd1598´†O¸Ì@Š’¬u ň G|Ûl·Ä>[ÄLÂ2=«Ñm@ @àͺwu!x”#á1ùS- ûoÙKMÄýjç>rÀ+±“qòeû¤Þp¡Q ûóÐËî•ñTƒØ>†z|à 0=«öèi£p$ƒŽ}ôi`Õ!:“ï5aÖæÎ\6—tÒoã~nÿ¹Ò—Óµ‰CÌÊé½ëaJ7.¾o ìï„׳ìáØÝNãÿyNžK ;ÿá9ðoáká£NÜ Œ keÉ;áÍ‘šnlw f–ÉEƒ6} *¼ßïI£ß™JóSŠªê aÖ±¡'8cIø^šPƒù6JAò©Ýá€>5}gª£ (6¿¾ÓyKÊ=¨T E9PŠ J{£àaäØZÞê6‹f€x3€$"iŒ.4Å­AœWJšŒ¼~9ᨢÏÎü£ÙëÕmÕÝ Ó&dÂä05ü)”RR(½ MØÁÝb§‰T»¨vl @ ~ìRâo G~ºÃãa¹'¤ƒ†—‡sòЬœ |ÿ0^ÜÚ®ý«Ö·x® å«þN2û†áŽçò¨øÒ°D¾2€ŸÌ {Ò_å »Ž3ifpîy*ø¨øàW.ÿÛ{øuß?ò™PÄÔ¿<±¾Ýø–û.ž]ß[ó®òa¿æÏ„/òf¬’˜(NCÓÎ/7 õÂG•D&>¨˜Œï²vØŽ°Yó9A=ÿÜëW˜Ü|‚¶X*‹Ëéœÿ£‡cMšyìÎÀ°Æ¦Yk[á< ZÊùø!HSjá#‹Ô".8 Q>¡  z8Ò=Peï05?ßncÞýcÿl«V òg˾'FKw6·eÞJhãÜË ­ú¯bÁiŽ“!ÿ@  ž&ï,we#ï.{±|ù1ËÔç{:w{åxã6]ößûÔbëëw§kœÐ â C¬ÍžFvwÿ#ÓÒ©ï«R€§ÁÈXÎý||c6Ú˘Ï>SÞk0dºÄï 8Ï_:J›>±î¾kÿ\LŽu/¶$ׇ»WøÆio°øðÎ?\“Ê?lkýñÕ¿LÓ¨;ajXÿÊŽó†ÆÉ”¹oIq£#Y2Gº9pô9ÈŸjsÓäùO­ZK \‡[Œú\¥W²3‚9&eŠœ=:|è™å¦¸^€œ´Í¤×# `ƺRJ)¥Fâ×hWëjù¬Å®]p>ÃÀÈ's\®?ûÛ)f]%L½ šõƒí·¸ø‹V¦ç´ÎÙýHÑÁy4v>é+@èø :@ þ:L$ºk¤»òPâÑR—õ?Í^ýÚüWlÌTeüš|ΠßËà°r`V'!x×½@6\½¸îΫÒ!´òxŒ&Q ùÕøÓ+­éùOÚרÿé‡ö3…Nˆb-1Nð/ ÜÝVë0Þøúóƒ9±¿œ·øàà‹5ësmŸiÜôoðã·vª;5:ÿ!|I#Áö ˜ì]ŒIoÔóa*:swRûq¾ 9®0žªiããܤel=Ùƒ '¶“LI% îUM4#xqj Š®K¯Ÿ–@¥¿µÜ/E‡bì‡!'æO÷ŽV`gk㜑ÌE1¥ùB9¨01檕úG›`m,r”e(\¨]’²òpÇÌE"ã¶²+¥}h\/?3%Ä›T&Á(%ÆÁÉ8@ 6^Àý9Ý8Á᳿3vì?®Óù‡›åöãØô'Æ3ÜtdXwû1†!~Ú$v# ´Ð\j䓘õ¡½Ééº22ÏÃR‰r—.'–îX{Gä"pÓùàðºí%ïFVõ7Çÿ[³¡Òa ýÅdøášufòzxn-µ½ë»ùúŸÜÐXý™¥úçâ«ÎÚÜoäÓ$†KÏhfñΧ‰v¿YÔaˆ ©â4ZÜ’­t.-F­;“±¼¿rß™µÏb8c&~¹/U¶lz{#-ϼQ¾“)@¾)Û´© yú®iSð†W΂Hc ‡åâ3uNUQ% 4™ÿ¾EàÐ qÉý)¢“ª©ƒ®¥xýSEÊi=ÀÜ] ‹H Ñ—Õ¹9wîßÛ°.wÃlRüÎu ixÈ’Ý–¸Z2S­ÉMñŸÒ$Â8@ þt|¦£Í%Õý·Ñ²9~:çî×Ë×o6õÑÙ° lðø ®Ø>ûîäµÀ}÷Ž'?û`n¹Bû ÜxÀd-ŸÉ÷[ßVSo¤>’’w/öô$Ÿ'„C± W?ç{ºƒù^Îl¾ˆŸë|°cÆìÐËR â§ùNýOñ ä¸Ï$ý@â¿ìbe¶Qóùá—á64ùfá¯Á—Ñ$}Õ=Ý2½T•”êŠkz/Nÿ®B@$U§U9ÌŽ‘€Íîh§K½é¿Nœ¯½‘À¾ý¨©û¢Ô{IyÙÓX\¾»,nxÔ“³éy-§=lªo‘´¤GbÊ-Ûb‚ÍÙÊÒ·¦ÐJ¦‰dw>7Šz¯Š?czšæ@Á›=Ñ^‡íc©ÅŒZ§„R‚ª?ÙŒK±,áÛ¥ÈCï‹@ @ üy8äò‹'/WÅ®‘o(Y[:ï,³¾Î}ñÁ-·ÛýåvÁŒ]×aÃõË>þÁ}g>=÷þÖ¬]CÜèù»ÌãšÚ~äØBjJ«ôÁþ´ “Þw'T€dÉ‚gêß¼5hy¤ÿ”ÝoÛó°?|þ öÞÒû‘Ó?çܧ`ßðþ«]Ç«ûÁ ôU ­^ŠÃA,ø¨n¬$@¥Ì¦¯w÷·JGË"·Bc˜[ß5{ë!)*AÓÕѵßLî¿ÚÛK|zKvj6ÓžÖ,iË{ìéç$ßïw¾½×ëe»× ò´60[ ´[ζ¶»ÛñÖ“jY🶊"‹ûÛ‘2À’ã7ƒÐÍØ¬uëRµí´eu€û½N’Q+ãäpvRó`©‰Ô#¯„¨òÝb~Hsÿ(EþËQ&ÚàK÷"®Síø"NDý@ 9î¸ëÒ#ýwEâ¹LßXwä;=×MÞ¦Îá™L ñyÓiw_ʹåÔ<ì?.›¶5¦•óÐáÊ=°ÿ€Í‘ضù¥a IDATŒà9ä×^¶½jºs7®÷ÈÀýá'r ÝBY,…í¯®ßÀ\R°©6p˜Ú ?%ò³vï#›ßË#ìW¸ßÆ'{ l+}üI^š}ó(¾¶©É­óò­ZNãAv\E5M¾oSsÒU—Ñ4˜˜_RÕÖ)¥Å. ¯Ì²{SõM}W~÷DõÊ}K¥â>Ïæ” ( ‘d’ýUÕ*à§”5vÄšŸ,ìFãÀ|æì[¤dPó÷Æsàô/ŸJéÆÖôx‚(mˆUºƒó’0ožKÜÈ›e²¿–q›€óLn³k©6&ke‰tÏÞaB¶1ÍïjJ/QoW¤„ø›eq”a—ÅÁ@ @ ð_Ãýdòƒ=^ŽÄÖzðš)SPÈMž•+lZËÍ{ÜìÆ!8¸=7—k\æÖ·å­ÿDoÿÛ“ã®<”úù†IÀGk çŸ]ã¦à`Yþ)¯²)þ‰¶z5rü-¹ú7À“åóñ²Hða‹øÍ;:„$ùaÃþ|5^Û¬÷YoÇf‚Ûj"Z/«¨µ­Óyc‡±>±eŸ!…ªÍ,W*mmh\1xA6‰e%ÌÏ–ÄÓÕ8c4MlÚxq#úV%AJóT«)¥ÌÃïVL_‘¶ÿÛÉœ¨jc¶mê½?ƒÙÕ6'RiêØnoÊv» ŒNO†œŠdès¨jÑ•BkaýT¶ƒ±Ñï<µØ½î×× `ÏÐç¼ý¨Tý(³—À#æ§c5 f±`@ Àkv¿\IÑ»¢@¸q‰•KXIzWYÓÙxEÜËHüqÓl÷×CDa%à×pöí_y`_̧§ ‡ÏÚÇ·„z\šóqÌ­Çf¼ä%±ìØÿKr=àGã÷yù;¹ü»³}‹ý·÷;Qö·tÀÇ8Á•ù¸ÛŽÒ7vÌ?:¹#”ÇO®¶º»÷åá?n Vhõݵo­z)ó¸Rlžv=ÌmgØ»˜ «Ö•ÍÝN ïêSk¦UÔL‰,¯9Ý>¥4ˆÑÛ¤ý£ú£©+-ÞÊ P´ç ׌qvz”£xÖЯ<{Œšöó>0H¹×”Ê;:ߟa²XÑ Ý{ÎëŸ #æôùõQ8Ö"Ð(ás»~ÌFqJD„©ñÿ¥÷Ãû¢#›Ô Å@ºo ,Œ´Þ f·‡| U»ÇÁÿ¢gOŸ·@ @ ø;°Óš8ûO‡Ù³ÑK·—ýÙ¦yÏnwj?=››ºÿîkâéVÉŽ;r@ë‹»¶™cú•WCÁ}æA¸au –þÒ ®6OýœðÆÞ8œe‚*ö“çí_»ô?±Íê-ÜàðC›Ò¶É߸ÈH§Ü]\ߺ´­Vþ£øÚo+äEVusÙ•™ïmÂ6O—³UËy½^oQÖ¾£×ð@ií”f>Í\»x¦9Ûj]‰S¢µ¦¥™¿Ó3ȆyÝzé:?躕b6[sîo®Vº‹ÇۯЪu—˜ƒTê?_ÚMÉwF:‹þ©E†kájÓë÷ee‚¦(Â4÷†[N¹O{ãNÙdoK3Mæ.R•Ö1am ŠWvÚì7Ÿàþ@ @ à}Qöþå1ÖMb=èþ‹ÇÑ{ÙœÞ÷å%‘ŸG·^ñŒÜ6`_| Þ%䥸¶p§º³Ö@Lœ;’›î‘Mé/‡žkõ¸ä¹g Þ½sÎz–¿O©ü‰ŸÎyü[Q7üò ÑçÌß?ÕiøcòC—lûU³˜J‚¸÷Nýâ« 7zOÓhÇ6ïùü¤™{~‚¢ mU‘“pÍÁ—5¿¾çêû½êËMAõ&.iúšÝs³0¥ÃWYL¶ºYG„’¦jŸ¼Q• ô»¬ 1»ÖÐ[ðJ/Ö¬ÿ–³O·´jŒ|ØŽnÚu HFCIUßï·ñ4Þ6OlÅÆpꎬÄSº½`ÙÁ·Ï+{Ÿp VND¾Z–8G2wšÖ"·®eñ¶LêS”òzu¢v™&õ$k)!%¼ŠÚŒŠ*«!pQiy$ì;YUò ±,bK zþzߢ:O!Jü¾…l•zg·Ù‹Ñsˆ3T}WI%ŽûÏ\÷;(u½æKC^wNãƒàþ¾Í¥ÿׂ›ç™b!]gúsÃ(üp¬D1}>Dï­I³áúE®d•„Z§µ@ É4ý r4…ÔV ÐÜ*… ÓÈ,#Teˆ›M @ ~wH.ìólWç€)p–!zÔ±sä¨ $¾à>T¿˜¯Æ§Ýv°P~ró>û¿:¬ýÁXö1oòÔô?~iÂ÷˜ŒŽrªóƒvýÄâºøO/|ùÝ £;oƒ{ÛâK†œú[³¡¦šç0[^¦öµñ«Y]Ȫº õ4\¦}ÿ%³ÿ-õz]$+ë*ö½š½ßMàï¯"U¸DÞ(Äêy0 ûä¦))@J%G~9€6Ä’jÌ 1Éòz¥““pk@½ÕÌF×Kzª~‘¹‡HJ"’Ï™(*£Ù¯‰÷Ì×òúSÖÅ™Ë/¦b‹þú4—Zºþ8 Éžx'ð6âÓ+-s?[ »G]¦*@ÕM›³ÂS¢è+%5Eªˆ¼j-H¶æxUŽÈ¶Te-I‘ç¡—@ @ ~‡¼`\Ñ7_ÿ#zÀõærk;:ûo°ç<ëšóê¦N¬ÕWýs8ó¯ ”þáüÿì°}å‡Ë .|³Wå¤tåY¢Î®6|sG·xe\éî¯ÿi|ms¬Ëê³!ËÔ­ÉÚTR›Y!†¢TQ¡ˆ–ÜêôjÝNRDÛ9=/(ê* flTiXÛµU^V~‘ŽÉÉÚ»5Ø'¹,›*ñlzÞ÷2sš’ÌØRX­’|«™ðZYq´[ÔÂÏ«sk•ˆ/g«G—U}½^Ãæ]˜èœ»’UÏyñÞ¸g.<'À—ó`×ííõj›¬ÓÊLy‹îåˆbj)r_Q¤¨DMwA‘p¬Ž/”‚‰„’Ã$¥²Bu:2åišûx›¡IÀug@ @ ø‡àŠÜ)˜E^‰{S̱€Þù\[S›'ë.1¿¾ÅÃ0—;½ЏƒÏ­›#ÿgaõ+þ×ø@cúGûòaîÿÔØŸÔǦ·fÅ+º ö¿ã«ÏŠÎªïLw­‹šOe Éfº$D yŸD(:¬…‚bùKQê IAˆ(µ™÷fV\6vÚ'%zÍŠDEô§öÚèBÛüØ ŠXPNáoÍÛ¬Ÿ&R5“뀈fú[Jš¿ùZî}•N"k“ò{jC³@Jâä®¶fÿièéíåp÷ð'°Í­ª5f[3ÜSQê1€V Ep_$ ™DY“(’ûª‹Oõ;êO:Û>ÍÞ„zL‚¼)ÉŽD‚ˆÛ€”ŠSÉõ·Áv©rÝUØTFuˆQqx~±‡™b£ @ @àÄNó§ýºæ!¯~ÅrO¯äè¼z+ðf›€¾´.³“2§äÚ6ü§q ÈWÀ5ðƒÆÂîIV3e÷SS/oígp—AŸ¬…b}šG¿óÿnK\¿n ºÿŒ/¡R Y‘&¥;sn$:µ@GÙA±§yÀ™®-"ì™”V¾EѪ"$³ÀúÝU$ dÎç8ý1g¤÷ÿBf¹¡.IT¢þ.¿3ÅEJPu+Zj4%Ò6-¾ñ")A¬w Ê6pu,†ý%ÓÊ/œ¼J’>¶:g“ûïÝïpòa¾ûÑ&ZöE;öUI‰]ÊIº+“¤ù.JBKôÆôÁÝkœDõmM†ALØL>ªŠÈ…B*M†"6¡@ @ þ=ÜçÖá ‰œöÀ¥¨€7w¶ç’%7ÿÞmW­këèyì®–Ìpùtp£»;Ù[!;ïÎ:û¬Mý§'°OÇOFËßn#î_únc¿«ÇÃeþÿ}ª¿_…ø×.ú’©ä.üžÿ]YÁ%s Ub¾{ PUSBµJ|†œ±Ý÷©5)Þ~¼ÝEJP­¬p½ª¡Á™K(²ÞŽˆ°vEï·nI[’T5k5¢ž-> H ÓN•DQ©Áoæ6ä}ÝØ Ó$ T3ÞÕ‚ƒ‰x–§ª P¢ûdËaÖ¼~®"ó8ø ·ß˱2ƒÓõRîg§=—bAZ#+‰^ K @ ßb‹êˆ\+ä`óʪ_Bï:§BzZƒ'Z;ü-hÖ‰ÒžRõ×ø†½Ïõ]÷øµ§ øÅw{$Îqg”¨üÄõWnØ|Ø*ñ¨ÿȹ½…"¤}ˆ˜%ͬœBÍä©2s¸®)JJ Óû]ÎÔ´øœœ>ïPŬÖʲ”ðSBs°­d½kïÏÖ~òêK¦,“uê[ÁÎÒýUrl jÆä²®ÇÔU‡%„Ð;L„HÍ`v˜°¨@1. 5 ¾¦¥3IzË[D”|Ÿ„HZB6½˜aê¼|ùl$,Ëí—+rV‚²­˜#•zŽÔ>,Nž^TÙrèH÷[;†ª3”å}htƒÚ1í3RÝ”lÏGJvM%ËT9° )µ)ÕàÚÝRqgcƒã@ @ ü[8伯lì7Äñw4¦87ÊðYM€ýõ(ï1¸¼wo¿z¸àü°*óØc¦˜túiÛ;ÿô œTì›zÎ6ë*cø!Íù\ù¿Ây×í‹üÝÀ„/»Êë´gÓX! x*ó‡ YÎoTx¦õk´¬²º :uÛ’á‘ùã6hÅÛµ‹òW ú¾Î*>…åÖ9_UMõ¥P®&äE8â‹Í¨Rþ"ΤêÛ]r8„¦«¢I"’Ð4ås@n…¾ß¥N šÊ…yoegC‚‰ºn5¬‹"ÆÆ*¹¿nçmÇî|˜3ÿO:²:Á0õãv/G7ÎUЍIÒ‡ó,žŸNm‚QY GzÏ·ßKçKž,#¦ºÈû/Ø›D=R @ 2\’q§C2þº:øÚɇëÚŸññ¹œ³„¹«pCº·±vÈjPüÏÒ!w2ôݘÁ¿<¯¸hY&›3p“Ú~&Å~÷ë½›øaöƒøðâœðeíx3åjeÝÀêk“²›ž!¾óÉÌȾµœî||>²§“—3Jõ‰Í³¸e»×ˆ–kÉëî¨&{ÝfâK³"P5ùõ530 æUm¦yÞV±žQž™£9Í6Úz =örÁ š%gÆßÒÉYMèýn ºˆÙç¾W£”D+”Ä9uŸÕEyU%š­†šsD˜ 2FSH’@ÍîѪj>bÕœÚ8.ƒhº -$"¶'ÑÆªMû\)%5ÃÔhí7 UûåþÉ$‰©¬Xù¥¡ÿºM46²€£‚D@ @ 0Ö"ñð–«!°üuù :YÅ®’øžXöW¼'ŽÉé·kÓ×Ý÷ÛYÿ“±>ùôOêü¸u£áW\ø¯D  på)¥i.Â2ñóŽPÕGåôCCKIk/¹Q*\­ëªkRéaßç\ŽÓÒ­ß@;¢HÛ÷Òµûi¡È3ï?¼82â…(?jµ`ɘ5ßÛÕúŠc'¶þ/zJmúúBªŠÕáñ/M—öüu5ÚÕNý뾬wšÏgûáä=t͘_¶3tT¥)qâ÷…Ëö„ohfG*oAù)Ðìc1¸H+Ð^Ãѽ8.œñ£@ @ ðïƒ^²Å†ˆÇæ4Ó‡î†\í³H€«d."á&ÃuÊx4u/ßÅHàßÄaÎàÑ`MŒÿ§ì?¾ã'1LCñj`~l­M³ÝuÃþ%ªC¾ Úrü—ß裱Þ9kµ2hêˆë† HMúoef§€ä<ïUÒGz*}gùOíC¨¶ºï÷»¼h¬‰EDhôä7q´Ú-¯^$en¤hÉ/KÑÔ 4©¥©÷èî† E4Û1W±ýyeMtÿÚrñêJ D)qï71©··'¨ª-˜XÂ02]úä‹;?~ðze5ž¹¼á`\Sw2ìöInjA®é”0 %%¹jBV„UZBŠôÿ@ @ þ ì2µ&óc£kâ2ªÛf¬§û.É>S%pÞu?·hÇO”ÿ‘€Ã­íò-_4Ù´þÿ!†‰Þ,Äã{ýáüûƒšÖjù‹ãz Ìø*)è- ÛZaØ´ñ‘“N)‘oïYÔøc0|Ìðþ+=0é™ÞîÌ3§y:ÑÜô·­JY£AàÞ`Õi)/Öw:¸${¿×ê€ùX6Ë‹(FæÞßd0ߎզ)? ¤«¸ÈºV†úÃû÷,þ+ïÚÕa5ãʼ<:V†uÞ 8DˆãÛ,2…TXKò± fóà?êµP¦y™%ÙÍ( Ý0Œ}5Jíûu{h&‚@ @àoÁÙÀw—Û¿`J?¹ïšMôçTûÄ5O*ó"s}Àr3ÓÕ­DûU-ü6˜RÑE—=0K˜ýz Ÿâ\ ó ãÞô"ð_°¼¬ri€Ìþƒ)½²ˆÎÍ͉*%¡ô¢î.ÓmHé6Ó'AûÃ$÷?œ‘´Å“|P—‡É•HÐݸ)TAr¯ÖÎl®ƒ´6SãÅHÕ+ €µmsÀƒ×zjœöf³ylãæB-(2 L­•=‰ïuH±..?á^»{×èe"¶‹C/Ua-a.@ê:V4[ÖÜæíÚ¢³·l±Á†ü)µeá@ @ \½ž‰ n¸Š¸r&r¿àM—¿}“†÷oÁûÊ¢–,FcjÏ™:ǥΠþ=n¹Ã4s'¯v ­Ÿù“ ¥ØÂ“)/¿Nÿ²…Áþ _73Æ®• †ÉŒ¯ïärT`‘gQUI"Úev¬§j×1ÿß®^NícM‘ž»y`mqù~¯¯›ÅVmfUYåÝóB›U ÉK¡h"„Öa N I©ñûX'øâ0ë AÀA”†ÎJ4Q)º0 åª4XÞŽÅ犮îãäê‘ÛÕÊ- dÊýj…ýKKþŸ½sÝnÇpöû?ñØ Að"ÙéI§çRßìÎ$¶LQ­œƒKÕú‡´4E,ÿ”6 æ®ësÉÇÍÑW!-AUüªûöuƒ,þÂÞr\ë£JØ@!„B!„ü{¸ ìÊu€¿OÞ ÿÊ$%ú¿$S ¾xuðÅåa±¿Ü^¹þ“rý¯,àýa¾]¶žŒu•0‹°Ô×÷Ÿÿ2M¯ç¸¿Yögé_õý¿—çô­¥Ú[ 8÷c×6Ó`+bîÍ“¶”Åϡ㲗&É2y ËâLÛÂñöΔCÎÇ»ØJû~¹l›øÊÕ¶„Ƚ)¹÷*wwsx»sWwÁÞQâβ|/[éüÖ‘°nY?¨Ùô\Çd“Û:…F”?–¯Tðç.™; öÀá¯ÖPÞYg+˜î™ÇbV£†Ûovu ÎÍ£ªˆQÉ1íOÀkG3Ž8?¾²‹%žÄ¥#“ª«Ð¿‹µ¹lÓîïËw¡ç¸SíÇû?‡!„B!„ò¯å(Qâ[‘ûÇK¸x &ÿÊÄöü~!·°Õ—Wjûé]¹žªßÎ_[ÉÃ8Ÿ¶wrÜ4|§}ì”âú½•þ¸XÀãŽý:ß_ùꎓ¿Ê³è¿Çº*ú/¿þÚLl6tÝ>8©º8\ÌSC½ ºt‰žCÅyýYÏßv_#¹K]yýµ–¥«Æ$TàËgGU¼™©êø Š±ñæ»çBå”â;Èæ÷=Y{¤úQ‰öO©ŒñÆéÎHÑêqÀöÖƒÓ‡¦„ j$xªØŽøÐm’m}³º¿Èö·(¿÷h»¬<¤çzlM5µì9™L3lъ9PxæBJïÅú¶I‚JúÊh8$Çv‘v oiØÁíË$q_Ô"„B!„Bþøª÷kÙ”ÛapÝE ÂòŸ"ï†ûÇxa& ± ªñfÔ5mpLc“Çpk×¼DüýâVâ@SP_S‹•±—â7ð—kçå¶_¾ezÇ{ê¬úÿ¬@»0½÷=[ˆèݧYN½ ñß}ÃKj`þ˜T·Û±Äû÷Ò£¾Z[~ tå€UügDÔç¬@?›4ùn+ˆ0x¹6ñË/ÀvYå컲ÿáûP5C#iþÔŠ_[ÇJ3ÇÑAsÃÚpúF6kåLM¨z1)ÖC3/O·!ªTZOšüåŒoþTô|ÉtËþݽ–l“ÀÝuÙ·r4Nèq=Måéüøf€B!„BùW²Úý>.ÿÇ÷J«ßLõ{Ø5ëk`ÉÔ\ U_x{ö 3å?ut°½Ïܽ¾‹dçªÿŸÒŠö_¼ÝG]«ožØñÆùoÚ÷ä™Â.%LBìý îs¸¹üB=UŒgz\øTï_ÏÛêÒCáe¼¾Nòô rlÚ9ã,Å:¶¿0g3.¯Ê<-–ެ”vY¾}þÑÃ×§¯”¬VÅÇ™LS-Ó;&0RJ¨…½¯Ó°ÞÓ¿n½=úï.˜¬žËSr²;Žç¤_=ò–ö'y¤nŠ[°Áû%]9×ÈÔ©'ê>Ý6’*ÙÛJúw'Ê'„B!„BÈ¿•%¦¹šËY~)8jÈ׺ì¿\Çßgû«ìSåF¿~ïøÊ ?9à>gòV©i÷ú”¥Š¹œ]Ó¿.Åï úË÷ˆç¼5ûý†Iî[Ö‹éçÕ­aOÀ_åiæ2êÊÇŽ,›x#_;¬v Ôèù®ôùî¾v$Fèß”=n´zjÿÞÜð¥•ùŽ-·(ýµ@ù±ùáÛbïW*ÿË»ò;$‡Èó÷”X¡ü ä~)¬åÓʼn¶}I†ýjýbwq(z ?ú`~–Ù¹Í[zŸ£–“· ¾ ªáõû*eè{å»»¹Ë!AâŽH8t»â¥2þ2¸\ÝtÇXù÷¡'|~ù§ÏAÙœ¯{2«¹S×Ä7Ë·—+òÓz&zžÚ ‡'Ìø³ ¥Š¾÷›øz9ë]Ïòýá/ŽÑ*)%ˇei¹¨Û@åá(JP¤IP¡¶ø.dæì „B!„BþÈ\鯣Tï<ØqT9Õhï£^†¿÷_÷!Ž!¨ï1X”pÖBÐ÷fÂÓk ­ƒÜ¿uŒòWI“ßìâûɶÀ7xüÊÉöø÷êPù)‚È2ÿßÈóëßÕC(9Mg½EHµ™—çZ­ŸHáªkjx¯iå<‡Ü‰›”Øu#ÅÕ‰[–/pÉÔ§I\õò~tknéR1å¤Ú«Ëß\¸áxˆ,ã/že»ÞÐú°›ÚÎZöïÚ–{Ý”‹f=3—YZçjXiîºn†Ùjb|¦gZ)¿¾]†¾±·b=çV&Õn£ÙhÐÙÂ÷н6r_Ùܱm—ê,í.Ñ„`áÀ!„B!„ò_á/Çd¿t’Å­ö RC~‘ðk3bÿdÜ_¿¦“ŽÐ±W` ¾É`s$îR%Sa«ú=¨ùŽ~jSù·í®£ÆÔïÚ³{gŒßîCòÍ5ZL\Tµ:ëŽÀò<§“3øÔUpáº:Mº§E˜5b&y fÚƒ½^Î µLâ2u¤}JU1ô‘\f'\)b7wÁ÷½×h2Ïm?É›¥Š¸),^ìo€¢ãžr2³S Á6sÕWÈàcRøê–å1-#QÐ Ä1·$\-© ™ÔZëâ²r#ü*eù…Gg“ì¿’ÊIÞõ/ÇÌìñxH÷ó ¥êz\»C–1S.%"Ÿ·G.r5á6¡®¡â3<Ý øò/Æd* MîÉÍÝbî)@$îˆhoßXÛZÚ&<%va¨eÅš8Q( Å[ænN`B!„B!ä¿…\‡ç—°Ô׋ëßFJú_,Ü¿ª:÷¿8îûÜ®qq¾úH• Z>‹M€èo¼޻廇—kíý_Ç/¾ ¾õìmL|?Ï‘ïÉPlÑ81z¸Þëœ1’×o”¿^¯IN½ÈÃÜ»~;ë µh}޽JÆé[t}“¯œÐJ·‡>L-Š<°×Ë[¸p×ʶÝ1¼Ö¿ã`P² hлªÛr(ÜXQz"å äq“J¾÷À4öû¸ÎeÜ‹ËogŸçÕ·6»¢¿ÁúŠ» êIûæe— ºõ¾{š¤ýòzÕCPèð€¹öìJ˘»DÚG ßy=ûUyÉîXú ·oË ƒ }!„B!„ÿWeù÷r.7>—§c—bý+! ¹$¯á´«]cb[bcÿü"%ô} ºj€_Æñ?ñæÝGø‚þ¸UqÂ…LÏ_8ÊI¾uìãNºõÇ-†ç—²*7©½9:ÂÁsÿN•›M/Îß½.ý¾Œ/KùÌ_¥`Úd̦tü`ÀäZè¦ÚÒŠª4Éä"änæ53QôñGQ¸@TÔ«n ¹(5k±<`"A‹§A™â¡f?Oµÿ¾Ø.o—,òÎÛ¹Ÿß`õøÖP†v„Àþ4ÏòCä<.z´ö§¬Œn AŠJõ.‹±$7®.™@‚:¢â?òKM’éõò¢_”ÿúÔõ²É–4ÀÒì’?¦\“ãñ€‹ € !„B!„ÿWâ-~JøobÌúéõ#ð~5óåôûÉ–zÊ·åêß–øë‘úO’¿mWøÅÒáÛäÉR¿éÒvƒß«K~Ž'Z ù,ÿRKª=C·¢*nnYGŸ1Ó£ÔÍéë$ŸßOG˜Aª9¥L<Âý%˜ìKú6ürN_r¯×ëwi¦Ø¥æ‡/.P;'Æj¡÷T,]áFâ[×f?ÍÀÕ.»ÒY¼>~® û¹Š« ~ÿ;¾˜ ´º_^¤Ðö뢹óæz?Dü\2E^]ŸÇY¶Î êW§>€¾oë¼é&õg¹"êêÆ§ !„B!„òßä*ú­ûøëü.š®^9z ‹Îï‚ó{Éö1„½„¶Ž¯Ë°ÿåŠI?iñ|Óv»1žø-;|Ù7M!7‹@~ ‘Õ÷aâ*d.PRY™ÕÂÑ·Ê·ðî•Íz®÷¶‡½R‰ñ‘“ð]÷¦”ûñƒe†àõrÀEüñ˜ÔeŽ)¸Ò|–•Òõ6q‘ ºhµ¥Š|¹À¼’ºhR,•g9fz®nâÕ[SÔ¾ä!JWÁýÓ ²9è–[­¾©î´+›Ÿ S—6ýŸiO´‹¦ËïË®8|dœ8|.¯«n6U;·)4AD |ÚB!„B!'Ñs¿ð X>åÓ ÷y¹>ø :0~-¿Gÿ#‚c‘û¿øûé×û<ÊQê‹ç”Óþ{ÌôÓø…Gþ ÏÃWyVÀê4Ãé´‡MO^µrëÄ!Å{û*Ê<Õïç4vkÚÃmµÿ>+ûO—3»Ô®·„ƒED\̽;ÅzQé¶²=ÿQGT wYÑo:øùÕzIÃ5Ø{ ½Ïrö²^ºg„®:ݸ8K´«Jy÷ª€ýjM.ôR¿ËÞýÌÝÍE"™ôqx†š­ r1W…¹B‘Š³È§„µÍÂ_¯ÿéãñáUkŸ­òòõ‹PÓÝ º-8ÐÊþEÚÞ „B!„B¹BnßòO?½ü ƒíúCïO(øÚ$äzÐ¥âæôÿÄ.ßë^„EÝ+!ü{¯¦Wúí‡#±ˆôœ–´}»œ¨MÍ«ñvÐî†r¼«=à€[ÓzÔ–B!„B!„•«8ý"©ÿÅ1Q+ÞY¿¹ûu'ÂýÁ8 Öì¡óIƒá´JØ>òvÉÞ6È»*úOÔ{ä;wŠ_hD}÷©nWìʵØO˲Tý3Jö£W®ƒÞQQO’²žGgs‡dÞá´nÇ/y»Ýõw ˜™‡YƒÝx—ËMº¨®dõl¸yŠÏ‹0n´™Aõ"ÁÓÌÛ¾¼Bßg;åb@=±ý9Q³>‡kù)B!„B!„üçÙåàñÎ;ßSÿ~ìÙKȯÌ\ýÃkÁüâÉâø#SclþØf#§¹~i©qZ¹óíUß6¹JU|’¤ø6üÂÎáx©öó·àùö–NÒ;¥ ÝÓ–¶Å§÷ç{ "¡"n§aÖ›•Dì»ÇÖ÷°l†cÞŸÜhGôu78F‡µ‹æÛëÉ U+êýc†‹À1£pÿÍ­‡…о—¦©+xšÿŽÍÂF¡M¤…éV¾“*b«êýÛ oν5´‰D*FÎ1¸JúènËøö¢êÃ4ÕYT‹“™nÓüT ·†Ñ ØS¨mãRGËüë[î|¶B!„B!äKÝt¯Âåþ5pŽuÛW^o†¸yñ­—ñM&`?þê°]‹§ðwÓ»‘òÇ»·~é.øv¡Wm¿=ú¿û7,Ëâ§ Cÿ ž«Ž|Üž”L€&‚ófô0kâÇ•*N‰É^JGÀ¾(ÝÖ«™Á›Ñj{PâÚчºµñæå[ÂÖõz—´GŸ^¾ÒÃúÞS+¡3HÈÇß?˧n‰\ŸKõ­:ë¢gÌdö!¹Ê”J]«ã‚׋8™¯µ™áÝþÉ©ÖaÃ[a½wÇ6µÉ8y?¶¢G¤_¥õŸ´À:¨›¨B±ü¾ÉÛ\Ô®ÌB É1õÇð‘G!„B!„#þ®´Þ7õ›ßœðM®[Nßï?ÿ‡*1¿ &³´øuBB¾ï¤íà¢ámfD~ÓMÁf„à¨W‘?ÌóíV3÷¬D?o“Êÿé(Yj½½É³ßŽ\C«gY¡ªo“=²è÷ðk-ß]gE44ía.¢¿¼_Íl15¿”²éfÃõe¿^™)üeq"$=_àlåÐG?©[ïnÄ#ö½´t9 ïJP~ÌÚ\9ý^UÖ/Ç´†ñJí`‹]Eß’÷À¢P×vœBgcUq¸á`Ä¿¶÷uÌlQÁbS!„B!„B.¸‰,WßT\«Òÿ¶_<Ö‚S?éÔûµk“¿×ŒüƒõÇÏÕ÷êáåÞ¿))&žovÀÌUK-óÝ€UHn}®ÛaŸÇEá¢P$á+p´ˆ’í¼Šòú”¨Ší1Zøìg®M µt½4œ-§ö<†¾r=Ç.¦\vw‡µ÷œXµûò™jÊN=qÓ%wD4…ž–•̪Â=["Úi´™IvÅnÎ’aʆ˭˜ãØú¬)¿©ÐØ,^oPimè?6­ÿù·t[ð‘X€GvÆÜ¯]+!„B!„B.¸Q³YüWñÛ[öY`ι‘ÿ=æÿ6–9)!á¤ôÛ÷áÜß“<~«ËDþ<'545t åx+åv‘©Ž¾Ë\ЭÚBè"Ú9ˆd‰¦îînW_ý³}m¼Õ긭‹ëäërnÍ«(š-‡¨z-Bõ˜êF[ÎÒŽð?®U.·ÿ|ⴱ͠yËðy¥ùù.å‘9©ñ ä=?ñöK-¢˜U{ÊZ¡«6‘oÛLŸQwË P„â¿fkþàt‹§Êú±Áf÷ˆ+¶ŒÎ/­'±<ªê€–Iˆ—5ѧvÆš0ñª6ÌÓÒ5ŸFæÃŒÙ!„B!„ò–·áÔ]·%÷¿3ÜþVƒÞ/:d+ÿ#^øºLÑ·Í[^bŸ®_@þF<ç›#ŽVU- øjû¨ËNù©Y ºusÀD&§Vq´€ª|^=yÜ>$Žž›:¼, CZ'*Ù#tÝ3dzdÏLë° *FÇm–@zZ¢‡{B£6+ì²Kã®A[„{[Òã%”UôÚÿÓíˆP¾Õ¡ŽÚ}›Uµ§g"#„ÚœÑ[îr›M©I’Ì·bRçÍ;¼ z—Ãî©¥û5õq¼Åsëƒöîó„B!„B!÷Ü(ïƒè~áŒM°å·MVn'î'»Zl9 ü»2÷1˛ƹøõfw|?~}WätïÉßçuí7ÚC/ÝáRweAo·}­L_¶†ŠÛÁ µëÿdœtS£Tþ« À¬ùÞFè¼ÛÈî~z²43”¶‚¹„spxL>Êìnôë#Ì<¤×õ—&’3]‚òÀnòöãH ïǧÁ¶œKa{Ìd}eYUfVr²¸Ì7éRÐÍPý°Yxõä|ç%­bz €ôËõ~["ÏÒ6@ŸÖ²¥Ò·Y–äDéCñðyV•á½à³¹!„B!„BÈçÜû¬.eö¾…þÿP½ýˆ| "óOD®W}ÑÎ9®Ìò³ü}.éÊšü3x^}C1;Œ\o™ãË-N›•ÝKÅzF‡CaßÝöhø$ØâŽ^}oöÚëÚ¯¼dǵ”Ø·ÔË…ÛmœvþÔb÷ÒQ@.e‹nÊÔ=ú Êh}Ì\Š>J~çÏKêú×–…͸ £WïÈìØû‰ïþVuDˆ+vµ["ïIš7ìÎ÷gǼ^~üÁq±nïéÛ ÒX™L;•_%úÜÃEÚÌá`!„B!„B~‰£ì‹_ØÍüÑ)ãBǾşÿV¦ûÜp²iðíŽçêçßuov ßc³Æ½sÿ ž¢Í†wh/QØ9Šº*ÏLO?ÝøR#w4gÝq6—l#Àr¢ º+."¹/¥ì8ßðsÙû¦sÓ]$]ð~ªQŸœxÕ¨‘.%¿îšû£½V»âU_bÝ~[á¾M;ò1¨‚ûØ„‰ö¶ˆD »»‡2>JÁ»Ï·à¼\%ÇSõpº…òázÍìñxôóK·ðÛ œN±¬Òe_‚Ô”ŒW‘§2éIŸ±…rnërm¿Žw_âÈq‰È ¢k}„B!„B!ßÂKöͯå­«þD°ÂOÓ?Èc“8:È’lE÷r«aƒw‹q¥Mttâ•­ãB.ŽñC%ïÙEù‡næ÷‹åÃõ!ÿž•“îûÍR+ëe‘dŸtÚËñž2ðKðTæbîì#¨ár_up2Pÿ…9g>`|1%µàû÷9UPšävt”&€:M5¡uØOæïsz¤8ÙnÙ™6ò±0ÿâÞÁ¡C©ß¼¸Óû6ùó£r“î©ý“\R_"Uív!$÷;íx9ov©ÃÕ[ƒ„8FJERã§\çâµ-W[†LÒÖ¡€ÍY}<ž"¼Œ6„B!„BùËøEÐÿªªÜo‡úC\¹àZsÞ/Vâ¯ÆmÓÀ±·àØXpµH{Ä×MW%õ?aç{³ô¾­¾_Ü¡cr†µÿÿ$žU:~-¬.Ž´ýîèçæF»†³‹ÖýØOî.îözéã±ÕSo[òÈ ¢ãMŸEÞs¾²»œ,<BVÞ.¾í’d*äçéGoæÛÛb†h*(ý!4[5øW䉤Ë4íŸjÁmuqÙËêkÿ8þMd¿|G«»yr¬}êᥞ¿cM7©^Zß ŠRòïfž6Èýˆrs{Š"ó#GË‹l<±×+^x<ªúÄã%âÆ!„B!„Bþ"ÇðëCÀþÊŸ¶Üݯà­^®=„w%›ûÀl<°Ëô/G^­"nÓ+þÎÏŸáê:qjUpºþþ;xš½.”U¤x¨6o23ñ¶ÎÏ‹C&n.[aâ£ÌzöÜ‹°»ÈôZjåý3ʺ3õj6¼¥&I)~Q×é²=)ß>€íI5{ 0á w/ͧ%};,J_D;vó€ÈÙ`¾Þ}&õì™oPÕ~wÆÿ2T~{×üÆ1áJ¦É=ô󹻎çTÌÓÛ>TEÜk3Ç$Õßý~‡üQÎ|îuÀHYL‰–TŠŒ‘”HB!„B!„üŽš-•=(±+Ýào­ë²èüøéÊöø~•’ëXr r›W¨çú3>ß¾[d[Ü›p?¥ÿÿy<Õ·Ýä)È[¤o|‰„ÖM %æ9•{_Ú±^‘é†þ™ñìJ2Þ·iSì"61ùy+Íþ%ý°6ÌÞÚvƒ²k þ±GÁ=úâÈ&(¿kÍŸŠ¢ø©†}zþÌa÷]Êÿ*&¾§êñíîKØÖ¦à¿ø»êû}òõ¾›Yà˼z!õÓ²âW|TöÇÆË~k3Ü%† td5DDT"þz½Rü)×}ü|½íÂÖ=/9’dÛ!„B!„BÈ·qeÄz/´[Ö.Áõýk]~¾joX¬ªR\\Ö1Ž/LÆçâ'Ÿý¹qsûŽN8m üÝ®üOo²ü#¬ÜK¶íñ@è¤çG¼ˆˆh„q·H+°VÌ­6}/¸›žL+µÞvœ·Úm³¢bŸÛ¯¢?ÿNÔèü£ÁÏ_…OX›ÓÖ¥8-k-jÔ;Z$T¯Úòƒ5®*wé¼,‚H×÷àÜ[Qþ®¥A´;ÌG, ‰±ÎË ©k5e&¼ÈQññH!„B!„oæ­0Ë»n°èàÜKãÿÍ.}Á¯ków1›ÙŸúåo¸(~«×"ÝWÆzÿO3;Ú«öHò$vÒtrDGð¾^æÈ`ñ®Ÿî]/hÄvÍ\5tÙelÅS®L†'í‡73S¸‹îƳ=Ûãï‹UnŽR-s›pHÀx“R³ÉîõÒGWp šw±#—ü–5eúcŠÖG zM®„&äUõgÒˆ€G£F6cWäŸ}nÃfÓW•½??.ôpääUµêá”{䱊[ÀýîØ>«ú+zŠà𙵜Ö? yÛâ…œRÛå½/añO.©1Õ&’(ýŹóŽ„B!„Bù öèíUÌÛ··üoTõÿË×}óÊÛwå_p÷ýö†Í—¯^aôÿßÀóÿûŸ´Šþ)‚‘z[âÞ%.,€•Íñá÷)³ QŸò,Ø-hËLlDÒîa· â­SηJä¼`ŒaaM¿ŒQg•ñŸ,´oƾÛåŽÕðI¾}ÄõL#lÓOûਗ;ýÝ8Äú—`wË ÌJ›ùóåÅî¢CÌcÛ¢¡daM ”¸?J‚d2(B9e²CŸç&3±y«ˆF´ß:y Ç‚7mæ@µÈyݦ¼ï· ³CÀ”ÊM¬Ç´sdR¸sÇëõÒ¹$û9ò×i㼋æûßWφ>@ !„B!„ò\U÷cûa) _4‚üj>ީ̓ߊ_—cö=À©Ïcß-äßÌ3´_â®·úòØ]È,¥e3‘× @(¹ÿú>õSæ0#ܳ³¬Uú‹*ÌúÇK1~?2ú ¸|tÚý¿ÞöCᥑ!ýÅvj ¸}w¹¤: çØ ¾Çº÷W u›Áó€ZºÞd÷Ý»dΈ‡ÇØ•”æ&Œ‘THrÍ{w]©Xí¡”÷àóÇ[7%vcçšsÊ=Sü'bM˜˜ªxÉ´ú}Y÷¶†\<2kr† !„B!„òãm÷wó×Eô¿Æ3ölÁþ3?sOýÝMÙUþïýŽ©òÿïçYulöðu‹u÷ù,€îÃ/÷ËÆî%‹ËP¯×rþ=8>.9±òùË'Ùæ[lYßÖÈ—ë?„È·/ÉAúáÿ»‡§Ññ³:ÿUæ.´f}¼,l•å‘9W±¬[@ÿ¨†Tíä𪆿 uOÝ!‹­noZXOw±1¦þ€Z'²o°e3›ÁUCígúS“qwÁËK¨%t~úñtõªË‹RýeOB!„B!„üZåâ"Xüö-òwp‰CúfÝ|TC¹zQ.î;#WÿZžïîîCž¤xê/CìeùìùY sÉv-çG Ž×ƒÇ¾œß>±1“0óÍPlu^tK¬(žáÚI«)¹ kYq,ăRâgö 6C“B’ýìËIвÒТ)•ò÷y‹ºÑ/Eðí÷n±à¡üsëߥ|æûm³é® ;âvH=`?ךp÷»þ€}Ëþ¹»›­;¬%T<$úEàŠt²nƒû¼QüÍ—¤\Nºdˆ0îO!Ã5ë½ IDAT„B!„¿Kõ÷'æ¹^bÍUO¦P?îÛ€Lü~ñër;®:ö›¸ÿ FÿÿÝ<}ÒyG1éí%ð­2zUt_h¯ã¢l|¯R—"V3DóÝêdÙÙ‡}ó©Òð>µx ÷MŸáx™¹Þkº³N¿'†¨N k‡Yt?åнYäþé×âìªè%ùç SŸu]¬#˜Ùëõª§Î[÷XD¢a ô×qRtHf…žæñøèRþ_Wæø¤+1öêìÕab/Ï_zVPLÜnã©ipé›"¦]¦e’õŸ¶SÙÙk\º£ÀÝÕB!„B!„ü0U&^N†DZ|à¾ÉXÿ¯qôoð ‡ÜÚ ŸoNGþå<«M+®äwÆž }8šÏo7Œ=j£O_øêÛÞ^tuZlXlÓŸ)'GïêC˜ëÛKfp‡€^a?ÕÞ{: ÏçåßR¯Jz¶`¶á"Ú9y)×úÑW+‰c’m(Ul×U×aJ¥`‰c ¸£é øþëõòþÊä\\03¬ìg·žE˜_ÏIÀñŠÛ0¦*RRµi¶8Æ\Ôïä±^`þjÃ+¢nKé¿Y þçG¥Ü»Ì%Èú.»{ìƒx­$rû¨!„B!„ò·Bæòÿ›h~rÂEºÌ¿þ7>é„m•äb…eûuÉâo\M$CTÿMžKÑô®°¾¿Ñ×(zè?.cñë7|ôH ê,Iɨ®I‚Zx¾‹àïç> ¯k—éÙÄg~êøîͲ“ÿÏËïÙMHZįVa l!é9[PGkró-¾¬«©ÀU49¸—µ©VºãôcµÛ`ÄóEGTýÂÀvù~¶/n¼ºIÞׄ¤±AM–|)ô\áiÚfm…óŠJµ¾ïÉ–ù‹ƒîݬRÔh™áÁ'yV Š›ü¹Ÿð¾Å."e||¶ ˜o_½ºqÇz¿KKol`¿þ3#£# '…ÒcT„ñsÜwçÓ•B!„B!ÿX«€£"Í­^Œj—ü"Ê/›*Äß Ù„ø¯ÞÅñÇví~›8¹ü*¹ÂúSràym5àcszSHqwÀ¬š\”áz,7–ê̺֘ÖAÖ üQWç²ö¿ÏPä…ûÃÛCļ ,ÑæPdhÞ õ>Î>¯€»ãxðÕš§©oªůWä)Í”wèr'”lˆ„ÔO9è¨ô—jó°ÌörµÛŽ2ñžJ¹šÌü¡È'øvÿýúfNf_}.æ ë0kŸA׉¢0!„B!„BþQøžÀ÷ìòàÇèÿÍ~+¿%¿úÈž SbãøñÇ?², .¬ðîÖrÑPÕÛ§´—x—,?ŸÄ…¤ˆÁW™õ&˜¾µß¦îžUKrbÄÄ[ÀºÙÞúÁTà˜8LãƒyMê@­*ßïÆ\nÃVh?&ֺoMX ã‡L<TXZÚú\&Ù P]ö›xuû ûíÃ{ÝóQΟ.Áåêë…x³hÎ<€_>À×±¦/E$‘‘¨ã>ùµ^B!„B!„?„üÒGü¢Þ9`§fœbèxçvûù¥}Я\Ië,…ü8åäz•öS{®l™ÿâ]#ÿ!žKжúôšÙœa}ñ&’’ác|½4€ˆT9øVÕî¿:ê³[•=ÎAê*"Ÿ©†ª»3æÖN ¡¨º™ù¬T3æzˆ÷ßO’@~\„-›Rg¾?åFìÉ•”ìGWíÿë&ÏhqpÔÈ{Aüš`¨¬I½–Ñ PN1,2;ÇS³Éí~ù¡Lk¬—Üõ£ Ò|³faŸâAœÇ—'°”Í=ïµíÿ¾äØóQ‡jþ‰B!„B!„ü“ñ“»,N.µK­ú1¢kß ~ú” Â#›A1®«òßæîOwýßWÉ7;ßã _]5!ŸòÌ2ðãwÚ#€»—¢ÏAÛO¨õÓYŽŸ§*¢ù"Ò¤ã3=`×Utèk¨H ˜@±$3]g»=\¾p"lÕîÅÀq²Mî2;¾È%mSBsþ²Ÿz$ÜÏÑg¹œíÑÛÝAùwbJÇ I/èºçÂ<rø{’qýH•¤O/Êž«^‡SçRçI#S‰$Ó±©eº·f_Ãz!„B!„Bþ™,R?r]¿¿âmß«ø)øî[ŽáJ\èýÇVª¿÷`þÔ1úcpô9XŽ?&B>YOB¾Æ$äE¾¾w„F|Ñ@ªÌÅøçÃmž ŸG—X·*Üñzµ@«ˆ«ÚR{>ÙÄÇŠ«mùÆ,‚Bn0˜­åÿµÌü^ÈEÊìUü9FÍ1äÈpAsRÈßM .f}w,ł˓iñX”Å>÷d°ÆÍ—q7_â¡t-tž ¤Ý‚dÇú‡"¶Èµ§€»·†’´í-i 3 ÷ÞuΧ û^\ïðýÔãÌHSðaM!„B!„ 7r4~[®~: èû…TÎͰ÷îÄǸ?ÊÁÇ=N}7¥ÃG¥~™gè·køk+OÈ™'æðê‹lpÝ¿s_iˆxwjý«Ë‹RJzëJ av£­ß±5[~ZcÎîf*ünffn¡RãU¦e77>õ ‘O«qñe–:1_Ùäý×ÏE E»/ZW~\ˆô Lò5ŸÈ7Ízú¾,Ô—DךB«ÙבÎA UŸLr©k"FqjhÑ%¥efâ€Â­Ï¤?ˆÛVïžÆõκ™éÑ6Íœ0[îšåuðÉL!„B!„!~!ú¿#Ÿ½{s \éç+~s)ºÒù‘kA!lãàZÊL ·*ÿ‹5‚° €üEžæ¦Òbšm¯Õêéñ]ó¬ÆÏý'ÁÿCaøÇbèªâ.½RÞc’7'µ¢E“’÷ËEk6¼ ‡¹’ój¬Ÿ£ÿw_ãéšÑcÊzFýå!Òs™L©Š4)Ä¿Káçôâö¥¸ST¼GGEOý íAR…ƒ–hièÿoÞàÈEÚ _Db#į:-¦8 vq#ò:T‘ù)wmPÿ$¨Æv–ÆÜ^¯÷ÛwDö3ÓÌ>å8—Fš*þcøý.ö„B!„B!?Ì^ê¼­¸¯‡Íp-¯/' ã18…ì};û/èþã6Ôseƒ¼_/.´Œð.eBȧŒ€uŸ^¸L›÷‹6W#Wa›<ÍxVÜ£[Rœf8[ËæÐÑÊÀlªßïiŒüyRº/ ïub¨‘“šMH µ7´EÒÏ ™Ç—`Ùn1ùgý>NŠ@Çà{‹v¯Š=—jü›üÈdóÇw°Nþ½ÂÏR sXô(•'Ed/ú-ÎÚüÈpô9«ªCh5‹D€»GzÕQYD 1ŽE‚4GhVÉõz­WûZ¶ß À"•Äç4!„B!„BþKÈéß~[24“vÿ2&¶pÿ½ŽPÙ·¹í­ WRBÇÔ‚œ.jðªa‚1$òýO—ºþÒ€è Ìýµ¹!Ïþ|* î°×ËÌ0K‰ÀM °‹bþºÑÄ©>6:&„B!„Bùïr¥tõî1ôïÛ÷Šü»nϽYñ2¦ŸÚ®‰¯æÏ¨ù<÷訩´]Y]g·mÔˆ×è轚Ð16‘ô4àMcUUíR÷žÑÕG†˜Œjü)öã4@VŽßT·wãË@vÊé\]W *.È\ˆ¬>¿ø à%ò"î§V‘¨a_–ëZ|æ ¯$û1îÖ–Aif;™'_Nõ¨u#21“B7O?i©“Xáês7}Èé›y ô´¤Z*ÆMBŠÉûn½u7FžKEþ÷zyî±È'9“ÙkzºüœÆ6“0vØ@!„B!„òŽ«¢ûã‘GÞ}4”1'ú’öÎwñ1?AÈß…'s+•þ@ tÆ- ûa]s-²ÑÛO¿“ÁñnR;›ÓFÄ!c@TÕëoxÛ9ÀC¾¥ 2Yà€ô¶€ZÒ‡i¸Ç†¡.Pså+=«¯ŸQK"¤Œ_+'©ˆ{»vº@yôrkf¯ƒ½¿ŸÃqAD>îXF¨Z=qªPLúd£Œºÿ\î‹3"6È+Ä}DlžOø—wjX^»Ùò$©ŸRÕ0@öLÞ¸4¡Ö‘ÑŸå™uÂÁápç ž„B!„B!ä Kqý•ÿ'RBWÒ=y"ÿËaz׬@Èß‚gÛ°=¢í±Öš•UkÅ}ºÊ¸ñ"ë“[>"øp4·XÃAms¨BáUõ½†›Ñ‚»¶´H„xWÏÛi³IT'r!´ˆã×Âÿˆþ/•ãó 15!pøºW£óQký}¶)œôŽºÚOôã´þ=YÓ0 .kíö¸3oJ‘Í™S(ã—ÓY[8½wglVÌíõêj·G}Š»¿^‘Ð l–eIk豆ÛËÛ^öhS½ƯW´þE‘ò„B!„B!$9Êæ-‚¯ì…ýB ÿJˆÿ«)†{È?ƒ'€à>ìþ­ô;b¾_ÚðRËæ»º;k1}u—–2èê1’ßÀEÍÆ#«%–oß&w ŠË]ÂëÀ9Λ¥÷è'î_^ð¥DÏŪ–N  ”Ö—üGé«XD—æsyyq Äc#ˆÃ³·£) }9˜/'ô†ľ€ç¥‘Þ, Co õÃÞ/§æ“|^bÏ«î:Q‹)E·XðýÖØë…ÙLaÅ,uìºøŽè4‘õk’á¨Ñ·6ÿ$B!„B!„ü.Žêÿ¸~ñ^'äŸÍ³•a+Ì,ôÐ3ĵïqÜ^\ß‹Ÿ{©4‡8¦ÿZí¡ÿ}]º½T÷Æ@ޝñûþÉ™ß眑Ü*p§t¬ö©ŒŸ'½7zõy>E&HD-¾ÜªÎ}ˆ­Í1I™¬·³ÔŸ»Ã°Ì+>–嬘ÒøyLws‹×׫/t&';ÜõÙÙó9YËï³ío¿5æKû‡2Ѹ¹åCsV³rÍ4eŽgÚÀwN>5h”[ä¾ìľӿ‚ÿû¾B!„B!„Bù1žÝâ¶rk÷¢“|`f!›P×ôqqwˆ½¼ÇY= ¶G¶õ%ÑEèð4Å]Káë\Žò8—ñØŒS·ºò× Àãñ}[KÁ.·jöéu¨ÎcZÓô/'»Añ”iõì“%L œ`‡rKDokuv|æÝq·ŽîÃ×Üá^¼-#Qã²Ån¸Ð'IŸúÃÜǰ4`‰Õºû’¾×Ö÷Ô¢:õã5~ïàõz]Ï-§©”Eœ?dîKï‚t¥š!n³·nŒà¹·ðøQ´Ç{éû¾°¾Iö¯«±Y&ÔÍ4}Ìàp+zýîn™†é»ËKÔ>›&Ü]{žji¨NÔÇþ†u©ë¾ü*s@vŠB!„B!„BÈä™Õßêí—uÒ³7l-|ÏpÑ•6Ïa'—|ît)Ú=žÞÁ£ ‚Ⱥ{ØÞӢ̡½#®]3'„ñ/.Ñðt¥mÿÌþ…ö³rmV\ߺj¿A¡ãõõ*y¿¹ôtPÈð¸ÀÜèºþe’÷™•UzÈ'?ƒü9óLÑà™Ë‘–2 íü)Çç)¢£îÀ“òéªQW6?¾$® üëø1zÂȾøáÚ¯F%„B!„B!„ßËHd|v Ás•º§jµö•4C¬û´ÌÀx^èÊ*áO+%G}—9Â;äü›š½™™[$ZóÂ.¦Ó1w)Ž®Ö"Ì-Ìmöª²6uÎîç.4 ðš.ª>bæ¡÷#'½š£Mnt·kE/öH½ ËYíÍu-Ñ}€U‘&Ïâ:.¢ w1Ù´’²è¾š4,—0M~^“›ËÄb™ mxYÑØŠUk¹­a~ñXt¯­öÿ¨Fî³C™ÛYÇj#oG¦§d?†=„B!„B!„æ™ÁÊ”¤Ï(¦{ZkßÚ÷Rl~ßð6Z;Æ­¥Ð=Ï!\3@5&¡õS%K±ÍpÎeôKÉ…LïÖIt ˜™5É{UqˆÕs¶-Oô%Zü9UeT×Úó7Eò'±ûnH”ã»—¼BM_,ž Çü_ÛêÖÀÞeÒ¯ED´ôpô“‡ZPdcÜÝlºl¨Æ>È‹|kúR½}gÉþéž„^’õŸe[ëyUs—v«cF„B!„B!„BÈŸàYY*ìg¼òc„5£Ê¾©ó7±t§Õ)=׆/EÙÓ¯=t:|b7kY3Kaˆ£ëïXèÂc²ïnÒ4õ{É>ÒÖan)wSZ"°+Ý/ÑíÈÜÚ6º-渰c8¯õû#D^ÃîÝȶç'¦ú.Ý3—ê#—1Ï©*fä—yá¿À®h´ÜåÚP­æt@4%H˸¹µlIJmZ‚¨;U¸à÷YÅh]RˆKu’ÍMúÒ dDü¢Û 8.û~íá¦}éPM!„B!„B!¿ç…ƒküÛ£°½†{½J—Í/‘ZE‹_ºû,×î%2®"OCÏQ5³PtW…¨ˆ«EH»'öòóvÖî'¬(…í 1YŒsyî'æ| šÉ*ˆRã(| vÕ !=í0Ý^¯ZqG( :9N¼£<±:ƒ‘9ðjë0õ‚,qðÝ:øö®aëi–!פ 3‰]ç]¬ÿ¦½ 2!­ç¡û!{é5@Qòk àÉ$ ýúÎ?™3ËrQG©Fý !„B!„B!©`Öü©µÌ©ús÷EOe×»¯rùá=:úþÚ¢åc¼~îe®CµãºàÏ"Úƒ" „^Ô53<h‘t¤zûî[ I·b)ÒC¾¬XœU¢T„ÐK¡¿¼×RUéÆ 1ûERß,³ ý³úþ"Ps¤ùèŠbÖÆ‘!ʯM gn_¨7ôí‹ë+‚iáÚlC½GîÕa øaRf`î¹:˜Eœòdˈˆê´¹Ë4tÜ ƒ/ô¾û>!„B!„B!„ßÍ=žÚãÌ.›îJ 7µ}”ðhš,2'[ÐËüû?*€Š¸{ÿJù÷íáaøkݱ7ÂÚ>ÖÂr´ÑŽÐr èìYs¾DÿûÂæ‚¬¯”•Á¢H–eÅE†Õ?`4|MèèfŒÓ&ˆ+ö®Ýo†ÉuyÖ2º°¾U‹í©†·«Æ‚u‘Uc„P”¦çĶøÛþwäÃùB!„B!„BÈïà¹øè.= S0Úš} oŸ>q*àv‡Ák¶™¸ Ó€4Ua ®«ûî¨èHÔÝ·`{Õš™OEún€Îeþm´–€¨(ÔE¬øÍz !û*ùÒ¯t(æDÇ Õt+Û*Â?>å݇ .S¬ZzÿNgÙ£Õ§;˜'ê*ünfªŠÙÎ2ɵ›ªÃBù(£tTZ¶J½õýxSóùZrÓåµ{MHl{ê°Ïšx‘Ÿ·ké9èCí£ý.ôÁRójÛ¾"ÕLxúâäz¦øPÍW1øO!„B!„Bùyž(5õn^ê©·°{ijÓU/jõ›5혎X¶k×{~´Sµ®2„kSÖAQ«ÏØ4j¨ÕÃøÒÌ~«{®— ŒW½Çê[T<kâDÀª:q ™™»¹¹›ˆ@‘•PqWuhˆÖO)_Ó9½09èãcŽo×ëýª"IØÚ&R| ‘e)÷Ôg7€ûŠõyWøIügÎ ‘}Ä,ú5J4Ýê°cÌ­ÄQ…¢p³ËçJv#›³WÕµ>]ro¨CN§Œ‚ª”Lƒ³üŸB!„B!„òó<Uý£ŒûÁÂúÞŠê”ø};ªü°šÓ^˜·`l–TguvñADôwÕu;•~«Š;Dkáö~FÌSÞ ÎôXŸCÔ{GÔßñr3{¹¹ŠH«Î‡‰ëë"òð0$ìóx·Ö"€áƒŠ*¯²'~ù2Ž.¬2‚½ÅÇböëMÜÝC‹h’ôVoãÏB1D{”¸–Î7ã^ssȈ Ä\ì…ïw„.Sä‘åðb”‹îý[\ ¦kÏJs”DŽÈäU›»¿$uj~•M¨m‘v?–ê·SÏUöÓ@×–º_ó"Îhddòò5,•·ôWQû/Cݺ =¡þC3ÎS¨ûUjB!„B!„B~+Ï%:y£ð¾è¿‹xUê²,³÷êˆk£ëóøq4\ñÛÁm€^¥]*Ä—A•ü¥X~9ÅÅ3vl¦·c†"+€ƒÔŒ·4ƒ™™½ÌÍ\>À‚2‹å¯Wš¡oo{Ù~íÄ8 4M±f3ÏhüQ;èê$sqÒH@TÝ,n« ù{q4‹ˆz»˜eJ£d FÞ : Ñ:ß­‰—•ÜìJ?7_X=·}¼~tÞ*“^Êý÷ã* ¥n4]-%!„B!„B!ägxÆŽš*ûëÕæÔ !áâPt ïµôȪ ‰Ü÷kÿ9Me½4D@¹0ÎÞ"ǧRê93!]ÿGûø£L'­˜ŒJÏW-®MÛ§ ÷{V¸±š¡£ß†3kÚ=faý+ó‰öN…¥ £Å¾ç×ûe;_i+¥Ãñ~ã÷UÜs _+·Ï¶lv,è7¿™­ u¢õÒrÐ:e²DE>ȯœ«‹¡o_$í÷ÅD`†ÜXSD2{&;{ýRô;ßÌ b³¥4Ëÿ !„B!„B!?Ï0^Èàf/Z· tªª»?š½mxç6i÷aN‡LˉqÙ 0×¹—ybþy²nó‹ÜTÏ×£2~J»´\ƒãåîÖjùU"›©)  ’º0Ù%‘/<Äå£ò=œ_®Nî#ů×ëñxì #§EëB;2Ûã¯Òº›»Î‹¶¯|´8¤‡ÁÒJr10fÇãÖT"äaÜš ÇÁ¢É>M·É=³PÃÞY¦v€=­Òò""0v »‹Y“É:vÒB!„B!„BÈÏð¼{ŽˆŽ333بÊÿ8,jÿ{ýuÚá6©—1Z½.ž«³x}ÌÐéÇ›0vv/iÏ7µç&¦¨qÑãϪ~77HëHÕ ¬—ï½€CªÒ‹Ê½»ÄÆ(0ÕHL:ø­]Bjp{Wà Í"÷i•p‹—Í›ájÅp+Ç4NTŽ»ªm/i€Ej«QÜŒç9‹ÈTÈìZÈOïåq°ûµ{€¶GÓÇKm+ªbn}ð~§ÚMmþ¨~#õÓæõB¹ó„B!„B!„òÓþzY¦[†éq÷–˜>:ë õó %€!„B!„B!?Ïó“ƒÌM|²åÍ€føì:ïèãÒ0(¿Œ é1NšvÈ>ÐÌ2½c_Âþõ¥Z»œE`#£ªñå¾ìQuี°ö4¿96s(R3& i½+ ÕD ¹ÎõŠ^/‰Àôî*|µ>Ë‚,ù’zO::c£|Þ7Á}+‹Û»+|N*´c­¿‘·³Åñ˜¶Š¿–"uFMÓÉýÒàÂï!4zý~[èì5ˆÌ…JžËÝM ež>ËY}rC&„B!„B!„Ÿâ™[ïqRñ¿ \šYTÍßqúTAŠØëU÷®­ñTñ¢–ß—-œ]¨C½e d/!rIïõÓÅŠCEEÑü€±¼‘ëh£Iw&ˆk˜Æ…ËJ^²#îþúßÿÂXU#=P&¼^HüûƒŽóÊTŸ†ò±—¬š8j@ï`˜òÓâo¹‹æ%ðx 7ôS¯YÀ̇+DD>‰µQÓµ5XoWË¢ÑÝë²Wå£;´¥i– M•¦«Ó”‘E"øhUg`ŽX»Ú‚1$˜D¢ÒÞÝ^þ27MOæ›àþ£o·Í÷«_>>Þ÷%2gMÔèÿ²C1p3™MÊ„>ê…¬w0æ Àkº¥fÜÝÖFŒë6ÿ\›Nâªm¾Æ¾#TEÄB!„B!„BÈOó\”壢|„2M¼—/»xµ¢E¯(ÿ5a™d•¶O9 Œ0³™)â¢CO(r7ÔApw¿÷Ä%áÕöv¦ØÈúÛxöªgoæÒSE´—ÕGºæµö%6¸X¿D-ª‡šZéQpõHÕD 2nË}—„{›£™eÈ>ËÛ×äÊ®¦:e¹?×Ur¢úæ–›;(ù^S‘KGhÕ!áÔÆVÀE]Ýmkh膽ۜóîÕŸ›ñoö1t! +×ê¥{AþÚW„B!„B!„B~…§¹E9+úEäñ[D¡¿œÄñ“ª?s%Ç_Ùmc½K»¸»ª¢zùŽ{Æc%ƒÑSÕyÄÿaK¿yÃÎÅfÂK±zä’çhµÿÒ ½­›¨ú¯ë« À$‚Ö㪆£n™UOEe® }(\îöz½¦»`M&èãŠû&Ô 7ÇI6U”¡¯ZJ?ª}ñqÌÚ=p9Å‹½ôî*ã šjÿ¸«ù¼¦]çgž¦tû^Ïí×ïu¦¾".âÇØÒLÀg !„B!„B!ä‡yFü=¢ÿ“f Z½7Ì×&´Gl:<ÕÚ7ãÔGšAS¨ŸDÞe:¬‹ØTà®EhörK±sYøÐ¯¹™Æ®Ø> †{l,6 ?\ ¶ w[g53Ñ¢E“´N¬ÀUÐX¡UUÓXƒå^ô„Êz ’b÷ýåä|à ‡d¤¾#Þ½yóÅ£s*õ·z|ý–\ ô{¿.o}5Õpú¸Ì ñïÒ>ñ¯<ÉQKUËâz†®ÿ³Ú]dêjöN&„B!„B!„Ÿã¹¿!݈m‡vyT¦ß¨˜K¼UUUz@~—p™~@W»©ªñU…&rRu½ž pˆ·à#^âÖ!Þ¢2”÷ÑcÉÞãÊfáê»ekò.cï¹LÒ÷JøùA3@¼êሠd_¤€zñ])’‡š=ÜC*h½þÞ ¹e(rʹZa#œRþȼ‡@O&ÉÝÿ8äGe¡aPSÛV‘;`1>^]þT›TÆY[QæLÒrb^RéS>x5WÓàL9ãÿ„B!„B!„gJ´ÈqÒKØ¥ö’{ÁbèZe¦ˆwÝY‚§W¦»ËJdXBí#¨ê½¶{ADòÊé§FÐÍ÷Ô{êï÷ DXÂÑ÷ÔöÂíJ\Úµ zóZö“¦O|Ê{Be jg½jØ0´ëE¨Ÿ5êEšûB–§×R÷e…·„B¿R ø¥˜ ÷µ™âðñ’ö®…LψðŠV€Im¿œ÷b2c½UÈ©Lù‰ö¡Ï|†Gú‚úXWL)ñ™Ì(û¢EùKËÅžà „B!„B!„?À¥~¿ëãqébü=ÂÜô^j,9#ÿá%0j¢[ô]¸¿J¦ DáÃ.7BÍmî§kÿNža]ÅÚ.p˺{„=´¦†œ}gä'º¤‹•ˆÿ¢!ƒù¢Jîýå>æéÆñ¿îUü#)‘æÇC@¼¦^Ž´XÖ³ç¸PGµþ´7ù•QƒŸjH¡ý¤ªÒ’%‹z}~pRÅAö?D¼^¯²+|¾ô5¾/=‘°o›Zþòï©£_Áª:…)¥!^å¢ê°]éj9ç¾MJkZÞ+U2^ÿ'„B!„B!„ü1ž(qÒˆZ\z!„/5êq—9³‘ÐZ÷)üZ>‚ÙN #ø> ÂÈIÈÿôk©µWQ÷×¢Ú~èØÝe}š^&+íEîgtˆˆ<še[ä+ýJUªÞ.¹» Kkˆà¸ŠT‰üè¨hÜzÕº>ÊGân“q9ܻÒüõH‰¬†H´:4…¨Ì:”‘‹g²_tZÇüT-Ï?µ/_ï;%…ÔR>çÍ>ÛŒ4‚N}ÌOì«7-ÔÈù–c"„B!„B!„ŸæyÍG|YÚbš‘ð¹`C¾êá#õÖED›ÝêA2hŸJwÔÍ(»_™¬öO …–4u ñz3—Þ·ÐâÙª€´¨ù<à>~[‚>›ežU™ÈtCYÕüÓÙŒ¬G­}\§ªh 4«*Ì\µÏX Òü jÉ{Ê@µ‘I€ˆ‹¸ÙæíÛ»#¦°|°Ë£h÷ûì=ÜR¢8`âiW ývïªPÑŸ!s"!ÖÞ 1iî\Dÿ±šëúrË"ebÊO¾˜H£ç[OLé¤úŸ]—Q;ú7‚ÏB!„B!„BÈæ 4M“&OßuxzÉ?´—€ÇkÍþ!­z>ˆï‰ƒs[ÿA)³AØÓ‰ÐãÆËx\¤Œâ¢åâîqxó˜çYÂÜ'œˆHç(ªŠP Ý¢]Ò(#î¨éy@¡öMNcÙVöÞu)A÷V›ŸŽ sö Õ­cþPü[ù x±CDLµ6>´ÅYö•ÖThšÚ¬º,éjp°o­,êÏ·^¯pA°"ÖïŸxʶäÁݽwDÅ)ý#Û|q5ìbu@!„B!„B!?És(ÀŸ‘‡ª*ir¦³ª*ÅŽU²]¾f®¦Zð¾ÕŸ/µØ‹.Pr®=¤"D *ÍPfˆ»X›šKÓ²æÀŒ,µ‰|iY‰ôN! u݆EnM‚„6t¤ÉÛ .%ºí=…y)}K:Gr¨H{Ì7±ÙmÍGä1âÿîWÂSŸ° ýï¹·Ã3 @!„B!„BùažÈøDüÝáfÀË=dì»4´ýâ©ò¨‹÷a¸[[dHÝŒØèj9J;²šà–[VëY‡¨B!íúàÕ¶{—°õ|½]Ih®‰·Zïro^q¶ò®ôÓf“ÈŒC l—¦u³y'šy¥úF¿ç*Ó¸L£ù"0” B="ûÊLÑÎ0üx[âGú=WÕ÷žçòâÖ  ³lz8_x형|$“ªOð—úQ°;KB!„B!„BÈâ)"‹Rî¦zqw{ÙK^±o±^ò­þhÁÍ^~^¢¢–¹>¸¶ÿÝ9Výß„V—òï^ =ì1‡£«å@Núà4`îê÷sCTÊwi1Zq÷nÙ×AÌŠ ì|3¸_ÓŠnÆ ÷®h_Õp¢C#ãÚÞ­ ÞUwz¢b¤'RÊæx[ªPþ_ŠÁ¸ý8w_nϸØ8XUT‘j˜µŠýÖ©!q™Ô˜¼œ]4º0t¤Âà9g¼$5æÆ”¦†d†‘mBÍ:զ޷ T˜U¤ûå5ËB!„B!„B!?ÅS ±ˆü£ÆÐÍ^04á¨Â —‰… ºÀN/Ôö!G?£Wª;ºãíRÙ}T©D„<"¶ùÊr%'_b‰ˆð(¯sŠ#ÊëÒl‡//f&*âg±øeÂµð¿†æ±Ø ÜÆ”[Þ§)›!ugÞx;D…ºñ²§cªKð^_ç;¿‘JD­&¿‰ü ëBµú|‘f—îͨ|UÎi+œÉŽ¡¯ú<%“4Êø}š ˆ¨è´Œ×Ñõš4’ô®¨ª¿/îzç‡í›Í‡DÒØ“+ò¼ÑþZ; !„B!„B!„ü Oi¡QqSHW|˜»f/w<´ ´tAý%’  TXýŸ/s/ú¿±×óù$Ò:AÿòY¯õîE‘¿Õø—DÂзÿãð·uã.›>Ì@S¾¤I ó/@uâКh˜ÁjÌÆÈ½U@<ôôÇ$ÊÁi)Œ±6w¹º/Øò:±Û¢ o™W1¥ôn˜ÛJz>¥­öC5 ŠÍÀp–†ôËî¥;¥å®R¬©™̲H=‹1§«¼ìs,›ÊBÅLâŠ#kB!„B!„B!?ÉSE!piZ7SPÕÝàâ"7ñ*ëÓ„þçºxdÉxg‰SÏ¢2‹¥í°^âø»¼fÏ€“þ\%>.ÇîKaP­b/óܶ[252«öOÅãÍ@¦±j ¿ä–Ep4—Üñ^t,·©Ý…£×KÓC™ÕxoÄÔ»öÿœ73ó%ÍÐh5õÛýº¾#Í}º+û7éÞÎhY„·ãÀçí&ÑH @H_¹@½\ó¹ä,xv¾x¶zôÏ­›ÚÝ››4!„B!„B!„ü$Ϩ=èêôbqUÙ£ó»!p|(‚Î9H Ýö m$0EêCzG¡û,Gpü¢|þø‘·¯”ÁK=kù³†â€ÁÅ‹¶|ŠÀ\ÛÕY¤Šfùø!FÔO ´V„’_‘ª34>>ßÇIãhÄðËåúâ*\i¤Óº¹»¹—6Ôsuý"7³Já¸Ç®p÷4*—S2¿»yC;d.Aé%¨+­Mœ*ģРPÕyZÖ³U@wd@mˆ¸\Ýß±¥·»L!„B!„B!?Æ›€µT¼³DÿÛ±ü¬J,89$^–h¸‹‡Â;æ(m=/z-ù\>?BÀ5Q‘3¹ºŠ÷‹T£áí_Ã}W<Ôe2k ¹¤[ÔHïÙ>R®aÖ‘÷Ïæ ³Á3ôáû±€½iC\Q•n Ü眃÷ÿ”•†€zïêG]•(ý¡[x>þ#aZcŒ$O³vô¬QnŽnáÞ½‘7{äöß«ÍÓg'Ûý\‰clMeôíqõŸ{5š¹…ûíÑ.ÉÞÅ¢£3€¡B!„B!„BÈŸâèMý–ƒI—&}rOÊòè¹TŸ3ÕÒ ŒBd¿Ë8 ýûo¯ˆZWƒ¤}³ûÈE˜§º;b1áô„¨·[D"A¤.îRÞJ=Ÿ2ÇÃýÚãé"ØcìÑ/2‹Dͧ¯M*Ød¦ö ¿ŠSUoåh"о‰æ1ï“a„B!„B!„ò›x†TË*ƒ³WYŸþôü9ÄXTýñÀ$=?ôÛ›¡k‘Z—¬¡®gÌ.LV]þ½]Dr– 31t*óØ] ïÌjòRtl°fJ&Þ¥Á穎Âüµ¼½ÌVçÇAJ¨|*ÂìrtÖß)¶^ý 1Iî O^7¨ OÝ:aþ÷¿ÿU‘ŸØië«Í­õá£dOoWˆ– ‡äÜ™ZŠø—!uëbü™w‹o­K’¬ÈFµTJ˜d† ˆVB!„B!„BÈ÷òŒåAý."tÅòÞÔ_D°*ðØãѤÞõñ¨Ö²‰}T·°i¢²Ø ïÖ¬…áè›K¸ADÄCçˉj*¢¿—uëDý»ÖwIÀ]j@³ßÀ’D«†TO“¶Çä¯<ß”%sƒI)«ÿl³p±±¿Ÿ†šäƒ¦¥w—0µ5¦i™‰uÙ{Üó­È i•Jo‡q¶1í¦z.ŸÚ2Ýz\öm;}§½¶ÄN¿ùHN©f n̨ !„B!„B!ä·òœ‹¾w}•Ùõ·%BUi™Z?Ò«žÿŠ ´Ûä QöŒé Zyµ¶˜i¨Î¿‰àOMMZ?¥ldò.ØCäÝÜX› «”oø»qqœ0Ý¢ª¢¢x¨¨‹Ð&x3(ÎU‹Á«ïBYkDt<ÎÞ¤ÿÛÇÑ­•Gù¹umúUš þz½Ü]D÷Rú\‡—¹ªH‹c1Q¨Qï^ìŸÓ+`’] c±·lÇøw|<ššÂþh4È~…5_riMñÁƈ@]«˜À§£ø”ЍîÊÝ{?Š”ïÄÞ†B!„B!„B!?ÆÑÉÕM7+µw ôùSo5sW¸BaI;mAÿ(üwiAûâ »èÿÈH7ôÿÖÒo¤%/ºRN2åmjýfëa*Ÿ)§•Eõ%_Ž•Hˆ ™ýIL&‚þ©2”þƃ1¿ /^¹Y·Ž+e¡}ý¡ð—«º4í@AVÇ·²ùÉRÀ#ŸqyŸw‚ µB¸™›™Og\âïµ"~/ÌïãÝ\iÞÕ”¢ZÒ<¨I…¾÷,s÷úSÓf/µ§"‡ef1Çå\„B!„B!„ò3<íøËHhŠÀÏâû2u´p§y«ß÷ÿŠÊ¢(3Dã% z´Z¹…<©›Þªý³Î:mlGÐ_šØÕþxëñx,'ÙÕlƯ‡ÅªÚÔl†ý'_1· %,$ƒVI#wÀ sH7ÙMA$•ÉP¡N©Û(Ô›øz½bñ£Maö«E½È¸ç¯Ö‰áfS¸Ü×sµÛ¥"F×.÷ŸÆ»h²?KÖ¤Mïõ²ð]È®ˆ9Õôâü"¾¤=n’UGv‰$„YEOT•¡cÄÿ†8|>Ø—¾4Øà³†B!„B!„òÃ<ã?ñww‰P2îC¢Eö>ªýÍÖ‡%ïq‚°–”¾D=T€Zœyª·ïŸìaû¶ÙRi4ì&"µöÒ!UÑN ®>9Þ^É»-ï—ý}ÒÏ0·¶^ˆÑR`)Z?ì|Ý )ܳªÙ…"Ü_Ï+=R¿g2dÝ·VŒ§îrLa#Ðû*zP;/!^/Ñÿê$¼¨âT›„ˆþçT» EÙsÁùb· ¹YDz§ËÅÔOМÖ½½Ÿnq-^;cÖc0)},ü'„B!„B!„ü)ž!‚S±vD3|¼²§J~Æ‚»H½D´="Ú=X/K„EÑÅgk†Õ¶¨„B>ŠžO5|Ý/ÌÜá&‚ÃDP¶P¢ÿ"’®ÅõÂ1‡p¿KDÃíeÑèPëÇÝÿLW4 Q)3÷.¯‚ÿðæ:{tî]îN¿òÉ«@E3î¸Y”ðýðc(N¼‘“±}Aãþõae Òw5œª ”áõcT=Œ ¢íð’S¨‡­÷·(Q9š–Ô´Dyï¶¹·zü}‡Ï{ò`Û[ úîê_™~¿ê±îÁ2Vl „B!„B!„üžÆ&ÓÀv®FLÙm®ºQ\ ÅmM-È›9‘ƒ«Š¢«E£€»aÔû7'ZƼɢßÍÑ@ "PUAõ#ˆ°î"ƒY¹%ÂÁ5X,¢aƒÕåSEÿ…1¯ªF?B¬PfG"×á%†œ=j¯ÃRl>æÜ?ž­#þiŽÄwè¾ÿ,"> ‘ëÚZD÷#ÏÓ»\Ä.îØFÈ_Íl¶8ž²Ae.ñÁó˜îc[âe›ˆ¯_Þ­¶hÙ‹KWw7kfÅý¼²ÉU¹;Tó­8;Ÿ3„B!„B!„?À·V«˜kÏk@ ާ €g|^§ q¹CÌ^Ñê:N­$¢P‡›¸À—Šp`s÷H(˜ÙÅü3jlGÁGýxD‡­Hà´ ŒöïúÇibn†èÇî¾*cyñ?SäVéñ¼‹Q>^fJþ­:ãWR{äkSùáã"80†R÷¯ÿëna1tên£cX!~5ýsUu›Mî1?á_t Ô€›y?Æ "¡ìë©kæÁfß÷S5²žã!6kÙø/"ñÐÓT§¿%£` EÚWDô﹑Kl@M~ßû¥H³8Ïg}ùs˜¹™ŒŒŠþzy½»?¶Ñøxë¤Û8eÈ-Ëøë'„B!„B!„ÿû@æ\ Óq¤Ñ:àHWÆŸç©G6o©Â‡Øí*h€¢µ†âªo¡¤Z³EP¸›/íó݆>V›Ë>ÚÅß×/~2ÅÁáÆ“ì^I2ãjG+»Õ3û úc–¢ƒ›§Ò¹¾é•¿ jm Ï¿•Å£ ¨¡¸·¨ÛônBúÿŒT­ïÉ‘½|èÝåB)–+}©¿ñ`Ó‹È­µzþ­ µåäÄÆùd£ŽÐc“ûµ,êdBõW.•þ_Ïq{ûþð³>Án!„B!„B!¿Éç?&oÍÔâðpœ¡Ó’¥JÔ’Mâ®Kƒùô‘—îYÿyÎøU\ÞÞL'È¥[=½Ú§P[„]9Óˆ÷ÛLéÿÅi–!ä°®±,“[‡eB /†ûaƒ5”øÔÖ«ÔœÃGÊ –¿¦[”nÝíLhˆçR7îÚù^Ï>£€Ç„…—opk€Àã—3½´ð¿ÞάTaI±Nw&÷HöeçÑg,dìšÝ^éïT½ž¤@ÕµgÙ†ÿÖB!„B!„B~™¿,xùÿƒ=äÕ×ÿ†–W1 ~ ÿ™*Îf×y³ŸÖTõ‘ë5Ý£çvkØß IDAT¿Ê·éÖòýf®“×ÎúS´­âøz¼û&óz×͑ʸ”RÈ›AF €|_5–Ïúˆ™e +#ù6k9œjpþ”»ZB†GÐm4ãçÐ@(ìµX²wo"wW G [åE2\wÛŸÍÞÇ õ‘4±}XTýåJêÿ(¼ŒÝ“‡P/ÜŒÓÉÛc j*!„B!„B!„ü¬íÒÕþ%}ê#H÷È–•CC?RdGœ@ö€‡0Ru¿ÊtkQSmª!2ëEÀŽò‚¯‹©íÿyícaõúò¬Xlë÷•3lv ‚•’Í×_¬K‚»=<}„$­æ±pTæÎÄöç|3~JK% ‡%®lÓX½ziÁ»2®">=ó°µ]þÜsGÙÕ1§ÐS…ÇË7@Gžôä<ŽêBcn­53‹pYG bËÒÏg{,Þ]’Ji%ök-¶È­Õ¡hŠˆH`u¡üO!„B!„Bùe>×êÔÐKcýðnÁâ ƒUýß dªVíã¬î]WU@‰ýÌ]ä57kU{žG}žRèžîøS¿ÿ¹õþŸ§ôZ¸èÚófµëÌ"†óãÎäzrI— ‡ Ä›cLßB)vD[ÁÆÜ¦V/‘˜P ¯œJú‘ÇÛ]ž€ó{ÍŽ~=ÿ°â1˜Ô…q²§Ó¹(.±œ(î¾¾·!ýÿüüD@"ž74^Í­Xm¦b|¤&,3ë«Þ7¿.PÃúëÀl!„B!„B!¿ËgÈèÙVúÒÿlsÿ®0g+z[´®ê@T½µÛ›5±¯UÝuö¹™åúN†æÆåc†`ñï—Z·¸¬ýÅ*iý…å)·ŠÊ·u ¢Þ’Vù¹¤åò}–`: é½Å~ç•ó^ýûcªWO™;Ò€ËØDß`l f8lð±5óÇ'>UPU…@ëÄ`K6ušX̼ë¨XkÈìâýõÌÍDÙ¢Ìc’cFJà˜l¸Z'EúEOv83!„B!„B!¿Î1 —üÐaã¥áÚGó|連/?†ýËp¤ # è*÷þ«Ðaæ­5]ÕâYMÈbY¬`w1Â*¦Ï%¡·xËЩ[k‡Ò!;ûõ¯•¯k|28Té÷ÔÞ>¿4ÚZ½x™4Ày¡Œã½.¦Îs„úkP¨{–il)6üuŠBUÅEŸGãba¬${!×vûXS ÜÝ,ʈbXB¤æ+8\戆ÔUšÛøp\Wf¬t½ñÓWª¼q›düç†B!„B!„ò›|zöéK‡²d§·höúÔK„,.¢ö+ç¨Áèö×8#jC·›–€,` wõ嬷•líÛá7ßmè}7?{ðsª`ÑKMUÎ8Ù¥¤rÙ¨át×ÐÏÝuË–³Ét²q31ÖЂQ³‘Ëã{½zÁùÛ׳¿¹*m;lfù¬UÔ9ÃüRF*Ng¡Yˆ²„ˆø'8«\å^2Jäï¼ßü²¸‡%QžÖ†º5סµ&ËÄ€!„B!„B!¿Íǧ£w껎=CÕn£f ‘ýŒ¨Híy9Ì]Š.¢°¬_r¶Œ WÀ%3o1N+­i‡£ý.¦‹œ(µêPoÍ̦L<²7±;%=A9¬äõZ(©5•~›f˜ø9°Kíèu)Û_êÿ„÷éÉ·]jŸBùËŒÅV?8R|›5‡;\Fšð’îà߯ rùtDDU"ý·¿H¥´³mw^óDÖPù8J]§¿Q™*Çôò€•h‡9­A!„B!„B!¿Êç4ü RýÕüÜ.c@»†½íÚ¸¿Í`ÕS™®©µåÌCȱp ‚ÿciUÖI÷]ã^†²qü&jÏxÇæw¯ªPÀúø‚pQÅÐñq-œ,†4ã±s‰¥QÀ×§ì磩­ýaßuíVã<Œ›,vª§<²pO«œz;ùX㿦&MÌíѧØý÷.{.@"eæcì}'Tžçˆ„›SÞ—™ø‰ã¥“xÖù:/ËŇSèp@2³¹žÖšˆ¸@×þ&B!„B!„B~ŸÏÛ/jƒùj†3Hó™¯íÍÕ~ýü|œ¢tè{‘rצrsSèôæw±Ý÷fYjŽ}­%&’¾ì"bpq÷¬rz  F¿ÎtßÃü½–4j’ð’ð WNn _!ôºÈ¶Qg~ èk"6o®6 9ÿñ+²X‹[xßÄ6ök,;¢ú‚Š¢^_†åC8}\½ŽpdÇ}Mé­¥—¹²Ã“j­=DÌDŸ`ÐÃk(OœŸh©aÌ áþ~^Ò Š›[yìþ'„B!„B!„üOØ UG½¦\mSfËöÁåÃûkfÑ]=:²{G|fË:€MÕÅßtÄÇÄBñ¨éZµd nww)Þaä’—ØÜ¶þú:<2 ²ëÓÂ(N/%`™+»»ëøÒ†Ÿ¿rÿUäœáHÉ»6âŸç/Íò@äôŽ Ë£èîO«}”Dâ¥0"ËÀÇY/©2ÎiföXDçRë·jå`3Õ<çR8ì’j–¯$B¥!3xXU3ªZeñã­žQÃýY==¸¿haKÅ!B!„B!„BÈ/óÙ£h£ÿ}‹xzkFÝ¢å4xÉSIѹó· |í»Êì@8¶?ª3œÃྐྵäÏõZp "u5=¼Wõô‚Ï?Üå§XÛÛ÷ÝÊ-üÅîI6œŸ›,Rºˆ<Ï“Uψذˆ÷ž!PÎ'‚¯Ë«~÷å þöéŠ#!âW"³Û1Y>9ÙÁ²Â82lôëçq¶¨CÔBHŽ5ŒRªô?¦"sÁ|”LêÛšû©š/ayW ª³^L¯ªbW%ùó8èòàbþƒB!„B!„B~“ÐM6É>~íS'ŸF87 wXV+•¥E=¤÷=™Öç Í\¤OÚ¼{9gÄ 8`CUŸÿ y¿[Èg?ø?ÆÓˆFõ C¢èCGÚ¿x¶œÇ,v¨ÖÒ´C¹®8XêâµÛÝC*΋¿YüQ05!=v¶`ÞóqäÍfïÿù+wW™Ê{- ö¶Úzé/³ç¨Ç¹¶z³#ŠÀꙵ֬ýX³xd* D'^³iõ³–IºÕ±¤e–#jh<³ç,`ÉoXŠ3€B!„B!„òÛ|¾ÿºØµ‡Y¿Oÿw{uüÏþ}½³z£"’Íñã+ýÍ,¿¸9®g‡uó úæ«À]Ez;ýjk³IÞS74)ġӇ3ŒYql™Zó¥ëQq,~:çÔBÝš3°zÄ`ô‘÷ÅžòºŸ×åüÃÕ%¿æÒûÏß4ú‘Rà–3i¤1µ1ÏHfC½73˜[±4ÚvÀoŸoÞSçʯ»Z‰fÉÈlg¹aW5\ƒžçɃ=}á¸Ð6Èé\«H8é/»ž&HøëZ!„B!„B!„üò™ó¥±z3|Ÿh‚…ذ‡‰Ã6ýt;I(Ž^ "fÙvݯ³-+EUau;²˜ežpª²yèEŽ÷Ùo¯¢Û.oÞƒC kÿ c£tÔ0ºŸÐH@X¼õ_œyÜFiCn øw"Ky,¦–5R»Çî½w3·L>ÈBNIB‹ÁTÿûñ6ÇPÞ€s4áXó]vÇ-K žðÍã(ÖæPÉ!5Òú $¨!É›]Õ½‰·h«Œbƒ¦9”¯(ÿ¥!„B!„B!„ü:¬©¶W«ûÍ÷~iK@† PH©ß!f:«ïq©«Š;™Q¶ ¡íÚO>ìRõˆU…O½Bk~lXú[ ¸†çM¬CdŒ"ÌÛ…¸¤Öº»‰¨ÈôÏö0{G|©—€Y–=ä²Ýïð™Í°æÜòtqãÁÞt?ëVf5ÆïV¿ ,Áf•³´n‚¼Ô®·pÕÙ¯fA¾{2—"S¨«7m­µ¨§o"ú<ϱ"™P 8ò öñÈ›sј>Y&TòÍe€B!„B!„òû¼Z]»–»;N7Ç1¬:rIO5 7cíìÆŒ]­Q±µ›_òÏ–nB«”<•ÙX‡¹hÈÁ:ï5Mw¶¨ÇèH ôiñ¿Þ…ß–MÇ¥IßkW~ýú~>WÛ¯¬‹÷ý[ç~¹xÞõEpÎÚÒÈ~ôŸw÷Ö\_«Cï÷ÖÚxâñ¸ú(Î[[=þäþ?ìzzå|ǪíO­äµ{~äçççèC?ªú<ÏçóQQˆ˜ö €ˆ¨ˆŠŠ*bTb½ë¹óx†‹·?Œžæ;ÆB!„B!„B~›aiXžJñ."—˜ÔÚ ?<‚p‹ùÝ‚[óÈ­Åû ›w~QDòÔ}¹±ÄóNÊ~ÌÈÈN£›H΋+—ðzóЗj€“níö™[[o Ð=ô€Øb%_÷íënõNô‘¯O£nݣϨ+Ä‘r7Õþ÷íóf @kmŽ ¤lXê_·ëúcšD©ê®äëëxA}zdô¦† ©vˆˆ>Ú»ÿ‡G“Ä`\ ÕÕÄ%_{¶YH‚ˆÝØ+(Ôý !„B!„B!ÿ#Æ€»Ó—ÓÐ|3èy9ºÈÿ²~ÈÔ³}ÛÒ%_‡eÐVTØÂ f»»HXì+T ò'vÿý;flË?dÜ5G`T ü>Ú:nÙ¶çF0kãl¹6ëúõš¬p•¤§Åñ~^ÅU?NõàÉ»ãêÛžÏÚrê´Ö~~~ÒE'G 6®w}ý¼–CÌ|q4ºEDì=à€z7ó‰!€·µéxôËÜ„r·J€¦Lú«§e€B!„B!„òû| 4OŸ±·ÈÌ}‰ÖxCh«À­?ú2`æSžFÆÒbŠã^ ë“3‹8?Ï߆ÄnÇŠÍNÈë½/ÛÜÜ‘rÞ‚ûL–›h[]ò7 Yç(‹ IúÚ¾9©ª»9¤<´yÑëjëÙÎ]„¥ ŽŒqEQŸÏ‹U}òª“YØŒ¤TÕЃ~g¨À6º‘ [.9S¯)ß•ê+õ†3 €B!„B!„òë|=öÔ£Ý|IÓ^?R¤ZGmÌ~¦§*ÝÓzñf¯ÃìFŸÂîm^ ËD=b›°-ÐöÝn>agü°-·Û׌ýÈ»k­õ«xùNIQN™ªD×:ÇEw¢ªHÙü¯ÉÍjìÂÝ(l­=Ï뛵֚YÛÜuò+µ6pÎ^ g$û[ñãòìEãŽî¢î±!6.‚{üŸ.ïŒj H`nµ|õE‘ÏA„ó6˜B7ãŸëYTÔá*Ë Ä6p¾r„B!„B!„ò›L  nò#éDpƒÜÝmÞ´õj4>—˜' Klmõ…#>Leýµ¡>»Ú‹‡Œ¤ ?,q•6~Q5÷êY¤€¸å"Üýªíf±AUFãxÍðåæo+BI·Ö¬lký×Ä‚ÛÌÄ®[G%ÌìççÇ݇úG³0G–’Æ~ £ïÞ2ô!¿Rk6ÒqóÅðYàÉÉ€üüx.CUb2 l—GÎ3ÅÿH\XÙuû ®¿Åå)ßbÓ, ¸O!„B!„Bùÿ•ªˆŒ.Ù¢ ã³ã]ŠúyFò~¿Æ¨›íóC>w,ýÝîÞuWÌɃÚèÝñolÎ0«ÏÏÞ­^¿Vo*ƒ…õ¥ê€}ÐAÌ\µ,lÛ+É¢ÃåT"nÕè᯿ÉQƒZÒX÷ª7¯ã{5buû™§mÖ³P ¢Š~É X7êØQ}1ˆ/èæ?‹¥º)S–;4J5 ÕÇÌÂrÇ]{U¨ fŒŠ F±áÒv¿ªó¾?ô;Ÿã/&’XàëÛóç×þpÄâ?7„B!„B!„ßdLÈP`{nlwIOÒ)èdKöüHÃæâê³Èô‡›¹Áb€"Õ|lj8Vÿœ­ûû&¼Öy­w½Äݵˆ=X›ÄåÃÝÆzzíDÜq±×-zׂ¯’ñÕTgk?ÿrΨÔ3ä´DÎ=ä'o£O}úû³(ÿÍäÑQ?iò<ê®­Íø€||fˆ™„þ6öx´6­–Þ¤××àþ8zˆ4úLÉŒsðab5_™~üe:d —B!„B!„BÈÿ^j"ð6~î,k0ìý—&ý#û·ª°ªz*¢ÕÆ]D¬Û9Â×åÖðž²ìbMã{tm~~»å©œgzm•k½~{&ÊÊŸºG‰±«õ’%F™m+¨¦ÿëÝgÁ£¦(Gµ1:÷ÏÛÞì›êÖ [ÿå+[šÂÙf?ïçëþoöAu¿°Ö ÆÀ§ø®ª‘†?qƒñî¹Ã,œ<§.®!ÒÛV ![ögýz°¨·iQõ©ÞSÁŒÛßB!„B!„Bùu>ÌíÑ£uº7>#ìX²_;±ÅÝq T%å½#}|¸Háù‡›]OȬ‹½Î”e>ùÝ4¦HÒ×ÌÕ`‰ö=Zø¯ž6á@4?Œ7QWE\DEDuÔDÜþ“'1”îz¿ "q;²m]9Þîn âªa»UÑVÕ´ðÉd„pðÞP/1[‰½ýþgo͇Gê{R’ €›@T£ ªM›¹Uû©˜1s¸ä8Aî†{¸ÅÌÙƒ-;áKbðö¾þÜ ã埃„B!„B!„ò¿æÓ;ù‡Ê‰ìF7­Ì·!›‰~z¸{µœ7K-¶^fKa­Q´ù9n-î«= êñßûáSñßS^‹P~¯Äb=³ÐS_óÈ¢J§¬ÝmUÌíˆ8v£DÏ,bÌ‘ˆ®'G[y‘µ_ßüK]dhÓs÷«>~ÔSúF¥ÑÎ0áQ+¿zÉh–ÜüžƒpÉšƒêó<­µÖÚ¤¯Òšx¯ÓÔ¶|  ,«P\€líÿYŸ{î9fÒ²ozý,Ñ|YI9I%œ/Òf.û_Ç1¤—fl€Pý'„B!„B!„ü> Ûª§ö:eðéœÒUÅ3b†óúæw¾ZÓDßúP`—äÞ¿é‰>Œnü퀿ù|ø´_Æ.Ò°ˆ›¥ï|Vƒꉋ´.9(1ë/…Š}ÃòÓ÷;Bæ+ßîqSžgà›ê]ÚûQ4×åb=xäö¦Ò=fæ•ÜÝnÁåR[(´»CÐZ3³çyD¤µî¤ª<ªú8Žº…¯£!™B=ë4QNØn¿>ý|L:²ˆ·äç<[$ô¥Zs½k¬nK„B!„B!„ò; 8MÜ©œBÃä#·5 ù5èt:¥ŸQ«W"7u;l˨–ïþû»Ž>•’˺¥Tjï|T>ô%s8´ïÐõ#ûcF!ýuyT[4€—Ñ„ã[å^ÞÇF}ÂsußÎÛxˆæH 3Vw^Õûž:…Ü•~Ô$r×¥WÜk`­í)’nù¾?Ðr°Y‹ÀOkfþùúQ£ÒsV î¼ü“þýk6þÎ}ˆB!„B!„BþoùøÝõµ€K±ZEYÑCb³©y˜ç@ª­ÍôšÓa9÷Þþ¿iÙ«ZZ“€Ë‘Cž½ÛEÁ‘ÔyËöëVó!¼(û­ðå0\"¢X€˜z¶GG‘ f-ä¾xYÊ• N8snëéûhÆ2`¡.²6òCI¯'ÀúV­Y¶ëò븥ÛÁÇӌ Fu'“tó_r 2v[kÖZ3ð< £ê`#aów2³ÖZ}šž\µþsaµ„Пôz¯õ€k•Ë_¦7®–V„B!„B!„ò;Œ _Ü\òCýÝÕæ&Þ³a#™þ¦xúqòÉU!u÷ìóÞŽ< Ù·¿H®‡NýªÞöJÃh\¿¶ŠWM9Ôg@Ѿ]. îIý‹©QÖÜÿ±š¼+Ô#ùÑÿþèv#>ÛçKžðø¶ªF„€™å€›E„€ºÙó _žÂbÇhÔèE‚2-±\³< ñ*ôd´ÊCÌÒÍÿu¡éÿ…;S<…ÒswoÑP_Ö\kq| mà°è‰ç»Ml¤:¿E@—*Âìýïê´>‚z!¨* ŸÏ§µv l „B!„B!„ßàBvpµ¸ÁlïMèµP­Û-»œs9ÛjéÓ§ ¬­¸.¾øþ5w»P•ƒëùSxÇÍö«µ V^DCzŽŸªŠ>Ì]ÖÀè@ww1obÍ0ÉçÈDhÉ.>ñ[†ø—èäcoÁ³q()ûwÆð2žî²ð•žt\k6¼t_ R­‰k•v{éÏ{¼E[/©Í€ª„¯O^õôØÙ÷t :m©Ê„Á^ ZÂn/Ûö\6»ÿ^Q0ÈGþøB!„B!„BȉOH¶ß-Jj+ºÅ ¶ \ c˜žç G(.FGõ›û}5#:?—wšoj8þª„Pn§»ó½1|w˜)WL¯}¤| 7wi!{Í1N6aSåîþè³ÝÝ8çÌÍ »¸júËŽ…1Ï»î\÷"Íg%µû”ò§š?ΩÝlHº7Oîu©ŸÌëåìÅñps¡5/Á‹ÛOêýŠ2‡¶ã(ù,YÄÑìŸÎBùݨÕüÞ¿ü›sMœv÷ÈÉ‘çyòÃf5B!„B!„BÈ/óé­Ü•Ã*§~œžŸ¯9Þ´ø© >0RÚ{…»ÖÎIDAT½ùzK#Øò{/qÅÑ¥Äùvûø¥Ë»hëØ¢q£ç_ÔçÄ@õ–ß3 Ü =*6VXg,Ò‡]Žs3s7sgšçybbâ#ø86uWô±Eí®ËèòýøRŸ«°p(Ñ›oÒ¦¶«ˆça[­¥Jù€¹»µ­ÀóݼÈ×èàqK¾¦Bï‡ÇLÄ•ÕPÿ77ÿº!éçS‡ÊáñÂÍ wX®ÖWhý«àš4u\þvÔ é>X Zgäü[F!„B!„B!ÿeþ9õ3 FŸÉIEND®B`‚opensurgsim-0.7.0/Examples/Stapling/Data/Geometry/upperarm_normal.png000066400000000000000000037671011277777236100260470ustar00rootroot00000000000000‰PNG  IHDR=ÅDgsRGB®Îé pHYs  šœtIMEÛ *ë%"ž*iTXtCommentImage converted using ifftoanyoº] IDATxÚì½ÍÒãH²,ò›é92™¶Zh¯Ç¼©7Ög®Ý™îúH¸2ã7‘d}ÕSÝ´±sª«HHdFFxD¸ãüUD("">Ò¿Ñÿ99(òñ!ÿÛåCþׇ|Þ¹ý,DH¹ýcýÇ/ÏåÏ_ÿþüüåÁã+ÿûÿúø¿þ)Ë?oÿïÿüå¿ÿ ¡¬"„@@¡È*BÊÒ.†~뀈Ñd»"W D@ˆ@!e¥ö¯"ËþÍí¯I?'€`‘²ˆ€²Š<(‘öÕ'D¤ß!(‚ý_ yŠeY”õ)\EVaûdlϾß-;ÑoÇÓ‰¬²ÏÏöì°3³ý½¨ÿ»ß9„"O‘Uúím÷¼º× »$ « 7ÈdYo²ÜeYÈ›ò±Êǧ—ãc«vÃcR¬jç9q!ÐϾûØý¢Uï_}]ö/Öwr;î&ʧÈ7¹‹|´-†Ò™q›Ó…ý¥èÝá,y<4Û®Yí>¢: ÛŽÙ½¾Å~±Ï-“¶ËIßÀí8ïö_PÇ«ÞÈíÔXÚzF8÷‡f‡…[è¶måFŠ ˆ$u¤‘›Óô¥ÇXÀÝÕJïÌÄ(5Ƨ°¶q)¬Ÿž"{P¬·³†#2º…,ìjÙÍÓzM“ŸN »Ô®j+-vwŒß‹»Ižùç“3ó•ïó†>ÝÆËæ¯68ýRø¥ïîwx.\o÷׸Æ_iÜç-úø#ò;åCþý!š(ë¿Vþòà/+yÈßž&]Ap%œÇùø'o7Þ>WÈÚCî—wÓÐÃö÷-ÞÛ þ A†¹@`#¡W­ÒáÈý“,G@NÁ*\”¥¡í8>oÃNbG(¶ßÝr²'(¤'÷“-¤¡Áô¡ŸÒ/-îG{:v}?÷¬û©Q—MÙ~yGœ!·Ed‘ç"¼ ‘¹AêöÔ+ž!¶üJ…{¦«­¿kç CaÄ*Ѫ iÀ8¼vú÷L‚gºì‚¾Ë\´é™CP]}há¼p$?®_ìÛ‡¢ú¤ßV<÷é1í÷P™©`Ú¨ÒE<И”Æà÷þà>8„¨àÂKfkÃa@ñ›´ñ*Ì´£6°Uˆ8ë›ëüìz´÷ÜñÐco²ÝsXÃ,^÷n`ëÇñ¢²¨ùÎ kT†hf9êdgMÂBœæíã“s!úÜR!§ïÅTÝ0+›Àøh• £Yóp‡s÷·í/ðXð!m ±Ÿª)žÔ7²MµL èŸi† Ù öÆÆ¯ÀÚ™ò¨Êl_„’Éò0)o‡åšÐëÇeb`¦—k}j÷£ÍLÄz˜¥FÞ‹¢QÌ®ßDÙÏ?Ò, @sÅÁFˆ³™Çxž’ÝæwL/rõ¸D“Épcv~õÃä §…ý6¯ÃOÛKÈÌòçö¨Uªw%ÓGf“°sŒVIò8Õ"Gí’‰q–0yÎf/.5ût¹=k$»¢jÉdŠ´yáÐcÈ)š’Ì>š8ÿ-ý€Í¯›‹/¸1”Ú+|¤;dz‡u.·z‰;Ë©n½—çûÆ‹w÷ >rý\Ð0²W9³ÿŒIü€O^ã׸Æ5~ÿqïh¸È(ÿç‡=ßþ±ò—çö?ùûC¬;µÁ×,P°"òí†_oøõÆ_oòïåðzñø&ÿóS–oòí󸙆¤Ca"ãVUÿÚñÕŸç]Å„Ü{تþÁÒ1îwïÖF­±`]…OÁS¸A$[ÖA¡~lOÁ ß«J¸2€#\ö@ý(1”±ë›~\8Š2NW—Þæ­±Ãã>ºÙ¶l™Ø•ì)Lý6õpå½á¶wLŸÃhÛ>ZZE›L’Ö™ý‘‡ %0©tæ⋵cìnvz³ó<—,@ŰóÃ$hmêYΣÃ7Xа0 1ÉÓÁÄögÀ/ ÄIå!‡¯ÅÚ iV?ˆ°&'ÂMÚ~IKøöy­n‰02¼û! ÀÌn0L,]3TcŠFýX”A¤¦Õúuºjv†uú ­-•ËÌž¸ëqˆûÌb0«ádg0³îލáiLT ‡IK~¿Q5wÊQßMuˆ°J¸Áls‡›—…Íî>¡L±ø‡…òWpa2d,ÄdcáÄ?]ßõ5¤§ëå†uŸÙ£³°Qñ—áWµvïi¡vd+ÁTF3[>¶QµeÂÜßȱ{†žæEÇîÃþœ;e-µµ”ø¾ôCUjJ×/µ?ôkŒ-“„P޾Çòÿð®yðDÁÖ³Rd-× Ax… æ8aš¦¢Š€¯NºrËtaIãÄR¥¦Zus¼=ˆ¸’üP×jþèrfY #ÿøðG[LïÑvSy7"Ȱƒò€ð‰Éh‹(œv °Î&ø­Šn®iù;ˆ—U—Ÿvž€Y«Ç~¡íq ».gw~ÍBE,¼;Ø¡Ç uZ¢§ç‹ìÒ‹6ÆÌ¢Y:¯¬˜li膎qªþ*w‰ºH¢ÌÜdùËD>ÍIù€ü&àql?´ØŸñá-7§y1i1ÙR7OÊn4Ó8x¦×ã&7JÙE‘f8w«¬”çÁÿãÆg¥¬+¹¤´­–_8T¥PEÙšÃGL ÕèÐÊùá ü—þ¯DÈâR3Çëö ‹ÈMp¹S>7rÙáÂuÅò~O‘‡à)P¨^g‚¦Go:Ó „w‘³®ö6fêFir/ª@ÆÙB–è.’å‚ÉÈÖSg–•ÃÁ ¼3fØ*!MD4ú"ïXGí@Ó-'ý-*\€!>wà ,â™ùÕ=ÀV÷I˜>†Hg¸¦ Œ_'B¸a\àQ’‚À£‡dµo­¢ËÐÑ %‰ ͺ=H¥›IL~ÊÀÓ.¿ƒÇlaFÇCwÕ”ea1K 4¬¿5V@Ò¢Rª«ËÞñ – üc;AöAF&U=<=‡\IJ;¢  ÔDjŽ½í…°½ÝÍ';ÙÓ“bÍ8R¨É«JÔ™åhX‡݆a¬Â0ÿç­ <¶‡`ï)—6}â™îÁUÆ @öÓßd¡Öä”ÑPà¢2»,Öç ó Y‡SûÆ2ÛV5 Á¡(_.Þ%΢:1+©€t%ƒ=Ù¦W#€ttYI™JË1À¯£Í;´Q'æô…!¼ÝþŒ§\mâ)Ýœ%¡Ýƒ:ƒE÷N‘¤IÒ q}  #2"YÒðæBŸòŒ"U+›89o™3{ƒ††>nãÐÒtNäUù°¶‹þN^¹Wâ/"ÃÁ€°vg.·áe°xv‘ÈÔÉ»|úxëÞ&gø÷Guù#nì‚û¯qk\ãÔÀÿ¹ò«üãÉ_žü{‚õ›cô×;~½Éo7üz“¦ <á7ȧà›*ðyˆü÷æõ.‚EyÂ4®3!¸sÁ‰§ Úá5g4t{ÉÆþEýþÚ…‚·2ö•XŸŠ8{¬lÕî½íd{ñ{‡ªM tËv8ò÷]¥wéà–¡ú±¾LÇI‘ _(øOZ-̲ȭûl ÿ]äF¹íA ~‚ŸÂä±éÖí“ ”§˜„„ ÷}#õÂÔ}BUï¶zÞŽb ™i±$Z~R 1¡Q–º¢‡µ Ú2BØ´ï"¢uY µV¼4ºx=”ÐEµ…ôµv4}¿K>CƤAðl~˜Â@‘4ãXç€jÌg.BëoÊJ¶™Ú7±MÝví+4+$…ÅLЧ—fb°2è‚ißñ$0G]!`Hÿ“ª4$]R~h̆ú¹âÏÑö™Ùï2ÃsgV5ßéïP˜lX(HwuÌW¡ª§p¦å¯€U¡µ™óF»²ÛN¢¨ x$‹"m¶Ÿr©kkfv%Ïg·•4qŠj䫃›·cæ0¤n£bL$ Sê #¸jJAà Gkù’ÇæÁc—&o­ É=1 ýt…„å 7ðÈF‡e'{h¹ÅçŒè)­!-ØFl9š~Ôý9u0\ŠÌ KVƒ2ªLЉËÔ×Ï}MÂYŠ´™éd’¬‡uNÁ‹Ù •òÆð´j 7ƒü‹f„”‰²}srÈ@¦ÅÜòÀæü³×´çBÕaP£á¥}Qª¦|?ÚíDî3@µJÀÚÏAÒÔý‘T ¾¨¡Ð™óCÕŠ²¥´×Bö5¾.{"D¼àb(Š=7žeÚÆDˆ•ëÄÌbÜþ5Õßóš¾ ÿª¢lþ÷pk\ã׸ÆO5îòÿsý{p²y1¿íìüøí†-$Ê'äSð)x`¯å?‚¥ÈgµЄG¨u“rs©‚îZ ²Š<¡ïØ=N$¾ó)M-R‡‡BŒvKûM®Œ”,BYŸÄÚoFk¬QÑpïwµ ïç :µÎ²Súp.†zY(’±h!ÈÊmwr‡`‘'„·­ØŸrÞˆEdnoqù\äSø‰õÛ!VL!åÑd¯Ûécxvæ/¡ø'(9ÝÝâÏíÇWKBEU•I¾ˆcHî Éq2êåxÅ_“ð«Ú9Ði6¥×?öÞŽ˜´`ÄCT”éØÈ€/”xêF¡è¤ˆ‹âáprÊË =Ìá”ý 5±•þ=IÀê~\”ÅD+Ö7yAÇÿ¾èbIŽ"ƈƒ "‰—©«áb!g/a3LÝ÷ƒ°ÿ8 ÅêØ¶Z¼ïÍ0ƒÛß-ë!Ù¢µPWÄÂ¥•‘æ;™á§v³W‘h%‰Ô䈃®U÷Vw,n,°Ž¸z’{³$ã¾WÏn‡&l^ÂA3Hqr6ÂʬZ–Ht¤yÅåI¸þ+‰….O’11lãýWÜ•:$ 6‡7!9š{ª¦ë"oî‰4Ö0‚=lV(Òîg«ÑkþάëÏtúá°*v¿ÃâÅÔç²Õb‰lþÚEqðhËjø† •e‹Ó2î袬~Ðwˆ1Š~¡OT‘-sR= ·ió Z?w˜%”,J3i‡ŠþC”­ó$ ,˜G(IŒ4ÁÜÓ6, Ä_àe ¿@†üŠY«ej ʪ(›ª¨yÚO…NYJWàA^žU~ÛÂo`h`´?f" ¶ÓžèµpÌ8ò‡:•ˆáhª,¼~›Ø;bÈÃùK&¬ÙÝÂ;†+'‘McʔĆÝzn÷ÁôjhМzeIB…¥AslHÔ…ºb¨ß²‹éŒbµ©9È÷\w ƒ‚ëÛ#CCQè é‘T,cêîé%#2Ô,‰¿ë®K†díaüi¡"QU»%Zœ¶gÈiu8åÇõÿ6 …, •¼‘,“¤Ýh¡ÚÓ„:À ÔúÞ–TÄkG™åŒLô¢šž¹¦NŸä¿Mb:Üû8Ÿó*©<ÎçÂU9 ,1)´x8#ófgÏWžœ¾lùHf0NJÍKßJpG^†êø–îý‰{W΃šäãfÉRïówRì~m—¾!ý*Pµšôº½Ðÿk\ã׸ÆÜåÿù?v ÿ!ò xìÜC俊¡étàé•1ôºtusäˆƒÐÆÈÚP9ß^›ó¸•²²÷7ô# ¬«È“²Êºªóý‰¸óÿìÏhÑ›lwß«¬«´l{ Ê©ˆzáßæ¢b~—„cÆáË,:Ò¯!4­ô߯å^` °ÓVTþðEYê8ÃõJû5 d¢«¦'‚< üPÄüŒ4Ä"2ÙÛ7ëÐR„›*HÛ%s½U –Õ*«àLXMp¢ÀjÕRc j>{‘& ø’¢é®y¥a‹Á Ô*Ó&ø¼Dðé‚`$ëX­Ý–B~:‹ØÊø>è­ui?í{€Œûô2ËQ´XŽ(…êž@Âñm–¢"ÃàH@Ž1yJ·v/Føtb‰Y1êX*Ò|.d™ÁnGW¤ a‹#TiŽ"Cv'ËþjÞ°J6“n!Ѿñ“…ülrưlËE¸˜ñ+%àNyðAŸ\‘£©EKûPí…nϳfVÒ*£0¬À ´J÷á¥-2‰¼skõ°¤4¾ÌM‚jcêà :ê*0ñKÝý2 {®¶ÊI™Br9$g¯6‚ÅOIÍÍèxÌþÏÉñë3ת9ŒÎÑ‘\)e ûNšç‚>ÆÚSà<ûMŒÙÿäF/™Ñ»Òç>ú²ûT?bÌ#õœ#¹Æ5äû×Õ5®qküõÆ]þ?|Š|sÔŠð(j÷eu›°­lõÏk†zÀ`ḛ̂¶T3³…ýÄÑÅ€­®_1^j7‚½+wÿþÅÇIÃøÖÍ`kð÷éÙþs90u\gËFæ³uˆ Sc}tŠú~:òUš Mƒþ»ŠïMä&²(\å)|σÓÿydM(Oˆ´°ƒû€)ß ×6x–žÇ¶ˆ|Lë½Cç4” “Xb¤údñhEZW+öêI͵UvÕ ­® ¬¾îƒ…¬$<‘q³È2è@¥˜ØiéÒ:bG¦ ûÜ[%Šú/M”‘ëűÇÛ"™Òc19iehšYWè°Fµ tެÇh:w@‡! 0QU|AmNÕŸf¬úƒ‹5ˆŒ— RD½#P ‰€²ˆ<ô?éØ`ªÄYÇç±ÂQmV²è¤lF©d¨û­"œ©ˆz4ˆ`(þ^ÍP/‚)"Iu6ΨÃ^Ä_ŠóÛ`÷vƼΠhl`Å+mYï<@c] fz‰^q*q •†Ç5È“µý¯ %L Cb@ì1ÍåØtk O;f*ÔðTªD­rÃúäuÄîî,뜖îÕ°GÌÄ´G3_ æ÷Ýá"æ˜ðÀÕ¹_˜ÊmÃBo}–lóV;¸Å²ù®ÇðÔ Lnãµ–z®ûŠ…Jm/­€iª`šÿf¯˜Ú,5Ç8ÍaØ‘µf"Ë÷;˜X·%(ot;`øú·Ü|ƒƒŒsÏ:½Èôçaë b§²ª¾ë2ÑîùRÏPø ‘nýI<aŠQØÉùR›ß©žQyÕ^‚9˜ûj¥¨I7 n@AêMžÜgnÀ÷óðüpµÞ‹¹çúk\ã&êPŽÞ%JÊL 3=\‡u¸5ðÝÀå5øô€¦ M5;Õ¥DWá†õ7[Õ¿Ç¥+;Cˆ,X–£ÀÛÕº[i?—-°Q´umGgÀ.춨jwæ±+l|ňé3ÌJˆ—e¿%n*¾·CÅwQÁóòyO‘ÇÆ §å=ò%l½èÀ^)Q1ï+~†¼‘yˆIPá¤Bá¡Ù‰|Dš"iŒ,¤ akc'ý. mP\‚SÈÑ@‘ŒÁIØ´z —â¯@ñŽ÷æƒðƒûËóáê×ǬŒ–ÇT9ÕÜ_(Mg|Á^‡ÙVFçêvãp‚ VÊÎ š´A3€þD¿æêÑÁ¢SN:È¡ŽŠj¼—‚j1á¬ÔWSñ€¾ü_ƒq%!òD…,6!:_xú¼*,Ù>Æ`—£Ÿ†ubF@âû£™wƒZbªˆ/^³bGH.§Ð@Æs_'«`®‚e/6DÌLÊ žHß #vI».ÄŽ‰ådáNZ˜×¸Ë£»dÀ,)…Ì#²#©&²ƒ:ž Yqp.ì\Ý™)ãhD‹ñéVÿÞζ쩞´_v‚U<ÿbú¤š¨ X¬ˆ”Q¤sÅкpLÎ):ÖÇ–’_»k Úû—£z Õ®çó õ&]¤·È´£PÓ(œ *?¹d®‹‰:}…ËPbv7ìNíœSÿËdmK™/‹ ªè¾;E ‡ÍÔYã#«¯KÊ¿w COQÊœš w/c8ˆ<ÐR°9¾—VÄk¨!^ùðàÚ.£CÍ}7i{_}¨wëŸsaöN‰YGègÃèÿ²xñ_­RþJ \ã×ø Ž{/þ ­¦e`‰$ ¥Å_\}\ï¹õ¹›¨,4" Ù§Ãú׃ë3håüíƒúîJîm¤ìx=!,Q+Sc²#ø;²¯½þ÷G¿­ý?°¤ü–ÄÜÅ âj#4ÂUÿµ@î‹`‘ò¼ ÿMx£\;è¿•ùËS6UƒUÓeèœ#q³8)ú?‰bÄ0& (|4¥‘}æaŽ[›LTQˆÂõëtÚHù¯Z·I IÃ6 äÄ `ÎQƒdêʺTЂ[Œê‹)Í®bi`Š"‹g,H`÷÷RŠ¢–åÉœ¬É³­§H"Fªn2ÁÞˆgfïKT…8á<&)v^#ª _[ín'̓h¡»„÷žnqB[ý²G˜m «F”|£ù7ÌŒ£9¬„Öä1ÞõªŸ»³Õ§ IDATV š~‚só4Üib³\«rN˜dVþŽ|x‘ã8Þ$ܱvr˜žŠÖÕú4¹þ qÚÒut.Nõ—LlBr<±„˜§ÞlMk+ “.™œh½(tílŠÌÖ³ôc`ª{!`”®dÅ·ôÆmY4¦Ð‡Y¬0¾ æõ¶‰œ2žA¢’…¦¦D÷*b+±}'†KLÊŠYnÛPc…}M™¥Ó Òôײât)$Á}=»¦Óœ]0éjè'êgpéaˆÉaT¿Âñ¤0߆ƒÄ3S[‡ì?Ø“–ÓÛPÛ|•‚&c|:wZð²á6Š |¢eæ—JhA«Èôµ/щ˜X¼Ç‘æÃ[¹ò7ÈúÞ@Y*‡}9 )jýŠª\9¯Üè—ú|ѵ¸pÞ ¿Æ5®qkŒÇÝ}Åì©™¾µ§ÒË«\‚€ênÎë¢XzcTÚÞg}ݽ<_H¥¼ªÀ*Bv^u&žþ¤=Üq·-´ZzA–t(‘=UÐÉÓ—§î…uа¸3Û¶òÄ·'EåkQu(õÈíÏ7nžÛ‡wî8ßJ­‚OÃís4@ÈJyÒ*êû×…ÿÝ%UJ¼%ep §­.YÊäÛƒ[U&!¤p›l¿°ÕÇêÆèjßów`å|íÝáTc 'ñ­¼[ãKäJ Uðf¾ŽæÐ* Ö5 éuˉ 4aO¨?aJõÉL2E‚ØöŸ2ì9­‹p½ØïÒµ‰H@p±=-ëYÎ^ÊwtÔŸ2”²nS´u<ƒ½õeûSÑ´A·Vø¥ñõà >*Š%_Œ•ËCâ³Tcj°”SeÞE”)¯hhF4Šs9”ù‡ 즃8¡Qý0Š÷%epÂgà–RU;\öSu§Ü¬«ÜÔq°júUF=@<£t¹iw yÈϯT'Ü«krÔëÓ¿o‹D`ýXPNo°>­¬³4«×Jô’d­ßž@‹‘°fg¹IÓ$c°öÇå¤(á?Í™xþü7h´FL@.Zñ'ÜÍâÆ¨óVꜴ ž¦oëîXR½fד'MMJ†ID˜üÏ€4Ïif™ùêÞ;K²G¸£€o„JŽ^‘€@D£;Wœ}²äK„çþŠÖ3µ(©j–ÈûNß„Õ2D@ȸ=uî£cÅ8QA‰!-ªï"2c4 !€ö±£ÇëßNÚÖŒòEçîH¶tñÕ8æ Ùq|ìý)zçÙßsÂàì\}Ï¿ž»?°¾@ð?Ù¸®qk\C;º¤Å&(Ô éDÝøÜ£š5€Œ„]i¢‚{u_cð?І;¿¦{g‚!Ô.Ú§ê×E†S¿ß ¾Õ¦Eþ’ðŸ8 ßNuJSP/…ú_{(-ì¹þË"\d½ ï"wÐ?;Ç ù„Q­P³?à­è‹HbªìaM{^øC7”wgT“,,œU³“#`6u6j³ó'áå¾ mŠ“£aP4óf9ÌïŽWzѨâ¯yÒŸdpø8sA?¨ {Rüâåq-Œk\ã×ÐãÞþbuPÃÃÈV¶¯|áζ¯#^h™Ç^ħÙ|]tû¹[¼ß!{»?¾bЩ0…¦mµ„éPplÅ¥g,CÕ¤FÌ"IMè¿ìô>­ÌÃýe¡,-Y>à±ÈSä!| ¸Óû<ŠãŽƒªdË¿´²Ã1ºC‚U­ ´*`’!Câ@EžJeXm}i)ãQ‡y¯øˆ¸ŒÖvKéƒ]X…^XW^¥Áµ(1ñ8A^“>JÁ°p 6J6¼FtÕ?|äè€)lvÆ­O¹2œª8j×çVʳ$ÔÝ~6*[•«X˜èÁ §„Œìpȋމú˜!;T˜~^t,}E10ó8þô¨µÐ æZ `K‹J.8V1ë_Á J-È.sñ) ‘›™%ü²Å¡(–r}̶Ï!3~ÿÈ “èÆÌŽF¹ömøž¹¸/5½i–·;£‰‚ð½û¾5M¯.GëÔëÇ¡˜¬šÃŠwIç†Ä€€* Ö¶»ûi÷œSuÉDWÇͰÄX7À©CÁ14øMÇr!餯ε91”Ú„h:úi5lìºÂ€ÃÝ)T×e®ü‘jiè–0›·¤uFY÷ȱã–%T^ÐLàÈ!+ø˜Ò™0 /cv°Z-eÐÈà ýz*•¦,:0>ÇŸ5™¾=äÒ¹uUm@‰t²ƒ¶&°es&—ÁúYéY:EzGT¾ðf­Ç˜×nF׿ Мz}/£ÿ¦*wfÅoI¼t]ã¯/Õ+pk\ãfÜ}|¢yKWEBýO¤)ÛïÛÛß­4‰ "ÀŠ/¨%Œ=ëß óe§ã§ô_wHÿ.\¯>,‰¶–?V|¤-´ 0wìp,ÐÈÔ²Èí&²Uú?(wòFÞTp°B>Eà§ð›Š¯4Œ|& £¦@½*¨“O,ìÌà´¢¿™`°1(' A¦ÅH°2Ðý´G]nMóÕz#\*bÛ_«¦Â¬+u‹!$é‡+Å — V<¦„­lF2,Õ†vµ´{·‡Úb¨Þ¨ô¡Xv©dVlWŠ~§)aŽsÎVrp§í­SÇÉ+ðHÔ¹ÌN ëv8JH¶Z +˜©Hت ÈtZÀ.¤lNÜ«d]Cñו9€ìˆDÖ°È Qâ)ô™uö‘…šýŒ'Ç—ƒá¯ _ø:ØÇé;zë`{ýÿà•wî2O¿Ë_ã׊ºÆ5®q™q7Üú«úÛ>­ÐîNSBiônÓrK:¸Ë2ð´ºþFÂcÊüÊAçPé/*@Ó"eæµá *¦ìXo(k «ÓÙÿEn‹p‘ç]pù |°úï_@OpÃýJÅwí8u"*@óôC(€C5v˜ JÝ-!&žw! ,!®’S-üÓÚD*øieµ°Ó<£޹å4«µÔÊ“æÇŠIó—fð¤CkÈØwv¬hÂ{ Ÿª‚5Ls†_iiÇa”<”0›!¦Å3çÆzdÖup„´"­š¹[Žužá«Œ¤Â¸ -Y¿Ùb!¯²XãÓ9êg$©5 [Z™Ü`÷ÙŠ«Ø!SHëèCúÐ˺ ^(‹•dHbK–„&.ÍüÖlc¯U?Z¦HUg=‡C\¡-þ§Ä°^¸¬óŒáÂ[ÿ 9d_B?eö† Ê¢÷•FU8C²`×R±té`µÊúeÉ×–ñr5û9KØéÉ‚Œ œ°’¾²¢Æ9§Ôs {”˜füQÖ1t£æë>`+id†Y¢B» D/NgÔÛHÑCXœs¤‰xµ¶ê.)Û™-Eë%ëÅç¥㜤Ô|#yh'°|¦Gl¢P«^0Úα܄¦GÍÍVÍ‘Éל ­(àð÷ú7"(j“¦’<“Ȳ¸z­ÝMïð`-ôÙa¸¡’ÄDi&é^ÅKö7³B–#/ñ¥#æ¥3b½{£.äGàˆ¼êÕ•á |'Ÿ¹pÞk\ã׸Æ5~÷q—o¬¿6ªfóQl›‡s¼;æùâ%wÃ!]›W¿®À×ì=bòúŒÝÓȃmSªƒ‚2!uU骑r¿ n²ÞeÝÿ;7’.›2„"Ÿ;èhùvÐÿ±Γ‹–h.7Ã$DàkštÕ™€z>îR™ÝÜ™^gÜ/¯tðŒOÔ J *x†ƒY‡Hñ‰°á)tîŠ%³øªQš~!Uý´°èî¯àQÖÁRÅz4 ÈXk¨¶w;%"yAú¾ü¨¦•ç­å<ÅC8æŠiLù4UZd¹‰5¡¢TI™Í˜Î‡‰ä2ìç”ø “BA`íîAƒSæEs¤ö9^M)̈ºÇŰpz}c{óé–pHÑ™ÊxÏjï,0Ô9©æ¨|ïG&± ÜjTö?I7$YwלÍ8…ˆb]”»'bÕ›ZÒ…^ük\ô]p³0dèÄôq³1t­^3;ŸÊzW¥ÿ±¬8ò¡µuèñn[ÈìxTœÐ3ع*äM¡N3¦# ¯ó™cÁ•ºÛð¦UcK tø%>žœ€ì];Nnì%ëæN«ij^•}óe6ÙL'Š›’÷OÖÞ?èÉå`vÉxš^Žq˾4ç}ïóX²n§ðBéBƒÌx"ëí“ „~ΆæÕƒ™“\#£«„“¥ËAg„p,Ÿ˜X¼¥þíH-k4zäaºÈ7‹ F¶~‹ù§¹­}êÑ%vxÙÕü.Œ˜ßUØþ§(óèØýìr‘ÆüiÆõ*¯qk\#Ž»ü›FêÔ±\ƒkyç¾~9¨EiÝ<‚"DÙ‘}hܰAvòôf4î%¿m@…’à³v¡1“ôí&·Ež‹ë<¯Ö öRÖMЀ"«âÁKWËKQGþNGPšdÕèy:ê]dd Æá°Š9zö%‚^Î4-‹†Ú)¢ -N¤Ëüéüæl$núSQ¾\“csDF3ð²Y¹=5ÕÁWdËP´9~75Æa»hº]: …ÝèÅn‡3ðQò¨)º’9Š“ÅêšÐÁŽô“¯% h·g[ +ÇKÑ·!w’Ò.ǹ…åɳÑW¨–À©?³ù·RRZ-i€ ²•³ |¡>\ìá5ÊYEÉ’âP=”2W[ [ܳfy_H¢vÐPtnR»» uúÓIÚôŒ¢± >†ÏÎz·žÂú’{Û~‘ 'OóU ðù¿ƒ¿¦ßÅg/@÷ßáZ_ã׸Æ5Dä. ¦eål áœõYá‰wœB¯XL?¢ü–ÿ§C/»Ç*ræ™ÃpJp*.{}¢Ë"÷EòXd]àCäNÞ‰bQíÄO‘ß–­ØŸè/«ð)+噞ZHbþˆd±R,hMLÙcͪ®©$‹ú>±ÐÊñsRg:‰k`J•]Ë ˜Òª¡ ÒD rB‘oWyK/*c¹úÓ³Y2„-Bêâ¦k&DÆ×VjÃ.'KÀÀ¡³˜@4aŸ4©¬‚ቻMú„4'{t¬Ä(li°ÞY±?€0 Šc©=¦°B&»…":0báH—2s …È4íªì;x3‚5°OÎ¥L\Ì’pv'‚cNï¶Îg§Æƒb§èjC±iZ@d“Æž ‘Anc(¼‘?áû¦ái™ºƒrrÜ·=®ö‚„.:G6Å3KM´M¿k­Î|Q¼žpä2ãí½¸©KòÇAcV¬Dm+PÂ^¶v„øZĸê°iÒÇ:sßë÷ž WÒ5ȼ/S|vVc@µs0Ódë1G1dÙØYqñ‹?þ %Ïaß/3‡ÇN`\j"#dF/ÅUnU6“- ‡Ì>DÖoҸñi—[Æ"ÂÚrâØ9ÝŠê X]ªœO¢®i€?šY›bÀøÛÆg}.‰Dó<0Í×{3ŒÒøX@Çp£šI¥÷rb9ß‚'ˆkœù8 †%4›Î—³0È¿•m…׸ƴßzk\ãÁq÷î/lÁŽ8Úùy cÙ$ 0ø¿’@Û8‹ö“h©T¢oÝÅkXìႇ“dYäc,²þݰúè¯ìñÏ*òØÊü79_‘ç^鿊<·_]&0dÙðè "¬®© 0¥Ô’§¨¾cýÊaË$Ö΄ÅDG.„3UØ»ì" GGã)Çe€×S ˜¶:Õ™L¤&te+x5Q qÑa³KD4½·l_%3Ölsp(u3À7óe‡ëE<½K)fL&y)¨“Öä0zÁy=¬ /]nÌɉ3ˆ"JßK7‹Ø"Ð)¢-$4Öž¦Ì¶;‚ÃX®œQUÒ¦–a‹‚ôåL½f0Ÿ²áé^ˆK£Æ;´¬ -“ÃRœVÏ-\ÛÉ[;rÏ-€ôÂÒÈÑGÕ·7 hsåRàZ! /Õ<Õ¬¸'Pw£@”Sdm-%G°HÞC™= Î[´¦Zv¯4Qêë—=}!gÒH¢¡ùLgVh„Ù#­|ŒñµZVè%k%’(µÒnï¬[´yMkñŒ¢QÞ‹Uôõ­'êšÖ…«­aHœG]"%~šœƒHRŽÇT©ÛªFIC1²ó`è*6yŒŒ%ª×?´´¥Kð9fÞ猀9D¸˜]L×±¤/‡¼\)9£ÖätÐö­d8z ™å 0S¿"ûÀ[AÀTô`r·¡ ã„Þ»èÿ÷?Î_ fÍWr·ùkÆõb®q­‘k\ã×xkÜô «*ˆ$8>Ä‘õ‹Âý%Óòª1~ÀD¡ñ þgíyȌ̢幓Û"·›¬‹ðÀý僼Yê×U`ûÃ*|Š<…lÂ%£ãE=cÁÏÊö",*GÙ5§Ó3¢FMñß@ ¯3\m˜€ær¼Ã’xÐ.:ý·´I[IHzj äý%0G$o9‰«i¤„†öŽßyéÅKÎî† Áز“P'a„bä±·ªïßÔ?¢^Yõ%ô¯¨‚è€C³Od””",ágÄ ´$#e¿ž&ñøŽ!ÂÀ|¯ªM˪Ð=Éè¿& ËIˆÎa¿†fœ-wöx¦[ީˉ꩟IýpÌ…ß‘ÊlŠe¥Ñ 1±?ñ„"K|–©iŠ&gZ£Îh›r²·ŽZj¼ÑŸ² ~êê¬ç˜ƒ^T‚\/¼ñ 3[ö±µ,¼½+m9µ$ ¨rhW½þsPì`À)¨(KP¦úÕáÈ æ~áȨ&+åØû°Öð„2+ü‚Ƭ9w€VˆdÏýØÔ2cQ<þ©m?[¾Áã³)G Ï låKÓhæV ê2dú´0qVöí§)3Çðþ š;"Ÿas¦„L^Ò¬¬6lO夠L"ÓîâlkˆrÄú¨^HÁHF¡R¥³Þ•™Û»f&¥n¶<3ߢðÇB•A‘ ¯LêKŒ]¼*áÃpt{ÙÑE¦4ƒ_^Ü?g«äËXgük\ã׸Æ5®ñö¸ËÁÜ¡|T?#Y¿ ùj0ç~‡8$=ȹbq£s¶¹/‚›¬Ë!á»áþw‘E„à·E‡Èçë<‡„ïs•§Æ›àÔN)CË_’uGcI·,ƒ œSÑ,Z­Á² †ŠrCæƒ29ú[h=:…41¤·š¼´Üµ6PBÀˆºå %ÒxJ÷©Û,bI¸I2‰)Õd¡’­Xšú¯HP.%hŠ@´"g2%‹”®¤ºUt¥Íýä©Vš•iàlHþu°bµ1/¦r]h¹1Qr)Šð×Bib¥›^æZ:8,Õd¶¤»r£]3†µÀJP꥾ªYâ`W‹_‡>Æ ´t@d]ÌŽEìKŒjõ\jkY®Q$Ùb±–‡¼á«Kú)ÉÓPË ¦[X$ËÖɼØYIV¦Æä´^Ï ¹Gi Ú%¬Ù¨k®ªêi¯Üníù艙!}¢²†0íJ]ÍÞjÚ÷O"óOh´g—(ºãúpŽaIEB§†…ª¿G'Ó b薓̨–gÞÎô  w$ÀçÔÛa·³]ˆA­ô¡ÃÁ)–H¥‚ä>Ë=Is ÄLªÞzã’jM&Óâ`ó—t^»IavHªJÖxN3¥úNŽ%´²I¡@“®[79ˆR=ð-)(²ä`]C,¢ÏôN|l‘Lž—†U²"’³.Í&Þ5»0ZÁéa7ÌÜL ôE4dçvÐ^ƒ/+/ÖÈŸþÔ MX ÝcP¡rbÅ.¬ù‹_ ÆÌÀêg¯qk\ã×øÆ]îèÅÂÖX?R 0ÍôAúòAËW~ž€Bb£nøÊ²Èí&ËMÖ›¬wòCp§Ü)7ÊrüÀòëÂO‘o‹ü*;›Ï¡ùlµ½iáÑL,†ÓÄÄS6A=“¹ªZeSJóhaç)C\¤Oçºéaa `,æPl·&•†g×…`9g‚&Ç åüÍúÖ+†e74^Z'Œ ÁÌæJ5¼)æÍþUx¼f7?Šò~ß9ŽÏq¾)ó§J‰©—è)+=-EE32-îÍËܶÉ*¤,hPÉ“¬âÕž! ÝueÉ´`4 å=SMk÷^0N *€¹ðgÕìÒ–#Êš FY2¬ Ú1‘³qÿÁ0'p¯@Κ–àÛ†š{§À¤þ]KµÓ‰%ZYˆŠ}Hê49ŠƒQ³oû %6oÄsaç„ ï²yPd|SzòY€ •á]æÇUC%Þ˜†FVÊX‰-DÅ©”Úc¸ Ò¢’w¹eÜû5¡ÐùyrÔX(½xR•ë?{˜Jú2FKÍö“ñ1M²º$Mk eqÛI•?*ƒÌ/ ɨ– XÚ˜j+ËñAÜŬZœÂœÑ?™Øš Ï´75¸µC¢·ƒí¤Ñt”Yn}ŸD©ß‘“…ÇL ê~€(¿£µ}¬5pîÍ{0ói'TæË ^:'Ô¿ñÊÝaÎqÀ ½e ƒÆLnb_lêžéW”™w…?wÚ€£ã–Cÿä׸Æ5®qkülã.x kÀÔÝ,Ê‹ Ÿß9^tµÆÈNs47n¹ËzÞÉ¿qÝ*ý!È T^E¾ðòäSä)ë*Õœ;”s^g$c¡[*L¤c:Z n’ST IDATp¦! Iލ"8¤@›„ª¥¾&›!üxìpáfúûZ%X|Ì©/ÝÐWgôH™ÐKZÂoÛ,h jk?JH`t’Ÿ3‚ Ô¤)¾–o[[…È˵òrNŒB 8 Ê⪆ ÝVk¦_\ºçB©©±%É;ü!Ъ¯ÔDAf£lu¨m׈Dÿ‰€¡tÈŒvùuRéLè™0,^i#K4[±§%WeÜÓ!ðTð œyO€Ó.Fsº-ƒçš).ý ¹lÀÑN)þÝ¿–PH˜Q¹vMùøÕ5º2‡fNR]ÜW*¥GRµ¢x¹¢2“tJi~Ï0YE»wtäÀªO‹*=ÖÄMZŸ0šJœÜeRnO†œÕšŒ`ß,7œÅ ¹M ÇpK†hWìðùRi¬}´‹áœ£%Có¬'°GFÑšPm/ÂbüºÎ?îÿ[$i…Ah3jËo7ÂNFÂmzø56)ê÷Ú˜|ª¶ ‰JbGç7NÕ•W%ð…Ái±5s+¤óÐÎYìÖcÆü£o°l(:ÈÎÖ5Š0hUvAïº I[óƒ›â—Áû ì Èá+?Àsküê½ü FîôÃÀwLæ+Æ/½ó?Þ¨ ~È \I„k\ã׸Æ5~ô¸Ë‡¥ïw’`õg9°iës‡]¬‘vv|,‚»¬7áø›ÈßÖõƒ¼“·#®£È›„/?±3û?ÜŸIi‹'ÊkJ}°±dUÏ=.ÐKψa×fAEšWð¥eeð‰„¿Â"¾™Ç“á¶4iÀaÔL;ömzË!•Ìæª(Ÿw<ªãJ™’6„¾Å£Þÿ-9êD‰¯5)*¯v{FOŒAbìú;f±z‰ŸÞœ?¥@ËV‹™ÈšŠ¹Õ‡¦²´´‹¹À¢F…ÁMêã$… LËL |WŠpŸ>ÏÄÛÍøÜG5à,Íãþû$*Ó«v=r«÷ݤò,Hƒ©ÅÄ"¢Ö²wrݬՃµÕ(3yx iq© £Ñ@¾>o œÆ³*PÚõâç©"CË­_Õ^aO®ÑúaÒõeÎEެ, I“R‰Òh ªî€ô]0Éöá zÓ<9°¨PY‚ä}‰Ýq—iæŸÜœAªi ï§1©ØNÚ am…O<»¬’5¶ú+`pf`Óº´\­ä[Ä×øÄñÅ)º_“!…±_!b÷g#ˆFO² êËpòï{gYì¢Ý þ¢uM½±3ÆޤÞD`OÜ'Çqí23õA¿³9×nÞ ż”~Yg,ééóñç‰gªQV…¥Sì5¿×¸Æ5®qkü§Ç·œ2WFô»ûOS[]•ô"ƒ–n‹Ü‘›<›ÿß(ä寽Dh…|¾-ò ò¹Ëù²úSu;ï쾦 ƒÕ8,Þq•òÈ„ãÜ%©´!HKS³âëó¾rž¯êjÍ ðòqlœ|à±îo¬ªëŸ©:nÀ%Ì´tÿ,Ûd Ù2ÎÑI†ÀÞ2£^c8YBU\šò±$uë†ÈñEí§YsE|Ç@¥;‡[oÜ™Ä!èÏìãFS†ˆ ÄtÖ3b"†Ú[¿b½gé‘Sþ;ÇD°—µ„©æ_FÌó숢²*«´°r2Ðe@k<è QBÎhŒ`wd0È “/œ8âæ¼æ*Iñ²X éó£)q‡äPN¢°:ä”HxüÝXøÌ³>È (–¹n‹"AmÐŒ°=e<©‹®¼–dñã(%6„þμ¨t¸h¦>•ØÓ¹H—Þ 2LÓ+ëËhm ]Ò«biõõîìå6ˆé¥Ÿn4½êí³#{)øñû£g‰IA=–teÕ5•zâD#˽ö_1 1¤ ^ty9Lõ(øµä2ÔªNµ äР±€k[-ÿžù·˜³“ŽúÉe:£P°H®í MäÈ„ñÏþ@wD„µööªæÎÈÉ#yî-J'îGôVå„Ξ™Äùø—™m@oÛ9}>bäœ9ßøóò>Ò[QØO:ðž§Jigýßý_ã׸Æ5®ñsŒ» W%}ïì~ãˆC¨)å¢IoeÜDn»àƒò7rýï$¸;‘OÈ·E¾-òø ò>«ò¤¬k‡P+0,Â=ÄW;d’ÄØQ)ŽŠS‚VáÐiÛ²âsä0Ь ä gºK½z(Íq_J ë¡öÂR­ŽXd^…/Ô²’LHKÜ‹5‡ø±(‡?Ù2…PsEÖœ³¿êƘ`o¶XÐÍÉÚè)g¬D¨fÕ’•º¬¯,L o¡c²|Ãó<ßúŸ/«ÛÉÈâRcÜôi$«¤šè1¢3~¸Æ‚6‹È c"DŒì¤k-rå½®-CKŽ3¶æ0Ÿi Ó5f'¾wÒ4Fö0Xs—,ÚmUi : 9Ìo9³#ÜgÞAW/…îNѬŽ2[î`ï°z œžÚQc%_SnTÕ¡æøÁÛÂ&}3Dkhïn±Æ­Ôèýë5 kÓ”$WæŽA£8ã’€Í56¡oxrK±§«ñÊšA)jm~ƒ9C`éVÍXÝÀV#©LGì‚…‹]Š”ÉÚ ’´jiõÓ –ÑË΀¡~ œÉqYlQo’4¬°aÔírü¤!=3¬KUhì?³\Ý ®=,Âgæáøä¨ýïžé/0ÍŠ‡Í'hiØç¨YûBë¤/Gm±Üö€„<_ü|"ÅíÃB€4bÁ”øíK^î(&rÅ’Å—¬Ã0]˜ÙX 6d†`؇»µˆŸ(>âÍ@±\ ´E¤íü"6Ó%HÅjø4°Î^}‰®M¥ÈD³®Œ¢·¦Qf"·zÙ¯_¸‹xö\ga¤žHÂ!À‰ “ªó}ý3Œâ¦ªQ•iŠªRnAB'lÍ> ²Ÿnm* (ÅScÂŒ^`Ï™iÐ ˆdÔ o‚éàV\šv#C†Šš(°Š,´°c4ž-!g— RMa–0bI¯-ŒÅ õ wœ„f˜@WÄ GN«2qÖ”S%ÕtHEĬ“RJØÓ °w›2“Ä@sTÅT½)päº Ft´ÉŠb( «!'(Š˜Øig'6¹˜þ¾ƒ׬>=·È_VéqÁRÿ+RûtEÁ‘° Îqv¼µ]¥?BqKž¯LíM3˜/ 'àwh$µ¹ì†(I÷2s{$ÉKI`˜ÑNTl Û©¥2:„ÓÄô#*V¨–&†rßÖ9A–Ɇ+•`ÉÚ‡à`@³“奵ùiôýIt ñWµ¼-Ÿ¤Ò¿£!boq)1Éγ&lIuø} ÍÜOþ‚Š'7Ì™·™Yׯ ñ ,|ZCC€/½þ—¿½k\ã׸Æ5®qŸwÜ¿ ù’ñ†÷¦ËüW[æ;y㎋ð ù„|[ðmÁ7È7ÁCø>e¥‘Ó†ê*KvŽÃ˜wD·¼ ÇVsvXâ,/õ†Ûö{¸kN˜'Œaø(‡J ß 2úêÎ:ŸöÅþrüùú/ÓX¸Æä]_¯ø׸Æ5®ñÝãþ‡¸ËÆæ¿,†øwb*á¿MÅwá7ðò òMä!Ø@ÿUž[H¯+yuœ…óÞ9jW “jœR»Úo¥ÇšÚg~=TüöF…놤·^2çrÕBµ´Ñc께Ôå!9éMÊîM”§¹6}y‘>raØqµ¬ç…³ÇtòtMÒ\ŒHrú°Ûô®å¹âõ'ªs’k°n™6ã gnóãO÷ˆˆ‡`žËïžä°´ü¬ááqo“™m‰¥¡pÅ¢¤bŒg•u§åMq8ñ* ¿SÁhGÕ&·êbmw¥•ÒЗ\×Ü_1QÔ…yĤâù-΋€òI€œ(0 s£=úÊC³Ž‹%=©‘sŠþ;L,¬HÕluÈIKÜ+h5‘GÁŒ¼ÔE÷'„ƒÿÓOø»éàj³¸ ÿk\ã׸Æûï|Š¿tØmˆ?4èÿ7¢qûž&V‘äò‰ ÷ǧÈCä)ëSÖõ¶r2".’tL“C×èX›‚»‚3Ô=A2ž’ÜP>Xùe`é.V°Z» ]¼LUò,§(T‚Š·¤#¯Ìõe·‚¥G“ D@çRܾ„ÊÅ)¡À™²Ó0@ žô€Íôm(î[ ]ŠØ kÌî\ò­ˆ 'ðùpÈ'è·‰“ŸÂÌS!„ý4 ‚X`jilˆ¥rõ¤`Ì€›ÂuoP· Y3±rÜT¤ò€áOK§\טK]î‹}YbÔo³Á*ÓœJ•1e²g½Xk` BJþîv ÌïD-’ cí™qÍ‹tŽ{©)%¤P¼} ¡µ&”eïmÈ™ò2Ìüeª=±Z·†4›i,4îÍŽI“:M¿;ŽÅ¶À(Q³F“¡¶gž\ÉĨ£íybsÑ3òtVo4M”f(žî«Bj>N©³–q-‘9oa²zÜ&:ÞŽÖ’†˜¶ÏœÅbýeÞD>:¡¿Ü‰eo@á y@¾A>ÁOlÄ>x ò|Êsµ•b®ª#Òv(8 z¥A²ƒ ÒÊMÚ@KÚï«‚&(2—!†µß]÷ŒÞ>`ƒcèå«&ô„~ƒEÍl 쇌)¬~’Š®d`,ÂÅ×åµ” ƒì*%©Ñ¯j¼""÷(#Lƒ3ʨ”iTqÏ";Ò0ÓïÝ‹þvÏ«ÝñN0 )þÓÞÍ“‹à2+\³Þzaj'û¡„6ú~´‚°ïqYfì1zý#3¸éaGK‰À”\»xvȬ˜mÿË%©‹Ôeçkô‘!î ݱ¨×… )ˆ‰Ïо¾i a¹SA‘𱇅0ò@39ržœžãYÃj¿PŠŠûI×a°<˜@TÐJõš DgeRÈÏ>2ª´å`nY5+‹jBJëú]¢7Mo§gn;/¨‰h`ÙöÕÝ64¶ Ø$¯†¦æàT×›Ÿ‡cs´âŽÉÉe°;áw¢!— ò¹¥èB%ëÖMÚϨ´öº~\7,¢Àš9m.s·©lƒî.=žbU«Ô‚M3É.Óé8èa•lHO#æò÷ÀßÎu¡¹ãq‰‘ MßnP)„âÓE3±üÁö•¬_ƒß—¤)-5°8¥G«VË»…Иü·Øù‘rî‡ hêY§1õ¬ùë{w\Lý_ü‡Æ•l¸Æ5®qk\ãKÆïMäI›ÿVæû†ø‹Ü)ŠÍ_VÈç"Á'ø y@›ÿ*|Þ¼b˜i KS„£µ+­Àš¡LI1\œ:³ð¤ òVCGî]ð ½CÌÍxñ¼ùí(žM²œ°Ÿv C­ï×<|zɃoÀ%Z•åàªfZRxSƉm‚¹îq+Ë5ˆÆYÿ<2æhgOX¤%= ÿžoùúÈŠœ1ï埿ýªÇ9\RFžêuRBÓId„·{„2¢bˆ«3Èà˜‹ùùex´`ûâ&–+jZj(Ó5"yô>k¥M!Ìlš¡ùŠË[Ëšü'¨kÄÖi#§/fS4i攜v‡Å§ 8oü)‡†S÷<}Q Ì/%„ ¹å¬ç`î–qt%“i§‘na Ë.;nz¨,/O$]ûDv¦Äà‹R¶à©6lÊvå‰ÂY:´›—rM“ÖÁÉYNM>Ý&º+¥²Hj®ÒD{*¥£Í8%ìtG‚ÖP ˜M׎@ p°Ú¦·¦ÑÈ0ñ”Ü¡ìD,¯ì¾NyU ÀlÑîÎ{ƒ½AL(tý Qô(8U½õ QL¿Ï¬ïDŸ}_ E³<ûêÎ-r7§:QJYö1ÊãKÍ3möô‹îÕúŽ·îÜÍç8ÅËÓÛÃT`ä©ÿ-gßž„k¼¾X®ñ³¿žk \ã׸Æ5Þ÷±øåµh¾·^æ€þ”ySZP«ÈoK£÷éTþOYWY×£ú5–åB©~Á@o%Fqo¨¤\k¿•Ȱ?Îaå!Lr\Cÿ¹ÚA38Ê "…+È úÄÞc/Etü×}vÐI˜áqý©ŸB´ÀZW¢UzEÏÍb–+R YJ-™Ú‚SœAÄÅåäY¼Vgõ^À0äYdŸ ôJ¨©l1l@w·ÕË·g¸SÄrÍÕrú9c­XkMAš°4*‘f$ íNÒÙ÷CKÅÓã ¶¤0ç;bQüëwF %¦ÁÜ*êÍ®‹£åìw¨“›Üß¹@„þ0RÈCꉔ{*5AqBJJ ”»øÄ˜Ô;ˆ§)Ÿô(´‰·]Où¼Bñ­W7Ó»ƒ/æ!'siéTph…ò¯GëÌl¾Èm°1Î{¦\Å÷Ì)àóÌH’š¥\áL¤>÷mˆ°)GÛh7W<‚ /á¸Ò¤ `e“ÛöóKtj~§:ÎÏd•C¶I!¨ž Ap„N)–7_?ó»Ò:(®2ŸbVÒK“6'õf™ÛuÆ{‰Ú.ÿaHÈë‚ Ú}ð“Û~‚}Uð÷ì‹<ñé·9¹Ï­ÇÔ£TË)ïýGÓ>äÇÞØ.Ï¿ åŸz\¯ç׸Æ5®ñã>ˆ2¾ìÌ:Êüe+ó¿…2ÿòØ*ý!Ÿ"à!²Šˆ¿P°î˜x¯fR´ï­DUü?Mó’àw„“5l¿XÕ¡“G€´ýoÕà#z/%P¯` *Ãýª„þÆç>G=Z¿¿o„ŠýH´‹$ £íÒeN=k­x¡zõD~Ýôı‹‚fp•eãÿ˜_©¬™Í€HEx Ãs¦ªL¿$füZ·@ÙD«Uæ:¹ ÖLÙáÎŒ„r¨e֕ݹ8$­…|Úc¦ßR ™Ó¤¬Ð†Âß*}€ÉgIÖÆöc’UEk4â[O0JéåÊÖzðTÂAÝó9¥‰”i§EDg¾˜wtE #¥ ²Gmª—ÃÁôù·­2)>᪌•QgQ¯l[ÿMäÎNè¿ûlhÊ*BÈç²Kø~‘§à)|ÊJyRA6"{Ó¥x$§Xj1Nk#ŒÕ¹)²u 4ÍÌ~S¬ “bR,ãœ3]‰(0ãr¬/RIOìYÏQ8R¤êÔáìË2‡ÂÚñЩV‰ñq£ðAoða€¶®àº©[;À’ŒÓþ&†¶Ži~:˜5F¹¨›·²º®> %ª‡êç íÙTìúNo1*¤\€ùñwzžÀV‹{fÂPÝOL#w<É6À׬“°Œü Ôö‘o$¹*mï’cQ_¯-›EdÕ®sïÈ5k"(®kðZÏþÎl¹ùÑÇM®bi©¨}gójÛ¾ˆy‚.FÕ.­ªtŒt¶]l­Œ¡ûJŸ•T­°Þo§ÞâÄ:T­§½2ÄOª@ï81òãFª=’5¥ù]$û Cü>÷ •vÊð¨8ù%Êô!"gRÏuÛÐ跇̊?Û¸*ô¯qk\ã׸ÆO>î©ïÜ/,eþr“&Þ+ì²z[ ³B¾›ÿúó)\e]åÙ¼dú0l‰–Nñ?R+0_­SÞ2Š2앾/Ϧ/Å\„Ý!«r†3]59š®ð3õ]]æ”÷æ]ñâÈ2ä²×ä&*¸Ì¥É õ¨uð8g9CµÖGŠª6zœ (OV;’ˆ÷ä‰âÂT#³ê¦ø+>3î6èx_¼1–Ý'yèž) F _íȈ'[ÁëûtÜÙÉÆvpá±…9 R·ò§þÆÌÂÀy>Ï´àU£éêwfÓK`þPHÖøÌcöï°GIUªÒ×}‰¢´†üÁ sVËŸg¸™e¢ô4muðTâò‹gú1±çc†HÄèZg¦†îÈ«NE¥B• Ò,EL¬R•3ë㘶;M F)ÿêä1Ül ÉfUGÛyjë=l)¼8«[KdÓŠš¸~‚vš—²$ Ývýì‹(¦™Lj-/Œ$£ž&È{3Y›îÔj¹ÝôzÐøµ6ì±IKÖµX—7 ñ$WÇ™qE¦böäž?›JßMVó ]©§¹mž~Àþ?â5ôßÙá_Mz+ʪ ™ªPz]ç·83[¨+ålH/ž­ïCÌø®+ÏüüŒÎð ó¤TU¶3i`ñÒn×ßgü¸k^èÿ5®qk\ã×øþq÷ž×oœ/¤B~™IɶlÉ^–¬ŠŸðŸ…þãŒß¿\]<Ùƒ‰€Aœ¤"í çaðž!SÄúéÓAårVwóŠ,Ø}ªSÌ_SLÝ\Ssõè·ÜNgô®2–„†6/Ëqx)‹êKkÛĤêc±Â©iõh»‹ÎTZ2<ñm` £DgøÄl«bó=ZcÖ`=Á¶ƒ¡zà “YÔÛ¡ƒ‘d¿{…ž~ëÊÒVC>!Ëbæ­…¼²YE&Ø‘%j´¹Zô2, PþFBƒIjŸèG½¥5 ±ûÚóÓúþl H+Õï¹ÉSçÝ<á“â.DÓV‹]`»K!u71òÞÊDÚƒsžIq4 ›×j4©ç[[_m'ZÚïNã]æ+¢æ£Ða•L ¿:ÇEÂskœï¿k\ã׸ÆÏ>î¹l1•ÿ®ß{Qú½²p4@¯"ÈcáçÎæ/‘§Èc/ógÆaÜIVˆ¬îÆ5‹€sILqb—Èë·CÔ†)Ò „XE+äug%¤)rZ‰cƒÏÔ¡uêfÿ”&P4b§‹¥, ä1ŠË©Œ5*™Àù)–¤MBEÒ(QH!ÞÀ÷B‡!-Óÿžˆ¦Nk nà>!¼&G‡‰ÛàðrºæäÑ"å.’"†˜»cyšÂx°¶3›KÂeˆéœÎ3[á¨<ÈÄ´Gë÷òÔbL.3g¸ŠïNåœ$ɽIM… %tŹTy0ဪîKð“°„!Z•} ìHyÏO›·0j3åŸÃâÄI¢°×Þj€™¨Þu*)©©<,Ä ·;bÊ Ù sG·­±—X0ZÎÞAi™RÓÜ»~8{<‰ÝD–bá`•röÄΪ±ºÆ”_þ}xËÇÒ)•ì{Ñ]M ÅO\€6 À–1¢'Q4\ðq~lïTPÎDb©Ððîºi qo`õtA,RyNÑÉz»QÖ6E æNæBniJ*0áÐ>ç_s›¨¼>ñQ@,XH™!ÿxû˜z—vòµ`®qk\ão{tAb¹­ÒÿÆ^ ´Výy@>Ñjü±î¬>­ÌßxaKoMǺ«DENWK5!%›¹!ÕqQ¢øRNÒ ý×QQ‡»â`nx/<ç Îô-ß=Ô×ëøAGYLIðíó·j2"ÌmÊQsFQW[+öûEí½µ1ÉŒ>a¼W ×0>Êçb`9A ä¬P4BŸzy#¯\ÜHªr,§0.ÅD1/{›gïG=§zp4U´n'À(â`±b¹‘7™)\À è(ìq_­O‹OÓnR'%=ü²§EâNC d»~,ÂÑ•¼êÒO²TtÀL ѨëþñݭÕç4áü…¦p¤dKnQw>¨bFÀbh–ŠXAK¾žÎ–Ø¢aÖZal}¹:fw®_Ïöc«ÈzlÌ…ý(‰ÐUj'n笉zwѳí¥ã%¸m]3-Ý Y·ƒÌûÈÄ5JD($jdä…åEŽ› _g-‡‹‚ãcÎ26yä«)4/èö‚­{C–¤ê_ EEèò‘§YmzíÐn«úø2 ™s"aw#È&5&LÒëe74çš–§fÖ¹ýëR;ç¤pÈä[OW³·Lp( ¯QQ:CW.T£d3Z:„á/SƒA‚dœ÷Ž÷ ‹¶Ñ1´‡œ w³¡ß‹¸ñÔ„Nà–/•çÂÿñÈEþsŸhàõsk\ã׸Æ1î[0¶,‚EdÞ÷2ÞÉ;å¾ÅÙ*þþ<Êü?EÀSv6ÿUVv—ÝøÇ0õþâ@v@DpÆ*þ’»J>u¬›5^'Žž¯?ø¿\? ³°á$bZ¾DáÍ]]m¯NeR/Ù?§vA¦!9Ö^Ëž.x` ®õÐ m9*Æxhò¨¸BKÎr¢Ÿ=ÊÆ#ôóì¦MáùôN‰ø 2Î+§Â!Å)¢dײÉs¼Ð¡t2í²èª‰ÅøL¡É‚Yؑڜ؆œœçü z•ˆÓ…ŒµF.Än& ÿøã8•º!Yû|l±—HÍßZņqËŒÀ¬ÿ Î1…Ã[e¦Ä “ÆÙ-“=YÙ|/»^ìk]•Ègƒÿž'Àf"N´‚í-;'Ž…Ê—>ëT ™P{X‹JKóHN/Z¥oH¢eÒïçËBW#(jÓázqÂ&kô²,;BÅ1åÑvŸK@í5økr/ÁgG]Ö„ÁNN¼_Ç´6hUŒ~Bò°êÓP FBç“Xáe×8ÕRéÔÝN)Úvرp¥üÁ ÊŠ42`M¯*lZ=¥‹[œ×XéUãrëÔ ûúÇ’ùRôDÀPœI]Â?¦Õ´ˆ?ØaQòÖ¾õåTDáš~mÏL +ouF#gHD”W‚I³©ô<¿ËÒœ¶¦çW*¿|ê7Z—~f°ôªç¾Æ;ãZ1׸Æ5®q·Æÿ%¸ n«ÏrÛÑ­Fž Büå)ØÄ{Wá*Ï¢CꇿýÊã,”ç0ÃzÆõ’ž†…Ó`Ø+õ@xï›*dÍÍ"¶àqP¬ÄÈ*i”R^ôØ;ÿuZdáÈO¾\ÝÜö‹ä>‹×ge¾ ”Ù¦ßò«·¡;šß¬óER@7ù•W€ _†´}šaœŠ"2K+Ê­™š r˜<1C#oØH?1ôêΜ#›å©^¼å}uÖ[žÆîŽËYå>‡[ƒ¥¡x9ƒõb$,g,äù£„¶')–0«ÊáàÈŠÜF'cÜêê;Ì}ŠfÞ3´”÷Á«øL=Ûá4Ô†—5»:2ІS‡ªž—Ù&ß%¼;!•Ðï[õOße Ö4œê^Ÿ–r}¡òWá­®žì Ú8NsÃyËØngš/ÔÆTS>xá@Ißé¦{L1‚@¨N`óýƽiƼãýÒ£Ӻûü(n÷F#¶3½b¡ôš‰¦U_™¢yNhý·ØªE2bó¨°ëL$,ÐõIñ»[ÉœVÛÉQXÍ·Ó!¦¾U×0~UÒåðJ`¬7£ö-u«;`thù'1êpog!‰œfÚ*­õ3®Ä‘§Øý°¸ÖÈ•ÅY"íEažß…?p¡¥×¸Æ5®qk\ãÿgïÝÖ#IrAB­WØ÷Á½Úë™À^¤Âf.eVWU›}óÍߥ”"ü`3üø´ÿçÿ|5侃N¼iþtÂ>¿þßË+ðZæu/: UBÿ\@K7MÁý·µ"䬊ªM‰ø]ÌI/z š°œ}¶À¿Bö³´½Ð3qjâv8%hÙ'h<)õÓ9°9ß6ZNÞ€bšN Ös·gê‘ÝÏ66:°gÿ•IßBÞ|¿õzL8¬,¼~÷“‹'Ƨ„GÌCf_|Ïd08>É p×õ[׸½Q98¢U¤ì8s:Þ1-xì¾Rwש‹ÅëøÚÀÙ×’‰žiù (ì~äPwg©ŠžqGÖù#ÐAïí¥ ¹¡…94u£†°Q!§Û±ëIšwœ®r¬î…»m}Ÿ§[;üˆoŠÍ|S» }OÃççPn&Äb-¸ÉJ TãÔuÒÕJQö¢_Ý{µªzTÔ¢˜´éûmàFi+™€kC¬J¤~'Iÿ{ïât(ÜÅ•}=ûÖ^|\a†“¹qgU’Û‚8uË–ˆR¶Á¦d¡+]Ô`ŒŒZCœNaálϲ&L·.ƒÂËÁL£ÿþ‰ù:ýŠÓ³õ¢ê«ÊÚJÑú(áxºG†…l­†Ù’Š&ÂQ˜öûöâÆ„ŒK™ÊȇõìØú§jz¶ •ÂGò2hLÖ8óпIàïÖŽp´dÎ8ãŒ3Î8ãg|Ú‡ÙË.ó^¼iþIØ'äï„*´´'Ã16ùFm ipÁ¸-KÄfSÁ#€ƒËÀÈÝì•âê?Y¦…@*:ýÙ¢oèÄ5Ý‹@õΚٚ;îšh¸ÙÒq5ÈS”±Pÿ,‹*«T€!ñ³ZàA†ZÌ1­òÈò*²læ*b‹ÆýÉ ]ã‚Ô«{„?¡‚‹U´¢­Ð°ˆ¼PdŽ(N«ÛN´HþÚ×êCÏü=qwÈ ]M‚q=ØT¸N2×ÿ.t˜U­K57HKáí=½Jÿ½÷§Á»VbÑi ±Y¡Ðqã“”4K(žSBB­Ã¸©+[¡Bš„±q±èâºa7•‰-ÊJ¢šÙãchù…þ?2Úþ`óŒ3Î8ãŒ3Îø-ãÓþßO{™½ŒomŸ×+wf´nÏÅ¥ºHy™XÚ±}¹f%Oá—ì´6 Ôq"•|Mw…Ž–´7°b²,ç•°rÅzèØ¾òã 'ÜOÈr%Öç>‚»2aD¹vÉ9m àÅ·JFèSf;‘õ~-©Ç”Àõºa…2ÖFòaË TE6a?q‘~Î[iØ&´£LH¯ÞXšõ*јèQH-êF€òBÆ*Eĵ¹Ž¡6Ñ7K5±b/¸SûOP}K•¡`ø(™ïf÷×±ÅÛZ.dÂ6t`°œN;2&¸-a—›"b‰ ôÈÿ`öb³u@î{Ø¿¹½së@Ø¥¯2:¯ü; :Ùj+‚ÀпPøê‡‘Ì}Bb;…E ŸNõNV>øÐÖÈk&U%"4%@ada÷C(H‡gRVqµ;þ¢Õa%¬RÝŠ‡¹¥Ïg\ð÷F”Ð/B}TçÙW9…»7Ý—éx¶¨Òmí]Ìu‰ù0 @.œWk,ÃcÕâ%nkÛx[\P‚ÈÊ‚ñô ÎM¯€É“%Þ&ÝŒÅÞËzT½¿ýE±¢[‚¥GIê$KÔ¿\½Šp@sCX©~µ–Ä/ËOTi>¬¶eU©Õ+«ÄC©EA_¾nym|’ÓcHÎ#žÅ½4õZïiVë*),i¤ÔŠU9I¯¬»Í°èHí²g&§J,Ñ ¢:áÊšüîÚRľ+ítYΙ›yÊ¡¸åÚüÁ&´`yMyÃáâ$.Ü+:»yCج¨S¦TÓýõËíR—ºN¨›È™ ¬ïbvç…ñóv,!lÃxæšÓ'´ØFP|³¯¹ýŠˆ^*ºx™ ½òþ¢[öÇ=„Ĥ–JqI3&1ú‰Ìyï]ÒtÊ;6£kË;Æ…þS÷ºéM&ÎCÔo¿Þ{BÿçJÁ©—•¹É@îa™×ìF˜-Á» œ<.Ûf)1_íNn¶²ˆgZ#†Ž5Œ!(Ò^T$s™(6Ôòq‰'ÓÄ™ *¾ ýïš¹:XÿÐ÷þðšÚ~ÓgœqÆgüÇ'_w´w;8ô_‹>ÓÓ½nzjBq¾ðå[ŽRÓ™N¶µ ƒq kXœ¾¶šz%êøÎS{ãç{Ö¼wd…KF;J2{qPwßfö~áæv=…X«ˆv_ÄXÐ:0´ÕÀS.cÚ¼‚Ü3[ŸÌ9Å¢õlâ!sý^$ÜQ¼‘ù•à Ùñ~Wêæ«/äCŠl÷/…ƒp{„A?¼–NœÕW#5y;º·SrðèØv»Þ3VïϦ uv±‘Q.C-¯ê•C2ć722:3–J=%‚¦û ú…ÍçN€¬NõËÕ¡t<2#»Jˆ¥\BþúOî£î{DìZ[WVA‹¯rX†ïcú#F€Ùz е»’¥NëOÛo’ágû¤yhýx©Ì†UY“ËtûÌ©gówr.5”~;0Í'èÏÀâ°¿K:ãŒ3Î8ãŒãø´ÿ„´v÷3E²—ÔÏ»o×>Þñ釙Ý…u˜Æ ²iÅ Ú»Õ*¦š1¥œ,¾š øD4v}fÄÖÌ+ílKBLl—Š$ôpùBd±m3ÖÄ“ŒWù¼¸`ŽuLH1"ñú|.2,lÍw©¢Ãf ihl)çZàÛœK;Åê¡PÅßGÄ(X<Ô‹¥m¿ý N@Rí!¶fcØÍ˜³w^`ÂgÂZR+ÍZûí–ÒIuÕŠùޝ6 …ý,å†J?ö4ˆ¨Üæ·¼-°šœMÍÌÈäÖ{oÔ™êÞ•pá,²MÏoÌ¢ªÄõ£>0ÿí,uÊÚ–ÔlØ>4DfúõL‚a'|çëã_q7x×ê|È‘(¨÷±‹R#é¢$ìã*v 8ôïc”âð¥gÓÜìþúäqEs 9U“'……ïC¤}0ªÇ Æîã Ú¹ms+&€ë©jØÇ^S>H«hJW$R´œ4!M˜Ç¬c¨Xª±ÒÂH¶ÝNÕp2MÆ`l‰ûïô‘¼âÐõú¨zË*ùƒÌoAHâ¨ÎÕݽ=Ýqèþë£ìE¹ A{Å¢”Ô4‹Q©è…¬V$ÊrhÂ$cGoe“»ø€=÷m[X}èN·ßÖéþY‡ÖÕÀÿŽƒôŸqÆgœqÆ_>>S²J¯QàybÕî-™¬äòàÑ• zUV¸¶â¨Ëá݉+/ Ö¦”Q C(/ѦÆRwMÆFcŸµîh,ŸKN<BÊ¢Ì1°˜oÁr­Ç²6,¢ ¦©p£­‚Ô š xIÃ/:pó/-Z8 éˆ1a“¥»ªèT%_­ »ï)Z'´ÀúïMƒÖ¨`Ñž¶N˜Þa=¹&§naéŽÐBêÔ­ê²Ü¢=]û‚üx'éƒ*›Žø?œ!]â°_³ú£IzcÕGyƒØÁªl×^«­ƒF?L ñH€Íc¢•j¾Ð‰´È0Á¾Wq±Šã ;è=„Š=IõTy¶áÙ4žÂöÖ"ö=˜xû7U¹Ø‰aòÂmÃŽ¢~s#õî9ÜÎÉléöá…¾/ãìfˆc…4?ëôÉ5'Y·&Â’ñ½)ÂÏ6­5ùѬÆEt%8¤® °Û ¨ÃæÅî Ñy¼븵;q8›â_°:åàùi;\ä#$ëßy|”Xwí\­¯PþFÌúµ•]žqÆgœqÆg”ñ:µ¯Ü‰ŽGˆû` Ghåø:y+k_é™kçÒ1ö/ónÿ÷÷±㱪eT +h€Êó9~)ÂÃÁ&µçÄ›p=!Rá>1£@@hc(œtü“€I’BNws_Eãªjû”ºÞòá6ò­­ñô§JÊ»ß÷qÓéýRe²E á&9wíÌ'Ùк¨“ßÓ-¡Òº¸,¹á:cµV¬‡;¿—¾¢¹/(È{È£Ôz©AÇ‡Ö  iðÂvßu@%0½´u@þ¾„¢¨7¥:[~Û`s‡ Ê#þÚsl¹‹‡:Q¹P›:†ü?äUNñe¨“Aù{ç‹4¤ïŠT®]ÄÝf‹Æb§ƒPoä::áœ9@µÍA|»ßL0Zckl¢]GD²ª‰}~&20Ož$H‚r1÷îÄLûð:ïþ8fZäÔb…D”NÚ|øÒ—ÿ¿–EÒà¿ ÿ>H týj¾£¢e-D—º‹a¨Æ¹P 6B÷ñ5ìÙúq]Ý•’ë'E¼ˆæ"ö«ü€ ÂæFUæ©}æš}‡ ºŠ¯»xÕ'ÜÅ·<³ƒÅ…þC¬6Gr™ÂÝݦÔF¡‘ˆ4«¾ ®†.Ó‘0µ»a >Y6ŠÈËXš‹&K4G'ŸÙÜkGØiú”Qåƒ ­«—ÿWÆ¿ú?6ÀgœqÆgœñ‡ÆgŠS/QÆ) b,ì@0lå ¯>q2[­†¯C45½~í¥S}+Ÿ¿¹r ]¸áâÓ˜qœ`ùŬ2 OÔf*{ç7±¼Î¦,eP`ë­·†¥æ>}¨²WÙ‘ ô¬Qõ|œÊ IDAT¤—ßç ÿº®F‚£´k½%†ß+¹Â'½Ð¼µnËô¦›KøÁ…ïë&ÕYÊ"Ö¼ÖpÜUØ4¥Ž–†¼©¢ÎÅ#»¥<â¯$À7É\@²»ˆÍy4½lÌ‘®ocúóï Cïóßßíý–ß·=¯hÑ\¤0[‡‰ÄÒM‚§÷ÛåýÕú:œhRiYa‹‘ªØ@Ó¬&UÑœJ•«[OÆTÓ+ÅÕs0}5sl…»Ð¬/43е*‰òk¥áfäï×ÃFùÁíéõÓ€ŸlõŽ(´‰jÀpÓ`ÃÄýÂßË5ê›Ã‡1(E 0Èé •Gñ7¾½”R»ÖªII±Tí[~õR\:'QĦ~Úî ÀBuÿ(28Ih‘IJû‚†Ÿ&/0¹…w'£w`Œ;-U ¹{ø4çês…ÊVÔN%ÛIwÖ Ò)cÆPY«ÿ•ÉðŒÔ¾r Y*."¶à ÎÉ¡·ïɵr_ŸÏ}JeÔèo6þ®×õîëŒ3Î8ãŒ3ÎøãÓ,ÈúÃÇæy1È Lµ³CN.Ì$+Íß¶ÎÒ4pÛs9ú|"‚ù°õ»—1 „Jÿ*ÉUP–°†6‰^öMš™sÕ†•Q`ÜÈ ‡õî¿k[Ó a;T!/Nóã̑Фg#’u¨÷Ý.6~«ZAÝs0¢'‰Û¾è‚âÖrcf_YÄ8|P»7jWDÚê¡4®žÄÏAv蹞OÝ箓E–±»AW i”yKŽFžá”ƸI¾ûÍ_jg•A<ÞT[4뙟&¸”®Ê›IsÒÈh*Ísví#«CÊcÊúïÕ™Ò?½Æ=íRw!n)› àãñý‚þ½¯0úËw7DõXÍ„ÚóÄD>!ð¦…~2Ö#2“ôíÂC•ºô±wu³;Ô¬q*V®'B.ùHí?RL’§¨*bã 'd´»SâÛ!úó›2!Vw<Нÿ6ãÈqÆgœqÆ{㓯7ÿ•Ã@ VF¢£»Jô(aRW&Ï¥ÖG„A„Šœ† Vô–Fù…Ž%‰•®Ÿ—ƒòIUòÝ RQ˜¯q¨ÂñËO–Íòå:Ù}åëÜcѾ,'c”zu6cAO|vÔ{K.…yÈèîó¥Dã¶¥<.óÇ(:¯©B[Ã¥r-¿îSëŸfÉpÒËéV d«]¢¶2ÕÜü”ÏùͰTÀ€&¥ ç5ÇtV6 ˆMÛ43ƒOõ lÑQ6 ?>lÜüS•üdL¯hçÍN5Såi+w_ô(Ã-t F˜‡ƒÍ·>f«"ÙèP$tñ6çfµë×j–׬Sbh¶âœ¢hïˆÇ«–«c‘ìÝöƒsLÚM„¾M+n¨LTˆÈ-÷Ã%(óêÏ«à,¿t“;Äv8Ö;I¼ø›q€v”ä4?Y•dyÜ7Ö©U9éDélhˆ¤ ­EÿÓ·£¶­ˆ   tõ§ ýß)ç>™M•eÞ–MmaÜ¡ CUà.>ÕÎ'îY¤`qpßUl‚ŸášÑÆ–úèIë±Li9§wdú·øôO‰ªo•åª|EŒKS_…=¼ºß?ÃVs&mSêvþ»ã_Iÿ?ãŒ3Î8ãŒ3þÜøäÿ)D—Èúݾìrùa“iw0JH!:¯§òÉAY^ú‹¾ïTj¶ÐßÂ@BÆîå§R¥Zû¾ò”$tLÒ΀›rLêëÖ,ä Ö~y‡"ê³MÎÝkŽ?ÁE/2ÀåÍ!ãtÞé´¶ª°ºBçðµûqúC™ ~½?Žý9ʦïï±ï7¿±Êôoê·Úæs®f‰ÍT5ÒG>æaÊÑØz‹ÉévƒóaOŸ¤ÄJ²[„ü¸V°56Áç3ù‚—ùB 4ËÈçÓwýÂ{©¢úµ”ÌÖ.ÃÉÒb‘gÏà^|;Ç5U^·¡ŸA®½+c°/ZK슬¥ÀÝãCãÖ¯‰Qõ‹Ímªs.Õ’BºöpATk©ûvÔkº_„VN6ä÷K™ýö(¡Î®y(Ñãò&­ôïz=sœg@èREŽw‚W­ÿÂêG­z-Úe=Øýª\~ú®ËN gñWmÏìþú+Ü dÐ;ò­£àt¥Ø`÷X½ˆÍþ¼úfSejÞ&̹-À&}4ÈÓÄ6î¤+7un@ͧmaÍ“½&Ï©ˆ®¶Ší‘ßåt¡ñbèÁâ|N>ŽWµá_=ÝÎö/a–‹=ÍgœqÆgœq†Ÿö]6Õï3À‚P×>z²Œ JõvÏ(µÙàýÛe­¶P`ß$t‹kB¼/…Ñ[ê'؃ )oa¤â×ÔÏS©Ž‚{pQú'KdSi‘D¸vTÑÓͦT¨>gåßà‘;_š7Ò®”bóƒ¸ö£´F´«ï]Ä@|z/ N¶|;,–r•¨j—æ¦ Àˆ¯Ya>Ê?Y¼Uᨔ°@“¾¸Ã¨Å^-âï2cJYƒmšk M¿‹ôwÅFn+¡@Z«=”T¶+¬C†õöH¤È…a@‡|‘¼ì­¹N%ã§è¢!ÚÞRiÁÇ6#ŽÀ»s¡cÐrOµzÄ´©öÓRš ñÞ Z³-ˆ øÆnØËol…ìûl°VqÆ¥»HS6ÊZ<Þ}À{ñ¾"_Cé.–E×1VOg_½p:«Â»¿©èO~ïrr"Õ–»®õ”jܯK}qŒ1æRPO¹ÝÚ§ë#ËêNü÷ؽß¾…qÜ[È÷ÓéÈÃ5‹X°©÷’ýToýó SH¡Ž¦<~/ xá#ÆFe®Ãt”33lüu×ßuþmuXhK­ý2ÆçÆN·ŒïŽFŠ~#®ªé}§Šë@Bÿ1$Ò^ªhöý^É}ÿòÿIž±ü3W¬EÐôÆgœqÆg„ñi—È b4¤À ÝÇm=—6K²p…>F»ÌÖÀ6BÅ1÷)ÒŒ)‹3ð.ºé³YFM¡æ¾—¾©e±•Æ8#Ak๶†}@Ž)vém¹Ì"°By{‰éúûwï|Q_ Yk)_S—w§ùM-¸Hvý{”éö3ØfÑaó‚›SV_t5]àÄÜ]ãõÉ{AÌ‘¨vS–¤ÀZ §½6¨R¥·»pjTÞÿÜòRZ²Ù£òE$’™7ó:kq[Õ¦¶†òaŽË²ÙÏ ¹ž]‹¹_p1t‰!wcñWàT‹Ã5PòÖ6V[Üšò†x¤è½fÞúòì¨Æß5Úƒ²ú²üú²0í5 þ«“%Œ ,r_.¬JÛÅÞtoãâáШÍvp 4ÆâèP":V¶‡Bñ¼#+ÜËeQ ‹ÃîÛÜY–,óóÚÐ>,ª*IïPÞ“’z2Îy: ^. áø×Ë^Ìëtš îâï~‚(ýÿÁ³Ù4ìªSj%éx*Òy(T’µW1ÈõÙ£º¡LRzwÁR?£.ø›rÓ@>mÑÅ+PæX.º^ ¹›;Åp—hÛYRgFÿ×çåFlÿ`ÏþZôÿ·èaþæ?ÿgœqÆgœqÆ¿e|â?w¸IÓN¨…sÔ% ¶²€Îu(Yb‡­h† [¡®°¤YàÈ¥LÞóÖÌ¥Êu‹qø8EnIÜ\G¿í qèßD¦mÖVŒðNÑ è_ˆ«ÄƒÉ‚’Ù M¹‚“:d ¬óbœ±Ðà ¸H¶Y:ÙÖ–„ª 4³i?—‚Të?ç"o¬Êï\-\t__f,ö$©°7+ªt’þÛ2‡EÊYêa—ÂõNks=)8khãŒ3Î8ãŒ?:>=tñMò´‚½!¢±¬ rm`3X„>Ÿ>f…ˆ2sbãî«ÊŽcD:´wÑ}þÓõ;Ë~…I¹ÓÚ¨Åvè S)q“Élúø-R ªlŠ1íDAZ—梭ŒÈ°V˜¦¢Ÿæ ÆŠ)i‚剺õZª­± yAÑ„‘¼sSfkÊ¢ÙWI6 K+tpkqUX$Úü"ÐôpÚœÈCX’Xï‘ÀèI[‹2>õ¦ig×îm­Uã1m¿AˆÃ 5س¼ÝÔÜ@²ëUºä­-î±Ib³ì´lŠuâñOô!Õ¨÷°ßôª^Н䣋k’5€àjm+O£³B©¶G»Ÿû¯÷ûeïOu“vá,µÛìhN¿qXoQŽA,‚ìl¸äzþ²»åB`áAm¶”b2sÚZé)c§& úï—ª×ÉS%¾þÄÇý$YôÉ%ôRp=šÊUcJ íãm‚ «B/uï°ø°]!¼²!6@ñqé¦bg’d/ß…r„¾ã׳õWÕí&´G@ ÿC­QþSîÌ îÂì¨E—75Ë ÙÀ«pÑö‰eËEÃwin¶ Ý{*êËDoŽÒºéÔ®Ù8·Ó@=µ—ÃÖi3¾ =D/°M“Hí ½ °f Ë`ö´xZ¤8hõoçyžqÆgœqÆŸ–(`›ú#Æ“ãO?ñ‰(숨>YHOÎ`Çà ¾¹£6Ú;*%ØùŒ€és4QØ‹eÉU ¦è7`×D¼w?HÀ³d-€E3ûÈYª¦Aé!šÙ¡hÑ2ƒÛyÖˆDøtºbïW0%¦lLPTbÄõxp…“1Çe˜ÔEz%“õËÃ7s¿ÚÒ´~QO4…Å'³UpF·—:ÒnWÀŽ ×OF£SÝt›_ˆ²o]l˜7d;ä„ì`‰:TXåÆßc¿+Êú1¹»3´@}Ù^”¨fZqxê"‚x`o5}Oýøîä@Ñ «Ô*çõÈþ"CFi©cÎFBPðOQòìezJ ˆß QŒÉ1R™ì÷OïúJuq‡Ý[Ô㢉õ½T†G’ÈOè9ÑèÞXžBVf5·¸ æ3£ò’yñ·Xʽ¤¸­}­Ú1 `ÊUâÈ•xúU¬Ìj E¤J±ÝhHêp¤­»oY§$›Ãg^ß[–BsŠT‡}˜ù KŠÿ,Q4ùˆ0ú²4GWeç¤ET}nÂ>ƒÅ\Öewm¨öcà$±ø3ºþ²u¨ëgœqÆgœqÆß|&ÝçÀ#+”Œ1¢xå:†’¹¢o/ðë>̈¢œè{hýïØ7uF{5†d8¼J!*éUü'â}k‘Yg +6n½,Ìl:š]‚“2øµJ`2”À—]}*IÛ‡ Ôåep}"‡Ø1àIOt’¾úªX–ëËϚмãêéæä7xI›s’òßødNËŸýÀŽu‘‡õ]8xò\  «oŒ­­©Çª¾›ÈGŃˆ©­SS¶`\ 7‰¼# ±ŒE…¶@Ø¿R©Èôëª>¨ªM`JØ ·Îý‰W¶‚Ù÷8p™=¢—Dâ"°Hû~»L:­xVÚ“—HÄv/†;•ŰPRÅ-tÆæ«·æüÆVx;ë|wi'Yyë‹¥êl Ìav‰ÚLš½nTüç>¼‚ÙÀÕ‹Sb Ϻ¬Ü¸¼#÷pBI))Ìà–‰Ëha\o¤Žkå-óp¡—"ˆŸ·Q9HQîïŒ3ëÖg÷Ao=’¨ÜÂ7=EP|vxyÀu¢¢ßÇü‘Áuˆ˜#R”Å\îÞa±+Ž_;}%oæA ·2¼èÄâ[“Þ ´\D™'c¨abPþí+çýèRE .ïµi¹5&1óõnL³Í»ûäú­ZÅ-?ý(ûÎÝŸqÆgœqÆgüǧE?±šêÐQÀ*0“ßK*%Ö¿Iůƒ‹U—1\–€o“s&[¿PBxÿï"­+8Äåv¸íUU‹n-ij’KNÛXÒZ|+ÊgN8ýǪë9çÖç±!­ïã&… .~ñ¨›²­hUÝ øòt™*{{†ùÝݳ‚JI¶'J:õÏðÛÀƒ:pSÕPz}h‚ÓjÝDµm± aZB‘ú;ÔI!*û-rCu¯˜ï(K$Chhi,.ÒèÜÀ4võƒžÆˆ¾Q2=q!xôÕcs“Mz[Q“]ÝÝÇ>`Á5rf¡÷ÃòšÖ{hœ‡ÆÛúø«‡…ÅeÑ*˜Ù^òŽ´'³Iù~ëkb(ÞPEá?™­¤tFÅf“÷9úpíQeƒÊëj,‰O#FÚÍ÷b?úWgœqÆgœqÆýødl¬Æ˜Qk¾ñY‹>s¡à©ô79ÎÌ`/GWoÕcK4ü+êÜ#& j£ØIâÑqJrB?ª^Âöؼ+& Æ ºåÃÒ‘ë­tl4fª'’ ß ±õÖ,9òñ é[H¦^íÌ Ž9¤sÃ%UÓÎAÚ§µÃe>A#\èŸ åÜAIíVpƒ¨faý›C*8ƒ¡[Ä@ØëcÁ s¥F\¡éæ"rùmy=‚žßüNîVè¨ÔPæNÿÇýGʬcô…FmXÁª ÌV™…N(Šç¤šŠÄÀµé°üP Ká"}-Ð<=ÀЇ= ‹²#¬‚öÏãD·$•ƒˆ^éò$uè[«kTvC/f2ìuuwEÚíû|ÄCi49Uª½˜\ƒÙÞûâx¸Á¡ÿÒmØž7±3ToÞÆÝ%ÜJâT¡Õ`Ÿ±gE²æbü:µ?îzɰåÕÆÁÜŽy èÕÛÒÂtð0÷¦Z h·ÈÊ”ôÇö·Ô’+­³’èúw]ãªYJ4ºn¨úö—ÜÃúz·ƒØ$”ײñò ³¶ØkKãš7Ε‡Kj“­-E8ÊxÐߨ¶.Åç0u³Ùœ¨L',ø³½yÌÒ7x+èý}ãØœqÆgœqÆÿ”ñzW›$ùŽ¡ 3.„¦\_…ñÝrcîJ°&¶ ›Ã͘Á&#»KÜÖÇå&3:åÆ*£_É_}\—üïD¨sº¸HòƒYÝê›Ô‡mz_mˆQ~ßB(Vs¦6ÜùÊ‚ds[4¤Z5rø ˆÎ +/(‹Bĺ\kWsf?{AÉ~`Í EŠ•zw¾=ðã_ƒÆóf‚j:G¿§éjëÂMD…úëÄ4ÊtÛŽØÁp÷£Xm“z •ÈË@Âüúù“ÖÄ][Ùaé€dQ€ ^¹hå—ÞÂßkL©«^î®–Š%%Æf› 9ÂRÉa8,¶%±¤‹£¬™8SPç€Ú¬8W¢‚ùÒ<™ÒÒ³ú*3´Yü¯©«Ø_ð-é¶qñÃ^´Ú‡Ù¾Z _¡£[,—¾6)Œ”„0ãJËe¶ýÌèàZ\,”èŒ=ĪW‚Š3V‡~oO\{˜ÙÇú¯#I»÷ ¿M…gR«•V–jC=!õù<Kî’ÂE6¡ð¸$©wYö¬vl¨5'”Dÿ›@×Ïd4ûòN)óÚ:Ã[¨m ý5{™¯ÚO³Ûª2+éN‹»oÛFÌ–ù±ÜN1>½úæÁÅ£N†XOŠïï·zêqú( ]@w©˜jß(KXSbù×Sç8ãŒ3Î8ãŒÁøLøŠÂCg#æãTÑÂ\ù(ñšü ¶s‚nexËMž}ÂVipœEwÐ_Ž¿}Ï•c,Ò`3ëÅ^5#‚…ltª¬Æßo]´T›º¤†ÌΞqœØ^²¢ˆoè?°P¡¹Lðw÷;Ë8ºj;<ÁÙã’³}=öoîx~JT+e¹H|)±*Ò­ðÁaûDÑtÂ`Þéóf*Pé"Ñ·(Å «ýrzNd³- ÎP4Z¼”ª?ÆÖ#=´YTꫬ¸Ô9Á¾”/x®Qš< ð 7ÜÏÆ´é2=t§îö¦1žzó.†r¬HwС„žÏ²,CQ4MWì;¨ÐoËŒšo‹=id@WrdGFò’´ÒQDªÌáØUOcó6·WÿGÌ{Eí›IZ|)R@ãïÒBŸV6(öA`é·ðü ¾1ß«­ó*Û{ÿŒì¾+ú^:&ùNÝü÷ñ •…oÚr—B‹@ï¯oãÞª÷©Êýüg9¢óv½ñA'jY;¤ž½V»¯¾{bHg™‹V‡§V| ˆ/}ùÚÀÒ-¦ÝcZ­;ЄÄý÷‘3´ÖÙfTHyyσÃgAlÓ¶ÿ-к˜mའ‹¥ôÝÚÿÿ~Ðÿ3Î8ãŒ3ÎøŒÏ_Ì)4–`€lt,Ö«þh‰¤äÌ!åN”dŽmvg€’ÈÞd±¸\îPù ÄU}vÔÉY3Š&i¶\{™°”-|$ã+¦JóœÃžf¡"‡ç§@Ô¡@aƒ!Á|+øàÖI3Š{ ;…vDÈÊx{Z~ÃÀíQÚ€1Må,² ù>¹$‰Sà;÷Ï^ :h“ŠØkBp¶UIJÛ¹0÷Y™ 'Ó†@NXa×Å®hçÊcƒ<šÿ4Øs¥Øc#§ï̘Ì3ÐVÀýOë»8™Žn=ªâL7gèÝŒ¿ÕjòèÈHg‡9ä÷;î—«EÚ]·w4ÈõXA´"arVÊ4½ËÕu;¨EfIîë‘$Ðj½›êôÙºã×G|„TUqø®K\tõ_–¯×¢8‡Yú ät§'lUû÷gq³A& ®¸¼$-{š} Èþ?[%›Ó*\ašæ¼÷¦?pšô¬o6ó$AYUû­“+ƒ®†w‚&¶ÙØnV+:Õ}1i¿ Ÿ‰=nþ┡8þ°yw©ÊUö¢PN¶a噸#juŒÛžì´ X'6¼›‡® ñÅà¡[q‚Ò½fy±ÒÒ%bZ 6çÌ£8Ð6`tÉÓ÷ä3lèÛ¼ãgî]„N}Éo‡zÆgœqÆgü®ñ¹KfMçïAMËpÛõϘÏ÷”vËF¨4ùøËnÐØó Ž_o[y‹: ÞºíÇs#d®>«·3¹5Fbš­ø•Wb³Vm’“z õÛ"°cJ§¸Î szÖ(Îr]¤ä¶›Hë´¹ê({PL·ãÀcX㪼őžhRMd.N›ø‰JÛdãŽ$‰sOÙ%!ì ‚Ë×C“_ yêUB.ݽš)ê¹óZ…[û*7_ͰHÕ¼®åãÑ>Qp‡‹©2o¢f+u)Ö¡¸ÇÜB®žeæ[ø?Ú»Oê°–t¯ïl°Ãz‘î¾áÊ$òÍý½rŒJôlðhîØØ½—A™XÏVÇrØ3$£Œ IDAT½½š£TAj÷;ä­L‚¸çÀìöŠÀ7i¯×]'üeBÃ"üriÉ–«.Ú}PRâi˜OÉÿð¥„Ûô6¼x[ìBÒõ¼Y_º° —"ÏJÏyÊŽP þ¾uÁIÑ^#]ª ,g댈¹8q˜\äžãY‡ï£®ä*ÎÚ¹ó{¹~ÑœŒ’%“ÂD­Ô¾w„5‹èé_×ÖœáR¼ýÏ‚–‡>V±F—ÜkŸÿq¡3Î8ãŒ3Î8ã/Ÿ@<ï8)*šgI[ AVþZÆÎj,íó1Feg¸¯£–tÜE’8÷|ßîÿeËXJíÃA÷úù;¡ªš¹VäM0"6zöá8·bkaLÉ*¾ETEP‹†:Í>ÑÔis"íq«AŸÊF)!ËÞT–õã’Ϻѕ,-å³¥XóüºÙ ‡}E‡ì5è{…Š ÐC¶¹”‡³ŸŽjU(Dþi/LŒ¤0ÓPàiÕ'4L˜ç$,`Ú‡`ýŒpËéÌ:Ì5Ý¿ŒöÁ^ÝÊZ™Á+ßúšѧÝÍé ‹IZ-’•LêÀšÀ²q°Ì3‘¸r#kÙíì3¢åmZ›[ªôë@ÿp²¬M×+ƒFÊf3Å’x¨èq5—0ðÌkaõÍWG$h°ùÆ©- g¨eüé¬×«×…ð3DÁ°ÐbÃë¶{€Ú(×8™¶ðçÜ~7’ÝŸž|–°ãv’ÏÉøáùÊ›'‡£¹»8´^‡þ‹™¥ƒÀbò„P§Y… ëoS@’œßhÈË_L= _e²ýºåÿ„ÆGOê'¾ž‰^ѼŸ'R­÷æÉ"ˆŸëŽ+:°×bzye³(ÙÕ !ã–òÃ\*æêèñ€/ÕÖ .„—²ÂU7ðRwd(ÊaêWôzSaB¢¬cB3bOG ãåøtÉ­ûÃ|‰ßÙRBˆÞ8„ßõ‰Úó=¼sìy¶`=“«'„lÔèT–;øM™ýÁⱕ*d³¼ý[–!ÖÐaü­7,#ïýáÊ­f÷ ‡nWý4°0oŽŸ›óÁÚ:ãŒ3Î8ãŒ3Îø ãSbßc$âSÍ®t KPË#±Pß_™…Œ>Ð;6Po”h;‡¶’ªÙ-h¸Þ…—¥…Œˆ b´°ó*¢;ïâÄ”AÁÖy¢ÔŽfh›å.üE–y"§ãñqDîঋ™A×ZœÅ PÞl7ÿ±ž?Ì%öË`ƒµ¬¦·y&Zú7³"ê«Z¤vÍów3ø;¾À$0‡õlªÈ^¸m!ŠÕ¶ºw$qûQ—øU_s>dBY´«¤í×b+!ºlMÞÁU>L.¦¹&‚8‰õz/“T.h­,0V^ÝF´ö¤µ° Aب¶ÙG/_Úº`Oôì)½&ÚѤÇÉ «À¦þT/ c-CžÆ«ž¬-Vž`:ê7ŒÐöõêñÖzI8ò î¿hn¶äè°¤¿¢5š9áþ™¼{•dîæÈ«Îá7Cd¡•°!+AÂ8Ñy±^ÛòárýT'Dzk¿ö±Wñ5¹¦J§7•»âJg¹yŽxIúd`§ˆ•$þOX “ KŶí¼ÿÃA•ˆ“㽞ÞT+âÌ’zôµ”˜Tž€¬¬5HÒWèÙØ«/î-úu„ãËKØøp£r¬ 3è~ô½ÎʹuLº"õ)Ô"üŽ•ÑÁå}a¹÷Ru¤=|0‘?ãŒ3Î8ãŒ3þ¹ã3Çaè*¿4^}£‘¬¢m-\OßýÞ/‹ÊÀEùWæä¡íš„B¤^´ %âF¤J8,ô_{~.²ä®'ï{â#ë‡)3„Hùº˜¿‹€»–…;í,\‹qHÑÞBhêèa4¸¦:ût…šÌ˜r6NA§BI!°š6¶ƒH¡½ô‚½Õ¨Xleª+Så.å,ØÒ}"öð‚øËY ß5&«ß†ÄS[ Ý•qØßíM3·³X§Es÷n•{oÁkO[Ξ5±}ªòsfž n™hœ~löûV/Ô­@V.±§ÜU·D¶6×e E zþrlœš÷üùª`{âäåèø ñ¯ä¡@”X °èÁè,Ú=žŽ41ê×ñ{ZNK~n˜¾:ç^–õÇØ7Æmã;”}ÜË´¤˜ðsbÑ]±•‹Ñ.Þ%8f=ßýys&Ì?ÚYªÞ½¤M7U®>–<}' ½kµ&~€ZlàE>x-3@IÛ3E2K{sº²6ÊÅi‚z¢Y£2/µòÆ¢úˆþÅÔ©ì‚d–¨¥í€¥*#ïz6²ÑÿZ:êZ±>ŠãÏT;¯î¿z×̺rÿðz>o‘Z°j)PI&ÊÉ%žÒh/ÿCÛÞS8ãŒ3Î8ãŒ3þ¹ãÓ²Lê<.¯ÐA%…ÛjcÁ-k›àŒ/¹+VЃo€’e)bn \°‹ Ù`||©x_µ@ì¬,òÈ¢OMlü|éÉØºQŸÚŸY>–\N˜Í‰ÄÉk¢º)ƒ¢mu…º¾.ed°ë¼D­; ÝlªO·–ùÑlíÔÝ*áZLe ¬0ÙÁ©J‰V%6@3rm¢\”ôÇüN›ÔlM­ëªóPa£¯¿bQ£Fs¿J¦\ ¥ÖVÃu—éˆ"M–mϹ°OŽ \â=v#†0!cR瀇oÖŠö;¿ÀÇy>öªbs½MO­¥Õ&Š£i„·vî~Ù@Âý›]®j…ѸäZD:ˆõ§Ïcع7 ²õS—øÒ“…Ííÿ¾«Ðfº³T6?²Ïw4’çÌÞé ‚(¿;Aã¹¾¥pÕÚˆœ¹×çVçsMio 8¯û¯„Õ-ûUÈ2O€¢¡‡æ,,ßÂzDªKZHV"`ÍRg¬ªèЫ–U0-×îÆ›(¸PÊbøUH)#Æ ô'¿\›ÕiŠYô%m:l7”¢mª$y*Sñž4r•þ?Ž[Ü7E~J½öûMª*ŒY[¹¸~#–gªö¬¦Í:u þôžî>ó3Î8ãŒ3Î8㌿r|Öh±#™^´8ïg›R¥;9íØÌ…[Â5yÍ%ÆÆHVJxKIY(nB¥i?1ÌòŽ’Æ þsìë‰yrí[ØÆuBÔlˆ­ ‚Ë=•z3Ä£Bù_5•Žh&~ å{ûTIóéÔ· ™~05<à¿·Ó°yl®*OÑýŒ‡mgž\|xÅtÁo<•?0xO*y×Þ¥¹·o?€ä([g¯Ýæ†T.×ÐNy¼/W€¥­a£CÁ…èË$ôëï¿ÈÈŒºaßdO%2(·ÛM[ƒoM„ÉOtû‹r—Ã1[ÓÈÄ(TÒ]mgØÂÕºBÑ3á,¡úrj7^† ©}û]{ªvÇoôBOžšÀH í$¬wJÕñXÞÌ8×rS« íYÍbt©Úpíf•ð‘]nñFO½ïVwÝYì7|¬ÕÔ!ä“`üv˜áãfë¿~½WD«”Üï 1N¼ àܤˆÍI!xè>RE¬»„û–#E‡“œ¥°âoš‰*¤«¡qü'F¯£›MÂø:âBÐySrCÓë0uh5[©Î¦Šþ÷­«(éLýºlá„7‹ÒÝ"{À^T£_éH•v–öo¸[.¶N™º(æå& u ü¿õ@~o=`ã({úKgœqÆgœqÆd|vп F¡‚_&õö:nÛL³·¨v¢åv®˜Šä5…UbèŒÒìãÎ5q2)>ûÌÖòlÒ†Î6Y¥=S®08á>?©cígôl»ë©02^GÊèåíC9ª\ÿ‡“KÞuöà uFÁ‘èüy_»it¤9< _ü·t‹³¹(üØN{^‰W6V è/)`¦&c‘Æv$eÔ¶ƒF{Mô ˜†Ñç°LÅ­Æ I!ò·ç+V/ñ±w{r~º“…â#·— ‰dö»¨ˆíørU;Ã7Ÿ)·Wogk?µËØ^É‹88‚v¿š•Á1†)ã[]›y®\"½wî=‹f©(ù ‹aLýPWÀ>sÜÆ7Ž ÁBWþyS×aÁÕ¢ã é|˜ÊQxÙÕú«­õÈçè‹eòŽ=U4ÒØÚ¾ƒ Üî&©äɰ¡.C®µ¥Hduîb-ñéTÛ8Ç BORoD¥n’So¦²çL\)†µv^<œ9~¬)þ6Ë4qû˜m“:?mìž/ù’8XÁ¬íŽõ7–)»¥­ˆ®µæîPâå  >40ôÕÙce¯5ß«~ ÒÑ~Yp÷íúâ„)˜ÄC¸ñR±‹þ°Gü‹F:FMßÔÕ‘?ZªÎš%°ÄX5|ö›´úÞ;ÈÒKí|¯l§`ÄsÑ)› K&ÕÛ¸ËTÅjcD£DD×y#ËÃèÞr/KõÕïGú ãžlLbzï'C|S)‚QfíZ†L.˜NbðÞ|B\áWsî…ĶÙmÚä­€oÜÙîr‚mX{þ~Ðôxƒõ7ˆOí v„ÉL‹ç"=¼hå“íá(»â¼N]·<ךó:½ÖrX‡3gNëC‡k錼Ä:jï „hŸ**³î4_¥–Š.l²ƒšÔ™») HR„Ø ,\œ˜-rªC‡¹”‹:Q§“äA´E•¥é¯Ø'eü±1d:ëc¥[ˆŽÿÉûØxÎ8ãŒ3Î8ãŒ¿Çøô§86XÒ7ëG¶$Cˆ¼™òÄAw‹Àźžt,#VÿcßaýÖŠ¡§ˆ&ô}GðçQT B5§1Èùåzж ÈÌaaQV“µuÁÑžD?Ñ7amwi§X4uŒ5 ôñ=ª—§nUqí{©âj} î»Ìe*¼/՛­âá-W/‡ìù”dýT ”S›åÆ™£$ÀÍ=kÂÚL¢ß`¬‡ ¿6múa`_á| ~çzP_ïˆqþX.çž ¯>4”÷kÓ[Ü6Ù ë]Ÿuµ’©8½/Sú3í^QÃ=Ÿ“@Ê=qk ®°-!Í b¹ÐÂoD~!ÜYV&GžŒñÄíäŒLÇûr…¹,Š­ÐýÙ±ñW !ÈùNiêŒ3Î8ãŒ3þgǧE=˜fH]Eå¯ƒŠ‹ÔïppòìÊZ0qëL2ƒGñXWØ 3¸Yè¨s‰ó¹Ç¥zT¥äý§•Þ’ÜC¿ôûSp&Ì@€¨nÙeàHEý‚ ¯`Ç=x¥bgÜcûbN¿íæ5ëùáMAÕ·ïúôr#PåÖ\+.¶à—aiæù0àΩ W·³C ãú»ÄYÃot€’Èx˜UjHÅìU_’7cû˹$˜ÌOKÜ+…ýµðý W™©$£@®Ç9Œf/ÚÇÕ£@§È‘¨Ó#TêÀä®94yxŨܵ†Fa°„ߣ‡®&ˆÄ„ŽÙÎù˜ÞÊVqzCâŸê,õ{ª¶ö¶¯m*(÷‘«rhú:qËñ„¸Ùúˆä†0YLÇM¸.“Œ §s|à ‡.ŽãëlCƒ>zæù¤¤€>/(ÖLIޤó‘wIJ„iòiËÉ¡²×svËáRùÿ¢Ð{<ñ¿ìQú°¸*µEξ Å0^Êá¯'9šf#,ê¾ésèÍw ëºNÆK3*u£¦Âím·pu£b VÓ5Ò^Þ£þËäœz·:’þxê]ó–ïΪqNÃÈYœ§¥ &ÑQ«./ÈúÖ/lؽ|Gs쿚‹âù¥V væÒVЬ{7Œ½3Û¿<a ¢?úgœqÆgœñŸ”Q@&Î6Çâ¢f'Âb"@üŠRUúØ¥[z§Ð2‚‡f!åtlhYÍH¯"›)ÙEëµv? W¥²È9¥¢ª Y/êIÉŠS¿Ø}8I‚Y³ÆÞ#À.Ý (ÒîW•ž4çRfsŒí&(B=þ=2…OP§3¦s V5V‡x•@Ô««,„ˆÞ> δ9yP¥s6SàÑ8œ~QK#ÚÒÑ"Äý¢Ö\>Ⱦtª]7u60¢ÿ¡»ÅVd*þ€­7Í,ûSu¹|p¾ž'·hî¹4=fQüîÑÒ¡Šß5±¾uÌWn«•ž<±·i>Ý`/|÷7§rqÆgœqÆ¿}|jNe¢ÃEí²ý|Él ÂÛé× ¶¦vE–ÈåVÿ¨¢N—fÅ—´K=Æzt¯A!JÀà;WÑ¢Dÿ¿3‡’À@¾.’É!x"sÚO¥]~i2\ˆ[€]ÒUÐöá‹Âú\BÛ’„†Ëý‡@¦ÈÂ'•yG¹nÖ¹¢7¼¾“;a‡æé?„i€85—heh hk@νïÿM½èL5qžÃܬI1 –jQÞøÁM'(¹k2Èï¯sV´x;‰„.ôÄ:pŠ Ü)Ö#ž:jsÝÑ­8)®ÒNT+þÛRñ€ ï4.[é<ñ`*šþ«nç³8Vgñ`{©Æ¦p9È›)wAóÆïMÔñèÞGý(q¸{ŸjäÂ?§ã§ýüðjc¬å½úWL ›‚¼IÒÅjg8nrÈÅÖK±írxÅÞì=Å—]Óu}=.až¨Kõ½C¾¸Añ6³× [ãÉ,d5Sqú¢ÝG™Ç¦`óÒk—C¸Õºè{@]©cföñ…‡×™h7}4˜C‚KËn˜Þó.Ѹt´/˜6Q M0ÜÅ!Z h‹´TëCf9f°Ú@P÷«F!ó)Ø)»»†ƒéÛÁMFØg ®õ›ûi'WÐuó,oG¶ÔTYÑyÚÝgœqÆgœqÆ¿w|Þÿó£Å?`¹Ÿ½lvç@è)HA¼Ûn‡Øm ´1à¾?-%Ì]F¤º±u´G'jö囇^¥êoÁ´f]í4„¢ hs*›$ØaˆX“§d |+ø;ôÌ‚ËA­X¦xÒ´ íâ+02„éw×¢FÈœÔ m/%”È=ÆÕž§aœª6&’ÿBI†¬©vg4("—“«×þ½<*ñ’@ ¼'¹Cˆjq(Lû“«2H½×ËKÕ-RÒè•7¾„;ÜVYr;ÑfÑÃÜ u‹ýd•ªs"­:¡UÕȾ§€ŸuuºÒóÇÇl_惘±&@?ñ`øŒvÏ fsAp²±YJ)KÑ!ÝW"fãf¯×BC¹’è©»Æ=åÞä½ËèŽ r6é5:Œ)`åQV¥SÖ¶Ò°•è óAp+§«kÖ& ›8ÿŽÛ,‚ÂÀ­½“ϻʖÀ䉾?‹ýÖŠæE#Aêõމê 2áãþÄG±¢!r/Ôà‡!´¢45{à=H¹‚Àwä\Zr“J ¶ sœ“©Áó1hHú~8¶OÒßHzùTïÛv~ì¯ i+Bd,Ú­¯6è9PÃÔ:uͽØf³æjOd,÷Åp~×`‰<»Êßra™N±av%;̵§³‘ñÏôUðÔÎ8ãŒ3Î8ãŒñ™ƒDos¶l0ûø%@¡2ʘ‘@’RA6h¢O`*¡FþçGLêx3æqOnõ:BøÂ…þ«„…È­mú #ZŸØ³O;(°Wà.ŽÄ}¨xSá ü­I¯›%oüª|Òõ×&gcSj€~qf4[:,•ŠM@ŒÅ–§ý+7`§%ìÑCyX ˜U¡Âë´TwÖ5<'Õ8ɉ›(Ÿ~Ö˜}x9Bå=6Z lòÎç]³gÒãÌ…dP3†?L(dMˆm]Ð㞌àeÕ\©•ª˜&¹"S/Ÿ?œ<·à,Ë—•dß™sþÁU¡ÙÑ^— kÔð6등V‚¬C¬º©ÈG3lËH²€±A © ¿`¯ôÛÿ†äÌf€µ|#"b"¿X™‘åaW/@òg¥Åt®ù1¬ÓÎÆ¯œ5¾JÙ#T­±•j›éðÈ»bR<ô_·D³Æi¥]^£Rÿ‡e5$0„ ßô’k¹‰ù¬¿ àÜ€VÕÁ9ÑØs\]áŒ)y1æJJÔÁl—u[—/MKPb]+UXùËRm›ÆJvÀh¬u™÷ˆÊw‰»ŽÕ£ÍÞ¿anÀuG1¸· …þçgSè œ³²Öæ)¹¨$1È·ÎÍiÖ ]~[8æwû·²;úvÌu>‡;‡5?7NÓ?ÞcËêŒ3Î8ãŒ3ÎøŸBФ¸þ¯wí¾˜ªhr§~.Ú]q“\’­œY.+¾ãuBµÜ•®ogIã¡¡ôø"„KÍ%Hml…ÐwÏ|ñLyÌÖ”H•ŽˆE!z}¥Û!÷4LM=ă- )ö}ŽA­€®ª*4òãYèíª„ŸIµÙšRÁÖG àÌf÷<„Îñô¤NË`CŠS“·Ð¡<Ñ)Ác Üï/«,_1בá6¬ó²‚QŽ¿ij%·Ìpk[·j PÔÆ‘$飼5ÔLÈðKÞ ô MËNÉñÒMnŒïá¥@LH .Á—"àõK¾ˆUXe¶Eî?Aÿù ö-k0ªz€# IDAT¤x0È%¹…SxwkÓÌÿA¡^•ÍrÌ+»Sç˜ûÎ&t[BäP¾5 äS×¹áîHÛrðc`ïa¡¯‘ïuŠŠ²yK˜÷¼ÆM±.Yψ”‹ôЬîXäÝdu¶¸›m˜÷:'Âû· !tÛô2÷÷ŸOL¾KM^Þ z§b³ –ñøCµ\J¬&ÊT}7‰ªÿRŠj€†’QV]à«òDÛ_ÔÅç–U¦@³©"P¶‚¸ÒêµþŸ7캬[iÌ× £ }¡™¯Ð|ëS®ô7² È­èälx`¯Eö¯ÀÖæ ¹qgº©ƒå¬»T ]n˜³qú Î8ãŒ3Î8ãŸ>>EÅÜÞúøR Û:šdý¿¸û!IàÈ€žÉ;_Œ/,wâVŸ†Y ”Ò%(”ý å&*¯°ê›Ó™¶™N!j<=¸8æä?QÒ¨èÆ›´8:ž /¶ eÂ&Yô¹d¯Tw\Ž™çÇ8=01 ®šŽDÆEjvÀÕw1« o&iØr"H€…ÒŸ^‹]³9'çp‰Ý85¾Ú†DÕ¡® ÚÅvó°ôt{ù`)8›J˜µ¥ÆÛ–Vñ`œ §¬"ŽÁ˜«/ 7“€Ç¡!î+Rw¼ÿüK ±Á (½d6Œ[P<ºÅKç²Õ¯blp;Ò3W†éL¾—KKñXñCz8hëšÚ«© ó{ÊñTå:ôPÝÎsËÇ!7.`5»°zÙPj!`P´·¤?~­,6{¾” áMÏçüà©Sàeè›Þ¤~²xëÉíPæä-a®çCôZ.®Ø¨5ŸÀ»/rFaÖCcöëw ƒh½‹| 7fµ¿Œkí°ËÄáÂô0¹¶úªž'(øæ6y ýÊE+ÿíg#Yžé˜ ׿lK,6ºA5ÅN·Uàìì¼…ÎÌó1bñk`0õ65Ÿ/ŸØ¦Ñ‚n;VG©Mr½OúuØÿ¤?;Xu_c6$/øæwÙ\WPm(¿åý×íšÿMƒçÑqÆgœñUð\á—EM–A¥ÄöÄÉì–é )Ÿüé¨ð¦_¿Bù€ }áz.’f=TÙšA½¾ØV”;IÑ8(’É£gÖ ×J¹ŒÙ' aš>¿ªHw‹nC":ÿY¨ÿSƒAlBPD¡çY¦(!»V„ÖP‚¶‹ØQè–¢Øx䉭–ÉŽö+:ÇÔ!@–ÿ¨s4­STóU]«ÀÃÔ‘;BîïWõŠÙØ€Ènæ-:Rkù¬GÓ`š·Œ/t:zsT†‚þÆÊ*°+rtÖŒhæô”ë.Ñü-lCŸ[.¬Fa4Zß!ô À·/ôÊwq $QÕ ¡7Òa¤¦²ÿ®ºœ½êݺä ?LØî¸˜ÛR ÛÓsÇÓ•Ýž0'îjþ|²;å0Yz2ìü¥{BÔuÕe“–^"Uˆ–M…á:%0'5ãB )’A»&ì¤?)êéå9âáS¬êÁ\iÝ:Ê\$Í>ò‹ØÒëèv' È:;¨šØ#ɯ-VBŠ˜½üÁĆ}Œöu°TƒpÕ3/-Ö?a–zg‰NkðHkšÃ §Š'ÁÜ<˜è¶ÝmÒ©º ›œQ{âXlôT“S‘h=‘-w½*#·Ïh̭ۨ»ê¬>ïXsüÇX›ëHjµ¾Æë^ø8F:ã¯ç…œqÆgœñ/Ÿ5MœP*“C^VWQÑ09ÆeŽ^ S=æVºòþ_¹N10! Û z)Uš½¢ü·îšÞp®ƒ ™ý"æä,¦­µŒ\KRq‘Cw™$q\&oåqñNãV¸?%-_•'ÀÖ²ìÐOŠl=F‰†#&çðÐÎŒ蘞3–Þq%i¬VɉÓ$n:Ã|=h!¤¡ÒCkÝó¸èdE åÙ=0hXÃT‹À5-û(õ“ÑFÍ$Â>•j|4¨/­ç› RQée½ÞæÛ—õú+öÓÐaˆ–÷^ú½š&Ÿm ˜7.ÿ§f/‹Ø Ž<t Z Êø÷h€¶{šöK¨w®F”eµÞ„ÏÄvÊË*ƒ8Žd_r,µ.—÷¾n|é#¨ÀŽú,@ÖÚgRÄv³î¤†OÛØ[X ¡aH£­ngCÑ1ðYeê&ùb×*Cc¡èŒêBM…ö…À T±o"ð—PL.ÛúÐŽ{×4£½[/ jzÔ\ÌóýWïY¹»qæ <8âv-Ø»nìØQƯ–FÀ0Ñ@çK9}¿<1ºÎ_{K’Í£#ô´d'ÜϽŸ4bÙW¸Â¾—+µ ÀróWUêáÏ;hI <¿„ M:¢—“®[qÉ•=K•~&aM_YÒö¥»øq‘-˜ùà‹Ã wØVi×TÔí˜ñh¯T–·2UfÃÈ·=8ˆ×—ÒÝ.hÕ>ô[ÜÈ/7Ú Ã…ûzØDUãË9<À^—õÃï§% Fï‡ÎLhó0•W1,VĆÓ'$mÉ«\ÑJÿÆÅ7êÕ(«kvDj)CX’/µr•+ú/·vÁu`‰ra³'öp^,—á( ÓºÞïu›íæìû1égœqÆgœqÆŸKh2‘²iö‚ÓJP•Î/¢¥ì#!_pñ+Cà‹7êÌÿòhÈ cþ+o™v¸*ˆ• †¬»«:øš,Ò¨Έ j +wYwrõ„ùØàði¥u=©÷äPy/lþƒE)(¼‹òZƒÆk—†_¿ü’P”k2€*k=2ŒZþZ§—%ä† ”À PÆ"öJ‰•ˆ­ô6 2Í5ö‹×ñÝVðF¦@rÔydž•±4 ¶ˆµA5÷T£lr.v6×HÏVBÿE¤ØÃ|@<Òþc‰Åïw¤yv«ÂÛЄA©úÈ•5°_ea\kOk•JüZhˆ`(Ú1ÍÒoÀ|¨Ï6a*EáÙè®ôȽ ˜[7zOâxðíÜéNÏЦ- ׆(+‡kúâ\{ÁäUÌzÕ¢®I'HÈ[Cc$ÛkY°@|yûBؤàZÈ‚ìŸ$)JzB¦¦ ÕZ(3J» Z­@ëÑÁ }áì«@4¸½Iml]€4ßöt‡ÛëÞÌü±ð+ŠFÞSÜBÞdˆ.`ö,¾åÑ>h°ÿSD/ýç_×óe½à“/­5æâ‹0å1»×›º:.ôŸ6Õ°§ „Sêd6úK[s®}Cp¦Cÿ˹oËüÁÍçÏB¿±è/fžºÖm;?>(k…Oã×zOßô >ãŒ3Î8ãŒ3Îø+ÇgE ÃÜÄêr}â c ½´Èà‚%ÀñÓø( ;ʱg) örJ®KŠ/ÅaQä}›À×£Š|/š‡9”Yû(*i¡±]{õò#LÏ$ÆÅ`ïàëDNÈ&½hÂz™ØÀU¹*DUu©6.÷,l©\=ÕĪÏù¥í;¾Aî½äŒìèV=„Ÿ¸õß. …ËZgÈ¥c^âîÉç>ËàS“¤Þ‹‚ŸZž“ÝÒ-0èóÀn¤¾ÕÁ¸.©Úë`á~}Ã^QŸ<£ A•à—„ðtÖ&W@Nl~›n·In¯»åû?BÑqCVë{˜ ç':X)"˧<¾”pçZá5̪ôËoÁÒ½ØÚç  ¡³"¶‰"ÉÒU¼†T”:~1¹â’W#¢ R4Åìy¢¤‹ÐpIÄ0kÐC5 Öèzû¢XŸ9eóØ%”ñO5ˆê fY%2pùËëðÑê4¹™þ ÔŠy?dQ×S7#Áìæ%øÓ“ã¡ÏÛßÔuW€;ªUÒ^ür’°Ô#­ƒ}³HºZllØþ˜·ÿ®%(rpÓÊ~ï¹ßccãuðjÔê¯ßøÞóÐæ¸[gŠ=uߦôO]ˆùW^ñgœqÆgœqÆïŸ7ÝõÊ •î*(Ú]Yò‹æÂR&C–e‘Žt}5± È,¦1îšÉ·Ý%s"÷5>šŒY{•âõÔèQ"0Âü×xèí+Ïç—ÖŠþ~ pã9•Ч¾žm¤š*ER£45æ¶¡†¤7_û;I‹Eex5Oû¼Û›**7¬J¬ªIeé´±PŸæ´ˆ¼pËgÊ|Y#Ÿ~½g¤ûf t¯'ÃÖï nt!ÙÂ_þ—aIú4D^·'öcá'…ª—6XîM86J¾ !­ ž)‚*GŠu<Ç>üc¤ä8s sl®¾°kaqÕCõèR×»O‹?Ù¨ŠÉ~SX¸š'íòôàkÕ_Vb2 _zÚSì2”ê…_e,¬gÞø¸g gã¸;Š­Šƒ™GgÕë£>JÍ7sÛ"<ÁÙÝ%1-4É«PQÖl€è+ ŽD•þì¾jÅ—…®/$Ä ˆ&ÆCžµ¦ímP.iÉð'‚ÞßÊœ/d1(ØÔ–Vf/Š|ªR½¯õÏüX07ÿ5E¿NÑëü ÆDSô²Ø¥©íåë²£ÒóaÈg®PWR8î°ïéúÕïˆu›&J@õs}¡ÁÑF+š'Sà =¨ï?Œ÷Î8ãŒ3Îø›ŒÏac¯ ,WY¿L‰ª››¨¤7­q,`.Í š½(R¯ KƒÇ MÍÒ½ÀATÿL™a̧zÜAÊE6ip*C¾;sB¤f•¢˜‹†/áV_0d¦4êÛä\4.N87Ö¦©Xaž‡±¸E§eQ›[fŠGa4¹È?«ü‚6}–Pa!´, YpLê]BK!+ ¡dÕý×õ£ è„õÎ=¹sg_,ñ4ð. þê¨ÞðN¡Éwãù³²·ý«êš«Ôí«X:[0`ýi]@M߃"é  ¬ÔÛ¶EfÚdž»0,7%ÎøŠTºíY;6T\*"§˜¢¿=i§®ö%Þº@ü{f±†&¹Òò†=òn˜ŠheæZª?Ë‚=*Èë»=F-JÇRÆIðÜ/‡$·Õ`‚Ê(LŸ." Z?¨Këß‘*ÒÚÏÇúNý6TkYbÂ!N E\ʇ%R‚"ŽøH*‚ÀäÓûUïôÔí|ÝŸ©<5ÂêUÛò›(~ús™qžK)«‡s'n(Œ½ûÞD ÛS.çy*™ *«Ë’úßÅË‹úcOŠïþÛFâ,á–—HÚ Gç6Pâ=N~~6<8?BD ä+¡ §e™y BøÙ=Í,ü¸nýó÷Œÿáq¦ÁgœqÆ«ñ™Á¾Žøú攽,?Öd8²¡6Y@(:O௬Âf¶‚_pI×Ë‹í0èçV0nv¯%Dîô±/qS»øÇ”, 2·ìÈ‚„HJHÙg„„çU~”!Q_BÎõ=B’cHæÄþ.fô˜}övb#ËÌ¿gе²ì À dJ}UT¿sÝ /8a]z„ø“ÖÉœ{Ö*6rH¬„VáÖÛuK¬ƒf,RG¯TkEº«vèäÑäŒ*K2ôÖ0¬­®)ô¸)Ä‹-ŠðhÅ fn¬L³Y:¢tFzx\Mrjîv—U©%ô <êÛœâ ÉfõÔö|;MÂ:Ü@¢©ZßXÊTÔ»÷NÇËÎuõY1œ(¡µE»ùIbÜ–<ü^. ÿ–[Y—¬}}cœÃì[Öïa1ÚÁ-$x––®`1'PËÏÅÆ\f±ZÆèÝZ{źk M:àpŸî z/®…é{,u{DOî– gúâï”ìeÏ¥9ŠM«÷ºT__ñˉMW9À%¾J¬¢Ñ„:̾PÞ¥Nõ(Ö9diÛÛõ?©é^ÓP× R`W.C¬]ç‘‹µµÙˆ%¥‚\ ¿ £¬gôR›h úŒ*ß({§ÈÎí/‘òùßv„ý?7x^ügœqÆ¿s|NcèÍ C¼£fPTq¯8òW‡þìõN Ád!ƪžM 4.d1àm3Ðm9%¹—í-Фá5«£ÊË. úZ—”Ð 2óšDŸ0ˆšËa¥ìœ£LR|öP£ ‡P¦g<þÙê N³èi<'ÁµæÆ1ÜËÂü‰mZV(tHÚ†1ÝŽ–zÔDòÞé[D±Ì?4*‚'£PÆ lÎ(’’sdü«G‡²d8–€_ ¨¢p‰ #¢®Q€'ù«êÂŽKé ÂUí–ÅDú–SÅZS ôÁ`µÿtJ(pU{è3˜ÇÚÀ®ÅîQÿÌœƒz¯^V^¨€~x#¼Y)ß3˜¿×bCð>ƒÞÌ:aÃTc®f°©;Áó²kÙ Béÿl}M[ïèØ: Tθ;Û­`iÜý¼¬“d†ü[µ)9ºsÐ c©ïB É!y8D¸»\î5–Ž+)FᜉÖh¸s‰gü—ÇßqÿO)g†ŸqÆgüKǧØíU74wTE"vˆ1`brÈŒãöÁ…´KÛ,k€7zuý‚O¤S ˜Í2ŠÞ@e²ÿñB‰w¶«|I1&F?õ·@T:‡ ¯çÔ¡VÒ‚BŠzi+!z [L"jֱȢŸà þO?Ê¿¸é[V{"\êÏVÚï…ã‰]Ñ”ã¥ïAaƒ-/ '·‰éÏ­´4 DómBß;›Ô¯@¤Óƒè8mÙõ¹³XòV¥þò^jÙ׃z6Ÿ·(ðÌ3š?Ï><ù‘[ßúÀlú½çˆ¯R@بÚ4»5Šý°(Т„.5"TÖ®w-I=yž$å7«V)þ6ÔïÛ¦_Ú‹Ñ‘2» î&«ãr ûBq¨Aÿñqú–<ØÙø%p¸•e~5Þ½¸P„³ÆÇdÌÅjÒu ˆ:¦GÍ®{nÜZ»î·_/ù`0Ÿ Çœ VvÖS€³+¯Ý„ÊîþÚmëÃf¡TäVׇ„øÀ-:ô&wk¤õ…X|e°ÒI1³œ'üÆ®ˆ©Ó{%|–[ ÿØ8kš­UÓŒêßÅ’yz; SëJÉš×ݶÖ>%Täšò£Fçþ“|‚ØrãøûûÀšA=ã6Ž\ÑgœqÆÿÀøl³t¶@X£³Ô  ”KLëF¦Ðæü_I Ìh¯_Ue¸'ï¼ò#]^ÏíI*(àÂì‹ gÙskIœÚ?¥Ðb N›Š|šÕÛq*&1SvÙlJÑ¥>xÔ@°Ú´W~2®” ƨk¸†M ïì¬-– êÆÄ .ìæKBÏçLv<`þÆ%媋ÍeM­÷l¡) Ýækƒ¢+nÝ#Fx-A©ÀÖ[¿ëD©öÔ¢àÁÉòÚÔ`e‰Ù›ª?Ø ß*ÏTØÁ5O”îs5†¹`¬ßîËÑ6¹khc•€Ã΋W¿2ZÎî¬Ï¤)®äª6ž¦îZl=k몮[/Z6ˆ¤5Ûn‡F´ë V§Ÿ®d Óm­}èwޏšñótE$õûØQl“GÖ(W'bëèëÛb¿-㱜3½îòKsWÁ(„€¡SMýSŠ÷(ó± ñªP­Í ÿÅãÝ]5˯ Â6§Jßê*Æ9£›‹`UpÒÛö´N-c@µïmÎ¥Pý1ÃF—Kò(»YTº'ÇÐ êµ8P°§sØÿm òïïqØ€þ¨ H\|¡<90T˜û™¦Y´Çö˜gÆ£P08ÌÉÝ_h3pÆ?é`8ãŒ3Î8ãß>>íULü¬ÃÆ e$!aI]:š{m¯’ì>R2¡è6p>“¿dô³ /î,èKVèý-‘°“ƒCF´ø 74Ù7ƒTÌBÛ¦¬!7† «†GŠ6 ±>·4+àÌר4Z´…d™Ò€TZ‰Ææ<¤40byÚxÀ‚s5¯\:ùûÕò `dá³V9ÕN"×ý#:²²RžÙì>aQ Þ›;)üÆ¢¢<” ûWsSº¤V¡€«ÃëR7%óá”9s5 îN,ïøMfú«®E‰[ìÉÿz¹~Ž“Ù8¶G7è0PT”(¶ÐKrÎ`/o²ÜÜŠ^ÑWÎð|áã™añÔ_µîö+r6ñTCR2Y²øMfP1…÷[¸z§“nÙ"ÒL IDAT>ïl’àxÞ1Úó¢—ñ«paÜ_L †îÆúŠÃÿݱçU1†ôþ .yÊcóË«¯‡© }‘ }”ëIÞë¼½ .Ã\Ù9$þh¶M²°§/³׈YQäz]¡W›ªoP¸÷¥hALçŒX›¿¬¹¾lœ,^ŠÕ“>Û¡"‡!0-<µ¬BuM—Õ³<)'å*ÈM%·mnÑ…ýÀU¬X"%J•Þ?¦M&Œµv'nîOw„ÓîÕªµw¦=SBú·ç=ÞVÎ#;ãŒ3Îø_Ÿ›Q,»„¿:Á¾±õ>oÎü×}¼×^Ž$…ž”M:öVÂôímà ¼µ€¢-§Q¡™å9ì×ã–ÑÞåQ,¿†Mz\•ÇïîæÔqL‘¤íýÌÆ€¶Jí¾¨±§6IãÐ:Kaj?xº B‘·Õz'$„ÍLàžÞ=¿ó”zlã!déH‚ƒ^¦MQ"Fª[Ñ‹i]g±±“•®aû»æ¡XæU’2e¬'ôÝ@üXT ÜC–/qŸã_n(ƒ13diUßÒ¼å´VÿưëBô 3Cid%ääAyel˜æV¾Åo#I–'mu‡· ©èÐ>Â| ëŸ6Lð ·Y%D¾t€ä nД|©Q… bµÕíÅ‘dÞnÉ¢:CMaI\ëŒ]2ì¿ËÓx¼ù Ôü©9òú9B˘3({«ý*ù 2¦ÕY@öËaÀýcŒw ©]•9®\^±‚íúÄï¢p5Ñ:!¯  ÄÇ=½7 J%æhžÍu,°(¬ð0Ø œYAËBA®Iö:jp¥ñˆþ'>D2­m÷Š4 ʺz† Í^*iМeìÎŽÁÝ¡™Klö¾ÔI@(éÿú™¥᱓\Ús2Ó?l·,¤x¬…›ñlsdü‚L,Úy6vnwú ß Ëÿ7àÔ£óÏ{aÿcSôŒ3Î8ã 9>%Ê9Àu]Äv ¹$…»IU(A¶¬¿8S„½h/iÌ=×5w¿ktÉ…]UàÐ%1õ ŒIÂÐÉÞºnJ6o_RUÉu÷ïD²ï%ãX…ÜÔD ¹.-O¤Y ”g\ƒOÇ‚2 ½ È?…Ô²¯È#b~> #&Ãì…€Ìïãï ¢wó¥éÅ,?X)ú„-IH (öCÒ²fƒJ¸ég¥¯Åàúì,@lËsØw~ÓA*“…558ã¹~•½w x%åå$÷LË¥>øì:™URe×P;‰dï6Ú/YCI¢3E#4À¢=ó:mˆªGÿ³ëî c¬f=®I?T޿܃™h㱑ýìÉÌ…KíIòÍÝß%îý ãÂLÓITòÔÛíÁ—íöHùû”T8&2Û_köu­G)Hh:–¸ ;Z¨ Æ §>¤î‚\Àyo­XƒiDÖv#éμnN#ohÖ äøÿÙ»²íHvG¸ýÿ<‰y°3‚ H)\uwéÌéé.Û™Z($mùâé™MÀµ‰[rÐÎ b¿È™Å„¢hKXŸÛCÓ^yýþ«ÌHw‡†âŒwjá#âÜ8;ÊìX¡cÒkñ<«š'aÎÞiFD ·¶k¸µFûÒʪ?÷$ÑuÐŽô8PÞ”1dƒêáÀöù9_Öa> Í›a5!d Î8ãŸ4èÆgœq†™y €D%¦ ‹ÞÅM·c]0ÁŽ&…®®ê» ïFiFDÒóÔǨUÐ8ï¿>ðî©ï:Ö¥ßÃ[¶öS§È•Uˆ,þÉñ~ýÀ¡¼Òg³†&Øc(–„JªÀGÝãGê`Ó£.Â’ÞmOe¿êäÂå¡9—ø“•¿C⨠7³‡ æ§çÎ"t<&@|îtñëY:˜ýž*˜½§KÎïõóyß•SŒé/$sÑï&>KòŠ3PàSX.kE&ˆ“Ž).‹“‘ÏPÅÀK+ÄùG>³N)‹6 WoÔXF¡»˜Þ3,ëèàÒ‡ ”s&ö݈Åò"¾áÍ4RšZ8ªXobU¾:b‘ÉŒ’*Ö¨VbÞ'hÐÁùÙ9ʺÆ¥ª¾{7ß9€µjÁtb½<¬GáM©‹wE÷‰·êb1bô@îí‘ôZp£Ÿ§«¬ŒÍn>OüŸ¸œº~ØL`Oè•ár¿Z ^‘H(!]I¡`c&Õ ^;Š2k•<Ûz#³€’µ×l6Œí¡)…æÛY®´VÍŒBçè‹`Ò=â}xÕM’Ä{©<Ûä(TÂ=ÊÊ épªõe3Õ]uEõB‡-Ðé@=FÕVÒÇ;>ÿÜï"½Ý™Õ0Ù4ô~õÓp«§Äö+˜”mØ~ YÔ}7¾XºFÃþ“õðÿµ—þÙ19ãŒ3Î8ãŒ¿Õø´ò¡Ô¼wÍ ÞB°-¢‹æC’Ç…£/@Jp𫘮÷9À:Œ’žû’è”/0%š·ã3÷þ£kÁ“ÍÌóiPazØk¨k梶ƫŠ@ª4D`+MÈÕ£OÝM¬êpÓ+%rvI„=çf¾¦N ¹PF´½Ï]H–µ°Òâà«Ô÷ÀEÌØNñ@øP^Ù?Š·œ™Nrªãµë:Ÿ±SƒøŠ¢G^®zùPøŒ§3ç©ÙåÜ P¯bº+¾¸d¢‡ Ôúø’äÊsÅÛÜ&w`÷Ž+–Àå+ŒHÆžmÚ¼=\R‰;‘4­2¤»øˆÛ*^aÕLÓ+wà6vÂn.ó‰$©,Þ’v@ ¡Ñ.ý+=³ÎÐâi™›c$#ÄÎKÖSÀØLÜ¡rˆZhjê¤@}:6_’ÚŒ¤zgÎ $½cv!ò\îoϤòÊtÕ!ÅGäÛ©ß%_­#‰UaÏt‚ð‰í¥â;²Ƀ¢e*ªÊÕÏJщ’@yaÐ ,pj£:k¶Q*NÙ'ÈN)FÃØ¢ÔYè½èô`¨ÎÁ†½šº1ŠÛ–ï²Æ€bó’}8º ¦2WµêOµ¶¬}>”‡D·Í¤‹ƒmè4êÍ ‹ýòÕÜ0ì‡\(PoùƒÏÙ¿Šÿþã¿…èÿŒ3Î8ãŒÁøœ®·žÝŘk¬PØ+rì1RdÜ,·Ž×7÷õW(J­ñ{>RKµÃF¯rKJòF¦dŠŒMo4X‰÷yBK¢^å]lÈú¢gS-¾ø]“[i|›štF”§x P5±H(4‰*öµcQÊ£è-FSIü…ʶ ˆ¨Â!D\ã™wˆGûHàðâÃiª¸ Ç‹ò+¸B70îkc·Â ¿jc5áA¹$þ•Wœ¦Ä-H^‹Ï…B7üÉZö|P¯l¥ð¢ï¸âMý®LMÍ0ó§\br—\E®¥j5£ÍÐÒQß$®”htg€ øc"ö>V“%µÍ;[‡‘²;–‡b™vŒpÀîÃEjÿI—aÎ`9+Άt¤Ý³U–•kÎÄ¡›?d³ÏÒ§róìùµœ}Ö«<ܹãAÔz÷–‘"ùãýiîÛ˜¿4Bq¨ëc ¢k΀½4ˆ:Ù§;Q X*’{x:Kà#7ì3& hO ™¾åsMŠÄÔ«™VŸá¾'ñ˜ƒ)“ïÛ¼ÐìV¨ú׉ í—#át@ÚÛ„ÊãZäMÖ^‚ Ø…šœ‡%-k,,(º9sIîq vx)!ÐYZŠ! îD¦URó,µ[“b6Æt‘,±üh÷“[„úÃ$zoE7¹”¬u'àšuSí>üUW'©gp}¿,¤¿dÌ%xõºi™7)45¨7ɱTF£¤½Ti$YS×½ÑÐü3*/%„R!Ò—Ô± $Tì®ôþG0P‹t1bTv£e¢x6¾!¸y‡ ‹ìçm‹´sfö·ãTÇÆÔý²|ÎpÌ^èµ—©û‡f¯u‡ñ·Àî[dhÛ…?æ‘~ûø`÷©?ãŒ3Î8ãŒèøÄPAhÁl‘ŠA…Ãl<›ð¸Ë‘ùÈ•Y’îÅoE_”&4áú ,”VÿŠ£´D!EÉ$JÍ]m nÁÐÀ ƒoü´S±Ž|%`žJb Pпyt¸’0‡ ½ueS´6"BTí°6Æ P›™ †Þ¯ßëtèøÌ+ÿA?2[}Îú?:-_½’ @›t‰_ÐqÚ9ŸVŸLšŠÞ¥:(ö ô—¾«¯#·lEsTR .Ò]*%œ‹úi&™»l hÜÌìÌ ÔrëÜ™X¿¢4+z«ò+p|{Š…´^Ñz©›þˆ-D×’/a¸¯8ÜD?EP0>CJü¾Öz,/Ÿ3Æ{D êX§pP l™)Î|)ºœôì@T&Ñš´›rl Û½á<¢zA›ÐZ0/Õ\BC]Φ åÙleVÒ%Ï.«dî0\=®¬Ø EäÓŒÛéZÌ@ä‡ôiί”KzÄ¢–¯Xm§ ëµ¬õž ÏAu–óL‚SñÖ¸’§Ÿ‹»+·f–«á«y‹’;‹ÂäÞUbvžƒ”³ÈíN ·o%Å"E•Eà¾û^ñÄ)ë œtÓR€ ýõ%üª™Á„ÛBzÈÔÝ$ÏÛGø|<6…Ĭ¢q9毣nà¶ wÿÖ&ýËÆÙ“gœqÆgtãó™Ãä"º\Æ;²½þö.û¯.{Š….r[8ïùo1bQßáÙ+òøW—T`gþ9ë#ÑÐ`ýµ ›g4»yØ8Ó ìcr(lbÍ íx–©û}ÄØ6±Âä´IHTq8©ò´žíÚ7ksöb(@¼×F±9J[±E¨Ùmb–³GØ:µëçaxˆE7ô¾¯×Ãç¸w“‰çÒÉ0R²%^¼º,ÄC+‡(þm´–æ1AG»J—l•E<° Ä"ÙRD(.N}HïØ ™Ë"æí‰A]Dp°T#RýJ-D q¨–noZؘþY€¥,[¶’(,»j0XÃÐ ¢|ì½;ÍÝI†Ñ¾ Ý;H [ÉÓá•»O†æ:a ï†í6×½»kû¤r­‹g=ÍIL×+Ëzù£—”BÍÊ£˜./(b(¹W VˆRÃa±ndcG3ã68‘ å~å›O_¢¨Þ9I²«¸ÐíîÂô®‚úš‡—k¼`Ùvå6¢·Æ$õüþØø·×9El‡Ê>-›ëêfan‚…&NV¹„EÖTÀÜhœxIá Qéf¼è74€Wy†LWè}g4…¢56[dØëdrŽ&Äçý@ÿmñ»˜>}Ïdí™GcÑw©ÐäCô÷é7öA¹)RA+|m3FûÏÓ™bm8À¤Ñ"©öðf6¡Kö¹Ç›ñC}f:T6@w@>‚ɼ苚Êÿcƒ[Åör6k"0óP—Œl"\j-!›ÈQÍ?VMhö*Ù<ÉʶµÇ…û°ÉÆóª•b£µ ÍfÔ/0/ÕÊkæF:“®ŽÛÃ)kK4ã"¥ Ç[Õ”8<——'¢»N!«õ–dƒ¬X÷¨b‡N¦ªsŒ +C:|Ûx=aŒßD’E4^æö|9p·Øät5HÕ_TŠ' X¿6•åæpe¸Ê ć»RùÞLf:¯ÌþòÍ\‚sw^ñB/ VšÛlg]™¼²ÏP;gN¾Êv‡«áÍ/›‰†ÂŸ—©Û‰‚ºJžV³Ü°¹ÖS)[ˆO,änÉȆuåÀª'{BY) 0:=vìÏ8ãŒ3Î8ãŒ3þÈñé]Α½Ó´ÚG§œyɈÑ^/ÃG¬+d$›F&?ý.ù|}Q >vz³ö2иˆ~|¬] =õŠvÁ‚MCù¬OyÿQÑð¤iîTS1•‡ØQ«Îñ5t„ f l¸ Q÷ú½‰)n%´ßãC2Vð¢ái‚7èØxgÛï£6›ÎýZI»ëËÞŽ:xñÞ°^Q=*â_Í÷ò„\Sç·ô“ÿ` ˜”¹Œ1ÉaáÏ¡ÈÞs@à ã0k ¸‘¬7å•EÔYˆ<Ûtd•샃É–^¿›P]D_˜Ø½°ª©Ò±Õ²Ud‡{€HoEe3Ù¤ÎÕC!Ç I/ÄÂÆ³6_›./kh…踡±Ò {8¶Ö‰cyW´ÖEz¤O€±˜¦EÙíKžnÀ§øOÖMA¡ö Ûcl ʨê_O9W®ßÈ·ù`Àø'S )Ùíì²&_²,D„˜o¬¬mòC³3/#À’†¤îÁØÑÊÆ7qÒñØó²Ïi£`FÚW,“™ì§TðVâÅïö/X› Ü›C‰o×zwqcuŽWbžò‹pÔW/²BÓÌëŸòGb¶ÆÉ¹9÷WM矸AÖÿ.tÀœ¡µ'îå¸à­Æ`öŠS÷ –ä÷E?¶á›1…Wÿ…qjÿÏ8ãŒ3ÎøçÏ‹:Þsøú 7>•šèsk3¿ƒ¯ Áÿ½‚/Æêä"•íõÎ4ÀG•¸™UIãëûëû€áctú$ ÔuÍ£„8 =:H«šœÁì£÷)ºÈ3_ðµj¸«ŒCc>DE9´aÐPF­jMX5B¿®¹˜=ôÙr<\ ?É5Wi`€E–OaFyÎZê¾ÉFr‘½ìWQ%D€+á„F];š™ ±Òþ²úûßÙVÌV2¡Hä”ÖÆhíÍl3…ÜTÐòA" ß¶Ív ’¡}Ó2ô­K:7–1î¬ÎP’ÜíüL ¥_¤¨fþ3™”@†¢p™Ç¨,2ð/_Ë7÷À&¶å“¸M·)FµôË *pè§Bg~jîÚ+ocSá3ʾÚ22¸K€v`׸0 úØÈÍÕñkáÉ:ïlŒ ×-ÌSáé ˆ-fg®;³ÚëZìWÊ_Í2›ÕªOË:w6é±Ó;ïHMƒ(†‹û7ðËÓyœàlr}zx TP$5λÚ+©VƒK­o¤ˆ½´?墩4z-³|ç‡ØÄ¸8VE\•´Þñ@`Bbd+Óïüs–9‘ôei"°#0µg4*A%º*Lɖ뢊yjîj{n(™>qpò§öí4{Ÿöß]Ô¦|猿ÏqÆgœq†Ÿ™R¶2žÇ ú\,àfÁ+†Î×Áù•Œ!Áëý v‹kÁnÙÂ^Æ×÷WËŠÎeå} 5½ß†Ø²`Üd¿tŽò{EÍ5zRšô)ê÷Ⱦ÷6eehl ºª{ûñÕjˆh‡œ½;Ð× ?>–=æˆ<6…lWç;¢Ø2 ­¼±g.*2­û]VÑ&¾TÃî'-àô…¹X5i7ÔsÑŸàísŒè°š®&*wñ’Yû\U‘Û"YÔ…œ tã”úBL¹uѯï@b ÊÛ%þ&£‡^ÿö2†?moïøsÁŠD³ýïQ³±tÞo Ç" öl}ù.Ú‚³e÷ñj“I3¶a^5' G7¬ý”3÷ ¸KË?ÜË~íLv5­¼÷ Õ«•þ´LÈ^g€|‚òlRW=·f¿3ôoØrÈ–‚_öoQž@_)ÅN„÷5ÒÄýù‹-ÛOþg”vÒ²XTÉ-_e¯¹Y¼]¢ó0=¯Q¢4éjðÁâU¹±—Y¾r¬% ã†|ÝÚ2ð× ŒÕ§« øðÉ¢ÐDØ.›NS)ŸÁðt~î öO2DæÒ–Ï—ªt€JCžêÎË}·Kž S±¨”—ZVøMö-YòmÞH<‘‡È»nÅq÷càž?Šþyy‚Ÿ5ãþYSjv˜úÏ8ãŒ3Î8cŸyN“h^u˜`7|aFW\ôUXñz}³ë|C-(´0Å»p|â[ÖvÇ] ‘}¹ÑßñÒ‡òÑVÑz°Æf娑çb*Xá:èò` ‹+?)Ž*l«úå^ª.¨2ZCC¶ pRèp±õÁ~@mß<™¿1:ÔJ%笃w9 ‘´ÊLç„æuo¥ä¶Eê,~)£¤3¹è£ß"Eµ½[M¿Ç-çbvF‚Zß¶Ò:׺õJXÏXÂTF›YÄ©‰Ÿj¦æ]˜ì‰À\¢rû â£E÷2$€Â`E6•g’ß§Œc_Hͯˆ>ž•jˆÏÁÔÍó_ÊbÂûW8|+®ÑYP¦F%J8Â¥ÄxV æ±~µ>ð²;Ã?Øs@egrÐÒûp±í³ Ñì…¢ëcµsb&\BÏ ¿´Ž %’Œ*ÛÕÈÿ³×9Ø•æ„(:I›™¼¥ßH»©òÏU!%›Z=!È ŸçÛë5cTÇÉ ‘Ai«ªSÊÛ„2O÷€p Ì>Ì^c’f¨ÁÇæ5=°Ê¤¦IeU€"Â\p]Ö$ Õ=¹LbyõæQJ-©òSUôy5%bëj'‡ÔÞs®0œq® 3ûÔ,mº4Üß–å1ÒÝül㸲~á­t¬?óÁ=ˆ¼i ýŒ3égœqÆgœÑÏ ¿£(ä¹ÜÞotŽÿúê·…½è:ðÎð¦ÝOÀÞõþŒUZÍs¿8« …|€3TÙH?u£¯Œ ÁÛ^m X)ýŸÓ¢hó*â»=ïMm¶ŠïB˜ T G­C+Kñ¬tÍé°€9ŒaÙù’~‹„‘Àï~— Ûu²[ä•^Ä6h7ØVPÄ–`ÄšZjÆs]IKˆ ¾º?Èþ7ïÛE†¡Ó7¼*ôj¶,§R—Š9›±ëŒ0™m6ÞõŒȉ0dÑ•²(åBár¦Y—¦‘«ET÷5I!m±ŸL‘÷I"•!-õl™¢t§º8Ú›áé¾mØî;–Œl—Êsú±‰ ÌÚ áÍþßmËÊ# ï¬6)ù»^{3*r®LJO·C:€’=&pÒÂ,×Nàž )3¬Ð­j¿½zmÊ%§ÚíŽÝÉ'z6\CÈÖ8!’lú‰ò‹û"•=êjÆ«ŠÙ̪- '»¼•ü ¢ì¨*U‚¼F&w㸇|4Ä7" t¡ô~…* ´Ôï…mûçÏKºCɼ g¥ßŽKóž=«ÁÁÁ.ÏO}2…ò@¦¢"4–Núá3‡¡ã'ôÀÙgÝ|Œí[.·P ©"â‚Ìê™×Ì'¿ü£1˜Xîñáa¥Ë;‹r¤•Ï8ãŒ3Î8£ŽOO**€þ;) ßù£½>n¬ÿƒöB¨–½ðºú Èx1¨8v¬–dÖbJ(Ê ¹á/¦L…*°Q`ö"Ž—:u›^Éç%ƒÎ/¢±U‰Ä¶s_Am6qX[ÒˆòZ-ÄÆEt¨pÝ2Ý ìy»/EyfôÁ ° *˜Áš%·àˆ{Ø÷|<%5 †^vÏxà[2‹ãr÷†ôDÀcô+g3 IDAT¶B•ZÄåPÁÇ1ØÉç#“é_q.—ó«ºCÊ0 <ó%Î *Ùwæ¦ÔP0™Eî²/@@—aÒ%ð‚÷a‰—©OÐÀ¶ŒÁxv…ÀéZŽúo×ÌòØN< …%æ“ÊÕm, ¯ö9ÎàýÁÝ=JU§m€2Õ²J·Ó®æ3vu"9Ìebó*›$b™ˆ}··L!§‹c9™ý LW¯–—D!z!eö0oœ3LË)Þ¤‰ê[²m—›Ø¶èâ€3 /]'”¶M]/~±ŠËý@µ\Wo®ý&È27°>±dAN½>h(Ýðrxn6õ‘ïÄÁ¾X€º/òZ>‹ŠŠ¥’-³mïV­–1 !Û¥º{¢„~7nŽ›ä7ìüV[þZÔv†=?ïgœqÆgœqÆ/ŽOPDW®Þ?Eh\ÅõÜy(Òÿ/ŸQ˜‘ß_ÿø!»*Z¡›6êsZÈ|=À«AŸ¹é’ 㘿ÈÑ, xrÀiK'¸‰·ðšïi\øV`n¬„û l%CðËü5ߎmè Äö…ŽÛ„S\¡5$¹pR8Ì~Ÿ4 ª ª%þ5=L ¡ôE#¢ r€Œq ñ•–ÝS™9gJ‡Âª˜Î+õìsòÉó2›(ƒøîë3[bZÀâtø/ÿ€ìÿ P€bÙ‹š^€8CsL0Œ£ØP4vÅWÔFâœofiHR¿Éb«–>]ù9g8lÏ. ú’b9¹;ŠoŒóe23Ê}èª*Hä(Ýã¶~x_×Ϻ¥ë/_”MTEÊP¨ŸòÊ c~÷8›Y±7Um#G5iϳ‘FCŽ'—ç©J¹7ö—ºIJ#ÔÅižÊÒçVEví jáÝΔ&Â…i~ñ Né¢üõ¼'HòÃá3ß T•”bNŸ$›&› ±‚Jç, šû=8¼{¤>¾\JGyױꭱ½½Fw'¦ÛÈÜ/(&Tç‘Â;ÊßÇÖb°»’“ÆØ×_ÇÞ¯úÚÙ8§¥`»í´„29œgDóEâ¾™ÿ{&N2Daû÷&?¬ú?ÞOÀ3QgœqÆgœ¡Æ§Q´ ú†_Àðáðšë7_f¼‰.ªŸÛ¥ŽÐ >¾™=¾}¾û` ‚Rñ —iÓ¨#¥`ÄŠµw%=³›}£úÇUׯÖIêvi4ÛbR%lP\¶ŽÛ¸Qì#ùmrŸ{lÆÏA šÀ Ó+wâ¢|ÂOj¹¤» •ëGp`5™—&* s{»¢fëµ›‰ZSLx\r(äÜhiÛÇð'‚=¹–$?©Re(–Ü»¥Ôm ,µ¬_×%̸sàà'Þþ\òEûpxͤsË›XŸM„Œ.?F¢`ñS¾öv'×kuޤa¬AOCÏôÔ*N(ÛÃ&.FBBxb—ZSñ¾äÅ¢ù²ü›Kï±0,$ªßÂå :mdv`⊺zøšu%ãeÚejeÖýÏðœúÄÃFŒÞ~ªÜС‰h®Åo\¸Jº”8]µ3ÈBÂwkÔvÒµ{Ê4`+ ®‹Âø#V´xgX´j¸^7–6ºSpYæW5 ¸3àH瘭ßâ8pÑà2¸¤^Ü·[ê$æð»F*j~èµ…R£†“vh+Ç×ÙDgõ˜C¡ÛÛgηé fùúsÞBžŽÆ«‡¤¼« ø Þ÷ t½ª5C³SÿÄòùkÖÖõ€{ŸvAý)£s]ÎxlgÇåòš'ÉqÆgœqÆ×øLUŠ>jýw‘Ñÿ¯j –@ëŠ4jÌØÆ÷U„ï0¸¨ïf B+š ÅjQ"¬vjw4å´ šlÄ6•d£Š˜1#¹(B´pÆ‚X¼ü[9†ÇÐSpq€²?Ô´4&›P"QHÉÊkb’©´Xà`Ž¥n®ÞŒ¥sîÏxä^=w"izirH&^âyäÃG‚£®…OHNl0‰ntâxB­1È÷"§E .¢­»XË+Ôž1Ö§[püu¨„b÷HZÖúˆÇÚíñáƒRB!• š"¸’’V^`“ ƒ’ßðc¶• H7lrTöáß¿»¥&}FÖl°Ä‰ñLŒ× ¶ßÐVwïtï‰þÞÌ”,2ßæ$(¬áîÛ¿‰V£¾%OkŠÄ¹C±ÒP›U  =:­¶z©mŒœ~FÕ Úco“*~ •N³û6G”cµŸ‘îbrkϵœ6üŽA}™D'UjÇ‘A•Zjk÷½eîâw.Ó’5l×Ô‚¦Cˆú­ïžQ†¼K*öB.šLËIî²…vžY³¹ÖÛ®[¦ááÉè–lD1õDü ©—âWÛr+;,­_¼¡‡öÊ_H¶z Ú¿dà¬ÐgœqÆÿ¥ñÉAq‡gAR6(³Ñú¨ÆWsóVšíÅ»à7 “0LJÏ™eôÿê Ï¥=M9F*'a$Úè"xŒÕ¡F¨ͽùC<ÚDÈË A¸ Bè+Þè’”Š-8`‘&®B‡PY„û›Ù2¸9JJ‰ ׳H;@Ë`Cj"Á¶«†>X£^pdïq¡w¼# À¨8ÿxˆrþ„»|¡ ‰ ÇÇt<» eSÜ'g “;}í0Ì‚kÜ ø•s×=gª…Ÿ¹X5ín*º(סp.ñíh¸°u“û¼ËìîãÉFô¯’Y' Ò|M߬î¸Ca¾×ªbyîðð´òÒ, ²£ˆjãéP²É_„æLéÙYÂÿÜš8Z v†QßózÕØ¯&ÓÚî–M‡Äñ¸'¨Ï²<´hVPS=^«Ç'¹"X{n^s­D'³kqm¾ ÃDî ²´÷Ée¬¸÷;•oÙ»ÚuDkÙ¬6›BÌCÊ7§Üg*fO§ûrZ&"yƒ$&wºk‚‹«œÔM™ßŽúÍuÖYìó* Fšñ·Ù–èð_ØÔ«‡Ø=Võ}GÅÊ 9Qþ‰L6Dêã@økPmuˆÄìarì00åÛèrJºóB«32½‘“.ïÖôÞ´E\ÉM¸(ÿŽN¦ úÊiÓÛŠ*aŠcá¢Îÿö¦÷âÑP òÅ †D×uÄüó~›õêp Šž¢ÅóabwÊ+* ~´-†ú\©÷ÔÏÊj®#<°¸÷^sFí8L—2Ú¦4H…^±&yË)EäyolL6¯Éš’³mc•}‰ºBÿe9Æ»»>Ä>gœqÆgœqÆ£ñÙ¢f—“G{ñM>Ê;hññy†é‹“ò‡ÃgHá=€¢hQÙ»•ž|±w JصøPãjk€)ÅT=ù -sdÿ.w}t”äé/kÊì³ý) kèÞÖJ –‰ƒwƒO'M¬ÉŽl…»}’¿š …ìÞ· XTÑ£X°ÓÀI8 I£5\²ͯèyî Å Uäu)wØ—Ïкž±0ž¥îòùJ…$Î'ØF‚î‰tf•ã´âþÃù­ÆbFûh’…,yÁdcoYü0^Eáùêñ²dÌ«e"¿)ØÑú/ÝWì¢T]¿)7dŸM£lÀr—­Ž#„%a©þöì tþÕº¿Ä»¢‰ý$a‡ã ƶ ;`IE+;9Ôøß™˜™cOïÃUXêåóó²±<¯?›7cƒ§ŒcwLÂìé´¨¶ýRKùš§—;àÉ$¢–¸ ¾Öé‘8¨.?6ÔuÖJ,•øô$¡Q+­ãüny½—ÒK5üPà¶qÃì È?”Ô;9ÐÜ\‚âwØ”./c]ÞÉÔ;ÈrAoÛþÌ‹……¨ ;)…¾yÞŸs­”_Ø“Lï(ÚÛdž¸V|e7X¸€"Ó 0õÍøSŸHä¢´9!íOé&©·³\ñ‹Õ=©¡0U@7Õ3÷?¾¦»Þ…ÆXéÝÝË‘F‘šp7 Wp³ kwÝèT£ªe‹þ:OXÚŸ¨……'½‘2«µ=%s=¥ŒrôŸÅrÄÂB/SjhóFúªE™®“Ž?†n½”·Íy%öúíýÁº‘.•g­`xYd £O ®ÛøúþEÎsõÏÜ?ãŒ3Î8ãŒ3†ñ™±sU´WS£' Æ@Tؕɲ¬+šWŸsŽi »ðñ*¨c‚á¨hv±W«-§¡ŠÈ“ëQÁ®«ôˆ!‰,<öZ L©˜*]þNó¯œÞÊi”°EϦà”jVŠÒ?¨ Yˆ&PxO@+Y ÔT“ƒYF%hÚ†ýˆ“-€¹2@¯!œàî .~±b3K(t¨$ï;“`s²ÜßÜŒâû0â~³¨–JªÔSvÄÖèópoãeö²oôh2©ÌüûlŠ1(¯ì X#êÁÝÿ5’§”©X†ÆS¢,p«ñ‰6Å–—Ó­/Q&a»ºƒ•‘§ÛuÚ…¦“¸ s.âÑùm“+.ï*zß´)$·ýÌÑÆ±Ü¶J¦NÂ#}®^Aä9]ÄùÊe±¿Å§ø ½”;‘Yûæ©fȼV—‰¥Ê„&*Ñb9˜©†Áü£ÑðÀàŒ|ákrBÝR¢+¿(Ÿbwf?<_ÿ²Ê›7SP5 ’í \\y(Œ–³:”<û‘Ä,H^¥V›÷Âøƒ†"Ï2vû¥f# Óhôt9Û#Îxr)´Á•Þ’´º(F "÷ÞRA"¾`ÜáU~ uœÄìÓ}ßý:ç»Ðú*—¬5ª] ù«"×üØŸÜÏÏ¡GßìvÛüÞá§²Hœìë?=¿[Tñ˜ÅëŒ3Î8ãŒ3ÎøÏŽODÌ:v~ [$½¸› ™"Ã,ížõþRE>ê¶\èR9865§˜ªÍe2kéE®ú”øh wýÓ#¿ÌHJCˆò¥…²ó ib¼NnÑzIÕD%–ISจUñ{ßòºe<‚[¡Ný–퇫¥I_$e!€IìZZªúG”-ÚåäôaôÄå´×»ê¿2}ýù+hýÌ,£QonƒLù7ñïý]£u,KkÅŽF¥| îñ\iŒ þ…ôó¨=Ý2ÁtuÓT›¤$0¸ƒÖqoFK•4öÎ×sšÿ µ¢¢çµm.ü5*x$ü£b,wµ¦©rþÐÁ4@D ©×ЈâïPÏ,,V­RœYÕjB`Õ³^ÉU3dž—ï^ʆµ ×¾¿Óáeçî¬ëxøÔ "²¿üÆv±rC:ôn!9£ÊàÈÞÄv§ ½ТãÛ,Ò¡ç a YÍx¡­ù@ñjÒ‹ìÔ¾ ZT[ö¢®ÌèÜaˆKÃõ]Õ²}ÉûdY¹jY UP ž|£òŸƒÆ{Ç.ýަŠ"ŸëÝôÛ“0Ÿt›pkžðИÿãàóç|ÒgœqÆgœñŸŸ_Ôü/^òÕl.é 3ï§„}™˜çsÑS¨‹_ÈCYÏ-*Þ…íÊ]o·øã‰oÄš(ýo^04m%ûÊ oqÃò•(žpïe€(ª‡J­P•妓./•·’dÚlPKý®9B`ÁYöÕÃDÔ‚B4EqŸ¿‰XņßêÅï£¥ØæäíˆÑU{È&€o`#³ F’Þ Å¤à m‰D¾ Õ Rþ¥åaLÏ@ԳÄ(LktÿéöDx marÛÄv@/ó–:ZøÈ6.o¥¸²ÏEÕ°ñ/TšÏ¿%#ðG¤ˆÝ9>ãŒ3Î8ãŒ3ÎøŸö¡L X¹„ÞU¤…Bz8àÒ€Ea†ýŽÖ ¸L¤諬 ‚%•„5œ°\`ˆ„>½zºeU’@@Œr¤¢ ÿR=¾.Vªüþ-ù2"ju9hŸ®pªPE¨Ðƒv¯w«ÿ©°?EŽŒý2"ŒQñ@&?÷ÑQ¹5½©f0íœ)b·J·ÔËG? J*½¾m°·¢ËŠ9éË(ÙµÕçGs‡w /˜ ê…˜AĢج2 š)¹ŽÂ³Ã>Ü]ºžÑ^çcB+%0üŽšê:­èOôEÜ’t¢Ê³‡ýo¥wn쮞‰¢Z¹1²ø*ÕLÃIO³Õú~ Cl¢ÿxò'È{H·²”¤¯HÈ,LPlƒ­‚¹àÓ‹™ÈlO°0à·{c‚WýnYpoAÅ›¢Úqý: 5N®îM.v6йa~b‡¶Ewâ"dóÝàtû›Ú˜‹þ¡ñó¸×K”[X¤]å±B0­P ~Ÿ#·Ævö°^:l’|D £C‹æjzCúüb)äX>Ò²ÿºÎÛ3ÕÔheûÆ2Eê#þe-B¶Ff›Tâ×GCqzq&Ô›×ìø§Ü³öln.4ß‹˜QP ;>›Å¸ïg£F+UÕCômPß]MµI›ÔüÙÓžqÆgœqÆgüMÆçÁ¿ÖÂbV«[7{Õ“.Ü„ë6eŒÃ_ý÷AK@ˆ*{iúM¶¡àŠƒ¾bâ³Ëîƒ ²FA‰Q(©Ó˜È`=S’D£™œÂ振TÏÇçµT*UÍÐ&Všµ™gë–< 0§•™ „–ljšeºVý Èl]ƒVŠ"ÍßÈUÂíŸîÀ®¡Hó&q=:î½â;€fóðßöG=TE²Ó»B? l¾ÇV*&“èù‚½üIÙç`™x;vŸÉ÷ÿ}°0n ((qAºþK9Ðz)â*Áƒ.ÆðÀ=™A+Ψ”ã$lЙ:2ϳ¥.ÎéÈ7r‘8&¬e7ƒÿU4$úˆ£$@Я³¢:PVOêÎQ¸nw@º!THGŽ]kØm ZìD c×÷³”¹u:„(ôg<ò8aÝÈðI6ã®éLÈkl›L0¥A4Ù²€ÁÑmZ—D%¼V¬DÞŒ°p\¬ú¸ÛWI˜¨ñbxð/{„cN¶°¦7#RõNˆiÇÃ× CkÔPš’snì¹D °ì‹ê$X|.9Õ€' RòŒq{w»Î¢7p¥äkÚ-;(Þ>z"J•ÀD ‘’tÿ¦ûËÍ¥œ™K€;[óÕb᪂‰—O²r{-%FæzÜÒkr¶€Ȳ(o÷•þ¾f¿BüÌuÍ]ŠýžØwð­ý´…~GI/ÁŽ*cO bRrÙ²ÚNñm9±¸Õ;©sƒbSq ¹•›òvÿM´@gäf.Úú¯yö‡²$Åç$Ј½÷íVˆnÙxÅC}Éøu]™ÈúJzÎb‡8Ã-°hBYäØâ¨ããwÚ†1 ™ªÞ©¢ÂâuÍÓF´†=P¾·\^Fî–b ½Ñí}¤hQûÌ8 w0m,ïÍ¿jì?ÉÉ[œqÆgœqÆÃø :NÈä<)ÖúÀ»±]Á¡BY¡E¹dßµH¬ó¢½^ßn܇™}¼+˜,×›³r˜ ­¨q"¬|%F3ôÑ«ž £×’û­ýNºs–g¶ÉXÃ’–+&ðçÌ¥ú •Qb+:5Yí¾{á8?æë|ð˲ȟw=›v~2#›MÁ—ļªkÓÉ02£pDU)ÐBg. ûªðƒYÛÛ!^íQűŠ{Û& • »ÑO|£-]CNq•üûMÙ'qolºÖõP`¨¤ª}g½Ô·µÌ'„QdÈTµ)P¬ÙVŠûn‘y~÷µ:ó«mÚëöú´é° —ïNä3Ëó‡VNÙ_LL’àe!Rl‹ªÇ#D¡ðæù+Ë¿WJÓÁS?Úõ¦èSD["@‘×ÌÆm•8|©»µâ­Ã•ûu_öMu˜ïŠ¢`øªU'LÊ¢‚Û±dûKÍGÝÃ`> b>áêýß ŽäÏ ó5™h×qu×ìw øåCÜÉáÃYýºÒ:hoJßAPŸ°’Ö.W6Yk,<Å?B¿…¡¨ÎšH-À¶Ëÿ‡›Ô½KÒ¡µúí0tç"¦ù÷|B3˜{g}­‰›j`ò´ó^-Ùÿ€±=2bnâ¹ÁLJÓÇ †’Þ&Û,KÊSv>|åüAI¸®ýÑ/nÛ?F íõñƒ½·ùÁGqÆgœqÆgü…ã“M”¥¼žÀ‹X`¾A$Ï4t+Ó^/{Ñ>ÞšÀw¹ëW•ÓP†ãȉ»’ôþ:NͤµôÂûdoctåÛÒr¼¨ PíŽ?Á-ßñ3[4J"k0ÑÛAÕ2ž9GT3ÄQ”3ÑPÌ•Aé÷uÉXi7=}] ƒ/6Y3‹õy‘èg˪´‚(©W·–xk€PÉÕoãSm×fÝ×öAú– G¨yÜgEbá.H8HVÝ´Âb=èÒ«•/Ë!G‰î|S(¢âJ•ÙyŽz¢í­«·*okP»”Lqqã´/m¬ÐDÐFYõf‹N¨TMÕøÇÀ{º£d™õÈ7(TQw±÷pÁѯ²ÖÏ*¤ôò0&½RßZQ]Y×ÉÈ(u7BÌú"e¸ÓG›´‘˜²q–…â¦cÁÙSY+Ští¼Ã¡–©«‡­yhôMì}Q·â|pŸ"Ñ2£¤ŽwØvU»o. _J0SC[l j/•_ä7çË0uŸøëÀëo¥äœeé¬ÛÇ# ÷ÉPÒP·µ¥ p:^Øu:å‰ cǾÕ< K4€}4”ê!þدv.£(I=¨ÏÖ ; isD«. BPÀf`MJž}[ç|=ò ¿ŒÏËDq¤ïï»vCsÞ_…×sô·ñ§ï_õ9gœqÆgœqÆ7>µ«ìK^Ž,’Gi9¢˜‘F¿ÍÇ/Úÿ™½Ì>Ì>zi},¾ñ8hŽ`Ùä LJ‰,ú½œ]…¦ÁЦ%r c¦éJ»ŽÔ0ÿ›þWý·"·…±`›5Y¢È‘ž«¯jܨcpç@‹ IDAT~’GŤ±QzÃŽ5: ».¤Àµ7,ÔµÀc—Ú¶ô¢­@ü.íÀ‹šð B31"S¶_3µYHÕü€)¾BÔ¨`g@|V&q 9µ@p„Q&Ýײ…zpdü—6)ï òŸfaT€ÌØAœ7©SRiˆàŠXë®Â4²lâÁȇ79I¦úa¶ó 2Þ1iÜ8¶¼2ÙMm©‡k?ÞéáZþDã]í¼¦ùÛÎJ^p¡ éYÆÃˆÕMÒ¡p7¶–*#h— ?h)gÐ Ë™A•ØqGE‘ˆîÃƒŽ·â‹7Ç¡_¿Í0eˆœ(DŒ+©=¸§âVçÖ¦c—šE&ÐÚ®@¼S²¡(s•ÒBt¯·êP Öì« á´&»÷ºŽ|Rî53ä—Œ:,ÿéÌQª¹«G ÑŠº6+•/nú¢5÷ߟÖz ]ecöï}¸KÖ"§ÿ}Kbb”ßî›óÈÀ¯UAdQƒÏF”–ç'ëØ- †NëÍ;ÂßA³OígV-2mùJ½1‘ƒá]¼†ù_•8úgœqÆgœñ‡ŽÏÉEô­å ®!Ǫ„$F¿?Ðã‡õ?3¨¿]m( ÌeÜT¿…†Å9&KZíÆ Ï…ulñ5¬x–àˆY[Q%Â.6ñMÃ$¹ïËjÒ¹","ÁkšŽ8óé3^;ó¹zCÄŠÎZ¬½®÷ T³6 R`û[j÷ ’"nu ü(šOóì“+ËŸ)h>ÿŽ5‡ÁÖÊ¿áGߪ»ˆ€Ï  L]õˆ9Y 뀳ƒùnmÏòSFóU¹¡nxz)Ý\ôB—€*~'_‡Ï`®îÄqï Õör½=DEêGõÄè©ÎñÇç¥Ý±‰¼B¨pa²TsË.Ýêpb{)¿öœéœº}‰hä™Þ½ôFÃøîe oôÆ ¿Ì;Dz[ûCªŠ)kxeλÃô«º†´–ˆm‘ܾ˜J6‚us²¨Ñrm!èÑ×™A:*0t”x"­¯Å¢R£Š,‚ p½©6O*$M‘ %vû WÛ´4 +c[©½rHõU_ÚÈRJo­rûOꉆ:Ëx¿NÌÆìÞHÖkTØ[W ­l[wfûê45Aµ¾­:fÀ«¬~Ç}¢8>WŽ?³}6¯\™ÜÛñ#JÐT"…Õ|bdûÛüîÞ‚“º8ãŒ3Î8㌿ÿøÔn(DwdPciYeaÈq„ï'ŠE 0QÔÿí—¼\T쾿"ƒì¸>M6½lv(……©Ùx´'¨€‰¶ÉÔ ×‡­UÆRJ×–6 ïúßEô…çKgùàMÜ’Ö4Dø–«¡çdU¸¦Êm¿5p0×Fy&Ň¹ŽþÄE²ùÀ¾“D\@¥«½¢‚i¦ý·<]âƒÎ A²éP©ÿÆÕòf ¾bÝ$bu]*ãcijðñ…[!€wLh§1]ìP!cszPÔý/Ž‚f¹Øf#d%¸Ý±Œè÷bסf¹§]ZR{M]ïÿ°Å[”ŠËdÓtz†..Ê'ŽTlTEQ© »k•,ÏF)ÞÑØ³ðÀDZHGè”ë è6¶$Äc@ýR^![¦¯Ïaã¤|ƒ mCv ÐÜæìd9zOÆÏ?¿À hçf…wM½x²ûØa‘XÎ"ç ˜ã»m¥JÇ_Öò^7•×LjØÂ –äCÚÝtˆâO›®¦Ýrß4’Іe–Šc6ˆ÷úôg*ËeË÷RVÂf—. ]Ìä]Òã}æuìd'’Žú²}EÕlõÕÜ1¿¶–ÄÞºh?péïË¡10O½Ü.µÃÙCe¸ÁSŦ.±g9Ûý³þ–ÿ žð_4~cã¦-:ãŒ3Î8ãŒ3~6>}½ ú«›Î»úø*©.E:A§—Q Lú .Opý⾡ÒQ¨ó[ó¢ø÷úœ)úE.¾®«„lªÒQ4M¾»zOIéqS¨IÈ|G°-«„¬ÂȺSÀÍ[l‹·îbÏÕ‹%ØŠf½£qïÜ»Öx"€°ÏP¼´Á lNR-#¯ÒÑH‰‰j)µ7önñ@¤èr朳 ølOcùÛ NƒOblþ+Û‚G¥ÃÏó £Æx»’DçºB[tIhÞ¥qgT´ uÖ(õùêQ¿1ؼD;1ydó«¹½Áš‘‘lGŒ0‡9žŒy¸JÖÔ’9 ˆ3`¯W™p^sîUÒÆ²q4À¿g%ša¯y LzÝëOžêm,_–‚¥Mðgcã9±‚{ /Ê'õ›PnÚW­W-€úÒÇ÷-ÄòRÜ9ƒÈ—)ðlTÒÜá–þ.-Ǫ/*vBJ‰=X »’‰¤ÍôQìdsµº´€ÄƒÑÉÅG±Z”Mô”f*35è„sD!/a§—©ât´½4ŒíKÛKÓ¯œ:óÀ S\.µúÝÕËM8œ3/•¢,’Ý3fõfÜ6+7¤dZÛuÿâ·w\1²Ë->ý V&ÌÆnûâ¶BåäÜ÷l9"­¾e3£åÑ«8´d“MÄgnçPt"µî÷P,‚,ä³3«gøÿyv2ñËXøoo/àŸò-Õ8dJgœqÆgœ!Çg†Ðæ¾ ®ÖyUšföÒµ~YAÎÅ<_{¥ÂØ%åýQ9 ¨êÅÛÏ«äÚÛDœˆµê"&¬ êXÀӦ؀S]× Äî‘…”ŸöäãY³Î ooíÀ¸ÚAT8Õʤ(%Å T”Çw vœ~ŒÑÔx‘t‹XëØ{ˆR:•A5xV4GÍ cèÎ}¢’zÁêi9¿i$‰B³²&Ëè—\Ææi ‚Æ¢ßàÅB WƒÌ{óXáC£5¸Xz›R™+LÑò °£ 2U@Òç3R£ W›b«}-y×1gnmrt´Ë‡Cù¬yÖJ…ºÙ½!îƒêáñ{ ³‡µ¢÷m[êg³j±:°¹Œz§€½€¼,h_eÏgÕ¶-"©z¼,‹[Óæ”j\Oâ$â‡Í£Ñꥒ|dJlñ5ä›â¢ ã°§ØCDý^—À€—C°ž{®˜J­á[\ˆ–8‹ó1`í9 >èårçì"n`–Jójí¯Ùà}BÍÄñOçwº9u…Ì(Ó Þ%Fcª@äd"÷ˆ—–9u9äd9îòmÉŽ‡ì9`ÔÁ‚£iBÓíŠ;ðóZï’B`´o)*£“¬b ¬œ~471ÑËEÇŸÎ)F×z¬ö\C´ÜF¶² cçÇÖ²ˆ´.­½òö?óŒ?yœäÁgœqÆÿâñÙ¹_HQí[ŒÎX8Žíin@mŸÞò¿¾<6~ÚÝO ‘ RNËò!Ìfˆ¦èJѹò›3ëš‚“A¢ˆ!÷$j#ÈØ.„Fsá6K´P°BUh„tˆ×Û`‰v=ì±nºž9Àg*Ì#»Ø¨ ~r)qÙr¹Þïî‘êRu¥ƒ—¹:+Tþ•R¼n€%w¹, xÜ |ÑèÇûíþ>2_¯×D_¹S ¬D’¡^È7ŽÉ6ŽÓ Èx¦ˆ}ËÁO(Oh5HÖ ô”`cѯúz4º D„]`b!û-Ýä(é.6Ëô>MmÁ`G¯ÒBC§¼ÌiÉFOe’±‘¨v0a5ÉZ¹Ö¨ß½„­±ìê°†tÒÍeè®0™HçÁG®:¿žI2W$v=ç8mÂéòô g2RÃÕÅX»URx艉y 6nIÚ7÷ÐD6ûrQ£Zõ“Wvòrä}¨ï{G¥\¼0ûÍYO7úZh˜Ú na[SQ3yžŽ<Ó¹Ÿ³e)clåAì•Ý·Ì.¦œO.HW“Äž×Å:åÓ„k›JíÄxùö¼Ù8Ÿ¡ä¥ÖÊxP¸áÚ²ÚmÀ°3Í&yয†¢¶)üÙE$ƒÌú”¬Ø½"w- Ð9•ÄEœ4oE…ÈÖY.iÁݹöŸ“×:•½ï±áÑOÅÖ#tùÏÐ$þÃøz’~ÆgœqÆ·ñihüpUôu—¼»×_ÈÀZÚÙóí´_žú„¸Ü08j~4q2›¯[ú”^~N‹lü"´ÎS®fbã qââLŸÓq]øWª‰èÄr—½|€àKÝ­,â@ tÂS%žh´˜Ùl×I[Áó<²é:ܱz»© m¿Ì,¹Ëµx2û_6­_Ý.“ -ps="öÛ ×†¯©©}’$ »—¬Ÿ ˆîDj&ÏÛIx°±«`¶]ØW¼ˆ¡2ŠÅ¨)-éf8îç„·^íMRk$q@åâ¸A*Y2{(AÙ—ã—~‹Î¬1ôðùéÔùµab pUÃln[X÷¼ISŒ‘®zÉ‘‘Ö‘"OB,ŠÝ˜ ÑÎE¡ß¥Œ´{¾h@I (ýz‹G$Xw×ýxê¾öotúúuœW9Ä °dôXØ÷§¥Î-ô×˜ÅŽŠšÃóí˜(é·˜ßb#´8q¸#ßÉØJ›à“=+r“ ŽÓ4ׄÊè×Uò«ÆÅñº5cªÜ‘¡¥;•‘UÒÝ eÕ}ŠS§·’˜$Ú’ð°nÕ¬­¤­oO yçø¥Oó¯½$flS§5ìXD‰²øß²·éæÝ[à„˳#QÜs•Øw§±·ÏÉh§qå¢MV_S-É|ä¼'ßÒèYþsóÀœŒþ.Põ_ù |®®ñç=×?j&Ï8ãŒÿòX)îœqÆ_>>í]0U™|,ÃæØ„Ñô§³r ã8(%QÀ¯Š‹½K~†¾ÎÅaTÄÓ>¸ªÞË4¸ñÒÐjŠo\€cGhó_'Î"À©Ú7âuB_–(ßÖ²«waƒ§J'':×ÖÑ—¤Æ º…ÖTe²0ÛRª~í:@pbaR@ J<ȵäuâbQX ÌïÛ á*&ûc—|«â’Y±2ÿÙ‹†_‰V(c¬q™à¨ ØÐ¤XÚç~=Ék68]þ¸Bè!w È"Ï¡Ï[HÉhßÒw;@™²6 C‹1*Æ_»åÕÌDÍZ¡‡~lౕBB Z˃ßì»JŒÎ±«~áš²ÙªM<‰;&hfh©Þ­l£9›ÞJ~ ­8 jÁt^Êì[³õª}4¹œE!OÌò}CõуŒ #eùwüÈ'# dµyu@-0­4•T â¥iÖ’eífö¬'Ä ÕQ™ýØ¥{¡nÛ.½Mu&X\Vå@RLd¼¦cy_ý±b Òéëfhvª91LÕÑDâDÍûoÎA­½Vè‰ eÆHjv3Ö­‘ì.-~“ß…EõL]>­ZÑÐ41V2É´ýÖ5!€(]óUê5ïÑ¢ít›¾Sï™]Ǭòãñ˸ žüæÂÉÄÖµÿRõߎØw´êONÏÔîŒ3Î8äŒñø ‰Cÿ£¯£a(Qÿ˜%­<œššQx3¨Í{ê›Ebü—¯ê“D·È‚ ù•’˜"Xç\o”pCYtÌ‚*õþ\ñ¨t•ªÈ×XB¨¾y?ÍæÅ1ëzŸS*"v­W¹/Gðâ㫟’£þÔLúÜkJ›µU·fd’ob9ØÇƒBcÑÌÒþÅp½­¥¡Mq‰@זΟÅãŠú·ìû~FY‰Å¦Â:ÏõüÄO%&`[Ò  Ý™aCL2“ºp qÆ$Aa]È6 Ó:³&É~™ g*¦VTõÃó¡;¹ˆLß–O¥˜”²yW&ÚÆ,”ü“áÑ”€î`*’0õ äÄ£bˆ"•à¢ñÿÎÇ—Ž+bº±æùp¯º¾éfŽšyÃ2{;\ÁÄõ?íJ.¢õ ²à VÞ‚t‡;bÆ5Ã2 4ÔÔ»"÷ úy *„º{:¹çÂIܳ2HN»Á¡À‚ZðyX};”o§¸³J,ü¢EFµ¼Ð‘U„¯ˆÞ}Ê´-qrjá•ó+¨h.eËì@z Q ëûO?&j{:&Ÿ4“^ƃÓý<õÔr6þóÕ^só\<’Yì­ì¾â!Y–ôŒµaâÎ\6L:pº&ôÿø(É1:®»ŸòW 0•¾Ž¿ qãâþ•§ý&樜qÆgœqÆßs|Úè͇*Ìâ»–.D‰`ÀO‘ ]¿Àîw8÷ñîðÕT|eˆ?U“½^®œŸññfÿ ÑGÝ¢†-ú¬»k)êʨê¼*j]?Pè prµj­ºÙBª!èŽîÑ©×>wéS®lhb¨–ªf0¢V›hü“ߘ‘`ap;­2pE³|½è~vßµ€€^å…P †*KàUøP~ç!”ª^|GÌó7Å ÷1yÒB@@8ž £-@·gÎ7˜øa¥ÄØZ)Ý\R¤DxŽÜU@ùxqÛÐæòx d˜“ ð ³%M™ÆÚzÐ9Ý;³Â«¾µQeŒý}”×)(ô C\=OOo– ¤íX®ÕU"—Ÿ&Z°¡\k% Ú©& <áðué(Ñ™8`4p[šE7¨@iׇ¼¾|6)H¶FÍ€½ýÚiÞPM=«2¹Â/‚/R]Fe+v(¦§×“ü©û pZ&›üNÕËÂü¦e3ËV¥¶¼Éß®±V PPŠÔ^¢þKÅÚ•FRÖ±á1ÇB[³™Q•Š+ûœê­× ‡èK]†oÛ#Þ'¬:Lc‰Ê#”¢V4nØàºä>®JÑØ'sä`Ûh)ÇÓ#­µ‘"\Í6eֱǨÿ>ér{ÑïØ$g}ª£cü™X}kÎÈš#Ûß:ì¢'>Oçü^ÈþPóŸqÆgœqÆv|.½Û»¤wy×CM÷û(:“Ïí‘G=L‹J¶,$-{ш;Æ&„ËÌÁSÞ€!,V û”ƒˆÛ!\[VÚŒÎ7Pö/-'²…\#`OåÍóaMSxBtR¢·± 1=`B¾×Öózû`Ò©½M"ªXu˜4]áh¢ èH¾Ä¶¥Ï!JÛµiÄÝÛãe]C‡ƒóãЙúEÕ5uí|ˆá"¾5=¨Y;ºo§‰Ò<[™,÷¯f#EUû¤üι€ÂÔ „Z—í¡´†u›x“4bɶ .¦Õ™ƒdì„ýXéÄ Zdrõ.PÊ èd®‘9ÇôÐÆÌqO,šÚØaÂs'£ÊæÏḛ́§ûÒaDßÿøÊ>Wæõ;àØä^ΙaåÙ‹$ò åj4ª9 ¸Æ-QFu¥zs!uôJ@(TìŒ]ô¾ÆÛ.Ñî¹2ÿp´™}ª¥Ñ—èyí:JÖ)PEužF£ñ™ýÞ}I‘š€|ljóHe!¥™­©¬Êè( eÊ™³ø6¬¡ú+!Á棷{Üä6AS¨ÐõYBkqM>¡wáÔ X\,.O¦»!9Í4P~æ6éiwÙ)fÿå(g ñråƒp{€g2*팉àdœdÃgœq Ügü­ÆÌ˜²ÚËì˜BOèñÆòQ¼ø\ÈŸ4Zc…ßÍ臅ËÚTb’ëD Û:âQ®±H ¼H…uä§Q½]§|ˆÆUXD–ƒ-¾¶è<èa—®lèB(ØcI;ØYKa ?µM}Á”ÂÅêSèsªp7DÔˆ­ë2R Ž6¹z0øÎk6³o-BAÐÏóƦÌÝ'[;côìÿñ¬/.Vê²!`ÆÝnbèrî2 3&HêZd*áT™UŽTf&˜¼»àKQŠëjl!H±æî«”"»R¸³¨L´u9¤%ÆÆÿþE`šÁ02iv¹0›•¾7~ÓN™;–À–ÅV4™«ºCU…ÛìQýúWmUi¾iúÓe7ÛšÔ¢`ùîAd¼ ¥$8rÕy®àN®Ktð­?2v,÷šâêeBX ©_å*íÀ&kEËú< ô/¹€Å‹›9Çúw¬î™O årz´P”cš¬¤òÞoÄÜ6Té•tàIᦠô0hÉ&c云¾«œÌg=ƒïñÑ¡Pt /*ûítµ‚lê²+c¸Ðm,3ú)›âðËØñ‚ìmcÍoɦypSÓÌm*ñxýLÇ+G&ØžÜSÏ–†Ú5úñçý®ñçsò 3Î8ãŒ3ÎøŽÏЈÊÞZyžË3ìljúÀœÈç7,ň®:ѳÀßòED{Ñ>hx…0CÑÊì7²Áß/B ˆ$„”X(uÍw¾8ƼŠÁhæèKT™Â/ÅÎì@Á”ôË»¸¾-ªj(b“înÇ%½ïhBªÿÁIR@áI¬ˆa"Vï·›¤7–¹cZ·áQŒõ êdhy 8G†#ð1¹ªÿÌÀA`F›ú (›\nFˆ*QMBÝq2q3×áúf…!Åø´Q} «ÁFè(/åÛVímÏ{½ì ă ‚"ÛR5qBùG1:›^+¸ªL˵ ´ì&©ORЛÈBZC²õ¥u©——IžëŽ»#8W•Z‰ß]¾A´¿\©¬oF~>à馵z¶tÔCd` dl©Áfa{Ãþ4ù’|£J4ü’);æ»B¯F(Œ8 ™rºàü„ø»ß •,ŽÍ Ñu· ÝàÉK ¨"#:8Õh›mv Yãܹ@‘Ðé¶w–ÍÎd-OòËèoX*úA‰ï¶cÑŠ<ÕÛLˆÉOI/„ÛgIRIò<¶ô Ø*ëH)e(«ó#—ŒÍwRÛW~«£Ÿzvµ½Ù´«Çv¤z~ïö-sÉU¸¹Ñhþlÿ®ãàûgœqÆ}œòÿ3þ™ã3\ä%œ¦òÑÃH2 ˆX‚ªô鿇u• ñnE>`¯¯ÀË`f/çùaôH¤Û'Kž%/9›_`¬ÿíêƒØÎt‰ x]ïª/rIjÉ%Ôðe‰½EØúPÎ n)—IŽL*{-ÿ’ƒØ,N/±Ü">/!6; ¦ìF@0 ýÊÍÂÈô’˜—7úì»ówœ@–D wêòým9~cðU1³¡ ØÊ ß¡/ˆFAjñ&Š##ɘ܄pùÔW†°-ÄÝDb#‡Ã°1.ÚîÝ}\ m`ã”7´Qúô…½¼©ÞµšÈïp1ãnÍéNˆvµüu7¢CÁ€Éù¶|)>ñëw^J[RÔ®_Oµ`oI¸.8½%vz¸—ñþ_ÙA‹Ï†beæJ´A|Uʼn“ëUë˜1²ÒÒ¾[‚jqŸÕf|Hºš:}šûVz™p«dßÃEÓäß"<-'j;8Þy©ìO)<§:b•çªâÑÖçø9^µÝ­Lôe )®zd'oY’í µ-4U?T>¸¼¿,ÓEÖœñ-  ¡HŒæ[uÅO{›ˆ z(Ë Ü ¦¹Q¤íÎo–IÄSX­TÉ‘jŠc=¨I1*4‚Ù •‰b‹? ÕÁïÇWÌ”)HõË2Kž?̃ÑqÆ¿dëþHKzÆÍø\^±• EƨÙ/,lþÚÛÃw\Ì߃J­ßE'Aü?³·/±žS„@,ϧôÙЛvUüú™V±¹Êkô.UA}ɾ ƱVX2ɦSµ~é;Ó¬Ó b¾¨Î~êðõ Æ‚ùÓõÒxc6ìLhÜÍ”C 1'ÆìHáW©±Ê–Ë½È lƒ[Å•n½"tµŸLY¨í ·óWÍè¿8m;1|‰½Q°$¶¨a§–ì‹ø^Þˆy(ÛìÒÍøákÒ©m˜ÀŽ|°M΀ˆ… à 7¯úæBßmg’3$í„:íˆÍý7³´)äycS?-‰•ŸøXz’=Ý ÷rbJ†xÔ¦Ú9‰û0¶yød™Þ‹x¢,Öf'aŽª°±ñ]Üýa:Ãã9=^õÕ®\‚{CeÁ-&Ô ËáØÉô]ÍÔz!Ô[ßÜ\Ì©4¢#E&9$þk>wÀ²Ä¢c·ø1ß¹æÝŠóƒt1ñÞY¥ÀU¥0–×M« °~%†CV/R¥×ÿx»Ç÷—V#w@ôfÀÚ@­…PÝë¬õrbÿn=°5SU]ßþG/"dÒ‰£Ëë@t夋Où7mvùZOüò¿C É ÛÒ¨\«kf—E•m÷‘øŒø±SPgLECùŠæ\ÓîCeÁÇ=ôË? þAcÁŸI"ýÛÊf`mQÛð2øµÇ<ãŒ3Îø¡Q> ÿÿÆñ9—x„0ƒ¥ò[ 6"Øp|Ьy‡Ü|,¯"ÔF{ÑŒöñŽ—^T¼¥Ò±ÆÚËH$HKÂ*ž±âãNÈxEC?ðZP…¸åëØ`â‘nãÓß‘uªVâ 4ä­û®Þ@>â¶ŒP+C¤.‚$bbÝ]¾¤®¢BCp€“%˜†M4­-ÉÕb® vlM(ÿ½ ñ$úA,ç4-a-pæÕÜÔdIop‹”üÙkg¢xÃVë$DzÞÿ‰ CŒ œVð/«äãîCk:“&ˆ‰îšALIHÞyNYÚ~,È¡6ô';#w­ÚìIB"Žé\쫟…ñücâêáãr޳ûF¶X·45!‘kH!ãÁ&߬ã…d_‹ f‰³ó^ÄJ;ƒ®5³tl} DGÀ›:ç IDATR>iîðcÛ™WKŽœ‡U ×*¼& “;×ÝÚ½B©‘òfíº‹ó®¨ª$¦!źÊw„1k%ÓRóOhÎï2{kP’êä•ÇIù̲ ›V½¶z8 ¾$¿äê´•®&b!`7+×÷ý§B6^:p>-%È˾}ÓÖ\»XíX3þÌ_¨p–ú ø¬ }ðy›U™·~éªY´/}Å¿°C{:Ñ?úüßûâØ¢ÆúË'ùÀwgœqƱgœáÇçVŸ—‹<¯ µ®]u9B¬2¹ þ³wAß}ÁìÃ^/ûŸÒNÎ(f4eé¯pUìßÓÓ·_¨ñ=ÉGO ˜} CŒË78{¼‹‘gG¤" Õ‘½xä ”K°-ÚеAó{g”?þ»Ø.hªkky¯TrFCÑ^á ì&fr$ÿœö}ý]Xn<Õ5Åc $ÂP‹»WçµÙ1`ª;'óÂÇtc•%¬¸y–_Ž,:,il·½s/$rÞ‚ÊÒ²Q»õÛ«M2‡öö°<Ÿ.ß³æCçôß”AëÖq@¢Ð×Ûa¥s(Óø­ýûÀJŽrŸÙ&âÝRösúuê Šäã– Å œË²ýÞJdð‹ò#¨¬|ËæäŒpyÊ’É7²,ÈàF‰wÜçL¨wÓÃ2«×lÒˆµÔóé˜ÀI#ì_dhgþ­+J;ã7›9uÞN:$(¹kDw‡DNøè—šêÈЂªKÔ,ßÄrò*ûã>!v£cR«Xú¿ÐóEýáCH60.ÕÝE „W–R“@‘ï™íPði¯¼ÝЄújMÞgsíF“"Â/g…9jÅß“ÜÙ¸!6ì§j`=•ÿ¨µdøs„ç¯%WõXü¾¿Û¸!ŽvÆgœqÆ¿ñi$(¢F·nžë¥EêÙ`«dS<‰oŸQ€´×UyÇÞEƒÖLË-ä#½ Tô …N¡A¦P4F* *Õ¸ÄK1Q]M¼[ùŽ©2_a£Ô6ÁÑaÅ?tuÁüOÙ¸”-AS)Ë 1¶ÈbŽ»]•VÃõ‰R|ȶ_ØeR©ŠGÅÌÏ8d‡û¸w°XßâÃY‘º;~ÎQ ¬¿td6Ùn¢JG³ve²fh`Àõ¸¨°©á©¨æÊxŸŽîì6›ÕDaÒ#Iæú§nïF¼dNÍ%Ë-¶ ±t\àe«g ¸4ÚOƒY©Pí¯ PC¶_ö (°O'ÜOòWDæ£ø‹®@¸ª vÂq3Ú;7)Û½";MþQ%ìrmC=/#'Œ(†Î/Z=b¢õ)ʼ!ÚÇä=¡ sg´E)šú™¬Q>è¾={n¶H)ìLW@i¿wÞ¥„âÈ{pí©°=©´|Ù_¨÷Ð_®]ê›ÿó ®ûÞuë.b:óê4âRk®'ÁmŽéÈo0[%ïaâÒdã$/ ,*V–Õ¹Ûüäž ëEˆŒ8Ÿ˜T½óiüΧx/òaOä–· г7oGl÷‘/÷4'Ûò[n¿?¤RÿO¸‘ñÇ| þÊwú㜖“¼8ãŒ3Î8ã_9>g‚Ä 1ûð‰!+JÀ@@Áþìƒjï>z†| ߤÿ_\@_åZ:ðvÿ;u•\„pì>­C•ØBo,É[}$V>K )=¥¯‡HvK³w~ ×ºR.ìøX|³3ÿjñK–hˆsAA[!6Ô—«<Lj„w;¡V“a&§Â–kˆôVÿÎÞ·L쫈€ËN€ˆjB°½gj^aYÅ\Cµ˜'kê=BAûH¿IÅÒ³:»é!’qÎ$)Ê È|LÓ.€X Y&ÌÑä"íJk7Jk$[4ͦ¿àCͽ­ËXl´šŽl¿se>ᎀ›ÛiŒGá§Ùáñäolà{ ãÚÝÓ>f^fİa5©¢!ò*m™gÛëǺ3¨ŽÚBäî—ì=ï§ù´%ÛþDHȉcµÍ·.ÄNää,wc_ÛñUÂ’®Î«ŸoB§oWÄrÁrmŒÀêúcy)-vêZIè;ö­HbÕâÉ£lL(–³Z“ )kN§Eq‰cÓÄ+§ïA,Ãg<78þöêÑY¦xœ+`¨î1¬üy%Ým¤žïÄ<þ z”uÄž¹Ç†õ ö‚DE›MØ™ñ`có²Ûs§'uãâØþŽßÁüþ„éùÞàŒ3Î8ãŒ3þ…ã³:œˆïú—¯€óÿÞ €ÿu”‘žÁ¶+LIeq¥/?´Üì />Œf¯—½®@W8ê5ô*È,^M÷w$£¢Ì´'%R‚ ÞÒ¬~e/ˆÆ#eD¾†ê”ú°«ÅªaAÎuê‹-­œ¥¤^°pé×.Û5É™0Ûñc„]#'~ÚÜÒÊs¯Ü,Ór$ŒµÁôé6ù’_uá§àˆc +ì ™<Nkï…Ç9.ý2.–¹­T×6pà$EÇ aÄrwTêy4…Ðìå ¯ugé=Î>½F{@¸±‘.l±²0®&_$]çëCÙ[Z–%7kzFþ_®ìX>zîÎbМˆpÅÌ Òz8¢ó®4èý…åšî«§pW˜eÆEL·zâ¯ÎZ ›­ × `®Êµ¼ÝÑß‹\OÉbÛ§ñq}5²¿ä™B:A¥‡e.œ& •—\sMbÈþ’YPÚKP²Þ±ØîÐÆÇéþºìC•ŸI ¦ |¿Å­jn™}YI‚ÚýéÎ5\vAd(c¢4R0§Wg‰lý:‘Š×™$LöG´“¦ýî©Éâ6Û¦xéôFo󺉃°p$òvi®*LŇ5ë]Mí¥X~T—2‡-´R:?P®;¶[¬¸¯ûµq¤ÞÇœ¼–·úèâGl÷O5u:|ÆgœqÆgüCÇçí2†š3­|ŒÄþ7xTÅcËõàlƒ–ÄÇjQ-ó[—õý™¯«VKEõ’>r«w{®Ð³‰mÀ6J Ò¿ü©#[ ÞSÞb"õ¡Žd|ì÷H¸ £] oE;ü<™l£q9«l*õ|9[#Ô\"=³Äç`* çɽê^ª•*âÑEz;¸Qìãá$ìÓ&ìÄÇX0Ò&ÄG€&HbL±Hðì7méµŒŽ…™±¤732S1Œ×'DÈ - öw‚a…z\.Of‹‹î·0pm©2÷#ËÙíÍÕŒnóõ﯆’[kWGrïÊö;•W êÐ Põ‹cVk†ú—„~v¸*æ®°^œV\S|K}#wqM³2¡œ×ÃÈKÕ¹â¶Mí ø }àÛÔÃù6L/St_yزir^ñ2ª"®ÃßçB‡~¬"&! í­òJ‘㑜ò,Éf?K`p¿û!Þ³ú{] €JˆE±‚®V‡vE:ÿ„ñ!µ#§O™'¦ó„Z]Ú¯K-û/u¯ÊZÈ-M±/Vn´lÄXÐ ½kËùo˜šðJKŒÍ Ú-­:;/.¦x»¤B­D¹çí׉ü}°@Ñh}c7ÎÃðÓä<§ :©­Î¡äÛ¬™¿ð üéí¶Ñ™÷3?íðïŸqÆgœqÆýø4W#GtTò„òwœ†Þ_2f`ÂgéJá"LÐð2âû?¿ú…uˆu¹Êàv^+ø\dè FæFsD‹X…3à'ü¿›F€Û-™k¾†mO¿}a«èEG­3}R•—`ÑdbàFšÝ~ÇBžj¦ãø+®úRwzûb@Xã™ -1<ãT@Ø ^QŠ€¡P® Ë)€û©&®'¾ ÐoêÙ.“ÐL§WÞ”[g¢ß(X9 Ê 6ñå°TꌰŽE£PU½XÙ‡ËÌVùD+$@‡CsÍ[Ön±[†˜N»éíP$¬ŒðÏ$¯žU³$™ž¢oI"Dƒå® þÎåŸÈ0ðˆ[)c»ÍLÊ" 9J ¶Èó“wî%Mꦼ3}ÃañMKâåðñ]Ðp=Ïì#ÒŒ ªŽ7nH¼$jKŠ28žX®Ók+Í%$ú”˜¸ˆË“5­'¡Ñçj€€P+‡Á¸]òqaÍ¥žýâ™üf˜|µ†=_)m8?[ºš¹õ=Uí ùZÝeËG'©Éì"vEÜÆ¿ÉÌÅ7|óÿtÌu“)¡º˜ç Ö 8e/b¨4§þÀ¶H\ ­Y"ã!¢ÞŠ †_Äd‰Õl³ç ƒ3˜óƒq½!Ñ™nE0í ÿWÞoüÌ1ŒxöÏ8ãŒ3Î8ãÏŸÕËÀÆõLÚ#)vmVá\F-á÷ù˜î˜üõ­àê„íbv *àkiRª‚Sí—êTQ·Ã'áý=r” ÁLÕ£Ù¾î~Fˆ' cäj&ì;Î2í”ôZc˹AÁÒ Wéf5aÇÿ0;þ¿¯ï&T×*e|û™×ŽÔÏv5³‹œ˜Á”ZUW_…BÃ@=ïMWlþ³˜í’´+nñ“>hGù|oxô‹éÈhü¸új¸½Ê'án…±¬Rk¿sM¬ânyrØ9þû¬we š¨~¨Y¿3wÇŒ*Ûÿ­Ö›w§lSv¯{l´Áõ$ifmFãǵ‰%ù·²ùÍ&†‚¥¬Ô˜«ªvAH¥>jwÑnÉÖÖÐ!_ñb‰ èy—¯ƒHµ¿ø~2É›Dè°X«W°“«+Wfø†yǪ$FÚö_¬Wú ¼ÿsCçF XÉvÀìÝoñzip>K=xn^iÔ¼1ßÑPz¹ñþÆ õŸæ×Õlîñ´´_žì!å0Ë;í’Çй ’Ü¿Þz´ªÔ|‘ÊI‹·Q¹ŠjÁÀ}[)~X®jÐø;en¤R4Qº.¡lVnƘÜ"B÷'Jœ×:’nc(@ê›B°ÑÒùcáÐj[ûB/S?ãŒ3Î8ãŒ3úñyWÉm`EÞuû‚l>`/~—J ²YÓ‘Ü_dè‘‹HbàÊ?N®„¼h±2exï®î)EÅêƒàKÏ<ð±Âej@â{M·Ò veŸ^†Þ«ÏüÀÅŒÙMÀ6šú™ûºKb#7‹q¢rÞǶÐ3ÚcL4P  û““l&wVÇ!À4ØŽƒ8‘ _JŒ¯€ž÷¿O1Ð4š&7d?nσOu³'§Ø6U¥y² –ml Ô&L+ßpÉmTß4ÖX•Èy*F4 Nýô9QÞmâbƒïk8òI’Á/;[‘ø™%:ÔÍ”A2S¥ ŽXÕ²©Kàî>ú1ŒÔ lîbXsén$Ž­15Q‘)ùׯ)^XÀ¯¯ñr‚ÈK³bFqf‹åÕ~¡ánCQµPæiq**úŸò»WÓÜBmÊH@lø“L̽R(·vs¨ Q_¥QÈéT>=ö)po(˜[…F[¶w[ ¬hè‰Æý¹Îlö÷öœÛááyØ%Àª¢äªû…‚EdË$Æ«ªq#ç¨t¢ñY*`5竳`KNÑß1²ÇÓ–ŽßñvÊóÏ8ãŒ3Î8ãß8>w×ú ÿÉà­ó>ÿsú‹{-QkH– É•”¢W“@Ru ½+&IÀ5ªÒÔ±Ö+l˜>Ki!*­MNX¢´]8‹¸%šì”enn∤R@eª÷18ë@dd›¼Õ3r Ñ|Bý9ßî!43-H&ñý—µèZÄ_‹òñð—Ûâ÷º9cÎøÎ¨ÁÖ M¾¨±'7B–~A÷l]~:d Ø*‹×,ÊÅŸNÞDÿX•¤&6p˃þty+*¹"åùøIÌŽ«¶ö«<´há‚ç–ÉUÉÛ¾ä³@ÑÅèœù*O'™]5ëyGå|-6¨ÒË ˆët‡Óç¼LÅrv¤Ó׸IéB£õmi=1O¿½áâŒöR1à±/þèMYòσâïM8ûžpìv¶±gu>õ•ŠGâ€ì©P| m•ÁÌDzqiûkõ¨Æéâ$3ad#u= <=#›°ö°a{›y:øGóù°ÄGcºg9ôŠ¡ØHLdäv†Ü„tëBsq1L—õ½êe×ÜHèåÙ3ÞÛo«âÑjÒ^¸Ebqq1v Tò7ÄÖÆÐ}ø>¿„°A©Õg\|]<Âc0ªÚ\ëüQ±!ÍþõçAq=Y#’©Ëù7`œrŽ„3·úѳ ›­e­ÛàWdw@�Èç7·ƒq_Ρ‚ó‡y:o7X~TEýîæÖËeÒV~KË,¸VaÏNƒìTËoÖ\MYÄéÄŒçZñ‹]³JÄþ/ž1šYéÒô·Àz®fâûI~@þùìÕ§þãçP&öº‡»­P©\͹v8Së> ½D|Âz í C'o±98ýKÀlNÎ8ãŒ3Î8ãOŸÇÅ ¼m\Á©Ô©Kž`MmÜb®öD ™:÷3óxô¢ºZßÊ`(=•Œg‘B>O! áw_ĶX0Ñw±.7:ž‹z×§¡DÍÇ >x³rzå5(Œ=Ï,"ÎËA;Äÿ ¤£Mp!H}Ž„.ù}™z¯m®Šú¯ <}Ó|Ëgle‹é+¼»9uSü܆+et=¶a{0÷ƬSï]ÏÐEÙuä:Gs‚øbŠSL*/)6TU˜}²p˯S¦ŽÂQ¤6!.n¯ŸÄ´("ƒMÃÖ¥Ÿfø` ¿™@|ïê s#%ß×R‰[tRÄî[<•yçžjq¨'à“i ï:ºå W'ì'çú™îv¾í%ÉùEiâ“98ãŒ3Î8ãŒ3ºñÙݬˆîš ¾A cí¼F G5¤†áà vÑ~ñ„¬Ðì@ß©Œ7Ö¨äõX’Ô¤y›¦Th´²Í°ÂÁ0¨øhRpovdHôgž,°YËP!¢”ÒãÒÿ‘ÐLÿPDŒ´$ûèñަlðçnú£¾Eõ‡“%•b*HBÉuÕt‹êÙ@> ”˜©Ð–#òtc; \4,UK>î²%Œ`î9aø£8AÄâ,øúëÀ$*Ý ìa[¹ö<î™óˆfš|?Û‰¦É=—Û˜UW>Sjá×ÂÈ€-Ƨ¤n´•Œ²º­Ò›°_ª‰m§ ÚÚ/£e²'1k^å×÷a}/`ºÅñ‹E-YtI.ö="—:]ÁAÀБI–ÜjgÂ=£‘#‚×â?½pÑK†¤ P}H…pæ~q Õî+)…êÔùGÂM`ÅxXr§KK«-ÔŠ::‘–ÍufAäfqG1”ág?Í üòÍ­ˆIS,Ü£±ÿ¯ñK¹âñ'‚jÅš/bÿ¦{£ý’9ÿ-‰Haÿ~êž»!_MWgmfbrfaFß¹Lÿæ—f†ßèDœqÆgœqÆ¿4>+ ³ãñ`”4L½½¡’‹±fÇyÌ€?µXƒÃJeóœ4†(EF>¯0Š|&à‰EC™Sx=½¬¥©ÉÑsù ÔbÑ”–š¬'J%±Pßà„øþ\vå´ª ãCã²dìáoAŒ0 ÁÉÝ3¤çc ¯ôm‡!5«Â#MÔ"{TÍÇ_¿ÙÃýËո)ÅÊ¡^w™³X3k –S-[ hŠÔ%-ú‚–¬@6$Ø®îs–S÷¸ûtl*.Š©Óê¸Zx à/þÅöâwºÁS#ÛâaÙ?ÞÄ7µ©ÛXڼȉ¹{Úïû´ïmǶ€b#éùäÖÊ?˜µ‹uš¯|¥×°eºR ¹’Á@in*L• Þ&Ãõ]]WFz… |ãùIüfˆ)gºéŠéç«ÁŠW¯`þ§³–Ý*–2çë׊NòÃOÍ?*} [Š?:åÑ^‰]rá¶E% Ä=3ìW)ÎFçŒe+T¨W‹îåó4\÷¯aQàÓ`)‘/tË¥ê£[ØÜ¼(‡Ðó4îq‡›ˆ™þy#m!{OêÎÓ@ç8ʰ/Ê0{p½cÔØL 2žêQQ%YãJî~ ¦-:ª8ƒÆH|´ÑŸÇ†}‹Is›ï»'î!~äN>2-;åÿ?ßùÛØP<:ÆgœqÆÿÖñi{ªwìׇéaXó®‡r²·¯ºQõf[í«V"7&²/z†vœ3/T$ÕŽØö¹&hD ~!°‡Špº ¸Ø²*}‚§î¬ŸI®]s_ˆí*ÄW£+1›4Y•Á{h+ÔrŒ–Ū®€õ¼…j' EI2ʤmm§}M\±M5hýR:zë6 ƒŽ—;:tÓ´¢6òû™}b¯ÿŠ%ÑÚŸuž0½áhÿ}°oRÀÀ†¬LÒˆ© MÅkÍl’Â2!’Ÿ,Âeî†úáíP¡ýœJÂÅzÐPL/ZÉ6Ž$l|Õv*K3E¼Ô$å}ó"lûÛ†¦<óÂqc¥®ßy}Æ Ê„\{]…Zc¯Õé÷­C'»ÒxØ]÷±<Þ&ñ¾&pc—2:ëü:¥y¢^úÿÏÞ·mÉëJ"rêÿÿx*΃+%\ Uv÷nÛä:kfw93%Q$€ˆ`ô-fî_.n¨ZNoH ;˜êh–"ãéàO©lQáæÓ:GCñ:9˜]”º*îÀj¥ñí<¼Pƒ_'NŽÂ³Q‰¾C¿ÞãŒ3Î8ãS,F ÉîØµÖè1ò¥Z§ `:øá“•²ªø°§©üàÀ×k¸rNɱA[¬²¦°~T.7z¬D–¡•B°\úí8R9rYõ®Á9°AÈn•^ Tuéß"¢®ìÝA.ƒŸÁÕ£ËØB#èÍñ Ü\ ް‘e]«Ð.*ZûU‘Æ=uðJÍ”’1;i 6b¡Ù˜Ä/t@kÛ·‘D¼ã6Fİ$cï¢|^i‰[-â¿tZw㔤ژ 5E´–´EI’@/ÞÇFxƾ5¯ è,ï€G¶¹†V­(±f£hb‚Õú>–»ÓžéWY—:³ƒý¾eäC+Ö²»8£]â(ËÉøþüáKæSvJ“–00zy~OÙWB–4´Þʤªç øþ({§Jn"Ë·0š¸åJך#ìÕµ ^!h M¯™8ý-e5bí6Ù:'Âßsí‰èØH¤žmZr¸¨ÃXÀô=Uwç–‡>ß9›¼áj^0vf|^m” ™žKÉÉ®ü„JxqÉ•¨S¥B/DÄ"y¡¾{¬ØÈ4Vq›ÔoÒÐñ¸Ï#µzåuoñçËÅeÓ˜€rc߯£\Çâø¯þ[㇟ÖåÏ6–”ÊÕœ¼ˆJf¸¦[Ó?Ó`íNëßG”U·žójõfþQ(ù{:;°_?ó¿Íÿó“ÁÑgœqÆgœñíñ1üMÍãUƒYC© º%&¤f§Ý~(’N¯@tØ##ì›ý‰WïÀ¡@ðefL$øz =íÓ(ë§è_†Ù·dhó³ó xÙûfˆ_C‰"¬/”Ó Um”*‹¿çÅve’ÖÏ>ܽð¤ܹö™äš„=ÚbÌ«z6`YnQÞªOÝ‘ÖÄ̵]>ta*’Qy'6/› ÉoGª·´RÙã@ŠÒ‰%<"3¡J“Xé3`ÁC5o|ÃEÀ±}‡ÆE-òƒå;áá=Œ}5³p/¥>„µæ„Ö™ø Ê%§\z”‚ ¡·$á-G0½Ô§ IDAT:È’~z×ÊáÙñè× õºÃ:å<òi¨z¼’Y@²·Ä«ëÅ“B»­Š5E @Õý0§«ØŠñP)Ý[–D†µ5%Ò4ý,Ÿ ¤+¤lZ|¢A–ê¤èUUl#€ÇÏódYÿ¢ñ3ÿ¾û§BóÌ8:ÃgœqÆgüÁãc‚ J¨æÉUÈ®$Ð ˆ´UÂXñFÿéù²™‘²¥bá•´ÀÅÝ”‚šµ¹íÝÔJ._ÞH Aùï²`ÇfsÆsöñ˜' Œ%ÍÍ|Çß•í ¥´3gú·=ÿÚÃüÛ™Bƒ—¥G­ ¥î\ÜvÕïµD>ÐüÞ“æoûiÒàt›Óy6…¥i µŠ{³ƒ8"¾Ê\^·c(°˜ìÀ»u£ÆU䛀3Iô1 ¢…eeÿ@_I·R–3ŒžÒGü‘ ê.½ZœìYéä»#wÏŽa%-5¾m.ýmAþ³3iYÙ#SPÿÉQ–£»ÿæWêê tUüÚVP:7yÁ—E“´¸XÔ±`\fZEཋoƒìøÐý/ß½"ÜÓt²±ÕÈ͹ZTî½µJ^T}’«‰LRη ñã®X ‹LSó‡?l>.épA'"©ù—>¹Þ>_൘®¦ü<Ó 6W}¥ƒž…&k{‡bÌÁ N\×ËŽ²n‚ïïÛöb£¯'Ε„ëk¿…o\âßÛÊæí’ÝAøÌ ÁÉ35‡±¤EÙ4ª¦ „¼×OÙ«NåGßË÷úÞž 0GÏâ/d‡jëÑy5]ºòˆo=ìÏ òü‰/.»"¾1N‚áç'ðŒ3Î8ãŒ3þÔña#xtÅfÞôý¶¨Ð¨—ë݉/jU8VHÛÈ]$<Å ¤G‘ ž]‰g¦h„*\ôèg|AÍ\¹˜Xð¶Îâ”TAeEÞÑwü2«4!I@︅Ü! µ‚1"Jc“øU¸—¯8H˜n’ò—8\ÌMå'Y‘QÊ«r¡ ë+ô¤Ç~K˜¿(‚ò¹F–•*4è(ð£¡Í¼‹*[„hU¯Ü…wt– ßd¬Ílàl}œÂꡤ2a^ꜨÛîN>£Ê¿Žž^˜=á†CºBÿh#´ž,<œXS<ïO‘†‚¨ý¹ÉMzèÄB³}ß‚~$¥sôHåÏÖ$%MÐå£RšxéQס˜ðS_‰Ùæúeê’t°¢-”¾oŒù˜CÜé;Óz±¢!Ê›µD@ša‰wA˜‹ÂxÞœµ9© ½sÅø~&%°›- …ZázBôÜv8¯¨4íÃK¹v\Lbùc¢¥<ê}3ŸÊò›ÚÐÜ"U–s–'ýrØ–A5ÞO&m`Ñ#‚?*¥WŽgjºuªØèqÏÖ@{#´'yé¥!kn[ÿ Ãv›èŒ°{*àÉ ƒãÊþvÒîÎÎ?ï—¾uÜÿÌgÞÜY÷ô–v``÷:xê^ºxðŸ†Ñ1ÆY?9¾ýkÜ\iÿ»q*ôÏ8ãŒ3Î8ãÛãcŽù½;àìWq*Ü\êYîï’=Š.õ—/èÛQ”N^‰±E˹¼Z¼—ɾà”ð¹Ï‚O\tùLÔÕî'†úÖï4®v¿öÄs »Óu …¢È|ÚXq\Ó ,€íÌÀ͵»Åë:6^ie©Ôù×|J/± Ty #Ós!VÖ ^ºsûFGwó%Nl³ Ö2Ü–CF® –p= ¡2òB°É˜e½ôÒÄ›y åGðBXÂR“/‰é¸a®ùµù‹h€¹¿$QÃuŒÕsûúñôƒ3 6£öøð²&îãÕÉÅàæ ôð«"ጠÇÇO”ôü>TùW<ÀhøŽ° àI„$«½õZÙÔûðËòC~ˆß\ ‡ïŒZªÙ÷i麹n`ÝYx‹œ3^Àúî(°ïAÀˆ=âì¡£…Lx«Âéõ‡ˆ¶+®”«ã¥©!ß;Ðìeû—<‘Yº:¬ˆ0ÓrnCÒggay*²Ç¼¶Wn¢Ì2n¨÷/füwNˆ´m¯Ï O`@dJXVÅ|ˆ/_â­•´OJ còÀ¯}Ã>?DåüT:LáЮWÌ~—ì:ö°âš¯zàKÑ/V'íz-nð…. õ?0½ÕÏ%¶ÈŸìi^kè89€3Î8ãŒ3ÎøÞøÈ~¶¢‹Ð¯Šð™~ĕבʳÄâêá ±„0ð–z ~„ÈÊ’[e6ýʲˆø]:xP\íåó"¥±üG öiZÔ¦@Ÿ¦¾ ¿â®@#Px6²{N}Ñ”@¢E6f, Óü^co- ƒe~T±eÅUuÍ|e|zPºKMiQû7¢–wУŽ\ðA×b‘¦jIŤ©ÀpPs}=‰aRyUwÀÞË]”K‹ »K4Ôˆ…ÒY!ëÂ:mŠ£i»]y±Õµ…¥zûLUyµÒܤ»t!Šº¤2­âûókýs{KÓ7)¹'Þ†´Ì©òšú[èn²w;öÆŽ–%E{Qâq˜­yu Ë7ø)R~ëGÑÀuÃ}*·Nâ­=‹ØZQÉâÒ¼ f°>5õû}™½hŸcýçuÜðýIø¢Ý„#¿V±ä”b-} âá›p_’ž¨žütîöR›ÈÔCе$®Ä<æÕõãK/Ü?¥1÷Ø´ñ5?U}Ši Ùh䉒ÞÜÌúÕ—ãA(:ù^HœôRÞôe™÷æzüä¥,)øå䋸wn³,ÎÆž *°§ög˜š¸LÙ½òH°QiyõfÕl€ Bß2‘ÎhÄÀ‚}zÂwš)M™‚œ$c¶ Ktþ›ñ·ê´øt)±=Ú´}ÆgœqÆgüsã£óxÒv¸  ˆ JÁ>x},ù´¢cæ=ÔpGžœTe2½ï2ÊzÔGÚæ\‘6da¯”£ŽT1{°l~Á–ZÁ÷0wT #!aï"'‘ÜQš@úz¸!ªÉM†¢¦š×ƒ;lR8\F†œ;ͦ W Ï—%§ ÕiÓ±é²AÒ ´tÌÄ蟛•ÂòŸLmþÚ,ÛÛ–ŽBå>`ãÖDµ È×oò\ùä~ÎÑc1!˜b‘4GâPKþi¹ZÖ§eê·¶ÜuzÁVôNÝ?Ñ—:†4dó¾åv "O4.‰rf ;Ãç *±ë<ÚYŠ=¬®U‡•Aƒµ Nõž (ûýNa‡§<„u®«¼¢UÉIJ¼¥°æé¬izqØtidMáø?ädw„1†¦1ªÌhª–Œyq­½„€Üš[ÑÎæ’4Œ›ÕñKüî&<éŠ!Rz .TŸ€±*sœVÒ‰Ûê³À ‚^û!VÂàp`}H«7¾‡5¢ÒgöIXn(±ì”;äTgÓ½V”Ä[HSÌÀwr‘ ÍwääFÃæH‚²ó–MlcK 9‰x= \Zo/¢×G{çÑe×ú£r½ø‡Añ~‰c׿óçŽ×DßøEOôGŽ#rpÆgœqÆß5,Üq"|Õ3Ÿ³×}Å )>dë4[…P×9s-›5ùäÈôýÇ}•ÏòkÞ}'2Gj…çÄåú:š]¿¡Ù6z]£nWûŒr“ÃmVì™»™&üB©¦¢ÜI“ÜNÆôƒ—ê™*oWA‚o€0ÿÇé-8ãŒ3Î8ãÏ.¶Bµv¢î K (…Fél…±%þñQÍBŠíþÎÈyý…F]²VþÉú<ú°¢HŒ&švj]ˆò€•ú¡ Ó»DŒ95Îâ½s†Àˆ«Níkž¿Sp‘‚=4q&4#S‹7©fŽÕˆÛÖI EB‹‚±'âÈ’Áw0Wö˜ã>×έ,-™ÆÄ¢‘ ‘6hü $K!ìÖ±[©÷Ü.*OvÇ/€º´®Tb·ÀN0wqà0Þ¯þ¶ƒôè† Ûœ%œ¶(è‘Ä@ÐAl±sK¤7ÞV°×¥»¢ñaÜ(avV®çª|Ë«BÅ€PPæŒYûÊ» õ*õ?ÈCëÌÝp6Ä­²Äó!r.Á•öÑKƒ"@ðÙØ„þûþ÷Ì›äo[•ê «š£§n8µnH*%|Uhâ\…e+ 4¸3ĉ\20 -\us²«DTpq:Â[ÉãÇŒ}2Dª°˜1bÁ 8HÇ9£RIµòƾ¡×Ƭ2"`·»2N/•œ!Œ+”íÑN›d=RŽž6aÍ_¿Öñ|Tvµ§¤ðG3ÕÄ3WMÆ¿’‰+:ÄáÒÇ®xè5“(–s•uìCꩈÐw|ÕÜgµ?èÅ·»ôL¸%~˲x¸<ž¨BaDŠG–¶KΗýÕh§Ž±ì;*á™Ê#l )Ê äÇAám¿èÑó„ö´GdnžÔìS¾–9á0{õ8î x6-ó”±àâcÄ•@è5ü1K:":Iõ`uC ¬5©³¾])ú¢Á;-‰¢$r@‡ŠÊÍx÷›:Rõò±€«Ò.WÁ{i¨û*ˆ[jiÉe{¡—‹×Êâ &ùë,K€ ˆ3v$\9þ¯Ô‹4 Ô©èä¯n%P)[]Ô÷׫‚¤H½1X,ÙÙ¦¯›N°ü»Ž^ôiÔújÓ²LT‡FSÝõ`Ed,Ì~×eN¿‹ÅB1—®WfrËÏøÇI±œqÆgœqF‚I¶.$:±Æ½æ((j•NN*G@ÀÇxùœëúÏÏë® Ð½&°Þ¿S¸‚PXËý“Â&5]Ä"Sdp*ùïQ°6 JqÝP¡ÓEéOê®K}õ- å«Ùyw»oÖúÕYï½Ùe¬‹¤Áñ» Ø~*.C]³’tËCÌÊeQø¾¬o~gáuÁ€VåÛU MÒÄù`'MYY¼›Ia¾É2L°lOyl°lÏ;ƒÔlæ¡ ¦ÔåURoö- Ú{yH¢³Gµ«Ïþ-c+4Ï&7Ìý…'vï\"r{Ãlô·„QÈv€ß²‡¹¹¡¹kZSÊêÌ!ë-[mcSñZš¥¸úsÃ.*-ð§Å+x×"Ãs ¢ÖÈØ$»V;ƒ6¦ ‡OsÞŸW˜õܯÒ2À]ªìæ,—1|z8Na/FÉYt”²$==æj/:/%Y†j³¸:d¦_ËÞuMÌ\ñif?œ™¯ _°ñVƃES¶ ’ ¦X ­s$P"–Eÿ»<Ê•Â0®5ÃÖä }Ý•Iê 2 ²Ìõ_Ÿù¥©ä†³½:eÒÃn¶2ZLßÊT¥ʪVˆUz*Ú,–Æ,¬(ã’µg)^ M´ÿ@!6ŸÕaóHýoþùÞŸ1¾7'mpÆgœqÆ<>º ˜ÖO]0ïÏÏA7lqbF8É 1×”‹eaaêBoùÀ¢)õöž£ÿòA ûaHœ¨” c¨Ù*n¡/¥Ù(lÜq‘|eœœD?yl>,ùt†h…ý0Gh‰µiDRè‹=µÞXAÏùªtç‰1]ø#PR函"GŒâbZ-s›+þPÃq½/Ë`zˆmO<ÃBÊ|b,æK]ïâ»O¥vŸE’¹Ã”SïOæ¿£Ág`{’ƒ¶ ð¸Õ )ÆÕÒ)@m"ô€’#ñ}*ƒLÅô°].ÊUË›¬¶•XFeÂLÉ'|¡Ÿôˆá¤(k-d¢WâÂ<´ï®[-=¤¬0O:¿èÓÏRDó/t ÐG'åJ ûU†cú¦»©LDêЂ=á%žõ¼D–YJ· º·®8ú*i)ëL(æe®qõþþý¿Ô­gÝ®táììShAÑ«ú#µð‚;ˆËü »bocÉíéJYÐkS õ/ÅæyŸ†‰2Úr”°—RÚò7͸šË-©Pà—šˆ2¤, Gø{W ~è€@‡\×÷¤¾+@}tIîŽ÷¿uaVY¦Nf ©sLöŒ3Î8ãŒ3Î8ãçLJ¯í{AÂ&8«$6^ª€«l=YüÈx«W¼ú…û¸ÈjФ¯‡b ‰H °¶ØOè§ÿ)f§v¿ºg&Ù¬Úh~Ëúó ŸÚü´2½ W[$N½)SV ¶âN.â =…7›âÖðÿ¾ž„+Kí\‹’€a/ eá°Ò.“ª§w„Åt ”&¾\—ßžð JpxU—/4 ÃGs•òïC!U`$G‚¨ÕI`ˆÒxá«SYä%,”¯ !†æúUŒMN"ï+q1¯tbSŽŠΛËâA=øƒ¾øècˆè¡_6@Ó\E]»=°QµðÈR¹Z’S:‹N¬~ÙšM6V&ëôêeó_ßì*CÙ”} Ý“Î\Fá%ZüD*ص߭ޚoãÃðe ÓÐê9±åÓŽëJà“&ðp<áÉv(/ÝV¬SƒËf¬Âi¶Tqh— ·?œáÓä<¨ãjôÎw]×XTsÕœÔzàuêÖË6ñ'ʱäÊõ¤òÌí7IHœ¬É÷ÆI8qÆÏpŠc‹Ïø­ÆG.£a®Éòðº½9¤WwWõF†q¢©€¹üc†R:è¬üIî5J Bã*«ŸŠ\Èi žañG)í±Á¯9yõw.qÛY‹ÕÞz¶Äp¹a§(>ÿí®ÉYîx4šÅPèzë*úš“ÄàU(øX¸ò[‚Rdäv÷¥Ç;é„TGÆ6$àÔ¤ßF3®¶Ñ¶…æEµŒUnŠÂÔemX°™!<-$–yȈ%uû²øÎ+ZKHD:|Óa§y@?ó³xµÇâ­+Î÷ÌP{»/‹}Ý›®lœ{®Ô–†'š([Æù1›‹Æf²[6&xÌu$1äÙ2 >ìG¤]à ¯Â®wŠ=@ª¿™À“¶§Tø¤;»)ˆ’Ì ´â ƒÓÌŽ%=ˆ6æTh‡Tîè¹.ĨÜÃNV½w6Òü³ÓŒ‰BО Ñ'>Y™ÍU9¿¤k£2 ùdy-ô]ºÝ-{P_ âàö*LÍ.•Bæeî8ÆÖ‘½4•ûÚ‚§ÿZvC¦äòù’ÖjJ5I¨}©«äë’‹dÅki5ú“îÉjz|d©a%3ö«X€U\M„ÿ(ÖÿŸE„þ¨ê`ngœqƯüé/«tÆc|ø8 UÁR‚®Ã ³CE²úð¸òáÌý²Á­5ƒ,®Õ:‚‰ˆÁc†Š¼DÛ"°JlBlt€‹c0Áô::^ŠÏô– :”yâk‚^9Z4 Y*Í›ãLŠ ùbÓj©¢˜08§¯;Ú²à))ÍvÒ-G- !~¼âVÒë? ¨†ë{¥pIw‹½ã*E³ë£6¬†ÅòCàp—,ó¶u’rÊty6ƒ‘°~V&)‘¿ÀbP-$ð0“Z<,¹LvȦ• KÛ&n{E…qMÍàüZɾílÛµB„z3¶‚ ¯KþÉ3Î8ãŒ3þòÁ'§ÚÎïüFdgüÑãƒMQ*{6^Ym*Éù¦Ëèš:-‰ 5’[LÛmø…bùø,¼Û™xEø°‚nJëä@} ˆl0’ü7Ï0D}´õ7kh&l‰XÔf‘Kÿü‘/"vðÔc4¸*æAAínÐDÙQ¤ö:öÛ¶ÆmàÔN žâ|aì§™j¥µ¸_¦î´àhƒÞý³öÛhKßo J‘óDïwwÉF@Mq…¼ïf)d ÜÀ•·KìðPvûsõ~ ÞûbIóÉ øÂ¸äwe"qÓ4P¿ÄÙ+§Å‘>~;%¡ÑÒG_­l-ùÏNw…ûì!ÅîДЌ>q¨(ã“ñd»<¯E•hâ¬á.¼:L¹‘"Å\Ls(©N ú1QöËñÜJ˜|B6µD5Òaq`¤†Ó¦GZ“øtŠ2VÄ¥¡^¥—›’ET‹~åw-7¬A¢8ãÁY×Xbaˆ)˪T,†¨Züh æŒ3Î8ãïû|ç 9ã÷Œ Î`=B1c@IFÔÌ…mQ‰Ëû‘ïÆçO÷¹×õ?Q »dZá!¥‡¢ÌÝÍPÄŸ ¼q±=g]»éƒQxÇK¹n´9¢”²2bˆPžz%Òíñ›Éef[]·;-AQ‰Ç:Ù½­° ¡ê$”}ÌØ@êµß%Í©1 ÁäË­ã£ë3€ÚÓ1çÔ'MjCÜÈöêºmØüZÕáZß–•xÃ*Æöâ‹?E48ºCŠs”Œ.d  ðý@ï<Õû 'd7C ‹¥²ª&‘jyÒv×jþ#"¶ž„<Í}ÓEGýãï·²2E›ÓUs[7{?ïnòûÝ®EWãÓ]°m®¸ð¸".ã`µ¥¼¡;v§ƒ:óÂïðŒ›ÂÕh§fJîîÙ”¢®[lÒÄNÓ³Á¤ÞgIOÑ@¢ IDATnÁÈÛ.ü—Íä—‰wé ^ñ–è´¬T__¿õ*çΪ!•ÈÉàäH£ ºƒ«‚xØÝÆ‹] u4-5³SÚR¿yÚç{þ»V06ä-¾þM{ohƒsüŠ€ó”?R#Þu½t‘;öà4^Oç§cÝ–²Glëu‡%Í­í/®NÍNªIÝ©{Eá®â½_ŽÈÿ‚4ÏÝŸbƒ4IýÝØÁ¬Î8㌿Îð}#f>ãŒßm||5e£¯awž1 œß@{o>››WR›txõ­ŒChY¿X2q“c––Uæ`–Mû*¢gƒ7yÎ÷BLŸôÖ½j Féƒý¢‹µ¢ÖK!O­v½@<ó™ Ñ RçÇ ì%ªê$r˜ä(–4T+?Dõ²Ô‘#/y ó¬Ð×b®ËÃÞIÇ6®KôAب Çz™Ly²Ò¥š“ k5E}‘]VJ°bÔëæ]ßäǼû8à{Ný®/ÚžR sÝ Ða( }n^…‹v+Âå%T0Úé]b(ShÇÆ…°ó¡†Æ:(63vܼ|?Õ °Ã†¹Þ9ñl£oÙûÕÎ1T–ks=RÉVú{–V±³‘­PÝ# ¯¢«½-í;‰‹²n#, uX<էáޜáUCOõ(|°j®=ú‰G{ Ï“KykG~MzÏN>jç‘QôŸPûô]t B·™ï©e?'ˆþ@ÊÍ×ûÊ-¿ÁB£ÏÖJþð9'>=ËwÈ"A‘V¾Gÿk×ÇÅ-ƒ®î›™R,»"I!LI_„«¯Ldhhc¼ _ €õVÕ?iW²Üáš›“QÏ„³Ò4ûçû÷þ9Wáüܽñ=Îo…øëŒ3ÎøëÆ1|güéãÃ> ¯)fG¸Äð½CFe3jÒÏ.þä»÷å" ðö}iÛ\S=ìàÖ ƒR6QâJ·ë£— ^Â8 !©Ä]t)ïhÓqhÞ—H¸cšùRžÃWŒp¿Qe\šñÛ*C:é¼(ìB{*ôj¿P].«È%.4ù/s^È'0½&côdî×eãZg2 E9vh;5í¶ÀØâu7ÏÕCÃËÁ`RíRJ4ýȆãÙ@\Nõ øãÒ"O…/¼XnË„]²ÝÏèÅNeF…id|èìk;-`z9ÃäpÔ¬wÅXâºÙ5Ö¸ûñZîÚJUozœüž%Ÿþ¾oßxG¿ ­³ÈÒ\Ä>ضüÕJ¼OµÏ²ÙÙ ÕÜh»?.ŸãÍLòùvÀÖÎ@VÔªj ”:hï¤U†ºÛÎD2ï·å™…ÐïŽZg<[:ì”Õ™³×õw7%¤©)ç2 Ͼ!¤‚0²:¦Q[-•¤"4§“•£ó÷̾šN»ž©}º»ýñÏ_‹ "¯gºÃ÷n…DP!‚eo d xÿï,)•ö¯Gð©úKÁØ{buoçd6†UíÜï}ù¯{×êR~$TëÿQúêÇ©o ÅÆRý±Rþ &ºÙhk— ½†óÂ#nŠý±w~áÁ óÇŽ¿$ÃqÆgœñì8ãŒ?b|€ö# £}„¨²óIÇ‘-¥dM7¿b†Î¥ p¡«ö^;C oh<›BÔ6`XÅä” A?YÊÓä ¦ÔŠþ{\ ω­šÄçzùÔŠÁ…¤¢!O{…Þ¤ë/¢•ªÙ[Hu&±5êšJ¸R)³¬ [aÀ¬0©xXÛàŒr?°ƒÀWp^QóÒ¢³¦f?çªåê‹Ùè!– *ƒ²¤HF…r̵_ >ãV¿ÝxjX™p'*×Tާþ}ŠE(ïv&·á*îJ÷V©èß8ã6 xIJ5\½Øâ'X˜X2¦_ð®ªs_ª‹çÔ¦µË¾GÖÁîôá ¦ÔÜp% ÌXb¾Þí·ÜWöÇ ¶gmM®7õê@Ãá"Ð_ZV6‚7´17²±Ã z…á ®5WGÌaLÕÞÌZW撥ɲvªe„Žù_;§bXwi¹ÚõxH®ÅHXt³Ï¬APfrEzf±&æõƯs#kaÂIE,×_s{b,OÞÂÔžç УÞ+è‡ô-¤;a/õFö“ɘ ïªþ»öY&Ekï!PAÌ>s5Ñ }ª‰eò‹*g×k‹&JBÐ^²Q©˜uSëÈdž®EIh~Ç:ŹAåôÝ-Ê\bX…Z9ê[XͰvÆgœ±é{wÆ_6>¾"ÌÏ/1($8‡#Åv,кIº©èh“H&b¤ÍضÿÎ $4­ó[—ü-€ªILUº(ÅD½qÐj¢îA‘›ÃPÏwËêÄw‘ˆÊXt±G˜»2Þ–è#ý0Û«±áQiïë;ßñõ+»&Jßš…×Ò;JÙÝêyH•Ñ©ÆÙó´2ˆãM”ÍЛVk¥79Äe´LÅñe+´qxËû²Ïrý0/õ©P1‰p*£× ÕpÛPè!!6×M_Pð“ʼn}cûý–—UÙX‹©µ$If<ˆvÏ3ïŒìË¡„fAG—;70Ã1Ìæýûñ.mÿpã×ÙL[;'†ßƒ„R–<Øâ‰º"Ù,þЗÆ{5K¹·Uò·aF‹¾ãŽÃÈFm£ wˆÜ73íq×LW50 !ÖJcˆŸ„CZ7¤ŒM©¸³Aýnæ(d‡ÄÌ>-ª¯¶âP>Š'†ãݽP2´,ÀS¾0l% ¸¸êdŽ ”SÁÏp7?•½Ã XVÚÝèÉ[r+[°D‡ÙÖ³×·œI†f k\ÙÛÿ½dìA‰Ì6T–QÎK[råyXuë¶s‚¼­¦#{9˜ù´2׌b-ŸOûÙ47¬ý³û\Fó!Õà5ìC” ·¦Âiôw?Óï;pr(gœqÆß0úÆ_9>,¡0’DA…R@’ÿ tî ú‰±JÛìWC. Ë9ØDí¾0ES]S*îó<ðYWdKíÖÖÔ%¬|â va µ\o²ÛÝß·´ï*¦0s}lLá÷}Õ%(q“Aõõ0W?kJ ÷ŸdQꎤchR !=×uÇf™RÀü6ÕÇ@OQ×Â3R6u½]l±•}é¢Om¡X\¨’—e "§Á;£™§‹™É9!ØNÜÝUÞíDªÖVәܲmQêІÛ`@M‘2Ò 'jô -ÃnËuÖõ¹ è44Ì06Í¿,ey·vq@8á$\[Úª NŒ¦2kϬ4b%ï à7ÖpóiX(+IçÔx·ÄÞyŒËÙ*DGK–å@EÞCO@4bx´F\'¹¥¥„†g¬­ EµnêKa=¶Ô!êÛÎüýW-ô‹€>OlÔ²º ±¹â«2Q·ÎÒPhï|ÒÅõäç$ºÛ×Bìó+Kç\3Y9 °—Ù'ï#éú•V±Á÷¿¶éx,Ý,å°nÉ)(o*uùæTƒoEÜ+uÿp˜çv§¡ä„ª`Ælë–MNT (!RóM´Ì?»V—";›ýn­–§rb «]âNü%&öŽ¥¿r ä žqƱtgœñGŽ k2ZÃ~둾h:_1¨KEµ^ßEÈ7 ‹RJCW+dw»@¹Ëð`ìÈ|DüfÒbIGÓJ‰Jä72 °1¶D á4@Ʀ¢‘n"½fXä_öDCØ€º0‘ê˜ •5…‰Û¼c ˜¡"iË®ŸbñK4/=&§)bÖ%ÃÝVl®‹\ˆ2ÆÝ>TòÏ›iw‰`NzØ:J"‡òp£–=†¯‚?ºkt€ 3eÅ3-¢6(ÈfÕxœbH¨‚Ç.`»sX €É¨Î¨}¦üR·µÞ«=÷ ãÖì}ÿƒëÝ@Í€”~…Me&÷)héP_k+ ê¬ëªCÒ˜ÁºB=?£ [×ç~FÛPžL·ïÄÕSú›ýœÔ\å*e± !åûÝÚ¼Ð>;®¬@së_°¥{þ ëÇ«ÔM#ÜÅcÓèÁ¢Sõ@ÿR-3¯;Ò+Ê2Ú1®¿+ú¿XJ87‘ѳ1õwù?]CnÄ6ç°ë“5øÔo-}7ã¹ÍYÒµÈÓå³Íhrécô¦#Ëh5ÕµS‡¼ä”/UIë¹æ.¦¹óþ• Œ\[Ãêk™ÖÚIt—e(‡=7zˆÜ*ÀÇîþÎ º(a”¢IHWÿÐÎÇM‘êÈzÂé•®¶éÅþr¼èDÃÀÆgœqÆß:>¼÷ k#ŸÖëù¼ÃæÝótt¸qê›Þ+úrŒi»*äª_.DDСKÑ,³Â§õ4âu‚2.¿!ðHô®øû¶_¦áNBi©)aÒT²ºŒwê6ºZC‹Ígìź€¸®Ç7×â¡;[iCìÃî/ó“ÆtEÛ¡Bñ˜×«\³îªÚ·5’‰jF~¹#æ(ûƒ&aãØ“‰ÉŸ_àªc¦vXÄW ´ZŠË)®„in=@>ûHÓo¦“ ñ£(ÀŒúe©nÒ¨,~sy^¬L Iûa¢Á¤¦]oS×Z½ÕÛÁF*ÚƒM60¨ð{wÌ  1¾Á¥’|ò¹l8 3@ 5Ð3€ÍŸmu嬦‚Ÿý-ñ3&#aŽÅ¦·Æn//eÆÙ'ï´lB5x]~øY}‘û-RÂvûè'UVehY»ŒöWçÃ"„2¹øð>ÝYÖL*'9¨$Àk=•<Sf8Y}T0èè\ W¬GC¿)f¶žkKŸ½¶íí,¹yÖ]¤{?tûŠr´ï.‡Ír5Ýc€8ÙÅýî§Ê°vb³µÎhîSHx†ì;ƒÉÞp´fºÈoc¶xtB!o}cªÿâñgÎÓAÿÏ8ãŒ3Îø[LJÅ"#OmÎ@ëåú DKM&Mª¾gƒ ”ÚïT§“–\–2:µ4L -)N '$Í •ö…Ä•OWâ§Y;fµÆZ•\éF%_£#:â&ôWLµH(Œ•@|«ØBÔ-J³#þ+à˜X­†kv¥ñžZ}Y¿Ó¡H¿æþô»"Ô3B6µüª’ûá«lèNäã2«À>˜`ƒyÙb•©cyû’Zy©1!V•ãHÝ–a&°žÓJ¿•«qרZ|éégs.ªÐG¬ã¹X}›#Šçê&¶ª¤KómÏíIG>~s£0gÙ,Ä.«ñÈ0S¯æúÿ¡•|ÓÞ|ƒ¾(W%ÞÿnЛvħe=ÏöL–i9hï‚&ÊöÍ¡ÿ¡4ÛõÞ‰Óê:|ùng„¨tÎÚ'ÐÌ{ê&îj†·÷¢ýwyìXrˆ§6D¸©ðVR±ãNcÇîŠL’ÊäãdÝ®Dy¡S“À!šus/˜Ë²¶Ã ®‹â~ƒ±u¦D8TÓDK÷¯ÅÜcNA—jý`mzƒdÇ•ƒ±â“#zÑKåÀB9ˆ§<5²ëÓ`dsŽÇ1S ‘Žº*ÆH®¬‰mÄÜ¡ÌJ§e'jP.¬V½Z™g“‘|Ñê[©;S·íbKŽEþ‰ÏC,×|â~¯|–]¨—E;ø5çÚ/<.ÿW ôaü?ãŒ3Î8㌿g|h@¥ë½õUK¥ _tL;BÌT •&).‡øƒŒ@ÈU¤ÆœråÙÏèg+o{å ‚|QóH!Ê‘?ê5u(¸fc—¾dáÆ½8(2™ B—­J‚ ‹1Ma^ïÅ4±C7=ÌXb-ÿgW ÉUÊŠï{âÙfЀï‡ô¼eyZGÄд)9 »/B!Ø :5$1CÝz¨Ù ‹`± ð,Al5Ãçk6aAÑ1pIu ~¯ +”{—ª‚žpwò JS]ãמï%!Ô¨ä=øÀ£ÿØÓ'¯=v© þ;¢Ä»¢#üŽ’!±w´?òmEU€©‚‘!dCaþiÌkë=Cå,óþ¢ÂîÄÆo–‡”™œ¸/™[Žõ% âϘîÚ„Ø|²¡ýÌì@äo†yJ-ŒnªåÍ‘;µ;«×& 5G?]›ÒaÉ}O«*ã,w8ðsšîÙL)îÄ}:r|¾?•%â†+ÖÕꢖÇOJOz^ÇgÇÉ<í [*§²Ái;íÅÍíQ Æï*ä~¢ejü> Ý7À¡9ýñß+ÇÿúêÜ(!8ãŒ3Î8ãŒ3~÷ñá  ¢Ì Ñã@FÐÔá³ VïÆ»£ öÜ'2;¶CF¾š¦ õÅ¿OlžIœE5«›Å”(p‰ï}…Z,.ª¥|ƒËž˜m&úgk´½^t#𪘇 hŒ „©Š:Á&$‡® œTgwtÛàȯ ‹—sòiG—L°4©ŸEÐx¨lÅU·þ>çpt#:aüºWfúWʬbš^w–öí—:ǧ 5K>!‹ž(}Àl‚KÍ즿eÚï.Úo3Uc>F7ÄXPÑ´&ËÐqƒÒ£¯wT*¬#_ò¡cæOq†ùJ³ŠóÁïtâÚøì­\¨ë;¥ØIÄl"#!Â~™bäÙ—Oúiy—mMZÁÅ®O\%ªtIvçNiÁ©p5Ï£4´ƒ°¯ÖIC¡0髼]0˜’q®OíH³E¶2Ù·›wÙ’tì.¡I1±Š1_"÷†zSk´©nÞÿ¤Ñì“ö37lh@k&iO¬æjý£s¢¡ƒ‰5`MÁÆ]k‚]ö“ÔF–×·õ¹Ÿív*©íÚÂé‚ æÃzÒ–™ ‘§v»#{¿PW7Ÿ÷²\€´Ð5ø ¡òHaÊfcÎ%#ÚtG…°à·tGÒbvû´í£X÷óqp„G7™MÖó5üÿFzîïgœqÆ¿™™=ÖìŒ3~ŒËƒ‡¬À‚!X|nX)$G A< qoD¨ ð¡¥.¯Ð95—¤*ÚÄJ’Òêç ®ƒú\ B|idJT˜x×ãÝ?ïr{# \ ö‰ï9†W{þ”5駈‹ÈC8úD¹áG^ª”ñ4ÑÚ/ûë¯o!ªÑ²‡­Ã|W²iÑä*r©è¡¿Ÿ8å&ÎeÕãàEÕº7;4 `’úþý$qÌça c¿N¢xjAW9Û"¹Q®Õ¼Sq4»DDV®§3A–X,J«p5j4*ž— *‰n ±î‘ŽJ%Ù(Þ»¦Â%Kûan{ºTf¥Ùæ&–‡[N–EJÚÌ*~ÓN0Ù~Á/ëÏÛÄLkB.îk°> Î÷®iÕ7úçH­ì¢£dýÏÝgmF‡0€IZ$GÃÂHS¹P¼ŒùдNJìK£W-Rg„&‰x‰¨ƒ¹CŸ*¸þbBƒz•Þ zÞ!ÇYt天ֹw-È»°ïCþ_MWEt2‚ÿPñæcCs9¿²„Ü.Ð…äjk5±2µI]œ‰jI@{n²¬ç]ï%6þŠc«Ô÷hoJ™ÙTEñÀŸŠ4ƒ€²3¼u¿¥ÀÆÍ½i™ä0¸Ðsde['×ÂÉüVU8¬m÷”窈âøj02B|è%þBìé7ž)ÐgœqÆgü©ã#7ºR8âT±=\˜ *. k#máÕqrËØ{´“§èÊá‰BíZ†NÎ#±x}:r„„\¥<›Úí×õÅŠþ+òÖP•ù0S×Pi Y°S0';ÌP¨ºvwÃmùåÚfÌÅ÷5dMÁI*1 }-Ud¸áÿ©iƒ^œ¢¦ÇM§}Ógjü&Xnü¿îá€Ø‡Ø¬a[j¬êˆ جAäÉ1·³ª‘$ ÏrªzNši©°•‘„kï`¼ÄT€Ìð³š? M.ªçµ¨Å숬ê¾rý4Œ!«:s/ô‹ÁÃŽ,©”Gë?QÌm1´Q–²#»¶·ßêþQd!ÐgoÑ0 ÌJUtýжÎV|8@>qÌÕ°ßFxè@ÔØJ†l¡e¶‚› .Tš#Çž‘ÌW"\úZ`è'6n¡‹Âûl‰ÉŸ®ÙQ-à:Ù+=# ¨š^P¥5µ‹Eæù†~K!¦PކåÙÚ÷ ¡k‹ü±Ÿ¹„:+¡ù輬tûòÙŸÇõâl×¾"r®‹Í9Ž ã7±Øíõm˜µ.Jçí<òSÒ.~šóË )ÊØàêYPÌõ÷N?Ú/&0—)’¯rºxóK\ RÇD,´B¯>ƒÊà#:uMzé~Yc“ ±¹Þ2#ýEèk3_P}0s\ŠÈËÑ•RJ:¬Ò¶…à0Sð·’•h7 ¹EãP­Õ!…M­®€ÔŒeGIÌiüEAjhÎøÆOJ_Ä•\$¬ïr°€bBäƒA/·½3Â[é’ž«Ôj²ÚÀgõ0Ü¥Û¿ìž±îz6ÏKÅò·©aPîmQ6ºGˆÕ ·¸änŠÓE 7ráu¤ÓÐÊ4{Õî=•• <:6ûèšÝF(£zhäyO3<Âq$U s{ÒâF6ˆböj‘Rf%3ﻨ.,€kJà]"jPc,‚Öò$jCÞœõ±Ì0`pî>ïyŽ¥Ü×%tÓ•wZ,@‰¤JNå§‹Þéfp…GIÅñSpÏ{¿7ÅŸK˜Þ$¶õô¹~æ‹rxÄ?k" VgM¬!ðN؃ªÛf6=þe!BuØŽÔY¨ðÙ@hžj&Ò.Jêp›{¼$ÝJÃ_tÛCY´rÄ#.]Ü{Ê“ù hÿ ÅN¤¶RÛB»Õ}8&2tŸà§³ÆÌ—4Ñj‰åf—„ëQðÉ_Ó’=·€4°ÝTì,ñÚ}·ÉëBT3¿ 9U,ÒÅ:å¡¥(:Û½ÃÍ^Žs™:h7y7ÈU˜Â!ª½q¤Š™òfQ$Ö¶®ƒ…%ÉØlM“\ü¯\c\Hÿ… ÷¢3þ€òäÎ8ãŒ3ÎøGÇ-ê=&Jn,µÈ›èÂ/€ÓÒÌ4.Fõú*Úå]™6pµlHT¹J»­’ç Ê—©¼ ¢™:æ㮼ۈ kƒ¬ƒµ…EÕí–µä,@O’÷LêæŸ…F6þ‡¡©Œ«¤/Z: vb’%öAŒÀ|•5o «$ڜ¸$bÉ*¿á×á†×•ú[`fËPÌ5iìV¨ÆpK; È,YŸ›N×+š²˜©Ùf=GZ¥ÓZÅj»AÏŸŠï+)—À5¼°HŒæ¸YH0„öTš.½j™¿3‹ˆËU¡ÿ×ã¿âÖ ½8Ãý ·g,÷ýJjÉßGƒU‰;¼”ræ Mc“{3›”¾s.‘¯Ž™¤ž@ܰ ­aA¤‚[óŒ+Š¢&B>Ì õµ²Qådi!OS© ÑX¡#¤“óÁ¨öí-J¼Õ™©bNqðP·^Ê=”?41ÄÊ€LÔœ\a÷Š»ßãs]…êI|H|Ï¿MÞ­Q“×Ã…Ž¥¦tiçJNˆÀU{)©´ð¦`ª¬n¦”.›»¢žG”e®Ž+QZâJtÄÃÑBÚˆ6€£#„ÆD3„ yöúv3tSÅõAœ“±W5SÅâ’«05MÕMo÷ÀÊôþ‚´1ÖgÄòdïn›î¥åÄÿz…\Ê%\íˆ3Îø³Ï8ã—£j~Æ~|üÀQ€Ì1Ž"fZêTJ–ïŽÉòÏ6¦«UœCä_½ó(øé‹õ¨1µÔòÏ&$ ­¾•¾ÆóAT³Vu2“ÕF= –B>4¤(Q­ 9Õ¹€°åÚV&jQŒ>‹ÖT°Ù>µõü¿“•ÄÄ©©Dô¯~à7ïú¯cPË¢‚µ˜l Ô’wÔY>”z #†²¿&͆šá-_‡‹žBQ—5u]D& ËEúWO³Ð–» ðe³ì&¼†u@0Â¥V²VíÞ‰ Ý\ªo¥¶h.Ø´¤Þ#Ô» ~cúêF%¨óLþ—*@,j`«Š2ã–±˜Ÿ¶$8¬&#ã<Õwð),2aú¥_˜ ™ ’*{LÙÛŸŠ*ÑŠ‘ CÉ;;›K~ê-›á_%¥DvÒ§…ØÍ˜¹lŸQaS•á&•Ì€?Ù0S9Ün[ðð<`L>U寙 .Épè\©+ËøIG\CAN(õŠÍŠ&…1Ýâª5_ó‰ÚLºgˆçËhQÃŽ­cA¨iR´¾r‚n¿Î…®æ“Æ¢‡Ü¹ë¾z}²rµ &T­U-À¶…Ìš×±6Xcá?ª#ñŒTn]G²ô¨ZøxÍûLÄ}„1Œ ¸¾Jj6Qj¨tavâ’þñ—ƒ1sÊìðtÁšÍˆElœl¹IJ{Ægœñ»c´Ï8ãúÑOW0B@6n?qö§£»Æmh²ã>¨(&0‚oéΫ۔®Å¾éBØw"c„‹À¡ëb4¦\;âY<ÔÏt¶ŒUêäÔ„ÛÂŽì '„Xt~e1‚ZðÙ“‹À _=G|'¨(ÇÈŠ NÌÁ§æ ñC²:Il»j&Td賋‘´±zé§(еä÷×= ¨9•í×jî”» œjfuMÜñ,ZàµÈ¤íÌÙˆi:¢ÌÀ•CeC|o–uDüª—È[ž!¢\ô¡·"ºiÓ¨21¥¯('!ú^" sƒ«‹Ê°Ul ãßTÐíh‰ØY„L§ào2¨ïJBsþ”LýÔ¾SL7°­®J@îf9ïýw‡E$® µb?ëÞT_ʾ ‡|½3šÜ¡u‹å\@|@Œ«qr€Ê1Ú–öòUðéÒéI­tQ0ÏHßõ¦©ßÃfâð1u.¢¦rxt¾h% o‹µ}·'fl8Nòñs9ïy3Ó¼g4•}Ÿq¯Þ†rúžû–Bæ>&ä´Êör wò|¬U3î°i>Å¡¼8›¨šw@£'xOÑè6·G ‚¸Bž9FvP¶Î³¾?Þþ»K»6‹õïõ4nßÈ099£Þo"‰•¥ëtCž4’b¯m@WY­Né?~ðw»ÛƒžqÆï>Î.>ã ?>ðeûúÜCᮉ šã}À¯SýÚ,¦*ö3Û?~š}ÒìÓð#d‚{tUúèA³´ã¨MúÉÅG‡§ö–ö(•6Ô–º¯¶Êi2w ÏN%XÆH[ GÍ<Ô¾™ d nÎýðÉZ°Dk|àVÞ$s) c@¨Ê~Å~…¸hKDÖ ªîTXÛ;î`Œ!=,p¥jgU xÿF-‰MÀ%D,­WרrqëãžÛ¼)®ú5‰ЗÅà>åðuϯ }J0Km[OÓ¡Áèr“²ÈÝ ò=ÈMVµ4É›¯L.-_®;äÕ* ÒC%*sª3h)s—>EYGF Ÿ-ƒ´]¼…7j¶2É<†)ê_?÷w× ¢¸ÔÕ´ ÇMH_³árè§¶ä:ãç«‘ƒÃxv,Žhè¶»CDHÚŠÉ2Ü{ÁJ“Võ6ñ°=Ç1ϳœàxÐóýþtÆêƸš_0Ÿ!T–2V©¾kÞÒF )ae¯Ú»bèT»ºOªÆi~4ÎXfúíÐ;õ {™££Qâ2åïS³Öd;Ð [·\þ›·û¡©üe·b#¬X±•뿟ÏàUb¡u¼…2²xÎ}­;c ‡Eó9Z}Î¥åé`JÙúho¯æíÓš†Ä†%?SÌÕ³l[7Koç®ÒkÛÏ Â'Û_ÑÑC"×—ê#ÿw ãƒ@=ÞÅgœqÆgœqƯ_ €ä3T *–€]­—xWç±zᘢ²Îu"›Ÿÿã*ÿ¡%Àˆ9Ô@ŽîùøR.vóŸ&ÜÒá»ã?vp§Z`k!×FÍÒ_(ßkÝñDƒk÷=­Ì‰œÄ L›”$f|H~ O_Å­ XáÙˆ-x<ËÖUõÌØÍð‰×+à¦Âzq±Ñ—±//5µç gϸ šèz®˜£Ð³'kŒŒÓ+«’A(›B03—磢-zÿ$˜)رѫ`Ê!,­,®Xt¯W‰^fy62;`Ëu††ô_áDiOÜ->KRfNy³xTsõ(T4¹ñäh4'²ZÍdRÖYR·†â²(ïG°ÕIñÉî|¤Ê.‡­d2 索† rqT¦©ëÁCn†[\ŽyômÙñ‚bÛÄÓ¼õM ­,¿˜ŒÅM¢{ü+uÇÉ9¼ÿÍåØ6“–­ §ÊàÎVŒæf8Ù@Ó±ÌÁuœHbw†“D&ÚÆÅïD¾Áf±Ø««¿Åôi Z Ì^î«ú`˃¹py±±WNR%‚âM¯ä½Á£¥\ ƒ’a_ªsRI_cÇ î¥ÍT‡äî¡ ×ŒEFùt†Ne><ŽS†H7F¬ÜÝÄÉ©óÜ|ï<÷%þS•Ý'7pÆgœqÆgü;ã#xCM5 ¿M¢BFB…8‚=¡m 3p!žRÁ‰w¤ÊÄËÿeS¸Œv©Ê…³M"ž–sžîKÒÙŸ„úúÃï[fWгª=%xë¢zA÷T„OÍÁŽ­tdƒÔjÑilf¬…n±˜ˆ¹.éû14{,Yî°viX,™ ½+5}Õp©Œ…eþ3×inÍ r1°86 µš*3‹@ÃχJ_i>ºej¿B·I"æë{ç7ï‹Í.§†à>Þ¦BÇØÌ˜Nd22ø£üT*¬M©…6‹`±(­ëê`L! fÚðÍm !Í8 HÀ.g+É2ÌÄÎlÊPJ0ìÌÐÏÔÎÅcqM”lz‘ ²ôÙýr2æ/òñšCÖlaëÒG \¯X3öŠÌß{1_­9é]h-œ¹¾ß²{Ìdßk_ “?WóþUû_N뢯7ßÝž§¿Dþ7)Ó†,ÝnŠ–$sœTm•f‚M:f=›¡Åt½àð¡½ÞDì0Ø”;ŽÿI—z1nô%,VS{E°gWãô”Ž‘+S&µ„h7‘=÷Ÿ+Ê}ÁÊ=°=»‡ !–^ŸDÃX×øÜD‚âÜ©,/Ρ®î—‹´÷UR0I”Ï/®qô¡Ì¸¿G[gÓ6Ü¡ù¹³ñ—´g|ﵟqÆgœqÆÿôøÈÜÕ#gF|ÿÕË—q(ui8m²O Që‹véÉ"”ùzƒ¶W2\au‚W&Úè éA¥Ì¾­üSTWÑa •5þ¿å¶†®a'Û äŸMÆm”Ы¢ÿû—C8íEêìFZ»Â4É4‚0’c³…öü'M<Ùm ®º2<2>Wa€¹È ü~!^‰ˆeP,*q–eI®<Ótªšç²ÏÃt-§U õí8s§RøiXÖçÀÖºKb‘käÛ#$†‹í-»´åz®’oÔ=ï #ÍzH¥ë¾¿¿¿ÍB¹¶ÐGiJì§î)¬_Ie tL.#UW&{¦l½Uåƒbnh´C¦ï½±\ ȹ’ĬÔ^ˆRí&_h}Ì€&]©éU6ž±3,D=ùñBÈœõ’¿®vÈ)ô1ð¶Ã^öÕeõɰrÖ'3Öôå, ®é\îlZ¾“fm <µ/.þñ&_N°7^—šN·\=Qéi°¢Db7¤Zðê°Fô]/Þ9Ì2È´meÏb®x  « ¿»¾›V_»O•#Ì–ÉÙèv{ϧžq•¿(fñ–~a<îçÍXGS RlÏlpg²³x;ç܃lªK­a©ï4qÍ!ubaÍèÈ6à¸?ûrf“®&`ÎøN [8ÿö¤ìëg1ñ4®MþmNgìÚ®~/°Ú: Î8ãŒ3Î8ãŒ3þ•ñ‘ñFÝP˜ÜË!¢vâÇz®UqC9í|nbrä}ÈʶíÓ×¾‚f—9à6”Ž^”ØÇÿhÚ‡ÙÏ #|S'Ž‘¯¿-î–jÕÔTEðÒuUœ, ixKG°.zù\Þ FϾCš®ø2îkÑJ1c !„œCS¸ÊÕ+¸áÚ•j˜ÀyS¤2¥•úRh¦ÁMŠ:e84Â'ó°±"RÉú–7ê¾×1á{Æj‹*Ëï?»1Ÿ,;…Ï>sï¥wä!ŽJ†ÆO×3ñ©šARÛ4l\ØÐ·f]_J%’¢ìïùäRû-Œ'IÿᜰNk(HDC=(»`ÔŽ ¤…¼çIÄÆ„ŸEž¨eÆ¥Ù˜´œöYR¸,ÔWY»©‡7:*°8AÈ`~…³ÁÑk*ưö%0Ôf,4üAÌ$´6ʳï®ÕuŒàs`›ÍÖtfÈ‚t>ÉÓKÛãV×3þ’qt€Ï8ãŒ3Îø“Æ*˜I!ðCÙ!®œÑµOØsjÞ~'EåN†Ÿp³ÄZ©Òº€0Ýš‚(æ.Aà!-„/A³x·&ÀöÔ®æfç.^¥Æ>…S+Ý,±3-IÞñ¿f{¯2qØno–Πþ*èT.ÍôâÊۿЄOjr¤KÓX#õßòs-u†… Ó±nD2YO*íÙ®ÕýC1'í>õ¼Ì³(œì²ÎŽÖ^’˜‘h‚BRÕVYGš‘¦è^ÃNæ$‡îê/¸Ò‡Š凒p¦)`»»3Bmây Tº¡‚ EWÂú‚ðÎìFË×YuÁg°í+Š3ƉB¼ª3™}ÜÚÅZL’§ŠO,O{eWIM„Þ¸ô’Ñw»¤#;²«Ûö† âªÕlYCm±$Ü“À Z­üWúÁWpGAé4,ãt¥Ï@Xét Ãué±ôLüð‚ì­ÆéT†’|äé&¿ %ìPj`¯QÉ+ÓP!_P‰ϰñà‰tTÅ(ù`O™ãdóŒU§ÐŠâ2±z‹‡ƒê½|SÄK „'m,…†v¥À Ê.U…ÓÙÌNBá£Ý‘äTFšÁÛïܧ$´-j$ØÇÄèÿ_2žAƒ/ŒöIÓ ym¨*Žm ýÎ2àJÒG”‘ØwLΡ¬4ěɫ­:^\A˜ñR´r¶õ«‹ur`ß3ŽdñgœqÆØøX(¨:ê³÷zg‘:AˆŒRTý›?œãW QrÔfÇ´/ée@µ. ø‚ïù™Ýw+¶î €†k$ÌöþM´tÓsQG¾ ›NLT,dñ¼u€]ª°E]JTüŽä}´ÃÍðªdtX׸Ô4] ¤Èp3ox˜  Sé„å]Ó±Áb!vSʾi/^šùµ%9•–co¸±ëAòþ+óåê %ºˆËIr^´2ævã2Žû'~!¤½ Êr‚#Y´j¬ ðþØî—awëóÚY‹H­Ì½™Ö‹Y#ФÂÔrîw.bÎÆï‚ä«Ã»E¹ìÜߌޓJ‡ ’23µXtRb,odåÖS¨›7Ë*>oãR'ÏRùpÈBù æJd*#~–mëÕ}KP‘ÅÍ(Ófé,HëYd©;ùRUâ÷ÓÁ=¦‹ªŸlûiªšïo’ÓïJÇ•K‚HœÕ9r9“äß[Ò.£87«¯Ç„Kb븹îÁ{q¥KÌUóЂehZqïEÎâŠT”ÅçdßCýÊJ&Zx ˆ¾P»½°Èi#M““c%»ï“Í Ý¨|Ìa ú…Ž‚;wÑÍ@û¹S–~·‹1n“~Ûr<‰,ÚÞê r¯ò)énjï}×£»OüA”U¤ßB´Ò™a’s¿Þý;Óü‹ŸýŒ3Î8ãŒ3~£ñQÑô!ÓÓÐH„Ê2ÄH{©Ö]w‚Ht>P!"> áU„W¹ KAbŒ =碽«XœÐTB믞ên…÷í;­Ì}µS »°1±‘ U\ÂSìÃØ§ŠÏ ŒlM`ÅšÐkÈ7úïÛw –e~^ªÒ/nYËBO„N—ÈR¨,ü5ød‹d‰Þù*¸½ 2©èò…)Qô¥÷È~-¡ÔÊYXÃH5€ ¬LqMyRA¢_¤C=+í„q£8 ïó‹âûÜ XÑù$>6p.X+ J¼%KÏJ«{×Uó\™8ÿôì?Ãöè´ ù#C!eûì#xb^ÚïP´X-Ek.Ü[$Ò,ž$ò)xçš«¢æÛ/GçXèòFè9¿˜hIh=A"îäåçûPøüqQ¬ê^¾âkÒ9zéQK}ŸØè¬ÜAîI)·Ié4I{’…oíx4½žä@ÅÌGJ±d¸‘ÛÖô5•óýš^׿;’Äů­adújÿ€î*€a«³”R ’Ÿ {tXTµî¸¯ž¥¹‘±ß\¾›¾SÓ·~féò&Û!%+üÏ&~Q±~Š•C˜aƒª>¦Øs•wÎŒ–r›PˆMꂱýÛú·㌫F¹Ãîò«Æ©”?ãŒ3Î8ãŒßb|$À²he.BD«ß˜ùa÷ (BgšQƈ4ÈÁ5ZaÉ— ‘*CÌvE´!ø@²(=r%:?1’ÕMqY tMCX6Ò+O àáÒ+w8 üT<µVúè­‘˜¶Ì$ãôazA…*‘Ê‚Îø«0qŽ?ËE}nÌ/2O/l¡ÇÖ³²múNôU;WÄvsþöÒ”U}a:ÙÐRB˜êÔ-‰Ï@•°ILÖt‚á5ž¿‚êÄä ^ÔS•oÖ|:šÛjÔ " ©I¼Èè§ç¦@< Uª¹kؽ½x©·É½ÂªK Ø%ù£ºmå•<°t¹Ñ, u;³ü]аÍm¿ :W¥^g¸–ë•âÀò»ç _9øÌ§WÉ.R‹¡ úk»”Þ‹j¡”m~óá¤Ï4é OÌ ›ä‘ê»ù|k ¯•UT =}YÕMet¨mlË@â.çé]µtÙ›(’Eø$þ,ǵsýß+>;dÒr]ìDUÊJé-À‡[rt~®ºþÏÒšÎe('«tpcÒ= Z¥j± ×*ã ùË™½ëï÷RI pù¬ïió–}R_½º0’ǘ* ìíØTéì²²÷À­M´& jÝæC¶ºÞ€;«ú*lJ³ÁÖ¯o¶ÿXÁÃëô6‹Ã`±­³HePÚ‹u¾X?ªY9ã7²ã¼î3Î8ãŒ3þŒñ!Ï=Xß­œ&6 Z £æÖ) ÛЂcÃÍ¢`Át^žôë į²]¾~œtõÅ)…k² ¨*mº¤ÎXæ™´g¯š{dÁ$¨Ñ#SPÃ[bE 5cPèlŠ(šŠ!ÝæèË"‰¼w¡±¦d©®+¤ Tæ{^× <%‡ȱ™%n ÄB¿ ©¤ôLÙãˆé46xªÞfõ¥3²,z‘îJä ±bçøE üI2·cß?ø²ŒË92d ¿1EÑìãgñ9D6+jüÁ@ä5i²¿©“FëĵJ«-°7dKøˆšãADÈ.ÉÝBP9oý çrõJ‘>»(J/ä‹mÙöo$¼+G4 û¦kHRÐøI¤2G¶·ßé{ÄZ»ŠÄý‡½¾È>:Ü­–Z2yºÜ‡’hfÓ×Wf–çåÛ¤¸lÇÝ„Fy`bêèpd†è…]Ž66æà¾'Ô n ÍL /×ùM½ë©ÑÈ»‘‹7Å8+Vú¶(4=Õ•—üu3OÆù§V½_i©¡cŒüºè¸Ð„¼vxí)b„‚&+š•‡K ² 7+Ò ÃÒ›cwal`®€¦b°*gM‘ºÃ ) w‰ø‚¨¬NP\¨SÄ$bè^: ÛgKg»L¶jÅbja  l„Úíâ‹Ä*æm7•Ù«6’£f-\‹Fs`®—¸4h«ò…_´i½æe=á ¥XzYä xõ¾)„úö¼zpÈ)¦Do·ž/÷àM´õ2''=¥ìŽ¿ÓW±EyùÜ’[•;[Àå6ISHo$ÙoÿQƒêšµï )nîš&ÃúŠî˜WWËËäÍ—sX2múcØx u§°î2:Ó$ò^{¦ó ÐA¥Å­Bߘ•ûö.nC„z(T6  ‹d;q¨実)Yi´”ý\‘°e-ßJz™lBSÿ1k´XIû ‡¼Ÿ<ϥ†&|P6žÿ#v îukÑ)Ó'U΋xë‹‹¡›Ã>üiÝ‚Î"ðt<¿›DÀ)ù?ãŒ3Î8ãOf¡Túd¨µ± XzHtÞ°”l‹•;‡‰˜Yª,#ã  ô|‹ˆäy7ðZXƒÑ¿œ²Ø0Bm,ׄ ˆjÃ]mî”M¥šX0x&ÊJlË}Ø"žÉšõÑœ€NªëÎ6ÖËM®Z#%ç‹î‘äÝÐÜ:ÀMÔB~©y£ŠjÔzC ƒG ðp”VºI¶ýuÿ® ²±'¥*QÛ&²²Í2dnèeW¡×žG è_˜yÿÕW*a‹ Å< òò®$f]dÂÚ:\õÂ÷þ3½DXkpÚªFUKHÞUÀðìÒЛ‚{•ƒDèˆÚ)Í“j#·MQh€¼øëÿuSÎ$ sz’.7³À(Zº+ixÖã–Ð:L$×Y_1!/3Ò>kßâÎÝØÿHº»ÌZþêÉõ^ d[ik¸ÏÛs@ÈçiPûóË0~]ëõµØÀæ$Ã6 ‡Œ\‚2#HÅ“NZ{$I\/g08ËöÅY,×åûmÕ y&Μ/@¶!‘8!1h2ïE³6uãôú“´’§nÆŠ„þà¬e¨®>jþ¾7¿Ø”YæÔ(Ùâý|‡câÂ^£³Á¥ÔÖÊRïã}J1±œ1x_ÊŸÉú‘WH ¶ƒíój'r¡M¥ŠšW)LçA'—¶åÛtêc:Âo",òÔèÃè²J§‘ÐfðÛo\j¼'É4o5Ö“pæåŒ3Î8ãŒ3þãƒÿïèýsåÔfß}!×%ˆ {Iþ+£9Ð*Õ©øB`ÃG%FÅá³-ÀD™Y•Y³NÿFJ—2ÎLÐCüô]H~!˜Ür‘-w Æt•ÚY_á+Ž  j–šùtpö·ê^]䌂±ÊWar‡—ª}¹^èïŽm(ÌÄlã¿{ý`ÈØýàž*ìFJ3Yƾà=–ÿgÂä}'"£kZKXó}ñMø[u)3Ù&cå™:ta/28z,TŽçã]–10ìWÜSÑ£1.N¦íSHÛÌ‚ãÓð²Oñ )œ ØÀ¨bûĆÁ°J—ÔÂX!J Tª  ü•ýÉäCí­*…ÏP4úòâptΗðCɼ¦¬ ¶ç½ÒO¡À.ýÏù×wEöËåøþ;ªþÍ5{ ­Ê$‚žˆO~7µPô†Ñÿ顊/ÏtÅœ"n+¸Z~ŸþϹmŒgz̳œ§‰ i±—•J¼ðfØØŠ÷fg$P"Öç³ïÞ º‡¸ËD3öÎû½]À.I_Ž$߯Âö;‹î¤ÞZï8ªäRwš$˜5É_ç­iö褹¨(°»vjôP*þd IDATxÉL‡{÷Éãž-ëKÛ¬_·ÅNš÷}":~¢ž“žö€³cµ°Sw⪨Œ¦ÝûŤÀÁNªåŽþ­ç_ª£v”ù8U÷3dHÏùTÏx>þ'9Ø3 ·3Î8ãwÜégœñ׎™Õ=ùCNŠ_9‹-Þ¾¨ˆ±zÇ”Š½B„›{E,Xø£V>†Réb-ö¥÷Plᆑˆf­“&i僳 µ).†"50%u6к\˜æËÙÀU5Vl£„¡&Ü 2P„×ÅkèØB±nö¾ˆ‚è6Q#! ½Ì®sâRôµYߌU1+yAö¨á«êd9˜HX ©”6 P›¢Û•©¼â¤¶Éû†Oé~S¸14ðÐ:¢Q ZÝÅÙÜŠ\ËDýØ/3û ª’©Åaà:›²ãÈîå1“e’z =ƒW™?öø‚bp@eЍùÈñòµø´M'š»nƒd¬ÒuT’΃wÚ¹…9Ú+:Þ¼v’Ôˆ§bþ» ¢ê¬Tǰá[ e}O"vð¬4*tdrzgÝ‚û3ƒ`îtD¥åáÖª*"ñ ôM¨*A½^Ų oó¨…‹Uœ…ÅnÐuTò0Ò Œ‹’yn¾SLÉõÔ]WE†‚Üó©aÅß`§ZµíPtg<ß‘”8ãŒ3Î8ãŒ3þ­ñaM-jWºËŽGÀ²”xÐwíÞË ^}¿ÜEwеv'„ìdZ3‚Þw‘EOµÌ¹óƒÎñjÐ$A‡cm-, Àr˜)Üã ^:ø „š 7‘*šXöÈ{™¾o+d ‰Ë^V¢ÕEµäþÎ|ÇhÞI"eæ¤]l6jîÉgy t‘d®/•ïwÔM´æ_oi‚*±@åÝŠ+vÅåë^Çüø}…y¢+ 6§F–¾Òé(‰mZBOØò«˜gê]ïŠÜY7§J,ª­Bf E›³¨AMÚšzWsÝ(܆RÿŠHwCôUª€ z¹£cj€³ýO€û{˜<ã n;È«NXQÿìþ4g“É òì©Ôݼ`_ʸˆPšÞf3ou$O«²êVÈ‹¬¤âÔ—a'¢#«øõ#lø·EMzÌZîòÆ-;/÷VFŽÏÁõ•9†½ø–t–˜€"J? 4!C€ ™}H6GÏÒÞèŽ 5±Ë=kKX²„…: i±²+iÏ^غÄ(¢YÍ/sÿWÕ-½ÔÃÜd;I†guumò±zÓhe¼î1¨²hx<3}]—dŠÜi9•õ?Ó»±›ƒÝÅÿŠoºÄ-£N<è¯ä%âÒw”í·ûÖ³ºnD¿üºÿþÀï'ýûØ<ãŒ3Î8ãŒßn|0¡%õI ºè·‚ÝVÅ1MÒ‹’¥¾Z¶äû¦~r«ú…ÆÄJ–EfœºCý0zŸ7+u’ã‡SHµ¥‡` à£4P"¶ª•PŒ*sˆø{üŽ ocL]K€9UÈ0A…Ûré‹÷¹‘¼†{@ªW–C;è Šø¢²ôÖZ³+(íê¶2k°*†Ísfï-Œ‚Å‚.®ÛëJ³\E¥·|œ6i£l3Þé?ˆÛ ;`Ðõ*ßÐ|*gÙ,üž*"{fHÝ TÙ ×!e2’ð@8|~Ýq£ebkÇ€"øPI˜s+‰Ý¹[0¨ÜW †Ê,ç°Tª«ÜðQT²r‡.× ŸF ÜK ˆ!›áø­áé…ýgÞ˜{Z¤|qTÐ(…‚'ôWÇr›æ,BGÿyÇY³£Å.¶Ën²¬@, mꣲ}§(Æ¡LmhCEcÐW³§ÀúO#»§QàŒ3Î8ãŒ3ÎøÆ‡wÓlí#Ò9¬¹†=—Æ…òŽüoÄA©—žh >.±Òl+¾‹ø¨n»ó¡tS+mh X1»9€Ä[ ñû±p¾ïžñ‡ÁÀË •pNk™ç§ŠŸuñ¬@£iÁE€%Eù·Ê;]ÚÀiƒ»@Ã=¡þÅV4¿s¨59lœ\ÇÚQôD’åW,é…53é"yÑi¦B°x…`Jwº–‡ojÀyìZÙ‚ Ä £a'9(Méfû§"8X¯.â^/9Í^— ™*‹=¦ ¯ýŽ÷å<²VÉdš;×R+² ËÄR§.³kF‘¢¦Ò^ir ×bÁÐd2Ùüº68 -lêùÝù-d[Šõ“i’ÆË«‚O§!’ã÷r4™¤ôqTUâ—jE}uW#¢ m‘¿(ÒFxñŠ>ÓñÁPZÖü 3•ìU‘iÃ&•VùnÆAì 4Î[¼®½…£ÐÔ³#"†B=ègAöÙ¬MRé %IW.;½t¼WŧìÖŒ‹ÊLFR0í<0¶ÊU¶êªèÝÊ‹’î–ó}ý®oï0¶BÒ×S«37¤RØÏ´ñ­ÐvåüíÒ‘rĽû“cŸØ J<.›Ûñúâ‹Tt‚N…Ë&wÿŸ§Ý)cíZ­Î2xøÎ8ãŒ3Î8ã¿7>ìjf÷èµ#‘C(·éÜ;6´:Öåí†n–a&mÁ$Þ¨KÎ+þÞÐv'؈ºZ3”PлBpêˆXÀ¢'éµ³Ää[!·† Ánä4LÔª$¿õa+)6sXbŽY[†š\Æ;"¡+¡?s"¨žÌÚ”C;° 2ß‹£¤×‘€R«“.PRÀ&K¿;(0þ gf{ÄÛ{_•M›Ö¼ÅÆ…N<£cJœÐàÖAB  {#SßH‚¨!u([¾>?—SÇÏ—ü¼`¼ÏAáòQïÿæå¨èXZLf @· WŠ{ʬäÅHY„ši‹[+dUÒ¢æx"мnëW~`våòöT Ÿ`Ç™-Ó‘u|t hè_îOaA |­U+4 Lû"a#­A*V ìI¯B}Žóg ¥Es1KüHE|âVÿÞ…®,À…Ö;`4AdâcQ]Þ&+dáäd\×ÚKm6 ¼Ò¾{’`3ÓIÐÚEa‰×1)Ó6Gýu^³µ Ï‹&½êÿ„*—RŒúú™º†eU†j=Èø–e×HTåÁŽiŠŽ4{V*1©šëdSÃr{‚oµ¤¨7!UY Œâaµcà/&Ú¤Ïä÷š>Ug§´¦°‡"Ь¡ño_›~»çeõ*Á+ûš g…JÈÖ)Å%Ø´¼§?m/€½9“í§øÖýÿŠ»þmÆÏ£ÿ'…pÆgœqÆ¿v|xªSÌû¦€XظUz¥ÐJ“JzA†í¸¯ùÌÅ#>÷ rB|“q)Š;ÛE€³hê€"ÅŸeß~Q£‚ë|±¬HáÞ+BX8v¥-h£éÙmVn>v(e† äc|4{—B`_Jt⡎Ÿ‡—Q#ía¥È¹‚Åuî€ ªÑ¯îH¨*fâ«íà™¯U/$Âb¢~˜¾5ºÁÜ:ÐíŽTû¨#vŠ 6)gšƒSL/j)ç§0ÁkŒ*6ÎqGGôjCÌáÎJ›]&kóå 'ü:‚Öåµ úZB”Õ¸wî’ÇÁ€`k¶–¸ð¼è·§35cÉæ¯KΟAŒ Y\ׯäe<Ó—wã3dÿ¯A¶ 5(jbŸC"ʇØË-Ñv1PÜ„UJZ]×—Ìí;Ø÷_ß½˜: üèþ.íz–þ?ß•o%wŹ‹¶4)X@0t-€BI‚­Ü‚EÁm/³$„[©í­Eçuk(ñG/N"ˆ%%FÏnçsÿ\™)Lâì˜Ö«dvš÷%m½@˧ÝúÌì;#É5î´†b‡F–à`º¦Òâê€Í|6'ãä*9œÀê“ ˆõ@TS•@<‹¿æ%jaÒ~¤Rfƒ§Åºúð¤kE¦N8¿HhY`-x³óZ7¿ùô[{n‘ÊþOÆ4£ðÓ:‡aéŒ3Î8ãŒ3~áø¨þ{.Úz»;/|˜$ÑZ  !jPdNÅ—ekØòK !²Ó$Â` `Á}A„ŽC™Ì%éIE’‘—·Š bææEþ£¿[n¤e<íT ±Ç¾_6÷Àrbxð„Q|kE…®:ì˜q™ÕHVOO„…ïKXž†’ÙFò´²¿z\R7ï›´R›LÞ\Ý4LHj3V±ÉÂ%IÔC –œAלÁ9ÒÞ[`“#DÃuç’ªfYnø‰!sU=§fAoÝ$ÞXèŒ.f˜€×#€Jz‹Qw¥ ‹Ä ÷qH6p«ìîFj\iíU,yu2aF@-Oo–SŽ6·²î°OF²ú!'Šñ¿+Nô|YJ4n":B*læëH¨• MFÀ23Dˆ-Üê^-äV¹ˆºÇ×*ÒLPvW °Ôz9}ç~ζÛj\XOHížN>ohL§ƒ¡¨í7lʃ†¡¹¤Ckg2÷ ÆgG]è5Ôð\}5Ì>RÎÔ¢El3†8ž,oì«=X¶°ig#!¹>)^y̸} Én€”æAê2DI>©”yõL®Ôz›DÃßàÊö§ð%W_Ý«t@­¡öñÏ]—pMÅýF:sÊ \’“¥5—/LG»ÁÔaƒ¯Œý‘Zï•Q%×’]Òè{ïûþJY!ü"‰bã sKpaË3Ê£mp²µ1]ºà ÑßgÆÎ8ãŒ3Î8ã¿4>¸Ý^%·/ìî—7_üÅ\¿#½XÆRýk67lÙº”—eëæ ì¬8ÖÙ«‰°56ûZIýåP/Æ oÝ^¾‹ ºU²­B¹ L Æ.>©x1‡ôéctx·€øVèq馼B†“ w bù¿¯Í”HKEÿá0£JQÍÊ¨Ž€}øÏ¤¨†‰‚†XÖ~78’°OàY~nZH\•6 \´g¨ê…è¹nñ%™(E}‘ÔDS6Ø7, ” °û'kt‰Íe¹à’L•2ˆ Ilç›j§”½Ð;X`À¯Š&I >ˆï¹ã ©ø®û‡Ì%AÙ[ñ¡ð¶¡rn-Z³Ã…êB¥ýòÁT4™ï©ÆFï‚4•lwÇÎIç­«Ç|˜(›®*µÖ JÖÕÊ£°nîQr$ˆðê#ªŽ¯˜@› eÅ2] ƒÑ¿¯NVÛ*‰Uˆ¾Ñ(%ê3c«<¬ö2Gà ú†­ò­ÍìlÎ)ÓÒǺ³¤n¶Šþ(Éž'<ÔÜa]·†<› úlõüi-ÉæHmkŸÏóþ§ DGæóK=¨3UìÛ»íϘ¿4ˆÄֹѪ!l æPìþÃ8\õF)Ù6p.I«`E¼ÚÜ1‘H>¿~qË©Ÿu¿òÿ› ô„ùý·Oþ¨}¤TaO®rÆpü ¯æ¼ý3Î8ãŒ3þàñák¦²jwÅ–Uª„ât¡J'ñ¯T­3DÔJí v·å^qâ•0bzݪ…ç* HÙ%l8”I*ôS’sCP«iÚA£z§¤£ácï}õÎV} ÷Âa£³ZȾ3p#¿¡C`]ÿ ´ÑŠJïk¢eÌ&Ð4  Ã$Ü6ߌ"@á„`üÇJÚ7)÷‚e•ø…ɱ·d_ zkº¨%XÆ$½'n¯±Fº¶™±ËvÁcCñ…ú8Ó ’¼3–3âHšÿ„Qo°Ë“%ù„„[q‚Ì}íµ8›ÒlòÞ&ƒ@%ÆÍ)¢åCÇB–:N²£Úù2þ¶Ž\a%vs1>³G[§‰ w‘²ðÜËî$€ríš6VÌxÁõÌɆ XnÆßyXÖ§;f9iR/=äíÆƒ±ž­²B`ãé 雜G´“¯ïÓQ^ááÿØ»²åFv‰Ôõÿÿñ(çÁV–H¹Ý}62&&ÎuÛRH™¡v[±®C©qìTòRÕÎoÞý (¥‚AKØt·6—€Øð\åóBÁA£=S$lè^¸¢6íS) Ha©2µ‘ªYo)s½:*—O­Ž[w¢Ï] Ý+g µÂ-ÆRÜä­1_ôšpt–’¹`C÷t•x÷ÆvÇUniöâ4•š ›"ÇšVJP Âð›ßÂ>‡ ƒNþmÿòò,üZã€ÿE©Ü|®¯Š3þÐ89€3Î8ãŒ3ÎøöøÐ¥£®¨ÓÇö(­¸MXCRýíÚp^{Ôµ‹õ… Úˆë‚k,Ôã m‘ P«œ_V¯Q`‚M5<3ƒ…`»jÛÆÛÙ&¼Õý'µ^ŒAW‰Ë„ Hb8A9G"D›¼’[à6–H ƒTô  ñm7—‰Ûò²®ÌáóþhtÀš6nŸ9¢âªÝ~[ž‚vŽ?3{(19ÑÃÄŠÝ»ö“/t’9y)ù¦ÂþZ»‡oœ*’Úlu@»d7^óÜÂý>”ð{’v¯ˆ§ ±éš6Vœìé‘«å\  !íŒÅ´F-~ò…@=M° °’ü0^XK…6«,HänÃT÷Š 3Ižxp­•„f‡sÕ[þÊÌY”X÷ÖOÐt°•µþŽž§…úåëG–U”Õ :ÞÔõ L·ù؆ø‘àv{‚íxóf;šÈÊ›‹žXl Ð¶’ÐÞ ‚løüt"=S¬t—U¬‰­X=ÃåK·¦_{8æ|J§zÝ*W1”á'I›l½Iy½ì“Â9ô·Ì&w[.ÑÖãÌÔ¥aâ¨äb»µ…áiÍ6”?î"LΛœ–üøÑé½#š%ð‰™zYó®¹>½—ÞŠÊ#3$¥ÅM0¤6ÆD]KM m˜-L–£àÂe‚Ú ÷:Úg /“Ù÷ÉîG¢»0KmPÜüì~õ0-³iJ›o¼çQ§ý+Æ·Wþݯ8ãŒ3Î8ãŒåø¸ËZ±`B0W›c¥µ–Ñ[C?‘äÁòË®mñåyÒï<\]Øf¹¨õ¨Ëœ0‰Ë-]ÉB´ÁžËˆ+ü†çÈ=MgX½]ËÐRI+nUªŽ1mÃÙ“ã·`wÕ2>6$EžáŠ’B/=Æ0/ÑÑÖ˜“·Rè¼Ç¾À”× `¬Q½Þhþdö»OÀRQá–ñE*õm%OHòÚ EÁ ˜0‚w´0‡ZrNA½MˆL[ÃÄ¿DíT$ò‰ÖùÕ<ñ¹Öº°é¼Xn¿úGÞví)í.ñ´ïÃE}ö(Ò0U" PB¦×¹€›:t!·¼@‚]MR™b³‘B¶áŠL:ɨ ûq&úLÖõr<0ÌeïÈ*·â©ztšmÞ¦å·s>µÃÈÃv=’Yù“ñåÅ·4 ¥M¢ÊkÂ@Ë÷©È¯#ÛäöJIwîë …BÊ$°ôׯ²†÷‡ÎP/÷b·s{AEÐ0²©£ª¢È}W^Š}ª•™,ÞJ‚p­M†˜ãðQÀú+«^…¬ï èYSÚl5% IWµ"}(è TA±I|‡ÐW ²¹!_êÌh>m2&0Ñ"#T§)÷Kn'ò|‘Ž<Ô’×5R|s©»4n¡Õ©pÈt¯ƒØ‘£«òÑöøW RðKá ¥”"Ö`[±£ï”tF­m^ܽ|ÙÃæCòü—„kJø=]_ È’ÖS`#ÛÞ¨›åv¬M¾õš|‘—^ŸZTÕ¾bÂÓ/§ôê9@+C-s~,ý=lüðÚTÏrâÖ v±\W]ƒ—g­©ÕñÕQ„õú´’|C¾¯Ì.o'*`s› óž;‹]­œeõ)Rb­Ùü—Z=òªêd´$+äïkÙ´.cÇ6߸öÞp†ßú˜}¿3~ß8,=gœqÆgœññá14å@?:å^ëû(u9-K䯑ܼ+©S'DYºv§âï±]ú.]¯®-z×´²Ö²yM,‚=¥²8¨¸eË%VPÝcp—+@Ì -Õ_<À²éoÚšpëS³Ú]ìÍø”ÈRûÀƒ%ˆ“ë`cÙ…Os©µñ&Ϙ™/â†BúÏ©ª’r‹ÎdÓƒF4"½ƒ¨íõS<Îæf»¡È1‚b+ÆÇwëo†´:Õñ„ÌzÉèZ¹L3<òB‡õ¥Ëá¡=F§Å, š…ŸÚh3 ‰ºÎl"×ëqÄú†[`‚DÛûrÕt#)iÇú}TÄ+Vv߬8ÈL#÷‚¢QÙGKåÌr£±ÏÌ\†ÛÝ3Y”8RQùí—a÷Ú_†ât‰ ¨ôÅÓìÍÑî`0XyH¸Þ‚†N0ùû¸O[¦€9Q8N[ê—Œ{6}9‰WÐPØ-’£B7ØÂfÆæ¹Œ= ¾ó‰Ü­j7‡¨ÞÇê• ½“ŽIü ꗴ׿÷H¯J|5ƒz ÌØÞš&Ÿ˜4ï­&{jú–šç'UÕ¤²”Õn5cÇCwñ•áE=Çb ÚX[ßó5™M#E¦*T°|)•W¥wI±HûgI”bƒ‰QlÒ68&I–~ ÝÂ)(`:}±ÍúùJ¥ÈÔ˽[®l"bË‹²Z!/˜T^6)ذÕó}{×h–w¥µúÆ^À¶!¿ZóÃúò[ÆÖ‘ûæbÀgœqÆg¼;>îòy. A˜ŠŽ‘=xDå·úÑSÑK®õ†5(ÒT$œ¼ºTÞ¥£Ç¡€3I 3€nêE.Ï"ÌT;áKôoÇwûRµ·^ ¶¾±z-SœpÀ†ÑøQЮNL{ÀD¬B~+ra$ ,`Úž4Ãzþ WVк!‡‘u½*r„oªX{hÈ@b)qE¾Ò«fÃ\e–ËÕ÷Àµ…h\DŒÀPîÊÂ;q¢ B"3SêÐq.cA2þ9oÞ,øAø^ïéVF¾æ Ýh¢_²QÛ«jd–/Š^æ±²EzS t^ÜlJ(UáÃë Ÿ>Þ‘,½ì"W5­§JTÎÓ«ò1fcžÆÞ„. Ò«Ô<àŒÍ*è³ã´E…Ò¸(°ü~`ƒs¸õšÎnt ¡a ¦‰ú®‘˜i:˹[H%¡ÁP‹$zIU®‘.) w\«˜ÍÞÂw9T†­ì©º±¹y?2¯f—úJäl>ÿšúH,Õ.DX;À¬u—Dñ&vihÇÃú†¹4cFR°àÖ|$À¹9ür±Â)Þ“)–Gãúð{9 ˆþªGšçJ·£c:ª}Z¥äJy¾c;ÌïUò‚ÈÞIø|Ù´m“ uM×>Ï ŠH”4ßè,¹ÿˆ˜Ï|ìÂÞØ4˜žRýF¯™þ IDATZ4VË«¥©b®¸ÒŸFq}ÿµãßj„þŒ3Î8ãŒ3þNãc@æ|Ÿ2_&Ï"dèÍ—Ír…G¤šµZƒfExPN‰‰¥-0ÁTJ™ºwÍf•ÒìÿU8ép`°T.Œ¨·v\¥G»SžP†$'û–—ÆB©\iXâ:u5ÔšÆç ~$Ç+óÊa…û°`½vfëÊúR24ºp[mW3G¶mÊ“’Ø:Mã³=S¼æÀ#QÆ‚5Èd[¨ŠN2F°¡ðVíxiJ)˜)'WJƒÚ î3b=>ò„ëÛp0[äQ‰”x ^¨óËðBmx¹|ExÞÈ¢¸™x„eֺžðj•¼ˆŽB××oDÆ0€ùó¯¬öRM Ítl6(”ô5©ËBæ¾±MH #ú'áJxP™l"ÉykáþsÆ_®å·~“ÏU“c,µ.‡§b–¼©ý·HÅåIÉLÒrgq„óF½ß}R•?#æ S;7D©ÖµË0i*ŸZ.;"õÖµHÚ‰_|ÓÔ¬Ääê'¨å¸qÜ¢O+ï3”ïiª+Éi6Æ75’Ö3銧¾¾÷ÙàŹiÆ«(ŸêK…Ê ¶ 2šÏlÏc´´pÍÑþ¤ìæR1b²ÖJáæ¡èw¨î,Z/nY4~Í•ºcô*ƒöuY°§Á¡O{#ï 1X_§Z‡Œº"× øÓÊzyiñe+£!—]{¾DMi¸Èä´'À1;H Üö&ÔXVû²˜5„¹¢Êû^úUŒ¯œš0Ì¥m˜ïÒì­øûBT0ßDþoX|ŒÍ%à`ñù]Ì„ôNzØÂ¡øô“y¥ý¥v ˜Mõ.Á]«þal©¬–0 ðù¹«¤/²³™h¾nd§\ ì’UIøÐM' ²3%½[²MÂì«Ò ás[IšøÜ½n¹þc.7îS{ý?èüßm 3Î8ãŒ3Îxk|ø»õÉ'òÃìA{"—SÁ·ßFzߵݕÔù¢T‰*@ç2íIü'®¼ZCÚÉ:IÁ.øIP¾09â\ü…ÞƒQ¼CpI}%}©Ã.ÚoÆÇUðÙ+ܲÀ@¾–Jþ»o†VȬmPðSBÃo&puÜÅÊDȘ?Eòؽ˜ßýl0Mû2}UqF„fÿ¬ÒAM¡Î Y-j·Ý*D(¾|Þ'3žÑ2hé`7ÏHh©zfÁMÅV •qŽ6®&š/³5qÞrÇ-þ9óÏ{#ŠÜÖÆˆ`ëã¶·Ò× ðV5»Þ€•S/ãJ1›”ÛÆ‹¯‹Î·yL~\’¼òrÏs•Žö£:ÓJáoXé<\YŠW1µœ?§­‘ô„¢0_©üÅ‹½É¶_ ›’¸{dß^î›7~Šš’Ûï;(~ºòÊ8‹õ»Æom8ãŒ_¼ Î8ãŒ*”J±è˜R±|ج/øJœ$Œ!«µÐ“‹©ˆ+j>vfEdHÝUlݽ¯æ³\Ǧ™=G׽ͣŒ•©j V\¡ê…ÃÔÐè3¢N¶÷·9~c%`ŒJ(…RWœQ(§ïŠ´‘()š†î»&º€P² Ë`Ùö_åÿо¾Ì0ì[%"âçØ!)|ɰ—ë°Rà)ÖŽ…ô YÀ€nFžˆ—Þ>\uèfåtòFÊ4Ã}¤…è3sSâ= –@UE(ÜúvT³K;½jo„ThABsFÄD°9ºpXt> „©pÍ®ƒÁÊy‘Ó‹Tï¼ã/Ú5Žƒ²Du©Gøž›È~”3|ý;6Œ[al¯$oŒåÆCC¤ç@ nÅЫfcú¼í·¨¼vEÑݪ¢dWÙÈ?Àí:ÑñÀðÿ…rIÜx?üòºP ž:ºó•Š9м|õ㾉îä 6:,7y"²‘s¸+Ðã¼Îû œ~§¦Z¥M–Wª\)-Ã[½Àw0ZÇ^:~°ñ©Ðä6?^i€ÎPu@­èCl¼Ö‘\Å%e•`pêÔs;$I­EþRºDîêA·¡˜ki©vQ^¼“f3lù™¿‚7þ,úóSÐð©.ÿûƒ†<Ët°Ø3þãä3Îøcãcy¯;ö .²JM¯‹ψé$@äªÜ1_D,{ÐF}o*8f›!c†ªI•Џ™<f´+ƒ¡=ˆèÔÙÖÌþ}‚_9„y&Ð1[I;&âf_K¶¦m#\S¼€Ô/øúª¸üž]Êë5ù6áèÂõú3(:tå]DÐx¬¥pâÏ"¿R2f·FyöŠ>`‹Öš«PŽaO¢•ÚÑ¡Øm)efí¹™PÈ—/Šê¤)ÚMEhb –ü`X¬ÈÝÏa…» •ÏsK›$À|TâxhTïØ[r,Óÿ¿€JŸ5³Y30t1BØ@“/AüF‹%« ‚d¤^KïË¥q›Ö»k­ë«ÕôÚ{ôæÑk䨬Ä_QÁCˆç¢~ËÓ( ($o9õé?)¶¢_ŽðWÝâre ãq¸×5û™-™Žºy«Ïr )Mr3Í"•íX ÁÐduSvŸèå[Ç•]t®ì•][ÔP4szBÕÑœóS‘u"šCñ²¼%Ôù6Þ‚"Àb68^šIxªÚºÝf±U‘–-ÔæB¬15æƒ+S‰Å>3Û ?þÕÉqêµRzÿ%Ù†tÏf©çÆçKÁˆÊû鋬¡÷j`®êhÓïvg6cãçZI1.ÜýoA2o“}¸ÔxØÞïü5'ùŒ3Î8ãŒ3Î8ão;>tlÙ­ÐÏw„©h(Ð'1¹W¸êf^f A•ä@xEzžBhMÀÝz¢Ïø*4ï;‚B÷O¡­7ñha—h>Õ>´õ0võWbëí_QýÉ=)ðˆÓ¨ b?ub ˆì}KÁÅP!€´˜÷†eéÔÄpØæßÖÝeÕ¨‚:*šï\S™ž“7L™©l1…Ÿéð¦C­¹³/\Æl4Ý…@ j‚®ŸBw3 G ö^à F¬¯§0i±‘ W}<ëu2dÑhãº7+)%³´—™!D †’Е’Tð¶hɋɭE95îeXæy—9æ[JÀ÷ X+*nkùÒLWsuwµpcºýZ÷‡»ñS9”§™âòœŠ†åÁzÀž·íuè‚BI8 5úW&lØŸ-Yb}¯w*êߢ#Ú1rûßúã¿ôHgüȧþ4œqÆ¿cœ#|Æl|¤2Ép—oÌá Œák Ùþ‹´¢¢¨þØñ”Ÿ×ÖæÙcÝŒ ñ¾s‰·ÀS†?¾íJ›Æ„Zi„Â5ÔNn©Rl6AÛDíÉBX„^´ÆØbVKo5ÊÒzIgµQI¥A‹í*ÄÓ-á9¢|â Á‘Ý*¹®0‰yFP›•‚ƒ-åkMo° ;IÃb9gVåkù+ü^½pðT!ßQb7^q^¸­ÎÈÕ“©/òß:]%È—ý²¬• Mú v‘6\úÆm7”€i­/‹h¦š°2 ŸXØä+Í=Ø ·°PriBÇ¢u²­‰¯µ´ÂÊ1¢Hv…›»§¥¤‹¨w‘E¨vIÎýŒ®q¼Åf#,‘úxîü¿])%4b!ú3¼%¶“;°˜¯‰Ëhûîº' /œÞñÚìçôõ= èX@ rÊ7H§qÞГPÕ‹Æ"”Ì(ï™ üI¹ê±×@£ðå”c—VÁ†wÓIÈ$®ô'#³º)õ” ykÑg(8TN>9³CtFÓul`2ŸYEiTV¨DU+™­M¾)p+~Á'x¤ªÓÒ…òy% ©:3Æè䫚$…c÷ÔTÜENÌW¤gË&¢Ë48ö©_9€ÿC˜jš”D}÷ò,YãžWÚ=„ þ áú·9|öàNñØTR‡Å¼œñg–•Ó~ÄÎ8ãŒ3Î8c|xÏ/ƒ2øu åŽtœC9yÛÓz},º†xѪ…1‚×Å=X­øC ' /Uóh 2WD+ö™‰ê{J~žR¸zB–Ù8Äȸ@²0VO‹ÇFüF,n¯šë#á®;dD#…ânJB$Ö&ºä*œºõ%z2Ôû·F…i×Å20G$íF¾qŽ\`ƒÂtÔ¾O¢yYzD€N9ÙWe®–H­)U“§—ÍŠ¸‡û“™»XM)hŒíWg¼|¾àû®dhˆö„öà—ôŸ¡˜”ŽÖß·•Ì"–(z6ÀR,_»[j¡¨¨¸°q'Ï7‡³ÿˆ:.~®’š Ç#·^b@D>kÊ ß¡"qÜû6‘1[@O¬3û‰œ:ÉÐìAg ÕYH»‹üÒòžÔ…ÏnLÄgv×VJusº’ÒµPø¤^›d‰³¶z?{ëY§,õй{„žkËB 5%h•uæÄËÕˆÒ2@øÓ&TŒ*Cw‘G¦SïÀͲ’î9O GÇö“¾‹E^‚I«fÈp¨Œ)S«„‰È% ~‘(AéTc6¡IˆE/Ú.IïS]õOh†¯Ë±@Ï èÝÃ Ó ko;y‚PŽF[º.똕xÞ@bCV 3n´¸Eu_8»*ävÞåýÉå~ˆE¿t˜S'\=¡‹.«ëeù>õ;XÊÆÇXwÅŒKÉ}ã”Ê©¬ÿ,е½¥ø­ÝrÆgœqÆg ãû"h X³ÌJB[Y?¶©dÄ;wv&óUÊ^¹á 6åùÑ7•à"Mj¢,Ÿá‰k~®@=ãn „¡<ؘš |áEÅÖrª"ÍÁËÆÊñj…ïØ>$ A åNÃTDi¾V¶[2‡Áa|¥Ð M±>FdÌà8oL¨¦WàÀÈÄFÚÎ ±x4É0З۷zÐ([aOIÄÌØH®ôì#sНð" æ¸ :*€›Ý"’7GUd.'2j×1æˆÂ£UØÙ“Û^UŠföxÜçß`ìUKóU\ìÞÌT–½ Œ®æ“Äl­/Çö¬n û¸™ÊT?í¨v3°ÀÓ#¶¥î¦HrP>Ó#&X0Š`6÷aA+04›+²·Dšt‰ÍvG‘3Ä^ IOÜ|q()(±[2-ñûpSOgŸ-c&E±„\—ß…O–ŠæÀª¡®º”ï—©úY°µGDJÄ÷H×paáefŸ(ÚÓscXI™/Ód=²ÃŸ^àLs~cJ÷&Ç ‹ñ÷'¢˜)AûV^ Í6Õ (ÅP=[¡¬Rm¯ÔQá)pUë!Ý6p¢¸ƒáY­ÐŸø1“O¬¸zŸŠÖfíR¦wå«l½$JXbûWl,g>@KÖÆ¥f¹«]ª/HHÎkвl¨8¶3öIÖxh©°R9?oÔ)LˆÛµ«RL‚)¾Qÿ·C(£2r÷N›8šjÛ85˜PÆ3e…9zYë—)ôŠ5‹Gƒ*^ÔüŒÏœÞ…X—ï†yŽ?‡ XÌ” P^p€„ ¨ªqk1© ¶°ž`·Îg’Vv]—’êÓŸ_Nq~¶'¥¨ 5¼|ý“'/â’ôyÉ$ÖTÍ'ʼnJPaŽôdë¼µ‘!‘¬ÜPoB}!Ù^ $Z©®­Q=ÅÊJ| bA"P|3õîK$<†/ªŠîbm-xq+µÇ¼¾)^Y g0 óvüWÞ" W|*”ÙÖ¯ïëÁÝ4‘?No”Ò›»˜(ÏSî´²°x×v«aæÓKy[’1¢+ƒÀuÑzÉB¾—Cå@¶PB§4^ÑÌ"ÅEšœ8cä*dt꺇۩´¨ü~F«Hº2ëoÓ}:eÙ^yb7GŽÏØë`^^H1)Ø ‘S÷OHËÑÏ!aà À;Ç>ßù|©['sE±.¦|0yÌsÏ F_SQH]_ϵÈÚèÉœÜbʉþmP¼ ïã§©áeCýò®m-¡wsÊØ¢>CëT*­ÕÝ¥OÿTí´,>‰¥r? ;³P‡ßPfMÒ3[KÖ*×”ßâÔ FŠ^´ÐP2Np9Ñ*tqó!¸œö[ÞéðªÝRÉÖÂòÃñbW½÷"lÓ^ñ>E¼½œ»Y B›„k'AòÐ3WÛÚ(6ü5ÿ×* &ß 1t)ç»ÁzRÊ”œ$2Õ)΂%z1¾ãp®¸Ãï°°r½_Ê•Sþ'ëœ r#Ø \èîÑ¢>36}T¼9›Ô; hûf„;§oE ¿TmÐ(ŸÙ9{¾A¡ºÇ_óŸRõPì[¶b­üi8ö­öPþ¿žXSCó{1æÚkuôjÿÌÌŸqÆÿdtòŒ3Îø­wï‡Å¥+H—9[Õ9%‡•=(ŽûXpdª#M$¯)âM=eÑš{ýSª"˜¡>Z©®ƒ¹ÍuM…ðåÃ:ª¬P‰Ü]ª¼ÁµŸ+y›¿rÉ„‡À×ì‡Öo_ŠXñB‚X”!ºÝ­¥&è8‹‰ Ùìì¾5ˆ¥ÐÖjFܬ2+„ë²ÚÝX˜Äeć°éÀÓÈÃf²΋ݫ(¶Cy8#’Ï€A „•[Æì#‘‰ ÊrNœïæð¾R™*…Î$Þ[qº¦*¥í~±jÀtÉ¿_,qs”²í$åÚq"Õzdô:ÌV!W+è?… A‰1SUƒÔ§RU¹O15]••ì—9#ƒaãOXà§®ìwëF³¬ Yùë´ÿë¡jüØT˜ßIp&@ÉüaÒ­ÉZD?Ö×14Pe'4"-Ñç‘yRd+“f{õUÌ݈ˆ&ö9¿'QÐ@ÖoñÏàOhG#æDJ<¯/0SI~Yi•¦5Û*7aÙ6Kü—ýîÍžªµ¦oýÑ%iGh5šV¨yÇD K&qòÑU=ABN6‰%†æÊH”ƒþA’„!‚‹‚~bX|VôÅ:Õ¶=V.ÌΪqÙ7@z5€ê_Åmɸò°¡ò+Wžƒغ;8l­¿̽_øñÇ‚ˆnN&àŒ3Î8ã/¾Î8ã?9>ìEzs)>ÕóG¥µZJ—Ö¦*΢»59EȤAþ¢¦u§#x¦~ ÈÕ[½Ãhã¾JRa…;×û7|©@ë@f6X%Fº)-»ã6ËÒþ}Ì I-0=à`9l³›Ø¥dŒ&(Îa æ(Xz¹òOfz–½Ø/|©ÇnÐÂ=õòsüìÏ”À@Á*´4*?'è|`œ×I ÄéìüSbŒB¤Ô¿¦]ûH(:FÈ4Ô2[Äà Xom‘ûèÊ£±õäõùŸLÀgŒš"Pa¼Ü"pqÀèõù>ñ*.HÌ #¤ëI?ÖX½&§s.TcÖay:ÜÙêÍÇrÊ?Îbµ NÁ°?YŸù!KR.mfäIÿ< ϯŸ|¦ŸxáæbÊÃCcN£»êÐà»þ>¨ôWÙ€9xu.Rß/RÓ•ˆ’žÃèîtIϼß–ýª¿ ÅᾈšØ^Ð#§ÎžåàÝÞTÛ17ù¸ÙdÞ·Æ\q‘ç6Ľ ÙX1ÆË&tÎÁ;ÝŦãaxþ_G!kÍ8#-apR憡åBôÏ¥¡,aU¨M!rÞ:#§åE"ý¨:ÊÕ&¿Îòáɇu …CRŸ=ŠÙx«Â}kÙ©9…,9Ÿ³»[|E­ÑY²H­qœ7^oe+ú9årfS t®?Ñ'u¦õ3[ÿGŒågœqÆgü§Ç‡gÀ )æÓ=¡H]Õ£[,b׆ýv!¾Ä‘ Ä´v£!ì0VŽuZUûv}†’¨íð’õ&NEËb 9 …µw<%B®6áÙãõ¶3ˆ¦vÑ4‹ÌÈ`÷µN=‡ª|ÌÈcX¸Áà¾åi®¾RÅÆžÅ…#±U7-O[µœ;Ä @‡\­¦D3#’¥‚ØS°@í ‰™â†êÆ‚ÛÜßE3lT l›PoïŽe3æjæ{;çjýÒÂÕœ2ìÆô^bÖ…ÖÀ½“ô1#¦ƒ„¥d»ä&iÌ9ݦÔ&ÙÅwö Žâ¦ìÏL(mCý2ÃÍXÁ,ôfEÕŠáÕVióJB›ž‘ •`h:¹4º{ОUt½>;Ê|½Zcw;K¤yt^û;×/üò1²Kq]ôOÁÂ×™ IDATÔß^LêÃ)õ‡]†Œ9£Ýæ½ÙÜX\”z7…‹²¹"Gзñê;Â5=ÇT lìøD…t5¢e`¦³ûáôEôp}/÷'î×¾²I¤²8x³ßµy‘Ú›D>—•XÑþWG«MwÈ@Î8ãŒ3Î8ãçÇÇP<‚kxK`ÓÝIußKp导«ùÀÊ=T‚¢ÖQQﻇ²B-aN®D7ˆ©´9:ýìcC4Ñ{@M@3QîŽá77¼óï WEu»wLýþ¢:XV;ª ±«8îSîaY† X³hÄy40ag¬û M|å °Q² €QŸ+|¿f`ÁPIw‰&qcÿeA-<†š)FL|þò³ÃE MÑCqÛÎuµÒ6Ì*2_Àû ˆð}›KÊî€ÓW{Ð/¡ìg­l¥ËV6 › §Þi¤î¤t°Ð@„… ÛžÅhXc1¸â°Oö6%bº÷5“ÑÔÃvG8u6 M”nôV†K¨¦ à4]Ÿ,@O‡ å›+µz8v8ß§ÂDX±ìl8ýýNYBoã½}+Ö2«JæXg2ÔÈ{:µª‡!‰°tž£kÄ R Ø(å·w}ì·„™.Äκ‰(4FÖ‡N¯· 5(®É7D»£ LÜíp·ÎÊ¿L"š_:½.œš)mì­ñÓãülž°²%†OY§ „Å®¯×o>ùjGûôÜeçó= ŽNé@Ñ ½íu‰‹)\ä,y¾…ÑÒyQ‘@,p‘߫ȔÉïvG{…÷Þ™§T^ƒÞîáe~ûoÐ6AÚ¸­Ä6øÆŸqÆgœqÆ»ããºqr*ÀÁò“Ç‹]dAgÏE³üì`a#ÀÕXƒ€¯Ù<s%Ïé""U”hRàÀM)1Wo¡0W|r) BQ¹‡œ[Y;;UP´°PA…Éh3ÖxŽß¤XS$G‡{6Dæ:D&SrÓýŠô|ÑÝLW}‰ §ýóhfÛ“e±§Nõ\l=d+=õ´Q;Š$ ä…ïTeˆ\¢ ÀI|’‰JÝq¨þðÒËElñÉØº#eºâíŽ×BhK¢Á©{X‹Z½¨)ÊV)Ä’pŸß9”`U<>Iwq¯9ìÁÏ”û‰æË³Û{³’Áre˜¢/Þ¡Ú5‘™|ªÃB.bµˆ£YY”46Ç<¢€» ÔAÁàZãÙÜ0&‹ßëE™Ú¶öôE§KFûJ8=hØ2rát¾ðÖûŒy‘jôd¶BJqÄ+?@l™œGÍäÓ"à \—ÈÐùÜíޏœ½„CåÊ›]{û²`tšIòîÖUòÛÜ*٪ОÔp-3ŽDÈ3=µ›øs2|̸cñ>ô挞f¤=ÜÍ †VKaþjË£üµôðlôÌñ«Èã&¥Rîrð‹Ë¸¾ÈDU:Uå@Ö&CeË>;ΌԂx9À©‡Ãk´_!¿5PS&hè Ã„aÁ88—Ì{CвÁi†«Í·20yæôŠáZ"ê§bÓBdô×î9Y’‚na·xãLìùb㟳õ‘øoƒËÒUþ{Ž¿ÅbãÙÞ‘—8ãŒ3Î8ãŒ3äø°H™Â±Ê÷ªÁ6#ž¥¥ÿŠxD(†âûr›PЊ ) 8‹]õÈ$$1ôqs|¥ò¯Kù9¡>H:ZUùsêND±8#7Ld>PøškE£Ø+ zøºÕ´’µDÉuÅ$Õ¿ñÏwýlOfâ% `æ;B¤‘KÔ½%çªn‹,-é¤Bff}Ie­ã §@±“=¤k£öÏφÊ—¨ ãŒ3Î8ãŒ3ÆñQ]Ø–º«fía®ÌÄî tÌü¤p¼%=ŽïóõBXÙënø÷³3ÑâðvöY8fíÉbÕ^_p髨 [^lîRoГ„Xä)3@Pé/+$!Q ˆËrñ;'ãvdlTgÁ•â»sÌ„zÃùøD¨C!°ZB °â:ˆ´(kBËjºž(€'’tçtá4 3;úa*©}Á§¬à'}7•œðúŸý_¨X%&w~3w<7^ëüBØå£Õ«qc–qD¢Šz¸À”ßÍ3Ò)uýQ̶ÚêÔ… y½EÔuàçs•ìS@l®ª:öWÛP>G˜¬AE¥Ùèþ"iá o¹epߊ.`¢¿§ç÷(0Þ•BÕ†åqÁž~Až ß;E±÷= GÅ…”-®u¾•“´*ÓÁ*}3†Ò×%yêш~Ë;Bå3夶Ÿo€UrqléU¢¹Í«=¯¤={¬–"_Í+PÜå—í)Lr©‰†ê¨É†È‘òJdZ¡µ9ë`%±ªü_?h„=雘о‹áeƒDáÿ2Þ8lº(Ú²ØÃ”6ØææÖ¯Âå­ÉÍX!ä©Á ‚MEŽ-R‘íiò{hE±„å-Yy¨ƒ½.Ão$âÿÄÍ7bežñÓ{ÆgœqÆglŽÉĺã,]ì(†1•ôT:…"§Vã„»ùw”k1ôj5 ±ñ+ÏkËCECŠíè¹#ö0_ÿç,øà­êæ€0Î3 Ùý ZÈQ'Qý1›7ªœByMg\¬°Í2×-†g Þ]p%Ã×W3áÑqZŒz¯±Æi…îùKu³_£Ï2>ÍÂ&Ø@ÞÛ,Û=¡±÷u"#ªç±=Ôü°-:F åÙ¤:–ŸgPŒè€ªÀÝÔùäJØVn‚új#ô|16<^ìT1‚—ëXø.F¾X¡É¦æpŒlénmЗ©@F&mð‚‚1¨>ç›Êm¥S­ ¶˜mšì…Æzšaò3“‚õ¢“©ÓµG^÷›V‚Q„SÝzpsE‡O™L0/oÆqS¥®&Qä›Âיќ`?‡K;#é&ºÊM‡•.GþSO7"=º|B•÷ÜÞ‚¥;G…ô<»ši>[éºÕ[¥ÜeJÖ¥0mÏuô6ý¥"6ÎÕž…rÉ&‚>4²Ï´ËJ.Tg°Û–z;ʬþÓÅá¹ÓöêE¸þ %iMd694‚/„"«ij‰8nÙÖgÇF‰Ä´—sÛÝ¡“¢Á¾z€±}ïÚ‘Þ}ÀνÐð2m­µ•"FÅš Zªí ãÝ)ù Æ×ü•Á¿ÇÛýÝÇ™3Î8ãŒ3Îø‰ñQ5J–yïÍÇ?˜~ Ë¥ðc\„•º¥^+uÛ¯u¡xô ¥ÖJâlÓ¥¾µk¨°çî@œ*‘ÛRe–—àŽEBÞÁmedp Í—ªª©ØÈôŸé@Àƒ ©¯÷¥@»v½LñÃ1V9ùM4o˜3 KÁ2ÄW»ƒùú'XFéK!nT dÖI¯Øg¤(¶Š ¹E­ãÜ8/…d[ð ´1V9­¦"[‹¯"('s#,g¯YÇ A$Ä_¹æ$x] èæÿüd»[ÂÄýÉp‰eˆÔ8E¢§—+BD®$맬Ѐ̬ ©r|X IäåÏ2P¿ â^…¨¢k©oW:i°ºWdþ²Þ_RC›«ûÊq¦Th¾e0±ö³ÊºÎ@•i”jàOcŸÄª´`‚†!™au2-ïû[`çf í J53V†<³V¥ÊŸÉÖalŽ©VH˜ ¾Ë‡Þµ_Öû!2 Õ“Ó¶$¢)ÇæM»¨›jEÖ+Çé~B Õè°W‡Dt›ZFÒ‘õK„×êºë®ùíi_Eý^ÂKy?©êô•iô&‘(\=–%mƒ¨€«îOüiž¬øç CWx9S‚ z±ü椾ãÇÏ]ƒPªö€.šä :°ÅTW™±R$·G04ŸJOï"w2vˆÚÿÉ#ñî÷Ên~ø9ò ÜgœqÆÇ$žqÆoë@È9ôFá$="›*#q¹®óM^f,kÂe)¸ª_ oZüv²ß²GTÿ‘]̆ÎÝòõg 0G¼PÔs§ùlp1Q¦„‚߆D¥ßy˜p6*Ç¡œ³ôªå}ËÆ’@2P‡£·zÄ^Š›Ù¦ïР]Dš /Qx¡¸ åÈ 6KŒh)3x'&ÅÏí3ŠˆF¥˜(K”çlD\Á\­ –Ù÷µhQì6"Ð|”MžØô±Ü˜©ü_`å® 0‘SÑÆ¦«$OEæÃ _ÂZÏnª-²X×$‚"ìC¦ýµÂ=ñ§lèLy,¶Wcá–E¢ ’É-¯<Ä$Ü ¤û½î|õ ƒ“J—?–µ$ìp&ªUFsû Æ—†|¨çhÚ•û¹ìÆÓ¢ò‰ËÔüŽJ«Æ¸ŸMw4ÞV¥*îŒÊFKnÕå-s¯5›0JM,œŒ6Ò%˜NTJîÑ´-ÃÆ·Ä2ì[õ[ §&cÎûû¸ÔA²ÞšÏ8ãŒÿò86óŒ3~Óø€féâ‹áÇÀ…倞a¿†÷Œa0´ëY ¬| ʯßIçé½bôbD_0D¹¢ˆ‘bˆ8Q±¨oG)¼ªäž‘? 2°=9NȦv£6UÝ7höZ.pö ,&*>âK&°xƒÄ†Ÿê"™ƒáÏ¥½}×ǹîþŽ×uOJ’©âòb‚¢Þl$®a厽F©ÙØå]ÑÓ 1¶z¸À‚‹/ÚzÙ‡ñúŒ®ƒûe}•á?ÊôÂ2çF†ÛìV£• ÓBñU2aÍòßjb Ÿ—ZïÌIÂ\²øŽr4r³kQÙ‚ÓZâ{i<• ãý•ÑaæšPPC„Œ(ª™”÷©D[I'ä·*¯ZÁ Ñ=g#Iš’¬þh_7õuäSç‡y‰Œú%+—µ%)´ˆ1›~„f‹|• ¯èˆ§³?s‘E^»å‡Ú°¨8‹eCõ‹i¦$’z Kê9LgC˜ny¦*Y•ÝŽ&½Ís3 G‚/ î5]Ó†p'Pn“b-1ð¡3 ¡DäKÍ"~έ ¤’”†Ê–"ï½,9[0•Á›‚Œ‘xtðÆ+A|^Ȇ“ :ç!y«nÊ$(‚‘QYM2¶ƒ˜˜ð5нƒ@8Y{c‘Cï½Y,ÿ•åð¾ ŽÞè?‚Ckœ§4Išmú{[1x þ4(íÀE¬±½èÀ{oð‡Æ¿¥nöÈ$œqÆgœqƱíð3“Ù­‡cuä×ÐKPx„±™Y2#¦äj¬y6{%ù¨Ö ÅSêòòP'r­qSx§Þ¸¥ Œ¦õWªFH"Âèb45¼—EôyîÓº‘t:7Ò=ªï› ×‡Ë ¯‘;õ^µ«ÊÓÈE))Èf«˜HÎ…è2=@Ó/Óùl+Ú×ú±¡ëëÛjfß,‘ªqïÞ¤©cUû˜-6Òö—x¸^L2zJI3œÑ‹+Í@|×ßgöÅX©“”^nÍ:×¢ÁELo´lŸmc:%Æc{iа%¨+!L¶4áHW zýµƒ~R3L~ó3Ì}°ó3Î8ãŒ3Î8£Œ[p¼ë°M6Ã쉯Èáª1-Þ¦å7:§3þWÉlÅ7ÙÀ"ïæX³ú¬9F§÷ëëõ¸SRæ0y¢¬dÍ¥HÓ療¶>di@N4P‚E#Õ# ˆó9ÎWUŠ7CB‚ç5¹FÓç9f~çÚÄ.sQ2ws_áMáP˜Ò·\…RŒ§,ñtMX¦êoB~ùü)H¥â´Ì/Å6p UøµöáB¼ ª#9BÛ6ųӤ­îO·G*üÍ„ª<ã-wÔ¢ïa˜Bdº˜E°/+¾;-PoÛG6§Û¤@Ñu*‹‹ˆÚ×)CÊF yAt×1=4ËK¥KóÝ'2fåQ2QbTïfT1ƒª$!”45T¼"Ü:Èœ-‰Ý\"@Ré^NXóKóƒ*OÓ™á]a$ÑIé1t„W½ %JzÓzÑ ½sm%ò÷!d“eÖù:,n ؃Ƈ&Ë¢g/™ÓhqÆAc£ËI²Èœ(B0ïM¥W«¨¶Ü/î5®4Iê|êZÄð5¥ÄÝ@Ðò¹#*9Ë_t4/5z6ÂÓÍ$aÏQ>¹³ÄwE?íi_ä{úzõl¥¼+Öuů¨¿É†$óþW蕲äãuä–›h³ó¿º¦Ô;D©ñÞÜü×J#6”},Mu8r? dsoóNïûÓ¥cbðoó$gœqÆgœqÆ_7>î2«^sÒFÖ¾*q>Ëúì“‘“™-4ˆ¹ÁʰvÜгܚû»¶M¯r“ˆ ]Fôþô·›p}g}Ô3d’™E& ð0qJ<Š1Žëb¶»U-ªxø†u e7„ê/šÚKÅIÅ9x…+dÝÅêˆrûmš¨åajùçÜŠ»ª1¦éöäAÕT¥ê ¼§…ÜÇézX·j€ ‰eˆ˜“u}ó%:RˆØ£ÃUA?µìÅ<)Dz¦lþ®vWP©Î¾^ùéઠ#aMÇO‡DÒg^U«1&Oì1pOzBY»— )ÅB¡Êð—‡kPL°ZÑÑ|ñªµ„=¿XK‚ãk+’A’‘¥•¡“"7Åí&©ö‘Pi%ýІv+ ÿø*[†Eê’TRÊȆ«¡WRæ0µeBP¼¸ªsUöŽÚt€¬>€Ûª£7s{—Zç­+°¹ôñ¥LÖ¢ÿúyPœú†d¹îjã†ß@wñ] d¥Å{,O%•[ëp¦³Ÿ²ÆÂí© pžó „jÉI0ìaö— ÅmÃmÖ é)è ˜ [ójðI,èû1L޳ ºm©šqÕrݼ¾Ø‚hu¹ü- DcÙlK›o}SÝuÍ ?}ÅæóÎptrqÑÛçøÌ`èà2ªžÏ$îMõIC‘ ˆy)¶7•ãt[?Ö32Z-yjÄ­•›´c ö;:êšZß®Ê=îÏt‹õ‡z9YØ`üû•ÁƒçŸqÆgœqÆß>‘ÅkÜs$ñ´‡¯ÏRñiW$‡Â'@<³¬šÐÞÄ.ô”[Ô ÜcCÛJ¿&½yL]ö;(á5¶ì„Xµ#›‚Û±8=Ô 7a=T”è¡.xRnQ«KÞ’\±8n·D.W“¡¥à—´Qµ Ð×)[LHfþÁ ŸjÔœQP{»+½`w<)ðŠTװȱà {é`Ù º‡¦ÇCi]7 ß’’ íQEÙ5ؘ— Thcœ¸ŽÐf©þ|Íöƒ÷‰¸¢'"n†÷l-(ú ¤A5´ ³¿SX¦òí©ë²QHùiéZ‘¤%,`bøQx" /©¼|ý&*´úX ”'§/JÍR`üvˆ™¼Äu‰p. ÐÌ™´ µ0–K±UåóWÒ/NQÓïð¤|pöÂvÝÕ<¶÷µøšMÒ5åA±Ð5Ä®ë!'5F™–¸¸’$Âx_Ìë×eWº=&l,Êœ¤Ý=vk,^Sššþì®Ò êí(åŸ× ú´w³‘2'®=ñ²3W Ê’ó"äñ rVSá'œ7ÊŸŠQ¨ê$P6Œ/ŒðÓÍxûJˆJsÌ©OLžˆ "üYÿUûfËœY4Yh®ÝJ¯$IÒáÚ)åT|g…ì"í$ZH®bøÁaV[ľ¸¼áé ªÕäBSN)I þâg ÃÁìR]kèä4#‡ïlí©™?§¶äºf à¬%j”HG.‚ÑÄ€ÀA™ÔE44_lÎm[’ÜEº1G’[.¸Kð2Åå.Õ•$_i†0Eûú-E–e–2 U`æ-ZJQd}›À Bµl¥-ˆªÜ’„†Ç} noUDÎ2"•è^Á„.zújÿ@ü}µ>XÞœf¢\TèÈ=¬4ZBs*s†8㹉 ä×o9$4w&¥EIÛÞåÕ’†ym5CÃ"¢QeÉGó*˜£V™îÎ8m̲«­²«ÕØb,ßízhÅû×ÜR­ ‚'²& Ö2sdÔÌ<0æöóc½nö)®xH/îÊ"ÈÂBó(ìj~×±ZNË"Æ÷vbÎÍwä0ñùq IDAT|åážÁf½.|Âx©KÜíLîžh³©¸§ûåzF|þ&Ü¡ˆp<Å ‹U8ÖQ€Q –-\~.7òz`qŸ†Hg©³¤Â\P'fËÇž±)–‚¡\fÏ…™íÙ¾ôo¾ Æù^!ÿ)ÿ?ãŒ3Î8ãŒ3¾7b@‰¢[§#Æ®wËíó}&b„Þ}bŒ®á°KÃ;<'gª¶½S©Zz¹Q 0\U–HWp­?³€é»n.Ó4zß•z¿CŒ|ʰ¶wôû‚2@Ì~2eIžmê饋Àˆ¬½þù‘h^Fÿ:S´3T¿¢ãÿ™•'ÒG#‡uuÑC·Sãp‹[":&ØB¬ð`øoòŽWäâòÉUX[zM¨_@[Sû&˜„n»E$ût‹Ÿ–´·xf¤êcga0нÖî¢6‰ °Ô§›‡?èÐWò& 9qÔt3YÞ§ÁM$^ ™cäº}À»öq?mà³\v;UÞæPHÑæb‘1¼AÚjS‘|îŽÜÅè˜pPHä#üˆJÐHbršŽ˜#=·¤5£C­H†Ô t¦K­¬À1å³ø„†ÜÆ­ W¤YìPŽ"P[‰æ±WÿÕ»2ªÙJŽBüÊóVº¯ÈÜyöyê¿’a,ÝŸˆãñÓäËRðN=!¡3@Å]æ“—Öi°SÜæœ­qìúz^¯Ñ"•´YÉè£ïÀÃÔPÂN:¦]îÈÓ¨jH–êë²z³Väg€¯€;)âo:Õ±zʘz2K sÇÇÄ@šsJ={–ûb:k¿8£nÿ•/Ñf7`{à«<¿Óo*´Ç↷†zííW°îŸqÆgœqÆ¿s|$@œ ¦p;©^w‰Íój§=`ö4<Þ” …‘üT?ªrÔ}? ‚Î;—†àhíÃV/Ò1Q k;e>9iGJkŠ»_#¢_Áµ @žÕsÔo„Âý©ÂX`®§“šw †I1—¦èCøâ²©ÒJQä·„<1ò$-4Šk‘Huº™\T¡Æ·uÏçÿ¿Îñ³çúO\/Œ ›õ‰„Àì~14NÖ£ ‹:ËDy‹ù¹ /Àå äÊߘfžç6«¡^ŽŠ¤ÈçÕ€Wé)žâᱪb23ÌgïÕlôÂŽ©¦µÇP;ÉꙕŒÿÝü´->a&ý`#JÜíÄ΀£ÌaÐß–­Q]o›+ìuIʃ¥KdnXÎiâaãÍb}óJè ªâ@–uÒt…ªa”«ªNšZõuÝo1ò¤¡#™IËŽ‘2^™¹oÁZà”Q†ïjb(—B2÷‡(º6"[»€ÈóþŠÇ¥Hï²PÏȚ寺´Ð,eúTB[×›Þ׌69âžÒ-¼÷ óüÛRbº–§ã²/[#wÏÔíUÊ+¥MQ~Ñt 2ûa6:ÚœJ–˜¨-·uvö e|F‰‹ÝÞðòTŸÄAiaO¾IÝþ²ed¦Cd¼гou·§¹š°÷œÑX­w¤w+´˜û1Ϋí&è¿å"þ©1Ì~hAÎ8ãŒ3Î8ãŒ36LJU1Ü­î7ûçúü/¿ïNÑN8…l´¿­*„€pÍ•{˜5k„J”Ù+fïxlhdîøâó[‹¤è+÷•S U 3ÔªÜ8 v†âîbñ=võ!,¡ãJ&樓Á2!rÛ(ÅOŒA¯½ úZE8Þöýø‹#\…11–Z%d¨©Wœ ö:ÈÖ£Æú«dsƒ,Uv0AÝK)ÌÒŽ³`ÔÉ\D\‘ÜÌãI-üÞêñÏiw;ÕÔƒ† Aˆ«cèÒ~‘[FÀv‘¤X"ÈWá$!ƒAT\¦ÊG”˜ßC9Hjæ2 ¯ÿ{\õ›ž£†}Ù2ŠÌ¸Ù³ÿ)uJóœép¤ó=©'„ª‚’ó¡©‹8´ÎP£–ƒeB|ÇvϤ{ä!ÖE'í(nç|}ÐÁR˜ ¡¤úbwyëÝ6êA,Ü-Zàé:›C …ã¾æ ©Gð>ZÃáŠtÍpÃ¥Ümsj8Ó>^sŽ¢”‹Æû\ãæ½Æ¨–Ñ¿Wê“î†Yf|QžÌÄæmÐ+×èSÔ˜/uÉû¯CkXØ~ú«ST…? °_JùàŠÿr„1§6Ðÿ¤©ÃƬù&@쟵¾nãüÖ:"púfS–0ÄYº”N‚2DŒw¾ËتÝêmÖõB±9§èõ&§ŠùÚJ=v[¶º„.ß g&‹öž«ü½Èi»=ò7Žz7m=ÕJtíWúÎ8ãŒ3Î8ãŒ3öÇÇråÕÑñæÓáb_PÁöÒ7Lô2Š›Noà*=›>{ð…‡6X¶¼œ ~¤T(Úp³`ßÛkf¬+)š^½P1T=ÆÝn`W¬— XÀäqÿEá6d¢üŽ¿åu5ѯ¸ÔE„{PPŒ¡IY+7óEqPDÃôG ¨G¢,„ñɼÀà ßH„±ð-Tº§üuÉBª&©‹Ä0E …ò5çÓÁpE‘t8ŸZ€P^¤Sï†Â­"l@™™ˆ…Šë檼*o@‡…×ø WË &Y,Tæ°Õ*GÀ7=jEöoâªô>^Ù÷®`œ¨¯¿EЮìÌl Â}œ-ã}Íô*/Ô›j]9_”ÊÌPT²¨EòW~ W fmñ,¯d­‡´^Sy™Z«dcÎ|]V1ñSÉþ:ìÜ«{wÞ[Ú«Ý4±a©’fs}E6¿9Éuªza_§Œd®™“S]”†KYöT°ïxŸ|[ã¤eJ ·k¹x¬ÇJ& ^º%µƒåíš×kòúŸ†|õEÝÖf#-ï!“€ñ°«ý UF#š)†5MÎÖ1¹Ó` HéAïDiúD•†’¶Ã·1²,0jÛåpN%è8ýÆ"ž%΂®sÃì´gb»JßwKÿ…c)Ìö^îáÍ ü_ïšXÞ§»¯}ÆgœqÆgœñ­ñá]L–Rë-‡äåã>q×b š‘†VÒøh2PMý#€³äªæŠlèbsªÇâF±Gf¨Ø?@ïÛAQ9[D$½ këP"ÿ˜QÑ>=~1rž@­âlgf‰1«…4zZp2¯‘maÚ•³Õ*/ /Á{üžŒì½¼)žh£žè|õ=ØçØdÞþ:$úçùýSRùÝ¿ÅÊTÊGÿÓÿAÿÏ8ãŒ3Î8ãŒ"Cël±q_¾‚¢GãBÍÎP&éñ eU×P^š‚+j™…Ït—w¯%61ðä"”ªp.SœßDË»ú¢éÞˆ8cLE×5¹"R8ùEöMË‘6¸1ñˆ\y V‘y×=L5 õãÔkÍ‚2øœmU@›6Ô·8ˆrÝ”c&ÌI c¥^Ò±,ÚôHw³3?ŒÔ5®/6˜©fHÁÐÒžœÂÞ …(]¶%p«@ýDÌhG2p"5Àº>ÿh­w—5€+¢Ý<þ";RÕªC€•æHšrh4—bG$z¾Jûe“~n†ðÙÐN{–MK€ÃàÐóÊŒúäev™é4çV4¥/€ž©|ÛâAs«ƒ æ ­gœ:ž\n(Îgn%®„‰zÄǾVóS‹¨£pñ'qj¡SPæ[i†§;ñiCÂÕpù2éÊÛÖ1øù4Õ3çÖ%N FœÑ"gyÆÓ©Gžn: .¹L;¶1Ãò_³[¢„LÂæL-)¿{5¤í‡˜º.MfiJSƒêÛç®ÄŽÇ²óŠ!À«EI”Ëý"#›yd/}AÂì~˜sà)·4²s’³ïiøl‰Ïä¨s‘¥­Z'!šZÂñ¦é-PkúÑæ_¯\gá²ãÏI¥,8âæ7›³‡wÚÓÎ8ãŒ3Î8ãŒ3~Ïøhù¦JUkêÍ“BÁ¾Ø$™!³Š® êÛ†îc˹úV=I–›S¸O’ðÒà#T]¼ü"l>ÐÆÃs½ØðºÄ*`È.h]þe\ä' ,LjpoŠ€g%ç+|^ê1³’‰ÎMÈÚn}~eM.à Ïmp…:¡°¯øìE%  ÒÑ rú¾{(bŸ‚xšÒ$t@•}>Œ4{&IØá<+iMQÕèu]#‰FÓ4WÖþa±hÔ‹—&¹BS7å¢h0â÷ô¨÷irûá{žfÏ—Šû¬‡œ@œö\{„7móG„«¸MÉâ¸2®|^ÈÂê–ù:Bí~?ü&û'éZ:D ¡]HíЋ/üAE|,)VbÇF,úSüL =/Ù¥nXo,)ÑPìjÝ„ÍíyÿpYhY3@°Ko$î»ÄÄ ë¾9$B\Qeäº ËçÒ mo5׋ơZS¦a‘-L™ðÍÔIË*⺕ÄÏFÜ„2+€Yη.ºvFÁÕ{‰6Hër¥~<¡çòYk#Öšr½ ¶îõÕåÔÁÝ™É1CÑGÑY̳. 6”2YíÉ/9µÊK] ˜H€ù„“?wtVëó‘>ÕbŒß¯B“¨at-jÈcúpI”EÐHš¸« 4UfPûPÓËýUx59ݼøK±ô í°Éeý…`îŒ3Î8ãŒ3þºñã|€ç üƒãc•³ \rdQ‚[•Ht±b )1­ôiÔ‘iu£D>ï8’ìCq (ÈæaOhÛ "¹²o›ŠM "Pö³šÊo©Bå²Ä–¦¤D¶-×/Œí¸Zv ¥Ô‡†HÁRk$ÚÎQ.2(V7îvc4×c92t(ö˜ä«IüÈo‘HTn.ãxx%"ˆÀ{Q ÞÔu¶A«£ x¸9¬Á (ª.h ½DëÁ–ܦ‹-á+‚ÃL­­^XÚ>꾺.8£XF¸e/mBϯ5Ë¢°7™‘1¥*ÙIT«uSCDFæ÷Ф‚Ä)‘;ûêoæòv*Ͷm³Wg…é ^4†î¢ ºÉ(°¨q®ß…fUÊQ˜Ÿî4÷5ƒàüòª„cåâe‹ºæ*ÙôÃè0pÝ ¼ê6Jmû¶ƒÅ©ì[u®ºéá(¦0ËäoÇTG‹Ž¶œdoyžÎ;êÌEµÀ2ÓÃa«GÑ$QhŸ9µ ")Z›ÈÍhcQœLDÙXÒἑ-ŽIi åAIËQn¡bp(‡_ÝŠŒ¹ÈUèüÙW2ƒ•w«Aþ‡…Ñ9É› Ù@y¶À‘Ô-Ê&U‚ ¬‹u`tÀŒ1WQ ]RÌ–g)Ée[ßyÇÉ ›#«½ÒŠÁ°ýM0újc ßí‡àÏ<ß`÷8ãŒ3Î8ãï>–]¨¿éKÏùÓããÝEGƒÜ %ØL60Hdèd–uuÁabÿ´$E ÑõŸ±Ý½}F#%d¡ {¦Ð®"›i¯£Ãï¬;»9üU%„ @Ð.ͼÌ3mq}Á-"åÔ¦]´R±¼ç]¹xf¡0bÙ;Ê”L,›Ø DÒñäøØx³ö*Ó,P¿¬ú£ä4€ ׺þG"Ð ÃOÌñÌÞTÔEôµ^„R©Û&R‡eäÌäoIKâëìr3 FYöƒÿ¢ô$µÔ·û ‘›¾’ ×ô=” ï?´ûGŸ@QŸ•¿‚kýñkhÈÄÏÏ´YäaøZ£×A†Ë:ˆ{deË 0Q`V‘³^C$ðî5 þ»ÿ„ñK™{”4³1ôèÀ {Óõ«MSí €é‰Ù™§Ûºp”î¹ã³¬…äÄËÍI ÞÔ–üv¼Rœ¡Y‚¡ÀÝV8;"té ?¹8©FôéÏ ?Àwky­l+Ý~¹Ð¼¯‹f-,¸RDlB<8¡”–ºn‘ ³"®3Í›Òb¹¯Õ“T34¦,IPæW`‘#f_èÐ.Ÿ*ñ¦]ª­7›¾?¹"Éáèš/œÒýXÕû•ÏÔ˰~£Ÿ=LqÆgœqÆh°Æ–pœkõ7Œ7ü¶®XjÐæ^™êƒ)¸A ¬6R*¼¯` ¹– ™v9X{Ã䉇‡š¹¤¢Y8Ž#½Hæ¤oìDꮨÏb‚jV;77 7rÀ• Bù–2»ÔyyÕЇÃh¬ 0ZûMªØ]ÜÄvWCç-@ñ"̶"ãY˹e×R&):3D•¦d3Xrp 6ñÁçIˆðÐf£ æ¯'è3Ò~z8IN¬;¥c\æâ‘+?å:¢ü ²83E:µÛÌw‘©bW÷ø´‚ˆ,LÆþå ¥¯A`#2Di¢•áˆCã•TÇés :´S1W0ç¨rUò Ńå­œKsI¾þÐ7˜b þåØ}% XsÛª¯+í"Öž4àš”Wªy§-úQ,rÈ,åL;”*µIqçèRÝñ'è»Ì¥m²«9þh…åýi RÖÿ^)¯5 {°¯ó*Û·P¼·¥CÁ){´1$Øz¨‘UÛYåJiŒQ‹šÚP]ÄgÔØ‡ñå<ÔfPêìxîçëú/Õ$êIŸ‡Ó$T½þ|hܬÞ/Æ9‘Þ'´u™JÖæÆK¶:M"»îlšJ+{$r?¥ô­1x³ÉÎ7"° Ìn’ûnU½tgÊ•°Äõ-´I[¢û(‘ްÍvÚŒ¨ß¢oí>ûOï߃à±÷KØö¹Îø«–òŒ3Î8ãŒÇÿëÆGÉ@#²¡. uÅ -`xËñlJWî3E¥Õàg`téFé]¡ñÈí“ã"+Bó2§j2ûô-ÁGGªÒ»¿>fËÁ )?cs}ý³5ØÊŠi€‡#P6• ’õÔÑþ%†=©[1è¸ë‹>£â§R­LáY ?Al4ið) ®}ýGÔÁã Dùš½ѳJÚYÅÓK†ÀJ´Ÿä®&úÄ~>$qm oÒŒ}wÄ`âAW*בM7)RÃÓùöã©o,#Ðõ^¤ƒt‚Ò¹ëtHÕ_û໿”y’ÉXº3ÕY’ öYt&‚‚ôEÆ [°äÔGÉl©IùJà…È8·2”íÊðt«·£îá²Rl,†F¦|®…‘õË´yo›“vÅ ç¢2àÄÉ.ås|ÛIJK’ñ<®11j4~DU§7h¾\:¥o)7‹ aá«/-õ!Ö±ñs„q†PCÙåh2áòyÆ­P¤ì©ØK% ñ)…yº+Øì°&3¥/âþ– 1TκV ñ”qMw‘LÉÔ}¾*mH´¦¡S)˜”K7Tl2MÄzˆÂÝ`ßæ;xŒÊj-ò‘ÌÊ=>!M4¯P¤&ÀÅU2|©ù<+²ÓnÔÁS¾rh»\ÉžKþLÎбTu­T|¶ž(zòyøƒ ƒiýcÀ1p¿Ÿq§3Î8ãŒ3ÎøëÆG¨lB†-¨H'…oçÜP VÀêžGëcÕVe³ Ÿ¿ã‚q•}HÌBÍ›¶>tÃ;ÜÖëa„·z\cñ;ÐPÛÝlαå¶iVšF÷VÈ"Óþ&°)!’±Ü ‰EÚë«Çe{DnIrEˆøÍ^ÌBAq´Ö9V¶bà ·ƒÀ]gó!É””62:ĺo«,p%÷ÇCV>å„%%®¡¹Jü£l?Èà“¥Ü^/7gú ¸ŸÌ@ص3ÙÆÆ×S‰n÷›g׎1ÃpÍ¡óüÚKSÙ£úÉÅêî±æÌóÎppÌý<ú¯¾îO’µ|X XéÏ‘D‹èêë[½ “9šñ\˜>¥¿¤Xè)Ð ·H†h çu²Õ¨1›è×zÔ“i,ï]ÑÝÒ~?䤬XZt}àT+bȽ Í Q…Í+SqøX£ÉZÖ<|:wâŸT`ÌT®öKéŸÜc”(ü@x§vë!¨2Cê÷ :<{Ï L0‡ÒWЛٿ}¿9ûÂLGÄlhÚü«œ©B2X ¿Ëp}$ý".,«þÚø0‚9åU­®! Ê‹#0³K$‚¶ U5c3ÁÊ•H-sébó"œçF¡-Úb$À‚úàZ˜ÝÊ;V`…è­Y“˜©,óqÊe®@ÊÛ©Hœº}hªKcà1+F‰Æg)Öõ•ï„‹Uá²Qƒ+AõŽî\¿.£Ø†ÝÙ †A÷u/ó(°K6ˆ à Û^Ù̪ˆ{=uM¥‡ÇÄ1à¡7­òi¡›’^ÉÐßø±‘¥-ö‰±®¢6‡e‰ã‹ªd_øJöx‘óÜ ù÷üç{Iáj…:—­vÑ]¦¼s±×'׫ %ŸÑ"ÈÓ‘$!>¿:^ωhÏ£?GŒùž¤2íË:\QW|vƒÓë£Ð¿h;ôòåvÜãŽÃJû’NŠášcÑ…®oq_ߨé•%êu ?L¤%T´Ø÷ÂaªLº½t.8ß³¢º¨á:z¼ÐÎ-ÆÓ^ñëdÝ@qK*»>ÿM÷ºƒmøð'Gîà\•ü³Öy¢ãÁÌ“žqÆgœqÆ?r|´=›I­©%lÎÃÖ®ÏXW/Å6SDhŽ`[1ÂW£`3džoœKjÀÞ¾Ö‰•R¦cåXŠ–Vwj¦æÜüüN¯/¢Bû%r(ãgº›{¿ñFPÉ[ bõ+Ø j„ÐèÃÅ3ÀN_n$œ¤\5‰øÜ©‚6ÅŒ¨ÄJ ¾ ªrµ±X¸¦^àÂ~ùH‰5 L/‹1adÏ *yÚã³V½ÐP´¤“DY7JÁ#< t]·å=Þ¼¡YûZÚw˜ -™5™ÃC+Ã^uöš5 ÄŸN+®löžü# k`ƒ’ ’‰§ô Ëž~PX­kwnZ HiÒ^Ý9 ìk'ïØN‰@˜ £ë›R~t†ltE'V"·>{= DEi‚@e@É=ã2š~×êño>ºBh“»‚'3å‚êò뿲€‡O ™$Ì F.µ2ëId‚“¢aTZåQ³RŒ¬hï=ÉX$¶QxÞýU˜•Eã^¢¯õ-Jò‡.9á­´7Ðݰ…"Ü\š“žÁűa¦_«”;mûËõEA5zÛá 6Þ ¨©¬¸ •¥+øOr+™¢ªí†òÈßTQ×_¥½½Ú  ãÊìÚœ‚ §¢ôŸ—Àhã­m°Õjjy_±Þë¤,ëNÒV_sKb}ïÔ‰œËhj³NÈÉajOL™ø/b1EW•Ž!­çjI¾J³Æ)œXäš•Îb'ãÎã˜`¡5òQ¿ò}+ð.âºjÆÍIyûÛʨ} j^žG1]Mvþþ=Eúÿ~è›{ùgœqÆÿ­ëáŒi|$©1 P×莅ºlŸ‰+\‰‘ÒÞð.¿æYnT%]èéQÈÛR¯Øý­—M`Wav,²Ä.¬ˆ1,â# ¹‡ ÌLcbñÆðìyžñƒ¯§B(¥úŽ ™†É”u|»"ôê¡ä-)F&6É$&Àºh>·£¼kß$Ô»¨¤éYv*º§Î{uʹˆõŒtú™‚±“2Ð=T‡> AvÒ3Ë´…)XaIzzžêßZ& ¯JO*à·,3s ønLŽE NYÕ%ú°Vn6ö®ãÆ›Q€ÒiÄØÂróä”2”^?ÕIvݤ>ª’y@連2¬â‚“ÓëÒB9e‚­+2°ø(ZöÝÅZ7ØÛ*ryü‹¯Ï+ëŠÄdJ1šNi{ú—Œø¼ä¥|ž{€× d§÷Â-Ò°UFà¶òÅÚ‡¸Íî®/¶À"+î¬á¢ôb$°m ÕzD"84Iî4“"3Ï㞟½|ôØslJÏຒ½\%ŒÕù‚ƒ ›Ú:Ìé5;½„’¥³'3Ž4Ì÷ˆ§Ùôg®Û’}8€Æù.k!ÓŸ; ºxDJšÓ©`ï–¶M¥áò%,P¸$76¹ØŒ‰êû«?uLj×ø{‚Küœ Ð~E¹ Ú£~…júiÓ<Ø5 û&ä_;€uÆgœqŒçoŽ¥×ÐaÁ¢–¹TÜ»§‚x¤‘ñ,#+¼£)ÞY~PŸo²±¨ìƨ†\· ÐËÀªÓÔ1ª¼fÖèÅšVe”P&º:n kó(aÖ;ý:N*™·°p)ØHmP`ßÚލ±Y÷qE‹E&88âË¢ ÆÏGb¾Bä­¸ˆæˆ ß\õq¾žšýMAÒÏ ´/p–ªO"Å«BgffÏÏçDï«"K{ì±5çS6z׹ʊ±¥Üøs~Öì(c¸sq3‰%Fï:KžökŠ©so– õ3ÊøUÚŸªöÝE2†\ð«\wFZ’—Qú¢¹ã]Öjœ8ò×Ùbñ½xx5Y{ !ØX˽7ônÂÎY*„o9hi£e[ÊÍÂ(°œÔסޒ^Ak On @™$ÍÖœ¯Œ®·.’ µšÖ»G-Õ/#×ïKû²‡ï¾VT“–¦?‚†D߀Éè,¿êÜL÷à€×'§ 9[¯Ñý¯+)U®< ~ãÞRÀ² ‡æ I/¥û]ñvP“)ùÕ¯•È×aìàc )ÁM¥ø™Ï#‹púëÁøî¶ÚB3ÑâP®ŒwÂÝ +†·ãçYà—eéåþ|»/©¶iöwöö¯.µ²¿ý  ïÐדƒAîUer§7_á?€ëã?ô®gœqÆgœñ§Ç‡„9¨ƒæíHQG _8WÒ ­q›€DcIØtÁšÆpb{­…Jc°V`mNzðRmµ×P o‡’`èÉLâh Õ£€¾.)Ž@©ŒRÕ%„RžðÚ°ˆÛ¸ò™8 ¡E“bBQ{`4ýËÆHÀŠd¼M¿ÀȽž*"åÙ…“åHÑ&ÍU IÚÁ2„œ*àžÁ¡¶x¯_’›­Rú ¨ FMå;¹wÒ4ôè{^;ê³ V³Ô½BßuÕÿœÈ¨½/&ƒ'xaËTÀ*„û‰®D/-”ôBÍ)>\®(–Ñ{l4ÉFt?¡«dt–GU LGw^Y”iBÒÄ„6¶äÒ¸°yÈ_°,z2ÊJ|øÈ~s¡½![@(§4Bžój“U\%4-ÃÓ¢¤”fNöPâ wµ‡À‚a’a}õ‚nÈ,;ý»ì‚U.¢5Z`ð·W 6íÌ…+Ý0{82‚€ˆ@à&¶n*šÁÜ<%ÔœÑóm8l|“zKí*.žš0ˆl]`ÄÇ=†>_Øäæ’D_sÊÈT“ESnCç«8™roìAÌ™{„á¦0÷ÉA9\Å™‹èx”ç…Á’|6¾ ØÒiþ—oWd-„(ù ŽÛ¢QXÜ\ JÎxxñþ®dZ÷ñdÇR–ﮬvæëê² árXê4BZj7{ƒ–£­fs¯×ÒlEQõNÖl¶Æœa­®`ã$$ŒŒ>×îZRÚ–)Wý¿ŽbZ¤a$óµ’üL¦ëcÏXw®FÒ³ÌÅàÌÀÙC1áEµuúÒ(žŒÞ !ÞèñY¸¾^xàÊ¢¡&WM6_üZQþ–š`0CÂS Zô![=Þ„f¥ôˆ)ï‘Ã$—º¦µX¨—…` Ñ[.%Ëä¼á¨4E'B2ªØÀUçóûÎÒO€¿›~Î|¬ö>Ä7=…?ó˜ú‹~`ݱÍWùÎgŸTÂgœqÆg¤ñ1a‹±N?‹Ñ1„âpa#ä½öN¨~t 3AÐ8¹a!âB…=Éá˽ül€Ÿ*¾cÕ.Þgó¤br÷1áEÜeŒÃ8WÈ0”âXæØÃ=©å—ã7² Á¹Ò­%-Ãý×,-íiö`ЬA»O;†¶[”ê:'诀&º+癊…ÆDG•líWøšÊr™‹‡|\5×tðŸ |Q[Ø‹zåÅ-ÖÀ–ÒÓZÏþ‰b< N¢K‰µ»–…qØn«$OŠQ>‘Ë¢üɈò©Ï#/«©.Eu™ ¨£ø¡ïPJÇ^­6wBäÝä7¤‚ìNþ?{W¶ÜÈ®äÿÿ_a,sA’”l÷ršŒ‰‰{Ú¶TÅ=‘H@¤ 9ƒª?íè«Î Óç0`·« &™Ž”4gþFDosнkRÓ“ T›br%·zÑðU'db³iž!ÎWd1R½ˆe¦p=îïp‹~BLÒ%\^ ŠˆÊ´(ì ×3ÄÄ~Ͷú:ª`w\´¿ä¥q5YS… s£àÝ}úœº)-/?n6¢[pNìb•MêMÔrÑ™µ˜ ´Ýc©H®¥üE_öA®Á¨;ÅõL*Q“Z˜®,4¢êýðW/óÖÃål.uÄpéü¥ëøT™þ vÅ-Ä KH †Çl££p«®;$V+ñúP‘–h¾Â)Ÿþ|‘¶¿OVÀr"ç[„¸ýoØ¿E}ã+ñΗü9ÿ _i_þV~µKßixa‰œvÚi§vÚi_oÖÇáòö$#Ló¬Tkd@™¦ÔB튚cÔÇZÑ.NîEl^ö½ËOEZ^i•¤0¶5u£à+ <6$­hÝ+g 9Ȳ̖a8®Õóy«Š‚Ô$ЉæAÇÛ´@0¬Ü=a½»1À@Àž4¦fÕª?JØÍTpqÙE̵-˜ÅÐ1à`w³ÿ«‹‚™žÇ%VÐ^ÞÃ4zëp‹—vw©š"û÷ŠêŸ/~O{Q²ñ`lè…_ $½Ã-$’!`D:$"ô`èo`å®=«ûH4D/ÊÏÊBž”ˆ&¢ ž,oãþ1èä¹Ì奮Ò+ô;mÂ4€¸¸½1`m…Û^M€Y¼²'øKȸ≙ÃUZ’Ðû°9O­Z€•Ÿ¾â¹É_a+Çì?‡êH¡#ž38ëIÀ䃆ú €‰˜*ÝyšÃHêáÙ#'AÞˆÛgÈ£šeÙú`fJìU×$Ï`™G™ð&4ˆÈ’ŠNõÕ'áÚVº…q‡¡÷ìq‚?—ðÜAƉÐ^¡ÞÖíÍge¨$¹¬- ÓFÍ ¦ô-܆¨}­ã%erA…ò}ÉõÖ0m™kѪ æŽÿWÆ6“Í"lõ]r4†T™)JÍê ,7ÊyÆ"Uñ"÷¯Aþx ¬EØ‘–b³öWˆnÊv=€ßdóob¼¨ÿ ¿ñ‹¹UÔ¾~z6ÔßÙNÀi§vÚi§¥öaR¹œûw„@Z«]‘áCôY(|}CM,<­6täÂWocP^…‹ß÷:²<2Ñ>ëóFõí*<* ²¼2;ÐÆ3²r‚ ¹Hþ{Ôèj2®LŒ×‹-~óФ‚l¯W0ް1Ç`Á~%[—Hë€N"S_Uù=z;Ñ™Fà l}à* d”ÎÀD6JÃip?ìgYôjâjÈ·"Üì¿önw>¾ô3ãõ)14ÊhŦÑv² ›³¡_â‘V"v‚ÇÅÚGrse¶õæDé5¢ÿÅó©…±¾üÊmüâf‘›:žRî†K±|êdÝçOjvã‘ÛfGÒܲ%iA¹“³³ŠíŒ7â?œÜG!¢®”)aUŠ$ýœÄy ¥ß‚ú$‘ 2 ¾o=Ì¡e÷Ù‘ìliÓ§’U#¦eÖäÊÕ•LO\RžAþw’,Uò6å*úçe¨>½- ®*¡}†š»Á ´³É¸°yµLj~mƒ /‡aJè „µâ+ÃÆ>B*ÊÛݳá¡m•þœì~‰i¡óúl‹7ÅTgލ63?ü.£É_J,6 J¸Ÿý$¯¶_*ùû¸\ö¢œŒõÛÄäÂÄ)µ†‘‚zBj“†Kø ÊŠI¬Ê O›MÒ½™8¿ºÐ¦Tè¸ùÝ`ò/Æ×_ ¬~°áw>Ò2‹ÄßÒ_/èt¯~m/óûçÈi§vÚi§fæ+¬¸@4Ù”-Xã)ÞDäìcmëäU¼ƒk½7£ÈئúªIÊ@Ð!U–9ÐÌ”ä‹s$"+fùÔÒ{:>Q'ÂRe¸ÈY¤Çè„#ìYÀqiƒ¥'îsu~¥µ^(‘=Q~N‡ª—±NaXV ÇøðÊVÞJô^m›C4faD¢Lª Øuyï»ËF›‹ÅŒÚK?'ß]p“9Áë÷¸B©øî–ùUäë0B¾§$P©èqlaÅ4‚A€kàæeÖAa4V듪ª| bè;ÓCÌ·ksƒËÛyeî1, Â¥¦5©W”5›*KïÈ ]„D³\!Ó‰žÉiÔǼÉ­qí%rͲ¨Y‘EV®¦²ûE+^¸¼\$N€04™¦Ý«—m9¨´á9ÂR+3’ç}Z 39Í©Üät 5|‚ƒTÇ ¸© °f±33)ÑOÍîá·ÀhØÀŸÊÂLÒY>ú+Ù?X7Çû[xàR³(¿ûÚÍŠ¹ŒˆuÖ'yÃçIú!qÊì¦äé÷Z8‹ÍzñÉòûIU EíÇú?¹H¤ RJSÁ §“,Ž—2µNk.ô*¦ûf«å/Êу¾´%Qjü†3v’¸Î^ý\+¶êPŽWèOºÛ¤Ø®¹·;d¹þµÖï¸,¢úiìú¯Ö{ÁÖ$z’~ûòs/ö—Ëi§vÚi§ö!yš_YõyIwo¿‰Q5ª©[C'cÂînäÉ­û·XŠËýDŠ´3hõÙêÔ—x]®ºŒ³ÀI{•ªYþ2ôb&õ[Òß°´ »˜'R¡si”ÍýNc^"TÔ3Du`äP²Rkɹ)Fá…SAlpÀô/ut2Ÿ9F•Ð1LeM Qõ$2Nõ€ˆR?ààiúdÒ­!Ï~Š ÝoCì³ÛÀS8EŠôD·öæRj®Åy87L§š3rXø©Š¸õ*G6ã…˳k)£S§Í|‡ ñ?Æ7ŽÒ"ˆBœ 6ýù<ˆÚ8޾MçÜ0IŒ}~ÂØR’ º¤½í¤úEýçSê·ày#_Bôtïê~j šµå-‹¼ËTgH+våRÎrÝ“ùF62ë Â};9€­%œ ‹;ü¸¨L¦É3K±XÑ;EEÅ!@:fËå_¡|ëG³;_¸%‚ÕÌnáÌòÿj•¯d~ç‹ üÓN;í´ÓN;íÚ‡9¼ŒÐ+—ôRƒuÐ’1sÚÄw*q¯.D©ˆ˜'©Ü@c®xY ÔK2àÕ›#Y&ž®(à”¼ Òæö¬—ÔâB=íˆ]()®È_£ÂDÖ‚l&¼ Œ,uËÿi–A1©í.Ç݃ƒdQxGŽ»¤\æ_ïL_šÀ&VL ˜* móHqp´¯_~0÷“Ã\iŽKé¡’²/»ÝXR]Rƒ ESl!³SFyþÕÿžpž_§~‰ÝÌí VÆzj5Ðßç¯ßh7ĤÂT×@b õ‹PHM|ªKDõBÞG¤2Sï1M$GÒ7ÇA®3“j{[«#éC¦3²¬GV)rü‰Á0½Ev?â¼ /âªU“s̸’²‘áP8{–h V~—;­ïó$æ3òŽ è0!Ü2 ›( *!‡‚ð&99-3©ppWYb <åê„ jÕ SHa}o/ßb&uøj½QÙWyn›;¬2"˜µ’l‚IAìK²ò å­9HT¶pçIΠS?Ö â$Òe:çù·²W¢Â» ¿á:¹¸ØÒ– štë½,Cdú^'¤{+×Ï-ÉR«¯-@½zÍåQÊ•ê©k–§ÄÙdå‚¡{$º­Nšˆš(:H=Ë‚þ‹ÜÆDàHþçv)žõ}Eµ.Ä ŽÐHXÑ[ž”c%½Ç¦ÔÛVÞ”ô´ßö²‡¾~Úi§vÚi§ý@ûh¯–Ò:,†»„VJIÚ#ÒêÊê¥X'£2L+4-EfzâNÆ’£×DݸÃ5Šª ûÏBŒ¾Ì2ç:áÕðÙßÝåû¡á\±DØ!‰¢®ÀDàÜà ‰-, WWN7 NzˆM„4£¦šÚ؇’êFÁS£œe–N#LTa"9©¼(Mz<‹Ö”JPèÎ ¢Ñ8ŠÊæa[Ȱûâ W[”èŠ1Ï®¦ëFO žIà»*ù”¬sÒªßFZÌVuMù,KøÆjJUÉðÝ©‘¾+'ªñºf)±&WÁ€qOv®kEg¨ˆzW$§¦ëÌš9 G>èöœV+ŒÕõçÕp V«I—ûyfkàçÔK¹×÷þêaÿa‹Wj^—V±¸U©D˜´O&+úW‡[þ5nÄÇiÁË$˜Cµ@)á¤,»†ú}’…â0Ù…±]/8û4ŠóÕݺ-d<‹­MÛ‰SlÏÙØ?˜ÓL{<ÀU–÷ì7–{6Ðváý#‹áÐJÒÃ_+±ƒcôÓ&Ã~L©RfœyäuÔ2ÐÓˆ#ÏO¹3î`µ£¨u З9LSeO¯ÀœT7®±cà™>lÖÕ‚Ú©·¡9MÄÓSušÜ-n뛽uI§&,úëeÍ´/"Å\=³?ÅvçIò’? 6óC”w¾Û£üþ!ÒOõ¯CýǨ÷´ÓN;í´Ó~aûÈ( ’QÊt\ÂÂ’ƒTU}&=r¡ãíF¾ƒ/]è$‘6=³ŒU¼3¡,FžäE »vÄ«,ô1dú†ÔÿndbJ ¶Ú*¿5(ã*^Ÿ€àÎG·Òµe1òŸ°pð¥¾P „RÁÇ¥jÂlTkˆeY[¶.h…¤ër@@4êìDéLãxÎòמjâé`ì!ÅþÐÄRÄ’m¨ÃûèÏa‘„Å?~‡A—¼&Ž@WôbÜ•æê­”°\«õÚ(Âtròý5§ÅF {iE8‹<¹À `I–+ü‚SEM©WÙ*»È˜A Ks éÜS©ìXb•)‚ܨ îâ¿A§—’@í¼Z“pê1 Ë'뺔÷‘@[ó*I^”,'_Ù:ÇZR9g BÕí\0©õ4v2SÝÞ¦‘S,ù2¤e.íáKÍb©Ð?öFÄô‰„^Òaç´ã˜VGЕ~ΗZïa·p: O‘ 4 nôñƒa³Åó¤¸ÖT矖¿%d0œOyŽÁ¥Ó&“œ<´˜Â…+]²¨Q™<1%P'u¸?a—,å)HnF˜e:Ño˜ãŠEí¡ÒÍ7–tþE°HÙ\4wŒî»è61°½ãe5ι¦a¨vøÊ´€ˆ)æZr °Ñ¥[ æü'7õËq‹\{]TÊÔêØ{°÷îNoö¿ÜGV¿÷õ«ÏÉ~˜¾±ý]ÐùË V§vÚi§vÚ[aæ´}XáÉ""ªŒqûp²­ÄàZâs%–n0¡7I³Œ ÍÉv³czz,Ã4†Ë gDM›Å8ŸLF-`F:¿eU?Ñ2üµ ©¢6ɹ4‚V5d½†¦‹Læxú%dŸŸ¼Ö¹}ʶ#±^#ÆG×} Û´¹’€,dI…ÿûÜåpð‹¨Y„¡ñØDÒËÕÏÌÜ vwÊ?‰’Œ²°(Ë\ètr”ŒÀg»3 :#‰P]»#,¡d™ÌðÏ-D¼CÃOA·%í Uä1’F® I†å2%&µ(`D¤¥@rÓnéU\:S{j@a¹<.†ÛU2zi°]èÿ'u£Ý˜-O‘öŸøJLcw`YÄ%£a ]v¡B?0aLª·œZéÛi¯0_Ü €€#'µ±˜nD0}رי±t:°Hð«TýCÞ$UŠLÜnúý;LòRPeÍ-qÛ½)Â6y¤ªo €oÌHÆ1äóª¼~5xïœ:¨ˆ¹ khãéô*1P]™°`\e^Èà$]ªŒæ|bÒ•À¥ÝéÓJSA†OG÷'wYæêÒè¼OL*QðÈÕ‘]îk޳ÑÜèª\:ŒSYä îó‡Í½2޳7BÑK,–éŠ;¹[ÊDúÜg—:ÿ]•zâml~ G¦¸Š/I9”&ó±§Ø¸¡h¢ …•,X”›?¾Ö cÛÊ|_²ÓÄ÷|úßÓõ§vÚi§vÚ4,ý'æG‡u¢»Aè‚OË>Š2`Nìc($KWٲПá°Dy*¬vt…€Ñë´T PæRÄNÅs„@¯Öí!×®Ob¸Ï±ÐÖƒò8·b'×]èbºF&»ú›‘%öË­øC¸žÔhNªœˆî¸g—yH²”ÈjWË8­±p…ù†>¬CšÆ(˜P¯®$Ö´ P¦„M°‰Zý#]Qè•ìa»K$ˆgÆ"ÛW"›ìj`ȯ¦ÀüE±–-ÝŽfÞ3r9Ç01»,ú…IStÀKq‡Y ùbJfL¶"Ä{#Üb\b †XA¢„„#Tà›Ô*F‚ŸÈŒ¦‰-ÝÚÁl2‘Ó‡^õ c; x²=#+™æ,aІÞDt,—²ìSYZSЃ)»ç*<ßm¶%÷| >_œ'sfÒ0r"µ7'òs®–£ ÑruÛD¬¨ñª.s2‰±”¤=C*Z”CfÅ^µ|¡\-Z Ö’ëðow7—,DI„$û?«é¨Ï-âóîòÊÄ Ig¢3¢OŒlÄz‚VY|¢•‡&qOm¿?HÄùò¿1†Fn IDAT¥$Ù寮V 嘨+X84éyM5Ü¥Žj²X,âdhMõð'#µ1»~~„£„ˆ3Ð Æ¿¤¾2ª¡ÀÚŒäº/U/ñzߤ~Û+Rÿ~c±éއxÔÖÊP!gùþ?[Cÿ9·ØßÏkG»Qí>?¾)‹€ÿæŸvÚi§vÚ¿Þ¸Õ.ôVûðqNR­ž`Á¡QÁ“Ë´ÆІù’˜L› ²REï/Ýöll(¨×R½¹ û£¶ƒ)2©“VaéY÷Þ%“*ø¿àKbïbN edƒMä8XéŠn^¦™¡1‰úp½úáŵ6«uèð²ÂR HS¡ÊÊZÃW(ÐQ ‘x;¦"…¿ñ…J ®»ªó ÿùÉ BË,$fÊŒë £ã,#Õ¯LK<.ÁC½%œVL$é“Ñ1©Ã,Mž¦ <Æíô”Í\²¡ÙΪ6 àûø¯›PÏ›^¹5ÒtŤ0ry„,ñ_Ñ%/?Á¤Î;&²¶™Ð¥!¢"ÿt ÂYÄ/UQRÖç]+0mEM+«¦!¦Nâ,©^ÚP:«R¿xO)t¨Æúâz‡”­¹ª©aÑf7rm‰P>a¿BT± -rߥPJ\ B7ta x¨z©úü:£vWGRÞç9½haòZ†‹å+`+GÑZKþÆáªÀâs€,6HΤeïõå+£¡:™SÎÆÆª ;8"†Á-ú$%"™Ž…ûQ'®¸º#›ž.jøÞ/¹bÆ„ËLòGLÐ6Œ¢à]‘êÆêêvgÐÖÍy#Bó,1«Ë5€ÖrDÞ@Ÿ3‘b#wòR|úÅB7ð·¿ô'¼ø^TŽïûîz«CN;í´Ó~üt9í´¿}Öÿ¾ùÿ$ï­aÕ-«˜§Qu€;¤_ ä}D‚U¯ßÒQÐ782Í5T›r· à!ÆQ>ÊZ¥ø2“®7Z¸¡:@…¾h°ªÕÛ Dg¶]^-ä^Íñdk /t >4âûÄTph1«¥Bî† Edž{ªôY·Ç…ñP«)üÕ)®u9ëH„–JÐ(àµú‡ˆ˜} Ø{·ÏËÙ˜ôdî%J¯Áýäúe»E®F0Љ'Êg2qM© Oq¥ë¦0nÒàä*ŸòÛ`µ `> Qª¥w½‡WÁq•Nư“¢¡Ï2š{ÙÅ.Èaß·*CA˜x~vÚ_c¢ÓgCý€Øí/ 9eË*v“jeUP<®$Ž e>™&0¨ CµS=XÌQ¡1;Ga:ñœžý„¡v»x› þ6¹uöùŒ`*=L¿Ð½ÁÄ‚^{êî¡-•ÎœÈ °\RC‚¹eI=Rá•–÷í=¥ËUpv× øuùMaý¬BwQË¥lš°©W bz€N ª»‹˜8Ðéù²$'.DéùaÓ< §V¯ 8ÎÁ”‘u²0°¬jäKú¬X†ÔkLN±7>CÖ»ìz ÐZȈx{åÏ Ä4U©I刧xͼvêdCI²{898Ó ã|É9{†@îiï>¬,%Èôó¡ ,úå`v} (®à®áôù§QÈæO¿-fþ:tU÷º¿ /8º@[³õ´ÓNûS÷áÓN;m« „U•¹6P¹þhTÌDÕ>ã7ø/å{…XßiPÂÑKʵ(zFi‚qK¡j ¡"Æäþ22A–×é½, —Ëbÿ»6vJž¡ƒ´ÉáÝë~J>]þÉ!âÀÑð¯ÑñgÑFÑŒ@} Ö(—-Bh \E`+ÆÛV çc¿IÚ,VÜ4D—`­aFx¨›ÀךÊLX)w’,ΖŒ°²Èœy -œódÂý£â$J¥ÑŠvÔ9ƒkÙ"’“G5Tä£T‚›`^-duQ¶%—Þµ7׫ÖqÎi’4 îFZî€``wša ÿu13çÉõî§ ö6+ô;^Þ–ÙÅ÷8<Þ>V‰‚¥Z •Æ9Ûô6» âé¢ëÓ+†8 »M²‚Èt¸?(Ö^Iðˆ.s2bHY1ËÉZŸ¹„,OÙdÜŽ P¦Ä»¬9\¤3Óz2ù¾¹4y)º§i_ÍŠYR›i¹Ï¢1t½•”sÔÃà+Ÿ›@‹doIORUµ\+X ìAŸœCtñEþ -LD¹¤7ÀÖä–åÒÅÕ’ö§UU‘Z™)wµtœ/ˆÕ÷¢óo mŠáÍLf—.’)p,o»ü~©7ù/sçjø¢Š|6ü B÷WÈ…˜Ýë}zÃíaÓH"¹»Òî°¨ùtìßMù…™ñt©¬ñxVê˜Jœsý$ݰî~âwäªÄËK¬Žô¦pü|YuÕÂø&¾³›ðŠ.Á÷ã Ëbå¯z?&¶fÞßjwù]±Ç1'æ,é‡Å_A,?²¶Ï0ýÊ•!¥|Óç‰Ã›Ä  eS­û$V㩲Y&»DÒ˜&@É+¤¤BÕI‡iÂË)Ö-N±.ÖäSìy¤¾Â;Cdô!.u‹Ð~ÔåtQβ±In‹ …þE®Š¤2O4±=Dwq¬LJç EŠÃ9&ZG Ê'ÂU²RÝô¸·(Åfî…¶¨ñâo !Ä ª¹â†M¾E²^ÇKßW.rW!ã½brÞÕot‡·××Öã¿ñÆ»‚ ¨›H©ÊÐdѪ÷²ß OÎåï —×霟ƒ˜ x-ª9ߨù!¹0øÛúù´ÓN;í¿ÜÎîÚ÷ÊWºá'ºðäg”‹íZZ’áÅYÑCZìo²¬ú; 'Æ*iÉOÄV{µû« ­µ)«Ï€'q»ŠhO¼H}I8™m0S%‡/^‰&):³2,›f¥ÞO„ y¸ÓB|nMq€ä…i VWÎÀ8€^{BJT®&ùFèv ¶ÒJ¶®uïÈåö6…Ó,kògéÂc4)-îP(ï·*í2/ÑbÚ‘Jði{cì@®xÜ âÓºp(çÖ¤1õµ…~JÐÀî´;žŒëEBPcÍiªX›Õ×®ÓD%áL½ð¥ë¬Ö£·¼¶ÛsI¨˜ö‡õuј6þDŸœ+Öå/‰Ïä­à[B´·Õ0w‚O¾õ˜èOùÀ_Ï:¯bßý/ùõÈ÷¨ýJÈ]ïÕµhã¯q–µœÂ§vÚi§½vPá {Ú¯í°¶wf1®-‘ÅhôÕˆB_•XsÿuÐñyB(§zÊ8¹>*Vµ×NÁöÍ%ñr'IŸÆÆO (†qWªÓgqcK@0´Aë±DÖ{sÂÙõ¾zC,Âî°&~*XßOi¤ÿ½üGÊ"d ƒ½2•©Ü€ŒKù(ögÔ®™]v1t <á£_¹-&$JJ8Â^ìç=S­C*©a:Tí]jb?âþ—…À‚÷£Y¨È’2¦\:âB©¬˜¢HÖÁ…‰úpìä(“(ú„ZäÑ $¤R lVÒ%U¤Ã<§›ð¸§/õ`u……Ȉp' [“+¸™·Ö,Úñ2-ÝE^ÉMÚÚ#(~½<”©<ï2îZ7ɬTÄ£×~Lèݦ.ÞÀÁ¾+-^º¶ÏÏ9G…–‰›[Lî ÞúœŽ@ñ²­ü”û@¨°ÆÊ»Ÿr8”•K­¾Õ²¤SÞ–¨Ä”æÔíƒEëÌ{¢PAÒòÅÍDª€¯CeU ™÷À)dã…}0IAxÞ0æ};m@™¤Ÿ«eÎ+lzž¢éÒתWý?®šPûUÝÕ¡jûØo-ýš–®èå)è¯aK­…†JHTà¢ÌRØŽ‡“…N½äÕPv­”‡{ÎS´ëº·ãÔu¦å‚á·ú_ VüJíŸÝÿbJý÷ät&š§vÚi§Í§oá´ÿ»îø~VøtÞSjï’/¼ÒœöËeK¡~[Á}”‡4'Òʤ'îBY¤À³¹”—Ùà’ê6ÛAÖ•æ!˺4’¬JúŠ›ŠE!ùŒ^R?.cDwYX­Ó1•ìÂÀ€¨@RGsÖR<œ-° åxx”]~EbIԘ݂×ɰ”,Ô¦êK"ºêcDq|ŸBŠ„7`TFiZP¡„N€¿ã“›#[yÂjãó .Õ½Ôƒž‹3$™vú ÁÏöìY™Ñ ¬@ȱ½LTàù„€Ó_Õd†üÀdÇŠfiû=±Û}?úpgwžHøK£v³¹t,~ö³êbÁ 2f©'‡Üùt]ÕCcSĉ/Äœå>È,~Êf?QJhŸ9Ô v‹üz¹„QÎÆñ"§wp³XÍ[qÐIhuÐŒúýÛ³J&Ž ÐJiˆq3¯U}PµJ‚h\êÀÆÂRËû@kƒÐW£,Ï—$šž‡CÌ1ëá:JºYYkûUz e†8»ÆëB>MqÆË3娵…»¦]ÑtdãOŽ•x óçÅÎÚ¢¼BÜ|,åÎ-ûÃ_³KJ:…}6NÈwF¸ûAñäÉh 'Ò‚]Aoá€Kx“jÁÔ]=uÓêf[|ù®zuíÄËϘWösÛx•Y²[«øå„Ŭßþ' 3v0/FÇ¿›XHþü#˜øþO;í´Ó~å>‰Óa¿§Ÿ>̃hXgÄYiaH«H¯»:"][.Å€áeÚ¾¯EJ…Pè°™*©È öœfÓ§ALÖ,k²s> œ„‹5±JUX^às?Q‰.æïküÀàÖ …60ˆ50MtP‘‘5¯ÉOMm5 ‰ŸL”4Lû9 Æò o™ÌxõádíH¶×Dö4Wó+gé×_<•°»“A¯¥‹å5,¦0k‡0"Agƒe><µh‚I2£ A Ø¡—?ŠÕêÍ šc¥²j²õ/UT¦QhÜÔ5ù$ëz¨nÞ[qá*"…ìý®uk¢ú„b`ª¦·#7o)`1{²‰å|¯LXvAŸŒÏf!ÍñÚêò£Èæ`ÌZþ‘·š7Îø`6ïMY¨:B+t)Ã…E2Èæäeÿ¼G°Ú–%a¿º}XæøsòróÌ72žq3aœÆ(Äd9ò.ZÇ´Y;Ù4ˆ£ài¦§äµ­úƒ&ÃÓó2 sÙ3'ì¬êí«ØTäžAöV‘¿Iˆä饻ԋh-ÓôÛÒ}¸fc†€¥̦þUh®åÉ÷Å\yY}xZô!`ÌÇ暴JyˆÐá$Ïr×0þñÅæŠÜ1xBîyBEGo8æ>ž©» ôvZE°‹6â³WÛÜ5ú[$qRNdi¾r¸Lã'¦Çi§vÚi§öGµrB¿®û¨´ÎS:l°Ñ™ëZ… âm¾½êQ 4ùŒ–‰‡k4·êúÀ”4@@0¨0;¬êûV‰¯nhl$ñŒr± ¤Ï¯w—KêL˜M ñ™î‹1+¡¡Ùªì ïWjª˜N6§›ä2+iÚB®!ÑWoˆdUŠ“þ¢Þ!`¦(ÝÁ:ÉÀÖ+/£¤y¼ü}ÌÐth#h¸¤þ¾*) $¶Ðå«ÑâÚTBíÉ`æàK7ÏwX‹ã{쀑’4ïÇT$# ¸#ÉLj³ð9pW˺úæ^‘ƒg¤µ»GÙ>žyG‹0Q±!/|$¦Ä+º1ˆ¹ØŽ+”£ç¬jD(“‹ÔÅ8$ÝR²„­ÌwýûD· ª@N…(µ×ÿò ÒC˜Tâ]‘Ú_áiFݧ±K¸}/G Œƒ´bPX,Â\‰’€¼¬à×'ꃲD×QJ)º´º¯9°¹Nº #YkhPÒçQG.õ“>Çvþü§Íz†;3ØsäKBPUYµ åR º„õ¥Ú^Ò첬®fnÞ^õ4Ýú€{)§ÉÿnйšsBMW >Ý—hNH3‰ê$©®J̇6^–uló·èù"›—;og9^éGÔþÒ"·*‹Øš5ÛÝu±Ævºv/iò6ˆÕñ°Ix_?Wg{ïî¾æ§Ú·ëö|óö'lWðÚi§vÚiÿÅö1¿ „x2Æ‚¨^©’B…¬ @ÌÔ{¹Ã—TG„/Â(!j‚Ƽ¹œÕZN¾r©F,Ò„-ºûš‚ .iu.ø\‹€56‚Qß]ä‰:·´îŸSDJ†ªót%Aåcb5éÁ*…ÙõÕ­‰}Π ]ŠÏ]—ñë4²Ea OÇT^ŸßË.ÉLЧýfÈÀû©*± Ú{‡Ñ>Ç:1tðïBíä,n ž¼ÌrMxJñÅøf v˜ªÚ §Aº÷½T°øt[½ì   ËÐ)ˆ+y ddžLšø8/Ênl,;0Åèp^Jß[Å@›(h¯§s­…å{®#à¶øŠ(RÄ,2…šX}ìË›(?œ #ˆæoMcI—]=òÚ¡ñ§ó|0Ç®õà~Z¤²ÜÜÙ'§‘?¬@³üšãsîlÝ÷KÏBu&ÇmÇ”ä=ãq ªfñ¥®—cšÅÀ&§¯ ŒÙõÁ)”6iJï¾ëÄq‘zJµê…áÆÅî^rà ŸE† ÖÀ¼b,4¿4¦…oQŸªîFá—)ööºÁ.+(Ô­`¸I¡‹/YЂ«}fnŒ®‚Æ“/eQPLO€r0™DU•˜²Zë’ñwL[ÄnäÓs… d\0Î…àg·Í¡TZ²S#:JCÜ7ί»ûáÉæ'°-\_´sÇï‚É;yrN ’¦[âlEò+Ý÷V@úëöžö}ñ ßëÓN;í´Óþ Íÿ…—ø“ÏŸ®—=ëp0ÄS€·UŒZFs%M‹BÅ­´mXPx9‘LL®°Ki!ù$,$£O榬tÂ0p¢(ª78…ÙB?$ÄNl0‹‰`.r´L¯;„®a„.Ÿ*«s Jü¶*j,fŠ Ç fòj3þ76¤K^ŠÏ­UЖC¦Æƒ>YŠªIÃL@¥ h¯êP¼¨”!Æð ú'¢¥È÷ÿÍa~›$¹Ìÿ43»sèï[ñ˜ÃpPÛK¾Y¶Úô’Aƒ/oa"ªmU¨U¹Õ"È®rçi‰1×gtŸSx1úýþÃ"å¡ÒE^„jB) Ã)…9… _¦…ŸÊhRâjpuù¿¦”pÊÖW½póÔš:3oJ™— RXQ½kц; wÅ’ ·oIî<’Ç¡ |  rªèG"¤xeqµUÏÖêTħs!ó¶~Wü?´z±`ÙP*Ax¨bc!ÉØãëC½¶ƒÞª¦yŽ¡Z}¨ü @QŽˆc(ß7ÃGŒÎL7F!ŒK~åý9+RRê*Š7)³Ž D5¶"p?¸ä.!ÇÞܯFœ|¼54q²z[ yZ(ÐËäŠoÓÜÁ‘Ã*Öó,VÀ^ŒÛ´“¢@Šß@ÒE‘&h]~+°ÿEÑW¥:*8î:×åƽ*$ˆ0ŽlØ÷ˆUDòEj†É”cx|e̘„|M@µg¿[Q²òºÕeïÍY¶[ ¤À2#8Y%W$÷š–ð:!kD<$KªÏ´JIŠ«sM}as‡”NüÚw#*‘Q”ÔØ#üêš5Þ5ç‘w6T‡¡>Ñ[oÕp¶‡"±Ásw4ý]õ†ä_UM,'TšódÇJÓ¬>›Ú 8±ÙXBGpg‡«M‘b8™½K±ƒiô,Ÿ_I¢—Ræ:'T>jžd –0Ò·@&NØWø ,§hÚ ã©:ôvæˆ@_ IDATá»àå^À}&>’1}$º|ü v¿e:EKñ†(Å€…” Ý5 +DÕ«T¼RZ,q0EšaI&&p ÕÃGuÁn¶µÎs˜_zwôT×ÑX§¸ÄÞxƦ¦XÝÃÕû軯?бRÝÚ¦šg¯ ¦ZûAðO‘ÿ5e9 ¢tÚi§ö÷îç§}_ûÑKcßäÅ@»yê+sÈŠiiº sµ4Ar+'HÉRB„«›}Ò#BÏçEáS¯ŸÜ2M•CÂ#ü+øÐŠlMÃDꄳ™Dv®pR ]Ô34F†Y”ˆÑVÝM¹4=F±SÙZ5PJ²ìÏT«5‹HPEÅ äèÒnÏ…FËvÄŸÿïÞDºó¬€—޹ÅÔ…ý\(ˆ°: Þ=v -›Ò$5rJWôÏ»Éå LpóÄP3L@FÛÕ‡Ü?2‚í-”eþó ’‘”Ý‚åqØìEÞóÓƒ—CÄX¯ÿ¼_;ƒ^ž@É=â\^D(ø¯V| õˆ[ærä&[ `"£“@ë¸çA¯!q+ÌŽ›É€…I[ˆÄhà]T‹åñ.>KL´àÈNõ…YŒ•%ì°¼Œ>øË·ŒóÀ»ªB i~Ži™ûnG‹ªƒë%š}P¡Tê–¥ˆèà( _$`×ò”IÂüRR ?äk§…zRçG^÷λœQd‚V«5:[æIŠ”ÍmMR$†c£SPô‚é>óaޝ ´©7¨Mév®4Ú„ 9aúRØ”sßWŽ™ÃˆžIŒˆªcÝ´¿}¶ba}p1½k^,ÊjúäúÝÍ1¦“Œ’¯@£Tà@‹ºÀ–,[ðQº8 þVW¡,ç4Û½ãt 2#P9†FÃ’}ï`Ý0ë'e¸§Ë}Š…#¦ÛËÚd,¤Ç¦Ü1 Æ‘ó‹œÍº :}°Š<^tÑJpLŒ¿Qxëü´OzU¸~ÀÄ¢Ef¿ê䨯Tž!è¼R]3b5öR¥ã¯ŸD|Y`[4/AZVÌÆÉU ¤¢ î¡ÉÎaÍB¢rSü¨Ê>7 ÍØQ›Þïü&¹Ë²dÌWË]ŽÇRŽŸ¢™!iÊQÝîò“ˆ¶Ã6¤ä’ßœõR÷¢°¯ö幩\‰ó>rÅN¨³êGÄÿëœP"þ)õ2ªâi:úŽ˜æ?;0Yü¢-jÇåÇdóIW_N×/ÚTʯF‘ñeÀ´¤@§¥}EmfõT»ŸŒßȃ‡eMÉdþôä0û•`5s`23ìþÛÁýO;í´ÓN;Íìc!‚yY¢Üïùέ˓"3+°~ì\†Õát]È:» pÐoQ”|½ðˆW§I®_qÀYætO‰Hš0Òs&B‡˜¯zÙ„Ö3>k”ù¾=`vßß3Ùà¦põFÚ½³F¤Ìá­báMçlTQ\…ËÍñâçÚël¢w}‰4£>ß÷€:™bW]|Ò¥àS†"*Œ'¾m§—íH¼ÝäNÉ<ÇoMƒÂ‚.à™†¹Gž£×kÒ”ùêߨù@õ‘óc¦Z'¯N±}¢‚ z2×SÍeÌäþå“ÕŒZ̲ äRm¬ö…BÑM«õó· *îX»Ÿ¤yýbñ^g™M®A§‚®“Á)0È3€…¨ FM° Û/¸sëQš °f¦»’¸[Ñä¸éMÌ*;ù/Á† *ÕÛDZBe«ŽÒAº›4XØÆÓ§À~üMf ÁŸ1a¦·Qšãó‹Š1Pç3ÝþœÒù´âÔb:iQÏŠÅv5ý­_¼T}\kõÂë5‘¨Ò*Øb¬ÛÛ‰)\+owXü2¡pÞ·ÀM93÷QSÖ‹A4ò­9:á&¸³([qÜ቞؛j,`F»#×0AUŽúû¼žV¿£­R~)’—e`ý95¾˜[”ÁZ¾™6“ÆæØð>Ð3nGÍæ¥Ö*ìÕ¸/ É‹@bN¼ Ë~ÆýRÞdf†0û ¢Ÿ“ä×+ñË|óÍO;í´ÓN;í¿Õ>ê% fJ¾ˆ°ËäÒc*Ð]EE‰¤ì¬-o4þ±Ç%½f½õñ¹¼%`B)&á gÅ/ Tb½¨÷1ƒHc˜ân{E#§¡ñ)ñ”>ËEgãâÚ1ì&€¾H (°Ce2ÐÔ ›õòÓ 50Mš ) µrdž¤ik ªÐPñ”ßW¨j*t¶lb޼#WrÈ4àeMJ ÉJßUÙ ™‚fJÑT¥)f¨PHhÐ|ôÅÎ`XD¹Ð‚©S~Lj‰.Ä7µHô6gP‘r2-ˆj´fNº¥D·=æýqC©®‚ Ø.ºWC§Þ;\ €Ýù¹fÑ=ùLV®¨G¾dñ{¸*f<‘ÁµôyW)Qa¯Q[=¹‰ Ÿ@åÆ<€f„žO`_é"Y„§…ømxᎿec«`jn0è’Ë>óìõæ@ÑÐ[7Ó¶!Œ”‰ÉzJÌñÔ¥Y¿n®ÕS·&u¡—O£+‚:ÏM %D‰ÛµI¢3­q;é"¦¤†ÃzYÙ ·ó –E°….©/¬_+É É&î–el^ð]P["ëžÀþ òiQS'BÊäÄkÙÒ>Ú×»ÑÌόȆ™÷bÀ¡®èÑ‹È&بº·P>áÊ ±*E„2¥ƒæÕ9 ÔàRÉ·„÷¹,º‚eÚˆ÷pEÞéÊnÑ.^‚Cv/Z[ˆ`ÆÈ– mÖæœF4â@êŽj´PɈV_ˆõ’Âûp*àË9+S’Hr«Î[é«aËÐ꤂§3‹Ž( Mn×£…St¹?‰Ò(€Â…?>’ðlqUgƒ&lFé% .Ä E%QÙ'{%{Lí²q127u( r­&c8‹G䉑IÐ0” Û@p§2ë:N²f‚×ìHFáG»þü?Ÿ¶¬»iö¹5íE‘†•„¨Fj&süïѼÁp3Âx ž“T*ó> …H´Gy°1[˜N ;=x„l] Så´ÌQ¯8Ç»S;´AÐ;¨kÝpŠ9Öš5%6bJœÈù3kÀ¨ß_IWŒÅ(xÕœ˜ˆ™ÿ¤îÆäM-“Õ ãàÉ·¼toH4º×gùJS>3 zØ“ÙÚgZr}áÔe£I‡ËK‚VŠW&êöXO lŸ@ªg*.©>Îô¼ãÍëXîüTžÞMo‡„Y!¸,·ºó˜|ç6‘žÍÝç Ê Š‹oìÀ_Ú–ÕÄ’Jå'Æ\ä 6Åp›© SSâ_ÏhµMý^(|_H6½VôÇ7.‡¿ãùOöâ´ÓN;í´ïkø©òÑÑp\’÷Åôö3ñFÝ Éæ—0!›[/ñ5Rڸ亇‰ídú^ˆ;Pòhê‚sù|C­W¯®’ÓâÁ¤Õ/)˜$uÂÈ«ƒ—h†™Äýî½~R½±¼Wî¶ôt½à’ °²¸:3€A`Æ\,~ÝE[ö„â Á]å½Þ,.©§°܃KdÞÁÔYšúŠÅ1êB\;³{gyÞîóî—¡‚Eabk²¢5ö?•~¢l:.ÝQ9¯SD˜ûé"µÝTL4¦Öó•ïœ2¬M‹¿ƒ³`Rf+a¾´¨ï¬•]n¬ÍîÏL@W#³û³—<í¥!„Ì‚EÍ ì Je[”d±˜¢KžçT[T5ñî\Á9-dDzøÚcÿû᪠2Ó¶"P_„2ÄìµãSBKœAÉõÁWø]YuêËÄ«2\T êò f§¹HLx×Ü-µì—¯l©`. þ ¡K7‡¡ûfߤçs¯û(F²ºgÒ(•îæöˆP¥®½ˆYrü{‘ëù¬,¼²æ;—…D˜RN|GS »êÏøg³"Î9< }Î/4ZbPBÑgG­ù„=Â4£-xÒË$Ÿ›t?d¿¢} Ë}¦úQ™*×›Ô´[^Œ>¶!DD—#íö±Óo2JÙ·™­%Ø›–ЯªO¾æ6<3þMQz*ÇüqÄù ð+œ¤Ài§vÚiïŸòüùñ!‘±Tžì/åžÚÌF÷Cð7újí€&Ô©Õñ“·®.‹ân Ë&ÊEšU‡1™’O}±Î/̈¿âvÊ1ÃÞû÷2·|€w}‰ã@Kiø¯¹ª²ïhk™Å"*6gúú ¿VƒeAAr\ãAÁNµ ìÑ9VÝÔZ1ìÂ?`tãç‹Üž19L˜Û~cû˜³Ì*´WóÞ‘æøèÝe‡‚AC#³©5hË Ëµ ±™¢h¬ 1ºÂ¤ÖÿtÃêOТåpcÀ—˜Ÿ¸û"!wYú½±ˆPîã:Ù*w¸n…yŠ("oJ…œh½è|­YÀ€¬³[ö‰îÜtïHôÛk,ˆáÔ/ÝŸqþ5«!­WFºjAh†{P« VºÅ‚íÈý¤ŒfFi]$BáQv ø¬ð %ƒ6ØñpSÈD*¦®¹$ äÍZË喙‰ˆf+Öë“ÌJéj(Yvÿ~bÄ^ªÅO~†‹ÝYo·,LäaG6*Oy (î,ìn%^™ÊÍXo#vE”m¼ÀôkžaÇêºY}€CÒ»Pö¾.ø4pýdPËœQ=e3‘3Ü+æÑ"ì °sîW×SÔ”¹0hÌD„„LŠû”Xݹévþ½À&Åöè\•5ì$çT6–ïô¯ê]q9í¡·÷LàV)1~Ëñ«¡÷{‰l8÷þp¶¬¤òÅ;í´ÓN;í´o?þÂö1;IQ ,*ƒ0tÂX}4»º; ¡Éªl“ÂŤSŠpÙÄfu8Ñ ÕºØÛÿuÕIÿT0»«Kpe¨y¼GÆð¡°À«a\Ó¹K1Èk$ØEdÀk†X§2Ì™~ÌKkËk5"øbY—É„èªã¨ÓÕI5þºK=4Ï6ÄJÐm朖* sŸÌëÄ¥½+…S þu‚Ã[H.{ÉVòDV„Œ¤C@˜ðŠêµ§39Åo 'Ñ™éEìrê^ ÜÿEñ+út{Ñó)Û¥N??íÖ6Oæ­UØí@x&ç³ì¹Þ.Ä“ѤiDPîQ°ª$V·ñŸàák>wµL¨™l*àÒ-´ãÖʈêvÂÛиQë›2uòd©òa5óD‹¸YÜïïåt-FM垀jrÄÙg©YN7–‘š{˜Jc¤k¤UÂAêJãË:ï÷$«…îäoxxù¶†ýßp[ĨRB†¿[1oo°yÃtÒ]¹í-WÞõ­ç_¼Áú ååprçÝ”‰Últ)°j@Üâv¾?ÜûÆû(.£ŠÅÊŽ³mã­n¦­Õ>¼ýžø»1ü²oú+zä´ÓN;í´ÿ|ÃÆñG·}¢'†à³ Ifz¥Zÿ‘h5Wײ5Ù X¤‡TŠ®nâ(u7ï$øèuؽ4*Š sªš×ô½>Ô„Mc …\ÉrÆÞG4Ú4Qñw¨ÂQXcã†ÆQP-ŒQÄaòˆgˆâœ‰®f£Qf6G,N[DŸáЗÿZá^w ¨õñ°ÿe.õèHzõ©à¬>ƒ›™Ô@·b´Pad±¥L•áu²©Ñ¹9 5ÕPøïÝ´”3ÎÊ¢‚;TÏ`ÉüÙux²ôPé•ݹYomZ´§Fdîhž]ê2'iŠ¿ÔD2ẫÀž}õ0;´±B!ý§Ý©!Žd.© ‡¾”Ùåó+Ÿ?©Z£²N‹íñœw»Ãìfw@xd&¬Dñ7=¥¥‡Œ(¤TÄRý_ÃïÊ›±z´º• ºJÒ,Fs€ð!ôã3‚ÛP¼¡ï l l¢V½x_÷ØŒ%Mdo‚g æ(H‹ÌBãVª°Ñ´u˜nya‚½Lja˜.uˆY|«6IÄMö,þ„j!¢”¢",°Ý'¦É[Ó¦Àx]7Ùà…àïJR‚¶òÝ9¸šé¾»ltƒw°AXX…û-*h¯ÐZ ±¥édÑG kçì˜T   Zú#…]Ò>3ê3¢\)˜ËUË›ÆBÈ _®¾Mø¾s›…€áŽa>É„ cI'gŽ´¹¦=[¹ÝßUzµª/=LÕ®T¿œúÀ/Ü¿‘¥·&˜o.˜°’Lµ&µ<«-0t7¯è*5-Úí–©&/$¦t–ŒÖ7ÉN`³7}L•‡@7FlO1¨Jˆl8_O5|ÚulÜÇ+ÿ¼Ø÷Ú.à¸P½ >§œâd?YšÙ}ý^‹Ž;­‰ê€ï©Ú [ÿ¶ÿpðŸm<]pÚi§vÚ¿}ˆèç €+auAËTnn~}x6;›ýs"À(›ËZ’oì¯ÝVÐë`ô¦Zv ÑfHÂÁLI7AÒ—X<’&GˆuL„qPP KhåQuT#ª` Å2tgú̱–M&äýêR)ÞR]ëÚ«±¥Ú ‚•Œ™›@qEL‡˜3gB÷Œ¾ÇLH_J¨ Ç §â¿4bÏ(ÌBQß6Ñ/y¸TRSy‘‡ûÅ0À¸˜ï8×r’¯Fs_0ùáEÌ• (—ÕKÀ¢ŠE(˜0½­˜â2*X¡ô>‚RD òô'tBÆIßz´ í62#Ø:Kç°çTÄmå½é×”Ö=–Y•k$¤|&oœ‰Ï¥;8Å·ìÞ̤„|HÕ-èžJǪR?Z`¥fc1žnZ€2 Û#Ô磂›Sx1ûßPèà¥~ãŒÜ>;šã>¼íi_flÐ;â#·$ðJ„’—ÇY_z8x3˜J¤)¹¶ÖÊ¥y0îÀUÌ4º²3Q‚`y]Ôê'Ë D£|fuè l”-Z •@²¸'È}ñ"i›bIÝXÞœQý¡—<ÝýÇ'­a­g®–)ß°nNh7yV0ºª”k6âvvů€w¾îpìô¦©1ifÖ:¹ÅÚŒAÍK¨1æçÂ×6Œˆw‘VÌ~ûpíOâé\턹ÞWý:·_ï Ð¿­¬Ìi§öŸnÇWæ´ÏöaVLüІCðèCÝ_\e …ÐÛQèÀ´lÊp}¤"ZBÛwû‰xÈ£à2%½E ,CQð$À.4Ø‘‡(¢Fíúf±jçi•×rfÈ Q"yEÖÀ0üf{W.>bråE£Hàã.jMgسJc›†˜aO‘cAíÁª~rÙ<×[¸)T ‹â. JA›¢€“ßE£ ^õXƒxU…Ïg˜ÒÏ\ܪN†þëPÊYñ\¥Eq4¥`Qµ}•Ü·á?™¢}iw>6OOøˆ—§ܯӕ«eŽ$Ú ¤"hb+@›³¹~‰ÅäÖ"²/e ['%Ì8JåÔröšò‚1'‰óÒŽ»?z‚^vÙãD¬¯´eßÜTt 0FÁ¿{'¬ŠuEA"¢jz›[tý!@NÏcFLš² =IÔÓE{g|>µðz§•„¨6Îõa"&?L¥{©æ€—ÖäÖ¸]°Ê°@YÇO˜‰`1{ÇÖ+obt=Œ¾ðC_-ÙQ.æ9òõ^(t©*Ÿ1ˆ½ÎU…þ‘§´X•¥“.®@†P[P®;´æV¼„W¿Œme›à]¼²®ÑÖÉîz›¿òTß… p©.¸1.ɥৰ’—¤—°ñšÔñµ\P;qÓN;í´ÓÞ½V|Ó©ù¾õ´—ÛGw‘#^ÁJ4w}K±V¡’¢”8ƒ¶S=x]Jå“y¸UÚïxšÁ¼—š1M‹ŠÛÈÔ3N/â]£îs- GÛ@¸³&wå¬3 ç,hcŒZ‡Òº²q5 PP!8Z¤îZ#Ÿr–BÍ4ä=§:)œÎ†7¿ Ýx ŸódöÖ£;š­bˆ¸oÕf.}ÿóˆ³bšp¼¦ÊË›©å’g@m «rœéTÒå“Õ¢G!3ý§eY$*WF3»Óî÷aÌ ä]%!Á8M×çf°Aù¯êèŦÂuC-J ÷¸ð“Nˆ€_ d–ç@ï¢\©³¢7Nð[StV¯€èÚÖ[JÔÜ€çìÃé{$câ_•úö¬c°ûÓ»Û $ñqíÚ®G9Àµ¼¢µëH¢(òÀµdP̸!3$5¥žÌX>N(ë®3–€_‰ó›û4”z¬"â˜Ñå}Qê'|ú9ìiþ¨v¤è-„ä×’©°¾ÁxŸyKeCò¬Äªt€=öTÒófNu¹`îU0îÒxô‡Ýävש5¾$±;™ä® p–È·>8JÉ<™…Jén>±-®Íœë±D™qCÐLŽmaab3éÂI¢ë|G,’. ˜V‹¦7R^ñ“}râ£ûËb[¬~,ÒQ«˜'ɲ‰š[ö'õ—? Iµa³ÃWG“U¶Û#5©ùK:ü´ÓN;í´ÓÚ;:^<àNûMí£ss£‹Xlu©ÎXôãÞÕ<2V?{E†(E΢ÁÝÆ¨¾7åèWCÍë[îÇyDòsd–G ›%#Ã"À ¡+Åà˜3`Ihµ~ÝýX…ë£zݱ×E÷¦¤E2„Pº}ÂÌÅ*V€£Ózm™T[m¥b% ôöQYÃÔ%ð‰Œ¬¬*²ÌtÈ:•YÆÚw8lÑ] ƒ,žÀ@Žöé%€¡7 *ÀÁë à…„¢|ÊÃ:𔩦Äû^Ðx}’ÜPËôjᓌGÚÿ>·;·`Y… Û‘¤IÂNÔ ùD³â‰qdt*9jʳ îÆ„›ï µ4úH¦PôrÕXÅÀRñïŽÞqÍ' t‘q•bO)!©Œ¡ËQ§¢ÙƒÑî4£Ýœ¹ù„üªq±Ÿ6’Ýü#_ñ\`[n’C‰³Ñ²JK÷GëÌini[,ûЊ;Ýú¥HÅ­á˜Þå"dh"ÌJìrF$u]¶Õî/ó’Z'Nóç*ÕŸÒ‘‡(^T¥Í+"nHoûJ8t@^ô¢šT&7ÀRN! ãó;Ûø(®ãŽ+ázwôvÔÃw>O¢û »‹«ZÄR­Júû¯“ YãUÏÁàVŸe½…‚eWi„P rféù™.r¾V²K¹ÅÊ”­C£ó;[äce@WMÕÉ¿ÒWÇWâèW_¤Í-ñM;„~aê³Ùa¾ŒðÅ_^êÛ½1aSmxìÿýN~ ™9MGƒ§vÚi§½}/i5èÿê´o…î8ë;ùcö™2Íé£aæ#Ú,=:|Uh‘–&”²'»ê ¼^v5LÓ`Kçêéc~f‚ 鞈BfF­c½±Ã ¢šT2OfM›ä% ˆèÅ&· ‚´ÞÕ¡Æ_º(%oºÛÂDDlË>’¥ÛcäÃ8ôxRϲwBrnd†¤½MŸGUämK>Ž3;¨û8 IDATJ­p‰Àã$—YTúóÓîÍ& ç—À*/ëÅÁM/æ¿MPNÖŸA@BnŽÀm¿Fêæµn86¥dõ ±ü²ŠnÐêáý'¢Í†F-§U†ÐS÷`ä˜ÃíÎùeÎ$$Zx´^3¼éç =÷A¿U 0½ÌIWÛ„bÉà±x4_sÚN a¤Ì‡Ã°yĶ1*OÀÐ$ng)€ó%JhÖ0,ðˆ?ë}Ú?«nTq‚XLQdЭl \¡µxN§ÌýgsyɦJ5ÿ¬¾~&¥å]>£äÆèÁ>?¬UhY`J\@œs^@ˆJ¡œði \P>˜S)ÙÈ—!Òç‹›Tˆ~?~3¼²ìãb±âòÂöØâÒ j§Rƒ<5ÁÓÌÑûâ"ZïtZE†¢ôM¶a™“ipQ¾‚¼"»¬Ë `o¢¶µOXmþðžIs ©^PRuùZÖïJ¨írcb2Ñ)eŽþ(•(» ^Âì¦&?…þÅ`‘‚µ|³•v>ë/šÄ†Þþ?óÚStÆ¿ `?c·‹: èO½ýÅî«Ãlóè…ýÂIþŸA¯N;í´ÓN{cóüJ-í) øÆó‹ó+ øÉGµ™B¬RÏdRZû¯ÆÞãÂYBt…L²Šáa_fC`PÄc4wlÙŠ%&Y @Hä׎ºbs%%‚{p¨)vÈüÓO4JðÄxr ;8J‡gǧÒkÎs³ ߪó²Œöö‰¹ƒå}˜òI’œ'Ë&¡Zû0UÃ^5…©v¿Ï¹YT;©=¯æP¢OHà‚dv-ÉZ=U| HE=^üÒ šŠb›'Íp@ÛÝ 7»™Ý>ÿ7¢ñ/{ãß„²Ñ©±—•ÎgN膡ÿÃúNFg¬‡œÈ„KZP•.-…Ú«úÙŠÚ•…DŸôf¹M/[i:k„±»»¯«åÿw°'„§ãôØò Õ³^¤+¤èX—×-þÕØ°›o~’'±rèO 8Ü“CìZ›ÝAL‰);[2‚írǽœÜ/(›àöJúí5güL˜Ü ARèw¤3§Â«‚ ¿£æ\lsÊ÷4ùã|ã —ÏÀ(l á¨!^“šQÎ<Ö¶OV&çêòÙY›Ké&ÃsWèՎJ6©I²ïñ0½`åk7{I _]õG Ø8™)§ ic@U3±+Šھå뽨âŠÛ±!Õsª…÷,‚U})í[ÎÜôY1æýmo}«a³O¨E펶ŒuùÊÜ^=dõ)Asâ ŸÛû´qéÎ"»sA|ìöüË÷zÆÎhªàÒ¦‹»ÂLR§û´ÓN;í´_Úð|Â?Ûøb76PÑG½\1Æ ;hÀÝcµNï\\ePÐ|…ž’ô¸Ýňo×ÜÒѨa0u ‚ûëÍ!b@¼asF'Ʊ×úˆ`+e¬…ì ˜°l °` 4ß±¤¨P<}E….AH”®ë T[›n9H®ò»©÷Ìþ3rùELƒ0“¯D«Ú\ö«§ ¾ºÓa³ÃÊóvÙÕ…Âé` (Æhs?Ì"šJ­ÒøÆzñHqзq‚ïWšêúó›=Tz¬q–ÞÚ9²˜WYíÚÞ¼€ØS¿| Dub³AÐ䷳ÚcÕ'6Nï¼ÃÄ¥ÝÚüzf Þ·ÿåO€¸¢º>7ã«£‚èóLœòÉFƒˆoÓ¬¾ :%Ý­ ‰~å¢LþûN˜”¯Øà;ˆcã=TRÎéBÌ 4™Î:[PØ(SKI–z4@ÕÆÙ a:aÃO¬,ƧÝLjs’{`FCˆ{žnSôR<9O€f-×”BÍGþ)Ë ¢z“eåv¢LùuÑÃbÉS}"ÙïÁF~Þ±P Ö‹¦Ÿ¥Bkn2 6ì¤BZC¼ƒzC)I( L$P1¹ðLgŸg^Óš#CM­o‘ìð< šPÎévd +ÎñÙ:XÌ-%I%¶;ǨtYjËBõ¿!pÏ%£ƒý^:~aþ„K~dåpr%þ"åëˆ;Ÿ”'9½®m¦g&tÞ0SoÓkzKî/‡/BL—ðé@Pv#×F¾\ Üiß°^NžvÚiÿÌ^xv»t ¡ÑLÏKÊËGo#™Í!B¯ÉÑ{å’z€õ×AtÄ« w*h/ú—,ɰÝi78-Þú»tr“3ª&p¬äQ«îìF™ŒË¸bíÿOXê`ÙfœÚ«d !i¼È;µ{ K&Á–*¹>ahvc åøŸ#ËRú‚DušNd‰…ƒß"ÓÈžÃþ÷1U(×Å7(ÞzRYó]ÉϔрéhäÀ§fº™!A$lÖÔ #@–m¨!ìf4Æý÷V,ª)½>õµ]²Qw7%®õ °kJÔBdsQW’í⬠‹â!×NËL±ô«àfA É×­\5%—ä”çì§„ÇÝ­—›å¬’'ɲY.y ”Áµ_ƒC»ü›ìžDLÁ6§ÙÎ%i „#À²r”ôm¦56Mbéò“H¬v23²S«·soFcóÀh·0²ø hf‰ÅŒ(ý!L¶WøHBÿÍÉ@…䇺¥@ù¦²l¼t¥è\¬«{Ü+ u´;/¤J‚Vؘ6óò…‰¯ÒµÓÍ3*‰YWï}Ðâõz˜TS†æš]uªh‰Qª“¢öjY±¿Câœa”ÉÌFsÞÕjzC!$Í1"ßñÌå Ó(ç„r‡‹›€TòûRÊ×AK´ë7SL”¶¥lJ êù‚ÅÌÌ™`d¦ˆ5‹è‹<ít^´Y”K±)¤<¬/dyWlXßZW“{Aî/†3ò’_i†ò¿åqùgôÆòþÿ· Müc¦×i§vÚŸ_§ýmÇI÷Ið‘BÊJ] Jè.Ÿ‹6Ê”¦„ÏK‚“Éè'2ÇPÆ7µÞY~”õ†RžÎšlQ·¿qqÿA‚‰©è!O\ûæ£ jåÎ5™Í8øûZS±¢$Ì´d"íå4Ë0‘Ú¸¨Ô’ƒ‘¸¼·5ó>)_jï^ð>õR©nQ÷\z_'ó^ëÝ–µ¡ÈŒ¸¥ –”‚…iTõ•2Ù3tI¢*.ðö !ö—û¼3@MR=NÂBËΙIÇ™OžuŠWáËq `»±œÝÎä ~b {«Cc¶< Ó€=.fhIš]ñÙ$ö6,$<s–.Qqñôñ(êº]Ó©jUý?ŽˆoÇN‚g·"qv/îÞ2!I ñ×ÅÓ4BVÍœk¢n¡H©ˆÏJ‘„K&²X#)³8ØxYF°²?k‚‚ôã+˜å¼t%DÝ‘•믑Y÷ŒubÇ4Ø5`1¨[‰D»f@¡ÛÅÎ7 k:3Ï-0t—qÓ£*ßpýP\=vež—tàæs’A \:p"Í¿Ô;òåeu!ë…zÝK٬ȮFG) ZLÂÕýŸR¶^ 0V¬˜šéJ²hØ…¡.£T¼.o’K—àܧF’²P•~eUjB¥¤ÒiÙ¨i†côöõI(I¥W´UÅÆÆ•ŒIˆj®Ê’&=¦žbàhó iÒŸ:Å¥²³RÀPVT¬ÔI]Ñ×€ãùüù®O»ßkÞ{ëçyOö ß÷iß&}{É‹È÷Hì´ÓNû'ä³Û–ÚÇâ~€Â±]Í/ö8£ä{VeÆK?ˆr5Vá@»'÷¨Á«Ê+H$…n:‚.%elÝó&ì|2˜åÂa¬`¿>á–Eä´ ñ䪧6M—¦slƒ§-ˇÎM&HÂvé3^J]·"¾ˆE=R V„qSl“u<$€5ÁS ¼@ÿ§¹«HY²*½^-r»ªŸÉ÷â¼—bp˜”ÞëàÄ9¬aË_]ê`cäE"{8?pL>)çO™¦ ,|¼ÀÄSØü”©A¦`DOÛ]îQÄ‚%‰9£c‹Ü»à¿¢f‹9ý9¡÷z5·GÑmb¬¢ Õá6<`v/"Îî¡Õ¾Zr½×p_[ñ=a+’ó®@¹ì©d¦Š‡™Çèýh&œQQÙlþµj´Šë^& ißɦÇÝ‹û½±€³—åu¨pŠÚ5·šï$Î9µ“ÛB‰òè*e}2ç?Ä$qŽþ&RœŠ7÷{WÚæ÷A\ÞÝþÃ㤞žó eØSÇåòØÈ l%3*d˜ñqîÈ€T D11Ó¥Ýe±%jLŠ |=¢¬Ò›‹j­ùIîÑXÆmЊ‘’·™¥ÃÜ'·Eiu`6Ó©_¥ƒ©=Š­Éœi5Ýö¸"RÓ_’+O˜®§¤œ?ò“C­ÚíqË"C5ØK è\­èTŽÕWS¼¯Bœè׊ƒzšEû#ŠWS˜µe7 ! [¯ÿ¬_ø«lJÁ­‡…õuJÙûv8?Ð3?õ4oæ{¾‘2Z¯<‹à3‘€æ( ¦8ˆ‡á{/Ø‚„ÈKwt_zŸŠÌD©rú@”Ð>‰G™ådîà˜@–VWDYra•Ï銜D°Uw¸Ž;¦ˆD™Hòã}‚Â!fŽCÓ €Â!ûózmd%È:Q Z»:kËÈi~ P`aŒì£;çû¤‹ArÔGÄý]G\ÍáYÊ•|MšáˆqA‡™‡.!Z¹ÊR:Í#éˆï˜ðDè.Q Í5«Š=j6Ôÿá&ùDM›ÓJt!38eQ!¤"\u“ÁS({Z`æ}šáHŠœ&ÌñÄþ|ýUÑm"î;!÷Æ¡ðƒˆ¸ÙP4bEQÖQTB`‚ãÖ$@J\ûz*æÍð=_n1@RÁżºË]¡gyf7ýr›HÉgUUìÑÍöšÜN>(5A¼cH¢à•k@ƒ€YÑb˜”&Á+ô~• ²‡|Ô)î€(Ftºàpmh¶¾¤—3õŽª(JÃs“r1ô•ýå/ [Å£Ò· b*7?mˆÒWJÑ A±œ¼l.?È6}ųsÛ•ÓN;í´ÓNûWÛ‡¾e¸ ônAJ¸Šû3: ruÊÒÅ0º¤Z*/3ø˜d±^>òƒ-vgW«H»ïQ¡žÑÅiL¾^¾€‚-~w°ò £(HhòR Mr/B„nE´ˆ¸ z¨:¢?ð7fu£eyM¦Ø8Ò!‘”(žS÷³bãþ6™]X#Žž  Tk"*ÞC±ðPýœ{^³zŽÑÿž›äŒ4®MÓ¤B.`3kÅä’.B¡[Šà ¡!z»N±æ+qx§™=ÆÑëÔÅT°3ô)Ì´x—Š%vš …ÐÁîèL #"V¹¦´lÝá±¼éžÛ¿Eù¨OÊ¥´3¶•d‘ÅòoÆ›üØ)&Æc2ÄI5~~sãˆÍÜPÁQ¡‘& ˆ“i!ô¸Aâ€c²;Væµ[‚38›ÙZÄ%Ó†6zÛ±ÊZXJEÏQ›þi™J4èôÇ‹FŸ§Ôàê,2•FûUë.6d>%ýÞ,ú€?ŒzÝmD ·)‹spH_Pï Ýᬩ÷››çu«‰SNe³½p£r«2á=T`Ôš¼x{$…¾?âì¨P÷ŸÂ`ƒ¥*ðóõï~ó„ÒJB,}ó³hO¼£ã‡¤ê€{ñ.™.½u÷cdT¤+ßB «œ/¡ÿè6þʯÏ@Êϵýt@%BÍŸsƒ±&E´{cát§…(Ÿj·¸º#qjCbŽÿ´b˜ã ëyø.†¾«×RFb÷o»;¡H“ãå_ÿ©2vþ ñ§ÿX;§vÚÙ{NûcÚ‡¿Ê»/)¸x¨¿YÕ3g Ï«ü'—¬É,:sV±cUVÉósPçjYzU‡Òȯr 6ò¤^™Ü)’xKnŸõîÖ" Ò÷Rñ|-ê·ÀZred¨$Mk5€ö:S_AEiÒ¥ë²:>*ÉZ’°ˆx5ñ½r:gU—¿è|È¢ýf#0Ñ2ò8°9Fžxåyµá"d£“Ü“|˜J­¸·xÍöE·ÄSû“ZH–8‡ÝÐ0#Z„haú©Oæ„’…¨ž u²azeîRf¡QDÏao-Î(´ÂPqb1µ#‡ªªcA^°YáP É…yp“ÛGõµÛ#t:JÌp‹»nM{ØÈ™=’v#ÁŒh¹‰ìµ!êÑAÝm\ NÞ +t’Ä+èʃ¶â‰º>Qüœ­0wO¸…©a€DÓów.d|êÆˆ‰†üO¶ç‘8KBVŒ(Õ‡“ÊXÞD=hìÚ©Xµ“ÚOÔJÉ]áDJa4˜=Ÿ‘Nº0åPÉרj\L,> b6zµ+$<ºPò1×FOkÇò¯îõ…·Tõ—¢œì)³‰E$0NÑ«ô”w_­Ö8m9Óió<¢‰DKÆ…ñSæu¼ºMÌ[‰ynX­iüœ-š¬È_x#V ¹IÄ»Èp‹ã…íW|Z1z=Žªœ.e%åå«m…ö“ÀóRUl§i/ÈrQUƒæ(ÿ& ‚TºýûÁþ¿Äú#ð¯ƒÀvÚiÿÈ^}6À¿áù°),xq*}D' ._×ß_YRü ¢Bw8ùvÖŠ] ¥J™³Âg>(ðà ‘Ð“”iJêº,@1*‡R9¡Q#,¶ÑD«$ˆã¶w¾boHÞùwCèX¬l+±”c–U8ÔByV*ùìˆ:\ù!Ue?ÄŠ]Ö§¹! Á¡‚Ýgé,*Œžlú‰Š-³;…1>¹ä/©(«©ºX§ëMG½¥/0EPPoÊ?¥›]U“§þ9f7:¿VκñFÃýùú—«ŠH‹|òÑ•(%8ò|ÜSFn£`Ÿî}_Qʺý_îÃ!å**®·ø¿êzG…ñ\½„¼ËUÐ*èø7e[­ÎÄÅGÞÜ[ä¯yµ)'’ ˆÉ5¾TÇŽ©ýZm0–¡ßØ¡äD”·mZ_FOõ1|Ȭ þBœ¨n_½ j"+™xÿõR1ÑDñó,˺¸’t Ãn€)úŒî/…™{ø7 ]&7—Îd‰6çûs¼¤àÇ[A'ÎR–’ˆ4ìÈSî‰fcØîОkþPá2ÜD¿?x>M<¿»AôÙ¨}&\ù—û@ÿ¨íÝç›kâ•gãtݲ W¢ôM ƒTù%t€9€I^ä—€!“Ý¿·½8³ÉÞí.ç÷Û³úzÄÂ:üSQ¤Z}r§vÚi¿oKþ§R ?÷²³ïàv#¢ãSœ!§`¹Uz´BˆoPf"$¸pÕ”3@ n%ÑåØpª ÔÃoŽÈ‰Û¸\z8õÕ@†.ƦºêUF§wl{éæ+f÷_ÖM#þ2¸È`t15Mº´I¥¡+67µLdsñäq'浈°€å™Â2’¬ð JµàtSŒ/*‰ K…ièÒÂÊeÝU¬*˜¸2‡Iýö“'Î+0ªŠ¡#Àñ²þy¥LiY,”±…CfgˆÕºj•Š‘õ{Qp˜ŒæÀTpCÞ •ß#—ʼÇàHöÜŸ|eY‰˜˜¤íø KÂP›E Ux×JAðVðÍû dj;#±1 ÷+Í€vEziÒ:£gßzñ ˆè>y`v0Ôáè¡ðÔ‡ã_îJ.¯SæÑÄæÌ[[B¬8Ö N >¤&@Hin&C] ½À›|v 2Žƒ¨³o)É÷47?çFÞË gi›‡>“]éÏ,K#dÁÜJšS`WáÃÙ¬½xÈõQwq𛣝ÿCCY­‰ê8H@!þ7CÞ¥gª«ð¤l \Ó.J ý*žf†Ûã a&»g€¢á×±“,u–e%~§ÏoÕ¥½‰znvª-"_öÊÝ)‘£É™‰.71Ù¯`ƒQÎ&Bšßó•_þî {‰öWƒˆßZóµÛ‰é¿7!ÂFD1ì|ùë¿Ô“¯°Ž–Ù¬oÀ™îÚi§ý…ðñoë:®ßÒ>ÚÛ1¤œFá”"ë!Ë0‘geßÙÄ6—O˜T}ƒ6#ëßÍnŸœ©á¸OëÁ))å¤}Ä–“¡Ë±wÖ0¢ø{F”îÅ£O¼méI¨ø{¶x£‚þ²•+´4¢KgÕb#£Ô¼“:pãR¨ÉèÁ«~ùa6èpä«¢å^ÆŽEíŠ2ÄÁ»¿;K·nöbsx•®îíI¨œ†»Ú,”¼¶€ƒ¯1¾9üîîéÿQŠÎc1ßvÉQ¢9è !1¯]ÙŽ,@XÅqÓÓ1¨ç^¡XƒNJÉ‘ÿ•©*%²Sg²Prm>½[on3¡WÀ¨L×xnÙtš>"?¡Ÿš YÙn'æØ«·œÝ**¸S‡ŒjPvk=›R|NcÔ='a¬O•6 O ÿàþlÍ‚HÙ g*Š>8"ф孱°±xfL²#(ËóõS+]i–fTا Z6E‡l`JÔ½·¾ ›·ì«LºÌvÊxëCÕiáî)£Ï*ÕR jAíæoö¡N%B%.s§0J½…g+Á„$—ìm0ð;WÒâý*ðjÌ ¤$r×Eê÷…q$гz±²þ'C·N•Û³“ïNpjE¥¼`Z„2‘ø‡dŸéI`"³¶¸×õJ¼r0²ék‡Saô~oòbíÀ8·û¡²<6ž(ˆjÔÎ ˜ÌiËìQü|â»äÛ2ºqøtF‚¹¨ÅåÁ¯¹¤7ÐFMK¨lU=õ4‚‰>¶¥*»Ltžð=˲ñBIVD´ÐW0Q¯I2 ¶ãkѸä°ÁÕ–˜8øÝÞêµÂ‚Ç#9ÚâÈ&Mvþ%ËœWk%ìdE]ã_j± §sÚ¸R5#v”Ð:²ºÌ=ZQøåB³&ãIoçL‹|Qå=¢Õ‹uBçP»©î'(å-Ut—]¸Çdêf‚ÚâR½T¾{”³Ï—àÀÔž&‹6Êöî±]#Ns9-dkr1Ä, µPéÒ8œ¬ê‚\¡o¡¸×IÊW„"}AluJød¦z¤?i6; ÝvçÊ7è} wû·æšIü^ò!ö»ó[^´?jçÃû+A¼øS,œØ¿gz{Ð_/›8í´ÓþåöÛéí‡_ÿ´u¯ðÇ3b¶T§o–%æ—Ry'ä¢/àÀµÌ¢’—¡'8‚(àÉû?¼9ÉïZn ‚Ì-éÞJ/oÜ&k0zaèæ ±gAZÃJžÝÜ ð—rIâÊ› ;`PÄ\0ã7·X÷lÀ3s#8BzG IDATqˆ€Žµº=ÞùÝ nóª8¾£ªžÀ¥M9ÄÓ¡ºäƒ ¬!QËD7ƒøÿ/Éô ef(Œ0ÄðæÜ§åb¹”š’µç½NZæ¼ ­†'B¦¾À…uí >S5ŽÂèsdˆ'¾yd³bB(ôId–7#¤‚øQÉhuåÐ-‡gA"aiì œi™TGbˆrC¶t〠j›U¤èàRÈWïÝó_ךŒ™Š·ÊеßB¾Í–ìd¢šruœTWXPF,•²i,°²:YС:…Ž^RCd£áÀÁ)¸–,jØC–“,°ô…,¯ôDØœqÍZÉ’¢ƒÙ²ýœÔ}Y,Ö“y#k–=°±p·¢¬È¸•ù+eþÌb&¬]‘ ’ˆynàù?oéñØ«dTïSpvßávßrrÂò_¸‘MŬÍÅP)Vjá»Pfï]¶†ñÆ¾Ä Y–äe€Ñ¥ó9éĸĔFœ·˜Þ&¡:S>R¹òYòí¨Gõé/Y/Þ¹D§Ù°µ|'J»Ú¦&©ß%)׌þŒ ‹7Þ¼ŠåWÓY¶ÓŸúÓñk¼âúõÞǾ—9;@Úi§ö[÷ üîø¡ýþl®¯ÝJ}$’Z¢²Š €.PTuúëY…€Ù%Dïú—»séÄÍ‘AüÁÉuXÕ'Þz·¬d}‰a(‡v±k½g¡b|7„qéôÐ; cu¿¬úÈ^¥$© $WøX× ²Ká~ìܬ8¸ 0Ì€7ný›„ú䆛ã[P°‰I$sT”C÷xn- ¡áåEƒÙ5Ê̸֖ü¿»4Øà9²ÀšVd@0+¾T•q®­ ÇL~ËYq‹ñ·âŸÁ¨káq(hôÐËPoE™LÙºúO–ãmŒ¥âxºä c­@xdýüÙ^kÅ£Õ×Tdx£´·£ÒÕ‹ª¾5™¯ÇJ:ؘÆäñ5ë/>úEuÍŠx5&^AÆœF–©Ñ¸LÝÔzOH…™ê=’OMg*®æ¥;êõŒ w9¶[;Pþðjxkª%+q'ßð$È·c½¿‡a»[vNz#½«åàN™3X²9ŽÑž˜ãX¤’Á!…¾ 8_‡xû Á1¾†ë­]Í^eIO—¦¦w ‡ßò†ö~]ªßu8™rˆá*W Ñ‹¬ |#€Ü½}ÞÞTÍy%Ÿ·vn¿SX^ßkÿ[lPòƒE½ýÔv¹Æ5®q+þ+vµ«ðÅ Ár ¤U!µ£H½„§©£)&ìµÎ(>¯äÓ%Õc=¤`R@œ¦z3{´^û»ˆX?aSd¸f÷Bt""¦Vl'.x‚çës«qŽ{5âŒZ­;µYÃXÛã ˆ<©A:K Z#ÌÞK‹bÒ½24@zqŒ®Õz!¦2ª%ƒ¤Sì”dê\òðnÎ{ 0ÚMr"­kžîÈ£ÿ˜*aŽV\j‹€¿¤Ô[ÀN®„ÂCõµ¶°N«Æôº|•L&Ñx€À4¦ùYÅ×áË3¨fI-0¶/èæ¨ü„þÚ˜±­u™Óœ³bªŽøÅ8>y ÛBrÄ?sYÖÒJ¼ÙÀ[W5˜nú'ˆ:…#Œ} ÙÈ_Àm†5ÙGÞ]m§ ±–DNø(qy¨èIûx†·¢ dú€n…¤NÃŒËÖÆ2k¬Âs_`³TëUQúå¤KC0}×QëGµm û’®W•šA«,´¹L¬5ê†ß†=ªhÕá6Åolôé b6ö ’º‘þVu4»pˆÛÂÍ3C‰6åGqI{ð¥$Z;°D”ÿJ|ýµÕ#l;ÛÖ Ökòp‰Ñw \> _rnê²o¦Wƒ±$°†hc¨¸³ß±)I×Ïø¨¢TWY¯\“>ì~†+ÐB5jÈS{k~“"Ï?Ãnw£ÿµ Ö0ûÐÆç ^„(íóæ/¸‡ àyVÿ]|ÿÆïËØÌoÐÿöv ,!• …ºÆ5®ñ§âÀWÏÒñu¼ÈVF´ïSÊg'ø2S›úÊ%å|´7Þ X—0ú|uEÕ=Pè5¨¨BϪŽC ŽlC“m'šdžŠ›¸C/|ãÉ\=u[»]å½d7dÂ,Òû6~s¾|(Af`=óÌ{7O)àÅ€^ÉY]s«Ò»â˜j‰jVš´áÊKLP‹‚Û&Ó¿Öc`wڤ㻸á¢ëŒñ(ƒ›«lª¨ T3Ï…¶_®•ˆ€oÜ¡FwH}#@™¥x Ž|~ìþ¨Æùê#•·mj⡵\T!­7n6•ÊnZÓ/œÚÌXíN(%%é`é×i8‰"2B/ËÖ§áyOÞ!,Þþ'I£,´,ª÷;·*Æ~­¹ýÙЯO{söa”â]UÂÃO“ÜO6Ã)qÓM‡©ÛŒ±š°FïB¤Ð|Iqvw[þ~,7s´úÏ,«&˜ödgFk(*b©)ú÷‰yé­àéqd` 5v¡a÷W\]Ÿ« Œ›“—}0Ü@ç€ÝV½_!”øž3ºq8ÙÒF¯Þø/pèµÕ»#ËqðŒàeŠ gÿÕÜü §Á¸qæ°zFüM5€ƒU÷¾“ïî*׸Æ5®qoÇ»¯Ûy½êý‘(f%ñ˜Âú«‰LÅ“d?Hµdqyz&}RÓ³µ¼»'u˜󚓉£³k.‚@„‰¸]¡Àt9èÄY*ÚZÄ¡8ÌÈ‹%’TjdŽvo­ÐUÿ³ãÉÜ£5+_‰•%Åç¾HÛѦ.¿+§Ê”ûÛgÁCS_H–Ýh^ñ„Ò–ý7!#@ÀtP44v†«Q¥úN'z ã ^Ç]Ëí´û„Ε)Hw|æn³}!ëW0¬¬ T+è?!`P=‘²Ü¡ZØjxŠàú‹AãU@€x˜Éõ‘ X›_Ñ–ë „‚º$ÜåË®÷¡ccÁÝ[–yÂpÕ¹Âûs‡÷å¥Ï]úݘO)ØÊâœî‘’K¨b›¦Àò‡‘Ù×—ã=*ñr“Ýkõ%ö­3<@ Üw¬ÔGµ´úóYÝÒŠfùf¿osu ˆÃè JÇlÚ”ÖXÈ~/êþÅ¡QC,&'Î&c¤ñö0ê’‚)Å™&IûV;1Ž” ɰÞ9’Ež†¦©Ú¤¾!¿Ý>Æí…þÈùbý©Êú¯¬>Ô{NãßyŒ?³$ƒƒ†,sÕ}dõÛ~âÌÉÏá*\ã×øOп~_ç¿õðñøh<¡Š Ezþá-‰op…gņHSe±î´ª >’[¯€YôÉ|(¼„ÊEIV=LF…oÄŠ¥¹’æ>–¹` 43ãŒÅÌS˜×õ°¬75ÍÒÛ,omK³,áÒ©éïC«Íb¦üN¼þ=²ÆÑX(qA#&-ŠY:漯&Ë5/ÄF˜¡„D·‰R\P{G «RåĵfV=dÔµvµ™%´¾]Ö´ßVð ™µ¼Œ1¤s–š×!•ö ïNMŸ·ØS§5ÔáJÌ» {VrÅÔèµþã|@„Eͯ^:´ +šêîæ Ò$ïÇ»M¬ ¡÷Ìð‡¶[G¦ÌúJ7+ ©® ·“kd? Ó[$ž³üIxwˆóáî”wê®öÂ&¨¦m%® ª5/U©Î„R¦Ž¬>¯Õ>N«ÛJ¾@ƒýkMú{œÝ]'~9rwJªn³2Ñ•áˆ'[ƒz-BèK Èa 8‚’ÚG_Åõ•K­q%¬)Âþ¬iÕØ)%ÝzÄþÉÞÜØk“\᜛h§ëôxuœ¼ãˆ€qàû² åC85áã½Cù(p‹.»‚ ÖÍD«O€*ãïÃbiã&›¥5¶]¤Ò„cûÞ@êª(5T ×n-)´ÅZQÛÝÂkrYöà!ž»Å^Rê6íúnÐÄ]_¨åÄ r#Bû6š,ÓÙZÞíãùF”ûåª^Ÿÿêè®2À5®q¿s?û»Æåðöüèž#¢÷ ·öLî“(9´“Í­ÓfRhÐöGÚ6Åm™ÓZFYÞ$ºmlzò+D™pÄ£Pb-ãh †ËyñACš0CxxnR¯Ô)®Ÿr¤W$¹í’ W¶¾GÂA”þ%»ª"\ÎøÓž½«Ý”’’¼…»ˆ“AC€€KH:©ë2*щÞX£ªZÉd«vš/"×ÊêC šU5tì]‰&$Wá©•aï™úJ€ì-,H©Ï¿½™côûÛQ|g8цܥ„þ56(”I5¯“áÕ¯vmf¼’JYj¬{œ=Ýædw" ðdQc£ðTøüßRfYºGßPú«dYè&6=)ñŒ ö-¤¨Ñ rPuJNx±~§àã[©«Eñ¸ß[ðÊïKÕŠñ wd°’t(ª7ñUlTtœþŸC¢ ¾D9ñƒHQª”#´›xëZÄy"`b†¢ J¤©šŽ‚]®;7FÎ2£E²Xh S„® ¿Vx/ÚR”ý±±¶á•ÛÌV‚üÄ2aR#¡41Öô!”[œäuùWìxÑÖƒtl•m„ÍÙŒÞj¥:Þ·ï0xçQá ó£hºÄ"§%{ü$J­ÞÊ)D‘KVĪü+ Úˆ;¹ ×Ç¢\²×Xë +w‰Õ"òBm% êÙâñ/ö‰ÃQª¼€w13»7Sî~× mYcaÖ½Ÿ?8Z•© ö͇³^ÁGÆAx4µ~âr ùÖùµ×ºxÔÄuk\ãg"Â#’Žë8zë]Ž 8ŽÕ„’ b‘GÓÓíÀ$‚ã›7q!J÷%]‚há jšd¢N1­Ïñ“ëJû¥ —Ë*­$™Ö(Ø IÞDvÝ z)œgì¢/^¡xˆ¶–Ǿh›H…©X‚÷·›ÐX •a¥i}×Ì»€orÉöQ Ë·÷%¥ÑÈVzä‹P3œZŒ"í‘™V!ôI—ÃKßHN%÷ „$A-¯,?1C„ÜìnQ?ÁËV]¯Œ$ä•Ù´ƒ0” ÙÏóäÁ àk+õŒ Þ <>Ÿ.^Þ«—¸•–$—ݶ“µéË!Ø’ŽÄ»Æüι›Eßá\`K v,µN}ùcnÊ1Q7s«Ø8±¨¬wóæõ¡é$µÔ, *uiOôß!õùÃKÝ$ašíJ44ç4>ûÏnî§+¹Ø<í]óî0šRCF‘%¢üN‰r·ô/V6´bƒgÀH"›,ìuÿ†E9$•Ð ,²O)ßp¶RB–]+ºÍrزã!yư˨ãÏõ×ç²÷éõÎáëà LeŶì\@ÍÌ‘W à`œE­ˆ‰¤^&Qq&eðô”˜›`B‡~š·È© é~Pù³2a£±é•ŽÍ¸Ð˜e—€)—À>g¥úM¥gbëa=¢*]Ô&G[Òÿ™M)õŠa6÷®‹°¶ÆO›÷g)Â1:‰e&œD~(®€Ëü"|ƒò—À« ÐMݶ>å¡(ý7 DÀb7âJšCnþþGƒ ʯ¡ÓæŠzz”µ(%U>úÞr5 S“§SsÞÂ^çÑ‹ce jñÜY€—ˆwá-©ÓíÐwïáY@B,,Ä·qküWóµÄ;êÑ`ÎDjR =d zß2Õ‰{Ð+Y¹jмuG|!’6òåÅ­ÚƒÝ`¿¯2Ä& M® !Õù"θ8½|”•¤Yæp‡Wj©´E18N[© É–Á Šåöâ¯îI–¶Âso±§'Ißéë@–˜"¦xu¾`àN²¶x¶5ðè0kq¼:“ë«y—ê¶Áˆ“IO})ŒA @¯žFj|2A8~n\-Šï@ka1uÑFYZë¬ë3Bã>"ÿ¡ôÃXÜœëªdO¹8}¹BÜ—9ëpŠÿS²œŽ{è™Â–ÅOPszP†%-¬ ¤²žg‘TŽž)²•Tª1 ôg¼a\|'ž±ÎHËüh¨0»Ÿ}ìÄs¾<Ñ;=‰¤06ì7óG–¡©Iöj×|Å~Ey aÓì6)ýŸ5¶…kQ6cÂ;Vµ®Z7jèN(«Æ?|B€ Ö òn% Aç›ï_[ä¶„¨Â¥ ]‰à±=Ñ©LX¥ÈU¡ôûÚ⥡…i隸zéjZOf,Pø­(˜Ñ]пA/öÞCûF£Á)º¯)E‘›3‚m)c§¥ZÔ"ØhÓ…j™‡þãZþ¤]{ÐÔ»£)ù±*Ä"à,†’ vüÇ¥R<¥ÈµW¡ú<ãv ¦«Ð êGsÓW̳‰³C^ž_˜+µnŠVîïœÁÊU]Cã5·ªûGUd1Ä.‡ˆþó °®ÃGˆO.@ÕÌsGyhQ‹é YÔ6ŠðFJ5"ãÑų¤m¨j¤WÌ´fš•ˆ.J„+NáwXHÈÕ…TOõçDÒÝd/êäýíófW$Zª Nw‡>ŠXL<°§?CD¤Òz¡*¿ ´"ã>ë?¨¿+úH+"Í€ÍòªÅôD„b `šœÇ‰½°aøÞ¤é,_þ’…ZW»G÷Û¿^ñ`¿”î@|Ó¯½ç|ú1®Z™Wú®O¶‚߀ýb¼»d.Aëk\ã¿€þK7žKèíñQß¿>ú±š% ˆ•Ð >¡Õ‘RNiÔO ‚Xâ¸eíö´©*E‚ÿÖ ³‚“„˜¢ötH·VÙ Ý%ñ öh–b©2VKOÛ¬¥›¡Ô³%(éP)ø5^TŠ‹í2ǬA«’vMèB¨ß‚üMçáKÔ¾,t{nÑ®'äK‹ÝÎÖìRDq¼ˆÔ–hï˜ ca8ÇÃ^ûÂî³·³ÑAJáÙA²Ÿ×Úò8ÎÍyqíŒô(vÑ¡w(d#[Gk ½ßï¡(ÁØâ±¬5a ç7ÆH¥HÂ?½­O/´â5–骻˜|hö¨3ó<¡ixsúÝ9óQÿA"îTëvŸz.ÈHfñ̵Ñm(ÍÖʨY—&§n X tR8‘âéu_ÅÒŸ‹F>Ø­n¹¦ö‚“þ£ä+Xõ–Í nÒvÚ‰ÒKû¹VwÊå†f‹³àw Í\†›È󯓵8~ì—!4ÛsçOƱ®qküçÇU¼Æ¯fYÿ¡KŸ2jÉžA„ (![1YTjŒKÝÍce¹«I¯øQ£"òEbÊ쎑Î/nšÙBMºËÖ‰üëø =˜ÅüdV…NE¦L<*ŒÑ­rn~‰Å· ‘ômTftlÑñ<]½E‘1*2sÉVeÑbÓAŒ¨Ìî Ù*ÁÖûÁŠït³¹ ÕϤbÁ zÇë %:Ÿ´ 1›Ò‚MÈàYZ5¦¼É´a±+DÆ2¸LÞ½^ù¯E©˜^‚Ê5WaûD@¬ßÌÙM›Ž<À}öPŽnlÒÕñW(»4£~ˆM Y(>QƒY:×K‚ш”gй¶CI„b8@xs×Ù}}=zKbñ*ô=•:µýîY$OòóLÀÙ\›› €Ömî¸O],t{”´—wG6•N…ô´oáH"ÿ´cQix´ZÅ&QíL™«wT9VÎë|¡ëL‰rç]—@çÙ.š²ÆݳcíYØ~¤_ÄæÔiïÎ!PÃ?ÉàJcBÒ!$ÃÞ2©Ógœ™²çoÞ#¥w£§b0}©Ól¥ÂÏöBÛÿ»zö”£†%R—«K>JÃy1å¾kÕ~#½Íü×Ê4QïE°°Ž®Ðñ4Фí0ýfSZ¼2 ‹vÏ$Úƒò n™íÒ¨kÇNNêrµ7ç-Ýï‡;±«WKC…å%/_¶°ðE˜¥ø7`Üó‚÷‹\_øÙ5®qkü7þòªÉï²ãù¨!VBúà@ЉF׎MŸŠ!ôOiá„+ÄiûKjÚ(¿˜8ìÑc@¬$R†u惧N „5®Õ.i¸ê‚O§]ý:ê{ Šüt¯Ö’q*¢\1û°ž¨8³Ÿ*ª5¢ E&–ʼnúŽôwž2ˆ¦B­Y°¬K{<ûž$tºN…´²²{žf€¥ÜâåÝ6Mj%#±ï}Í€®ÉØû×B@pXXÐ[òJŸleN9òí"‘ZØIgß*Z¥{ÖÉ}—Ž:šj Ì(mÊç6þ¬•óøl3ñ–N}&Ž›|Ëe•h¿ìÍÛ–QÌlCÑ"Óf’;/Tñ_,xá3†¾.„)jÅ´ bv~&‹ Î#gü#‡r’‹RÁ"óŸ›,ÕðTRŠZ¿}p¢Ÿ»ýÝ/CjE©ªx6L}PÀkÖCN>1ú;–õHM6dvÍYHRo¾œN$šaæËúÐ"D£ ÎN®¼¬°³ÿ­U@*©“ÅÏE€²Åßœ¨ÎÑÃE‰pbáÇœ!m÷ï<óòÀ­. þW¦Vç¿ÐiÓr"X}›pÞJ½YN¦}M´Ú-ŒšÙ&%Hg]­ñíapµ°¢©UêÊ—P]kxÒ™%ܤv›$ÐÏ·mSÚè"ㇷgÊh]‘^è-ø™©*›3ô4Dî3 4F x©%Â+…ª©û§è4¥Ó™óº.ÐzÇúë¼û„¯qk\ã_Ûî®ñÏ)é° Ü5£9~ Ë.C‡pÁÑ‘€sË4!f"i\fSæbíTë¼ÈÉ':ù£¤R©›Q HÇU—ñ%\{µ´Ü‘þ-¿Ò`”5¥xËFgí§Å ŒÖ˜}ñ P­e$Š»ZMÍŠÖ‡D? HŪرü¡mLÏM`Ì‚AœÓ,E°M˜…§Fx¸±'aå ƒ¢¡2«îY9ÀSájþ.­ºÜÅØÁ͈tõqןõB°Q•è*dñ Ã#Åô¢´XeôZ1ˆ þY{J ' ®œÊŽµì¯ŠieÄ3íY õî™7êw6h «áþ ¯ÇRjaãPªý\üßÈøK†8ij¢·t S¶hzŸ¤jqm2+qÞüýkbîé.m—‹}¸~9úH[Æ¥ˆÕß þiÖ:eÙ‹‚?vÖlñ"j­¿«›•ß’ØV"Ò×.OÑŒ`™.¾uÛ?Ï•a3Ÿü>Þ}¿[ú.$ /ìM?í ^ã×øï \ˆüiü.ú¿™}¤dI* J ” úÔc“çx¾Èð|@gð Öï˜h %â'ì£Búp ÚD)ÕD’šMÁ}Á¨'q² IDAT²Ê•&Ï3%CI\­Ú6Ïj» ö¼$ð7VÒ ”hâæ©nQ4un%]êhöI‚¥5- Ç; &AGV`±b„óæèí')À‹“í4X5¾}¦ŠÀ"O!5ª8…‡á,šL0¿¸›ø_jŠî{w†£/Eñn=tïþ\æ·â ¹^Vm7N{as³%8Š'¦ÄvM©!‡äó@Ûz’WY€Tð‰¥/k-è~^"ƒ ?¢ÿççŽzGÉiãܰd±^V¹ÛÞÒ"O)Ò¹9©qT¨•™àã\QˆVc'§÷Ƥôga}šnÓ’×OÁÇ'Ÿ m¾ªŠ…FL©4Œ„ðè"Z‘Êú$íÎf‚àûs¼[ªþó7s•(ìJäÇM3oÃîG²x˜o±S`‹TÇ•|Mw],Pr¦{[ }”²“üãÊÍpXŠ»,7CÌ AÜ”(Üq;V8z°µ±ô‘ãY„Ív²q'®6^6à¬u2/%H 8usyFÄÁdé=n†ìw Lå:¤EÖ—¨{¬Z2T®Ð­Ñë®{ ÃqÛjûýÌ­~QN|89¢€ ®„èiä3u‡›€”ER˃àèuxÎ0 |Å¢ ™izß8cÞt½_û¹êhÿ:Þüu\`U¦á[?vÆ|çïè„øÕØY×󴧃]ã׸Æ5¾m\U“WGö­Ð g„•Xºc/Âþ€ãîyÁßGâD»á Æ£waEk=w,X˜rÄöúÑIO‘u¨”;~e3„ø}lÒ¦Œ2kñ(»QÂûÒen¾ ѧû"tTi†Ôµï\jNzKƶ4Òî^>¶P}îYm¶ŸšÝ£œ{¹pQîÛJ§¨€ÕðàÅËë„»M4ølRP¸'éy¾Y "ã­Hà-"uˆÙΠïÎçÛçtê|­›UXö~‘ÞSiQæ‰ÝßêÊ gûšâ-f¡‚þ¤&˜jÕ[HЛ6s¨4¾ì`Fír¼Ùa”§w8@Ù–¤ûh1A«›œqC>ç?]mfO!)H´"Êšrnaûö=[„†o=3p§[B”¬È-_³¯¯jà`‡3ª—Áá§í¼ ²ì•Ä7!:·zu'ž žö8ÛS:£ËFÆX„3iXb³o&üÖÑXôE°l:Ò²ØQ ƒ?6{YËH ä’–úâu¸ÂP¶ÁdWºH~lfË‘`E÷j£Æ"²B³­­·úm4ü"D…ûÊjhÐùQê‘– ¥>¦xP¸bÙ=¾ UËù ô,×OÒ™"q3oÞ›Ä;Íb$úão}áØ eKœõ9qI|®‰@_“Б÷O…¨û?LÍí7âu¶æðonh%ÅûÄú_†sp±ÏŸ°û·GŒÛg|2öû HÐ÷ÏÒ/ýüoº’k\ã×xí4»Æo¿ëXøX3ÍX¼v!<á\ÒŒˆó1$ý±<`¤Î_$b‚ê±AE„™^wù¨ßŸÐIPQô‡ì¸,"`:d¯°ä0Ši. EÛµ#‰jÿˆ||.”k£Ú2•AªÍÏÿ¼ùËÙ0&à v??©ç(J'ž z ]ÿh/Ä‚ :`ºG ÓÓ¦’URŸþQCÉÍäñ?ï‘î·!ݞħ@·Qê@S?¡b„*&æ¾"¬)î<ͼþR4Ê‹·ÙÂI@›(Ü䤠Y R8 <Ù$]#?Óîå »Ô/É¿<¹Ø©ìNêue[,%…»¶M7¿Ân0ƒÝáôâ—ž8×ϸû³dâWD”óv,ÓN¹ÜÈajšêÁ²ö™üÞïes¯ìÖìèTÀŸ ëÒ1”Ÿ)œÅô¸fè#ô¯žè}M=¬ÓèQ ß ß mÝl lüeK&@rVºj¡ÔÝôÓ!mwÍ4 ,Šty˜µdéÞ1¯„¹/„•ÞáÚ¸‰„›ŽÝJêùA#ÞÒÎnÜ£;w¦DPTý®£âÍÝëóx0œé© ßÁ÷g:ʛמּîX› 4«1šY†±4qZ¹Tëš›>SVôvÛ£»tÝå¹ö/ºíkv8õQª>Zƒf6"0 ³Ž`ƒ#ì·<@ɽÊ ­Õç´¹¡BªqdE˜“ZKœ©cTå÷ÈKGˆOÝ0xi•3'ÆÉ¾òÓ0ƒÌ“Ö[Âq9½—2#0ô‰¨þø¤¿áù·lQ¨ZduÛ+o1A“èxÐ\Öì0±9JGëÆÕ¶&È~'ßé,¢Íð¥þý´mBøÙª$YŒ.„;í~·O…4Àxs²þ¾´Xop°2ÜìU\”BQo'üw<+ø Å.*ÜÊvÎ*-¡²'Q¯bÝjÝ+Í™qW£!àIÁåè¬Å`vNÅlû<²ÔMÉ) ó±`èVf`x¥Ì”½5¯¹­u9¼f4 ñ,fñ€4µ3ú7NyÔ÷…I8UØøy÷åHÓ4jF‹ïð媵kaÇ:ŸÞ¢}Áï<‡P‚¯ô8þró¤3t»Š˜£ÇT÷gƒáùù»*TŸ\Qc–¯Ì ^Œ'Aت f}§¯"oX œk+‰e¯[VîÁ²Y…a“¹c‡‚3¿Ç‡¦÷åtò~*\®ì·xk;ðRbW$ïÌÊQWt¬ +µ"ã"­çÂ~ΰ Hײ™0/Éõ(;áÄÇØ%Ï®§›‰5{à:ü{méþ4äà«_\=¯ðâ;:øÖÕ®]ÊÍVI{y4^J8û‡|k\Sî×ø‡Ço\‚Ÿp^ ä0Ƶ¥qÏÇ‹|‡ôC³(&^pCsÙˆïiEÔ…@B^âV&I<”Iq:Ð)/n9 ‡•ˆpauA’˜Xðeq’„PªƼh+>ƒ÷$VË_ŽWC‰ÆB‹±Q™—:Ñ¿Ö3˜|SŠ–‘až&š  ÇŒ°¸n˜mœ¢ÅúVš¹wï:ŸwÁlp*f~1ŸåùÚØåt8ãw ðöüÛ»=¼yáÖ¬töwQý$§Sën~R‚ŒË.ìôw(és¦=2¼ôŽÇHöÞ és5ÅŒ½:®+c[C¶ú,ÄËH‡MÇjùPÊŠ7žØÖtZÙL¿CzD’+³F6ËÊJ˜âw&zuR¸Œ$nt?4:~¸“Œ†ðØX+ <ª’Ì/EÿPt¸1 Rû~^AJ^0ÉÏì.SÛ°Ð5 Ñ• $߀Ò&†l4Îëé„°«›Ã|¡¨ßôäj5eüe-³0-èÍžEÚÝ[Ü[(ê¢ôÄ´Bù>´_eÚiÁ·Æ£Ø'îæª ƒ%Þh}w#`—T™xµÎí)¢? Õ‚T¨ÈÕ©"ß0ôzæŒ3r1ûØŒg2z‡‹||êi®Àÿ! =1}io×ß=ÿaLyïmì*_q<ãB'bú9w0¹`µ|–[ò¹GgfS0SO§ê'heûúNºêÉ;+*,ô¬øÚÙÆÆ¦–¤˜N|Ý=xç{¹Î$¯ÿ¤dûZRƳgu|Õ|ñŽNáB4Ÿ_4šlßï…]ã׬»^Î5þ’ñ{[>‚qbD=îR/f¥Û'3’Ve`?©pLŸôÞ‚ bœDGuÿꥱÐä.läPYìˆY®\¤K.[£‹ãedE)>#±lB;Ø2Fx€þu\&I÷¦"G£Œ™–U™bC³ÂÊ‹ÎT,B+…ºÔ"Øœ¾µ|ì³…ÓtŒ¡€T–—UZbU*Ä”)Ë ‰ˆ a€H¿áÙf‘PWdnÝî]»GQ0Ó —…ïñk(þ¥Pxˆ²@#ò%„è‹®]’ˆJ=¢Ui0‘vÙ/ý¢ûüâ JßQ1DNâcÄúƒ0…wËXÒ蘰È$(<©RC†˜ =~ fƒê2W‚e5…–kR¡»ŠR±ƒµÒZ(‰ëPSI–Î[å“Ù8…Pkô¼ÝN*­žƒÚ¦ñØPGT8 ^ôãŸÅ‰‚þ'¸*…£Æ¬Zg^‹®|Ã[uÁ°A!¹’Ἃ‘úT¼ªO¬ÄÌ%ã¼ùš z¨ö«­¿ivÙ)¥SôÛwu¹è6±|~²Ès9ßf‹Òa­è…äýiÆ2Ö#tÍØº…À%2} Û“›¦’ßL T@ ã°ÀPP¶aâÅdãÂÊ¢ú§]4)±0Uõ¸Z}4ÃMï3+p9æ‘®3ÁâUmæä]MWÆõè¥ùaÙ9Ó¥¸¬ÅnT×YÂÝ+ÌÝÕ¯ß)Pí]^×sô°3‰û5 å̱AŠÏso/Z{ýߘУ}Bú§ðÚ]sùÚ»e;ó±9üÚ ºÆ5®q¡¼×88v®‡}>>¬ˆãè–dy!¢Öp™“œŽûx‚b\â§Ìé+KÀʈúNd Í\JËÛƒƒ– °É^¾»(…¼J[¹Ëîöù_LÕ”‹øß’(¿'z£€˜]Á¨¼¿V7’dÃ]Cf§–]1W]ü•Þ9Ôt2MæcU~¾ ÔYT=2ÅE}V))ÎédJŒ=Ä)dUÇR‚h>ð 6˜U­YtŸÎ­À˜óô^YÂ2‡·B5éîÍ!q÷ƆTæ9”ý@(Uõ28ëq%dÙ¢$B’`c»Áìf¸n³žÉ»ñî¾²û|¼4Üãİ0ç3 V¨ˆÞÇØË‰ýèý]TZ>5Ö(Çù6+cÑ!éœ]8>àņêdºé$°wØ® åò̄ӎÍ$›.tÕ0áH œêrÉñìÚ\LHN6Kú'¶‚ÌÀ¥/¤%Ù4ÿµµï¤Ýó¡E䱺æ™2n€t] É5Ý(äD`*\hÜaÝo¥Ô97{£-¤¡ÕTÎÞ àï£Ñ­ˆ[¢úçd¡œø3aÿ·‰—Û !0¦Õ*²¨ø²3¡ƒûï¡ÒSãœ9¼“²Öý°ß»x»Žq «r…`b—#¬¯?^@¦†Dy= \§¨lk…¸Ã§/€¶½YÁº–k¾[y•¢ÄÍëxíÅ­¡/’µHîä¢òl Åá×BÕGm^²tÏ/Þvù’ï‚Xêéõ“dI¾òµ—RÊ5®qïÚè~þIq¿eüvûåkÒ3ólS'ÂÔlâ¡wÕK.IÇlÕ«&+ͧ¦(lSöŒ¢Éï£á•õHËJ,DuDøÕ"Dk¨Ö,r–d¹Þþë(RŒùgÆÐ|,ÍÂ{„BXˆ’30%¡X®³·wtíÞ(b ´ÿ}ZübSÜÿ*FäÓݶ­»'—M·²mÊBPË=å«(̳+4ߤ|Ñ'™sÒ—¼àÉ7÷°¡û¦Ù辄ÙÌ0=d¿/A™ÙËDˆ´\ËU©ù9ä,¨ü¢—9•ô? ¾a Æ PàJ¯¦ÙÝmew»ßŸjõž_ì/›™¸Šb«'í¬Y¨KæIå†™Ý ­¾ÀIžÊ„˜âûÕVhtD¥ Ý•m<|O’WÙ¸pQ[Jòl åuV'HØ-¬¢-à‹²•¨ ëñwG#…j¬ÉذRîªIq(ÉX1ÑA¬Hï(%[·²Á…¥ ZxølÎ4•74²¶ˆX¨ø'[d®´áåÎÈŠësû} )=% ôŒe˜y”,D«Ž!iQŒôÓ Î.,]ÿD‰‘XùRL a{— x0¬Ï¥,Rvj@ISõ"ÀèdºQtç}ó+µ¿ˆ;mÂLîõpäŠãš×Œp¦ŸêÂ'-S’§}'”ïì €æÌ®ä[GoOe•ûÿVO¬'P“+(óåj Ê&öýO,/ƒgÝ6÷9Goìó…qßõpW’ùIV±Žxë¡/qK«y J‘_ûž"îU¸Æ5®ñõ]t½K_;Ì7T׃<9à>Ð0=ÍÉ_öÛ>È hËMÜ6Ô™·ù›³hiÑ–úp•ÿ^È ¥¯š‡ è‚ø@U5 ‡Qv.PÒ’Åb¢ŒYp'Ki-½#ë"«bÆúW–]T@g˜J Œô~C Û‘/%dL¥u«}>]eBÔ›¦·TõXcļ,  -'o¥7™ÌÒ7DvË [Á„ !cÍ›â´Ê‹øÉâ¨*Xª,€¤7šÔpï‹:‹wû‰Mï\.©2=Áê-Ë^–úÅÄîHñPšWˆ=…űÓEÅÿÂtº?[±”‚š×ß>ã6†•~ŽX* èKËJ¬¦ªÉcðb%\\‰öá'иÚB!h ³W Œ3œ.Íɱë(½/–[Ðtm= ð¦ ÑÒ3Ûä È—Á²¼˜-j*Ö«¢)˜CxZ”ÕëÍ d,!ä_Øpoq„¯Y,Tó¿è!‰ª(&621~XèXœCTiïÒÛ…‹ˆ¨`8e­œÔ–Kí°–•5Þ mÐÅ^£L$–º 0‹‹ä™þ ÎàHöâ×,áhQ‰Ì5-´ÿÐJíPx¤«@N¸s©sèC\F+xÓÂ’¯ÍY¾‚Wª~ˆô·BLòXZ¼û |K8µe‘º‰duI,5€côªÅëŸÄîãóY¸”¾ÖW?o/JúÏžˆX<žðGˢ˫ “iÓÙWðMI¤·ž?^y+<ø¾pmk[¾~ñ/y¶_ã׸ƛ‡Ó5®ñ³Î–aøa‰8ñ2Dîg7ª”z•´ ôØÒi-u”\¬mc˜… ëÉi+WC)ÒeUí „|_¿Â|Cá¡i¶0•Û ò¾½dð„3°ÏÀ‡_BµPN¦‘:èpTËéâAˆÉ2[t¢UnÞÚÄ_=ÈÇÕaÔ_!qÀrâƒb–>Ì"9 ƒ1a´HÈKµD¶P]°ôˆÐB3V4‘jzÉ´Øaö)à!x¶YáXã4ni¿Ïê=豭꺉k>•¬r.7›~qÀ¾¾;ªÞ¢—€vˆõn 4c)È œM5iék .ŒïŽË Š0‰"oÉp8Õüî VX§™&”?ív¶„–ž{Þm®²A÷} H}ÌŠÿ‹—¤¾’ñ Î{vÉÊŠÞvËWs·k×V0r‡¡òZ¹j4] ËF è sxðÙñ<2À¾v>—9+4+"6óªAy);B‹Ê¼ò¿Ž5ƒ˜á¯|Ð’Ž9lå>l_°È½mLu\gEãlw¤ ­®-ç-|¯®þá<Í­AŽï}`ykt›6pmRï„é‡e‹<Ú^2ó“®@¼Á8p‚i.6[E}X@Ÿƒ†ˆ§’° ps} „*ýòfµäD —ÔÛäª@5Qpê„‚O20nÂ:£²œ)O•ªP±WÉbó`¹D÷:kQ7öõöΞ'O¸›(³:®ÇÖÌK$úD«ó0ÅS^Éõ±MÛ;µVn׬äá•Çó¼Þo ä:‘—ëíF†? ¤9Ÿ®çöuk\ã¿æþ+ö`ü¦ùüÎuTZý9ÑÇ^Æ$™¾&ò/–Ò]|àÙ‚‚ÖÊÌÌà€^P§  È~]Um;bK’¼G/§Ø„LŒèÀ„ Ù*ávžs4aK™)ùvgN{Uy³ª4ºÌŸÐ6•‘¥W¤Ki%„ô£RÞxЀHDqâ†Å> \œèŠ ÃÀso°›=„õSêΨžbuxùËb«ðÕLiªÉéù°‚Y/EÉ< Ìò{ìÊZµýsúÝ*»ù"?'—Ï“ça¸¤/ÌÈöâÝš¢ä€,߄ļæ:oCnÞ“ät¾ùLJž;ßTóÂ_ âeû ­>w˜{ÌÌñ-Ün¯ˆíP*(ƒ“t¬XyÑÉ<@àTéŸËú¥3NHþÕ–²eh„λŽr“*“1LњݾóÚrŠžÁê)aè²_³à:›Í‡U˜šä’±m¨lM,~¿22£šSšïabx¶ {€2OÏmAg+½ðݼN~­]4‹'ü:Ÿ97l©OÜ“¥:•'÷R`4‹Æ¨”X~ɶ+”ìü³†x“t±TžÆZ›)@ê9pØå-Ö褶ÌtkÒ0 ÷m„ ‹%ƒ7Z:)}¸E-,F0”R7Ì#Y‰J}Œ?¿êk™öî ûÑ{Ñ£K¸{Ì2¬ 0‹‚„Lï™¶èHGÌäEÅe±¦Ù¦ó‚_¤ñ –y+faXïuЙh.-'L“#ßÉto›Ä!…ó-g\kþ²Ó©AˆÝiõÔC.f˜âGæ;º4k¬TÅ‚j¿³¦À`®š¦œÍ:³³ŠaÝ ;.ᶃœ^rFé`_0®\2'¿–5¯|làž¤Gð­rÛËÊMæF>h ZÊ™†~½°ÞÓùÇÝš_L+4ÕÛ„ÍÍ©u4>E ©ÂÖù°“¾><Âås“œ…&Q‹žÌX£…I h× P/…¥ä&Â<—ñ-çù/ÅS®qk\ãüø7lYðÝ_ç¿ðCà§=ˆ#¡4ÿ± Õ¸Éeð*ÁôœåŒe3ÚÍEv y‰…D‡~bþAÁCÀÎa!ÝÙ´›°ÝNõˆgOÛŠ¸ÊXrMÇ™s=½è¼Ñ"x-™°áö• °õÊ9>yžŠ1È`.¬Lýƒ\øÒóAÉiӋȸíÚ:8ŠJ/$Æ…‘áEP½ýªBöJÐqñfU·@€r%±xSäÁóC ûÓ™6j¤XÁâ«ÂLh=y²³§DœðQpE£6£MeDØïéñäbÊa£g5Ý¡èØHµºp#×8É(ë=‚l'—ßãש2Ë$Q6Í֌²¸ÐÉp£ø,…ï§ž ƒ;ô¨Ï e•O!—Ï/»ë?~s‘Íi_4_?„ïËD?sN@ÐÖ"È»¢o• KAH}a©ï¤í4λ%Àb¾‘äØì¥r(5š!hÅX'p€§°p`±@¡&°ÚƒÊëŸRâãçSÒ²D[Zž|7Ú…Šò‹óüô"*…KÍW¡Ú€‚Œâó…O½ ‹³N{©tJ¿œ°L°$êâ'žÈ~jÌÒ°,„–šÛY9 T=Õ1šŸ@Ó^\‚ý]4q…ˆe·x¨Û“§·×ùñ3ð°ùa±‹¦wåemŒ½ §± ð²7ØëÉœ]ø†´Ë‘— ȲU”mGÑ À~g;|)‡^å_|é5BÆ‹ù‹¨À×…|çÀ·^áúí¿­t9î^ã׸Æ5¾õ$ÿ—†”sH㣲7²™ ¡3˜vŽÊhÈúp‘2™CëÏ  q3¥-ìr…~æT0 %C&œåë±]Mt|cf’þfoÑð-Q'RRõ#ž%20<‘e@Ê%UT†ã}XuB¸_ÒCåQxªWòR“Éðxï ™Þ§tﮡ¢TFù‘]VGL/ˆô?ùWc‰¤øfMÊ3š9@,À¢èMJåËMÀO#84ŠJÕJì<‰þ|}7W)™OýGÁD’ªÆúüâ•'F7sýtûõÉæE îÜ9¸6(¼Þ*¼œšW9ƒhŒ°ÎQ k1³üuwZÆ2:Æ+“ÒϪ˜L¥¤(Èø¹­-‚ŒÀtµkF¡ÖQbùlʱ°áL$±|è6jo ñ,€Í'sžbå°g4A­}¢fÃ9OÆ"Þ™.ÐqÕ»IÕÌ`úçCÛéä¯ÄÇ+xU)çbuø»sÇ ÖÈòîA„§¼hà­/áÚ\L™îÈFŸ¬ UãÊñSÌQTø±ÂÜêJ/ôyôm"ÝqÉxvs1F€I7Ò šl<‚ïVJMX*Œ•pr:ÁžF{©7%³öøÿ<©óKcž¹½ ”µì)`XW7w7+œ¨Ý“—~Ìþ™¤ Z;oÕ\¨Û7«¡!ɇ÷g (ˆS¯a£[ÝU‹íuýÍžˆö¼‘»/z>øÝ0ñ²hWjZÛ[ÌÆ8¾<.üÄ6³êh{eƽðHíkÓãý¯qk\ãÿÄà—ã“(o1>ªT ÌåA¦FË>@ƒv%€å¯<{Ÿj6àÑý¥$\*ú „S•;F%<ݹb²Éx'å9Rœ’#q’e„K˜.‰ÿÅí"PhrK ³>¸ãô "pœ,ƒóiÙxE°™ZŠíšßÅš9”ò=‰"Á²QmÂøh<Ê’ÍWQ•4 §¡!?íM©ZÕfmz ûÚÊ ª YÛp慨ܮ0–mowžhι†0<šé±ÃnȦ—,•ŸØ 6^ܓѴ¥ q6€8*€RQrç+;!oN0EÌo6x ÃA/¥Ǫýª<$}ÿD^r®5gê“  “yŒ&ë”ÎÈzßU`‘”ºè᪮Þ5ú8ŸÒîŸpüý9of°û-Ì"y¬÷¨+!oÏ5FøO¦Ê´Ã@ɦ0•Þá„%½{Lj„ÌÚD"p øJ'!ŠÙØw&4ê…Xv\-J³ÈúxÁš(]dY€A%*Ì’ƒW¡QÚÎìg ÆÎAl= ÊW?ÄZΛ $…;/:X*‹óô¤ð-hXFeÌsÐßH³Ñ¿Žtd਱õ4d?£åÛ=‡±Ýp‹¦·EäO3_¼zs‚Å‘ÒÚ´ØTžñŸ!²jª™„šRùú´_ëî•°ÒÈDIßÔªía{n»½aò Ë– ëÿp³ß'¿×.îl­Ú°AþëCž= ™=ä •±•:|?Å_žæööÞõ-ß4[¾’ùmã׸Æ5®q_4>¢áIOwg'j Ì­€ {ì5¯ˆ)"žD¤UòTPâ.4ä %ƒÅ:ul°¡©P(–fA%0:¡[*üb#PËXÆðð(WDà¤7<\yRÆìY&‰ $ÔÕ‹~,â´ÊÃõ—4°N@Ø& ˆ®\бÏ\VÇEÚÖsNù$SÊ4¯…¼=‹ÑÄ•¹8—"u°Uó b ·Ø“® ÀÙu *ÞL$ëjGŒ‡ÖÐ#â4ÌH“Ío\”êšXÒPÖÃõ£Ð»¸ËŸ§_«‰j%z+‹û'¤Bk-á KÃ×ÇK=w,¨¾½­+¼ÄD”Áørä·*%Î8} 0B€Ø=:9~A+FÆe¨ÞEÞˆÜgÀ,•6Œ£‰èÁðœEÇ{·ûÝîÿ³ÛÝnŸOà‡ÁÌnv§RPñ“s+nòÅ¥Ùÿ„Ö c¢¼ù#ƒù Èr*3³¼¸ñ…ÎêÖ¼oúJžÁ; ËbÊŽÇ]ŽÛ´ašR™©B°=Ñütg±`IF-©rºx½8„/SñåÖZ+Èo~öBE%î-ûÃá2n³£ÿrQꨄô\šòM`ý¾Ê‚•a1¼×` ¿%(yE@ç,|V£ct‡,V/tL¤N>>«äÕ¶<4.Sk޶‹ŠÙ É`C×ÙÈë׬ Ÿ\ÂÔgôù¼‚é²Q¯”Ê»K3JÛ`?K÷Dõ— g.ƒìW­¼%@|xmoC½vÐÓÀcÈœm5ôwßúO|#Ìý'`Ü&úk\ã×ø;þl­¸jÁWèÿ'ÿöc‚ûOahŸ[2b"@M røE‚’ É‹Я QµÉá2ÀØ"ŒîÚ’ÖISå%Gî%X߯Àåd®ôŽ+ªÒ¤ä3+ÿ0EÖL˜ÙG´æÉÙ5¡(h&Jv‹LüA“üÊ´ZŽûp[ÉËb[Wå’<Ù“;+K˜† mITD¤ì˜ŒáUN±uè›ó ñJV €`ý—ø’uÆ!PÌ}8µD¸f6`´Rz<¢¹Qì0£‰T2Œ¹…ÃêIê",Ý•R¹V:a±JðDlW2³­µS…JXªT0Üm_ã 6ÂÒØÀ6]YìN6dIŸô%Á8·²i×Ê6^U™hYÛ£€tW ðaéÌåj-ÇjÒ~™5ªò©ûÎO¥&ÞÍÌðÃnŸÜÿÛSÈË@™Æ¶Ä2„²!,G¯e'Ï…ó!›‘ÚäQÿk ‰¨î ÆAø+UŒÞ{¤§èôYeë° ¨‚E— -BD”cëYé øué>ÈÌx˜l›ÝVlÐFƒÝ"܈§‹c¶ŸvŒâQU5PÜ;¸¿„ÆËœw":˜e™;®mN2‡E³e¦ äß%ß™¨‹8YÐk’ˆ¶©Dz\hÁ±š ¥w —’—¢n ¹ý.!›6„((Ú.m~àÿ ¯çjEenàbƒúb :ÇÍ[Dz9-3ú:ñÊÃákm ‡ÎÌ´ž¬ýLÿ8Ž=µÜUl«¸¨vÅ_‡\¨pýK¹´!Á+ïågÃ-‡?zÑÿ¯qk\ãÏx)ù°ÈëÌ_䔼n€W‡è,!5•ŒÎ4¯I­(A£Óe†ÖDNbàx·õrätýõð„tÊýþVu°!ŠÒc‘α‰vºH«¬®ø~ Å}7C}’ˆ¤ÂD;M \L,Ðp#>'ýøšæ›YôJÚ;ȯ/PÆs“FštƒÓÉ_ï¤3PåøÕ{GjRñÙ8 yY˜ÈÕ€üdrËCú ÅånŠpƒ^‘F%’žl¸? Óí‰ zÑ0ä$§<øžè«ÕžÑT¿Ž5R3R2(È9"D½…PÃxâÔZ€f°ÛgõÑI¾¤}8Iå íDw2“ØçvBNm&¢GšøÌ„¡ ¼¯q€ré„€“s𦆀†Í#û=Ä:ŠŠD8ý±Xn“ÏBn†›Ý~~< ÿO9 » ûz–i}-E2(u˜ÆE Û-ÅÖÛ-“ºÇÖG‡ðŽR½MôÀ-Êp!¾{á”Z…ÿ|¢Ccvèq·,¥ð…éjÀâq²”o†g&¿‹{°G™?%¨[y&S‘ñMo¡Š|È‹åÜÛrÚ$_ôXÙ• æ,è%œP ÅB4q¦½ß`åÄ‘5€ê<¬!¶3ôª]òXÄhý·q𠋦§Ôa*æ×ïùø5]=X™¯çíh»~úøºÜ›7nË}Ờ}_zY׸Æ5®q?|àºñåøI&#~Xl‘ñ½û q²èr-FðÎg³÷¥®(£iw¦'µ"=~f7VŸÏyPBfˆJ‚_•ÌÎ&bœMØG­»p=V2˜ o‡k€}ðÄ€ʉ•`Jð(£Ï$¹‹87˜dèût4ý7%P•¼5d˜34˜øéìlì2^*'^FxaWÀ¦¹ú²`©1E«ù[ÐBñ m}¹C.Žçþ‰/sé° &`$VH®N'U?AùîMY)äYÁ°´Ú~K±Ü.‰Iq«fô@«+6í ¼A¥Îx/kÒîf?Ð4³qêùÞðh›³Ifb %_þDPЇÚ0=BŠ*jP\…Ó’öŠj–ÔíDíÍ2Vž¯aÈÝ ú0û„ܹIo±Ö9@Ù.\U˜ Ä´£ÿ¬Óà‡á‡Ýn†ffüŸñn©-@HF2åº37AOÃãD4Ã=NŽŠˆ­ƒ‰Qþ¡¶Dŧ9X­q”=B:4™¼¹ò¨*S—³ØÖ¨Ú¶^‰®Ï;«îî|'s,”ñy÷ËrzVìøa!ŽÐ •TãÙ¯XóZÏÅ=¸>æ|bíͤ5Òü±©(‡xãg#JWŒtöP{èÝþ¼™ŸMðª[?k,Äûоý¦ó©[ µA¶SµÐˆ°Ô¢ò¢œÕ@Ð9§Šò~13†îÔa¡˜0‹¥D=ñ@/aG›"d¼É W½8<Ë/·Æ?[çý¤ør»ÃòJx´7.×ô—‘›x³8~È›¬àËÏß7ðÝà׸Æ5®q?'xák–QMHÓ­Ljl M]Ò-}ÉzEÌüêˆK€ÀšCÍÌ¡À†ÂK>³àD lï±9"ð=C”Ûpðý=ûŸó4äÐÐÉBß%§Bd9=S^ÉÚý[,¦ D–ÅèÇÁOceÌkAÞ°Âò,Yt– XÛ鉥Ûé{ä[ý&jô6‰šõvûi?&ŠŸù€vp½?'Øv+O2µ¤0Ú{´–.<³ûT­¹)‘\í¥\¤Ü?ï•Á¢‰ätÐ[À (Ûˆð®5¨"ÕdÌÉ~Â’¼%Fµþ^@Kn JÜ<\Ž#Ö _¤A­Z×ôxkc¯cT–­\cÏŽ¼N§ŠŒÇ~ÎiŒpgAEªÖ‡„hÑ#µrS%J{\ûèîúY»Ánœ5 2Ðäá6¨{D¦²JUãpnIЩf¯pÆÎU=¬g›íhâæÑVDôÕ={ ¦ šŸf²-ã¤â«,Á×@F[ð€nçÚÃ+ÔXÉT¿ñȦùrBfoÚ´¬ÇËM;Õ?ˆyFÈË€eù©ð =CÖ)äÊ£óÙž­Ù$¶»ÍRÁFÔ®HP\r‰–jGŸ~?”œ˜jeÏ-tNñ‹kìŒê9pi岨Õ¥&Ó#bs¢Ô’³õ÷ãþŸÐ_Õu `žã~–¶ Ѩ#q}Ž@çtìݶ)#èç˜Ã¬w¹¤YaÒ6w¬]]¦Zc_j6y5Ù=p9Rb¾ÿ2øaË9«Ò¢Ø{¯à@\p|¥Îv¯é/úk\ãoÀÞ¿vÃÇßy¼sÈ`†¨¿ý¹J B„®15 ˆäÖŠ¢ ¨qR!ròe_Y Šf󆙩9`ôãÓ´¡±ˆ'dmØÍ¶ÒPïÉeqèK­´ð'´ºJÀû7W W+¾>Ù$x,ÊéåkE%£z¢ö»½…{{7ûa1ÿAfu ª–ç޳µôf•Fd„çX’ùÚ=0•…Ù¦R9ùÂCdà!ŒƒÉibüƒ•rùd§–ùŸbñ’¼;" ß©—9Ê `kZ¦YvµD«9æ1LJÌ:ÝÄñ–DÉÂÛqº[†FŸ…3Q¦{­vw(´ÏŽ^²"®öŠ-6Ø–p6Rª´{UŠÙHLîÞãOobñ )ˆÊ1ÓÞµØú Ï#ñÙ§)6›ÂÆ|Ô‡º×«Øî·)¬lˆQ9\ÉÓ÷{A‚×Éø¡…ÝìFé²cù¦óͽ3¯Æ×^“½:¹¿Ž‘| FZ_ÿU¸Æ5®qoƒ´¯ñ cqÀ~Ðg`ô÷ž·šÄu… #7ÝØÚºÖ&Æ^Â̽3HGÐ  'q’”ŠWÂ/Ûz ˆ3jy'L¿d€@?)`§ÏcލœWhÉ/Å`—ˆ?­Æ+D&ƒÊüBh#°â)ZC⃠³{A†°œJI€l²É&ÈsÀÓ¢šy7aöŒ¡º¤çU—ºâ(šE'Jë!EdpMÃ|Î[güüd$>q,ƒø›ƒ¢^Ó{wHš\ŒnLÔ­u“f áèx]ûŽ÷~ôˆ-ÚD:w‚;é :îÞ ¨ÞFég;nâçÆHî¶jIÙcq²—@ôïEU)IíŒÂa1 ¢~­ò–‹ú¼ÔOï$2Fæº&-¿Ñ¹^äÝ•² a? Ìy†=çZÄ]¯wõYe”‰¨;2`†ÿ=§a}á¹uФŸl¼Z=´€%5êç„@öm¿vP±Rh›“;¯E)KB{>®ç<¹)•*…“ñW><”gúâcôL@-¤ÀÈìPšËµLŽ\,\ÒlàÒ¬·o5wá4Jøß&ïÜÜ5ºìhªñÈ•öຖºjÚ„á!Êé¢Ú¼Äe ¦ lÂt‡íeè’Ì©ìèÈ#íVA½0­‘^ZB”É@XˆYqiº°c" „-}±Ÿí!¢0ŽªöÅØWÝ8Õ$] *^›4꽬ñ¥¤žÂèå§ã/øVÜòVÜßí+»®Âa÷ëÚå+%*t¢ÅÔÕ'ñ ¯ó+“í×øÇ`Å Òýû_#þ‹¿ý®Å7ή3taVF 댫"ì\‰«P)­c 4áïL­ùúð©šá†úÝgÝž8»‚J+7Ù#_CêÚ£ÌM†Sä—IÈ´ sTOGèŽ%—ó ¹tÖF¢Å8ÌÝ¿‡6²Ë䱜»ˆÈ]oõ„ªÊ+9b‹¦„Y ‚ªx˜A¹¯Ebä5œY.²ô¢öà'ÞCkL6%> bÓ@ÞÆÄIû1Ö&##¸¾4ô1 þÈÉèz»t$µñ¢ï®$v+𬇽²}ô?Eµ¶^`Rž,¬¦+°9Å>éÿÊÎ×yVY*ù…‘Ê’ê§òIRµòpçØjü%ýºÕj‹Ê y:%dœe¥¸R“ÀˆÃ©ñ¬XBUy½xŽØÝíÐJqÌ««#°ãe§ÚxtuEÁà¹à íUe²U_Ì‚¤³¿V»Iô‡ì-P§³9íP#¡ÚOpšÃ²ÀU¾W <±½e]†>Ã…ô7®+5Tà` LŠ´ÇV³ÁkÝxµ†ºŠBè»U²G® `ql£?8¬“Ù"eßÖsòc*»+âóadž®Õ êÓ–N‡0tH`NølûÌ ¸Ä´3ÐZ#°Së7ÔÊkîìÄ+¸$ßÄ=¾àWO¨.8±Udž`q³à¨èœí‹½Oo!.ß­ŒX¸‚°+¶žœ‡ûÿ“š ‹=¯a²þ‚ÓkÃhšò¾?+(@KŒ›‹‘QÙl¼Äñ‹·'3ܪ QDàrmký+Þ]fE²‘MðËj"yÞh ŽÔq!ÁmÏGw÷ÂPXyáJtsö¹•Ÿª§ð›ü®Õ= ª¸©K¹EK·\4Ô`ºy:3G樲VÔ~¸@:%}hã€aáv ?U¢Jš… /îôµŒ=yáaýçtK P!ÎÐ烴Ý`[¥¡WöÔÈâÞ>÷¾¿*ü«Gó8:™£ö4ÓÌW‰¥çØ(ÿT«öMñ!®0é[ 7+ë±þ¾Š€>$ϹüÃð}>Â\¢”µðFˆëo9"ý\ʵá”Î`–b‚˶À¡Î*O³:ÎU•TÞòûùðÚåì4²@~=ùO6:·±ßbX/}˜;ÅÞßÀÅÆ+0÷ßHcwewÃ>ȹÆ5®qk\ã×Å*¯œ?_9·?Ìé5£fkª3— CC‡ïˆPfŠÑ…1w§<#5¯Ä7x²àï}cAEZ×R¹hq§’ ›Ðêô­™E8$Áq8l¨èXŸee1u\NÙ? D¾Sgë¬/ú{lñÒ±B‹àÌrk ,ì êͺç¹xõ^ ý4€–€–÷Ø<¸‰í08’õ'p¯¥Š}çDÞ‰bôöü’E oì_ˆÀœc¥éŒ=¶ÀßRõŽHØAÕ0IÆ)æí«éÍšlÕ',Ž$ÿ –Yö –Ol•…P¼4æõÜ‚KE(2ÂòÔ¯÷ªn©À“6¸Ц*–wçâОiøÏ»›opóеóÃKŠqR²cÆ×_ý†À %8µ(ÁÞ5!‘Làå¶” IDATvG_¼‡šV ¿s¯¦8hÎt©¹ôjt’Zè¢Áµ/lHÈ•úÓF©±É†\CZÛöñ¡w]ªxC.½*””õ”˜8T81—‰ëÔ.͆ ©î¾ç$ׯIíwE°˜o3×JW E—á–4øÔÞ"2²Û>'цN–jµ-ðýýÒó¯{Kàè ”\:œ—&øÖØoaÍf.2w":bÙ3%%| 6.+šlk,8¯ Ì^@ý¸¸XšaïÍæº~yâ(bI…¥ŽÈ?&Öö¼VLhÏÐ[éÍöZŠÈ ™©Þ»nûø&¶5¾÷¾W<@Ó½Ú®—¯ôWWÐ>RH/´ÝejK˜W‡¿ö6ƒj¿é ÞþªKå׸Æ5þ†ñ§© }»nÜ{w7%€ 6[hßpbˆŒà&sº*AÉÁKb¬Y|@µ¨×Ñ_WR.¤äE1Âq´…Û[ò € }ÝÑvħLÒà2ÃBÍŒ9’¦dôÙê¾I§;ð<i*XY“@æF„©Î쥻z¯˜nu)}^¢Eá[ñh¥ß”ý»†h¶H!ã>ðL¨ñÎÙj0ï¡E ã¶\%¢r@EJ2ÊØÊË¢˜BûlŸ+wÍÏë÷âà[QµúHÒ¬ÆR5»Zç Ö'…‚¶¹ýµ§¢BJùR+éoòÀb²XòVd¡"ÈCqŸýüõìnçóôó¿n¡¦’[ ¢Xÿ\¤(®ÅÞv‚ô} 7›ušñ^Öç—ß¡æ’*bù¶€1Ù²g{,,%_eáÖ‡à3Bäæ …F¯mÂè_Êè'‰¦¤TŲQö(“¾ 6%/6ìræbª®1¶wX_¶7MÎ= –†ÒŒ—D*¡ffxq§©ÿƒÎ± ^Ã½ç• Ú¸ªL‡ ˆSŸÂ4©Oä>ÉfŠêÌfYå’ú}9B0µÝÔâAÀËR³·(X÷Rœ]ýç¡ÚaYþÚ‡ Ù25É ,Dã|z`ti/"_[]ñÔ¤­9ØÁ£ÊHÉ»ƒÈäB:(tÓž‹KŠ I¾²8d7Ww‘ñެhQ$¯ ?þêv7Üž5#X¤šÌÙ&,Æ’©8%<¶.ÁTþjÙplh§âÃ'`Ôò~ÛI'웞•â°*$˜{ûgÙªü% €Ì(Mm¶h?o±ìäNȇ5 TK™U>ßivÖ̀ǕӖMåz.Ï-[áJWúpváîÄ~¨à8‹Fèc„Pâé ÆÂïèòqdÄÙ┎\c(æ£vøÃ¢O¦*ånÃ"§+Ús=|³ËË" À’_ÌÐÕÁg¡1é¤7»ÃÐ 8Uë#c˜h·__§_G-ÿ½¡(ÅÉå—’ÏÁº‰ðd•)P<Œ¯v¤“NW˯å[FÕA[ WšpÌ VGl¡S)"vkz’pøB­ NZ½À½ÑÞ>O8†³{µÖŽE¥ØT¸€S¹šäÛwÁ¾¹P”*œlfM@xˆ§W¿¶T=”È·ý—ˆ “ûs˜rŽù5Š4ß”¿qý¾ôÞ‘6ºïd±“‰ÃáUáõÛÜî ? €áW?‰ïzüóø¥×¸Æï×jø‹®iù~‰FVƒ;4dyù˜$¸ªsòžY:\b§…ÿ3BW`æE  J}kðäÛüTF¤¾~A–c]d+T±œš<û˜SšÞmñîò%¢òFb_„OJ=œqç¢À»Œ('à$È•DRVaNy/£"ÁЫq¾¸ÆVÖ|¼nôs»þ.-Xqš,`¨å9ß–š˜hˆ«R|Eu!mt6-"PÅvR).2mav»Ù AÿÑQÁ?ǧ|æ\+›M™—•ÒtyÉu «ÿ²ˆ>Ë`h¦Î µR5 MÜÌ.ŸB£Iæ}ãÓŸ»M!ÉïØIX°¥S'SÅ¢¤:5Ç=z±.9ÕªIïDЕJ|Éú*óW¢×ìîSuµ IxÜ”Ëci3¢ÎÐÃC³L’½=-ÄîÊâÌÌ=…(€²‡¹ ² ÃÀ"wÛ8ï }6ÖMGΰ:bòš­ZÎ( ܨIràM˜·z÷”:KdÉàà‚BG&gñû«©ÇÒRñ¤—lbª©v(9û>¨ènÄ.+ ‚ƒÍ•X ¬/VSv)üm²O}¤Û/dÁU› ¤É"¦…é&›P•ùÖmn«ÂrLXA6žg?Õ»^Þà–ã¿~›t«öÆÕ­ÿÍ~[à;üy6.ßá _I}íZ·žõµ'¿÷R÷ת›ß49Û¯ª›‡'çYY /•CÖö¿ܱ¦¿«Œ~‰Ç׸Æ5®ñÓÎÒo?ÿ§Ç/Çeï³IìÒIÔä3ù ל&ÐW¥ý¬Çݨ5I)¿Í‚ÿ›·êÊ®zhcFèªù¹#—I˜z  #1VV²ûÛäv)©2ÛߪÙÚ.Fäcšr@ygìÉ(%Õ¸%›ÜÎW™pº&P­Õħ*0p·Àaè0MWó 6mo5Ë/Iî4×<Àw&µ ‰íRå~Qt¨*S±ñ!€*áQÅï-Žâ4ý?ßòÝì6¬;¥±>±¤ ðâíÝÛ'DòGì§—•/{ -ÐÒ±Ãý—Î"Ä´éîBá×ïr7§s5uϪx‘õ;sy&ÁÄ^Ë%X[èn¡îÎþ—aÁ5PTË¡ó9mnŸ“ñ¼`ñ§upžÙÓšØ?4º’غº1ÊsE)gÙJµ@„Â?¸Íi†âk·S¿r|–”`w3»;„ s¡%ØÂŠÜÓŽIÚ>ê“yêŽ.L-¾ñ? ÅFP¶AP GÞúB"éÕ¨–\y߉Y9; ý½oû R$“LJVNÁ¡FäQÊ:¡A’Q°à÷ÉB\­q_XPþjó³ ]ôy^è#8FgÓ‚£Ì!ï›x¸^O‹£!FqlÛvb'ô¯¼¹PªVöÒÝ»ÄnõAƒ¥/Ħ¬ûЗŠÕ û&îèˆ#<Úü0…mpk÷,”šÐ¾;2êÅÖ­‰†¼›9‡µêšk¤›J‰ïvì7°_íDüò¾s0½ÔºµõñàqñkáW>ÿ £¿Æ5.¤õÿíqõ¦¤ñA%$Êæ6kîG RèÆeÑDö8# ¾Â3•t©øoô-aÊPp¢Í]R]DÓÑ&]ͽçÌEÆ9Ae±LPñ7j’ÙI¹h€öoq®ÿ’¤Q‚ð^ >Ù¢NˆàΔr(ð0Q°ØÆÇ4Ì— ñ@ Òæ,aÄྲý¡s½h·ŒPé—d¾‹æ†‡éÅa3ñœú1€°†ÜEž5 —}ÄÀ*¶g™ÒÙúåöla(£ñè•×`•é<îdsŸ¶ÏsBV7é¤L·h¿ït®»ô=ÉJnÏÛž"ä Ùf¶E„#:™ÊHs"ÅîŠyV^ÿ!öšJe8ÂÂ’?°QS¿±ÄÎYÀÞ{¥æ¹]õy fáLVA»›Ýa7É”›ÐùaAF€‚̢όè5ŒC¦Œs-“aÛAƒÁй×s$éZ¼Â>™€ß(à°ÆŽîäì¯NÌ»·ôX†ª6 á¡Ä‘…±ÏžŽ›³Òu’vŸ¬ü©‡\­ñ– 8ûd»ßøÀ ”ö{ž$ôW+mÑêÚ!–“ÙôèŒWÏEL„£œS6úøŠÅ£ÏÚÂ×ã}ÄNàÁ‘·ëúz/|SÈsÕe6烡9-T¹_Èp¹v“¤ÊÂŽN¿_â7°lÔy(Õ#“ï´‘5Û¾Hp²ÕÖ=DSk_‹âb–"/ÿ-ÔÒŠS—½¨£o3 =I™Ô¸cNQuqd7ÌŒ—ð©’tb!°*dJ¥¾çšÚƒ×;t5åFÄLõ@>û䘦MrCIÄö“g´ü¢8K:Q:ú±ÀùÅ?ëtÿ3E(ìWÞCuU÷'vS˧/däòï¶ÃtÔV-J®Nïߎõb¯¦Ú6üÛÑ艴ÿ'¯Š-ª€Í›]ý„´ÆÁ[Xÿî=ÇñbÊ+¥¼ <ùÃúûO\ã׸Æ5®ñ!Éqj2ÇGˆ¶9ݳ½$)ï;»=ÿ÷?dš ,0O­wéÌ ä5£KZ˜Ña©Ix×¶€,3_RD Úa0+@ê«2 nNNÝ'¢t hGÒOÐUÀJ °8¢·Â¸™úÐSša{ÕÈhÐyÉÊ’º¸±A"À—8àPHýJpà‰8%›~°æÍZ)‚dö3Š*¬Ec—3¾/lD–J"7œîœ)@½רSA¹}ÛU«º¢‡ÞŒÁ³J«9õ’è(¦qFŸ‹ú‡wjeJ«Üb^”@®uU² ÜÞÃæ‹Ì«ë 2÷é¦ÐÌLæËsw i’^–ÝB=fÊ"±ùºý¶¸Ý åGŠ À‚Œõ€a³ e6‰Á0 ÉL+K!¡û¤JfEÂuÐ+þÕÆ†AÙ¡‹"§°=ê„ k¦Õy7™ší ,+¨(ép% ¿ßp#fàCÑÎë¼çÇ„^H¤8ý‚ÁÝ:µ!2N]8WhBÃpB'ÇæV\;„ð5´lÑâ\"J¿W‰¬ËNv|ö¹åsoŒZX8€­Ûëc ¨újQÝÜ›¿â¤Ü!h¦s_-ïŒÈ;ž–š‰aNp*Ù‚ .^ƒËgæ#ü+E%&ü\S÷±]àÈ bQ5D#e¦!x ±bXþÔžð­|S‰§bX'xÂò/™¸–oÂÑ¿(`×sƒ\Ñ÷7·0.› Úõšvb¬H†ò –GÀh°Î}„.¾]áàý½©j»½‘KÏÚ/)¿ŸL’74}ךi/þk[/ÐtTÀÙ¯Û:„¾¦Íÿ,‚ÜG|!K׸Æ5þåñ_“ÄÁË¿øØùH ’4‡¹~^/ï h)‡ªJߟMÆÃ&MHGÊI€–Lj&ï6åH- ™x7ÜðXD-Z¼Nh ;.IaÜy@dgÙ!á›™®Å€J’]&½ Æ­¯dÑÑœh€å<æ J⎠KS?iQ"Ï"Œ§Uìé>ʳÀúÔðÒí^}ë!¦ÿ¬Ý:iPî79ÓË^ ½b­R’5Eϱ±þ©ÉæÿÐ;vº YÆVŠpött0J —¢zpÀ=†ûìÆ¸y0÷y§ôªc^ÑPÑÉrÊûö© ØVÔ¼]ÄÜü!pÀïÕÆh98hlá€f'±ÞêCL€Æ’Ô[+ÕË^Õû›èã(ª.ø­ïÆxUn‚2ÆK—QÐüd×±¾ç ã‹’ÜêjIš‚ËÚM©ùÒzI´Í+1šªjt}¢>„hßrrêî¨Á>™“>$êùû]8i§#¬{¡ÅVá^<ù¨ß3)u¶K#9gø J’oâƒ(â”zÝÊQ`MŠ]±ÔuŸË¿€"ÈY~|˜ïÂ_…™wšc5Ï5¾rUm:+—inNÓÇÄ×÷¶“&—n/é{@û ÷ÿÛMûš×¸Æ5®ñÖnù!‘á0yÛ‹@´üíÀ)ƒ•mòáðvhlUÛGI‡¬VÅ&!׋˱cÀœ]¨š‹/IÿM—»&É{“ê*cLÔ4i*MYáj&̬Œß=8”4ÆÿU×¹øšjá+ý+GÉhÏ¡ÿ‚›…Â<€Å»•÷žÐžÅ!ÌLü‡÷2?l[ÎÍéføæ›ª™ßúyA+úËDB`šˆyµ´wÎ +¦riDÕ:–YDÜdaÊk‰ø÷[] ½fΘ¥¤"L-Þ‹“‘ɳ—Nñ|=x2ìSŒâ?pæœ÷‹6yÎWŽ},SQƒýÌwyx‚‰Åv-¥îqãBO0CÐíñ¥ÇÛ³d5ësè½Ï‡ó?dL ~a2® d¾¡9m"·"‚G `=ÿ‹”J¨`Eœ+rRë \[O*m*ó–°?c®ô“cÅPg,| @9«xK‰¸6éÐs¯H>Ê<Œ”ÏÑDª}œ¢XŒ=:ôøVrŸ3|ÈpêY%fw1‘髯š$ù ÄTác'¯Ôùvöš0á)b}á¡å2WBF/²Ýú^‚§AQâ>£GzëWW}`¯Uï1mw{Æ=ÚEº×¸%Å'¶½~Sízêxøz ¸:9BÜ ‚1/·E=ŠYQýŸ:¡%“äœH,§ߘ´2„[CšýƒÛšäܘ¯e"öjô ŒN¥ÑSu”é••šzäÍ0F>~&)–}òÑ΃9B©9¬"ˆãÉ´SÈ¡Ü(°{Ø 8œëo§É' Í–ûÕgËS¨÷O!x^v“¿e\Ïü׸Váàé}¥Ö9‚‡£L‚óós7+T¸¢zcfqZÓßjP"ø¦ ‚04:$Ò&‚†ˆ*îù ¾¼¼Jêq‰¤[<:À#.c¯¾)n€ ‘Ù¾u QÿRè†=@@Ëö˜›J‘¤I㸠ø2 5­:ƒEî³Ð­UD¼Úc𦽂­v¶xþhú·y¦Žé3èçä2ªŽXC§sÝæ‡C}Âç«,¨e0y6‰‡cn2‚Aœ¢’–M1™€©fÎLßÖÖa 0Õ9M¥’‘€l¨O¶¦dÇ‚î$’,p„bœPoÓayZ§ÑYÃ%¦#µ%¦gu|Y_Ò«Q=Ôb¶Ûêæäûm-ržDi<ÇÜ»b ¢.2Œ~wy"*¹'xÅ¥ÓzýDÀ×!°ÉMzŒ²Ò—Ÿ{*f ±´ÀaYÌüÓdÐê!çÚz2$‚Æ{äì;Þ´$K±¨£‹4PAÿs ;[so$Ç? 0á/Î{ù±'s)_Îeæ²öåÏ?¹èKîõs “Ï…| PÔ<_аX@EÓÒs} ;;R9dÙ>E#sÕⱓÏ͇Bd|,7s+Âo#7Éæn·GÞ Pð;Èí,>½PëBY¦û)ŠÞ¨rœ“]vB ²rÔ"„Aß¼Ëgˆõ`Øüë–g Üaw‚§c‹Î¦¢hÑ ­C­wÒƒýpgi~òpJÁà ¾1b5~ŸÌP:,â|ÖMu7ˆ3Hæ×3÷îoeˆð5Îê, r“70Á£}i¤Cêöˆ0„Ÿj·PP7•ÙfÂ^Yø"‰{…"rÃ…«V}†ÅKpüÙ¨ÊTgª^7¶OG…œ÷àKu1Ò.¨JºuÕ<8^<}™A<Ÿ®Ú„¼™ø|*s€ÅÁÖ¬+ˆØû½¤öE‰/€õߎ¯5îñ}?ôö¾u;vç•pçýßxŒùQ)™PRU’}é¶×·Î™ÞIªlY·ïí= ³fú_¬Ãd¸•dîë¾îëß…ÿ}_¿ëõ½ñB?®„Ö…¤0áF%°Ãg€YDÿcê[úNŠ=ô¤Ç4 ¥cé¤Ì²ÀÊvaæ‡Z$×äP™A‡Á+3"êÆ¤äg$· 2ÿ¸ÀúDiIF@_^a̱7ñâJã/Þƒ Šb?ù6Μ0aYèv€,H³ÎÚ,:AÀLö¤’IJM™#¼%,$£ÿdò@ÃbAêî]7ÏÏV*I¢).ù‡Rüë—nÁ¦¬¡IÂkôÃÁ ”;÷v>GžbK(Ò“3~ êvôÍ ²“"à×§[ #õ5–:@§ÑÁüjˆŒ³§ŒàÔ³Àsµèº4 €›ñQ(P„yJ‘xù:à;€¶h¼û°›Ša8bè|ntN}üÁŒkcû@êIÝD‰q¹j-Š{°ßIænuT(UµI·è ›’z8Ǥf ó˜¸TïV¥SψczJ¸ÐU—}Oi,™•U»ßk…ñŒè­Üë$™=mïé EØ«"ˆ¨ ¡,äU°…â ÒW]*œÞí(Ç"÷i··ˆß„>Ê}i­ ‰Q΂þçÎËnó¡Ö*„bÍ#ã/2ДX)|ÁXhG‘˘ƒw¾\ׯË%<à4ThJš Â9;m˜ 1Åæ*ÞóÅÃ2Ú¾Ð?=Ô{aÍÏÿ‘¬Yf£­üKB ¯À`+pEô‡/ñÿby%·^ÿsÿp|?igãq ÌÄÑÅ'Чƒþó^î&Ó˜zÁ,­u)5à~i˜l&_“&’û¼q»Fõ#C­tد½q¾ô~%6v_÷u_÷u_÷õ:¸ûb ¹øŠñ›#^¯ýîLb5NŸúHÊ6žrè•=j ¨{3XGÊHšQzÈžªÍ¨€f/¶QBV< Ø‹à<¯Dø¶˜${w„dŒ,¸fÊ|uh+Ë©>WŒæ‡RÅ;ÕB`ÍW $6ät`õ¯ÐÇL•U|ÜÏR 5Œï-žQÕ(¬,MÒr€LÂ}ÆÛ<ñR„ê…¶*ÂÝÐ~é­Ò¤P²ÅÉé>œ ^²‚êxg2o‡s¥ôÕÇÿ8¢‚Êø»Ó7³ÇµyUŒüË3™aÝyãÐÿ!äɨH®¡>‹«v~GlЂ¹ N{:'oœ{Òù:Dúùµ;ÑH;Ôÿ=ñùÒÜ/…1"ë;ùâͨónsö•TFý%‰œŽ¦¨OjüáTqÆÒfP1²§@üÐwOÒº(àûÔÆ•K­î¼àŽK Uu6Õ½ 1A4ºoc,c×–²8 OºòFE Ø´ˆM =sö6Ñ\“š í«§¬Ïîmo¿‰ž }Ò…@âø,%¯ ùmH5c¿YÅréèO¢ïPx–lÎkUï‘ß\Æðo¿"z~2!&Ç'ÎîNý#"ξ̳>–¸ø5ìq'iMýcŽ-q IDAT»í|¸{/d~k5l ^fQÁ°@B'‚)ŠýMptwhˆÚ¡ õ–A„Íæ:6FEs´v1ºÎ†^@ÿQMY")×sÊ˦© (b!§wÇ=„±Ž°¶ÚHé@!‘ú=8hDÕÁ tÖVcõÅ2E“ªu#‘nÉÇÿÐrVÓú$AÓÁë²:z üü?z%´´?Œå°Hhc˜o®~¸‡Èè^ðë¦s&8®÷—D䱑C^õN[‰O,Íqí©Öb* Œ…×~>VßăÔÒù­º†„þø†žâhÍk³Íâ0V•ºÝVÂü »eˆÚ äš¼dVVȆçRmLã’ˆòJeÛǽŸTΡëMñUœŒ]ö– VÞ`ò ¤â N û¾9ãÑ… &›/rÑ}WäÊ·G`YûEe³ò~Ùu½ÀcUá^jw·v,[.f ’d_9b¬õ¡ØC«9…¦Ñ”W|‰®|`fÈ›¤$“ú˜-I|?ý¾ ¶»8“å©«è\ÈåS(Í^Dó¹i¾ägT8vñí`yfØß͉fôÜ £ÅFË26:`¾ UwÜPþà Ü/|Ô\ÅNì›Ü~xeZªsùKŸîë¾îë¾þ-׸£ów<·!cF˜› .Ž^Wd0Ñ"8{å,¢AÌN—@"*õ£d›¾ÖT´许òö+‡‰\Ú<ÑX5ûv®Z¶áõ»)`pVÖR”@#Ê_b‰Cb…SÊ«ª¤=€ïȈCå9"J9ÏTª!OF›?‚F„»(¿¢BµË‚ížè6™`¦0Y›¾y>]õÜNªñ~ñp ZÏwVrC‘ÛMÚ;ÞŠÀ»ƒÈ(Ïa Ö»Æ 8;>}nk’/_%#‹" çYŠ( ‚g.L`Ì•¸!ZFüî÷)^ôØÜú/Ý_ÿwNû‡Où§ŸÁá>”ˆ–€EÛ£ŸÊUÜbD±‹Û¥ÒÝ+¦£a&R¼ÃÍ¡`o$k_‰ö4L—ŸŠã¾ñÏ»=€ù¸ÐŸ¢û ™JA„˜f"Kä†,lè½¥&[ âY$&$Ù» Á:ø|¨ðó©ži”Âr*Úó° KªæÁ#)QÓñËN޹)…‡Af´)ÏLd„2û‰”ö—¨Ž §ÌâjòÆ$l2’ç8#GŸ‰%ÐDNäâ ·ƒ™•Eê%ŠÇhìÆ.K‰Á4wD~#Ú(Õ²Èqa—Õô&¢¼Àâ4Ó8¸ùNog³áœ±õ‡%sô~¼žßÍBcôùáñüýÿ•º£nÞAsæC$¹ÇÅ,{~¤rB òYGŒPûU„óšÎP9/3á¤Ä-·2$Îlòývîçó¥1Ÿ#p>ú?³}oÕÄ „YâLN¹Q²(Òd—¸³Ó•€ƒ؈®a¯†›Ø BáÝ … 3ÚŸWÁŒÎÅ×{-d‹ænO|úFxë]“ZA‚e 1"Š/1ŸbYk صÞ?¦ÔfMjÑ÷곋µf!7–T‹PöÊ!{á,çñ(B9AUZ˜ˆ3£|’FT7} Ÿcˆ§1éK¦ÿžZÞxùº|W(›½n÷ÏqÀyþášQÄbÑ +»üS0¶¿ ƒ¨¦×D¶%}=˜°ÀÚ]¦JPÜ~”Rë{‰cí³Áµ­ÂÚ¤Û«w\Äke+$ (ß;ÉïcÜשs›½MÎ|Ø50þΆù%PzcO¶ X §¯o{ży¢ÿ"¾ñÔ…@0[OøÂ„¹¯ûº¯ûúc¯̳ÿ7fd¢|x=\³”d|ÄÌÄF9Gû4QZ` 3ÁPt)•ã‘\â>öžÃŸJÙQàHP`3!ft•З9àÁý3pOwPKÊ! ÝÞ†RñìÚöi­F­Ö« ƒC,´œH×#"¤ží+PõšSª5ctîç£mjú]hzÉ?SØôYîü@ôðª;é¹&-Ñ LG´X$ƒ“! @yƵVqw8…™™ôùëb ŒBLcÀƒ4S§w¬ @î7å(î‹C^Éhçb5®L ÜA‚›ÛI-äÒg·«cÂgœÈÚø¢ ÃR¸ J®‚Šëû9aÿ˜°91Ïøs@üÇvTÇB>ã< óÏE»£LA—~Š&‘z Â"¿GQ½d¨22´)˜e‘–´l}ëPÓ]Öß/í&KkÄÅÎf»ÓäÙH glÄ ‹]?‘Èpt¢zÀš…È•Uh€p²N>©¯µö|†ö8tìÑnŠZ„Î6í 8õ²&EÙXÞš·EAÁ°.3Ô±ŽˆJ[Œ—ç{véÖ/ …rØ/1o¬5[|Ã¥,-¤œKu šPbßÃxÃ'œb™è{m¼_CìT¶yñžÒ1G¡ (MÝëS§¾±Tj5‹< œ´Ý¨sN7†oh.š/½c”J¤à(£O¸Ð.¼AÊÜ!Ó\aÙžgk€|õØýóE¾NwT!è¦~/@@¶£½Ó¿ ©ù 6¶“¯¼£nEàÅûç[ œØoŠÿ}Ý“à¾nœû§¿÷°ÿ=3áÃ^–èÕÚ°·ÓE]ÙZ j};“K˜ÉÖo» C2cQ^¦f#Œ<ë>¶W´'Ñ~±â•P™<èÁOwÿš}ØÌ'<½·s ë©Ô~'´<”Ä;«8ê«OÂ}IǨ•îZ¨¶ °t?ˆ2r6 ¹ÄcX¹>„)?‘áýÖ‰¨Z#^\™->Âr =¸RÂës%.&—l®°¬R0»êxrØéú]X×£µúIë>ù$t;³âÇK?ŽOjð9Êi¼æ•¥%_U¹á4L‰ [¨ú\úNÎóÃbAÈíÔ÷j„ƒ4 ⧥׃¡Ê>3Yjߨȼ鑹€Y=öjŵ0M …_#^I¥qÄ«4’×ìó®×ÜhÆ´9³Ë}=&®”»ëU§;wX_ Üßcë=õ«¹Àr™Üra/ü”×Ñ™t åõ‚â6Ä1G¹A!WqÄJy‰}”1Ìkß·ÍÅšÓx¨ãÙI0V•Êœ0¿•^ñG&.„ BuWÈFº4©ÄÉ¥è­î¿3«¸TËRçS#CtI39£*a™N¾ŸÖ:”Ê£y‰aÊB˜}¯‹Û,VÙNˆj¨þQžwå»ê+“=.ZYº«QÌ” âºÊb¦çÌð÷¬á­×$Â}¥‚Ÿ ¦/òIÙkýå‰ ²öž‰´ÙB²É:ÿd¼›ìb…b›ñ–sç&.En|ñ¢yOyªa"…4¾Õhlë]ÝÛØ–cq cE{¿ú5ÖtkÛ¾°‰MP{jH?‡ pµ…ñýoàÒõý+eôS”SÌâ»à⯗sïë_ЇÞ×}Ý×}ýÜůý‡hØríb w©“Cj(x™#Óeþt u†žZ(°š]Ô{¼2FŠ!ÙŽÔ=¬Ã>¹·]r¸+d°6ØÙw»{X'‰w믎ùaçØäµ¤éHÜX´>™ñ²!Êá©¿:!-¢@aFGy\ZÆ=ýœ=Sò’˜ð¼ætKÔò÷­XDãà@ üe%z‹&5]¼úEð‰‚hƒÁD ·6Q÷_ºK+Ž1qêf€ u¦6á"‘Àn/ØâücA]8Ææ€(§0—q±_T[V°Î~¨ŠÁ@;žR$pbôI¶(cIÇç›:‹«¹U¥Plˆ•›Qìñsû逿©àƲ´îpíù£±€ f­UXü‚ø<‹˜ô¾FòÏàÑjQ&{ 8yYËú–¯±fÂ8ÜZ£µÆÍD€˜?1ÖHñfFBÈ”1-17o¥òL=%Y˜¶6­­&8žˆÏ.}•ùl.!b®X‚Œ'æeÛ@Ñàà£Ü+þ³Xì .OÀþ9>_{Ù«`/{ŠM«•Ɐ’ê/Â6N¸ñ›HÐR\CR žûxäQSâòøFšê_QG¬rÏ;4üWF2U멪a>”ŽIkP<¶È>–˳ l“jëôrý^ªü³UtzVœÉjÇm%>JdÉ qü±ƒž[p”¡ãØŒÀTEáì_1BYë!l‹ŒnÕْ݇èÔJVÁÚįjê7RÆÚ=«wænŽ)̪´Xå$M&5Ý·QBXÞ·2Ä弌:^³øþ®'æ¼Jñº ¯$~­¤×qù¼…þïþ¾ïeÜ×}ýÐðžª÷u_ÿ m™Glüĉ‚ø¸0âR,±VX*¥\ö•±µ3A‡)HÙ±aÚÕTZ݀ߖáé”uÔTwò ¿†žpaâ qÑà ~9øohyJ~À©I1ˆ b«¼KcÓˆ¾EÚùvæÕÊeÁ[_/ÅA·Œ­*T9|¨B1ëWxá£Ú`–IT›iµ³e»#ðª!Á™If%\ª„ЋÛ<Ÿý¤s©E#´åƒaäD¹CCQÀ(ƒ¤?Ägà¡@?£àHñ®Q@£o¼TsŤüNVè@'Ý+– |èb¡CÞe_³“M­!ÿÄmÈÓ#âÂ'‚=ÝâýXüÀ1D òÚÐ?ÿüh(‘®*4¦éPZ»€Ý0Oÿe-Ä÷‡þ?¦ù,GÍ%±ÆåF?zz[®÷~¸Ô;[ p­ÜÁsæ\s6‘Œ|ÑØ={×.Âán š;Zyæj0œ`ÎvDҵȿGêgð5j°HZ1D0ü@*Wô5ßĦ¥«ìò¨XDxtAJkQÖ)LHì†°ì§ Áמ—›TbèÛ¿À,É`¬j?´–­©&ÝEºùŽ7_)Öá˜UÐí«µ%7í”Þi¼Þ(Tô~ù¶¢ÀWŽÐz^™Ã°:’ZKME’‰âDX㲠ħÜÛMÖ‰tÏ|Y\Í 6±Ðþ(ö«Õ>¿%jÏõ–Ñ{®”l¼Œdz•1xÖ*UIè—ÿznÍîki9LKžþGµL–ßñÒ-r¬ÿ X­W†_öÔ˜öF[ïë¾îëÖïëGô·bך˜ ÄYFMB]=‡ž)=+P«û“¨–<·Ô§5ÏÛ8áöøëÅsË^×N’ 2Í+ò2 °äSê*Q°I1«èÁ@x¹uªÓ¡g”¯9¤{,ɹ"J(_9t¾&;,jñˆË©Zã´¼‚Õj´öE©Hpšì4?é)»!:mX6g =žãWA„Ú\®eËX¸BÊððßfÂ\ÍKÜýxì˜=dL¹#éM?ŒjªÕ1¡BÍ›nüˆ:fyE†“EJ2âŠùøœCá¿–Ò©ÐÞ"’§£ÍIÌÅ"”Ò±V4l‡³Î’ľ¡9B"ÎÒÂð«xŽ^®ãY¬éêúè\Afy©'³ÔK¬¤išf/[&l:| K`N4’«J£Ý—üÔÜzÈØ«(®ÄL„¬GÒ›J!«êå›û~Žz/Ø÷<õžØ”4µI9ý¢CãQñP攡žòŒ'š6ZðõÈB‰x3eof¼ÿ|úúåS†‘xÆu0°ÌdI{Öbû4ý…½ægpL“ʃjÐÆè_†(~è1–T¾9é´záë³á¾îëjïë¯D±yÏÛ_µ~mW„E_2ǨŽY„)_9É¢ñ‹’æõ7@m‹Wu‡$à¥]P]ôÌgÔZfyæ…,X"ÿFé…N¹>5”a ’NîÆ?5`ùGF€µK+>3R4Øž‘ÙÛ¸ò0Cê—07bW‡™ª?³³2*+|ŽÉÑXI[d÷[”ƒè|СÛPX9Ú©aC¤¸9¹¥6ÊÊ÷ƒO¯H¡LNOù|û‰ÐC€¸*é…ìyIAêxÄÆ {cP¸ü×nð#RÇðQÆüäUþ¼Œ Ñ¥P*+ËÖ,z“(m-ïjiPï¥~&([4µfóî¼Àz‡÷ϧèÎÞˆìQLh»!B¿ôæ IK+bÌp5µ¸g• yÿ|êV%{Lk;`²9ylÎ[&^T³=íÏb‹P œQžEÜ8^E8Ñ·u=¨nI\O3½O¾BøOwgæB+þaq5¤^3'&ìuÛ—¢Äb{ºäû:£8çžgx *CЫŒn+ mˆŒŠ²s{YÇ‚ûTñC؃ÛÞG±ßÆP~ïð·BM/Ýù‹½ ÀÜí}Ý׆!Þó¾þÆÿ¾ÞN<Çõ!qIÆÔÐ7Y–TÁ4+G²øY™iß…JmLÇNØ·×å8œÁ&(E$ „Dgй;DÏ"G¸„ãÙAÌŽÁÒ·3“klüÊ@a«%³¯vª)†àðöÌ¿š3 ù©Q~•1^~Ѭyn›Éw]Ï(£èjy½Êyd©©vˆ£`ë\ñ\™¾0õaK˼QfHfžn1¦ÔÚר2I6–̉Éx0C^Ɖæ3JÛ ÌìÌÆ4…oF1wíê&¯Ã6}a¥¿!ý#úmн~ê¹E ¨v®]ióD™®³,ºß‚/É:kÚ”yN±|"B¥Eÿ-´~û²¾qÖ¿ÛæzqöÚÈa{¯Þf¨ñRšíŒ:œT,¨f\ɢĵÈ7vÎÒªøÂ ¡Ÿ{351¡½Sxß8”àü[a€_¡üT*Ûž\׎mÀŸŽÞÐì}ýµ ô¾þ:°ÿÕù?`ðí7ÝÆ‡¸*žLR”p²ÞS”w(­UšÓp<îfætÉ-D~^|J¾@pì<’¬ÍŠœä›»ÏàîèžG.hÆ"#ÍÒ1'K¶A5D¼:²ÁƒâúŸ’3XÅ––=,I 2âC`!hxÅWÜŸ , è 0ù1|Nò:íÏB6ž¼ ܼµaÀë§'„1ßá•‚*=Š@Òið燜ù\ Öž÷±`ììg§Ó?ìêÆ^ÚûóÿJEGžCì#å¤d]OÆ!ê;¥uZ÷ñƨ÷À”JIvÈ™8&¹t¢^²à>qXBtN¼› KŸRùÔ¢Ä~ãöbVl œbvÁA½˜eKÕj½xÔbå%ÚÚÃEמâ<Ôv$í£Å!YJzKl1iî/áÓŸ >Ÿ¼Ô÷‡èïkýo%x'¾ ¶žf%  wRPÁÂâ{1ÇÙÈ;"#ÚT7`jœ¹# g⢦ö©wÔ½±;Í6ÁDÌ“ãÞèÛú±Ât.ÿŽJ£©­'  ‹w_'÷XPü›Œ]náµì\•÷¨e’%üš>ëW4…¤¸Ó Æ~Ø×šíß@bÐúm¼rü.pŶΑïÄNðM·ý‡ S÷u_7ø{_áfsOª_°l÷Æîúð.‚WJ]­[¾ *:”%ÊM%+±¸€úK%£€µGxqYk‚"ĬŒ'DˆÿBåÐC4ª_\U?ˆz5—rùö¼,Ƚê:"OUn ÔN]4H‚¨`ºz‚eRaˆú§…P´¢dvÀv£‡¤žõŒ†ˆB"g¼ò+}+¼HCÖ•*Ïb\áõÊ`£=Y6X¤R­xM¢\*ý¤¹Þi°˜5þ{ž/âx¾/I­õúB“"‡ç|]=:¾w¡«Êø²JÍÓ¢¡n¨"ÃUŸ¢ÿ¾O\Bމ˙ò1æÒBØ4’!p3øìOB1*L,¸Chr&—|b³¶ÈT17Åj‘Œ3úÀ?þó×+#fÐçÊòÅ•òZål'­~àJèONsþDìõBé˜`ü.HybìÿdëZ{àËþ +¹•Uì·Í™òCæŸÏ´8‡—»0¢¿“¹" ;‘¥Ø¶/¹e| Wé¬Å`ÙÍÆè¤ú\¤‚F74åüŒÌßêOÈ nùåN‡K»Ïâ…@ìA½ÂcvIJåØAi•üÍ ,Œ¶ÛϪ;a©b.›*„5×lÝ\ÕÐÞ¶q«5ȉ!k-òhÐ"æÑÍÀÕ€«7²™&Ít¬{ã IDAT×0ƒ}…áùxvNÏ—nb§r>†) Z©õX¼Ä ÿ¾çoeöP;\Á,xý2œ†OÒ§R€.‹i›cDT][SEбþ&8#¸%½Do—/ñwQ|ù­…itr£M÷u_÷u_ïmÎß½yÞ%¿ìúâ«û˜¿¼$;KäPz‡ÛQ`àH6\§9©±(w¥ÒÀï÷>!AI›Y 6V¹Ìጙ·4èÚ±‡.D†*º„$J º¡I»srY¨I¹Z76X¯ùP’Li)ÿ¥˜Žþßôˆ ‹¨Nrª rû•Àzª—Áœ…~[ùò]jF @-šèßÛ©?9!ƒ¢‹uy¸7ú¶•(Ê A|ø²VièÉî LšåÙ·ù¼—×zÁ0.ÎÌ„çç/GÁö"ø—ЖÓûb2ÙU²ôùæw*à ŠVI·ü28ípE£$ ”*d( ʼ"®]ÎFÓÃó“©@¸®—VP‚oˆ¨(íß)Ñæ¢Õôůִ†-.Õ  œW¹ÔK™#€×Ç‘e/‘ÌiÑéöN§å? Ôð÷väC_¾bá×—%ƨ¯Åùv-G épF8KË=6Ø·Ÿ*Ñ7&6óP9–Æ&v•P7êä›j”ƒFÛš‹x&q·;‡[uìÄäÕdxMîð2bå`¦Ò£›Å”*Z l êèDÌçwÐ/ F£ï5ñ:ƒ(IÀ«ƒj*QÙÙâ|wP:$p)ÍW©»ý*H*º(Vr% sóàVu.{°Åî^zŃl1b¦úiü¾¡ÖòÂo¡èØ{™N§/³ÊزÓw•¾’@^ÝØMh µ±Ix1¶[¡MY ˆì.9Ÿ9à øÒ›øäür›c]ƾO“¬JÅ@82µ ‰‘=‹ÜËÇ+“7TkÉ÷êZOà K/gÈNgP¡a`a5ýe† h•‚’óp@ÿ]›Uì+SPª‰$hV–IÊó'…5¢ÿJ£#äWE£ŠÉÀ [ÄÙã!;Uº1¤ƒ¥€0¶p´ñÐÌá×ó1·¡GtäaÀ³ð9¥£úù«_ˆFÁpB=õÕì,Ù®þT§J¨fY´O8ì´Ëw:toD„bërþìHôŒâ9t³ˆÝÊOw|<_‚?Dî×qˆ‰/Q°*4ÁfæíV-5GùÏ__(Ž- …²î–R†púþþ-øk,mÇ -V¡7(½V+ûf§™îëše.1 ‘Ÿ-å=‘­ÓÁ7pö׿|ÚcßÒ\îOÚ7æck‚A7…´w]6!(F r‡´F/ßv[¶½oßmä.=çÐÕDBØ™ÔJrë™sœ4“I«Õòi°,é6«9ÅÝ è;ä¬ §Mö€Òؽ{Li©UÜ& Ì˜+œkCøO¨±ŒÓ‹Ü J»&Ók*A›y¢^¶Õl^‡‚íeî²å&½¹Þ¦Ý¬G'¿ >RÅaä®T}êëœâÆ·–½Óû§\8#t®(gÓ–¥¤båé£âcõø*˜¯¯&™½½Ÿ7E‡ç 8ÝýïJó4Ž÷;*¸zd|mý¾M6ÁUº¯ÿäuOü!þÏÞûß8ù—1Àæ}LNtÔH"½™+² œ®Šð†ì+’%s^•6Dšö`~d’¬>ô€ÂN¥cÆ$ñzàHX ¬Pý×%•˜(MÞ[K*1/bƒ0ø•ŽQÊ#¶â†WFMcL=W–ûÖze´ŸÓœGÓêœ!4<$}ÑȆ$SÍ€Ò2›3Ó¦âÅ*ûbsß^ìÞëQt«•O=ýÿMpå}W±c¯©%ŠX 2P×j‚Ø<Îì啎§ OBÜ8ÎÃHÃñlGˆ¶æþ‰Ïq{¼bœzwõÓÖ¹TwÙ±ÕHSk½L¼V зč<›†¨Ë ˜§Ôrá3‹:¡*”¦ ³â¶2SôüŽwßeYC1D¿â3ÄàdýͲk®/IägG˜?8h 2FQ<ƒ“ëYãSaÜ[ÂÖ³s@Q®GÁ7­–‚zp™ˆÂM¯hû.™T¹•&– û}¬ºú| ZŠòˆéºÇp£ˆª¯ õÈ0 ÁOqõMot¼h@ưØÙÀ–c«kÅ“ºö>¢¸†áÌ›Jí ( B¨Æ>z©â-qÞLúÈ‰ÌØp‰ìHÌW«4e· 3òã,/Ló‰ô|+´«0ÿ,eÐfO$õñäÉÎP5ÌO¼f‹gœÔ¯|#ÿ}ørò·Œâ+Ë¡»Ï8ÆþœbÜ0/½/…¢ïUB2|ò3–±ß6§²ŽˆRÁ”’‘Oy8³ö©õK“ –U‡Sv—2ß“á¿Aœ\Ê×läù_¹ØJoœ ㆗¥ïÇÿG¬—õþ0àÄøÌûº¯¯­‰» à¾~¤Æ=ù÷ü¦ñü_ú£ƒ+cbòJÀ¬X§ 4-Vmë§õÓ!€lDm}:Iú¤æ/áD3¨¸Òê…$ä—&üBÿWwÂâºá\´1C )ÓÁÜäàÍ5ðÔaÌÐ6±X0Tc适ÛŦ· ¸>n$ p£=—‚D”¡O^LD³£©Àp)ð,òpÑÖÙË•žƒuz¸j X…e]³Ëh‹I¦ÁÁ93–ÅîuA½Ô¼NØRÙýFì»N<%zª§1.õžÓ Ä&Š]/—†{Ò˜‚ð½:@·…¸Çä\µØû®JCÇRwU«  ÝGfiæ%÷ £ Ij q-X Ä%$¨2Óu*»ô mÊ¢©ÎAd£š´í ͇ØÉY€-+`=Øt#A`.Y*j4ÐL4—¡{§pÃÄd¯ªeè>¾mAó&Õ§¹™0¶#YêDÆŸ{&cŸV yï!áþB ƒË{ÌÊãTh±bÔZT5*Ъ[K”™‚ÊòNшlõÀŽŸÓ7,hšuÌΫ}j¢£ÕŒ˜øâHEkÃË®^ñä|WAÌL Ôè£^5‚`{JÜe°ª>ùRAt€»EiAß\áþP³±EB½œ£> C7wýE‰WgÊõ/•PŒò¨NE§€òãí£#_àscdº%n$]ÃgÕ;Õ¾ò2Mnt˜u×íáÑ4@+]ª¶‘)Mâç/¦Ñx½Ð}o¹sia_®ü6på X¼‰è¾gÀ»·¹Ü¨ùOÍ/Üç &Þ£ðÃ0è=Â÷õÛ ð{üÇú“^'bæï‚ÉÃÛ0òâE֌ݿZ3pCaIílÁÔ#׳ Mdw>Yˆ’«I°ÄbŒ)1m§ÞÝóää™}ƒYú¯+E%d¤»1߀‹çXab ˆN`Í9.JAGæÍW[JÊpš‰‘GÝòµ©þä[êJ äw»fi€ž#v êÌø4oEôX®ÞÀúo”C ¨¾¶« ÓsVDØ%ØÂì ÁZÈyþ&"ÄïŒÚt¨_Ó5 %?ÝÇ“ªLË 4c›zÔ¿nd!o"  ¥©¿£ß¯ÑŽñ!:Ì®üTÞ?vLJñD[.TtÒßùçÜcöE7_ÐÂgóÓÕgAº0þŒ&&˜Ú|¶GÔ‡BÁ­ƒøyv”ӸȄk*Hdë±U&ïël) áÌÜùŽf5!bq)dF´!¹¶Ùjr`‘¸+µÂ`&nén)K‘=´;0+”÷¡ÏèÚÊz©v%bqØAÚKBKxwØ:˜ÙP!ÔKè*lô©ú\]RÚÛ_ï&³$ËV’w`ŠQx!…­EœbÐQè,¿–âˆÎ§K¼¼g¨ÛC-!ôÁŸ&˜§õÞCuÂŒ·j­J“Lç)󞟟e=éžOM¿™(çáVW­yö¯Â^!/ã:b â¬yRm§ÌeìY„-€'ãõ;¼©ecDbèSàýG:bP€o¶õý¤œ¢cÌ¥  |KaI¦í¼AØ81²vðŠAm\ jŸ­ŸS:ð¾!^,Å·Ž Å¹¢(~ò[úÿ½ì¾`ßDûÇ~£Èºõ–ñÃr_÷õçá‰÷u_/[÷Ì{7ŽøúõÑ"•È NаõkWoÒYfVW÷’óXŸ©»z +ÍâÊv”$8&© ‡ovüV2ÜIf}*È)ñ¯èf ºâER6¼U¦ç|)©Í ì¹Í7n:º9Š"³0ý’® X @@NMaÁñµ¶,Ò.ì›jHc´™´n™?Ö)7Ú¯RÃââ`E\³MqõÄ@ýž‚6Cg]Jh´< 7Ôª1(¨½{FvT§‡b©ï âø2§£æL¡ÍuíxÀ×ËÜW•í±îB†c¼gÇÀA³‡Lƒ…°GÁYtøAíQBŠÁê}§q^w…Æx CÅd/д„g3pµ_I%DèÄWì(ÉP’¼&¢ÁèÁ´„;œÉl¼.ÞÚ‹ƒFZ=|‰Ò=ãï~á¼Ú켌£—Kt§á|VãþØàþ3+XlµÓÈTɹ—„ì†Q^Ó¹YŠaŽi_Ö>¼¢©…šo3¿ß¢ÏI$×ËÈpŠú&È5Ü9Ôîý¤¸Š=[^¶­¢˜±T°ðâNPÊc»TTý—ØœPe7ïI¶ƒj$ã^M—rÄND2'ƒÌ=zAšüUÏ È¤“X ö ìq-¨ðM:nï$„žÕSY,œžû¢Ð¦f(i¿1,ä ™ŒýhLöT~Baaú-ö£ÕšH½z];²·õÒ_éÄŽ{ĸcèëM²v“£æžŸÌàÿdÆ.ÞFƒðW<ÏÆ{d»Ý ïûZñ7Hx_÷u_ÿå½ð'Üî?i:°¯’®{9ÿ÷“ï#qAý.Æ¡“¶ñ”^Òåu^“I'½Ü’\i¼="›èij 'y4ÆìeŠU™H+‰_'i¦‘c '±Î­-ñ¬³5ƒr§½ªó$hLa1ò9„(KK#ÍBç ÅÒ,…Ñ5s<Ùš~ç‰]ERq•Ø¥Ÿ6œBxZ6¤ ¥nïXšo u)öíIÃÇ, šKѧØbQ"·b8í,Ÿ?|³YE½ãˆ=²ÊÓìŸ$6â´¿ºZ¸¢ÞÄX£ãÓ×˥ƀ š·Äþfp3ö-8Ÿ§ÇUF (U…Êltói,ÛãÈý"˜JFø#îáæ”Ávò#ZIö *™¹´æT˜¤ï·9Ù¥±O’å<Â÷¶ìÉh'#ð ]‘ý\1ð¬}•ÂÎ1×¢³4ZÔÕk/;â›Õq/9'í)±u÷Õ¡É¢ºÑ+ôU(éÿ‰6â®$€rF¤¨#Õ}/ICd•¹úLÄÌoc2Ó&‹'‰L_LÏ7ÂDéÜÁ_îÔϹ®~*D%ÊB‘ùNö!*@ôk…0óícJ¡%·½äx’®q³ˆ`‹2I‹+Npî‘mƒkÌÙï`JÙàäq¸ÆdÑ9-«SémøHXjñ5°ñKê1þ¢PÍõË´ÓåqÃÐ’›’µ`е¹XkiÀ&ñzS„š‡ŠÌ‚>VÌ%Þkwj› î}EŠ}Bpø1ü™hÃ’Àk~'ØŽÙ· ”ÿÕXËÎÖ'õëd–n_›‡ÿ>ëFýïë¾îëO…×ÿ×t‚’„¨bu2³½€3¶€£U Ð"pnrà,Öú„½(°]‹`« Á¥a­îíÒàŽk¤B¬p»PBODÙ+Ò>\"Ù â§ÿAGV¬f¶¯”P šà² ³f¾¡m±dûé5† •E¨·©ÃøÂ¨ª>VtiXe7š.©¬Øç‘jEšâ4éMèæpÕ˜*ãr™?3N AjÆ2[A‘!“P!ŠsÚ”8ÕB él¾Å 7Á”3a2¦ŽÖu¢ ¹Êô56¯±±Àº&„±@·^ê4/cu:!O§b†Q% Ù‰ÓJŽgH‘QËà85f×i Ùˆ©6´Y PŒ«¹Ž8˜˜®ßäÄ´ÑQ9r ͘®=Wæ5ì‹F5;.´@/gôœ3ŒTeÅòmXÊ Ã\‹ýÜþ'<¨Ì@Ɖéç ÉLÙ™×qÖŽ ĶƒòŸžK„Þ/+j´©j™rVôǬˆ{ˆ—X)Æ…j°Gõ›[:¯ç¨7ÕŠ£Ô\–9ï¡ö\eI lNÁª_ Åé³…/A”WÑÄþ0uªz ÷bª¼Ž‚TÈTA[ëyåí»JÝ„½(¶‚¤ÝHgתB6O§ØÚw['Y§!טæfþ†í!EŸ†Âä¦'js˜ >Há-1ˆ©h³\#±,"þzl¡ß”NtæÏ„ú„ù™c‰å0-<³ã‡}9øV¢[k‰ æM×ñƒü&Ôã¯NºÑWd©ñ«°¥®{îFÚîë¾îëw_‹±ÄoìÂúií·å'Œx…ƒF—¤B?GâV:Ë:ž“ECN¤éÌÕE›ZšªÈ4?ãKïý(ì­PXçõã¡TÕÿž?!ÙîAdv(±#dÚÖs¿$é ²€è=›³èõP´»jË<2a/oÔü/4ó¤cîwÈ­-‹NÎÑßú¼Ž&Õ璩Ѹ’^y#?…ݵò)C9*ƒài&¨*QÅuÊdÆbÁF?9éølñÍ%ÆÌ.ËCŽTÕ¢²òV“6Ktû8jë{tp–j™ÍšB`E Iõé'¥2¦ ¡Y„=¯Ÿž¬È $Ý@IaÄÕI†^+m¯=Çt«2 'V©k¼YZ+÷1|#*hë‹jÀêôàö9Â7—jõY”5—‚fÞu>Ï÷ÝéùøÿNgõA;O²COU{ÍëQÔ‡LÛì@Ÿëºò×/û@Ýý²Ø™“êŠeÝZöußnÉ FÙç¡i8×YÁ/žïìO (‘=¡Ípáoêz°ê r¯2Å•HÔgå¸l£Z4o§›:^X²uéÏd]²i[Pm¤›–ýSìÇ«µ-L;-WÖ<êºÕÊ¡N ‘Ý=sÞ2Øœ¼Yü$ Á-G†j5-7í,¦ýwpŲɸ¶D×Õá½Ùë·ÈÍI² ÃL†¾œÖÕ|zÈ`œÆÎàë•æ&.ÏTì6@Õ÷!ÇW±uyܲ€»ÛÙ û`ã1ùU´ùFDþM×_§íóÆ»»k÷u_÷u_¿õ ùHlè.‡:P¢ÐCV¶¸1Ù~Ê´p’t&«#ÿDFÁ6© È&U*DÝ‹ì7‘£_ñi+§A§…ý©$îòX4áoÖ)ù¼‚§)»-ÿ½±1˜– Ë–ô,F–ª4ôµ€>ƒÌ(öÃ}Äöê&Â2«0‹l\˜ë&\ yíʧõå7^nÉ#ÿ$ÔD2Ý@-r’#£Bà¥ÛY“pÕ2¬ÍÌl¨K¯Lǹ>ëÞå‡.¡]Ò×Sjé8>ÿÜâ3^ÓÏQÚéï<öaq’'Ž‰Æ–ÜžE2 ‘FaÀÈØóò˜Ð´£SH\hQ£M4Çï Fx4ûƒ½ò±èÇf§}ž^¿ œl€B³?¤(ôÇhºˆ²“ýòï5å]˜S ´#Êý%zrÁ8MÔ¹‡iJW0»¶L•pú0Øtï¢cÖËáS‰w+mñD G)ðÁY}z6‰’ZDI¾_LÕ±Øêü£Øÿaƒ@ù³{Žs½€ötúfœ*Åmùu/Ô±öX†Z/èñ»—x¢)ftr¾ãüì*›Ì‚ôb[ØL¬&1mÞŒÜ÷DÞÑ$_ŸÕ¯aµÿOßeMA¦Ï"µþm«‚EYÐíÿ$ñrÖG’ AYDÕê+B2±yÖUL0½¹n ¦=è¾wú³ÀH“˜wmi^ûÛÖoX\ï£Éö/*,]Èÿ5y_:ºi^ sµÏX ¬nkÒîW4€íxy}§›áñ»Ä±%uúª{À=°‹Œø“[AûåÎ=”dtFØ®Êd[Z›(ÛHì8ɈŒ»¥{…{é6Þ¸¯Ú• b¦%A$óLÂÊ^“*Öóóúéž|#­‰iÆÓ`|MËO3ˆ¦œd©"eà’ [BE…Å®‡fœS(“j°é"¨é&vh1¸Šÿ>æð™¶…žÇ·«Ë·Èn›*ê«D!à[@@ÆK$‡RwúØÓI¸öc¾Á¢r% \ÃHjûóÚC·Ï—#ÞëÁ2 üs_&uÍÐ˺»9_ÝÔÒO<Å—ls!ïÞRˆ uOV!†ˆñÚJdv?ŒUXN€Ä™aƒøõÇ ²&•Pj0”ïÊúZ‡k¤ö!5"c(²1@Ëž9£èUeÚß­ (-Xºï’âŠió‘÷φ܊I{­zÆÕkšÚzoԘ䳒¡&hÊá Ý9ÓeGý>~ee#,¢k¯]ð¿¨^@¢F˲7(¢ §7¦sÍÿm.kÒ1hÕ¸°kÁÒqS¦í&¦|}¾s¿båü­PåÕ+É?â~¾ú¶þê—r_ù… Ͷûº¯ûúâA_òEÝ·|#;:¹Ò°†Â†÷’ãhtCÒOUÄLÉC½”ý§ qÖ½¹ºCepÏû‰B>¿ï<Œó-r €ÌHM>Äñù¼è­)}?„D48Oü !oSо#á…è“Io‹Çšf’Ü;ñt€³ÙX¢†šPgÎ÷O73ãݦ!ý„ƒ‹B½%@3¦1†65•6eyÆ®ÀàÀxó –ET§HVZνˆDy_J …=<Úiv2î ([JÅSž¿æ_„Y ×oí»•S‡”qò$cKÚD µôˆE^Æ— ¨QZ˜ðI ]« ¥&¶ÏæÊ“ÚyÅ‹h9­D®%;Äœ¥®€R ôÊKI°…­3¢‰k»+ZÐòx ÍNÚÁO»³èÊ’ ¸KV–VäÚ‚b²3“ ãÆëš IDAT…•-ªÕeI ŸÆbâ’ç63ø…_ÇÕU·N°”—‰KJЪÚíZÝ<¬~'¨X9Ãüaáøc¨íB%®B(ÌRu¼•®_»7£E¹¾Èn¼Ð3dÂÖ»Zèâ<…j ؼµ"mbÓ`"|—à 'ØÝjpP°lª­ÞëFÒZ¨Ó´¡+iH¨ql‰þï_}†zOœ22wäq ×É,Àzäiãa\4e¯sEdéUuz«Ùä¬ÑézI™Ýº7hBý¬f„%:ÕrÝÛ½&cí.1¨PФÀ\5)?ǰ·›î‡ºRÖW|i¿•§… l°b½ð[ÍWH*ý_:׎ÀßU À_ò™÷u_÷u¯°ûZiÿÞ¹ý‘ · Yù‡°I¦ß2—Y¾ABËÓ+iàJDO9I :€¦·ÌXü3%>Íþ1;h'„ªOeáÌÆåò™jQ ;t¹Ó7ÍBËJA£ICeÌå,éë YpoMæ(Ã÷ Á—t«ÜÉ+Ñ_Ð<4jÏ( 5óÏrpï‰Ð¸ ˜" JB%÷ì|+ ϬWò) žESó› ›&ÿ^Ú¾e{ #y^ø‹THxþ™XÌ31ˆ „´UT†Ô=I^帄‰Ãn>‚F _£,ÌA„G„p©ê‡áBÃÚtpy&cB!’nwÍà;ƒCUWƒ…ý<Œ_Á ùœ[PN(þ&ÅTÆžPì ’ìvÊØo/7udÈrL}:°Õ#b¬=jSô¦nPÞÃëâ(pd$bÓ®â–?2ô²t•xôÊ :ÞApà€e¿ÊTž‡ ÈÀ»æ@ª9w¤1m¤uÀ‘ídQ6̼ÃP85ºq"€€7SÚtžNR–¾®Æic?¸%vLoUâæx^[dvÒ”Éi˜7Çyˆ0wÎýHÚ>£ÜÛ«€Øç'áumÊúŦ ͨ`ë>ë'ÙÈË\°ª#ËáÚ?½å†7"‚Úÿ}*‘šç²Hìßû[)m S–[éuG”_]¿l"ê±…ÊG¦ªJ"ŽäÒü=r;CEÝ©0Í$’üúEùœA·BŒ±e5qü(½9(‡³åûâ gÁ÷ÀN2vú È1ùöU%à÷C$œ­šŸ½7Ü4üûºÑûº¯ûú§ß×£ÿ„Ns9zÕé„þ7ª•ÖKÑ®`ß{Ä„"«Ëâ~YS‚ ›î4FœsútÑE–1ùBÆDFW©× íZ2ÄïŠëlëP<2´)tê/Ö •ƒ'PÓÂéÜJVI˜HŽ¥¥!Ë÷²Õ4>"Êز’›ì@«A¶½dšY[ã°¼$ƒÒãÀ›ÁÊ ¶Òºš]× 5,` iÇó&OÚùìh>´Z¨‡–.9ž2Wd"ã™H#omö‡ÒºyøŽž…Öíû„Æ+`$§gð"±³~—Ã:Cz¨ê%AhbGœòsZºÃ¿޼œ©ÇJ#¥ö ö4=%j‰‹UÊ3‚¼>ezU’TÂJ´¸ášø:¤**((€{]ÝqŽïQœø\)Ç Šs7ÑÒÓPÐu¨ Û · ¾£aQ'N±\»Uò5'húåÎäã”Åk…&ñÜL² 3>b©2ÄÒ%‘1¨FiR„F1£NßÕ´¥imy°ØlTˆž3í°W,%«OŒ*aI¡*Wsaäbû^–Jb¯º´Án)û¡8èB=~^³Üknƒ Œ­ÅÎ’úÜŽ)ܼcÔ²qØÁØúŠ‹¹6©ùM)Û˜F®y—[Ñó1Y°¯ÏSRœ°•ÇØ×Ͷ’ ÌÞwÑ0U$ãªÔa×ÁšTäj²ÖzÄÏ ÇRí¶ýŠ–ýLÌç€kœ7¿bQhÚ·?ø©%õþ úòÇ‚:7|_?°Úîš×}Ý׿xãÿ¨/Ad&MŠè² ÇQ:cNîó䊛e)óGJ¡Æ*yéYH)ë»$##B»Ð‘a¯ÀÑ=BâYŸlšÖñòl²ªtäÂß ‚g5³ÊP íê‡Wú$+ý¶ä¢#ø&\_Ééþ¯q=¯û™5% ®AD5‡ n¸çÐ=)rHhÕ m}%ª~(.ÙzDøÌу C²p_é  ËøÅˆŠk'”êùàøe—´‚B3{ÇøKá`ÞÆ8Tà \Ékà04@x™ïÔNFW‰©8C¨¥2$C3Íõ/˜éY ôŸt,EhÝ[PØãøü­“º‘µê+^Ø šlD&.bù9[A‡ô“,rüPLy3ÈOp…ˆzTÝ6&«’úÕšñƒÎÆ(Ý=Ü<þy–ž]u¤z/ˆÁOuF­R§%…ø@’·¹†— $nÑï¹V/D9–AZj!Muº¤þ‰ê3´yÿÅÄKò°›÷XfòÜ¢GÂR†9ZçÏ©ØØθÏsÂ,úšñ’Ü>gȸÆ}•r+.š°f²a;DÞt5á$å_2Ïz5\¡Tö4‰I£æH¹¬Ðl¶ÖÄyUÁúå+çôý7í€;/E¸Á¯>3íEXá’ljTlì@&ŽmgFßb‡ï…I¤©ûä5ÅúÊì~°çq·ð“ê©èöP˜/«N`jyK(-S¸…Z“¶šeZKäo|Û“qÞbXø—O7 ¬ÿ`rþø½ Íß ¿ïYþ†ñ¾¯ûúï"¸÷¸¯¿üú¬4„|/¡¢,h…=õ"P±æhoÀ ÞftZ´EO ‡w¼û*ðÁ á˜x‘fBGâóš×°œÿsÅ‘-£Z^²& ¸OiKTv¯§/ÊJ‘Û¥½×|èìŒU1ا/«ðÔ)™9'XÿšN'Q½ì,™”Â1÷Q„¶(Éf3Ú2üv‘gú‚ Ìo•»­‹Ìì§$‚ĘÐ&cÛÓ«x#ƒec öOR¡9‹Ð¿[#Ã#ôs!ˉΠ½yí/†ú¿ý¤Á–ipØEù÷Í  ¯È¢=‘' ÄÀ¢……X/LˆÕ¨^½>Œªç†0¶29UpÏzη„à•©‡f^ÍëX{X_ûCŠØ0~üKîë¾Þ=¾îq¹¯ûúGÍOLº™5 „t*çª5 |ãgBÄ’]I° m<[cz!~»àþ¯{Ibáéñ…ØÊz“M Ç_ ­´.Ù/Š}“»]÷†úñÑ8åÒ·ñÁõf©#N2Hc޽ü…Oó‰BUFLh-Pç.òI]çSmŸ‡BRõÌ‚°ü¾2¸62)§’Ú†œ´È’å-&•âÕª”òDÓ[Cä È.xbˆV7]º@r¸ð UŸìÎÒRÌw5º ày  õ,•ßt ëV <ñ:34p”ug õ£ïò #![i/]9Jº˜V&)ž-,sJoÏ~¿…³õå­¿ˆN2ŠÍ*ÛH-s½þQ²ÖÐÔ×’OV‘"”– xLS l*Â1-cÄYæçÇ«§ÊÊ3‘Óx.Bë0êNX`’MJ?£ÆÈÎ, VA"aT.âV›}Í€xŠ$ó ò²7•­ÈFäEsT8ÿ±³vÜ«ðŒÞ jBÀmÀ qFêXBîÿ[CPà ÚxĤG s5®E ‰å‚*lp¿DSÞË/¢ ( ª´@Yupñ¢Ì4W˜ª;#FW‹!½Íu/[4¾§”gʦÒÕäGÿ³D}P+U"o›3騗£ Õg»á¿€p•u”¬°tXΰ¥})šÞË^ŽP`Þâ¾ÀJF$P<ÿ¤³ÍL‘ÃÕdê›ÍZæ“`^xòx`ßä°¡/À”Ó Å?õu¡˜±û¥$!lΤ™š£÷ú5¼PRÙÛ^öíÛ.¯üMç…°5¼øýzèÒ‘¼zC»¥3põàjG½‹÷õï»îÀ}Ý×w-¥?ätø° ¾KàµÁ«‚$µ-"W±öü¯.ø‹Ý©}Hiãd&š£[åŒ#{Ê%b9›T‹IÇ öh÷nW€iA ^­ pyW²N¤—ö¯ê=¯IF]uàš6Œ¼<ÉnÓ_¬)Ž„BTAøE”÷;}>•’­‚yJ,³n>¹ ahaePèÅ3!ŠO0} ÂU?ÍþÁçˆ}êö8T}!¦û„ªÿXÎÞp×Z®€Å'Žï@ðóéF;úN7!?ú²3©‘²ðÌžaA˳t‘3©µÔR–/y"Ú,çFJ(áÔb)Y­¤QÚóá^!ð–õ8¦ Y…‰Y4™¦µ(lMef’‚²Ô†+:ư^ML^K—Oõ‹f?®9#U/¼<‚C‘æZɤ(—¢@Q ‘ÀEœQu—¥ªLp€ìW†Ž¡SÄ„M\…ÐCÀ޹ɯÝqf88ÄÀrxBþ~¯"å'§Ž_”<ûPjf ‚õÐB•Fƒl ŸØmSH¼`r _ÔYneWhOò5yçšaÖS n=_‡Éø“Â!);KÍÔ †iÞÃ6 Í°)òñ=Q_A‡Í4ÍÄ4­$`ö Ù[®Î)Ö¾tØÍ×ohËvSÉD2{–Â5ºO0 ù˜V­¸âÜ^»Ù¦Z‹i®8ÊA4ú>i9®ìs<|+«üÀý¨åQÍäô£~®»2ªD§,°X¼bÖ#ÕÖbw&t™d+MçÖWé8fó+LÙko¿ý? ÕøÆ¿ÝpжWß©½U ²P·» ðÓéß{¤ïë¾îåöâõ¡C±¢,_ÚÅÍyõ€F‹„!§=Jd¡r½v-L)Å3ûIv‡5¢q.¸ ˌˬï:f¡mÉP£^TD;nÅP•± ôgáþàȘŸÄæl€bBg³Ž;³ Mâ1a1n¢ê<³ÏRÈZÆÔs  p™gC„&·t8ÂË~àœäØF?œÞ=£{pñÜçé02(a®Óu| àŒ—>¢LŠ T— g‰ |SEE0£SôUE¨ 9®é;hó·ŽyÊb@í—6E¯{‚éæjã#Úhå÷^'HM î²"5¦ÎÏjó)Û9!B¯EpnåŸÕjh•¨ÐK_µF ë¶Ál[@´û¨¢ü”Ø…BHjî™/åëã =ç¨h©sq†§“b*rÕìÂËN<ÞÕåf\,µY¹ótêpz>QfÌëdäÛ~¦™ºí”½€v<ÌN_ƒgÝg8EáeBWæ÷þ¼†·íIs‚~WÏiص›ù;Tì˜Ø[xVˆQ¡Á1¥aê* häÀàìnxÊ2Y´4hæ¥/5vìüœc!y>èû4g&…÷i¨cóØf~ÔŽ¬éo1m,±ip8Ñnø=Ü ”·Í‡×’F®^ßú±v\¨7ØÉVw¿°Ó& ‹ûZÔœæ&ˆÝW)Âëì¦íuX™jÿ9l`Õpÿ2ñÆlÿ•o¿Õ&.ôìÃ`òq_ß~ݘô/cþ*Pò¾îë¾~ÍÆöP$^¯Wê$B(öZˆR´&MÙþ˜ôxô¦çLõŸ*2K‹—ˆpõë °Ž c:§1ë):öEE@©j1#jÕΜå°±eC6;ž&l¡i“†ÑÖÕL#¶h¤)Ö)ó›…#“jm}Ý Åå06ðÂ/Q9s!›©õj´=ÜbOGÕO@äÕ[sDu8ˆWI€¢bÒìöj6Nüç°K;Èl}é5EˆÐ¢§_ 4!h}„ØP½ø\Œ˜alz'ÌE[ZÎÊmfhÓËßó¾²eVpšŒA⿚ÇÎUEá þlšªHOÞÓ[æ0×Ökcy‰F?X¨í=“6± ÖmT¯;´Eɦ´‘2¾V$hlü¹Ó+Ì´¤1jfC;H7ÓÒ®…%3v“Qk¼Yç<_:\#Ï5ß… ð§/¸q…f„.1NÙ⯕¿E±ö1mÌ’ò¿Kºƒç›ã­PŽ; ÒJ€À¹òP°=ç5©Òs\-JÖÉÆY×ÕϦÛôõÕXÈ-hÜ ñ±Á£´#¿ +oÍ–¸û«þd|â$øÀ,„(çRº‡ÚrÕw´ä¦ÌIh‡ÙÁqáks,Ù„œ—lŽç3¢#ciNLµBB4%%ãÞKqµÄYÃF‚­ôX·Qgfñ—}J˜j×Ù ½åÖÚÏŽêW€´PØN8нSÓr.ù´ÙëÄÙÿœù¸÷÷œm§îÅo-H4tÑ¥»®ì÷u_$y×îë_<½ÿÅ_×]mW2",hAQÁ"SÒS%¹Š˜Âˆ<ýD±OqÐøž9Ã@ÏÜOAu ÈuÛO§ËELÇ‘óq*7áYº¡èHî^P¨ãù¢-ýÒÄØ+~‚TAÏBebZ5°]Pxê¢?a¼ód²2Fék^{…u9‚“1ƒ½(=¤u§µ pèÞ¸÷“‘wòŠÝ;¾Ãœ¥[=|å ýìxþÍþ‡ ÔCyËú‡áà˜¢s,Ãl?x©ÿ—ÂäÄÀ"tá†5\â…à¡—íµÜÊD½H‚Œ7öü3TÅ›ŠwݧÍeØEfd$õmø—h€ÞÇ{ä½ÉEÃËL¥;×K µgš¦üûl<0ä v¼*îÌjm]±‰t.8ÅyH‡a•áR.p©Â4)/Áé¼1ÏŠj{CL%>KæS±ÚQ,ˆ€Ë3šº×Ó_êˡఘÀÁl`2›õ®™÷P\~ŒO ç´¢Q|¬t¸.Æ…Mëd’xõ¡zŽ!Ød²Y ³ã‰9uN¼£Ï)šy~vέج[È ßû³­OKAÔÖ°t÷ÅÕ·jÈÖø£ÔB‰BŠºìÀ‹›þ« œ5 –O§š>³«0²BÝUHþ²p×X¾kÌ’“=X"ØÍ̽ÀŽ<"Cx¿j“Z,÷ÏÕs±ž ÂL? /®×¦(µvKäõýÁÓ ùÜßê¹™ÖPñn–ßw’7wµç=Ë7öÞ»äKßñ§@™ßy§hÅu}û¾èŒß?‘ïë¾îë¾îë?yýÐQð‘ºPƒUcL/Y¤Šç\þ;Ó>Q¯™èÙÊ)¨ q×áîÿ mœ*`ª¶½A[Ÿ9 Eóñh•dÒÔ¶ÏeP¤’]-ÊcJÝÝp‹ ý\ž·:÷cf*å Hù£ÒS¼žÎ\·¸÷vî ÌÕ,NEfh ºä?ï¬î³Ž“Ü\i”_ø~ñb©©ïUtLõ3äU|ØeŒÑ¾¸ºî:B“eQÿú.å–ç ÃwY&«†’:æŒCwù &¸¹ZqxD˜Áì—uQCøºž rX¾\@y´-ÖDópÁ™¹þ‹ºi´ŠçR$,á6X ¯=U³w°ìK(¼PéGgÀxk¤ˆÉPµ¼ À”åþ·ëeÕÎ:)*\$D8ïùãDˆëœf11D¬ê"MG9Š—) k»È IDAT‹÷@ÂÜL©É† 8Úó“QÅÓ=ØQ)œ±€šû)$"aˆPq/eÐ+ˆˆEš<ʲ®|¤ðªJœ¿ä¹& S1ßÀÀ…@Ùæö |&“^/¨bd´^¨;·c'Ç&PÒYÌl-j8Ô§¯€*÷¸p‡„FñògöšÚžjmUqžÿ’¨Þý•ÎÞã¡¡jg± Z*XºX•ƒL·É ê¤#»Ãùk?õî°°˜-ˆ}! QïE¢ûä釜ßVÓ4À& 5†(ãþ9‘ðäËG!‹(ÐÀ%î|¾Íóñ™É­Ú²ñ†TߢÍä†ÍÍ7ÿ“Ë$ù(`qü )oaÏgç£.S4䦜ðQ #yù6 ÆW‰éʇ«­¢Uï.™Æ‡­}L¸:/‘UiržSÐf#©ßÕ¥š-(HÖ Ejd‘Qâ±Fa ¬±sŸY/z€ ”'sì¢'¬DÒ+=ZµÒwšà6W%¬·˜ÎŸê- ½’ÒœÀË5P"¥f&-VK­ê`%‚]}!s»ââ‚•Ê}9‚ýŸ \ùŇÉÂCó½56F§ož€uÌ Ðä-DlÚä½LI÷Ýnбí*]_Ñ|&ò·ëãÁÒ"ªe³Þ¼¸W0¸ê²óLȳôܦ³n °ã+ä5*/ëtŸ£¸MÖ^bÏ^¯ÔÍÍC®ÊS‰ ÿŒ*ð²ŒDÿ]¢ž0„Úªµ Åm£àt K\Êé`—l·àÄ£¤ ê5ãV0Œ¬-!˜äúaYiõÈpù„=‘¼8p)â¡£0 ·Z³ „›¥|¾$#t…Y¸_£—qÁLBªÉÌý¡eƒÐŒÎ@0g?×£Bm+ Zê1Êú¤ JM ¹¸n; LguMðS·ÒµþWÐ[Tm²J=FƒX8€‰)Žcƒ|ZùÚ²õÎ/7V5Üfs>"`m¦* ØÛuƒÙ56pméÿLáQQÉävTø…È¡v…ΛT¾e”½i–NÚY¯ÚŸ¾†£Ù^š±¾e0Í6TÝiÖÀ¸;,N§’g¥QÛ$ûZ |Uz…â|¦<µ¥É3¶¾æ1¸cvZ…×›~Ž=b*öXƒÕ‰uôÒ›/—PS‹³{ëzïq³áè´13§¬ù ÍeÞF’çd_¶ÑZjlfÿ T…<#ŠUSŽ›F‘›½É:KÙì?h7L-µ¶¦_3÷žÿÝâÍuþ׃nj”–}¹àûº¯ÿúÚ¹¯ûú×]Ôzù¨Ê0f¹‘RV•1þSA@²é“>˜Z¥ÁážïœòóKª¥hÅX­XÖœ§¸ 0 ¡$%~_BY£(BÕKžDüñ”ñ€ï€¶ñdšÓ.és›DpN±Ž(´ÁZ©Ñ"5dª £YF‚ô&ÂxÜE´ÝÀ®“t%˜S ×”aÒžâ ùcOJ2iC J–×áܬ(ó Œø"v)¬}õ.¡ÙµˆþW©ÖŒâºçЬð„4.kBX;ñYGÁs`ÙH<£TqX ã`ÜÂKÓåx÷Ì`'®âyaÖ[Ê«ŠNô3íKÃx¹ú—BÏAY}¹¦ÍÌÎg±Í ýùꬲKb+ãìéK ˆ¿H>áˆä^î¦òÝVjmBi+!·ÞèûrL³©>qhØF¼¾šºó…¿Á[oð×@>üC ûº¯/Îè»p_÷õ^°°NÿÐõ᣷ì3ÁO’µfnŧؠä¨BQɾ'½oäL}¬Rwᔋ‹²WÕ“S¼ž‹Y5ÞÃX`›üçy¡D]Îy˜‹.Ž*‰]€×Ž€­EЇUpx¥`‹1±Ì…ñŒð®/Û0cC&›Þ§º>CÆ+`'3v'à8f³ÕŽ‚Ë”"J¢l· æö‹þЉ@ì“(Ô4 yƲ”ÜWAZ)P™aj;0ϧFC($wEö·$Î[G>±ž‘›Ì•œÛ è$9Ëx8'{ONFóêñ¥gê ê¿®â†Ù·Ù˜„6sþ zünǃ¸Q!—ÊÌ€bé;JM­š'ð»D#÷”èMšL&´ÅÙÅ Ëf~ýÉ×cüœŒà»uxù7,‘ãŠÿÖMž¡×$(Åy`Y©F7"yoè1)âÓþ·º§™#t~xiÓy<ÔàQšºðvPrúPq«Ü›ÍÑÉÕª#…4††Ø•*[tæ:.¬2n;VÀz0ö¢KXAÍʨ~gœ:·^(LØù¨,£ÔHéãtL¦fÂNO}c~—[ÿa*ä#Ëêé2ù‹i‡T„Û™ºB§¨6ï¢ ìk@õBm¯[Õ(µd‹HŠºô]ë¡0»ë­J?6Æ­L”ê9‚ötVÇêb¨1ž´žÊ€]x9¤{T Óþ4àÞÜøF$šÛ_Óù]ã……Ÿ>|KcjÛ¤z=µ¥&>ß\¤/`':B}nù5˜Ë ‘Þ׿ëºÍîë¾þö³â£WóeÇT4Ýñ¦ƒK+t×3QÚ Öß  +'´n«Y…#hËoz×JDÑi©xO‡Žêh E‚ÜåÀÆ^²k÷Ž/ b¢=N¦]R–ÙàÈ©œ”¼|ÊT÷† ô6ÓLTÊM"¬Õ[è,ü[À+¹7TXEŒÒC‰ýúgÕØ©õ§8¯Äx(Q{ªn÷*kQE©‘Å¥¾@)rx}¤êäölO¡ê«‚-ËûÅÓѾ;ü& M½®=[ÈÞýPFºlr+¼ŒtS:ºÖ,5*í°1Äî ÛìsË`ã‰([„hò‰R†TU&ŽÖaùÒ‹FñÓ>ÊD¸¹QjHc¦ª6²ÂTµr"oÞÊå8íô-2EÀ …o©‘ÔŨû/NÆFže¥ä*8âñ¼ÙÂi”¡|ÛbjJT‡“Â/ÃZïA9L­ñ½øô¬Î¾å±Ï&M}#į«Ê\'ò¶ÎfܰVrfãÒMkVï_LA'ΰ¼Ý“S$W=û’ÈüT…¥ŽÚÏ7xÚŠTs",0©rWy¤YVlãÎK1kô¹bÔ%©†óÕÜ+ï(cô`ÎÝ:t à,aBÞŠ«ßƈº@5€Xç½ÉÂî8ƒ|(äÖ—öpò{kÌÖ©øFL‹šNÍLjÍc­rµ qãd_l²oäÙ/¹À¿49Ë?æ¸Ù4¿O¼x‡{“a«ðsHV»ŸÔEÝiSÒUüîÛ¿¯ûúW"•·À}ݘû«¹ÔŸó˜#Ά ¤ï:L™cÁ‰Ñ ÀmÞX…Þq%fõ) IÉ#/"C…úÁûFVZHp'd„¿G¢rt]ÿ^  €€Ó?MȈÚs‘ì%U¤Æâ p!¤Mþ#޲S“„*㵞u}tçt‹ˆg…­;\&õטÐ%Q©.#Riö'\„wDaV”Uôðƒ}¼—#½²$`]Ö6?‹JÜdr6ßyèÞQŒ;t g˜ˆ´Ï;X¦eXŠ"ì5}á‹X‘ñ$µVªú**²Ã)æ]¬iÇl'ƒY±0*]9ÚÐ!ø5ÕíèZ|‚§(XùQ½%ªŽG|ûá½opœ´Œ*L1hDºýçîšš¨-ž¦/müBPºUjQW›Nm ?–ùÙa—¸ä}|Aîñ§]u;0ÖŠƒÂܾe3d`:V’ µS‡âŒÅȆSÞ+¸"]E'” ëZNÝQŒ Ó lø,·‰¢ßõC†Õ“»6UÌ00E‡µ—2…ÐS«UQ¬ª5€£ÙÚæ¬D&ü’ôQЊºkñ%X‘VËßÈž8¬nžK•o]Ã3D¡§å—ï¯2iü㿈ÓÍymJ¡ì1¬ì½“8G{`0ˆ@Ê_žá³/&;¶Ç–”1OÁÿDLÆ0ƒ=Á˜ ÷#34Àâñ±äsWWŒ,ÚóŠí*’•Fä%:ŒëŒ5˜*¦—ß‹ìm}î˜p}Æý¾Ù?Ú¾>R·BçµìIý¼[S©’¶»7, ¬©q5˜Ëg±?Xç+ÆžöâoQÎwNRáûº¯ûº¯ûº¯¼Þ8t¾rN}Xa³ä9,5MKWM¦ÌÍ$ÿ.Ax­æ€•x+¢V2ç*Z’…Ïlö€—4½"Êá•Xð‚‰¨å( @ãÏÆ(Ô=ÌI®;>ÜÏÐ;bÁ6=s¼eˇ(ô C{‚°E°˜1LΙÀÔå,¤ÊU‡ÖŽ•âÏS #&OanãPKq?¢†)vu0 ‹;si"âÅ D~ 5ruJßdÔ¦?ãF0;“ã5Ó”ÁÆ¥¢NWØwÑ8¢›ŠæªwÿÇ'òx<‚n ô‰:. ‘œöºðœ€ìç…óZ}ÚéÈ 6}ZOS8±f–ºŽ¯,újVrèåù”´Šl÷ãi]À²½B¯ü†¹„\üÀ@ÚûîM»%#>®„ƒGM%,Õ#çÕŒø£”“‚µ´ÇªW÷v׈ìr3žÆÇöw:}6§ê „¥mµÏû9hà!<ÒíêÍÊ^åÎÓieo cöŠ/ ï“ö9cT˜4€+|:‹Èýx_¦9AÛø^9—ál„X¼PÛ6/â´T³õ%^ij)ó°üûw¢O¬a±à” £)¥SQA^ô‚$iòwkR[“¾¤˜¯âZ "è¿dC†Xò¸-ìNƲ¶ iµûõ“£ù¢}R?©ÆœJè¦BîN`Bg•=ßX6o=\ÉxW"›R‰•EBªf\PÛƒ·½VÅÑm~ó©}Áª(×Ê?s»ˆåÎÃÞ-CŸJÁr}£9¯ûõÝÉ—Nµ2psë¶ò¢w ó®yâÅŽ—q‹Éö‚õþð&¸Òó–E;Ë}Ý×}Í·è/£÷u_¿wÿ+¿k'Rú€RñÙ¾‡c&\B Ä D›MOLÞ'A0zqÕlÖ› {Ùæù‚ŒÈs,Ét ²×Ôqí`‚ÜÊ€:ë’dJ” cÅGÎç*{Rù¬X°œÈòñЍ­ƒªß¥ÕìW\@mÿú|ǘ6F»ÈÖ}í´kŸ»‡, Tm„dÆVjŸ1 ÆÅƒço:r†tŠŠQ-wp‹êsŽ>†(RoºÅ¥A!T¬ä½  ö+exãfÕï ÌVDgÕvÅ'HjoYr¯¸,¾èºB*ÝΜˆå×ûö¾t»‘$ç•P×û¿ñóÃR&)»zÍ8ß¹wÚeK¹ÄB‚ W„>:º(&KaTíuÛ²ˆÔÌkæà!ãÚÍ·p#*…„ô™-ʼÐÄIØÙˆIí‚Eœ@^«mšlž—_çý!¶—OWëE—Ćé‚J*P¸5™Vb~:׆êퟨž ¼»åB]Š¡géN—Ù—àlLÿrï(æóÜ´L¨µpËõ~a…2™ ½n‘±5ô¼C‡…­}jùŒ}áØA5¥‹¦_û¥J¦fñÖ°²FßhMÀ'.õ—6‚U7Òw<vŠç¬Óù÷¸Ç=îñŸü;éÿüÉô;;Š‚ïDE”ØHeFO§ˆOÒ"·#“Šg¥|ñÿNãÓ¢çccÚuE|$}ÁGTí©ýŒ™b Ý=·._J qC‹)·¡-Û©‰’ÊøD-y–4ì°n|ž}Jpˆ‡ ¨å¦ÌÊ"ªû0@‹UÁˆ[½Ák‹Âú•Œv–I˜Ag‹ápS¥#™r†Ì,$B<˜Î¦,T¤ÓàHÝ:hÔÉ-Ã;6£ÈM¯ò¡^SÒ¡‚áK¹è]cHë… sþ1ÖƒOè´A{*>_¨î)Ë‹¯æ•+›£# Tz¢VTV•!öÎT`^ˆÉ©+|‚‹Àöׯü!´%º³ Ѝ·Óò,Á¶(@>ˢ߻ô$T!+ÓŸ/Ww—}h.¬¦Ä³Z‘e­Î# ëúöò¾ I”áèÜB’‘Oš_Üc9j vÓæš'TÊ9>;4K@6Tí‚wKƒú0‰áýݘâ=îñÏ÷z½Ç?ÿ7}׿øU0d©k/a‚ލV™×;:Rr¡("·µGdKtfI—Žñý‹Øû¾˜'µžL ­„à&èÃ/ mõ<À@½‚Nu’1æÌ†©:B‹ßrÓÃS6g#hëK±ùÐŽ´êQ¼õdÀ¨ÅÓ¤ÔÌ©NEŽd_)ñ)ö²5E _ÍbÍ%¢íðÔÏKå…¼´cÇ#ç{iõ¡¤Öm‡d¢wVÂb«ëñ$fi-i¥;ø"Gƒ$V©Û§›“:?îA¥.s>½Tu,㔄þà…'8þüLˆ† ŸïÑëæ÷8Eý9‹ËzÒ;’À$=_qrQTJ|·Í¼½·Û …èʱ‰¼ŒŽ)œŸg€±Ðeˆ“Í}µ×²ØÒa’õœ.a>#U¿nE¶GÈ}›º-+•ݼ»Û}ñiýІ6¦Rš>§›í±LZéÀ ä­t‚ûÐlÐgºYnSc¹N¹9d€ ƒ´™>Ê͵‘Ù@âF ÷@†I+%A Lž–¥ ¶]‰Ú ©Dðw²’”ÝD8õßÖ™*’~ü‚än²¶&næ ‡NLöHÉi­®³Óû™°~ˆ[8at1̼§a5s±qÍKªÛ€XÄûh@u: àœî ƒûëæ<ë¡P`É×}¸dP ¼QÄ}ÛŸTCÿê>÷>ÁÞ!Èu7@ë'ðÀÙâVȶªºÕ”pVèÚh%l¯•{{ÑߪÀ_ð…lb[,¯?wË·Ñ=þ™(ê=sïñ·zÕŸ£ÿãÿäWÅÓ©’C™ö³@-B)2š=zê=\fËŠ±Mõ»ô)À «ž}8íà—^6΂ÁQiðëæçéÉÊ–ö¤ðÇ œ…ìà)‹9ÅÅIØaf´LG¬%ïç4@÷Ø…è‰Såg‹ò³!íJ=Å(v¬bû">€°-êuZKŸ:2wÒÜë.Z+5k-ò¤p-itÚAÞúNƒåËãÚz\Þ4çCqþy¤Å8—*¿@5WHYnÏEJU:¤öŠU|@´ÕTÃÍ*÷œ¡%ŽA‚•ZZ±4)PqV ƒ¸Zz”æ¢Æã®eÍKK¢‹bô u-K¦XÑ[ÐhŽ5ÌÓ¸ <ÇÜ“îS«^·Tij·¤è(ô=5IÀLüÒfÄýÍb»Ë®îKYVºÈP Jtx¹9Ÿ a™ÍYQSem‹høÈ 3UÂg(~'eçW‘yßfß”3…AÈ ¹Š žöŠãµ2Öœj¡ÂÍ™\ÆPU¹u£=¦…‡ ¨íƒSÌ“ªÎJçŠ5üèuúÓ†E…6Sª,W#àxšdZÀ~Ì\#ZmÏF‹ï&í<‰€2Êo ayïÓÞHÞ$ Œ8jSà…°:sÌLßèÕ!þTá˜;Tëi¾õEÈP_—Uù‘ø}¸ÐëýÜß Y$óÉ”<œoÞr S:3TÒ ùJób§šÞ‰ÏDVóÐ+‡*¬ØÓ±°­›Ä­ ›ƒpŸõ‰ç~çYJˆcqzÝb’>ÚŠàûhÂ?TýCþý`÷7€zT½Ç=þ+âo»p~%ÉÔ'Nˆä@"/²ÂV3vä%篓㛼È;¹%|ɽŽêβ8MŸ8eýSb_[æCÌAJÈ8€ãoB4¹¥6tçM¡Þg¬ˆ¿‡Þlèe£e¦A(,Éû.° Ááú-<§lP É3g’^ëI^h-ÔN+µ™&g;>ì%’ÎËóÂr5h¾ždApV‘¼ydêq™QþàI{‡ ðÙ,¶lÍå¡- ­Û¢öÑùDd\)2ɘ<¤(6:“ä¯o„X HÒI‹:Cu© ¨‚Ã1'*ƒ¯ "ænJ’hâêÖ©ÒõŒ—:Y⺦Úeª(@> 2º¯7uKo€~™¼d¦Ü'bÄB ªºbØÙÞaÐ@mÒ†þª¢!6B l »ý?Sa5#™™Œ,O¬ƒÆH1‚b˜;Ö)qçÈ7¤¢Í‚mH›ô‘€IÈ…ë9>ÊÁGÈu‰O¯kn MªS°Cö‚éhƒb´äe––¬Ôï—$W¾yóDø.õ4ºGZߢt7b¾c÷ð;ô¿C?7&S.ŠsGâqšW@¢_›òtB7+y) ¹$Pî`BŠw ŽˆuïJ}„ ¦b9D”·5ˆÔïAwÁ IDAT ·M«)¿ÍïD CZ£Õ´îæ2N½Ä3ÎŒ‹åWºY1øœål¢)ÌË` orÈaÉ@`Ç2÷S{)“_9n¥%s~oØ%´r¦¦5£7¶>–8‚dD‡SITÞêúëþã ¿‚ÈÆ}íôWÝãÿq7ÜãŸ5ø7ÓÿùAú?·O´_cZ§ :õdGKA…´°èO÷Ýþ<Jãꪩ²”I€4%(cºßÕ–æH¨ÔW¯ß¢JšHȨˮx¿GdÂ/” õ€T0 ¼ÊE(ö^BUÅ¿¤&ÿu»T%L%êÙò·äœæª\]|°«á½˜­n`üId@Ôª$ÉhY‘­8<ŒÅO,ë11Ù+ªšÐì9 ôÅ ¨X¿AÆH@Bl`î®ß Éé\`%)†ÁÂ.¢Øv žëŽ9ûë6ê$DYÏŒñ9ÿÀßO@Ü8`îq{Üã÷ømãÒáó+4×#"I¼¢s BÉNÊf_<Û ¤2ë!ÙZ ôOÝg*¼<¦ˆ¬±d«[¤*Ú˜¹ð(<}f(ð‹ ×)œ.*K&u ݧöÇ~e“›Ôçx0°ˆ˜ÑD‰^FᬿÄÂÕU(FåÁV:Ëîò.¯…è±è{½š‡ €8]=zúÏŒx#R¹ZÀð¯òe¾€?ØL‰·/«b>_Οè[â¬~D=bÆjŠÔ×®V5¤{Høa©œeA¡˜Ü™žÕ¾×^{ò40W²Ã ÄÌÞÊQ险‚”¦ÙH>„jP¬Ü8©  ÿ±ó#}ozðKþø0FAÙÊP5LbS”—¡ò´„„€™·¶ OÑd°<ô$¸`…h8'Q “¬¢^<]߫Π‹²ˆ@%—Ä|åzYàÁá€àŠ´yå$}Ä­ž J癩c(]pg{Àø õžlwʼn~£Kù‘VŰØ!ÁeÑh¼~Ð`Ö:[¤üâÖÚJ›7B³gA‘0¶]ò»˜ªÌ8ñEÔih.±yÛù4‚†µàõÞ—y»!:ëdŽÈ°Ê‚D¬tPqˆ¾ùm-ˆRgª¸˜ï(nï“E¨ía’`éñYG'ë«_«þ$ß ƒþmvÖǵ•y–ŒWÚ}´ lçäÚeƒBWI‘P7)›­rÖoö¤Ptœæm^°˜¾”WflÃx<ÛŒõà eΫѪ¶V wAu(çõ&Ì€¦ä®þöÒÀoGwn™•{Üã÷øsöÿß¿¯ã·]ÿšýJPR »ÑD$ְÊM•©j ÓÆØsH“UPÐ$„Ç>Þ÷ňža0ÛÄŠeF¶Žr¨ð OT,Ÿxa nDžÝ|¤Ü(^»¡D` ‰¢'û›•Ȭ4´G½ÙŽ::¤[Õ î~»åôT¬ãMðDFŽÅRYtDF • JFT«â„,ø|Y³âÍåÇ [4 ,¹Xw’Ar³sHôk*" ~f'— 8М/žØ+-P#qØ™úN¯ŒÌ×|¨ú¡¨P”ÁA„³xÆ­3µ- KÐÈݼB-Â!»ã]ÿ8t?žÙp ™jòJA¬tÒ“„ªÌëÂå­Àá@^êaaÈ? qšT½c(I¨®†‡hñzbÏ€#dQ”â¢Mгr!}w`Ún1=ùS•¥2×¾PÙ6D•-/;pìðb%Fu2땋‰„–8b"b+kJ/D[Jš‹‘{{óÚ|hƒê‹+°:ÆÛ×=+Ìúoú÷»$Zúè;58ÆOFÙ¾D™|õ>©áL=õEÐr'Ü%Phš€]G¬…âëÐüÑîc;Pªj^¬]C€r‘Ó‰ß@À6Ä‘a°÷™“$Rœ,€R¹š:O ±hÍ–Íù#Éœî^¸ÝKíw»o‘¸Çãñz[±µ÷êËF©Ê`+d_õÑÍïü¾½;¶IG9âÔãF7ìÀ×iUìNÁ=y÷‘ý$û¦D~c‰ø«P«[pý'D•÷¬¼Ç?aüiS”Ûkç·^÷Ë¿†fð#؂ðPXŸ‰Å ?,JÐÁ³J@Ôdrë}tàT|Gê FzØé˜lÄRéÆ0Re_à w2ÄfB1èÆ‰I¨ÎÙ¨²ú°ìµ˜T›;žfëŠ;ZûZÏ©¨Ë QN˜¨Iò¥Œäe•±L!þGAªå¡ô :åz$ÁqF÷N•éø.“GášY¬–}ýò3. øëš¸wÊÑžxˆ¨Uý“1F­¼nŒ˜ogS5˯ÿ|Òiôûͧ§±™søðý°i¿â½dA––Gc«”Pd-n•è {Œr+hÝÉ0ñ€,œÒÝ»;´RÞI•y¿¬ÍÖ…öjP)m) p²h¶¦ùÀ/¨ +ê<ßo^‰ êJˆw nÍW ›æzÝ &­æ©±ã®C=-ÉãŽrÒøyȽ7Ì¨Ú Ó¡›P±'ÀÑŠÕ³Ä)#Ó©ªýT0,[°óÛ††Î•0Í|lqR_Ì8ÛÑ-UóP¾G¶§Ü=ìg‘Œ#f7&”U𵽩åúℨ.T>ºW٠Ʀ6¢­ °Ä¥¾µˆ&‚ îI‰A(¨ÀTl¬ÚVàóà¡a4{Ë&Cœ¢-o“ðœr¦ìÖ]wØ•Ïß³v>·öí»¸fE².b×͈C=×ö¨DýIAo¨îckéæ;U¡}H%•ÿͬžWþ v M&ÚõŽù0±>DÔŸ'Z†/3_YøWõ“E¬:Éþ&"?7Îz{Üãïóo»OÿªxД' ˆy§ÎjºÔT*Ãd·‚¤Ì'ô—JIGœAû]NÆáëçO‡øToFvmÉyØ(ÿt®Ì ¦šâòêãWs’ªEžz±—’Ï03ú€.£Nª¯ЮDkicÏ‘ ò1;§×T¾ªø¦ã¾¾8ê°_ÔÌK©ÎàAo3î<î­YÑKÂgµŽQžèíìP¿ãå&1¹-&^­t}„ôå†3÷NŠ4+Q)M©?y™N„ä%Ęy"­9näY)öa ‚Ð|è`Lü”Ñk»`0ˆN¼Â¶‚ñHcXÛ¹$¡©¯»~ÝKG-³§ ò]%Ê2¾O‡|¹’-!´YNq'ŠùóÕÛA'8ƒ¸Êî4˜ ‹Æl”È7m#™T×$yžQÓOœSê­UñeRìEÇ[˜©×`1¬¯ß÷+ЕO°ò8­þ–áùaBӸ塿ôj¬‡ý?aÿCË­ ˘­‹<ØèQOEt¾AmFð³?4KôÒa¦hõ%¢šh×,¥k­ ½ù*“àá;È$Äþ¼@‡êDJØ·Eù« åla¬A €˜aèNÔÞÖ‚?)`ÛEãšEòªӖЏá¡Äð”6›gšÈÜ®á³('5‡þlùBm!³Y)8fEu­ÜÃÂt]±ØÈÄ¡; ›u~­HÅæm¯‹áÇàFBêtš$1d‹Â™™¿ÿvÐt<þl}óܼö{Üã÷¸ÇœðÖ¦Ë?sB^­¡ÿJ°æðñ¤JQ(ÔÌ…ó­bTçµp(ÖšðïøŠÇ>ú¢©>Æ*!e9—UÈ–¦y¼ÿ«”ƒ¯¯~Ú5N¦¹Òó‰Ø ’JS #rY‘aoyM”æ~™<«ô3›–öèIT˜w’ðž޶Ö6Ž¢Ë@ƨQ»p689ŽJ_0Qó`1@ÿ9×H8Ðôî]熼}ºÃÚ¬¯ÙRwÔZó€¨}VÙ½êgÁ:iV©dš;¦> è°ò154ÑÅ×>ó̧ õ–BêÍ+N×ltÒÒñ…3•4b›6¡NøM…±~~ÿŒh¢M0G>ظk´†Ÿ)ö8^¢°þf†t•å^¼K\i6Öa¨U·ŸfŠØ‘âÉKÍÉŒàûŽZ õTEÄoèâï›5»9ÿgÍ:Ô«„&ýc¼ñ³„ßE×K¥~Ä}f3ŸûØÐb\§ÜùÓ3„ñé]±Nݯ¿Â4«‰;í5?žÿËMLfê8cï˜Æð`¸Ž,,Ðp\Ù(.þÑ_ÊÌm[“ø^GºÇ=þóXç½îqKç/®ÿíp.áJàôËJÆN¯u·§[}«Lø„2{ï¥ F`{e“0×t,a%3oÄÿKZxÕþ‡ .#]_ ©¼Å¿FĬÁF3Û…exTåo¨Š%¦O¨6<”3Â1[¶ßcLÐ44¿†›ãaä«:q«H(C£)J')Ô;0ʇ-j!Rµ?J"Gù~(„N­f8åã €{„"ê•c/ÑòâW)ˆ>Û &÷FÕad‡[I|ès„h¤œë1E |—ÚÉ:y˜ Ö<¤~©Á…Nj'e>ñÙ‘ø­L±ÚˆðU6¨ V0#äzXeNyËt¿ WÂ&#š¨‹±‹æŸÍjEt…X§EÑ!9%mëü"uèÛYäx2v9X¼þêH,Ê›Ó&ëØŒ7šU–Ž›c‰Iº=ÏiiUâ ùå1æ!\ý¦Ç‘¬THx¤øõ9%Yî4гþÄc½`$È OO_œÀ–Ü ûÆ_¤(·ó‚ŒÃoI„öd²Gšo0IÕn©ÐÅí4» ‰î¬D#Ý·¨ã{ ïBà"Ž–»‚ïýþ¤ 0Ù‚I§K‰ø ˪ÄK¬.˜©ØzÑãb鎭JØN‡òí¬ðk,?h3é‘­ Å…^¨°Ú±f†NI —<Úvf5Ú]‹ÕÌÔ7Îͳ؃ŒQdµRÖP;x.vÓìaí{³ÜÍÂÃo„~ÜW¶²”š¶$YH;‘ VáÖŒ.Óã ¾wüysé÷øAŸ÷¸Ç=v²äïÿ“\ž¿Â«Îü.ÄôF‘'Ô¥ÏmœWF.¡Or¼ªYе?´òM±ƒ¿äÎ3IV¦¾Íd„™žf0Ði³Í×b¯Hh,¦È*ßfnmd,«aij’1q"¼´µ´‡nº1Ï +tuF°&ˆÆ¡h«ÃñLMk° I\TZ%óT­$KJë™Î d"µGÏš ÎîÖ~w2=ÐÔVjœž·tìÚz‘Øó=ža_•ŠWË耴F{í§½QÓ)CSwŠšÈU`Ë­ ³ó{N&‹ Mž2Øó&¨ºS`H¯5¥ß0} x4:ÜlG€×Ÿ“Š­ìÍÍžïîQ “No*mD¡5áý„Í }ò˜ nð¹81ª¥}•(ŽeNI/´zSJnè, ‡Ïבh×ï2 c!³5‰1§…ÐK~†µ@ÛÑÞ4e¦+à6ÙÎ@÷É]å8tYE53͈ ïkp:)”dhŤ…"’:æ‰]™‹Áv¡B±­z–™ñeFwºý&´.Äi¯†ÉqáRÈ»ì?è+÷¸˜q²9‰ìŠÑ-èïmòAQNÌ|ˆØpää n˵‘Qm¸óGukÒ¯¿ôúKÍN½½¡â‡[˜(ó…EÄÔò"B¡']e,mâØÛX…æ N6ñÒh.Œ”ö(ù… B©mw»Þ! g*´FÑ>Í‘6w›lп—Ýxo¶riÕ6gqš?;К޻«÷ Ù®´æ …io1œ­—ŸÃŸ‰GîWyo ô=îq{üçǾ¿ÛUýŸ=[«‹ƒý:©¬5âëI5—AìÊà * y9lqø&óF ª>fÄÐ: 3|o¤Ö‚öîϨÞþӼ؎ï×9*y§4¼{ž§]*6ƦùÝŠb²h©­â36Q*73³çWéñ¬Ñ ?]m²ÏÔ„sÖÄ6«!7"Hâ&È•¬óawzAul—±W›9zî.7¶ Ð|þ{ ⣖únÞEij¶:²c%)C8·ªjqîÐÂiJIwyáÃ}¹4ºP„³¯ó¡mL–S¤³{©þôx©ªß•œ¹?é$‡vàNTà‘Üêš#ú契ÕÉ`/“§xHYm¿¢òBÞ‰ü ÁÓÂI ’ rðT.®$kñ°Ë+hQ9 Lº_ð;¡ô'j(WucÆ ÆèB³È»@A€Â‹¢Wä÷Rþ»˜z%ýô±Ô•=³Ã‚MªB))-+¢gló>t|?è–Ñ“×1›iäèkÕƒJª/\2ãr«š<›§ˆ8}ó´ëéL9¢¸Ò7X ßŸ»ŽÎ ÂO†ÍSž°Ó:^ù½ÿŽ„—¾¢¹aðJu¡ÿTîº,Ÿï†öóŒ-ÐAqñ`ñJ@ó,ðñ;¾Ç=îqmK»Ç=î±›vüöš÷§ÿ²d™DŠFGkpäÌŸlÓx«À±å$Ççá©?€¥º‡{‡LSÊ ˆ´ÎŠJ3I²àƒ¥kOÍ'±…uîÜáJ뿦6âíPPNs6"¶aMÑ„sd.Ÿ}¡avsÌ~iZÒ§Óþ­N¶!­ê‚Wê??øÂVáÂ@.ÿ0hOÁ‹ä®¼Ú¾ÕÌùj&8³ Šé®ýc˜…Gÿ“1uF£& µé%:P‘VÚÓìiöNqùv’ÉmTd²(éÞÉ­2ýÅË(düTs{/+šf:Ï9ÿ¶oøù¤[Mq0j|ååà ' s€ýô?Ê'dv‰ð/ƒÞ¨ÃMSÏo¢º61å 6ÒC ,2k8Ë?t"ÑykŽzJ4EXF@ÁfH“5“-ú`A`ÚCE^ÄÌÛ‰{g„Ú˜íôý£b‘W£ÈÇ…}ësGzÕ8 õè/ÔÏŸy¸Œ §Î®¦Çüݺñ(mÑi6ÊWϵl4{ËŸãgÐRË““-FD¦1™_£`²‰§vŠlkâ Sô„’æ/ÇLjï •Ð:=OéæÈ¨—Ôÿ»E~~}¾ñxœUñFÆ·r5XŽrD;ÚZÜ)¸éR„¹%»+^ËÚ7û)76„Þ(çÌÓ÷•0èO£{h,Íqø(¥ÜT‡¸×ûšv6fÁ·iãýÅqí4 ‹Ñ7¶hS­3Ë¿¹Â § Ä¢fŒ.Á¸ô¥¼þ på4»ïq{ü)ãVºÇ|à7¬©Íµ¶i!ð‹:?F8hÆba€Ep#ö ¬‡Mñˆ#.x71óZ:þ‡/˜)r%k•ÁúìuûŒè[ïWæ ‰»$ì~]ÈÓ€ÀÙ  IGheà¢é¶Ðß5#FhúXl*ÓkEI•Qܹ“c'ÔÌéx0R°™âxŒùE\šD7͇+xÍäzšˆÉÏ—üÞ¯ûPhAÌ~Œ[äwŽÂBÙ©,Ï}€b•¶žcq¡í§NϾ2ô…ÁòQîâ«}{{˜ïŠŠ¨#¢½M&„¥Bï=íAAÌÕ)ˆë¿ö —h ”PÛi/% ­Ö÷y„©Þ¨n¾yò/G}T:{ÀK¼ßh‡žŒt‚,i’ÐúøVját6GŸ-+æƒAéh Ÿ¶uëþðf·ùD—«$vv¥Ô>€Ód‚§¥ÛSüÊûj›}ϰ¾“EÒšõ–‚Ü"<’ÂqèñâG©{¼{ÄpüuŠuz Oã­§Ê ¸Ü³ƒ¥‚}HæÇzŒú)3]ÁߥdøÌÞ-c¾FXkYK¼œÔ¢lë{fýk"RŒi1³ÐG,PAdBl¥Súœˆ ÝÓº×Ý{ö‰0}êaÊÇDùJ6tm‡ÍOZk1ç; V-´¡QBÉ&\îÉ5Ó4Ùq×ü¢Š¬ªÞ¿C.ú90Ä­8ÿG0ªð¢x%½Çéð±¼4&onï j‚u]°[‡Óq==_ž«*ÎøsÞqù½oŠìÿ&ÐåÆ2ïqß1øÛVî=îñÏ\ø¡%µüä_á€ó–¡g¦Ì³¦Ù,X!3Šd Š`æÉ‘¬Í‚ì\H§óš=i³ìÁ&äUéS,ÁYFH®ä€è~–uçâNB'3èöÏÁ^)ênÏ›, æqdUIb,Iæ~Ha§?„œ­](YðÑ+éogáT×S]¯Y\LMÇ.†²AñÅîpÍ4¤SÏh‘w<ÀÇ`‰ÉB*Œä•ª/´eœG(Ük•ì6v->ˆmÏb"uùíˆXä“ùB–Q08†ÿ]ßE冣ÌC$opdŒõ|ƒ¦ant§ËÃÙäÏ%!tŽ"öÔâéëÓý&Ì bw4M :-”ÚuÿÄ”¶ˆCcKÜZCƒÓn<ù`tÑAxtÛ¯’W^Vw°Úª±r†ŒéLÅ6“®hR NwM¶ßYRµ›TÞ³X›úÏì´Ì=èJÖX»wú`ÁÿF%\»5­~³nÒó‚-\ݸ«P¿XƒãT¹jݼ¼Ç”âa: §“~žöP²RÒá÷ *ͪýIß),±ÙqÓ ù÷¸Ç‡›ð=îñ/¿É`ó»ö?ó—÷ïµóQ»Œz 5ÝxºßïB V]ûÒ®ž3s^BÄ—|:_4áG*?ðdgd0Ŷ*,,hoNEÑ-ùúGdI£ã³[¤Žx«Ï[MJ“Œ5‚€¨O›dR“°7Ì«‚Hw”öN¸Û™ Yîáp¡ËUˆL°BLÓ öE©¯ ÿáÓìÊuÅ•µ>Ê̦iïQ•y2KxôßC-ÝËPDÄÊÓ&òþXqœrý,‹4u–?èæF4-SzÚ‹ÑÞ(ÿ³Ù½>û´H™iqÖt^çþ'„½"§v‰¨XZdª¤˜W}ÊÜ*¸)š6X.ƒYÀÇÏßöÄÎÿM)°I&Á“§ÿ„Ó ª‚³• M„îó«›Â!#YöFÃ=|3PÚQÿüý¾RÇLhSÊcm&‰è¬“p(–%椎 W„¨x"«¤C™Ân'Yk ›õbq¢ü$¾lÉÇŠŸiE”-ZzsrµP;â1^úŸÑf³ÉבîÁ†bR}a¼žú#jd Vödô½€0]ÐpG‹Â{.×Í«hX4å•éÓx¶[ÿ9yÕP¿ãv°_kàÄô¦Ê©¸.„Ö–šŠÑKÄ ¨ hͶø¯‡ÍÑš÷–~ÁúNPħûgßövAìîœëY7`¦Ð1ÓæïO¥mÅ ¿¿®þbxEZç¤%Ó¼Ô*ÑÙ˜3¹ÎŸ7õ Ê®”ùVwŽùëä/r<ëϯ0›?Ñ‹â_€Ý˜ð?z`÷ä¹Ç=þÍ«àG~çû28¿¬AÆMÙ̊ܬȋwâ]`ìùÔ¦ÄÄ­ÀèµD­8‰%è–l‘ë¯ßy$œ×ž©ow Š0–n`Ó5¡.iÏwÍ ™$§'N…ˆ> ì5(=—&¸ÃƒúÉÓ¥(ÐD–òLêCB@êú•¨Kúrr\-ɉIéÌ9¢•A|É÷°?é¬e)´8²©ÿO¥{ eR1ßûýžˆ*ûèŸBG>…ðô:*þ™3ª¨—¯xÍ´ÄÄ,ÕˆìYj¹`S*ü‘9ÎBï  íe^„ÙIâÅ¿Ÿ!ùz‰µÀs0ß'Ì”cVäïºÉOüêxAÕNñ€éd4œ Å¡c¦ÅŽé“öˆ§UóÊÀ£Oô=·Yä[/YDtIi7sãñ’ýá!dz@€Lj‚—͇Rþ¸ïˆ IDAT‘ƒ~ãõu`q^$ö1¢è9vx×FDxT¨#ó!ªË:;ÃÒÎë«›8ÄUÜÏ&™•¨;j=äßÔ"Q§H ì‘Ü”ÍYJFBhøìHR^‘ÓΧ '-IôUv¨[îÒNö}?°Ñƶ>ºþ­‚ý]Þ+VÛNì¾'iY§¬zŒK+/ÞqÒ½l*jç1ôØ#W/®±4ÎíW´†RA­ó7¾ˆv1ÕÀcÁc¢åÕI§Ÿ } Q/C\* ï5'iV¥×Ã6ÊŒ `ôÞh Cw œÕ—+ÆŽz>¶ôfyqÿâ¨@æÓ™¿ÎÕÌÁöYxõ¸+å¿ã{ÜãÿåÍðÒ?}¼[þÊ1 Ê…ÕkÄã„èN=ó © ©|’U>wU¯sc+ÉžÔôº™Ä”~œ˜£LD GUF Y€²h»’äßÇ £ôÐOzøŒ.Œ|[Æt7´ò2KÖ´œ”b`TdÒê"Š—Qv«xTê8†icMßl!5î‘ÔrøQŒ‚ 'J`œÿÀ®Yh£ïblä£U£ËiªÀk(9ð”qO_ËØÈbNxÚ²NŽ5¤ô;ßdþO½J'bëÐ%±|à„W-ƒf®¹ýÇ·œ¸Òûù<t“B]¿Q,·x@eEŸëšF–2Ex.9^€ÃõÑãAl½Þc°×çI(Þi„à*Ix8}k_ bÃÊQÂG©Œ0˜ÈÈhÕ㽇<ÃÂñ&ˆÂwÁ¾’¤ˆfz/ýi«Û6J} `ËemkCÜc¢W¿ƒÅ–|x‚ZÔ(g6£O÷ä§±±ÓŠtr]j0[–q½o5±©:"6œÆ‘žå­m¡ ž kydg§À)ԙ嶺wÔÕ¸ž(~¥ð®P_„¾Æ‹mP¤YBÁn6V“!­‹ÂþÕ1ÇQùרo°-Î ßÛã¬H;XlC´®5‡SˆÈ1vGÿ|µT¦RœlDι€ý,Âh±œ›‘ûœÈ ªô$i™"ï›L媮)ŽJN¡5ïm¶!‰5ç²úCpx}ʺ %”}#nßúŒ:÷ÒîÍ­OÞÊ2¸×^4þùi•÷ÙCbY>? ßiüúA¬E…wgÇó¾P5£x½Vz¿ˆy7Üã¿<ÿÿWEûU™­• G¯SáVÚ˜?ckS8PŸ“—VpD‰‰È³ô&ŸŽø6%d¡ƒW'î…²&¸« ñgóGþr>m"Ç1ÉG´úé>ù¡°˜SVž™Ìè5 ŸPªLGàãðRÍŠCÚ…«ØŒ øð†ºÈ-P˜Ëss•Ü ©"%V#e7Á Ð)±6þE›Ñ¤ûÜwéèé”ÜEÄ IT˜‰Iq»V¤êc”“ Ѷ¡ŸsûB4^¦£iº¶¡jëšç˜Ó@g,UkŠü1£í,àüî!€‡æ>f ’:'ØTúèsç½Ù²ÃA)çí³&6¥KƨЪQGø„—ŽÑÍ89söÅP38šíRÃOöÉ3—o¹ý>ež2Fë˜?HÕ}çšËJ­~J)rnÃmVê܉>’=´ÆB™™‹i–`Ðõk…+$[ÛF8v7„¯÷—Î+( ™d†É¾Å*`áiÂËÀÌìy˜ñV0/$Hâ§Œé™×Ç÷ÄÞg“*3e³ Lg“ì›êפriÍJzƒSL]oÁ*Ê£Ÿ•‡ër`GÖäV.IWx,…œ»ˆU˜ØèŠøÎ$à²bÇ ½ühD®ƒÛ[D&¼Œ¥WÀÃÇÈdŒ(-l«'2‘VY¥ yyÝþ}±&`¨÷tÿŠà`S°™È‰þ]?Ã¥šE?U8dß+® [œ,ë(>ŸZ¬Óù€ËBÑ3¡!¢atšæÇ<|˜ýÏrÑK IyÖ°*e™©a c{ëã3~EÅLPöO‹®5¹úЋ£§(K5%aDz¸¥$ë j~çêÛƒn~¡Æ§ô/@Þ|-ÈŒ§û{gÔ›JR–ÍÜúç °0WHkm–"ÁT˜ñ¼Ñ šCÛ)[b†kË,a} +CÙ-"¼CaF+G^³MPcúÑDÆ.ñ3xG¬0¸—¬^ØEØq:,°rå`”Ú5¸Æ¦·zî6³âS+­¾)o­î=8Q[ë­*‚lL-­ùù¨YÄ>HûœÝŸ-•{‡nÌ-8‡RY.F€"R¯Ò…è'Ì Ä]a»¢,½ï{îU އµ‚R{Ös,dz”ÁäTæ:":_x°ÆïjqAµó®o¶¼ÜVìkç‡ü|»ÞÁ”ÏÀÍ‘Xü½&]¼qf2&øÝu.·}öÿЃCðçU_s®Þ;~îÏéqxS÷ĠþeÖ’”pÊK¼ßÚ=îñ›Æ7;¥~a>,Ë&ŸãŸXQÇwðRÑRYÈœA(¡sŠØ%áì((ÿXqƼP‹:¡$Ïz3’~ᆾ? >p °v¡7Ò=ê0šc9H(ŸƒRAI¯àT‰A¯ÏÛ%E‰q¬ÎþHf¸x6¶l~Œü©W³«\‡|ã,6Åt¤H¶À¶nX¦°€°™œGÈ!bÊ_ñ2~'`ˆ <‰ö>ý–xDÍNkVä Az¹¡É‰¹åÕÁÕÑEŸï¥ýðº=´?,W­*œ Ö*éœc½«õO–Á%°R3OàwóéPvèÍТX„/½.#Ïë”ñíˆˉç$ KˆÏkx2L¶ªÂš„,?d¹E$¨Å·žPm^htíèþ|:‹&wmRUÓÒ°K VsBv;sg:m¤.Ê °è¶y]‹PUVœ¡ŸªØÛɯ7,‘‰†;Ýü P;8€;4·š°"´N:;3Щ¾§éDE‘Ê? ­’Áâ4F¬`ñ:4 \¦âë72RÄRºÜ<÷»Œ»H¢E£o¸å_me9«;S, Q¹™éꃢ^eµf³ƒ•‚Ÿ(oÖ«—€~ý6¿€d7ÑÚÒ…Çh¼š ýkÜCÓ‰6ûåøÙ…r€V-±ê†=_Šßu+3–ýÒ׫¬¤?Ó–¸l*‚>ƒ8|Ξ7w-¢óª Pì2ýy7¸©çi£ DGñÌk¬ÜçÔØª{ÒüŠ76‰Ñ«œ%dµ›ÿg¼–{Üã÷ø/ìœCsï¯z éð"FÀ/Tm¸äö‹ŽQû»»T!0ªàKò¸7§3¾õ˜\Õ¡ŠP-í]Å婹ArEè|1†`£T•hy8ÞãõˆôÙŠ^ú•y>ûxγAƒ~QbŒ®‚hj@„O“__ÌÄj\TÈݽ?ŽŸÀ Oñm7Zõ©­•åÎÅYH,J‚ â¼g,°1ÊÈâô½U¢W€…{>dþ¹Ù –ùœÓë!aUqbèowëèa%ó/’-P c'œ3·£ˆ{ÊùDŸï…ð°“ÎV¡@iPºùAâæñFñaÏJ•>ZAmVJ8Jßi#FÆjâ^V&ÂÇg!Û”®0>|Æ­Ø_SÖac}Ñvæ¿]²éÁ@Þ§DGQÚ©Ø.ùPò±àp¸pû’«t¶0·ô–6f¢€ÚZìb…žc@žœÀÚ•0ƒ•DwÔ„ˆI¿c&Ž•vî@*sTÅ|ÿ˜Ï†–NÝ–s8âèÔÞ̈|’] &m¹\‰µ˜ã8›åâœ.¼©gK5`¡s6¶È›qÛ^3P¯Òƒñ9£¿ôù_õ:ØÄ˜0Åfâ Vi9†Iù¶=Z-îŸ\ÁŽžf5fSö€Vœ—I:@\)"·I´óROÆ×;Ñï »èÖ¯“mÔRJEUB l”%ÜTi—•ŽÌåéh)&ìÖ8c²©§nÛòR}íÎoM8ôSØ«æõ×váî¯ðê¹ü>›¿ ÷¸«G9Rú=ð“V¾ü¸yâÿJ,òn¸Ç=þÌ=s˸åù+QèÕÀÕRNÌÄ.Hò$)<(p#—\{Ù!zðÄJPH;4 ìèô$ dþu@å5ì®!* rì œÕ«éI…¥jõfôD¬šèŽêˆ†Æ²ßÁ°ˆ&­ì€ÊFf—§ÎTtŒ°("Ÿ OªÌÔTÌɰ—‹é`ú6 ¼ùH¬íd³Qô[á^Ðö0{ ×?vÕUí+:ˆ‰eÌUeªÐÊùï,âTãkn<ßoð¢mÕä–TèËæV§n‚„‚”|Ù„Ó+C™“°àµëeÓ//eͲ({ìaô“Š FƒŒCUvÙÿ‰Â¦³$‘õª"ow·S½!Œp%*v×dQÜÜaÑ‘÷¡P›m)–¥·;!ˆ¡"»%²ÁfÉoÜ«H±”§×dŠ”Í ·ËNgÓd»*Er"Œû?¹™¶f¹b4›t‚‰$sñ*nöqÁ¬¹¹³…ו$c}¼ þ8Õ–»!…QÁìW«y|ù#8L÷Ð`qÅ6ÂMü{Âîó A»£úÝ î)å×™¦b= k7v˜ŸÌapö¶éÈ=¼î¡RJ¡B9[Å›«sg‘Ò=k“,{p+snï†")«„8t°x×ë'‚ŽQ¿ýì~~h­°ÝÙLá <_äûµˆ¿D-·>7!{ÁqÇþ¯¢É÷¸Ç=îqrZÑg¼ìéÐ˜Ž±­Ì‹Ed«aÏ+$™‰™™# 9y×yÉi " æ`°©¤s­±'©qN›r©¨ÛÙe]~¨ÂCUDñjûÈ©`¡‰œYœn& zÆbCGòêb)ZÓî{|éžï$Ø&ìœâ€Î'œRžb¬0á¼&Ì›$¾ë‡Ùã¦H¤î?ã‹H2"`倡¿þìfßÓ};Š´ÈYˆzOÝGBlÕZ¥Á ûX@Ѿ’®NDùÙ4V{î|ÞˆJ’ªApü¤=aO¾Š³ÿ©q¸ÇxØ/W $ ¶ Úâß#%6[Å&zjìKxtxA‡c¢q1ub¯.‡ë+?%ƒªd¼Ìy–1ŽR ÃÇnvÏé xév]D#„´õ…²(P™kªNŒyûqˆ,¿f›â÷ævp–}K40™ÈåÝF‚ ÿ´Ü^–Ÿ®êçÌÝ jDz!`ħ.“Zé§éª¡<¨šÂ5'+ŸêpDFùþz¿XŸIêè”-I#šÐ©˜û éì%æç€+¼’e9[ëß$c$kš)i…ü1¾²¡8²°'½¢UÝ5Öttæ¬ÖyË€Ys)C!„ýŸoê_5oy?]\iݸù] DǺEUcÔ(£¬ŠíÛíÎW[ˆR'³ýÏJrÇÖRÝD –‚ù 1@¨‚ú–z~RBS"W?~Iþ¥»šY*W3öë_(Zßãðñn¸Ç=þÌ·ÿk¿ƒÌz|Ü#SŠ{»›ÙÆãíú²ÿ%² s˜ØÃÇ‹H¯‚ËÔŠ$4Ñ$™Á‘¤7¢Ãuê°­6 â²›À=ýÙRUƧO†(且 ÚÅó}|I^°<`á7u@ðp%(ËÚ ‹À>Š8£`IÖˆ¨Z‹’5s›M|‰)ÕdÉXè’Æƒ[ è85!†tf¶¹k8å¥ï¹ñ*<| Ý8tÕ'À`ÖùI Ã©C‚XmŠ”#ûßôu,FO¹B:ïd¸b €´²|…áõÁ²T+ùrß…%˲TïÀÓm (Ӭˠ˜Œdݶ@æåó?e á?ùyÌ–"îQ·–­^¤ƒ|µË­ø˜BÒËÁ†Å…ñp—á$¡}Uˆ] È–ð{¯<)®Ú;[x@™Rå#ö1Ûfª×±ð$ãÞ'X^tÉxiÚ±„7FâÝ3kšÝÑk ñÂB¿4f›«±ëÞþó›(Þ—?v.ün¨¦¬É ™ûó¦É£ñi4q{Üãÿ¹ñýýð«DõW©÷|ë_?°R`§‰RxÊ·¤ÆJR¹žáè”|"˜¬©yÜT¼Teñ͉YSõ×{(7C³Þ¬kæ;ðèÔF‘º°êê¢ $2;¤È¿À“¯ k¼ 䬔(fQ*(+ëk# ¼ÀìKnÅ‚„=­Ñ©€Hò£ös YJ$u†çl=…0ßK,7tã*i' ¼̧Ù(4áY³ÜˆÁ—ï}èîaË,ýdQ|æ¨ÇX”¢¢Ó¸§*,yãABëÀFM„q_"áú>¤RJürŽe±/N(›ïÐ@=\CF*~ÀuH¼K)çtE‰Dö©Kè@éÀ8àoßO@ÝL 7YÔ^ À¯›zÆ<–ãòT©~ N1ýòVɼkçËî>Ö+Fs¾GE5?±(õ—âÄÝ*V#S'¯ïoxô[ ÊA±üâ®lE…¾frØ@öÙ.u'qm6ðü…Ih.ÎùkhG©þ^¸„zTÒÞay\@‡æ(ÒçUh•Jt˜a3n0ë]$£HG¼à¶ èmùü+"_¸·y¤þ³‹0ò QÎ=ÌôB8îJÚé³¼Ú›G‰Ô¥2Û˜øI>1Ójª0‡iÑÍúQNªv Î×˵wøFÍaãMž½úf¦Sÿ±X¿%ý U·ælR”¸8/ãÅ‚|³~2iF Í Oô(w™´ØY×swªŽ®pFàÓ…¯¢Íî"8½1uñûQÛÃû<>.G\|ZÄÖø`¡Ýã˜òn¸Ç=>>κn<\ÿ¨4~áæã ~Áñæ¼1} ’jÑèsûxrù^¦OÏ}Ê?ŠŽBˆ8ú ¥€àˆ“5¼lË Jž¤%í4k$Ÿ¦&µq©;Ï*YSpÐ"!iåJ\¶Ÿ´¡‚ x™¬ƒ2Ѹ@dþ´¬øÖ@x³¢QgYùIÚJ¨„%î“P¢ß;ê²onår,úÊ *AT±s±øcÅbKÖ¼Ó{ß1êLµê¤6©ü K; `C[°¶dAöi]O–[–žKTüôðM-ƒSè­˜Y´ÕY`|ß_ ;r:}SK:MÀŠŠì[ËÖÿ;8`ÿŸg`€Y¶Ô’‰QlÎ%<÷*áÚ$L™ÂÎ^É­âKÿ8±R \‚·lZ1vTw”§ÔU@™ãç_*OæÀcË#Opý¢iS¾lí?…¾\AXö_Üômî'3ýš6aÊ,V™/_M³GÌœ—„D4ñ†p5`& 5¥µ°ÂÂkrJ±rÿô8¢<‘K—ÿÃc7M¼Mk$ Ü [µH»WL@*`ÀêĪ ° J/ž# dF†S˜&ÈlCOó>i¾ ‹Lú3™ŽêD±ª!SA´â’j¥g…ˆ®ÑÛM6â|‘÷ù|Ã÷_04NZñ é`^à‡‘À—ÐÍÐŒŒ|ßwñ°ÐC~¨¢Ó1'^”~­s;„’¨>ö,®À±ïËÀ·Ã'…Ÿ¾{/"¼Ïà]|ß‹W˜÷Æ×”Ê{‡¼LXÂÖ§ŽÊQ«C¢Hoäp’Òº¥Ö“DcÜ€ŹraÒ·£S›á»¼]9¶ôÞ3G2-7ï>Ø‹ñöŶ¸‚ ËR­k®¿ÙÓóåÂRËB}>Ò¢ùÈC©“- «¬²{Õ~Xz€†9Š‚±*ó˜ôYã†ýX©¹Ú¢/lK9º²$gwÑÇWÄ­;Ø7Z¤¤뉿Ï"ŠÝQ*HP(rì‡Åhº$;“>¶vC¢›cÆ­ÇZ{Î$ÀÈx…Ý·ÔT¾™sh"6ËÜÕ§Ê,ÔMÛ‡&ñ/dkœÝõ Üæ/áƒ;nÃ5ÐÍ“e:O¤C‚q‡û*û5†.±Ža`¥€—æ3ÿØ úÛªo¸}û.®›°íÍ”zÛ\á“ì}ðTÛY2Ãeó»0úÀRšlÏæ¢úߤæ_õ•ÝÙÓU`yÑ>\ÄGt÷¸Ç_=nç{Üã;çÉ@ÿçG½»_ãW§ÒÖLÿåiùˆ¹S# ¯øU8„ÝØ£×îÂ~ "Q ÈTêHÄmÜ24ûEÉ'ªÍ¶ UÃDŒéf4!9‹M§@¥ä/E-‘Èw‘RêaÚϤÎpìÉ8Ê-ô”P&iže\̶)C ªîUv¿ùrÑDNÅ\FhÔxDDèá¢Ã/›G 2Ÿ)É|ÿäaöø²ïO;Ü}•ò¿;óîÝÚ9¹áUVȾÁÍéíìF-ÒÒ“¶þùLp¨™t±à@L/>ɧ³ÿYkÊýJ‡ÞÞ°_7ûÕNñ€ýñ%Hå-© Ð'¿/äú|Ãô‡ØË§]Ë §O8QÚGܯª„v÷à½æUiÊa,F¦‚"Î[²ÌpÒõ7Ä$SŸf ’t ÄŸ“:í‚_¼¦‘;KVÌ¥n-”РPc Ëfñ(·»Ök†ô QG$3j¼îN:@9)¬`IÐí2uWgãð1£Àäm9°lÐÆšeCØ`ÔÙÇêKМݭVÿŠïyl¶UæˆhØC]c³h²_^[|§ aŠGˆöË€ ½21>,¹ŒÇs#Ä[«‘F<´&,©mjS@Ï…M÷fv-j~ÅØ)‰afÄuØìÚÅv|‚«U¬X¿Ä%­~˜)‰gÎJ6ë‰píeÉ߃ۭzz7„ÆÏ&¾dÅŠ¿Z[ca(ÈÉc"\¥™Ú¡Bòl_ Þ_{Á:³p…ülª€ýñ0Âþ‡wAèixfàãœB®â…§žë…'öý@Ø ¾Ùáƒé±…ƒÏmÁIÕKô°8¸Š—æäûÏŸ%¯><–aY_øÀ¼^…ÀÇ»†ÂP8.ÏWPˆ,ý*s(»nÙ¸¼ Sæk9Î`n”2)àJ6'ª' ; ~GÙäCjU¼¦˜å/›/#®ã°2yÆÈÐ{1ʬ÷ÃêByþžšÇ.£¢ÞT|KÙ|?‹s]‰¯HfÅįB‘Ýe35k⊪ä|ÔkçØZ1žb¡Yì!{]6Äš†ö¹E3H2Ä>`¹Rr,½¹ÎnÊ6MÔMû|vAíÆÉùû™R6…NԎφŸ~kÿ]©@¬Ìšk@œÍ Y¡/4åž‚6eãþC¯g¡Š¹šE”SJ-ÙLT}™jí`¸#†÷7÷µ IDAT5÷Lä\ +%™~—Èòü–`—xš?¢5÷g¢ƒ\Íž­Mxì,¿‘Ó”³r&ŽïÎÏ{Üã÷¸ÇŸy˜|ó£ð@÷ê_ýZpïG^Il:‚FÝ¡/ÀâÉW#gäQ€†Ý‡È•VIúŠwx"^'æPã*M^åA)¾20Žšª>õEM·\&@‡1x„®)ØÅnÈ«—T¨ø ¤Æ"´Õ'Xyð s6Â"©á Ð”å “ŠHä µ™HU–?lÑ–Õø/€ *¤ÁÙåñõª/Úû{¾Ukñâʽ©¯´2žbýG³Â3:'¿þ°@ç–Ô´(ì¿?ßì×Tuc£BÎêWÌ(^ïô|:=ÍSôÿx,o¡¾È~Gr2>éÝ=]¥!WËŠª K*èñ} z®Pï*ŒK8›s Ø&?’¯r2¡P9£R4bƒBÇò&Ö6’£Á#ª­.óB;¾¥"LÏ‚dý亙£Í ó@¹ß½g¤Â8 z…q4\Τ=­ìzpí\¼À 'Þ# òUhLŠ/ébepw`káö¸ Ë]¢L-kîŠÐtÐý ‰Msm-ËØT~$cÕ°³¥z¼#P˜Ät qã(gqµÕÙ$]¢ÜHÚiÕ2‘èÿB4?CÚ{œaû=_%DËéŽU¹÷o¹{ØÐ©¸&4üBqz1·ß;äkëuá—,Þ¹ÑÙ½_8NC×™‘‚óà>2ÿ>Vîv¡tFœ)xíNÐÀ¦gÖ[iHêï\vÑ~VH¦2ÿä*íÈw"\«ü¦ÁÒøm¿|%Û&v CÕ"–ŽëÉýdÁ,jÒoô¾¨Ó¦EŒ…&œ*B áqFh‰,øˆŠ§!A-oÞ4ô[¢ò{XÛJc7€<•mœ.ÿ×,z¼kfG{‡ßO‹œ’÷sp¶XájH5~ ô©HØ×·ðTŠ?ЇQ`Öcëà©¶ôˆ †×ø~huòÓv˜EHÒQcgV‘XÏç~èxhÝ@NìáZ+BNî¼aÁuÖË x䳪€@!¢ 3 O6DIö²d\†è³ñbKž}wV`ÎlZþkZ®ëUzKó•sâ1€ÂGÙ#7¢¡t9,%†ÿuûÛ'„EY¨y„óU”`Ñ—“-Ȧƒ²S½c<5¢hph`2d÷c&ƒeúÚ#¨Ä^Ÿò¤¨¿YcŽºoïÐñЙ"À! 3kÜ“3èÝ#¼;:Ñl> ùŒ£Œîv€¿¤”8?Ï(ÄW0‰ÈOaFQ­ˆÁC¸“c×BêDéJýÍe£¬_k”aö'ŒhˆÂ¢lÃ"Dqë"ŸTŒ©—5{ðù-s†Y ·×ªòñ3¹‘†Aï]}ĵ`YôemWý ÁfÌh5&¤6ídÓ®Ø$û³ÂJ¨gé8éÖÀn76udïšôËPô_w¥µ0…ÿ D#ß´ï~èŽZëpšïßÔ9W—Ñî$·Šú=îq{ü£ÇT¿~ð øeIƒ…­|í¡EÛq¼ðTdÄmÏxЫvuìž…T¨+wRßRä€2£{ºHyrò̤èÛ¢DVER:NJ&HÔ'÷,8}å ‚ó¥{n‰‘U+ý- $tÀ´eÔ¯Mfš€ì@ОføçÙÈYR-oò®Ô"pZ^m(¦¥<ŽÇ2’n]ï…òÒ¨)èñíÿ­T÷'ÌÞÕ¸ÿùŒ‚áÆ‚X=…â“bÎÉìôô¼ŽõE¡(¾Í‡ó÷†ûµ€*'7TßzWÿpb5 *AT¶­ÉÕ×»í‡Ã²—ñѬ±…>ü/ø @žša¥uŠPÛ3Í9àÌ Þ+(4ë ±O N¿Ö¼hŒt†?ªÂm{MY‹áÕ ²_-úÖ­XmÉ}QvqþSêã—^™¤q‘ëÐMÂvX—ÉÿZ.ü½äŸ±bwî3Oí1€$"g‹oy6R¶d–WâH6„´ MwK¯OÆ·ß@Âú•¤ŠFÖ²ÚEOyW=£ô /wD2»õŒÑV±mw®¨E*\;à`íÞu&m¡™ ¬[A÷âô"¢~SËJf‡¦ -Oü}ÇWø»5±Q›5sì+ììõÁ&òx=áXg8¸ðOa‡Çi¢‹JØȦçf?›5ÔÇ›­}{¶,LDõn¶!BN3kµIÛo¬ÿÉ]p|kÆqkVÒ„éÚηëG}#Ø_àŽ—4ôhŸfóC—X9ªR"(Àn,*5a-7 ¬ lÞéø€Âõ¯qµR.½ ^ulhyI‡@~ÑÍ¡¾Ç?qÜø÷ø©¥ô#ã—%,ÉA‰{Ê¡8ʤÖpanȸ9iÎâF¹u–ã{N¤Œg¢+¾}A)È ,ñVõ9°Áß¯Ä 4å\/˜±Ÿ#)¢X$€'̈ ]ç`‹/\jÑ›àÅoù™!N0wWUÖQ«©v-… šaÖÊ,ìNB[´%–â:/E‘Îørˆu…„›ŸU´wJ,ñ³SÁÈ®†ÕˆbåXdQ< Ómð°ß…Š/3áçûà Yx%"òt0öf^î)ØA µsn8Åß#˜~pö…Ïy#öבðºŒGÇOú?‹CšÆ fB.¬Áµâ€§+¼8é…™©PW*z·Dª=¾+(3°Ï!Üz-ÙQÄIžHè°n£œ0…×o=¢/.…ö ÙpÀÝ~KˆBH–˜›/Å ÀífœóÁYµâÙö¶nDŠÙuT›[¨¶†\gmõ©õŠ–Û›ü.Gœ¶Æå+»(SB8îZlp©û?º·y3¯©> âkÒ¾.mìUßLCZlˆS<Õaå—øZ\?U¼hÙ¤$üΚ°ŒŒQ²AÊv+©ú¸ÿoÐ{ H߆W$%ð›ûÖ£»Y‰ªü!þß¿„ä¶jã# h,½CÚæKLwJl}\|&œúqòLHÙdœh ·ë7÷&FáÐ]Iý+ÈuÚÀiSYøüƒð§+l-7†ø$†ý˜oGMëo±¼]W=—@>ÆNØf– uÛ›S_<Àäù÷Èþ'(—vBk´ ÛÎjÂßXê=îq{üUËÚ¿ìM¨9’‡cè£æ9ÑÁÒE7qŠSÜP?€nt‚!Ñf–ªl0± P‚•.Žá]Ћ(=çhŒ^EûèÃ`£ê¯™s Ì) ìÉ·¹9`‹Á§Å– Ÿ„ñä©ãYÒ¬ $xsLj½çRš´§±œªôè$­¨${9•b!jyŒÒ‹ÌXÁ†X"u4¬¾'ÏÄt¨–Ï{éeÜ_ú? ŽÇREºiÏçÓ‡á! ×g‰MáœD²‰3=ˆððe¼·èùj™_Jâô‰{Ž—IóšíTâ0 5 ªí›39ðγŠvü²/Õ„žöšÀ²k g6‡}“ÄÙx”UÒ¿3çäñÈ}ˆ,ì=䤈VíðߘçUÚo‰âg°‰È(Ц%ªÌI6ùö ODjoÂEpçX¼eƒ•®g騆 Úh ²úùIuQ<ŠÒá%rçƒk Ujêå¹Rs˜x ‹Õû¤§o&æÏQªíÁc"B±çÔò¦JZâIˆÙh€Enc‹ñüZ& køÌùäŪ/aãi¤[Æ øà ûŠLå÷‰·[.‰³w"“(§áQð{¶¼–k=û7‹þQ;.“jÑØþêo§/ 'ƒUáoBƒì‡ûŠ»!èÒöà¬#.eym1¤Æ; d¬ÅgúsáÓ¬±ŠíÙ¸N?³CFןÒ(ºî ò4²u]ÉDÂÍ€‡½E¿÷ óPãÿ`!"d%Pëë3e*6Ëi9JÒý˜K¡×¦Ã…?ê\1þT囸{ld·ìÏ=þePéÝp?cý^,ÿ’€kVM¨gVçµ ]’ Œÿpo$§úí…¡¨Ü2ƒÈ9,Oû¬á2j2 ¹W ].A„ /&©Ü!F”.²ÂÌ“¢ì1Kdc•Zêßg$ˆ@=s=CÄ7E8~åà |€˜ Rs¡L¬·š.¢Ç‚5¥×ãY[Dž&$…ø³S«5ÀnˆѲ„ˆÐdTÓþúå£Zð‡Z/‰}ÿ„ ÄÖ\E6ø™ó`¨dX²â@à»±N ±ù£2Ù“ÂR”Ò®æhX±²3Æ_ÌQ0†¾Ÿ4ªï¨Å-1ùÚU ê„€#€›|t“Ä¿Y“ë:÷àÐ\ÅR°bÏ9*Dõ£2pµò*fè³¾Ë*HƒÐ2M*àgO’:©¥È ©Û “AEqе£Z#}ÔUõÚgËç®|"Ôê[¥Ŧ€9 ¤ðRIîIúÖ7I^e‘!>îm^¨ôþâýÂ|œS…£œ!”%r+¹’à T¡¥?˨¨…‹¹ªè™6Á­õ{Ù6!t¹)(áip Üruüâ¬)vÀkSËÈ~cF™D¸æ®fh©{ÅŸ¬‚ï<¢ôï%ZT’fMí`ÏèÉéúбÉ[^bÄhâÿ °G©åí=(h£)Åôs‚¯¥—Õ¾ÂX×áâìmJ5 NÖëWâê!ß9©¦Î€Ök[ÓÿÈSpEONç¡WKw}û—°ØÅÚžaºPL{þîœAŸ—´›­?£ì8š˜-^´]Þä|Ú1¾Ç=îqÓ¸ D¿üJhiЉœ<$œ,¿Ö„È q8$ƒj3ï‰_ WÞWùHŽuÃå„§ú=ºD7öòH¦ž·(wD †Q²¬4çþ*S)•ô „möÉ ´88/ÙBgU{´¨b„ÂøN$'+¥šÓúg’M¬“'øGM{ÿ'qÖ{‚0¬•~AÛ]:\iG‰Ú_"‹úãɱ3Ø'(n¸51´÷ë~šÙÃÀW­ŽÕ¡Iv”ƒÕ€‚kº¯óÛ§_¯ñ[¼  ©QÝf­¼Ôõé„Á’Â1W§¼ÝS_—7a0><-À nž-M¶%HZSôßËùvÎ GŪ÷C 2Qš‘Ëœd…‚Ó{™ÿ8†ÀU±Zî` Ä©y»l)À©“%=F/J¿¿ ùd¤Û[Y;¶à*õm°0˜hl‚e'p_A—¬Õ0A/ äÙ.kóEHtIáÈÕÛc -ºÅ™}™Înra¹6gÌŽ”È‚T÷e ©~#eޏÖ0;9/¡ì¨b4Ìð¬‡\¹ÜǵGb¿ï<žá‹)?¤Dƒ ˆD:¿T癞P;ë¹Ã\ü± ØZRï¼]ìr2‡vm6ýÌû 0#Ѩ6H—=ŠÙ„æ=N¼ï¡“—TµM8{*Ñ]2Ÿ“GZ쬻ƒ¸59vé›¶ç™{¿v푈‡fÓ¶DÍAAéÙl"Gø~ô—CíƒÕ=îñÆuï&€{üûÆ?q>Ÿ„=œ @ŠP‡¨ý 5{ÂQË ‡Ó¨9 ¡‘ök´'œ¶F‰ê=°…ÚvPž¾)\÷¬²¦.à“i(GǺœBóÛž"«~˜YǦ£Ô5m¶\Eí,)GbC¹5Y££ê3ö: Ú ËKr ˜#CÍÌ¢z V„_2êÆXÁð<÷³À€Ïœ«Ïf¿®ê‰É æ<Ë<@˜í_ÿóYpº'ìÁ¡þèÍšº”©®ükâË¿ôÀA|³qQ‘¿.)ìÝHç5 -¾6"ð‘Ÿïz$Œ5ž$zß$N¯–Î |p™3O°/Ðÿá5\0 ÑâÄwiÄD¾fªët„0EáO6ãC^m±·ƒ¢¹n;-7^”t:õQg?Êù¼Mêùˆ€‘—®ÒçBüaXÅñâ'Ý(ý/VJzw1c—¢XÒxy²7¯•iÄ'câ·L¿< $–L½ØyúÀMÓí¸’7Í‚°‹´ TÚB}e@™±!_íhÑ9»T:¥?#ÙåäÔaÇÒ@ö––÷8/“˶f”H%óÏa¡Eu&S˜àInô1LX²•ó¨Ûÿ ¢Gù<Jõ9µXØåë©RšhÎ[>+ <µtØ/®Mx[iœ<Ó»bXKæFtíb©lû ê¯àz“[ÌÀ ðq² ÿÀSº}Zo–“kƒž 3RÄÂx6s™+Y IÉ]*¶ÞØS›·&ŒK•eKA,åT³ÿ&Ù±R°Ndðs4gyþ¤½”{‹fC0ë‹Lcˆ{©÷¸Ç=îñ?¸Ûÿ"ÛY:Qƒè€²Xô<\D¹FÇ„ ²À""sÊ0Å1oˆùÙk‹m2Vû7»è >.I%ï+K! C=ñ*TçÌ0ÛÒ6Ð AÚY¶Y›PgmxÁIòX†ûTÑyq}9pêÕð %¥ú‚*[äd™`¯{m™¾¯r1uQDdí¸rToaž-#¾vÐÌ=,e§I]'Ñ„kZ]mfÅöÄ«DÛðº­&@:Aí·RÁµ–²MD»”Ϥ$°&÷åŸwX _DG›Eô`˜òMôRáÀ}ýîíý" \…Ý„Û Ec„yì8UàèÿŒÚ8ÄˆØÆ)š·泦Ci¹ÂjË{uœ ëÍʰÑÛ1ØÛ­ýsÂb¤“›ó]¢Ú¥Ù&N·ƒmóŽ7G“Õ+¨Û (¼K<æY˜èÃ/*ÁÀ GÎP+¤Ln/ØÇô? œ*¸B'‰b[rë类õ°ÃQƒ*†b •Ä úÈÇõôNÍ!|ß %ÖÉ û’RgwµŸ ½ðãÎt´ ÝçÌõT‹ÕîEžÒ:²³.?› W.e(vѲ¢’|¿Lù*GÉÙÅ£a›_ãžµÔT¤rüa#¸áG[Nû¥©e¼›o kêl ê !èqôU|À áʼnœœë¨ °þ½¶æýNè/G²îö†ÿ&‚y7Üãùøå3ùJÊN€ÈCóÒò¦šœîJÁdE§~ж³e çšéŸ÷*‡(Nþ1TêwôcÏjØÓãŒouæç^‡²ö7nÄ2‚);+JFõR 'ðÔ&"¤„Ýš7Í)êNè'¿ oM ÿ]lç)cdaS2`ù¦2zâ¹ÿ…À‚ &n5O<›µ¢Ñèhô=’“­WâJЊf˜‘Ç"sd²<|}+ž*Ý<_•*{9 §RYPFrR¿vÿÉËüÂ?ØÿÅ?ô¦ ûØß— ¿ šBN+…?‚ªLÒQ}}Zþ–²=ÔaížJ’gCCBg¨²Ó(§R•ÜL9¦¤b§® ×œA¶ãC²•ª§ Q÷¿ÛhBÍ)"¢iu¢ô ð}R`¤öïƒíxˆg#~5 ³²-út;<ôôr96ްa|RÁ^U<*}ÎUyåhÞ÷¼Þë ßI cý ¥ÄÓ³uä6b5ò A|ØÓ2-êžËv«£·üÁŽ@#ªã<Èdm`;•-i¸ÐFƒ+FsšÌ¬p¤éÒ>¸ôãéñŒ±Ï £ÿÈ‘|«—õæ ^œ†UÝ ž-Ò‡é»VNÔuvM;Ìàë‹R=lÌ8‚ž, 3öz‘1l"Øê—º ieë³Vx`ýŒâ$l‚èʱ6þ2¾3™‰`Üšˆÿ›²§aAD÷èEÛKpã»5Ê­ÈÜŸAú† qpHÑ넲‰¶BŽáœrÏÏôA›é©DNïesî³Ж ]FW[f¿eTZ_'…L u±älô`­ñZ”‰ â¾õÄ·/@Ýiª6=ä ²_nÓ18ús¢ÿ:O®ÌVT‘Ù÷Ÿ3΢äïíµPà'DôŠÑ'c5Ðg£‹ºØ[ˆ‰•V† Ú<ë¼B Ö=|k–gni'É‘%ÙÎ-Gý‡’G/¸ÿ} OËâ0pÓ5õsÙýÅJ“Š$W½í2Q/64awåù °ÂYÐWE®¢=¥*ÛLÌTæ¶"A5~%g ð3zµ›à\G§MúûÕo8½7^›v)öLâñüòæØg§ZÝ V÷cˆ§ÜD2Ç4ÌSHpç}yŒ¡f¶ûÀ"K߈'ZoÞ$/Ãì”c©‡ò¸sÀ(¢¹‰d­{Vú]Ö|HÞ(º²ä‹FüÌh JK¡]Y‰k|œBmŽÐð÷©pÏÖÎ.' UQ=öl[²Ë£¿ÛÆ]QÁ v9£*èÎ0Ûiiq&m<´5xʾþмc ’;ó),k}èU–ÞÀ7øà,¾_Ûþ¸˜ Ö Ä&ÀÐÄ%‹7Q¾êD²Ð à}iÖ–Õkƒi«µˆ˜{ÆooÅ$Ëkä¶t|ÎÚ¨ö{•¤œ›ô[›CŸÍÕ%ÈQ^+º˜ù§àÄNjà̓˜óòä^ýû÷¸Ç=îñ7·2í/0CZÎ>ˆ½©)’åÐ t§w ó°6J¤(ÐÍR³0W‰-#¯¶äÒ²œ0%;±„”HÖéÏ5Ç—(bC¥Q³‘k§þ£½g»C$Në MnÀf‰)bf ©½+/Äs®"¿úí6.ÄIíêpÏ£ôTè±j~‡yÕ“ô=ÔOËj¡á£Œ»w¸Í‰*À$Êy0çL;0Ö«1²ÀˆñÒXk9?Ï8Er‹Øy€ÊBWnäûû¼‚6¢xK}RðÉ7:²o*!ãamzyb†¹tR>¥j9Ѳ*î¯ÒfºŠÎ22´X¥v´êޱǰ,]S~¬Âkv:*ë+«)òp;¤!š‘~­ s‡¯¸7ÆÎµTS'†rõ(ò›Z ,¾…§# °);¡á„çôÔÝä ÞzüŒê¬ÔÑ>…/ºO¾u²ò©yÊÛÀrð„=M\76dÈS‰‹z3Ç:iÖÏ!J£>¬QrpåzŠûB>fë[”äœßTS¸nzCö(ˆ,» ÀºâKì£<ˆù¶¨á½œqìPuû öæ·”]Ozw£Å¬5ONÀ˜ÛÅKùµMËÊÎ ªžÝÂBÙsºc”9YûÜÖÒtˆõãBA˜DÂ’z*´oÊË\±ýÐs«Ïñ+4âï›5€Ï@‡©¨V5;(Òù|bþ„ÐWýˆË¬^Šþ<®Sb›¡ °lÈ¿†ÏÔßyÜu‹ÿ2z«Ýãíøu NEʪ»%aó ¡TZ½‹ÃÛ'H,ÞWw„Þ¤H‰JˆFú¬VJè ™sƒÿò4^v 2O/†{seÊx %DŸ^„YÓmj2HÐ|d¶¦£úRIêGw†8Æ(’3C ˜ð†üÒí[CØA7C¶Ð†‰§¼Xìõ;ÑyœÔ¼òY@À;ò{,àù‘ø ÒÌŠºf­ù1ôÄД¸¢êTˆÿÑìrÔ!ž±ůôÓæ×ìûß!:İðƒ˜Oœ#¡<…„ËÈ.ÊDi*ð†ãÄP}àÿ‰çœ|°´5ðÄÁ…K*y:[ kÌÒÍÍUFnlòqa’ͤ¨S6;ÀR˜zbÚlS6m#Ìštó3¿l0]bŒæ0 2–& ©§­[³€Ê¿zI¾«ïˆ*"dìèϳÔAw:”uÍn׎þÏ0"Ô©6¹s—ÿ.$ûÞ[٣ȅ%xâd5ëCÀyy2(¬±¸…mTÏvj â-äb•˜YKK8vM\Ï&M•¥ii½Î¡¿Ñåýë±Ü\}Ô5Z·øN"ã¾ ¨¾7Ц¨ gÛªUlAõñ+,I2\‡b¯›ŸdX¨›Ñ76Öc:9NXpÀRÁ¦7›¹–ΰmi{R™Ÿ0I~© ÛE’¸2Ž%á«`Ÿ”óšõÖ’­Ž­äÎ ×ö€i¹²o8žJÒ-ï.¹ `s£œ!›cgÿ+rXžDqW±ko`¸»”Rñ{_½¸ãH¿¶çx¥ãQ±ðFÆïq{Üã¿uüÛîÂÍÚ»‡3𚈖Zœ‡¦sÀafL&2KK&]GB"ÓZ‚ù0š¤Òœ¬º‚¸É Ã.Ož"0À"³!þÉK´‡ìXKI ËØvàùžvÌ`¨E#SD¦'U’cÈ}$ˆ ѽpnböWLI<íëY74ˆ ºÈ¹RÝ }¯úôz¤òëi¥Rî¡ÿ IDATjÚEø~‰Å7NQû¬dHŠêv¡°¡C‘ù:‘}ŸüCcî"úÆëKN}áûÇ&º1ç$g3J§‹ôâ û{P…BQîöÈA§ºiÏïYðÓÂk«·ïù€ÿ¨øN‰ìé›·´)® 0­Ç›–J³‹`EÄPØ8Y bÜœzÂ,úZÓ-XK°W,qgì¨wwî I{Ç×øþî©2RÑÉ ``i«× JÔl*A°t«ˆ­NËT˜{€2 :–,ðšå»§$DH=Ó²â¢>†¦À ‹b² ÎЊ¸aA%ÎhÝ(~"‚‡åû¡D.YS€ìu «ï‚’›˜n\nEãáˆÏ™† =E-Q¨G†IØQ Hm+Iž[]ªïÜŽ³weaŠ}Ô<1:'^¤0‹PÉi w[Tó×{Qå0+Álwumºïv[®· ™ÿdÇ…z+Î9]Y0©ð9¨mñ›ôþòÜYn¶®ñvÜ~†¤£“¼Út=ALq«#¯<–?epkY¯/5Rø¡öm ª\W7w‚ê{Üãï?î&€{ÜãÓøâ¢é_‡E$M“û5€7Éèaö€ñË––ÂÆâ: ‘8¶•P ”´7ØÃ*«?"O^<;Ò²ÿ Ù{Éíg?#§‹A•0ªNïäMç'ÓÙ„¾5šB¸ãA¥(B*)Ï5ÎòØ=qJlÃõÞ”‡ò¤pæh¾©Ó„[`ðÔͰ§\P<0^çܰú‰5¬yc˜>0¸§³;ÖÅ* ˆ!ºïòâ®ólôX’ÇÀ)4_Ÿ+„ÉpRqé "‘in;˜ iFeæªÃðu¿´ìñæÚ³É®Ó/±pUà³¹EÇÃë}+ï3»¹˜Ÿyò~D½eóýýÞÔü˟ýÉò€µPûd.å<ö-[êd.JLjñ="CÇgúR‡l2ÛD6ö€vȧIELв–+irf0aóæ–ÓòFVX†ˆ¥Y¢È1ž×Jl][> °¹TíÎk´ÇŸ%#Í%±ÍA„™…†_/ધ-,VÂ]Væh€fK}ÖÃ7˜‚´iŠÖÂ’ÛÞzhR§K©ï˜‹ÖªðIñîV„¢qpX©$.­š¨.ÈVˆæÂ˜\ô¦Ä±…Š]QWDeÆx» *Ö-Â!Ø'ú9ÁôH7ÄåDâ°Öün½‚öbU‰:éÿˆ"é£RLÙï¡ü 4:ÙY®DÔ þ&ú¤@ÍõN)[–ÜšÊ1<Àê½#¶)Ëv[-:ì7Nmf¾ÛºFgLFßröÀHšÿnû5!9ñ.b+•Arî?Ž{ÈUCÆF÷¸Ç=îqÿÚèNŠ_{Àž•}æB!îéPcš=Í~™=Þž™Á§ÂGÈË_ì nrֱȸ‰ÿxHŸ'4—Ò·­#ªæ ­/sPÊj^WëžwPÔ•a`½hVñ}ŠþQ„’ÎP¯¸“åtÅw†VËÍ÷».M…°ÃÊ63»C[öËãÔã¹l–..ŸßNÅ•8 ‡ ²„Ã\Ò³5W9xRôµ|½çñÌæ*y‚º+#ñ¶b¾T€”äbÔwÍ ïVêÞŸ/ÛR–t:hæøGêäìŸÎùx,_xÄã«(ò.wÑèÛrwŽÀ˜£§±oQ¢ ÇC¢'¹›aÞšr?ó§‚¼|í]¨ˆ-Mïä5!&‚‡Á³ Èɲ›È[œ5ØÊ:kÒûñ²3†AF(+ÉŒž¨ªvÒ&Ñ{oêóÀ*‘Å‹)2Tx˜Àá•_2ÜR0Z>ÞêlaLJ06ç¡i¯©’Jˆ[½‡)Y¸«®Í—Ò׸Õ>¾|­[MÕÄŸ&•¬uõ8l‹h¹ÃáMPNý:IsÿŠñ)±Ô.¢rA,Þb´†&Æ>¶åÁ5îN¬œ¨lìvj74ìM¹~’¤Ã—Ni‡ò B©hÿ·®ÄÔ€™‘,Rü‡‰P}ÿ0ƒ¡Ò[“ÍØìÛ|ê1ñ*Ý”û|IXÖ+’ëå)Þ7G‰¼Ô¼h?,,²ì0@}Üšä[Úôá:„zaÁ¢ÿoI¬òŠéƒë¸î8ÀûYiN¶~€ÓuH*¡òz´©Y·ÔpáNlľšpß,ê¸}åT[‡]»ùÑ÷ø/à’÷$ÿŒO»fïqéÿùø `Y;±3y•I<ÝÞb»_GûÓìœ]Tè•p‰DqÅÖ1|¸¶‚¹ Á V±àè÷Äz µwdµgP z˜U)%v€¬§¼dÂfÑmçmËj|WÛ/’©ƒ Ù}ùd ŒEús²g`óFá€Èö—›?xͧY¨òn躃h Ò“dsÔé]> F©bDJ¦ß¯Yš" Ùé¾Þi¤tŠ<€ÊWq‚ž^›2x¦1p!E»Te šð%ãÃsÆæ)áP!Z13pÊBd¸BóU+hc˜h>…†Æ÷n«š(D)^1å×/ ÅÐN BÍ‚DT+Œ¡ÝÌM¹³x¡ÿ„õ¿ÌZÍŒöˆ69'd™ÿª æo$ûˆÔ=ÇBe½0£¡s}$™g æ¨öpÊ]-úó…"™ªPÉ^£…}»Œ…;_ï… \;U+Æap<½ÿ!ìH²æ1ßµB¸‚·vm‰•NR{£æá+Pi‘ß(„1:Ú÷é]7øãCôÖ¶é°BºI¸F™èÔ}{CñÛá/Û£Yü!”½m}6UÆP• ;~.: _qMÙ½ý%×€[9W²lòM)$ƆåòðÐ,;mÔ¢fÒ¶6wøæøÍœÉüö•è'¿º! [VÜQ¥¢6ØÔ0µï-7¾Z©÷NSdèm y‡O³‡|ö\ÿ Á†«Æ)¶o–6û§/Øë>[¬’DÌ1Õò 0RLl¿Mª j]^ß¾UÜÎÞç-lˆãG×÷gëg8ÔJ¥'ÔF±è˼áÑ{ÜãÿEˆú?óhÿ’ñ+%úüHk‘½£Â¾%Û¤–Ã91ðÂ2ó©L OÏ÷M;J-ÀHh`ド‰âðÂÊH_Ô\ŒÀîÇ#ç´Ê{9¼4½ÖøuÅfa4žÍñHÃîD¹»b눩,Ð^•8B ž8më6 W;Ô`äË!a”XR\ÎQME –'¶Ÿ(Hµ+œæ· èáR¥,öËÌi’÷xz‘.î| £–L³+âé¨LasµÚѶ4’÷ÀñÒk‘©=¥â2~æ¸,.É%=Þÿé„jâM+]>°^ïô©nŠ\cû"Ú?W MüŒJei2Ã4éÞHa+¾vvcøû|ßIÒ|[Ù~ûä§ÓðGV³JµÁfʕλÎçYuB ò2¦yḌPNŸ¤s;ÐQ5¦`¨â~Òª€N‡w¨]o’«º€$"ûÄøÕ1ããéÇGÝÒSÚQ‚¶C#‘±D+BŸ£Ž¶$þ„ !L?@5gØÆ­èŸ3,»ìÚü —¡*o bZ,Žbÿª:8˜ \Ϫžþ¥PWE†Èðœ¶Ì‹¬£”ö»û©‹«ýeLO©ë¡¬õQTp–W§Nùø¹÷—Âdk.m5C.eƒ¸øûý:ûf7oA­wÉ6^œìPœ¥ËaµqÁV’‚L0×&½Á[  4JSˆ©2ºpeµ_Óù1Û–£OJùwÞUŠùwçNÏÀûë}q£[2¸ÆÄRŠ€ŸŠ{"oPîÿÞqW¹þ/éÿÆñ«j°„µ¸R¿£êî¤w= Æ"ZUJM¯ê’P~ö!3;$ªjÏçYÌðÄjºD‹ÇñÔ´ÑeòfëmÖ¨Bá2‘4-Èù”*ºüŸ½oÝŽ×y%jçýßx ûGb‹P’+•îž{}ëœ=é¤Ê–u!A¨#¡e3ÃäYÊHû]iwvñ¿Õ•:v‘BÐóôy(6½øŒô²08òÞ\wäQr'ÉYxémøÔÝù€éÌÙf²0ÑÂÏøÆ…ì  ‡É2* …{c”ÐMåF%`j×ÁXVÚ@âlòÕ¾µÖÂC % g­LËØMòðDñ9Hu£ãsësÿL`äŽ%aôw?Œº ”ì׈¶"ÄŸîùI{ðP ÃbûxI¨¼×AAÕ•ºÛØß‰¤åv¨Yš$•t!ÄIÙà(žIŒÑ[•Ñ@ WU£Ž¶©“Ñ÷ @TjáÔ…lQȯèR?;ðèôy+ÌÇŽ'˰ӊAÇDɹiÅóÿêæ6dé¶Ú·XâüoI¸p*¨u)-ÉýdÌM< ¥«¨ÓP[ÜìÁ<© kç¶RCfO‡×ÚB;^T*—ÑJư9®ÊY•¬ž+º‹ ×ÝÎ:R‹P)[«®-5¨Sâ©£ì:¦­d|L|V¹튈ƼôËvav«“(¹ÎñâÐÎÉž3>[>Óº%[ãóéýZ°K’õ†ÚRáoöâ& êtÛ™F›prwc¸êÐÝQ"˜¿jé ¶j=ûÎÕ\¾˜­©x2Ju‘ºÃf½c/ßÏ»„¯j:óúbd¿6¯Bñã¾îë¾îë×]éùs®'BǯjÁˆ¨‚-ÏÛÅŽU”)b;gñtµóa=§Pxó[ÛLbh‰xÇZóÝ|(Ð5f”5èR>®¹O°+8R) ³,&ŠÔŸx ئë—@HÈŸl˜,uÜ]ˆˆYp0ÇWóZ— Òœ¡F]¤+N^“Y^Ø,ª-ŸRBQ‰Æ0Ãk%Í©³Ñ•ªg¥eÁû5—ÈÐqx×ÞÛ Ô<$Y{è ¸y¶TZ4½m)†Üå¿GÿÒŸk\Â`ć3 ¦Äò ’ "Þ9ê[†a½cž> pšïu~3ˆ’ Ö£7"K#N­‡ñ÷d§õle¿„¤Œ¿%"Ñž (…iOêG›ð³´Ã1#¦ÀÕá6m˜ÀÆžb®zŠ‹ì-‹¿~¦Ep“ÓCtðëÓDÂçòG€( ÿë¹­™…!65bõ”nþ;W‰§âºÖ¦5“¥”U’:ŠUXÏ2âì|ʼQäžëK,T Oãèo NÃ2$-2fÛ(œ¶þ›e³¿Ê °ONᤪ·£´ƒÉÏ7$_Ê®ì¤Ìxñ›ç•Ñ/É`£“qß+ÓΔ–úý@~Ñá¨2ʯ6ýþŒö©/ ѳ„O6­ïÔMl9ˆ^"}Ï%¹ ]Žê#H?v'ÄîÊ™CÛÆˆy£›ŸòÝW`¢å‰~FOÏ}H!Ä~ð^ÙéÑ‘n_‘R/q£r3šÀÞ 9s±?çH€ûžÄ»£ñÓxÖÖÁ§|[üüt÷u_?}ÝM÷u_¿åúèÒ¼ôΈŽßyžµt:ÏŸŽP“ýfÑn^Ïä‘2| Ó©¶óôˆ9žfªúm‘ löÄׯel4‰B6l®3g–JŸÔ)Ò úÙxqÊ,Ä@æØœ9 |{ǽŠêçm8côU0XBéȦGÖ|¾Øaô!°æû º>±ÔÙNqªH\r*Tž2ôp˜µDÊ–žÔpèê^3wAM^/e~|܃Î>”+ Óâ'@ðP‚ïA¥'¾V¼$;Ç÷þHàŠGc?>,rؾìÁCèÆ¢.’ÌKÑ0I3¤Ûpà7ÌšÇVµ¢¤Iå°oFîiÜý¼ìOÍ2ƒêŽþz„†-*؇T74”éЖT!˜ »QüJL¤ãr'Ý^µâhJ¥&2vžE`ú|.@$„þ†jiˆˆX¢ÞqáÜÏ™éÙħ5ˆí¹‚~Ž#6¤ø„yÀΟw§Ðh¡€þÒàª}ÖÌ’ ¶ÀpøZ+°“SU`šµìË%/R|F×ñ …¯Dº¸„êz'h%5Tø»Ÿc6& ¢ÝÑl£âSƦ¹Þ¬E¿…–ïIïS„¢©k»†û…*3*]¬«Rÿé*ªmÎ2H·:ÍV4¨A¤…qªž(m,È`Rr¶n úgÀgæÅ'>³¼¬×+xG-ò†lÆÇ˜ (o'#Œ±&8›ç<ÄdçŒÍ´TY|¼-.Ïe³®ôÖ3š=L|ž ;iO„” ©Þ¡ì§+¢`ZÙˆâH•K„Æ;3£Û—89{œp6â [´:¤ò¢o3pÄ¿2Í£¬'5bYšUQí“»A†Z0õ),Àkꈨh0©ˆÈU¸a §…IµÖ1ÏmÃßX2‘/äh”µõùëuñ$Ã|Ä/w6whi“‰+ˆ¼`j^=–,íæC8åVOqS‚?—5šY_€œ„¦#Þ €ær]G)QØë©0EŸdì¥Àl· {m(œÇh&ÖCE¾2ÚÜú/¨³¦VèÞõï%nÎjj¢Ýe<+WlZgóê>×Ðüqa÷™%D[‹î]»µêûÿ&æÙÇ dzq¨îë¾þžën¸¯ûzaÕ|óøû‰7£§Ÿ5Æw=˜~íIûŸV²”sþiwÓ  œ“ãì×¶JzC©3Ëyf:ѵ9µ0Ú‹ñêkâVI´ÅK&¾ÉT€½v%VQZe£ ÷EµWj¸#ä½^mæÉ, #V?‘Çÿ™0ÉL¨ëÙ¹2Mys*ròm  IbŽÚÕ³LQ´"ÝrHÄËì#˜l§ŽþSJMT ‰pXS ¨t‹CÍêS[)YºÑÉÑMæ\MDMŠ(’H׋yXš– ÌçYÏžÖí1 ó¢UÏ#wE\•ì•gv’T™ørë}óm*t§v2…^®²í˜«ùxl˜Auu‰Yí§ò(¼& ¥3Éq*ù†É+Ò±êÛé‹ÙåïO‘ŸÐlÄ~áçùîŠ Ø´‰yåÏÃísú‰E*=läñmËÆã Ø*ßgر,v¯ƒ$±hé*÷‘;Œ tˆÅà]îùº´Á)°ÉPJÇ¥ ÇF +ä/¦Õ>LÄšôpNA-öì†àØÄ7©ã“ö?Ö—¬¸–;«$¢Âz’-õػ؋rKs*tŒ˜ ºÌD¸»˜ulÃ$ö˜i%Ì»¥ÁÆØ@Ý-šÈ»û`Á•jÀqÎVBR‹Â|ÜdóæêâlÞÖ˜|ºÂå0ß)ú/f·N ßFS 6{ݨ@ËæËÊC²8O®I6}‡¤yÕŠíA³‹j\ùÅ RoØÙ¤}­›ˆç¹ônšÿ}Ý×}Ý×ðú]F/5ª ×xDåXP]J€µìVÑ9ª|j°Cý§’ÈŠ"Y©¦³¤süšÓ{Sª| ‰ø/µsJžBÍ D ¶‰¼w«p(olCXÑ?1m,ÝÒ¨ˆšÝ©U²"°–mñã›Ãqב"z NRð‡t§¨â cbeœÛwÞX€’ƒªŒ³ãÙƒÔc©RËãJônÃ6œiÇ¢`ìˆ?ußH¤ž5ð”œ|öççOÑ­OƒY{Ã[!–ÈÚqݱxw+Tßd@åô`ÃÐÛ»IVƲŸÛORæ‰xšU”8¨ÐùäÙœ ó'9ý™”¸”ä‘ïfH+ѶýSù³|‹Çxêç™[²€ ›vîÖÃ4¾·#F¤xËTž¡Hœ£oNe>7c¡ŸTœÔÜC‰+½œZK@<çùÔ%´ ]!šsWà’ž$о‡Œ®3¦zx *­±ékÃ{òÝc&ÿá®Ú'—‡-IvÈ C!Ü&WN{&®¤‹.™óQ9Ù®ÔÂo^eäýLÔTl)ñ=b¹ÚÔˆœTÖ‹áûk`ÏFlj?CQ@É´Ùv³u(v&ç·É³öO¥HOVÄ.2ˆ^ç³i† tÈf@._4ûUp.U¦Îv”Âô;•»(¾?¹VÁÂk "EÔ1ÉnÊ]ß wç§KRÎÀÛ\À ØNÔ·€ «™2âŠÍ?ìN+ª1¾¦€ôÇLí,„Èól<¥S²½Ñÿûº1Ðûúë_ô={¯…¾ßþØîúHϼ3q5E‘uÅ8_ä_(´D{‡‰°¾u#3¿!}|#<þdÊ&R°yýèˆE6$Š–xSÖW0Xã6ãÒ† JARfoÞMxx ’CGõbËN„n+n¢X<Óïf9c8ÒÁ:>aHd6Þ¯Ò$ IõéIËÑ‚Bwe¼5Î`Ä˺՜±xµŸ%ã8›Ó`ö8Úq¤ì8˜½~—º|¢Ì+iO¦ù‰Hz‘¨f-ªâŒ¨7kW—[˜s ”¸¾þê9zB¨BùÏ?{ ¼Ø"µF^­–¨ñÃòÈb+aq1¯¦´±Ÿ…‡’çØ¸ž4ÿ—íyŒY B`"²ÁiÊÿr#Elb€åõk©¤µ=Æ8ï¼úÄ¢L$1É# ï³Ä•áò).Se¬@=$Bj_FvÖ#€ ]…2áfx¦ÐžB^¾ÜÎl€ü0ᎠqÖçÔGšˆ_Û?”þŠãk¤ЙF²‰f6J.ì~¿`“t½XÌÉÛׯ<ÌÛ›y5zåKÛ"!²*Î{ÂjL†rg8Ô™ør20µŒn=36ÐØ¬!†©ñlÔ%#‚;ÔzÌ7—Wï"±æ¹;zä cEÝrÔëž*Å/½v+ј«1Áò®7ǢɃ½IÒÖ¢˜/ìäõ%éñ ³zÆêxñ_¹‰DoF½ð(Š|»ãÙÄ'ƒ*ô>Ü›[•µ­“;S -ø†ºÚ‚SØXŒÜhšÜ:|ïë¾þ{×Ýs_÷õk®&'[u’­êj€Y½5T"í»§Ÿ.{„ pÞ(ÄŽQºqe¯t•G8<• X¥ñV¤¢ N†½6è(r+ z q¶òGßÀCвž±<àë—©IË›"T²ù¹ß>Oݪ˜y&w‡||Äºš¿‡‡ÓEù<>;B†/13Ä?I&ý¢ÿ h(xìä’E=œé¡tZÃåAЀ:ûfXÎä0H &K£’!Ÿ°´­ãFWèãW޽.ÚBÎ{§ßí Ø˜I¦ØžtaöáL ™-þ´Årî%S.É¿l—* ÈXIðÍ[( …ÚüQß%® µŸÁñW¼ÈF÷Õè<0š&Íé½ÐšõòóPÎÌϳÌ=^«ìÍÓ¬ç†×ak«ÈœÕ>uÍòwòaT'a£¨ nܶd¹«pk6iÚÑnx^^˜•Äåb‡¢AL'D2?€|}“: û|ƒ^ïg¢Y Y•xï(<ùÉU§(FãïÚšæôœ8¦Ñ¥5ðãØå—–tÆýÛï>€ûº¯ûú[¯ÿøæÆï ÇíÚæõ!#ÅDR`jfÙ ©ÈãðDÏ $ pLZ¨°ƒ,ÓÐc7UÓ¿atøZ£(„|ÓŠ-Råï3xDÑMB«~ä«-+æXMD“FyÒÝ(ê:B  Ï‹¼œq§Í‚JŽ D"¤¤•y¨JMÝ @9[q2«ý|¾©g|I¹eY)åY$nî[A?_Ç“¡yüõ«ä±I…¹øºBà‚ù–…Ó©öÜ·SX‰2Ž˜yú+ÛØ„#(‚|VË Cw•gmEbIï{¿P&Cr¿«ð0fà€þG³rç²ÖC‡º3ɲ0ýY·€¢”ž…Ÿ°êÅÎêi'ž–~?¼Äc·O¥Xñúfž '@‡‰ŒŸcý<†ˆ_ñ—Õ‹‹‡AjIÙ¯Š}ò~øú:Óû3&ôðTëÕèQxÝ“¬ä˜-ƪ ì™ÅÏVŒnF}Ê=(3tÕ ææÏp¨F³ñú³ìð=÷n%ÄRGv[“28̹à8×1Tõü@s6ýº7r è}®cÉ^U+ Š2áÌÂT”…é3ïè{ Ø4o%ô0¹àNžâj‚4Ð .½A#å5 q#à†LVRNèn^ÔË™¯|8åF´}Ø1n¾©^Bjއó‚³_èïÕ IDATäöèZÏ|‡\\S/LW\Yz\ êËHýܰ„6é…á6[\Ž'¿€ÒœÑn–KGš`aÿ{µ¾¶Ái+2ßfÜ85¹ØÅÊ,’ŒAÐ ¿ï&ïë¾þtø¶¾¯ïõÇÎÛî®>æI‘yF¬Ê¨Èø¦èÆP„èˆìƒ`+ 5½øÉ#¡ÃäSDœe¦È`°L«×S½UVYÇ¿ñÂ…˜ÐǨ`Àû<•èÿ™ˆÞº 1LÈŠü¢KÀ ËÒ«TZÏö´¤š3Ⱦ÷™È’ý&ï§|+HQ’¦*Âø<ÜÜNÕo@š3RŸILìžéÀ½ÂIEA^އeIÿ4ð¼”à@r(Ú'¤ÕKH…Q¢[)EÔ¾j‹û· yeƒ&%%xþ+Nº:-½Nœ~ÎÌâ txÄÃ5 Õugqý&ÌÒ‘’bÂ5mð¤ð#Ï–Óì7¡ºgù6ØžöRt%@×-Q«Èx öˆËãë®ÒôCøiÙ·£¥1:M¤óÓŸ]hKåx* å16y7D•îYh¥móØ4¥«ºôÜù¯šGŸœûÊS'ˆàé׌Šv˜—| q2ƒhõÆ…Ôª”ùvoZ÷í6zEâ¾ xÔÑ« {z#÷8§¾žÄX{U=©ºÁy·8X: 1OïÒÃvõ™Ø™ØßNÛèòÁôÙKû`ˆcKr§ÌVgKÆÇåy¿ï,<"Û{¥UìT0ËôgžÃ¬n¬]âØhž¸²8Ð3åX´7x”¼þõmÙ¯+Åý,VtKÝ×}Ý×}½ûú];zº>ºc»&ÛÂL2 ˆŸ¤Â, ‰ß2†5 ºÖuá(Y´I,¢ÌHR>a‚‡eZ=¬ø‚Z°ë *4Œš¼ÌCêc¬sÔPuГ{ÐH9Y @ÛèÍg®ÞO`÷ÑÇý„–S÷¯Ã5«àÙ)þ…´zvªÃ+Ç:ZëÉà&"žÈ>Á M é‡/c[Ìyo¨y„j9+]ÝÆ‚Ì£Tp*VB&+ƒ‚ú-ûâ‹äQÍÓà4²¿^åÓUAlŒ Zûñ³ Éö·©QŠC^ ©Ê5Mo{3á£ÇüäÐÀI¥ 6 — ï¥S l¬­=‘ßò¬NãS‹¸á)º.¾J)©ŽË˜„@)ÓѽѤ¬2ÏQÖåVàx?4g,µƒáhq@îì‘:æ£ò„rŠÄ3NJœ¥ &¶©ax€51ß_s¥Ü‹ïaglÞW½‚V›óv²ßîâŽZ¯Ð˾ǞVY{Yüï!âþ´âÕÞ£9ù|lÞ¯½¦Rf £…;t) ô°$Ã$îºTgzEŽÚBÊaíþú¹ .ãËÀ¼…œL­h‡ùyw×%pjÑåPYºµŽë|MÆÎƽïx \«f¿s‡<ú{ÿÛdïòJkóDçÓôxdä¢î¶rã-lŠ—ŒxyYe=]8--„à° r*é°å­p¤½b’±½íPbŒÑ‚¯#júÔÓx¶³©ì.§)¾WŒì'Õ¨Âfí¶ÿj:íÎF^øxÍ€waô?ÌÉ̦M¾é ~å]_„Žî2À}ýí é}Ý׿qê~ó¤ø\Q‡â}ê1|Ô¯‚–;x8L%ï°ïYé0T°I€âÔ*‰/!Ñ}ÞR_["‹Ú—×´ž^¤iÚH®FLyµµýÑž8YÝÙ¤»ˆ*ðÕ]yÌ.‡J øMù ´–‰’ŒXÆ] Jñ5à”‚‚ͦGèÿ°ˆä–Õ”Z+È!Àâ©ëhVâ3#TL¥ŽUM½‡çÀ[‹õ_Ž€C™éY‡°(õû†€´ix(ü×Wµõ\rÙ*ñôoÕ韜˜~ÍS·Ü2÷X^Æ/K¸Í·\ Ôx’àûè‡_¶½©ëÅ¢ÃJ(_íá†5Å#[„W®PÆ©âm;º&ýæé¥{бJÞ! lí¨\¢UÃð=¶H‘æÑK 6$9àÐHrÓë "ë¿öj?Ì%“Ñf‡gŒÍ—²P\Ët·×eIÚÙ¥, × Q‹²>té,ø*!‘K1hæÛF9W…@ÓMˆÀ×zá >r&nðXé„Ò-g ʼnz¸ˆ¦"ט% ì1M_Žeró¦Ç;ŒliáëÁÄeqSíÄmìåæÝ}?¦¸°3UB –`4¹^µ& 6Ës5œjþàâðv) ^{Oo*ð¼˜lÐ=Cd_¯‰/‰“×b­®,ŒÙnÔØ´˜µ?ÛÈÄ8­³ N¿X¢kÌ·ŽÕ˜pÿí]4O¢¸ËI¾c¸¸ùLnxm€ñ^ð?Δ ÓLJ]h”WÀvMô×m·Ë}ýÖ잀÷u_?z}Ž¢.ýdÖnÎÚ‹Ô¬Iܰ ×± %á­»@Ù#©ÊæðÝq\Å[h]1hµŠ6¢Ý¼h™#yf¶gÆ;ˆ"ô†®â8f ‘Õ„…Yʳ˜ËΦ“˜Ø–žô;PAž»™gjÔèb8˜Ïæ:{Ñá¯Z‡7oÂUGšŠìU˜íx¹É¢º²ÁO?ÉïO'(Oj™W?CtÏ¢ÁÕ¸>šÓè˜r±¥=IµäxL6Mýi¹Áë“°Ô¬41Ûø.¯¦´câ3™³V1àŒbÜg <©Zµ"Õ¶–†Á5$YŸóö7T´ñ§NX7ϘŸ£€¼ªöø/BËKÞ«¡s~kr@£ÍPx(b±°Åìœs5˜M­ýg…RÁÓÝ!óï°JT1ÈëŸð.ŠÍ5(Ž-¨Êâéo1ìÝPdBÄÈM¤ôœhHU^bóùi3A6@®¿œe–èN¥rŽ5ùTP%@ÏÐì ®íØ'e@Ñâ#×…V(ÿ 9Ì`ÿY›e‡O>r³Ê­Øé™KDRÀž\ YMYØbK?Ä×êˆhn1AŒ¦0zõo1eóéÓ8Á²ÇŒ¿KÉë¤ú˜vt޳€ =à 9£H¹9–{Æ‹3y&ü‚=ÐV~~9€.Äó«ñFõRúú°‡6¾ˆä÷þØ·Žu#ÇyËN]è쿨Ë”“–ugYÉSÒ,¤šÕO@ʼn»G„¿úéGˆ¼„m­dÚcëVŠSöpŽqŠRx<“c{†›ë¶Ÿ¡Oõ ¯s¥˜Õí†T8zˆJî =-?‰ÆHÈÏ¿k±ÿ`á¶Hg†ŒÊ¨<ò¸÷PçªãÿÒI6ÍTYÈ'œ}½i'”g&šÒuENmrp×ׇöf¸jŒ¸¢5²øMLµ’ȵ?첬rð#n¥CŽº|BË0úY¨»÷°´äD\†óÁ„z=,'j±/mfí¿-,žoc/Ÿm7PŸìUÑÕÍÑZãú 6/ˆb]¹r·ORý‚ Á´8¦õR0±ëK aCyù”3ßÊ ±=,Ë_ææw@œVܾunþ.op­~ŒŒµѽâ’Û²=ÇÞ3JÑôªbÒþTX.> ïRÚYÙXmׯ> ëIL±»Re"sWðå¶lR¿ô­¨äŽ:“6+ŸÁ•‹ÛOâLX‰îÀ}Ý×}Ý×o¿Þ¸ä«qžH¹Ô @ñLÛ„ÍkÂxja¤X3ù$S†ÚQ%Fc:µ"bÑ",u4Ôñ)hé`²«¡`±?D}Ÿ”ÿ'¨&žéê7 [¬z(ÓàÔˆOˆ$Ügv¬^¯uâêÛÑgí'ÿ ƒ~¹vV(SÚ)+º½ÿÄz éºIàDÕx†;-˜ýž÷ÿù ØS¹O{“ÄÇ?/óÐûqèT(Sǯʠõï=lQv'άlQ¿ÛÂL¢ ñɯ~(n,\Zr¬zF…X²÷£'›`ö¿ÃïáhRÉòþP›<ÂâÐJ'– Ǡ!U›¼~Îu“…5yâJ‡5d¥³Y_¨­Zý9{5òØÅ›ÊPþ§Ä”§ŸÊ$¥£gý\ßêçE85ÜdoðÀÈÔ†[›í¹­|¸?,rt)>ð7~r€ª7´2fï«ÇÙ±g4*ž«Ù•öÛò›×T¼;3^xºù€ÂqßÞvDžÖ¯?‘|4¸0—ZùµÔÊ ‹AÌŠ ± U¯?Ú/„Ý–ñ䤟¸‡Ég„ô›-Z§ñ»Èó\Èfbo@j Háb2ÒÓ§é#¿ô*¹Con¦œ¾ŠJßæþs²žž~v,xoÝÌJÇßo³¥¯Þ~ àÝÑoØÊîëÆ7ïùö7]wíps4~MO—ÿ–yW4Öy?Ç_ÎK¨®DÎÕGòT>ºV$ƒOsÅy³…°ã=ê B”‹·Õ&]U»:Ê¢£<Aðgô:!µ3È qq¯œpWžG‹ÃÑ{À=Îçኢ*TÞN½¯ÈRG„Û€èÝêªÃÅ:n}Ö?l]š~.‰Ì©D7= ^ŠAh‚±ºãk¦%NkÚÒñ<>ùøýSÆ'—¼H4Eˆ¹àPzÓ1°xF4ÊÃ÷ô-J‰Ñö&õëˆdžBµ/û@0ïÛ(ô6”üeìÀ9úŠ|” ÷T6Ø 4é2͇Š¥zI=v¥ á1ˆ-BZ4¬Uœ!+‘ÌL‚•mÒäs¤)j„Ñ+ø9"DwûDpNÚ>^`†Ïá0)Ž6Ïd2°ÙOZO<š>§¬qMX/'_»’Êü•I{"‰ÉXî Ñøt|¸¯ ¿Lø9mZ¥®˜”óºjœ°èð&OŒC \“ŸKŒ9­h$û·ÜIj©ÙÂj6Ñj{ àŽÅ`no;K±¨@Ê MŽªEä»ý–_PƒÙ¨’d;¾<7Ô—ÏXDõø¾©üHñòúØÎ•ÿ(¤óF]ïë¾îë¾~áùðÝ„2fàêV{R<Ð_ùµz-ŽŽ(Í>¿­).¢Í]NæL³ÕfÂIìßS ô;õ†I,PT×›ÐpØÿZKwbB?#œL +?€5‘Ì";Ù› x1ÍŠye˜ÑtÔ}ßs"ŽŒ6™Yè)CËð½[ƒF™Šh„\Q|•Ïwír[D8.?ÛŒôüG|º ;‘zÉ[²D.8.£…P¼9'JÒ[k@[òÉUt\çºËK–Ù×¢½ÄøVEòý|O ´ÂxŸÑ’€r%èO*·[Tméá×ʆ¯K•ƒâ£2> ÞSÉÅ^šÙ;^„RbÔ…ïÌWª ²© ­ÎÀzæ.Ì?•z÷¢§Q_V1©/‡îE11ÒA‚ƒ¿“1ù¥ÌðYê¨fx“è?v@jMº-¼ˆenGªÂR*EÇ{Íc‹¸!¼Löä Ũ9¯DçP˜þž¹ó"·o×cP•j^6è=$ú[_ç7‰¦-Ú=' 3¼v;ò™ZÓšÕñçsÛ°ò[9¤7ïK5 |dûõΣֳû…‰ÅÝ«]¨†Í—f‡¬AÌvû×öOþäÊÝþšRˆý™ÕÄß²Þ¸1ýйÜ/( Ì9v/®‘ûº¯ŸY¶÷dû·_÷üc¯ ëŸ!—¯;1à¬DÍ ‹ÄØ@OÞ>C=Áœ1.[â‰ôÒ¿Y¦yC°þ6T»$à C=¼Ë&j^Ò!ÿËî1ýðúI@’HwçàǸ ë…M/Pf–zˆœh™«[DÔPjèT‡FÕ'I2#þ“Ó¤:#ìg|¡Öø7 ÆqaÞA%'ÏC_þóîdt|s+uµ!¨bÁd• ZÏ–zMÐh×Z€x\ØCýNÏÕ:Jb)Œ( ¼6NÔg‡7DSèif°Ç§j¿åuaé?O7f RZ’£Qƒiæ0¬D(w»§ZY¾‹…£œî3}W㲂ò£þüó§jB [S„Ë¿¾å‘—g2"N«^¸pCC±þ‘Ïñð=q&ƒCeŽÒsÞá AóDz¥F˜Œ—MuÌt‡]Ý:aˆáÕ»áÍ ý1¨ÌY¶ žxrßÍ× z@vÔóhv ~.7t6,RFØê—GjƒgÀ.@á3P†íã4jó{àTéÌH³¥º>°4j]æëJÙûƒs[Š·F´ðiØ*Ñ@´žc3Ÿ3ö£Œ•‘™ö'_ •Êå©ñ•¢¨âÄŽ'¨q:.‘¹_ñ˜c¤×T¿mâÜ—yÕÃôÂ%X9}HôÕ²G2Ô_-ü¶¬ù={ؘŒêw—z_äâS„+~6ÛïU¯æÉû} —C­9@¸ªõ%›¼M^ò¶ýXû5ÛìÛ±c®WÞ¸xÍó–ûù5`%®ŒûÇí¡~TgÞ€ß×ß ßÓì¾þÖ¹ýË>dy\~Ì"ˆÒ(*»¿C dDîiÿÈØeœD½SJ)ïJ.Hnk ¢“)bHö¡Yÿ:ªF ­"eÔ\ *ËÄïÌ"’p6©;!Sñ„æï矨ýÌÃÈb‡[ûÐE[Fh)•pAõ˜m.àoƒÎÐJ~–•£‚|yyãÕÎ ½æøù_ÿX`hÂÁÇ™1ZÿñÔxq‚Óh|¸¬‚ôÞw7  Á{ í*çóz÷f885U5Xq½¸±ß=òvjWð³Ìp²ïS‡®;öšÎµaÜËÛ±!¥ò<êä"©(HîÓF¸‚¡\eL]‘¸©4‡¨"#õ #’ÅéÄt·¦I^ 3Þ&ò¢Bä³(ÿ ì;‘³Èé:x伩ù›ñM6 9ŠY…êƒÃ¯V‡¹.RKð†fŸ9Sa^´f9‚qUÉv‚‰MÜ£A°vo‘ïrF ݱ†ODG_esçÖòµõ'((­u¾xÆr„-ƒ´¼6Yèÿ àS#¶_Ôáø³r9þX¾ÑmÐ…»÷Ö2š—Š=aQLݶ٫è˜iåCvïHF'ß71Q DPz¬ºËW߉Ëc ó"ÇB'Ù¶kŠÛ#š(_þ4»ðLíØÃÚ‹›îò¯®‹1lŒœ>Åå™ϧÎÖdàåÅÁþà[Dÿñ¥ÀƒÒÞÑ)5e˜†_ê"ÞW3%?²±ƒÉU¬¸ïLÆA®ëÈœj¼L€34ÆÐ/—ØÖô9ÞfJEDßiS®âûÆÚwj6p-!ºr”g}¦F"›rØkŠUyâAc„IdÔ?«€T@eÙaº}°t`œåUò«¡ÄÿQP«ãø ûeFQãbXb~7Sï;µˆjMbÂmí¼Âé“ìÑÄØEƒ! ¼ñ,¾Ô¢[.wýÅ2ú«²Ë | ˜Ûíü[4@¨­Âñ%œ,Õ¡ÌCݾáÚYðT=ÞwI‘'΂“”d óh‹‘[}¯—A'k56m”`bp«:ѹ‰‰¢¼Kr&ÉUW°„¼U˜…%º4•½n•²™ í½Ú\Ó¤¶bG˜‹eïÕÏÑ EÄhw[ Ù]§¹ïqz¾Q-‡+àí¬ O¡ClÃ3*9øªŽ¥¾·é ntAU:ÖÝ:êÓÞY‚^YºèüD°m›n©›lØÉ˜¶Ë<Ý¿µÝZËŒlo³Yü ;Ä,ä¨)ÿ{_jý!Xùµ/ÈU_˜­ ß|O¯Œ ïáÏù?vJÜ×}Ý×}ý½×+Z?³{ÌÏQ˜pÕËn›6 ¹Å)‡qu¨džãۓᒷضŒÓ]³åž<ÈÈ- úÌä°œœC€_H`Zæ`J ÐpÃh¦¯=¶ kM¸!Lœ|M}Í S¸RxdùœTŽê𬹹*¾Æ"<$\8øÂ˜èG¡h…«ÁZ %Ub;îC@{õ :ÌúQ`¸$ºUвEs\ pR9VzêÑÀ¯æ<«ëÆ1™®é6ü"ÌnÌeöEm ¡ã³Ž2ˆrÏáé*û0ÊY=±#ä:|wÙ°“ŽyšR‰NC©*†æ “ñ¦CÑëaa=fNhÃ"zàZ&…¶&ý¥ÿ$¢á¹•þ'+n̬¾òað+'Ä|¦¨«ØW# #2pè|’®u†Ì7|>¸´8ÍfTæÝ&õ-±=óN¾s,ÑÌôg“Wa:·>hú g¹þ ;@huoÒ9›8÷ˆÎÌÙŽˆy»_4TŸÁ½ÊÆ*;C N}}÷P Á\ŽÄÿY*?ÔI8 ð¦–ÂÚaXÞçX¬¼œ·Œ-±üà²ô¸Ì>‡W$n&5,½GýŸ°Y5[.Á{Í(º©J}_'u…Í×À‡µµp–'.lö‚¤ï‚ÄåÕ=€Š¸ ­Ô‘X¶tuv°l%õ­„p’˜L¢÷XšúyòÔìõBs¸¯&™AÍð+O(ŠR¼²ÕwŽ\×ç-¶ ä8jáÃÜß-¯<£Ù÷jÌ\lú/0l‡~;õž7ˆ_÷u_÷>ó›.üªÑžëgÂìc¦›ÓGµ3EäŒ.µ’?µyôyyý¤D‘Îü¤D$8ÅÐ)%»„Ùr™U>šøl‡Ebbþ„ØäsÙ@öB9IÅž¶VaFAåêM¶&Љ§_ƒ0_M‘6Jœ&„2-¬ú<‚3TÒÿÁ#ƒ‰ß! æš{Æ÷9¹>©Üÿ;Å:`ÏcÐÈâÝ)U¤BNƒ G5ý÷ U’Ø#Œ{å %,5€g\¹ŒœðDþã1µRM¬¤F"ºDæ½òý…CBå‰ìÁJná•çø j£!A`IŠJ¾¥@°>ž(y‘Ùñ‚\/œÞaI4‡ …ï…G²ê› *¦ .Ÿ “Å­ú$n?kEÞ² -)VkÒiJTn +­+ ›Ò6ÝžÎNß”ÉmJ[¹æÆÉVöó4W×¶±ñu- |»2öœ‘U)í\E“ b›º€9ˆèøÝ¸Èë†1B`Ñí Vµ›”­4˜}-*àœ“ë(q ò2çŠ1e ¼Icó÷ÒãsÏabÚA5P¢u—íbôj¹k{ÅÈé18ºv¶¼ˆWÙé¾C8åü0¢ûá¶}Ú_˜^üC¾ãS˜·Öûº¯ûšÃM÷2¹¯ÿ„ÿÎA†é:êˆ"Üw¨\@Ó_8> ›ï?YÕj‚?‰_ÀËÖKÑ õ‘žu[…iA ©š=¾óéºù8"ËΑ*pÙ8ʹÛ1„w;}Ö ÷¦TF%â¯Ö†ÜÊ‚áe?D±æØdP³×¹¸AÍ<­Þ? e$ê\ˆþs¢:#þŽb>D·h! FÃ3Î>ïáfÆ/Xœ±…¥*bW3› ¥††îŒÉ¦–½/¯ÏòåÙp"ÉŽ}`cˆ¯z¨7‹m iJ€Q…ŒAÒAÐ<«¹*—s'†ÝÉ3ÓÙéàËã!µŒeì,áT‹] TGº^ ÉØú2C̾|âÙÓèiÌ„R¥Wýº#G9?§`¶Æ7ŽDº§†ß 0¬JQ‘Í„Þ65æÍí“yFÜî¤x½òZ šŒ8à¢4 Áò¦ªRHã/ô¿ ;$䷔à E`O»S‘ ˸µ»ÄhaùuF(Ѝ˜Ejäh.ç¤W¼’û­°rÐLC!j;7ÂIÊJ6Yáì2 IDATGa•h(ÈØ66°ÈÜ¥¾rRk9Ä]€¬T"é*;¹ÐGC1©°»š£·õj–°Å“À5 kbù0'†ïÎøßFS嘜úÖ–¶`oØ»AÛ¨qaºåé!‡J¹À‡ÛQg¿ðqý âÚëÖ7½1;g{× -^ÙÊ" ‰O6™~ßç‰óâ¾ñ£PÅò.¯¹³¼6J|×hæ[Úº“¸k/l`?°Þ×}ý×=9ïë¾.Dû/ýáÇ ¦#*Þ0JǰmXÿ £‹2¸£—µ¤zx ß³@{™’Öv“ÎZ8q]zOÔܪÉhJésuäpÂL/mæ;ɘ| \™#™‚ºLN¸¼›ìâ`ÒZš*EQ2¼F³ ¤hÉ‹iì©}ªä?ÿKÏ5éðE,ÍôaÝ @¨ÇáìúÏ ŽÓžÌ´Ó‚ÊP)òr«Lù¬}qÎd:U}3ò«¾•@í¡"[/Höôàø;<úDÏNÿ9Á8ÈÎ4Ç”0-‘‡‚¾üáp2Èr:©à„Dý <-TM’6ÙzuZÑ—JVÁ‹82ïè\mýÞ7' úb$ÊÌ%ú-É.[,;f¤3…³ë$ªo`­_9/ !ÿ2ÔÞ,Ôù¼¹E…#7r*„R {åé~¼™r§B(ZüŸ}þÿOëqïò*(,ôÿ¬QP·~+V´“¾Ä†ê¾1T§ L¿‰oÆ®,ÊR®Z~õD_Ë4ÕBà¤Ï#}b˜daßÄYÑOØ„×?,¨wÀÈ Œ«RûÝ–¡âu¬8²ET9‡¯1™ ùëıèÕäÊ.Ùª!™Vû<çc•ë©v(ú͹ºgít/§1—LÒ‘ÎD”ÉŒ6|ÂÖ+ûsÉ䜑@|ÒwÒ÷Љj®Ê¢›X lòx3¢:_›T%xm#ùNŸj®Ûƒ ù”­ªƒ4QB¾¿¾ÀÆúa0÷'ðh¬¤&·f oò½wžC |gCú÷ô½Wp³ªïë¾îë§÷œÿòõçì±èo棞ÊõØëÜ2ψëÓ2Lòšdª,ÛÔ¾“Aéþs9УVŒ¨¤ÿ°¬€&i÷™:}oªèœãyÓKBßeL·ÜCxGš0LNßòŸ€ED'=M¸£à·ZÁ»ÄŒqðPÅ }·£AÚã€çΙ9TnPïYz_s3—Ú}ý¾þç]ë 4ÌhfçtǘÚ9ôÞÈT[­"øY:øì‡ÔO¶7@éSIiùir^ØýHßîç<‡È†ï–ð4|ßðQ)¢\É&¤¤(À¯‘|ý´P¼^Šä ÌŒ» @ Ѷè;¡ûbôG u7µRIã„¤× h(+Êd+å¤oËî%Î6ãOÚ]X5ã%?˜LÖv[ú%z+okÜb¾Y¶Ó\5¤²¢O:­n~&“g¥‘6{—Em½ ±JWXšˆÒ4΋ q8¹ªU¼X{¹`úuw7“ÐP¡ÕÈiÚÛeKYÀ%w:;ð®ùª 6·ÿœ1Ð’Þ÷"¹ UÃŒI¿N²3Á*¼Û¼UÌþZÏtsÚ)¸ƒ¥î½ÄïâþSçЪêWÓLרíÝš–ÂQ{ï9sôÛ[õp>¼ØÓÿÙäÚ×R%‹ÐkÜð¹ù¨ì÷ñ)„Ðêü¤óe·Q«¼íz¼5ÅÂu‚5µˆ.êùûgÃ:K+ÚjÔÐýåwú“² á}õíOø·[÷u_÷u_ìõÆ­òªÄÿò¢‚c'™ûÜ…U‘ vépU2S’Q”t5K´É¯¿ O“²µydgÑÜ ùhž‹Äã´ë„à\êL©Í5æ„h²?»²>£”$DÚpÒ±ÊoYv^O ìö W=§,‘j$É.¸ùÆ`VŒ¨’ááQŸQËbz¤L>h¤G–ð‡¯ÿx~ºû²–Z1ÿóÿyL쇟!0ðº‰éeUä€ò›¢¦ÄçwÑžfÿ£Cº£ÌQ¥ ›’üBEá”LT:}BÃôVÌÇZ «E%…%ùÔðEÁ¹„ABÙ¿’FX`„uĈ .9§Õ/ð¦U\üêE„赌˜«¤èp¨o% Qâ, ýa¡SÂ1{îSƒa(¢ÄT’|NZD=®`×aÁ1¢s°çêE·ûÆSƒåk}Wp¤xIk+|)B öA_z÷ÌVU¿ -@êÑ©s|Ú£òʃ ËT åéã Ðo“ä9g0½EnëÏû“=ƒDÏÖJçâ= ­öí5øN3QÑ\QýKhÌ»ÄKUCÔ{<„­”ŸêŽy&H¢ Õ²¯‘3z²ÔÍÓJ5«“>K%Ï:4m+‰rBZ@Ḝ$ÔŠo}p_±àETéŒ`±À|ˆB¯/*O” Ü˜¾m:S%h Þ•þ›/¦sܨý'fHyÚ÷Å~XØî0:½ê%O}ƒxûÆx“e³ ºH^íØoH­û=›WœR5©U Ou¹¹²Þ‡nûÉÀoÚäîÝÀì8Û0;[A²ÔrÊýWünHè·|È-¨r_ÿ®ë-n÷u_Â~×ÙwßÌÇîGC '"©fà¡“ ¾ë ư»ú|ævÙâë±q²,Â;X´ w“*:Qۘ変(Í¢bCõÂÆ:á3ÿù&ÖÚå.jÏ­ÝWs}C]þ\$Ùóhè:èåÄG¡>)sŒÎò9Iáx y1ehÎø¼úó?­•ÃúDÿ}Â÷4{>ŽR¾þü9‘Õnr»äðÌ¢ÚïíQÖœ]v"›`"€ËØÂ(ûÃ4ìg+,×Ó,ÃVH—|ÿt¾ABöÞŠQæ^é-œ?ÇRUbÿ±"Aæ :*ºp…ݳ] Žßüý¬ãÒS¤ˆ½‡º&Óôá$  ßeÅì(І`ŸÄ„¸" çšÙ?znr‰´U -)Þ°¡–s @Qžìï'ã>›ðU îßN¾övI‡ð -ªi)Ž }Œ´£?æŽeè…ªºa*ÆÑ[bXG!äV Åh…‚„.u’/SmëÓT½s6ÒØ+_Ì„ •4uòU­'°l¶®q3GkÖL …éñÇX>Ü‹Å|£Ú0K©fœJ_:Dn%V8µU°¾\„P¶^d_RsAúâ·ÕC-ÙE o˜}›¯Øú•µ'õ Òà/¦I|Ú±½|Êi»;ϯfÛ|a%M?yž_Úß š_»}ã›xØúÆpY™íw‚WßéûºqÒûº!Ôûº¯¿oO¾FAÛþÍ(A|ÏmL‚õ™ÎéˆfŒtTÖjDœ!½L±‘À²||’`FõƇb"Ë7™H”\èîÓs6»×I8ÂÔ‘ë>{äh2º  §Uê4*ÚË6(Ô˜ˆ)Єa:™Ó#J¨SÖ¦(è^²ŸÍ0P‰¡+ô?Ð ËHeâhŸLج¾Zˆœì' ¼Ñ® FÿÉ|?ÅpÌ‚Ãó19ç Ê| ô?ÁñŒÎ¥HÊ0¾¤Ö3,“åóŠ@èT8k]'ÄO‡5¡ª*Ï`ö8ÐÏr?p²HȧoHR-ysó-*teþr€Ÿ?dØå’(–d±uhLàR!€ÎÙ2M?=ЗÖHGÿLoùx¡Lf #&5 Pêm-³;Z¡JÎ~5DÍ¢FÕÂ]2š“)7E­´J¥3Š×3~¾ß+4ãaO3d›NŒÖ…¶còôö»ô¡i¶Ö¢ù”#ûã„%g~Úá'œÚîIÙj–€?ôg^â½rCÑBÁ»]«J]Vœ(FÑ–zO’ðÚåȉ’uÊ9lz|=À"!À—á«Ð@®å{Ùð4¹|Þe~©¤¿Ä'H:_Ÿ»¬"éˆÕÊÍ´€»÷É¡¾”=Ó. ÊêÏõÈŸÉ¥¹±dêìÓEŽFN`Qêwç3œkTò-“`úRý˜•ý®""˜/†^÷Ô¶ýRvªMÈ–{u·K¿€};5oMª÷o©Ù‹ÚÎøwï|é˜OïA^‡=.~Äeí¾ß 1¾¬öe îë¾îë¾îë½63ŒKR!,¸?º'Ø eÏ =KQ8iwÖYhŽÕK¢Û‹]Xô7RbìGTÿ=̺}¥=<i¡FÎ6…ÙU~½Ç¿ˆXC7<”¬»gáH—{÷žÌ[/^ÞWy4ü²§I¦e ?‰ðx¯‰üKn8QÚGâÎý'áâiÆ®"båf}òîÿ;Qu%Ì•—L°:Hš±™*ÃF;uðKcÁùŸØp®‘¯Û8ô§À‘[£RB‘Á9ëxñyÜöAög)Z¡GÇ)¹VÊ«’[& ΛAÕx¶G«˜,zˆ* ¾WQ‚á,¢~¾Žcd’›ÂYû!âhDG Y<³T±£pä6»$€²Åšüf‹h·à&•. ËìäÒ²k/3´~›V&p¨d7äq¢A–â9þ÷“‡ŠWÙo󒉻ÊéÇë;T‚ýò¶jŠˆS8¯Sÿ™_Y èSkôä*"¡8ÑvRr*öOä›O·Z³Ém=&¢D´!f2NŠ:t†=í‹óêóW±`õËZ;¢œI T=°LœçRMJr>{Q"„M¤éN6¹óþ]Kª,jgD—FÒô­uVXç἞Äb|¬!˸®…Ž%Ú+ôïóóò Fˆù]q­Ù%lx’ ·nƒ âKudì€xl¢‘pÊì¥tR u>ι>ÇÙ TóvxèXýÛbOú3®–.^E^«ø§Þ”¢õ”¼£ì&R ‡.)æõ{âØÛèÞ2˜W0‰W ”ÑÐ;~ôÑmfæòê`& u_÷õ\¸H™¸¯ûú‹×Âêh½|`~ sÆ‹AO®ÈÈ@m:²XC?$îRëh]Xu3*™x£#_Ýii¬á j*?§métú¥žš\í2¸ðãlÑŠ+˜ IõùðÄh4ùK礱øCžØëãSî¾âa$€.§~ÙÉpççÌ*r’îÈk÷Öˆp@µÀÁeÎ’&“þ¸ß÷Ëí¨+XÙ òÞ3® b$©ÍÔ²Ì, .¡ !&ÌOŸwè@g!¸‘|/ÇœÈZ.Ÿèÿ£@Ì–+j‰8ìiªZ¤ë9n) ±Ò UÍàQZFöã6ûùº­úPN«â.ÔîÀÊ‹ž1:mès*a?=Ò'Ÿ¿÷ÔâˆáT¸j œÑóÖEÿ‚†Rò‰¥óx¬ Q¿/›vöª1 ¤ƒ®Ð j÷ÈÔˆ(tùkÙ’Èþíí°BXÚc-bÈ™$ûÌÁÒhŸôÞ•Ùr)Y7¸ YÖ¤sOÖÉÔöx 8†+z±œx V?¹æ>À3V¯*׸«úúÌG"7¿.­÷a°íß«ÅÚÁV†3=½ÝïBå2~jJ+W ICå[pˆÝœÁòyÙuƒD_@F ¾óÒÇr­Jj/óšÙªYšéH;q?[ÏŸGÊ9îø´»èê-ëÕ4ËY6V®tÑ{/šÌ’…íïëGÀ`]÷GþpÀ[Æ0 ¿õÃïë¾îë¾îëí×/³À«gÁG0S…ò€MИ·º¢ú¤µ|¨ì!(V#}ôé–j`$P )õŽ¢-é~–àÅÊïöÒÌ'HZCdn¦Sb…ªÑÐñ,+cè”ÞE†¶€Þ)Ž ¢èa ˆ6vc8Vç礼á2%Dùšðr4ZI}n¬¡"ÆàÜorú)Zæ9UªiQ(ŽŽ}Å©þQ)爒Sì¢`Ð8»Ú—ÑqUÑb╈X`âØ…ƒˆ'Ú©çSÙLº;ñ sTw´ZäYƒ™ˆŠžZê_5ï½jG³Ô½ˆ\©"퉨ڔtõ½Ð3ÂÖjUËíœ6eÁQÝÏÚ‰ðþeñu:Q~ „fZBKKñ8ٌʄ+ïãœxÖ¸«{[¬€cµó[·ÍÄÎh«–o¥Æ^ÊhY¯ÐPu¨LP´è-æ¡ßa¼Aœ5:_Єq¶"l²q’„ș86 üB¿q]” @l)]|–ª>Ä_E«½æ âvmâyó›ŒF/¹ ò¢›eàCøѯ_\ BÝ:åF\õÜÙØ?\  S…¥‚È앲ƒëmÂß©0ö­â\Â43t'†üä—¼E8¨YA´˜–ytñ½¾MZSÔñsÞù­T–•è'õº [žl ö,©žØcNFù¬D‡f¿Êju„Ñ +½Al"ŒlÔkTÒV±¤Gâ*"ÞfØ v¤óÊO-€µôñÑ„~7KRx^ ™Í€ÓD'D=”m¿;>&L™èeÎa¿„%±›É•tu#;€‘~Päàÿ›½™-|Eë&)ÆjUj1Ò謞ÿÕù<áO•™+‰…£š ®±ø÷Ý!yÖĉw‹ÿ¨ùŒt”(XœÜÖý{¼<R¶…Ç\ŸÁq}ßAÿ1{éXUMÞ?Ž{óôûŽIû§[hÙÛñÒ†ÆU,ð†*ËNÇÃ4ºùí×M徯ûº¯ÿÎõÇîxâÌ}¥“ÓžˆZ%òµœšv„š.ïtCZ§ DàØE<=A¬k°¨]S3±€„zá—Oéö‚]~þòãðGýü¨§ûO›(®Lµ;éÜV­ú(4±'»£éBì£`¡Ï 5ÛT9À¢ ¯tîWX<£KV<0Î×z|ÌÃQþ¡šTHW„b‰HðG”ôñ·¡l„ÓÈûþª;¢\)@L§ƒ³ZÁœ†ýc‚!=EUÆàP–GJŸ<ˆ‘ý~.–ÿùÒKiÙãÚ’c¬m’)ÎÈ¢t!U†b†L:Ý 3{„;lñ ޼.˜×8ÔŽ]×]'¹ÃH «k2ís–óg±u"L•†A…&©crFq#ü9oiSŒâh€MÝSRåÀ²›¨¬YãY¿‚ΗۜÆÙ$rø¨¤—wô¦‹KÖ{òAO{ø8ÆSBÒPy)Ý¥ÁÉw½±È §ŒY”­‹si Ù`cƒÏbZK¤b£WT™Ûµsªu=K–ôákA(fÀh œcÇ5¸â6˜nÃå5èåy¤AÑ>àÍUø°Ã¤ž¢AÇí®KlÜI»Á¾j4‚ø¢t²O-ß0|îFï5!œÍ7¾†ç<½ÓùA!eÓMÒYF•I­i7œŒôî¨ÐKý:ú‰ptº;{[YµnÆê ß‚€º0fÒzžcþÕŠa<¾ó&ú×ýs`D ˜óå.syû ˆù2•œKS??P—Ÿêõ¡ŸXÝ÷u_÷u_÷õTò—]ÂQÕ^¡ö8Xðþ„§Â7ˆÂú-e¹?Ÿ®ÊûNÈ©«€§Ì`0k"0’°¹N-VˆÎÇH¨†"ä—žÆTâFxíÝ;Ï´íiB•(eéD” )ñ—q¯íûS¼**(dd…#ÿLŸUć!»†DÒÿh D] ¬÷e”½@„³+qÎP:$«'ôKJÞ“]" 7ÙD鸧=všú"Õ’`ÚÚt©»¥Pz‘ŠIl§[’Ét=Ò‡Ü eÞõ„Â6cÍ~Ž=Ã|Mî`Áj>5 ºî¨$Ú „¤Òk½%6xDwØA9©`ŠÞD? Sþ–Þ©ª„Mpœ°S=¥Å¢|‚ŽùRwžð®¡~2¹sBƒÈ–B[JŒÎ–Çú¼3pÓXÅLí„âª-Ê( JpO-bu˜Pk«2yŸ¤¥Þo¢“ÌÙ/ó"ÊòSXŒ¢„oΜØŠf—鄞§¯w!–yÚ[|OBAýWa3yíu°Q+Õ·±ò<ÛìvÎl”©^œ5\lSo€³UÕ$‘(wË î”ä„o|;xýÓP=Øv–¿µ²_ÛÉxµ°Ô4Kýä…Í øèvë+¶ó~ñþ1yyº¾«Ä|_÷õo‡Pïë¾þ-;^=>X‰Ã&4ˆ}ºÆ(ÃìÉ QÌQ+`L Ó• òm@ã>¼²sдt2•ìòÃßvD(Pø¶ì´“I=Ÿý6Á^'ZZ}q£E³¨÷3°0ªÅh§¶£©S&‡ûÙ*È•ôš¯Ùl3Ây¹oÑeÁK6©Ä,ýИ՜Î' ºÒŸ°É;·ˆ CÕ*àü|zó8Lƒ½T…À¼âäIµx†h…šÀ¯Q|`x¸À3ð|ýìÕ|k7¥-²¤k qH ÌQe…t³ºÄ(§N*WˆµUnèÌè`A6N¡¹ðS´Y†r„X :0Ë7ˆTÏ3`¬Å6¢á,4Õ”BŸÃéR¾— Ö[ è¼O³%I=ã(¶aB=¯Ç Í¯ IDATöJ팧óöWÙ#b½¾ j·ÒÍ>µ™³I·N—ik ©äi®§ŠEMèsTÙV"Uƒ;¥ï€±b*èÌà[nvG¹+y' f¨Wª+Tiµpµú±êS6k¿£5m±fòý¡3Mt][ý–Ùò.¨"Ý8Œ{Ðöªê²8Ñ{?¬CïUhép¬ã…zkoYÕPh²Šª‡’1»¾ Æ#é,;9°®O Ùºx7|ÜdªB‚œ\¡t¾Ê#µÓR>ì"'cøkj*Üoéõu³}€Óôj“-?ÆÞBçTG‘¾p2ßY†kööз]ÁØŸ+0Wsç]¸ðÕ¼²Å¼máz…½q4¶ºo"dæL7zz_Åu‹GÝ×}½q±|$š›E0EXÊóÐå°©Ì,31­h‘{Êì@Öp³·ñĔէÒ:é@ Üö'¾dR&\ªô Í£ÑI‚xAB÷¨™!)JîŸ\ìl5†½(éM›p/˜a¸ù\SÁ:WOŸÅë´œ=kTÅh·M¨B؈ì#RòŸŸ—'„ €X@Fuj0‡È1÷ÿÆ@GÕWè’Gí%q›Qþ¤êŸŽç)rÅ£…âÓ·_ýŠÀr_üø„¦‚@À7C¼|¿›t£z³£9 óçrÔ 0FyŸä\õñǽaЛT}‘üCì ~@è9f&Bþ0öŠC®êtb`A»òê(‚çdßl–T­l¡, Ý¢{Lñþ+ͳVÌ£HƒÑ2Š7©É¬Rþ‹ÝÂB=`#›„ƒ¬ÔÙ“ÞHeÎÂfØ—„UÓÁàw ƒ‰pS ±#Šñž'0X;ûT_K=Å:›å IÁM­‰I)F81£‘b˜)8QJ(øì:Ó‘Û—!SE…F$9µn%*¬mv룩þ•ó0¹‚ç}AèFDéðú22Ór”9.ãÔªúÕ(÷jÙU°¨œ²ÍÍ4î›`.'"9߯Êxâvóë®­ü›Øâ„Ø×Ëÿ}ëf7CÑ+sã°÷u_÷u_ÿ…kÿ°Jý8ÀŒY¶…BÕœ ÒŠå;™¡1vK!x@ÓÁ]6‚jÐ JP‰qH5í.ÑcßMåƒ ²BP¶½˜(ábLàAISòC6K¬T(SPszô(ºÌÀ´ ‚0¦ ±u—{N}™%¹zD䑚sÂ^«*„än&°Ïµ|9í³àaÓñêѯ,†ŒÝ   ÊÂKÖxÈO0VN|Ùìq õ7Ÿf¸–ˆ5PZ÷™‰O¾×úïÿ5ÉX™ò/¢V!‘Ä’”° P ¨`yËFœºÖiý¨á¦(Ê®eW*Ž›!ã(Lòä?q¥"¾8M+>ÉçŽî‘·¢Á ¡;o$†ÌH;Ù9ºê,¢¶8c]nJÀ½bºf–å$%°Òs¤y¥5Ä#i~lÅJá~^|nï8†Ë¤]”Ða²v ÏFã>÷£ ¤ÐµrÏÒ<Ä>¯ž 𖤦N‚Ûˆ ;ÃMh“W@^bQJsŒ¸†5pEæy…uIÀ÷'y¾È ”W÷ûÜzg¬  t´”»YcØ•i 5»ÛúS{¸Ò´¶ÁÞéÚ\€Áõý@¾¢‚«|äíLh|÷Û¡ÎÓÊB`œZìµÅÛoÆBm1û°aî6OáGõ%;^Äýk¼åã«ÃÎN5]5º<3¹^›g2!ì–Z´@ûåP;ßÍÝlÛŸ ü1Ø1~á`ñFpÁãÚ×þ¬X?¦Sý¾îë¾îë¾þ%×ÇüÈñòè'§ˆ¾²‘`ØÑÐX¬Eð´/×ÁGÏPz5Õ–5O@”>Oá ÔåÑgk:¨N‚mëwr s¬ØÁÛuÜR4¡˜ß“íða ”XÒ]§EŠA9«¾3,‚hðX©Ù)"ŸH3Ë(‰3ŒÅ‰&¹T·$({ÏC”ÌŸºáUƒÈÕÏjg°†;´4â,7ßÿ9”U€ö‹ÔuÏboêøƒ"èæàò Ù-¯sox‰Jɹ”6bPÝȽ,O! yᔬz+‹ŠBBIp|Jʰc –¦_°S“½Ê©3¬£ÓMv‡ãÓ1þm5½ ²T ESº¡ïºì†Y#+9û¡ŽæÏ «ãó(æ±(e_EhHd£ˆ’ž:–¶5dŘíòïh‰¡ÁÙeO2¶/.8Y3„î±ü™9ÂR™˜‡¨:Íýú8Œ:™ß¸‹¤Cå…³M$µw8çªF+¨z¤N¨ÙÂI£O,Xèàë6çb§Œ á±HRhR£G«ýrÍ*”s“>“\ _Ù\ ÞÇ•x VðšïØpˈŒ+‹nªwAÚ eDO¢oK”×`»™!Zx8ýÙg‹²•aUZ˜‚S/àꛘ›G“s” HÖ#p²ð\;&åW\—u÷¬ü4lÔÑbßL¦A.Ó™•ÿÊâY¨Ø¢x­üEt#ô/!îßÁµi}0ØP÷KÑ‘¢y"ï´É‘Øéó@®X2YX-®/›%< +ª;!ú\S_(€B˜C"Î kÍ,ˆ±çhì9ÊÁ§â™ÜGXÝä*Ý«öQQ<#(`;v^qt²,8ZçÉ૜v/§ËóþŸ*4ÖßEüŽsêaQÇjUï½l{4¡idSE Ì–ýé€BvH+[Tz –õ;Mš}lFQÅ.[(bÀ)p"Šcåyº&› ÖÐU=Ñ"ÚL¾¯;#ƒDµ¡yµ„Ø:Yó À—©6rš”NGÝ]÷jiw‰Ùoù…ÓÒærƒ 'æFŒÕ1‰«T0ù*Þ1ÿåV‰vX/kÚOÆ&Ç™mŒ¯õÇ0Lžê¨ …Ëi@AYÈãÇWñh.l~l)Nõka¸K ÿZ•ú»ö]èÀÂOªðÿâÉ€ ´ûº¯ûº¯ûúæÆn?¿·x”%å<ÚóÅúMth ~$'6†¢«Ë’^$W4Pûÿ¨½³²ëN¬ßg<ý ”éË–N‚ì#:7]ƪ§]¡å/+!­t¸Oì8IBuWr.‡"-íží ¸qZ@D©̳ü³7äpO˯#@u&üu?¶Î(@|`býøÙ’Ð("š@î©ÝŠT+(ly™ûic‡Fÿie ?]£R¶wÕKÞÂIˆ ¥ ã$V·ž·q; )†#ÂÞ‰ÓîDØÍ\åúDæÓ©ªŸ‚ø²è5ôöýõþëüËlúQ€–™Ë¸3Àõ£T[愳}æ³,:´ŒÝŽ£ÊÒ85ªŒŒ¼¿nûÆhz 3BºÈCŠñù6ɦ·Æ} ËŠ „ nêõsÉ«ou #ÔKeš`|ÃÜœŒ\ºÊ¬Ñ²§ÌÏ)}‚Ýqh Až$á@oì…7$0 )Ôð]q.¥¿ÃÀÙw¼EE;o±ÎíÌœSW~@– Ø«Ûwmþã:÷æ%ËD}Ìw+h‚ÁU`±Z˪­’OÕ!‘xilë¹ÿ6m\ý> ÃmÌÔØ‡ÙT':$mªqÝ_!íWúœêî‰íC 7v¶³'ÅNFU6;¾àçѼåS±“$q\ÿ¶Õ>Z¶h┪·!èåEMöp´ómw‹]%»ìÐäsOX~G'|”RĦù˜%šZbß‹—ç ìaâ‹H«°û1lb sczc?x'ï»_Ü Š(¨m)l„ã®Ñ?{]*gÜ|íûú-ï¾îëžíËëà o:‰¹ËûaÁxPîú­°u&épºŒÞÎÇâÈžÊR)øÝ1´­‰Ô·èiœåŠ*ìcT"›*¢–D{"1·arcH´¼ü‰ Ca»° ¤"µAÇ|2 P&Ã5Ü RΓp}!,UÜdà€”Sï&ïÒ,ÞlÂÖ'šžÌ¹@«!ѳÊâ?ÐiNjðDàÏ#ú¡‚bÑ,AhL>ÃM;*Ë­Â9xÓcyø’–ÊuãVÇ.óÊòÂ,¡Ì|ªLž‡ÝÎãQ÷z:±²$tÂdA<'j Ñ99ƒ êj°Ësœ´gã—Ü)“)HÑP3’ªØÈ×-ÎÚ-ÙøUÔ*”•.œ¯-«J£œ·õ(øáJr'mJ§â¼¡9N9ó•µIÅÂÎW[|Ï ÚŠ@>ƒ/±-ÏáhâÍÀÍmJÙðÜÄoñðõ+t§öÓ,òyOö¾Ð*Õsiëßí9Séq‚Ù¡,‡ƒ¾‚Š.ßàVäÀÙ,îÅYÇ’#)=Õ,†´\ ,á‡:di¤Á’ò?¨ZOÝ|OÙòï‰Ë…À÷Ž-䜫ƒÍ½Õ·†ë,u­LÈ•Êíá2¼6â–ýû`5ÊÇm-î¦ÐE»¼K¼ O§ü™Ûš0w¤ò‰ƒ»o·q‘‘m@Ÿ/6Õâ½´UnìÒìí4¬[¡P“ë-zë%J¹7ÿpqª,ÈÕÔ Ø©¢EO)Lÿ_Š¿‚eÉâ(ù— ; ~ý˜ß×ß~ݳâ¾îÙû–ëCˆ6Èd#¡öÇC<#ùwö”\¦œ¿\ç*Y‹¨bÜy z‹ÈY–®þwÖ„‰5 lDŒö]ÿ 2Äèò¤ûÿP¸ÛI>šK"iÂ9: µÖ¼SUò1dùu¢Ç¼FJĬŠÓ_±C)¥\ŽwÉžž™^7ú¦®» 㔸ƒHÔÞ¡ójΚæfN£|°²ø”úl–¶ØyL !Â+>‰XOLÀ³GäÓçùßHÁ⚀Á÷Oˆ•iÊyò:eXžÚ?(<èºè¶»1h±Nàk$L;[ÕC€[G•¯í6XFä ÕÇç•¢ç×´áSvÞd…Ÿ>mgÌ®ë4ûš6QUÉÐÁD-Ü _F¨uÐÀ#ãqËÜq»¤:8À)¼\4‚RÞ¼¡w²ùaƒ ¦ú.ݾَºWØQºî1F»c:Ácb_Ìø94³õfë+>9m«JZ¯‰?Ž`ö娳oDC¯šÓúg¹ê·é?Y7r´h0 Ë&Œk —öêf´/b'ŽW|çÍÕ­í­ö¾ýnan¿Ú –‡­g© ò;†î6ßàüwâ™âuØXÍE §´üŠ Ozƒ±¬Ç÷$–5Ù¡N‹84¶ßt-¨¦£ ìí2àÌIu28™iNÎ[»™Í2ŽkÛN4пËõÓ&jx?Üжž`1_.-V¼cl˽ð››·€ ú í¿ÔL‘õÜ×}Ý×}Ý׿1Ê— ´~âúðñ\ ¾ø.AùÉI™ŽÉ§ÙÿÌfÿTÕ‘ªøÌn^ˆ)RKo4®1hû>@ÖRq"YøÎQ"ù:;2¯O$ÈwhlºèDÕ £úÍ*ya¹K1}5 ® Îøð|C§ÒCdáõPdBÔqP¡F˜Ò¬ôj «s¬Ã.j¥þl¡v4ˆ°(¥Â*9XÚÏÈòÉ¡®•j|´mK ÐA']ú4mÊïœÿ ´gÂÑް”ËøR‰b¡ó@êŸþåº&Gô x1ƒæƒá>ó‘²f)žd³ìÊ/mïk*LœÎ V9‰7Q8Û,„·h‘Óy"#Úð°Ú<Á›è(ip4h=‹´a——u6’ˆ*§%ôÍ ¦ "œocBàUÒ((‚f(¹=cU+¼ÇM¤Ü#Ì ”Ñ‘%½ï$¤.ÒT†+í_"ÏF4;OmsÍpdšî…ŸÕHŠîGVr/G¤˜c«Ü¶§ {¬Ê *ër^me׈½Yù#×€Fhð³—1Ç\Å‘Üjô É³ Û.ãOqä“R<®ÀQÌŠ‚WË!/¢9hÝz9Q>IØ1£óÇòΔ`}z§mCÌDVQ=ËNN#á‘uÏò¦ÜðêkSJ¤ø `ËãdsX“O·çf»\ÆAùYæ‘#xCw6b*¸dâ°k·² ž§êBz¥øÐ6 ËÛÞtÿvCWÉ/"ॺmr¼¨ƒ´å"¨*x×z}Îÿ%W" ý«M~9ôÓ½ïë¾îë?{ýèøa‡Âu(ùpáMzñä,\¶FùE~Ä GÕ¤ª€óVõ¾š,6ìC7Fb/U¯mfÝðgçj å­q™£dì9î-RÒë*PY“¨^Dü:å3Û=ácª 8ûßBDÉ,b>, ZÎçÙº,JµYé78S7æb±MDÌÚös–6”IîáÕ®ÎéÁŒÓº4,éP3‹Ÿ<¦Çi¹AŸC9*~x²ÞçÿûTùóÎEª–”i$s lÔ?Nw⪟úf"U?X5 —1I‰“"Š ®œ$×Å‹¸# —Ë¢t¯BÉ#j¦n zÄhôr±DM©yE¹@ÏHˆÎ·@7•b‰ÒJÙ’Ò:èØ‚T ?3æhÕ5Zî–ñ3».1®àŸXIBólðÐýÖìsB=%‚¨5W'…ÛGw ã}‹ÁΆ鱑¡C)À_^á¤H÷µ//ˆeX&µN¾.É7YSmmM’Ø—k‹ q'}RéñS0·óž…ŸÍYÜÉíi,”ßmÚ±o`¢ýÍSaýy¾æ¾X.BžÊ@‰g°s¾ š Z]eo†g¡)ð’þô6î™WfrtMl–DS»iºs)Ï}·/µ„i-P?ìê3!Ï’F‹2¬ÕåÇBÿ\¯¬<9/A½¼î½öÖ*c«Éh:ǹØF°ºÅªë26|yŽya‘]ÆS05·£/sµ[Ëü¾îëúµ¯=u_÷õ'Oã?äúH©¦`ò2È#f˜sC›S¾‘‡Þqš' þ¡) ’xQÖŒYŒžM¼zÞáà 8‚ƒäG»‡kðŠø2 ÀZƒ>(ÿ€„rÒ$Kƒx¹•Gô&â$hD úvÜìõZN»N„ˆ\ k´šž«l ŸXî@>¥–ËÈ 1l츼ð$ðÊÝpLÞ¢§QS ²{PMn,vèeuº:§u„ø®é5Nºy`ÑyÕJ_Ž =28ñV£‹S1¼Ç§ïmâ ñáÄI¢Yæ^£)M¬/,…®Ž°´SUƒMFø•îÆ2ÊQ"JUÏ´—ž´úê?œ aÕ'|Çù(Ø$½OÞ*j0ýJ©ðjOÀgÛAÿeÎ_ÌL‚Œlw%ûEmň¾rÉi Lv—¦BO€ºçûŸ>0NØQüs,``èí»#‘”0€e*­T•1á>¯Þ>¡«VØðð‹±qêI»X&ą̈²Ýélª°ZnŒRšï­1èÉl€e@*×NçØÊR „‘ ÿRè\£ú)õ·ƒ¾\g²¦&lÚùÅüƒz^÷páoCZ3¨út¸†ô©n殫`AÇv.Yc†ã²,/%JÁF™ˆØõ|„#)m€˜*¶µ·˜µq5Í)>G·5¿¦—e³€óJ3·¶ uû× cO¦lËð&ž²Éù¯k»ùÎF÷¦¡ù¸ßr£šòžáÀš¬ö|ïë¾îë¾þšëÒîýs[ý‡§ °ÏÄ<Ãô(&B:mD”µ‰ û` Эí`Lݳ|Q²µDž]…ƒv´Ï'‰íôù`øe‹‚ãþ€A?éÉ8d4ÑÓÕ©†¦UVRä*ä­Ù‹ù5Œ ò/è ªàÎ: â—4 ãK Z—hÑtÿA 'ZÈã4•€jäÐòÝJÙF*AI·¿à¹§˜°¹–†€Z‘n0]òÞk‰>Oå½ée73do(š×éF€5¥ð; Êó“ée|Üè¿¿m?g\õ%Ýy2µÔ»71`;”‘q ²ü+ +‰ÿ~Vœêêç.a^b^*i0¿uQsªz©Åʳ¼õ²êbI-¨¾#iÆ2œ#èŽ1ë v6u‹º®ƒ`¬’j*ãK*.'8›¤Õ*1o§ èngØÁD¸ ¿V%–•›‡JíEºrŠÓq#îÜ{“F‘ ¬Žâ™:Ë%˹†¬jõ¢é¥gÉ‚Ë9Š˜#Ø×æûúÊJÖ2ËŠ:_}ñˆíIUkª(+ÖvP³Ô3Á‹w^¾xé&•ªš;ÙÜ™_'z÷ò£°!Ž´bòâšQe,û.7Û(¸rcÙM~ûõÌÇ-T1hÐYï q·¯q˜¾ŠÝÖŸëX0ë–‹&ÛØ3s¹Ú)æÕ ?›µX£;Ãõ<‘ã¢àõ ±@îëùH‘"êÆ&|ÿý& Ð4Ý0hq°P~‹ôð¾¼AÔÑá½¾|«pi+˜Ä¿¾ðë¿ñ&zß×}Ý×_váÇ~ùÒõa FDŸ”šgˆ3ë'2ÂdViÝ,´¾CPû„{žE/Ò”ì†ÿO!²ç¬ðØcOHzI–Yd. Jè9%p儬Â\bëV…–J²Ù ¹°±\R±>qòXýØ>-HÆ×0×äY3F—™x(ŠE;òDýle_¼N "Ï|­L9QcÔçe‘ŸæÆ†èóœ.S°3^àØgdÍ(e€JÁöФ7&ó‡YbÛ«ßäå äbPÊ{«™d‚ò­ô×Õ–BYåôòuí ¨$©N¾ÜsտܨñèX½5ïvŸðt =_Ï(Qûè!661Ýæóh¦w‘i hõªŽ2ßòçisæC#&6E¾2žrRy©ëàm‹o¯’-FÃÃaÂQœÂ&Dö4ÝÚ±‹Rl>õl• ï9OvQõztµ¹Ä·ïÉs×!ÔôüVä­Oš(d·4I¼Ò2_WI¾ô‡BŸ0qïìÖ‰ËdòP@7d(Å¿.þ7—îŠ ¾šèÃ2Qt (ÄœQJžÛ‹ ú–TõºÊÓ2tÖâ'ȯ^€t¼^龞­üãñÁ–Týk°òL^_Õng¡š]]Þ£zX–phR0ÆüéËœ{уªOïóµ¥ 0Ó§y÷Cî2ŒýCigÈgú!H4ß´1N£êD ê:×UáyÑž‰h1(•ÍÛïDK7vz²×J’ïKý©Â¹ù¡™þ5?~ú–·ÆKá¾~ä9ù5,Îe“VÛ5¬,9Ú­ðÏ­x«¯Ü×0 힇÷õ/¿þ+àÙ÷Q„_¨pCTHèàìŒ@±•²ió„²øqØÆ¡‡ w`6\õ(ÏÙFPß “bá×°‰+3ýépõ/Õm5Ì”rÒ¶Ò$Eƒ\œû°Ã Õ·AL‹3!¶ŠÚ֬ʀ@wú' RP@~qðñãüÒ).OP/e†PQ#˜šÑ ”èrˆyéSšzn{Ó>tã²Ç"ÉšŠÚO5µòñó%¯‹æ‡œoþ“w¸iÑÑý'r )¶Eì2¬±¢ìLQb ÏšYåÑCuà¦`~â,ÝÉ4øÀågÀe^äk‚@³ú+‰<æS5ÿÑ~ À3·Þ„þøõ¾îë¾îë¾¾—üæëÃùõšÉT¤ó!œ„ÚÞ#1‚c!Ï&Â8ñ²ìŸyˆÄV €Ã_2 )r•T…Šh§ú„ž´ŸÎ¨Q€ÂÅR‘ˆÆwpÜX/o‡$´ÁžÈ˜TgÊ—¤†gi å Ï®c 1rKYÒ4P) þŽíõ—Ì$Ç;bte<Õ6  •ù!TèCx0Øè±Í¡BpOòe3«}k<ÉP¡Mq^æöç_=ÎórXÈó?¥š@¡ÓžföÂ#ÏcXqœ(pœ˜Ü IDATÖ`±/ ¼ÊCë€cUû|©R]²BNå¥Êe$T«ˆþŒŠëÇY.]áÊÑ“D7°ÎâÂëÚ§–—SBÇ å¹cjœ‚`ô{,Ç[Z¬9ïä©X*@cÉ›ðM8ó87²fŽ·¬€:š£^û“3wtUîöðÎÙÑZÝUáoÕB+[rƒ¨],;•ØTgØõp â2ñ‡ÔC-½%vi ¹ö:c¨Ân¦äëîí˜'.âBÆ¢ŸØ®BÓBµè¾(01%$vó­ØtÊB¹T-!÷´ SºC„óùƺm-v˜·Gç!fÞDví:û&Xq‰hO ]ýpX Ã­ o·«`{Ä“èhOdžQ^ÿ-nòÊ3;³b3N¨?Æ,_Ñ‚]÷\Çm_‘ û?ÝßôJ„ ÕÉv€þÙ~Îþ7ù¾=eÕ‡Ä"i1qÞ;$f¿&xH/íœBé'á`±ŠØiW^´+5€K¿ÿ§]7ùú¾îyx_÷õo¿>< 'A䤷ãõR;,˜–áN+^µ™‡A÷CAâ*¨è¤Èû²va/õ{"SC¢›’MlFL¹fÉ­,£ð‰ðÀ)¬ ¯ŒLjyÀã <œ@{à« à„;FÆ8slÂ0²…’@š]hx'½³Ìwž[i#2ž”:Ø”lCÁÁ,VêFŒzÕ:Ø,HÃ{‘cØžÔPÝò9H÷)C–’ã +ÝûÏM°i²Êô]Ÿ üƒ_èÿ“ö`èZv¾ aÞ„ƒ½HWµBQ³±ˆ’é*£ÎaAåÜî@è& :¬¿JäKÙñ¼ À=µµnu”ù®ìêÙëçO¥árìÛVX·uE Ín“5ôŠ&6Œâ»¬Žóž´éÏUöhîEé¼³´Î$e®JË A[äÓ%y-Ä’|ª„åÊy|}bã×ÿI5ˆ.ÔÖj3P;(6P’¸G ¥xÌÍ“|–„2,áÊܲn}gP4vZ‹â]žÄPxéµÉR©iÇPÍ£n`4ؤ+OT°ÑîNÜÜoWzÁ·ó;¦€’.µ¸Ï¦Ãçû3×üøgoâÖÜÈøÞ³r¾ãÕ äâP€â‹Ò’Ã^]LøŠŸÈì¶E¥Ö w¹ƒH3ÓªÓ ‹…½´3h!ë„F}ê– ‰Û©ˆr¾±1û)ÃlÔ¢¨×1Þ¾2Õïv™Þ!G›lãïÝ®|§ëî•=’×ï ¢üò°ø&ƒïÕ~úɶYÄnøõ¾~Çu·¡Üןsý™U¨Í»úHÁVÝã½Ø¶“Iö¡|Èš™¥ÙÇ1H¸*®šQ*flUº'Ú*R2w7܉ÇÄ¿òU%Œ“X¨˜Û¢q ‰9ÑrÐÕøºè8ê5[díÄHqĵ§ï1€õvWûIñ~¤¦ˆ….JT¥4ÌIôŠ0—`B –=†°Œ ³#ErH‹‡ÕQÔxƒ"óúÏ…ƒŸ/NPŠq!deyYÒ U•tu*ž ¥GÏ`zLgõ¡µÇŸöø¤ÿÓž§œ¾þ7΀AÝKŒÊZ=1ë”öÓ)‰ca:ØŽQ–©Êh²@{ÿgïÛ¶G–,ÿÿÏ:[˜‰d\™IY®ªîf®³fv»l‰Ì{ ¹3ß~ËSq~åfí1´®£QmÆm\ðunµzuWâÊb,êÉøTâªIõ,B® eðÝC.öüë7EÆ©— +g6Ó®_„úXlŬÑÛ «õÀ5ÌÍG]õbÔ*Áwpä^¥2,Á¨–âmoÉð©h50p+U« C“›p…¨Ö -;\!ž¥¨ë8‚C^“úíÒu¥ž<kE2A*_]lNÕds峾 ʘ@ýù´`ì®´1qÜkù)îÑX1[cUÅ¡k^6Á1€³åß2—͵pä &´%Sî`k·#Øâž5AKmÅyÍÔºS£!G¾½¤êͧW±´-½>®TRóÒ'¯øëNíšÃ„Yÿ.<á$;† ]–}Ç-ž˜û‰e…ô+ö»~ +åÅ©2ÜuÄdzz|cþ~ˆæÿío§TSÜÑùº¯<l˜û{`$›§7,{·»Ýí¿ÚðO~ª¯z>úûœwÇMšÑG ?ÖÎ=¯ç J:zEK‰ñUoZCî°0UŸOËø¥ÝœûFìX¹T œRΖñ” {‘A¦ü”sñͲlÓßW”xÑKneÚ섃­bˆv”#?±fd§ÐxxYêB© ª;ìB‰*w4–AT‰ñÕg¬ð I/3µåè•í‘eä%QQ2Ä®þ»FÜ| ~¤+dù|³ ¹ï5C^"àh¼ScT–A§”fìÒ €¶Óø×'„Ò'³¨#:¦žÅ"GAÛÚ°;æÒ¥ôæ;k¤½'åô„6rLéM©¬]‚™SöuÅJãºGÌ8=w(²†tÝx ø”Ø,„Ie¤$Ç€©% Z$^e¯€å˜ OÚ8œ1ˆôY2 ~òo7Ø%È^³%imEjz†ãVz¦¢´)aãäd×J²Wµz`;e“ û{ON¶¶ºà)Ý–EŸõŽ´`#Æ^"øÈ²3–hl0‘üÕÈò@î[¹ó%XÈw<,@$¬/¯bM‡¢ „}Zm¥ZÌļ?xltfÁð†)éPaiÐõƒ|? >¢…,/|WW9{ ¨Aqo½`U3%ô-@q^‰\ºØPXïL)•§8 ¯ÎW¼1û»ú€©¤.LKñaÇ%߈Z 8šêÜ|P€ÆÛü›ÁØ šm‚Ô+Z{³ÍJ®¤ˆÚSF­° ¸f·6–$.yp´ÚÞ#rf÷¸rMzg‹þC­({§…°_?8wûï ®·ðÝîöÍöEEö´‚}WXDSÝ«6%Uð]1)]vÕ­Efxá´^6Ù·ó)“Ä;}X‡F—¿¨`./&Ý¥³ÒÓ’£W{‘*ÔRÆ<ú//|Ï.z<•èŠTà*ÉïòâèUkÜUþ6A™r^uQFÀzÞŒR$Þ"ÕË‚žÍ{8ðnÛçç®`£§|{½t«z^ˆ¦!7eïJž’ò–]Rœ_H{0(qüÙ`N,øøœÇ‘ëbHœø¯óO›òš4}S÷ù.ЦXÝAâ«[hÊœ_¬dg ô ä×;YÛÁSouÛF¶Eé ®èüŠà)Šbë$/8$«ˆ×èçý‚m8­Yá|¯s³ÔJ-…³oPÿÕóÊ¡jP2dP^<8"Dè¿Q8?¿ÉGÈ"+†^†Ú)hÍö!XW8BËÄ"gÔ8Æ×õÀf¹nÌwHƒŠÂe5¹u1§µoµE˜] >þéøš-¬@ÛًϨ(€J!¢f\dÅUº7!hâ*[ÿTJÃþÇS)óÁ}¾Ç´ÊÖur,Vcsæv¥j9˜QXF¼„.€mX²am¢ƒ¡Ã ™BÈÄÜs~&üAl-eµžN„ÐïHl•‚84!àµPý#'ÕTßò2 }È–þ.èÆÔ‚âÌ*å‹Þ(–b£.õÞ"ZÙ-”w6½øàÜFš±Ëjt,ýÛ°+ËøûZ"ôáü¹Ûn÷ ¼ÛݾÙBÆwˆq<¹~ˆB lnTâDl,úo;iú—Ú#ªÛí¡?+0h6P#©¸˜Ä¤, é Ü%Ó×é£È¬Ë{PÒšè.@ƒ!NxÔ»{(Ù«  Ið…u:üúaök·‡¥5Â=JÊ"ç^ùŠyûœé¶æ›ƒ^ó1ÓàñD{Pa—¶'ƒ@š(pýfO»¢å²èjxx„Añ8B–¶÷ýÞÃÛA)öJAv»§¤Ïü*š0’1x¤ðˆößÜŽìƒÃíƒ +%uŠQùsÈ’ÁiPÐBK, Ýp;œÔëçXL#eJ/”mI¡rTr"µÓÂw @ÂbSòIQÉ=#&Nöäñý&æäňé-þ±'/•\˜UûËUD(À÷dXFu}ÕÿœJÛ­J •‘6À•à S]V{¨qtzØà5ˆ23ú|àÿAPª)ýÕãÏC‡ cÊ0ôÅR¤Ö `ìUªø3/ŠÅrLc©q|X£³W˜p=+9 ž£Ó;¦7Š`°Ç9Ê]6Ç77ÎÅC8•Ç à½",^ï ¬(ö»ðMÍa>®¢¢aHð¹°•ïÿæ…¼ÑLñkƒxé1ÙŒÑX‘\B–°v¼ŽuÎ…=gkí=ž;‡¾ ¼*ßAÂ[w«þÄ65þö4ÇÕÒ(~¨Œ&^3„ñ?[öYù?»þö. ¸Û6Ì»ÝíŸÐþÔþ²N<§`…ðÞ˜‘²¶í0£ó-%Dè ó….µuôxª¢—‘‡[, QãHøÕ*ÝÄF4ñ“ÐYa èÙ—¦;_’G`î°¿ô|fu«é…àKP¤ù< !*Õ×Iл,œÅ’1 ‘=  —{c¨§ÔEþ^³>Ê[BK;Lj}†?v2{Fô|&‰‘¥îðM¸êЬCíP‡©|2Ã7±Œ±å0ã\G´ÿYÖ AyGŽäò>(pg'qŸöÌ:üÏ{çòÌ1´°Å"#ò Q©dõÎûþèÂavçðÚ5hE*KBéFÎS¢Ä6h‚Ú„°O)™(Io‹ç§½dh¾2E÷¥9Ú/jð×vœ‘²Iz±ÓBˆcx¦¡wM??˜yV?mÃ9XL¨(ò!%OIÉ»·¸]Ôéqþ|i_Uª/µÊ£“gs¨öÅéú{2¸õÒI2}Ó ç©º@(Å yd¯}'Bñä2búàëPI`*/¤›òC)¨*ÔÒ4–ÒŠ`Õ“À‹<“ìÅä®ùpuZ½kŽHR¢ú…ow¾à‚“zr Àºp™æu tÌPí)D‚åïZ¤®º2¢ç+,‚¯‹rÛ+ȘÕ´l hžÊüU¼†'Å]‹+sD)ã­tÂÛc¾ÄžQ‘?ÂLÿ9T&ô=<(» Cy)1À·²6ƒºU¬/…¡­÷g.·åëCõ;àcþ®¢™«GÌÇ àRà£Ç.ˆeýfÜêaïöG¦ß]p·ÿrû¦Ðà׉yõ–Gã[&"J[%ƒ« —þ›ïbÄt,ÁýO1"ö‡QŸ‚;Êðú°Í Ñ+#+mÔ*la áPØ1‹$,ÈÛPÁõ Ì^?ûRõ`™@÷Ë ~†'Çœ¶Á ô劑س ’[ÔF”V2UCóØ0]w±'p³U“ºs“{.НiÉŒžž®Ë<‹T’RÊ F:?k;“Oà\8~™{0=Q¡5ä%È»¦?âÇñÞó9ê4½ÜìUÐã“£x†?’Ô~ªeî«*}Ø/ÏñuJ¦¼»ç{{'ò)gK½È‘wž×PKrÉûSq"Ýìd³ô'¼š–OQ@3tU&¡NÁVE!â©‘ËÒåíÓ-'³7_tB1ˆzlõ›Ü]UN*Y¼1.ÄmYº¬iëÅ{dYH¯É~{+RHÙ赈’£äž“c¹?ò–®Æ—Ô¹–ªŠsÖs¨âB”ñ<ý\ÀRÜ60›Ù«m#ÒIÉ(6‚RZçˆ^õ>[ïP] fþ ʵhÅÜI-ù{Ž„<’Q0„™ª¸m; ¦fäüý®å® #LŸy7øxh{ æ6I~Kãí©¥õ¾{ü’WS6Q³"œrkæNÎÇÇ;îÛrðäŒ3äÎÖ¥¾âÈv ‚iä…U™ä —f-ô¹v8zSú¥aÁ@¼ {¥¯ÍøÖÒï–7œÀ;i,cY¼µ%þÃÁÁo­K8AÎ>åÁÃñJ2E£×`ñg>óÎ+Üíž'w»ÛO´/¡G¯Bzª;sT€Cp¿9ð‚F§³=²‹ûëÂ%é`¾ïƇ/dÖè¤Û²Æ">¸ª²q÷Êð"eu‚X XÉ b)æå†oÓ@4 Fˆ°dõŒÞ¯ …lÀ”x??N3ÓvÚ¸>O˜ž“íÂ@P @Ò¡}Q<¢Q¥Û9+FÞ‡&þc×›βqo/!âí}ÎÓQDýÚyújpw>8¢Ó^txD‘Ÿê7÷úýÁ~‹!©ó²jplb†>E‡@³ä`,"z‡Hבä€À¡«rˆ‰¢ÓœÀg œ¬ ååÞ9lÓåüX&£Qm ªÏlAu4eÔ£è(T ~êöäèN¶¸³ö +:E±“E”Ê—ñrU°IÛBV3ó²TÞQJIJOšG*¹9”$õ6šÙ"Ôûˆ4|¯*jž¨6@†Ž<'§{l/Z%G®ê­û̄׳FêWØQª• UTO›œf©âDè 7æTÁY2X:`+`®3B°hØSñšóÈp¢C-ßï$ÕÆZ›ÇN /Õ¨‘B1¾öQLæj,˜äŒŠùs2¢R¨¢XV’GÄYV˜·5ô.» •ñ:”|àÊ¿AU¸Vp ªc»aþT?óicEÌÔÁ~ô!¿MÇ 3Øu9“A6°ÛH§&·ò¢SFS£¡YƒÇFÖ­i‡?aÑ\–z3m Ámt·ÁY@Õqó!`)n3Ǩ7ŸUP‰?¿¸*Uk]ɧ«ÅApÅcêÏ¿ÿýÈ–©§"?Ókߺ&þc•mÛ¥ë9„ëíÛ"B7z·»ÝínÿÕvìó_þÀLò¾•_æñe$¥œªòzDGÚip)f¡‘ù›9ÜÝE~!ñ ÏCG(ò ÇÅ1¶,\Î0Dœb–#™‚óÿ¢©9d@6CæHôHPÝî¸`}›r›ô¨" ×ʵ(W%÷&~rÇÍ¥q©#Ô¸SrýNý}·'ç­&u8+°c¬±_”úƒCõ~C®Œ9lôLÉhÄ]ïâìá×Q;r6;sÇ·#&`êZ†e1<}‚-&3ÎçßñÖ—uîI…Ö­g¹“IáÙ¸h#ôÊ2J›ñDzPÙá ËÄ=ô„÷ä}ÍXôâ´b[]eÈ„;‹dD %;›S0†‚ö*e´F×#"¨J'S¶â àk;{ìzîK[“ùÈYN„ÁlˆEZv$¤ f¸³ùäÙ-ÑîEbÊ64#Ìä©õïˆVú_ìU¦Š¢TtÉŸØr¥š›dT@,à5M»…\£d“ÞÒS Æ+¢ s,£q™o‘)>gjª‰éÍ,%>YpN–‡ÀˆW‹¥E»°˜[^Päø j±¿bBV]WìþgjÔ8z« -/ÚdáXÌ¡"¹ÇóJÇ¥Ë#æ½Gí-ŒîGWìAuÏ®J-À¢ïÍw}¶àòŸ‹ É[X2† 3¹8iüúß,Îø]°÷·Ö4–æÆBÀOQA[ÂÅouoµ ÆôÃñÎ âêüåOŽëÝîö.ç»Ýí?3ÿ¿óW_^íª Á%"@‹ô}šýÄø($Ù³†O…žàEcfôÄvÈW@ph—™’Øó)0¿±e§ ´÷­®¢ÿÀ+ƒ3-ø(®×n`è\[}×1~ ¨Ý\ R­Àá¨|è'P "E­ƒqd‚=UÃP!ªØS'ÞÝš 2•_˜"‡&' óçeÖû™£ü{àø`F§b¨´‹OzIQ—à‘€À‡·Eå)ã~þë^päf¶]‰!A´p awÕ`KQÜ¢«« ìa†-(Æ2ªúþÉórò㛌©‘á*¦béu á33åL0Í€H±•ýùˆE&WkLÝ=<ø±‡E‰ÞBAFÚ“Oq*œ›U¸Ïè`aå’ǵÐ(߸·å²­6¿AÄylóPvY¡ÿÜÙAc gø½šý57²Ùœ\ç,í¼g,+û¿ŠxœK³¥³Æ¢q [cÒGZ€'85ìxn)M¨|¼ëÊ̔˂Ô#/éÝCA~:V/¿|îá±2Oî•ë\9¤¾¬\ÑiŒMaÕPý³«I­¶¹í ØHa†ókàÏ z‰ –1©i~¡+BJ­u]¦PÅ⃣LUØ‘é[°"_ó½’‹ÅϯÌ!ïÉ!û«Íݾ5­¾o K[^Ýý†ÃÞ³˜<'Ô -Ýîùʰå=‹ò[常ð£{Þ_—wè|†'#ktêëѾ[7sõïÿùÈ(îÌÅÝþø…ênwû—¶/‹¸!úšJ¯¾5‡$#Çœ xŽÿt±ºw”7¼Sw…NÆÄ)î¡pTa…ôêÔ0e¥è©«òø®»¶—rŒ¯«V䳂ƒþ®P?óE·UÔ„å‚1…}EM“!²ž=ÏS&ñš­X· 1%y¡þaM-h¦-u”¡]¼ªd¹Ò6±Ègä\³tÚ6Ú¸Ïᨳ ª¯“Á*OðHΙóí¼*ÎÃ6˜áå©ûùIþuHlèÈq~0Î|©éä2¦¸xt)‡-¢ÆŒŽ†—[2“Éžû…œ:R)>b‡IË\¬ð¸™!¡UWXôÕôÔ°‘)˜ t S~‚»¢Zr®¶]«êÄÔu½ä½ÆoŸ¬#‘…]š!R5fEËË”å5†Ð’«çH%#‹cºj*Ð0^Þð]† Æ4@~x›ô«sK7ækRÄ,2óJÉÞËu³º Ä‚3­¿3¤uÍôv’¦ÊÉU˜3 &ØHÌ]å2TËýQòuÙn„¢ˆMG0×ãöCJ‹ ¿fjYÅtzá)-«dLHÁÔÆïÃqüœ„¿ƒ˜ðò-}ÈgƒZ^ü…o Mãón%ýÐæÕ˜õ3ë¥+‡ƒ/ú†zûïNÇç†?ðl‹.+龿?@iñá Tq¡Viµ²§ß‘þ V5©ƒâ¿NSÇS’ÖÄ#„ðç;£ÉÌ?Þµ1ýÛFþFuïö‰Sènw»[n_Hl٤˥i<㩲‰téI7trÿžé&Ù÷ÖŒOYçÇ!ZòtUõÄvôêN™At|5©þéÀ‘ÍIO˜4·4 HZ.»r–½,JatŒ=NOq)מ'ËæÆ¢†QF¾,E|žôú,ÂxKৈD`áJ;¸ÐBccÄ"dÛiæ\j¹´•4ÅÄ]`s2G¾£v6=sß«;Ü“‹1”¯õ`yÛ¤œ\ÏÙ)`1¤Ó—ÈàÛ?Þ˜t‘1AKˇŠ+K¯šš,þ-J‡ñâbYÛuµ5ú_›‹²X ÿS`B9‚œŸ‰£OåŽü ¤Ž ŸõFvßþÕƒ·»ÝínwKíË6çÏY+fšg[ªîÔÛ²çÔ?B¥( =5åq‚§^ýpBÝ” IDAT3  êR˜pêã*Ëš9$2Tœ¦©È 4bÇ9±ÝY¨œ£åî–í»ï VpéÎW”]YžX-egŸÎiQÑjxüuDã“")àÔ’J<;ŸêÛ'vmI?½¢¨"T>¨€ cߦas¯;æ9úêc¨¬L6QtZØÏÿÛÜBöäw*`Ä£·Xñó$éŸoúÀyœTb¿NÓ$§KÔ½‚}„ 0>Ñ£•ÏSÖ_AñՙΠ=ï«&}fHШKa„ŸNd årE@ÉÊ%«± ªl‡,Õ!‘¿Ï™ý¼"2pTë(”Ja{&•\l&üîË_6çMJ³_R B#»|wxþòæUzàìjéÒ!Œ4ü2š,¦¯ uå{eͲ˜ÍZt'òfåí"*؉Q¤>Mì«)¥Ò*jiÅt¤¹¾Ã-@l;®ª6®÷ØÙaµ‚£^„§Árz}D»ò\Î 3¥’  ÿµ«éP DØ7€È˜¹GüW“E¶{$òµŠaF 7òýÁPDÞh˜ ±;÷ˆ‚(UEã´Wáb›Âœr‘ß!Ëç²Ø!´œGÊ öÒQÂ`3F´z,§KQˆí=pßUKgÖ ó4›¹À*€kר~n¬Ù@™dæù¿L3´H‰Àì:DÓ’úÝäÜ/MÂ#«xû¤$™3ÞØq-ß•^ùY®ðk¿bŒåacu8« 8\Puz¡B6)f¥Ðy?¬;&/ü‡ó±ý§ʇ4<ßëÙ¥iÜÙ-`ÅÆüb‚tœ'\+têÄ3/u 6ì|}l¡+—µÉBôŸŸ}ß›»,çç¾£ÑÏ…Ívý :žÁŸÕ<ùý2A·ÂûÝîv·»}¶}y–rÓåêEáÀš- µ?<ªˆp“ujPåî°\1pÆÉ1êfhäñÏÉ­–µ#ô)N-M¹~’ ‰,=/ÔÌãp$°¬‚]¡½Î`ö—uzÙñrO;Æzó¡ÏÙuD\I折ª¤«^3ùËŒýOÖ¥0 M/TùZÄú+b2à(jbÏI÷($¤v  ± cõÝ£€€fIÒò*Ct'uÇpï¼ø#ð@J0@0Ü…rHe$=<3:)ÂaÍÏĉ÷<*~{zÆ<\Ëâ+Ñ( ¥JQµÊzbâ(|úøQl°ª·GÙ µ"—\u2îД¢¼%Fœ:¤ñb’ãÜËó@‰Ÿ„”†í)5‰9ïx Š„ÎÕė!GjÞ¬•tˆ!Cå úIºÌ®Z™Ê»y¦2lÑÃ3ï sÙ_1û¦m ˆXý‰êVc&é6yè;“(k>P˜Á UúG1F*T¸ùl«g7«qÂb\»‚ÎBl)rà¬81H läÇ`ò*¢<œVá—yúܯ7Æ®Ô"–oj¤:±°qìù6V±¹þ8ˆØ#ãËYr¶$‘‡Éøó{=°_¡ÁØ1èÔ¥ûmÞ²”óÙÀÊžÀ~׿v¸™Æ!½Ð E–²@ÓqñâQ^|Èù¾È߸ú>=i. ý6°õ»'Âç'ò•hjdßèD­9´2Z±¼Á'Fç†Ýïv·»Ýí_Ù¾,†ñˆ°È  0ÈJLŽVéy—^8Rú_‘õìà]ªX­–PÌÊÍO¼›pšPÃéÔ÷Èš¼dw»,"øí_  #Fð… ¢ÁÌm'çCÌX I *ÅB‰.¦R¦¦3±—ÈÀ`Êýì$›(ÑØ$Mp‘d„(ÀŒÛÉU×4×X×"à]癈6ÇÂÓ¨Ÿ0,æ`dg'µwá+»/á쟼§Ü6o#Ézø+* YA`‚–nA[Ì2gÿÉO‡GÅâ•ë¡8Ñ®$Å\¯Jž³(,®¤kn0úõ[Æ£YAØ' ¬]ìª4ÆŽÖð $ý¡iäU¨™™g2s¡˜9™þc&3s@Ü5Ro[Å ™Êå)|r¶%ˆåA ú¤‡ÝízÊRþû”Ë28H{Î7­Á[H£XÖ•²Rbå§·@µŽ,Z*ôé3I¾‹¥àÄÔb3<ó¬D´ë`^†P>lNv¿ÛÀÈUwï¡#@“#L5½›(gñÇÜ ÚïŒyÙ;ê43'>Ó à€%'oÀ:î Ï+·¹7ðRÜÙJ±¯{¥\ùµózyU‡ú'¡+,õi? ¸21ÈòÍ‘'û†_1»Œ©[ÔPrDiÇi×#Þ˜³¹úV°i¬Â¾310Ÿ*[|÷©ƒŠÝ'.¢Ãp[…µ\Ã+ÛˆtJÿY8"F¤}xw`ÊÖÏ6¢é[ó/0MÀš|‡%Ú‹rC´YÉ üý7’Rïâúø·›DÜínw»Ûª}eþ3‡SÉ/²‰¿DöÔØ‘=çüç‡<âµ{p"‚áÊxêi°}5øºNjH½ŠÂ³×6•f°n ʪBJË_¥@Ò•e\¾h2ã‚𨯷e*ÐPAA!ÖÄâÀ˜ûÑv²Û‰Ýx¸Dc‚³k¹¼4w´bF1#F§^݉eHoUd§Þ=+Î%Ÿ{`Eñ2ï%K'qvþþ¯È_Î/mrƒRvg¯ZätO”™EUŠ/0 ª¯õTA°ÄE¥Âq¨`j³Í´ïH+²ú c-…Ì(Ä…áüϦ˜ðÖ¤m|ݽå8KdÂHÒ•It¼þİöò÷´<üÃ%l‘i§4@L\*©„€Zj±¨…n³õ©èËÓ‘¨”xöµ ÈÇ6ß#7ã1Í$e—Åm¬#É‘nÓ.lÆ v0ÄÅN÷ðR¹e°}ù nƒ~7®šG«ý{(¿CgT‘šO+²r©(¨Èã îÎ6¿ÐØu/±¬|j³×˲»Ãñõ4á¶ K–ÅsF 0ߺ¬0\Úù3¥z¨Ù1€É²õúÅ €+#`kDd-8$O´«`.f¿ƒï¾fúm,jXáByÄTŠD$Åã:âJׯ¹þ†\²4Zûæl°(šW.TÇ¥ÂkôåäÇ¢¼O}uIÆ´1ûÓpýc¥å{7 ¦êbt:~“Å_Œ~ªßJ/³O/Ÿéüi)›þ°ýÞktÅpW'KÏŒ¡ÉÊÊžøÏ¯»ÝíêMìnw»[j_ÙÓÞ´ (—üFÍ:ª¢fôÁ©|,܃_¦‹W˜©àì RìO0MŽÎTH$ª|ÁŠ´÷ðÌLÒ7Ò•Têƒ×zýVÀ§H0Õ_õŸ€B±FÂý`§sðñqŠ„ÔÙ²•r0æKb͈µä]òc ÌíÑ_t7VP-Œ"@H,²§O<å‘ê$p‚Ë(‚!~A9-œÑ+º”íŸ{Û¿ë üÇ<ÝžëÔÕXd«L†ÕñàÉãΕ×ûÜe²ù%)¨ý‰Œ´úØ[JLœÂ>Ì«’Õ‰Äg‹7,Ÿ–ÈN Æ\æs6tÅ(Jœ½Š£0¸Í÷øNnô7s¹ÕÇ^É‘f9Î1‰YŸ_À˜ÝIRN5é…3á·î¬‰¿ ¾x‹Ôx™j@¯´2¥nò[’‹IW©–ÓÝ83jϨß'À‘8Üæé%•Öbqhp{Žh÷mQ-í¯ 6Êg'“ÌWãßð¯+/qòtÂxP¢Lƒ K%]d^P… p Gç‘ßZ P¨\ <,3u3#ÁæUnßÅ  ÎÒ1öM}pò¹.ÆâÎÎT²÷{º7ì§T}.‰<½ó™±Nè*ï3Äõøʧv,Ÿ F à׬èèk4eo6ëŽÐ2~œj2†×æ¦`¯Jûª¾“ƒ·À|´þ›h+þZ01Â…¹í7än /¦916¤ÁÂ@/x)§(/_“­þíUFMP›.Ì«;Ïpð:0÷CøÝO#ƒlN^¨iöá'¹Ú³7„·»ýëÚü¸ÛíKðç2¥smã8œMÝ™L¡ÎŽÒyuõ-ªˆdÜ,¦A„¤Ø<&@ÛBŒ ««Ò ÔF`j@¶0 JåÕñÕ¢fÒ²xzúvKä^[Í|™sx£¤‚¢,ˆ=·Ì“^Þ$UÇH=]v=!‘*nÇ0²íEN-x h)e&Ìéï?ª-2§;üÿUEd¿¬¿d"jØ:0t-‚ @¢Àš¬)qÓþ§­q‚³µqf… ¯7Úƒ‘ê’F*Ñë˜+üoóØOŠâJ'¸a=ª+ fŠë´¯,I+î™ aý[†]ÞÄ {.WÑEÎDTL-¸¶$ãSž%Éi@QK‚õuÆ9àó!UŒ;ö“„–‹ Œ9Xâ^ëK|­€L^ú V^neeѹ=[ðÒâÇ«n&»®õÒi¨É ªwâ(ói˱v„e ;0 (u >XðÆÍU\ŒÐ Ra½'ØLN¡ ¿N6ñ£Cú'í!¼¬(•₪N¨K,¶ú””A\Ô¨±<~v 1F”"NrU+º)7Pª(…ë–+¦Ð!EÎqv‡ê;O õ¦?ñV-Vˆï±Y<­”…„œOÑkßߚتüãbPý›±5(@ÙÀ4›M¸¥zÙ0©Öqj ²Î¹TÔŸï X9 QÓǘm/d?˜€])íšÚÕg–Ü[ÀÐ÷az çÎhŠ"ôLv_GÂéýÙ1ÿÄ—ùógÆܼÛôóŸmwRïnﵯîÊÅr–ç …Äy J=¬‰‚ŒËJüÄäMàE!.®’úä¨r#^b->Ìa€C¼*KMH”">Z¯>ñµZ ›QUÃÁfǤ ¯*NPlâ”3£ˆz2IB‡¥v&´Â‡<`qÿÊiNú(ŽÍèÊ)¼'ÁñvP¯Éí¶Ši$Å'˜á±ðã_yçd,A2ûqØâ‘òXxÐväWŠÍ¯ÅlYb(ço‰J”)È?ë0¢À‘g+·hA¬¢îßR]B™83(ÒØ9Uä<öD](`6’æßÌUv¼QK¸L¼×ѹnØåX)(© 3‚õI´¦ÎUm\ݹÚˆt3PPTè.õ4¼È[˪è\NsÊ…¸*B€Ã- Dû¾~Ù ‰f$×åžã»Yè+&úF£Ä½z]C†ÕØCZÇ(hêøSÔà6ªoßûœ ³¦O¦"7uVœ£@‘¤ˆÅÌIƒ~<†ÿ+Sˆ÷kî1ÃÍ5Ö ZöXÆ•Ç KáýF‘<äûÉ:Õ8oôŽÄ»ÿfxhWãrY(«hl¨ &%"ùìÑCÚìX›¼ÈT _”³LÁ\„¥;­ž&ÃA®bÜ«X ®ÿÉ•ž<.ÇG¶nqûflÍæÈˆ½ ’@é7X¦Êáûl ×6½áÉa'mÌGkœ«“@&¹Ù d.6e –¿×çy&ve&"—ËX´dèê¶Xt^2==e®¯U'æÏAêmWĤ3›åxþ~èY3ê½8íÆÔŸÑ°ÂEÁž×5\J‚ÃW,ÙðC“áyïv·ÿ"–{·»]n_ú,A{-N(á¡• ØSå†YÙ¦ /mÁ“ê~êê@9{ÒÙcFèG0©Õ1O ÌG­Œ™þ+¡–ª8z@¯KX•ÈÌ(¾@¹ËFzà])¸ÔVCZÏæC+äÁ¸}ÛvôÿáäÝ.ä_‘îtMOJµ™µoªöM§÷8lR–PI‰Uüçxb!dŸHǰfy·ºmQs) xfŒ¶·5âYŒju Ίã˜‡SBtOp*ÊDÊ3“NL©™aG×ÜKñ8 ˆú:°œKxØIÒAâ=>ó‘7™‹x\Qí„8”eßžßæ}¹-»&RAÁî#í£Ã·£[btæÛÕZƒqÎÓ”à†ÚJæª jZ†þzôÂ,6QÀHY„êÿ‘ŠlȲjÔ· bÀ§RS©hÑ–â\¢ºªŠFUýìÕ^¯¾D­† ŠNš¹};„E6§íÉ3¿Â¢·6„'Îüûó”…å õeˆc°òû1°v‚ÁP‘pˆ"Óã /¦ŽA#T”„M?LfË™"ÙÊ ø˜F¾&Å dzD}Æ£°ÃÏ^L“RíÎæ¤ ˆƒâ™1æP÷—ççåD^)Ñ)Û0ÆeÎÆHÈÊõ¬½ wR츂½ ˜u!¯™Ž0?šÒ»E¥Í¼Ï©§—\ ‚³ñ^€ë *mÕÜ~Štd ±=œ®‚WKšþpâ_¹q~ñ✴¦Ö6âË‹/¥·‡æÌ sïG‘ïa–÷#ÄŸPyºÛÝ쟷ßÞínÿÊö%&!Ä ÊÒåÌœž ƒý&,¸SÚ@†uÁVJZ˜ù‰õ_ò¨ ¢ÝÚy¶Ö”IžŽ S“À-jö²¾d_ëš5ŽÙšyˆŒÓåfÎ`2‚ƒhŽý ffÿ‹.þ={wÙí Z œ9l§tÔ¨åïÁ³Ðÿy0ñ#hì?Ï 'Wò¬bP±¼÷bfž1­sº~€ &ù7sø§ŒòÝîv·»Ýíbûª!¼àx¾…uêü8&`wP…8ŽÑÕÓW2Fëà#0” Äì@HxDö;u“@–b¯Š¥›ây˜ãÓŒ™u+Ÿö”¡§VJUGGÜ*ÆäYŠÌÄÕ\H{„"ŒDTèg%lú* m“+/¶·vÈI5ɬÚšøÔ‡m@ööDšž3Y´Aç¥Ä.¼ËÒ“0ϰ‘”dš/`…›½ÞeñPíˆ6ÂIîæÙ[íF¸r†devøo(P@pÁõ”%Ÿ̪è]ï8»÷!~2j´K~{äÔã¹ÛÞ]³_®Ü$Õ3¥'‚+(9uÌpœ†æ¡mo”Düy%Ž†Â­$D£ÞÑ\YšÃ(´!CÁKHCDøÆ²E`È;TÊ'Pq{NÞx!…c9T»éƒN*úð‡@ÔågP"¦’;8 lº÷JGŒ ?'BâÀZ,ŠB©øi5¾”±4¶-°lª,—t2%úË]£Ž9Q2y¢F«ò™Ý³;°ØQ„Ć”áK @Ô?I›mpÎP›#ÝjŒ* ‚4Jå¹Ëº%ªz¯j²Š4Ü ¦CÁ©l5INÙ´d)4à{cð]À ¬Œæ°Ü_±àM˜’+˜¦4ôyÑ‚ùȨúiáþüº¦Þ.I0Œã8Ñ‚*M‹Û$ÙLYèpQbkˆXúd””0K;ÆAhVØûÒ[YªÀÖ¼’­y¸5}¤ä  VücøcWðT˜ ÿhÀô3Åsoå_ý«w¾e±~ÅÊÝ#­$64ÎF„£÷ÍE÷íÈò*i P-F—š ¨Ëž¦I—§Ú²ZÖ97ìpî¶:ç;ð„: Ã ## ˜(< ¢¦[“N{,Je¹KþoÄÃ>öV IDAT>iKõs¿ *zCêwfe+Œž¥eS "ßE.ìÐÿþ†ÓqÒу¦ÿÓ˜áäÎ{Í.:#'·’"Ç!zã³=»stì†Páâ•}pÚ;¦å8`M`T$C± ñ™6:„ô€,½2{’~"²`žíñ¢Oc†äX[늦õÑ[|IÖ!™U“{¾¶ *´Ìƒ-4¬dè0¼´^ëÝ2Ç:aùÀ¡ÂÁ“÷Zoq¬NwX0.™A©¥´á5“s ðîƒÂ ež æÓ˜: åfΜôE9]pXùkooý ŽÀÖÐè%­­W{{ÒB'6òaœ0Ú·n3ƒm<]…ÅMàXþ(FÖ6×ܯ©lOª¥Ìyc ¥Ü/Æ08›kµ`£4â±ÝC Dº¬)G°pÖ{ÐótfJnŸXÃׯù¦NTÑMX˜LWÍèj¤f¦Ëó²¹åÛ ZãÒ!æ"gFÞÕR%Þ‡µiúEÆp+g¨IC£1º‡Ÿ%›‹½ï"‡œjCó%PéjúÛ¬¶j«§µn==Ÿøs¬•ž$–®|?±NÞ­ªù ÐÎÆ å/ANùKæâòÒ˳‚kªJÝL&ÔF7;aʆ~ðeo2õÝîö—´;ƒu·DûÀ=p [äÏ&ÔÆë9LÉ2^ÃÄdÎÀàp‹õè-ar}}*GèsŒ8Ô! ú(‘C'ªÈæšÎE±?ÇØ ÐddëBM†{uyZf—Û!½_  ;Ùœâç#8„˾S“?€ÑtCËa†’tWÿjôÄÓnn«4^‡AC¢rWµ{8hãš•qX!5Kug¨Ç¢—¿H¡2D`ɘrx¢ÉØòó?E?q]Ó©X Fï‡Ôøã ¢á,,€ó$x¦سz‡ª>¬Þ,Såe}´ÿ0ì‹mBM†'¡N'HW:%þãR>)3‡"É’ìŽA-”Cú#Á£ ÌÑ#zž×àƒIA>”Uù'QÔÂðü8=!U Ǫ¤‹„;¼£Ûù< .V ¢Ä A5I]‘Á â1F˜’í­†¨¢ÓiÞÁf]©Mò 1ªTE<¹ä‰ÃšG±Pk TVöJ<J½šgâ õk Ža—ÛÆàB*©\×1ÞT×ÂÖÿILX>gÝ#í 쇜êf9MÐvK[2ɵèÿRðÁ馨`› + £   Õ“·\ÑðâJߨ ÛZ·áóoßæÞܳ²•ôÃ'c΄ACAº+Šü‰´§êÅÒ“r0:q: ttà,O«°ÑÑÃwQctýÞˆ'cóVŽŒkó‹KLöó<­?Ç(îÐßS*ŒGÂbªê¶¶"j-ãBÂMnÿoÖyüäUMT¹Ï…LÉÏ|ïÕûcxbj¹›Bhrþ¶ì@‰Ë³­;à7õú©d êOþþvƒ§w»ÛÝîöÓí«BBõ^îyÍA½}§J=œ„ÅïÖ˜­"2œñ¥¾ W­P‚?×9q+Ñ4E憎åpÕæª^€òÀŒ6ˆG –_åKêH!ñÓmH,òÂMôåôOËœŽzNÔ­ A³j–ƒ,Oì…*Ói"m‰[m§‹¥Ä)ƒÖ]òÎ¥ù¥ŸÃ^~¶·YK°iR£z~ñÊ7ôò^ñGq\;Uq u²*èleú¡º¾GkqìÄó¬W†ôÄ{ST÷A&ý\êÕ#æÜŸ•»†·‹g1þ­*"”œƒh3žz€ 1IŒäÒé° ìäÉÊEñ‹7€Œ¹¤©ÈM)`4 B¥ïÉõîU¼|6Q«^ªØî0+ÐØøRÔõä„CƒÂó¢õèŠÝÇá]ƒ…ÈáGp[\ÄX¿˜I1"îI¨¬æé+}›}©Ú…ïª&dlèM ‹Dÿßì¶f¤ XÆ«Sä£cÍ>æd!a°Kp„“wKI¯5ˆ¹…iQ×E0˜ýÌ™ ÿG=¨h®UööF4H¸â,3Ëu{[ä,Žs“Íë§œÁ¤ÃÇ(ÿõÓB@¤{ù®”»Ýí{튻ۿ¾}­™æ”µ€’t'“È ¬xÜRyÎ.ð”e0+ì¼æië{¸0S»-ùðZÖ+¾·#°(·Àγ–$øcÁñ%#ßtÄLõjgEBTÅüðÓJ`·‚' Ê•Œn1ÍOÚ Ü´FĈ¶¢ š?aúy Hh,†ÉvŒº?G!#bu$6Ø ÐDÚhÊÒÐÒÏ™¿3\²"œÓC¬68<-z1syf>BÍéQqbgÖ'$x¼„€þÏìfÿ{– 0û¬vÑ8Ôý0ð u!Ù”BC§æX…•ŒO<çÝÒTEóGWevYrœÊìõÐÈ\háþØÏÙegr†Ë&'•'lúˆ>ÀY–ˆØVüÅ?·ß+]Ë}##á=ÓÌÑd )à"Ï=0'œÎt£Ïô@l¹sü®/©_q‚¹æŽEž¯I¯1åà•‡½lx7D¾¼µ±êôž?žJ*ׄØú“[Ã$Ów`ëd©R)úë<4žB›±|KwÉyi>‘rö…ìFaÒ)ø÷XÆàÝØÂô"u¾cë¯ÂûxV®jZ1yÿøÒu"Ô/á…·þt„!šS- —r²jŽFG[á¶,WDnжÔB•.ÊýW/•VÌGKà*ìk} Öð7–*¨ȃÍ×2KtŽ?j°Wp€hCÝJüø~Ú3ìßÙ Ö'þÇ ^zG¨ïÔ‘àڮ귿 Ú+)Ì£p‘¯8A}£¾ ‚½«¨àÌí#Oô²ô~{'sºÉÜÀëÝþÉíž„wû/´¯ñÖÍr·š°Ì—çC <) OÃ3OD=®ì#ƒ\èŽûYž¾fBŽ` WzP8ô1” Z‘&Ç¡x°žƒ±*„œ1÷9Še-6ƒBqBî;Äo=£ÁƒËhˆrÀiSyÀTáÔAÊi*q’Ø®Àe’å9¡ÀÙžé´È2÷ºj;ÒK%Xîp9®ˆ‚<5²@Ì©–X^ †,Åž+‚‹©|S\"‚Æ]YF…×%,ñážPøc ò={ÿÌ ök³ÿÁÏþßvÑ!hd¶ þ#Ÿª_¿¼IVò,%A±¥¡Å¹ ¡zôÙöÌv`÷*?ßõMpQUp„D=Šò:5(,ÍLZWÔ*o<ûÛ§¢—rÖA³{H8–û°‰{ÚQL^æJˆ˜Ì{8q›š¢0¨ àÂtdø)­¬×ïáåþü»m+ïÚj=OwBqŸA.¼ ÏÃøóå[^á¼4ôv‚ø(GmB±ÏA‰[1Y\µ/F$éŒÆÀ zŠÃ)IsV¢(R.«UBèà¦1ì÷ñ,ŠM㻑Þ÷ óußøÀË}2Z‚ó\M"9‡îÜ’ kÿÝlÅPG Ô3 nt ©¨ëßk~Tܶ?'®m#sî¿Ä%›ñ8@۔벑5äÁ·—›¬Îqåìœn¡|g—½„? Ñ~dÏäU’»‹jÿZá  ó…õèÈò;¯Š‹óAå?ñÍAü¹SænwûO¶¿Ç‰ýÎdÜmоd¤Õ3ÒÅ9"D(iái}«T¿³Û'ð®)¼ÊaôfoÕZžb"‘Ù?sZç^ï™Ã…|ŠCÞt£5"¢ÚLþFF°ƒºÈ ¨(Çàú†ÿÍÆGQ9d£= Ô[Ë7øL¾fgµ ã\ ½C«²Ë¢žÙ%»›Œ‰eñÅ;¤vEºˆ¾jöêèPk2‚³ùMØâÛ0ÆR¦j-FœÒ\.=Ò;ö³Ý£•;öW v;&Lkë¸ç«éÐl:›KAíðÖVö0´l€…t^ ô•¤çOc —êYv¬}•¬iFä»Kí#FïÇGç£Äÿ?…þ?šƒÐ÷0|ä ëÅï³Ð²M‚¹R€©þOB@´êïèqu½ÓYëuÏW]9þ,¶x#•w»ÛÝîö›Û׉/`²/g­G÷c±H­•¡mAqqvõZCL—id¤ø€É‚ÑÐ˪UÀŒ×âŠo$¾öÌ7ð%9¦æÈé#ž{ ’¯@ŠäY‚½L§è.°0S^£Êd ‰A>*RÅÿ6á×tÆ”ÆN‚§}ݺm 2;} Ù3׋Xí+jPÏ„tèÑL³Ø5{tžŒÞÅ&*W¦ÿ P±Í‘”}¨œrLc¼Ò?ѽ#L¾²k_´ÿÑþ^N›§ëR °¢OÜ·<¶“¢ˆˆ0¢ ’–’"±Jɝޭ.[d?Þå:+‹™';¬q÷‘™ž³~u‘"r!«,oÍ—!wˆ/ñ ÇÌÝǰd,Qòöâ-"RA Ë2G6Á„% _G5gìO±`þ¼ËU¢Ò( ÐQðpu -sâI`s˾”r~—aäájNLœý÷âQÉ^z&Úž§mÿÌ(ÓÎWªe ¸iOUÓÌq:O°j«ƒs¡Ì|˜*C„Â’X¾q% Ÿ¡«Âv@>`L•uöƒ-ap÷ õ¬Ø\Í&œ ›gÊ|A´ä'ЄÏ39)[ª¬¿ù„s9kÃ2@èUàÓ>ïx’·‘ÿKØ½Û –ÐÞ–Ü=@2Ç"câ-¿7·Æbej°ìtú¯;ŒDM‡‚nsEݘÝÏo­2v7—”Bþ(ñß~/Wš} ì©§Î~o¯•ʉâv)°øZüHÏü‹Øø7ú·»Ýín¿¹}]¸,F{Ža ¥"™?¸Ôìf)kÊUÕŠbORÂÅàÄ•±–ò›es«É§œu’hîŠ9géÑd¦« #X–`ô w8‚)LK!Õ>¬£´V(Õrz©ë×ó˜£H-Å‚älõ, ÛSÝIt†b iúE–œP&2ÉI'—<ç9’ím$æ³PЕÝþx;ïþW …&O oFº8Ƚr„ÒöÖìgöëaÿg¶íþÇ¡ÞN¡'Ƹ!xÌúéÀÉ=‹p¤p¼u¹ŸÏ^¾ÃL¿‚zò1÷ÌœJŒÜI(üHC†fÇd_fȘu€xÔ¡ÍR ôÛcݳ¡eUO?mlÈ‚ÐÞ1{eNÁ  ÿd¡Ö@׿ý3Ò3ø”Ý!Ë­˜v‡1sJå"¯D·[…s!íØZ­8š¤’\ðÕcÌ̵ä(‹{I¦|âAÜ'\ÃüÁyÜÐbM}7¬Ö¶÷ÒõôÕº`ô²Ïw]” õY.—b Yºh!S±-pø^ÝnÀb›4Ph* æŒÎ"ÿõù}þõ¯T·…!Éã‡Ð¢º¢Råmê¯ñó41ôg Ù ¾C¨WÙG¼Õ+¿pž¼2¨²Š“WÓþ"¬'âðÕl9ISëéA¡@¿Åä»nÜè„®)ƒ ßpbç+ó÷—+)þ…È)¿ñ ÄŸxˆ…‡ìô}Ž+*×ò«À¥]äc¿òh7¼~·»ÝínwKí J×5«1Bǧ¼ŠÜOp„pºÕ©^X±ÑQ0V ïf§,¢>2—©™±‘Ð?å­ü†ïéR)ǓŞÚ-šã¨>âê_GŒ"6’ÀbŽ™‰¶Æ5¼?îC>6ஜþ¿Ã­‚ÙÇJ×ëq†<4 ÛѱÍóèX·Ïÿ£s•óÜ #HZûâ‰3úçÉhLÄn¬Ê"!â=»°*çxXß;é=òoíG?Ñ´áµÝ‘‡ÞÇx•mz˜¬‚ö‹»ZÔñËC¯m”0Ò£xÕ9¥=ÛWı˜Ny”º7Z”aÎ6¾æÌÃì3¼hxrÔ\TŽÌ•4Vß$ŠW k~ÙdZ¨‰±½Ä½Ú‚¶{3äÁ^mä½k÷Å@Z_î€ÑôCæº4Ÿ‰a,ò6Ö|o,’£‚¢N­ÞÔ| N ™"Úö¹ñìóÍ‚—uÊ$§ôX]&A…cìÐÎ8XEZ«Ç¤WÞsWµ¢ÙŒ€éñí`8„-6F:<Ý™’`¶5U˨å2z”-HóïŸãU ö9Û{¥dˆC– Ä\0’ÿ6ôÓÊÄ%—Œt”¨E÷¾í8À‹¾r…DýêN^´¶Ä¾-¥{º €åÎ㨴¢µ˜žêá@Ÿ†9ˆÀäëªÙ¦ëx{竆K +M·~þœ¥ÌœØ± ï“7fõ¨ÊêÖmóû¦í>«fó÷4Æ×Ãg7¥Ÿ{lŸ`V –9€\@_5ú~yÿ]‡ß5j·ÐÝîv·»ý†ö%uÕ­A1Ä6/vId#£!Ý2#žN«º÷ébŒÓ™}¡©¿µÓ²ÿªÐB@së1<+¬„Ñó£šÞ×ïW=Ó•`¦’ˆY½=«Ñq¼Ìe-%œ˜w^g?qÒͨA9Ñÿ”Gá…ˆ%©#Ræh{=+9ƒüœ9*ôjÚº ƒ/mÀ¾çMÀ@^SôÇýÿ&Ì1¶‚ÿ!gXÂuìÉO˜ãH"õü±¡gX«´Œîzãé5ï%¦CG1s¡9uvea·¢ÉÉõ±[³ÏîJ©Ç¨¯Ioªõ þ*B[)YÝ*ÂÒnÎzŠèéûëY†oí'ß”‡¡ú7> ?ƒãâ{=ÃõoÙƒ…ä DŽdÁ¼À¢ØXÛì'ãFêïö_k÷œ¿Û¿©}É3’ŠÂpâ2Qï‚Y½¤ÜbÃ`:f4’˜†¥%¥.×1´J°»¾š4Ìý„ ž*"¾ÄÁ40=¤«(¯ýå¬J!AbQª…QåÃÌqÒ zÅÈHzÇ£n… ÁžÕxP9*ïDT”q™ÖŸ• hç*ŠCfÐñ¸ÞŽ,ûùËvrpýôÆ, JQbvV€ƒ•¡qý8ô(-R‚ë­hÜǙÃ8 ^ çFÈ ˜ +#Bdèq í×®Íò@xx&P2º›Òã¶Ý#ÉEù£ð l³q与Þ,Q<'aô™ˆ£Ûð’:QÚ”N«ó§xµ‚ƒ¹iBal`ç¼âk qŸ¸Ò‰C·ntHtÑ1§;MÎL!EÇуª@²BˆF€,jݰô³ãÅÓM?”ø–1EšÖ”0¶­Ù²ŽvÁƒ^‹å˜0,™ãdV1 P­ÑÝòDA±½¸v¡ðÈp.'T‹³Ù¹TuÑC…Øý´Ä²ëän 1÷:•lñX(gp*D±¦Ê1%×@Uem:DØC±55; ½ƒÞM &=?,u—€Öÿ&Þ±bŠ»Œþ_¦Ùà“hkEðæÌ9isaŸ1ÂÔi×3ÖÊHÓö«¯Eñf°A*©¾1÷®ÌÛ%¨³/dXåçUâ²èXÓYFÑŒ9TN ™ç=Q.4saõ”yÝsi—áðIü/u)áD›]ceþ©EôOÍwû+]À¨vĆy¢!ËñI9Ð §ÀõÃøŸá»ÝíÆ» îv·ëíˬ¥`ÿõ<4<ôa€:0³ +O¿Ê)K™‡nrÕzÔúïT×ÊSÀùÞáWLÁÛÞŠy ·ž‚àÙͶµ:ˆì]•DY­ÝaäËú¢%]€Åø™—:g–9{gW4ƒ¸ýK)I#±iÐrµ²r…6Îm6H¨z …<²ƒG¹C­[q¯)ás½\¤Cæ éÂùYÑÇ÷hþ‘Œšh×7ƒ7¢£èC~Ú„¨‚K¤·.*Ó²†× :éAýÆ€/YæbÆ­ÅÕOŸu/o‡ q$ÝÖäãV 5šä”ù|ò´G—çk´‘\š§-ÚjmYχ³¶pW*uG 8°®/Þ:t§ f:Õ'tûÞÊú¥8âß_õcõØæ å?Ý”µÞ´ÿü£Á]Ž6®ÕmÔ]$¾AþÞ×Á;ð}ɸß­â{Å+wZân¿a×½ÛÝþí+\Эèü–I\8¶"¼Ã]Ò]ÞcS螊ÎOp2ßhö÷@EgÆ%éIDmê×ÑË»’[«V~ù¡IÂJœŒFžÏŽxQ–BɈN§þÏë5ŽOú@ŽÙ¼K‚ `AŸ–á-ÂŽÛI-·@‡O´âZQ7o±›±)xaÆØQÇwà+¿Â—ˆ?œDIê4@»F3ÞÞ„^²€dE€œN¨î²8 9ï"ˆdÌ—0µ´[Ò‡‰Œ×“ʇ`™ûüÛG7qÊ.yY¡_f_Ïßìÿ¶Síê°LИE5-ˆóÜÊ*Cú+Š:tÆÚšÃÁŠ(YØ[Òríúú'3ï…ÏŸ>øêL/T8H‰¥úo>÷P¦®žÇç1 í´ëºF™ñ®Ý IDAT”uüe…§:ÅïäN^CX8Ã[ó'IMvä…ª@~`»’S‡Å,ÇoòP$ïúüÏ Ó/ËGÊKVq<Ħ?³È¨¾e! xTóˆ¸8N†%S=}tV(ƒ¿m„kÚ„Mó$zîPÌ´oŸˆÀ\cÅ•l•WKEÖÖUe|Wh§ ­'úŸ^#<â ‘4ihÁËÑ£ã¹ð‚òõ T÷“ מüS_Åó ñ(ê˜~ Ô³@?þXoGOŠ@õ@11é±)>΂bÿ,ΫLƸ7Î]jéW!ôž€åY4÷®±À W]"#}ŽOm‡“,k¯ïÄs“Íí1â­faÏ¡-H½}£«ø£Àk_”®÷G¤·»;–[ðB®ÛËàÚ¯¿¿ÉÝèÝþí?8Wïµy·qûbâkJm™¦4òàr¸ˆÉÊËW4Ëì¹v:s~}~ƒé¶¯žö—ˆY¸×&ycठ¼ñÂMºD€ÉÉw$‹ëåÅkäFÆ"÷t@&°gôÓ¿&êªk&êžÅoM7¶ªùƒ¨ ï»nÛU§ÉÒ0ÆO®ßv¡¤9»ÁÙØr1î¼Þ…m¯f×ÖLpÂYwz>’r~¢‰šZä)c¥ãÄ÷#%Íi°ÜZêöÇ·o¶Ñ~mök³ÿ{ì—/èÙ¢HH‹š ÏUÏ:|—J=]¯éðh4jˆ³Ä´ÙUµÙY-=Èî'DRö?‘¾1Ú§ø×¯¡÷ôöòŒ½f¾)6öØkFÉö4ñ KÈj6=æÑCg¿ì?pêa`°,12Âax6Qb—®²$tQq´èÕx½)À™~×­g"-Ôþk¶tÄßg}‚5À4#ªµ' rK“óÄÀÂÁ×9¡S2þšt/5Ž„!yy âÅÄ ¹Ð}©\ý]Õ»`¸h@B,å{ÏÞVºÛ|jò¦—ÆÙÝ’å;²+Ò{qؘ™ùv¬–êiRíE³áû‚'öwBÓdtñÔI¤krÖ\ß©–pÿv#%tèiü=ÕŸÕ•hcGîÁçðâ\çî.ÂÇX3ËM):|Ndvêzƒ»m‹Þ’‡‰,ðW"–ˆ¶È¥ÅÊ=jǪY•J&’–¼,?~ȶ#·Pލõ°üu¾¼xô탶™÷4rÀÃâò›˜²`Æ#^ôÜÞš•ô[D1øEÊ@–ß}¿;ú]Íæa#Bå×'u‹Óû;mö üåôÅL…h;„¢ÚSväÒ®…ølý-žJYÉ—Jïâõ?ª“°« DË/u)˰~Ú4’®BZt–¤Î:à˜ý£ã7!š$©7¦‹ÆÁIH.g6(¶’ D‰]‘ê8 ãcÉ׈A»'#îÉr°Ãœ úÆR Ñe4[Š(f¦¬ˆ™•Uò{ÅÃÎ2,Ÿ²Õ„JŠ3nk ¤da´Ñ›ÕM:="”ì¯é:O(p"9 y]T ò…õ5zŠ\¨«¸ŒMª«;Èx‚®nM̬«jð{QýªhéžF¥êòCN  x+6“c‘öÎ$S0Þ¹ ‘A\D¿y°Éx5ûŒ·ÃaR.²Ù2tëW4-/ùdÕH„í=ð©ƒ_ÙL¦±û3Úl¢Y ̸ ³ %Œ¢édÿ ®°ÆÎÒYØËìõ…"nØÅ};7WÉ׿eAê®>¿±ØàÌ™> _ïŠ:µvL¶~ïæ°ÆeÔaüÌ´¼AûÝínwûw·¯ Ü%Å-û´â3rï©è¤²ûK¶™þÊU5Ü`@R{¥²ñÅJë6ábT¡`fVpm•|xr+³yš¼¹Að23Büƒ¬Û®!Jí•èˆ4i¤'œ]:к¡ ðX!Ìã%:^`'|^„÷Á6¼lzQÑLW[°ñ…3E5¹#ÂýÝ»óÌC0²zCÔíåË»üÔÂBŽs2«…§ðv—]ì3ÁªòɳN¶Q!é{=Ý´_Žd÷ª 3QÈW¦ÏÍvÜþq (eóO57Gåq1z­*T>ê®ÆãÅÎL C9Ò¢al”i›A4Èf8Vˆѱ!¼²AHB Ž~C•D‘6b’¬eékt"C9•X-†1 wE-¾#ÔîŽYy¬ü“Ͳßcódño³ÈX|fšöέ‡”ÏßÀ‹k1Øt'o•Ó–ÜòÑŸºÈjmY¢„7OÈ8Ï%¶Q7CŸ æ.þÃ+úŸdLÔ/¤¯˦£ÎênÁuî— ¶Ï„%†ÄÞ“ú{¬'$s'€!ó}L×J¢ÔWYÈMs2œ + –¶]‘¿¨ -> ùr“jZbnºŽS¦c†ò¬7ù$‹ò2ÎáæØ…Ú'UíŒDr™}83†‹5Ú> äÑ–üÃg¨Y ü‰ŒËÓß÷¢ÆÔ~²v±Ðùh=B&Aª÷`B¯u>Ðô—àò?Û\¾;-pñßéžaBµ[=oÃØB|µ ‘g0H~`RüÔ´ú^¨øÛÊÝîv·»ÝM´¯SÑ[Lž§Ýf…ôº\& j á4{§;FÀ(9åV,©ZËj•ö€rw’J-oyàa-Ĩ¥ÖÈZ̺ÚNBC4*èq/\­`nïß–kå’æ½ˆº„Zî+:PÓ î!½Gå‹ï_-©Ù2L¼o³ Î~h ¼8þh„Ây¨Hèýˆ3x=X2ÌÁù£ËÎ%‰Iøý|¼­¸.¿°Ýâla.âí¦s¹O•p‹¥9PôÞ rÛ6§7å+8¤dv*ÿÈ"Å^Õ:+ÿ¤‰V>~ó€6¦ä™)ú#zý x8+!¦P,õ8˰jNñ˜ÞÄÞ˨çH¦d¬[r XoÇcµ MSÑë9· ç!Ì8Š*^ZVªß€ÏÙˆcnÑ9C¯î’óË(¶ÂÂX+ê÷1,¹ÛšbôžÌæò‘›ßÓ*üìܰí%_¯éñЫÉÜng [O"³@ˆƒ;ÈÀ–£èëíÎÔš×;Ô„ Òd1=£ËRÚ¯àžUʼÿ…ï‚3FÎ|¬àXe0rLûU Õâ0F¶[„‹ÅtkPŠÉMƒäiL™Å:|0øžeéŽt{ƒšü$±ÔÏv!`²×¿æ]\™çy÷º«`®o–%˜z—}eš¾"'‡Â7!0v ªú¶b˜þ®x],©¡|„ù{e’@šJ4¹ ñ l÷ŒË]?¾ÊßATvZ½™,ìÛ î)­~’?ÏoN0ü `=ª‚ªª¶‹ïs›¸6îë…(o˜|¿¹Etôù‰O»ów»ÛÝîö;Û×qu¦³Ò:dO*ëcDJ8ÐT-#‚} î¾^Så€;E$Rù6ª‘ìðtIÖ¯Ú·,ŠÕžFˆœˆ¥J•À.9Šö’ÌTöEiùŽbÂ2fÁ•è±( R1íYzÆ“"õ¹ï ç‹xKC„à"y8%ïéúêÀ"Æ(Ô Ÿ=ígèAIs>Ïp@ÿÓàèFïÖkˆŠ1U¾¼Ï¶û]ÁÇ5ŒOÍab6¦)F@Q¨q7îABnhÌ6qæø’WÓÛþ—ßQÁšNÎob£üào}¬Áf [*ú8þ»´¹(€\¼§5Ïë`ó¬þ‰êðýö­)2ÛÞ—?†ö7®‚»ÝíC‹ãnwû¯·/<Uù©—,uS5ÅpëÊ%öÀ¦Sï 3 ΂Êí¾µÒÕ3Ñ/j^¯ÁÆ.,{Æ"ÂvÔEÖ®aÉÙòÑôH½×ßÙy бn½˜RyhߟÁÒ!€É&ŽƒÃŸk$GmPpv5“ 3w¬öªæ";ÓZõ4Löú9"ªufO}Û].#E¡èrZªJ±‘~ 1ÂsG5=ÜL–UØt þkŽÅÚ:°e£Îà¯à¾÷É#ö¿C;‚òÉæYrqȪlfx¼‚M ïLÖ¹€®6øoÒPJK;N°@O޼ø±¢')Ã1èéàK+ÆB­(aq)²,,ˆçG“:€ Î ûnðpúy0åp>äzÁ.#ÖÁ¼¤·¤J5Ê£Òy›ûªŠse#y”h<à! ûn'm¾Ý3þ¿ˆõRp€µÿEjŸö¼ øM g5σn‹`sÊF ó”Ûu½RªžN¸)ì,^²,./¾LÍÍ›Y£›ØØç†ŸÕ&•–ƒº³ˆJ‘\±·HhJ%ÚØ‚ h˜©]3~K~ã--òÎƒÔ ž?š´§QZéÑÔšk¨ 9YÙþ Ѐ4ñ>Æåå[Ñ绯ÇÙLTð¤ÜÏß(бð´ˆ5¼Lg\9^1vµò‡~¿¥°‚YêÕðÛP±ïñ8çDµèL'˯#îºC×ôO-+™Îa_ùú‘Aáõe?\þ¸j­tþôS÷Œ<~s(þ¤àôÕðù=cÀ/•ŸËKõ,ö]½ÛÜÄîv·»ý†ö•P¼GAg2ø…¢öȵÅì`>/Ú#OÚ„3gÝqêlI€6`€Dáͱ<.‹ Žóp#Â51@’ç€S!ÏÊG…!4ñHCF©,©?SÜr¼aÝÅiz*P¶a¤ýr±a… Æ]DÕš½»6¯«ÎX¸@… &ݧ Ć›ž¨‹ ­)üdK¦žÎ_!tª»Al'Úà ];£Sjz2è~O@`(?œPÕD÷pÞSÑâñxýá—•^qß@`êjAžÓòûå2^öŠØ™'ÕÕ,,ÒÉ(¹8`Eà>©ÙàLó°£Ê"û£T;\¹Éhñ^žpð±ÃÁÜG•Æ®ápx9"²ñÐýWžê<¿Žµ€£L•dßíõâs¢´ÒÄXŒa›ø‰RÇ€‚•Œn_à°¡ˆB´5d~GòI÷ý¶]^L«{û„=M–wÐC~èÑLö-ËE £š®H Û—Y£ò‘¤>Ç({u‹ÊÔº^oægzì7FÎÁJå¼#¥>?><íÛÕõdhsƒg¡R}¤P^ö.Ð"½¦¯o0.ûþg£XOͦ´0IÍ ,j.¥¿‚]ÃÞÖÐsÓ#A«JkEànBmÆ5NË–Í©$³Pl¤>? µO?ÐåD¾Î}AïBõ;©ËGÀåçN6X{ˆÐDaÜ5@sÜ™¼¼Hù½]æÇÑ+)´¸ð?!üƒåÓ~ÉÙþ#Kiö7èþžïd›¿¿?p¸|êœÂ÷z{ü§¸)ÿw»ÛÝîö¯h_p@s$ѲP§:¶u´`±Çœeß!áèT?èé“^«¤±èñ†ŠI0–¥9qËAQ?ÈTå !KßdòÍA¼ÝÁSX¾¾“NŠ}AÕ_Ô’!dUFöº1kͫ蘗A`˜¨÷›0N \SßnO:³·d{)AƒÌÚþà go3rа³›=k 5ïb¡ÆüQoM…žK¸ ŴЛ[&£]Ûa,/ýÈæœlØ_E°èÆXtº”—<_~ã L÷¿Lògn`ó¾—ÍMŽçBQ¿É\fŠéX¾PñcD#\J›Ùdù‹°^{Ä­jIÂ×I©ÈBŸ'ʼí>'s§IƱ“¼ 8üo.Ú§ šbÊøuKÞ¢ §•³aLQdŸyËŽ#I4IæV9 vé†"§Û¢=˜Pù‰s£Ó ‹Tš;ÚŽÔþæÜ¹öµPfTÕgE{,¶B46òÕe=ÇíÌG¶ôŒ$é|¦Ö”g9]ZkÕ B] 0 ¡¼ëj½-¢Ovˉ@ÍU)‰u °þÀd6íXEZç¶]*Î…©  EF©ÛN‰ÄK)ÆÙ‘Ážd2êßÄ´¨J+Þ/ÿ:­ð˜ˆOZ¹Z°Xm5± Þ†È ./Ê›Û×[Hçüwòøó»cn?œ¨÷¬ïqWží;\v,AW[Æ5ÀwöKŒŽÝñ¢'–N\êIªûê?¶}6 p3Áïv·9Gnƒ»õí«âò0ó9€äßXéê›`sTz )\ÔCt©u:4‘@Â*Óèá¡v]㪶‘~2æ-eÛÒX‹à‰·¿|t‡ìñØ,O-õðuj}P9ŒÃ’0´ÿvFù{SDl.ê:cÀO‚ù[T}&žòÙÜyàÄÄ}ÛC/6ÿ¯pÉ^‡—âü° “Y|å4R‰ïŒ(ó’ \ìдA¬x°leé§Ð)ñ_…Å‘qۀ컀įÖ|ÄŸ^­h+ó§•MŒZž”[ umäës0§¢îPrDDŒè:(&Ô¬ÀõžI'xú'–òi{^•ñ}²ä ×Z¯ó`ŽˆR"õß8Ï…ÄVXUt-ýLaë9…ä¦ÊÈkÑH[áTž0,·Ç`e¯´ãá*{BêEiºdMŽçÚµÅü9*œ[ùðRUÖzcÆ$Mý…ëó(Ú· oï)ídDýM|-0—6¦yvécc¤ø.“7"I¥Þ,Ø<½š‘2C('E£§G6B:dKÀÞÉÑ{Uâ*úÊŠ»ô…Xþ`á¼[B,>¨†ð!d³H‚]##6O‡ÕÉÏ~ûÏcsó‚ždQ¸B¾åveǸìH] 03Ø·.“É…Q{>CºjrDˆž[¢®K]5¥Šß¦_ô¬îÉßDÿd‰Å¯ãoz6ŸížµžS íóÂ2Øo0\ŸWkÝøÁgÿƒ¸.¾ûÝîv·»Ýí¯j_‡N·èÿж,":,\"M‰žÄ€1Úôˆ¤•Yö$!ÖØ>ÆŸ)6¨šÏˆ5øS`(q?Û+OœË+¦ÔQ™“«$Jj"ÄwsPðRNÛxN³M±ï3ãÞT’ÞÆ ;šóÿ<ó7 ÏNÞ’Ò—¢ô¾jJº÷PÑ V&±z›+…wW–’6Æ@s¯¡ÿx{-/¤ßø±Ýä·@«(ÓKwªx†«Ý=·>ÙyUpïwQUßv—ÀÝ0™ßÚÌ…îáO>ÆÍ\¾ÛÝîv·j_éŠV‰ m°€ú@Þƒ|!€Õ·M~B…ýç@C·ÝÌÎxÒíêúëaev (ÊÇ¥{Óä7Éöºï¿aS]úª¢PàãÉÀã˜Ôk'Mè˜6䪾-ò³ÓWa+¼„4ú{?tŠ˜Ã@‘í6ø:Äßó÷ëT¯&)&'…-[íäÀ÷wáÃÕÓ’A·ÓDqŽÄ±¿X0þB®ñë?z`Ûý’n8qÊÅÔ%Ø]Yˆ¦Ü@NÒ ¼Ô°$¡r(hB‹žs4€MO¼Ù#ŠV=¨?™<·-…!ʨ9XÒG› ¥û°Ì½ú°‚8EYwŸg}@ $³<˜÷E¶l5E&}=X±JnC"W© Y«‹h‚sÁV꿉Ùä‰[ñkíP Òz|öa9ïEonODpVŠÑ=Ü*ÛvûßGJYùjåèpì )Áïw{Ø21 ØÐe(£çsöùlBt¢=åk~Èš¹á³¼Ú“Tßõ¨³ßkoYN¹ªºàø››± ÂkPĸÀ\ ÁEDá"x€ëÿ:É3 ÿ‰v¥6á-2*gÔz5%Ú¿ZQ½ž…‰lWÔ"zÔ2ôǽ5GƒuWèñ(¤ÌÂEèÀâºùséëj7ýqðë8Å k¥HýÁ ‹c4ŸÃŒ×O—×|ð“§i9~[Ciú0èoË1j®%h¼6#þð}çÝK|½ø,~côw»§âÝîöOl_RÎþY*½þ@sqè4†d©œ$«á¡e‰&`N¢P·‡âB&È›ÈüN€;]ZÜç)"®äûš¯5ìäϙܜöG¥Î#a¯nŽŽÜײ 1jÍÕGH Ä»û‰d1*Z¨ëw0{ŠÞt:Ú(’Þ^Ã'Š€œ ¸£¤I½Ÿ1ße‘^Åà”Bvé$Pï˜Ou<,ú°HÓ;ƒ[R8>õÚQj°¹'yðT!·$Û…lžS,Ià ¡?Cº™ }(tu'Ó"a`˜šs'NøNÒ©÷Þ¿^dÜý<4ÚeCN™´/1˜®…TäT´˜2í}¯~@”t·(bV JÔróiÛðª‰aü?$Ðù¨8 A­×ÙD/³“sŽëúø– C…0uS± ¨ç°__t@«WæÍ´™øÜ¨u ;4µ»LÌ3CY‹C¤à\`qŽI;ÞéÄ;C«X0å‹.MXïN*‰™‹t.2bH¥~FUg œ×û 쪃1(ÿg3ÌÂ#bRZkÿn‡'9b6…F;©«{× ;¿Od-˜¾î»Gbé7çÿŒåo] ù‰lÀîê‹#%ošæ‚«ïAã,a§Æ‡Ÿ;y' ϲ§Ñw¡”’L¹»Àî" lžÇÖª(škåm"³rù9mX’u[á•âãü ã]ceõ¡OCò©Û<Æ7\ñ4¦´ßâ~ðjWRWí_5á¿®ï u·»Ýín¿¹}YC80/QÁ ªÝ¹DÂÂï—Îà4²íþ?{×¶9®äÿÿïö¡Jd^IJ%»Ý3bllÌiÛUï‰D‘Œïnu¨‰¥¢8˜Uìí-"™ÿôï›ß·˜TKÄßcZfD-:õc`†VNí§{~"“‰Ïnz‘MÏ:ìLAÆÖšÅòì¢"h/BQS•©©Çµ=,ú+¼5—ÔÿuÂÃÒ²Íiɉú¬Áä°«lfõ†Oæ"iœ¡Š(ôÍýz »ŠËŸäè§86Õ„òö!CkÜs Ôôi£'‰éŠZ JФrg%F0Äc “…9u~ú0·ÿâ•>¡œë:Sàˆ›Þñ'¸­WîÆ¨WN½ÑÉ^‹y[¦Z¦ X'Ým§¸‡0Ý|0r—@Äç¯óüN¼“ã1få[Av`!'gŸ‡Ë‹åó:«°Tnι†ûyþi0 µNÚüx£8±úþ(h¸®ª„;§0Cf•d·#¶¿já<í¯nÏäyÚÓþlûÊ7z†ø|‘lå"Æá9âþ0»Xpá .‹`çÚk +yxšè9 ¾!áÝÌ¢­8õÛIµÁp*Z ã¤×˜^Éõ£¹Ãy%kZhR“Í£¹(=ßÖd5ÄsÆóiОN9¾eFQ·óôv±¬ó»(¦0™CW´ ÔN”ƒf+"x!N'fÝu±`;F\>•Éw…ð»sÝPÎú-´IƒCašÉ'ì‰ËL( ÒEÿÝ@:“Õ—˜û?…Q¤36D‰ö§Î,÷Ê&òÈÿè§C ‘Î9­R²{píØhAmFꨋóQ#_Tp €Y~êº4^‚lº­‡Æ‡À` nW÷•>FPʤº¸­xý5þcÏ“ÁëíÐZ­jœÝèƒÑhpÁí6YzAø%çÙ}„Ãq1òØf„ÎEc”Ç0A)# dËèœe%Dö–]ˆN¿ÖX£ÿZ7ÓZüòíí]Šèõ› ˜»HUl-À@Ó~ÑóBñÔ"Œæ¢­íG½ËæàÅVTÙùžín“1Ïr$‡ro@X†>¥Öè.KéßDNt³Ñù‰(ÞDŸz”4Bz'g廊ÚL¥Âu„´èu6‹™8²JSùt&ô¤yP²K´©Çj‹Q­1)̱Qòuè½u€P ¼Ùžì²9Gÿ ‚}›4–NêÐ[” “4èþ´ý† cvµÕìŠ`þJìR$Ó¢J ûÒH&$&‘5#A“ž%í€ ld¹‰E±~3c?];B'¨"á]Ö ˆßØÑÿ6·¡ä^ÅIáèžbUðcš‚\@Á¨æÊ&L¼µ¢‘Gõf†¹ÂW¸—BЏÔr&—=¬µ ¨«%Án‘2ª,i/ÂÄÖx°×%:´%2%¸C.9½ˆ\•Ò–ÔI»ÂD‡Ð¤cÍ#ÅœÁ‰=jãË;•ÉŽ–ã‘Þ›¹Cû¤…H¦`=ýøîxÚTÄü¯ýnT¾;3ˆu…¯ý®«þÀn#š^uQͺ mp‡/¯jnŒcÎà”Foáˆ{È›Mçêˆ?1 ßëCab§†º2?Vk/–¡ÿß fs8àþ×ÑÙà7ÿ0BTSK*»êÎk\ÿÂ+cDZNÕü(ß[–Þ+’S7jaý²UöÈ ?íi¿ët{ÚÓ~}û¢ œD¡I^¼4p¶†ó‡¬y|Œ£‰_ ¡­#¡d‹ÝÅEB+$  ´œXqÀG}P°, g7©”/É€Á1²HXª"€•õjRH$qàÑÏ“†õ@ዎ‹- v“FciËàI¨&muϦAyòøªõ-GxAƒÝ½<‹•¿ˆ‹hDÁ+>ˆív,L¯+îmî¿ e¯Úþ<Þ@Oïü¡¾]?Œ¿09!á¼ÄÌ:W¬@͆Þýœd…¤¨Ešö$$Éš |:nûŽšÌ…3–)æzM¨<†i ')ÖŸ‡Ù¸Û Ü”³¾¾I\Mµ=jyW¹â`ÐX{”z׺]ZO3'vû[Üo)F¬°ua &œwLާ®äf¡SMBï[~àLݘ=ÄÊ6 “šªKàÒ½4^èÈfuÏ1/ˆø¥â€ý'’£ó€À&G¥WÆD{˜â‡q“N®á_PÜ:*{Q0;³m‹Ì‰hk¤Ïú Í•hv]Á<Ë"ÿSêÙ1ŸŸ=—!e2û’¾ÏWúsQþëž"('ãÉeÞztp!=0̨^˜í§ÞwÌ™¿²ñW¤*Ÿö´ÿHÓ |ZѾĉt«¨›50!ÙÊ„ÍbÌPG$ÌóW~má[©ÕÕ z d|R‘Ê´B(ú½ªµ+ÉŠ,CšÞp_ŠN¥Muä2Ú÷ØvL9È .OE™©¨÷­¿¼&,ÄW马ë±!^mÉü>='¢êˆwwÑù·ô÷²ÃOa³†©)Y'í›Ê™ìh ´ÝbØ)Ûë“wÙðNT7õþ!’ß ,è˶—ø¾Ò~itZòG»~#•{ÛÄhàhâs£¨§†¢dneöÊâPW( „èä½òJL=c·ßg0·@¨é1JYô¹" Ù©sl¢ÕóËÌv'H- ÎP¿%J“*jì°—ùY$Bt!Àvm;ŠN!TF~uùõ„Э¤´6e¬Òü·ÆÛ…ø­ü ·=ýN“Hà ¤xúÀѽhƒÎªZ )çSÍZ#¤m8„P›ðšÐL(>ce^¯Ü\!½ÿåXÛ°”o‡d³¥º)õ1h`ýóuýb±·›Ô[Q7pâ¢o°13ùœƒŠeÑ.¤\‡œXó”5ñ{^ü~3R(ÝeoŒÊ¸ð™¹ÿóϯhÌ>Ü̱ÚÀcU% WúÊ$<H£PDQ=fß1•aYdÍÿNèoÔ³¨=¢õïj—^Y#æñÙÌ;CŸZqÖå?ýe@îXþ¸šX‘ë9Ýê~ß¶öÓ¸áü?íiO{Ú/h_шŒgÎRd²tp@ ¬ØBÀY`=ÚqkáJÊ2FÁgg‘ü·|°”¤¥m&×zäpƒK¸*b¤3Þ±fŽŠÙcŒÄ…ª|mS ù3GÙ„Ò— åç´ÿ‚ ,µ[Ïf*4nè f}˜‚ðCܬփêáG:¼`u±ã<1!ÍóCeàv¾õp¤áS.mC±_Ž^‹£åTØ ÿ'¹ÐмyúM1 ÃÖ<œNñ‰Ö ÄÐt`ïLƒ1.vH]«¡â;ÃäZÚT½íXËÓ]omtR;SŽüº%­È)â3`&=¾(ê38„ÅWá »è÷# ”Ö×±L*³ú9¢œ]GêO@ ™¤6aŒ™%3¬ÀBZÎpíÅ×sÄá¨ÎÇžýг‚*}åÈhjöJ‹=Ù…¡fxtbÃ[öé¡ÙMæ×£µÌ`ýoYìj¦œ"MŸT`"ü&åÊMl©Ñ£‹9…'*sÛ!¾Ž§ÂÆÿˆóêè¬îqÃÂŽsÛÕ@>íϿ좺t¹åfÛøÙ^æò§ñCè®RËP) Â@¡2ˆšàr ¨ºöÊ+r:XÿÔÌA§ !eÎFšÐIÓ×O‘à?ÕÂ)Æ™ýê¹ÊoZ;·LÑáöGNæ¿gL‘õê7Î~:.ø`úžÌÃÏ;IGyg­CþÜp=íiO{ÚÓþšöåõ%,þBf'haÅIEjnRB1mhì†á¥I-NùÚ!;ô‘CÂT[ÑuÈZBÔ]¥}$›Âå¼?º=ÚûÁÜK*€ˆ3€#Š(ˆ3ŒL ,Ô*½áÀ{ZœÝBÿPèí63Æj9•Mõsdyk‰'ZZœ ìiYÛN¾YS¹e -v€Ã6àe ¼oò?‘mÈ[¨Whò²véPcêÅOÄhˆï!X¥4+uBeÌ ‚Ï5磖RWÛ.##ä=ßж”ž_ $¥f? ñÕ"¨4TOR9!³ª±°ý, U÷y–³óŠIë÷ÅÀ"3 >̃[n#¥ý´—×n\õ´Õ–ÿ¸Zä;MÀ¼¯þ­ÍÎRÚ®%× ‡ÚШ„#(‡,ŸM/dyk°µÎlÿàv ‚³LÁV8ÂÈ8n,ƒž±Ñ߬dä5.Û´ÿ—³¢ÍbQaø ö~PžøæÄÃL¡Dr 4ôœŠÝcõó1ÊO(!¤2åîf28¨'Ñ3ÄÞ¬9ÑK`Mz›Z?X¶°³è’gY®¸4"œ°ŒyÞt„ ~’â°÷¨Ëp`¿xpu~®\¤[)í Òç×㋲?ÔµŒž—KËɱžÈüôyp²oFÿy~Ô0:o(ŠÊ6 F @þø{Á:þ'=c¯|×UôäGø;Èò[ïÓîmÏtzÚÓ~Cû,J²¤£é3 ‡œ.m¾KC~l EØE4IZ)[$žÆN¸¹ò’JíCÀœ.ˆ™“Iˆ=Ì2‚òÒÀõå^KO ߇ý⦰ƒ”nï2 †ÅCer+ï+X®qƒ…ÌFù’,Ù€YZ ˽õèN†À•fÿ8 ý±;†ÐE"„ì[WèêP82äÍ% UCÁ†çúO~'Kš¼Œ-ÙŒ1µð@Š\ŽÕŒ¡U2mïÛÜ’–ŽÎ@¼äPt¦Â?UIi‹d’87]ûh³®u‚kŠz_¹ü‘õ'o³â9:jwÚ\ ѬѲ*U §}Œ·Ã‹Ã´À®† b3Ρ´vC…?a¶ Ê;Úd@Ì"@ îóýT@/su6FÉž;†Z¥SÊYMtKŒ`‹?Î`{>ˆœ"Ýi§¥zÊ®¦•¡*>…ƒ| BH_‘A6ªF÷ò‡.|2´ü×hã=f$­œÚ…(¡KÂ#Œ¾šÁ•`GÇ\j CÙeqÅþ^}:gÎé>çh#[‹±4);º§(•-q'u±¿Ý-|ÚÊ‹.áVjm°Âƾ#ºe~q¹J`ô³¥êÓ/ MùZˆ H\„³—ð¦óÞb<óRwâ¼g?çqOå·<ï9\'œe‚Õ·¬ô•J`iݯ”oÍj> 5ñ˜øÖ|2d\+‹Y]‰¼¥o~à8¬hÇw|;óý\¾ËjçísO{ÚÓžö´?Þ¾Šë‡a¯CŒÿž‹["ó]YDîçwPh ß}¨Üâ´zŒÁ#Gd ƒI!*d½5²vŒß5¸¬s„O`*LìBo«5“”L0¿·µäÖb-7.ÈBÍÄõ‘Öô9Ú›D_Ùìñ;Uï¡Kîp~[Âø‚nõa¯QÞñëP¥kn2ÅVŽ›éÍ÷¿4ú÷°ÎÌ}A¼CÃ+a¶½|ƒyøp¨©HçîÀ c]@šé±ìæ;1 í a¡4 [R'¤`4/ÕÕš¾‰ð€¤wñJ\ï‹- cíV\â~á4Öµ(º'I…„'žcuu¬ù‘ÿ'àŽ°Ä"¢g^jôF 6Ã.¬$…à&å[}¾‰Óo+ Ù²~‚óp³ÔŽ>Ä´UÝÒЭÒ.0jW•^¶>h¼GÈ Rf¶ÃЦñhÖ»Þí2#ãN_` ¦9A³èV’—¸ œ"™ýzM´§/ \²õ'UçtUPôWaPˆ¼cAéË~–9)PÞc°À¼|hapË›þ2SÒA2ƒÛ'hK*¶.…óÁ V‹ªß%©»cO%MnQ¨ŽT3äŒo*gXådºÆQøa•Mޤ%Vî3U¤([±áO7tÓ/¸tFHd"–M_)U}Bj#!Ý#VÈoÈŲ3}#Ò³‚•P¸}Nb¡R´¢: ÓêÎ@I1öï¡{%4f¯_J¢xÖ`\”Bö£ëZ•“Ps< Äy;Wþ··´1¨ å†;ý]é“£\¤²ÈV½‘–Ü×8*µÁ%2-×;‡þcvavïlXÆ=·”eVÎ8‚)Y¸n|7tÊZw®¸ar¶j˜Þ|Î2Ïù#CÎûgÎh:}$ ןßð¥o)fÂÌä'ð´¿«=ÓõiO»Ü¾âZе‡8€J!>.|PØ=¶­¬^Z†i ·šï ZÌ-Æ&ÑφK©ˆð*Fþ‚±‚¢V³–dF> ¶¬ô¤Ü©jÿäÁìþžÊµÒÂ&ì è¿»îÓŽ;˜˜k›P ¾¤º ¬1hÅ[ºPÀA…‚E0Qφ‚± *}8†lÚT\³<Õ²QÛñ(;e§å±Ö¸öЧm¨›¸ÿ®{F„¡*?^^ ¬â^Ò ù3@v¼7„=Ú$0éäúVéÕ®¤Q8Ê`öYçMd‰o5“òÁÌBPïZºö"R\a`ñ”fg™…Â,ÌÍXË‚lá™QmR½6ô6¹H÷>½]dE<Î\L¶/¿Y©MÉhѯhºÙÂîÄYe¸Ñ¥!a`\iöÈì¥!bIúˆÀL -hô‚¤ã­>ЖÝZ`jŽfŠ5´ 2 òM£i4dçþ@˜–ã6Y¢½‰ 0F=óµfÏAýÈTç*E´SÑ»Ôë‘uÓ$YÑ›‰qØ×k#Í:«ü“ªU8(Ó-b "àrÀ¡àŽþ‘+W¦f‰²ÞˆdÃksýÝ/ØbÀ™àxA¤jvK_ÿD^êM ï±kÈñûp­JÆñT·b©~o sxÔ£çrAþãEE—EØ%£U “‡­\âí.êþC»)¹¦ºvu;ã©åÉ‹ŽkÃòÎóA–Sú‘\(zÚÓžö4)ŠÇzái®}™cÉdÚÅ3êS³g·†M_߸g×H„\»/W¿y 9ú}±§Aƒ$:¼‰©Û'>H†[xˆV ÆhaÓDw°f¤â´D¢-°êBÝa¤•‰ÿKÝI¬)·¸jÃ1A†b¦ì -òÄävHIæƒ\jˆ ¬µQih“™Vòˆ½\ Qø…²Á@Ï=n±|êξ¤o¸å2 „Ñ+ß^è?ÞVº¯¯Ø´;1Œ++ÃI1"û-ŸvygÌ2·Ãu¨¶¶·àèåUÐÖÈÆž7"ý0!@™P¾)O<)ñ9äã›´(±£]º[rÓlJ/î.­¶cw *ªa Jæ+væ{‚áÂ+ ÚÝЃ™µÏ 8øäx|t:Z¡ž W$8×TU! Íd0¾Ó\…ó¼]‘.”¾ MPKÛi3(ìÉW§>ç´éRá`í¡{Òý!ŠšŒÉ±sX›)üƒáoEcRJ ûÐlERðTß †k•6/XUˆ2€ÔiìLÈ•ÉØZ€9”Ü÷+„ù˽ô„3ÜF0P_äbê5žá¥8%Í¿9‰¹öð’E/«ˆ%l&»öD‹¬õ¿]wØ%°N3ßënŒg/Ì|Ë23N©~à Æ)®nvLM)ªôÿÂF—üO,Ôw ¼wa ~_ ]Å*±ÊÓï¾”…Âm¯Æk½}Ö¨þ$•tIââÆ¹8ƒ0 ËǸcžÚÀsIáÀ-fƒ‚[»ºò¹X¹yÅúüàÒòO{ÚÓžöom_ž7n‘\oM£Ãki¨ CM (ÐGbáòí¹Ë% ä¹6Ç îAr³×kÅfcê°8Ha…æ7 ˜ÎA`/º[†ÃG˜ŠÔ²ÈžÎ¤ì U]@qÅe¦ˆb†Ò%ì *‘ñ}†gF@ò[s‡¶‚Åt²?´òîÈ0ÐøâVgÄ=DZAvD𱓮2yýÇ ^ß)û‹¤ŸUT8n2³ÛÙBnÇ'G]#½Ø¡Ýƒ‘¬h±jàTÃmå:;_:ì7òëê^Õ ’¥²\ʧ1&M9°Je^ßÅêÿ ™_¤³ZMéªXG—¦1¬ˆ)O¤Ý+k·€ä’ëT0ɉ¿ö¨¿Ñ:l`¢ÉRz‘ŒŠxZ­Ü„–U>.#Ï'žbE§>Áí’ûÖ`t4q–/ X“ªLF1¯#MÜÏô»f﹆.<ÌÀ8@ Ç(àƒ9vYÃâßÿ×p8'Ýà/ðé×UÉ>†ôäà9±¾G.ºLé8µ}ð;‡WnœzÌ–ñ}*üã¬R²kÌþTÛš‘Ÿ¿|êyÚ/íBŸvÇìúûÚ3éŸöoi_ž9,@» KÐ{•ܱµçýÍié_C ÷,ëJ-;‰bGæE(¾æzÈáî?(5d\€‘—€…ÀdH®ñuX¬-e: Š;®û“ö ÙE¹ba XÃ!]9+½×J/&Q¡€³JëÖ#wâ-ÄWÞ±¶ãt:¤1¥šlú-\Õ‹ÍƝP‚òÎi¹=ÛþR×Ù•|¹!˜…]6MvÀZ èÏ·=М?ß>ÖÈïÄš,Ü^Ää–à«ܰ¶Ú‚-(ئj¶Ò éÕšš¤K´oHÖõ ß³eë îÀÑÝß—°O¤Aá‚~BÄ„ ä-®¾I_ùO£„,]ØË&˜ ÎD’™ä3]¸Tøqw²nÀOÑÿ×*ØP.CØ>ž4èsŸ–ªTB«ôxÔÁzØ8¢½CFÍÌ´bKè˜à6/ÎP+C$˜‹™>£‰´«ÙÊŽ†é¿§Û7dÌ‚|÷R¥ôOè!ÔjnòÇcöÉgNª,dºç0=R³©Ω¨¤©ŸQ,-’GÄ|.†`3Bt$ç¾ëÈwZdÎØói”á}÷ðUynb¬~üú-?޳Àžöfˆ¡¼ÆI¼’ÃNàÖú§Âö‘)’4I’8ǰÚëƒ;øæi™pº­–GÃeH«WiW³'¤ZÏ(#-DáÔàþ•!¬ûѰ’i8ɾÿ¤> dò~Œ•7ýÎÓžö_n?âÛý´§]o_¢(„úÙ&˜0þrœ9W!SOv²C®Øb`©ô`Ö¾Õwkv%gOQ²>‰9»[¥šT‡‡^ÇâãðdOWÆâU£«K´+ˆH"†¨ F[¢ †^2"褠í¯"ÀóH Èå*?rË/äÝ.©þ†³ªvýÙ…Š" B‘ÿ‰È õÞíXJþþBçÿ÷~©m“6Ùð–K[¦ü[à_k$¼‡Y§³n p6 '`ö@Ùù0¤½¸qøšU;²,7ió+<Þ\d`·Xpù5˜K±)E÷Öv [§™º;`ôË;v8OEë 0“E¦üzÔtï‘aDéMü~Ë`YÑÒuͲEëŸPáé„Ìn¶‹è…þ½»8 7_i¸¥úï{P˜9\ ?XŒÉ5œ t¬ŽMþà£3æhfn¢#Cä"Q$+ÈnDúhÚÉÒ< 5G¡AlµúD¿ Áîmëb&z2;~g£›†_ƒ9j·bs¨-‘.|ïj ¬ëîÜ #ˆCN»ºY}²öyò€þO{ÚÓžö_j_îÒµ©+éX­^¬C,àÁV”c81œ zÓ_Š¡oª¯Í/®ÑÖ2—OÔ•‡ú"º~ëx®V?GùÕàÑp2Z°ªÉ°«š˜ ÆûºßÚŽ[<àÅÂ_ö†«ùàíw‘l™"‚CÕw&ÞF˜åø5ÐhzÀ"€:Ùj&q3æˆçv|E/©a~÷mÙ;-·%Ö$ÙXU×a‰Ó·ñrF´j6È6̸nf J]£Å*Šô4-'®­&veeín ¡bÜÐJâd’·ÿ…©Ú)QÍÛeÞŸÉ’€WeA±Q80±Ôr~è´§†„²$K¬n"üMÎ"Ç𮞠ËÅÊÄÓ¦cg‚ìÕU é=f¸b Û&÷åW G°DzÕaÖÍRý¤oeéòÇŠ½ÂÆÛqÕTüÓ¸'¸¡ìNƒXÈ< ÷ aÊ™jƒLTmÞàYð£0 Ï/ÌËDJÈ ¢ÃYœèsDg%XG¿8 KÚÑÊïQ,,C±¼Ëͺí“HÉõz°àÌ,ý÷!,)zrFv v0 û\ýÿ7u8Ë“`aÇþæ7ûP7ÿ]("ïè®kRi±Áe|Ús\<íiKû ôl5Ôw×H|€‚¹ý¿#¨Ù¦Ñ­¾ó'+¿ÓoäDc¤Šzß)»%Ƈš ‰L¿Ž}L3U}Ÿ5ˆ¸ = ¦Žá’xAðÀ j²†5“R åK¸=#›W”Ü|!Dg|ºRk¸‡ŽùBö]%dò÷ P~qÛÁn¢+MA^EgÓyHº<ªNAÿ…ןoL¶X˜¬\nŽÄ®5ÿzfÆå¦lôïTØkSö+ ±ç `§ X‘rß¿ÖRY)rýªÕÐóGÚ€™¦Y#°;½²8¨\ ¹Î¤«'PNøniËd뉆±nÎô½Ë©‹ÐozZ Z« ¤+̤ç­BˆS{g1$TnIÁEm?ÒIåŒ0 Ù5b±™ûÔEÍ·Rb ¬¤ÿ‰ˆÖˆ“Hš^àáÒJÏiêÓ¾¸9Ä­ÇxåŠaØîj¾õ˜áz5èÐLP+Z´=Mš°,Äåõmî€@Á»w¹À63ç[0…Z,„ä¿_ÍB ûð47Y¡¿(î"q]ÖZÄ&XKg¾s)Åó¤>–ß§úàNÀ(ïµBvéÄW^{2çÙÃpJ2»€ž–·PJ.Ì‚kŸµÛÿè1ÌA€ó3ûgÑÜ: þ%X–· 81˜”B­ÐÿìÕ¦Ù,Œ}ÁÆc0pîaoP“ñiùì`F±’:œQ¸¤|v|_—~ÇÃ<íi|«ÿåí©¤yÚ©ö•x<x¨¢§ ²ù¬׿Á‡.Ïäü›Îu ™Ç¦?†ÓhÈØR9ëŽ7Ð  «_Þƒ`Š "#ŽiÙpà~`_?µe–*Êëo÷_‘L¯iÌ ŽâŒÅ…'`Ç32:òâvª@I78!xh/Y +ÆôÂ¥Fšpÿ?dßÖ)ûa®«á¼4;«­¿Û± …™ñìÞ« ]Ó¦‰!î ò"ð–¿fL‚hÚÚš&MŽ”±ªl‡Ue)ØmÏÃÙâ GT‰Ò»3U $ÁþvÏE/#ÌmšÖëÓ%¸)úÁ¿.|HêŽJË\˜mÝnæ°ƒ]wDVR  'DíuÐ$ì|cØ^œWª>Aü±Âžñ…Î+h) j2RŽ*ó YXÂ8BUòBo6›‹È1Ç Ý¶¬±{³÷Zµ¥äÁÐÏ8'lÕ=$œ.Öwõhì‹1ŸQÖa¢ãlŽåÚÏÔSÚÍŠ= ±ÁkHà?gµ îö!£$ŽK£Ú"jÕ”T8þ¸Õ È ñœù<Ñ;Ê,–åÀípcMƒ[bÌ8«°bÝŸÁ)®j§†(IÆ3´ # ñS9‰{bÑšÉùxxé=¸üïC%«´ÐhbwñÚo5ɺaâVRõgQþ·+§ I-g‘”ÁÅ0’aß`v^ÿ$ÐÄ~\Û½ Çb–ÞÐK¼òäýãtÙO˜ç×ècü´_¿?Ïö´§]i_¢b6`th,"±9ÿqàîº —‘a5ü@Xˆvj (©é_¡éIGÏ´p’œ¡ç0ÄðÇYU8XGfÒ´Õ>ÄLD¨´¦tÿ-8ò¹‡g©½` ¶…ÝÓ ø¨€ÿêF2m8CŸg±œNÑášL,¦»Ì§èø¦Ô,í޶‰¡ŽîMG燨ðãi÷P•™OŒã®f@£CÒ`?yºwpeÐ:„ÖÄXŠåú¡ÇTBϰQd{¿éÎ7ÍŸV÷‰òÓ³‚ÊR¢T×aÀ4qtûœw`_ çBíQ•—xŠÈèdÅÛ;GˆéÍ%e®ù ½&‰ÅæÓÍ09bVdFYûÄø’ ‹þÃmªlÅËÄo–¥ÖϳãÍ "\êz~%U¢³‹ÂÙÉ–‚–E‚Q§IŽl$G²G†XÅZ (md3uÅ¿7ÝK Ò‡$ˆ¥z#¹m´‘GòÆô(ëU¸_V632ÐÙ@œ Õ}(ëÁ÷ì¥'®:Y!Ì•J (:_:âCoê f*¥ÂÒ7Ê\!gÞså„ϤÒ'W&—`ÃI:“J  L}&àx×Ã|œgßX |M0LMeNÆJœ‘DI5¸¸Öd~ñöÄ‘K¦Á¹QßϯðÏÌåÅýêÂë\K¼& |úF?àóü‹w §=í_v><íi¬}õ‹©¦²Hÿ"—ÄñlÊK‡ 2“ú¤îÞêÃä ¯ð,ޏN -PØ^Õ‡Ø%òʺ ¡Z¤a¤jxòä(ÉX(î+Õ Ì¤Q³ME€e¬îaÜÌ'º÷XÞÔô—z"êð27Å,`*â<É'''1Úà¦mìL«™¯À5ÍÃ}ùå¾ì|ÿçFPiÚÀƒQ™€Áàñy›ÃQf]—áûNŽYZmt¡y­›¯÷Ƶ§…b£S«63 –+ÙÕs2$`ÐÑgÀlknÞnm‡aé5ºúú„×p°IÓø¸F+‘7Æçl*<캒ù‹F˜†Œó%,6½¡ÿ‘ ÕƒN ¤;„2–ðÉþç}âgåÒ¤õj` Ù±]1±*'„aÈÇâŸHe¶QìÔ°B4)4?b]qt–2¨¾ÐNÇôàxWÀ{N´zMög‰"L¼A?8·ø£O‹È)G%îc©¤öÍ" ÚPÌŠ]DŽrѹ½Q÷¹ÎO@ÊkÌ)„€HRº¯œañé³[.Áqïr6šg÷™¾Ùú&P—¸S1٥ͯ$Äôa.H ·®“R—לUìæåÙ+£$÷xi,jÑ,—Âtsàže7cØÛðv œQUèþ¥Ð.uõeõ3ñôü®ü n˜Š<û{X“[-IaÎD©äÀ\µwz39ûÊ‹µq7®8œþ¹Íáiÿ…öÈÔ<íi¿¤}‰Õ÷ º°à ØÀ..=0àhìÝ¢,'°ã‚#Ö÷ã¥é,SÛR't0(B!«æºx Ãk%ßWbDdàT´ ÓkíuÖ¡èÄÍþÖôI Ô–Š/[L, ñQH~-Š g »`oªçcB œuV:&I )¸QïE•Ð[%¿±˜C+ªWr8-xÜÀ¯:qE1¤û´câ F¬`Ù쾫,ß?mªåž7ê˜Òºó÷rŒp¼×Ë>`Ê-»ø¦ÊT ú„ò?€5èyZ­4D÷ T|K+-âö ¯,d÷d( Ø$Ïî0Ù<µjM4”Ö ¤¶¥ sÑÊWÜsA—¸IfðM…õTBdÚ­ÙaA­nÏ.Ýã1ˆ,øT@Œe’…–:´°5’œÓtƒŽ¾/´Â>ÈÎÔîô0;ÑeÍ 9(>µþa\¢=¬mF¬]`¡íc’|+tHk> W”ÆüŒK=ú&o‚]L‰D¬`È} Ì*K±¥ †‹Õ&ΠFñÒUê~<¢>ËŽlrQ·„KRd¡Vxß Rà{þå»I³X ñ‚úÉ»p°C’×uM¸ÔŽ 3ü¯g•| 4f{˪âÿ½¨Û½ó–ßÿUÿàç þ›ß膥–øüÑøs¯y34X/öÙf`tÿÒ× uÆ2«ù¤?†Ä—i9þä”üU§ßÓþ£í™-Oß>í—´/©À>¥ƒ"ˆÍ-:B>ËP! nÎñ®î­qsv˜…G+Æ7ãhÙ~îr`qçË^ÑÆS‘ûÀ¼ë<_{,`i°AODZñp—a¸â;¸Ëu®ŒÀí ¯Öó%¼$ŽHwÁ5,þU +‡JˆäíÜ#Á(qƒElÌŒê"Æ®c£Ôä=<$î¦r'Ûñ‡»`q¢"0Î|˜Áçvà›fènÛ  ƒƒœ´S®õäÐoJC]SbŒjõ¼åxr÷½9¿Lõ*'·k»¨½+šI«”ÇZgV€"™E!Íìw£lð]ê²¹~N[WjζêæÉY©i Œô"´_t Y0éc(ÝÐ$©d5É—Á\†vcú°COBxi£Qr7þ ó‘2Ñ^Q¿épúÖ?BV°"LØÓ0VC:÷ÅÂÞ&æ9”€=gVšp*ÌØÅªáOímÏÓQé b8ùðt u¹ð˜@‰ 1n§§:5Ü™¹òk'£=f×›?2Â?IÕe^ž¹8{9SÝ©~¸€þ?-m'J»~@È…?8àøÉ/ü ˆ«iÚ¯náÃ5ý=І›!oxZS»®mM("4Çâ»ë2ýjô½÷dáBðýísá Œö§=íiO{Ú_Õ¾’Í¡tz2ºÚ ")Å™ ¨t~tƒ$ÄJ” Ã—Ð4¨\ªAœP“ÓZØWE)”„£'5²¦s´f›ÔtTí”qQ÷/p ^ÿŒ :.øðÐÖ:3 ºÀž››n1áK»;·—ðÎÔ’Ýõ ?úDOì4œñnQ :tr=yWì}½Œj_ æ¦=u¡ÐüLó]žÞkŠ'Ýw´” [?’)jAƒ™,ÕD¬Ä¥q5ÐhŽvhnÀ;Ìn‹vJx×RCÖÔŠÄõXQ釹ꠟ£!tФÜ\šÉB€*h±h`J‘GÑ·bÖ_”Š¿!1AI¡(S>O"g„a¤?3QxÓßë¶ÓèèØ·}eEË£¶cÛT¶xBÇ4™$‰ê(ʪÕÎvøuxkªúžXbÖ)Í9’fpÁ\¯)ý‘û Zk­S— ‡: œ°›J¹™ Ód“È‹†6íÚöÆdd(줭Vnú^:ûþÛm 6%¶Qíöj!îÉé'Ûèt¥Ë€î 3hTý‡8a¨©ãr?¹ ÀZ%‹_pŠ˜Êcf eµiÞáÎáÅÌ­nï¾ÀRrXsUÉÚÒMÈN¼½Ýå÷ü3P †•ésÊBÍBÌÊœòc˜zEŒñ}\†ß ±gÅßÒVâäs’<38A½o-\YÆ¡c¸¶A!/ìË‘ž~˜¥1DFý©¥äÆ_ÊÏ–ãtg»á o€?Xßó´§=íiOû»Ú×èÀp¦˜Ÿ7‰3mT¿/ËÞ“ïß\ 1¦^ö©œô¸ŒE…@“Ð1zJ‡Å¦'Ó +Qâb[“ˆ *iåÄÐ*mòËV>‘·Ò7ýõQÚ¯\¡¢x…TrCZì"^OõÕÉõÏU„€ÅlÔœô#óôV˜a‘Û8¸VƯD“èùã¦à×$k‘­¡ÿ02¢Hߤוê"HÿÕÀŒm©Î$¨¢šÆDÒ“iÂO”}hœó”ûKmÆu’/‚κû4¨. 3l¤)¡€¥Ù"Ý-[ÞöóÅ{Ÿ2£®'*(Gÿcˆž$J/a³ÕÖßjÔ݅ᾩý´ ÉÝʈh›§º6€÷ 6¥ç»â‡ºîjbl"Û¡?Ån JÍ|³¸ù¦Ž3Eg¡\ I~àT¨ís`™Î„Úf)FÞªò¸6d«íãt ÑÕÀ IDATP„ú¬–ýñ¡û§ ‘e±X .1„÷fç0V§…´ô«J0–Þc¦‰‰¥¸Â>™§Çà¡UÕHD ””'¯MŠ­ŒÉ+5³Þ>Ã`w&}¶r®ì/¦ Ÿ€¯º \ºødõ•sæ„Ô™ÅQý«äÂVKO¤™ðyç‡ Ä«ÝL‘FÖºy©Ð"­'vàâÚ ? ÉK3ð&øXîÒý—…ÌÐj£ìòØ;úü1ž+ßÐÛ—†çÄ\*wîÓ˜ÇIcÆMžŸõFGU?¤¦ñ¸ª7€#¸biù8àÛ¦ÏÓžö´§=í—·/gB ®«´U¤†“M((ª,‚:-11~HdZhð8]ªa$÷`…Ï´5:Zp=Hùíé ",N5>ÃLY›%TÖWæ¥9=Üð΢ˆ š¥MîBC&uPÎ4b&ó ™Û§Â¦7 yèäÀ}oÀ±ø L(r/ dÕÛ›¤~Ë=¼»õÛŽ‚ê/µD×*FÚÎDðÀ@Ù& õÖ: ½¥ÎlIæØ 9:½Ø:èõ[’º ,—ƒãkZ Õ{(Þ E‚…Fâᵆd#º'u¦,v¯¨’²£Ù›Tœlº*B ÆÅK*7Yy/sŸ1‚çHaWº}‰ÁÁ~W–ÑèZX¾œ¶ÄD ™‚Ùœ„ø Ê-®7ÜØUõXnoqù9X•öÌ BRÁ.ú/BlQI¦ôùÏ0©ZšÇŠÚ3–† @žÒ`½àøë§Íi ){b~êIÚù*)Aê°%Ú®å\U€ü8F(2Ðw-ÀÖÌV%"‘ 0€ kã Q\G( (if]DfÇàé"®0'•§BQcâeýøWSî*)µÄÖ +cý¨víÒ•'PF¬ò¼ã9§QD‘ÌlЙ0P"#ªÊʸ` Á<õ-þþô/hÎÏé—µ²wÂŒ«×?mýKOóƒQæHÅñM¼;FQ‹ œÝÜðñ³ß" UíÌ<#õsn^=íi?°{?íiOû }‰Òëèv OÍyD—P ~töÖǘâá²#€˜wštìxÍ5¿ ¢.m •µ»ùEC3†µx ëÓ׃Òm«ÆüR”æ,ñÖA6PñØ L‡p`Ž¥‘ÆmQ ¬FÝé­ÇM°6:»bòÈQCh`¦@{W2ø`g`ͦ€r2èNÛ…ôÜe7Ìç£c7QpâõL4ª‹&è ý]ÌÌýè¡pýî¾BE{Z3^pÛîbe‚hIÄá»ád4E(DÕÈÈn]@rØJm?3à!E“ISáöFŸEP8…Y\ÊÁ!×s ù׉Ú‘"°²Tc^e"5ûÕŸÛöν–ÏÎàëÓpJY Ë„”µÃVtÍã«á=—iEe íPZ§Ç¢¥oàþ°5uÅ'då)¢Xêµôú- Ýç Sµi H¥]Ä»t¥T¦·ã ³šCO|P™—‡ë¥œÃ%”‰„øeÓ‚úà!Š({éae´ ôðÌHƒç‘PZjÙ’¥Ô,øS‘ev@¯…¢X6~W‰2s”¸ö­Âz«ŸÆE¦q¢øT埒èRÍÓ"¾uZ<¦Óï6>‡úð»^(íf|°@Š” ƒ¬Ù9ëö)Ã*ã…›:V®z!dªr‹D-d2÷Ið=í~`ÄF,Æ=¸)†ºØ:É0dB6‚š¢Å–}ŒŠÈzθÏóÂ…CÝ1X[·DÉÚ43«(G!Úíë)ªk ÖiV ªxþÖ–½Ç‡ªŒZk¸çYOµ_ú?9˜þêÏ¡j: EÇ®"ö°($*I–‡AOlpˆ"õUv¡ØŒBŽtuK¬_O•îÕf%¼][8q#ëd1Vã/¢¥ºg¤ˆF‰MpІwÓº¥ØáÖfªciá@%f_ô~/š/žAåý {h|§uÏ½Š³«û¡—âyàþÅÙ6Ùœ(<ý>ÀêÎ_ôYƒ`R þ Z@ÙóÆ­)Ör¥P¦.€Ð?ði¼ µ^Í<5À/´>Z´þ™QÌUØìgõò:2;ƒ¡Ã;I¦Õ©ãir·Ña;ÕQHIZLŒ¹Ïpõ¾M2‘Y®#ØI5:ddÔø$£Ïsrÿ® 0¾Uòx¯‘\Nª!|é´¢bb5‰²§—Ý—²óñV,Éä-/I©ÍŸEŸ”å]wȱMhö Hh.=fC3+¹û›>@þÈ0æÚ“"¶é|ÅðçÌÃÀ Þ¿¸±;/U™Dô?»¯œ˜-X<æ×~ë6lëÈëW2;{ÝÛüHH•oqÓtâ·¼ßÓžö´§=íµ¯DÏXG‘Öó3ú¯ŽV/ï)fq¯Æì ;/0òX‘>œf^ÍjñÔ%¥vsÄFa/…¾®"=KNTège'(–^êeô«‚ˆöê‚FEêáÕŽÎbîb]¥‘ÒBf혖JPŒV»3Np1P¢f/ D¶ÒrN¤­ËQPœtÙ«ÉÃCé|¿`A/wîrÌôÜ­X0”»²vk@° àIâÜ̱è¦>&D•Ž­pp“ß…q¦uÆFE„ê©èwõ¸ßJ æ!%PÎQ¡Æî[\Ù‡Û3u G›Eê7½" 휯7ùœ£=š°¹R#›Ãr5pCퟵzt³ a<ÁÚlh!¬¾¥ sô)¶?_®GÑq}¶ƒÅJØ0~‹Gáᚎ`äþšð»ÛƒdŸ6mi E’­ô…ãöâTm#piÂT1,z•ÅOÍcî54³’‘\ǥ΀Nné…’KÁác­ lWrPšfƒ¸/qu½6©˜íÁë™&/š'c™ðÁ[¿bø¦‹+ß ùs{1³þ–òЫ?F;²`4IyÇ\¾ x½:O§™ætÅÏ^ ¿ _ÆÐBæ¶…7ÍÐÓÓéûú}øi¿²=sòiO»Ü¾"R)µ +1«(·8Z¥Þ]9KÕb 'Q_¸yˆ%³£¦¾¡È4  ‘êßß2Ú ¡¾g#ìÕQù7»@ 8xa– ÓO`>ÂÃa´5½khI£a°?äIÆŠ 8•8(k`„Ý52?MC=i´ifQ´”Z2Ç·(ý -éÐF‡ DϸlA?ÇŽÑûvds ûc÷íôv—4:×@·Ê%3“X®ƒWü½uN…Y]Q†|ÜQ¼±©òO‘ZÉï®!ÀîT¡Û†ÄýµÌ>Ú £sW£sC'TñP3T…O^)¦¼ÆÈi>COû>=–°ž90鋇į2=£Æ·<'çb Ä/ÀöZŒË¡ó, ÎÂ2Sö¤3p0bn—«çÌð_Uiä¢kH/·¡“"! óØ=]¡j³ˆÄ°¤Í+Úã›k²-‘Rß>jS9*ª|Ûàeû)Ã$É$Ñ´Ù­ÀE §Æ˜Ž.OR¾—£ªTÈ– ¬!DkÐ)>A֪ͣÔãb_ü–èП lvç}RèP,aË,ÁÛž_lj¡ø.,혧§Ì…ˆ2É`Lr·˜g®Y®>¥ßö.«Hqy8xÇTøKïúæõXy9ׯ¨>Ÿ)ÛX› wm†ëŸJ£¶ yÇó\Åòxþ [‘ü–ŸŠgJFn‚nE Wptû$º²+‘ðâh/%_Ä{΋._ÐêLjù§B7¾+à¥êMr«Þ%Ç >mÖgµ-:Ño„…Ã7NKV*%õÓJF<§–㣭¨É{«¡—sjl i´h­–îå\b‹x¼Ýq•ü°FDB»†FÑ(QCÈÁ«£šèŠCD™/OAÄuw›¬÷ÒÛ”Hb>È¿P}®B´& û|úËó h+WªiíJ|*#CWða¯)hW®-ë8ÖB^ñNÎré®Äù×ã4À—gÖØÂˆ»(ÁwŒi 0…ÂK8&Ëû´}žÇ?¥>ÿ³m V9’‘’ùà&—^wa|[×b¨óó0Vç§ óÝ,~-î›®‹¶ñ8Æ‹W6þõ½öÊÇRnîA=‘Ÿö´§=íi]û*O.¥¾1‹RR‘ŸD!€¡"ó`C‹Þá–Ø¹«ÒXTh¢C—˜iŒÂŠüÀ‰’ÃCŠ.õÂ5ÂB6%´M…ÙÁm¤H-Ã2òC¥yòä.h)ÃÿS ‰-̱FÞ”ÔfÂaˆ¶·Gôð Ï2˜œM:?±s8´õµ*´Æ¶^¢ü gV#^ÅØµ§[xÙÆqS½L‹l‚Æ”XKâ=ñRð B¦ðRÅ‘኷aOÙ?Ä¡«“Ã4Ç„qYº’t¬¨¾¤GEISæ®b ‚ ¯®Ø``Zʦ'3ŽQh¦Â‚xô³mæ7áŽÍc3•0,!8“KºBÉÝpy'xÄi=3sí«t©5:$ôŠ n&'*üh|yýv4ªûú³ó8œ^? èvÜ)V•@cöGˆë¢MŒpjÐíxPÜ1΢)øà‚ÎoáÇÔÐI8:rHĵOà‘*äUÑ^ÿ°Ÿ»àŸj+>r3¹§=­/Hú$¡B!Q´@Ýýˆ³)Q òW•‹Š—¨#9¥¶ßÞW5"‰°2=žÀSræ®9Vá¯XÛÈž8£zyíTúQ‘Õ;Y,@„iþŒWŸt–‹)ê”`; âkbO:r-ªA||2Äî4¿€þÿQÊî¥êç—ÅhMÜÖ0œÃ-«d†1èþg¿ƒók纟Ä%E¶¨9­›x¦.'=ÏÍ'ÇN÷Æý6ÊŸ\§gGkãó}þ´§=íiOûw´¯³gÙ¢ !†wVW<…k¾3½ÙhÁ„T¥'AEêÿ=»mx% Ï®Uñå!—q‚Þ,!ySÑ/ýwE±þÈéXâ튈‘÷`ŽÇÀˆì£ìzô7NmÏH«µ '¯D{†d ¬Í£8^|£Ên°nšÑ"ÿhœˆ^ßé•!€-+qÌÙ7tr!´18È®õ÷E¶£Ìâõÿ÷C¾fk¿) c1_Y""²ô·7§žÃ`Œ"w³(,þ”3=]Cõ…P!ì”Mdƒüïø¸}z u¾E­DœõP†j›˜nô˜~AÊ«O2æèà¯øx£“³™ïðn|â?D6ÚÚ±25ábLWRã ’èW¢QâÊàìO÷5‚WsHKŽé´ÌÐp2[1‹ +Á¬D—/¡UD)I‘LNóŠïÖ$ƒ .\ÁXÆ¢<`å Ùx1¤"X¸ep¦]ÖÑjm®Amö5¥ë~tå!e·M’TçY?øÝµ¨½ë¢¹Å&̈ßFëÊÞÛÔ¢©sr3áàHÑI¤·GÏl¢·èV#Âx¢z“vQdÆé²&»ïo\vËõà6r8‚C1ÄßÄH,ìOÒÄmZAUìBédä"RÁpZ®½PV¿¹;L¿â»P­Wà€"û ÞoC«§2$çšÒÏ™ÅÈ ƒ>ÇL3­¶É ¬é5ß>‘~à“ÿfH)ɽb»^ýŸÒÄЙ9µŠ¯sJó‘0î»°r³)‰Òð9l'«1‚õf>@—`½7 ¹ƒè­'íÍ6%‚:ÂXGHÅÙ×Çr7uªØ“l”6=|hkT§þ„¤‚ÈÐÍ—ÐŒæX\Ë]ïŽÊô¥ÀiïÀ` ~À8QáL·QÚ®Jk}òeˆ\‡„n—<ÎÌE8`¢ »nUZä·RÃXf4÷?ÆË¸<·?>ÞÑóú…O$ZÖ¾Ûmé5¾œ{¿SC=gþM ¶Ôouĺó¢¨QÖÕ«pb:ŸøÓE[ïo@ÿ%«Ž=ÕÚ~ Þ‚ß°qS]Â4éË«ód~ý¨~ø@ÿï÷¼ï_ÛæþÓ~¾}¥Ç ™o‘D˜›(„z¢N±x$Q4&Ëc)‰@aç pB›Qj¹žpôVךÑ}‹«e¹ 5aDJ ·qˆ‰–ÄË K©X85s%§Ë2{ņ` f–’š3hÓN€šK %·Ø"B _¿=Õ5=˜áeôêÿ‰*4“Ø ·×FÔˉ9º¤æ^g FÁlàí<,Z™D¥v6(»È<½.A`¯l䟣j¡9 Ð’ˆaÿDÂ3ÃêÆÄ9Š€™¡XÓÿ¶„»¸V‚z—A¸ q€û*M¢_ARÓ3·rkªÎD>’šdêN@å Š1ÇŒa8$3H¸Ò£’)†\_òbðø ¢: ï>nÔ5C ›Ñ]4œ}®ï)š”R¥BÃ,°O-O„zÝ)ºÁ䕲jÑèþç¬f‹ûÀ8Ç觨?L‘a~ƒdsE¼M™æjó¤ý'\“¢À¶€ZûjgÛ3þd.šg]âv©ã.\Ï;@9œ¶ñyÜ J2½×{e ŠíB¥Ñÿ¨CØÙÿfñ<®¾,æójÄÅòNƒb½æÞΪ[qžrÁ5°dšÎù(ž›~8²“e-ÌÅ¥ðƒ_fIé¹d#ú }(3… 8ê;yþ1¬gûr¥ÎýÿôÿÿÜ0.4LGÍSªm_Š­Yeö}› ~C½@†¿{BUé‘y.&\n‘ÕÏjA\ÑÛ£¨RËU¦~ŒêV¿—÷OÅÇ2à·lwO{Ú3Cž6k¡ ák˜œëµ[ƽt9Ü©k竃sK;Áb~5.Öfž óX"#P´V_±×yȾ;ŒX£ º% æè\m—|¶mDC?ÄÑD’r…ëù«¬9’ži&„ëF«30O{èíÈß‘³ª÷ö]ô™ §ÕB5 ÜS‰Mk ªÍŽ·Æ‰¤ý45ÂæZoÔÁ,ÍÀ†¿ ø†ŸöÌ+Øqê‘©¢;¾3‡ñ9Àº)%îøfR0©ÀÔ?MÈhë´kƒ\ÖD$Åwö£àr(Ho Fоcì@9[F½ì¸/!C*aqjÒP¡}™™§ä»+‘!`††êmÚM”0[G¹]1ì„Ñz½°FHŽ=­í‹Ì‹^—g!¸«ìi›Eqó{|c"‘zGã9|2½tÕKbíg3pDç %ÔB¹Ql¢¥,O jþ‰û1&ú®itÛAòšI-‡Š:(1GÙ +VÝ«½µ_Ägø§IíKzý‰R?ãFÎîeyH¹Nz-˜¡¸‰…gƒvLáÒ÷ÆŒ¾Ûl—P"EV è %&+ØwœÏY•sdüæ+U)ªd‡Åí¯ÿýkÙ“ÿ&ìAw7ŒšÍë—GDÿñ­oÉû†r9Axq¯þÀ8ËôOÞ—§Ð…·Àðx:õñ¼k]|¸‹>íiOû®cêG?çiÿ…öUîÿ‰}Rà_ó³iš¢\Öz5Úï4Â@Þ~–^ZÝ}>‚™mÇnLÆK}3ØQT”ƒ¨L•uœÆŒß礽 L連ÓâÂ5.ó–dACÓ»C6Uj Z¶cIA…9Áâí@4Ñ­¹¯A7§/ý'  ¶Võqvµ4È]Ùß‚û"#EÝ–8•Ê໼Áwƒ¶À8ô¿}‹ÇÜc’€^¼[ŽNƒ]ؕڵ':?ýÍ,¥ŸüÕìzg’€x¯×!´]ÁÑštÒÙ(;-°H“æŒI)ÍDÖ B®kpÞ&š!ê°•8`#¹GÔÏ¡äc5’6F©b˜ñäˆ2>Hm Œ, µéE”“‰Ó#­7ö@ßöx²6²F¢¼ïž¾ªÍªŠÛ˜‰Ú;e‡3µUQ  Že%Œt¶’’·+úUµÑ%ç!p†(KVÏQÄ¥‰7Ï)ŒÙQ«§A¿LúßXÕ>}@3”ˤOEKÿ‡dIìZnÌ$y d PLIG–˜Ùì~›º_|­˜oÅùÉÏ|¨NÿñÇá**Éãô_}9v™jªdÐÆ«fú8#y¨i„¶æ’5žÚ•fI/”v¸ð$rþM“å7¸OX1…_Ï h#¬œ£É÷gÜ€ï€ ~/pp&ÆÒÛ1­ª P^-F ê¯f¦æ4®æŒeD Qöã'š:DÿÇÈ_SÿÏo§8½]܆bc{Ðÿ§=íiOûwµ/²Ð`1Ó³7?,ײèë9ms@ùæÎ®…‘HK´Œ0ÇnMAiâ3ÌgF:Œ¥Ól¥¦‡Fh!3Öú’‘Œ,´à/“‡ƒ‚ IDAT‡”pðiHÙ»˜]2Ux&¬ò’{a@0÷cPœ8¸®x0áiš‡²AþG_ôП†@Ý•@®AìÖ:¥±IŸ~ÕZpÉ*œ××íMäÇâàTZùŠ J>paâ ©5» ºº S )ò¸•XÌAÝÛ½»•=ñ½ª»Å¥1`2­…`;¡ñè—™Á.[«Qð"•†í4r ÂÊ>[™-s_ß¿è´ó*˜ql9Û9iw‹Zºt çQOTfŠ}™²\é¹pV󧊤 ïøÃøôõìb&>î<6:êŠ~&&&È%#ô^÷É…‘ŽŠnÒÒ²s`"ÓÖÿ'¥(³† p9øØÿ(ËY eN&)Ÿ}«ƒçœ*†8n6R†)‚0ŒÈ{M˜t¡§ö žJ£R1SË’¢ðzãr;¶4!åL¬€¼,œB–À7†¼˜*ßâ2;ÄΓz1$ôÑz> êVëë æÆú5#Î &_wñœ!íGÈ/ýháO°¢4{ôhä›T’c_„þÐxÐý)hoܱ¼ó!'¾#\(×@¾Äóè'ÌÉíb ˆ·þ¹üpkHcf íG'}¯Ô·-2½~üìÂü/¤Aö§oŸö´}ûŠ_´G¾é}ãs.Ãý ˜=|˜×Tε¦—JáØæ7V«ÎSÿUx…÷‘ἤOЃ6xÓ—`®ƒ‚æ3(”“ŽI§–®á ½Ê 3Ò®[‰nˆèKLO|ÓÔrý'¬ÈÂà¾ï"‡ ÿöJQh¡J܆‰ªc _™ .oí%”ƒÀëÕÀ™ÓwÅÎò~+ÁB“´fe9ð‚º6ñp¹qÿV1‘—Œ† › õ (x:"ÏÆ›]ÉÑÏßEÑGfÞ8ÀþbíH…òt«ÈDfê7Qœ)µJ8Á °ÐØíÊš˜ÙÖì^º\•ÆhD온s'¾Œì^è’U@´ ¡qfTSIósQ_«MH­Úä•‘fz¸mڞݑ¨ñ8ÕKÈç–WLº£“æ´b? ýl¨÷Ö‹¥ý~¯Ã@? cb2ǘ™™»]W<ž’TP‰2 B êá@»ƒifüPõÖ’½µÓúo%nŽÍ`ÒU5‚M>ÁÚåû•¶hB²üA3²fã"¿Õ-G{¾@dZáâ:va‹IB݇£¤´Jrr}Â$Oz1~Åê%¦ÎôM`ì’™Ü9—Ñ½Ü &þÃŒ¬3휩2ù©ž=†4ƒ{ðš_Ϙle¦boý9Ç×·ØÚ~ áÎõ¸|MÔ¨À(u=ß®xeêÁ \©mQ–ò¡ÕŠÀÉŽåäd\ºð,ôòŸÝHîMb>õwï÷O{ÚÓþxûª®Ëñ2´"Nêc3–à6Âï@…Ć×ßtcÝ|9„e(“#ÙÑ»Œ0ºÕ¥dn±Óm Ôˆ¯Ú$D´”„Cê5³Aá'ήšÞÎñÕ_Õ"¸ñÚÛ`qxiäj°Ïz }ÔÏ ¶Ðl\Wð¡ ”šJ²Á[ëj¯E#ýüÂj7îï÷EÈK¤=…€<œÔÚ pDVP‚° \é¨ÁVÁ.Í+Ñ5 ýߥWaô ¬«I`Ÿb$¯WúžÊ_„žÆ¬ií…¡ÄUà‹]Ò•Ïã6È&š«gBbªÞà0ðƒ‘S}vQ5y*è“I(‹E¤ò/Ñ»JºehL9dkŒÒÂb¤O!D×îîX ˆül©ëêA/Òìüqsñ&óvI¢ê”«³‘A2;$ÕâF䋜²r4ÖäBg'Û«QÊÉYU“0“H€udÒçíÌeqš:M*¨óŽa–úó]2u¿£Pt%sqÐ{ÚäEÍ@ÄÐ8ÍÿñòlJÎ\}<Á€ÎTu6®¶£¼8‚o~í£ Åi·hßVè¬|)æWSdÆP!4ôÇÌÎÿî4–¼×Á  ØFeí~1Z±±ý¶8û[>U; aÙ9Cìå™·BuÕþ ÛXô?-9ú[a!.à›ÌÞ}:ÌJÊòó§_Ezrü‚7÷k岂MÊy·b—f^ʶ|Æ%vèÿJ?âÆÅ9èžÎEË`.Ðù\>þ4¹ûA–ÿ#O<íiw´/³}3‡ÆJ¯‹· ÈÁ©>~0¸¯G•㵘öõ›&-.œŽXÀÜ1>)-‚U‘R;æåÐYþ¦'wzWc®Ùýdc2™†õ,VrðåiõEW"`µIÿX} q]ײޔ;-¼M’C˜e£e ¬ÍJfS” Ö×p˜b¸yë"›*MÓN¡DLFÐCg¤U6„â’8ÐPj3HKI¬Šº'íJ§«#°Îµ0z×z²ºáÑXØ1Óÿw ëvhût•3ª|Ò…³ëzÃÓ+%PC×r7¶JçsŽÒ„Ô†’­J½h›Ù`µªùàz ÷ «{f»b¤Ë1‘œò!A¬Ä:¢å-à•zôûˆØ7MùÁeö³ {ô™àÞݼ‚êrSµÔu|Fgí1ÊSèÖPkÊ“=ú( AQù¿ÝN8­yŒVf è¬3†rÛP)pˆ›Ä lö æ8ve(Ä× ]Õ½Š1•%b³€Hð#ÝF31Û…8Á, Ú’R>gBç^ÇΚ&NDœ/@?+BÿÓb¯!•çkw¿[Ðÿ)p„ïCÌîù„ä3Ïp~q²Ó0tseD÷>€þ¹eåìŠ3ÅÐ=­FÍŸÅ ’hÁK]÷‘H^Õ¨VW˜QC@XðÝ ø  2ónшßiè·†BÙèq=ýkâ,mÊó£Ñ9ªðº‰ü¯ Ó[ë „ mapC§8ŸáJ¯œ Ճɴì£À÷»ÐºòÆ`VË…â ¦oz¨¤N2j²BŒ¢@a+ˆƒXY¢W£hô_ŸÑ¬Ò—>ÄyTžÌXתßLg)íxÚµi„MbeIfªœV¨ˆôþ—¨üC¯µaF5žH¥ø"•n’‘u¢&V¿ü™›wKn Ö´g¯Óô°×° Ìk(tïí,ë%®#Ý~©UAŽIÈhÚœCFÏ3:v ò%QC4®¦™÷Ôätì`„åx¾ÓØô< Ga˜•äêOÈÎGWÀÁœ‰K®§ÝógâÌŒÇÃ,Ò7!‹Ï´˜Þv¨é§ÅÄ’©HÏy½ÿpâ: áiOðg9Ã/¦Æ•\öO\ƺ¸ ‰±BÒHÅqú£¿!(çé<›4º†ŽUþØçúôwSy~¸þÊÆë"òŒ· k]ƒo¯¡&äÒøòÓé‚¢¬7}gþ—‹‰ÀûОY*¸4xvæà¼Â2Öì+fçî)üíûÅÿGÚCÿÚÓîj_ŒÐ•Ö…X ]¿/¥Š½oNˈpôyNG6`‘¶Z_¼æƒ©åR$ƒ>o¥£ ®nÔ'm˜¾:<‡ÑòÄmÁO85Z áÒÓ»‚FÄ@:‚Gï"°Ì£¬ÿÀ1o¤õ-E@4Ž.4ˆ›‰/i~+ ­°QHb$ÉK…á”ÐUv6)…,ngQp îõ!€l›PÞþ·ØûoV£iwÜ4ÜÙ1ž˜|´~•¢uÃ- ùÏñáÿs“ y?’ÒXóº\7ª?3‰OtÎf cÝmê\E¬ûî#Îl2‡.-‹ÓÌ Äx“°8Î|¥E‘® wŽ¥*°¾ YpèmÐf%sòlÿAEÛ„·CH¯^LwܬÀÐ2ÒzêD™lÚé ;ÊÉ3s H¨ó¼5#?&¹ô“(ÆÂoW_õ ¶ÑúNx¥rn_ÐCÇå—ºÌÐkþÜ‹*ý,bñÍP¿ó«gàt@NLñ»Æ«ÜÕŽãuKí5m´yüι73ÙŽ$aØõÝvqÖdè?1½z}0¿åkn>žö´?¶÷?íiO»Ð¾’uEKH<£í1¢Ò%‡/cš‚8ësëèŸÑi6¿”Ðð›:ü.²C6X{D¬¡¢ã˜£(•‹7¡ 5¡+„=ö—ªçG'FbmgµŠ1¯¼ª*bŽ.i‡,)XSèê48€NƒD(LGõ3%ÑÕiÔ6+°…)a±¡DB4‹)"XÒÔ=0L-„®¢ï¥ÆEÝø¦Àw/åà“¬³k´dá¦áÞtÿ7X9aÇ;E Ãóöõç;T e‡ì[@3uÉŽƒÕ€_’åÄz–î‡Ø×;áª"È^‚`hûvn˜Í-VÇ´ÏéOÉ UtÐáT Õí´ã¹s£7ÊÎV¥Á_°«¨a+;Ñ£½Ìª›PjR¹YŽp@Ìk:ü½uQ¯\A_˜ÒoºÀ«½×ûÕûÆ'ìpûØ›þ©.l}´yuˆq­p‚«Y ¤ŽæîÄ ^&+AF˜)þ !¶Ò\‡>TÆìDGæh"!e¸g|´äÍœHÊS¦b/³G0!Ú ”»ÍLî HVb:dð½…«÷B@Bï0”ŒØ‘ä*ösÂ>{‘‚Zž¦Ž0•3žØEœú¦µ>MÿÇ Ãwâ½êÎçÇ)Œqeñó¹þ†‹ú߉ ßÞþš?«Ã±rˆžM•,kò,Ù Ô¦·Á“pϹ!ãôÏ9ü“,‡=ú¦5.9Ï.áÅ^Aý±,¯+æ\à¬Õ´“°lð€ªO{ÚÓžö´aûd˜ÎôøEyÑòê&PäžËÛ¬ðrÔiñÂ×dÖû¿lƒ›\ƒto³q\îõ\dÏæ V‹æ›]ùKb¸ˆú0¦iª,ʱÚJÏEñÉÔïhc•坨¤‘¦Í"°n5VH+ðÚœÅê‡Barx!ÔMNGÞÊøÆc€}P*‡a"qpM3M‚\¿2•<Ñ4|èŠ:¢dpè%ª7Q°uý! %Å Þ*=¬Ý+CþÀxH4,^Í gPsx½&£p¦åàêºa1µ-'Á†5Ö;eÁGK ªò‚4ð6Ó¸e×”úM„{Ò° ¦RkhÕ‡MôÌeÝ^y¯Æÿ}Áî,DÀ]AÒ©xÙGÑs˜Iˆ`È2>I4/hÐc÷±VKOl?ÔJ¢Ä€³at‹ìcAÕ†ìÕϬµ ÂÌp‡‚{ª(ÖÉì\ÊÀ'"WvghOÞ‡,[¡Tµ8½ˆ„Þį@5ÌÐÛB wûrƶÿsÂnéÅ¿G¿í}ÌÂc%4î,çî;S¹ü¸ÒÔ+´S2¥d2TõÔ{¶;!Ó84Ôê+pkö²Øz!r=ø4, ˆ¹ ,Þ4\€•…Ç ñŸñɵîy½RÅ”¸ýÃo„‹?èÿ•вhþ¥'¡Q»Áþa2K#MÞi–f›ÛèŽÊÙTJ .L7œ‹™9ëLŸg}ÓÉ/¨(sQ«ôÿK–¼‘ 7ðÿK®mØ®]Ë×4‹..þ†sºjäiO{ÚÓžö÷·¯éiÆp‰hÀÁ)ÙØ`{ì"»9à#³›ãZ^X¸Ó踋ÃÐBiƒûG-& ãk7<$`u)\¡5Á݉٥!€âF{µ¥½2Z ™6ÁÀ´ÞCI Lb0f*°÷׆ôé?Ì´•½*=ˆÆƒ0.¯Òãnâ­‰Ei:ÓBçÈnµŽZ5ç+ÐPÚê ›^ä#F!U¿YÕ~½xc ûÊ…ÈÔåÎ3¸I×d¼@ØýXÚq_ºb¥ði‡ÒÎßeæÃd \’­¸¼bÈÑ~´Þâ„(+ªÑI@ É¡¸×:sfÄÒ‚œ–ZDj­ 28+•’x-bu g'!»Èj„V –v …¶±ÐÜù½¹Fã­´óúý¬^¹d€Ž|#‰k|Ù±à¬(…¡Â%âfd²•þ ³ÐV†þ­ù£Axü÷戮™$—¹¸ÓV±®0Go e©^ÐhOÛ4­à’îùMç"R—dx$.\mÕ½læÒ‰¶W.¬hëýEÖ²_kX¹"‘¾…5ä‘è[hžh…,Wjx7rd=ß2jÁéA‹°»ÌŸh"¹’{㶨6\ûœv *uD 0ÕjÓêdÒõÖb±ÎBmºHÉI´ªÅl=ÕQCç’‰àçŽpLDœ*gæ12RªßÈ0ÐWÒÿ@"pDëòÿì}Ûv뺒+áÿÿã6ú!‘XIÉr.s‰ãŒ>{Í$¶Ä{¡P@Sjx(öyÐ ÏÀPå¯yÑ'kE_mŠÙd‰:ÝÑÄÂçà2€x Ø“B2 "<ï})H?|M6š–®®m‡óÛ7Ú-òø†'Ç%ï9>¶péßlü‰õ­-Uñ~×ï¿0fw]%ÅSò?'TtVèÿëÆÉ<õÖ\xkŸÑ¹Š¢¢¡ Œ!GýŒ‹6Œõˆ^†ãÔWÞíï7Þƒy·»ÝíHûX¼d ¥¦ÏÔÎ*ìJàϦ¸ºôfiž-´ÿmZÒOE-·”F{+‹k–& ƒ²'BUÁ×O=Ó9‰šY„Õõ‘B_;àDÑG1™¬îLð/hR–ä®08ò3ÜÚ=ÎèXöV£BÚ"ø Ó‡y0³âa¢–ôaß× GOã"K¥#­b³±%çë‚4• j5=Ìl'KÿäˆÌ6‡‹}U0x+Z´S€-5õûÌ’S[‡´Ä.´ÂÌÅtÖÄAÞ¤A±Ž¶ç|^¼u`È©%Vh¾1XFçÅÕZIv–Ô$ `]{çp;‹Y ãKL;‚[î±?ç;sKYÛà!A#Ž&b/úª¤Ñû²Z ¥$J(&LSÌv²3¶oJŽšJ3‹tTØQS›þskÄJGýžòI7|„4wgÓÏ€[ÂÑG×ze›9¦­ì)fcØê›²s—³ ¶Œ„ƒ;®9¼ªr´ÑŠò ïâбè;Òf<»¶Ð$TŸø$¢0Â5“KLŠWQÔ‚m.I¯¯OŒ‹ ÂXÆ,s{¿³4ÂT‘¢@û÷м~– aZŒT±FúgÐñÝó2ôÿ܇.Ö1,ÿð;W`I?ŽG˱‚á½.ô>øg—þ9`¨¤ÿû3i”çàÙ†KÏÄŸá*Â7m ¯î ¸èw&³£¯Hú—µtmÎ$IXÄÛ¦:V&à”`xcÓÿ±†?œ­¾æöt·ë/„wû§Û‡ˆ¢®ØÄ™uNÒ­(ÏW¾¸â9zæÖÌ=æ(ÕéÃûê+w,j;Çt X6‚˜F½ÂÑ€ú{éQrIµËÌSqh°/ Mtºë]A•"Ê5Ê6Ÿ_ýlía ïØÖ›î<䛆ž4€rƒK6òÞ1>‹˜|Òä­T‘M<äÈñÙº §Þ¡‘&oé1bô€@4 Dõgÿë¹ä:éÅn—MSþ²O€‡í½`k6¾~óÌK“6TËÂÓt>M©…X¿븰—µÍXÆÜbÏcåU°kbhï¯]ˆ†I.¦€ùbcÒQó½'iJFÚ–g2óœ!¶Ï¡‹Ù¾¦Çc˸МÀ”ŽXá†Ìåþ²ir®=ÐôÐï%&}¥€²H`ä +6nfˆ ÐWWì~ªÍ[¡ôä7þ>‚¾õLÈ€Ú¾E’YûUñ]Ž!ÇÇÓž-x4]Td»C:aî1¦Üj<”ôVL¤±twDëF#OÆÊ•] ¹Woºz×Hb\ÍÇàTRõ˜_5!®wõ(æ¬Ï¬öJ)¾"ÔWbVT¥°8â´<ω€Pìig¿u C1γAqA‡œ‚ÖÐÿ“/õÖØúÊ}Ý仆æíðϧÕozűaõå+K%Yíµ2¸ãGÞ÷ XÿÛj¦xj ÊâwLßR( K¿ÿÎZ87ô%uæE€æ•ù|ñæt·»ýÕét£íwûÓí£eð ‡×€¸ç3ÞÉŽ~ò GêÖlÒúžë5æPQ¬Åf/Wu€ë°vy4Ð9RÆ62Eˆ’AÍKÁä¿âäV@¤+8œLA QRî’Œ=ìCÙÚÏ7È=¤‹6XmâÜ=èæy޲GÀÙ¹êÏäx‘ÕTàõLvAêÀôoô€¿šGé5ý??ú™õdü'ïή"ÉDö4«Om ¨¼4œxúžŸðYšÕå,vÙÓoŸê[Ïæð\ú%Æ„¦eñz¹B­h5•xk¢y#ÔbQH\ÅpýÖc<ÄpB`.ˆÌmIvø8Fž©@VlXÓÝ`±.`[p‰´'½¤•7Ïh-Ÿ$½s8ØJavqÁ 2@²]Ý=ŸÕ}™Ð'+¥âgK˜B´A…·Ê¸%Æ¡?‹ÐÈ:BEpáÐmC’ÏÇ\ («gu¨VÈLÍ„Íy7Ÿ XÓûz”~j.CYÆçÁI’u‡‡o©‘:ý™ó+vU’F©‚0¨v¶zF!KcCø¿­j"Ç×+^Q 7äJ¿è <Ãé­n1s÷;4Øbp¯@ƒ—ƒ‘—â\x§WØÑ‡‚øB×ó8 ÿKµð«e%lkþ½Ó+ÖëoÑÍ÷E×h^8âh‡Ÿe8õ'"HœKá:(Ä#~ÄQ! oAÿïö«6É»Ýínwûlm9~À+Ž[@›«µÚ35# ä-¦2¯;—v—sdxqZåx›Koǧ£>µn+ROˆ0w¡lŸ`AÀ‚í™®f ü]™‚á&ÓfšÃzNQaIˆ•›t«‹bž8ó,†Îk=¥£P¾ÇD(èB1ÆÀáVª¦CTA_á¥Þ‘D`$Â5ëÐx¶¨1‚€à0"r”ˆ•Ä„Niõ—ì䤛!½£64“9̓(çeÕŠ2O 6m…ò~VÌω»íîÊ‚…mü±ÃVˆ1$½Êgû<Õ„eé9ËU‰·¢¢ å Öè;” ³)ɂަ¸ÜWì\õyM¢›0ïû4‰´\I`Ò™À$8v70É0Œ; ­ÿ`&¶MyªJ…ðv¯&§¤kL€waŸêõ¹o²0?l½i“‡QÒñI·ˆÏ)}t™rNˆz8l£eÄYÀ”ó`ŽˆÏ[`”+k2)âÀ$ XgA¤ô·Ý;Örœ$T^¦ê‡NÖÍ }uÀ¢n\÷ õIôSÀð;„ PŸz‡{uZ=ñu&‹È¿4ÀÁ‰ˆÓs±´‘zŒßÜ¥/Ž!_~`¶Ÿüój\Æ޵â0!ÈŸšë8µŽ¢ÿÇåéîv·Ëïw»ÛÝ®j'ø’g1ÄÏðú4„â7zkS¬<Ÿ)JYa/+ŸÁtªãlO}ê©)_úÕ¿öjí]A4JÄ@FW“CFÿééíQ¤¥yä Š!: €’"vkåÐc@§ØÐËwX¼£ó–¼áÔˆáØâOß»0â§ŸÁÿŒhÉÞyª8-‹ÔÓÁ…ZtÅÎ@Ô 3àTð‹­T;ÁCÐÕyîµ ôÜsvä±¾QåþtQ~Ú €sV«Þ”µƒÂìêùrª[+·µÙ&¤BŽÕÞQƒ^ŕÒÞ\lÑRÎýïìsίa+¼L­$ »^!xôÝâÊÍu[4úHͺx±&X,v.› ÁY‘_hA²j;,S4À©’@°öN锆+öoB?¦±ˆ­±R>a ÂÜ'˜¥š{ytåNÁ¢‡0Ũˆá4K¸©"žäÅR¦ð›1Án‚þO% „ƒãé\- ¬Eì{˜ …†åùh&píçóR!+ U¦öšvþaˆŠm$]8ùÅÌÝGŠ-JB† IDAT¼­XD±OXcèa°úäYiä×pØñ;¿‘kýûûᇄkã]ó¿®!M_ø \7±l)³B¤»“ ?±vX%Òpl÷Ž›0~hépùg=;."œ•8ù¤¿r_^ñe¾ÛÝîv·»ý©ö18"u‹ñúÂY@dæ“ØÊ#Zœ‘“XK* #ŸS•xEÐ+¡ë<ɪ¾˜âZ0J¬¬Ôaš²‹ÿJ2©¼ G×Ã^¯À¨Óì—qÓ´ˆÅìR0;hoþ¹ £?½^Óç/=ÐÈÿyf«–¾û”ÒPÔ™èŠTa€Eäw¼Ûög³z÷Ÿ&VÍíÉ^p`î÷t’IÀƒ]n¨5ípœÑUÞ Ä—Ã7¸ÑYŒØOÅÝ:Ê›âk±ÐYÅÂ/´,0:ÙéŠFÈþS糟1ÔbÅ>Çã­b÷½Hl è)Év?TtR”1öC¨ip($ýîÄá®Â$RĘEëKij±=Ù½µ¿ôî›C.?…ž¡¤ xZP=lðo©Ö‡åøÆ÷Ý)Ò4Ù#_’¿ë¨´„ž“Fh¥¹Ù›7Ý*c…O þÜ `ª=˜ AšòBÌq>R‡ ÈÎüŽ„6šâÝK‡A2h²©4C£NhNr¡XJ:0úÏÑìtìÎw¤Îþ~åëÞüE+®` ÆÀÉxúú4}à7¢„ ”ëÐ ½‰ô‹h^øÛ6»»¾!½â?ùç˜Èã’¯€ZU Á׿ÙÏu‹~A5“°8­ÿuve¨¨{KÕD`Ø “•Ãßuì^ÞEÕDbýŽþ#¤ÿ Ž>^ÓáÚÛå`gÑdbe—àBŒÏW7žWb¬/›ÉŸÜÔì»Ýínwûsí£j°d1 7ý²Ä)KÕ¼ÎlÅ& —Ï t–u0r7^؉9ÛŸÞÞÓ«ÌÛYÔšPbùÒk¦†rk`wÂý-„­ïâ§bŒCÍ6¡›O>;Ø›&[{Z"<Ê+2éãÓlU@!&?ZÌ<µMŒuäÓ{@ñp©®ÅÖR¢5çCK+Y¾ 1,4ÿô¶½VôFºì_Úš¯At5À6>ÿ×Ãß¶-nø4OekA,‡®’Qr;œ‘¯]J%ÊÌ38#„´M {d‘wƵ“±h«rƒ}ªl0·4’Û \>='}ò<ªýf€ÐZþö° ˆÐÑò,¤Þg-È›ÀïW‰=M__35l-jÔ€±F¤Óöm’²ñ©NÏVqÉ•m 5i©ƒÃÓ„5 …Wä’ç%Ý⬭éÞ¥—¡`Nø lMNÓíìÖÍÄŒÆ*†” éõ9(dpßÈtźò\Ž¡ä_*˜ ½å´ÀñÏ\°Xر„\¥ð½ð9x?høvÄö*ˆ–Ë7|aÊ~WÕVŠãýû þÌoï‹aÜ' /‚ÿíÍêœåÙW)·6^Úiµ[ šwKZÜuÑ.è]¼´­®l(‹iWNÄSÃ?µ¸¸ü"wqÀÝÞ¸gÙÝîvUû QÐðÐénð‘€øh\ÅwNeÒ…Iât¬nPt¦CÝçøØ^<¡ÁŽÁxù$*&õ |½¨zmLJ¤Ã–)»H)’ ¾9Í/7Å¥!hëÇÐÔ[w&rHíÓ£Cu ÙáàX!³H¹" ÐØçîåÊÃm‘/ tâÑÍD·<ç<&Ø*£æGÇlŽÁF‰‚0›¢‹ß]~¦þ4H+j‰07LpÒ¡ '#•,U¯´@¯íh[áÅl4<Œ½Á£­ TÖ©’.]54ó€þ#¤2輎ñÅ£ïî¾R‹É#žÍðÖÙ¢~ŠÅ1 ˜ /¬jJ)¿Q#±¤ýô¦©ÞhÛ Zè^+S#bl¨[@ä›p‡êUQnK™ÒT02ì˜ÚSùBÖ-° _ôð´O–ì­Èá¡F¶÷ÄæS1³¦†ì×—åÉUèCP¿Ù%t^¸Ñ#˜aÀ•ò|½Î³ÿ2’Z¸0D.BAh{ ºr´ê¼q‹ "IíêQÒe` Ét®P:]°`×4½œS¤©Ê°æeËú†ò2žT¾go-+ŸxèÛ°üt79k=ö'p…Ý6®XÿÃ]î× ,bqù}“j²ßÓ礼š­ÌÆWÓ ÃÏâE(Ô/Ïî5YÍëÖîAVû4Ÿ \¿Ð~ÿvÚËÞínw»ÛkÕ9ppY”Ç,SE>t‘v[pvdd‹=y0ƒ0ð ‰{`(…_Ë )î|¦„òhœÚÒ4äÄÕb„%¸Dà2¥ÁÕ\¼Nr¤ÔŽt¬O„~6>±M!’ —c§#TìDF¹y1áðÜ}Š~&Fh蹉r‘ø2š­fåZ/˜¤]MOw¦°c ÆhEBÚÔ!YÒ'P6 /‹HŒÛé>'I!˜&%hòæ¬ó9Àî(þa6 èZ(»ï~Ëá$6†Ïåe"»0Ò#ÜI¨/Y×3žâ”K?jp†©˜ƒÚ‚ú²ó.åœõá «ÂÕëÊxÿ”úö‘‘ Á<÷÷|Ó7}+§Ë"ÿ‰Ö‹®¸ðjÔyµÁ|»©Ì5ă…IŽ& &ì|N‘ý³ZC„ =Ö/Zïç‹_*¤.ôr¹nr­ro¿ùØ¿µýÛ6 ÷t»ÛÝ.lÔÛ)–8²ì´…ü(ÂH)m&= ‹³= "|AÃçè §“Ñ¦× €­˜ 5Uzs tÂ#öZÏäÆ _!êSØð‘sÂs†5\jbl¾‘¹´‚™ŒVøyb–í «»™ï XËÀ'²ù ÊB]9ЕØ0îí£ž›ÜyV$¦j3¸áŽ×£5±L·þ%%jàe=ÈÅÀ(EP/¨ˆ›áI.e$ÔcéOÐÙ¤K‹à›´ÁÃÖ(p3 ©ºh[€%œÄ„Æf61SrŽ*@•+bG¡²Pôù‰ ÷òùF0*Xì³FFt2É·ËI·—-€ÁšwA´ÿÑù£®4$8%ÄŠ ¦×î?èïŸûì›'4&•‘ZªÞH‰$q­˜ÅB¡ÅOW(0c™&½ˆ“{«Rtö8¬³;YÆ-ª6A͇° Á°SQ](6,ò‡d€BÈåUœ¤t©ˆÁ½÷ ¨Yo0,Áld<úJ7 ÖŵL¬èE4*NË ØfíÄ_l¦ºÿÕdXÇ€ÖÅ‹Æ8Z8úMiˆAFoQ~5N#a xÖŸ MÏ¡ÿ¿¸ñ»¾?Ø1PE½+CÇ ^ê¤l F å|¤ú4œxžšO°f3GNÌz⥘Ž#õcãTŸâàÑsì qxåþÀÆôËònw»ÛÝî¦Ú‡[,˜¢Ï¹á(ê«•…>åQ;ds´$ÎN:PÌÞÒàýQQf'â1¢ËÐtïd(¸Pª‹'FEäìÅ»¥'}Ò¢ù¤îG]Ì Äºt™e=ym“VIŽp35͘B]5õš EשÓÀa(]*Š|ßÛÓíçx6a¶Üi¿Œ:{éL5²Í %¬Uõ|]”)óV~Ú™Ã/€m „w 8… Kå!éÀ F¸tê1ŸÚß;í=è×[epn >ÓÎ/¬O3 Ø$AvjíWÇÒ¥¸ºì~¥rÆZ×(uÈ^çâ'Àç<ÓM:ñƒ « ’±Hx`{OÔ‘ç¾@,RìØèpŠ=Hë1n‰­=¹¹dó˼¡5oð‹¤(UMÚ¡5újP¨ôÍ{Š¢lßÉÍç‘Uè›¶M½IRá ×4.¬k³G›ˆÖšÇâ}vlú<¢ªÄM2¢¥ó“î ònfO7ŠS)ßÌðG)ÿœºÞïNÖ=ÈýÝF p/kÖï.¨ÕÇ%%ŠœaF¡Aù^Íy}ã¬×)ÐËÂ9 dŸ½IÒQwëCÊXU›_}È¡ø2«±y¹Ç~-þ˜NÚ¿Âý¬Wj? øïšxøö±¥Þ÷ò Òjø˜<Ó?\+b(ÊÌ3`VJµÔgß½ZýœÅì|Ï.„³xÜ7EVL^f¬EÌ9¿ƒ}Û™r'.>%ÿZ»Œîv·w´@ÃgÁƒ>¼J“zÌŠ‰ÇG Å¡«ÅÒ!t²DëðéÎÔ¼¹kAòod´®%SùÚ4<ü£D/Ña5ÅÜW;¯?‹‹NT¢C¦X_¤|9‘f œ0N€ÌÚÆ&nòšËQhG“åÊ‚E4:þ9â¶È úö­ÉöÜ`n—€˜Û;H½rõ±*FÈ9¿6`P'—[òðUòl-K˃RÝPQ g»E±Sõû6çófÄ:Hø’þßS8Ïödã3Ö÷ E)'vž´ ­$¨ #gߺŚ©Ôïèÿð® t¿€à±L3!ƒE³\L;I±‚*¸¡¢M`÷þ ÏOà¸E–7Ñf63«ƒÊ?k8ŒÍ©rµ”‹B ¿Ã+ù6ªÍÚî ÌŽâFOŒ¢d•é. YàÖ`æf‘N‡¾ébàøqþÝóO¸ÏCsvÈÂx{j°†6à‘ˆbï s›Ê\GÏê| «9ïd¾XPÝ™†Ïc¾ÙºCÌ‘¦ ò«h ¦DŒ ¡Nà‚›§˜ÏÅ`§0ŽÜ4Óò4Öp.“áæ*UUh®žQ^ù¤5«å|4;U²úWåEÕcþ2öêã7~/ûÈl–¼s¸a¸ÇŠ80f^˜–˜UůL ªm /‡¦,Nd–fzJ¸n)Wu½‹.Í¥ _Z\<Øc× ½gc¼ü»ÝSènwûUí£)U–Ç‘ +G>SË•s³²ÄÉ™gi­F.|—¢¶P#Xâ/:,¿©;$ ²Ì|~¬bR·iZQ€ 5(¿Q\UÞ2zEŒä†« ë®Þ^Éwv¹DDÞÊ}  “á}fÊûï¾,4Šéõâ»ôÍg·žu@ëD8”ÙŠ|f ¬*ÑÃb‰¨5 ÜçyZM'Šj¨$¡1RáîÍLáŠNâ<릒^ÌU,þºüµwáK_þÉö|:A‹6Æ Ìò!¢º·Ñ'⚊ŠMt)¤¥º½ÄŽ«²¼å³XJ 0Ðͼmr\kL›{M;¡]tYɯT ýlòÚýô}gå¡9.”_,UøO~2Þ‘âYæýʘR™䟣лsDٖܱVX,¦Š`Þj15ï,ÒH¸¶Æ‡›ÏAŸÂÎ…4 ¸ÒÆ` jŒ CÞ7ýÍIØ [ïÖÓÒû®NÄV\ós&¢eM0 dÊñ˜mʦ»¨jg(  ›3'°ãÊÐâà*†ãòãˆ,&2Cý¬ÒbD³^*jžù‡irxù¾í9ß= ªÖöO6N0S´I¢‘2{Óì[Õ±*çÈvÊḜŸqp†â²aÌ玮 èÏi5õ$Ž_#§Ñé7Ýä‹™ú‹áN¾å nèönw»ÛÝ~[ûè—'EakmFjK˜Âc‹`±FFpŸŸ5ˆ¬°,$µ¨—‡N²Î Zw6¶¢¨Ï0Ôø S°±=´V}Ý@ÿwdÈ”4Éè_à¯_z0}xm™øUÐxà§ý&Q*[U–€ÎçÃà#Ý„êwpg‚t¼‡ZŠËâÈÚ·<¡¯\ ­ÕX‡Srß1¦‡ŠUº…õf‹J•O‹ÒIZÊú»Æd=B„–D;€Îhµ]ƒº/FmftEÖ5x\Cý=Œé@„OðÊç÷üË Ø«ÍØeÞö|§’t@26hY>¥ž*! ¢#e *âö$O¯õÔš÷E0ÏÌÐó~‡í—¬ýå<ôµéÒ3mSyâ&vÄ4šBKŽºnM†Ÿæ‹"D+ˆ9?z…A0ø¥{A°8Jü¹;Â@;C y­=£wÎ  g…K cqIJ†Éj¶fËzöͨ9…í´¢>²5^˜aá¥ê$¼Æ«(–‹Ì}c‰æ%p€ðÍxŒvð!é¸Çó24 v@ïÒ÷~ùÊ}?|vúÏ1 ‘Þ¥áûo`<Žå¿ãZ€ú–‡Úp#¨ÿ_%@ų=ç<ï;8,Èq׿tèŒ_|êC¢²äë—cá¸ên¿«Ý— »ÝíMí#6–’ç6l¡Y±"=k08BÔ·×%Ùg81ýRa™âEâwšp:ó@ï6é],„‹ñ“s¯¾ !‚Õí2¸³’.ªDâàðâËÙ)ê2|‰-%yG|ºE"0ŸÜ# "G±”yaFt}´ö} «YüÊy :Á:Of–Ð:²Ò4hè3OÑÞÓ¤O¾ ~tö7üìG²X€™«aY›p@ìLž«(æU¬›¦FQ›R Úÿ÷å ¸iD:'Ø<ô/°s#“ÓY–„Ë} Tx½­22>q•ùñ"„ZˆÔ7³4ZÐ 7ÛæÓ?WÚM6ºlœåýÄC¥ Ït.xƒâ®rï®L—“&ÏR0ܲ’ø í´Oôv{$5ŒÂ)##þ*`Íb+“~¸a$•Xܦ«ôOÀXãÔBš¸µp“퇬Å_"ð¶Æ¶~(‘¨ÞÆÖ%lÖ¡â!¬‹Á<‘1ì«y_*Y°ÐÕÝz„}á‹:ªqœ AüLsjð×—á¿%ö5†R’<§7Ÿæ6ðõK)»ÓèÀêiqèAFO¾B}ýÏ5¼ö·üïùƒþmsliLÖ-pq^«<^åçÔh=Žo 8e7~¬:êìpãèßËÿòF5ÇšåÍùg6\ÐɬââS^”¿û±¥ýíívø/_îv·»ÉöAEvK£ ¨6Ù† ±ZªR+ÜÁqßôþÏ7§MoÀû©6?ëø·Àú^SQŸâèɦ^[n~0 §O3t…†{¨åÌ«Yù…)Ôa¯‹* ŽƒD?Gà~²Kô¡)À×vU}¦¯GÉIÏjRÙ ­=½=r³D`OT‡EóٞƼ1â,lÏ–| âF:3?Ø=‹Î{:¨•˜ÞÑaBö”Rˆ2¸'dpSEÍì¤Ì®óýM!Â0ƒÞŒæÏ§ŒI0[³Ã„¨ #ƒH®ž(M;àõ[˜Ð·þwÛ…¾Ù#¹Pèxr!F˜M}Õ¾²!Dvüô´°ÌÓ„ú¦µÖŒiy³ú]yAµ¶Ú»Ûl´RgC즵ížûiðh Co|•íëë³-œ#5¾‰BÑ>í xîÎÇ+ÂYÿ¨)—åí<´¹mb¡$°‰N`™ƒ|pÇ—õjfã;F¬ Q¾/ƒçäÊ}&d7ý¶Óš~Á\õ²ŸA°Yl7ÑŒ@–>ŽV;â(‘C«¬ušv,Þ|^ÄOútâ >êªh%ÂXåþs!1çÝõa¸ºÿ0ƒíþRön´¢Àj8qõ뜟.¼þërñë'áúÓ·>æÚ‰6ÿ-^3~{†]=²À¥³ýådÅÒÞínw»Û_iÍ{H¡ Y.ŽÐ%à 9G§Ïgr¨Œ?+zcCäZZäNÐTYâkÍü¢†2³kžAL†Š´5k)^ÌXç„ÐMlF„ Z’F m€?Ò#T•1¡¿ìÕBvLÐÁX;·}ÿOO†¢Ù‰—¾çÅ3rׂ¯4:j$ÏÛ¦Þ—…¡+_i|XÌcŠ“åØB˜v"è8U*=|yÁƒF¤!£PÚÿåÑL6Ë îÃ÷ÿf v¨]G^¸OÓ94)ЍµËtP:xûÒ‡ýÿûÚŽ“¨&Œš *ØœšÙÞ-ÖÐXîœ1ÙÖ4íYCX˜_}|éV9 "‘ oϸIb•¬^ ¬• ”Mì],ÞÈ,ó¸¿qtä……¿Z#3:-ž.ÄO!¬ßÇ÷á,£ó[ {³ùgI‹ó몈—•I—–RÝ(\‘›;NÛc(Ì×Vò Tâ-ÖÖ¸ ŒsŠTžŒö léaxý~úz“ÝTfWrú Î”OVЛÃ~ù,¶ò^·2ôÕ·ðº×Y}ÛEµèkñÁâþæË㫺ìÊ—øÙ~þðÜqwq¼|MXš),=êÈËú™G¥:èÚ>xæ±cÜøV–\û¦TÎŽiõöûf>.[ïí}v¿²ªéVk¹ÛÝîv·¿Ò>„,I¸­rxɪõd,€2.yþ ãéÂW"ë]8“ãî°ïlG_81Ø]ˆÞëÏPÖÿiøúº§_S¡xÞø—æîôs#qÓ‘ÖþÏ&|ų/4Œ_7äîjÊ#X$;ÉžÝA\Nqå”û¯2<ð³”t9 ¤f¥¦…S‰ªÊ 67fxÊV#…óv°9éZa›·ª­ÀØËà¢åIм%Þ¼„SNžMCªHþ7Ø"ô ×@¢õy›¹Áè^C•3óeПö|å~ sÜШlq'liîU€U"d¨BMNÏ@…•sv÷Y3Ä`í\¥})ØXNÞÔÉK=Sÿ(òo0ó^y“oéÒ‹ú»í;ŠàNÞêª|n´ñ¶çN<°Ëð­÷-ù%¦p…FîÇÎîZOñ y¶>4£>fzq^õUâÌ=çИ¢Ýþ»Ýínwûµ&ÅúÃrávM!?½~£Ë|ç@™DK§¹‚èp&ªÓ z°PÞ$G¸@ÛaS ^6“˜‹@l×·©‚ÜßîsVÁ# ÝØ·^—P¯‰!n°pû„‘°‡òsæ®Ñìv®hºí9 ZýŸ¦õ"”P=‚¬9FŸÒo³9×qõLÒϨ%¤ê'$´æ7ð—ÞÍsÉ÷‘(8Ø4 地ú`&´¢ Ä ÓÛIn¥{ZªQ@èÓ‡jße£žÆJºy&çã˜JL.âð\È;~~ÂÿÌ2y檠dE+3À¸®‰Tp@/Bå7Æ}X#y­¢Ã‡¼ãë&~ì¤E"¬×e]'Ê>ZÛ•·Äœõ¶ö¨ôž÷$¥6‰ú¥DKö&yHF<êÀ/pÕᔜt’¯³Ò·õ†ÐÒ= MŒpª†Òêr½Iš–½®¨°o BööØÝ=LÖ…9lÓá[=ì—&ß›÷ÞÞTk_Â4…Vµ,ÌXyœ Ä”ÜßžCH‹É¿ô×+:ûטO>ã€01cÎ-Æ™~\öðîRÁ^ìŽË‘Ç×?êÆëßÖ~Q…Ç5‚èËïuâë0¢YEÿ±öØçú ï{TQg¦ÉSÕ@T[:«Ó %ª ëGÉéùÍ«'öìaPS ßÔª»P¼ýýÓùÿÙ³åŸÕ;3u·»½£}ÐÇÒœ3þtIÜÌö §x3”¼è2HÄ,ÔCBFì¨ÞtG9#¨A,¬„‡·pkMj°2p¥[ëZÒ:uç‡.^* ùºi æ?¸TF€º!!9ñ²ÐÄøc¥5%=ç½#8Ž/ã‚’Ù2VëB•~ýP„Á/¢x=GÐF^0 IDATRÍ3[ßâ‰Þ[Ò-Xú*àa°ôIêy“ªklÄè)‘„ª ¨ã<'RD/µ‹·Pp~m/I´rÓ ¦‡‡çß— ɧ\Ú—(Ù[ì³(b»˜EÙRX 26ÛT7eIøGz5!ÅÜÀH·$ê ¡, "”HKAèÎÜIç`¯Rh+Ä.hxñF¼{} á>–9?6mŽ"ÙÆ§£Š‘Ó^CÄ(â¾Ñœ$\H'ˆ‚:“@b±™÷w ÖÓH+kxl Ãj×ÿ¾¯iça;à0)¯"‘6Þ†"¹#L˜¶{HUO9GÓ1º?ò›£ó_+} NHQì{Êu !ºÖ.õ5ôW Y¬×Ý9†_‚UK’÷eÜH»àz°Ò&—Çæ6[Œ´š-^^.|K_-}Öž‚õö¸pÕá%º:¼´“’U˺&áà¡0‡^z]þò‘—MÎÿ ‚Ìû-îv·» ÛWQŠ¥ŒóZ$â]xHÓËÅÛ !ê©¡nP~˜á§’,`ŽŒûÐù – †–ˆê^‚ÅM”ñq݇®¾ÿ¶ÜÚQ!Óð%<ÚÐ7X Q‰dÍüÝÁï¨J`PßGÇa†»¿q„% âúA`A?,.²‘Áê uƒ÷}¯"ˆïc*­8L~›%‡¤]Þ´ÞŒÒR…„ÔŽ©Xè•ù‡&½,xZ›]Z]“*’hèw ‹°ÕJŽ«‰¬@´âDÜ•ú¨¥e"òÛÜè_·õ0éäà,’˜ôaòPöž7†Ro ¶èµ›•è°™uG]Z¡ìÐ'\Îz©†Q@.þ nQ?<Ó-¢ÿcàƒÆËĹW²*†ÆŽæUÅÕa]¨rxBÔÜ bCÓ©9ƒqO2b;ÅU¤•yður6ýÉpøZù#”p-Ô¹•çÛXN©)ê5}:Ãû%ƒ#9j->ñ(•߃GºøZŠÓlËUY^IÑh_A4¹Š»ÔÌò ]2°¤ûÏÃO÷]àO}ß;¸·ò}~“À+³õDþ—‚_+N$Œ×o}àªDÞBñºÁ©y¥?j²ñx'°¦ÓÕ.ñT±'¿k5†{27 ; ò.(ã{>~ëq¿ïλÛÝîö¶öÑ Poyâ ’ÈÅûêV0 7±º´S„ß­`aO¯Ëáù…-*g‘©›Ù×:Ô!Þ6˜¾îÜÙ ¸5Å뷮͹D6_Ð$AµWAºmÓË⣾Ìoä“ao„»×+õñƒÈøüèË´M$:ystê=ƒ!I£Th ¸/4Õ †kŠÁ£¨Ñ›—Š)ë ¦„\ÝD´òf TÅ%»fQó’,ŽNN“„@Åy7C«Ì{0M>Å[dfŽÊØnùï/)}ží^'P*´¶}{ónv<Ü@³¹nÄSbï‰Ã J-‹³›pûô¯[÷éýW ð õnaœá?¿tß?mSsjåŽJ_ú´Ðöæˆy…Ý÷Û*zEçX80Q± •Ÿ°Qb”†£³Ú×{ÅðRê±µÆnéÑ¿¥s¸. y˜·¦+HšB-R _FÎÑcOhI )ì¨ îÍ.‡|h¢”ì@C†ñ¼P H¾ëdÏy4Ó™0CI2p  ‡M6"JÆ¥Á,t˜É`-=¨ùVÉnˆ¹.Z§ÆfT 2šné ‘‹`=íÒç6g£¼|£!4R`F…¯]³ô‚#Ñ(»šÕfééËÒºÁÁ_¨ÔÌÆÇ$Úq•¡úÛßð/b&Ñ"{@õg1·î Âyƒ)ÿ¬…ogã„” ú2Ýyxb×PGŒøE|/¤(¨¸¢o«ø™Š“§®+¸§›’ìñ¦îÄò;ä…ðÜш GÓ ÓMûøbïڌǭžo<òn¯®ˆe@ïnwOÜmÜ>òÂÙÖŽéK‰f…pXZœÏ㩵€¼ A†™,‹ýí 7t¤3Õ‚òß}úV„Š–)}é~ÒÏê­Ã‘pÏ}£xìOäu‡ŸÑö“ü ÈN9§_$… žÛ,ïÖYˆ¦E”§H“Í'Yíû¼&˜WÒÑæ³>ÉU†ƒ©$Hï™Re«^¢5 gú¹·”/iYÊoMÅ.¨!]«?¾‚åû53!™d|lÝwDÙÌV š #•;,º‰ µÚD•@¾^`QhËÒî¢épé):ÔB°pÙ£*ÝË8T)ð.-eÍ“eZ¢ØóõÁO}’Zý¥y‚åä Ý5U®â’é¸oâ8 Î{ “.IL§äx¦…5€d£ÍeAû÷Fªî ¾óÕûÁ:ú6ùüCpW¿¯ü¡=x[ãÞqûO¡-¸rY×C1»)Ù ‰Œ›Þ7¾5ý\Óç)Ž=¾ü²!©P%†QÞMV7öïØÁÒßAßb^ëÉëܳO?ÊIÁçŸC"qŸ¢ÿ©£ðƼïv·åöNj“«+ #KËÙæéç¸\Y_JCT*cæOS^»£D]„«rÎ#{ kƒÖŒO7žŽÀEþ¼ÞQ~(¤L!ŠXѾß|ÙÊ\u¡Gš#à­&ûO#!Â]ÇHKgF4Í8ÞÉÅæ 柞ižE½+Lê 3bé·œël)ã$˜Î1®Š˜0Ð$BªôU*#ãKäQ kX “õhi9kÕ«ö±‰1öeh_ç^âÐ-.Qãœ;ù·9¦­àO¡ø´¯ Ó/Ñ2ˆ+»KI"ý÷Éí »ùýO¦v¸ˆ¢Öoùɦ5¨ÁДA„>xO€iÛl%-º—+…‡G}ü„â§ý“ÞýêƒFC¯*@z ¦YdÕ´*dÖ©¥…ŸZ}0æÍ D³e^Û/<*ó »¦ "¬ªµ%L‚°mY[Sûj ΜÀ.£_Ü…#ûcXWRwsDļg{à~^Û$¢BkJ¶Ž¬à³A@šífc "€òq0õÖÑÎ2)Iút¥»ñ½áµhÕƒ— ­¡1uQZ˜xï€ÞŽÝí4.âçóœ“Má|9$xr¨3¥Ö"‹ÀíºœV6Ážr ŽÇúbA)Á¯·˜ FÿvnÜß¶Ï[HpÄ¡ ¹*Že…Ë~<ü³Ö ÿ«‡æÝîv·WÚG/BÇ~9w’Úb‚Õè…™Ÿë¹Í`v˜À‰ØÉÊôs‰(¾žË^ ìgÓ+D3a8¥òøQ#þ¨Už¿`¦õ›\ý³Rï ; ê7Œ‰‡êWÔŸ˜‘2D_ÌPܰóÃ]剨€î4†qOéó¢ài®OÁŸ !µ)V…Æå›©€Æ˜†‡Ña·¹º/¿ßÂ$6(f¸9€z7ÀYüLl^šJ1ܾ)½ô¼Š¶ ±‚ýåÏ•ýlrÐÅ/¢‹ ¡b¼÷a¥w/`²$±Ù#(…)½Û­ê=ŸF6*Ðÿá·¦6ô¨î£Vm€Îˆ>*ÂyÂ5}ÚaQ›©qðTßά×ÁÂlÆ“¸ÇèÖ1ÐÜØÜ5„mHÊòv¢Þì´ÑŽŸš°)ØÖÕ±VTzè#ÉœÎÉ“<$äiCºŒ©“IAß©òÕ}°×{pÒ–ý4¼ëÈtqšáq7G;Ÿ³ï«ÙB¼Ü‹è÷ÀW.Œ|5<‹…>éQ9ææ¯KPÛÀ™Ç¦µJ]"¸½t¹bñb=@ÿqép¹æl¾ûi¿£G޾È!k.h¼à…^à‰ÿ\­ÜRi6Éña=$|Ãòœ>‘–=3LžxxF¥JB˜‡¥Gw ¼8­xæyŸDw»ÛÝîöoµ'«¢N .©kÌ…ã\ò©ÓCô?Ký¢À\hêîiPs²z<(äü vXJª÷ñ@”b+Ô6¨¾9ª2ürx®K%zí‘ëCQG&ð–¤ 7ôüpÏÛ-R“FD/PuNl:Dõþ-H‡ârœ–3Åk5¦ïþĬwè¿Ó™½Ò‹ŒÝ\b¼}Úià\4P^ú÷ÙŠÂ%'œ »³ÔFœ– rœì PˆÂÀu Kí©¾M^¿Y¤>ùjÂʨbÑ«}´öàýïåé¨s¤`^zÃB€’4ï€Úý2Á¸@5c}œƒ° •ÿÏÎyPWnNzCÏ9Y‚?ÔÎ#ä×¼®T(h°«é3ßóî,~û…Éâä¦gT•ŠsÈšâà,6…£Ù~aò†µ¯CÉé®eµÊÔüÁN^àçàɹºVšxHF5Âx.#²]/1n5{ñ„åÎ7ÄIR^Y’}Íùî0=$Ón,»†þXœ\“¤“-£¿H\ ”»Ïkí!7v#†gå ôôœˆ2ª—ªO!мfþõs˜ÙB¥ÅÝþhƒÚi®IѽÒ^6à¶i“¸\½LÍût\ή«]g!+0jG¼_¦èÌ~ïù q˜çóy¥”Ënó\ž¼pYܤÛýç¥Ö<=8ºrñ³î£ènwûÅí6A¸Ûzû°œ;VJq.î@½&þøšyÃÑœ+µc‡Ÿñ™lžgjµÑáY¨{€=ÑÄ7Ùãs|… J©ú«áÃ?<-<‡ƒôÇc °¡cLn]#0hª+†F3Z$Ø7 ýwAµ*àxëL’&Rá}zíÒxAÎ$qÓ±®˜s¨ùPÕ=ˆ«§¹q>Ÿ lÿk ›’OènÅnÂï ü"‹ik„Ð’â“ I‰«Û¼Â¥]%øŽs7v˜ñ»*v½¶õ€]AôÜjL¢h2"’å$+‰pÎIœ¶kˆÃëGÉø‚-¡ÿag`Ÿü*Yu HȯÇÔ„ÙßlÉKH™<£°íÒÏÌÙçÿŠ c>[í1¯·e.Áׄjë J>ÁÇî`9£0rÓcL­5…ï‡2)½ó¬\-0 QUf >¤*N<²ÿŽÌ€²=VþEç†apÚmº¡>‹!;s}¡Ë™yCìô£;å?ÁðiŒ®!¨pµÔ‰¸ y ºŠVp®>õ¿PúGü¥Žey\ñ º5wþ«í›£wÉŠ¸ö™Ù„pìs–¸û³@ƒ‹½2ny“Ç£É9˜KÜuUhÖZÁÛûÓ,oŽ^œ—.@íÓ¶PìÅ6Ì1>“{b}&¬té_›ü9?•„½ÛÝîöËÛG†rª³f@qâ@מñJ¡½ w P~+6t•™¤\à º&=ÅŒZ‡×Üt!éŸ5ëƒl\ —‰`@KR¶ê7=ù—ékT5˜æÃàòzÅíú ÄÑ\Â2µÃ"ä¨cË“¬1-áP¢(Øyð Ðð$ð¥ÏO3Þ!–J]Ý*úÌžW`kì¼ÔGq×ÿüÍ,ƒ 0ÝyÖo˜ì^,|»éX¶þQÈÓy,*ô†”Ü«lÒÆ  ™¢]›žJò¥ozþŸ¬yòscšÉÇ3E„çn(ôFÖv†/H¬Ød†ýcª{°3÷y—ði;Jò=4úT¦ ]#«)ªrtÓÝÆËV½h>·/µä­¿^_¤/úß>Ì+„ŽEUÇ>ÜŒh;¡ ?þå |)PZU´¬Ú 6gz<êj3¡¾’DÀ`’ýB¿ Ѧϱés9wf~Î\ò…‚¯%*ý·Ó_‰ß¢Cºh[ágjwP_×»»J‡ž¬ Åö’`…½º°q(Ð P¼îF±áäËÍ –úűRYr U½¡„¿ Eâ䘿ô!‡©º¬/ÀGÞô¨ÎûøWÎ,a퟇л"uÊj£–¿Ìï̿ƅG=8çÆè´S±ÂQ”;„½ÂåXçv„ͣЋ؇½$ŒS !Qþeià^íѶú›ydlî\ ÆôS1ËXAl§RêÌ•I5ou³ç™ÂÑïxKAÚÈq­…\׃Ÿéíu‘Ê ÓÄþºÍîákD‡ÅgÀÚ/W<Ü1‘â×¶[b}uHˆ’×à~Ç‚G'îµ%V7[/ª^QÑ<ó¾8°V…ô+b6ß ýïï…¯/")N{zd¹¶Õ0ÆÏÝJFSANœœ®ôÔU+çôVCÔXVÊÑS +ÿ+wÿ!ãßçàÝ~ªÝsïnëíã\äc#Õ/ ÔB{BOw•Œ a|HG½a­\Fëux•|pu¦ƒöt× ;OÄ…–©ºÓ™-ìb¥W*û¥ÛÝLj@ŤPˆ‡.—7'$<®Å[K)GéI?!‹eO5Ã/.¡q‚©‡‹Üœô €]žøSp?ÅC‚eܬÐ*Ýœ¡‡Ÿ4ÌÚ¾¨ÖâG&ÎS'®‚ØK¿‰² 1¹B´Ç&Úþ,Öæ.g´Ãâ ÉAÒÿBkÉ>ÂÇ[.c‰†u è@”FŠª2_¤׫ìŽÁ.f‚Ñù$´æ̆B#ŠÀÞÌô˜é¸‰GÛ²D¬"þ`ÿù›ŸÓzºº„®5 ^«Ø²$»qadDH‘挎§Ÿi-_ñ€Aà9-n¶çª¸ÍÖÑ©…ñP>@Ò1ß+T\/ÁX gW†–*Wjü`ßsA[+Îâ. =+U2>8-#¹W«žÿúô[*×™ÐûJùI$ê,*’ž:±ÎÇÒå$u¥×øÃ:æ;âºVû\êÄâ²p·¬\7?бÆwYÎòš™6] ëT!Æ]ÞÅŸtдü²|Ìñ 3oÎôZÞ…FIV˜îS§&1LîÃi'ëãu- ÍêxvÁ¶÷ï®Ã+Ï”p”àÈØE\Ó·Ü'ÌÝîv·»ý¡ö±ãYV/¶ƒºÁÀþHàéÔ·&t›^¯ñ<{ñšË"˜g¶2úË;pJ¡c- g† Ù¢Ÿ*Àá9…q°ÞL3¼ã­¬teëÓ½xà#ßšƒÃš.%#Çk÷;Þ#VZ³AP¢ÿ ¬ÏükŒïD½ranlI=(»—ãzL@á.#`iVuDib즦N]]ÍyË&Ò™•dÊÞÕÕh:g›Ÿ9¯`§D”æO·N72Á·yW`aðú`u€—§4Þ×k¢[¾;’5Dð?ÚëÓü„ç†/‰¹Á$!¶Yý4 ù‘|Œ÷ Ê¡Hëv e£½î¨Ù×g eVA©Ö…y¤P­àÇÓ ßEÆö Nà'dêG…11,MI“¿ÅM»õ?§Úà¤ÐºÓ/òp ¨H°'cBQŠõ•‡Ô%qúËp$ T]š 0L‡~76zH¬úd<Ö-ߦ¼SþÏ¡ 8(±‚¤BŸÔïžøžñã –²wHœšy饤ԿÕèÚ$8Y„l‹’ð8Gpf^,=KÉ[÷®üŒ/o/26Ú(ºüN4V^G«ƒRePze-pÍØßÐÿß<¦îv·»Ý-·° Ò*MX«À“…¹a4»ØŽ4Œ`K”lsÖw £w‘Q¶L~,kô=T*µˆ#=«w4Y=¥üs®BHH#IŸg…â(È’\»ŸŽ´2Ǧд;N-Ñü¯2 [úÄ›± ·˜Ò“PŽ]9}õQté—×;¬>ÛÛž G¹¥?ñß§2Ù¶/‹‘Ét-kÌi•H½•71ç²o02ýˆyܪçé,0s‡#ÝUh ³t®mŸ9I¸Š"ê$w|™Ën¦Q¡QÕÀ± ‰ÿ¶vzSþ«ëé¢Pæ×? ÷ ¶š,ûÄ ¥±Ï VÜ­]$:ŸO„¥L0¿ëW¾„ßÑÕXQNê±Zº Î—ÃÀl¡àþ·uéÔ¶àá°Ü/¯¯é¯kG¢Àh“_4«~Dy„qŠþÁÍ£PÙ\püÑœ% N>îìpâÏí$w»ÛÝîv·£íkÎõƒÃ¦%hSñ[ÇG¨±½¬¤ïÊÐrêF!&–á–=nu<>²‡µ­Ð—çèž´Òçá[v´ËªaXAHv Š$4z²"µÄJ§¢(ò­è¶ØÄÀ&&;§md/A#"Ÿ¿2¸6 ÙŠ¹ Fj¡Á(á‘£ä[Ù ‘Ÿ¤ñÍê7÷/wM1÷Ãý°”ö!X9#áXGh%œö‡$Ø! 3êMÇCдÙ-ŽÍ¿f“ä=·ÑuºuÁ«ia¾”Àêÿ@üh"|9¸8 3U ?#«ÙlùõRÅUA1 %…÷µÛ²“µaŸiVö}÷ºxøo±>Ÿ²û*k»k¡öát̆Jm¬Q6r$qÓlÅUF}fûíÖˆ"ÝH…û×§LªUE`awb|_ص¹D‚4îoÇî#Ÿ§èäúJ~,SØeA^¥ó“ísÍä¥4épï,’·eÌ §nŒÄIŒ/jk>âüà31X šYô+½£±}¨‰<Ö eñKã™SO1ˆ7Ð#11"î•‚€_†þÿnÈ·à†‹†·ªkÓÑãd‹xGã–<_~²E®úêÁ·¦¨Òÿ¨@ÌoÈÓ¼?—žd o/_MøÆ%Í÷¬œ«wËõ¹Äã}ˆw?4ÞÙ;¸~R|ó߹лÝín¢}¼¸‹q!¤´²Â•( fAL!´H·\©CtP/=ÓùPÁi£d|Ô IDATâà©€M}%¼xEvËn· ®Èì.›\unA·´JFáRP„GAÓŸòÖžï¯PFšIáò­—ª—7 ˜ÞÆŽ4qBŠ(š"Ë´­*Ä‘Z‡HhA.F£³ÂôjìØ…Ú@×8#Yq² î-)f5³T‘ya`M§remT›‚¼´Óú꟧㢖8Î.¦dD<¨ðÙª\Wª<1ýû×ÿHå.9E¾E—…Ì÷ߨâ4y¬]Ž?wÍæ™¥ÀZ”yË wi˜í=Þãš&Þ€–tÃþ#¥Í’a&ÁRªšZ›µk(-Ì4™o³«;bCÜÈzF½”:Ô t¨ÇX–‡ °@Üöã#'®d¡žÕþÚÕ¨zçÀ™³ 5\¹Õ´ VÖ¢­ÈþÿÑÏçŠÂÈ"Ö¼âÜG“>çƒ$:«k8ßZ©Nñ–8=}ŠJP2¦Y&ºríÝt2üåR=iQ÷ã$E}•$X¹~A[Ë@ýç~ßópzZ ©~ §ú ö»,Cùâ|ÏâºÐ¹–mI°µ5Ü–ïZ±ß³öEõF0ÈÁïÞL,Á…1Ô7Á£ïûŠw ÞÜ;ü¦©ó¦ÄÐ÷ŸÌüÓünw»Ûßh6¼_?Ú3:_].›ÅïÖˆ%ž,áC£š\VE’\18Êÿ8èªâ•ͬuYTŸzÈrÙò ÕÎ]Õ<Ö䀎ò^ÐEœy f˜2baKܽ« ˆâ9R͉Ã` *JΟÖh=3ÁIâ¡ïf8XU³´s(¯!^8ºGb³Ï}zH½ÖÆRø&ûr¨jA |aÅ­•n]îùþ{¤KóÛ½¤çƒâžTå~¨ìàvq§Ý¶”›0Hä·ÂY’–4l8¼2R¼¡­„˜,’||MrG퉲ï«{ê¢w²Ÿo ëäóÿ>#EÍû—z+i‹þ[a}(á)9á÷2ç±ÕØ_v5.çÊøjyV„mddµJ£w$³Pnz(`Zn¥¨§M»Px!+«õë·gøjUh3|‹Z ñ@4kŒ9S"¾»³ÀõGóï¨-‚åƒ*žG…ñF«³Ôò¬ŒËs Ò°ÍÒÓtT/3ŽeQç! W Q¹ÓlSá­ŠÃE«ñÇ,ø`Öù§ˆòL÷E‘“m z“oƒÐxþÿD“ùëk½ÇÝ/Æ•sˆ/¢YCy®Jg ÅïO7ÃÕëwõË(­t>çÂÞ(ƒ©å‹õž…ßÄÁéúÊÚÀðÖóÆ-èÚå}pÒ…™ò>óêåàWwËUßÿó±çÎß»Ýínw·±÷{6ûÜ K¥ M#y.Øê^| U}?O𥠡¨¯o˜]’Þ7x ^·DyÅÂÆÚàÚþ·Š¾ÛÝîö{Ú½Bïö«Ú‡Åv±pæ9TƆ÷h)ö+J5X£iŸø`öcU%Jqã™~7ªÃì†SrÍÂ=@â}´È‘â•lñ6¹ý¸.ú½»YfAó”ÈnÐMºJøËZÄ\¼C¢˜Â¥sIFÀŠe³—4”pÐð[·$#4ŽŽèuùóØ"¹DtöúXZŠ^R?奠®˜{ÏhWáàÖÛ9'ªùÃÝÉ.f»çãt­$¶\Å ì0übš€W<¯$vQòþ½Ì^æ:TceÔŒÝæ}ÃþÖÄ}zÿ/ˆ`vDš®ˆj†!þÜ~4ýØ %…tª`oUÁRbI]‹× Z˜©h#DÈD ¶[óyªÒ" ˜R&˜{‚mëi*]‚¬³dgé‚ÞZNoˆ¬wë¬e Ãñ—v”Þ}AN›‰¤\þ<Â&;éŠuà«vø^KiPL,ÃÊ5^Œ¨ÓãïôIÿ‡-—¡!Ö úEÅi h®ZCÕÄiwÂÞs*z±Ž˜í™ÝR⩇cÏ“b`µOª*S{ެk ¹™ƒ· ¶ß|^žªÀ¶súŸw¡—‘Ã6½žá.0W~ºŽÎ%Hþ°rÕ=(w3þ«CàðÉÝQ5•œé ¢<ÎÍÿs%;¯ùQ‡Zí”@-/ÙVÒ!q„)4¯m7¶øßl÷ ßínw;Ý>LJè6ÖDo()­ý¦Wê!Z]¦ÿ‹È<„Ç!Æ{Ø¡#ÅŸóÎÂÀ¹1½V„0 viÄjgL7L/X˜{š$]O" ‘8RD˜ˆ¨YŒÁB2*@¶u„ï³úÿ'ˆlÜfñ2«\Ñ gC€¡Œ;êOÞþ7™ÿÍô“b¿è¬¿àk;!9±1OI¯ _DÅŸ`ñÓ0ñeÑI ¿»'á¼S™ÀÍ€èõâFù/Ya¶iZ¥/Öµ.Ê’Óð‡˜B;FŒÅvc÷9HÃÚƒ”]CsõÖ²»âã2ueåÂ&¤BP,©¾f‘f§< ^¡õù¨µIC@ç9ÄÞ%Él¦){õäçŠMů‡¼¿õÌ'‘ÿ¤0ÎNÿù6ðë¤ÝÊgqçÐ0å½f61Tðó×lO¢º©ýp“fD|ì,C{Ù€ŠÉ¥Ükʯ§8ýŽ—†Ø©œï|mj¸–cYsÆÂ‚ˆ°£ÿ‚b¶§è±-Ã^»>Zã£= ‘͇%kñ›÷¾¦ÓVjŒŽÐ Û]¤È¦"q2“QMµýãÚŒ‹ÕåÏ[‡u²×üˆR'9å°–·`ùËŽNžaóÜ{6w©Pyle5¡¤i3q²´.ÌyêÀ)%º ôÿ´ucû®¨¡JŒŒ7}[j þ÷˜^“¬Ð:L´5ïxX ÀSp´Þ¦ÆçráZD.Ã8Wñç´râŠuâJ®Y¼½ý¶öƒ¸ÄIéž7áMÁ™ìl÷­W9cжXØ'K…(£‘³ šŽ®žmäè¶|l¼¾æGH¬$ÿ3¾¼úª©…×Þª,ê°áõ¦ºË’ÔŸ'•ñòÄaý6X[hÿ¤¬ø_{£[Ûýnw»ÛŸk§OkB—¸±Ç9‚\{ˆñ†¥p„bá½Ó!Ñeó€é0‚í½€ƒ·a:!Ë£¸1HC¦#ŸÞqp{ë~¤,!' ÷dÇãØÓðôv¤‡Ì½½x×›ë‚K'º=H׊Ê\§ÕN§.RÍ XGͱ‡:ß "BiòÚ†JÚ÷|¼Ë¢„B¢°R kÒtšu]8»E™p—ùHvÊà&.ÿlžqÏþÓ}Ë[öT‡¤YæïŽâåßmZY®% v˜ánB>%n ôÂGp‹),Ou Ž$ªHpÛ^1Ks¶ÿx6Wæ;ÛwE,¿·ëé`Ò0@ÚÌSo7Äú†fÍW¶GzXÿ “ð–t€`& øžh K_õÐu‚d±¹?Jp¼ÍºI·p2O\£•ê^ÌJêÜx—À Éo,¡N£kB° ( N»KH5­^åVHßRÚóÀùµ0íž…JìÆÈ&£;zZ® Ê>@Tǽª*s%ôtFù„Ù»±buˆa ŽÇ…ý¿˜}u†ª>$Äßú›åthùևǑÃõ7­xåãYUðevúY]i¨…¿Þ¹18OCÿxÇžqr >f¯u\ríEyZ@i8ì«È;¯é;Á(ž)ù"'„"mø¼¸óY•õ—ב²|Š€ônßtN}û‰‹hïv·»ÝíDû˜l4(xvÒ"XZ2JWg¹ƒê#·mË6Ýá$fì~rbFæx~—à0IƒHÝV2Ž53ERÛ`œ„µG¸Ï¢÷ò<ÁS…ñpðÓ øRv‡f}²:yÅ,¾˜Cžˆæ÷õT( v–Ïûƒ©ãƒ¡±J™„ÌÍÎ ×·;ßtˆ¥±[D¬,Nî Á €±BGHË9d#*´º(׀ǿ¸eaôU¤H‘âQ›ÞÎw˜„%n;¿:&œ€WÎÉ ï¨´Å§µºð—Ê+èk%&ô^ë,Ò©ÁÉ£‰|ÝíLhÌ>©ýÛæóð3¿k=µ†gtVpñL^)^5ØÏ¶´Ó¨-e-ŸàëòÑð[œÉ²ÐO?ú¥Qí®Ú€Þ¦›%Ì2¨iFºŽGœ˜höeé ¨K²&½Ïs¡Rò0ŸÏ‹âZ¼më줲Åñ¨·tù0¨Åñ׋ÝßvÆÒÒö)vÀ#Ãñ´…0!nŒó™··„wdym¨„æ&jã³ØwÊNéÀŒ”ˆñnY=§óÞXÀé^‡§ô,wÌõJµŒç™ª¿ (Á¾•?òߨƒosV–°ã¢„£•(G‚.±SmC[—Šg,°ÖSyÑW†’kw?ÁjW<^6\oYzT§Ã‹ û~‡á‰G 2ªm’ðÃ냎QÇäyß™¯z×üøµíŠ|η;ß=&ü r·»ÝíTûo‹lN­"^D6&'ÒVÅ·µr?‰ãg:Ç‹lŠàç¹(ò ãûTž±m† …yŽm¯æøO11võª}¬²Ì°.¶ÌòVh0P„Ý)Õ¬ ^Åúv®¶ ؉ڌ´ šò@wn5cױ˙JÔ²bÏh%5¼‰E ;g†Ò#kã /ÀÓX½.àíjZ‹™p4¾j,‹6# QvßfDÌŠ&5ÑÒ“äÒ1lñ®¨Î{ŽÇ>G/KŠ/Wå“Ly"OàT—De²íCqü1•}Ô$>@k]—?ƒ@CEü­„Í×–(‰)ǧ6ßñp‡0ùå7=`}®…¼øx…‰Â¹?ãù•}ê!¹Cš5ú*¢.:füAMðwø¯àì¡)ÒáÁ!ÿÂú]«PÎáÉûãýcÉŸ9~ ½ý¿²¿MúìK/é³7â·»ý©ö*(+tcP‡CTZ'»)LœMTÞÁ@ZÕµaUßH(¿—=†¬9‹|Æt‹‡DoŽÎ“EÕÀàa šÀ‰Óh‰WØJÏÃÑ9‰dtéÅX ^£Pÿ·Y³âAº(Þžo÷qÎF›…JÏâïºFSZ½çq#U¸PêC_ÍÃëPŒT«—mulöº`x÷ÝE­'-ž†ç·Í5Å-ª­ ì© `¤ADm\ª^ 냀ÓÔØƒ„ZÙÛaŠÒêÑ«K[OÁÐç=•- ¡|‚˜ÂК¦Ú6uŸÎÉ‹ ɲC2SàGÇDzH|éÙ¤$ÇàósÔhÅt › Þð „^È.çd‚¶©lºÝ½—vºâ§¶'¿UržE•ñµØýx‡“Òbh¥“$Sfˆ³à\Ì|;½•=CŸKÛ vÎ>‹Ãº hwõ*I‹ ·¯°ŠO[¦FP(-«[+Eº›Âj1£Ë‹ƒ/S¾â2yÐV`´j ]Œ¶Ušt¤àì ¡æ©5åÊq¯r¤yaäŽ+>äsð#ߎî…¥~•wG'Á)²ð‰dú%‡ãšº”³\¡3UœUÍÒ+Šùí&©Gº.Q °0ù€IW´å.=½ òúÙ{ÁvÁ2vãÛ÷?Rð íÂEŠÓEœšð˜Ýô~Ãyw·»ÝíTû—',ë®Z …ÛHvp=ñ¢Š …‡Ø&õïÒžI™ºº Ò7õ†9Ýlƒ¬v(ùŸü¬ÑÃi·Ž}›˜¯HXOèXS¬mf»]%EÒñ…ÊÁÝ—gSsÿ@‹›Ó0‹5^Y1È| =Þý´|ê]‘œ7ß·­xAögb1„ò€‡¨â)¯|&AÇ~µÈˆí+XœÅƒæ»®ËãÓ`ÿ͇÷õB}9@›K?ÐÑsZ•CÃ8¥y†3–C53çyŽÕÒCHç áÁèØ±ÿÜínwû§ÛG Lót–cAOv)?´*â4¤,žóôæƒA8°ëPV½>5+¼1íÄõkú޾ŸuÂì X„‚<}F4ʇUÜÅŒ4A* §¥û7Dú­Ç" >ˆ(íâêüÓØá–A¾*/`˜ +d@ 9ÁV°$‹éû„Ánx°ë¡iáK¤¨²OŸqÅ8º ÎØKLÝsˆ9ã¸í~˜ Èòî«Áyîgá±½l‘Ì©ú5Ýœi:*@@jˆ¶µäϬEâär¿F¹5o¿ü ÷?Ý??Ó›\v^ôEÔEÒ%ÃWM3z»…Vh:õ¼”t] Ú vÌqh¢Þ’—,3µ™BNÚè"@‘–GÓ@ °JT/Ô…uê“@c™¾pÐËwÌ €Eœcþ T® ³|UrpoŽ.yòiˆcÑŒÉÉϬ¼‡ôkFßÌÁ:ÔÖ2î•Ë+ÔÂ-ë`$ˆ¡ÍíÖ!MXSKmã8ü¥îOyàæ¥-g°‚ÚõåoŒý½äa¹Œƒ|[~úÄ™Æ}k'ÓïÈðòûbðZ㢻kEvxfÂ^ð]8;¨ï”§BőޡqðÝ :¾©Óß½Í\Ýh.ïc^òYÐAâe݈VÉ¿¾Éí ßôÍ¿´‡Žž¦˜›AþáÆ;™q·»éöqZ÷SKœr`C­‹÷›'üÖ΂?µÊgÁêúÍÑ¢äà!ó®³|YjâáãÞ¢EËŸ¶žká x–«w+z|¦}BŽ,Ï2&_´Ò­º¥ã\‹¥²;ÙNj3YO¼Ì¤CñT¾Î )h¬Yü±u~7QpŠsÅã8!ÑŸˆÂ÷ÊuCüCá2ÇÄMCO™ìˆÛ§J \:pbI—l˜^ GbV GƒÕ¾ÇŠ zKH±Çv+i Zõ$edÅÍϦ{äÓóthxthØi­p^ ¾1ó°P{²¤ÿ_˜¹Ír팇ÌYP 5~嘪‹Z>b‚96¼Ló%Da; ¼66}0É·zD…®MÌ«â(65¿Ñ!qσ×îàÈ›9¬r ›Vyß–rfJÜOVI§ùØ¥&DÁ¼†þ>{wÝ*ÌhŽþ™#{`îCˆ,ûj|XÏ:w¸äËÕ+ñFžB77'<&ê‡â™x@ÿ'‹e:¦8/„ïˆå—®†*fõÒû¨_ý©.b¼xÁÃÿ.Œ‚CR™ëGGŽíÚY9Þj^úÌŃ€vÊÎ5%ûÓ ’”³þæaÅùä߸¾c-V ¡±UÞ›žÂÀʦJõÉë©ÊaHûçr½¬ÿ?«XDqü&C?Óî~¸ÛÝŠöÁ—ŽÔEA"Û•ÖgÞKk_q?cTW$¯e[ Hy(ÿÒŠ}æàÅ”ÇyyL£.b°ú¸‰Õл60t(dI¡- dšYómÁ›·É‰Cå¶äû.]%0º*¡f…» e걈[Y–¨Ÿ¥-yÄçâèj‡DŒÝ×#6ð=ˆ•I–] ;(f…(U\Œb ºC*âk= ˆµÞË Æ³“Ù%ÀáhVDÈÎÞ°)ÃŒävàú?,œrõÇØƒÊÀVü©ç¡‡ÌÊ.SÞ™Ë^«ç™¸Ìx˜}Þd¼, ¿Ox[I,d³bšîL6gLݳJlÏϬ€™¥ðñ•+Jت¾¸—2Ð 7\AX+í«µ£ØÌ»KÄp€·2ÃÔ‡«Ø“– óùNÀÊìFéˆTüÌ©‘¦dNdÓSØ¿û]ÓOcÒ ’+tð.R×bå¸X±Òóq³[å1k6^al â2LÃÒ[#±ZA{Üí˜>0êÒÌú¶“§Ð4…‚UOõ,ù‡v輨§[²ßC‡ï~³{—/kJº·ß ý¿eV&C¯×­_žÚXf¿‰:ôã¹96f¶.ò½BðÃ;çÒ¢H·Jø:¼sÉáÔç00‡®Ëñ¨¾ÓZF‡õçûÖ/‡¬…£¯n»ã_NÙTݾ©¿áå1¬¾}÷©ü× Üínÿö‘ñY&²pFUª“i¤ˆjÌnb"^âKGKÎᘈàxM+ÞáHy“"–wÚ¾oå!–.~yZÍaºØ•#ÃFŸ¹i^¹e—xÖÙì# Çeg©sR~…4yœ€ŒUö‹(Ñ +IÐ.$œÎÌÀ˜Ñ)Xÿ\s˜è`+½³…†yXÍrð-KO˜”Ï'¼ŠA ß–)ò˜b;uý ×-@´Þ;*.CH×NT£J¯ ê!\q‹Ò šPx¨ɵFûÿÂTLz÷{öˆtå&-#z¨KFý*àß´lO¿ó0îxDÄ CÂÔ7´ÖÑpB{E<̃®ÐÇM`Š®.÷)Ö®ìÌbQª—Âæ‹ïíÌ0Â^Gf:0/­áJbsŸè†áý€)Êã>_HPhOAõ?Í•¾È†~ÃÌq:¸ ŸŒaUgok_O;usùQ…r‘3æ‰ZQ :Ó (8!k¤æhLz‚°|ô­˜ÒHÿü&8Î ¾‚JU;$Ÿ 4›õ|+HÄ¢ÿló¤ËzŸ»eÎøZ¸ë´9e¹ñCRÜH§ý‹zžcÝr€¦qm>½MNx1 IDAT ¹„ÿ\ùTàâµv2oÍ«ûäBœ4‡¥¸èA®rBÿ»xîïyò÷¹Òã=÷™!w»ÛݾÅÁ³ÇöŽ\<<¥°.£Ÿ½ "qœ!–7þ ©{€ÄЄŠI1­…7ê œÕá⬂ßì†6´YïHmÛÀ…#¡~ɘݞ#q˜\ª©üŸÃËf€i?ºu˜ò§Œ(0 þÓ³8å•JÛelb@ÉÙ· y#Õ-„Ú»=kÜSÐgúT†¹ÛÇ™ ±rÙÕoPXdÇéAE¦ [GÈyŽpSõŽ_ìU•‹‡ ê>TÞUì»–wRéqúc»NQe¼Œ˜¬ 9¡gv-&ñ„V‘Ü÷ÏÎaÏæûcìï²O?Wt‹yêË! TƒŠ ¤×¯°g¦ ‰2› ,õ¿˜„M0+zµe"VËž¦¤€¦W‘>?»ñ §]F31á3¼|™–uaÃiY} E¾4èdušÒ¯YE³~k –V~Mù¾rô‘ýZŒˆn³ÑðÌzúoŒ> Ž·æ(\åƒ6 ×.Ä_œ(¢(9šÞ¿V¯Ë<Ê@Hœ/<ä «>›'ÞK*d4šx|~ñEH~ å+_°ÆƒÄ6q‘7ÆïÀh^7€=Ê÷Ä[Þbÿá*q³M WjxÍ“Û3 Ïø‰N>SVf Ö„W;zœ¬Ãúô¬/ßü¿ÓÒÿ8`2M(…J§˜IÝòìÐÚ3] é&Û½Öýžäƒ˜igCØÿ:¸0}; TÇ–ø+`b gÑL@œN‚,àt„¦!ÏÁD³q»Æ9;&u> zÿ±{[›šb˜l¢%S«þ_ß`ŒúC¸†AH¨1b[Ír¹øüY¡²\ëS_D±ò·`vã 8ø.pÀpEËKY½ŠY¼ùœýè­ãp§• €/á„bî\í{KiÕºÖEqÉŸŽ Î8ÏåS‹úÖC°>¥ú0hžÅ½r Y=hÃ2v¨.|øè·Ž ú ½·°r¼Kã¥ú–=µžÕ?×Ю‘’[ß*—52l"WÌ·»ÝínÿLûȧÃ0ø¨ãh@o\Î8# ´D»n!íïY(e Ý9RÜZÑÀ=t|€¢Ô˜–³³iqçØ”°À1NÒœ})Ïèê¶úr‰ò©´òƒR :0+×÷Ô‹;z!ËÞÕ©-y˜Ü°é0è!¶–ðb+0°øÔF½Ö’e6éê°~XéãÊÅw+£1“¶¯gÆØÐµ¼mNKØ#ï¨LtA­£BÆ!ûd,;å Ì¥'£G›l·ˆ¡t¬° E3}‹½þÞæÕuBaV_Ypä÷½{ŸùñÙØt„h^ðõ(Y”Š“Y?öòåÜ‹ÖZ{ìŭž’Ü£+–;Ê ¼mI²–DfBþ¯RZs®®úE„6Ø © ¢dªÐ¦ÓòSbý¿Bi1…Î ßb:9HoÎò…xËî v J$ÔfFØoÖmg4*Y–<¿qؼïÛâX,‹šÀŽI–¬-")úšŒ†|DXwØ÷®uõE.îT§˜Å¡¸„Ô}ŽK{d.q>ÞŽÔäü%Deo±ÅµÆt-ÝÄãßu@,½ÈŸc=†ú9Xa zå˜Ú¶lŸÁv•J^‰õ½DÕŽ4éj]ÿ¨Üå²]³‰áƒÚ>ÕiŠníaÒãQ héI« QMž…u$A#– ®£k‰Õ Åò’dËWgÀ¿b=PGôf¢¢Ý ¼uzý.–cÎNܶޤ€÷s6_4‘ìj²¿#UVB'糧ã(Ã^çå}ÔE“ùaÿXÝû·Ñ—jù©EöÒœ ®Å¬P_wa>“fÎ#¥"ÆÛYÅöÈJU©Cl²0¤ŽÛÃÔ[Lô@Ò~åŠÏìfÈ(]ÒÖxÜ(þw Lsüä3Ý‚p&Ú‚eW_/ýçÁ¥^øãö~Ýë—_ž³ü j~À*¡òÒã‘e*¿q=cùñxnêRJ/ΨJ ìÿÙûÚåÖu]IvnÞÿÇ=?Køh€”,'Yûˆ55uÏÚŽ-‘ 4€n˜Do&œD?MTwßÛ ÿø«Î À(¶ʉ=ƒâm“‡çqyùÃ`&¯IßvÖ‡ÞߤKYíËÏïþüËžÿÏ-yæ ;®ˆ.^9üõ·ü<ïÐ=îqÿ±ñi‹×†-Y-ð4w´¡¸àYú:KíÏ4õõÃÔ`ÆH8…—ÇêMŠ"QÑVÔJôLDQ``t*'ãêùëÂÈóÒ`÷PÉX(p%_}¸*!8Nº2›W§ß “4Ô!½åKÑ×îôñUzúˆ’m6‰ñŽ-0PfŽØeµ/šŽŠ^WƒÒ"S›gN¢é§òIHGnóH…–{%¬Ï’‘ŽÞg7•@Ò”H3¤ÞÚN2Îo:ûQÈÐAiɼ¤‹Gâ.8}Ü€Qž%v…ŠÓöõ5Ä8òTù–± ¡»×ž&v [K$ESÕ¾£êد‰-å³çxèìv§z7äïnJ ’dö‹jãÀ4è„dgÈq2¼‚ï9³±úÇRº_&úE=”W=òòѕ֎íKˆ"íˆv%$(ÀTðMÝõ…pzS|?åÔðb×áôñœ´­¸>€à_f)¡õ 8 o¥±É/ݬ‘º‹à÷[cÊÜRÈor†ÙÜvÉmàñ:²¤î0¥È¸&¶¯¢Ö¦h÷(b¡±Oñ1a’àHAù²Æ²å☡\+‘:ý)_pž1ûèUžkÜ8nì'ÔôãS9k ¨¼v=gdžHã-bv\$" T°=sý;ìê Mìž|@­œ„¸þ]ÈZoïÒyšÖ0Mš*~÷<Ñíô2 þ?WœýW“ŸÓ9æww&ïÅÑé›Ö -²üßã÷¸ÇÁñ9 ÏJV¿Žºqpcò¶H„ݳ8!ù"”…¥^1?3nR'*"zÂ¥*!0‘Ÿ (VÒË•~cSB¢îÊÇË´pFíöôUK#Á4x¤úŸqÐ5J³i\H•¤÷äXâÏF_duÓP²m8‚ØyiDIòVïË·{Rn¡úü‡ƒÕÆF¸1¢’ÙQ`@ ÒÖ¡R5LÂF¶{y˜ºÝ³Öf'–Ü#,- …½²¿Ù=Lãl^Ê p4Š£;õ\þ̦Ž0V!Zúä={U¦ ÂÐ.»º@†8±—cïÏØ“F¤zJUBs=¥¬,Cþ‘G+¢ZÔ›ëá€Æ(0 Œdc¥sœZY{3-:£ESAls¹€;L ä\‹G‹¶Ù/2rÑ„™[ ó"Īe XªÃBaÞîI­Í³¼Ý`èæ¿Ö(Z—Â~©dWÅ£Ú\lPñ§ìf›Ã@T` [ì{!V:"‹n EÎÒž¨²&#º’º8Ž„à—klOÈxâÈ.[öß `þ™ÁãÊ‚×îׯ•=®Ì¡q-¿1Ï— ×èä)]_#ˆ,|ÇMó$ÑÐôËÛSý¬d@/ÜŠk§6š.Ù¾2‚ž2DáEóýåÓéÝãWŠñÿ½bt^ðKý[STaÓ/:FW¾Ú«‡Ø=îq?<>%nBÄðÀ á<‰ bÆâ8Ò÷ /÷·á/ ¾nŽ©õÑD‚† ’fgJ “ãF ]8K䮇jºR‰(«Vý¢­>W[Û/q°Mq\ßšÚr†¢rg•Ú7È“öÖ…NëoXJ«Ñenö~‡ʃ-ØO,•ÞcF¬Dq¢‚®O㤟8•°ª:JzbDzˆß8.9ÓV¤¸\à~H1§?$ ¿PŽ(Xö Ðãl 6Û4"cŽÃÓ “:òá ½»%ø¢· ø±šÀv##”¥3îHOtëõ‰…öp’¼cŒ1þß“éÿ¬Lˆ1¨£å¦ >ùÔ$p¤CkÕ»™3}?Eéêyr$ÞíÅ´FP´!_?ôxN—€?0ä„ÃÉ2•m›agb¥|sQßÞ$ [°ÅùÏ]Î× KÐòkÑÉc  (ÀÍxZN§|í=¨Ž;%$0!aC<ùQñåo€l–j¸bWb¿xu-ÝÂ'Â3†3¶ôÈ¥¡Ç ‰kšÚË” ¬e5¿ÌW¹Øc ¿ §JC0wJñ¢¿vz3àŽj³TšÀ¼I/ÈKÞ‹'³ùëúâxãõC¯ðœ=ÊcáýV}ðwçâE…8—~‘4j. ´úö|S>¼‰°ü¢¿ 5^Ž»ò_ÆNÿƒT4/#Ú1J»¾¿ ]+ºÃäO˜Íûßãÿ­ñYQÌ ‡†:ȵðܵ¬ Ú²ÒŠ”6_ßüxÖêÚš‚²»‚qRSÿ{HýmQøÙ4 eä_õ´22rp¡^O30Ý7P‹Î޾s›–RûÁ©óô 2¹@ßÛQ‘œ\ž!ŒýÚððþÛê|…¼óW* (Éó¼ÁÊô‹å»1†ÇÅÆ“ùªZ‘l!•CƒÚø w èàÈ&âÔ‰FúÞ$WáãH:‘‰åkr!°üï„âG‚¢„!¢ ¡9 j¶y{p’¦ãñÕùdT0ïV¤é1ìI¤#ŸW˜F¶Ÿ­6ËkÓœºªw‡R/D6-±„¿à_ŒÁÃfSŒîˆNÂå3é´|žÃmЍº^˜.;{þ¨»ïJ«10b¢Â&K²Ü"’â…ûw?óò”lzÿ«"z+¯=,ËS¾éàoÏÍXµWs†mKÌ`ð,‚ä÷„Ár7qD=€Šºp÷Œ PepɈۈ㢸þo¯ Æt•j.†@q¿ 5–ôßääap‚»J܆—(j/B©ø=Þ™ü×A¦ù¤À+x%¼A¯~õ —aN•³\臡s„Ò¨}•uÀÅ•øŒâ^8Š|¥†¿jŸ® MOòõ)1‹•>Zl†?^WŽ÷|^†±+Gü5Z¥ñ¯<Æ_ƯýþŸÂcñ¯gð‚,ˆrãŠgÀ›MþFõïqÿÙñŠ×*ñàËú⤇-B”ku5'ç#] <‰¼d’1Xø©ð Æs´f ÑW£ÓRN.h V©âIÔ’¨`Ü*P £‰À©‚ºÅ»ÄÂW9ŽÊcÐ|JÉ^TÖz ™ÜK]ƒ³Ö©Ë ý$ß Ò&÷0¾|#à¤3§ Âhº J.Æ4 Ÿïõ–±õøPôƒïAé39'¥té5Kcù˜ ¿;àå—3òàˆìŸÐíÇW7ŠBã:âû 繩ž‘ºZ©ƒ=Ïä'vKjîÓ ûI4ÍeŒ^JV sêàÞ`²vÉ¥g@Úd7(rbgÞ×\dÆxš²Y¤r›Ø %žÕ­HÄx\` <âaR®*Ü;²ÀE,L¼{ÖQ¨å~äë %>½ä,køŠ·JÆ&’e)Þ\'Îâ ç,â±×È ”¹Zܩ…Zu: ^ É.1[×­©…I¾˜³ÚsÖAµNðÃ÷ ¡%Þ37N®ãY­;0qÞ˜T¬QÀ”oŠäu*.½¶e÷B!Ï1.@|IaWx¿¿»£>J†È«ñÅï¯ÿùP ¦ÌëU°Ë:¨ZxxÅ00Ÿm(oËǘ&_Žë]¼Ͼ²ïí\®ÿÉ2þ+önÛ… ?¡Õ„Ÿ>nîq{Üã{|–þ¤§Ži.4$ЬòOˆº’nxfC$uýÂõÆé NÑ÷M7Cδ<Ë‘‰ÎMJ® ÷Q,„Ęº¦ŽU³ Vú›%¼õ\°rf ã6º}÷{ d*Þ5ÎÏéýHáwÆãØ»F)þØlÒó`TsÐöM-Ó–sZVý.™a"+D ìÈœô‡=0¨c˜«¹‡xÁ`<(^^}¡*%†M°äç@zëHΣ|¬0éøRbxvPFG)Gçʇ E(ÅUùÀªAadi “?cãº× jŽÆ¿þÓ‡ßUŒÀâ \q-ÈÓÝ–,74Ä/¢¸V¨|qK5“­P÷ŽÐ)1¸õdו/¨½PjHôñ^dÏ&sÓ Eeƒâ"`âd`Ãp Ó"ïÈ!®ðx¿Ã3;¥‰•GzE¡Õ¶ßbägªý‚‰U/$k—5•±L…?¯[§Ø›¼Bw-¢¤’{ohc±¨íý|ù“Ë“¼Z‹ü¿!8ÞŠû½Î£@݇ O(žéâ¸~•«ÿ‚ëh¼¿§ãœ)B5²..HjOQ¡‰U½j‹$öÝ6\Ìê?ŸþÖæ…kÕ3/סàÐçK?´²æ8ø.¨tMWòs¯UÇ7m¨3‹>ý¹SG^Àsß<*†Ò—޼ÿåÁ±nâðY³êÜqÕ…{Üãv|Ž\2̵>ëçYÆ¡zÒAóðµÕ¡œ6”õe•]`rŸ—%ö>ƒ§¸}CÝ À:Òc'£åë®^[ÿ»å®)¾‰©C¢¹ð˜Ä~‡â„=æ,0¯YCË9~@‹AºgúRô½†ÚTe’ xÍÐ!º°jI=8›_R[=+Ü™¬:F:ÉM61+u¤ª T ËïȈAÖì¹–Câì1919ц ð9´3@COD“K0šÃº1ñ}¡÷09 ¡ThF)h½Â÷Z9Ý +HSæWaj•¥X‰"±oÑ/܈šÉ‡¶¢Ãô_ô3Ù&P‡¿|Ñ\¦dq;;G­q’ïá,".»0hä’W)cÖ ûg@ð´ZP-ÍY ï^µ£ž«s\7/guð¶÷_²òà8`û“‰ytD»á¼ ß¢eÄ6ÇÂ[ðܽ”‰0ùZkÓt0ìÁýwÓݼ`4úºA›+Ê.åßmÿ»X&«=ykm Ý F^`ÿ<ó÷¸Ç=~q|Z…ÉŒN][Òb°O«Â“ï¹K˜2U<Šxˆ}ñþyCt/²r× fÇ&B0Š®†‘Ý]¥ŸÉeÕAÍÊÂ2DGÖN`¦¾TRzùF ]NèâÄp<îFA0´;xv‹ §šY ìV°f˜jziÐuÚÓX2̺ⷥ¡òŽ<¯åÄ¿)Ö±û¤Ztú†²®©Îž:‡'Ô¶¼ ÁŒTæ†wc‘-‰;$,ã™JÙIÒC7Ie‚Z,ž(ªÍŽÐû‹CY #yº¥à×]J½(BšÀŸ~[÷&lPùLø6ÌI û?—ƒÏpüÊôzÞ‰l¹eËjcýL½ª¶š±ì0$š6”€5Yú"·1Tâü…7e±ÕÖ£aT|L 콉Y5ÃtÑÉU0ÀTÿê׈ŽÉºöRÏÏûçà9õiF ´ÿéWNã{V?aÙË«þ÷*ˆñóÁœç©±OUwêhý ÿìÿãð¿­.¼òÂsƒé÷¸Ç=þ¹ñ¹ÃU2 -ô å J{è+ô«ŠlK;àùž!=F,èU ³çÜIqêQLë<ª&€È|’©Š‡Ž·%êÊõÂáê‰P<¿ìß‘M,;]ÐÐð°<ZãPÂj-XŽ—÷±/'¯LÑbsy®Ca¸½/Þ\9‰gA!;þ;6¶ýa ¿4ª!¼×’!3J ôÏÇÒÀ`ÖúÏ)>Ϛʡ𠃇þ7þƒÃõîï>b!ùÈ@ †ÈèüÄž™=´¶ì:I…[2ž]Pb–ëI¢ðhcQ’tî…϶Â:ôKá¹)ØÆLÀÃÚ€•—u¿P–zÞSÎ~;,•À~)W3Ü„&¾ÐÛÂÁeëU ƒ‚Örø@T 赫ÓUÞ2RŒçˆøBZ»…H ía™ü3l KHF»g‚¡ÀšæeáŽ&x8>H WbÂúxjÀßôƒN#½ž,`NE<}ÇÃlU¬0'`=°8ÆÃëãhO€ŽæbA-Äç¥÷Z£ª‚,ù=W#¤8¶“Äòâ,<ÞåtâaçŠÇ}3¸ƒÿ:aÿâ·òZÓJ>C´ú£ï_ÎÖ"©ËöB4ãš2ùXˆòúG?†{7ôÿ#X#ÎOÖK?ÊFŸ€×¿ý•ç*;òØKΜñ[eæ¸î~ýäl1„û uãŠ5¸³÷¸Ç=þÂøœ^Šá_BtþIV+¨yWi(4´glXròfݱ Eº7TÙŒúw%APÃ"#}vt±;[‹z¼@«Ý<²Nr4ÖBMdî¾,æØ=NDF𢠞=%q`„`š%Z²{â»D:îë•ò û·a|ç£î€ í’’×_´'öáa‰;Fäú =UX•ƒ+f]ÜÚØ L4*¨×Ô ¤³‚Ö‘·uèLI:¨±{ ¨€3ebìƒQ6!¾æþýfK"|’^É6ýX@·7´t››GP3N­'V}Ý®x–KÍ<*£´Ì©A,×>¡ˆˆèürÙÀ¾þ ¤Ñ„ÈdH%êv‰Ë¨µÚ éÀÛ­‘ŠÜáév!_Ô•Ú©<’?¾e3añ.DÇÔg'v—{Aq-"Š Ëس“"àð@qèl]‰ÏØw3Pnª‰ÎK~ž!ØáTœVñwÌ{ÑëŠÉ{ûTt1ì…Vžs-œÊ*wVÓ}¾ôa˜®û‹lIÖÿ*óÐk8—Ÿùí€Î¿â”þäZoâ9øgžTøoÄ¿±\â=1os¯?óþgºÈƒÏ„ wjgyÝšCÙ£„Mßœ íVäOüôŧ(;¶€7žío=þ[Œ?ºcþ¿}{Þã÷¸‡Ÿ1èJH–¼Ä`Y€X]„5Œ)h WËéZª¹{ÒÃ3¿é¶bY?[ã$·þͨ0.): -ݵ>ì;Û·T….¬„6k^N::zƒß90Œò×E…-vöˆ‚„â2ƒnåŽÇŽg¥·w@¬—Ï[Õb®uñˆ é:Ê„û˜ÝcH7e3Í»>«íŸùœô}fqwä½ã±ã<0ÌJP{…Úš=ój¿÷ãÙéå…Uò·”j1?øk ³À’LW„ë€&×8%©_¹@—irM-Å—OS€ïŽº_ò¸6Egñ·Ÿ@®þc\μøËÀZ¼yžZ‹ÿšvÁB¥ägÄ•¯› ޾*Þh¡o5Æb82üb'áGv.êë¿cØ'íª'Ú“Y±@\‡!›ÿÆ£4 ÝÚ݉€{Üãÿúø”ñ3׺ù–Z!֊—²& 'pÅVôPœBŃÃ1-#ÇðÎŒçD§t\»2,ÉQkÊùêQ©Búª*“þ‹¢jðЍ úÇ!Ã\hkBmý,ë¯óÝÈš~5 D®* ÝŠÅÛAÞúÆ€#öab=íçî1Ðö–™ñ0ŒCåžÉ‡ˆ:m´Í^ƒ·M úœ¬qÉÑî=íp%ÿ}Gµw"ŸIà%ÌT"ÐLâ)&ªnƲý±Éÿz;œr¾oR±,Z=D] ~vÛ[íÜùžÍíG3¯.•ä€Ý1›ÜÔf¬*ËEM½16¨P:œ™€Oô¢“bûÞMç«aWx¶À½•;iÉra&ÒÃ#­2ØíT¿”(G¹úßâ ˜G.±ß(èuqP!00Ôí€'}Öc|Óë£áÍŸqÉ‹FCFN §ô >Êÿ3[½e¯ñ€Ñ]å°cwãT(…gIá®a< Îüè9áù¾p%£KùÔòQÙ¢/Böš®Íµô= ¯ ‚¶åo ;? i5°š6 ´®øtK*zµ¿…µ'{ÔqÖFg,šÒ{5+éüIpüBalçýá…{{åË» £ë5ãY05ˆ®ÂŸÛPË/Áó_ùk òï *ãæjˆ^i÷¸Ç=îñ ã[˜¶ž4»ªð1ÛßH@„t Wz<(•x=0Ç&6K¬ô+ú‹WZ=®hUD÷Cò§#Ô‹ùïV¾ûFV“{"*á34Ó¶€„ÌgâjR‹ø¢Æû§ù—ðÄ»×˸—ñÒÄVº bD(u z-çaI®Ï躌š1cÿ *âî-ªa[qgŒ¶ð¬Ö.º#½¢ŠÊå̼tD|~N\+‹þ? ÒBÔâÚV¢™ *¥Bk´rs ŽYQRAÑns“BbtÊ­*’£Ð*Ï"ðÆÃ²`Q‡Ì½™£mÚCt–$0Šsl<¶‡ãzÒš4#yï$£q’°[ÂÉʺª×³ªËvc§Ë#"l‡JK€LÈ£?÷*Y µ<·—«ÛàÓx¦£8jvyOŒ“#7ëu„æªÈùF·ßmg˜lëÙ’Rì#|+jŒƒ`Ó|Çéç°D.@Kóž† k¤ž¯¬iàò‡/D1ÞO.Q9x\žð ð¨–ZðÅ<Ç‹S(Ja(<¹"8òîXØP¿äw±H^½Š¯åmˆ…©fºÅFëfcirù-á•E”zæ1Nd›8;:ÖbäPîv~ `¶î÷¸Ç=îñ[ã>†)èãìˆB¡7Xo°˜í"d 1ØÃe]y3) ç½ÛÊûDF¨Ó³áxÛiƒÕ2…2r]€‚tûå[^‡³¹t9ûõœ ±É!áô^ôšö²ëS2¡²%·FfN‡©0UÕl]m˜Íµ}1ßPé¹EÑ`ÔKÀ¼ÒÃÖE&KÞA1¦%ˆ”®iß¿g eˆêÔÂ{ÁÛÚ™ÂSAwŠ™^$HE¬.¦¦¢h·Z…hnƒÙHÂ$Û¦±a'w$!Ø5®aëë :|sÒö {¿×ˆ’¿n#©NÚ R+E¼%‹Í[ò·­ÒÃ[?× ˆ»#HÁWãþŒa(qº–V~XŠ$ eat=e€`CÀ?lV~­iŽˆZÀæÎfw7U·ùäšc”\^m—xß±÷?Y1Þ1»‹…µ±Ll`ú5’Øj ¡Ë­cè»)Ž$íQ •ëúÄ,@(œãšÈ÷>ÊSqñ‹±¦GŠþÏEž_a8áòºŒEÙóSO‚Ö¼qú«~ÁY§bàî®Öåð–ÃÖi¿ä½ùÊtñ¼KU§·ÛA#ù~êô[9‡tµûO¶kð€ý÷gßýTXØqU1ÚrP™]¦ø…—¼óë†t-¦Ëw™ú=®º_ªWq H¿Ç=îq¿0>%Ô0µSß»¬ßÙ÷`ƒs]BBèð æ‡Êˆ“ãËÞÀ¡k™m2ÇO+YeÚúÐ?q!áÉÌ0õA‰15%±X eIÑVGŒf~¨!¢\TþJ¯ñ;oðk(>¥=U” ·?Ø´v±$bϤ̦ôVG„¶%犂¦l‡=?æ¶/b?ͬÇ!p¥ÉÆ!iä« í¶ ò· ö,ÈÞ¶RõD:”¬/Jî? ¾iÙ˜[ƒRôäóŒÝ$ŽA»8Ç÷´Ð5b”'t”å]zÀãy83×°§.Š`‡nœ¥ÛVÁ ÏŽQ QÜE \ïÕd^»{$¶+¨I ©gÜo1wÒÝq 4°x(vËÕ‹›e´| tª'ðGÖ(ˆ¼‘ÆØäR¿¤Œ­ õ™K ÇbŠçCžžžÌ­€  t˜1S…Q·q`-Šƒ<~³þmÃE#ÿ¾q*ئK¬c™¬`ÚR¶ÎbP ´ì‡ª“y\¬u^ Šctÿ/B²g`‚á~½D‰}ùÊ¥ÌÊ^?€ùˆõZįFùÊ»-' <Àu¯W¥T+è?>ïµOÂÎ+{×àÂüà¤IàÂÝ8fª8ì>P=S8ö¦Cçu‘[]pwÒPe>ÆOä=f~jpäNÖÜã÷ø'ƧfŠÇC(ó…(Q×èåóí¡‚»x4Mc`à¨Î’åFàÄ¡œ~δqŽ Y)ýé‘Å,pÃÈd̓N*êÀi”5wǼZõ¦„ ßgB6vLá-…K:P{8ÀWj/!„µhýæ<{‘BNƒË¤Lf|ÃŽcŒ'â9 2™»76ä;£}ùZF½^ñ›(±Ù§Éa$üÅ ÷§0B[4ì apïïË"ž©õZw<”Ñê€}‹‘ŽÏDN+Ç7uûhúæ+ÉrÅê†áRe¶¢Üõp¤&Œ‘+hTš6`8FÄÿÄ.³‘·Tèi3ãƒãoöán*DÅQ@ ’jŸágÑ/B!·ðØÃÓÅà¹Å>žÿ÷Ã'e]ÂÞü[=áÑÿ™%«ò‘Acœ6¤WøäG6]ø“ÓkB èsé.˜Â"9U º›¨“ÓX:[çq!ù‘ZmÊ!Jh†-”¿ŠD]WØØÑz-÷ðÓä*ü´®²ôŽÛSñè»^3‹Ç(¤À_¾ç ÞD¤$SwgÖ⪚õþ̼œ+‡fGûT++MêÇö*~žã¿ÛJwÚEx‡ÈÊÄɇ?zæš6ýàH€…›ãú“ziˆÒé~úŸ®0ç'ù’Gã©äñ\”÷¸Ç=îqt|Ž«ÕU”²a µÉÛ1÷z¤£ ËóNrm*g©PzqöQ—ûqå<¦cH<ÒqbÖLánÈ2fíÒ%ÃøÎÈBüv$‚ìüŒ–ER¦håXoBU¹‡òeÙ&=M:ôì 7w òtÔ=óÂP¶hÆ.–ü+žéeFQŸ‹Q"øÈõw_àø‡VªølhJMIü7RˆÌ}„Æ·Þdl¹Ï­'Ncú™ª(rÁ  ¿èð©¥V‰E.ÖÑþñLzÓ.&‰Ó“â©‚‰bDù7ú†Dá0ßi=©Œ«wEÖ¢£4þ]E:ôDI"u¶¡[枘eßvA£ç\ž"P˜5c8¦x;‘”æ9ÕxÒ¯#­à¨‹5Í=’Ál1a@?©´‚÷i7Û'´-¸ô1útp\l›·ž…#ÙC=ªFú[ïl[²¾Ë´¨–™Xh!f8æ"Ú¶• ôg‹Ç«ÄanБeÿr}óiœsÞ삜ˆ˜Pgn-^,~7ïngÆÞõe!Ù¨7ý‡]AŸuMCí„¡ØöÚègCÿ7§oËܬÎò}…)­ºŽ¬„ÉØUîÃ,X à“Æz2¹^žf†Oi{¯ýw0é–lD’Q#PÒ­¨ WwÅŒÆ(r]õAoØã]–È+ž"‹„ }ùòÖFÔ¾Ôs"3ÐÿÉÂÀóhÓä°Ü¡ —Þ‰—œ$ß.¹\ø¿‚þÿŽY"¹^×¢ÕóŒå­Ø™ ˆË „T[ÉqÄ Ö½KÀ(<Ç(TgŽ´b\pÔN7bVç·òò¯Lû[OUž}ž·÷¸Ç=îñâøt½í(⺡…éD¬—ÇØëÜ‘ó‹AÃ^J9†#5.o x†tS]¸Á¬€š]b`N—$0ˆ¡ûŽª4¾ ulƒÅû3…À„ca•›6MiwM÷XËߥîžð5ef^µ¬UÕ¼Y>«QÁåÛßî f6ó…õ„*•²*:KJXýRX•ÚA4†Í.åŒ>hnK¶í Àž¹Ú—–l€Ú–;ÙEJ{ÿÉü‰•E\Ge“RÌÀT|Cq|ÑO•6lFƒdÊ܈`Šî…ÑYƒ:°Øt¼‡°Áåw•±‘‘uäë~ Í´øÄCÀÈr1Pdìz·*Ç-ãÊØ¦<(Ô¹‰$ ˜( •¢'q„yúþ›j™Äé‡ZÇ%YˆíK‹“SlZÈÁ (¢¼ÂÌ¥ÌJ³ÄÞhrmk6<Á.E‘¯r«²/-²TÁéIù,®ÀB³Á-ôŒÙ+ü'\%Ž“ÏÏq¬ì`QúÎåŸqcÖg=½Ø ‰šâT¯%Ñz=ÚX2.‚N¼_ø1âÝËäNTº¾?ã pìTú½èÿÌÉoTÁþ"®4Ëë_oKë&Í–û*j¦Cͯ3ÔóUà µ#‚ù¶®)ÁËë_mþ†Usö$X>íU‹÷OÔ‰ó+¾`®{[VÝ¥/œ[S¢©{Üã÷øùñ9 îÆP’™j¤©ZÄ " ;’žÑ¥¨02w»Ë%4EÇ®†Ú`+ò®ì}”œ€[äÑÿ˜â¿ t=þþ]ÙÍD`Ò iXuDsÑ4Wj Õþák¾ ‡ª¸|Ü îb!hʱèÌ1¹N¹R® õh,Z"€ÎV׿c[Y.O–-ž“W‹¥ÊyËVò¿}XI†:žn«~‰Qš$ §;RS‘Ì.ñ]öw7lHôâÏARX*Rn} Ã#6ïBš¼ü™“¬Ñ>3R3‚9m\dÜ•¨óD9”K‡p§è±ÒÍöL`ÅF1½ G´?Xu@±kFKû´YõwŠhš<ˆ³Bë †”¶×÷Þmb›6ù…v³úB*iß‹å7î;/Uâúoò´[Ý…ô¹–?Þ¶þ‡âïós·Ø Ss¸ÇG‘¼´h]„ƒŒ†{ºBx& áBS]XU#ÂõØÁõ¹`‚-n5çŠ9É­ˆãàU,µ¸}ºtJȃÂW.ýQ¥ìqlb®AÒ€þ>úéE¬®¡YÀñ%^›tà”ý\Ž9æËxL<Þx 4oÉù7¼c‘eÖö]X&–Ö¼É-!m®|É‹%ÏÓö•’ö+ÒA\;Ròú;àèU¹AüÊ) P˜`ŸxÃôþ)…#·æcŒþK§åÉ{Üã÷ø#ãsx„Br»»pþŒE©àXé-~´Ì<™<(8ôT U(ã5O¿‡¢ä•±!_üj2ßžØ íÂÊK³.ÆÏÄôà èçt|ÙË+Éꃊº ®8ÔÒKËìi4sQbL›[\õÇ26ÄÌÏÐåxS„"gÀ;dI©"Í·ÛmW†°–<]›š1Ÿš¢‘ŠìÒÄ’;‘½{æ\¼åfè‘AÖ¡©O™0£C¬DïQK,grvu<¡ÏJrœê©HSV_© ?)Îi~+\PÒ ñeŸèÿÞ·¥pì‘k)MätÑÑ(\aŠ`¦d“^ˆ2h~Șp¨Ü§¢Mÿ ÿ«ø `Æ·¿ó`Gxû« ºj¨ÑÐpPrÚa?öäLOžF=8¨ H’+!½‘ÊñÂÊÚç¾Í©Ú§[¾?Ö}kuOv›„£ Ñ‹îÿZ ·Š_FÍœ²çKèŒkê áL¦.b(ý´<‡G8%*pþ ª~ê6 Þ³(î—ýrÃQÌ‹ã”5ü¤ÜÒAŠ÷üÊ H¯<¿d8kÊG?sˆ·‡W–ƒÙã#Ã9½æ8>Ïç.’Wæó™µÖ…‘@‡‹ÔWLÆRŽßs<µæ“ŸÀ¯ÙË=îq{¬ŒÏʇŸæ†ŠDÙ¯)ÿg}ìï¥åE‚ÀJ DjìÏÉNÖ—¬Pž‹m±pÇ-±ëªû;¨ìæŠrPÕ?"R ÒèUæ y—¤²~æ ‹Kd{¥âCs«„y¬íáYÌ[d~ïƒð„õ0`7ì&¶×}É/d9\crbu“UõÝMˆKž®ãïæøÀàÆ*H™·Ç0*Íàøu×+Lr4(R!ì%ó4 QHÈ þGm‹`¢šQ"œBßf»¿å–8Éâf=:0 ™öËj˜Ùu”Põ6ydÂÙ¡cE£ '4ôÆÌ|DC9U¨§HÈ5ò “1uüEA7—è4B`xÞ­P³}´ÁË~%¡D§dN6ì­0Ö, âõ´qn¡ÙðBOƒ>NyÄ•Yä6³?­SÇBô®‘,>kÅWý¶§+A êA¬<ŠWèB—Òm7køUâaQTp4 ׯD*R¦ƒ `~â%8›ñü¹3dq;¯Ì2ÇK5¶,NÄ׉ªÔ,s&{’–½¯+˜ÃÝk^BBƒ? ü@4vyÕSSSV€ñÏÍ+ïçLé¢3èò ÆÃ8æ%;šcX8ÇBSs^5=À§WŒ% …ÛàˆÌ3\ŽEÁÈ-3l7[º”­fÃW— ôi/œr!÷ ÕGþÜGÛi ÄNMžiKEçJÿ¯Ö1âîw¨’¼æ˜0á”Øc‡AÏ?c¹¼ì°.Á#cŠÚÙ<Ò«©d¶LӮבÓÛ(Ÿk” :ÓkÔ^šå®#³h×Jn-¹ªÙ¸â?,£<ȧ€ô'WP*@ç °€eDàÕÒûÓPNlø;͌äË+Èо‰+_)z³³ò´åÿU®T$~xØBxhëôyŸ]ÐYycS‰g>Ôøƒå™?x|4GDZ^‡‹wÅ”, o:€¤ÓrrŠq@ï! IDAT‡æÒ·ö•,WLBð7züääíŃFŠ÷¬© ðÒÿ™Š{ÜãÿãS#Î<i¨±XÚS>ÉY¤7Ï8‹ÕŸ×øi•ïývV¢Ð– .Þ»>*êצà‰nÊ E‰%t=”`ù¤ž.Z‹mÎdŠéФÏu°'©jÇve±à²ºR«ä×Ï:W_Ïü¡Š2°bq('¸Zðk‘mÞÆ¢åä¹ËÊ×Çã© »Q…X€µÙ/QY®ù] $.$ «½–ómžµ_l®b(§ûE Ž¢áϽˆÑL…/+lˆÞ´¶YeÁr¾ýmH Ñ“ÏØøj7·ƒ‘ Qê'«×€ðî‰jåØ aBó‰@ºÅD™³#Œ'Ì‘‰’°ÖMŸ¤JÈ–]Ý´õïF¥6¨_²¢hóÔyéI —ÀÈB²pdh™®í+côÕ“Ti›ï·˜i`Ê þÔÿ{ì®{„årP‘¹‰>‰»‚NœC … U9S°ôŽxŠ ý‚°Ä\ ¼Ó‹õÁp‹ .’lT šèye’©PU >ÏY¾ͯpjc¸<‡n̤¡›?ÿùÊËñZÿMóЇê‘yhÝÖcíó"®áA )z¬{_ýÕñ3FƒcŸâÙ©zË.¨í]ìßLLÏbן̔àê# I±™pr¢«»Ç8<[=Ö¡Uæ«/˜]®·hÞzñõÔjù¥òžSn+¼ØbžÚmcý÷¸Ç=~l|¬DœTEX•Z©‰W,©t'Øå/‘@/œ{hÂeÍ,„„z4g}+Hc¤xÑÚ¥‚µÛ fŒså~ž“cðáÊ'éá]T^,Í\ÁX~mµ"Ò„â‡Y› ë•Ì"’7F:fž&ÅrM AM)tÎý>q­«ªFÈLû˜­éŒ|)GåwWÄõ68õÿÆãYŒŒ”Jý™…·_»\¤Ç¸k"rÝGb+qrÙb¨ï œQD;èr4ŠÄÀ„ÓÔ]G™Çfû_P¦,žÊƒÅÛ‚–¾>üx ŒÃ´ ãƒßkÅ6¸×¤ïÚ ©𠔬»(®Š–‘]Jøñ•—J@ÒB—ýoŒä61kBqS0•c ¡šJ•Ñf ‘‚œãÙTyÃï"“È¡T‹O¨¦…‹õ-³.An ܲ‘BP`ÅÛm¸í\•’MK!3ƒYÊj¤­È„ìsìY ¨Äê¦+.°’†'g%Jå–\À—à’uy½aÐÿ!ˆ¨Ð¢ŠxU·?ÛY"»è:Më Ùs{Ä å hô©©îLœÏ“¼áGù÷Ö£®™¸–@ã é•â{¾œFÀÅŸKgߊÖKN_[Úg>¥¹t"]øÖ—euÆ$ÝÂÞ­•“AÝ=Œ"‡«6ÆÏ¾ÿÙŽª‹¿pæœ/Ìáxé¦h%Y Œû€":1·ýûòÊ#¾Êiã‘[¯+Q””bpà ÿϸÇ=îñ¦ñ9Ž4LÓ÷²!Åü.„6,;”F4ÈxG$!ºÄ‘°°æÊì m†G9E?õ‚>'¢CĵòœÔ[ “6°åçÀxÔ rÓ˦' 3±Ï¡\WÆþÛ6< aŠžezZÿÎò÷ë-#!ÌC“P|Ž»…Ž~ʶ ¦„Á¥©6‡ÁiÇkçä2ÛËÅÁ…ÜIíñ1øñœ >¾5^-šcy{CÙß<˜aoßÁô'K»ˆ¸LÉs¨2~sec¨BLZ ¿1éO ,8ÌÈÎðI#µEUuñxÈg¯•µ`Ir…Ye…là³+™%ùR‘›‰ùº|IïúS…Úxòlÿÿf~¡â~p/˜²‡À>‡üfÈa¡Åf¦Ì8oÏì—àúá0êŒ'FÎí‡?öMÄýø½‚}¿ $-v“{Ö©eŸAé˲ÉQ%›‡—)K ¨PNt$ˆŸŽÍ<ÇL‹ãÔeèt°sEwd`T+A²¸p.YäÞåQ°ËbtÒP‡‘•kôrÁÒ-_1†feìèJ2„E ’Œ:¸š'º9Çx¡[åRè‚k‚Z¼öc? ÃÔA L¢·Ïy"ŸuÆ–z©p‘]‘«íñ˜œ§¾a,㥠ÊÓ¿IÞÿFq®áÅ5âuŸŸF͈W.5*I?W$ž&‹XlÆ»³Œ”WíÙrvOtZ¼ ¬Â!Âj¾þ‚,úˆóɆÉBùÆ‹ñ÷¸Ç=NŽÏQ°Ö–‡5êÑÐ!ÅÐ-‘„¨rß0k2ç\ð-"Ì’¸—©¢ŸNÁôJ?)ë—:„" 8b™ßfx¶ôçw~êðâ [ñƒWuXþ‰Ò­I¥y×Å0Å5‹÷9@tž‡´"×  ^ž9àR¨´á;,*5Wô«ƒó,ŸÆò,nj¥_%á¬ÿßH+ F`ºw Ö ³ê5}FÇp7ÅJ[)Ã0R‰¥¯#1‡WFõ½£íA±Ó‹1G‚ ‡îÌÚl)¬]‘¢è$‚-îð6fM“"¢Á FltÈ|_ùar<ÛùŒº´‡F.Â… þNˆMEÛjf";Áýoû„†8ù˜«?wä#Š06†µÄM»,¿“4kZž¿·ÿcÓÉÙ™oçDjd×Âå«‚FKø‰€ÑßÝ‹h³Q_o¿ËÀ}³eNÈþÚÖ5ž‰O Æì” 80‚j*èíó,ÇÃ;úÃÛÚqÂ`P=…Lêój9Üü 1a€WË—Oá+ âÚþ ´b±¥Ü€³ÓòÐ:ñS0­Kå’‡v³Nâ=1õ¹`× Q¬n¼lj Ù´IË'‹÷íÜŸX†nÿˆ†iß+#ékøNëEgÉJ¦h}SðTQÛQ[XæCÃÑ$ÍÂZœÈÎÎyös•XxèÓ`„Š–T.vÔs¸S÷¸Ç=Þ7>'Gj_’®¶À¤''aˆ+ßGâï†á´©¼Ò­®žþ,|S2¹‡šÐÚY®v»8³³®lœR8ds$õÈëD}J}¸^/)×z™9ŽÕô¹Šjcê !ˆ’bªû!Õ¥²…Ç0bGB98åû±òöŸs Ç“cµde )˜vro\CzeSoޤޫ¿?;|âYOÐc|‘ˆ“ãñ¬ù÷Zõï”ˤ‚|+Zntý§i©=–Úh¥R…“ ~b;– F´WŠ ë” Kñ-bË1HÎü¼°s2¡OS„}hÕÎö–!`HØš?Bö®â˜áH§>*m“%p{dvxD¢³½³§Ïˆ yZèužCÛHYdÉ{A_fŽÐGgTqÅzX z¢yÆž掫 ƒŒ:;;;Á-ÇK‘‡þ€gNB¨¿k“‰îœ—§·sáØ(Í$.K1él"¥ MøŸ´“l?¡2£é§éHi)0¶èl™Å ˆ;P½8gøï)zèéeŠöÞ\‰áEÊú¯ÑXË4éÂ÷Á;o,ŸâúË[£ÞZZËsbùH!cº„OÏê5ý-¦uÜäA†m¢4®Zîš#ñ؆ob‰?5p¤¤.fÿC)ç^ ¹fÛXˆòú‰ê¾ Ëfý[ö GPÄÍëwç…Vµ@‰©àZù=îq{|ÏÒ­\&Øu[U)]|Ý…íX Flt©CÐ@Tp¥íGˆåÈ ©q©Ü„‡‰Ãô‘¯ý‡XòÝŸqÉ‹˜MÆÈ4ôSu·ñ\ù=°¥LÁ2Jw²šGê/Öu…«ñ[ÿ¶j´Ä>¾B9”íóˆ‡V²’²ó9ò’Á3ȇl– lB×Åw9-MªããKs‚c<{w>L­ú‡G{»b7ùšÐ±a¦nx‡¢o¶%ö[çóùwÐ??eÄŽÿû;³&¼^+:ØN£)ÉV…± Õèßîôú¦Yfžà…p7^ aЩ’êX˜R›F Ô\ÛýžRœü_; pßf— pÏoÕÒ¬¤S(OßS^µ(m|Yãùj¬sÞPøŽ¡ÂfRÇ…=rQiÃ(…ðшÜ<œ¬2  Û¦Ý=Ëj:&Éþ©‚eS»à}¯›Ùº’®)Dƒ›+pއmh˜’Ž$Î<¦UuÉd瀖xÌöYå :­}N§Ù‹/—-¡E%¦5ŒÎ2ÛòÀÈç‚‚×¼A®áØ èd0.ØÉ·ÉjÜ\éÒÎæîÚA<ñ€e‹^Žó¨  ‰àùÞ}tôm1º*±”ô§ßos¶/xŽeî/²½c9dÒ!:‘Õ¦T KFt‘4 ÖÍ 7þÑW\‘Ʊç_`V.®‚Åðïe_îq{Ü£Ÿù £½´× 0ò/-W/Z¶ .Ľ£Ù¡.æÀÁ°ÌµÎEKEM–÷‡ƒº09ð]Y(Jͺ­ž•<à}]¨åc SÆ@_ï ô–º¶{·ƒ" D_&Ï•X‘uÈâß…ÅÎ=†Äv]J¥Y0›ÃQщV6£åhQ+ÁaØTia}XÉè'¨GÆPs“{Ý:~¸Q{Yc…ÉF#´Z#Œ(ž¼av¶S'Ôï01ݳpàöbö¬=Ƀû‹ÐòÿøTŠ(ª³]`£jûœ7G‡v¬)–¸ cB Õ‘hÙÛrGŸ}E_y„Kaì|;B·9Ì3âöŒð´êüØ®ÒØð§Ÿ(×¥SAØÛlf®ïÍG(vÉD‘ê1;-zCã3´j±IÇü¨Š(™Äή^”,ä”õ•ëtS.ÊùE\4W ¦P¦7˜Ð .nèû˜ì€#!Ô±Pð Z*¹8R×ÎÚÔ5µÌ½x<нɆ?° ZZ,àåJËYó I‹Ù!üñL€ ÝÕ†ì.¡Tùy4ƒXB‘°¼Ç #7ž®ã>͉ºòwá”8ô"Ë›è¤9^eÄýŸY¶­@:%å¡¢ƒ¿ðÖg—>«¤ü•TÅ!©å¹RŸøfœíeAÀªÎ9ÙuW>IÎÖOßý ío5`¼ ìÜ9-_rõ'nÄÿ÷¸ÇߟßdǾ4¾*•1öô„q¸lŽSyÇ|n§Š–±º¸m¶ÂüâÐÁgZí° -€pÜoÙIáJèÙ¶Î ¼KcžT % á.ÅJ9º6SÞ»ódCæh’Ÿ;UóˆÚ“Ë^WdÉIüFÿ?üâV¼×ãƒ,òaÃ$ìM9*e¾*°[p>w ¡o£wªnÚÖ +l0óŒM7j¶t•ë’}Ô[|e PwR5*ô?Í9Ñ e›ß‘ÇÔÑ2$8ÈØuäxÏ›.œTô[= °ÅÈÀ3ÒßúÜÕXQa…:͘^Ÿ)Óœ-3a¾è±U“k„3ˆìCÓó AŸƒž=©øNÉämhûÿú Ùs]Ô@<ï7iôr3ˆÍ#œÃ+‘¨­ÞÉֶꊧĂXéŒÎ"ÓÝ‚Yh‰úצOÁÎ!Áø[¨œÅ™G>ð.•s;jwJÍwô¥æow†çës4~ƒno„A'|ОyŸÕÕ¼BÊQ¥Ú·g'¼­,9G¹v¥ÈS¸1c¼ÁÛ{fþÿpYp¡ ûWr­ C,âPé÷ksØèý°o§ÀáSX¸ö^'¼q·Nè"ùv“G» nŽŸ{ÜãÿÖø¾ž1ß:Tíð÷»a¯‹«©ÅÓ‰ñüC8®g“:aa=Usç¿ÞÕPŸZˆ<¢9S’@¾pQ͹˜2ÕIQŽg»ªP\ë,ÈQ¿¶÷'A¯ds:²ÜQ ¶I¥s¤ÂaMþP#S\q.}-历¨4’£‘2˜¿ ¹ï-C…,?¡Û}`ô `úBÿá­è‹ßÿ»ü ŒN{ÀÁvÍ”Âü ê¼È,œ†Ñ­Õ…ÉI•Ô}yj7ÉúV£"œuû_Áôë¤nŒl*úLàÁce$[öí#ât4eò®»%Å[wºy¤ãÐñmÕ©mæÂ=ElŒ‰…ßs¸Eäçlú(ðÇT0¤íÿx ׉2¼Ídˆ3€Ñ s]Ɔ˜ÿmÖJ5T3>ÛV*ÃÈ“"ñÝBÄv»; ÊzW×tO’ÐÄc91V;í7ÂtHœ‹e‹˜êóL?Ñ?៎ãóa­Á»î6ÈmŸ%ýEDë¢Â%Oÿ1Hôm°åÏà¡«Ù#¸»»<'eWfhi ‹…ÎîÖÆŒß[•¨´]Úxë®>=xa/òåoø'Æ,„?Ͼò8Xê?h¿ì6´gû7«GàY+æv–MKvêµÛøÚlͪÊñ3ëlªM|“=c½›ìþïq{ü›ãÓ†ÜAµÒÖíbåÔ¦n”ƒø"úŒÄÑÏâ:+½®¥÷á1¦ µ¾É+ç ‡ýóé%Šºlí4/'z7åÉ¿D_*x´e™+ÄWQƒG\z­S.Þ¹UbŠê•|áÿºÏÚÍ¿!ŒÊÕÙâ§×#õœ/§…õA‡ZB¡½vÚî;t„Í'a•WyŸ˜üã€*戦~)£øxÎÚ…*ý¶³ÆCxÌ›Êqœ$S“ : ëéF ’›á¥1ø^ìuêðhŸ&É›†(¤‚,Éëýµ)­Î»«×<_,2Ð1Õo5ïˆe¤A¸Œ–ê*4dÏÚ)µÔ‘¸ÃIH€Dõ«d»‘¨®ÕN© %â>c­$Ìöxެ2¸2ý^(½ý ÎÈø˜3'˜8ŒˆÏV² ÓTqyÆíùEzó•ø¿ñM†3<0ç6·Ù·H½|É„Qz+»V6|ÀçÊ$fH ÆÎ¿êsÏç×#©mbò»ó#Iº0WméöÂP‡eGÙ¹J2Ö 6Õ:Z*ø@t©øÇK¼EMfu8ÆãWq[ z(ßcñÂ}ÎÒÇJ4‚Ôö’¡ð˜#-Þ]…[˜kûÁ$oš¦7ô—2øóÔŒ^ù6tk!õY…ä¼s}*>(@.a·©ö6|Hоc_ýíÆ|†gíAË,ÛÌ“®ÿÝ»ð&žõu˜ž …^1+Ÿ&=ަnjáäO“ɦÅ %y4yœ¥À$᱂›ÐÿùOÜŠ¡öˆCüݪpah~g¼ªn”švëGÇ" £lû;f Y8}ªsmùóDî¾CmÓŒöÒ¹r·œºÞvq»7p©s·+þÛÈ"Þðu|9•Ø\4¬]ZI°5,#ºÓ§ähã„wÍò,ecç¿Jžu úÞã÷øoŒO۹à Ö¿Þ@W½‹DÔŽ Ï멾É.Íq€›Ï@]6‚’4µ)À–Xø.<díáâmhÁ‚JFØÓÍwÔk÷ÞzP¡K‰á8‘M Ï*ªÔ4\܉ª¿>ð°Ò‡–à¥Âëèæ<ɉЏÉÞ¢;¾F`“ØõQfV“ Rû.ÊÌïCð™ [›ÖÀ®ð ™Cµ ÝzQäM""‚ç÷—9“æ_ª/¤žŒyÖÏÌ#X°+k·›]ÏÐX6Ëq‘i‘ügûéæ\­Qæß1 š/s|“k%‚Ý@Oº™ ¢Ÿ.­.KžòWjqÝà™¡áJX[ß( Ø´¦€‰YÅß…ŒÔŠÎÎXZÝ>½– #€¹L!V¾ß'jô]Š#+•‘¡LæVN28wÓ‰¦ÒþÈbzh\ãwZéO½\á Ÿ9 yðȲpy_¿{z7$zî˹ö­Rhú Þ3ÄéÀê‹T]G‹¯Oõâ“oüAà­+df®VøýÿÚrJ¿ô*}3^k:‰4;œD"µÿó`\™åÉ/ü-àï˜å³þÀËÀëCÚŠ©_ƒÏÕê}Ы]P³ ÆùdC¤d÷/6Y†¦ÛìØpRßæþUÒέ²´Ñþ|»_ûó÷îvFòUŽ»Úÿ÷¸Çv|Þ†chÆ`Ïa EX &*gõ¨A¤æ®‚ªé[½;MÔ"¶ÔeÅ ÛíËA\•LœÌ9š<¿9÷ý¤ªsfΡ5§±tf "®a‰JbyïšÛ×`jB€ îÌè?\Êhv œ.ÔB+ïD8ª¦ôOœÿ–.wÎ¥ÃÀ—ôÃWšøŸøàøx:϶ï„/ÛOZm6‹ŒÅK‹‚r-ߤLš±ù«tR'Ë\SœL­?›8ÃÞjˆÚánF«¥!²&~®Òà˜Pz,r²Es27/e"V¢á,‚’Bß•þ™Û÷:®” nÓøÜ €1±.C°®¶†[Çæ2}­H\‹qÒ¨Á‚Kð-0Cþ¿Œl¥'Åëß®¾šÊß—êBY§ùÅšÊyþ[¢ÿœ&Gmz†þÏ¿f‘Æú 9gÙ‘FƒGXV¤#ŽxøõåÄËŸG}™AÝÔÓÓìe1ÕÔžv½ñµc'ø6Â’=Œª=†prøPE´/‡ê±ä<›WïÍ‹÷Ôx‹ ÑeÏ–t¾QwIÞã÷¸Ç¿5>‡)à%Ï8glþ¦H\\½6úE‚]ÆR±Ø™Z.ÕëX¦r&ÊøuÁEPØ£q…Í‹’¢6¬a–,rº8£\—ß"*ýW ³›gò~¤wg‚x:êXºÚŠJ)š•~‹çùáðšÌ^IlÓÛ×Êa!͇Î&xI€ÓÁàÿ‡ï¬94?ÍB? ‚5PÓ•NÆ¥J.ï²ùƒîXi‰ÝéÃ:»!sзý{éøÒ3íP/pîv‚ÒNÐ&qƒÊ.Ì0D1iEÈÄ–’,ü®Šy3¿É'cîžMˆŒM`|§²ÙˆEþŒ®ªñßüM¤Ä`˳N¡4R>ålÒ”µºçœµPûÞâæÿ«¶óÙ5Ö鯰½ò¾:·øýÿ†b…¯Sår×W}Ï/¨*ÙÈK½ñØo´âRpé›åŸ<¬I@Ù5âˆàHº"X÷¯¯xX¡è€ù´$‚ˆ’7õ­1Wœ:‚p ÁÇÖ5œª Ä’½Ò•"ÝÇkÁP´ÅÎÍ/ã@>×d›.Ä…²¡ò蜧ÃáÔÛ|€„µ›}lƯAcw½hI‡šCDȆŽpæ×f¶¡Yä‚\9–}Ž7­õA3Y]Ú8ï£Mí×ÎA1ž­V2|â*[¡›7F‡–8o/í~¼å|ÆC\û°©­™~Ó3¸Ç=îñGÆgðT,ŒÂ„äø0Ó™sƒœ„CHÿ( ¶%ó<{0\½~r¯À®hkû×ø½K/‚Îþüõ†欚³&rެÐl%HkÛÿ+ó7S¯Xß ÿµ.¹ñ–‡¢|˜ˆ Æ÷‹@³ãÍ IDAT¸+2&$VG1õ Ô çT(êkTõÓÀ<ÌGEØÊvF’4—z­(^D´OYÅ] Úôï}ýaêÅcªøŒŽàs[8ŸµOC¬¼èM]ΣEòØìh ¨÷;±Ó ÅÄÄøÏJ‡`x=ótþ ¥³Ò‹Ñç¬(½N&Ÿìm¦!©âù ¹¢ÈwÔ\–R"µ‰{Ù¡ óÞ:3¦×vÎEÑ>á¬3wK Z[¬„»²¶–¬.ßxbWÌ ‡âr®µ~çôGAÇDŸò\RÑDä¬è/Ö麊¾I–ð‡L± …Púwxj hݘutn¡˜ú¯(KuOVî4—]õ¹Ãè? X-×O´Ž¢P}ñ ë÷·€°,x‚‹êÅÇ[ÕÿÄìÍöv7µxïô^V‡^àÂúûYO‘ݘHiEU²öý5*"uAKRåÓÓû[§÷ezpîPÅèµ”âçzGô=îq{ü•ñ9VXçd P8þ‡ø…ðÕ(¹išò@u…Li$Öô²Û½~ÖgWÀ’æIyïô7£9œ{–<ÞËF_ëçq„ˆÉdÌË4+ä×ÞÊÚ@ËTâò¡"#X×2úy J¡]QKÛMAVµü^´,: LMUFa‡Q>ôže…­)R‹˜¢þbòVS“m‹Ùþ%ì‘Jà1ÇsC»”ø*ǼœJWzZù/Dorò #b¦aG„³H§‚.‰QÖ-õe¨‰8>Å*U åºb¡'J¸{ûóÇóÿøx¦bvÉe p<,Y¿eªÎ{×U}¢Ü}$ûŠäÓš~šúë¬v ¨-Ï6T y²»¸RY0¹5ÖÐØÃ5gqÝiY+R¼±¬;r=,m_Úx–ÿ«zé0äT«õ¤Ä©è}r2&rºÖmJÆ9&žDkÿ*õ«ºéBS$Ñä³d˜t>JºÅ)ãžú‡ ð.ž¢q2õØÝvÃ2y$ÀÖ <Ö`5ƒÇ‹ñCâÒU¸ÿkH.ýOSúõæÖÆËˆZ至i'ßÀÈT¿µM‰56|¥ ì!üõ_D¼ðË_É?PßøÝ2@§iQfêqТÞ0–ê¼Yœ½¦Ïu…é,S"h¢ßÚu&£“Ú®Q±™u‘€ËŽÔ—­âõÿ=]÷¸Ç=þÃã3ð¡oPÝ ³yGm1ášñ˜¬» §òWYèG–Z1à œíUâ“äD ñ ¡Ò–¬Âƒ†’›³¨ÒÙ?’4tª:GþÆ?•ZÙ%„ø˜ <Ë¿z)Ò5OÀp=ÍcËœ}³ôŒ¬šüF§Kµ¸Õ‚ÑK—$6-Êâó]÷˜Ø¯ÈL½Cp—¾k%öE0€Ê!WX6ìNÅHªÅ,ÒîbõVPÇ5r©\luƒˆßQ®ë½?QÀn™‹®½Ì„ ˜ Sa,Õ.,¡t˰é*®¸L_Þ•ð¿¦oÑ<7¦Ú³ý¼_‚Œ…†¯—'WÎÎ Þ6¹.Zúµé@!Šs´q„gæŠ?³Þêú¶—øº©0Å;%ÐÐ\ EEÿDJå/òX.仃¤À7êÿòt{ÜããÓA{©Zp´5‹•ônäóic}4ž3Ep¾­Ësqñ©¹w`‰¶oå"Qð~Èo4Œöiž¹èB-«ÞÀF2HI8”Q[ çêœæ =´–®ºA8Z›ÓQ¨ÝÝ1ŠLzú:¬Tµ§®4·ƒû‹¤íÉ>¿9‘‰¿ÞªXúux²B\ ¨¡ uÏvÓwµÔº|Þón®¡ Šý•áEÂ…)©‚Ã¥?§ÁOÜ_tÍ=4*m6Èî/F,pÍÒ„6…¾Ì=T—‹·BT…Ù…:Œjü0©)z¾21Ñðö£Ã[8ŠˆbÃÃ÷ %n’QSÊGž'Ɇ+a±iØQ€È§·=ðÝ~ ;{½Ú†‰F<½Ìà4”±ø+’ºPÎep§„bˆçdØò‡„ßåIâæÐì®]mˆ†'užY‡˜nô—&»4z…^}ÊÖz‰!§ˆš!]_m(¿JÞ\ÍM;bW–½j´Hßh ¸!¬ÒúcR‰.“Ó{ T žS%—!¼ÅV˜0Oh0¸÷Ôhó ô_¬3–ŠÖ“É&>ÙÁ‹b¯Æ=?î¼OKôJu9è| £€? èz‡»º¬ ä,šN™䌣ï×(Íp¾\¨ò›²ùQÆA¼`÷Qq‚á+ýƒ*Ïmüòyö?1Ç=þêøŒ·)D³t…ž)ëËnæç˜AÌêÛÕÇÿXŠ•|Ô}îôâ £)ÎYi9_¹ák½×[ÒiiŽëú»ž1@רæ´4pYF\,ØZr1õ466ó˜Ã‰µ²ÿò¦ÔSxÛ†‰PV !¤‘¿*ÂM\Tô OöÊÚâ »nE=î5¼ðÑLˆ$”l©d½Ÿ†!õ‚„O¹rï Ô¹’°%Ñ΂Àð0ÍÊcÃ[F‡Ð#€ÚK)е5Øf M^OãFbˆXdEqît&X` ôˆYë­‘Ð{œÈìâa‹÷gw„,Õ‡OÀ04Ž˜ìÎWÿÇöòÿae µý´ªÀ´H¼óIßz5ñFd”‘”°{§¢ŸTp?Múa`ÁMͯêç÷=V¨UmËíiZ#­6 »sêIêÌ@“¸5&ľ!ÉÛPÕ!+MÙ5]á“ ’TåÑ‹çø|Öÿ„âf×™uÐ/Rå°õ2û¬Jný_q—s®(BsåRdzACSæÏ¡ˆ(1 fðîÀOÀxïÿ¶£¤òWÔ·BôAÖÈ—ßï\´{„Yì®5Ä‹cý¯ <^ë# ËÆéõ&Bï=·>¥Ç©©ô“Ç«mã´æ,nUà%3GÑ—yÝ÷¸Ç=þ­ñY^9H—eÝ2‰åíÐô;[JøX±ºo²@&¦¾UÖUE@A’m(rçi\±XÇíÀǶÚݲ…8¡¿iu cœo+[«€ ™ß£µ3ËŒYÀtu@L»ÅFÉ1¯¶'Šî¿NÃþ•©㛣ʖ.ò¨aÀ±VY¿A¨@À\«BÛ5Ì(³Ñ.óošº~o¢†Ô;MsaZ{ãc<0sO ©FxpÇba±Ô˜ãî±{âãÁˆE"°ÛS$uòüt(ð4uz ¦Œ÷k¬§Ù›9 »-¼T‰’ò›aBõœ-Ÿ7Œp0`ºCQáfæc|w®<ìÔA󳃺ŠSu†SÇu›7±“a¸ °§ècÑê°„¬ùe e…Jj8ÙhöÞ(Ô¿©zÒýf´‰–m›‘ÉrÆ®8½Í¶Öþ 2òpÍ(v~¦…‘-\»röÊŠ„Œ±™3 òiu³Ý‘ ÉwÅøµV§Š» ï—Í5:ÀŸ$#’ï·°\t«É ´Êã(lF3]óM±qé´ã˜<3Š?[M²6ŠÊGôCªXOÑÚ¸•2°ðº¹².\ÎÊwËy<¡Ît| »é¬-–Åi4´I¦uH“¥¡²?ß8Ûv'€üwcZÓ…÷•ü_þüoË“üKÀ"_þÀ ¿©-8¿¶ $Da¾iø˜„û9RØžZÑG/¯¶éûüP¦ð4ÃQèæËyCþ÷¸Ç=þåñYùÁd ¡%³‡OÌ¥Æd—ëê¥`UT ¦‚sÖ…ó@Ù±‹ö _qGµŠ]°XŒ¯¶r¬ÍE™›‡g⦊ä‘i}®è)v¸˜¡êE¬hkc˚܀ÒBQú¢£ˆPè:(¼R‡FQDŠN’Ôö¶“ÝVÝ>ŠúwúýpC­Ša‹ëáž VÎjzâ±N!@¹ NäcÔ` #žÂ œ¡,R¡WÓ ¼ÒDüæíG%ƒD”=§”Y‡æÉ¢´o]øÃãþ(Ò&‚©¶kòDc!bL[Õ«tQ,æ^ILGí ŠÓ†3=ü|ýË£@ÿ÷$«‰h;¸ƒhð"Æ95Â5P@¼pÔXCHsÊ?¤¬x²¬« ý;ΘÑÿ/;§ÁìäK_%·X¼lu¡¿ÖåA—O²{¾È½Ù&N«€Â ‚U¶jÀVÅw¤º„Šq…q‘e®ß΢…çdÛžœ®wáLC_µ1õ ѡؚ3KÞSÚŒçFÅY„™Ðî™2ŽþyÀEœ~xÅ$Vk„Qz × tËn!ÀS™õ?ÿ-=ïBëa>Ç¥ö«ðÐÌóïs{ʱoxÖöxÅ»ñç¦ã'¨}ðžáS' òz¾¢lÎúf îݺ8ü€º¤RªÓ¡€8Xÿ$Nç›Ï ü„Õ®v¡áÌ7ßÉ‚{Üãm|–˜f†Zç­;²=ù}P%íÄr‹×Â'*ï*!F躘K”ćâ­_™§{Lõ”ÂwÃÃm+O„/R4/^ØÃï{8e<è¾+Ëi܈,FúÌÖ9Ñ\ð ‘»Àrp!g0í=Zü‹{´üHcê“ Ö4¾ ]µu:Ù×_l(Uƒ•§–Û&zhrH MM÷Â~vIG¨"ÜãNe¾ùýÀ çcPðjç45;AlŽQï>Bkµ)mJÃT7gÙð8 0!÷×ߘÐa {:ŸXÿÇ0Ä>䓉È@ÏT!ÐPìLœ"<ûPbõê4ªæÈ: Ô'–å ;#åM«9ÒQC™Vôøñü¿c<|š^é„Á¡^ÐwR‡ï<È»5‹X¦²Tþ¼¢Ô(ñ ÓX0§x¡@`Z¯`íjˉb7Ú€ÉF˯—[¤½Í;\îSPUŸ3“VúN<ú"‹TÜSÍzE òÀBÐßïëÞ ÑÓõ³˜á@1ÄÚ:†¬¦z‹cˆØ  ò8†\‰T¢ 8ãÊ ¾@[¾¿#ž÷yÞ ¥»Y~þy¹ýïy¶÷Áy‡œiºÿ*ø(Šíú(ŒÇ ä¨ÉAʯP~×Òb§ò ™µ̯YÑÔÂQ !CP¼h÷ýê!w{Üã¯Ï\Õ•c~ÖäéMÀ’ó®ÙZP6Æ:(ͳ«ÃÂfØÈ™KÔŸ˜3ë,E*;ù Ê p²ÛEÎ÷o±? êâÀ”·¿ÐàneoE‡b †{~GA÷' ÃÁ1˜­u.WWU½V¸x©›!=ùö¸¡x“Íü×–•(¶â¹REæ8hð؉#>$+‘ù®¨Mr£ÛŠ#ÉP•¥À+^î Æ[–%%&¥vh%qÁiÖ ûZr4|hEþ#&öøZDï»"¾R/•3Oµ³¡¤"_Œö˜Jeÿy’AÑtôÅà„4Y|¦©>,šn+¾:I!ÉÀk2v?8¹àÏ>£á'ÂvÔ"‘œ ®8*¢?µv”Ð3öoÚøô¶|¬f›Ÿ;ÑÖéo@#‚2v=K7ûWO©çá2Cöì9*®à켚Ûÿ`¶íP⛉ï`õ½é¾‡E/TÇ3ËzqïŽQÜ}¹9¨éÙÝtèÒ™ ì3Äúí3ô­]>-g?PÑs :y#XÀ¢ÙªÅŠkUÏï„+ÈÙÕðÛ¸R%j‰Z÷ñóU“ôêƒñ2ë:‰³^ÓþÙçü‡Æ?­Çú†ÕžÔe¿¬1pÌ„´uÒDX¼ÜŒQ„ SûiK~”—«I0ÆSS·ó•›/ê¸Ç=îñǧ=Ñ›–íNlÖß Àj”™ß“éÃ$Èp]Øl8 89ôÈêçK5lT§›iŒ’0rSÛ˜ís4Z õ2]L¯ËýÔ ýÇв(«KüópÔ ‰KP·×¿äÇÞ0¥85gÿÄ\M¤JŽ×ûoaxvbCOv#î…C {t,©—w×0Ô;ŽSÄV¯‹7~›Cuµj½&FŒ·+7à¸Ç=îñÇgƒkÐê®4©µî¼+Ì´•¤Õ°>Õ©a2*53Kî,:Ö‰®r­X\u´¯€ô^^.õ#ÏFC´O‚¹#Ŷ=ÁMT §¸Ü™È†J!sqñØgYh&#\à`¿ˆÄÓXž¢èûbú¢NZSr”;” ©l;€˜AoÂÒc¾|ê[aT´”;4Ù/Òã0´$ì6Æ„jøú_|¦I;&Gl´”é™FK™)W\¦2Øü U{Ê€?ñà³b›¯Ei ÑÓWæ¦0³’‰F¸Vy²á3:’HD~C€³@ í¥³‡§µFTD55ŠH0"ÛaáQúêxk¨­ÖéwãÅ㙃áäY±Gº.7{Ê0Ð |ÿ4÷–©o8Ëq·íLï§;<‘®ú."L€æ€YS^»)cÚ#zHªàâHy´Ð ˜K Ùe`î’U­ØxB㑸Ëj–cHŸô.,¾«Mi݃%Ša´ùÃxsôíÉ;¶çŸx¢ÁÀ³lü¸kò. FÐÎÿßëÉ<âúwà·3cñë–ÒË-êXþ¥/Þ¿_«/XKŸh•RoÍãJ!pMå+³¸âí+”í¹lïß™€{Üãg|†F*´qûX>gËð­µú{Xþmy×ÔÑ…£gÏRµÆýé3Z ‡JˆJoö)Zøx†ðHù˜8¤±D r„V_$Z8»‘zޝÀj]ðœ6¥#VÓÀH¤ 2Òˆ8¾üAè†q|¤YÔïXDcBÏ‘M–”ˆaNhØÒ·©£Ù–üu¢€,­ï–eIè¼Hª˜‚ÖýX{Ï>í·!›dü0•憡¾ÜSc5 ˜€.P-'‡Þž<„ik-Ùì>ð´n²ð´@sLÒŒÛ× =ÿU¯ƒÂ¥ wEø.ÆÿcÏnf¥³É. ²|÷œÆÌÞ$>l½^È¡Â\7ôÐ*fAõØÍÆîDÐC–MªîÁÈW‹]Ê>–՛篎tq÷1…èRœ€]¨Þ€–ÒÊøYø ®gë8Rb£ ˜†Ç]šã'§Óo¤ž)êÙ«G¢ý¯ë|m¡Ô³}#z1cÖªI/‚×Ôô,È…MÑjÁàÏZiµD¸èy~¸Âq{{OÊèM€‡Ê»õa˜"!å)¯¦Û,žG+=ySûáÒq!mã´y#PbÂ0= V4ï598»¿ûãq¡÷.\î—鮿r!žÕv¹Ç=îq¿0>›è› 'ÔM¹Î‹OA( é68‘ç}Þ†AXž¹BR•êGŒöã‹G¶VG ç0)0ˆÐß«ö2z’“ꎜâ™ržÙV¼.Þ„2ÁÂwë#aÍÛ¢ˆ¨uWæ^I9‰ œâåL¡Úé4h/¸ZÌáÐaÄÆVÖaŠôE(AB#d_È¢›Ä& äZl… ž°BË:Bóœù—œ†dÖT€!uQš‡=»æ¯ MÑ%Z†DÊ?žG\DîŽ6cò»#Ó O_cóLŒýU6h—u±Ž™Çãeß/7C¥k_à“ êãÀ«°›}°ÿÄ—@¥0Ñc€—¬lu8Jò7Äía *j_Íúf—aKY1âJr¥ú*ºô$3®’=æÀ!ÁíÛŠŽ«Ž<Ÿüa^'0ƒÀ€/B2K4s#Ó£ œú52Ó¿â¡€ÜK%W‰E3·sŠëBpåƒ4¥±!øÜuàÛ¾QÑÇw9ù½®_Ÿù¦(¾TÐedú“ŽO&gþl+LàçO&êÖU{FrvÅä«*hçÂÿ7Ë<Ô´Ì$ÈFTÇoŸªù+ÂI_YíŠóü‚bLÄT£ðôðÁöÀY»C+ŠßwRxš†€oþýÊsŦ/þ±˜§=üÊÒ øg:F³´ßŽä5† ·¥Ä2+|3_ešOýƒ±°×ºÑ[@Ö›#QoúÛßyùFoõš´ò¼¶•I  ÞŒÓx §ÈÚMh(R~ºâdÚŠ!ûo<ÁýÃ~Ò©Ü?ãÐÿᔫÏ_ÿÊ¥=Òù«€í‘n®Å[Ý:é)˜ìÑŠØvÂy4d¢¯éGÓ‰ õ‰Ôv:÷N0(8v µH›†žëÔÕ À¡;cà`HO¿¥ °Ÿ„6aÏ®íôÖÈrJÁÔ1ÈèZ”GŒBs›û7Bâjv/Ç^=º$Pü•¢á‰ªà '¿Q¾KåÄPü-gô5-ù@‰Œ¨2… ˜|Àªö”g(îæ™¨Ï˜¾®Ê¼.ª:' úàC“Pµv—m°üQ]æ-†ÌvW:_e+oZãס¸¿6þ9hð•lŽˆÌ¯ÌÏ ‘Ž õé>…*Là+§ÄìÞD)#œê¼ÈD˜¦µëWøH3k?ŽYŽXÐìÂß¿Ç=îñŽÏx"éçaxì^ŠöRc‹A{°tçLlüU¿öqä`•-h]”;ó%tZf¨n> ŒOv6 _Ÿ¦—3,צåTľrÉ1©£cyÐy«bZ*X„L ”È- †MªRÄB£„àЄ˜YýÉ3VËÙ†¢–§p–o ê œ ¸âîT2w »7A†‰™LªÈ%w„"nîB¸;ßHy=eðö0_DÕÃÓaÙí“Ûº§þ+wû¿áW*.ç­bT/ñÜdðÕÒLå+ä#­·Ð†ÜƒEKaž…éiR=‚Ù,=Æ]CÑÒ·ŠïÆq¿ ù¨ö·à»ØfÜ#bI8¤Ðt™¬”¯Jó€ïÆÀ¹‰»érZbÖª‡IE쯺0ù{H\Ü"„«v·Éæýì¡o®R> žX–CÆvk}«µê/µú6Dõ›&¤K\Ñ'äì¦ c/B¬ÔS®Û8(tLü©‹œ.ZM‘ÆÐ†®T¤{ÆgaGX·)t†÷BÝâÓ5FŒqX÷ØD IDATô¼€„°^·Jõ0Xõ]+ÊËP‰ºQcOû!à4'½ *„ªi¯:EF•B®ùW¹ÅÿžÄñçFhÅSûRùüÛ ô)>ð—íä’DÎB'7Ö~ òx-|~_ósÿtS&™QÛ…@è“XéEjÝâàQ‹æ˜:,ú­cïžš÷¸Ç=î±>>åAÆgmò° $øÑÞ®³œ9´äZ×Ç^í® ˆË; ææ¶^³:Ö„û»¸¸­ÌtÀ 0¢þ‚IϸäAÊmך ¨·…™#µ•g6S•‰›Îz¬i®†9ª6O1¹ õÝ0¹ø}M†/»ua„0"F´´|T–zÎäN{¿† Y…Þ5Cuˆ ƒ÷µ«® ÿh(˜ªcE¤w Î7„mÍ"*K⺹AĽ ùÀG.Æ `S½å÷&-ß™–¬,h²š|-ÅŽönê"1"ËÿâA½ªycÒ$ßš §ºüy–7§ðŒþ³cÖ²Â*L§®ÉÞíÙ Ïf½…í?¹»ÒwÄ;t¦~¯‚µ@d¹à/µP"â1¢“4öø…©Ÿ:&§%ãó³ahXkÏÇÌ9wþrßbߦ’ò¬T¥Ö®oÃæWÌ)Ç Ÿ¬ÈnœÐk$&ÝWqèç+Xv»ƒµcB½ƒˆ"®chA‚À*3Æ®‘&Ö¦îŽ ‡¿Á­îö{N"e ¡crY mr%€®Y'°–í/î+IsÀÖ‰öB( ‡ä.g¸ÉÖïÔ…•Î0¥îHžÌó,úøâ|ƒÉ…Øm8œ…m•qÐ ®MuZýÇzü/Ya¾õ!™ÒE¬T=Ö ¼áWs¿INўľL¤f»þy8ßzǼ¤ÔhûHîèUB…ox¢ù‰Q½KX5•õ ÔÍ•*€¤æÈÿÜwƒýñV¶ÿ€ãSÝ–¿ý¢øgá/þ09GÊ3sZÀn›’‹ŸF÷Ù2…ÒtåiÿZðe”ÑÅŒýɹ¼²€Öag“zÁ[æ` Òº&Y‡ã”÷¸Ç=îñ¦ñÙÚ¾ð,n¸†‚ ûµ¡çÝ~ôÃýf“¤t˜À)àÈ–—†¯Jb1Ó¿Š%Õ±1|Ð`büˆX™¡YgÈZb‡ÈH¨97‚Ô°H ÈN@•Gb+¬´ô!x€YØÜÙ@¤zw¯ÈÞªV„«·Õ‘ìå2˜¢þÓ îþ‡)ŠFæÂR¶ÑÛ£Pd=þœyÞmÁ>â²Mt|Ù8‚ÄÌMRž˜f‘|«.„RÕ¨ÍðmOˆÂÑïeãw^200ªw +Šà/”]‡ÏBòÀönöiÀ Ó×Mä@®CkK€í!ORÔ•ÎöÐ4ÞmÕ‰I¨ÔŽ{#8{,àÇEB¼,¦â'ü‹ÄæC±‚l0ºÛÜéÙÈš˜Œ0ðGq!h‹³gaq¸dŸq¸Œ-íáX²†çê"y Ý$än‡Æ*X(\¢kËyo½5‚Á¼à /µ%{X¡¯Î>n“íU4£î¾MТÿP?-N8Ô]ywÙ³EQƒ¢zÙ˜:‡ØcU=аæà05 Øã÷Z n΅ؾùKG¿pk?;²àÚǯ1ŸPÚ}`Ũ¦`׿ Páì2áÕoúÑ î{„U&ÂùAªE“<ø3}I?g-©M_Àÿ3j~$¯‡y;l­Ï£oé;wV­ë¾°">ûÓøµ÷¸Ç=þÝñY¡N̨’2õ¥zF…Æ; º"V"¥â+'k-Ê™[®…Û6ârÔaïL‚ yå"áÚå¿ã\ˆb›ÃÖ€7×ísæYxM¥*ÇäË_¹s­bè¢pÙ³«&ö ƒ~`+0Pà ÞŽ(º›ÜXCcÍ!ùD´Çc§³Í¼~ºí»ä—2GPIm=ÈRó.mÆTÕ‰@Ô“Á J›±@ÿ‘ÿ~øÚá oŒH@¿Wc§¡§¢{¦QPÏz¹4Þç¢Ë½eØÓý#á\Pþ7'±y©PVÿž¥ÓïÀ½‚^ƒ©uCæfŽò±Áz¼€ÄЭ¤  þò@û#~µÒZ÷´3Ha)Ûó (>º ìÛøÄTPnë„5œøZùzê`k‘‚+ŸËŸ «ìæ4…î¼f/GD¨« Ķ: ÉT¸7"}âÓþ§á^ë´ÈdžíY=(ØÁ‚ÃLE`‡Ã:ðÄ®<9Ja…ó’?T_B—†Y-àEéÑ Aõjó‡_/_ B‚§õhݤüc¾\jT'‹1 BjŠU[¹L_$ŒWÆÅâÒwŠSšGvÍBV'ýÓÈ~ñ÷^Ãﹺá~u6ÿ•…r9¦JBõƒÎÌ«:اêSW½%ŽØýü‰°jêV­ª¼¦”Jòîö|•Uˆw[ŽLå,W™ïÉÞã÷¸ÇŒOáj‡NI$’ñƒàKDå ß\V¥ä9Ó‚Žý=p¹reÂÅ¥ÝmÄÕ+ANH·•ÁD ŒÑ¡‡AjuXLê57@Ÿ‡jÈ[òKVîìêl/œ,cB†µn¯_rVˆ‡ßTèX x@ðÝX*$´=†gܱ*xnä òÌõ[f¢AÐÀ½²’-4±W_Ø«”вl9•ÖK¹ì¥ÇTXÓËPcˆVƒˆ„gt.ƒ¸)-W˜矶…F«at©[šÌ Ìd„Eª¸QÇØÿ‰¾8ƒŒ™±&ž´‚ÏÝàÛ²h¸åøþî\Ou}z즕P›…<òí@AÞÍ9yˆh]ô½PP{}˜o£13¶§Mxrz…Òˆ["Ýv•xI:9™NØ®eÇœ›4= ¤OàYÔÊôG÷v—–Þdº¹H_h–"ÑÈÀÜwð¢Ä¡ËFŸ Hl¦Ž/–zëR™†ˆH&Šž¯{OEÙ•D×cõ«-ú¿éœ‡*l|¨¿îì¡®ˆé.ÿ*š]i4šY¹ Þ›eà˜½©Ìp ÀAœ|[9ø’€a±­³f};7ÞfÑÁ:àó°ä`5(•‰pý[ç-ÃÇÀÓÿÏÞ»n7²ë:£‚wÞÿ—±$®â¤$ÛI§{–ÆçÛ«§cWéB‘ ”Ù¹­Ç§·“yo„£~"ŒŸÿFþÇJ÷ÛËÖƒ2ñ±¥¡ÛáxáôŸ0‘D\éh×å/Æ“EIÈîA+\"ü?‡“"àV‚­׸Æ5®ñ LJFâ< qÎÒ˜û+M¶ÜJ”ažú³Ö¾ê„¥ç–mÑ)˜ÖC!f•E v!õY…Ê1·Ç Q;<¾ä}á(  ~Jê¯á± ŽÉClÕ" ¤gP8[ß@>kéJ°T9(¼Ãa€÷œÂêø¥å³<‘«zÈòjFµêai‹XïsDüåTß5½#¸90qvÃdê«=ªþ-3ÌHíGNx–¥U¡¤/R¢þWÊ ™VÁ¯ òEÚoIYÔQŽÑ‚ÒP³ ¿°F+² Ì{u›•è1£?PH… 1íüJ‚b¥Ës b*Úƒ™M·œ.”Tr«»²îTÍ›ñ= :Ü\ååËîö‘¦Òò#KÑ0êÓÔe51Ž—6q³¢"yoX‚är­ªŠ…íî8¦Ì_ñ‘kqºÁõ[˜8ãnÄPm=ÙS‰ÚYJuzÒrß«ë«U£øyµçQJ¾÷¿BDk{U¤ç{:£S9‰)Ÿ {å{\q}~b Ý"6E& ˜Äà<Öá-¥ÍS6‰ç’+$EPÁúú˜?O+#~º¸³ÊÅŸ¸ `Òù|©±hÕ]øSXpªù“ 4ßñaüÊ<ÂoNl,‘É‚Aìÿ KÂ-S±÷1ÎÐÿ7j~o}•¨“Ã3?'x5éâ²o•@àsÉÝݯ½¨ý¯qküUã£2ú|¡5¦«fPéL‰ª{|R¡'ÀÁìEJÙÞpÓ(1Gw÷ ƒóÁnˆ§[¾ÒRôÙ`~¼’„z÷½°.7.€èòM{Y…Q ìÂࣛìbþ‰d(]4éÓZ2Ø«ƒÅ¦?Ê–éqOŒqs­î ㌠‚r¦jw޲š>ÐSŒ£ŠÓ„s2íëÐä$!5üÿ ¤“gå5NÚQöÏhaÑ@ tŠ÷´–˜Û9O‚•íZÿ'[iËðšYïÐ爆™ õÝ ž®®V!ïC±‘Û%ŠˆkQÀ@æE rw‰ÀO%j2ObË–%gÔ©J-§¨Tp(òˆŒ[.ãÔ‰À™Þ£¤Cñøç£Bå›]ã‘„h3—Å„¿ïìn9À2£0$§™­µJ¦Ï&!>õ*X÷0ó²È œ¬)Ýu¢Ô<Ìa—ì73˜t?Ã7ÉÑÜAØamòS\ÄèDÍ>!æ¶–‚è’šZ¸êŽý¯Yƒ)BG•iFrŒN%ùoÅÂdúm Ñ“Â×奡¤†…Ô$,{Š˜VÝÊNY.³ü‹Ë2ÅÝõ´±SýiþSõ^“bâübN•²ä½?7K±"Ê·úTd´Ksú³Oút5`m•Ÿ#Îⳟ™2Ärî¤5¦lW j÷`m¿5fk1ý2¶Šw²lÉMŽ`0SA ^Ù–ãBÿ¯qküeã#TåäúÁìæBR†œ ¶ RCzeÖC²˜å:w„UM:S4>ÿsêz¹áÞjª-1Ѻ=ÜÝ-I"ÞQf ÖHQsõH^÷×kô ¿m§ÈeÝßHœZUΉ‹mà'xJ~m›ÛmŒ1îø¢P±zz ¨ßhKh¹ Á¾ ö¨#ýଇW»%LnÃü†$ø:Ó ÅFÒ¦ ‘C®2|¨Âƒ;¤Žôó=cŸShn†™.PkuŗĵF4•N|ákDå½A“#NTÁ‚ˆÀåhe`úÇ8ŒXc(tõøb’‹Öò@=j…ðÏý€Zm² ¯ #YËC{;}ó Æ’ŠÉÚˆµZ‘îÆ(ôŒ@7BEê ‰ž†m1„hW 3¤ˆEðyº þrêĤü듺«,\&0(›‹ç¾Kav³Ä¬LöXàÈ b Tš"ã Šö)î*n÷EøªLo@\è{UýBwñ°%Â9.Äœ½#K„+Üev’ñtB øÈ. HX›ðZ ½àÙgn~x]7ø ½ USëéE;KŒaT‰¦y·œ+ûi ô¨ßðá? À=AÔþÇ«†ÿ&N#•cF[AÃîJŸd.‡Œeª°‘2,\Ú¨S5µ7<õ7%Ÿ[iÎ:·L_îÔÆí]çÉ@ÿä½¹Æ5®q—ƇÌ ë‹×XÝËOÂW‰ÖÕg €‰”hTm¡,~º·P’óð@| Ê6‚ÈÖâÿΡ,È÷MíAömÙÛ3üÏé£+Œ€†~ú|NÕÉTÇšK5-ŸÃb–:àéÞglíLž»£×€rZ|Ž*z¯gãœÏ€WâÉà x]‡Û¸ù‚PºsްҦߊ”ÕkÒåHšoσ9E€ð¡`§Ü™áݼ“m½­À@‡oã¨nâ—!ÉbuafЦÚ!á›É¹DŠ6¹Ã$EA Ú“iò(¾£à\Üå°| ±€­p­^)˜»†ª¥ïÈ0¶±_J¤¼m.CÖù‹v7ËÑŸÎT¶É‘z(P\Æìàèø…")8+=u¥ÐTkx¤z#É"ÅÌfæg –0éØ3t½å§¥Š'Ö.{Ëqió…áhœŒjâÀ˜#´)¥Ø_Bß‘3ÜÅÉtï[°üäáy0΢æ/¬vËÅr¬qincW“´f³æh„Þ'°’0NW~¥Ëû©ÝŽ5º›éom&‰'?º Äiü`‹cbÕßèÔRg¶–ÝBQ,<&=|!v[ÑN{þ>Œó=ÿ6(K–ä×À±ÿ±Á­‚¥ú€õ%`qã/=!¾w'àg6'f\£+µÚÁ9çZDü »@?ne²áµ]ã׸Æ÷Hdy‡;›¨Rµ£hT!mõ…˜ö²&Øž0‡£äè¤Ò,KºŠ—:q0¸„Ä=ùêíc½<;Ÿ…&üF JNèZÊr´ÉH& g‘½×ÓÈN”ó*7ÐÀŽgh¥ê UækÚˆ7ôiW„ûøÇ»…·àŒ“Œ¾ëÙ°U0ÍÞÁ.Mž àÎÅb‡å¤µ1MŽnøDä…¦Èy*M€N£q·y¾Q(6[¯ÝòÈàñ·ˆû¢!$±•MÖQ7]÷ÃVÝÉ<bJSùÇËÈ¥gŒ³ÎJb3 i­ÆªhZÞ@OÔÝ·OkEÄ~÷@-§˜×ÑÎ…ºº¨Z§1žÚ‚™Ãb1Í“Þf³àìc ÕÓXÚˆ:U€âÈHèΜIMD¼;Ïl—¡§â¨²Çæ2eeýO†Ôêyé‹’b¸¤r¶+#õ_.†è°} $E‹FȺ¹F“zÙ-úDʦåÕæ‰‰vÔHt $Hйú:2ÇyoÉÊÇü0+™x$1ws$m4È.f l$Œjnù›`â”×”qOŽ&'ÂïÀ+‡ºzÌÄÅætåè9¥k ­Ïd @¦}ÒŸlaš¬s@ؽAãGàøß!Š€q3 `”ŸåáŒ#²'I¥h«‚pN0Ó¹f“#ë…zMf*±M&Ô†kÁLÉ•¨*£Ý;ì¤/fŸFPëC[´ÂÖ…•õŽõÙôx`Ì^Ü:ùT¹å(cå°1WŠÙò=P§1H“k¬‰\²„; Œ9”ͺ"kúã€âÌ&ÆþäÖö¦º‚Y”“?Ò ‚ ½¬Ðö 934þÆcq9æ‚r+ :@ìÉÆön éò _$'™Vˆ¸&§?,Á÷XyT7t^Ö@[GO§ö Óm`¢1+‹Œß ]ë@Ï2D¹Ù‘úªxQœYTPàkhÃPÇaщÊþÆ“xÄnn©yÔ“–˜›K÷$Æo]w^vÒ²ó7@ØžœiŽò^ÿê?8ž£®Â»ç6åbG þR<O-(¾a 3ne9v¾Ç;6(BÈ·üñC7íæSÍäÚ<ä^,®ø7ï®z*.‰ßk\ãÿØø°æxÓ;Ö•€S*R4ßVW|¸xµÃf""8;µòPô²tH(ìÐ1zvã{….— %«€/Eô‰L|;KŠpx¤þŽ •„¦Ý_YΑËîÊ“¤@^£íoˆdÄ#f&œº¯d3o}6ª°tS!›-ÿ 3ã CK‚±¦~ ’Á)hÎæ0\ÿp¬D0D4¤XÎ)gÒÐf—°Öãäà–dáH²Ï¶Ž»¦HÒâü*QE),`ñT@¢Ë$—tKnF¦'YëǶ9©â²¨Q°­Àòi·èÿí“ô .É´AX› …¦¸XõjnöË]HQ@í´µ-—:3øq¦NÑo¶†ˆ§˜ƒi…xf)_óéûS‚*w£8;°sÙn¹ù›1œÒl¸Í© lÑö„ÍRlàÓµH¢Ùzç#¶}¸9ÉôâÔ§&ÓéØ\ f›OayŸô< ‰©9ü#†ë‡ÌzÒ!6ò¿‰ZpTžÂæØ›6ìi¼w¦j]ô’óÿXÊeKÔ²¼9–±÷tƒ?MßuM½³c™@ÝÅRì«.«=#*ê%£Ñz”Öu´,„X¹»~ …kƒ?ü„/ikÆ¿4vÙ[žg³Ê ÍòÒ¿}öÎ'ÌVîë׸Æ5þÆñ±§%ÏèÓbˆ½Z\¼YÀDªæÚb޲<36Hâ"©½ié¼O$!bjfü,8é0÷úo‹Á]É4¡?m†€é:”5˜ˆÐÒùµœw)º@Žã ¦ãÙÞmIÌ€ª#8 -YÁ†Ë¿pU^Ç·ŠäP ÑÅI.%"­Å±?C|@ ^T#œVáZÁÔkÛì”OÙÀVÆ0ÈŠ±Ÿà ÚÈÔ(àÉq4Ph…ð¥ÐÇ"Ú ôÎ?†08XA"ŽÖŠf…€+çYPš\çÍ"eåBFmÙœ±ÍõÎO\õ‡Ù {r-±·(XøIu3¥Ää¸q¡Õ7ld™Éb¬˜ßñnD¤·Ø6‚Šìi¦1#ÛÊ6>~ö‡)-Xž@J&{¼hˆ—\.Yq•”ŒXu'VÕЖ%‚†ùŸ‘¸Ï:+Q] Ý~ž²›Ôè®ò˜Zã†ØŸ7ÝW¬2gtßlAÿp»ˆ.Ʀ „ è@‹-ΦN'8Ç‚õ>’4I˜’OÒxKJÂ…5k,á·è’ÖGÖùŒDæ‚ß]žÐ&ó ì›fõ4e ¬ŠdK‡îÓâü‡§ØÝSAƒEjtÅûö\ _Q·ªú¯\hÁøÃ°37ÏËŸÂÞúÎ <ÿöÿ 0ñô¿Ñw1v¬m·Y–^_Òü/¡ÿøwWSÉ÷ÓA£×dæêþz–¼õHçÊ\ã×ø7ÆGgZ«º¾lA‰×‚D‚,Í.Æ‚¹/¨TP ’%Å¿Ñ>5î*óoåIëBZú¥p^@"#óùÝ…Ö‚cËÁ ÜT‡ êÏjÿ¹À+¦KºÊ]À‘ª;|Æ*è¿îÐ8*p< c!üKíôÑK…N^„ç”Úh$^¦Xùna;ž™’Î_EçÐ¥ü+}m¸-ŸÌLÐ0ïÈBÁxÿ>ZÉŸ•”„' ONÒItŒYm“E¥ïa°‘U[q„æE;QÅÍ¢«bey)ªû9ÚªÓÁOÃJ‡3W1²¸ú”‹<™&›Ì)–HG%wˆx3Xž„¸ÁH}p‘—Â>œ QžÙˆ›5œ2¿Ó;TÊÞLJ®iŒžÉ»8ÇCòfú¯t*HçàáĬí˜ëÉ`ºg†âØ®wÛæµÇ+~Bô’¼Ø£†¢·š"³Þ¯ÖzŒIg$fe㘠¢bŠPè$=Éß2Cx&ºbõ3°(IAóR9“DñlÎÜÏIøç©í)tì¥#Û’ðK-~ÛöåØÿ+ì|fç CW"Æèà{æÿõGm¨ÞÇ¡÷ÛLŠl¯jNn±ž­ý¥™ˆÜ ìPá!üêÇÍ7µTÜ’—_·xÙ]èÿ5®qc| 8:ã yA¾_%¬lŠò40š«ªX8ôµÕÎþ=SxybëH˜pÀYÈp”84òÃ_Zš]ý¡cî^¾sVò4l®©Pû9ôÚiüуt˜’;í¶µBó*¬°¦è|&ˆKÚÇ™–©ÄÀ¶%ìèX›sÕÞ‹qdÝl¹ŒQî®ûT†/Œ•u4'B ÿ™­Ë$ œ”+u¼ OÕíØ9†Hz}t÷ ×†‚/^.B‚$ ålÅY?“°Þœøc‰ÅD ã¾…éèÀ¨ôy$Rq¢§ éIê·Ëfå.&VФéA¶C¦}XÇoVKùsÂïÇ7¨vœ¼‘îÊ>Ó7|8ázµd¤¸ò\B®Æ$úØÿl”ò°->L‹Þàn¶ ÒFÎÕµ]GÌ-LÇ&TåÈ£uï–Š‚3Éžíå›5Kk 4ðsÈ  /E¾ª(½‡hnM°¥@$Øéð+žõõ65=ÐÐÛü†jÓ»[R”$¥"‘ÈÀrOUú!¹©u-&±êÀ: ÙÿwtÏȱљ„–$gú¦c«if¾Ájú/YD¥_ÚN~ÃJÄ žLÿü[¡«.¯§¦,Ô°ñ¾_ÇàŽøüz+ÏÄ"ì&<¦É’yÖ:ûUñPD9~ó¼ÿ¶Áú´>‡WVG IDATÂríoQW«U_…÷¯þ (v¢Ù¬\)ˉJ5Ù}¡ßc¨a6¼þí׸Æ5®ñŽ¥Bf‰©²+“çVUßç–^ôRïøJÑ—×b}Y_ô®¡[ñHž ¸Mx„8íëíè3 ô9° l†šÃˆ£ÊU„ ÓœxG)õ%ê èvBTÓ7ožþîpÃQ¤•a|Á c}pFÆtúF,7ÎŒ_;ÕI¶Ä·š¯ ÌàWä2ÿ6²BXôÇ¿²ŸIœÝð ¯ ÛªÑu«.@ Q©þ•)4˜#[Ä4ic‰±¸ó>QEŽ 'Õx|¶§ j Uë•ýÑpǬ êrÛÌU2§–=+µ¾ó”ÿCyNT}GÎ0ÕЙ@Y ×­¬Þ~¡3ÆŠÙT$ñê^;7üèÙ”J·VW¯Þê« Õ–0Ý D}ôlF‚i C· À£Ø¶üŸõIg½Eƒ„rwEín§AÀg—!]›» µNPªð®[!ï±¶Ü k#¹ŒŸ ¬»Aš>ö/naGÔ»X®#šþËÅjî-¸ð¹ä'NzÅëÈE‡×´¥WY£pÈÿ{As`ý‡§Ñ#Ÿm\ãN^êuÔðåßÀXTãù®ççSe¯¢ª Ìæ¥Kï ×г x±à ü8òû¶Ç›(•æä3ý#`Æ»¥¾ð÷ÃÅüÉ/¥ºþz鸩ÄoÜË|zç!½Æ5®qýñÊéëë/VŽ“óúIGåÊ]™ŠR÷L°E|±å= ©Pá‚Ãkâ¡@þЉuƸ€¢ IÌß®¯LB<Íva抙1AÙÂmøš9¥ ©P×y”ÈÍ`§%È0,m-Æ¥É>åWIÏn_|SˆÖÚ¿áÛ ë…ÔJÚ’˜ðÍçišüKI¼Ý(jÐ&­¾²®Nž–Áˆa‘e¯À\×°À4MʬciG•BqìôüäçcÅRý5g’àé@,¥ÉjΓuÏ#âpK ™Ùr÷G`¤Ò鹞8SëNôV¨—­TÆ]PBÑpS%:ÌËãbô•¥Ø Ó%Èv0{“€•[¨ªëï+@ ‡RÙpݪ›PZ`öÓJ§`³;.¬»oÁŒ«Ö+fÖ6'QÚ{Ó•8Fñ‰”A ^Á£ýå°êPª¹²:N†±dK¨}›lU˜ ¢Ê‹ËÝ{D'´Y:¨ö¸ Ÿ˜˜Á4•»X*™â¾‰"3û±“Ó‰Ôë협ߋҥ å2ðZ@ùQC¥wH~ÞSï~É3שœÞÇ}×cÈ~^ž— Úq°MVÌ«¡Ký¾úmxâÛŠŸ“ù­x÷×@0³nƒ_Nû®yÉø=ûj¡“Kx˜,:¶u¼Ï/ÞýM°_ÿ(f,׸Æ5®ñ·ŒÃñÅÝmÑj7EYPÑà³æÛa+h¿Í¦J–V5ç“¥ðÉÀîA> iÌ”oj/SáXW õÍLh¸_±v3öáò­bsEp,¸ ¦¸}˜lÕSQÁFñ§fÛ &‘°³2@–ç8þñ=\nJ@Ú]. †ûwœ f÷ÒÎ Žu®B¨E!§ß ®zÚ",¹+–sˆä,*Ÿዲúޝܨþª¥CΚd¬Ä§0•곮צú)nècfâ¤þ гFw Î'”ô©†IÊÂ@b[0ïõ\œýÄ.Ói!.Z3fÜ)¬Ðs§c‹‹AUÆÆíVïÿœÁªó hÀ’ ÂãásÏ’s@V£SÙÏãj ¤„mðcÑs#fÐ"u–¯&_'Q{À¡–ö™º"Ê”S± ¡“y´ÂãÞtñüÒ°I?ÊBê7O¦]¬p%³– ηé­°FÄ[‰>ÅárÌ;<\W[ü.J ³\ÐݱôDæ¦|'8¥a÷&ÁÜB*#ܾ˜J%!îÞ•djOTbæÏAØOh,ãLÕ ¾Ø‘,F¾!l¬íI±|Ëìü{2ï-#Å›p¿÷Âî[_ø­€ZSô±üqù‘U?^½¸Ô¿!Ò€–-nëê6¬¥)ÞI»½2ý?¶txvá6f‚­ùšúÀ0o’f¬ÿx£ èþu!ÃA\Õÿ׸Æ5þúñ‘qØÞJZD5h++,cXj4jº[bé*å7ÃÃD2~T…í-ÒÂk åK,çÔÌËüGâRW€Žã£°óÃ……ko:N H¡÷(?éʇ ’fŽé©Ð WŽ$å:oª öõQàMQ:b1EÑ0{fV8j‡¶˜& R?h©èᡲo®ƒúBˆ„i@pŸ3›ûLVoÃSˆÜ`òC|Ô\G*¢ôø c¹§´Ü˜Š-cÜË‹kê¼RƵƎ³…eOIñ¬Iíe_YÁâDiвÎÓ\_û†›·1ŸzY‹ÏsqTjŸÝ-ö9nÉæéi¸3 ÜüíVp† Iy§N&1Xëˆà Þ’0Ìx ±+úï©F\øŸi÷²ˆ%­ ¼IxIð#yS¹O{·"%ͦº¹Ye}õØŽÉ/½¬!ÛÁ…¸ÅY}÷5]3á‹ÒsÈšñ ¨”òžâk„ÎlYI§S¾€ír¤žó²ÐT;t¶rE–PŠ@NÌæÒÞ^îuÜ‚U8–_þ-˜#gÈ^#Èà“‚ºW#Æ,Œ{†OÏ›- zu~ä­¶ï4Çxyâ^vÖŠ”ä¡›¶7Ü$¼aÞ¦Ýû–/âlÑ·æáµ¢“ÕÖÄa³mwyžð3G{sµÏž™9 ÇN]^áÒ\{ ·@ÿ/-Á7uQ\ã׸Æ/CÀ2In–ˆ@SžÏ˜)…¤s§ ‚·‘mIw++©¨xx jOŠKÊõ¡@mâãǬa.ê´Ò‹ Ûn^*ðñÀ>â]L]9ËæÂ–Â¡û—«,P ?†ª*Í€ä°CÎÆ˜Õ>8ãÌ4¨ÞJAW”ªG±°ž ª 9ð±-WUE¦Uü– œQš˜]ò#–©Çy ­‡r`"£<öó™ïÆ­‘‰1œ«p{¬Ý]áʸ™q†ÇÿŠÄVì—ܲ·Z5›§Œ]Ç2\g²e …´LTæ@û;ý>œÅöô#<|ûÅ;=jˆ>7Lœ6ç& 3{Ñ_77¨I€n¯ ù?™2•ÔgÑ—0R«Jµš§±Ê’Å(Ìõ‘Kq>}Mým'~:RK–¬aÿ¬ 0}“K uz/%r¿¸‰ŒÏCõî®(®¹­§”[|fw}ø†°œÉŽJÎXÖÔuÓ5„* <+Fâj½9Ù´6‰S¶2Y¼2„þÂ.¦gÞít½ô+üžÍÃéR+7k¬ò¶½ñàò…/e{±¾8÷lõZP–q(¥ÀQ¦(X´)ÿ™Ö—µ‰ã•¸Æ5®ñ—%{È "LUзŽ/QéTð1Úë„,øR›y.¸>œ€[ ^ËÐ -ÿGÂ<Ö J}¢¡¶W5Ǭ‰“«¾”õû®4+¹œé¬–9Ã3µDSNبCC­/KïÊ› ™ŠQ±pÀ#(Ðúíª:#§ôV댵\Dîà8O ÜÍŒeΊÏô r‡q ÐÓ7‡„â™E«ÈYöÊ`LÔ"ÔZqbMYt%‘Â57ÜmBê¯kêZº_ñö2ë '‡>ÉR|M ’'ƒÛá³t)wmË9£’ ÓKN ‹ôLDgYnk£,' ’.;´ˆ 3X°°¨Ò*yÊœ>$F­{ƒJÐÛHØçw©S–a$‹y83î ¼:¤J˲ÿÑ®ÂÊq¦:’Žñi•Èy©ÐQOznÓ‘@Ž[Ý0$=†,AhÖ‘‹g9_|•êô3‹òCÉίO¢ìØ ŸUµƒs_Oñºi¡w—"zª4~G‹Dyý3"žÄé˸ ÕTàrò¤h6mû¦=ú¿>¯X8‰¸]®û*DËý¿åÚÛ/â7¿÷Kð\VžW(ÕkæŽÖòÙŘz»›õ{òÝ+Õ´O½úwmÓ†aFºÖ|ßYÁ³V+UoiæX|ãpåÖt˜+€âûLÁÊåUu²^׸Æ5þñÑ€ƒ¶fAöïÂGeÖ3¯o*ÈʃŽM¨Pƒjâ>P}¿ƒgi sàl™yàЈ÷”E®ÕOŽ9K#`Å;¥y)"cw?6¼Å“¨%‚c${Þ18:bÕÍʸä"TÄ–ŠÔ¼:>öóD£XµÒ¨?¡ªÝH¿ÍŠ7802*E*dÈBòÇaGÀYÒJ©¯p`ß§îÓWa8NeNûd´¼V`¤q )ý®“o;– 1KmëÇc‰ëT‰/éëf+T…ç´ —¤Ao ÃIc¬6ŠB›ðDÞþÃô¿Zšò.úbã±ù0L);¢E')ŸÁ ù„ƒžµl¸-sF¬¶ï#E黢@¶Ñ ÎñÚ®b¸—*眑t%sF…<¢Ó“P+ÎÄÉ^ëŠ (Š-Êd¤¥öT%þ1EyãÚ¤ÁÊÛúlw´‡ªÖE9kågè¬v71ñí¡9Ê‘ì-«‚LÂY¼‘ªs4#OÝ©\,m.žtÝ7B\…J.èP>–Ùf !E³P—B˜Âܹt­bô¦-r7%œÀ¸ 4;î):؃C Ê”¹„‚ò¶":¤òg¸n¼p™0š“FŒ¥9ŠôÑè`!ÎC9š9hÕ¼k‚V¥Ü­žd\:ag¹ph/Nªƒ“g¶p$ê‚GÎuUDó4* …wd½í+õ’a’+•”'ü#íýQ܉áOW3·ÔL÷ÎüÝU®‚ÜÉMT/ŠFï$r¢¥Uu‰¨¼–’DZ/9«C¨ûËso“µ4´÷ì÷q@šXiÚ~ú5t:[ÜZAšMŽ­JräD¶­mßñµÉ5 7Æ7®]Ö ËÊ%wþ»\:fOBe>B+$Šh·”GkعqX¿cöÞ°R?ÐÁtk\ãß?>€k×ür¨²ô‡£CÏ]Û_À‚ã`ü ðãYÄ`£àJ0í~Ó¿ËNPÒƒ•##ÀËÇ ÈãDÆVº©Tõn‘%¿ ´¸éz®<Rùjw µ_‚âYíÁòƒŠV ê†Rì õ}RÂcŽMÁ/¤p…l„ǃj|åXˆ^¸¾”¾yoÕJ¦vÎa8%Êæñ,R÷GOŠ(·ÇíÑ@_Íu}ÓO'Û»¥ZÙÀôY½9/“Ï18Æ*ûä0ûd”…ÞàêIŸ„Ñf¥&Üâ9ù ÇçÓ}œN"}•4´ùìøl㸡T®½*×-T#) ¡f‰le¨Öù|)6-MÕBgyBëC·¸£ Ï ºêŠæê&Aƒ8üPbÈ£nê®0j/E(vrr°„³Î³0ôÖRý¢“º1¹7†›½ª$ê£!•B5úìEð°µEërJÃ]…œ9†×n7šf MrŽl16À«ÚdšJ´è’¸œSv½çÀ Èbމ-\˜sedôäËó©ÈÔãÑX”¥áÜø<‡*åÍ¢MM}ã,êj«``¾ÿ~ÊÄí×é™g9Å »…ÔyÄÙ~#bþ5—¼È-=FìšjŒŽ¼y'¼PR˜}…ÔìÛvÁ–þG¿Xßõ„ô}W˜?ÝJ’¸¯¬èÞŽÛjå âÅÓ2TÍeÚ‹ÝËB‡·³8ÿ³ñÍÖnChçJ \ã×ø«ÆÇN<ÐOkaŽKŽ'v7L&#•ñÕJq2 ÿj¾®ú²I77òQô݇Vg¸U• Ë'±²“œ ô”D_avA:̲˜¡lñ޲$B=í_ј,'¸ 0¦˜mî¢oSTWS6÷ƒ½Ø£Ddf:r¤€;D¼Mj…É‘kigÛÀBô2} ò(ƒ­..¦±®¢áºÁŸÁOºpšü‡"ž> ¨û¡Ôº‡ mî>*ËcÄÏMp k ry*ÙF&’Ž3ö% J»÷ ¸:Mï¸á=ú²©&ûö©úItþ©©KÔª$k£4w–œ·LP… -£ËÜAÀFç–(<â ¦Æ2${ ­Ò$z]ò’¥Æ{¡ o&åAƒû#±X#¨ðb[ wƒWvƒæÿ Ïe^ì5ôXc{ä!3¯è Z]{ÄŒ6P‘µÂše:Š-Œ¾U;c?Yf¿Ð0¼CÜ•G¯@ ó•2©EM™<¬ø\ã1ö[ÅÝ´¶rJ&ʲ÷Ke+ÛHxî»ìmöv@' rW Ö@/.¡‘hq"¾«r>•YCQAäd°-2£þ6‰ÉW4mž67€¯ƒû/žSÔÒæQ•»MÞíëëñÝöv*4ÅÛ¶{(±<÷XoÛâ›/þ E4nº*³ÕéU4švï@äM}Ç!¹Æ5®q?3>ΖdxvšÖu(°¡H&c¯ŽW ~AS“H²•—GPdÖk¡*¡b†JÀPF2ðUZ–ý\Ò}8.fˆP$"˜œÝ8I¸•3W ³Ë QÖ”5­(B_Vž7Êf’[ö:˜?}@˜ÂN;Èޅe×ß«úîñøŒÜbU$åwØÕ‰"ý·…ù”)FԉυkzŠ"Ò[J&=xº9ê{Ù}UB{§ÊÆÃóO¾ ²Ÿ–;­AÒƧP‚é—=²L[®°-Ïö’€m“!¨Ê™_Çpà2‘ƒ…³O–ÞrSÕ3ÖúeÐÏæÛŸ…ÞŠ³¾Oüƒ ݺÌl ¸m0ÜŸ1_:kkQfíi ¥l²& ëgø_R#}—Þë̾aÙÇ~îgu”õ gïúdÓÃyØ2íÅ­þ_´Q¯qk\㌠ÐT&N8C½ è°JR¦ÈV‚t\I¶Süøöµ\ãMe‰d‚ÑâS{6hù¾,šÓYÔS£n#`Q–AÞ ª8‡å‚.b LÇñ“œÀnB¼~iS¤<ŒWE¤¯bŽ% i¸ú‘²õXºS†óÇaœ…úˆb•´•íGŒvoO4Æøl>8f(_ èj^è¢?z5Ô‡,ê=÷_[¦«9IW»:íÃÛx©Ái_ùìЮ”§&+ðº'Ùp¥×¯öûK_%ÿGãK¶\]2¨‚bxxHl<š’ü²î®[ ¡êû« Ùû}x&UaHÁ×XõQ˜d²{û¾ ìr¸¯(!{Жt«sŠ¥·˜/½—"Ë>w›VÌ`S>)0œ<ì·ïZZжÈî‚ÊÃò’ÕljÅÕ׸Æ5þÕña !7/αn]•«a„PüÐn·1þ7ø)±þàÿ¹™yi,<×4×ËŸO¨,?j£(×èf‘Kð§ ˜4To^6ü7 ˜¯}ò•WÀI#Úæ´ê^Bi™2+j„ÄIg-ÜTj‡&À¬Õj<§‘Ng-‘¬Ÿ@WÎFS5Ìî¸OxÆ©·4f”›êDýx¹àùr&Eâð2;ª+5bëÛ¶‚çráuzý[´E¨JY]ætå©; re½¿èËÿ‹o{ydÁòŸ¢ÞÛ)= —¦R`Ó2èݹ Ûz »á*Çéo9§þ—Ícù]ËëRÏJjß©bç>ÎU—p¢Uþ›§úÉ}¸¼AާG³èÞÆkçeÍ;xyŽ¡=„gzÝ[ƒ„4ßÏIÈ€ñCL:œ¥#õ(8kÔnÀç©á®qk\ã7Q÷­kzkS(Ç„Y¢æY¤¹­¥Uíoú˜v«Ê5DõZÈž‚F F;‹.Bš¨*œvÍã,ª ‹Ê:(ÆÕ$­øKŠH>TH¾tÅX@„ltÑFæ´k\ IDAT­oþ†Rµk% 7ÈNêçÐIáb“éiZ¥ë09J ËA)ZŒª–ùØXC€‰sü9··Í7{uÄqb»LÅõ‹;qÆB™½®=÷D&.—Þ?ÌÉ$&«;°`ëlð¹±ÆãLpKbX¹–cüïñIc¦¢z¦ÙìEúó8Úè+òÆälÛ €¦±£N‹Ær{Idìó|È->^@8¦Ky&²qàtG!î1¿8ÀÍUÝfT[Èðõ#SÊç!ÍBSö ›1e!õYïÌ&ç-1 gà¼kd‰æ³éN¼9?ѲypˆÔÔ"Dƒ¢yT’­­¸zí˜6v«Ik[VH“á-¿» õÅÈ¥1­™uÉBx­ª«¦¿XCV¾ûÖœ¼mD1µj0åâv‡ÆaGêË%iR7ÿkóÔr¦Í¿bl44¿Ï=ý1YlêwÆô ¤ìÔ×½c“Rð¹Õ´™©¶ß„Bé7í¤Ÿ£µá«àÊ˼û ¢ˆãñºñY$ú3E„¯ê†À3_‡HÐÐSü ßµ•èÝëÞ‡¹Æ5®qn|dëž ýš`ž;!/½%±ï8o‹­J‚ ;>LlÖ—ì¹,pìoôĪò‹ ™ 4GÒípkîÚÂëÈÄ ÕC‡’L(äÃÑô`×.bU”!-–Íh ×FP•d ÒUâ¤ÚQà#*‘3zúx4;º<Ú ƒ!²\?½;éu %úÏÂ5 X§mA8J30tƒÈŠ jeèOœ”‡•QA]Œ|–“d÷ºZ¶)¢ŸÇ)(±¼¯ì—´åˆÃ²útI Œ L}PpÀ|ê´y*¤>ÃâW¥“º[h¿iuž?[ÎÏŸ¸õ¸ª¯K<è³hÄŽÜ€Ó_h ½/ÀäˆÙ”Ò ¯ø3¦Lÿù²ae‹¼2èÔAs»1:!á:àwõÅ­-õ ,©«Þ§kN¨cy«öËù¥awOG#ÒÀ³…I—ÕnŒªÉ`ToÚ€zíº¬´‹axçÑ Œi…àç$àX¶a#ŽmÄ‚†Ge­t_ÁBE “ˆjOW-îúdP>¾í´ÿ$r„-£³^®üâSù–WæÌ ±½Ñ“ÇÈ·yÐ~ ~­šVZÅ ÆAašhú/mÃøŽÃ•£‰-ªýŸ—ææÛÏC©¥›kïœ}œ^vmñ ˆwÌnë,푱èäþÁ-¡ŸþÊ7\ã×øÁñâçþެ¨9D{VêÐõ &œµ{á?~Ï=wý¨ÀõdÊ’Où,I+² •i–ä”ààÚÕâœYYn,Ÿ\‘ñÝiMTšZ÷2”`×?‘2Ph5GÓTq£ãÌÊ 7ˆƒ-«GM2~sÒ©D¡y¤Æö{˜ÀzÖBÈM‰ózü+°Qåû*¡µÙj*,û"lcà̧AEÿ=²+Ÿ0/i(¾*Ç™-5×hù^ƒÓŒ‚73ÀdòCñ'0úÌM*ËЮ—€S%œ—6åìÀ<”Ð}*ŒZîL÷èúšÃWUoO‡%>ƒoßàÈe«Ú€ž +µZÓô:Qüt¡Ž Ãò¡¢8 :´ODL˜•ÜùôÞh»@Bm¦-0?¬3_=LjõLò–¨i7®‚2 uu‚twz´Eé@óFÇW GEýÌQIC-Iw˜M%"µ[b$p01IQÑ=¾EÏèÝÃ0' 08ç «Êö5Këlx‡Y{DO'ÿ¹u¨°N>ƒ×l]ÕqÙì¾§œÏkïÀ¿dË[~ëgÇ[BtDµ([(@¡ä ,´»á»âü4lÊ! º§~ü·E–|kI\×õº{;ñ—®œœŸÐ,OÁ¨cŒ]Õ3ƒ{Œïzñé¨=À®‡ìÇpù ÷¿Æ5®ñ'Ƈ‹7¸ásÀP-Ï ÚQ|§0>oIå·÷Œ$Ås2;²¸•C†iEU€™”U÷³Õ¯p }Gˆ( ‚ÅÊârc5Ûд½ ¿Ò´ÔµÛs™ME(kÄÌÝ3ËÄÞbìËDqt€Ë¬ÍXÃ%¦–xÞ"=Æç«¸àó“bé3FN¦Ðòûc ²¼¶Ì;¶Xïó—¼I±¢ù=’÷ŸÝ™ €ö,ªâ²ˆtxAär9 ¦ºÏ,Ä@Ô°!ÅÓæÑY*úóR(Ú»ìŒ2‹ô0«qVU´°¢Öi›ý9çðI¢ MOäÔôum^;ÿªC‚Ì|äE¤$ï9·twP˜ n½,º3‰•ü¥£‡:Èf‚è_\Ô çô[ÏÓþWY†rzŒ—WHQäHV*ñ«­˜™yB@u×KÊê1Í6××ÚeAVô9¹n鋳ö+Ëœå&ÏÞºgûÊ×V¦éû@4aU|Qöj.y¥qm’[™ } ul½éëHÕ˜b®teOMÍÏ ¡¿z¬tbÖtŽI‹ÒSÞÜ·¼|01u>è£ÚQm,yÁÆLþ¶é]üí Ö¿Æ5®qÏñm}ëªÚÛ3Œ¤¸•ÑW ä>6€u8qæ’"+ O)œERp,l_?M‹(£ê"Äp„Êìc$Îa;z¢“XNU‡h¬ÖK)f‹œ8%Hô£(X §†@Кç›ÓrGïññØ÷fÏKÜH16ÄÚü1ioÏëB 6UëÈ” ôº´h#g›:‡·1ÆãŽÄV@Ib¬2²K=@`Œë³P%—±›ÌщęÓÃŽ™ñ€¾ÂR…5sòØ@DXD¡zJ¦ž2Î0é%<@4ŽÁ‡¤³)ÛПGÅýv9äY8VÊ"Îñ“8­«ýŸC*”pO™\-‰nÌ{9ì~ø¼×g o¨§·±Åž®r”Ã+“cˆÿ{Èt)…*»,`v'ȆʯPÝ­¤Ûl€@©¬15ˆÐTCD)*(Üêñ¸7Ë,ïùsÀg®$[`>†kçæt`& Ëÿ/VHF¯Ô«ˆ‘|¼”³/+訠:h¸£ñP#>ÈÎZîœa£x Ì]ÐÙÖwzí„,e­¨–fñÁëysŹ‹nsQÝ¢‹:7%ëfßžûÝ(ÑnÓw6Ì˸™ Ñg·ž›•µé¢” l”b”GÐê¨Iºêû{ v¼úªÓ]6Þ¥3Ë–c–+{éGŽRoÜd¥¦|;Ž­Õ¹âöZ/ÏñÛƒi. 'Õ„OÛ³ŸÙV‹Vu|±mŠ®qk\ã/âžm £†ËEŽQ6Š‚‰{…ìž…*æP±–% úüÿnuT?<8ŽÚ<Õó*ÒôÙM#!xšo³ú¨ÌD~TžëH½Ðߊ¿é«ûK%Où5_hݲcÐurˆÍ¯³Ü9÷”53ÆpPx–}lÌ"öŽ"|RfJU1&@Ç&À`v£g#_§ŠØ+Xz2@ÉÅŸYDD•®ï]YÚMžmŽÒñ¦Ï0ibÏrSa¡.•d2õá“$³ö1Ä„#yä^LÂ1&1þyxž Îî9Çiè8P7{Õœ"q÷‡AÎÌ´>¢*kQâøàFÜ›mÃosõ@¶ãPçÞ„Re§(vøñŸñ뙌^—Îá,ãbš½ó©Û>lZ­“ú ¥ôˆ9‡®†B^¨£1P ÞÏÊ!ÄÆí¿gÊgIÚÀX.˜Êø Í•ú½|Úéké•(ŽéXh¨‚n10%Û yŽN¶Ädn¨Vmd朔œË–sP©P°KMŒ¯d¦JŠDÿ;¡D¿´a%ŽHý‚ÂTpŠ$WYG¸ö 4°]îªÄL`æŠÌ³$\Ù²ñ©Þ^\¿R˜ü"tø“¤2LGË;¤šL>‡ÀÂÅ M®ZÎö\þ†Út¢ˆ ©ƒ„òËÿܟݹ{p¨´a'nFr°µ‹4s¹Û—ù®ùã“r¸}—‹£'ø<Âбî0þ¦%ÁD½oËù¾Cpk\ãÝøˆÄ÷½ƒê¢¼ú…šŸ¯éfâ+°Ø‡¨ @Klš^…^±3S§V¥{0ÙÖ‚§ï9 ôÆ* âïQ&¬Cr…¡ºó ÔÈq4¬º1taK*Ì Û`À4=Ž(ì¢ÊsZ®Ú¶;Ô…'¨ÄUÄ«ÏePÜEÉêÝ|’F'R,j=bv"ó$ô°Ð ª:*r x~*`‚L 9í~–²6ãDE“-ú°¦yË)vŽP÷jÑ=—û±»”KšÃ’ã^Gë9VãC¦´ÞP9Ý´ŠÍÐb%À_êÞ2¨gaJ–0-a±síì)LHìÿ@EÝ$ÎÚm‹þË{‡)]@š†¿hÄãQ=¶OïÀáÜ'ÓK µËŒUSœÿ ÛÇHÒ(ìö¬S¾ü7îЄÉ@ È-$„´ö –¼CÖS)Â~¶—zÈë—Õˆè ×"@3¼‹r7­-c±!£X0Tøf6fÉÈŒ`§‚Ó»(´ž ù ì«|À}5Ìm=áÀt£bó5û¾”n#H5ÅÈÈ×÷·¡¯èûW¾ bcCW´jõÅSxbîG\ùòåݧåLb³)üŸWØGÿ'ç ]­3cvvÁtüác¼Â WÎ.÷¯ %­t‚9჉sÕÿ¾·RïÿÜ^9€k\ãÿÆø£äy°ø‰ÏõhÎÈeÝÚ è›ãT)Þd ©u ¿PT‹fÿã ·WÓÛ+E¨æ9×æÔ™Ô,‡@–ï‚Àª§B™3Ó‘¯;Ò¿Ü–#pÉé9 “5E:7‹Þç@©kô›"ЦKÆç°'-´­ZÕRPt ÓPß,qµ`\ë ÌaÀùšãÒ²þ—/„$…Vá"ÕG&„©Ä`5a1ÝòEœ¨6pMCèü`éܳÅò²Ózî1€/Î10nÿƒ—v±Œ—•z9"H‡ša)¬Hž=„Âjå$nîyB" 蛬ÛbIúËî`¤±*&‡Ñ¸Û_K¶–ÿœ%x€¬è:/kéc(EšëÆÑìŒ2ÙÆÀšõ«Oš#y˜“"kÐ ¢ç™aB“¡ÐC.‚n30#êÏcÉ/¬H€Í -+dX¯&è0×í)#h˜O)·e?—Iù0¥Øá«Lnº0ao€ÚÌöb?œz£¬±á²†tÍ4ꤶYÛ1Κ۳4Þ*gGýPÀ_kJéª×o©y\˜—¿U·Üžþýo€ ÿ$ U\‹«¿@­ìÖ¢‡FŸÙ_¼“T˜ã¤›8£Užû£Z³ß<øÔ$Ïvkp¥ØW•)NQ ùE?<+–¼iɪ¨5Ÿžçºtc=b{[»«ð«6ìq_4Yx}¦¯qk\ã/#×L2Yxc*®‘EÁ‡çç:”=t•¹b1ÚêKε•B!m¥iÑÆð«h®ˆÔ1tÂká…Às}ƒL¥ù<*aIOº"öêòÿÐa6m;’U¡gЂŒÌBç´úçÙ¢Ö+cXÌRà|Û óDà,uè±``$ë{#Âì=Ž6ë¨uJø÷aÑmÞ‰†¹‹kØZ“´CëÕteÅt´c6mÀ¤ê1ròFLbÄî MÄg˜²F‹ž”Bded„±ã9çè[hˆ‹êªûN =ǬƒŠPÆUë¥uªb4›Tå´—þEóoûñ¬FÞ”-÷üK0yôã^Ãæ.g?351æñ$sâ—̆͵âÄ&üêÁ6äúfÎü«Ò¼ õ™áj2`¤‰v÷öžýä³Ó ×–j¿ê —A|ç¡NËZ×vŒ9·?”þ*}¾þåÖ­²)ÿr ð׸ƿ;>B,ÊD*Ê¡ ç–¤j¦´žyE†, ›Biþ7:nñÄ‘ ««2Ï(Vs[÷þS#ÂãCǦ[€–í=\„?$¼v$…F)HJ,×(8ç‹÷5OF{ $‰¥ÄƯ}if"Ñ ”n¥>ÿûÔi¦Ž9Ÿ õÑ0!yÐ_Ío_Ò9…™dF>_fô’C » mjã6ÆmŒÿaÜ yäF¼×– ð(?]UW/eÁô‚™­&@ÞrVŒW+8¥øRú‘*ÐYÈ;»Zc»ˆ¨ hPXEz,ãÆAŒÿñ$—Pû÷j“á± Ü lÁÏȪ§œÔÞ›“ÇHwåè4wÇÙ6ZÑ›»G)w6¼V†'?¥3PÙ\Š× U‘xº8àiˆ&ÐUœciQ—ÿÍïx„Ba"Œ ò>“Ì K/uæ#Ì|âòµ´uÖ8p&lE…°‘vª änò“Ááê¢Ø6¦&%/ÞÈwÞ`¥Ü¤ïäkÚ#Ôß`L*Zžñ•j>±É¢³ú¿bqmE'§JùîAE׳K·˜<ÜŸ4>U&ÎÊj½ˆl Ã.~7&¬/þ(!ÚçA‘,ÇRjãLBW•I¨‰:3¥-õb‹ú}Ãçï±qmc‹,mEŽÂ*t\Æôöÿ³…çØ^ü¦;Ÿ ]o_nY>ÂÂݵ'ÏNÈ*†óÂÝ7}þÑPή¼Ëð_ã×ø·Æ[' N]j»[ÀÂ`yNPê¯6±,gB»T¨VX¸Ó›lE:7;ëÐT)*Cq_ jõU4JÒ™F¾ävÔ{0TU”¼S%´´pÏÓ,ûó)µÇôG²Ø3xüha<JGC(Ù’'Øo«ä4r@bY††l²Î5M,*’|…¾k¸fÃÉE”›iCòqÞÃW¹CQ̧‰…,ZÏÀgxçWY±öˆŠ£c<’£e©6_sû„VqJWG[Ê“0ƒ;;qøçÿ]aKÈßó§LŠyƒeÕª-Ž Y^I_Ñ ó–´ê>ƸŸrÇSÙ2óc20tŠZ-§^ûÐ; enV-V¡©EÜ,Š×k´(,€WÊ Ö¶^¥ˆ!Æõ9Pk™úgÆ!mJAîw zÈJ-(éÈmË]Ù£,~' *Ú¢Rw9n‡ôXˆ %êë" 2›ºà±[Xv?ŒQÕ ¤]åA×ëæÈY|ía0%§ƒÊFé!ɽï9 –ÏÈ1d|xGÃTe˜Ñ‚5¹äiíÝÝ‘Š6ªûáX¤b8MB¾9xØ®DLÞMBÎH…QiÖ~Hµ“ñäôˆ=ù>ÿ|6 ²i–4zcRHá:Þz²ÖåÌŒô£K@yÇ$‹º<ÿ!¬ ®¦àÑi×øä6~RGz›~?ò ÷ðh_^S¼`"Zù–I†faÞÖ”Ÿt¤Xxö÷Ñ/]ã׸ƯÕ½} bZmÿÐ{¡B?P‹ê¼Ü˜É®7³º‚˜ª­Beqí…b“ä’míõmº§IP"™l‡0jêÌPQúäÛ½¸ ³ÄbÅ0cci÷5ªx(+ >0’TE»gÊ1Æl:Tð€•©Š.ÑÇÀLÐ*¢”^†E¢sÅr€ŒÌÌhl+ˆVÓ¬Øpq´h ´Ñ1tÙtNWy˜’jéÈ1›!±6tùðü-NFØ3gÈõ6\‰ý˜ñë0Õ”\èY(>w‡ë(¸þšœtÜŽ-ŠÂ÷¥jr ®õ!¯…¯àæèÿMKÕQÑ¿pÌšêfûiø¾?Ü¢:™ 8= ê-—Û¶VÚMz`ó}z¬ù´Q ´Bãoªèz¯qJg„ýé¥÷*¹¹ £¦:äþÞý%ˆ­‰ß a@剱¿!Ê9®°ŽVÕ êÈ?«Kv¾W—Bþí‡èÊ\ã×øëÆ‡°À(³¦PnúH-RÖð±µÎÐ5˜“ë5EhêÕ“ÔÀŠû¨¥GðZšËOíy§M]ó>OH&ò–˜FQêÎÖ “°Î $:¿ ©ÿ\”H0>mý¢‚˜&ÔÄ8K«Nø’“ù˜ ñ~­­[Œ¢Ù‹Žœt°%~A;Ŷ¾Gœ#†H¡†Êqvð CÊ|¸zw¥žÏ2 Ìüö€õnÛÀ‡Éu­¹•”¹Fx*•Dý™\Ìù§yáý.7£Xêm靸ÊNTÖòäî°a¾ŽI]¯â,8÷Ÿqç¸ñ€þ~ìSþû,°E/Èv1Š¢QTì½8Ÿ‡-˜»ÊŒÁ2á;ä nŸlîÞ¸ m+‘§’U‚]²Qª//Ü ÷:Õ@ôÿžg ½îÅÍf‡§f>`†Ì Cv¤~ŒØhF“»åšIwÙå,÷ýøÌíqXŽw·rÙ¨LÊ´m^µÐÅ YšN‚Ê¡ªÑWBAálÀÞ›öKlåx0{p}ùŽžZNx1Ïx–Q\p©@•÷‚"c]_ãS  mf}¬±<-b­eçîÌLj·¼{ð2ܲ"MÚýã[К$~~çÔt7KŽôZ‘¶#;!kÏ…ðóí„xNþk“ö¯ ö¯íý'}râ¾NnÿáU¿åTlÊc©ÅÉ%žÿîVgöçþÖ—åã%e‚1MZó©óˆÍûõÚçk\ã×ø©ñ1 jó]Ž:CƒÃu²#E_T‹T¨œ¡1h—.׫Z´‘u;˜m=Š&Vz­LQ&eî[»§¥—†ÞwHƒü j¸pe³e ,ý ôFÊϹQh†Rªpÿ‡ÜcŒ›ª½3b|yNæ0ðÅO®“rÞpX&ž…Ta:˜pаè|`ÖŸÕÇë®N• Ïìê‹òN.8’jµaïÃ9æ Ž›'ÑÊD>º—ŸŽ‹Fn,±ßC:•„i‹Ϧ;&-DäZfÿKÊšq‰&]°"|î³4ÃäœòñŒÈÔ’á<ä¸?0¾›b]z{Äu%mŒg,qâ4÷ÈåT:ÌÏ*Ož IDAT®!úγá-ᤳ€M8efÆm<#çù.pÚù¸(ƒ´ ËnîØÂE/'㛫h4%¶x¼». @¼j­íe–'š#úT:Ì@ÍO%ºP-­1È:Z†ªÓG‰¸)èëäî¾ö?ª ˆ¬©)qXíëZp·ã±{HÕÐÓ3öxájJÊÞ˜ãïæ¤ìEÛD  Ò䙆O潊Q ¹¸\ÀIB8½õñÀL×-PÌH‘ <›¥ -È‚!õ²{˜xîÏþðÓk=÷¼,ƒ™fEj':·øþY••g”EåØ_ 9Ðua¤~öi¾Védº¥Âʱɼ?r–åš_µ ìkJàsBBÎn9¬ÎÖ'ý-]5|iGÓ»+¯ÿÈô_ã×ø—ÆGÄêÒ¼Š½ ;g’hã_Už*ä¶ eáb–—¢€òUÕkÙÒƒã,dæ(‡©"GtÓÞ÷<:Fò§óç’—¹v¹ÐVúC 9OdE¯\ŪvEø©§ôs±ØÊŸzìÆÑz„ž8h줳Ÿ’-Pˆ" ÃH÷‹ó"õÒôí£’°3Òår+ ˜èu³@L¾˜aøEÁOžpØðô¯ð0¢Àò[E- çÈéÛ8†…+ ¤=›'ĤÙÆœƒÅ¤·QCáguj&†RšÒî­ó51 ’‡Áû¸sÜ)2`ÜpVó!»}Ì(µfxˆ—dìt ÿßô PD›Ó`CKLoRT±‰o€fšjš]hòš’=ŸéÛvCeªc¤þnR€¤#K‰°K|sc€°;:íO¤z…zeáñÓ(= U!ñÀr“ØÞŽ[Ò¥L pá^€_h< ›ã\‘R¤ÏÍ@_F@4M2’¹ìÊÞª”Íâ,2aUª]\*SC¤gÙ5‚F¬Š?8ÃS¶ù6fê¯KÍ[é8¨u³j‹éœ÷&}áçPTµÛsþ-95+Òªßþ?ÿì”E!åäG9b6ëæØ¬ª®b1ù¬1Øäÿâ_Mƒì¶\ Õ57µQ¡“IKz Þ+5ô¥3óƒg‡ÕU±¬$ü¢s5ý|Fü1áÚaÔö“/¼ùèpŒ?b\·uV®œÀ5®q¿v|ŒÂu&Ï :HC•ÉgX-SŒäý“Šúÿ]×óÞ¹)c¤8&(|Åʤ¡ÕÓ[‹iP¼{Ðçò„M˜ ÌŠWk6Ò ¢VØHü·¬ ¡˜Q`„cj²À“#šŸ-.|}nY#Y¨5 j96‰‘Ltˆ[ÆŒ>•·¹í ïÑ #ÄjHfŽVƒNhe€IRBÐæÐqÅÜÆ©Õh–•Å­S_Ø\ e*âì;˜Øry«ujÐ÷”Hƒ9“)o2”“d0õDC“÷y_'hI– –(ùêÀ2‰ØZ ׿›;²ìÖkŠeqÐĸHµ~„èºÝ¢í}#DÌGK>>YÏ -X×è¿&2IÔÊm¡Eä31EÑTÒ9ÉÎñHJ$|!õÔô±5G»šGθzúÊýcÏ£ÇsÑîRÄ9Œÿ÷ PÂþ?ŽÌnBÓ|îjöCêRê´¦|5šÀg(8X6|ì„xhwæ®Ïü¯ŽèVðsBŸØÖ+VsÉæ»›ZzMï ­ìyNàÖ`{na4÷ìÚ+8×írp6‡kÐY-¾ãÌɼ—4]ÞÉ tå®qküµã£4ŽHš„S{JüDÉDuK~·‡«•ue×#¢ÏAˆ1“6¡«·­[›Àƒ2ªdÙb<½uÄŸ²½·ØVð­‘½JÌ…†ï¥-D]g~äb‹ÃŒª-}@~·ðg„:Ë£´!µè±`U¢€~t™NX“é›#*‘âäeæP™¥lly ™HàŽXæéµ¸5‹‘êpl„ƒxLémxxe-›ä@ºÔK¨™ÔŒ§dáš„ ž*ä³ÿ‰0[‚§å Œ+GŠÎÙ:;'·¹Ÿ<ŒªöY«îE’¡öžý¹»|BŽ»ÉaÜàØän¾Ùâèœø­•a\X’ú—%½{;PÁ£cf‚d|'„[èî—øsT= uºš/¶·ÌZ,ŠTþ<(D웜A¦½¢°Ág¨6m¦a°Y=NPMsÊF[¯½åÓ ` „jÿà ÇÿŠ*Œ7Þ#&Å?Œ==arh;[ß–§Èi”<_³³7L5™°sOñ],s»¯  7×hÄ“Ž7dœ^i&8'û¨UÚ¸ivk·iLzúDÑ÷jêZ8ƒXž¨é³åM5w¦÷Y+ÿ&ÈvLÜÔ”é.NOú„:€Ê0Šè’CÑiRG7ü·?ߺ‘d\Sžln¤55Ùs¼šõÙ¹G€"Â}Ãw/|¨M„°òÕSùÛN‹Å[M5÷Ì_ ?{˜V:ršF„©ˆãl^±™×¸Æ5®ñ'¬ Äf€óƒµšA‚?äDÿéA½ÇKÁ õDj—Qê"|èúF®‚2÷ú+~îÂÌLJVG"’2;ŒSô8ÞwÉ„r“ݵo—7`U2™o;Ö=7œâDMðYå×Ïõ4³ÅmŤ"K•ºÊ Ó[²Ræ!Űqé7Ńs†[)7ƒ ÃTýíeì8(¾½€>%pN”I=Ê|[ø÷,ßcF%-a¦KÍ—„Fmø¶8¾Ej D†ó]y6ùQ¡0 VeXXП£•R›:”Ò¬ ÎråK炞BiMGìÛ7Å{¾™—#&vަ2à´'+¼©‰Ç©jiHM§{ÄJdžÚ›‚}üo“üè¸zîîoý£¿*4s…°~T¢^ï„h¿ý/ Ç6êVÿ@•ù†‰‘'&Zú*[öt¥ûŽk{s{‘j9Àn/¥Æ¦k\ã×øïŒé¥è€+Z’a‹a` {寕þ""$Hç1Äðõ}BB…‹-^+Ëu7¶fŠ g‘V{Ä;‰ýåIOÁaÃQvg2çqBBÔ&S¤rz;Ó‹ ãJòzûMAW0|Üç¦M"œ‡{Ô±îÖ̤ÌÀ9Êe:73ïõÁ@ˆ¾ ±¥þ}.SäXÍLÛÃâD,;?5CE¦ýåðrÖøÂ…IÁcckcO3™O Q&¼Šå엢݄ŠçóÚy>^„½:&GjNZPŒõîMÄVFeÆxø|þÀ}æ^sLay°xO:÷>~’O/õÞ6™fÖOâ[ÐK`õ¯öä9Õô}¨;ëþš;±kHÍV±0›h÷ÊÞZìßD£Ï{?Új¨¸Õ§|PÅP|áä¼×:pù¿¼’ØV@EǕբ.ªµ'¹P‚ñ²]ãûV/-Üö¸ÌÎ5®q¿|4× úxÃTq†€Pö,[d9SÙFº|™9PJb#¡Ãš}»¦™thÍÃw Æ]µ¥ß™ ÊËŒTM#÷ªã7Šîx!Ð*DwÍ ™¼ˆ7ª¤Îˆ¤%Ý7pŸ£ZýàAè ²¡FœàT@ý°;––WePp›_OãA› WÂOÅÉ è2+§^Ÿ•›6óo7y‰0†[ú/ìÂc~îcÂ:!$8šëX ¤ Ö4—RqºÚg¹ú ^±ƒ†à©¹!î4_õ‰¬Ê^Êll†ýŒ“ d¤ó¿ m>V£ÌÒÑ#ùôäóu0éÛ‚PÚ„"æEÕy}JÃÁó9pÒ‹ÍElÅ û'ê§Šo¡p[—Wž…&Ž@Ì#†àÜøEp¦½Á¸ÕsÒð³7tªÌªA6¦F<7"‚À\윯\ÝÙO YTÏfò –JîPÐ…Ìõ0G.-óu{ ‚ YDŸª®ã=âH`RÛ Š¦pØÞì_GûîìÌ¢Vó¤‹Å‡å‡}†*ÓC1ôëÅ& G÷ “(¾hÞšg+PÒòtøãDu+5Vå™ANh–‰zÿC¹»)GjmWe‹ó*£~$®øâ;èÒ»0¬7ÀþO¡HeÖ‡“·ßÂí?û-’4½=3ÇÉSÒÀ1W©¢ðäÄ]cs£rmQï:Ô™óÓÄ÷¥Ù4ËÞ¶…°ƒWÍ—€×–¾“ûWêÒµ+¬%~æ¸X¸f—¾õ\ç&“•ô*_¬6¸Æ5®qß4>²ƒ ®8ÅR¬§6!kg=¡I*NW›.ª’*d=ËËÓ…=bã\dJÃYö6‡tÅ×Õ†Oß@le)(‹;,sÙk¬ÕPsôPÒècu©óùIÄ*hãƲˆ@9ƒffƒ&·t0YðÇ7ê¸õ­³ ~‰#?S/«ª§..%üä£P×*M$Å JýÜãi»4Fb Ž<"9*]éÌÎóÓ™›ç¨A%xT&‹@ Ð…' qXÁáÔ=à#LHpžƒ8ä<4y 7·žœI?vx•0ÀñÀúшS|… <³P>TBGBˆ-dc×}Q6uæ‚êÃ!a­AÖxqÑ„¡y›ïlGþ.‰hZmÔ¾~a,šnChŸ³¹ªž{Ô-U}Opo‰']gh‘Ö˜W¥ÿ5®qÿÄø`ªŠ‚=TØßâµW…µ½Jð‚ŸÙ Å(pÐuÏ÷ÒÝySîÔ¨ª'Ålg©Å†4¥R1ŸD¢,£³a0"¿¼¥"i¢|_£tªÈ8ðl–ôÜ1¢P}[rvƒ0læÙ_Ù0n‡Ð©5ÈW†-‡(—gCWÛÙšq*.l±^•´ÔZ­&CsÉçºÀÅ–Ç7[A<ª;þë=?F»yºÀJ³Eåj{”3Ùç°4ȸì‹ßÄÓ×åIIýIè ²I™3ÝtÕUy@ç€2¤lwìâmì‰/Ð~ÞÉíÖìQ‘p÷: ¹•:,±§Ì±ÃÃ"†X‘ñR2WáÖƒ,=ÞGxPØ1)ò[ÙIn4È)÷s¢˜½hÍì®Ö‡kË jòEŸ/ÒÒÙ¢|ðm“~f ÇÝǤÏ3¶¤¶Š? âIÂÿy-€1“"+Ê;JZU&’'œXòtwΡrìYLԚ،Ë. ÿ Ètý_ýt²ÏäNš‚'öÕÕ.’Á|ê–ï&…;ÓôDâVuÚNøÔÆ dGïsn>õ\[z=ÁR_>×jA®qk\ãïù"Ãpušƒªæ'.Ü)%Úªm_všÍø)5l<ÔØÎÄó;œ»aµÈèYY€XÓµ [ÆæÒ¼$Ï(©c(.DÌ ³{Ž#æfÎEiC¥*p$EÊ¢Ê9¤ëE×0 ™_úÈgŒâ&…·Ž¡BÑ ¼KHDf¤Éõõ›¨Þ'ãepg)q€³ùEìv"]ñ,}ŸÊܽFçåö¿;¬òjíÿa$)ú  rÍ:Ñ%ÿÏlÁóÔ„3ÅåØžœª¼SGÎãÇA¾/aˆòei ê '×5GÃkŒóí¨Õâ£F˜®]à‹P¨Ðϸÿð93‹þß=ƒLU/«ôXƒ~úàGp\xR  ý'ŸLèùúã ±Žñr:¢€mDgTúö‹Õ½ÝE1ïf¼oBXøjbwÈ’á÷A Ï–â¨á(e´Î(±ƒ=»¢P`Þ‹ØXÌT aŸ‡¨e^'u A}Ñ'wä,oU]­ŸR¤Ym )Œ9Ñ~¯ +-! 2ªšÄ2pÑŠÁ¢¬íwÀ«ùêFc¶úÞFs¦Ü»PÍÜ9X;øêå¸,u;”@EO$6­Ö@ÍaØ\ú\Gý65ˆWòå÷C¸DÚŠY­¥3Ö«€ ²®Xr¼×WêO ŽMÀzú)Ln*Œ%ñ¤#· /•gµv{É4âùéêüX8áÌ–rZ4õ™€¢~?»÷ðÄzs–Æ‹”ö6GÛ\´î.«tk\ãߣÀþ8f 3ɃÜ`R£Š]ùM:ðaT]È‹QŸgãîÄQ}Uòä*¡¨ºeâßÈu¬Zç E²Q œÎL}²¥09ÜˆÈ m[œ|ÎW<·fcÇ‘dDM,ŠŽøD,sú•ŠN81pßg‚ÚÌ ¥^œA¶1yÁ…ן©¹“uàÇF÷¼Â2âi$ñFuœs¡h¨ß¼Ï,ƒ7i² ðòM¦£Bïx¦÷«×¤™°WÌBúæÜÞËí32†Ý›Vó!½­AvÊÉ¡Íâèãö|ÊX„Š|¥ÒPŸK™?<Û žM±CdQ‘ÌbÿȆžìsT×Ä:X–zŒJzeü÷˜:œ‡çž*š×ôX=Ȭûˆtd¹ºÿDÿMÂŒœ£Óò[ôÌø(¦Ñ¹M :º8ò«Q·t`аmdT7 øKlÞŠ1ÙO‹TÇ­ž-—k› e>‘¤ ói@®{{²ô-l#];Ûµp™~ºÃF*Ï6gI)¦"x—AÊ^¶¤h'ay—G_eør–Ñ6®ÕºâÎ¥Ú±(ËXxéÀRÒ™±LH_ö%b%C&}é•Pت~Ó2iYu/±atÔ¨pÕ·SÕ•åç§À(×v.žZ/œí»~è»'a;}3¨}ŒÞDí.¸Íâ¦1úÇ ï…—x*•²%ðÒg…A±Ä˜6H]öâ׸Æ5žÁ;͵r˜9˜™fÞY,5ˆß’Ú!Âã“NŠ™p0 ·z<®ñ¼Cq·Œ ޾lV®9 Ø"ä¶Ï ÛÍdÞ=òH5-»÷,šh1°K߆ì>f¥_v0Áð †äõF‘J)ÛØSM©ÔW ç@€•žþT±ÅÝ<Рk¶4•¢Ú*¥‘1”n§«p|Ó*+’ GnK•°XRcˆØq>÷‘ÉY¢Ž¯ƒ“—>Ã"M%”ì` ÊñÐÔÎÓ”Á$$†ç+°TûG¢â$…÷¹.÷ ¶å 'P¸4i^ ¢À û…cœÞ;©3½Ê7spLÕí)Hp<Ý=¾U¾k$K²U¶„Hîþ*®ÓpÝRÇœÈóàYvr7©ÂæƒÛý n’;S´:)>(»ðë±viÆé SD×b˜sÎRBöoC惬 z„ÔÿKH`#]@+¶=¤÷޵ÆNY¬ìæÌÿi•0Ç2¶q>aÕr0¡§B{ŒÔÆÑø ŸÌsƒç&ô’¥š¦É׫[Z hR·qè«›ZaZjM/A›ÉbG1yÅõ¢lÖi<ÎVÍXÔ¦¼ˆ‚™F.¢>þíÜÓ|¾0‰ºw‚s²jé›ý÷bª@L ²{&ñýzóküMøÜfØ)Ò-+ðëè?¾“z ͽ•©$Ywä´^2f—D“ì|eNPÓ`Îùú›ãØyI}%Íݫ˂]ã×øçÆlðémâTZðÖ¼á¢Sy]Ñ ¡£õ†+±¯ÐMûÖ»7uâb¤Å¦¿Y°K[“»Ò5_ëˆ ¡Æ4¸4qçÚ˜k»±mSH"Ï\çi©üO–±“ {U?‚úDF·1°èypâ£ÀÔ&‚M7·*¨‡”Ë÷GáÇS;«Uƒ†C?¹ás/N°øK ®v<éC»’vç ,hÞe$-Vnýñ5wƒÛ¾ †ÂÂW¶ 4¾ùÙ@‡ÕJæð•³ &2ößT¡ O}{A.$§Ÿ+]<ÅâJš{ ‚ä-,eà÷Ðu×ë|¹dÒè@¯0Ÿ¦ÑæÀï^ûäó]Ø&fQ\…Qh³€s%x—GŒÝ·1Ç e}ŒöI/Ôѵ ÚdO݉±nkÅf1†‘g´ .+ y¶/£¹³’~8FÕhJ’Ý·!Úp«mƒ•ÝPt³e-zTÔüõ¯œz$,›cäÝ<ë';ëI&•SóÞà˜##«%þâ–(vìo[<³ŒÇ…Ó¥/¥B›dÙ™ÓÜAOƒ6g>ÑáOq ÖùO„ÎGv¤;S@©Eß³Ðö¡[Ä$\eñ©ÂºOûÛË“+ÁY¬™=‡û;dKôŸo˜˜ïš~ºK“0Þx^Å!¹ÁƒôÚ„Ì!Žâ»^Êq̪9ØdZƒ~²«à׸Æm|4ö±Á|+VVÔf·bÞ€ àk!"íª8&SÞ1ÀVW{¨¥M8Ñ¢ ÔÚdº£Áœ:Ø53,HËÏçi¬Š5 ÀyÝå͹ãfqÄ[¤Ãc¥.âèˢײÃdÍ…Íjr'îµñ3²,°Þ;¦þÑ5•ï\±T…ùaáb °uaêÜÙ7%.Öµ¥e´vå’PÉ2L¹1[¢fž3üPº zËb‚¥4õ€a¼ñHÖIƒÃŒÛº)}®¬cº×r:‘¢7——ž¥ô¦²>tð”fîÅõeæâ7j]n‰¾$³Ž”ó•#KCá? µüÆ‚bu™‡ÂÞ˜–+/("Œ"y{ãø«+9€"“0TÀŽÑž”0•kÿ9-2nQ±HqÖVY7Ie‘\ ?A|cjË N? ´¥‘âD{¡ EoÈyQÜ/è¾µ^¡Þù[§Óñk'Ó\ØÛ¡–Oëîqm£õ­ü4ŒZ®Ü´;KgT<É”é>°j¤—)& vævîgß1t¦€¤“$?Ü1“·M™ï"‹Œ…;ýXð,Läê,a*‹Íb2ÿ±ñ‹u‰·ak*Çc7ÂÂÚt±®Uçï]&âÛž0ÃŒ7 s þ@¼iZ°ìx­ö¤-äDBR=õžŠDñ¹Æ5®ñßÖ‡CÃó[8žºKZñW¢¿6¼ Î\Õ6ëËZ–V¥Œ€&PbKL¥…ÕZ]+ô¸#˦½àU”rLJ'ð‘dê3 iTB]´O¼Ñ¬+𽱟h!?`—žE‘gCÏÏ€å’û÷wÄÊ8-œì'V€Xõá[Ò ×R(!wVPl IDATtZÊ´ª[å}âËËNë\Ç,| zž\;Œèw2'­±•\ <ÄÒ‡“†nj ù`¾‚a™Ï4J÷ñ R7©PJ§ ËáìÄÎA î3E.<[̵ókùÁ\R¤²½ŠÍfG޵ qˆPuÆ\-€Ð¹êHbæù“ÀGpmÉ )LJ¦ˆ®{Ú@Ìnµï{‘[¾LŠï³Ôt«¤"ÔêIíò×}%œ–[Är½9ÚW›£œÜe‚*Ê·`b5ȼÝRB÷‘÷¢úÎ2ûÏ´EM:Ó«jYÖTl+(Â^~ÁbÀMŠ‹[è‡SÙºp·&ÁIv¤wO%¨[—r‡@ãZC ÌL…ôYsN¡`{ora±èò¾ÉDÚÌ‘†;xѽò ÎÀn݇ûý¾º×›:ŒþÆ ×2–ù$`÷{wwêŸx¼g»¶ùÔëœ<õpšlDȱö°|fžã×ò ßižø}Ë—+~†­ é$Ò•Ú"8ž|ߢ®Ž0§ÀzÜ?Ê”j[è upòÇ'>FQ¨¶¢ýZÔUN>Ç¡é§u^Ÿ¦ëhÁ¼èøn¦ö&J½ëû£q0ª¹-)¼×H-FµRO&mNNU„iŽ~W%sªž}«“쓯ipœÌ8_è…«›ÍéF'Š[^®cÃ6ŽÒ*Ž*åí ÏÛæ3ë™Ð ¯…<i®z®Ñöö]²—bzÉ£™äãúøa¬eü€o4áìQŸ†\€7`qÈG J#3öb² 7¬­]y?–’'>?‹ ææD¯Õˆ¬ÇïþALíoQ1æx…°•O¿›—žOÌ9^Øt¯­#~rwA99\Ç·ž/=2´›¹÷Å¥xÁ´çïÝÿîk\ã?4>26Ê*mn¸8ÒeŠ6O”‘ ¥Ä\í/A òRðA6Œh[…}𹋡j“OXƒ¼­5²,¹_3`]v1r€¯Óáp¤ÀÍt[.²ŽüTË0’"E½RÌ;q~ä¤ópÒ¡ 2ƒCz`˜9NŒV®5{-}ÂzÓer–¾*¶hMø‰ ^CU#"W‰~­Ô‹SÈO) ’ÊÞmÔ †;0w稞•2µËøùœ÷1î7@W9Œ²P‘ ⧦â(™^à ½ó—œÀ=cÐn³hùwLêsz?³÷ÿgïÚ–\×uœÓÿÿÇÌC'6/ %;éÛÚVMM½:qlY¢H ³;ð*åB;˜}îË5´l¤@ûÜbÏ47Ö¹áÙ@ MOë3¨;îɤ* òf6s1Å+­%JŸ6•i*²‰Ž,÷ˆÜz}?E ωvËK›¹žTðJ!@ÉçÆûŽÓX1WPÛ=‡²™óë’tc_±¬Mhy#œmün\@uf‡È–ä¦ê¨rØHNFYù!+¸@ÕóBßeÀŠ7˜Ü4¡¾ê3²¦UîjèéÕå¢ô–amÓÙý!%りBT£4H†®Z(æ„l=”<òšAÀ¬²ôÕ6ˆÄ›¶¦ýn1™bm‹ª1X1¥œ­´#[ ‹øtlòï@j'ÃÁ:bÅñgÅ9~•°š±È¿sz+1¼7ѽmLÝ(†úà~ãjìƒ2y«d›OƧ;_T`Õ‰ö/ø§ŒÔ¿bi¯×qk|ËøÈÎ!+˜’ñµÞ9Y¦¥Pk´ö=Ãò‡‡e'ÏÛöæC,ꢲ‚¼¨w¡áÿ@˜h5ª¥$̱+ÜL¥9Lœ¸Aº€ÍëC‡ïôÎ}€„JV¥ŠÅ5õ wp–A7Õ}øêBOôî;¢_øù7tÅŹ–¾9Iîè?Œd®^sB„iÂ¥Ô*ž¡SMüI8%^¬ý:‘P—¡eú—iUïž #­‚gØÇJd‹%Îý¡–}à=÷É$îìL¬“­îYõCìþ›OŽG>Ë]9Ü®_û6îÿcY^q¡”,ꊟ” ¶´'c83…PÈ¿¢RÈNÚüŸo-˜à0š%à"-#wXð+`ŠÅµá_ý';Ð @ðf‰þ€ñó2¼g:¯#YÊóó¥úNŠ·5PêUIШ 7m«jœ†ÒªGàðܹ,Ü‘‹¨åFȾ£àðBJA¼:D­„k±Úbã(ý’#áCÏ’†¥Ž‹Û˦Ëôœ!ªþƒ=™dXóêÈËÀ=4Zl”]?Aøw?ÆÁ€hW=ø+N¬h¹-Ÿ°z›¬5i„ÛŒ {¬[—¤úQWðœÀ%QÞÃxð#%ÜÙ´R£e´Gâqj"®ßx•ðȳÐW½?H½˜þ^Äx¤ÆúõÜEtœzú¥"€ÞšTØúÅ+M6×îG4ÊŽRËbŠïßò Dòý0TW-ÆLX¨¹è2ÿÞ·¥èÞ¶ò¯µrt|Ø–p$OWÀd,P€'üõ}հ䫘ŸõWB9R™«ô(‹R7î$&ÉÁ|öB ƒÅIh),2š”uîâó=Ò•snqûŽ}ÀEÔSy7fÐáhXDt]5ß” œ¼£Œˆx¦šiÔ55²…?oØÔ0{ì¯ÌÄ[_ØÞëªeÐàwè{D|¤àÈr†dŸ/˜‚°ìÇ:¹ÁpÅõl¥.»#öøÄÖ­ÐaÁý„ŒŠ£:â¶e2o [£ åòn¹È¾!%§‹+B˜ñøi˜6‹*¶4= TµÕPwX.Ïõ´‘t¡Wd‚®|šÞ¾ ³7c]v¢ÖÙÎŽuÑ71xxËîܽà: Õ }rwìGUHA=@X¼ÆiáSܘ 9µ4A,¹#iu§ùŽpÝï#dû6³Ò8D)9µ’9œžtû¡¸DÂÔï>Tá<\èîÎ1”m@+~Ñ™€~+aFÎ1È#™\,´'-ê0Þ;¡…ž¾šh<ØzÅjßÑzg j•*ûpŽ£¹H˜× &LO'öO ŸE tåÚÒ‡£ ê"½MÜb¸Ýs•J(\º/€ „ÍR‹Ê[(”×&hø¬ùr¿X ÷݈'þÔs|óÝ"ú/\ã;¿ù½¿Àú²XÛø5KÒ–Áy8¢¹3¾Îßú¬¡²ðü3û÷¿8~•>óµH®ñïŽ áI–Ø1-%@‰RÍ{Î ZC–ƒ‹R™&€¶,j;Îék¨sý>†Fpwèú÷Õç3Ž-`Yl¶pd×…t›1‹.I ®˜9Â*Àòž¨âb¥Ëж© z^¤Çñ¼R(V¸Œ'µ^.Eôÿ£ºU_)²ZÄ?ð¡“£„Ùf.Ù®Îj³MP|£S0+å!HåÞ©RO Í#Õç(ÚÇ>¯ã&ªá<®¸U+ÏÝi¼Þ¸;fŽ)˜Þäçñ,ª¡ÇÚœ,x”UáÅòhR¡áMJ1Òg8~MÛ”Vé^F ¿ÏBóSqçðýl5z73 8$hû-·Z饀íl0æ‰##TC]Kœ%Ý’ ¨¤ß̺…jÑÃŒ‡#ò¡EÅ:Dm‰AS„ :¯ÖL³š g ÂýcÛË©»ò“·Æ’{u¢€J'ƒ¾Ö³Y'’s`³ÉƒM¥*Ú«ÝÔöiMÃE6NÅëÆÚÕä’ IÜÁÎ-ä‘·Ç.ýØõRw ‹[aÊÀ,`·0zûΦð÷ÛðeßµcÙB|Ì-);YƈGÞ! <÷ëŠ]Íu‡ù7°ÿÿŽžÁ[.&DÏÃðË ¾lö½¤V«Šyê•ó Û§²T„µV_&M˜PÓGàKE*×øÆè׸ÆÂøÈJk¾¥mPž}ã&‚¡ðÐâ„åá-Ù'2ïJ!#œõ½îE(Ò€±~pÂk®À Ø{Ïc|;SAˆ¤ÃIž.¦IrÝ=GÅñ>FWu("Ø!*ø’DÊsHÅwe¯JÙ1«ÈËÆµ\ áôEñìÞ‹¼;ú{ ©‹ÝÑ ·½Ì5-ÂrÈ3³Ý(GL‚äÎÄlG BßRˆÑ¤´ðˆ™æ>dat±ÿ>* ¯¤8Ë]Ü[:àˆ4¸ù–U¢Ðx ªÚÌ{Á®y¸zmÒ Q ýÿLìݲºovR¨£4ÈùdÑÙqo…nyˆp¶B6É5™J)8•û£uE(Ãj¦5ÂQ ˆ`hµÞboetÀÒ·°Ð2NÚÊY2ÃïÆŒ&uxN±Fò![þØ•uÇK§aéÛ¼hÀ!äš:ÉëW $®©ŒØC~™E°l@ìÏòiUø¢äÆ÷{€zNsP¹ú…0F^çœAT‚é«@²ø-“Ðe@ÿ‘šÿ‰Vü_Ĥ˜ '¿ ¯û2nª×MäOã’ÍU~Hž?zÎLÞ<{‹}áóuâk,Êï7µG8Ëxk\ãÿÖø#²Õoç“å·u$0 ɪY®a¼ˆÐ§ç4ÓwB¢ÂÔÇŸH>1B|Nê¡/÷kÃ'§èëKéÄÅ›?7¢/ê$GD4ÁôÝ0¯ª¿TdUä’X‰Bh.J1s®‰tÿÅ‘jIó]߉­/1oüÁúIsc†¨j뾆ÑCXŠÐ¦ðK'„4Ô>*ŠD$„u%k¨Æ‹+p·l>SÈJ£ˆký ÇùñRÚ B½Ž¸/Ñ®®t‹ Þëî½áß58û‡¿Y…Ê—o~)Uº²$ákã_dáfE~0t¸4 Ó—±.­þŽÞ=3§^àêݲ†,?Ùç2Gß•ø£ã,ƒâ5®qm|Xo›ŒDf¢çPm᪋€$ª²âËð¸á? ÿÂ…¶Y‡ZfˆA•œ‡Cçî!>xŽŽ~fŽÅ)TF!Ù `á€æ°K c¬‘Ýôli^„ƒ§üÄôo~Js9$³Š2D&)H{(N—rÈÚ}’¿Õáqj!m"çî]î—Ûœ8u@YS)aFì„pw…ÿ{”XߟUÏ{3Jp§îÈ·rɬV—Öj"ÁÓ„ÊŒÄA;͆[…ªXÆ7‹¡ä@O….zYÚ8aš~ƒ!O»{ý^¨üЦ†[º÷§5»=QæÿI@ÛZK3o¤îfÓTo*ˆoC¸X)ÏKbî0ÏtF/Å÷P•(ù§JàqÜ-]JÈr¨baR,ãP]>†è±«@P°lfÒñR°GCHÎCAÌŒÕzH‹Yª¬:÷‡²ÿ! ÎâX)t¦„'DµMr6HILŸÑJ4:ÌÜiê ÉwN£Éú¤€I1RÈÆõ¤ƒ0-;Úèà µTÁ,¾âÒ/›[Êç„]ôW4¡¡t†Ù1+ʆ^žñ÷Œè¬ú®VôÑHø#ÚƒlYÿ÷|Àl:_@>a(N¼©é¦æXv_DØ ÔYªÒ«L0{þÙez=›Çœç¿Á.òMÏl…ýj«§¥w×f€k“‚ka]C¾ÙC¹%~ÏvºÆ5þÀøè|ÌÀ¤Aç kö#qûd‹ú$ˆaæ²â ÛÉæØMd²•-’;%cã\ÏaVðø{©ºuב‰j¶† *ʈB¾¡'६ùA|‡[W¦?°””sTWH ~vCcD¯7S1Çûâ¿aðöxwŒÛÝâûp´+÷c Õ±¿­‚.¼hAu–cakhû`›KŒ·B"'<„?äƒÕÕ´_ñ7³u3b [\Ï^ÿQ¥Î»øŸô¢Ç°H_ÐÕ°ÊÆØëÊ?“9'9ª¬´(™ÃÚ7«mfͦI\c–R÷­êÐEIl3«ÛœÏ”B¶&VF’z‰k¢j#çut˜fàÕ`Ð7‹ ' euNHv¦ÍÁrö5Ç’5+ßTslÍuº:QD¡|»ðRÜsß…dË9œ·yÍQ¿!%DQtílÝ{ð ¦]uî°Õı»¨U”ÚCñÔO.ˆKd2É,rNÅqŸ“åâd_F#÷ sn Gõbv„#‘Äøfüó[<¬"E¶[W´MÛ‡å+P«6öåÐTáì¿5xjüf"ûƒ|‹³‘Žà0ÕVeþX]&¥[™ 9~öý"«O5ûìžk«qióÔݵ¿aïx¥k‹Ç>Xa5ã—µ]ã[íçè”–&ëÿ×ø¯ŽÄ¡c-è7†ähd %1wQõÆBé¥ÞÔ˜†+ÅýˆoÑ%<¬sƒ¢cÀÀLK-h\¨–CŽ*m%ûóéèõ?æw;àºò_‘©Lê¢LH™ÔÒšh?öè#Ö*J´¾‡=x´®¢-ñ7TA„N…‘z®çµ‡é‘QˆK“m¨ ‰€F¢§_§ÍÄ…}×ûÙ‹à”2»* çüÙßö齇•P˜Ð°œºˆEÚϺ󗞻ÙÊÁó×E\O 8ko ÑFlei££HNÕaßÍó"œŒ0Œ+Ô-qÎøS0øM𡳴›ÄuL­˜„ú•Ò ì¬..gPÀ¹Î œþ´†ÝTKr­ÏKÝù0¼{æõv¾÷è$Bå…Ái–â¶8­4§¤çÞ”é—ÂRåañ‚›é]>ª•ì~e¡Ø–8H<0૎g™.‘‘~&çzž)Ç’°óïŒÇA%µòœ0nsÊ[µ¶ûB|!š°½e¿X.šIfu®}ÏàïšáfÌ®ÀVüLë…/Q…|ßö ÞÎŽµvVá=o¬Ž¥¿nÕq–éY¸ÂDÞi%gè/`÷²ð׸Æ5–ÇG¬,.jÕ4Kyܳ„RT£ŽRBÙoé Whisàaîù~솢ú­ $: GqJ–hUU°§( =·˜ëdʇTKSÞÀXËßì`A¦GœÑÝVwŠ$“˜9ŠÍÚ¥`à•øW§ŶÚK½üH›®H$¥öÔ6¥ŸÅÑ4…l·?ý6îxÒŽ"A÷DzÎy©LZ2”DkO“™¾CÜ»—àaNPžEÎYÍ¿™=¡:¾¥šÂûEd£Ê±zNÈ|Iƒ[¹kڤ̒EÄÐî5mj“1¦B¿’(„Ÿ«m-Q-³2lKw]Å1£NI|›V°…B8êsª ?w9s‘;Mé·2!Ĥٛ³åÌz[앪 ";C*Ø?wÐÖ¾“O¨ LÍÍm»ÈÏxEƒƒy\÷ü3²­de‘ìºR=-ÛpD4v_pv&23­=w=²,·]´…ðy}o¯ö:ËV- Ø¼æC =·²™UoTIöI>@AüõÕ\6IŒaîA f½r«xí S¬E–æ ¶Æòl†üb@úú€{a%Ä’bœL*|³Âç÷óowaüW[£1‹éC¯Ž²ô_à,~:à•ýÿ¸!L¡É±Â‚…´üýãÇÞð¾Ý$Ÿ£t|^¾î׸Æ5®±8>\ÔM%NC…ÄÉ®4ul»hÈgd­:ÑlÑ·£¶PgƒÓΕ‡‡‰’i˜²ç1 ’“Ëö6ªSËP”g^á$U„·.!{‹svêªË{›UÎ=þTF,Z6ûûiäèX¤µ™þÊÐþ"'è‡Ç4JøŸWž²îèj½ ÊE•êÓINÖ•E¸¢(â§ìxtŒñ`ß:øÉt×)1ª‘AÞÌà$_eN„|â°wùr©4·£á…"Ö64úo•4Í4\Joä²eÏe´Ågê'¸ªªÀÀá¡ðêÙ(´.Ó´håaìð _9Sû0;u!sl5ËÉEijP­ Ds–cÜ!¨iš¢ÚAÓ“ÖO8³ð€aR‚—~a/ý¿ÔV¡ŠŠe–3=¹Mk «¢O±lʨÅGÒè>·Ú«É½P¶H™"וîy*VN´mž}ÂÌ} i¢F­Ž³èSAðní1¡AÞãç I0v`Ëú`¤;»Ý’¶ÀU–âÂÇí+ªeK&²öWd…LÉäJ´hKø«FæÌ$@LšÄ 6‘¤lžõön›Îk«ßu¸Q—ú+"’ù\àø,9Ý9óÄ_¥òäÈê ËÞg¸?2Í ´°§øvòð,× “«¦M2y6¹ñ"hm9Üpêú{†“ŠÙ|˜ªdË%5LàÎqãCcvøªXôy,:2åÍžætRcÃÊÂTs„ᡲJ0uâ¢*‡ž®7U¡†~#¤ì”d?CÀÍS– L/š;¾38ŸwxÈ]¶´APaäÏÂ#±´'wÜRA=Èg€Pd÷›ÝöjŠÂz°ÇÙT €g‹ µî4ÒÚÅb|a° iÙÿºÔ:hÆ‚“ÐíæíÙrl0v§SZCJ#ÑÇlûÞ vu"¶ *ù5&n4ûGåyß…6%É~3 vQFJ4õ¹QÝÕ$Do‘›ŸÌ'W!§Haí¡Ú.¡ú0#­Ö¦!,Äb]©}NŸ:ª¾r(Ï{SÄ0}@jÿ,% ¾„"œÈk{ÖX¯»"¡ì½:À¿Š˜àKîšï£â‡V±ÚvPi…Ç¿€âõ¸íä_LÑÌv6§MÖÞ&¬¤ûð½Æãu^Ÿn ¿œ¸î¢Ð¾ÿE¼áf_õ¶T"ü´×Ö•,äÇWº³ÌN׸Æ5®ñûÇG6seÏ‚§©Œ©]–ýZÞêÌ‘BU©Çþ¦àË¡Ø{1jeQHÛ¯'˜¬¢'Þ~¬éaGbrhü°9¿|å²ðÒì_ m¦h€¢6p¨º*PT J¼†U÷R2,ÛÕE²ó¦‚î4™*XM¾¯©qæ,£ÔR™Œ]u%AAÕW‹„oa‡™î·û†îTJ0“±p¦Ë-À&ñê~¶AŠê2y€ÂR;ˆsí[q7Ú¥ãùßÑ3N¨·„çäÛ>ÿÑ6EÕð¦=Û¼ÊQlB…á­ðÏMÁM*&li®ùßêŽX&óÉÒ÷#‰>[‰à]•ææ4Ï„÷Áf[=щ@³#b K¡C±3Ùˆ‰’'΃·Øï²rèTr;RÝ‚0gà*³›HÔa’8 TtÖ±¸uŠŒªaÑ¿qG9âË„Š2ötÚP€ÚAáÝv8ŠFf!í|V…¨ÃêL&Rà`ßÖWÉ,åÿ¼Ikp L…’ÆXd¹¦Ì¹NàŒtàøÚÍ` š§®l”I0Ð4 ú»ÖUù éC½¹‹w˜hÄ´ðÒo™È/AèþëXçÑ´È€+ÖÒîñ¼›†žÖ¿bQ ööÙÀÙzQžØÛº Pοaka‚ŒBh7†½EÉ¢{‚ÀrÀ²3ÕB½Ðÿk\ã|ØVnŽÄõßœ°(ÁÆíS[“ˆ Õñ`çâ² èÙ  F_rDź~mÌŠõ6WIõdÌ©…U€€„£¡ÅÙ¢ì´ÀNG;P¿Áüå°ú±¦ôR/Î 3àkè”cU¼ŒöÏÆ&U=Åô›(/˜…‚n„œˆÂ+ìa§¬Š 1ñïO·²S8™­%Ëô?%#›Ššù¾{à Æ:„JÅe ¾û¿þN^£)áÑ5m•XëHŸïˆæPØÖXåwÐ!Ä{føÍ @ÕÌM…à4Ý]1xa˨¸Ltsò Ê?=YÆ8ÛÓö5Ä5®qküã#dÎDÕ1:%^iâ%ûnÏ'°Ô1½r$X…¢mÇŠˆœr†€$ÞH´o‘XÍ#d_ÇÌ}(¢{©2ÿÛ[n‹(™*4·VîŽ,âhƒ§åÕÊ«@z‰ !¥èC÷ ŠK]h3ÖâÃUìn«w¹2éZfÎ1©FÙ"qT€éº¶—p÷ŒïÎ…ÂUù;Ëzñ šïøûl ¡ö7b%˜mø¹l:ÄÊx,6xVŽtf„ˆ¹™ºïRñ5‡p©þwÅiÞ à-)":¥LuüæÞP{e¯nË¢ÑÇftäNAÃÇî¡7¸ÛHçúñ·,”̓vrÐÛFß`‚µrŒq÷ÒÐéÌ ˆ¶ÝƒH‰ÛíR¬z¢mê6t`oHÛ¾†US_¡Ë@"šuïÈkYWrbÓ寂œ†‡›çC LOÚâˬ„”Í'ì¢I ŠçgÕ}êÚÐS\xXÖÕ :Ù—òq¯Ìd5xÒ²ÿt!(»Ä>/–q.ÄᢓÆÏ‘8üS-ÈѺ Ñ[^'á…Á/™¶dyæŠ~Ü óbÉšÀO[Vz?ˆåqùO?Ša†?J×âßEsÏïºÃïA¥Ù¯aµPG Z©þà¦d6ø^uItÊob}é¿s"$œ7Óœ«Ò:Æzêzñ• :W‹Qç¬÷mÖßŔɧÈûâÝï÷…q{ùBÿ¯qkü+ã£Ô\‘Wq>ä–Ã&H›vÕIÄ_°|0rÐOA²8³Ñé,Þ¶>9§‹#u'4ÎGÛ59©¦m`‚.P‹¡þƧq/ ’U¤È¾„_¤â}Ò)©¹ƒG(nKßcû4§@%E»‘e (ž]&4AôØ–ªšyL5º•Åd„ËØ‹ÛÿaÚ¶šâóßÌ9R/.¼!¨[ß@€ªmb¶ò9<Ö\xdÊóÃH‚x½a ©=ú`D˲Ív«²gXžék‹>ñ†$‡ !a7l*ã…iþØ.Bˆ@C Ä0Öƒæëâ©£h§*Œ.ŠpLkhæ.üËÇ;uIh{ÅŒ3¦¶!yâHժŧב«ð»­ËçqeÖg„Ý®´E»¡)…¥FÑ/hƒ+᥇¶§+ 0‚ÒT›ô…Ò€œœJçF¼_¶`3ÿ9ŒGLçc¡½“ù0ã.ñ"W²MÒXr­è-[p0è—BT3½õ8 ÏU#ºtiñÏð…ÛáÄ™ §ßt½ê&s_†Á~ÕOSsœÂï\Îû%9o¦#ú…Ç œ½¸°Žf˜89Pd ¢¿:M¥`Ä-Þ*ü©ÉúY1¾hi½–Ø;¶ùŽàa£Ñ^äI<Üù„62ê­eîG<¨Qòνn–ùÿŠîú5®qb|TðAIŒc*vu;R$Ã2Xä?eíY­p ʧX©&[?ùPÇ?¡øQ–lÏrÎyrGñtS¬|x¢$*žëð/¢ªhÞ¨ÎKˆÎ Q­¯Ð¥à^pæÅ ÕJ:¼4€;f¯è‰ZâæÚ vzÇu—™0\ˆ(=íÀæ.Wµÿ5(°“Kxö˜—u7X¸«éftŒ ë=¼ ¬%S¢xÑ¡(<³\±1rm~fƒ^ qýz â.àyoc363v^ûÝã°RYÄb>¼Õ{‚±³õo»š†gz…'–éu°3&Eƒ…ÅÍêWõ†_Û„Vƒcï©ú‡È„Ãò)€q7›3×ç–¯ò+Óf豨ª2s¹³€²0ÜvÃlßæ‰ ì‰aß+'%L¥¬ÅÚÁUã œ÷ò¾Ò¨WþnTg‰ ç¢ëDqÔn몄!VXþ w$»TÇìŽù‡K {Ûv¸„™ŠžU Ü…¯…ç¥=3×ÐPu‹Öއ}6”?ÔçêS)å›’OȸO3ÝY¤}J®MÅÚ ¸ªˆ¾ó¯åŽHìvz±ý¥ñþÞ‚é™ûƒûŒî×­žÖTMê¶ç•+Æg”‘àJDy˜bèÈ ‰»‰®¶µ%Œ±Ïùû:øP”aâé?R?"Xà…W°l¨§}\üJ)`(`¤øiáZ T™^/çÖßÂÂtk\ã¿{|XI^44ñ ê+UÕ^$ŒF)€uÙ×qéJ `…Òtÿ<–]‡ÌÚM:½ÉWZ8ž’Aú˜†éWÓ•³ÛSù‰®1e0ÚHeÇ÷Î;?›df~“Äg=¼ïÚùuIE Öû²N{ÀŒ£-p‹Ììpèvv§¢kB±JBa6Z\bê¬Á“ž‚a:£´ïƽ>j& TC‡Ç¼ý×oTH<Èl³Tyoþ:m‰k²5PäÝŸÛ<—:Á/W.Ø7ä¢ìò™Å§å‘·ña¡˜ Ÿ®pEñÃé9;|ÐëŸÝB šÒI…å6°ë­9FA€F÷ÿ}æƒS¿p+Ÿƒ÷çš¿?þú©€MìC‘N„.`ÿŽSRÝžZlÃ6Ç0ÚjxŸ……ˆq²#gÐU2\ÀßöWÎäR¦gØI¨ã5úÓ¡'x,v5€oGÉr[¢h²Ú¡X¼ÿW9Q¬[Uâã£F'=W k«­ûr…íAðé7N9‹­­`A68­7A]œ"ÿDM™5Ôsñ­­¡¡µ.«ÇO7c`ñ÷ƒ¶/îx®I4ñ•Óòu©<ùPÿ°Æ,p_ïÌã/òçû× E³Ú"Ü‹˜=;ó'Ó]+†•K‡µ+a¡„œºi¨2ξqug©v„œyš{€é?¿Ó³K™CíI·ö*ð¿Æ5®ñÏŒKXßÄê¬r¹P‰kÙJ`,ìL£îO\1㬣ý‰‹À…ŸË|(?¯ð¥Ìe¹ª7'Kºç9ùËGwX¢þé„ÎqÍW)Ëé0q&÷fç%0e_U.ö¯*6i¸”R‘;ϰÌ-˜¼MMõl>–ÔÛgÝ«DöÔC6·1:Š' úçmYSôn¥/”6пH-8 V»"ˆ·žCN}K ”¤D$×<ó-FÖ‘#}ãvàŠ(;câzSªÅÁYçˆxúðúÌNߊë²E—†‰vl0œDÄð{ü!í;\O¬BIR´v5sãö\±V‚ÏYû|k¶ÊÞª1ÞÏ]5Ó¸ ‚qUGƒ¬,[¢ÝWdVîâðÙm¿F²]y¸.C¦Jc`f§a á…þià­K*4ÄtŒ±}Iš$‹-Œ66.rìrè@›jé@mSر ®TžÂë@*šcáh!=ËBMçŠÄa2ÿ‹P阱)Ž”¯ÊeÕ¾“ŠGÓ® ¯ÔÌBäü¥–Œ¼%>G‰d•%Aë]Á»ð5W~m]Øï_÷Ó“Ç·ˆv©u ©u†“@c«ž¸‰é7²²ŒFäÃ{‰'‘[ÿð¬ø+íe]š°z¼þ¦2hP•â­Í/ù%‹G>}L)ý•’ÿQŸ¤8ñ®qk\ãÏŒ1÷qYKšµéꃰd2³["†f¥§Oh ÷…Þ(0&Á^iã™0¤ v„NÒ BÝýDˆ²Q¬QúÐSÒÓ{èœ;z¿P€3A¤O6‹™Žç3ž —:%9U’d\óš7#÷0z5¡‡~%&KøÉ¡‰ƉP™?Ú×p Y¥#‰qëX3\Û°‹E-Ó´©uÓª¡cYr™®å–œÐrÚút[Óé* ½ÏÇ@ ¡íä­ŒþýÈôD]NÂà°O]WJ±P£ë8uøá¿r‘QÁ|þßÝü; a×€£O¹Ã/žIçPºè[(n²÷­Fþó‡nÏÂv{êÙ|›g{µÒˆÀeœ9(–ªî1PîÄúh¦m(fˆ¥[t[6ö|t MZ®ã^ Ä‹JÈ6q8CâJBy) „Npy ü]û[÷”f¶†:€­ðÏ’óul'daXßeìJøqøö#VÏšx*«Á6Û!¸dB·…(2Ü{,Tà–•”Åñ-+KÊí±JOÃy¡Ôab³µ±zËMKh¹-‹Û.–ßrÔœ’¾åy]'àÐʧ²í?>þUl ‡·äš»T3þìÜâ¶h£eÄVÕ‹`m>O'îæ-Qå/âŸþªºb>Åsδ\Mì¡_Ž-œ¬ëCKœ|¹M¨‚3«úê¸Æ5®ñ‡Æ‡¶k»ÅŽ:¹Äãä1q,NPÍê5<Æ,%ð1=ó ºÀ\HE—Ø`Ó¥¢{¥½À…óÞ»ž¸V§Ìö¤¤„ 9‡\tvQýƒðHΓÌ2ÞðaGbZ€(ð[ºL½¥bI"‰Iî“ &3Á1Ƹ3z\ ã;ôuë`ªð-Ú) Ž,ºã:DiOÏ;\r‹ŠJÅB'J‰ÞšmÁ;‘² ØçdÜ\ì”ð=ÀäpÞ1Ç{¦°aÉ ÉØ Ê–§ û†XÃÊ$€ú4›¡¾yC!æ2á{–áÙ¶*QªÏ bY\ TÇ1ný¹nxјÓkª›-ö…–  X„`z¬1Ç bJÆjôÀݧòUÓ~=ÇPÚ ³¯YÚ¬Sü·Á3N* +ÀSäa0Ä }ëLCÚÆ(1<#Y>„CÂùÊéÞ6W3‰c!?Bü\‰BW%Bñ¨>îeòiŒ²oCHaåeêšk8Q/#¾}Š…•‹8s6^¿#ùT”+ÕÂ_y'Xåð=³ÍS¸&ÿHz'—tÓ¶…b C¸„ƒŒä8¸Š¿t“( kœ‡¶î o½·—Á¡äâèoÉ6b.l/¾ùýVåá‹`øëítŽ#hj{®bþk\ãÿñ‘û4£´øECq¤D‹u¦™)þ„{QÑø8@-@óÍwû³(!ž#©ŸÁà>Õ•‘˜[fœÞþžò¬õœ+0B²”T<·šªàhO@ö}›DÉj‰)‡‚®¨|ïH_W(•#â¯i *n™1 M÷†tÚ€Äo÷£Q"µÁD&"Ë–áîZ¤H‚úc$³S4à‰Ðeâ €Û"ÊÛî’­Zï²£OÈ|J$Ø çð¤óœyÌi˜4œeKSƒØ dÇzÕ‹]/ˆ= YS!±Êã¾t˜g•™ƒmŽ2ÈOô0Óô[±X#eã6‰cæ%Ÿ ƒ»‘~ØZnφ >Û`òOÛ•îžù§Lz‘ÏRì×䮢.q6V3¹¼Ê” X*ªô\[¬Ë÷¡ê ¸å¬5‚Ïêì@Z®s!Ï´¡l`Ï< >Xƒ!‚WúýÄñïttFN¥*·ÇØíg;Tt6Zi’ÌKýrŠeSœ¶ÔyŠžÒµ»…Q«à¼c¡ð7–~…ÞŽ™ì8²ô4 lo:ë›GòU|^½/U»¢,:´·}Š}¡YÐx`¬|R±G­ÇlX²ßr!XÍ%¢¬ZËâª!°Â‘7E>2XÕTl($[8[«Iߥm c¸Î~É~mUóas‘…5hì)àvΧB¼¯íÃ{<Ú0µÕa×ìY¨'=,éÿ05ÚtL 7<vLÖ“¡Ûžøi´mH§†H'øÇôñ¹ÒPÿžt³C3AŸ:YÉÖ.wÍÛN£,]„TšC³‚<ªœw¬‡ yÞ´ö ú‘Ïw¨£0Üžþa !GA˜ƒ¬$û$ÅÚ˜ÔVEi'Gððï™ ñ5± Q C_&®áă­R\A¦ÙéV·Ç¢aÔ~]ø°)4q½z£<_(‰Wp·¯(NÆÜ ü›c¹îŠë+ùŠ%.—÷ƒ”ßõ¯Î>¦ÂÂSl?/ùoÙ,Bèˆm™ Kí÷9ôˆ§lÎ)ê9ÑWWïŽièú6;¹v^Woß³ö¦XɰŠ×vîôÑLjóù»r׸Æ5þÖø*žœ´' 4·Â0Ïj 7<ºjÄQÉfLB‚;yA>ØI·‚£ Ÿ¾?€Q÷h‰dûÉ ~•M3]¹Ò›EšXOïÄñPru$Ó%`ÑX@e‚ç %¹Ðâ^È„ã¶(lódœE˜¡DWµAzZÓ¯ùå29ä•6ɘù ,Bz7Òì˜rÜÇ#[€|˜Àk xôiã0tTp_Øûõ|‚<Œ/©Y@Õ¼÷mS’Ul›=»8‹t‘³3|2#1‘†ûÔc£©žRἋp¤ž)¶á’I‰8[’Ý XºâëF5=׳ӨȂ#ˆ³ðÙM†6ng"Å"u'¢5SÁÇý²º‚óÓ6¸ˆÕA«HDýÊd'AvñEô'LΜ¦f¦ÂÕinž½Ø¦º|N…S†R¼×n„ÐÝ»ZVé‹M:Ŭ7AŠxï¯|WÂw ¾ðE¼ô³xËmü¡±"QÆ9jÙùqœ×#ct åß³vÞrµiËéáD¿fsü-Hõ{”¥'ZÏÁcu у¾=uoð+Ì'3 |Ó¹Æ5®qß6>N ãTÄîcû6DŽçî¶ÇI€¯rHÆ4"Býf‡OÞ %°ÑYÖ™%4= pÍ‹šØ1-L\`˜Ù–¼œ/V(à“’íð¿ëVßœ²ÆÌr¸¬Ñý€ ’t Í[^šÈqéø,Qcr•#—Ýáµbè2+`EïIhk4u×>ųéºj@üu|Šá°nÁ;äf&Ö@ ?ÖÉ ÐÊSÕç—޲óða­»”tA½éòBmð[¾RœGc¹û¯œ=v é 1:qfIs†c~÷jÄÚŸP^Ž#Œù'ÞckP%·PÛêñÚ¾œòèÎÒ«<êí|ád³õ@¾^&2~yË)öŸdA»Æ5®ñwLJ-E§gÒØ°’J€W›W*:ˆEF?u ±àµcUñ±ni‰•ºƒt‚ýa¿v\u85³ó±’ê‹b´üËTHY£¾ÈdŒÖ;9å:ë€fªù ŒŒRâzMMÝÚÛÞMõq`“_qØX •Âð´É±q(&ÐB-ö¨OC”ØQÙ<ÁA>þÆýV`+0åÛ,¶vÑn@ª5Ï8]PRÆûfE´TZÜ ¢ƒÕ‰SÑK„" ‚ªG–ýÑ‚®*máFgrÇ}Õ¼£´ÊL/ÅâfaÐ$áØFVž›‘öªídÒa‰’ükµðÜç?ÝÆÞvt‰·×A$1Þ ÛÆô+ØqÛûç·Ô^‹xk{^¹¯ÜGÒ#a° ^hêD\ðd‰ì +ñЭö°? Î ×*„%„Âê`çmÞᓊþ‹9·d’ñèfÛáÉ©¬¸wögB² /[Ö™û‚›¨Ir?VŒ¦4ŸÏÙÁð šM(«×¦êšZÊñןJl®è­rœcõÀ\×Ôƒr™BÙ ª¡ »„@wÐt?TÃpÎ’,Î{dÛ88ÈÙ³8ù逫’CG¬ãù•÷€Œ?‡ÐÂØ:þZ´ÿ8ÃWWsìà³æ¡Ïf^SŽcËøl ß™æ¨T+ Dµ¿:½ÓÍ >à»–ã³@Éì¤Cë9†ijê\BtáÛ8±‰ª]Å*¢~ÇÎUþÃX£|ß/_ã׸Ưö¸EKTºÍÓÎô)N'ËT¸‰šZuÓi”•ãÌHÕ=Å“!Üù:«} lu—ø:«2Q…eŒ”&af´è¨›cˆÒŠyF-® Š">/­ ZuÐoí5Wt’±Fà;FT+Eо2Áwçr1ÕkûŸ¶ûÂG@@6¯¸=ôòžP<–•Å61DŒ˜Ïÿ?\Ì®q9”[Ý-ƒg ‚ö4˜8«±EI;3)P…¾·t=¾Ì CÖÜŠ*y€Q™>ó:2[ö•Å”ª5T%Ûm‘'ZÙ œ¡šT¨ JAV{Þ®_tt§Æ‘:ÆÒ{x| ŽÜ?'ÆP²Þ AŽEÂ(™'Ÿñ»é–À¹M_:Áú®/È6„qLa 3•$¹æÃò3Aè… Onx×Yá[:§TJ+Þ¬Œ„bfÊ‘*Ù…ßðà°o“‘‡¬ì5,°RÜYŠß‹F“1„²nzEOãõ¾ŽŠÿ.|²aþÅhsu<ˆÜ™µÅÙ\íèÈôö“¨ TÜ·í!5ø÷‚nM±:ÓÁÁ£C‚òÿ¾“€¯<Šcaõ‡þÄ—?às*¨kdV¬Vº¾Òl”e9?˜u´¯+ù‹Î›þÙ•„ßï+Þ&åtTÚB‹·„7è@¼¸ÞÕ„³W_}³|k\ã?5>FÍ´ói'ïÔEëA눤ÆH u¬s ™%f˜RQ'$x+{fö¶œâœÇ†²"™C…#“‰h± ï¢.ʆb?ˆ j •ÔŸèRýU«Dƒ‡â‰†_Qï9·I, §yެ†¥wG¢åXa«ŸbÄF4Ÿáo¾fi—âvq|‘çÛ¶‰îƒã&°ÿŠ-6§7†Ÿ}«O4KÈcŒºb m„Öoì‹Rx6<œ œ!Ët5Ý-¥+%F$ËY–ÀÝ· nOŒÖÓ‚ãŽwаí#A;˜Jv›c<Ɉ> B±\œE€îV‹á^§ïÉ@±Þ``Ü»WÏ’ÿMÄ•)xî+ŘóÛgÑÏ( }Á‹r7±K¢øœGt²RKÅ?†]1ˆ½îÒ>1_RζÔ}á×Ôªƒ7ùe±0K æÁ˜ÈêŽC¸öˆ ÔÆAãîFMÁ×M]èÂäI´f6/NS¤V–®pgûn•%­ª&ðùÅ%T”G§Xë/…F®)¾„Á+ ³zCBBÑ =”™ø{+ŒRožžBè IDATQLËo8¡¥uü¡þ}áe5ƒ˜†.jóòÝK’/¯ŠÅ—Û£ó€ûÀ!d–§Ÿä­;eÚø~xÍ£[l§‚‹œBøá]pbžeYûÑÿŠyºÆ5®qùøˆñ0ÊÆ¬\Ö÷vFT…Ó°:ò¨Êê•€ªÀ£Z,)h»Ðf¦ SÕ$Zt†ßÄ~{½æpÉ=Âgq_°vI„'}]MõtžO–¢@#I#è¶Õ¢,3 ÀYÔÍe—™ž-ÊOf!ñý[HÂ"DMmãJN®Ðä“ÿÞáüoYÐÍÚS§YŸPÔ¡ª> }Ó ] #ž¾‘T [=TVŒ6eìübj¢ý‡ ¤S÷F LÜz¨[úxÃĘ[>ѤòÀ½.ž¥BZWaI&<û èÖÃvqT8øì'ñE‘n u¸±¤ûîàSià¶©[›Þ‚Ü"ŽK¾)¯›rÀ7§¦ë¬ds–õÄjc²Ó^!‘· 2؈H 1³Â@‰EÊ7ÎýüCáo†ø§Jnc¦C@:ÛØ£,ÚõÏ×(Oþ@ßéÅûÓì뇪°­û®µj1C[([L|» Þ}ENÏÉ:nD»}c0'o8ò:…Ùò&XÖ/(O`:—^Œ” ðÿ½ÈδrÂykjDf˜jrB»À8yéñÎbCNšbškš¥oœß˜-XçSªj›ñcÓ9üdâ˜ìYT©ÜYoBöÆÿÊÞz©£zEWt²dÀ¯ØD¢¢¨©ï{y*ñÆÍ‹7íúk\ã×ø·Æ‡heõ×CÐ>4B+ÇÜ*FRþxLÒ1«”¥mM ýøUù[s‚@µŽË²!Ôèžnæ3 ÝE£¬-_h@¶ý›¯„¶‚êa±õN½&b‹¢•¡ÞTÇb…ðœ-Ÿ@¡ÅXµÔ$âSÛÛ`ƒþäÂäϯÜÌzÀ²´+ä!Ð …ŽD˜ñ¡’y(–‰/zɲ_¹¹[Ú×!îcÜÝFûœIªüV(ŵÝS„tûè¶[·ÊTB ÎßÕdß9†ËËQí>ÂWj£pµ×fûŠ-ò‚$¨KÍQS! Ž›+ë ø2N³=õÉTÓ"ÈUŒôîçJÛ&<°iIFïÀíë(‰ ؇۞j¢nÙJï„n…Ã(0Û”`/hß*²ý]K°ë;œèiÍÄ«AÔ’åŒn ¡Å%äz_e “ùÞ±ãiÆÒË™–a™¨ñµÜ … FÀÈÏíÏí=’óT>[S‘ ð%ýÊe0¢bH`‹NhóóIy 5@n!=HXÁ„U‘Å`2qÙÍÅ„skF‰#mßñ¤SbVÒ.=꥙ïIA+ˆµÔБ*݃÷:»ù×Á¿w´Y®´yQó½üoDxy„KÏų ½¿k~Ž0Åwû…Gˆ^*Àå¿3u,½ò+ˆ±kïð“åöœe|zãî Çyÿ^m¥¹Æ5®q?8>„yGôZdÄ75CC=w(Š×,@y ä ÇYÿŠŒ¯®sák ­Cßt/è,»Z·¨2C?zÿ¿. °‚þŸ­iË-­]Dù¾×´x¾n¼9Rz ñ0Z<^ß¾Ñ~v¿ºâ’Ô2%ˆ"g/&ðUž6.¨ ú·ø¦…õ®U”&º2îk\ã?6>²±D…>8Û«E_ÃT‰éd' ¥£PQÐ4-Ò‚L.bqϺ¶+O`žXe«,Z¯+ˆš6þU~¿3¿p°F¢‰Â¥Xá÷ß Jr2»Rq•á(rH~…Ê«`>¹Dö楾¥J„ ðLVÛÞù«Ð=¨Þz0ˆ©Åž€‹ÒÏK5Î}bŸ·wƒëã†Î‹Sä×JmLÝæB½¬T&L­÷0 [ç ÓÎQÏЊ4tž%âöÏó<˜¯þ7¤ªÈöëaë}‘Í¿Xçð$CnÀ iÝDŸµ¦™R,û@RCZQÜï •CBK…P ö~WèÍ ¯ÄòvþÙFÈPa˜Ýnׄջž^¸¾«DÆ÷Ъ…Žn¤úµMƒt¤<Ü貘èØaoxpqãHU ð%½ä!)BàNú°9­µ4§gôG¾•ðú‡|ö"3a©çé_Í䗙ƒ#Þ§ô9ñKBSÂ"Á·Üð¬4Ÿ°× ìR”ûBþ¥yHÃrƒH>Ø…†c$­1z° õº¥GÃé!?rôËŸr¨ÐÚê£RUDV„TCaÜøß10Æ-+f…Yx(üsïÚÄ©(AZvDûá”K¹êܳAX •‹…Œa¥S¢]8 W% Å)T5¶48ùÊ”  »–ôÎÙʃ†ŠÔâYèß>ƒÝ„‹¤.£PÜ> ÷Öt; &~WQÉêôQ7ö·Æµ…UBKYa¾]…6nxƒ9Áà“ xÚ·¾~?{z‰Pl·D×ö‡Û°—15&α€ò utM…¢?À%u܆N°s:è¥ÌT„S&WЦûΗ³9 Œ _8ûIMÍÈWº]Éþg©íqœä¿èT*R·í_+°+ÚÊ̓xÆ݈~ó>“Qösð8Îv‡¬4Ý#úåJ¿X&ï̼U—$æ¡X픟uò‹oÄ%¿'Ñ‚u­µõ§Câórö3KSÊúAéÁ¤ð¹Z,]ñ3g¹Î–&˜ßdù:‡ÿî_ã׸†ÁõeÁN8‹K4ʨðpj¨'Ô%І?S2³F0êñ‚šô£*Ÿ]”/ƒáÈ ”ú”ÂùóLW"O?ÔÁmF”6Å9 ò.·(qRÛüÁ ŠEÖj¸¨¾r%9" .rÌâUE†`ïDrHøî×L•®×ÒXí¦´üݱF­ Øúnª-3F[Ë ö=†”± Å"‡aógÂã†UÒöE»¹A‡êÊq,ür(7°*íœÝížâ¨Í¼/T5Í:ÿã“¡Æ›ì÷]&´hȚ͒—iOô0é¾f˰’¦B¦í·áR¿QûT-Ôûó3ÿÓŒ*u¶…íEó¾nÀ.bí°uºÜöï]îÎ ¦ÈlNĹf2ÛëcW*£1·ýIö©é™IÌÑë1 mÚ¼HmêÃ2­À½reLÈ®Æ^‘N ¢fÔõá#šÙØ€ÝbØ$%¨0™ØiWË~x黿¥\GY±gnž7zÒ¹ÚèEž¹u~»ÆÆ¨6\-˜#šÉœAW¨•y{ΜŽ ¹“@§)86)@ÛUPdaãõjºÚ ‰"D’½þ„ZÚþE÷ÕKÔýƒ-”Ÿ&pÿòñ: Н¹ì|ïk9üàñýû#Ó;mdÅxóîs¼qß’§TGªhŒmÔæ0šEY¹ˆ7ÈœðÅåùK\âDºÆ5®qktF"‚ØÂl°4KsèîÎ&Uùžéáõ?Áy1¨ù*4RIäDEƒ„5F껢NÍ f ‚H&´êqàhÙEÙ;ç¢U+d€…%݃Ì~‚h|¬´c:Iz6ºö :ƒb É9!`J¬x<ÚHi*éÿž!(>äWÏr™m9’]#® ˜ỈC•“™JäŠ ‰ÖïDÄÏ2åÈ.'Àûóëô„<¶aÓX.V~ÈÓ8¥°¸„>4u”,6Ž^·©‚ÒþIæ ÈѾWfSÝUQ¾Ê–C'ʺ„™•û3v;AÍ$„ÙÒ½Ó'ƒ!@ä·ñ qÞvâû Ý?QZŠè`Ž·Ì*"8Ì­ñçú¼{â"BñÓÓŒ-ö”ÝSCÔüTupÙŽcÄYŒ$c¨ö¦_M®Ý§!¾S‘3ªî®£Œ”S¹Š¼î ¢¯y¯öþPf*ô_já÷!ªË¥3R>«`'ÇŸ:íáLÄìLfý¼Tµ”0eÊâÎÐsÜOkØ™vî"m—LâÒ§OúöšúH÷µâ_eö¿Y5k•þ„œYq‡ýÕ›{ûœ”kfVú«È|¾‚±¾ñ‹?¤ü3˜ÞUü-¯6—¬¾uêHíôÛÆ»V öæQ4ô›ÐÝfñƒ8°$Q‡«¯Nc·ÿŒïÂåqíæk\ã×xÿø°°âÀä¨j­á9£CDg¹"X³( {ð`¦¥½ÑÆášÄ½#ÒœMäBSöBÓ á»ýÕ ¿ZÁ€€Ö«°¿Hsàл@ÄqàK¨Â2Ûë©Ñ¥vW`¥ccH IÁÄëÝÐîš=û<ö§ÎÛ!ßÛ6iÑc4hZ.æÔ‰#:⟠14Ë€¹õ|^?PbÙ¶ãg,ÍÏ­Jl !xaUª%Ë­DSO ¯udÎz›ö6ØBÆquQ± )w¤„Žx·X°0Šâ¾ðߦˆøYœN·¶5$¿š™¤Õxß:'4ûp!"]ÚîŸmH3R›×ÿLÜr¢Q7³h‘(éÅ=ÂQn…ír'Öp’#¸ó;™7M†¦ˆ·+d®ÝG  û2‹ÇnØ.u ›ïad á” êA9²;èm/-ë#-áœ-=äA©eK*Ee3D±|ˆ¢k¢eîB,ç í¢Ÿ-xîq>&„©¨‚Ëôîn1;°VŽìëÀÙ’ÇcžÍ0ͧRÑ:„d¬ çp6~ñz!Ee tRäë˜×D¿ø9Aõòã\Òð¾ÓÁŸæA®ÎåHìÀ ÿ ½ügžä¸= É 啯å5@énýšÉžÏHM óÎ"¼4ùó¤È‘´(OYÅ«$ÿ׸Æ5þúøø$ê&u »ùý{¨lb'Ûà|‚Z3—kÇú³ÊcÜ{¨ì½í”AïHûyú•Ñi“"¦ní§'£¢|1d;òWµK·‚XÿZ}X”Ò"ItŽ‘(¿SÔ½´J>Š›0}Aƒr±V‘©60CÊÖŸTSä‚N„s m+ÅV¸e:Ô F$(Κ…ò+ª8- 3iÏðlBÏ»¢a¥Ø±E$ŠêÄ6ü˵2À_ƒÑHÈèÞ»( þçÞŸ·a3C®Bəޕºµ`\¶fÅèl R3 †ù´3cº@·zó»˜:•HÌç0ˬ‰óñù$÷Mx€»@E£t2fѲe¥—b¡ Èå9PÆ/¬aÄ|Kº2TòÉ-¯ú ¤Œ¤këéƒbæ€u8Z½gèMw.ÓÀ‡>Aj8Óp9¢uuÝ6ˆ¼+rÆ¢)F› wàÁ퇄¡†W3b O7'o¸èDÔÚÎF ^ÍcÇX£èAqGù„ú¥g=˜QQödÍ,OÕC€ÆVyΟHÏ¡t"Wîkjdò_›ÂÛqÃC£WÖ£ß ñ<×,Á©öì[#þB:áÄqð7Ò$[¯ÞÑöõ¼+IßùOà»goº>/¾gÉ.M;ú?¡¶ +ÏÅŸ]ã_9Ãlþá׸Æ5þðø°øH„3²s³ÿƈk™\Ûh¶rXQôCal8¢ Æ]!x?¦N¼§ )©·À±4uò·BAeÀ¼tf‚󸋽2^UñÅ…#Ó"›†Ÿ„5D„±Z‰Ö‡Ê[·D¨` ÓB±¹—ÀX¶‘Å">Dô<¤ÌfþGª> Q¡Ì* Ør¡`á˜aÐ!ºÀ¤ß>)wŽ;÷~‘0“ð%´¬ƒºÆƒ­yœ¹ÚL`ó¶³»O*bŒÜc¡æ6üTOZÙ eæ¹W‹DÕJtÞDÅê]ŒT:­Hx6˜’FçvÝ*»Áž¿Þ·bŒPÀ«žåóWî7ÜT~WýŠd–ƒº7pÏ,²ÎÊ‚DxŽû#!”û9^G×÷™ƒ"h½–çšÍˬÓñ¾´Yã˘é÷΄ë…ív ïiK¯€2¦¯ ­óLø›S¹²á±lp Ê»ûƒqÃÀí™f6ÒÄä+0Içnœ ì¡K*±Ä¬2r(¦¯n^ó›)ËÎbfeé‚iÇÝ/Öy£Å3¢°!Ì®åJ„bÇõîjƒy~¿oTÞl©Š‡ÃÓ¢çCr9*>8Ýüɳè½|‰ÉIre¨Î»+!pk\ãoŽXv‡È]îñÌe­äbuî,%UXÃ7¾Ò³RÝá‚GâÕCÀd¯œ©eú!ÇcJ-­:e"ÔkS/ŒLÇ’D¸+ùG}&F`"Âg²ºß‚_PG·à,VGn¯¤õtô> sÁö&fV²²ö©Ò­ÆÚm±{H*XbçQ{œ3ò8é }|¾ì~A¼F÷HjíVˆ„k%–wÈ»xæqH˜Õꌉ@7Ð Z†ÏËíCÓ& sÔÍ–Yeÿ{k[6ÀÝñ8Yž}Lp„È$äP>êT€d2{­¨²ã»÷Ü\bÂé­5õ¦G'çiœM6â2Âw 8 ñý!–Û`©<šÆÔ“µÎ¯œÈͦ¡L Ion¡ô¿à”þŒ€*9g2†èç¼Õa3\³Ó×A©.«_œ÷v%Œ',ËŸ“ÐÿaHÑ˴¯­ý̽PU‡âÃbl-Vã‰þÁ›Ëª²† кY‘Êé`<_‘Ks´BÐÖ1u4AH¸†Øeƒ¬Ý]&ÿ–1:—áì¶`7¨?©Ó-=W}d¼“¯B˜úß;ZËü 0õÖÀ|U.c±8>‡|a’Y¬ƒÐfz¿m1ž¼Nu&ªM½mŸ8§eõÌN–”ü²=dí⽫ƒo[o²Zœ¶xƒ=(ÅuN0qa§7-T²=8â…üóã‚þ¯qküåñzIL®:ë %™òpñ!MØP7M£ÄBîpÓXØhÙ+ÿU’æˆ6‚•ÙwÅPÑÅùXŽôAÍHHVS©h¢Bq(WA0Å‘K÷`‡12µ·‚½î·à4!‘É÷e„O#–ø½€û7j(Y°7ð°{!D(ÉX„[)tÉÅcÄ×£c.tâCÒZ§·ÄÀ98P½ÕJ¨ <5&!¼Ý;“ø5· CÑÈÛo¹ËònÔI”:i+Ï0FäAªº9´¸BUû¨T²aÛwÈ=…í¢ß,HCÐ:… ’®ªFñã.¸ '9ÐA‡<ï9ϱÕ(DŒÄq(ìLg= n‰ÝŽÆA|{ääEÕ „Qe5sþ†tSº°‹þ”Wç5CbM ²†ÊL ÁvWŒª§çP„wdÁ]]n÷20nO©öqüTsõ™ÓX£-ê¤JQ.à€d= èU@è3©ç€ Hî«°›£D<²C¹×ïžô,@8ù‚v¥ê÷~[CãS“§Røš÷ñúó±]J›½9vÜlj™ªÖ„1/jkøŠ{qàS«“€÷-•ù ‡~½8û³Pgº»ôº¥mJËc.Ékå`A)K¶¶ ;y¯qk\㎭ª×&~'½Mm ·¤0fF1|￞‘‡¬\Z¹dà‚–l¨ÑóÇcæfw•¡ÊŠb1¡­ï܂w¤9¢È*Æœ¾ãŒSJí=,¹Jp(›d@q­@Y ‡—}HÛ2TöŠs–ù'ªãrÒUO‹q& mtƒÑGHŸ5ÁX@e”Ÿ&r-$¢Çª¼z €È^˜V«‰Ä2_ʦ|`µ”m'“GyÐCEåÁdönEcU5…ÉòL|r­W·¤~“s‡tV+>¦OLfŽ Vóœ¢/&rÿ1œîz$®Aº‚צo¯¬¢(j>ÔŸ—FUi=ôß„hTe2áUê bÒœN¹ âL}%Š]8œû“âu09Ñ0ý¦‘‹‚* ¹]â› Àc !`R˜öcÙG[³ù‚X@¦Z·2FŒâa§lý·Q»<‰d¿ÝL„xA§Dv‘RRœ%ZK*_aR7àÛ¿¶)ZUÌó¯+ïÆ-l0ˆh{“Š;(CôvŠ“hE‰·Ò¨Ž~,¬èfê>È(^ILŸCÒÈ£‘'D2ïÏ€xªý%´aWDØ%(V9Ió¤ºø\N¶ú²äBªZ¢»T¦ —DL±î5àûØÉÐõ»…Ã#ƒFÁ‡ã½«*}Rn;à‘Òn'çÓ£F4t±ã¬j¦ÌÐÄZ[(¢!ô·TŠYB s[7K+A¸Ý½žÊÏ¡g Õ%ãD’íT£ðÚC’# ¶Em¤´´]ŠP0ë1ô¤%Á § ¡óxÈ´‰êR/‰qOB+jñ‰ÚÃÂêX`aÆŒ¸äFøWj`ýÖ°3¨ãÆNΰE .wJúSgGƒ,î:œO ‹Ð_5úïû^\g§'ã² +Hàu_;>aÍÊwG±­X@c•š{ÅB\Ã~(Ax–¨Z´(œWVZ ¦Vn¼Û¼…Æø\#j¶³uëê¡‚’ïýâL©ˆ?}“ïøTNüÜ–øGÁKùSàY±tÜO¾êXÆþs^£tü[³ò2ëAá™`á!gyΊý³mœú„oÄXÕAÒ'eQ}2Ý$ké”|íªî?…åÉ o~úLŽƒ/1ѽõÚËóÉàà׸Æ5þàø°˜µõZ¢¨,´c@E)#¥T"––GÙyÐÂ{?,ɇ€eðS+]q#i]–àuãÖ`Ä9~ÄÆ°°ª8+¤zm5ý.@º§†Ó©Íòøk Ü3_,,Q¹þ@Íú"‘²ªó o*ŠÊÓ ýw58*èEĬ[%½ ¹JPòÁ–ÿ*Ú‡D¬ž¾Îˆ±,Ý>s‰®ŠÓç;ÚÞðéœGxeÁæ’¶ˈ"¹—´tmAV9 IDATƒÔÕôtÉQŽîžÃ_±Æ¢$8ŽŒÖ-¦ ÓbÈ0 }ZhûÞ÷Á'­nƒ¼Ë™¥é³× Š=à”FÏ‘ÆxãÀQêMt¿x6 Ý€bcOÄNܤ>¦³×C½i©NáùÜÙ“¶+z¥ˆpmc"ai³Àôd¾ßBuQ`…BíhT‹Hœ¥¡@˜43wº½&8K6¥Y“oÁš#>™ÐìñTÙÁÊ% ¶.¿*Lð¼Ö³Â’€/ר¸‰ÜzÖt?«xfh—³öŃdG Ò'ñÖ•3còÀ“sµ¦/òöpž_9ÚWFé 'W™œ•Ã,ÿ$Æk“ðu é[Ú£ê2[-†ê_Ö Þi, üfiýí?6|ïBí,Öñ”äD±æË·0O.!äòޝÃ÷q€ž·š¼6oxy¦ßú/¹öú3rL|Ëk\ã×ø£ãcÈ.3Š€!+ß/ˆÐ¨!ª³*WHuÁ&Æa\ ª";‹š~XìHî4й5If«~C :Ì‹‹y"è8°x?Qà(-ǸÉtG*¦Ãˆ V+îE׿ŸXèŽVY®Ò‰w߿݈/©Á(nƒ$ŠbŽDýëÇ©È=Ô›.åR9‹¾LVƒ#hc63!¶¡RÜm#aNAê6æ²:©ÒBjËP!5\ŒIà—'N¿Vv©Ô;¸#nÖÈT/§‡hØc&%Q÷b»àpì6ŠõI5ÿLïƒ÷q¿qÿãcãþ¿ º^ET69‘, %¡KÜm×'(°Ë¤Jü|cÅ mì[ÎAî]_&¯¶³x%(kDá(þH+T›¢>×R“‡>¸¡fŒúŒB!=¢‘#¸: šÓ‡c‚ÏZvC0# -ùô['ÀVë³âol.›™ž:ÉáUèqÓ¶]¶Í#µ'RØPc÷(^VèðXé;,±;¸Þ”ÀÒ&7FÐÆ˜öë¸d-[K"=—xZ&´€ÉÑü œýkÔŒZ+Û~B÷^Aÿ¿Ö{í¥ðüݶŊ# ¥3S¨§êBÌn;—¦¹:éM»³w"˜‚dcte›Åo\:è M¯2¯–˜„wßyÀC¸v ,Eè< WþA·¼À«ðÿ׸Æ?:>AQꀳžAÖÄCjµ^! C€Ï}ÐEèÜWjèV8…ç1ç¸@ÚX³Ã‡ÒS¢œ?Ó‚G«è½Å˜u¯S”íHNžÅ‡+ë°æøÁÑOY°¸sáXªc—#Î`öÔh[,Q¬ü lE¦îÁ‚¢Ê-‘ØùËæ Ä5/sE¤Ð^)3Y° B,áÞS&(8ÅJD÷ó#we=Do ÜÅ,=¸Ç<”žxe¨ØvÐöžÑù††ˆžÉÑ>ô!=YZàîIÁÂü³~(•?Ù×j*šF@îðÏ ·–ñ©’Km³ºwŽ;ÆøÇíó¯÷ñ·t¸lÄw†½¡yÙ#sNxìy·rr©8OBkšó¤>4÷|¿5øè¬â”XLþ (ßïxrÑì›·êüói €õ¥à' ˆA£h `6`\–‡¬–}î D‹Äý¼†L<øP|ƒLDϯßLñÄ«mOå:§°º£8’$k‡¦ ÐUÅDúÔ`Œ°pÜ…pþ?’€V©hôŃ7&ûŠ«Ë ßd6äJ«“õB®_{+ÄžWOÀ5®q?:>, =Lü LX!(ªi);”D$ä ¬â>°‡tòj‡ÞçLÊ5"ž\#fRÁ€ŒÒ3ÍÒŽÛ•¥á|úM´£âË&…Æú‰ Á˜<“réÚ;ŸøgÒ†ÔýÉ)¿­ƒ^–Ö]5I`õlþ…ª< (ê¯ç{,‚¿rå+ê* ÀÑ`Ù7<à­€Ú#ƒ…¢Y1)¨0D¹kÝDÏ'iLëÃýãÆ=ɽ%„Üá³ÊÞËêj,r˜ë„GnÒ-è€ÅÇaíÆ­¥ asf–ÃJŽW0h:SÚn«ca—Õ%ÁŠss(aäMÑ! žr ŠA†"À’’ζosY[œTÍ … @y ŽQœpfg{õîV¹3M-õppŸOWHq0V–>Û`œ1Os<ԨУe™ó‡¤°âQ4²"•ü ð“Ø€”KÉåÿPSºöÎv*'Èû³Ø Om¹å¨ã >ÎS:øórf¬dãO¡_'xBbäèZ¿Åº=ί–i¿FK¯>›v¤ÓŒ.4Ëã{rcJB€©¤ ïx/ç¶pxc4ZçFÌã4>(Ö-LRN½fMg~gy2~ý’¾Æ5®q×LJMàGÖ£ÛX¨.Am …5œsA1ùL††Ð=½^qb1}ºùJìô<)¿¹Eµ‚›ö…Ê- ‰³MèÅ0!¦EÑTë+Ó¢·ÜMEQMU >qPG+/}$1GóeXÞwªº4…œC6óÖyǤœKxôÁÁv(·FwçÂ!æ7\Mivßôî•×Lèñ Ü~éÆùã4n#¤,G–¬`ËRÈO4’5ÛòÍ`k‡7ös…éRvËû‘ÿóµŠ42A°Á2Îo vX¥ûÍïÙ“k'é¦à¦»s_K7´ü`‡ !‰"Mt ßÉ™*M“ÝæU·Mö³@9‡5©*Éèá¤v >ƒûžp[3Õ]Á£±$}€é>ꖢᷙZæxc¡Ü¾qÅ>B4Е؋ŠHxÅàdŒ²‚zP5èí'FĈ·'£¹°ÏûÀ–EFêD8Ù¿AñÈcD…›’¡+|,œÇù쫺Y‡êÞ ç+¾k£÷)ÔE Ý^9é3sˆç ¦ÉÓ,­ßÒDâ€ÿ§‘¾ó¶bE#¡.4¬ ´î_Nërö­ÉŠ D™›Ä‘½ó¢ÆÊÞä›Þ;OÞÆêú9! NÉ/Ú‡øÕ{ó×Ý WcAÍúxk\ãd|lè /¦R{"lðÇ´ea3e3‘®Å?oZþlÕz±c}ÝYÃ]v¢ŽÊÙ˪½5xÞð­oúFëþ½A²óx%‰ù"¤…Êa¦xûòí¬º2,ãÕ¹cÄ".:ص¾(B‘·É`"›²;… Dã2Oö 4M4ÈžÒ£|Â"èŸ-‹WÃ#S]eéZ‰Y*ê£Iý–Ù|˜j;CM~ëå©þT³À9þ0Ù5šw‘£¸E¾l<;è;¹<Óº’Û‡ãàžòÉC¢6}Û%7¢¤ùãéƒÞD›Æ>´†`ˆ²G%wûù–ï7Žñûã ›W3p|—Gñ ã6b7Ó¾æ}7†î·g"<üèH(ŒÏ$¹gF¤º²h‰kÔŒG$1甋eëÃXޏD·™ºÊ0‘Úà†o¾%Å|yvpî~ð¹q$LéÁ¼c ˜7)Úôi")b0w{ò•­È%Þp¾™<:9ʽAèÞàÈâêÞX­À „¦ :Ïs¥ò½W`$}Ƒݨ­‘¤íC ·éüÈ4ä;€'®`u\»2‡Pfø6ø¬`¦—Ÿ£Øå¯aÆUR0úî6dµŸlj»&-{t¨â¨dEG©ÕGÑæçß”ìB„QBz¹ñ‹Õ,åg_,¦@D8fb•æ&Øð´Õã(biÉ}Ñ`Pª+¢Ö Fÿ¤%W•_=P6ÿQéYI€£&`°—ù F$\;8/  d4æ4MòI2(f‘q$àéó‹Ä£}S  ¥ ú2ûÌÅD#^,oô½¨ 4¦a5#Ÿ(TšJ©¦šÛ¦Zû9'$£î^—Sˆ3,Ñjû¢–«,çÏ¿™‡ºo„-PˆžÏ±žùŒY´‘O<­[—±ÑBG? ršŠXéá1T5y £(J•‡%ĩת®n³FÒZZ‘ ÐÐì¨uÂSq÷F½Hš¸ÆN2=;ÙÖŠÑO—ìw¡J_…Y›ãö̈h*9̺FiÀg.aè6,™—ÝG8r›rS` 8’ät(ÖpÎÌÙô¿F$Oƒ5¶÷(m ]—Àš[¼èqqk Æ(2÷f†{<4z3ÏtÎ^ÀÒÔLØŠ²·à•ýœÇå È‘ó¡ á±çê:£•þšq+¡¢‘“ £x¹6=¤Äwò¸@ Õ+æ´BŸt÷F©S˜”åí­þgÏY!Ú“>‘Ì/vIŒÑ¯qDrd1eT&÷‚>ÐæDÞÁqEdéš0r&' °o@ÙÞvšâ1Áwyüf¸W_e&ºcj@¾héÄâ¹%oZ{ý˜¸f­ ç^Í[Ý™ñw—Üg÷Aß9w {AÇwƘ]ïè׸ƯÓuÐWM/U:f‘¡€û.k` P•í]#áŒ>_î2Œ¦1m,jNNŽ'!b\+W¤J¤³gÎPÑîÒi@AZ¼®žù(“µ&À{4ê`ƒP÷T ØÕ5GŸIAAàÌ6–©Z;+â„Q@*†M«ÏTªp"-X}Š\(}ƒáqRŠOÔµ]Ó †¼Ù®‹‘‘ÞLm¸ÏŒÎ ¨  &‰]ºÙ{ŽÀ“*¢Pr;žŒ„bŠ,•³Ä}û”EÕ™™kì I<`(ž˜ød ¡·-±/!ì8]oÇV$Æm8|Þkø†’ÈPO·ír…D{ÙæùMnK'­©k~‚´Ú&e9k$ qª’‡â8Æ ?ÐûÆŒ[‚#:ÑfëQ<¾`}v´õ…ÛGMŽ{k@¼q¢$7_Aq³‘ï+HÅ*(yàÜ<ž¡þk¤H\–º—:ÂTûßÜXnØr8£YeñÝJ;+c/B±£‚©+%§Ž(Nó/EÙ¾zðõoV=%U|ăÄ/-‡õ§šzË_ý¾Ð,ëŸ|£¬ /”ß8i¸>‹ö~£é„Å!Øa U‡®0GÓÊI~ßbY}¡ç²xFlY¿`¼¼#ÞÿÙ.þú¾×ô¥ F Þ#_hBÒVêªú¿Æ5®ñ‹ÇGIJçÍ8”ê“%…4z¯% %kmvƒÈ!e¥&¡X÷2d®I–Í~ù3v]­ÕU¥¿d›``Œì'ª,40뇳ÊuÝí³þŒyYöíÒ³jäøWªwòš‡){û/rÉ cÅ"Z³©ÄïSy ïÈ L,Ÿ¾œ*–},EÒ³¢óú˜¡ŸÙrD!¾­R$äwïŸÈØY¨u¢³ZKKƒÆ*¢¬"x? ©údK¢„ »%™ê4s£ÏŽ+QcGÌû‘;“~ ¦ ø£œä@þ.bu®m„ZŸ¿ßãUº»ªóC3'К°pÞM-f_üKõ¶Ê¹6¦RtYÑS*±Ë³²âQCù ŒÑhd£=Ri—"&ÇÓºE/Õ³•ÆF| ªþEþ Yf$â)zñmb sË»5kÖÑ“®Òݱ7ì8YT$F¦ÂgXOÚ‰‰î󌈘ƒŠ¥m–ø¡Oidò±uôÅå]*Áöl‹°—Yd™å•7ËÜÉé–XðvW$¬e£ zoàOÅO²Áâ"¹²ŠÉ[«ZR,æ¿ö$Yoì$XÌ+œ¨yó‹]…±òBø¦ ÄD‘~®W¿¾°s#ï"ù~bC³¬÷â9#ó®ø:Z!éݽûn¿j|çñ ¬…¯ ¬º½ù#{á׸Æ5êñdĦqk‡M˜Òu°õÝuLÁÏ!¿Œ Éi–A¸¿’§çå̹Kýqq¸Ú+L‰V‘˜^šCi¢b)Ü+ …m¯Ç19„üà16n\‚9úŸ{N=÷n5t¤ŠÚÍG÷€¬=YaΑTRKY`–½,‚}«Ö+†_ÞÌŒêдNûô6R¹V=•Âå`µhëtÞ$­V奕[¯;[$+Ç’Rh ĨbáÑ„”¨#ÿ걂î.{ àªã¹°õt#¹GTõ4¦†cZŽîÛ¢-ðÊj-¤ý2ÓaÌÓ–” /50ŸÊ÷‚„FVš†V8ÛGÐÄxŸYÓox†ÈX…‚’›éñQ.?ÿ°+öyðL\¹nk»^¦¯I2̸ð–­% ë dñbÑâ²gÄn¾Ú€ÜNÕ¹ŸÑȵ—¬çSp¼àˆòÐÆZ¦|LÿR0Öa“öõ–µåb…iBÿuˆ^€®á…%7U¸Ü•å¡Þ’ÒÁ@ëΈ}´ÂEÉSr¤É’‹U“x™gìm ’1§+";äS51t~ã„Ñœ"`à`ÍŠÛ<#Õ¬&+µó‡Ô¹&“ô†uÖÃì&±'aÇqÆæâ=>UÔ'«i§æ7mÃþ­Äžìßk?¿ð†yp»öm=_è <¤)|-»k\ã¿c|hÿ£`e„;¦{_W[úXòð0bVžT(ÿ+Ο ÚC8 åŠI¶¢Z]1­QE`b{Ù`¾Õá"øzž tS”u‰kˆÊDRW¡†b´ƒ}É;l„3ÍzÚ+ŸX*š"\Š«1CÉ×\ö•š´ø¥Dkž«z!½muÖe‘Ì!9%(Êá3çò4HtŒ!<ýPNù 5ˆŒ‘’ˆM†/Às\#˜Ræ´Š]ÏdWU¹œåº­”X§%Š™½ ñ!†áh¸ÀÇÞÇ J‡ãÙ©cí†ú”o&`dÕ ""M ëòð½åÈæÏXKÀ›gœwÛ$PÒiðÚ¿×0sÎ̬0¹¸Ü;ªÚƒls –" ÎCÝA`½÷¥øŠí]x.þR¦/8 ‘Vùª£ç32êoQ•åw>pýïí ™YË'?@}Þ±hW·p$¡Â6-LàËQ)4ØgIÝf'À†âVvâÆë(ÀëW›—àDYÖVtñM%ŽUlfÅ”23ÂS¯ì‹@§uœ_{·Lùªm)üÛ¥•s.7…Ư¿ŽÑeà{µX._çÛ`Æ“#º]<*6\Õ*•ᄦšúÑ“&5r0fɘï„8k”6´‡áû,ÄÏŒ?„0¿3û²–<ö‹ [õë²âæÜ1wk\ãß2>BwvÌ´€5 ¶qb©¶h Áo³ßL€) M!*mš¨*bæ®|áîWczñiÓ(ë%Ö0ïD¬•áq€Þ8ǼÆÐT³ð3xHí-2+ÝÔøÒëœëÌéÓZ¶褤Ý÷–8%SK5Èr‘oŠaUð¿£ê÷¸ö^ã»ÛOÒu€k×zÃ):Q\r«ÐÑÚg;ˆ£ îÄΪ4dn/uíä¹Å¬]¦ïͧ-¨·¥ÜºøÎ-òþ8¢§í¹°S—Ü ÄzÇQMì~oV)¢,Z–ô-†S^f\š¡P: ä9iÏÂò¸×ìÇLR2〗ж™¿M‘‚^ïW±¬7™°‡´¨¬™Ð3oZD‡ó ]šƒÏQB-ÄÞÌœK‡W>£3À®{ç¹B'W³:bo z°–/‘©Bx®6›¸¶AMÁ4µYØn)N ;Jý¦ÐARà2]ÇSYCfßÊ +³Ö@,rø§ú:—ÑØªÚÔix¬;Éc’Ùjxüó¢<õòï½Ú‹˜fœ^Alq|ZÞ †e§ŽéÍN¾Ouº/?%äfYûÍ¥ÅÚôVf‘®I‘üâ÷ûVç}±«„ç.…Õyj·V±ýR„.[9”æîqhr2w߃ur–µâWÙƒ·Z•s>Žˆð‡ÞÐÏÞɦ4ÌþÂ埃jåõ/%€k\ã¿r|”§KÍv"Ê'™bE¸{&]EO‹¦ûŵ¡€Xt±÷ÚRv°ƒ“ª^rìšù»cV…Ñ `kꌡ9éöRº·#«Eª»²µö;¯úTû7k<°sK¤#™âÙ8 E•t× Í=wà zôöOd>è÷Ô M-ÕL‰(TŒcAµx-zl©Nb.a¯GWþxÕ}Å¿øRô]¸.<'…´™K—Ô´F–iÔâ^ËlYÚñ€ˆØwÓ­%\è¸í/š´Óý9Ï·±ã’aÝŒsg7v󒺑5x±&ÆøÖåGÃѶֹZU¦ŒaN)OÛ˜ò‚UÜ Ö=å.ü= Õo¯p%!:m®†”Y´Y4 ±®V,…=n0¢õ›vLbªb¾¿ SŽˆ³2ö||¸Äá´Âd;\ûQXua/Ø%*èžžÿÂCRœTÎÃÐùQs"_»Î²c~_„_±/£ÚÓhü¸yq|×ZɸSàƒœzA3þÌfybûXgY¼>^nXáF m7_°° +çÅÑúôűÿ—L=_úó©óŽ‹áPpŠ“Ëö0'‘ºEM vÐe–$o¥Ðñ·ÏŸ?sc'ïöÈ ‡ÒùgiWüðóþùÒŠ·€ÂéÄ]0‹a¿Buà׸Æ5Þ1>úr¾Šãìêp²ýxùÛ‹¼dâiq..Ïôæ<3s”µ_­¿ä`lUš¿ˆÞª±½ã¼Ñæ*´±Ý]æ“qÇqQ]NËc³cñ-óv¿¥²\©üõk»•:Ë IDATÃ|»Ú½§}ü†¸ÿqºì…cstH˜õÅ-xª"1̇÷çÏxÆoŸ22uú.ÅÄ5áâÒœö:õ®è1 '6{”Q£© *g‰I±o†—usŸœ SQð:Ö¬¸ÄaˆÞý{1Õ cBŒØñ)ã¼¢}Ú`ŠbçôÊX7©ÅÛhAÞí> #™ÍÍ'!UÛín§l‹Ú¢`·²>’Ï€ Rï—–Þ#ãõÚ)’]¼g*¯Ñ;½T®íAa‘£fT³ÁËhÂTC^§«CXýaêã"5k@5!ó $ øÙ.`ëÈ5ÍÁ÷°¨:rœûê1¶b}”:Ƴã.²bfd~N¢ß‘B{Ú(Á¹ "?~‹ž¼‹Ç'×ç %“J!z3~ü[õÕÏEàá98©Ð?kô÷Tz>Ò¬6Â2Ñ¡-œÖ§ÕE¿8×jŒ¡x¼tÛ[à,úd;œ—’9¾¼HÑ-ËŸ±Â¡S›ÙŽd¹íÑßH ™‰U“bѵV™VË÷…99T²uZñ8‹Iȇcþ‡ygŒS®Ž†ˆ«7¦°y; ¸dÂþGõ0Í+‡¿ÁÕ„HØ™ÌËd¬{:+oó*0ºá[væ°!é¬ ˜~9Ã=…Ä4‘©™¥{€îØ+QÓ€Æ^hh5ÿÊîÕ)ˆl“7ƒÐ½vœ‹ÛøÚ&¯òÄÞ´Ð3õÉÏJÔÓ-Oeð½Wù¤žñŒgüÖñi‚L§óc›Œ´ú“óýLŽQ:d¢,oÞ²ñF@Daõyëéä˜}¿·iL¾è \^¤Ç‡³v†›ÍÔhÐd³tkhA ð"{Ü,¦]ˆ;!}ÿœlûL»×¹jà€… 4жò(­V‡ ÌE¨’+ÐÎm(·’ޏvWÆ⺈¸¿]Ã_Í ’u!Š`ÜOfFìUI>̼«?f|[]÷0ÅÆ×\ÇLÒ<ïÉ2Á¶˜"tøÆÙµ*’:O‹™BÃ.ÇÓ¢TðröóLH¬pH¦¤Ë7«ÒÇ©b–%­s*½¸ƒ†Ö™ˆJÞ» í,äg/`Ó]KF0ͨgÛBpQÙ·â4üˆTG{ÖNIEX3f—Ù,û‡ 9õÊB=sÏ(µzŒ~–ZªPiËÃ̘YÅ,·Õ¸dÏû¿¼ .Œõ´f˜ÝczM‘k §¹ò¨W!•…€æhÉôÃG ˜Bí ¡Í ßY0Ü´(wm v¹p§aösèwp±¬—k»I²ßk.©—^s¿°È¸Ô¢Àî,rÝ:i)‹×@ð$‘u]¿oYDRýfžûÛÐ{£›T.øúsþ )Ђ޸:elûRÁ‰©bÏâK¦Õs¨]™IuóȈ­ãu-€‘J,ÔµÉ\ñAµøàÈÕ`B,ËU‹ÔeÐâgOŸçá)0åèÓé:pªæ“¹ÆªrvIEØEƒùl¬"™òSj/Çå+‘Ui¿A3þŒÁñçÏ×ëãcŒAUñU H£¿úáÎaŒÚŒ PTÓÛoI µä#*Pò0¹#€rÑÊ‹Ãunq:> y±`C3¥âÏMfz:Às)ý|ª:5µ ó’±0J+ÛÝnõ4ž‰×iÓ¦¥îð©µ:GÀ%Y|4 ð6D›‰e”,g—p)!ôÓ‰jy‰#80¤¦vFÜ„àÝŸQ£~¼´CÞ4Gxç‡õ ãJ‰ŠÚȘR•Œ1¼æ+GiäTÛPh^ÊAÌ!$ö4T¯•I—¨ àÆŠ@þƒ ´úyùC;ùâÙéÔ>þø ‹Ç/ä$ ´Ñh 'ŽC¡"ü1CõŒg<ã7ŒO‚R³ŸÚ•a7ÂþÎGS0D¸HйfjÌ¥DÕÆý˜Çh™C¨ÌÑÂPØb綈´EÀY_— …Ü«Êvhá2§ÊàpòUI;FRÖÚ»nQûy¼8BÒ®Â7ÃV2ôŸ[Äì… MšTþÄcRQ;WAN'^“aL!{Ô^HƒÅàYï+ÿV²ÙÈeÄÕãј5¿òͲR§@ÎGÒØjÞ0‘ÑÃtíÌ$̷ʘ)²,m6xæÍùÿ¥Ðÿä?öÓ 1KXØÉžË8>˶Rá,ꇢc½;q|" Ì º‘˜ç©<âÏT%rªH¼†FÑ2D‡)›—†›‘ yJ>“Dy|T.°ÈQ¾—×e /—öJ|–ŠAÙ-hrÛ_£ÿ@a[ÿŽ„äŠ¡™`žFçz¹”$™4ž3°³“­X^âÁ=0ð2šìLbp'˜ùE ÛEŠ˜xÏ‚“úz)HÀHÆòéóQÐ(µ^ IHïíÄ÷ï¦YEµOñ¿ë,vù­Èèþ V:p×Ý"¿>ÿ»¦ivá„‘Éøâ¤g›« K_š ÉÛR;}YÀ\Ù8ÑÛYÃ…©Ë-Á¾ç€Žé‹…å|ù~̽ñ•fuÝÇ^kàx€þg<ãÿÎøô(v.‹U5ñPÌΜ iGˆáJ¨¾„"¡€ ¦v\‹o¡t>¤j(L*VNòx2Ã:h!§“#BÖe8œ¾Ì¡*a-ÌÈ`ÄŸ©®W[ ì f-Æ'eå²òp(Acäÿ ¶”¿…íàß…­gCv”Ï)ìc¸BWw$‘¸AŒ¯Œ%aþ@vjšpCÌÏsØÑÚµ|Y(ísn®Ü™Š'Vrý$Í2éƒäÄÇØ÷¹1t“Ã#ñ?¹àsÊ|:‡£H&€^“Sú/u ~þaŽ‘™3Óñ$lsªcMs,¡uŽ«6h÷ÐäÌý'ڤ‚"èqI®+ãÈjžg  {ý“þ¨X§h QOÿDpÝÓ#M:Ã,™Û–­@Û÷XŒ“þR¡A](8¾DÖk‘Ù¤/UnŒú%ÓRÓ}@£®~`jÑSjd³†¥ÐÅ(}ÊmÒÁ. ö©®¶ôß\—Œåçt>v±è®ê$.ÃSoŪ /§i.”q8R`ÅCluÚrvãÐæ.nEn–eM. ¹n¸s"(^‚˜êNçÃÎò€8Ý•Ô6”Ò¬+´§Í°&ïÞµ½Ô™¥IgÜ ÿ¸!Ô‰•û±$Ãô¿t XCÄž(‚»Ncã‰6n˜¸ù_`7 üRÜùÃøó‚òqCþí¥d³#ïœ+6°@§®DcèˆòX­œœÂÿ—D‹Fç/û+]YWÏ߯P“¾åàØ8Ôü KÞ×VÜ»ÖÙÒÃ_¯»¼å-gPw`¢' ðŒg<ãŸŸÚ æOÈŸÆD«%ä„ßu6ÚÓTÔ(†ìeÔÁ‘t ð°`§o´©oÀn•áì+® Â}¢f£ý@Lq&" ë÷¯tc#-)-aá-ÇîК|Kq ÂC"“Zs š›m ï³¹Õ!DõCx p­ }ÚÊãlº\‘oÜl§lÏ{1»”Ébæ:x(c†FµcJáÐÕÄ}L¸‘e™/:RóXÀv éêešõÏ5)ê—‡ÝcÅÕÌ䲋Å7°,4í¸§¸ûWšVñgŸá­_!šz›[¤O)¾Ùçw×d“íWÀΫÐ8zq-í0,úŒk[”—c½”2Ï÷úüãö=_ë% FÞ£ÜAÿ›ïÉŸ¶üw³ )^Bæ¶ÌÌz6p÷4™g<ãÏøM㓲ý9¡B›éê<¤iª©Ü³ÒKvù’  2ž¤8‘Ü•BÝÌ[+ÓÙÃU´&Ü»dŽ9D­èª<äÜù9Í< ó2•fróÒ…•!Åh…¾CŸqX¥\Ïü±oA3 Ì›'„ØE]bÉÔ󸑻)œöX³“ûÌZÑÀÖ´¤¹â°ÌÂþ|Yr¸']8}h¬ME;V_.ÀzŠuwÒò2ÝÐÍ|sÆò-SŽ ?Ô s¢Ë?Õ€pa6ȇ 9½Þ¸ÿºì>à"hò ð¦)šÚª¦aŽÃˆ…öQCVºfô’£9°ë[4‚²¹âÛ«ãnšë… b³Ø<äÒ1 #Ɖ ›<®S°8ãÐl)|A‰“‰os%1Eà©ÖFËT$Ôjëø†ó}L.‡Cç1!.ÈdFEèãòL´%oˆ¢Ëv.“cMé‹vùmÁƒ¡yظñjµó‡q"‘g—^šHs½†þ|Ʀ¥åì³GfEÿz2`U_ŒŸ|¥=|ùó[§Ü¨Ë­u Z-íOn«:„vú*d­3±+–/qaB6[@Ø€G5^ù žp5ÇÍgþõssý=nò{æÃ¦®?¦‚!éIØŠÉ÷-Gâë>åÿÏxÆ3þ‰ñ©Ñ •`Âò_qý\H°ó¨&x+³à®.Lp ŠƒÕ|µ@‚ÊÁ„â©ßm²àã¡É`”ü«,ð§%{!R†‡9ç^ÔH_ölTaËGo iŽXß/*^cQA1¯È*]íH nê" ‘3Úµ¢™æ؃âo£f²y) •¦kÿjöR÷sãowp¼ §&¹E¸‚@w’ †$®;jN¤dø¶$#C .B!'ªV'‹1èÅDš‘´³DCa`÷o+ñ'C(þö…i󠑯„ pßH%ZëVVo6 íÒ]¦ÙwZfåVËá탚¢lÌQò/$Ø@Eœdq¬[ǤÁÃ)31EÈ´MK˜Å«glšfGÝ.¥˜¦X`1–T™žAø–*ïë$õ3—¯.{Ÿùߊûðpj*N©l/’Š¿ÙÔÈkØð)ædh6>M¬—õͰ“çÀ( ÅÒCj™ô¾Ù5ó§p9êÆ;%ÈÕz"?“%i¦4íòϹª™1æýÌuÛ®ûcÌ»q,Þ]û{ÞD£™ØËz›/Âgï›Uª-š;¸Xwž:öŃÉ2‘ô×̾ ¬šív4ø5çW²Ðι–¦m›‘«y(Û×îŸÀ¿ÞkÅ[Oqã»`ktªg€ñÁ°¸Ÿn»Y„ØÏ“xÆ3žñëǧô{\©ï N9j{„_*—:SXs,ƒIË£ržNªû¸,ÁJï.AOÓÅ€geB»ŽJ¡ˆÖ¢LkæÇÌòË‹ë<éqÃÃÒ]ÖZŽ,ð5¿3›Êļ {”#”F1]+©ßE“5aµjCôX0ÇÎ<¼ˆ†ï9},jßrù¢ç}ü‰ª££.Õb·4ÇXº¿°ˆXßcæ255„CãÀ - î;Ç ¥53GwvTìÆÄÄ"£è<Ö: c†Zæ4ÛqÐÐ ­ *¤žÒµgwQ\m±F¾ÎñøTÑ&~”ÒÃT<ñO²>7 ‡] e+³0¦'æû‡®šþ~àWšA¢Ã¨gÃÚŸÈŠ€üŒ{õ×ÐÅ⯧ìáæ<.O/¥ã`S«"+ 2ߟäÎìÜÆ?£ºr¤ˆsš'–5@Ý\Ô§³ a…£Ý àœ} ôwJg^FælŠKRßø\Ì3'$O;™ŽÕÜä"[+Hë߯“r`s>Øã=Ü… ñöJí.zUs÷­/×[·!$Ëý‡Ao}c¹‹Ÿù`Û-ÂÊÇ®ŸŸ½äÑÕMÿÀ@×óߘîv¦ô½…ù ªÛÿÙÜ—=÷hlÞ°¡ ¼¸ýžñŒg<ããsr]ÏZYïAð´£$ ‰6‘¢w)%þQ(ÄÌÁî%_p¦Ô¡%NVièOÚlAÖî†ËfØÄc˜é;‚hÒ„ÀHlÇ0ÞvOáÐF0µ. ȃíªÌ•{Ýñ Ùý¦J~PŠ9³fŸC‹ï-w€þLRzúém“ÄÉ(ÅáÊê,Dñ>ÓìF/uÅ®+ó¤úN,Üý…ŽèÜA ðݳÑå–е6ŒGqú'Ù;#KèciXæÏÌuã‹¡¬ðûüœÀ¤æl ¤l{yBÙ&]ÍÇÔ ,öUAœc1JŒB!¼8°Ü»NbF‡£&ª1KXºypR óT…Ñ»ð›¡`9¢E,_8Þ—:Ó¿ÊBw¶ W­“Ô6‚öM˜†güy¸OÀÊÀ„Ùc&Ìû unÈxñ[·aYêÞÙÔ!çâº>צ¨öÛâñ(˜•¥iø|…=‡b$¥!±6õNãS$`¬GW¾hþlx;¿j°s½ÜùUÀ[žŸ­âí [“*çFíMû“ÊŒ¡ñWK”ö²X%ýøòæu߅Ѱ~—fÎûó¿ µDqý- ÓUΟk'Îðó-á&œacúâÔmi5¶n8ï~#<:ÏxÆ3þñ©ËbŒàq➃IŒ z” ´ ®¦æz*Jx¤˜®ð(¼ÝVÀ‡–É…ùd‰1óÕ\­¾(§ “~”¾¤‰“;Ò¾cÙ» bfÔÄðtþ5ÖœEkHZÞÔ‡u&H檢¿ÜѸ …¨#@·¢›zJ£H”±Ê4«_°8J]²€Pöho‰?T\Þ3>[†Ž¢û˜ Ó̳\¸ï@º‹Z®8U¼ Ó­uˆå¦Ù#,´ˆ‘ oÛ!<î‰Cã{ã"ìÏ£ÛS/Θ+3FT•òQȽ®â=¤\Å„„±ÈùLÌË"\(™í ›Š1†\i“þÇêþçÛž“ãOo5Y*+ÀžõuÉBf`…œqïDë{Çr-(Šzó;ý’ž$ï6¡)K/Q^j‚œGí<ÚT–ØZôÞÓHd‡žYW4d[0Ôk°ÖM¨ÛÒ€ ±¹ÕÊñÛÄ\‹^Ö·4 ®2cö]¥y̲eTiX3x;õbüø[oã× ³kºÂ]×$ùÒöë³A¹Ù}Gö¾Uâà¶uCw5Ú íù›â·ž¦ìãóãÒý~ך݊“«ù7Ì/¯Ú X˜(‹Å O7ö%ú}Èð§]4Ò¾<Šïh£YZ ×ÙȇYö>sÄÏ´æ.îF›è’4ñ•dÂÀQxHQbéŠ8ÝÃ&T÷·”ræ°!k!A‰¼d5¸ì…èëLÝYA长Á*ò&@KûÇ(ÜÙøÿY½õüÊ%U~êZtZªgÔc4Ä$fÜ–É)‹[7.DK—2â&)ÍDdð躰n±'::gDÃÒ dùkñµègƒkóR°5õ` ‘E³Árzõ/5%íÑæ5Ëä™Їq.~DN·^¶8Ęó"¿ÄœB.‚@öâ:ðbPÆšK¤C,ÅÔòŠÜù¶‘ á#$WvÎ性J‡¼ÅÀ²Y—äC~.²mv3J¢>œ9&™Ö*ÑÕD™Šƒ:v]/m¼’å{W¶g𶣂¿7~iAg5Þòøù9½ýÝvû/.Upo‹–×õÂìÍ^Z  Ü£ógÛiÉ|æ÷­êuBᇧy%l>üÝÉ{ïŸý÷<ЊP´y Í6/§23T¸¤ÈØ}käI÷9Ð{‡}Æ3žñŒ›ÆçXé¹ ØlE½ê¨ªª Õ§ìI~J1>ÑT ýߥÊÃð´Â ç¸PÔ*i9vó"•81@Ó`0 –Qwæ\Ô-É[¬ÒXûßRïZ­@i5›s÷²7~¬&‡Î9™ :ò®U~h«©"ýÞ`Äf ƒùð& ÿýëÇ7ÙÁh$ ñÅ)Áø ©ì^#wLj¥íŠŒ„¼~qdÐÛÂRšÕ~§)ÊÙ7¶ê²oÅ–,ë’ë,=×´³ õQ$GE0Ó¬,šûRWW‡þñO]ù›ÇPq5M ó¼‡%òkûKηf•fÎ~ÞyÒzsægpXÝÝ=H»^SúÓ½FlF›èÝû«Ë"ÿŒ7EB Ÿa”TH«zØYØpŒ².Kɼ!0ß&Ü[9Wñ¿ÝÔéí)k~õÜ(¦:k3¡«Â0Æ4íV×ë5h‚üY@¹ç€«»á¼ìÝ/ú ¨$Ö{¦·ï]í u»Y³Î‹«Ï2JCù,ŠéK1ëO)©ÿ89¥:ò«úù8(xõ|A™~þàå¥_Â{,¦Ü?lX»– åi’¨²™w0;aµàD™Äh,gõAÿŸñŒgü‚ñÙw(S2ç‚>ÃnæøÕÅù…Ñ˾õÈ5ËÒsš»É…½ZSÂmXu›Ú„*?<1šœsmí»ìsNµ@ú%<ªþÙô6¨îTwTÅ̾6¾\t'Ô–‚ ù/(â-Ä…@ß1ü²i’( 2–¾úùçH¼´ B²ùwâÇ9ø2ÅË=9W'cæüä^½æe/´eýø²Š<;xFâ€rR¾s¥¤WõÀ”‘̇yóKQdÝË’ÌWièHKÍ{õ`w™Û¼jåðqà†ÿsÑŽ¥¿Ò8S§§ÞH0 ÔÙù,E#´˜OpäPòÓSÎUñV»>à  ñ›<¿œÊ”„ÉB™k™E&†iË$jZñeRêHk^$1Vo™&o¦@ÚØø%\a¨o´l·©^s3ÄcòÏ>UÖˆùl›Óº£Dx¾ ‰¯¯ÌK2¡}6jïlÀhÉ[!9-ß +ˆÓ¢1÷Ç0Ž¥P ß6w‚œ½ý󛈤YܽyYc†è®,_8zYÜ´û1‚R2 ‚òýt(î:œ í«çĊÀ¯Æ$óž#Üt°~ïÀß gÊ ›ÂêµÝžºÓº¿þ7\gÁÜ©az˜ÿŸñŒgüÚñ) -,±ÃXlUçÈ0ó•msÂ\ÄU¾}ü) :PylôYe) ã=XΘÅ|u²Gì:•[V•JI|S­ s=/:Ù(™²‡%t’ðckI³%é"œQQZ€EÒÛÉC}Ø"–kÏ#|ü®”l‚=SK'áÏ(Û°W M9°š^FØEtÓS ‡—ÐL#yœ­0ãÏú"#&ÛX· h²8b¦¹®g©®Æ‚ªB.À^û…Ú¨ÿaUÌ©ïßqmgò5JÂæŸÆ‰›Ë‰Ãb¸¤`‰wâµ’F|ýaä˱@L˜ gHj•çÙc~ÃNŒsÃî=ýuö f²É}ãsÝN¢Š÷áúÌ;-ÙÓjÑU0g¢šÿBZÆí´¥…Wãe.qÂæü°ŽTiÅ{çV†”{7AUØŽhWãz7/ã(ŸémízþËÞ ¡$‘åôÆ ¾¬BÍŠbÍÃ}:(ÄõÃpX×ðS³”l”ßK½í„=ã‚“ú]óþD¬7Ÿ¯|—vùÜiº KÍô¿ÐCô¶&¡ÃüÓÉ¿f®—<8Q}]è<©Û ½ÊT.ÖôqxÛÎÅ‹»Ö[æ[Ì«Š¬—Ï,Þh”Þfî~²¬^>{ Þý„,—)kqØJlO-Ñ#ÇSþÿŒg<ã·ŒÏÈLÒ¢ Ä"¼‚‚6°ÌCaôS™ùÁƒU,7®z]ÐÕMv†WôÏ}AdÐÏôð#è±ÓÒºzMrZbÔדÎ,@HX}%õV¢k4ø) ÍÊnkç6Çôž´¯Á¦?…z„BÌJAFç>R‚Vmµ=ZêÉl-Rr æUœr.³ÚéDœ3ÁÌžŒZÌup5žAb¸ }C47—êׇ$·°G¦juñJž*Þ@ˆ¯LŽg£ŠìM-á{Äc‚Þë¨Rn±¸S®=zÌ úÑñdYŽƒï:ÕLGt7z´NÅ4d¯p|‘Q…Í^”ŠK(ì¸ 1Ädšr„zO!þéLÿШ%ûC¤ÒÖÕx`¼){)›ÔÄF"K¾ ì¾Oèlµü[¼)¾þä`¥qòÓÏò:¼ˆW§¼ˆ!ŸÆ164x͘IýM±–×7Z¾(…8-dz/´äÊr²lÔÚ|ý‹/Žâ‹ÕßÄÐþטºhìýê†ø†iGU¼iiT圇,[g2E4ô(±ÞÏøÿŒg<ã÷ŒOoΚÎ%5ª‰µ²sra,~†Uµ[Óe ¯¥’¤rAˆœçД™«—C¬<–wí+¢´P!rü-œUÌ%®æÏ…zÅâÍÞ"p+ùuµ°]TÏ»à€i÷.®-µ³2ӭĈ\VŽ@>…¯ÇÑã²Ó¨[¢[‘üf c2C€y,¡¼p{éÃæ–\NE/ÞAh˜iØæ’Hêê:RÚY.àã¦Mþ¾Sïk×5‚(Bàmλ¯ª7¡gÐc|cL¾ÐÓ9œ2êg>YÀÃûóŒg<ãߟŽ!ls€í,]G»±B³\DYz#´‹¢ì£§3!kîUÞ?Ü·ó ´+µe}ßy!Ìx͹8’[íÛùCâ%Ÿd²+sB$ëË8òærtÛ/½š&}%52µÖ¬|-ödñŽʺ?J®jRrqj¢¼˜*þ]Gr–›>u¹ÞžJÁX¢'})ƒ¡Š™ ;˜iQ:8›J‡–!¢fšK|_#®Ô´‘Š ‹\臙sxµ½¸x†˜27ü.I™1sY²å=bKC“fu¬vDY ¾ˆTÏf—ƒh•òq¿®¨Œ9îB¶¤ËâÌÙ\´Dó;Ã^©g ȾéY¶W:£¤-@FÂR2Ù–¼†âØÉ6rœˆ[{–)5Ó f½^Y‹=\u¬™’…ªÊ<þñX¬\èÙJ¡`®öp¡Î@UÌ{ ÿC¶4o÷ä¿ún¹0r6┸4YjÇP^ÊŒ'["mûÎLÍ|.ßåë !nm”¤ŒÍŠè“RË¢ï]”YÖA>„¦Eð\«êµêúsw«¾£3†N]£ñ ­y´´°–ChŒKë=ªüù×öÔ{MÜ%ÇGÁ­?{ ߯üñ_‰%=.aV¡úá2×Ð-@Û‚-yÇó=E®ïOÞdô͵ è=¸'jŒÚßÔéÇãîMwa¡7ƒCš¯Ã+s +Á‚¸'ÙÿÖ4Ávë¶ÕÎ1ÚÂ*îø ƒ/ìöþÇî´èælökV/—^´X¼m°oæƒ`ü„ØÈ(áòtÊZC\´(ÏxÆ3žñÖñ)í׺è{-ÌdÃïÇúb4Uc\w ÕÂ1 «›í„œŽ$ åëþ/Ò^¨½¨æ–æ;íÄêÎjä%,;NêµG‘ßQ‘ÿQ8ìˆÈ›¢e}çaÒðM2a»,€™{ ¶õ'™´È¸Êòáéä²ãÿ|=ÌÆÌŠÀÖDû’mgŠ[0‡ÌÀàƒ¨³^؉·SL©ÄŽLÞ®Ôâ–õþóœGà{þ3#¯ ¡È:@¹i Eß‚]\¨m«º¼wSÀòÐÿÎ^DÃøoÀžÜä2V¯A¬O–V‚¯íl$E3½¼“qGáÒÑm~ÑßÅMù7>¼*[ó˜²Üñä¸u:ãžåF`jù½N±UGwšù—Ž'ðŒg<ãwÏñD efO3 ÎìçMqàÚ%s¿ãF~Çoâ ,<œdhˆ2^Uz´ËøNKÍ\(d¦¤˜é•qþ% ×,ÿ³ö áùXä•¢Ý6:©ˆbF‡'T (è>Ðв;¿¨Q(:CNø.Üv}ú˜6mb¨ã,Ù΂~jHEî1»9ëÖٮCrÅŒ ܤÚHP”ñuë%Ç¢ü¥Žnü4¿Žoºy ZƵïu,ë\â¤ôQ%5 †H(ê´%9þ|Û"HfùÈK±¼ùXÔ@¡Yµ´ÍxŠfh)XD†"G‚ë“u¢Ä9Q¯ùs¦ÀYr8îã=äŠ)ø™#A¹”БÈrï†h¯ÐE‘!ªŒQåô÷G•NiÁ,ƒLÈ;ñMŒ!äTßJÝ muÏo}´ìJ`ÊïÒ]z{ûB䊬cÎ~ä “ˆ-²³&a*ß‹L’îfd³¥®sAl:€/ŽáÁ[ÂÛ` ¾ô1ïñB«Z'í$£ü¢yÿ¹ÑBÁXîów/ö*ù…×§÷ñ_±ò5bÏk§ý0û^lö”ŒXöüÞ¸ˆ;•YÏ›ðë2êOõ¡P1ûŸóu<ÿÿ M4À3žñŒ_8>k;eÐÿ2¢ÿUS˜ÚžÐÿ˜ÀPø@î”…rz°ub—¬x´«z`U´A{(Fƒ¬OY›TqÁwdº îðÈþƒêæ"Ðÿ{öóW¢¨ÿM'‚s/’/À™ÏTûé`÷EôylV¹+ ª³#R®½unf…³°ü)ªžX?Àß.]qbýÃW9A¢C6ç'£ì³Þ'ZêT¬kÆ HAÅé¡='éwGчë|²«@˼œIgô‘s!*²„kßKv3=g½N.²Š+f±n—-8𮼹ާxž.˜ŸýQ†“ _–*Gq‚J/ møÅš½F$µ”¼­Á3²I¯‡œµL&?ìÌD]¦ªûGk?F+Aj×BÏŒìð:u–*£>U‰ú<¥/Q"Àßݧð2WÑ´Eÿ}žæ [³Ä›¸”R÷C²ÌuDw‹ÉËä¸ËËQÃyîyA¥VË Q‰"äPÍŠË8‚ïÙŤ8E_£sçC¼‰™•¿2'ïÓf«j\ÇíÈ»VëÒIø‹ •ÌØá=_óc™X¿ºÿ>ñæýQ%Z^ù‹ßô³áŽûf“ÝOÐù¿~ yÉ,} W·vX» Cúê¼oG%n“,1™jÅàý.óž; ²ÿŒg<ãߟÑúÑ¥Xìï‰@û;çNÈ~(tÃù[ eŠGnÉ{W°†`Ǽ E ‹e`xüé(Ãÿ˜ +gî,U=òRy¯é䜚^+É{c~#e,ݽVeÒÔ‡ºÅ±‚/ñG\2÷]YÉîz{îr¦OHx‰Â!ñ¦ï3òçZ‰MÞ'ËI¬¢«+F5cØy V¬ÍEõDÊSÁó”A& X*†w‡t.wª¿£C%Amà˜º?ñ¥vB§së»…¢­Ëãü¤È‰V†B÷Ëœšþìëã–ƒÇ1¿Å¥ Èwÿ„[”‚µ#•~¥ÙB¦Él‹î‰g;ƒ‘Ì’Á1ý)¨u"{ó˜ÑuÌ`'díKƒæ$N5-?»Ô$v· ,›—¢2½´J¹úÙ>wkŠdsgœ6X-2¸•%œþpæM É£xöÈa.JØkÍžå C¡xH‹lîiuÁ¹…GqF3Œx!x¡º]߆þƇÄ%kæí LGÊ•eÐ^…Šmïa,ºwûTsË÷_QÏŽ‘Ñ~bÛ"½ò6” ж|y‡$±ÕoÙ'ÛD~õßò2¼ú„iü¶þ: üÌ¢GvÉô˜?Hlümöô\˜[sGóµZé‡ißì‡n”g<ãÏøéñ)-dÆŠ>W]ñ›ÔÅñMÏj˜”?L¯9L%¢óWŸNÌŸSK ç¦ÕÉ„2|¤ñf¸¶B§)ÛHwRCþ‘±¨ã†ehA~‹–óP“.àç gùxMÌQñ/[c|×N~—'£\Ž(0ë~•µK-ÐzŠUØbÛÔß;´û£‘|.Ù)Pñ§²çŠQù€GE¡ËØ9v£YMA°š$ŒóVamÁbOVd„B¼¡PTRoþ¹|ï?"̦¦4þÙìtEа1A3s‰ýhr\Û²F×–Š:|Íl‘ðýãBýgÓÏ>aq @ó‹Ÿ M›žZ0'ÏÎYÈA1lœ²xP˜DtrzòBæZÄT1‹Ež3DËÔâ¦ûN &ÞãEHï :ó‡‹ÃÈôa'ÄR¥»BÓ¾ÚWM(g2 3Õf¦•º;î‘õÀ–”Çž'çè«ð×ÞHíPf47‘O¸ä:áÂ]ÖyK”èäÙ‘YŠGz‡w ÿûxt¦«Ò—ïH/.#Ú¸ñ©zsÚg[Râð%›Ñ<°7Ú®…€MýT|×&Z§ª—f¼Ï]Î¥mÞïY¬ {¦&aå§Ýý§ÛN­À½3¾rn—ÛÏÿw××։ߤù†~ÉKpeò†x>èÿ3žñŒÿÍñ)™:è‚®ØË¯Äè"b  ÐÌìËÿ°QC-"/X\F¹,®²l¦wükÈQòü,¢IçB!qæ”F"Ì4÷C|eAfI†ÕHK—[Bâ ÙJa‹Ëtm à²Ã$Ë*Ñ ­Y5"æ’û@´îE†Ñ N€™‚9jAÏ5íIAØ€~º5JŸô;ÎÛ#GÏs1“Ÿð¤®æŒ×ÊÑøä¡Ks–^½)˜só µ>CúâUTE¦Fï×éåÚKciÉr6M T@¥º’ I£dD “Œ –òÇvè&ödǼ´¼–tÏ£¿iÅ §§5ñ&½“IÁ¥Ò9zÉ NRö¯GèÜG,‘hìó86iòåìÅ óË%aœË¬Í"®çyKÊš5Ÿçž• ízkà (ëÆ†'”kŠ*’Öÿ¡;Õ^Å7/ý–ÂAc.]©lLҰݪèm “íÇÄ9,žÑ£²'Dc’“&¿ßBıYÖ:ú¬>¹˜3ÇÂuy;¹r2xpI8Î^‡Ö>l÷¼èŠ2^ÀÁK(jS-üÎõ*ž7J6®l?=h˜ÿ*š ÏŒÍwÙÂÁ›¹Š›’ël®zò[‹›?½€‹w§ñ¹}¢Ö“|¯CôŒg<ãw|lË3-/¨ÃxÖáÖô'ö¢­óšÄ$qPÐç¨ÕM‚Ω*]Ïпļè^꘬nj‡¤æ¢‰5ÅΣ:è°-z £ªŠ€å¬ÀWª­L&Ém=ãbVLBKŽ›²¢¾Ðß;€f]CÆÒè˜yä'! 2jëŽúúRÿãŒ!%—È^G2Sµÿ!Ñœá"zi’ÌÏgK³×%ÂÁ”²%G:g6h®é$Ö(£·9‘A 0)™¡²†Æ¬¯gw—ÈNYüËïá9/‚î¹7tXJþ·jùcí’¯* D'nºŠ+•j>ñE®e´y“ïĆAô])Xê»ÐêÜÐÛÚíºo¡Ú¥ N›ãyêï±ܾý§Ä˜ü nu.!l¿•)Xaå–w¦8[¬ …XF§)à¬Ë­1ëŠ-—5eŠûÛËÒè7ÁR³$Lú´X/l1'Ì9šœ•Ì4]~’»Ó·ÜÁ;f¶!Qó/§=T*Ns*þ•ÂR´ŽêÈ]‹t…šF˜<–ûìÚ¹fÚ0Ý4Ž.öÁe+Ôá¶ák_×L¹Ýóª¼fP.MiSñowkáŽo·¿só]üÊG½­ì•Çæå)ÊLqwL ŒÝ þ‚‰zÆ3žñŒÞø0á„ïyÂDéC’yµXÚ8\ Ük´§Hþ¨¾æ“†6ÄY@¨ð {>-ö‚ID3ãe»'–ñʲ[%d/êåÍIQ‡ƒ S+N D` Ÿs¥ÜÕ®ù€°b6 ‘ôü0®……sŽÖÙjt#¸£¹Çoì¶Lô(ˆ_†’K@¡I;ëÕ›ôÑ€ÁÉ´>3yéΦ…·ÿHÎÑq£IRš¸uÓ™‡"¡·Ef %UWxÁ˜Ù„Œý‹Ð˜ÛèŒYö•¦Žö‚Ê ®¸ï2mžŒSK0]©+xvWÀ”Ù¶¯ïÎ]Ì‚ú ‡ÅíÓß3 HˆHÖ…b¸ÃXsX w™ &Ö_™?3L¿à¿&àžÏXn_*ñ;æË¢¶ÿu‹•~Ë&/1æ\ì} hsè?ö_¡çêu}ml÷€ó÷Ž…d×Jj^^Ù7ŸÓ×µsomYâ6ýû¥—½õ`¦Æî>int‰®Ò/1­á?¨ä1®¿rxαÎ<ãÏxƯŸ†9¡m¡ÀÐŒ ÀT ÿ‡ìŽ©fd`"ÆÇÇ4“þŒÎaáø$Ô¥ô gä3ãÄåE5_~iA¥κr$áåÔá«ÔñŒ¬©59€´Ê’+Ç>w™¬cnƒ¶×¡.“o±! UðÏ‹ÚG'–qÌ3SÁÏ´ùú©æ’!×Ñ3I‚d/Ê©0§"BwsU½E›ŠŠ7ÄKYtTt;Ð’H¤ÁRà–q…¯·RÊ ÕdZRŸ¢6¶Ø½ÅNÏQV#fÊãç|l‡˜³GÝÈ²Ø Ìâyb–"Ù€³ç\Bg¦ÂÎIJýø#üˆ)%4ô;‘á÷¶ŒšDþ¯¸ ’Õ-*×|klñ½ðŽún} `ygÖÁãÚ biX¸zÚy«HrŒNœÊgãWq×|W×ÆÙ—iÊ 2 ï,, !“”•iÂ>jió÷­8ÊVÔ[}$  ŒÀË{à*ö—.Ä-õ˜=}Z,Kþ;@6n˜“QC¢ÅÍšÙQ{Ç‘_ÝZ¯ÎW²›¸ºGÑÙÀ#´löÕé'ÊÛï’òí$ ßkèûœÍFø‘ž© ïð3†ýŠõ3Š+öäBž‚×{} EùÈ“ xÆ3žñ‹Çç°ÂŒks íY:ù£ºSx¢¡Ó÷XY”êÏÌ‘2ÙΰEýÖã*=Y¢yhäÙkë,Fº3Ô.GSí|ÄL3“§^‡IÀ°ÈÎ,çGñÖm²æ¿ŠÔE‡»¿ãô(w yTṪ¨þåóGe×j26ý^u h1óŽL¦å@Æ'–|ªS&!î©^X Äí“tGrp,ûŽÕ6ž!,ä¹Ò 8Áâwˆ9—UwÖ3Ž„Ù *-ßèkó'ußþñ C¤à;%X\@Àh%r\a¸a¡¡ÏÊ Gʹ²îØ—Š÷ÂÈ«©%לZî³p;;)B9$¢è‘åkægiy×ßuܘ«vÎU8ö°¢¨Ùoü°³Ü9k^LeÉ„Ü(wìt—E‚7‘j[³!Ã/¨ró?\ í;¹ö äQÓ ®¿ûØ¢*ß[6 ‹OpÔä¨y•IÕ…ÜÏ;Mçù}ðP†{²Æo®?mËO«·T1‡wUQ,ÛbÞ‡RñîßTv¤˜ß Y’•sÂPG5Šªiø² ¹ðRPÖ«÷ÿMå«§Ýu7Î;þæÛqu]â•y{};roS½lÎW¤ šœ‡ŒvØþlþg<ãÿ7ÆçÁ¢%ÔsWi&:'Tè>ÙJ_`;<~Ê¡)Î9×ÈÓãN@3¾ÉÐMîÜA·ŠŽãG$ óÌÎ@b$õ¾˜Üˆ©/‡ã]3BºßÝ ™ 3`’8®kƒúw®¼ÁÁ:ƒØ7@ p2¢ÓÌœ ÀVt.\‡ø.±tn(^êwRBTˆDKY† ! ‹C!xó¥{$ÙoQÂ@Éf»ÈD'¸†öD5’%§}ñx–ʱ1JЃûWòd DO‘+Ÿ ñd¹OPì|YÅ?Yû/Ð<|Ô)Ä¢¬¦£¨­@‹|E¶Ô}Ií!í¥ƒNvç›Ä&¯‡ !Hm 2µ^B—®~Lá4¥.ÇÔ¼ÅBW•lpÿ_Š…d–-æJ³5ulø‘Â[ò±‘¦õÕF¾F“äV®`SÅQòöíðl´£Ù>e÷±[rīӊõ«È”V@.æ0\ÅÒ5;_M@%4“[OÜ޲ìôÕañÆMÍBöŽç%)Ïå ÙÍ/\kßø:ÃI6!½½ÝTÖ]s&ž‰•ÿy+ŽÚŸ°ÛÈj¨Ýã¿¶b5?\ç/;?ϳ¾å;ª<|õÜüèh–_ô7ñ;Þ¾³ÁÎËr%Ã6ÖÎù=æt¬˜cå((€a"G¾Ÿ9´‡<€ =vÿH8õ­ê¹$ö¨š¾šÃ2:K”3€P£äyŒö€dÞ—Ì!†¾Y2òZÏÈׯ{ "«OtY¦Ë‘c‰•×dã-ß1‹·ÙûäN³bÝñù*ˆgf½ÑÊúÜu¥òØÜ?áábøàT+§Gº/œˆ¹˜ã,\Uî'契udÞÆ'ýË©–ž™¥órM0‡òÂlè @1Aeõò æ2‘){f±.¨ÈëEÁs­Ô=–Ý<гh¯1…¸Ë¨’G³Ñô‡¸¡}Á¸[\Ò%ê¬ ärCÂfs©t©dW×{`âXó¹n 5¢Øÿî$”™ lôãÜ$ŠýmÀ‰ÏíäšÃ„™N2l@LRSG‚‡0  ‹f®sÕªe:¥Â¹†æ{a~G 1¹²ùɨ- ÄB× _±¥ÈéÚ::£Dßfx!·k —žôÜ–#ñ7`¸^—nhAåØÐÞ’&ÇIC"Á@y´Té8;;Ñ›ŸÍ :òP1Ç‘ÉF²?—zÓŒjÏÅõ×ý_WzºxÐ €×½8ší•C¼J.¿õËJ¹Íkú¢¸ 7WÿͶ)Ÿ#{oÊú4ÐpK|ÌPbš(ž¬Áó‰_bs¤Rzû¿˜åáûïÇ‹IVüš‰Ú?$_˜ ·Ù¬Ã5LÊòm ‹UÍú·ÓGIzÇ:¼gÒ_æo4z±(`1I*C“‰÷ŠÔn@}x@…Fæó±íWp¨ Œ†“A#Q9=ɇò¦ !­yL.˜yêªè>²j¦èrQ8™«ËÆSÜ-X¡çPËî ¿hâ+µ•Û—¿©æ‰SФó“U±gVûÏæV±c¿fMh{Ù>g?‘ðó2uÁ%å¥NHÈ>-$kÙòˆe޲îÅþ[&ð¬u6Š6B<µ.hiŽcsÝLꔎ éPI xDný1ÒãðÕÓÃoœýol?Â1eÏÅÎó–‹ØýœoÅØ® LæV«À[qбÖÊ+´©7 'ºÂe©=›øÔQº²—™R²K9lïQ:r¢ëkÿ«]÷Û’e}Ù¶Ÿ5«í!50éó¸©ðÂ"ü°è}/!PÝ-tuZï„gûŸM†Añi»¢¬pî^ð|–¥Zuöxä—X?ïÞà/™–^öeÕÒö±÷.ËÓ}+-r–ƒ÷§Mjs‹ÈJùwä” W ”øJ±¾–%Ëî6O:áÏxƯŸ¢¯SƒŒù3ußä˜KzcæØI­ŸÂ‹3XÏa7&—PCBT üž.^ƒò,¨½å{Ï$HçÆ#«ñ±¼ÜWÖ(šæ:¥èV…TpÃCB]Ý%«Îºé^ÄÏu÷5šÖ¼ º`Aº(sJÉê‚Õ^µ:Éì9@ŽáLhÄ/vÊ·ñC]ÚlâÊ™¶€ëŒS/aSfV+þ¼ìmÑœÑÅÖ¤13ÕFŠ~Y±åÿ^„*¼Í3™-‡•×~‚2µ!n¼f4«©û–¦‰*Êdv‡û“Ö¬â»Æ@Œ¥ÝIœ 5`ºpîÇ£0«¬Ûy8¤fš³­½nª—:>¿-31‚Ýey×Sÿ ¡ì}±Ï3Öo¤Z Ø"/\¹o¹§à²¤Lì›òý–“Ü}¸k?ì”) œ%vÇÞü ÅÏe.÷ñä¼'âÖ.xÖ!$ùêŽ]?9þÒÛ¾us•!ÛMÏŠûtJ¬Ï-ÈUݧƒÊ À¥qùa^tí“Z*ܱúÅtô´ÄñG§k”ÁÎÅž&4ª‚šän+zƒt­—=+|å´÷wCë”ý˜ÁCâ}yÚ°¦ãpËû/i`¥g‚ýèŸ"ö|Æ3žñŒ_8>³æs¸à™ ×ÙÕ碾œ°‚~C­Ô×Õàéä>¥¢eðjºöõ*¡îôY»˜Õ›Um#/ôãÆ}a1RO¨nOq(pä?e“Ña£zÀbÁ…[¶Çb£ »Ñì²r5Ê–„·.+‡®Z2„9+ß’ÃÔ0yZÔp›I÷ýzÿ˜'sߎҽڈÄé;CÇ,0žé"4 °Íl+­ NÙ ¡‰ÉdäÏuÅìIw…Œº1=];'¥ßX¥þÝb…ðF1g ÍÙâLè8¨¤${ÖðŠ0ì M~ç˜ÇÎ'¡¿.Ð äÚ%7zjÁ2øÃm%*ÁÖïô•P .KéQÀ4è¿NZ²—‘j®³Yñ½0=¸bšŠhhÄYt©ƒt£øKüã«êK™dâÎWݶ¢eÓYä‹•fµ‹æS¬ËrÍùé­$’BE–²RïÈè`ÉköÕ+ߥ£xq È6äRÑú–û F  §ÉW]Øj­½iy‡hjT-êïÛ­•}øÄÖoBa+J´äE^?ØVáOme¶¿wyÍ–MÆù»¦‘oùd¼`tn+…Ÿù$™«®E eL.èð5©÷OÓ3žñŒgüµñy2Àâ[®¶ã,f±ZŸ ór Wþ=sÈ,r„œK;[Dƒ„ Ãò¢Ì©‚å|:¦X1 ¯½9sS˜”À8ó%gÂ"ׄ.T”þ•£fª{¶ïE¦pZ…Øsi° .pé×ñU1£ïp~Ò5gƒ[á‹©0YêouØÌ*Z/Цœ¡þP—ä -¢fçO ’w_XŒíÌ’–,[Ë­âK¤ÙÐý¤oàÈÒ]ÀêIh&íÈqéà)Å”U=w ZH± ‡bêæ ÷i)+i½ìÓòHÌ1S™.íDŸÉåØU5ä” >ýŒá#²ÒÚ)@®1­Ô5Í$Ò >cÍPk'ó%(78çsš‡üرþ‡LˆbWWZÑGÎ&•}ȩ́Թj¡›H¸¬™ïw‡‹íë¸ãdîäL˜c\l úÍňì`“ &ä!9aån¬ÁzQOê œMå»Hx% aiŸ´gíÈßËm˜³‡o4î æW†S£)¶yé® 1¥ØyS¿¥ßß?þ¸û¤õ®ï7M³ØO?Ã̳½\›ÁË¿üZ®¨u¬²Br¼üFõeÿ—†+ÚC&u×á&.#çÛS7N‘3_ óQ0çÏxÆÿ‰ñéñÍN'~Ì¥Xœ2 6Rr…’…ãÀ"«²$¬KÕè"Ø$úf"©ótK«M¹Žµ„<²ôžgÕ\žÕè¡Lušð=BUæÎýGÐ’Á»T‘6VPK þSÐŒg;À½:kbتš˜Žp zÑ®à¨úIx¶ìà (”)˜Ó:@@¸T§@‘udóCFUºmRáòªºóô܉ڙ˅Iœ ïšgÝñæDÿix!.¥‹™C2oÌEú\y¼aê™Í<“&ÇñÊ2«‡¼§2דۡ,'[õOLȹ3$W."–ÄA6ƒyüOVQ-:ÀÙÜ^6lív”8†×b­Jü¤€ *"æhdFÃÓjh13öŒgJ7´yïÔ{æÞøtmý3X ¿Òõël#Zª¤_|šâo05¬±*M=·Ë¯s—wv]Ó3Øq3îÙ®CÍà~ú†c% ÔÅ¿¦ª–À{ž÷tÑl¬ßŒ‰·NØ?ÏÃP~íÙ‚Ä4îþ3°”5ûÛxÓŸ¾Á ™ei¥u–z骈õ÷,Z£^ ¯ÞtòÐßEØÜr2¿ý¿aD;ŸÕÀ¼ú‡ƒbJS£i° þ@¯Û3žñŒg¼g|ö© h£Áî0fu_ªrKh¦ì³ž¾™qI=Éø9“ãˆé8•Xb³’‹k ËSEDi¦¨™BÐxäÄò/&„§RzE£ŒO¢è‚F{;g‡T—n³RÿZdNŠÙЇˆS}¿#Åõ£Æ§Ë292ÁCRqL_ëOM“2TáC. SR0Øœ :$ ‘ÆÑè56=_:ìÌý<—·pª˜Œ!ómƒFÐàÄ?õï4vÛlÇxÈ›[A”u>õ×^¬Ø¼ÄBW‡»®Ù/A * Åé^ Õ5©ã(@n›Åä$ÄŸœ;Ó2I cùJ§tŒÀ0q7iš2NxòFzÞçìæ©c@œGÖkb{æ]elÕ8³<¶8‚Ôïa\§ùJ=‚ü £íÎT,NJnº™§dÜ!ÊnÞW#®ÒNŠ( K~¶>ÆG ²‡ÕÔ™Îkœ1'V¶ˆoªÕ *ô{Ë©L´s¹ßG¡¼Ñº sv×ï½`Û'lIW6¬\[°çúy™:E¥'Âeº¯Jšý’ýâÎB~ «×;‹—Oÿ_¼y¿ïÙŽ—²K»Ôªé÷«ýõ,Φª_ª,RÞ†ÞÛLŒ6ƒª¦ðä‚-Š";2‡ÏxÆ3žñoŽÏÃêµLƒêcÏâr!ö€œ:EŠMX‡± Çs$”MÍ"*Ô§)>8’>¶¿;JE,Žã’¼+ÛÞ+`ƤX…¸Tnɇà#g«ï\¥!ce'¯8wàIëÆ®0å áJÊ$‚[ÍSï*7è lsí £gäop›.ñêŒÌI~9D’ Åò-^ï–(3jh"’9%ãeå,ló%çS©9,mTÂkó<Ò˽ËH?^°m\Ï'.º[,Þÿèx xÁÚ¬Vð¥-ÇMM¡Ÿgû¹ûøÔsÎ%Ë.#â#¶þÑJŽ~‚&|þÑwÆ3žñŒŸŸEu$£šßHÒÎJXˆ‹õøµ.&Æa2°u;µ–À7w’Iø[9[›Ì)€n‚˜™øù¾¢9ª¤•â” 5Q@–ñŽ—“Ç#éÏ' Ù¿sQc[85µkÝüάç·´ p~ÚE®1 ‹rº¯œ}Ûjá1Y>:R‹™Îó9'ÿf^o÷·`ûÎ 9Õö~A+m›PÒjÌéÝ—nôRW‚%—U•e@"úÊcs2r,“#è³ ¦ÎîÀj§Ï¿y.%TˆëÊóÊ”!5‚¾Q*½Ü‡ßëÕ1®Ev'ë2jV%7ÙþßeGù¼uö^y‘:]Ô@O«=\&-PF/®3r?$¿P>ð-À4¤“Œ‹ÛËÃÇ7íë7†6~¿¸/ˆM¡i¼ç¡»ýb¯})Ëhç'i^?Ü<ã†()áÔw}¶¬ûgƒðAÿŸñŒgüïŽÏmëõo\^×Cjk![—'!J ¦sBÅp|ø8ޤXϰCÀ¢0ÈM=l4ÕŸ¶ˆž¿ëµi®7RDº¦ü?v(†èu,•¡ÀóL2µb=ÚÌ€1¯øòAŠNްÇZP}pøŠgƒ^?›£`ŠO¥+½¢Ðº}Óñ}wâTÆõ×4ö£`ÎàüY‘ARU¸ØÎ“.8eñ)®ÑÖ“A~›ô+±¢ß‹±3=!H)nô+ŒŒmœaÒŠ3<ÚÅ•Ÿƒb…çÊrØh-b±Í®ƒzÔ†Ñ;¢6mÆIòJã9»èÕOA{(|HÉ”Q‹ý&Üié.âå¥Ãßüí0³îŠà º»—°ùFÉsó›Ýõ>à(¡=–-8;>ä @'ÛA¯!²þMvöå?‚cb鬣y?³Ñû¢ð í£ôcj-Xlòß³¦ÜyÁ½šø¾Å¬é.TYm$edxÀ3žñŒgü•ñí!$1ûpy¥ÏÙòß'åM®6†~‚ú7•6ßàÊê=DŽ…ÃøÖºÚ Á£¸Ÿùª"ßðCfHÊžk."XqæÿfÏcÊ“¢)†è êÇÙúö€‹l®I IM¨ukŠìÑö½ qáùuñ^ÊËG^ˆÍÀöÀiõãœxîc«æM »Øý@'b;=g$×\0Ð`Ül%yÿÉ ë‘ïtâ)hû öÐRv‹õzR¤ yT “ õ‰“ìhã;[À€sÍO8Ë4‚·Šú<á#;2‰";C«h-3ô[Ѭ¢e'‘"ѵԟ7\L“tö¬Ø+£Lؿً8­xú»O¾;{¹Œ×ÃüxÏ­àêÏQ˜MWñÌÚË.ÍÖÛ•™2Y¾ÔÁ‘Ȱ»@ÖèÓÁÜ%ý)°aÁ?6ÂI{¥Ôó^äè5œ±…ëÉË7c4ýcŽšñÊ Ò±m<û/"%²Q´›öïûC\Øx|Ók ¿«%?#¬—'@rÏ¡øC¾¸ßß85IËiÄ ›©¾M› ?ÿÞÄI³<~]®|g9o“tbÖ¹~úŸ8ëT(ˆ ¾TaOØyžñŒg<㟟™qd @ŒŠB7ö^qŧ/âjx\b)KdxÙªYCx4eÔåË Š´6¡À¤T%^·ˆæ™à‘îÕ¢óÁ¸ÂéÆ%V4š6>›¯Ñ%s–Ä#zÿ ‰fW$U(s<ðC¹¢ŠNÉ:-å‹«Ÿ•t‚H| Èm±¤ïDM. Ï^ø×é—o08cèD6u†;¢(‰ÃÝD¡\nÙáˆÎÓbqB/ÁÑÒû ²åزnwçÖšOàøHò^Œ’߸1Z€Þ—æ‚<ÖÔû ?pï0¦Í 4Z »4řի¬†4ƒ~rÇI¶F•´Z,ãL†EÔx.²fâÄÜÆr,ÒÑ­^øh ÐˆÓèkL·@‰9fYÖ)tç0t“ p:÷xþè³2Á ÐÉD¸ý‹LžZŽÀ&|Ý=Æ.SQj@*¥n¦×_MÑ6î“°]”—æ¤v@ð¶.pþ2]#„‰­Žg,i³KaʹÃ:»Ó½×Ã[u,•ë·}qþµ¼)ò²åÖú;¨ÒË(Ü5`ŽÊÛÔ…êì~K«…4v®¬,Zå?3÷‡ÙÒ!×Èí¿ÚXd¼ºÿùœ{uÇéÀ†¶3#Áµó¥Bàwž‡‰¢Š¹Ñ‰5Θ4Cݰï¨í.O'Û›³LIž[t„& Mõž‰âra¥y9ÎÁQäÔX] Q¶%Õ¨ÄxF;'Wæ¡f) Æ';¢h-Úd.|´ 2Ên:f;q)0¥ç’SF¬€,ª=È’ ØЄ÷A/²FüUôßq1¿ ¬²Ð!ö]Ui1¶Hÿ9qO m¸ºrDÉZÏ‘ÎZb(¥ëæ{áU{/ü£û¶¸yKô¿ÎÐÇO~õ5)]¾ÖæbþSdÖ¦0Ûý‹=Ù©p‘>ÆoØrã·‹7¬‡$czIY®xH—-¸¶^o€(ä’îj>{Æ3žñŒ¿7>†¼¼Dgó *žé²ð’² šèf£Ð”š?ÃÔø…<†Ñ ÃP¾Pwo¡¤ñ]µËÛ«¼*”mH¥ÄÒq7OHÑO`²Aáê­Ê¬ßX¬jgrèjJvc™Í0#¢cË?G%3ëB,A v9íVÌë+õ¨Ç$ÛæGËîøs°K3óˆœ_{€ßÓÕÝÌé„C+î ˆƒìˆéÉVk Ó} .0œY4ª¶¯@9Üà›2EèØ†rf1ƒs{ Ðói~o0ƒã4ÖÉ0ÂG®hÏç,—ðllwü{G䮕£ÃÀ%¯cx/‰¼h †Z ál—™Ñ­Þ§€×¥xÝ™ÑP{µˆd_ÊŒs"ÈîÆJ=Þ9æˆËX4¦Å"îBN92ˆ¡ ¾¯—%p¶;.eHËëF¯.ÕUÍsë |ùÅ×sRmWh$­ãcayMt¦·í‚? ùÛ?3·€)7=,oÿPV Õ‡ Æ_^Ä’@‰\¹ÓÓU:¥>Ì’½³] ¥¯•rç0Ù×!Å[ÐîZÚÀãžaR…i¥uÁÖ•Š=9-ÛÄÆ[Ûb½a/l!6œ‡Å6æ­V¿µ¿¸nfBÒçY1—šx•…•b›ÚïµÆòý?ãÏø÷Çç e¢°š„ÈäàbTØ‘`HP?Ï«Ø~UZr‰nÌÎSð¶Ëqù‚„Á×êžÜŠ:€p ØX—¶°Ga,©~ÑÏùmnë+>_ãc#Á¹b=¨¼ÎRoª ‡nÐJR7©…ˆ+ú°‹¹ŠG +êöñ]ÈlhI¾ÞÇŒ; ¦Bßó®Ø$PEþT±ˆ&K2­™s…zŠÅÛè—¸´—ú„²Âvx6Is„pŠçÙ@Ph_–ÇΛ|6bÜÂSà!rqæsèo+6~ÛžwѲ  «ËÁõà»k°‹™-U┩#‰ïEŸÅ Nñju—!<9òõ&¥b³nћ͗í¢;­ ÒàNu6™ÆÿEÙ;äT9A+Úµù$"X¦$é]ù9Y1f E²íSTè^]ÇÙ$ýëÜéRpêÝÇŠ–M”FXVQAfšFdµÛ 7ŒSkÔëÒ^߯«žÓoAÿ/oª×ßîhX#¹ô8E²˜|V;SÔ™·¹î´9‰Ð·žÎ[²-¸­qõoܦۤñ\õN@7»ÏÁînROÛ!ÏÁÕ3ν?ðëžyŸ•ûÝ5û7¬o„ˆuëð:ÚÍUù©„£úØ4#/CÏxÆ3žñûÇçáÕ2@Æi…ÛÅäfE±DÝYR.Xø%gAkQ*n«;]I2‚¯àâÀÄœ~yau€ª‘ÐAz·oÙ' |}#C# ‘¹¯  V¯úõW4PZ·r®,Y2,L#Èö¦ê`Z 8Ï8Ö "°Ÿ/Ã÷¬™1÷3`ñ²1o ûÀèÁžYPÕAé±9žéó>0‘ŒÃcXó|Qê'7¢Õ~B ¡/jh†Áø¬õ Íï“«Ú‘Ç@çì‚Í0õsc¾¡T®Gª³=cg¡ûĽ+'c{NõeéÕÑÛ¨Àv²«ö³œá4ç¾nˆVqÚifœy)T14Ž$ UTÜÏ ¿™K›á™yZúgœ™¶ãÐ9t›Lô'Â~fOZuu)7ƒEˆl)Ê~E‘Æf”˜Ûa\dDáæ©Ry/ ä¤Ê¬ô„Ƚƒtæq‰;Õò<‡1$Óu2_¾ü±•;‡½Œl*âÍ+˜k:x\Ú<áT¥ä¤o6öpK8&êWšÙÖ[n)bm7pt¯c&RK¥–<àñ¼×jÀ7S5§úp;±iC-Òƒ9åî36Î-qžs¼¼O°í  »1™|àí礹÷¹sx±ˆ7Ö¦Œ+ŸþßbçÉï¥÷ùÇ{äùR<£áÊõàݪ‚ÍýÉ¿2}ÏxÆ3žñƧÐh €òð®U¼2µÄ¬k4‚ËoõTÕaÖü6ÐÌ>¦ê_Ø.p¸ô/¿†«¶TpùTQû“Ó{ÚtιðgŽÔÓÅ‹ $Jéãö”Q”WER ?V-ó¸$ªì?ð»"l}vi®|t4G`^«¤‘s.“|W‡­"kK"é8Òüèp-MEqÜ÷kÒ­£Ec7¶m™ÿhWK¹éA‚•(ƒHRéÑ1‰'Û›Âó¦1‡‹1Á>a&Æç™²È(ªúdFœ^@2£`v9ƒxñÅìÂCÆ…3:Ó}¸'I„¾_U€mû³¾a—ú“Ûµèúã›Åû#r”ÅD8Ú†k—I<´Ø‹¦.èe½†"øÍá_ýw¦ ~!Âþ>ìVÉœtó£Ò> —I^þ··.úéÿÜãÝú“(;jB’íw¥‡¿æNvÿ¤=̺éµÙÝÒw[R.Ñ@¡hËb7£`^°ÿÐèÿoBÇút=[`tv§Ê$‘.ìä28½ÀÓ•M 0¶}#_Þ6¿ Ⱥ–ùȪÙd<ÈĹåK»ñÊcÿßaò/äk¡®W]âµ_­ŸÒ0þdö3žñŒgüÝñiÊŸì‰<×ö„Ü¥Ä5cÁ6༠8µ[¤©ƒ®G=UH.q(¡ t1¦wO³žßwØ:¬ÂÏÃ(3ðl9Á!®’ÔkF8Ä*ió1dî”I ñÈü㢼qæîøãž:)“!VT†2ò_ii‚–2è[/a¨Ü&Êoib7Ë0)0øô&~—ò þ s(§<Ì çmPFø£™ÒéP!nF@”}/Ä|"Äf§¦ßS½<§MR…oð¤öi9¶Ê€2¥ÁL’%€QúË{‘«là4)8Ä*š²8{¶ÜSªÉTðMjÏXÉ7úQÈì¤w+£é"î•3Üc#PRPlcLÝ KÔï8¦+ŽcÌI¹—˜/b¢— äù’Ñ+´Îo„9*Ét¢ <íéa®¢aÔ7)»óáÞýĦEòeLr-T5æÌœ |] gž É>A †²LHn–¸ öeŠ([Æ­ Ù~Šyk8å¤ò$)͘º‘×µ`)×¼‰ÔxžÀÛ©øvü…ÉÝ=ÆI*ý(ö>½JdõõÓµR?.ö‡Ùå¥NAòfo±·:uÁþ­<åX¯tþ·èvy/‰7å“¡ap®'02°{Y£U(½s”¶4!úvê´dÒÞ†Ûã_ÍÜnG}ŸíÞ ãêO ĉå'£±¬ôÿŒg<ãq|ž^ûLíÍ#z+Nzðâd%Æ^›Š Ù2±ôõ ×»Úu$ª«(£ˆÅÐõ›ˆ—0¼¯?JQñZt@žO…4שHô¿òÄ‘±~ÄïàÒ7Ô³©Äñê¾>1;ˆ0;B$G‚‡–œZªþ ºðœa†ôEÍ^Ä[F½YÅ]14MÉÊšŠm¤ÀSÑŒâ(Ÿ>;à1 žHA òÙã¹âÒóˆŒ,œØŽwV4…­Wþ8›¦Ê˜Šb¸xf˜†;¯®n‚EíTeŸòy,òh|"tR½L8ÐÈW ω -iؼ«BãÌhÿÇ?<â­5½rfKm‚íàq®!øº¢Ê)R´úÖÀ³K²2ÚZ×åaŸiI A ±&®¼ˆ¾ÏBU3ûjû¦lÄçâ²î¤F輌S—%• gã!’ Ãåˆ!.Ðx¢åŒJ'î2BVÂ…pE½öÌïYã— ž)Mˆb³ߨÅqà= Œ+¤9ÂßGðƒ%oTPl Õ ¨Œ ^ÄâcëNï]ÿÁsnª¶¾"¶ú9^Y;Ü´åÐë#ÉÇk Û[º¯àt†`¾ùTU˜~ös´¿éEÿ­ÎtÞdX~ÉxÃëÈŒ .l*ì/§º"¶÷^ÛÜÏxÆ3žñ/ÏèÎ~ÙÁ¯ÿ•u…cü™x'&øÃ!ž3žNG2rO7ÿ\Û¨PuŒ\Þˆ°ðžÜ‹ Î ‹Äbð)#vI£h:a]IJ`l¦ÏÆ~7 *2-SÙºë´l19lþf¬•æ$-Õr/_yóy ^,kÕÚçj>>õ¬ÓnN†Sfr{3È;/tÞv ™‹€ÅT3ÕsAè),hÖ± ´a¿•aEDÐèÔ ñ䍸ßY#MÞr-+·ˆâ ÚŸPðÈH@ÄõÉ(ˆDN«¥ØÃçzs#ämã¾9Щ˜‘–éÈÏy>Ñ?ùYÖÙ=ûÊÌfLý|ÎYReý꠺ܱyuf;@Ô«Òo®0šÖ·15/˜¤€ cs*-I¿†ÐP_:Ïôå¡Q«¸;½ÄeKù`;cDÙOª¯œå.g!¾ª6%ååžLvÁ¹º6a³¢ó²~Ä`ÌZµ0´¬Ñ¶¿D­:Û¦¹¡Lö:–»[’ R$lØÂÍçl‹`1ñššÜ›én-©’ZcÀE =»^:®~ì%#¿ø£èÉ ¢ÒD|^Ñýµ‰’[¥+g…Wí³OMØcݯ±Y»s!¾+œ¶D}ïÙrì¯î·íÊ7ˆŸ+ËÃÆÎw"²/³ýp|Ðþg<ãÿ·Ç§†UŽè:rb|C²$j®BäÀU ÔÙ‚OÅÚ#%o¯.ÄÓ¡pó0¼X¢Ñ\ pØŸ$¢ž¯ã "àVÁ‰>ã#t °àD·9Ï4m¹eäex@ÿñ·ˆê9TúpŸßˆÎ*x”Eq,Ýz2׈Óiak°[BáÀz–`hF^Œ PxXÇžtÿ$"ÜGs»zbb©K_çƒ)ºàÔ3‡#$ô´@!2‚%‡aºØtF©W¥t{îÈ}Ü#!7гDöÈé8ä‰r óÒ› TPÔŸˆ-7IËr¹c¦ðžÓ „è”=²5*VÞ/Â7TÀ޶8IœÊ,]ñOÒ8kœEÙ&Só°-I“±\g}¢^G7q²!M÷†ÒE`é ܬ§4<þؾ&滵_•ÆÎå¤4`Áâ²£ºÄ{ØYå„(O¹.è,tè g3 Vfù¤·âUºjà£ÐynVß²&¿Rwzs·¡‰sôÿ‰°VÑ8-èITc%~_Ü|ŒÌ?í_¤÷ÐRè\T8ØßŸÝÄáÒIf‚)Ãz¯¯7BsÁÚ+²÷Éy3:N&7@Òk)`4µ_;\KÖ;ŒÜsnjö®<¢Ûøÿa6ÿ-•A††ÝJüÈÿ,om^XnhVsT<±ÏxÆ3žñ 7> Íý·Ñü8¬'Ù( K,>BaȰ¼s[…äš`m^V\JF~V~Š ï¦ºc0/÷Ñ–yä*Ò°åiF膋kS—ÃüCÇ#q2Pg±¨ã—¯N\¨*ŠÈ eÔÔéõ˰ŮÄôŠ«"²ben’Å gœHÆT3t›{÷•šƒÀlòÞ` { Ňðq3WûÌîõ?§DÜYF ³Í"'CƒãYöîHê ¡% ¹À_˜ôa7ÚT«P©ÂÖXÀ,±àø¸¸›³6 n’¢ò}(b},£ÁðÏ´«ù•ÂW:9aA³÷ˆd%J M,܉T» 8?¼K½L“òùÌé®Y8ÇÛ/>FO¡!É » ‡èû+uâØL6¬È’;q¨F:n€2ÝÍÉÍ;À ^{˜‘x™*2ÆF ›4€‡ðR ºb¸qh¸@¸j,Ó½q= ¦†Ñ9µÉ2˜Ï§ô܇%FKúwú1p ¡A½^±N[UÀ6 ]ÎÒ>“3ƹ¨ÇÐnwðu¯ðKÀ·±s{û'™eøpYt”þFêýâ5£TN8Ëb#}fFÁœè:¾ÆÊ9ÿQ`)ºÑsºê¿»Qã@¤ieXwWµó+œ%O”ɤÛv‡}¼÷šÿwƒ布Äsãr‰éCll“Æ¢·;δ`»1Ñ3žñŒgüŸŸãÿÁñÿq Ž?àäLðûhõ‹ *Èã«Vý»œp®¬ÄÉ#¥Õ Üý+*ØÈÉÎI xŽE‰KQU(Û$Duµ,2—=Ö¯º‰9ºýxk.Ÿ¼PÚÓÔ"­b©]Œž{Æ 2"JQf&BP{GúŽZÚÉŠÏz °â‰¢@ÛÆfƒ?úøû,™¤°ÏÈÄBí7œ9?x†‡ZŒ÷€`ÕV‡#˜E5«Šv<é íG\8i.ìТ̭sŒp4¦ùï–µbqN“Fß"—Iˆ!KM‡n›Ð …°¼Ë„9N­Œ` Ãç ½!âàŸ¯oü°q/Æø3Q—ÀÂåT,%{aò<ʬU¤…â,|Ë5ÏÇœôùѺþ^Ó—'º)ýx–ý80éHÏ6÷¯‚²Ìè¼¶·rZ”~PáD Ib&•¡¨¦³4Ò6Ò¦Ó°š:Lý¦¨„¤…j#¿È†Ú½Í=á{Š2oГ«ÌTM*$‚Òp¶æ {M…Ç{˜¬¢g&³¬ Í=‰–ß0²šðZ ¶úS©ü";™ +îªI¿þ½ãåÙ9u(dø@ÉtO“¨CK£¢ÞZ-’+¨Xf$Ž4~ü¤ü냛K}C]½l®.?‰/œ5”q1¶˜×žñŒg<ãÿÊøÄÿûFöÿ þùf‚Æ— ð8ª'Ú~Cÿ3@&êUL´m‹÷’ÚC0€éŸBYe° r@z­‹µÃ:ŠÐ³æQBú¸ ÃP[1Í'ÏU¨ò‰=¿„ノiGB8³LÎÅȵU¾¦Àr×$‘óÈŠ9NÔØ´Ö\ÜÿINò€­±Ãë*ÏYÄ$€3Jñ6hªŽŠæYrpÑ!‘Ó8J¢ïú”¶žÊ rҧس&{åT÷ÜU´ ÛÙŽ3E`8-%S}OFOž õM†¥gÉþ`A"Oæþÿ³÷¥Ë‘ã:³HÙçýß÷~cåý!‰@€‹JåeFŒŽŽn»J W dÒÒ.%ý€„’µ¨+ëCI3- açðÄ ™"/Þëhƒ,rˆ>…TLS£˜»Z EÍonŸÇW&Õœ.š(IÁ¦™ëšè ýA>ç]…PÌ#Ó—sœÞh®ë²²–êÎýÇAD#™€<ÍÙÓy鎦¡)©¶Vý#¨pCrÏdäõˆ‡D•nl%qDPE—í“A(w ®N6mwL¸Ò· Ú¡£ˆÖÃ4`Xj޼\úMâ»Ì‹'$JŒµr倡ЙZ˜Éœ0ÄŒÝ/ 'ùà·Ö[˜ÖõÅê¾Òs §Ìñ`½ÃÄ ~!$“Ïo“„HÄû\T s®S³tu1^°c9íÛ¸HL4þþã²GnçØ3²ìÏ`,܈­²»R ×PãW8¿¦°;æ›äàv$7=|ûQ!ߎ¯½°h´ÄR¤KŒR'óŒÈ,…ÊÁ÷æðÂGµYͤŽQ&Ùú~d”g«]ÎtàTxfÜ!g° XË}%wf-©øu1f³wyJIžö´§=m¸}Êÿ,"ÇŸ“ZŒ¢òƒÖ#uŠãe;à›€OzC†Îógâÿ0¥’Ðyd«j­(†|è ›!)—cOÆü<úŒ³C$àYnytª.˜Ã0P)kæÄÝÓÕN!¨‹°vçÆí:ËA¹ßÇ¥&ÎwTZÐŽë¹Q¦9 l3”,E¦Ž “úø‘Ùži?ÔÓ/üÛ&¬ÌIpºƒœ? ¾Óâí±z˰² Ìꇺ¤ÃÕ’pÔ¨Kö¨xÁ.äÐŒÖ?¯*HôP:pÍ;«ƒÊV^"z˜»£L÷mj­( ä6U°…§”Ç)f¡&ß8pÿít±â¼éú˜,â-Ÿ£˜Í¥•ä:û‰}e,uñ—Ĉ#ªknÐÚ…F·‚‘²qTs¡Ëƒ; åòÛ8š@§ª³aNªæOŽ‘­¯Zž É]Ї ⪚>`D}¡k}R}à(!‚ÝÂ5&gS”ã&Dt;È{{8Qɦ6ï±ê³r«~®eŽ\cÄøq”n.zʦ }ÉÊ ç?Å*¯Œá}>̯â‚ÁB‰øÜ}=Ó°|E@£7¨‚ÞwénŒUfÒ°ôME a€åÞ{aâU1eJ´-MÙZs¯y™´Ê¯sW`g&PÆDØØ2=xyKÝËðÛ/‡‰»!Õ¥‡WÄ=×,|ñi«eÊжÔHB1ZøòÊê™Éi9â“ûÿ´§=íßÞ>åKd•¥$-.'w¹lY™‹ñU@ÏÎUVÍtì÷k/"*‰ÐfEeîÃÒ%w’­h˜FB:È­ˆüí:‡:ðÌy×xÄ‚%Zj‡:­ÉƒÝS™‘K øÍPZ­]VœT ÀúHRÈñÙê6R,ï°áIÕO)qÚ)îeÃØ‚÷Eû¥°Êaº¾î©¨L¤Îí$ÛfD^®ãkA`棆”K: 꽪PŒÍ$ˆôÛ#ŒœóA“˜9¬úoúóCÓyÑkc—aÓa+Õ]‡H/r˜.ù»Þ%²Ìe à4÷é˜pjD ÕZ að'ŒD0CþÏ_¿u IDATØR3ªâ±üW¨ô·m‰ÌYˆÁ²ã›«òEÔöŠ9U€jV4jì rçëf™„Õ$a 0É„œ&Ä_$ãÝŠKÖÆÜ6}énâkÞ\«È¬ŽÇ#]Úé;ŒŸb8#pý*{Æ»Ÿß?i÷ð"ÈTOƒ69¬~ÜGß”½ÇÞ„e§»@zÍ€˜ºm Í"FUk ¥ÖdB#7ÿZŸf°„ûHlAwCËQ)jŸ¼k<¾„LÓÈ0àØÓIuå@‰Ö#ÍòHA^悹 êŠO Ž¥À¿‚“^%ëðW5:Â'W»Ñ3‹Ê î EÆhub㑱ÝÈçè˜\™‡7N‰[æù/!™:Èš†×•Ä‘±çisözHÇÚ0iÜïÚ©2sâÁüŸö´§ý§Ú')X•%eÃñ_,‡©±ìÿ…âEærˆ(¬„ÜË*‹ÂhØ6ÈÐa.øTÍ8¯í"(/ì-$·#Û>3ŸÊ†3ê\Àî¯,WxÀ¥°ˆ@N~ ä<0Ÿù¨ÓQOèMâN†ΙzO¨¨*èK5ŽðÈD]ªê±U}J&¤"¶IŒÍT¯ò 9õ Pb„LèÔ6 WãR9!O½fip3çœ!ÚÈ¡\•’N—jÄ|áû6óºÓ”‘¬óX{€]53Ý™ðÄÕ§ÕÈt°Óª\-e3‡ýBŽ*$˜hx0 5ÁVaKTIe/ë«,†Z¢ðØÍŒP°%5Ö¦£k§p½"—3 <­=ñœ±ý_ ¸Â¶²öv¨PJkº¢BÆÙ¡ì(£ã!˜£’Co ˆ(&ˆ¦š"ÀKu-ÇØ*^ôëoGŸPmMÍ)ÓëE {ÖÄ=æê9F^™©<‰ÐˆÓ†‡åP©Ù$î3ZÚÂ^Ê¥ä€È¢âÐÆ~†0|›TU‘ÂñÚ:aL Òm^Äâùz`øB¾ÙðN‡)[M±~N¬j ’ £là+ñ~ûnXo,oEN‘A¬ŽvD{RÝ—HŠ—z¾éÜÀË’ä»Öùò~ôŸoø<Ãô®ïm}Ìã ˆ“ø{+~JŸf¶ìÞoÛ²†Ž×'2ð´·n_ÏìzÚϵϕ;ʹ¨ÔEŠàKiÁWd,{@–3gsŸÄKåu¬;(Xvaá/ʲÊOØ"v†iœ[m8%7F|ëZO8]tû~B Ý^ÅqVJê ¹&"H®Bׂ‹—ìÝÚæ#£o)LpU)ÀbKøOW‡=¿Eü  ²we¸tp•„ÝÀƒ|È“KZå>·01ÖE&`sç´ßH!ƒ‰*οV×Y?;LÝO¡*ªeQ~-Tl#ìÕ ì¤ÕY¯_›ÒŽî‘HÒ•|qÃLìòXGr¬¤ÌkFèêEß0§woLã ]O‘ª òIäö"´:‰JÏ\j~¡ZÂ$PÅ3Ìü 3ªéãŠPðvB±ÚêMõÔ*8BnPÿ¢ @3Õ‘•"E½žIæšC^Íöó–±ÊÐ!ÈÊÏ\/9Åõ:51ÔìöÂs±ƒÉ!€éB†½›N/zîlƒŒùIÞ†¥ØŒÿ™ÕÇÞ2QV×d/ôçøÈÀ6Ø[³ƒ“=øÎª(ª2›¤5»’õˆ$®ÌžÄôÈïØ… ¬Ð ¨)Eˆõ1ƒž!0¦×ãz&6m6!ß`óÖ4Û òüÚv˜“),Hv¼‘o³g¤à=€Ã÷À“кØ6DÆÉf²þÙ]ãw}åv#iþ2¯âm5Ù? ɲ#ñÖËwñ5ǃñúòµþƒÅžƒ‡æ}Œ›ÖûÓžÖY†#µÏ|{Ú›Û'$Uþ *¦`P–õÚ-fúNl(ôA8>³ùØëþ§0/¯Üÿ ¦%ØA>©²ÕH#Ô©/¦v®Tœ„X—™22ØäU(¼Še‚ÎɤϾïäÆ9O6É]Ó\4¼8ölLx”p¬Rl`¹¡ØA7Ð@‹œ7‹hꄬh‚éØÀ­g‹ŽHTŠžåQJðuÒVè~€Øáä-]í@yMžë¦J×÷„E÷hq¢Ú¡¥Lø%€SÔ@ î„7¥ÓÍnâ>]ò‚®T9¬1óETž<뻎%©U¡:õ7=ƒJ׸÷@t9Lf.¤Þu×Åñ8-Â\}ÌD˜N–V(Ë}δý«RRì·¬ÿp[–£lPä]®ŸéȸÛc碈r%©êìm'#Ò=ïœîÙ2Ö¬.;¸®™¯^/é9E•+AX½Eйq ALAî߈2:ŒQ,³ e—'Óò£T~d¤Ü‚Íwv°9-ñí>€uÍ“B%Œ?`a4Ll‡ùPñW1ª¢÷˜ô'íuÆ4*™Ï:O?õXt0F&3¹no1˜` _À?jWÔg Q t¡‘š4à=‰ÿÎø¿ŽŒ´²k¹q× ‰‰.ˆyLñMÍöCÃ…ìNÆÌ¨¯ÖêүϵLí¹ü–oýrˆýE7ºDÅx½Æ&aì ä¦Ôºm‚!vlý„ªž6uˆ_Ûd0r†=íi7´Ï’ÝY NÒ›àj)©ŽZ½„Á"ò¡ðˆ-Òð©M9²®²~Éò%«¡¦%eá`ıË#…³@u”*”ó+Š-gÕ˜æãìF$’>ÕïÞx3Þ€a²<íöð BèJSÝO”+~!DŸCiúÕÐ=m9áf¨ ¡j\¬Ïæ€ÎÝ‚õÅзAÌ„š‡’Uk:#DÎa󛬙„bc†f¹¬‘Ù@ì¡Õh¯[Ú±†J¸&h¬äUFB¼$Ì^D¯Ÿod¼©Yò <ì‰KO‚\ã¼z7]æUÞfd ¢¤ˆ ­îü ÖVN¤òÎᎨ¥Vi)õ]¢Qö…Éî­”oΚ»¬ànͪî¿&¶J‚Cs ž#“^2|²ºCYérMÐPÕL}íSlÀ©fàEûz0Ôjj\ØR[¡!Šô…1Ѓâ7=D!ó)Ûð’!æx†®Ö£&©ý±ÎÈ´| éèë'·­¦póÄ€ÓXM€Ö³cqbš«‹ÏÞÈÿíé—$PŒûPâKOF«qKŒÐ@ÕJö0SüJï¦2Çkh*šOȱM~d›•ém!3Ú'΀d8î JOÕdt³åEêÍPl°ÜØëž7(Ö͆©kižkxÓ&p ® #.Mà©—P±z¶1Ч=mäÀÀÝsôiO{CûÜ6>ä[øÿE Ér`O8òå‚¶pOñÆ"üYöÿR¶¨ð)²P’«pK`þ8Š-*ÀU°Š¬gÁ–G¹Å°šÇñI²¬ªÑ+ÿÖŸ,Z ¬nÖ5=‹Kb9ÑzS¯fi¨¼boÔåÏÒ0}’)í„{éjnm¦O¥…¾²9ž>{0™—kþzEŒ°ƒõF\è(`¢ÒiËH ¦<›¼BTËuN˦GäK§<~0—¨aPÔi”…Ë5švˆf©íü†› qUPû!l"µUQd•.u=Ä(xtíiO{ÚßoŸbKÊ Ï~’ á~­I…ë¡J@ùX•ƒóÏZÔDìÜA"Ÿ§$(Bp•u•g'DVÊ×*ë*[ÝÀr¾“„본&6ÕÔ¡N´ú±œÇšÿa+Â`ÂØ×¥•åä¯#£¡ÅÅÑ¡  ôèw\`&Grïî'vSœ¶m³€Jþ¶ˆ€88÷ëU¯Ãf‘ëÏ1ü4E¸Ájèȱ :¶ÁàoÑÿs16 ˆá‡ÞH/;Uü§Ãì’æ® a °QùÉÔ袽&ט­²ñ {]ÿ–}§¾fZG³qDçêŒ`DjÌj3q¼‚·ZZ-âÄ{ª¤¡9Z¨èù«›¶› ‡Pm^uÏÃLv&…ˆó­Cµ½ñëa%ßkiñ)B•é8ñ0¡Ê(Ñ*³²ˆ¡äÜ\œ˜9CÙ¶¼ò^mp TßÉzò,»q¾Šx¹RÈ»MÄÇ*ñ¢Ñ£y4k(ñ|l°t”¥]7m9to> ŒfÅžG“EÚš°LÌã78Ö ¬´« 8 û¶ 9¯²‹t“ÃÅûVÍä¦q׿Ów4í‹oÑnggŒ†)«Ý6ŸØ šO4³šÓ;fÆ5Þ·L~EÃï{L×Ó13‡¦Æ?Óýÿúz’§=íiOÓíS;3t„ƒV¼åKÁ8<&HO„J¡¡¿D(ú`Wþ~lÚÂ'sI®ä"\¬­¿ ¬{Ñ€¦Ýç*_”e•…MmÈ"W4ÔHÞž«sHD³ƒ@¾–Sà ÃíJËHÎ×Ì«dàôö½Ö°ùÝFfB4f£Åª¡ìÙă.e‚ :?tœ'èvœª„;ÔŒó!;9&¬XV·×±,£aÔeäNc¬Ü¸Ä稼îŒ!yEˉD׌üPÓŒAf婤j$‰Óa#J‘¡Hf;¢W í[T(†ãÉ ß(HÌ/eBƒCy Ð¡½@ìv¤ÃÅw9'oX˜¾Ø@…ò}ʇA©ž M¨²¢Ãy éQ@³Ã©”™¥”,ØÈâ^N·T%hVÄŠþkh—Í•ê‘ì'®jÁw s ‘þ€«ãphy‚üÔƒùþÙ® ™“[PƒøcØp‡Å5\€Ax,½o˽)ϰœ#x¬c·#6¼Ärá&&_AƒºÛí1åØ$¬O“K¨à'gcß ¶yóÊ·Í^}‰§{píSM“Íãxvø~ åPg¾ôxSéñ˜Çø0ý,htý¤eb$)ª¾¼ÉŒãŒMÜ©Ãbší—5\âÿùs ÛÝl¤ï½ÿô|¡—oAÛumÐÉwE8Ÿ"€§=íiÿîöyBœ5IŒ‹N  þIf¼ÃÅN°Œ†k{-l±Ï*ÿØ ƒ#0°UlO²bûþwÂ0Ç“ƒ«ðKÖU–UÅD¾6Ê u§iÎŽ@³ž>^‰F$T¿ÑF|œ>±ÉÙ!•Ù{Ìrº{¾8“ÌV3jŘ*Nu HQë ‹pödJƒžW¨CŽ<¡<^4íg$¯„&¬ƒk`ž[]f;«„»ZÁHôgà!!Ö‰íhf/¹}ùB†þÓ=ç1ŽKm/¢Ö0 e2@i/gå&. ^wcœo­ék«L!H¡‚J[¥ƒ²¬{Ùþ¤«ŒÁØ]‘9’ ;E\7ýüQ±ipªHÀ)Q¢Až*ŠÁ:Š^œÏ J±"RÍ=…þ³"Á‚$ó* ëÞ]Eà`ÏÓetºdžûH£ð´ìüÕþâ— ¡Ó&±Ãj„›Rxø°ù“ þVû|äXºå”£<ŘôB±Ù3"—¨v¡ïÇ7‹uš¸Kú™Re´#?qFà ÖWÚT×›B®Joj\9VÆJš~<•pø¾ÊôJ¿̱5ë+Ùaƒæo›*TØB¿ðÚŽñFÀ¨wšBç»±+ î½€üps¯ ÝE|¡·ñòl¿áÎáË·OM¾ªcFã±ý¼¯9ìì^'ânç’«ÙKÜY~×=1€§=íiÿÖö¹arç&¾SX“‰XW!¹|šëˆ™,G `•"G¶¾‡#! ,~)¼u£çþl5‹ÈBŠ€ŠþöÓ¤ïæòV4ðuÄT¾ÙÆÞðÁ”o@ÑÂÒ¥àaðêTy/­wôWi¯ÿ¿“þ²ÇÞ«¼¾Æÿk­æ ~¹—J´¨THÀþ½Î›+@y&áÓžö´¿Ù>]®gº É+ Á»3…§’›#béKg|o,@Xd¥|áäí1ÜÇÇW–õà'ÁHíŸùP–U! <òú±ñíŸß)n·¯,B å·^)ò%\÷ò(ƒ"‹,Â*õ-{„OaB˜÷}jH:"ì"{Ðó¬ÌÙ,@úØHƒZoØŒxŒÚ‡k«>J6-: Q»§§³‚08H¿Û¶uàÂtâxziø« °¢Ü>SÏú¢°DO€épXÀÃE><¨ÍsJbIvµ%Ϲ+Ð*Â9Œ¨»$¡,ȆAæ~=q«ÁJ†´Úºh [PQ„¹Ú¨Tw'ä SPS±QPcÜjæ4ÄñÂȇÛÖXo4÷Bâ¸n;çÝ©™£Ym1M_¸ïR%ó(ý¼!§ ”ª#7… ¼"¡6ÂîŠîyØr«k›Ÿ Ò0iÛðo†»¥”ñáž‹jÇhp.3ºŸTï—ùøbæÈ¨ŒŸŒ3šˆ™Ð&ÀeQéO{IY*Ç›–¢½7fÓŽR T$ÙÇ7e&"ðùVÚðÒ5—ÉU:(Û\Ð'â^›Ã@z蛪e¢¢ÚüÓ…‚‹Cv +äÕ/ö­¾[p®¶µ9@Uôêr Êr¾ÖáÚ÷zò¿‡E{íðÊ ½ãm:Æ!û„®w/Ë+ïpOP‰?ÿ*?ÜÞº|pÛe8t >Âi÷þëáñýÚÓžögÛ§F k¼âC`•Â_Ð êÍF cPØÊrà&+‹Ò PJ¿Î¡¥B‹¶“æcU8ŽÊÙÄ"XµÎzÊ,êÙ6¦’odoEë*²ÊÇjQÖýXÊrÝí¬½:i‘Êæfr2³gqˆ¡‘ïNt¢sÇ)E¦!E>æ?ñÆ­+(¨º‚‘GQMÚÄU¨U¬æ]4e¿ÄE!°Ã'•Æ@ÆR­Q{DÀhVÜÀzf„<àUÖ0ThйŒžŸlðp[ðTö¦<*xühÓ£´.•µ&K n‘%Ûfù¤ V3Œ¯â[›)ø<7*Žî<4³ªÍ˜‘)ŽkÜ- \gµiH 1›RWƒ½ÚÆT稜E Y†¾~aªsªfTÏá-XYÿÊŒãFA¤­âÑŠu¿£yk"‚êÇ:…t­òÕ`§EW©Õi¡#yÂwùcáœ”Ô ‡éVmhÀßä§»ÑPZJ@jmtõÀÒ®XÕãív‰„ÛH#lŒÎëOxè Ì” žÝb0سdô;wñ’Ï~vVÖû¶e‹«>ü9g¤¡Ç²–oÂ'Y¤(FÐ{öžàè´|IIûâIž~®U;M>ܨœ]ËÝWà ëmD¸E¾D–E€=ûžŒ\AVâ¢<[ǰ¬GTF›qרb°"6[ÀàCˆ“ïJ.RÃr(\e¡¯ØÁbÚj†¤œ·„UŒÞiM ­ó³¼ŒêA:?«šQ$øÎˆ]ÚMo´Z¬.?.N=¶ÿÆ zAldM2`ÝEŽ^I-×iç<³»8]P·¬èq(ƉÓSYT|2¨`_ñYÿ-†¾·C6óz€iSPÓk+ ñ†ýeHØQÉ!V)稸Ý!Õ «›Ø5žY³t:s÷ Y@[€Ôe¸w?|^37j^Jì‘¡{ îͤïG0¢ÕêBÛ ÃuNc9ÇÑ´®†¦W"½JÆzÌ¢¢CN›ˆnBвJ 1à¶n?{£ð›çbŠux2+Dûƒ¥äŽÎ` èÔRè&@lCq9Te'H$äÐM™¢Þx1göötcãÕžIvh‰H³wuèÀ!­ ö]š Ì·Pš6>©«ÇÆ%­Œ_sÈ¡—óAâA‹fó—ƒpVÓ‹W źê‘mzR¾¿§‚˜ß²¤—W}˜m¿MB¶,ƃýë}Xð‚0x#&ˆ°qàÁF¢s…;zÛ4t<¾M†¢¡¡%c› oåÖû®·†sùÌѧý»Ú¶}šjŸš£²3ïKœ¦:G©¥%O'¤¬"²ÊY(ë&YdçôßA„:  ê4ÖàñŠˆ,h¯+À²”6‘áEÐðýΘ´ˆˆðSA9ëA(äÒóWYKl êI#€›~Û.fg¨ 4<}åäפÈYÜØIXL?`(ãÚb™Êq­Ê^áBiÈˮپ®zÂeijգÖ`z…¾ VdÖƒcAi)ÄÓ –°¹¼/D1*»béS\o:¾uºàb_µö€{ø|ïrÔ!¸ÌÑ7TÛ«g0O¾Èhf\7/#r‡¢”gÕý™Ç¨×U–´Ûf”怛e‚þ@)9£šZ©ì°¥¸ÏxIaZ”T¸¨hJY E Ðà d¾îºñ Cœ¥Æ5b9Uÿ‹ ‡ ÂÙ†(kº,Þãn-R²/³oÔYˆY°‰$÷aç¤jï}vEcèŠ`jªG¢¿c³Z›ñA¦R€ˆLê&±LÀž82–¾ OLð½î .Î 6Žƒ¶ÆÆ írVùÆCìQ4;Òô{ÈR^ïÁ §™±Á–ýÉɯ|Óäé¬lZ?2Úm¥„éps;Iüõgý/`Gü;Kþî?³g«=Ðñ·f +3ãiOû·®î§=íhŸ.ïUS¦Ô^-3*sK¤€Ü~uL>Û½VЬ®¾È Ѹ)µóiA$’•ˆ0Tà ´€+,Œb@¸ìv¦]—ŽaÉ,vá/ˆç}×CgxY6ã™)¶Z|-ÉÄçl­uæãE 1„Y®õ†ƒÞC §>‘o6NY¥©&‰xÜÐÕGòY£Ãu "zÙÓnžš®05ãÒXwш£JÁÎJ.p‚ÑZàUÉ͇ZhŠKcµækÒ¯ãüÞ3’ĸ*Å…+N§šÛ~Ós­h=•Ct;W«AÌÂju4s÷\íT.ÑU¡Á|«ÈÁȾöWðBNV=¡Ä%›ÓKÝšÍ=¤î•“$éøéz,ºEý®R¡®B«uÒ!@2Ê•¢2T–=]ÙVÅàñµV)4™µ ýyêÕ«¦¢ÒŠwŒ.† 3J+uºsfFª-iw±s 0ïÀ—èâ1 ËbÚTñ?TF…>ÞrñÞ ú˜L]`j Cw`p¹—t¦»y!ß®³Ì ]%ƒ‰ \N©ïüD…ÖÙP)Opÿz›/_áX³¿«D©àýSí6Ûœ3ŠæKðþ-á ΂þ–ÞšZœœE¼ú>… …—~Ô1Y IDAT%ߘ\ÿ[á¹îjcì’¶ýò©2„t¼‚xÚÓžö´7·Ïh–^a~ÂÙâÔÉÓt0%+/nk6(P–Mûw¬GF|$hs ѤË!ÌO=ŠÙë|dZ S^jÙ”=Ë©\º(:ý”…´æq^5‚ÕûNûìMõUD4lixJŠ€wlgŒ,r-œ†0“'V§ m ,¢ƒ”˜²laÀ¥oÜÚ]¦ëì98C7*Vø4ÜPºpDrföÜ:©£zNœ ®¢#gq̰‘¨gÓÇg=YOÕÑ?·«ÈÊ•ÈdQ$6ÈG߀˜ðÿæ!“ù„Ðd‹€(Î8 ÙÌëªÞ0 èWŽÈÓ¾EÑJIWa?'CÚ¯ n°4°)v2Œ”\~$½äØlô Bñ»K e¥Ž+‘’ð89ÙðlӴЊñ¤¢ ùX¹úh¯ S<ÚˆFÅ3ÖƒÓgrÓú6™€Ç˜o‰„q’{W!|Fur‘ ξӋ0àˆˆlkaé¦sæ´æx.á â|±a@_tÜîÀCÌFQ¾·Ý…éf3T õ·Dðò„ìîL{#Þh»×±0ßeQè7¢šUŸ`€Ä¬Ó™ï™1œ‘ÇH¿;ÃÌó«ÑÒŸz¶n…/ ÞåÃ[ɇ[í›Cóßú˜_LyŸö´§=íµÏLïÎír&æ394O­¹,=ö,¤ÁÀاh{¢ˆ¬ìˆÀi|fPÆêpjÔ"å3œt·VõÎ?ÜIb‚J»X‰‘a£Ë·Ë›Ká(žÈT‘5틈˜¥%}®@DôA:µÕÐêD0áRˆñÙì$Ið„ív4&¥w9~À£ëcžš¢§d3§8Ëh ’Ž’ë8EÏ“¤wüsب@™Aà©/Ú·ÝEzzcYI˜jÆj/2ì$Ôósø«¥²9`:LAÀòFÁ5ë[³·Ž«J…Šá½ÄDéîöfè a—fÍ–¸¢ (ÄÜjüJÈD§Õ&i£k90ºT¥êrÌEôåþàp‚öê| ªÖ´¨Ò6 /ÆÎË‘4óQ7Ÿöl¿ç¢Ñ\q’‹Ä'EÅÏæ¹È«¼6`‰íŠŸx³¾ßë~¢/eà‚áÃÐ$' UeH´Â3ìœ)[ѳ~¢äñMhU#’téÆgÄX #@ÕlÖùÛXÝG0·V/^NRþq†/@x}ï@3f «úu9¬]]±‘ž?xLç)2zã¼á9yÓ·˜¿àlûÝÃ0ëî½iƳ9“?7"=\í üŽm䳬J¹xÚÓžö´?Ú>åF’÷dV¥‚ElH–:Ö(ÖêíŠFvU)ê<ÿ­IuæB›|¦™¬ááoª\K&̃½"«{øò`ÂNëèÂÆ9ÄÊ3/Ü?¿lò Ê?a äg=WýËqA¨:T,=‡„ïZt†‹Ÿ„¨0?ž¿=_'hK«fYçZÖ(0VwéZ˜<ñ9ÿ c§¹‘?׃éÚ¥_@´ŽÀ[±ýI¯"c]C'ûÊÒ”ßU¦‘1w%½Ì$S#Î/;þ]=”!v@ƥЊeK*0`£nOénJ"/ȡ۠D%oŠNŽr’ûf_œè9!RmÕ½Î-Ú3!æã‚ “ z‡X¼MÇÍI=s€FLLXNê¶vT±5.[¦ec’{´Ši½ÞÜ‚ˆqÞ¼ù òͧ‰T"Jöoh$H_qšç é%]ZgÆ¢'½N¯À_L—@€ ÝUþÏôtxÕ9­6䄿dbH£‰õÖÒ÷‘ñ9Î)Ts@çi‚ÎWœs\œÆŠÓ/¸¬}_æÑÍ!H®q¤q&Ù×»Ç+á…ÁÂõÇû)¤‰SŸÇ3?Þ!¯<^íùž#þÒo{~—ñ–IÂ"2&ß¹ˆr‡ê[&ØÝ=ü ›9¢m¶òG#ÿƒ1¾mDðÃr)O{ÚÓžöbû”•S /YÄr›¸²&³ ²ãë–깞¹í\EVYt`•=©ßÁô›À™ü®@Ũƒ æP·¨¯›ðCQàŽþ—¤xhlBóêàd%*|ý{ ²ˆ,ØY#4b…#`’÷Y—½¾¡ø¯%§{‹F,åÛSHY¹ 5ƒGgµå5—âaºì;N‰—èÉe/ñÓ†#¥…0™då;œUÙò[zÏõuq )9àËôªXõìe—£É†¬D‡ HPæÖO"W;F„íöêë¡–fJ…/-äxU©5n,Êd˜fJÐÛ#´!›KZrÖ¬¬0emרÅ0µ/ëünÒ–§ŒÀmK%.êb'z­ÑdÐ;¹í1B¡ÿqN^V&“á&0´þa€Ðs‹•`ptqFô€§] !M)ûêf]v¶PÛÀ#'óa›DRnÝ}õ×?- @¯"=gÝ^’ý‹L€=Y h>P £­£ØÁ8ÂÜŽò‚Þ£4ã~·x¿Ñ6b‚#É>C»ÁŽ|Y/ùÝøieªÖ`\9IH¨Ëùò›â…¸oí=W9‚þw# ¿QÊòè9ð€4œñi±”Ÿðꔙ넷›ä‰ß*ê;¾œ¦1ò»paí˳G-x3Â;’Â"¿^Ç[þ)|Vøë´5ç|ŒÞýË™3D<1€ß4}qÇgžö´ÿLû<cTy{‘µ‹b€ *Rò°¥‚¨ÓVáºëý~|¶r!3)©ý'"S ¢î‰ð”Ev"~©²³O9S› ¿®²¬g4à|ǃîYT\á,®_Mí4ãÿö0E%"‚E  @´CËö1b9’Á) tUdlcãPšUäC„+6¬"ëñZ«¬"²î%¦´'I:˜&3v‹ú1|×>-«1E‚8È áÑM¹PàÔ]sÜ9I(nBÅn>æéw1õå<Ñg’â§1&Í RG/\ Gù2ÙǪÂÑt 2ñÉSÉPN3Èéú¶±¡®1—› "îh¦5«5e8‰òªíΓ®Ûtr œŽ¹>шCƒüªCq£ÃT*ö9An«[˜¿ f¤üÊéã‹`¢ìr#½[‚ÓìÌ´zþë¤cþDc¬¨xØv›ggVÅ𣣡úvÌ*iЙ¯a=_c×`ù=¥Ã{Õ[[:öôzã%‰êpéó†õü ŽkÊ5BŒÈ'¨ŸC€Á'4…7{þ™bÑD˜‰ñ\z Êâ5—™¸§ *æƒõº+Ë k&¸ûK.3slèüò6æ¢é9#M9è*~™B±=Ã1Ö½r54’Å™pu.½Âãw¬|_Ћøã=½Š‹{Ã-êЖ†ß±ä/÷ç_ƒÓª°°¾¿Râ¸æé<í·L_éÕ=ãõ´§©ö)ÿwnæP衃?N”~)m s¸½gEYE°È""[€‚¯ƒœgñ¨Ê|—›®²rOºÜ"ëvåU°*œ”Ê­-âG!ùJå—Î}l˜Q‰…˜t`žp€À$to=)øØ JUÄ ÁžþOY±EDŒû€óI>¾dÁØo±Ð6,äQ ÄV _»¼p +ç”4±ZBJ–Á#¶Fó3à@—Y@M<{qˆ!ĨáŽr™–‰Ùã´‘(/ØgãK0hÛÖu©JÏ´åÍ‚£ä*l %a†%œéåŽgœôzƒA&/"åv²¦“ÒjhùÑCÆs.Õ £wˆº”1 rCfZJG&^Í"äÀÁXFé`ʉQ¨Xþõ‡ty œi ¥ƒ2`ñ#S¸¡¨PK |½”6žqÂÄQ\o°³¢¡N—"m†2 „XÒvæ†l[f–’ ¤næ'•ãl]l yÖjFMÃá©ëg Ò*ë§BÔ€3‹x*¢ýЃ‚óÃȈ^ÎìºáùïÀS‘¨; º$<³Îp§^¦“ž(,Àü¼wBß ]Ý…¿äk›w]yæ—¡A˜N ïO Žè¿&º.&ɯL-\}ÎïÄ 1üv|aþ!\ ÓÿméìøÖ•óÞø×qÔЮtÿ¦ñ» *õ»·µ§ýgÖãÓžö¾öɃ§ÐéP#ѕ㠬/çÆ»R>¾L’&Äh¦slßøZ**|9«@ÊoD=[)?–*Ÿw{¤UIÔÂ'&¬ †H,WOAvö˜>ù–#›&B Ë!&,PùøP‰ö8Ë Ê-dU®®íêÔLG –MOæ‰yÀQبˆ6‡²(YÔƒkÉ môAk)ÒdÚ–o"ìá,c¶B ‹Ëô|¯ ' ‡¼-š¸›$F–FV¶?LÈŠ6Ç‹Ž0v8YQêhÅ`ª «òä*€ãÈÜs$Ç:ºv@k$´ÖWÓê NÙr2(€R™Á?¹—ð18_|žû$ÿâ€3 ï"m]rQ ŸTDpÎÖäK¤_°å£&0Ó”ø«+šñÍb–q–¤šÞ¨—N®W±³i‹_ LÔ^|úšTҢΠÎc8 dXÉ’ ,†‰R˜u–$«#P(©ÖÕ,•,¹?Á˜.×óp`ÿä¬ïÁSJu£†û1ÊTß)€ç€â, ÷aî {£77%¿ù¢ÈÃ_qJÑ1¢nÃMòŽa{é]‰Þ:gÚb³˜|K±27uòqã4~qMò¾+óÚ˜žÖxw‡\^6?‡˜ñITûf·+y\Ó×½«oy±Â “Á½¿Aðyv{ÁÛåƒû?íiOû›íS“ä,S®4W ( 4zÅ&^2C¡Y앱°±ÕcÙ¤rx{ÝÁý“Y¡Õ; ‘ÍìÆ«8¨ö‹ž­‘©¤)Ï'Üþ¿(DIÝ(ruÙÈW‚1sQI²ñ_-ÓÎr¤aê°JárZp%¤|T hÚ“~Á.€³CÁñ!²PžÕý€=ªVÈ*ë?‚/àKäK¸îC,˜BšŠRŒb]ñD’ÄȶÇ J5Yÿ¨5SÓ»'7ãHÔXvJÑëZnfΨ·#¸ ެ? ›íNM!V\öç˜_E?vÛµè9 t¥$b:=ŠUVÅ/ô(†“ȲlPFšgKê$™º¤-(±Öàa5-쳩±6 Œñ!F+%žùe3 )Âøø.ö–ñÛô:ûÀPžÌõ¶ÛLäã8§–²ñV ]µp•ùÜÛ¦—UK›‚¤V¾ˆœè7’Þ4À\¥t2 ò m!™bMJ…ß!_ryÝ‚ñëpöR¸(è*^•Ÿ|Ð]·ÕÅý—ýpü9øãô¿Áòw9ûeÝò &¾‚fz0mfÈŸ{°F//™Aý††ì0.Íá?ŠP¾¸ÆgÜt‹W^ad²½Ic®Ä%ÿ(þ¥Óã¯/¥;æÇUXð+FäÉ8ÚÓžöGÛ'äTß%ÜC+l»ýU¾-•Œ-< -\¸ ÿ.”u99%ôÏÿ®²®"܃m(KÄ)_"‹lÆ[Ð<3(ÄAå"~Èz°É©],á"”#µ_N¥ÀÊ!`)Û?â?BWªB×4€FÒ €)F‘˜æü[–#±õÔ‡,+°Š|Äé€\öîP¼.+¤ÈJ|_°þ#ë?ò±a«PG­Ä4uwúlŒÈ÷Ùæ,ª`ÊA+ ” ²€A#•ÑÎB­))4ÏIÒ-“•<³¢¨r=”ĦŸ é†Ö¬§#º°ôú–M"= 5v쫦N6 ˆ‰`óÇir¢óÙ(¡UɱÜ=]h›ƒùT”N¤–ˆP;`ÅÏ™¦9³‰K˜‚äë£,ÖmÚ®šu¤Äâ&.uäc’V+â(5[¹Ç¡7úu‰‚yïÍÄ~̪ȪçÅ-8E¸ÉgÛ/؆XQîº<ù^*2Âq3Úí}϶§¨<+Ò8S˜‘•UI¥(#vCÈNL9?¯7õ~ƒ,¼É,ÿ%4r*¥´1êE¾òeÜppo·'¢™ºÒ%Œýð}• ÙËâÒŒ’Ž–Àeàü+kìç‘¶x¾ó·»l&¼º‰Mb/Î1üôŒzÒ·/lì¸ñZ/œÅüݳëiO{ÚÓ~wû,´qvÄñ¬’› Aa šÓFƒ³†•òù%Ÿõ ÉY BõrRîl—Z·Šrö@°îäk{úŒJ0Ü.Z<%åe‘Uö[¬ËI4tñ9ˆ} ¤´Oy¼>èI-Î…Eñ’oZ+Ù¾‹#Ä"…î¿ôùz^¸àï,Ue‘/œö pQ©©Àù¥»ÂE°…¶pÊÿdýGäÈ?"_g@H¨lÄàSZn_`à g‚¢éópÌ• “ÐŪï6¼µAÞLƒÇiV% EúuˆªO0Ê®Šk‘>ÉÚ“B°IÍÖO$F[ÍÝîÁ®„¦ÑIæ‡)‚¡qªRË¥2à†BCá¶~j[M¾Â„‡Åüô !5õ:Ý^QG5ŽYg²1ɇy“ÙXqᢆ_§EÂm&`*]¾Uˆæ¶¨óz¬še« ZDPJêBóÑ„9ö½bFëft3ü@æž± Ùe’~¬!é‹èP—å¹»º‰L8զЙÌYžòÿ‡€¯8·#oYGVÙyzÓÓAhZÙvè*ùëÆ>ù=Ü>÷âl“)ðCÙÜSé§ ±oÝh9Ö¦oÞTàåM "æ6‰KûÌàèpf1°-ýMÿ¯7%o‚ìfÄY@ùþå9ËUÅ|`Âñù›;þÓ“üõÍæYø©kñÖuñ´§=íiO‘Ï“Qgâ—ª¢_D(+d¥|,²pÇîïnÃñW±\üÎ÷S–uW¦¦™¦¬[Fºì‰í_;6­róy‚愆ª81tœìEÍuùR§Ù¦7 g,yúÔéùðˆ˜+5Ø´v5?†y¯vߟpUØwÁƒ¥À0lBû[.‡¢€œÔ@åÝEÖ;Y_êp¾—A3w˜<¢ø~R>D‘ÿÉúAùþOø,J!€57kþ)­9_׬ìžý¹·Ü"a|^1_.X¹¹Ã®K[C ÖNH9â•êXT² ŽÞGëd ð…*£ Þ‹ˆIí½º ÜÌ·º}YyaŽ›ë8ž™6ÀGÊßGDgˆw·‘Œ€ês2¾W‘Ñ…S¬ÖHì1,C3¶8{`aío#ˆëè˜PgŒôŸ­Õ´ûu9«£4!;êq?¢é5'^ÿ@2»"‚xÎx¿]ÎzŽ ›gx4FÆHÚšD/…ÙãÕYC0˜ÛÅ;ýpÃm1€Iä¥;[Ò¼­fQœŽz"}Qs"*TúÍ~º;ÝøÊh1=€†àÅöEn|áî¦=OÕá*S(6[ypKŸ Iè7ðFzç(ÚµWÀ«ïŽ[€¶#ÊÙR|ã}ò%YÃäroìyLîá/ÿ ËÞ÷iïêv‘iŠÞÛ§úÓžö´§=íhŸ% ½–7<Y‹}´œÒç{&þ–æÏÄ/Yí:ß|kEV÷£dÀç¶¿–=™]û¨ûEŽÒ€óúŠV˜‹p9Ï*I€]S·˜õ_gIƒ¯ gÑî-£rÛ¬WöÅŒÐì4)!TCʺ 7È^ ¿BY7š%·Püg"Ò8åIF”Ì7)j {ÝÀÖá§ldA_Âå"{”BpðÔ P’¡êº*Oäa=ÄÿcäSÇè;ô(h='|"Òˆä ³„eÃ&Ñ“®SÈMöY5!©ÐÛ9€"D„UêtM]fš#Ì…xÎÞÐË ‰wÝ&AbÀ†ÍOóø'±Tfé­?I&ÆàR›§ßy/M€áG•j½àÔ] s?p¸ôÁ:90Z´s‘E«¬«|ü#ëÿ~`]„/ìE²ãÈS BˈeBg™hë’Ý7LEµA Ãæ•Ó™æ =zj‚Àw”³y[êÁVÖõ²óÀš0 5ÐÏ&[:âßP•ȈÄX0ë¤]œè?ܰ)ÑïúMàè³`fþ-¦ 5}$ÏØÒ«¶eÎ}øÌÝ—-$â!éøÚ (òcÝNÛç¤ÑñõâÌ*Ù^Œí÷`ýåºVÜG 7ªµLØz,;dîónúén5Ä;!LSUì£p¨²¯Û¸šëSEŒô)¼# +Q,ÀÁR¦P&ƒ®PI7'QIv÷aŒîÑHÖéÐÊIÍ$í`L“ ®å[Ú¤÷8·ã&œßÈdRGÔQ” ºE`~…{B'jåzÿ-âûÆcNÉ´Îæì_Ó/|ëÚ[\]Hbç’œÂL7³—1ÖzŸB/3s£»^(¸c½ÜeÎÏCûçOÁ”23âºJ‹sP^…o^õSK›­Ù ùOà­¤<×xFèiO{ÚÓþ^û,`\I4ßX_Lâä¶oë»Y¿z~9Rì «^kU‚Ï|R¥$,ÑÿT­çÏbðµJ;³¼ÌK!I_½éyY÷Ϭ^ÿœÔŒÿ‰§•3e9q‘"k üp6âz„1À€Ù‡&ÁW8Ä„·Û!AÜ E•‡T7=¡É#ÍÿC„_"‹ü³ìÅæeË+Èx®G¸…G4Ù _‰ce!.æ«CºÎu8ÉË!þËØ¯Ç-VxÏÏt¯º”dWŽŠ«ªe˜xNM–„%œ[H¥€¢"ÍTŒÉ£^vBÒJ ¦ûÂFl<èLCHÀrî¹øC‘Ózž°‰M+,¯ïV ÜxÁˆ³ÇÈß`ýÖÊ®n …<ªÉœû^QYý$ÀL©›rnzʀхsÉgåÓºšJ,ן:"ã°ÜÿesöeôÕ&zŽHC(“˜Îí_—:İFy`´¦Á¹c4—9Û(›¢¹óŸz5¥êHßîý–SãPëI•£ÎvÁ ÛC]Wצôús;®Pß0g×ì¤.\.¾F¼àÒô¾q²ŒûÈõŠ"‘@ç\T:‚È<ÜMù«µ„"\OÕkY¸w4F Ÿä†"þ¡¡) !EZHÛˆ‡n0â æ$'PÂÔƒ:Eš*!{„cQɼX¯õŠ h¢"šÅÅ¥ô¬)»–Ã*_5¿ù&ìJ76.¦ã¾MÐjjt GÛüЙ­Ša7›sûmý;dÔè™7²|EyTH®ŒŽlD-F"–gÈòÔ: nM… ËŒ.Ož¤2ïˆÌeuå¼·á ìŒ1R†°f­Uø±…“žI!Å™ÜLž@‡â lʤ’ªH(†òTiˆP]­oqn³™hŸ"ÊXé3øŒŠ`¥ µ*É1º‹úÁJ¯9¬·VºôÕÕE]‡"4 8Wµ'RÍx6 7êÙÏ£ìxV!ÒPòÚ÷96pUÖ16ø 9 à¢߉ôÿf(š¡ú÷»¹›eºÕ˜Q‰‘]³7ßrM‹?ïÃph}Ý…Î cŠ—®3+£ý#‰< â v¿ïYçM4+ [Ù cfÆ7nSü Ö-ßI@?3•yYjº¡'ün®^ì:¼uÿþ¹ôkî^’7F\C:Îg Ÿö´ÆÉ6Æw+?=íi""òÉ:'6á§+q0JQ¹m)F>V)²£üR2ôWY6$ý€¼±$ËÊ@ËÕ~’>Èéøyѵ'"8¬ÀúT‰½TèäYdP¨ðÊþxÿì ]´ú“Û3¬šYóÏ >Oˆ3)•p޳6hKŸCÑ4áPY eùâ;ÙP?|íQ£û¹¨ê 9Êu·õŒ[ˆ’ðÑ7Ù˜n‘Hªº/[T>‰²‡©eÇ#¶3ÛléáÐÒ‘ç×<¾£'³TÔ"æÓ¸­©Y©PóÀ®Sù˦¯êln6}ýzˆæBÝtÒ·çs…‘€H7×)¹E>Ó"E­̈́ڬt­£n Ö&êo…õ5PYð!Ã{$Ò;‰!<âϦW0rÕU¤…–R¯ìq÷„P‘ÛÕJAT öÈK0ܘâõn$¤=¶Æî´µ’¼¨b—a;Ã?fÎ_mP% \éE²‹™M¬qX½£< IDATòúã ‹qÎó4`ð/öRø îþÖa^¿Ï(mc½Òû!^ï1 rwÎ —+ƒŽÐHÓJøáI„q&´ÛAÍÔ;;™LÑÉÓ„ÝèËp§ /ñާ}àà«^jì@¾ÀKs§v”:jN¼¯žö´?½¯}æ)xÚ­íÓPíkQ\K!}f˜ê¼Ez–ùå”Î=Ðÿ%ßÉ4/0Uj$ •?TËåQã&ˆX``GíâR ó¢$ Ãòr8…Uîr¡e ÕFIÓÆÉ«³¬d\:0‚G©d –tv~y*. þ+áZaE‘,Џv¯C#ØbØÙ–ôd€•#Þ„ ½E²i8ã¬ÀŠ,'y‘<`T~qÃÅBhßó†}™Ö_ $?Û–Ö`¶cödÖilN‡s”¸ªç_tGñø|þèùð€Î(Y ZÈRR§BáßzÌðÆ0òŒKÏorà¤D¾¶‹óPߢ9èi½ËF‡î‘MŸÅÌž£K%7²Êl¥nSƒ.á;£Bv&ÜU°ßŠ ÿA7†U©„Z#Å7­Ï°åó@<¦|¦‡4+AüŽ(ÉÁg°'cÏ:$Là™ù'Á4Ȫ™|X)c£'dâ'sÏØåâN§<*a?‡,™3²€}cÂi¯çñ%Ê‘Xfà¬éc‚Ѧ]×úÐ w:w‹ËþÖ6ÀÆ•k¾Ú™Àá PTõ5dZh÷Ì Ü7Fy¤!qáË3áÒ íLa+Àïy°€¯¬;G'Ô™³1´|òÒpîüºãŽ= ïš–Oþî|Øß/ûËoÙ1Þ½»"øïØO{ÚŒY <ËäiWÛ§ÎiÝÑ`M^Ì“šÆ˜»ëôïøï‘í¾aÇrpÁk<µä¹6xÀÊÓ°ð%ìŒ/mÈÂU¦—^Øð ê¯ÔL÷H,r¶ˆ‰¤šuÀ¡Bõ3ºs<¡ÉðmzjtŸ†(´Ððj~ŒJœ™6ÖuÆÜóG`"#8/î°<¤Pî·ÏI1ÒÍ‚„´‰_êò(Ùbk­Óä¡ÕAOǤ3iÕ=š KžZož=1FÅ.Ò0¹é %fÞQ30òР!AaF Zk|þÖž´>i÷V¡Êó¦< /ô>ÉóÖ#µD%€aY‘A}ˆêFy¸‘‹V;ðºÜý îƒÍÆÀÖðâçº8€–GÈ……t'0åHA)ƒ[)ãPÅ)¡ìÈ|ÂåC?©ôS‰}Óýg²]T¬4&RȘ˜‹ xƒtM”œª,Ì/1‘˜tö" …#Q•€z‹N%S‡Ô¸ÐÈÃM¦ã£]#'ÿåßÝ‚JH`5 ÀýTñ·®?þž}‘^£…#1®F3/>€É[z+ ÓÐÏl?×qB\œ ñÒ®BÂSCÀªÿSHýå!í^ŸÂK¿]ãÁ´òÇ«y¥w¯þÆýóê–€×_ŸïÜ~á[?èÿÓžö´§ýPû̶㘿VœòP¢¯Ô´-šŒâsuª#k“¥R.u(EÖUÖUîˆüz$æÓ懽_CÐoéÔ©¨ðõí4’³*º†‚E}=?§A~IP‘3A^¿ø©©P¸}´uXBkœcn= W!L9‚V­\t ‡Èº VÁº3þ/؃+Ûã-´ÚLðièãÙ 84‡K±› T3ªÌ ~Ø,àPàÜV[ÕlÚW# xåEèñ¦@S!2TÔê¦,«‰MKIÅ䈜:SH|pŸqoÁÍ!Eʚا‘¥kCqp[G!‹n µ›„TÊ„ˆš‚ŸVÄ;{κv'¥ê‹¸]z¹Õ‚(E‰Ý%YëPV#|BÇó€3Àƒn)…GPûU¨“šõ¤®QÛµ>;<N¢IP/H&ZY¾ã·A);ë¡ÿá¢ÿ ¡_¹ÉkPB… ûЦ®Ñ¡:ýUßêí}Îi­¢°T¸›uÉÊêÇ"á’#ñ®q¹Ìq?x8À0^¬Öïf¾€4± ½Tß…+üZ˜ç— VÝ”aŽÍ"ô—ó°_ŸbE:I߃‡x¯ÃÀá?XbdØeõ|SxX"¿”DÏ1¾¢º@0¼ì(u:¦ipR;Ãö'׿^at&_8» ñ‚òv`µðÊ6† ;ØùÚÿYä÷Í ÿ£²ü´§=íiOiŸÚ1ÀB‘ Eÿ4[N˜)“B¤³‰q¶ë!€ë2‚WÈv\zATÐyfž+Ä\™,ûç—Ä ¦qÖE(†¦€A±úhgÝ%ŠR¦-A€)8Søa<*2r©A¡¾ÖT  ÒŒoųo%šȲÈú±CLš¼p™ØÒ½Ø¾.€6¶S\F8”¶âÚ\æRG›4N+Ññ¬XUW(åÓ þ\‰Œ&¼2{оûek;rT¦ ä"z]¸çCù^¿' íÖŠºú¦lâÃeô  Ñ,àù[ÆFÏfTÊa²ì©–ÉYcTõ›Ö§e´¬Ä©¦Ã©‰œêåŽõ^a¡öµGP*'v»n%Ÿ.–œP¨.ÆÏ´ëpWà!”«=·Žy^~4'§‘pDK0QÇÇþ gv—|éy¤é~Âk’q•†ëA|’à8‚a@ŸQ-͘îƒ]Éùuàƒá„ïÜZçúk*-ºQúæ³f@ãÉ9·ªÜ =Ê/ô‡k´·Û`ý+H[Cœiä‰ (\žN¼p‰±y^;J¼:ÿ“8Âæ×ñÿÙÁùÎ龩pSëdÕ̺#ß}ÇøZº€ðòtºtV|Ÿ§=íiOû›í³P¬8â’²}âA Æ‘t¼*@P–P^QýhnÏq/ŠâF"Ž ᇅK2òýKÊ¢²ìQ!”“éHT -?l “1FK¾! zÞ½f„„"3¡b¿)h¡áÙášÚ¨ˆ‚Âb—€àcìªGõÅ0òäZ<fŒÀ£´•x²ëWÞa œÕ ¥£`'R9˜[ s¯Ðöšu8áœmÄJ—C(sè|BSuA)¾ª„t±™ìf¡ 2Úòtø–ûJv* ´ !Ц³ÙWêN7ª—>‚÷5Lh´–onå×`4Â$BFꬖó¤&sO™ˆìêcœ3+j>Âàõ&Ú˳>iȧEý Éû³¿0îíÝo% '½´Ð‰DcZ+Z{Þ0{'ÖšÕ.…zò â×Wy•êˆ9N™:þçƒX Œ£‰i”fqÀP„L…Úóm×{ ›h‡X†ÒÀ™Ú'SÛä™ßÜF”ÐA"ÚôbuH  Év,ö?ÔÚÐð ¤ç :Çë8é,ê4EäÂà„¾©Í.’J¶á×íÏz£¸lÿO‰÷\-Õεç;¯Å•íÓ¼uQ¼cÑ!µÜ:ÞÛcáàÀ¢q²e«¼œ‰Å7ºK&A&Öòo>8þîoÎÒç·Äâ|‘§=íiO{ÚiŸ8øFüékÁ³’zSP‘z£d²ÃKû#Ÿ"ÓÌÁ&aÊS6J2øÇIœŠ|í12…ŠTIrº…´¨(ÅÅÚÓæØ[ ¸¦ËêÔ×PmrûᲜËÿŽ~®'¸³×=,Uº¡=x·yQÔ=àI8¾©Ërüý!øŸðc§TZVÁ—,«¬…ðg=Ç BÅà1»À‡[tÑIé[:28ÚQë°ušEpBÖí„ý6 3†Äu¬CzÉ¡o±þj¨îÕŽÍà\¶”#3a$M½BŸµM{ÓkZañà3Ð}i[ž(†N[³ŒmœKã¼õc[UÛ*ÌÆüj&PA?.AL&º&özš*ÅL¬|z–Çz-ýNDÛeŠ„,Ï[óc€/PÝÂ-3ç]hP†ëçÙ‚Kô=úíâsöÏí.Ú¿0ð0¬‘¬ŠñŸSi³ô_¡Jå¾á»%.Ô˜\ø˜G.øK3£´ìÆA6•wÛ‰ã¾èÞcˆ¶í΢ÇTÙùƒk.ïü?ÙÆY6®!³˜éÁk¿š% Á “—B&¶9ñ™¾Š©Íud>Îbq’9µ·Â™QÕü¸ßl¬(Ø}M¯‘›E”Д…ˆœšrÌòn,oûp5ƒ##©rîëß°ù•‘È4;ëû3¯nw7n¹HnUZüìÁùþµùÄžö´§=íoµO±ú~»®¬¢)¤ª{¾>_vº‰õ€ƒ—CÌVN¶d²ˆ|áħDa‚'þÁ"C}‘8Èô! ïÆI¶C‹v!7YQù勤O¡µžKÚ¾cÙ T&wÛQ¤p=SãÍp~F³-ixÐÿRÄ å Ê»ì ¿ÿ"\ŽÑYÄ|~íÿÞ½kNŒ®‘Š(;ŒØ„toÇ&¬c#)G­'ÅœxD\ܧÍ,qÙšé‘é;ÖW ~¬Õi¢\q~î¸/×( fËÙFvµ M·K¹©¦6=ñxpI1RÓ°zÎÃUÿ±£‡t¸®Ž“Ðë·Ù**¦5‰3 ŸŸ&Ú¤•ÉZÀãd°–CðÕÎëDæk°Ò\£âá$^[l¬ ’R¬¸œ&S•åæ­Úáu^©Ã0QªŽK7DR„ ó¤RQÖ +ý?õH\‡cÀŒÄÌi àе"@¡°aÌwά2Cÿ/÷Cú`_ã”ÌžT/^rüQøÕŸƒd&¡¨BR®?ð,’n.²3´KŒ€X¦+™ñ/]¢’r´—uQç'gX{äXCÝ›¡'¹œÕ½FJò‰Ä±™#3_œÕ¸ouàµÕäÖˆT’M#ƒ™ Ù‚‰ø ‚¯¡»Ü+’ü¾/þ£f„C잃wœO{ÚÓžö´?Ñ> HqÖ‡H…Œë£ŽG&ûN7ÿa3´îæù¯:+––É"8òß)+vN!îxÐÀÁÞN³Ï)5I‹S<®ŽAØ¥’³ŸšS<)ìeÃØvqÅ=½ ºjœK#þ  ‘ÊI(Ù [‡±¨lâUÈ]ûWVY)ëV“Qô<—“lG÷¶Ž~„µ²‚Ú ´\ÏHa OID;)O®ÃqȺ§B=j¹%tÙjë 3ñÂôÿÐ}€ÄèmlÉ1ðÁ£}ø>.¾U:y­±a™8±3}jz Mœ \!TŽ—y< ÐfTyÃF´1`­oˇ¢ÆIªfÑ9éuwµ–‰QF¤ÑnHnd*hð5YÛ ìáA2÷¤éáÑ}v\ÓŒ)îcfhNÚ²<æE'ƒK$ ~»ØaHýO(x /«ªñ |ÊdE¼æÂúžyÞ}”G1¤go5â¨Á)fqÀ»Ú]°`kÓù5‚ÁßZa¸Ûi×l¤ÜËìØJ:‡|õICSa¨Bô²L.;z9˜?>¾ªS!gí—±”ã’2ØÜ^8v`u×Z{~ç™I¼cÓ˜Õ†u½Ø\n ïC9eñN„WÐs˜ ÐUͰ‹Sý_œ:Îï½¾©/Ñðæžö´§=íi¡}Rí߀Bóê$ˆR{ ÙãàYxPø¸r'\þ#MpÆ`/Ø.²–ôÆh3^µ eM¾=WåœT9ŤÊÇ¡²,{/±øHê3‹½ûÆ¥£“Ü]¡R)¬s£€À‘sÂâ ø¾‚9þ®*ýµe—*¥µÚ m*o0âB…k#ð·‘7ëjM@AšB‡3ò¡—‘s ÉRÃÉ©ÕwyŠa ‚ ¯hxŽY‡µT2ZXÇ¢ z˜‹½D —ÞÉÈXÇ€~Ò‹‰Ž¡ÎA"ÜZpXé4¬¤v3ÇÈhEk¾KV4ß°&}jLÒEèÿýÆßÝBƒE¼hqû;Òö …•–©-kèyè½'5ÜœÛéÒ™é±?SÄÖ*<å^>8e‚fJ’Ù¾ÇùDT]YÕä BF’<‚ø£šT9*‚Ë;$€>p^l€9ï4âÜèGîpã"ÒˆpG÷Ó+RÁëOù\wß‘—î¢eQØ[ïxµ äâ@pæ½8×] Ý03ƒ£-le²_'£—VN·õü6È*ßñ y²9;s£:îÄÕ‡;ŸSöH<ï Ëý»càW5)SwKÉwƒ¡"#†ÀÉ™]íå˺.¸oû75þÐ]Ø1íÞw =%O{ÚÓžö·Ú§@å½ÚÄFBù<Š—?5up’' Ø÷_ç¯DÎDB¬{ŠúR¾[˜^ì=•jz0è`ìÉìú,Úoh .- pÞNq^ôã"ûl>¾ØFJ{ŠHv†ý ýˆ”W)ýØÌ©4\±¦‚Ïû†»´²¨jŒí¾ËQl!Z¥Y ±>”è&L‰+`»BŠN2ÎSAÿ€Ì§.g% V„K®r—}eÜ,þ |œ±•˜,¶”.¦‡Pð+¼ |à˜½ ztö\tÓßlùlN¤‡aa Â Ÿ3®‚*ðW@­ E:p´L/ìÕ…œ¯Äšs¦l•¦, ͉À!ù¯zF½õÉ®áÔ;jµó†âkûü3ÖòþzE_ÎS£´ºž#îÀž??¸rÑZ±ƒâêaƃ’5µr][¤¦N K6Wk3äÄ6ù® 8&¬ŒqÐã-t§Î ›4¸~—¾ÉK„0ƒyë¸{ºTU÷âÔ?$®=×9õáë>ÃWúAÆüTÁñ¾Äìó— pªk°[v3<õߊ²BfúäÝ‚KË3ˆ²­Þ}U¼Ax&¾Zõ1TA,=Æó¬]¬0€÷ñTùÅIl]¤pJ PÃ^G ”g)Œ g¥@AîDÅi¶O.”9ä¶/ï¥KJÙg±9ˆGY猰Îq£1Ââ׬2ýLú¦Ic› é‚+˜%ÄÙÔc:ñRûôZE#v+/8í="_' xºÏe¡¶pëô U½^Hëâƒ7ãP޹Cë1¢¾ÄZ¯hM Vµ8¡'ˆšóJÃÙŒ}Uïï傇kggã­íšÄ<Ñ ;Ë®%ËDY©¸E­âØÈµw;˜0ê@Õ+ QÀf-DŒÉÎi eì²V‰°³ËÕ étT Íj ?=B^‚Lvâÿ5Û†ÝYƒq¬4³° =+ްWúü…'Â…qëÇÔÃ}srô­¹>FbxaŹe™.v™Ù¹÷´N–htΨ¨ÈÀXdÑe欌E»|€q ×M4V”VZØè-83Û›—å ^ÿòæäûo’ Ù¸TÕŠ¬¬Ùš~sôÖ˜ì†ÆüùUí?†=óÛÏ{ŠÈðÄžö´§=í÷·Oâ$ùe˜:tÀF'JÃd 3ô­Sî|ÙÜe43»7‡h¾%²“ ±v'*3 ET`µ©ö1ˆS-3†à¬æ,5ÐÎ0€ý”ì‚*/ð9ìå[Pô…çô Сú0kî#؇ »”7‚*Å,~ƒÊM‚¦µªg-1§c[€«È¢„á8mÚ5[öwFqRâ°I¥}ó!„ö2àx,bÔ~‚yßZ‹•Q*.YO´¦EMë¨dNÒµ£/ÇÁn˜ÇS LŒ(rÓÈ7 $O\ç³%óåf‹¹7w„™¸´çg6ƒá#-°µ´ÇùžÍ¯£b¨äâuQ{iã³¾#Ó§vhÉñ˜Á–<ì V±J¹âwQ?ú˜ëXǾ>AØò hZ[£¤[\¨#9‡uÉØ 1DLh™ßä³Ú _ô§$ãòuÞíÆö]( /Óõú|ýo Øââkÿ|Ëó17EG dæ§S# 3yãó}E)0›.@ÿ“«LÛ'`ŸÀÐ{Ö/©ÃufÝáÚzÄü`sàe/¬2Œ¾o+Ì0€\èžÖìÃ;-s_ã×¶u~ºèiO{ÚÓž6Ü>½ÉR¡tåÔXe§ã× ÄAÑ›È Ož³èœ—E*ùß`'=0ˆ XÑQ÷[C¶³:hü]±äÂEøawwØ '¹¿W„I§E’É#†AK‘•hïsGa9ŒEÅDŠ)H g…!ôP¬÷Žß|¿å¨Ðc±–ž\'_ίÐj øˆˆEœ×í‘Ö³Ój¥@刖Gú€²BV›Â‚Pl võ7µú."»K"ÑIâlD ¬©Qv† .7Ç᪠óŽ›î"¡ãÑÀ‰ì¦.=—£a©WE‰ ½¢Ì‡Ï‹=}/í‘õJL:.ä&A±vÑupú1[²kiês ˆ[+ò4]Ǽ‘û¡¯q®#¬Ôý'¡ôQ¨/p|Ž›ÿ™é¦rëkŸCyñC0Rq;;ï*=é±ï°Í,„sñ–"0"æ:›À=Oø­roº!ÕúEÇø.¿úgityÓ×ÑùÈ›b¯J:üq`z_ÉŠÅL§ñ…¡C~ ôÖdó½dýH/tÚ.¿˜ &ñåÅË±ŽÆ8a|bÏ3}™ä›Ð3ÂË‹ýšRnÓ„\š9wm]Û¥ÇB,±ÁÅfW2Iâ;²µù\ÜùZ¿=íߨ~¢–~æíÓžö´§5Û§NSeå¨Õ9y'/=žE‹dðÃfÉÉ¡­ªàŒÖfΦyª!x•º®ÑRŠÈ²#ïš^§CvÊšB¼ P'XPqÃr ODV\(Št!bT,<õK)Cy»’MÏ@Ó!õØÄ~‘¦³à_Ë™„5e'즈ÈR1w (¯"«E0u¢ñr¼ÂZŸ–ã‹`1‡M4‚/x}à3A£fa´F­æj˜Å6RóÛ.1æk8BÄÍ^§Á0Sÿ$¬È*ËÆ¨P'5fÊ8y9fXBdžC¸:ªmʨPðºk™b59ë5¶óVz2ó4ÒäW„Ÿ™IYKê¦"ÚNƒ¢ ÚíBmtÌJJIŠRSO;¼‘)UjÅZi`JÖ¦æ0ž—±ºÇA#w;$1MtЫ:ØŠ®!_ŒîfáKÆ›WN87‚"­áä_Î섯º”W¿þ÷äõfÓ¢qÓí0|½ ·N6ÞñQm‹µ„›5g¥y†…¶qõÖ?³*C½Ú `Ê>õÉDÏLóZ•ÙT3Ÿ©Ãü³ ÇÈ/.D&Áh2°Ÿq ¬8ÂÔ4R R=FnÄàZ•F=,£œ%Î"n_ IDAT+˜êœúfÿ5ð”W7„Ÿkøó{Ûƒþ?íiO{Z¯}b=]}JųÐRa:вôÙˆ>ŸUá°²ö!Î.ÑaFÙÜ!þ¶M×½¡¢XÍSµÎ?ÅkqÒ['ëpÄJˆÀ*·Š±Ã³k&CVœÕ þ ܹõY1–ždPYE¢ˆûEé4Æ¡ƒ´:ó´ù¬ÂJ™êoY"ÿª^¤\dUÛþýùÆËùdz½±Óe¢Š¸ •ƒOI?^£ª=æ÷È÷aâyak@B`Eó£jo1ÐbñMH9µœ€Á@ëäzö$R‡ì‘~œ}ÂY”¡‚Ôõ‡ã.rTòôZÖõ¸`ØUG"BéwvtÌ}LŸ ©ÔËݨíϼ*€ *¬á. ö+­82äÆ@Ðè ýGÞoÒ<¤R `ŒÍ^_•ÂÖæc‚Áˆ û:Pä,GUi„ž äoI¤ã«»ŠFtK@&ÜßWb#k£‹÷á*7’qw¶\‹[¢uüµfõ è.½Ô(ú æs’Ñß!¾Ÿ¢»‘y:ß—˜=­Ìœ|Sçbû«¯,ÿÁîª2® qœZŠ ˜=ó,°@£)<»t[*–öëDÔ8x³13ÐAüyh-š¤Yˆ CËûÔŸ:f_ ¿û-þŃõ¯™oϸ<íiOû í3ð–+kFƒõ t`Äèmëq™mS+‹"µfƒ;ÑOg+Οhr|­LXƒP«êìÐÕˆsIq¥b¤ÑôÙZÁSäSaÐ_–q ‹Ö4#Ú"Ž32Ëì­îKÊ?ùÚQ~QØðý¯åGrT\áäUWî1(²Á"òqj)k‰ZQ=U™qN§õ, ØÿM+ý¥¨“Ž—=¯¼¥‡‚Eø!+¬²+W.‰Éh%×L÷Žj”y’QÛÂδeïθLF­OÄTÖجŽÇÀ°õD¤¹ÍެëB¶zDOBÿsdÏ}ŽÙÒ™o¹rÎ%ö¼kTá*ì””;‡"°–iö´ Ú¶@3¶¥Dµù®„ ëHœ‡Žû¼ãˆgĺ®£,¸;†­7¦ ÇœR4D 8çE^J¦ÌhÁRâ;Kp˜ß¶],CûitQ²9wžÄvÅë¾Üð#_ýiböeøÒËã‚K>%©šÃ‹£Oö 'Õxr=זּÎ<7{rÌvHcÙý{w0§]äàõ¸¶ÑìL#vm%³gœôì¿:aeôM«à¸Ö1e^>J’`CV7¬ ðß%Gá¥}õ7Ÿªü­áŠÿ,þ@ÿO{ÚÓþNûÔßpÕ÷ ~IE±bà›‚h„=âË1íTMA ¶¥e$õÕDgÒú)j©*j>ôJî75ãŠN¨/"# üæÎo³#˜*» âCRõÆÆÚïÐ=jF ª¼t垯‹v¨tK½ÿ|CÈ!œ]J ÜÃ'ì™ø• 'l#:ÚÇ#dµ2Åç¿©ïx*{eLÕ0# ‹5š=zqtZ¢–ÀˆXÉZŒµVüüé¶þÜšzþ˜ÉH(„ÊàÒ}kä¹n æ«ÕTsM¸Ð9zÅ®xò”ævƒÃUr© cm͘î*ý9ÐÛúÊælΣöÆ’aOβ²œŒ&Þ€ÓÎð Ó}n’U¿n~0‹_·¸É†=ê ’¡cXÛ8÷8³'Ðý&òwߨ ÚŽU°¥£È—ç †?{™—œ½ù˾&㛪{Âz·Š«sd¼Ô)Ñ?Ǿß1z¥ ¢?¨éDV ÓCIêR¸žµÛ¿©K ä|q×Õ[ÿ°õ,'߂ǹ rüUûФ\ßðÒÎ+ÃëãîÖ?'è’Üx§fD ø¿=2AœrÊûó;bñO«§Ã.áz²¶Ö¦²óìt«)Ë·Ô{ºÔã,9ÁZ€r¸ÍdÏ b Àúf:ÌåM‡6¢ ŸrŒ»Çp¢–BÆoV½u S'Ÿ2¡œé yz`…ÊÉL QÀ‡çûê°S…Õ\êL¥g¤6'!bø 2¤V9¸‡ç`ÍKuobOFû·ÖaæÄ ÍœúìÙâ‰<@à;î<’‹¢1i¥ð[aððbHQ¥ Ú` ®`YãIÿÍÖÊŸµŸc×B»E®óÚç{Gd°írþΘÉ96(Œ—3pò•Ý­3}¼¦bzíyÚ',n¾ÑoÄønDïF:­;ÄÃp^KèbJmEÆ„“Ô(™Ézy˜08“ëÿ˜ÙŽÒùî˜ÿ¦Sïo¢ÿp?ût‰ýù´§=íiOû;ís“i-™ƒ:A>€4Ð#ÞE?ñÓP-ÍЖj¥¾»&i»y¬ÁOj_b»àrª)Òé T<«ì¸<¬ ˆl@º›€6Ø83©' &LfNeªÎ S?ôú@óY]¿øl}ÆâiO{ÚÓžöžö™V†Z¥8Nš3½ÏjuÛBÎ^0>ÑäB5÷½þ"ίæQDí “ ¡ÙeŒ­T€…OYW‡³ÃZ]•6©F´ëUbgÕ^Ÿ­ý²S𻮈ï²î‰üdÕÕ.sÈ8Ew)Õ‡ ¾ÙKéFˆÎÔòŒà˜uÎØ(oSÃ×êúyVW$áŠs?…PÈ™þ`”UŠÍ ƒ²Òÿæ@j[¬èÉÄnÇ¡x%;£m÷+ÑéªÅ&ÃPÇÔd>TH)c ‘ ý÷ðà;“La§/S vüég(NÔÞÒuèàf¤¨«yŠJî˜yáE ÉèØF å ~G­L¯ùÛ¼û÷9pØùÂÜ©½Ëï×HMÀÌÃ6´£ðj˜‡#*Oû¹Ã¿fhÆ$±Ÿö´§=íi¬}¥ú¶KΠÓëäÖ­-G&µK³bQj•QEÉÇ׌ö4@ Ûx“že‡œÊ£ÉÅ&Z×VVQ…E‹°w@jê‘“«gµùŠ¥ç€§Ï¼ZGcM‘C·D2¸iÞ¢§UH aÒØy$¨×êˆz.9±B/iaß°Î[í„ü*ˆˆ[>ñgÔà®EYë©ØÒ¾åapkò%c0åVq¬ø×§ÇV¨º)Mp#B¾˜6øÜ qéóbÕ(Y ÀŽ oÕœ£Ê1ÆsI˜S”t¹„Ü#v½Ïù„uªÅë„aà?=“(‡é¥ '=c¾j@OAl4ƒERH2òItè1f¸€FýÝѾûfvéáŽ'ºLá2‡oUç·ncöo ódÉKl<³|è¯û¢ýòµKó¾çû)Œâu§ï~ıžçU<îÂæËú5ÈÔ›îÀ:=<ºÝ‘þ|Ë8dfÕnn9m»m½>ÙR2œÎ÷RÅ›1q|8.…h¾A¼›ÛlL&ÿ XÅ#WóçÚ}Lo…ãŸB‘§=íiOû÷µO.)¼xÚ”J>àTô8:%§dñ¯*ß|¯ "ŠA`³jVkM„²74F4´-ge,¢Áĉ5 Öl¢’óEXA›k\äK›b°Cc …¬;ÿ"²A€%êŠØ*‹Ç‘PЊ ÀõTæÆØ5QÏ 9añø}aRåï³æÑ"ÒLùACι ãaCe‚£¦ˆ±¸!©&öT¾Æ0kg Ïyúþ£ïHp¡tLƒj›(ÂÒ‰CÈé) †OØ4uϽ¥úrTQþWšåä[£šÚr%]8e¦=Œ€9ª«0é4¸[柬¹˜8rÝš˜èM•zÉhÊDÌKÃ$àì=Gb¶ÑÕÒÏ*~¼%šW£Gí_J_V;-›"G(r·“ù]1:ΗxDÞ‡zL$³Íwˆ'ú†7'ÅjôáX`x*5ü½HG;*%C°¡gø)¸WàB¤êò¬«ŒœT·&Ñ š^Å’Èáþò†á!àMËgŠV>¹B+÷ÿŽ’f ÌŒiÑ®K‹Ëç$"#°¶]ôÙz ™'÷œ; ‰ï˜ðÿz¾%pþÎNö´§=íiOû=íS ÛC¡8 Q ÇývziÒB ƒGåü:lÑb@›ŒE-Þ²¥¾&dQ`}˜v’wãàá¡ÅÅ4ïüNÎc5ë‘CRáj‰zDÌ Žü8Y¬Wʃ¾Æxa0ùÑ"²FŒ%.‘û¼¡e ï éI¢&1ZÊ€q^,è,%‘À‹( ÌTqE TQ“é,žØ'¸È1,Ó‡5µH3g°­ðÇ„^—/°¯s=æž¼ñ’jféÅXPi/«,*Íé¨@Ž,0Äà¨z[$ᱡ«JŸŸ’F5XuEÆGŒC$Ã1ž“jD¬ŽJxÜ_/O'>ažÂJþ$í®å>™ÏL0o•¦Ün=«õ¹Ô„ØÔY:Ž[Ë'Û5êøy‘¥¸ Ü«™šÈDЛ›‚ ªÑ§Ì†/¿×°WzAé3Pi~ûÆÌ“½Á#¿ ëxÞî8><áp¸ÐŠ»åŠh!f†ê‚V³‘Þ$":øí™ÌôiÆ’0€Wþfä ­^ÿ¾gg9ÔãˆöR}E·öÝÜÌ“™êŒ] >±çKû8gjê¼6ßþÅ ¿n<íiO{ÚÓþSíó´„•ìäfÀ­ÈX~å³7 j@¡ÈÇFb³ÈÅøC‹ôŠLÔš± ïØïˆ“Ç_Ê­K^-:¤Æ¦€@Ñiƒ x²«p=euµ'Ä$ýQYÀp9¥[Wall'V‰Jo¹í´X4¡¯UÓ7)/øy„vÄþ–T•*b„ÈâÔ¼ù¨¨DªtfÆe¹i /l$£ŽYßõÿ³we[Žã:¡Îùÿ¾¥˜[V’’åLgqæÜéJÛZ¸#Dð8÷#–z0D•t‚OšÌLǸK¡A Îue#CÎ6Â|´ÞÚ^7õªHxÀMÅ •$xx%´…m¯9 LØg’Ú]ÿÁ0Ì8ª“qîûy%åš!ZÌxfÆ_ìƒi\A¿¾O62 é×|ò¦6Õ2Ú~Ô)}Àï.µ ¶ íä S²p‚K‰­ÂrN7û”óˆfå pÕÇéïòµ9}Cªàû¼nžþ:Îüýf0">3^j3¾ÞP&—hZù¶<÷lhÖè ]ðõ²’SMzåœgFì+j±<ñ¸}þ~¸mt‹<»6Òö9Üì ¼i·>Œ&¤ç+ÚOðαwJŒÉ—‡ÜKߘ–uîX ¾u¼tÚ™6mÚ´i?n_OùPÙÛ>©ÁAÉû‚¿< xʲ¥ÿ¯«`ÉXß.V 8…ãFPTãû¹ –bHŸÛˆBcj#ÄyÊðR(ò‡ÂÕC*OôÓŠ·¶B–í–½užëýë€N9÷:œ:ÅÓgª ™çÏøitO×á  IÞ±ó4 6ºƒž[Âò[š'J_ŒõÑ :ö“^Y¹ñQÍÚóy=WŽs„þ£¾¹Ë'0ô¦çü‰)Z.À&!#ûµì3ö¸‘u\ * Ó•Û=ìÆÈrÉÖªû¯Y;™àæ{Ïè^ìÕ0ÃkRß(ϧ—,´®<Ô•ì¤åS’A²Ø¬e…>„]|› 9òP’È“µ½õH8¿À#Y€ÓÿàWT„ R ÅfÔ¨nEž‚ +¾¯7åâ•EøÚïwªK^Ãìòˆ5O q)€u¢Øó#?±?d{?» Û½ò‚W¿€þïð¦‘=(9~ã}YœrÜšÇNÜõ89Ÿ³ƒ“?wñžeä;WXD_òÞmÜ<4páÊ8ÿÀ|ÿ;â_B'›>š&N áL›6mÚ´°/}èÙ¹k€6qµ”V> jv¸jùã¶šÄOÀЏò€0 Žà€ãj|œÙ1tgß6ù’;°û€þ×ç­= Ž.þMV7õZ Ί¦!úါÞužQðVC±¢$Y·0 3‘5÷ôãÿ­G?RõéËoØ3&Ñ DWï@vÏ=ÉL¤¶ˆßi =–&æ§Œ8%³ù9ÇÿÚÎ3“z#À/3²;(ÿ¸wÀS¢­H"yÍNºô誋 1¤™ÓηŒëèèÙâ—lW$Í΋å>꺂ø u¿ <ÂË_ùþ8dßPÙ¹}Xóäñ¥[áŽGÞöÆx3Gÿo_•¨S Ç×gÏü³Zý˽ù»ÖºË´W°šsbÔédPsHÞøâ'êqïž)-±îvJÞ»#ŸŸÌø˜)•P’ÎSà´iÓ¦}¤}k·Êì ÄPÛ¸¾‹¬UŒx€Þ Ë=×Ùè2È$µ_ÇM£M§=·1ãŸ9B«¬«pî¬ü™K(úþMM÷Ð㟶d³Iè¶Iq€ z¨¢÷«™3n»Íøñ´dpk™¤zœHº…´ö€žÕ ðLd)¤(ÜŠòÄvâçö0‹f<߯Œ£{"­Ž´U Ð)ìP!jè†GÃɃ0 ’ô^Sã€lÖŒCPí¯'ÊŽ) ?äëÕ£Õp÷êÞœgÌo a²#¯ëŽ’Æî9 ¨©žv}p>{Iô@ßåp£íôL¶Z;&ÿ¡‰,§ú"W$7³§©xôò{ŽŽõ¢AK…—×*eïx%ÑÎ-m,FŸç—¾ õÀ_»én×Û£ÑÏ'=åÒsMà…Óey½c¾¿À7 ís Î]w<õŸ±\„ã^~#]ôY8ßM9ËÜxqL7ºŒèÄÁ³©ñ§Ô&H[ú‰ñH"{+'¾w­¸–E6ZN³þøÊ¹Ü¨O?6EÛxuÎý[ö+´7¦M›öÙ¶ÄîçhO6Ä“ [Zq°Žìà8…ËÁ¤¯÷" '²ª·«fÉ^¼ÿ/Ed=ZL¸b c€–sy;ÞqUY¶Ÿ/UÁÝȖGòH±ÎmwÄÅ‘ÚkÒV¨w]‰ææÂÈ–ÔÀhŠRùÖ½­ö,ZÓü°4ë]ùÐáDäÍŽ‘“‹!«ïìçøg¨`ÙzM¶”ý9¡Šª\f\ì¨W‹šîõ+æÕìÑ|WG¨€ÆŸq®KÊÕíãs^>ê#<Q™~{6RPµL߀njS™ƒ xzÖf¡%9PÎ3s+ £©š¬˜ð9jTÏ`>êQ…` )á)¿}\m ¼×Ýkx~Íø,·ŠWu»m‹[o‡V`èªýš—’Ɇ+鲫õ>1g6·‡ÛïÈoœèOùôh3|½ h 4ÇÌ0Æ+]s!Çæ—܉ÞÛžQ&¡­ä¥uc¬ß²æo¶8˜œCªC{~VDqt8s°o·éýÂ0c_A3Qï¶ò·ÛUa•¿çM'î?mÚ´io_¢uD•\í[œ‡VI¸¹¥ötTÍ© ƒ³è4ê?ŽI{æþžÂ¼_t5§Áƒ{&ïžðD=HaËó´©ŠÄJ °jí¸˜˜24÷×èÕ~÷˜âíʺ?¡‹ÇŒžà]Rí–h …EòN J(,–gÒPdþ•Øe©fæÑª·Õ ÚŠÏ„ZÑAE;$·Ù¿Z B²ÜqD.õNûðèUyo0k"â¸Ý©ÿØó}§Ø÷LØoè•0’ µ0`Žñ¬kž k>ô¶ <¶vDÂ*6å\ ÿîücé  Ÿ…3îŽÊg$ŽZ"£ ž6vÊ׿=ôðVã­-",\ûâ¼ÿ *¡bqo°jëØ*pliçv$Ù3´šÃÉx²rG9€E@hü1Ð|òó./µÎ´Ì§{ªÀY\J?Ç íÅW{ðì/;5U•Õ`[â–Èz'4Þ6I¾ åáM_k3ü/SëlõTæqqG`U¤+ßȱ÷‹î¡­ƒå¾él¡JËß0€G^b<°ðÍô\¶ž/ðù =°]Yï[4†^½%36Í’ÿ‘Æ™=?mÚ´i¿ÑLl^yLb•(­ ¡ÈòÔ fZ¶ýiQ¤:°TþOùõ™ÚÏ59!îÀÓ*{Åó®8÷—@ „Ô7 ‚‰-ÑwY(£pz×¹ICÖð%-Ü‹j)XŸ²Á+fÕ8 ¢püA|•ºUHþ¸ƒ¶èJP6Ê8ä©ÓïìÁ§”Áóà)‚͹Öéf¨ÎæÞ/â%w¬úŽç`aNþ äp¨f‡×Qœ¤P V‰ˆéÍè:ª¢I ¢vòÍÈ>ï‚ }Ä…2­$’ÈFþ1œ‚‡8ø>hìº!´*>¤%É9ŸËl#nG4!D5÷hVí6?ùÊ\x†Çêä×€ ªïñ90ŒIÿÓ&žâ‹ðèׯ „àÞˆÝEßÉ&øNÕ+I”{ÇóßD Ì•(οâßãM?þ øÖ÷}c/¿’Ž›à§"í¬v±B{‘ËrDÊ9Ëh¥‘3¹©6=in²|KsîÃÇ,0<Û{ç$EuZ¶ßè ãͼ"ŽÏ£;èƒFßùšŽË·-ž¿÷˜ñ¦M›6mÚ‡Ú—GÉ¡¨QXPn_ƒ"ÚgnZ²\ µ ,ô SÈ5õ?¡PïÅ’õï_Pò³Î X$dáiºm÷V棇zÍç¶!E;SZp˜w§K¸æÑž ¶\FPYùGÓ)Pò òf§R¢H&… NˆÕÈ}t}ljI8p¤‘ÏU9Qø­;å+Î>‰¥½I¦6{0¼ç²2 t锜¹AòPhb»oò®ÀiǦ`\íå÷¥³JÑïhÎof8%üÀw©Ecl ÇÉ”êr†s;Î.ß âX-†*%Ï/Î#•øX¸îÚ¾pY\u¬z$ê.´¶{Œ­K¨æH›Á ÷­$¸û£ÓXo ÿL[ÍA1mÚ´i¿È¾Žµ[£ó”•²8’EËc’1ºµ1Í IDATù„ðÖUáþ{êú~”Ç'ñÈ…üw ã‡8’\{Äã:Œ2-CÆvÚ}i*baš³­=q!xDA’}‘Çãíž›ÈG¡»…fà œ8 ‹çŽƒC}>F Å;‚[ b]hM—¤5Esg¹Æ‚Öé'ëDhÞs›-ðÐ-·Äá#šEçUÏÆôî0 0¦Ey(ÇSû0þ)RàÑ{¶)æEÂÀØÒèo·œ ÇÚ#£…Ô{ˆâeGR™˜ [ºõªyMÿMÌ赋‰þí~+\M¨¢ŸŠ8»"µ¡.š”±XE>ˆ§ZÇž²‰9‘\‡½J¦6é+i8 @ ëŽî FºdØJ9~]ð[É´tÑÿ„s©ç0•"ƒŒj¯{_ ø•¯_ýü3 "°Œa|ã‹uýqø”Ž0î ¿ ø81HÒˆ:ΧŠ_màžwÜ®Á xú[w<]'„×à}à®ü ˜é{¥ 8°PÜÀØ@9,Ó£;/ › OñY½iü\S_üw ç"åLפ6›kcy9E\öú¾1üð·ïÓ¦M›6mÚ·Ø×:PAü«K_Ýij6¦lûÊ"Ï€¬ŠµÿW- ÁÏœÀ†ãM—bp(Ö·¼7É¡ŸÉ‰Íñ¥‚ˆR*ú”¿£ñ%Réé<ËEJ•*™‰ mö7úÎgRL…iî “ÅÐøŠ AÑ+[VìâòP(¤X1”D|2ÿåô" "—¦rÖ²¯Avèìì‘£pðE@S0±‘»}Â1`ÑS—Ïú ]å—wiShB«±'ËÊËwDÍoÓ‡›Q¤:f3±J ‚àº÷†Œ X£î«TŒAÁC•Ɔi›AÈ>„ÁҲŪCòÃ^¹}:äD­T/¤bpü÷¦?£ëÙ\S‡~€K²u| ÜAï‘ä¤ènºæàä"üb¹C{Z6ÈèÑol\€Ã¾È»ð5~RÕ#7’ºptâƒ8dGŒ}çÚ‚vO/½Ü[.ü1Ò#(rd Ñäœ6rãkìõºµ>œÂ¯ùž)ƒN3âÒlÅ™m1ÊÚ~Ùþ¾£é&îßx{äŠbÓ¦M›6mÚgÚ—CUöýë…”Eg?°×í?6tuÁ‘ë^/Ûdž°SÄÕàˆ–ð=qF±:·¤w `Å~‘1àõ]UXÐ*À‘ÿ[ù·Ì`6ò - `¦+>”b¤}õ#jD%ø;¾®Wxz`µMwœº_ñÇ£"bñ ã{£!§r¿„WÇc¢§—X8‡6}¯(0Q:À–8ž…¯‹—¡TÊ'i œîììöIvÛ}¡8USŸÖmÓöi2ËïÓÁ±öW0γHaݲ´þºÎ›£¨²£ˆ6€ÁŒ Ç%¢‡vyql#VOy§ }ÖmLÃi¬'Ï»“£CÛ®¨aôŸÃ˜TW§º (Diz/É–÷¶›}Åñ¼ŒHò̧é61ÒÇwAãØÞ;n…EXÿw_||¦à…[|fô>žö±‡xãëg÷cŒoßÚSÀ›;ºKŒS1;éöÄÙÆä™s1Gò~%¼szÊ;ÀS“•¥^ç‹»ð;zdpÙŸ|÷Ê»y)ûûšhBL›6mÚçÙ—Á!v€Gºñ&É«!$'7ºlz¼\ž‡Ú$ñ§UéDä@·J¿ƒ ac¡Ûwˆ¯’Ö;;´Âî˜ÆX÷ l…¹ËÀ¤f·ÍËL% u‚xð”Û‹‹»Ö88p`zóy\VmXl}›Çq“]qó¬OAŸ˜¿ËQ˜¿Ôù\®ØÂéøêäÞ@O½« ‚òø =˜Ð ý(j>~1yñØ&ÎÈ0õëG!± EnuZ%Ê0¢=4E‹6¨¦Ñ­]1ƽ›&á˜þz¶ê¢+‰Œ½¹<xÚȈ„º‹Vbý¦ŠAK¤P‰âÃÚ•-,éõÈ€ïñèðΗâ%Øèd&¦ßq›ï{3HêBqÙºW„©ßÜSß KÜþÛvœæ;Yžâ™§¢Ã“ŸëÖ‰·”¿ËaWßul¢9äøÓŠ76ö=Wü¹8ô¢ý5,þ9Øw¢ÿ³^k³˜6mÚ´·¯]‰JUö s+æ÷'2þß3©ßpÅà@‡³cyZ "Ì#+œY2òq.o¸îH:`À"k†ÅþÓ”Â'74F¶Çwë@Ì™»Zt`J•),†ÈÄ5€Æ"òÔ½ï@[÷äŠûr'£×ø Æ>4¥’f[Ò âÂ3BŸ?Ž®Ï¬´|ôEÉ5’Kî-šÚÚ×TEFÎZ+3# ¼^º«á˜bhO•‰¯²8¤"¤êý蘗j" ¦T8D5D«†¸ƒ­%ªümø "±0¨hÝøðeã8˜Â*¨ž¶R"W©¢Š…y×üÐÑT""ýTifñw•CNž…\fŠAédsÍí—öA»K@Í#J÷—ºX„M8ŒžJÂ*vs˜ƒ[Ú„!<¥ÃiP[R¿ùNAN·3&Þ720#Ií>»‘èZÛvyÉ/@]Ÿx£ƒÿF"ßë#üõÓ8FÒ;B$¬wýeæ|ƒàoéY¼ÜÑw'¶ÿ:¸^½oé½EïºXaòÉ›zadËÀ@, æ7ÀM+"|MêGË3ý¿œ3ýpÝ=%H?mÚ´iÓÞd_ñ”y`a‹B@M¼Ø\ìE-ô%\…æ¡V±ÈrešrƒÜ)Ñ]GÂàv”„“d×beJRì2ÜUƒè0?Fu]±6zlpe ãge”ˆ§†n¥4`FIÏÎiLáâŒOwŒ m÷Ý)§(Ou\ÚüDá¹½ËÐr²ƒŠPûÊŽÀ'móDƒNŇÆ]—6g¬ñ:²>eb¬ ß©ºu™ïr’ôÖö{JVc(Õ\¬»£ãw¤ñ* ±[<$OâT/2T¢ý"þh+&¢5iw”é*jé}ã+aq*õ-”\Ww¿ÖìMïÄ.þr£WÙoPÉõtcIÆ6Š@ùÌJ&=zlúBÞb1€Øt¡pÿâùF~‰­é-脌L¶7—ޅ¯<ú`7½(áxAäùWûåü¦;t¸ìÓí1<<è÷G")cj öûö^±Ð·æâœx8^¾d{|uÔ F,ðæiŠ[çÏÜß·0œ«„Áûðc×Û‰þK™Z4íoõÓ¦M›ö÷Ù—,* °³¼[ØrH9x\èmž kS¤ÛN±ÏÝFâ›%¤ëþ;¶nhæ^î@ðJ ~Õ1÷„´Y¨dñ©»o` õ WëÏùÜ"ýD+Ù2p÷³1ï;ý)úo¾R•ÉÓ*ëâHÇ& ”Vᕬóâ%༒Aü¾{ƒËÐæž×ÛñP¹|mw£J”¾ó˘ó–OazJ.\Ñ¥×ïRÐÆš Mq^ÖXœO2rêÁ-F¦úU’0ϘØncÝ+awSé23+žÐÂîŸ{‘^€¬üB¢bq” , ÅSŤ¯˜°ñ¹îmq¦bxÏ©)¹Í„e•cºÄ„¡²'nXù2•É_kÃ;m3~¼æ¿¢X‘~• Õ¼_ˆõ;<à[J1~°ÿ­ñ¿¸¦ç; †Ö®5~ü£:uÀǰY-§õŠ=4,/Çà{Çox®à¼–}éÇ‚ðŽ5 ÃóÅáåuû×!þ4Vã®3Ûþ­Yá:íÇ7iÓ¦M›6b_\øCªdUäIú”¡Š{ö< {Ë®³ÿ=êܶ}Nl(=ûŠtÕÀ70)ÌImFOà²å àHXª»'r•ÐLå1¿žù¹ö”CfZ¸1:[Õ½ =?9â C1"ql¼~M%´ÈW•Ë€v’ ÇQÌæ^GSŸªŽ§øb‘>ØËìÄfŸž¤«¦z)0¢–Œ Q'Ýц3ÌËÑŒQ`/³Î6”J-Š×‡œ .ê‘™I€sWl9UÕ­yÄ ‰º`x‚4Sq:±“ÿÞX†æÝ‘6é²óÓH”WW¼ Š'uÉ50D’8[ôýl`9¨é2I O‹”Âñz½žÎ ®ú4O®Hâ› ÿoÂk®Ê´F¶4¼õÁädÚ;ßÐÄø–îAïS¾6‰ Dê3gG%è¯rŠÖ‰•ŸŽAè}MƧú ßòŒàÿÓ‰Ý<¨»I$·÷þÏ…>‹à …ô×´O;`ì=6Áì_{Zœ6mÚ´ܾt¢4.;`,W|DÈ%7yëáìëS†ÓDÔF²O@j VWቓ«8‚6oRaÀN®ëN®/¨õ}k²Â=2뱑žæÅ×"dG|O@¤RØH@ÂYÂ0>B“qcµ£n°N§ÜÀ¤}³gÑ<ö¢KCvÊša@-ɧzfz´Åÿœ&#¾1㩈É×fIûÿ„,d%¡­¤Jÿ$ï襛Ö¤ÐõÖšß(c™èŸ 3.¶3¸ÁdýëY©ã1ÛåD±3?ž®CwŒ•ÌKè/¶ˆjÕªhLË§óø‹Ÿ„óÐxJn½Œ¤Ôf˜`3¨Z=IBšÝ.YÂÚxNpÊ?SÄ^áש~»z!ÌcCVÛä[G î¸,í")_O¯;ìMàq2Ü-;Œ²ý¸¬8Œ'¾ Á™Wûä»ÛBÉd@Óµ…š7ƾ•™§{ ú™Þ|ÝÖ†ßðk﵉þO›6mÚ´¿È¾Ì‡&—¿´H¬S¯ (\ Œp|„¼˜5EuSÃcãð;:û A,b9#:bX³ÝÝ›9†štèxOr#ÉiPêël£²ßå·24ZJ^L·¥Y‡˜¼oâX¦^+ XÏ%É"rdöðâÉ£ÌÐsÀ«mÆCyu%¸B1H1ºÛn)¦_fˆ05:µ{ŸJÔJ‰nì Ý*…$ ÝÎV¤'=ÄRYßE‹è,W$3‚Y†µS¶pá=TâYY PÀX.w/ô3X{€PT5FÕ4(g}qLb€¨A`•´]“y…çð$ÉÈDXKù9¶0CvÅ!DJ5¥$}7\¥Ù‡ Ôh”cçj,§G$ƒ­=4mùsøä績(:€WK‡ÉÓ¾û/m{ÁÑüD tr+z»È`ìRxkªžãˆžWœçÕXcåLW¾ ÒÅ÷÷NÆeâõZ£oÀóÓ¦¥Ñ{>+éµ£ûüoºþ·­®üÔ­lbÿŸl µ=04³Ó¦M›6mÚï²/íEóuÒË:m=“{¥sãi‹Sâe@ëÌñÝqÎä2êŸûM•,-ΔϷné®Ô¡¸lbu;ôl<"îYL Êjª¸…áÒ Ø÷Û ìóÓ¾þ.¹«ôK¤V®-dc@o()äGSï’”µ…XÚ*b+“t]H2(·p,•V’ëçwì1Æ ‹ç¾ž3þfÜd$Ò|…Iö’Q ëU$ÙÍùA>÷ßX’nCUgÑ1øÞ…É“…ël‡o-ì£ÞÌçÆØ©áÊ—¯Ùí݇)T¾c^EEЈ3ˆó/Å—Š „À»ã”?[ÃqßvóótÚ¿k,üý‰þ¿p"šŒ@Ó¦M›öãöÚ\o%…é!ç*S2¤¼ Õ`—gšî¾5ã \< ŠÊ²®pØósaM±Âàoû÷@î™2–õ{ÙÓY`拎¦ •fa³Ð,jè£-~¼IžÿŽv‘A†j¥ÓÇ/kn•Rbñ[†}Aübb˜Í²÷5ìs¯çѰ¨ê{èc`RŒ‚ÊGÕÏ<.0{*ßù¯÷VÏL|åÒ+tS›1Àñëúó,E7n+M † r©ÅÙÙñ1©–¤ýùGŠÍÝÔíñ$Lón1çÆþ}Atý'1Q!ožo¢x(ø “ÂÓúj »ÆK}ñ₉Ï^L¦Mc¶ÔCeºL»zFš6mÚ´i?k_²<’Oü ‚ãHEÑñK³f ‚u—éß?(WȨFyҜǣ¿»¹!‹€sb»š+‚RÑá@‚ ½ý-?}ÙÞ¥ Çyª"õŽ%k¬Zdi’Pº”m½¾ßÜH &îÊ ½ërÌé.…Az’"u#=~ȨZlQ:ƒõãhqH=އA£&£áaYD;OW?ÛŒ61ÈÿÀ3ç0§¢|þŒfcO[ë34:M%¬è±W´`è_b0€­Ê€XûÒˆoê»À+:ôxª(+ɰ”Àª_œ°f>È|BE /¥jŽæY«\{d…8D‡M(ÇÖAfƒRzXú„€F›ÌÓL³ Ü‘v`d3“ZÅ´¦ÌÒ3%.ÏT5.nM`{I !4³tdK ØùNˆãÄ®Àhö5«ñIU!D+•EÚk-„Ff¢£Ãº1^ޝ÷å&aèÐý/3«½@>Ãùþp  ÚíÛTŒº=îUðÆÀîCSÁ6´¢>Dð¦!Áú]°—ç2OÍ4u²ecž5*›‹êÇ>|vFσÃ1Ä¿ÙÆDz¦Mݳð;þÃ{ÎÁiÓ¦MûûrGy¸t]¥y«³#Íá\}›Ëô5lP¬ãôgPé<øî5j¶×+dè­ro^=íX}Ø/ŽÞö\ˆ°¦y_(¬|Î'åW K)3ª²“á²'õ«œw OÚòɡЭÂà°iÂU逄oZ– Í*] !5ß.2Â%Xf{¥¬|62DdQå KÕÃ,ÉÌBýÒt"1ó÷œkW¸s¬{¿ãjJŸ?•¸7Î.­=7Qz6ELÑLú€æ.¬|ˆnîu2À7möçøjê0³hŠ5NkVû&¤†bo4eíÀÔuN)Jª8À1¹>feJ´¹ È¥ìIzVFQbŒ,ƪ9n/(!Öô@]Fã²Èð/¨Ãè„LKR[ôð¸Wü¼q_ú­ÙbßåzF=ê!aX4Ù]ê–1s?ÈȘØ*Ϭä]@¤ñ÷o÷òC]ß4”4¸uÀãJË”{Îii¼ÊvűÇÅ»b<ûY|Eóþ%ëyVçwBw ìÎ8-¼m‚|¿™/'î8íüÇúþцiCÈœ|Ó¦M›öö¥A¢‡f,d¬ÒÍ2Ì<¿²ï‘±®kÁÃåF€Ãì, •zs' ãü ¨:™øçè>’“,˳2vš£.@üPè[‹@ë!èïëg£Ê#À€°é¦lHK"vœŽOUaㇰªD`g©Ž bg_$'Üz¡HÐ ˆÍGs¡Ù†‡­•…@Ÿòüþ6xH‘õx6À ÅL¸@ûb²« ºv¯ 2nÒFr¨*dì|É:'ŶÄnÇÇ+P|*0óÃz,±}£B«£f Ÿë0}$DÔ̈B¨"j´RT;è9ä¹îku §ŸR_ÍñÆ 0žõaX˜.å¼Pò´þª9‚ ꉣl§#;mÚµÏBWVœöÅP&˜6mÚ´ܾ4Ù˱JÇcß}¶úÃê´ŽÛ*}6æÖ޲#àœ[eÝ#äH•ñ-Gòi䀦â¨i0D—u6}Fíþ†UЖ[Ð]°1QP¼žp~vôÉ#ÐNþ£%+Ó=J>WC߇ œý²ôš‡‘룛Š.GŸ>â.€BPPÚ"²l•+•Tª~"½QÔN•¯áhK°f_ÐÜGI9B=J«X‰®ž9›˜ŽÆ¦9nÀpÐ 0SµåˆvÑpj"ÒÀ’1ÇM(Ä+1­ã¬ÜK0ט•âqò¨¢»Ñá@¦+Ûˆ×ìqÐhgµ‘1$³s_ ›€ß'†ÏuÒ·dèµ$Á3êÉK]¢%¤ êR+3cÆf\o¿ šùПM*ìÁünr”á7>çMz°.(èµëGÜrž¸'„jé wl Ë’Æ0Qg ™rÑh}šR¼_“^½Ìàβk!0š|ðê,GoQªw‡¤$åR ³»‘á…^J%…»iƒÈãyÔ ÍÃ>Æ~|жèÇ÷—Odû™¿Â0{íÖ”¢Ôh¶ç´iÓ¦}€}í™òm ¤q#¨„éGg ?ªwÀ‚¼(2Î0m5LòuèT˶/) RB0ÂËÌŒ,HL"j;†Çì"Ì–=Ž5[h>­ÿÅHÍJ/ài¯Hg½þ§óN|¦½Ì° ' œú…¬}žFš­ªGq•5’ê ´SÛñnCú^Ô[ -TÜ2Õê:˜pý&ÈfìîyW4 R_?£„B]ÇyÏ›¼uUUÀ#DöèàûËIþÃþ¼“‹ÝäôA0±·§OˆÖ©„VœlO#½ãÅqÈ|EôwÎn}iL3ç'™ŠxŸ\Ky ï'8š3`Ú´iÓ>Ù¾Z> è4¶ªÚj”O¬”E1þkl"ÍÎÞu€ëˆè„ôí«uxàðwä²)ŽÖqRÖ e6Gü˜AÏŒqBÝ‚êÕvçle™u^fþ„I£´ ;ÍkÅfQìLÅy½ƒÂ¨tZó9d·go®^Ey•ú£ßŸW]‹pѱ>»éðÕ÷sȺ(VŸFŠ vö$„¡ycÐÖà œ}˜1¡ $ù•˜¬±Ö 1»°E´[‰šš6´´]{ôQ%C!·úŒ½xE)¨º0’Ž5Òr,0qE†xq[gIÆhÄKÄNÆ2=wÅcDÀ¥Ê¸Ö3‡Yo;q7–(eÝ`á °ÃÈÏH(0èü£çØWeñ+­c¼xèŽ[š¦ùb›§QÄÏø` Q”k U_gQšcÛHÁÐ>ñB36%4e“U§ß˜(׋ÚðRd,ìD§FnÖEv£úc¾®½*Û³*r[IxT4ó‘E|ÝOþÈ#ƒå ÚݾF«.“œ\¾@qÁ!¢ó €ëˆDêYªŸAmXžü¡Ó ªˆÂB×w†â©lrûÄïpª®u¡Øl£+8x÷æh•û¤sJ»çßàÐ';‹¡bXLùñ؉qNûd§DCï4È9¦M›6í¯²¯rùnx¹Žú/¸P¸lüÈáó·‹•Ò¥Â1áÈdÒv£0 u貕ölò-Óõ´Ož±X ,;_›$… ’«ñèÙÊ#6ˆ_ °qÁƒƒ(¤¨G¼¯ñ´Ç°§]—Üól™>©%Û Ž€U• \ƒÍ²g2¿ºe"ý3y/¿’õJR%:̓ɨÐ.øþ‡éðRéíz <´OÁ$À9HqàV]AVl‘¢üP3«êj©\VÇñf°É7 H–¡‰sÒ÷¡-¯QŒ”Fíê¡Ò\»™o¼$n4ëÑ•æ˜[»•`ðÓ‡sNÑpø‹ÅthŸÙª[’¸uŠèö,»€²>O*¬v_f(H=!b| ‘Ä©ÙQI—‹ ¡:³3OŠF CO{Úº”eÍ?v îòt€Ò!'JZO¼oÀÎqpå?mŒóKÀ®ŒÎ“Çk#á/H´¾£²gÚv)¾gØà‡çÈ—9§Ã´iÓ¦ýÍö5rŠ|$Þ#µGŠ#yße›|“<à0Ãõá”o+·9æVú«k³NfwIJÜ›d*1ž{zÍ»d^"¡ãņMSᤪ* ŠX°sb©hRv2%èF<¦ÛÿŽf¿¼sõè$M}MŸ j;ZÃaÏÀªb$[é©„%¶¹äTŒL{—-&Sø€­·˜V•Ð ¨ÛDL¡ž¬Ÿ¦B¥CÇ„þÙ EmÇæ%¡#¨$x.Yö’)­W¨ºt=hÙW(ýjz ³M¤(‚š”f>5¥d,ɳõQ@ÈýÙD.»¢âeírT|2Z\¤G°ŽSŽ7JU@څݵ‡Qk¨ -„R~ËZÃ1®ì¤ÎË2ÛŽcQCÖ˜Éý| 9aád}cÆ=ƒÝžòáÓÔ¥¬zÐP‚ÔÁÂ4Ns¯›Ùƒ|ßu‰R.a—Ýuœÿ<}È®œ¬¢8£šS¸ àŠC\?¡gq·wPo)>ް5[õhÕ÷œ¶ŠvšÛÄo³¾’g0õÛ÷ëTQ˜a)kw1Ûf|/ˆyoV°HçNž¡ÏÖPJSþ˪á‡ëÍUz/I§cLMúµ%îÄò.cŒp<3þÿn›Ê±³ÓºƒÿM÷ãT ˜6mÚ´iûJ2j£?æþ€:S5Òø°v*­‡éè§O9’{ ƒcúNe&ìã­ð ÙßáEÃEnuP©ògwæ lXù®+€òØ$/ ½£ÆþŸ»‚nAâD«u‰ÌWwHCµ‡D5?Õ‰ ²Ã8¶„ßEžaøö‹kl}yÜt}òÑk©Ø¢ y›±‘‚¶ ‚£à†‚–¢Äâ,PbÑ誙 ÝŽ 6–pgi$èî©Fë;L"nÑ,Í à;ì¨ß²è;·Óš+Çb[ä« ¦ì@ˆ-“’Èé8 s¯¬1JYI+#/óª@Û$”³|¨FœH6Çg>óáô&5Ø]&tiq¬;qä£Ú×x`¤¡àZå0Ͳ­zØ]#^Åì¼ç>G¦Ò¬^b\aØTönvª`V#…‘A3†½€;³ý®AVÅùüúÄ¿k‚¹ÙÍ&D>÷!…pÈøi׿¹eo¼eèºïT«Þ×?×Fîcã·Ø„]­}SÈ&-Ä}/нjûÐrciΜ Ó¦M›öÁö•£mDwi  †Ü̘ K‚éP›´Ì`§ˆe3MÓ$k‹u4ø²S»°ÎóÍ;j—^àùË“[†ÌÝ'ÓV<ÒÍUa«¹5Át‡dÑÍJº<ë&4#¸çú‹·¼ÛÝPÚ÷âÈÇ'¾çŽh2~”}â9s¿Eïá¾îßÙîÆ”±»[ü{Ó¦M›öKìK–¦ÃÎFá GçÈkJSå¬vˆ8SZg¶6Ü% 6,+©kÇþ6.2åÑ£>ù zs«1Ø}Šo³@3í„•L(ïÂÖ¢é™ANþ#”$!ÈJ)`oÚjÈÕÿ°Ë­û@±› hö²­0×?L!imŸ\›IäÆ1;Å6!j7_ q‡&yæ‘’ o’vÞr é6s¤9bo*aXÃÞ%ÒX!Õ<¯áu´CEû´‚µí<úf#'ìawe6f/‚SûNz ?Õ%Y‘®ö4U¼ôed„w i\ÿ>Ó“áµþeÿ玱đAÛXUTž ýÒ(³­FôŠ¥yÒkƒq“ë ¶÷Nãð}Q'=¼¾òÜ~Ù{ ó÷¦²Ó¸`Ó>ÂXó‹õccæÂÀÆd»š6mÚ´_i_b©Ò]=8BÂ{Cã>"ÒUS)PŸ6À¯ •GçöbªTÄö•Øž8Õ3¤èÔe÷œâ#ÅUËEÒè€A„‹²ò©°ˆ¬ûo×$­ ø£vBÈÅ¢ –Údæ´—AÕ&ãÞŠX:ì)IÃŒhiáH?rÆiy{Ž ”í‹ï͈å¸<+ЖÍ,xõTÐ-G=(d˜^ô+ØiÚxMÚ壒&M /’—™õ²“Єe ‚i=pá4‚’–ÝD‚²I¨Nž³õõ°2¦è¢Be"±LÞöS± p°F[Æ ,fr,:J*6‹Õ|φhÃ·× Õˆ!¦nV¬Õ E5͜Ȼ»w”µIg)>&4¹¤âwJ æ€N 0OŽÜÆT|[êž’PEQO|-©äI›©âýÒœèÌtõC 'rÊ:´áØW@‡T!¶¦ÔO^Ë•­Hv¾ZÔ‹¨²ªr#;‰<¶¿ï¹e.éî¾ï\ H×Chh¬rh„ôx®ü‚qz¿ÆÕN^á;쪶ô û!{fõOU»ŽÄ\qà ĥAîWl¾~ïû&Úí´B‹{¾ËÖKô/6þžîöìj\]%pfžNôÚ´iÓ~›}Q#–°5ÍÀEtÎÃwÃ¥w©üD-ÿ›ì, ½’'¬8O»©²‰ðïµ8"{ÿÔ š&øîËé¬ãª……8ÁŠXDÊ*y}’Õ¼¼È4{$ÈÃzSµóf(Œ¤™Ï¨4ëtTЕضá±ލ'Ößigv1O]#wøoxKö!‡„VèH‘ËÔùrê 7È™€qŒU.7)YñaÆ~ÙÏ™apÃ9ž©*@r\Œ* ,°¶H¦Q‡"†TI¯ž¹“¯¤\¶È ÅhG†k_¦Š`UóÚ 4¢ª§¼Z²$ÁÊ{8MlÇèígô8aˆ›b®z)J”gˆyܪÉÁx¿åìLUMR€TÒoqìM鸉5.ë·”ª;Œj§@¶Ö·dUK~?EcÃÀ´Ã@Bl§€,£UÞZE#ÓÓÈMä8µ#Ž#\ù¡ª4ð°†Ð²>º Âö¬>ì!2#÷tk|/u Ljï+Ûô2L(¢;…W¢Ä€«OÛ˜±L†*êRÜ’Û£à0QfŽñaë»>Xm"E}ÇVªB<¬¬Ã8µFÿÝx%îžÔ·\ç{ZžW¿ÿ«†Äº›n=ÝuÑœXí'ú?mÚ´i¿Ð¾ŒkŠÄóìïâ N’4Y‡’ü1š3îþÔq[” ¯ù„…w¬81 ¾õÎ!çå§$Œ%Þ/{/Lg,xrþ¬å?R· w-tÙyF¬ +%íð:tj^,÷Û¶j+‡°f'FÒÏgç‰ç‘SÉÇ\cŒ±I Nœl§Oœ7J9L"=n¢¹,×Ó9¶Š ¡»Èeö0avMk€,…Âéµ4<ü&¿q$( ¦3w©Õ90¸˜œ‰‘!௛‡v`'yோµ,ŒœrÌÏ3­â‰‘Mù „g˜Çð,S ž÷!qÅ Êôï‹)Þ¼Úq#³}ä„1vS¾/^+ÎàÕÛ½ŠG„[ø1Oþ‹ìZt„ç4̧ð ½ÄaN-†Ým°/ª0à‹aÆ9ݦM›6ío´¯x²°`ʪÁæY¶Ì(bîûí¬Ï[Wn°ÿ&ƒi¡Ý&l}ŒüPª¼Jýç\·´\Ñ‚´ÃŒC{>ÇA:ìªtà¨xÀã;%Qh Qïât·3™Ìnd0¨ƒRÿ“†ŸmR<}D ¨øë©Ûœž}uÏÉÝ™ú=7T³Õp;õWlË2–y–¥Wb×D([?®tÃ]~^ë¾ _­ÕšLƒ™ O7Ñ,8QË>⃃~ñ‡ƒy{è=krl²Š³‹œstÀ»½þ<Æ¿ÄèN›´0S¹†:€Å@M“èGGz³WQ4Wõú®† ×Óà{¶>RF£áoŠ2+Á·>dåP³bZhl÷æžß†Þ‹Ì *âÞ†õ\d,~<å@sx4ÞÙЫGyíž|ºFGŽÞL¿ÔK*‚˜mµ'¶i¯/×~5þñu†§ž ¨ï¢Wó7“iÓ¦M›ö÷ÚWã(pB%>’ÒèäÇêˆoLê´@Hr\¶Ú} ÀG~ýáêÔB§Tùøëz ÈØiâyrh}‚NÒ–õó¹)ÙjOUmƒŠ}ñ²G€!¤EWüé; `5Ý ¤Ha @¤‹´€e’ì¥`Eqw(âCýÑ’Ë{5 ´d2µwÍ«]+Îü¸zÌ`-5f1àÄŽµ™ÂHüFÃ"Ö‘>‡™Ø™é)}ÍÆb嵋SõムËÒš' ˆØ‚›¦ï'\ñô%74š€T|åLÁbgœh/‘ ‘R>†( "_pp$”öh_œ#Kßâ4š¤•Kèƒ@´‘-pâ‚F}ª¶ ŒÞD|Oþ…}»S©U#hQc¦ÈY;äÈ–YžXW<Ù: @¯Ò.Æ€¦hÌÉdÒË$Õ…iËP…áý»À¤~>&KMÚ&ÇKÑáVA jX0]vÐOnó’Kg›†4Ã̶(‡:ÈÊzãÂ¥‰€#)M뛘1G¡™Îï¤0‚’üõè ^û_½]ÿ<£›‡ÀÞFß}dS#S€ƒŠÑÚí,:ç×nö°ÐD‚¶Âؾ9í}6ydŠ]CÿùÆ^ÀìºiÓ¦M›ö‚}5ŽN×`•Î6¸³:ÚÆÀ5ä•xOnê;@ì Z|­" Ñ4(`nÕH“r>‰±ˆùk6«{þþÎJ¿yË. ~UgèÖCN›«ÓêÍ“ ƒÍ+=œB³á°N-?ªí!뮘jÑá§ÏÆLë/Ðëxl¬"âDIÚûX6ï¡;Ý>ÿÕÜ> ÊÏú"©t'ƒd,¯d;÷æ{Nì ƒMyþÆX Ã{ûZoÃdC;,ugN)‰RÁIË>MhC˦EKJ×®Z©eF e'ËZ5Åpƒ †ý#üë%vÓÎÍ(¤t8™*ø*Hͯƒ$Ñ‚*Áê`ãÝêw2Ûݧؓ«ža{~©fÑ•LltÄ+D5% ºaÈdYƒÍF7G>ýGé{`˜w/|¾€”Hè–FxW8P: fü0|4"ÝmmŸ¹¯¦šóÇ×,ޱŸM;ŸñžéS&=tãamü7Lbd;pg·3EP†`ÛWhµØØÑU*_Þìú8/VÉaÎÒŸžÔÍöïz‘;/2Ægu…žqüY0cÓ¦M›6íº}uÓçG¶"·FÀñàcyü“áL­/Ëß6níšâø4w2¤ï‘Fê’÷Ÿ(Þâ+Ö±¡½T(s…£‚_÷4Ol ’‚t-]¸ò‰h§‘KƒÝc¨@B¬$8D†éÑ%lЧ« €½û^K´(¹#>Õ}& Ø6¯f#AèP¨ðÆ^@ðh%Xn¨Oý] ù@dhÐ¥gâhjsT’Ë9$ëèŒ3Î+±¹«Ø!ÈbHœs\ƒ¼¶q«ì¨¦¦VÈœ/Ö˜Š@¬‹XQÜÄöÉ—ájÖÀ¢„ý$Öø‘W¬#¬{hJD²)ÏEµZÂN£Rd14LŸËÔV4Ãm!Š…}ç?\æb AÃM­¶£ÿ’ëÀ?×m)ªÁØì_õM¦DÊP<‚‡Ìf>s¦LÃÞ°ä•lÆä[bÈÉŽrfªV$ÒÇ-/·ùî(üç”3Äo±âÂZ!ÎaUôñl¾(å‰mg—æ! —0Öª™L ÿ´}ª"³„ðç¤ülDùÛôõû¦pD÷÷UÍnvaôÞÀõ#xÏ^yY [´ÏŒž•J>K 4L®…ºµNoç…°ø&‰Ÿ´ßËŸ©3GÖákô_wU }Ûð8ϧھN+lÛ^pFĦM›6mÚ5ûJIÿ^RääP”Ëp¡â²xîŽ Œn‘o@aî4ÑH™ˆñô¨.‹;ìÚztjmŽ÷†GɰÖ"¦BÇôñ7¡ž¨Ž:Z –&ë–²à‰ÿ.[ è.HOìãéÉ•êS¡‘a£ÒºI'§ÇP%)Ú+Ç-ódmr=^¤î· ú?Ó1,öFÈõàzzÒ@-"Ë&±ñ5é·C‘˜_BÏ‘q DÒ¬%ÇЖÂj¾§Úó¿â‰# æ֢¾fZ¬ ºQ¼²'}Yän¼‰ t c ˜àìz_ÒY^Ÿ"Ø. KÓ ë”í. Vãj±ÍùÍÛ^“Æë÷æ ²ók‰åƒ‚»@LÉróa{S]'J±vd3BŽ¥5Ù&’­¯‰`º'hÖ ” K~×b졵 ë½Ö–J IDAT@ÔÙ†´ÎëZ½<í'G½åÅBúˆvÖÀ@Z¼C¤‹X5B.£cª£ÿÈUR) ;Ôs¥&¦ÃÆ8R™ƒ1¤SÉ‚½Ÿ=àŽ©,·¯©€ü£6>Îqî:­5ðeÐð†þ­Õ¶îÁ4qñ ¸vÙn` ­K@ù§`»rèúB x¹D ýFø˜¹ð!†l/þÙ¥/_í–"MÜ4Z8°‹Õ§7/aÓ¦M›6mÚa_Rd¦YºC”0\÷1Å=æ$I¥ªB îη$ò.#¬Œ>Þ†1¬P p»æÄ@»Û5ÙÕO†öN °ËÕýÕlh¨°€&ªÝή¿Ö¹ž×ÛfÆCæ\Üñâû‚ÆÁŸ¾rHWÖŠÛô_YGqqr¾´íG ó7 ûSeX&.| W×¢Æãá…Éyu7?Wm,½jŒYš6mÚ´iÓƑT³štah†ýìÐp2uê±vYŸç²d5“›OÉ p%xƒIý>Ëc0ž˜ü¡Ù»'*.™¦¢Ôõ TIj(ÞôQ"°Gb4èéA–'š‰"aGVۛũÏïZÑÑ5i7Ó†«)3KC²(5lÐj˜é&ÍèµgõSo½vÐ=!än”PäS}ù#X‹ÂPŸÕȼ¢ q -"Íq¨Å¾iß!r¤Í_±Á Í1ïz]½`Òt@«! ë50 i ý7 øÉ…N#¸ßQÑ<$µ8#¾[ª%+9ØÍ£WlT\6,´jväµGHY¤lÇ žªGÂox0Ú°® 5ÿ޳~UOÕwr9ì|¦•7lùÞ)_†ûý’†ÖXîRå‹hi¾˜Ò—1bi¹ûçh¤ZÃ{8¢Œð „Ti½ˆ$žÂhîüâ1‘±-í³ãÑÐk(Iý¿ŽŽ@¼Ú‚ ç¿!K½›[}¶£üDËߢ£ËbÃÒiôcÛoi˜¹{D@÷wµoQW˜5d{›TZi¶Ê¹YÌà¸1ß²qfãõñó× ±#è??æ©ÆˆŸ|æ²Ê—†&~M›6mÚßn_9ÆÑMáQUجŽÄ–a_C¬;‰ŠÎ%§Èâ¼ÍNƳ7bNxû},1~p™Vu¬‡¡?R`˜xÚUv»LbåyŨq2£<è5b[T ÔÙiúÌÍ'ΓiOÔ¶˜zÔAþaÿæÞïþ;ÈU°¬îû[0‹ !dŽ}¦Rî÷=.²l€ãÖ{øá ™†q¨ŒJ„•,ngšSKÔµWpdýOS‚à0YpÔ-Í+‹Ïî™ATn^ëÄpôH“¼h.†„:ó|Å×ÉDL˜bJ@ÌxÐ]9 2âJ.£˜šùv<3ÕÆ"S˜aü£¨“LΦgüQS¬±ÑA²#›Æ4­¹Z56©–Û–Ä¢óyÄ[xc;J¶øw´ŽY>¶‡ºîHL#t&ÞÓ¾@Ø…M Ozï»(x^³÷Ý%ª%©©½\»{ooÂÕñB'g —öƒ \9ÑÕÒ¨ÆòðžÑØÅ×0$ÌûÝ4-ÝóÜéÔëI¨£åÀJ{ªææö²€üV#•‘zÀ•ù?e£pp öÔ ³½Ô 7îákתvnŒ”ãCs²pÕ¦M›6mÚ´ï°¯tCBGôÞ=·ÆFÀ²Zz“ô,›àõ™0¬°õÌÒðî+4ÁrôÉþbK7tÓ‰øÓ=v×õ  i’«1åúS/5¬ úRV6êku¦ü ;›Zà¦Þ£Fu 2T"?ë_ÂÂ:iËG2+YY ?Ä—ß%7è?!òß¡“œ`(ƒ´g^Ÿ·@FîÝ'+v=t”dï1$Ä®fÖ™ã~.:H"_Á1éðΖf‹F Kç…÷¾Íõ9ðØ ƒSÞNƒÃÑíØÅ^VÒÌ-"{ÈBÖD´š%˶¬>CMv²ç9q9H·0Иºœˆš÷ ¹b!ëŒí‡kÌêí::Ÿ:ÙËxÎïëê §o×ÞòíX’ú¹{ºæÃÓËŒg]x„žaÝ\`½§VÂW%zÖ Xkë"¾nåv°#$bóч׶A¨!ŽÑWd .#)Är©­%àò&˜²‹Ê“j½ŸÓ¯dg!ç8xY©ž¹AÈÙí8TI¯(:ç¾aL¢©Äƒt…Á±¹tÏé/­Z“á&’Ü1®nßøÞ°ª4ÂpøØçŸ6mÀ 6mÚ_o_ñl„šï2ÉôGv^RîÖ‘}ér¹™hâZˆz¢¦#At¯.Ðã^8 ©ë‹l€,ŒïsÈ£…t²þLÎàßê¢ ©Ð4‡&3§Bj§ö<p„ÂecÆpßÞŒÄO ßׄ´${‘I¾†åeb’Òî©ó£6¦RFvć˜Ìâ=p05Áh-hX_ ÷.ׯ¦:V1Õ½µNf„u ï+69r©`[U âŽzŒ§¾3c ž‘e1xàý£K¶òtxxõ‹ñÃÌ~S—|šm;R¾;mÙø:a¡3lB®ôIÌSÅ&݇¢n„¤¬$>mâá :ó²TJ쇢¯žehòÑ# G®A ¿ïlÒÄ` dÌßÅ=]'¹-ˆë5;öüÄIuÙÜ!3O8ÉÙìÕȳhÃ}e”ðOÀ(ÈèFv° ÕÒð Ñ«ÙõC(áh@‡£›K7E—ákfâü.½©/K·™&y7¶)P*»üføùILKêìE©!QSŸnµ -qÐQU°_A¬?ì(°ùòIkÇwã˜AHöj9±iU ¬B ?/™–/‚'›ÍGœ zHòùb%”wÕ= –É„v°ÑÊ©é[ƒåÑ›ªîƒ:_±cÁ^¿‚ÐÈ ®ª°4Ï·MÔ<.ÈBÍ/¥µ±uV9k*5¡tR¿a瓼°ã?jÕVtÞ,–)Rò1†/Ûîò¬¹*•;á lÆ:ÈÐw¨y‡Ž±Ä~mDœµZž÷f ÏÉTÎÄŠ‹îÏé™â¸ûí<}DïÌÊ\£º…úÐ!Gzr¤4Yæ¯ø¹HŸêyp&ñ_‡u)ùeÓñÙ¸.~Õ†O…A5.IœqúfÀ°»âðAüHêâ8ÈxBk¡6±·dÞhî>ÕÓ"‹ˆë)rþó9káB2£ŠzõZáÅ»ÜùL?à¢`CQ¤‹Ë~™øé´iÓ¦Mûö»{•<øÚ²®p¹ˆNdŽ'\z5{„Ô™'©Ñ­ƒÔ-*w¶"i±H®>8"fÈŠèÑdßïºÁû{1¨˜šwıíÏcŠ3V…¦U±l?˜óºœV=üμÁ ¡>$£~²MU6•"ÕqÉjH,. ZlrL©ŸTËPå±ê¤Ñ5ú'ªpãp ¶ÿ¥ŸGš²MˆÖ2´àxD{£Zµö‘¸¨â‰ƒÌf·¹‡Š°­âÜDF'U¹mL/“1h;r² b|e è`ƒuR çSΤ#iq­Íjrå Ѻ;YÂqŽâ)×3¸~5Í©¢Nd;)´÷Éi9—œ^«k1(õï¢XA?uH“*ô·Kv¨ 5J[F¶ÌÐQÑÓF±M’þßH•›_¥…å«Aì 'Êš7fZÊIlæ…0@ãEõ×.Œ#qØÓì¹-G½Áqö­£HÉx‚íeP¦ `ÎK9Fµ( uŽORž˜ÎU`ŒÐ+ÙH¥ŽdXn®¿›Ùé¶‹Çoüì;vgÆþÈ÷tŸM½a=µÑ~µª«P5kLÿ’ûQûw8ßÔȵ|ªêƒsU5^âtZ2Øîf¿ËØÜøÎ•¿cvX‹¶ÓÄý§M›6mÚ¯²/SÛ®WN¦Õåö !ž]c¶‹ä²ä„šqôC…ˆÒ/5P˲]Pe3ƒNò3·>Z¬ªâ»Pí‚þ¶ö º²Ã­À­,`C‰Œ‰ä|2’?ù¢žÊЖóÇ¥ÐRg²F†ýãöÀl ¨NªPÁ*¶`WîmˆÚQ†j¢“H›½^¹vñzsDrYü…õü£Ÿþ®àv)`…„ç×¢·ŽgÓÁoPógÓy(!FTCbÍA@Iª÷jÅšHg /"ðH¦äåP†ºÜ¤¢RäcZÖ»l¢ ÿIÂÉaë®Y2\Ø›cÎ3 xt\‹‘’E*YE½ç*µ"+Éï¹Ç¦pç&HòEú½÷ìªJµ·^»W[Nü¤ªŠéˆñæb@ÛØ|Âòcý}#§:Ê+Y¦>›G¸"“½?1ßÁ Îw^ä•’æ½ý´mî»'é‹YÏžT“u£©-¯ÄÁÓCŒ”„É4agûâèGk øƒß`cÃQòo¢õü'™ù¿omÁ ŸþKÍ…§Yþš>Ý4mÚ´iÖ¾¢0+WÍÊY3í˜#©BÞa!"¤ öÊÌÑÜ}‡9ÚΈ‹Û‡ã"g!"*Yã e6„Î8RÚó‡òާiש£mCƒ×mGx*u*\¾*E)+]#¶«Nq*XP||…!È´ ¶u‘e•ÿ B±ï”¤§S>ØÓçwP0^ýºõ/´ÆÀ£1×g$@$áñ×M£Éš4Öàt`É‚žª§}PâÒZ?yY„U‘1“÷BQ5âb6IeÒ£šõþxÿ%ýE‚ñp+6á4ç̹¤ˆâW,Oœ¸t²ÓdЭЌDáI¥ôUr]tõÿÀ"%Pç&7Ñçÿ€j §DÂ4tay‡V"ûC®Ï)y¬<(ŽñMv¼A²¢¦ÔLnHøã*÷™WÁˆñ¯9º"óÃû"mª #“æxVr ßÐÛÈ£ã†J¯'ß÷åšÊ@¨yÉnƒ9zˆÉê~V2q<ì¡ëóê ñ\#´MR=S4â"}P A7d6?{ÀV Ǩi>qIJÏú@Võ¯÷Ñý¨Í5èÿâ3Î _G@GùmF–z”›ÚÇ·AýÚ±:5QÑØ„{‡ÃcÃj&§Ç¹)•rÛÀ »$þ£6aГ {+"?sŽöiÓ~ÿú7'Ê?k_:Ǥ‡Gç•lîÔ²;üÝÂXhÀŠÖætÒÍ !1ˆGCw’féqä † <ÞqÀÍ.ã[,Çñàh)Cæ»ØöûuWk\UGdŽJW?9¡…ßìÈòHÆ…˜/¿ÓÑ*kÈøC­¨©ôli“§V,µ+ H†:»S^õéHˆ–†Ò †Ê†Årc'׬PûÐvS±8 U…€í·ë# °Z}`$GÖˆ3‚¤Ps6ËV,—€R€3Uz“]±L0sÌ|Þ´X»‚@À„ð^­¸®0ÄŒd³v—è'÷h|Í?ƒ^.ª[78CÖÖZD1Ù|bɲÜr_‘ŠhíëãÙa´U”9¹õ¢/Ð\uÿRm…(’áC;™KʨK!'X­õÒG¥_2Z¡R±êéØLF²?ê_U„~È)wô$*UÓé7¶0ߨâ\ƒ´'xÉ#û:Ç>| …ðÜNZiÉœ¡†àµWA:µ)Õ;Q2©¡ýE[&磸/FTØT«Î ÁF}¿»`|F4~ˆ;fJ:IšÁˊ˧{;Öß9]ãL?¹Ê¡Þ˜oc¡Õh¾cÙõ*iÆD5륈"›á+À‡ðéãÍëÃÝz*|qŘ6mÚ´ßfüÃöuúpù­“GÒäĺ”v{šÖ‰ù´)Q ŽÈÒE±%’¯Ì޳ʆSúµú½ØrÊ*O$ý€Âw@ŸJá¿E$Tiœ> ÅbßÊS8lpzB ²B¸Š,‚uKK—'Pn8”VER¤¨E„‰ÿÝ Ð»Ü:9ZË6Šî*rlíOHC²3éÇ€ˆ¬[~±.X3Î d~‹Â]å‡îâÐ/-‘b…¢ ´<þø(Y5I‘”ÀŠ ’ž¼Od¤2æ4=QZ¬­rå C‘ÐG;ËbÒh•E²7G ]¡í•C‚LûÄ‘U@R-†\ÖF8|9¥fbNç(†œÝ.J€N©$#[c ãÞ=$V+R±xâ¾X,"ÿóˆq4Zr°’c]x$ìîþ‡mIíðfËÓîËö6S51¼ 'ÝÍžËÊ„Œ)ãÕǧ£¬ =¼*#—`ŒD. +-ž-[Å_^Ç €.(QAƒ_„7º\:¥ìä“´kFÈ…||®’Ͱ?IÖ7&ù(#Ýý)J‘K¾#ŽŽñô>øž·{]¹ôÝÒÜc°&kúÏÓÓ÷õÀ:tÎjÀ£±PôÚŠU~REb‰zßkÈÚÿR\矫vèîìoâ›Ú´iÓ¦Mûmö¥sœÉEÔl0;Ž™ð A6³t55UΚºñ¨ QÆ0Cv4^†ìzqu‡{:t 4éÞæE,ĶˆÈƒIƒž]z;âñÖ2ºMÅKÃ->”$¢RçAcp°E ²~ɺ =‹Ñ³ö€Ï¼u)óxÀ qŒ%Š—ùÍŽÒuú"”áÁIøçi¤ðçdYîc˜ÿd úÉŠ[úcÁqU=6;1Gœósy{Lh‘G¨ÇPbI90:¢(^p€°¹,¤TT£óÃÅR±ÊóSh5Žä³~»ì©ãÂ…±7Ë#Íl¶3Ìf„óOÞäßÞ OÔæŸ+ÊúÕ ºë;¿î 9¾üî“£¿p£ÓÖ±k6)hN¬u#‡†–_íÁ–¦24Ù¢pí±Y¶—^¾Øf³´ÇKÞŠúþ:ÿð4hN¾¶\d”¤ŸÝÊÓ¦M›6mÚ}¹ÍŒ#À)…|Ÿ%Á%í’GtTÖ¥”DóúRí¾:5h 2¢[ûrȞσ* “:šU¶,pI…ë\˜Ë¼C¤áñ7€²âÊdF ädõaHµYáàWá""ÂEá*xPr¯;.·i¬áŒ^ñÙ¼m ™Ï.Ló„Ú«Ô);H…t4áfíÌ<«U<>4„U=àHìï®ê˜Z Ɔì›çÙŠY ÈË­Ž¤bܘ9:´í“ñÀ¸1†/á,±M55Õtp(33Êl•,\¹89{¨éÓ*£³XSºr_.PsÄGO„ œÌ~•¢ˆ}x±RYi‹XÎss–õj¯«”Š%8[ý,« ÔJøøû¾&,|`éšnQË`HÕgŠÈØÂ²8V“¬ùš5!,MÔ»Eþp’0ª5iacíèkö²@9:¨Ñ)=:\|S6t}1¶2p9áfŒsg?F²Dðìð/:)ºèüÝ¢^„PÑÜVª.–¯ZcI8þ­Þ Â\¾þ <;î¸ÅÕŸje ‘š§KEœy9ž9+ ?Œ¾çwfß²V¹95 ý£W{å5ò ¦šÝ,¥BÂ¥*áÀå1¹¨yï²IEÁÔ þL»]£×'O'¥c¢üÓ¦M›6íﲯ¸##ø¡²¥׌ÇXQylj³t‘d¹d§Õ§CXÄÐRöËŽ £F1`OêLÒK÷<\ª$a„ø×þÖxPì¯OàØjo?AxSꢩc-𛿷;[ÍQ¡<íe禇`=òë©0²åÒ:¶!ìDô™[@Pæàï°ÂBËÞ#¦Rž"*'- mbµ%?1Óå1A{-’àûçáñ¦‰B!M3î}z„|RØŽ£ºcìV p-Jè¨Ã¤X":bÈgœÜ4™¨LÌ¥A¾C¬,Øf¨×ÏCÏoçÅ#c–wGÆ-6fiÚ—¬²PøÇ¬´zKØÙ‡fhÕðt#3݉ÁGQG<’ŠIìÉ“¦6;Ô@TÚÕç§zhÁ¦L7Ööà´Åg¾'Öjô Ca‘›9â„ëÈ}¬Þ‹’9™ Ú‘„Æg²ž$í<®u ¹€ÔwáŒJô¨ å#;zaAáhç»+ïêРfs} Ÿn©Þ˜l¬C”FÆûñ‚8þŒ°U±¿£ŽÊÔ¿2pa_„wÜzø‰*J+Tëó¥¾ýl¡#§?Þ” Âà2H-5Ôæp£ñÂ:#Ü®ÞiÛº½ ¡Ðm´ÇqrLv/u~¢ÿˆ±S6ÿIú=öbmBÿÓ¦M›6ío´¯„\5#‰+`›m«9Í&^möDiÉpذÐß’O†CŽΕC§§Cç– ¨¤õf^$2 8mÕGúüÈZD– =×T3 ÚfpÚ5‚æè†>YwPžÇG´|7Ø)‰¶WÐŒÿ+hÞ9 HSr¬°'¬F4#ÁBP€\U;kwåq÷•›1ü¨L}e( þ̲AÜ‹ÖgÀBY`|ÍHsŒ|ýçÒ"L‰@–E¾Y ë"(ü#ÿQ•ÂH«°Fœ\'¢ÙäÇ÷ˆ‰Ò¬¦g×jrÞtk±uʶ®ØÈÙaãKïŽö7”8úçAHŸG¦«–¦1K֥ͨÒ^‚ƒ§òßiCâþ-‹/¸2ÑÙ¹×ÊŸÈ2jSZyW BûÃC({ X½÷'þ¾«S?%áËÒ¤­vE™¥ƒ‹ ì\®Y8äy¨"1ß&)Q ‰¿.t`õ¾ðŠ©0m¤¼Q|íZ9ÂYó2KQ|ƒR0¦b®yúeµƒ²Å0jÐÁY*ÉGZ Úp‚mB'è0>'s"+Þ%v©ãܢè±¢«Xua&Üqé*äpú EË·ÑØ˜¾çÖºVç0tö^‘½FÀû! )áƒU)áoz¾åV“”`sé< üÙ¦xpAд.SïΔÒ*f;E»ã¤Œˆ Ÿ4¼xæºGCóùsí™×6Ñ—‚—V ‰þO›6mÚ´¿Ô¾v40õ€(Ij¿öÞ]¾°þ}‡Å87éð& þjAÃáÈýé´ÙqáÐÖQä‘ß-$t`pÈo¥(o„Èê{çî8ԪƩ¥€7 þþ*‚ò¯þ# ÀŪèf}LU"°`Ët§êÔ¯œª>øbsñùæÏ8-Y?lHÀë gtKUlî¨E ЪËzqȲa”š•aì-Ppdh×Eq7‰Ó-xLEä?dùCù³ŠüO–õ‰!ʽHþZ>î1šl'aOÈOõXïÁÝ â”˜éŒvÚ–.…Á•üÈ‘.ã—ÇbAqßBÅW¤Î˜¶:%_ôZá§O^H%TÜ÷¬@x¾µT4›ÊÕßyɾýx‹"!0©s´óq…g+¦MWw¡ë$|KX¸*OÍp—’Ÿ¬x>ñ-™àÑšÕ &ÁùH45*&Ïìúi9Q{z¼8ª¤Òr¯AŠ/ë:@&nTRHŽM‚ÆûSXd=ÊóY¨ÉÙ¤’?PÒ1γİޱ¬A‰? în¾B'UŸ½×¨èGе‘ýrØÂ¥_]ý\‚€e[ˆê».ÜÿÖça½wâ•ß{a t¥Ôï• Èhê¸H®ßŽÎ?µêªÕ;?xäË¥¯éÜ/H9§ó1®½ü)௬9?õ¨?û:aAºÛø6mÚ´i©}éô án³¡ù)™ÆN-¦C÷`•{¹“r¸€î-) IDATÑõžªb¡¡ÂIOn 2¤ì)ºLõçïéŒYûù¢Ëái?Q`ã/Oª}…ÔPÅd}‚h‹˜äRÈ¡¬ ƒÅÓ={ÿvn`Ùb–QgÙ”ŽD¿3xC=‹-ötûèªdù}šè†LUD‘QçÇ1º2º †BÊÊM—Ffù¡¼`+¶ØϹUNèëižãÿ²þ'"²®"„ÿù#\ŸpíRq#9j3m"o è45Q>2Êf7㨸P\(ŒV|\@Ê~Pxp´æÙ[§Â^E"üÝõŒ^¾ê°(ÖÀ˜…Îd’˜ÿE*D\ÈÂ&tC‘@C BUI³ÇW–Gâ>òtÅçÚ¾zAf}‘…†¬ %*ÁGZp8Üö eg{ Iñ‡ØYÌ ËyP~¹DÔÈ¿W¥É eªl…CuY›ÆÐ‡>l×¼×(ÓqªÅ)à‘,b]hæm3!ÐZ# …cíÊ^ge‹1Þiw@jŲƒ”ÎFÖ0²ö ˆá/W=ònܰ½ pl'B>BéήV´&Utoyaíæ·Ç ’›…’AWÒªU¥ ħ4wÅ‚LG:¬<·”‚½ü®*“‘õç· ÔhªÐ#‰E½q:óLøí×ÖL›6mÚ´i ûJH Ú¬‹´ù#YÆqytA†Ña \ø³,-/¼Im|2‘%æø!mA®VŸ³5;¢h 4Gz>0ýÜ?n½páµ0ÇCôòÐÃÔíRçõoi:Ë®òG„‹‚å8.¯"² ÖCŠs•C`S2@æ [󈘤ÔôT'^XLàû)sw.¡†'UÒÎþ.¼J ´Q­ç~æ˜(¸—D¬©žùPY€u= °ÑÕö…Ž£@þƒ,‹üY„þOä"ÿþÁ²õ»âa†uЦٲf«/äð” ,®F§<ܸ¬ê¯”ŒF>§¸>~wtŽ’5ÿLŠ%a ôi}« EݰL®á2Í–ë=šˆ¨A3é*Ô^/ìЬj}Ý~EƪJ¬ÊF„ÙD¨–²C 6ÿ}cäOЄ`ÛÞn©Â³‹ £Z7†.¡ªZƒ‰I›÷ÈÌeg­Û ìemcÈs†‹ fCÅz( òÀ¯þoáËFYšEÕ—»[’}Ié]ŒÍ£9¤/}‘ ÿ/²\ÆU‡á †CФ À¡=‘tdÖI£l5˜9fGU÷:wcg½ KÉÞuòô$[ÐK¸NÁ×q´Õþ7À |ùË,cúˆ+aÁäÜOpd¸¢ˆu3·‹ÛkBybdµëZ1ZʸT⻪MEñÅSÒ½WÆp;úņÜíRºo2|Г ªx{qâÿ®™6mÚ´iÿ°}¹³é“iÑÂv ’q]O}øN\Ó£`‘Y1ˆ¥æd¶Õ»‚ê¬hýC…Òš¯Áf"Âg5r504²lÑ™¢”qБXª2u©(/uJìÑþú”O?2ЕX-\¥~"ë“èù˜0EÁž d‘?”…òß“QüYœ@h Ô‹" Íx;e.ÀxŒ ‹@QT͇5‹ÜgìÌò©| êwÔÄBù#^®;W†˜ˆÚYÁ"ë*ë‘ÿ ÿ÷Œñ,ÿ ÿÛB5{¦ªVN. *Œdªêñ†j¹ |t–¨ìõLÏGhB.ü9ZŽ*såËV…,ùÝéG‚(mžw/ˆ.®bU1 æÁ¡Ì!™ÚGòâ1ήÏujÝ ‹¤h|nà'ªFø£—§M›6mÚ´³/wt x„ ÇŒ "‘Qb`;dŠŒ(º›C6ºÙcÌ3FpY±8 ñO…8;V ï†!œ2yˆúºÓ'áSð÷`”AY-Å‘+wQ<óãÔ½ð‰»2¹,Îù ÆQ‰}—Žð‰åq,S“«Ó<²ã)6ÉÍ´ÔØleáL…%?Ù_îÍaý'θŠPÖõP^YCÍD9Ø™dcÐâ¦bGr: ÿý' dý#ÿû#þ·EhþO–ÿDþ{~ggªœßT(³bËùr×Q»K`ÈЄ+Ça³¶= epÙ‹=P{È“wzŬ=h†®àÜôhƒ×ÊP«Á!œn»)ܯÖ7Ò–F‰YCÒ‡OsÆÅF(Ûh”én”ðë>U^Eé‹UÀç´M,Fæ#¾Ž±m[²‰}ÚZ™q³À²ÆXYäŽgÜY OÏ„ D„4!˜j0Ýwi18´uæc“¹“Œä$V•ÌJ¨Ã‚+FñÉbÑ㛽œÙF¹³]“Câ%:ÛâðJ宯dAÒ$4—Ï6QR&ì”Ë®dÎé°ãV.å:B„МRYºÜ‘ªÙ1¶2¼’¡ü-Þí–è¢;„oi€–2ÏÄŠœé±­7›¬Ãp¦ýQlI]_s~N±»§•²çð¸–F•ؽ£ô;' lÖ|æ\®:õ-=mÚ´iÓ¦ýûJ¶0ËÿB›UM|Õq~3hKr`;d€o Ï„èG°"+òŠLQdý¥ž¥G|*$ ªéQÒðØZ hø‰æñ`ùô—츀UñØÈQñ ñ`XXüÉu³z–pâ}PÆrPÖ@µ¼+^Ä®½ !e]Ÿ ?tiˆ*Mð1zêy—+®ÓoŸ%•(èö2{Z3ßÀA…‘`[`ËÿELMÝ–)ÿÉAñÿÛn±é%€}œíñ žz ÿÏÞ¹n9n+É:ª™uÞÿqÇ-ÄùA\òR©ìn›X^ÞÞÝU  ðefDËî¯òë)¿žR« sWª÷ËÎNR¼ðu— ÄjßùW$ƒçGÌòA¶ƒåÉ( ’+Ü9ð“Ã’|%™æÕïºGùÑ€/\Ò§Þ,?}ï._ŸÊÜôÿnw»ÛÝîöç´¯ÓTý©t¯Žâ´Ú iæ…ÈÞd1÷ÔÉçF쎅¦"ABª;ìAvgŸ"Eع‚ˆðœhê&af»ìñÛ¬CÎÞ™ W³÷=øTImW¡n¼a¦Ô`<‹B)=mvÜMQ±×ºCñø|H —TÑ>ªÐ¤ÞÏaÐ;«ÔlôÜv¨š'O¬Ì Žy£ø9Î˜ß ¯°ÓvmÏk©B¢h.ÅÄ`J}:.žµ³H5€ëjx—Q¤ò>UžOù«Ê¯Ãà´È£HáÓ ˜ê ÓÔßLm+9#›ž¤à®wÀ<;iÒçÁ}ìÕrøŠ’­Cƺ¬§g+¾à”ˆ ˜Ïÿ0LZókuÇÎp‚& œbDQüœJNóæ“¡|MD윲4œºŒ&Íí…Y‡Y7t`xêPzbãÍ2 ¡jŸÑGà™’gLƒ*•ÉÚC½ ÛÄs„Š©ƒ³a¹¦¢¾7²„ üN?K‡©BÎÈtíV`/` œg+ÒUUúlöm–Ä+ëÕþÚLœ^?®0Mšö¾½ ìëÖ±ÛøKØ‚LquÙ¯*óð‚GÅ9»K¸ðÒHµ7qEw‹Qzá•´Û¾®PÏëoêï£2nöwÐíÇ9)ße¡x¥¶¬µøÇR6›Œ£ûjúê˜Ñq>·w²ûÑm§9¹.r{Ì[_\*®ûN/»oñ+xqBýƒÔ˜æ8¿1ລOY¸ôFów»ÛÝîv·»Ùöe¤é½qf€,á ³Ó¬Ù²ž‰ÀŠ6cTYÐÐήëM Bf¥¾PdN°æ?±ÇÁÉNgðQIšl쩌ŽG´¢ÄŒ­ÚwLjžÉ;T×_Tw TÇÒ ?ÏÁÀšÀE ÒÏã1)1œCx¤V“Z;nZÓ@Kiª“µKª-ÑþøùVíQ½JF+GP9³-ŒQ惘ùûÇ8q530|T!¯Î™t:”"‰q‘7}Är„‚§Ô§<«ü¢PäñZMÀ žAwoΤZ±ë`6Ѧº×iõ:²ã¶¼ã¥ŒÚ¨v`} Æ.;˜¹N¬‰™äeâ”à¤k§;¨±±/Š0×ð/t>K7÷X¬~Þao¡Ù¢)?eæõ#®ÆL" “02”E+}×!“ûH@˜ŠøFªžß zvý„Ìkò2•¬êí,»ðLY÷Õœ\‡`/ÑKÇ!|ì²jOÏÖNñMŒ¹ÀRv—1\ú*9¡Þ/† ßµ¤¯f”'™ôõ€g²®…%ÚµåÊ\vç>Þ|™ª/‡ÜÀf1å°EÁTÇâ"päù’"¯Ä±ÞúéݼO¿Ií± ˜Ÿ‚¡o|*¾û3‰XeZPrÚÊnsZp°¼Ô¬ršváõi:ؾR\i/²ªµo<»ó§ÀK úíóñ1üÍÛùÛ'R>y«ÀþMÿïv·»}v͹W•»ý+Ú—£í¨Ò1¨ˆ¼®õVûru&'^#Èg¤É±/tbA#q–›ø–5<ÙH\[ÕG8Fp¯3é÷!º¦{*rRªHÁLHoýÏLõ²‹ç‘Á‹íwÆ´Ö„²Ä†RZúü{j伃oT)EXÚƒ¨½o]dB—š­·Ñ1GšîA¤˜ãAèÇ@¤È¼BÇ7,ÇQ¯@aUU,2mIÜ&Û0ƒ‡ƒSiDRò%Ý"Ù²0’VU¤J¥üyŠÈW‘Rzazì6É·Ç3ŽŸ©¸ZŠØ‰]ŒšŒÓz·c~ç5gÍ’Üç ž³Ä3Çâ©o°¬Ët²S 2·9Z¯] à´œ×æ’ÒëÞUKˆùYYªB)‰Áš²˜G½ê:ÚëìkiâËŠ-¢­AÑk’êþQÞäÒ´°bA++Gó-Æày<=o[¾L(o^øŠ+Ï[à'ˆ{ÑˆÒ òk~|¦0c,µ5«³"¼žÆÃ&nã@\§"}Q.ô—]ê@<«CÖâΫǷØs½”%¶×UP.æÿ^ðW˜[$£=Ù÷bJ²N.sEÀßeRÜÉ6b&דî¿Í­Rékªá‹nø,Ê€’@fJ$mÎ*ÀÃÕ½,úW†Á‚°ý«ÈãG¤üùÖC„»¤Ö'iü(×ÅÙiÅ€ó¤YþMØ }ße‹-×JDçqÌ·mKè÷oÎÄE—Œãú—~ÔUëïžl‘DÃ?½lÞe\†vîv·»ÝíWÉÝîö‡·¯Íis`Z¿\gæ¹2ØÉUŒÓ4Ûê9U(Bd!ÝC4"l.#*uˆtËËìÌgÅ ›8ÏEŠ¢¾H˜ï•ž· ©›i6…\ŠïeQЧeçâk3^ç#s’Ù ³ªK9øoƒF‘©tŒRÕ§ ÍnX˜ŠUªl̦¥]0z&ƒú•^rQ{YÃ=¢’îGp¢èŠ„>ȦªT€‰ãNY}…@fîÉB £ k ÂJ©"¿DP¤@J)­ì ŽÓˆv†d°†„[&+ÑnÎ`ñvÁ'sEò„©ÍIáÚyž{v³Úü[5-#AÜFå]/l±=`œž‡5˾ÿS+ÅkÝn7l‹ ÿL¿Ó˜Ÿ§×9&¦NÛ÷±UGç™ú)N¥—z%º538¹àŒƒ®:Ïyfˆ®Oêþê)íÖIeNI-(‹KÔ(šÔž'c#Ÿ)ʆj‚É ³›š+sÚEi|b¯½A3TK÷BrË Ä3“kØ8[Dx„ìm /E5K:`âjû*FsÅð†F¸°ï§[¨yÂõôÓ|SÃzhÏTƒðÈâ[ˆ“—?y¾œ.Õ3ÉÙ]ž_Þ…J8yq¡ ‡3——] ™>Ø•~Ûƒ¿?þ,úëNøF à=ÂWïôFq²Ú`óXpù `ßË·•$ÚVÂíļò‡\/’ž¶KÃi±Bró€‘-wßk´+䎬™³xºÉþÝîv·»ÝínÚ×<ôºä -f'äÊõ^Ìø‡=èãW`JÏ>®³Œl÷¢Ì~ƒÿÎo€å´Ñ”¥ol'¨„â¢Ü£("ƒÐUyv± ÖvÍcœéÿ×U*”)Ôê”v¹Î{ßhè9mõôPʦTÎ'^Њ8JI˜e[c5Ú OÔ]jhÈÂø7’8—Ÿ…¦^:MÃ)öœ2¨T«‡ëÓ×i~øÊ¨œ3‡(ÌŒF$§¡.>qÆY_] çyn£»A¥9“j›L>ˬëx¢¢3Ü5´ÿ¶9}9ƪk`|A0ÊT‹); cöQ™Xoõd¼÷ïz(:ÿ½F1Œ10Q~k¿‹&§¦ß—ˆ§ÕÙ›ïDÕ#ÎY!á­’ùšlñk”I)`yĬrXÇœ®b;ä+ÆuÌ7‰³Öµ2fxX–¨­æ^ŸË Æí´¼øMü†;ëUÛ‚7””9×R¬Qæf¸^w³Ü¼4Åì‡wüîbíD½¦ŒýyxýY­b o€×/Ï/èdú½”7†¾ã×ú”ä¥ur¿ Šx™>Ñ®0ÁRÞH:ãnôiÍÓåîÂ^¤îÏßàÚ./õ3¾?ßÞ\ƘBÈGm ~báý–mÈ[ï3fµæ¼l>·»Ýínw»Û£}Ñ"ûX¦ P°&cÀ³-”w†ÑÛKÞ”só´Áq¶µ}R~„áZÕ¥ë tumöH¢ßUÚãàÅΔjWçŒO—b4.Cã ÙˆÛW£Þè ªŠù®ñ ñ1‰ÆvªÔ@w÷D´ 4 »ÍâÁ란µµ¤·?š|^èüh+ø3ðý,@ÛI-(ÆÆ±LHÊ*R›"PrGôú9ɰPN§µÊ³Ú>ìcTÃ^Õa€ oÒu¾»=µœ‘®ºÈ ºa ^:tãÊiÄeWq¡ t%ko†i‹*[WÎyGø"§"•d_(*bêa¾:~k4I¿Ñ>°£#¦„ÑÂãòdðØà‡×Å*MUh)àÿÇUEÖ¨¢›éS3DimÑžó颋YiÊ ÜCÉD¸9d®Ïÿ:†J+¿æ ]lÉv>aaœ}…qñV]±¤\=µ¬· »³È¦¼üµašoà7€Ìº™éý òyÙšGs¹¦yµ«õíSÎS¿—â/AŠ·³µ/ú›ãµÏ\Ë+XpíÔ½ÿñó@Lpcº‚Ñ7†(/3A®§Æ>wõ,náòÈßn!åeCÿÏ€p–™» öðÊG½Aßž?AQOUJöW…|¾%D±BŒP;aL©·‘‰¡:¬÷[¡kI_Ì:ä`œ'èq%¯kODi¼Ôò5 OÀSHͽ¹¸x›M¼Î1a ?p‘.~ÌÒañX¯ˆâ¸Ë‰ÃŔ٠Tõv>ïÌl¬dô×å’n_Öç²,xiØh)Îo0J¼u)ïÓ¾{¡zIÿ›1/>жÊíô+Ö4„íÒO£= ^\lÖï¸÷ ôÒµˆ~KpuìýÓÌ÷cú4xëg®ïEåÓóŽ×Làù“Oê&þw»ÛÝîv·»Ùö¥•î%d k0d²®+X¦ÏH°‡ŸšdÞ1œIô6´æ,Ïhà ?žî<×`*Á¼Ù7lRx¢›ŸõEGô2#j.ÁU*åAy éÆ@§·×)—?”d »)né’´ÀˆŽ°®î§b?Ms¨hCãrºidnÎ9Ä|ÈE>xð³=Z©œ.ÐÓ³ZZ‰j‹Ô*åðÝU¼›4š×y°YR³ˆ½lÒð£ÀbTTíöIƒMQ¥ÖVâ0xÓP^ªlQ2Œ{ÀF†HTµÌ)ºp—CZ+ž¤) O9©÷—ˆçªrÈ(ÓÀ¸I'^]©ÆÜå’õ—Ò„DQÜŠ™ QzáòùLYä`G %½ºX±„ðëLô WÉ…þº¸\䎡[dÖÓPì:oõ÷‘‘ëj½.¦¤Ìˆh"¹<'ÙoBGJ7÷vrê0]dÊbôâ)ÖÓyÿÀ >7ÝR‘Øz‹ÎåòHFXâSÆ©Œrš.}ﵤZÌr•bÉ ªm9\M’¬kV‹Ì©1ï´a"®lCéÙ¤ bøÓxâxÃõÄüíq»²¥A¡¥·ç*N{êÖºÎOÁ•­Èþ«¸”£A]9•tµKn5ªÓôUí2£Ç¤ß ¨²¿µF@6Çÿ”*ByR¤Nâ\Ñ·¡*Êô”f\L•ô­åDKò¨EZ 3P…©’?ÎØÌ²U"Á| 6}\'@ß»åqh]i÷…ƒBÒdfrèm„t9 ãÓò„TJ¡°5Úãrí…ƒÝÃêìCZpâxóKG ÕTÔOpÂAq9¼)/Àî8ç¤ÀøÖÁè$«”oø±…5å}zìèIÈŸè™æ÷k IDATÌ¢mQS ïÔ`e%Çþñ,;µpVº$áñî°;Ôĉù¬$òuH’a¹FVWm†e¤BÚZ9ë×UÆ ùqꃞ]²*¿‡†-0àÅp(þUB.ÞÅ–CE›Mt –&Ϫ°†/¦O2¡‹càå"`’œ F•L¼‡›àßÖЕa,å òôÎi”Êâ-C•Xš‰$tçÃ6#”®´˜vF#‹ Âó5í§AÌ)¬¼,%oÆmˆãÒÙx ³âTËÚò‰‡?¢äHßÿØÎ;m±*£Á}rÍ=÷WEWuÇ-œ•,åÅ\øl“mÎÊŽUdkã¢!«Y†W² ~‚Ý®BVöezQò•gÄ“Ý_˜éžmñs˜‰€d3ŽSâãm¹ê×[ò;xk}ûQtüÁÁˆ×ž¿ÿ]}üKùý1q·»Ýínÿ–ö÷œîöŸl_€';Bk![ì)]§cÚþЧNTƒ‘'?1ÀhsdBª,¬t8a(ÝÞ  ¸¨ËÔ‚^t]ÃZ¤bjŰq…´œð½@ä!|4„H)ý²K·íÕ,f˜sv‰!Ý]8~¾6ñ™‘GÓßw¢úÁPDêdgpô‡- Ei¨ÔÃuX(‘y ª$8x½Ž=ˆ÷\&pÕ™cÜv—…:tÆì~ÊS5‹ Ôu”©ˆ3ø„™›ÿ8èÿÑ{¿Ô°qW¶¨Ä¤Ç¿ „EP&ñ™¢OB)O¥éTñdƒ2"ìAâ<¢•ÉdœÅãpžç¶«Þ+à/À*÷Mkˆm³¡ó÷cŸõdHð<¥ÿ]F! M`Ll‚£¯3Àް¤7YOÊCS¾“dÓêq \LÕQj*ë }ࣃÓ{‰Û9TÅMM¿§˜š×îaù;¤*Ž$ý&ïól[÷æV¤™£{‹¤)"Ï^@@­XÂÌQg( M<Úó­h±™Z…O©¿O‘g;§Í"̱8,Q|šr9-öu 3a‘¿ç²b¯FÉ=u ÑY¡ÁmÀ Úl5qW7#Úvb| ¹Py¯.¾¢±¤ÇR£ÝðH’h¢˜‡Ëõ¥-Ç1hCË(iï»~9¬•Œ»LJ¸)½3vSÓVÛl\U±° 4áºñSÓ×ÔµE-³¬Ùãè÷Bµ SQðÃÎ2‘Ä¡tÍS–’ÊVÑ‹XhéC•°,ÈÖAæõè‘vT†‘H‚èÓ½D 1ƒto`ǽlTúNÿ‰l¶kÉæf{£v•ãaùÂýÜeC.Ç å|‹µ|l! ²(¯‘ÄàÊmW—ñ]³æA,^+¶ùS°0¾ý»|uœŒ¿¿ýþ£ÑôK“ŠÔó¾ÛÝþ•úž€ÿö'Àû!ÿ—Ú—Tå ¨´\å\ Q1){g8¥ÿò2Aœ(4Ãb«œÚ\-–Ùy›™Á€¶<#†J¾ö'ãi !m¹kô˜(œ°qލ‰X‚ÖÒl‹ˆÈSäyÄD ›¦”V@+´íЧÂ>l1G×–ñj$JÊcú H»ŽüYÊç'¹özðH*ÝcsQ§Ä gj3l‚AåF‡‹ß#&QG"0Ô-R(-vR;â1é€Å\âH‹âqXH‹ë‰FŠ!0QŠ–òüå¯&ET«È/©OáX¨½ÿ*xpgÅâòÒÎ-͛ûðp6ŸzªX'` …øÄÉê2(Ó’ôˆ+°I÷Î æW|ÅI&i] ¡!ã!N”^I•Ä75\Bœø3ó®Ý«s 3SSÁ‘‹§3G9¬ª9“î}Žz‘,ÔX £c¡ü~­ ¸æ/ŽV˜'ßÌX`Qæ“5]†‰}Ë14¸IÕ«¹{šzUtVŸéÛÇç¥ÊÒ_1š¦À¹=gIë‰ÎÚ¸Õàê+p*¢BÔ+o†õáÌ6»_@÷3T¿P’GäøJjÏ ;ži÷¯¥–Ï‘ËxsÁ.üÝ @§qñ`щî.vÍÁ¢œ¨Hùæ‰PþXôï ûâ@ЋCöæ"·`Žæm•ˆ­§¯àÅÙŽ4sðü¾¤M¿¨#0u„ß9qÒß…{q¿ŽŠ×?Ék×øþµ«®Í‰ÏL2^½GÈ[—õžÁÌke·‘ϸ5pm ž–_oЇþ>BÅŸo ¼ßÙÄݯÝo y·»ýNùž}ãNœÛåðnwûfû2ùãJËE‚'­óîsÛÙeJ‹Õ¢©+ÿ7˜¤TlvCŽŸI&éPæ*fw ­Zsá - èö‘!8¡6§þl×Á"m· q—ÚnŸ”¿ª”*)Tdj½¯®¿Piní‹j£ÌÇ!¤@žö4º´J“0*2ZÊ龸ÇÔ6lªx‰®%éEÇ?¤eÙö¬êQ͊ÔRGÞnõˆ“]Õº’ý¢2X‡²=±CÅuDºÂŒy¯Ö+wy  ¼`J¯ ÿþŸÂ*Ï*ONtͤԴèOP¸ðÖ¶wàî$±AÿÉ_½”×/ÂŽS¸¶®Èª¿¡–³×25*ʨÁ®Øäý1C«rÕž05ÇIÏÀ­ Ž Ýæù19JÕ‹,VžKƒ–ÏRî#ZS‹Ö—•Ž6ªpæ1/j‹<:±ºRäYf¬N[¼P÷R_%Žàè4*+á»(¹ÑÃQD~“9H»îP9$i¤aZEÀ,AÈÍ!’±¥êXÏ÷+œÑÊ2krç>ª?~-S_•󼨶+4‚Df–.¹*Uf.©:ìè1 _TW˜ÄÞL0Édgσ,r™ÏÎBÄ’íúPTAÊæ.B ï.BÙ{\½ S—Äm6£É4ÉL o“ÕnSÏÖK]EsGXõ ×p“'Ôz›wµ$èúéá¼ ècéU¹v¾ó…i5ÕH‚9²X°¸ªßåtýÒ|¯0:?D—ùãòÏ+á=ðÃß_)û;²¥wÝín¿¾Ûï±(â~ÎwûPûšÈµ3_'ä2 í­…Tê8çP»Díû‹.r¹åÂÿ“MÈ[2SM÷ÕÓëO•RdJôúÂå1%^Õ™ÿ- ã£es3SœRz`d"—‘E;zó‰L*{´Ãô*¨þ·Ô¹®í£¿]‹ëÐNÂþ¥µ…°þdƒÛE+(î`ûÕ$çhƒ„Œ–¥t8ÀªØ³(YŽ‹ì¹üEóÜ>ÈÛU…Wåɘ)1ødU¡––GHÆOˆ6,çg„u£ù·¡~+2íÔöíÊÎdƒuk)ô¥B-tP®¯\u>9íµEŒ *E¹ªö™R8—ÄYí4Ié–2Ö‰¸JV®=i—fØ«õㇾ'Å­ðÊ vQƒ­æÃM‹Á:[’ µ(¡ áÍ,^uéRù'®Ú1E…Ä( 'j÷EÌÒ%Ã+~ÆÆàÁdâFíjA{é´â]Rη<.ðv,ܬö”.w㊚JäÁÖc\†2À‚ðþ-G\ÿ”3°óšø ý²ãµofvÀyCåä¾pí³Ä¬øÁøRPñ£U­ùø³ïå¾Ú»Ýínw»ÛÝ~óö%ÊFµjjö_ºJ@¿Œt6çèº`Ö†1~6çØpðcP2€“ëQÙ…^<=åD# ;»Åã¯J<\ -šØ\ÆÎ;f’z鎫ª£Eô©µ]^iȾRe:Ë´ØI²•Rʬn³èÊ@µ™óôì}ö‹•á€Ë2–Lä}|¸v}Ôpg¥ù«é?Ì!vjvÔÕª–-RYÌ#p\RUÒFÑäzùÔ”™FBäº5µGVLA™*ÿbÅ~–N¶ÁcYç·R¬Ä­Z~¦ÆtvN庲œWKu0ó)E븂Î)>=LFoUíÁ F#öަÏj—Ç£‘¡Áå²&CÙ izo¥é?V¤„c2üίÙbâ‹à¸ ªîGÏ—¡Lu\RUEgy·ˆ”Jœ<|5¤ jà’*]—¬3ÜÃ³ä˜ ‡Ùµ-%IÕ,ÌðD\ yö¦Ú±ÌÂ%)c- cW6ÄZ™¨û„®µp‹¾1VG‡ÆL¿i%†|m ü|Ê$ØPªÀOšLl™ïþ.ˆNB“3£Qú£ªµ±2À”Š2o5&ÅÖ„lqª SÅäË’Z¨¾qk)Ñ…sêD:É .÷pÏRW£ZŠ/Ðì~ü|-sÊ+@9ú­*ƒ£h ´Pvú5*]²¬ja®,éžôù¹ xÁ›Ö2Tïøœwýv€£ÀVúIl8mFV0aqº5³:9-maЧÚ'«s½@­óö|5É5Täd|¦q7lÁŸpjÐ!ú¥Ük‚ S _{„ ÚÇš®ì ©¬-DEî30šË¹dŒbf7™´ð¹\ã<»9¾±ŠhÆQ±¢:È%¤RKÉ —àÎ~iãNŸª-!,’. Ã|Ý=2$pHÜ…Cæøâ[ ¨$hf:)!®aVêý¬)€³Éü{¶ÌÓžWJSViõ¶MÖ„·kP²¼œKýÉ ø;i÷…¸rxá:wU¼pxixrðŸóïŸ W„Êyy<ßôÿnw»Û¿¬AË»Ýííö5ÆTÜGk_Áœã¬UÂyÞåÑ£›Í!­´ ’›¬ªP@4QhŽFˆÙµØšÉfÏóbó§g’iH;•ëM×Kƒé«Äv,ô¯'Í Ô[#Œ‘}Èm|gÐJUˆ Eft%` r©E nVs0>îåëŒ)º/ÓçðSCË VhùE¸°*+¬í'œÃ ô^‹“CÑv•Ê¿hž…ß’6ÎÁ)…Å2¢ƒ¬š›­Í yf[ÛÙa¤l†ýƒ>N3š4.—f'ˆÓW%Œîùø"ðÁç¯(\‹}i ;â‰:8ÆJ€›^ØÖ~™ô…Õt3¼g¢,TÐ6Õef>aÍ}eÕQX[ˆ{¸Í>Ë›‚Å.Ÿ‘‡ÇWsU å) î£ ŽøJ¥ µ²ÿNRÿhh•Ý D·VCÐu„Jf’LmgNkÔ“€ö§e¯Üé–ÊÀÚoœÉCL®Q^vv'ÇTZJ•½%ýKx.?.(ÎC­iís7 Ã¾Åš•Kˆ0ѵO;Cu‘÷avú°Á’Ì#^1é=ELÇÃwÓjÄ«RÅ4?±è¯!Mü] À„N%Q41 lEÛ7`=‘Iþ²5ÙÞØI”Âëž×Ü [9Iþ}Y]Ä 0ëÍ@'Ì3‘Wàuîʘ7ĺïi2í<:½}ž л°„ ] ¼òl?œÄ ·/©Ôäx)ãŽ0Ìâe#—Àò®ã°1Ôì9®±S©VþlŸ…Xñêèg˜›?É•+¾ÄWsÐE¬¹oA“W¯ßÊß‹@\ÏtÿfÃ÷™?p5|ñy<Þs·»Ýín¿qûÛÖ¹»˜ê?Ò¾4ï;0N:‹¯@wÎ…¤±^t’9\ìÊŽr•°A·‰òÀÉÙÆaY ÐÛž¶ä;˜± U"ær*"LºƒbwÍ­b3Ç-‚t‡<2œÆu@}SûɪBEÉÖÓèÚ›lzš¾ÂkRnÀùµ;  X‡[ö°»Y±tƒþa%ËÍ[¤uösç7§ÚD{¾:Pf¥¥¥ÒÚåNÁæˆ^ˆ•ã§Ž.ÀÔ—P=,m—ŒWF€B-\ 'M@¢Rê¡Ï¤fÌ|Ä<³Ñ• (Ù÷Щ‹rbvmZŒÌÉ"©í˜*óãCªrJó!'H =²©bsRIå´w“PO:"?X¶éV程bnËgª•y™k°Î'8å}2æ%X«#,BÀ—\°<Ìç(Vª X¿œl‚½†zïW>¥~²ŽÉ8BךÌ" ðgN ªrÍ„Ã}wx@‚…UÞ*c½×Š!åNîA8ëtožæŒs%¦œ9Bm–ükµ^…øâØ­a#àÆ- `ž´úhÄJÀ$¬Ï9郟feKM†NÉTüém¦yþ¸ ¥0Úe!ÿ±—“§!‹÷\QÚ¤JVªYÛ/rÒ@s+4ªÄãè5‹@Xoã.ú¼ß>E´ymÿý°aóÒ9 §õÍSÛ ¾5®ô-¯ ã|ï1á7|ø¦Hܦ£ð¡½ÛÝîv·A»IüÝ~¬}™D?+‹œ¢@ˆÍÑËJ§¥¦Ò?¯Šq‰ÄH¤Ñ2-KÒ“kE&Zç] àŠ~¨óéh3‹U^Z# “Ù-3››=3Ê{Ñ3®ÎâS€YóÌ´E-Áq)V K§`§ÑÑKoy[Ÿáüý:Æ91öªsRèõVôl˜RL*ȳHéÚ_Ç -OEcc8 f<Ì%q«ßÚ>¤¨û‚I¸†“PS²WP’5:EÌÚˆ9•Z‘Q¯Ñ3ˆ²T\ží‰ä9æh~–íÒ-«A–ÈBÆÙžfJ×Y+k²‹DB/݃Èe.R¯]QÓVÓØñU…fl`ϘßZSÝÍ•ÌÕ [åÖGåCwÙ³¬ù/‡r¥^ô~ˆÕoþi¤ÐÜ@`¿€À÷¶lG²^ùiiÚi2¶´úœ¦?pšsÊå/åw¡Œ«D¾Â 6EsJôq=Ï{hÓ?‹ÉËÓž»¦oŽ“]2;XZ¼ñ’¦Kòšp‹›Ú¬øì¥ ½••Ë ê481Àø@{1CW>ït<\ ðÕþø ¿ìvÎ+ßo^Íö[ñÈ«Ä7<¾1 øßèÞ»Ýínwûò»ý»Û× •Ç©µôs»Îk6Ûb(ê-o…d=‘ckq³0á`Lc3…Fêà€PúÈÃÆÆÓ%ÌÄ.$g ¢®(gT#ɪXgãeP.š¶gÿÓï,"u>f»˜ÇD¢Å в¦@ÛHj9 mÔLŸš/ǯ×&¾Íu§Sš„îT³PyñZÉG=&¸Çðªeµ‹ØHO+'LˆBç˜v‚d@ÈŽŽšd…#×–´cúÀÆÏìɈÔòà²'Õ'X›s®«* ;ï!çVX“}-Ê1»”!*–¢¢*U‰±Ð÷íó ß?6ÿ·ôYÀpŒáÂ&4‹ÑžiM¤0–âå;$d¡’™Ø½µŸ¥HG`„^а4WŒæpÔñPœnU²ã-®I¸¥Åå˜"û-%¼ªGÜSÀàWÂ1:á´5œY |J¬6 Á!Â’\æ1æñ4ÄYÖöª¢%ÂáVp,ÉbV3B3©WêóÎ%8†ô3‰ ›é~‰Ž,˜¶H‚Iò¯Yö3´-I-¢0÷‚¨¤Â“.~éÖ8¨S½ÁÍkÛ2.é®ÃŽ+ÄÕ# 2yväY®4re\f›´»)^<:|CÑ{“ ŠÛÆµÏæpÓ[2¾LÒáwý,µH§dŽóoãL^;½®BóÂ'ÀÑSX·¿6¤=¡i÷«¢/±äŽë>æz¦è ˜Kóý„eÚHçGôô{è=ó·ßw¿.ìǾË#®[5¼Šž¿ ¯Ï Ë®Â6‚Áå¾:-&@¶ÛHŸõM­îv·»ÝíÝÇÝþkíKÊ´ÿ…Õ¿Öï]ZyåmÎÏ=ѲƗò V’~¸ÚŠvzTá„—½á ÙAhHÕ;¬¯`>é^AxéÎ\Ûÿ*{XÊc„ø£ÊME3ÄK@ij* ðèÉê¹ ”dPB· $A”ÚFÕÆ³ú`âJ ":Ôðàöœ¼+n¶)ŠÍ“`(Ñxê™°E#ï{üßfvZÚïÚ G¦ÿ£ëœ4»`›¾Z´4Š˜¼iº\PI¥KOçRLé˜}f‹Å±ªÃ»…v oRç¢<¹-vJйl±•#×b’Iy臩˜Ô½%†‹¦ÿ1¨€ 0F-¢Ÿ»>mn{tÎÒ\RXÊÕ¿¦x€EXá˜ló»É„Ü9§Q6<é£Ö•Jy©Ön.ò‹Bʃò8dsÐsܰT’\Ð ]]f±ÌJ¸XƒV~³b;À!9ÅgØÜÿùcÎÇÛ]ÿ†]Â3bsf¾†‰ IDAT;a¤­ä¼É@ÛaFËð/¥Åñ‰Ÿ|Ÿ´–ÞĨLïˆÑ™æ¥ÌþöDø@'Îiö ¢rÿ-p 2T:uZ`‡ð+ª“‡‚†wð†½mªvÞ<"¹•nL‚\.Ö ä`JuÆ$,Éšv†™¾ªì&.Äo©äO!ƒÄNßÏ-¤ë»=éy]Àd ~²ÌKX<ëç[C>d¾,ì d|ñ‹‘é÷5V¶×Þä‚€^ȿ֘0i²¤xaŸ®_ N©‘ø\}?¢ðéåâÏ>ø¥X~Ý'±ò•;¾ˆéñ‰+áëóß.ûz¯+V¸©Õ!ïv·»ÝínŸl_,R«TEJU¬ V_%(ùJ—CÑuß̱plÈ`dU^R3wÇm.ÏNgî¿÷²°¸¶KÖ*á…w$ŸÅ…áFœÂ€VÂAƒ¼ìµäÔOõuǟקTʃMf„kN6Ã4 P¥_F ’¬[-µ¡%ì‡Y«§$!ÛÐa 9uxyhi)¥ï“j£ •s³ì»@žUþ¯Êä«H•_*òèž ,Ó2WÇÆÕ¨0g mFjMcEºø œZ5\s ½£ÈòyvÆ7ÒóÓd7×!§;oÒÖlÏ;y¦£-˜g•Ý­ì>Ç|qŽúcu­R`T7»;¢eêÅ$Õø–³ ‰ÄHsÑe†o 'z'šþÌd‹Ûµ-0UŒ–”çSŠÈ£ÿn…`îv·»ýí^;ÿ›íë`” úÀn”5}P œÐYô¶ÛŠAóȳ¦9™ÞjÏÕçy)“Göú÷i\ IÀ™Òe‹„¹$‹¸´Jõ“ÆVËô^8QlE7¶;8iqß+M_žV¨úÀ@‡“íS„]­»Rž2ýx«Ø|çÌFr^X¿G|Vu¸ÂVùÈ#b1±éÈ.ÆYwù¾Wú í/kw=RòÑ´¡ˆõámãf6œå¸Ô§üúÕ®ÿQ¥| ¾D ô+Íë!Ž1gƒ µ»x¨'K/Ò²bjѤ“Vz^C»#6sLRä!ò|¶|m÷ÔÀ”îr§äåC ¬Ì—鿬Zh‚?Ø¢6þÝ*Pkãx͸;SšÃi(²<`gÎTQ½ H'®ghwRân¦è¢%'Éå’ë©Äš@ŸÆKN²\â_œÜ—¡‚ØÀrKáã2+gÿšB‚v¼{…Ų†ün˜Åidiö‚0ÍÇ:9ÆdéÓÔrUáa1»2mƒËHJo“âîm¢=BôËý$=ÖhZ †KúÜ r"j)ÀÙz’¾bÀÝ%‹¨4‚À^ù‰Óûiõ³”›5™©¯W‰@ÆìL-ej¹à#!A¾&5ÝYU\>ŠÅ”òä}¬ív^6áùRyñÍèW•Þ‘ùdQ'¤7Hsy´ú{¹t¶‡'“±ñbõžÈþ°6~èÃ~7|W¶óQúv$`SØrÝHùß`>(]u哯‰ÂÝí·k7÷¿ÛÝîv·¢}ñÔ“ìévÏA59tà:Ò*ûí:ê95ebZýC´­h8—¡;„Dü$9ý¹Ä[­ADÿçË—W¡‘Fö™X, Ñ”DV^:‡ë|rrÉyöo©”_“D%‘kOßÁTJƒUL—°ŒTVxhkT‘n`H-Ji»_œl½´ðÃ)Š? ÍPÁ ­öØ:¤ñùëÿOðÿŠ<Ž„ýÿ™†À¤QĂӉgTힺÒr±=UûXE,N’«clºv»TyÕ ½.Ä+ê@¥R¥!3Ï ÞAÃÅÑV¡ÈÔ@lqí'@&¹÷Ž€©€I #7U}c]1’î)³cš{{1Ùp£ù€ ºé¤®¶a²ª ÌJi³u†¯FùOluj¹”ca)¦ÄJRëQå +/LÓ»Eœ›(•?¼dnð4”£†I2?‰pžÆ´n,†%L,Ìòú¦Ÿ—%Â1*7:t äž1”îº7λìPíuT(«' û’‹ùÌ4z  *D» ÷ž«¢L\• ˆJÔ)“Šjƒ™ô½0j]€ðrˆ‰r Rí­° ^ ¸ –´£~Y¼…0wì"ƒF¹´Ûgw¡<[²V.ïDLá½(Œgï"•K¾D•à""R‚‹ö y[å/”´Ò\P…’|âÇ~KÕ5®,!Úg ³ýX6ö¥z0PZí¤…Ó瞺í“‘¹ì•„Çùtûü`Åo_Ù³ë~WýÕ¯*. "}ÃàäSãá–¾¿8Hx¹#ðcòYwû¹öjÀæ®óø3òýÐîv·ß°}ÕjìéXC?Z×ôd¥}J;*–¦¹³.TâêLù¤Ò‘W‡vdø^B"áh òƒ±¦QpÃDVEè[Ÿ"†#È}qŒCEµ‰ÞÎtîøób¿e>š:C(""Ï"OÊ£ôDuØã1ˆ:Ï´@±']0ìyaÄè]ùEóÑÉé×itžV¿¡©CQ¤bÚÿ&Â)á˜Íô¬4@ð¿R ¿þÂÿUù_ÊãWƒþÄf:­W£nô×Ù®¼*¡SI£ƒA–½‰û;$1Ú\c. +`è›Êì15k€d…´ð@Ö +khd¯` ¥õ÷h ^„4áa³\3™i`"9ˆ÷wf€EXóäGirYh¼Æ©×eÆL24v\p\@Â…?É)£$eZï6[—Q³R”‘µ(7(G ea0[`Äô>œc$Šq…rg Û~²øZ¤k2…‹°IôÌF”?0± þ«>aŸalÀ2)Z©(Q5R:ê#–Ü»XaºPE7Ð/ÈuÚœhó€Ì Û9QÃúÁÀÅ€]βŠ=kG\’±ö6Ïà 4/5­·âé‹W×€‘S¿Jh+`v÷>NDQ2ËóÐ6tjþæZ@e8ÏËbUœûp¨ ^½^†ç¿¾…Ÿ)×M[¯‚žW×c6矄Ü)‡o ¨Í3úTœã3OòÏl¸GÁ:¤|SÆ?” ¿4”?èˆ~·âißînwûÝÚ×Û“ßií^ÓS¢(lÃ-]TùãgK£Ÿ AÀ—J ßïÎGæ^¿È‚–?è ØŠ‡C—Çd`!#³zi¹¼ï™¾»uuçgÛù{ ZÒ¦«‡g¯H-ò¥nd‚9(Ík­¹8ì(e¨h|PJäqk,gèJº¡ˆTìDY¼œÎ€¼T2/°ö²ÚÜϘ@ÿlá’jû =(ó×—<|Vü%ò¿IùÕÝ€T#Ž@K®¥{&SÉ€IÓU‰ÿŒ‰0ÝHd¦}‚¹’;‚ ëQÜ¢wcø!P›”¨º¿WÅÉá›72gD'—ѱæêÁ05a"ÇŸ"ׄY«Ú#ŽQ\RLÙ8ãO¦$©rk”¡ÿ®f IhJÄx '…ز+§Xí VèÙu²{#'Ý(I0WŒjõ{3ƒé~µ—…æÏ"óýó®à€S©+ž "ç(#î=H³UK§lú¶Êö“_€'ëÐ%Ml\|ߥŸþ6㎚þ/ »þ«Ï™C}î]ð~YµÒ|…û“˜Ÿ æøMÅn.aâ¥Û—ÏJw|ñÄ¡Wº”מÑK%øÛîòÏiÄx¾ÀÞ òOâÁî™àï]"îöNñ»Ýín¿CûÒúæâ ¼¦KbÉ ïïå¢è$b.‘ÝH棜=×*m‡:M²Ì_yë&Ùó°‹äÄX¤Í¦·ytA'Ùï7ʘv… ]é˜DïV^s^6¦·§³ÖŽÐÇ¡~L-"x6?€ñè„_Ôe¤ü”ŽYT•ôŠù·Zúi j*Îr¤‹xñqãî82R£` ü]Ö¦Rj5ªPé«LÒÊDARýñKþW¤þþzðÿ )Iý?©O©"µ Ù’ñ›Pía­¨ã4j,êÔè©ý^9J;¢*ãSNl—Dl€zF6šô“ 9xs- çd¸Ú"Óó ­8$²ˆ Ø“wÌ¥Õ‡ù„²)݉UXƒ´Ñ^Ye-Q:TÓÐyþ¬ÏÁ§]Óè 6w§Ç,L‡lטDë õ7zPG„ UõEŠ”c0Ôv­=µ¿pæ‰y´>o|eÒŠ¥GÚC®Æz¡J›mXZ0Ç‚ƒä¢ë pµ•gÇ Ð´tX:)|ãO«¾íø¡ø‘#™úÊIÆ+«A…K7_}‚ŸN ’¡~xÅ=uÑò `oY^íVö‘ÁÙWíx7^Vh,Ýc–!¬WßæååÂ$óJ°—PË]’¿o=*|õÒŠºrZ(QÃ`—õO—h©‘ŸÌø†rÆšwµüðÙî%6c7&žÛîÁí*˜g$$!†iâ´›ð´Þ0Ç‘9¶a1%å›1“èd¬sɸñ†®\„™2ézÂÅ\#ƒFäW;'_{`e0˜÷È\b/\j .²€­ÊÙpNŽ=´6ðÆËK`cWê#.ý4’Gln:€µ©âé;Àäb_ãV‘§Q3›Ê`v†š X›°•Þ'Vë“§EÍÃ2©_²ÞÞ^b4*æUž,,0“þN0pELˆËN$+!Ä‹dù ¯9Í¿‚lÖOo]ÔÉÚš$Ę_áéVS$ ûa¼y>^ô—¾ðL_M_ù aJGÆw"¶Üí´W85­TF6<^Øý¿TñMùÍöìã0߸ª·X+ÖƒëƒëÝÆ›ùÒRFø:­þÏÇ^î€ï“Ü|ù÷yö/-’w»ÛÝîv·k_ƒþªâýl>/i lÅÈÞÓè”g*¢ˆÑ‘Ÿ²ÔÙÂÙú¡Ë²Ó^’Éz®–Ç!¥–Ž5•Æ$bT¹B„1ævK1*F•JOI—¹%VY&¯ßäV×@o-a„’FL—Å@µ~Bôø5ÚMDZ¶¶_)UJ·U8¼•ŸeÊPÐ%ö¢[ Ó:ŠÈSžl=¾±ˆ<Úÿ=d‚X[…á‚[U‘Aµ#Þ­ÚÕ”ëU (_”ÿWä ùk8ñªÕ!=ôèçùj8õð“9ìȆ-¸L­v ; ?ö˜’)ÇØ«”gmYÞf¦GVrw —7-†/ovlìHJ–׈çÀ |=~`I-!± ≵J²­¹Ñ‰À}ÐõÎщü!KW¬È•ô9B˜Jr³¯¥/wÍuMÓ€(•ͯL}ªÇÄR饥[°<Ù(?ûšv” °OØc QäyP×§|±©Z={(Èã!R1ÍÆ÷ÁŒEMCÎ0ŒsÁm }}Ç]{¥Q_?Í’É™9žÎ#*¹0ꑦŸ& >†ON.²;chÇ,êh„mÊ„ÑÚ)džHVPK–Ú© ×PÆZ@±¯i>€‰=©^$½>Œ¯GÈ˃ôð¦.cÒá1n¬­‚Ê›yŽIj5ÁÀtžÙàøš0H®þáÝnEÅf"À¥ÇëX Dé|ûá& À(¯Ì²ÿ,/X쨸~J‡ùõq¶úy›è—ÈΕªµ)=ǸöÌ|àÝ'o£¿ãgvn+ò=IÌ.€§¸ÿ{zå<½ž é—ÜãªÙö)ö!„/jAðù1ãƒS6u!¸ÊÑéå·)‹²›ï£~ A¾uU¼òá¯[Cç{¡ä}ü3÷~YᇿGæòŸ Nß ‚àÌ0–»õän¿ú7’¿w»ÛÝîv·*K›Å%GŽŒÉg‡JȊإu8Á¬@~Zjx{º–ª*ÁU¢òÖYÕÏ*Pk ÖA²"M>߇Á(V+«Š”Ž&«ÌkiW[,'šŒÛí¡ŠH‘RU?øŸ¾Ï‹b(F˜_aÓZ¥Ööù¥LŠár0ÍsÑ% åôü: ¿Ê¬‹åÖô8Jc…Tš'Á¯O¬…9ƒsŽUyÓèü*í¹ü*RJ-ZZ¹F‹TeJ,2ü3Æ®?–lDf\(¨´ì#èRŠ@ä ©ÝX "Íd³hQ™#û»›.ìÿ×ò$±€jÐkå;: ±% ²h¦¿¤Œ°VO*uàpôVùU_ë¡L%)¦çÔ_š?QŒ°! æ³8À€þTfÑ›v¦¢¥lzÞ})í¹³œ…P…RFXÿ˜×G0<æÝUˆP"O‘_‡òÕ³-¡:ñk3œ(ý‹ê\ŒÉ-fËaè‘€?JUŠÃ¯ò:Õ«d†6µŽ¹õ'8„‰Èàj£H=úG€¼dv¼Çú0£Þw3L…PÀÁD·g…íŒÕ-ˆÐzŒÎ‡¬™²w+M‡8ÏžYfy¥&t¼’K m(j‹ã2|=á š×Š=ê*¡v :Û]?âÀj’F)! Rd™…½LçBSņxÍ yä˜vLêr=êW!B¬“ÃÂGd³YðÀblœ Æì²Í 'ÙñxÅrýÒ±÷‚Ô”xcö{¡.'½Óʬ­÷4ù›ôì’ñ¹èpZ¹ÐǺ¿!Ol{Òk€ßËÅî55ÍX¼ú÷ÏzUL“öΤ·})‡ÏbðŸ|Wl¤“WLpWBO/AcÚ™{U4—Þ'œú_ƒí?×ðÙ_»u–þú{Üínw»Ûo€Õ“…ø©4¹‹äEñÐS¡7—œE$©7`¾D”þ§­ªŽ–˜î8IÖÕXPä|)÷K‡Òô«±Hº-fcÊS^£[ 6(ph•*E¯íT2ÝDñ)³Z¢¤C›><aµ0‘¦ÈÅŠup†1(Ó0`@º&#Ai©Ä-@BC‚di¨D´iÈã¤öZÿ„&«×‰àÃ)AY‰Šˆ4µŸB)E~Aj‘ZŒn{(6O¶`&³Ï4ð2ñ™CŽîÑjþŒ *˜§Ž#ŒòÐ<3iº$¢­.§òÉnŒ ‡€4¿Ii[ç®’Î_¡ÿn~ôu7£‘*°Fçñ^\ÄȻŷǥ‹+Ý‚·ê³9Áng% HF¤Ú2éu SÃ"ðsÚ X£ÞøyHÃHÁ°zfʯ='p¡& ÕÑñÔ¥“ÌA¨‹Ãh• õ혛~ƒÀ{½HØã­.“Xl¿7ƒë¥/DVýóñÄ5ȼg Ÿp|ûZìYR¼Á†Þ Èv=CöNÒ «Z \º6WˆÕyÏÿ-¦ÿ±vwÖïÖx?š»ÝínwûMÛ—7(³¤ïÀ7µ?K€£ÂTjZ†ê”‹+a WÜ`a¥¢£’:}aqM(IR®;¤f0yG¹Pì7Ý HLJÆŠxêÌîv…+œ8…k„NAfm¤*Ô”!O”rE¯TÿÃ`\f9¹T¤2¤iÏ•â"$N›Á%™³¤$F=¼ÂK$yåmÕPÚºA Ÿ"”òì¶Ò=¤Wª”:ݪgH¯´ž?½µÛ 4ƒqÎu~xTL- ±®ºZBÊ¢–/*®I«¶žv¥0:ÜÂ9†^PJ6w©²š+Ù:±Þ»ô^-çE÷|Bh [[”€¨Z‚µ¡:™SÖhjÝþ¶ÈJXèêÑzo*Kó‚О‘àÒV§9¤äâ+†û®Î˦ ¶-Àm ã ³PuK{N;^‚tü¨H?y†+¬3‰É÷O öè‚?tbǫǗ¹áê3wÂúL´ªN®&ëÂÅ;ºÓ;M-€“žá"Á?:òÅÓ$t¬¼—j‰¬‡13ÙŸ‹\X)ÄYŒìÛW°~ñ”¸˜¼n&æÏ–—5¦T'_¨­;,_‹VC§ý¼|ÙYnSö÷ÞZÄ ¤-‚Ùô^öµKW'½ý(þ÷QÓ)^Á·¯éÆÓÆ“¾ÛÝîv·»}¬}!hæNpVúÉ3UäT°5ÐÆÕþ_ëuÚ/¥òòu~Móœæ<öÝ)`P¹b„ïaâ¬Z@Àƒ\äs)1–™z _­‹8Ú…•ìCt)²„wÛóR<¥@¤Ê³gÙ—‘~kÄóws×ô¨Eêõ—Ië¦lã™$kçÝÚ’*ôj°E¾Ô*ö´§M»§5OÖãa(J2¥ë Œ+*>z$F䛥ë¤éëËÉ«ý?UMÞÚ*§Õ•¹hÞ….44Ìš8•îK.LcÅs˜Ñ¢uúêoÒ‘GSÃ_xd©“÷É[jYöEAdZAsuZ¦Îm¤EcèLË›;?Æ:_:4»´ø¸szÔ’°h€\HKAh!éP†qéÚ÷uVä(öTÙÂo&Âôìö$uZ-TyĽŽ{½@EŽ {ô¸W•kÔ(- ýŒŒ1@_Aoä+‹Z{xv>ÉJ´q,Œ¤„³akA†¨Îèð‡ t-O‹œÊo;®<0bñ„v}ðT†÷A½•èÄ‚$™³\%!"i^™!U‰¬3®feO@;-ݧ;ahU„ ÇNÄ”RN.dgYû6'·;#Uit6dA Yzò¨ËE‡$ ä«>_<±¿u¶çåüèo±ƒk4Gû<å¨?Š’_Ö)â•èË `e‰Í¼à¬ |ˆá¼W )|§ß±ä5.û§õëP¢–¦tõ †wjùŽ—F#ÞêU~‹CRòÙ? ”ó'†|«©—&=à±h«!Ä0…õ›}l,²Ív£a2¼¡Ù£þ©T¯ÿŠü® 07ýÿ‰r÷ðÝîv·»ýÞíKjB½µÆ(aˆØêØ«´¨Sž“ó­5È…Úƶ; %!bò©«}ò IDATXR*Ê‚ÌÉ­8µISÿÜ‹­­õø ‰Â:ÃcväŠ6°®þü`”U¤Ð'æ¿N:æØâA¢E} ÕÁiž«yvÀ×EŠŽX³ÿÌ” Q‡®¢ûÓr²Akÿu*|lÎþÏp6f]Š8{±Q¶o™¢"*¥ºÃлö©:BytAÈG攣A—‰×gZÁ}=:“®JU‡è´B'³¢MMK÷5uš 0)Òã)CaéDb©hŒ„iNÚì,©³ð&î£BGÛ·ŒÄðnœ[ùëšË“Èÿ†˜9¨½FkWÜr"b¥á%¨Æk«gnËÆyvôÅ5ÙŒ¢üHD-\‡®ý³ )T1­A®kWéQN㎞Çç«i[‹äQº#·È³û]íS‰qµjÌ@SêBOÇú0/›óYi¢$ƒæšŠåqZ‹ZhëWý*ÑJhmYìˆ2*T)˜y}¸Å³/¿°¶ç³< ’ Ëj_XUOÙ+e–0ØÇJâ€$ú-3µùûiîêéˆÕ…hð/ú±nr9µ†›.tÀÅ þD‰Pm Vê ¶xBeå× ÁqjÔ½o[QUüÞöV´×kúÔ‰Ä?PGuáÍW–´1\VéÉ6ëÄðT6ðU°‚Ë¿ˆŒÈo>îUݽ¨*¡ÞéëÏ…ýŠ¥Alا¨ÔNìDl¶Å®¢ˆk÷‘{ç…^þ3T«™&Ø ¯ ¯¹ì²¸rú¬ÿâXßã«æ®XUŠìÿ$þÒYŒç‚JMþÖMÌïÀ(.ÿ)/E²ób˜»Xv,Ô•òºL?}Yçæâîlò}gÞsÓÿ»Ýínw»Ûï ×ü-TùÔ°*œj_3ާó!=›Ü„^>~‚•b„k¨ˆJ‡¹„I½¹Þ LJ^4¢B‚Bf-‚ËUdf0™¬,2¦WAÌ4ñYTêàmB·/QÚ”éŸz¿«ÄÖtƵ̽–kŠCìYÀ Ck %.Ü\³8ÊP¹.§¨]í§§³ëŒZ&¿ƒyk“AtíÝ9f|;üTL‹á|^`I\ ÊéPë‘jâI®8"TG_:^)¦‹ÐÅ‘j÷E-©V/MËÍNx ?µ›¨6j.pufÀRƒíjÔN VœÓR‚Ê_·qübÝÿj‚Ô© &:.}x{0äGä€#q ¯4ýÉðÔCl ÿ*³ø‡¢ê=§ò]9CtÒé:\ýlÔMë,cF§*BgíÆúÜ_D'f1Cà*€<Ø‚:CÈdÌ¥óŸ‰9j N”ÒkØ Iܤ¸F8ˆ ä·:bëêa¨3Ø1õöme”÷Sq. •*pU>ú2J;¸ûC.ð"UÝè#¡fñJ6gá>º‘¥0ªè¬¸§šŸZ ²ËXè‹¢`Wh'˜ŒÝ$Y¼ÁJ a†LídØ’ÃÝYЪ‚6ësØ®ør+&ù.ãa±þTWì~àì¨ÿ-àÞY²„¿×E® ž¦;q°=òàÜëžZ/ì 3à µ›Uî™ wrR—¼Y¹ W˜=R‚¥áWi?÷βNÊîoG踣œÇìõÖ.±;~Ú'C9uFÁ 3¦(v:oA¬jeÒu°—v1Œw¡îdaÜ»è%ØÛ\ ZÉ‚ýÜͽŲ¾¯¸Ð¿âÙ\àÙ{yûþ l÷†¹w»ÈýïÑr·»Ýín¿{ zz4A¥ç>Ý»˜IPìO±••b/8Õø»ªt`½ë¨³ JišœÿÌnv^q<š*&Mž²ÈæKÊFPÙÛM˜¨r:L03QlŠFÊôXTœOœ= =P ô&0ÂV>5Œ“‹1³n£ò;AvhÜØ<ú:›nGQ¶Ã6•öJ4Òòœ]Zûà9¦ä÷ÑN!QNÅš+Pjm8žÏ9Nš3¹zj8v4p_•³]|&ÒzîÃú›R•FéWòD÷?p|ÓaG«§M€uª4hùUdz6Â8ºV̲ø6Ø”ó‡ÄLQq Ýbô TÑÕp[Ño tïÖôÒYÂŒÎl¹ê6XØZY@«LëFtwÙÏ$âÚ:Æ ÛÔ·àȵ5ôέÈ×§Pó(‘EæÔ°a0@ÒÏ}ÆVi;†ÓÁzM5͈ûGGhø/Šùþîeá^Wz¸e¤ýzñ4Y½ë`ÿ6 àe Æ—TPVŽÖÈ#ôuó¹ö ’¬ÄµëÙfKXo7ä¡CVv¾ŽÂk>«Iºó˜ÈÍiW¶ê‹:ÉÛFwÌ'äxð%Ki„nÜ}.„é¶øµï1:×á 1µÑI—§ÒE¤»‡|eîÛIº—ôá¶¿ö…¤ëvÝûþª0ΟBHoú·—Ðÿ=Zîv·»ÝíÓËíÇ—Õ¯A L™<Íy{ž5‡¢ðfŒ:Ÿv?]3ÒÑd"Ø—¥´N_BáRYC "G–̱B@Îål•hÆ&ÓF É•)¾¡urôw 7)³(­YV'%"IK1d¸yÜ¢u“'¨^‡¯¶Lh;0y…#‹¿vmqv»ïÚÊi=$5fÈAõ@‰Q4³JFÎâ1|±‹É¯¯¶p=Æ0þ–Já§ ÉqUÃq8©Ž®ÐT:ˆ‰5Dùª¤)Ï7'[Ú¸fF”ú¹6žÎ«Jæg0Æe!“.¤ÒS‹Ux&¨6S»˜no«DUà˜éÛ´²àìãöÕPþêQgø­5[}3›0 %³Ã@çõ XîÒ÷œËjKL•~ ž‡øR—ŸnÔrTML­jvmû\›Ù¸tM$ö|üúKê¡ëUÛ,+EPäQäY¤¢—Y¨»(µ+;¡É8—±—}Ô  ›sÄòuÈ‹QžýBËñÃjÂGï÷ Wƪ[M `FOÓÐi1bÞ‡DL…”b 82þâ¤êIïcO-(oswük¼ú˜„©’,ò2ƒsS®$û)JþèÂ1Ïy«r½Sa Šè±.i¯V`´èœM¹ Clz‡ñï|?Æ$nFÙg3*¨[ñ›ãü¡/’bÜ* ˆ_9ƒâ™ÏÅ^ŽQó\ì\^Äåh×¤Ú yøŸÛ{^ßÈFu8ñ@»1y‚'b¶ûŠïãÚ8´Ÿ \¸*.: ç3î$Ù‰Ya‘#oßY[·lã³µ›‰p›‚l6ío* $ØgälŠãÏ#ödX±§Z¸0’ñâèßÈÐx\¹gäêB\~’ÿB,Á¯àÍÅŸè‚„ÃÉêëxFóyi #”¿äÕ¯&éãä–u2dñ’ÝÌ÷ߘò´’ãn7ˆzéÝz·»Ýínwû^û‰•õËmÓ'œË.•Ð8¨p60–Þž;Æ‘™Î‰±ŒCÅmO­8²Ô™s=ÕÃKP)Ø E資™-§Šˆ·¦L·Š.§ØÇE¯ZK´6ôÀÄú×>)CV;ê&g$Q»æ:ÝäqkdÈØB¶ÖZ.Ú¶AÙäBó5·o/&¯P´{ªL)!Í=‘n¬Ñ”úÞAAØCŽ‹`Ç|G欃æÞËZT©vl;ÌÔCPúïµ×¸ ýÚ(…yV~£Øu 7ª%À „€ÔXŒÜv±¥*30ìlnr’ôšnð°8Ì« ô™§V¬@•×OUµs\[y6¦Y¥—ˆìšû®ô%=$SºHÔ!F/]ø6‡Ú£@+q‰À"Þ`Ék‡°agQÓ&†k‘Ú§C”Ü9õ!Yó8~ñÑb~ÏÃö©r³`o#òõ´Ÿ8›Å.ðÀÅ„•$ªA,ß³ð˜}#¸(;Vñ¡ Æ!Ku¯ÓÇqÒ;7ϽÛeè•»Ýínwûƒð¾g\œ©Œ óÌ2:5m D~«KwcNMÙm ¤(}HU(|¨Uˆ:”žpÙe¦kьԔŠ+[ÖTv_ˆäîÄ!¹.qP!¨RØ4sŽœg§«óú“½i¿²ªô©EÁ‘ljC~Ç”å‘`ÁZD(]¤ŠªPÅx”X¿—²×&>ùÝÑ1¸Ú…ñ9O)µ_]1Úë3n¤q&•i-Â¥*e*ÚDìCí„EX¤c>!Êÿ`¸ÊkÚu+èv°Ö”Êax·²L"¸˜Ç˜A0ÒÕén&¬q·y£ŠñÔÚC в¡£K±x=.UÌlös™QŠ–š}ôR™ª;m89OE žhÖ ¨RjõuýôñQZs‰LP¾–ZÒú?ñ̬­fQ‹ŽœéRŒ5yP~\TÝ’Rf¡ÎrCÛíR†.ŒQ¶¨~("òKä)Í쇬V‘*ò‹-¸uÄ𞵕b?€/ƒZµÚ7?¥ U£ÅÌ^¤ebEäKéö øU.døÃšu޶Ÿ EX…źy[»‰Úìµv11&Æð"lc„KÇfnÛîA9¼w2h£Yº‚J‡Ÿ%˜Uh§÷PBÇþŽðVð«ã\ˆ¤ÑAFë\›‚»ƒ¥sÐq‚x“k¥GA§ÄœæI–Ôï­¡WB^úE >ÃH‘Øñ=  —&ž¨lS¶èîæ××<ÿ¢„Ÿ,ꯣ¦ø—§rês¤¸NïuesÜ]­¯ à |Ï!>çú³ŠDʨ ™²”¼ZåÌã7vÂÓ– TÉ‘då‰6náò°­Ñê6âÏ5}FÈq91‚v™ ®'y¾P›»–A=/Òÿ=:[©üxÌì+h‚.nã}æÕkûË8œ Ùe¬ùþ‚]äÓÛ£í0ÔõGùêw+ãËX?sv[L¶™¤ÛÑ™s/TL!œg®ì¿¥ÂÐÝþ-èÿRw»ÛÝîöGtåïÌJf²Ë‰Ê€FX@™ƒPbvØÀw8MNÁfBK-š\æ†TëÒ X·ÅÓ¤3ð0U¹«&;z£ã’ ©Ce²­ãeZ!RSPB«fC\݆’‹Í¸.‡4mÖž‘"„2vV¦Äz§~üÀÐ)š4°Š<•’RpÞ­wl”mêtÊ£Áä(rŒ„¨xJB¦¦5…˜\]ÔŸê©à¯äk§ùåÙGi™wJ¥²­ZÌ >?W×€>n%èÔž.ËnÒçiÄÇ £MÑ.¶3al½GWxoÏ©ärxuúvûÁî+Ƈc†Ê¬£µ;>çÑ#su\ f‘·-Ê@¢ö‚Cæè¤*VËÍ. \OpÌÑÏÍ}„äʬª½p¡F¾Ø¼­‰$jÓ„™jB3CÅŠê`,P­’HðèÝî„ØPþxÜU)¤Ìî¿ÊT½'åqLçbeÖú=õ!í KR0ƒEjETÎC‘°Ð)Jciè…\f!t6­b"7yFaf¸¢•ŽŠuF1Óæÿšü}±u6ZÒ¡ÊQËEm±nÑ•æpöVÒ}|ˆ6EýŠš6©5hn¢½MnxaCk°aðRÄ xôÔîÒÅž7ªág²ºDS¥Á5Æb*ÄçRlÕ®4Î:H¼­:2ÿN P`Î JV†N±;.ÏE•y{îã•âÕ×ÕX©³0*Ð)Ûp£…ëÅC¥òpua鈲;–d­áÉLA¸5\ãI g½Å.Ã!I¡UGËB–ا×|º2\“êÚ,ŒÛ ú{H†ènƒ÷°Iì²ÇËT”È—¾¼¿ù]½µ+ëáMtoÄi`Üånw»ÛÝþ ¦0Ûlc‘æC7XŽÃYº>K±…ÒÆUŸÝXU§E%‹!6Gjj8 Ô2(v'8¥s1*In(ùø¹ßMÚ”2¶5@äÑ”µE¥u³†-8 Ò§t­ŸÃéj‹ð8’´Hd‰,‚:Ç™§ÑCÊ$JÞ["«‹O°èr'áu'´ÀkíRªQó×xÂ8Îóá6\$X)bŠ-CéM±J­m¤5Øý°¼»çqïs «…Ä\6«¯"J}H,—ÔÓJSK]Ù0‘+a‚Œ°F·PÚ8´KD7®8|\) ¾ P¹ÿ2£wc†öüñâW˜Ò›Vd ç¡i^;8†ÔÒï”yf(l`I$_Ðô-´×‚•½ßòœõ:¢F3ay“V^Ø u«2™xlmÝþe^­^+Är[Ý!îè>lÆõAÊ#ÑþðÞ¨ô³uÀÖ¹2·* Zr£V•R樨ìe"‘"8~ǦdY«ÒÜbDÞ–¬Í²E=R À{¦_aß°'üY£CÜuv¯Ð7ÊReF&Ž'%>ˆNwï5³–­!7Jlk1M[$ÜÅŠw¹8Ç6#5¡ZLrÆa£J{¡Mk¸v+vUhzÖ{r¤×I5ÏÍè½¸Š ¯ºð?ÅÖu‰ HtšéèßT8©@‹÷vû[Ú"ªiÙð"„ ÿuRÎGaˆÉ0L@}!ο”ÊÍ~æ¿_¿ìøWÌw5oßWºðEÄ3ýÏä¶œ0$³žâåo·±s¿Úpá‹¶‚‰ÐrøØ­@ÛŸ„ ª§® ¨6æÁnÍ*ϰ÷¸Z ·§B2„Mþ‚Ì`ED±X“³g·Ó8?8¯råÅÈ‹BÎ8x©3q1ntÀ¢ ®£Â ¡]Ìww·Ž‰r6H~,.ŒßvXÁ7þönÿ5î”»ýãðNw»Û?˜zÁÜ{‡ƒi¶§IÓSiÇ©’4Eú¦òž!…–GPi˜ZTó>Dg^‹wÇ…u#Q)ÌÉb¥vØ´_!ÂÎßYH˜RÚ„OèN¥o Qí+üP¡yHv$¦9%=´f°4ÄI:¨EQEUËôc²l'Ò:¥Ì#eûyHÓÛI6í®v˜SÔ‚°ñ{î£ÍvLõa‡øLƒªÝ˜UêSžOåD"õžWEôSËÉAÀ@ÉuBŸ¶Ú6µ T'ó!rb?J¼‘<[NªÊ}wÌ5`I+tb¸¶Î®¦‘JF®´¸–s¨Öˆ•µQûÇ8±cö£E(ž´G<»JU:ªÕŒÂH ˜Žúuæ)§£Ó!Yž¢.”žM…Î%ϲË+šÙÖVláX…9Tõ«<«È/TÐrD>ý×ú] v·Â•1YØb NSèø4¹Çt;t~XÍ.Ö8ý̹=X>:ñ–Ã8ʉ£òvæ®8×")8*û''è š•F‹ŸtðZOyx-bËÚDùë|y×™ã .Lqÿ?{o»%¹+í"¨žýÞÿí—ç¿ ¨Ìr·=mOjÍš=Û®ÊRJEO´+YÚîà£p‰7—ë´p²AÉ…/®À¯›o)›y½ó|ãì‡éö†Vu•`‹ù¨‰°2ÁùäS‚¼ÔÁ£çw}X]è'ú¸9ÒýQ >1ú˜“ìáK *^kÎ!g"ªüç_Öcxc­¯ø¤õm—oá¶wmq”ØÝÖ5«ÜÞMéç[Ògó–ðÊíÒÁGíZ'_elÐK¾§ %œwfz:cø0Í—Nyü‹Ø;ø ÊJr/Bg˜„Š%Óþy¹¶W ážè=6ô)îE7 Pû³éêi¦.–¥€g'¾/^~©GzÕ1f›7pJ\ÀùŽK_ÚÎüI‰v‰/#‡þ¡7r žæU< ãïÈgµí]îÇOHÿŸ¡ó9~ùñTŸãsüw ÊC kçÛ”S<,(Š'°upÛ¡·qï:Æ®c×ïu™ö…ÏÐà}7¢;[]ùÍl^©7 ?ǬÓçíìuEöíÃû•Ò¦b8C2½34öí2Û$Dx™J¶ðL9= Ýœ»º¿#µ&bA­®b,v[ï±(ÂôW}ÒäVVv‹};ÛÊžSzqlÂîi¿ï0·C«BS‰ÛòM7¤à_ ÌŠ•kXοì/ûQíªvÁ¬ÃZü‡[&\NÃêMÙƒü¸YÕ2\Ì3ÊôµIÖÚX·¬ÊÓ¹J4ñS›TÈnî~ƒ—´¼pPdž Án¿i"úu‹OÔ€h:nW×­¿ÇVüs]ÌMS›c+"ÂBJž¨`Sc¥âï™´íÏ›’ø7gøWyi’‹e•°Rìº ÅnXméì_Æ:yWÃb/Ms&1M9ÖFáGÍì_T1˜ {¥å™ØŒ-,}>†ÅììkÔ‰gÑ¥Ž*3=…+½# ¥˜£résP|Y·œÌ‹Ë¡b$¸EÐØôdö[ÿ i8‡Ù6±Xf·M6E†˜J„B½˜ fBB†YVlÄkÅ,½Ö,Ê\‰;.ÜEåö”År¾ŸÉ±$pˆ*Ñ”æ‡v« †“Ë[vVÐRŒÌ–5½*åã–‘×bv0;ã,®M ‚õä.¸Èsù·âì ϯ%æV é µ7Ñ=WS˜+YÈÆâžñKž7†L†î>è`‹—9­ŸìgËD…´ì§4Q#дøpÇÍ¿¬ßÛ!ãdÇFØ@1瘮Mæ¡ö¦ôvrëÀñöB:%Qr’É׆{$]¬‹ h®'ìAÖ¶ôÞÙVA>8‘e‰3pÒ²²Š¾šç"ŸÈÖõHÚ€ö,“, à{]\ö{5ÿ¡m¯4÷×ÜúïŠÜæ yóýÖdG8ìÛѲÃ,ï-dqP½¯ÕÚaÇ*ËËæüÓþHmŸ#Ÿ1Þxû|ŽÏñ÷Ÿ"åçøo¢žÛ‘É.ðùÜUUöpÚBŸKi >X•8µch\Ò”J9ÊpvfMV‹uÛ Ã#8Ìí®£¦Ãæ“K[§syÊñk ûqAªEàé Úeõ°úq Ûl‹è´…^™–üª™éû.·,=L®IX¤Xêà²vm¢,Ÿi¿Ò¤É:uÃÁ\ª–¹Mà!°í®Vi»ßÜfÿÄØ'PITK;2•gšÖk\ýï{¨ßÜì.v_Ýl~µ {»¿Rͧ³zzƒ½ShÃÚ*øáÙÙà*)äè,§¡‡à±›>¨ñˆâ™ã§ÏxäöÏK]ZU]Fõ­Q IDATUj’†KÍ‘/°ÒÆ[]5°ùì¯ädë)ßæ•kÝH—}7˜Ö6švØD©¡¾UJŠ„µF§'ׯpÛ­­PVv™·ûáõø³›èqY¹¬^f?úu®ð¨ýI#¬V'É\z­IêkÔí.:M£¥`Vz~Й3ÚeÒŠL-*àØÝîKueß*L*(Ý‹rëgÙ`ˆf6I ÖÖ¢0Œg‹†vbÎàÌóF(HîÜ7uð _Óˆf„Do5"ôÇçø æ3£N[/$¥nQUý‚Òê4ïeƒßG!„ É¡ú7aß«8ùU£ùšŸ·x´ÎüîÞÜÞÁ,FA/’‡ç";:Ö%Ƴ±¶›¼¨›É‰;oºÝ¿’åsñé$Ã’ Õd‡)LýÚ$–[/u3P‡ÝW±«¿´f¹‘‹Õ¿Ôê?Ç_Ç="v‡òØ"ê¨'­}](Éè{£öÓƒ­Ia²Ó#ÝXµA™ÇW?ç»i¦626¡‡X„âPZVµkjè|ãé&\K,†ÅoáV°1ϺuÀr2 +4ÆÀD·3Tïèñ>jŠ<ëÇ2CŠð¶á×Qƒà¨89¦ŒoÈ…–KÛx‡Ã·åæú郬3ï’s'Ì…´”ê‰-w–fO…ݤ"ÌÅQ cý4;jŸx\pÂ…‚_'E”ô i­1{ÑÀ²Èî,ãa*³1üø§d¥õ*Ø–¯ÙhÂê(#a8$'…7ˆ"¤ÂÁƒâŸMMöØWfÌ>öñQÒz†öÞá0MñüÔŸ´½Qãty¾$}íç[ås>þÛŸ?Ç¿ùॲÏ(ù¿ÏpýŒÀÏñ9þ ïÓŒ›ñ àÖ \Q«MÀ¢š”= %àŠÅn'ªÉZ˜ÝÝ»›O„3*€>õŽÞ1m‹G±ºèDO¤Æ$E|­_á5nOrÄ3@ç@·‘ZLXÝ–ÔSÂ(»=G"éÕH³úÍ´úbT@ÊàðD 0ºv\Ägm ß_»€>Y4ÅßeBÞ:±@å2»6>À°7¾ŠGÞ]ï¯ìz+G5§ŠBMWÉpÔ£0ºÍÌJéž÷•L0/6±/®êz z5ÂvÖ.\Ñ(ÙÈÑeT@$`CnÔU3µúÁÚƒQöùXúþ”;Ã~{ÒTÖw±‘X[û‡CÓŒ½€½Žv³AÒ«ýU#‹²+‘Eã8ƒÎáÎËöèˆÞ ôÏÜ8-‘SZȾ¤ñÍFÓª[%.êýª#Rûîm(VJÌž]¼1ñNì¹Úž.šÁnØ=€`×D–aÓ"“­>Ón!ʼT{Mñ¦ñ¶ë6˜]·ñ²?.«—v©êk /,B¬è‹BÉgn¥ W¬¸äö01T©€"(¡dåßYN 3_â’FHe޾``;Â–ÂÆÈrå+,ý.ÄÛ¨ÁŒùíu•ñ÷U‰›_¶d"ÆêÞØ$ˆa9éYòüf ™ @ÊvȹÒÜboSቩ@•íD¶Ð…iÌŸqÖ½ì=nÊœup’›KzÓçºm¼ìQÜ\jt‡[¢†ùެÈÄLͯ­±¢ú¨û3T¬S-lÇÒ$O:âki ûÛ|ã¸I«ÌèCq |2f#þé£úÉmáš oú‚ßÙJWluè½#ðÐ7ùdJåãÛs'’Á9ß™j¸Â„ÑÿÎXw¯ƒê"µÍ[UL*pùziäô¤­]I)ˆÇN]—àtü!3ÒSfl‡Q<ÞòG¼×uvÄL˜|{xÄÄÙco:ìý1oUѶ`ù“ôjÇ?Ä#÷éE<1²Áy ¡FNxçâT6avç†×¿éÀ{róçønÁGúÿÿð‘û9>Ççø+ ~#—æÐ.ª/cdmK5 ù„ÙÛH‚ËTR–6§îËù™ÜHJðÜñåÁÇÖ:¹íJã?—Þ[Yvð¸o oæN/E\À…àbó5íͤª¼€î¬HEè•$zž¸å%LV”಻ª]ÕíÁ·•*4~Y-Æ2"F¹éJ{¸X‡ &%Åh†Æß/ µŒ*–Ø „1/ï™ÃËÌØgŒÆ 1ò«Büõ³w¾ön€ë²Rì¦}YWQûÛë§§ÜWëJ‰D9ÄiD¡ðŽà¥7óxÇÚ$úÌds½YØ&" ôÙvwJ¿S½vr¦u±¶q™è£ïUŸk¹Y6pC¦æÄú™¡p%毿ÞÞ*ˆ§ÏÊ&Þlëò1'Uhò„Y|¸8ƒ¸êWk˜hE%.\Ï êh¢|…Ý´«vª¡Žó,ã*ÕH‹Š…¥»wÌ\ff˜}™±ØØÌŠY-~ŠV@¿m8`xÈ8{Q¶ç·Æ‚Û~4pVµ!ÿû'ÂÜ\Êl¬¤£æ¡zg¥LYÞé Ýè"Kå(Ì8DaŽÛä¬Ô¨ã7\[Ý*v2Z‚ 4ೃ×RåHÂ}»ݓޟ˜$îúe[%Ø+ï†ÄÍM&u‚0“á¹IxØxh^ÄçKÍçDß 'm—+ÏÔÙ'R džyŸã 5Kn`T±1¯à5!UÀ…ÿfÙ¾ÂþîxíöÓGž"rêpb2³íBXHÒž‹´hȵCt*œ|Á3°¸…!Î×OúöÐ…Yc4äèøY.ŽyDýt _üd¢pÆÞpÝúgtKŽzà¡ÃŽ…õ¾>„L{e2÷@l‹a³”Mõу«ò\ŽÒ ±ƒG瘕SðFzY郔‘e +Ÿäà¹ùÚz|™t¹9•”]3‡]8çÇl¹#ø¾tLú•÷)_VäPdÙ×úüø8œ~¨ŠØA|§ÆñjZK_Ça/f·þ—<>ÇçøÜ…ÏñQý?Ççø± k²µÞIšOEÁ4ÏõMic²{änIžËD>Î ?Î@k78©úKÙ"q¶f@þg¼'e½N(×= CP‹»t<‰æ9« À<ÔÈr!Õõòcƒü‹‘¾{ĦÂ!ß³ vÃj±J+·S¨GO¬é’0^µœ£¬!ºè\°7½°“Ê×bXαj$´e½¬*7‹|c¾Ÿ½+5‡Hä.n¶}Ô+Õû­VûJq)uï«ßY7)£}!(»¬PC5(ôsHlf‚MØw8ëãÄ*¥¹áZÞDǧY)va™²QWÞ@ H˜Ò¼ŠNœ Ú§éoÂÜíSÅ)?)ð×;(ŽÜ”J¯î¼ {ƒ‹CR$zÄ3¦ ¡ æ#%zù°n»S¸º£›X(•¶&|ããÝ+ßùTvˆû’­Ò*jÈ¢›EsŸ5!³ÄÁ«Á¿E3ŸátgìÚÇðÆXE­c]M}ל^$|"h©›÷×pÃ$âÒ†ƒ¨äËÑég­yþñ?-´PÈ?Íž”Ì»jŒÂà(gš~Hõp瘋t;{aŸ%¨]bƒ•7g›Y“žÕÅ@i½„iìól_£³S¬ww†€þq$K¦@$˜`[‰d.};Ôë@Ý0Z˜(qð4¡4mø$ýGÅÿ” kŠ×~—ßÈB¤ñÕÿŸ TЇ¯–„§, i‚yUð¾^áK>ÇœÇ>˜4Û6>Ñ~ÝœrÒãƒFW`Ð åLxZO±xúäyÑÊš""ôéPI¢Ä5íؾ&âÞèA¥uËŒI}'ì˜ÙÑQî–OôB~ÝhY“\ú;½£ÃCêB,9½@C‚‡”6>VÐølb~)h¦õ]¼úíonׄ†½·ïðqeþðõ‘w5ÙKEçˆæ—2ýGqþÐý_“O¿þÑg?ÇçøŸãßYØ(½Ü$i‘OÀÇÄQhVÚ¾}NµÄ•øfq¡»t.• ²'*’šÚ¬Ö“Lvx» rd E„Ïîâòä Öƒ‚\åæ\F½Ù%*f»lÂ¥³)ó/q çú’À X@.ðNOv¥k0Ákb¶\ÞbË…M8‘Tõwz11•3àGE­f·ý°n´œáÀíškV°óˆU»«Yµë¶RÅe¦dŒ¹-¬ÑVs¤Íð^ÆOè‚ ãS X@ÉBut¯«ž®Û°ÁÖÐÚe7–m¼aA¶€¸È™¥Cg¸Ì€©’O.¹äN¯®ý)h©´}ÔÑá-«@tvWÉÔ’@ØSQ“0câ,æ’8ìm=\O´ša)ØdÍ3³eªâ3:X ¿½¤JÏ/iÉË\¢Ó§ÐkT›ªÝcbÁ´œ_VÐ!­ Ǧ¿ôc•Voã-—>øDþ4†HGŸ­B‰‰†x['[Jöm¨VÚ²Ñ ³Ãü¦ÅNúÉàAÏYeöR-š¦Ý]µHs¤×“›fë!ÁS8†C‘s¨›ØŠÌwIÿ±¶‘‚·'ÝÉÇö”X4òuÌ6Štð´2 \ ³‰ÜCdϦ§¯äèæWé­è¦êò•úOóVhDíÉqæà¬k%¤I$sŠcú¦ÛŠúö Wò„¥^²fqÊTBÏf?l«¯îOõ#ïžýg÷+\Nõƒ7ˆª¹èÉLõ;ÇSYÄ·EÂq¨™Ÿ§í®6¿ÍƒðÇïi(°sª’;©áÚ ¹@Þ?þ¦š[¹·ÔÖN¢;œ³Ïí#jÞW¦¿í +Œ—vÆÌD‚ÿ“ÎÅGÕYZýЦšûÅ!Œ‰»¼ù|ª[ë0r/xø$ž¯Ç3n>}ÒÏ#|ubzØ[wfùß—Áû™äè-;WÓúDxû—C.…_ßó¥ž>ñgõó÷CÑ?ÇÿŒîø¹áô9>ÇçøŸã]_ÌûA1¯ÄŠ"7«ü(ƒYú“3™>[²‚vÃm ëA.*Ð'ìñàÐï* »»Ë ¸yÁ<ó‡ ˆa­A-œ]🶰3ó¾è”[F|"OÈ ‡Z’W[öVNQ-´Ä/ ‹{'q>dGâI“"¶ŠB ˆ<¬h² 包Ïß›ËbınoÛPIòÆçþ>Â" ™ÆV?ªÉ:¿Ár/³y\¡X7žO¼b-&µ-Äæ§umñc¹/{_™›ØÍ³ê dOâ¹\”ʼâk®`†‡ÐRfß4P§øn¤sÎ`É:LKRØp/»ì/î¯o¼¯ ½t ÇJO«ù5 -È}úRºÃY:ßwDö€o£åÄ2!ܼýŽö¥Î-¿ÛßêïM¸ëø-k¾{Ò÷H>tùèjÇ‹¯™‹á5°¤ËOby6’+©ïšc-cËc_:ŸˆÔØõ»Cùø8~ÎX {cŠxù›y÷_ ñÿ鬅ϭÿŸãs|ŽO`ZÚCõ=¡‹t—-•mŠ­¸=‹ƒÕÎĘF³ùUº&ß°ÆŠâ‹ì½á!ΔO‹±«Èuó ‹¨Ð¸%SŒ¦yöqЋùØKÙ{³÷RL’8·"É¢ñ˜k›*üÂH J±ÝõÃ*º“÷2»%‹Øj¿ûÍ_v\¸ß«` L>Eí-m±>8qdWØ¥‰*˜øj¬Vµ£.=qÞ)t×l@"liÈpC´Cä¶ÂîénŸY÷è]Ù¿‘IÒž2(ÊåVâ}£{ëÏ{`F•c–<*W‹ÆjsáH ýÑ+7í¾_Vjw™v¥“Ùe["ÂÐËH˜è[ÔšS’CÁ`þ«4ðjÚ1¡é%J„iXoA4Ò=V桞ÿ42g– Dag5V+Å~˜ýQ¬–ÞA¥"27hFÿ]ùy“Ä‚ VGºõªuÍŽ h7ìkœüUÖ3ë*()ZÚb4e£È3rIÖú=îþ¥(^dühÅ;=­PËì]ì³ùsÈvE/÷ÏG¬4M"¼NJQLJ†f6¯h+MY+¡æ½&C¨¡UÍ!YèËN/ê^¬5«|çàÖ¤Ô±^$iŒ¹F¶[zÓ]*ESvõPÆ"ôzrÏòFVć*ÅË}òþvÐw4}UbÂ_=Ã|*R€EÀ_ |·ÁWwõ Ø ܼi£†i 2ž4kœ^ÜhA1 £ƒ[±ù;"…cæd†‰g53‘œê»8ªºë={.ÌÀ—ÊŽH¦K; Òáúv|ÿŽå°È$|dŠG0zcû‰K]Ò´¤‰Á±“ 4Åú)1š»çœ†l9„ó´pàû[vG^Î!F+,·ÎÙÀ1"NªgHæ1ÀvÓ¸íÌ>:ÌÙ{#y"¬XŽ¥=žÇí©f²-YßR<ñê šã‹¿ãDgï¨ÿÛ+ ‡‡èÛ:ï¾ù®’ûQ~ÿÞé.ù³wÿ/%ÿð3 ?ÇçøŸã7)x+ñ¾¦J÷XVµ¼ UË"6rÜÂ~E¦AXnQªÈ¶\µfÀÙÙh1Kí)ð.ìk!5ìé…J¿E™ÝŠ;Wõ“•/Ã[rnxÂ?—Y·vìß«v9,¸C‡ìÄËЕ/ßÌàËM?ä<“o7]ðeù-´wHãùòYkhlÇ&ˆ¦Œ:Šx¦ª[Ø3]½#\ê"/M8yMM÷ 9bì®ôšMõõ¸|ÚvÔ-{’ »ì[­²§A`ö·9­º‘™žBçÌ5QÃÔ‡ýÍ–‹SÜ·M„†ˆŽ U`üѳ^ëm¸_f·ÙÝ›0Ê|H-ÎQ¬ûC”–Ó>lÌYöšÓ¼ÁOn£¥¯ÅöÙlgo´×EÁµEäi?©ô˜]Ë×? VûÉ×Û@ûûÑ¢5®îŸ½ž×ÇÓ’¿zŒîî¾/°ÛŸv—­i{ä@ ´¸`—¹jkRF¡BÁ>w•jÏO›2}ן’#òšSªÃÏÞUbÅÏ·¶Xd±ó½9H”Üu+•©u–ç‚é8 ;Ïf>ƒDÄQX^»<‡ú*G!ÎÑŸ‚s¹z2¢¬–91f„‘0`þ,!ËÓ6½D%“<ý œ¾^¾$LçùTŽ‘iŠ™Èù þÛº¿òßv©(È7‹ÿ£«—Ù”V=T}kRÔ<ö§BHEÖ,óõ[ì>d÷ÎvÕϼ‰È6üð#ÈVP™B÷Äñ·'Ûþ~ñO˹—FÝF‡õ†t€Ò½!¯Ûàk„9‚¹5 !»Y¯sž·¥æBm4ï#Âôn/4ÇÌ Ÿ‹§Øï¾|N³o¡áŸ ÛTþ€~–tU<9ŸÏß÷íűÆcçé®ÉøA¨%d¶ö¼aG¶L®qg!†s;ò7¾ÒöÇùºÂô:¢#íñzSL”<öÀ¢Íqƒm¢¶G³?âå÷Ÿç}{Ì&L¼˜%ì/úýÿÍã[Ò?þ²OþÉOûŒÈÏñ9>Ççøo²Ä¹(ž2QBáyð– 1‹r0=qN© L€¡nÍ:WZð0‡í=¤Ìɲ7çº:{f(ûÎkEH»]?²^ºõ=˜í=†¸³…:¢2‹™Ö5Y„=$“®X휘Á¤wÓôë’\†‘iž DsÍ\1»`L²áâ@¼¹sj†‹4»ûé5’´Â%½ÍmíäέOPzн^¸¾rrå`÷ÿ a±YçêÞÀA'G¶°â‰Zj®óË6]ä@H …üâ8“t;­3%ti `ÒÍMT8ÀȨ»Š}µªÌ—Ùÿgø²z Ò¸&¯@éä0d¡p4»%“©=tL³Qã±æåän¬/U ¥cè_¥Ð%úZÈL£#U¿+QL¤@ÖjY|Y«5ˆ°ƒø[±ª5N]í¡¸ Å BBŽU™µÆ6´šY»èü‰í‡ÙÚ7(p­ë³âÀ«:BGºaSáâÖ_…dl=>¨ùi_õ/¬m¢š9Ðy뺲IÜýÍ $, +‡i,­Obnj¸¦¸íÃÆž¹Î%mÏ é{剱áæA<™ÕzB¬÷t ó±àã «#«„ma¿Ä–ú¸U„mÁ懔ˆÄ|*ë¤|' ænuzÒÓÿÆ5¡¬ èÅJ>À.Ò˜MúÞ•ï=¸/êïpõ›ˆ(Áê«P'C®ùg0¨®aùÄ„nAÙyX§™Goá é 8)žó3S9ì!ysc¸pçÎ#ã¼g½¹g—¯ÔD@Vƒ—(aË+§”>ªÊr—…î‡{ôÚÜÚ€¼à)Î4%ðx̦>8Žlãýþ1‚˾ã„=ÉÈ?Ü#œ u¾*³–Ê–%EŸîÔùy‰˜»WX*{ˆû~Oãã;âàã½ÍÖæ;bã‰1òŽâ¶±¸"³mQ>¼ë2®ò5[Ö‡9os,ÒÆ—ðJ=L…øwás|tÿ‡)î£ûŽÏñ9>Ç¿¶0äªå¿¦ÓM°·ëʾÂ6(ö4ùj®6#÷ôÔ²éŒñ¤“8dæSy·}&ÀÚ’œaJZ/‡Ö •Ã0t:ïÝËÁ;ۆ텙…n÷È"é8 ¶”Ëúš¸Úý.tšôÖ~þî¼W˶-vÃî&)Α`^_ž>ÄàÜ·U-05£·ÜÁ"Ð@RõT‡9yeÄæ»?=:3ˆÿCŸhŒvˆSôІì~½¤ŠÙ‹ ó#º~¤ÿÿšôÿ|Ÿãs|ŽÏñvWš[Ïy'ÅÒ¾½LÌa(.tðí(˜»esÛÿªÜ`Ñên†_b{üŽæ IDATÑ)_*c•ÁaWbf²Ê¤«U˜ufKÞá‘`ä·¸ÝüŽ…[þ!¥mšë*‹w,j``±R|„2c^Eu”œèN¸É¡E¬Y±UPÆïVÚ=¨Peô4tÕOàWS5Ž’ãN8ô,¹ÝþÏÊk‘vþ{¥IGA߯9"š—ÀüÝS/(†ÒQQý:×ñűå¢sÔ¨z^–”³ê‚Õ½ è}Ó œ.ÆÛP¡!‰ý:ý™mÚm›÷°W±áË'Ç ê‰8vÚÉv;LÂ0jõ‘*ð’ 2‘Η®9Ú˜à)»è^IÛk€JÚõ$&’–…@橞ó¨þ«° ¯Q«Y!Ùgªó}+´pì–;W ”“æÂ„Άx¡Üwñ´%m… <¢(Ýnÿ‚•(k ’Øj§ûoò1ä2ŒJ­ÐÙ¥÷©p×2—þu÷ܪ!¾ÿ,|)·ß“0‚lG$O÷Cñcê†|ò …2Œº°r°Õe~Ùi~xÅv¶¦ýp1üo)P<ñ?ùB•Þ'Ûõˆ¥í³kޝ(„t\$`ÀðÉyÕE›4_gC}KÀ…/0Xpñ?_{¼vߟâv÷1 ,гîÇ+ýù_Jáñ¡%´ýô)€Ôãý×çV”‚“KçF†þ¿4|ËŽs¯“êÝÝ Az/Bà—ÄŽßM÷çw«toŽüê³ýŒ·Ïñ9>ÇçøÍ Ø%°aá¤Gßßô ~RÁS[7ùÙžl a‹)Ñdß*g…ÒÛr0m¦ð„m3»jÔ…zN· @dš‡X*ú5÷i݆!FC(á¶þ·êzíš4w•øM˜S  ¼,*eÛØÈ^=ºÌhF+÷ˆx9»rMt{Lgöûvµ´›$ÁN¹_e…ißÖNd)Ù_Œ—Pûo«_Kd¼_˜ÛjžNt#½¹l„9$”Ýk7^·Þù©æß踪e*s”ûfú$C˜¢8kH€Oº‹DrÄn[ä2OÃr ÅÖ”S‹á²³Ûþ¸íëËjÓ~Xùa¸¼u Âr6)Êui\š«ûú —à5{\XˆX”¡øÍ±l×= À·HÏÉgÆD›\[Å"1MŒðŠ’bxôLÎNM”õ€ïZínO܈ê]•HqŽ×Ñ¿²âiju6ÐclQ¶*ìŸ8Q¯ß‘•/U¾…­ßê(&_*húsºã,¯n›ùõtV 7I>(Òqÿ®ŒÌ•ÌM÷·5©bcC#W·)S+¤qMc(SY®À™¨BÆ £bZFYnžF•:6`¯óùªa0ÚðdϽHÐ ö ŽC^¨E2¼Ç±dÖX®Ð¶1xFS0¦¶Æ hÐP°é¡: ¤íƒ^ä (¡™U`Ï€x¿lÈc\5„f»ªZÊb=ôCøV•Sî»»;59ÏÐànñ3ÜòpOÕ‘,Å:×"ùBÝ0‹…m2“õ_‘gô7e5-fŸ ¹Ü™yá·[ë9sqúÖ&ñôðf]àc¿Åt«Ø/Ny;À¤„¨ØªÅGõhì"õû£&µ?löšë(Fj¿ZìÙÒus WóxGãf®Ú¯F&«5ó½=Z$ Q>e-Öt_fN!x%†¯æÜ/aD:½ûÕ×q `½š÷7>ö»™éé+©…¯îß–JÏ»Èo+°ßªÇüdà[§ú9¾¯û×A߸¶_p¶Ÿ[ÿ9>ÇçøÿŒ€Î2ϲ_‹ø©ùúÁ¨²k Ø‹ þÅÕa&A“ñ¨œ:H8†½Ô¢˜&¥A]›ÇÖuªÛÚò ¹mŸ¤–Åô÷üúh`)òeGzm÷·"Ì‚ö£Ú—uF“oÜ>ª¸ºÅºÚEú‹k܇S–¶SiºÌnó'¯xnÆ}ûІUë~R3çäÈèßîZŠgúOA”ÀXIÇKÓL…æ¿óHI†_«xQ†ØÚé@ãçƒQhÝý²”kaz¶ªßÒƒp¿š®ÊÅ"o  "¦æv»¤»ñ]W–ɩD‚EbÜCb“®RehYk˰J]VŠ¡Ú}Û·ý1X+?Š[ô¡ J=ÌMíb¶n× #d|4å·ŽG~ÛÏZ—[·.‘¬í®ö`+r`F³jƒ;Û}I-©È†Ã–M…8•l:¾{a v×>ÚWT¸G?Uæp ñ6Ä6Žà îÏ z<¯yclÏÊÖ Š ú1¾j͙҇Îk*uV{¯©r]e¿pëâj].ØãÄ QRÅdtšéijïaª7W|}Ø€qkJÓœ[øŒeW¬2÷†]c²ÌïòÎí¿[ã+IÄ–?IKùí%R·†g"Þ®s¾éÜm•»Žl J>lAyzÉrQ›&±-œ}Q[†0쥛¦ƒMîyBÁ_1lR)2.hâNf ðÃñ+•O‡ð*¶â,lóí¬ì®fšÙÊ©%ÃÓE:EIm3LÆ1Ûu_ìžtlwм,ºÓùÃÊ-ËE8"þÓ"ýŠÊžP*Œ‘™ªŽÍÔ¿å#8]™í¡ þ–:Ht!ÊGY0«§†ø.}…ãP9…4`'Ô3¯<. HBÂé…ëü1Éá›0’AQò¦ø¦=à•VŽü)Ù;¡Ý¯gȵ·àû/åÅ­êŸõ’´6Û;CÅ=|Í͘¿Iy]Eô65Öè½öc€Ù~0Þ f׌ïê"NªæIhôý‚G”ÓO&¸âY9>kÄ?ùw·Ðáß³8Á·þý‹`çw¾þ–sþHÿŸãs|ŽÏñ*SõÌŒÝÿ Ú5„ÔÂN§± µ´ÿS—.3ý¹ôÛõKê2‘ ›Ï†Áù ±j$\«1¨V16©H§›vÉ%+Å“ÄùZRkÏDNÛŽçÚ™ôÍ~àsp+NómðžyžX¢ê2«VïÔ«¡6á¼½ôÞÉ)¯´3ŸÝ˜³Í1ª’”“´>Yý‰Sù*ƒ¿”¬BQMGw¿§?5b4yÊòeVºìhò®´Kd„8[z™M³„jv¯b@— o3Ø5ê ¼U“z§å¼IØE›?ª™­Ð…©4¾Mê£GTHKÁ¶K<¡ý 2Âmõ¶¯jÐhv]ö£5âÔA ¡dºŽAUŠ«¥Ù¸¹­"GßÄÐ=Ý øs›U+f÷€á¸þ ÆŠNÔûEORöY.Z¶ˆ ç:„ç §’ËAz!Ä¿Y°ê W÷×EpŽpp™@Z%£•Š-¨Ú¬¶rÛåNî™bU:ÐL‰0²êŠu¯wœOlÐØÆˆR*šO1è˜T[ûh‰œŸ,AÄ)Ñ ¤b|†‘ íùØ„f-ÌÊ圗Ê&aËÇ–Dz”3eöÅb=BüSóàlR¡S ZÉs•FD°†r\ˈ÷$.øÌzwk$x¿n™T·Ä•!“2èý´«cœ}-㟩@Z»¢°b±&­:U¯'$ý°ÚBð,–…tè™ãfÌß¶Ù8Á=ùv‹¼†m",3|ZœÏc)¹ÜnÖ³øÀ).rˆå´­s­÷¨¨QH-qÔÁŽFœ”}:êQAb d O¥ûg-ÅGzÔúpD 1±ZÃé¡kXÜï:m:4U þݨðp«Co]†ˆÅ­\<â9ƒøÔ°©±ÈOÒõûê³\wðýéoŠ‚ÿoW„´-,ÄŽ½&áy4Û”ô »þš.r,¥–QÞªl¿Âíwñ³"r³‘ÔJÏ´h´?ÑpT¡Bp¼ úBmæƒôÜ’Ññsþk‡*zÕ‹ö³ÿüý·U~ÿÉPÞþÿ寂èÿ¯¸¯Ÿãs|ŽÏñ÷²É=°D®±*RœÛ=jmARZ3ô‡u};66m-~™dœZ—VÕRgÞšª›í)b¶ ̰òS‡¦æ“™¤=%néɤÞÓ MÀ©ÙB™[ÿoûßÕm£èÏÕaö¤UëE—b‚š²ØÜÿ¡ZÓ¬j¿÷øð•êi* 8<Â3ÕijÏ!)z1æ…};ñ23ui’;¾S]›CV«6ây;€g`Óïx19rªmÚßT‘dåâ Ãÿ+Î5T+  "°iÆ´jVã½¾£]†Û EÅWP¦F©l“*.K¾h¦ÔZD'c£Íc©ÍëÜÔ¢ñ ¥šU»Ù ìÇee2‘Šcæ,M¿ˆ»|^Ürw=ºj®r±:”ñ…j2}I¾82&5èmeÛ®O÷RcU$ÝÏ 6d²îÉ¥0£’Ó¬¥Õù¤#éj‡õÏT[^Vѱ\s" •E`ͨs3^i÷È]k2Êø}5ˆÿBg­’ÞáJb’%[Û°çŠ7h·u!n°þÄlZBm…V1ô:ºb€Ët)I¥ÇÅz[‚â%“9ª¡u0„¹"³Ù¤Q…zõÄ‹ŸÄ<ª¬äŽÌ꯾S\}ºxÕ2”4àÒwt r6<™ëqÑòÀj‚ Ðî}9Uà3žÛÄ_úüð=Bs šô ¦;ö‹†P5Á‚öÀgsW~ån&{-_M±-ýšA¤Æ ’¾ƒSÈbÆ vÇ«m%nÙ¡ªdQ<ù¸·RÁ{6ñTëœ/o!x >-ø$Èpër{¹=Nçj !,99•ùKA½þ‘–ãÝ nù·/ºI‹šDî3_½ôݿŻ÷=¯VnÆgàøÈ$çT³ÚâåÝÉ?Ü¿HÚ×€³bû 7Áð `6NpŽ«}#ှ[…ö$¸?Wž’k®„=$Œ)¢/§ù0óäûoKUÈñ§¶Çc{m[Žú¼œýíéÎ;ÄžŸn òšJl7Ÿš®¥ÓÃÓ¾{!ùSB4…ú|vÝ{ž~-›…ö>~½õ;lŸïѽþNcþG¼þ|‚>Ççøÿ¾@GÐd[é¹LøOY0w!wâY¦Vm 4»Ãú y§•by³åþ+~kZÈvÔúw)˜é",Àð‰KjnÕнîœWKrºîÓü±t½ ǽ8v2ìšÔâ pünï;ŸêÓÇZг:MùÚ¶œ§í"sÃ)( ¤HRî’T „.yÉÖ’‹ñßyn$Ý `[Wøª§Ð]Š%õ‘Ñ´RÂã¶ŠH2É Û5ó®F§þÃ#õ=è¼ -H/TŸ6[-¤Gk GdÂUfÐׄÆíëcxVd’¬'`.º° ÚáÂE å„_j¹Z]žíU f7{šˆÕÞÓ‘Guùé3÷FËÎ ‘þ¤ÕÌQ]¿Q˜@B—áÞ)E¦)ŽÀØÛ8/k‰r ¼r;à a‰æŒꪹѺŠûŒ œiwÖ$fí¡6×D/äZˆ¥›ê‰"¹é®À.^ÔFÊ­Úmò^àÖ+³â‚h”¨¬ˆl†ÜÙ€ Ej²gíO­ÊGõ\<ÀöÆç&;Îòd+©ÅáX™àÑŠ=~Pö™j°À;Ê”´ËPØ€Z¯·²Ì´Ã¹íö[X‹ýÞÖ:ªyt ²÷©i·_—šÏzÑ«Z:èÿ:7—.¥òfó|›=uVgºŽÉçìdk.QlÎŽzÊ?ÏôÙ¸–ØGÀ¹‰6&šÌüd:l ÎQUnº0ÎŽïô#`wØY ßhB9 kOf û=Œ˜äaÑæ˜w&ÙÝßü|D>§€ŸÒx¸áʶBrîcxÊÅõ+¢çÙ~ÞïaññÞ¬;póp¨š¼¢ÿ{êÿÓ)ÿ ØîÿÚÏ‹S~'ûû£/ÿþÒÿ§vò9>Ççø ².LVc—¹ôàÍ¡ãOÃà’˜ÃªÎk¦0ƒžE‚Õ7€¥ÎÛð$6­³À–tºåB­Ü[ì¾9Ùà° 1[-ç·ï3]þhDªÃúL¸´«2–žMk„“«,ó¯r½!Ü!ʵ¡öAÃX˜ˆK·‘·l]³ÓæbŽÍ!Ìôé6)°¬­^»éèܱÝÅ›S§¥4ѹ ¦ù€;¦£î^#©Ã¸ÇíúÞ€¨%sCk™š½:™8F±Å Ñçpj"ß'…&PP<2<ôý¼!¶–E Á²BÅ;BƒæEû,;ñÏíê:iÌ’ëoÒT—¾QÔïBs“Fhµ‘Ç Ê—Dr’|GúÙø*;¨Ùí^«–ŠuMÇ-Ý ñ}¡Ii]I-"ü°‡æ¯øtÙ#Ü–ÓšÇã¬<™ëŸ8Äkœù¡d‹`G`,qíc/ÏÄfÿÜë‚È3;ä}ÛSÍwÕÿÝ–AYG…‚ ;e á ["k_@f½zTWÝáu_'ï zé'ð‘8ô2Í奠X|Ͻ,<–gìáŠý¼äý÷Àèÿ¥õ%Ëå—(òx[íÿˆË¿¡âÿ¹5Ÿãs|Žßº€Øpºö’ቑbÚ· \¤uU¥M}‹\, *ÐT[·ýê4è ñÚxÜ%v†5­Ð3¸#/,a;—â?ä°.:¨Wÿ§yªÔ~¯֑t>/,•fÅ`–b—-&ƒÒW{¥üÏÌOž»…âP0=&A¾‹¢gKò F#Ô‘Ó`ÞÊî…•†‚Ñ$CA¸vïq/ŠH´%¥ia®ÍP\uu9äÛ E÷ªÇçøgŠ[´MAª­zï² SôËâ:Ô ]ë‡õ=§ BE/+Û>ªþK`@;ͺ±øOT¼ä³ääu )ªêÎI.œÉ·ãàZ&¯îÙp×U@qe·ß¤3óªãµnmNSëÒ¶ÜË¥®ÍÉ-‚|ß ´†e©núP¼]´À¸ûí¬Šò†{ÝŠ0ë=Lßö„:×Öæ ƒÛ³uUb¦†¯¼ŒßmZR1}õfƒ½³výÔé§Xžî{\·Ö€â$iVc`ȶÉoM_c£}ñÒð:¸O6ªR‹€–ÅÁ†ÚU†9ÆæsQ„Ýoá¸ÁiáÅ>z{ÌoÓ‚g¾‚¤+Cá$S®‹þ1%ÙU:F¦\=¯¢¢ßÄbý‚,y¥fPàÙ$QÖ¸Õ{ªHñ¤‡I|sçr™mq÷ttU$P\ä°Rºj?“ʸ5¹!BiG‰®Ž:k±Þ$ñ³j¥vÑßõ£Œ©»)vÔk©²øðæß´JûQíº›ŸMR/‹•ÿ³û²û²J³j×mø…™6.«íí`vMèÓ½x;¤L>ÖÃ!:M®Uê¢!õ-êk1ÙZ´E¬¬æºrËgb9fׂH{ÙÉÛ·ÉÕK¤¶}Ì®²€ÖYÍR"äƒ{T®«+ìÊs ÇÆAÛ…'ºh¼ ]¯ •n<£5n×g&@6Ÿí¾½êÍ;OªAÍ®¾,Qœ-ןVéÆÃ*O:ãö,] ¦.ãYéu¦mW[ÚP(åí5$27t ¶oðR$J×VVs¨=pÓÓµè˜÷%ã³ÿdÓ*,œ)Á¨l›è¶/b§¢ŽÙ.c¿ÞÛò¨¿+šœÌ·äN‚kÄ‰Òø^{Àº×.#Žïô\`¶÷‡ç€íþmë z1‘ÔHè³ÍÍ$%x¯þá÷¥ÿ·¾Á¿X5柮‡üCŽâÿ9>ÇçøGº–ÎL7m5å £6]Eâ/[Äš—‰ÏV´í_a³^rãïë²>å² èÅlÄç.= BÒ~·)³`¡ÛŒÍjçüàþ(þÌ'ÒÇÊFº¤ ×ÒøP mf‰Pì6ÿ:έUêfH´ÑŸ«øÚuJ\,‘&Š-Y η‚‘1,ís#Z¶¾lnŠ›9m‚ÕÈ<IJå+£›á"Ê×(À\E¶LC ,\… ¡sí¢™t(Ou¯]Õ»Œ·A‰UšWŒàXœ˜4VûÞíR¬\Viwƒ]S7ÞfëTÇí›ÞÛnç‡ÝfµDn†MK&:›¥÷»„ÝQP}ªÞÓ~œV›ú_;ƺ)qV]ìUúŸÖa£í/”Üoˆ ¤¾µØ5\ZvÜØ´+SâøPù "V7º«á lðÔœ{¶ê¬!a¤ÌÏÒìÖ†ÅEòV¯W¶ïRZAe¤yÏ Ÿ‰ë“X!ÒlFýì?¥Ü`VËÚ ¼¬ãÿ™m6f¿û«£uÊÝç:²|gSK/n‰,…1÷ö‹\Vì¶•5 vÝCí-’‹Eªé-Dˆ$‡9›µ–Ì)¸xù^fBŽrI¯˜ Ÿnæ¡„É·ï*ÿʸ‘XÌ¡Õ\hÊΆG¢YbÖÓ©uaå ½æŠÑO/¨Ep¹47hcÄe«õúnBšûv› ÄG›ÿ»‚ºp€UýÝÛŒ´é- ™T>áþ\+ M±jÇ'5&ëwqJìüw5?„0sIæK ̘þ!ÚߺÌï<ÃAuRÒ&³œXê²0¨ðïýíï†h«ýí×Þѵx´ ¾þ ÿÁÞŠšF@¿I‘Ò éÁeLŠU/Á¹ˆiZ—”h¸FÞ`58 t^Dz=ä]x—ySRÖTÄ«†L+‡ a>÷^¯ïÞRÞ`Yuç‘öå½?ô ìÌïÂwº øFØGß|-RÿœèÿŽóΤO€ÁçøŸãsüÍ˼] ¨²µ„m¬#€Ò`%·¥ãÕd\võÛBÆá.#žù@£á·q#ª_§¬pȬ<[–¸,&ÑvÓãŒ"ÎDº/µ|©þwmü"/‡àg•¿4LD IDAT­‹-0£Ã|§…DzÖa¾®µ_¨ V«ÕÒ²ivurœJÿ´ÙU]1¼(àÞVQ¤ý|ËB"Ý…>%u¹S7f.´@·Å «3Iu2·¡Uk‡)Mkü´HC‰«²ÛœYÇS IJ(GSg ÀT´¾U“îÝ3—&¶Žë\ªá¶ÒtÒËì꣢¶xÕjÿ±Zpϯ<˜;˜%’aæêRäRi¥.˜ûêl «ÇDµQã7Æí®uä?‹à5i3u¨l½ 4ÊZ˜¨ôªõÀ¥·.?éTZÙõb˜¤àZL™+°ÅÛ¾WÇj‰-·K{ÕI«ÄVá²ìµ~…It1-PY‚itït½:qXeªH÷ÊøõQ"·+YDlß±r…'—{ÜñËì2û!Q“[¿ž°²š¥ªÜb죨ÿ_‡þOM·Ù—Á̾:A¨ZÇXqèþ³ŠÑ˜W³ïªbIºE.¯ Y'ùðX[ÄP%ãݱÕùÎ-Âr}lÔöÚó¸B¸R¨Ã®#ZLäìêàŠ´]é™HwJN|?û‚ï]˜‰ N¶—­ºlŘCj×Ù'ì>)[îãyBíÊ虓=ÈþÔþÒ=û©—ß«öí…uiÉAD ÅÅY¡7˜[Ò'¥¸(?y@"ß?é•1®ÆÙê™8ˆ×õaŽsa& s`JM<»hÄÜ…õ‡á{ ìœ ¿…W›pNö7¶ü?¥ÅÈ é¤Ü |úÈÙjÛ ux:_½àAÍÄÆ™Ê/}û=µ Hˆ1ûÖXìc ¨¿ï‰™šþÒ³»íl²ÞíÛ–ø$xE'N\dÂðî{3÷I™'ÿÙPL=I¨>¬e­f³Ê˜¢ |僇›ûN5å›Q®þÆ]h0å 3UÿÕÝ•‡s<œ)÷ /¿ÐŸ¼DÞ‘üKd\>þ›7²¬¹10 å ÿ+ÿ¿Xÿ©ëÿ¶Ìã3?ÇçøŸã¿]˜pÓÐ<:Ì:$Òm&e±X…àâÝrëc€tÐ)Õkÿë™-U*z.»a7:aÜf\êØEW[`Ê"&n ü*K¡¤kn Þwh¯ÕÌnÃ$Ôå»o2Ù ü,u\Û!=×]]*ÞC=÷„¥w*@ä°YÕ¨ƒÖÒ5ýVx×´„&à©« gcšñéÅV§ºº&6S‚‘aWS´§…yóM$xJòŒ ¤Ø$‹à\kY˜ÝmüÔË_¤7BûHRIE§Kwµ¬Íï º~åÞè–u"G:Œ{°Ý›w»ý窆käè^«¯¹ÇT”ÞŠQmåúÎQW¥ÂDidYAgJwÎ12.,tµ³¦v7º*¶˜Zöøâ¥XA§$ë8D@»Ç¥›õŒ©ÛV«·±Z†t+®OeŽ7"!`TXRùºø¬+@|ß΢i¥ÞEǤë„™``zÀ³V¹¼l³¢£Iõ‘CÆvÐþž«£öÉãçê7*2wHÀ¸Ó¸hE-=¢Â®²â‚{s ̾zÀÌx¯Nï©"t¶¼ßåƒ5‡2g>; £GdpŸÛÃ[Å>3l±‰à+­Úzà 6¦ÎI£¢¸0lK7áb YÈ(æB´Ív“b}Ò ¤ úâE¤v=.­h³ÏÏ·p»˜+’}žA$:nâWÀhl•0…†»¾ _šu!ZFÝÍÅ¿~Qþ0ºç¥¯§ ©åd'ì|ÍWƒÝHë¯2az:¦g£}¯dÚxxNƒV ¶ç´R-·Œ§4zÿ9ë…”ÂÆƒ|ŠÍšêËÆyåæA}i¦Æ‚ßÎÑÞWV/yÙNøØ¾üÏŸšHV½Ê×JŸ¥^‡á’Fi^Ûƒ6ë½A˜j¾2àc ΗPaS4;dB»‹É'ÅÜž3Š3˜>SÍÛÙÜÅán@îןs–ñžɯÇQæ-0núN߯v3?^´J|CÞÎ?G{>fÔœfK6&·¨ƒÓTÀtiЬ&±ÝÊ÷g£?¡Õã;×õïd˜O§ˆý:óð럃Ë'ÿÌËîå óç>ð×~©Ïñ9>Ççøÿ¤@>€ðŽãÒ›šÓÄëÒEð¦G_5$(-¤ E¾úµH×ëÙ½¨uÀU‚\^†js›á’…qò•‹UÝuÌ{ë÷EÊ☞ ´Ð£Òù-žö;åöë§"­K÷,W¯†›¹¨½®XMÄ-ÂÆÌK`vòá^ç—cz”^/i´(¿„çJÓK<JVÉaö•Ï ¶)ˆ”Ñ=P%-yÞ¯iW‡À‚µ YHËÚò5$½ ¦J¹ìÊ 8)Çs‹B¿a´h+—ý§t5ê‹vϤ:h¸rÒ]"Ñ;?Z×ÂTÃ1FH…Ùe¥tCýRB˲<7Á½Ük|¢¸–ÄàCn›nDë-#íÍ<™ÊÔŠ G™!íøƒ“DI¡ÈÖ¦T8׿6‚¢ˆøÓ)ÖøV>¬«®¼üþØ ¿ôíÀþí ‹Á0ýCª“ó&OiN¿”WÀRí…>S#š±{9ËHˆõéy›o«ÕS<XÚ[#RxÃꈮñ ù7,KVÔrÈôÃyd ,3Iw…ë0Ér²Ý.´=ð£ñBôJ´Ð­DäFþw„Œ'êÚé›Nad4³†îÜ’Ýoyà¼mòhªEb»¹žî¹öQ¹æ¦þ[ÖÏg®‘.€¿,Ó©àK®ÉGõ&D’ÔÃrϗȸO›Ln]à ‹íïÈU¯ûH¶êƒö:ŠÇÃö]ö‹s- o©ÿï)w|”’aŽJª_3AQxúù„ƒl šeVçO–‹Žn_Ão ’™Ù+OÈJ,8L“(Šo–)G(? ?©†ÿ›î¿J(ÿKuÿ¿Nˆÿå'ÿ9>ÇçøŸã7-¨ÝlúI±ô»îMq  ©„hµ•[>Ø|Ø)-B“§ÆQ›ðQ‚x}õõ:±œBŠv¨b® „SàózŽÇ-l>¸U[#ÍÃÇm‘ÓWè åLi~»C³wÇ <‰g/ìW»Ú‚ ÍòrÉK±«ôŸ©ãB•*ëѰòŸ1]Ôfi~‰·õ|pœÌE¼¶’U‹ó%6S¶•qofu!žÚ¾T®*›°e®Té(äe÷ÙûÌŒQ÷æ¦ÍDå(0úòƒ¦5Pƒ5|^°K¨•V*îZ“Ê“&ô2°ã¸ôqU¯¸‰ ó5¯JŒ{&kÂ]zê« ´(1ˆì™š¦cžçÕI×I¦îí¨4?ü^éD¿C|é£ê¬Ù-·,ÆÚz•îÁ̤§$Ý·C¾T,%nèy WicÀ% :üxÖó¤$`Óîéݯ”ˆ@4B6Ÿ?áÙ—Š£œ\Ø×B]Xy"Cœ?&Þr×s±õá(Ê+ýLzðJ[Äö^3¾:ò œâOÿ±°­hçvz p=kMܾȣþÅíuì¼ü£§’R"u%mƒÙƒ÷¬½ŠwÛu2ƒv¸†8Ûúßg+ùxƒ8ÌñƳòüÀóR&'^)™8†á•í^s{OÂÞ3·ó¹ê÷”;OÁÃÀÆyN°Ÿh"yGžþKößVžÆ¯>+üNÿÊÿ9>Ççøÿ#c‚ è<}t·cXÏ-J™lŸj_Ó‚ QØÑù SC)² ÕØ=r-‚ËÅ\Ë,­Ò.ÚeöƒöUõž²w’$CÉZT±|N"0ài¤\+xJu¡ˆn8EOBª¢3@R:aÛ¤Ÿá¯ä°3wuû–¿Bc±2˜H7ì¾VoÓ1'¿r9JuZá4– cú¦§ÀZµ°aŽ ȆpøX{žgy§~'ÜšZ ÃÉ÷ü­­'3¶´™Í¯ö]Ìîbפö—h6„'h‡½eÈál²c¡Õ»;©y}ZqúÚ’à'kŒ¥Ø;éRuD¿N³™âëmø£û©[’jW¸¡jwÓyýƒ¦Dþ†“*UÐLjeb¾çGpDZÚì Ñ,Û<ᘵŗݷñk´¤˜´•u+5­Ôhºkû¿­½4┯Q0ëÈJ?‡H3ÅVeªÆ.ck†Xç¦JGqWØHWú Œ5¶e«S ãüq&Ñ8 ‹Õ’> XgÛàþ\eã5’릧Á•"ÆI¯¥êëH™¶Ž²DñuåMõ̬úwõWUÅMŽÑŽ]Ïõé—JºÃxšÔ7 îøh­^˜NµfÛB¿-~÷½9+^n‡N›gksj×Àø·.·\œøá^yxR Óö¯Dùák+˜AÞÓ3ÿIah{1ûXœ(CöJýßO¾/“‡+IUC¬ÙÀòrÑ~Ú0íàÆ ©!a}ž³óMÁÀÇËôœ¸²DvidI‡\J‰?}¬NÌÊx($ðIñÔþcdg†””iÐÜ3f,B¥°çKÓxøR<˜]F<Èå>NæÇè”ÍûZ]}¨§nƒxKFLsÚRBß6«YâP¶<<;!Ÿ¡ë+»2¿B'·k#ûFáÕlq âùý­$ãŸ/ZØÏ½­þ[_ùs|ŽÏñ9>ÇçøeøäÌ"ŽAN'Ñš(elnMhÜ€òÚ^=1Ъ\ µËL—u&uG£ÌUWíb‡ÅµŒí4ï"1·WˆÍ\ú”!ÝÕXíÿ†²u@¬]Iµ«+‰eÆHè1‚&â³9#F‹­”€jvò2¡1šá"û°t@X @Ú Å$C¸ÈÖÂ7g¸J’*#* ­KÉ·ÚuªÝ£NÖl¼ÍvZ/»‡öWDäå¨%˜°J®ºÜ¸S8³Œžºû±‘²ʤlÆjh×Ý#|ï»S’ú -Ý$>åò…¶° ÷”xI[‰×Yvï$÷óÕôÏ®l¬àY—S=K ãß*nH|ʆ_¯6F (rÀ,M;ÅQŠh&Oƒé© èÃxVÚæ—U–Wd“aÓÌôàñä*9ÌÒQ¿bÅ®ËpY-v× »­˜+Õ, šÒT°¶Ü+{£8¤ÏbSxxá„ú›¥,9C;Q éž¾cÉ!¡ÌÁXÖ<êk6‘*ʽpvW‡e77uÄ^()aj±ÑèÔ6>æRGœç––€ÝÌ(„¾ Í'v¤:÷» °óìTe‘ýÄŽ·Ç6&AßJ¬Dßø ïkâë²ÓÞö‘‹§LdÔðRýfqÇd[w…ã\…Páo¡<øøƒ;yé¬2¿T2c•Ú×¹aR™åûg y¤ùÒjŒ{,¢ý­ªÿôï¿Ãó4÷:~ Nç¹âß$»ÿý·™ŸºÅçøŸãsüÞÛš¾{0cØÍjJ§"€JûpÓ›]÷.íB÷A7 ªÕ/c+'À.i§ŠÚd¬kå‘VX)Æ»û‘8ÐüìSžPѹýÀí¾íGµÒ’N¯^ _‹£®ÍGÒ,w LÁ¼Íé|ù”¿º–ŠIï¶wa/ T±Âš>ú%2|èâˆ[lü„G¶l§7>窕[Zy¦7”bÜ.ãWÃÝOÙf·«7@YX×E'æÂ‚ËÙ~HDѳ*MZOömè_ŸœúÚÅ碸ùkt'+°kdTB¡Rí·Fm`–‹šÿzí‚TpŸ3»úíÀ̸æ hçTaFû1:$Üþöžþ$kÓ£àöfÜ ê =wDu»b4¶JC5»avu¯tˆF€–ô4N,kõ¡*>_«›D“ œz«ý¾âß,Eò%C’ ¡aÑZ®À¦ÕÏvªô»$½ÔvuúTß\ßþÕm¨VŠí6þaøÏH80öàMÝú"˜}Æ…*b\âœKÝ[êp¶…ˆ×‹•ä÷fÍ?!KEe áuÑjHe⛸Z4šØt1v(ïœ óÚ}öÿŽ/¯£Àý÷òûÓko=@°Š9ZW•^夳wWþe¸º uhÒ+~–Rö G-ÓKE»ÏÉ©£«½"(ygïÀÙ= OŸ#Œnƒ–̲ºjxï‘ZÍÌ®j÷hh¸dá>‡ôÌ^ŽBݾE¦Ã(#ÛøÍÀa6ìϼ¿¥§Oë0ƒ¸J£-NR7E­–æ«_¦Ñ©\a§JË…ˆ³Á==?„s"š=F¡‚Rå– É ŒjÄŠ@ðQë3Ù:%bÔ zÙWï)Y¹¬þ@³!ÐSœæM;®tVn“©f–XçæH™n÷¨Žy÷hÚ á2˜¡Ãþcµkä ¢u›±Úí2+¥—WÕmé‰E’¹ôÖI*ˆØ^­huŠ!¬’2Q@ÂlÃj÷”=‹æªw:ëB; S´4<°Î1*Ö¬¾EqÌÂ䪹\­Kמ0Ê*•þ@chäª;΢¢^‹}¾òØœÙÄ+Uô‰ÎwM,P%N”R‡I§ F·œvàéÀàѦ(YÏîËîºpLð¾Îm¨O.ƒ$—9¾µï!¢TV桜 ¥Å*›eŽ×D{ef䣂Ÿ’9Þ¯ã¥ÀŸùúÃéÃWÎø#å/ÿ"·\œT¿„{<}á0©Ø ssT(ä¼u9x¼“ðê^(­˜©´À¦Ïð‰ÔÿþLɇ˚¡åô‚ê?Æ0ünÃS•¢ì ·Š ¬Öv]¾’„§ðž/­¡>©–½õ1ðA(ÿ³Nó¤èÀï Ø:uøÞdr˜7ðx¢F0üs×…¿þ#¡\{¤Û}3ãz=³ûÍÊ“æƒÙþÁÚ4þÞøÜÏñ¹¼Ÿãs|ŽÏñÏ*˜—]–ð'ºsµî ·çž¨pV+Å~ÀnˆCÜ2q#˜M¹ÓlÔefvxýPšª{ÇÀ=þ\•=Ë[ÅØa—nNóRºGøë‡ÝÕ~ '¯v$±9ApIWÕ]¸nç,«ŒÑû¬óRì¶zÓâ0æ;ÅdV)¥÷=„¤ÊÉ/®fV¬˜ÝèÈïv=Ñ !°«5 $ôeVîAZ0çg‡È(ÉvfˆãwûjìÍ+? Êf ìöÜmS¾®GkLcÆ! ®§ 3WáÈшM¶¼ÖvN±×kãÕoG»b_ó ×lQn ±vª«ÊR—¢Wý6iê“hßÚAZpñݾÈ=KíÂ܆?ì‚]°¯ÒÏÒ¶2ÿ’FU6úd.a5s$rÌÖˆ–ÒqgYœdöj÷ëEûTl•»æS/ªV ÿ°ÄŸáÎú:-üþI\ ¾ÄB½¿#<|àpðºÏ¤y/*œl”ä7ú-úŽ~ž_-Ý>ÁʵbQêÌJ˜5234¿:êNÜ$¿²ŒÞO“Dz·™^nVŠÕbõ‡\Ÿ:ž²ÛX­¶Ö«kå!sf›ç8Í‹Q­Þý©lý7,K¬WçlÑ©O”PÔ8K'ïRÄ BÛÆYO¨E>ƒ™ô=ã›ò‡ (a)KÐë5æ ´ó*¾s Ã-;Ü <Óþß{¼am“&ƒõ8ì©ÈMz’7Ñß,ð2åÒIE %( %rÏù=~Y˜ˆEëé1†ûê~Øò-Wòo3f¦`Dm.Ié4׃VvÂôcΖ[d¤z@3zL:aɧ͉e\3xÔp¹d„M­‹ªò‹ÍG‰*ÑšN’åÞYõ ×à-mî,¿#Ôâ£ß‘ÿàçx€·³Gá> ÉØæÖµ47ðI°Ë¿@ÐÓÓxÛ thu.äY¤P::Û#à;·°UtÜ»`W0-¹ææÁPë1¬I+ªIþÓþj/ZXr_x gøŸâú–dö0Ûøxï3*0^ž$ÞZŸ“„³ÁÿmU7MÁë«ú'¬ÉyUæ¯:sõŸ¯ÞbÈG-²iðáŽãïpÿôŸà[™áùŸøxÒ¿u?jþçøŸãsü‹ çÅÍì¼Û=8H*R_C¹¾'e DÏù:=­Cï=—#žÓÛ>}”´ öö…e­%—k•æ(í¤3ÝÚ3À¾À¯ ?ʰWoT 2Cï30g¥t¼,püŒ“í*L»\£ æ&ez´(´Z¤N Ä[v³p)Vi7»¸.Šñ5x ‹-³6B£ÄRG¦ŒtÙ…€W ]ìMÊ=°nbmÿ]†‹³ˆéÛ$ì1¤¨Íâ ëË-Øè&‘›ïN6¯£Qƒšau-E©Ì.¯ôTÁ†ŠÝP?eöÔ1Òê’Œ1r/Vlƒ¹<=Í’t;ëÒù*M‰«eàAj¢M6í»Üjw±Rí2û1«*C³.Cj×t©§+@{^„êÑXÛOl [RöÂ*a±Z\«Áo–…ö³¨#ÕxKõʤ½;8®É ¸éX(³ccÏ3À‚„Ѓ¶(Œ,xqÇé* ”àaw UÏVÙ6>«Ä`ôb§¹ú¨)ŠÀ‹­³‚âfŠ!ï:öìªcø…9¬ò nÃmø2+f?FÄKéw§~Ù×m7 ´«X¹F±P “-Ñäö$•f×J ‡LD´f™ØË@:Ê™IEå6W˜™e7Á¾ÇJÌì³ÙØh!U~­Òf° »÷ÙžÔHØ0ŠjWÿgÁšà;®¶L”].„6lÑç]¥mOUåY„¥ uT’öº t~„é3´lßÑ0{âÙbú+.,!|©z¨Dæý·Õßd{¸íx|4à‚Þ¿õc9bÔkÐožÒâ Wšß§j²8<æ¿^%_\e¾YÑÁá§ð_’vùÓõuNý÷ÿ?}Vÿ6…œö9>ÇçøŸãß^ 07Ä霼¶íèzLüä;÷-Ѭ©×Øá—Adª,P IDAT€xuAcµ[Ô ”('Mß´MŠ ‡®=óÆŸ¶Ñ1À¹ƒ¹:mùì2ÜÆ/X½ìÂæ™kú™ÐXˢɓÎAßµw§CtÇnu ±fN)ãðÌê^½ÿß÷úÝ¢kC+)]s©f,­ÞUWîî©\»’‘7 ¹Z @#LC~šzÃ)ñ ˜Tñêy›Ýt¢êj¹IWºšu‹ubv.Õì²:{/4‚U?›í—#ÚÚƒz4öy*Vh_w/#F]R–špÀ¡óaæT³ßµ†m!­ŽŸiמ1«ÑHä§`|Ö¶zˆç‘B 7É¡…Hf´Ä&oæøÔëi®|ŽÚ‰°GŠ^“й©nnnÿE³ÜÕ ¢¸¡]‚⤬¯ «0åœv‰‡ 9º8Ylš FÑ”‚ kÕî>bËjˆ$å]YEy CÑkI+°Tßæ"1Öh-ëk®z‰ä–ÃóôŒ (ÃqóÿD©(=‰ÇØÊÑ3ô- 7¤á¥ÉÉÅ2Ÿí¡hdyàÌdhžx>[…›)ušqQ^Ü«$LMÖ[Ñ1þ)8DÛzåqCT913Ãr{™omðÁ³þÒ’Ä‚—ÚAŠÄqý[öF#ó2LjÉ×á¡ès†´drÿ~Ty:Î`WÉFÌ_ÿ_BÏÈ&¾ ÿèL¨Q@ÖöÁ‡úˆ< ¡e“Izùü'ç™E¿<¢žÌÎxãx–M÷¸#z¯<β Ýë/Ì?ùI…å4_K½‘>^ïW^éz/‹F¿FÊDR}I—¯y§ÝÃÜÁóõxdÅô5>^TþB S-þ $;Ïgõ2ªägοèg~7ýþ7±Ûó7»,Ÿãs|ŽÏñ9þª¼ßÇ\((ÅDϺm±4Ùò¶bC¾D~Öå'í[+šõõ%B?Ll×”4BZ©v‰ }ž]Gj”~·dNNÅá2ûF~„ÖRÈø%>èüØYêê¥: F|ë4ÅÛàÝ7íÌä<§+_¯†ž¦ÞZ­6¡°öƂҔ.±-Ñ­ÆXn'ÐÒ•y-Ö¶¢»½PHÃiSÆ›¹¢§á•ùeê_Úé­\¯ø35yí»²<-ɳ(2·aUâ°I†7³ÏêÔøO¡jZ˜—³xoW]ç¯â‚T1˜B­ÄêxGu—/[õæ“Z€›®+Ÿpº¼ƒx™w‘‡Í¡Â¾f»|åÏ ¥_ÀöôQ„íèÒ‡}±•Za;„N@Yeƒ 3 ƒwž‹¤JŠEÎ{$¼sÝ߀!:)&(O—çáþú#Ð:N\-‡kVx (ø}Ða òÞ*BD“s­™£˜U+U®ä—4¯»JÏ]¿¾¬ý• «3³4ZêÀ×ÉE¤“¦¢ƒ¹ö›NÏš,f„s>XhZLY¯ʯΔ½F2|*¯Ÿ( GÑZIM:$;qHõ¢ÈÜB±®kõðyÝ&e†ybÜŠ=³b$•Kxõ_ylóÄ\‚ús y_cŽ+Ê[¾ö¼‹j ó¦ƒ—vCÿ~œiÏAQ8Ö;›ä`îi*¾ C«n1®&Õ¾íàÖ< >œi7¥LŒØð} :ºÖ¹Ö4“¼èÎK}Ébû?µÀfnÑk–Ô?bÉ!KÿÏÞFÀz^(Y¾$g­#êØ¥0¸Ì}LöœpùÀ§¯<—Í<èq×Î/Xuá^g.eyBö&…UL#ɵmÕ-sMwxLP”H|ÅRr‰ßÄYZ3 —tÁÕ-hS1Ä£Ò»\¿¦ ”#µÏ@*EDë+ûTb G²´N½Ú1_V[tLJöqøýûÙïôˆ%—® £N7Pé6~¢L¾bƶ(ùò <äÖ–zÕ6ŠPzB€Æ’‘MÍÉbTÇ ËHk;Óÿ·æ\ÖœëKž.þÔhÏe±áȥƻ’zÅFÂM ¦IF å\嘄°XÂYRÛK’sBiבòœå²Û»›‘… ÁË xEìï œÜA›ý]N.æµÒ¶úžà¥~·ý¹1J1!ª8[‰|¨Že TB£ —xÛ®rœ{ýg¯ 2ƒs™?l“æú´‚s[fÎÍø7¤÷“Uæ†KÚ±csãâxss/Â$˜+˜oØÑí4޵ƒ'ÚWš~wÙè¸êW¥3ÀY'gUz[®9( Ƙ›i¸ªÿœ•Ê4pns8.å/\÷¤o<½Ç±ñÀÍ-> fÞï6×:=Ô®Ž‘¯enÜõo댫`ޝÿ½gC}]%/\¸«sËŸ9Š¿MÅæéô}ùxw}ù0òÏæ{aE¼7û¯=uøçœ–Ö>¿·÷öÞÞÛ¡– ذt)‚BÔ÷Bw‰‘1Û®ž~9r¾x—ƒi¶•RÍòIØlqÆtÅ\·X')Ä:[¼Õ\Œjvî ]•µ³WG¦(¹q˜ÙÈ^d’3,ÅËÐ:ñv9Ð yðèc¨uaD•Yx†€GÐö½ÄßSŠÖÃòqLVj‘v p(eÔ¢3qÆ’`]D™ºb0VÔ;F?w€¹/Ç››×fý¥ÕV3ŽÖê຀§FÒ`k˜(œé+ä¾4 ™Ç€Ï²“KõžÜ-‰ÄMJ%¢qmÔûK¶ž³zö‚zZ=/6´®Mµ˜hžè3ïºËêKEGK»­Š{Å솢&^4[1ÆL£ð¦Œ00Y&šþ:Ô«1Ò°… F¤i6Ä8²d¼%äZõPYú)|,x‡ o¨®÷©õmâZć@¢Z´kJês‘—ÜDêlK¤þ0Ë3 ¾]5"ñÂô)ãÑ5qZØ’Z#vµ‘ˆLQÁüú©6Õ2÷å`¨š–±ì1× •sÔMëÓÎyBQåò)@u¤pɃ數ǹƒÁ&õßvìï©»(Ÿ ÈyHÁÔ[ò›-EÊÛÂ̬lâ¥fƒì@àî+ËrºRÏÄ… ÁÝ‹© PEeYΠ°¸jXn쌣ŒªO’»¾,ªÙ †ÂÖ¼ °¤^)ƒ«`›ËtmŒM;°6Cðzll¥dØ+é_:A×w[r¡‰™XS×pÛ],o6òŠ“>gåËãVHÅâý<»MìE}üï‰\ÏqíQàcRüRyáf¥äWGÀ›aë‰ñKÀ˜¿ù+ß8ŸhíßË€Þ¹Møéaõ3ú쿳2ýŸ~°?n`ÜÇã»·ØÛExoïí½ý; Já^4ÿÖNªMµûוB‹y„K3cW\øÆ `"3"7C—m4V+B™ óµ †Ê?tyz"_{‡A3hŸRÀÞÅ Ù«¤¶.èŸÀavQÂñlâµ–ÆkÊ%EHJœι£ŠsçÊ…š°_­8)âr‚·òð_:ÌNÿ§Ï.ž'&¡åG'; É¤|²bA÷t·h£q›^Z8¿Ð÷ªft½‘Ò+µr« #2²>,¹D×,qƵ5!~~èqK§-<ÆÖ˜42£D[{Uµ¦¶€£8§fJ»`”ÿt§!â)Ë='`N**”|-|¦—Y;Eìb)¥éÖ©=™’ˆˆ¹0™˜ÁNôSqX‚! æïÍé›T’ÝÚ;Äb…†S,™ËeáîEôL\óš™ð86a”³EÑ¢Ëkí·O‚8eÑØÈ:s¹±¥+A…Õ®Õí4ÿɰpx7€ýÇM‚£·u­ù”Þ¦ £‚zQ´9)ƒ™îmS|ÄföEõQtDïÒAõOŽù¹JïÈEqhá\x¡ôÕFçÓDÏÐŒeËdP[`<yt®Ä¤±hÙKÒ¥Á@²Xô‰6Ôa?{Õ¤JS ˜ƒ"² îK>ä«û«¢ê¸¹v¯Uβ&'­¹,TuýåBw÷µÕ_EÚÊ^¢LÞ[¢yg–àZÅ|À°U”f†áô XDLy¸—I6½dÅ ÛôÙðr• Þöà :#wRïvæäú½W.Âv2gúpL'Ÿ—»Aqd/ÁMËØ¦%ÓÎä¡yÓ±îÐpB|Ò¬ŽkÃ× (=S÷gYtu׸“&Ul½ JEQäFû&ö²Nâq~…H}Ê-.Ä#mÂÀô‰Ùˆæ¿ô$Ê,8mŸâU5/îš"ÓRïÿ•»Ûí¥òû-:ÖŽ‡ßÖÂö·Ì2C~M‘ßÞ5xõÊÊ/ŸŽÕ`Hà;¥uÚ>$иÀŽâßX†’fYl ›YŒÅPÝG9Žp)6XFççB|,AÃþA¨ì"•+5¥¤ndº‘¢EªÙáÅIMæ¼ÌS"IB,JªèßÔub–*TUlÚrK>œ)¯*ó€ü®ë{)C>i€‡á°zØg±Zz„ÃOc`ø/VK%ñÞnc¯….ìëómHcS`æL†YߘUû¥ìÎDÇRon Þ¤ž½ÒPí†ÃZ¥°ÃF xúùpY,  Su"–œñ3ÒfaÊöÅfá7EÚZ ‰2æ®ØSN`¨–ý¤FÚ»[Y•Wã; fz×p*ªåH=-}ûIhsoqz>go'jé)!ÒÃîÙ˜ßάRT 1/™*ï'½ãgX’EêÓ¥S*Y&­Q HwEež l8Ït“‹¦õŠ$Ö‡‰”™'úÐÉ¡Â>‡û°(­©ËúS\‡705¯X²OTDgq-)V5ßãj*[b¥ù€CFŒŠš9×}Ƴt>)¶úì¦üM4ì–Ñþ¹4+’Ž‚ìèåFµCøN)Ö;gK`+ÍoqOWkBî|b>]"®ýU´"9ÇxæÂð)Ø`Õ4½¥Å^Ãá˜úæÝ¸]•ô ÛãVˆ»5;1¿Þ€©W1äݺ>õ…ØRÐzT+#û*×—‹!q¥;ȰÇÎuxQ«ÈÍQнÎíš:€%‘bV3¯eJu¹xúÀ½tn°·jx‘¼ÍI—´·‹tR†s:áË9ä¢ðŽ_”ú^Tœ[ }ê]§Å—àékÊÂ+XÐ÷:<»5~¶€[tˆÛÿ>LüÈIÀíÑÁx‘ ó‡DEÞ¶5\ÍÕWô³íðæÄÂzP:ý0¨ãõØþ®ôyZþ¦Å¿°®ü¯ÄÝtNñðÞÞÛ{{oÿr µäO’ÊÕÄ+ s†DR<«¶:ô¹ !¦È:måE¤z…š&j¸ì{6BÚBYèy• ÔÓÊù‹£¢¡^™;p~Þ’×–i™tJûôˆÄlšKû,íÁ¯uÎW}NqÿJJMß-ÒáÝEÇ`MØB³âR]°£å°*+Ìj¥aç"G9+¼…F[€˜— ·øФÓyPŠ“þè¾Î…O‰µË3» UAÃ.“®Î²¨.83¢œì« W̘‚ê#í´r+‡÷^”±Ä¥xkU~Z at–TŒÑ#Â.L¹O(!­rÞ*Ýu‘Õ&”GÔÍagŒ~ˆ8–ðaö‹öY­¶³Zv»¤öÙR¶mì-Åž\+‹^3Z…R‚]bÂ8XbÐGNݽÛë@£”§Õc?«´Z„‰^ó>ðG2/ÙR†9maì@V¬Ðëî+úÝW«§™OÑÝ¡,òµ~§c(Âæ)Þ¶Y (õšÓãÛ¯T+§“¾ÂðÔRÜ„¡M× l{îwdr°:ŽI”·j4˜Äq)×åŠÄ‘ó¼1Pc>tKܿ墂u©-"•rÂñ‘ö(ÌÿWÕ¡àÆE§Hê¿[ŒÑB.l¸Â=ν¤;7eù2Ù¥%iœKéKžÇ“7ˆ.Âý6ÓØ·YkðûM,ð^'ÍV¾’8',źÜ¡Ü)kØ‹D_ô„$³ ·Z/%*®y³SÃÁ’ÔbÙ»…íòB¸ßµ ‡‹w5.©qòê‚Ý™ÒLˆa„åžù aË8ÂMrìê0×HKWc@™Š”ûbã)%× öhT`yeúŽzÅ»qþRpœîå›o~Mä ýNâìV—OÇq>âµæûdê³ë[øâ_ñ-uñj§xð|I»ÇKÃ;¨Ýö+ê™ÏÌ|óa¯Yøó—à'á_¸ý÷`šð—[ïí½½·÷ö4\‘o—:Âð±I*xۦΠ逰%ò¢âR5åæC*쨑_QŠht¼Íå´udNˆmËkWPðô‡¨jƪ,Õ„¼¯ë=Jždh«Óºxà {¢ò7øÑÎlò÷ÝØ8†Ð3gµ-ÒMS;Z÷Àéz%º–Gc^ÃÒvtD-ps\LjQ{0ƒ¢0šfT]Ê*7½J´¸øH÷EÂp SîÝ«q-§O Ú) xÊÒ­_ d¿ âr†ˆµ½½ø0;|©y:(ÆáG¿pt%ÑZF4.EŽüƒÐÜŠÿÖT>É… ƒzaŸp •Ò² Ëâ|]€G^B.E‰ÇZØ4Çbp¬ÿ¯jÿì³n‹þ¢h[tŠ0ǦìÄ›Kч„„®tC#d3ÖÌ· Oñ†%}ñ <É}R­eþ;h'ÛäÝWà uÅ–6sè÷ãTI7:·JÇO™Gø†ïØ 9£ÕómEÜW~}ñ’ʲFÚ€/ކ·qh-ä!eÛÒNŸ@šƒ{Âjÿ£aÄ0Ü z’Á”>MÌ!1Éé´tí&g®‡Ø×aCêÀV¾V‘_׈‘ÚèvU¦–ÖVEHb’ךèÕ£#ö­úãÆ÷§Ï¢[Ýsòó²P|†¯¾i•Ã/†œO\>KìµR­ÖœÚ¥ IGëá= qÊÙƒ¡ÝwçÞýªšm–;&çR§2ìd&L¯Jù´öÿBž¤ó!4ã±”1%[X¦åjhr'è`ß¿¢ËࡼÆêÌTKÁ¹¤}íÒ3<ÓU¶õï¯Jìç®5ìf ÆNu¥4$i'Á&]×9«7ÃcÚÏE3ŵ&²I̾¸•bè^ìç&ŒÝNÂÒý‹mÿÊÕd¹¹æê^èžX~&‡šÜ&ÿ¦g?Ðdg`ïZö·[ <ß°üú·à;@õÿ•%ðö+† 3<óÑ­÷òå7ÄnìD{å1GëÝŽ |û ðCº<ó„üÏøÊø_ºÁù/УñÞ“÷öÞÞÛ{û§\¨–r/Ͳ/ÒdGš¸BÔ$­ciŸ‚•õ±éAÝ|?,u=Oï¬üÓ;$“ V@جñÕ®é—2¨ç Q¬•FäoÚz½ª Q˜o½XLFõ%P«=µN¹í23“Gz°Äv!4ÒwëšDQµZ(1] ¤sºê„”h)µQƒ,Çi®e{A:m(§ªušóúž””áB'] <ÍJí +‘fâ½ô:xMѼ29Í©MTÑ39o¡<–»¥Zœ[¢ŽW¦3ˆ+Õp> §ÕÿØA+½ £Ye<­ˆ¾FÅõÊ!Wvõ¿]—(‡-ÛÛ«B×`”sY/-wßfqâ¾ðû ˜`ݘ+ãe÷èç¶ÅV^Ê&1n¬QûÜ!05Wüwv˜H–3!t©Ex•ÓKI:mww¥Ï]ùu–fªqÃÚ"¹æÀŒ1h‘l•0±ÂA¡Áp³þ‡ÄTTñ½‚{bÏH&PHŒ»ØïPäZj7‰êor8£cÃ=Q;“2v²žÉ³ ƒ“AùWwÙçm“<í6éø>sΚܢs¡OÿäìㆎVâ–ÏSmŸF>lž­Äñ¬Œó挕oSçJX_™WµÃ¹DÈ`<|ç Ò-ÉÎ7£5Û~!zÖ$MÖ€žfô¾[+˜eŠ—|¥Ì³Pš{ü™^"¸.u&ÍÁ˜3]·ì{Ú²ç8Qª^Ýdxr± ¦XàTK/ÚšU“”Ù,”ƒ Ûm§ðnCYg½rñ UõŠ4 –矜zA®ë×%Ã÷êÿKÒrÒÏ"[Ï߀4äô]–ÑmÈ'æº$Ÿ[7âJ\zˆºª®:'pñ¿q蜻 qe«ìÛ0 pq¶'Hg–[3¹ÓÙWÒ”åóœÞÜ.o`ç|p¯ØòJýç­z]¸½ýò²ÜáF¶„]³ÂôIúûZÙ-k‹kúOis[æØÒ³aX½ áväkVž©ç|™¼BA—gßvŸLÆW†Ê’ö(À%¿iS<7ñÇ®û{{oïí½½·ÿ:‰ï1Eþv‰ s9uè5]ƒœÙ8nbI&CÒk0Ô™"oä €Ct>$C²Q­ÓÚÑJ\[ò*¼ÈÔ÷%Ñ<©¥÷ËŠ´1(P»ž¼ä”?Šhý°_UÃsìºçꢪ½ŽÔPeì:‡^#YlDÚšrl }¢ŠF­}GF‚Y"SÃO‡,^fÊD;¨ž$)©YQ§Y‘»ëâ*À ;aŸf쨾ÔÄ69“Cßá­•*‹LÏEæ}kûüT˜ÙÆ ô?…ÊÊŸSx5WßÁ;›t˜±;¥šÆÃpŒàâI&@^o+B£q k‡n°iíʼ»ú#ÎQg§ÃOñ¤¶‹ÈóÜTó‘cfG”3#£ QRj–cŒƒ… a)kT­/Õ°U„)T+öû=YAaU“§{Ó’þh žÂ—öšÕ£S°ŠÏ\­t0N0p´z: nÔäîMžX9¬´ròÃ>jú†ÛZÆeÆš¼¥ÖÞQýwa ÍYêñYzÔG y9'ÇhžjëRJg©Ú”êÄ`sªž§YR»K–¼Mžq¹+ebÄÒ‰ÏÙËTýQ+!i.&íÁü™<€ñ-ÃNnm[kn-VE›{ÇÄw‰²zD³W´1äÝ’4ælÖþzP‘ Ò©$äŽ,ÈÈlù:æ~Xž©yQÍ…n¯j;¹×ýgµ}Š¹Æ­\­º/£D'õpLsìê°ÃÝ$Œ«ÉÛ·²¸¿¸7Æ¥,¾RMîÕ½-=Ü`p¸ãËíÍÞJ»ŒÖ'íô#Ü­o8*˜¡7û åò‚’oWÝcÛ$Xî î5d<ÓwöòÚzƒp6À¸UÉoÅ(\iÚÜ5+pÿþ0=ñ)+âšíe¶K3¢=­%ÇbêóÂí˜RÇm'Î-)O´E<;Ѹå8·?]»K@±Ç|£/¨m뽬)¹—¡ÿ %“«VŸos¼øù4™,ãŸØÃûô¯Ëoþþ'¼ˆï}þàOÿM¾u]ÞÛ{{oïí½ýÏXVD}Uæ H1Á­°«½Óöd·oÉÂy ¼Óc‘h»Èåê^°¡OJÍlµÏ³—ZÕŽ&f‡±%¯~?$Öx§R_á½a4±¾žöqö"Ùk@êåõu6‚=Khâ@³ (£‚ŽÂ°c|,³¾L‘òiIÓŒ%GÕÄf¦Õþ7U4)`,ìÒçÖ(êÓd‚Sát › žvºŠÐ¨™mžÖmÐaëìåðƒým½¸D=l\,j9Ÿ–ioÛ| Ømg¸Š†KÌ:¹ÀZâ IDATÝk‰^=oæŽqfšàx›bþ46{Kø:tîĤ¬ 3cq^ŠÈCÆ<&…I¥ œÚ[3GL²‘~¾D';ÉÁTêŬô˜}8|X}>>«Ü×µ ½e1×rçÇt—Ù¶™8»šUæâÍ&)KŒ–4ßÙ\I.‚EÜ,ž[Þú J;-èW³x„IZµ†ΑhÒšºYB±é¹#Ωo1­Y_û~–jG1FËÁט…̆Ým=ÑF.KnÄ Dù °æ-ò„ó—ž6ò®÷ÙË&þ . ±‘Sz%»»)#-f•h'eSšÞj~ZUî ØwÁZå=æ4$8ZÑ?1õÔ>¶I Äž#ÙöEÎXt5…Ë›<€ê¼µ|ni³éÒÏdšûH{–NN™ÃHB®´C[FÜvŒ‡bvЊ٧ÙY­Zß7µgLüNn‹÷™<{YÀ»˜Xßfah€MÆø^g©YxºøNL ƒQ5Ó®9é[¥þKjãtLÜ|ŸiH´ #~Êr¿#ðBæÛø³$ç;Föêahº{xÄâ3(b3Âyùc3„skmäµe„9¤d¹‰¸Û¿”uÁÝÐÅ~À_^,\z{¯¨¿"ÞÝçßk|³²ü£¢.nÿ™¶÷ê^4|øÁ—÷Äþêÿ øõø¢fWƒ9Ë÷cà†sõ§øŸ¬¿r¥ø£ßüô§ñ'%uþù [üað÷¶tü÷ļ·ÿâïòÞþµÀ´ÂU6 I¹ãtê¡L‹Þrô¥]uECy;½dU+Â8¿‹`4=¤·v”®„œNÑiD”OX…°t…«ív#MRúb*±t² ¡™Ú¨žVÏ®¹ —Ê’„:PH¹µ¿ÔáÔ8ôœˆjDI´­¢v¼  i~;Ä&enh%V¢dWöò^.ir Ìbsçì$p«Ê?„° e¹ Wå6ŸyT;Ñ; ˜W}¡ñ5ž¾y_cé{‹%n¯V+1¿çm:»‰0©WU@(ÛÒ«ÀÅ™i¹(V«Yµƒf´³z¢oHfâÐ$•Ç¥[üuqλ ÇÆ.èùQ‰|s,¨úDÅ–:ÔѬS¢z™C´Úç4Ãæ<;Vþ­ÒêázåÔàçEÏfÒµ‘QÉ<¬Þ!´g“,óÀ€Ï~98tói¨X2ò0¬ßþuYhQ¨ÐC’®vVûø´ÆbgébwK2¯ ¡ÊIVÄž„v„  ¥ÓtRPDÔö¶£Î ûhIàâÖ¤ûô 4u¡öèàveª¼»šF&eæÕ¿+åÁ–d³ÁÈ< ¥7Ô"ß|¸ÞñmF”|i ¡¶þHftϪ“ëÎ5Óò6•—0[\¨¶Ìm%&Á•ãBcæìõàyÊ´GF¤,„Uím˜sÎã‚Ö,÷›rÀTîdBšpšsü­ ލy½,#pØvñ§Ìðú6BŠL\ϲÈô‹F.†f`7m±B/Ö½ØÞ«?öGç"zúä`µó\rUìg"ßw+«´Ãc9"SW{tÊô[EFH-Ypó½À?M&6êÄ!r[2}…ñ„ýÖ[°Q4ª£µçN‡¯0c‡zµ™ Üçä:EK‡Íl‘×â4¤ªæ%Ç ?”kŽ*{DLªð 1&„­j9RéÙ¤”ªTIÊäÎ&;*Gï#" æÖ2ÒOÅ!é”P»g|5°8»‹£yÈ´\l)3>¥¥¬üÈtTr¥–³÷N¡Œ™A…ïÉ8шbÒ£°¼æB§t)þ%7ø±5ìÔ”˜äƒ‘¶­T7Í›á¥÷² ·rôJn»úÕ‹ ñ-Ê.26:ÌÒé5ô}äü»M¯JÝïÁ,x-ýÏ꿥μ)ÄûòeOÅzÜ©á|.ZáÚ¹ÉO“•±£N{sã„?T¬x{7¾$xtã Zç¹ú·4“M¯Iß”ïž4÷<ðÿ"üÉúÏW{k˃àK»¾DIÙu$ÀOÊJKLúM·ÁŸSryÕü_.O3*þ¶]À·}—wéý{ûçlxïú{û÷ ùwÔÝzp(8ò6§(×x•)´Œ5‹§ÝÖ,[&Ë÷N4êÁñ§‘Ùc¯j”£¶Þj(v8I?ä¡¡\»'r€#î8ˆ1ü5äÒÅ.ÌÅÙhHŸ±dÚ[Õæ\_U”Ï bºJfY·B^NÄ»†:¦q Ìe8M™­ÅUé&Ò‰”£¬gLJ–r'$¢r–ZRø3RWïÑÅÌn?XØBeÄçZM¯ Ë'Ø;Ì‹šryƒ Keèß`4¸¬5SgÃlg³vßÈP ÅŽbÖúQhŸ4«]@l­vöN?0©yxm¬Y©(gÊ+NñƒXp@6 锌Êv—©ÕuÔmrϬµ84K¦ÒÎð±ÄD„XTãi•vV6ƒ§\©ö˜µÔ œ3ÀUìãYï”ê§¥&½®H¬ ×>'´ MCPô FÉÕ4¡MOç ±PfÜêÒya§DuȾ&¹»IV«Ò&~ªàÚàƒ­‡WYoûEQ[g Äoˆ‚Øm‚­ÅJ•¼¦…¥•Ù2±-ãn ÊV ×\5–KaJ臘 ­S§¢ßqSµ¾N•Jsž1NƒBn™ª¹ÛÀÎcJØ$6©Ä¥8›ËòÛ‰^z«"ãðZìM‰¢N^™HÆa~jD#Kåø×jsý8s)wÄö;c©¢à3Æ{¢ÀÔ¢D‡º¯Ô\÷ƈ˜š`_`R¨'¸ÓúB’´òie9€Û@u¤ެñ™>†V¼õŒŽêž*&D~^GÊý‚zgž”ï½²ÃOsÑO±¬ã•H…Ê„Û/bºaa{Æáõ{.ŸxiØäè`r§›l5÷ÞÀš.¼8ŠÑ,˜Ë™)„Ø}Ž^S.7È:ðxuú8 7è‘éus‹Òü^­·ä4ó_èkk«Ð•PˆûcÄÝ€çšîð*AáÆ™nç/0ÜñâùÛjÂÕ06èͬr‘ÃüYö$ˆõÚëûƒø{îG÷: p±OœšÀnÛÔ$xMñúC²¾rÒÖy_ý]{Fãù/ÔÎþ;ü þ¦‚ÿJr~oïí½½·µ /dªj1F(…´ñ.®å®€^éù ;i„} ÿRz§¯RE$Jñ/ðâM]…×SÞ4ɹÄR‹ µÂNKWf[Å}­vT+uˆ°]Ì::iÁZ£Y9Ý“@/q­X·«í`Ï;…Ôþ‡ù©‰(¢•Ô&ÕOoÛ ‘5Ø ¢†šì„Ô—.D¶³ºfv%B½šÞPÇøÑ²èŒDÚbqÌΰƒ¼D›£0 Öâ §ë¼"µ0«-+K¦z"½‰±ˆìm¨Œô‘šXüqªÛ.5Ï/"Š«ºµŒ§$ð–"s©Í…Ìñ¿Êô¨í*“µ¤©~0Rþ­éiSc•1²e@®lxZ«î! ¤pc8A‡×fÜóPµ Wy¤Î°7 h>—Èñt¡'Tj‰u¿Œ×¶ËGÁU|ç^AÖÔ’ê´˜ëë#˜Yß y¾µå.¶+t;66Åü^ßœ7äÇ´ÍbŠ3Á ItÓ¢±†¯¢{of¶IžËQœm$³ÜÆq¯áRv|)laø¶yž³õþŠ6Ëï!˜‘S\hN_Ò‰6ìÌO[o ^¿m>ßÜAŠfAó»Üìíi<øò\Ó² \ó¯S¯œ“WÇäpoò¨¯Äî/%¿úõ‡EäÏâ%ßéË_¡™ _)ÿ¿l¸b+ÝÚ5øBW¹å·î‹»<ðò^æÅ¿üëÓ_qqïÿ½7™7èÚó+,£¸—þ¸ oïÆ[úoïí½½·† £>tît}XÖ«¤Ù0ÜÁ†öMmØ/”\¼|xíjPû=?+žEª•9‰¶Nmµº>±±Å+ß=VÔ-=(ÿ7ïξôêpíbÆŽ!ê©–HºpõuÚ¯V±*uÁÅÕŸ*Œã^óHÑ_ŠX‘ì‘&Ì Ón$wDP6§kîÅæÓ¬oiûª NcåoHòëЋé ë:x «RÖþ©%7 Jû—^·‚´Ä¸ä,¸yÅ]Ù‘f9´é54¸ ö4½HuTÁ¹€V–7p:´§±k+¿ ÿ×G9ˈkÔÂo¿À5Ç$L«ÍʾÐäˆ]7çøq¶Ìí.Ër$ǽižLkÈ4ž‰0ƒéΕOD‡‡ôæßùÐè»^É^‰Ÿ¬;Ìäô¨&tV^AærPZ‚¦Z-jc‡èªí–?wjˆmË‘tö!䩨й¸Xߟ«'Ø9Úâ*H¸né£4<6É€öáá\ Æ5üÀ’a=èòy §ÑºÍIK#Vu«A§N ³Ô™4Ù*£\½"|*dº—M¬ÄÖPU~ºÎca\ö’-íƒÎ‡SÐ4r‘uÏŸÖäM6a÷Ffû¬úíB¹9¿#BàéôÐâäææýIÅì–Úìú­Q³ ±ÇÌp¦~ Èש~G÷Ç “Ó ÎÖIß.bQSÁÈf›dìDã…Øº-$D¹2«šêïj¬Å"µ`«æàBݾYÿ#O¿ëOj”4¬»ùHnÀ…Ö¶â&}O¤Llt™+…n«,cgT|URÁÍyæ% ~ñÛwG•nm ð5†å¦?`³;7››ç¥ú¿Þ\È=^¯¥‡‚Ñä“É …Û“´ e`i¿x¨RáÑ!'¾A–€ NnÊã,Üù¢_v<t_V0ùC1ò!|£èž¯dôûë<‹þMê//:Klóv´ùmìDØ‹pˬ‰I‹©×$×üŽFýE˜ó~q!ø8µ—çù/µ7~_ýÿ»¥¾uü÷öÞÞÛ{û—s1~°qCs1)§]¹úšÒ~¦œÄ_ÍNÔŽ éZIó „«3t.ùÆÀLw¾MÀÇk%f€ŒäR–8ŠÙÑ+p[rçª{JäÈb ¬ö9ˆg¢V O^bæ%’l2RIa‡Ù§å¤Jë Oty±È+²d–ºh1¤ºâ€fN/ˆ"?•2r2Û%(Žh8.¿_êÛ(çLÐ!Ñ UÏ%ö!( Ê„q$‡N 'Ÿ°ˆ^@ÑøPþxï§\‘ çQ*k#¨¨È‰ÝJP•åzMüñ&ˆ×üË SºÍc§YµòiøÿÌ~Yý?;™³_>k—ºöaÙ?¼öü x †öDŒàòk•(—E;²“gr9 ß~˜@4t«# bHË{d`Cšqr6Â{™GGǨ™‚²õÚaÒŽ!w‡ІC+Fm8sñ`긧c2½fÒdTNŽ¥ ,Ltæ]Pjß±c\¯ºë¥Ï€át¬–^~xRÅ)<–1$$*yÀ—0|Sº[I·è>i§G¶Æ÷Ì)#Ól°c›Ä¹¥#¡ªÇ$ÊÌNÚY‡û¢ÉÃ&´xcS¾•ÚÏ›Fº Œ\™±ÍÕ›ÌÊfˆàÈmj‘Á°â°¹X"%¢w¯!–°†[X2[š`3…CÛb®«š 1-îØo¢hÖ¡¶Ý˜7„©ù¼ÑSeIµ#rKµºd ±äßDB˜Ž†šv¼uZàºÓ+i \dýk)Y-›Œ¨-¹^TH^+•© må}çAùc¶Ê4“ú õ0·×Ì—ûJwÃNõÃ#‹Âž©—¶ÄRVòZm|Ök×0ëËà# /…’¯H«¼ß¿ëŽä3öðtÝX&à,š¦ ƒ•Ñ´ü=vÆÌÜMr¥ÊíL`w½ø@;Ã+i÷«zçÃ1Íd¶íh_Œà¿PÛÖMµ^þ.›?*6‘3Ãk ¾u`ÄëƒË]Å‹ óõ²+÷jPn.víŽüàPäþ†xÑqÅo ‰‡± ÿmÛßµ·WQpoõÿ½½·÷öÞþç €†T¹žˆ è fàâqò-ÿ¶Tãg—;?ü'"ðSáãS|µs×d Ã†ÞÔ‚U;üßËEÏjg5«Îá9Ì«Å]Ó)í¢åu™Îÿ>*RK1;ì³ô΀ö¿¡{‡EP‰óÅÕt7ºÂÛ í‹Ø'¼³ ŽŠi:òÂHm3Z'C=ôµLm’ŒÓà`ôªs3+]ýv}…ÌÌ}$̨‡KÚš<ê‚+ tDXÖ:™$¤ópeö´R­œFZ=Ÿ†+­àèhõQGÀaÒØàÃt"JíÅÝ¡k[NÇUä´ÒPô&@sn¤› ÈÅDSEõJ€nrú$,ÒÊ‚¨Vv¶–„#·÷“ ™Ì~äßÕ Keæ©©f±¯,ù Õ/˜´`b¦c]Ì/ô’éGÔYQ™/ØÁM/>'°ÚÉ \è)Ó0;>¥Š Ù½\ Õsœ)9¥µOCíÍ'{ûQFGÂÈ9`ZIÂ2ªeÅIcÀß)Ö`Ø“mBц ¨Š¥òpË÷`ñiµWÔLŒŠšA.£¯Hi-BÓÖ%Nq"K‡ gï ý.æ4:š|˜$ú¦t¥8·`Ö¦‹Rût6ä8·ÃT™\ìµSZÜh#×§?ìNCíˆ3JüCwb¦xÿÎÓEƒB¸DÛ¬BìÄP\hµƒ˜”ƒ(g¯tšÖx¹æ²+û&›OÀ^¦!Fk>9 QA(+×bí ¼G¡sµÝª“7Êö³ŠubOLâ+ô‰:ºW„׈ã—ü«¯á÷áÑorwÛªá{ 5g®’€IýŸ swƒAÕÿ—åÿ¯5V\ž·i0߈SßѬ¾'2ÚuKÁ¢ur=o_9K¿Ï«ÁWäçäÄGÜ¡Wt¬÷jŽâò®E›{F~†Ä/~Î](Ü»)»ŸîÕl¶ƒÝ1‚&ìØ]~üÐÉ}Ì §}!FûDôÿ)ÈþŨ{×þ¿·ÕÆ÷oÿj`UZ™ð#í¥ À—ôæe£Øqxúe܃æ Æ‘ôx(†[¸« Nìñ•ž`Yiõ´ó´³Úá‚{Çþ4(«ÿCÎp|JÿÆš_žŠ¡ÚqØY:lºÃ.š4Yí0û¬ ö.qA"‚‡Iú;Y}V‹ñð—Ôêe¶"îP¯í’•“xZ­ffµÚ§§Ñ*bèŒX°V”êåöuyÛŽ†aoLúWI…±éÝ 9©T½Ÿ£©ŠAåÆLˆVåk£ ›D¶.ðzhÑ™ˆPqžAa{ãHâÛlŸ SsS‘oKÐ5­{ÈЖJýal0÷j4«Ÿ†jöiöѳºå‰Ùs&¶j‹ôrõCù)D×:ƒËòžOñ!-õZÑ:hQ&Ñ# ˜ã»ˆY\+$:-y\ˆ¥,)MSÓ7ùiÈØ_–DHê¹6á2Ì€©®VW1|#Öü]²°gƬOÁ°œös[dçÞPÕƒðÉP=í¤}ž½5äÈy°Í¼<…¼èä|ZhgŒÿbûºrô ¹©ÿõ4´ˆ‹•憺kÈð8/†±ç©L[(=ì 7]Y.VŽ‘Wœ6³“I5+! ¹sìÉà¡aP¡Â­Dö¨ÆCŠ£/j¨êò ¬n iƒ{Q;=Êet~¨«¥åÍIíb±ÙÞ‡;R~Ëă»Ôž{aN‹*g =ÁÛ¤ñëþe؃÷§˜åõÝfÛp“°T¹Šy¨šœÔî-„„q¿(€¾Ôw0t[ºjp­¥b§£íeˆ«àÊëkqh¬óäÓüç:6çpºô¼Õ¶fÎ!ç ê›ËîÁ[Eþây=NðD+Üå$qz\N½GÜ¿jn† ö»q‰žZ.ÕʳzÍÃÇ7+/ù"üÎÅÝèõØ4Iàþ~á×w÷w„WüœÿñX¬ÿ-Må¢-ƒ÷|Ë1Öp™Žo´›lo/ºrEÍ.…~;ÿÜbÄö=;¿£Ys7íüÈÕÿ“åðû7ØÕ Ä·N;þ§Ïö{{oïí½½·À¶;£‘– HVk×ļ1šŒøQ­ô]§§‹¿­žt$s†l·P•Ûƒã®.@* í¤‹8ÅC2Íøi<Ÿùe.„3öPâF ¢”m60KÃÓ·êW8º§ÔQÉ8ÚihñÂqè­ …öQíl´Ÿ©8­žC‡êM–ÓkÕ0Õ8B앤Ÿ4«v4@db­W ¡ªˆ¦\-‚­½ð†ÕµàS¼*œ÷¢löùnš¨/–Éþ(#‚¢«¤…œÜˆu)¢ ú<¨´zU‚Ðω6a„"V#UáØ’{ÜÍ-Œ’êÞc]Hýp]¬6Œ¾”ÇΙ"‡Pû^U1áÚAµPe-~ÇòNËœq¦‹Ö“YN kdJøË&0S|´¦™éUHB$Sé÷²Ža …¯VÙ‚T-aÓ|­©Û:§ªêÿg®&á¹u€"FïµZAʇ±PsNÅ=ÿu°;Š©ÚÁ“¼n*R'’JÒqrÀh›&$³Ì÷§ð©L1r0/úôI—µ4ûUÿù²"Gb°åhî©T9æ½&˜Yš”šý‘Á{š™óUÚtñk¸Môlû´dãx–µèTâã IDATûô-X†ç¹ãÚî}šU«§´£ø!W;ª}Ô~e{ëÀ9ÆÿfZZ"Xi™—¥ÕýâÎvð‘ùç¢9öyÌ-Ñ=“?jrL1QŠ´}Äc)è"ƒÀÒðSQƒAòáR‚ÊT÷68d«ÁµWOéíá´aV„+¥d«w…©ûDÊ!KôCôždz4ðBLlî‘U;!~FÉ}]̶†ÛD¸\ÈÅw=þ¸,ŸÖÌw¡‹‚G˜ní+÷’HÀô4œ(¼X³§]Eîÿ°l"ÚÈ>;v'ᲊ–³g4z,°áD#sUÉUèнn˜Êöq-r=.mF¾Ûž¤á/Vß#×b…y¡on›*^è¶||€È¿ m:~¾$ñ^í76grÞC\þ¿_ÓóP¹¼øúgÚjõêÒìÛh¶¿¿KEÀ­ˆL|Áб閼Òc¯øH˽×ñIá·&ï÷à.£üò!€]Í–änæ=¾Lq¾±¢¹¿ ÷w“qßû2çèNµ¾]s¡¶^œÏïÈa?Ž£ykrß»|Ÿˆ÷öÞÞÛ{{o &õ–zÞR­b¯?ítõŸ’âYŽ ó}„<µ·è”†¨!m•žQSBÆÚƒ˜”ÎØ/vN’ñé^AßÞìO«ŸfŸV£Îúð¶€P:8Jk#WShí1@73èuµì€}4@P oÄyA¹"8¬‘_4£µëÂ-;±EЖz:W´9«9ô™È%nëµÒJpÎd ?¬þ[qá´Ür,º8×–†„´¢ÿ'å(QT –!ÊK-®õ1Ô‡Q³, fªîñ«_Ãs 2FÉÕâ‚«Ú,,U‹pP*Íö kkHtØq`ŸžAÚ«ƒ=Pº©vǧ·˜ÔÞþ2¸öþçÃ|Ð:€e€\Ú]f5¥kªœ¡©iµ™Û&6oÛ"富ԉOKÉÉ¡VsDºRH:¸ß {µ¦å$sp ézELH'MÁ/„ì]ÖÆ[ÁÎh(=]–&Eåœøí¦£Ô)£j)‹Ú0I/¨ÃåRó`í¿+ïæ¬1b£õªö΀³õWÍßR6{µ1OFwWsCá”¶‘íìĶ]Žjü§}˜}Fƒ/:™L Ÿ:Ž1ŒÛ¡»Ö_«•j8»CÆè}±™Ô45iø¬ÃO0Ô®ƒWÛèÔÚŽ #8a²(¢ÖÛT’õ–rA<í¢ä&MN»úýQYŒ¼òçÿ&Ë2ù> 0|,Â;9ü‰Ö_¦¯†I·Üé1MµžªV+ff`å ¹›M.°Ô«8;çdX’åF„L#—"ï¶òàJ•¸/T¶IïÁú<Êí§“@é±»„ù\QÔ9O°¯EÅ£ÙO{ ]V°òZg·¾†kuòzþÙ) —¢ùö³ˆyü¨¿ûB¸Ýa öºó“tåížóBÍ0¦É át³<ì3Èæ°iÁRß½v[¾V¬¸¼[âVÓŸÎɽvl©e×ÏÝNâ²BžOîŽÇàŸ=åéKqÅÁÒ<ï¾*›[ƒžít×/å꘤êœ?”† §—ûÝÛæ.aLI’wgw×â2ÆŒË!\Ÿ“izÙ·|ñÙÔ±tkq=òŠïœšfþBµœß¸þY¶ÄmþÞÞÛ{{oïíÎXŠa©™ŸH/Ê…vÒÎÓ>?áÅ_#C造&Ç¡t"Êôø<ŒtÓ`z¹X‡Ðì¬f´j줱iúl[¡˜Õjìa1ÀÊa¥ Å ¢ 6~Qð%ºH]¤˜ýl9¹V‹ÕÒK¿#×—°O¯Ü7“zmK͘DO ø ÕÓj.HsVÚ d»—^!ÅÈYA›jŠ›ÛQ0«]ä7—^šµâ]*î9½(‡ÍLª™T6§•’ÞF €ì¦›+×bdíÆ’|Ï!}ˆV«°3PæZÆnstmÓ0NÑ;4òWåK„äí\©&1ãèz+KW¨†6fN³ÓXí¬ž\Š.zžîÁ­x2Vi½ô1ÿY §ýêƒ5½Ä#³\(BdSœáúõH§X(ùsÙTÎŽÖÊÓêØ(P8õëþ¸²ËÛ•å”y§€dU9¶¡Ý±“}§ª¨ÉÃR;?¸ ^ã®âœ™Ò·¤ªæÛg°®¤ –þA¥,ùÌ&ŒÏ §ô43«Åõ}çÿ˜™½ë³zâºçT4íy1rØúuã¹± Zôލþ î fõð» Xuw6,uXÊeê礦°‡˜aZæ 1šÆz¯LÖÿùøPé§ =L†Ê.D}óuœçÕñ»WØ1Zª,°ÍÜe²¤šÉr¸u¸igyþ51Øœ.f®ïÀvÛ¢mû§–™“÷é×dñ¯ÿ.þ;êÔ_ìÆÿ@)ý[ýoïí½½·÷vcÀÑ7´YI%Þ¾>«ÕÎO;O;ªÎ/n«ÁÆ£¨¾hìÔø2Jt5_ÑŠ@ÀFpE“‰Š§}Ð~ÁðiµÿoÈ|­nÔNC5ž.‡}t!¬ˆ.Ód޲¾acn ;ªv†øøk°ìK°ld!p*õž€jv°ÿÊ\R;n»Fþ'f*EC‘¥‘Z }ÃnÜ_‹sNL*.µ€Úœ äý”ólR:­9˸NQKQ¬˜ñ ^|¨p!E0+ó¥iÎS“Õ>ZÕ°GLGY/‘!Ñì"°ò¸ìõH«‚`ïtAÜ‹ô»`Š~iŸÖyô)0~ôàÓ£&òtä?×›êÚeõlÕb¥˜V[˜0¬Ö•Á¿L—CôçÙ›KUè ’᱊cI ¼øP@jkX #§Œ{™!=+/%¯|p»~F®dœ”‚dV-y°s׸0ôÏ˜Ž´†ã»«póˆ"×òö#eÞÄÃs!h!Ý‰Ñ ¨«ÐcäÌ´h“6ÃÐÏüá5æ8ŒfŸ-l£ ÷48t¥¸p 1éÎeÌ*ÕG]4šÄ­Ú¬MøÐªÖ[µà­V:/«\é!àì 2_VŒ©Ñáq¦(‹ +‡8pH¹è}¤•y²2&Kü§å`XÑ»¹þš;Òó` yVWE¹Xo9Æö~xL…n¯IAÓšìÌ© q¦0öšœÚA“˺ 9â¦[ùȽXÚ}È4Ï+ 9úÒº/Ù¿j?›¤k.‘?Øá FäŒ? 5ß’}»UÛÍÒÓÄÖÖ%â>²B0@4”‡ãNEàKx7z('E5¾…·J¨Pž€;饮1}ÅÉ}±Ø ¸Û¿œzWáq¯hM®ÕÊ ¼6x€ÛÐ×W óEÎåü¯ÓôÐvaËÓ€ „ù5Ø”M^Å+ñ™ »ƒ«À6VÓ>Iô¡ätÓÂÂ×ÊÛ#æ?¾nì¤ÕoÊ€¸<‹‘‰[èûâ@¾ò˸*™¿ÍÌXî™ý÷&µ÷ÊùæÖXçv(\t7;%f&^ªã…8Ny÷xÅÒõÔjRÞäÁr?·'ó•›qxw ëõù9qùo©Sç7œŒ¿IOç£Áò÷4R¼·÷öÞÞÛ{ûÅszÛ’ ä׵ⵙýISí¤}š°ã—}ÀÎb'Fâú‹pš•®w@¾(êO»qº¼“È:­BÿôÇ]!ÃñÿŒÕêaµØ‰2ÈêñeìyÓ¹ÎjµvŽÐG±ZìÿyLkP\¦G:þ¨º¼~ Ht[#Ö£n•|ÒÎa÷}²„g˜õN8ji¼œT!8oi¹´ ;`vûÙ'í—GzRËñ¢À\•Y©ÜlÂ94šì\ªT‘W~m‘òI`ŽÎ·EßÒ°.Ø8Ô–jŽË0á5•y ÐiK§±%…ž½ˆ8©*¢þO\¦™ ‘ÉWÛ¢ôùÒÓ€í´R{ -†žêºÃaöaøp?¬NãéÁ±x¯pµG4›Yù讃yT/ÏAB¯œUf½u£î;îbŠ·4n.[ BÕ§.íšÁ¡Pt™¯Šnج\WìJa³Ž?ùse©K»Xgª5Yݱ ê‘zo®@ù¼Âü;éP¨óÉ!¨Ü27žÓOÚ”Ð'^[¯Ž/nÕjgk19»:Ï%¶Zzà_ŽâÚzµ³e¤ŸÝ½€ïy)öƒYmY~ø{Û'BN^Ý`žLŽ£u;–9üÀ„Ib ›m«æÛ¢¹â˜Æï¸^°LÄZ¤õ·Äe5žz! —ŒH2Û̾¾¼N¦z+1Ùð°<•E*ŒIŽ·œ(NéÌhˆ§Ö|Vúu‡÷|pq—!·@èûa!0‰cH6ÚnŽx]ž¥µÓ¢yFĹ–?Å #±†V1š+]S…mî3S¯È8ÑŸè+¦yKÌà”ê¼gÞÑ1fúÚžKÎ Íùè¸@«7âænWñD7|ÀûD‡™žÝ\@dq œßš^u’¼Ú3~ElåƒÓ²õh{ßâF¬ßÊÚ*ÿígÜ~àB yHñ¹SÛ¿+Z½þ ÎI§Oõ½Ÿ®üåƒãÅ…’ý"D·T®UèÄãsñ@ý¿Ô‚ñšÔó]°Ë` î2¨íwná|KêªA_9h›òùïŒN~QõÎo¡—šÿÄÅÂ>ûVôÝ”ã/Œ–ŸR¥sÏß™b~zðwîÈ{{oïí½½·„ëÝ‘"÷¨–Dv™µ¶8SW‘š¸F‰ÿm—p=¥ ?,R©Ç^ª?V¶ÕjµZíêÔ$/7ÐÊGÂ;K§‘ôÏNê 2XêsÁ¯·À¬|x[@éò‚rƒT%7ÀÌÓ€=6*g™¥.¥Ø·uWñªÒVùÐ%Ý7·n‚¬¶×å’ôõ‘Œï úŸÞðù̇ÊþÏE ¼sßÛ{{oïí½}Ç(uYÝ•!¡5zM…l1­óà )ÓÂ! z5%]Á/Žä&Í>SRµQ8ì•—½zz¿—”/ÚIë¡«ÖQ2YKù"…øc@pX)VÌ>1¦«.e]j„™jöŸjÕzÞÖRS}á‹¶†:b„1)ž`Ü¢Jô%¸D2ªD‘£­˜„°F# @Šh‘i<½&bFI‹Šö÷K b~ÏRg*Gå‚YgN"Eë “ù0[Í;0z2LÞÃQB,IýOÉEp±¥üÓ†š¦m棢ÔT]K—D ­~ú··ðRöàèÏÃðav¸ƒÕ BÞ!!¬§hÂèÜmÇ}œñÂFƒ‘a Î%T‚?fM_„Ç.@cA7Œ:w楑.B0².fÏ«4E[ª§Mô¾ -•p±\¥TQµ»ÈÚN÷)}4–NDLuÊÔÈGô© ù }?î;¹M^ ´@Wÿ͹öUH5f³jºy w¶‘²\—o|§Ó³%šÕTÍVGäšô)Ý\l-,gµ³Y´Ò’ Z¦Àa3…€^ô6Œðjχ˜ +kyîÆi‚ ¹|->IjG§lžåºòtôI¼"¿^3` Ån0c ü)cjqv W¹­‹æb9@j̧bÆøá4¯ê¡–^ÞýVåAìr<$¯xèïÞPÒü¼6wõñV±]ûƒÝï¨18ÆŠÍJyN­!ÀBmN²²žŽô`2IvIw¥%û¡u˜Ž(9›[‘‘òíì1i³H³ÁÚõD®]ëX¹ãzOzù®ZâV¦¼èë9w«Ö*;[»½Â¶–ùB.µú¹ïXyMKîëÍáá6Ú×.DÉ5Ÿöªeäj˜g‰9dØ^?S³ZvëùDx½UÈmްdžÜÔ–ý NçVßÇTb×"7ú¾ýÕ²x)áæ2”?h3lÍ<ÚÏÍA1½–¼jF¸› s)+͸®‹«:7u]í.n yéÚ#~èòà bÅ`¦«‰‡áÙ»Áú•<‡¯ÉÔxú øFððŸóó~§‚¯’ÆñzH¼·÷öÞÞÛ{{oƒ©¤‘ôÛʽ IÔ´Q :~Ä¢á´ýü9òw°¢‘ÍÍœäc–q-ÕÊ€M(8¼Ôò.­ *ÊÀØsƒýg³ƒöÉžHÜ$þÔ>ìËìªá¢^®Ri't;ø q*´Ü©8,¥/Ä B’)z·Ê^ñQE~ÍéÊæ-AÎI‹^Æ?ÏPkd²ùü2òܲ6€W”•¶fÁT–CAÕ /S þ‰*;½•¡:¥E1chŽ€Ç_OÜrT71cc›ÇeIhãTX+ÐçZì¬vø°é¹ÖÆcÈa¦A ¾ó­7eºš¨]ëø=éŸ~ ÝdôöÞÛ{{oïí½}Ùàᥚ’“‰“„TÐiFÚ2Z-ðéJJ¤¿Æ¡½6Eòt~NûâëùžÊ{Hñ²Ò3¬SÑ£´öll öá/ã‘슉vÒ+"Ù «ÍÉþÅFÒ`Ó\‘\H8Å‹ImßDë7³£t@Ð ;=48JúfÜ .à ·4§£ š•^\Ù{/<pˆ5‰Ëú_/!WB‹u´Ò9ƒPF5“g4ÀŒˆ¥¬‡C€f CBBìPÓK æµG+dFµ¨ðŒPs%`Pq¹éç ùX–xËM&!ó±%ÒyP¼Kö‘Ô ±«°VjÏ$(ºÈAçhûtÁÔ‘ˆÚn“кU>/÷”ªsÓp?æ|ã,lÕ­¾ƒ¥UÂ’0ñ?FD–Åö/ëÉãÒ¾ æ}Û,Ò°¤,ê-×½ÝJ§•³ +îÁ”Üd0ã‹sS(:i HWoáæÊàçH„õ(¹ %½úD:UIkÎDpçi¥M­Åtç¬öÉ‘5]Šä1䛺"M,ź1Û"¾l’þµŸ¢„F¿ÎÀ•4–QkMøðÎøj¹Ž9"x²å(1òZq_æÒ{æ†ËÄ*s–]šÑ=š°Ý™Ì :WPÜq[1¾e˜@â:kŠF“×õóL'Ó{jl N¶„ GR‡+ó°Éž@"ŽÛôÞ»fËÃ=³j)æëÿÏŠ‡B»:Ó-`#˜Ç$M]¥^MV")¤°[¸TdGï—¶åÈ÷UgçŠÛ–æ ÛäöÆÀ­2Å<ˆž¨ÿ|¢Ïð©¦|¯ž¤$L‘nÊK­ë7ʼn«Êøû‘’Â;­ûrG8GþÜï6ÖgÄK¨Ëµ<„{w„·eíK^ÎvÐpHw¡÷€‘ç°l|Mý)•ë9\‡¯œ¿±_´L$³ßP7 ¯x2êrÎåÔÅku~ý7¦÷;°ÎÍ ~ÉÀy>€p=×é˜Onçêb,†‹Ì[I›j?m7åÞ}:÷ùlí’¹<š^ίLSR_ÆßޝáOÿÖß‘$üVÿßÛ{{oïí½}˰ Uh•zG/pŽKóªRÔñîTQ›ªåÿµJUBxÍ¿8¤Ã£Cÿ‡x5£UÒ8]>+¸ÒtöjŸ§Y—õ¬À>Ûã°Ž•ªe«‹gÖOçÞ”b§õÀÉNìÙ½R)]wku‘èxÃ[Nö’ð"  Ý¥ºš†AÌ/–˜-tÃ.‘0 ˆ%ƒGš¼ôÃdÀ²/z'CN"–dTðåb©F2Aÿ½¸x.ÂñÑP˜´C¢©úE‹çaüH:þø´ÒOÂ¥¯r®Z›….ÝËœò›Ü‘ˆ]Eül ìví ü`f”ÀŒHÄBœxêo3-ʸ%¸òÓŽs Zb8O¬VÛíVXˆÆ¯‡Ë‚h~õ^˜#Lܾhúy+¹L›’&ÊJí#ÝÛÐÅ 2™ÚãJº3k˼>caR™‚°Dí#„†ÏÞ`Á£³ò©L*Û¸¦s—º!tr9…Þ§9E}$~‹§­Ã>aús—¨{Ös ;褟Ú/³£ y·™êêgõ’sxñõQûÔzz&ŽÎµŸVÌ©2].nĽ(Ùi8­þ'ñÙ˜90Ñ €%´¹­’z¶ªËд`A!»s—×W̳–¸ò¾ïw– ¹<s¼G–çÊÒçº-ÄeJUÕ’Ù›ÚÉ(¾RöÀÄýïêù.«v  Vï6ã§æœv×ÓáO¥Ú¬ Óm'ñ3Ô‘ÔÇœ11ªþ%Ï<b¦cFÒõîsp{4¥ª’X®ÓZ7zn#=¹Ë'H*ÕêJÊóâFl—&3V†ž–ÞOf'ogæ5U˜ëÌy«]LÌŸÙþÆ«ªv»ô(`;º‘m¦ñ¹.øªä×"ѮϋÍsm•8o>í×3Ùh#4ãR^Ľøwmxh‹Ãæ—V 붯kœ¿ µø=qínÐm“RìAÊ+v£ôÇ¥Ç `uÑZÊ—FÔÃ3ó-Âg#ꪎå0y`Ù`¡]_};~oáîI'*`¾ÚJuÝ‘Á«›ý[÷CêT{0È/-.WðèËkÈÏÝ‚ø½›÷;Cñ­Á¿·÷öÞÞÛ{ûçŸó[S+í¬6jð±¨ÅRàmÀˆ„ãJB. ™5Úù«u¾MPtBô¯9W3Ĉã衎§Ù' §ý²!yS².›†{j,­âƒ£F¸vt×df478š¶pú(ÆÃN'º°ƒvš}ÒÎjGMBü¯‡Ö,¢g‰Yñ¼.êviÚ?†s@“LIQ`‡m€9BÓ.äY%©Â%PYCeà$ífRʶy‹ÄO¥ä»’> EΧ(\qžõ`á’¨erh7nxh½'×¾çØU ´¬4ž†v 0J°CpGKŸŽÚÛbv6¶¦3C%Šž‹·˜þƒIyO×­,ÃLÜ#25f¬¥©Ä|e-‡=(ÄÆ¤t»tµµ²’¼WªUŸ× œE+» ;S×?ÎIï´ã4ÒÎÚ)_i Q†˜[\º­£Nã4Ÿc}3Ãd =Iªø{×ñ«õ\“¶ó¥)×jü)ôö^„¸55ÎkÓQ a·H¾†g¨2-/]cöÞ)6±Q”Q}O”„}4àªÝ IDAT!U“;¼¨k­DO@‹ÁÀ€ÛP„û!ðÕ!ë£8E-Leï¹ ÓÔܺ ïÜ%c —Úß¡\µ“sb‰REËŒ^±Å‹î O§@6€Så2h®'LÔ1ÝÏ"}Eîî}â*n´³ÚípOÕÞÕÄE€ *ÃR|½3\M¸ýÉ<ÌÖ}3ÍÔy~ŠîÝÍë´æ¼ë/ÛOxt¥xo¬¬Ýi×r¯mß¿C\üiÕ_¾/øíéôœÈ·ïðÞÞÛ{{oïíû@«--œ¶xí¹õÒK*@ÆÙ2DçQDŒa+ÿ¯6¨‡?G«GbvjÃÊkédJë@”F»„\Ð4´êi³ÏbÑp@ãggÃ:š(˜‚˜?«Uö_ «„Dêçj¯fZÐÑ:Å ™«ç€ödàJZÁPWý¸ªÇ3ÅSÉ!Ë’Jõ‹ñR{8 ~*¾‘Â[F&3Öµí\—*1ÍùíI–%GÅ´Èu]Ü,NõiZju™fœ5åµO Þq±Œl åEõ1'_‡óúû}¯þó:s’þ¥qd0Ø’¬8Ì…±XT-ŠF³6U\™èјÉTXÈ?Tu›i]7/07¾*Êè¡ -™™½¾ÓÆŠ ƒô±ÔÉfý‘¢˜ ";Výñ2˜QU7ùñ[Mö€Š• Ä1h§‡EBf¯%Ã|¤¯Ðvo^^ÜBºmÁ—­ïœ¼‡­O‚Ý% aty}¾¡ òÕð~ü!34üJv|9xtð¹TÈý|ug|ñì}-ÛâÚGäËãYÜ»õ17‰ËÍòÊYÿ<‡Z=£Ð¬:û ìr'ðbÒøš ¾õìé•ëË{žØwgïT¯ón´_Ç·S¿5Sü¥óÒÛ$xoïí½½·÷vm˜óIÌ…N}æ•LŸoÿrZaÏε¡xˆ®M÷JMÚa|p ×ŒÚ§v4ý+úNo8«±ô¤V ß2x»ú K}wšÐsV;ëàQöŸ’©±ã¥=À¶U¡ö*Ú&å·4E¸L?´­Ó*F4å÷ÒÊár û“vjݼ¹Â¼®ÜKÎABªª±pfɰk)tÔAs%™Rôøœ" Õ¬”Äe>ª×ü–¼Ä.Ķ(ï1Ãß;ÔÅЊT „"t’2a°Áë¸àòþGl*bš#eÁm?¬>rª›aÎ}?ÿcø-¿âÃêa„ûCUWÍ{bb´„åÕë¶\#­ù¥%à&³ˆ)^¦Ð À ¥€Ã¹1‰îŒJU"ç|Ôœ½duÎïâËK93A«Ø´{¦2sBò¢¥{3^_„jêHþódÅ©$­mIÌø 0!4ÐeÉX.yz‰¢rï§ù8:—¬ZÞ1Pb…vžƒºfLøòâ„÷èJi³Ï€yWêÀ(V`Ÿ!à@íWÊ ›UrBŠÍq¶)ú³|ÕâÃëè9¨ìÍ%§Ú†ŒKŒutä37/-”ßÑ ãíJ׉}F 㥴ÈhMbÝ'q'ÆÙŽæ-j³sŠ2Æ Ÿ„›fMhkRx)(¡˜sÝ„”$žØ{êëÒ!ˆ6ÙÌdø„ÖýìˆJþÏšêçg2NšS…E"œg œ YkneÑŽoX„’¸Nï™p¦“…5Ëq«byÈÍÈ\¨OW22ʾ‚5àºÂ—ÚËMI)ï´×ùrìU®,Äߊ.Øíh¢Gâ‘,‚ÕeÙ ¸8Mù!È«ýÜî ·B6ˆE_:tL^œÌõ9¸´°Ì— ûÝ ÿò²ÿ²"øïÔ×Ÿî ¿ÍšÿAiïÖïYO,¦’£/jy/¦l€¯Rµ—Ý{}æøúwï¿bÓlº=>½Ž›ðð«i™—÷N2ñx¤½”zñ Û<ïQêÍ^¤w÷aò¹eÏoŠŸ»wðä6æ×yeøú]Ýó¿JúÇ_ý…ïí½½·÷öÞþç €¶üÆTWD /ƒËOÏ“,gHW×›ØtµcHÿ½ÖµZ=ÍZu³ca ¤VZúî{#Ì\ý/Q”ꥵMoÕˆ-úµû(ö«-b¨ŽZã(Vµà_›Ù1ŠèaB.£Œw"\²H±J;`úZ‡,ÕjÉÃKá{Å¥%ttr ·' 5àXÌŒ¨ŸMUhŠ_‡²%gTî»Zñ¦ºÊ‚>Pj°‚° ÂÇ‘uâ ?ì8D,“ÿfª¨éZ4ªÇˆ\ŽÚ¢ö`Ï$Á”A—FõrnK ”ÚণxœƒÏeËCì³Tt!«@^oÛ(ÙV¾Jõ.T;NC‹ßüeŸÅªO;êøºÐ;ª×h·¿/¡ŠJšEýzD#j(™, ¦U®‚·vPìM÷KÚU¯"¯íXô;æµ+Ã@Ê~Û„\ŸGÃ"‘ËÑ媺ê*pqcRÛY4 BY(5/àÛÖ©rªŽO®Èàiÿ¬àÒä/èwÙ‡wU4¤XOït S2Û56<öŸ] 7Øg”rWQ®•¨&PeÖ»=Úu‰àf¯N³”*¡Ì«ñ¯Ì>‡7DTL›‡­¦Zo”á-™ô¸Äú¹©@íƒ6O~ãÄlSó s2,—¨Óƒˆ5Di‘̦YhØ fGMÃzo ›y:öhÕì¨iö3[~ „ùí)_!vÅãÃõ‹«GOûæfÛÒdUÚejGóÑVk|"c–'”Éc–\íÖÐS?²î\ý?vöTÿŒ–JÛŠaÏ:@\loÔ¸–ÝwѲwòN]<Ú-Ÿm/Á?ÈŒ¥ÍýúÊÁÛäRà *§ú/¡÷?‰ò5™f¥øú×7ÔŽ'v¶¼â …6 Í|zÊq©CžK"ˆ”gnÊó'V{–Omz FÕ<¹yk«8fƇ.oÜ‚+Jvøû+Ý‘ÜMèÒº$RR…Í pèò)`Rz‘)–7Ì,uuÅ­özänS`Y$d|Deð-ð6—)ëãC)¿:süp1²•ÿ·ÀŒ±Ü`zëʼnÔvÕÓ#I X䘌Þ§uDZ³äU¿j¬1| =\HSè4eÅk,;¿­3Û3f!Å„Š^ Öˆ»PÈë“1‡¨âl¢æg\츸”Sa=‹5ÑÐk”qh‚dù8ì(öŸjÿ¯Úª§ñìð¨H# ±ÅU{—†Í]kéÊr-žì ®ÜÑ0&€X¥ë¤¡é©äü¯@ÆýçŒ`sº{±·©È}’Ñ-aø™Ž«ó 1JIÖè]d&\LäjæGØŠ6¼c„ýPó$"œÜ›ZH³Óc„ª»G0›ÀAgl"Kf+&OI*&‡‡Ý‡·‡~÷ÐxO’OñGžÏIÒÕÖ7%Þ¯¤Ãý]¨?ó À]}{r^çI{™˜•\Ÿ7¡ùc©ZxôñZ֊פ›a+Êî4Ë£xíUÌ¿ÎMØòÝîcùÒÇúô}‘+ø¨ŽvØÿ‰(Ïu¦ï°>n0Sø–Âõã:àíÂýyÂ÷Näåñæv|ÒpÏaŸ¼p, >¾¼—›.¨'Îb~wÕ_%7Æ[ôÞmÊí¯9ù•”×ÎÆåñÝ;é=\ýN£_é5+ŸÏ¥ÏOøÅÁÀ§Šÿ]’<þôÄóÞÞÛ{{oïí½=6¢Ny€P,Á‚±–° ;¬Ï]Ô^dJGÌå˜ö] «¡Æ_Ö_òŽQ„K/-Œ·¬³ôÞÿV(ªK¡ý²^ƒß$þš— ½Êòè°=lÀ©8q¢ˆº„A‰enæ˜ýªvÀp8èß•—£ŒÒr‡Q·‰¡C*¦5µ•ÕNÉ bEÜ–`,”¡!&5æu0wô•mµ"—Uî\´¢’ ”ÙhúÎCB•› ×ü «ƒb1jùUóBÎqä¼€f#;ôY‡kï“0ѹ¸+iWñ $]Ñã%z²%†&¥1’úÚß‚ S¥"Qº ¯«)–.–aT;ÐåÚ³«}Ô\ä«–{Z'SVäÊNi{Sðf¿1 gÏ7ಚUF–y†%é³jÙè´€ÄMØ­>$þöÞuKrWÖ4ƒ ±u)dJ Dêä©V”ÝKþ³óiâx¨viií’Þ" àºJí¹ë:¡{r=Š`RvûÁÛ¢ ÙÍžÕ80$Ž–Ü´l]¬N‹òÞZÙj”Žà>ÐCGà ZŒú©O·.—/!ÀýbŸ½¥v3Tš"¤>–‹¹§­ ªçT»¬ µ4{Æ{­¹DÅDoËuÖr¡è™.ýóéÆÿfÓ®að±\]ÆN-‹³®Ïl§.p.ÃÃ}”àÏ ®¿êbÖf~ö§ÃœH‰åN¢[Œ!Üⶨñ¢Ãh~ j|’Þ‘,ô*±tQ©ÍU ÁíXÊ`·ünn.½qÊv—/~¦Çö_ô¶B;‡ ÿG{gôÜZà«Âó]5JïìØ÷̆ŸÔÓ_ßÖ×ñ'Ô¸‹û]'É•·#j'ùRPÔ?Œóy×PqÛ9¹}•F˜Xxb¼Z¡†4ð‘ÚÒã&èÿÕ‘ª{¡~ù»Ôž|ËÙ8þêÅŸ¹¿~݇ÿÌ47ïø{øMnúvÞÛ{{oïí?Íp2V‘~²ÆZ×V’iµ{ÂUÒš*žTü¥8´¾`%µ`_r€…œ£ £NI+Ì–L‡òwoº-Ö¯ÖQæšN,Ї"¡þ}ùÒ¢¹—oNêd'½Uý"õà á‡ìÌû.~YêµâãÇòà9Ué??{§ FÈÑ+g#P'«@÷W$,Ñ[â%{«D“ƒ½«7]ín1÷:½qpQ‚¡Sd“¨ Uy«†Cú¾lP¾´'»Ê#ݼ]¹lÒÜ¢JÝ“ö©÷‡}o*–Y8%bºUà¶.®Ãºfę̂:'•KœÁ'¤hÊž‚L<¥÷HScãrnk`àáÔo•)À6€a‡Ccõ¤¦·OÍìØ®V‘͆¡+–ž.ú]N%èB¦òI_s=ì°E v; B¸ëZ‡bP¢[ÜÉxZœ;Eްû!|X}µZé–F>g™¶ˆ`™ò®kròšʬÑ:…f ²©¶œÜ}&Ae”¥l¨}ëvêÂpñÜªë€ ü.7cÃéæl9!¹N>ÚDâ îs•©ÈÉÔÛ±d»4“#¾oÞ’WxØm˜k’v£Ïùk”bíÓšJ¼öž·¦=YA]Õy뜹ö bn„г\VÄšto©0`hy±ŽŽà÷ÀQVüIn$±l ef®jQ·Eýϱ#$iÏ$ðô’ꬋ։Ò§Ëg¶uýS‹nȴ$ôÖ.kG Ù5Æ#ÇCÖž< »PÄ¢ï­kâ36m©)èB™ÿŽ+Í<9Œ’S "Æ€P?åkëF(bs ƒíðBwǺW7æV‰©£(œ®KQü%\ÆPw?µ<†ÇĹj˳㛃ˆ’ 7˜u®Ò4¼,¤–/nn–·Ÿ{Hß”‘vûàS¸¿¨ß±ò"O{8ºµñö=‰Kç;óÕbê—êšu|s Wõ‘ŸNÄ×ïÍ€*¸éý íË¢áêer4¦¥ ¹‘À—®å ŒW|î}œ¿Î'i §]§«¿xíÿ²|üqvW,õ’Gˆ7önõ‹âåMôoP£õ×w€úOèÛ-xoïí½½·?ÕÍŽ“Ðxô•5Q䘲ÖroYúÛOÁO|<ñPÅ“¥À$¹"ýëÓ•|š’%‚à dÈg=«ÉøBµ€ÔÅŸ¦¡œÑµz™¤þSn¼£ÂZ¡]Ç3QN©Cœƒ†¡°6˜ 3s©¬§!ªÄ°¨˜”ж8Ÿ©ôí½œQÈÎjý¨e°Í1óé0ê˵ÄuZ©âЀ҆SThò¢‹fÕ &¸þ‰Z0›ñH½.>Ðò’b:«ËÛ„3¨›¥“3šÐìÊu{€«ô”I뇬!Ó¢ˆtÕw?puÖ¬8òkº]µ.Ø,+C÷‡qdzÂ8ÄgúåeVÇ¢)|v”Vó¼1(h¡}]­#A Kç±ÑÉÌ=wÄ›šÈЄ”+ŒR;Qj Üå–ÚoT ' H5 ÖÕ}<ò|PA‡m⾎}9œÚ¥[7P[ïîÊ¡4CÓƒQŒ¤8@åép@‹l5 P—YÔ쩳^»Ì†k+g¸Í“­QÉ÷1 ¶²qDùš÷ÃQNΨÝ¥U+§z¡#”ŒÓŒ„áäK/'Ô!ŸéŒî@¸¸é&ë+xhO=«jOeΆGÌ ‘h˜«=È®5=t6WvÏ©á‘á#´bkC)8(®º×ËÁ§qOCrÔmU7J·oø¸¥b®ºËjJ_zÉYÛÚ‘¦‡Ô(aù‰”qwå%wBçnŒ‹_’[f1Zw'j)£ëª2÷J,X<åã£ÈQ¬ó:R=âÝH§/º<–+ýTÕýo|WŸ9ÔM3KËz¢7ë+§˜÷¢_w «á‘z~’ö§åRð%Yµ¼uclbäçïœö_9í¤Ÿ!'"Oo‚­‘ÀÍïð¥ õ«Îÿ†/þ¤¾6áÜw@ø½¯ûo»nïí½½·÷ößh 8øÊ°V<,B ÙÜÔaqÀZ¡¨I„ùÃ@ÿVq_Uîlq¬†noñ•pØ A/›õèÆºœŸ’@Ù…Lª#9ªÐSN…3ÅÃH&RÍ`7Bêç‹í¡À§ ø 8ˆÑGfþ„¦Š]Ω*qí`á?–VâŠZ,_ € ªY‹–z]ÊMlµÓ+R¥´*k–sžû Ö‡ ”FŠl$ i¢$o,È#\]RCÍt؈—½†[v9o¤~¯5 ×¥êE4­:×ÃxTŒOI ‡ãD®A¬ ê í¯ ªFc¨6X«ÝÖõrÈ‹ÆÔ°Yêrq³Ñ“Ô*šUe2UÝWyz½kE#pfàþû¦rÕ#ÂÓ—“0Ôü¾(•ÞP†Ÿº®²RÚ)ŽŸâ*N\j­8Š&t@Sð½ÛT‰/¯)ìÍ!u>–`“tÁa’;^LƽÅÛ”X\røYzœF®uïH¬À­¾ú¥ÉÁrÅõ0éÖL¾ÞãvNrµ(Zî·2@üºªuL†ÓBß…@W'*eŒ„t¯’dsak›K6¿§yÖIP}¦Ûu#­`ß>e÷0¶Ò’ÕÓ)©Yêö™Aáû IDATÐl ¿¤‹¤¾î³Æ{.üV—klcL1õ'ŽFÛ€×öª‹‰«tE$Åx(BH‡»;4ŠGo „}õ#¦‰Î»ËZ#HyÈ g¢â”Ëý )7ÅIj!ÝÝ'á8¥7òž7‚X¬ÛŪ·9ï,q›ÙrC@_sݧôȅѵù–µ6ÄQ¾Ÿ¥€#¡)Š·è[ ÷EaŽè­p[˜ðlÇbÌ4º¬¼^kÎ+ùR#Yk+?êZ÷ß*"üÊ™ã×OôŇòKü¶ùkxœ ó¯üGaÜ'ÿ|F“å xy‡‘ÏèÇ #A‡G€¿Áu’ã7·ðn¼+=tÌOêÅ,5L ¸•¾þëøëzÂ+[À|¡>]ÏgÑ}«oWC4ÂfU_F-]Š?@0þÕò¯ÌK³müÍoÓÛg‘qFúšßú®èoïí½½·ÿ4Àgú¡‚pj…l/Ù6´wæpð€HÕËÔ´×’²[ž6¹À@rŒKnV”}ÔZ¿<¼;4s 4ý4ÐZÏX ½;.ˆ€à(õ¤Pª*”S|½sÏÌÜWÆ8Oâ)=ä@j¶B2ž™x|€¦˜d !½œØG@¨VDFÊ8¨8P9™•øQaÊRÃÕƒG’$€¡å*÷óV¾dÁËö—íg—Ø ‹¥mZWK‹Aì„rJè>œÜ\(‹ý:«rG+ ®Ý¥;æ%{²?§(AÒJ·ç °é¶c2iXWV#:©'lЗ"[êõ ç–;ñP<z@ZNžeU¨Ëq5Ø•qWGÜ1S.Ÿ-€8œ¬åuÞZg­VïœÆÐ`å( éÐÞáÛ2ÌíÈ–RÞð_8êÜÒ"²ëLòÈšÁTÈñ¬ˆ¥hîJtv“¶wÝ<Ó¶Çó¶ÜuëÊê€{T¢£ôÿê…N.àׇmø<ê¹DŽÁ$Èp­!66JœIå×dž4N3ç4†²6§a‹òÔ>Ïð ¡èÆÞlÐùå=/ZÃàÔ•Æ7Ælúú}Æ”Yv\»¯Ó_×#.[¬|ÿ«˜3’â°&¥î·…ƒTË4ZSðiÃMÉîð›ç¡µ!¯>¤Óáf\;íí"ú°W‡lf¿t·)Ã¥=«/x? IªHf'Œ‘Eœ42u¢‰ž.îWÃiKáÐmÙŸîÙ\är#£{mqI\É~äþ»—´i~¿'lø'ê ~tê§nä1Õ홹Yr®·ÙéÛÓŽ ï6Ìls›÷b@s¿µ2¿ÆÒ™AæåI<ÕÁoEœÄÆ®t2îY¿OÓß«±[ÏFϪΩëô‚;£s ½ø¿Œo¶¨Qí˜ëâc }¸¢Ç cnÊJ ¿huŸv~㶤Û3‘zð×oJÆ<ý¹Ïþï¹ËI]uÙò4WvÝ¿~DÑÿÂ]¨ÃÎ_rjôû3àâI4\²9´ŸÊ§!ÛÜo8Eïí½½·÷öÞþ-@SBÃ+"+Ä#ª©oMóŠh—M©×µ ‚.Võ8)öT—¬gRê¶åŸæÉ¾„Þ5Ôk×^7M >ßÓ NJc¶$½Þ“6´åšø~ –‡Ìi´s/(Dè?ÝÓJQ ,Ï‹,øÌŒ ÉHÉ©ç½ßRHVZái !Õ†"SBè‘ÑÚ]Õú,fmzkyþ¹øTÚë ò£òèJ¸… „0Z¼vîc»ë·kãÙj"X%|ð*s.†ÃÕ¾,]%ÿr:ƒæyXIÿ;¨ˆîU“CÞ™óÿõj£®0Dœ(ÕÃÞÞ ´ÄÝ\‡ñ17ýä\ÁxfTo‹1¯Èèãè:âT7Õôzz­ož“Îö¥ÐÇRHÛ¢ž¤FïïI¢çgF¯öpºØœ…r®Œ+ìGæ0Ì,ºñ·¸fÅœ`å•/éÞ£ý°øÐÙîb˜Zô•øåå}::#/çÙ¨Ópê¶ã‰k,¾®kÔ‡¹<b¶G‰_VO$÷× ®]çÁ oEjµ©Z!jÅ7Å*Hÿ¦’$ÈWêÄ]¬¥ÎÇoiœ÷²·•‹•*_³^Çè¹ù”ªtR<å ]ÈkQ®]ïã¸ÈlÁ¤¡|ØÊuuЩ}½0÷B•Æ`7óü:ÙSÂmP´àÓN2§Œ‡Ö& =\e½«Cê»›†åß2u9ôF–¡"L™jh¤°´RŸ¨ÌY¼Ò• 1„“ÍÄì+¥Ï´ÌÆ%SK!6e¹Yqm—„#n®ÅËü·A)pjZv«>!ž 9#ÇÇÒò£·ô>ZŠ@2ì˜M5aýãà]ºÔFs˜rƒL0¸†)’ĆÉU蟎ܕÚáZ‘Õu™Ø©ÅÀ,¢‹'!{ sK w(âqí$K8Ž©á)à¶t+ßÀ}5 …k<‰ø³ís·‹üŠÝ»º„^ií0k9Ζ=¿„ÈÐÝŸïê&ŠÈâE&˜ûìíÉ®…Hz›‚jp›JoJ†KKÎN@Y&xÖóTÔ?Ö³êBÔ&#Bêž°-å5:]f¯ ‘u¯½ê*;g·†ç¶qá„i0œ%nž,‹JU]ïôëÆÊ…´úªŠÁ‰kç{†*û³ÄP}]á™f]åv.oeíïdHå—võëb_ŒAþö‡rÄz!Bþ8c|_]ÚçzÞ÷=‘žüCnü¹e,„ÆêŠ Dk Àp fŠâ*™_º‚7Õÿ˜-Zô†ë:TÞ\¡É^ºôÃùTL\&®2áwãóEñýëü¸ªß!ëoUå¿imüûëëùÕ+ðVÿßÛ{{oïí1š ¦]`MŠ SKr‘YÐ MU /AÁU´’.žöô?Ó¼VÖ”lú¸@Ž.ûæ(kxŸÒàÏ 1d ÔXÝ$`Ž,VV>L§ð«bj¯®-U’’ú©(ofòÄñ· †â©lñÇIjÀ/’Ar±äÞœñ|òï¿ñù7*|¦¬ÅØ5C ÑEÏ*mkW5{Ú¡ÖÐ`5{@rUÑ ±‹Z}”\Ö‡}¯Ã¹hdyAÔy}k|^¼Ò!†BarË>m!ÆåÌKýmšQF¨Ê×AΠ¨-Q¶b´ ËzÉlì—"½ Äm5ùµ#k· è•èÔÕ7_æO§÷5A*„ñ2òF=ÚBÝ× ÝÙR^j0—˜íÃ*zѽyGŒ‰¾Ä¼Ž0ô%+ƒ¾QÃæ‡y]êýë-Ynÿ'”ÐTGl^É7Ô¸þÑ0žÇ5ªÿE™mó¥†á„î`ÒÙÒÒZåµú 'fn¸¹G˜ ©ÒqÿÉ~cz´z3$Ú@RFØ‹_šj¼R®Ì[zøþ¤ ËÒfÄú½zTµW¥’âkToËŽ ~êH˜Ö¨Kc(®ì4±»t‡T«Ày''¨Ò1Óã¢Z9Òä‘Ãrĺ¤s\2sÇ"¹vÂ’i=+Ï5=häz1>ȼnîo"?czŠoá pÑ‘M?2äü¯à HÉÈI½Ñ 3­B‚Ö£º•u‚aà˜i=ý%÷äf:*CD[•™ÜÕØ¦ek'égU̲­æM`ÑÁ E’ ·9"ÄÉMüãÜ>(ÑRú¼x)ìÎR2]îô´_S|fµˆg«"Bùe§êÿ —ñ†.óSJÍ='æf0).ƒ 6—ñ-…wÔLÜõ~ÆYôŽv³Ø_Oï”W¥£U„rñÚpÖòõÒ7ß,ûÕÉWVœwnÌØt¾t2¸Ö|¿|žýót=fbÏJíAN\ þkio:úߦæF*†žö\ÜÞºùª¹œH¿W?þR“Ͳ‡uúß-íY”ÜEµL8ËrßœÉÝCä‹ÒüoÖ†¿ÓÉôÏÊë¯ÇÃðw; ÿÌ·¼·÷öÞÞÛ{ûIÀÏâEI,PšVÐWÔϢߕÊñ,G‚f†dƒ-$ À£Êú5Õ³Ñ{’‰’Æ” pdÊ- Ó—1v‚mœ{à@§g€8$>ù€”}“žQÜTÔP®Ül ðÔªò%“Pœ ¬†zžF¬ÖFÊÈRYÿ”Ôš „ø(‘ Ï'>ŸHO†šIÆô/Ç+G¯Œ¦!•¡È¹^©ÆVÊàS=›ìŠÄãÛsùs,&GNµ5¡ÙÞÒ@ ~áád¬j¹`ôl? %ì³²}*dL‘“݉.éW\ôz›r9-P¥Šá†õÞXkªv&+)®BÏÄ]tÝ mt”¯{º½+÷nm4õÒ$kêj?C­‡PÄvkÈÀüAHCéJqsâj?3*žä_#›+2^Ôº¾è£qÝW4ŠN9«GÆ¡8<§Ö¸{¢g²`­;£%ÐÂEm/±½žLÕÔyu -ãWæ!ánäæChÔ@`Ö—‡'™¾ÿ%A¡m¥Ê|›ÂnÍоã§ÄyÕNîÅÁ•&¾®Fçj鮨ÿlø(žB6.õå­øáŸÔ•ov` œêèç"á™›1þÂ9»jØ% ð¾{£žØä÷®vLO’“Á®ç*‡àLÖűŸ$/º üBûËï§ÿýÕé\?nø¥ùá÷ëòïòÿ÷öÞÞÛ{ûs q¢ƒ«•. ]i%ƯôH½R”'M?*êÿšzå8< H‚'kÅ%GÂ=žÅê.EKI_­£o°‹š™ê$SêJ*o‹”¬I¹R9-zt€£ã’S®"‹|‚Àqd«Êï¼æ#¨jºaë°`v*•vV |Á&‘ËG媳×ìrŽÚlQÿ ýÜR'•Mƒ;¢~23¡] ÒæX\'n«†@’Q›†è¢N –ÌÎM‰‚¤’0irU¥ê€'´PM¸pÝ®så þ«T“@µçî61šÖäFõiÓb•‚¬ÀÕ':\‰ëöb(Z"<ˆ|±®±`~C¥ïMæBª×W ¹žäÖvãâ ôøÙI‘çÄE „—: Dí’Û8j^X𔣗 ˆ©kÑÍZèÙah¾Y­EIQ 0fe[ïbaéÕ‚þZjº·åtXÙj– æHµÆ˜gÿ]ÉâÄiÊo‰ìÎv-JUþתØ8-î5º8hÚç(}œÊºPp dð)‡Níç`‡Õà€”II½G}¯LK²A-\(ŸäØÂâ@Í]kÝ]@èh!ÇÁßüæXÎ7/ê5•Œã¨O‰Äö1—Fž•Zí¼XvB6§$ÕÑH"!æCÚã[ÍêógA]ãBŸ1üðÖU™*; K‰¤H€£Ú—ÉÖÞ=J3–ø€J©È;2Gâ³ßQVn-w¯ÔŸËOàÑ8þ]Û¬Ü F·Žu~æªë3ñ€?TÅ?yÚ<ù×Kãd÷9K5™·ö’·Saï\ëó]×{'ìÖøòÈÿ¥¢Ô^gרù­î“ZÏ/±.þöd†Ùš(ÜÞhãixf)o_z=ŠÓ4ßĶL ÐÅûÒG¯‡Ä6¼šWÀ³c<¹s¹Ešþ&Ãf/¯×C–wšƒôôp¿¤æò×€õÔuãßÕ[&ñ/Áøü™…ôïòÿ÷öÞÞÛ{û ß1]”ÙáyšŠh(0ëÖWë/§8?€’:kµù´âñã€r) ~—A{¥“ÄU:‹ÙäÂZïoðߊ×we×bÚwÁà Â:e[£°’‚ã0ªµ@XeñZér6„j»~Ë*öÑxæB·X`)ѵHȨí’€Oä-|º›]"´ëž¾ÒÖúº´^.ÜQÑ:Ò䪦ï(ð´ªä yt¦PÙyÉîõZë¡®ÞªE[8jŠ•šújnq? U߯¦S¯¶…Xø2ºÂ(o¤ï.ñz(;˜[X°ãàBD}ž[qDB¶uáÑ«©Û¾ïVž¡¶·½Mrh R;9’zf /ʯê‹1=Pˆ®×ÙÔýcUIÎj >E»¾æ®Ñ3奶ïHîiÞ~q"ˆEjþvš!WyÔóÑH/H _§Ñ¯ÚHr>zÓÚ©ìƒØj÷c¶lɆ¼B]™EžÅ¬kúu2«Oš†ë«uׇޢz’Àgm]zZ|kµuSï5±žS³§¸=_W‡˜Pò6cªß>¥YM¾ÕCú<4ÓÐ9c<¦sŒÊ>gFÁ¹a—@£>E¢„¬86‘š)Î8äÔM¹`HOñ!ÏH3,Õ‡ß`ÔqBo.n:ÿˆRÔ zÉx+Ç%RÛþÔFi¡B5Nm€ËõÑÌ6Õà4ˆYãÔ€8ó IŒ ¯¶é½‘Ì\G¤–•øee`Ê·d»Ž…9v´8"ªæ4×É®žç·›Z±.;WÅȾ-FWÆo(!xó3²¿ C¨†çõ‰œÄ—TäÝy㤾®Ësó¥z"óé-‰¼Òw2=o; _Ó7—ƒøÂyÿ¥ßE<Ïm|¿Rˆº„¸¼¤¹ŸÜ¼ß:·«ðU2E w"ºÖ߇WbÎb¿‹çÄwÔ…×.2)·­UË”“³yà%)ñ^0€.ñ< x°~9îäðüúŽ=±ÈÐU†3#òñTÄ﯎Wm *ã×ÔÿOí÷w"ø+åõˆý5{Áß~âßÛ{ûnú´ïí¿Ý@WÖû^¦ï@ê˜.š6§VÒËFühw•%FŠU¦@¨TŸ äñ]Óƒ—ò½ì u½ &™IÓ; 7ß½„0ÀÖËjA«im œ9ÕEéa*^f§x÷¯ö n“Qš”Y*ÇKmmQh´ ɵƒ¡•Þ« )ä $ãÃüdþD(çc¿˜ö—Ù#.Å‹ÂÚj:#Z e“Äl­=ÈàrÔo©Ý-W wÞN[ȹ0”PQ k3"³ŠDM+¸BC*—;3rWb€¶2Þ¦7E ‡¶aS ¡HçWà ‰ éAJ«þA)ç„H†XÑ&Y¶è]jÏ Öcc.bÄb(»¬ï*׈5 ­l9w7¨ñ=CÜ=ôÄ„3^£pi$: lry<ðí;®J]“‡g€4жØWGQîšiÓúé.\w2by”®JqètŸ^"=9u=U+Q¼ÎNH¢[b-WkN†¦3$ ¾Õ„ù2µNÿ²@³ìÔÿyh¯Qsb?̓ö†è²v²˜OÔ–†ÉØ=õòÍ8ŒSÔÈrCÌÏà¿r£—Í»±X=ìKæ× Œ=ÿD/mƒ½\åå¼­ÜÃñë¸ùfË— ÀýÙ[‰Çaè/[Œ]ò”wÈm½{¤K2Ò%£é›˜ñaFºÐcþñÍWKq¿ —éåý¥‰ñ‹NÔ\VpbÔÂ:d±–|!@18" Œ³„ËûjPnܾ·¥ž”ûÐ\IybÕyf0ã#ãHý!XÒ8Z/š—)½©ÅglTN !ìà[@ؾ.ÃÆ‹òäšS¢€ÄÈZÍ·káêõœˆ…¸îC‚—ïÈÄCU˜¥9ÉvX1Á¦(NFªuUŽº›G›îêj¯®¸[£xÍ…³žV®¥bÁYû‹OC¾ª’Ü.çדÜÝËxØ+ †ñÀU¯¥3®xì/(>KB7Oó¿Gmâ‹•õÓåž;&1¥ãúÄÞ®ÿ‘F=ÁÚLNäв8L¡,]ç'Cïe\‚dp¿Sg>S~–½2üë ûƒ ç ¸sà~ºŽ‘`_–^y_·åY4Âù‡_ªÿºÜ“›±ÉË.N zw ¼«d¿«äó_Tlü.ÿoïí=hßÛ{ð(EÊ´rÝR»-¥î›€T¶J-iï%ÆFÉ_Ó‹pŸê’;·GÖàÜG®Q·‡S è…±ê¸.…~à8 ‚ôQÃ*‹:™,@XœÌ-ö”NV*H'kjÊhÅÔMðÕnI-àc<áˆóN°®¥”>!¥ê´€ÙªÑ䞯 ¬ÞCÖšæJâ(Q‡‚ôÀ‡µA€H¥J=ØPµã\•¬‚cj¤v–h u‡¥#TcM¥ØµËÕD)ÄpµÏ£xðuºWSn.…KÝÌÀkÁB']²Hœ¦Ùd ¢´ËrÒn•Úì‘2ž¢8´^b¥ ¼mñž.¹Ò»[Fg_dwòýÛ<]_‹sbB}«…D}¸«öÊè."˜ ¨.õ*?]ɼ†ÀÌú ÙjÛµŠ}< ð¨@­@ÏÕªÕß¹×}7úÓ¸ºc¨tî™Îq)w·6¶L£¬hôB¼G…ˆ‘&BÖêê=]§rb]®¬èD7ݬÃgI‹îëôº_&Ÿàßuê«7ŸÖc/cL̓ëW`£üÛÿ6·¬~í||L¯ÈvBÝâ8ÙM\Ú„™Ñ§ÊF’!À‘ OðQm= –{¡öÖ¦î…vÕ„¡~z´"Îb`û0f«ª³6Šj)Ã1Çœù§ÖÕTée¢]™ëÄš·r4/•½qÀÀœðÁÔµÂ2Bµ9ýpl"i7”¸´ ß.pXO[Ép>É@ªÝÝò´ìßr·Ê’j«ÜàK5Ûª:V(Àx›ÀN»¿dp!öð<@Œ¨F¢ c(¬¼ê©³w¢èH]«N:!ÑèqjŒ6pü²EdÈ^~Ufèq2—\xn¥!Lîš^ù"òú¤iöG¡Ž³úú3õ®V»­sç^ËÛ]†á*ß_ê™1sÍë¾äÉèJß»áRüxYæMâú§¹9G¼ÐõVÂâfoº*ÏbŠgPØwAî Lº{ØÏñÕb±#±öC­ôûD¹ò*Âÿ׋_ç$[Ý_}„ vé¬j3ÞFºúÃ}{*ôjüòÅ›ë%`”®—{{fððKŠ×IÇ¿V-û—ïÞ—´F½Ÿp³zÅ}oïí½½·÷öÞ® ¯sÆ®[«1pTm¨ArÚr®¯Ò‡È>í¥JWç˜q˜’ž¤ÜK)5Ö,—šÙ£ø éQ©ÇG¡Ôd #§Ê­†vpvÓ2;@C߀S}±¸r6~‚XÓx©îCñÐŽËh”±$ÞRþ_vL"8< ƒ“­¾éª4}SLL«=)•Ùþ ^÷‡±zà’c‹ºzT`H©;–d@éÞ°$OH§$Ññ7´i¯©ó[êar’–ÞÁï3ÝùÑTU›Žû¨À—À© ^”oR¸®êÂÔ|¸\‡a75·2ÞŒœñT|8)?ˆõ®k.²ÒÃô…½ì´]”Å+©šw…T;|I”Sß–A·nã¶(wµ ¥éò†êö˜®á;JàDB¶Á€ø E>ôÚ^ËB` (ž¢»ålÍ"´Ïa•­µ…KÓB§sÍ) ú*K96ÿxCw/ÓÜ(&^ƒã†í·²v‡otÎP»ÅZ¡tÏÌN¨m@ãøÈJ¿ ;Et21ÂèÄøe¬J 8•G½Ç«1˜œcà~¾qxàosÖæ­ìí¦2×ä†2‡h?ëyšô@>È > ò–ƒÙèÛ=V]GÉ|;hX§€k£±ßø¥ácr½ŒË,ô®8Ï8uL&PôPzXÕ95äN7LÙ¨¢æ ´.!ÞŒç!h+¾¥c0&£×¢,À©"Cžöd¯Q ¹ñÞ—BëÉs6jŸ'Å¥D0tèy6]¸­šRO×–Cty¹›Ä݃Yç:¼UÙDùl0ÜëÆ:i¸ƒà¦Xa—çþ¤˜}VÖªã´SÿÏ5pR‘†¾º…<¤÷ÇzWß¼ Œž½¨ð®‰N!á{r³XuÖGöm< Ôå7Å]ùçá™\ ›; ”Ñnùš8ôµÚÕ½T=¾¼ y»ljôÖ:…×C ¾ .Ÿ;ªß:I_–üZWksÇí; /õ6mcƒzçÆçÒYÍ_%‘ )÷X>ЗÝ[K‚M¼ñ‡ËDlƒ…1ôÜðö¦hýÆ-ü…»ákr65>@—£ˆ/ÞË¢Ð>Õügñ¼_UÿßvÌ{{oïí½½·× €ÞÅÜÊ„µÃˆk¤âiÔø"²4^|Sa~¡ Œ2Vcò¨ýE2:0¾íi¿øÄÇߢe ²Xi¶B3Rîl¢ðá £”V†–Ø,:Ag¤X$€(˜êùIŠ” ÿGñ¡âùuµEX)­F¾ˆìѓퟚÒ$³Z|ZÚ/$Ab­Î¥ì]MàÓ9´gîX$²õP³AŠÄ$B±P*ó9·f6òaé Ns)É®%3.¢ÉFê]Œxë¦Êå&Hy¹Ó£®%ЉXqâ©Á‘¤S[|¥æÎ®É–_͘Žëרåð©½Â]X'jÇÐ1M q»Í êħvõ .’$}\gƒû÷úw B¿zÊüp~Ðÿ©Þƒ >µŒ±Z~°öý“•Sy¦KÍ)œ1˜;’£b›ÄU/JÊtöÕy\a"4¬ÏáÄ/Åc| ª“™¤ ”\ dNh¦‹gm¨· ‰áïÝÇVõ?×ÿŠò !8È_àÿƒüDÍJþ |ÖìçÛQ°§¡z/G ]gìmj6)ªõÎÊý@êï>jÊKö³GFÖš±>Pƒ»P¯uŽ ÞÝí‘`Š˜UæÃ,AOï–ƒôà ;iªùìʾ÷º½êb~½0í]Æî¥.IèFèd@BÍpm~ÈÎ)Wωš,Liâ z8ÃT £8zï]ËMáˆ\@L‘ÒGò°Tj3‰¡6&³õØ8›×‰,#Äþ£™»uAyvPðÎØØ»ªŽê‹Ã=d‡fAÀ^#´:ÍÞš„gÖv­{ÀôTZÎaqZéìx¡OD®aæÁ t }fW*@7†czùzé~¢ñžrÁè÷hð½–íA «Ï}IE¸™î¨{¥Roè{¼¶KîÔÈûêc½y˜<ÝÛ¶ÍúÇ®¼Ok¼{ .¡%w®Ô> W;ÃÍà_˜ÍC8ù#æ;ú–† _ýÿÒ%¸ø{gN̺6-ÁQ›ÇȸT_ØÐŸJëJ7ÃÕ¿øí&,LrÕÍ­¡‹ÙŒãaæÝï»N $Ew͔džý‘xM z¨h4)#å Ï¡C`‡µ_v¯¹±=6 &œ°Ëvþ­ß¢"J²3'd,ùì‡S=ÛʪSŒÐ¡CÅfHk”ª…1}Ú*÷²ˆ~2¾òe·¤i£É÷3u è°å“SÉ›=Àƒ°¼f°4ª”¢òæÁHï¥ cl ”Rœ;«ª` äÔ  aÎQHTÞ¼èêja³ìãîuÜ>†q*ýc¼ez¬7;`ÝØŽ£®œÞ(H­09#+¡à„8ˆ£0ô|Š>ϬŠ_ç³$Ý?+Ù G¸…aáÞxvQUµÎ"Ý‡Ë ù Gª³qå‰ÙeÍFxïOº~Ÿ¿ÝÖÞL5>7 XöíQ‘DÅçËÙ&ì:ZÚ]_Žª‹”È †¯×+Cñ;#Í_7Æ—ÿ—sB½¨tIÑpˆ0ŽòÐ<8uRš—ýDªe˜üsp@ÿw'’cL®bôðÔM >νxÆ^sôsûÌš^ÒQrOâ(ßžFõMg±ëZû—ÅݧV(àâ@zÅ"Íqyžr̉ƀ®º£êeMµÙ«6ÕªäPvàNÔ -qu)É Òõåž5D=I†Ô½Š»ÌïÕW0/;!xß&EÝÂIž0®8gV'ÊÏö/)¼!Žl^#Gi’{Íåéâ…Ì‚]B×qÛsº< OéTåâõ áKšÙÜUã߸®гŠ}~©æ_œtY¹:YV—cfÝQÄ F“Kmgxl¾c> ó€çN&·¥ZÍõÔžD\ r2OàfCÓ e=š…ï…-ªk#`¤ŠiÀr®ÇÖ·3¢õjú¿_ÌN»äöå‡ssÉ^‰T¹5Q|aîûÞ~U©;¯ÿý_~úßåÿïí½½·÷öŒ õê4‘B(꿹³Ý—Rˆ'kÑÞ Ä!ølEÌ1ÿ³p„õpj”ÖôUð2Õž[afvaÂEéȯhzyê^…V¾¬ÆG "~*žÀÿɰæì§¨JX&‘+#Eseµû¸àÚ¯Ðô2…‡àÁ fIúÄã )ʵ5ÌëÆGÈEy b5ûùa ö:èV¦cF ä^¥5ÕHi§´1^œdß+7­"逫Çt{+b‹=±äáx ô¨Ž<Ê"êºÅ9³†íä÷`´T«›ýpU™¢ †pWïdWõibS‡`4Á´ËlRµ¼Ü ÿ1J“‹EWa=àB]DªÆ•%‡ð:ÿÆê )4ªŠÊsg§~U*k'ÐSsÊi4A¶úÉšQÀC*Ì­4Ä@¿û:Ü·³´µqHfÖJ£Íê¥3¦ðÊô,nòÑQrÔ5hVP‹KÉ-Ê"×üXÚÌ?‘zìŽçz¤ÙZ‚|»â©±É‰Ôøc-Û£uV(;¡„õ£¾A!º‰pÓ…—ïGWiH/ðS·^4’Ä¢:Ú]±MÊϙ居 >ñ؈v.Å„.¸¾$=&ôgû:)>‡AÿýÍÑî¾ìf×^gà’Æ»<*Aš©¯%ÆMj²~øÖ]Gë&Q7¡«.ºOj }¸H/®e9éø×”÷…†Î•È5_µe™*§) &ÇR¡»·PßuÌt~=Ï@oªëøë—¤(ž dÛØÒMÌøÙ«èçVÄ÷%NÒí€~©rþRµ†×aÈ:ËÖmB`L¸åé4ny Ë$ç½ý 7ØJ<`§ˆªkp“†Á9ö+œ{ zu1—}¥^=ç¾ |™cÌŨs.°n›l¸¹I9©ÿz>^•co<¯Žy0%ŒË‡y'—9‹#¸aË݉CG fûyà¿ Ìû¥Øò¯1Ҿज7(þ6å]ß*ÿ{{oïí½ýñÀLÆ„­[Žn«þ#{!F'iØË«4ÉÀ•Rªt.6soÒÿ8ð8 h^¢€³SIèêЋ–”ºðÔÍGïÑ¡†×x;­F»aº3°&µƒ° A½ÖpàøÿbÊøTü•q|âxV–E)E<¤¤ÉLÏF?ñ ”tq¹UËÖ¸E…(²"Y¨ÐC_;ÒÝ­N)Ã’lµâÚՊ늕ýÂUrrn,î8<ï3R2ŽlõøRc2Š$‡0á^YoDiš~WQÕ¢&]veYš‚ã¹nq[þ$ÃZÈ» -º§ÕûŽmÄfvx¢Q‘7˹*ʆññqÁG½^âWªtUùèÀ–Å „ã¿réZÖèà<Ôrªó$4èA”ž{ÜtäCº ©>²Øéz~Ÿ×%P%ïÃPKͱËõF–zÔô‚œÀ¢e;0D€0¶}Ð91/˜Rò¦Ò6®ÌãÙÜ$Ô oùÔ&¢Z.D*¡GåíH9^­Q«’*–¤´Æ4S'³y`¥®9ÕÄí2QhêCÚ£‡ÊäœÏTgT)™x|€<$…>OÈgŒm0ÜSU}i¹óeá’Núõ*hÞaÉ”®·OMú‡sõ|gÆ¢~¯ :‘ýÁ£~$ŽLDŸRŠ®­êó'ÍXÕØ7ë1åUC–"pçÊÕ¿¬¡`k?û–”¸hŸyJj pΞIêô¿Ø>ßb½åû„TfÂÃTr§—Øê£¹ï噢õŸ²Ä#bçéõ®;Waàƒ k/ÂÔ;ØzgÒ Yè!öb‰#î@C—•9%´ó6F~ÍwSúÝU;O÷é;¸‡AéÊÙ]|rüžbÄzG¶XÈ}zªPœ¨ü/e¼Ô0ñ Æ@cÝj <ûÔjÍŽjÂ+eå ŸÝ%þ’rsë—Z±¶nÇ/ùV9×Èš;ò×O¬äïóÆž{æ.,Ãlçb|..Íà ˜P¯Óý¹çç,Ÿku’ë#âÉxŒ/ØXÉ÷·ì+Ñý:§ÛyŠSO­Þ¿•Vâ²%‹ÜÑS_öZß¿9×Ýœ-¾Ø”ô%ûÏÙÎ h}éð7Ó”þÛŽ–ßeïí½½·÷öÞþ,@!Cï5z3®–T© lP]z#‚£7À1 ËûD©é ø4²¶ÿ ë÷/&A(+m9½–î›Ñƒj«"‰^óȶpbêXd¤=LXAl‚à<>ðÌú¿™=ñž8žøL¦ø{´…Î<Õ´?ÓÜiù ½ëÂgÀ*j?A*ßëöPÐå¦.Ñà35•T*šC´ú G¥~WîÑí|vyΤØ†n+Ôê”-9  G`ƒ§–ugK3¶R_„rÒ[¹^%Vœ¨ùD[9˛ՅMµ”þ—ý |UðˆŠ$y¯ wp8®Âî¨Ó# çŽf±©ôW\HäŒÙB8A{Ï3Yz—'™§­X±ø5^e^j:wœ¾&­¥°å‡p5à¹IB?U3É+ÿÌ–HnËF«±3zw’–­*ÓîFE“O‰á«uÒšý¿¼Ô@ë8¿°œh“œ(Có¯s{w«®Îóc ã3ëBR×{ŽØÐt;}7týåW+NYX?«[¯Útüµpé?X×çÉÄÃÝÐoEÔüŠòyþÈ€¹ýã—4¾w‹À{{oïí½ý» €˜—ÛÖê^R[À!CHU¶¨Ï"XKŠñVtÔcí9WT ‡2‰&qMþa–]د"¹¤\ngµÛ$Ú)æZ'jŠÌÃ.w‹WxÕHœÅ%œˆ >e·u™xJRTÿÑzDBdÐit|[ Ô#«/VW$ÛaåþW?¤q¢{ÜÐÍtÁºV4†¤‹3Es¡,H£ôë ¹ØŽ…2Ä<*M¾ŸX›"ºéqLÃÂfʱT d[Ó‚kSJ²aáÖ–¦:“Êé=¬3£ø"9ã™+òKˆG™d¤7Ðô±q´©Ãù¯DŸšüˆõP™Ð¿(y@ R…|ºzê¿\ˆƒö‡rS×^Óî»×H»² es×ú—Õ\û™ê§5Xº»–Š7ö]ST(9÷œÃ&bH¬Ö[o. äTƒ6—1æá¶G¾Ås¼+9W€ÆHv;hfL{W‰í£r¯Ó÷ÙÝŠO ž~Ödq5c5X“Ø#Æ{‡ŸGâx€•\çneŸ–}-j{$…‘éFBy¨ACDˆqvÿÍmFêv ùßuNΡ]Éû—ŒfIˆ.årÙ¯“,«ë"w]‰P‹ùF/ ûÞ«8+I˜ý ò†>ËÅOê,¯ŸÊ : öÝÇAëÜfrb¥c.„²›²ï¥Àq^²-«W ½ñ‘'Rì­HO­‘ £ß}ô[ÉY6éªÀùrü,rœØçœX̺-·j]»×BYâß¾zVÛ÷Q©ô~Öñ’ýÈ¢5ti}‹î‡ë\„Á9¸{ÿYä+7Ÿ¯Ù‚†ùAO<(žÓ­J.ZÚOÞ-àæéüÁM#Â~×i¨î7Þ_„8ífú%ý/kÍ_FñÎEÑߤþó›¿|ÃJGûþÁ·Ç/vïí½½·?Þ0EÍïtª™š¸O/R  ©EC©ú{A¢?‘“i=.5t÷p¨~d~ÉH‘´–«‹[ÿ·•|)(ÎGb% ŽG݄ʾ÷3u‹kr’ :|¦Iùb= GªAšúÿOôÁq”Æ“¶KÕr~IWo ë “8!­Ù‹ši)»Ù ‡{±¬qjÕ¶LS|šrTqÉ`B$qiM¾l¹´²Ê†¾Öj·ÔôÈæ+”gÁqÔ|–U¾«é†ÖP.n 5£E,¨ üÕQõÑ•Ž©14Æ8êp¹\}u°§Ö?ÔÓùº0—gÐF_/µšbvé­ àÒð¡6’Õ-=±Í¥(l+j(æ¼:u¸p+mÈùa:¦Ê ž®r³ôjDZÙ,µº‚¦áïÉÞk¢É’%UÇ«ØT”¾Ò© ‡XÛ!^]ÈpËjÍÓUœ®Vãag<1&Çe;™¤;kŒìNµiài {éÈQònZjÍ,QüÚ§R‚7 ¢'ş)•Yù(hðH¿¡#"'¤Â&ðÀ!ÕR«›ÖdÙ! ’Œ-Ã`«°| ô}T· ¢©¡©«ÌcÙ¼:ðÔÉî7ÝÇ[¾ÅÇùÁ3­8ô¨“ÕAxhù4ËÛ?|Bûé·@/ØGèzÁ«ó¢USüÝíÓùl³6â4ŽF³‘îÔGj$eä\“R£w²Qw¨Q׎2²ÖÆ/aÀ4Á¥nôëÓMªêÿµVf×a- ¸`v8¦ß¸Ä÷I®#¤L¶e¾¡¢Ÿ›BÑ¡‹hñ,ѽ¶²”ƒu«µ ”ÞXcsõOÞ~žtç‘C(íCŒãáK2ƒn„ï›j /•“xáx½—’‰§Í$Ì^»0 ßÄv.á*ömWÕîËîäpø’‹sãD1†¥owLüí¯IhCù…¾.?q{éŸÚãl/C]œ´ì‘ØÃ×>gA¬âê‚]VÍëXª¿ÍŠ˜ÜnÝÍH›±±Ëì½;èZ1Ÿ_} ÊC†ï\Ö¥-§7nÏUÄñrúº¾y=gÁ_\Ý~sxÿÑV_˜6~Fxý׺¿Î‘xoÿ6õÿ½½·÷öÞfÀ ‘:çòE!ÔžABrÍ|*˜€'@à$Déß´È&–=€¿ˆgÅüŒI\4 xF‡#¼xØo=‰dBrÀÇÃçÈNíÿÊñ'›NÚÊWÛ9)úûñ7>þÂßÌÄߊŒCqäÊѵêí¸¥ójJæmÊ]D+±° ¨û§l$•çÕ ®›ª¢âÖ¢Æ ï=†!ª ˆ’îÀnhÑ( ô/„>p½É’ ²å*“ql˜Ðd_õ mÉçjù»Êæ¸:š=m$²›[‘x÷hܰðAC÷´†¶_ºXqÓ㫼« ÑÉ IDATI÷´:3IØbJÀCžÕ{·K­ ·\‘ÃBZgƒÊ$DºFu|O1R/êIßIÒÕ,k\0hÈ×UAX1ÇÕ¼,¦“ÎMòõ™±±jæMkÆÏ.yu,úã*5.\9u÷N£¶“²íÐØdÄéX ¨nøÍ,—–ßëWz½gÅ™X§oàì=@lw–à©unÌ ‘*vg‰oín4Z±u5Z¤|åù‰gªßE“¿ÕHG%ž 'ó5Ýy ŽiÃUÜÿ?Kç{MZGTîl–z# Ž`Vk6¥_\]Y2ÊIí+ý‡…ð”Ñ ø† ¡Ù µB£ÒÚ®£DùÛ?Y2’ÝËBo«a¸Ò+SìÑ;‹ØÆ)"ÒºÖ&Fx«žGîèÉ8ˆdþ«´kì-ó<‡òdWã -­¡DÍxàÃ|\‰´º ç"pR^ˆÉÎDO2ÊE¤[³xuGù˜›‡ºíˆ-¶êÿøÁÇœ"¬§b8×Rò®¨Ö«Ò;øëBðþ‡õTï^K ûr×;d¡ ~Ñueå3w] öÿìIptˆ–‡6äÐè’k²ó÷Ó|Ê}»XXõ5µôäÛÖ—~v}اJ¸÷Cb|¸,Îо¯SKŸu$§qs'^ŸÛ•—°¿lT¼øï' ½ºm5Ú*ŠU¬¦]à!Ò™“îÏ'¼¡`r50™4ÄêÐâ|ˆsAðk&â5>ê$cyÙ*±Á‡â$±`>¥ßqžxwòøhÐoü$ï›+¯ïÒ‰Ó ¯_›~×ööþÛû2¼·ÜÞÛœ€^²š‡w>uIª_…=ô£baŒ5AB ‰®¦=¦²|(Šg©$•Z®(ÚëR‹¢*±ïµ~Zªè*xÒ~†Š-+W§º2{¯«?hÌMux–jDÉ®I2\»:t(˜æî í£èsI%q´|ÈG¥ôèg qP@"¨ó–>Ú €#ã •…Á𭯶H^GkªMMó`W½Õ*d= fX0{î„¥ÃzÔÈÊ)áÔ)&Î6­|Œ ‹’º"+TkͯU£Tg‡ûs陘õZºgG«Ä÷Ž‘ÓI(Ù)Î]ëk:HúPE«‘Ÿ.Kƒ² d¹li× ãgÖÚä2*”8Ô°?®)Ae|qÑÜO·l›™*Q&>Y“ïu‚*›"–$k¹¹¾XcïÔ@¯“¤©ÛÝC*cÞ@j¾ö™p¼”ú¤+5WS§RåÒzRnÍuö âYܾG‡)¹–í×ëùiA ÓªÂaÙìöÍbì ïÓâ1Ä¥;ô¦º–š9[SLîL½pY5t7û6•cÀ0ìÄÓP#ŒîÑb {#$”tô”ñ "YZL‡·h5Ü8×ý«|x¹ûL̓,í\ÃÜU0}ý ï7ÔŒ\ãLÀPnß"gýcÔ?ßËd›]ŽKm{€ƒJÁØh¹îyWÿcÚÄp‹é_ûΨ›Õ±Üó«‹K¬Pà+Û%áÿLwžôâ“úúaØër^Å({ñkЦšýÕâñD¸\TëÙ:T¹Ç~è5É]¯”ÖõÝSjfµnñpôïž;wÏç\òEUziaö•%ÜMÒ×äÀ¡NŸSóÌie:Cò×j(2¼rÖd7"òàdP·î‹Îò?¯ÆÛ×N²ngrî?S—ob±4¤¿çC…§Zs>› ®Gš.R xŠ Ú”ty\ÃûÞpo1ÿçÐÑÞ– Ò¨7bN©ñC®2q:]ÜŠÿš¸·Œa¸?Põgvì7+œ_¶.ô‡¬…_á[¼K·ßÛ{{o¿hÎ|oﭚݢڇyª+âvÕs¡ „r˜‚U¾gKÅtkõVDœ€#ã¡ø(*ÿa˜ì(û&÷É莌d¬ê‚H (ކªÐ^7J§~¶—¶\v¤ Ò„;'ú3Ÿ€àó@Rä#Ä[VaKÄEIþ,§ôŠœ—*{Xšª£«x2¬sȨŒÑ¦*cØió<ÄÓKÀ2“[¹®ÃK0 ˆü„¦ZR*%E¦Ô Ëz¹+zÂWW9ù©©±¹aâ““×3²Q¼)YŽØ¬ ³d”aQÑ*‘<#ìÇ•D¯‹\5_hܤ§,qÌc£ûÿfhF¶ÁVÑIà ¬F•®¼Ô_w‰íA3Êmü® º5ŒÚÊæôÑÑŽž8äît…hø–¡´Š:Ê uO¤/ùè*©="iPçÕôÇë®~&Q‡ij£öioüœ…£ªs¹æñ¡šº—©“}‡]ÈmÂAoy™×t+nîw˜mâ;¬…èQä[V¢z§Ð.æî^”®¬lc[Q·[º¯XC ïÍ‚Y; ìcSqW·u2†µW5àï jœPÛHGÕ,¼zA¡Žëü€¨Ò`Ó2ÖÎsÙà.}½¤ß¯‰´h“¸Ú¯M9Ú¦6 ²öyXts#5éPP©+×î'v¼ò­($q. Ž-,eŠ>,™F]ÇOËáèÚºQÚÄ3 JŽ‹ÃYh”Š©$è| —SýÊÖdûß~’EÃDJ?U5»­C¥>¶èæRlC)P‰¯“­+yE§>žè»Ê]vhÔO© / XX§‰Âañg— ܤ†2ŽÃHuÒˆ¼Tÿ}j õ¬|¹Gk×goÓ^]xÏ«‹³ž•çr•¿ÜxS ÚÉ”ºùê{%^¦ûêúËOrh‰U£ÕTLÝûY#†îò9Îó‘¼s³x&Ý®ÉZ§ŠÞTÿOnÃÏ禖œ«¦Ñ‚â­A»ºj§;ý(¼˜Ò½þ•)I ×bªÂÑWï&œªÿó?í<Þs‚Ð÷E.®Úùq-€oü#‰áÿÈž¾ÚÅ it ´ï{Í:üîñ¾·÷öÞÞÛ{û Wàßµ†ìŠ/|ídŽP S‚jÀàNþÛ?6Ju¤àCðD-9,ê Ý› :)v(諲…“Ý w%e ‡šòÅm»c…_+"i­™…éS”^Ý™¥²ì?úÀS€Oâ‘! $ôQ%¶œ‘‰\”5+ugFú€ÀÃÊWµÂß;9AkE-Ä©rsmPi‡8¯¹@Ôl« | òÃhþåCR­N¬±¥=DËÓ®Û¢ÅÎØ3CÅ£µ˜8é*+Ž´ÕÌÊ>ÂaÎJÓ|D†èv=±EÀ<˜ÒfÑ—ñ¶cP<ˆ$H2*Jãï²:»{¡µ„Ö·¡Á¡îÞ;ÚÁV‡@àÑ­¦.¥Y§ W÷ÊY©ÿÁ¬µœ{æ*bÌj¯\öåÿ¶o2+¤Ú‹¬‡EÃRIQ·¼ivÈ,ƒà´×Yë DǺ‡êNâér©®ç@cv\‡ 9/ˆ3ëI{µµNàVãã=4Ò |CtR鯕¦v 5÷Ž–ÁðkúQé»÷¥¡ª§¡6 –)³ZÔØÒ“Ô†ÓTÛlƒ-rEÃYðöL—lò*d[­êŒg¡]Æ+GQóÂr=jè pv 7w!÷›Ó¬ê<üpµíd/†Ó$ìÂIE¬G¼UÛÝQ[.X=ÅâÔV»%åôŒj(qH НýyÉËk8†2m☴9Æ€ÍÁàèMNb.ž¡K}§Zëɶ¯à°ïÄ…+cw—¶NY}÷Â…,®—òýIAëT‰Ì•DÆÕŸáì±yȯùá÷ "sE6õbµ/7–þú%ÕñQ¸û ë’kÝhX—;ÉÑkAÄÎN ô“Zoÿ\#×ÒZ±ËžâX%Im/x”&|&¤Œ¿žø?ª¢üßkhðâ& Á«Ù?ìÌ»Œ„Lç4IH/%»ÄQ˜<¼5U­3€Èâ*úµçj” Sl˜@úUœªzhª´Ž¥C&<3òGñXs_•n4mˈR¾.ðájÛ¹hq-ŠR´EÿÒøœ"nÅ%ÓKR®1•0nYÖ aÕH2w.¥µZ«ªÕÛ6€!¾j»-9 °ÐBR­È†ö•03 M¨Þ›Ç˜¾éOAÒêè=t€Ô^Ùß Õ@cÕ½0¬¹rK/å ¿£+¹Á:8Fë>«ŽoÕª£~Ê“‚­Ai‹×K~kOÙf@Ð,^Én®’V2$s/… -1¹ªò.ÈŒ‡BžàßFu÷'‡½sb¡A»‰7”QÃÅ]X wnF”aÙÛ„?WÐûÐòŽ…Q'‹K×PgZ åŠç¬n–'^§;áÄ\÷ö[cù¿NCtJæìü8T*j_¾E¸‡(l~†ÛDCï‚°|™Ä`ô²_ &ë×€–\í.i!Ï­v^*”)¸w–ƒ’ðýå‘Î ƒ¿‹‰Ãë2¡ôv–2›Õ9-™“ô@㸉ɨžnÞ]À1ÎWgÑp’ÅGñn¥$ž«dË Mò® ±0½¸îOºPÿ5Þ;—ÐùAICÓÏ ›g±)ÔMP§ò ¸Y/Ìs5G׬§±ºWÃùÁÔ “ǰ=Usi†âf›Á^áÆÔ}÷š ¸Ðˆx¡ oÕ$žiÄÒ§5œÒnŸ£¿æa*«+t bÈy›g"õ~ilý]ÈôçãŽËvŠ{…íczÄþ “a]3'p#ÔêÕ5º+‡Î€×xýëiDÏ”J.%Ήá¼u'Ÿî•þõá¿Gýÿzú½Ë¤ËÌíŸÛÕ·qðÞÞÛ{{o¶P$ȾÑ/ª[3’‰L%Ž2Óh‚FAÉÈHžªÏ@gnúu"T+’þrÑ–[5© ÍH¨Ú|ËprˆFOV2©2JH-ïkXäS\@±Zr,{Öam­á0¼õ!ÈÄS¡9p$IaéH¨z÷ò7 Ö?áÈõ3#‡Zœ®*v\fÛvµ_–edœºœdqj©9µ Ç­“òAÈQ¥µÊs:dƒ\«áJÔ<¤Ùœ;N*[BlùÀ¢z÷fy1ø’ZÛAã8çÊÖïØq†bÕ6´Ä²µp¢«gí‚]_'ˆ#‰³êæd\€h7 º‰`úc­¹Ö^r«NÐÕÒ«“@¬N¶´YÔdË„œ]„Âê¦-æMžðP¡Ì¿UsT¬2B“MÈS¯ e'a;þÉÜ1Ð|åTnÉÙÈŠœºË…Ê稷 eMêc~uRÌyîzñî>÷JsˆoÆ*]€!wQã¹¥[•õ‘Àih©Õ’³† 4hU³E;+ÛxöËl fœz«)•f;µ jQäŒOÅ³Ì G=|:¶>uÐ÷f/ö '‡ÕRe\5˜º¼â'KÙ=l²k{î CÛʨ$êèàà ñ¥u,…TH wîÜ›Ùîº33|„‡ïûxip5£œeõß5w9¤:^”Gý—ëQÉuÙµ¹3f^⢠¾øè‚ˆ\°W‚Üü$™ÜŽaÙ§ 'f½ ¶óßí„¡áàtý®¸Å“¹ƒçÀëuµŽhlÝA'°89 œäÅ![uw”: ÓO€º­Í_+§7Ø)ËŠq˜3žÙ¼ÃÁK({m&X8$&¨çÎÜ P ô@ŽÒ ¦á­íL[Õ¿Ö`Œê+¸§áØÀ©²|BÞ n߰ЭW6M¶œŽÊ)ü8³þWµÿ÷Õÿ¥úÚúÿ”8+ËH '¥ß<Õf!Þ‚"üT¦…é%mHÏ„þuÏÖ/.ôú y/Y±¦Ý§òïi½ª éNíÔ‹@éí§è$öqÿëúò=˸žåWíP/ÐÐdìÑ›Y¾’<¹‰vP÷ÀmUáK%œË}ŽÏ N‘¼Ø´îœÉ‚—g˜ÎV×xt {xÝÓ?°Ô=5¸käX¶æéX‚€›#|ßDB¼b¨p}#ënàqñ²q2Sm;¨_H†Ó¨·Ý ŸØÎR7®’·/{\þK6½1âÏÓKÖ‚âF’_ùXþÐiºŒÃùÙGóÛ´xoïí½½·_g¨ ¡êGÓ‚ç÷$v§/Rk*^MÍ£è4!ÀAf™­°o—\ëK­ DO°Ùó'Mò Ã p(Ž&ï2¾†yMÍÁšiÈì¬ÕÒèUìÚëi"o=¢lò÷yàùL¤Ìù¬X¿`Hå­¨ŽR÷Ê2ij`SÖ¤%…¶åGî8rïpt(Äô6ÌøÆÐŠë³õäpÔ}‡³hÄŧiº¹ZÅh©- “™u8u±æ0(9!‰½´¿cÁÍüÈÖtÒ!ø%¡±þ¥ðEñG ƒ(8¼¾~lî Uø‹¼ò~¶ÙkÌé3-Vî‚GL¬°£d§¹Ç‡fÇ@o÷Ú‰UsDŽ*öi³¾¢êŠVÐí:]¦:\c´)Ý ¼ ?r+É—NaRs#16ÇÛaåÌÜÛד.ü0à’.™Eú\T¹b ”}÷ êáÂóÞr½\çLŒñ´™oÞ¥ywÈMºÔnØUÊÅÊ¥s†$Û[éåÛÕIJ{¿:D¦¼gW cîÙ½ŸŽ£1ãp™ ØÜp5b~oÈ>uM*ŒÙ¶­eÄKÃ@‚?Y¨ÌIA5â(ú£þëûŸ¸Z˜ÕLJl¹iå¾ë5/¡dÔh™c0º«“]c–-–C¼%ÁG1¨'Ý®¶¶ÖßCöLˆÞ?T:«r­vOÉòBÊ¥„;«=pi~sn³CîÃX£}ÂHènöØ[ÄB­KƒW€§Š¶Æ”õ>{s£ÌùØ,¢ûbåy¡ú}U”šÕVÜ¿jS V*ê.äÓå8=ƹŠ1·†ñfQÝ£0¾¼¼ç/Ð,NÄG. Œ16Cv1†AîF&ÝD?×ÝñE®„½k‚¢VûbmûÚº“=#}N¾„‹]8~}:Ì]•ö/êÇèFwV„ò—á„(îB´ƒú¯‹››vÃÙ¨ãÉii“À×9¤HÏo«(:$–CaG“ÿ´Ã¡c*ÛÂmZv±ÄòŽms÷ŒD×;Gnî6[ úäéè]Îæ\òµÛ|ýpº ,ŠƒVo=ð~­îÿ™n÷M`@Zéן‰¿ä’ò+fÆ7¿ë½½·÷öÞÞÛ/3š(©UÀÅDf «I”¦A;I´ÉObð -EëNŒÅ‚õý¾á§+¼(b…ÏRÕØ¢žç\9EEC©RivÊ!‚©}ƒNµ…®`vÀvæÀ„¹°6ßB»{r )>‹8ÄZÐÝ~±ˆÔOÅÃx5µ¥@ºl‘Ž®ÆVLErâˆZ¦ªúµËU‰bk«øvu=ªåRéÏ…}8™2»by÷‡öuÃQÔ«Ð’¢‰‡±qRŒÑ+×®Ž7ks–d‹Þ~Q+÷C©™%\dZ±K°Zˆn“®TC¥sËf¢}F5„Ž%á4. ¼mÖÎ^6‘HËö±¨^;n­< R{)ñ,h Ü¯8ýêÔÈ0tZðQ@1t+»²}GÒXù¥G²0gt°F%ŠøÞš©šÛ ¯Œ”ÁP {FîŠ?“œ 3„šc—¤„’À…dæJ\K[É ö•×ÿ?{o¸å¸,ëF€ê9ïÿ¸wZDÜ@™ RUw{loqy3Û®RQ$™_ôȆÆÑI3R©Ç™%¡Vœ<ñxâ!ø‰Okw|Ú„eúmÑNZyfü¢®¨œsEeäጆ$V†X‹1–|y•‹Ñ¸»ÔÒÝ.…·zm"“L‰µ²[KrÌÊð,²‚k?y8 ÞE—{´\XHo’“+¨TN öZ¿üØgÀJÌ<ì›(šãÀ‚zL±L‚ÎÎÿp¸ Ù?Ycök‰ßT€lêÑššÀ’pñ¥£˜zÒ×{n¾ïïÙìt®tWÊ·ˆqâ{Ìk¾U³û¦dïŠçLjݾ˜ÒOkA±«ÃO_D±¡Ç)²×ÂúñÚ=øvï}w¼E·Z>J0ÉueÉàÐpé¦ ²^)ïQxÅÚít­íê>c–wZ]^*»d1Ìí›1É;ïŠëØÑESET¥·qñcrÛŒÄÅD—Æ’˜@sƒËZÕö´`¸Ìâ­ºÀúµkAàNwó¯°ÍT™’ø(ñǤW”êºÀR¥7¾Þû´®õxkØ:D|ëyßü ßk–º Ä~•Ê×~Ì»èòœ*v¬ò»Â1ÿðDû/9¾kkèßu?úüçøŸãsüã €.‚ çæiž2–""hkTÔÓsÜ›ON8«ši‡ePÚ9µæÆŸ©&{ÖèBœ¡ÁþmTŽY‚ ²Ë–‡Ž¦iT«q–«ièƒq)Nàˆùv¡žøÏ‰Rñld jº„ÚØ³ÂC=XµZ•h_Ö—^‘ÍH:¦ù.J¹¾TvÜ‘¹rjlû£5Ê.=ž×nD–#Œx†. ã&’bhÙÕî#ñàFÕ—b±­FÂÍ ½)Á DÂW‹—%N–Ðк+Æúï,”FT§+Ön2+ç ,œ‘ ‘qjú©—|‹.©F"jŽ Î:=$"Ø<åOin=„ãì£â,ΓÉén×áaÄ…®OEPE±.™:ø*²ü‰”:K ÃÅó²yçtn&î¼ìs¶½ZDÇ;p]4ÜÀ'ÝUfézƒÝTÑð+ÜÀâɽx!³[F¥ód­½·cÎÅ.;§ËoíŒÞŽ¡ºVè‰úDù è}4ó5ý§!ׯÃÍÆt.£å¯-ëµÎA5šW PÊ,<”HÌ>ƒ4½$,€}©Q¤9èmTè²J±Ê¼J»Yf2²®·Çä®;AD–BûZÐG†pP¬¸¾ñíµËÞðˆ§¾Õøð:ª#‡á­É‘³üÝMT`.2]•¸Ñ °¼ÓZ¾NÍé¥Ù¥øëîT`N_Ç£–rO]¶¯š³ ãcE,ϵ›´y‘ ž¥UeÕ°—.ë}bj÷U1,ßQ×/·»Z$|/ñ̾ŸLr•Ô:Aoì¨çà ]å´ÂKÞwdâ" 8?SCITÎu¸¼dÌâoí ~EKøí¢ƒ¢þëïìàªÉÕ»Þ÷fGø 9¢KS4õÆ%ð8rí´H½JåEÁ7'Î0Ÿç¬ôöäîªúäÍ®Ga³vMö±åÚ¤1”9ŸéQqÆÆ<ºB :áªÎËQSxÉ&;DaÒÙ×ûëÌ$ù‘6ÏòfŒ¥h59y;¦¦%½Ð,å*3ø¦º¹õEøÖ¯¤âç®…1è·BW÷‚óÏ—Â3¸Ÿo¿AúzkÖÓ~úz9Kü¯¦Ö—oÕ¿ sˆ¿í‡~áûê;KímýŸãs|ŽÏñï16„{é8‘ÝâuHN#„ð(³Þ¿Vœlj"Â)DZѬ¾lâå R pQŒPQ x8uÒ•#µðÕ°R·³-£yû"ôõìp½#Yo˜ôõÚƒ¨4, IDATì\»Æútסg;m—Üë€Èè];v :ŸºV¹$€µŠÝ¢}iá(æ%£@t ºÉRe–¾rªŽN¹°j%Ú´œ±‰’Õ¢vdSénPåä¼`F'>•I-/&÷·Û7 iëÐ./Мþá8ñDO™îjûÏzLt“A‹Õ¶<ÖáðD÷ŠË¯æEmàð¨™ÚZ|–]lqï•׊èVÛÉ¡üÄù ²õhªÃÁŸè›±ê6~NЬXÚ&¼³Õš Úí9æ=a°›ú},ꪑÁe ªv5ŠGº'V¯Õ§H™gEìȪ·l4±J†¼.WÇ:H"ÒǧàN\“Lc©¨‡!µ'c׳­ ¥øûr²ÿ‰‚caÔr°;óG3I»•üÓ&¥q’eöÆ :lÎI—wäÓ´Zëy)AÔj«Œ÷ƒ–]°ÃÚH›=²x¥§Š!£6ããD­š¥gTç_Æ bÆS+ÈÖêfÖf9¦!1£°a,g–Jù1YRzãò—:ûoÂ3IXî¥l öGT¿Ñç5<Ê.:B¨ê|„kteÄ,!1Ø9Š¥Ç++#pc]ó•dzN³JP„›;ÅmgܾV,^¡x}E00…% GŠ)»â=…ÿù”!í5Ùûk:u|‡–üÒ¯Ë |çÚþ%ê…C^‹-Q*fç½³¤2hQç‰ »œ°¦Ç2EOº÷ÂW¸%9å}wªóÑ ã8h¶Å® µÌßÏ<äÌ¢#m•‰#¬, ΄š™nºæ"Aî óVE›5 ZtX.½Æ·â­šzîØäK6ʦ´JÊ.‰[W`k ¤“ÕOûJ[ót^â?ç"?à*Ky¯ºî)ø•'@ß›î®}¢·´^^wn½ù·_M ßD¯ëžùÆúkŽ-ôüŸ çZ®ùßG¶ÿ€ø?ÇçøŸãßmœÈ{®ô\§£1ªH=6 :ºÔÛj®Ëš‡†>ªPÑÁ,½<çØ°e}9l¯µo›ˆ´ç/®6I³â›Z]ÏGVžÌ§&cj®‚Ì«òîßu²ø[p‹:l…¥³(Ø(4t—® ‘&Ák¨Š{¡%Jn*õ+Š×isCKª îäJ¹™O˜Zgر¸2X™ÐcžPáÚ]»'Uèÿhd¸`[·ý£Û1Ò`ÖÕ‘Êá°ûþT}}1ëÐÛõiHŸj±l¾Ð2TP“þÛЭ¨?ÿBÿE9uÇÁR€J±ó,¶-d®œ ÔŸ%ÐB‰—˜¥_Ì¢kc¢9Nà 9ÉÍ0(~ƒíŠ é~½¶3rŸÊžîêï…7š:ŒQ‡îÆa7’ °µ%P‹¡Þ}ijrP–äj?Öº:ØÖø‹¡Ó•¨ïëÚ´G(Ìšý¨ÑÀ»9–}û+m>-ýpçàÁYu&ÇÖ}\¬åÂåÍt`À»:f=eb׉»‘Uµá¨`™pö ¦{‚‡MbUóRö(¹™Ð«$3:»ÅÙç!ûþ0ãy¾¶S²²ô¶¸s— UO‰œf*»›¸Êñ£àtj Cñw E=ðÜsÞš+ :cxÄ/ëmÔA¾ªìŽïqöǪÕæí–ð•Ç ©ÓmmU!u`¼¥G‹ {˜A É2‚Mj÷†=n(9ßá……ÔΕ§”à!ØÕ›'.Sƒò„±&l+ø1t³c\0v<Þ†%¾Åù¿8ï$ø ‚Q‘ä"¿P¸Ñ}ÍkU]gG,/ˆ4%¾ºF¾ã_TÅ´UW€áMí3×á›Kvo9+M˜›ñ•\ØxF"·w°{cbSÕî?š/Íæ_äË›ë¨_a"MWi9íc,zØœ*óLÄÅÀmz³¢4ÏÕëðïe¸÷ S%Í“ƒê¾~–¤/ ðo ãTƱæO ¯´Xàæ‘ãJ®3Ï'WñºÝdA'%™>Åo{¨I×þ1 ÿg]>ïTíÞ\¸7`ÞФ¹.Y/¦¾=!igm¹mè«â¾Qû}u—_’_ùŒ¿æØ¿ÿ*™[×êÿïõ^~¡/Dëæð9>ÇçøŸãÚ(&çUM]r”À4yèXk=û^@Åi5ÎU85#d™ÊpŠ¥_Æþ¯4lòñ`1}¹É1')ÍÀÆ‘Dʸ±o@å ‡ÝtL-ËA–H¼ÑLŽí)Žö½Z½|+?Ê\*Lõ V„ ¬VÀ +àí=VÝÚFöo•SÆÊ®éìJ$Q}`s`(ï|ÈåÀâ+{Á勱qš:Y:¦Ú¯ÆQ#3·Ìoí·E©Œºýׯ¸§“2¡PsT{ úT]·+ŒÅM£4~ž¼““šÐyV<€GCýüèÑÄUÐOè¿ÀÁŸÐgm¿®C,6H­(F)Úçw'œƒµ[sUº½™«®ö,àì‘•=±“ÌPQÅrþ·šeïG7fÆC"]rxF‹S·¾×/Ü’«‘àaúì°šðì1wí›´aCVÇÞ)LçÏè¹½“¨QCbí¸æi'¯U“u*À1|£VÙíæ±~eºžcXêŠýü¸¥G_ŒÛZ̲RuŸ35s;æåN~vZ ò•ÅŒhèRBdž6avÃɉûtÁ`ÈßN*<\¹zoV¨»JÅ8zå¸4|£k¾±†¼PE]«0Kõb¦™9¹¿Ûl¥[o áUªˆ•ïöeëþ¬¥è‹â\GSK±™0Þ’4!O3“Y€kM·o;X$>ÿÈO¶Ò@š(¸#‰¤DlĸT(áÜ„4xôGÌ®¡puè²jfè…–Úùû”ȈûçŽá£ûXÝWŸïUÑKðúŽ˜O¹¶à̂楨Áeœ':’j2ƒÙh , !û±ÃÉ—Œg4øt"]*ƒç”©UÕÚ¿&ÇJ<­êœ®Vˆ®Wœðjblñ«©Òÿë1)ÄY&l,W GÔÉ%{šfC9ºÙPZŒž/W~„hGzFé^ÅY&þ¨ÕÑŸö!_DÎíUò›Ã~y–Ï×¼y¼´‚&'ûe­£{4†^ßNél٘‚ÿü“'ø_è üþ?°³rp–$ñ˜È‹¼ƒ’71æ£ÚÓQR+¨P¼3¨G¸‚jÇg5é¼°ƒ°ø®’W+÷ÝQqZ†s)ÀÑÅè:¤·j?î„!9ˆÓh§ Á¦V17Ъ̦ò^\ɶÝz(4vL;gM©Õ¼ãþš+íwë¯G‹•Oe?P‹‰ÜŸ˜­0%_^¬xœ_Ç_á¼A«A8f ùóã‘”s)æÅw×)?ƒS^oSe)8“(B9ÍA©ÎãœðåpvŠ)ô^Ëžh{öàm‰‚i “Ó£-î‰ÓðqGº3çàržGÌ‘‹“Θ^ãÅé×ÊÖÁeú¢ÀGäNYrõøµšÄ©îšÃúÞRÝ"Sâ}]˜BÌ g\sÖÍ0üÞØêÞ'3½ïâÇJágÒðõÈÛ’OÞ€ž±Ë4ÆÛ›ãÑH­NØE³î` –®ºƒ÷È<ŠÞ˾¦Ä½éà)U>®]Ã9×ÜyÉâ^4|-ŠÖÅ¡K· úftãæZ$Niÿõ¹.¥–±íË)Ö˜ï¦CbÇL÷¥Ž.¡±5ß:[¡•DÈ–XŸIbS£Öx æ7ëbÛÐúu!‘»Õ¸R«Üºv½7NÒÇ'€ÞîY&&÷æÙt“\ðþ™ºN_œÈMdËúW.@òZW6 Âq©¨¿€ú®˜ÿ _àÒýy3íà‹g9Ã?#Î~!À€¿ûúþÅróßFÝþ£ ÌÜ5Öü²3ð9>ÇçøŸãŸn´úúµyß‘¯9ȳå°:¸f¡}µZ'É%­f¼XÍ|¡):«âh©†µàžö÷Kq£êg8Ê6ç¾Â 4£±ýS*ЬêàÓ D]¬ÿ ü$ qXíí Y­8F0»†¨¤V¸ÕÛÙ.õ‰RÚqLŒÃÄ‘k‰¯ôÁƒþÞìPÜ™ÔìÁøŸªá˜š10šcs[›L9œuÍÉ4ÃdKÄQ³\ûHhM'ýÊèºpi]ƒ.%{=±Ö¶åJÁqô}r­(g—bÄqà|'ôßþŸÚe×Àö[„N¨‚Äö\”Nðà™7Qªîöµv«%Z«D/$•LúrÚ!@ »êÊx@‡ÚåÉA•ÚM?펴Zâ1\ê¸G¨3—B.&ÕäûvÅiC«ÁÃddBm)VÒØóƒm$ó6F2ým4Ž•èÝFW}0q›ê«ªµÕ›R¨ƒ‚¦™ËÉýäEðÔüC½óF óX‹§;' f™ã:ü³ سÉŠ5«.·ùª,5¿õ„ž3¿dòaàá+ÝÉÀÊã[6û‘öˆÿễ ­Û 2]KÌc $¯k½e¯Õ$qaÎüvªµ\fÃtŒÛiÌaëÖÐëP}Cœ–Ä EYïÎhDZwäh]’›Ðª¯xe|f1)Øwôû¤"¥¼Å@ìà‘ˉQ¢‘Ù-n”ßœÀùè~‹81úüJÌåŽÎsJ,¡ál¹ƒ>q¯ý¿Øë‹¢ /f°„#çU­«~4°MS÷ƒ¤ŸMÙ”¡n¿>õº^5™²÷¥Æiþ¶ŠÝ—%®\Þeº0!¶Ý .VÇ0 )–§i{“C†NGvº¡×h˜jü]{Ó(À\¾Sa•ñyV£0ûµ¼m)p*öèä®$_iîÂ4¶•W|s^Íiß„ï.>``«@÷§tæ‰5…4ÄZœV”¾7âï‹Ïبq­Èùgƒ$-âÂði7±0‹W­!ñIJ•÷+Ê¥6éÊóË^®âKgw&|–àæ¾ñ™¼š²¿ Áá>ìáò·~$í{ŸóÛ;´ôWÀ|ãã!ü©ïË?}ë?ÇçøŸãsü €ºä¿­ÛrtX®ifN–!¬Ä¢þ£R²Z*©aÍë(E ˆ½rÏŠ8Z²ëNÄ/±lÜ·![b0C6v8½Æ—Zƒ1(ØŒ„âvÎZ Q\`lÛWÔÈtùÉ59Öo«km±‰(€Múœ®Ih´’”ù€÷'v¤UW šåyØÿ[ kêŸG‡ÌÀZa䔣Ɠ©,‘x -U;‘¸»Óstgh>•3Ø ù—Oè œÐ³çÀâ%úÓBÑì ÍÌÑénS5 ½û-¹÷Ö}Ò/ZL—Õ.!öR,r˜£ÃÁ«Ãuêݾâ ù%Õý¹R}¹–Ò\Û‚§ºÓ1c'9•k"K ¼Ø:ëñ›!7@OÐdÓ ,ÃÀ³)‚ûåµ9Î,E‘(Å$áI;++#Ü]F׬@.¾WlsÜž[A)Õ|Éñ„ωŒcd F{`ëô¬+IŒWdã|*ãò}ÿYXJùPúõâ즂+pªð Øm^Ü…×ÿÊ)R è„&ow t%ôkR:^I|Ç™[fÔlŠ,ùÈô&tŒ‰þš«WÒþ}–€Þþj‹Éqeè•g°uaµk¢ú°#ÝÏ&¸füo¬Aÿ‘SÓ_uaÿüs|ŽÏñ9>ÇŸ7µ_³p>,7¢pè€ÀtØ^ åóZ«?õ¬Ú+ÓiÕÊÒì?˜!ÛÔ‚Sø!<œø‰.©S„%Նݪ‘žh±ÊM¿a’¥WZqt¯™µ¨Þöó¥àaÂz-¦ zQÆbBi܆ês]àç D£ô2aš‹à€]M.ñ{„÷WHðd/‡‡…÷Âå43*JéÂs­çÌÀáÃ<€ŠÚz&ê†IÒ´ªG^Œq_QŸ½ü¼9@pµŠ…iº®‘4±6c;*†D¾ØP”õPT+Ÿ'êxv{ƳõKPxVÔÿ~$~ 'z®5d²þå„<«š—9=ô0w§s÷å² 3VP(ÿí¸ »E¨NInÃðózFµX"_¸8·‚=@†Ph9nxÐJâer}ÆxÎ^þ´c÷Ðäà F"Ã!zâ>p­¤ #¤)sŠ>þ§á,4æ:;/@ù¬NKÖu¡!´ÙƒSÜ9ÔŸ\íb™©03¬ ¾ßht6 8ªRqQ~¥|êÉž¿íUÑöTž¨'tšJr Ò²^ÌxhÍ" Å.LÆ‘F`‰ìüðè¿XkÀXÊîÁ¾¯••ƳÛjÊÛ9I‹©½%¿òÿˆRã{1¦aKΜ®¦m9Ôÿ)9É•Ÿê¨…Ì~Fç×õ°h]Œ”!?É£±KVÇ”¨ˆõï¯9Ϭ[‹Uùƒ ®01~š˜q*ëÑNàRÓnÓðY*ýuàß\ÃéWÃõ@äb—€rµ¡õj×¥²¿ÕÔ¶!ºk¢£ƒ/×—b—+Jš÷×½ 3ºþ7Z@²^· #AJPrVþ21b Ñ,.&÷v= «Ì¡ÐáPv‰ŽºU µó¸8OÒ{zã–ü“"nKä üyÍ„ñ¢ÿ¶SS—Qܭ瘚c·–ÏyJW’«h\Öx¸Îã׋ 3Ì–ráä#CØã<³±¸ýûÊM»â2ÉéqÿžØ…ÀòÚHÓmg"=lõ?.P?Ô‹Á¶~Îejôµ©Ÿ_ºˆ ç>×áJÆ¿<ß%¾ûJrå®/á]ÝÿÆãúÝïW-‰¯Ú3—ƒä#ÿ®;¸ ιMú\²Ïñ9>Ççø¿×˜ý°ˆ…Q¦<¦œ±Lqeç'ÌY3?v®B«….Â@á˜Oß‹*«ñžÄ¡Øà×ߘ%ü4ÌH_à(X1à¡~](KômºU1PÃ)Ó{Ù8ðqpßü‰rºJ"ÓÔÆ&¡>^!SºOÌ肦ÎO¯Å̃–å;ø ²Íg45ñ¦d5Eè1b‡‹qx†àSúéUWÓœô¥ˆéúpIÂÍ'8 ¢äÐ+uWÚždNâjÅ£.yμ؞(Vx­I} ±„œs<€PÄ“ú‰çOÔŸ8«“Â+ðœ^Q»øMÐ<(DÔ‡#éÇú»bÞÌ0z¡n™¬€UÔãEÆ,SP&„ªÕîµ%WùhÎÍ'±†«äåøöh·õ…‹³^Ö­–œ ŽûUݯáR1ÓQÄŒ¥õõË“xîò¥½ê=„€þcÇ,cŸq‹˜é¡’zø(örsàŠŽ^ç.—PMZíÆŒ‰ª:{‡ç,?‡« çÙû6Öi~eƒ\Àéª/Ë„›Mλ  êà9ÿ0”Žf|1=¨Š«^µ87šÙì4ŠÔ¬²?"ÿGQåaSˆ^ïƒò”;HF.–Þ5.aªÔ»Òºš\¬-i†ûQ*8KtZË)èÛ[àdwÇã WP?Ñÿ.L˜Å¡oœ&¥h‹zô¦ 'Ÿaé }"±­Óh¡I¢ð ™\ÍÅ óœ§È¡6Ú\Éczœ=GÁ×áÊÕDµQËw_dVúv½%w ýn~{ÕÏ0Wo ËEà N†îJwƒõRmÑë’Í,?}#Ëñ 7ñf*/ôw¼«€ü ÀU3¤ÅBjH¢ÉùÖãíƒ+^;9nI®«û(ÿü"5ðq1¥½X©eÁ¿æJ˜| ˆßÔÞ;¿“8½§‚8¿aÂò…a¸ºº—uGኴJ#“a×!Å?0ª^+úÍíöQ.Š"2±÷áÞæ¼áþC° ?ØÔÑ/ü¢Y§ÿŽo ÝM‡™È_£¾Ï74ßmX´¶–ÅÅ|rc)-«ÝSõ}]z»‚7p{)Ÿ¿ ×zì"õ&äfY6¿;ûé£äÿ Ž?tôÅôçøŸãs|Žÿ£zùsS„ÊH˜´Ò,˺Ån¼ ’˜_r£Ä†ŽhßX@]#*KW¯I±*S / -×MµÕv“BZÜåP놀Õ1A éÁNþy€8…³¢ž8k×Ç‹a¯kEÄ‚³1£›’x:ͱÕðžýÏ:Œ˜Q2¾™ý)˜w=–òcìÚIJÏVÉ[19¶M‘9úD©À:{:1Õ¯+Ž‚ãÀYqV+þ¬‡>ï¾HßÊl‹CoŸÅukhîLfŽLÌ:}uöàcnrZ=rc£?<;?qžvkJOGh`tž8jïb9K/P­ÃÜ*(Tz·G©ygN·ááÂ&Úå—õòƒ Ž_™"¾]¨)Ú˜Ä ¶ÒefÊzeÆ(òÞâÊ}‚kع|¿³±n7 <—ÂÏþâlÉ7¸.úûäØ}×6`4à´ŠJJRø$áV|çÆ©¾FÇ–±ïip°þ—^’߃IŽþmkž(?{°y×è”Òõå©þ”¹Ç;O<+t⨖Ç^"SÞ…á¯ÎÔqÅéðë3}h¯6 „X§Ž¼ËÿfÀip~?náŒX㡉!Ò™åu„ñ'ZC_¸ †S÷ÏThàs ‡‹vZÛ'÷ ›ÍÚð¬çLåJ§{¤¼õxÒx*½ƒR|ª|ºæ‰äã1Ö$÷, Å™Iýw×P å¨þ%N²´»Ât„.<&Tª9ëµ’Ï ×I¡Ç˜½\C4çn‹Ë|U®®—BÎ2‰1jÓºµ’°¥ /Ï™q™”‰.¼Ö·t‘•³0d´äÕóµæ>Dz]½dFM²1=Â7ðMqí7É"ó •¿å^oàÈ\5J½³¯Üü8'mnyšÆ\'7)q½éŒI¶k1oÉÂ.15!†r&0s¯ cVǸÎÅ=8Ôu".à ѵѥ˜,Wá°¼Zª+Êó˜§k±ªÄ1J9ëM¸¸5î†øÞYÅq®¯µ~äv½¤~Ý\âû¨æêe7™ä Ÿ!ñ¥òy¤ÅâZó ¶FàHbûrÜ€¯èbæÓ²†ÜX^ ×sï›éêÒí •+õ_ß™ ‰Û¬µß¡BtçËUÿª?ô9>ÇçøŸãsl }]RÇž¡úƒèí_“6:èÀ‰}råùP‰€‰é‚‘õŒRÇ$éábx´ß¶ÉÒ5‹ç¨”xŠÞy`Eñ L_ˆGÁ1 rM˜Pq™¨­3 âGÅ„'ñ¬8é¸:¶Ëê'\'êÇo)e DiFi;PÏ”¨Ä°m[±'píÌݬ‡!‰2$ƒuŹq½+γ‹Vu”ë—lj'õ}Fù«Ðb9'3}Ô·>»È[Kw_P6}€ßi;°FÏD-SÀb= :qª÷(Tc—7 àØ&#¹tà{ûîExœx¨‹¼UäJg¿Ûô`_¯R ¬óÐ4Åq¿ík0ÐÛ9œ¦—U”gŸí¶éUõä ˆÐ„PÙ…• ´«]µÌ(ŽèR7q ŠÑ—í"·¿(W¥>Í’e7B.íœÉŸÁGq×¶&¡pÔ ×`(Ž*¿¹Ñ¢]ÃQY])7P*ÈN,‘m¡-‡¡ƒ€`¡Êí‰Krù–Õ&Šb‰²tš£Ö~ôÇ …í«—\Õ|èxð•içÅâ>Kà‘³|œu:clì$ÌTŸ%lªî9+X§i»O2vI»¤™r™åŸÑ9ðÚœ‘™F i£wç´‘™¯mlþÓ2¦Kš™,,7ÿõüs±>³= å¤ ­0eê¹ÌBÈ¿¸²Óõ1L( —²ÓÔcwUû9L¬døsÃñ€2)×ò¯ÆßöY ÝpM$f”8We%Pû¢ReùXvé) IDAT.–ZeÉ> RQšd^˜„$¾’¬xá6ðµ¦#¾í”p'{éB¾¼:ß_Œ}¥â½õÚ V2Š ›k+ÄIÉ÷Em“0ÖN¾:µd 1cÙWÔÞ6ôB~&´jŒm~XV­e鉴ú=‘,¿õ?B»ÛED0݃O^Û6I&Ö¢ŠË­¬â9èæú;žüºË?’toœñçJTÌ•£Y‚íÊe0„:Üèæ@èÏN3ÀþÛES¤ùn¶í½Ø$¸.>×[žZ·Y,üÊ®WVÿžW¶¸6|-loƒn®ùÂ#y©çîiio ›òÿä]HÌßW7ÿûŸäÛ7âW#…oHMfÐßòŽÿ³‡îçøŸãßi.S:æCe8(”źÀR¼$TòŸø—mÊ¢¢'Ê `yˆkŠàv¤H½‡ù7<;Áy¨TóÚÖÍ–J.%W"øLY.Í#Ä!®­§”Qì¥&hF}MIN:š¬_Œï[=œI„gdÛv6Ý_ï3qBzÞµ{âí>èXH¨mm÷Pe¯ø¤Tä)së-­C; Œ+BúBØR⮬J“öRÔVý_MÐMÇnÓœP»/@ÞÊs¯¸L®ã¿ëšä´=Û¯«߬ntnY_Ó*\™š´Hº^X¯w;Qx3xn^dÊÒé ˜Ôÿ@Aqi%XÓÚ¯®ä2yÊ'd\¼ý[ œrÁ~H‹Yì•éÊ/NIÊ¡ ¸ÿë!‘ÔÿÔGBØpc Ø4»¸ä 5÷‰Úi ×ãs>Ççøg §òªWsÏBECŸ˜X›Üí$³V z˜’U‹©`žÙbbk'Ú·‚kÓ"×µTS[š _áòFB—•’¡Á™n30úsKíUù'&M¨6V¥Yñ<ñß'Nàœi®ÃÉhÈŽøqà‡põÿËÞÐòúΤÒ ]X¨W‹ªfù|1ÑH±yB PˆPgíÔjͬìiÿ+u"SF’sÓ›²ÓËxP8$c‡©ŸØ³|K¯¨îŠ0çö’ –’gåû̽~ªe*nulº*Tqž(Â8œ‡å7œx ­í“­!wò÷RL–zÚÞŒ8 ÂQqŽs2kkž÷@Ú<„r{ÆBon¡»b3ÎMN mnÏl•+ /®V3‡Ö÷ìsñäñ‰Ÿ;•5õ¤Ù2šQ<õʼn‡úVÎ×IéУҼ@Ĺ´Õci“õ½̼TÊËíîä5SOgÔ=S’+Bo_ápçPkŸëhfçL…5Ì×YúÀÀÙ¹ÿ#%‹únʯå¨Ëg +.j¯·°eÍI rÙ0¨êDÆËŽÙ5k5ÔéÓ+?E‡g7§Í‡ð5¨÷=úØOMYF ØâM¼¡Kèݰ/’*ÔžÁbÙÚêS܈¥õí,yÎ<@…²Ð†÷$Ò"£'1¬ãªëæ,áím-¶‘ƒ=S…/uÆFFÁùÄÓšb&ƒIÓlH " Ø¢nŠ™u3Ÿ` 1vÞØ3S}eè,tiÚø-—QáïlØè̫ͺŸÙ´?e£åjÈw}‰õÜE'„‹o2Sú±—W‰×î,ûî ¼kú­;k"³k’‰5dz'Åb – ç¦JWØ%g¬Rãõ× Îh ­a¦‡çÚäñóþ ›${×8í´¥É#ÇWÒµ~¦„Þ”I°ãÉl9$žÉ‹!2m--%ðÜÌB~{†4OªÔò¾['á˜1à竵×ÊO,áFoÝÊ‹Ç@¸[[b;²¸´²ùý– †à]®.¥üË“YæØË‡Yw?p›~|aGéæoíjæ ÐÂ4cX~û¥¯ÀÉÞóF ¿øZ‹ˆßÐõ—꛺!+O‚ïþ°ÿÛóÿÈÓŸãs|ŽÏñÙè᥋G'œbî(ùÅϺCØŽh`ÓGý~åäû,¤Ttv—/(#)·QÜ9¥Ú©°7t~(‰uˆƒð ¢GƒûË €=æÖH­üÿ‰Ÿ–û(8Móá“OàpTü¿Oà';EdÝTË`^2(ÂQBz˜¬äß#°GíÑÒ%ô}HÙùÓÃ[«ûäQÑ5HM…S¨ L›b¿ršýЃ~Ù³‘;:ü'xöR3uªé•°,bqže¼ˆú©QâðõÿØ®p“³áH8Å—»îÙ³ì ZcSv(.Ž;ÿU'–î{:ç ËþÓ‡áÆã® J»üÀ\×nÚp…öÏ1LJ,`àŒ[ûÈé~ÅÉšÐßnh»YGÁQº~Ú²F”F Ý…´/êwç4.ÍH°ðˆçDË©6iœý?Òÿ²*¡^á„n!Ú-©9ej ½ã3èÕ?†ÃeœÌ¢|N "qÖ›¨[ŽJw°Úب}¦ª–ãM‡G«pÂØ0‘‚¾¦þŠñ ‘àB1 >ú¢AÉzØŒã,µÛZWM³ÑG ä=I´dÎØBB%¾WŽ<é‹>…’‹Iã­µên·ÓOC¸‹£$3ñ>ËëÜ×DÿCP¿Õ½Aá§Èëý®_{‘EÈ*z¥Ô|¯}_²` ó䕦§Í9$ŒÆ›m/˜nÖï©^¿¬Oq—ðÉÍ÷ê sñ Ž–>Æ…\jp‚Q÷òìRyÄغº;%´DôÊÖN›®'r΢¿‡ì,³Á¨ZPð Ò Ï‚‹ACw÷˜/l¢8§¥È6\Ý_÷5y-Ø­ÑGíõꟽOtÍ—´&ÚÏò‡§îd|jÁ+¥æQl#v—?±Rûxqðj€n, IJ×Ùä\À} ³“ï¾4—D„ÍJÃ?ÖW•ø ží-)]Íž¹ef ¤ºRýë·¾/uäË6…7Þn/=€ß£þßžÿ­šï}«)ùUýýëôÅ_ø¨ÿŸãs|ŽÏñÜÀÀ2í¥å´¤ÐÚ·Cu;*RFåËŠÙKu-(Ou(þÿ\þ&8¢ÊÍ fTË+Î ¦o×ú)'¥SD0ê›ÊÜËtÍ8[EûCÄQP!×¥kñO£ý—xjïL¾¡{š  à µf»’ÕéMrÈÔÁŸ wt¨¥ý¶“]Š­AOL%±žýÜ(œ€Ž±³ìåÿ+¬ JÁæVUÁ¼hÐæ)^=E]Ú' ¯ ¦æÊkÖ‹=¶"ɇˆy],7Ò?¸©!Xÿä Tˆ›*óç#ÏÉûΆ(ês'JG ˃¹ž›6Jåï©C\ïòýä®ÅU¢6Ʊá×ZtN$ÒVy}’ÿõï]¬}bΈá¹æ`]?iŠÖµÓàÝŽ9k4–¼²}ôq‰ ã2Æ›`Š+¨]ÀI¶’hëGï¥[ÿs |c™&š²/%’±Y–Q²¿ñl|`Æ’U#×%Ì«¼éZºLîØdw=F—];žû:z^ õΛX› úõSæ%-ï™ø»Eø†÷Ïò¾›œ¯ºƘ×ö¾R’¹T'|A…Öë_î QïJÌü&‚ÿ;³»¾pþRå_¿ICÿ6£ÿëîŸ]åÿ/H}øŸãs|Ž¿³Ðsw£‚0–†-V²¬W.½µÃîKA­¨ÂYqTP8 êôÂQ jKØâ„N:Ì:°+MPxV â¨]ŒöÅÈ]Ñö´ ÎÚçj¢Fço—¥tœ¶ÊlBùY¬p¸1¢žÙ¤¢ö5<¨äÿ7>Üô÷Nóeû­.8ªH-D´8tû¼°tz¡sÉä’ÜeÁ³[ÅÄǦK¶²ý¾ÏAOñmÛò®xÆÓ禙ž¶¿25\ÄѼ:³—CØ&íÒY©éN•¹NÐJ? Êýè0½Æ™5*]£\yp¥Ì=Òsî0ˉBÕBtý~¬rgä. Iξ°0ÚDÆ®;¶8Љ¡YÊ4­¥a|Lÿš»ñØ—=’7ÚPŸZžf 3]5ñ,ë^"»Ã²JsĶTϸ¯I޹Ïa¬îô;ñR­Ð©=7üeJlæÓ¸½÷ü+Ìê§¶kt©)¾_X3Nn;XÇFÛâìc˜˜,MÎŒ,èOÁi>å¤!9 jˆ™íŒþ¦þ·'ŽgC3±c,6#Ú@Y@qy6T€F&» M÷åçÃ^šÔ¾2™ýE¯¨øúÐbÑîµE(—д?ü-•Ù„*vàþ»P¾‹Óm.¢µwƒ•ÑöT&NÓÔ½‚qY9û² ÀÅ­´“«ßMÓNŽÚƾ4ûRôѵ¨Í¯m‡/qÏóä•VÈôLÝ*l+yy àïÐÿ/pOw.€K¹φ›Â·€ÔåF»âdnA,faQn°U„þQ/8ri²ñàšž¥QÃòØŸv¯9ÿ¼û»†mU{”ÂC…xìÜò°¸Q¡Ï ¸Mî`¸zV.⯃Fc3d'Ì瓽âcæÕãVDÖEë[ºÈK¯:à;‰‘Î÷ý惣é"k§}'Ÿr_êþ’o¶UKyûÑfÒ‹“w¯¼¼R ¹3¹B'VyO“å߬â]o(Ñxû|ní"ÝüÈ·FákþM$è_½º~ÿyþìð_ce|ŽÏñ9>ÇßÕ˜ˆFÀÎ(|öi®qwÚÀ)<Sq §ðhâ9¤3ͪÏQí(§þWEm1&^ªâx¢ž(gK qÊ–à­ârÔhTØj¥ñƒ´Ð ÕÑù6OáÙ ê•¶ˆuÇ£¸²–þip4í¸ÌªÉ¥»Ú+›&¢WמVbß"GTÇ4¯Y3;ê¹äGMe­8+¤NÀï#õ¿5ëÞ[$fB©FïÃúa;¢AЍaÒêâ«çme¿,³ž7,+Ýž¹µVÔâíâ’'šz˜–l{ã¦Àž {Ë!ƒ¨'xv JÅhÚ Ú®^£}'qÀ Û5 P guÿa ¤÷'%f;ËYM’¥,;öK÷!ÅK ô'7wíÏö*è4ÀViT¸©\›qsîHu¯K¤›Ñ½ÆÏ”º Î"Hè"Š‚jÿošéb±uø²s¹èD4Ñ}s yw,³ªä~Ó(g¡… ¤6íØ#1ÛÓÆÆØnÖôÉÐûQ° LìÍ%X[à­C‡'Ô"ŸPE©Ýs­#üãÕžWD8l\93r œâì|*+x *¨Å¦²±á´ß—+*ØEÃïœSÿð¢Æ|tè|Yƒm½˜²PݹHsû½³œn±eÃÓ-šEÄ92“±vÞ:Gùíì®gñdÿ2ϧ'¦áÇU!ÝÅ/'|„¸\œ!¾+ÃÄø€µI¾´Y1ñ˜;QÒÏ-ŠØVJóO¢¢?ê}b+›¯D—y êkžÄõ>sO¾¾BPc!¢,e¿A¨ºÍy)Äì7ÃzO*áFáMî‚Þ¿D‹4üRÉy“àÌ;¹÷—$ƒ+™Ì÷yLw\at¥ßÍhxÇOê"È)ž ¥ÌÅÆàâú$Ëmž³-§ó½–Í®úõhTâ^rŸ£8ÛèLß1‰äôs&}]Âz ã#¦mª°?Ê&¥`_þ]¢Ù¸Ð*Žùض&i÷±ŠcuûTÆ—™ÿj~j®y ‹‹³¿æ7ä}`ª.dýEOp½á|COñæ)oY¾Xa«¿—üô¯`éÖ(Ú^C]^Ã{56­®õûÄk¾ü(}ã#67âK²õÿFkýû˻ܼÛx¿Tx¹ðÐüîÿ* ÓGýÿŸãs|ŽßnL‘K3j¯…sVMÕÒÓE¨Ú˜?ÄQ€OKîýQ­ª±ÆÕð(“’‡O š#B?¾ˆ³€®ÄõØ€‚ÊNW˜mÚƒÓm òà;G a »!Qºþ4‰òp¸•­àÕ~¾ŠÀSSøæìyõ߉e“í#” 8œÎ;tIÓ!§à¶Rž;<1±#z3TÝ–‚〓âM¢œPÅSÆáPÀG'ê ²Ù¾þ´3Ê‹¡Œ_uëlé4‰ÖšP¦|Ù¢ÛeûV'{/‚móê³â°ŠxXüÀ„à_ ‚Rp$Ϊ(Àƒx¶†æT­Š¶´4Ë,&Êq9ìa©ãgœˆj[yµèé&âÓÇП§ï<Íé‘Çn8VωIس’5d‹Úá×™ò6†¦¬0®Q~­Ï€S/žŽBVÇlo¿n¬î€ á:ó Só2ÎUµ¢(ãBhñ {É,H<ëš[‹åÀˆ4¯AÚ–áÂÐ'<»ñ0ý6 '¡Ë÷§=_5û¢š: €ê˜³‡ÝÄêGäª@V62æ¸ uíjG¬ þì_¡˜ó†áRRm²l•€CE9ûÿ˜RK#Ž•äi—‘<à›qΪdö~èŠúý<œU#Mçi*цςkƒ3À&‹¿ºOVªmwÁ7{Íø7ÔU]–Fâ„,­<ØàRÁ¡ ”ƒo/p ýÁ0$@hñBhGIé‰^¢õwÓmÚeÚk@ Lºl”‰NÎð[ W¯D¬¹GÀ}÷ù €áeÄ€âw6´Ê¡ñÉżSÙbÑ1“!tõ˜ÿ?_©ó7ú‚~A9âGòeq€a‰½öER·‡v7>=8)áIé2j#Ëö(±ƒÖþÒPbŒõ?_³~ Ɉ ¸Í°aR‡ç‰›ßÐ+³g\%.rwµ£I‹‡±iWÜɲ̵&,oŽj¤ù†S+üŸKkõ<€T0‘fûíÂ(m+éò Ú·ÖŸ—nœ\Ëh©ÑŽÝs·„h# ÝœŠ¼<8{ô®]òé¦àUÖ±vžM\cób&Ï´¨ûé7¾X‰˜Ä°\À=– —VÓw¤Ìø"¸jIyùXêÕŽ_zÿi¶ Rúu³ä·_£Ý„ùW;:ŸjýÏñ9>ÇçøG¡K½‰S­˜]x'pG[{:äiv<ˆ€ò ~gÓ…NŽ„¦¶.¬r¥Lìä2¯ï»žrHñŸ¬ÚÀñ]G†Õ:²g;ÏúèÚ%Â%†°Þ…rví¸}A®pÛ­é[»ƒ€£%»øö­Û{ZÖ®‡´¿X-æ‘'Ž< ’© ÛŹy‹›OZrÃ…VÊà@µf‹v•zÇ@5\‡ §­C*“¢î73:ºˆYÔ­…)1#êM;½0<žiØTòÙ]Ùèªî69r” ³ aÝÔÛjté‡À‡<­7‚~^§rZœkÕã" FÕbÍ©ÇKAsÄxR'†Ñ:ZµºòY¾],Œ®ÎDÐÊñÑ|s‡ë-¢ºi^™fÈvw<Äv¿ÅÜCç]æÔýÉL¿Ùsi@á×ZavcO#F"+–a2š…q“ŒÔñ}˾ðõ׳–ܳ¯éŒ’ç¹c¬†z?æ.¡u¥ÔÓ&%§¨Vû£8íA;ÜÀ(Ó‹š¹»5³hè[ãË>e«N#q ì­ý‘)ê¶hoÁQ$,9!,IýZY3"_¾O?ÍÓzB§ÍÕ /eÃíñµŠ|‹F›£;q­e {É|bK7\ƒäÚYz ˆýbc¯ÑË.µ¿§f†6¢ò¨×b«¢"ÌRä¿»ŸšàÞ>t=Ór›¦ñ"¼söÉ~’N†™SMV¢‹¦˜½ 1Ÿì½š1©ý…÷ˆE>ou^¨½¿²£«‹ËÏèNY¹L(UNî}!Ò\°¹·¿¢E/ãW¶ê|C Ög^ð²ƒhp g—ƒh7Ä«ºãbUxJ}¸±Xrпh¤è-I'¡&vÉúJËèʯJºêUõy¾ ʶÄv+= ñ<··hD…ž§Xc$]Ïót:¯vsÖâšäÞ5º¥ÆÆDžRü‚__®vÎJY<€ä®ÈY ɃYç‡Õ¹á{OÖçNy*Ðâ)^~Í[xQJ4Žãë1›gšFã Bç´ùº‡ÔÁWsÂbvæðµÇο/pÊrûoÖëy9‘F›V[ƒÿýÙï=’¾¶ÖË?GËÿs5ôÚ~>/^d_AúüA…<5¹þ¯šôw6»ü¹\Ÿãs|Žÿ`˜”&õœB -FÙµ&hHu›/<ˆã ~–Ž[©?»ìŘˆÕ™ã­6V84 ÿ˨D—D[Ýt×_Ž©ŠÊΙ¾³xÁ¦hŒÿÚ$ŇS"iBäÙØ9ÌdÑÑ7­¼\~¶%¾@â§f“¯LA( ipzÍ8¥Æ·i¥Öõ˜Ä•°'‰}å)ž ‰Õp¸E¿Ë”‚Âîµ4ã¡Éá³ì´˜ÖsöºÝq¯Å ˜ g`2ce“/O¦ÿZkæJ!ÊÓî]…NÔÓ‰qË¢ÙzÚèÕ¬Ø-VU}Ú¯‡£ ÔN[*‰NÇs—•-rZ»çãRý»8#l6çýÚç4Á«„V™¾?‰´ƒR/TÌÀ%eB~Ç¥nŒ©,[/9{´+&†UaUéËÔº+S²H'—Z¬­b˜#ÖùœÎÝ«úã_Ýç‡ÁÕ®•›a„h'gøJÿ´ Gì¨#·NQc>Åf‰ ; ­æFçœöe…§µe«àè÷½3 XŽ¢ß0é(3ùTƒÆPìú+\]Ñܘ^†Éäý Y›‰aë«ÓÎ<¨MÞÛcìÿ`6è3j@½ëjïå»tioF*ýàð„,jÎA2 =È‘ëƒö7ÄèÅè†ËHìè_Ö™åªÙœ`Ýi¾ÜåýÆjå=ÞÚ×P]ƒŽby™¤  õrS·O;—³»è£4½·©_$9l\«#T"‡û¨ý´F-A&7´(,«¶Æïl‹Ý Ñ…²jÿµ|Ó75/‚¿CX8³’«EÎãµ\ø•=ê>´“Ñ<{ã¢þiaB¥»\µî‡×|¹ê’Kæsàm!º'ZËä&G¨/‹9£¼üS %õÜ_ÿµ½×>3<¼Ü·ö$s+Àœ(®œ{t@èæÊ×EÁäÅ3Q÷xz/Ùs—Žž<¦¨á±Ì‹3ÝDä_Á\FÑú o|kÆ`p¾–kõ=Ùhq7³¬ÌÍH”ïÄâ­Í ¬ãg'LwúàÖ~B˜î5Ví«:Òå 9Ø/; yßç—Þ#ßS÷–0‰ æh{iߡ n] ˆúÛåÓ7_Rº!bÝ~2ùO¿¸µÿ«Jüý¹hŸãs|Ž„PMÿ-NKœ 2,)dÅG¥KgÁwÜMÅãD~§ð³1¬«+sv{¡/·¡I¢¥Îéh<(ÊÁ¦©µ'Ж’j"—L'[8Gq÷R^×Dg5•QšÖ º¢†øŽk3QaaC/ö凵E›úßezø~éãöX)$Å']d”AÉ{Ù¸’ÎŒžgO™øØ6EçtwÂÆÏõI„hT8Xö%4³Ó]½^ mÿveZÞ[H¯ö IDAToXnguöMZ‹ ¨PLqêi!x­Ù¢Ì½hÛH÷ ÝÚí„øñÓÈ3]ºEGùÈú¨(xש¡³ ·™ç”ƼÖQÚ®£mzÛ´xŒa5µî©»EîJûOGsž87‰;¼jßlAµeBÀ§I0ªKQžc®¸¥÷ý©Y'Q¸D†Î}xì7Ÿú¦zЯv/í®ÉLG:½[K"ŸÓ\tQ]6«K9›ýp^LÛ•ãü¨:üK5kê@9p<Úôý¤ólº°§RîöiŠ7àmÙMÈfà¢A˜AUmf.Õ°QÕܸ¨Ñ{yþ§1PŸôÿ9>ÇçøCЧUz¢vê÷Ñ€³op’Ñå]L³¦€RÎ^B~Ö¹£­ýnŸ?™…®¼—«5háí¿¶¸]œ3±V®î»Ž`4uÍeVà¶.̃Yf…²¯¥‹}]¸lc²¡­º³ÊÕ2ÇPâ«nY°+Âň~ýík÷¸Ýj»Ki]f0tñtÈÍ®/[À³Äà ¸LàñQíÜ´Ô ‰yû&WgxÙ‘K}ØÅ,nÿ\¡g5Í ¹VOý(õ¤1 Ç&ìê¨xó_öspRéx$§Ê+»ædq„tgß=jÙ¿Ó¢8idlGËÔRe?J]ïˆ,òtajŒP¿ýéÿõË^‚l­e§ ä íº_õ)ˆÛª:¹H’âÂTy þ¬cH7ÎÏ œ(<¨átŽ9¦¿HÝ9é“O•ò~ãýÚˆzö¤×¸·ô÷ËW©·(—tÀÉ&î õáªæi)6kyÙ‹171ÍäÔˆ÷,c^nEèæ¢‡Ka±g-;ùŒ5øgŠ¥:²%½«,£¬¸`ovã¹]·óKé ܈îïìNà¼×k£—lÄ1˜cQí£#ˆ`Ð×Ú"gšÌQæJý_¤½à>Ô`×É^¸ÔnÓé­£õ±}OÒõÖ–Û Ð¨Î¼f^©O¿sc¸…oèrÇNÝ}ÈËÆ}ŽèÚ}òŽ‘˜ì¿¢IÝ ÜèŒy !ƒ>°ó€™ú„clËÙu -wSí룃/Ά²y¢ž8[M«Y'&ƒx"È]ïs®b"hÕ”u†Lth…ÿ=ÂK8« ©F–/¦z×êâ:Kÿ÷­' ÉXõ@%‹i•¯Òrð._º¶_Ïo,ÓM©nÿÐVW ¸ÿða®J¨¯¿M„­ê -@O‡ãðì‹ãìô’ZÃ&vàhÚ·«‡ÉX®Ùç B´û"}/a:­Cá<ܶËî;ÄsT·êÖÒÑèCÕ"ÊBœÂ8€Ç‰RQÙáþã ®­ ‹ ÛztáïGK·®Ž?‘,#®e·êìq¯M5>Øm!×BŹ#N.®ÁÐÁÛ@UDëlä¹F`ãòíæÒÅrðz]ï<€GGœÄQ{Ç\)= dÞ3º@C ö‡BkL…Û¹ —"/õ;{|#ÎÆXx>0ÞÃ…’‹&Î!É‘(B]ìÌビ„XW<:¨'ú G…J¼¦Ñ½ZA_jªè“á¨:ÃÏ'B{¨zÔwÇ?Ìp:,±°Zêïat•^Úìým«Sj'°Kø9Àý%p~CA ;SèajÒPÕé¥I· mÈ”Æ=o»ª:«ŽR P=…Yx'§¼U„r¢ð¸ÒR{!¼·‚>;‹1_T.¹tÔ&‡–ìÚ¶• qª÷F´¯QKlAU§Í§Ì(sK9À ‡ .«OÆ:²!mu[E3Êl$ôVW"FJA1udÃdÓ4ñYre;ÃCφ"v1¦Ï øQP”FÒƒí ¤V{ÿ„*ê˜ÅóFÜ ¸½ G‡ÉœGí²]­³µB>, Ke°¸cÉA6"%ÀÌÎaÙjö‹}ZAKÞ¦ÕPSû¿.á ÀuÞ¨Æ[æ#aݹºx¦ !çW;¼†žôÄ¡ü¦œOù–ûÀg ½#ž àU~Ýa²‰J¨§œlÊ™—°î`áÌ3ÅÇVNEÝÔ¹&úçOö?QkWçÙã2K¼Gr¯Vt€GÁ”©ó2v”¯ÎMPI ®58?¡‚u·_íÖÔ9Gu3'ݶò#'¥—Ïìî¥ß"ù…Š•ãZ‹Ù=)\a¦v ËØÃöœã!`õ{oï89öÝ+©å=SÊ׌Ó%vø‹à-¨5º¶„ç]÷ÁÚä3¸Aç"§¼Í,ÿ¶”`8ãsüãQG_½Hîb2ÅAk‘•½ÊS£Ö»F»òFëü²åe-øý7ä–‹ý:°Tèwú+]Ö‡n¥%]—øñ±õÂüPôܺ¿k!-ßy·‘¼XÖ“I.Ìg½´bÅ£ÓÉôöó%6ÁH¯ÄkŸ žK%õ. '½º+Â^Ë›=ö6É!¯äEÝ>.WÈ”äFc“q²ÿ^W£”oWV¦|L3>¤tØ›¢ÂåNyÛ;ÇŒ3ðÉç-M(£ŸèlÑ8ÖWòo¨«ïÁexc‰¢áá¼IsewjíÕ!§]ƒ#®$oÝÎW»Úù´.Íà&ÅÎ /ħЩ‹§ƒï˜ÝEPL*Ââ l‡JŽš¿õhoA¾_³ÿñÿý“.ß¡PÇWžq¼1WüáÓü>ÿÐßæ·þÓçø£ÎÁçøŸãsü} ¯þO¨Eé*O+\ôɳÔ)<{fìñ,8K×—‹+…V*•[ {|'Ã.WNãh•°ƒb_mñ]ÉEáR:zˆBNá©Nþ).4²‡âÖ.ê’±xA)u¢yZgËÑ“hì9Õxòˆó8êÔhè¾~uD…R!âhZéÎÁ¬*yq..ò„ škRN…¹;ê [¾.÷<ÍAì)¥ÿSMÀ­µÛ~õÌe?CWÐ-Ï0q ƒùs´,ßÒ¥œ(' >‰Rq˜NTkÇàš9­ÛåݬЉg€Ã¨&'Aá°ÔÙ!Ȧl³@©*§ ÃÆ}G2ë\T.î㙨ìÝ*#«‰QK—œé÷oË]§Û~—Ü&­¥_{D ŽS‹XèâÓòzñ>¦’ȸûZÛàl9$†ÏúXÅ+6´‰A­¡ïXwãJ÷=ÑÞXê‚©Ì:K•×A80» ®°Qˆ_Ónnõ_óè×Y{çÊq1¢ÑÒªqÌZÈ„Š3_G@…Û÷*>¤¬Ù±›Ö,&ö½¦SA¢œúì­M.ñã ®åikôç-)YuAhh-÷öÁ3®|œ†ïf[×GªÍ™‡œdœB&yK‰ñÞ›5å–©q&Ž•s­Ë÷|¯`\ðâ®ka•B´ÖŽ9õ3…ô®•‰S§[ÅJ{äé€Q]|Ñ”üä¦V`ã·±8‘¹ELWª±}…n`˜ù¦x}ñ_}ŸÜåÛVØzû|öBüöT¿„“Xg×k%é%k%<¼øš‚u§`ìÄýÆF¾¨Ç¿â&%CZ>Kíê¬p3ç9(”‡kÛIÀøjÖ>L•|KÙÔ›5_L«i$O×fˆùe w—wU惿sJV!øpáWÅÝ@í\·øHz«•.%ˆ86*bæBt †µÉ,>zžŸYÜKy®Æü)‡Ä¼L®[R+*RÒì¡ÜÄ<(v÷uú ëŠå“éfZ­D¯m¬º.ý$í^ÇJ97Øð…è–^z)žÞ{K~NeNW^ëñ}'ÍÕ$¶Ïõú^o;K®>”_ÕåõÊA¼>½¿‚ïü¤ò;Kß5*¾ª«ó}{ý¯þö/› üs|ŽÏñ9þñ¬–õhô´UÆ‚”&úô~åŠã쉦gK¼tz“j®—™*íRÑ’lÁ¦û3hí4ªzRë`¿Ì|Nt Ãs„':m£©r^kzSc¼VÁŠn{h‡yTþ.´³j¢·Y:*xžfÇUr+l¡”ÞЊ[m ¤cRãéTKzGd¤•³!-Êéê¾åªÎ‡‘@‹Y«v9ém–ú–¥Å¸Äb13sztûÝüÙ=ŠãìnÏ8ÿóìÞC?ÿc´åÛ/ÚЭ“ÐÚ¢ JÁq 4ž=¿¡% ŒºþIשø\»UPFLtÂMÄš YÍ­==àìÕ6ŠÕÌNlzö\Ç;‰Ö+•3¯mpä¯pÚ6+pQZ)\=¦ ,ÍkU,Ú§8Ì0Å,ˆùP„PI‡Xæ<’c'¹ŽãÔ‰–Jð@EÇNQøŽˆ,OÇš¡;EKÁÔ¼ÜÃykJ1¬Ó Ok¥J"ÎiÚ*²ö¦æYˇÏÊô$µ$ Éêú9zDŽî‰ÒG,,»ÐT”ç;<¥ ÎŽÒÂÃG¼sð5’À‘&µ7K,$ˆÜj«¹·=jZ:ŸÓÕN¶ “!Úû¥ãqê|è–n*Ó–ay3r %TtÅeŸZú'¶µ¢ØC³n‘=;HuÑV­k*h ©Sy1Ú¿äœW7„*\”‚lZÕ«UÊg–8•ºp¸3 ^jÓ¼§®aºQ^Þ‘ÂÐü^6zc?}¥ÈÍí|UÅIfÞwzpò•Е³bc~YPáÆ¹€ç^Œœì’NQ†žè8“P9W6‰ŽÂ62 Æ*wž‹îm'î…­+ y`î_±e"Ñ(Á$÷~ 7R 9 1¾»à:$–—=—\+pÓP²Ö dCgµdh~¼+vñ¹èÞ¿Lvwbëúø'f©ÏS¡ëÍ?ÇLu/Ã*’÷6÷hû€ëúy|I»^m’¤Ý¼tŸ¦³bâ7Ë"ÃKžn ¦\ÒöñtL-¾1Ïllˆ­‹ÆÏÀ7¦,Þ³Ô޸ؗsµ–?ð-µõer¯{áîŠîÿôü%ŸîKAüŽ1ðw×y;œøÍÏø½êÿçøŸãs|޼À—öŽ)¥ë<Å‚h¼ãQh¯Ï U#†;Ø=ÎU²j®‘±»Z|âX²ý¢!eʤO.Š•üÃðèªx gNA¥ËUÍZèÚ.º üPÿOA_cØ^ÒÕûšµT/ÙÊQ‹ÉFtMÄU]œ¤ì²Ôɺ©ÃÇÙ·§,‡9úA|wåÛMÞ{¡ÙˆyVð|p·@G„Ѫ’[®€³t!öÒWùG¬lµºãƒ]ܬìý<ÀcÞ¾£â8ñó'NãW»DÏŠZñåÿc¿‡r¥“/ÙY5»+¨ž6\ hÞľrL,~ÊÙGHC·7“©ÍŸKQ!´`èÛ§³ÌšŸ&·G{­¼Ì%Åc÷ úì9±Þer9öŵ›4# oxQþ}<Û@2¹]Š*"GX÷ñØ„…pÒFQUÌL^©»ê൙@œ]Þö{QÜc¿uÅT~û‡×)@”'ÂÙÎÓ,®žzTI"QJ ±Ì4fµ.á\Eè˜gUR ëÖ€ŒJÇ,ÙV†×ö)ç´7ˆwÞ^gå8¹«Ü4[”œùžfã3ÃQ-j{×–8Š!ø}õ¦iLfÀ+•Åb¡s¸9£­s–€Ý¸b­B'&7?Ëô©êß·­,ø~)L>¡O¨lt"*$=« ä° ÅëLǯÈY2n¥F‡UÍH¯ÔÕžä*EÉO 6:m‡xÌkÉ&É—ˆ¹JjoÉg|ƒæÿâß3Ô8 ³ñâ~/.DªÒúáÜH¥Z?äBb¢oqŸIðò*éU+ã2;ïáEç2º¼ äA¸‘)Œ¾Ò¿Tþ³íSv7\;Yï^¢R Úál?URi½ð½½tʵá)–BÚ½R/Ƕã#­¶‘ù’v?y¿qϹR9]†äÎóíÞ#[{éšøäËú™×XRPv³Ùí|p%Ù3Q¶r Å~.z)jUÀ/íúÓRðòëìZ)\›ƒWüctÁJ!º´ˆtqù–ç±.ï¥dn¹gzñ¢¾Îî¿R_¸‰›Çpgxõ1¼~¤,„?«ü¾×|ðÖÍäûêë…þÈWçÕ;èêìùÅÏü­NþðŸøKí–÷ÙçøŸãsü+ ¿kêQ´è娾^£8¨}%D<0áìê¼_xMœ·ò‚˜š}ÆÚÞ6;Aœ/@=ºPi"\«üb'ÙÑg Þ< #Ø €‡À&CûmÎÿ]9y޾rSquθm› WmÇ<€–À³‹F‘bi6'º½Õ7 Pý³M|¬>µNHzS‡#Ñ.”—~†}Âj›¢$ƒÁHé!±ÕîEÁQzôee 0B½ê¢´"úŠÒ„Qºv„ÓœžÖ0Q;ŸÀƒx² ¦µ >»‚Ù/þ–Þ‘PÙ%{±§`b¦œQÁÚ…ø™CmUÌ4e¶Ž"t+û•ëvŸq Üyo ˆÖÃôÜ^/ÜnJé®@aäÛhÖÔã"÷+Õ¥lái0‘Å7JScÓ£€OGØ÷»â ê#”<“ʺ|¸ËRÛm3¶u÷)8ÔïÕgÞìõ!ǵÅÊMÏ“¦¹µ-ULñtÍIiWÀå ·KQ‹+BuÙÔˆ˜þ1õU+&mϯ«;cz­EÍÝ”j½%mÕÛzf›ˆ×•kÒ‡.L“6òìçho͞תÌÄZ™™—VBõzÙ„¬†æ$¹Ç$j1º­K˃Öfƒâ³—][XOú†Kx·UÓ^•{wx”h¢w 5OÑB\†º'c£¥ãÇÀ‘+îÑy¾T3Ŷ‡é¢ä@,¶PzŸIaímiúæ3_ë¹é1_'+íaÔLì©w6fzkcYW§kµE›‰÷êCù@yµë^ˆ 7ÚºœÝ¥ÛÂÙ·Ç(;eiàZöºQ°ø"<à »níÌ ú4x=6‚ž¾Höy®à&Õks³…‘s6XeGº°¨à70ËýùÊp¡‘h:íÖ«ùyéÿ¡sqüÛS±˜zïšl-w¹š¯?nÙ†J–U×wÜ€ë9Á¿©UwAÇ÷Z£ú¯L`kv1‰ËqP_©{ÚQˆ¸ߎ¹¢ yý]x}­nžJœs3/Ö`÷˜²±Ù\:ð¸ÍŠ_­MîtÿÇàê¨a0ëÊЦþÊȼÍ~G×UrÂx7¶ß.ßÕ3_½¾$²ÿ uü>ÿ€7Óþoÿ€ôÏ7³Ðÿ·‰¾Û°œrö9þð0ûŸãsüy€yYïûy«S¢a±ÀM®íôF7y«#bŠ&eÙ29ùc’…b‘òÔƒj_7¶ªóòÀQp6˜~+Ó6­¹ ¹ÕjÕOál¿XP TppÒ·E®¨S4–¡ï]ƒï?ô8}ªV¿>,v}šº=ë¬Øª´Å5îMuëê #O8 àwMLs—·Î\Ùζ׹[]jïWuN+_ÒõÝÍ­(þ„…¦\†þÐþüUg[Gní_ íaORmǃø ¨Éî‡X'J3fÞ2P€ŸÀOàÑ¢Û˜©w]ÔŠãiM-㋵ë\Àғ⥊r¨tdzªšÛÑMsí ñ@<kÈïÊlbPlÁ®‰7åZLüNc¶Î¸—(Sw=Úî/r02í›èÖ1b}šîÞÕÑÛ;âwÂXþLu¸ ¥yƒº¹ÀÍ骳=Ÿ©vuÝÅy™Uo­Nh) •“‘5§²:·úÅ|Ù´Ð8õ*Vn]Gý±=- m‰]š2iç5^êÑ4Ò š©6{»¤ÕÈt{ÑTª‹êZºzv¬=£¼M2õì™1CGcw¢iJÄn˜Xàµ{r¦Âæ[´Â@v!ý”Ljh‰h7·äU*+õKãg}´•}¯Ê-\)çKâ±x­1g‡¡óWœ´þ­²ýð¨@Ýš¹*«h{¡7ÉeWvž|Sô¿ÝÞïU?Ý îK _{ ñ·y½©ß¹/J晳pá:¢‚Nz»i×ýt—N~‡ø¸qt)æÜ ={õ»´äm8óMŽ.wâ¦_þ!ÃÊúT¿X~‘NC\VÈ;M\ÛÜTlF5|¡77†VjlJÇîýãb[°›º]ãå0ärVkÜkÍkÿžŠžÉþú`÷Î…X•hÇšã;ÉÀë .&Žì¢+¾ì€ ëÍ©{ ;¯Ð´ëeñéSzõ·.š*¼M>ûÈÝhÉ2ý›âϵ IDATJ§Þúï_е®òÞ¯_LߨfÖÞJ[ä"Ïñë[ï½tˆÛçÿ½»ùËeðÜa/ÁÆù‹îÅ¿Äà—oý×íýkOúçøŸãÏz¥Æu’/«lšK¥õ©ßUl}ÿvÖÿ$*È4ý±åPЛhÒ6ES ozp€½ùà0PC±¾„F0¯ÛÞÊ»G«…F… 62 ÚÚºñsÎÉ ¥^žÎ1 òèlúYx®®†ÑYÜ-ĵéúŠY©vÁ(wzYPF1uèìbåQºÄV­„¹¨=ïVµ˜ fš×Èúù×iöèì5Î~¡¬®f6Q¹ië³Ô¯t5©×†Ê ðÄñ Ž•ÐÃʮŌ¥ðO+pnzîÙ2Ÿ*ݾL9m¶Tá⌣¹8 Ê1Ý©îg8Ê*£RT›!x”ÎÙ î\úÙ.q|Ap©tP‚Áä!–ògoÞ0S€}ípk)éÉeüsŽ/-Ìí£¢µDIH3i-¼=ö!aú÷BßX*DuÆ‹¤³•ç ÞÃÕN5az&‡õ6 mt' ¾<èêmÚy89žî"Ó5XeÌ…2ÿÀß.ÖYN¾î²DBÑßU"·,Ú®v¢d-ÍYl†…¼€ÞÚÒ&f!ÿéÆ@sÚÊþü±îx}¡K¿…œ7 Ëç[iDÈXLH)®Fµ.±Bœ¯W}JÍc#2ae— ‚»¨% Ô+°Œ-Âõ7•“•³sB1f¿â*vp/5r¹k©žFKpë¥Ù4z 4ñ­Ñâ#[FÃ;4*éùÂ[!ƒ—·^|C‰\0/¡Þ¿f­9áÛthy #“s®C²ë?Œ9ÌoŸ0Ø"æˆ uúJW[¯<9—úK÷:ÈyÂÉž×åÄ:ßÿiöÓîö1¢ù½=ÔžÇ²É Ê«Ö›V'Äuˆ›WKÔåW#mlp² ïÓ}î§b]§¡s÷2çÓ`Ø> ïìëºò2â @×/…Kô7I ¿]‰ý–ŒýÛ/Àß]ùü?¢ÌòsÝ>Ççøÿ× €s*Ôôkbá ¥3[ :a®P·ñL€H±¯V0ËîÀĸ’™ñд`c§4YÇU|7É霃ÊR<­¡/"«áª‹EôvõøÖžóV¢„jà~=¦Ô‡¼­–ªÂ:¼]«êðn펀Qnåö>u(5ƒ­ؾΠ™aÂõ0H§Ÿ«-fØ´Sêל]»dÔ­ÚEhþŠ/´lׇ‰ÈvešQ€‡àYqŸ(?{á|tö çf°G·+p VH8êÿÏÞ›-;Ž#M·î ²?;ïÿ¨çª+Eø)íjjÑÊʪ2÷–8€ á±Ü)Åž¾b[.ƒ8MZ¥u¶OhæÖJÕ1­»iAOfö„ëQÆ®zt—âêõ;JíéIãhªqDú;#f@ÒGLnÝU×·l+›ÅFª¼Û¦qÉEOA6´‹(†896\Ô 1Ë+`êüꕎg*ìÄü~•*SbZi.eŠr¹ïðKú~'"4yŒ™­çðëLN†$³ßbÈœ†_ê3${Az9PþÓí:XäõLŒ@ˆaógÄw:>B¯ÆˆŽ®.;}мEû>wZ#T‡žÕ™ÚB+h-êP©áþN¦v™Úz…›ÖÞ¨P2ªðS­ ËŽF$1†FŽäŒ±c0D˜œ"¯ù~¡s­öµ 6Åx^,€¬ó·ŠçTž¦2r›ì>)P¡ÚQŒXûä„ÀÞèOS‘J«‰•xÄÌ¥—âÓml7/ø«°2Äu•9¹J[õŸï)¡ïÈ+oP .5)^𽜔À›•Ú+×[QIjÝë\W`î/‰/[ÚÆý × ÷EÀ&†%ÙBX`5Šr° ¾†à]®oÆëQº\Ç­®(.1®#yóÚÑÒ±´Ô¬gÞßòä&¬X Þ9“’{ÉZ†«×£]#ìˆÚjïŸ!9Îá…ëÆ=ÌG¸ ¢Hwâ•O1†^¬gäÔiG²º“€•»Áä^ Ü“·c‹E»—졘@ëG¸xqKjóüº¼åw5ܱø¶WSñ5òj¢xW¦wᔾTy/ºNÿ²f¸‚³¾¨*þp0û›ÑÊ¿@ׯÛÿŸñî÷ç•ù³Çþdâ?“Ïô¿.tÊü?Ûgûlÿ\ÿ?d"éÄ»*å^¸ÝÔö¦5wŠz‹¨eWÊ:ºº8 \èœ5Ñ<¬ôr¤àr”!<«“ ÊÑåà' 'Biõì‚Ô#¦WÔŠs”pÒÀDÕÐóC)#gôi5A§Ø eq!ÆóåØd†ØféíÏAÝ= aÕ »õù,U¦Ë0Í}F Ùì€ Nö´ƒFÑ)žÙÂÞÐÅn'îÏeÞc¾|{‰§¿ÅÖ,&Ò5Ô~×lBù,æ2eðI®ÕvVµ›öt“•„Šz\(²Äà.VZ,ÁPÞ[É¿œ?ð,¾W£¶˜VMߢ©çMޤp*ö•P¢Êª mî8[Ìà ž¨ß;X¼  ÅèáˆQ«ä’á‰Þñ0Ds™©ƒˆ\‡KýG]voj©@¾ºI:l´ª6©b4êV:œ€>F¬¦ïâ»¶=™ZQV†)ÈŠ‹.,`¯'®ÈšÏ6Ûù=ZÞ&9QgÜàÃqÑÈÐ6á|* uŠRQ[TÛ¥b÷Ì´£3HZóJ9Ký4„—BõbPçKˆpÜh.˜¾àl#ð.E*ßÞE®K—¡ú•É=›Êõi3•¬ÖþèÉÝ ÔnÒª9ãdé-ÎeU<†e÷JÇšÕÒ"7-¤X¼ú"õ´ø˜JE›1lcì¬Å(N¿Úm ·v×ûÒb“–šàŸŠúc{Çÿ:fcŽ?¨ÞËñ!Þ|{y¬ì6eþ’ûðKÖöb‡Èî-úôÊJJÙE7û¬Ξ¢˜µœ"àZ‘ßé ©½i£^k Éݘ=×±¼­Ðßfç&1Ó¿lØË¨™¥ÅøÚeí$eš y€¸kt¿D—ëŠû3¥çè^ì««ykù¦7^KòV>“‹FéOòÖ¹ Iö­ ³ ÷:5LGÚ¡°ÜDÛcîãv´+K˜=°M£S±§¨û¾I?0¸‘¸ºM QzöQA%'6EI· öØ…µ–f6j¾Œ .(öw.Ï;\g3äÑË|ù¸ûy]Í«Œèü«ø“Õ;_?P/´àÑÍœ ûZø{>þ«Ö%¾ô¶o/b ÞSÀ¿¨ðÒ]xG—ü!í’_766S²n?Ÿ_þ­»Gê—š Þ9ç?/ûþ|–îï´þœ#ø7lõÿ³}¶ÏöÏ5ô½i0,ÇTÿå‹Á…¢¯À©^úÝÂik1ö‹{’K¦E)‚ꤠQæz¯ã’ Šúÿ–oøv ßïM5;q³(fä DÙsÌb&78M.®êÿã;º(·ä;FA&v/…íMºÕ­7­ª¸Sê©ÉÓä,†õ²H(éç³oÀƒwFé1}½§ºnž[Z9QÝcÞ#Ÿ†oÉÀ͹‰*s;ugë ކZj§¬‰•-WÖÔI¡·F3Ÿ0÷³¹:®©™8- Ô{C¿Z¦¶KP‘SL©©¸Ug¥ôlçb» ôœú]{ΫÕ&s®Ÿƒ‚ÐöÖFãQðí@œ¥'Î?À'4ª¡þiIR–W+1@Qy†u{×kè×£‘³c­æ"eDÀ}¬ekÃÀk1ò–‘ ΰðnÆLg…Á…ˆÔy¬Êš|12r”¨§!ù’jmEh¸\——å¥kyA¤ÏÓn+¹’Ïçëó6´`Ðéh¹Õ1‡Ìê*øž½¥ø”²åQ#šS–rh^aèR’¥yû®n&c°¢âäa_Yºj3|u%ê§a‚Z[ :‹ll)šì¼¢Ù„1l¡<¦¯à/úФóñ¶°ù¹Ö‰¥CëlÅKÎ¥ ÝEWJ´ÏlLT}F„ˆK(e¤'Â^®J"jÈZWÓ= K¼VGLo;õ'ÔÆ¦õ"CgúXéNº'±+B›‚,`¼Zþ‡.œÚ^PÚ‰¡YÍ×VK7¤¸.öPw*Ó±sÍÛêxÄD‘íIÙñÁ72Ö…®ÔvÈayÖÜ\D×(Æ¿º§jèR0 0÷Ñ _xæ”ËT©­Ú™j”Ã+Ùš‹s£',Y°Ø»»Î¡8Ì,»ðU}Á©÷í¡%H±} 5ÔžGÇðX‘bÁ…˜ d‘{#EG„¯´åçZ¾¦Ì3êF!+û)B‹û"l:$¦ Ãxò“—¦;4Woà¼õ¾0}tâê\;Cé•,œåÈ\©º[*Ñö{/2Ãó³ûš~êðn±¹^?Fñòxo@R?(ÌÿvÁóµjÌs<®ŠÛãÒúŠòçȾŸùlŸí³}¶Ïö?hàÿ#`¤ô¢WÿŽÞ`8m=P+ÎÏi©VµêêOU- ¨J¢ÉÓÔð!C;ý¥¾9{‰ý(ÂIœ–ÉâI5ů)èŒ7ïXáN§¹7§c^_97Œ1§œE(¾Y–©ž2Ôvò`×ñ¥Ùæ<‹Gânk˜@×—'¤ÕÅ? ÂN±hõï^…ñ8ò÷5¾«Z‹ÆˆðÈY{½ìŽ<ÌŽ5ôóÖ «iŽpy°íO˜þ¸dx¢ž ðh×Öh2ÆSµ  ÂÙX0š$f•q*I Ù<šÔ´ó)×"P<»Ò†šVé ¡Æ•µÒ£x– Ѹñ(@ÁYqžàwð;JZòÃÙ]èç¶Ý¡öÍ+Et>P¥Ìuº¸Tߤ²}uögIZHñ耜š‹žÑ‹Ü=0§¸ªvÇGjnPA4¨|Ö_¢ /ýþ#"K¡"ß\£rö( MìÑÓ3A3!®³G %ik•úì ±™¡`>cDŒ» ‚ß§õqêÚͬb”‚Àa9Ã]óuù$òð@XQŸÐÙáZˆ!I›Î©ÜH!Y—bOÀ VcWÙ0_8Ì€ôÇåÕíeI,—x<ï»ïÀÓÙ*Ì*R*ùÀé·#ÿ„jÔ)CÎú½gÔÙ³áqè,Û4Zt,RcÖ¾Z Ê}»÷Å`ÒR—Çó7„LFÇ")8«'„î6;„b¨=.\Y6Ò¡(;¦0ž$V¯ývÜ©~KÂËi„»‚S½úÝ»–wûÅ:_ói’M“ë,Dí²”¹†|^ŠÄnP½âÿóÚK f¯Þª2o „uÍ9Ñ×AÕ>Úgì0Ie—Ý•J›:Û.”S­CñÈgºO9o±L÷á…n¨àK]êsk¶-w÷”6GÚÞ ]‘› 8O:W½!T.lÚ:-»ðä óÆ&á.ºCqç>:{u³æ«{ë7vEÔdîh¯ƒûœÛm5ô]‡Ó…Iðæ$¹A%ÿCq­‘õ¸¼–(?ßQEu5Që­_ñçܯõë/é¶oþ°~VÜÿUjò;‡Hþø'ÕÎøBZ/ß¿Í^yûC~SÕý_ÝUðÙ>ÛgûlŸíO4þÏQ bœ©Q]“VœÀQQ ij)°Ç|1m%ùCJ–k4Ô‡Ú‹¦Ûß–ÇÊdüš°ÔžùlUŠGÇÖàp¯Cgi™·L‘q øb••]­v, ÿ ¯5f$Âò¢¤Ó~ÌÁdúKÿayQBm²õY~.¯KuNšQ'”Ó½4ŸP Ž‚z@ߦðÚÇ+5—ÙeÅ!š= üZ§ð<Ë/=9—º]ØSš¬ÙL9ÖÐÐ:G>·JÜ6 ¡‚³°HqÓ0œ”áﵬ"†Á 3!ú옮OC6ùÕEÏŠ8gp*ŽVÅ_,J᜽CÊ DàүŷŽ‚ïÂ÷ï8Ÿ(' €ÿ >—ëey}_—¦ƒ°Ÿ2ͺh’èaíîfì‚êl ñòÚ+õ£fë¶Q£’`í­6c¢~ÕPõtütŒ»š¼ŽP é±0åD)³õª7ë´÷êÀ2²ÜZÂ#ô&Ľ®+&F:êS£_ª·³hZÎ,=º1ܘ©švæ<Ïl'P!>f 8Õ–÷jô*ÌÙÈŠjÏ\פœµ«PÈBû8Áµ ¡EM 3X^ëR^ô÷Û¶âÚ1—0ß91È]³$!t¢ü½áƒ/#‡m_jw¥!¾T(N4]@z˜—xwªËõ>wVÖÖе`–kw—ðÃÏxöÖQ¹@°é È·ÿ;gÌ=½¥1[LÖZþ«ÊqmÔù4¢ÄÐQºiCQÙÜŒÞdoÕÿùb†M8Mª£Ïâš¶×jsy×V%S ›ž’Bˆ«#Z `›Ó\s=>cÐW˜¥w„Z5Ò ·ÃâtEι…á|Á«S é}SÍWYþ4eA-šã&íùâ`S$8¿¨]æèš‹)…»Yn[q™ÖžxGΊzÚ 9 ø²:5vðOŠ©ÃšQ–b\™ÃlÖ»ÕiÀŸÑh2 §¢ VêŠv¤KèÇÃ9´}ÕÍ´PA} ´Èß'þxâçE(ßp|.‹Ï° ¿ngÐqæŽ{¡Õ‚¢)ësø=¥ÎR¥”Ô]c'h¡—œÈÉ\ûù\8\ÆÖÉ5Ê¡LÛÓr¨°üž>ÝJô¥ ç"ÃjÙ#ÑCï*ºÏé#puÙSή`ki #ƒK…\c#Vöyˆ`ÁÃX=ÝapN¾WŸ6cŒ)È_ï‹Äe_º«e)ÛoÃÓ T†ãç>P¾õ™°Y=B#êAôÖ‚ÞXç0_)ˆ><®<{#Ë݄РæŸ=ƒ:5RXê c¤äT²ªy6è8¯~ƒ&|3LŒ›¥õà‰Õè%ÛŸÏ(]ì %^ìó78ú ÈØ+¶Æ?*©$\p.«€^2KF‘æ³iû]à¬ÍðÁ> <¢oÆ çuÝèFÈÓ«Å$÷Ì’”« êÑ…Ì”¿B—×úÝõ¹6;€«&¤ yZª–JPùuS0zUŸ¬Ëà<ÚhzOJyÓ!H!1ˆ¦…we^+Š5ò«sÇ?ß:|äÒ袳÷¤FÉ+Eáa\Ÿ„uÍùÑÒ8Åݾ¿¡ôJ†‰ï¾q-«ÿ)€ó„lîèeÈé*$ú™a„ ÷‡ŠxŒÛœê—aÝ9óƒ^¸ÕûÖ˜‡ô wª™fÃÙ´Ý«oxEQ¸Süuܤ¡`Ó[ÛgûlÿT ‘(*pȤ‡bÙpnµóMQ­N»¯ï4LeĤÒöîÕêÓ›vT”ŠR­u •ß(¥ ¢3ýe  a|¾/jÖÛžFŒ9”[ \Øp×;Ná¬mAj5ª În‘#f`E‘ÂÏ«¢û{P³Ÿ‡«WÀãsy•€•,“ôÖ·²©ÊµN} ã-xWsɥçe½¡ òVŒSè‰ñÉö›‡þ•Ê·„Íw–;Qþ~2½jHZ,ß„äßÛgûG<&âüHY…¬o/ÇHh,OR,R²hB] z¼¬t,÷$áÓ½™Ô®€wy(€ÎxžPCÞ×.‡a[Jˆÿ=jï1i±Õ¿›Öj{ߣÑ燧ÐBu¯5èãpÚò,†$r–x[,¢À3Ä[¸± D;o¥öäØÑvà €Y¼Y:l½Ÿ‚õì {V<+jé~ 5ƒ×º@8(vŽN¢h$_Gß/:oŠ;‡#¤°µ™Ãá;ª?ŠªŸÖÒÁQbß$ÁÒÿé+ÀÓÉ©ƒŠs̶Wà2Z}^ñŒ‘PŒƒó ª2}—!‡µKÖØS2`’ˆ<œÄ©çÊçwþñÄOTèÛƒÖCSg@J)ýüÈ…E°vW©íÀ”΋ù.¦þ·‹ÛÚ Ê"K »Ut­NŽYÛÒN-ÕjñÏ›V¢Èà7QE«³~_¡ïž¾VNA›‚¢‰mý“PEÐźH±²L»8“WFƒEóT*2fD°^lþñù«ÄYqD G›²ª™s†“× û°_{Ñ"mx-Q£¸ºNu£‹ÿ¾wÐh»éögk+ÀŠ1áFò5¤Øñj¼ì¥‡¥‘^PÍ"hšâv¸†rRŸÅ=$]ïåÀ5ÄôNš#J4tùíC0U”ŠÜó¢ÑÞºú_œìOŽ '±Áv¬M,³5ÊyCå¤"Ì훒ή¥ÐKM(³@ÏꌨêZè˜úã »²q§6&WÛ¢ZÄžq·r/ j{ìøJU]ׇYá/zvÔ#½¿¨ÖNýäNŋϩ‹pîsP·‹r® Û„Ï×Ê“»ŽÜàhä/Ä&ÇÂs™û‹eiMó¾ÑÚ¸w•„u¹N]ø UÏ>“f•¶}®r¦¸ì¦ß;éËEåòQºp æîŽ1‡TGʢǘh}ˆ»&ZO¹äjÿ»[ï­Òc^ǽ.àÁ!¾K÷âë»’ù¢H;÷@ì<Œý/Üó"xÓãæO]«l!Ñg—¸ Ô]Uéû.¥mh‡ ˆ×Ø4…[ ¦ÒC*øL»Ÿ¼4¢W ûècÿ¸¹†8½ƒ>cʧ‰z=’kµƒYegëú0ù±£P~+þó¶Ô÷ÄwÅdß8õ—m?Iááígê§¿b7ÈOk¸ž—þÌÓúËô³}¶ÏöÙ>ÛŸjDæ8 MÞÛzµËÅ´!åj £G)Ò^Ë#ÙŸ(VY9^Ñâü‰ÒêC¨Äé*åÕªÈm'p¼ÕPëìh!£ÁwË´Ýö“¥Ì5!]-R¨lµm1¾P¬OZu¹kÎ-ìªîåÅ–Ûà9§ºàXÎ^Gß>¹ÒÓ‚ |$)ÎÙôÚ>§8…ÇÚžóU@và]ÁO½Æþx5w’¶&låÆðJ³ ìªg°Ä’Û'PÙ³£¿Ö®\û*ÑÒÂH @œêÃcæs¦æ ª sLÌkÍ )ºJ®©©Å@6Z£~5Îûá£Aƒï» IDAT‰£U^s*þƒ2B€ùÄQQ¿'¾WüW8£ðÑbWÛ3³5`Í(e˜ %(-Ÿ9„û±‡‘žê<“V@íâÑp“†^ïsªz"ÿ¬{!ÛpéúW šé˜ üŠHIÝࢩyܹ"žÕ!€àš!¤Í:]ëk°Ý,KòÔÔÕçMá‚=fp+\еeÏâèÝKa•ëÊÿ©ŽPóôù!¢•H¾VšÄÖ¢äEa¦Õ&WmÓMwµ¸ƒ>ÁøUËn FÅÝbŠR*gëמ¨|Î>Æñ`O Ú2SâGbÄ ™y'iwÚ§!¡»˜Ûªn‹=7°š&ûš'éFcÞj³—”éb0é˜?¼–“DËx iÍ A^Âhl¯é&[XÍb ^ ®vµØÉü=,.®g†—7Öbù1 rSl±m„J^ñ]ø^@àQð(}`ôŠo×¾Ý+)ã 4•&ñWL±Œ–d03T"Úۃ˵‘×áhàÅõòEÏóûý¢]®x¿rAŽh¯ïS9ÑŠ›Z¤vz–éã)! yªÄýû±âÜG x=bxHµÎ0ó6™ î@³6‡Ñ8XFt<2h³lþÐÕ¹ÛyVY±.¢à ¸Tp”¥¼Ô­Ãk’ä<ðzÔøû^¢:Á'ø‡}„õl5V¾2…¾Î]ÜÂÚÝ?̪ï‡ ×¡Z AÏŠH(ù„ÊYÄ7Ö;°2]‚.•*ou´~ ÏŠó€jôZ¼âÝÇî‚ØøB³[4c$üÎÒ"‹lþÏ7¹„’P®îî‚€1#Ì#7YOñ¯¦¤{£’0Ž ‡úñ×1%[9rÚ)³ÑáȲù§P°™ÔCm÷j‘ir i”&ňK2‡¿‚ÀFýÇýIû’>õ*`£G_Hc«q•‘È-‘˜ÙpJ¾@ª@ß«6UÀ|uV]œ›ØgÿœRóÚYª[#a#Ç^HW@®n“3˜1e‹0/¸ä/?Z¾¢‰B׿ÊX”bÅ)4ýøÿäÅIcÙóKÚkxøõøåMËKz5ÚÞ;Ì‚øöþMOºPqë2æ}å»’x¾ÜzaÑiÑýñUMZÛžñýíyñ™ÚÚQ:¦v³9ÛUg‰–©#$"à:¶D‹†à1ðBŽßìžÞ`÷QÛ/—?àLð'\¯èÈ{'å¯JÐÂ?Ër~Íógz!Ÿí³}¶ÏöÙþÖÀ÷.÷”±0ªx'È›²ßañ¶†T“Žnp˜Nõ!t€‡ÉFÕi‘Çä‡4Ík;7@ÍQE•]ò&ðÀãÑ©ëÕ„.j¦V>“xgŸneîËŠCs+™7bÏwi´~'™œÅªCþ褚‚ÃÀ µâ|¢VkJÐ,žmè‰&¤\é( Åhnxte|„øj; 8ûå–à¢)]Šli_Zf½ŒœÂr­Çlí>›ÓSC×­_3kØB¿Dt®T /èòhˆ!‰Vw8æ? ? Mƒ=Ÿ@‰X]º.ßKkí<šqù–”Œ>¢çfj±àÀ’ÐN]ç~¤e£¥d7›ç|àYàA|;ý¿NžMá Û¼SmÙ³Ie¡ŽDû¬”׬G “˜ñÂNÂ.YŸÚGh1ã'qr:ge©É JÜ"™TEÑ 3i®xV÷µØ±i& vÊÁ†=2 ÝÏ3I~±ª®¶]ëª[·¥|k§Ÿåœå0 >Gg¢4ÕúÌäúV¥šþwªßL`"횼ĖÊ?¿¤¹xÖâÛ+j¾R¢gƒ7Ä!Ýë}XÂ'Õ½¤Èh»âjðl¯ÅuÆ8y-/ú‹îý9¤+‡_Ì<®NJäž3Jüó'™ÕÃ{åÊï¹LèLéeY~ìþÉ©!ti(¸0E8ãÐ/v¹|9¯5¯B#¸g;µåQ¤½HÍ {5Šö27—¤- ²Û?L;¸D¶p7…®ýéÌmž°®v~{*î4;Ý ÅŽ’¿á)ÚcØø+[r—_‚ñ‹Ó# Ñä3À‘ßúÄÝô¸¼ e@ÙËTß7Ð7ÍÚ¯×Pë«;ós•Ú/Œ@Öï–†õ>êï*g§,ŸúÿÙ>ÛgûlŸíyÚJ>ë©“åg¥­SÊH<¬†ôšN¸lR~Ok¬ÀÓ2\3Áaõþ}Á€½D½EŠ„‘Ó‹±Î9„¼bÚ™)2§§j8ÔC–¥~ûß–çùôrUÒ˜œ¾ÓõÖç‘G*À(¬>+xB-½ Æ•¯¡½§YæïΪC ™ìÝã_:¦†ÆÅ>ž–F@œ ¿Þ™ÇUC e›>°·nÑ‘Z3`|r]¶åm¥—!Ÿ. ¯ýd™œ½¡ÄѺéê}ªp´˜‡2ËZSF5Yr1¡hÓ¤êyŒº¨ŽŒ‰o5hMÅ ŒAMï} ÂS8Ño‡B<Ø}‹ªÍ7zž#ð#`øas$” fÂ"æÕ °ÈÜb®{E‚öÈù+Ö[#vÏïf¹`~ÅØÒ»,Î÷rÀº`à®X8•šj܉ùt$tí13³öemáXL o(ª+GHs?eæì¯Í„ÅÌ-9Zìvk7`‹(‹ îÄÞväR‘G“Ð.}WKýr¸â–éÒ’BŠÁ£hãH€2§µ¹fÖì œ1EÜ?#u NÌݦ•&I¨Ú7k³¸æ³ŠðnIbbìTp¸dUO\eì*3or¤Ë<4]óS˜â‰U°$ ú"ÿ=åuµO:YOÑví­½Yì¹ø ¡R[Sg!o1±þׯMæf*iî%ZÄ‹aµÂÚe‚tXg¢/*‰[·âZZK¸[ZѹüúJ˜¸¦c¯᛫ë—é‘+z8ëÊ{ÄPŠ—ð‚¯vîš–ÏÆÖB¾îWG—.ÄkÑL‹¯ , ß²OÂðÖ¥~ʘ±ü¦"EñÚ‡˜Væ›ÞTÿ¹i¥ÒºoË)w”g’‰1ä„ÿhÁ—iÉñ&îPõ›kERß¶P`}"¤Æµq&½§Áºž¿ÕšJ%ÿJ|$lÞ¹ïÛûw ëç æ¢ †®¹§E½ynõÓ?ðÃ:ñ.ÑýÏ‘‚õE „_:®ß$FÿE­ú7‰ç¿*…ø³}¶ôàþŒ¥ÏöÙþ`àéF:~vqÖ«CÖB<›¦ÿ­k£U¨Õ:Æ›´LZÜ“íF?€Žþ󕽦›FÈ9 óO(ðD­“nß*ÄKCíß¼»Ì0¹ÐÃɬ0þ†—h§ÒéÞ;+Îs‚YÊÙ¢³SDzô«+;h‹å¤¬²µõ ŒtSá¨]KªN•;¤~Há_}©UÑ–‚ò°Ohå½§+ær–j\lúìJvÙq`èYQ…x¸d¹ŽW¦#RŒ¤4Îù„ÕŒ’í꼟}Öxš.Ùkí‰Z²œ¥t vzL…&茑r°ˆ(äu‰–]èoIe,ÎKr€•oŸ'¾Ÿ8Oàì)M§ª„ê¬iõP‹¾®¯sù=Ûáæ.-±3¨¹Ø8ùKuSYéSVìT Æ=bÕµÞ¢(lÕç¡â>ÐÍ?.Éc›Å¿÷$–Õ²/ÿ¯šba¨¼ö'QM0H„âDðhcMaÅx…ü.@©¡7")ÂU8k/«§1¬šY1³ÀÀ¼o®/]æn7i10t‘KkŒbw^kylŽ€g÷w›ÈÎ8zH8#K"è©dV d<¢ue#wêF{Æ ¬ÏCÚhŽÜU¼r£ê½ìYŒ±«’H ®i]äBÑ}–5wî¡”@tòÓh(³ÞV‹øâǤ”µ˜DÐÚVzÎqítÌŃWYë‚Þ¡*|6À»I†ß›MP…´%Þ= E5 WÕé7ëŠ>¿Æ+>þ—Úè­éW„,7§R_iÃPÚœîµb×píŒ ½^róQÚš¯Ë‡ëæjêZŽá[ëÿlÔò’/ìò~Ÿ# WÙÓØn”#]ˆ°º8ƒëy'„émM6Éî©)j;€åÀzXM÷ˆÝçZÇþ›«· ï[ jŸ ×ʶÀ+öI¿kf¬–[8†¸2æ+F¬âeé>á..dtViǃz­‡–ý@úªþèKRÀo®éùEèz/ƒÔ¢UèQÐ…—©7¤ad·û(‚Jžä¯ìâ'ÝD˜„£[S¼öohRrîÅþ<ÞûW¥ö­­ò+µü7ù«¿²ÓB/Ýo’ûÿêÿO ìánÜui· ûlŸí‡†Ú[èŸí³}¶_b4|ÓôÏŠ*+[¶ÕÁ­FE=Qš$ZPÀÀG/3o ´£èƒd•ûu`Ü-ò´ÂÖþì8Zɶ!ãà°ÂkgöôØÂ gW½HióÏ)¿t(³O«¡ž²2=G»¥ï6}¹p²¤‹upŸƒôâ(ïžE0è"žƒnü!HxGÃú—€\GDÊ`o0ÁÓ3_wœ =P<ŠgJðì{Ò/¨zóHÅìÿQCþ›\5Ù\þ˜8[]îÿpèƒ3´:ÒÑèö­]¯|l'¤(ÉNr±_錣!ºõ½W¡ðÆL†q1NÔ0! û°¬ö¿4F¼žxžxžÐ¥â(Ý“èµìAèpŽŠ“aqælüýX¢w*W*ŠŠ!G¤ÇR‡X]¾«G±÷òê2CV}÷TÔ?Ükô9{V»˜Ê]Ÿ{’Û¸[|µ:â ]󄢜áÚ w.œàRF÷ §wUÙ¿¨ì4—i zé¹î)í tÄ¢oL•‡‰²®G˜ÁÐsiZmH7Sá°“_¯côrÛ¤Wܱ ÏÏ·¤HgÏl甼‡Ð@`;^ýWô×»çó¬p˜aŽ&ø{R{ɼþ÷ð.ûÌæ+sXžvž«PªãüŒ tFÐÖö}Õ ÍÃþááEzc}$-`‘¤¹M ÅÂʸ}aNˆ|,–Øš„¤ùë6¦+ãN/¾Ðb6õ‰N~Z«Ó¨’Ö °Úíךté!N¸Ýœ¦«•¹æ­Í©"ª´_[Û3ŸùÀÓÐæ !¨¥+Ç 7?1²^6ìxè—ùŸÈ¬U¿T®pÞœï“ÄE¦îŽþ!Ü]M®wÊE#Ž– ü%wecó$âx=p šZ:Ì.ï#…]¥Æ,æÕ5µ¨x¼›Ct1ã1Þ¡#g1ýHNÝ žÞ .œ°½mæOw.Â2T¤Åà{Ý!†¾Püº\»0Ñ!ÐÛ“ 9d~™ÊwççËÆ«›‚û;›‹“$EÔÛšÎÖY¼bRHÃÃsÏ£K;–Ú‚½a° ›Ís„»9Ÿ_©ùÃ2ûßRoþ±ÃàW„fþÄýnáÏÚø7ß~ÔÿÏö+¦ý#oÏÏöÙþÉÀf0c5€õˆ‹Ôï–8Ú8$­Ìùpñ.=¦îßi$45M;»“fšØ:€­Ò\-@=k·œ”¿nO>Œr #›•Q…WàHx|PÒG *Tà4åºTÓd]sÃaúû€Úcð£=Ü\ýÐû–JËV#és1Q†\wà"”‡5gȲˆé ÔF›Z¹L¼+¬ÇQ-}kFƒÆô3*¬Z;JÞ<€“Î_¹|¡F§D·OhM¥kâb¯Ïõ™ ŠRÂâª"äOxõþPï~±1JÎËÑ?¼Øçw|¯½÷…<죜À7Œ´:ª€Ý‰’‡Ä=:¾¿\ =…–AŸ-££ßéŒIzXõó)¯ÿ¦PZá3T§ZËšôI-«eæõÚ¦.OÁ¦nŸíŽQÎ~‰¹X; @îðÁ&d· ‡>}­RœÅåx͈],m¶tßn‚WUHÂÈÿrüÂRðùˆAš¬1\WABÍ«ÍÒ=Å`1ŒœX·Þj{‰š üç#V÷Wµ¹AÞe‹éˆÎ vê¡-þSX¨–u¸È4·ÖíÛÄi9ìä\¥2·ZäQ€‚r˜C¿E+|Ç˵%F=Û#R5c‘¾V˜¦ðXS¸“è¦xs½ü .rùÝz=ÉÓʧBËëï‚pÜÓƒöpÚISŽòe¼‰Ô§F¿R¶ŸžI š»é•©tѽÚþUéGZq§8iXÇž4’zƒøŽ`·ÊÊWQËú¿¥óo„¿xÞneÊSGjKZª’¹ˆkSgwh™zÄl¥7´)^ßYxÝÐo5½1¨!5ÏZ´Œ§Òí½Üüz´a´×äšÅ¯®ÿ®…eÓ‘Àw937Á³¹XA·ío„²r›”{™Ôµþ®‹ãBP|{Žó†Ã~©§nO[žë(ÚÎ’·‚ºyj¼‚ÚmÚ¹’‡¤™^nÇïRßÕ¼Sÿ¹ý-¾m¬‹¶mÄö"~EÓUÀÕ´Ÿ*½½‰ŒÖ[1ÅÚÁ ?‚àÏx:ÒÉû\£Ïösõï˜uñÙ>Û¿Ûàÿ@=¡ïx•(ŤLX^­™páÓßó‡‹T˜xSÍFº©jøÝbtº—xym| \Ì5cDÀ¨.ý ÐDÃ^¹otxÔH;¹ä³°¸‹¿t Ñž‘"'ÍõÁÑíc‘ìx•$»D—-Üc0>»ŒU5&¼xwÊ’~Õ ¢Æ¹n½G¯]õ2I«wEÙe¢Vë@çkçÚäÅÕóËTì„Ô‚³ZÒÊrÍê‚xuò®¬_eW†t‡Äg ž`÷$[ðáôØ8ñ¾ x4æR1ÍT³pµ¹eg™UÆSal#g´žx¬|±,„ 35Î"gM–Õöñ¿ýv«f½ +ª£ºy0¸q%-FA]J›b]!®r&ÝN¦OSDTÉTõù]n÷¤qó„u§¤hMLÓ‹ÅE. ®2»ˆ¼XÚ¹ž ßÂ2"1fS§ÖòÏé`2^ÆuñÓnô :›·ˆÆ×h¡¹6£@½“‰¥éÂÙTtÁÔtBj¥›]½Zç8†`˜:ì1l„­YšÊuIšI@²GÓÃ3M7 ¸® öP“ÜZP<Ž™dã¥á·’-šÉZ£¡£`kiǼ¾*'_a#º¯+—NoôeÅ¿Ù>¸ËQÇòâ.©‹ ,J{t³¥p>áÓ)ÆsÄ'舡•h%‰bÕã– Ï#R\Ÿ¬¾/´*ímª_Ã0…W)‘ë´d ÑËîÉ^ò>7\}ƒøÞÚžÙÄåµ¶¸0’ÜûÞµp©•ò‘ödÍ’ÕÓïoÏœÌKŒÿeñò~¹TîxaràöÏ×ü›ÅÒ’>’´Ë¼œÃ¬èB9ç~_6´@lxýܶ%¨×íy[Sµ“7I\w<\ÅÎĺ \úžœ#f)\×…È\¬ Ë„á(Jo•qîÜùª¿t¢\& ¼!É‘»¶°Õº0Ô$o`Šd M3œûÞðÜ|¬„Åû¼m3ˆÝ8Hg.f áe¦Â‰·í¯Ì¤— ×þÿY–_±+xyû¾8í(øUÉzõgüÚ9þÈòŸíÂø ÖÏöÙþl€]Á© ë_QØäˆPb%kÁYǨÍ=4DXt­F¾eõbC®/5-@‰†v©µÇ“ŽÐ§uuÔ³gM£¨J_ͺå Âdï+qF“ž¦èUÜ5ü=‹[Ò8¦Ž°Éõ¯ÐaÉÀC³+NˆQø“9FI#šk †z–™!¦Þ7.Sûï*×á®89¬µà q>¦Fé)¥Óo¨(&X7v¿—ë¸ níŒuN|Ð(ÿ,@-Ѽx¥†… óò4fúáŽwÖ–r#lÍëXI¿°§C½(õIœ¥ïU9¦ÐŒQ^ÜB¨šŽ_{ \x2 ËÞÆ¡ìoë9%Ôµ ° ¹Öé8Ôl¶g‚_¬ÎBûâ)6ª¥…ž1Éš®b¶|f“–„ ›±‡ ç 8+b¦‘/‹mVÔÃÚ•Ž(ùÕÝ‚S 'õ+ÖbK([ÏŽÅø=zzÙeþdpº–¹$jOÚáô²®¡XzuXº˜ÇqŒív[e_0[ÌŠ¨rI-‹ô6¦âI]·v–íò¯§¼´Ç‡ú¸ír°ƒžqÎDDîüøg%ø@J¤Xf?º>åæuî!êÌZžfvÏFfï¥{:ÖlÀJ­'ÞÞö™:[-/U+Ë‚L˜by—æøçÜÉyÚéþ料¢úìgû}ÃðSþÿÙ>Û_`üÑ• §ð$V†/_ß=dëÚå’§×JL.<ÎQ ë:§…`¡uô›–v[Á§•–gEŠPÐHûá1³…åbèâR‡ÀÇõÍ>¾(3†žU«)ž¤iWé™~r2[ZMèÃñs€¨G?ï‰Æ;x ÃZ 1‚|›°Å¥gÑ¿oØè"S9ì .òëx±>œ¶È b¨ZUxž¨ÂÿÁXüpõÔq'‹ƒ–ñ‘ºÊvL†L]€ùí¦šàÑc~«ó'd:µÎ^Þ^L$ªèƒ§ŸÓ¤öÛkqy¼n(Îs(×ìôè&Ü·Ïl ,ugÇAì°o=ºUÓè4-£>QŸ('xº¬càl¸¡êÈï2‚¾_Ä.çYyâ3¬äàzV¨ŽwFªüjŸ±0-fä&ygøsÓrˆÕÊTX†“·BŒ þªC;>­ªû·Éˆ‡eq(e˜b”iÜ2‹HÖoAb÷GÙèM\'Zy»¥wÆÐºjz z±úq÷¹ejRÞ‹‡”,MŽá sXçís„êéPˆM7fÆ-©Ìqî3†£ú #jÆ(LÞ¶löCKA?ÏIc èªÍŠ¢FÏUAö=cðTX”zÌ¿•3À¼V˜ìßG5 C¤kÓÆ’[ÛûIr”®—î¿köB°+Zô|ž¼œWn\nÙÍ “{¯E‹>’±æ»ªFER¼lgQ1RÚáôÞüÜ»šÚxP„ŠÌˆ{Ä,Á ptäÃôvZžˆ˜?|zH±MAÌí5{¥’û dÜ´Fù™Vnl»vÑ7$!ÂÒùÏÿn¤mr2wp¤;ùàÊá®þ]{’û‹Q§ÙåÊë+Ý\·Èxl<‰­rwåå„_Ñ+¥E—äúý|ë(hm¬¹Ñˆý¶7Ô+]Ó™tuû$=Ôo£2â¤WúÛÊaDÕ¿°ø†àu¯«Æ6ˆOàeÈ6[ËD±z–ºõT¶{舩{{·¼fólO×Ý5åe³Ô¶UÂ×Tù·ÍÍs“¯D[¾']ró ðãï…_~[³ÿË„ÚëÖËÊÕÝO5ÞV_®Ôæô§f»‚̯üä­ÒÏ¿áIÐÛ&çG£ýléíõÙ>Ûgû•þè/å'fÆ)áòX­`,ÈÌ /Ū0¡.?]-ßµâ¬xÔ©yUà¬ñåíÅÖÛF®ÔæÉú' q°ÇTàpòÁ†s‚aS IDAT)ãBV÷Î=òoÔÝð A~dÒ[gz°ÿÜ•šh~È…—eÙe"2÷{»nXmI¦ÕÕNø{™rFßUšh讚[Û& Iß¼|\úO6.Д`Ôc¾œ€„Cý"ú>\°˜ä2ÁßsÙI—k§ÈƒŽpLÊš?žýê·n€âP-Äd!2æC4Ež½Ie½[lµ“QíYT0¯xÓ%»”crÌ)¨õXuð1èÿ.!@'töèl;5HNhö¶ž{Uìê”Y¼É³ ²3hºÙVmÜm¤¨C !’š‘’1ö35µ0t¬@ÍÍ4å¶î5„.8un½Wøæsá1nÑÕ2¢ûüð |€ßÀB ׄx=v êî+O:½x]âj© càÕÐKCU­!¯x ,V\mÒÙ`³kÞ†ô¨)¯GS{Œóðªãk]¨TZxh‰Iݕdz]-|‹…o\)€p OõÛ„.µbJú¾ZЄ”ÃZi Ky,ã T®3eò “ ¤¸æwÔ…ÞÃtØà±~‹ér™0S d”IñÑLòÆyÿCW¿%‡æ:fèμxäoöæ§ç#.4Y_ž/s²©E&X™é^|TœüËõLø xlRÍ=Ó_ŠPAÌA›‚ ”HYnÏ·© ¾tzôÌñ¥>ø™D±tl,‡È; Õ¬;JšBƒ/¥ ØzÉX;Húªlæcå"¯æš»ýƒ¢Ë$™e}¾Ö³6r¾öl~pç.q0\oàBÚ‹Jk©.„lŸšHeÕa9““®T,EÏŽKé»KÃн?×™·¸‡¢kq’âNÓöìÿeI>È”wnÓ‚$ºó„¶P¬µWƒx·cJQWwn@C¼ýþ—bú›’÷r'jk5%>ÏÎÉX˶”¤íÝà Ɨbø9.|Ü|q_jÙ?Zq¿+=ûaúe³|wßãéÊ3~á _DPÿâ?ßç]Šüm»Æßyõ?2ígû­7Ögd}¶ÏöCÔà¬L‰I³›¿ÚòÜp%½“®„6²¼ÇÚ£ŒÛýœÈøÚp.Ƭïò=qØ’õ`Ø™QGßÄÖö§-<š0P=n׿¬x(3gHìhÕ…ãH‡ 1YçKhM¹YwÏÙ:Ð4¦Ò°û–©+çÁ A–ZÒaPǬ¦§£¬æT@eŠLs¬@©xT âp$YÃGÁyØÔi* °Ð7«ŒnH–ÓA¥ÝuWJ ƒã«xú¹­UF\öqà@?uÙ'øOàDtv[¥x-Ú¢e6DÐÃXÊŠ®üßçýº.P™®©%Œ¤5ð"[OlôXh‡°7ƒÁ·„pì„'bM\Ö‰zÖö8êêÒe+éš¿Õݸ<5&ö>ŒÆòì…ey›mfÆ€‹Y.ŒãПŸ]«q¼År€åoÃs 1[…7ãP!æ>âb¦@à[˜C‚"#'îÈ Œ+)DÙ&„™ ~|t°4е¼¨™,fp–ÿÏÙxIÊÔøBíDÕEÎóãç2¯Õ ‘½v£ y DÝbPÒœahç'ð7Ö˜»E‰ðJôˆ»ä“–CTŒ–„ðähaM8oo*›Ü¬à7…¤î)tŸ£jÛ_fÐ-’'Džqñœ–"ƒ<Ã5™€CO<¢rÔø3¥€Ô‚Ú89Õðú‡Ia§pT<ˆC@A}ð tèJe9¡'X»D>ÊÞÕ=¥ºÑsR:ðÔiÊ‹§í“«©­–ËÐ5W_Cò@êÎǧ 2º18“R¡¥ç\u©½)æu.˜Åe½Ô@(–õ:¤®~޾?#êy. øŸÎþ®­¶ý»ÕÃbÂÄØQ“¨*œˆ©É, *p|iîK¿-Z »°X,%¸7zœDiÇU#¿âì} 4 Oÿ¢ÚÊõý^N+lÈ~ÕY77ÔpÉ¥aG§i‹ÌЍ 5d;„0ÛK-’3H£ÔycÒ`ë㥜KÀ)ÖxÒ¸ì_W ÷ZƒE‰Ù’šæ£I(¬”¼ÐÉ}*êF½Íúa”Õ⚙ʼc'Q¨åÄÖÁ*V±¢>Ûçì"*ÝFâ°Ó芈¹l–›œ\ŽMoë¿IZR°U¿ð‰Ä)CU}>4†&n,iÿšºê¨I—K›ðžÐ¼òЬ³Ø•2äT&RÍUeþ5u£yh þÝB–W¢³²@@l˜^ß—ÏŒ¦‰6b†˜D%»­ztö¢>0¦^áCÚfð·ðôÑæŠ¯ì{9O4øjÖ4û‡FÖöÅ¡¹ác«Z.ÊÚU=¨¢» Îy• ÀZºÐ³’‘ƒ[å@Òó¶õÞÆva¡ày“•KBíTÊjv(±àkF$±Ëȳéc ç1:ˆ,%ãÔ·JhjQÈû ø¬Ep×ÕJ^ú©Viq"ó$óUé@¯´Q\(¢hÅEÓv&¿VN/4ûÍ·¿èBˆ÷w¶ÀF|¯À.\5áC)Ï«ºþh§Øê‚D¯AÇ~êx‹|­Í¨HõÅsH}H7uè1ëhÃØy¥Aä~¦uÎ܉n9…û¢ZÿJO#s%øUq:ÝT–[¤¶5ÕËŒÄõ%üí ”>?=L}$ñÖí¶Ïñæ 9’W.ÂnÌR×á ?¤Ÿ®·êþaùJ~÷»øö=õ Uo­ÏþÝO¹8«Üšyu§Å0°L!0ÿì¢å·®8é§ß'Mëú¯>ÛgûlŸí³ýc —y8(ü¾Hp°ò½'N¡¤‰àbx]fêWˆ7ØÎã磋׵v:Ž.u¥»£à@QƒI¬<»]³Í?µ*ûš;zX9;ºººBr¸fÿ^÷·D‰p„±ÔË€W§3ª®‹¹tͽqlÎ8ñ ²4Úqì5æÕ0/E“NÓ³Oµ<•ŠnÕZt?Q°uþC\fwbÚGˆ§‰MS}k§âp¡©gY“u.åz™á:xye.k-ï·‹\ç„¿—h~ QéTi?tO”?ºš]‚5—OAãF¬º=eüa@§ ÀZ= K]Œòßòm·  ïYpÊ,~]‰aß4‹úGƒ…–vxú|6«I÷¬ùPWîÁt»´žTÝ"¹ìÚ7¬w¯mÖ~‹ÂKMW£M2%òj 2e²zµæúfTûÜ0³NQ¯}Qi9c¢pFZ.VÄ‹3¯K7ÜNczq"þ;‹=-Pױ̮35: Ód¸@ÑG¤QÌ[.NÂŽÐöPõïr†=`„#F“Û^Ï~ ?Õx-r€cŸ1¸rŠW!o`—ý\?K#Ý¢¥*ˬäÂÞñ¶q{ÄW*ä ¯ÞFd•]i¿æÅ›ÄåñNëqd-,1¹ra¹\E¨á2©äÊö qÍ‹H$ñذÆênò?TlI2r&7j‚v’"pÜ­\×®×ܕ՜Î3¶{HW„ëµx.Ò?:Iÿc§Š³Ï×ìtmJÔÛÔ¸ÍÝ}G#Ð…)þ²Ì”£åBVËN˜"Ûm—¥©$6½Â)PûC¿µ±1ln¤^鿨õ énÈñ&ÄKÿú ×g‡‚Pë»*}ÌU&öDôœßÿù†ÁL]˜â^f9èúfÔµàÆE^žU*>”õJ óòú.çú…q•fòUaOÞÜÞ’dž¹œ]H±ÞQðß7ÔÔÂøJLN•ÞÔLåpÔ ³sE¾â.lãU4ëêCnÜ;ú@¬¯–N¿< üA…ô¥qðfªÁþCù£ûqa&ù½óŽ«‹qòçèÈ?_·þ§ëÝ¿×õá«a÷òo?­Ÿí¯¸?Ûgûl?e”o†Ànôó^ë¹íqõ¿qšŒ@ vy·}J-8›¤búé£â[ÅÙ Õ&:÷B]¡za¨B'ôŠÈÚ ´+\F(Cy¾–7 ±¯aÆê}ÆðŽ…ý8º²2°ÀÁ8¼èv×  Ó äÂäé.Ùþ4ÿ A´kKЕ•Àkâì»[3„{Ç&îglÄø®m óL(•rÌ‚o9It®ê+á›P''V(¯ýlQQRf&§Hç›KR®"Û(`´"EàN°â qÔ£+’úQQ›ŒrZô+p”‚ÇaàrÌd]Äå_c‰½ºù´ÖîÐ5S§vÄ|¥“>(ÇŒù¿^|£0Pøv/MkgôX¹^e2£¼§ˆ˜ ö:¼ÆÓF»æ0 fa¯Œˆ2ñâ%Þ~Ýem"Õÿ“ô­B¾ÜSJ Ú†¼[‹KÂPwƒ{–i ö ¿*³Hz?Å¢_i-ÕÎv4Mˆ‹¶Ùt*<Õ¤LÝ–ÛßJÕĆ çÍéÎ¥¢ ™âÓÝ5pêáÔÉ”JæÇ¸¼/»/ºÇ©>W¸™ÿ^€‹|m«,“VŽl·¤!„XÓ=ÇQµè^ýOh³åxº ×¾êŸKƒÛgûlŸíŸd<œÜPç”!‡Á$N]<¯eôóô.ÕXÕG/<ÿ~¢žxœ]Î~«¥ðÓ7|ŒxÆÁ›nñ¹­ÓÀ×Ú+)¿î ©‡Vß]ér•]5(LŸjl-=Á•†é¬tµ±1:X^´Œ¶=<œMCa?–R;‘êD£Ñ^°Á‚2甆ÔÎîo¿¨Q1ÍYìßbQ‹¡œj\ÇÒIçR—–ju/a®¸ý`ó©Ë.¦¸ÿm™^ Ý…Û–QUo²2ƒí¥¥òtÆÇXlyTìòµO9”iKõiÀ‰íÅ#EirÜq¥ ¨· {¼\$uÇþ 9Õ üvÇŒ|’~!ZSQ9;ĦGMŒ.¿3ºP L¡›ƒÜÅ9·vÉ /+DwNy…sòM§”…À>f–q¡$æ¯jU–¹YÃÓe®¶ûñ鎺Б÷µQn¤Å$ê gƒYGÌY’¼¨½ÕFØZl–¾ólŒ#7Ü´3\‡[#Wéü¹°zǯœrÑÍ•a@'a)¿Õm ³³~7{rè·>^#_¦}2Êsrîòž£ÒMoä8>aóŸ†É*웨 h&^ÚgKzŽxí ĹGê*MÛÏu]Œ›Ê°¦Y Í›ùÝ%'¦lÌ¿/ ;ìø^^ÿŒád¾þ²—å´|¥y܃Œµ‘J7vÔ*îo•VnN±ÑÐ…X´NFJ(ãHÓ#.ƒ‚²Ã͇îö<ßúpÚ!_fŒ0Âè½Tcu …÷ºêÕ$u•K鱸ø¾»ÛM®ÌžÞ-ˆŽvUê7Ck'ò½Cx]ÉÐkøò½Äæêê¾Ø4 b®¤°KWRÀÇ6ÊH›Ä‚?³@ĮҜqŽÃ`c{Äÿòa!²~Z¯hÂÞ)Ôrûpó´»UpõBôåųi?0ß,ëþy'`Û¤ŸƒÒüéúßEàçïºD¿Lœ¿oüxŸí³}¶ÏöO1†º1 R€£@g«ƒ>;i'—:ºCa/Öó%«C5;'Q‰‡Õ³×:±3(SŸj+ü¦ö6úyÿÉ'jñ‚Ü•‚j€&Ý‚[tÃRÙ§çõô`ŸÎ:^m1»NMªFƒáhÍg_«WË:.u&Ö6¸JDoË’P‹õ€„YÔŒ™Òc™éK2KÌ÷K W‡ö.¾¦Þ "%S“&X  àŒ’Ñ#ÆpíEÙt«Ü³y «ØQ](Âá$O”Ú?ªºþŒVw¯Òm‰qŽ<çqˆgóZ1»K1‹î+ P…³ØIÓFs”PŸ¨'tâhrmk58;Ð °fö]j;P’Þ¢—f0ƒPí+¿ÇJ­#¾]²¢Yß×~½hG\½ËÉŒ“žž`%ðš2p±Òš”"ÓÝè\§OH!dÅt€>¦ïâC&W|6«“õ‹E;º½O.uX6½ô¯;ŒµÐ9=mxtXÝž£˜·ºn‹CFâ>›N¼À%íd)¯1Í©¨èGùÏwrºLã…qWçîÁG‰ðrÔÇÜX:Ùì¬xV°â!¢–Imžw3…I ÅfE]RùVRI`Ÿ s_ò †1Ó8ÆØ¨sâšÖ¦æ.%ÑÊkþ©‡ºtQÄU×'éPä½µìc·¯û{+g- BìZta/­_t׳ϸ$ÔF M‚R“M4ÔC…"úÜI¨ríÕ’Ö¨ÚÈPPÄrÊbÒg“[ãc‡öÆ™³$£ÖæS”¸»Xó®OåØ1r“»Ë:ò–—Ílã&³™0C_ZÎ;a+Áý¯ÀÂ|)÷¿SÖøFø''ìVx«˜÷¥¢½èôzî†îÖ«PhéÈ'—ûó–J­M¬»#*¡c,Îti>)².z–Gž®‹¦Å×:Ÿv'`ŽM¾1–b'%0×ܾR~¹;Éq»÷£VŽºŽÅnáí"åKšˆrì‡Çr.èÈýÞs3*ÊÄ\g°Å!È8DÍi|_¿|µ´yÊ’®Ýù¥¸¹LëdvžÆˆÞ¬¼ÞåÌBu½÷‹ïÕ‡ßÇ$ü¸îÏ÷hH/'sü‹´ã_ªƒë—^®ßå¾|tÿÏö5Ÿí³ý³ <»ÖDºÚåhÔÃM¸ts»dÝRœ¨©q··Q_ŽÔSyš‚\ìZ„fE©ÅÞ‹s V3åcˆóºFu¶çâTÍw¾u*š”•Aê?bSªz­kê-g€p3!FøçxãìÕ²µ³þÛ8 @ßÎÞ1"sÍx8ìo+fÁ{[oìW¤&º7Ã:®¬5Ã.˜Ë~·ð_¯þ#Á”ýâ¢)Ñãœ/Àñ&ŸžÀ©`ÐŒ 9°Ï>ÐX=p¥ñ-RÆ…(]óeȲ‡É‚ê*lw_ZÖôèipg/Õw5ð„¾Ï–£bîóèõ¦ °ª¸pÒ"IÈ4ýÒ- YN@±¾q–³êÎ8Ô$]ŽgŽâdÔõzJbbÀµ`žù)lÙV¨Sæ1­åÔù•Ú²ŽcÕ¹bð0 ¨7é¦N§P3`¸I¹h^V¢Ý…$Û¨N¬ˆ«UW¤ÜÔØH-Š'±¸ÀðFc;Ýb!|;¯‡;ÐÜUYú•à¸ýØû{Чa¥ébZ¼Sk&¼ž{€’v>ï† vQûŸï];(î¶vø—Þât7?sÛjv¥k/Ís›3ðªÀ;‡lë-íeîtgÆÉI—£b•¡SaM†ê,!tXá$-¬ÕÜ— ÝcKq&\Üù©ƒà"¯Be(‡gÈãÏ;òΉÇΧ—–à“MëjQÒ×à®å#oì¾tf³_¤th½­¸œêÔ›•zn.Ú8¤õú¸?¹yzí"Á7©ÎÉbç/ò¾Ryvø…¥ú÷JÀÿZxþøWñ÷üðgûlõÿ³}¶¹0’fûûA™bq9{-¤Œè]´YYM¸¢”ù‚Ûå’:5¾êb+zÂê f+ÝU1þI+ìmò·ƒÚ­,¢ Žá,Ï?aSu6WÂÅIöÀÑÈ3ÅIU8­vøNLãíOµRýZ]€½‡ÕÁè°².÷”Ò+ß[üoa×™œíù†ˆ©Å7r´ÅbmËþ* \áÚŠµ`i…V½ÑöaÖhkV£b›9WÒûíð"ÓÐq »7p£EVWžœý"S®:ÝK¹SKkZøEÚ‡7ÀA·ÑšNÔï(êþÖqt}¹šø;Já œÍnYµFj„ÜÀ½/£&}Œ4:—*ØzkUሆ®®³Š$çKMÅ­¸ÁPgS‹<êŠÖŸKÅÇú¶Î„X_Ü:n×´â ¹…fM›PÎD±æm^*öÃý¦ðêC ëÙJ<Ë4o‚ÔU¬Òÿ@y€‡í^»”缿`‚݈ŸÕ–t¯-q5bí~¯>$Ü—?Ç0öf6øà×ü[¼i†-+ˆJA=tßèó=B=õÛ±EPú‚\ ëv-®dZ)i˜yµÞOºt 'e¯ÏmŽgI Ù€îMn,Ï-ÀyUD‡ûõ ‡i/ÞMŸ)iú¼¬í}祛ÜW¿†Ê½Cp™0mãP ÄhŽ1ÔÞºÆ6NÕgÔ>ÖŠ2ž* Ë`ÏŠØ+eC+eey¶ OKŒÑÜÛ”Ní5/^Ø$I×Îßʇ•öêFœåN³Ó»k³ùHâ¥Q¡›óÍ»… ¾DºbøèÂwáýUߦ2'®FãœË3áƒX³b¸EEÝdè_ÞYv+·_åNí\Š·dû $u½.Uæ>™üŽV®½Î2”sid'r;7.fâ°fìEÞjñwŽEò¶¹{4ŒÏ×Î6‰Ë·Q”0ccx‡ÆºzX3&"$zÕM™¸ð PvÖòŽB½ô02y-µ_tD…8÷­¥oÉû>¡ËIïeàï+æw­3¿ÌøQµï/Tý¾šñÌ/ý4Þë%úuÛ ?è¼çò~¶ÏöÙþªícï}¶2L-ƈg¯„T…ž–;ê°³³;_¹Ñ*2ê¶šŒ{ö‘†.ð¬x¶Q{ý!vÒW%7:qTú¼€á”¥d%œi™$†¾þQïIL~‹¥¤v9r–Ò©íþÓÆþT‡õT÷ðšh/ -¿ôlíBâ´Jðû*#ÎÏÕ‹‹ ÌT‹£œïýV½Þ©M¥GÝʽgçµ:‘&3“¶ÎŠVºÒàÉrÕ7“ºnÀbÅe•G?w“%¸Ò}oR3{ÜBÂwG«—. ŸmÂÿbAµ4m·É»&Ó?¶,þèõàåÚÔÿb” ¯ÏbrüÓ5XŒ“Gð ­ œŽK¹¹,¿e×tœÉªîLÙN=-™š¹—áæ¤ò2Ëœ=ä:Ü-`ñÌ™©ÁJ ¹e†3#r„fv‚ïÛpX‰j凛î“2±[£»–>`B ¦?Qˆf-•-`A!öÈz§©ÿuÇÇž§©ÑWeRh·÷™ØÅÙËOíÕ™Q¹ïÏ9½p?VÝQËòµzfµêJ é©äsw&.”ÇÑs5ª:@ÄKΑÉ;%‹Î¾sB@8Ÿuþ÷ÜÂtðº’08;9<^ËÏ„‚N›íî´x]ëòZ³¯•{U<IÛ`=ïE¹ø–*ùB©‡ [W_½ƒ¿oI ûµñRMÀArz:câ®›[¼ N8<ÑÑG(f(?¢n¾/ÐÔ>Xê ‰{}ŸÑšxÜÔç:wn’uÿGéB Nõ^s¼O€‰nEØ‘ãÛŒ´(ïrÊÔŽÿ1û]E‡¾Ä…€¾}±¼‰°^Aäy†‰ ¬5¿!CÏÕ䵿U vZ-q©¯·ó• ™ú¹»ò™¹Vÿq림{Ñõ•ß_dz*Ûx¸ѸKì=Âμ¦Îøwî¦vİÉ]—öãÿÝêm…WD1âCðæèQxýy-ª±³ð=ÍŒ¯ŒÒ´+Îëñ™þ°ž‡$Å2¬ …‹Ûùå÷…ðÖ tÒÅkÀÿ¦TôYÙéë?üå«¿{KùˆþŸí³}¶Ïöo0šú\Jè`meÎõÙë^–dF›þ©Á9Ú…fàÑå˜êÞQGW‡Oà;¬^ÏÛ>g/’­€ žèxŠcÉ‘5AšîV…Á$ð±Ö[p<€'ðD÷&´A3]À—´TS¥Yã¡×û–² !.œÞêY7ç¬Xot«¤ºšGš@S*NÎbÕ¡ˆñÅÔDùBÔ¦WWÆK€ö9Nêb®dS±:kYÛGZ‚–ÉyÖ¦ÁRÎ(¦Ò'¹Ά^a/lçéÊí]‡AËã¥PÕÉBÝêeòÅæ÷jnN¸GïH`Ìu0ÖY-u ŽÒñA0y¨¥[—v-Ê„ù̬c€ÅƳ+زTwPš¬7àH,qM§é”áëh ”Ly•êa¡eéžž½%­¹æ4èñ‹…3«€*N‹Qeu~VÂíÙ&–9½x%]ê·ä¡ ^˜a¡¶Šóæ_ÿ®_S“ûåÝ:÷ëý«YÍŒ²ÁÓL,é1ê ·@ï˜OÐ>jŒ[gêLŠ˜‚ÄüÑÕjÄ—Þ*dñ¶¬3™zt~ø ý¡†p TLtÓJýÞ,ÇL1ê~¿tfZ ú)£–…`“qá(g2'Õ™%%ôxÿÀ×–ÒK“>Æ?ï°àȸ¨.Qn`Tr·­ ºN”åË`ƒÄ‚`ö>÷ùŸÀq·Ê+:œŽé%χ×~U´ ‡v¿ÛÇB,)˜¦“oVsúf5O‹GA9ÀxÌz_ŽšD„i½R iÌŸ©[Nñ«w¢jNmá‚4¹`7eÊÓEÕ?y¡ÜÊëõÒÕúÐŽKs¡Ûî-¡‹:÷•@ ÁkS~{aYù—%®Ƕ´“·=.xƒ%²ƒA·ÉŸ¸—Vw™›È‹±¤tƒpÑÊ㫬.f4¾¢iÝHq+Ý=]#Fk+Ä׳“ë „{½ñüIÅüêK¸|ÇSÀòEÖ´Ï<è×Å^æÅëqä¶¶?æÔÿuvÕ5|æÆB‚Ükð°CJx€þáVnƒsâ—ÃT“™=÷ÌòÔc|"¯éöä\>£¹€CWÎçMIøåš¼¯mëÚ~þy9ù_½é—œÿ¥mò$Ÿí³}¶Ïöo2ÚKäa<è&žžg/€íÄ’bUÆ“é èú²Ê$º´ÀXÙ[u-½ŽþÛÑŸ(ß…ï†ÂïuîÆ6ébqí@˜‚pÿÞv×QÑ›W®@f ÈqTb‰è0-ä‚: –j&f¶²Çp0ßÛkúì„Àa˳«eÌz#­W ³eE}¢9˜Ýü`ÁQ­ `y—¥PJOLyáFó•”µWÐWã25ópßÙñ9m÷‹œ<ÔvÕ-†›Ô)4D1–ú€5û…\;­Íš‹™TÙj§·gošQT[5ýÑÁSlÙ»óOË¿+·ÖEÑxÐý´»öY³J0fÚžô¿eÌ­äy¤õÎ^ ®…W7A¿Ê¡ubQ-}­}…NT…€V/ôÃc—œ_hfXÍÎJë\u -ï·ŽðØH¦+‹ö-ÒôõÈ>ocÀ©ª±¿N×FãÁ¥·úù9Pލ±ºbvyòûRïÜŒv‹:/H‘M4ûK4}¬î´Õy+ÑÆLWµë؆q1=Úó¾רsê'óÔW± “Æn9»3'oJ˜;?rWÊÞ=Ê £s>4zÞK¿iM$E…”K ×âùþÂYqVèž(øÃ>Ùf°ùê§4­rý€ôBX o÷We4 ¸ z8;°È¦«ÄHŸ÷0¼Àj€BÚMÐSvuÍž½+¬¸ÿI­N‘ÅSGKÚ®DùUd*i¼Êìpy‡.àÇ;Ê[^в©È³âE‘õ¸¦\Uç>sôŠE²6]¬…Jéö³Ê‡ÅÖÄÏ.é>pÄ·"15èZüþM±¸ÿ[ù‹6½Ú3ƒgµvh z[ ×ÑwÆÈõ%Ôp³ˆ ÂŽ¿€ßp¢™º ®%Ý#8b ôÄ¡åŠèî(lÕ4“†˜£i?vÆ„g±z‡Ëå˜ý4¸hý›l̇~˜iã0}¸,t߇ÁnŒ$ˆ§.¥+3aœsîÎäâm<27¿ùŽœ”wrÙEá‚:Ö¼ JÛ“ƒ|»±oõHá{`N \Ù¦}hñk¸a÷!‹Í™nsìzrÂSRÇ…î}5D)\X\ZÃ$Þ”¿oïúýß3£ÿ©/(ÃyÚá/W¥·¥ZÞ¤Ó|Y7ç?ƒªâ¯óõõ³}¶ÏöÙ>Û¿ÓhÕÄ5Öàœ8kòSÇèuhL¬i…ºÛ^sõ¢€RPJ/Ùû.œGë<8P‹…IÊp7áhåØÅ„€Òÿ*qBåJrFq´_5—xZéwas‹i b@kJ!«Å€Eu¼óµ”‚³ë‰e¬¬Fm5û¯ó'ÄÞÐ4— œG9®°3YÿÇÊ|ƪ h ZÌ|¥o}í¯­g/0?ˆz¢>º¬Ÿ0#AÇ´•Û%¿òQíÑÇ´’çÆNñ¥âMð-1%دî9ä¨('XPÍ š°t€*2mx´ ëâ2¾„yª‘zÊiTŒ”ê¢wK,µ.ã—Ø«/ä £ØÿKÇ5â€zW—ÌéÓÈßbìÖ”"b¸[˜‡0DÛ$¬ØË"T3fNÊi…¶Àö¨3¿Žïßî¬zÚM3²žžH§×Ô¬Ó'ðtÑN«ÖÂÚLƒs Kgu¬*,²©qØ2HgHX#‘ä_v®²0R³¤˜½#¾›Âa6O˰N‘5T03a4ç«~zœ³ˆ¤¹+j7ÌŠÓ3•vM…C7Â)œõì9íÅYôèÿp®Há 3NP–ùXÓæ(=R^‘°$­*e¦¿®ÝÍé>¢ýnÊ_¿XuöÊ4{;Ó±ë¿P^­„}"«oÒ‚–ÄòUD 3§oŠŽ]Ç%Je-æõ!ÚV#ŒÀÍšR{ÅvC{Ò"ü¹.%¯æhtؤÞo²»A߀Fî*Ý-î®jÝÏo®l=!$EI¯²—àõmÍyÌÏ"Z| çdàml‚jµÃR Á2ܦ†¬å«\å`-2òÊ}Z rçp,âà;1°ÙxOÀZ!Ý7:¹vî ß–²¸˜56_x+qWÂÏàñ\zN»?W”•aOÔ'7ó31±Ã·»y$=µë[òs—6ÒyšÇ'É«éw?®¬¯5w$g´èöd*û¯%ÏxÈŠ±ºŸ‹ìi5itŠóvV±·‘õá3ož ÌçÛd*¶ãz^ÝÉZ®?fcC¸Ú…æ/Nßåeù¼.z&–³§ÛF¢{r'˜k÷¼{Kðæ­m /«´zs²úu /éýòíMô¾ú YÿÝCâï?}Ÿí³}¶ÏöÙþ)@UóêŒc8z8­ JÅ¡)ݦ²¾âøÎ÷bt‹ñ£º¶¯+T cÖo‚ЉÓÚöùÍHVÑÙà ©Y£…wÙˆ7°×èÁ½éùò¼XÇ©o•­]›5<Ë¡©ï*1‹‰W全“HbâÚ¿¢Ñ7™¹Ò>ÖÕ7ɲˆ¡~ì݆q ñ¦ž ¤ ü‚îa ’»rìµíxv![‘^VSÁÀ/*Žkï2ŸYÁ<çwiËÛk·¯Eígì€]u&z#5+ÄåÊŸk\KûòL!ˆ,8…Úâ”C³y8;¦þ—)ñé<#—Oã“TÔÓ4}KÁõ‹!5Ž¥Ú'SC©ÖZaü¢ÎnÂ4`†ÊF< =9gÐNŠ[ê,™®áO¡Ô«›®Hœtí O³=ž³E¦—[éºbPd êŒnf»Ó‰³€àTãÐXcð™éÖÀAá­GD1Z<€Å 8Øý¢ãïkâq|¢u_jÖÚ´ý­pGãݾN³ç‡·›ýPßëaõþãî¨1±ε‚k¡5(ØmRêg\—Ø#R7¬# ËJ˜¦åy÷´¤îavލdB…ì"éÑý]kœ…rª1rÖá­æmåì½jƒªýÓîŽÓ—p35t†èàÁ–cL¨§}ÒÍiß²CloWfÁLE0b·€ŽPRÏ,²È[; $ê~IÏå“s…¦5-͸ï$Ü_ <|G}oÜ5=v@ä!•dƒ½fNJèÏ ºV-÷b0 œ7ñŒÚymÎR>ŒÒ­€÷H*è¸á®ÌÆîxßp­ýÇ­¼x£ÜÔŒk×=³B¹qÔÉ´cà #¯q+ëkï*º“À6}äœîdÍý.¬×ú•¬ —»î l‹4¯SrÈ{Tqyî"7Z§ìòú„_Ï~[À=“ç×·_”|÷¨Šâå€Ñm8‡49?sP1ø^ù*Ü<GÄÏlë-Ù½™€ÌR%ma\øÁB ¡Yì¢—Ï”í¥—7kc3\(éH”¿+ËÇÏz5pg2a±£v©07à¾Í ¯Ç=¾RÿrZ~Ûø{j¸s yÛÙù/ÛøÃçåÓ¾ñÙ>Ûgûlÿ& ¬Ek×sIèaYŽçä˜÷6§æ¯iª§õÒ–ßíu­´wYW¾Z[nä(k}âùß+à?Âq |s¹”ggâK…1ŠŽÝ³m¨êÍ´x§ ¾ÅCE8³CžÚÊÁ>†Ë™DC›Êà{leD‚…O[ZM7"Í9Â~ÛñÛ¹2ñ®Klí þèÀÛÞ…^Ú?“¬ž½lj Q€GXI¥Z “Jâ1Á‹€ÃÊiK7lÚ•-Õv¡L—– ŠÈº¡ øz¢œà<¡ï@íÝçè9;û…¶Ïò™ºš’}«³QkO’A£²æ30«çÇäæŒBöªkíЛÖ.Ó*OG¥ÌHkõÝ*3%f†5§,f£9d}¤ÑÀ,šÕ§V·M#½¹gŒùÞÍPP·ú­¹ˆÏOM =ÍíhípÊS€f 1Büÿcïm·äÆ&̰õîýßí®§€ØøÊ¬j4–mò̱5šî*~€ ‘ùDrbg»šW#xÔ¥oEBÕϱùÌ0‰µC|”üjÖÀ¦È8êå»E1“o\n'”=”o,kEwð«,ŽKf!<¥ ;/Ðæ¦|µ–—z2SžÌF±ŸV°Ð°W5»ò¦Ÿš’Í÷ ¾¦Gb™BµÍ«Î<¹'d {¬Œ|é ir§kξ®™[>ï…Ñl7âÌû„Ê}ÞËs>tB§6êè"‹3jÈlÜŒ³MA˜À V½´Ð 8—Ý-’ú6Ó¥¥&ª&Þ‘ñŒà°“L¯’7*Ž‹ÈH! JÌË)¥Öñfäø$Ö~¯Uß´6Gü¥.­ëb+¦ÝäÅkâ¶Ðr'3ÐÏ\ioÔ&ÙÛ2^EY[ÛLþ^СÌö¤—1úyÛ/ų>FW(òºkàØ4F¢«|ƒ5tZÎ û›ÀmzÙd÷tUðˆ‰OÛ%Ž÷]茾ÅD'wE*ì5Q€Tº¿N½M‡›e­ÆÒÂֈׂNha·¶ømKÞúR ÙÉ_SzSÓÖÄÐDIKŽê[;‡ébyèaíçqGä¦ Íù–ŸÉж*‹V¸g4—.áä‹èï'dž¼ó`œuðÕ×9{ß“Úù·•vý¢Ÿ‰fÅ¿©ßþû!ðüæ°M‡ü#è”üù³ƒñgšZžíÙžíÙžíO6æò5Mõ'¹suy!çž³×e£¡]ÖHØQ?+¸:k`²^˜SF=éxú¾PþBÎbÅt!ÿ4ýT@¾rÅJ/9G×^Ý"¹þMî^E§]_½\}¤¿NÚü¡ "…áÛoGKìÔµGfšÈ‹e 0›yS'·Ô_-¦†("¾ÔP!¥>*è/€Í•:Ȩ̧¸ Ÿ|h ™Sj翊Œ¹4êH=œ”OÃVçÙJç”ZLòmÿ™: ',xæÇÊ &S¼iQÚ%u1QPu*@©V÷cÔÞ«.SUªYŸ¸UÔr£ Ê¯ èªYS«Z[×(Uaè6RL=l¢é(­œVÆ’+HÕ¯#H#K_D”Ô&(G–ç·Ë€þ“ɾ“Vm¨˜†L¨ýêß2€]"ð5…Ýÿ[…ZY´N_Êß}ÍÛ¤éŽ4BYaó`»»ÌlcÕšFDš`–¥õmX }«>lz2áæ¦vÄ”¦Oùý"2þ®cÛ®{iZ~¡ª˜µì-Ó”÷ÑTQ¦ÉJ/Y:µÂÞ¶Õ½ËB5³s{ãNKtÏȯÜfݪÕVœ‘®..s"¶ÆÊÞtêî`üiÖ}£ÏŠuHöÙx$#R¿Œ`ˆ1¡(çÂQi"²{.†î G¶™q/<@À îÜãM®¯¬«2KÞ.õÃXzÁ‹kåø®íq¯{õGg3Z /Q…J}üøö»ª«Eö2ˆ¹õ43(ÿo~UO8ŸgÞ&uo„Òÿ 0[|x”þƒŒÄ´E•Qò:Bö9ïðÐ*¤â^æL)GÄÜ¿‘ Æ`à. .q#QƒoªÔuÖ`¿ë”¹}+Y),°:Tl0éöܽ»7)ç4ï—>Jˆ÷Šj} rýäO¼³4l¨ïÞ3±ÜŠ–l¶ ù„5Q[Ó|ßÒÑeÙŠ¾ÅàÄÁÏs—N®ÓÔ†{ÝDn,¬3ÁÏ·^›Äæ èPƒo¿×±ÎäSÎÌ(%ˆÂ Ö<ÄÆ)" TðdXƒ%Úgù £ãÇ'tbº·¨ ×íg!~ƒý8Ç£Pó`"LœÌ¯ÜŠšÒ`xx^¼¹ÍnîaÞµSèäÒý"Ýúï«ÿʦ„è½(áÖùO´øÛOóú2³¾füw9èèÙžíÙþ— €ÒS.û»T¢¡Ð¤†ëQFʸ4W°¾.•Žo ó&š:\¢`*híE6¡…(_( ¸˜ºsP™*ã]ð"®žPú+fZr 5¿%\À_¹qä[*o2ñ†æÝ·¤&´]@®…§løt~ѰõÈ4hà%TP潜†¹<ŠSWE‹Y ¤|O(©³e0[ÔH]â\ªŠ…Ó¤aá¥vYíkº¬šiŠ’ÐCØCqUL•ú–ÍLÒýc½´ÄîÄÈô7HÈ„¾ZE<VÚÌÕÛ,¾æiœeËvmb1ÊjPœ62²ÂFAnŸ0|¯ÒTË©hYÓÑÜ š‚ =@^Pëù¨²P¸€ÓZ^У8Ø(4îÎ23[­œYú6¹´¼ÜbõǽJWÞêèÙeÔ˜Ó ÄíÀ³ãM Ççü"_f-Úþé %M_Äbl ®2"éôqqƒ³Â´2ÿ¦ì}ÑbÌ•+HÚ´þӼŴ)°¥p_€W÷ÕhüŸºLß@3ó„Ë‘uûÂâ˜zqŸ² ZxIʦüŸÝ à¬C¬m7-&h®öÒxsã·{g²ŠSŽFb¹3äz›WK•ßyÙ£m¥Ì&­á ÀG¶ξ%ä07à(“ʆ41ùnìè3UëQ)«agÆÞ|W¡“Q*ì{Ñíd]xÐÓª›I‰?'ê|?Ïùæ î])‹Ð¶Ä+TcÃÑrÒÙ-hÓÇÉÛq®ÏÎ[Ø(sN¾Ulâøá‹–›wÌðòÑZ¨8ÑþŒzÿÑ£á®éZZò™í„|†<¾2T±9_ž—‹òëlH¸{tÊë¹ìí¹£¯7šåüÎMq’òå9Ÿn7ä~& Ýî oš}¾c3|[âý[r²~‘µ wXüØ}’|p¾ŸÚöûKÌÀcÖ#™?Ûã»<Û³ýçCζL‰$”Zó›&eò¸Ñà „—/9; ПE†gÝ©âõ¦/ìjû…¡<¥®gYm êXÞ€G`N=³Ò²‹}#^R†FÝ*y¯&Ž_:'gè5 HðêOCá´½]¢¿*šéÄì‚c‘ã-¤Ò¼ø¸hJhÕì%qt¢™Ô@ ödY˜%›ƒJ(!—™PÊ‘ó¬YIjY±K*鼪eEBO][&”®º6©Å‡Yd™² †`CÁÔ,„œ{ZÀÈo(.ÂV—NUªrèËCBœ -Ù‡’ºKQåøªÎŒàMÁkލvq{!<2r™O¹f°ùË–«œzv.PÊlì(˜z™*<±ÝS>½Œ®Ä]”hw¬oaતiú¾ÇºqEŒõkòݸÀ¯ùiÖ ¥£Ð§´™Šcj¶2ŒíAª78 ŽÍ7m)a¶|u¢±tXðs}µ•;¾€»¾C¯óöŽ¢±c%™âzÌäVéŸ{:Eåí´ ë9ÁÒÄqcD›ô¬§hcF5 ÃÇ@dšˆÑ‘Qʼ}ØÓ/®áÕå¶“ÕŽr‹¨¦¸Étµ¬Þ†+ RŸ6­ŒÎÎÛ¡iJ›Í1CŽ1À«bü3K®¯×"Y¿‰ q€"¥ÙÜn¢ƒ®˜k=4FEÊŽµC2ÏÀßMžÓ^œª›åñ^Ûi¬¼ýõ“ô¶¤m‡<†·¯öÖ§ñd|¬eÒ.š2Sun˜\þùdÞVJ® pb³‘]¯”Ò‡½?`ñ)}A¢Å .­;f…–× ­¬r3¨xPÕ—a(œ…Ùhµ ªÇ(¬R_‚.`E=EëC¹:ôÝ­wø–Ô³/DmUõÉ_Ž*vØ"¶rÅ÷»°¾×¹–I tÔBŸ†K4÷6Ÿp7 Í^Š¢Â‘T«Ý³5FŒóÏ-"BŠo yå$òÞX\§E->ºS“Éu. +gG§à:$ŒÞ½ÐœÐyÃŽÛ^Ë×3û+u¤ÀYMpq59É™´£®ak>å¹>$R­星¶?R÷|‚B¶ )Þ$ ë;º¼¢‹þ]yì[žFzÿå Ý/%ñƒÁ€ï™Gˆ¼y¢íOçÿ~€Ò³=Û³=Û«вFmoéâ«Ü3’šR“uX«€K+nå€E áµÓ'Ø96zhêŠyU^0™¿ŸLÓ¨m7FMn†D Ë,ºXÔ¾—ãÐòÔÐy!¥ÎÕ)³°zèA×&d¢|hÀ†'óªÉ­¥Àw¡Î*ï~ e[½4•_M+¯^ÛÞ5nj5ZìÅJÄðBCYÃ…&«sªŸ¥I'"ÊÕ-9iL¦nˆ›4Ù â.ê^©é vf¶ª ¨Læ~e…ψW6Ðs›Ê|ùÉ—s iï{@÷0Ú”‹ýLv‰eè:.Ó#Lêê9¥Ô‚[çå,“à¬ÞJ2¢•mƦ«còn™\ò4ºCº2;„u;*Ô#”‡X,³:ôX®‹VxurO:o1õÚËR‹^â± - E¹×pî^rGmeÖftaW}fhÈ£º]ó³ºz‡¼Sñ"_›*!¹ªjøB3'%oE‘N;3 Å2Æ•àš4JØT‹qÐrêø¿Fà­ Ê›—©˜H yÐ?ü±Ã¹žìRL¯lóDÒ5¿´ôIR½)ÇeÿŽÄ Î<Ò!¯%¬8û ·XŠe—- IÃ)T÷éh–F–]Ë%W£bE‡™Ó+·€.ûaˆäL^…”¥r[Ž: &{W+¸*¿÷”q vb†‚Ï%ÏDx«HC÷òÜNǎ׊òu¬é(jšÆ¦eÈYûoSÁK´òãÁ}8=¢Ú ÖÚ,–PU¤úÐë+b˜B2»8i~š•Âj*ØG 6Ñ´á}·M°t÷Ü…W»Hò£ùîÝŠïî1ׇ Yê…y¾GNý¼¼,í4hOiØõl7¬ÙwT–¸–YoÔ¸°Ä•6hçÖÈYåæÛiEKß›ŽÍkäƒ\«ÂÖèüêü'%º:zk9ÿ‹;ˆ†¡—I¸˜%ݨÌQ[ Íòá(Àšú}íãD›mÀ Ã6YÉ?¿ä¡üºO×lɨðM¼Ç­Èµ´‚«ß¹úâ8:þ¸¸5"È»€û§›¢>’Gy~àÐÏôMMý×YGcð—R÷ÿ죿ÕIõù¯ü!Û‡í ¿fàØ“ÿêjíÇþyNû³=Ûÿ`a©/êkMkƒ^‹+Ø7fÞ}¶Õx eFgw á•©—»r–ú¦‚"dv¼LW¦F&$öÓ®gN¬i%ä©Uñ³Ì·ÞJtIÅ ×áðôíþBº /èkFL92Í|ãù®Yaúò¥ ‘šhõ*íð/mÝýl¨zu½u²ÚÙk×È”NøÊ+ ™½é¡L1b‰±œé…ƒÜ‚y€ýšUùêßu•µ"†¦:µ`VÐpëÒXŠþdÎ|‹C¨FÑ^¸j62§¨æÁ&#€ÊF‡ ÈäÉŦ0£…ɵ­¤Å ùµýmš¢3¼ ©•c…V(ÙÄ5·Tç%nV«`Ý®,&9g¹Ó¸Åè¤ô‘§0€#8ªÌ,ß35wqÖF¤Fiœ+bÚ…å8ueê.½Ö9 IDAT¿.-ÃŽƒG2¨k»C]m÷kÞÂDÿ>ªÑia…–0 ‘i=¡qPkP|îœà‚ à’wŒåî?õ.ŠùQ©yŠ£¨–š—›Dº ¿ C¥átæ\Í)Ÿ¶4Ô4»7[Ú*õ0~M£¥ú²ê]Gå…’ûðN-’dŽÕ~õzÞµ-ôóÖáäliåN†Pk|áB>QÏ'7.5hPÁ‚|ý]”4­ìÈ ¥¨øžLÀ2H–n+”ú…<ß­¥ºÓî±aýÍ.Ñ S uë0|@-_B&¿qTÉçOÀ•ÁÂ`ô•ܤ׆V¿‚ÒA˜ÜU› °3æL+ò.@údW{åÑ‚–ÖµT_»Ìö›“–ï}[Èã|~Ñ·:k 7r•¢?*¢láˆ?é M½¶«† Ì¥ D8Þw«t‘Á°¿‰Êp\‘ÒÂCƒÎŹ⻅4ÏiÙ““âwgr¹ÇÇÛ‘6oæÔÑr/ˆÁü¶Þ}»TªÃCAwUÛB Ý3Ší‰}gfLD6ƒÞöl!®MÖöQ”ûöùž¿x‡›x/4Ê‹¤ŠŽQ<ÞË@piLÅïCò“Øö!Aˆu¤hK·–‚™ãÉ›ýžUæ7³ëgZ6ï=€›Ÿã÷æ®ûÿ¢oÏ…¿NÒþ\ûþժᓠ÷bþô•Ž:ŸæWè–Šö«ÆÃ#?Û³=Û³ýb€[M¶­­-3àh¸2á¢òi]ª³DéÜyÀ´ù—¦•„ÂÉi™JºÝ'¶¯Nýy5!«âqFžpQ“Yäj-¤V¯T0‘T³¦2eš^™ ¾€ê¤Y™ØtÿJèè˜$#­úÐ<@P1ô˜ b…ÝÞà×!V“­þ‡L–fi¸ù+_-6¹ ’’ü«­É,%g4®8lÏr¢a­¥{'®;ج ´½s[_Ù>ßZè4+úÛñç@ýõÕX(¥àUp½€ì³Ý×ÕÄG'qvFV›Ö¢ºÜ…ÂäëÝd’QGIÊx½Pª¯£fù¨ü…¢–zi§,P~hF¥Ýõ4¤²½¥ÖjÐèöÉÄ,û’ÿYUÍuY4A^£lJ&MÔ6têÄɧr]ÜôòÀÜ.n‡$mÄ ŸNA«Ûrošò3áÔ^™Q[z+¤ÞÀÁ-ƒ'âÊÜ÷E8ýâv[Ⱥ™¦¬}a™[Änåú”«Y˜èT%§fÚq1¥Q€[Zo1§d„“™Ì„œ >K7ç g”«©ÿ-ºÄ&‘ Mï0•ÔqKÃÎ'›FIOô¶¢ÿžÑsºýHŠ‘)º“ó¤H‚ŒbNËøˆ½®·äë­7E <€“Z÷~lžr†‘úäOU·rc{8½Ùã·¸‹õ¨K™ßÄ,߯²ŒÞ Á(ÚÅ·y*¶’LǓ䧽’ë£Pr¹ Ë/®ž–LoÖxSÒ´i­‡Í¨ÉBï þ„é}¼¹µ¾%‡ÿB ïæê?JýûEáß:m|´à¿of|çÝLá´,WIöŸËýlÏölÏö[ lº³!ç¶û^ƒ_Ë®÷¼BœÑ]ªÄ%” Ù¯êçxxnA¹ Ù ˆß%¡‹ëlj{ë+c•«ØEí*^—-ذB±Sl8næ¤âtÀzÑ”t¯ñF^‹Í¹¹ÓŠÒ¤LÌ7ìñOrEГ©RáõDNÈjªú5r>ÓÄÝ4]ÞÀÓ]¥ geâ(Í–ë!g¸2pᯠåË¿ßÓå}µ—fEË~ƒ”IC\îµö¥tùx©”éoä©_>(‡5EÆ2fô:`„£s(ø $øü?àGSÙšlZ¦œÇNJ¯Bj ¡•ëBÀ*!NÕ›Z«hgTãåÕFTéÌ“–èÛ’æf}¡UIçÔjÜ‹¡Ù Ñ]j¹ š™«íl¤)³¯|Rÿ4%³3dä5‘óÛÑåòZ?žl`&]ö»Ý.+'Z 2cɬÍ(WÖÚì%Sܽ@ŸlÅÚ`G¸¯˜©†0_½ ³7¯žQ @&M Ó`¸ ½=„ÚIEQ¥W2Ò„îÊBo:C©ž“TLì0ª4g¼9Ëb*z›¤Ó™È5#ÔÂÐÛíP¦ú?SvG€fwÑàP)£äî©›d;i:R“ ¡–Ô"ɇv晤…&žó/oáÈ™ —7¢\Ï<¡^,¦ÞËp¼å­ÁÃ'Ÿƒ"Æ êÖûïÄ:ö–®šèKO¦@Éì‰sò¯©öá.Åêœm»í ·bØ7·•¼u}þÉ=åe½¨tTýý6‘gp©ã¼ÍšÝŠíy˜Ø×ԟ͸¥rM–fÊÒÙrÕB0µ)÷R&¿!&º‡ø­ÇÆï´æ¸+òdù›Îªß#Á#ŒÌÕ›;î½’ü9Žÿœü£ÿí¾­Ÿ¹zîÿlÏölÏö'r„h”)å4¤‰Fô¥=L“=J³«FŸ…\º^†›×A”e‡WTúÍŽÞfBùjÅÔµ*6¡Ù ­À³@¹–lw¢Pe‰\ãÕ­ÿeIH@*.3p: ç·\¥c7ºêÚĦâ×Õ£0V]ïõÈI-KóUðDü¸À„48¶ÃT"ÁVõ=¸Ë({OWÕI :rÞèݦši*¼ð¢€ÁÎT!;ÁÔÏE­]£©„= ¢•·§^Ñœœ†eK#Ù‹‚[§Býð4”Å |!ý øòù~4XGÅ’TØÑ¥v2«áÄÇO}ñS:UZKŸlºæ¾Fm9ÒƒæßëL+q¢XVø8i )uݵ™4ð»Õa??4ÃH‰™uI›…i¥üE­Ø`Ðê#³¦;dLߢÌaC,GIé8W–to†(’Ï-Ü–Ãð`2sK™6€µµFÍþü]¹ŽûÔkÊ4ÔgfQõ¯ `Ç4¨¸{ļg–àTc0(ß¹X²1úî5t~BRëL‚éüHû)¬iî 1¥»Œ•NvMî¹|öo»‹K»;Z¤D+Á¨á £ÔgK—*@Î(¹k}ü%ƒ¸¡—TÆ_º4iEºTÅü¯Aºã"æ·OW17rrñõ–x`“Ÿ'äÊÌBsÂñá–°Tcce7[”Öi%Ã-#Ôü€äYdïšô݉äQ»9%ìË6; ™fPàv„¢ôã][ŸÒ Z·8ea«¢µ¿R6²\ÿ„rréîÏj¨þk܈Ӟwº„÷Zð=cUDÛ•ÐÒL³×ïïÙ³2Oˆ­³mBaÒøƒå[ësé  i^¸E(݃"r #Êš \2$x¼²ü®¤p"X= "mG§øó×´ÇÅ–>«ëëÑaÄÂÃyøF¤ ³j„[ŽÑ~°BЖ1ΕM,øž„ä_`¢åFp¦ï擹p‘}ò×A+:K¸g~èl"z§“<¼Tlüúc‡}cYš ý²ëtÿ2úî<£j§^Â}4î¾ÅþÚéaŠPcú`^ú\.¿qî4½™ÃìÓi‡?ÿ¿E,ý%‚î/Œ.x¶?Æ °s¸ž‹ólÏölÏöi"äV’+\Ø*jÕ+µmµiEñ”Pºk¦¡~NÔÊIÕjäWä.{Õò°ØëÍÓ”,›ôŒF©g©µ]"ûÎÙùuý¥³ƒ0Òq3JA!› /ÌŠÅ©w˜‰’Ū{N¥½(,,_ü5ÎMœÀTÍÆc¸¦5ÆHå#Õ†€%‰.`´…;K}cñÁC ìçjÖ/×IݰPuaÒhªþ]òpU9ô˜è‚Tù'/à~_æ‹Ê ò½„\û O_4Ðçe„ÁÚ“ÉyÇjvÀ¦šÊÓ5zØËQ%u¹ux°ãPhh#¢9™ÚÿâËäé$P·z/=·9™ÑåVV6ämha¾Ezf®v×'ÁEI³ãžfA–œ.i›<†8>V¹ÚjZÕ»(ðêúTêwÄ„©h[ÔÙ “.‹ ¼&7ÃE«~ÀWãq%YÚÿ&¶¾[PARM/…†žW-ÈîVŽ^ûq ã2½¥åŠ;„~Çæ‚4ÍâÊaΑ[p4f L'D‹‰fSñ¨(`­ˆœMEêæVò`ËIC'VY ÝHáÉOnú—y¿£ÿ‘:±ÍÒɊ׹Œjöuçbû”‘i).Àƒt1•V…à®üu«úB¹òR{ù&•ˆ‘è;±4ì´ÏVåG-É߃öúÒ”»:µ(–p }rÓz×ÄŽ#y¨½€îZ0©ÎÕîö5r@FƒG†úµj÷p=‘Ü-U­ú{øt#Ž3­¾+[3˜¦¤hz÷ ¿L§~ÔÓÏý³ûòèÚo/ÖÏä<=Û³=Û³=ÛŸcŒÞÌR:LŸ¹X僒ZÙé ÕàÓ©¨özö‘ôXù*C7EÉpEjÁ~ÁÔX‡\?Dœñ¡µAV¯¯ô¥“4ºúr½hÕ1Ø‹©k™¢Ãìîú¸Ø±ã=ST¶Û7×d£W¶Âî걫B1å´UçÒ¾Âì+¥¡eL ?ü±sBT*uGò…+÷büqžµuRï5›&_qê6V±[„©ÏMÀ— QW°+zð¡ˆ+¼ô<»Hè}µ™€WoÔ¨$ý׌@Íøê  ®#ŸÞÔ›ŠÈ馠Ëú+¹ú=h§‘F§£ñ–Z5ý Ê=À¹¦ÓüV¯ P?¹ qR_ÊfÀŒ¥ÝXJoV–6 ÜƆËüL±èlú )¶æ×ôFܼ§«_þÕÆL¹š€ˆÍÜ£ª}ã²—Y»"#Õ ŠÒajãaÁ#ÕÃj<`…éß÷‚ürz"J,øÎE³g~º€=Y·¶F• ½Ú³{¢‹š “Í0ª{kŸ zCŠaaÕ»N5δK.›šY&Àl÷iܶ‚¯’s içò|d[š]`Øeþ3•0 I‡n‡Íd6G‡Gj%äìåZ×ó2Í%|¯É†„èyÈ]äJ›B»*™Ùõ*Ñé:“ , .ä¶OÓå–¦üîROLîîw{º]KËŸ`ºÑEt[…fÒüÍ¢]±v{ áµäA¬÷=ËÔ½˜µA=ì®øïªîž¹ÉU$šÏfNØ×"%ÆNšV­<>uæÆ /Á¾“Ôq ¦x |DV0Rÿõ-3f/7~×—ƒÛ¤Ü@_VpÃÒ‚Âx©c0N¤êr»üæátÀ»m#Ó"æ5qÝZ«ñad¿GRxX\éXîtq‹¬¸ýºýlè7—ìŸÅyƒ.Š8G{GQxötÖ©¸#7À3ÜœEç ükÝy!F?Y6 –€„¨›-žá£e»t².ä^ºÞ ó¥ý‚.lýy~ôXüÛôS?ÿëÙDÞ‘þI^É?µr sðlÏölÏöŸfäþn< š­è€ 4 <Ǜ܅„¨‚Ñe/\]ïQzP¤wÙˆ]L…²II"ølP±µÂ²[4¶7¼2k®«j_è—(Û"ÍÆ¢ºB¼^*Ë‚D\]Œ³Ýí•IRU¿"¼:*çJM)š–ä´ÚpÀ&À ê…]ç ‰yÀ9ê%x±W –òU®Ç÷CG/ѬáÚtðËô… ÷¢´«\ÐZ:à+—G4Ù¨FŸ€æ.V0³U÷§‚¯b$ªÜ’F¤,ÄÆB*/ˆ(—/C32[¾8z$ËBKMžûU+PA)ÍýQjí/õCP&üg €dÚ#–Np‡IÕ¼âVnFÑR" §øP~œ:,ÛÔõ‡ œvBRó-Øí¨1¨ö¾5F€{6/à2µ¢õ\i]ÿ?`–ª•–C‹ž<ØA5AZA¹ßqi…‰OYá;pØ‘YGx̽ÕÐéäË&C˜¾Š~¤êz–> .™é‚H:xê®Þè09x-z:9GÓÂ;«G¦'∈œ ÒBÎǤ·ÄÞ¦ƒq²,þGö8Ë\óË6Ãfa÷F¢hÖf¯y÷i¹Çû­'“¦Ðæ¨Ñ&‚5ÀÜfWæIJ´¹¸6²¢`zw:Ü«&hI/¦ùLo‹ Ãú \yw%&+˜í§«IЂß?5îЋX©Hýÿlñ­ÍDádÃ*Öž.I±±Îɹ˿® tqÍ\^ØäNû”&WþÂUsí¨ƒCš¶qbü†QijæÖìEôÑ,aÓzoF‹íÖ’ZÒ„fÏäùÀßêj:WÁŸ®Š9-ºÕß×ÀŒe¾‚åyã‡#\‡v®H¶)÷{³”Y&>t}“<\n®Çn§sB0É=ºåÔ¯ÝÈôgKl%§ECå—Ñ~~V¶~ŠÖÿÔÿ?Å„ÐsÆžíÙþ ‰ë™ÿŸí›À_3$ªñÊײ†®ZïLSG|µé 9 G¡f_ˆ\Ë· ™ÝÕ¦pû›ím2~k5 0pÛECDG±(¹©ÿ!¶$€Iç”Úóë«ZeÏËFQøªÐ [\?ªP‰‹`Ö´î„ËðXöKòo«¶Ö›g4%‚ÀeÐ¥¯þ™×’¬åK«nŠhÖNaCfgo8¨ªná\Y ÚI}×OµEà‚ÊTömí|c¶”sCÐ é?Í × ¨t˜¾ºÎž‘²g¤Xä‘I­¨ä#3º7uÚ5¶9Xyp. òÔd‡7A=c×lsÌzv™Ë¥$p¯ÄLÆ{0è|›¹,ÃÂ";SÜ–ýš^`¾~Ej9ìòÑáæüVtŒŒOÐ.\M ) Õ5«SûÏÐŽ&$p hµí[Ï0ÐupXb¬<·ÿ]Š0³‡ƒ€êu!vÆm*0 s¹m¸nþ²L@Bo¼`Yg9ù¼;ŸÅHŠ=¡A~Rcdqi*-Ç»HuJ '’k8vE^+ß i¹ãªío¸SC 2<âÔOW)Ís HH¼®5Z=Øó3øš¹Öó¾v¹†ÈÌ@Iä®–“¦¡ÇPÅP ]ݬˆtú¨õÇ·ŠÁŽÌð}mʯpèrPl· :gçÁÛ GÞ*Ú r‰‡ÔÅ[‘:H—åz×0Ò†hÄñ£Œ¥ zÄ@@:Y5– .­e³KÕ~~ÇË ÓöJù=w Ó·R½gïàH<ا|”5Þ|¹”zãÝœT9ýœÄ¦õZÏý¶øO‘þKÇqŸ!­¥Á5/§1`©˜&–C^–ãN±ö~²ÀžåÀÈ Y3u߉2xN×Èÿ8… `NMNhàð¼×Á×9{—‹@÷Ö½ÿ¼pgîc›FIá)T°?1ý_«6'ûÎö圛u¸'(`}”¸¾ ïñ@ë|xô¥î.¸§™7yž ?ÆÃì»Roè4ë“9Gÿ¨TÓÄÛýù›»Ä_u^~³aÀßð±œ÷lÏölÏöl¿ËÀed,ßTä£(_V&ž¢¡ÿÙÄРŒ¯Œ‹Hüdâ*¸Fà0=(Må¦X&¸”-ÙZŸ< š‚Ü4Uxôî*Ö”‚"\ÀQˆ|ÍHƒ¶óØ„M™RŒÓéÕ©óÙ³ ¬ëµÕ5þ·¹—ó×bðäE–ÒiéC˜¨âU.4~Ø.êÔCz;iÄ0¤q ŋͷŸk?£MÔXx¤Ñ6Ñáûœ} ~—ÉðE‹pMZ½É” \©´¨‰ï#¥)'X&õ?4TF)=®¹Ÿ«I覡©`vuØU¬¬Ñ¯,sÇ´ {2/”Úüq™Õ¯‘ƒ—2áÒÄÔÙPäì·˜P~Î> Û\?eÒe-:Vberü“mèûßC1zwr|ѼR´Èón½³òÑsž'ÂËP\$SÇm1/¾ZP2©!_€ÙamêêH'¶y 2Üd;¥ØêBM!­Òö4Td€à躜Bû“˜ž>kv+«†CŒôZ™Dšä ­¼ôœŒE[l4èÈÔM.S·¼P¾ Kª»q¥4ÊRŒ—ÉãÚõD[W>,ÀbĬ¶W‹¤ÑwBIŽöæú*†ñf[œº?ÝL¸žÍ~½f;‘ËôbX&ÃE‰”q«ÊÙ†a]ŒPkÜ´B/–Õ[ïA1«ˆâ4¿µ¬e$úëNÃÅ&zê³%)w|ùHWgHç»ár™€ ?@·'Çe¥zT” CZôYÇëcäIì²×'ƒËëF‡"1wk=Y/©ÞiU›îùÏæýÓÆ½ý¼åIħßQD,š|Ïb= ø›®Ÿšn1zÛËb H«„ú|lo™N0(Œ÷CkÏE÷ú¾ÆF®—4¶OEØG<)œêdPWš(-Á=Sæ eÞ¦,nðqÜdeѧhh6ç…r¡¢ÇnpR:Ì3 ò9fÛ\/{“ƒö©ZIÌ2Ë´å>]ìüã\ºjù×ùšš’Ð;‰Øeá˜÷®sçþŸG+%þxÏ/«Þ»V?1sþ—m„ZÙ¾_îÎoJàeÔ=ö  ðd¨ ŒHƒ.I×èˆê¯ 7¢V¦W Š›9ã¯fü¨N#§jßWrjÆÕ±€n;¸{ùü?ÍèyšžíÙžíù¹ðl¿×Ð5Ï)î˜úèbkmÔÞÑÀ‚œ‘?(¼.d"£•?7àC—S'ÔW^Ç`ƒØ Ódü€äåó³(FB•©Ú¦©·jŽLáy!TZ|¥‡»¾˜éé«CÄ)&^•^½ªêäÕ£’ë"0ÙšÖúY&¨ÓrNhÏ%Är'’è?à$Æ,|§é˜…S[QØ3¢ôhMiF¹.Šj‘1E†tbòJéM$rñïsM2 mWù®©Öòÿd­ŽNýNšáÃíT”ÖkDQºª·nŒ —.è‚®s “ŸŒ©ÉÊ2.{f]1»åãÛ…°¦¤Ž%ëPü“œ4O:¿ÝGfîÔj³òœNÝý+ó¸hçß(biÀ[è$mTxYÔÿ­¾Œ¥¥³Ê¤7JZß J‹z†‰ W ˜N$‘:¬Æ¦zP>¥–®üP%RÿÓ½2ü]Gn]>Å >¢VÓ TÄÌ© IDATË(˜Ö`š‚¸+¯ã*Wj«GÛÕ+ÛêÝТإjæ>Ø^à_@âÈf™wôå”\ÆÔ ìeêÞzB{Ãv‡—‹d`~Ù3ã$µw¥+‡ô‚^­ü_½! åÐŒßÒVÍwXB¹9 ‘34õ,ε-ËÝu7.Ô{ J}üp¸Ö³ß꘳±ÌwK a€§bWöˆHÄÜW×ò™œáâ´Nu»F×ʼX@»S¾yêЙ³£–³·üÊ¡Ýäæ•a_ˆÎêð"¦ë þÛÏ?eÿêì™ñ©»ö™ù+Ò­º¡P_ôï6<È·"y¿©zÿ]ÙÆ÷ëØ` *sm¦½àô©*ÜÍÑ]akBe>« ¦FãۉȾɰ’ìˉéÐ]¯ ’%œišÉ»6×·øYÔ´Ì¡å)LÚ':®3€³rÏ®˜¶ °;aE9íðÛP““ Ï[¯ëv/©{Ó€}ãâ¦þÇoYŒçRhûXæ’ìûçûÒMŠ»uàòñcûä0i» ø·ç˜s¢Ìïôâˆm¹ñö{“ µžÿGôz¶g{¶g{¶gû@óÍxÊ&‰¢*wUûh¢mîë¯&e&ÐZ€’ «ÉI½Re媕‚œA«Þª±ªëP†fZ&½$Á$¾b­œÁÅè­œˆíÖŸ^-”­TvB`|Ý–¼È.ÿRn»nggúXNÔìYÀÅYïÜVDyÈ•s:ói}a'µv‘ÏáJùè¦H­.FV–‡‰[yÚrš¼~NÍ.®2߀­;›Áh(´ä–Ò äѯÅÌ:.@AÉ(¹‰øUÔ~_àà«Á|(èåÆýG1úfrE¸ê£”Bº¿ÚøœI¡¹wT  Û~¦ J½@®ÄµtÛ ï45âiÁÒXϰ%T‹óŒkÌØ„d“þw“õ7tjLª}vìà‘-L_êë­Ê0~°h eëh&\qdÇÉ)†ÿŽÉ/ZÖsÔ§ v¯0À«4ØëZ›¸µ)°Á’ÕÝTQØ/7ì 'Ò*ÈèЇ}’–_ÇD6©gJ§!’±^›Ll›ê¸Bñ‚EiÔþ)æ&ׇ4®NëŠÀÿ·Ið5B˜´®³i'ý«y®z7™~‚qǧõÛ¤’ÖÆ\Ö+½Ï u›!¹IµíUîS‡¦”ÓˆR©Ýªƒù0à<ÃØ“‘tuôkd™h­C¤/d$5Ö„ö)umš‚}|†æq‘ï|è%¥óP¢ÉEÓß#%ý¾-ÒÕJx÷¹”m+ÑŠ5M×ÖæM!Hª”WÁ—ß&†“þ§tÈ)îÔFÍtî¡ü™ “-ÄYœáI&òz÷¢lê¦ËA®wem¿hdö'òèŸ.hZ›HdekÝÖþ+’Vy°ØÂw™Ú$ìûÓ²ó‚N ¸øâèh•ò×±Äí=Í<lû=KÄ!’}ƒJ1bèÝ% ´¿Óit¹J¦§öàïø²nnì,f•q ›j 7¢´ÅÉŒ$õç'æÔ½m©wB©¶©ö`¿YZŽ"Ðÿ®h/VÜ7,Ã]éÞî8F 4î}rÿi…Ýq¬Ñp‡\;½s.#†¦ýÑN KÂÐnV¹æËm¶Ùc«c»ëcïôw½<ß’ºÿ©"ðvø7ì’~ÇïðÛýíò>öó=Û³=Û³ýç]âl…º¢ Pºâª[é¥IÚLU®½ºž[·gÐJ‡x¤2Á;¹ WVŒ_3³ËñerL!ÿ•L°/ÂU™òLôV†\œPºJ_Ï›wk.| —ÛW|›<¶½›Ö×èLdµÖ9¯ªÉENv”YÆÐ÷ú*C®¨Ý«9ÈW[«ò“fÀéòÖÓt̪¾%sDWû_k…ïaƒû¡Á=ÿòI†Ë¤Jº „R2øÒ¿À/ä‘NQåõ åfœÔŸAÁb¢ÙÛ‘„¢|lzâðlJ^À«EXP.ðš&“-Ð.FQ,‘^õÓ£º€À—” ¶œtf S/”ÒJõ¯>ý–ÔcÙø]ö1a宂ܞGµØ¿¤™=#Óåôq.**W}­–’ÃSÊ´ŒË"¸ž³Süà^}©=é”wR,v¥Æ‹æÄIè~í{ÂÍ-ä]Ú­NZÀ¢}3¸…yV¸VtÆ~noÃlŠ6ž>}ºïþϦ"íŽEuº?ϼÑW6 ­:L§Ë¿“,ÃXv*¦·µ¸¥æj}|ð Oº[¤jKòŽõîPIÃ9#ó¾§Ä¢ð£D\E¿ô‘°{óÓŠ/ßQI Û5äï‘CKÇžO£[céJÆ;çCg ö‡v~Û±`k·y³µI.xÃdÃÈLïð1 2wËÕÝ`[ÍÔ$ÄÜ…û^“íõxâ!¸k}Z} U.©±» ÏRW°¶š¡JÉD R%æ2JñÓý`5OÞý1ú†ë…Ø}Q¨þãM¼ðOËÜ¿,Œ÷ç¿Ü#ûô7>–¿gGc’¿Âcxw}âÆ³=Û³ýQÛ {¶ïƒ)¯Æ%O ""[ºBj*-ÛÍUN%²5Y(B®:­pU=Tx¥Y Cö´z‡Í×ØÊ›nú~-r—{¿oº[2Åò˜¹ 2œßš€Ô¥g#íl¿ IQÛzÛªpâ}öRJ—"‹&úË÷°§}qn…r¶DOùË€ÒÌ¿ÉH¹S’LFh+‰UÓ Í2ÆËÐ<•R©8#Mt_ôÚÞ‘Q•?86s¤"ÏM"¡\]ƲŠpÕuÚ~_@Ý“ HH?úR0ÍÞQuÞê¬Õl‹ëÕ ÿ•&c‡]-]³®hcµ'ðêÒgg×ñ% ‡Ä QüEÛ£ò½Ç ùNƒ†½ÁV. rÑe¬ÞaÓS‡rÊ-WÒy£×GÛ2¦´èãÍšflx³@à ô®ÊFL{i»Ú.M·âîQß—ìÛvéÉäðp$yå¶cS¹5ålš.@뎘24ù^þy›Œ §ÿ×d›3lnáí§±MÅÇ¡/µÌþº×ÈßêeVxZéko‡ðR›¾– Ü! ¶â/sk&@È£“ ´\b.+üa¹ôBÉP¢.4ÂÐÈòíò<Ól@#f ™pe‚Œ¦Âž ¢\~É寂㘧YšúѬ&²Ëw‹F3'Ož&6Ê·_ïM?d¬qk—@°+t^þáÈž ¼£Òß¼)*Š“}x±ß±´”aï‡@ $YË”¸|‚Þ.è·Zo×™AgÒ/™«ÚžàäJò1ÞÞ2Šå-×X ;[¨6r>Öl"L[®‰î Tcf£¿ ¡K„tþXÌi©2ûØmâèù{ágVGǨ„Ô7ÅÎãLòîo%gÌnŒõwœ|ëd|_€ãù¤y'?϶+`sצwj™Kú½? ÛD»M•Ø’·—³zö7oWښݱâݤºlÆóðMî„+Ç›?‰÷@ZSjt+zn­–ô]ã‰Lmîчb÷öDkW¯`¢bÇ—ùÙ 8×þßæˆÿœÌûoVaIõú…:‘þÞ¡~³“€oŸòѱ‡ :¿úÔþ—ñ/ŸíÙžíÙžíWš„œè:$ª|Ѭ»µ‡ðõ‚ˆ üÕÓ>i¤äÒqùWÕ+o'5c@¦fÜAÉ}Ñ®-Îe1­½l–¸¦HÕe䨙JµÜ¾ÌwÓ©„Žüƒ¡mVÈCÂË4Á“Û*ÂtKÐ`pFóD2ËB{Nj©>í¦Éرq©ANã³&õµÌET}CNËJE½i:M±#iT؛צq ƒEpçÙª¸”Q lB,½šÃÉP®ÜÏeª‚`žø Œ³” Ô«€{Ðë@ÿ·±::T„R H?„äԾ˂bÇ"âJ]°+à )µ\_쌫ŽW§¶Uةǖv!¸ õˆ&„³£EßYb»†w5ûÿ6 Óµ0òh?€kÖK3À7{±͉îÝÒRY´Ê£krÀ¹^?+áÚÔ'AÀý¢k‡E÷oà”Ï„%9ú¯»k¥MØ ïÒ6G-§›ç¨é9œñ{ÿIr-ƒ¢_.·ò—íä·&ÞæW?Âòêö\¤g{¶¿w=]IÏö=`„mÒ/ùÔ9æ¹—ŽÖ7ød;SÁU£€‰¬™úËÎßϘ¡¼Ï^eµfûJ]| r׆ç⪩Qpäß_µeî¥Áô ˆ{qª ýMnîJÖÀ†ƒGÁÙnVô”Õ “ÈR6ÅTæ´'°«–TÇÝØÀɱ`HýÕ¹´ çÚ˜ÀU«z{Ø@[á šGÏøeéz:èÉ(‰iH™ìüq¸å¦–y_JÉ€Ñg3'±§˜JöyìµçÈDªÝ eš4Wweä–ö§3 ÕkY±2X”@^à…œP®)zN9›¿Òv¦´hŠÖuî 9.î¬8®««¦ïÝ-#Ù¢Zi6©09a×QA6õÙöˆ«7R,ïÂ!‡j]òÐËa–µÒ,Ÿ²òàË_½õ‡Û2ƒî@fôßV­¿HÒl‹ÉçhËίÙxÞîÄbT€]¡ƒ¶Œ¸]·$–»¦2Á 2ú/é#FÌÍ»F¿Z±§ýÒ‡ØdïÑ7“R+{ç–=0³p1{\äI cX`3ø@3Q`á’—2½ÀÐM:ŸÉÉšÊKµë—Ü Õîí©EpÛS½È—=¶dL×0éÙÄ$Ñ*‹Ûºl.u^ZqÉ{~#µU[zJI3<êS¯˜0IOW# '1’áÎT¾ë¸uÃuП¥=2°°s„>Xr¯!–vÿwrEHjŽd~ie‘ßÄ ê?ƒƒ½‘2ÝÁX«+Óæ¢Ü?ˆÝßXöêH5 5Pw>Lÿ™%›3X…š‰JðÓ‹LåÄ•Z‰LQ3£Âÿ»TƉwb›vi•ó¨:ñ›§úæêð í*ã»»)ÀÅgæ¦Ò¹y7Àöºò½ÎýC±%ôTt>9û'¼ž¿+å ¤DôG†%ÿ ÎFÐf õÞç’ElÚ¼æ£'J‚Ñ\Ò&×$ÆãåˆãYôë? F§Sù7°ä <ܪ<ÞïoC2(‡fº»G¢G —fÆrO¾Î»9Bß<±?õk¿AþÑ7gÂO%ö›KýZ?qjõ3׿%YàÙžíÙžíÙžíÏ4ª$êu®¡úU~}Šfis}o«jcË2‘ØXÿìRo©ràUµ§Êu[LÄ6ZG¨²ô|;ïê#KøÅ|bÓGAœeVð‹Œ(< N3’ «“.ºQ¡‘Œ¨øWN5¨-õ“Óä´Ú t1¯v8¹+Ôs½Ô3t¾³°‹rSñZ°-q%|^CåÏ3rsØ&eÕ°ûMþ!®.ʃۮÿ›€<&tùÀ.µ†ï” ;hä»vq¹‚òëŸKê'¸«üx5@JAÉЫ……. €ÚP)äL¢˜j}ú5ÏüÌ=¶*d2~’-§+=³ð@ÁXøl“û{54‡ú9*ˆs%gõR÷ËØB{ݧK´k–e˜—‡ÖÚ[«ûG¨ W ›z÷Ê0´À– l,¹['§ÚŽÒ;Ê<“rj­ iÜéÕ +sÿkœÀ€%™~¸‚ß™Œ]E¥÷-C‰ ÀEã.FahQË¡ÑhÄjs‚m6=IÝq\JA—RßNa*m–)¦ƒ‚²ê ¢‡3iž·£N­›ŠôÉ„i–É£Ò±êÂâú™Ê¶Ä,tët;a !dqY,ŽåƒîŠþïçK\Eÿ1éq‰¢éî×3·R¯zgXâÆe?D ìxš©ÎØ k‚®]ÊÒ¥Jœ´3ÛÐÆ`È`#&‡»ÅÃÚ8ÄkwÆÀdÑäaÈ•‡ó w Êy¶—íT·¦Ö°Ì„ûß85L.vþÎBÏzšVí!ø÷1ÌM™ÕÈl_Kf»U1©3v–N«k»ÇNIJš¢ùPv ;Bx° ¶çÑà€x?¥~)ºGeŒï?·,¬A…Þ÷AsVî8é‡ÿ~+·i3iôz ή°éÁ4F\q4df±>¦wáødŸp³LÂÞ&º'Èóƒk(n|¹NñQì£Jñsá—UĆžÁ~€ô!K¬ñÖ¡x:½ Í$Ä}iÜYgpk„å/±% œ<ã¥ä[ZóçŠöâ²Çiçÿ̦à'P`:4Lü9›~Íò\ðŸØž‚øg{¶gû‰ì™:žíSÀ¥}ššô \ WB!^iÒ(0÷•­Z@•±²  dއvc+Ä™›À'/=Æ÷vàõ €KÿççÙÿ¥³×[ïBü¥+¥Q/ô^ÉÎVìùÀCÚ.W“DÉz¼ùYZΦCeàòê-¥)¯”N䯚^=6VxBrÌêøz:J¯ÛEÏÑÕ *-ùV¾R®ŽãHíÅ4 |õÊÖú¯iö@S9l»]Ï¡°s\£ºW®Ôkê+À§t,ÝÕÎ;Û§j©÷k‰"^¼žö2Ôöþ[‰ÐÕNB&òp†ÄZ6Q㜱QÂ-xÇ ‘•ÈÄ/·†ICÄ7…½ (f _]”µX}õtµÜdÜÔ•_»stæ°ÉzXGZù <”ÈYýq­F·Ï yv¦úïšè9¯UÀ²øcºµ7ýÈÔÛý–ù–Ç[æ ©ñ é«§y«5|Œ^·Pì^ãÈx×ó¹Ln0' +ÐÅ–ÌÉâÚfù‚×Ú¨„á–v€ÙôO,“åCGynδœ@°¢H"d÷}{ê=©É±ÔR_z«Œ0áAþISjOKGˆ‡öJr±–Š…W{½îa׳ýkÁì,•}ÅÄ9h¶`"«þƒ>ïóXv¥Ò¨Î4W$øP-5f’BífQÿåÔC~*`lKúP8‹^*é™{«ž…cÉüÞ.Û·£þï3Wx·|ø$qÈ\©ÿ–¼ü§ƒ·!O$çª;¯ÐBLψVj¡#Œ ïÖÛ¸9jnʲ|D§C •iÈXbk‹€‰m? Ž€÷¶êŸ§îÒE˜Øa¬ƒÔ¾v"bš©á Ëç¹µnÜ”æÓK ówï±5úL×9Ä´­{·šËW\Yÿ‰X6ï¹fhëälá ‹eëJÎÏ01ù¡.x<Ô¶ûÓWÛòQ–x°ü±ì9ðo¯ ½<”NÀ7ƒðÞÝYËçðýÔ®S>ªÞè¨2ÝÌ{C<«!ï4~Þ~ }ïÀíøžè{ê ü}Šòâ2†)GïË/.“÷]>¿IâúsÔÿg{¶g{¶g{¶ßløââY,/” \ —  ¥+ÏÕJ9ÏÂ%\À«*¹W£´—dÖóÕ-¨ˆâ«V¸§^ÿk—aÉ@Ò}ä©•ÆÜ‚°G\^k3ê4˶5Î%!_ žZ¥ÿUZ}kJÈ ¨mki(ÈWR+÷gü—­F,†…]]›«¯x¡¼ô&é‚þ¯)øµa|”2”»_ !£á¦yÞ_»e5h‚˜Šfµcyáªi«©íOîDþžÒ0—d´"¦šÍp¡]habÜáaß¶F[=e´Ö¿O£¨«üu`dƒ[Iƒ+U[O~´3“k„o 8!íc‡yP%K´¦“„)ÐÌ+ÕIú쥟Iž¥›ÒèìMuå¦ÖuT2 öÓ­öÃÅ6 "FD¬PdBz±ö»õ!>gˆ•ÜÈæºÕ´,ݱÂèa~̾YÛ¤>ue¹Ò“4óBRS– Z+ s߱ܗßjþV½_ˆÉWg·¡8$¿Ò&7ö;wI5”ï’ÜL½3i±I¬ QR7Jgñ—Vhë³uÂ,®#Áê×¶wJË5“—“.yeø‹¶?iˆ†ĪÞ}¥‚Üñn¶ðV¦m«t¡¼Åh¯N³®ŸeÓ éEÌ©—|Õ­–qµÀ‘ äjm¥á쨩Â5:•é®Áj§þsN…ÛšE%Ð{Yñ §³äUlqÐöâ"’S Ï7³VŸVÅœ£Îð³h7Ës|µ±xB¶’i~Ù«Ë+¶@‚ŒøÖP%ƒ:æ4¢–ü€½Q úr¢vËç^Ÿ`¬VpŽS‰[4È¡í|jiJø$ÕsQíõNY;´ÅLsÚKÿ¶@'€ÌA;#Þe¢n7¶Û™¡³¨<–ä$½£u'Oë­ôïO´HœÃϻÕngÛkdçIsÎõ‰¢Æu~°“dJò÷«ÍKà|!ÜÌ¥ÃoË›ÏP1:ÎBÁHOÿ­ºÊ¾å4’ãYå]+ÒâÄJöyœÐ«û±ÇÊ7ªëÄQb}IàbÉ+þqk;ëïâ­U^!½×è?*ÉäùoþaâÌvã7ŽëCeŸï¾ˆŸ~”½ú?Gz´þg{¶g{¶gûï7†âSÌÛU¤jÝèUp ¯^17öKA©¬ù‚«ÊÁ@ɽðVÈDIMlm° ^ëúÅ&ÒÉTâ/¡—Aµ² ³íU±¹Sš –„tµBþ¤B‚GkZá2 û­×¡t½8AÀ‹€rýÕ÷? —eÍèsÝ÷]Ñ®_™;&Õ*æ"¤„$*!%äÊ J¥Þ›bçDà %!ûôfUÛ¦Æêfàò¢Û5;õr0ã*ýg8ã‘Y1;6#úšdÏÒ› ¸G³{?ã:^íŪôÕÈ• ¥´‚bç”®«}5ûUhŽË#æ ØY„­ÜW\—:Äf‘B,„¤ô•í^,&ÃÒá쀡ç‘[51fÙ>/§RS©‘VZ½¼ý@û7~÷qTg _õëÃÅ]“Q*Ó²¨‹ÖiR—¼é€]ôTt{³Ãñá ßœ“R¦61À,|5’Õpk0&º`TÇQ”œ@é3$¹è[É—ÇŽKܤø Pr#oÁàZtš_ã³¼ž„œRÃŽ96‚æè®Å@'],¨ÈŘ~LÚÑ2"7ʸ)RŽ=ÉÝ)(j¦…­Â¦a ñ¥Z—\X˰C BÉË|ªFC¤qA56}škõ½Âõaˆqó7ÎL&HîbM bÓShàf‹¹´k¬vÍBÅ•?Ã@R´w)G‘–µŠ»œðÃc×^Ðuž9IÉŒ4Jtoû!3Ùžžö@§ÔÉæžØÇž‚åîQm&ÙªvÏkzRBLéŸò,2×dž# 2‚a!ûY„= šN5Kë ˆ+{lÌ’Ô²O›÷ŘþwóuûKGQ†ôµäòϘxœ93Ë™çÚܽ¤þAí¿nz·¼m&F²¯¯Ö&aK«ùô‘ðÈxf¸û«¸kY×óþ‹Â}["¦¿¶_êúéà`NL”WÆ—K£[Úâ+¸jåÚÄ÷Í{Oí]ÜŸ-­š÷Í¡!ì[Z èr¡[t€-Ãf'9ß-ÇãÕ½ZØE&1œýÀû»òô\øT‡F!}<[¼™Fîíœ?lûi¡\ß±øIåo”Ι5¿ú›ŸíÙžíÙžíÙþq ÀaÙ›W ᪡²•^b*/ ð*½œ\H Wê%üµJÔW)Ö÷ËœP€ÔÓÄ)ÿÙÚ¡Eù²å«³(uŽ{5½ÄE/ÏÏ\Þ£.;©³¹«U0Rj›ú_Z$ÀÀRÃȵ)C‡s™¡yB©TŸâ9k¸BEÙ¡| ø?H•S©[ùÕhµ =Evh 4ëÀ\ÅÜk,zðoKF­–I¥9©Áy*ž¨ €Pzœï¨ð¢)Ô­ÿ¼PrÓ1 àxyJõÐj“!Y/*Riþ{\!:ñ©9=?•^à ×|ÊÕ’G%5­ŠvM«J^‡ÜHXЏÉO—]ž™í ì—uôµECI)£¤žŠ«"õJ^)ÀJ±ðg…Þ¨GÜt¢Á¡2ëóYR¬ RËÕ,ÛðUÎõyñ±«²ÎÄò-Ó@Ã&ˆ%iVa,Ús‹ŸmkÑš Ðÿ©ž ̨Ç`ÊÐÌ93®gŸÛ5º¾:ŠŠs>50hÌ [wžgÚþ²«\ߨƉ’­ ¢'ø™o·Íˆä¡w 1 ´îß?û´¦ãQÛ›üî­?6ü`oÅ…ÁKw"õÞ ²ZÄ ¾A8ÌíÑYÒa ×vÒh+0ì{¯L{nÿO*þU'jÀÝ-Ì›©Éa—¾üw…àLô×Oîî‰ øÝrûŸ(´®àï×ÝeÿÙžíÙþ³¶§éÙ>5#‚[Ýu’¬xÇVÜúþ"¤&ª¦„¯/€à9#ç& ×O¸”ðr –y)šÐÌW,FôŸî€¡”Z°Œlíj™I¿ÃMûAƒÂ°‹í* v67ÕêÜS‚ªÔø5UEÉ£?Ç–Z¹kƒã/AÃ6HÈ©´kj±pU¬Í_ €˜»P¨™ÃJ]¤¨Ó5³£ü9ÍïkÚD“z¡°õpí5ØHW1Fîë,̤ÑP„¢5½0•ví‡3øa›Êˆ,êµÿU _t” d¤š ü~@_ÐÕh-Wži¯ìz_nJ5N¾÷Âꞻ紼(§©¯ëd wAa|Úä+õöc³3—±,h\urÂù±DYø„ê¥-_[sƒ¼÷v´œ2ÞÒOBé#a¢iB¡Ð/ƒ-O`œ*›kKŸ#ªbŠÍ ‹é L=“|3lJ„µjd°f­Í"?š••ª.£AÛÆ²}$—#ºÀ‚y¦—É×i])©Ï9j·<ÒL[vòt Fcy¼cmdÕ„dêè—Õ²õ,1CÝ›ùW:O¼ZYÅ RßIºLљլ渠â¥\wC3MFÇ"Ë«t‰n\Ñ\Y_Â?t„›w%+®µÔt´ˆI[$<æÞF”;³]Ü1¶»ÙÃÍìÙ=Ëuu‹()/‹sWk¿Ë=»èì£AÜ´Öò&¹ð­ˆUfðhQs6áuúrô§„ jüd“ UΙåá¥CŸª‚ü|²Ö«?°CÌ9Ð@Éô0é4²aOÅ¿NŒ«AÄXu†¦jÌpiV¶7¨î‚„®Ð˜ÚâóÕö¼â¿ð5eôÜ[(Ÿ³º£{½PÈE¹°T\»K]ÑNš¡Á5 »1²ÊôKœTÊ™\0}—öíx!½€ÒõkÑä¯Ùr4Ñ@VP+¦H\3ÁšÖô'|d/74›NNܱx¥ÕÚðÚ\sL_H¹e°óB¾ m&™M?ÅÍ̦ÛÈ•½»¢?9§¹àeDy¦ÈÜÿ›@ºEV¡‘9èk-MÈZêÑ,¦÷kðý¹h–ú@¸”ÿ˲ìJÐ õ1xŠ™TO+º3nBvŒ)ºaÀ‚ô6¥pt¤™Þ2xCËNÅ\Vãt3mËÖ#ûçÈ’­jë÷6Õi +^ñ×EI1rëUZ䤥É#µ%ë•uà}‚rƒÙïa>Ç$>°“ø¸û@EûºoEÉ“&¢(þ±Ï´ÚTv´'·{A½Þ C7Ò?ߨºË‘†©­Ÿ°G7&C ûæ¤Ý?˜]c¢Õè·»›‘™‡Í[¥OžÀë×Ú¬òÐ[CÅ¢o ‚cÁ§:½9urÌŸ05Ô¾~CêÓJk‰žwú@Ùä»ÁV½.ÿZµO#ڒرáþD^ô¢þDßn¢…·.ù7Ò#÷ßÄ tšsæ¯Ý~ó†À¥í?ßàgsÕŸ+SëöÐx8Þjûÿ\ýQÿŸíÙží?ó‰ól0_å{ÁZÁdX»·(6¢Ké”Zaº“ô+Ô"³ ߣ>¨Öã_쬛Z²¸†½Z¶ÆEþŸ&]d2ÜÑv©©Ÿ£ÔôJ@B&r/ðdA.4~÷Ù׎2L'¯Ìàb®º[êpÛ±^B[ú™iѸµ1¢gáCŠVw,ü¨ŒìʨŠd!riË ÔU$g<qu,r29™{F%6ŠEÆÅö­êAÊìÚŸS…vù©ô7éÒ ’Ú»PwrëQ]+4F†<£!åoØVúÆy,uë(- 8] g”Sã•_¦^8™"µ•ÒC£)›„´ ¢9Õ0h¦ž,­~Þçyà|¡\-Ô¹e£CØ[§s]rpAtµ®åm ʼnû¤'Âc©w:þ5ºlDvÿ¿¾o5Ûà«ÓóÕ‚+*µÉÅ Ë­–¥;åK'µt`ʆÑÅ뚟12dKw½ý0òiik6SöňƒÆ B2JõŸ R™á£sEðÕ‹K—}w4GÊ…Li[Òdï´õy‡í´ì“>e¾ZkaÿÉÔTð™Ð>:ßôRŸênIÍü€1XR8…ä#!8YĹW£öI8ƒ¤p&1̧ÀRÀçAa‰‰Öô$¿š7ˆÖ<ìºìH¦7ZúóHÀÕ£ÎkÛŠ¶ÊîPñ¡¼¤²†Z¡µ!»À$KL2Gjoÿ†Æ|1VŠFQRñ’Ê‹-åFº:,ly¤h‘¨¾©d,)¯:‹Ôvdj›4,WD¦ûJ\S‹iª tZ¿oê혅b°G¥Ÿ¨¼ kݾW瓹¤¸¯8ÅDèXð.ãTf­7 %ÅÍ Ök ‘c}¿*Ò*ÜË hŽùáío)£°U[l))Ë!¬¡&þÑC;(¸¡¦ ‘Ú7Á¬]†)f‰Ã@ê–”×=7ºW–ìí5'½}ˆ-—gô‡™Ð:ØÆ7_k«IÖÇNÌx0IûD§ƒ².S‚øøÜsò­m-]9;ÇoICA°cïïŒÃ­º4¥}«Aõ}Äûº¹s÷”f.8AÿòO¤¿¨Àüß(ó˜>ý™íyõ{N êlðoœI>*Û³=Û³ý¹ÛðlŸœHú¥®DòbŠ+S/·/@.x¥žlË@*fèô  ië7Õ4ÐÔßPÕù3«ØQÚ”)œ0W¾¾€„œZ m-Ž–a>”Ab«¼v…´#ýÒ,ùhvc-L£Y \í¤•Üc<¯„Ü«KiÆ@2ÕRã@jpÕŽñjDû¶¸ºàÕ[+ö×µ‹&ì8êð”*JÏe§¨0Úx6ö–>¨Í¦G ÿ-À¡ÒE†67^ëÕ} õš})x©šy_>ú D®k¾ÐÔç‘kTƒz{Dj#YÝ=J£7¢4RùÊÏUƒbYq æ Ç0©‚^xØuT‡V]ôÕ"”[ŸÇUº=î¾ÔO]êJ+û>Wiµz'ËrҦ.¬sù–ój5-$ »à‡³F`=ƒ¹_¾ üÑ¿¾št«ÔÌ!,é^Q•é ¡Ì©¦×:eÖ±µ½¦q¨Š®°‰æÃ¨¬°¦Päšs.3-ôŸ±ý(ÕóÕñ,­ £RnRKóê_SY–Qj>ÎtK.\d¨jG4ºãÐßÖ,ÞÌ…rõŸÌÐ_Ó>lƒ¦1ˆÎ2t½»Íé2Öi9/NÛ¬p”wšlš°¨.ºÙSbîiX}eÕ.-¨m®ëË-<Šæ¶$bbk€s(šKÅÄ9IÇ76baëÔJ“áE7{ëã4á‰1³õ Aim¨Å¯»½Q3%î’Ó±ÊxçKh`¨DRyº¢ÏmïHˆ‡i+I¦ YæEQéñâ„!:ó”AèvìáÉÛ\a›QhÓ>´Þ2G NÈSÐ-~ RÓôs|âî¼ÓM´ëFÛ„É d%°}[!ЬA{røù¯Ÿ~„v´<ðý´¾puxð^ÓÛ^“]é^Æ4ƒ.‡coÖ)}&:xrMS¦»ÄZ‹3°xŸv¶³¶±¢UÞ`7ò•EK”"4Ö¢š[z÷ibÎó:X¬îì-Y÷†$LGa©‘‘—²ÔÍk}÷f8nåf`mD¸Wÿ.¿W¸fÁeÀð¨ì+úÄé~Ÿ5Bíçíã¹åýß®þ‡ï#úp¢¾ý·/èölÏölÏölÏöï1HÏOèRl­¥žUH‰B¼ ?€kòYf$Sûuj*Ýs Øõ¦Q”YF±v•Rû­R&ÄÃ.ŠÕ£ûë~x5é-÷hÖÒW"©áƒ`Ë 6vsmƒ ©4±oœê¨n«·$ƒú†¡‘^MÊTéèðKŠ’.(¡¤†L)¯®é'Ó©Püº& ´K ³£2oK ìõé}¥WˆD”X'QZ‹Ä'°%ÏñÓ~"õæÒ/hmáÿS‹ ®ÄŒV·«H„[nMнùàÕ™?½À¹\HÙ>_/2pùŠ6Í¥) 6¤Á1ÔÜàj‚&;~ì›ÅøÔL× )ú? µøâ×þþ…TzJp?E©64\†w\paVµÔåW¶KuÞŒàøªšEyo"bkµøD1äþë/¤þ ºL•8MÝz™ü+'+Ó­‡÷\n,‹1éVÿ×Jæ½yø~ÄÕ^ýÁ¤ôÌ%´Œ é«µè›œ¥ôÓ' ë *0ýæÜd,^°¥å3Ûœ. »3„žÔ] ž’œpA_=’´†—¼Ú`s‘Å\ë—µÐÀB’¬.(´dŽIsÒêð‘«<]XMÓ×ªÆ ë.irƒÕžÉDZ4DnÖzª|t§ ¼Ý;í¥¸‹TQýÝz{~Mp)ÍÐ…MPØT¡]>Q¤®…Ïr^#hnmŽG„Qòì&Ï.s µ¿Ä2Èlú¬ÝÕÁZÄZ› ÀEn„þ ÿÓÒÌlNŒÙOûç“8¿• m‡½õŸöPb‹®LãméörÄÚÖÚŸq.çI%_ä¡LU²h"õ}¬,ªæg‚?QIâì÷ Ãdå¼$uþ„D§w1‹ ¸1¼ÿ–½ßBNÛ]dÖI*Ûvì]÷66|®N¸§› D?ÿ›2sÛ¾Æ[éßHù¾Qý³¼®ŒKŽa)ð´ÖóL?×FqßD)ž›HN [³„@˜zvú üäâ¬ÅCÎóÞ÷éC×G5ýÒsiC}–™Ÿæ¡ÍAû#yãDk‰´É>Ž˜|ɽq…'ãÖt´ËMžÒ¦yp¸yEdz¾ûûp=´·?È™øcÔüd}º»æŸ9®‡ôlÏölÏöl×Ê×\]Œ*Ý^B[uÈLd¶ÒãÊí¹z>¶‚”),óºßÞ;3JAÎ¸ØØý¹¿°^Uú¡”51µ¸6‚º«Å@6*»æ*¸ JAþ‚rWê+a¦fÛÂ2”Ë <˜’œÌJÀ¿©Œ5LI†&_ Ûaž‘~3†Ñ10÷`ÓÄ›îP…¼ Y­w¡©v­ÔØÙÉWÅ•¾JW³%’%]X *›òYáƒ&W¹¿³Œ ÷¹–1¿VËç'ušÎ†YòiíË}]Í–ñêÿjHœô|5 ”–¯` V¥OEé®×Ïœò‡¦à3Y6rAµÁ‰ÏƳ+pÄ(H.u󧎃Ùýq¡Çð˜µðf|†ªשiyø®µÀKö57¦ãÞœ¿î'%nIäËÝ%Uð1ÂDWLÀt© QÅ·ʾõìm²3Râö½qV,•n.4v›PÁe=é^¶êüÔŽ¢´hòÛ÷Ûy1“t/¼1.p`ï µa¶¼5œNÁk.‹Ìë'Í•\ã†ÌtãÜâݸŸXÞ¨pŽÐ9œðÅþKd×'(¹èaºÓ~¾;|CØå;!øSp»…7·òO&E­[¿ÛÓøNõ#Æ?Û³=Û³=Û¢À¡•ôU·¸rQR×¶ÄÍhx}¶¶-Ògnµü¨Á¤CÐéêjîÒy%ëjÊÕ¥´FÀ/˜CSDéÛÃKjÔ)WC£aôë\q¡×äš ^‹”]^KŠï!µ ½2/ñ£š¦ánØsƒ«ñ'„]m¬ʹW»×î^ÈBÉx ÿ’®ž9Ž5u­¦T¹¢Hº`]|Ä¢JCp$N.Š]-h‰@\–4½Ê{Y¼--v1/S|JËjWW*;7†¯¦ƒ«E0zƒä’Ðëu“†r*HWÆ‚¿J†~L$‹ë"O®'zfÏZm2ë1ù\Ö]sñ²² /Õ\ç×4lVâÊ¿À5ÞT3#HÙ¨Ÿ.ÔÔ,˜[I÷Õ'uü«é¹uÿiº=\ÅÍÿÏÞÙ.9n#Í:l¿÷»gWDžøª*$õÌØ{ÅØØØµ»Õ €DfÕ“¾4,Ñ_è>ìf¯†øÀ`)Ý.ê¨ùv·ÊƒÝÓƒÁ‹‘¼ËÎV9°ÕéÂöØo•—lþõ% ”Âj ¸î1ðº^,Ä&÷d;o+Ðd¶IµS­èÁVÙ"<(•sÙ\ÿjfƒó46²;dø˜Va?h-&uÝ L°Ò@ýTõàîæ:‹œý‰ >îeѦv’„*îŠûî5ï…´•8 béêu|Ó9 LßF†xG¾Üu&¾Th·½Jôzá•Ç“œ4Õ ®èŽæ;¶¼åɘ²áÏn³¬g;åà‘ìw vI÷;e¦‚ó„›±g*†s¥ýP/œ=>˜IÌb‚ê–ü3ÈQXƒp 5*ý“Â5x-~WÀƒ% ž'òô]·5 (Åâ§ú&“P—è£,v:¸Š Ït°lP¸·TÅ  1yÚiÖqÌþE ùL‰<¤›&gÎìßè bm<%òÕÊŸÅíXa5JöÁ録&_Üû‹i2-ùJ ô¯[‰Æ­\ß‹½>r ? ·û2mÅt=µqNjû–ȰÀZÊ\fº’|eö ~FÍ?J8çQûƾ’f…c<‹5Ae+-˜?th ™>Œr–Ù" ßXþûfenq0=ô5zGØåñëM Γ‡Ê›kÝË?ñWÑ^òÙ~ t}7”ùôO¸àñ¿Rý‡«öà7?àÝ&€Ïñ9>ÇçøŸãgôˆEÅÚR»{i\ï2@.è•P,o·Ù ÆÝi3¥kd#>µýóŠ|µuõÚÿBÔ» UíïÎHÉW8bŠíN² ÷ˆýz Vü§ôÆ‚›¸Z…øôl~ÀÔJJ~ØFÒba^¦ä¿±ÝéôªÜDý£ËOÍVéúËà‰O« ¿µhecÔB0²¦Œ¼ á˜÷Ê%žAÁ®"l ôÊM+–Ùšëµß«ÕnS±é…%I8”yûoÊ&+x£Ü¸ï=} ˆ!ૺâ9¹e žþ£+GÕV1Ól!äIÊcËшL“U…[¨uÃTòHF»ÁÓP¢Kí ÕŽNÎm Šúï–uCç¬éæGéÝÔQà©wsµçôŒ ™í÷¾ÁÞ€¼k¯8º[î‚úÊ~5©­ï¡ùXÄ/'†ö0á‚;Xð{uF…®×¦ÑÜA¯¶Èv¯èšל›¢ë21¼p¶"lŒ§ŒNmR" "M%R}°Õ¬Y™Û´¶,Ñv$[3¦>e|•—áÀPÛÙ÷kÞ1ì .Øn• “gy¶ |Ù©ÚCÝʬh«¾¤Ñ.·R>j-¼vøm¢pé<‚\¦ë_›7@ËÄW7•iXp!â…Â#oìb+Æúߦy5˜²•¾ˆ¸ü7å'ˆ÷ç³÷c2]ÏÆº(¬ÿ:HQÈ•åéT…§$à(Õ©ÞJE·,ìˆñO¬¶’ëOmÕð³kéã4”<¸КLÏÒ_³òùÐ9Q{P”ápþØÝT —bíÓЦbp0Úsde°c×0 u@FMñc&¥Ä8&OƲϓ‘Ç'PƒO<—š×)•òämœôM&“.ͬŽWHx`²'Ã.Åþ¤ÕÐ:†7¼éÚ„{Á®¤Ý²òàøe¨oëêúœ²y•“ÖÔÛc²„‹™G¦Ã,ˆø²Õ.ixtä{ðw¬Ó(S6MêñæºL¬ìqÁÝY´ØLÿ*žžõWß òúѹÍÜÍDz}É䟵ãdw?iü+Qø¿.r÷…ý]A^%Ho™üVðZ>Ççø/×ÛÏñ9Þ0Ðëâûæ¼xØëP‡íüGB@qj^¾Ë(•êj}•¸¿ŒÄßbiËÆg1}guå±ö½¶!þ+JÅ×J< _¨@mâÄ%hQÖá…»%ÓLÐjR®xº±­”«{÷¿2»V;÷¼‚ð¿ŠÒ2Z-}àqwÕì*¸®¡ÀšhÜ tY|n`i¾”? IDATÚUª¥+›œa\SDô¤¦ì79»`vàÐ=]÷PÇ.¹®D·ÇEÔ¥­”‘X`‰ŸÒ"ûs€2š[¿:ógÆä65sfw'iv™„€³êPè¯ õá~…û~À|}m¥ôÔ`&ý£‚P艽. 1[Œ{h®:P« ³§Ð+Ýcî´iwÁ\ü1Uq W…Ø]PóÛªß#¼ ZLS8I3w 5 Ùv·Sûè’ ž±"“ùÓÔm–5£[}ëb©ðžÜÑ&©vcæJI8„ËnÈ‘gþÕGÔ„_]Ê·%l’Ç"2 õÏA;ÝöUÛžÐIO& r¤…FȘm4½Õ"ÑM0€M ˜m7ó¨Aˆ´V‡™ÁMž`ÌÜ‹€tìøZñ¨i5#L8å]ºúÁø¾ÝDº?b8Tð6#õä|Zc=–KÀŠ•²WÀÁٹà ÓŠi¡…ìo¸XœqyçxÜó uÃýy%*AXZ]?Á Ä’,:ë®[Œ¼¦ÇŸ£NßžåµÝ®s%ÒÚ¦qG¼ËÛ‘Vìgü"r úDg>Qùî]JTþô>¦©°.©R="~†µÿT%wÛã ÅÌ)l¸*ÌJd´â) …å=‘#eÂØK”‰æ9¦)ÕñTäÝ`;é>3f¥žVy]>Köåîn¿ª©tÎÜNx&[s»&ÙíP6ç» wÂUÖ¡NRo¨\ñûyvürƒ=öÏ÷¹ÜöZÖSL÷I=|™£÷þÇ/Ü#rq!Š+´ùnd¶ý86‹”d€ím+<«üÖOå!fÉ‘èèÊžžY./¸íÞçÏ·Òï{ô4å µ  ~’‡eàrûÓp9À *} šeÍS™Z?m±Õ¶<<Èú`ì¿\-NŸ6’¥Õ°4«¿å¤Û½.[Œ2í5&Á‚ð¹£øšÓYÄmÿ2©ËcPµîlƒ€_ß·ÙrUÿ3æ]?>U܃ðWöNn†°íWb½8A]bvÁK‰( ¬TÙ…›t”ÁÝ Xeì¶X²FXù´î‚ƒ æûšåÅaaåã–[&××É8d›"<£øëµ)wð°xqöA[<ýèΚËe“ \C»×¼‡Ö.œòÌÏ¥¹ÈÄíïø°4[ŒR,M0ñZq¶ÚY:8w&†3êÌ›’N·QÙfßÀœ&ÐA.ᦴ„Kÿ8X¯(a‰ð÷ŽÌ?GÊ\Idèí]LõQ(:[¹5“"¹¶éo²±±ñVgZÔŽ†ó<4çm6€µަ>½§®£†œ~Á@¸ÝsŠ™»ó¬ËÊ×kI”ïvJ¿ÅzÖ˜õ_æ¢ÿ~ ©b[¹CøeQûLcƒ¶é³š—7½¡ÚêèÊ|Kñ§_€C.÷ù3ÿ.ýå×&ÿ–¾Çöþû”©6$ôc¿ó{\Á{6öçøŸãsü{ €›¸Íë ‡šp{A¶©±W×UÈ«)Œ®<“F‚œ݆†¸|×^¨í%ûï¥|Õ¡våEX«žÎî„ ôÀt÷?Zcžg”ë$j!£'X£¿ÙÊd¢N½X땺0&˜-)DKaoeïKì®kŸ¦Ç"ùðÂU:ç…ÞE(ìù©“h?ß,‹p7‡ü·v‹#”v_ꪜ²ˆÂîK½kA¼—ÚY Êpá.¨e”f‘Ôâ;Ö­+Ž÷½*—9Xä 0ÅåpÄé„ÒøT))x_µÏZp[<5û3Ã]˜(`Șƒílò"µ7ï8Á4¥–¯*pwÏð†¨p†rx¹«'8dß Gy)ˆë0Bìâ¹IÀÑo«î‰ LO}6©<„^×3–Y%>ßÔݼ²¡“âñfU/óéÌ“,heÇФä%’˜¥þÉ)qoèá»K¸ôÊn` ½3ž·J9P'Z>ÊtxãÖÃß½Pܦ•^³Š¸=§Üg6÷÷ÅÇ:ô;¦oËæÿÂþÔÁ ~繇ë›!Ÿtý¤_W¹ÿоÿD0Ž~Ùâ¯mø³/ø7.ž¾÷[¿êô>è¡Ïñ9>ÇçøW½lß>W´(óíÍéX‡ô9´•ÂUèºö‰ÅöšºrwÅýXeé__àTF`ïÄL«çÄÎw}/"«+¶²Y¸/Ô x4ÌPÛÛù,ÿ@aHœú²½ ´vÁe#xÚþÉ¸7õéœuÓ‚ ø…ë __ãõúÑwë_“MTœ‚¤G½ÐJ æ(78L»ÆµÝGõŽé¬ªÿAiW;ç!³Nðw±Ìbc!õNpývk8ýjR@ç¤U½šXÂõ6dq+κ”Ëâûˆ­ŽÙ´ò šéJWTN£èÍ\V^C¬)á¡Ád*ÌïÚð ®|ʺ:b ‘éQèÍ1ÎõeË(½µÅ½ºiÛar Ðv—KSf ¯LÙ{‘Çu¨ŒÜ 9£nQ˜èrqÌg „ËhZr@ °Å`Ö³G;Tc ‰-A$Ýîù+µW%‚F­dúE€e'È«À2fjz;`¢˜2k\¹??1Y&Îc„«áÖž Ž™ °µÈ–÷²û‹Øãõâ9qšÛ¡aû¹ö:mƒ»Cñô]ÂW.‰Š´@[Õ_=F3϶eoX¡ÓâtˆˆDw}2R6‰1“êpjsSá¼ æ.—[ Æôëމ@ùž”ä:cû(H½ŒM*pq—,·úÜî±gWòÅÖ—¦‰j-滜­¨z/wDQ2%·¬œu´öl_ï¿æì¾ÂÈØ*›méa,n¥µ?Fã…üúó •¶ÊTom) 1"‘É—]ê¿¶V&$ƒcºž!@ß ªÅKV8’¬)?^Ãív¹/ÖnçSb¸qîwà‰D†Z¿BæD¾<'ˆûÛÄ·ƒReŸ2½i·£æ¸´í;:¸ I›×‘YÉŸ±nN:»oÖáKðIóŠ\UG¤ÏãYÚ¤j„âð¿¸}IýCê‰-¤ã3Åe¶3º° †JÚ©f­J¯æ'Δ2IÕWX]½kò}`ñÓ/|g5xS}[Îä[½¿XêýMl€_î{Ð×kéÔðWú(ü¡¬ã¿àŠé~’¿Ë@úXŸãs|ŽÏñ6î·ðe i‹p±ãzx¤•ä_ÂEàaÓPµò`›,¬ ×Ö4Ðàà}Ï\û‡\°nÉh5(Sl »Üº"+]µÚÚž¿Ž·ç‚ÅÀmr!Ø›îQ­<¿Meô╇„Ióô-;$@Hg0¯Pšd\Z½­U@½ ‚à6D¾€V³†6ÞVŽAªujíµÕWÁc°bT]h›Jç¡·4æ:èI­»!G8#ˆ«£ôtFu")étÛ©xRÛ&ß$Oû ©Ûµ:Avi—ØÃ=²¼]jnèõ®Ñh2*éW¢,‰)2Ý#û»´žÙËk¾­N‰«º€âú„ÍñÒÅÁ D&;ºö3A$ÑC2ÅMšg~£9pˆîâË`×a6ô¬?½—Ãü—(Â/E¯V»?[½ý[JÚŸ}/~ïôþŒKÄ“qõ'}åŠ7óÓB?à ô9>ÇçøŸã¥Pÿ;(%F­£L5(Q ªp ×…‹¼¡ÊAïiZöZå6Èø&“ÝZAs¥à[mªEÒ¨#pQD´ŠUé%J·¿nE%CU¿§ØQLó[» #4+éWÈE¨°“RbŽœàÊ÷Zö@±†‰ñl:õ%à†n¨p×è{p` t¾eà¯\ð¢âßœ›‚|•¡ O•sü|»nMRüºpºPÙ›zq±F€°\ñõ4ZdÐI]¢4ó]„#ý>ÊksÕV¿ŽÖŽ~ÎÀÍÌ^^÷ÆðL`¶»*k?î_Éu87õŸ¾´&—mv_«bγB§³ÊúùIbi†V©ë.W¸Â1`©?²zJ]m6CìRï”â&YnlQ­sªÚF~hB0ZæGí (ƒšB§‰Ow¡ËÊêÒwVÆ/’±¨ ÏkÓ˜' î¼`Ζ”I÷šr™,;®rxn› L¶L™°üþÙñÁÇà©fíO²ÁàüE&?ò$€Y¤¹ýP§™ûܦžÙöõ ÑH[€Š²%ÉôVæÁ¬‚RiÕ¾³•친!Â’ö£³cÉôf½YøÛª- ›O.äi¥õ{ª™³%R’UÍЉ‚홵ï”ÞÆcw1Éʳ¯ÞÙu°Ïnú¸cD¤ö÷O_ÿÁ?MÕ;£W^Ú›ŠvIò›ë¢ÜΖ F?ýù¿¹øþçý•÷­ˆß­Ö^ûµûŸãs|ŽÏñ³@… ’ÀHy¯bãUG@!®™€%ƒÖñÒvµú\M„ýß>š]è«Ç@¹Œ‡:‡˜eµ\p+Âu‰í©›¶Å­„×ÌJ«õˆ~÷î7öiåEúŸ<*göÁt©š\›®“ƒÂ]ñ¸q¥€ehÊó3‘f'f9–ưâW8ó°h¥*×ÉÇÛaTNú4N*ÏðtDïN8/Eîp4¤U=XÕpH艦Wcá€j,3O ™ÛÜË÷Zc{lø[tJqßš‘3ÁxŠÃïÑ0¯‘Œ‡Ús†ÜrÓž¥ ùRÓ“Î äù±§VlŠs?™âº˜éDë#g0'5²iÅ4Wݥ݇[Þýº)0¸<õ°WÌšùÞxÚ”5…ÚR?×bŒö!bo ƒ¥ayÄÿ&rÉ\Û‘cm$)߆øeùfiû£F÷/ÞÒÛµ ÊQÑDg})Ä­kóÞ6bÏmÑž¤è*|¹ÁÖwéP›ôLki˜7¨ÂEåöÆ´T”‰õ‘Òóµ«r: <6ðz-xøòäµÂ#±Üvž‰,ÿ-¥(N òxe0ùÓï¨06’7œ}ü]rĘäòú´£ùörSÆÍ‚i}â„°ÇÝŸŠ…fìq¯ñ/¢d^-»÷2zXüÝÂÃØ¼G‹1Wp‚¥]Mr¯1ÉxËž3H+4Y—öœ¡âßNy8qß1&ûš”Í}ncã’£ÞèIzCf^•ið¸[GßÔ¯ÿ†Šþƒuô|]Ô²ñ©úáO”¡¿ÿ­w®Œž¾™|Žÿ±ãÓéñ9>Ç?ÒPYï^e¼¼W»ß6lôRññðnàšå™t98>mwCú_ÅlGiÊ®}µÈÕöW3m£zˆ˜iÁ/,Çܪ ·ñ0ˆFÖ)¦dÞ¶Í~ŒQ629l‘ñáë¡‚Ng‘Ö—Tñ¨¸êàÉŒúÖvMZC*êpV¦LßKk”‰-7øZÁ–Lüå(…»âz€ná´>€Êå¸LI«”Åßd1MÍ˳×[(«d ¸ ®Ü&õ·Î2ÕêB#‹/&²5×n·c(ØJ Ðì>' › §µ‡Ê6c¨À=̽µ$̾‡ºzb*,5ñSÿR€¶Ñ*·,k ´ ƒÛÃÇ÷/ÕCPKw/z¤DY ü‰ŽÅA,ÏÃÜÕF ïó}zì9Û!7ÕÖØrË[[²^5?6•S¬ ¾2E€:úWÊèÒ(náQñhfØìqѪ^í³õGƲ(ÌÞbRì´~}Ìþ¢-ÚÔv‡LÕÀ¦ds§oÛ ‡jVæqÅÜ[¸–æ«©³ÓkoI;»h«Ôe2Œ[ãðhpý=­ç£Ô¾Àj8ܧ'3-i¬Ò±xµ:Œ]ckŠüyzCÝñî›^¹¯Þ:»Ë! “ä¹u-ëh#>EmÅþäÞ¾À­¥iVýÃÄišŽ[W¾0YÅ ãg0ãTµÊ-]9#‡Í´k²±Ú´¢:nœ2eS‡mÚI¹|î:£N“N+aɨaÅé¯ÄqœÃ˜H:cêfhà‹réDÚc¢äÈ'|&Ê]ˆõWUÚê峑|T¨Ÿ(+tŸsü‘Ð&’™ vÚ&è*>=‘`Ëé„«ÙRy•…ÊfzÒšæEd³S<+pzÊ×9¥[§Ì÷Tß)ké°3k¹ÂÙ|aê¨WÁ\®MÙ8OÊW’ƒLˆ}*rÁQó®i;>ÕˆuàÈÐ7 óÌþŒžKÊfPjTd&ÓÑ…<'#>™¥²o·E‡Å¾Ât+ríPæã)œƒõ…c@‡·Öï)å¿„Ñó¼SáשÈßõ~FÇ?ÒÀˆ4‚Sw.¦§—oW|_@%n.5°ÓlGPÑz3kê%.¢4” \äW—ŒBÊ‚«,û`k”§ÉrÊ6мWézµ%ZDQÿ¦Óïw/¡æ…¦˜®+ÔÅXý¥šþƒã©Ô…‚™‚øÌ× ïßE G^*p÷?TJb´ËR.ÇrQqïUeì“«p7¡ðÆEâ¿ñ_G>pí‘ µš¢qõª_› ÒÊ#meõ׈Õ]6jîa{È0j ˜žÛ6l"ÎÀÚ$Î…ÐEŽŠ´XR ~+Ù.£ô¸†®Qy4«’i/³í½ÅVÏ6gî{R® Ý_mî¦Ûø¹CÆ^/Xr×ïÁÅ·oÞˆšîFûÂê›õn¦Dì ¥%0âPvÉ)Aèj!}–rç ·×¼ãZ :I ?³ýFž¡1ÿDW¯tÔ"w€–àÎ]}ÛŸShŸ¾ˆ¹a(jDàködiÌÁÑm@ó…]l€ý»òƛѕšÏWÑ#Óí>­Îe¹ŽŠ¼™FnfëdYˆnz.ÕÔ˜¾†T2,S¯ŠïN¦É>A¢þç¥ÎÛS=óÌ\]¤²dÚ3µY&ñx×¹fܨà*a ã$’Ãà}¬uÑ Í"SŒ¸/WïÉ'uÊ3°ùÃA@D†òG}ÀnðËû:ö¹“8Mß4ºÊ’¹IoíFIä°Ô£¼ºÁÆ/ÚN)z¨‘S 鷣л­0q”f FÜåržK{Ï’6£JY4é‘î&â¸Mt¾}³Ú}Þm]ab}ó³5ÝÈ,¢}ňî:>dB~À*’aÜ5äÓðe>°y’™JÛÚ˜>py”›Ýò2´yt€tñ(u˜QÞûµúDéV­ ¼'¥Öª]SoªÀJ¦0³Û*olX—1 }€$d+}šoqÏ4w=Kçæa ÄfdFÛLoxÜÄLÜDÆ•À?¿›{^3ž ó:üâ/’ÇþÒ>½º oœŸÿ„Þ€zý 2å;Ùú³NáG¾¢Ëëþ(¾Ÿãs|Ž·—ŽÏLýO €Ójßà›Ü x™€xஇtò2_@ ªFYèØÇ.|PJÇ >iànÃ08H;¥¥–û[ˆÝÍHÜôÇâ„æ‹;Ë¨Ž°n®¤×szæ6×fÿD©}ºMA6î¤]‡ü½-“J˦’}jÍ./×"Ñj­‰‚58åËôzË–~WÔŠûÆÝº[@ÆŽE»ôÐpÂÅq£KS¯M:dJˆ@„ùúVŠµÚ·UðÛzØè½ä&k:‘W%Nz¨2 /ÎYôü¨¿x‹K©¤¤(ÝekKGÂ!¼µ:ì0sg²šáeƒPn=ə켹ˈ§ð•·b㲟i%ZZ ?Ù6}šCU›‰Ãª6a”PyŒ´/9ô5×2®‰›ïiaªbñuüô@›M7L¥ÛÈüQ”ôÔÇ ÞnÊgVjPÁ] kËð°ÕaOâc “úwñ™¸/%QÆÏµ‰c~2rÁÎéÜpp®M×Ò¶„S}kD$¿•Ì áQvO¸! Ï®·Õ,V3¦5+Û§·‹lú‚ð†Š©gç&ÿÐÔž¢³y€¤Ëj5HùN —”ʇD—gæT¿Èá§Ã?!¶`Ó‡ŽMôjQ BŸÆÿ_7Oåz÷VËýÎFF«’!)º % “ý‰@é'”7X]šH ‹úYõ±QÉ]%£±!tv‹cfZø’#ΊŽNw|W…˜„ôó—ÿp«†[Ü|Öµj¿žÈ? ÑÆNe¦7¹æ'%b«ÃhÀv2¹?UYd^ ¤`Uõ6À÷Øhéä™ÐÍu=ùÆë9O¡}öU·ˆ¹D$ö—€hD©jïäõ'ò\'|%€fEÄT¦W3¯§–Œ{~G Ó3Mö!F¶y‚þœeÔ$AÔ&²«·ÍµÕéH‡ L0Q{±ŽäÒ§gYyÝ>Aìçó©ð½KãéLÔ«û¢­IÅ{ Ú—¦ U!Ûm¼=ÍgmfI+J ÈÀ_trüI¯¤AÊyOò⫈]ët¾û[ªÁîa„‰°LnÆBz;Ù,#ñsè£YªY–™ ´¢ÿMqo°ƒ€7¨tÈ@ÿÚÿ®’IñóºŒÎ-z¶ ­cê¸^¾YÂÏW+-ÿ\Iëõ‡ü9µö1‚¿î„ÿªãíŽo|ÔçøŸãs|Ž¿É¸Ö+r­&ós¼Â–ÑYzyãË7(Ç( _˜ YÉÛ*—{VíPOêX›2 13&W&þw@ ô—Ψ]¬V^ÔPü›Þ]P& §AŠ„Ë*_r•t–ü^kfµEÜK€S³Üu"/ qUè­®á^¦ì7T‰.dJ„Z{I~ϤåR»Ç0L†°Ñ4>^L¿Ò€ØDÐ.Üê”Kªzñ¾ÙÁÊäÓ^înüTjаl¬ëåH µ&!Š…]»Xc¹\©zB &L¹½¼"\úˆI³\]«W@Õ5šìCNcüöÇ@E]uj¸€¬ëÄÚ¤6Á´-\;‹+] 2·*9¯Ì†ó—‘ÒŒ Í!íß]ï¼ ïíEÓò©Â>^–à1ÒxlÛ1Í>g÷·Ñ°Ø2ü„ÌÂæC/>0¹}èŽÿž|Kv¢ßÖÑâSL/„=gǸßå;JA¹ÐdÍYôQhß¾W-&|ÒÄxˆ&¾8p~7E4Ãl5p%'˧v/Ò”Vˆ6tæ"7±,ÒNèrªì·›%£BÉK62‚ÝþQS¡þ£˜(©ÖÌÛÞ[ÿ‰ I€¹†zº9£‰Õ‘7M•_{²Ý`vjøÏÔG`Ò'Ž–’ÛTTz<qD0ÁÏšwªŒé]±¨×DòÚ÷<á²ÅÓ5:„ât1™SQƒVvµ”ï¿SUh5…hï`šBŒCì¼’««}äðéNþY‡™¨WBÎä;äî—j„ð:Ðâ‰æ˜]ð³•QÜ!cÙµ“¡á\y¿rUÔ,1›Ï%¹ M{{ÞÆD§0À³Úuç=džfˆ[KÍ65öî¢üö7Åó¯Ü£‡¾0¤º×K†•göÕ×¼÷¦ÑGiÏÄîV,…=8=¨ðr7‰ˆÈ`Ú9˜þÉ4…7z7 TXµV•faVCspnö¥&D1YÛæÍ ãùUò$tEz[ˆÿë¥aþÄÚïðÝ<ä¿?ŠœÕ¿N:êŽèÕ•·ý·KwøŸãs|ŽÏñO4Šy;¯3cR«u·i»ãe« X·FíVO×´¡jS*TQåßM«‡§«Ë@«¬XO_à2›À~É××d/F2¡S¾‘PîþÉ÷5öt˜û¹±éA¯S—o_Ä0@Úu»éö3u‚õç§}õ«z™ªs¼©yI˜*ôÄp·”àV~v B«m­˜…ÕB½¡: íÃ+p û°vú>§¤xCI¬ƒÐÒªþ[VAëiBç5oÙ5(:åÔo÷Ý>þb–I†½œE‘$8f=l¹¥<ÂfÂh¯¥,?¬Ÿ˜Å£›b4÷~6+è«—fÊ!ÇÏä ¶ rÁ®×%¢™_ëö9ø fß /uL×4îM‹Ô#ÜåQ¯yÙïÑŠÕ(§> t—®IÉ-.»“E~es蓙ݿò á¨þ?Q©ªc¡’ÝHäô =:µšÒj:Bn¯ÖGÏ膯p×&=DUëg¢w«™°ö ÿ ›ªb¾£ä{óKäóÐï£ä{nàEË8Úµô"é ¬o†Ç¿Éàc€q0‚jÇ»f奭Dý®þÞÊÜ.Dz…ÙÙbhý6-¶#°µbZK¨µä2Š©.‚.P0Y½/Tä nc`÷–· ~[*Šp5 º¥—ÕËÐÉ‹}½±ÊT ƒ-]o…ù•‹rƒ9‹…Wb]sÊ °­B=c .@§¿„?`ыĘy縞ˆNbÖ®Þnþ“CñÔåŠY^¿­ µ:rµz®O¬Ò'FR¹u­öâS™õac^ñ ‚ûÜùÏ3wÜyH^á™¶ ½“¬ÎoBk·‹ï1åýi#Íð°K£8+Dh>½œÄðZÇqve*˜6q*dc'‡2q!ÕÚt›äpL©íÚa5 nb]¶ô>é®?ÃíßUÆÉ8¹Wñóa°$N„er‰¨oèõ/™hÓÐpb­0½e4uX7àãMž|—¨nךOs5g¹îQ†¶p‚¨ÁgeþÙŸ|ú¡|*å(‘Œw_ÂñLs€±ÓõºO•Ú¡6Ùv‘nX°ð»ò ØòwpÏ/Y“TgËÅ ›¹bj™¯©Ä¿ï‡¦@—Žp˜~Üñ;³Â`Óìæù+Ë{Ò®±:>ö¡Ž—Ñ·dCKf‘Ù¾çA£z¥wùÚÕ¤úsðF¾è»¤s:JøLkPmxéÛ’7Ò,_¿õÛë·˜Åü¾¥©ë•”y^*…§I'ç{÷¾Tþƒ÷a½ú»DþÓ¿æ· @À¿OýO›Z~zœ|ŽÏñ9>Ççø?e”ªÍ¶Ý匱±/£6X7´g(Ñv#]Í Üäç4ù#K ‰8•q—ÕvàM.M{ºM W¹E44[é¦PQA®¡òËë˜@+°]Øš$SEÞûßÿÕÞ¥;üØHë0Ðyµ×¤?Fr5µ?³[¡…XÎ8Y0Ih¤iM \…|¿?Rq5>ϵŒŸ~ †&X-d¦öØbj1{6Þ¢!ƒb”½M¸Œæ¸á)'{wKÈ=kw f³Gú²z«¼p`Žš_}qhñ©§ŒòbºñX'Sýo¯ÔŠßh½]Üç2®?–:¼«Š6¯uZ{³mÔ«éjê³ØPb¢AcÄl$Ð<$È(_Ø’„ez#L'Awªú¿hçƒãçL|䉗J?ˆŒ±ÄY;¹Ò2^C'“ȳ§©2šx¢™îË ¡ï®pEë•wÓ2T7¯µX‚Þ´±˜DÓ'A/VZfB[k÷6ì^]ƃ™€‘‹·†Ë«EÚ„ìCA1Í£a]=&l–=ÖÙ`;*ÁC6ÈØ}Г'*Eöo¤ ‘Š <‹Mö£R Õ:méZ·ÏK¿n5åƒÅò°nÓÂ#¾Ã'p¤ø*Š7®¡¥²Ü6<¨dùˆˆÉÞÈúÆ‚?áªbiZ¸ÌÇŽxN?öä¾ ¶¢Ñ˜ÜûRg9ßz½Š«]?xäànŸÈu$ì‰);Ñ>WÃø–4b/à;ðèwû9ˆgÙý-ýæ‰ôíµ~öMN´.ÎÖpt]íâ•\~¼9šäŽ*œo‰ÛïiôMé»I6T}L¶)ñû‡ŸA7ÂÖÞáÛžÄ7îÞÉ@õ×|â:û/‘MGß:ù<öÜ5'íšãöŒ ¸¿ÜmJ‡·nÙMK ºÎʾ ±½k>@Ô’8\C f¡Fs‰M]ok šÝZl1 ’’†§EÓ+P6YÀv1|+zU›†µ Âê}»ÌGqy‰ŒÙŒÓä[ô,š|¯JÆÆ°Mô€ôJ÷m‰ÿ›øse·äǸ¡ìøÑb&¨š1ŒØkUÇèmY 8VW`d,eYîÖèê+¼¶ýû¦Ôï´«5ûª¡f!Á5Æ×nª…a*ÎòÔì™í±›ÐÜ%xœ‹£Oÿ$“Hof?Å€p›&6'|&Þ2YÉ¿ýeë±ZÐ$Ø«º.œez Ÿ†£ù) i¼SÓIó)+ e/—N´W“z-¯¤¯à§ PÒƒþa(Úå!ëâ$°,L“ÎÜ_dd9>‘žëb©PbK_ úÜDI¼J*´×äÇR+Ó˜Ùb„·‡½ëÓá`¦6¶/€&þÄFmùKÍô§Ce³)c î~íî¯HGqiµM‡šoþˆ½zðЭÕ#…ŽC˪ÿÜzA·ѺÐA +îà?ÏñM–b½H[];,æOÉþ0*¾ž£z¯ñecBj{Ëû‚‡ç‹^M½º::»O®Þ/ÓÚÓÊúwäÏ¿Leê þYÊ}?½qý™YÑ¿ð ލ£_}.üKÅß 1úŸãs|ŽÏñ¯3ЇØnE -€ôò%™(wçùT™rQSE+4JE×7ð :\¨T\w,¦Ãþòav>×ïí`5{ÕÀ÷DÂX°r÷æ ´ZÑ ±QãÖ…¥§/Ùr7¦@Vµ ¢òÈ…òV/èÆxe‡¼Bd*Ûö  vf÷¸5WíËfƒ1+ÈsK%:৤I74 ìú]»æ“Ô~£˜8AwY˜ŽÖoáäâ«c…äy)½³Iý ú/”A<Ÿ(ðæ²,F¿Nï­=à!èt6Õyf}«x":È53»pEÊJu {’Šà,«p5rT½º¶Å | nÑR‚§J·C{›Ž7jkJ9!ÜV’ç¢vB¶"†Pøþú¥úÓ¯ó9Þ0¬š¡mç3Ô¨Åry1W+‡/ý±rS±é4µ9ŠÀ»K~å^¬€™ CEgE!¾ØÑÿW… ƒˆ2·4H"·§ºdùëyVý´™±«Mè/FhIÊx/^5øŸU 1Ÿ°PåeeÕ5Õ¥2èá@©PÅc0U.óŽ~ º÷=²ÆÖÅoÏ`0/ ˈ¾ÚÅYqŠ#ËÞ¬ R>¨‚Ê?e\±‰!Æ­Dk€ÝSEF‡GÁÔ«o«p×ñ‹ÞþQÙvÅ&RYp%ÀQäjÞLJg^… <‘1[ÊP¯nðîcrV`ih+”û+“Ë<Ó Á‚JܯÑ=0´éb’´©\Ò’¾ÛÝ»½°Ü†â¤E¢whðÇ ®tÍ÷˜hà êâEI ].-` ¶kÐîÖQÔ}lGÅÀ uw =ÖÂÅÒlVðˆO…b„ûf¤ÝÐíÜÐ ¸¤h»Ã§©IÌ¥ñ'n³®î‡å ÔwaÆC@¹µB&Lb¬ud’+Gl­˜h«´Q%öaO7«š‹»ÌŸ•K|Ÿ).¡§1£µdý›€Ÿ‚ƒÎtlgTÌ…±1Íl _Å@ĬÝ:†hhJ tN¥:éõ "ùêÍŽ—Ÿü¼A-‘¡íµnòv©hÒÄ¿Ë<$£X¶†p»ìÓ«¯«e{nFýtÖ°g•ÝÜÄ/ûuä/H¢Ø"ƒ´ìŒ<ð^ë·µí4—=tçü€žâ£>g{S°ÁäÓ2v¯f®üÚ›‡õÁ]F¡ÞÛˆèÀ@×áÄÞÜ6É7ùg¶›(¯Òò;§´—â,,í–¹}¤&6ÃÄñ—d§Ç ÷€§Ûû;×¥cNrêml³i¶»QIB@Ìf <;Sæ,.±y7¿Ú0ñÚ‘q)su° ôÜØóHHR?I¾ƒv¬Z¯ÿÊià–Ho<^ãg'g>Ñ“Nµ{Œík'\™õÂ7¦µ×â%ìê¢u¸æ<6šó<%â]šÐßâ‚üµ0ÿ2íL?xz/>’¿Ãiþ2óúŸãs|މ0·"ò’ÇzÛ³5þêpÛÀ×Á–ibqS]gé,ð\u,ñµWJb¾¯^Cà„JGLô’ð»óåyˆ`áF×£YÌ[Uuýª‹AÓ}ï*ª°jL¬pƯ¥+`„âêÆ-¨â PÊP®/”kHÞwq3áiXfKSµ2v/w¬(7.Àc”‡_ú2rž=wL§r¥#´ ã›¡ÜÃÏ(ý†6$Q1°0êö"甎K*ê§µ|J?Nm0Jéû*úõ©¨ÍjººÞ\ëö‰YµŽUñª/e…/Pÿ¶Ô¥±ÊHùbÅâ.GÞýœ«oyÈå³/Ý$&æ¢M„:ÀÿÅC“"gÂÞ4ë°1¶µÃbsP|'½·Ñ.àµ~°Ì¤ÙâPõÖ´°ÕÐ¥e?TÜû÷›Uîþ!})=c.YŽ6ó6éçúîå[þ‡Ù9kX8òÑ})«YCÓ²0íR:‹eöôÕI«/Ç’y§}RG5hÙãµù:cª¶u¦;1ïKÃOsº_ïÄ%Ų&Qq/¶&Nû§Eܣ͢»Ô„™;ZŽ•k™·ª !%¹‚;œYÎM°I€ßÜ©ê«Ô9¢Ú5ÚV, ʪá6WxaØ¡ 3gEn¢»¡Ò–Ä0¦ðI_Þ7½ÇTƒƒ,Rw~N&¦$œv”¦¡¯}¶ª0Ѽ`‰[óÑËLžê¿\ÏÖ´Ù¦B­`!$£ä(®EO[¿‹»¨<…öåÝû‚{®ænNp³¸ÞÒbèÇ’yF'Ú óJ¡ƒIU5qàÅ‘þñS"ßïö›â£ª°w¢ÿæÊÇ?˜q—®Í­äœ;rÔ1µÞK±·YÈ•k c÷¥¬Â8ný£œ¯ôžP©@¿Æšg¹yÐXGp„÷ˆ›7`(—É=×Óñ£-»eà ÚZãáÍ1š*q¾iƒJb¢ÝK¯#oTº·NCO=-ûšçÿ»ßå²<ý‡¬·‹ùì†WT6f5¾—òîôÎ|#×u¡w›æõSÒvj±0º­üþ'ýzÁT Ò¿Ešý™¯Âï_s}ó_ó_ù@p>Ççø?þðùwþÑÏñ2¬8hö¹é|ö_ÁbŠ7íQ!Ý”¼uĹP…¯‚/â¢Ç¶Ø î¡Öujp…µ²ÜÒØ8 R—ª%&ïñ®üЊnFµ±t¬½h4„QÕ{Í‚ý üêVAë ¸˨Ð#¿µ$† uмÁÚ¡C÷ñ¨øjúçüë à(an“QØfÿNx˜õ¹“ÑA¸òáFê”ÕW à«3Fô€yJó=5ÍœPF@UWó1ºÚ{ ³Ùx¬PVu}­TóÒO  ²YŒ¿Þ͉ åkD1‡ €eig:CCHåžµino,q¥T~ Ð8Ré%PÔ(°Ú€—_GóÄŒ/®ŠßxcËñ“—/wÂ7n'³ÀK^¡¿ÛUði}e`ML'ÁLŠ× óä¶…Fß öžžnÑ€9eŒ‡ž1[Õ"š›ªÊ ¥,:%ÿ,qÁº€ZÈÞP9×Ú š¯P¾P.¸m 0G£”µŽ,è+ØÖ’ýë8‡2†ý4¦*kbÙ FŸø×ZazúúmW[° IDATñ’g3&¯–£rR7 22dy¢I‰ÜÒê6#hìÃuL´ 6`Ë"T_‚Z¼ÆÅ £a3?6–n¹a—9}å‡(i±ˆ<7‰¸Má7tMâÓV=šLÕ ñDŽ ¨]¦÷úRŠÃ²óš†:êÚíMÀa"<çj¤—,{Ceúêb|Éï6¼/ú¼'᥈Ä’›Mú\Ûÿ-ËÁû•­~@Ø¢]á`íX©?`d´`ÌÊëõ$Q8û+/¥p}[úÏï#\DDòëá^Ÿ³: |Ê€Df{­’r~ÆñËö=LìØ^#Ã?ÞâÜå”_¢:—-YSÓ©ȇ25à¶Ì<1¥´ñ'é@…ŲïNr/!Ól¨aœh1é[uâb£ôêßëdÜâ^Ï7Ôf¿h^áBÃLñ·x¤Ô ŠoªãÇ*óÄg:'Ë´­àe´†™A;…2ô è§Õp~CI~pÉz¡Œ§Kâ ç¿¡q ú•ŸÒ³~¡ÆWç´75þêô·¯C‰>ÇçøŸãsüS TSò_Ì>]ši¯ïµ.ɦª ¥ð´iÇ*†³´sÂÇ—@&¨àºðuáq¡6ø ™¬]to½|Àßkÿƒ"\_@^p·’m§-KÈÃØxß›o‚^ÉQ£:05õÂ]€?FÖnÓ‘›h8Œ‡:((*®[œê°o •s +¡Ga jÅø*¸Ðá'—ðõèRÔ¬ý¿M‹†åVËà¹U´MCæÎV€÷…«U.ߨÿýäUÁǸnìIÈâr4ÊŸËØ„¬êNA ¡Ø[™ÿˆ‚°:L¬t§©pfB) ®æ¾\=c@Ñ Q½e‚ÐÖ¨rùMé4EÚ. 41÷2¯; R?®…ØÿnBaâsD2{š[šÂ“ ¤Ò®+ª¬ €3ôñu¡ Gàµ.Œ„°­ ¡Í±¢A~w>“…wÏì ¾Á¬ÛÔ„ ¹…»ñÆPKï~€H­•ƒ1ÕÒeü§:*âKÜ…Ò„‚¬aÆnt•™0<^­wAÔV”oGÛÌ­ œ…Å7 ÜR9ËôÖ:¥h4CÎÍpªƒ¨ƒ{ô3±«ï§ì, &*—ãªd™%¡"±Ò‹î¢ñ-¸… H® &æ1Pª:g¬˜‘V\Že(öLS ‘JBg,ñ|L4†q%ÿ,›š6<–ßB&íF!ž´ gö%Ò‰ô —?ÂÏcÔðsòu*Ù'-?¸V4P{ÛQWˆÔAýA Ö²ÝÅ­øZ©“ñÜPгȃÞÍM2Ðé›ÑÇïw#“ظmÐ" <›oJAVÖ C¤WŸøŽ”ƘUck´Yq4. ”u~²×Òá*dZäSD‰‹†«SöbÀÃÌNhøÊù™nS¦ùÔ ïüó#$6_E>ÌÚÉøbCc¬®p.fºÀT«UØô_{yÐaRw(K4áI“Áôo^ʼnÿ®Ð-Ä÷tk“ò]–sš» ¹ ¡Ø8âBJäÔþ$4eç˜1]¯åK´øð®õóBä;ËýSø[Ÿ£o‹Ñ<%Óþ ý>§·=èßUÞùâSÿ)òø7nÇO˜[Ÿãs|ŽÏñ9~#  ÙeTÓ8ÌÂ@ù[ÉfÕì v¼F9ÿT]9*" cbW‡Àz רg®‘-lmtø}÷܇ðߊú@ù/j¯)^½€!íÖê’íE¹šî¿X¿6™E£¡½^ëkqB8 ]Y{ýò]GŽqq†mÏ_Åéí|®ýª¡¶ÜWõ«¿‚_íwÿƒ«àà¿]ú+jÅí yD_ï%Ñ©X øÄ‹·,V××ÿCA÷šgÓu–«ŸyÅV¡É΄Y9ŸSº½Ç-(àedñq¶uÁ2eûúê娣|Њ„[2¾ªGˆ=±[¸ÆXµ[ÍQå7yße*à^ÔæÉì|ºmšž…„‹ŒduW¿‚UÒG{;¥ÚÚ>Ì>ŒÕÀ ‚š/',Ž$¿µ;2‚´6®2ÂCÄD ìû¤Éwy¥:·€ßS¾+îŠÇ=Ðÿ†$S¯už6Ù{.>ý²p5ý,=·8¬ÙBý¿¯5Ç ÖBÀ#ưŒ•p×Tý½¨4óÆËÈÌ µ•¶8:¿õál¡\(…nñ3[X£ ‚ÅÇ¢òü®OŸÇ>ûúK¡žƒ3ICM9-¶FÒÇ!„Þ£5§›Å• Uº©!Ï(/3pžNŽOÉ-. .r9$sÄYÃ&öL2L0/Á[ƒvY‹×´tz3ùT·Ê*—éñßÎÔÙº™ûÜ·DwW µ/T ¿‰°µË&û-N)v6S!fÌ€•Aüáðë™WžºÃýôe3Eõ…l¢3xbï$KάDÎg ‰Äñx¯’ñ¹d¢§'Ÿk“ïÕ:Ú:keÂôyä³[ :‘Aò¥Ì±Yè|yC€Ã ‹{šM¤Ï)¹ã2Õ9!´9{ñù®ãÍÒaÍa*ÁûÐkü¸/ËDekÓ0´Ð1j¸ñèÈ(ÎqÄ›ðxº7dñÓ\föE䯞í*vê?¿£8‡.œó“Žó}Ãç¤>\ÿ—5>ší—Û Á!†º=¾A¨¬@¿‡¼‹ÿÙMôR%#¶$ÌDf>¥øÊøŽîìràFýý¥åŸy®mxöÀIרïŸçOy ü‰ßý¥w@?ÿwõbz~ŽÏñ9>Ççø'M+V–«æ–ï5žõP¥à"#ð¶NMÐü–üëlãØ\×Hˆ­¸ÀWí:Î,#²ZOÇÑÔEàyT âš]ÇÔ\¨•¨o§¶Î«˜8Žð„ž$—b§UpÚß“…RGÌé|å½q õ²ßþ’7)@™ ÓñôÅ¥tÒÄóB,iÝм»[À²z#ªbhí[Àƒbo2\ Xž[ÇFÒo†Di {3,ÊŠ¡sûÃ2ø-¦ø®´ z®ª¤9–fûÈ”ðDÇjW| Èöë×@rW”G¯‚¯S‘zè‚D›‹ ÓÑ»ŒÒ·LÕ‘‚W8Á(¬voEU­f÷ÃtÍÂQ¥íyÚuÌ&“ûªÁÁ¨&C¯šò+Òk—†¿{y)+ÖÆ‰Å Kë¦,»bÜß6Œyƒ7p»\Š‚5#zQíA½^žc-b¶@yŽaÆÇ¸_ö‡‹73,¥a†ý‡ý¶– {ôX˨öÎfCÌ¿rð"ð–nì-ÛëïsbmX´ÕkŠÉß[m Dqës žžpÍX!`8­’S ®ÕVQK¯¬É”Ì»‘U qÛ ¹\~`Ø~ûA¨¹l(Ïd&q%‚>öþ•ä”ç¥Ó dïW›Ç°ßDÛÌ´Ù$s¥å¶VÛwݸBXý¦~ZAÙ]+æ_!·„ÎÖ‚6~]2\å­¾SöFê½1æ÷ZïÍ$*;1Ÿ8áXK•:.ïô/$ä9æa3òí+}s™Ã÷a©>»!Í÷{ʧs\ßTnùlÙ<õáåN^=ž,ˆ¿Ù6ð#Rôo£Òþ¤¥Áï¨ÿ¹OÃ_¦û¿¸®þóOÒýùC§§¥Ïž±Ÿ\àÏñ9>Ççø÷McšEÐòà쵋3*F“Ô/àjHvš¼AS/iq"¥Ê{ì¸Fý¥˜7Ä£±ªkÁuªŸ$¡_…¸‰zÀUWs1Œ@6´Åƒƒ RSa—®’«Ü¸ÚÓýê/Çw;ŸÉã6ìcÂG¶mOñññÛ'ØwÓÒ+é»Ar³÷7´Háàu^Õíêê4©¹3³ a™M†!c˜%ªÖ¥)€—S‹blÝD÷Ì…ó[|¦+g¬1ú•±KiEÚVxlt¨€6ÄmW(í7 ]š¯f32‡è=ÍjÚq ³+ô¼3SÇì0§·ŸeÚo&×!ÂÁ‡¦yÍüÔÜ":¦@ QŠÏê?Pþ3s ,r—b:pTï’¡€ÇjøXPø1gg ?g+R1„/[V©­WoËÁõé¯Òr9ØÎú9Ò|÷¼éÈ®A›W¾ø1£±ÐM=šA,3;ówôaQÆ6^tØØ©Ý²ž0bÏIGÛH”ä O¯~Ê(S…(råP±"Z±äI¹ýþu”ïúzXXÔžös¡Nv›zd& Бöúó^|b:¢|K-æEÙ7ýü×C¼z—௸¶ÿ†òÿŸœ_Ÿãs|ŽÏño0†êWã¥âÁ¡ƒÂ\l™¬¸‡°ÛjÆa1¾^e¾*¾ˆÿÜÀƒ(tuA™æEŸ¡ñY=QÖên³ˆøº‡D{á¾P¿ÀŠëß «ürB¡:¤ÞùÒß$6ÃjjsQW :~¤â®`…½äÖv•ÀÇP0‰\ÄU ‚ZQoèµÛ¡Q’¸Æånéei‚½m£­ÁH¢gRÌ€ƒ_Íæv•y„ßÖq Ú>ùµçmÔ‹¸ q»!òUœ]47®¥¢`Åg•½E!­È‡­Ü°þ¶u-Ü£&—C¥m?R†Ö|áf§ä·jqí±·¶µe²F}n›íÚ‰+mtMq\\±K+§+p†bá?m­ŸŒ^ìã,Ú‚¦î{ý/Ci_¦‚œ€5ÿh¤?óXÍħРšY¬A·Çåûݼ‚ß`p&®½”ž–Qgäò=,±/WÆ®’Ño+·zþC²–Åe¿k»›EÎN˜ÉÏ–äÓOæòt#ºõ(láþFÇoq&Ôd-U†¾-Z.é ® « 3øA=ð\Åh>VrÝ#yí™3©nÔøŽ1þztK$UÚö«2 =-ÊŽðð5C2ÂIZ]¶A"V•zhsq¢RÝ:c¶N—'Á¶NÌšgHM·m}‹,žÈ}³M Œ:¯žî¥Cáp€?0JÕQ|ÓÓÒukiCæo™6ÁÏû|®'õ¶:¥N&sâ¹#9Õæ”Ké„QË!ñéÐ;5âHÊenœ”šàfQ™xº4á.ßÕ¬”Ìè¬tÕÏIñŸQÿß?ýsʨknØoÈ£Cã0V'ó G,;é+_r7xìx6iCÌ"ƒ'òoëü-3¥nwÁe·h›r”[Íâ°Ù*Üó¦:;Y” üÉäLgƒü˜Ü­¿´Æ¥Òô©è h&´Â ª^ŒœBºK¾b›éizÊÛiÌ:M.l o€Nò¥žo‰§ú¥bqú¢ý,!Yÿ ÉRÏdƒÃBôê"[êþsž2ožÉÛHúÆwý‹oèß|Uõ=úŸã_||:v>Ç[€04_u!Ïæîï «:µv^Ë&÷ðYVLèÿJÜ?¿áÍ\Žî]M!RÛUö’ó?šøøèk„”šäÏÅmh ÆÕh—r¹ Ý­aÂÊU»¬<¬EqÖÇZ5åºlúËØ]4é´ŒïÛ*åïY1í÷keDžÞ#¥¹]“¶ï»5’‡›¨¹2Ô ¢M±Ò”Â9² Ú&¤…hœC1FÂ} ܺêy{ÁxÛV°Ÿ6™´±{S†žsÖ×c²¹VèsÉj\‘³Üà¡el’•–û™êŦ#ÔÚíÙnzÆ ¶+ÍLŽiRVÍê­žüù§m>mq­*»NáÊK1VéŽE¶=ˆ±»bÎØ¶Ñ8Ežîd*µ“Û5jaÚ¤î=«^‘±%ôÜ›Lë~½ÆÇ%R†Uð‘ÐN´ xkðÔ @F@AÆÝµK8‡¹SˆØ'Œ_kž d‰~Þ`°]=¬5ìÜ»`—½‰ðù›rŠÈÀ&ŠyÏæ[oÞ‰Å×oôÓ›É:„g y-;‡ÀÈIy‘×Áí¯–§ÈìW×6äF<¹DßÚÉð; 7é-¢Ò£MÂÉ/ù>ó®r/‡îó£&Ìô81M Í; ·4 [mVOgŠËzÑ6i\Ž–e™¼b?T¢ç#aç2Î=œöI*»r´ÑÞâ³N©D™™à™Û06j„ö¾ÄéÙF”½ƒâöhØf}býê=9[Ù`cn_íÃ,P9/Á|ªaóYRÆjß©õý?ü—W7¿l¡÷ÎýÇe¯ï3÷ùëÎA¿ä²óÛ'üâg~®)a·ý>Ççø¿ÿñ™©Ÿã  š·F#µ„Ýθ&¸³¢ Óðk1´ƒ}p5eeIQM–½…\êˆTÃGæö®eDËÄ$nàK¸ø?@Â]ˆÇÐëW)ô„ÿÔ-£Ì?äÚÙÚ¢˜݉ÎýoÕ¸U]«-µt ½òUuye„‚–Ò3]ï»ÿ§*ÅçwòÌ*!Ìóf5{ýþ œ)Êò…Z¶6jfü^±¨u¥´Rî©Ü­”WOŸï¯bîÜ#G·.\»°ør™2¶p•}HÌŒYiÜV³Y¯Íqi&ÊcðúÙw•»ìÈÃàõ{;ˆ´e­ÎpcÅ”llêç>³ºmüÜGɳ¬m9±m†í¦T.›V—¡©° ’kxGÜHG§í´-+TYÃXêS ŽŒ\ÄSQ ׺ÅeÌ…Z¡ê¡{Lœâ iKckSºÕyYke¸kS÷[‚…u¢Ÿ{ª¯Wÿ“·h›+àû`Âføùª:·ùM²\xÁŠöåâ>U­Öйº’‘Ÿâaíà,#}݆+îâf['Ë”ë8s2ve•ÓUbÌFf` (].]«ÄbUÉ÷+ØÇJÕ¶íÊf?Ç`&‚ŒÝÅI º%à­€¹Q3”ƒ ò&C6­½:g;?#þ{ÓÅ&7ȧXäP¾Ý¤¿†A"·ºžs·sp§Ò„¹µk˜4 m¬žé@x‘Q§ñ’ÐɵißHÛ/^]çÝDqzÜû:åˆÀw‹:I§µ8?/üŠŠg“,fß;¸æ*¼‹´:}r0Òf‚QþIrt>7ͼf‘VQ9}g³å3Ég7ÓѪ¡—ãtpü÷j>l÷ê\™qÌ+ÒVõù§åo°Î½OÀ@xcÌ]ÏŠ·Ié®7EÇé6ÜÜò{ÅÜ£ê?_zûànç„D_f·Ðþ–ök¥x—Ý®*…ù<7&õt¢øîŸÖ²Y ËÑÖ¼˜ÎŠÍ<Üà"Ÿo˽I³µým ùy«Ÿ‹ç¿ZI×wÍ“¢ÿrá'-í×[vöz ¿êðç¾é¯¿üOYú±3ä5}kê}ŽÏñ9Î+ÿçø¿Ÿ_ïϨ`¦Ï‡)÷7”F8j急ÀÒÎ-P!®Š‡p×±e-ãñ¯¤ÖÃ* ³ª_à…zãK¸„¯ªP¿†l=*‚œ«)úâž6©Óêý º í¾éq­)¡áM ê¬[ÊjäT à«Óz£>Po§"Y­™^Á,r­Ú^\à5¾Bƒ«Üý“¥Å™QÉ7’+º>«‚òÔ:JûºDuDL š`»2­9àÆõïõoÆÖþ/ð«·GÜ0iÀÕïoÍ«’ÞУ«ÿÝqa7cTV0­ºçuÀVaÝ-„q­PV¤0Lf¥cÕŽ¡F£«ÿ7y¦G#X¨líùcŒÍMÊË—;í±^ÉJ«sP…Rßàu¹Ö _û¶Ñc6: ªöª™Œ\ø>=‹»NG­µË4ÚÕ8Ö-@÷hµ)àe*LµØ>a_15bÒon5‚|í´òr ~Yª‹  §;ÀÁR‰fó åÓgåøÆÒÝ! !¬R†M¤ÑI0‡YÒÀÁ-èò¤_qDþ›ÆÄ`mò£×1µõÔÛ+mBMqA…òfKì)©Þì©Vf¦ü&u¸ŒÈiÛŸ^Ë´£ù•ˆ8E«j/|ŽmúF~Ó”ýÌà hÒR°aëåŸÅR,hu÷›Q‹L4 «Ï,mI¬|¾)%弩ؔ¨HÚÙr’ϲÈ\e—ú‰ÚÏ=gå°³/U÷BžüžÊù%ïÌm“—Ìä®™>Sg|êF0œ¾ÿä"¿Qý]9L/ÅSÆVÅ®¡Ã;(þ*‘¯ÀåYŠõþcÚ|#±¸™Ë”XcVûÙÀJ¯í {² ZàËW®õ_oŒo¯ôø¶žñÅ`Á´{Â$¾¬ÆØóÊiî`$†é¬Kf}K¨ˆ,¯e’òåh¯?’0Þ´ò¾_¾béµ`:肚·,:Gʯ§«0°µõzǹSü¡M‰„g¢=¿'Ô¾>½zv¼­•OÖ-k¿Áñóá¿óÁoýþæ/þóy¿ÛèúŸãŸu|fÏçøM €YÊJ¸@Úöj[¶<Àù&§‘ZêØxÈÆuµšÌÕÉ '¾.üg”Ï·íAg‹g’®ªËÊ÷jQ¿ ¬¸„KÀ£W+Ûîx]¾Z€¯MÎ4bJû-w·AxZ…~Ó‚ëØØ\¥ ^!í4N})ÖZ†¤~×ý—-=/àQùâR»‚¯Y£ÍEd‘’m$Ívt5bÓuLð2ïa#‹sUÂÖÐ’©HL9Ý™Îũ£0B1»ó<²níêy¶PÇ‹ÿD(äñæj÷W^H?½D»yàÚ›üÿ•Á»É4!ñàiYÚ $ÆÏg;Ý dtì¸ÿíT·>¡ývxæ[2ø™—'sK¡gõñ-HVÒ­¶,À>¹ßúÇ’þfàYïWF’ ‰z^¼3Q|ð‰2_Vãù»W™ì £òuõ­°Ðƒèt°6›AçåëW 6ïÀk~RæáË/6|þÙŠ;úßDéþ%Ÿ—Æï޽ÊÇÆŸrÑ>âåçøŸãsüâ¦0lÕñØ*_¦¢‡Qì«—À¯9¡V\EÙãµ¾©7__¸.ü‡¸ 5•Ù6øN A±FUæ ')¤•¥ß¥‹Å×,öœS à áHÓõOÜ» ׈“p߃¹_ºÎ +ŽÐU$M«Ô^}OQ»ŒÿÀm™èwýÑZ*yK»-î4o£ÎÀXó±D¿/ëÐTÖÏü&þ–ÇÂÂô”㲂ˆ—š|¨êààÿµ$ݬ&'¶CÒ+®vaÑõîû[à=Jža`»ò©,­ei‘eÅmûWyxJh….ðY_ý2ÎÝZOJ˜Û¿j¶‚eh…¥çâVCƒÁ¡íœœÆÃñÁ Üâ©Ûÿ¨£Ö¸UÉ•¹1›j{–ΗDØÉ 0¼šd ·ó¸½ÍIúæŠ+m e㥅{¤)È$kÌû‹­O¢¯tšæ´$ååBz„Q`³ñ¥uçÐ_:Ýžæ,B[Æ`(«r\>MDw_Öß¿˜Úö,ÊÕŠ54¸ ÆÖúS}•½èVQŽ”ç@WAìv¼€­ IDAT/[Ù§eäqxØtb¥E{¡½¶«Á¨îÕij©ŽŽ™‘°tx æ´ˆ(?-¯…›õõÆîÊæxkWB'ì++`w%ØJvXÜ{}Ri@›JÅL>É2èéOËfÐ"‡Ø;mV“âî%/2yXÃçX<ÃWt 'Õ=-F¶˜lG{ÓA`Ú¢ŒåGøšßßÛ¸‚—R€ËPÝæË„ÝiÓ/¹ Ö©ñ¦r¡Dëçö8xáUÀ-#É91·ò»ª×:›‹z‚‹COÔ šr!54ÊP¾yÔ7=Àµ¬4ìºj²f²ð3ØZ‘BApÅÖ죻k1ÃFÄ›•¿Xwä‰ÖÉd-}¢IÙ0dkdÒSžl^Û•EêÑwñr+t5>¶YC$å»m^6|À½ÚíƒýÁš=f©Db=u/¤ã JÚ°:MgüÏúwÕxþ©$8¬%Knšuñ\ý)|¾äúž û é÷פüöEø'Iÿßñ2~HÏ¿áëœNægôƾc¨}‡Æ÷®!ñÉýŸãt|l»Ïñ–Ð áá£.[YIÅ('Ý;ìöå:OŽ|Ê Mó"ൿ,wÿ@M®«J½ÎøYÆèÅ:…àºjEëÜ'Wó‹Û™ËµÛ?-#aøÑ°B£ºu3Ô™Ç;óM¤XªvrˆÙÏß-Ò€=eWeÑÃmýæRfé;÷Çž{­¦Î×Q_?ÉõóB­2çq§£É«·½I¢à«sZZ]þ¼¶½˜ÈhîSkžáÀíÇÊÀâ¥Ú”ÓqƒÞ‡Ñæ.ånÎÊåT°_.?û¸§ö­²Âæ9Ô¡ª—a‡ôT†ö 7TºÊèJºJ‹›Órnk]ˆØ:]¥âiì\—´Œá0q¢°.ÓÏÕ¤â¨ë£ƒdÕò·f+…¯˜Û9)¯|Ñ&kQݧª¬FçÊÀ U\çnI×~ÓV°ÒÕ6Rž¿¼í6g‚ôÌmçÙúrª‰h.Ð^måšnS2?ûxÚr!Ã" ÷V‰âVàœ¿4ûõs©êô r¥šÇýs(Êm ò9±Ü’lm+¹ Ž‡Æ…=÷›TMåçÉM¼¶ä˜ °¦áíTs§l+ƒÃ÷XÕNi:•˜ÙôBڨ̈́ƒWº5 c®0Ù¼JŸ©@xx)"uvóýœ‡1ͬ0\OwØÓ¥SȵPŽAïÏ')@ÞÄP›&æ0ßJÞ]K¥UɈ‡Dú{cÑYß±^ ›Ú‡ê¥4C³¨‚›HêoS(ßQ0.!ÀÜCÀÆ·vìöŠ—óâiÓ€Uü÷ŠŠw¨Äü¹BF4GÔýeõQ,f•ìÉlÉÖÊìM'TлŃ‹°M1¯¹N¥^b~âÇlgDìŒ0jõG:@ç6¶y^¶8wwý#û%æ~"õœ=dÛ—¥K 0-fb+YÁvƒª°0õ‘|âÚûœ™;m'ŸžŠÑ ÉfýØ[7RÙ!µht4ö †jl!SRpšÝo —öIrpþŽP&kÞâùGèGõ‘dÉý“Dåo‰Øÿ4Ý_‡e_?ü‰‡Û„—™üÅ_íçï‰~é å7Xï]ª¤ø9>Ç?âøD|Ž· €G×»'-g;ÓÔN:\„VÍ µtZ,ì¤WŒÌzuÜj©øÂ(Õùòœ jqª Í¥u Çò†IY´°æP ÅbAŒø+Ï•¡eÔ ÿwó@NÝ(W?+MP¾QKC7´4‰/¨ì²u!®},¿u” ÆœƒC0¿> }ÅÖVslöŠÛ7· }ÁK+wwÞ»Úäo¯æXj¡Œ[ÓaDCS+ÿAyTˆ‹¤#{4»ãiTÔÿân²í¬Û¾º¥QÌ×ǪÕsëÒ©¯f\ã?¥§ O„KñUcöSÿ?{ïº9®ôˆ¨¬=ë¼ÿËÎtYÄùÁ[ܨTÚ®®êîÔúÖLo—© I1 zDhqC ëé#´˜£J…Õ®zE–ŠŸûf[]}EØj”\k“;„m fgMëõ<:™1iÀ‹é™„Š,žÖDç´­W8Eê¯í°æi.Êp^xmh~1øw‘'•ŠÛÆdQhˆûפíÇݼΎ,™–Ï"¤ÌÙ,‰4º Zå‚;×ÚÿiÐX¬ÈØe´Ú|ŒÕ(®tý¬ éܘ“8áóÂÊZ‡‘6¬o#Õ2úçÛù½à,&*V\üµî0P¿m‘Áï6˜7–FïGÓJÕ.Ó˜iÖ)µ`ŸòêÁ©ˆþã.,+¶f1Q¼é©aó‚Ùr§P‚u MèT’$ð²54j”ß…’-w•€Kx^ëˆ}ìwê!žð”LŠ»¦.M¡½Vµ#^_Ah‚@!¿-.µU¼ yªÝÆÓQ§Xó¹0xå3ÌtXžiíx‹ÇXç"æ96,É9Ò›+ÀôÉZ{Wl>-õc NµLÁºÿ-Ǥ(¥W#JlGí$¥­ÙÁ²­ÔÝ Þ2jí‚ãfª¿dêwM ƒ-x.Ew gRWÄl±¼(¶iV†ø-œ6ƒO6‘6ž]ž¯K†è…ô%ÀµœÝ·y£˜»iØ´ˆpo޵w ÃÞ/Ò÷\ãøÔÿ¶_bk´UQ6>N¯À¬_ÿå?3ºÀ‘qoçðl›_ûó šÏ|6“.²ß\Ù ½Ä÷ñ>Þpüûø—j‡Š9ÖiHme±ÛZÇE–QU+昘o©[|PÍZ½ÅçÖ%4^V²<%J¹¾bšý¡rb ŽK‹²ä½, ¸Œ0è”-¯ûÒEú:س@Ê£CušMû{[ˆ¨³œñ ¶^O¡ˆ '% ÍšØæ\eð¯¬á€3g€P‡{S0Ù¨ÃÙ´Qµ/¹E 9ox9;Çpá£ç¯Súÿ_á9x£"õ!xŠàòèñÅý1ýù!üÑÏ·(ë•YCžCV ƒ–+Û¢&ÎePÓ›Z2°ô“$:SÝøÒØ/.ƒûÖýPµ§SYÿ1-Šú+qƒÞaSi÷§cå]PÚ èš®d¬Eÿ©|hi'ƒ­#ÇDé¯ÛE&‹uï)K_‡¯W ZsI©r¶~.g-¤rc${S10³ÖC sÖG) õЬn¤ÙêÑúKZR+ˇà£'iË©š`Ò/Lè±_cY,—‹ßp”Z~x›ÓU©Å5 °NŸñÔWZ¯Æ¶–îM¬´Å:,#h0ur¦ÊKtSÀ !.lV Uò©ØÅ„>c@\r{*<Œl“rMI5‰pààü»ºþªnþʧÀøboŸAÓ#ò|w™ZˆPQhâ=uˆ,m¬q|}†f|ÏW-24‘Ì8ÍLl¢°²_Óo+}EXSÌ W?äîÕÜÞ¸ IÉ×í¡±ÃgWlŠ{MP¥Ðç#èž“wG„Íf©1ýÜ‘1>Z|oPòR`Â{9'7gÅnV5îOi¹ò½¥·Ç¡qD1ƒÁGqcäå Þ¬W–s ¤ IÂz/Ï\¿‹¿_õˆ,3z0qÀ‡_ `“¯+žõa»d,\4‰‡Ý§}¥‘"IBz!¾ Òøzf«“FÝ5Bmá¤.ö…»6‘xö}¸A‚JöÄj츖ͫí&»µÊÏz%rð:XÌÑ*áîã:wZ¾ ©þƒ„©ôw`߸{bŸû`þʳûÏý¢;âíÿó>ÞÇûxÿFàP -¤ð>èÀú°ãÚwÅ$RjÿØ@·å)}/û˜øvDÌ‹W‹`„劲Ý\è¶xýéÜÂëu…0; \˜X»ÀRäqˆ<ä,–j¦Ýú¿ÊǹpêV–¢lv(8gH)u‡Sð>ã”5H ;¬DíoKÍËÐþÆçÚgÀ–®œê¼ÂàøÙ(R–B.c–ÂÒ£n1|™Ê!RE>(9ØAíI)”*ø"‡à”býÖëCx°Ì¤²ȇÈ9ûSZU­»îæ·‘S”žš?»wSû¡<«ÄªÛ5‘¬;VÇt¨Ý˜hBT+wŽ6uPÖf †1›&^‡áÕ ‘ÖöÁì "¾MDšlOÛ ÆËœVTËé Œ5³8x²) ä`GÊ ‘jƒûëÑ7ë¤ÖYRª”Ú鳓 ×Q”¤ê® ,x¥* &f²¶ µ;¹X™Õ+3 ’Faýá lh¼P­1âiZXŒsÂDU]‘Z^•kÔ­Ÿv¢ž#ﺩ©íèw°©«WcÈæñŒNô4æ`¢8W¦pÔÈ©¡ÇCh'Qc›0 éD(œ{ ìV¬ö”þ•È·­¾r‹þ‹¥‹X­Šµ.#Eg5tù .‘$®3e¢—}^ÉAaô10Ój™·±Ã À q+ªàIÿ8Œ[7 ÓRÛ¬[ŠÑ’è¾âCÒ‘|ÿY<ƒ„Üý3Âü¨bâ»ÅÐÄtP§ÂÂ2=ñ<÷ÖÔÀs³ƒØŽÕô"Ú,‡ U„vI¼Dô|àž›¤·ӻʪ>”"³E´3ãQÒöòŒ—áE½o¼æKl8<¬ ¡¦l×»±t'°ÜöW’ïf²ÌÁ3ma}Õ.09¨FX TºÆ.Éòz}Ó&¨+c|~T1Bx½dꔆÃ3dtëõÍŽÝiêÇU¼+P]ÚŠW4žo¼ò.VHnÖœ¸fLoNg¯1]\½ؾFo~&n.ª_`þMÇç.7¼ ÒýžÈÝ®‘¯³ÿµã-a~ïãŸ2wÞ³õ}Ü&†™I³zo ëªäÿqd5ñïܛ̋=¢í~Ÿ—OÖý¹¹óÙò÷‡ì®ùü¨ÜN\@£[вÇU%Ì»W+èȶ¤øìOÌ"Ž£¶š ’-ÎÒÇLÛâó*ܧ‘Ë…O¼5Îõ_DM$ xío¬ÏN~zël“Òi³gh‰´|žÚ6 2¿±ñaµ…û•î¡&²é)Ñ4BÀÌŽ(¥½.x:SO†D˜oo;[H îüÏÍâõøÙYÕGÃ%û¬=¯?†šé5ÓRµíŸõÞžð÷3YÊôNáÑKòì^EHŸ{ óÙt ãŠxÈ—4ÉŽ·PëÒS÷¹_%â“¿ÒûªCηµ>ðå?¿ò}ëÎܤîßFÜÜ=þbÎ/>Ù÷ñ>ÞÇŸs¼‡ÞÇ ªÚÇ`øÞhk YNô¾SxZÛÓ & ë0hmd}ûv™è§ö¦À²CYX³µ4õ–´yú]VúØÈyœÎ*â‹êþ]E9)E~žòqÊYåüÙuÁMœ>uè2> Å೨‚S¤H€cSLk,¡¢5eˆ®DÕ–{Å*©iãÅÊ*Š¥%*—}P·m9û™·Óë7°ŒzX7Ô×…­Âu†¦rô§”)‡‡”æ¾óù¡žšñ?Tá)2Pþv†Í€¥½f‹€nSUeº·ÏêñV9Ïî©RRê wÅ)”þ\ Æ{ « 㥼þ¡•Tà­Þ(û„:ЭÖÓQ§®‰€AMÖŠÖÄ!Τq°•PÝMÜÓùÂ;Š¢~Ýd6(äPì!ø9’¦þ>úÍëXzÜq±þ šâ*ãÚ?§àìa ˜îüe^-G¤¬CPêÙùžBÅWÙæ˜)Ãô ûù~>uDD=vB´Ãׇ$nž:hd¨ÚiÁ\v»ÂUùTÌUË›t8/ÅäÌ@d8 ýû ëªóЉdÀi1 x¢‚6Ðr`7­€RÒ&Ks‹u'u!í¬`ª#Þ4?!I"¨–OÖÌ Áü=$=e•U¼Ñ¼0C$£Ï3dAcýÑOC2|-&ñ¾ì¡eµkhøÉ<5šêΊÆÎB¬G¶ðª¼‡<áĪSEhÀ­®nÆ…La5CàÖæØGnªg l´ºö/ ŠêÒ‚•MJ\-c7X†ƒÓsiòyä·è^övDäe×ÍrÛ"—PéÓ+‚ÌA Šô•B÷8Öœ¥mEòÙ¼éÓ´G‘yÒ€iä6[ÁìOÜ")bÈ!O\Q¿ÆWÎÁÖ,KcôÜÄÚ‡kwÉnÔî@Þɪ¨“¤÷LCX ŒcÌ…T¼†=ìÌKù Øñ x]ù@¦tbáÆ<µ“—ãˆgˆuÏ46Ò¼š®´+?|Ê7é’pÕ¸´åákˆ!Ÿ¯ÂO~/a¸a»•+ÏžTÃ_ŒñÿŽ»WA)}š¾xzZø†«{rM4=XÉóÙËú·k‡ù›Nã}¼7ÿ>ÞÇ/'¦*¤¿9g,í=Bí)©­c•ꤸòOí5:ÄáðPn¬ÀÛžòvðb³•šXOµÞR0Ú &™`”³›íL¤ÏUGG•ó”Ú¬~ú_f…ˆåOÚzfö/ EP…¥#˜çð*V4Í\E« Äp“€ñˆ–kÊôÔnXd•=haºý4Î¥ëèë8Ïåà„Ì¥bG‡!rT#5‡ q$M> ÖKééÇl$Ašëª¬‡”u¾PØÁc!Q92š(þPU_]-2Ø*'…ðX²_4xºJm4ÆwþCLÃÊ,ÎuØõ„ø«5äi ص&l$ƒþ½†¤C±·A¬¡bçc¢„àÁâýß=òBã£1³Jýù¿£‹¥vÕ<ŽÞEQ§¦‚ǰ“R‰¯+b¡¬3,cTLší¬#íyôÖÈÈ-—st"35Zß“öÿ݆K£º=ïäry2üë'çÿ ž˜-\L]ž5 ¤ÆÄ’NûÐ^˜c_ß2%šþdíÿã@牕KçÔjPD¿1ÑßSkO‹c¨­ùƒu'ëPlܨÕ3VYm7:Òè­jf¹cq.¢Ñ…ÓXEݺgGªQ¡úô…åêìqŽ'Ž)Ùó@²˜ˆêà6ƒOw)Mk©õ,Ê>mXµ4_ƒá"¡t‡C¥Mè>l.Ò™iý|¹ÕÆ‹R=“i‘9;Ï"ÝýÀx&Pù¨)ت,Ý+‰,r6ÅVÐ2ñP\ê‘_ç^EXìGÅ…ܪˆÏ+öÜÉ 1‚àô½qæï'~ÍôYZlÉø§ý(?z¦ÂcÂÖw {tíÁln0µaýTJÝÒéä>áÈuÉññõ¸C*/t80CWÊâ$¿2K:äù¦~Ñ7ŠRkßÀƒnû5ß&ÛØÛ¨——ìd {ú4©K†Ùø;÷º’èQÛ ˜/i6ûFïò‘êÜ‚ ú‹8H~JÞ]Æø®Eþ¿œ(ÿüùI¿ßÂ_àø~öŠÁ‹œÁ/! ^ýÊîmãßzþ&˜ŸÚ¼÷ñ>þÌãÍ7¼(”žˆY±Ü0ô[ŠÓ2U‰Fî`&˜NÙócŠ»1ÕåNRª‘z®å’á*¸ö7‡ªâhå0U“7ýÆçì¦ÿç)gBŽÒ @ꀀWêlÛvÙÙÄPjgÚùW‘Ǩù«‹/ƒ²ÚTVžR†ÜÕò" fiµÄ!EùþË_7qt=VRÖ®ÿâ’ÇrH­Ù„ùN–7ýÇ{/ô ˆ®ZW²\-UŽÚ› ˆ¬Â¿DþêÐíd,˜ÿ¿ö]˜ñÎI<Îñ!e‘F-r¹*6¨ýOÂxîwU»Ê n6;ÆD[£ÿbÌH£òF¦ê­èëjÂf«<ÆÉ¨áÝÝÆ9ìì§GéWçx²|§à–èêIÚ¬o­g_—ÓþÖ†gàÃy~:GÞ2»0Ý´ÑÉQ ²þ(x´dpáÁ~£N Š| ûò×BP°x;)rb-J2³gUr`gPÎN´„BêÑÍÇfŒÐHþakž:Ÿ% ]4“4äüÌñhì‹n P™hÎuñLU!AÊËžHâ*£%´ÓiM´Á·ÂÓ ?–}ᘠ½šUÊ9¦FZR:sbÐ*:˜cvù`elÀÝR%_´·É$PŽÐÿ$á&H~[ô#fvÃu·Ç:tòúž8?}s+«]…íûå‘!ªërªnÂÝÆ30&Z{SµÙãCæ½ ‡+ï ü¯jÝ´ #­Ø¡VEIþ a¹0Ú÷• /|ÅÁ 7|ºyúy®±‚ñË_ä„Ã2÷†YÁq ‡§·¹E•!{¬ÆEó?~£ª—»d†Eاƒ`õ–¹ó¤¿k·ýL,l¿fLÎHò}ßrÎ߯,îB_ ¦«!‰¹¥s9cµÓß‘Á´6JÑb.Þ¢ØAµÃ@±iOéÍVÍ”À%¬yѽ7LsL>vhv‘rÅ¢ôj1-ІútªMp éˆÙï7—’ÝàDÖ)‚+;\‚iœ²’í ¿ÒsZåíó´}Ÿ¦UÝ$¸G|]»Êû¸2^¹ü2KñzžïgˆÆÛŸø§av_6Izïã}üž™ûž°ïã@“¹×´”Ú12ßäXTB)¦o%±l¹Ô÷ì-&¥AL™©J—µÃv®”ô&¹¢ÂÄt”Õf¨0‘¼tióGÏþвßoû釱LѦØ/.U"Õx‘ÊäHyS8M µ(L–>$pî•JÝQÃcG;k7t“„Ö#[9š-ΕuI¨Ôc H'žXëp*RkòKü%ò1~_Yœç@á±²ˆ©aÖc á é ÓÐ?xš—ú »²Õ-´›ÈÙ¦Ó`Ü2’œäßžø³ÃW ŠaǪs½èÌÄÈ1^ôRl¢æå«Öw½5“!aCûi´’=À#ºjÀ`Ö?;œÉáB9«´àçCºkÖZªr!“«@äCê<¤C!(l¥+ôËà„F±Z[yPÀU­Eƒ-àCê¡@R(a,‚a vÝ#’Fö r`aº4ÌXu™Y#²èŠ…GMÍè!Öv’e|~é>=}!­…_‰Öݶ>\‚}ú¦¨µ,kXŠ–]PŠÌ™ïù´ÝÐɺ L±“Eç™ëÌyÉŒ†‹ŠÊê^rz[:CùñÿVë˜Ü¬™ªäéÁæ|bé“£i°O$ÌrËùy,ÃÞ·ðiøú9o1+O£óohƒK@¨Š0ÓNîÍx!5Y®[Ù~ßv¦¡¯ Z´qþùþ»Aš' ßÁì|"^ëÛu.“Œ…2ïØ"›Þ$Šv¨8?:z˜øÖ—fÞw`¸§ËÐôæž,’ • ÿÌ=3LÓaΈ³›FîÓY,mtß6‡–nFØýdlG{ óp3õ*G>˜Ø£¦ª(H6íöÚAC0½ͰÑ>âôŒc’›Òµ†¡Hõó“$R$PÚkÖçôÂ|nx |W#Tºyf”r¿ï×ÕkýÌÇ.÷Åuã}¸è¿‘+FO×ö;wff‘Þ»/¨Ø¿ >¿MB`ÿi°Ã‡¯p»Ÿ8îž2^éæ¹O¥ü² {aTÿÁh®‡ØJ|ïã;fÙûx0P,f]å <(9Ej ‚'[‚ÒY϶h®¬ÅUð‡la:;i»=}±¤=õ47Ae| …ü®_ žÎS®¾„½e(цKLm0ý1\þ•ÙE—ÞÝúŸCh/ ¬F3ÞÌO*Æçu]Ì $ç¦ÐLÒTA§>œ.ä`³c5ªs6”H:‚V;˜†‰F;– OE”þÄ÷ùŒ&¼ÜÑÆ´d»è3g#¼)‡z}àæµd½/ú©!DŒìjFðk <¿ÓȘ†˜·á KЯ!q…qÎ1èÛ;¨øNnòTC³³0[bcè¡u'‘wq‰µ¸±¤êfn§]"EÁáñ8O Ä{†%|q ¸(¹¿ÿÑ© ÖùS²§+kï*b>ß-tngåÈæ÷8hÖŸ-Î¥öW~×­u¯Ž¬@޽šåeóO²YÄD|ƒ‘K¡Ø†ªù ʲ™2wæçgÁKÀôS§ðk$øj̯ÂÌ—îã1ýÔM{xæ,„×àå'l_Ĭ/^RøVž—:߉‡½€‘ñ3÷àw~Ï{³ðûO–;ôÿ _¾÷ñ>ÞÇ¿›Xúiÿ"fmZW§cxßëïD*KOd¤ŠÔj!6›%¥í´rV¥šâÎiÑXO é³Zá´˜(5 ³¹!—…hã 9«œw’:‚Y=6; ûòæ+"FJA»ZI£ÀšÂ¥2¦*Kfµkµì*%X§×åsRMûLWÆÔYÃTSÊ=½Œ8rwûI7'—s˜5Ÿ÷q¯¨š$T9zR„òƒ"2hI–èìÙK0.|>Òòv>)E¤ÅThšá4}ÐÚQt&÷«Ýf4 "¯–Òe•sYÕFí«R•¥j]äb=d û0ª”vEó©é3Qfë¸3nÅ?¸D¸YËÑ\ öàövÞ¡þq GKÍnSa^ó>S×™e$Rˆ]7hj™Í:ʺJF?{^X<BZÇðÐ& ×Ì[fÙþãl<‘tÊ®C9õ0«$ŒHÐæ*Ö‚ˆ«Éöh3´ìÁôÈæÀñ{ÂD]¼N_Ë;<èꇌ!˜CQ}="~ÿ§SÌ-Û­ I½6ðŠæÒæM(‰ósëJ´`AªüLºn VZv'¢KÔ]I°A…¢YDtW ÷€óèNs,„ã„øÄ«™*À6jÿódÈ`þžßdªu8D(¿€’àI5žF˜Òæi'³þ¡ó`y…–&¾:Ì1q±¼Ëîçµ®â@>˜ý´áŠ—¿ÄÛÎF$WÝÒ*-DB ­$n6Kºñª<•{ðë)F¶d©gá3˜éq× ƒ;3:$R&²Þte¼¸k…gLŽ Óž¦ŽÅt˜}øSŒ‡{]¯'0¹¾s_‘:ì'Œ̾Q”ùO­¡úgÍ)âãã Ià”ÁGÈl™h®]Fõ¤ÆÅÚ¸÷æò16‘[“ß+*¤MŸ0§ü~cì>6ÖÈ¡ÀéNÿ'UÚ9ö«· OÂÊøkÈi`õˆ”†l}Û^“ÿnÐ>mwØæ.ký]¾ü»ø®ÏþJ,ͧÿè×¹áüVpý‚ÇáΘë}¼÷ñââï×½ U•sM'ËntS¤Ç¨j9ª)r€¼¦ãè!¡Ø…éãY×kF—ßk“]F‹:6í†97›¤1 Ú0òo›5ÍtÀœÎ3P©¡+å=Èt~×"د¢ˆðÔmZ¤J·ÊY^\˜©ŒKӿϵ_—yÇFÕdoΊ«×þ ¹Šª õ® SÎHÚ³*ü¢œBFdP ³€l×R•й0± |¬*K†ó{cišH×f_m.± 𤊫m–)³èíÈ×a9’ŠÁe=:sP‹ÔSX‡Þ å lRí¬Yܰ´¨wçÌž¡1›47 bŒª*³ç"KÂâ½8z³ªfA`2”æ°ü™˜Lˆö9ÚËN‚#ˆAfw¢)&2äÂ^Ÿû™äâXE|CÓmÌ3ÐíPtA»¢^jnºáSñ§L¿:µð¿qà X‚bU£7¨þ5ú?yù"~’2þYtdH÷Å™ÞÇ'^Uïã}ü‘ÀÄÚFǨ–|–Y™!»QÌÎWEé {KX= G•‘Ìy8Pµ(€`#˜*³Ï@雄%ÙcOK(íœFà* ‡6§KÎŒ*TyË'¤.svQrþåÐRB¹Õv0ÒM5è¯Í+´“ƒÉRƒ‚w¡:†´\ÿÑ<^(rÀ@¼£È°2Ÿ¶m8Õ8Šà졽ë¢ôJI†™OÇÝêP3¡³2å90pŽÊ¶¬¥Ñ:ãLÒ Ñ»%½èÆç`2«MìÛÞ×øðaŽ` ˆïGqè`?ÓZaаIÇá…"ÚM‹‰Ú΄R9_QA™U$¸‹¨Sªqh©Æ…ž" ¥ˆªr†Æ+ž®yI éÔIJè«öá"×” œë±X+mšÏÁ!Û3$m"T­& uÒŸÕ(©Ù‘ª:´¥ÃäçJÇz’¥ e¨Þ'ú?ùÎ%«ºÆ]ø3ðËôL@ÁügÍ‘€k x®§1se#‹X8z›œYQP¾±6²kåQ±æÅ‹úÁéƒ ´Àv§æ¾¾å¦Ft–S0_áq–@Ò8øRb³]ø§o; s'ÓÝE\ÞÇûxïãCLï@©Šº=µí}?Z‡„dL-øÙ}' ä€E>  ®Ôø Ñkòê‘‰Ž¿—ªêUú¦“t'Ê,{ "sì2í*R¥žrž"§ >Å2i$T‚œ>ï9DN ¹:óßv5k²B În ˆ< ‡ðó6÷Öe\¾vùì1¶=æW¬±’øþkDcÖ¬8Yæ\ùÄê-ƈ\ú?¿¤u©WW8ÕaP{{" Ù×Öe”ˆÓ[©ÁCx ¶F@ïÂAxOüY>•Ÿ"íTaðjH]gNTÛ•bÅù-¢'FŒöüª³‚¡jïyû&ÇVŒƒ°æšQê]Ö<=ØÙ˘ëÞÔ-‡1KêõÄE±k¨-]$«»dŒ~³$%d¤Ï‰D¦Ýÿ\:z§•Ên7E¥Q­¢’dIÛ*;õÒ¾ˆƒ¹ì¦7±„ òA–E;EZí3C’³Ã‰–„ô#]ì_W@Å$ü´CW €`¡S­ Ž)˼~Nf#>u ÙY-83Õ†þîCÁffëïR+©Mɘ#ukΊùå6¡V¤Jû„s±M&ÿ\!;pë› QOÁwªÖ‡¶<) ã¼Æ¼¥¶w‚ô¨¾¢W? ³û<5æ.?–¶‰d17bð/¦þÄôáªÞÆ•ì4Ūf¿¹z‚“K13«ógx)ÿí:Ü‚ÌhÃÙáP6ù}ÑX¶w˱Â)À‚è^€2ãåOv„ð ^3¦.V~g•|Ë'@¬ë¼N¬œOOÐ.øa&Î8%q·×nÌ•:ÚØTl†lU]b 쵬ÿ,š¥`¶‚1_60·v»)v̸åK­oD6dÝÓ°t‘‹A6nžÔ^çkS”t‹çÒ 0Áþ\[ƒvù»V˺Ðý£È~skÊ`]8üýtæDïíco•L%‚°&2Κõ\ôbÈ-ÆùÔÀÿ¾4{÷£ÄÐŒ/`¹¸ ’? ¬ÿÐÿÅçð…¿£ÜzûüZ˜ýÕ°‡¯ ª/>‹·¥Æe Êûxïã9ßÇûx…%R‘æyϵ•Ù©³t³é#À@ |¬°CG›ûÁ0“GPQ5oÓ:Üù›'F…Té§aЦ‰ÕZµÑDÃVœŠc,A.Ú6ºJ­r²£oSÓÝ%½ÃÄf¹ñ*ªþáÀOaÍâE+}VR¹ ¶Šž£[)Ç)Ç‘zŒT-½=²á¿Ã!½N%xú;M.1FévÕ\!íþ¯¾‰,ƒžÌÏé –'(ô¿ÌÀÒiõÓ›)”iRí#ðœn!EIÂ,;ÝäE…Q/¿õÑ9Ába [‹ÒâLZ}9ËN¥›fŠÎŠ}ú‡L uØÈÓÉFLy¾Sõzøu¶JÔ0&Ï~ÃÛTZ¢¹ÌI@HV¹ÅÀ"ˆq›ÕA²mú”‘Ï<;ºã–ÊfhÍ7-¡ákVãÅóöY@9!§Èc¸B¡*§&–­'hP§ˆ#°ø²yÅØ¡ç] `ÔÜþk!{'„—ãÌŸØ>Äx—hy—ÍLôÍF0›[GۤÈ÷¼Ýú‹¨2rüggD w«wøNêþXÛ:ú|$}uI¦/œÌvõ~“þ*xÁ0[ÊsW\¾m(ÙÖë)ŒÍ¿¾ ð ÈõMxú³¬Áß ]Aþ8Ôù%šäß¾½1Ä÷ñ>¾yYû{—¬÷ñ>^$ŠiÏœ±y-Eäò³ÈY„ã”rv”Y±CÙÅP å1ÌWZng+¹O‘ÂÁX‰îVÆÀ VHk$Ú¾´Ô`AŽ$JqÙ€ŒÞ‚ ÙWý¥Xá–]b|Nb&k•þOKE®kÚª’ÓšPù-#”‡àãÜj—HwÏÑï?K÷Q¢J`ûýC/ô¡âpr´ÊV7d 5±´|]®-r+ì«rüL€(_TÎLH=41º.:T:ú?a‹¥'­‹YéŒB‘ZŒñBWøŠ…¶§/6ŒûÓärf›•³ÝÖO ÎÙ{A=¢j‹Ú«ß\ªa,iö,Å«NW…P|W¸óÜÐðní`ú´U) tæpÔ©{ñ«ó b^Ò²wFO´zgjf± 3•ݹÆ[ÝðëJ yA©,‘æ¸5ÖŠ9¤µs 2 žÖM‹7ÓDõ£Ö7 &®™3ع¸¨Ç4 ‘òfvgsoÕ³ƒ¡ÎÞ$ú‰``%z»}H½e`¹bh’ fy°83:GD`}:O[s3Tk,f„»¬u]s)ÖžE,‹eœ­3¨Ö^IúIZ ½Šå3&^#Ì úq©±ÖÍÁk$Jm‰DË>àx†ç>ÃΡ•K)ãÄÍL‘#ÿŸý :ÀZ“™ÐÔ;nÎô ÀTæ¤oaáõÃB°Ö¡¥ax£ÞÞ…ø–N¡²l"·Ð9äYüÀþ>'í)pw•ŽÿƒE“m˜Ø@æH1š~¤ÛYв[uÅ£¢qT;Ž<õÙCœ¤ïÍP&ÒnYž|]tùúúΫé?f7ƒ{Íi¬´~<¢á$Ø*͋ܮE/Ô¢s¿‡+ ÜŸçØCö+Ì&|‚¶L[ $¾hÄ®H<=™¹‘c`6Z³ÕÒt¨¬#(3@*S¾dM¥-²]«»½·²m™»í¿I\c®Ï"a> Üû3>ýåë›ïuøB÷à ð$8_:kþ2P싟Àù_ «åñ?o÷ÿ÷ñ>ÞpüûøO.Ò \2ê.[ù!ä¡ûR­¤B*"äQ¤Â"õrvªT9F°"ájiÊÑàK‘ŠâÈpÕ§mƇxd VÝ Œº¶Ý•]¤L…f .\'"??¹(ûã)ç·¸´ð?øÉìØm¿YD~£*«R~JýV©§<0™næ(ë_«tJvŠMð£I‘iBRæ§åä^ÍÝè™ ãh[ûM6&UGó£Uí© ÌÐàìÏ "ò衾D;=¥w,Ø}2Õà9eh¥¡,ž8åu qÖ¡¥.¨‚Ê2h™/±´¢àÝ ý«Ç¼ ó[LîlÚ <‡á’HW®ì«U%jzŸ‡.iÇ•—ÕmÀ})ãKP0z ݲ¶l„Xêyý’¹zZûNgzêZ 0è.gמþ0 :_BUsÀ°ºuÐ öõ¿Ö¥aø‚œ´#džjê8ëBÏ:˜ ¶^N­#„n›(6ìÁ¹:™V±˜³&lPë¡C  #|Å[ M8 Œ%E,­H;´†Î`;‘»µšÁìÆø¸xd.ÅmèDâ=Od$Bë¯ÃYÑaõ„Ýé`z!À¼Îœ”H«ˆêœà]˜uWž‘OLÛsõ9sâQ0óßÊyÉäÇÒ–ú00“¹®Ôß¾îÛ“§¹jSûfbgXñ5¬œ›GBÉ-Œ™:,ÉWúôt.€ì :—,ÝF †ŠÖ0îÆeôI¿±ÉÅ 'lW³yóy >¦‘ž|2¦™¡ÜM3q2b}W$0ïÜh@¿»M­›S$,¹%üš …R{W*ÓÿD8üÇho&w|Ym4·¹ àÝüïØö†ÄîÊžíUXàyÙÅœÌ 2¨5-¡–ˆµ:ÂØ£†~ dXÞ-`ìÕLYs¼Ü\¦À%çl´g¦Hpð~íàæuÅ[ø'±xïÐï‚S¡æÈôúoA¯ù„’¸Ð¢›à!G¶¦ñkãö…òãÞ€ââ~¼÷ñM½7ßð>þ@ùZ¬>€é)9uÓ¥ÛøPä,J;¯¼ƒ ä„TJ-Ýúã(rŒž€:ŸiuҤʔù•…Î4ൺwùÀåá™Õ}þ¯2P-Zgöæ&_iPûbõSxÑ ÃÕ0èDçÛžæ×bžè^û«A¿£Ž*Öþ½e4@4J@jCèiºÇÒàë3„XWцðʘ(ŸÙúP;ZzÎFf¶jÈx]ªÐ"³c\ÕáöSl„,ìZt¿…g×ÿʇ”£Ó,òÑz 8{4”;­H­m·¦)RŠrÌG¨lmüšIbÔöô\Ý5ÄTYÚ/†o&:SWê×°÷¶¨v™7E²{uF7‡÷,²¦=¾óR|ûÓ¬£#¤›ü”~‹ÊÏ1ÙiÛØmðfï(kT@IÚ[TÀÒÿE(*Ñy×À–Íóùé4rŽ+ɪÑÇ9ôŠë‘%(ªZWµ}¿¯ða (4§¢ç—ä6èÛ»3‡"hŽÛª×+e ‡ÀÎk‡ýYÈÛÁyI(ž>UÎ×3v¥Î'5›`ãX!Q͵𺲱Ú«}Œx4 µè^Û‘ƒÍ‰bçŽq§‡;àìÓÍèÑ_8çõÎbÞ…Â@ d¯ƒÐm•W‘_"€Â K[+àÜ.Ï.1y €ÞÜt+s*x÷ùgò¹Q¢sæ›ÉÔÍÎ/ëõäÞSæëœ4>…Ú>Z嬡Ÿ ûj$“îÈ_}Ÿ¾«\!â‹¿ƒìÄyºp–hñ^ýñǘËÓñs¿à$ðG+] ³°ˆ¼Ä÷ñ>Þ|Ãûøç³Ü†u:Z`øö”é¢Þ|ÆO¥MÆr•9EX¥PŽ*?(pl*Î$+ê[f¤0Œ'éQÕa#Ýõ_ì4 YT9ŠÁËjíªä ý –¥Ò±]R ¥·ÕöÝÔˆR§_ͬÿ‹±Ë€õ…†Nªà”ÇÀC?¤ç¶ujRê@9eÖÝ8å”úרÐeR„åUâð} ߊù(0,w $ÌNƒ2©‡ó²tc|_üž c‹ºc¤Êšnbá¡¶þ!ø!ÇÑ]§:Y2ª÷jKÅâ ïæMßN»¬ª€€–B\{jSÁaŒC㇈K·æ_Y£4J+¸VŒjÕ…¼Bƒh [`M·€LÄÜúŠ˜•ÀùAÑÍ$ê£v¡n–µpØáNÓÆùœ,Öšü°N,b6Ñm²Î*ì~îÀbF¶"cËù‡3~VÕÿ ŸÒFf^gEL›TáµlJÔuÂÛ{¢Kû<ÀOI©ø<#ÛãsëJÿ3¦FXßÎ7&úCñ|+—B¹¨SsQ,FÀ¿,t®»M8X¨ª–‚]‡Û¾…#†¤ù]”¢ tÞÆu}E0‘-^& Dê4uï2iüí°¼G³G"˜4e›Àêë‚ ÖŸbN‡PŽ,Er;4Ay"ÉA³Æ"†Iò °`F$X-’gš€\œî ¾ HvÜÈÖ~ Óáÿ}¯š¶o®€oŠeA”PÊã… ðÌ–GóCT %Ë_+3m¤3k03)zú9¯â‰âu¦kãSýç›dfÛ“G*ŠÝ:î.ÙÚ!RÂÏm#,tæ]œI€°À[ÀIš'¿I²MSÇc8­ìQþ{ò:ü<íà `s¥jç³¢¤¯ÿÐ2}„;À=FÓlêãv`[ d3—•AXù87u0·¦pÛ¹‹Ív”W.ü·@Ó]–¾—g)vŸ½¬ÜÉI®õ[ãM'ÄwAÿx\‰û%ô»oПv£®8 Ú:žŒíw6Àûx¯Î¾ñ×½ ‘/\Nª÷+€<rþXÚ^9?jrnFë)<åAù‘Ÿ"'„èèítºWÉðð&ÎÍ2…rŒÔÊKwB0 mp9Ejí—69¢°¹Æ ”¢¸4­M5ÛIa•RåÑÀ²2ì)ªÒ Ş뉲U«ÙggzZ²[{ÂÑmZ|±œÂS䣟^×ò‰þÖpÞñ4¼ÌÀAWÕÀNº’¯éS—\7òL±eþ7ÔBÅ3üœRN‘ÁIV”Ÿ"‡ð>ú˜iÀôŸéî:GGë6#…Ò’*VJDíê^ÌF;+ÆIÅP¥º¼¼Óì¿Æ|€G’d°qˆÞBÿ »|ÍrÁ%f;!/—Þ$ÞˆƒÖjß«te­ÛL©Sc!~þ«G†íÞAPx»dÏnÅÎ!Ã৬/¡K!²b·X=½Lײ–œŒ’/>lÇ®éQÛÙï~˜ZÇ`ÿÄÍÛóúîÑïÁ棽™E©³s–6]õOÀõÐèø+u¾IŒsM-’IÃF¦€›¥7[žl²ýRß©¹Oô°ÞQ·sM=ìæYo“úOìÛg½.EQ& tE„àñdHÏ«RÛ Ipé3½9‰S7W<™æ¼ýv0Vr7ÌàHî×܃¼ñä¢^Mýçó¿+l•ʹ IDATç³½hfs÷ò3½}MøÂg>e&|ûé/â3ð™sûŽØì¯œ÷ñ>ÞÇûxo’š€ ï«ò£Éù‹Ô"Ò”¿Õ*Pš"þ£ÿí£ˆ@>Šü,ÈÑÌ@ µ¡9ÊœGT"«~‡•¡ÿe†^Ðÿ|í¿CB 4`§$¥<;?!UÒ}ŠšÊ~¢Õ°– ÝÝý¢ àƒ*+¯x†â&rN‹GK5^CËíË£íéÏÖ¥{J)RªÈ!ø!xŒ&ƒ*þðãíÿó>>O0è7§¾R†oÉĤqÊñ¥”Ž·²,œš»¯¥cÙ¥ÈããèÒì;a m‘µ»úŠK#>uÂê¾g«v§‹loפ¦?;>{°Gב£cFͯ\FÄ(G¶dÛ:²„ö‘cô À¤8¼{©¹Œ¹+å)ª+¢É`ëÐ8/|üT)ãCäREš þ!|H}ôHUŒ¼Ü¥à†ÉFÖ^è1–â²ò "ç B6ª¡vÙx‹Ã5Æ*Æv~cÕŽÍZª9ɰ£„ÆH¤]Å!8¤<¤RJ•c …³Å!H÷ˆŸ± ÚL (_£:;NªÒL£ú÷Uܬ±‚Oµ*6ÚÝÎ\;Ð$ýB< >Ò–¶ÖIÀk†x^Q3ô)Míaœúä-}øá8ì9ÐØ1Á)fHhÞÈÆù @¨ nÏç™sœìà~-…£CBuö8r³f]67³š~!Å|Z‘žIÐæ¯ó‚OªµM*£Wøªhʈã‡Ô‡Â}¦O’–îBF$Èý" n˜çpªaÉl=ÑXLôüæÊ_±kûhÏQ‰Äƒ¢kY#Sm<×Ñk²ÒÊJC™ë0`zwàÌ.de¨xÓ!•ó™€ 7£­8¹áxY/é±EYç Ù{ÚX¤ Ù/¬(f÷¸Ÿ¡Õ%«]Öv PÞ×$‰{p ôl uôòš..™A2Üg`ç@ÎídB>5Ö¸ó^]š6qM–8¾Wr+t׋h(fÍ]X"ÌŽå㟗˜…w5"ßñ|ù72i B±_èºÓŠZŠ«í†‹1s»2äîè¦òŠ—ègJΥÄÛhIw•©ìØ^ 3Ó‹.ÿâ\(/µÛîª cÝ3 ­:—}ç¿Ç½…Cï.”Rÿô) ’|ØÐ~ò¹ÉH$«0-Á/n/„deMv›¨—Ïzã$Lm6CŸý[þ؇Áð»ØŠo@høÒmzÑjÿâÂ.î!âzÅo¾K¿ë†#]Ê^sø§ÂvïHß÷ñ>þ3Ç{–¿Ï€7ÞYbîiŸ®AE•rŠœRO‘"å<„³˜`Þ.PXáQä)EÎi[qæ•É’m¨*¬¸ÌÌ¢0>Þ¬O«M!þ—?¥œ€‡”ÿIù!´&H:£‰mœ×L/8fØo)‡ÔÇ2©ªþoàYËù½ª@c%ÕéP8$­!JÞÑ‚ ¤u!|Œ`ÕÂ"õZ£ÃW+ô¥ŒöÄGR » +hèe‰å—QMg»¢†ÖÍü%I-GeA؃Ãð©¡×~ñs<²"‡ÈQÆý/ÝÁé<{tĬÿ'•¼W•f“ž9ÜŒá~Pæä[Gé2îvò¨K Îè¹LqÅ,ì]¥jJXW­Ÿ!=š ØEÈC{„¬k w¿’º2·ßE•ò—©rÖŽê¶Ñåí¡Ý¹¶{ž…4à¨oK•s¦gÊS„?Gl`æb+Ŧ>šr7¸¥·Ö Ê;2Œ:ˆI Ža:ceˆ½ë`([Øu[[jëašòykñd³#óš&5ßPéÈY‰ÈÌû^V‹XÌ,-†}PÅmi=‡Ÿ’ˆ:®ü(âp…†ŒœùÖV¢±‰•U3¸êSB&–§qÕ€VqªDÑœ%b| ÍX\ƽ˜x›GóúŒíJX},d^’Â`åHÏ,pfˆÈø¦åáf)ÎK·8 æ÷8ÅÝ® ¹ëâýêyðÆ·#LÕ ¹ûT(M·Çˆ¢ψ…¸e5&?Gfm3p™-KHX}œ’úqq?#â&0>‚\îžš¾¾â½÷ñg‰Ë³Ùô…²k]§b½ùûEm²‹HSzžò8»uuFá&0sTUùÖE]GSN‘¨òá‚’uºcóè¯Ã·§ ÈqHùŸàÿ“úCV?Eþ’zvI)§nt|ãÑt¾èNAíšö6ï´;Ú—~ÂU¤V)Ãïbz •æ R¤Â2®½*?%iíCùÎŽ´N¯ÿúÑ…ÿrˆýÈCù%‰r}©¶»bœ|-+Ž•Ìvü‘¤Ñ,Vy35³:ÞÖ4mèøGÑ Π^ì‚•”¾ŠUŽèZ»·8ÅXÿC `é‚«'zŒ—eø€T¨èf™å7–”oö²僱rSu€êŠ05ŒkƇǶ¨ŠgD+j]Òè IoáÞW„9=g© [ûáìù2Ú5J®±T=„\Ò8t +¬s±†þ'ú_åã”ZEêvaª°aÖóª ªEËÍÐòbëFׯ£²( ŽÌ•LÝtßV›´Œ›xÐFD™d¢N`zð¦øœR«œudcÀ3iàÎ…ÈmXÖpÝkÁô­vFÒ´”@»¨–Xp¶•½ õ+˜/‚F‚úpl+í_–Ç!“|. ”Äßf ä¯ï5[FãÇe ª §Kâm78‚²2`þÌ/‹:ct–%LhôÓ÷Ù¨ÐËÈ ƒYíš¶[vÑ[ˆkÛô;©¹ŽÀ‹Õuб[Ü_œ£È=:!òr³¢gF©AÇuÑnúN®‘‘À¢0 Aª|ìè%uçñbÜC"Ìê´‡Cö|ð6œ„¶³A'Côîr›]sæ_•Mœìæ• Y =ñïOc^CÜPëíü¹HÿrÄ—ÓS‰Ë)`]ÚóWNȯ5zËàÀCä:QžèÔ'Þ¨÷ûÁ2î§Žh‚íÈ úý¥Ë=Øß‘ôŠl²×Í$|j ;£Q>ÅS‘Q~…ø>Ü31ƒEFÜò’`Å‹3ˆ7ú'^°®\:<›?ÿï¡qÄ÷Ü^¾Ñÿ÷ñ>þö•í}¼¿‘øKP„‡ÔbºÐ¥i–¾?;šbý” ÖPµ7d¶T9ªœÍ«ý0]´ZïoàQkÈô£s„FίnN2uô J¥œù_çÈq~‹üΞƒ:Ü$f÷€:ÉFð]èÝ|{Êôá ¥l rø²Q ÍÆ§´èÔæ;ô–î0ŽÓbp°F ½Z'| þÔ‡à<º5ÐŒ4m_=iƒ~ߊ”"åè ÄÖ\1b*…À"q pk*ïjãp*?ŸWµ—¶Jn[TMÆ&eYéJI×6ýVœrT9­o~‹h^1´¯uí'0Ù­ÍTЧ*†3`Nk¥*ÅŸ"šp»ª>‡ûLûrŠådE~ˆK%$`kéô¼ù+qÚ•å³ÈTT=39„RJ‡ ÷ø ,H]å‘@ê_ZÆm %–â/ê ½ ÌtCŽPS§ÂF¥jÎ)dÞ;lÃ~¦:ŸÑenUþ$l`,ÆUuW{vË„bõx†â¢ Ø=ÿ§ê¯šîæÎú¹<‘*s+FTdÌ2æ `ì€z›+~"pá¦Ât:"²GoÇ^\¯Àkg«}SãG·ð¦€œZØýÓJ¾„3ˆçÂümH²¾] &S.=UACÙ0Ø>ww>¸ä‹ˆi´çf°?«+1xÖqø‰ÂÉubCvä7_Âð‰å”%5ÅÉb°ÏSÓ%yæÏö¶’¼ÜfŒ–Wpdjì¢àÆ \lHl\=9¾¨»mŒ†¹‘ÀŸü\±}¤¬~³r2Ô n„3™ »…MÓ¢Ùt±!Ïêµ®e´@Î!`ßj“- &]ü†ðÉ*zôF˜;Ÿ…’obå̇î̸¶YÛýÚÓõîÉóSw“Oõ¾&1ަïŠåË·ñÎeýêPÜ_¡É½ÿ™y”Ñ/ë¨øÐþ-ýïã}¼?0%ÛdfÑ WŽÕ0_^fýEÅ{Nád‘R R›N½Ã»ÎwôV­¢œåµS¼öù˽B‡ ]üD‡‹ÈQEþŸÔ¿ðÿDÎSUµg ó¡rt9¬‡”²—¿ÙøçÈI›žWû76´ªýNó«)íôŽÞ$Ÿ&v¢ÞÄjAèp¿ nÿwöû_³Ò¾ì1lC”ÓôàÆLÔM ³ñ‚º˜)ý»jµâÖé¨Óîp±&vœÓb=tQ¡lÍW“ƒ–Ë £†Úɘv+X†RxÔE æž ‡,“q} Wº9Zi¬Ú_µ‰ÜMXs6UÈð?™œDYÑó+fFqãÚ$Z³Aoh=Xa; ¢šê²õß*°ÏW¼ j mk|tìi»Ã¦i¦ã:‹ (jãD©{/ªÔ*ó•l_›Æ@ý„ÓºÊÆNhˆ°ˆñÞ5V<ð8l‚Ç/£Ĥ:ƒuxp›,E¤’ÌvçJV ½ÞÌ»Cyn2îg´ÿbŸ¯CLR÷‰NßõôÑ©µ:¢SŠ,74.„è$Ã2ÑHÍÖ¼ƒ›Aë¿$Ñ*o@Ìd×—ÀAP!!æÕ A»*&v[ó(Ï`߀hÄdiJ0˜bÐiÚ$Œ+yWÝ ç›qÙ€xô`4ÓìGnÐOìQ; a­ÉÄ(t‰;`eð¦ç%.Æ›ˆ ¯:>YôãF5 ìíêÒ.˜˜køÒÒ¯"QØÞ(p3O¹GKãŦ¶•Ï•Òê?7Æ5®'ÒÙ*&w&ñô÷ΪˆZÁ“^=V :b36DŒJ€ØHâ³lŒ¥eô_£ì¡h%õ ?¯HGœˆê*Ó«oN¨pÿ]/Ù;<Ìý¡Ñ ܠƦaN’²›÷VlÞé7üêuå_+V /-ƒß‡­ßÄ­©ã%Ò/gî§«È/ ¶¯°;(ò7"æ¿]Ë¿ý3ïx[ÉW\.sPÞÇûxÿ‘ãm7ô>¾Jà‡tçî“#xIŠÞ.Ú9Ž\¼éž´ aÈ9¶õ…ÆüÇè.±¶ï¹£ÙE³ãÕRÍn‰Sde½Ëi§Ùò´ðXTÁÙ Lj•Hƒ<˜®8ÓÙ£)úq O¡ˆœR?„§ŠâkM9«|4~k8¤ü?ù8ä¬R??E~Ž(ãÒƒU;‡12Û½jiÌPõL¥”GG´;²ùSä/ñC<+ÂÒë¢YÜ…Fc8²°é†\‹¥7tee/SÔ²„ÕŠ{`@£ÀîºS§t½½@[9!‚tmœ4cì´§?É·ÓªÖõ›V-د½XÇÿè)¯^Ͻ¬ú³g\Ÿýn&.[ûDµû\¡bNi¦•8—Ì\M¦âÛ!¡ÁÙ4ïg{ó4pB´Ðh û° £¤ÑÁ²4ü Š9Y*2¦¹ÿ@¤y°˜ |â±n”’CRáYóŽÕjÚ•ÜðÖØúœ‰°.º“÷‚ð:}]§V?ª÷JGwÌ$Œa™ï¡ÿ#Æ^Që:'4 EcŽä€€‰È8„””è•åˆÅÑ …™Û á!µÛ›F pÇXûçž&Þ\&óÈ^O^èJ×7c»¦õÊ6À3áö›/ òÏmå—ÓÁƒ‚S!¾o AHƒqMê(Ïg5¥ÿ¼¬#ļ/¸Ç&œÝY€Ø¢¿‡Þ@6mO‹ïôt`ûìMޱíïí~'œöŠOº·—Ç}„å@K)É3ïõØÑ•~×µüSóus‰z&ý¢ÂZâÇÜqæfXá%ƒ#ùüvÁÁàé² =Ü]]ß¶¢ µ¢ú[ DvĆá Û7ŠÌ„Ñó¨Êžf,.–Ûçc,†Øã|™>\˜;ï…Ÿ®›7íun} l7ü'PT0RpÝÌÒþÌg34’•>>…¡.z´0aõm0üÈgp{ºŽáŠýEÍ3>óW¸‡ƒùŽnw·¯pâ¿!»õrõCÐåÄß rgü6Ðùé[ÙE]Ó"ù§†Ço»øo8·7¤ø\ßÇ?âxÆ÷ñU€ÿV·‰Gëüfeü¤®GƒÎaCVÆ[‡3ÃÔ~Öá³òNaÌ@ÄEË"eX¿îº¹¦„Ì–úKW§Ö&l¯Ýu¤»ñ”ñáU-ôÇ(¥>:g0ñÄÊå“[7‚"r~Hý Nù!"ùù)?¤ò‘*üÑñÍå•q ë€ÃJwÀ fnïÀ²¢Ýn`òØòÑñ²®¦?<}ô›_F‰xžƒÏ¨ÊñüÂÙ‚þº0&W=,ea-ÚÃ> è©* Y97U󫈂TœnJþu®ls}™ŸäÒ<¼œziv«#Uøœ#sÂ"gYÏå6b¦Óµ;·Üçˆîèw¬:•MUïU¬#CÅådéÜ#h¸,šhNb$ÏÓu×!€å’`2œ{—FV…ò@E/©Ó+öA'VðµlUqßý9–éÜ£¹et6V´ ¤ZÇæ,˜Ðt¤¦¡ulªù+âƒþÜ*m¹ Ù@È’'}“²úñ¦pqËìM4c×ýÀFËdËÆª¼/†S5£lÌqX-?#>h!cêà®´äo‡½Ôô) èîa8 AQ*°#ð"L¼QTà QŸðOõø°1ï9Z!Û\ß”mÂ2Ï$@-,CDVâ™{²…-Rg‰i¡Ã;ˆ<­sW¶„â¦Éßç­ñ²¼žI*ŸBH{ÉÿHå8<²ƒÍ\Hq¶-WºGÿSóº5ݪºKª7QÄ»Epý6÷±Ü,8ÜbÐÍF¦‡ƒÀ`,ƒDT¿fvÛs'f)MÑx ¯ í»ˆlúpXPƶ'Ø¢`íì9Åg´“ïáÖO‚l·¸¹RÊ~Ó‚ìQr³Ì:"'EÞÇûøÏõ!R¥œK†,ÍWûþŸé!rÔ‘SOÀ¥Ãå2 ÚZ8ë¶FUyt8=ôv\Éf—rSyXw©l•ƒË“‡ÒEZVn)òÞ>©ÃÕg¾þ º8ý¬rÔÕÌ[!<:( ñ^´,‡ˆ )•~LÁÏAB@ð¿ˆpÀbuDû¶»} ‹s¯Šå™NÈ!"EøP•L5ÿבÖ&ªe¿~èÄF¶ìÊýjxÕ£– ·¤‡"µèÿt ªY'¨§ט¾YIÔs$Ô²ÛvQ¤–åzD޾ ¯X]³yQ^¬²è«tnò)+j¸ŸRU÷¶uf8Ï%鱨-¨£¢;wësË Â^‰JÖÅØŠÂËÐÿ$rÍ™äûÒYÔÙõÄ]f0=7«G̯+ta«e(æƒbÄò´žìb—ˬ­e¤6f€´¹Ѝˆ z´pŸ/j¢á”þ©#úϬüŽžïbF¦·cz =D¸SéFa¹ã~@‘ÆK3Ô‘ÑRz™$Zsd–LC0ÑvOb²@¨Û&\#‚¢Cƒ”qÌ8‘ÄJ¨(W4±Ž8¾pÊ,é$t¶ ùò‚¤N+43œE/ÉØÃÄõV‘l%äºË…xFs' @ì7Š í$o”fV¾@e½M›´ÿÔ[|wšÞã³XÚ/Ö¡÷a”ÊáÀ‚*¿ÆyaŽÄÈâ x„â>n@m,ýŒpm4â;Bbò‡d¶ì°ntVɱVl CÛƒ’tÝŒSlc:†T¿ S‚D?#ìŸí'ìÑŸBZ.%E÷‰f·…£×—Kj½y;_\Ǿ ô\š„Hvã§9—ǰ 1"-×Ü©­‡.Î÷Á¦÷‹7El~?.4÷gâ÷ÉáÓ®¿uçÍ8]"‹ñ&î‹/,Œr7}‡Ÿê|02…o…Œù5îû²Û$Ùåê9…ËϹø4·¸ñ•aû÷cÓä·L—÷ñ>ÞÇûxÿ €3ÃS–UºÞ@ë}”\h*—A9Щ Š5n¤²’igü¦Èrxâ/Ý3KW쬪¾€Ei´}p¢TÕ—P&B=н‚nä2=(NÊÏ:ñÁñºœei‡E¤R‹ÔCpP9ª'Ê_" J=åÂ"¥ÈÑì‰dhQEj3:¥œr|H¡mÁ8´É†Ÿò!òèËPØF‚J°XÇÇ–‘êÜ«—s!§ÛMc”¡ðÖõ­ƒãÞyv:Š(ˆ­Òç— V–í5R¡–µ7⧨ÎÚ«1ß70mlŠhK2³ª˜~ó9iS©ÐGN$wvŽ¿*žBë5j Ì‹ÐBú°Y tF„.™A¶1Ow>QÖ·‰¯ìYÓÓ Fr%ãJ°6÷}ݘ”ÀÔ}ÏØC®\ëZÀm~ aÌv\„Yù«•~ÔÑz D¸¸ë2!ö¡Öøˆk, m+¼’¯.ÛýXÀlÝè 6ëR7—8C$Ä ~¾ÔiˆT¥| ¾ÃH}åTfnë)X‡ý™…kþ_g‘÷¸¨KÖ#a.¡¤±ô‰Ï0Boq­ÓÒ`×+öÉr· PcuÍ€\X$Ø|ûŽ7EÒ˜ÀërW¦ƒr9ð7 ‘øèu̸8‰‚k«Â} Oü.ð•1ÀçP /s‘¶vIxvxåÔðú0æþ‡zÃ5èÂdÅcÈ5áS¼0í‚¥…àÎ èäÕõ¥­|Œh²ñùɾ­×?s¾p7ZRÖøéÓXˆD×Ü£¶‘ÄÚ½Põ'ßåÒ×ÕjÆ×éOLÚ˜—ð¤z«b‡Å×`»„¤¯KÔv%¾v£Hy¶'šŽ½t­V?Hq|ÜÆ|Ó¾Cª³ºŽ:À %þçî9æg¯ ¨»ˆÏ¬ÓüvoŸ{«ë-^<ýì_Ç|Aÿò~ ¯ÿ"‚3Û· ûOUß’ƒüÙÜ~÷„{ïã}¼÷ñO ªÍâáE„~°…Ò›Ìߊ¦¤ÞÍOY·ú9NAóÓy­®v¡–TÂÞ!“/PÞèð ­·£0Ë•*r×£Á‡HÃëa0¯ŽÕüYå<å¨r´¶<Ô1ŒXŠxŠ J9Ñ]‰>¤~ÈÇ)¨Ý€¨æ,‚CÊ!G‘Ú‚’›âûCê)å§à´–#TŽ=eøZT‘¿?—N…·åéCzCC älO°uHL¤3ÒYúÑ{D=åéËazMh§ ç &&4Eж=îsi¢™™½–éS4jéרCn£<“Ïv zD‰ ±0e}‹ô.|LqHã[ s&‡°ùS1)‰!Æò¢eƒK:H׺lyëN ò]2Ôð •ã!vÙ[<]dUe3ZÚ£ìÆ/UÊh  ÛìÎ xö‹óž+1çÕ»~¬ŸÈD@DL$¦ò:U¹cM_±è¿i;i·bÕÓØ›&kß!(E3S÷yX'ª_c|¥ŒŸèPwg”ß3HªŠÊ8W^7ÁS½TµÞ6`ÆÅècÙ…mpRZCŒ¥UÏ„a¤™/š-pæ%à8JÞ”°÷Ë-nݧ'.gÁX¼D%èA΀1%S! IDAT}ðìÂkz$©Ô‰©“‘¶½—bªgh±¿–ú2siÀ‚É y EMî3ûû»X›x2ÛÜ’ÛaO³a_£"ðʘ¾ùïxòÙÜÝ„ ž~ŠæÐ…å8<4 DjWrs?¦àbôîÿë(¤ ¡Á X1!»°èÖÅ›,Nöué÷4#o!A^à;Óq.^ìïJ` )¦F1ùí’MÔz|Ô´¦·g\­ÏZÜ£U¼–\R|´¤5US ~}so[CY…_˜²ºî2oœ»¸¿d|‡å'!lNã¬O£Ï¿KŽ<ä’~›ø;¢ ¾ç}òòƒÃ÷=ˆ¯þÂß{[ÞaÂïã}üÉÇÛ³ë}|Ф(Õ*¤ TÞM-^hœ‹)KØËa›°`š2<è jéía•XUwá®EK†a6© àÐÆŠn‚#êÌK3ö‘!ç/ÝG÷ ‚HyH)‹,úºh&VREª [Ò@•fÑ/"ì^ÞǨØR‚ÏaócˆOˆ<¤C¹_-@€e×Ó탆½RN«›î·N±#Œ‰¾e˜i̺Ë᪄€BFfbBÁÂ.a‘އk|À1²ë3“¯Žÿ×ZÜw ãL´b&ò‹²†%ëjƒÀ&?–ÌE|S5ß{GhBhµ)°ÁÙh4wíQ®xä"¥øâÆÛÂ:¾Déúé®Vžoÿa±’ä7ekyI‡@u~`´b”ÀF w}阊Y±Àt¯ª"}îˆô¬ŽÙ*±F¯ê½g>ͺڀ¼,tˆ}$×ñïªÓ‚×u¶U+˜Áî5ÙP­X[Fd´&oÒ=Èøh¡™éÕ]Lœ¸´Ut›ÝÅõ¤qPÑ‹†v'`¨Ÿk)rTië•6ÐÅ!Îgá ßh‘‹égu¡ÐܰØt ³ìX3QK¢n|´< Üjð¼äí2Œ*Ü’Þ ÛW•H@ºÏ´åsó§¸ñWé÷Âe÷÷8vOlž€gGæÂ‹(°µ>->r@.»(‡O‹ã`½A¥5Cy5’ïmÿ#O¯ù'äèÕ]Gå›§t4ð³8 ¼dž:×]’z~Ø–@ˆÕJ#' n°~L'Êt÷ÖæØnÈAw¼Vli€n=ýØ€l‚÷Ÿ3w’Œói€0ÍÏ)¾pŽóæÉdçŸs|ƒåã¯×l\f þ}äÃ;ÚÝüd+€äzó¬kñEó“|2Ò¾qžÍgòvÿÐK( óÛ‚gýjÍÌ:Xî$øR~+T³yx‰ádóÕÛýtù·"nbï Õ‰Ü^T¿ûQëyïã}ü¡ÇýßC¤pÕò@˜„jÏJš2uîhÑóKÇ%‰îé¡I…Zä^íÌì•gH@·i®kÈU$ûîQÚX àbˆ²`KP(øQšë5vCžspiò|Z³L,L‹%Ó–[¨øÐÚѲ›œÈË/" Àµ)Fz?ÌsŒ¥>Ê_†ñ”øwö¬ vÐè=×ઠP÷@‚¤Gõ_§Žê09™DH1ÅI^¹’0´%±ƒ©Óäèµù¡Ç¤ñć¶9fŽò_ÕŽ“(*6WpžLµ€½Ã´nT¢¼­Zjw ñR U³†"B ãèX|‹PS¹ÃO ×Y-‘ ¶¢#RÿlXâD¸ÎÝ70GÓØs=(w0v8Œ•´/‚H¥Y0 RfP¦Q~‹i‹3²€ueÍ 63Ù¡ód gwX_lµªCg¨íüâ6wÓ†ЇŽù¿$²|`!{»E0G žðU|Æíþ‘Ñ¢$s ÉïGŠ3"h™eµ†Èœ#5t¥\ÑÑè9´¯9Œ€ØÛ@K惤º©¼Aìøä]÷í¼ì_{;x1R?·ýˆJ3g©´±x>J)ŸñI=ÜsÛœ}ÔëöpÎcþ›÷k҉暖fáµ4ÎegOÕVˆý"FÓà_HœåbŠoìSŒZÖˆ–;Ëg·1NàÄì^ßêÍÍò½\®AÛY ×Ò½q.Ýü°×¹ë“DXs1_®`ñTÉaè“-ا”]¬›Ÿ¯&¿50%5sÏ ebŠåQiíÛ!˜”ÿú¯ý/ÈÏqS¸ÀOØWàõ§_qß׆ÏçOñÏh‰ø„ßûxïã}¼ÿƒ¼ ª¥m‘©Žj‚Ý ý9’‹!ë«JLQbGõØÈQºd¾#rÊiç€| S—.Æ×軕JÑm 1òtüg-R)|ôKnù±E¤CúÑŒi]ýhÞÿæF!X¤Bjéè­Î¦ÂŽ—l#ñò~t·“z‘‡ñW™ÅÌ”ö‹È©Ê¼£:åö*wôƒh1Î-F5‹¦A¹ ®)"‹ŸÐ.ÞÔNÿ¤Sjíí€à!Rl‚“w¯Ô$œ‚FxÅItÛ‡×Î,×M]Ôd 1µ_é¡ü—$ gLÌ éžÅ¤³æ¯£õF;\çMñ~¤Ü‚' iÙ/Û¬û?¸ÉW¤ XóÌ”ìAüˆÓ4Ý/J©Z]&G¸ø$7XŸ?¢Ÿ»žþ™‹§~ú{ß‘sŠàB Ê€”'ÈÅíòû°PßlgñÜmÀ¸\²)w@œkë^•fæYÁlP"42Æ,†óu*Œ~|Öç=Š‘iEÓ è¿Bº“kÄæÒV+?úÏÜ.’áy!qÖ4…ÇvuGàÖ™çÈ!d¯6w`v‰ú×öël`kîálÀ»ÿå·Jå‡qnû³½åŠïdœeÑŠÐÝ®Ýjƒa0òâÒ¤{Ñn/P|ý˾"[ÞbëûO\ÄÒ&òê5Î~³ŽaׯóûàãRŒ{ÃëZá^ /™3þ‘˜ú[Ôÿ>ÞÇûxïãŠð൭(ÀÅpH³1`n½cnRn(‹•n”¯¬ä)+J·làT9D9›múoN ¦¡ê&ØÓùZˆé0žò®>TH…”Ç8‹–nãsœrRø—ú"Q¸¼ÒÑC)z*ä ªCl/…ö2ª"r¢c½¨"ªB”KŒàô\V*CZÞI¹þUÛô/=¾XäzD‰^ì/XíGÍ:™«Ø3s=ÒªðCNEU0ž¸1´…ñ[O/šrŽÃ‹¿Ž/‚ÈAa•Jáh2€j\p}Êt0Üôs¯ª×™*‰Ž6± B*Mà°É*Jm´lhô,ÙŠi—š¬œàTŸÁwɬΌؗ©ÌqO‰#$Խ܃V&DÁR¿ýž”áýUû‡˜ ‘­ÂN» ЄQë…Á/陥›‹Ñ2Û$ºpCæ*cE iðhMZ gÉ&E†5çEè&a‚6ŸÀ–`pþ¬rEÐ|—IŒÄ3\ùÚ(n¼dc21Smgó×êÆ×>&ÐHŒHÉ û9¼ {0‹{M‡î¦éç"/u§¾@°ôªuáÿ“(R/Sd_@I‚ ’[6^˜ƒ ¯a4»ŒJ¾ô`Z…¬ï­+€›çâíñëqçÛºøÏ&'œý,q÷ÛïÞ¥‹¿çV¿÷ñ>ÞÇûøG5ì–Š84®3ÊÿD–Ô·eÛ–º¼DVR®E7œ¦æ«”"(rcñ™Ý:Íp0“]= ãW*£C ”ÜoJã9•òCq\O9f„ìÑãËpn©*b×È·mõHÅT1)”Jù)r¢Ç WÓº6P:kX½<‚¨ËÜ‹…Ȳ0:_QX_sÛØÚßDIG‘åSKW¢•aðÒØ—ô³ëNZdª£E¢R%’Õú?Z¯†?UG‡çã¶ât‘«òXžBb`µFóÁ/X+àVÁ9â—%:à ÎU¤·LI4†ªLQºs†RÃèÑSÈÖ·DryxÆÏ§5Ó`ZÕï#ŠG”Þæ°¢§eqi]!®#g,¾pÕ¦ÂmòŒ ðžâi£Åü«vøµI§Œ]ãŠW€¤.Mt"T9À¦qĦ;”D;À=XñÛm= —¼‚  ŸFuñ:ÔxÎ"¦rvV­P-J°V<:ÈÁÙ ÷Ä ®–&pªÆ—­k|„þ2€c"’š—5Ó°®lÉQüaªMí6ó Ȉ®Ü(èÝW$ÞÖzjšk\æ~–'ÐHMâS‘áªÎí„êÊëäì%{´Ï™Ù¡}ãdÕ9žÖ»K$„½ZpoN‰r(Ç% ôY4‚»Ñ¸™QÌ.¿×,’/™à\üÙ‡?}¸{ã”çP#öa1ôøiLna¢L×ï#Ú puùú÷ŠÄ•™}Gš ̺Ä£Ûkk‘µ[¹?¹Xǰ9gQ΄Ÿ0~ƒÈÇóîgh¤ 1—ån<•È6c™‰ë×Û½zâ4ßµuî‡ x HÓîn`;̺+;ã§ÛPèS{n\ј‘ë{Tü¹gÔ¼‰×0ÚYYܳ ¹oo³Áæçvb¦¯]uâ*ö{ñòhþFÿßÇûxïã¿B¡€P;lÌíf5"ÍŽSSˆ£×‰C5y(ƒõ®©,Ý”¿;uTSQcöp9¤ÃÀEÛÖcÙkN‡í¯qX±ॹ¸È²¦i°þÙì×ë°½n éQì^Ÿoð=i„·T[¥ål¨xQ–2ØRpH«iˆV>éݦö¯«Z£ŒK;`6•ÉâhðTÝðvbÅ=á{T÷ Ö&þ¢Õ–´Î¬Iù·.vžª,õk»¥ÓŒ¾ä&!§2;‚º½ fì: a^/”£u¡…¥è/š¢‰Xh¿_¥OgÒJgr"!kZ<^ì@ü•pÀ…þ3XèJ5/à«YF Qõ4èŽ JB\y¨J»ú8eØA«jkN*^(Aß¶¯R”u P…¼xÓ&ËdÑê[Ú@?Fàc;àSˆïœ÷Ð;Å3j×Ïg3‡:çJeÇÔžNÈ|^¬²®šøh·&x¢|‘›/9È ¡Í+­ð±ƒ˜‘@zÙ4gô~ý—À«½dØâFÝNigÓõ/$ËèÀ…;ÎuÈ0îbu .”‚L:´·»í6Kl²ívxû‰„ëÇÿ×´Èz^Ã/¾`CÌ—àø¬¯ÏÜ–†ë m;PþYÔ qÊá3Sö…YèÖÙ>ö¹^\H€ÚÓá±CÑèíý?…øl€èðÍ0F)Ïî¶™Ì܃›éM»elžbÐT5G*{YýåäôÝu!¸H‹8ß…ëØ¡gÏ»&€¥³ùÆí;ñél @•——}õÎïµ>¡§#æ¢=↑Ã`þt‚®igß7=gâåSži_ÊîÝni^މNãÄ¿éÌ“uýO6Ôþ¾÷ñ>ÞÇû‘‡œÊp@kÿG©\”I㘦"uØA¨­(¨R†ÅÇ ©ìþÑ¢ ¾AtÆÞF0~) ó*ÃJþœJX¥>^î"†à4Чw[÷@ÅÈ\"írÊÙÅݽ×á¨ÄHÙ5 ÊW!]­SÿÓ B  Hÿ?{ïºå¸Ž$éºAQ}Þÿu§B°óƒ¸ø ¥Pdîª"W¯žžÜ!‰$>77cQžÖJ~.”ˆB œ§:ÌöÏÎe>a(¿ˆ‰àj1ï4•iô%¼™ÊÂ{–O,§ý7â gHícökÏ"¥´ RáŒÿ Tó¬Ôý«]éi›ø¡‘‡Â²˜¶è¥zQ#Y„²:ÃÌt^cñŸ³BzÄìbHMý fÿE ¥9†«^ºÐgC"y;2 ¢-~-çBàîMd™·0;žd*{.Q·Xbu¢”JØ„ gè…Öé[œ1ëv¶K’I0eCî"\m’VÈŸZ",™cK\EZ‰ú­–w¹PŒxŒ·Ò`GYT?¼×'¼ÐgEY`3QöÁFÇ`d\©èLœ÷EåØÛé..ò[Ѧ›˜ÐW§¦è2ϨƒÆÎb>âÔd°FÃ¥«0±§§«HQ‹„Š×¡à9íþŸ2=XêóH‘ÚBzQ• ÍAx^pæÇ>u™¸Ùe·º•^>‰iì#Ö1`¸ëTÊ“‚§üë)¥ )߇^þˆ!~ŠT(-¸‹^GÖ® Àlìoœ7N§½ª¤ÄŒÖN—›ß†¢ÕkÑj¥ÄqÕêœgdß'> ;r·åa€3|KÄðJt#±žC?;L{ ¤ÐÿÙ\ÉÛµñ0üp޽êœ&œyHiŽ4íw+[ôÊIë€l©Ÿõ½š‚ŠZÁª¹MuÁÖZZ1‚™ýŽØ»F§Îf}ôFÃj·i=…4G˜ Z!ÂñCŽ/›Øý[ÿ³ÈÛµhÓÀt®ˆÎK6uص¨ø åFµñ}†ê1×Ûî¯2%ó àÕÂ`€±ovitägD&m{\V‹âŠã¾èé"Þ/Ø»Tôÿ¨hVs#˜]*jú…ñ¦mžh·!²bL"ÄtM%†Îõk³~»ÃÔÄâèB­˜ü†Ùh%Ásƒ­7«k«bºhÉNbÔC›¹rfV{œFF$½X~g–…&…".¨÷e[ùK+aìíñ})=!4w(´«UD9<ó”ç5ÎèçuͰ=1¼8ˆ…M>® +Ë…Wµ¯fn}—ZN¾0´|“œ„¹îõQzr\™ôƒÁÛjÅ*­ Ýý÷E'MÚ!´ø‡w0ìÆÿ‡ôÖ‘D6J¯$jÒXJÆÙ ¸ºs.g^ìâÅ¿!ÔHu#/ñ®IC«e42òu 1«’‡:m9øÒÒ‹xqFýfr^¹ ߦ¼6{ì{6Gt9|ø%ª÷PVç–¼p‰°l7Z6í¯üe®Ì_¸bos+¾·oï6w'ïÃ?žb?zïíÞîí?p»éÿ½}¸€‡uçù®|¤ªDDé"PÔÆA&(Í´çŽROyPŠô;¯péþàýe»(y`¸Çȵ:ñãsòÍÅüåPkVÚ¸­!ô~ ŸR¿¥>¥TK"Zš.ÚÛ^íɷޱøõç k-Í+£(Zª•›eŒ¬Ú‘±©@ÒD›…”ä¶ÐÂlM #V¥]_‘‘³YWm¬¯85¶ <ÒV;¢³?’W[Á žËÍêQyF•gxÚF|.ÈkÛm3*ÜûT¦¾ùÃ-a9J«¥ε¨ôôsø³Ë°N÷šIP½Õ½l\4ýE‚á õœ‡ã#!p óÞì­MG¨ãš­+.Tb°3,®2Ã(¿Õç(V&|–V¤DTXo‚:mS uç„Å·TƒÄ\úbf'ÑMHJû? `ɰ Mu2|íUÚÎåjœ‘È’ BÅ&*¦0<±ÐQµ ؤë–,îÐ' f}WÒô ç8¡ 9˜~·Ì…ibsÿè¥èšæ¨S奦KÈf’M·–µs½œµå}üG2Tsqòž¸vìŸ3pN%søÙÒXq9½§»·þÎqSãb¬NêyNûÚh£ÿEѲYt³ xÉÓ€žÃb}°Ád{6=›†äŽ+þ©º/ba?åëÊòbC¤p8ÿÐdꦄ Š»«¯È:DÍ#ç]sga>üBæÈ9ÕùêÝÕÜ89¥çÓ{9ÁšÊ"Œ– Ã~ ʽMn†ŸìLÿNœMY!É&ŸpÕKç§l€Ûƈ=\¤™ùù@ŠÍ‹>Œ»ñ$™ùǰÕU˜rÁ¾\*Ê!ÛÍ3?%œ%üäyÄŸ}„§ß’6ü){/²gÿNõ'ð}Û½ÝÛ½ÝÛ½ýon_ò/;¦‰•žÖÄ XêAÓ¬9¬3аôì(ÈUNú(>Šs:´Ð´–#sqÚtZÕ¬Y/ íX;(x—|>§”(+ sŠd½PÇ\¤9RF»‡&=¢/±¦ƒ¹£Ò†t®õSQºî‚^`Q~M:4k šNy×î ¶Ã—7ÇǨ¹ÊµÙ‚\W1¸Ü¤DKòáMtGì(‰7øìƨ6ttDD¨Ë~¿wþŽêc~§ãJ0MòɪM¾Š5í龈·ÁÑeVKÿõ—IÍ ‹Ha&é˜$ÙÏ l~¯ªF‚:oÒPæ°3{ƒOfAïU ™ºx—YG]ªóüDe%¬X[þ†ï3Óõm–ÔÈõÓÞŠAŒÙ×1SÕ>cÛ4=îâÑlAI&®ñ3Þ¶—ˆÖrm^2Xà⾆ùèJ˜!¼°>Á®¢º¢awRD„§u~ùÊJ;[UûÜš+鋳ŠO8]uçì,r"n‹ÛÅü¢úÂÕÉÂ’=ò ¸¿wÄ“}ÿMHJM¼N=‘}ðBv+p©<‡«ùHÉN•±]h“ˆÍmŸlÁä‘°`ÐØyq³Û©BݾšvøÒÁÎpÙÙ ƒ»®¡Oâ !Bõ»ÞeÛÈY #XñëD“)'â¥Û>Î^½×|‰hUy gà›^ýWU`þ<ì?½‰qé3¼ò‘+Ù¿Y“ʘÁ>i¤Äw¦Ö?³]ÅÍ8çòæ&øÐQì3íÿØ©Âç>ËÏ”{»·{»·{ûŸ/ØFŠð1-ò§¹óp\9Üÿ#aJýV4rGÇú¨H…TÊsøê8;—–Yç AU‚î‡xÖQuø·rVÁ¿ÃcDDBHlñGo)í?M”Æ3[E¤Ló ‡Æ¦ê½6S{ô=‡VÊ4£æjðYåY…”2&;jïÿ»• R ŠÔbßsë™Ì“½GAÕ IDAT«Šgf%sM¹ƒGhÄX¿axŒvŠNîX,sTI¿FN•:êÆ×ç6‹¹ÔÕX«ù À½@R„ÁcD é=• ]éͶØÚ‰êKpÎZ#zWרòEaOŽsЍ!ØÙµËH0§ö¹Ç>õƒkÐ2ûä`>>DñÅD@' +Z"­l_ñhÐjÕøo·RííDOP¬Ñ<ØÒƒ¬ÌóÜ>m”ֹ߱¹dØåU]NVãúÖ£7-E{}¢Ö¥im ¯6Ëxv³&Ýñ³`~:ú¨¶:·¨ÒM¬ˆáTko]Hü)Rÿë$ÐÀòM£¹ËÚ rÿ¬ú*FV¶l ð”™Yµu%37DׄÛLû¢ìXfO2”XÄd!äÆš+¥´ ¦Å%+èFÁRˆÇ4s5pJÖö¡n°FÃ’» ìíqÏ1G$°›$ÞS –V^uØO¸¯ú7GÁ0ý5Àð†9ñZÍð„½ZÚY”Ó½Ãé¹ÝB@„8+È"z=C‡Ô-Œ®„‘ún¥YîÛkDK?gЙ“+ë©kjL&&ø®æGd öL ôÉ“RÖ|<±Í ¢wovtk¾œ6]0Cg•¸ŠceëÁ°ÉU>/7^¡•*´Fb¢À»ß'áõCÎüˆ®~ã5ÄeÞ‹}ÕÉ]Éݳ5ùÐ'˜î/©ÂñW>Ù¼ŸÛ¿ùÃ2y~úZ¼1fïæ€{»·{»·{³€F½fê,Õ :»%ÂtìáäÔ¤Š]Õø¯»ß@Ù"—žÇËÒMoÐTð·*h`± v=ÞË^/# àÙ½wê”ù4ø[ÁC¤Re}•ÒÒ†ëðî?~ô©€i±J/<°Q,†’]GT 2ĺ³Üä`lƒ*jÁþápRzBé£YñÞ‘f¨§‚y- 7Ò5&¥Øj –}T8ª5ö&¥ ¥Åî?æ‰j×Ô¹©‹n"ÝÆ1ÊTå‹JçLÄ;ªûBy#%8N¥åÛnÝÝ1œ38¦–ë ÖÉž“ÊJ‘ÒPW¬©p^qÚ5í,€Ip°WI6%¡Üf$7T#fLÔ”b@?hEvcÙu¯6Ê×°€˜ÞSxöôÚc%_f‰i±¶KpEÍ̇$’š‘ø}ñ£­¦¢b2ËÌ´„ª¥…0SGÕ…˜Sí›±¶'¶átÝ6´Zx%‰Õ×ÔXéE§y3_ž™ 3©¸V3°±^ìA‘n†`^S*ÓÄ4zvzRšÀ Oÿ]ºüìáé¿ý #ÚøIp_¤çÅNæNxKÛS•™P‘/XÇ@2¥-qqŸ£˜â­+’7iÇýÁ *§qÞö Y<'·úÖ2øT€ý\0gx} 'ÞôW ×xÅ¥¬_±Æïªwç=Žþï3ñÊi=ýQ¬+%Lg×Ò\Ä“Ü`ÉrnÒ¦Æ9]hþHƒ`j*»â(³;.‚^=PNü‰]¸Àqq±ô™ŸUØ,?¶iÌÍo±eÄ]‚«(ΞvWpmcÜG ¬šÎü¬~Š6õëÙhéf~ñ4¨#kýI¬ð™–ÎïìØƒ’&4ìS£VE(“%øÛA÷^jD¸òg×€ø/iÃ/2eüÐÀ*ý‹·xöÇ!8.|-?}bß®XÝ-÷vo÷vo÷¦ Å>¬-ûñ¦£§\’¶ÕvøÃ„ºhvúÏ®¨-uúùúbCÿ;s ]Ô?­N kR å_Ç·ãB ªÔ^¢¨]ߪC_‡}¿^FB‘5©0æõNaiÒ6¶£Å ¥Vå1² |xdzõ..g«X­¢öI¡*9 9¶Aùθ@Ö*E±µ+HË]è§ëˆt>¦H¹dìCw¾kàŽ ÁÇ`€tpöÖ]þ˜‚ÁIwoªC¤úO´Z]+q=ˆó£†u£®¯ _¬JºîaÈšG„—%¶ÿffD;ϧ(›ªáÕë5#ì’6@í@|G†ËªE°‹µ-üú‚jœt4! ±ö“žcöæÃ"*ã„CSÀ˜íüºô讑6åï7~=ò0ÆM¡ÚŒ˜ŠîÃ…Z•*í@z¥AݧN΀ɠµÞÛhAJ2Œ_dh%•¶ùîŸ#ª¢` nìæN³6éLÃ(5ƒ¨nœÓ.³âͽõGe”k‘¦·S³½/.³Ä`Mغ)ç$Ï,^¬Øv›qÁð)E` š„F³‘q¢˜‰S³àìWœuÇãd˜Y«NŽ˜¡ºDÚ ˜x¢­þûcü0Ô3¸_4Ó›´pÍ*Ƀì%À ë>¯Ï'^…é8Áu¡gì&}¬Øƒ©R¿N¾¸ érÒºõÏ%¢f—k7u€KWb–%¿²CySõ­ –¨`U¦•w2±¼åW7±à+È ‹§szL¿ÎK7šD7îœ{’1LˆY÷ÈEî++ÎMš-/ÔõÌ/Ç2~ÀX­iÒ¨äß¶¾âúuÕ„œûËãê<º{Öb鿔֙UòLØÒhsDx°^™qq>ÿ²n|ð[Þ¥øüµ’~çt%õE¼ø-7ò¿·{»·{»·eÀ¾C*A´ö<€îØ/ÊÛ×H³ôŸ.ÊÕ»õÆ;Hëas_Ž1ažCS:yï ¬S¹yXÓTNɪzµx."òù~ˆ@Z3Þ‰Uó‹?¨\·h/Ž_I,fz- åÑ x™vØ)ìÔøÙþÏ ªmb&«¥¦Ï„òö)U¤ˆi²Q˜Ÿ2LoœËçÄ‚“ê±ÍŒîé©U'£${Àóµ;VæQþgîÜ×Ló¹ÊXg„<[ä§5•mê²ß“}eH978Úžó¼²³§iÌŠ+H¾“áY€Èßy– @S<ózüE4($+ͪwM[ÒêÉx @YGæÐ&x&±NböÞuš¨yʪ *”gÀ ÁLGÚr%’#AÇP´Àrt-HÒ+Šo•ËwùÃ,-"}–¥‡¿*¹mË´iÓCØ»V]ðm>ºBêÈî¡e„ú‹¨¹7Ø;X'Ÿô?Y?z”ÓÃÂ5&ËðüÉ)úÀöìc¸|¬¿Ûq¹ímxëdS.UƒÎŸ¼÷vo÷vo÷vo£`$Àƒž÷TÛÃ{úÐwkú¯îüHéŽÕ&EóÀ=^S òTn6Ó@ƒ6‰k°˜‡¥rÏÎô©,ø‹ê(í#„T (JT‘oH¥”ãT åÐ4îêpüq½QTl±t ³òaWÒôòý'ê!íÞ š5ÌbƒÆŽ=ÀáAÿ•›M)‚ÒšZB µr& Ó ©{.µ åa¯ßãIA?ÄHªÇÛÍÑèÔh(uNì(õý¬À.®Òгši¸`4õÐ;3^R‹ò™»‡VCÎ@Òƒƒv)qf’À V*œ¿O•¾0`f²,™Ù¢Èåã¨Áj*L  A‚ä*zÞ›c?JÕ"µ³m˜#p\ Uµéâ£7H¬›ð<Ä` ´rCj=:Uy¬ ‡.˜ôˆˆÃ ÕÒ¥{¡àzƒl: Ô8 j\WQ(ÆØÝ!l]»¥õÒg™¶¿ Ùù4nH:ÕyQÀHúë™ÓÆq;ÄûK7sø¡.fZ „ñ¤õ¥á»/11=GTKB.ˆ±SOy"m >ÛCì‘÷¦lÀÜ×8O7B*qICÌy£<~Ȭ„ù«Bx<{XÔMä‰é3‹[Ê#VŒE>0³A‚“ü,<‚ü™Ö×Brƒ¸t›¹]¡:Yì¶Ÿ@Òƒ+﹋XI>~m¥­¤5™ ry/c?…z×.åéé°\󿦿Ð@ö4#9x¬3„꾚–'Ø„’§s²1µ)ƒa7£b¥×wî[1×IJšo/^½ï@EiêuKÇb——,žQîeò©ËÙØŠìo¬œâjÊ7–;à;öÏ«|Œgwé+é-º÷~¾\S \lÊâßà×xéŸß)ðcß´ûΟž.þÉ“þæÎãòù¼·{»·{»·ÿéÕBQøUÙµ·LµÄ2T·¶¿,°¯SÝGz'AûÌCytË á‰çVyz¼6>ôXš–‡°w ÃCFøçxÅ, ÷k÷v±8è?z¯{wt8¬EzCûÂ[§ÝÞ¯€îÓÎÞWWž²ŸãG˰+)fÑX]š¨LÝq9ª ßòmè˜vLMi[(èf)ÒCvf—°ßÇŸ³òä–o¼e.Šv†¿dÒ bÖI]5…Nµ„q˜æ§MúmÛ3¤kN݈ ƒ.³a´q{0æù–ÁJ Gå±õ[cžÀ\ˆŒN™ãŠ50Ãô¹Áþ¤aê| *Í"œ2èRiYmæ«àVnÓ|f`Pý„ñÑž:ö›.ÖÆ0È<4´š¾ù’!Z[VC¼.°²M™gØÕEaO´8f&÷2,óa¦‚áë5…ð:·\sÕÀ>›§`<—«³þ@¶nñÕ °âV=Û¤=BúÛœcþ8 Sõˆ u%‰æZÀ$«Vl̬qµ4€Uƒš}_O´êF;q¹™ñè\ŽmèÒºÿTéœÑÌg °eRnŠE~öc×ÔY­fý—¸põ7 pØ×¨\Í݉\/£~>ÿž¸ŽrÞQÄ¿~üCe€;ª÷ÞîíÞîíÞþH@?uêdµ4h>R‚G°‘ÌäšÍv¿<¤áC©‡cþ@½è˜¾Hytô_”_ù³W´7wÿÝáPÑHÍñÙ¾“G±£õpÉÿ·à9c~ñR¤Êl ¶ñéŽ"ÂÙ£PÅP9(Ÿî©e†ñÓÒxéµ$» öGwB³õ¯ó¥=Eùøþ*FÏ¥ßã[ v+ü¡»/= ¸ÎR(RzÔ3fÂç8 /^§±¼˜žE¶Â±[ý*{ m2ÿ¼ÚŒ(ís/ä”ÒezYÂ8Ä,/ôöÿx¬ ‹7áÕ ¶¡z×nŠÍa|Š™.á$ ¾˜Ê /òì q$­  ­üVhÁ%àtɧ¬œàDÉ·)‹µ²ˆ …g¸aœôé[9•È ãBS³i¨îx.–éÞ•D¸Í`¯Ôî;{°mЍ&£%X&¥}¤GäãB›ë¥VæÏcî3Ãw†4¸ñÜ÷ À1Æ’ié¨ÕÍ;·Îü©¾Ùkä3· e c§;«[¡”á•NµE¤!P×q IM)!ÜnÚñL7:Œ[`”1\ýôöMæº0—œû%%óÕ £„ àƒðÜ“¸€ )û¶e—˜ûuø»{@IgTò\ȼ°t7÷¾_H™C>!3Ar/ŒÌÞjecxwVK½gæô O¨Ü³OûÒ OÚØÁ‘UR´Å÷¾ÑÉ­º¯µœƒ,iÚu寤ÏÐÍÃNvž£]›‚WY¿œyvQŶsS–`(["€ÔlOb¡ˆg *:uiòîæ½mˆn~0„Êd Ñè¤ÆÚÀm?Âü{©¼ösû/?wAAØùÌ*Ÿš‚è^pÎáOö ̃°íÕp3ÛKh™W."ƒQçæš¤ã9û10i‹\ þ™¸çÿò'´êøô‘¾ú]üCgü–ÿßÛ½ÝÛ½ÝÛÕ€¿tú/ëÔÔß.«J­Rº^E"Ïî;6ÿ™G&<í ÙéèÍö©Ê¦jo h6‹ù"ýÛº§ÍÁXñìiœböÊ€ÂÁˆaèd|v]ŠõOèBû´œM?­'׎-pø1;-ª"õ©Ý[°ÈöRZZt»÷ã–‘»ãÐÄÁeÃëÆó+ÌrìÿWçÄÂEºiî©ØñÄ‘qµb(©˜µŠiLáP;‡µ¯ø&Gs€A]v@Åe4è[Å](k&VÿÏîÏ ^7’áx gúÄ–‹ÍÈ»ZiTo>ÿÖ­3Ñ–Ø„a]ÀÈ´¨¹‚JM+jŒg»ÏË'bG£-®«NÌ…ì³ ¢ß#’ÛPL/ 8UÍ¢”Ú/4æ!"#„Ö’Y^å ,:¿À8¨@ED€6y;tH0fÏBÈ®ÎzÀQ§¡ ·Å×…ðäi»Ô’,›*P˜YtxoÏ™yº&c5±ã¬'C²`a"[e|%ÿ^.>~ºþxÞÐþÿýóÇ×W{»·{»·{‹º¾ÈŽ8Ë‘Ù+Ó¹ÞóÿCÃ^¦¶´a‘G_Wñ¢ï"(}O¾¤K™.Mº.Ó2HzëÀc¤ÚJsŸ(ÇîAøœ}ò%ü—TÌ®Œ$^˜DD Vjof3€Né>HѺ…ÖjûûãÜh¾Øg[cµ(>쀺õÍäæÅ†+~¢üšÆgi'jÊäáÕ9@×&ÎÖchý9®)C*2L $Ô‘ÚcL_Ãô^é°ØRµõŒ‘[_ÔÆ7USˆXhbÖ!ôËòá>dR"l¯7’üλ-öãÇâÄ'õuæ-ÑxÙê"Y:Ùúö°‹L@{~«ÆóýèÅá*Õ@Ûy[KhÀ”ôÆé‹>¦óF ŒØÚ¯Wøe­µOÀ&&‘ÉÅÍã WuÓÚq^Ó`ºÆ øÖ–ÔP+ùòâŸj`b2“òý%b¦é§Á¶©(6qѶm™}S˼mG#®oì &B”Ë çúXà Óc3=†¶ ½"HÑ ­©·£*ц/®ŒáÔk<‘x}Z¸¾Ï.½œ:ž‰ %ZûÁ:Xž”®Ì£Ìõ:¯MÉLrW _¦WOïuLÿqŠÎ7éö_FØoŸ ¼þ÷<dÜÛ½ÝÛ½ÝÛ½ý´à Æp•Ñ&?7z¼ÜWȳ¿Ó·žC«”£&íjüO!û¯H϶ –2Çz¯âSMÕk£ŠÇûÄc|ü¨‘GCu¨"ß‚çt°)ŽÞb͸‘áQ'ht§ ÆëÕSÙ˜ÀÚwòØî¯o¨]¥.ÓqŠé³‹÷©Œt† Í0Ô.Ì súê ЊÚ*|öóPíÛ &ý§Í4#ƒT^”<õÁòlìMi> —Ã)FNÎ̪2€€«fbÛ(ªaM…JCó“uÏÒˆ+`0 á¸Ü¢÷MZõèd©d¯ÓÕ%„È Ð¼Z¾ê¨UÇ/úDj–}ÃqùøâJ éö/Û4Ѹ°  D«Íñé¢ù-(ÕH§Zi;S¯]Ÿ‹ÕârøÑ B$ó•‡[ ÙOÈüå‹'ÐŒ˜x‘EJU ØGN‘6G5ã2핳4( -üÇÁòÎÂyHÐñQÛ¸sgããMü„io %&ešî59æÖû퉺œ~Ê2æ`),å…åúAîꜥRbæyq¸š«ì+(WÀ\xžÎ1p1*9^ÐmõÅÉ®i³ß“+.ÉÚ¹Ö„".X‘#¥]‹W—2Œêý™¡Í©_n5Oªž0Û7“»‹ 0ßèÿªe‰¹Sæƒu„Ãû4 ¯e{ `~h«»[ZñÖ~´Ä$*=±`}²°(_\™á³J-3/Íå NëÙXærØž_D^1ˆ_Í´Ñ”FíwÄ^GÃXŒ„k˜þU¶ œ¾´çжïK³ø'smü>y÷ÓÄ¢»Ÿ8í÷ö_´Ý%¡{»·{{·P Ç9–²…“G ºˆb=˜¨Xö„L`Ц¤ï£?’{åÑ{ :¥-guÚI0Ý-§ý|ÈüË""½aX¾68R¥Ô&Abü~µÎ€)¥‰ý5‰žäe€òêƒI¡==”‘ˆŽ!¡¸³„€ö[ì‚b$öPNJ°^áFâTz’ðѾP2ºôó9Îÿˆ.˜´=¬$óa*”#~E›Fš£ëÕt „†€¾v…µÓ–.jŸô:3”£Ü!-Çʵ!ƒSˆ«Ù^ƒÒµ‰ÖÚäÝWÄ[ ±yA«`L"t¬gf±Á×Õ3ü"k(Ÿ… ÷OÞ2Ã[,Uª]h(÷ËV4ÄØ͹ `¨»Œ â#+.Æå³I½¶Ë’Q©¶ýd´Ý ‡ýIª±> U=C%"¸à“Îc–­fßT‰hHÏ?ät¯Ò~\9ž3ÉhUÈbzrƒ"Ñ-cC7°[MwnÛZa)R¢ÛM9ĬÇx̆ì›IÉÕÅíÈÈd‹O•ÏW_1Ù/UFçeÎÒy*¬-)þú™Ë¼Ä_dÆÖúxª!êÏ€¬€ ¼C=eõ¹ )•¬*$ ˆ«b1œÔ<l¯ÎÅ…ZÆqÈKȲ®%»½ZÞR¬+…ýƒ«ìõš ×÷î,‚45ö,2Ôo–VEÌ1.35´Ë™`8±\DÑø‡—Æ]”S‰ùáúÒu>!Û5ËLtÍUoxyÄ9Xt’sÕâ™þ%ó&Ø€‹›ze°&y¸}t§ñ¾Žán†%Ï:É\ïÑ&5Ľºp]#¶èO5U¬JË's˾?ìTÏ¿øBn÷öXã•}Èö‹ÇU˜²ç&×”xÕ=#{ƒ»tï>…úÎúÏG~cî÷œ¿½ÜnáŠS÷vo÷vo÷vo¡ Þ&…J”]•]¾ÉlDKR-¥­Þ+Ï–:[ºíáúÔÒÈÁˆëweó½á Õ¥—0)çÁCb¤¸ƒ¯ÂS¤¶ÈbÖér8ühUéÈ/Ù¹® 6€þz]¯­ýˆ´tAá²ãâ@C”®RË4OŸ ÛiÌ™y ÷÷Ðr0Ö",‚"òÕžÂ*GâÁPý#æÁñ¡“-Ò«•×ùPg *´êÐ|³Üf<¢s¡1Y!Ý—ˆë$ƒç–oIœ¡Í: ”zomÑ…–;Ãs÷(ã2m{ÔRVØ\šèqRÇà9rŒiL›Z mQKÄ!<×­¾[Âjñ¦ZtÈ ½Dúân5ÎÓ 0ò:ÈÒ,˜Î1*#TzàÈ'L©½+"ÁRý“³Hà vf"¥]4‚<{E­Tµ{ÎíÇ&^¶,£`©1®fÓ ÒíĹÎâ9.îFùUÊQX*³G'ú/™û±ÿß•ò@¯Ôž’¢!]Iš]fåR‡OJ€Êvë+¸”ÔEm»rT‘Ú æ ã67%w¿`½T¦ñ0ubì–s{ÜäiHjV%¡  ;eareqè ÖDBc­7Iµ,9(,ÂÇÓ‡ÉO»«ÀkXœb&™ Ÿ_—…A­¥ØÉ™ÅrÙ=!/:®÷ o(gÔuÌŽíǯ9ùÌÚçb'÷и=Þu÷díà´VäòÊYÝ33®ÎÆ#²I(ËØð×™‘ò4‚+ n3ý3\\ýP¶%mÄIjsùBÜ Wó׻ͺ"î}W`ýæ¾ãÉͱ  ’ë·* IðøuÆ·©gL»ùE¯¦Bö†+:Ö¡i¹¿´ IDATÅÇ×T»G’ù€ÿ $ÍSÒ}¯ã­óùFÿöÇ}Eê,rû¨í¿D²?—µüã3KgãbZʽý×lwçÞîíÞ~PP²Óö¡ÚU<¨ÇCÊ£«×ˆoq³G²îcHS‹BØe®Ìª~M1ÑŽí×K ËEùòœ``µ"Rj³ :Àkó½éýÏ®¸Þ/,"v¼…ìCw6tã‹ÚeÅ,K;`*]6zëÐmÁFEA¿ÇÌͼ舨‡Žøia<|™´Z­¬Ž®‹"N’ "ÏÓá£CäjH–£´mEµ©Z«À‡ÿZ( ‹éÕ*ˆ°±Õ€ÝB¥”®…§Á|I5…Vãã)$ª¼¡!ò$u2R©I÷h¡aÓ‘¿±…O/°òxÿ>_Ç씘‹pXâ?8²ïÉX™4>6ÑàBGŒB¶"ÐéçÖ=TŒO'HKÈ(&3 €P`^~З±-ÆžmPj5íâ4õbÊ¢­Ð¨c̶§§  j‹ l•öºô:åÑ6îœñ¶ëùÌ‹}îR¥Êó(ŠT;$  `ôÔE)Uj[1Ô€6º™½l%´ Œûðœ9]ü`\÷¤­¸%%™g]R¨ëß"3 ÉY<Ž33™c ¯zìDª ÷µQn­NMóáLëvÇVFGsµÊL_ ï@f’Ž- –ì–3“˜zpzvº vEÿ;ì#qæYaïÕz 2Ã"·™™Šö?ጠ¥\uo’~‘-æÄw;Bôý… ¬%Ú°¤±óWÈé‰âž­mÿÓ)3£ä8/ÚmcñÈKœšFχ§ví×®kõb2è½Û‰Oרv2 §êaG9k7ùÜÂâý…qžLí8Ò†Sj¿š³¾iÑ>‹ÀØ/ÁÄMžK 9dÏû&]µðÚW]9ºk½]ÉÆ)Ï¿ôjF.³‡ûÛ6Yï±êMëÀ>wätgÔ;ÿ+âDVý<ܼgqvo÷vo÷vo÷¦ &ï I³((ÓƒR}ä ÏÆÜ”<Äì¥'}UöÀÌ¢xq™’À:ìàa•ŽZ?«¬*¨5eúדíG‡P#S*z·ŠÔn}ä­\àÙ­rh⋇àzª`ŠÊàU®#ä4ƒ†*38§cÒ˜]ŒýõÁ–®üRä1åç^)»¤1ÙŸt±ÿ|ý*2XZŸÆnÇ C½ƒå4«tØ“k­£µEå(WúÒ¹*1mýQstn¸€²KÊ#+²ôÞ°ã†0’^O7"0ù ul&Â{°uÔqNeäêÓk92™Ï^ÝŠzÚ Ïtd2U&Poú¹ºHº ï¦ãBSåÝÁò;­/&ì´×ȧM¤(D_ëêÝL·Äà³*<Ãä*S¥eŒŠÂC!¹cpŠ*8IÀù6AU™zY-BU¤2ldœg2K¬‡Ò\á?z{ T@.C¯R9ƒ4µu¬Q0ëÕ¬"Þwå‹“s¿ â\]ò„Šš¤â€Ž¾°ºrjk)Y8fØ8MÚÉÁL:‡\ÇV‡”KQ7%»¬’äÄ&JOU™Àžêe“ãÞr!b)2ÃXÚ›³åbÇ\˜“}fxøìIôK«pÙB¥ ½_vWœš[¯²\ÐýÞž3‘ëðôlÌä~ÙbË9<áïˆUm—$&³#dåV¦’ðül7XÃ@¼4Øh„ï`ö »ž'q%^‚ýƒIÃC¢¼§)4BL.|EÿWî‚Ø‘ÙÍãx pi+Ñ´t‚ÖÏJµá:1H¿·_¹ Œcr[äàš€¿Ôù°ÊuÈ« 0Ee¬¿/^,Þ E®ñÌp##ƒöÁœ+Z©¼0‘žÝŽt/®«»ö,å%½®É!ï§s~”ò°„°º"Ø}Óƒøû§äó‡<ã…×™[~o÷vo÷voo¸,ÊÆD†W¾ÒzíÐ;÷GT…Í[Ù¸Øtö¨—<¥Çp~Ê­K´¯´ ãeÃUèFÿÙ?º™i·GO@íAÔ 9iÙ¯v€¸4|œ38aþYÖÛXhà ‘ Ž¢KU2E¤H)Â2‹ìA3993‰Öö2%/µ"öœØò|‰<:Ç,µk3ôª—.:ç ™‰p€ï³™@aVÑI¤Ö wÂâ¢ñ¯õdÝ%P_ |m sÔÁÜ,F§”‡ˆJ»ˆÏ¸B8þ1½Dwõl5õ oM-ÖÏÄ!HhQ0Â÷Ð ¸`3TDÔ5‰µ±û$*àÖxðÜA2m÷I¾ÆÃY< ü¯ëµ¬Ý‘LTȨ£”¢òw•³?ÕõAÄœÙÑ­ ûH”Gÿa•Öj“³Kµô¶˜Ð]09Û±Lfª#IÇð4³‘zÒ­QQ8oáþñ¢êOSNßw\#ºþ•µ³»àÈ–P™Ï½‘8ÉÕ+O]*8&dç@µasæ¿Ð •í¢v±Æszó‚wbUZÌà ”­R/mêÊ •¾и+c‹!..jõC–꾆'É×ì+™×|­%T…骪`sµá`îjVG¹ÿøË¤Ä¡õZèÿ,­þFãûË`c¾4f£}8.\2áø²xî§Ch…åeÿ÷ÈžÑðE”Áó}T1$™Žž=t! d‡Þ"¥¥¿¦°N×a ¤C;œÕ;Úi'mFÔJŒ¿ºCÙ“xx:b±›±¡ÿrBýåп'í]…F`{ö~‹¿÷ŒÀâä3én÷Ôo8ÿ`U·xýDû”ì7¾ùµxË_é¯úÃ¥üý‘Ž,Þ57‡UçK¯ë¬ÿHùÿ?­2óµÝ§íÞîíÞ~P¨ #Ê̶E\‰uðdpà…r²î\Ë­‡ŸÊ{Û–Ö 1™<áP{ðÉCKý=îE¸ÿg˜×VÃxPj‘ç£g¥^Wu‘aªqÏpàѾ%ZíÞöê9ÅÅŒË61vF²¯=”àð¯—a^Ô%ºf¨,MÝî]úÔµ¢›­Ÿ"ýgÞ²–I’\ùÑ»ØíE‘†™W ··Ìlí {úœ]xf0!ÐÓô.kB?Y‚‡Þ£V†ùl§®‡VÑ«p‘Î:ZëÀP[Õ¥¾U“ÌgSwt¥ åx £ã`ïl;N„)ô™©gŸKcb¼Ÿ—fîŽ.qÌ—î]²ˆù'I¼[dâ[à=$ýv¿ÑÙ@É Ä§–J¯Œðÿ kxþ…ñyo÷vo÷vo­€oÏ{²Ò“iç€þ…F{Nq@êæÉƒæfƒî²=zH«(imºtéÿwí;p¸ÕWÍÖ1Ýín¡È³EàÖÚ"p!Rkû©R”ï9Dœ¢¡Šö÷P`±BÙwµ¾ÓU¡ÌYU²Mô°\#P£³ý|L,8!%[ðƒ=Š}Ífëp%‚°h-²*0tÀZñ}Q!ªñŒ$Õмm‹q–ÔÛÔZ39­(ì¼4­uÂUçl.æG56žþè¯üGç³]IôHV/½`p$”@÷|Ôv/é]¢ˆ¿„5 Âú„¡Jéý¥Nû2¨à†þ«)ÖFæ2ºÆ]Ãn’0LäŠm²AHÚøž.BІÙ:ª)¢`ÖKØŠ+ƒiÏ>™ñY4q &’fØÌ^Ž•1Úzý¿ìŽÏøÊÊ,H÷ÁeĮޠ ë¼çÎl54)UÐ žÓjê~»1Tq %I Nì©UžWþ<¼³ðN©úöºÇ ‚®ßn¹|’mûÒÊš;NŠô×3‡FxùôÁšÂÛ«éîYyý¸|Ñ"Xˆpጔ÷Y^Æ1Ì®#$‰ÿ1Ä uêæ}}1Uœˆi{rÏô1Áf–ZðÜ1ö¢R7¸|ÉOÛIXkZHà™=MÔíBÔᇠOe]ÜJþñ}Çq^‡fXß鍨†¸Ò9ûÿ­nŸwªšëS‚u ôëèî«®g üô^;÷øá…ûûÁ¸W›HøÒiäîEåôf»x‰—5¾‡qò*ö'·›ûßÛ½ÝÛ½ýÅ€|7õ:lÖãk3;àøÂZ;É¢ˆÈMcNíýrÐØj€¸ó×K÷!P* -Mþ5ßñ»}ËžŸÂ‡”G ’­©¥Yí7ó‡ÇÄ©_)”'¤Š”*å{šKˆ¡ EOÇe£±_q@u‰¢WVtKøáqœÂ%k³jX¿¨%Tá¤LYYk‰•¸0ì‰F‘ÍÅ6˜GÖƒEÁlÕã¦$yNÏÙ0®­½µÍzñ¤uš¶kø5¤ñÚÇØ¨=R µ$B*5Õ¸Ú1©”¹D¸ÄýœR>·×O_æ´C‘ŠC0¤½ÎBŽùBwíz´2Ôj?q!(ꃎþÓÓh¯7t\ÓŒsÓ/…3µÇ¼åéä¥N  Â\jÌ}uFztH]´"¸”š.\µÆŽÚzÚíst¥”dEZÒ– qrº]ÇÏ•MŽq[¤³uø4}æ©sŽ1ÕúzŽf\e ónæ&8I{¦uCҨݻ*Wk‰¿¶;a“}§ªA-)½Ž+U[Œ3¢^R¹âß$¥‹’‡sæi~Ö/(={»õò"ú5>aÝ+b©wt$O s®àË}F â¾²ˆË\³™=n6Oª³<‹ÜSsâjËÒnB×G—ÒøUºõ§V»áÝ"åžØÂž½V‹»ÏXêey‡JyÆå°¸Ó¹fß?àûÜZvùV°bRÁ²n3Y »Qá@ n…˜>9drEác`üÔptðóÏj¾J5ê̈-.ܳdf¤Ž“Ñ_ÒNGq*jOpro¦S¯Ø¡œý†ç’&’ÕZ~‚=‡òb¢éßgØÞiTœ+uýóýÀzþÿ9ìþ,NÅ[×úWwð—¹íÇÔë|kÇñ±Ã]=q´'í^ÿ£RËú<âʫ׽ÝÛ½ÝÛ½ý—jÃC…Rë|§GGŸú)U™µâY(5H–(ë›ÚciAwCÕek·Èž P)¬„¡º¡ø°b?ôþèvÿ¥Ê×CØ]ï½z‹à1Ûyʳ6Ÿ}Z¥QyªÚÐ_‹°uºaLuô)-:/[WÍ[;´žÔÕä”NÇù±ØsÌ´+ެ…±Ó‹Ãvú•Sï#È¢¨¼W ÃZÝf½í¹sÀ…“ìç¼>¤”†keäKc¯p¬]ëã×^#)´~X¼-Y £I¨¶ …™°:PfµV?iª´:@@WoÓnBE[ùS]Vk&clI`«šä®Éà(Ôùï¡‚ê;uâ´ŽD^BèÎ@¸ë }Žƒs¡žÍàtv:|c×óBÌL‰9 œœòQ˜À-ÚÇô RÔXÒ)³ªt4Nõÿô¬ÆŸA*+±(Õ'“Qœ˜ÓËá‚õ”"Ê“í¦x¨¡ié BP#s¸K=S›oÌ+KªS¤öŸ¥||ôƒ-¥7qºLç(x™*àÍ*{¡{ž(s!˜¡1KÄMÁÖn9†yÕ$S\êšáüðî|î2Ä»IÛ÷^¸ý “!ÅvBà+êTŠ„, ßÃ_jH$’I’•Ù >tù%o¬‡Ï\ºéDÍôÇxzÚR˜»áÇ`}æhž8KbuâWpRbO,¦NF Á3þ^²·^àý\¦Ûœ¤J¦áÌTa3 xlr;)æ×Ñ H÷µXL)°²ôâ#yUãê4Ê:sû:m_ý/I㽕¨ä6ýd2Šv ¨úÍ ÞþÑN¿©Y´f÷øR FÃÉY.ΜŸfsÉ}'oJžó:®É´ëå¢Rž—euP89Xªÿ¶é–ˆ÷d×þ†Þ9º›~~8}šþ¿ó×/Êçðe¯H râüsqçw!ø 3Ì«oL÷vo÷vo÷ö÷ ¥½Æ•*S™î$¦ôKkW9› Ó³Š<;à+ý¿–m."Bš“¥½Ph²•¾f™OʃÂ*å!ÏÒ"‚g*¦²È8Zê·<«Zº@TmÃæ; úŸá?C•#z`ë ¥Ø­SÌê"º1‹”qª¢%K(ˆ)3 |}q7«>§-TLñQ2)5Y^Ž@ŒzCä;Ê—‰>ºÆ”Q ©m†øz ÒJ#š;²”'ËNƒ%i Ðu²‚== 4êHç RƒÑ­ñÁÇòl,?ÈÜÓY+šGp7Æ÷Ã[IªíõÉàB½È€òý’ÖzÞš  ØÅ¼K`¦ÉÓG åácœ ‚‘_ÔÙž ®Ûe2'ßáfÀ.o_aª\¨©@,gAP™Í”Ž`´¥+Pi€Þ¡:zd=¦ÜÃÝë1™xkZzŠ| ¾¥Ú^i“B]›ùŒçì9â4ËÎÊcæ¸`ÞnŠňsJfy%˜°~Éž¢‰V”~Ÿs+ ¾´Òu3ÿŠÝ#/±9²J/}£Õ7¿~†kÆT.’Ýõ©È®¾ë®®¹RSf,»õS¡(²ŸðQI§ËíµÇ›HãŠåTüÿ/DÁ^þï|óNbu% Hz€¼|ì¸qbØÂíî©×žÈ0Ò<^k»«+‘•“bX.à ›‚ݰXöcëã«%ëþÉê ùwb[0ˆŠ]š+ñokfoiú6® _Ä„+‚ÐmU0uˆø¶<2±®x뻿`dëŸc“Á}£Úbbü¤Óbå}ÉüƒÈ÷÷è1¬-HÎ=ä'_ùÆ™‰¿ž¬›Ö?Jž”«eñ©ŸTîíÞîíÞîí¦ðÕ^‰Št뉒åIf†å )¦Ãt†\´J 8VûøòÎ?âôÎbò`ÁüMNÓmŽÀbþ%¬­Õ @¾cŸÚ¶ísO¥­=—¸vž{Äð†fX`z/ùqåc%P!…É1kмš•Rþö£Ú ]ŒAìôÅ.«k"îtY‘Ú0GÄŠÊ%D&Žëƒ9GÞìXXRŸ+åœHà^ÚJ5ºlŸyË:‹7†0*ªx„%ЭB¡Äæá B-Gll|³Lb­–Þgž]¡,î‡÷zw³ªÃÑÈú‰ÏÒüÍG׋ UÃ(±¦äP Ñá§´”AYöÁ(êLŽÝ-2CD:*}eË¡ÿ¹„‹Î šv"YЍ:ö™§µØ)Mƒ†¡¯Zë§b6LQ*̋պշö&'¨T•6*ïò(”¥RÊQ-8zªý—Ÿ"ß­p49‰È£tg!ÎÛYt¬…¾°vN§š>NãšêÆÑ—yP•€Q,¤c[½Þ© x¥Lç4X )Ó;eýfçg?YYdÒžsÐþKöÔ0ZB…ÀTn6ößøØjMc» ü2´íøà&Àv¥e€ïaç–dySH@ß³R$·rZ¢ØMt-/5ÌÂé‰âYkÅFw¿wOÚwvFçÈW93…3Åo&ìë•ìÙô*ÂYV>Öç%w7Âöô­¾2+žùa|–,mLùV¢fš'W¤¬c”Y³²ú A›°ÌšÉCM` Š),[µãƧ+´1ì.K6ÍöSó³«7n¿½JÉ”‹39v>]K"¼¸2/­E` ¥ïZŸSIR°ÍAÁ+üøäHy¾¯çþWj5'/TσhcÕõÇŒû_­0ýþöw­eø›Wáúؼ‘çå!àå»ÃUðò»wƽÝÛ½ÝÛ½½Qx´§z€°.+’G͘•ÖhSñͪt™½º3¡`,£ëä´ÁÙM4€UÔcïpÆÿ×”¥·àÜ*…*ïö»sÞ§°J}tbûŠnMå2Ä ¿4Ø;Œ>ü‚Kß«©ßW„ÚµÀ E¾…Uê ü˜‘¡pòÕ±üfRK+7óýºZåX2ŒÝ‡¢¿ª—nc¢uô´WsD¤R±¶i!µŠ9O#e G¢ãÅôÚ Æg|xS (G 6ØÏóC-­€Ú´bºàç€íãÁer¤–лX]8íüñ¿«ºÄ®¼Aµì-&eW{ב¸6PrëZ±Nõc½ZhÎðñ—žÕâ©€ø¨[ŒPëbL<øs+1-í׬Ù-°)ÅúSYþ~d«RÄ’Eä»k“WiŠô<ÑÀ¦îÖòÌœ:ÚA1Ñ#‹r àƒA€l©4ÂWÍ…ŸæžÝ×Õ¸'ÃÞ¼zå¬k ))pô(ë—Žá°>H˜ÓŽÃ|&€¡X´u´#° äM7þíx¦BË'€© $‚Mì^GF0F{gÚ7µ~ ¶£i€æùs`q©í.8î‹Aï|zSÄñ+ÝOŸ¡›'_Ÿ¥ž R‘ø~$ÒÎ MÝ­äGºFã‡ZÿPm_þ„Æ ØºöÀ{N—v@u³»µ²Îc7Qé$ÍLܼ%Æ©ZŸ¨ð &Ÿ*î#R É—Ô%ÓÆBþvjÁOØæ?e÷Ï0œœ¯.¤ëê×WSÓ±þ±èÀäV} CÙø}oJXƒ˜G<Ì’Dw P<­ö‡óÊ=æ}¥ƒ 㸂K°r·„DRƒgœøµö‚—¶``»j˜1 ?Îí ŸGdgºÓÉj5¸“ œ(׬/1²_AX.® ÏgÝ´AŠY¹œ½Œ5߈œÅIiÃ+:m8£³EÓ½sX®9ööÌ.lU-‹ú–›í7ƒÿN‘þ’Ÿ?Üç7þŒ'ê½_~5“`ëšœÜ)oŸMSã'ؼ¡íGn®{»GѽÝ[ß¾´Â}¸dÔ–ìªOËÃ5§6kfN߆C2‰Þ^Pa‚%1tßéúÖ©¶ÈQÿìXò¡ÃßR»ÿuR¾)%µƒl‘"õ™äô‘¨”G-Ó®7fC€µ/7 â*•GÏ5¦c:ц^fi®GC8±û@ÿò%"]/ Uj’Š¦Ú§žÖgŸÍPõ›»^‡ ÿÒæ0Æ„FMl0\gmSi{(â¡n•zŸƒ‡ÒÚ7/ô4TéIËÃ`±g2Ó‹õýÐÝßî”Óvo2P¬Ô©F7Úã@?áb*•⸩%TÈFø6›-ݽ©‰*¬Š“J6Å„S'å>6bÇ*èŠh‰R³ÙÉ,Ôõ±ËQÜê߸Í8-爪v´bŒÌÍ#rK gÃÿ+qÁhè•’ª¡—‚¢8úÌdö£ÀV¾W…Õqž]RŠÒ‡zó›º IDATéwÜ‘€r(ý»Ýÿ(<-Tü!"”gï-(Õ9Nþ‘×R ~ª*éò£×M^´û~5¸Lf©$óojË¡˜ÆcÂ6†çlƒâ×ÿì&ib­˜R€¢¢)lÀèÊþµ:¹x%kØHÎ?ôê‹+Ü€ Ä¥õ´ñr’€·ïaJ.Ÿ{®ÁŠ: 0·~þ«í![Ó»£À+Í rùJ¢ÚÅupŸýå¬sYB¤ÿ{eD¶§+Wn]°s¬’õÀX áÃaN–€MìÐÆÙi›´I6ÿ äÄ”ÇÝfˆOU‹g´¸ë°áI¥²“×à$³êÚÊbó| K;íB!d]gÂz°ár»OÜ«¢&YS–Þœä…MŸìKòëÈ\êÙi8<.ÅAï§}^hÃK?qñ‰ˆ“2ÀŸÁìøÁ€áå;ñoR9z+«nWÿÄdzgÓiõg?­ ©N¹ü3ƒõÚÄòç í­œ¿·{»·{›s‡šÞ‹†”Ùñ>0 Í©^@*¬Y»k ©#‡T6LËÈ’¾d„4µÿï¦]m õÚ±øSEDä©c?fzBjô¿ïL­V$¥Í‹âV3eEëÇ7Ot˜Ex"*ÔòF&¡nTÞë­ocìêW‡€è‚ÖªÖ™ÙÛÉpÈT]'èÅ2èh½LÆlUÇUÙ´LÙ¼ëa´Éº½¬R«Teá=N ¿»¥ÏCø~5HÊé¡(üñõšß‹ª‹ ?0·ê¸ªó¢Qï|ÓOÿá‘ñÙQÁžV-ø"%/V±>R¡ ­xèklKÃnÐÅæºÅñë^¬©\›,Q[ù»Œã±(Šyé9"XZi4<|Ÿf…Ìú‰›è(À#”6iüñC3[Øzé´3öLè66¼,€Úæ:Š ê>B§ÿúGÖFóÛÿ(ÊST½íð±ùê#qt ¯$êÎ̽ÚÒˆÎHg S.̳Õzm¸+³ìúïp9û<ßF£˜rÚÑ92Mkr&[mVæG ¨FªZ4»èB]äØb‹y”ïÂ}}ýÂ=Ǹ¶þaؽ"±yæ1„Ý"ÙNö²wUfƒ€{P›¢=&&!ܯ›7†éý¤/† ì—Átz£WbsfVQØÎr°Ï_[áy„×'·‹„‘¯="Wfo—*ÿÀ^üOü¥æûŸÅëØ–¿vÆ^ø’´å7}aøÁ~ž¸¼n_þçïŸë¿uÿÙw÷½ÝÛ½ÝÛÅí‹ßJÈ©0õúYI›J¨Í@û@§eê°S dPsÃÅcC#$£äRÙqF…Z'·NÙ„1Bæ<åà_‚NôºEÌÌVE²2~2â¥ÓóB»KCû¸E $T£g¯(K"H9laJCt.´³Àè:ŒM4ÙìÆâE•v6‹@*ï…áÊÒÌ£¨žeÊ3j5˜‰‹vïqËT%9' w`‘Êf‚ôÐ'­6S éÃÂy<ÌAQM˜‡µ‘-€º¸TròfÉ"4ŒËt¬ÃØã9>4ãÁ¦Ù¸ QUVØÉcÿ1†Ä晎Ëü.ƒm¥O~ZBT=¹7é+ ¯ª Ùk.O.ÂÛõ@ > ª¼ÑþkUW ³³§ŠŠ¡†©̦¦b‚ˆÛxª3ÀY¨ÒtôÃ…ì8íµ´á]jóךž`q5žTùLštÐȸ/Š”Ò|ðžÿ–úlæ?T#¡%`Bü£úrÌÇñby—y>&þ‚ ª(ëZlœƒ¦Q³þõWŒJóÊp£J›½A[±Î9D'‘ÄWLópê&˜\é[Ûki ÓÀ±)¹F"ë¨ÌK«°WÝ`y¶X½¦æ–ÐDµZ»¬ÄѰ Z.æ(s–¤1eÑ<±fúÌ•m‘W–æËseœñ²ìƒaãÞ®rS%³ø ß0mÁ ©ÑÜ f=’QÎYÉ&’—Wi,¸O÷=²K  [¤DžŸæ(OÂU#ŸƒKeªødAv]÷åé_ùO‰âÞ[+ÌGoAÃjòá²¶º¤oñaÄ`ü¿ÓÞÆð÷€Í[3·°g2…Ù”’Þt§jýÑÖŸ{dê+e‰ÍÀ[ŸúÇòAþÁ_Å–;¿v¡±{/Z¼üYÿdØä=sïQ[¼Þàrþÿ3‡ë½ÝôÿÞîíÞþB@þíÍÓ¡:è'ßTQxñàû¥sÉÃYÂn„“ 7öÍnß­}*I|$Á¹ºÉºú´¹·”¾$_¼'¸ž¸ü%‹ -b®©å®Xør»Ö»÷´Í+‹£ßÐX®Þ†é—eÚËŒ>ZÞýõ ŸÃ¸¿ä<ïw˜KÓ<¾z_ð/ ¼Kÿ¾³ÀâfyuÄüÓþ»{u÷(ÜÛ½ÝÛ½ýz@þ¿Žk;ÉuK ?FØì¡§~Τ܆̴^ÉÙ°bªný³á¹ 3ÊàÞÐ4¥¥-h1˜MÀË.§_=µöLÈR¤èí»3åãèþOÊ—”"|  ­WH©U EžË:2(¶—…vtx¥uù¨“޽³^½PÇ:Í»‡ŠÿO‘ÿ×/\±‹Ûî›S;û†sÏÑFŸ‡îäëáé´PºíIo˜ðäË­^º_S'Š=‰Z&«mÓûrû•-fF…”f˜ÓjTUðÝy½´àN`„2ë€õñÐQ½¤1}bY¬Á†}K> Åzåëu µ!9LÜ¥ôÛй‚ Õ6뛺÷¶§yÃÊñ|ŠéÞõa29ÍŸi2ÊÀdM¦¥y°¤€È‰Þ¸§ ün8 ¤é×ÈÊB±x¡©Ôƒ¹ŒŒP‚Ûò¸‚öþƒáê¸Û¬AÖh8 °Êsü×2çÌÑ0¤24ê +å˜ÕKƒa–“쉿-ôÎf_e>hÆ\tÔ0Ö‹‰-GÁ©qO× Þù$´L!šr(‡:\6`ÙÑç»]–q/¦ÛâÌ©Ÿg«>ì‘÷Ê•+@OIR’œÜØ|]^9}X"ÓË“µLUíFêÙÍÛñB*~öð$VcS“¸˜p¶¦öæi4ƒyÏ. ³5ý1 dgßË+¯tâÉ4Ú’–Oý¼kum¬'êÍss‹­†lmIµ¯ª¢†.SmEgåJ¯8ÃéÝŒ7oÜÅ3êÍóûè¬ÃÅŒÃKŒ‰g™´3$©¿p§2.ßã¸-ð*ò£+f39°o˜Ÿâz<ëÜrÙÑ`þÔuè/°Vž•í.>L~i·—ó}¶"8Ÿ%xá}#=*¾ðDýø™ÁG>ÈKƒ7ý–¼¶ýç7¾þzso÷vo÷vo|û¿úzàȴʬFjŽ@V›)ÍžÖó]*Ò!ÀC\_8éüqŒ]rs¤Nñí@Ê¢¤Ò¼P: ö`å Œ)oñª_"_‚ÿ“R€®ý?<µŸÏY`Ðé—âdÂôAŽÓAj?;ç ætš JB¯°uvåXè–€í9 @Žð€"xˆòï\¾ÏdaØÕ_½XÑRò­=áoœüéSzo÷vo÷voW¶¯!*¦¾4ÂϦ¸/*Y±;5Ó9ÕÐÄšM 2¦k ;_ŽþøbÅÑ&¨FDJa³¶¯b؃¶Ú1fx‚Âÿ“*̓"òù·È·àÿI96Ý1†3t×PíV7Ì<áé[Ýe¿ÃÃDCOÒÄ0hhâÞìÔ€3xqN»ƒl%¯Ö÷Pa^;Ú‰ª6mt'ôLÔ&sk©‰<C9½Ã¿}Ô`±mñ®v™¾=’7nSEû"Ògoîé¿ÿh–G|ô£¨&ŸÙ/uè£ÅðöfZR9ýy°]'CÖíðEAvëðø²h4û£åEs^6ó÷Rçš¶v¿)'*”Õ„~«Ûª8DÖ`øçheFEj7#ÉiçåX¾¶ÒÊÉ9ÇôÀva Ò¨ª:_1ùz 8…¹U¯RÚä‘+|„ÚÝ×ë(TÕ)Òö¤ÌÞ,›í!6 CæXL #Íòà úÁЃ]¬5¿Ê­fÔ± A¯êì8`›T4Æ·ÇÆ™Š:td³ ‚!ŒÔ•³—):MdïLrºžßK¶!çqùÚÏf¶3­šÄ¨êMh w¦Øk£ ûg¨âì°©Ñ‚K ËsžÏ³O]@Y¹QÒé:¤tŽ+•˜ÿ†#Áé1_Ò\?ÂV\úÙwÞ‚$˜éÎFDû’ìÙ#ÉÃYªsÒCà(-ý;éÈÁ%à‘8ò9—-‘k7’Bí|ŽÍwl“W“e‘ÍsX˜¼A‰KúI“'pýÎ4ÿÉ ­Lö-‚šŒ_±Ä¹>Çn {ZÐ@~~ƒnâq®ó;i»làŽÍ˜¹·× ðJð§µÿÙ#륇/¯4jðÇÔøCîHHXø&È&ö€ïÜ>Ÿá~ètüÖGÂmi¦@ÃúUðo)U¤²|´‡÷–"è¦êó©WçÙs6æ ì «EPzÞÀãž-AaàWÿ= ¾ Mòð{·VŠ­ø>Ô1 Ï~MD\k-2ŒìµMÐè#>º †°]o‘gë*Ðè£DÔØ*ÍÂOÇDÓöOHp{Q®âzP¨˜©Ë'„gÜ­ã“ó–ÞF@»zŒ‘›Ðyú}l¡ÉÃRg-„Ó+ÕvßutS¦=âP=R>î.+(j‰¬a=nªsi¦U”$vŒ™ÙvÐwØ«ƒ•æ.KÅn®qgØÅ¸sñv4Zj|‡œÕOmßVbafF©µGiÝÇùQÄÔJ®©­‹WëjÂì Ñë4ê{ä1ï£öÇU%cùEÝ>kî TYMeðêyÞÌÌÖgŒóJSVw–sº®³F;´´>Œ¡ª.Š2Gò¨}j®„Õj-c[qýÀà8?b¥ýÀsS“òA‚êf»²zÌ—Çö¦ƒìéÞî? yGw&ÑB=”6—¶*Wè ¸7©nC’Óƒ'¯ú@=å …üt ÊÎF@½Tÿåu›ïSÚ¸§ÿ¯j™¹»ÄŒDiÓyI°¯œaœY]%ÑÙôGˆ£è‚M $Q'pŒm{§ðùeVX4ç3»"±©‚+`|PpƒT‘dtÏŸÂÖ* g«kó|gXÃ3TlÊ¥ËipbÕ}ëè¿ñ}Úþd»òAå>>Â/pºÕ9ì”ûÒ1™¸›ðýÖÆL%óÛ¿øÚËøÀ›_µšóþ±°™ú*Öžï_ ¼7N~y\ÝsýÝÛ½ÝÛoo_¤Y]Œ÷æC/Œ"ò%"Rkó:ðEyñ˰@±-´¾ÏE¥ùQÙ°”îëB%ãêŸÂÜ\ûìvÕý/«–·c‰,í,c¯Š‚ÝUjT)UðlºÔRÀð:ö³<:+/3üÓ@@ÚD;D0<¯»z;B[#•ޤm€°ö^8WÚ÷T-lϰfdp²È!ç5¥]¸jgaWæq<1ê^!K@æ…?U]ëÃv&¸áìjµ¤œ „ØEy•è6—VùÆÓæ®C’ýHêq¬¨4µ¦!4·Éô#<®(ɦn% psV50»j8ìq†7ŽõŠƒüñWåå0[çÍ£…oÏ–u¦•¤˜,‡‰×Ñl¾Ž q\ñj[¦&R§—@êzМ}u*»å å(Zm鼞µå£ÎÝUYÖiØ•èËqFŸ¾b*Á ލÐ%Ë1£i•©§¸V•= ÉÚ‰?ìÊÆ§òdNV˜…[M¿¤ä+ë0Ø MT{MtB‹l×ÓºEAÙJ5WÆè×ל °¦Ír_¡wRöqÄ×¾ÌÉ dmÅŽO/Ú¹£ùúaMбE3K‰üþjB6¬ÛÄ{lNòÚÑHl-¼hy9pB=† ô³TPªÜã@û®81öFÀ·†I¬×‚!Ty}òWƒŠûGC$W=ûæÅH Øf0û½@Þäúa õžäŸ('à¶î2“ñ;gã~[9ã‘‹GäoŽÄôˆÆ”)œóÕßþóÞÿï5©»†¯ïRò¦$S½„ß»¿xùÏð»¿po÷vo÷vo?ܾœÊOû±¼õxç~–`É-M@ÍÀÅüC±N²| ¡ÆJó$âSÃŽ¿ˆ1aí8É.· &®ÒÞ¸P‰Äzô ܦ‹¯Ó¾qg‘úÕ>õ¥ô³,¢ÌÓ)&Œ•^wFñ)£s·»yNûNÈã!øj ´'Ež‚gf1¡ŸôòÒ2â ]2§tm=y ‘„+ª Ãhf!Ïz˜u÷F_‘6úò˜qøƒóˆM~6%øã¨µôVã¬Î Qdë¦ãÄ–6 '‡­ TéÇä‚,X#c(y8­!¬{>ލ*‰ôW ¼ŒÖD­ÿPUÒ&ÄD³ ¼3Òêýê8‹Oç†?¸¿òÂj{ËSYx9ceÝÁ阣š+À©1Êz¡Ž3Fx©NwÎ,tu}H¢ÅAt#Q}-€…ËPÿ‰´‹£6‰áFå®Hlb òò‚2x)&ÖthdG±àð.öÇ4Uk«F´F¢Á[Ñ ©è,d† '°[%²Lû5Îp`ž­CôRm¾KY´' vR2¡,ãÔ}C­ÝðÐqÍ~”ØìWSªüÆŒº£^5Àk÷ð6ü°p}Iñ½ŽÍ@0~ÙožàW{˜û%×(íŸ/bcen»ž…³¶KQ)O˜‚,æù\ÖÊwÉ<çC‹¯Íy—ðýšé_ÿdr°Š‘ø I˜°h¾qo<-®l&ekL¿+6‰XøÑŸ2úˆ§qõ\ÒM’n2aþ$4Í…6-IT'"ƒ?VQÜþcìËÂ͸&_º³ ÖFÌ?ˆô-g}cD&Áâ »!¼Y±Ÿ8>—„yþÑ_æé#g)1PâìÝÙx>ÛüÄÿÚ.ÿ>ý¿èñŠù[ÍÉÛºõ¿–ƒ§¯+WS4xâÜxý2Û§Ò‹GýZðÆEmþÂh¿·{»·{»·W·/oOÑß)lÉ„LVS4]DN„«oƒ°2çñˆã ¾ë[Ò8 ºÔ™‡,K4£ø“ÅóÎáJN.çx£:i2ZL®4³Ó@[¤•Œ‹¦ö<§ÿ¯17 -b çêo]‘½f¯;{}tB!¢b×bK¼u)Dˆy-×,Þ ÿæé¯;QJ® _cxÉÍÜ'O l/:ͼ]t_ 3Dnž)´ö8ØQ9–xV^ÂrØäwóÚÛÍ¿RpwQÜÝ”Gú«ÃÙ0?‘îɺZ¨Û¸×;‘½8_æ{¯#mÈkc¿zz~òÓ×O8³ðÓHdþö\¥ÿ/|×/T¯]­?7D°È‹ZN€?dÞvuÉŸ]Æ|¾’Rƒw÷ÿ¦ÿ¼ÅîíÞîíÞ~X^%P+^]ùîzXíÇj•Sƒ0‹¢ÓnEQrærÀ©§Me ¶Ã–}Î ÀŽ®æº(d?Î9´NøfizDò6ûéN©½`²Ž« "¦R{E!ÍéÊX´Ñmð]¾E¾ytÆÝ)!z±!d+†£«ÉL!¹:î׊< A¿ IDATº Žÿýì¦ÏxPTžêÈl°2NŠñ<å6Þþ娲t)ý£ÛÎH3\áÄ“#ÐrðfVÓ{5 ¡ƒQØù´·ÐŠ>ìòµ4Ø­aÚ%åIÕR«ßpÊå<ób†‚žîÑõ¶ÃÙOVü˘vÛN/£1J¯ŒA4‚¸‡‹­œWMŸºã{ˆVòœè¨=éÙ“ž%D[ß”ðB–î(¦¬â0œ ïiÉTÊ\}O¼««Åcq±Y&pç˜ÇzÆ;9\üM0µ ;µÚ»gTüÀ ˳]mµÀvDZÔyE¦O×Ñ£ãÌú aЧ÷}ežÝ¡Š®> •3˜Ì:Z€ªPê¼Jáj*jØËè ³É¦ù†~©Iñ᱌;áÛÕêÆåŒ´>{Ó½mŸù™jf¼¿Cž™<Ã^‹}„7x²ƒ¼ÜB÷¸‘µ1Ág+j¨:¥„GÞ5Úr‘ŠžŸìð–›søê/–Ë\;g›óAõ'ëNç2G)±QúÀ³K¶Ò{®KéøÉ?¢§âp7ñÈ„70}U\þ­j~¶Žõ™Ÿ±ñB=._öÀFxe¥ßF]­-3R78f/ÃãÝ ›d‘ £«®ú{„Q?!¾v²¤¹«ó§Ýêè_Æ^㉧ÝBxw$òÅzf(”þÉðâSï?eKò0øÏât'g‹ýäŸ=i×žÔøñØ>í}ü­ ç¿ûÓû™±ágì´k/Ne÷ö¡ËtŸã{»·{û|@Êä)qíJ­-­W‹@‡¢¼t‰ÓšëÅ ³Øt ‡onøCÍ:ªŠ,ÔQ´¨ý©ÔQ5à­Q =â4ý—.],&ÈCš ½Rʳ€Ô.À„2ÊpîÆð‹"‘àäsпÁµ«à°Ç¦í_"_Jœ®ÅT,Š•Àšoˆuô LŸý¥]8jÑ4»|ù·E±G òcöCÌã±o Ôªó‘ô sï ¥E£#˜·¢g´– 7¦‘«ËÆ»C÷‹c\uøP%Ó}zá ¼¡áŸSlÔðµ7BÿngËn@AeMÏAÕ•õM~«B³Ñé|µgþðŠyÊLÕÖ)ÜTƒ 2³ˆãûVÕŸRѺ´0ç–2 ² íõ5ƒT@ ¥ô¤ózÖè ÁÖY”*ÐÞ×RÿöÞfYrYÒ4…Çm™Å¼ÿ{ÎfFº+: âGÍ` éçœÈ¬¬"¤¤;o„‡;  ð™™ê<í£ûÓ®«\’Öá §ø>šëF›aµkšûy/™ìR¬s<ôBB•H-[G½J”àìW¤ '¦¡”QaÓé$96µÌÂëvëc*ÙúÂEz˜[uðÑcTÞ>òºLh·"4´äÃ&o™éõ½r!ážØ0Mq¡1=beéTð5pªöä^Q7ýÞ€.S8ùY5œ‡¾+ƒcÊîŒ Ðj:>ó…ÖO`Gö×q.Ù ÎòWT§ Ò¸ðe¶Ï£ç¦ÓÂãÇêý%ÆÁµf qÖ„õjýZ~ùP›êlÜw’G?êCÕólœàÆÔaÆ>5éÿIáð¸ I£k™¡±V°ÍG0 [Wj‹ãÇý婃º]°Ö@ŒxQƒ¶ŸæLžin »“õWÂȳoÿ<÷°±èhÍÍÃW¦Ïݲƒn—ˆ=ýõOï" ˆ§•³K]‘÷Eÿ úþvÅÐÎß짤˜oÒvàÛðQ¦<ÿ<ú¿úÑ¿”Ëò‡ûÿüUCÿiOï>íiOûËð: î”T›ÜM“je"Åa¼"å„)ÓVzxM¾%­ÕªY-?–yöXÍŠçJ¢¸í¶œRপDGCׯç«å¼ÝôøH9÷r„#ÞPfÀ  Éà¢6eå%v.ëÅìè:˜½{ü¿ ÿÿÛÒÕùKL?RÔY%÷ÞOHú¿ ½ çùÒ)6´\ÌŽ[¶fH€Êv¼|¡üñWôS:|CaFøa è«D~錵÷U]4j°ÞÕ5˜N'nŸª~N–¡ƒX½£û¯ª ß0†%fyûÎÚq™ã%¡!XÑÉ%$’K‰šÌ3¶Ø<@I{Z7§¥*}iÉÈœ€E~y$˜[Oöì8C› 5UÌ‘?ñè‹l*‚xCZ8²0è¿ùظÈOo2’ˆi±:yæ"CÆæ½¬±ðh c¨ÙuËå×qU%Îä%z ÒDµc„ñ^GÁZðæD™„ʬ)9û¥W<¬§ý ßΘD?œŠ„\!\)$™‚³»¦Q0¼U± Ë ›5Â*!·€å}7ꢆzáŠL®å¿_Œ…Û·á_Ä›Ÿ¼ô§=íiOûh¿¦–t[ó ¹N}¨Xsm]üÈǯ¶u¢Ãª•é“gg¶5¦ÌË»#Ú—"T…¾ Æ ˆ »ðb£•ê±Ng.õ€M¥»«ùþÿš'Æ–Z¼ötí ÊbÈd|y]0Ðt!V-ì:92KKše5{ ’óÞeíjúPE§W°NHæ¾ô¤þÇÈÙ?žzÄ`zùE8=2ÊiŽm÷r˜œº8#V99{Vè¢8ôÒð^úvT ÷’#Ak€ ‘P`I$tãºÌš€£À*ƒ¦X• € ÇzHqŹ¡xIt3Ö©põËDÁfMIVÿ Ë8£|¾ ˆ¬˜ÚáeFþ,È?pÚÒNë=ùË*$à ¸AÚ…H„¹‘Tû…t€ÒyÛ>JàÍ΀ †Ò=J§Õ ¡ÇÚ+¢Ž{X³×a Μ1h«Ÿð9œÊ´d‡,æ#J®ïß–;›Éûêèé’ ý2§èÂÅÈã©U·xví6oê Õj ?Ö+¯õ07'ýWçjÓgJüË# %PMã‹î̇…0ˆö,ï¹æ2½Ï1W·gpúÕÞ ÷µžJ7j à••î9Æ]Z„õ›´}Þ>~#cv\ >?æ)ùѶâìÌ%}›§Läà«“6mÃÎoË’à²ÿ±\<“_s5;Éø—ä¼®o÷­üwûÇ4|bÍ–ÊX•åÓëÔ°"óQ6ö$II²çµ’ïÇ}y(Ûk]BìŸÅ&6 ¾J¸bgÉw_™odz÷ÝÑŠ^x0ù’[U3Ù*„ýòrò¶[À/q7ü(¯Ó˜7¿Î^·ž ÿ4Êÿ×`ßPoqFо^Êvâ› ûÉÞÿfÊßKÿù'òî/¼Ëÿ]ûâiO{ÚÓžöÍÀ”íÝó©»méàû`C¨½AßÓ:2¨K»lÜõ½‹™«0ÍÔiñ¹Þñx#¾©·Ft²\Ù´æÁÉ…§cmgÇ*g¾ê‘?,y[W˜Õî…Û4¸Ñx¨rRƒ«u€ÊwtéTå§P~1”&]«y£M½Ìsæì4I3`h"{,v¯Ù™Š’q6 Ã{yæá*‚܆`=KFB~zÖª«ÀÕ’—Ó¶aì‡zEB&¶x”/™º1t¢4!©3&ËÃÝô 3µËÈè@ŸøÒ¦ú…ºîŒp!Ô8gL'GGŸ¥lk„ÕY²`r‘sZÕ<‹¿Àå&“ž E{NUôãê™Õjí.ÄÖ4µ¦]³IÍL· ÀYYŽD@” Sø;yî< óHPÊbxÁš,=kLÑÑêð'ÂÙ©EÒð‹”›°Õ1(õˆK4P%‡Ã|xÒ¤:¯'öžÍˆÂÄë´Z{Õ\½H ¤øÜZ3¡ÂY\ALÉd.-æç3ƒHXöPÛG–œ"§'ϼąqžzF-1“mŽs¸¡ëš&“æVût“¦Ê’{Þ·AT#ªDõðäj¥¤v3+¹KwAžv ¶°8y^ôõOÉ.8õ[Iy<Ã?sš¤þœÁ"å”Õ^h%ï„õÓÁœÆŠn䦉¢ŸÉ@ï¤[¸Ÿk&)Äß !XÖ3çÍž 3yÝoG\N=—nÁ®‡o­„æ_â!^?ë¸Èœ|'g¥i]ÃÝásUCoŠîv†%»—l@&oÕwT¤l-¶Ô·ÓuqÌØe$Ò¼NÉ%ãrúã`¡ç“Ÿý§"¿]­h+]†«éù 6ËŸë½un’ÛðÀå wV*$Ç¥¯?}Ü—þ‡þcÿþCR÷ÚÓžö´ÿÒ&32ÍLg iyƒV†â|ç×Åì)¥ 8ê3›€¾ÆŠ-Eå´jöF,O¦Ò`Îsx¬Íc äñ’ xqEÅDÆÁ °ZºQ*–½µÃZÝ5”ÆG»_k±ž²«¢4t©v)öÊj”it,.ÇN«Œ¨Fmb £½ýhi¡‹5sß|B–¾…M™ª‚ ÖäLÍ|éý,ÍHx¯|*M'ÄóZ®‘T`Ên”ë«`ÍCI¿¨ÒÔª6ã±ÔÜ C†}•Ê}ns1Ó¢ „ªÓ«.,zîFÑ ¦Kð–‘«ŠL‰y`3ꢓj"£T¤ ?Ä:lQ‡Ü“G{1±XŸg®wµêÚACßò èç†1©=¹ˆƒ™+1ê4Îu@ è–(—'[–{w‚˜“®ög]Š•Ò¬hÞ™sâhø"¹C 0`Ä>e0çˆýSgÔáR&²Ûý3ÉÇ„±¬šì^  ‚º ‹×ºN³7E0Ù¦‹êñ½5=–ò:KNÍ©x ;ïN¦­S- §²<=NŒ,1y'6㦻“vº~Þ”™ÎŠ]jw0ÿV®aKFT…î´Ço?ï°{7ˆØ{+hÃ>Í{U7~x’?²»ï\äž¹|2IêgB{m5ÑU Û—S ö$³Æ}æÜ€ dc»I‘=²cÌëÁ³nlÄZ|Y­ã‚à Ã÷$ÏEuÖÿæ= ,lÕÛòçµÿ*XÔ‹‹£·ÓÒ7Q¥uê%‘?†â²´nÁÙªÀ=Fþ±&®˜2¯brû0@¢™Fž>­Ç¹Xœ%+ü— &øïÛÿp öÓ_ô‘@Ü_Oháw,Œo œ_ßy<€·ïó ‚_¼UnkýHÚ=¿÷oñGŸ1oõçÓžö´§=í?*À²dŽWã»Ñä&ûӌӌ?sl…˜ÑÀ¦p^Ò¸\n;&2;D-ò÷0¼Úxu¼¦ ÎŒ|ðb,Þ©˜{8…N‰ÂùUWHN€>ØDÕdœ×é$ Ȳ‡I¸ä|©´ÅÌLG£Ræ3ßj+Õ*¦üËñ€†Æ(\8üœG@ÂÌÕû»s¯¨*­^ 3Ž[yX µ[û‚>N¯Òû‘¦TñG9¥#Oü§cªw8Š?Ž×Q c…+LÁjD©WÊåä#á¥Ý–Žrnׂ˜Ê.ßOOp‚¶>b±WFj³ ¼ s|ø”íÍ P‡D ÞM»I©}ïœújà>9*‹7Ì…©L M2L@Oo¹bN¤nGi,å`Þ?£¸¥êlç-“-ƒ›¦)¥»‰ð} ?³WŸÈUõ|†Åš{(á"°^Œ0ÞB 8Y¶ ¢@*{t)Cn¼œ ƒOù5ÓTe,èù"‚T5®±ÊXC÷&™˜ðê@’ÃŽ!‘dá £Å›3;ŠÇÂ'/|”œôv@#bA¡ljQà ÉûÙ!0;h÷ÎÛW_.‡ÿðY2 ¥•ôU–è)EOZÞÔ¶%ŽÂMÆß%}suE»°óÜ{D<í7X—bÄ-Á”áÊÞ5g\à”ª\+‚ÃÉ'¾Íwn$äCàJbå²(!u0Z­w™/j6³þ:¸PÔ‘ÎÂDLÌVM$ž™¤²*¬Ùk~5N^ˆ]±ãN-!?ìæ=þîL°§ZÿîºÓùVÒ Yf¦ÿø x0=z£ ÎþžÆžÖÓ®¡t`$ø'ñQ«ÀA›õÜ;2ôæo(Û‡Óê!E¾3ôԾї×<‰yã+·ÒZx9xkG“4§U23ˆáhS‹‚½8¡3侌›³áÞ9tÆÓMÕÊHÏÜ”’ìV-žq…\G0Ãë5HIš† ïÓº°æá§M¯œ3þa5ÅO/NË„¬´T²œå.ù2)­D…3<½PØ:Š(p=ã;|˜´=”_ úó?"PÖÌzgk ;†ÜÛ¬ÔÀCïsZ­ÆÚ ~ÐdÁœô¢9ó(î9RtKiP"2¦ô˜¹¢¨ÌN8"öbq2(Îhûˆ½Ñ çXur[H”ǃC÷§;Íå$¦¢‘ÚKèSne:p]­Ïû,Î!/æNZ Ï…àTàžQ¨ýòXë’¦‘°z‘œÏ–o€øûÿ;ÃóÛgÔ˜ŽÍ ±Ý>îæ‚õØ3>»=!Ï·“›ÛT„øñŒEñZ^åŒ`òŒíblÌ`8÷®8^d¯Ž¾æÑ-ò"•“>Ç5¢öog$¥Kîò‚z2~Zü3â¦c3‹ îêcnÌ2,ºF¹G®_Êò_»t„Þ<>ü›—›Ûá²F¹?€å¿©C˜­`\ŸuðšÍŸKôK¯>Á‹wóôá*¨ eß4u½-Î=?7Nw.à &«?B ¿FÿMPð²ÿÏ͹¿p›—Oåþÿ¹g€Ííö`À½¿%i?xèÿÓžö´§ýð»™²Vê±—áÏ©N²—ñÌ~5úo¯fñH´­¨«d‡wh‚ 6hž™Þ‚?¸ì*Ñ¡.ƒQvi¡+GZ·ö:_D9mR]ˆmÑÉYÓçÎgdÖ'Š×t n&£hâ§~',r™™ò?$2jgað¥Ð””ÞnõÙøZíf(VºE­úÙ ðìøg¾–B³€¹dà î<`K×,R?LxÙKôÜMâ %ð"ä¢Tnz6XÓM²n«ËáâP:/«3¼¡&Ãá@HŠÏO+žé» ‘§5HP[•ÆÔŽ/¢^â;‡‹ê84Bº×D›[5:T´Ä¼œ½‚¤8ê1q©#Å©ò¯ê.k_*h¾Š´˜NF'ÊHè Wî‚éæE8Ê´Å“½:ÇÉ8GMsÎG0¿Š‹8OHgöÿUí_ïÖ“E‡MµJ{÷XàU³–yÊî&Â^¨4žo35QYƒ2$­MG5€3 YÔöM1wY“U:_ 9(%ÇÝÕ± “Ëh‡Ë­µe¸Òa2ŠvøiZFw+o®.–>>Š+fºfªòzÇEìØÌÚëw<'-ö€–ÍÅz c÷N½¼ ªÎé-NaÙ>CŸÜv õLòkÛ?¾[f¸ª¦‹óv:q(AÖp vö0y8!|ëƒFôá˜P¹iC¨É߈ð]Àkž oykŸ¸³¹¬ü“`Œ ìZ´74æêE?‹ÅR(û¶\ó)s|-¿¨…þÛµ¾ÃÙôùËN;®©ôóè$$Ì+zø Ä¥¯ÐÂ2T¢AH*U—ŠË…ÆfB‘÷Èß/K†Óî»uúàËZ'vvúfaþÎú4>uN»ÿbâ­€8 ýæs¹^§}*X²bŸêÔ]Ë]þ|@ù„ÎóâÿcîZïÃYƒvíÍÓžö´§=íOz©;o³_f/ÉäÌ Þ†ßÆ·½+¬Zéaƒ†¼_V~5æEÁŽäÐ?þ7~ýàž.[ªä»,0%îλé ­ÒÖ* èöý<±f5§@=2èËÁÖ{àaÖO˜Ymœ}\EÇ|ØŸ6­ÁÞ ¶¿¡|ñ9Þ š…=ü;®Õ~W«JÿÕ+ÕŸ‚ôŒ”ô„J|ˆÌÈH^§„+ÙñÇ•WLñ „c±h1ÿè…›™Õ úEtBÛèn iïáÓ 3{axwZå`‹ÉIÝa8ð ,‰ùèuz) óÚ¬²Ål´F$œôÝ0)ÏŒÇocôßnE*¶á_¢Bsüäá•ý¢»…æŒ]œyò7š—JüЀ>Q}ÅõHßxÄÍØ¢½Õ™ûôå†ÃQy|à-SÌiq»Ë½ëɸø:姆SE…½ÐeÖŽ]ŒÕøšókDò未3zª¥B³ð‚ÓÚFxé1€á\§æOšX­Þ‚!’³ßzXc`ùø»§76î_æB3Y0ÌÎÁÅį8[µbŠ±Ï‹Ÿ1¯È¤®!8Ëí»¸2öT1=;_A¢€D\8OdO«JŠ~ì´jƒþƒI€Ër=É‚¿ƒ äQÁt2gš ﻩõ]ß|?jêîŠûÓ‡¶“·2Ï+Ïëüî($§§’ߟÒ3AsЂ{ß‹múvm™¡ ÖKô”ôÉ Xá ˆœ3®Iœ©y03O§3‘h¦ƒáDÐlŸážIëä#c3ŠRå+]ÍBñî:¯‰ýj°ù y¾€Åà^ëÉÂÎÍ.4|.{ßÐüÑ¿ZÉÏ´Ñù0¹Wú€Mû9ÀoÞË'Døk\ø/£ÿü·¼ªÝO¶—Œü¾àÏ:úñõkþèÙ3+…ÁîÜŒÞjQžëÎýÝÃãiO{ÚÓžöÏ ’>SÈå`R/³ÿ1û«‡ˆMµ×Aüwû_šý¶Z MWX9d÷™ ãÅøjr4ÙáÛìmö6¾{Zz?««òŸ´IÀ™}t¾æ7ú0ÑÆ©4ŸdÇ<½h°¶AØK13{w>;¿/èìwì¨V· ó4Æ„ðV®SJâåÓœ½.p )f=öð®ö›ö®VßÓ¦µºŠú31œÛ&<1Q;Ñü_þñ£ ‡m­I§ Zk¸y M¯Óê賓Tc¹I€õí–ë¬ÿh]]&O<®°…(àŒpZUÓE­t@Í{u@׃WöHÃL´–áÍ2+€ù µB\ök™ £k\µ JlÁ§²28o[T½'³‘¯ûo^ë`Ô@Ô^_"ßfC¡1 0ѧ߆œ@ô¡“ ÂÐ__ šš[`‘3ÒË8rÀ«†îŠÓ¢ –Âîh/èß$’1|§õÎÏ”šÎ“êöˆÙõÌ8M›5f6!;E”¦šCÁ?š³%?TòCñ“–’Ð\t-]ªA¡hô'µŸ5 tõ:.tf„·࢜Ždè•ÏïÔºâ#©C≠ü¢Èr5%)c •+\(¹'\X0=p ͤŠCï€Nó^÷ÀŸ«Ó:óm¸ˆrøÄ¨˹ó¹õ—|Yب-h•'p™Ñ5XJ §&žØêÛÐë†oÛݵÚ‹0ÐÛ/Ÿ`'îÈ‹m8,²×I*×~ÅßÖWs—´¬À6Ð÷ò‘x6_Ñÿ˜c¾{ ü@EÙèJ&½+IF“öþœ4ª^ IDAT­Xàe0qî¨áT/HŠäΩYØ îˆÌ¥æ £½1‰À’5y†fñ!;I@¾¡‘¿£¢”sÁî«R‡!Ü{ÁÀŒ÷Í[ÿ„×/“»ð÷nÀ_¤Ÿ?ÈF¿öUü¬?¶«Ö_–ß}šµlbâ4¿¥9ÙuØÏõþéãÄíXœN·/Œ’¿|x<íiO{ÚÓþ™€ÿÕÉMí,æe(Vaüm¬MwþÈÖŸL³;â%ê7ÿ2#ÂpˆÖMùǦFÿ`ô•ódÒNbÕ^6µþw¡ï ›àN×…M\¢_Â{ £å FŸÎ@LƒrhiÿkE*8b “¶'¼`#‹4.R'¢R¢'ÀQ» yS×þ(t¨ö»[4TZ&hsX6£ ȼ×,Íåህ’`Ñb°iÅÙk|kªà’ 6’…k¨-Nã­•!úãä”òpÒê]tþº ƒ#Al]­[.¯ûup±.Î8Á¼ˆÍО ˆPU8¹2Së¾ÐpôŸ=ÿø“b¢ÚI®S…÷µÆ¸-ÉZXŽÍuêÑW®ºdc2:“€az!6žk쇖sIž²Îè`qa¹`"X¾gÊ.dŽ Ø¤ß;çà=™@vz?q󷿦†+NR™ä×Ée3šŽÞgiØ™:x¢GÛj"»Ò‡ 1¦3íšÄ}ö¬ˆL±þÞ •ò> ê…éÌ¢-Šù– à[©”;Ïäúk>ïMn'ÅÝž4'ø¶“KíÉ·rC®3ŽÆÓ@ΉîPÞQçþ.Kp(%»`¾¢MÄu,ùM•‹‘-$!ËœòasçrOÀ4®°¨å E_!¬¶·[¿ÿ`ûg}“u2w™þ)ÔøÃ&ºÕOŸ_ÃMH¿ã‚¿Lÿ·W‚›Zz?ð„>ù¼³0%[ûësç¹_~î‘=íiO{ÚÓž,u²ˆƒe5þ6û—•ßfoãK^Me¢1ÇÒµ,U Õ@Ø!T­öÛðû8¾Âz–ts(Ó¨Öå·†wX;çâi.ÍÌåaq1W”ÀÀ憟"òãä¿-ærÚðŠ,#÷~žÙš g¢ë¸_†WØpdmÜxp=£ÃîíÓʼnS¨«¾í]í}ÀÄ_ƒ…wó*ðôÙ‘Xô¸Caû€M£«'ζÎÑÔ¨@2ŠÙí”²Ô Í$ añ–nàg¡ j„Õcà­, §ª I–#âåüKáì‚ݹè¸ÁÚ’ˆ{å”7kùÝó’«•Á—‹l@~xwÓæ„}WƒŠ\®«SQÆwÐñ¼·V`¥_ýÃ4F2ë®!¢0à¯ûf©óHOššˆº“,€ôª™{!ÉdÐÿMgŠTEÆ çs¨X¿ÕRÐÞ]]'@v.BÛ¹bx_'Ût{÷˜„ÙKjV •7‡Â:[‡Ô'é‚P9-4¤w\[Õ‡3Pá@Û©à¯Xe¾J€. \J[M›X7YÕ^¥mÀ4¿b½-oËì2÷C0`#2“¦0M5†XPëðwûÀ!J6UÑ$.5cQÞ+Þ)Â&a^Æ:I´_üÏ/ä‰y†)wè~ äF=©ùÚ+þãóà¾n€{†`_L'Cwf] 7ïœ! Ýëûᜨñæ±UñÌ15Fø– A0MEVm²£3ëµqüX/8ÄÝ“õ’ÐnŒí2 ³àS×â]Â2NÖ ”t1÷S 1]¯·X!OluyßöŸHݘSñŒmz8®"%—‹ó¥, ä3§‚'kMØ)¶^‹`ÖÒÀ¯0µ«Š¨ÝÊ™. QöÉ»ï/B®Ýx£Và¶ÏñÏpο€ròï¸ìµúðw\ŒÁ Å;¡¯uõ™oÛhŸtÖ—ª'þ"›ß']ÿiO{ÚÓ~jå|¢ wPa€¦ÏóÛø/³wß榘dâV}miøÛÂê ÇÊ« å7Qþ*j*1žp@?Dl)ÀÇ<êW!vRt,æ`PwnCGü¤Té¼iâÈ"Ü«`›XÝLÉ@sª—À¤!EÏ]lôÿðþ­½Ÿìœ..×^ b¸JÍSó[ø{ljéd@!;ªùãáo¥³áµ1Nú“jBŒû¿ƒ-VEëÆ^g1À—'réöýš œ^ 8C8&~§Ã•pþ{„µ#<@ézö"ƒaY6ßcþN}¤F¢*FÙê§—ÞE“bí)ŠFfqvÇÚuDˆs ÅžA <œÄ<“£{FÙ¤Xa™Îq1ñCÅå« SSG¼ÖElæD6çÿ<äÂB’õH-7Ñ?)ÃŒm"W45ªñd­.µ *[¯«ºK¸ˆæø’²Ö@dgžD^‚ŽèåY²W*Ð,ci¥¾Ó/zûز¶ÿ8Žσ7ÐÿµèS(‘¼é|'ÐÄ/ üÀù¤CïÜÇwú (<íiO{ÚÓ®ŪY}›½­ü6ûm|[­ö¶&âb¥4ÊY$âq¶dW¡9uÒìå…’)ÚÊÝvPéh—W¦¶¸Êé¤>“ãP‘s:ÁÓæp(®¬¶~A?a£$/æPº›q0z¥.º$Ü„çŒÄäâñe kËÖüðù,"It$!‘‰Ø¸É9åDcš_ÌUá— E¥ ÏºÙpr•“ù:h®—ÚGÅà §~‹;‘r2вºŠ•¨r1(¼† •§§Gáè{œŒm…À€Ú#ÿÍDòžõOIÙ†è?˜¹èQ”a© 71¹8ˆÏ¶I8BÍfVJ v™ÂAì`ZÿÜ ýQZé›2 ÏT«}D¡ÔœSsQé%}Œ>¶´VØìÃvP)B¥Gú]36Ìfðo>esÔ89Ï bµ9Øh!zün1ñ™@ë•X¤“£QÕæ)ÿ¥&Ãÿ½ß2GÎ>ãô3l*K\Ð7wªeCý mm§«‚¤.!#æU›ý$LËT Í›‚bŸG©Î+¶]‹ò5¥\I‚šnáíʱåUGÈü;Žvš—‹-ßäñÞ!“^‹#9¥ÂéêÜ:cÉÃ==¿b•!:9ÇÒìåÑpÉâ‡yg­ù Òa_:4Çú«,EØOS«J$à^=i}¬Iý—WSòÛÇfØ„‰Î§ Z9±:1p)(l,Ô(ìÍ‘%pŒ ¿ÞɆ“k¸$nAS "=Ä6bÇ;W®×¼ÎÁÈV9 Í”Z{õd²hyh,%¡L:¸÷ —ßGŸ[5ÿ¼Õñ%þ“µ€õ ³ž÷tçO>F».êØüóxVÊ¢¸\tn+ïç¸?ÀOª—6ôó›ßäEIÆH™òjãúÌiþë-;¼ ÿ·ùþg¶ {:Î;?aŸÇ®gü~«öaáõO{ÚÓžöo©§}øÝ„Aðnåú²ú« ÷©‘Cç‡ÁNÓškåð˜}‹Æ½"Qv2%ªï©ð^l é k»ª"Z%Vì™Ü=ˆ(7oôãŽ|jq†~ÙôÀ‹A#[³kÿ(QodÀ>ˆùêÐhTNÕ–äLˆ‘i..²ªÏ“då°y“©©•ö»‡L Ü5l÷¾¢Ô?ÈïºûZM)fÅ’QÈȱ©€øžj¯Mä¤HRär¡ÔX`4MÛ?ñP‡|5oÒ`f=öàì‘é¼Íšæb÷Ä Ñk›8å B‡Ÿð …ó^T´JÛPq*QMÑxÜ|5z;feðÞ>cê[Sëà>ÁÇw•mÏŽ‚YUÐ)O+üupó¥ÊP¡¡‘2ÚFáúS ¬Ì“ù*H=Êjw¾5ïŠAg®0".‡_´ÙË2‰ÄDq*krÿ„+Bš “S®™³ÈѤäïkˆ»™D{šÃÚWDÑ—wpÑq.pè˜ôFšðµDK H¾j¨˜i„ Zô‰ÜÐk˜ÎO•f|M/ ]Äô{’j³ÔTs 0rCóÊ X¿äj“Ä4ò÷圿óÈÑR&1Å:î‘2HÉË„µ4òÇó`‹»X)y4"ý“%¿OiÈV$бïwL–[ ½Å(ñ¿¹a²k1ÐiBûöD&ybç¸#hKc°ÝÊoõ9Zݵæ«Ð. 37yý;§ f¿Â%]©ùæÅ™ÚÉ Y&(Çý£_£S¼Ã÷@ß?2ðÿ$ýRÕ|û±sæwÞqÙ•/_Y^Ö•yëåñƒŸ9ÅãKöçpÁŠÎËW¾þÏoŒ±Ÿê«ü±óÖ‹;yç~Úû¼q5Ü|þr/tû‘ð‡Ø_GÿŸˆÂÓžö´§=í:`ÿÏô2e1üj‚×ö:ÂìÞ¡Êìô¬ø6³¦çSaõ óµ¹¡ªÌËàS‡`ÅyC|õ|k2Ó8³Ú‚¥ãZvÓÝc{Qû¯€Ùk>°CØÍrqy]w'ÇÎ:¸#€‡)GéƒbÖ™q)I.‰›^ ;d– ² V«½«½«¡Ú/³«/Í€;< õó®É~Sy&QíX3+U6' 1žUwVtôYűӼÂÈåg¨< »‘ÀäC £=ŽÒ¼m«µá¼LGzrU$=•Å)TåMŠÏ­œ†•‹(AòŽE“@7z¡¢ØôôaÕͧ‡)h“ô˜Ý#…<ˆú»f=ßiJ?8r´HÇ‘f—q¿$޼«Óñ«ñö©p÷ÅÜYãéKÿ øûúMŸãUÜ»ºà9¯ÿqãŸ]ýÀAI=Ÿÿg¼”fžÆ»q6Óéy”OÛ¶_öÿÅìûeöË̬¼„ËÈÁ€Kºå$8ƒ§”žL ã+¾ÎçÁÃÌŽRƒ"Ì‹.õ¿º:óËJ1 Û Od×ã.5KûÒäÜ!:_”T ÞÇ–NÎØ”[NZ$k¹ùfvT9ÀªÚVÿ£¢ÓúÔ$á™ÔCìkÏv?2ˆ›R‡9쮲$zdm=ãÿ×g‡‡·ÈÌzhTånÀ ý‡C]é õ)x3`%4ù3Ÿ#ó3. Õ±€f´@¡ªên–efÂ΂Ìj•P 'pïrŠû¿x› õاLƒ¢ÍoQkxܬ!Óá]¢t#Zé1 ©X€PãÖÓÅÞâN‰®¼„à¤=êlJ—fR“1I¦ y³‚ø¨ ìÈ\U»OŽKª!m^ºkˆ Ù8n‰›%&þ›UéÈòãCµZ^¼Qj€Ö+éZg¥×µuü¦–M_âéèK«e®?£Œ yŸ -ËÖãjÇâPªV‹Œâ ¯ƒ‘¨[Ó‚£["\í—,CD±ZóöÓ)}²3ÎWÝÚÜ­sÜà+¾š 8R½£ C„>ßÇ«$J^Dr­œr{§Ê»‡ð•'Ýãl£…+h¦îRê‡ûKÚh§¶.1mSñ@f—$‘žD©ŸN¬ìâ°~ƒ‰âFW¬^Gk €ö] ¡5^L³§oÊèËsÁ†þ¤A^Õ¦O/°ä ˜µàŒ’’ü]ÎEl°9Ãøá—kïÐm$’œD¿^aDÕBŒê1;¾øÉø"úÚ§Ór]|R\ÞX!qÅ—?¼òk5žNü¥’Y…Ūªw†>7Ì'pôŸ§øM¾ÿå~¨¢þ)®åO] º[n¼dþ(á|èT;kÝ4~ö#÷4nâ£ë÷‘Á¶oëêØ§=íiÑèiÏ£üï à¡é+ÖY$ßüx]UÙ¡j±³äê ÒübA`‡&>ÍÞ°ww(ÖÄ^Èé€bøex^±Ö&U4²AÉX ˜›¡y®Iµ¥4Å•7: óYçS[¦C¨¢‚BþTF‘–‰ñqqÅ_S3mÍul¸d^ÁC’¥fW /+Bº‹çïí‚C¯ÍÊ€™¦ù|âÒdÄU0+“êl½~¡s"Ìš%Ñ©Ž{¡j=[óJ[«p\€µÜöú6²[^ÛL“¦dUogÄJùXÓ‘áå¹'Ôfp‘'‰ùn¾>ïÁ5ÉQ¯Ù#{•½‚Äç(‚NÕ¼À}ÿQ…°”ÕA§Û… æîˆ0Åh×çPO´ôy;Sgß‹k;š 7%Ǭ„·¾À‰ŠjxXC:l®§ñàCPݽÓ×HaŒ $‡pȘ™F&u)\9‰X´`XÄǯc¢d¥~µÏ…R¬3k:coZ¡½zyDC…žûÇZ‰„:!c1 m†wB^^OÎÇHx78µ‚y†~ÌdœàT$xÚwí“Ûó-“cê Ðy>–ÕuµM6C\ß›´ëÄȯ¤°ù¸—Z2Ä2;Í·àûßU»Ëìv™QÊšÉS”¶÷Qcooif"F¿ªÁ f-¬þÛg˜i­)ºábÔza¾û¾?Ðû¹ÂFjg~zÛÕžÁÓ°ªóE¿«œÈ¯ û^á29-ÿ<·&^ö!éÅäThqnáütÎï?|/ð‰¬— #^)×_^ö+DüÝoA\ŠÈ\¾p͉ysÕæ•JØ=°óãpgró'Qø®zä´€êúÊÏoÿ.Ò²{ñeD<_½ Üð§nêRŽÿÊçg«çn| ØÓžö´§=ígÚ/û¿ è–~£ã±ÙL¤õ€øE7aõ rÕà½ïƒF:Yí¡OÚœ‡fú¶ZÍÞBÿC‚ª`AÒ0Çß™èØ«ÂåƒS%2Ò}[–qâÜ–˜%²N'÷ |@)(³ ^ÉmŒ1s éè2nD*.‰¯’¡ï.lÆ£·ó´vH(!_‹'¹ó³ýÍeyâyùÐ.)u™ðNαۙ¤ 6 ‰¥Î4Q ²Ü`ÇáµÈb‰ÌrµÎ>]#»õu#õ~ªú¹”]Æ}#W|q …ÄwH÷äõ\i]Ø“µæ”Û¦7u›–þ½íf wª5~nÜÙ~‘´Ÿ»Í³2¿ËhYÓâë]ô×=‰l®áëËÕ¾þõ÷´§=íiOûl¿ìåÙs{.•noùÖ)ÉIÐ>Õš'­uWJ¦;à ö¢ñúmVï®õ/*䃗Aë:Ÿ2Üærÿg…æ¿T+Åj“5$ _EP`* ÀxvƒÊÝôo'Æòý½2¾ûbagÍœ¹'öÖá¥|ôÆ«S³:Qã!=„êÍK‡r=&dtiãeú´2ˆj|›½ ¿Û÷·þ)þÐ(:éäByÏÃýXE{€E2ˆÎ€ÔêJ›†Õ0'}s¸U[OX)ó3ɽôÄÿ#”#z…YðFÁ&–!uÑ þÈç!¨šµ)YE}˜oˆÌ*Êø.õØ$  I§§ù*v1ȵ¡ 1ÕCÝ«:[ÝV¸c^C¦ë8UKzÌÁhsÄÍtN–4,‘bT&Y®p¥!`ÅB0¾»F2Ä :a¢ÞnþG».áÇ«;3„±5RÝ^é\zrz0 y”éýrÇ:¦IG ÀàÀ롈ef¯±.õÜÿú¶úÛêo³·YµjVFQTmÿ‹Æ$“wÍC§·8ÖÉ5ñÓ®2€.¬²žâ°zÅsâï`Ü£ÔãÝ1j¿°šmz±&¬⌤>1K‡ÝMÝÝ~BcYç§5ìwR.q&p¿ýޝ²“dùõ瓲˻Á•‘é_î›Ôx‚| Nûÿ›Ò©©†¾CIKPÑὟ[ö6 ÎN})Ÿ_„2K~}Q0óë^_úDÇ4yú—ïH\ð7V+oÙ8ÙF$Ÿ¿x©|úÑU6íüiïüÆ%]ãiKûÚ¢•ú×±+Oñ÷ ”ÿtfÙuÝwUØ,G›è/é?—©|ûóáþ”4Ô-ïæ+I¨å‡ëñw>óM®½KÿÇIàÇ 0“‚ðø wW½ìÛŽ]ÿeÙ•¯‘¼éQô¥û…]Áª§=íiO{ÚÓÒÞÉV)V5®¾µCoÓ µñ/Îy­èŠŽáq¶tUô»UͬXé¥á®MÐS'Eu€ÖÓçÛ ¼ÌÊTFj4§JmAÐ*…?ácŠÍÐBÇ͆åÈ“e¹j®ÚìóÃ,·ö?ümü?Æ~©¾G5•nΜöH'‘Œbå`*Í€ÁÔÅ®^@ÄÄë»9ŠHÍNÇ‘™6AØÃ¹ôÝo¶T*ô_¯E©¡G/ÑŠ=ïñÏ‹–‰`GÛ¡òÿ›®d…ê*ýó#¨ì/§¡ŸXø&aãoÑ\ w‘ZW|Gå_oµmç¯K^¶c”ÒºÑàêQfƒPre%ÄbLê½£#OÑvñŸ¬^/‹S*ŠBöç%!AKn–™‹ÅÚ‘Ð2M*È0táµ7ô_Í~‹¶¼cä§^³zé}/$À9*Ìòm‰œï6ÜSÞ]—Œ3ºi]Ôèˆd¼`(Í*ùÉâo{ñª—Ùÿ˜¡->GùÅáôE-ˆr(s“ùy1mQ¼ ~à&A}=™¨ü·RºÄÞj;%?ÙöG3é¿0ʳ^¬#WŽ[‘¨ü…Z÷2‚óâŠ:ÜÄ0ÌGÚ·Ø ·!^‰ áêÎ4˜ •þã&¤¹€7W}³©§@ŠÀ¼²f3­a:¾¡’Ú‘ò³{Ó!®”2v åK0É“0™Ågð=uÇåµ¹ŒUzú¯Uòà ÆcŸeÔ•›ñÄóe£ù"pŽÝ—ù@߃{`Æ-ß¾tAO5wñüÂEžLØÝhÿ> N-Ä3 À‹ë¤¼2n8®Û‰ Ä}rüU2 su™|¶vÇNûËTš7žÀÉ›_ƒ»[Åç£ìÓ›º~¾ü—þ¥j6×jK7éæð|#ÿá«ÎäO{ÚÓžö´§ý¹À¡H3_Ùt²J÷¦î8þÿÚSï‹M€‰q»§è‘7ª¬\1e‘£ÔÈ?²V ¦NQ< *àólnÊÂÀxH¼t?á CµW׿ÄŸžWŽû·¯Rró R£à„Ýk”˜€FG4B5ñý0±¶œ\²{)‹²¹•& „Wt+'O5!Pÿá^LpD\*¼ð¸¶WSÌW?ú{är§Ng ΃ì×á˜:wÏGfºÀ‡œø%MöDrÙÍï¡Y.YÿƒÕHy¨è­úÁÏÆ£Ž9r¢ sp^—>›!S~Cgâiã#ÕŽQЃ)ã3}}é舦 Mùêhi€)#r@ù+x-{.kJiÎÍ7Gfë0,ç.ͦÇ6aÈB—²ùl»ünd›ýâ*„¬àvå%ºGªWj"V†¸ÎÙatZd® jsÄ(AØÆÁìšG" IDATÖÍ^–0/C1°ÉdÙQ­Ò'~÷µ…a^Ç+­, !eþ”å„XÄÖ˜+wÓL³ ¬ïp0ìéR"údŒY ñ³1$yÇ:6RKsf©Íê®á€]ñÎÏ+£ÙÐZÄ‹Ÿ¡Ü:Às±XàÉ©•wWípRÌ{þm}ÎeBùIDø:¡Ð«d ³gqçÄÿ5ºÃ-͇–w˜—¥b(¹ÄÈÄ$`.¤™^Ü¥Þ2Bšß&Û†áDçj\7Vé[ŒOü˜u«:—ÕæËôhy<ú6OºeÉ×fÐÕì7m+2B§‹Öü.–ÏM@"3BΦFötnVq\|ìéò¬³± þ}wºÕÁBôx ÷¯Vž/Òÿ;+À½ÐËåO¿œ›Ð6¾VÎÃlÙãù:ý÷¢…uäýº ~òçáòË`Ã7 #îÓož1î“ô|a`ãâ2,äCü‡ë ÷Z…çÓ“µÚÓžö´§ýs!UÛL ÿìÒÕ 74ŠÔ òp:µ¨’t¬P›ªL°æ›ûêN”ê¡H¾¤G7/âãkCËÆ%{Ú;ÕäMÅĵU³5Õ˜—=Ͷ°ieÌ®S‘ŸÚ¤fÞÅá?§ ¡ÿhhþ Òïnìi6=W›U2§’;^ÝÀ³™*øC —ÿY#•¥ gìÉÅìõx~5ÉïwÇ£´)äN¹6{Æ<€û¿w•ƒ?F#‡*<å,ƒîEQ9ŸÙi,õôñò QJU5ˆtŒz"æý;m¸Hï‘Ê”;aµ a¡ XpÕ*líSñü—t{dzCl“ÒúR†ywãçàÓ*áƒh^Z޾浼†W­9ÏXxƒ‡qQÇéUÞA#Xð–¤óÆgÆð“)jM¹¨"@FH®ÅMêfÜ]§›‚™7ß–ÕÛU‰‹D}x1ó+j·ÿ¥ZÑŠVzFÉSåŸ+îÏ»[Œ¿Ám‚—«ýý!u#ð÷°§=íiO{ÚÓ–öËe ã)éîí³ÅÆ=-U’î]ÎoOš¦ˆÏh‘bŽë~›¢bÜœ¹½1Cmý·ež<‚÷«¿Œ¿š˜uÓíy7ÙÐ)J;{PaŽ4ã{âøxà”T߯òªtÝ‘zÏN]ñV TZ›Ã¯•µ%펊º@ëV¦qkKéÕƒÐvñucÆÕJm:9„¯Y¨:àIú*à[§ìx nÔi†,|A†-Ò·®®b|ÿ»ÙíB%ã:m&PÃþ¸²VéNu®‘l 1âUûCþÍÿS] í„ýùs#Gùî$×zè¨?÷iˆZ…ão !A‡EFŽy[YD !°V‹…C ÿ Èy(¬éŸŽZÞ„¨¶´ÃbÚÄ–@eÄ€†Ñõ¶ƒïVŧÆ9¤µ¬$Ìs˜+±ª5)ŠAôú‹ÕöœÓãWŠÔ£Li2ëKÙÛÞÕÞ´W¯¨8tÿGPÍúŸz òX}ˆÙ\ßH¥¼\N\±²H$»Ãò¹£ÞÐç"žðÆdòbg¤êLÏ—þ°8sða™úÜÔ·$îS…?¤Ï¤cp4-žm€$äè_) Ÿýør†¿ƒ“òGqRl±S*¿Ãþ¸Üï ÈC~kqIçÆQÜâÆOaÒ ËÇÏÑ‹“ø÷Yëw&´ˆ§)ßwâ._Ò9I ŸöÈÌ ,ß3ÜP õ ÈG¸ÝÜ,½G^MËj‰,ñüý_܉Õá‡Ùñ 雡5œ[¢ïÕ´¾¿BTïû$óz|ÏÅ’I'3Wܧ¯wÆ~„áòkÌ÷¶KÇ.lwËúøž½íúÕ·è?~|¦ý™)Í/&7)yÿŸö´§=íiÿðö ¯ìõ–i842£Í zX÷ =páÈðmgË Ì²*²?&S8iíj¤M_üQ³¶9³D[¢Î´ô!ñoÃöÖ¬Ôæqú~·@‘P‡‰µ¬ó5­Í< qsă®Ù’Ö+¹o ¦Á|aªÛ×.—PÚL=îÙâèà¯t©ôC„§Žæ"jøšž?ü~K/°àD“Gâÿttq¸,)ÌfÎ2!‚?Ò…Óö¡ùÈŽ˜tÈ[‹0Fvía±{X%·qÒ SÌ– Ñ¨c°ùD¸B ïY $‚T»m4Ù™X¤²ÄÜMµP༈óƒ2BE™ =ž‡‘u..£‡'„ »B*c €U ÊQ³ aSöªEK›‚` Y«8þŠJ1Ç9 úÙQëºÿèµGêáZ™Ú#“2SæõÒÛN„’¬Ò4šLòF:/hù&¯ ífK‘ÿÄÔ ›E3µ‰þW-G8AMÝiÅšÓzá” ­h<Ø™œ##’™$ËZlOo6Îì°Çºøñ"ËÏÆœGí; …+q‹êÞìËàî\Ïi ¢ˆvV )6[$×ÏùæW3?•>€}v7'†Ec;`gbßÛãK ·"n~œ…÷ñÌr1ixcË‚?¤ܽ>,Û“\­;R݈=™ö|XêcðŒ{=åM—ê¼k!Q`ñ”ÇV ÿRÆb8–Hrx‡Y‚†“šûìT·Å‡KÂ~‚àsÈEû¬ðþ./û;Øí¦Ï÷añ–<žØãwÄ Žç9¶ÓÄoüD'\qU[ÞÂÿU ŸŒL~2,¹Y´ïVÛÐ;Ï}gæœü=þèðºûåܯxøäeþ´§=íiO{Ú?¨ýÒÌÊi·èOzIþ…È+M›¼iÙ{à¥&‡0—aDÿáAÓphhôKïéDT–ÌL­ŽR,»–EË“}7:93ë­ õ@y˜ôs Õ™­ž®¦ükœ”$y¹Å3:›6kŠÛðWr\ »÷¯bˆ#A>¦õlŽ-E÷ÐliÕp&ÌŒˆ Æ—5ç}â=ÉÕì=£;‡è¹Öõ{ a^Gp¢F±ª;u'åÅe J?ç#%ù}(;ySŠž¸h‹ÃsRÿdG²° o@ Ÿ“Åe°ˆl¿RWn˜ÔWž¢1ݯñ ú…ҳƻ=F±éŠ ³zè¼Ãq‡š)æýõñU£¢"T0Á¨c§ 8¨óRͤ¤Ã\r™+§é¶«ZÉQµ3éõô‹W`7—ëåX§ Ñ«œ­}_„¿ŒµM2í2ejHlÖo§(ÕLCHÄ,ÑéÝÝ'¯©ÍòýÏPÐW@C©Ë)Ý;dùúj¶f®§S…àðbâŒQ˜Ê8³ Um«}ÑS W0oän¹¤†+4¡€ŽÇÄ3ô9FH Áé¡"™e3€½¸_×ô¸:N'•8%ã{¼Çå;m!ª\zÒvÿa~lì{aî:Ð6Ë/q*9ÁÛ¤ÙbKÃm_†‚ûÝ®­n¾ý6¦DàGúƒËbˆ`­÷þÝ-q BzG<ëuø…$NÒïðc¿\lP¶ ©É{ù*Þv3y¥–c¡~»§ŒŒÉ8X.ì¹Ãß4ÿÌŠ“_û‘Ï èÝKâÝ;ºåµpÓ—õž(Í7yèêU~Ó†à;“5߇òmø¡Û¿ýJüÒmf{[¼x¾.#êêýæ‚|ÜV6’¸+Ïÿ×ÓâQòyÚÓžö´§ý'µ_ö;&Hb$ìWG)§¨¡ž¡Øù8kC½ƒi¢®y•¡æÔÊèô‹õ$/{œP%Cü@ö„Õ"Å×6Á}íj?ñd镯¸EPz~$À¢ºLaªô[ø¡t]þ·—ÂwQ“ƒz£ÞJŽvÿ¶Cù‡6ýZ[ži¯:£öâ¸)JA@ƒtÅXõÐ|jÕî@o1²1‹¡º”:̧‰ÅOrÈŽ3´ø>» nƒ¨Q!€Çå½ÍjéLö’¢bZF‘PÄË¡tò{Õà”¯†“ì/‘ŸB€2ªÔþœ>Œ¿óî;D>úðÕgé1f€-#¢w • V½ø‰ýˆ‚(ø3Ç¿ýóôæØtf! ÕƒÒS¶Yë°j ÷Ý ;†¿¤^'äšó{M]ï)ó•Îäœ;î‚H3ÉÌûM‰ºõž/=~c6—Ž#(òþÝ—ÄÃØ±2 Eä×üJØV98RWK©½º%{•†š’Ñáð9žé0´”ž ~ Öù Zú‡sÞÓyoüýòS¡Üo|ê§úæ~9íÚ\篹©ëóIýÐ'7בÛuβ ¸^ÏoÞ?÷E üîÐÅæ%è$%÷É8ø7ŸO{ÚÓžö_؞ʪ¿±ýjJ5ο²¿°‘f <}R$‹T7›ÕbïÎI‹5噕\Œüë ŸfÞaãnª8ÏíÙû8qÍç7›dq²öÿ±›9é°×q1¯é «Jͦ·.£?2mgd¢fÀzŽ‚†þ‹Šòùö]S\ 9ûÝè,U9ái¨v§è{Ì@‡hÕÜ5³×”EâfBO5(âa ÚņÔ-D²¥íÓê»[õR„8Æaž3µyˆ¥8²€®Mä Y毄M'2ý=¤1ÛPjt™A¶³tGßíDÄDWdRœhLq¹¬%º£©÷m°I¿Ñ‰0¬Æ!DFˆAÒUøH¦êÃÐó;ªìæ3­úÁÒ¥æ”pDe§K“ÁÍš§d®ÿ o=þ9<· Ä™Ñ,Ãôj­Ü5a(”øŸq<#vR5±¸¬³´kX—[ËÖç(r:Š„j«‡@YjáÛnÎ.’¦¹Éšæ¸ƒT-íRCÄR £ ½D› jøk,òШ*¼´‰yÌŠM-‚B`!éæÅ£<\Æ.Ž>ºžÆ}É®N¼ÜQcæ ÔN¡aX6eÌ?äjSNöt'P~­²JaÇæÀ,iÚ?Žœ–í5²ÑûØ—8,º@7Ó5™B‡s%nF‚sËz0Õy !O&ŽDð•‡+‚†ØÙÜ^žK åÜ/Á(öĸ5x.:›ÙdY\ {\¾^ü>dYý¸y•ÙíyqÚ’;_ü6ÒC0‹E™¼}zãçÈüÅÄ¿“[ý‹0˜ŸzÏG>¼ž³Læï\n¼yþM{gï÷;ƒŒ·V‚ïRÜz båKNÒê?Œo>ÞíÏ“™~Q؆¼úüi¶{ÚÓžöG_†OûkÚ/=0Ã’vú|+ ȱûú6Ý•Ò7³Tý} Ç?Ûˆ$À‰‡„NN0  µ¿»Ú?šäýx‰Ðœ™_¥«ý¼Zbû!dÕðvŠöã Tµ“ãûËü«ƒcÖ!ÌM'ÎØPíÉÑ¥ëqwÍ Š¸$«q$½ÿ箣ÌìÕ·Ì„ýù¸‡$Q±Zg¡€Ëà¨=ˆRÝ“bÇC½Ÿk’¸>&ÝböøLéU¬¢Ç†º‰èÿd7f@3°ý¼”LLŒ6®Î ‰Nû¥øçµæ’›Á7I! E¹¶&5ñ†©A?St±€NŠ[€ÇwfNg8ÍÖŽ&ͦ0Ѽª '½Êïr¯G¨´ØVï6J¼ôðZs`Eöd"ƒu¬C’Üm)Y@°+ö³zØ–Œõêç,å鿨¨3²5ÂPúO7D3¡˜½ý‰‚Jî˜6¼ÙULyY‹4Í<9Dª§´ïdv·3¤B7¼aNJÞDeÞ4œ3*wàŠZÚ¨x·éL,–˜]d_×I—¿Û‡ý;Ôµ'26õ|z ášæÉuÖX¨‚?µ”G,+›LYÉZ˜‚?\¼»×ÐÅNø…®š!eÕ¿šþ¬‹ ÙŸcî؆~ºâq.eXÜMÈ}1‚¼™ãïˆl 'œ#V0Ÿ%9}üÞA @Às{yú°øŠ ÁÍÑ{“ýºÍ4çYdWç×Kéü`<‹/3‚U‡ºf;œlË”<Ù så+c’ïƒßb…±„L×è@äf¨X%Êé9]u‘‰²bÇ>_.ŸØf›—}–®Q›ß+£lÜFF7—…K•Lãå;ÀÎs%ý$ϥߙÃ8^aîKúOî¡#®p$¢ø›-?—Z"xÏc³1YW$|mi½³ôÛ7 $¾¹ôÿ èðÄáÞþôÅ/;‡x‘¸+–¾Ém7¡°Y'nˆÛÄe+Ï¿™Y'ÄBXKþáŸÇÉ:³£ÿÜ—ÎàÏþ§=íiO{ÚÓþÚ/¼¢Nß¡QéU°EË%êÀ¢AU£•ÚÜQZ"ü!éÓ’Ç•\O„îi®G<šÒ¨ªîÑ\×óîàjk]©¦¥{Ñ~‹Í$¤ôã.Ê:hÇøD–äÇh–ªEÂ!µYãš ÔNð «fVìÕO¼èäîÈ®­ !ö‹¿-ÐÏ«Ø)üº“ HÎ$yT>Ÿ¶ á¼ÏxN–UH·X!\´‚à$ú•Ââ½­4ƒ½vÆRñiNèçF™ès6VÑa¾wâˆ>.˜PZžy_Ǿõ<÷˜‹ •3 3„ÌŸ9éªK‹ÏPÙZærÓ´ùƤ ÎüÇEV=ï-)þµûÑb}¿ìË °Ì&fkVO\-’ˆˆÿ~ÑwðªŽüÉ{µ$˜x×÷Þ êçº —‹þ>± { `ãa|bÿN,EìñO8@Ê먆ß]܆övª¥T+<ÀÜ4'xÏTÜ: $ßߣIçO ŸáLJiõœžŸÖÞK™ˆp¨"°˜•96ÔÈ¥÷†qRœ9…¬Îpx<³™,lŽ¸Ñ¢f1dÔ!(Ès¦ÿs‘0Šû<§ìO'QâJYC&¯è€·1ßÚ:b(ѬèòÇ}e†Å¾R¦è…h—òó‹,Nõ¾§\úÏË·°-8 ¢ÑŠ`Že¡Áe†ã¿ÆPOdCák­øzŒ§³.P ?1#€…,BÞÔcOmWR:VÖ!Œ1©•;c0@w ~y'Œ£?K5;ŒÍmÖdàÝtº\boRΪÞ'Ç¿»ÚO_fm…2Äo¥h Ï_ì˜Ä|g˜~匠hÌUÙ÷,CIp±0ºðÓQHÔK­ÉrLu”Ûƒ%Rï͈6Ãýû×çˆæ7Ђë<ÍꜘËqr鋹ÿåßê.ˆü’Ò4ã] ™›ÊrÏq^¡_Á®Fˆ{(KǺŒ‡xû>Cü,q' ­ÈüCÆ•6$š©éî1B¡uÁ´À6¡²\E'Ø{ìXmFK‡L¦ÌN‰…®8÷ã©!PΦ×aŸÝ ²°Û&Æ#7h½×¿þå¤òÒ䯸_ühÇð,-ý ù26_wòŽÃv}â¥PϪ»»¦H‹\öÛ› ܸÈówÓ1ìð)Ü{:—ÞBO{ÚÓžö´§ýG·_.ƒ˜ÙF¿»Ñµµ¥ÌPXmûL5”&:_ºlôxWQQ AHn[Óñ®ù,øˆ8OS€•½zBèK’s«ñwã_Nðd¥ˆ0¾º-$§¡ñÀ^Sû[ü€kÓ6Ö«ëLck>«¥´I5+µ‹k+šG÷á\*ÊM”.4 Ìr£ôóœ×yÜE)V^fµùš*œØü‰q.ÅøêõÃHVUóI~‹‹o‘é¾ ^ѪcãÓ0‹HT™™Õ¡ÔþšMaxb.ÇÙ@ì9.¶°ƒSÑsçâèKP#éÓH7"%þøÓ¹ÝÙ«ÿ6é’")R9Þ­ðìCÏÕE 9ý± ø›U¶b—'+4DÆàèþ çSÔ Ë ò‚Té‚C!E«‚Ê”¡ŸnC"_f‚ˆ0"m*ÇQ$,D÷·æKjt⌲{÷@qn¥›hv4<¬/4<£f^½­\ÉÌj5£Χ?Aü{®*”ÕoH…1¯ETα\C•—;ǪϼYnržƒ½ü 쥴71‚H€¯™3Ž rÿ‘Ô#1?;€Pš17a/- Ö»Jè\ƒ”SÑg÷ÚåR6qò…Ü^ØVtÍ〴˜¿ÌuÒŠœbÙìÈ¿~’yÿ×®\…CÀ2­5I-Ê™M“Ý@ e4¸ÒßáÕŸùI Þc=·'Ž;|Êâ,ŽAJñRJ²é}ø™Øªå¤à‰7ÆÀ™–Îr1´}>oJܸ÷ý¼DËê‡3Ö‰^ÑìÑgzƒgæ.¸Ðþºƒ£qgýGXgòÖ:ú9f?û‘/¼>}@ßÿÎäßqóŠGâŽ;ÆáN§nël-ãsûzåéÆfÉyºùÊøZ_ñã¿8ýðOL™kúÿ}Ûä§=íiO{ÚÓþ!íþ?ƒYEW¤YQ§'7CE=øˆ¶\éÒ31ÙˆÒ‘+Š_†_œómï·ñÝ­_ÍUšCŒøÈ©^­9 ÁX-›úÄô¯ÝZ³”©¶_ßVßMŽlj‚;‘<‚°f#|Hs°Nê ›U¬Æ·½9Í9­;e£×“9n¶”–bo‡þºÝ*™Ù«—SÀï )´×ï»?¨  G?°1ÊÆaKOIÆ‚ðØ„Œ¨µEì AF1zNµhchÍË ó‰‡Ý àìy#—ܩ͖—*Cdaáõ¬õJªËz>7[‰–Ld÷‹ÖYmm½g«ä‘ù$&!Ñ›Ùü|퀵˜‹ü9“†^$)ÏAñfÄ{æÅÔè#}ØÏVk³ÒúàA1T{ûr㬲Eæ>EI¹†ÜW¿àŸ*ºj™¸žPF#ýƒ€·PCˆ¬?½ìÀ<}É”7s¦ÁÍ­÷mVhï"Òg˜BjMäçð$6£–.³ ˜9ŒÇܯe>ß#p ¶ìÝ»t¨ 5^"A†@«»Q0ÕëÅfÃÕ0Ê»éiI 9458T„ÐÓ·ÔE#Ð:]I¸ÔW'k^i}9 b¯ußYÁÔfcUÍ ÉÍ-¾—5$ŠL} IDAT$qo€qÊéЧ¸nþäæ…å€äÞ’Y”"W)á>³~G©˜ à»xé[rà7ÿÇg»›EVÀgÉ2‡Èîz2‰S8óÛ„]áûËzîS„vgùFh[”*Zpý·÷‘F§nFÜú«o²H|òµüðK¾…›B+žLŠOXðÆ>x¦E&øtm¼ggÓ­%Ú1È—ìº(¸Îl)6OG ’ †›Ïƒ<+*âv'µù0îûƒæFè.QÉÛ=b~u:?1€§=íiO{Ú?,ð¿;P/r€)¿'ê:67eÅ[#¯ßš²u[Q«f¿§Ã&»ncÊ ì\¶š8À)ÑS”Üež”zU+f¬ö›ö»š½Å¹T…ïOh”Ä¡‘mCh^"%S§LAŒö2÷"µv9‰RŒ“pƒòÕE̦ôÊäªÜ€æð æiH‹@r“kwžÆÅ"·B÷¡¿ì=nP7×Õøn’âS¿Ho”˜«= ÈqÚÜz#UBð Ú9Åïª)~ºó«gæ]Ðî5sõ+;õ¡0ÆL¤™(²Ã.Àc)2˰fÄð˜~U9¯íÊ‹\opÒƒ„ĦƔÚ1ADÎÒ£Hl‰£èˆ´¸Xõ K«¸û~\Ô7 1¥¡`c«ù³üó_A’X_ä 5úˆ‹®¤b¦ý•ÚVKxu†Æ´•òˆ:žW·ð=Æa5)<ê'"ŠÌN‘Dþñœ4½Â¦ZeS-+c}ÐʺÕ~,ª ‡nÅ¡5"æâ‹\R¼GÉH·ƒ–\(Ô ÎR22ß "Íä5˜dáq3öæÅ#÷¡åR%ubW%¥=Ú^ç²ÝÐuÉQȹOïÝo9åk—tæŽ"9n\É‹Ç%p鯰ÎgÍ¿ß[¾êh«öã rÂ=ùѹ'áRõÂhiÆ0O\Hi¼Di¼ìx@ÕzÇdïg!ô…«è‚ªjðLåÂvòÐ'V:¡ÈƒÉÈÛÈi(ÂOÁ¤­#§›! «fý x}ÛâKdy%AúUø^À;lr®ïKŠg3ô'ÅåùÇ>ü½Gü}Ñÿ/€g Ïyc-îÿv»öðVáG•WôËëÙ e>¢œÀ¬mŒÇ÷v»úÅ»OôRíäï=pçGxýÎ&w÷1×ô_VøK¦äÓžö´§=íi"À_3ï~lPŽñ°ÚÁô‘“ûòÂâ‚TFBô0®­¼ø¶.:1Ñp‰§¬‚Ó‡VøC!C|Ýâ9Rsɪ70«´ßí áÙcañ ¬Jƒ£]µJiΜñˆcê»qR˜½`(Œ÷LÛ:œrrI… ×í¦8ÏÆ Ýl8æ› B½«áï;~p*™¨ðθ/ü2¾ú×¾Í~›ý6«†ßÝåXC52²x€"’,Ûíœê úÀîÊo:=w®@\s±-ªxggkÑ8ÚäÞjQ‚‹ÀJçá`44¦×OŒ0Æ@áÖ}¡û”ØlˆÓ,?ô´n`S|Scx Õá%Ô›úM‰Pà ý‡—ÚO¡ˆ2>á` ©úÔZœµxY”©r!ò zPņ8ð–Äs[dX]šªÄ„L²Ôã2Uå"ž†\O£Þ¥™úò5ˆ¿*5•^u”qT™/:„ ÈX{Á$ x,Î#u„9¼(Ì!EH0†^Uö¸‹* œ Lƒg’A•ËÔK`=ÄcÃÊés¥½pPÄÈŒUÓ¤–éëÈàþT¿&ã4AÛò ‚¥Þ}÷Ò\x6… w“*?:<ãÇÇ)þHžî±Æ dšàh¸…qѵNj“]x²²1õ‘Æ|=é* 9ߤ¾¤ö'ë¼$˜8íOæÍp^`[}!B·[ýwÜO–Ìô3°HW¥Áý¯Xö‰"Sê%ð ‚{3Ý8_?à{tSÅÍÏ‘W|× 6^þý:œæ3ŠãKöwWÀŸiüÑo¸…sùqÏ}¡³·—Tøö"TQFrѨœ¥„Œâ¥*Ъe‘)ýWG(Ò©8ž÷fxg1›×O·øþù ¥]UA~ôýÄûšÜ/b?5õôÿ´§=íiOû¶_ö9É‚)ý<Ôº…æÔöt[ÏÉÊ”åûQµ§‚¾•,8Pr8¸ÄØÉº:Æ-â÷x¸òŠ>>}Òœ‰ÿ ÀeÜHéê=’¶O&¢ùSàÉ…[NŠi0gæ;Ê$bGòs+@Ëî¯Öd7~ÕÆ [W×*ÐͼÈ~@ZhEWH ¤§Z["6éÏŒhÁ˜q/Ónômö¶ZÍÞöêÜŸœ•ðÙúfÎΗ*K2ì|.30};•Œ&¥GDª¨ÄÌ7G$#Ÿ×‰Õ(›ôûHHJ —þ kÐ'ÄŒÔzt¤É»¿šmÆ,л «'6±A2$¢g€‰™„Ô|*Ëyšâb²N<ŒaŒ^IFW¢ü‘Ø3¯#b$¼¹ô-'12j›Œ7TŠÇ‹¬| poóª\y qÕ÷gBvgÕQd\°þr¶¼©O ä({ !0“z˜h8‹CÁ½õg’g²(g8Ë;â§8Ö‰=ãþ$ï,gOÙÄšM |§ã¥‰«<5œÝ¨3¼¼ ÿmÓ¿µ·¹ó›_çú¥ßI’µkô¯ÿä:ø¹D8m³_Â~P}à:‡ù`ûëâ_Gúö/ÜÂÂ÷$˜~ò&pc\‰/Q>‰!ÄÿRE2ø]ÍÜB¬ ûÔëÅ6>óß¼¢ôkÕHúñùƒÄ'Ïõ w}¹ö†!ñÐÿ§=íiO{Ú?4pÇCõÈ'=²ÔGñQðB—œfûÃi“ëIe}5 #«âgk’w¼žš`Ž>Ôb ÙñÞ’ô¸©b¨g‰ÌE):Žß Mñ)äìÙÐýGKé·GŸÌ­X1Ò'ÿcå—Ù/N´÷¤‹£ØÐÛ±y³Î¬ͤ´ŽçŸyPQ¨~N/ƒ¨#»ÃÍlàeÎɇŽÓÿ1{[éö #Uü¨WÀkZÀ»Gái:ºMô„?†B ËÓa –ªÂž(cXqØPÒÃ}S÷]‰ÄıU¦|G˜$œÝ½l† œGÁÛíjÀú"Le"Ì'n^H„º%OÙ®îy0)¿ Z=SÎ/„Eê`¼†~!¨õwýÓYEÏ]Bëšèç¯}m^¡.Ä·ÍR]ˆÏΧÁF†Ü.súèÂ4öd¹9—Ô>—äµcÁ GÁáà2QNtȵ5§6÷…ÒŸ•øvHì+Ñ£Jdz–Á@¡±7›C?)¹‰ü~NéaŒô)u öuu]tˆ]M÷JÜèî]Á"³j&ûRãTuç€lwLÅ‚)¹ÇèØ@픾!+˜ò\ë…,FÊ)Ì€Y·kjó}½^R¥Mg2~=,—3Ç+Tßiäù‰e OAün ZËk¸Ï¬éðài²¹å#JޛɤגP»$ÛÍ oKXv( ‰D>¼̈:›(ó7È>ß éÔZ#ÜÁΈ{#É×ûdD¥¿xb´‹Só€;‚9ø”Ú~Ó˜÷þ ’ڜ® ›Ÿ|)îýPºÌfÏ€?AÿyoºãÞÓÂ=P‹íVî.4ÆÕ”Ù ~†îå­|öµ¼ þ$k!èþ Z­ŒîQo·lÔç°†Äv þšÃ'v[|ìCú³wù ÿ§=íiO{Ú?;À™Š·YµBC±Ši6‹jVº]äpÈ쉫ÍJ´‡EzµŒKë²Z/ èì/nªìxÞMŠºéêÙ…«@DiP^.f„`¼­GRkOÌo8IÌ{«Ïzž9SÞ ²õo=£î’l;b!C ýÀ©| ¼#îÚàþäqC£­›j@‹.Ц®ŽÙ,¶˜rÝžp =Églr‡Þwéôß›:ذ÷ì—¿ÍþeümxhMæð.¼²õ«l¥¹¨aŒ®FØN1?ídziï¨*,ÛN´Â™#©#§á-È•Ëq ÎÙ2¿Y-&„4ß<÷Di§ÿoˆj BÒëyäÑ’TDz'mÊA9ÕÈþÞ–ÎLm¾†ŒØø­J‡€Ç`®«ˆS”•ûxè¥ú`ôrÉQ›ÈNó””âÒó(Ï4 ô_(¦¯ô§uzcážûߨ=…,ëúƒ9¿8lÉ…¤R*ÊH˜€~ãO4Ñu˜!C‹–Átò0etÿ!Å`²½¦dr™G"-E, ×gÕV¬Ç;áD¥Òƒ= ¿éO¹îÉ®uEú^óŠI ±üèåiü“oÎ=KéÜV#äE¶–òž(ö–9E˪(NiædsCwî° :oËhX ’l‰N9rŠ+ç„sl—CµyÀrÙ4g‚â¦0o]Bz#ð ØÆ\h¹Ò|=Š‹Õát#‹*­ìr骴Ð!·‚g’¸í‡í2²”›Ð’ÐnòµÕ/„§#EVE~A6…_Ù'6ØÌˆ€ÔúÌõ®~÷|þ–(>A°?âôû…¿ý¡¹µö^iÖ#‡Þßë'Æë#ÇïÆW ö¶½)ïÙ,ñ.Îsÿñõ7“‡öÞ3ëçã¹Ï |8¼xeÔqgà.?iðÓžö´§=íom¿šæ ú/Cl§ôÜOZéâõ‹‰ð‡‚Ȥ¬‰¨#1ß…GaÜ/rA6P$º:n’|“½¦&׫Ž{ HvꔞÄóB«2ñéìaRiN»u.°ÌpyÚ^ ȸ'Ïðosÿ›Ú;I 4KÜåÉOÀN¾ãâèŒlý±-¬ÏKï3]žP‹ûX §§÷,êœæ®R6?q™I³qÕÐ{-Æ·v’ŠƒÊ²QtÞ¸&×Ó«—Ñ(q ìs¹Ì;;e»’E²ùzOÇüÉì;™e©X?®Èåe_ó””akyz>K×Éuóêps*1¹œ=|©á³Ñ~ âBzèÇøà7~0Ì~O~Ý*É«€÷(í'¸øK}‰e _ÕVýqþŸŸ8ÕßA€ÏBú6´`9v£¶ãÜ#}w%Ü¿+iWèÿ¶}÷žûܳòùƒc `Ž=íiO{ÚÓžöaû5!ů©†?³]jƒÌF{õ$Êà –´Z›~}áW;¬ôUNYðÆ^áý$½m@{)vû\ŠðÏÈT5›Xª@À(Œ;‘‹"P±âËÐ0‘;D–1`Š8ɤür°7® M†ö=ïæ^À*8Ìio³Ò ðn˜~ð¸Y²`½jAô‘|\íLUwžÅj±Ú++&#«^ƽÞ-´s X¬¾šk+M¸¿¿MÀ'GNd'K:Õ~À ׎kœ²HšÓ(ÝŽp̆i‚&{™RõS@¼Š'Dƒ_Dƒbn45+3É8fß%#î^ô™f¢ò.ÿgûV n¯É$šå’»sìàøÔ:†²‚'ëbG6=9†±phӻì±Ð“LYÐ9®äDá1ƒC”ÑožŒ]ö®új^ÕÓ–¼ªëã±–^pCY‹`™§/='-Å^ÅÞÅ)5©4ÿ±JSîTp‡ ˆ,-}™-íoG`ôѦkt‘…׉ÿTJîgº¹1±¨xu †36¶²¹íwk¼ úÙÃRÿç4š•ÙJÀߦ¾,(a¸%dz>§ÞÉAsj¸¥õ+I1Óq™’xž¿£c'§t\½3B}§_‘¬4±¥-WÔ«~ÎÚ¡X㘰  ìŒæm+ Eµ“Lè2=ìBËìxU0g¤þ$»W¤N|^÷ü5n6¿j!yY'e!»2D\ß2€ÅÍÄÜeõžL“ã²{ÇZ+ó‰(Ö<ƒÏ= É?1,¯Âçš0kdâTâÃ+û£˜ï~d†Û ¤XRƒˆ—ü¡…o Z~e$%¿ôâÒº"Êjæ\вw÷j{@µI»g‚ÅÊ "ž‰¾Ë°qõ7 °~æ·îhîçQ _tE^œŸÀá'fÈÓžö´§=íi?Ô~MüSz À̪ñmüÝ¡[™BQY¬ÒøËWŠU¸g/]U¢8üì°Æí2)ôÂÈ6FTp/*ÝCS¢º6sHÑÿa¸¦~ý¥§ê÷®8þöÎuIrXÒáT³Ý÷Ú=Ó‰ï ˆeVÏUØØØLwU¦„Áî¦êSEàÒýÚ–ºR©Eä{Ô[ˆP^U^-XòÕcUXN]Ë\‚Ë]÷ƒÝÂaVÕVõPÎ)­ ûj9ÅšBøm·/EÙØrdj÷C;ˈ‘–‚S!Jºè0̾–3VåÄšZ²4E)£4âps+zW€.Ž/RN_h|µH/Ë(ž6š“92% ¦Iõ“>wlƒ#k³GmT;„Yì8òèj¨ƒYB2âpQ‚_:Â®Š¾*Ãg("ld“µS"ÍU y375Ü“99‹V‡p»’ÃmxÄX¬ã f¨SbÂŒŒç¼‹P¹Xkû‡¨0N[YRü_égW §WWÙ5IjwA‡!2cYL¥ì.µ]0Îé,ºòIéüœj`Í?£'w,„;ªµ5äå&«vŒŒ¬Ãú#Àƒ‘‰ïÅ»UQB­F°2Ë_-KÕíÊgŠú+t¤±¹ê&r1˜F•g‰Ìòj¹1Áè_ÝL¹tÊ`ù±—ÁÞc’C1^èz%‘K‡ì.̵oŸº±ùw±…ôSB2Э¯W©‡MðN)9—#÷(yô“—0¼œœp%Nâ(û:æN^ãkÆS`C>ÜÀ„ÞÎ=»6Î"û0’¡Gá£ëÆ4Òž‘0_ÌÄy#wòÈð#8ö3äÆûw UÜé¼ezcvÖr·1u7Úšµ¼êäQSùÄ&YP)Y¾R‡ƒ$&Rј׽ŒüšÙJÞwé¸ßG©¶™Å‡_/Þ—Åy™ÞÞ;aþo}éòãgÇþN«ÁÓžö´§=íig€C Õ—Ôª ed­¬•Rµ9±¸ríâÎ2N§b9l¥idÜÙñ8¹€ŠJ­=il1¶±hB#W½§u#°<•€ßcTõìçÔ„€Ñò®å4>-=•¯)±hŒR ô{²~Jü]3Sö˜ŒGs&ûË0+®Í˜ôLnÊþ¢¼|ý9Ö*É,‡I«¥•åQ:$ŽªŸy+åÄgGà«Z3[ä²B‰,5•e”"å«93ŸÚuÒ_j_†á‚À š‹¥Æ³­#™B#> õ î$Ï@yZœLb-­NKÃó+¬jLŠÓâ¨G6!‡˜ˆÍ3mœvTœõ7pÀ…CDê+ÆTwéô:!=nMxé˜àòj‚ZÈ2ú™Yu]vafÁ ¥2ï8fQ:­ž>nG ¸­¤UnÅR^ÂWóuøîŽ c+{ìê‰ñ,jŸ&M 瘧£û! ˚Ťù÷˜ µ Ym '«ÀYÌDKÞmq@X+  ƒŸO™=t?0T´C¬Î26{‡3µý…Y¨dšQ™Qä—¹™À–rÀT`‚ȼÏÅn Ã4{Zß VäÝüæÛIÇk1œ+7`³&0§6´•"Sõöì^`Ý_œÌN~Éœxg7D¡õÓv%>©Ë.a2ðJðšÞPtqJ>.u×ÝTPs«X`ú¸ad£V Cˆ[¬Ó‚^tKJиÇû’5ä>Ûâ|ú‡µß˜9|ŸmoÌe7pqs5»Ce~bïv§/#dð=µæÂÆ•0¬f—ÜûãX¹u«—æéíÈö¹?<âpçyskçàJ"6 æ/…kó‹TUr}óøCÿiO{ÚÓžö´ßÓ¾ìrPðj:õròý‡ô{® _R_òªRñŸ2tTÄš¿95C ¹´ðö—+ªQJ­Á@I»P¬ÖDÿÒΰ¨,mÕ/Vžå]³¾4¼5Î°ßØÑXmÙè*ûòLˆ¦Òo7~ ­.uMÚZï&—TµˆP× :Ál­‰€†q«“¨¶{–DðÊWOd~µC_„ 6âÍú_j]&Øü;›ÍÔ?sin9Òµ1¬ bIM<3QLPp"l3Žè§ÙÐ'`r!at:;éC'ÔV¥]̨¦J/uäª= ”S‚‡¼VŒË$Ýsõ»#¦¿Wi˜y±:qÕ‰ÃY3TF·HS—ªµyx)ÚÙ»§Þ‹ Iv¶®Få«ÊëX@új¦œ¨‚¦†I9ÿçCÙ©Ž ›Y<£¤ Vž „sí€q‘ûƒ@è¦ÕÕà~„t¶®²dÔ¥æ-táÙ%¢CZšÆÙÿ†“¶Æj ¥UB[ËU§þQMeO’~}RÅÆá¡cfQï†gn¢ÛˆŠû¿3öÀ¯ãêºàž>¼óóJÙ7p20˜û+ºù%WXdKcî¬KgDïm¢“ʤ4—ä/íüÔŽrajc©i87‰Ò !qì0©±’}ïÐ"ÌIߢˆaUÌÉø0ñkÛ„³ïÒæ÷aøû„z!ú¿^ã'ì—¿ÜXvëú«9 ËýlPã'è2àä-lÔiÎS€¾ž‰ðàçw÷V(Â?Õ™Œ2AËzýÚ±œ÷ï>¢@¶êòMÕ²ÍéµeSüOV>íiO{ÚÓž&ò- î Ù‡NÒ‹”22Ы_‚—ð—¼~ _R(åH .íŸ,/x¦mÚí1]Žg·®í¹ÆAm%n“œ\‚­õâ;ìvÏPA“’`~©|W;ÑŽj‡óA°u'”‘. -¼cíIéô¥»|‡Îy¯üÞ?èTI¢Ý9i]ûj l탨=Ù#³>ÂôCy k-—xÔ•úk}N3o œ5Uù.ä¥ÊõÔ&:ÓŠ;Ÿ=~iéÉ=’ÏC~õ;7ˆ”*E-–ÃÚJ^ôF¿ Õ#éAn7(×çQÌ­9¯ ê¡Sí­%ìMy8âÀDÖF¢§™ "à2Ü£ƒÇOTš'4+¨ºì@91cq€ÓI@’y¯Y˜ˆÑÝ2²6b~“¶2¦gâ {ý!¤RÕׇzÚÞkzª+ªõd˲Wà¬ç¥öoçkd{U‘¯n0ŽSÐÌT|³ý¹ ×@ƒfŽånÈà8úÃ3BŒ‘Õ…JÝÅ!3 vb8>¶¨•G‘A] æ¤üûâ¢c™¢gs16{¶¤Öeʦ@bÄÚCÈ„¡'^Ü2ŸzþIoñl}½Æì˜E USÊÛ˜ƒW—[Þ­›ØB¯ïÃŒ>s¢?n´wĨ!§2S™Dæ+­wVL±çý?7WôC:û¬y³§Ê½áÁEÝ¥ŒHfYÁÐɳL¯Ò’¯%»'9e¿k÷äÉÍþ¼«©7ÒÀ;Ÿ±¼¼?œ]qY?=7ǘÛV#Ûfs{-†|°mßò=öysÚn_òõ§1Y?7ßmnwavr1dò“fÓxÕ“¸ò ÿ?­òÙ^éÞæþ3»)ºWÉÍ ]—þGE²IãÎ#¸µyg.î †'ÙÿiO{ÚÓžöOhßãÍ¥*KcI‡@J©U^Uä—àÓ®VDÊ—”2,j=ƒM¹r{¯ãÝ_ …aÓ÷g±/YÇëÅæ>n[NNT‡>ø©ôó·ÓyÁ$NÎ…Ó Õ˜…rä÷Q™ûÌNçõÔÓ!µ±Ë‚a_|ôIí~¼2~à T• ªä¤©”FŽ-`iŠüN+‰ÊçÙyt‰¤~‘D8[1t÷W4Pkþôg*1%úLêÓˆ¢E\†ø†ŒÁæJOtÁÊ‘R·ëõãŸþ-E+(+s-]€Lº‡Ó쩞¤hž EA  „?ÎM3ƒ.®VÑ&†ûÓš‹šwñò©F¾.Ó^1¸Њ. a÷¢ÃQMd¦ûÜ5¨Lž¾:ê°EÂ!}~ãZÀA‹á¸ƒFñÖ»ÀD±£¹y£ØÔmmýÌ¡E¦ÍÌ*FŒ‹£lèÏÐð IDATø¨"çjl,Ö«GÌCW‡¦Ò…43ÔÄØB†­zF댻[†;”bÎŽ•ßìiÌnã7£|‡¶ÂÃárU(h·vïz"¶>3gúf°”ª7œÄ€—³“ÌV”VÍü,ãÀ\©y#ßpÊV®0\´®Íóã—áI(FF"v0ÇN.%îa)¬ëwjÒßZw{ò˜¸qk!Tf¤ä™Ræ¢ëM:rbsæC—Yñ â2;D”ò–6©’Õ,•þRë"F±€€3§Ð=ü†õ<²¡ôõ€‡LB2ó˸þà‰.ÓO5LÖ´5|4ŸºŽO€)Ó´£ƒ6›bûõ¸ ç?E$ñsšû7¸,oF¡Ôˆr•‚Ñ`#^&÷zÉ“+Àl]eˆ ßçÐŽîHq‡¶Þ2±ŠÈ3šÞ5}^ŰùÖ‹^¦†a[w¨–Ê‹eäýO{ÚÓžö´rûÖ è÷_"Eð%R¤ŠÔ—¼(ü%å—H• ‘¯ ¢¨¢•«î¤cƒÀh°öTtФ yí´r¡•ˆlqòį€$›1o5 oœÚ€{ÑYºAú¶#~msJZ½Îþì©¶MRTì¯)f°I…gD#ï~d[ÓlF;½*â ¾9€[Ì:îóŒ(*A$åU{ø0»Cò@åìêROÉ~áHO†¨` Lö•<ñ¸¢úYDšåo}fÎÇG•eu…~—oå;à J×ÈÀÚœ“KÓ»'²#¬$ɰàä|¢Eá‘IEq…Zô67åA‡Á¬œhS Ǧ¡¨.aØ_<-%NNʈ·XĬO”¼ªˆ‹£»b¾^øH|Pg`_«Ýáü`ÏY®¬­:Ô¿KU÷kÇ-Û2Hëunv ‡IëÙí¥6½lKÿÙ†`MDåÔ+¿–Q¡Æ¶"ëí×\áØhy„‘óÎxUY· ¨½«5Ù·óŨ† üàŽ·Hή!ÅUOíÓçuZ d¢ ÝÕSp|O¸¦ÓƒòµºC:6®Éï¤fÜ8QÛ sŸ§àêš?9óï%qÇi«ìD^£%&ËüSf{$ÎùïÊÖ˜9;Û| ×F”“b…ÎÚWŒ‡Gi:¿-0ïDf8xr]˜S3ì cnp´« ‚¹‚PŽõö,‹¹¨Q@´»xªÿHû0uÖä)ªW­žõþ’‚;+Õ=º„›r{Á¤äfõ÷?io¾àbդ݄»k3‚‡™T]š ߪ~é@¨ã žö—ï8óÉŸ)aA|¡gºfÊý_-ѯr?,Þ¿8óCÀ>­ºÈVé‡ï?íiO{ÚÓþÕí_fKTŠÔ",'Œ®U^¿ä×/©ÿ+øCäýÿ’¢PõÜÙ 9,Ô5Ãdqïb^ÊÕRc·ƒ:·`è -r¥Æî´_EåÚ ¯ø‹”/a±ÖÐÒI‚ŒtN${\½£ê^¸´ú†lß.ªÈáÐg1;Î.¸Q\îªÞþêÀ P†ÜÊÍÑéóH*ñam£È~¦#k»Ô•¤CQù³YšöYyðuF›Š6gæ¸`:‡ z£ suyA­Â—¼^í)àäÝ¥#líDÝ.XWih±”¸{–§l¬ÈsÍ:¾ôˆó=nÍ?ÿ¸ZhÎP·Œ¢ö€σ6”vÙL¢ÂfLè?•¿"ü6(¹HÝQM)¿3ê À樦¹]áðF&ž )1*f™h¿(®=$³ÛíÊK† ’õ4šfILQDû#xa‚áp¬U÷ô˜Ÿ¤’/ 5ïšPQOA‚ü`}MrfÅààb¥öY¥ˆ”VbÅqvV!±yw°¦Ods_VP(yʶèA¿_‘5ºWÏñ‡:BƒíM$#"ýß4òÝÖ(ÐäŽsD…9³KýýmÆ Üô–;Y´Ÿ3Dþè­ïÅ¿n«æå·R¼qçͤäiýÅ7i,®$øEÏM†”ÕhYäâ—v¾ËR· "¯‡A:}Aá\5ËÜà:¿Ã²VE·ì>æÈ¨(…­9ô ‹U+[WWWæåÜ—Aò4rµ™¯Þ?¾zÜêv¾ù@Lç3tjò’v¼…ì Í'†¿Å8fb_ýÓ'+pfÿ{aú°°è°'V“âfâ¢25µÒŸFù—ãn¨’wÇMö7ÌKÁ̆{iOœàiO{ÚÓ¶7>Oû[µo~·Shcúlâìø_áÿJý%õ—ÔÃ"¸• x”¦Uª»v<,ñ¡ÅX.«W‹››ÄO ýwÚü)Îæl¦§DÑÈ»ÓçîÁÛO&Z—ƒÐ-f Z³=•v¼RSÑ9ø'+ìá‡ã$ÙŸÈ!uÒüiI9¨jw«6¬=öp-îJ#]*˜±>øŽ~À(z0?":ÈR]ÿ# $*RbüJv\§"§vÃ:È0ŒûBÑ¥Í]€6˜áƒ ÔiÓcÌÞùN1@œáÙPLÿkÛ¤¯–[^-®ñG( STn|V1¸-”D X6í.»¥=˜ôáÓ]VDŽÒ‡6ŒJœâÅR¡®Š%tí#ÝC,‰ ­JŸG+ÇÑÐH)'-ØÒHOz^xNíjkÁ!öZ«…Bª¯_R‹¥Ò×ù•'ƒMzUú`ÒDϨK¬¬ë¯w Öç%„LÔPUÕbËõôë5 Ã}—~=ïº^:Â$*ï^Úæ´]ˆ ed2Ò±¬3Ó`;ýfÝá–/)'EHzôNΞ̉wöb“Öùž”½òú¾î ºß&B½ÃŒä˜pÅ~h WÆ·"€tØ%”³|Bo¹qy±^„*ˆõy¯ê¼xŽÌã[À\èy_Ï™rÆw°î&ÆíáE÷bõ§+ël·GJgDOãÏ=Wq¯Ž‡w"tûª'‚|·g°Š¬ì°Ù“ǺNñ71z|²–ùÐ/ߺ’ø§³YŸØSeŠ^“µãÁÉr’Œæ•¦ÛÀÅÓ¼˜¤öXdJ´—¾;l½“¿’[ôvƒŸÓ·Ÿœu)Vç w榒A—“ýöCzðÜÓžö×î¿b§ô´¿n—ú´íÊØóšàKä—ÈRÿúK*¥Š°¾¥|IùHú1CR9Ò“baâ䨷³;¤ªAR±•Zã"îùBr%Õ-}'¤8fË3?M/¥žéçâ¬*U\Z `(é÷„qfJ¯ª7C‡A+±Òlr‰!”~Ð*ÖO•¹oˆ‘å_Ôéÿ®>+œÖ¼”‘ªR‰tCéÄ::4Ò"M¹îˆÎ&`Bó™jÿÚOSut8ì¤z4«ƒ]%$",í{» “s›(~—tT d5ÉfcíDrÎ?í"-P’ënOÏ 8#AgÓ¼ÚQ+cA­¨Må²{Çbèuœ BW·§rè•að{TáLÚnÓ6ÞÐÏT<½Ý©¬K ÆÝÂ/…#î¢ù2ìAq‚É¡…Aym•–¬X:–ÊbtZt¬T|p\@»ý"&B9~S?T¡Õ8-v:çliŠ^ªBhØ (#*sŽaKÐìX d¡¹x]œáâ‚„ÿyª’š®o†2l5úïÂúPfÐñÅI—ÓQѲûctk!Ï%—‰/‘gMgq‹™9¤®“iÒ^×{,Ì VäåÞñ6]ÐÓ+È»¾©7ÎÞ™S««1Šïµ/B6™•Ãøg‹Ûc<™d(ø´}n>íäÓ¼éÎÞ½Äb¸ÄvrÚ–ThÇ4v+v=o> %>ÙŠáKÚ&i›4 ÷¦ïÆÏìÈ]vVÂ#à=¯ÇÍÅ[\ k·ê٠ù á>>:ߦ{ü³(!6.’-–ÈH^1nCºÖ<´q Üa7Ébcœ¬ E¹•X¸ÇµÈþ¬[˜Õ+˜—Úšþcƒ°Ç-®Óãuû«y—iqw1§Óa:ë9ÿòOÂ_ž{ÚÓ~wã3¾Ÿö´Û훯¶£=øòA½I­"õDÿR¤|KùxÔ Ž;­šÚähÈ•GgñÛö×èJ8“]ÑJëVùQÄæ\hô)CŽÃ¥fôxf‹óȨmQ×éuhYü'1eT·4Óã^~!"UОÅé]Ì‘}/.WZ‰‰C¥0÷ ƒž{.Vɳ©L¹•šÛú%ýWÕm@ÛcÖÃÇWˆÒçÑ¢Þ.2á·àJGÈ›¦?_[úù"*J¬< ]DQ#=œÊy#EFÕÈ€õ³:\Uë0Ò±¡D‡¬¤’ÖGò6º78åˆ&h`ý„5vq¸ {B-P#ÊÍ¢ŽG_Ä8W‹˜Bý5èc²›s-, ±)ò‚É’ö`Þvs,\}Îv×îQç¬[Ǭ˜¾gU42ʾ*ÅE%•i3ƒóXϼ+€Wa=K…F4¦hF§3kÇ`ªJŽs®c±=®¹öH ƒÖ“œ E™ú æÊÒ9ñpƒ:wcó\¬¢#„°Ì‹MØ 6xI‹u+øã‡¢›9\¡‡Dq>œ`)!Ö%“2˜w“·'µË°;ÒSVIÖëƒmNÝ9÷?ÜÙL;˜µ™Ãž¤ÿ »tοN‡dÂzBN)\M3ßcäW:ï™M"nÜw>PzI/h×L^Jn L2ˆbÍœ®< ÖÏå0冱ö^–ûEA æœ{÷åô‹ÒTâmh…ù‡ï>Žø6«ƒ÷ç”›°xñ°î0JÓÂŽýÃès¯?ßå¼Eñï†ý.M ~ =N*ø\ž»Wc8ŠÝš"‰ÓfSy‘}¹ ¥-“opL o+[‚iî¿dB.½`¶æÛœ½^íºD¬m„8ñÖþQŠwÃCHþ+š?OÀÓþ=èÿÊO{Únàá]^Â_‚æTYE꡽^ÎÜÛ¢2‡/¢+™·é B¯’Od¥—ðx× È¾o«F…ƒ*—b¤oÄz¸ÁžQÑå)^`ÄáãÛ_C¬fd׹ث—à%å% |A¤¿Ïè€t] ¼ ^Šà“˯†¨dÛ3 XK¨×' Pûèò AÑ“U©Í#pÇÈ>ËšdwEÓÀéNìuºçɤÎ+UÔÞ½vlZ¥¾D(_/JVjÖÊNýübó_?A½¿ßÛR¡kµ§ì†AçÓ ßT¦&[0úÝ]žkhñLH‡S5 ÂA†Œ”æB9Ææ:¬‡‹2m± ”°;ÛÄ×wC7FήÒ6Ük߯óô‘Ú·Ú2£Û™òû‡…(Çýf§³ Ê€ =Á/É5ùÂÇm ˆµZ2¶E9,idqèk÷×É›KRìùp§Ì—÷Ï“¦pvR¿™({èi~å1# 2…+,žY(­~C­‰®ôRœÊÙ€ãbdÛ/ÁˆfmŒï= }ƒ&`g®q5Û÷ ÀªÛèd÷>DƒüÙ¦ÛÒGš3]‘Ô›}pRmºEÅ –ë³[…p‘hOf®éëjžÅh™?}ÆCDx;'}]­1Q´s ©u[/Úô³í÷"¼Ü1m#ñŸ!‰2}Ú3vŸö´ÿZû>³þ_Íqñð›ýd¿ÀîcivG&%Œ Vu½'’æ›×öÞ®-#:±ÑF“ݹ8uëT,*ux˜|³Ûë²6¯öÅûèï%pæ2b)G¦ÿ—àK%,ס²B•¸ÊâÙõž4§•ÀHÏ×,¿¬0Ûõ‡@¤BšA«Ÿè= Œ1Çs¨òª-6ÃÑ?F€¾ ËHfò¬«BT‘oºM„:t®W_BÊW‘ï"€Ô¯!Vîvê`8,…ª¡çô^fÕñ*·±Pe£ë_´©4ŽÅ\'‰¢É)Ñë SDe%ÄO45-¥ÁâI¥¹*­¦Ui,—%«9ˆ4âE„E*¥Ôáìå’"ÓtˆCw^Kô˜¤uÅáÄ©hë™”–ˆ—p†šG ±Ð01†¢Æy+6:JÞ‡ÕD³eã†ÑIi^®ØœÊ!ƒéª¦b¢r{öYq—Ó ¢ŽÀ«E Ëq <°Õ:œÒÿ”ZåEy‰@ä[Õ]ÕŒgh]aæŒygë!²“v ìRÊãê÷Uñµsv°:yªlS.™×ô¼š*póP}…ìY´ŽÎï@"„Ê'^žÀûâ9Ì(ûc.­v|m ™¯Æ˜k7Ź9Ó'qü=M[Æló°#™\ðtö!!VÞ$eU²EafÑÁ+¾M— ;SͽÔ\·tÑ3|D´ü\ØúzVḚ̀]®æÚ*ô‚œªãš¬ß£å{ËÀÍG|«ì‰É,ûô‰î,¼w~…û¿>רÂÕ°^ß¾×Ù_#{)»Åß»ò¨›Í;OÿCE׎˜?<†ËHè6&¼øäÙt`Vï˜máÞ|ð/bËù«_ÇyùÔgôµVЇC OùÑö;í'üQñDFžö´§=íŸÙ¾œnOÚ! ×ˆwÊ4»1-¨â4¯ó‚Y­Æ#(Ô9{­ÊªÖ~ çl{¸R©Ù>ÐÖ/B^áPD„:”TQ6’É:èÁñg›†/‘ï‘*|ÿH¬D6 »´&´Û2'ô1ö„-cZTæut‚bÍÝÀ°GDX†Ìì|;º¯¶Hƒâ¡ýJ×—±Ð¤0HBØ!DL¶¹¢Pæ·¼ŠÈÿ ÌTûˆ‚mƒ¸a¾%Özè\žp`c'Ìé€FÆ´ÂýP$ÈÕ@Lµ‰mN ¨"sÌ¥6†Š—1äu·XŸ@Úô¸†×tõ°Î©µ›W'Z¨h…A*\šW‡ ɞ܇âP¿%ã1ÓŽÅ×îì¤ïW¤ºÌúì çº&R‘ çjì‘õ¤*Å *Â(Z …œóCª)×€’b+Æ0Ø/æZ‹’IÐDõ[4 ¤™¤ÉUK mô‚^dД©^GµP=KdP­Á ÃÐUµ[+”DPE‹e—«#°ªY1¡Åœ n¾ÇQOŸZyiduZ¦dØ÷§ªÝ'Þã‚© d¾dͲæSù1ñ{m8ŒS¬¨JÆ¿\Ú;RÉ4º°ïƒÊdÜ2{‹qŸ­`û«©§Ø8ÒcÊ@±YȾ=¥“؆Ÿ@¯Æ“28Ü™(˜®·pÍbŠøŸäÍÏÌj2€üï4¾ý3JÓüq—§}µŠo@í§iö€ ÿ 7ïƒû¿ö^-ÑÇ·)2Óqv3Ùhî lÏ£åÇþ«laMc½ZY(«‹á »e-ªƒÆ#–è5} éí ªÙ ÷Eó ïÍœë9#ÀÍIŒÄáœ3ÅWü¶éÌß? ls½òÎþú`G=íiO{ÚÓDDäÛ¼ê•ÚÄ(T:µ€rdI°`“áÔ?YíJ1êÒDêG.|9¥±Ý®è¼ª¾àédPˆ|Ü‚8(e|œôMgþvÙXõÉ~-Cã»+q‹Q\Uh’Ü/)8rj5GZíݤë*#V(IeX'=ZEžnNCÆÉ݇5åìUÔvGíKAË)º0w˳îZðfw…©r½6Å[FnïZŽäâÁ·ÔïSH]ª¼^R5Šj<9#1m †bd¦‡áî*KRhwík ™ÉÍç„Û‰eeGMïµk«+?[;íîÖžWiµ½ÈÎ »ýa¯#1|_˵'8ÎM5K+†U¨"€x·ÎYÛÞjË\1Ñ“PÙó4E#•IcÞ`Ôy=º±^.àSÔ½îºM'/Ò Ø©&Îá—Û„†¤{íÖó™šn:퇊£Í'´.âOø=(K¥RšP¡2×ã¥9¯ ÞÚ–ë±bËç$‡O$D ˜»>Ò•°•¦ª=“/ÉBzJw¸Ü9u›.žUëß<þùœÔmUŸÈwèV<ý™¸:¦¹çÙ“âB,a¸®l±Nn(ªo]døÁxm9ÌÃln弋ЖâHœaÙˤrÎë/¯ŠµŒ Y²¸õp¸šÚ3U+¹ßÓÃd²\ùâ238Íiì –~ïNÖ«ï`‚ØÞP˜“Å5ßCíWîʳÇzp1…rÜ|T|w²‡à|^Ï:$ÿò ý÷ŸúÌvßAaéÏÁÅZše Å­Eì™|œQš-?(®à-~ }}'o·<Ec¶‹wñ¥VÁéëÉÜ6ƒÜ[Oî§\ÖL­·ˆÑÐËÆ?ÃI‡ãçæøÓžö´§=íoо»ñ¦Þ1ðK)¥Ùü"“Ýhï…ŠAŽ8ÎòA:U¤Ú£1îŠi-ÕͰůí«Ô&£/ôô@±žf[{Nh5_RÄ×=Àë ]‡nÏy/¥åä~5KUw1<ó[K©”›œw±»"[9³3QIëÝVoÄ@ž~¿âôáO×óvÒþ µ!h«dw8ìV=8AeMÜk*Z{-ÎÄ|ªà,û‹;~.÷7èùÑ"Råë%xImáÀù¦µ± §%—´’×aÂQL³õiaHô¿‚O™ÇõVU Œ*2[a/Ï?Ie8¬3˜S¢W@ër¡r¢Ì–Ìnr»lT¦ƒÝ~H+7SEÈÄkñûå)”yG絤B*ã ë‹®x6”÷[göÆ=Í!š¤5ëi"šž…)ùµ£+í'è+Ç)°C„åE OY7l?²4Þ¢ÓíÛ‡Tž–Åh‘8á2´?,ç"мÕÖ9eT<]z˜Jš®"ñþÕü”âƒvÌW¬VÃä D/¥óúsø>ÉËcH”ñDΘ‰~[å÷v˜‡BeBfÜ1‘ÓÅßTñÏu\C¬LÙ%žDØÑ:ÊWð‡ô…Å.¶YÞŽÜÊZýRs$Í ‚ƒÅ•l×ìE‰åøŒÐœWF¬¼‹Ú'y»2Y¾ÌE†æ•LÖ>Þ¼v,Re±\]àÉãîõìÞÂ.2Ü»÷P'=§ž ¹åüÛ_½.Äáѵ÷ƒ¸ù³J¯ë,œý%îæ âl”n¬T¦¢š*“×l˜¶r“{ç•ç0wÖíÉ‹#±˜ 3„Ô‰¸á¹\É‹Õlw‰žÐ¼=n(¿ÃÇ~É_×ðÓŸƒO yîôÉjÁŸ¯Dáíü§uÑÓžö´§ý+Ú·| /Ö*gž&, Dõ„®ËÅt 8‚‘›;,¾Œ>¥^gšÿ)¬ßðq  Ð{5io-Ôp~N;Í^[ ±£íxu&ø•iìªÍJÿ§+_8²Ñ…24”À‘Ýò _ùÔº¸uô/¢¦ê\³¢Ttê.{þ2-§N1ŸåL ©<èJ/PN Ô¶½º<Ê(¢…s °èw±=§{Q!3ÊsLyüù¯3°t¦Cx”#5 ˜ˆÑ‚c·Îl2îñJzéC®îVÐwNÛ´î©èc£ÿ¢ÍÈîj?šËƒc@­™ú.‚†Zއ.“D$t[Ä\3K(§©‹Ú›°…ÌŽ*¦ÖÅs¬'±òÂUÏ%¢ù¡¼$S?o¼¬=èæÇZÿW*í+IaUåPºPiŒOŽ*¥þ‘•&:u¬ÞUÅrã: ½Íi€TfÛò©QH!ÃûxAF&&¨ MÈÏåNÕÈ×&°Ö£VTsŠzÀÛȨ?ôGŒ ô«ýµÖd§}‹Í ëFÑü‰¸Š3î¹–âªp$ IDATaÙá§?qÎ!w5grïPWаôQL¯Ù¼‹â¢‘FÓ‡~i³s°å¾¸?·R7η’ƒ¯Fþ ´â‡»`cûó "Ð:,løx^õô'SÛßeB*³E*ŽtU’€èŽéÏF=ìwt¥qc¸‰lxh¯£zÌñ4/‡òÏï#HEíÆqo3'^“Ö™ÿä&Ž»ø äÓ6I‰À…ä^öv(RtVízëÌÌ!Yð^dY¼2_ëbýŸ3%–Tøk¼¼˜T¶õV}¿z£ë×›Á3,W˧ö´·gåœðL¯å7ÉËØzˆCÿÁ†·±·ßÙ›±„÷¶Á¼cUñ´§=íiÿö=È2¥RŠRK@õ©Ž]*ää°4çm2É} ’Sù™ÊS4¿“t©Â¦p]0rÀi]vünÑÂ2Ì3Oi~í%ËSa\d¨J•üÞè0Õ¯ˆÊª>ÁYðΟ¾?ëQåä©·ªUT&µÊ…?8õP.âP½“ÕHºWúìæÃVÖ ~wHX]û~Í4âEš‹MÓ*üŽ~Âf¡F  ôFºxU¼›¦˜ca¦0´•}ñ!-"¯s„Ô $8ÙZ œìa‹4x2>¨ÓD~ ýÙ[f¾ÁLIj;+R‰Ì²çÙM«P_-B,M®þÛžeßK+ÌhÁ˜eI;GcÉëN;°¢"Q^©ïÎ(©â‚fþ:pæn ‰Óy÷Zä4–˜¨|öc¡Óó—c†ª¶Æ'ïkY¡b%×jìäüƱ7n/#: (¾øB×ZXkå.\.Oÿ9Ä©˜/¦vjW–Tཷñ˜?bü A¾…µa"I¿¥Å¸€ÆÒÝ5óãñOþúÓžö´§ýëÚ7ª·¯dµªÛ¢”ñݶÃn ôFºX¼X^<(*Ì÷FF|¤‹Òfމ!d-åX /¯'‡¢”¢å¸˜zŠZôÿî+ÐÝMµ‹À¨çF»§'ðwshFT_Ç;¨é[ÉjJ­nz•C§™TNÂ<5Ù}ò¯Ú_j#ñé ‡iº¶qI‹w]Fvm{Óbé7ÂÆ*ˆ•bŸ&›+Š«Ê)ÂÕª²ªËÙŸL““$Äù¹—Xöl¯Sb»†i—¹g¯ë‚a º:¶‡­|±$—§zì’Lò3ÉÄ2Kó_mYZÞ—ˆ“þT#z“cJ‘©K‹~†Œ2XVŽÌPU/fZÅê1#ÓÛœ(_ -.tþÐ뼤¡}Fù[˜Ó ËÐÖÓ +&y)hSŽc¢w4±ï,­ŒÍ)ÖþWB ý†ZdFYI‹+°˜¡ š zéþ.ÍþdD1íX’ªƒ§6$6çÔQCëì馃ºP ÒDOfù˜Ìge£Ô=ð¸IKKÀ‰è9æÎ®®3b8?÷.\Uéòþ`W!ns¢%¿ˆòÇã 1ã¡”©hÏ¢×uUÊV7Õ^hò ñÆÑtâ)ó±ºèeäyÐrEü/¡¡s YE¸³Ëî#.)À|Èq‡¬UÑ‘ ’·•n$en¦¸‰Ûp«¿~d‰‘$ß¿ŠrîûuGžŒÛý“+¹oà'ÿüyãÙ‘Ü~ \ô‹I´0árÞ`£\iV"‹˵߲xk8/ìÙ“J Gî'uí€?v¥‚`t;/w1gð‹Nk¯™yÛs|]È™*…ŠÜd˜¯oœŸþ>_£äãe{ó·¯?ð1€Žà5?íiO{Úߣ}ãÿ)óõ«áø2’PØåD,m;z²‰N^h¾g²;HªHy?uuÅ¡:/“íîº ¥òLÅë™í6T¸I¬¨C—c@ð2RSÔU4é¨g.åtfë=4/åÓ€†ÓQgú»û, vÓ¤»vꇯfp|Úëü…Òv<ò•%æ§:f“Ÿî1Àh3Z@ëÕ‡ÊOÕ ÂbqCbË™*è|Ø"ÜQ û:…ÑŒR–j¿ôWˆùîü,:‰Žˆ“ zsÒ5’ ìhÓ°ë£L8ç”]¢°2*ùÄÊI”ØTD dÔ6ÛØªt®´ù^ Ç4¯Êˆ¢‡zÇTIì \êo1'“nSÁeÆœ½Ø…¶õ_‰D ³UÛüÒ²x¯h¯­h©Š–Äâ{ÝJ±jÜ ­lŽÖJÒ‘€ª$zäôA9b‡£à`<úçN• ×âÚdå\‘ŠWÑþP òIÿ¥Q~ÌÜ’ënqs[¯cÏP“`7ì¹`èWÉJÚGä“<îY `© Iæ²Yôš†¥íJ€××¹¢KmwÂ-108îI¤Œ˜³ôjä0  ]Ü Ì*üËŽF¥¶"3F3мP”«‚Œ5¥‹»Ä4œÃ2ºmØ‚ç-<Æðäæ’»Ù†J×'Ü œ/q9[tµH!`ö »ÅªâÇÕàeùMƒls˜ú»Êµs4ívŰ×7ä}n£ø ¡xØz#M5¼³péÕü6iÝüEøÄúZøñÖEÀyio>‘­Qþä%Fã(æn½ –z³ª£TãŽNnä_ÖNTãâÏ3 %)‰ø™ùŽÏžûߥ¬'ìæC¹Õ!÷;mÓ‹äïÞðèù<íiO{Ú§í¿DÊ©ÉS¿Íù°UpxØ2áôáD'É"3ÈB¢ç¥c^µH,?Wß8òÐah©Vúfê£[³S2 Päº+V‹X÷H(u%WrÂzu*."µE2‰t–,½=ˆö4­kžI åpf>þÑÚ)š¡ÃëTF)³n¤,–ü÷°Šö±ì¤Æìké ,¬!³ì :e˜É ·Ça¨ú¬]m\Æ©ÅR{ÁW¡¢°.$é·t·EI ¤¡*ÈÎ*´a•pnDÌ!âè2µ1l¨ÌW5¬¯ª„ùÈù±ÂP[¨ÔoZf›Ì€oz̬‚8p¦¯ˆlõ w­0”c‘  5éŠÑ¦+•@Y¯ß‡õ9èZ9M] =@ØûJÅrz·T2ÑäBú×igã®uF™;c ¯³¸Š%Ñž†ÖáQ*C‚H¯-HàT׆ºTëÿ­Ž]Ñ5Y6E¹1O¦ÙüØcG ¬÷†Ÿ )C6¶à ê­ý0.΄¸‘žKYb¬LTZOXl$T&bò÷˜ÛbÁ119çcÉUÅl0_Ù¸}~æ%4VvSÿ8¯DYÕˆp¹…toÂV„œ "[]—7­mNÆEZ ±ˆ…¤ÂÜ·{'£:§‡7ª]aÃV󺓫+ã¥ÎøÕ‡p9ûð±kÂ&|_!#œ^Wjœ`*ðò”Ü}XQW™åï/Ll®ÞóKœzþ…þ 2^—;ðú‹0QßK™üŒ«Žµi;NúO.CnKφd­ôŸ;ã^%Ü a"L„ø¶« /ÞSá¹Î4©p3)ž7Ö7~â#ý}ò>Ì6·×?aÿ«˜ùCÿŸö´§=í³öÍÿ;?ñKD†jó¹Õp8L˜to-ü •ìVÆq*A²«ñT‰›r(¥¡¯Ýh݇P¼ŽöÀ¤YPŠ«ÕEvü³wÖ h·dXÏ€&—ÑûÓè,Ai¨ ‹R†-p²wt™ò/¡¶((“S4óÝ¡–× æI¿Ž(ÖÜ•^ ŠšÙšx’4¹óY~³:\'ñ1œQ9ü‡Åú¸®NZúÜa ãJVµÀÝ3–ócç·b­Sc¾•ªBò—â’ ¿÷îµ€fCMšø&GG-6åfzu~ð@¯6Èt¸|WïâéÉE‹ãOJPáW‘ï ÆSÄû\°Êc½cuPŠvökEñj¼fàí• @§Þ½h`èq1X|$8ƒsý‘á›2ª¬JÈ4Õ¶%´¨ãçco¡iåP°ëGZw3nQ¬ÚÏD´= [%Âôþâ“Ó|ÿCØÒ8n{é*ÖhdÓÛ\|Øì£çwÕ?`ãÙ2ñãÝ=ÕÏ4—®!N‰Åk(9Åñ·ueÖ½Éê€i/¹¯›°9Y‚Ÿþï%üMCûË_N.ifÏ8Ïjä"è%‰ê“Á ×ÿ{Éû¼7e6;œsú±Œ¨=’yì˜p[N Ýÿq>·îÇü‚cÁßeˆ+IÏn“ÙãÆ6IL¹U’sM™ÎŹ÷oq‡Ut¹ÐìYˆ­QÞœ÷Õ~d&H…åx¾Óä,†ž<;L4ÁôŸë>Äš\»µn¡W®¥e×z8Ì?ŒÙúC^1k¹¨‡‹_­3EÞ$ç°ï\&a‰dK°þ \ °Í_¹CÿKAz8û}ôÿâÕö[ñô»ÁÒ‡™?íiO{ÚÓzû–ÿ#ò¾D~I©øÕ(@çÑ_Íò1POÊÿ‚|Q^ÖZÀ ,`(öT¥»írýèê4š0…×&_£Ð…×a]} ­’†;lˆÊy§(ÚnIµßÇ ¹¼„Z„ZôCßC'¶9¨Û”á#ÌÖ 6•$ TžúÚ%*!hÙÅ…‡{ØâÀñ} v«g¨17y²ïpäº?\†ÿîæœTˆÚö€ƒŠÝ Ç)ùfV™T#ËO¶Nð’¹¢(‡©ò–Á#³Šu%&C§½@£à¡•Ü5žNÙ"Ub8µ¼LKÁž:1Ðz8·‘&ÜûÒÆW OÙ™¡4s!ÃaƒŠëäôaV¡;4i¯ˆî6Áx´î+@Œ2ÊÄ’Tû HrøèÏ¢ØðÀ!ÏUò£ƒØ”2\[‰üœ£½4Oc]¢¦NÏ’£¢‹L*„´=€hÝklÎîÒÖ¢Õ¥ÔÚNËeÎ1ÀQóîFnÎS#ò ÖÖ‰ÒË\Ú¨Dù:è_©W¤Oæœw™³É¬Öí,зÏÔBi•ű”“ËË®Z}¥íÎ U 뛞,bi&qCûûê3îvþ.Ú;—/ 3³Â7¢¦÷»ÎÍá`î%\ÈÂ`:†1·ÛI-ÝKêG9îb¤…ïB4‰Yô"6¿ç&úSÉEý¡ +qã#o˜yb “,Nþ<[Ì/å]iŽ7øÙÒ9…\“ûÆ<T´`UR°ãDšÑjŒX"0”gì!_ÊZD3€:Ü€f5¬ðš†þ ­†€*ÜïÀË–‚–“ø³Á2ý3¨QÆÞ7×®ž¯Aû'÷?,ƒóêà ն’ì\™ l0áè$\:ãX4?©ã¦ÅµgdTˆN£ žcž"Hsð¾Ü;Ž2Q·—PøÌìì„0ZVä¢Oœ2˜,\pNÚ]ÓÌ }&דJÄÉes0âó1ÌE†|?lÕQÆÚŒ ™‚’ëÁ<÷J{Œ¢%íÞl»«G¿¼w|^<̲2±ê³Ø˜C†iUÍŸuÈà•¿ålµÁ ]âWY²­[<]ó”sînl@I¤ë®Ù}®Ï¶\/§ nJÙK‡ŸÏ27‰8_Ï!×ö¸$’—#Ùãxþ‡ÁŸó…«7›¨‰ã÷jÀÃl¶©ö?±<ßWÒ—éL_(ë²°=À;à7†4rú/ÛVC1*d×ÝÚ{à“tïG6ÕðöÅ—n\®Æ>ïˆ{¿Î5Ùþ}Xñnò'ž×Óžö´§ý+Úwý_EQ‹|ïvõü·q#ÈòÈI´G\ÐoéúÙ£4_WR`5çÃø®“dúÒŸ¤°Ü 3Q¬‰0@Xâ$î<ØûÌÉæçs\•¸ í¸P`o¹Ãî_!LØýYãßo„WS¥—lC•öÀå—îTB\Ó±ûó:‹9•’[¿AÒeœ9ì&M¬ÑTZ Óä`&Œ€[ý‰®cSžó3FŽð¾ãÆ⇡êü½«ôVÓö·e~b¾¦½ßù\vE<Þòƪhþ‰;~þH?ÿÌ¿¾ñã'+O$àiO{Úº}ë PØlµAÿwKµ;×ZÉ@68¾ØÒ¼ <‘§ÿ­! g+® nVšÙIÿÅü°q¼IÜåÒÙסxhíšH©¿ßî9ù''¢ëÉ;'¶…ƒ#eÆ.E~°{}&æ² 3{«3×¾¾z€aRÙ6¹AìdîзH!—%˜¨B÷èõ½-” áûù68ÖÎÃm¦jì’unêq¾ß§#Q:OîéM_VÎQÔbhm+­o©iq{-½í¶»%àÂó½Æ× ¿“׆R3U›KEýBQ yÙQœtˆ'ºh/ÎÊYuÈâ{ßP]¿šïDóOå‚§«Ç ¹0Ûç3‚?Vx¦uå¡ñ&‘þc¾yX(°Ýp⽿t¹ÄµOb–r+Ÿà=¡ÊG×·zÕçC•Hþ7>kópÊ傊Ï÷ðí“·.oŒÅÝÅíiO{ÚÓþ›í[¾M ªX¹m\í~ÆÎIÙW¹¨""E•d²ÁúÒÒr«Ô*ÒaŸúv­ƒ¯IYO?•ȼ`:—--j>\Iå묄îUJµUéö‡þ5jÛwbH'iSÍ#¯öÐEB§üG÷–al²fœ=BG.1Uæo×=×LV´Ÿ*Bj´R2޵°ŠÉ Ö@¨¼èóÁuð@+ä8¾–ÁCA‡ ‰ÓÓ¢U%±¸ÈœT%ë$#­ÍÂ| c}¢kØèíj麄,Úð†bÙ=ø¡#vç fHbÁ{™J•…gö=hqd—0š;Ö[;<2c&ÕŒ€ƒ5æOID1ᘛçuHªþR†¥@ÕýM1‚òag'}ólËø£8朘Uøj«G7!hò>½@Áäì+réÎ-ÊÛ\ΕNÝHŒ3‡·²3¢Ôɪê@z[?]P5,+¢‹l5P¯¯8­ÿ|®Môa¶Îr0„Hdêã'³£k°¦ØJiÌo¸ÄÄËó§ÈÒäÉÊç±sf†éŠeöi•˜® ¢ÁjwϼØþ1ÄÜÿ>ŒééÞ”`Ê(/D{˜_9žxçìÏio§A£ª:ÃaÙUT_ÔDà;ÞöÝk?°Ó»`í´Õ7дҬ3ïñζ{äÜš"¼\¼øÎDâݘVWÁ»ù¸Üíd7ÞÜ'䪒!IX¢Ç|²ïÚŸ¤DÛ¦ü/´Ñ°bæÞvW»=žÐî=œO„ÚåZ2ŽÙFÚÉB¦j–´$¨ã‰„½Ž[ÜèÉôz£Œ'з×EdËxr|¬Ãƒ[ÛæcÆí…œ ïû–|¶`¼³¼ìCøÅ É{«ÅÃîl“ùõ¤§=í¯jxlþ®íÛH¨[L¦ÓxK‡¶z‹}×U«Õç±ÈoÐjHíù¿ê¼D˜äî~ª„RG F+c¶Ù…UrͯSŒèÄú¿¤IwŸt²¿õjF©Iú=ãµåõóôä,ôÖ¬gIAÏSn WžõÅ8' ”‚6¶†Þ ÷tÒ\äpãTr¸ŒC¯Ýl1•˜oȆX¹F´¸Ø ÅÜÏþ˜{%ú¤’лѮW½‡:Ôi`ªe‘iM€Ý%!l‚•)1˜ï’Ë.êR)^>?¿ÍÒ«` ÆÙ|ª‹„~SF»b#.÷¹«ÕÞE5<ú›’KÓ6à#¥V{G ¼)»Vß×Iß:ìGm ÅèO/J5Mz4 -4«Ï#~„@¹zÉb ^Ñ:ô¸fÛk–¢FB±hÌå9K‘*¨ç'TkÓîj@§ ÔmuK³VFÙç‡×st}!SáÑ–¡ÄY¡¥]a`×jP%øsüLå!ÑCÎV׋š§¸:þpJ(¦RÔ\‘ß~œ݉=ã®À“c73±®Ÿ”·c~ _‹ºÇÉËrÆAbú6ÓºîÈ9i®NÃ{ w]£/Z³˜-Zn®ECð#ñŽÝ€kÞŠĶM;(ÖRÞ&á®ë Þæ béÄߨ €ìãË£Bªg‹žç,c×K –p o±+nöù%˜Æ.„\¯c>ó#]˜Œ@ZKŒÏOkA°…tUÿ7õ«Çm/£òNEÅÌœ^Ñq€idâ–ëe‡“ª£[jî@nh£ñf¡Œ+WJ¥ðów±£ÿY Ò¥nxúïR[âH‚n½4reIË\æÆÅïson=X~¦³ùY\–¬yvÐùÞw–½ÀÇ«ñ0ßÿ`s-–‡ývù´§=홀OÓí{XS.NÝÊÔl欇mß`ÕÆë‹XŸÕ"h*ϵ‰M—¦˜a%<a@”°>–~´ÑGÿQ(¹2Æ¡AñùãdÙø~ ¾_êJêY¥ ÃFܺ”Ð)0Ò7©µUpÄg¹FÌ•eód¨ý~íy/eS%ÛCå˜k!šÈY ¥á]a5 _Ï0ÍŒ…ÚÓ3$ Q†¹¿{c®gfG,¯O•eŸQu5¥:± Ò}XÎÚì~ÚcÜТõR¦Ê=oõ+´=Sâ! ™lT³L0¿Ò>°Gà@|èƒ Mzøðƒuãû¤4Á}‘Áú5<åzÊ ä¾ã­B7ÓéH››¯OƒV³ÉšI'ø7•ú—ª\ûÒꥲªý‘S…WOóŒ ¢W#Cäȯ*79uÏÄ.Å2çò4}Ud¬6TlTØØ0•1@j)‘s–dhX»øPÁ­ý“ª±†ÅOÜ8Âmž™%9Iqå"cz¡Ëœ'*r¹?KôHöGš˜E2°Éžö5IfÙñ.ÒÏ”×çðêÍÝG˜ÿ$Éänx k`Œ@ÜoB–|qFìã¢Y=J¼Ð²H®"˜¨Ü\ÄGx=t“ñ2Ã:ÌdŒ*b:wîš\¥£Î¾tÃß5bM³»³åq’ýø™ï^€*-Tšz¤¿r‰çÜ?é‡PÏ·ß3¤Ýlâfd äæ0ã_ŽîU¯JÏpê‘`""5ÎÂ{$¦Çí¬²0“ðÒfQëÞþ<Æú Š;¿ø³°;ô?v†~h /¾JUúÒ½ï~cwdk#÷:ðGt >\1ÿËì-‚”§=íiO{šˆˆ|£šœk8¡†øf×’)aŒ&ë_E¾hsÏ12Ói(] IDATkmb#*§uˆ€*ÑU‰NM=Ÿw–Ÿ~8”Fâ’ãg`s8T/^"Eä%øt] ¦ëjelñ¡vêú<Ÿø õ®" â¤(,kkê‹=WÓA)ŠûSQÚ(€£ÿZý ƒ‚9;ÒD8¥ÎEpûuµ-/2p0i•XuOw[W›> ¥{ã xé€B¦üSal–‘ݰ  Òiòôɳ׊4¿+ÓG‡žüŽs´Ó*¢&[>Ú'Bã° [.€ô(åδT”VyÏö'2lîDÙNèo±‡«Q‘ƒÑÃÐ^¦¶`”Õm—ɪ-÷=Ð5‘p† “¶ˆ—µÑLÿ4HÀRN9ØêšÒ$W"Öç íZÊí4͇Æm¾ÐEÚ+§Àšæã…ó—6’tÿjskM©ÖÀEFN²w±‡^Ô%¤úÓ‡׸ž¿ÁÜÔÉ\ìôŸ_KÛ¤BfÌ é¨à}ȹîéi¯KBôýO$6óîp%Y€äÌLyW†…vÉŠ žP#Ds]ìˆûC»"ªãíÉ%~];?ÿ8(+”™D1é?ç6žY•hùµâG‚:ÜLKÊ¿¦%ïóÛø#«öÉ×n‡»n§µòê¯&øóßÚ•5ÀäMSõgRSÛðMäô6 ŒTk©Sd4$¹4 Áý#”eI¢ïo.+xí:sV'”“÷÷\+vþvã}e˜dfðÜ»Â4Ý\‡û®²„Þ›ãÚ¡q/w cçÉé`»Œ¯ìxS︤üI>À²…×y÷²>³U} Ó‚Û ËÂÔçNÐNÞóKø\ªþNMÄÂYÿ{|ÚÓžö´·Ú7~ITHm[ŸÒÕ$ddhšÍ–Vœo”Çœ2ÓÒhÜöÔ (òSK«rs£ C]÷åJ C D/ã"g6.µÎ,Vm̯‘é†þòK¤ÿ§eî!¤ÔF¸p*onREê©ðC1ndié.ÛVÓœã?eÊŠh²Ëz´LÄ5r¦på2Gñž]Z‘&ª! ©ø#ÛÙô‚à||xYbE[~;2‘i¤ôß§ ñ”;Gµ‡LûOŽ `ʸÁ˸HìãŠ#µ0NŒ´þpנϽڧAwl1yßbËJÄÉpq8{‹vZS%“’£´˜ÐNªìfÈy…kêá6±rŽa±¥_""òr15Ú韘ìÔáü­2>zŽˆÅLí¼‹š×Ä„'S,á(mP„õ4‚¯ä#¡6ÚmBQ6б[òêøJ]£\ ‰,/»cAU:BrÖ^¥¨eG;BO숊®ŠX;®Oá •d38̨Êû¸MR€¯ô€[V©ÐãvnîÅ­~º¯H÷â0ÍML_‚¹ÊÄŒWÄ”OÉÆ+ˆÙ‹˜rÒˆÍ éä©TŇR &"Źl o@“”÷]ve+ïõ‚ Àâò³1ž©êçoõ;Ù°í<á÷ì4.Àî„’¬Ê¸zŒøô_dò¢’TÌ9»7å^ˆ>1Ï÷÷y0éõ ]ûѰ÷ŒÙ~æNð/5gÆ|iåzâêÂ&/¬]‚éëzNòØ©T 7«Õ,¡7·Î0 |#pc»¸˜Ÿ£Ÿ[+RVðý…I¶=$ðþ½³ë 6çpÿªqAÖWNÅŸ­·’'þ#¾Â®ÒÓžö´§ÍÚ7¢°<w9eñXRõjë”Ç5:¤Ô®XÒ,@ÅÐû¯%#3lŽ¡°¯;îuù>¬\ŒÊ=—¹(¨D‘_§ýo9²Y5cœ?|#Eôp 8,ÎLv±»FDÝÐxú/Â/•æ¬ÕQlA±œ²þÕjÑPIåÔ#¤!gþou³L`™ÓÈæÒ$ðº0€ˆy@šô9ùr'QBZ(^‚¶k:iù Žê`«F¨|VÍ1oNm†Q‚iB7Λ‚…×²Ê ‚$IåƒÜÛF¡ vB‘Š3“]3âÊsLšÃÌâT–…‘0Á‹´°ÚÏÖ\c€­³>KÑ­ºïÙ²×u²OW s2GHÂx©,T ×+@¾Ñ'ç`J­‡f7tI‡ì{ÍŒ&öÕ¾§´d¿+áRZü¾Ä'Ú¨ « ú’ õŽÁÀÈP>Ì*új wG8q‚B8äé¤áÒÈ YæÆÞgx+}|ØvdzwÄèiILÎÍ~=‡Å»×)½GIl“¾øf ²îc’â½ë™=O±6L8™¡=,B¼ ‹Tûq… ‘bšCþ^éØð)Üúvî.N+ç˜MY®'—àÓáâ ‚ù)ü†vë)áÉâò3¶å¶}o0›6cÃü,çëÃ*;¼[ò²*^Δð¿³ðhJ6±|¡c}Í“ ÷wTáy56ª7¦•aâ ÉvEÒ{ &Jýr!…æ-dòšÆôÝ2}‚3¬ðë`Ãrýƒ¿³Ô\>ë,êÛ·ã÷Å1`]@xu‹¼á®ñ³ƒû»»ýùxó«#Ç\çŸÑè7½O{ÚÓžö´Ø¾G& è<„B(4@ á5R˜l« b=Ž^y‡@«ÎÑ1Á‰È•m‡Aµ»~Õ‘¼¼~?œž¥‡™gW9ÔÿÌúu&þaƒCÇœ¯Ó!`hÊÛCæiõ |j¹:½7«Ô—J†a(lܶ¹H-ÆT\ö–{|L™w÷‚¿›êËLÆ´ŽŒã®KnhnBY¯hù]üÑb çïV“S>ܪ  Ü à¿N…f’zl T¹BbET‹ö {íªäk“BÈpœ ý Ymñu„Æ×]E”¦ïMÂ<«Cîe 3~ÛÑé.ZÀýÍø)å~º7V‚B˜@1,¯Ÿiúv¦ÞŽeGáò.RK‰åC­u—L“ëk6Ú;ɵ?öÆö‡óíÖû´áj5O*Þü‹oÁvâæ4tWÄ«/¹rAÈ=Š–ÝV42ÖdÁX©óÎzòc£1+KþüŽƒ‹Ý~ÏÂoùbY ‘D@£¸ 'Aë™À§÷'‹:^Œd \í28z1›f$—Æ3“áÛ€/ölçºÇ‚c™Ô·ÉÞVá'Áo¸$ÜùtšÇ±5n¯>öç79!Ír§lj¿³ãÂGÏê/kzÊàæXýû£ÿŸz¾O{ÚÓžöhß]Z½t`íRËU*DÑ.´/ Õ*N!Ÿ›Ðy¦Çzjb$È#üUTK‰ò%È V¤4Ž&- ¾ûôb\’®Q(¯u9Ž¡ÃSÛ›²* |‡iC°cæ~}DÖ †èø®.OdEù‡Ê32…¯_Í ´ßM–eªq1¼Ž[©št;•HTº‰H²6h' »£Jmø½ÈT¸ «¢3;÷ÐTíJ&­2eXV+„Zƒì¾©9PY?Tà’êÖÌ­ÛŒï5v„–¨bó^V?ÆL¤Ô6naÆ :þ¶+ÑÉm@¶˜ÝÌ…Ï´€hE·èŽU´áÃhÖM3$Ò#+³ì¥ Œ[Æd-}~uN£’»qç"æÂMp=I0ºL4Â[1+pDe·[Oñ±®§z¶Ø5Ù Æ•[vªûq—–®K¾z ޱÒ,ããÚjžð%(cù•—ÈáôŠc"±í‘Ⱥ7Îb[‡™Ä¸3º–ÜàWx^^µæ^â Št'Ñ,á”–(é€úì0è%pFgŸ—Pø† -ù’`Å)ô6ë.æ®Ï9ˆyèÌù`”6^^^Óbv‹»I!;qÁ}0y¾«ŸÈÄO4J'¼Œ~^Ï.égÄpæ¤é’܉§ˆózÁŒ<†ú3§Ý—¤ÌËÕ¦¸T¼/fÙë;àoŠ>ý(ÏÊs±'Bí‹ßõ/…Wr&ìלhŒÉ]¬Ñ6CÑí¾ˆÚ•R?9áÅñ£„"yË,w¦Ëç^I»çÜÄ›{7›*/Ñ9a·÷6Ýbtbº ájúÜ£ÿ#â÷fÕG®¿¼£ýË×ß…¢ã–ù?ªá'æÔ9xÚÓžöooßÃM×É7Ùœ‘¼7:j/XÖ?\UÙAdiH­FzÂK9Ã(›'þ¨vx\ZÑò2‡Øtmœ#=¶¶$ñ!‚ÏD †buÉ…ÚÇKÊktËÀ ¿ºPIÔ ˆYš0–¥¾J=½ÚóU2{4Ù¢¢ÒÛ«ÔC×#èZÒùN¡ô»e!ßA£Â%tª’Mf:v,A¬I›Ç]Ϊ´žêœ°Þ¢ÅÊ9 ‡-Ò¦†ùmj(Ãé‰ùÉMea{–‘¥i³ 4ù)6ž^T¼ÁÔs0‡G^o!ï)5ÔÇ ´'•ij¹ßÆ#¨XW#ج¼H7¼6Ëh?Ä…TD~ÕTÒ@} KV®«$†z)IŸ&*@(6!ݺwè ',Q¥?*ûB{æ®g²Mg7×z0RIi ¨˜™É­ƒ©÷ÒcK¨s2tUA‹0^CP·¨hb˜JQñðzж£dS•ÁÉò•owàf¾äαdãHU ÂÓ#n–à_ŠI.E\Ù&ÛW†dfÙ±OýFü&Õª¶˜¯ÏEÏú5,¨y¨ýº~È\>&Ëœ$î±!˜3ûÜðø4Ãæ“¢¹€ŒÀ^‘!Æ è˯ZFb¢¨ ÕërJAáç &4!‚µ’\g^Ü9-Ä»‚?{àrLj!j@A–AÊ8ºÞMJ¯cÖ!3¼îŸµÿ§ÃãNšä˜'^Á˜,nó®â¥ ÓåhAöVëvŸ ®’7AçDÖ-eÓWî†ÌwßáÀÿîN\Œ‰ë#Àþʼxà ÿî¶ÅWûà~¢Ç­ø7õöüó 7þÂúç4ü ãûiO{ÚÓþâö}fËjCK•äK•…ÒªL]°ôú‚ˆÈ!sw†š·é„´ª/Âx  ¶o¬CÿÕô¬»X|")€2ÚE7(#£¼§ÙжܤH‘RÏZŠZL 4d|&E“.xJóÎõXÜy¬4àh…tX”OõyµèHñºù’UÂCW%„½{W!G¿Gd™eýùj(ÏéèèjH€TJÅpŸ>žl©çÅœróm7kF-6%ƪZ‡@â>À'å©gGÌ52*䘻RLršœ~~Q@)Ej)C@Öе}àÐ1o`“Ö.{\ª å´ï0šcõèáÞ]Ç `ˆ›jUqp… ¡¬;uGÇddßýrŸý1ÕÙÏÒfˆêÛù)àÈhW¾åÙ麳îÞaò…­rQOŒ%’ó|¿‹RÏ)s ax$ŒÔࢠJoÒ˜Éâ0Z·áDT‰‚ÿ1Æ¿ÛÇ–¶<öŸ}9mËBb‚ê)ç Èád"˜–*‘ÓÖ÷Lí+¥‚÷N›Òí©¹næj Ÿ–‚NÌÃÅB½Ë,iúu¡X0ñ úK×BØîÍÈ{Ð=ÚwÜèpNœä7§—t¹GÆÈæìÛ–™éBòš{÷¨löÜè–‰ó.íYçÿî¹s§Ÿ‰Å`Á…°û./X*\§|öSÁäEï¯pá¬Û=Ëþ¤’þ/çÓ «ÉÅv?½ºôükr;ù(b:e¢ïÚÊ©+ÙI=DÎX4…Ì}ÝÛ5#K\ØzQ.‚—ú’ÜVŠIÿÈ Ηv•¤ËyÇûñ“TqäO;_.>¤ÿWe‚ÜœM™£?\gBsø‰ÿÑöQuÂ_Úá|ðÿŸ3˜Ÿö´§=íoÖ¾u’sG`ì‡L+Ü'! /A+1!MŒ¢ŠTE'µ¦¿ñãµuƒ44×—Ê—@iÊw±vÿÛ–Î}š‚ZY€‘f«Á̳í}©K\µ I#hE² ý4뤞R¹´µ\§I¦ËFÆnž³®ö-0‹u2]Y99Îê ÚN.ÓíMÒ'o[ÞÛ®Y{gÿ4›µ ÖÞ‘oÔð­_ÚÓžö´§ýóÛ·s…U9× 3¾(:q>ÙºÅ^ Ç8Ѽ>9[Z“ûi±³ö-ÈŽ!|Á2èü¡7­=fÏ|TØ”=ëfi0dEz.Jvö“iÏu’`ˆ±O¥!éŽ$¶Þvy°‡øT>á™{üo噾]Š ]°ùâº4"(m¥þ© ¿ŠÏÓ£ Ò2ôt§Þt÷ Ÿ›lŽ©09þ_4Κ¬*‡ÖuYW´ìla±H h·êˆ™Ñ™ašMƒJÇχ\$ç®|Þ]y (…§Õv-§>•t 4v ŸNx¢sØÉKèy+h)í“åЙ¡Jx‡Šc1ªs´úh×³ã&ÌÕ•ˆN•! \ÒTV(§Æ€ŒÒ3…íŽÇTsûP0ep`À,ÃR1naòu‘VP“ ‡ •Ȩ‚hÁÅè»Ú)¦>J-jœh7 Ê|B{çßTw±j²ŸÙTlG~z;?¡äü7ãfhÞkhl™c†×yqüƒ{ˆÑ¡zFBé_Óž[…_ŸU99 âÚV/#d¶˜lŽP E ¶ Ì€ ç‰ÿ09 ºÊêV×å]‰í}ò¢þæ¢ßÒÛ\ŠÆèÅóñÇ·&õîO®§ØÌyœY÷ºj'[ä¢{ì0ˆvÝ·ï-L\@ð74¤ïЧ]JýÈD]'.\ûþ(ëá:¤Ú¤8q M¼gö…¡ö§§„ÍuŽE^ÕbÆÊ‰–Wa áÒ¿:-´áž„ç‹IJ7m)*õKpò|±xfôö"KGŠƒs{VÙó…É"ºZäùs;È»kÂüCþ†lÚ¹ÙÝ}üxÃOÜËÓžö´§=í?Ò¾%Û1ê&«ŠZºcd³¥Õ’(R: ¬ƒ/»ÔRh½lú$ˆq°âÆÑ5Ô齦ð‹Éau„vTÊ¿´ë/}ÒÃ+ŠàËŸ?ÓãžI-o1­–ý-sÓ<üEÎNªK_%ܲàÌâQ€öò ¥cfË 2š3kLð&žŠyÎŽ³“Ëiþ1²Œ›Qå…à‹ÐSðjó G°—C8X2)ÿ§½k8Cã¾ú…É$Ê Æi`¯d>?‡Ç’ç(¯ð¶VõgçÈÝÂö8G.5Áwn‡ Ùër'‘pÖ½nÍ¡M/Åe1¥ŽËXBæ £WšÎF¤-aÈ’â» ³ÕòÎi[»$é¡0^÷œ9Örÿш^ˤÀi€¬ƒ¼Hm-a?¹Ì O÷RW›$É”YÅ38ñŸŸxÚÎBÀ¹à‰§H˜Œe^Óê;÷W Ä„y:yñÒÅ"t´PºŸÛ#­¿ˆ³1p—„aº˜¼MÚ’,ëØX<:µ†æÕ2Ÿ†—Ü>ßÊýûÍ!& NÜ0º”,{lÝŸ*fvéd—²éãc8Ë̯q9œ¸èÞHé¿Yr.ɸ‹5.Dð6^ÏxoÚ^Mw¾û·ÿ˜¶®½âoüì7Ûäåþ¤ÿ?íiO{Úª}Gƒ,XY}JdÈäí¹lšþwêAfäÈïÌ´2Êδf¹ŠÑëÞ¡kQUnlñµ§" ¥Ö ÁI™ úSmœvSÛn¾Œ¿«0É“rSDVʪàuÑPŽ!ÉEã¶Ä¦Và°Lнm4¾]Uu{&ò£ ãI›ÙnFèÙ¹ïºÓ…‘ª5Õ‚ïàÂ~²1À*A…í)/OÝŒU»öóuwMb³Ó ©Ý.„E¤H婇cª, g¦=R<:ôP’Qì5èËëlwýàœãB¡Ãn¤­6ÍÉìNº¥¾4éðQ¼m³Þ<¥QZXçwª¨aÿ´j{R_›©g×a-š…Å¥u3C`¡úÁø‰p¨ÿ‹ú®£C*|jÞ™Îöj+sÓõ¢³€g‘nÝÓ”±xÅ­LÔì’áí#2ññ pm\/x4#ï¸:ÍâÖ±×'<ffi7†œ7$ý0 —Ré·¼0ÓoãœzÜuÈ$@+‰ ˆ¸bDëqM%é&ê´hVK"!î=ÅY’é„ã±DÍÎLÚee"NÆ ØY¸"Å0ÖîÞÉüòÁM2ʹPDÙCJÈö!+¦Ì|¾ÄÈ¢/¡ÓWÁl$Àè:¦XÎ\\­ÓZ"ªUÚ2ì|y 有ÌÖ#ymÕ‹  <»~þô\¡ä8¦°"ì”°4ÉÆ•o>[Æ1–^½)˜ôy2ðÕ“ey1§±´LsÁL6Ø„Ùâ Ã[.[@½j?²ýàjÂsÝáW¸»bÝír¢»¦'ëßùã?§áï{¥I"¯ä•žö´§=íiÿöÍÉQ!Ͷ#Œ}_žžÖÓé•Ù\[ƒ)lål{4Ò¥aØñ![».ðôàe¦·Sšît¬*dzçCÔŽÀÚ&kˆ¿>µ"î<¡2ë™]l8çtŸC"ÿH¾îÒí=5x$ãô0B"iŽÍöt|š6ØÙñYźù5UNNχ“Äqå-©_dغn?/X‹ÅÓŽX'çjŸ)yqÔNÛZC)ÿ¨ñÚVB„­"óùøpZ ºí:ÉIi³¨›ŒPœxôJ> ¾‚“ihl£¯x8ë2‰˜.¯Ddâìá@ê³ðÕ$-Ö•v 뉈Œ" ¶#YÖ 8ªdb&ð˜OÓ¢n±[i)!|Î)hf‡XàØ@”©©„ÓQmÐ=?Šå ~F(ïü¡ˆÈQ¿Uä+1DaÝÓó,‘NÇG8rue\X$ïøë¼yÂ|ç8º.·Wï‹~L.ãG4ˆvbû–ØF)UqO“w´+¤ÛüÒàyžCÚ)6ËõVRlfÀËY"p‘Ъ–ÖYì*}­kQ/=ã’2—ùr9}UmQÂ"tÂÖƒ©ëýìáAd¡ä¼åHæ- é2?ùôFW0a$ï9ÒÀs‡Iª|"“Q“ȹ§›ÅC¥C¢Ëb5@¾Ï ò8T²'òªÔlR1]Ù€–_¯ùºÀËÂ=–ÞQœì3{!´ ¿d—àiÏ §£ãqÔ6Yp>ˆÚ+6úÖñ,RPFúÄv#ƒc¸0¼4‡SR¢%,ÒÉht3NÈñ4h´³Z‹)¤—Óa—ör(-ËÍ;ó¯d²h&óH_\è]+×ëcJåö.ÆZ0-6¿wtÅTµÃÈŽ] ¿ZÑ®{’#6i›–sþVµFõ7Ç®C$ñMú!#—;wŽŽ¢/Ù‰±=Oº"Û08£ŽÙ.øQv`fNð#éÒo¦MRÍéÖ˜L±9:W2Ò¤bG EKqÌîøí4ö˜ô}ç!“¹W{t×®ZØÁíPÔ %?—àÅ3(7ó‘âªÔ#G­¥à•C»ö»:×½’†±*KìæÇ øëÁ, Þ˜êq.dÿÛt,äFü Wêí¿Íì1º1ígËâê¨..…ÍÌZ3ïIiï¢ ˆ×s: 4b)qŸ`n#%m~€7>$E¢Ü{ ²~¼ºñ-Üü!B³;%`ù¸uîü¤ø81~‡ªÚÜé1L^»q›—~&àøª»‰ ñ@\,˜ l‰IÙoæ>^H|ì.#.ÖŸüe겈Ò{Áý±v³ŠEÛ$\[ü%°?ŬÿE¡‚·Güÿ´§=íiO[¶ï3KTSTgͪ01àåòg[4‘Óg²V©=óÝÕ ð‡×’>~ „S±zÃéÿN²ã(88é?ìÉÁlÀ>• ZEù*"SÀ¬5m:yNT|¿4iþª~¾ÒÒPòèäR‡°, ñ´w|‹Ðš¸úܶ1­ŠKž]Š<ã’2‰s¬OÒnˆ4ƒh­kÜJª:•VZ úo³8ÓRQ§c#ª€Ìñ"®6”ˆV®b>y±¥…þ+árkû «Lå"Nä=Þ]Èeüf𤉨©‡ÔLÔ)öNç–Nÿi4m£‹«1Õ;± |éR ½ž÷ì1 wWá¬ÈCÑ€+óàö#Tj°ËõËY ÎOÉ¥UãÕ¦îâ}Ï÷W!“òoô2nJ@Z‰œ qy„FL"^#c›öÈ ‰=¯/+?^Ί_–HÎX/rû˜‡9>àmö÷“GOš!þCÂò.tWÂbÀÂEåÛ›áý:@ÐÃÍ‚!‘ƒÿþ‚ÓÕ(”Ò5"¸‚-$¬öQ®è;Tæ°ÂÄg•?Ë´»Î³Ï3ÆÍl]¶üIR½“s!Lè§ù5Wø×_(à!ätä$ù»;0µ¶T;ßìuŸŒX$ð…ä$BÕ+!hÅK€ÂŸ¤õK‹aŠç±uî4‹¢D÷æñ¨À/·Ï®v#v y°à“¾÷Þɪ®·u~ Úª§ ByãSôyÙJÒAÿ½<]Z“Â7â!Ð6Æ™~ìÞ8¶6ÙŸ}éüŒ>]i;õ÷ ý-?÷[ÂcôÿŒg<ãÏØ_æ± ¼iþ©1SÚÐA„Ú*Ȧy¥rÿaAÑMï2‡%ÝJðŠö·òû%Œn/g`‹âAQvüðîÄÔKšø!`õR'·Ë.4VÐÿ#ßÔ­UÒ¡HŒ4¢ÑЀ4 N%S±ƒZ…÷.¦³ûK(dÑY8ZÑy_Æ-2Df"_Äda²L×}§’YÉHíœI‘FÔ ³tJè3ü´BPÙÚë7(é ¯D(»Ü¶ þÂháBMN–á´¨!r^äñë±#,Í£èù\ÙÖm´1¦¾VºRPðkæ¬;‰“€C"À.!ãÛ¾‘¡4š²½[ì^#E0ÖÎUÈÞ%/ia…?QvÍÞí3Ø¥ÒQ([õº¹¢“;»}•éÜVà3RŸø=, Ûì;éTr0Ÿ£èó¤TæÄR˜= 6õÍ«¨®Yߨ´Ÿï§‘ÓÔð3ð~mÿ©ÌŸÜº$6‡g+P lÎåš'e ¤ƒz ÷Äþ3¦n˜ÉË®¿L|Å)^XúèØü»Ã×› ðeºƒÌ 1¢üvUÕÏ8E{Ù¡ò`©@–üC™ïVîùŒè ÕjKêåÙ¦Þ)¾l+VÖƒZ'U¡v?þÑ¡ÄÕ…Xú™œ·uv’R(]h•3óEïsËSQqk–óÃåÌ¡½v_²œü>ßm{”ßEŒ¼×z8«Â8M)¢[9Ò Ýñ5_ã;ÁÀ'¨zžŸ ‘Ãß„µuF\õ…–©OÑÿ­(é÷ïíØíÃAþèÐ{pÿg<ãÏxƇã«#^QæfŒâÔ@iÑ岇 ý÷éJÁ¶Xò žïÿï³àÓ¬ƒ`ºK3žPFAxOGL6•Û«„üÆ^üâ!Ì' N³óÒ¦óȪü¦dêkÅqŽž€ÇÄYàÅÚûºÚ3 {f¹þ I™6Rl$†àB`Žë#8jðr &¨HÅ&ÓßTôÇ J©E2¾N (jšC«ÄGغÉú¬Ê§ 0ª’þí°}¯–#À ‚q ZÉÕM·¹DkÜÑ÷c—©,Â¥¦(vµ¹bÞ £ÃQ×ßû|ù…ô¶©RYæ¾wÇ» àtž%þM¤ÁÁryi$Øåó1G°§kŸòÇN}j’̈[Ìç*оž…y™ « FI%ßÊ€¨œÏ„SþIù|iÞ 02Ú:œHM/;½cÃäF…¹@Õ›‰‘ä W^ÿdzGîýËô¬ôÇ/à²Üú*pܦm ½z0Áà±JRAÉ eKøã—?y²õ8äüÆz¾*ô¸æÎó¬™bL'ts•. oêƒNß„ü'5ŽÐö·ÀÒG¡q?žDÄÂÍ2¼ç—¤dÌèÑpA—T> ç!¸Í[`4A«Ø¢¥2Òƒž¯½C^áýüÓøpǽ™%€ê‹É”DXlÎãô@û°fóӷƬ#ÖDÀ µ°i¹Á§T\âÔå¡°*Ð.å’:»o”Ð}cÆ\‹Æî@Æ{¾&‹—Èï,•íËôgÎìVÒ¡ñ‘RîöŽþãO¯g<ãÏxÆ3ÒøgÊãY?5b¥ykÙ?ú mh ÊÔ)(ô¢Ï(¹7!¼÷nt°fÅðÂåù.!xÜNìµruSLŸæêð]ç/@ÈâNËi!Ròà |¨”‘–nQÿýþZ±*~.8¦î _€ƒm¦)ÿ?ƒ«:uc¾ça<¸û÷Bz]!Îì¢F‹…yQÌ’ íÕ2(>Q_’þ–‰ÚÖÍ .í±NÃßn“zôüýaD•§ B ¿o6t0¯Ãì€Z%8Nu Q}>wÿÜnÆ/Xÿr D¿<®ÿº]dÃaüë½P;/œýp,òD‚Q&ô—aÔNiù(È™h“gT åDêJ‚<™àg©r×oŽhµ}?§£´:±TAOÅ.%‡¶¼ !sS—•Ã$˸'e©=±ì™ò… $GsK±›%@4¥K¯Àñiú×Ý#z¯ÎÍT;·º‹cÞóñìz ê1W *ôn23ÆsÒ²t•9§ ‰fµ0å?YÞPr†ˆÍ7Z1¦An7ãpºR º+x)’?6V '¿…(A9W-ï^²ØXÃËýÅÅÇ*h¸¦/£¤îéOBÍÍóû;”ÛÛ9òµÞ;º˜vJQ=ú½û)¥}vnqOSnj-Û¥?¬¯Å2Â3¶+ÐN;Ì0ã4¡l[Ý_fÌ¿.ÊÿܧµG±è~0ÁR*“ùjï'ǶʠJ[¯‚~Ö^÷rv´®4¤²×N%Õqÿ„œ}nöµ½¢2vµOëñHΊ?:þb}¡jjõŒg<ãÏxÆ_7¾B2JÀØ$Þ¼ŒIßAóÄ.ån„z–èÆëNTÊvN#oÞìQÓW•’ ê:O;ï8ÕñgSO.K[. cpÕ½ë,”ÌÅéŒÄ®I:¸Í+–xîž“AœmxeaÇ9q’ƒ[}ÜÓ‰À@ºAÒ‡‚Y™ÄîéÇŽf#T]•~¼ÇOOù÷÷9ÐS;¢B«©Ü›¿ÿN–Ž6I€íõœ™¨äη´€þû\‚^µ`J0§ÔŸ½µ’àÈø¾DMè»5R‘à £OÂqm:ª*COR‚w FÿD…ãŸ.Ù2·H7£ìþý£Îšûõáƒ™Ê ÞÆ­‰» f©G…cIÍDÍ’,#P’Žf…Ò¤{pµ8ŽæÚ‹5Ëdãlöî bé$6¯¦Œª—T°•ŽaoI=M¡²¬­”¬æöhɰH®ín ",. Û T‡XmçÒŸÉ€ôh(·ü2gÜy(Œxw«ô‘ß/Zá¨u—àr* ºy5ÄÇ&Ùêû´z¡™7ÿaF)ÅøPf LN駈ŠXŸ˜c¢„ƒÙƒ^îÌ/’«³ZÈØÞS“YE·^™ÖÛÒ*ì 1ŽœÐF  îm¶SEÞ2£”ŸÒíÙ‡P¥Çl{Íœ~ #•÷6ò7C0Z£Ž¬v=oæzJÔ íòuA–VïÕË)’dùînhóÍ<ˆJèõ—>Y$â´iZ‘¸•º”ã”ÍùÌí3ù\Ji)M§[!ÏŸB·÷Ì3~òsi¶üÎßÑÿvcá¿¶tñŒg<ãÏxF_odÂáл¤#"Ô˜½2“š¹F:8 ûRàÅ‚ÄI‰ˆjLè?úb×6Ôr᪠¯ÿvDÔŠÎc‘hèƒ\úòÈk‹{‹Ì €ª$ÿâgO4þ{%f`vÍÇ-ߨb‚wY’CLØ:É‘5ÜðŽB´ôRãß®£Ês£ ß2.s–æI‘ YÈôùbBç~~!…¡&Áü'ù§ÜJ¥ !vÚe8eØ’Œw‹° T9Q*¼R’Y^wqx‹ZKñÕÆñBíÏ"íM½ˆyõ %…z«kÌ ´ã¸·ŒÞÞ%Ÿìðæ uýª@%ïϰÒK¯:ßNó‹­ÓÎ*vÍïó'è[èÿê}¿gÐg=Ì‘9ŸÌßS*]4ªJ²v¬eØ cV)D¢Í5¸h€‰­åÀ&Õ àX‹¾-Æ…¹³>Îuç¾åU·€Kþ`’¿ƒ:5yø‚¹‹á—»+&^”+ð´­ÂS®·møóVœéÕ–L2¬b ¸*ÉpWOûDòç´‚K<çç@ 0]*lÂþt#ÈåØõÆÙ”0®ÖåOºhd´³‹Ý7aã~è>š5÷»Ÿõ²ŸËÅ£b켂7 “‹C§øñfõ˜¦¤‡†Æª*µ¯&ÇÄGgb³Òš†žNØ'÷@\0æ%;4=;è??ÃyÞÞ€«¯©¤œß¦k»Ó2Âæõ¡¿úÏ¡Û\¾ì~ç”·öóûýï·??9;oÓýÆ3žñŒgümãKæDYyo}›3eÊ¿wv]êtI¦ˆ ª2V Ì!Pƒ©Œ˜.¸á *Žv}½tAéÛ#FT±JÓwÝY dFT7õHèŠMª`Àð’L±3JÞ_àÅÁO;þÿß‹¢4Åœ€Ñ¦µæ{ãKj$ï æ*2öÁ7ü¢:Ù'œ N¹ÂCÁ"=OùªrH†6œ¥|LÒ‚›yxa}›eŒ&DÔÒ‡]r]$°úëú<¶Z0|¦Á7¼~”ôæîÈœ6ŽKééIJC‡ rÙ€q5òeE+IÓÈϺ."ß|MËmï¾àžÕ gïá¿#¯*ºNΈ‚×f¸? …Ó•^Ôvø "”NS­QÑ;‹?$ÆV[mÓŸ¶¿'¦'> DéË#v¨0ï~rЋç¤S%ñ²³¢ﯚ‚l@-X&ÕÞ~œ¢Sd3íü@®çä±üìR¼…[–ÿ± 4 !L®¾°3xàªãŒž ¾ü)@)ËX饸^ ´(…ŸE‹¥†ªnö>¬ð#¨C^¦r‚¹}-µ‹ý¾£57 „Ñsð¯ØìŒG:vmx—$'çUSø©ÅàdŽ’í† >*Z°¹Tfs“vÞ|éÄgv!™n]Z ¶äB {Ì·³óE¿>ç{¯˜…ßE˜·|mÍjž¡ÿUtѳ¦`s[½Awl»ÕÌdŠZ¿º¸íÓÓ¼£‹7&`1¯%¯ç?3÷¶ éü»ãZÃOÞ,Ê/#¤½íþŒg<ãÏxÆ_qâU ÿe®•z@‘“–… |gýyN…#7™^×vÞõ€tÌÊEÙÌÆV´ÄpYÔ;‚P£RpåAÆy¾Ñe°¤ŽþßN¤ÕŒÔkÝ*?È¡µ€É´õÍÅô”À¥S ¬9dPá¬LÉ]WG(\4«³ˆ™‚%ãp°ˆobh—2ƒ&åZ¾ z’Š42Þêáò7ùš—S'Åiß¾l€KΨd•T ƒ/¢Ð=e”<ÆwYq§Ð [!–ÖÊÄ»ÞcÖZ’4.ï¢j.AT0óÅ9!Ó/3:‰ŒÆó%©­¨P4ÁU7Š*Å(¯Â; Rz[Xÿ(?ÿvMàhI6ŸìJlÛ2‹rgtÖÊ®/êVuC„©`&³!×Ö¢«dˆ‘©Mj`Šq†.M¤6X1 k µW†yb[Ö°é³:ý·]”|ƒÏˉԘD'Wh6¦4/õT¼ÓRG$ÄœeíTçŒzQý€J¾@dQ$ªüדÍ æN&*FûLJ|äí¢\Û-º^íÂ:éìåòéÛ-&6÷ENK˜<Ø>¸Þƒc¿ÛüŽJ3.Ò&-/Ä5,´PF ¼äþûKÆgó¹z®™…ºBóvÂMóD•’Cy²° ÛéCMëx*ÜÚ{rfZfý¼Ù·e/°è¤AÜñûe'ü˜ø?ÜÓJÃÎfú©"Mí*Æj‹.õêþú¹úЇ'ÉïýG§%ñ×ÿ®ýHø.£œV¤ž±3=ãÏxÆ3~2¾:ÜÁ¬°ãe< fB˜ÞÎq"ÙEîwkË0hÌ_m÷zpƧD óFæ¶ñ$:„èm•]J@¢ÙH6$|‰(“ÂŒ°ÿy:NßK½ŽÐç LÒìÛ=+dèä%«r\÷ømöíÊsZåF¥ô‘RyŸ„§3TDàê6g…AÙfP9T’„Îc–âÑX*+H$pêNb=¤ÿg…*p™à×U@LŠ|*U»±+9ð·ˆF'KFé‹=PBØ6úrÌ´Cl˜(â*§ŒE§¤©^šãž¨Ã¢n4ùžÕײÏ9¶«Ï®#–s&‰t]îâRÂÈGGŽ˜·'&Ý8†¾×~8ÓþŠ˜T9@Òáv——Ž’ŠŒ>âÙÀÕ÷p«0!®êR[ ”pÆêfy¸žßç×Û<›þÌïβ®”Nr¡~BŠþ'ô¿d—õõOóçÆ/}£Mi*޾ŠÕ‹_¨ üEéÙÒg¥+± ZÍ¥2¼ëœÙÐ+4Öiý×ôÿù’E)  ¡(k7ë?'çÆ¤Iô {%4+ÿž¶ï²ÃfùX•H{cUn`â¹Urÿ9[ÉëJU‡ju\Ü{„ÍtÍh°XaµÔíDK)0|TD1¥öS75J‹@ßÞ±|/À½¸Ie{#A¬.rþ©>@;ÇZz"š~Y6ùÌl&=z‰þïÈ[uSÁvãW«LdC>ø!(ìæ°õB^e:Öëý žÇoÃ7Œ þ’ëßdHìüÕƒ_ÿÑ8ðÏxÆ3ž±?¾èȬ/34±VUuÖ²G‚ÔçÁ¸#|ª!óMœëæÍš‡£ÜÞé"Úž´×ÑÅ…žôdUÀ§ÀXo1ý.«è8„ÐTx%¥–w^¢Þv¡ÿG JÓOþŽhn|!¼¯Ÿø¶·ú?h‡lwFÑíî{Dux„"°œXH÷pR°'rŠb÷êÙ‘hŽ Ej³7¯Sƒòð¿\H]¼ \Ù%â­·cÁýPækŠ~Ù»·ã%šÿíPÚÄ/]cæeÖÉ[‡j\ñÿð¿Œi²>À°1=ö1èg“ûn æjÄÝ‘àÑÚ4ÍÃÛ|ûô+Šeßÿ l¢-€àã921·?y’²Z°¼³ÍëaŸ>??‡Zš™ñ›—¿\å€osì€ûÇÚÛí»ü.ˆBìŠ!Íäçðt’SQy&zh&!;MK`Ci[O|1I’ÑKHw~^sžÅ‰Føç“ädO¼Çë6‰èS$´u瑵D¸|êí+óþÚæÌSÂ5v.?ÄÚZ”2æ­ÈÚýºŸ95 ‡ÃaMÿ”ÉÅã&›oÛ~¦‰„Ñc¢…›¸óN Ãmm–¯R×…ÙÉd‰îi‘C¾‹?‚;®y²Q~()fJª SÖs·IËôÕÐ:Ç" ³Œ'È(¤åŒÄ,*Bý=ç(!¯hÏ’lÓߦ[²™jÍØLãï½ø¸’!¼;`r+II&ÃF£„° ñ‹CH:•èl˜¦xÐ?èqEêÙ}/!¾;«—¹-#»e ,ÞÀ,¾ª`ÖÀ 3Ãò÷ ;(õ¡‚Ui}‰T‰Tx+ïEbçñ؈þ[<®oÔ]rξó`Û¬OR\‰qÙ–EÁfÖŠÿ<nY ý£ÿ¥ßA-?ø#ä›âŽð=¦Ekû]â¡§>„H†s)ì)ÄìýÊâ‹©KÙýŠëѶ4ä{9»=xÖŠ»€¿G”‡HN1Çù^€8…æ«R¶ùꓟÓá'ª&ö5Bþ‰c)ô6g”f A/¡îr³fcZî@®P ýÀ8PEŒƒ,jŒíYŒÊ®³îÞXØT·ÂŒEüŽÝ9£æ];úAQÄvs®–®Yh¹@¹Bn¡¦-ór=–ï„íÂÕ¿ÄžÐPueøñàÿàïDÛοkøëÏxÆ3žñŒp|¥Lã®t„ÁЄÓªœÌð«nN%Ñ ˜›%fíâ×hvÊĦBRØ}ÿó-¤ãX´ëRÒ® :Òô‚扻þ¡Þsùu/‘ÄKŸÄÏç›ÉËX%3&Bx#W·(r ¼ w ƒ<`€ûÔ ÀFZ9Áæ¹-l ÈXVš”ú¬û•¶_[y?¬Ô±Ïëÿ^•ž¡‘å¦÷ý¹Ëäà¼D™xáÅô“É ƒCY®ëì4”t¦7†³™…L¹YÄ…”SBÇ⬦ļÀ5º…äñzb ΰ`»÷ZZp];ì‹—¡ÃétÅÈc8{ÓIäË ¥¿Ó·%µGbÙìîű£Õ6Í6@öÃð+ï,\Hhø¾¶ùµT†³®ûòìØá[sý‡ mdYíï FÏLReg|bqÇ£Écç™]Јkx|ÜÊÁ0“HrØU_Îz%å´oÏ k^µ@ÁBäw /®¼:öa ÞVÏò <9·—Ú'Ô±?ù]nÈ“† FØE^1)Ä«-j„˜Ksûq4xt‹ã(Bq Ïæ6ŨÜý§Úƒläƒ$ ;pŸJx#]áhÐÿÙoaWÆanòIµf?èqùnåÜÒót†HAb{ÜÂÖ{©>Ä¢éd»j?5`¿?ÚÐx¥®ϰƒ¸þ]¦H™#F¥ë5´3.‚rö˜fÒsʵEÐÆ'¹ŠIú g]WF Vbúëâ܆âZŧüèÄ^îV`ÚÞÔ®Ø;c?:Uþ)ýŸ`ô|büÌà¿ó„ž Æ3žñŒß_¼BÏ=÷˜Žÿ¯t͈žr’T˜¡X„lDXM"o‹˜\œÊäω’ž] Õíß;h³Ä!Öìå§úßE툾¦Ñ€œ¦-†úç­Ï;‹»Pø¡%Âø£&dŽ-j ™‚E”Ö¬ÿB»N¸Ÿ®é®cûžöÆ(Q’I ¨Çñ©5­#`Ç'Ùö9¡àÁ)~^e8g™Yt°0ÇãŽwt¯¥×Ýš-¿zûêà ƒhÌA‡ùrÀåãž zî‹öý§q¾çìŽ#©?æŠl*DZXi.1³›ôæÎ PAï䪇ɘۻ^ž—.–…ö‚—F™±ˆ~-bVôSÈUŸ¹Wãý/}7ÀaÇ/# ‡ñn½ô¾Ú_£Ã]€—ÂR%Š]Û<©ù9¼›‡ª–m 7¬ÖçšßÑ’‰“gq’ÄNUÁ}i•çNn«­@ Zïh™ßV(‡ œ÷ã´jÀœÛÈÝߥÜû4åÕþIä·»ò‚iT㘌aþ^íÏe¥8lY{"NÔ½ßY¿–{—Ç5¬ÂfÏ·|*(Ê&Xo˜Ñý\urD°YH¥6& rìßS›0•8f;!Ìî=L#{‚¹œE|¼R‰f¯5<}Q(í„t$åŸÓf2{ª¸5®=(Úagÿ'ÔûoÿfŸm¦æMÉîM!ošùÍ&rÎÞ>³ßæÖgö§”ÓôêW¥ñzØÉNkBýîÜyÇ¥ÌLS’–õÜ|.·Þ_löûw#¿ݵɌò?n–þë‡ð{Æ3žñŒg|<¾Rœ*0;†ˆ le:QÕ"¹X‹±&¹‡Ó µ;$:Áý’ß—ÝVS˜ ¥tyýíq_äyAigø<ÛÔ©·q!2½éëuS§£›9ùr§bqÀHû¶ ¿Ñÿ£`Mdüµø"œÍéyõÀ;Ž|IÁVḦ,¯ä`†¾üBïÒŽSMF¶ãUòí°†õnŸ"¦~ïåpÃÖI)(ÄÜMöÌU¤ª^“4]͆^¬ÉÝ0ì‹qÁß§Ùy¾ß6 ”þÕ M— ×anN¼B«P»>¢¤Iú™( ‘ÌrµãFóF=Ê4ÀN¦¶à»ß~­® ß› €,V@3ûe'íàÕcãåƒØd’Ì,×Gÿ>¢m\–£J¤tôµ`~•â'€àÖëëw3Óýý¼öàá ŠwûÅ@ù T–²SÚ`RË(’\±È{?ag,® ¹‰½# Ww÷YÖÖë¬u?‡ì=6ÿZþ?¼ªM¤¯Tˆ-ȆîÍrÑb‡KôKa‚i,íúÉñ‹Õÿ5°ö¢í,X¶ïÕD´šþøhE0Ï[”t$V”0;$ñƒ VÀ`¿ëS›ÿopßì¹ÒlÐ[묆Ħlâ91qY˜.ˆ@-|¸Þ8Së û. ìŸ$4Ÿ/8õžb%-ûŸº®×·”9©±íÉVãØû%BGa±ªã_ ´1åjM6¶Ïò˜U%Dwã·­e³oß‚þdn]×— B4T/6mj#ÔÕ'6ô¦fš<ª0öqÕê·ÞÛ“6Þùý«cžßtbxÆôJxÆ3žñŒÿ¥ñµK¼Ý†½Ñ+<ÿ·°E{, ¦\ÙîM ukù΢`Èé§ÚEظîèä êÞ ìA¤rKT!7güËKkþ5KÇq1ècî:ŒÎŒ/{ÀÈ¥ Âì´A"ŸÂô¯H÷(#¸f”Ôí ÔÅ“÷@a…ìÌ!˜Piz5¦#` Ⱦ;<\1Éú¸€qÁ¾çÅ¡>iß4~¾ß×|ÀÎÃì¸j©äæŒpàœdV1ßÛA ?õ¼µnDž„¼RqNÇXœÖ aö}¿lV隣½c§t-5.‘ËÆ/ûËkÁsÓ¼ˆyKm·$øêÌ8†x‘_Ÿ`4ûuÕÇ01q‰¾š~ìW§ؾܰÆF…ng3ïvnjÙ°a|–†q%߯ÕÓâJ`6Æßâ»DvÄñŸd—¤FÃðºo Ã3 æ3ÿž!¥ôÆÀÀ5ådÎü¶¹0î?ôM% ¶ø¯fZpoa¢™«ßd?P×$±N0WY±x&ßši¬nµúºéͽ¼"P‘ÐÑV§k~¥>k|X[ñleé>_îMí…Åò5Lº`¦]ž¨RŠŽìŸÎü_±9 ÊL†x &ïÍ(GÍå[’óý‚f <ÛÀ¦è¿èŠž¿ª6Yöó6‹»s]™ùؘÊß›üð” ¾Óô˜ºTqIhF_/4ûs*ÿòPúŸA“`ùÏxÆ3žñ?2¾,b©UR&ëLô.ß8ò<ñG¤íǨÞe¡)Æ}(:…á;XÆ‹—l{«‘4´ß{CÌ@ö£„·Ïª9„ñ¾˜[=ŸòÜL¦žb€à%’N'7žì<ß²þˆÒL,cÌóõå\f‹€ÈÛé²VÍ^’9Ea™NÜÆÜé‘”m¾@÷Ú{™ n¸E¨»?ÀÄOL(ö•ßǘ´Óͳ/èùbmá\H0quòñ ÆFªÏàͤi¶ÃråOäP6gl>±™¬®ã,òç‰ð÷¶Øi1­¢ýR‘Ê<ÐKåûΑ'²ézÞTGš„tgÇÎÆ6c ’Ã{g ’¢QFœ‹þ6õ'ñÙQÀ^žþÖi7ö3$-œZ§„É C”˰ѲˎÓSÇ@¤'mÙW5ÄáÐ_³Vz܇°åùyŽû??eõŸì}›yá.æM—DÈÉXjÙÙý¯²¥gã~+nÂôUø›ÿèÿ3žñŒg<ãÿ“ãk'EáБMšTyIpl}鯯ÐÍÙ‚ 5;ÛÃLßy³£)¾¡v*$’u -FÂŒ ÝëÃHÕš` wÁ)%õuL’ŠÙ¥H½:dÒ·˜`áy­ÿ¬ßú!‡áˆN IDص_¼~ Q`*¹ {óÒ‘í;¦oòH‹—1KIøÝPEW8ôˆvœÛÄ ÊúB—¼=F·‡‚´‚/%gÀõPÄ|M]öeu«ší\‚ò¢^ÌsºíÆ(ÙA¯E¨9¬ÍðOÙJï7K‚­!œìFÆof¿®¶§m5ºU:Z7A —¨N꣄°9µ® T…È©?ã~rÎ~t;‘Þå{çî¸zÍÒ·Q¹Åõ–p„Cªú"ƒûž]'@”ù_TPê«bÔà, ”=®DåÅmAÙ€Tðéq­sxdV Ç|¡Þ,y§‚—Í>ëÓg_ Dv"%öÝ'¨Öi?{/¨W¡)( ‚ Œ%nØ}[ÓÚO¢€2l]Ä<( îÀ¦ n®šæO9ºƘ/³Áµ+±xzc}5d l¨%úï öÝÊseN×AÐAyŸ1ÍTaó¹ãdÓ*yû?Ýý^g2ˆN £–]jSÛ{jâj˜Ï:–à§#æÃO¯[Y†wå^ÐéÌŽíŠÄxk7­Þ}=““>d=dœÔU&ÔC¼åsjÖ'p>dÅÏ—D2ª‚–oJeÔ·lž–ÉRG_†dõx¯fתz€¿²†d2ŸAlmx43ö³#—[Ëžÿ(úÿ/xçö®yÆ3žñŒg<ãß=¾,ºÔÖø1øæÌ “Þñòñ¦ §ymØ­È,%•– °9ШZû°ã(ÓÝ5:æ)gì´Ìrµ?£¤¸OÆ.ûß­ðD©+Hý„|F— ²üb§TJõºa Sü b&L‰^ÐäqÍÒ·Ï7‘åÄÆ†k2E/ùÂo ¯qD%œóWœç°¥½ùξœ@  –…žî«}{DÜ{Á„2‰F…qù\£Ii£Œ{¸þ÷ Òítc_v¼®ù¸nö ö³Sn¨môýÈÿé†LÌ^Íçõ@îS¤ö¡çÆ"%Ý[ÑZ¬WÁY Bf(îÌÑÕ>…Ÿ÷Ma€§¡øt?Sw8xf}È{á€rŒÞ‹a¤LM´¯´,8f‹¤¶Ý%s ¸ìsI;¯Øè©õÄO<Ÿ>N="aQaØJÇðx`âúB­Næd¾ì <&ü‡Lfš¿Îx¿ÑŠ|¤i9v\Ô(J ŒÚ6S]I øC)]mhtsÿåì¤  Ÿùs#Ñâr\‰†ï¬ùZ5ÙNþ±ÁYÜïëg%Û€ Ç¿Ÿañÿȶ3ö˜#Y¿= g~ü$‚MkgcòáÓi?ÌЊæ´qºg "¼÷-ÑŒ.¨B(õ<(úŽmµ1eì·3¦Gj¹ýßRãÇßþ‡ócó)'<ãÏxÆ3žñ/_ê„ñ¿ÅÇŸÜN¤‡Â¯Gì~ûÖZQ‹.h©ØD“Ñ`¸V¯*í¯•ÂÜ1¸’CÜs0 X!œˆöš[Ñ-^(BÇUØ8içétTnLÿ³Ì§Æü.~étÜd';s£$¸Òƒó¼ °öëpòå¬äÁ(¼Røù|”¿Ì³_×R¹ Ñ”V¾mPþ¥Pöõè6)XG‹æÅ^ ÇáñV1zãÚç»pëõgЦƒA ¶“LcÈ·‹ò« ÄC¬Š«„YøõŠë¡H²àæ”Eû\ß䑉ö‰ˆ µ¶U•qèáx }æjÍ8‹.«áÔÉ1L¤‘÷‚i&ʧ¯ c[8¬ß)b½oâpßM;_ Óìí·À€,_òšK7¢ å%‘Cžï‚\¥ðVÒ„; Àån¼ÿ§ ãwätÅ0à#×±0¦È½Çõú"‡L)¹^õ©ƒIéDäל‘‰oASˆCxg1\¼ùÍGóÔz%Ý£eg~”~Ï^©Ëôg,ÿRÊO­¾¨£®¦N£Ô-· òÖ÷E¹j,ÙÐø .¾›Dl(~Ö !®\ÝÅL…ŸO‘Û°¿Þ «¢µ–kÅc%ÛO˜DjžiÓ32L’èAºÂË^#Ôõ­Êöá^j?)Ê ª’ºfˆOêG–°†ÿ>[äXíbl•4KàÝ¿‚k‘96@צЋ׉’@'Äg+osªïîÊÛ)ôMmÒÛ–%°,/ëÐÀWÔÃL¦œÉ§  Ôïq, àSÁ¨‘z¯ªÏ^÷ÿBœ¿ñ–|Æ3žñŒg<ãÁøœMT##ZT¨V¢‡˜Z]Õ„®šòMiAwM‚×0hãÔ¬‚ìQàZ2£¥C“]6ï?6MÂä.ª½þÿÁàǪ&Õ•$úR$[Wa}Øáœ„“®ËPið«Î[h™O"î_9.çX9£vòŽ·Fg6~·AÙ–™2óZÿ¸4…,::äÛ<DZïÏ|or> ¨•ªÉÐè“sÁª„ïh<5ò\H wË J¥1¨Ðïfsk ÁÌN¶ÍЯÿ³±ª¶½‹g¼øVôRÍ¿VøK#¾dS9vª.²öƒÊS'L´#’^âIí¾ªœy5|JÂû¸ƒ†…Ci{›ý¼D†Çd‡ÞJ2°Ï;jAÞí;ØÝ‰‹1.¿‚þû×hgú'-\¨¶R{Ç»ˆ4,36¤D(®÷M!ŒÑ]7WèJhÜk_X¾D¤âP3E)lKO0§o(=â©“œ¨ÙÖkŒ³é• »ò ”߶ЋÛÙ;ïå!Îþ@ÿÏxÆ3žñŒgüËÆ—H&˜öÚ­¬e¡´d²jaØyµ}O´ñÜå[Ñ"x7~hš‚Ãá*LÌ$/‡Žû¢£¦ÒÔ˜$ìË £<`Ç å4û¦}_ª>¯ûp¸0Nã¡Æ_×Ç^Ï븰¿×\A~N:Ü ¾ \´âÃÍs‹Á/¼Ä¦9# ý?Æx4èP¥o<"ôÃAÁòð®H64…þþ{œZÙ"zBÅ£cË^c]{Øq¹ÚžQæe6p¢• 2DÑžÊP+‰eø‡¼Óµ}HûtG·ü‘U*ƒÖ?#IðF#ðL8Îý"(1~³S:²ÃøËì×{µÜ*=tõÒ“v¼,®ëäÿug湆dBuçnû¸½¬q·D¤KúÛÕ6a8ŒÇÛÞÖØÆ£3¬Ü\b¹—^µ‰9ÓF´èNŠ¡?òÀ¬¶òucñ((ú×+4@…™…§HJ>¬ø4†ÉB 虆8Ñ ŸòXnëƒ3‰³£{ùÓãi"PM—*%˜‚w[)JB¾Ø–~Z-uLàiù,Õç¸ §nÆ-K½ÿz7æõU¨ª§¿õm«ådþ ú¿´ß{Tq!´+%–C­¸PÖŒ 7YZˆG™<ÒЗ¥ÕNX}§,÷¤"tCìÁ°ç¸X´ÂE=|¸ÐKñIëñ›„š’¹9²“õ•²M}¡ëø-ÜZz5KÆUá]yŸ3PgIB1lª„#”÷'<¤„ÂSwo°,G ‹¡bÍÔƒˆ¯cêtñ­Ù´Öˆ­ƒ\ ÿûÍÏD¨}yü>SôŒg<ãÏxF0öð™ EÈD~}g«jÅ1— ÓÀI” ºl‡˜F“}®É““œé0 òsë×BAÞ µ3dj(iC*Óc»$ˉ,¬„äêD&ì ŵÎûÔkïäpÓ·oïÀ7þÏé¾çª=¼ol Ý8 ÇåGjã·ÞÎÀgô|Æà­‡dÊÛ±Òì|ËÙ©Ô0%îq¢Œ@¡èÕxJ;cú™D79ðh Ešªz¸k[¡kË€×£@N?É ê2T‰PôL¢&Ò b#›"økëçòø}›ÀN¼áé1ù>•EØL¦š ÑU†ÞƒÕ%ÉÎ9à(«\R'hæ ›ˆ¦-a‡D‚ô™7~xgæq3Üw^n‡á¸~îû2~¹D €ï//—ýõ»qäHﯕ˜ÛFΆWÙæê‚“¦ãìWÏy)³Á×#íÓîˆ}À=GßjP &¹tÐF€8i­ SõYtÆÚË3nðÇw{' IDAT):·fh82¦ÌJÑM¢ä»_¿)@dAà¢Ó<éàÙá¼Qº@¯`jÙý,æ.Óö&-øÁ¸‡å*<«…ì(žŠ;P²}ÞÁ1'þ+“tÏ¿¡OÝûá¼²–u%ù"7çx6 ¢ý»˜à|Ãâè÷&›ùéh:Ä´WRöïšÒs3µm—+ÿPÖÛ2€™fu겉 Y'irÊ òÙ Y»M"B.¬œ]°œL(ÿòx<Õû/EGE:I´Ýìœä²ì ÓUËÐ?ÕÆgýëÕÞCÿHJ½¢,LÉëWç§'Àc«ûÏŽgÚŸñŒg<ãϸÆWΊ‘kþƒÆ4XÄ9ÞSq•h%mÙ‰–ý]K8sÙGü3XD½o—eåMè“À"a@l@ †›¡·$upÒérH¶û믎ÛÀõg¿7mÿ6ö¤´ïóMÿ?p50zµah}¼ áûfÛ¥Sô@ÿØñžÞ\‘ø íxylzŽX‘lfÉ|`Yo—¥4Äâ¼JîGý‘-»ŠÂ»Âq/¡›!î„€$ÌÝwcºû²@¢ù+…‡4'ÁåÙþ—’³ì<ø^9'°ÓìWIT™ÄŽº 0òINhÔ¼Ôr¢‚¿ý›Ãå^š‰qCùS%4÷‰Ø×ÇŽäüæ$¼õEÞêgà­ÃÛ ÛeN¿_ã0|o™ï·šÖq~…DŸF—Ê› Ëe8©¨÷ÑQÑ×nE´)N@ÀZ4¬Ôbý‘Ë%þ¸aËm`-Ëf4›w–÷!þ­‡Ì|‡–?Ò90IžÏÕ ¼¹¬¼~žÖJêý° ´/ñ¥2'S^´§‡z“^°X†p¥Ë*5öòñR¿âSŒ“ÆË—ÍϾDÞ‚„ZUÁ[oÒKë„ﹺžŠ“îÏÁ¤-5.ªÜ¼‚Ý™íæ$¨CFš©¶+ðs‘´åE²Ä6âíÙ­‘Ù1Qn¬eæõ;n[S(Ö‘õ¢ÿaB ÕÆè½SÓ².Õ¼µÝ]•>•.¬Þà†Ö¿•<+Sµ¢>¡XÿÌ )€ÇÜ»xÂúwB—òjççåÏ,vìÓ­ý§ §ÿõÄv>Øý3žñŒg<ãx|…´Çãq, KŒ8=ß_è3zF¹]_Ë6cg€æ{]9>Yû¤vŠ”Wòñì|U,a6÷¢dˆÐÖ8Ëg‚ŽÁ}Œ.j±ÏùöEü<£8Ìàí¾èɺÊÓ¾¿íû¼˜þ¸¸çtj'‡W}-€óýŸ¼õCÌ™¯Þ¸ÿMs&£¸¹K…Ó±ñè$cš 7²ÄÏt&BÖ•I|¿Šx\ûN!ްBz©a¾c& ÿ/árPx¥ÞË€X%„’ºÕr_Ïåø¶ãê0Øy¼9ã-÷‹ Tèš'ÊKñöÇý >c ƒEºÇnóê«Bæý±3 (€´âÞ Waâ(BÀAZé‹Ë¾µtÞ¢@ÇpƯ«uCóçå·áñÄ „sãÔtVÛ£¨YÛükÂLWÍJÍE ŒNn¡ŠÔ·Z[»Ù¦[ÉküNÖS%dç*C¨níIÙ`UŒHrj,'OMK÷éÞ˜cî˜bü ªû­À§_×£‘Qÿ‚ô©k•‘I'|ZdLµÌ…ž¡^&NÚ¬F ||‚m…1¸¥KLè¯Öª>ÜS<3åó‹÷ò¦ùd{Èæ•PØçDÆ÷'óïŸñŒg<ãÏø÷/o?ÅISj1h…¶*ÚE®]ó¸h4—¬Ë¬ßLËrÊãÚ4•Í_ÅÌ\w^[K÷P¸—:±™Mr¸…·ÑñË•7zÐ# ‘Ž4Dá+Ö.¯Ñ Ñ~Øõý¤Å¬Çl¯ùmsúmv*6å¥?N¯-¿«pÊ<%]ñˌɃNúž9îvXkÈk^ÆJàÕ›0Çes£Ïãç‹ C¾©ª£ M‘W|·×@*Àú<ªo$™”ó’Ï:®†€“ïVŒ‰zvªsAµ†‘)ÿ^{w?ǵné¬/|O!¶ ì]‰¢‡×].Êêðf—(¿Se¹/nËWá1‰ï¼Íog𸴀¾ï5ùrÅ8œ3„'’_2A¼Öüy\÷x×]^J\ç5-‡SëºáæsÌ ½›ôy5"x»ZUÒã»Mªá€ËTùÀµ+!d Ðyá²Îa‘;†ªÒÕ4R¹qB½\0‡&ýß–0Ü­“DzGÿYဦ¸€ÿ(Þnëôyô¬çgšò LT4W¾AÁ¦r‰ÀÖ«Š"^¿{åÿ!^Q¡5n ñ¯t(¸ñP h(î½cÅyûˆ1§k‚Džw?L—1Ü©¢Áwþ‰ÇÒHGǵfˆÜÊsã³ci.á°´ýò;Uà¨ÊËęϾÅp¾ ç%ïó*bý²ó×» òþF¼øtnWoÍm‡`FÄ;Þ2\¬ÿemba•¯FóápåéŒDöÙ:‰D•¶Z´åêý¨ ˆæ"§d„U õŸ‚w±‘q ð±ü–B™ý‰DñÖl¶CÿgÛw²Ý.@xWr#!b4dJ3ôd2EV´¾ ;h12#1ó¾*Pªéyí”*;ÊQüigÉî±Ðú|ÆÏƒ¿#ÿý×Ó¿u<èÿ3žñŒg<ãi|Y"(Ý ›c' 9À‘7pãë‰Øyô¿¸òŠØt1”¬# ¼$PC¤£ÕÔÑDžŸ|Ê—ô0mŽ{þâÞ-K[ohSµ÷œ„†$só²§H!øA¯,J¦üãj~°[õ¢µg5{…ºpz3/¿V‚lR°”µ=Š0É ×Ü}†Ùf¡m´,û¸·yIûœeé ,mœõ#Tãêèîú2píœ~ô/:ÀôI³BÌ’¨Z ýúÙ˜qãþ£ñæ#Æ3žñŒg<ãi| 7HÌÀ©ü?ªÆ\·h`¦ynŒí>ô[ЮŠa"2¢ç·2¬Q}õüë(7 $Me8*Q¬).]€YV€y+x83 l;X¬øXòúC\ 8ØúôÍÔ‘fnßf/™òó ýŸt2A ûêU¿j.WD±(ÛmPHpN&èÞ_º:ÊÖ¶«Ô„˜E3迆Ñí£ „ãÍô¿î"|œf0žo§z½þo÷ñ í;„“<ÂÀ5î=;ôs<¡¥ ÊèÓ¡#ãv Ɇ¥ dô@ÑL8m4šp‚C)ojøw2ÄÀtGˆ/ ÓËjq£À3P¹ v\w¨ÿ=/žîЦé LÑRÿ“hà.+»Ï¦ú üyþ޾ i¯Ó‡¤|™'¸_vSù’Kõ³‘Wé4øÔ±J¯›\²¿#®çÖªá°üä¸hïX’ÐSc²@8º£VWür²vŸYòµ‹Í$øþ3! ¾àµãÎÏdÖÐD åŸIu Ü}þUªEÄ6]'PNÚ˜…îëëìY'lDnÃ5*Í1ÙûÎX¿LN§û E^ âvˆ£]t^7A0-3ím’Š.ØÝÏ+êb¬K¡Ã ºŒ 1LçjmZ²æ?©ªy6ºK †KA§FÿÁáûLÚ3žñŒg<ãû¸ ˆ}ï1Øö€ÇÐ00ø\xÊšÆÔ8ó¡äHè}átºªrl«~ˆßM¨ËXv};wF4 SÉG!³3 Èú""›&K¡ÚåMzÓÉ‹‹Kœ¤c¹WŸ¾[JÈ2µíFÐŽRw¡kD˜åÑß6²døÏ{ºÞ ½ªÕƒKs÷Ý.›YÎá§·MBY§Yʆm ¬ œ ³Õ€÷õ¹ód7InZΗW¿­¸ -Èy qÍÐå¢Q¢sJúo-þK{ê´aGqXyúpætjìNÔïÿuˆ.^w gc`´ãÿ.Xßë½Ðx¾K ïë9¢÷SÔâ#»ÏLºJÀèGoIRWP‚6¾bÚ£9,ŠŠ½(Жc ©pìŠst=4bÎ±ÈØó!$Wlœp*DøÃ›ÈŒÔÍf=Eõ–äÊŸ굸¡ó^#¦/;s¨®Å& îÀÇÓü,X-'h ö&‚$Ò_5_9øÄTS)¤a)ÇÁoå&xÿ®XtøÑŒ•þ9P‘>q‰Ä΄comÞ4ø8Ö»k]ö”°” N*°ÈòÚÕ ¥Ù‹Œuîí§#ÊÖŽögi¢7Õöôp•}¤³T.%R×4æÿP³g^ÊfkÎÎõ¯rv"Y•6²Þ.Þea˜€P:x'á#ߑݕ^³W­ãôµíM2µ¨‹ émÛÐüQòÃKÅoK6ÍaÿKíÏxÆ3žñŒgüSãk°6àÀ‘$qŽžƒ\ã$MsNNYå$)ãe1Š’—zŽ0]ØÊ ÜDüÌš)LÖdz!ôe…†F\þô@Mê l“¿V4 Ha±GÏ@tà¶޶¢çZÔé#Üæy” r_HÉ|j5hb÷DÏƧՔX"t]äAå<=@ð“kÈc"â1d‚’Rù ¼h釽,€A‡úoHýÄ ¸ õjà¨õB¡aÕ7g°ãŒÂh4¡ƒ_;v¾/³Ükˈü?¶~4š®&æzo˜Z_"ïæ•¨St-ÞÛp«èjv ÎÀÄÖ<®Á©ÛÉã&Ìæš 螯U¡-W~˜@EÙ¶šÁêYœØÌÏÚ÷yøÂ$£‹5lÅMŽv¾Áhêõ‚ØÒqfdªµ¯D6·ÒE¤!NÑXy<ý¸‰ía³"½ËXPøýf{Ç3 5Bi޶|‚ÖÑö4Ðe£—`ôqzaœ¾Âê{‰RŸ }ø´z‚R‡0têØx5ë÷$¦“,6ÊtYþÇ‹dò5œJ¾ø3–= kÁÞ –Wc{ÖÉ}´¸é¸$¼~àú©wm¦ü¨®k¦ŒÿW{ ““Êû÷ºП¥ Mõ$ ~Ep,“b>Ÿpy4µç@ü¯ò§hŽ…ô~¬ç´Ä<}8MþÛ†=µùMLüéYñŒg<ãÏxÆ3þ}ãkÈsßpLè˜pKUM ³½æ} ¸$Q¥¼{­D^:ÂË©øQtõL—ÁÈK=Ó%cŠ' XÜ*7é_¾iÅ.U ¤;ÂuÐ*alƒ°HÒƒV¯/šþ„Çâ¥á~Ká‡‡â“™Ä DNf²Ò‘CCò<_(©9à¸llɨ]ã( fx­ö˜’VÔ¦½%ÌYþ²€€µ.%”©ê]û†e¯ïYð‰eY¤±ûT½arq8O˜Ól}‰ØØi‡ â--\å¥n_eV àÈtïvz8pÛvîã Ž[b;²@rW‘ÀNQ2ÉYæy5EÎàÐñÿåì ® <Ü™@§rsÿÛ$vïÑ=* î½ÔÍŒãq,s°{VïΆ»@¨eèÙRŒØ™·-Åmƒ’s‘4çpÕœchUa.ï4YÔ¼nüz@Яy 3Õ½¸í2úS3R‰^βï¾³üÈŠ!ÎWÅÏ:ÐK?#¾©;Í÷%v@ÆÕß&­p&£§zúŸûëbÞ^€å©ÊŠŽX_ÍžÀÛ™u+€uJ±-/3ÏéV&?ò×lŸP\1}X¸ÖiŽ÷Ƨ­ÆŒ:fÃ6¥òã "·Ôŵ­†T‰ÏŸ‹U„ý³4*㳇žë‚>–p«Ž ï¬êP ¨æmÆPÚŽUýŒ«³ós£vS©BõG™î:вlœ8]ê× ÿb_c/UÄâ…‹pÿOßbÿÎÁª½øÉÀsŽyÆ3žñŒg<ãÿ¶ñå{9‰¥.Y‰J]¯É€Çˆ©â?:ŒoÙ¦ßs¾ÈbÞëw&ˆmÙÐàè9d6×¢@®ËsQ9¤S²’HgîL«%Ï1;â3N¦¿:¸Ö ‡æv±¸­Ê|›Þ˜Ñ»U…ׂ)™™ËÏÀ¼¾%hŽK¼å¼(ب†½f“Õ¨`7ixyîûFà±Ýº3^ çà‡¡41Ê* CÏ6¤ î™]¶ °Œ¶¨ãÔÞíÚ|õœ×$8mH³ÖeŠU$d~^z;p+!oöïç~>;bžÃ¤{fC *ÔÍüï£(Ô´ÎK¹ÈÛG[ØË÷Ò"ñ_‹Ð§;0éLh“$KÕé !駤?Žè·?Œ>¸n-a™RÞ@dí K†M&Y™¦º©®}}rØýº4q¥~[Y*Øo,˜ûfÎP‡Kì9ØT-£ÑÄâz³‰éž‚-pÆîu·€VmƒŸË6'OøÙ(ôö‰Ry-ÖB]¤ì¦×Hì%é­-˜§X³×‰f=c:áŒGt.˜ù …¢.•º  ½/aNö&ÛŸMkŸœº”j”­Ž:AÔ¢FN0_ ñ:¥ÓO÷ÞæäÄСs¿4ñŸŒ{ÿ ÷ï¦è)<ãÏxÆ3žñ_4¾rZÒ°–°Ñ£M‹Öv—¶-f„ÒÙ³¼K‚þh„¼‹1¨YHVk@‰K=}ƒˆŽbi¡B!2Fgý­”è2çÀ¡Ó–á“›(P&Duè~×›!ºßéšš ø²NÁ%2ôÆ=“Sž2V Âí¼/û’Ä9oV8†]›„6ræ\üh®³VJl J—ÃchøHБìü,¢!éR8ÀÄÄ×cIËSVI΂¨?= vŒ¨çóæ sw&%tqÆÛ”ÕŠžÏ»žá3—³H÷ÜÂß.þ¾Áг0¡€@?TGDêxñ=éž"€xwr ¤‘ªoÅÿƒ¤o7éXo(rÃì<¨¥«Lºæé1çXË[ˆ)£ÏzqTn˜FÎÊW!õºÀY”\Ž1qÍLXöZÈâE5qæ¡¶I²×s h;Q9eÞ£‚a {;»€ã³Å x ž ~¾ð€û[¨1Í„¥7iie¨È‰—ò¸Õ“N‹æYc>ºé$AjÝ1©´¤”ezª¥‚/–Y IDATÑ5 „NUV¹Peˆœ¢˜˜.L¦·ÌR>>ãŒ-)h^Ëd›mU¯ˆºm AS(¤Cåf«Œc¥WmdŽÛpãƒV:käÅw6ïiõZsuð"×´w!,þ3 ¤3uUÀ%·×&îñ“K@ã5º<’”Ÿ¹îœ²08¹ßÏ2ÁÍåÙÔeEqõkiâZCP´Ó[-v;w«„ŠvãÌàªÕöÁSJÎXõ»¤·|Ûè&Ô¨|›æ½‹¾¨NhÔ… 9©ß•(•âeà¸H²|%v¥D]û/ú]µòA‹nÆrùu‹Íæ]M÷uSu~wñ­¿SÈ‘¢qèõ?[e²xÿå÷è?ã>‹êÏxÆ3þóÆ—UþK2c´èàz«@@Ø”­ß)J“ü¦ %ðèž"z¼A`»°H—ö¬Xø:‡¨"ÐÂjV|›qaúîtb£èŽé“=‡ô%œ‹^ äхl¨ºßXÕifop?P­áÐCŽXÔÅz!fyåü¨•udÖ.­ÖL B_SÁäÛ6‘!æÇ­Ëܼ„4"щY@¼Ú<°Øï𩲴…­Jf˜_óZ1Wrë$GÔ^ö)Ü!DüC%†bÙß´z ¼©¯¢*¤€‡D™¤Cu´¬*Úß®¿ÕCø&R˜còª…/Y©cMÚåUé­á‘Ì \1 ñ“´—UÿÕqúza)H ›vma²û!,,ˆvË@9[ˆÃ.×YB¯ØnºSgêÝ0ÚiUƒóÏøÁx6Î3žñŒgüޝ.T†ÇbB äÄß­`ˆÐA[L‚Eè“%bXÖ ‘Ã^ƒòMB~iüÚ¶¹#™:õ|OWÈû(¡)¾ ‰ Im)eNJ½Kè´MHWx‡‘éQ|¿o7fŸe l:o 6ì_´@ðÈ eùû ° !¤"Pòz­8 ¼:|yú]vêëðr´íbì¡ †“UìE& ŠÊªB¢ÛUBÇ%{0W Ã bó{ð!ðØ7‚ϵx`Ãi ¯ W„ƒó÷ååš`“©ö~CqYßÿžþÑÀ•ü"AY<Ö¨Âü õN뇌Ëi•âÐÝÜp› x{dÞe< "¿Àà¬§éøøAïØuðX±”|o ê+F®- Ìíd.D½¿ó¥‘$M6Ñqýh W¿M¨ º5îßIœ×ª1£ÿOÞ“Öp²Å Á:³ÄÌte *ˆõKòÙÃ)>ã¼´—,t_B'"&ùPS¼œûÀÚa¦|¿”:œë5Sý!v×$R;檦“œZ_9ÛL¬.~Ý~òŸB€ vr¯I¥*~†wD:óÄk¥¬ì#$$Âc6€øAµï§ÜùÉmmÈ‹“ŸÌ–‡Î©').2ãÎø@RÀ­îÍͪ,^¶{(ëÕ>øýff(=¥-FÈŸ¼Ñ×dR¶ìκ¦e¡· *aÜØww` ½6ßÜ1 xÆ3žñŒg<ãÏø/_wŽ„›ÒeÍLz òšc%ÂQŒÞf}±‚ÓÅã®Â\Êpæ{ñwÊCbH[…ïæ­GéÀ;hŸ²8?žs}N«%blÒ㶆Q[BmsÃõ’›e 6‘zÎ9¨Û›äÈÝD‹¼¾G|îOžf¤¾åâp1òF³¸L¦rÇÿL%zbh•4¬-·P«×´iŠåÝ6ዌ´hº ðmÔ©;Éìpˆ? &ígMz1ö—%.9R|±3âæ¿æêÀp͵XÐï,0ŸCIpº2†[ŸítÀqîÎñ¥ F@ýs@»*TT}¹ Cðv¾<5 U%öƃܤ*‰ÕCù]½iò–L·?7¨5ǽhÏ]ÛCrÑ׌¦ÒŒ—Ã;4ñøzÐ#¹¦ÞA®œ ý}ñ!D%µ‰¸ƒ§p‰IÏþèg6;@'p)ÄëSlEÎ!)°'4'œ Õ2žÙ‡h8Vi5Ñâ¡kx°©úù–llTذÎíUCXi2»×ƒòçÐÖ5« ¶b@RYç­DÞG2Šž :q3ê= †‡ÅIM{gòˆÑÌL|ãôKš]¿Î6&vâ¹ÆU׳æñYƒ¡ÏUÏ’¨Q•žÛ7x0½–‚ü&D”Ûj”6€>|¿1©e5'kï¦îGèV<È“jçHܬnrk™UËœõRÂV›¥Š&G8½óB–ßÏÿæÏxÆ3žñŒg<ã?~|½éµp9v4‡RüÿHÆ»,˜l%1²„hS7 WH C͈q/¨3–<^‚ख़>Ýb€Z<N/ÞZº%Ø{‡ÔùÀÁš[" ÿðâÔäTÝ͹ƒ¦ +Ó‡Ój­c/~£ölc$õÏq”ŒIf bj@(áÜ?Ôý(ËDù‚ùjG#¦o(7WjÂUq1çÜÀ#ïˆûóG¶˜¥½‚£ê4¢—%õ3øf‹®¤ê H‹ÜLH SSh/Îçôâ¹¾*ñÉÙœé“s’û'|qýñ'o…Û?ºõŠ“ñ£9l-Ü}÷€…æ…Ãä.'ÀÚ¬ûï°„r–XÜÕØY r¾å›ÒÀÑ1STŒŸ?9Èò[Ô•²Þ•uw#«j䯽¸Ì@YùÐìu¶x¬üÿ^¡Sy¦}•åïÌÜ‚~±Þ…[¡øïû®Ô"éªèI*˜žîì/®vg¬}½§±z,‹‘@|9ò÷Ž,®?\Õ h®!7ûÒ‘ÞþM¥G¼×¶—:¡ÿP,ŒC8õ…8&Êï”–™ÐÓ•^Rm+³ù³·ÒÄÞy>uåSùEÙ6êÒ%\±Ã¼Ñ«¤ÛŽ5Å®Æ?ãÏxÆ3žñŒgü3ãëiyWÏ Çqè#/ÕAmPbÊDŸ'+4¼¶…"æoha±ë§}[Ƶȿ7QMÒCšH¢ëÚØ´¡.’59T2ª¾6]xš¤0Ûc¸7VNI—ô=TA`è¥*À¡4’dÑm‡š%TLm^*Ÿ©„Ÿ±n Ò]‰ÅSaέá¾)ö€>$Ã.ýO»‚P`¶)F#~í)Þššì6Ü#q‹ØàÝ\˜6§Œ;¨÷Ô[¯ÉaAࡌjCw’ia´‰ºCÿ‰¨yuß岋Å*f“+àHeÐ=üV…J¢º#$¶pªLÜúN´Î@8dBaªÐ[Ì+ÕcP 0õDe!ÉÆ[f¬Ê`…Œ€e Cñæ·eÄ?@%Д+æxÄô¿JñvXôä r‚è˜ñPÏGÓ{t-,£ŸÂwåç»>e¹†Öb”Òši•Øjrúa=L~éPêöËr¸ž·Â™1$*µ?½ÕëAû]¥áö>–~à& ùÿ£ÈõHŒ•û K€³]ç‘Íž© ûŒ`ryl뱓Ńþ^ÅMÖÊtQ+”%C嵈è?Ö’ cXÞøéQÏœþ­¡N+Âþü¿Î–s\ùÞ×J÷NÕ©æê—¤uJTÏŸÖÝ÷ë"O àÏxÆ3žñŒgüç/IßÀeÚ9Úù1à7NÌ*©‚àúŸ• Qv ¸ù–“¢®Ý+êøä‡Ê¨­"ªÃB@yUQF³ ¿K˜Ë¤6 b\mëZ>Œ‡J;3JÞCt-(í{ÿ_K„ÝÉ›"&™=Lð–´Šyñ‹0Úéoã†ÒB3‡R‘û–²Ë3õR±Šåû -=ú/åZØs-‘ù‰Y/ Ùs%xP—4˜Ìþš;l4úcï8¨w8q"Pü€“BS²NBÌê}ÛŠ7êHn4P–Â5lJkËy˜ð»Ì÷ç ³–îäàú@šÛèG©‹‰EYGT÷òö¤>{óN‰½­òL÷XUQ D¸#w.AÌ)˜A@|¶œ˜ IFW튦ñ“‚ú’ lÅjØ$Œ)Ë©®*¸~,ôFIMËt ù޶þù)s.½²ÇÈn&¯¼ƒlÏ ƒÍÉÃ&Ô,î캌PËîŽíâV›÷vR¥ úyñÈÿŸÕ®*œöläÜ¡L_7òp“GVg‘š)˶~G¨öVë*4åœD¢Æó -Ä„qÓsâ#ɱ÷Æ3žñŒg<ãÿMã+„]tâã>NCbåEkå@eÛ5:V[1)T†F&šTn ¨~@Ç0Kàb·¾Ä.¡* Vþ´cñGèíçéÑ8»QJv™gRºO?-QžÊ¬ñÐgüPtÔSȽ ©œFÚ÷ έ±•9˜•ÌA?ã‚„ExÝ„ˆs- È©‹´¶ T7K–%V,éɼþÙ5 z/F ÅûBðyË6s]Çcî“ô,°A)Ö’‡°vù¾Êeúür}0óKFÓÃvtÍîŽÔÏ‚02nç¡!†23*j¬ O•‡BÔGBPNÃôΛלDÖüuÞìðœñ(w¦ùÜ=F 'ÑFÓ¨‰Êó/ñWð@y”¬ÈŽk„ï#WÃýŒœ¦ Ö¤>*53Ô2ØÁO0ß]d´S4žë͉ðéß#­³KBBhŽ·•«­©w £ø˜€Š~AÏ´U±ŠuÈÚ”¾užçŽËK°š´“átu—: ;HÝãß~±qŸ'./Mý9_»ëlkjŠ©wÊ\8õŒjé˜ÔÚ…?M \¥Í£,“6´x6•Zä‡8[xé Ùnš‘[“²Y»ê oEñκšu’QÞ¶ŸœÃú(C}µ‹o`¤ü‡^Õr_©];Ûªk®È8¢àç Þæâ®÷Þ-­Û°ïÔ]z.Af èÔu ut}Œþ—sïÁ÷ŸñŒg<ãÏxÆÿÔøð=ŠÄ¤–Éwˆ^”“äa/cGIŒƒs—»@”’Ë~íNnÒ¹Œ ÖaÒuQlzE‚ ¤ŠØ§Xðb>@“È%`«ÙvúBÞâ5#_Œ¢ÞæÄv¤¸¥rÒë-ͲïîOû¦4ãNÆ­‰«8&Šº<ì] Ñ/ÏDú1PN´™ž•@®žyK%šo…Šý32:Ç´óB]ñ6O>ú N§d©–û¹ ¸t !æ^ª‹¾F ŠQ8©/G³ &Ä gGDx-¢p9”Å/W+(³qÉE…/XÆVvœ ƒ9OÈ-G¾lóê–àý¸-´zÜ Æ;…L`Á”ÉÓíIHFÞ۩Г‚xÞ3µ@IU l„ÌsD”ob8ü´IçïOi‡Ë ©“GéûºW馅œ¢–J ›êÝZo"ò‹xº†¹ÄD4–suÑãÒ»ŠNŽÕ/îèæ£ýçÑ:Ó7:ÈŸ¦é·U-s Ž6Úg´ Ï+U•j½vèj,ö{!;vH‹ûKœúwáðG‡YžíË-™Êl°©wng }(Í$÷ÙÂÞ‰iÜÌ&E©ºœ kéDaˆ{ÙéNÃßàßë²Üãzè罦õº¶C ¤@ ˆüq9-­ÑÀõoÏó­ÿs¨ÿŠXУÿQã…Q4àTD?44(ùŸ ½qËùX£½že]òœ€›¸_$¼Û?)ÿ`wÀyù³?{¥¥ú&§úŸg¾W_5¼ ] w8Q£ÛÚ¢'à½lnÂ8ããHó5'Á‹Ú'<ÝÓÉË#z."»œý¸R¤e9"ATͲ/] KDÖ3IQ·m…óØc¸IrÇk+#(Â1+c†»ŒDÅwm ÇŒ5ÆŒŠ?™#_ó—¦Ïù8–'{¼x‚šQ-å}·4 50váŽSxn+4Ö\ÿ&ìØ()m=–ú»ªÙk}wÒ`¡Ìªa…y¥Ò×R ÿ.$+ôŸxq>»lNƒ$¡fùòf•‘‰X|/t$Â0#*§æ¶´aSW^× †ÈŠÐý޵²BÒÒпÝÈàÐE`kÙ÷ !uˆÏ±Põ€Öú`;ÂeV´ò›ª[]•ÅH©÷[«õ;Kð™Ç ³Ö¿MOm!ÓI-õÅTöÁ|C·O„»™ÅÖo(gηáNk>]²ËØâÏxÆ3þÚÁçìyÆ3žñ¯_œdæYøOfû¬›‰y*ÐÜ’Bé¢À[;)H´¼¹ ¡c ©eŸ2*1áWzØ…æFôimM¤'¶E„÷daO[Nnáo‹|³lu0Z+0à:ŸdŒ&i¶À2·ÎÌõ(…øásÔQ$4sƒwçhw@”§sHÝôô˜u‘‡özEC#È}?§)«Lè|¼~©+Þº>´©Ã¥ž‘þÿžç#¤š¨Xf8 f'ìtX|dáøžqweËߺ §°Èñ–Æ×Õt4|Äò@ô¥ÿ“¡¥à Ð4ÎoI,Ëní£I#U4уÐðF«¡=ñ*$‡êèOW “†aÔRHPcn&¶ç„: ^SwºÓãfÂB¦ ¯\©ŸCM‰¯¾ ‰b5§èˆÆ'–ûß/¬ ‡°Ÿ"(sÁ ÅnæQ…°fo®ëå¾f ûV3eu€Z=Å %œ?8ÄB&·¿'cø$Û‘ÂwÖå컲`= ©– ›s˜†‚a¾N!–íÌÚnÅÙ<3E;5äK>"¾´EáiBNªóš?s`Þ}féçò©å 6 ½ Kk›øÓ:üt\—°Sî)Hã–ªCmðÅ6À1ÑïBs޹Ëãô·ÀFú_>;ÄhVÙ dÅNÌŠR£îËè—–ž£lâIj‡Óy°Ú;y—uáe,ó`ÏE|_Ç롯5ÒÚWI»wüžžFÑæ8ùò!pr÷Œg<ã7Çs†<ãÏø÷Œ¯.¬RÎ:Âó]´Y¦äÂy!’´Â.J˜˜2\†"6IÅR¶¤Îš}uárÈc9õ|ÃhQgcÒþøý:[HÂß^O¿¡ªeÝŒWåtÌkdôä†!²[©H:0ÜÍ{ZȲ:iøû_ñΣ®û ž–K)ð¤oÄß-þ™dÔ6éd¬$ÌnÁÏaL¤f;AêQ¤0`ÁGŽ•­v=Ù­Þ3½^.Á}8b#N·“Ð;Ô ]›'Á-!ú_ýôå§èô nåE‡˜œckúG'–õzÊÇU L½ŽÖJªtësÉæ„Ê” èĸ“åõƒTYäjù]ßöþª£‡iÒ•¸ÂãAÚJ$K(A;Ž«#³á®èÛ×ð7FÙûI`èrƒÒû›¿W]n^g¨Ý(Úa}á?v’Ýk+²;¥#‹0è|VшYÏý~ÑcBÔö§Y°Î¦\å.(Aü‘±z8ñgÖ–ß¹^Ë›M‰º¥Ò€jÉC>´åIÒ‰BxﬧEáŒðêäq΃ Õ6?yu¹®#ÄͲó°–Áòæ‡Ñ½ Wº’ÒêÁçxló*J‹ Øì&÷®4*âÿºRý´}±ÁE¿Âu¬ÞáU®ÅmLxY­·íüAжܻ?¢ÿßý¦Qù“;ÛEÿ'wÝ=µÍcí‘þÆ3žñŒg<ãÿ«ã+h²—Œ$q»è@I°Õ‡{ži;ӾߌޒJ”!Ê.»7mÖ7ì;!Äê7éÖTSü¤ÕZ¹’|AQA½9õ£T º˜½ % ÷zF§gÿ‡ºÄà°jC›ø¹¬|j;†#¬k_ öÝ@WHÀi!óBq¯µÈ˜¶‘¥  s„§Èi_ˆÍRk~Ô#P{ÀeRáz¬üÈhƒW‚Æå `oI%û~àp€©çôµîq,„n(Y|ŸP/‡”õ¥oRIh ,¸Ží&Œ>ƒ$N…+¯†ëä`ï[>C êMgk#ÒlïÝá½"ªË_ý"”%á©Ä÷3¢â¨Z±°Ëã=“èaŽn×h:1qZ¦ŠzùrÝÕg 6 ¾<ùdô»â4êXàG߯öݱDÉ0ç›6æmïGj\Lî}¯4•ßÈÈp$©6)¦èç`šLKïÛ}á8 ¹.¥ÛÐø_çÖeÃÊî¶Ï„Å$`ãf©šD;<Mà ˆŒ¶à$c,LþfYrKŽ/l„PvM¿QÞh›·äøû² –Û¹õ4úU<×”ÇúŸo«¥ÔOqV`1£æÏê JÃPóIa/†.Fu®@Xû"õžFè?Q—¨–Gxÿî ÷ÛÞùÆé´ÍÕu>ùEÔýX‘Ûg²MUŒ¨_¬k{l¼8~ï <ãÏxÆ3žñŒgüûÇ—´ðí"EÑÿwîr-ŸÌ î†úsÐå¤PͽìIˆmäç©v¬€ û\.‘Ñ¢U@Mk “¦¨T2Ê’ƒpý¤r{‹2ë:î÷F’åˆ ùÖªÜvN´¿1DÁÓÌÊLº:Ùp N®ý-ŸÔxKi$èù¾:Êzó2G>-¬Fm/³Š¨ðKÆO6°2Õ(µ*í¬ o“¤fî«9¯¯:ß7u¾$ƒNÃ÷{1°óâÅksOàŠzëaÿz+Wÿ ’6 ÌŽ,áugþ¾xæç“~)ÞM®Á$ùÍ3ž×š¥¶;–Ùc)ª¥b)€KÈ ³bMQÊ¥òl –È~ 3ÏMTBh”%©Pð3êáÎjºš!Ñð7§YtÖîØ@ýò£Á@ø»Z…};Z®Ôì ÔPiT¬/ŠÍû‹úpaAy^À"ñô4XThíÅà#‡M޹Ð?c=ô+„KD•M­ÈŠª;ý¬î¼ìXºu~¼‘R«Ãô–óAQKƒñ],5Ó« Ê;}² D-qEÔª†ÃsÌ•>(?È[Š%ËÙzZ(ž‚PÒßß\“ëA»žõC” ¦K9bÁ81’J•1~¬y—åû;CæBe|£ž0ÔZUbÛbvûó™Ç²N#s3"²Õ{"þ_9y×jn??¾–ÚwOÀ3žñŒg<ãÏøß_‰® ^ÀÑ_.°^s}:ô?#\¥–@kqº¤?ÎiB%¬ðÑpóÝ©IŸÓ›SaÚï§Þ_¢Ÿ'ÁzM3tj0¾‹.C¸9n>¿Câ¦ãj9/Ü0âÑÙø½ÌqDè¿Sk½¯Nî?cFÞõÔgì^9Aª(K™_ß„4/x¬¥u®”ŽÿŸ½·[nœW–+iíØçœëyÿ7œË‰˜Ù«›9"úHJ²[¶+cŷܶD‚HYU™z³'¥P .ÏÞ”­Cy9 ßwý½\ýï~ÐeŸç›ô ~¿¡þ•‰o!ç遼ãYV!e ÒÃíg“h³×{|¢ ïjsW˜Aò?­ŠûÚ¨®®y7ʩǭvDÖENÏÄ»,ˆ2Ñ ‘nàáÙÿ Þæ§.žhÐ˙Ћ2cÑBO™],è OmG"<@‚|=Îäræì9+OþM”„99æÚä€~Œ GopŒ‹äNvÏÍ¿yÒ(Oñ„xdJö‰œŸÐ¸4C&Â\g2ý‘­ NžåDêDLÍ`/Ì—T€Ô¯O ÅU|Sí{Ôl¦,'ò‰áéΰ f,ûCþæEœž£¸c*às8c­pMºÂtõ³90¡þÞSÖ€j+ÅxNQf‹p3|_¬ƒÃŽòÂÝ=ÌáxÊaü ÂÑ^c^¥1¥¿ÏÊ+IRFpüH;Ãçïsœz¿ß¿ñöOWÒ—+…B¡P( ? 7-¸á5Õæ JCAÆÅ\FTr:þpkÁtkùtÊ@É¡ót3±F­ª™åÕÊ`¢~â.ëo¼p£B±m¹!Ó®ƒUSi„ L´ÀŸ½€€«p5¦g¾»N«ÄûÜN—ûˆŒUæÅ7¬,Þÿ¹Ðl:ô„qÁÝ¿ì󶘈&«äê¥V#•†l‡ï‚7¢Ê#ÄIqLÖ¬Ö+ûŒb· „µ‘¼mhô¸{R1ºp„{« ÀvƒlNJ¹E k›‡ASêc¢YrƘîjÌuî…›‹§xöî9,=çs-q„§2‘.ñ=IÉX~g"p1ªø Ýi#ÚEØo£ºrj© PÌ‘¼æ…}°ŸO² ç푾öµñªÝÿ‘Í=yÔNäDIž×ˆ1«2òõYö IDAT×ùyȺvÂàœçgôŠ#hôräÅÎ?Õ ñ î©ÄM\zŽ*}£0`â.ŠÆ*HCy<¸ÿˆÁ={2W÷ÈC‚¨¦•q9wZ»&ILF¾Ôô믩E|L¬I¤ó–ÓvÉ!‡kÒ“³‚³騤՟B/íì+Câe†/z¯‰ î9yµó± fí+\˜'ïaÌîwf«VAR%|ð™ßÔ8ê®Þœ½Ê8z;ÃË*ròÖ _óH5Ú¢íá,< (( …B¡ðqsª†U\E©vhç7Eìn¹«Èr9 xÝGÔÒˆ}`F"¤ÒÒPtj0øÊN÷ó:æWÈ–¹ô«jŽ÷uqO5÷»cjæ Og§AÿòÝ1x ©Íðr´Yrü®ÔÖýMÃ$ó/m.ºñ‰<´«ù­×-åüÎnSÕ7 Í0Ø+ÂOˆÝº7&·•\³QYš,7䥢Nª^ Œ—{ETÉeY…uQ¹Ì ë¶Q×6ž„Õ¯D¼Ù󳇑֑­Õ¢Bzíº„Fájû–6“ÊB£äAdŠ^áæ^æ‚ü‘"£j'Î¶ÓŒÎÆ±Á.9t¢!®?2 Í]…è qnÐyœž!m1Tå>Þ?³cÿªè©;Í ÌÞç®~f!€sýÆÇû rÀCqôË“êqš¡5qzªœaÜp¥÷ÄÉÅRŸ¸4ÌÌ_^®¨ˆG—9ɺmÑú‰¯fT‰*¶Ç‡Òàc#]­ y5y7õ0Oãs/SÚõs¢ó“YÑŠœk,%¡ ºÇÏNŽ?/;ˆ·CîaWq ªï”W$òñѼھ;™ÎºÃ' ƒÁèá¼ç”Ä v c¶<÷æÐ0ÒF‡OÏZi}dd+B&lÛêÜóâEÍ=ŠuÆÃ…%OsÇ[ ]Áy¡,ûå·SA>2ZVu¡§Ï«k÷î°rXb³›…X+7áwZ™ö&5Ä:¼-âÃDUxˆ.ĉ·|`ñœ¦6¬Cv$]Ëa.ÏíÈbùš‘Ì[à€¾ô—ßN­Ô½\lÆïÊÏlȃŸí%i÷Ïàø®„gOE\žl?<ܱQí”^K^¾xè"på¼8§?sUHúäqêà ó\Â0bh-Žò99óS2íäD?jäô‹«³GND}&aúñ¹[ž‘Ü~z`®ÌFê?}‹§ž±’l¦;‰/"<‘&E2pgÁ´7ÂìJ£Pät ­éˆ‰`ZÅËaœ“ª L¨‘iÄ@9Ð$‹Œ¦1®<ÙŽGn«‚Á~Š×Å÷É|ß|¼&A…^ãèÜnœïšÝ¿D%/>¨ …B¡P(~n.)µqLÜ)ÔûZmÝÓÿ¡ò9Ù›iÝmfÜ.x»¯Z*|Ì!¨ÃŸÚ‰ÉP¹Õ‰ëÄ…i/?Ìx[Ÿ1Ý`¯™«˜ôžtD³+È+ÇïÛF•®.ÊÈÁMm¡LÁªd…rg80%ÆpXÝê¿©ÿ÷xLÎ#á/¼³º® ÊpÂJÀ'RE tL܈q¶0NÍñæ*ÛÂêêÈÒ™\®Yx,ÝæäZ‰w+Ý5–{U‡lÕÌ. Ê]v¨Å¼7o‰z»š7W.¢¢ŒècZéqšõ0[ÊÜZÖQü8ÁÐ…ß'+u¥åÔôÅFúC;Úº–°—Ыm  !hg/ë¡øg0Ðd‚˜Y^§LG$²Á÷Òëõ_U ~9æ$Å•Ö=¥@²Ã<+tƒã9¹/x†3ÂÈò&‡ƒâ\ïýùãÅNmGÌ%'Ê|>˜>72 ô I[b#Ç£àÎáxnóèægxÔD1É‘ÄÒ™©ÆãI;”¬”$ìÁ+7pW_T1~Jž‰Œ¨u‰Ë'7Ä#ÛÔkß3 ]z¢ß8Ÿ?ňÿåôÁ+¯›Ì§1Ñ~ÚóÚÊbr!ˆŸ=19îä`L5ZÞœ²Ž‡d‰›± È>Ïp»#9ŸóNðÙóç庅Bá–Ö׋…B¡Px7ÒsLÐ~\÷…Ýßn% éá•”kö¨Ìörb¥ s¤¥W»tÓ/€eLð…-ch’¤áBÙ+ Iìù`®'<Eàïx àvu{¢VI,,Ñ'´¾Š©Ï@”ì¤o uî?oê}H›MÚ®ê“"ÛnÃgÀT@.ˆ‰w‹à”“²” óÙ¡r-÷êc,&VaÄŽÎ’ÙÀrÐm½À0·ØÞ]è.íµ*! Çk´äýaï v¿b,û¼]}uŽ¿eœÛ^´;nÒÿ#Æag¥¼8"ØÂ”ÑRVI61H 2JÑ‚BËX³ù d×§èµvoÞ(-Bƒå±sÙ¦ÖÄœpQ2îúûlúø·Ý<äÙÉSa ³·’w4wᨉÐôT’ž—8œöfE_ø¢Íóy¯Ï¹æ1ÙíË"ÕãÚ=*ýZkä(raÈHíý9C±…‡ãóž6rààጓõçCAg®GÓä¼½°[/ç®+T•%-çFå`(mIo'ÈAê±|©lêd éîf‡r{ÂÙ¦•!äë Ùòi÷HÚ>]1äKÍgƒ_ñ"¿Šùè$ûŒK2tó‘½Þž" …w_1~X3¡PxSÜÍЬ»,㞯´êÍê²k¤ Ù(1,LѨäùž™/;!ղףܹ×%Ïž>Ã"ÜÃöÑSéŒø;l&QJ50ZàÒ¨“Sk,¡I£:úA¨ÎÐA,3Çt?ÏüzZkzÀïc­Ã¾»VöÓƒpŽÎ-BP‰ÙÿdŒd™ñNΔ/dZåùS8½—RqÙ‡¬‘þ­’šËø%:"¿p”õ›ŠQ9ôFGˆQ…‡ªÉ0 ˆÅVňìÓ v¬'!Ú„)cZùǒ鑽š(Dwyœ4ˆ8ØÌcÀºˆWk§ó¦N=( £ecá~oŒ ‡§lTÎŒkzĆa¨>ÀSú/ZíQÞ {Ÿ>k.x2jâ?ï é˜{·æÏ@œíoØûȼŽ/MN9zó<*|tmž›oÀ¬å2p›œqž\ óýfFöÍgŽN×…iü©`Õ¥šœàà8˜6È{øÁ{ça›häSñxíÇäÅ Ú.¤À;a;>Ø!¸4áqa¼c|=±ÓÒpü`ô÷Á8±¸8oƒ~8™‡ÙƒÜ^ò9çð=„AâÎÉÏqnqô^`ÖW˜LuÌô¦y!¦/.©P(þ xüòsVø…BÁâ&J¾Ý{Íëuòq@ v1î4e [^ªh©ú¶ g²ÖUPG4Ä7e¸¡"­ô'²½(ý&-:;RžÁ¤t²tgºŒ>­W‹ŒÙLò_khy_EK’&©¾ Í<´žø¿«OŽ·MvüÐéNdŸ™ýwå¡0%Îs«ÙtÓ9d(Jâ;bc©Äåû½Ö™%™ó)=픚uãÓ gÖxÐ\¥T4Œ2®K°U;¸t{a†ß_į×0áS‡™E)¦1Ú˜<Á2¡ùØT{FY„>fE\ï1žúe¾äã‰øAªxs¾”áÌ5Äî’¬ö‹u0Îâþœ0–'µùŠgÐIK!%»7KþÈ&!]#Æ `žX9=.òu²›8x´sˆÅŽÊIñÜí3Ï÷‡ æIT’ƒQ›}ì„ìÞÔáôÉ‹£€ñP|‘›Ð¯Dõm¡Pøl ž<…ÂWàvç›jîBä«ÏߑŖ&«åÑ·jÛÀ«d3‘úmÞP€Âj¤t]ÿ´Õf! öT´LkûÂFVYEb–=: ;1^s{oØn„.‘V'ò­Žõc¿#>uÕxUaàLø5®íu"ÂSBؘ(u Î:ÊÞ¥ø·æù¼ñbxúÂCJ*|TŠdßIÁM`ô¨ ZíLtäDâ-Oz)¿/2ö?®9~¯ü ßN3ýñPŸ¼jÛÌA+ŽÒqå.‹læ¯Ï±ÿ§B{6èE9ÇÂõþ<×…poÿP‡W¢ƒ˜<…xb:Ógy™Œ‡3ý6OîÁ•AU™OøìGÐ邏X„Z¡P( ‘›ÄÔò.\¬±mjrëW«ÊÔJ#;§í˜%íÂ8ÁRYÿæz§’;¾kŽ“A.Õ ’€fcÀAÒ±&)0ÙÇ•KÞ[…´xߺ­Jf¢`NŽ`<Ëd³@ØÔc´¤sk¿¬öXZ‹3·GpŠ)çwAðc*ƒL:„^jL¨ÉýwÁ$<Žr™¥3Ôq|©&v—Íg8 çÚ>³Ú³/¶îbU×½±0Õí¹<v¶gû+rÈ+åeÁ¦˜;83·¦Z‡ó9' úÏ™ êÉ—ö}çICd¼†B°ƒ³;1ªP7*od³K?™š‡û¯ÅFx|É|À:ò‰?&r¯F­>‡b»Æz53¡løŠ ä#½ŒpÿP“VÁŠcæ*Ô¿ìÒ^ çµùô¼J_©ž‰{`Žq–X1ªq˜V!‰ÿK´ÚaÞ®{ý©EBn}µ†ãÒç3_„g&9F…W'_1ÇΈü|2õÏFP.Ž`üãàJyõiöÀãW\Ó&ÆÐ¸“§Œ5Ùæ÷5¼ïù~ãD‹’ÃwÙc=Ã+Gp»¹¡…ù9¦žòÄþU(Ò¿P( …‚ˆ4`0jÚZ7ôù¶bõFÜb#ÑvßåJeŒ`bIµq*"ì<žXMMú«X‚N¸f¾ƒT?rô÷dïªÜjÕIßÇ ³¦g|û¢¯WØæAÕ_#ähó AÇ\È8öRÝOeº5ïß‘isJ À²ú¶DšeߨR*}ª^„Á`T˜žƒ±`ÿ´©¸UEØ…(ô‰‚ ¢ˆ‰¿íÖõÉv~ÝÆG:uÁô­Þ¬É}tMn_¿îƒ6Túæ$æ-ãrºÐBŽd(”ûEz-81"¸0«NsjáY:¸ãðUz4¯{]ºçebâ‡`^(™j[ñéû gÿŠÇxû3ëÈ'ðÃO’GÔÞåÂÑYᙢ(õazpž¸œÃ)îGÕ>í8ª‡˜È»EOxÌ_Õo–§.ÕÜ qTÍÆcÁ‰Ñsf'óô”kôøýR( …B¡PHq‹¹9]Cí·m¦3§;3Â*~dËPÂR„MáckÁl`r05e6¨Ÿ…cÍv 5OÄC’ ×úÍÇØPç™H›+DzY¤‹¿À"ìä{r=p?0ÿÏd[1Êhæ’»¡¶ 8ZšìÈÔ1.!1KÂêq‘`ÆK&îœUbd#¶Zî´•†8YøùßÉúL×ÉäV[1(f»¬Ñ®^Ÿ+i‘Xñ#éí ßN-âAm æ{±yýóÅògi/ð@Ñ3Î €´¨yå8 dZTL$±0ñlUtdÕOÔÈ’(k–³ÌšsnÿWxþܼòþÂ+:ef;J”æ€h'“â mîžçV.ªð'‰±Ì&Ç ¸®ï3h2§×Œ²µJL‰8°n¦ Ø;½z/[¢ Ö ÚÉs]5>È™¢"âEwúEó¯[}¹ ŽèãàÙµçÕô“CŠ'Ÿº“²’"¼ÒF•Àüh€Y™ §(§uXPˆqÈ@+>ššpœ0Àswb¶ôJ™r±}qá7ºÂññ1ØÓÉcm+ö¿P( …BaŠ[ÓNc¡Äå½ù®Ý›Ù¯ 2åÍ–¯óâcjsS3·‹É. dWzP‚ò´:?­%Ýà óEåsqº}…åvÓªÛ34$»Ž©<˜è[ ÊLÂ{ÓAF¤h&í—; ÷ vi¡Án´“’0¤c±ˆAŸ'ŠÉaÿ Û¥°e"&`0Ûteõ®äÅøsÌ(YYªh¡ùw}™a òRÂo §™ÈŒ{ìz5¡@M*Ñ´–ìÖæÙÍ'üN!O¤:R›µy†ÄrŒ·gÔÚ° N8G Ð~8g‚ÖÊø´^øÊ•F¡P( …ÂïÀí®™ãWÂP Ñ.Y¥´0-ú5m’¯]—7É ®ù*™§8ÞYÓ¬Zô*ÅX¼ÀŽÛ³`¼ºÿoM×µ# 5¬×g~Z­ýÁÐO ÜËX™„ƒìà$í[Iâi{)•lkäÊ; öèÁ›Í‡íó‹5™Œ_2A»‡®,TZüŽFا+/%ÖÉl÷ŽTƒ3Î…ôU@Ö•qË—ª Ô]l9K¾Õ„gÜŒs¯Ša¤¼‘¦-7\ kŽ¥i£ßÝ„aÏŠÐùíù œ›íÁµQ—ùCÎÙxKókTNNç WsB å 6äx¬ÇWûNàs…1„‹ìؤò&wËÿ^ëM幫µŠS*Jž¹jpœkoã²tfü{âÊl?ŠÚ@™-&ãkŽƒÀ¨N3ˆO»tg‡íAÓ¢ nŸ£#_0ŸÀÙ[Ò¯e°j:¼xpk_î1yúÌ×6J9s¥kÔØQÁ\x¿¹(μ"q¢®D”q—Y9§G•…£ò¹9=²i%Ù¨·ØÿB¡P( …ÏÀÍ/¹T½f½!S"5uªÄ|m\·ÙzË D0¡M6xÚ¸­¡aù[¡À©$3úM²‘ªÇÁ¶¼ø8¿&uiàï"‘ËuHqí4Z`¸ÕâYÅžç_µÈõ<ö,åsτрôq¼}ΉùGÿ¶“ÿŒÚ†0ˆY”žìê„t#çêˆ8^·_xŸ¾Ä¬bœcu,%T(üs”ÏD¡P(¾9nCIM­is¨h“…­S½Ù [¬^­l9ÝPÒ2ÈwDx»ÄCÉ­»ì…»Ý·ÇT ?Tñ†3›5 Vç˜ÒiÚiÃFÙæx»jÍq„Ž…í®ùè3£™¬©2ô‡Ç†¨ 3®ysd,"‹¬Y2Þ„>õ>ýY÷­èàíÙw%g»Ú½b%„xË "§/’ƒ]UIÂ^w”ûé¦ß0EI†/œóÇÀšêQ0£2¯'v^¡ “½e*Îsn½>a²`ƒ1PQÌä†ýUNwΤÏ7ÔÎGGy¹#å—“ºŠwÚ9^fFÜwOV6ð ¥d>s¶Ç7Ý?Ù¿.ÌÓÇ<ù\¹"‡í8ÜrÈQÿó€ÇDÐù*….Æ<--Â%üÉQæãËs_Ï>eƒ”¿).ô(%ƒ>¿›˜ÌðþVªÏ««ã„¬â f¶´ÓøÉ¥œ×¥ÈÀ߇mæ|å –µzwÃU}iPa´j=µº «\í×½LÁÁö¨ÿ²()FûÅÏÜ3…B¡P(¼nXB7ªþ2Þ<@+ìÇ\Wžõe[öËÖuW¡ÙÒ{[÷`/§÷ÃM<‡cùT®f/a‘Éé%)Ù]8¡Ymü`¢JìÖîzWàñÐÝ«Ú7‘mP´)¨…0kÕHšš9}DÉY¤da©Õlîyú̼m1hž®znŠ?7‘EdÙçíÿÜÎ1¤ÞúÁs/{ºü÷îcL+˜ÀDéH;6‘%œ^;b^î.1L˜Š5ÆŸŒB^[pÂHÀÇ]ðœOÀéÍ툽b¼hg­‘u”Ï çxO~‰Ä9Ï=ÍûãÃÒ¾uyH„]쇔7ùÊömqÀ Mô¾á¯,Çñ‘e(ƒ ¿ð½8ŒAŒ-&4"zLÆ.³v«¨Kc)×3NÅ¥ ´9²2¸C=ŸYЊŸZó¥ *MÚû" ÙBôìCÖô€YŸœ~3{õ\è<:Ÿ1^ÉKäAÚÍg=-Uxqµ0š~<©MÔxÆO¡fiû£EHºJ?¸júµÜ?xS¦‘Rûy«7ÝoÆ¥÷Qu]¡P(¾'nÆŒ¼ƒÒЇñúòÓsÂ6¢oÆ4y}—{_˜}7«°îÊE´"¶«ikM˜LíF­¶$¸vë.adˆ{¨íå˜UñÔ¿ ó¸sÙ^¬ ’˜¶Ä*É»7›„û¿©{,ê ¬Çi ;qrË.I–F½õÿ½ :x£©ÿU@áj] á§ ¬BT,pa£Ã²2í-y0ÔUÖù ÕÉ‘´Îì^{F~2îŽz‡[G„€ÖrHƒ.ƒ–@qf„NÚoWÖñŒZÀ©T®8=]èÃcç¹M,§dÍÕ=Ì¥­Ë?Í^&ƒZ®²u|諸ÒWæ13Êœ+ìóƒå“‚³ÛåS&Ÿ;O¿¼øÒÛS?‘BWž=àÄÙât‚·ü™%·›kèóè)^LT1½¢±œÏ<ô¼VÚ¸ƒ’øú³xÝœ?üd^BŠëå,|´Éœ>ýŽ«t%nr?>ôp¹f4}É}}ôÙ÷<“xzJð±O²X»öíô‰Š"Q ï„šŽ…B¡Pø¸åIaŠ}n«mÄ3:AÌѶ*ìîÜz¬²®ûvK¶üñÖXébZ_&½Bv:û®þßÅå²¼‘lö¶,ýìÜåe–¶¤,ûqtfÙ"BÈ e? ¾ÙMbÇÛZ8Q˜íQabâNìSïÛ/^ЪXT¦)M÷Fð\ N¶ÚDºŠ& Ö&øc¼¦ïãµ dãýuƧù·kÔs@·Cå먉ìþfØÿ°™K.$q²Ç˜,\ùü€Â`» ˜Iî ß”–Åh3jÁ©íeZ€ŸHhÕë¤Íý†D*§IÐo»ý8ÏQNªžùiÍøF[5^ùÌ«tÉñ=‰ÇèžÁÄxÍ ½Ú‘⪳~y¹FñŒ&‡Ïªw0›Kím¹Ýc¯õÃÃÅÛ}ª{ƒ¬fÚ±4<Ä®1F±.[¶Æïb`ÏÀ—‹_]qùÎ?†0dgL_yîÉú(Wв©æ—"“8^öP¹ö-ݰçÏ4 Ê_0»äùG IDATÒ(ìù”g˜’<öÌœ¯¦ …B¡ðŠåC=` …·m=FÏ)?ÛhÏ;^ª",ƒì3È”ðÙï²9ÜÒŠéR“”Â62ÙÿÐïz–ñ_EVMúï[h}XZ ûû{Ýé~®{î3CŸìÂ;X¶ÿuÅöšñd›éŠ‘ìLr}jÍפ–0ÞËÃ.áµb»4„;‹þzâˆ|6Ÿg52ØÛrõ…zæ,$þm #É&d¯$èqÛ>æLØåƒxHèC¦‚þƒN·í%eŒ:o4ÛG*: U§áù™ IKžšÆW\4€‡ZR@ÌÑ`Ì“Lç_‘<ùè;߇ÌO>YØð“¬Ñ'¸H±r' …B¡P(¾9n22½Ä‰ÍªãΘ/»©óúíþ-.âa™w¬";¡ßèÈtéß*‘›Š½IïnÆŠ|¼ô U¾¿N×»w£È¿÷”¼O³¸‡VZV+¬dòÅïÿÜC Íi쑉ƒ“Ìo Ê´S/ÓËôGЉ=|Üïáh÷ŽÃ’v&lEÓtJ¨oHzôL|í%H¥&Üÿ‰AON´°T‰ ²¢™”#hÆ F0 †W’=Üe*àuöy% Š1Ácûhœ®(?Ijȉ>·ÓÓ}2<ùë6Â_sÖçEh§lÚËW\àçtç)'ù=ˆW5û_Ý-/à‚Æk€³< KŸë„cÆÜ’§J!O=î^ª’'öNÄâyåÐ6?mêH=—JãtøÆ„j8V«ÇôU_øxöé^1‡slÓMý„xÍSáÂd{øh¼ð6ÇN5þ+ñõá©ãá§ÆWÆd$gÝÀëó-ðÎ;ßÀÿ§P( …BápK×Ü°ŽšŽq`\qÓä㣰Q¨§ÀÜÏÈDe…í÷4Q ñF=ß‹Ö`…x”ìùÑ ¼.-³ô,(ÆVd³óEÜy´Dò]ê»Ð[´È ›µ¦J –E¸ˆ,[ÝWÁ*òwHúèÒ çãjÌuÙGy¤IºYŒÖØsîx®i=ð`¤µÔ;µ%•íˆ1ó ïTaœ~á‹B²+Òl¸«Ãpbýª¯:lÐzcVKŸr”±¨w¥­aÌX†ÇRû­èÿ1nò§~•å|¿±ÿȦ%¾]é9^æIøu þz"à]‡nỔ¿ï#.—oHô»®˜[ì^ÊXÇJOMÏVôÌ]8tC}8TF¿ø¬{pä$î{§‚îh<ýÌÁð]yÐ0&oäü|€¯¬WR£/!ί Ï å§Å‚—;êüj‡ÇÏ%dwÜÙuÈôó8ý;˜³£à_1 Þ™^/ê¿P( …Bá n]ˆ#2Âìî¸Cë­AöÜdŸžæùݦ:ê®0ó¯ƒ,ÍJ—þ»&õ[Læ÷-ë²ë5GÜMå?z ï)Õ›€ºGt渺Àû«˜¿Æ®†ZÝ·?®T„?D>ÔXD5˜L%g§õOØäh ÀtïˆÙ–ûÞo‰ß/Llc¾ Œ4wž†ãm^TÅ¡ëaÇàÛ,=Ï1'…ÌXt†>gwI¾—x¤ùûD,¢qÂ,%ðhŸLtÓXSÎí7‘³Bט¾ÇöÛìœi&÷¿M3ñ0óû€óC¯îÏ'ƒ/¾Ü S§…ÿÛIþÌ`?ÀþÇš¶I5•›0¸¦æ†‚=9©«çÀdJñhÎñ´’Õ n€)q‡¥íg † ×Mì›çÏ¿4›®ü4!z¹HÊ)¡3Œ­˜g)‡£ó€OIZ…üØìŒËÚU=Ö[·P( …B¡àq“”’fßõQBr´cEÅ+–@6†}݉õ…V©…~æ7òT’>ö3YDÈ*BÈŠÝËW¿gä#Kƒ†q/Ø.3ê ÚôP]D»™ì,JRß'tß»úPïv–uü1;Ï%‹ÁLÿÐåŒ|*ö9 ©ÌÐæÃfcÆiÝ5svÆ{$Žb/žèÑØ9“îñì{h‡#&K ìiƒ²rZF¿Ë@q´aæñ–˜í(™‘5úNL;>Õ[€½ƒüî‡ó78Bc Æ›[~ÂÉA˜=О?uáÊ(á$g„ßHQÊqÎ7ý€Nã‰ÉpRJŽÏM«“Â8’à×nŠùEñÁô3Ê]Ÿš3ÞUþ´9ÐéŠWÜ?r¥1¾åFŸ\²¦Î8q«-Û¿v¾²GY§^ç/êŒ!º.¾¼#N=¾ð’ üÂ'ê¹r—Â÷xEÖ( …B¡PxnMqÞ­9štϦ™ãþñÒøû xK ^öms*ÒÅC°³´4ìû<ì·¥æ/™ œè«j­Nñæî Üürõ•ýè½b/ Ž`Ëú‡ÊTºsþË®æ?¡:j¯Eh1Xƺ—&ì׃Ö]áÊMš¶H€rè½\B}¾çIµwGÃÐ~œ³€R±O%gáÔŸ¬,ÕȾ¢>F°l8Ä}׋_M7o®jAËDïqÐÁ±gSÞpÑëR¬ùðØ&ѹw\õ~|÷å™ru(ü+àêÿ°M;^Ó‡|ûN{äZ/9‚Lþyº‚—¸Âq²3Æé´'ûôÀ¥V3£Û:‰#Cé‡ïmdË€t:ó…7P޺~³·ùƒw.Ÿ¾Ï0þ¼òÅsSëÔ@à™§XøøU;è“w^1N>1ÞçÍÊ|ÙVø¡ ©B¡P(O”B¡p·u¸ûD«D“­z¿ŽýÙ`Ôuú†CÓëÌN!ÝWÜB Zeãy÷,{ÉíÄýfһl_1Á„ôsæMcØŠoºC‘ª†jÉÎ/h1¢U_—eØ¡‚Héw›Pߺ””•‚5  ù †¨ BñG(’`ÊŒ0™9ïÖîν q»•Ô”b¢oÀž¡yŸ³¾`÷ ˆS( +ÐÔæ§­sÇuƒÇá…=3³>ûÚ”•ÈŸp}yñ VÂßz‡á™ÚFÕbñGlÚñöSïÙÉÏð†|à//ê^ ƒw^ćžjPèœsž­Ü½ >kz„DŒ•—ø…·*ÓÞ‹"ðôJ#³ùÁKn®Ëv½ÙbãÝ ïÿºä³ ®¢B¡PøÞ{Ï^õ …ïŒÛ®Rï€-kžÙ^θÖÚñî|Ûb€`1™õ•lÃ-ý¿NŒ:SfïŸ×–@–E°ˆ,›.÷˜,goìí¦ØÓ|ö|yX‰žn¬ªxwØ ›¶øÒÌÕìriÓÊLµþ½€`••v3œé„¦Æ Îza\¶¸‰²Œì%[âM`áþè¨C듸ÉÕ`°=¡è×j°Ý¢‹6 w9Þ—RÔ9ØáÜÛ8ú†žwqr8Ò÷°wYû.T‡ŸßúîÏ$}yHèÄDÈy\Ô,zyÞ¹%ÎË–=?µ»Ö…5ã†ñmš}ìBŸä|¶R‚co‘3Jõtèu‡vȹ¦àóGí.îŸÈhGAyh'[÷k’‡#=Ý GÜOŸ*<·Ìø^àƒõ7Äèëµ^( µ»™)  …_Œ=0Ò"׎¬H„×›¶¸Û›¬²Qü°ßeËvw™æ»¤Ï¢3܆8”ðúþ°ËõpÙ‚ ˲4ùøk™{<@ùXäù»Èß½IZ Å}ÏõîþÀê˜:’q7`kÌ„³`øŸÞºc;TÄBWÍÃnÛÖý€X÷@²Éõ£¦„2³Cìaû.TË›óò]1¢¨K|-M%_ub>ôÌtéÿZ`J•k$$ ¼Bû 1f4ûO½Q€sþåÐÙÊ:Ïq$Ï#X sº7Ñ"c®Yô¥+™Z6~F–*ï°—9Ì Î¢žüäç¯öíóÏN¯Î¾¾ñj¶Œy°”è©Ê¾wZ@?I,8X>8—Ž¿xF›ñáþçå^úôÑOzÿâÁ‹¸ ÄÄ6¶P( ?áÕóÄš©P(üXÜúÚ4øåvâ’õø¨¡ˆÈ án-°¨Ý{£nŸHe6ÐŽ $Ëåæj‹ûñWá*BYîòúwjûNåC@YEÖµK ¦@TêC÷¢Y>d…ªHø»åÂÛ}Åþ7VBïº7Ÿ-ñw¹¡½A´Í~ùØÿ¦V$.£ªrb"¬´7€"¢¯Ýr:½Öž*/IM'ñê´*áÊbÃ<½?¶rm• Qr§R¹5šÊ•@fµY™úVXÀ©`q ,Qü`áôÞlVøŸnÅ1¼Òáå˜;´:i Éi~í3VøúåËs,O¡pòvø—¿xãN»Ô)VÆ=¼K¾sgàT %õ_ÅãuÝ…sÊ3Ÿ7FÏÍó7—QØxîÚß3Ë'_F-E …B¡ðÀ»µ"…ÂïÆ­)ÂÜs̉=y\”ï > õµ£l‡êŽ¢%dRy|?ÌÒ*všøÞü»hþ]îÇ]7ý—“®Ùÿ¦ØÙÅñï|}£w›v˜÷Âwžho½}8RZû Ï­ñƒ=¨ãÓÛ2kÕñ7/»œâ¹Ù;Ôc9L©žJÊg÷ù«Êù þßçž/ÚâÛ¾Ýjè …B=èÞåZåBáWâ&ɲž; EànTu{zp¼A@·Õ5™é-ÒàDWöóÃ:úŠ5 ÐߺçÔ/» µ¸ˆPVk`+ŠaâæXƒðÎb®ÚÐ NCÆõÀ½Å*¬²`÷Y ÒÑÏ^(#&éö¹ëlȨ̀ èè!ë*:*ýÿî~,áÈF°žÛ¬pDÖ9Ø+ , öpH’™˜Î(W^ µ¡Ô,[c/¼Mv©="rÌF_rm¦×…Œ8ÀŒD@Lá´WóÊYAT H†³:Ê%óŸ¬~ü2%ZŠ¿3|Rl W¤-*`ðm'ì»Ý m 5ƒ …B=è¾ÑƳP(üÜš •Œ{K=†Îrß9)¾½mÑ5s¨)K«þ/ZÂ~Ùygu¢ÎPëù%ØÓìt²9JA¾·ý3+…«€²ìá C‹K'Íu:¶(¢ÜɵƖµý¡‚(«iUÓê×k³æ}ôÅ9Îi!•™®¥–úaÙw,ËNå7“nŸ4q+­†Mi&"d^4ª€¶žUèØÿFåk#â8÷D«ù7熌|§d^‘NdA¹H +Q%ÝO¹ÎfÐKK7ÌB Øœ$™¤¼ïš6:BÙªÖUo~¦€›M£õ½7/{ D›Ö¶ÒMI»ˆçбì"E6ƒ^´+²wŒÙ‡~PÓCºO²JÃ@2O]wKd¸8Gwu DO›,NÃ4œ ƒs¯ ®°áfÆp¼˜G~#3çá–ŒÉ×󸑀ØmêË¡Ç?Ø#ñ ê}|“n€™O6¦¶š…'ù võelÈЦˆªuoemÃjòh]½ôß¹lRd±EŠüÙšAç‚KáMXؽsµ M/*Ø™ë;!ÞÅ‚Äèy™x±’D42AÜ#-3Ó •E*´hÏ=[ÿ@÷tí´¾NlwLZ‡– ·òAØY~-×Þ»ps!^{Z`fûS&¿iãp øÃ^P"ÑÉÖšKS©Ê@×(Bœ»©€NZo2GÔS‘cêÆzZû-K(hˆ:WtrL ç%y?»ì¶~…&\tû™þþ€["Ë8ü+wDxô¼ï¹iÇë¿úÖ¬…Ÿ¼ôÿJ’¿±ç1ïù46Œ'†ŸÖÕ\W=û~«¾O“~ÌÃí­:ï}ÌB¡P(ü¤ÕÅïyÏ ?·ûm‰Únüò¦Nc¥xVIt¦Oe#図.÷Sà.Y±™ôvr^óÚ÷à »Éû´Ãvê¼Ñ ~ì:k¾?DØ]…Ý&;7¶¤áߣ²!߯lZ´e±K ßrÒ›ÏÁbsåV/1/0ô½´ìþUHájˆli)ð÷¬ÿEåþgÛê®kDë€}(³«‡M~o¢O¾óÝI÷@nÇ7²CX÷CÖÊ8Äô’që ¼s÷Žý1Úš@G¼leaÝ;qìgg1îoôéDïuöÔÝ‘ÊæÁ±'#jfymÅ?è 'Õñp#^u]x5Ë3 AyL~ô»ðÍúèݲ°ñf×2a¿ç¨2{Ë?æñP÷é'ÍóŸñܬº¿B¡P(|Áó RUêV(ü;Üäÿ åÛèÂŒX]0]‹ØÜ¿¸„GD¯§ü€1nÕŸ¿;ÜRç¼Ãˆ½ÐqýH’»¡¤ÕÙ¯oÓráXÐ΋¢°™IßvSUnÅ€,‹ðcëR—¿=€.—æ{¼î¡]P ìý]Øüs¥ߌ–WÙ"=PǤ–ß9Ü‘ÒNj”4Âz‚ÿ>lµ&ì‘8Ñ=ÛåÖ°}š*m?håC¶P––СŒÃ92Ö4l¾.›€2xpŸ÷†bŒÒs± ³yø+Ò'2<ÖœYë/é#€O~=ã2šßÒ©òà€Åò …û¸«vÖÓø_ î![1)Î@ݰ…B¡ðú7a=®¾÷Ky®`ð﵊ _ŽÖ®ic41›d E·›×±:Û]'YÛºuU,Y7ÎŠë¼ Ó¯4Úô”$¯MξIÆ·§ Œš¿K•¨Ó™/:2š>%¼?Ðî–È»ÉWY! EîÁ Y?¶O¯ÎOXŒwá£{¸—k@åà‹º|Qq«Æã¸«È¢”úÝg\^9h<“ÅvIò¾_”“¬ ”ôYÄÝ›w‰díþœû´,ymbîJ%X‹é4Ó1ŠÓ܃³}f"¡le‹Ä©vÔν¶ODÂUÈQ äá[“¶ém8LnóÏ"MPïýBm ÿnÏúœë7èë„kj÷÷[ïç-—èƒ_{³ …B¡ðÚ5ä/ÑjñW(|9n-I?‘DW‚ûíCTFµy®4ºâ;ˆ—1Q¢óPìv·®…2ø]ƒwÜV¬€fN«>htíi[î÷&§Ó~ÄUºz¾ÊÓŸùÔ5вpó%^ïGX²p«fÿewK¾_Ô¢‚öVõJZoæYá‹‹¹¢Ëë‹]¨Ôr«ªä¼d%´½ˆŠ86¹±ÿFúF›H;'ìÌõý¿«âÐÙÇ—ºQ™pJ¯Û8|!JŒu*1ÔÔ–4ÁÝô²¨ ·ûÅ2ØTœxqN"1ˆ¿gÞEqÎ Ùÿ’î-¼á*ð;>±-Ð+àâ{?âr¸×T! ¢¬_ú¥25ùöOÓ³?hŒkª …B¡ð¶/ÍÚœ ŸŒ›, ïâ´y IDATÿ/w‰ùíŸ"²Mö;Ź•,»ìñb°O„,…F”ß°ÿë&}CÐl2šKð$‰8pôMÅ^óì݆×Zw»]š|mŸ ׸øÕjÜï9ûwÒÙ{f l,ûÿT¨£Ÿ±a§íî>ÜÝrK|tÚð Å«÷ô€¬Ëîý#Ë^"½$#ÿçÆøïz>Q)¨7{5ñ4E ì­ƒD@g"ˆ·=¦s@Í¥‰Ä½sHŽô0wgPf¡æ³ `ì âÒ+¡¬ÅQö<Áà`|º¾•ë_x“¹ôUa­ÏZÖ~ß[©úŸ:xå¯_ŸŠ_Éÿ/¼µ_ÈÚ׈¼Û¨Â…B¡P¨Uç/yëÕâ°PøLÜtqϦMšfwݰtº\¬Il²‰*ðbrö»SnÓ½ù»kß«7^Þ§èój5zm®SÄM?6•#ÎWë‰Ò¢QhAØ:ƒ-½õÒ*¢Ã**R²(·ƒíØØ‰b¥¡$v˜F›·HF§e1Ãלº—2 ù®ƒ]Å^x?¸‘HRšN¢- £ ÔÆŽÙ… }sÛ+¥²Î÷ÃLvËØv]]ˆk†) ½ÒI Y_ëvm·ò s/Ø4ÞKpb3åZã{È«uòëµ^x;’å…óû;¬\QHß?cƒûÐ_ñ5½Á÷›‡o5X¸öm<Üõ&þî÷r¡P( µ)+ §qÛøhâÛÈ­»ÊÊÒ »¢ÏÎf"pʽP úC@ùØóÙ·ÔïUØùÜ'¸7Ž¿²BEmî²]q¾µ“Ýa5Ú³‚µwWäkrÒHQ*`•g–.|ÄU°ZÑ~ú+ZD¸zÑÿæ,£d>×Ñ ÓÒØ:gÙÆz“WºĪj b-…Ý«ÀÚÌ®ÊB™«¬m ­·´fÀ·ïÂgÁ똂9u»(û9 ´³øs¸IÆH>H œxT;B& #}ªÑ†ÃÁn&95^ÝëÞÇõf/ü•k PÞúUÑ,>ñ2øÁwΠÄð¬µÏ“:õ&. …ÂoZìÔ{¯P(ürlÙI`£€e—|ÁG×çéiøŠ´6¤°c‡)²îᨳܼŠ@V¥±³±“BÖ»è∻JÂîI‘¸¦`Ü<§¯ÒHêɇáDcR*„qvéâH´ä5Ö®ýBEo‘*^žÙîoÞµzZ þÎË“b~dvÐÇz;äºc“²14wž¡N“Þ~÷„ e…òdÙ'[Laƒ³«u/o ª¢ãˆà`£Kåv@U®‘ˆé»C1Ìœka;­OÚOàõù:]ýo8³™j ±ÖM…BáѧÏ>1Þ‡M~?<ô§G^B&ªÿ¼[ãÉîE=( …B¡P( …ÂÜÄJÍl™ã2,š™¥a'û R'íLäX°§K“^tMc‡þó£D×6Qg7²-JÔ¨éþ'šæ–€Ý¡¤©âT˜‘Ü:ôÙ[žøÒÀ›O²±4PD¼ïÔA&ï÷œí¾Øüµ‰v¨+m#ѺI1WÝWK„´ø„qPp"Ka4×,룽1f;gØÑîq#tŒä˜ôöÈjþY~ªÂL*›% wÊÊ=ÎI ×v–gÀY>á÷lÑ^¶iÑ+…šro{w_ô°å?øÉópüߪµõn* …B¡P(~n²˜…8Dd ì§V~ßÙj-&ž|L ø8ûSg' w‘J¦)³÷Ã#ˆä¨ýCÿ™m3%‰GÎF]ZÂ%Í<‡Òüq×µ_éâ$’´VŒ&ßáKò- s=#«y°Qo¥‹eì>½-㞢¬ÐG*ú ÷©áGÿ-`eñ•ÿþ}‹?a勤JéøN¶”ô'”.ÚØ †L;aLììä¡LC|b³¬g} vËú†|ÅžýacÃÅP|»þE¯•S=Txl6ð{–X¡†ïíqXpPÚd…/˜{¯½qøÝnÃB¡ÞŠÕÂB¡PxÜ6~v,bW{ß~sçdmöº(Ýv/$âæãW;©$e¨Ådè9ñƒgwšÛîÊB sú`:¹»éøûcÒG“¾ *›\Åtw!û°2²~Óª>’ºJr¥¬¼¹*EÛEAšÞZø" Øv}Š2? Ö¼ÙæÞN`ȶg®‰3³ž¥Ì÷$Æ}!8«çQr¿®]&ÍõÁÜvR1G&—aIŽŽÃì@-âÔ)áÒ"ëÍéüô5#ž…ô|QŸ?#^(Ô¾ùóP‚-?ojû_xì9ðõß}ò±YaƒBáw?·ð®AŽÓë)Wxë¥BMÎ U@¥|² ‰ˆeÉ9^„™ ñ–ÊݾȠóùVõ•ÌÕä{0¡U§X·Â¨ºo,:ËÊŠž§tvœ…Kç·óÒ8«[LîŠL^ Å!0I½7÷z È.@dêTÙá¨áÓö[‡Ëh†o‰QÒLQE$Í¡e÷yb“€ñ ÔÓ/zB$§SöÝùç– #±]£>Ž<½ñÁôb•KǬ öÇù©½~×à3Øzÿ{ £ðOzõÒø4)0×ç÷˜Ee¥QøÞâ‹ …Ÿ·!ÿÙK—Š\ …°†ÿŠ‹…¶Ì¨`ü¿ÆMs·MI_SðÌ”÷0¾Á"U±FgT«o¬1 ½˜0þ‹©<È•ˆOFЪâì»YBÕ ú“Ù$nþº¢8Ùè°šY¡!ÑÔª‹jÄvšÊï×ß\ÍÀ™;‡«•âU˜‡ñžÄÈi¸{,3”>4' Q‘†P¾ðÒú*S~ú\p4½ôgö„i¶Ÿ±Hâ ùnlT›*`è:f\ <‹ôiÓ]ÔâÒƒUÙ*\åBìÏi©DÚ0¼Éʨð³6í‡sž¯8¾M7 ßàF®·ÀÛŽZo~Ææù§¾èë½[( …Â÷]ºà¡ìÀzG-n²šåÑ–ÅÊÝBÊŽV”Ç×Ù܆‰K±(Ûbôô•”¬X²;øónßmײ¹ÑB ‰)k0Ê?ÑU‘ûŒÝ–Ûc™ÛtoÚá8­ÏJ*Û:~I2ôM€[íÑ=œA±vwЕ]ÓžyFtxÞ$õ™™Ø0‰&噯{Òe<üL<ø fÿÔ—é†{¦73Í´[5ûOÝ››º”¾p@z`xn“lšØoŒUj—Uø>»÷“Å/áÈê(ÔÝZxÏÙϘQ¬þ¬;´P(~Ë3»Px÷» .-ú¸ðé¸9gTŽäùþ^6DÇ xúÜHg*>´)Ûhá˜SѦícpídg8™»ŠŒv îì?íá-ÍMg¾JãQ,A¦ÅÅ \9ÓâÞÛ0N¼t' q…–fÎଳ橵ø¹•ˆÈ*²ÞÙÿU1Úe°1kF u)HÛÕ:K sùÁ§×M:œßê¨zªÚ ê@ƒbÕhsð(c.NÕjRw °iüÕ1·Ny;íçG:?¼s¸‹gˆBágóxnßPñƒB¡P¸´ëûŒ‡jqô…B¡PxæõUýXø]7ƒd†¯/YÖôɸ¹Ìkìu’ˆÁ2ZÐ&aÙeˆïŒg£òE‘tNvï¶Æ¬=÷¼“ݪ‘§DÉì)Ðÿ»1WÓO¢Êw1§õÏÁÞ- }¸‰ûcWdÚt~¬Z=Tƒ ÛîÚÎÞm <Ç=V~‡²¦x± wf,<öÆw>Ý%•c¶eÓñžè3Ü…n\¾|Ô¾³±“ì­ÔÝ"Žï*Yõ†Œí&sp$Yܪ›?6¢¢í-‰ñ#¦J&Ö¸8‡äT﫞ȅߎ‡§=¿ä+Eý†Ev ká§Nì>ú¾Å{¡P( …BánÉ ¦}:nzÙ–gMOæC‚¬ó_Td¨ÖL_‹-]€ƒœm(à;UºÞIÞÅß7òº)ø»2R&—*ý<[ÇiMC—¢±;Æá$”ý>õ‰N Ãê´´þl Eðãm ÛòÐ[E‹%PHYZË–6$•½§Š´ØC’‡Þ¬ƒ½$bÌ¥g]*YUQZŠ!}†¸©› Fl6ì´¡z(ÿäûÑ îãp‹»_m½¦QŸùó ÙïEuu´^RÃäz'W=‹ …ÂË—G/aÁø/Z^øF‹ìBáž3uû …BáG¼ëmS(Ô²í[à&‹ÈÎlRå×;¡üÎ,kª4<íÜ@µ%,‘)‰×$eïE¦Î@ß½U<ØŸPÅò¡žõuEY%ä°[ZÊ\·ÿžÃ%Æ{'+â¯2MÒžù…«é±¥pI 5€]Ûw[o…‹í1¨@K¨GWÒé3Š™Oìštûæ÷ º$ªó;Ý{yèÅÕRŒ2÷õ´OU­bWC…|x°ÀyWt磢¢Œ¢® ~Û”5|¿fŠÔƯP( …B¡Pø}¸u’Q'}+Ö^ëÄaÀ;ˆ6¶JJ0üoKlŸíVÙpŒ0‘MÃ¥C¼Á°õ£h-7¶Àé¾AEdØîã–·5®>lð\¥Ó# (®y : zLb£Âõ®½¥=°ìƯYÄËìÜGÄ…‚Ú„¡+‰h¨>©©gè¤õ±OÀåMnSL ňÒOª·a dPVbF„— Š£2Òé¡»EKB¹ šº×ºœ¬-ÇFÓ4Á*­U›óBáÝñüíùZrïw¿d < T}û¶(ʾP( …z …ÂÓ¸iy“¶×€Ê¸çÒS³¹Š¬{‚6wºÝOõÎ þþXä ³—$ÞÒÀa„ÎõÏ=¸0H{ó òJ*Çí¬[ê>L«Bc"÷Ê KúcÉ£º‡{ç*ÁŸûõq$fä>‚’¾dYꢆF}jˆ{b8­X¼ê1.¸ ,Ö¢YÚÌ¡òLøú¶ƒ¬{]•B‘qNÎŒyúõ}¨š}oðªÊ8¨æ©Â±DãJÊ$²½<6öˆ®Ú*ÖïV$Õ z85õŸY'§FÒèZß µƒ9Àçñ•Q˜¬šj'ú†£SDE¡P( oðÞcõB¡P(ÜM€õNr“y£Ô7 ‹"Ýõ泉½cîÑm,Ajßùµ¶ìãž$®õU,/ †} †|è6L_± û3ˆ µo-[Š}넜ëv±IýÅ’³×Tý\ÖøÌ€•Ç]ÆaωLšÿžB¾0¸"¸–#PÛ»9pâ 0®È¡ó»‰´Ø±Ãxo«²à›ŒÅ[™‰‡°[ÒF.¸’”ÇÛmž s‚?³-Š,ìÿ… œÜoÀu¿C9<;15†¹g …Ba¶Íz9>éÑ÷¹ÀgºšoÖªþˆ{ªP( …B¡P(ü&ÜŒè9 _|ßçèTh.^Kdã"W•7®¶oèix~s¾Ãa!P-±ö¿¶€6H@9Ç5254‡.Ñsÿd–,ïzÌ9S:büü3 22 V=ÃÄ¿XÅ0ÜÈŠÿ+hìˆÍÉyû“±ó"RÊQGý¦Åˆ0”^ÓvHÚÑ×% –Êw²KmNú«¶­mJA.á=aÐÊý#ó쥖̲… [| ™§lúlq§¾Çi¸{ü’{]Ã*«S÷jsSÞ¨ÙÿµP(þ ^þüá'ß¹s~!X£S( …Bá`±PoõB¡ð­q3Š:VúF©ûx%ô&ÊÏ=ËX´äL $0<(³l}æ³)Û4JZsèÞÍ´• ìµ::JÝÕ4Xµ÷á~>ŸáDÓÖŽpÇ.°Óòµ‡RÂëú#Yy(œ¶›Ý±JH÷ºÿšæf¶†?]JP#;ç»ÊZt\‡¹TŽë1h¢Ÿ†|¿ëáh×a3Í–mÂôÀÉ*"»U²¢é¡ã%6@]¶@™´ÖÑÇ]Û“ÌzlÊfYÙ2o\·hÜÝÀ¹ahݪ6ã›j‚Ì&@¡P(ü <¶ãë>ùn;È«›Úï² .f¿P( …B¡P(6  f´KYî,âžGŒý‡;K 6öã[媪}JÛ6Œ›$Ž“|’ýTSco¢ŠHøð²KÐW­‚ût\Îw¬_Ø€ç§oÕŸ…B¡P( µd( õø‘—mÛÖÄyD§i;YµÇë|wûJl&½ïkª 1ÉÔZ…ýV£zR‹ãg›ϪZe×èé®›ã¾>TA¡&[í~¸çqgâEnH›Pcº›®–؉9éþa°·­ñÚ[h‡F£‰ÙÈ&!-¾1–ÛB&òCMÖ¦õÒ¿N‘¥uݺ×sÜ%§ìÇà\Š÷ZUöhÕÉ‘èüôŠšr“8±‚ŲçíÒVÿ`:â0ÑÁ­E”åÎøßD>¶¬ÿ»µ/ÿŠììÿömR Áb‹? n«x!㉵x* …³¸{žaÏUí²6ðû¡P( …B¡–'…Â/A¥¦¾7è¤u ¸KëØ„ý( âŠcž;ƒz$Ÿv²Õˆàï<¯.0ÒäÊÞVv9SÍ€.zž ÅœtÓÆh½Ëîlœ«ÕC¸Z‘9wŠ%ÐÊw~5Áí‹à2Ð[V»iU¶aß´ùû©Ÿ0Í%´V Í'µù3t¶¾tÃaCt·XHË@ß/V\ò>6ó Ùõj¨êK°2¨’ôïìÿ"+ÌÔò– »Ö?WeP [v *R¥Š3ŒJ†¦ÄÝ·™[|ƒy(ª9 û¸/û¥ácËú¿æñ—?»Óï*«2ßn‘¼fÁm|³é+Ò5ÍÐx¹µ…B¡ð-¶ž'‰{>÷õÚ: …B¡P( …¯Ù•×+pÅ57*S'47îUöš¦º=ô”ºã—¡IQúm&E68’ÙQ?‡ƒ-«Ëƒ–NÙ'$&¼„½¨ŒxWàÌ?®[–ºþf-0ÑuËãF‹y,ír*äíàêÌ]ð&¤ŸK$¤Ž À7†z˜hmfu ‚ý‡ûŸ––€Y 2÷u^î•MÕg›Â²…{ì*’´î™ø\w•£ˆ$üC#NÅÐ-F iFhí †ßcfÓ‰´MÃe“úYÁ"ØSþ ’¸“þü#ëŸÍã÷^.³Rx/ €È’G¹ddÚÌ0 c&]_RìM¡P(¼ûúx^ùp¡P( …B¡P(¼ù§p·¶4Òó»¨:EY­r3iz,ú‹Ùö2eÝ»~úý3š¼ÖÑ•¼,:Ÿ={¢ÿ·'òïì'¤|$QÝÑ-L÷Ì]d†Ç;ëΣW3ƒ\¾•ž¿É"YãVsõ©l~ [U‡Níè^Òùûˆ±§G!v†\6QŸXP¥ß¸u Ë>²MªgîSäoFáý3ö}Þ^²Üî)ÿ”]wè/ä¯ð?²þGÖ?›Ügó­°Rô͹ÚÏžÁÈ$&@MT( …B¡P( …B¡P(ü(Üîÿ×ÄÖï,*i^ú³§Û3Uö‡QTw\:áUG<™ŠÔ#¯30ÖÒó£u£´s€Q€Ù?”ˆ/^ þ]Ì•¦9T¿^ؾVáî{,î;¾?¡UæåHÔEYׂ!o}„LÈi¿Èz4•œÖMå×+‹XѪ²„ÿqgù÷N“¿²þ¬†”oa•mfb·Þƒ ÃäÑA)t‹iß_42V†Öo¼k5êßÏ+ˆ,²Üϲì¿wý’ÂÿÁ]åý#ògSü_SÖà]ögëÛ{Ðnµ·m3׳)’Ju­P( …B¡P( …B¡Pøv¸Éÿ^î‰Ò«Ò»ÉøÎ/·Áñ×ôyÖ-ÞPê–-ä”´n^/\°éê-€¡¿ -Æ¢èøüøm¾¦)E{Õ”KE//I$5³_°g‘)ö&l,T¾¿nŒ_ªØ´$NJúªk»1/‘K¢-4준nÒn@•º~Ïm_[n{»–uwVX{<@ñÎXb«„XŒe„}4ëT¤ú AðÌ-Ð>ö±ÈíC°Èú!ë ?DrOÈÈ_áÿÈß?ÂÿÖ]Ú¨…@‘] é~4ѨۇæV2ZC’NÄ0'GúTU P( …B¡P( …B¡P(¼ Îóu7üßE¬ÄÊ`O6‡ˆ IÁhSÖ†ž˜ló詼R5ÿ»Ë˜ìªþš…‹ˆ +P„tê7N_î¤íÊÖ` Ÿ‹°·â˸çÑóÞ0Ë¿cOé'|•À07ßSB°ô¢‚•ªN…Õ‘ÙšŠXšÐÓçÙúœ[_Âlè+¨Æ]²ÐHïØÕŠš0VŸ¥Î>‘ØÇ´ }ˆˆl9þ= ï·õ~ö°Aïœý€¤/¼Ø:j,¶à£…µÜØéjŒÖo®ìj’ÂÔ ªAj2ßÿsûoüïÿEÜäÿ½aýonÙúÀ;ãÿGøGþþ‘u®²ìžÛ¢dý7Ÿe·CP÷a.“'“Z“Qôç§I¡P( …B¡P( …B¡Px+ì@VÓ†"+`(nç7KO‰6’û‡eÿÖ]Ö¼åì{æ=úÈ’ÈL '’¿Š÷Õü/7²x§üEkÌ{'áæ[ åÑÚ:BG/hm tcpîÜwùaÒpÅöOÛtc‘Aqÿq¬È œ"Z# É_ULÑJ þÒ‹ ¸5TÏÜ­¯6*ÞIÿUDÈUVÊBB…^D$[¸E¬ÙyçÜ[d³‰†èARVtyŒ¯T}CR/hðG` Øôê–½[> ÿ{!ùðvêýádù+ø#«ô|,–ã¿OÂæ‡¼yuPôm¢­ £ëÔÁ§¨ýbÿ …B¡P( …B¡P( …oŠ›ü_¢8q­c²ÂCjÿÍ­4Úñ-÷¾¹¶ U˜ÁZò6ãY#«¸J±æÀZÄßY«ö³K£H¦¥£¥‡`ÕxôñDÒLèE¶Ôuî¢I íaZ7ØÐt 娇ѧÄÒõu&—ß~½ãe£ñqØù“5ðã&ÿë¿(äòŸeýƒ¿„DþÈß?ÂUd•Evêÿcû/v ©V/ÑF§E´51ÛÉeΞq¶¨*P( …B¡P( …B¡P(¼ÎSv7þ£ÞÐÈGùÒ$ÅS‰×o$uPžu¦­Ú/VÊ\Ôy]>³NZg~ÝŽÀíúﱞ@Û„¸Eûúâ‚ "ØtÚCbµ H4? ¬º&ú¡”ñé£À`P9|ë´ÜV•ßtc° –ò×Pê¯Ú(â^"°îÿ#75Ó½"„¬²Yò2‹@Ð^2azW³âDœZ„¦w ûµàÈÒ®ƒ³€1 ¦ïvíÛLʇȯe…üüÏ_YWÁ_¥óó_›ª–-haT›>ú%ß§1Õu@H·¬ë\q¶H³‰ $e%Çó—Þa8Îz`6©Æ<öF<­s_ ¿wZ/Á4×ÍU{½gý“«›È‡`ùP K{1Dk¥_D öÊvŒÌM’]‹‰Äžá@õëôà …B¡P( …B¡P( …¾˜^»\5*<ò€‘lŒyš¨Îiæ¸gc÷?E’-¨`…P@àÚ°¶ã¤¤°õ"d¹'°ÛÖ6~V‹ÎoGf¨!0š0É9·î•úàÝ©º?ö¯0?T;)a.v._C&¢t&1†[ÿkåQưÔ3u$›P {Äp­Ç€„¦¦!Œîœ9éï§Ûô£|8€Ú}ËÁ¿û¯òg]ð—ò‡Xe] 7ÈrÛ² –mšÑÕÓ¬VUI¶]åàƒ(<ÓA*åz)º¿P( …B¡P( …B¡Px+\¢ìnQx'% Û¯éÔc$I>GPqéG‚²r•ÝÜŽ°¹ ‡tÅf‚½% ÊŒÖ¶ºVǦQK^Y_²'Ë·úç1`Žl£"=@O§ô-$¶âDoÔ)D‚:¿ÎUçÌ9ñÅ÷k•R¿fó]âdYº(EduûTߥ¢¶ÎÇ>F™Kv¿@Ξ æv?3Šý/ …B¡P( …B¡P(¾5n"‰OcIŸ×æ‰ÙqØ,t*Öνv”¾³ã@^ovÝTM^ô‰Ú_÷DõžN“=Ò½éA0ï¸ËDJÞgû¿ël"KƒüŠ¢MÂNˆü·‹CM|ÓZzˆíOÕ'­CÖ=ôÒ5j £« §ü<X5^©’šç=²lšóâ‰ÝtŸ™T:Kë‡üþBþ®"‘ 6ÇãáÝ;í>ˆ„j‚Oµ»Nt§¨’ j}dZEP( …B¡P( …B¡P(Þ·žõ¼“û°=•"¹¨´n£ßb%~Zª8÷nÙâ­É®u¶ÿ×ú4‹Ù§xkÕuëû*Öɶѻ¢ÊKÞx^Hâ ¨8wQºm^d‰="bÊ/&éØLÄg<-ë °)¹xFìÆ<Š<|‡¨r¨_Š2ÚÝŽ¯JCÚµO½isÒ_·g–íßÁþC_ÙÚÁüTa’üÈÜD–U\ÔÎx7iýlå1°:?÷û+©Pe™úÂü?Îöb¡P( …B¡P( …Báƒ×¿RìÒ?­ Ä{áÆ €U·âò°¤*A)^@ŸP:þ4î¾覀 CÚ‚û·`èà͹WLK(¹@ü%§j¼Öô߸»t°P® ŽÉcº Ñ}-¢BC‘Ÿ¼§tž;w$h92³Ë/+º|s/@pu†@dÙ?¬‰ûEuŽ#¥ÄŽvWözA®ˆ!äþ§"KÃ:Œñ¬¸ö€B8¾ ]¬E¸Èeù¿‹‰«¹ƒ˜¢Š=~¶ªƒÎ(8Ù$#'.?¥YÌB¡P( …B¡P( …_>ñ­ |9nŒ^y×Þï4÷Ly*‘.„ÄU|.6ròöŸ”ŒÙLŠ챯« (~霩W.:¡‰ó»›÷¯(»`ªrŠ´ˆÁPÙ1Z0àY;Ï;p[Nâ4{ ‡œ¦°{Ú¾J“KÁÓ]{3ûE¦Ë!6}ûæbôH]lÞ:h=–©ú qf ú’IwµßçY×a0ùSÂ¥GMDDÖ଀^ m- n.*i Q3P7èØ¯Xùgœl¡P( …B¡P( …BáW£HüoˆTJ>-Û2» •YŸÚ°ªß%´£Ó r ç!& ?Jš˜ '‰Ý« 6h]Ÿ¯Imzaš;»­%kô =<ÐV6Ý$ÚüîfÕ+>ËÞËÿ(q$„®¢ÍõFÚ!÷?Í”Ä\8âÇT•¸É i('ßb­àcY©möË4óˆùØv›¨Ê†6²ú7ZO§Ã=Ì’§›¼<|˜À ›¦+t ™±îPZ©.ɧ³?#ç˜ÝV•õ_( …B¡P( …B¡P)öÿ»âfþ¥™e®Ù[hA„Ù€„ÅÖÓ¦Ûš6¡s¥&$Ö¸©9ÁtH¢AÂ)Ó²ºtBÿú˜Íêè©ÒEéÏF1ÉIé`ÐI’¯Lã\ŽÑ[+ª\nzSøYÅ—J¸ki%&P½§cK‹ èJfâP2øži­çƒiD,³põ…)gž†4ƒ²dÝ‚Fh±Vj“ÖC´OÒ[gŸDh^ …B¡P( …B¡P(~^(õ\$ҷƭ˧d2ý>a?²¥J-‡vniÀæ›§¼I»ØÉ$6~䈫Uæ{š¹34vÉøú2•ÿp¼1Rÿ¡—ZTC·œŠÅöÒ:ƒÞKû­åõ'=iªc´ÒðÆ>—3MüA3Íýݵ}4 ®.>mäòMZÂ^]Œ¾qQl1î¾FM(J&EŸaªÂÕŒû¬æ¹§/4¹ò¤¼3û«¶ PÒYmûÉ^BAôiµ¨mÚãÐ'úê9^( …B¡P( …B¡ðÀWªX£ï;Ê]ȱðÚd•‘ž¼W¹É4jÌ׌³>7-çî¾Þ³Â¡Òð•l‹Dù#³«©(.X'•“¶N-a[òõ–©­I|ä×f\‚ÅjîÛ#cÖ;¦ŸàBÒõ‘\,Áø3æÅE£[Hg-C(hƒÉ¤°‡‚½½à>î«­Ýyü¶!SgÔãxl—Àí¸øØk¶Ôƒ·kL=¤Ñ­hí(Ä^p4—ô3(G`¸È´÷ …B¡P( …B¡P( ßÅíÔ(ßq‹Yð)GߘkŸl=ð#åN²ÂÓžY·aèÑpÄÞGX›ìÇ4’÷’𛉯€ì ,d•Ÿ¥VÒO¹á–9n[&õ HkhþD[N”s£EIц@ £L®%2ü9ËÝtltOÒŽ¬ú°®i=@Û¶&ìÓT}’«Üþd¤ï©b<è¯tžSbñ“ê4…cÛžœ‡1ô¬Öñ -Zµ²[s7R¾ rõ*š=†Òjèc¡­­7D¡P( …B¡P( …B¡ðpKwò]¶k­*ÆV´ºl*º˜ÄäIö·úUût÷€u†½P:*T’÷퀎RG¢e䥊°ÑÐ[²v<éδ&ž·ÌTní¡$´»ûê…:åûJ;‚°T5³kÙ~VFǾ1ÍVyÑ¥AàšUˆ¢»=Ó · «¶Î`oöXB/ì˜1:¥}ĪñÄtÍFÇ„¨hú0Ñ- ¶(÷Õá >ÛzvBB‰ÌÿÓÙÁ,bw0› …B¡P( …B¡P(~*²ðM§ÙÉÞæd3´‰ä¯FÓ_)äscPÜô¼3Ò~é.0G6ZA‹Oý~)²ìYö¨a¨XZ¹]‘è$q®€ï¢Fà®Èš§¯]¬upzíYŸ4f$~?lÉ‚ ô%Œ‘–]’ ­YŠÑ# ë⫵õ­î!™&úßbð å,àÄ  µohÀ—k$c0º½xpëëaƒu‹Ð43±R?D>|Fæ)ÔèÄÖbÉxæÙQ( …B¡P( …B¡ð•(¦þŸô¹T·¿øw·ÃÀ äS›ÁNF“C1ž=TXZ× J’¾m[`P¡S΢ç¹}ëNC‚ÅHèl‡U‰Qߢ:¦öÝeãÁ÷Véìr]Ü`É,µ\gÈþöŒ¹'äöM ¦$+MÈFDuÄŽ¬¨ %U?RNÂ.DÝ'ðYùb“ëu@Bdâü£Ê¹;˜(N,†ÐŽÊ8º«0ÑNÚbŽß*î'Ë~jØ d¹Z’)Áßiõ”Lp¢P( …B¡P( …B¡ð=Q‘’ß0"çxëT ¥œ9QៜUé™@'³SåÝó }ð*Dá迌9Rø0•;îF Ó§`&mÜÐÁi¿I×´qÍk$t«Š€j†ÎýO'…aÞmƒî4÷¡¨ Ó¢;úBb­Ã1\~î‘K$ÖÁƒ!sd7)«ÒÁo®µæW‡ã¹»D›™„õgwoŒEMZJwÎ1RWç’úÍý2qô m3¿4ô¼4P¡P( …B¡P( …Š1?êŸÂ·Ææ b³ò•â¿§2Só퇑Ü9™õšÄ÷°†À:~àÏoΑMîXt-#Oµ«ÓÝtΰý£“Óáý \ÏtŽX â[À,—?$së”ùî”`yèQ‡/Õ@rcÄ“ÿÿìëvê:„»8¼ÿ5?°¤¾É„\vRßšu&›[7Òݪ’Gtƒ™6Ì3 ¹· ºX×åÔÈu ôÏZ£ÅØ’vlç„ò¹ @ß`K1tnŸ”~ñÛm(P9-#¿Î/>÷vn+Ýß=q¿ õB!„B!Ä?â_Œ¬"×ãb¢Å!Œ¾‚—§ÖµSô?ÄU‘eLP#æÓfÖ•x³3ïMo¤»´Y°¨æ¨Á¶ÀõŽ¡[C\Þ—¾#DQCü½« ßÝ­‰lk/˪˜oÁ××Üoý¦ÔÉiH:·Mû±ñ"è½gÙÈÍgÝ¡8i"Ó¨†~ ˆÏžûeá,vm/˜sÌ6®ðáèb{kÜüå.G7÷ÄçzVÍ’éW`^½/ÒlÓg­B!„B!ÄA ïÆ—ìM¹®Vø€åbyœ^µy‘+vŒ¢fS¶*¢Î%:ö"Ðv{˜ÄdÐYòÎzÿhHÊüG³‰ã¿óÊË>æ\Ž-^Êf8›+ñ@xÆ[·nÃ)Èî¼yÍí„à±9YtgÂ2è4†ÒDÃezß…2½u;‚Ïú ¤æ‘~ŸÄøù2û¾ï»í³Ë‹o¹ ÙGÑÜŠ\íYÉŒ4Q; í©£ŸD¾ü¸• ÜN”g’yB!„B!„Š_£ÄvñíKëºf½ùj**Xò¾J™éÂÙÈáf:‘–PzÎp/ÂÙ,@ibÂW–µ; iÙééûíÇ›?+ó1p'at"û["Ô+Ö_Ò †áœ^ÒðŒÃ„øæ¾ þ€YëïgÒ~‘Ù÷#Rõ£°Qmª M2é| ɼt“¦ÐÖÉ€žyË!º.c?›ÁV1ÅœV™Ó]ÛÀçúîG˜ñ$´÷Gÿ•3B!„B!Äo"€ ñ)kì[Þ{À¹ÀBÅ7ŠîÊûîx?UD­ö©s²Ulµ¯J[¡m Çèk8ΰ—±”>ôKîŸEœ½*­#™Dÿùx.ë$™ûÜÀÙ$vÂD©¾ ££7Ns𲡖ÙÀ».·Aö7gRŒËyE)4æ –›•ìÓ63—óî[Èû9oBpQ£˜R&eÇ͹Œ“ßÂEð[¼èÁ!„B!„BˆWñ"Í^!„h€]sÄ¿†žË{Ö³©þŠgaPÌzö)×Ãí£ö Â;+©CyDÿ§ŸÕlTV\ŸÉ`÷ÚÈà <–i¹¾›nßÀ¶Ý¥=ÞL¸Ñ²’Nðr.:05ø?sU-ÿˆÂ£¯yg™ˆ%ëä›jÙ ÙÈ“KF‰\#_Õóá~à«> ;»ãþW|癟ý4GÌvDE Œ™ÂÓýÅ~E5Ë ¾jè{†B!„Bñ-<¬+|ÇÙ„¿‘÷Åð®«Ä¸¼;©Ä ޳‹q{¥ûlëå_¦¾Mz:hþ¬%ŸñØ<Ó8jÌ£}¯Óüg‘Ñ·#äêՈƓÖôÛ¦ƒkB|¿s¬M¢;>°Cü´¨Þõ|ýŸ©…·(¯”×Γÿdÿ u‚¿: UÏ%wk\‡ÇöŽ·~ÆÅM'Ï UN>á 7Ûƒ›ÐÍò4…ö:Q÷SÜ¥®n8ÓüÁêg •?9„B!„BñBÎ¥‰Ÿ‡ûÓ !þeÞý`¸&Ë_!u샹IìÞÎäâs“J 7V´+ŽÞæ4½6 ¨ûQa“!¸ÿ]w|°žEs'd†îÊÌ „È}­}8mçõZÅyލ=jëŽzœ‹,Ú½åÍÜ(­ /¢ís(˜åîÝÞ– ,˜VÈw6¥ˆü©ŒÒ¾¾žÔÿ[-¦§>R‡4½åµ—虯o˜·#vÅsuÿú* „B!„Bü(^ò§údµ5Þ-ñ›¹Ú¬w.ÒòÞà´ÖŒ÷â0›ë.¬ŠÍ£Í;¾žx´.½ÄÂy>ñM;˜CÌp:þˆ²<¾X<“ho´èŽÜa‹!ÁÛvƒ9'€5Þ¨ðÛ#¿ü4,ðÚýî<2chýf‡‡Ÿdý¬6ñr¶I)äÅÏyÜ“±­ýrêÎs·ä:Õ#<ñ^!„B!„BüÉB·µ™Ý%€–‹i ‹W_±>C™Ü ¡L“"„Îôz¥SGéC¥^¦Ÿ‡ýìz{ZoqQ¯)T{ÂUÐôîÆ(G³ µNÙ™š$Xc2“%úË^m¿S<½d¼–­‚U©ždàlÑ#q{D\Efv‹ÛGª1ïœÒM"/q¿G$¤²¸Y™õ¥:íxv䞺„mgvž‹n¬¼‘v eXˆ÷5H!„B!„BñÓyw„ïj!Ô(Þïåõ'ÜÈ¡ø`z nZ1;MT¤`{:í< ‚‹œ÷ï>¾çf’¶Ï3#å77äèꨚŸ’ôÒ.Öù'aŸÄ*:/%ÿ؈íÃ'º gÔeª§X“ˆÜÍØù—+ñ3FØ7’ñ,h·g 4xLb.óÇ›—/7˯»²\ÉMõýÇo¦ý»«y-»>Øhjš¿aö¹Ù매€B!„B!„ÿü``E`c÷®“,vÛâý£m›P‚Ó#Üéãì>Æ=kù} ï6mK5ìG`”œÛ®Ù¾Õûòj”÷ {¯4{áß'~·m™y­\Ïaý1UV¨ëXxW?iњث!‘YD~ÙE¸ŒHÝ&®Ý[#l÷*Ä_ཷ¢b>ÉñNŠªN?~³ŽAž9$"QX ܯ’â9a»ÛS!„B!„BØUô ñ›¸âR½‹0"j—çÊ}4ï‚Ó¯çß cW1;,ÕaOUëŒpë=yoÜÌÀ‰êÐÅ|Á¡&m[i¿!¼}œän8LÚ%U£ïôã]ËRY÷ÚÄ`Núß_nØ!ø$ ÷5ì½Ámôé­!o:s`KνկxŽ¿­ºu‹oÉÙ䆸¶Õ uŸlx8ALË#.Qžˆuž|Ö¿9´Î 6’<¶­<ôì=n±þcRôB!„B!„âߤ ?¨ð=L€ÔøRÞg#Ms€M;\¼ü^?¾bÁ¾›A”ß—Ê#Fñ«ïï‘ÜÀOÚ)3ñPÂÐA‡ÙÒ`¶Ü7G+™w Sç¿'?–ŠNÝiqø»–xA!"Zö à”Ë÷FÁèW.)ÿdp @eƒ÷bðjfS®~ –¯ƒy=¨bÃ;­ˆ~uWQî½òžüÁ§(mn"f•­¶µÛÌ_Ó6!„B!„Bñ;ÐV†_0ƒ¯åN¼Ñ 3qÍ’/)z{ N䤜²ö.Ù°¤ü­¼³a4ƒ§èŒ´rF¥Ù4Œ»!Ÿº+£j¾•Þé÷ áì”d×÷î,Ý|8:¡ÌÝ,[Ô8:‚ïNˆ)_=¾knP ›…Á¢\TGiJ ­Ý¾xÛݰRAqÍa“7{†‡éƒga9ÉL&µàéå°o§,…B!„B!ćÁ^ëD|ý\|„k[]< ±Ó‹Ø]2¤¾¯-ãø|rŒªs/×ó}vj¼–™s°“îžƓ’Ûw8`†Î}ðÝœIljLL°H¥x=£{°%QFsãX¼(ÄDËfÖ©(q77EZ‡éßÈÇ“±eXáÅñ‘}ž³a»dÆsý>àrR­EqÓ,XzØN=”…B!„B!ÄÇÑf‚ßÁ±ÀÇp½˜þn¦Q¥êÇÁÙyÕ©¾øò“Úy¿ÂžÔ±‰-(o(èË.˜¹°}ìD~ìx`b>/~Çébl}¸ËM±#œŽüª ßìªHfy“Ñ.×Á¾d'ƒŠ e¿æMiZ>,skÇÚ9ckQaŽ’—JŽíSê¹”%O—å«yü. ö:þU‘É:}*!„B!„Bñ$¯Ñ~øÕhÀ¿ÎÕ|­½Ųèü¤ÛƒÁ6àx#7 ¢ú¯eÿuì88ËãØ~¹¥.`s+[â_Ñÿ&FJ;D¥ dŸ¢ùÅ÷ö©çÇá'ºlB}^ ÖíGè.ÜTáä­ôÏn(œÌ |ìž}' æ¸<6¢‘ZZ6Î.jŸŒV“iŒ×ô.ÐÇ»FÉ?ø–Eï)ÆÞIú©êwáàñÊB!„B!„o@¡ñë¹ÚI™9]MwýG¬_áWGNJ&)Æz¦ÓâÛPÓÅ~ €G§DÈ_`4l…µ™ÏÛÉ8pÞÅQ¼èPJAÑ™Àï6` îó¹Rc›bÌèNCWõ¾;’a6­nðzJmmþÜ€ãŠ3¸Ï"†³¶>`ŒLM¼)æÝÕËÏ YY_Éä~Y¶1åcpö>!„B!„BˆŽBB|1WFÛUºóiIê+ÊémW­SB4¹¯ŸX l¢ºœ2ý4Â.10zfëw-Y=b½®^—ÇSÐÚi¥ZÒÉG/ŽcKzÀxj5쎪¹ŒcØ”‡wÊÉìwö+‰í¸Öçè?ÝøÌw1qÂ<³ý8©c?­ß§KœÍzwâíòàqæð¤QYá?ßuf!„B!„Bñ—yUµ«T€þuÆ€Q ½Óú÷¯qDrÉm4O,´P~î·D}|Òí°PrN®JöyßþZ±¡a§íãcÙ;[ØÖ”8y)³ lΈx}|4wf¿î‰}Kó°3J*Ýÿ £ÙÅŒ´ —¶ â¸yS\”Ù7³Ëì)–6Ñ‘Š“Ën¸Bi?æœ[Šíè³ÑËÁN¤¡ò΂7?ÂrXŽf×|®xR=U…B!„B!¾ …bįäj·íb÷ñßyöµùé­pZí÷z·Øq¼/‡O¿šºð÷h9SŠ‚NCfÞ¦*û$>OWyñzZj:â{áÒËŸ–1Eá\ Pt~V×7­ZH³a\º:®­ùÝË,«>h6Ì©œ³Ð¹2pÌ»¿Š¹Îb¤drë7Ù´%ð)Óçenà‰õ~$Ã0VÔ~ü?ýÃÝÏïJH!„B!„Bq¯>›Ì>v*3/œÁk]k[ò¢ñZ.ôŠ.•Ò9™øUnï]Ì}†ûSÐãÌI‰èþF^ÖH™«™oâõ¹Ð?ÉÜ{o€qþ™„˜¾ÄtêF3ú_EðÓÚ”Å/>þ¿ô•æ% &3¦\À ™i•£`L(÷ $«^.Ùì%´‘Õ'y¥ûò€ß¢á†Ýè½mƒY1…~Î zÝH>ðÆ{ìm¾V^éä(Éþ!„B!„B|! Ãh|~+×<.pK¶} •ô«Î}½ñTNgÆÁ¢wD~átÛ‚¿MI"[³D)÷¶r «°Å¹$|Öª·â-~GÂÔÓ_›‡Î]bFÿa]ðzãcf\ª@ÒâO“Y<…û¹1ö¶Æi×…ÅA»Œªü´ë"‹ù³>EÌ\›_RDðÃÕ%¢êÔ?¹]àÓ|eRˆýZB!„B!„Ÿ‰b2â¯Æ•ð!ã`÷ô㌠:1ú)Ⱦãí IDATÄϾø½ö¤Êñû_ùÓ†Úüa5<¥öáx\UþÎ 8ë0ªî„м;.ôTÜѽ£™9Ä!í „CŸQ(¶-ešgÿÛ™>Y’ýÎÚ!w?º§’ÿÞ—ØIBÕ1d ߟ ã´²)ÆnØÝ€¢›”7Tô¸<jA•þB!„B!„BüU¾ ùtõW¶—­¦Þ x¾îÃâ,r:ëÍõ¤›Ë!êÒä2s/à ø~¼»êJclX’¦8FÓ볡‰/µóq¿BžÚ”&‰åÿËâ¸^gúîÆ`=»9dk—!AÚÜ@w0ÏFêå»Ýw0æiÐFU:JmæF‡‡fÕŒ8¸+w3ð¦;‡–…›pž ÀÇîéýB!„B!„BüeÞ,<…^ó±6 “Oàs»¼v±ŠîýÉñ–6ÀýD»mêõ³Ñu“©9uJÙ+ð0ÕÎï£ÒgÀëþo†1€N[[̃û 1¤Sv^µ+š?‡hlP˜â<Óðv©î0ï«@ýÓ<†s3¾LÀI¾(j!®™v<×ìlô p2DóÇÍ„†,OVú‚­ ¹þ‹WÜØO­Re„B!„B!NQE|#·ÿ}ø–k•#Ÿ¿^¢=Ɔw¯_l‰½ŠðtîG,'.©àÊI¤p±c&U"w­Zå?uí! U§“Õ°–aÓ§êjÛ_Æ»Ÿc8ÞŠÌŽû™µü~'A³:ö]XãÉàÊ‹æÌ†G2ÆŽ–§HZ°iÈ|‰¥™iYÖâ.©Ão}Гv# æÑÞ®·‡¿zxûð]gB!„B!„B|2­ƒé˹ÎsÓLj§n»“¯™Ú;—û;îùX˜ÏÛæ:›šg>WÜÄÚg@üÞ’›åÞY_¥”ÃçôÆÔ(ëw-_®,gRûþTþ Kë#bÁ€!ÅylѸëóе’èö+<×O?ê³týbF³›Ùm& âà$¨6ñðŒô}ÚÎQsELkãé(>>¥Äÿñýüø×xîI`ï}0(ú/„B!„BQ¼Düµ÷¾å‡o¹îÞÆxYZB[jÍP³í}eS¥º¯Ý> Œæzÿº €Ka†³*ªÊDC]oQKv_|–fùºuwÜ4€SòqÑy_DפYeÒ¯h”펙%}RN›^² ”éú`4ÌÛòÃS›JSÒ©ü´ÚFôßÞ"òól€/û4 œëïk?sô1%„B!„Bñ.¤ÿ#~ýÚ»îâ ~7Àvò>v¾Ó+ñ»ˆ³SºŸºóÓiv½bM –¥ÜÌ.®F~î1À0¸ Šÿ šåLËâ.ëÖ}C¿×YÝY£8bí|ÎóM?Þ‘±ðf°«ï^‡eA´ÖÀ,êL 3‚‡:8ÚÀxE8óä¹×áHNÀê $ð,ì^·JX£Q4º‰þ€9Lx{Ý|õnÜÞ{S®ô¡"„B!„B!„È|RØ0ìH‘ñ ‡¼ûT¤™oôr@«Ñ©ž½t¥‰©Qø™0@”—¹`Ĕن¯ µm·ÌHñ­f®|~×,ÞÇÚÞ¸dô»`½™ÛEáÝJF„®HC=:g·°Œ 8ÞËÐ_vüóä–âÖŽ¬HÄpPj@õs®mkV?ÅìïGr¥š~è='„B!„B!~ ÿˆoá+·ž\-Éàœß S‘fÈͧ -]TxÖËçÀn”:LkÖ;Ÿ“Iá0*h‹ÇѨ+ßÕbÓWÊcuù0@ö{Pdèý8øÁ5Òûâò©’p:kßõæš«˜¦»0D+fÛû-“›Àþ)xïòÅ‹,1Lâ1P\ÂG“gtAhÈŠU²Ï…`§RdYÝÈâUÚ7¡ù‡B!„B!„BüB®ˆ>®A¿‚#ú¯éöŽ»ŒR6î–‹É­³võ¡dWUžÂµGÉÿ ©Ïw³ó î.X=c›ÎÂ¥üÁ\)„™2áv[¼ÖÊŒ¦._eš?á0lÓD¡ÄúQ:27 ö–­¹ñØAÆ©dÑ¿aCð=.&óß~aB¶Ã·aeN%wBêeßžú^TyŸfYäA–œB!„B!„â3øÊÀãÕ|Ev”ÑïËöGÀ«ù€ê®Ò<ãƒ>O‚Y2é÷OÀxQæYüŽÐ€ÃØJ¬½ÁAŠé³o{ÀYÁk”ã™åØŒÑ:iîǬúw&Ìi«D(„ïö@Ôæaæ |ù¼·:ÀvU"O‚]Mng%>}æ.©ãrS¼ãº>v…$±ûµ hÚìNÒš ïŽô¿]æffvqâ6‰n’u¯ÚÏõ3\_Ø dœêä4º2#qrlV°í;ï‘tÖ÷&1ý’-.Á¥û@çÙK§Úä¼s àÐšÜ m?³X½£aoÚˆÐæTJª#‰MyK ³>ÇÃGËî>žèÖž>™„B!„B!^‚b,B|ñ]p5Æë¹ú»Ç]†ÿ{ªOc€u¿Ÿ`¾Ì1ýãÀ¶L½ˆº0ÊÎLeÿvß„ÀYþ³NÑÿPÎ?ÓÌæ`ˆìºFNÈêD%µ¢ä…Ð.øW‡ëA°;j룜eüçŽ Ö5ƒæ´UðÇo/ØæÃEêw ?|f²¤ºË !„B!„B!Ä[a‰©~vÔñ:ýc—~?ÁhºþyÝw|‰½QÀÞÖöÌf¶t…äëd½~]ÄP»ù\HçTL—~h„æ¹ܹâyk»üA¸¦¯”ïÌ ‚ºŽƒŒ‘À›TìÝùß`†8[³±ðm>à±e¤_$(gjKþã™ÍI y£…¾ÙKZõ¿à6ðq”BB!„B!„â/ó‘áû²W_ÐÍ]ütC'’ÓUao›6›ÈužpáF¥X|FØ}p|1ð³kîý÷Ó·–+C@g-ÌîBöô^¾%í­B›c,¾Æ©ÃIØ«…í0¸M5XO7˜>C€G©¥3ÄŽ{g[it ¸¤ÇxÒ;2ø„ ›]3¦5^‚\FÖiõž¯«ôÛmöK'!„B!„âßDÛú…?|ÚÁ“ë|sã㚪åÇqˆ[+j0þøP}ï«×}ý>º÷vuß–ZÕÅÑÑ5£>úo°ÿ.!d¢ƒ4ýV`}o ÷–£ÉˆÞ¼–5ëó®ƒY5ï™™™GSÍ:È—›‰“ð[æ.ì,“ç$2î·`y/˜ ‚W36OD—HK ª )-¢—eEð}7³B!„B!„B|œ+½¥­+*ß©ÛßýrWI8öÒ=ñ\Gez ¬3êa +ë`]|9낹—›×"‚~ŽS칃,>ö D}Žšvº¶-€1S^†|ÔW7nÙ9¶Ù6õìHAqfá:H7¶H.åº90mxkÆ£Ñ.¼Ë1sgçuov¤Ch{óäîõ°É3óPO!„B!„B!ćù®ÝHW_fî ºÛ4€%óM3ƒÙÍV°~–Ƈ‹ŽÊw±m¶&ÀIÕ—†rdVd™¥ ¡t}ɋݳqfêÃí 9bânw†N}rîÍç)’8æý³>>O»8¸_³š<Šãˆîr¾9aWÆlmBZë˃]gî+!ì ˆ¶Õ´7¬Å_ZiÞK÷h¿¡B!„B!„øÉ(~õ©à›¦æšÛÁþŒ>b;ã¤LÒü©ÊšñíCž®Ì¾ÇweûtJú¡Ï.XÛs}):W³á Þï§bñìæÄWܼ~ôöÑóéEL¯’o9ôo52ž2'‹b#nã_wD@¶aXÁn„4@@š™]Üyéö:€ÍÚÝyB0β7X».˜OR8±k,êCuîpz}ËãLÏP!„B!„BñcQäêóø``ð#ï½Ð¦éü]Ï/6«¹´Kª4·qÀë§“|ÁÌ&±Øí)Ø´ŠSrÇ Ù\Œæï¿âþÈ%ûë7gCô`´êµ£ƒ5oÝ¥¶­WÜ>‰u6®$ ;y"‹æÀ^6§ð ãìOµ×óñ*IÕ¢™nZÇ ±a¶|Ÿ¦µg.·7Û~Íx/_œÝ-xÆ"o¾…ôìB!„B!„x?”Îò¿4Wâ F•¯›‚‡Ç_ÍiÓgÿÕMM7†ÒK½NjGº1àFØ10r‚Ë<·;,ÔÚOÉ Ð'bÀ}¾}xÉ62 J2›R|w1»0†ÎG¨]ÇÎ&„îr©kóˆ%1ä‡ÑEßÛ K*§Hôä\†?óðN=Ÿ›ß²€%XÔ:@0ú4ÌÑŽqLØV‚#g°ºoÃv¢óXžŽÞHy¦@Ò.dzÌSÛ€´æ_…r B!„B!Ä£?ÆÄPÚº_4°ß3Î×yMï˺ a3kÚ4ŠêÌ?ÌÒõË=6¢ ¹NÏ}¾1²àª_õà(êù\:6(9,Ù…éKÇÛCÌ5Ï»é®tùÖFUœ4ª÷rù[¬¬÷)´XÐÎ]18F}¯½ì~ÊT¹ ãlÎ/íÊs$f æì rR§t“Q|éáà e=fÕ ªRÕN®B!„B!„ø )æ¨È‹øÃðž7Þ['\ÃUGU;Ð)Ñ»Øvã©;ýµk\Ÿ– F‘8]­ú®ëXÖ²©Ð{äw;¦#îŸ4ñ{á£WlUì¬1_±ì¨DC6©Žä˜Ð¼ÎÃîcÃa·».ƒÇiâH?ô ˆÍ8/W‰§Zæ‘“ÀFø¿ÍyÎåà€õÏyÝx2ÝîøôÁ‘Ì{Û•î?´ÝI!„B!„âÅ *v( ÄçsÒ(³NŸØTC·âé>̘¾ÿö†¥å2¥c8jº/¾ª}*Ìx9û"y?KÂS ~‚ ˜K!Œ˜ý²((Ï¢¤´“s so»g™½SF_³ë#ò~ß0GÌÜÆ‚䲋sMFÉ äËùšð‰¶yâ+hÃóMƒÂ 0—+r=MKbŠ/]z÷â¼tÎCûŸø×Þ!„B!„Büiεª…øu|û2¿®ZoŒ µ5:<ènÒùÊúEr¾Ê-03»Ü«×§¦ë—óÎTÁý$·¾Ú8ÖF½þi MMrC^"f½%=—ª?×ÈОQ†,( Áí ˆ²Kí¥ç¦‹1ý÷5òÂ>;ÛEÿ›éܨ ¥÷`»ˆ·;º¢ƒ¹î¬s¬”‘æoñ°Bÿ¹ôƒB!„B!„øjŸ˜¯P^Wa¸ÓÇ÷…ïÜ·,èö´eØ#z{K:1Ãw÷®03CöÕÑ× ¿L!¯VÄÍ8î^ª ‘U)üÒŒíþÌôÅûC q°¼ÜÍ4[šH–†:fl¦†°¹ø¾OÕx!XÊÙ=f™Ê â£}¹èä]\B¯Ó —u2ÇÓ+GUÕ©¹PO>uxøìpcœ-™O~næ,I‡ä € Xo.ß~Ô ÊÁ'5|ÝÆ€‘˜cJÆw®™óuh÷.n>0~£ƒÅÁ™WI÷SÖ~ .ßc浓»=Þé ¨éìšgd9CX–*gߪ¥0ÿ¹Â•¾/!„B!„B|)zóð0!þ)NòŸ—*¸Î³ßÅ|àbÆŒ5àéó1n”G‚­¨.Ín´ ë]x9{Ä´K$ eg9£Ž¯P…ã­K[Àu!øôr?žÆÖhýãÔÉÜ_”ñ¿,2Jtóóæ9ïó;Ò%KKÈ'Ö6ê@£äŸN´þŠÜäfÆDÛªH­ÝoG _©{æ×‡ˆB!„B!Äw¢èŒø÷y>¦ÿ©®¾ÄÞ»ør£ª‚YäîÂåÓª7ËËŒÖ'îν)øî¯˜u]\øÛï$H¾ÍÀÁ°‘Ç&cÀ'GÝ«÷¸ð÷›æ‘*Ùç„Ñì•uÅûIp)nJÈAùÂBv„ÜjSÁŠäNçÿûd=¢4“ùV$ŒÂŽ“~œÔ×Ogˆz2 !„B!„B!^ÍwÉ]‰¬‚RŠí…w8è«ö?Æ…gÑ7S¶ÀÕ³Ã)æc£â‚¹« Dÿ-)×WºsÒ5~e;XÇ6û¨4-½}ÂÉD"vÐï·h {#ú´“–ŽßGœHŸž s߀±™À‹>M#ëǾSŒ‹$ìØ@Ù€ÓûàáknCÃÜ6Áºb“á·;o!„B!„B!~;Ï!ý¯^ž'¸†ËìmcoNé…>?•|fÿP®‡ ÒírCÖgmF«FÿuïWŒÇCì_Ÿ—˜5òÉ·`Ñ3œ-ùÜÃbÂâ±1Lñt. &¯×ir #ìfv»4Žƒ±R¾y^ÿPXrþÃ?Fæ€Qrg³I"{ùr©!ѬØ<¦¢˜´)Æ+ÆMÉ3å}éß>sÃSu&!„B!„B!„ø?DÿǼ@-yg’è¡­í1,Þ•$ãǃڻ ‚#–rÏPø±åãQ“Ê1 ªñGàá­ëº\uëà¦ößìær³a+ 2‹åw"3|<‘é·à:3F׈˜$(—C¸?q#€ÛÀ¡˜„Œ¸•úaÔêûìÊÁ5MÃ÷´½+¶Õý4™È !„B!„B!¾‡Ç²1{7×åß•F'éyoØ{”ê[Æio1TÚéwØÐüaŽgNÑž^VþÜ$€#sÀ¬×ïÍ{13³›Û1·;˜±‰>?²œMéŠÐ<ƽÏ[¤A˜é“G+ŧ|¦Á¼Ž“«–™ · îCGÚ…Ë‚nàê¢ ÜûLt ¿ó£ùÙ›˜_®zÞ!„B!„B!>w—ÿF³“âÒŽ÷QoL¿ñ‚'ïYzç^÷^¯,o]Šá#F,ÕO½(Åïæc¿p¯8Ýt‘wNÙ—ö84|Ðoƒ0çЋ”,yzN¦1Jm{öÔežÄ0w’ÖA‰gÂú?O×\Ç’IÀtGØ,Ø p4mü£ÊSÊß°kP|‚›¦8P+ÉÁl\1÷1ìº×åÞ”‘Ó!„B!„B!þ ß<$€,‰¥ÄÂËìðøïdêÆx›YVUýÒÝ{ÔxÑKNg ì,Ÿa9þÆ]zúˆE£V4O~áò›‹#ÆÙéegp¼ÅœâÅÐ9r›B¿šŽù Äeth“ŘþÉø³ ñÓu@>’ŹFÿ§„Ñ6.ßšNXnäô[ž™Ä­éêÖZ+£ÎŒAêÿB!„B!„BˆÏaýççëÿرÀ‰í ´)*®]7Ȧ­Sdßlj[Ÿ Äwgö¾¸ëÅé‚;jáïÕß7©f¹ÒÍÅ‹/f§®c®"ÞÆvW/î ¸À.X!f³WÁ ¯Ï³ù:ƒ0ޝ©óc®Ia<Ùå Ò.!°tÒþ‹VMhº&Ä]ÇÔ¸~yg?#V­‰ý¼óì>ð‹d Å4fØ"žÞKøž[מ»¥…B!„B!„¿ŒwÇñêÞ¹¬s#Èèï¤fh®Ê~ý~ÔŒÓýQ*§k&6:6¾´|î6¿Åçö¸úÍŒÆ{nAºgJâÜÆI.¶轂éÆ#ô?~¸x¿ätÅýÒœW*<|¤t¿/Bè'cb`* !ŒRmn&Þ™¡ Ç€^ûLÆ<)âù–%}~ôãvÏs€ùòƒ¹Kðóo/!„B!„B!ÄŸáIYÿ¯¬X¾æêmíMšûC0g–¢ûȪÏX²ÒE8á2ÑuåÞ°|6 øxñœå÷âì¤h<^Lž¶.z©>·ñ]a7ƒÛµÀáÐWÐsEðÍ–×q;ý ÛЀÕ;X¦º‚w²¬ 4¦¬Muê:ðƒŒ1¶\—hüâ‹ËÆ ¬f`å‡Â꯾Ó3€åLËëdþbúÜà=Ó"|Eÿ…B!„B!„ïïúÕä%õÉ×`?Ë 2“èØQcž ¹õ¦X¶/±¿ÿpQã ìæjÚéíux\ op²0ìÛ†(žC·“`Zì18>]‹}ñÊ|p%Ö Å, al†˜ÑjÆÒuǰHÞ¯¾#ìð¶ u5€«â>¯‡KsÊèÃYt+#(¡ü~ÌæeÎEÜœA†™MÛ8ü¬Á-Å9ÎnÙu½ãþîy÷'„B!„B!„‘'Ëÿ¿˜«Ízöñ_º’|_mnº+”ÎùõC©¡*ºxñ÷©òoóºÌ'<þ‰ g¿,‚Kz÷7ï1à[;âû÷²ý%îoÎè˜y냕¸ùÜ./_3€RæT²§DBñ1žEî¹ohôà$‡Ú-u9¢¸ßìßÓÎ’ˆrO^7éxe,›ð)¨äAg‰<&¬µ7ðºUÀÖÚ@!„B!„B!ÎùÔØýó'I®ðQuæX¿Åâý¸wÒ=K ǽ¡Í Xñk5'ÍŸaXß²?%cйª¾Ï*õ»Í\—QµìãùÁ›l=w*7·¨@ƒ"wgC•ú±PO¸ ÿ`€à:5»‰Ð_ý·ý· Ý0@»1ND2xð¿rY´¾Á1Qä2Q‚÷5O0ÿ‰˜€ñ+ùìB!„B!„Bˆ xÅ»~ˆÔÈõþ” ²ëoRË©xÅ›ã•]/½5nÜaÀÎH6› ̨ýˆ¶‡ÂóØÚR±_öËÈ[ØÑ`p¸´ßRÀØÍªwtˈþÏÝ ¾õ@ŒÀ#{ê†:z¾³ÎÍúe”Nò÷uèüøû|CmÆü“µ%øÓÊinƒÑª›Ïú°Ù®á—du—‚òË u³MúY:?B!„B!„Bˆ×Á—Êú¿p ÂÕbAú ETßÈë§ß6º.±ÑIõ>¨Áxµ}ç.‹]†¶~0¡uªAì,j9~çâ¥|Bÿà:è³þ_>5ŽÌyû.{õž `ÃÃ`ù–8nárlÖAØ €àd°|zKF!uÁÏBíÝÊ ÌÆcíQ@ÒYêô‚²ìS@Z"KgH9°œÜ¬¥4FêHÞ‚€o{!„B!„B!Äk9Ï\-i«$«Õ,·¼˜"Ô>’¯ÍÒù²æ@³WƒA‚gSkžuc¦°¾b#f&|þÅ©ÉO _lÜtáËÒkž€AMèø}ò9@P(²Ô©òõb–Ûa1žnñ„ýž„1œDáx7…"Mt¶ì’·âäfƒFˆªŸ‹¹€Åøm7Äæ¨îVÐF!„B!„B!ijö¿|×Ù>xðµÓh7sÑÿ š‚ö؇ g7ò»7Âùø÷TõÉÊôуAÄ m“›¨:×p?¬Ç1NÈŸˆ‰®^ai½â Ceˆ|LœAî?Ù3Ìm 34?S2>^o>åPfŸö+Xô.žcÈëoÝ#²„³Jö³€Gk6È"Å£–T‘߆Â0ž½müÒol‡…B!„B!„âÇsÝYäzgoú:ŽhC¢^£Ÿ#Úë•d'Î'Uï£ÿ®®?˜×ÍŒš3±¾©%¿ÿ‹AÚ®nÂ,¢ç8jž ÕP23³‹-ý4FsàtuæMuÙÙ9òp¥ý„  ³Ì‚9~—r8Bä¨cÓäÀÆ'à(” IDATq4<–â{ùq+*ü‰üQè…³;®9‰¶]ö¤5Î:÷NøñS!„B!„B!~ ÏÛÿ>Œ¾©ù™½—ª£òTCž»>¢TË”ÄYB0íÿö£ƒ$Ãe*ëKãÓÛ³Ëñ?"º¤&—<ìm­ìB0n뿾´¦(c^–Ñõg¬8ãûó@†{0Ëþ„â÷z(Ìg%ž®Æ^ä_øƒ¹Y¡Þ ;☳Û(”Û‚®Åïº-Ÿ9¯z@Ñ!„B!„B!~<ýç[³W/kÀ}™vPÈ™ÑXD5vß.tB:ldaŽŸa„ñbv1Üô%XÌTÅï"ãŒfÂ!œBðå¢ü®‘H¦Çñ½MÐyXûú󀫹‡ño)®¯ñt¸¬Ævâ‘§}vl¢ü˜²?c$¹97 ˜§é.5Bæ–—&‡¢{Ò%‡lM¨¹ÕµÆŠÅ Ž›2ðÍ7 ßu›QŠ@B!„B!„BümøÞòÿ/+¾6eÎÜD6OMQ‘¤çãþEdŸûQYÁbçÖ{±õ³7 ¶&¦Ò±1o’Y-‡ÙÎA•sõøç²WmUæi:;­’¾ ›±òÞÓfyš€Áä`5£NVÜ[*†S2ÈC×9š‚¶_ÎìÝIÈÜ—~MÒ­ºÚ¼çnËô‹gn?<{5!„B!„B!„x ßf|æàk v³½š¦„1ŽÀqüqµÿéW!Pžé<ŠéBíàÊ7ÌßW)A|3»\Bj F#ƒ]-]vuú©ôžIb¨äHÚ9AôúFß}ZȯxÛ )½·M¸¾1UömèâîiïZ…§,­,µ8ጠ}²¦é]n'žkQõ/Þ¼‹O\}w†ÝÊB!„B!„Bˆ?áÈ—s5뫬Ÿi}™?‚¼O{ÚP–ÞÂ!íüÑò»ôÃRÛG(ÍnâÅ´[Ô¨9ÄñqœÊlù'Çã´W 5óÞ ÂnÃÂw»¤M¶D«¿á݆‰Õå1d s;b¼I2É9®a™§˜ûˆU±Œb< Y!Ì (‰Šµ_M~ˆ­’šögà¤kìta½õÁ €B!„B!„ÿ8xÝ‘Ÿ/¼z5›ûoØË6„Z:0~ˆy,ÃoêÊ«Èy:*ÑOØŸ®~ܸ­œ– ý5'€ßˆíìçã8)>2/7r >’îkø³±³Ϊ>.ÖÏ8\ðoO3•j꣓0Zµ"7Í«_nKÄÃ4@µ0ÃÉ®yÑŒ>æÏ‘žAlºeF7€.ÛÁ“;p·qï÷ï¥Ë¸!„B!„B!Äp9÷n¥ ¾¢Û%#ìNM…ãáht×ñÞU´„Â%ÝWéBäµø}ý4Jìg :%9p7!v¡a÷¾õ­` —цÙwÌ=”üõŽ»pÞ n¦‡pJ0æÃ#Ó[þÆ>iÑF§mor-žé’Jdv`F9³••ÓÎX¸Šu'Ù‘²Á"8»ŽÏÙÆÒ;¤yV†}›OÌ*ž„'ƒ#„B!„B!„ø7y2XÈwHˆ¿ŽkßY’_Ì`±iñÒ{)Ò7^¡~Va‡€Xù>@‚"÷o´ì¿yW$~2”AÏçfˆ¶Ïòö<*³ ¾†ÆÝ©š©Mq|×Zt6öRþq»@³{ë‚Cv;`¬¸÷ºIej“›Bq áöp𙕻sl®9Ežhçöü`ûˆ…$°‡Ão¸EÏ<¿›µ'@!„B!„BˆŠ—+ö|RŒðºÚkCYlWkôœÅ!ÖN‚«6³(AÛmwFêÂå÷rõËÆÆàDqeŠæßs`v¡ýovœgž±S£É˜.uæöuô¡&¾³£ä'BÚ€kfž€æÌ{6Ι/Ãf§†—2:|zE£9kãzIJ2F{òê PÜ Â1¿Å;˜mý¥ë*â[–Ç ŸuýîÓB!„B!„Bñ™¼°üÿóÞn‡@¬.õøìO[‘ýÝ0¬P5² =’ÇlíªO-8Û€Á>-¯®nºë´\Â<·ØàÝOyŸUqϲ¼á4¼fDf:™œ»8ÛÚÊ ðt•Ì,ׂ ý» ¼%o:'‚Oïýø™‡˜íɽ+=u«òRÛåÏãºyAnî¼qC mcà[ÏÀM_ÞñüB!„B!„B|9¯-èýÔòàë K/kY.£Zí-R7±•Îï—³:Û7ÃÊuཥí8´\ÞS5÷Q‰Ï¸ a è»s X› m›Û[°Ùõ0|z]€ Dw%x{žNo´8vÔŒCwp8‡a¦ƒÏÞã—¥‹Œ2Jó(î—à]”‰Y×Èü¼ Ι/AiÆxšß`Á@i„Ê@Õ‰{ÏgArªï:§™<„B!„B!„ø'y_ùÿ[ý/I \}¬—Bá'æ¥3à 'è?¾ó=ˆýV`:$F¼¾V£·½­CŒcïËÉWD»ŒáTœ0kª 4éÞæËx}ºæÞ£á^è?t›Ò{§«_Øîz1ýÈCkˆ÷¸ÚüÙ£f±lþY‹úÁ—¯•9õ¿r±y¶Ç$M{]Ÿ€Y;*œRÓN$Š»ƒ½!ð“w*^¥oÝ ø–džB!„B!„âûxyùÿ§r5‹J8¥G”ß•ÉÛ 4w!ò>†59¸$Á4戤ç`.²ZN8UòfÅ¥3áewΆãözY†+xË_FÕ 8ƒ_ï‘@ëú…q6X[¬XÑ?ÿòLivë2nb8¦¬,·ìå{¾Àã°“ÍɃ7ýâºnÒ» »ã¼7âíÚo¸£ðU5ú ý !„B!„Bˆ¯aðR„ê#Š'õÉÃ^>'×:û˨–®j>v§.ü2€eлߵxúî2¼¤`Ð ½:3€ãøv';¢Ýn9ÂFGÑêïY¤äC[ÕiXqs¶£$T¶Uû3í1'…Ç|X(¨ãè\þÎI¸Yµ\›-PŒ*ÇïvJ—6@– – ULªÞRî*ë5<ºá^aÍa§>B!„B!„B||ïa fmÆ ï§ïÎkn…#TÙ£Â3ñ·)Ag¸ ó åӉÌԂO Ô ¡…¶Bü³ô>_íPÔÁP²b¢›BçKµ& îwÒNÆPSχ“¿cjàÀí9Xãº_—ì»`¶ßf»o6àµõ½ýÃx| ÎÑ}‚0ºC[é%N¹wõ™–€Û´ÖŒŸ ±N¼eE“$À'Þr¼¿B!„B!„øFRp ïz;ßûö?6Òxû¯Þt̹W앳VG„îŸLÂ8'æNX^Ç,WO‹‰ëm¾XžÄtïä}Xº?¦ûÁÇÓg¯c?]èœ]•9|³Û¡€ÛØšàŒCåfçìïU€|³O“Ÿ<¼u÷g¬¥ýéi7›ÓY:Èùîã¨ô÷¸QÃo)È8’PO¼P[Œ{°[Ÿð˜}ê Ê!„B!„BˆB !Îw„º>øö_ >áÈOåbX±odo:m]vVX笒;!;-‹9€|ŒOÌ×ÐÄÐg!ùnµs³€ç{é|eïÿ½p¬ÃyF3Ä|OŸÜ ·ã-(iŽmÄŠVc3Vu”šÆG×7Å™n]ãe¬ôOX]á|ÊYÔ)‚/À/ÿÃÈ xµÂxYNÎ+Ï1%búÑ IáégW\:_w/¶Þ a‚ž§B!„B!„âƒ(Äôû™€íKŠžäZ‰øX)ï4q¢˜OŽÇÓí8ôpî²ûxÚ-&8ÞeÑN ½=Éõð‰ù¡ó¾¿vAg˜eÚ%­ce@"¹›,bËÚÛböÚì`€Œ¬þ_OÕÖû{©¥í² c0766ɘš7Ê!ïäíT¤è&¢¸,"–bÕvÅ<1õŸóT| ‚Å5@ÔsY!„BñÅÈ£L!„ød^h ðÁÏíìЈ엦$¯`ƪ¯¨¾Í—ØY0Œ'“X0ÀIÕ3šÉ¦¢øóÑñ¡ðTü>‹Í}•ü˜žÉ†‘ŸœšBˆ=—þGߞƼÖKÛÇëúq£Eþ*ÐÄ"wÃÄ-®<˜l¼‘ÖaèTJET/ß_~“ÖÿIÜgݾ|XCóÑq¼éY§ù-Ï!„B!„øÊ˜„B!þýÏíkû*«œýˆ€ßlä \à;ÄdãϳvÛ§|Ì6Ù „ ûøáR6Ëæ…•Æ@?rasÃæTtÚô½ï©¶¾·ÀõY”Ú?Î yÂÇâ÷™´8©ˆC(›gƒYOÿø|±®%seýKT?ï-ˆåóLšNé¤eBÓø¿i-½›ÖF[_»…B!„ß6!„_þ1ËW”ÿ?¼ ziþÍ)}ˆ…êCEÇ«ÔÍgÛ`n=¸npQ^>TY)c4¯…Næè8xÓ—žž˜ŒàF!‚sð5ò»0:Ùt<4ƒ«GäÚ'ÎY² hól¶ $¥Z\χ 3ýˆÐæù;-¤n²hI¹‘œ+$-¼º¨j6¥ñ¯F—ôzÝ-MëGR_µ…B!„ßþ$B!^ÇO‹ö]³V ³¼J~™ôCÓ¦ŠÉ8uþàÝšóê©Â?· ”Zipm>ðßR‚JOk÷A:ÖçØÙ¯·§·$}|߯K`mbÈ-Ñtº =\ù¼µÇÇŸW«Z˜W!£÷¬kÛºx¹ £ûvqmfwÎé.®ÎiЦ_ÂÉ÷Qø·ÛV[ÿySeÚ++ýgäØil) „B!„PèB!„ø÷ÁsŸ¨¯2 xxÀÅDn ÒS-8`}®­vÿóÁý\GŽîåZÜÐjµó‰¾¦“ñtbÒ[ÌNcÄÉ'a¤²}BkêëÇœ+ú¿Ú@ç|‹¾§áÄŒÒI©I …óÏ.µ2 m À°é¡ (µCFÛÙ.£ÛÁ0CçJí—Ê“gX›õ57}^åo¼ã…B!„â+CÔX!„¯‡/=ìœë¡Õƒ7\3Ièìš⼈’ì#4No0~ÍX§_«æsqýL]ÀI÷Ä/.ð§¦F9øUžÌŽë7¢x@³Àº2ün 9­}_ÂqÄÉŽC€Ú¤YD•vê’ âH´<âì§Í\›÷%#@º+ŽÝ ½n)öG|…5¯0dš°9f›×:Y²ö:½~†Ñ~ñ,„B!„Ÿ‡j•„BˆW¾*(øäy°SûI§c®…ŸoY‚ì'ý;³Ö*ââBÎ(1YøtÂÆÑןþ$'ÞX?Ãë5‚_5‘Va>›¬÷ 3§csäXÂâ3aÀe\Ò ãô¥§SÇɸL›OVRò`3‰Ä¦ƒh:8s5AË™¡|q<{'e (/ŠlúË'¾ÓâÅ1zê ´B!„â_Gê@B!ćÁžçZÛÓ)fÐvæÚ°xûU`ûûJÿyŠâP°hOŒ} àøjä^žç¦ÇMïæ*NÏ ò.Ò¤–}€þl"yä¼%@[5oóü.,~¿ÄÅÙ3Ô`t5Q˜ùuž1kMlÛÆWe_¤O8#7VÉ“ X¯Ù”þÅéqj!>ÿ^¬B!„Bˆ¿±B!Ä)¯Ê¹_ý)±Ï$¿Vl ÉQŠòQåkœÛðŒ/Ÿ´–>£ø©z¿â#Hý7'¶ƒÎ``f `Y5(75zíΨºVIUêáõÔ«M\{Y”}yÖ¬}-úÛ.m`YV¨ïsåοü1ú!['zŸ6s´÷`èn-áGLmS)üü/¯OÞ”_Ð!„B!„B!Ä÷ñqû߇ç’ë›.?+¸m¯’D]à‹Üë%ø¶npÔ¶·9ó5.>ž¼w1âmŒð½4/A$æÖÖA —‹/ÝÄ}áD³^ÞÝ£©#ßV×}ÙYÛYÀnüËïNd£³ÜHÿo[ÚhmtùvU-¼º*ÿ<°»gúB!„B!„âq2ýäK$®VBóØ4eVÖƒ[íýÐËUíGe=ÃoøážÍzÿ0ˆ»Êt†lÄnÈ“”?ýí¼aYþ5ࡺ3#øäŠÅ#Fÿé‚òtú?¿qi…/ýO;¼Y®¹”FX.Ác1<¾7‚˜|¸¥âÛŸ3F%ÏñÌz­«”nGEXº{u ~¼ÞÁ[]°ýÈ!„B!ÄózàŸ½¢Ü„Bèü|Š®O‰—`‰À ½~ÿAç¹¥Ù±r¼¯‡Æ¾œ~¦B½7ã FgýʉnÚzûM&À«Ö`nY-ô&º½š|;Ç9³A³M£Ì¢ÂþÃÀwÚNÁ,¸ßÌ{weïçì-8r6UŒhí‡àoˆy-ì-l?•¯x¼3Ư[š¾ !„B!Îþ@ûW¯¨¿t„Bè<òõåÿvOì}¹9÷½z=D’]à5ùµ¾µÈz¾%©èlOãÂ÷'áÔËæØ€î $úŸêþµ}+[üñÕ·€Ëu€)¦ïŠñûÀèf„ÞbøWÞbþ¼ö" y‘Ý‹pͰýÔ3®+ÖÞmnˆ¬„÷ï˜ù›7ݱ<»¯T#„B!„B!Ä?ÏÇÕÿùÒö\󕻨¨mÅ[£ú Û&Þ%ì‡nÌ#‡| «ºKÁGŠ@»aãÞ"8©ü#‡H.ª{í>qF2k×ÄÉA§nħ–ÚFìejpj¢[r͆ÍûÓ'+KTÓ-¥~z/=¢¤Ðt¶x›Á\/ätB?°û[6m+9·Ç°nÊÚw¢è¿B!„âÝ!„Bü ðcNrçúdüÑ««³T|σèôý}t{§‹¾ÃÀÚ¸½/%}3c/ÏãƒËu3¥È»5bôAÈÇuÍ…Œ×I¯‹ÜxïW‹Úßìsoߤäc¥Ïiܰ!ͨ"«!Ÿ0l_ðÚ>›Æ°;'Ìy Ï1´‹#-BgeLä¼B]è –}–h·$ÿŒ'nK<:bŸTÀF¾É^ôB!„BüéˆÂÇQB!„øw>$ƒ€¯G__-˜uáýÑH’ø#þë¥oîQû´y‚vhfˆy™èŽ×1÷ßoãë]Ù>G\]#R(¶jþsT¤.¸³…N)49âÀûlDí1,ûtCrôq Ð x­ßO1ñ ÅõŽ?ç¡æf^ƒG±7àºw|ÓEoõPÈëÖ¼þ>{ËëfyØfÐßô}ý-…þ…B!„?ŽÏ l(µ „â—~HòEú?o:ÏýÈk=w¥™‘n¸ø§«‚?ÓÚ)òç_šj„ÿßîç¦úÝ ¥ž1úÎNwÈ_.»àµõƒWmò<@ˆþçn²\®­ý檚÷/¢›Å]Á;­80G“aïÐ;MjŠ‚ûU¶[sŒ9'l,iKpIäA˜íkÐ%uzãýŠ\¦s:¸öÁ¼ç{)›5YVÙnð…B!„"ý9ó›¶àÕ'B!þµ×|¶ûˆâÅkØrµ²ô‘ä{”y}ß Ýõ:VÝ«ÀN¼'¢Ø¸öòìÜg,˜·)Š»-]¯P,v›RïÑG7î‚£#pºð÷ƒÉþËÌùì‚ëTôÛJïyþ• £§óœ®>ÊvmCœøøã‹ëŠn ˜otŒ9ù~VúqiÌgrÈ-ÊÆEM¨ý|{Gîþþ¶ã µé 7S!„Bñ7AP}*ÀÏlÌÛþ:zú„ú»H!Ä¿óÉüŽ_}vc®={Ss²?—ì¡‘‚~ë€Í¢fl Üïÿ‡gzj ÀíÎ׎ôëØÓÆU8iÈð»ìÑ—µ÷1^²Ô³Œ÷#{dºa…áɃél~íÈâ‡Ïp3V ãÓÛ t ë;èô„µó@ó-næihMf·<×mŒjÚʦ³ÏXïz%¥‡·+Ën•08RRZ-Ðw]!„B!Ä;þ¾çÓ±‡gŽü¼øÇ·ŸM!„øø¢Ê}¼ú×õo8ýÂÀ&Τu¿Wd}‹ õN=ŸzUOe#Î>ƒéÜ|É©Zð÷†x«Ó{Ù©!Ʀï®H7Ê5ÙsÉÔ0oqlq|SÔ™ÑPaèRþY(ê¬dÃðNHÑp?ø6܈Xw'‡³’žö~Ê Àg&bvdMÏD£ØZ\à"PÔ/qzv©‡êIððFoïB) !„B!ÎþV·'t~G<]AB!~êGñOøô\f«ö}ßn®0·ÉuC nŽÂsO÷Z/³¶“ûÙ=Û?©Ç×uöN ¥+fvµˆ32Ô~RÙx:w®×vÑè¬}éÍu~ðû«×–×nçTÌ!z3Ëá}Ĺ)þÞ™âÆÂv°ouÓ¡RÝÏØÍ$bt4Ëò»4â-Ã{ÎÇí·8r q'|Q¼õ³ÓÌÂL´DÏ_Â¥ Ø(CÎÝ[ñ}6U,Ó_ííÒ PÆ1iþyvŽ-ØTúon—µB°Iªí²|ß#@µ0B!„BüqÞªöó]A|üù !ᡵý“à¯ý̼æ+l UCfþ–1¤ë•|Î¥N¼¬5 ^â¦m1ìд.A›¨¶ûa,’Fþ½p9€œÅíqºïH3 „ò»çkÏ2iÞ€q-‹ù¤ù;KüŒ%‘òL†PþÿðËa3•›GcÞ N-jö…17ðÔ¸UO`œ¯Í=*„B!„0ŠðPè…a†oüãEÉ!„øáœGëð'àkzé¯r­SÄoÐOͬ4O1Ó±…«+GTê¯ß=|ôÆOonPX60bD̹;‹ÚGl­¿¬Gå·:ëZŒ4@/n¬_-î{ÀóßNgâaü0_DDš;#‘9§âöWÝ<úVa¦C2F•û@úßßÈ$ÂÄÕì4U¹ÙÝlÎżøF9>ù.6K4b+€B!„B¼' ð&ûß$~BtDÉ!„ø±ŸG€Í§ß«/yR?¬_ Pá¢ùàrsEüïz \¡ôÉ7 gÄÊôÄÉÈ,ÓàX´Îý˜13vmW`¾AþªÐ[0N7v’JùâŒÕåI©´/ŒC§Ëo)2­‰“ïBž&l×ß3ßàvL}\Ö€©å—ß3 ÁÙOGÆñ†;ä$I¬Ùäé×Ëöi)ò´yØØh !„B!ć¢ïË|e;ùÒ«¿¯ãBñOóõé[ñºÏ«×r]^¯^}5Ö0wù =ª¶}ô›eçJÓÑ ¨Ã¥Näøw&½»qäsùÿ °“^õ[°r ÞÙ¸iÌPÔIݪéoìs*V†š ¶Y2+iÁémXÆ ÷¡sº²pi'dè/À=ó.Õ±^d¿ÊÎæ8½ îGS‡¼¥ãшq3‚xz)š2B!„BˆÞÿì¸ö‡xZ!~|bÙ - ­‡?Éu…¤&ûôÝE럚<{“·m¨K_+-—s¿"aQ®Ç©Ø/m™V+¿{ÞÍ€8S#Ç%°ù°ÍYéróðE{aГ©ƒ±bÙqºö„¯ph<‡ï/Üî>ÀnG3=û'ÐÍWÀcðFÄÅ w©ýäÈé#‹nf뱋'«®Y@cEù ³œãÙ¯ãíý’¿"ê.T}—B!„â_ç Š7Ÿù“ðüö[’úÓIü؇À'Dkþ×ÓFØô¸ûñ3ö\Íůs¸?)–$ž=CèôñçjãfžW¸ûðúÊt_T‚R<£Y®»Rå¾×º‰¬Í5¯ÐEØýIÚïOÓ¥–›0½9Í¢õŦÍjx úÍ cšÝæuc’¦–¢“Ï}e|†¸)Ii ÆÑƒ›âqöefDü® iO*·¯.Ëôر&ÛOÊöÇš¬]ºe•úL>pçŸ% ô4B!„â7Ånð%ײl¿÷·û’dÀ'i™¢câgÀ·/Ý·žVKý¬ìÑøaS÷¹ _øœ¯VBŒ¡®y¿‹1DK·W XøsîÖߔŇ3`ßón«QVèä; öù‰g9]ø8o†ðá]„=Ngû¯y3ÂZÕ¾ï[މ#Š#‚¹íì„•b[[;\$›oùkáê(qy¶;NìlAnwi°œÚzQ¡$„‘æ"O7°ú±[éÿ!„Bñ·øš=Äíåìn_¹-àµãƒ/ ÉÑþÍO[uZÌ?fž?k*¢*ƶæZÑ¥?ÆÕjl:žËò`\UÌ¢4ó0œï4 øÞcÓ(žÀá¶àÒ^Ÿ2÷ð‘e6ÁñF-§†bY¾¢ìÝeýå¼gï:DS IDAT·SžÓ/J¿ZcÈb0à“y[NãLvQÙÿ~6–¾ýã ßè0…wbãÙMñaà—ò4­™Evo†ÛÇàWÝ–ÖÔÁŸ È;èfcPãòÛm»¹Ú=Þøýâc_‹õ¸B!„â¯utLäÿd öï}|Â8¤…Ÿzß ÍóGN­4­ŠÅ5|PnDؓȻ¯Áß6°ÔÔç.a¹ìv³ÿF€®sw‚m ,ëÆ„àïÖIÖqë¿VA8è¡·pÕÔ:¤ö‘šy¶}!"Ëþ€àϦ%ŒvÁuô0åwÆïÍÀnãn…©¡4OöIpox[¬}›ŒeÚáÃú'¶Õ#óQ÷R„Ñ(u.@íw~Ç{´càÉ“*;+„B!„øêÝíuíÃÉ€ŸéjðC‚4Bñ•¼/Aûî´.¿êѪLmäÚŒpk]ëãò–Öß0–p9Ê·of—QñM?÷ì ²ƒÑ+:½šñóJ`Ô÷_º¶¡ù},Çv9¹úÛ¶[<¿?Ÿñ>žî¾‡÷w6ž»,ÂS*bío(îÊk‡‡5Î ˆÿ¥C7n°¼*è&%;R m5…¬YÕ“'1n­8›¬hð‘çöFB!„Bˆ?Äïhÿ6üáÉ€]©¢BBâGñ-7òIctƒüÁO“/{××,u~¦ˆÖ?Ë5=sÒ?0âÈ3`ÝÇ=šSl"•NPfÿ;ùÚ€¥Ð²Â»³Ò<]#jã0Žm}ÇâqÎ]i5ÎFÁœ”ðzú^Ÿ­nP¨zúÕð ™%øñ™ƒpåcdxàf¾.¼TNÕv¢;'»›1MºÓó±TJx,}'¤FÔUâ*î›_bÉ@f7ç'w!˜å|üëNNj—Ti%•êòÞmlEIMñcŸî§rDB!„Bˆ?µùÆèáI2o<¿I×H"ñCø!iÝÿø"Òjï¸ìÆÇ+álu·Vw$Ï#’NÙÿ„ õ C.æQ™ôÑw9ø†ãάl7:lª¹ÉR¢Ä°ÙSgx•÷Û"}4§EiÆ0fÑyZ;$5Óƒq¼Õ¹…ÓÃJ‡,e†ÌÇcÂnNy]ã~Q:;‡Ò\bþ_œÝo™¾qî•§ú |´ny:Ñ8=œñÞñÙ~ô9¦‡»B!„Št¬1~w3|éÙ›š„G}R›?ö×™¯¿wį†ÿà™ÅïXZ×àã«ÄSxÌš<çWÊr%IKGÔþÐü™ÁÜ}Eö’ÎÇpˆ­ŸÝÏ(¶·a`”Aà‘Xß[ÐÈ÷§bÿêF‹Ržl`«›îú Ø|:å݆ÓÉ‹­±ïßRpÿ7ÜÆ‚iÞ‹bmcGgÒ®Ëó¢Æ¿fÑ€ËvÁëòÏw1mÀ £#®ÏyÌ™}o3òq ,¿ÓËø|Ö×Íœ@x!„B!D»¿èÏü¥óñm_Ó‘¯÷+þ<¾L_[¼nÆðóW”Ï'hb J›a,œ^ YÏÇÕÑ'§\óÅø›š{¯ß‡AWS™º@çx\gÙl 9†k—ÀÑÁ” )_g¶ ˜0ûÚºœJJÞ`³d7{UV®‚]ú#en➃>Ͳ+åU7±¼…B!„OEøc¢Øxú/î‡|Ë΀/¾ô÷ë4šñ°ÖSüݧŠÖÿ­oýÔø—ן‘¶¸†h¯‹¥Ò†gyôŽÁí4[T33»™ìfvaîKù0ÓA…fÆ»£GñŠþNiç²£M:½—QŒŸö=ÁŸôôóAUF‰±?ÚjXt‘ I”2š^çpgT౑›Añ°­îÍ@ˆçý©Sp´(4ÅýÑ|ÍkVÛEË{Mf¯ãû&’´,·;R¼Ú?zƒ!¦¯¾æ±«Ð¿B!„âÙ¿X,ýÕúc2öÞdÀ7£ýëûžïÝGþ:U ø!„B!Dø;ç™PRäú×$ìAe䯖埿 ÞûP_r#þómZH/âjN f)–x••jw[îdúÒõ"2S?}°…bf ×ç\}÷=ø uåçŸ2m|´½¦èÿüV„çÅ%G-`ï;mæ¬n￘ê=ôNÈcïÚ2v ·!c%-27^ö1{AØÇö ³UVÿGHüpµ¿†¹ÛGN² ¸˜ÝRJ kÌýÕgmþ}QkÆýÈ×ÿŸÛážn¼xêCË‚õ·?†p¶º…B!„Œ7ùít<~r2ï:¾¯ý' ü½e¹ õþÈìÿå»àóáÏl ^Ñ·:šà÷Ì)>a \Y¤ÏmUm–Z3üÖFÄU ŸHÂ1çz5KE2N¬3ÒÍuΤΞ2/µÜ;« ò.™ X5ooÄ:X½ð‹sXb°x9Üúu’D쾆Yd'—o˜Âøkì±ÀÝMPVüg㲋M|›µ65‚ȲÍÆ»è³äT½Í锋XVÈ”6ò“ÞKZ=º—¶_ÕjÇùE7ðóU¥„B!„á›·fì‡ÕZ~Ð=غ²©o·~wäæK ©Â÷ï<—¸Yö`ê?/ÉÒ=;Ñ„9m4Þ» ”M|;Wóú©Ð{ˆ¹oàèìj£íÒ‹w/yEølØ<,‚&þ4¿E1ªE¸*¹´}ŽßOe!')“>uüî„ CôŸnf~jéÜOîDlæ. òt5:±#ÆÂü°£â%w{¦8Òj9³Ù¯¿ KÛÎn7˜ô9€¸ñ‚γ{ñ·ù¿Wåþ‘(úDy;ˆ…ËÝÿïI8óhr»ácjY'Ùß~ÅdyL#}9Apf÷‘–öš¼öѬç›B!„âÁ_ oÊØÏÛðñæT"ÿ´Þ=?ç´?§ûÔߺ¿ý¡¤ÿî§È·]þ% ¿ßž5ü¼¤Î5˜ëº€~P6g#¾6îCM>iãø0/º5Cž~HciîoCÎ1锬Œ³“?2WÑ?K¿9äkl†ø-(ìÃìÂ!Ý3C 7Û^®}ŠÛÜÛs1û_rAp£3ËÛI§ÚãÅ9`èüø?‹Ô ‡âØõ[D¥¦±ÛÃòϤéKñr'úL}fœÝ&¸º½ä’ò{&¸ßXv^&Ó|7oÇæ펊OzÀò‰Ã´?@!„BE†ž•äþÉÛNšgoOØ¿Hú`S¾gòïBqïïîûa½Â}øKs Ýï<þ꿇Ëg€u¹òžxû3Ü„ Ç¢ù¦ÑŸ)ÊšÔEŒQÞÞKåp½ñ†~,àΓô)žËéˆËè1;+ñÍhvqšû7D)î;\hB-¹“ôA†¦ÙÍÌÌ.QðÇëã[˜Ü*o{»¢üû¯SŽ?ø"°ÿÆÅÍD´V’óõµaà|Ôõ%¦eu`›©´˜ã©ë³¯èGy:ãQöæùG<»ú’g–¢ÿB!„BˆðÈ[3ퟷ?*@Â÷¶ð‡oøìq{ß_•ß묠¨¹÷[¡ø° qÎõ™ÏtŸXJîáí2NÂ>©Zœ§ß'XTƒÂéûmbwyý£þ1üíÏŒø±%bƒ!ÇCP·¿ÿêæêÐÓo/f7,oÛÖ!ÅØ÷ìÛ mû‚wx‘¿ƒØeŠÏDׄ™Ë9ü?1[[罃ö¢:i¶çVóü Ÿr@kŸbû]V„yV£ápû Ï~Ãi6(”Ñ %¶£5ÁÆk¾¸°½5„B!„â„·fü»ÞjÿšÙ‹’&éçúþõ殿`‡øK|VÆŠß±ì¿ø¢2Û÷©¾†Ë8—]¸(V8ÙDyÚ\¢Si)õØ!Xo9‹0¯Ágo5wb{Ðk/bÃèrdÙÌnfÿ éž Çæ³ÛP ²gvMÀ…ªtrPÆö>"ŒÇÖ >œRÐLë…4Þܸ»·Ù}³j‚Ωj]ßï™ d¿„åÀ<·€°Œ€;±W²Gáïà€ræh}l<³µn×··8ž²Ng»>|O§s+ú/„B!„xó_ö–(êKBí_Ó©ÝŠïËØw»ÿ¡%´(|ùtk^Ä€_¹ÈÞYïxÆ>£g­ùÕ\û9Büö ñWAÒÝ¿hÁ'öx=¾´6tßF¦tæQþBEj†S™Ûè[ëUéCìzxó®ø¸·ä5§GO»Ùºâmn)ðoÇð$0÷z‰ÃI'…€«”o¾«Ù2=N=÷ŠûË^Î>eÃÙN¯Ÿg¶á‡l.—À‘o²?\ïµ1;`0`¼.ŸûöU÷…$])¿$ÌYO‡“0¯·p9Æ­ çö5ÑñâS[*üB!„âÅ~ž²<ÿGÅó±ž]”‡ÿB2À>ÐÈW¥~=s'ø’ëJ,HüŒGõWÞjßÿYó¾è?¾u’~ÒƒâSÛr£ïm~—O¬oE“%\3#­1À=‹è}lwÙS t:„³¥›j±?K}R­IÛVÕ9šàŸê:c·Äô¤=ôm¸jØW¸ÜVX®yp¾iÊ9œ~w·I0gž'‰ß½fp1O¸fa¯È4µ˜îFÇéHžX:#OÍÚÒ.A¿ÕøþÌ´ÉK¡ö=PÒnƒy/ .’t~ŸšJû „B!„âˆÔ0÷[KæþÎûpÿaåûêû\±_°<ðµ—{# ˆ ßRƒÿI–µ_pþ°}üŠr¶ó©]®WžV3Oqê žeÏ¥Ütz/ÝǶÏLÔæq4ˆû6-ô‘ÔQpÏ雋ÚûÝ «1<´€=%,©ŸûÙpú­#øâºsnÃÜáš:O-„+É_ ûɨÀÏKô öjBSÏÜ’k‚w_°RˆÁ¨!„¼Âÿ›®‘)·á­ƒýÒ ËíV&#Ù œ8#ðkoàó3kg€B!„ÿpäå'ð ûvØ«7<|ËŸ3þöù[ ¹â-@¿þÖø“÷þ5}Çàp^½¼úüf¼f{ª:Ÿ8tåÞ,AÿüKp™î΄Ásß¼ž>»bí èbÎ\×¢š ƒ%€ ¹ÿéI{߯黉˜b Æ l¡Ò¹U‚õ«Tñ;žzJpçJnSžÈ+,ùÎí ÝÜ}‰Y9w-¿‡#4œ’Ò OÈØ§–Ó¶µ&5d;ó®H ¨i˜¼f6‹ÎTÀƲág>¯ÚX¿¢ÿB!„BüÉ¥Kð¥õ¾3ÀžÛðÁÖ>©ý£†å§àS×Éɵ”âwß?[ì³›v}jðà›ÉæßáyÊÂFá©ÏvÄJíVèß¼®Ž…„A¨g!ª=]Þ°>QÄ^¼àý8äþkh9¹û“äyæbvsî»|?¬x/sØüŽ/(3-A—`ØÕ­§âú¤’täÆy¥~4_ŠfÃN<{-NÓ‘i€Ô)”mpN +úÏèÜ$ÕR‚I®ˆNVèáCÁB|î¦ýÂ'‹êý…B!„Pæ«öî?6`ûâôϨRÇIøÕ3Må§uád;‚Râw<ÈùÄ¥_¼Ú•ä3³´€qP‚,ÏOÈä0+¦÷ ¸S»˜8£ŠúOß\p¾¬ÞÛê&Ázw‘•Kà6Bg>I4Í %cH Ñš>liþÄýfìȵeÁºƒ—qìæÞrã±óà~ª#€Ÿ&xtG¬\HÜ¥Ño¿ð§uãs/ð¿ÿ·Oή¡Ky¬|C³ýhó ls«“;Gl?Íù‰—\Ü*ñ,³xØþVy°@!„B!þ-~}2Àö‘èïò±üàUø…×úQÿøŒ¿ºaŠˆ¯à¡¤Ï¿b—ýŽ,…âþ‘+Êç׊ÒãALüù š:B¹`œbäv׃±Uñq´ù‰Y£¾LðP¼ñö¿!OPŒ‚m¯w$'\=8«X §Kf”Û³[Ç«ÄÞÅâýŽÌòFý}·Èi­rù¿… —øþês››Ï¢ŸÃ0+3ä6R'DHóÜOA×÷ªÿ3—MÐqÚÜëìt®×æzµîb ¬÷}»úð·mB!„â÷‡r>=±/ñ\ýÈùãK°ŸÜ"ðO4þü¯W~ÂtÞ­ñ×öù0âFÀëü¼!þƒO^Þ?ð³O÷†ë:›\+2,ë—É8¼ÈÅø~ÎcµHÁÓøì®_H×<ë—qfÎ@ó±u舠ŒäÏxòd^Içpi‹G¾Jöïnê^€ÓgÓ{ÓLqƒÛëà·Jxøm >øîÌ„gv‡ç_/z3nƒÅIÞ½)ówKñra »D îJ)ÃýâGRºëB!„⯄B^’ À×6øù?ˆþ!™ “–׎ï^yë9`7íË—Ö¿|ÿaŒÎòûn7ñ]èfùøèi‘?ÇÕØëŸøŠõ‡Šg,ë+«ãc`^÷xÇmÄ‚‹ßïŒ,×§åTûIßfÐ9Ø |—À̤Ä\B\‚á6” 6“ »g2úµŠ!‘On‚ÑXQò•ðˆÕúµ~¢—©Aÿ©Áv®ÖFØEl @6¡óÚM›Aèf|Zû²L\”`Â\® [ë¯ÎÉÇù’í×ër‡¬³é$„B!„ø$^› ø‚ Þ¸ùw“O¶>à}×ýšþþ¨çO‹·úÛðó2Úð#ï{ÍÈûoa àÛ¹ÚÞÂ4”]?,'Ç @[)}&7 n&Ñ»Úî¦Øç'Šüý®åGˆßE‡g„ý‚ÖŸü#¾Ÿâ­Œ]ÃîLèTõ-¼Ë¢Ýñ½Àü6s£¿—Çê‚ [`ºH2anӹ߅àëת•êˆíô[38ãøc¿…Ïìj`Ë\Áh·¾GØ,B75>ßãS æS íÆÊ÷°îo`þ  ãår~À|iO€B!„¿œWeÚ??»Íþ¢7¶3ôyëOúk_Ò»oŒGã§L8Oîâ×Þƒx×&Ä yÉÂS½ÿǸ[Z7¬)¨}¼ÝbóGöøí:žÁè£R›S8Q¹>. lžT(» púE'|BxqU‘û2ó»ýŒÈ;%D"D¸¢õ¼:Ý'œ·#Ææ[š?ÁÍì»™]F‘»O`ÌæáÑÇ(Ÿùä±p ùù`;HõàZu0‚7²‹þ§Ë¤*ál,Çܵ’h·'zY˸€“Ýqxgv´=üÒï Šõ !„Bñ§Á+B«ßR¾ý*™ ûíA¢Or޵·ÿU‰õâ¯õðä½ðIÉÅRÅ—ñA Lí_y×Ã;Eó4UZezö¶èÛŸ­ûF1ñó‹ËÅì6ÄY> î3·ªM¨z‘ïj;¥ü›h57Ú5ÝW"8o[S¶h`à}ƒg þN…†°›Ù+)Ro6ŸØl žRÜœ¢~‚xO‹úSš?¦À5ë0¬¶áá.{asÞÈS6êRºì'Å\Ô£ì–N“óؤDøòÇÜsOQ¼ñ{šB!„âׂWÇM^~Âw\ÎÞ˜ °ÏÙÀ_úˆñï«Æö'ëýÙùŒä6·‰FþuðgûXÀ[ÞòñÇ”ØpÝ hR>SwÙ=4¼Qprú "ø1\>ö®¶+’k+’.Á³•€î –­€KW‰þ1Ë¡®cÉáÀ¶oÜ-b¿7"¼>Ô󹙺:óÞÙ;ŸHÑa¢·´#©-!ØÍ­žv¸°¾¡7ÔÍ…vãHv}Üx0¤a"º¡ÛÌm B^…ÕCB!„B!¾ž@Ä«Oh?2`Ÿ³9@߈ùðE#¶›tûa./Z0Oň&·^˜}Q2@¼ä¦ÀÝAo¼—þ4×êk6¬\ÿÏÞ™-7ŽäP4Q¡ÿÿäF?ˆLbMR²,ËUçÄÄ´-qÉMT@Þ;|¸\w=÷~Ô>1ÔÄOÅÙäòýËë@÷n¥At´K]FÁnb°Åþ’Ò155UàuWš¢öiM±f¹´äÔÖž{ÛÙ9 ÷è¿îwZ?¥úD¨uÇ=S“)…ê$Ù9 ³ÄvsZ1ÍÖËßôš§ÜgÔ81”åñúسæ˜ñÙîÐò3ÊÿàRååÛÆ[ª¶_• ßï /•ºŸÕ’eË >zñ±8þ„1y†o`ü;ù‘ ¸>åb"Ýóã¹ ­ÕÕzj©ŠÍ«9»ŸrÌ‘$íb ugÔØùñŽ#æ~\'»Ôú×»J¾íˆË^ÈRÑ¥ÿgÁáàÿqcÓ¶ãzºw©}W?wZø½²çŽ÷ÛhÙ›Pé/ÇÓ;v×:Hšõו忽Î>„Å÷”„®¹ÛžÜòaýþ IÛ>ìoÁK@Ãñ#^d¦´Ú>òiÿð²°ø+â…˜7Kº±HütsÀxivdvxô/½ß²ºF3G_gY^YþùOôwʰ~8úÁ+ÐzºÂ#Sú»]º¤¸ª'õÑyMÙÉ"<é¹­£kµ'I½ AÑ|oç;Ìæ€lߪ•ÀŽë@87;èåO¥ÍÞcÙí½ØGs‹D›=ÃØ3j[¥.~£ƒ¡am”].AíXäT„}s^ßÇèEÚÉ Š=[ðÝ®±ÓgˆÄĸ8ÌÎl“ÚqÈ׳§eXÚ.­è!ü–§±öƒDNþªzmaõ›%\¾X³ÜÕ˜±t}¼úô¿c¥å¡þâ ùýfÂò+”K³‚î/ú ý,¤è>‰›ˆ?]©ë ž®³› «Q«ú6Gð]â÷úZ—`ç—¦äÎaBPú³Šë£îÛ ¬FkF^£rüsB“Œþáë»7^õ|…=œð¯(o#þ+R\=¿¨«ñ—ÝD!õàµKN´H=þÎ)Wö£²6Ý).vþ|û¤~¬Eçá=%““ s(Tz]Â0_‹F«Ï\ª_û"\¤>ù¶M­?û–Ž<Y^ Å/’åùZØWt™Æ¶Mü¢ùúuÏ ¢ºõaÿ¨Yxyê^Çm˜ºþûVÁÿ’Ö‹¯X?æxV Sî…Q­¦þ¹]„ôkìâ¦?ŸÛ—î0ŸOØr&ðí¶ˆïéúAÙ kPÿÏù ­ÓèC;pœ«.‹àbþêÓ6âç(øôÆZTîÐÎÞÙš?[G‡ édm6ZY uÚAvƒµ…râM¤ä”«ôolÃ"Ô·äæ'wPï_ç=ù€w&Æ‹òã;·|_ßÏÿª|ÅE¾i¾ž^~ÝÖO›¬ßþˆÀ'à§ø¨ÐÿÏC}éCì/á×ÃmÜÅøçZoIM³Rì:bú°6¶»ËtâUq5Ô²\E*íÒÏñÅ¥ôئ Ú»ÔØ«™ÆO=™ #½m%ŽI5I)î":mCØóâ^Íf»”Û lL\vkܹBö¸¹È1R}ä¢î’¼_Dj{†•A®ÏèHÊþÕ)b²,Á9`6x¦š¬ýC¹ÕAB®Âo pÿücúÖi…w|ó qø¾?9š|äe/Þîépð/M <Ú©OkÒõ‚®¹¿k¦~ÅóÁün>0ô/_þŒÿƒC÷vne˜5¨°è¢@~Ô‚þ¶ ^%Üa‚ŸΆŠrõ¢ü¶~\Lé÷õo I/ÿÁ±H?Ô‚93Û¡> ›ε𺴎ìöžâû®),~sÀpfî(mþée̴MŸ› $ퟌ ý²šHmt{_ ’Öê1-A%Éw3¤»¦Aô°É›d<†K´\1{xåмú%›>—n Ê IDATà7±–W_ö É€ñåpðC)WØ¿¼ðÆ÷çÞ;5ò—MAßÊ{BØz­„ÿ×™úÊ?ÝØ[áµëó¬ŠÎÖíôå-³TÜŸ"&D+¾„w4 ÂKõÏ-ZµþêU© ªÓ¬ƒÄ‚÷`“”vdq‹]S¨Ûs'æ².¯°÷%d_´0-øoŒ?» Ól¡NÓÝF•Èí´°ŠFûYê§ÄFÿEšÅ«ÅÂxbuë^ƒïìˆû;†w5iøÌp¿ÊÙCö~¤z’‹ÿ¶ûþǾ^Zò/ Nä€ìoIŒo(—«áˆgþf#¢:¾?0Ø"ðÒÙaô^Â{îW ¿1ôÿ;gûµÜâDÁô{”YÅÙÆ¡íd¿B¸ŽŸFµ^û?èm§7*:šÍv£À kì¢XS_£ #RH¹Ëª÷4Þõ‹œék2(–PóîËêóç+´¤üWASºçÚæ‹ï·ý£ã?_üœ*ŽO}²AB¸\Š(¼µ ÞŽYf×¥z§‹k‡i— B%ÕÏþuq@Zák­}WÙ ÀÏðM+ïO|S_:E¿ðî¿ùçå·æ^;ìOóïMH¹øzTè¡ÿÅ”‘Óê¿eá}Góo÷1r²<6|,‡rK,î6=#Y˪xi TT®>×°êžT?j ‘ú!>ænä†$l2±Z.­Öù">½{K"Êcü#÷?²œû¬…Bõ¬~sÿeÛ¯ ã¿áMÆñ–“³Ÿ[4ää+Ï Cé!t´_ ¡ýmˆßv #­ƒ4Dâ£ùbæ³Ü@ séî~ zÍ—&¦©Ä÷n_Z‡Ñ™ûî;=®>1t¡¯ˆË”0ÊÛûRÆ ÞpÇëèwž%¿mù½Ê¡á%ÿŠÖPo„ ¿ìyøÄósBÿŸ ªS׸åPRç½ÕÒrµØ ^¦_ô¸BVnDÖ+‹M¾¼+ÙÎAzä0Ä×¼ýõpKµè½SâƒÛ¹šÞö¥Ð¸7Ws±øb‘óïâ¡f¿s2Žý :þ˜i‰šB¦¶=‰íæ©/¬ò•’¾M¬ÓÀ]*Ç*ógÉ‘ÝÑÊÀŠ…ýÛ¨z%ýÒÞ@øŽh˜…ëÿ(ñ"B1úŸ–ŽŸ’1±µ˜#™0'íÓ!Åš•ï~î rð±ü}É€¯·ÿ3gçÊ_¡¿T—¦—xkºÏÂçŒÃzð}pïs)¿qµ¼êÓúOjtÜ.¾º-žöólgÍjróÕrG øÓ3°8Sbõ&+h#ÕRèãüŸj¡/¤Þ6Ö•“/L_í„'Öœœ«iiežŽý‡?IÒgì €#±¡nØÕ88ãÊ…À Én0p4Gë7V½¯CëÛ\v_ý“·°mðQú¨IåE®$ÛK!.raËÔ¡R¾kNùîdÀøÈ(^höïš»ÑäÆ/” s$?ôY_VÊ¢>úýj©ß‘mð¯X¯}ªÔêÿ ·¸(­4J^ƺZèb$àcy¸2ëò!es±°ßž[åùCL?<õ‚ÁJÞJì…­‹·ï¶_Þ——“x·^u½¼ž^Tœf‘hòXØå€dÆÇ­4¿ ÕñgñëÜ þ¶_MlÁ/Kél¤ÍŽZå°Ú|“+Ú.û_löØw'äœ{w¦|º¼É¸”*Oåª6H|÷ô?ëë—?b#|½Im<âE—úÁNißùm«ñûæúû¦õWþ_†I; ú+ù«FC½Ó¶ÉëZ(ÿúú¿]ìÖ^·qðPè-I@fñð/|\ƒìþC¬ËîŠâç»9×–r¥ëÀt¦—×Ô$õ/Z1Ÿnk’÷™ÿlb¨r\uWÌÇÌ¥Ôltz'„‘ø¹ÍO3Íϰ ¿'ÔêùÕ ›G‰6¿ýCÃêï[¿„p°Úy7—9Úc»é–Ó}¿‚4i-FlØ}• Ö컺®üš8À°HŒ—nøÌ?¥ÞÖýÎ,Fûw ɵA{h„¿Þ÷‡V¯TŸ&Â_üàȇ˧µüÇ­Ëßù”üÆMÿøÇ‡yȢ܄‰%­'ýò‚Œñ¾mVF&o&è¢ÓG}ºñË•]¡È–xouÚAøEý']›n6Ö¢Q©føv 9®ÅHvü±•ùÛYŸ!‰ñÃ%ºìšÙ‘0²Ûðv5ûEÊ!ϠƽøK“E•êQ®®8kÒEFWýßî]Î#A«‘<:•>½âŸÚš·Hò10*·^I}˜1ñ£Á¥8þÜQ!Ç&Q³/D¾ü×`1ƒrÿyªÕR=Õ^¹Î õ*óè/Ý’¯ÿc  Œ—&ÆY¡7Q$éÿÐ}n®¸È?¹˜åû?¯²øøZ¦D¼ééOvAþÉ»ƒáf'ʼnƛêx+a® 7;¯eÈ^úÇÑÅGU0 ˜¡ÿÐúûk3.Œ?£öj„\$d–êE¦Á§U³Ø_«ÇÁX’û8ú|F¨ÅÉ(Åño’(á(õSi%w4o›G2@ú/ìçkÕËìHóO´, %Ã)üŒPþ¯ñ2vˈúãÚ±K ¥þZgËÖ<þõðײV /Ý0H \¥¯ÌBYùÂ~ö”="Ù_w%­>·-€…ýò…÷Ä5^8Ÿ0§¬¨á6ÔYítf`Ýkõ¨Œþs}Ö³D¾µ¢È:h¥œcS’ú´øË¥±fÂ]“³ðý0;úÈ 75ì*°’wÕWÎú6üËIJ1°Õî3Ðï6™IðôÝwX[u9ƒ0GW›ž¼!ñP ä)ÒòFé¬óÇ–O£95r3ßó¬¼xi»ðW°.'ÿQûòÏUfa1 ã©dÀxÑæ€|MùøalŠúåzOŸÛðæ¨ñç$¾çã,×—Ûßú'“ô©Üާ_ª_–Ý(5ìX)c¦‹m+©íG©+W-¼UÕ´J“æÍdWá,7$}ÜöS‘$/Ë'ì:¢¬­P’\xå@¿TjÍôhýd³Cwˆæ[ׄþ“,U«œ8)¢(4”M²u³-´½«³ž?Àã`\˜V»“@ý.ÑfÕE6ßÿ-€—·éù°Qà+ƒ3÷xÕæ€n…üevЋP‘\>뻇E¾°6¾Î[rxW£ÿòÒýˆø÷y$(‘¯¯r›‚.I3%«´×Ã)­€ƒ¦ÍÅRëY ¯U;ôʳÚ÷z8DZp)«”«é«ÇúnêVf¬U—RͨÚP}ƒJ5ÜÝãTÍuƒ¼ÏH,Úî‰ÓIRóÕ"]*Â_F}“cÖYSý¾Äa?voä…Û ”ž>MäìÜjz6›e»±Ã¼%<ÞÌ;õýÏ¿ñÖ¿q" ¿~“s@ùç¿ü¥#oís¬rÜJ_ñ¡»rùÈOLJ\êúÀÊSg]ï ‘¯/sÿ­dŬ¼Œ~ÁÐå<úïŸûZphà„Ë–îRïeÊéø¶•ÑÿCšßf|Œ¸Ö³‘¤‰”†FFTØÏƒo#àRƦwE iÛ`•”îÍm$[)èCâEIhh%¶Sþ+GcÞt—í»IÝô¹œ‰¼× =y"ÍÔKèKy\÷ˆÓ´îó"QféÝ-2õŸ…úÆšýkž/¸ÈoœˆÐýtlý_ìõ{‚ä©…2ËV5å÷Œüoâf'¯´¿uae9dÜ/šYoÑÕTi¾:Eû0k²¶5ïÚ¾ˆÔ»ì¥dx¥šy˜úZx-¼¤QÔ)? º C!ïQØ„‹gó†ðø^Ä›¥Ôë´ó5’J³=3uQX5¨Ë|H™RFÊ´Cì¾­ì%. ⱄôÁ§OH̸÷Õ¥ò®?\ÆŠù;q‚²?Àÿ¬ kÿ¬†Ï¨vüxcòŸ˜…+›~ª_Ÿ¿þŸ° øû>¿}oÕ¿|ó)ð=Ü.}¢¼5®=>†G¯Bõ ŸùêNÇV©«ÝeT¦^*'лDÈÙ7Ë¢ºì‡ä_fˆYFj¹QCMïªL€^Óv»òe fP/~òCó¹ê§U«&I<Ñ& ŠÜÃrN» é»±Úq2¼'þoC¾°äà}ü;šþOtä¼oÚ%.ÆAÿR¤á›>DòöuòiO ¸À­¨€^<¥/*?•[Ñ£Ä[¯ak26»(‚>ó† Wíר¯U‰ºùZõú¬B=º"‡»Oõ¡Sï勺Ǿ"P’TÅü‡žÒ]l<›Ë¶º@WTØj0¿¤Žõ)©%岑¯=øBjD}"á§ÿu ßøG—üÃCñƒw(¶¸–Á´¹+2¯åŒ†³l>ŒÛéÔäJê"`ÂÞW´k†)µ>⨸Ù ûº.[ß´AL^Å=ݤ jíÖ¾ õTšŠCÝåõÚõó’*á™#òzý_ZÕ÷´÷ØýÖ—–õß4‡-mý· vòýRŒ‚4OE)G/Œ’tÝ[å]zDëµç¸˜€þú´¢º?Y«ÚüzpË+kÝ€)÷”ÿÑ"iC€hýï õ+ü+ÿø Kdk¯™§÷§6ÏáÆMW;$=IÊçÉaÚ|ñÙaUzÊõòMë½ú›ªé1Cy¤¸Næz!l鮽_Qzè,öÚG·ž½ðÌœùïâ§ xÿ7‹Ê×É€+£¢xÄv_ËõQý>k\æçö•5/§KQ µ ¹¼RÅVRçX"¿YÁÞ1ÈâÍÖÔFé;i ^‚ÿ.K5,¹n}o¶Ì(³ƒ9d¹^¿¯Í·°ÑAÒt'YßîÂþ–8Œù‰yÕ5Z뾺`õã\XFË£V E[$ ¬u886Ä€€¿—°_¹ì/øôíѸ˜n‘ϽßHgn¹8^jø8nYPþâ#hJè„ ˆÖ×.N†®‹O×]ç]Œ±pnÊ òºiüy„`zeÙzì6˜’Tâ=ü'YŠóèé$kæíÂSâÙдé¬UÐ×j$‰\zú‰$ÛÝœŒ1+!ø1ßeUŸ¯¤K펱;š‰Ž j2µ{°®žíë9ú¾MxhµÀGÿˆþË’¯º£>xqé¯p*GÓ8&þúCú}”GNü&×è.Ø‘nlåò)òÒù}zâ^µ*® _ë·®´~"^/âv;'Z©Ëçž·GºKRmµÖuÿ:œÜÊHµá:]|Q¹xÕ—îIuþøª$ïïµùº‡xuoaaHëuobâd´ƒŠÂ¥zð^|TjU~¾‰Î‡-!¿RÔÀGëãºAɨ@uhÒþ±µØÚÐÌWHJÉ™¿˜é;ô̲ÖÑìYY¹-,3Ò’3OÒä ‡^h0þá¯ô¢Ì"¬OÏ¥ ïœ9ÝðõVé…[_¿È÷­(Tzà¸Õ+YRù¶·ìûçÈÌÔRé{€5'†’ë+?ºLrˆÉ„Oxé"ྭ¼Ý±Õ»?ò ‹'ž<5NA|Ibú"íÃS´yÄèòlÂýZ=Žuæ´štmWQ­8ty0BGŽ Ó¬ba5¬Ë‡mÚ%#Õ¹Ÿç'㿃…m€¼úÊã†VŸ©xõ'êåxy&@žºZ·«ãÌeÆ÷oJ ê¾‡Û袾e-óT«‚ûëõ)E€5ü„hŠÏš\ø¨‡üµå@f–Y-î·¨-×kž¬YcªàeùWŸƒ‘ýKPÊ´º:Õ½N®Ø€¸¨£NüŒ©ûo¾xŽo&Qô1 59¯ÅôæÍ"rälŠ¥ëf¼mé  ­²fcjX³PHxU>à:3ß=DO é£Vò=s*ßÖ߯£?ÔBÿðmÜì2Óü!÷á]g“«O-â¾´[ÌÅ]Ä(Ïh½Wà¤x]FìfßLÕ¬ ´]ZSø[–OCõ¿ljò#Æ‘s}YlîbÍÒh0…Kˆ R»A¶ˆ¼êò§K]¶,ï3Ž[Ô3btŸÖß5Šȥ[v<¿‚Ôûdœ¤Áƒ ¿˜Íºº³µÏÀ¥?w¿{gÀ?ò7ö£6¯ÍŒ÷pÖf%À?ÆÍ®ìbÖ….üˆöªmu úÏËD¥Ócú‹¹…ˆ×j/ŸD£×oÄÛ÷C:)üמ[BEùÑÁܪ*ÊkÌU½öQéÐ+‡æÏ¹ ±3[9|êþjÛÀ-í1Ãß² £ŒTqŸ†Û¹A\ØyWx#kûå!aäe¿‚Éléµm$nj%øÓGô±ix=ß'î%òðÂÛ}ÚxþT&àsÆÓv_Þ~_âGðnÝGNÇ¡Á"Z+×;Zõ²ï÷°x’LÙ¶¡çôÁ“™Š¨’³¶=ë´‚4þ #”Òouñ{wBkÔªêŸ}Jí•­ýlV?;L÷GÍ]V ެZa3+¡ÉǬÉg÷’;ÖV7[.Ï»×釅«Œ¹ü4<»ž„±MÛ$ìUʸ‘ÕËÑ(úð¯ð­N¿oÈ~Ôžƒ¯d>¡ý_™ù¡öú‡·s³!NMu³Q’q«Ô‡àG2ÈÊé´n¤úo•×ròL,"Ô&’^<‰MùÎx¨~±¿Jaku1f¹FßVܵS '½>yI‹áÏ’Mj‡KŽjw-×€z)³†Ï’J•Â{7åÙgc™’¤³öZ@Ö¨@u¹<Ârò+VõRkm+¯ï?€KÈ•?Ë?»Í.3cYåiÛ?>>¢Ú)?Ý€7r ‘ÊÐ×°Fs|_RyµQÒ·ª…(¼¬žÌ¢F2èÊܰ›zvñ¥ý®íÖï·¬»Ÿá{]}£”áXW+¿êÖÕUñ—qsÆ·¶êòÔJr{ Ô?aöÜŒì Tªhº9纶¶Å"#-œÕV……|T6{wËLÒ7ŽÆ.»1‘˜ã/ºd“t#¯Æ [®=âà»Éò ŸßÚ±·ù£2ãB~âgÛÁ*òç—%ÿðÓÜê¢ì…:¨• ©’5ÜÓº·j6îvs3ÁÝ@NMšèï?ÿÇuм˜­Ój¸»Åõ´=¶QèùÞ´[]²AF—‘ÓVå[ª ‚‹Ï|ÆôO²:ËòŽþŸ?÷V¶Î[³£2’ö ¹•¥cóÓ os äÑSà»)•‚ä¶ù§šý¨:Ðø6«€‹#öiPòíX”eô¿ÉVY{µÂ8ºû÷šµÔZ$bëî;Æ¡´}\«Ï˜º†Òïô•Õÿ¯|Z8 ì CýÆÕ {w_ͺ=þ:’{]6Bc"D ±¤£Z¿~Ù rm ¼ܿ6~õåÿ"UøþìîǪÐf*²…<<åâ«ê]?ãG_ ý›9ÿÕÏ΀G[¢—ÓÿxÈ›Ð?|·5ÔåŠÕ>X|ª‚âÖ³Á@K•žÆ¥ ¼%Ó ØîÝV=°Þ¿#íEгº¾(æ“JÑ‹©ñB(Äjôä¶óBjr$a^eÝßZOfMŽ G¿ND.]N– Õ“?a=†Åv¤Ž.>ÁÅgkôü«™'?ÀO"gìx›PO¦Tz¨1úWGFˆûçr³æ®â}€m™¼Ê.w¾P}ÉÅÚF!=«ÉßCÒ3&~¸HÇ—.³Á–V}ɼÝUà>ŸZ|rç勪ªžý¼v[𬉮ž¡ÑÔDâ÷„t_Ú\2(@¥¤Ž6yà…/´Êå$Ê•Gèõ䳎h­Å}åâæ5}`òàƒ¸Xëù­7}âD}ѿކë9‰Ò8zMGàïåæÖ«ŸÛí7=‚¼Y§ÅFäm¨wjÝÒ.æ²6T¯æ•Á_==tSh ]ÉÉã`q)oæKïs=þ•G°HI·Åæ+ë¹ çÕܳ»õz€’e@k@ð•/ȲXþâÎWCq+Ñf[‰Y«® ²j‘TÉÅÔà·s*qñôñ[/Ö*?BèôÜ7wáéq#[^¬bÅjL¥¶è [SA~Ø^à>×Ö.X.?Ró‘Õ¾úDâq‚ûλ˜ç’x-£6Š-±¥’ÛÐ=5N£ÿ…§°Ý7ÑðEì~•»Õv^dù¦O<»aœÚ;Z Nc5¬S¾?̦º>éB†HŽ$SHƒY ÷åå?2oû€ïâ;B½Y“@žmÕ'díHRé»|÷‡‚ÛfQë­xóØ£f\M!ü¾ìkñ4{€^úÔÔŸ}ìI!þiÓ ·ì[ ¶.:s^™—x©®\ˆãËy—ëæUiŒÎ¼ÖôCßEVÏÒãMÊB‹]¶{îD+Á¥<à¢u5;N§ÞIùu’D‰ÎŸÒí‚[ÛájÂÔö:) ¹kHcüÒo+¾h~= [‚ñµmò£}y.”¿¸Â«Zø• ÿ ¿[0È•ÞHÖ›Ûr~Õ /Ý#Ó!ŒëâÈšüu}ÛÙçæÃú‡E\žÁYãÏâS}/ô–d“påyRõ(ߢ´Np› úÇŠêùƒÝ5¸ËÇZÃ1ù-.åþ+Ãßã:6Ç õ9©ü~ÓÖÕw‡Ï0W²ÿ+_kÙ[~ø«ILÏ+ IDAT]ø$Œ_’d4­leùÖ3À/ã+Ò:åEÆ&JI‰'6¼§š¨Ö„ä–¨ÛÞá£üÛQxF’àOÿ ‰9Maß"pö ÞâÇ»–Ñ=…à¤`$]FÍ;ûãIäüq¤r\AÙmâjÒÏ:WžùùnzéÙTg>*;èUŽÄÇÝm¬\jóÝÔûðÚ¼ÆÁw—ÐÚ…¸`’岕m¿‹,6¯IµÚ›N!ÔWy‰ÐÿçdÆ+ô޾]¶üÑž>qw’ð=ܬþOˆ½«õJµ)-ÂÁëÕ¯©üÿÒÇ,Õƒ»0®µ."|?H­×nxÆ  2rmMzן@Ywáú&ùçŽ?s‡j µê€Œä\ÉCÙ”2}«.'ËÌW8¸¸¢©µŸ)œ±ö"¶©82@Ò«Ï<:…¢‡“ {ø¸8§Ûˆõ-Øwi„›>ùø“þÛE}æ@Üæ‰C#ȯŒBZ'Û/Ëåyñ©‹,fµúR”·YÆÊ[Xé§ê×3\SêÈN—éÈ·æô¬?;ßí‹Bëü`ìÞ¿êËçG©¬rya«Ÿ¾±Ÿ6è>À =˜p_·)¡zäÆêÈ—ºwèž5a„k5›.9!¦´¿ª@ õrDÛ]V&Ͼm__?ú(^7)ù'‹¦ei}¶‚Ð3S-†ª^r×–©ü·õèÒÁ{žÌµEâÊa#¼˜Ò-àéL€|@G†oÒWäøºÀßË­[ñVèÌ­b¯§ŸÇ(ËȲzö¡.[Éz×ÅØ×NûCg»ðs—u§ú¼b©#aÏDêø ²k?Yëq[zïŸóÝÖ„âuiGÕ¾)IQ'd’4éçw»"Ôä]ÖZRuÖǼ-ë½ fl·aYK—oÊþàû‘þ㙀²G_·X|:jùÚÑøœá…‰Ûé¢ÜÔ{´ˆ„ê2§•Ž»âèôÙVcŠk7Ôùk°Û·®?\¡þýþŠK4Öb÷ríy°Òv¶4*¨ïaUkƉ솄„ñsŽ3b|‹ ¾ÔÝOvó(+ {µ•óÇ´µ’–cí‰Æ)ë¾ dœ[¨T{>ä‘ï ýÚÀ Ñß©T¶ê=Ã5oJèþ níš4¥Ôv@!Øâ7H¿¸£¢Nÿ(¹‡×µ±è+ûýÖqy •ê:•êŽäT‡<óðÑE(y±ñB‹‡s ³÷–)ºxÎì}´Eújtù%nxH³í r§ø~좘)H HmY¼,¦ó¼ä?Û×r¶gE/Ýö™‡<éx7òu ý'‡ëµàñ ?Íí±Å”Ü÷†ìñÓTÞíÜÙŠ¸åYA!qb÷2ê½ ]=d 3X©¬eƒ_•'ˆD{©Âוn|é>˜b¬ƒíÁ3r¼+ÞlÀ¼eux:‚ðÒœJ5=Ñi‰,®_qÞ}.¤Þc¡Q/Èdö R™HÈc_Tö²‹I\dž®|Érð~rDC<oÃG™q½‹Ž /|·“O¸Öмž/Æ[Oü~;…zYJêÛOJjö=î¼V°×rãB::øèº€:CݑċôÙùù@¶¨¤ù Ùƒ´K©](&íÑ÷9tÙW9ÏW’zFÊM$´~Q÷/,BéZ¤¢¥Åé—,ÀOòÄž€, 4y\±— ð ·¼Ô¶¢ònýÉrMî1ÓÕ1zá”üaïö…É­¬?6}L àäS¢3ð^ö~„¹Ó㲨d—Ö)¡õBXç ’F¿ÝÓý‡ï® ñýŠû ¤hÒ*AÒLDéÁ[(ìŸ- [ª…¥rIÌçü–z-¸¯}Ÿ—÷áaÁÓZÿöÄò €†?ÝJ»,Ÿ»ôôI!æÆø7ÅHx€ÈYq·¹` ÁkÑ#§Kñjú£[:dFÕJ¾œ=ëÊT„š›józ“[µ×Ò:v4B+ÄÍNáá,«æËÙ#]ÂòfȼϑÈ峃 Å,ÔgkÔDŠƒ©>!lº†"î¿yXH¹>ñŸ‚çæÖ먣¼š_¶Aj/Ùï6,žæôáÅÜË@óæ 05‚ª«ÙWe㥎l¼­ ãgÛxvß;"͈iØÑX ¬Ç*)]ûË xÝžòâ§Oû‡jØÃÖ‹â<›²™°}W§°t´íÚ7îPYï±Çh\üÚ]àwñœâÿ¿¹'à!‰€åf?­ÖÊu½¾§#«3¡õGIå€Z„˜­£lUr~b ‹ßFìÝõðžf8âøÖLX/]Äf¢Ð-cïípe¡§”Æ+äg¤ ;wåÿÇ“G•žõÃm¾®rÉþwõ®Öi€‘Kû›öÄSŸj’4]p¾\ªVªÓÂ3Ÿ1'Ñîbѧ´ó>ç6”§¾FÐ×[ˆ72|Ñ@¦z¾4k7}„uDq|'^Á#Åßs…¸õ8¢©9’ßîbDðC»ÃÁbFÀ¾¦E—s&SwKe]ô\\ÆBô踌KùnüfR$xÈÖ~ú$í¨è¢ÿžÒ9­ÒEöcBÆGÛ³•‚ßx1«òÃ@Êè·HøOr’Ú3÷IÈ¡J´Øƒ²°— ø¯ÊŒ>õ~^ØÅ>‘ÛHŸÜ-Ú»ÐÉY$².”ÀŸ|Hì²åœ$ý…‡ÉŒSú’ZQouñ²»gѺ$am*ÄG zÛl’˜èÖ¶Ô}õø¨ÂÐGØZò…Ë{,ìb˜£!—ûf»®Æ(ÌœµYBöÅ0žÝªôÓ¹ñïÜ2â–·JèÉðüÕ|10R2àý2AßqG"Dð‘ÜŽOk "ëµÕ,½NK(åWp€îåá6 ‡½ðÔjïîµôÂg»ïœ- 5ê7êÅ‚–#¶ý¡ãrô%>%מ±•TÑΕ7(#¹ëˆ× º>8Þøa»˜Ä„ÍXø§Y”»sò@Öb;ÊÃOÔJsIÆ2ù\­ðÚî÷tl+S €ßMí]ùµ‹|Óæ€—Wt"õ¿„Û\¨uA·œŠíjÏqÒ¨¯’£§A`Çh°¨œ<:ô¨§?‰K¯S”Ï«ñ¡ÍçäÙ{òìòÅ.˜.±mm*¥É@H>-èõÈI#ÏÎ¥Ó€$ýœjȨö^Œe9}ÕÊuý¾ôÖÖDZ+_м0æhÇáM¦6_7”üS|}[À¨4Éõ{ù4Äýá·QH¹¨¨¶AbñÙ¹Mz>|*«”Ý,çûª‡ÒË!’3bè¼¼¦v‘%ó‹ŽÈ™ÌQZƒçm6i—e Ã: »TëÍïôÝ'ùÈFœ}…\±¯>¼‹ýT:7c¯ä¹_4ª'_vÿ/úYt¬ªz~Â’vÑkÖâ`qb÷åëñ–2TañµÕ¥¸ŠŽön‹úv‹¶²_9"-Ú´üþ²µö÷Rßt¢þ¦{wp«ô¥úU~·²y&ü,¾WžW²ë/ÝçE÷nÊZûÈ'RÄ6 šˆ9ã«ÅfW‚¬n{p×­UÒ½¾ÏÌèhÒ²O]ßî\paüôfüNnòàÊv•ûY¢'ˆ¢ÈV®ž ¾v¼è©…Ë€¦Ö«ƒ‡’y½ò±×úÁn7ÜþØ 17Fø¶ªÖÂr»ƒÌÖ_Wޱ=jíõh@9MÅðïî ÷+H9×z6\ÙBšuò¨8Ñœ2yðkCê޼¯"˜½Ô}ÈÈç)ê é /¶OÚþ?51ÐrƒK”øW/s­ëñV”X‘£t:\Ô©ÿ_°Ø=M]´tüÉ’ëâSÝ·äBSg88ÜUœóµåf›‚©$›ÄÏK4 1}ISÙ×g3e’·PH1Îsg†î»ì">Ç2y*ÖÜ®±‚¹ôˆ–f$ìÖ“áû’¢ü9£znÕ0剰„ø™öü¥ü‰µØ]¸³‹#çØ®ý5US‹¿‹V×ÞÞ²Y„GJ¼]­¹O-¨¤‹?¬ýØg=¢¾Ù[lü½´#ЬGþ`^%(øKõd”±¬?¿÷÷ÏñÿEsµh|¨Ñ×ü\–³=[Ò/›™´Ð$”´¼¦KIéé®PöÞÈé(uIš:[¡1õ5{~Äpàã6B¨w}«‘¶¯lQíá’^”âØãÕã°aEfÔ ò˜Ã\$z8ÇàÚÖÝš¸h˜øNÍ5–Àkýgk_ÙJjAââøÎèx CeëHp ñJ8¾IÚ —5¶ÕÖçy¤1ÒIâôp¤ßº¡¶›z¢Ö¯y]‰¹¾Ÿ£z¿X“ΑÓÅ£Fçg\ÊýjuÇnÓ˜Mxˆuý람[饫¦4^Lü:¾kiÿÑÒóÏáIÖ-¦¬ëOlµ_xÈŒt[s‚åg^} P. ñߦŠ^Ç6†Å™}uZßÇ$$'ÄmžPÓY†v™™$v?ÈÝUˆ\¢5± ¿rÒëºRsäH·èzê55LšehÒ| ¬„ŽxòmüÜÖ^¦Ö·ý5ÝÒZ¶+¯o«VwþUsZÉ"4Úœn#àåÁêÂçyŸîï?˜‹Ì€{¹GÁF±uÔ›jSeඇH•Ð+Í”ÈC¢Ã¾w%ùzòôví—ó¨O—v‹¹½×þ‹1j.V§YÃÏícûL€&Í|§­o4yl U%÷`5 †sbÓ—Ó›­"ÑzªÕ…}Æãûì+®¥A^_ÓMG+ ÔMY,ó_äF‘Zˆ3’7Chº£œÈûuÚ?{úD–¨GB†r§¨Ÿ´´ñâtIˆ²ÎðƒÜÊÀïŒê–bú÷réû1ÚU£»kÅê¼þÕ]ÆJu´Â5ÝÙbœ†ÉIhUÈlX‹¹k”‘ þZ›È‡³[å!qãœ;Do¶½½‘Ó/ò“p¨ñìÁõã¾Rd8b_ÄŒ° «¦YjÆ3g‚&ÏqŸ}8lùÿi¾ôkoµÌÒÆ I«b±Ó çfòî Rð6Š¡¦»ŒG»ÿøãqDÖl‘â*þüÆK6ÕJ%½³Fw'€\“^µ½îûV$.G°[.7B*éù|PÌèË}t›F;;S~ÇJë‚<>-)ç!Ù;:ݯ›)ÛH]Œ•9sbÐÖ²¸öux$ ÷È™_CžLÉOo'%|üÝ»-1kUz*aŸ¾wÁô22{æÍk¯œcÄ]”|wAä²ã©‘¹ïvo õ¦!t^ÊÝ8•«ƒ¡:´ºãßå¢;aËñ,vZh\ã%ê7’†q™ð¹×é—ÅÙúa†™3^ï4¨ô‹¨ë€䋸WÕ÷[ì^¬´ÿq˜Œkz÷ÿgåøu”ÿÇõ\ ¶ÑM²g Ôîáø6Ò}¿éŸÍ_w¨ÿŸ¹ÈE¢nR/ ïdÔÿŒ?#ß}9sÕT/Ç¿ýGЬÀQª¯.­é¨sà‘v„6THÑœãw ;´½„º¶š@¿TAö®Y¶ÍZ‚¦×+wâõ쬛`Mâ‘{´˜žxŽæwËSÆÖ©è¬ GÎCd=ëMON íµŸÇû}›QU»Â¥¾WÈôhòðÓü9~WÑÜ2)ãïë²pí¯)>ê:¾ ¬žR3Ϋõß¶Ú2¥€Œh¼i‘8‘ENa?´TÂñ¯ë41^_-4Fʱ9î5ƒÝZ¶Çá±Õñ&>^§.ò/rÔ÷‹˜Êÿ2µ£ÑFâdM5§óX‰MI³ZO¤­.öà'¸Yt5b'‹Xý¡á#F]gGÐÍq)ݲ êƒæQQGkâ_³è½hÕ`sk5QâÜ…Í× ò˜~YsÚQJ ɥȯ.bÊ£r0¿ŠÙ¿Ö6xKÓnÙ“"ªÞÌÙz)k{º‹Ñ'¡žÚ࢒^RñN¿ºš8×dm¶¹¤Ÿ…ø?ü4·ü’4/â˜Fò^ú,Aü¯ÀcÒ 6çÚp|y{Å6îõÜ[Á1ªôëó½rÛ4‡ƒs||ôÊõ¾ÁÝðŽ.Ä,×®Pfš©FUB\öÓécáÔÑÒY¡¹ÈªOºJƒ„‹k·D—#¦×œÜ‘Âã~’-¢Þ§ˆ–²ðÇ¯ÒØíº€ 4«mFŽçr÷Ê…¸ ¹Ê(‚øZkä˜.¿¸ý ÅÑFk¨åÉ¿>©âß÷ûé²s¤×QTÍÏ­ƒÊ¥+«÷û¹šü¸j®[¹HkÞ@ i¥í3¥Ö&zÄ^ë#ý"«Ùc[¼?cšïŒJÔ©–ªáœ •#ÝEÍ!ö°dÙZ6uMfïl{E›š÷ãË…7­ºèÿ0!ôSƒ[ & ²ñU è•—Œ ¿ú6YShÍÁlcQÆÐŠñû­Û_¹ ˆ4í_ˆÔ•Ýu9ª+Iî—/Xø4`Äÿà}üÑëQÉ®æ?cëå¥κ8»ÆŸc4X“#n6Î}Bn¥I0”":2¢óm{Û  oûž êÃ@ŠÄ¡’Ñx ¯'¨˜Šâ% - 'HL¿{é‰<)v å<ñ£S4IG•W¹´Ü†O3 ¯„¤Z,¡î^õJ}ñø«\Ziïáð8Ue9Û×M_E¯£¨ôŠêV"&¤´Š•ËêŽcÝ0Û)c\n_Ø¢üZŒ‡Û[Pmž¸ÇÖïÿ_ä)´j—Êq'H}J!Ôô=ô¥¼pIƹqúü€¸f¬½’;ýýi³œî‘Õ{.Îs{‹~·rM^*„þO-(¾Ž^.‰¿Õg÷ÈòÂe¨tÆÙëwsß-¦,cèöÿáÈ[¿DeQ»y‹ß…0Rh¸2ÝMÒ*½±*{× ³7L|˜º>0µvÊÔ4;*éYKBÄeDì°ˆ¨óŸC†:¹ûŠ>bàg3ûX¨ß” ÃYk¥ÐoW¸›Íå¦àÓ¨ÒËÄ/’=¢*þU5â9®ð?]Ñùë!;3´ ÂnÑíR¸g\Ú º]Dª~=£0Ô¿Veãö׆ì-,î×:Ó çÓ¤Eóuuýy߃È1ƒ‹k\|QÎŒŽX¿¤ ¦kÚõWÒdË H9™Ú ‡î›Y~r5œq=Ðx;½@ˆ»:kiÎ •Ý) ËàoˆáÖ‚5•à{­PÓôe¾z¯ Ÿ÷ÚÂìI’(ÔƒëÅÑ?S™9‡Û©Ÿ17[tsñì é™ã÷J‚É +I» jôÚŠ¶ @·)‹ ‘9 >è/¦‘O6éÂ1v·„ŒñÌö €gÙ9.¯ ³Sû¢F‹Úò°Y3^Äç;5Éçû𷮈±~‡íƒ°.”¬›‰±v‚õc;r+ÉW?‚iË‚Ž†WbÂêMôÚ¶†½/§—‹l )„}æÊm×zúSÏÖbSO4X›·ûDòš¹táó·uÙ Âÿð>n‹0k …ö!˜.Z¸×êZûþzDôâ‘Ú¿\èÍ2kç÷èÿìQ‘KH&·S^?ºÚ$V5ŒJTø1‰µjBÍ0ê#W—~%ìÒðÎ :¸oÈ1È•IoFØe,Ôå`ƃ{#Š„V;9Ôµ\Uÿð3@±Tü4$ŠÙºüuqb'Ï$eªòçvÛµG ]õÊ0ó^z9t;Å^$ì?“Î:sY¸˜#8ô‹Ô½ò±®\\EzdWÕ×Ö—¡½žl»$.1smĉFÜlq´PÌ o;,ù¨+“mÚ¦ý*^Áð“ÜFgç;œØý¹¹k§‰o‚RÑ|d¾"Ì¢ÍeC5Õâ7;f³fÄü¾àððÅÝÃÀÕçÄ´ÈvÓVUË:èìn¹ÿ¨cüIm¸Ä•ôÍøQ–Ó”ƒ./Ø/Ë匔eºI_½KsÏès!«¾ ØÛ¡#íø~þD—ôÃyäT‹àæ'µ—“XP_Šü»ºqõÕÖÝýƒ¨‹ÖmŒ-Ô-Ä¿@’éÀy(YN›Û˜Üšÿéþ¿®ñõ­º½Ý}ŒѺ¿t˜t½Ñ-}"ɯ8SK=ôz?œÖpb6Iõ–¶GÒÞâdˆd "Íæ…奾‰?áwõ?µñʳ qëàãã§oÓ¦g8ï‚:Weû^ßF×÷PŸ2‘gå_šüÁU }­ÊÓ1²$é$ÛX¹>zšÆM]òN‹õ C—Çп(§kRÌpj±c£˜/½4e2\ªf1ƒbªÏ>| ·6œ:ŒÍ¯ìÂ&^b?hãXu”…x}©wïn[8Ûžœ2úÛ¹7.³Åˆµ¦úʺ¼€œTj(Üfk;Ÿa=¹r¸Rpv8êNWp×]Ó\œŽ)Çße„4e r§%L!ü¨v͵@Ôj2ò¼|·Å{×Uã5k£— ïÏ"g·ŽAXšBU´yk39ÔcŽÒpqqáóèpn·>Ö»à£ûäøhµ¥@w‚K­ÛÞ>¢ùÙJwÄ×Ç®Ådm™·†J2®Ëº93‘>fsŒÖZÓ:—íW5VºHÜÓca¦ŒyÀOq;?DT…[Éü|ç(²¾žíÎC}i|§«Ó'+ÄüÆ„A©·#ûžƒ](Ïjã‘«øõ|üN ÿ¯ U¡¤T(õK¬£ŠOë)rÑ|s²Øm⥓´É‚tëAϬƒÏçÊX"Uúß]´?Æ^Qò23ŠÿÅ"$ÿà'‰‡¶»F1÷{x÷<¤©ñRDáý֗éáÓ‘š‹ü¥ªüOæºõUMX}Æè‹ë—ãQ_±+@—õúh¾äÓæôÊ’;n8öˆq‡³¶Çk(âÖúúW´}’¢ÞW¢´‡V~¥¤Þ,©i›…œ7_ú777ƒâKïCT¼E­I<,¶&”.z}R²¡ç÷£¿öדխ#9qÿUÿl;¬vàÖ¶v‡ÇžN NØoäœZ7d[†Â|MÂ÷¦2úTCþ°ÿ52>¬ތ7¼e_´–¹®RýŒKGÝ çå±:î#j_ê)iÞ° @ŠË±[[á#I:õb£ðzÒGõM[3Ò^1ƒì‚ã^Óßö.”í‹wu¶:B2L§ò:©·Ú.ÐåÊ×Õßc¶SÝâÍDŒÅ%í¦ qû.\ àõì•nÌözUªïÝmÏêâ=Qñf­¡3¶pyQmm³Òß¾Ù PTêï9¢ÌZ˜Kuï0´Ýë.§û®¯|×QÕÉ'Ù³£f«©g×F{iìô6˜s5­äl¾£‹€Ïsˆ^N®4{Pê¹Õ¸N ·€9D’¬‰Õ…ï]]úŒ,Ô¨j_€7òçÅŸ]Ö]Æ=*ÔKRòˆÔQr…"¼Úײgºëâ3§b@á©a±=³æ].Y$h•‘¥iovP²Ù#_ÿJêcÝÜåË"Õ}¬ÁEÕ$1+AÜL©nƒs—ß9kZ Ç뙂æY6Ue™Vé–º˸àÝÜ‚Êðå᩽T–»¼ŠÓX×Q-u~<:¥ŠŒ|¨+ÏŽ»#ßÇl,p]<«Ïh¾º¯›â¬h­ÌÑ®;TÞÀ&]4×íÏŽ«™±rc‡Déž¹ Al{Â\<¢…T¯9vWØöË•á^èùô§+Ó¶J.¸ZRŒ-À÷¡„!oã¿âLñ–«¥ÓéqÎh_tÑy‰W¾BU$µ¿V*¯yÑN— Š7µ5nºÅJÚ§itÈCØsZé¤ûÁR%?´±íMC:쉻àÈšùze¶\]ü}Oÿ<¡e/=­ŠhÄýçšSß±»=æU«s--%ËaÑGzÐs=Æ~ëj«m‰´î".¶6ü0M=S•é]ü]%ÉùÈiôªõuëÁõ1¤Dq9‰­I§.rÚÔŒëù|Ú”Ck``whvë-‹ÙÅój5kcå0|L„ß2â®'f'ÇrÍœ;Í®IeÆ É­Âo­‰¨c_Âõõ“Û*Õ²W¢þð2 ßV—P뚤]ƹ"Ë*ô/nBß6Hup¿ÞŽ‘WŸMŠ”®ÂzÒÖ(wèå&u^Á©…$Ž´³š¤üÎQÔ?—‡ºKÈî'!£Èh¯˜´y»)AçBJs/e¿YBGšÄª3i›‡0GÒ)xHIsZ%_Ð÷7 EØVmf^0^C^×9¯`Óž˜»)©ÁÒJùëBIÛa,Ñ2° Eø»ô{ D|†Ã„ÅWC%irµéA! åÄfŒÌ9&"ÕÈ·>/|Ë.§¢Oi­çต!Ý-ò«•ž‰¸jz©œ{ ÕqxÀæsmM¹MhV®Oo-‚®Û-ɉµ­kõz°I8=oÚ>wç4ÆÂlvãk¸¿./l£ÿ¶Éaí¾?…FÓ<æˆÂ«É葺˜™$­‡0g œ´VÓÑ%ú¡(w!<اÎ>‰ÛÚÅwRÑgÅóeD| ¸õÊ9"Õ-´¹£Õñ+‚F 5â ~ó¹3†ÞÆ‚óYY˨j­Îù…pî©$ZYŸ—»$9«n¹™z*¬Þý>"²Gù‡]Ùsö:jÎÝÇvJ˜LWÎÔšÄýÃÜÉ0Éuy&M×~‘Ärµ¼ãp%öi„€6¦@£ÖãáK ™û[S,~††ïáZw)=°Æ¸·é äSˆÝ¼VmzW>4yRÉ~]Œ®K$q§ÉhÛ&W&Sš¡Ky{ñÃn7kÙýZ ‹ú¡× ÿÛn’,’/Ø)V¥cNW}9\Ò¯a-WÀ¹­«žKëÔ8­¯`"¤ñ:FUÆŸ~˜añËZúÇ»u4\«ž)üØw]8ØÇ†sà{ä^7‚<ùjîÖ‹yšc•“+ry°r ¼ªÆ—¼Ä;[û_?°Û '9§ F3ò1 #gëöJê@ûù^×é›W=-¾‡[ùjTn§#ê^1ÿ ‡÷ؽæÕ·±Zör{•ÜóöŒG}©[º¾W}ã%â;«6dÇ;“G±iM iRqôÄMÐ|WwMNb2!ºÏZÔПÛ|7%¸;HjX%@T æ•þòIëSOfri"Ð/òb ’€7ñggÙƒàêýueÚÊ«×5’/e©¼6[ÔEáGwÌpÁYUó¢V§t—šXåú+1X­ó EQ¿t÷qçHh¼˜0´Äë„êuÕ¾«RiùÿÙÓ%3G86­¹ëá»;‡è¾<¶E"õYÇõt¶ŠUÐMiìKyÐÒþR„^>{ûaŸh‚à͘¥¸Oé{ªš²Œ°àI©Ç–½çýëòéÒ?VÒójbdîÛàl¯hŸGeE(„7[lÕ¼ÈU'·=B\ÿé5¤Jcckô% ²ône`-û/ùt-Èv€ú­©%b´mçÕ!Òv9O—<´J^É-ê¹7(¦úû´¤^RÀ÷(rWwýÜ5wÑæ‚WÉ‘ls5[wïbÇrõªy¸tTF¦“SrÇÆ±ÝXM…¢‹Wm—8’¹IryxBäZ˜ÏBÚþª1C/|T^BÒñót™ÖÊ Â&üV‚Ù€n#ˆ,Zâg³l¡»”~a ÀרwôαëBMñÛ4Î%Þ%×ï¡gõή_›;JÜ4pœ¸Ø›¾Ï›ª:0×»Ùm0Zgeëc—åô<ýwŠÿv¸r.¡ÉÔÃxqöY'Á9À­õW•¤5¢&Õëê©6k¥Ò|àG¸Ù˜æaVS¯$P´«¼¾††Js ˆG[$ð§ôº+­Å«4’4ÙÃöi×îúrÒã"ÁÜt›|†ìÃeÓ ªÅhiÛ–ØŒPÎæ"ìÞ¸*£±ÙYDh4]p/w‘T—‘b,›ù’c$GJ–Üw$„{¹kúñ"ïä6r¤TãÏÒÛêJ»yðöGxÚRgQby{ÔÃéldQouù'¢9]Ú#ÜqB­ŽŸw ~¿ÍUc¶ ‘ß<4àÏÿjˆ¤«sôÙbá,›"£ØKÑÕéëÒŠ@ÎVQœAIKb1bi7‰Êžƒ‘¸K@ÿÛo$Åꕼ2uÕàÜxÄÿàg1mJÀ}Ô»¨ø~t@+Ê“¤ó熭n¥1Pke[fÄÜö4œ®Y IŸéКà÷[Ž[ÜŠ uYw“ƒQ:ЊWBÒânš*îîlÐÉþr#&iÚ4“ÖKcëwKÎÁug¡…よßÒ1OÔ!û®Žœ):«}FࣸÙ_¦¥êJ}þœŠ73$=Ý}GªÝ®Cá>Î+k!£¥ÓÅë]-y™±°o.cºâ#ÝY?}—Úñõ•Ç–„(…ˆì¯"¾ZÅß›>v²ø'¥íðΜ\›~ØÔxÆêŽî]–EÍrR_‰?kù%-LIËLŽàþ0’SaYÉYƒKÑ¡¼Œƒ“ð€€ŸcOaœ­5o*Œfº6ÄMluc™~W 7‚îR#Tý¯/®.-#æ?Úйô·ã´·ºËûDá‰Çª¬§¢Hº„À÷ d‹ô ˜ö1¨9^B­z¼t|A—ïßöÆÈ£^?€›6‘Ä ¹Ú—BàÇV ³çC‚ÌÔþVåZÿ~xC|?.1® #f8BVC«q¨~ø þlÿU-ƒš¶¬ºŽF×gÏ«Z‘þVYGÜ¡¢áéĽ;§ÁY•ÂÎ77ÒõEWuƒ#Å ¬–ºá•VyiKÛH»U@e5;Ú–ÇS}“F}Œü7Æcü·+ìë겺\1Å2ß m—ÜLL×ßŬÉ8¶èr=/–½äáRjþà#¸Ù`em6;ưÊég¡ØjGåO[ßDö*u¿E·ÛΨ@êö«O-„}êãË3š|Ä—%ŠÚÛ½Χ7õ.ü.9 1³{#>v®©ýšn­&X¯y‚ªYL©hm,º° nïH›-ê…ÔHVéÜw¢ýYy¿Ë#’=­~›à¸Y)|I!~Ýg œg«›Å›Ö¶Ì_ryµõzµ²B´a¬÷9„âî½ö\5%zi‘,j 顳F®^¯"Úñ†j¦²L0¤½Ìù• ­)…qf¶Àüœtíû%®=3½!¥úNÈÁhÝB)_²º@æ:²èZ¯õ?º-/?ÊŸXº>¶rõ|—µ‹ø½Ê"eÐÙ‡Ÿï"-jÂÊÇbô[$]&H²èòî¥êÎý‡?cüñf³gæÈrZ.„ŠsåºíàtÐ~|¥»š\ÚØÑiÛhÞôš†QÚ ?›tÎhrV¨ÞóFTëdÀÙš[ úÌ´û1äØ(#ò¥{¼Š?Ç{`Ý0M`]r T þE¬SfˆÖF{˨}côk£À"±À} âÏ_µRá?ö-Ð?ÊÒnËúüvCŒh§ãç‹Z ]=’º×Ô«KÌ”uýb’%áb•”vÞ8 ²GÞåtRÇmF¤ó,ÖFBz_g×­Þz·È|쩽ïo؇K4OÕYïNWöx,ðn÷ÿÔµÕrÄŽ%ÉÈlat÷¿¨rÄY‚‘øjt5ÑѪÌþ,ã?5G¦#Ĩ÷”R7šâʲM}úéxµn´Ò”Ówã$î}ñÒöÒ‹ö•ýzdtŽd‰ï¶µââ"ºø>ëãéê¥ Åþôâ°¯_y/¤£¸Üb6dÀ{Ù1þzü¦U¸ù‹8cXóªf-ߘNéEw{áà ^:_Å™ Œ¤–ফmKbO4j×H…Ó4€‹~÷aý{gÛ*ÿj#…sG0y… í Êù2KÂÚ tÃ&ÖÎ!úÓn‰ÍzAÜ6ˆÑ\yžÒÌÓ…µ(®_z}ÂÂúÀyßÇ­ ýß9"¶šäV™õ»¤Œ ‘‹»ƒö·+pÞËÓKRì¹dE?[®Z•uKÑðP÷-!ŽÜl8pª÷uo«UùéõQøÑ»§ûkÊÞYÉ ‘ån‰ââæTF1&cÑ5_£õñƒË¥º÷b h½0ä´;ýéDÿà¹áâÚV?ý Œh6î±&=v½`Niº›YDÿÃUcâA£çmÂÖ¦…qG‚ž‘ÅxÆŽÎX*µ™ x#¾/>Ð["FÐ9Cÿs7ÀTºÿàÊÿ«V·ØîT‰"k“ å–Žar0ã  1£¡ËüG}Q9Îz>‡Æ®±ÞÌ­¨jO2ñRÄüUj'ÛB@ß*«¨÷½ÒR䯙7ö|‚dÉö&þº éˆ;KrÄVúîÔ"ùйƒzv"À÷ó§|Uu ­Jû5ÆîÕølX¤W¢o~}Îix%}¯¦ÙÚ€OËÙ¶ùR¯µ8^öÍaXt†à¥ 4Ûü„ºP¸Ú^ˆ%«T.%z¤«ÅD¸Ô‹V³vm-t„Ü-tV³Ó’Óõò³ÁÉ÷JÉY¬ÛrJf9¦øKËà ÜF–¿½ŽÍþ³ìÅìj «sUµãV®¦ñ&gåÿ£j”}1Äße·ºScî óí¹¶\RGÄWÍ›ØcµlŸúš³»rùÓêòBªHÓÆYSY½^Žu/ÊßNigjIsrmјIÜgÊ:0ËStÝÛ9ŒÄìþ¶óc´M•q"ý4º5/n:ÞÌ­}qjõG0]+'€ÊÐu††×Ù2|»´Õ-åæå´\‹¼Là½"…‹€ñ•ùâž0#»"®ã³%¥‘pVv®ÈIÓ&æ'†Û¡uÎÅ\ TãÑK6ñ¶b üSÂæpZ¾bàe—F9¹_Ž «OkÝ[褖´ÖÒrêèFÔî#Q­\ŽÞ­+ÓÞ~ÖB'–ÀW!N±§_çæÚ)~¼X¾¶ª=Òù8¾‡‰uiæFöIÖbÏÀHþö†6­½ìŽÕ “‚ýrjN_|œ`b\îoN¼ÚOîXÛ2 S®˜ÑdfÎFLÒ,Ë‹†à ¢@¨œöVDå®óž\Zýôé^+{åµ|O\Ô–´ßï"Až¿Ó—Èò%mgEk“€í}YÝëØ¾àÝ ÄÜTÓaEå¼yñ¡(zîÎm‡ºüù(´÷ Cd™‰Pgw,ÝMŸC†„%!—†H%Í~™é†íQöÀÛ¹Ù_®Ô˜ÏBuÙ•YÐÞ oïW2>³ >*ןÇbÏ+ÙEÎ$õM3dy ô¶[¡÷<À¤CËRæHŽȺ»i“”§/¤íð»dôû ¬ÞÑsc.U_L7K›å•ƒt7›v^ÎmèˆÂDšöp R7ÝÖSAÍ'`[²^žßËf¼rÓcTÁÐ œ#þ%ÕkaYmnÔÿzÜ[Ï/.!Ô[U¶Ë™@<º(9ºlýt¡÷o/XiÉça‘ÓV•šÙ‹µ:°K»l 'g,4¤8¥`1*ý}X_ï )&g™³’厭¶9Hw®˜¦öëAì•ÑÛà¸Òv›Úíé  GDØ¡õÆâ0­nt* ¯õ%—þñQÔÅ*¹kÏ1ÑnŽß÷1Lƒ„鬒úXÝ1¶V¼ÑžN¸GüÕ [¯uê+]ûµq;üýv‰Ud¼QØŸ™ ½e®îqy­Ú¶Ž¬§ R°žîÐq4Êýò`I?õÿðCܶPþcŒÿF]a½ÅI× -æÈí\_r^àËÿm,~áÒê4[‚ {Ðr¹(¯•i¯4qÿý¦¢ÅuB‘¾ì¿k1_—‡KÜH±EÿMï4HiŒPËã½/"ÍÔ›lÐñºtS½lÄéë>½“%GÖ½U;§âº¬åÝåX‡r½kÔÿÀ{¹qš¼—Hçúz•(¡nÞ»ps1–Â>Ê\äâúQÊÎTéjâu´ñý¬ ¿Rã ö‘X±š^Œ¨úÐo¹¬‡Èædqžè%Üõ«˜€/«TÞT“!Í3mÚ;Sëëc†ºªÍ’³ðü‹Ãø[Œ~i©÷ˆëŠÂøiþ?J_ªï±îj~ÐùŸ¤]3ÑæŠ§·.Íå©0«”ݱ1zÓ‹ú¾óxM©qÉ Ñf˂Ƙ¼–£,‡wîaÑ!ÿ Ñív ÆåZåIŽ;ÆÒ£/ç£iÏò‹!f´ˆþ{>GÞeˆ¸ WTÔfMÔÏ…^òÈv§#yqÕ|7·ð»N5vûâ(*ÖëZì=-j_¨•RfÙµ¸;¹wsi¹¦òvÉQï3ÏÕ•Ô¼ÄöÂÚïxðWˆ·³9‰ÏÙ…£>->t.2ÆcüñÝÔâÄcTÕ[k_í$¹zö ò÷âι ©n±ržØ óKO«G>«¡ÞÈ¡´Jî\Ú¸H çAÞË–¸G¨ÿc §o~¨ôø*v«6³…¼C4xØöþ¼6ЯUøð¿ÕžÃRÈÝèƒ[do€ŒÚ A‚ö}hOãZp„Œ+ýz‘Ú§ºçö€H,™×‘ül¥wf–bÐÚ1+Âùæò!äŠý‹)g¯S/‹ë¸ÑØàQÚh¿hµÍ”Ây ¼‡[,Žc4eì-RªI“ÅH¾d›Ö¢l˜è¿²ìc MÝ÷¶õ‰&®ñGßF×ÔTV‰AíYã/aˬ^—äU é˜+¡³[ ßmÆÔÖNG/L¡9R­us׿ dˆ÷¾rwmÚP5P¿F/­$ìj”j5š]&Ç}ÓXÍ =é"•ÿð#Ür\U›ÚhÙ7QQ©„NjÛÞK•²N_¢fóa-í¢ááRRt$µw—{¢¢‹9@ª:ú®#:’䎺´Açš[ßîûcЪÓ¡ÿ#ù!iÌ*¿‘4ìÝ6´²þr Ú•T”œ¹)ûÅ Õº’Þš"ïƒ9$­šDWws€7s[”cëîa$yÄ÷ßã!HêŽÌqÛ½ˆþˆþ§@©Š³É-J`]÷Úmi.Õ‹ ÍXsea{ ªOÆYÁ$Hâ){„Z§Ù@J-ܱ%êóHU/…4Ü)£šçˆXWÉfÆ!aäRð¿×†i4'öÔ¬Øö #æJó‰vƒO øUxàAÖ½.Þ*±„гA|¸ónõq^ ZóZÛá'Ž*h¸¿9«Ý÷8û¡ôjE IDATÏžw0ø·TA¥Ô?F«ó.Aá§Œk›G°ã£æÿc#ìÔH%µ¯u%~;k¾§¶ñ‹hüLédŸçãÖ:ÎÊòS”Ýïk¿‚VÕá)í¯ ^gÉ.6—¢ûRäŒË B€wòÇþ"6J®.0*¦\:¸Îî¯V¿UïBYHýϺ¨Ý)Õå\HY‡üg®£KOÚp1Mk® éÕ÷â8ß¿â"ÑZßlî±r„esMˆ3è'kŒhA.n[ÞvVMZBÆø³ÿÿ¿‚Œ-ÁÐÕ¤«ø4ÙâEŠô$|žû«© +7…ˆ\½#ÀGq ¿KеÚ±ì:3‡ª:ýýû Q(NÏ·Ó-ãV€àÚê¯tˆêØBx[Ï^iß\±ÎÆš‹èSvAÊtÈýæe«šFvvÇSðÇõñÞ~+´¡_$gªöo}½ÿçOšÁf¹™Ü-6+ãêæš¬¢W†ºšv¨Tý“S9~Bøð×±%Ž@n(½GÆ¥Tç·¡Ö2¬œëÛƒCƒÌEBy~¾…v×i›“îbzZ¼:Š ýp»ÖBÙßÚŠå訴û“¯Têüês²§T®9Ðv¡¾]šÑ "BºZ<3úŸýÅܨprmcŽyר×P©—›V’G’|,âýmËe(f¿ð‘ø»¢½/ˆ_ÃJÀOåE%úñV) ¿rª­›¿žVsQø FÑÿRà^ýÿKšM3:þ¥±°5ø]¤ ÊQ s[†Œd&<\ Ý•ü7™ìº7s”Ý9-¦Ú^Líê2ÒC*ýÈ\¸øÕ5a~•ËáòðNnc´õÑ3.D€+Ú£æÝ‡’W•ÑênÑË›ÿô‰Í—ùœ°ë@NÚ·Ü%Bä¶µDÑÑ’ p$UÆ­nÞ"0šy,[.çqpõ>ª«ñŸÇ¸ ë˜÷BG™8:ìŽ5ØŸxÑìwt›4½’~×Ǿ‰[ûNŠ/o/jq`¡Å?ó3þ.1lz¨íçk&|Ñi70üe ƒÙûÁ!±‘ãþ«Ír2&[¿tÉ]8ýIB'Ðß$ûîÞŒ6‰‡i=­v5¤a‘z@Ȕ腢xgü+lj#çh¾_0Eô_â!7 ºëÅÒÊŸˆê.DÿàC¸±”1Ù£ûudÜÇ’ Ùü=¶"áZj -У-]LØUm¯ãÙé ùý)¹£ë¯Ô{‡ÆtÒFÕ5UR‰}®v·û$m\ÐÕ )]æ7Sszå‘ç}¦y®xBT‹aþf»ïFzÏ©6­-‡ ®ý¥óD¹–äòÂø6nSPe"A¹%ůCßÕ×Û“ºðhï£+^«g˜I8¨"¼£Rß袻Ayýº¿¸%$NCí „òÅ¥æOßhŸÑ!²ï¨L’ë¸Æi­}úgæÔç8Ô¯–л0,ÙQ@ÊÑz¥•Kbäèÿ¢p'o¥'3Po˜x3Û€ÀÔß—Pþ¿£#ZÈþßÞ¹,:n#IáÑÿ²s|¤êVWÏØç,Ü·$oõ"31® ïÙ£×¾ ‰6Åñ¶ÐÐ9âJeäã£A´C\î>;ŽÍîÞ©fËvx¤ûȺg¬Ìm³aMì~ܵï„È:og÷pŽþ?[ÃeE`ËßøV|ßÛ<¹â ñHËhßYîÈHÀŸåòˆA^ù°~ø& þÔÚüÑø? }†ŽÚ2ò ~'óÞÔÑÆÕ6ôœ.ÜŽûÁ“½¾»!ñ®ÊŸ‡GîM]+V»[­©Ý̘¶‘»djíïÂôY§èî,¢™vx¸‡ÑÛlˆÿ¿€?ÈËtUCwõû逸××&4|½0Æ·Ú))=›ºå\ñÝîí«}‚¿–?ÍíYô¤ýIœ÷VwÈ‹Íð÷{A‘ÉbÐ|ãR°"Û¶û¢Pnɺ¯´ªàå&VÝ›o7%?ã¯n¨Äñ•φÔo¾é>|Ÿ6z¼…Ꜩ¹’——ø·’XÕåbðûý¼já{×ìlà¬r£ðnÓ{±zgZ»x53£Œ_Ÿqæšú£œŽj9¾7F.³¾•‰Ï‘z•¾žù,¬5añ´#³Zn·®ù½Uóž en}SBHå~ˆm jŒj§Ùž™j¼Ü8o3Uñ¨›å Ø·-ü&^+>{…WƒžÌ1k¯?#ÿâ(ê()Êë ØCdu†[È4Ìø»”g#ÜÝ ‹%üOrÖÒ[£su!_3®˜êжßmq!û/® ¶O3صꪒ;QßJƒ}€ïËÞë‚ËÅîÓ6Y>#®X]‰ÏaP>3;ÔÝÌãÑÕ SyØÖ0v{xðº@ùþ[¼fUõ;”oIûeŒ ±ýG~K*Ÿµá µù­ÔÏŒG[ =« пG+åfM1$}dë4ÿjÿgÜÜç$²*Žkº½OÚÉ}µ)üo¾R¾i±ÓVê—H]8ÛúÇÌEã½Æ}¾á¡K¨mÍg4úU´•Zñ i³iZër$ýtRSUøÈúX~:3g¡2ðwÅз¼f¬¼÷õMŸmôôsDú`yk y©Ñ›Ÿ(æk+*r­ÞÎ{ » xÖ·øm^Ržl¸ÙpÅÊ•áÇMU?c¿ 6†ýuuä³ÚuÖoâ!b-[Ñÿ¼ŒŠ­E§¦¯$O”t‡ì3YÝœµ¤isà–b—ª]‡?wFÐÒØh[Üòãèâëý?K¡Þ‰öø ±ÝIèÌ?$×Ú¼U°©¹r-'–E„Ô4Ð¥ ¸-œ»·›~­¯ºG•£ÀVR ò«ÑMÁ:™¥POo¡£™xšŠ3Án?«5B¹öáöé7ú´µÿÉah;šlRýÃcoOÓ×o¿ œWþ`Öª?Í…ÞSÐÿýú–mWüºÏ5Noíî"ägUtŠœXªC«¶]©.Ôý—›øü^+¯°Ò¶÷hœÖu£ÇoqðŠé;,à5ȵىÝ"åmSQCò—Ì-N60P/¦¿¬zít úµ´í:Øu!ìï·†²_ç› ²ðÇ'_²­àwRmäþç·v¡¿øû ×j¥>-v#XAaBíGÕ)¿lƒªJ¥Û(Ò¤®bÙ»¯å¿rºêîSá| ²Ñ¹ kÿÏrË@öußÜ<þòGp‹Gý•¥f±±Úëzål¥;JàÞ\׊±ðf¿ÍkIÙé'sZg­ü1ǨþÀŸ%Æ$_ŸZýk£dÒÃòqUE‡a×ÞŠ«ZcÝ îzQ3ºPW^çU£À.nnqr†ºVó Ê5û^ôß®”†w0ž7¦ZNÇ€µvÚ9O‰|˳è—nÄD˵·þ½ÁyÇ©ìE¼,ÛQìÔxTs<Ñ]ù|õd¸…à1p¯@¥Ã© vOý¨~JŒE^@·AÊCÅõeöÚ·k[×o¥å¤ÔÖOÛFf¿Á‚Ò½ï´ÍtÿÝh|›çH±]Ñÿúî ú'i{¯ÑoñÆ€VþMÜÙN[~0³µxS¡jîÛ•±ZÇ/÷â<,Ó_º4•]®¨& ª.“¢ùónÖ£¯Û϶­ µå §cgÇíøcÄ0ôkÜI¯ gê[£ÌSÒÝø§èð ¯ïÜ€G +»¦c‹é«\ùž‘ÏLÌÀõÕpN¹f½tûT®Ÿ†Æë[+N¶¾ó)|oãFfßšÒeœk®»ªÒÓKùUÒÖey¤Á[ó‡âú+º xÿå6¬•º¨ó[Y™2‘“ƾA§5÷‰)Bº`üNª(äÒó?Ä)úOþ ›Pùë nUĦyúúcÆÍ5÷“¦M•‘1W2¿ Þ÷f¹Í }á¶5áï%%¯ò^Q·i…e†wä­rù׿­HФl’…o™K¨ýwN¼ºÆ©àÆ<¢„Q³Åó[§ãwJ‡*{Ÿxfœ=¬€Ô×»‹öúÅ(W=Òj<¨×_6ÑN÷©yXÎÕýͺë¿‹Õí#I©ñÝ©G~TIaÆšÿjÝ»·ÒhW´×>ÂAÖª½»Âó“@‘uº7*åóQ«GqÖmêbŽY DäqÓÔ~òúØfÙ­×2Rç›e_“LÒ7Sbm¤ùýUŠ“´Ž˜ª8Åñµ9Óò§r6Ü4rn¢¦ ôK¿¨gp ~?ÇÐÿ›×ÍÓI‡§ÆÇþÍ\W”ô^ìYÞVg_Eß¾4ÛFæ_í”òÿÔ¨­q]¼Õÿ.Â;§“£ÿN¾¼Ó;$ÝØŒ‘÷â}¡Áʦ(Y+{ãeËÛ,¸mº®w̲ÀrVè4¶çÏÝW¸™¸Ö×û¶?™ÖŸ«¦/å€.ÕcÏâÿ:-;À¯sÐÆß¾Rut+¥Þ걄ê즌Uè{qï °Óöñ½©ˆÈ73½cmm;›ÊZY•`|ë °[kÿd m·ÂAý74Gö­Èï(_|Ñò»ží€§<‰'#§¯ÙN¶0µc_U,èª×®6ïO—¡«Óv¯m~>ù{ }JÑ-JµœcÁf߯ ¹v¾Äz¾z´èÍ«1ÐlÖ=3×AñvÅXŸ¯9K^³;·k!ƒmrßY$õ3“ŠÂGµý%£äÂîv8Zö`#JÂécŒl«}ûXÍXwãáùx ø #æ¯þãoÂè9sP¾UQŸŸžÀÜJÎÿÛUô‡ƒurü'õœ¸ ޾iøVâø;÷à|] .…íRÞ8‹u2G6îæë{×ýþ65ìsåãFÛåÙ°kM]³òIEe'¿ÔZ¾Òw Jò¾¾îÒÆa ²*‘ ‡òHY–y ÀugÎà·ñ,äøJ!ø¶•\Ä£Þ÷ÚªJï%à£ðú;°¿I°»Q±›ã“‰JÍ»¥al  8/Ô³«Í·ÍÀÍ\á¼ ·Ž­¬ƒÅÓèÝ#Ö,´ž©vý²ã¶•ŽhÙ©õØwÒ7¯ÜDôu qá'Æ)–ƒþÚÔª¿ßib§*Â3¢ÿ^©&dkNgåf³—Î{¼ÖhR.ºâÈIe§º´ËX+Ê­Ó:§NÙ‚¤œc›ôº¤NÜÐàë[ÒÉQy)o¶c5_Šè“Gtª>"§tô¶.HrL¯HQUÉN¿µ¯n˜˜‘€_¥FùŸE2+Ÿ@êžû¸«w1¨úöÑÂÉfÀö½Œ<¬1üM‚.Ðoã$ãUzÔFœâ¿×#ÊË®þb-¹fˆy<­ _2GW •á770F¸x‘ú‘z‘Ÿ±±¨º=Í ˜»$á:é¶„‹¼«½ì°™~cPž™û ©ßýÒ/õ´ŒÜ‡›amµ›v·YŽ7RöìTR¾0¾R»9>~¶¥Yð'WgÛ“ð¼ÐêÏØz¥•qŸ¡çw¦a¸³0Œí‹Ê¯Ð¿júa¯ø§622r·>2úOâÇ»¬´p}níö(ªñ¯ƒ(‘téé›nínïTzl£Î¤ñòdà|<вîII·ÔÁl-‘ëÎîjùõèGJÄþ‹¬€:CÝ› ¦ Я—ÐüÚ' ªAnuWM‰pwÀ\¼¸ÞPˆx+µëî„‹Ç…³®þ]7Z锊h^wwvÝ]9³'cŒâ×TÆwÑ뮤Ŕ:ë㙹ò1aÅO*E]_S£?‰/ù¤Qç;=’kôuI 5½Ô>ÌÉã´Ö¾¾4>øâúlŠ:ÛäëƒÆRØoýçVŠh„|É'#¢æàÙþÇ¡k£ý-“á2µßú;xÎW´Ÿþ>àŸýàÍŸ”¿â*<¿MAè²f]©‚ªd—JÌ·Ë¡^?\>èúê.f}ß‹ÂÍ;ÐΩYãÆ<âÄÛNUjÒÛ9›3Ý­-œO¥hþ¼Õ¡|  º"ŸR2ïè¿­YþÖ³Gy÷½tÙ‘´ÚÃUñ×½¬.óS¥ÄL—‡±’Ëi})F'Šð |eôÁÏ_åõpdKéEWuT³QÖH†·®6¼Æ“U1+¯è*ô±à}ÓN–p©×6ãÒXaâÞ¨2ô3În›ÁØj¤Mȶ‹£³ø‹ÈK7§Ê¼Žîã[€è¯1dÑoÙçâÛ»ÔÆ.úŸËçõàw¢¨hä»4ç¡•ÿX'ÖmÄÊKµSˆ2S7?€È­ãlÿácޝ4ˆƒ0ýAne ÈV6űûÚ} ïŽÆ}[¿®Pu]Œ¨#4«K¹—ŒÝÍ<íPÌôµ¥äü£“¾÷w7Ô«Yº{ayN«pÞ¯¹¯‚oÃð׿Îy\º=cEÆ×¾Ø¸[ëþPk« Š ÅAڃ̘ºŸŠ¢]ðˆI©ë\3jw~­ô_Ï`ì[Û¼¹uê;¯Ð•¶#˜ÅÔÊZ-ÑZÖ•ÇKQ(ædlͺ©24H{$æÂÖÛŠuëåPh3¼äÊ/Ô« ×—¶IÕ(ß5häzÔ]&˜IÛ']æÙ}§ ¢’ØÊÜ¿®}¨,‚Y9Ÿ{¼ý¹hŽwnÛðÇž}Õ—â—ð£¼VŠðï¼–pÿlè±ý‰ë@¯Ü2«òG(¢OQuÿþŠ?ƒ¬!¬¼¿Å‘´µç»€¸Wª› pQËi§?\À®íTT´ßÖÑï7(¼âþrÄÜb˜»½´‘¼›ëv´U莎9¥¹Ýº²;e¡à³WûÑ*Y8›ÓYúî' ÿ6~±DضŸµ5ë‡Zå×ûŸ:8¶÷ùÌ6ãi ô­ö‰ZC'±—ù”ËØ.úoel·BFi²¢•#éœu}A¼î;*«Øûò|ùÛÚ^kØ¥BÌ õxφڎY€=?ªuŸêÁH·Ú·½Û°•#w_ŠŸ)Ø'ØÆÀÎKÖ¥š‚1ÃO 2ðÃòu¯ØY*¨çµZ´aãcë›b÷#*Ý»ö6Êÿ~æ>2®^ߪФI)fŽÚ3t~nieˆÆÒ»¯õæm \ßš½*ßÓ$B9äˆ[“Ó0éúƒ»ß¢ÿŸÓcñùîJYM(ÿ­¢·s3õè íòŠ÷6¼Á¯i=ÓŽ$¹l%så/ÝeA’‡ÁøÙøÑWlßÎ ·nôrƾnù•jƒõÙl¶JßË©û {#\‹ ¦®7‘Ü)Ì¢Í+5ä+m–¤FÞ㽤w©IDATè7ÊN;Ü+/öÊõæüŠ•ƒì»ÞåâãC·Ùݘ>ÌJ’aÄDˆE·{àT<u Ã;ÉÂÇäC€ÝÖÖXзvûl³ÅUªnÚÊN¢ ¢ÿð(x|ûðmaž‰3vOÙ&ZjQ‘¥õèµîó깪tmÁ¶³Ý©…oºQVÒƒOJð×+í]¹zÍPœ”‡6¢ö³ìÊ&¼«e—åé§ŒB h'Wgi¥äS&]²¤½*4ÄÏ€Íd¡ÍÏð¬“á)¡ÿì·¼)ößÍk}3oèW~Óá¾ˆá ‹]Œýôô|åqÒà•ß¿"¬¹}taÐ}PÓªÓÔ³_SÊNi{Î&ð/D?øöÀRS¯%죉š~L€ƒ4ͬ÷×§æzTžÐj?Š“ë­yïûáM!ýÒ®)Ýjl«¶o\l£ØÎtžòDKÞêˆ>Kä5sü0¤§‡â K´bÑÖÍÅßÐö*FX5^ ïˆöŠã—„Y·žê¶[OOÅðìÑþº¤¨.Í¢¿mü5&Éþ$Hî:…Ï*éò¶µæ#üV,%Êñþì{w&Qþ€7Ïõ~T¬‚1]s/ò”Ýq…ÍÉâËR7ãXT{Þ)IßÛv‚íE>(¨ä»À½¯ÊŸ"þKv¿6~4S®÷L]#‡ô ½jû%̆Àó1íúâw5WlãUp>gÃb“*‹¦¾Û<ÂMû6VFªö×e¬ã•‹š4²~„»ý~Ÿë¶ý =?¥ÔŒ÷%ô.„úê_¾¢¨AUÆ=•£ŸQhÞÆV5EåþÀQÑ%¾ønÊWjË*9ÈÇjŒÙ¶Zöùû(@Æcµ&~#—oÛ=:…×ÛdCÒ’û¯—'d.n›î[ÛG´Ûáy++Ò»w«4PÛ¾Üù±‘e‘š4Š:Ù¥5ÂùØÎŸº;±½Iò8ÝÀ€9Ç óÓ‡÷í:1öÕÎÔÆ)qÞbl—ÈŒœ»ln¼Ÿ‰ù¿öN¼ŸüR!®øL]ŽuÀz{s:ïŠd•Emçµ-á·íPƒnÒõßuóµî€†î{_3}Rp~çˆ`¥©^ '¶­ã9U§ÂôÈ×ò=MY¿¼Å~yJY æ¿ßµn6sšõêI½d0Þúa¸9êp¥þ¡œ„ñãc-÷bã.Ü,u7¯½¦Ø½%)|ëë÷Ç&N:k‹ÍÇŠ}Om÷ËÕXyÂ~x¿ ºÞ¬rQó×qjÀ}¦Id%pj¥Ô¨û?m»¯á u þ·oç.v¹}ç%ÝŸ—ýVÖ¯F½8bk ¥ný7?šfŽV¢S»Ò³ÅìW¶üÌŠÎØ·OV{ÝØÄk}T%ØŸ’o^J1_»BÿŸ°seÖÝDuß{«æo»î…“¶Ý¶Jý3¦¬Øpʉ-Ì»çêøi]p–ѱ¤r³¿‡QÏGïâkMWs*+úÝI$ùÎ]‚w™€ ããÖMËßù²v(-5;‰ç©#ózmÓ¼FÓj1+¿kG{ø`ÿÅþ¦!nNį51êëŸVÜn-ëÆŒún”Fyg5/Qëâ;UsXEõùܱe·áÛ…ªþ)˜þާ›º_Kôþд1Kpn”ýƒ¢Mļnö.“¢6ç²yÚêí÷bмëÕ‚¯ƒtºå’}‘gàê±æB>ùk4°æºI›n銀–_‚ŠÚÕ° C¥ö`hÈDà_…ýçÚl‹žcÄ8›Ÿê”ÕÅŽ­X/]A×$7ŸŒv-–”»Qɵ/_8_{òs9_ð ò m´–rôÁ…¸*Ò´%ùê‡9¦š¿‚Ë=ÜäX/ßTßËåu¬ßGE•+ ¶7иSd2·kW^$ÅÇÃú¨,ŽïÈÖ‘ÏÛµ§Þ¤÷zÌëõK›£åfj; ŠBPÑ Þ €è?À?”¶"¼¢ÿLJ`J-ƽ_õ¡~­¡kØ9è³»¦Íùôú·¼­yùëÆ ­Þú»MÅÀ´íLk»1kŒ¿çg ’‘rS_.7´—*RèØÒu»9^뻓è-r ß6Í–3µ‚æÚœ»Ý©¨[ZíˆË•ÅÕÍGÍ¢5M5 Ø›t#´=r4ÝNI¶$”¤/n¤ÀÿoìÿF=ð«ÕÞéÇ;½g7UÒT„€l“/СþÝJ¶à²˜·bp» aÔPÒ{Ê;{Û|]ÀúY„ë µ y³ÓÇñÜØN¨‹tF¾ÚÙ™znc}8]k­o*iøÌÛ'濽Æã™ÙrzC{¥¢/¯þø˜»÷00øçrcïú úþÃÞ-ÿ/ô[úUÿZIEND®B`‚opensurgsim-0.7.0/Examples/Stapling/Data/Geometry/virtual_staple_1.ply000066400000000000000000000017121277777236100261240ustar00rootroot00000000000000ply format ascii 1.0 comment This file is a part of the OpenSurgSim project. comment Copyright 2013, SimQuest Solutions Inc. comment comment Licensed under the Apache License, Version 2.0 (the "License"); comment you may not use this file except in compliance with the License. comment You may obtain a copy of the License at comment comment http://www.apache.org/licenses/LICENSE-2.0 comment comment Unless required by applicable law or agreed to in writing, software comment distributed under the License is distributed on an "AS IS" BASIS, comment WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. comment See the License for the specific language governing permissions and comment limitations under the License. comment element vertex 3 property double x property double y property double z element face 1 property list uint uint vertex_indices end_header 0.00005 0.000855 0.00531 0.00005 -0.000855 0.00531 0.003871 0.0 0.00533 3 0 1 2 opensurgsim-0.7.0/Examples/Stapling/Data/Geometry/virtual_staple_2.ply000066400000000000000000000017151277777236100261300ustar00rootroot00000000000000ply format ascii 1.0 comment This file is a part of the OpenSurgSim project. comment Copyright 2013, SimQuest Solutions Inc. comment comment Licensed under the Apache License, Version 2.0 (the "License"); comment you may not use this file except in compliance with the License. comment You may obtain a copy of the License at comment comment http://www.apache.org/licenses/LICENSE-2.0 comment comment Unless required by applicable law or agreed to in writing, software comment distributed under the License is distributed on an "AS IS" BASIS, comment WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. comment See the License for the specific language governing permissions and comment limitations under the License. comment element vertex 3 property double x property double y property double z element face 1 property list uint uint vertex_indices end_header 0.00005 0.000855 -0.00531 0.00005 -0.000855 -0.00531 0.003871 0.0 -0.00533 3 0 1 2 opensurgsim-0.7.0/Examples/Stapling/Data/Geometry/wound.png000066400000000000000000065605571277777236100240110ustar00rootroot00000000000000‰PNG  IHDR=ÅDg pHYs  šœ OiCCPPhotoshop ICC profilexÚSgTSé=÷ÞôBKˆ€”KoR RB‹€‘&*! Jˆ!¡ÙQÁEEÈ ˆŽŽ€ŒQ, Š Øä!¢Žƒ£ˆŠÊûá{£kÖ¼÷æÍþµ×>ç¬ó³ÏÀ –H3Q5€ ©BàƒÇÄÆáä.@ $p³d!sý#ø~<<+"À¾xÓ ÀM›À0‡ÿêB™\€„Àt‘8K€@zŽB¦@F€˜&S `ËcbãP-`'æÓ€ø™{[”! ‘ eˆDh;¬ÏVŠEX0fKÄ9Ø-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+®ç*x™²<¹$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóýxήÎÎ6޶_-ê¿ÿ"bbãþåÏ«p@át~Ñþ,/³€;€mþ¢%îh^  u÷‹f²@µ éÚWópø~<ß5°j>{‘-¨]cöK'XtÀâ÷ò»oÁÔ(€hƒáÏwÿï?ýG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)¬‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(¼ AÈa!ÚˆbŠX#Ž™…ø!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fº‘;È2‚ü†¼G1”²Q=Ô µC¹¨7„F¢ Ðdt1š ›Ðr´=Œ6¡çЫhÚ>CÇ0Àè3Äl0.ÆÃB±8, “c˱"¬ «Æ°V¬»‰õcϱwEÀ 6wB aAHXLXNØH¨ $4Ú 7 „QÂ'"“¨K´&ºùÄb21‡XH,#Ö/{ˆCÄ7$‰C2'¹I±¤TÒÒFÒnR#é,©›4H#“ÉÚdk²9”, +È…ääÃä3ää!ò[ b@q¤øSâ(RÊjJåå4åe˜2AU£šRݨ¡T5ZB­¡¶R¯Q‡¨4uš9̓IK¥­¢•Óhh÷i¯ètºÝ•N—ÐWÒËéGè—èôw †ƒÇˆg(›gw¯˜L¦Ó‹ÇT071ë˜ç™™oUX*¶*|‘Ê •J•&•*/T©ª¦ªÞª UóUËT©^S}®FU3Sã© Ô–«UªPëSSg©;¨‡ªg¨oT?¤~Yý‰YÃLÃOC¤Q ±_ã¼Æ c³x,!k «†u5Ä&±ÍÙ|v*»˜ý»‹=ª©¡9C3J3W³Ró”f?ã˜qøœtN ç(§—ó~ŠÞï)â)¦4L¹1e\kª–—–X«H«Q«Gë½6®í§¦½E»YûAÇJ'\'GgÎçSÙSݧ §M=:õ®.ªk¥¡»Dw¿n§î˜ž¾^€žLo§Þy½çú}/ýTýmú§õG X³ $Û Î<Å5qo</ÇÛñQC]Ã@C¥a•a—á„‘¹Ñ<£ÕFFŒiÆ\ã$ãmÆmÆ£&&!&KMêMîšRM¹¦)¦;L;LÇÍÌÍ¢ÍÖ™5›=1×2ç›ç›×›ß·`ZxZ,¶¨¶¸eI²äZ¦Yî¶¼n…Z9Y¥XUZ]³F­­%Ö»­»§§¹N“N«žÖgðñ¶É¶©·°åØÛ®¶m¶}agbg·Å®Ã“}º}ý= ‡Ù«Z~s´r:V:ޚΜî?}Åô–é/gXÏÏØ3ã¶Ë)ÄiS›ÓGgg¹sƒóˆ‹‰K‚Ë.—>.›ÆÝȽäJtõq]ázÒõ›³›Âí¨Û¯î6îiî‡ÜŸÌ4Ÿ)žY3sÐÃÈCàQåÑ? Ÿ•0k߬~OCOgµç#/c/‘W­×°·¥wª÷aï>ö>rŸã>ã<7Þ2ÞY_Ì7À·È·ËOÃož_…ßC#ÿdÿzÿѧ€%g‰A[ûøz|!¿Ž?:Ûeö²ÙíAŒ ¹AA‚­‚åÁ­!hÈì­!÷ç˜Î‘Îi…P~èÖÐaæa‹Ã~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DÞ›g1O9¯-J5*>ª.j<Ú7º4º?Æ.fYÌÕXXIlK9.*®6nl¾ßüíó‡ââ ã{˜/È]py¡ÎÂô…§©.,:–@LˆN8”ðA*¨Œ%òw%Ž yÂÂg"/Ñ6шØC\*NòH*Mz’쑼5y$Å3¥,幄'©¼L LÝ›:žšv m2=:½1ƒ’‘qBª!M“¶gêgæfvˬe…²þÅn‹·/•Ék³¬Y- ¶B¦èTZ(×*²geWf¿Í‰Ê9–«ž+Íí̳ÊÛ7œïŸÿíÂá’¶¥†KW-X潬j9²‰Š®Û—Ø(Üxå‡oÊ¿™Ü”´©«Ä¹dÏfÒféæÞ-ž[–ª—æ—n ÙÚ´ ßV´íõöEÛ/—Í(Û»ƒ¶C¹£¿<¸¼e§ÉÎÍ;?T¤TôTúT6îÒݵa×ønÑî{¼ö4ìÕÛ[¼÷ý>ɾÛUUMÕfÕeûIû³÷?®‰ªéø–ûm]­NmqíÇÒý#¶×¹ÔÕÒ=TRÖ+ëGǾþïw- 6 UœÆâ#pDyäé÷ ß÷ :ÚvŒ{¬áÓvg/jBšòšF›Sšû[b[ºOÌ>ÑÖêÞzüGÛœ499â?rýéü§CÏdÏ&žþ¢þË®/~øÕë×Îјѡ—ò—“¿m|¥ýêÀë¯ÛÆÂƾÉx31^ôVûíÁwÜwï£ßOä| (ÿhù±õSЧû“““ÿ˜óüc3-Û cHRMz%€ƒùÿ€éu0ê`:˜o’_ÅFÖšIDATxÚìýK–$I²,ˆ1‰E½nôÃ&°:¬ pNôM! T>ÄQSóðˆüTÚ­[•án¦¦*ÂÂLLL„ÿ×ÿóÿafF’fF3tÒôEÚõ'€ÁÌÌ`óŸæ\ÿëÿÕ½‡üÓþM`ýWøyñë_Öç]máaãú0þr]ö`þ;ö7Âù¢ãwÝWˆt'æ W„ï‰òÝ×/§{2¯r+Æ…¿x’ëÖä›3.?Ü÷µŠïMÆ+ž±æ]`‡×S“»ç~^8ÓÓ€,ÿL!ï•nðþqÊó³â¡Æ/~óE åRùìU¼|–‡Ÿß \=lßýâ«åkM?Æ}£¨‹hü¥¾Ü]®å4/}}„û„ë âí %ýÚu×:VÑü[®÷¤ÅÕ|´qi×ÿT—5>n~[úqÝÕzÅÓúüh¤Úç6æ¼"VÛëú º½©«ú´×óÁ¸“˜7E†±Ázïffì¤áúøq ã·Ãƒ |ø¨Ý¦Ñ7Ÿ¶¹Oç'Û€sIqŸ=²„æ%غ‡ýþ{®ÒÒæûÑ|´‚ýMÄ>w eí`_ÎJx(Ña…Äù·@ÐÚõ”SHï0b„$ª¬ÍŸÌÜÛ%4³CD ‡‹þë|?æmëNç6£ŒËÚÆsŸß\Dzù£ÿA’}ÝkÎ_š[o¾g_·ôº?Í`ÍÿÈÜ?<~Ç|°‡o¥§œ¦¸áÀZ'?Ƈv—h¹ÕʪEJ+ ³žÏŽCÜ8‚ª“ïPݶóy±BVÚW4ê\ÛSóP®U:û*:Ù®/°²ÀH¬ÀëÙ“½Ó…÷}Üù8ß$­5X¼.@Àü…ÃÈñ€ôi­ÛP=†oÇ·¬kpîr#ÉnýúÚ­¡m'hòðÜÂw£µv}—6Ïù¶öÒu.íHQ”9áß1WSÁXQk—âÑDýÚ³z î@Ê´¶¡™KEÇ’[[d¾ºü3k€µñº®jÎ÷Qó¬7ï×-ïRýu€†kw¶”u¨Ôpä¾—ùÈëi6wÇõj†¦ø’Œ±–,uIÔúìGQ3‡B²Jªýº¢‹9.™ ÿH´-*CB-‰­½ûôµ•žï”UÁ\.Ö|ÉFI€PŸbƒÝŒìW:@öÑ%‹ÛAØÕ©óÊv*”‚y‘8iÖµÎõ{ m@8é*³ø,±^«Xg'ŠTË- hE¥…˜dé#Ú¨Ï)íŸÉÒÈ_æWÛoL¦¬Òå—Öý] '@{ZÓ•ÇÀ•]!Uð ‰zLÀöÝžyi‚sP§ t/ók~ƶk®o<²%Ckm>Ûð¥Ø‹úÈÕ4ï `Ë4åÜ\¹û¼Ÿ-†ÐÑ™Ë!õÆ`?èWÛxW½óMöŸ+7ÎT”ˆe«;†|gÆhºhç³ ÔO®t¢Ï-(aã!¬öqRIñ 4´‘d̪S÷R]zøþïÜ&ÚÇoï½³÷u´h­½Ú«¡ýøñãõzµÖ®¸>ÛÅ:fˆ ’cmÏOa}™BIŽHò8ï×M²cÚ -Æ–átûŸÿYBd‘À§=òx;7fA…–å‹ŸŽ¬k)Í’ÉKŽû>­³ ¡µÖ^¯×ëõj¯öz½°—Š"ûÁt0þúKŽå$ïG€Va'@Æ¥lů:"<“âq!&U+Ê”·¬¾LÿJ… áò"#yÓ(áÓ"Ã(`ÿ €r‘uݘLfèJ¾»OÇ…;Oo0‡üøèÁ¼Û@ø ‡hÁºi¤‰÷«ô+ €wp˜•Oã‹ €÷ㆺdëc±¿*øeìQØç|ZcÞõ×CofÌffD¢Y2ž5rX# ‘-U)À…n@›ZŒ_…3Î"ôåù4W1|P,7äîœ.õÚK0˜5kë ¦‚06kf4¶q‘œ©vë+ºëF]¨"Ûì<~å¢p•·ë ¾ËÆ=„<úA½»q\™o‡{1?FJÂ_fJ w6é18¦Ic# Øúxe¨ñ¹i„|uŠB1ªÙzîŒ <Ër™1óéÕàô®ÿÝ´ãÑîblίôw÷,\V ¹x&ËäjŠQtâ̆SÓp€Y»…q}‰+Â-Ç4 hŒmÒpeú]j$×›=’½+L,˜¸­.€ÔÒ =ôÈcVTÚÿŸÈfÕ‡ºÁðâql¹:.„++àWK¢ (Ä k@¾ ÉÖÁvE#ƒÀ/hÍrÒS±uG÷æ,u îûÚ!G…ñjÙ6ùÊóš|j Àå‰A¡0 H–ó&•½`s¿eˆ`D›ËËø_p·™m¹@z¨¦va=~¸—/ÉÖ}¥k¾û¤ †™Ú$}‰¦Ûó€Š,n£7.›*ƒHBK$†Ì#ƒ#¥\Y¦´²ªW]Žâ¯qlMvv#ÿè®Î™S[ -Ì™Ç`²cÞbüÍ<|_®‚(?!¹oW@Æÿ  ³'ð »§ÎcW&à*Ð+wè,[M¤ ]>7!256]DO €ÔÕ`”†[¹Nvz7\‹c£òí 'îÄælˆ÷Rç#ÂÂ;GèZ wÚAá.&"¤»-©a ߤàÎ>.¤;BÌ›ÆÌÆ S*y¢6Ämæ ×ÁÓ¡!©ûj®;°§PX€q8) ˆw¡²eÎ ²c•Dúƒ¤öãZÁf–•—šw.<ônÚ9Zm‰ûJ© 1Ýô û¿þgwž¼Zk¯×öúñãÇëÇë_¯”¬f¡@=\ë«/xûp"¬2|/øêHc‚(¹Ùë,Ɉ׷œ%¬÷ÿùÿýOÿ¿þçê/¢Í¼c×'ð¬ÎÒÁ¬qäœÏÙb¿¦´ë%õÑŒˆ˜q©ä•Érbjf£W» s´…ÝÌš? g[`ò@¹"?$4Ûzãójx½ÈœMØO%_^SÙÀ(ßÐ`°Vv”ýªËx_…7°xˆAÁk¨X6¡Ûqsp?Y)ð¸ºZ‚7¤¬Bbc·¢žˆ½&²wyvþ*FÔÌ83k”®™›î·”EÐèÂ,ÒzµÕ{¨öÍOÌŒØ^Á]‡Å-÷œØ³n½í UM–¢õ Ek·©” âùo⯪ݹ÷;ª³_ý|Ü~Cìê 7ZCó)œ|Þ¢kgu£xºšç.ÄÄ æbäít~3ë'BqÅøk üX¨âuq³Ð¯ØÙÀµ ÷:—tÌösÑü0nüUJ ÅŠÛL€ÅzÄÎÜ›£$ÌØÞûx‚/Oƒl¡º*]´qº-¦Â EÂ%.¶³¦ÊÞMM6®½^LR¸n¡ç^À¬Œ%(•¦ÑW»ô\ž]4@ˆ!~G´ñM°‡BÌwh¬ŽûÜqm%úu.Q¾#†Ô)E(ÓÀ´ã°—J{¦;/æ³¹vŠÒ ORNP §ƒÑÚ$”Ì OĆ×6½€¯›ï*ÙG½1’8ÐÛ5±“ &gŸ}¬ÚÛ×û÷Þ»qG0´´«@kMXý{ª:!%ÝÉìõµ²B0ÖÍ9‚ €|Ž·Ý€……)IHÇ6ÍìÒExAƒÞ;kl}SIÆi++׋Å{€Åüø…Çó|3 C!ëOf7Z„¸vÆžÎÑ{/Ð.ÒfàYàÖ™m`Ú+’ªˆkæbs…VŸRÙ‘ÊMÂë8]8{\ ±/—,‡]˜Œ^sf—AÒRÿsœ“œ`pÍØ›LÖ…\h•ˆ«¯˜ë!(dõ…¨ÌÁ~ç¹ÉÝ.ˆÿ2G›,!·C›c1ühÖ~ü§ý¯ÿüïÿ÷ÿc 1ìÍŽŒ„¶yá¯Wk­½Z{½šËJÖ‚‰_'‚&mV[QJ˜·1W³—ƒiW5¬±+ z~›™üCO,CwJJCÙÆdHï¾Y"=“1A2 §Ò7mfù‚œ,B÷\W±@(=³ÌQ‚¿Úˆ|`&f5ÒÁwÛ@`©A“5¬@åYç© ”s|©à*ÁÐø„¨Í©ÉYæTlD&L=C‘87XÕÉi€·­bEÖR€Ú2›Hq›óˆEÀ?•@ÀiÀ7VÃû €yï6<éYøf7à&Á%@»ïßâ]2æa#\»‹FZ—à¥Ëlµ¬bš~±P¦Çg. O €)*øUrEÓ¿§•æSiãYKå¿m(9ç>ž¸›¯EÝ7q¾õzµ¤£?cV4Pm4(å:Ê@NxüQgOV{}¾öÀ^íõz½~¼~üç?ÿùñãÇ50yUU ŸÝÉgIàænìö¤à”K²PÉþôM¨oíÿûÿþÿü_ÿçÿÙÁ‰¹X˜ŠUðšë½þ‹\æ¾{[p­ëic*:Žòïr›—~Ã&U\›v ›¶k<¶W¿!±ÀéãçC€dÇ5b0ÀaûÁN˜±^ÕDzUŸ+oÊŒ0 4LÁƒ‚ïffaYûùœßq0-”rpÚaÿõp[¼m—ÒN]U¦E__gzzìd¤@S½bjªOì}ÊÍ;á4õHC7…ZVL(Þq<’*à w=yò$ŠäßGRƽ•þz†´Ï&‚¸ëÈã¶qüBö&g‰ €Å{Ù,¶{ÂDì^‹º7á(Ý‹Å;g,Às¥«ð“ì*E›1kâc<Ô´ˆ––I‹†aNýcðéa㆙ÙK2é0છ·>µd»JA¦EÕhi\ígÂ÷¨Ö bÅàœ£ïýÊoóPÐÕQ¸ˆ§ÜÓ•¹ +ñZµx•÷êî® {N“?¸$Ñ¢ªÙNX™ >‡jËp6ŒÌ­høt–92Kße“ÑMÜý¦¦«˜»Ô­⤜Vi¬1ï‰"m™gŽD\E=]=<¦¾ç5Æà œ2 ñ•ƒ€»[²KÙÌï]4Êp¹b:}¹ÐP:Ho¿à×ÙØ¸2­p5ºzwüÃ^AâBý_­ÙìhTYj#Qr¡¸5¿|î;sÁXÉ»T•¸‚9ayÔÁs‡Oo:¾K‘2¢òc}®ßfÆ{ï9¨6ésãÖ¼ªôÍÍä@ÈÈ~°üLz-ÀÊh÷v£€Xz5Orh\ ?HeièÆœU'/ ¸wàZð X:d –k vs3ý¾0ß„CÄì¤I¿XÑ~;]yc‡=ZûœÔk+mÍï­_a‰$]ÚÇõ‹šR€¬;ÓºíöoUµoÚ“:ÑP »Å!£)~R™K g«þõãõ¿^ÿù?þo{KÒM$€…æŽåºlÉá}k/°”‘Ií‚5GáôÂ@©r3‘}ŒÉJŸ]“óK<¾êXÿþÚ˜Aƒ—Èä¨=¾1ŸbŸð¿œP*Üì¢Ï=Ô6ø×åì®|˜¦ý ¸cCȾ Ax,Ì¥›p]æ|lÚ»„ªªC‹·aÑéã¡D*3“Ü@{_æNÚ»¯Ì·÷ e›oÕ(ÉäócnqÎâk/L¨46¾øv‡;ÆØ‘ÂñDWñ£oæ¯97¦ê+2cÉpd®»y\C0<ºîÀEŽšRoËhW›K {Çm åts“QÂuCºÓ"0Ú|»1pû矮>Ö1†UÔb«*$ê[ðGÙG€"¿TÜê4ÐÁŸÜ°Ï÷Á©p¼m6” =vùöI­_±Äê¸>¡¼+èÍ«yŽÕè­5©ƒ7½ØÃ~p È|³}jÞØm³í¨ú¯OíÇÿöö?°wå5µ¦ˆš|Nìyô˜9^‚m(ê\šÌrvvL‰Ãòþ›YÛ*µ³.BÃë⌴†×Õ"i+T°nNeÍÍF›’OÐÿøƒ†ëO§ÐԳť/Ô`h”Ö¡ b¼kß4ö;¥ªNz‡¿Ôзê›ò.»%‡— €#vË»˜+Ú9•⛩T¸_JW׫nTšûÏÅ@2Ñw7'cYq§‹1ùGžý™ŸMû PÍï?m<ÑFÏlP¼W¼þJ TË+ÞRÉz»çœ+/‰i–4€{¾{Q&ó¬ ¶²á}`1š_­ gœ¤¡3& :™ (éÝ^°?8ÉÀëßÇv´<æâçÀÞaN§>D³Ù?˜ $;kôiÁõ»/[“ì ›Ö6¢/n }Tì¼`‰AÀÅ)à`­‰æ³Ó¬Ó<:~®ä/ó4Š~ôMF¹îÆl¨PP¿ã˜§m¥ãX Ín\=}Ôûž¶Im$æ»Öîy« ×z黚…©CprO®…TÅÁ¶¤˜±ý øZï¯~áJÖÛÀ7j9 ‰Ö¾eë„‘Íz7³Ö†,£]€ÖÌ+¸ø+ü9sÚQn°æõ×#‡¿52F®'ÿÝ@yŠmî%0š‹ /›l:åÙ‘kÿO”sGýÔ«a¢Ô,HHàñQWÉp (ö2A7 tã5ÕT}òÄÌþ^᪦T§°XJ%mc:‚®Ä’|ÏA/ÍÝóíÐè{*‚Ò£TªCÓ?“æ\Ü:{ÔNÜœ§2’li¼ÖWiЄ䈇ϔž  ¬ì‹¹tŸ6±\H2®:„{Ú ¯Wkh—TSk?þ÷ÿuͤJÏívÇ àƒ·æùÞ3ZÇß*½tL¢Wå•)åÿæ±ù”ÇÖ(jÜnõqZQ(ÿa‘×r«ž¹a:›(Ji$|\kLÇ{=ì} ª:…G3‚îqDÞËÙµ©B±XŠº"YŸ\qGDXxc9,·IÕ¸#‚DV¾ÎƒÉ© Ùan3î‰x81>ÞÁAœƒÖ‚J5­  CÛn#è¬hvëçûjbà ȵΙÛþÛ<û=’g›[í‚%\À‚ï+ï@²ŽK`‡qœ…¶ß ÜÜ.ô Æ©ŠóvÎYStBRßJRé|gž·À!ºì8™Ç23a& ê°z¶Äñª ²s×Jt¾ZH[+©Â…áävC5MuÒ[‡âþ¾`xµ×þc“£`ŽºóL0¦©2NÇjž>B¿høY“MÈN½;û¹¡tÑìÕìõºjN›ãA¶)€r*.&ÇôèìÝþǺ}2h?VPB^híu À©*í¸9‚è}=K>8ÊÖÿ·¡8ÔŠš_­ÌÙ³8.ŠN*5ÆÄƒvús÷µl¥½M2Ò'Jödàhõ©À;y;ï®saWÇ@ôœeÙoÄhܳñRןFĈ‹%@§ÝÊBwßÎFÊç8M³3w>MHfÙbß½J¸£óG™Âòª_\‚?xïvõ®iTO>@LçÂUDg ¦Ïwêá ¢™¸_­Œ½yü:((*ö*~¿TKÞceÓÆdsTeyJ§] Ýåœ2Àp*«ýâ‰$Œxåéç,©;ƒ‹¶Pu™ÈïÝ?1 µ–ëzçf® ¸ÙÝÞŽ2¦á¶ ZÈÅ¥8›Ü­¹ªòj™š9Õ¶K 榢Ák·l£BŸmmP¾*ópdÌ1ñ€ò²¥€Ée½–²åp%ˆ9Gè1è64´£a U ÕΩÎÄ]ŒÃù^œC3a¹šQDn<ŠÙ7Y¹ Š¹|PàQâ¥y®Ã^2P0¹eK÷N bµiBu)ð‚· êNò Ãg™R–ŒhRô>`P 1E[·l$­ý1–F£­§4Um/:‡í4‰$ôÞÉãâÿ·¦’·‰Ú@n8­dí yÈ@ŽÓèÝòQ…Dš“ÚÅ,ÛØ$9BÏ ßËsF ¼#”’föú£_çNÓÃÍ5µŒ ǦEI+ãŠâ}„-xE c¿ú iÐ~‹µÎ÷lÚó¬ÆZ/1‘n5!¯’ÿ# ‹Ø ˜ºÏ- OHÇv3æ–u ˆbˆ-"_º–|ÉFX{òPD!›k—ä\œJé“•?ÅÜw` ‘ãš^Xû‡KÜ›÷îgäôá:»iÈ׎&Ó°hHú 4Khðº{`¯×ëÇëõ¿ÿo¾ëÆsL¨çͰÐ%ÓÁEL]|˜ñ‘ÐdÞõx!|ô¿Ò6H mhþ.,™ïÑPX×q {¹–Œ")8&V>—b à¢éS vÜ7åÚrA%Û݆»c;ŠHI|˜½E‹þûÝO&Ýçç,§‡5AZáád(è=íª8¾8ðg¼”éÙ!ÁQñdEð¡Í›Lüü˱ÏÏ çvàË7ÎOØ­„?`™ól¯ o~æþ9üüÀ£ç%£a&xï¹û°íæP{b²˜™À¯ ÀóãŸJþꄸ(EMÚ#Ú³n¢?ŸãŸÏ´üÌ>ˆ €/n礜&/Uª²<÷q°ZL…ÞÝšo›ÝÊM[Sü¿ïK•â,ÇFüÌÂÚ}ÓŽ µ DMÏMdk?.ý… $+“šèb`2G:´«2™Øygï¤áðl-_†Î‹¸¹Î¨!} ^¿ÚPJzý®iíe¢ï2;mÝú5L@öÖÿøc<ÝÖAà#ðƒ/e´Æ”ZãH{/橎œ_ åvYàØÈË”|7Wo3<ìÖ «R0ÞÂYøâØÌ ƒÜ¶üI™Þ ßN?5d= {®EÚàŲ µV–OÝW£ZÙùE¶¶‘»¸¨Ö|Tú³Bå&±|Ñö“„uŸÿû×ùÑŽJ^‰Âp1å;”©Ò-ñÿ†£ b¨§ÛP~A5}Fr‰<ÜBøã‡¡t…ã9*T: Ékmâ™mÚ_qöœ§¥M‹ê³ÕGl¡öÚ¬É-‰°ühS§ê ³8Ód+†9bñrLIaT›ŸK5«AqWk Lºò8¯:; ³¿¼]DÜdšÑ¤½<úIµ -‹}Ó-ׯŒæCR ×ÙEVtƒÊ!lD2U4hIÑ›@t¦¦ÊÉ<«D—Q…|"¤u Iuvb7¿œ3­â¹GØÉ PØdÏC7ðজвi ¤?ÒäD‚Ð*öÓeYpN9L2¡štR—|1«»h®4¥0Y4´¬ óœõKxÛ â@sŒô %pmÐ8€=À>ÛÙÐÀÔ¦ %û¥iCÀþ°n0³Z{µ××(&¶ütËñ1Ù‘Pbÿ@3Ö­[ÂÙUé)”ç o}¸{õŪÐÞªÁqÇò˜¹ Žá ¶6:^2°£_-iž¸ÞÆð¦¦º¶æƒ‰ÎVu󞔦?xÍ<qóÝCÅžÂnâŸN+·ˆ[÷ö³^ÃfüfïœüP3 3ÜÎñÝ¡ít,—nÁækõ°›ýZ²ù5|1‘ÒË£ë=ä%7;+ ÍÄâz§SƒÄ÷2ëæÕÔ^뀓º‰j†¸îÚëÜÝj8z?–Y¼„Û«·?™öµ—%É2þ_Ò¥om³WqôŸÿ¸,FœùFrëc @NêYéŒaÅ6m®Kh‡Ñièðâ]ÙÂÃVát»ÚWšãv°¾Ó™? ý‡ðdj©öd˜Ú’.î)g¶B&6ÌéV­(«¹É=“Kª=úS!öküñ@äINvOÞSðp-|ÛðmwxWâ,‰c)ìµñ™Â§Z$g«O±fвÃéʾ5¾åã,›y,8üi}&"]˜<-è­?Ùùøòï bL…ÙÖ³'±œ²Û•¸SŒ$Pax܉LŸúå–a¡¬„ª³û‹äq*1±”Öˆ˜m-çß–EöeQûQw–ÍÓï~f|Ðuóàr`…‡Íx¿©ƒÖÈ9½´“’÷Wrqßs¾–E  6ÄZ6–è¼oƒ¥7ߪgÝ7ûJpµ4t¸¢Y{µå²+Ïcú-š›ت@£VÚ»kå«msy}]u$ä¦ñ¾Ô,ŒmÿÁ‹ ÑûsÑ7{™½^íÀ5ŒŠ5†>ìž6TÞÙ/$ã?ÁâÕðǨoÈþÄÑ5rkxµí4ìÚãˆ@„Œ]ÏJ2ª[¨ Š?· €'Xé©Ã!þk 6 ã)mÊ €šãöI- 2øS5P52"ì“HÆž@Mó zFÝ5ŠŽÊûÖÅ0Tr^¿oÔÀ}Üø°%»èø¤àþÓµ÷ 3ïko©³ÝdÐ{ÃM3¼8¥XÖEvrê–µAÒ3ÙFììZÉ(s°Ý7ê8…Ùõ£ø5g­´@Ü­ß7SÌv‰ðLÅÈ0ÖiÚk†ºT®«ù¥!J÷­m1>n žK°Tô ð…âÎñ;\]Æ!€J~½O9û™J´IŸGK©±?¾-™°Ç&M˜X0ŸÎÒñ<ëmBÀ–¶1 }з¥ºáQ¶ íõF\9;Ÿ2¯^7„ny=^ä)ûƒò½´‹X@%7cÕgOÓʃ[k±Ï-ÜüÊEp˜YÁ‡ÆOG³>M¶B›]íIJ3êKï&ÓpBPkØA4#0G¦ÿòÌVû5´Ô¥™´HB o¯éÍ|y'æYBh?^x½æbj'<¨Õ xÅnmŠ\x'ÈfÑ6&6rÀ?ÀÿF›Í>ÈÒYË+º¸¢QyˆÛ×p+-iÛ'Bo›²'Áq<âqÆ<­´Ö^s —ç(†šš!$1棫 36ù7L¹s Dƒk'ß&"åã &|¾úôñR~Ë%2³5õBš¸>²ï`²Ïæö˜Ç¥Ÿä0'ﳋúêts‰tn³†q|¶]ßr¶§¯ù5{e k—Ž@ qaèÎäÂfÆ8)ý-š“S.;Iø¶ò @ ƒ¬IëÓ^×YÑÚ×þ:S+™³WCbŒ¹m™jiC³oQ;)ɰ(fù=À‚D'Í*ªjËh Ñ@…ºpv/9Í_¹3ÀÿìFß#“Ð[I¹éÑWY;šØ½]ÚCY6´ ¬Çn 6o'ìt¯V‘m¼&R„ôè³8=3ÁÂ•Š¥S;Ãáæ,1kp›Cfö¥¬ak\™Î”m}ë>3olÍ·„¶FSÊšS9Eãòâ`-6+ºÛ€ò*‘£ô…—©™ O1ÒèWKRï^µ§é|¶.¡àMmk—è;¥bó£g §Ï;ªæÍ¦8Òúü¶|‚­nÞ"GPw ¸m,§ØªIúd8Ç›rØ™âz~4R®:G¤Lâöä‚-80ÅöX^*q¾b7¯á‡zanËb<ìIˆ…Y+Ä쌮dõ8XÊ=å„zÎÁžÚ“-dž[ "¯­½n½'î®òn7û©í¸1PÜ¥Ò¯"7nH8й…·º:EØðβH–Ñ÷R±$› u“ŸïB>”î³K7ŽÑõÝ€Ášu³×5”éª<ÄÉÛ 7äqºNÆúñömÓ—Ñ!†;ô¬¯6U´w¸oóàx-ÀdÊMýXË©sK¨a6vDV?Á!‡°ÝgrØ.¡hîÀ02¸À¸Ý3à¯ÛõŽ"Œ0äÜò¸,‡( hKýgxÏ„C˜þ¤œHZI¹¡/¤éÇDÈu²pùoµ rÄÌÜ5€U!z›iE:ÉŒ)]+ />í\þ À‚©Ò„S0?Á™x‰Ž§É5u3ˆƒâ&./Ãj¯à5ö¢ œ<îE¦#ÎfƒÎ|Õß:ÓÒ»ÙÄÜõ ª6}?¤D¡ù@›ç—ÁÄI|ñM(J—˜¹1̈ŽnS½«Ä4—¼.gˆn«éhÄT»îlðzáÕ0=rÀª€Y-¡^ ä±Ï —ZOÜy}« ôõ Á#·Ø7ˆ5m6O>Sš ÞZs!0%6£.Û¬Þáá!tœ’XÝü¸9{ïàü1³>§\hÑÝÄŸû#ù;C`|Ë`G.´fm€ƒJ’ÀòسNÞNR¯%±|z €Ë«SF X)¥\Y2º†ŽÎ^°¶Ú×lμ.{C`_0ð‡ì$^´?Öð©-$JìƒWÜÄR•n«\±í‘¶·«R¶Œy’ßk/4éÍNØÍñO=c;p‚[ðû@m[ŠŒcu%éË¿â¤ám¯8çUùªÄ< ¼Y %ÓXJ –)þ zD8¶Qõ¦Ž5µŸ¤Ø£ÅJ.·jVÐöQ)L¢#6Œ Š }¨ÔÞaÙz gíª‹¡gÕ¸;„¯Ï T€«Íh2š\à÷•ËDÁÖIËÏIç÷%Ô¸9é?„± – õp̉Ã#Òt™™'ܪì çð°’“À6m=¿ ®:‘LŠ—ÜÞŸlG`v5°Æ ¤“m ûpƒWØ´€Ñ+ ;ŠÆ6WÏ…‹L ƒ \¦Rt&YŽØäÆ6z´8íÁ—qá÷`¦ èĤºíྣ-”@ &~Æ*2kž?A¨Í5¯c—k"X2š& ëúøi"º»dÌŽŽv!Í^/ë4õ¿\nIÅÂ<Íê+l)èoÜæ¨÷—×½ÄRvë$8o¯%·ø4S¢Ù|²ªc‘dYüS AlFÎܧ´z,Üèþâ2se¸`€‹VÛßë×v0ûr È˜h‰Ûø(¶kY~ÃŒ¥þ n½_C3˜tè Ø3´K–ÑZSáº`d+ÇÁuGZYÀ»úÆ©”(—ZJ²?š-ëko5¼Ó ®Íÿ4Ù/$”›{Uthpv„iã”` vÎí1ªØUê!!fpô_¼»d†³#劧yFÆXˆÂS¸r&Š•ý.í°Øq´Ëü^%­5ƒí=§sz}`_ûZg®Ý7ô!íœ-N·ÕÁ1:¹£a>UGƒ­ÓÜyôºçÆk7í ç’æò)îÜ‹ìï„‹ÂLG@3øeP†ŽÖ0L‡ƒãK¬Q—UŠ•i´cÏ;k+ÌEöDõ‹@'6ä¸ Å͵Xº瞘Ÿ,Ô¿„þïþ]Ýÿê:ï[5ê“ IagûF…ü$XŸÁþî÷ØÓŸù*XÛ^íK˜ó[4›?݈µyuÊÇGðæÙ --u~åë3µ(H+i>n*à;×ÁÎ^Â4_½ý²ÅÚç»:Q ùðXùÆ'ëÙ®Þ=+ ç #ýóO<"a­,"EÑä+ô&p{t÷Å×ß"ÄÝmà$:Pµ Õɺ!ц¡•ؘ©3î•ܵC÷+GË0¹óü¥!G]¼ÁkZ[G *HÅÅ㈱Y2¼¤<µ@¸êb52¬£™ñ*Wb >hlvéï·vÔ]yª-í¢†v•¢Kç™ìäˬ÷~ c´Öºíþá { §]Óóâò„ŸÛkH© ޹ Ÿ¿ç×. ß’:}ÐÁþ…ãá+Ôdî¾õ[ãü÷¿|3ç_†|)ÞêüÉ%ñny?ºuø0™<~\€ˆ~⼇o Îéð±Ì4ñôaq›háPkÁ¦@} âBƒ3{ƒ°®d¢)—…Jc7¿t˜~¾Ã’¥²÷†x¹Œ“À+I+Úhˆ¶Ø½â0#BK}‡‚~£‰~ôÆø–žJ·¡^Memç ñŽÕåãûÀ5Ü,Œ–x¼Y#¶`ßÃÎÛ{U^óÐEÖ ™ "X¤‰=Í7wDO³6Ö¼Hf›nÇIäƒa4ÍÁÍ ãý*œnFƒ4‚˜*«=ÔÝ[6Hà1A½}w‘Ëž»‹h—ªã¥C¢ž{d æ§Æ¢»ñfšÞ®ÛÓzo¯×5Rcâ$1‡“¤ÜBTéÙSpá0¸¢}R‡z$&©öw­á¥7˜éž„L°”ôÅ<‡X½?k­ çBya«ÅH$ðþû†©²=‡:B÷‹ctqD,7Æ*jãþd–鉞€×¶l³îòžðËHý ßL~›8‹ ×ÿ­OiWwpZPlÓÁI¸¹tÁè\Xöº;¦­y,Î…@íÛ\£¹ýôr+<ŽOÕ©Ç\uSÉ}d”[µg¯›~Š­´æˆÿOV}®3 H7f ¦5ÆŽ!ýcŽ©×9»%CW-¸äŽ“–ñlœVÆÒ’~µèY-ß(b•>ꙓHxHP5X˜ªÏÒ^gÂ_°Qɽœnjq&-L¶hL $weAå.mž'(²§»öHö¨Ô¿-Ïì£>gSSFÏóÀ|†^MT#¶©ÍæùÖð’¤;mY¿x½çÌv\ŒÂWBÅK‰žž³í’ÂÕÇ™ÉZYC¬\«â0cÞÚÇ®÷5xðþh½¡®Jïýê+k€ Å€o5¢Î;cEÙ=”J%)<,œ·å§^ŠbAæº ñáÖ&Doquòö\?'WƒBL"Z¶F¡•`½µËÇD&ß EàÆeûÔ‡ €ÞûÕÀJ çý‚ æ•’Äóå\õÜ‹`vê¼fãµ5ÿp¿êÕþr@þY` ]îg×|VÌ)7ÁÃ+}ôë’¦Š¸ôk òêp~P0ÇZ•.D@E¶ÕmQÖ¶aVZ‹Y°­hÒoiÿ† }:àŽ½ž-•Æ›•©<ßôÈ °‡àåÙ/í´(‘ÿQø€ Ìgë|×_m§ô‰Ð/¹øâ.0Y_λÿ8]¨k¼BAæØ¡ôê\?Š6Á¤+fÁé9èHù¨Únº.‡Ñj×vÐ{›W e;už«[ƒLPì÷‰1è#XÂâ»ÀjA vOQ:.SÂQº-ÎÁ¸ëŽN-%ƒ ©ˆöŠ0Õb0fç¦Éõæ4$MãëÈy -Æ+ˆu¶¶§ö§`IpÆZ(¢¨f»Ô6M¢[kÆ~ñ&›CÿgP_û-<À ,½ÔA„x•uß@w£[^¾lIC› 9Ši>=8Ì-:œ;„˜Wžìñ12Ñ/b…2Õ¾c÷Ü´L“N9wwç4âZØ [¬bYOC‘3®çtøm…e ±UÈ=;Íä.¯Kóc°8¹ÒCœžÀ©[÷sl1²nÿI›®§Æô5 \ØT>¹ ƒ¶n£í§RÓì€…ŠŽØKýGaûMŽœÙTf„WØz’T— À“:Y¹IM Íô "VWŸV5ùÚîßAå¨÷x îÞöž^lÒ<§©Uu‚)hz{Ùk–š*h¯¼±ûH^'XH:u´˜ø4mŠ¿Í6éøJ}íδ Í¼b5À¾04—­IbKMNèÅ—Ähß9#Tª vfçìý9PþN*Þf+’qïPUþÂ0dÑ™&¸Y¢­÷ó™©Ç§GHË`oè…rÙÑÌŽ¡œ8ƒü­ ›Xrt7^¶“'î¯æfŒYâDëwû˾e}Šàœ`¤ ŽlaMS›nˆ&†yÊCÜÙtR¡ÇÝW´;ÊÏê^pk•sÂfbß³nôý7­ôþÝ\ÛXxaA•N›k±8º`fÊxwbR5|•Enµ|»N¥$ÜÉ0‰õVÕ—îxÊ*‰ÂØÅ›0èi!ú±-Æ”/ü‚·ëû’@ÅÄdÎË3¨¯-Ê()„ï4É¡)0=(fÅLÏæée;7¤§ÚÚe’à¿Ûƒ|7;p!RÇQP« _IgªÁ[Y÷:÷IVæV|¢âÃjtKÞ!OÐ1MÈaè׋—ÕánPι]¼Y»éQžêÛKè¢`ô‰½âMN[ÒÏAñÇÉàXµüÒCÒc‚OÀ7âa‡©ºEª!k÷Ã`y<´V(€€𠮪0sf…‘³6?´_.5–Q±Î]Ýwº© ñ4¶cÈ«EO`dk[ßT4‹‡JM'ÛÓ[IUW­ÚeëäóržZ¸Æ£Àt‚m]³¶gppcžçYþ®¹séiâ`ÁRÉÞð„§ˆAé( ß r [Âõò³[Á [’vù»-…©Ð—úqã?e_"yÕ¡Ë'J?|Еø¶<¾–ÂÇûÀ_Òø]P8>úÙ_ÔïJàÉ-îðão¸)ü"ˆÍ·¯\Êw?ÖövஸÍúVá‰Lg͇+d& I)e¿ùD˜ÅŠqÿõ¯Y©p øl«äe!FP7Gbßç–òé6yÅ>¶ÝáÄäéäLùsÐÃ(¿ÐmÛ"?"¨Êë…bègÊu®!Šì{,·<ž­õ–ÜÀ$ŸÝ°BÑ1s¢ù:~E–M3¤ùê£:ã¨8´xy{j½wtõêþõ®Krµ»WórÅŽ/5ªE Z²ôEäTªzGãø$é©Ò©Mÿ̺=UKIP0¸›”V¯v“’ ûõ€Œ Ýpv#@«]ˆÂ áŸ\Msê&ѱ0‰]X y:[a°»~ºa`^œÎCÓ(Ê6ùCêÐÊÜ×c a5 œ¹ŒîC×è7x†Qà±êÐö£CÑYt*ÈÛy)ûµj2— Kˆpfoï˜Ð›äfj‘ƒµì¢BöÎPÒw×âg(d6ÉtQgæ#"hЧEèƒÃì7 ãÁ °§È7딯 ¬#›J†÷ø¹†Ði{Ì™6¡qhÌ£Qˆ—èËŒv!,…Å~hÛ ­H” py^ÿ &-¤´J³Œ™LCôÊQˆñÒ ­å$Ëa9¡“Rö¥n³ŠØd˜ºÒœ«žVÑôegÑ妣9Áw¤ªê’hñÂâàÃ4Î Ç/DŸ"žî.TLÄyÄ•†bÊ j›¾ÃFnp/6ýøOYDZ@ÿ§ð]´¹+?öœ®ýïsxßíß§ÕOþ2q.ØŒ¿hŠþmêkojï¤z%p÷»q]¢­VÒB¯'ÓÐPÑe:^[M \°<”¢eŸûÍÂbßüiòÄc-èzÔW«:‹ž–!Î}=÷1{1Û¶”Ëä·û¾çìÛ” Éûvw‰Ç„G\Eöi7Ïãñ°ŸÜ¹ú̙іXäØ23ÙS¼—ï†á?|;¯&(ë¸5žýü¾9ÞyEMH‹ÙN_Åñx;œòf=‘ÔÙvÛÞý¦gjˆðS™ßÚ ýç¿þ•ìùÚ¢y‚¢ÿ£¾ðïûœËBž×M#ºu#ú?ù~¯cR['­Ìâäø¿/{.:?%Oãï®)Ê¥ÚßÚcÑùfÍ‚ÃÁHÇ:/ÅG™ø{à[…ûðþW‚½IA`‰³—ýk´J¥ Æ|”££®¢þDM°~|ãq ™²ýÞ“±Oð»&Žú¨ƒ_D‹ÿöûú yÓ/;³€'Gõýù}W~žxŽÜÐ?o<ŽíÍÊÿž €OØ._>Q ?ZßWÌìõ„Üq90Y½ñ¶1Ff¸{LÌ5ïÚ«»Ò Êd×:—‡ã\9ÜrFò­¶Æp¨:Íü¯&Ó¬ ±MT  =ø›U*:‡kî«îÑ~ä]…tw¿‰ƒ…/—Á*J­(:}X(È“€‡ÂàjÈ“.eþÚrÓãy8¤ž®-ã.Ä·Þn7oÁ²0nøf4X'}†Ü§Ó/=Ó?>~–Ò¸»fÆž²ŸfF!aÈîÁ±¿Ä!Mè `ÙžÐÕKX\â7y^¥|¯þ1bÃãæñYNgÓ™-„L±†=—ÜùÓT¡ÛNÍKÛb,”ö™Z¬š×…9A‡.ë‹äÃåÂîldÎÆ|ZÆý÷G^‰>×L“9Ïta·›/íaÖo.ܸ¥©'CpŸÌ˪möå0lo Qnž½Ú·Ï‹(Ĭx±DSö¼—7ÎÁÒÐßü–¬¹ÔúÙ·¾ Ìlò&zG&·¯ÞµãSÊÎZd.7v7¸€a$r}àkú@ïÖ—5Y1/$âÀö]q?_xíšk¬wx:Tãþ58>›5 V[sÚ¶ÆçáçP¦M}p=«Yù­–#+×16.º¹,Kì–Ò8<„зšÆâõ²tÎt¶9ç2‚KœN’+ BLì6K"¤í†Ò ‹ë ÝŽ¿vyR¯9wöNsú:V;Óð3 {GÒT LJ¦u)0åtÎ[³©º»OÆRLÑêøT"ø¾7xð6€¿5Èñø§<|¼N)Js-/zïJºÊKDm¦ð³wæFÌ’ž÷«¨pš¸GI>HŽ~â©ñð¡L•ªÚÜ"zþZÔ6ûFí/™¸Y}^9bäúñ‘è­J¬h.]ˆg €®JVîÜ› ô€Pt+°S<*æ$Çõ7 “ÌÛ9 1µ f?F‚é´Á⸹fu9©ô ³^;uVN˜FTÌgNøƒe3øÉ¬®’ˆ<ËþÊ9Gšlòˆa– `we¨\óCéx¢ÍÜŠ@ëó›»S;sµÁÒNñYàÎú Ñ5…­î÷É©¡qç³ðe¡ª¡Otfù¤Üs_º¢ÀRÓÆ!hÂä¦pyÐÎ?P æá|ì´­Þ€Íd?¬ž@Ò_õ„òo Ô<‹»i–lcµ§¨Ï´¶J¢¹ïQÌF‚ä(íh‹º›Bw—›”ÞincâXàZ2¦(Zûl†Øñò´­é¨ÚA(b’d§Íäxà܃ŒæXh\Ó ì+¦hÁ;26ªþ± L^¸ïò‰UÞˆ„H>©ÿ¶wìKúŒb€f1=ʸ:Ç«iï…NcE8Ý„·ÏÜRŽ~Ak¶aÈú«I,T³ lÏÛ»/ÕãÓlB.²íòsãÀ`$ˆ`¨Ü-xÜ4fcË꫇ŸÎk]èq Éypd@ÀhëFJ¸Ê–©ã¸§÷ð qñw/åAv'´ E·YAA¶òÆγ¬©a©#N»!ËÒ{ëì Yg\òÞ­vî\7½Û56fJœ¡;¼xnù`ÌýNü £Øßø7iæO 7}t«ÿû^øëÎ*Ùú_Kü“¿iý'|X°ÿ=sÁÏ7|k<¸¬rÖùÙ{` ®t)'þjwïÁ>¹·ÿ`ÑùS.ô—Ʋ۩ˋ§NÎï–RšøZÀŠæñAÖéÁgýøò½ PÂ7ì¬)ÑgZäûçýÅ0º)U‚¿”¿}_ð}r_˜qð/œüðçë¿]•ñü½ájßõ„íUö¨¿—ûFHº¾vwÑƼm?øÀþK&ЉÌd¿ë&Õ5‹ìŸ•?99u;f=ר{ÖX¸%ûAwi0k_¥ÓÐøG?G#ù·~;fy1ûýW¤>UÒ£Nü`°m秨㯾;hh°5×Càlq¿3ÇS}óæ âª×&bR¸Då~îh±ÌÄ; ŽÕ{]6Hܯ«ÈÜi]&8̶qÔ÷rô¬À$Xló`#9¿méÝ/ªB3 {ÂA`ŠY›#M1Ä4ç  =€*­T\Kt`°„ø%Ÿs·h¢Á˰ÎÒG¶%?t:7ƒD²:TkËcˆVïá^.HÍòb¤Å—]êl]¡JÊ´û+åá•íyè\³ºðô®Âi+Gf,¢¹ÂAofŸÈ(âú?¹$DW±í|Rý·yêO&ê[­3ÎΔÓg"À׉ea3KˆÇô>TøGˆÆt[[Qöêή 8?•[²E®¤×í¨ÎØq‚¼¦ ŠŽÊXÙÖÛÙMËm½J@§×w. hʶ€ÇÙàiw÷!ŒͰ2šê½*‚û˜âqŒ'Å”¾e¬ŽÄNB|úÂõ1­­5ÀÚeõ»¸ PŸœÑ2•À8‡'ý!ál,—žvLl$`·8öc"ªÁ{­PBÛŽ´oüV ›…(¨¸NÕ‘=(ô¬bþpq› ÄТL•xÞ=ݹ2L~»Ø.mãúý‰•¤@hüÀU‡[J‰º$³êšv2ÖUlãú­CWñx2+wRE·\rbGœ÷ˆ¤?yÖ.JàDë:%áV“<¤LèÙAD 惾‘h»YÓucTùçVÓèþÐCÓ ƒqœñ{«ÿy‰W0céÚæHeH>Й ÷žvÌó¿ÑXf«ß’4Ðg‡õ£>jEžÙ“ ã{˜b¸…Ò­2“Ò׋Cªó”&ÓwÒæ$ã7…•~§Ï`¥¢©#8î^_®5ô>ºʨœ÷6n°ï¯cbÞ8¤´’Þl/q§gtýUÓ?ÁÚúç‹Î‡%Á×ëÓ§™×î'>Z'¨4ï2ñÿ TöäÇœ+“Dj<Ô×0*‹#·Ú1 äÝ·Gÿûk¿€0Qïß×7.û_Å¿þW”¢èœþÿ<]¾¿„ ‰ÔýöG"ðŸÒyÓ¤‚(‰ŽóEÏ>Î.Z)  =ïÛÔgèù¼6‹lï+m'I.†ø¦4òãPÌÁÖ¥ôC¥QgÙ–¾íâ æ§Î0,»'z¿£S“ÄqYPfšÜ¹E­–œy¦U}°»³7¸€I–£æjæup'¡Éük[‚w;nÚFn›þ¤£ ÃŽ—|®¿ÊŸñ’ܹ`£Ÿb§o™ðŒ•ŠR°ñŸe€£ÌÀ¦ö/£Ç©ï4;Ý5ýSX©çÕÂÛÌïf†‰Ñ£b©7iÅòXà)C¿Üï_à$;púŽ•)“Ë€Ð4œ#›(JhÚÆïyGŽüòÉÊ0úÛŒ¡MD³¡¾íÝ‹„ŽÊ¹‰îU,K!}ç”âÇfôïÌY£«Á®¨ó\L]È^À2üÚK™øqöÁnP`Î;î‡*rïsËô{ɸÌYBÏ^ߨ¥6¸‰­¡¡½^CÂ`·è…éI¿ì-|ÿå˃èd®q^{§ MBÅhÄ$!"Ps‚B ü´“æA‘g_5m»CŒ¨Âæµý£ï’|̹² C¦$¢Dh¨ÃS¹ë‘Õ|×2–ÞG1xg „°|^âe ¦E"q:Rƒ°&îj-0½d¸ÆIÃ8µÄ|ôpúùvZ¶I.èAjÉO³ÕQŽâGí~·ñF ß"w™¹Â³Xi1 î0DÆÂn*È͉¤DzAÒ×#þJF]9â<|â·Ž+c!=ékšÙäYísi"(î3G-m á þ7*¯7¡žÉZ%}Ø`áR•ߌ440ªRQÝF·BOâL8UãS"X*jµŸâlÁÔ8J'™Wðec0.?ºøµ„6%$Õ‹é#b]¦^˜ ¬C͇‚ÎÁ°EŠŠ#kã±#!]AÏp”Ò| ±Þ—I‰É½Ãõ´šÙ8r#*m¹g/ØžžÏ˜ê­Êó,·b¾@êŸÓWž¢ñYñÿïöbe–ˆ?IC7žCˆù®7ÎSƒ±H€´c8Èh´·àríØž~ ‰ p‘o‡Fr¨ ózZ÷ÎÈð]nŸß¶1«b ›¿ÂDÆ›k ÊœÄu'/ôÿÕDþ[_/OHzÍõñ‹ç6r‹TÆõxÔ[ŠÝ•ª¹9„wb¸¼ù3ÖýÛ¸,ê ‘÷C )Bo_&¡|¸Œ„Kr1L{­¶;Ö¶7ï±ÂwÕ¶€ë”¢¥%äë›ÇÛ®!ïÊí²¥Xäó|Ôª|Ôðüä´tPÅGLJ,gþêý‘ ÊF!ðýGÂÛ‹Á¯ùöÁ–žÁ&_úä¿n¶ÀïúiòOHŠøÓ»úî7xc[ýÙ'ÜLlø EÓjVO3z4e<—øÿy|æ8IZß…/ÂHÀ!f¨Æú?^tþvŠT5¾¼ñ]ß7~Ùïæ›—ÃçOLÈ4{;W=Û Ýú&1ÖZ[B—w ~1à.~àØX·#Þ¾Ò·`¢½pÜnÑ;’l qÓÆ¸uVÔI¸Ôã}¢˜ÃÛ{†ûÔð&žýáSfÕ]¸ùfOœ˜Ï·ïßEsœ7Ÿ/  iO¤ÍŒÉÍè¾’NiWOïý³Qk!“ ýè‘P9¸Ã?€.¦š-§%º¸Sü#•µ§|E×xx°(\º÷*q2TF6~bÛþ׿l&÷Á±jµ¸R£zG¦P†}œIFë[ öF8jÓ¶áS5ÀÍyœµ³Wñ ’)k{?ËQoޤ]€©Ötµ„“Ðáü>ȼy¹MÑͳ³;cv¸Hä낾ûà'#S08‘Šªû)F½™Ü¿q»\q´/¹’›A|’Ö¶ROTìß\{í ‹ô’[ê±:¾· ÅþìžÞ Âþ®4Xï^½Åá}Óÿ7ŽÍwÐú+[•Ç)BKã¿Vt>ÁwõaME‚>sèzú;O–SFí¿ðP´…³Å-‹Î–/FxúÃîghé½[3üa0üaýõ‚—x[1hõ}7å¯.ôïëß׿¯¿Á+£ÿŸdwÏÏ.ÿC"tU…G€ÎB‰ÚÔfˆÐîHVÕãBx·U«MùX”]æP@¬Cô ŠXnÅ6wÄ'à²8v@MR¡’ê˜ý7¤/=“ÔøCŸ}♸—ª D8WÔŽö¹ä‰ey{‹á–+±"zBå•„"CQ´”£Ì­D‘cÛß– ¼'_ðñ¶­àV•ëȳítx“*óÀyÁ/Ìd“<Ç$@ŸÃ/â MQïàØg«*ÃÃ!Aü^üრºs©gÈ—·NªÃ;³ÉÍÇÔRKgU"à€HªwÜàO›âìò¸žTËnáÍsz|xîSxœ‡1­±7Jk%›»0OU€`Gþ¹âû:jí¯å-s)á¥æµE§ˆŽôÅœNr/‚·ÌŒNÐ÷º¤6C5W·›9 8˜—žïLÁ7(@@Pˆ7o9~Oàœ¤tÄ¿¹t&k\KƒÎNY»”ÿš/B©tu·½Ä¢¡Æ 9î¬ômÂ9´×œž×Õ/ÇDt•‰þ¦°Ì\Tå^Ó’X2ÑåcéXÀ¢üf>m’‚âš#VôhÿXí‹NÚ%ýßÙwï¼s%K'=yX°J£Ç1UÿhÎëÜM•;Ó2€¸æÔñ#,¥¢UŒ¢€ɾkûˆvkþâ óÆ!?ã ]c”lñ£æ„ÿ—jÆn}çe2Rsº67 ˜q–ùªuîƒíMK£"IY-E·3—¹bøÓËKrÝŒ?D§"ÊäFx«Óûnª‡ ©’.e¶¶c7o“„hiÉ‚ÁL^Ô÷ÌeŠÙ?[§¨òíÏfZ¥éCž6?± úª*î;:õS„-‘•¤®ù»)ðºhô]ÜZ×ÂÇåó|?Rƒ›ÍÚûÝŒ;Á—I…æT=´]}¹’WL×s$3oÆ2ÿ'1Œ¥ŠÄ¨äåZ²ð~¢ý‡Enÿ±úO¿Y$¶$•nœ¬ÖЪªŽEø¼úhâU~ëð·_^K7›ˆg;R]o¯Š¾ÎPœîSÌ«;ˆÒìGìÙS:¸Ë@¢o28Õ½é‡OÅfåHj)A’ÞÚÑ¿g|P–ªÍŸñ·ùYãêÞ2ç>1¸)Ò×9Žj+¼ŸE$ޤdA¶Ã'=¿˜$GJ îoìnÆ„§¥•u }P+ûp8]n‚5n8>+?ZoET¸Í»ê£?cr53ðSÏó¤‘ÓSwKÄ!'; <ä[òG&æ²ÓkV>¸Í·mÕŽÑóHó+ÒÐk䀕¯$CV‰F‚Ú<‰ú¥ü#o8WŒ;®¯s¹8v[~ÁóG¯“¦cÐû€†ãrÜBÿ[…ð°iè"ÌDšÛ#7MÛŸIìñÑ@ +<×-ª*b«z~öÓöðƒv—ÈtþiF‹JŽå€“6L6gÓâÈˬÝSpyàÝ®ù,yr’GàÔKWÙ€-Ç*ô¨”b[Y9´N-GØIƒ›\¦‡«CzjËïzQS8TK’“$3˜éto&Sÿê Õ¯–17Ìè+t ÿ/v 8ÉZž—š9Í~¼‘¶ ®‘ÇžºŒs²i-Áb¼‰¹d©>Lº.ACK®/~/Ò¤FƒºÏU¦ø¿?îi<Þ1,dÂÄ‘Ü/gIÌâ6µð¬M ÿ:„Íìbý·UHÑs§“ ËV®‚³0>úyPp™fY‰yjB„q"XºçŸX,0²À…-{§¨U¯ïôJåOžàs¸é9wฆ'¼OÄ<ݶ㠧¼£o$_lÊeù{žV (êNÿ‚©šÜ»uÉ3ï <Á>JÖñIÞ–=g¿ß"sÃ773PãnïA· „¿ßv;|úϾ«mða)Á'™ÙóØ?/¬Týñíñô+Ä€t GrÔ77ˆîï×xŸ¬KÀ¯Md*@ f>z—ÑdMœô–7ÃXǤot?‚‰hÏ‚@£V”½EÿoТدX ·ÖNpö·ˆÞÜxoùµöæ/h¶Í»ÖZË–¾o'žWX'ÑùÏÖeq'~Zôé³ þvƒÙÓ'†~Òýƒ(®œ[¾Ûe𱶦 (o#¼ÓRdjß*1ãä&Î #öX©Ë;wâ—òš2E»±7i ·ö{0ûØ€ÔxÀDXøˆ»Ô5ûuŸúw`6Dé‰g´ûÛ™ü2MÆž8¶hìà‰Ã˜EÀ ()1‰²¾’ǹq€Ò ëƒ3æˆa°aiÔ­+”|[ è-ò¼&–4q[È‹Íù§:Ö¬ 7~™œ|M¿a7¬ûÿ±åoýÎ2Miç0pÿ»^½“—0•ºÏ™Î;ÂMðbmÒ×Ê &X‘EM¦°=7AgÎÖK—›]‡výNŸ“æƒÏÑ@Ži ]­ŽzpÀPÑŸLÆà¼š‹[Q-É8þyËrÝó —Gq‘­#Å€q‹Êh*j“Gª+¡ÆÙ>ݸ/d‰ÊLŒaz5jwh½aA’bH²U²y·—UÓ‘ð"Œh4¬°½˜£$£¹Æ tA×Y•ÎÔ{¿€Þz·¢¶= OãÍþô.—ñNéЃ°Lh”—ÑXKt ³Ðå!d,“—øÑ–¡Ãûà f_,°:l8‹‘}O6“<–¢¼@Ì:ŽIsW/Ê®»‹˜ó¨O²›ê~t{n©YNGŒÎT÷[!Ïðk”ü]“×xÊò¢Y¼×x©¥0%UœI*Ô÷Æ'´\§-HQjv:äA/Ôù…PH¤þŽ6S‹0†nïÚû‚ÿÇÐÊí§ìp5çØMwÑ3?š©l_o}4õo¦ž0Xè’aÅ“ ß7 ½f ßv¸l ^þËÖøû©b˜÷ÒœüÏuuïÅIší£©~‹¡˜WüW×—‘„€¦#Š\ •c<wÓœ”3`š…ûšRPk„² Ûòu^L€§pÐnŠD4z_þN×*¡_'-à óù~±ƒëJxn탫àžÛg€2M1¼"¾ ļý+>8¨Žü 3±òžðÉüÖhÂÙ[˜_ÚTí0P~ò‘ .Œy,ÛËaê÷ÃlÏRŒÜêQØ_‰Ž}¸Ô“òðÅç†(£Y/h³0Ù”ÄnºÄ,æ]>3³ÌLmŸõ©{1?ç÷lÅÍùêR[TèŽ #­N`=øA“,'_ÞC¤XàÔýo%áÖ%Úõ 5.­ö(îó¬ðO7{l$z”†þ¼ð‡f^~7õQA%¹í{Ý Í$Ûp·‰Öƒ8Y=똂Ú". a:ºN"Æ®‡@ûWèß׿¯__:i1xëkø®ñðãàgG÷ûˆGüÙ}-âÉaò¶ôñs¸VÃ`Ú-nAå]sOñÞyYÛÏàݮǟŒŽÄfVo˜ÙÇtMï°¢…ecŠ áÉ‚ÇrU?šöF3ˆ…JH¤éÆàV¨°b ÖÃPÞJhjú§G*_qâYAt7L>úýüÒÏÅ7òu¤±ÕìŽSì 8ÕÞÉ“o€~% sõ:ÏEÖÈþµ} ÞÍYŸˆHæÎ½ð¶N¿:@!ÂYœ`vƽŠC[*N }fHhž˜RÏ07‚Y‘µqVÐ ^kÆù‘Þ¸ÂdΈ+PN½ÝÍà)êi€"øiº%«\ž¾‹4œÉ7\ßOe‰³t½ ò^”¤»Ê7³¥ÿ’æø®¢zý•» N6Õ¤HÓÊQ`6åƒ:¬[µùâ¤CF…·ÃXóál¯Û=$1› ª»µÚæt têÇi8qÄ1æ}]eëWûr3k«]‹†ÙAæjÕâÕÚë€5Ù4räì¦Á37:çÔ1o·2Áq½•1ÝXpûâSìRàý}A,'SgËvk.Íá;`v}t–ð÷}בinÃúáH'Ö„„"TCxƒæè‹¦ÂÃÆ`™KÒÚhWèÿúP>?nIAiŸËÚÖRaîñj9Ì –ðY˜Rœ£¨¶a#8q‰L[b’šÑ%À(C…ŠŸ¡RãÙH®¨É1ìDiB&U߬,=ø)TïPg7,Êé·æò£³È&§•IðBÂS à±;¥Fü[À»âv—DRŠÉÓõü /·c’a.ÃM3j âZ0w$í 0û`ê®Y=ëBId†Ž€×V*HŒ( hgµBŠÔ³KY’ ð‡r 0gDx“ü‚ÉF-•…×ïSÎÛ,dõHç (•+sˆ¸ºÔ\W²gnÔ¼ .ÚuÎ ?À޵“Öp‘àp«êõÓä¶ÝÉÚ8¡žKȦ‡Ë}Ñ>­KTYxó°Bp{ÿHÑyL²ÎÞgÜŶŠá÷rš•«Þ»æ<­pkÕné—{3·žf6§ìÞF4M›8g ¥>LIF&?kÀˆÐÀãŽÊ³Êú %þ”š~A ­|_½m,® d±Qx7¹P=?œÐ%gú3^šN ž&Ž=Ïv*èêvµOnVù9¢ü3–XÈclV{æ-ìÄͨò W.„àð®àNãÁËÙO›œ°;qÒ/ŠǘÛ5át픋ü ÃŽmOáç¿Ç¯©:9˱ôŒº^€ï•áïwkê¦)5.71¹ ª¶îô œ’=J•·ëf/‘Ú¿ Wñc‚ƒƒ€ØŒÝZ×· èžÐ²F¸¸¶’Èд*Bq£†ÌÐöA]j½Q,È·‡$rOy) GX›\.ƒ×†ë&5‰bêäŠÄ[¢EK-;)›‹§oféhwD”–psë(ûÀ1ß(sÕ“áÈ'—-é‰ó,,–jG÷e>ÄTñááò ¸ÉQ·öDÃÎN®L'ê‘ààUÑ’¥üTšÌ>ÒqûJyó]YÒÏœ)– '¸7«Lᯩœ¤{"Ô÷ü™wt6ˆ7»ˆ¼‘]„ÃêÆñòžyG™©»½:Ÿó ³´²–tÊ)ÔÂéNç\{• -·ŽžP>¦ýf˜á~aÖ•è³´æƒZÚ8®*4ÛùÅf7 °†öjíõj‡6טŠÏÛ“Žáä­=»9b®„E|G¥ÜN´á=ÿ´ð}M]áq5GÒHùù2]NSõá‚…[;{"ëÔuëé9ÿ•ÃÂ¥s;”Î^À˜f™ì‹ÉE¥ö¿h%—9W›ÀÁº„[M2—îÛó×µ‰ìàtP.Î~Ùå`,5$žœ:x–BàT!þ¼—-’I<¢.ª]M“í&!Cà]üM¢“e¼OÐyß·Þçbr([«›uüo5Çõc ÊÑÿ’×>¶K.tºÓxj|—ÎñÇCÎnz†o!?$\¾ø=ÆE] gXÁqDï&¦º­àxdÝšˆ>ëÀÃôøÉnV÷í–þ´ê¥OèÅ6¿K†¶R»=ûï‡wæŸ#:ÿвJq¹Œ©‰x·èþã¢éw—-^™çÞÓâ7l&d:lè™åïÿˆ4ƒåÌ£Â4𠩃ãqt•á–0“Æãß±Dò5ܲDŽ¢§žQ·U­Ð Xq¿n–tˆ(æA²=¿Uö>¼ov S¬¡Õn€” EzÆâ¨/DTKþ q¥úî¾c¯ b7ÒxÞ©t"ø„Cé\ˆ%Úï‚ÎÊ—ú›mÞm2u1‘º1·zžòÍx*NµVÊí¹+žÍÎÀ2ʈX°[bÁìðy&?Fk¸äÊ]îÜjÐE]±`Ë·ö‹<•,ÔÏÙAÐ %ÝÌú=ÀÄV.TE¸2k»8=kmÿ(ÒÌúbhÐhl××VöwU‡þX÷Y¸Šñ±À>?^t-Ö»{_Ó¦Žû .˜·pcûÌ!ÂEÜ—o§2ËtrnëZ¢žr¢`á&T^¿SŠ7Õàî§b¿¢Jƒ©dTÚ;¼Ò·C6lsô,ÛE}¨a{òæ+˨%·lÑfzƒ +np/ë›xß¶A€§6²shÖ]ݸq|MÃ4*šåT@jÖöõ[BlIùäAŒC:SløMy Õ `VÓ®`vòÞ‰V{çÏr2n³[!Œª2fQ¡™J´á©–…ÿ ¹ö“jŒÝ ¤?GBÖ¶Ý Ìs‰ÅNÚ|ÊT²xñ Øîs+÷€Z«s]z¹­½‚»éDÜÚ`“ú?1Lcï—4zïh1ùŽû¾þwOßP;Rlˆw.‰p“DˆGøá@¡ÍèÂ*‚ä»m8ÎÎð4¨³] ÿƒøÔ †ÖZ{µ×«½Z›¦§´bä ¼S“*A[›H;Þ“@±ü ‡¥vQSnǶƒeõîÁź\D£Ǫã&¢xÇ€-}È” ûq¹jT†EgK"ðüãnž3¾ïvçʈè²È4Å`\n, ð“~‰xn J«ñ6°- ¿¢Íª'oÝNÿ/ÆFçÑEû‹ÀKýgOúóœRå÷å+;IÔ‰1ŠäDÙÞøv<ë[ïÿ“åúVzôÃEônƒÇ›ˆÚ0ðxàgw‡QéÓPù“sb…Hßá¶SWaîŸ<ø÷ÝŸ{í”»ly¢¨K£¿ºº‡V³ü‘›ÑÄž.ä¤ÿDçï׎þÖxàWÆŸÇŸûd͇Á UÐ í´“ŽV^®f‰í%ª|ä˜â‚™Ÿ0Ž)Bþøztùë½~¡ãßßÌHð«BxÑïòO02ôà5þîÏ„çsw‰|#š™Áº½‡¾n|?H•ì™…ã\¤³M[4išPþŽ¿·3TÎz3'½ñÂ)èNeKÀ»SÙŒ Ê“âŽü2^ çæ+îò;˜Hê ã„X¤I¢ÈŠDÔmÉ%€sJ^¥‘%BÅý \¦Œ}MÆÄJ‚ÎÔdFžpÚß %0ëQlóA² úoÀªž>[5¸hÚt¢pej`U­¯àÇ âr#d>·P""Ïv†L@ v‚å<‰çôòÚ©Ó([§°·ê 禮 P‘qÄRR®dE.«çv‹Ú´TìÅüÔl «=+ÆN?”U\ií[ ˆ(Á™·å;T¶õ01•!ô\¬—h5u:jÿ d¾&/Buø¦ ? 4g >¶al!K¥ç2fê]M÷ÁÍO Ñz 5ÒpÝ4¯ŸOqÂ8’Íc΢ï,b¦cIzq4sV±=òSw!*º, =ê¢MA…zM!Wh«X¦Þ´èšÒTg8¨¹Ö޽ÖPÖæÝæWS ³¡{™èˆ¬ DKfÊÍ`—æ? ր׫½ÚdÌŒ©¹—\®ë¨Æ¡së z®/ÒÂÀö0 ŽIbõ¶È4rZâF\wj^•=ÅUÊ*x (¶kÀ¸ï~p»–l—ø¾O¡Õ·ËZr(&>bOjÀ>!ƒasðù2¸ƒÏ=v8妊gSÉUp“æHC+Ó¡-Ž´ø*pAç*ŽéŸ¶ECI’'\ª£'"‹CP¶¬Ç—> d­“e x®£ç£áE>+¾y¯¦’àª0Ú¢žYAn¥Ã5ä(\u0ÈOÒ»‘5Î4=yŠ@HYFu´);Q÷åt™ë0JG¡þ`€Ûs×I¤3}-QNœSS`_‰˜ $™èQ™©,’ˆMµ­fé#=d)uÐ)ÓLã{©” M¯"~R ,}GVgûòøfB½®~Zê•—[é¦gpOžs/ÖQÝ(ª—Ä ¸mÌ®=¨tÕ—ÃÜ}ÛÁ{ø¤ÿÐà„Â?o~üõE矚èywÉG(|q¦ÝÉÀÜ'žÉ»/áuß<¨'µÌšzÝRz›ª¡Aýâ„a?\ýÈJjú{iþì/òÀ¶[ç¢ïöñ^œðù1§xû;¨‹â_¯?fþ}¼Êä|¬8ÜÙí#C~ßz}Ô`ðúòÍ~*ŸÏÛ–CÕ±>R“%«%¶.g5lWÝÙ›k äƒHÅÎx…f֡殫hvTYÂà.|hâ´È5X.b’¤µ6bëE<'‹eÜ.”àâ^”é¶à/N¯à~©& ±$^*幪Z`ñ¯Ï3›vÌöœprÓê{ç–Š†‡0€í5¼2‚¨,T‰%=å>>/=WÉR VÔ§©nc’>É*¶qÿý¹v„Õº>,ð²Ö,!ö·ÌÞÃ*÷UQcøž—é =èµћ*;:ë[3WVêx<â:IQ2 ·TàW5ƒÞÔ¤eD\•ì… ¸‡éø<œÞ†ž3Yèæ\šS‚¿»­û-™}SÓìƒ ¿x'÷øü‰ÔY«‚–íq?:‚§W¬ÿdÞoføXÉcÉqTÌÛüx7¯Ö¬°“™åѼÙFqÞfØç<“ôìŒZDvúÔçUs ž¤r$Ýúð€Nø¦ºBZ˜h6ë¿=K¶iî—¬d„Ï)§3ÕuÚp«â?h kü‚,Â;BäS½©hŠ<;65^;úpv»Ýk6p'¡“·F"¯M»þÜ|MË®iLðÔeÕF!|ÈEá´à›ðÔ†p W¡Vu²ž§ÆÚ•2…£"6µég_(GÙÇ1ù-â ñîá‰ÙS´Xâ*J2 sÇ›D½ùÁáH*¾cnJÆx‚[NÎy\Wu•ô³·õ®Âñyl˜Ê“¡P!wm©3a¬nšÇ#,v¤ƒ«>èi`j/,ô'aœ"àªêÿŸ×ƒkëo”à´ŠQâ}^ô™íç^ƒ+=Óì>•D¦O´»žZ\º©é‚3ögý×ú˜¼8ð7]×Å“ŒÐKöúçVºÇòþð‡ÒÑ:6PöP88w&,ýaÆýýÀ¡7£/I/^³¡üî_úç‰Î¿iž Nœýäÿ¯?ež£z*܂ϗá@¡î Á¸ÇÏÛ€Q}¿¦Šfg « ¡#R,(Âfm®žs½R0ÇúÍ aÙÊ<­Ö­^Zù‹¾1Í#¥c·¨§í¯ù|n##·E|½&§ž,æm§—9‡¼c:$h#R>Ëä2’¯F7í@˜rÝÅli€Òn&³ìÉÁÿàÀ«Ì3†I·ÈÞ»™øÊä¾a+E-UǼЊ¸Ë±Õkqó³Çk¡‡¹! Q,£†…(0¯¡gl­ib7iŽ‚ø:A`x—¼ýcKpU–½ª™F$¥Ýl–6Ù·g7k—-‰Ñ6¸*€éÌ%,~”Pô‚‹ð¦šP(«[絮уÄ08•hGéÔg2&& ŸëÆlÂ~pº’‰ìð¦Ä2%—ŽX¦3„:V@3~O%/# FÔ×ne)‘×3.¨ÔŸ›¼%@½ô†iw§Þí5/‰h[a—vó5ÝÿÒ+)¹/Æ¥'¥ÎxŠ"îà–u§dcŠSEW%R€JÍâÛzøõƒ‚Ë1ŸêmÇ,™?7I¹()ëDp‘Á&BdÊ0u=½‹G=“O˜á\•›5KæÔŽäÑ¢ºtÀ1 '¯»ZQ0Ô½óÆš™Dk?Æ#[hªé»îŸŠíyLý:¼û¯°$7¦;†ÚÔ÷Qbå"H//ž,Ž=÷ær_Hu°~â:ñZk W¡Û0þóO$U©ºÈüœÒEFVøPnç`\¨ï„T ¸0ÖÈüÛ~ FT¼ÑUŽ‹Óç¥÷nkráÆŒ†9ÃÔá¡Ë.°`ÏÕ áuMol ¸±¨Ù°¨ 0þe0„EF"S_~†ý›¿>ë2Þßu ßû8ù‹d÷ÿYÝ~›.Ãw‘$áô_£¾} À÷[nF>~KH®_o'þN{äÏÿp¢l9ÿ…ŸÂÍàÅéܼÃÍÀ**ðfB+×eI ÷“Ξ?\ÉFû59ÊošøÒ‘€/ýÕoLºVê <æW|bÿYÉâçw'?ùWå¨Ýï/Bð|óÑF^:RüÂùw—èÂA¼%H§øg§I#q #ŽJv_kÂpú’\è-§JÐy œîÎPzÀ¶q›ÿth£¸§Õûðɽ€Œå}ˆAõmÏjL{ñ( àðOPA±‹rðV|~£@îûÖÕÖ‚_¬h^¥áfÈ›ûxŽø¼Èáx[§- ea~xß“­´3úE%˜ÅÃth³¼%:PéJ„±¬™‡ ˆí1i¹àMa‹ac­ßôÏi™a¨”úó–‘€‚ö^oò‚ŸˆZ$ŒlΦŒ«è¦æÅ;©À}sžRÛ•û ?xüæ•YÁ)và.roû„¸ û,F>ªOCÏ E‘j @~ðÃ'¡Ì\÷p¾‡ºöH\g¸;rÛp»z^„‹í£èª—ìÜe54ˆèE„î¥sßH‘®Èt¢åŽ7*Z/@,1½c‹QVQ/ÆöëkÏZvôÅaÁ‰ïófP±˜ø8øîZÓÉÙ,é#Y?p”ò1d¬2¦²BF›nãÔËÐ~5ófØ6ßkÀ.ÑzBÀŠÙ€·òê{îHöòn(µÖ.µŸ¶ƒÊÚà']Ä€$ob(U™æì~BKN–!½Ùô šHÚÀ5‚º2Z±Ä—PÈ‹qË®¹Qá-¨3Ï4— ˜_ò+þèîp°‰“hsˆôú\xë$¥Þ׫l]F;3͈rq'T´gn]ûÎé’_DéND¯[3ïÄ4Ty³næm‘ÂÄé!cÀ" JúåMô/£¸s"7Ç«˜bˆxW¹ÎÍ ·½¤¢ÿÄMFð²äšù¿¶ÒÜ>{2Û”[Ž +õj™¥’”ûQнlÒ«ôÕ¦ÈØ&ˆk—@B–èXªàdAj¯w$c´GÖÀ3àžÔv€`2Œi°­WJ‹ÑÉÍÙý"ˆ²‘Y¿%mñé™êäbþr(Sõè$ï«ñäB`0Oó´T¿UÄ¡Ó1“œ#¢0éõþU¸3‹Â[ˆ¶D*Ÿübµ]Û> a¨ûñDÛÑWoåtzï$õ¿PN ?˜u(ý÷$ÑšèüžÂÜâÂ;¼!ø?{“¶˜x?öá|v?q<¾žÕ_é™ÞÈ-;[G¤3ô¤ ß4Xß"LƒUÏVŠ+ÒÕà›aþ샵0]öûÅ‹ÂÏt~)’¬×„_£Ôôç5,Ÿ=ù_ÙûǯYÑn~ãgGº~ѺâƒÛo½°ÂÂØÝIž´v´póé‡QmE&¶@ÿðêØ£^ìóh‚Áˆ."ªtÔü5­ B™_ ¾…h—%ïSú?¶Ÿ6¬Í$õ²¢mXÍ€ ÐøšÂ)à.<î÷§ïqî¸ñÉžäýò×ñh9Ùýß þãqôÔñÐáËîblÛÜÁ9²øWÂ}˜<žã÷e tÞ`žƒ ­(¿2}y(}?f~ôíh3§ŠIþ¶|¼V²ï )¾Næ|´Jã¥J¢Wÿ¡.,æ õo¿›N)n‚Ÿ°;Ñï ñ», †±lŽšT¼Y@øék¶ƒÉpÜY‰/ƒ¤Ärº¤7|?Pý4O¿½ñkÔ{<àG2·t•-œh•ŃvÁ²#…f…|®&:Ußìþ}`¸RßëKŠé6UX®™À¥Z®)ûTª?nô þtÐl",©KE¨a8ý¶Ñ£)J+‹P|üÝ (pª¾´ü^ð2.æúNp3¹œbUþ˜×È%âLî5R»{ K×OÑc.£x€ „Ó4—ÓÛ_Í5e5Ô&Ûß\ÿj[+cxÀ¾Ó/Ž)I¶èÏ|øÕám~j‡Xb¡"¡”E¡ƒSÊ„k3tÖnî<—8¸û'T1*Š¥ÞÍÿRÉÒëD9ó‹/~x?]s,'—n~1KÜdæF%‘”´}´ÍëG[m'ñO›è 'ìjäž>÷ºòFÄLù¶À|Ž€íK+±ûŸÿ–Zû{ñNkàd ;1júßÅûËm¾5«;ÝöX!¯Å£Vtr;¦<Õ}6'Ž/LœºwÕåÿ<ì C?O©xÛx(!×8‡JöÞµ°þÆ?y„g÷K>ÿY¢óá³tÙTM]|ÿ~:sÞú–[D_ÞMYðÁ[­ €uHñ‚Øh`-|ÒÁÛÊ/LÂ:uzN2­ªÍiVKº^<(¹ìùèr‰q›ÑÜ|mä0ÿ‘ªÄe@TGk^ÿ EŒNP,re¹ÉÃÒ¢¦Ø — ü`<+@UqÅšø&Ê·YÐ#ýr¡Ä1¿l‹ß9ô ,¢BqüVæ•ó ‚ЏV%±Ó3ÃÝÈî4÷¬zqëzÓKŒ#æ­t—~òê9âGÅþHf-føÚø ú€/ÄÅ69Èë’ºrã@Yr,Ž’ ùV\uaŸÔÊ¥â¿x¾º²»Álµ6‹ÃþÖºTF9nLõùñ} r µg›—.-L×®µv@lä0V´Kúª²ÀÕÑ«á‹E®šúÄŽÈYÔYÐ7ÃY1¢Š%¤”›7pòó©¹½}P`— ¨bÄãÏ':<%~è•?0M•oSxq€e…Xk^”:”îˆø>˜³Þ &®‡H2 ˆ»…vžõ°»3< VÐæìéRh¸ct$sÐÕ0ZKàúó*ûç-.ÁŸO”“õg/î<ôôßY~cñò¾À¿…qÜJ‰#3—øÙ×SÓ'ž!°èäeñRêt„¶*}5’ff—œzô!ÕÕ—2[n­ø1q¾í¢š{Óч®„Ð CÝgÕýðú®Ý1¸¼]±¼<øRµ …7£ Ww[9ö{.l![k­áuýÃÖÏÄàlCï‰Wn¢P¢-F©º™!¾{ç`!$ŠâÉ=ì™F¦ýuýRùW¥C;e‚þ6Ð;Õ‡¿;6ˆE4‚î[ª&èÖ=® Œì#eŒl~öE!à]Kó·½’%ú¿¯_?ñêÿÞ‚Þ‹ü‹D«GåßT™* 2– €¿þ·øgˆÎÿ]îp˜­9Í|<"Á¡zí©;Eã2?NÆ!OPƒ <Ã~í@3ôO˸Ǘ§o†Ÿx'sÊwõÍi “™ß bŸšÔþâÝÀwßô/x|òˆ¯¾G¸¥mi"%¿á['~â¶Õ˜Ýw=+>¼&ÄÜH:(M><Ôpÿ½ägè¡MeC1Åªê ¶Ax¹ÞÕë}ý‰vîMˆ>} , ¢#«ì÷Õ½Z¶vZÝê˜ç…GI{#fßbš‚ð‘5çú!œ#%—ÎG©hHFⶃëfúü ˆoðˆ"¤e¬ô‚ÕÈ£&©JÞnåÜÔ ³v:3Äzî'¥A¹Š‘MVH\µKÏš3”¡¦’xd&r <€AfNê)íTãÑ̳±h²ú-¡© "Sžsõ-œŠtEç–vðluìþeµªëzjqSC¨ îq¬9‚%!éÚ¹– ãðp*sýƒ;²í=J,¬@(!!ÝßÜ›ø¸˜º( ¹›¦êGï?Ï-!¦Ó­ÒÛæìÈâtj0ÁÄéf«2D{v&åñÐTâNšy3NGöÙ8Wàiú©¸ ö“'ÑèÉnòuaÓ¾g§nô¾´j?º@¿¡k½)k-pø×3ξÁ7¨ÕkÙrk`\ß[A}Q«P¶Æ”Äá2*Ç쯻×Å!¸KéÓè¬RsŠ®©ëJ !xù6ª7`x]Ge_ô&:Êâ ,-ëfvˆGàç R—Èj÷î.üž\Ç4¦¤BÚ*IFb=© CǺޒj…ºˆÈÄùHºsiÐ/2ÏZ„Xà\Â÷äž"±«'<Ž"!ž÷!œ´'¼GCŸJДg²MåcÛ¤<N.ÀØV?ÊvJê»k#AGBæ’UZoT¿¸/”à*~7JŠ·¿éB)v¯’IL(…ŽÌ©Ì¸†(è(8¯¾Ûò¡¹ú¤Ò^¥– A}%k¶$Ý)i§¦üõà®Ðƒ>`¨Š\BMÈ òÍrõA£|‚ËsÌ­ÒÊ\%/˜¨œz-ÑY—ÀRðM9ySÁ—ONií‹{!„Ÿ0•õH"mòôx•œ·šÑZpãÆr|<Í/“·½*Óã"µ­ƒC¦~øý3zÖEP_Æ«No­V{þ²¥þOPe9qä‹ßÕaÄWoutäïóxøû‰Î›Ê<­àáÏ€ÓÀõÌeqø‚Oš=årööà”b'®ŸNmÞ\©zä}¤jKEQ3ì$Ylã]f[–G_é2%%‚Ls5 ÃÌìG¨Þþ’ò[ï©_¿óÅŸ–ßp øÙ«Ç±}À¿ø­g%ûË?›õ{8Ö‡~}žbé|ÿ¥:¶k>rr‰8ä»-27º‡7©2®{§úK'n")¯þ¿ÌßO…©oº+þÖ8«v *4«Û5*SX?ŸÁ¢w” ˜réIæ['Ð…ÚËw?Îpóf³èºÕ{«°8ëwç÷ç£}Ï#z®ü’Ò7/êD³P5ãƒPÂH×§ž©ÌwÅ=湻Ϛ,4RéÐ ówáT&Uö›å,÷Ï©{ `Wõ.fÔ@oCp:S¨S…‡»ñËúî|4\…Š–,ä~ÉÀŽËPe‰èX8 ÙgMû8wàÌÍw~˜gÔýNË–U î>œíÑ®™‡BÐ9ÁuòÛyúšhó qZÜ€¡m†} ÀÃèÕbaà!äm‡ç.QTÔtO¾O"§ØÈæŪŸ!¦Ò4-°ÒxV}õ<ɤϘz¯eM0¢[kh×lðj—ô¼Ê~€©Ó›×{*×g‹‰BÒ‚«‘eޏ•Ãf¼'¬çrÈÝOÍÂ]rï\ÃD œªÖD—ÎíÛ$ñáþif5N€ /#ê1Îmf¦Ù«áAQØn†á(m_°%¨³Ò”/ô|,ÚB…ÃMZäY¡œê“÷Òçç—²O 8ú}hß-ÿmõ„€™|¡ÒQ‹&ï­R’bIÛÛ3Ùâ 41[™æl§^ô”{¡c±”1}…7eÔeε?8½!}û±H3¢Ì‘oø)RéW½Ì¹¸È{š]_Ø;¥—@ùj ­ÆÏFWì¥eø×CTAñH/Y>Ón³ÚøA‡–޹ ´2õ¹¯£‘sýé=dð7*³…‹eÜ¥5νJ®L,ë£)Dܹ³ñY-Þ_Ügýߢ8u nºDõSöïc¥òcìd ÚY7ÝœÐۀ햠ÿ“;édœ+ÑùõÑÛ Ø„|T§ü£Dç±þkîg§[|–ULßá!ôº9€1ZØ©IöÍàµlÐCR€¦¾,ò&E"Èãì@§—,Г…X¹÷XöG¹oØ3;`ÔR aeúdK«&¾Ç•ò´¼‘é+ß“·nÌ –D BÎ*íÌòƒ(÷n•›j'à˜íMJZõ÷úeù]$ÔcbT¡B8? {ˆ.ÃÔ”‚ÉZ’‚wÝÄzáÃS)°xn\k¿3vÎ TãߨbxX Oº ¬±&òTÙî”ÈKÆshÓÉËt¥mjT-Y6GbStW`h—ž‘†´awö¥e»ºœÓýtú%.ÝD]°ZÁ·ED_È}QÈt ÊkÇ6NÆáîfئęðê¦4A[¥úÔðh@ß±¯yoÇ©b¤£b3Dͳ´3ôD •î8ðÛÈA7fà¡ÜbÅ ß÷Jx§õÿ ÙÆÍ ?œñ|Üw¤ây®’ ¼ÊÃÒ\f]ˆß KqQ ]KÅÝϹÕrö^ŒYÃ$2†ä;a9OÆIKóŒ¸xÛÓD†Ÿµ ¦üW“ Ÿa‰ÉžþöÄðþó'dÏ9Ûßå…?ûÓÕ°qŠâ ã}ŠjÆwý´ÙWŽ~ÃSÓ’ktL¥ÓDlòÐë<˜"^®2 r:¤(Î cþÇ *ÙÑ"ÜÄæ› :/ÝsÎI©ôÝ[œ*°¿~Ö3âîÀ0T¹×yYþ¶f°†aüã•c?,€g[šì]ÅOã}s 7¾5Ç> `ÌÒw´»eý¦“î;Gñ;1Ø®âf{äKÒ%=¦V³ÊV>²¼”VÖ·JhŠù®kšãO+i|š®üIýO¹¬_ðlx—£¥>(ÿÌ¥q@ÇÞ< gæiä÷'pZ²±Ý?céþ³tF¤¯Î¿p²øÖÌö7_ÉÃ#ød {Ãý¿[ެßvÎ|ÿCü“EçñEôëóíÅÛœ­Ñ9­™7ÓŸ°þÞ3R™¤¹Í3‹9†Éœ£åQý¯¼~(ëgLÇR&$`Ÿ(=}2%…úúQ~¹lÍ ³˜ýíñÍG¿ÂgpéÐxóø¾ýSöë"‹O~óÍ ÏÜäà‡Ñ©µÄ§k“YìUKÈÖ¨#„õrü¦çñÄ6Jºga÷Ýés™«!JKmÂäêCGüµXÔ&(¼VE³yq (&3³‚Tï÷¾šJ › ñwe'³c¼„hÉAˆlS¢¿MRá5£û° À&M*ÁŽÂ ã2øpSâ“c¹Ä;dÅhF&ü1Z6pÔç°ä®$§7{+ìOpÍ ¹¿²Ç˨þvUôFEÞ@V#h´ÜáÁƒ óú‚ô:ý—SÁ0Gƒ—Nb’rcxc-±².V*CƒÍ Ô,Oa¬™sÏ2ž~3p0É´¬Ð<˜eyˆÔó4ÞÙJ³#c¿º~»¡²C®þA!ôÏ(8à&ð*èõ&rÂgèIn]ˆÿÜZã“8­yVqüé™Á(¥X¨5ª˜Ô’aï>‘7¥Ú…Vá•/@,àb†P`D8ðY§êÅ2oEk‹Ì1º½Ôl’³1. ƒÍØ/ÿÄᬎèÀ›ªÆ¹Á´a½o࢟gñ¨ůK^+ž“à@ ú“‘L &#»³¯p°yMy8aùÖO"G`ÎÊ]Ý‚WDé}I‡u´¦Ž «Ê’elËLhóW…ÍDÔ”4&v?Í´û@¯²•ÕFB*¹ã }àö0¹Õ |1ÒÏØÖì€w¶¬oeÊüØ‹Žf»nÊ‚F!{ÿͬêiE1'¹±`,k¼F 0i{â Çfs²r<€R$p*-V×ó‘í¼O7êß;{¿ë¾`ñ@s ‘⮇ówƒAÍ[pÚVtæþûÚaô!?níëÞ6v ‘œnf¡6/ïÔOtŽqÞ‹!J¹µž5Ñô¹TŠÖr¦JIu-÷¨¦Z 1!ùÃþ}ýûú÷õï+T2ô“FÞ¶ÌPHÿë›· )*þIë¾LDÝC21ª  {Gk«l¦¼îü³]°=·¤ÀÀ(º­àâÀÖ›žÐÂá)ÂÓý¯De¬òµ õPp°|ØV¯;à‘–8—ˆ5?Î}$ê4Iå%Õ´ÝT†µ±1ÞÈìvV9#Âû—q2ž‰#\H¯x[dqƒú`7¢î·Àê4 ¾¡€QHËeÆo‹7ÊãîË¢ÔØÃBÆ'Ìÿµ6ÍÓz%e+³éìÍòQy«·+‚´NÑOÙ$fÝŸWŽßndörÚDùÎÔSYdˆOûaåó/†ÒÝB -Á´×(…L5 rÎÄ£r#*lÍEK$Z[ôHÏ)dKa3!* º–„YH³úrwØV4{‚r~‘6£½ ¯”ûÉÒðP´ÑÉé§³ue[^9XºG³÷êÅ>¤~Åîgw¡°.;|îVk-$ª‡{ý!r! ðs6ô»_} ¼±Ì€)‹TÄ('¾YÙräZHÆÚˆ±ˆ4–Áwz2ÎÒðÁÓG7ņ¯d›°ðloRÈ¥[°5—FžuîØbØ!ÜŠL}Dø' G%˜fí«UxìªåަšÎëš®PÌ“£0—*8®ÃÐ?'…¬îŠ.A»ÄÚ(»ÎÜjžpöãJ?ÚiÑ„“’‹ï`B1z<”v¸°À½Ð„ø#Yóò³JýÄ.žKåÜèïžÄq ~âzòŠx‡¾§ãxXÔ8؈xbòÆÿ5¢ó«]²;… ŸÐ¸m¿.štú«Å!…λnSé*÷„"¶þiAÿC'êÉõÑ2;Ê®ÀC8݃ٲâ5¤Ë5°ˆÿ¸‰;¹º :Ý]xqÕk³Áò‰;³¨¨Â¹v–dŒA· ² Y¾&³Ö›êÎÐ)9ÛÆJ“’í~ß0ûêîyµŒ„½„7bÂ.!×|6gRI&Ós‹‚:øÝdkœIŠ0Ve öj¡"0æûOD0|k•<,Îmﺳ§³_t =ï¿j>ÂñNóˆÕcÇ=,ߨ¿¸©þ)ü—Î ú©W‹S¨ŸbÖLXþ㟚«t÷»¸VŽ˜÷¸«/‚;ëZ˜QñŠ8«àZ)+šräYÔ¶/µcÎ^_ÒÑúš‹sÉpøF·p_öYo0ÎÊ1Æ2Üå?%$Ðþñ”ÌGïLÂã âgŸŒÝE Ä6‰›[Ðöõ©f<ùÖñð»ã02dÌ|Ãì}§á{>þÉ/ðÓ`ÿõ‹û§?=«üv)ÍØÿ|fµŠoü¶üè¦üâ\OVàÙý+KóökÓHÐܺa£pЯà¦|ïÀ­ º•ÐyùžÌ–˧Óv–Þ~ÆÇY2Óžâ§‹ó¿Ct‡íãŒâq¼€g«®œ(nŽs;ÂÃ@v~ÖýúÙ°Ÿû²Ç𔟉6fϱ³“ýêüìfh•â8÷ñn¡||öÞ+¥ïÜj»ŠåU…Ràô|6þyK»|´q¿'•óHQAçþø`Ö¬}€@Іóô¾ÇéÈ|ÒÞ©ÅüÄÞ`DÊû£^§,ý¼oÊß:s>ûZ?»à¦Mðámb]7‰-Ã7=°Ï–âa“Ò¬_èß^^jþºßìƒFßœ_¤Me|²Ÿa3ë¼0¦®f’½h‹m-T,-b²Gq›ÕÀpÕâV‡iaiSªá"þÏv!ÚöÇ0hhæbu¥hoA–M™cРƼ¥±ÎwÊ{ð™)語¤Õ9^MCyØÑÞ@~L¸Âbƒ¯Ž—C!ÄA'"1 ÄÛ Zãj¶·Ü)VŽäÕ¼ ¥2W¨âm6û? ;Ñî\qä\ü€U3™ÜÌ~³,8ÏÐùÇùô<ì‡ayi¿Ù'&ްzT†µëÞÖþ$Óg ÈÀcPŸ4~[»æ«7_iýâKÄó“eü5v|8Îkú²U³5߆o÷þ§Žw3 7‚-•pñ>ð}߸[mS÷ÜG¹7±:v7“(ÿm¢ó‚ }Ï"þTEŠJ¡µÈ{¡Ñ0(µvh!¬¤jâ úŸ@;#šHï±Cð”:dÿÍUÖaèQ¬±S^пõå-o  )ÿ¾þ}ýÞ¾¾ó(ÙÅÉÛµ´è)sg,2`˜ÅZÏ£îÚØ*lÆ®\w"À9‹ì/*¼íÂ+°­…e–{¢ÿ󘜊ï—îÁÖj H!w¯u'÷Ræ£8HŠ„Q5·ÅlUYRäP(Á— £ÆÓX•_¼+®äø´óù¨ÚA[ÖœyÑ@ñéÔ‰8=t žãæÆ¬‚•o´QöÙI9’EÂçç^*`¥C±ïÎÖáØÕ¢sà°|Ç£ÑAfLçëÝõéCc›¸…6 iï‰9Cå»âÖ*/ÓÀzKåÄÏÔ$JQŒ>Ò[P9e­4èͬyWnøúZä#¥×'7çN³uDû±=ú¦Æ¹µ‰A–>'¨ËŸ¬w›¹¾õNÅáÄÉ‘ú È’ «ñ<„w°5wHmSÿ#ì'Jž ÒÐtÖ\>×lçöó‡¯Mˆª4¬ãa-ÉC:oÂÑ˜ß ôÞòiËÄñÈÝÛC86ÖÃǼG×”‹‘.z¦+H4XZÃUN@Å`-xrÌsÙ´`ËÅaŠ‹Â‘h¢“¯ÔÈYÀï‘34 Ã$Kˆi ÆïÚÍ•mkÍ‘÷”½ý·ÓÞÝÍàª/¼ª2‘€uõJ¢E #ÈÎsŸÐô\ulÕ ¸&VnƒÈÆánVƒkk¯µÊˆÉk€ÇfÕùÞz!ô‚fm}Cœ ¤Aê-(A…'nd;¦YœH77)=û`çRÆB<+‘„zª¾‚*oDôÓj¸“5cšKÂ1É(ê@ÅΑ×:túâ@á$m<•X,+\üXu æaBu2LPæJ~!­yëœ>'IJé`ÉTrz S@im °þ*™³Þ^bgí(Ci«zù‡K”ÙûA}óŠ…Åò÷Ç‘˜9ʼnjv "¸'íBNx“”¢bŽ$fùMSiÐüSŒ]Úœ íý¦3¡K÷m­@xøŽ'ü=ÿÃ[ ¶øIÆ3ùk ńøS¼­¿Vy;”;W–µHÝQ µâB–`Ð×üouÿL§¶Mß{Ýžü‡ÛË‘nýäÛ’õ¦$^¼Ö×»FéYK æg}ÿÆ„û¯€ˆèxFŠyääðϿѫ‹ç+O|Ù›_4]~2xCæÞã£!6 pvµÞyHûŠ´ìî«ò˜R‡“ª$—£ñ‡š9wr¡üD…Õt`~¸/¼ Ü·Ì‚}‚Ù-\½<°-qï?Ö\.|ýxŸªböÕ&ÑzøÒÂ+ª7qëÿ„!2GQ›¡¶ÍØiͬ¡¯ô¸»²ŠA‹ûhœOh:ÏÁ+bNG߈z±3à=d5Œ ÇÑ@ª×… !éÍž#±Í¬O€&µŠÞ<Õê€×¶ `^ý5âÙ¹_ÿx[T"1õÑœÊ9ÜùBm«d2ã0ÖྸviVˆZ-µ[]MT°0E¿9¤ÂpF¨öYq\ªº¥­9ñÅͱEáÌO°«šÿ¾þìn/òÉýK^Y­¼ŸõÞvç Õ²ÏÓ]¬x¼{*Ÿ4cƒó.Õ‡&“åÑß¾øö«© íö­šW†³-8Æü=¦JSÛ,jì*º*øÓK½'œlŒñê\LG…$œ¹jrÈ£µöjmJ©ŽÑ9P‹iÏ©à zGÊP”/rË%½íN‘{Ápv3.µD?g^h¼odž2~¾˜Å¸ó®Î¬ÎŠ!núd|Ve$!»›þGs—lÙ”¥Ýoïs!òÎµŽÆË»#¤ŽgÒ§Nàí¹9B d­Thø–‰ß,çîÞ–ãqÙtµäÍ‚á‡×ú´à=$ß d¬e×iI½ç[\À÷·k+ôÁüÿhïùŸNfživ8éñÙ€ôÞÕœýi¡?žÆ¯.Mä5gŸ O1V  ¤ãƒ >¥4–þÖ#®ÉæÈÔ,ú}.LéãˆeÛ(ŠÉ~P°*ˆÅ¬›TA¤nèÍø°? CÚœU{iÏÛ_xZ7€MNëàëªF»•¦>¬×P) ¡À¾ø®ö—=#^jÿ‘07A+ðö®Ò¯ë:}Uˆ˜»%ëÇë ›™Së¢Ó ×j­&»Í;®l nyÝX/<ØI3‹ãînèx§mÎ\7˜Õž â<L¥áÚjäâ;™*¦¢ÐF m>ïÞ¼^þ¿ÏRdÃP$oÓÙ¿ß>ÃÛ’uûr‚Ü9Å4‹æØÕÞaÜù­:wcÑÄ€'Î }˜)#÷Ùê¢ZS­@žíyœ¤ŽÈy?pomV Ûi°qÙ àeïü¶‰ˆ·-ŽGè“B:ÞØ5±VF©"ð5CûoÔã‡Ôä¡pÓUºrGèèÀo‚?;žü°,€0nõ¸rc†ôÞ7 }#¹(Vû#‹÷÷»á|PYÖ¦®ÜZ)üÎ#(é;~¶¤óÿ¤äºk™|Cà½Êâ[ ·õ(ñÓ~ï½ >I«ËÀ“+¼w…}¤¢#Bè¨vBÆqp¤M‹‘ í.:ï]g#_üŸÂhæO6Ò†ã!µžÆwPþÓаŠ1AÿÃlM§š€ðâáóðyo°‹^¹v¡³4ÔDzbWÄA„eïCˆì$ÿ@ÿÿ}=É·¾/¬Ý.:Áÿþ/,˜{F+Λõn ×’© C/â»K ÜDVX~Ç!×iÖ; ¢»^}ýÞ/áþ]KC½ÊáœQÇÄ3”H°ÅM¶ÐâZ®Í–¡4CQ ŠWUuú1”uË5êÜå:¯èR•l‰»Êˆ…’É9Í*ýE<P!µöÝgQɧچ¿ð+ïJÉ“*½ ¿…Äv‡/æ(CM q…ýË“e“O»èÇ Ö8Éj{LßOéµ1·;hSÒJîñº¾]ߣ^W+T‡üý{pª×ýò¡‡â½î‹_%ƒÐ»:”¤Ìýy„Ì!m^#‡Ÿ‘âodwrcè‡tbi#ZÎPŠÖ©wkV5P'Ï”ç>Líÿi¯†‹ÿ¿:ß[b;è:lZ"éàÔ…£š1:£@5”&ºÎ켄û‘r÷Kæ ‚p-ç¾– ‡÷\¢:(ÕÁ­d2® ÷«±JËߤ†¸ÄZݳ˜]»è5»¿ŒÑÄüÅÃ[.¥ÊwÕ¾g2Ø6ôbJûö­>uÖd®PÕj)h+1ûAtçÞí/êÝÜ„ì=R9Î~×Ër™œ6/U " Õ„cÛ-X醩a[7f ýdñÂLŽÝAXn<¡¦b$–œWº.Ùnô.ÇRþ``­Pï"ŽÀ«ïÈÀ È«•êÛø±'鮕QÑûü GÖ÷" U¸¯ãvº÷©saÙ78`wPû‘iõ¾aGÃü8™™KeÚN|„s«k›²Þq&èÈO‘·Œ¨ªZˆÿ(l¹òªÄúnÞ‡!_•´öÖ '® ŠJÜ›’ªü¦•R¢Þ2µ-Ç„¿-~æ÷³Nýœú9¥Ä>ë¶õ'Ãôº.±Å|Óæa1Ð, ^<†–†{¤3·X¸¬ŸjêPÊ?Ut~d2à‚«/þäåºHMîÆ­O6ò /$‹t ϬWŸÿû‹bæò9 ]X¨!N@Xÿ6BC YŸ—³‰ïz×mÝRò¹ƒÇ0< Úâ=Oò Ó~Ì8µÃž ­û¤™&ƒT—FÔçʳ‘» z͉7ó†áqgèÎoqz´ç/ΣbVðèp¬ÊÕ|x?¿ u·¬qH´ˆ¬!i?aÚ2Úhª§Ú†µž/¿ÃÖ‰=Úê¨ñæm^:ØðAƒ—{ƃõ¶lÒïº-Vœ$¶6‹n¡ºÝIõ™Ï™ãË)¶¿÷*žwzpý`'šE r5t·‘ÒÛSlpà¾A™6JFÊökƒË*¸d–ûß‚„6øPNèãJ?«el˜U(rå&ÏÅ9Péëž1§/y}ï ‹6¼?s^OöNB5ùdO…‚\ºë° C² ëô<~¡7VM2ȼLþŽ1kð|Œk´Ø8›H!ÒÚ0r$¯î¡…5÷´žYTUR/âßÜ;Žäëoý”Ã=û»t¿ «%<¸.r”[ò ŽýC¼&?ˆQÛ‡Ÿ³7‡9kë î¼c‘ªÄØ2&®›å•—«ÛZV‡ûà‹pªãç;þÿ{cÙ‡tŸ²;£ˆ ã|¥Ñ ˜Ï¢j7«¤Q+’’”A„éG¼¼vÚ<¦gY~ÿºƒPïœ )³Un@aùËÀB@sd– –çö¶Ód#s‹ž©œÀ­µ)g¤ÖxJ'ã¶'/}Ë< ­Ô¾Ôa3ÁCo7 ßÀ>Ñ]]ÕT˜\5"¢˜ö3ÍC*Îù=¶ÕöÛj·Æ±‹[¸e ÄÑ »à,ZÄú½âÄ?1$veæ‹åˆÝ´½¥4ßVm8ú©rY ¿™S1o„ý“€U‡ïà‚ÌŒ© TשŠÃ½F‚ŒQëŸG1¸Ý~§m@õxë ÜÞ¾ƒ=óGý™ € ýš¸I¼kµ†ó»áÐ[Rì8HçÃè¢MW™ Î9. C$Mø†mé3"(ìq ô-`Ÿ’k‡ é+±—¥“›¡PC9È?™ªad‚"éÕÜó~Y5QsÉÿšM‰ËQm¡¸¿Mx‰Xžoôá˜N±$=6Ñ@0Y.Ä‹‹g?ºñ©šÊc 4zÚU¸ùè €[îø° ½}µ’½Öó•qGÕJ”Ðÿ¹”ãY^ú7 *TÇLî¡==V…7ó‡Z,¹/ãÒö^,rY¶µÊè1'ÓûQæ[— Ó+!yAñHÍh©še«Ámsè [.Ì•y&hÏ=\S|pµ÷0ým6Õÿ§B¼›á=žÈ-׃I—P«Ïí“'¢¸q¦ôl1–LiYV¬˜ìcEsÄ©·d,Xí4:ëã¢Ás{þž·Óìí˜Vd¾’Û³:&]´0$ç ©Š“.1ÇhžEþT;ÖjÈç¥LÜâ5©ð^E€GlH9°±Ýa‹áÜüè)àµùß ó|Úd/jùý øw¿DåcOuá÷]5ïQÔ¯­ØÃ[})OM …hþêÙû÷Ëw¸J{\à£gÀ3éùû„$¤rrÝÑã;ã—?è| ^Q¡{íÛ¶h?sOð]Ñ•Õ{ÑnžÒ¬äml ‡%˜Ä®»Â[j<.(!îâ«¥ˆ‰ý8æAü†{?ðïë+«ùýÀϪö3ì…ßwö)/ ؼ" øÕç¯{Œ‡/Ú?×r\?Þ;co‰Œ9óÌ\¹Ð^Q·ßüÃÞe!YC·ÇÍQ Vó– 7Ê_êÿ2pÜüž|›(ÎÄ) 1Ü!Ôÿé±ÀÙá:{’'àÄ<^V º9(ë3wy/ ¯¯N…II c£|‡B»““µuE†÷ü€í!Û£s…`Dó-Ct•…Ziwûarf o{z¦xK,'ÍpqWן1˜z¨™¤wŸ¦ÜIª˜‘ò=Ê-ÓÞÆr7âû”øÁ¤cF\þµUƒæ|™Š•ÓýçþW±ºÙ$-òÖdC«ŸKr“N¦ŸÓ¼•R/¸í.̱ǭ¾Å_Í79˜.Ê„(e”fë´›z0Ø=lë–ÒS7ßÁÁ—÷ë:&Ÿ<ÛÜEn…Ai÷âÈ7=9F'Õ@O HÁÊ MÞe›óÁi‘%Y› j¢‹]\}~zQŸ¡Øµ”Ö “]a¶.ƒôF²ž©°» [þÂÔ—Žk&˜@~Tqë1·ÖZ{½Z[PÎU6^Ê?[Icö ÖÞB¶aÙB掔öV›ƒ]}[yß *›gGU(7@:ÃætPddL¤+ÌÂùªþ»†1P@?PÆÛT]ºk"|ÛŽ ±­™Ç„ãO Ij³€µkDTND˜’í@²-®“ž±†ÐÒŠô•û/©ä0wƒxâËÏ,zZGùŽÐ¿þ`Ï4ÇŒ †äôlc]b§«¼€õÌqí7ÕS‚Šj(Õ‘”}Å㻜<ÈaÌÉðŠœ&½æ:+ y =Ô¶9wŠvÅ5ÚÎÌÂÆäÃäÒ4 µÒÓã+RädfPÎýã·ÊM[‚øXƒæ§à•ìÁÆ0«ðѹ­Ê4Py7Š €}^EÐ ½ÏßbUÿk|YÙæ1õô?oÓe/’›ºàNƲOìSàû€aÜÉ =PïÉm€j{оzzŠâºÆëýÞŸAgè&ÖŽ¾nSN«*I×üŸòc:Äî.:?&&Õrj™{­«æ–»\:F·Ëá¡’^¥)œ£˜ñúõ¨ —ô§ùÝî6Ž—ØÌäJç]RU’õ„_¢á÷~ÜAzøøÊ¤îQ»Îæ£>ÁŸ€H4¢ñÉÏÿTŸÀWÂü¢AÕûóÐöSváGœ…É‘¯^N´Ä|$è 3§÷öí`=osoYâ­=ø­KÑ|0&½.{º«¬0·¾Oh@¿rÏ q@@I½;nš€ãcn[UÜØÁ‚›—knÑÕÛ°oA` "üjàÝaSÞ˜ƒP*åhIà/«È*©ôìg?l¥ü}>7ô) ÚÍx8Õ–š¥5ënƒyiþ_—&hz8éˆû„™ÕXãœrHsêí}1|g“Õ¥v´§ñTŃÂüP‹e†;…Ãâ}'Lÿqì:Õ"ߢÿs#‹/bîßàÔIG·å›nò3žWYz‰¬s®`¦B^éö–ßÔ5*Ô ‘“`e&®üæMC2@‚SMxèoqÉRó]P¬ãýÔÓÁ³³Ï1¨ØA]LÎýæIϰúAlce-Ï”vܪ]ºã íÇ«½^¯‰=¶){«!¦Ô5^- פû{% Dâ4±’øÎ0‹F‡Ìæ4Ìý9¢¼o‚Na¢€¿1ArUK™Ô[Τ†œZüK6ªXúµ¸”Ü$ØâR¬0u$Ø)è·Î¨éd×Y»W•CÒâJè[cà;SkÝIv'– ªÎ[_ËÏs“…8Ñ?ŒŒŸVß\0°p÷°V!î<_­µÓYùŒÉãäþlJþ7Q†þ¦csóçÿvKïÿ¹>µûcé&öÈòôåÏQ0ôÍ×Áûó=*T2Lì}þ‹gDî•m*HöˆûWë“¶†³¾ v:Olë +ûê°ÂÜ¿¶Iÿä*ˆò;Ê Gš ²Íó{ ïüzÅUÅð¤MT$(þ8àÛ£j,†òèú?Tt~J“…B'H’ hS™òôaÕ /Ë¼Ž´»C¿TsçÁ¹ßå1ØŸýú¡w“®X,HÖ<0LõqÑgÄnÒœPœmâœ,ÞxØè5#­Wž¢w¸Ô\‘7.kÜxØ,ïR qŸ®Å›Æ‹ÉMô¬ÛìbXò&¡9Œ³Œt¹%ã‹ù¿Ì˜ ýKaÔdú:¿´ôMÍÖQ²Š<¼ŸÇ)Û0¨”õT0 .ÍMU"€©È÷<[p."°µ!‡iO ±J2p ô¥C׋u¼I¯Ãød-Ó­§¸ì[Âû@!üú™ƒÞ¥ ŠúR?O¾E‹¹Æì²_œ;vèq¶6UñŠª†ÖÙ“–"?Þãi,| Õ‚6u‰¯¥×¥tHÝŒh˜t~ ûaÑF0Öv¦^'Qr2§í.ET½e@Ȱó§ÛzÌy»nkc뼉i¬Ø_ª‚&Æq0{¾Ñÿù–€ wù?¨UTè§{½üìsq_j\Ì´ÁèƒÓÎ ¯µg†ã°û±¥ÐcO·{{.a¾‚Ö ZÙšÝ-tra–(©pëÈfÐyÙ‡3€±UYÎùäv*ô«e©ØtïME/ÿ®_ÿâÏv Õ(ò—n(G2²ÜsG‚¹o¡¸·Ü˜¡¡µöj¯£0S_RÑø„µe8¯*µÍÒ èöÞ¾œœ*Æ Ùõvâ]­û¼.QFä¹u÷–ï¤Þét±–EÔqÀ“Zaúô=¶À·­è·ŠÿÁZûyEƒ_wuy½ýz1ˆ@¸ÿå»QÕüµŒ±&Ùø×šÅþ§†?ùæ¹ïþ«Mžþ}}”,+ó¬?ÌÇ×ñÓÑ%¨(/ߥ·IÀTÛÿkjÏÿé¢óÞ=Ñ4{±ý5ÊUbpê#gs—têƘÛÌ:ú~%0 1Uc=|¾öÏ©Tùƒ~OÂp3`&úÖØ^ÿwàø…á§¿#ÿ²ø†;[ RÅ&µŸ§1XŸ®Þ7߸N¿¦ˆ÷dMÃýó”¹éõˆàÄ`â8­Ç- Œug0l—Kmžàê@ÑmÇØ”µòÚv‡~g°!VÕXÛŸ3.§é}¡¡Íz_üÄ»bPu ßÖä—¸nà{à€'k šQ|`U€‡}Åâï'/­.² ïnù\Ì/«J0yxÚ–QñÒ@˜÷xÙÅo!±æJ#TøYW²7ÝÕþÒôNuЦš¹Vº¢ ƒÒñD!0åt¡:QÂ{ô¿ÀsƒžËjv½Ù×Ýîb)Š}÷t1ÉHyߺƒsÚ»<§Fὑˆv8ÞËðÊ„ü‚ëZeÎ50YAà@¿µäxõÑrcjé¶½H\kCºzîLŠÏ \+êí™,¥±÷!;³PÃ8Tìèøâñ4¤ebÜóqwëР&™=;r¹É «ovÁhÇæ6ç§‹?öf£¡x7{½nÍÄßwc`Y‚è€ÐüäN­ _²~Ne·=z½¹Ã‘î‡öÔ¯[ <øÅ Få¼; ³yo!ªo¦@_¡Æ‚¬ô6+MüqÇ»`i=µ´UV Æ®m±53öõmír£ÌìÜËÞ7¶W;œšXÓ0ëH½šH#·âÔ(b˜³Ûª0ùS4ÀIÂ×Ó.s7V.iÞ²—(¢Ú¦øIã!7‡ãõ¯?óæ…¢åEt¼Ø${ø2…·#‡àM1ÓCéóx ZuTJú瓳Œ¾k¨"`E çIPÿg~ar¼Ø3e×UB*U‡D”† p Æš¢çªB¼ü•Eøù™Ýƒ|’¸²ûGfiÕsaî¿z¨cÝ¡«%{Ê)Ò˜²šS¹uô'ŠžL“hþ+Ü{·5ctã)ÞˆQ‡sNEUct…xJr¾4ÙÈ$Xù|’%ÞXéÖüîì ¾žW2tíãÚcãþ¦C­Ë»þí-·9ñHÿÞRBÎ>ç¡à©qŠÏz6Yd²š$^Γ]±ÌzäËÀ¤¹-ô Ò=òܦ#I°ÓZòE²¡Gòð?Pt>àÝ9Y±h^mIæŽN ç'GåMÞàžã³ìZ¼H¦°µ :”£ù޼ÕDŠºeÓä¿¶]½*gœ$ãG ôm¹êfT®Ãžøñ 퓟ú9ù»tþ úÁ5‘Ÿ¸q_ËwÏþ{z¿ÕNÿ_vÞß4†–¤òM[Û“"ù“›à¶Ùô±°J˜*Ž nIýb` '$3Ÿå%“ÇÛ'06;Ñ0H¢—%¤„ðôlLÆ} Ǩ›šÈñ õk ˆ›½%=OkÞ÷\nQ§qØ*cÌ…íFÿ~ù°QYuTºú¼‰ð|×[²Œ°¿û6ÌíIV¼W•»+5Xêî—.êp£øæqÁëhqÊ”ÀÓ6L‡”hµì‚ùïü$èîr’ÿ&¸ê6æT‡æ” Æ,í7N|t4>-¥ÞL|xÀÕÙùW‹À_7PÞ\µ^*ážVܹ?ìwˆâ(ã4 b1a7ëPC‚óötÎä¹H·FáºjF‹{ºéº2Ö}Œè®Õ/á]Õ¶1¯.­hÖ1Iý}Ú¨rœÖŒŸôE¹ê­9$8]Ì/•™Ã¢v*t¢(ÓP߯U„ãªúè߀†ªÌ ZzØ*MD»$J‚0¦/ñîe‚®iS`" lŒ®5ט‚‰méÁ ìÇÙH[}) î¶åÂÕgë2d3ÌyƒàŽSÅ#åô¼ˆ†«©A¦„p{¸š“ Q±Gºa-n%C‘û¹~¥Á¨J9÷s@díï·~–Ý äoÆ[9¡¢`•ZÈGH\RÌ_Ú© ¼€$XÞÐyŠLÙŸ>чíÇ8ûmí^ÿ:[€kѹóú4´ãá—xȤ´}€tòEµÑC•‹<–þdç^ŽÞ“*#*“1nÁN}ÁZEÉ RˆŠ•’Ï'®ÄîË÷ZAÂü˜ÚÓ‡Ä$8Ú—Œãí9QúJ5IfŒYüÍ2Ϭ_JÐx›w})ýóÃ’¨jwŸeªÚÜ­¾l Ö‡))V±ÞÕ6§ùËÝGÚæ\L„Qo$+¾ÕÄÐd[¸n ‰–!óööß :¯‹@åoµ8”øªìäºø¤Œƒe’.}¾t·YÌð0¤}µxäƒkø5øç>ä¯tõG0á)Ψ4§N•­ˆá—6”™f*Ö #IÁ-_KñCd¸±|ÖÔàÃ'GµfÒo²@ÖÏa¹ßÎ OBÚvåðE ˆŽ,¦ì qdgÏ?¹NÜ΃ñÐð·7eCl 6×ÙÀô„YÊv´,ÚòBä&·èö1AWŠiiC$—h¿,ú·-‡§¨*ÄÜÒ¬¯+ù‹ â¶%(?ñ¦÷°&XÇö—ðV—&õÇcùC±w²¨¼›ˆ0g÷µ|!¬dùy[–´ f¸&ü@w:Žçš9`%9[F²5¸›>, ¤€žÀO±zØHÅâNRžË¯R]`]ANðS†¦ímžž‹‰eXðV‘,ýnW¾¥sq³›ì~ÛBʳ —úbÝóCè 0}þçsÚmžI6ö|Î&÷& Èý/e q×ÜÀù\Q7kÚì_ÄgøÔeÜ}Œ™ w¨>)VÜqrØÜSY‡®`.(,ú'6þŸžñóÖÒ·¾>oõÿ‚aØïÒ(¦^»ü¥ –>0ïÖžÄÀ?jzOïaVwŽßV®åŒ¢GT*E!ZÄ­¶– ˜‚?i4VaZìó ºÛW¯N|l§êλeó¾ l<Èú·%£h€UAÀ<×KÌ' Un.Œ#xŒä’bAå`7¼È¢$N÷îÔSs‚‰Ãº/RЉ b5s.{¿!=3(cã#hy¾Í^²¬¢ÐÜx»´Y•J´9S†jð|½s—¦»—'àéîðêE8ÑGŒ)r©‚¤D×?÷~M¨ á iR%èç7*‹©•L‰'gpk¶Ÿ™SûZ÷— »B8«2×8‚lÌÖÐðBk¯ô·e7ŠözµÖ *¹m“ u’2è(P7^gfIU‰üjòPÂŽ›+nê`e(Gl¡Gg%/R[AíƒÃ"IQ~m`^Øö8Lu|W Á(ÜϯžµJáHš‚oà¢ôËÞGªtÈô"·²†y×V9ƒqÊ´]¢s‘3/îe ;'wä"_ÅÐJÔñNm¸AÐŽÇMžI„á#–AþgÓœüô¾ž11$~$jìœEô¹lza<–ây{è’keõ lM®ÄÇáaÖ˜‡ò³ˆ@ï0Š•4ô¢ÏPŽF‰iîÛ®µ›ÖÉa$Å6àmJ–ØîG`Tõ…€#²QìÕ*r“ëkÁ´VâÿÊ€ÎöÔõ¦“Å,é÷Ã&žÈµ€nï!ª{%χ™jÞ†Uª³TeÛóøÑed ˆã¡`gOà¶Ç ÛîÁ— 2+ÝkÍå^Aö Ký4`I¶¨:)Ç¬à†‚þñ¢óAªúä¹Võyóvä¬lBO»DóÈJfܾ| ¹ ht× µ¨Y%¦¹ ',~r&g­w|Û x S/‹_”ú÷õ'¿~pþÚì<è =h‡ià£O~Øœ’D„G Ïߺ`øö™ã-»KÎSùÆ!æ<ÓNÊ1®. c¦nsóÙª9A–+äYôNìùÏ)¸h…ÓõٕͧŠÐÂ\ìÿÕ,B’ÌϨâ o¼^ù•£,Écî*>¿«%‡µ”: ïÁ#+0¼­X…ðG ÜJõºÚwà™ ÏYW@In’é²–€s¾€}r*n´5îŠð u¥ÿÅÆ@+Üݧ†±$•ej¡Éƒ£~æø §µa?MG›ß*Ù=Zh„£n*è kü54ž`=W¸·sMø (ð0‘ó®fùZ¡N½ æY÷ö9Nñq.¥hºXtÂË)«tsöFA.ì\yô-R%ŽõÒñƒ Ìã“:\@c­BT0p¦],{gÙÖˆ è¡miÄÆœÌ€ ŒÕÆ†Š¾ŠèÍ6rëÚÄ]–SçtÐöcB&CÜûÍ5¹)V+»»ºBvxµöŸ?~üx]DÁIøÏ€ái# º€íÏÊ5o·J4ø[z/sF4œŽt+†{ÚoY*Ï;¨½U¹+…¹"_’ˆÍ°‚¨R 'ª7£KKŒ~<>~lÝ9ʰ¡£¿Áýƒ”–i»…¡ß`N F7 - !&¸s¹e©r˜DÎÝ—¬·AªÇGí9=ÐÁ£+7÷"$Ì#¿¬LbP##Ù}ÆAÿw­ñ± ×À.¹!ľþ­ô†¥úw ­”dQî(?h „ˆ!Ëu¸ÝR™cáÇÂÀ÷¶ü¸ŒOóœU±‹Øíe(3«|óôD°×AždCV¡a8çýÑNÝÏjÞ3†(×ÏnÍáÎÑ¢…0:ÌÀö8ô|2n޾͗7…Ì6ê‰m‹Ì­ûl³03PèÅtN F›DFq¡+.Ë+¹ÕšÁÍlKD "¡Ä (àñÛ¯2¹b.#+ä•‘ §Àøá]׺¤& Ì ‘=ª€zÈIÖ=œ&"C6á–Á£óéÙ´,ÅÆ£j±¤r}©6ÿ2ÓÿXÁ¨ÓÉ«´žÇ0©Ól†!Ôg4Ži ç‹<úÅÍv%Ã÷›Œ¶XcûnRa屆(g¿²ÅBÄfà¨Å¦Ð·«ªòYÅÖ ãý!¦€×­jw^¯ .1Y-ª6 öj ªŒp*ÉÕ5ü–·@vôN¼ó­Zh.Ý Àåv[•Ø¡pc҉ݶQñJµö:,nea® ºNËÞÌZÄ»X{À&þ"/’öWžó>4xðþÍ-{Üæé¸OŸ™…V>úôÖ·½ úìÇÐÊÓof^W:È<>À0Ës>ñ÷”ŒÏò·v»·l%sèÚªñI¸>†Ò^ä¦â:«Ê]L-›BŽ ÉÉ’¹‘ˆ‰crlÙ«áÇëõãÇë?ÿùÏ×ëjH’b´ ldñ5ßμ{Šjþ‚†ˆ¬J÷õœù:÷½¼óƒ”!T€ÂNŠ*,:áN¤Í¢Yƒ/ë¤-œM¬ûòñ`ÑþT7dƒ¾ò߃¶2C¹ºëýŸ;¹Ñð-‡îAÆŸcÝ~÷ÑõÁ¹ÅÊôɬ]@ôƒ´œy3Äð=‡Ögþ>oß·ópφ_ž?"€…K!VÓT1ͼÒh“ؼ]Q]cCÕ×oå¹½mz¥à×Ì™ê”Ç&oUµ­]×µùZ^0¤$ÞX&è8/Ïún›ÛìónïÑ2[´Ëéà =þ¢QòÊÍÕ»Ÿ}ÁžC‡,Óõ´† Ã8Å$æO6J›7áaœj×ì/éÿ%às@óÓ ¶õL–ò??da1ª¾x¶5R '€?yl?ßxnzô¶›gõúÞÚüØøä @±Áð¼e»øùc¾P«:X:hw¾5çð¥ÉÎOvžþ©¢óïÄînæ?²»Òÿáw™oÜ¿3Ff Þ§=„šÒFWB”â«áV£He’àuÑ{G3|ý¡l€%€þ}ýûúï{ÑgK?éÖù‘9%éPZ…ȹA@Š[ ízûUv.*Þ’ZU“Y·ÝAUSõÆ>ã›i”‘l´ù¬B5¶È%DAl“Bz‚é´ˆöל{ÿX¥ ÌBö~ú’%—ýo—Q9Å,}"‚Hâ>÷ xg ÊPö\ä.ƒ‡+Ò¢Q²W¢goEµÇü¾ Ú=¢›1œ}± <ª§(¼­ª[]aq‡ikNàY‹[HåB¶ö¢•zÍêÚÄxÀ¤¾V6®Yø$ž@ʺüäÅÚo¡E~,½*Ïžeð·xE±¼>« °[ȪOzÛ8X’9!Ú<|œ¾Äҽ̣’˜—Q¯–÷¿uü,Éÿƒ ’Oƒ1•uPéÐGY!tçLýqšJ¬ëpåqmŒ¯mõ‘ ˆb³äLï€qšðìæ=çÇ–w®Mÿ_± q L°sâðÌD{çì!Rlh´æì Öœ“êØïy½U”­úlŠÛ«á2úºÍæïaÖçè$Mô{Â.+ÖÓ‰äð¥e´‹ñ¼ô Wב˜¦ ӱ’.’í·XZOëÈŒc»^ƒn¶À{ÆìG£'*ó¸……zrØ· Ô±žYÀJ]§¿©' §"0ï¼õÃÃß>ùcAÚ¥>4l8fÔêÎ^ä% ÆÌ|„”G¼Í œÆ4\÷N:·?‰ûkÙ méßpäD¾ôêÉxË©¬†I P= ú,\·,èY‹¢ 'Ö/l•µ¹ÞˆvÝ)EXeæpqLèR;Œ§!P·mVϾáÉ‹´‚BåÁ.qápÎn¯C?®Ä;Ë™5±å%ÅŠdJÇÖg«É]8t6kDcޣإØÎ[ôÿægâqæ¥óêMQ%?_¦á…VÆ*C24=“ð识‡Ý]Þ„òs­ ’ušÊƒ,¹“PàùçCT ¯˜W ÈHò¬µ$zæ´h¦_€—èÂ=ÔgÙ˜•7(˜ƒ~È÷é\ºŒL_á*ᬆ×hd©03$oÞr°“¨Ì'Âv¿P”KÔ?}2öÌnýû¯wKñÁ½Ñ^í;£¹Äò 9L¦Vœ“ ƒo=ª,‘ ÷W7÷G—Q׃4Å2ҤƦøQÜLÍÉ-½þPÕ5Ê{¡9›œwÁEq½«H vúÚ«—;¯8>Û±:ñ‘÷ö™ŒÉ@R,±I†f¢;ºÂ9šò%ÙSUµâe¼ËU|k׎ˆ…¹Jžò!”2AóÊöd9 åæ&íöéQ‚…¢ÛÖ“ ÇUèwŠÅEè†EŸ‘ƼXÛöo£ÏÃP»‰ú„¬q«`2öà=xRÖÃ¥×Ð0M‚g5Û]¸ÁdGÚšV¦Vž<éOx€.ʼ¸[z£†æ jõ)²FýºH×%OoUæ9t‰ŠWGE¿J©¼QßM¿cÒÞ£p»óõØ6 ‘ó’l”ôV›,ß±HŠ-OoÎ3gÕHˆN„ÀiæÆ<º÷¦s·H@Ý¢þ:®—§­Ù™žÑ:„Q”‘êŽ Õq=4œéŸË€ÕóEîçU+ë°G1,‡MÜú4Þ¢4ŸeÿY48g;L´Âg®—¦K¥Ny#˜¸sÓ}$ñ…ª'QÞÃÌ¡6½O™©ŠýszÍ,TF\ Ê{Ž"Ò Þð±|]‡75/DÚ‰/DŒÞ/ýá¬!_ ÛM¤›¥æb°•^çáÞÚæ|hV´Xü„6Ž0ÐØ¶Ššª1 K¨ZÂÚÚ#síûàçØž¦[Ìgõ·g²ïc¨æÇÒ1ƒ{u‡5¯N²õ ©ˆ£(¶NT íÕ~¼.éì5ƒäea¥ìçx³].…?zݹp(ªJ>½ªS±ß¹Uæ\Àe2¥ânû/›t,xÀ±ê¶\ÃìMjL1AÊ ‡É“GÍ#HèK7_-1;.ž]\*Ò‘à>sa7ΗøÅ½|§Ø”„Ëp§¨v<0˜ì¢q8~›¦¿Â.jÀ›ãÆJÓõv9e¸tà‰ÞýhÅ5ÞAµÝîg|1ó¦¿ã1᳟â‡Ïñ¦oDÜ„¦m6F\ø>R€oÜôîïð¯Ýy?¦×]úƒþêò@Úw}»w!ô¬,û:e¾ ¤Hü̱8 `ÞáS”jÞ¨)¢º½jÏŠñø™Q‰ÿÑù“ÄÓÇý¡ ä}Jfïº<¥wùƒo¿ÒêÍÿÃzïoˆšq.ù°É]Œ7øWèß×ã‹oS~þ#~uÚñs9ñ—O› ì]˜¨¦úYà1EéüZ8yEÖÞYplBÙæòÍæ8ù0Ù®‡ ôA¾åˆµHÓ4Ú·Ž7Öîîd@ä ßî~óÓ,ˆ¡”LfIÖÆª6„«ø¡S Fg*ýöp&\ÇÔQˆ’›þÁKø ƒJà¦Ä-ú0É.I×q3ð >QæÂ‘äŸ6ÉŽÑ[„'íŠM™œ ~ÐÁÛo ßý |RÈÿn’¯É6‘—ÂGÚæÂ&ë›/Ì+›§ëw­E2pðƒ9X'ÃòùPòe’b´ª†o ¦šÄÞxófáÐq+/iê^YéƒÕwìm_Ê,sÅ&î ÜpWxü£3á –G' >~Ÿp>B“Uüð^ÀÛuÈG†¼µjKð…GÝÍmã»ÎÝ^õ›`oêéÖ_ý|{‹L³ú`BI}+ûNB ÝY1#:Òe¾ŠSûÎYv„±(VÇÃ,Ö–õš·z5²RÚÍê=*!­Ã^.teæêk’ !…K§¥PåÔ+áPŒÏ Mídr-Ép¤ÊÕH/(Å'©©mͨóF`ŽÊ7ý€mÜ8•Ø䓿|Òs, :Ü…"­T ñÔÍÅ 3_5z„I'­‹ËòØàB.¶©–º<ÏÓS˜ø0¹AÅvO‚çô5ª:…'îÀ¤™ãzU 4lê«ÜN¡`Êq…T•¶›E“Ë®4Ì+| V?N¿À­Ãpn ~Sf_Ø|ßù^<ÿõlÇô\¥> ý9Mt¤~ðÕûõ4t•meçet&Tc ù=ÓñÈùGGœ¤ªCúY¸bÓµ¦z/µ D3UÂÀY–>êêÞÉX$×ãYC ±ž­#ðu“(|¨Ë<»M0Z\öjíG{½~¼^mKŽnå"ÀÌ:{ëÀÀ5ãåá]ýÃw[¬˜z”FÁÝ(¤D Üb{ÛÅ Ý Ý!q oéü5 ° Wüósg·¥4B~þ^\r`mý&SÛ ‡¯,E=õG"³@U,Ì눆µÏŠ‘úŸ’»JG9%wŸNP¡iúø8ËóG@®:‚YÌLºG{B¾pØÖ»>ŒºêˆÞôiÜ*DóÎw½ú0@Ÿ,¥Ôü¹Ÿ»+îeJ*xhvŒOÒ_¢ÿ ÷¬¨9Þé=?¼æ‡b/¼ë<—–ù™=WOÀ>–1øÉËøY— gŒ¸Î>Ó4Ï €Jßø³²U]| ËT—4úÜÌVa{.R ·vn¢Ú8G”’Ø Í¯Œ'|y1?Û¤7;úw‹Î×§Æ×&â‰Bßáþ4”}O)4üy/Ô`ã¶¢)R†E‘‹7KªŽDÒÚÌ:Ÿ+ä}pÿ¼âƒßå³3 ’,ŒÁ(”Ž vR<îäÙ½ÓŸÑ`¼Ã¢pr Ý&\)DLÅ{ªÜ,Ná«ú@U ÝÉ—!Êm ¢b1PQe¦{â­¼•eÕ»’笢Âcæ}Ç×f® ¼g}T`<ºÙ~ºK$³Ð©ß”[õgR(·éh¸– qZâÂJjCóçJ]¬ \Ü'ê²´Ü€úäK†1E?û6˜þ]Ø b?ÍåEÒŽä÷­å³Þ‚ˆ…¡3P¢os(í»ŠTEÙu1|ONB 謽lêós<íŒh±öSó–u5@@«µÀnçÁŠÈÔL¬|D–¯P¿áŒãP/ïm¶³²d D.ßu$ÿÌ&f…=¡F¥éXŸ&ÖÙÁíÿ¹í)¯–Ò)À¾9®Åá×–îÔÊ㈗¼˜[°T¬QSŒm«Lö…/ôé Ø¬úl<\°™§®}ÿéŽàCÕeyï\(?³)®{iMÜ4©q¸;!Ö:ÿO/DRæg${÷ØB¯,YZ.9é*±5CíRÕ‚ß•ùË»æñT,Ër8%ðô3Òçb-\,æ)ëïœY™Ï`hOLžæwøRéèz&Ñ‹fNjŸïi­GKn Óµd¦ÆŠp¶Kƒ×ÏÁ žÜй”ÀÈY³e½¹×ÑÜtXhõˆ¶‡ hhíÕ~L¹ÿ­Ô¦ç¨)”}®¢|(iø ´ÛVv6>Xê4•€íɃÐÏkùfȯÕ÷AÌya`Ûh·©J†ã”ã,Pïöy#™÷X±5WºÏmáK”ØêÎÝÖV+…ÌÍ–oA÷Iaj€j®2>ýnÑø8áCuÙ/#ž{í®xGœ’é:‘ úøÕù,¨Ætðì¾³½û*¸(²vë3”íw½hö׸Ý·¢b´ÿÞÚ_pЈ}¡-’¿FüàÞ„½c oî¿`£[üç)΢¨ýåÏòœBßÞ¾?QtÞ£Ò_ýü-Ý@U\¬õ¦šºN}õQ­¿2MRÿñŸóâ»wv5#ecdîµñÙ%€þНo=¯ñ[cÓ×b:žïþÂÄŸùyDðTòCkî“/»A¹{`u!ç›Km†øÇââ? “€=p7…z4Ô¾Š4#­Mrc[…÷B&…™ æeÅý,8mý‡ ø5AÕ þvX­SŽdÝo\Ëf,íöÅ ‰õ– ek†9eÏ5i -"’/¸Âæ$ÁßWí!.À:åÉ vÏM=N¸{7æX‰‚[‹àMÎ%×±{„ô躣G§¬æõØætãšI'‚3$ûºoTã‡õ6'¨—ø·¾S7~s°r×J6pR ¹]Ñ|ñcdžiµ\¬ úÏLýe,§hÞìÜyÿG*€}Ïáã'êDy ´Ñ•Ušw{ÝÔw4Ç •Ÿ_—´ú²EÊ”g"$2€o˜ˆ#™×ó¦â*I!.š0S(„ìú­|¼È"£%+úÔ]ѱ¹êº†Qõ)ŸzgíŸËð`…°†)uIý41wƒÁÝŸBÎ`É/Û…N(×ÖP‚ˆxqO[Þ ÷=4mö€¢Gˆ‰PÆù›µÈK~SoöX¥¨]îëb¸¿«<o²³5;t±a#z|ùCvC1i£%|6'Ë„áÜ™ í€ig½Æ÷7šä:«€a¹¹Óh}ZÎH²X³æL›¦ô«Ï6™ŠHˆ!”ë×ÃfTñ’‹&ïò-φ=¡«§ãíƒ VDx¬ú/– Qo þ›N¦ÑFÿ©ã‹™2§übv›]l]I 4›JDLêJ°ŽÛä…!OAøJÃÇ›h˃G®_âþ¸ ÜLì“!€  ¢)5„æBà§Æ‚mw¶‰@ˆ„ ŠÑÒ¨Ù3A›/T¢q£‚q ¼ä÷®öËš \ûÔymöƒOZP¸Ž»³©ÛøXëã!{ï xz2G­³Ì{€^—{‘â]Ùÿ` ­;òðå_…) —§Ò›µ5¹²§}f«&ŠâÿÎ77$|•K%5‹yÖ¾þ/?2Óõ`õæS jk…ÈdÛiå­¸ú›8Ùû'½ýÎP|¾”VbËV;w~quðÆ>¦ÚÄë<þ^Râ©ÀabwVôð`Tæhç»ò“g9â0ºxøê Û>ªz<éÍÓ°G=xv+Û >f¼º?Ý ˜ŸÙÜrŠÝôÄ h Dÿ ÛÚ5 ûd›®ª 3ØX)ô¸~ýï ܳ >Ý4SŠr4,Ñ`‰GÅ•»eÐë¡y³´Bàðó ‘r挜ò>ýYM_!8ºH†8ï)Ì?2ð%\\ Q±,f˜Rà![U |U`ju˜ÔOåÓ;$ÏËëfxè¾:ï„ý{]ÌOçнÑ]‡;ÓjÙ™ jɾˆÈÏ‹¥»tŸ†»¿fçûiË›QõTJêÞTÒ ÷ú›:Ý“®k=­»;̤uö«guÒ•±ÔÒ9H7k€a¯„dëYý+n4þsçÐV4üö¦÷º‡Añ2¤PJ͘D†¤ãì'ûHp}jt±lžÁCtÊ4ŠjIÔõÞÙÈ[Ä94X0äÿ¹Ö§á ¼je,ã~pž÷Û…z7]¢ëWvì ¨å:$îΠ*›Ó`+õ¿ ½Nÿ $Mgížà¶J3ªzމ®uÂêÉåhz…ÓQ¼¬>¸²æ›ð}+\Õ„õ6L&Šé¿»kôúy ¯r·kµ[t#™ðÈ’9Á«ÛÍJìÛYÓ*¡‚-yï¡ÜÎ$”¼´ O-pò‰òPĆ ;%g~#ŽHÀ¡Þ8gW<6n‚zM1KU*R]#íY¼„}‚¶VÃõ…lf=X¥\¹jE­õÕþµžcME(ö_zj¤SI:7b¬RK™n¨b{¼dhhÑÉu2ÁÓSd$u5wjžh»|°Ð6ï¡rU7D t]Û;Z@œ]ŠÚÙ¥Ó£r˜´r‚3iü¦fÿß«ü{Ób˜P¸©/g¾0ih|} …w‹Ý²x‡2ø.]ú7ü,T ßþÀ@ÕØ@2ó’t޶ÛÿéÇ0¦|Pøã4“vL9 T–Ä(V.*?' ¯ÃO-n~øÁH èÿf¤<’0GiÐF˜-6¬üÒuX ¦ÓŸ3\¢aK¦YI=æÖůü_éƒ@nÁY~ò†™åÝ¿ý+7&ÞxšoN䧘bèaà ;vêÛ÷ù»4‹õ6t¢Üfm(OÅ;eI˜àöâ*mHð‚Ç–ÂM?MUcch²0“•§¤5ôŽæ²JÕÉA°Û"yñRQµä)Šwxt=ÙØk*ý€]“8û\¡a#›YG¶¢Fœ2õlÕ‘Ü’fD¸â²çÆ&„E3.ÕŠDùÂ«Ú ê²Ðºf®L|÷²MFO±uv—¶¥`D»BŽ ÿ‡4ü#ë>®Ú?"j4öœ€€;¢Á¡=‘éPlfÈñ@›”UTí–žŒa1+¥a%ZÝ“ïvgá‘P´>Ö¡õjîOþ¬¸à"¸ñU4ùÍ”9.Ï&¯ÿzÊ—eæÙÅtC1u3Ë阌pt™$u´_·8FåÓÙ‡ðû(>Œý‰|eè;Ñã¡Êâ!Æ}t`ÿuœ‰ ¨Ÿ°4M!ý|œÍ·R'´2U&Møs9ïb-j§R¥'ÜÃÀ¡ç6’PŠr‰o‘áf©ÿÊIa¹é)ib‡Øl~Í< 7Ðé< º£¥Éì@`- ,¡ÀÒåy¥–—•ý¸-°kZÀ…i¡æòÜéõ´ù=Õ~jEE}}q5Ø[;xÝÛhmÐÞà¸4šc˜Aê>ÌŒuÜšnXo^`L&jçD6Ø¥aÆÊ8zù¤qÆB<—Ûl-fŸÐGXœ[¡d4H’E«ÁÒ\лæ±RòG.™€¶†dÂ>)1Ð(úÿ[¨©ÉÀæð6Ó%#xyâ¾KóÇœ…1<3´À¢Ê-"B–S“©usûÞèýoˆê˜˜d^_ß5^r‹°¼d¼æWôž)B࿈°'ì¹3Ð¥·'U§ësÓè*÷¼„Ç‘ýi*(ä c]š¹¶ä“Ù†c"f M!48Ú˜o·È¯-V”¦Øé«7J~´|& ®´mÝ[ÄáTÍ,¼Õ´È¹Þ—Ïh¹;&ÃpÆòvD…@0 ¾>á3ij\½VóCÆìã5õ­)¾ì¸à¨ í¹Ym,c˜˜ôN€W÷_ðÄä™Hý1SU˜d2ÉÛÑ<§ÿ/× ”"eg¦G(æx?ŠÒÚ ÿ¹$ÚsÊQ-ÇɤŸæ¿Wtpo|¶m¬CZ5 ¡ÑÏëBµ³¶¡’~ڀɎbW?¦'Z|::Ü4Ó˜œès·ïà•™þíJ]pLšd ô¥üëc­³÷ç.G;~´åó¨°e“…ì¯x«ÐÐÑ‚¥ÿgíÉÁÆp«õµ@ÂÖí¢º–õŒ3ø‘Ⲹ˜l¶Æ‚­ú½PýfÊGpTè>ku£úmA)û !€†zÖ ÅZæâЉäe0ÛÕô2ö5¹®²7,šðÉ&¨9£Û6 áQÜ .ß ý=¢óéæÞ‹â³d ÚÑ¢ÖAçÉ€ž2aîðû~Võã„È *F?Ýæ@ga·ŽFÏiK3/Iméb‘“{˜E†ê‹ÎtѽìôÀA—Œ¯H¶Ö¸z±ŠUÉÝ9ÚMبJæËîÎÜs$CªœÄW#î7©oEئW2ˆÕVxŒ ‚‡KÒånE+<§’]6›Ô9(@/uHÓK3K¨=ghr"f'­Ù¤]Æõ)eOcv^ ÷¿’Ñ™Ž°TJsB%@£ ýrÔ†7Ô«DG4a`!ÖlëR›,ìG:z+fzfq7l]¯¬ªãÕÌÊ57úðéÙ89¥ÀrÝûžJàAã¡`+o&ûÞªÒœömºF=¼a]<œ±>Ȱ„x-¶§AkK@c±Â½‰Æ2¸Jd°È>8§‰Aœà=)¥o¡œÊ´k7ÅÈ‚4US ®¸²×ÙJ¨Vó©*Q¢‘Vc˜³ ùâQx÷€h\p‚ïàÇ“?ôHû&#Ê¥úÝ~Np„ÄÛÌŸJ›fÜÿú³AlõÊ wuö`«ÉÊLD•.Ïš ‰r]P¡â?Éådž(gñ¸œ³éOH‹î,8ößOYȉÚ"»3zÔ+q?º5l.—ÚõÓP»«1ór¨Ÿs´">¥1¦Õ:v|ˆþ4  ±Àª×~rblß#ZQj­¿~Õ_õׯÿ÷ªõÒüïâ~ØQö¬Ë¤—óx?R¨L;©«ÿ®»Ú˜}c§e „ îG[9¹+ì\M²™ QĵK<ÚÀ¼¿0¾ìÞ µV|‰ôsZXŸ­~’0»ú6þå€ã÷i•ËqJàÚÀâ©þðŸã¿#Ëð‘Ÿú]›çµymÍG{þÍk…ÿ[‘vuT+k VÓŒì"õlßüþ Êÿ4#|ä1ÁRÛ•nZ^Ýôñ-ËæàÎ( Ìêe?Ö«}0ŒÒðz@¬“îkÕ%ý£0¿Í1ñl9½ûýÎ §¿ÊozmØÿµg¨MîÕý‘¨Ÿ›†¶¶o­ƒwÐ:ñ²_Ø©>{šoXGÁ±Ž‡*‚!àÕkdîÚzƒ‡Ï&Mêj¨Óó;ÊÕ‰çèáÑFà|8UÒÛGÔKµ¾ôiתDîdªÞY|t¦Œê@\šFLºdÃ#7õgÜ}pùQŽÞ[ÈTqoÃþdß6Šõµ0Øw_µr^Â~4¦°Ð J‚NVlyxQèΚ= Ç‚ÙôKú[bäFõ—ÃûßÀN:ªfƒ']Õ†ñÙ¦:Ê語£}èº!:éx‘$1:G's´9l壨ÝFø‘ÍFu¯‰wý½Ãå¤ÞÈàð–.Aÿ+*ªni—"Q¯éáÍÛÙñV:©ÇOè«!ôèxæ2˜âÍ@=Q½/ÙèZÊM ç_¬x°t¿-§»ŠU¦ñfº^*¢k×4sålã›»Gš”B!9Z˽ ÀiZÁl—ªÄÔ'+†H]1º×ì/ì¾Ù~Sˆñ;Ì;¸¢B54#Ç”ºŽ³ T;Dà Z»œ}ø¹–®7D55NÐlãí¤Yáä^ê5ÕÔsb@C`èggü8ÿp&Ucb¯Í*,GÛcõRüÿõzÕ׉“Uµ’Çsv\–‚€ÃïÛÜAë À~Œ³ÔE“È1¯•…±Sï⸃á ?©Çˆ¼ xªõµP– sù‰€ ¶ÁX\_Qa½ë¯’ÅÀåå.ÌÚ1EOþè4K›¿p”~U‡ž6iðÓ sD²¬ÆHÙ¾7¡[1н «Þ¹·¾(û³æ«ã1›$ái›Â€ìÍ»¾ÊŒ×¥½»±AŽ9äqÜ¿å>¹ÒÚ ý§n‚ëÚNô8úÖñê"‚4¸Õ@ZÃØÑ_4˜Øú¦Æi 6:‹—ÙšþæòÕ—µEjX;@’›ÙOÒ‰+Ä =ïªëø½O ò!›åÀíç#û(çBþ”Ï9‡Ó¡pwzÎv 3{2ñI-¼®Ñd1à€¼%ô ÞàáçÞÚþteU‡ÇíÊ/á©ãšé6‰2Ì="*q%¥ìú!?Erþ2ÑydãqI‘™Å–l-Q¹È&øé@x@ÐѶ@ãN}³Ò{õ~˜r³Mºcâ¤ãˆ‰FÕÙÉ©bzô[ÉÇÙê“uÛyÞeïY7‘îõµR™¿vñÍç €ýµ¯=¤ß=/2™ ûmÏáù·"ñªø½Î(øS+ý½¯¤£¤gQ¾ pýb…i"’Þ°×A>É †?X\1EšáqÃã……µIZ C¨˜k§Ü‹Ê Ie—>…˜öL”–£aš^‘k¨ŒÅ&2ÊÇpgcº"÷vôLïÚô1ÇjIU”'c¡”5Fob°”û›¦W ¿b1j¨NøQ¿\\ˆ£À (ÑzòcPv¨ª°{C[ÆæHç+'U¨•Qè X¡ÅIËê?âøÇ= ×K6b*æ%¸«“Ř¾¤—.Ä¿^¨` ¡ŸùûöÀÝÁ˜NùþŽ)á·œº†É‚ÀýãK ¹)„$ƒáèbúŒÉ/¦ÇY"ˆ<Üì÷£ç*©”•+ìáKb¹áí GÞáÀ„ ßå·{á;¥`Íq“z~ˆÿžÿy\ý„ƒCHçR{›à9äÐ^PÀ$Êp1]F}œK'ÈêÆ3¢‹ ±“«}´zª7Õ¾Öò;Ç}^õõª×~ÁjŽùƒ~“@ #º®OËÎà@‰EèhïösÊ ¢Ø~W鞦>¨öáNZ€3ŽÕ†ß0³5:ÄÁøé! åÐcÆÞÆõ @1yƘg4òteø$õ8ô@|¿‘"0ëý‘ÆË‚hhBº€ÖŒ¹­A3VÓûàˆ1ãø¸3³/"ow‰|I·Ný*Ã{Ûzú˜nF" ;umŒ[€Iò’+åŸLèy™3DŠõôqÝ”n†»•ö‘œ4Ê_œ›¬Q¯o`¢ÉÖ[<†{xÃâ“ÖˆÝ36N3k©ÿÖ}§'Unî⎜iRˆ’{†Â$Ë€Éé9µÉ¹i-ŒmÍ€ÿKÏmO ýZý&8›…Ü0ùe6{) ©¡‚Ýzû•’uØa@É]R ‹Óma’)ãy¦v¥“ø·°Œ%·l6`ì×m¯Í9×ÛxŒ.ã-®Â/À™‰=ó ‰ÑÛâ[÷ŵBÍœýdSsìZÚçð·ò7‰ÎëqìÿÕ<¸&×g…Iµ$ùDƒ©¼µCÞnÿBI÷Rjð2ì—›{GËÛM.õ¯…¦?²ks4"­» "z£-ö{G qH 8èYÓúÍ=Õ­¡€ °[Ó¦X6JnœåÖp¨™“è…ûø–à41X//gòí;Œ.wÈ–t{»>Ñþpµ¯P£¢¬£!»ÁcFT{0†~¡ÙšLå%MýÓbSs ØÖÓˆ½02CËçoøýIÍçw’´ñÕ\s_½Ð»_ßæV×ìØè•¸F$…ÙSʤ™áßîwán¯¹Ê&k[Ø_†µ!}•ëm½IÕù·Ä’Žk1il–ò–Dæ7é–V:T´°‡\Aés‹®ÒÛ$žÁrû,?B&Y¬À©F\ù5•Ë âiUÂvzGúûË {*ü%¢ó(óRˆ®€¹Q—$My\ëÏ¡ÿ¨·–nç4\G‰­u‡£«ÒU¼-ß`®·Ç%¼]f—§‹Hßµ±¿æ«:$ð«üûù÷ó—þìZšÿ·ni™ÖDdFÿap–Ó6”34ÈËÐé”ê%¥~ýÖA£Õ#zÎE”Ëü9éJçÍØõa¡“~X´ƒnrOTtÿAªM/3ü{­Ë/OÆ„F/ñ晉*€<$§¯W b¸!*2åú2Wf¯Ð½(`È>u:c=™!ÛK½å1uD‘e®3#]™4OøÂ}²JaYÁ ðìO#ÇC\¦Ím,Ò#&ëÓµ’©m—ião<Ãiê Ó ³“­¾ <Ý;C1y‡a äd›ÕÈHù04OB¬Còˆ˜6[Ôn¡xý¨iéeû£ÉÐÌsÏUÜ}$ŠòÌGÊÜa d’䇈2Llû9c?ø˜bt«v(Š7IÿÑ_­ÒöØÖ˜—Œ1¶dc‹:‘ƒÔ)@Kä†óFkËY´œ´äiu0ú8ÿiÂ_çIÉS2ãhÏð°í¢¡"dgáÂHîÁî+ ³ Å¬()*z_ÔVÂ'Áÿõzu4±vpñZÚÌn§ÅeeÀ+`P‚¤—Øï“€Ç‘á2$ŽÈnTbÚ³“¢‰f¸u§à²?žýÑGç/°BäÜ®˜ÃPº8)~#%ki§vsýuBŸ­Z"IÛHúfÝòÉí$ã|Ñ)@™ù8Oc{Úúéñ4 °#rçÖ¨Åí˜à\5a“’l„}¯]uMßÌ~ÏÑÞÊ^yÁ1‘ã(¬„ž˜™¢±O›ßè&©xkA°»Oj$áX|¢`Vää€ \ë‡Ä~¢ñ¼1Š>Éèò´G4yü³ë‰‚Ú´U1 sdXÏL¸’ÿ.ÓX¹±]N~Ї®[V¤¯x—†£¯ÌäìµXœLf†o¶ÎKNÿ7¹Á|ÂiÈZ0¤_iâRÊ2®qHáÑâ>qÞÿpâ?³µ›¡€R<Èc½òŒÝÑ#Î,“ubrR»—m#—ñ@Ädšþå:8Þ·oG«±7Â’âYpØ)-þÑù¨*7ÑFÛ(³pS‹¡D*˜Ë!—pùã°ÿ†ÌoœX¥)Ó ¼I/œztÁ)«0ëHÙîG8áôëb<ïô ×QaúAˆn†ñìÑUûËHjSAr+‹Æèêå«• ôZ¶ŽFI£:–ŸC^ØÝìN^R<„AÎ:Å,ZDD/ðW“¿^„0`b 'W«šXQ&­ÝKH\ÖzP´ž²7Hm—S[-ïE ‘²S 9àC½zp›®¡ÿ"™îjm<4i¹ ¤Ü9¨*ŠáNÜT® \6V€°Z¥ï Žw$L&½®Ø7§ 'FÆ`ià n–…‰¯“¥p s|‹ ¥4BÐÑmµÓ´2Î4 ‘,7zO€/‡Î–nØW±£'U¥Mt<€ËTY#–¥FZ¼“s±ü˜$×=`fÒÚåÌ‹‡YÂKfá­ŸÓ×›­ÓY,†ôÀ‰ô\+h´ùɧv‰†ˆ•[Ì<=O€¨†TⲟÊß_ÿ‡.zÿ*GÕIÒôWhwõ× °^J¹H1­/j…nvÚ,OÓF5 žÉîv·ÍZ ü0ãÊlæ“ø¨C[¼uª똰L”^fS3§ämÚ›¼Ñެ܉”‰[u¶¼™òíÞÅ#‹©[*è»AÌÀž5lÞ(¹¶É%A²M“ €ÔÜ"g¹ß5¥–è?&âöÏ´Ô#>_£|Æ5}ew&¾†¸A3wÒIÎf¼|´í8ÝÝŸÃsÿÑù7žîŽ£ûÄèÎÐG¯%ùÌÞ¸ñ³u£JG„éÄÅÂ+>=ƒ¢\ØíaúOèßÏ¿ŸŸþ3“¬ëLmçaÿŽ%wÐÇÐR¿ë!•1y¨d†µod[4 .Íõ·Xécª¡™K·2ÑöA1ÇIÉ5¶‹¿½¿1cnzœbè’Xªkþ]ôøE¦C¼_Ù%j—º=v9 E*fп<6eòBú6«q§pcí@…LH6Ý¡”Þ²³'ª€„w+g¼Y0íÝØ’ú¶Þg‘শ Ä.L6uÚ!ôSeÈ× -Þ ;·Aî€ý4›ŠKÆÙr»­J´æM´I=ŸÔ’´ú‘½sé§a¢­CöHâþ¶•hÔLDXÌòð|}-­ïœ¯Î[Ê~çB<‘t£~°T;Ö<(f»qÖÔfï>Ê7Ü«T½X^ 6í;QŒI:ÙmJc’PH*xк°öuÛU|.+˜ãì½A¢\-飱ñ¢ÕºÅÅRxŒžµs¯ér¸.pC"ƒdR¹íòÖ‡qéSÖѶ;{hÑ=0@ì1f½¥³f(D~…`íýÿÚ5ÿ.|5Tua €Ž¦òs0b4CΨ^[Åk'@éëÃÄxæ]×î’3­ûG;Ê’ âùcf†«ð »K;õÂÑ =µ¹>aû!„CCÿt€&h2nkŒË!•lãhEDdk„ s̶ç o@iJ­¤»SÄu2ØÇѲdè«Ìs•&öUdv4¼ä¹°9,Ý¢ÌîU¸z^qLtnÌ,`)V턪µ jœß`ƒ<Âl…¡Ðš¦`‚Ú`<€Ñ†'êt×…’Zµ 3‹lFþëb)õìXÚÞ,Í$L"ý…¨B:I`°h˧NUÁs×€áYp)ø¾ñ%NY‡!Åh6Í!vÊ”áÅXm2´áïqNgÜ6KØ™\I‰·Fð±ET-p$ÜDTN ãLÅà:1qd:c9³¼;ï'u4¿ÀNS*\`½ýü¡Š´yjA;C~QRd¥ÒoJ éÕ¥Ë/>ºÔðc¶‘o¤ÿ1&¡’•\ïË­L§³ô÷‹Î»6àŽQGF5f£ ×#(kÉJå¢Éf÷Šk_lÉØYÛý ‹¼ÕðxÔá»ýù•½†‚9ø3,”~•Eœ\âû­žÅz͈"€PD21BR¯àE6>ƒIµNKø ¿ßпÝT¶áH.Fñí—5meì~sñt]ƒ¼!>àHð×Q×^F,/T´¨èz9Þ/Ö0†lkFgõSR󺧭r-­H¯¥F993Dë9LË”èùy†ìQ—>J!êù¥ÿw}¸*÷:« ðgà9DáA„ ù¡ÿ`æï9¸}ÕŒb¾Ñ°°ƒ’ ‰HX¸ äj†p7ãÇ ÁLË@¢è4åƈÂýu1]À,Vu!¬:+AÏtBм_–š°p ææÖŠ©ÊxéÅ›¼ròŒŒÝô@kUØzxëˆâ]^å^§7úöËý@Ó˜}tµ¡ÿÞ~(Ëg¤·«ÿ~éM>¡ã»Â*y³n'ôA:¾èÓˆ–µá^f¡Š™’JD…¤‘‚pœ£ÏWPSrpBìGÐG´wñßǓނíÙ™a­Ëõý8!^vÒ§  2a„ †”Jܨ N’^á5×eŠM½¯¯ZÏÿ­MÿÜ©¥7Í ‰kŽ“¢ ­ž‡"̶z¯œˆù$f§Ma>Ä`Ïpâo–¦ôµçy1n:Œ^Lj_çÏa–; }âkì«Ñs¸4ù9?»Žây—ÒwJîÁv”d„Åu¹¬sã,]û狜jLÇñ­¡½iËä7y£ó{_ò»…‡šÖVµ-bsÿRïØÀ|*®Pbñ: ? 󭊘÷qëäÈÃép–):–šÀ|²&«ZXùÎ'òw”ÒÿŸÊÖÏ”—¾®Cñt é‘~$‹ô“â{ÀÆWns¯`UæÉŸðß`a®'3¦`¹ÿeo`_Éç·©x­ý¶CÞ‡˜ô‡>VáÌ&Özn_Ù‹zÓÛùï‰Î£,LÚÞ/Ÿæ:fë¤èç)ý8áÚ_Leÿé–7W<Ó¡A‡¤Kïß:œíi †2ÅÒ1f>— ]ãyÙ¹ü̪#d{R2ÒëçëÌÈáÔå^„TΞ€{?‰*Å¢ÓbcðätŠíö›nƒ-ÏãJp¼þšßUð¾(=µïÝç˜÷„q`ä`Q4'Ë "J•7xûÇ0¡ÇЛœ±¸žÊ|„Aº¨tY‚àG¦ØØ1ßÖ jÀc®h¤¥5ç`Ú¶ÖÍåÖ› €&ÆÖaîH–K³­]j6h¯:„ÔŸœÈ—°Î ¼u¢Ùìn.gå÷‹Q4ïj“ ¾,•Ø$ï.:­²§5‰2ÈÛa£/:ô¿½ã6§Ñ" .Ñ}>A·ŒHü[Ò‘U”ƒ¨PBâ«ÖZk}Õׯúªý}ƒ†Ò'n{SXìZ«‚ÇEªYk¦tëöþ„ŽØ„¾ÙOúmkz¯¼Ý­þºæø­¦+|(š”ŸjÝ>4Þ¼dÞXÁ»Žo€œÿ>Ñù·0óÕèÑâmŠ;lj¦Ž7ú@aø¤¬<Û¢`ÙSæ¹»†éUC&†ú¼4,Ùúüí@¢ ôïç 9NÙðØùïþ˜Qq‡j—1¦ØšéaRO*îR kB«ˆšpÊé´ËŸÝÚ7î *®ÛŠAž3·©ëãø‘€³p½Ž´i¥mŠyŸ*ùö’™ó¥M¯.‰‘jîî‚´þdŠbÍ"%qi.YR/çv·3fñ×`A v…(Šeà t|b™"¤´²FkCú@ #ƒÀpKïþL ëí翳ýy¡kyKûð›‘Ò:*¡÷¢„PNí¤Óíÿ]­YÞ’ÊõdÙý·ÃŒuRfµ•DO /(™¿ K¬Ñ-®Ø‘­K2Æ}Ñôjeªo¨Ç7i±Ù äšÔèTr·Œ¥-&Ê0Éc1>#³¸¤MXœ>ؼhA=×)ltƒýý™­\m½¢ÔŒ«å5 sÜ]][„vÓèÙÑbȬD›ât­‹|ÀZ(§¾t~éÞ&œËB(½ƒ£AêÜ4ËÒ.ˆtœO‰µÈ¼(½!”QUÒv,Å]Øò^,º­ ]_°‘ж¬Û|¿¤‹´Ç*Ã{Vq»½8¼ yj'¡ÖŠŠZ_@­@½DCFÌ2_„mà ÁQˆdšž‹ÑDqRy Å‹åP"1ö†”[û|Â.ÃÚŸÍX3¹R8ë9€È£ilÙWìfêóÀ&݉À sÑ8T‚#J¿Šˆ.&^ÂÒù0}d! ù;ëÀøP3 û`‡DU_â¹ç›¶`Ýù ´‡0SƃÚYpM4¼F®Fh™¿ô*ÓëýWÔúªEDÆz[‘e‚õÀ0°´ŽŒ ¶£vÜ™¦´FѶ{Œ<Ór‚IÑá_‚³É~€ÑÍì¿[$-ˆ;d4¡n4ŽÜU5ÖŒþ[ÌQ?Í5¦ àј³ŒÕõw tj½Ä„/»VP)%ÛƒŽÎý{MVÓKuÏ6$4LûŒuq{`GSQ¡›+ÎÞæh„¡9•i³ªÖº€ Þ¿“gŽ5xrýC65Óö×!cGo?„Ê£í!EÞèu$·½À$Ô~¡Mµþ[ë)ŸtÏ“—|ÑØÄ ùÆuþ¢óÞÔJÃBÿy“…jV¾õ‹¨ÞÀË~[´|‚Ìù¸ôÛ3›ß}ø'‹AK©¬ÄÍúf5Œ!’pçIW1K°aX%j­$€ñM×4ÝëO‹Z1{H_€‰Z¼÷çñÂËãÒÎrúpƒ¥^ŸØô™ó;¯æ< Û`ÖfÙ4¾ÿÅúJEE½ô½ZÎÀniÓpt¯ ßï*L¶…™±˜m'ñ^ÑÞnÆ(ŠWKN$Õ'¼_ÚÔ·¦e,\Àç9wÒÄÁ±Õ- fI”¥´a»¬ZàÞ5ÓÓ+xÒ Ò×è\í_?v\èQr€w3-_rT0äß³Cw×q4ºþ’&Lú·q$¶Aªÿ׊jXŽM‹>:ŒB8~†ªÒä5ÃêtšóÉç(ÌDÆv"”Äl»é”R~š†@ºQûFØÝ € o3Åg †©î[±‘¸Ò'©ãÈOÓ«Ìo XÂ{™)¼‡7ýÜ € ê[6ZXDê˜Úd™È ‘ÊN¯©ÿ×ã8ÖÑéãPx"¾ÈáM&°5 ü¨s‰‹pìiïL5¸ö*«¤|ýiqlƒ>êü÷‰Î?+ñf˜R±¯ìÿca·@PðjµLÐÛ÷¾µÕM’s71Þ÷JÉuuP0C¤3ôKœøÔ ÌÚI?ó¥æDôa«UÂi(™ º1„GÀYÓ9;üg‹^ UĈÞû.–™¡…—(daNùO4¨ôv yj±ÅÀLËÄ6s·´”Po8rªÙAÝ€$Ü1'º!zë ˜ 0ýsâÝ8o •"Æ…“¥Aºwo¹‹Á²ËäœÇpï:XxcfßD3‘G)@©õ¤½¾Ì¯ëÖÎT'»*±¬ - E}„a¶ÝLúËQ€-[íƒE0¾á¬ â0u/˜”µ¡À¨›7eg¡[F‡ù÷ ·4nÐ};T siYbÖÛÅú¬HÒý³ã z-  Í5äEûÓŠóê$±1Ò±ò“"6¤‹4|rt1‘ßíÊ‚…SìîÀÏó¾‹}¯òš!ª~q<ËÌ„åxÝþ]—™y¶Ü£Éq6v¤)iÑbšuhÕƒX‡ |#`M‚¹&'‰í3›ä¶À˜‡ãFDjú™2‰¿Ü#´r—Ù_Q4Æ,3Ú©ôé#´Þ•~‡ôÏÒqYž/¥ÏpÚÔ´Þõî´³oð›]¥G?È ¶63`Ì:íWð”ŒS>.æ÷‰@¾j}½êëu‘—9ÊDôþq‹i æm@Àpíƒü3°2²–ˆ“xÈ )zÓòÃëLv#èÙÍÆ2cçYùàÏ-Oµ@Ú*,NR­ýÜ0ˆïN°‰ÚöoTºíé7QžÈœG]”ÉCoöRL™¥Çqã8ÎÎÛæ‘:ÛYl«zÔ³“ ß+‡â&õ }×2=~Ÿ½Pî4Q†±*¿ÿMm\4"k-a¦“Ÿgv8Í9@Iþ@áé¿ìgÆÎµGÞ'XÃÙýwøÛAaÂé®üÜÚ[ÀØŒ…$èkÝŽaÒ˜4~"cëÏïý/ò»ýLÉrmÒеP,¾R֥ݮàólê+è¾ä‡S},峿ïžïòýŒ|VšÄÏq|4á[?s}ÿÙ´ÿûGTÏEÂèR‡Bïß[DzÄ,ù‘LÇ¥+ÊqyûiŒ ¥—xò´Ô´aÓMˆ–JÈ,xk`ŒþC5:ãî x3!L1–Ø‚P>nfhc‡HYÊ\B˜fÃ3Ÿ¬IÖ aï+ù·T֭É‘!¤óÛF#íêBÝ~D+{ï4”¢ HbŒÔ^;Aéæòùì¢9®¡Uíùךj4„Ìagà ;Éûë˜$|F îÙ—®Óu3jæ×F­fVæºEß›"2)ûÀOÙåÏÌ –’Èþõd (šÏpRL `ÊðŸŸå>…³X Ÿ(°­hÇ1 ?Ìn±'=ø·¦‡*b[^†ß’Š„Œm$ÒüS?ƒA¤ÖtË–`º‘b»€_ÄÃ#ÇmçpC1Zñd÷ºÿîy‘<ÊѼyÉûïôÿ:<:'Ö·b¶‡¾YY„‰&‘ÆSÞç,ù”m¤Eø0‰mªÒ‡¼@îüq+[–ŠwØýÌ™ *®,ÀYÛ( ± ècîm‡¡m!Yë§]çQ€s¿ šs¸ÆÓçµj-4LTsiõسqûg¶™ŠÈ/~F{äJ¡P@ü‡´›Èa?TÓ|öÒk LœLgÄ™>“ËYHÍë`s¥/ØŒ¦0Hó%L!:1ºâ+†„tûn=ØKöÙñc•ûiÞê!qyP]nO"Ñǃf 9­è¼Þ`ÛYSl¯~ãz òö•ÑUˆ¯X^…ŽÀæÕz¿îóÓŠh8²^­ÿÌ †±nFwÉšzerÄúÙÀŸGhJ¯Oô¥2êðÎ[£¢¿#gá 8‡cw¤6„á(i˜ìÒ»€›9ñî\!o|ÿp[#1,pYä—6onFÿ‚ê †³ù{Zø"Ytge%èB`„SÝK2¾3fBÆÿwè¬Æqа®¨.Ód*d+h Ϩ™SvP¼‘k8¬Š3„®j|·¡rzË註-QøØi‘lÿ~`„Ésjµž£Ñ.Á-PÛ‰&ƒîÍ‘3r‡¨Çÿ%laÄý-øÉUÕ>9<ïž6ÊeÏå«[îýÛ¯O¼¾bHÛGxÂÍß/T0)üðîórU> âøÎÝ?0¿ë* PåMª+,8ÕZóΊƒ¿Ë²d2» †v“¡[‡Üýrm>ÂDZ± Îr'a$ÅÒA}ö^š™Q¨—î%ýùéóŽ8sÔ& š9ô`*rCÏägv^:g´q¨SS]í }–m^öšnóãtô.:ò[ñ† I£Ø)²É:#J6õ(_ ÅKPVJ—ØLo™2+2l´{ï SÙº´é4Þ¨‚”`n5NÇXš½3Ü.‚p:i¥„®!^ €¾,É€lÀׯ. ÃÞ“à$øÐ¹Ú‘s›Þ-=Îkic´á{ëTe†þ#âºfzUË36 y./v ÿ§ûîÙ¯´r9Ÿ<9-hÕÿëå(N3v%7ÃLX,6xÁ°§YÉ$”L$Ù l|TžªÎçR¦é©À¢¯lMî?}‡ÇŽP¸ÞÄ&>è  Ï&Òÿs~±p¿6ñ\©„¼L¼TbÜ`¯¾:K¡”nO³å3èžÊVx_Q–g@Áˆ¤ñ9¬'(š[·šQšÿ.˜ŒkºÑO”âlšcØY”Bq7ØŠÐ(SÜÿÑ{ßÜqIÛIú½ ÄÂÅÒÒçǯòoÿªÕøv‰3‹·.ÿÿm†%?ÿç—ã2½X¤ÑªK¬w<áwl†>-<6¾UÍç™Íde£Ãj&L2SÂ^ŒñÞ–¡.A” Q™—`6/5'Ü'ÈS²7ç¢è•Vwr˜ð«$'tZ=Hú¹Ñí"Ù]¼·;û0‹ÃËi¦¿A]äj öŠHùœ¨Cö‰ÙbòÉú Nfêà€–•Aþñ®Î¬”¡´¢Ò…Rˆ¼­Áî±×-Q•3¥}è&žrÐÚø9GÖ—M…ÇœñðåÅZOš¿<Œ~†Ò‹œÔ+îS ê(k¤1;F¿_⨣ñ¨Î~®8ÙÀ«÷N.,qõ7™ñw°ÎÞºyý¬Þ@ðÿ~¾iuÝÒ5yWÞl²é¢ƒ%5 ó† õ|ÇÅö¸:"7ÍU_Ñ­ìhÝøðKùoþ8ìæ»E”x`~á±}Ç€ý´µá·´Îv'vê¯ý´ìn@Ú>yÛÌ–eèR˜£\ÍßL&dÛÛž¨Ë9Zõ 6ÍUÒ9†òñØ 5ìýFº™e˜ÕÕ×;V—÷á—´a]9•[g:G4Çb³.jÝñ+3)áYe‡Ü9û7y¼hœTÞÜ¥Vœû8µd ¹.Í2õdIƒ@DQªð&ÐU:ŠºŠª¨³Õo‡ÅR›ƒa–Ã[¦6€<æÇSs ±Ä9„q+Þ½†ñµ$þ„ªÏâ-Uh<²0]OüjLfFÝZÓ¸¼8Ï`anâú(]‹qc9»w×%…aÊ[ÓL¾ÈsG½#…ýn¢$ƒÞ¥¸–÷Œac]@ûÖ¹óŸwò8G–s`š7»bñískÕ̬– ¬Šj'U9–#›, œ ñu‘z÷ûæýåýú+"Ò0nÚìNõEXñ‡jI”?úÞìZdŽÒåÈ  µƒû³@iSEÑùÌCDÉlÔUWN ö<»f(µ”ã`'N3ŠÕ¼\‡ÄÂD»W ¢„†¡”Ó‰çj¼ûùu) ˜‡×9sM˜1ÏJ±~\r|”At4H:½™ÌÓ!ò “K"AïÄØ;s{ѾðýÛ,c– ùÕ F{küIÓ‚GÚÕ äÅ õÐŒ—§õ³(“ºo´áu «ØÒJãbqãôˆ0}Ð6¥òÀ0ZXM˰wï bìv%ÄüH0>–ÜÞ#Dïa¥JƒT&â GÖ,œ›EÙ1‡›>º ydë´Ç㣠åÙ¹ÍhGT±Á¼›¨^«‘¤â,!5€È÷M8â4õgíKvåÏ<˜1ÇÁ£sZ 7ýp@S:°ÒÖTâ…òOY_C6tÇ(ì¤[&BìÂ@kúmR·ãO»ùQ³k[í;iŒÇ2%›ÛX¥\ó+DÔwìÏ4¾wÝÝ}㉞ ¢¯¯îøþÏÌÖä-ø–™LJ3/¬¼Ê(ƒÄ aN+ ¶†hNÕ´¢Ný–gÒW]:¯,V‹mâ=yálÙfßµ¨ÏþDç'#;A il¸6Î0™©ãºZFrm2»%Y¹ÝB'¯«ò”°©…Â}w 0ìiÀïœ Në7yüpøß±«>Þ³_ZlÞoÚw­°¿ŒÊãÁUã xüçáõ¯F87ðÅÏô†­ö˜¼ô£XŽNÏl$ ¯e1¹mx¹~?N6ŒÈwMÞz C^*(¨£b'i¨möÕ]M*5žÄg3_9Ïq¸¹XnhqN;õ­úöÊ.kéå}*®z— ÌÖ¸e=<8ܘux&b½J)÷¡ÝÍTÂÛ¨u•d£µ2 ßw4KÿÍXæºSôÕà€Ô5ù£gÐSÌbÙÀ¶³×æõYÈ ¾A1|`{`ðÿ'3ɨ\ž¶@øîîg˜ú¸-ì84ÙÕ˜Š™Qð.Xôd— b…­·k‡v.œ™,µÚÏ8h‡}ìAÍE ÖÁ²É€¢Ëµ±°:).–9SÕ&IñPÂæÛ¼Æ>c»ðò è¨îÍ;‰³Uíj/çºMTí¡Qog›òDzæl–×)òÓäké¿×é½³™2OÕÄ}häoÚÌ\»Š£ è¡V-ï‰ü ÂÅÊÐ –R%"ŸœiV”ˆø['p2&zøÔäµOl{ÚÿgW Zª"Ð0Œ0ë(CŒ4‚ã÷ÃnU'Çj„¶Nk¶×0gD<çæÆÐžµÕ©qH†ÚWt}÷©Í2†ØÌã)Qh5`]'V[`¼K†;+UªýÆŸÓeòË#5ÕN„R®€B'‰‡|rÁåÃ6yêOmGRk¢¨Gî𚢦+š˜ùÙüäòÊdðkÁT¿oSfV#*,¸¯ºž«3íyHøT2hdcýEHÄ,æ1QÎÇ2}ÃNQÿ^ÜûðŠ+ÐTŠ%žU{Ý‹’%ßɶNpÿý–ÆÂXâí®É}*93 z·B5Þ+-˼ØëNË÷… ÍÏÁ87ÖJÍDêçn³teH®ÿƒ&ƒÿ ÑùC6öÅLNfï=zE²÷}ÜûªŸŸÛV¿çç×»`ÔÌë$çùP:}ÿVïK«50欠÷Úà >(ñŸ‘æ‘eäWqázeÊ‘.cºLr¶®L6Ž¢‘Ù¿&ó§¬\ëêYŠ1Ÿ\68ɺ#è'é#rÉè4¥°@T.¢Ââý-Œ¾&š• µõ…ÒƒmÁŒ ÌuRS¿tYÌÿ±4ë¼ÂrÎ÷¨1X°P,»¯Zû«¨€ùt§1ªêõ1gÙþ‚Uâ»DÖÖÖÍõ¬´±(te’ ÔóyV±ÊŽaXàƒ7H6”1+Ö½'0…“ª6¦AÒƒ€ås»EJÓ0g×#z¢-@}]¡C§ ij€’ó‰¾UB`ɶÃÂiõ‘O†#Ô¸´ß&¤]AU‘r´N㾋[õaÎá¼ûƒ™á {,ùT71ÀŸœ6|±Ñð´íżðÆÓÁöï¤ú9sûþGOt¾wwQ× Ú9[™ ¿ ~½¤JvS]Ü+Ñ—ùÍ^¯¡à’ý:œAóu†B%=â†yâîïN±v‹h`èiC‰N1³rŽ0´¸„ùÌîzRœ:%™7'™ªþWt((µÖ׫¾*NØÿü¿ªÖ<¼ÖÃj\PêÁ€*ˆÅûM÷Lb¼ð‰ù0@àÝ›ÜÚLx¨ËƤÏÌ÷Ãã»V†éÚäæž 1í4èß9tró–ñ gJ—×jµ2ÓÉÛ÷ÏJ‰ûL8/>þX^-ÊØøŠ¦ÍÒʲ·vê¤fþùÃÛwWþIEÿœ£áO¼À­ÞÒçÑÿ?P ì_ŸG¸Ï­”·¶¸&`B6/ÿÆOŽ h©ïÛÛ6ä¼SäÁa…%0ÕÞZu»©p¯tn-ÿÿøÆAÄtPï#! ’Àãq„i â·¦FsyßG…¾p‰ke¤yç1™éÛ®ÿÒ¢hÍ—{߃X©Q-¥Ó¢$Ï·^#…s0ŒÞu€Ó…°à¦;MêA;<Ù ¬m-Ù¶k2.œšÞ¬OLÆjcWË…³¢<,œWÒÈátȈLa`c÷=(ÉìË'—×¼‘Âáíi W,Ž–Öÿ†‚Nˆ¡^q ôúçшî”1;ç&a†Þ… ¢wfó(šG£¡.$G ï˜Ç¸fƒÀM ~«×—f†UyÁ8ÌCšO\Fjá²øA6¼‰-¡X!`øæwS{wýã$Jƒkd„fžÓ“œ /„«#½óO§g1{|•ëßr²Þ·*Ê„ÐâÙu€bG©3S9¨Â”£ Â!]ö¾dÓr¯d36O8è³u(ÉS>J©$b¬êþó€kèq¤Šh—‰±Ï˜¦&Š.Ð¥º›‘Dc¦…IŽ~”¡JtÊÞ£~ßqÓ,¥¶i´ðÓ›˜ŒADT=Q¬«ŒÝ´àÙ&%PSC‚÷ ȃYrƨ‘ Ji˜_!k)ÖœR?x½^¯sj¥ªš7;·`…U³¬çs bØwYצÑêè\írõ:Üy#NCî)Ÿkm”U Ìõë¬à ¹°ˆ¸Uk­Ð´†cy€P!ØôjšC½ÑâØh%;#õ6BJÔª-v2W Ø=0Mþ®h4æFGï, z ™sº?˜Sa<=†¯¹ /–bŠ/û„8÷ÄíI’v-Gzó~7}wžÔ^ð³Qâ@yëõïC0ÅàžG´Í eSë‚ù¾ûp£ÓɧÁj÷Aàé‹»J¤¥(+ßF Q¾î¬[)ÁKI)z«•îvwu¼êZ]“Íô¿":w^Sq*:«²ÐPMQŽ£4Â+ÅúÆhîÉÀë´vÃ>vئéŒW×5Æ„-_¥ÍURµú›3_£Ká™Äì„|õOÈÀ?¦‰÷cÉÏx?âÈG†¼ó?së©´;ö•zh¦@|æØ<[24Ÿ 0föK]~çš wü0î÷lâ`ÍÉÕ´Ðÿd.?{f(k–”Û¿”вàqû^*–ªË1¢gƒÄ¬•Àdd`.È–&m²âÇpw7jˆÏ0s(²D\Œ®Ï–ËèuçqУÞ0µ·€ífò‰N˜DU²Çâ›çØIç\T¦'í:ä˜Å/p9'‹>Aåóš ÏZL n¼ Xÿ â'i†ÿ¯ baŸ-ø×s.¤^¾\ôFÿ]–9‡ß龜c[›=˜ù“,ź&6º½`Ç®ŽqÑž5ð0O‰Å@O®Å5põó\ð±ðtnÉøöl…n7sN뙫ĺÎE#ÿx 2u¼“§³&ë¦yåóV´§µrÐ2Šjzw”›—ÑÂ%e¤i•Üe½eRÕx³°ý}ÍW¡6_íZQ_õ4ûe¡¬È’Ò¶¥|„SWKO*ßIÊüe2c û$¬zR¶§`mhš bwÒ ø/(;=IºÖboœœÅüÊWEí¢ÑÍ$RS q† ˆ’õ«“Ì,ý¿ ö]ã Cj/¶ö'TâQ!Ümõßí/'øèÞÁMÒ@8 ”µÚ^¬ 7e8Ôü,_òÐå´2ù8}Vݧáè;:Ð8ÖBä:ë^Þ‡Î(;-Žž[A’i4¼GEa&õíÃÔטÜÎèâßÓô¥vVÇk𕯹Õ6ÛN%ˆÔG„ñQ÷NÊÆéZÏ­Øzñ°ãüÜxwiÀà°iíYçXìÉ•ônÿ0úÏ@ÿMO¸@IœUÜY!’“­ówŠÎ—ùdpÖ­ŒyÍj’̬S®û°ŽXã7+ðS÷D[õ!²œ£ßT•o÷`~ ÿ·¤¯Áž_É¿=zø¯äru[FÆ4ŸZ*˜B…,,èþ 7Ç—u!LtVKÐßîüitâ÷)™RPPTTkkì—dÅ¡‚ü‘éá”—,PÙ¶IuóÛÁ§y¤@tu®pPirgØBžU°t ÷ÿs2Ï é[³n¬Dc\Ö_»‰xjsq\J5Ú (…QqýBÞÌ íĽ‰DCw8'ì~žèTÉ÷ŠÏMæÈ@¾YøÅ¬„òÍrçþlño ì .1–}ÎÇöj¥öóNÄuv"ÛYVë©Ë;qŠPŽö˜¹ +r?êÿh€Ë’¼8ÜlBŒ Ü¿ÌÜþø˜-¾£çø—üôD,¶äYþËÌ—¿™³Ê´¸ô!v¡†ò`(›SjFNÏúÞß²ÿgÖt:<ç³cnRL-K–“Ø’GLQBÏôh}å*“)Ú!3F%·vA,YBÉa¨ËÑW1"áV²íÑ9tµÇnƒ[“|¯èºìx½êëUèÿ •<ŽÂõ²ÜLž<ÜË©»¼©(“m ÅÐ˸ïæõ†–vþ¸\Okñ®È7Û]¼½aësÍy¹š³³«]fª.9±e¦)³0Ǣ-˜ŽìF…>·a¦ÙÙýÐ˲yŽ)ôv ‡ëŽŒ¹¬U(Fþ‡e7ä­ µ¿ð(tØŒoI{§YâmYþqû3õ)ÂGÿ<´c»ù å7¦„ÏîñGOüÁœ}{©Øaü~i©~Ñj°f+_~8÷÷è§Ñþ@ }?·w„¤dô[ŠÃÇñÿñíõÁ7'oÊÃŽÚº³¸µ`¾Š6L;ˆNí©d)¥ü¢·¥{óÉLà"Ì»ñámËeØyâs{ád¼~„Rð†Œ?MÒ&ýfnÝxg¿íHb÷„=«˜pkö39àvìÞ«4šX¼¿LÿNˆe ÊçÎŽx¾ÙÞSòŸr8ŒÖM4ÒM–]“vù|íPðFiÕä“$Œ@Ça(%Âü—>ÁÔó%›ª;5Öú¯…«ž¦×MpÞc²åkSçïÏ"åÜÃìeöìèªT_>Z\¯ŠM¯Qg0—LâSèÏÏ!]†øxưÛßz‰D×~ã0.PsihJº1ŒOdü»é«DtBD0o½?®»…Fô–EÌ?•þe}“Utiu x7GYxvÒÓ)G’ç÷ìÔ!³·gH¼`º®${ý®2ó3n-CßJôëè½QUt9U,`lˆít…fs@êÉÛÄL˲I2Èß®2,MñÖôA s+°)®yøƒ¦ôÞòf@§]1/¥L¡£à(ÔA9»tbƒmWR%ß`¹°M¯ %—l—©‹ÛÌõ8Êé `Hüñø14®©G8 U¿ÞR-Ÿš³k'ŸC¦²›¯]·b?Á©T»kd·@_ûeØC§¹€ Zn€¿y^)±¬¨çÖŠZk­x½.àóš4é˜ìOëݺIèœ}K‰WÃm9áï8­eµÑQØXr=tïBrÈÌßQÙL MPê ™J¤¢ŸOñ¶ÛkH ô3qwÉXsS—(äÙ©“A@ºÜé’ôú&¼‚QcÕ¿ëÒr·Þ¢WçÚ%µ7ªdÒBü·Tμ°½»¤ W.«e!ÙEc »üFάØt1W…5©Ö¬åò&p~'޾Ø@ 5m7r¶™UŠÈ޶¼ãƒ›5©z VO&”æ0ùH:=åh+W}uý›–£otX›â¾ x¯¶ßÛ|Æ }>ðátÃSò75FÖ:¦6ý±á‡Êßz—¶Àµ¾´÷1¿3?C"Eø« FàUç<‹0H‡ÀqåLŽ/|áYNñ¨äx*?Ftå >f^\œàrq÷Õ3žl½xF$utô†é^YÞ`XÚ7ZˆA…! ¶ib]Vt.ÅýÐS6 »³ù'd ¿áßÏ·ü`ÆI®Îl„Í †}؈èZ>ªjÕó2òÚÃw œÙÍé-ÜA¼*jm¸Ño_$Ã-‘Ž´k1Mç¶¥å¯bþšfsäê»R÷;äƒh*r”<0ˆ›…ãúxóð%wù8/.ÔãïÓK`;Ñ,æ«ÚÙÂVŒRþP8“ߟ<¸µ>>—ë«%ùå)úÖ3¨xd¾5‚í¬7¤Ù8ÿôÁqeÖœN«À¿4%WãSùˆ{»€-Ê¢ª1V¯ÐÕØf®º4ä’Ô‚rÌ!L³è„š»b¨BÿgJ§Ýô¡=œTa¬ì¦@d9¸#äV€V’ùN•3(4‰p•¨±­îq†è˜w)YãJáüïe³ä„ØV7@IH,ÞcP:ŸL:œ¥?Â1´Šü‰ZIÂgY"øêõ@\üþšXêq¥µ ( A3ô9J!ÚM¬ n˜ÏËßi¶°ð¬8‡ív<$naËÞ¦g¤…Ï~Ò—Jt¢ÝC›ÜZÎÿÅlÁ|×øÑõ®ý~ØÖlËè8¯Ÿ¾ëñšÈÜoóãH¼a¶7Ý2L:‹ 8]l’â¸TCäOÇÅ|äQƒÈ­…ÿÑùûÁ… Ë¥¶éJ{æ¡‹©‹cµÖ.Ét;°Sï"QëûÚÇr©ÜMtç¥å@&°T’Rɉ5»æx ³D#<µÀV»óÏXan}ÇÜ’#»½ªýc#3­<@w]ÓÖqiñH05¬^gWާQ|x«Ì’2Ž,°õ»ü’l.LP¼ˆêÚ’-xâm6®ÕõLv /þd?Ø~¯È< /3=‡šþïÀ%/S`ïÒX6¦E¥”£ J~­×²? 0xk¨ý»Úƒ—cb—±n‘½µX¯çuš«×ªJ—((Õíãš,¨Ô©°à¡¾­ËmPbz#_Ë:ê‹rR0Á:½¢`p(d¢Óêp€âÀýexП†B%³“j<ľV#VÇuÁm¢Ç=Ì£¦uX6ƒWе8´ÎàL…ºxÛê!×Í VüÝ^êÿ~þ¦ŸZê8[PðvmÆ ò”𝗬û8빃Ï$?Q÷za]¬¬öÙ*;it\¦"t37]¦ŒÓôÆhŽëS,É` ‘Ú Ðα<ÕŸFÖŸL€Ðbýâ8¤¨ðÜÎŒ1Nf0¤Tvd.lO{%Î<ÐIwå49«åUqΕÔZj}Ýú>°Œ­å¡,ç­-OY$•N¸³à1Xòö|>Æ9ПùQ˜“›Y›Éo%ru¡>µë†ÝäÍöÁ{}¬žÿdÑN43¡ykÇxû bÈSIï3e޳,‰'½ZG^2,xoqíMìNñ[Î"ô‡âd$ñGÐàÎß´ |˜Ýþƨ2¦rNÚ÷}A Ž¯Ñ–‹O„õξ‡á>>y©„Í €ÜÚ›Œ{üg&øìdI­`@ì¥_Ìâ|AnJosoàì\„z³™)ˆ=8ð­wô7‰ÎoÂݳ%æe8ÉÛÅ0kWå 5ûAe®?0=ÔìÔ¡µ­¼u‰—RTe`€AV¸»&ÄMœ´6Ôw‚«’»”q¡Ýêp€pýcê•ÿõêä0î1å¡ 4± ŽqXbpKX=þK¬A¿Ì_*r,1 –et¬È×TãëkÂej¾Ü„£uü¥¿ÌÜ?:†Œs§oÓxÆýýp°YÈÂv0ŒT¦†"Öaztͱ–6\Ê0)%s)ûÙòÕöŽ>³‰a”v& 9;šHZÇŸ¡/ƒ­$HHx/Äâü)ÙÓ$owl`öÅÉíƒ4¨xÔC?‰^¹Ô(œWËúú ‹GÖΰ²oÌ%>¨ñ%“Ãü‚ ÏÿCö5Ẏ„º Î1óÞ®]† »hŠ@Ìïßµ‡Î·r=Þ þ¯õU_eˆS÷çrùчɉE^. 3 ³ÜGC ¨ÎJxS*~" áÊôÿµ¸^þ®ÍÁዞ»Œw,]ÿGõN8çÓõÐ42[¦2Q'\µ×¥k,šã_¹£Ë(´æ(|ðZˆ´ââÚ ”•ô¿5±ã³Wv«M4ƒà7XÉjÍ<$Ãdp$àÁ%åüv®½úÃèdö 0÷|Ô@Žé<øH–è¢ò5ø²|AA±Ü$ºßø ~—ÔŸ0²SoÉà|åù|bËßö7Aé Y¤§—zò㬠¾÷£7m(kÒx'Çq ìˆêƒV~mYhž7öÁÃЃáÿ’è<¾þu©¸÷hÝx¤È~¦ñy~j§#Î,³Ù?0z‘ •çÑsáÅ{—Ù+û'ôïçßÏwÀ‰ ûº‚¾/ls–¨VÊ=4¸1¨[Å7p1Å0ÉÏ.BíÇùµÀARgR!´°`ø“Ñ]ùÉnõ${ΨÙÒΦÃôë ,Ì2§ 0¾P¹£À&"9ÞÀ:L#YL(±»¸(_… eö rþD±Ì$¥ÊL]( =v¬ªŒ}Á  0´„iû™%46‡Àô¸DtõnÅÙ`òó¬ø“¿c._ãÌòM*ëo1V橸-¹]Az+ì?&0>õªcã÷ÀycÇ1¨¶tò*I~¨v4†M³My¸]!p†4æ£á†u6ƒôÃÔ¾ Ê!pžNuõ¶!dç†Ø{}õ2½‚sݰ {Û7äÁ'ö‰ÇoÒdÒ'†-ƒbRU½M°hæ10AyEÁô^¶"rŸŽ‚é¾ÐÌ«µ_¨5Á»u;)Õá¾3Óu˜Q†ÑlºHDêyÙµ Œ«Çï¤sÚ¿BE1¶¢8sÈäóqž¶ÿ7,MSóçU»ÂyC:u*”I[£€æš·R8žaõˆ(GЏñ÷k-ôí¡^­råúGkL%PVC¸¡tF·¿…ŽÕYJ9º¶ Ç_['-}P’PJ±‚ùJ;Po˜æJ‚ä3Û_¬æm z+: Eé5n–ý’ÆÐÎy ¹cô õE+Fogd€SP[ƒØJVìøùC³·¡ÇãÇôáŸR°%"f™–„°¨M„æBãO\>ÁàLbƒ…ß& úYÞGboê—g¶r_F°cå;"-3 ÷EQÐ~íR'”9ý2¯›ÈŸ•yݰ3Û$2Ä‹[HœÛ©÷Jo=^b÷4I‘v€lÞ0m˜¥—Ï$ƒÖý$¯Vdqgy:Ã.IáæÅXqmèç¤ÏD±\>S ¹õxëÏÖ<³ÿfafÑx*pT–V+0ዪ^,Ù`Õ» eù*§µèàqOÝÜÒ#ŽÎ/EaÖ!Q@%è;uM‘éÄ=Ï¿EtÞ‰<¹…THJ»-#ºRܦ=ÕØPYì&fã€ÎmÜæýî[LÌOz'X&Z=H²,öi‰û~ÒØ·‘YžGå{Dô³TÉ]RóÀi%€¹©ÖǯßY:”q5|¸“P#TûvþÖùRæMyó±×Ìé{ŸæŽ£FT1[# 0ÿˆ.ÙÜ’ÜQ߸œÉb*JîÖºÍYþÒ@àÊI’©îjÿŽ?·é×jçR&²ÿû˜¢¥)õÉüþaµ‚@5¬Ð!»k†}É gdZ¹½ ªh²˜-‡kh£òAPû©æª`Ä£éPòòŸöc‘ïLR;Å)ÖKæ‚c‹oºèéÿ…}AÛÉ[0™<®¶+i@ncÑ^6ÌÕ_üÓ¿?öçÃÇü##Öü}„w>3‘úi>®‡ìdgÊÆMUŸœ··„ š®Ð›(Èɱrþbx¸þñPÊ;ûß=‡„œ•¨x~»k9Be¥M}äd6§R&C,i¶LóäóÄñêÙ¿­ØÓ€w[é#+1J Ç^8£+VWªû!ÿÌÚóË‚“‹Ï½?XbؼqÌ“EytØ<íÉê¿Eñ‘›ÙÑ4èOÕ5¯;lž\P)zI¢›t›T8 8¼Ä1³ðžÚR²z+Yi½Uø~,ÅJûUæ5ML}gzáxS…Šã±<ÓÞñgþnáš}Ö¹[µ?àäþ7Ÿ¼ß'þcÅ·(üÿÛÁé­Å»“áÀýå_ÉNra³ªñ¨Žù~xvˆèÔU¿·"3›è…èü;·OÉ €ã0~¢Ýë&èúáŸ_ã 2Ó߆‘¹4ƒÑ'åS³®/>n-‰X<@g%e1/ÞDÖø]‚z“?ª—PYª6Ö™ÓôìB1eÌíw—4¾;Ç”ê¬îVZ·Š,øíVï2/^@§½âªNRfÚDwSóýF{æ6&$%ÝC—¥Áý†Aʆa Þ¨AcœÓljnOC¡Óˆ˜6t ‚!L£°¶?.¾–;Ç Ë©õ_‡gÀÅe'o›ÓG9t·‡²ý×1vae Ç\R‹Cwm¥P¦ÔpÐ}Pb'Aß% ”> X é(æÆ-8¼^ÚÍfà­C ¶|;”l8Ö¬m†´;C ß±GÙâT¿»NÐpFõ<“Ã"<Ê…ÊÅK»#89*Ôká](ùK²ˆFH ‹9ÕL:ÖP SÆ‹Eaçänèð2N¸…tNÉM­(~n¼?в|4\wj›E0lkl°æEn„î! Ò…ßJªæŸ¾v8é¢Í餓gü"ͤ° €ƒ¥z iÒM¶¶7tL/†FZÐÐÜ¡.¹t” FuÝ…ÄÑTRžøLv±±Âƒ ©kÅIøïF¡Yë]J=ÙsÝiPÙD‹[ Û6zx¶ Ò]…w­¯Z+ðëõzÕWÏÕÞ93L Œ ´ãðæ»và`ð/÷¶í@ãî4©æè&Ð\m‚ä£Ý Ëh,þúf¾ö,Šþ7V¿œ™Ì8?nÉ ·5ÍÛ;oF*…É)FÕBkÞ^¡jù J±ãÇå:îõMÄ‘éÓgBHòý"l h›Ïç…›¡çO>×[1%Ç'ÇÀ.ì¢ð“Æ:XølyÂÎs¢‰sMy[ûâë §7¬¦°”ŒZ>½x± î#{àóAPŸø^„zIE7«ƒ3ɼþNCÿ9‚%Qj8²‚qÉ]w,åoŠ-pw™‡kl •öŒ‘-6ÃX”b¬BAä3¥û¸i½ÍéP>^ óϺÕ©5„Q5 Ë„f`v<ÌÔW ~tcœcxê¸ÎÓ£¡³èczõU_¯ZQ_µÖW=É1ö‹#ì[]¡opÄôRáCN²c&íd3½F ^4>@ 9FL„-Q5ʹ1Œ99À É7Lj²Ñs;àtÖD‘H¾qLÂp(]±8 µö•ô½¢8²Þ=kÅô†BMÚ³Øæu§0›ªUDÉͪgZºËÜÞ¶d'² +Óî9\“èÚëG’Ð÷'ת€„–>„2‰>'çëqßÛBRФì<§°Œ¢Îè6ù‰ýÍÈôcˆ‚¸d5Óz–cÑÂDïñÎQÆä/ºŽÇç.p,!Ô¼n$ýHež ÊàîLcÖÄóGxéTìerÍ9s£J ×8V¿Ǫ:˜RT̈“Ñ,*½Ç2µ¬pJ8q¦aÖâê¿ÿ…ôOÖ²–íÙ„Üq¯·±teÌ­âÀÅYÇÁ¸kT×d–ôÒýÉ-È<ÿ<ÝczøµpÓ%¯ýôšF ´Á —œc‹_Õa$”!êv aš&„º¤ { ë7ÇîòµE—^lK¥Ü¸e‚Gßp*pœ¨LÊý߇¡ÿbÑyÜÐïŒÊV—ƒW#¶'Ù$V»Heß÷LìßèÑåLJÿiW#ßn)8^ìCéË…,” ¼N± ÖúëUÓøf`fØ£D9òÝ\òNÚ¼ íû‘7’U¦Ýa-~YlB;µýlm[mç¾§ç0møÞήfÞg2͘&p•Šÿˆñ‘ÙùtlǼ%Ùˆ`¥›9äú¥Y¯4çC³dºYéï™Y—dš#^ŒùÍJÎ4Zv¦Xà§±~&¶Îi¡îÞ¢„Á‰N JKÝ%xgëIÎÓÈaÐ’à‰d,NºÁ&tx¸S3ÓTŽÍZP6­ÝÆZ!`®Ëg×aPòABÐ`ã}”¥žÒna÷;™Ò™‚‚Ü Î÷^Ff°W¼¾kŸ}0Õüª÷o"!õ%êó\´}e5{mt»õÑb[èÅ¿PyÅNC¿ÎZë!ðNî9Ò¿ø+*ßËŽ`–Õaö¥iýrSQOÖ¬o€µÇ†Í5ü—‹Îo—cÀ\ÇkŠŠsÝ\|!ðŸbpù%c†´ôÚgð‚²]EºGO<¶àK&xáG}Á†ÊÇ^…N1¸tIYš Ú~Ƙ¯³u'HgÀ{×k –ÌDMˆkx›^†BÞé¥gfDPFùŒXÚëB±í,šädÐEF=+½y•*XÛ( ”¿.S`¼­’ÚÖ¾8¥ºÁebêOg9Òƒ–«Ü89Q[«ƒ Ϻ#Ö軲7º1• ÝwÖ²ÔËAò”ñAw),DÐpW @f¦Ô!û _A G¿£³˜ºV¼ì«è@ÀNHó=4½$JÝ]XŽ„eì£ •„#« ¯×—®·It''g]·±#±bmþjø¼ª°ƒäj‰UiâÊu%Hx‘1µ SFVil)#kçÊÛ°úÉa¶ —iî¼9sy]"Å7mR,š:†ý:yX@naÁ&ŠÀ4VBòÛWÕ±7#PZ~¤[ÃEÁ‘æÔs„ü£¿׈¾ëO.ʶ`&°SÑéWþÍ©äf`L㢠­XˆSŽðø?ÙˆTù»qÊ;1)+˜8;v)</Íë­p!×ÝÚ™0g‡­ácIp1å NQòå½uæ±4UBÍS´+àé;®çr÷ê>ºë]© ôÕWE)¯Z_¯Wïã”y7ÆôÍ8Ý*zrø¼³Q÷ÝÆ~BèËŠÑ©ôݶîý!»MbW$kzbwŸùÄ1uöBq§BÇYIq+Xkû8©ø«oõü¾Vñü±b™#1©k§ßÚÚ¯oñ:éY´_@¢¸Uç­ùð‹Ããöý8k;}ä“c¥üZEï =2Kp ç×õñw¼…ÿ»?ŽÑü‰…„ï[ö«]@–?²P¿+ðšúmµúZ«Nùü×óŸÿ™{õ6¸©oœl¶³–™An(¹ä³Ã룿gãþäKüöGETòw]ôTâqònÇ}Ÿ\m^3m1CˆV—xÿÖu±¼éqßÕ .a¯s}r-åÊĸۖÒIIÍÐ î€ó¿"•¡o Ibú˜ÙK®ëÕ0ãza&¾ÄDd95 ê@m45¾d¤A×pú«.þ!ˆ¼ Ë(Ü9¯ÍùÂe•4O#^y+lV>îN†ž,å‡Sû­Ôj˜“ê Å;Õ÷Zúíº²Üx£ûC8…°r–JìÇô™5§þÆ<ñ'¼Ö’/ÚÕƒJJpú“;ãæ"Ò“]à†ÁvË¥Q`'ø8_ÛR»l-,i~´rxt—ÖŽ“LutL¢Ú®Ò@7fo®e߯RU×¥? Øþ•+ *Jw9<虂:Aµ}þH¼C­ŸMÚ|´o* dsSíÉ¢ÝiÓ‹8Qk˜Á ÎE”Zçúp§0MÔ›oM­‚ª·–Rkõ*4Ž”öÖé³ ˆÝ¨6¨(¤ç¨Áº$xRÎ4”S¾$é¾^Oõ(ÅiõÀ¤Qá:- úê qNi%ÕIjÁîè G{ÄŽñÿõëõªµœ^=5qeh-èùkLž‘ùÕ´†-dΣÿ»Î ¨ðˆaF_ÇËӸɵÛÐÙ]ô×u€Û­÷Q6̈ ûùÇvp£9-”ÒO­ë£!˜œ˜Øq¤ñ83Ð}Ó…¡éïŒ×ÅI/õ£Ý¡­ŸßUX )ŽŒR±ÇæO`W$£mBvQÿ›gØ}Ks TCëká`*ãsSï‘án«&KJ‡ËK¹Q€¦Ü^Göô¿#R‰ãõQŸ?Fð¹‰,«¹³¢¼Î5„›‚zL<Ââ“u¥[°VN1Š„Ì|æÙZQÚUL3L6»Ö05É#l4[vˆßì^úG-]‰ýêÒÃ*0¦ g,¼éŠ1°eL•Y éî-—(r2SáÐÿ\ ã%ë¸O‘‘aŸü¹™‡ ‹:X¤7è´àOgžˆAïÅJ锳|ҼɤÞrw¼®ÔùÒ…te`(kú?𱇊²kbQ'3T;@ 5ÙÜkŒöúçë1ÔŠã(j—’SËU÷·ŠÎowV†‡ ƒ·0ŠUòL‚áþ7Æã8yYùÙvNœØ ¦¤†æ»³\Óg’(§‰«O[¬`á¯Ù©öYàvÖiž´pÞèÃ|ç'¿=îõ09™qgûúÉ6ÏöiÚÉMääF9»$Z=Ã1C8±¶¿40(‹!ÞsãnieáUáÿä>êCE9BuŠûóuÜvj2ãçö¸±V™ç[+‚CŸbÍKB ·˜b™¸†¾]¤wxŸ@Û †[1õ˜7%·Ì&'6¦Hbk/\Õ•·µpU¨Aå2Øu¦wÊûXƒRVý›G჻å™SÈ£q–Ô*êm ~­üÈgú(öÎÀîÛÀldçwü`fËÀ™/hhDíy´ÜD 83Ô2s£´½›´øÂ@¯¹0§——(LV3Š6ò‚q´ ôÖ‡x83ntÐ ê[Üã çƒM×…b^‘hªöC«gáʉýz’Ãt¸}²kvTx(ÓFú_qþ\%Î$Ëc,ð„†YQ_¯úz½~½êëU_¨æð¦ÏÞl •~0}‚âuèwòª™%K<;™Q7`7ºR:ô|Ñ«¸&šD¹¸ÆÿUY¯>HmPAäŸh[(aq¡ì´Q½IV+̹©¯ÈÁ7¯ïä †“8E«2&DÝhKK/é–ôø~ô¦D‘¾ËJT]¹“¼¢ÜMe˜l4¦j^dÆjFÑ> ½ŒùÔèû¾Žì‘œ…/©×/íœt IGv´!tVnóWýmTµQ!ÝD׎–-êóÐqžS“Ädvœo:0/…§T×eÑûÉ0âjPò.:^´ûyˆ˜úÛÏ>vÇ¿ÁaO?ÝÈœøÌî …èþ!ÝʲßBlÈLk=½Áüf ÚªEái@9gq t„?¢9¬Rú°çb4ÆÆÍi3|¯ÓÕ 8»žb( ˜ÕéKLˆNuê3áÖdo–ÈûÌ:\¹?±‘u^ÇNÖç1tÏá*Å8€ŸÅšg4ôÀ ;+ô".2Kfî }û½t¢FóÀm@³³„‘-«’^#ÑÐŒ`ü_Œ!þÇm{¿%@y,žóÑïm…x£vÁï–þ÷Ú3oƒøs4”Kÿyˇëåóäžï¼Iº„&68´‰z@èT$ù˜ŸUVÙéèÈ7D°5 \ów¥X:Òø ‡Œ RôÎI‡ðÉÆ’­Ò 8¤ µiP‚x=˜Íh6È1@} ž¬HAŽíB’.­ÿZëÿ{½^¯úëõªõUë0“¦«mÅŠwgšÍ wÆ÷êV&Œ+×i+¯jØ.ÍÂöhÖÊG\É”^±0kR•1µ ¶êzF•Ádćzì>Ïá¯qóv £a.sè‰. Ê¥#yËÇeJ·ü÷sÿs쌟iy©¨2SÊ3¢þŸû©µÕ œþ5ùëjå®ãàéè‚ÏÒßYyÇ¿ú§~Þzèõ3y~ƒu*špk)Çqü{)“j=1ô.¥ÔZû£<õ3[éãÏ? ZÇñé e¡I`Vã°ÔI:íánnHÓ‰ñÞ{¥=³¼Eݾ%ý¸_[‰ù?qFñƒ‹ægdG˜-§G·¶3ÐŒ>'š„ÏîæÔÇ–üÚWÞžŽïbYô%}W‹À{…×üº» GöÌt„Ç”좽þ©Ÿdù¿ÿã땘&£ìzÖ—¼b·„Q•ËbfÉØaá1ðå<>´Ù! •d.3—èÙ¤ó°J¾#ób‘]­Ã°G\µ£¡<à;ÆÅ@º ½¿»},Ýž(Ò q¿ä*1æû^¶…Ð×hƒrCÿ‡NÁ‡†wL´7”¦{ Lí"Ó\²-I(8?‰9“xÅè’†ÌðýHÙ­>‚Oú‡F0·Áv2!8µ8gXTbësÔÞeG=¨ÑÅÚœ½xŠ B–ìÑmx§WKcúôk¦©$€dm5«5&dz¾0 a® øS0ƒ.ƒ®s¶4SÉ7XkiŠ¥ý…ï³Cp ±‚ðÕž±Ïn2 t¾«‚œ¢*h4öëJj‹«Åu׺®¡åëÎéÿ|\Z-Ò” x°ÜE¸Mæè6ëqPûiщñ<ÿ‡Tª|£ˆ”ZWDéê£@äöˆÀy0‡ ¦‹ Q+j­¿êÕ° /o¢ 2i‚·BÏA&ºT¥óL\´É4ãý7£=ão…zë¼Da°^‚  %|:Ú[`„­ZUשzñ1ì%â9¡\J’ÄOÏkx->~„L£ö"Ç{㸠N& ºhX-y6ÍŒ´„2&Zf)þ†‰Ïe˜&ÁÀö”†©·áÃiðä0©)7$€Æ¨ˆ¡ÎX÷(¦'¤ˆ)m*𾟿fÞ“½ _®]È-ŸÞ;SÖDW\ÌIô@d¸åÆ~à)†’c¶™afMOŒ·!ú1;fÎŒíÉw´RiX°ovô4­²\ajU ºÿªŠ$*FN³kNþ‰Î»Øe#j1–v×”b/ý¸ówT¼bÕ¯a°~²GÁL/¤ !óö8‚Y˜…ÃcDsùÆÒòC~}íüaqísÜÌÝIlì"Q&ô|ÑóÍ'0¹ |ÇõaûzhO^¤hÓË^{Ÿ‚ÂÓ±õ*sóŠ“ó¿&Æ´ƒgúA³<À“´|Ï´_ñÂm˜Ì•ˆÅ;ð" àóÀIôÉøÂäØßlèì<)—Á‘eiÜdºg‰st,PRõôg¸ìL.£Aݬ€‚'Ðy”cî¨ )I¹[Q,ýáÁÁ·ÿ-Ö¿ƒÆ"Ü~x2„·ÞøBdüHÌÞ>tîgg fÑo%2((Ñ8Ñh30iò¢Ï]¥Ð¢†¢¹Hò‰Ø]É#/&S-»l¯†1ÀiSs±  Ƚ ß¹y¥ÿ»ÃSäâèÊ|öüýƒðÁнÅ1ihÑ–ƒ¯öC(8Ð;h.Töô5rÊl. ªƒVIç]P¿&¼j}5ô¿¢ž MÀ>Kï`¾f´Ÿz-;éšƲÇýš=3i6‘u´i_8šï,"ˆ=ðbÛsbnó)Cvˆ4=Š (ƒ&¥!‹N«Iº`Èí4;…Ð\6ÿ2ü¥1‚¢BC%ïÂí°Ý|ÓbR ¤á.l@©èèÿU‘†·ˆHËX„E‡Y• M‹¥,`«÷cÚ›õã|ˆúw|&.ü?¿äz®üŠbäfë¨`!ÛS\¤ª*¸ÀjDßÑ„öLæuì”ø'„iÍpÿgšb”€›8.º( ­#Zü-ŸT\¢—*À¨(rñ‚bmXaÅÏRÄsÑõYxÕΗµl&|7ã"EßÇX·åMåHœ‡£€ÀìnX`).4.~y5”z‰£F¤âáAyÊpî «á7SPÈ*Ubm{ƒEô[‹¯ý(iòq}ì³:OrœÐl ‰Ë€okIÏT}Á^%ƒYéwÝ9Í’\˜úe´MÍAhüb©}ˆn|¥Ófg…Gs½XÑyø¢nâËC—Žc‰´nÙ§˜ƒ}^`YO&»<3c­ä„“ ›Í á¿â°¼,=Ï 6×+ÚñÿF0ú·ý¼Káø[¾ð¦þÐTúÍð„;31ÅùŸ|'>1ÏÚ-[) yú”‰~Yr3éËZ®¶óÍeÎu½j`ŸýAÖë‚<&§gÔv’À¶•´Ð*úœ>ãÛ¹ šÑ¨.6ž-°¹¡. ]ÎBòj“”j½ìæÊÅüGm*G—˜¦ívÌ›P=at¶è°óR+Ê|\Ç~˜œ3õÿ•`–ðçã±óÈïIÁ`šHÞÖ׫øŽIiØïÛ' ÌÕd 2øBˆá¬Wù_Ôwq^ÏL„Vpá‡3ØÑ-Q#û‰‰‡+i{„÷õ™héÿÿÒÉ"®ŸCTrsÌçÖH€oíûi¹ûH®• €Â£±ªû´(ìàKüîÔ“\ýk?fÿú¡–þÞŽSÑl®aþ3ïè?9KŽò£ßPòáïçëeÃ1>ÙÚ¦>þó ø Ä’Hì¥C¼©Z¿†|(åèw—÷W[ß´/‘¸"‰cS}‡©M‚–¸K&m8JPÉ„b‹õ®Ù&.– ØÔŽà6ï‡XìØxiÅ{óðúhñ,Ã^/¡—qãØ‹1IŸŠ ±8âI—I_é~wE~®kòs¨º–ÂZ¼) &µˆÒõA–¹#cDÒŒXqŒ¡/–å E•ÆÙÔðv~§0ƒ¿%x9g å¸ZuÀnxl‡Þ‰óW,ß~¯1¯M¤]ÑL8˧8¨•Ù›ršùw瓌lX”a¢y1œZGø Á×­OÝiÇ£å ô&ÚJZ¨£ãòÀ* `®ëÀ$ÔZ_‡É©±´^ÀÎhOn3M£äƒbì|¹ÚË<$Ì8çéPrClXf¡qxã„p’&‰X¹L Æw†c-Øz  ÚCù^~ˆ>]€Ñ++CÔHs–6Šê7N÷ 饇Ç—åcK/ÎéítèÙqzQQÌQ€Ô·oÅ\ ë3i—¶8â@¿ ô ê Ì<ƒÙ|K_f}¾º­=ÓvÆÙå.8ºþ;­ÈrS:”lµQÂò+K YvýÏ xá$6eˆŒ;ÙÓp ._¹Sð§â‚üÉRk©Í±¹·¨ýô¬Gyžrà½}QBkZÎø{¹Jk²ddÊFw¥ ÛuQ%[D#mŸÖ°a{Ž¡kkž DžçâBXûÃæÄ!ðèÿ)úO1-}XCŽv lúÏâ†:‰RÙŸt·ék3)§‡‘µSôÇ*“{H!~ýÎ1¢î C2SVËî8"=°)ÛéÅóœ›úqÿŠ8³" Ñ!’sV$&’2E±¨wþÄýz[ùÝn^¾‘EEc8¯ jxÁŽ7]À}6ç¶ömW“Wÿ9Á}kI]Š“d´/½Kð©}eQ¢rßíCPÆ< Šå¨¦8}¤ŠÏ_¼¯ï€Îèꛟ™Äµa[›ºÞ^OܧVÿý8’¬õ¤ÕÁ¤Ëot €ª´ü„Áˆ,›÷$°kÖ¯.rië^\­:nîezÄMëŽÿ“W`Ó¼ fnæûÕg®ëTãDI*Û£¹šÄmæ¹=ÔþGDçïèÿÙï—1V èpsÔCKOØ·ã_›ŽÓïÜOq!œ«dôÑÿƒ<•zûT·à׿¾Ó¿Ÿ?ûÃïÿÜ7Ž.C7úIá„ü´Ç½spMBFmhTHÁóÏ!9k֔ĄuøQ5Éæ­ÓÃÖ™û¯ÐÊð4~¤H+àɪ`¼  zó•'Ý…-“{lÌ»+FäarÞEÛcôÛ]NxZ™ø¼ $Ø<Ì-Ò¥( ªÒ®™Ñdçž6&Év0ˆäÕݾQ’ˆ~ùÞÇdp<¿øÛGƒtfèrøw¹”¹Ž˜µÆBm0mGI#"º- ËË…ojì½=š6ꦇ«¡¿Ó§?§µYÌU‹‰4®[ÉìqÀ…årRÐF!×ä;p©Ç⃺¯ø73jŸÀ GÂªßØ%%³ç]Ôä¬lšI´žâ÷¾wR™àÒßëgïù Gqò$¥wšNcÙZ_µ¾^õõªUÓÙhöÙ`±2Tà\ ´raèÐõœsOh¥cm#‡JÖ‘dÆñ0ø]FYG×J»ÓZº˜ÿÅ×0Ì–„¦ûÍQ¤µã"Bô`á`P}:útȰðè‰ÞØšƒ•rXzkÓxd6GY£±©rw^V pL´dL(Pâü`‹ŽN|¿…†V›Ùqò>2»…IC ¹kºpôŠ.væp†ÏŽ'Šp•5Ö9E r]r¼sšeWeþ&ndæ˜rb¡ªÓé6Εܲ*€Kc®Á²LT̯™n2ÁW‹ue³éÛ‡ cGê;гS«Àl˜keÐÙªW©ëH\]û¨z*ZU&»þœ§RBQÿg«=àž£;Ï‹¿7—:û¢´âš‚äi?_(\)=c+3ÆœhyepOCYRáù­vîºB»ÖÚY]ò‡ç|[ï¬w+¦1a¹òŸpÞNÉH=ô®—WÅðÛ=Ol„)«ŠÑyŠ@ÌíÎØSÉGÐã!ùÙF“EÿˆÎ¿ÿÆ}¡¡+:rø’Ú-ŠL¤ÀÄ…÷GDuÊ$ܯ¢j–woó¢}ËÌ©sóamRû³45Ñá —­a†{°D=³i¤;g>¥Ëbµä°:'þÌ4h`=ªÊ¦•Ý,ét„¼ˆ|š-¯ñ9ŸMžÆ7f‚°VçGoŒôá Ðe…Ý|tÈá©D[T(:¶~C¶òªìh 3^††F´Ì 8¶9rÈœì<Ç+¢Õ§‡~Ѳ?µ§yHâ<™,ÀéÂHë´!©®e„®AÔτڛ–AÚ‹€YÌ”±…ާAÇ £AŠlúËî“II¨*ÿVæç“G½Ž@†|–A$zd(_iy¦9ZÜÆ¥y,fR¶7,§7Hå ®¶à¾§h+YÕþòjÈëiºüÂü÷óåEWògVÖýÐØÓsûd/0¶Wˆ´s\“¦K?.»‰s_Üí¿Ý\¥Í†n­=?æ]{ÞÊ-–É ¦/Žþ@,GV“½¡µò¶„:°+"x¯ÄÛƒÃÛÛ|qËOIšwùYúLå%Ú-£7ê‹eÓs=ÑHˆ|…MÿñÿQ?äÇbàŽò¦'ó÷G±…87ì²°øØÚ˜jcnlçéœC‰Éé(˜wøû¶:Ð9”áËËøPtþÙÓÎܳøþ¹à7°ï§°#<;ýWX Ýù?Ú¿~îù¢Þýݯ,›oýk~Pÿ®FóõÙ¿íìÈä@òïD8h*Í3þ-SÿMdY™9™XJ ‹÷á¯(#žèÄD0Õ©µÏ"ŠCç[‡Nzd2ëë|Ó¥½äϤWy­~Oi¢P¡EWÓ™©/i™FAó ¾n®ß=| sÂçd„}m—¼"Ç­ 'Æîè̂έcª±o‹jùÎÁ¥ýÕö~ 3›;¦ûnéÈ Áš˜‚¥xwŸ•M:Zºêij$&›Á3D z!ÿiv‚øE_EàùF8y¸À)àÖ W q¼q°˜Içx25OáN`cÙZ4Î*D*WåϲՄᵧO—NP8uº€9wZÇîù€›bû§9éÎþ+®eÙ¼ÆR:d‘f£! Ž9¼cÚSòŽp*6X&«‚óœâ*%âÒví+en…Q²ÝcžçÒjè…‘ðµ.ÝÒGàòV6¨“¨ÁÈN+£¶Åú:Õ)\CYè/ØaÙGH„²§DÛ”èá4ïc^>¡ý__ËîàiH”¯m}$¾u¬SØeÓ›æj9„8á•ʆ£Œ’ŸÛÔúU—´‹¿­ëšÞÑ aÖ Ôúª8µ¢Ö~P&¾?ex$Ç÷NÀ§˜å`s{%zóA§ÍùZ'9ú+“Æ:{ŒÅͪSå–`¹ @>F™Ë‰½­ÛØë}ºŽß¤°AŠÛ7)0Æ¿؉­.pW8qŒVp¤ZAüM¯c¼ær€£øÀübÌß:¡»C\ŸÔä£Â *í±ñíÆá±lL\TžZ7vÊ•ô(Nlû…+g8Õ ÜÓ#fœOÑÆÊoù©1|Ï‹„µÖ ³Ž4tdéqþøo {-&äÁ(¼^ cy@ÔQˆ/ëüàÎêùûðk}wÑã+°ÝÛèÿÑ¥I—hçÎÆQ(ìCl,©ÞvÊý²#Áh]»¬¾ßÑÇ =œÝÝ–5¥ÐÄÔQ+bc^eû$1õ#ÂSº$Òbcùwñ~gâ¯X]HÐX~)6Î^é,YûÊ»ˆf}fÓ³vó%ªBƒ YÈ@ÿ~~ܶ }î›ñz†S•[ŸÃ¥ì¦¾R¶iMð],¹ñÜ#zŽ’½¦È6$¶¢Ê`ÎNîÝ·Âü†µBçî+yF/g|‹‹\rÕOçòÊVÓÔó?NúØêÄšFIaJûÄ~ÀÆ¢7ÆÕ:¤înW¤'ÐqQ䉱Bj¦,St qbÃñÉ­W£ja:ƒ{ǸÎè, Šüj\»‡J¸ËÏq'Î?dsVeå‹ïé06J.¨2…¶ô>qŒd`d¢>Š“ ±£¼¼B)®–¬ÕŽâÓû1FÚ/MRZ9 b'ÉûEÿ1·lí( •Oæ¬E]vVO×GiVÄM‚ýQ_]?vÈäjæÛ ʸtÿÆ£û9Èï x¦Q×ц*¬sÔßR@ËéY¹Ö®ús¾³zÑÿOݹeÛ‚={ ²Ý^ßÈGLkB=X"4$ûe.°½3[Õû§ óãmu^¢tbá]$6)˜àþåP7gލûs9ÍlY âFIÏcÙ(%¯—s0LÙtgžìôAÁÕõ-‚×B™ø}éP©i&=äÆ@ÑN#{“ò²ðõsó Oe+ –ÉÌ {K/ÖÍu$hhÈ"‚”ºWß§œ™žlšÑT½¥8Óü±šQ7©=@YŠ;E”èP<¡OBb„ ¤Ï:c=ÜfòÍóc-›”b~ÖïËÈ8x"YÒ=Æ,…‚ ¡à‘uI”®h¥ÿ³9|êeôó–ÃZ¨Èáï6sûšÑåâf×*ÕqÝó ß÷6ˆä½a€Ûþù»h~¼˜$™Ü½8™^âfÄ.áØêÿ„xµ%j زˆÔÌ|3m•Îâø†ØÆÛlìì2úF{:Ã…ìˆÉŠT| ®i}T­á²GÍ…ãD¢Õ‰3¨sAУÑãÿaM{þ·Eç'ßÕ§P)2+â[Þ SÄ*Ö`¯ˆ‡ÐdXÄD¿g¬g2sðls}b@ñ²¡á\ü5;΋{k ’ç¾µ¢Ú‘ â<ü!nu¿$5DÁ”éÛѰ@'ɵ¡í$\N¤ <ƒ˜T Cþ¬àâÓ%ƒOäÝ \Xœ² ×Wn™“ Õb™H„è3æðÆ{uÓèf½IxIY&D©ŽÕ _2ÓªgCþT4m|=Uz—¾i.ã– .ÇYȞ͌Ӊ)L=.眕j±xŸóâS²8¢@H,‚¸p œlrIù¢õ¸ Û]ˆ­e¥R*â¯ÜKN»HYpd ÞBpEfQ ®›P˜l‹a¤YÜ|ƒ¹K–’JRy°„ŽÈëñTùçwÌÓýûù}?» â€ézðâ»:ÎNñ÷6áÈ~·¿±ñ/h:ƒóÌ’òæãIûjÞrp…R^ö”»Ø²„HœËJWÕ3yŠŸ8]#B]h2 =ßœs*YüjWs3ïÝà}ûEÚ„]øé±»OÅÃ-ÔFá~²Èþ—wÁfü„³©ýôÊú`íµü‹?\öÇm’6(ÎW€4¼jßa‡[Ÿ¥R~…w`4V‡ÎŒ1H„y{ÎZìÎ%„GËö(W¦¹Ÿý³ªÓ#9p×C4œóá­ºò¨ê¡^g[=¥×­¿ 6 Ÿ^øzã66°­÷XôéÙ´û÷n}Ø;ÒˆyŠ>ÿnÆó^EàáèNÌz¶@¢yGl‚Ë'PHïÖÌO–°pbú¹¸—!Õï”÷E{›¶ ¦<4½LÜl)év%@yqÆB’ƒ{^½‘n‚l€t÷P0/¸9|EŒƒŽktÓ8™e ªè^§ ÓõïiæReôÿ=/± F·õÔÚþôûÅTeÓÓ¢[¦ê–ÖìØÉ#‹9 ¼²ä®~]oµeqZ&…«Œæ¿Îûµ¡‚Á)ã ˆ|³¼OáYqdÉ ôqÛ÷?ü2i£Ô<·Õ­~½Þ¹¸WÈžsï´†?ç.UlÍ…·á'ó—QÊ1H+aþ £4Èß­[¸|z»°ð‘|‘LyÑ#gœ4»¸ÒÇLBìúž ƒ Ü;‘5íO¶m<üEè£ëùˆë¿«Øn5^NÃQ€rðz‹G—_R~ßeÊ“?Ö§O]„~Üÿêݶïþ3å„ûq‰þ_d¶ŠŠzÕ™eÝÖ%Åg[,Œ»õ t;ËìéyA¨o|Ã*ßÑ6À*×ÍÂ.‡sÎÐñ3Y óÕeʘx(lÆ)”r«:‘¡þð” ¬ ÅÉóýÊ…Ê8qP,c¼¦úhY3ÆA`ç4E¸}Z\vHöOÉŒØx'´.J\ÌÄ\è <~€6)­WÞ˜4/+ší ·›”9˜]?ÆêøˆP@•¾Ât¸§\¬7êDû>ô¨Øôõ²á­Ãy˜Tn=Þ»Áˆ DÂø!‹Û\èée;³¬Ddç´@ò[ÑÉ䣸 ©Ç|"ü~[wGrEnW‘sE½É¶Øÿ¦èüÝ1»mVn¸ªûKu-¤H›±…O~»*È+…£°³›~Eêã»x5ÿ$€þýüÄŸï#’ÎTl þà?¿¤‹v¤ '†: åüïÚFÊìR•8bH+”„|xÿs¾,_|ç,¡~ˆ}^Li Ò„× WG2™sá“&*·§bµ°b­,ã§49'êe3Î"”l¸{ÖãÀDh$Ë¡¨Š}a2¥S›(ƒ½›z±g9›ü@VË~¹»þ4[@ɵè—iÃ,õY'ƒ²:@‹­lŠa}÷'mZ«~‡?¢¡qFj ߎ¯G8âf™½…ˆZÍuaÀWý{Ÿ´1D¢è*LxlrÿÝ¥Âõ¦!íݨS¦£¶¯¦j´•)èÈ_,VúǶ}å+\úêoÖÜÁ¡ÍŽþ/ƒYÞ6ÝqÄšŠôš³cö* ¼îCF»#8UÈã J@ÿ=WdÀ5Y!˜Úÿl¿~ö}zg< {Ãt%ÿC•×KÖ81CþëD翤ÿf­®Ò)½dàà“ÿ‹?¿ºÜ„¿H …e6d´Ñ[â>ì±ÄJsÞ`˜,eúdtçKG Î5!P·ÒôuWaÄ»¬è£` 5Ò€°lY½­ãSË„1a \€ÃšC™;A aib-«üÛZgÆ'ñ2“Oþ¸HŒ´®>¡“mÔˆiKY¥îsÖåŠî0‚Œnšóì¤w JÅUëv¦`¯ÊN¬VQ|tûBK ­U^A­ç·Ôk¾“®œR”-×kf`Þi㤠‰wzÊ´’Ðø7Hï⨈ã¯i£]ÉXkw°¤ ò£ÝsaÓã.¬s¶³¯~ÆϤ˜ i̶…Ö¨s‚AØj_ÑíÑ4Ôõ€²ùÉä¤cß`‚vDGPóÏ´ Z†Ðia`ï æ²ÎYRw¿ßº7[;÷dƒÄw–€0`ëØ}ß\<:eƒÏÁC$b!Ü/Ò¢_»Q‹«1ý‘¯]d{®¯Ë§gõ·\sÁoVÂW¦ªÄ¾õ42·áÿŒŸÖw7H~ñil"•1í¶¸$žêÐÿ¤´ÕXùßn|6D<¤¯šEP2ñð›õŒZá¬ù¶@õÃDçßß׊MdúlàóiÆt¤ÏRzà`ž„šµãŸ/Ü]ÞîM÷”Ü(”×3mèZÒÿý÷óF>ðïçéC½·»yãSq›úû ¡¡ÆRJ)Ü–bclFðf ‹"²`ž¡ûÆ…Cåµ1{Z @™[rÓþ‡`Øn"‚W¿ékZÚ‡‚½<„2fG£²~¨xlÜÚtj Hé#KÅ û6äj€aå€*dâ!2×N:ë\10QI[ïŠ ˜d±4 jzei–@õžÍØbÛ€â…ßy®”Íã'|…ÔĘaŒiÆJƼ¤ØG–0æXJ9x\žz}BW.¢Vˆ$£àc)?qbÍÈòbûtzóA ²Ïþ±ÿM…Eø —Ή—3Þ(­Ñ^·S¯ B¤ÕÑg÷ÙdÌp:yÅG–aµÐפ£KWd´,=[E¦IêÍS‡\“ÍÁGgá;ÓbdPçXº¤ŒçË ·ôŒF;Ûb„…ÎJÀ|(&Ï3çüP¤hšc:…NëH˜ºM‚@{›!výã]D{jDmG“IˆÛ¨Ö¸É§hWaÐQ3S‚嘜®È¼®dúÀlT ²ò>ö 1—“¹Û¶ª*†Çq­(Î\–{ßÐv1`!ù³;šdü‰K“…u„ƒ<›:.„:½ ‚̤=ž&õ##Ì‘ >³HBñÅűvaú±C“ ¹ /‹ÓÇîA¢A€¨bÊî–†âR±þ×[«"gEó…FK1öÉÂ]S)×[9黄ψöiãk±ÃË臥O¨¥ÕýƤ‹KYç÷{x±]çç?µHk½ožBkߨÕl •©œ×-:yÿ®£Ý}ÖòÌ>'À¢&ßXpp­P‚çûP¯gæ(í±˜ÇÏî=¤ êß,:¿y=w7CVˆ·“~¹kW<­ùS?¿’ [C~$@}ÇÏf?0“Ç}Ö)BkÖpèíu3%ÞÇÔœ_da’_xäoüæ¾°&ñkw"¼”zÞòAÅÓ:®""Ü÷— +bÛç³É òhBË%Cÿ»è°Äq$£±X¥¸¦@ì°Ñ×^æ ÂJ•(¥x}î4¦_Áíõª¥ÁPqÆ„ª7¥ÊÛ´sõ–9´{¡=ª+lJù°¶Ô°m7:ÿìÀ—ÿ‘„ ãœþ¿µ…©c¯¾³l>!P~ ©NP>Á9ÇJÆ7po;`zÅÌÞiè'Ìð:OC%ù0 ˆuŠ´ò’ØÕòÅIþ;å¢ »oEjk\X,.ÖáøB¿Æ}fݨ¿ciäŸdÈôIXpí*Ä1{˜Ò%ás£è{ “TÜÀí#gÐz;§œ3ìù;ž75 59è8ÚWt`¿«uÃAaûËèXḠæGL¦3)€7¾.f(éúËýÑzüº‰¦ˆQ?’ZiçŠy_o!w BL,˜×iaEE,g/¡ÑcZC.ǼÚ~õ’O¦"oà)íòƒQJe¹¯Ñ½rí¦CÈšYX,.ì¡WY²³ˆ˜Èe„hG˜Ëù•ÁùFî˜KoüÝTf½¼õw¨¯ïA.3ÂìÓ{‡>¬ û:°Ûèý˜à†vMßûaÑekÿ hòÎx*ÛqÌØÉs\ãÙ«Ÿ¸a7Ð_ªöŒfnʦ1lk d‹\6ü“ €-@òù*ø‘¢óHˆ#åN=ŒdÚð‹v¾OÔ,ÕSùGáž7xÁQÊÌJp¢êC÷}é¨ÊLÜt{ÅÓh-ñÎäðxRM•!'’+6ØŒyŒ–«×álí.šà„Ö§!Ú§RM3Í>­ä¨¹êÙbU8•b– =Þ3óF–$N}Ê|ÄFÚ¨àú_œ­Ÿ<2wÑyÝÿpX›‰º°),Øk¾6Ing«MÝ~°T9Û8Ƶ©…ë4¡f1»äÞ;¨)CÛʯDvˆøç¨Cf´q2ìB½ ˜WUÃy*sYê"? ˆ ·}«Ö¯Òà"Ѷcç"Ù%N`u.9¹>YFÑÓîÇ Í¦vÅfÛ„‹í«˜÷-D'¬e¦‰± q§-͘f€aYE2Ñ?L 6¬l—n)釠éÛɹ­º×eèÅY­½nþ|:î?Fèón7˜èžc„™Â3™ž§p²[f€ƒràúP.¶À†/˜í-@*Ùu%2‘žnÅ+^¡xÝ2ŠaªMHó¤Öǵ㜂!Ì€bƒ?HTÔR‡ †ú†«ÚŸ1‘!2‘Öþ4§ýF¡/_˜5{ØD›LaR3Ù_ø# žÕ•GÆø€!ÿV™¬ "Èôwff çc˜(M¯ Žþé9Î3ˆ€Ë>‡þwk±ƒ_P Ÿ’) âªÂ¢æ5‹>q9’°R¹Òþ|#ÓîÌ–wÉ—“+¥[Ù³†¢ÇVÀ8%ߟžBT{ÚÜY¥¹wöÕ·¬üt`)ÃNÒè šÔƒÁ¶omO®¥-÷à::ýŸ Í-”~¹)È’P»ÿª“ €Gê%e>°œÏ˜ŒàAýòCP|ÚZÒ “ß:19X6–Ø2£Êæ€ëì‰þ¢ó·ë“Ôe\šî„<­ó si)OÅ¿õ¬±ú„¼ tJ0Bî ò ¯ÇÍ>™VnÝÃŽÁY+±N’ä¯õml¾ùZþ ݤ›ÞíwYsðaséîùl_â›§b’5°÷Ep›­êÀ–ìÃ$âR±!ó ÁÕ+îŽRX6ÜøæßÒxTÅËå—R†}ã×aìÞ»¥ƒíµÏ¼‹ˆå8lx¶V0dÕkàŠ¦—jüoÆè¦ìˆœˆ «Ô½ „ ºÔÿšzçŽâz 7N1ãq˜` u®zX]òšqG{€0‹Ðà·^¿Ð¶}ÿøÕ5&o¤ ó;Ÿ_¾Ak½¿Ê¤Í1ÍKÏ€o°TÚðyIO'`ºˆ›¦lï–ŸtSÌJÈj¢Üjàëm>szØÜ}¬(A&$Dá¢f[ Ù{Å¿^§4§¯ÊFCÔû9O…Ïnl6Ù1iŠ16”ð¡’æV=ù’à ¢mHIæþÂIó iSIö1 ³µ TÔú:ñÿZk,×ébÇ›NÍ¡§ƒ ›]“=Ò.ÛH¢G£DîþÎ>hÀâ`‰Š*ÐæU¬Ú’ʇf3wÏgŸ\À´bÖl–tqBvÀ"#Âpê3¼ÁMqÙYJbÑ#?ăߌ_ãfRPPªƒÎÓ\EÔ”›½!3¹þNk3¼2„CmïHtj³ûYÍù´J]êÐ ÿé0ÅèÀ(bQ7±V0N4˜éÿl?̤ڶ˜¸GØOsæt.$^üªBI±BD…¬¬%î•„F™!¼ë;Åí1V­K²ëýX‘I?®÷÷3&b¾¯ï4ƒïß¾›ßù=8YŠíÞ9 -OU ^èGç™­£‚õÎJêÔ¢'ÓþÝíBüé&uXÿ#È2›T/Ëß@¬ìDúêdÙrƒVýƒ©ö0â‚/›{ø{DçMì´³°Â°°0ÊÈ ›Wyý«Š‹Öë56%1¸5ü*¥¤$E¾“© KÊ3œKÏÛ>¶_Ï NÐV÷ñŽC-¯àÌ:‘Þl¡IçZ)¥fRÝZB—¾oÞâ1@XèÌ $¼«°àÆ|óP”†”BÈdØ%Cïx2Ö´<Ž‚—¡sÓ>u2Þù KÚb{ÚãÕ^Ø ×wŽNÙ¢Ì=ÜvZZ}·™×ð.+]Ü0GNh ¢e CÜô207Uîw„+9m¥Kµ3o³1öW A°õDÄ{/8öM_ÉO~vn„ËÆŸ~⻿ÆgÞïëp’øJ·º[‰X¤Ùk™Ã;Bø˜õþ@|Á¾5¹¶Hßœ¹Æ3^lÀ쵈%åd§¡-ÓáDœŽÅ•Ó@ïèl›Â·LÄ•E ÚÜì/ï\§yJnÞKS<;Ypmm¨¦£€DÅqœROÍŸý5õŸ2Â냵> ÇjឺìÐÃÖvú¾­žbÛÛJº_?kðîíÐñ§#eÉ~¹ü;-¤°š÷v¬R‡KÍOå*U´9}´òwþàÍ7‘ñ!äë·öÙ#ÄiŽß ’ñ“9pyðþSØø~Žãø"îÿÇc€‡(ÿýäñŸê׿Ÿo]dz ×}‡» EÏ\˜êÍ­`ràsk!Óé`}ü·Ò{Äj¤?ðžýüÚ+±'…Ež/ÿ&€oøjÑéýàÀ¾Ýé-â”èoóâé3ˆsE°p´#¬¶:ï×hhˆðaK/LŠ±Ææ‰¾dÀ(ÇÏÁ)‹n¾ †ƒÅèÂRdÔcµqaÝ„d“ë£x¢îÍÀÓªîc2n`j´þ–e.È;°½/R/A#º· òõl €óàè!u§]D‚ ô`¢p=›0€ÐA&›Ìè%Dï;c#àMEÓ*RÙ\hHfò—Úy²ªÎ}€iÐòÌÑ¡ZW,‚i<:.j~6UH8#ËJÕ=ÈѬÒ.K#Ën †ÌÉþAÇ=YäÙß šõ¹«¦‹ y+±÷ x1×dÚEÉ„”N±þ¤¹É ý°áqEQZ6îÄ\­x0ù$÷Kºx®ç*P"w£-´þ!'¨çGÉ ¦ÕU¢»û¾nþ§‡èùqh]AÄ­ýò&JFTÌÀŸÑîu¸6øKWo)îò¥1wJB³HXŒ¼ZççÛãuLJ<@ùº ±v3Ø<$ª^ÞÉ&óÂ'ÞcQ¶Eï¸C9/Åäj=”—î×TóUk)¯W­¯×ëõ:±=¡ïZêÞl+±í^`P¼l1<}ViÒÐîiÝõ¹Ÿ·f1qõ3M7¸Äuwr÷¨§¤6#H&à'Âhá,ç,Åö"<88*Í ýG †ÁŽ4º— Øy•¼híêS-­Ð‡TÔºt,gš¥qå±ÈÆU[×lèø¶ˆ`Fà(„Ï1,m[J<ÉÈ?…u•†‡HÖÃvÙyCS²‹n,IúE~×6ÀY¸Ì¼‚?T>ûžòŒÒ‰´bæÿ9±pœÊ×Ìîz ¾ŠhÔ ï1÷“D,÷ü§H/x• ªühyg„$Ü”}žkq•þ¢¿ÞA‚Õº8M²6w0 §¶áÖÃ׸4ñfã_0áŸôÔ4©˜é‰Òxs;"È3kÑó šé˜]—õ²F›G@_ð|CîÀ¬\›²ó^l§)J2¥uºZ^-Ax7}i°µTºç6€ùŸàÈ–8Ѳ SFQ\_]vî6ˆþ² ã2èm€>|ÃhÉ#‹”Ü9°ó1RìMµ¬Ÿuª)£á´g^lAÉ4^„¶õ¢xPÿ/*I?K¸Ë† zx´ûÐôlÖÙ^OÀ€fR9cø{ƒ”¢ÿûH“‡Kh—{ñ&jnY÷žµºóCÀêŽÍySÁîfœƒa3áºfwof ºœgƒjmQ¸›«Ý›±5…»'¼FÿËó”ÍŽT|ÌÛH«qˆªVMn v§g/×¶%³WŸ¶ ÷fú`”üÉäÕ½(„÷yý—§¯#Uÿ_àÎezÊÉ%8ˆ'éÑŒû5ãè#Õ£¢BŽö˜“]ùÃqÄüï8à É쯷ß;ÌÓ\\‡#0ÎѺ"YóÆCó¹:ŒY¤*Ûr]v"oo¢oèéÀÃÖó/žhž­² qTLî”ÚÄ޳”L¤MV]»…ÉÉLxH;““Q³ŸÆõ39 í¥gÛ© ãbì—uD³òƒuOöAs‚(­ž)9{Ôdqj,¼Ik BI-gá0 ì&XלVð®¡.ѺÄ^V¡o¿<Ô _ÀÔr5¼?²¸3Ò½;Z牵: äãÒÄ¢…¸ÚŽ6Cón”òËñú’ƒ3êûõ!€ÖÑMþØ1ž†Ÿm¡; Ìv»ºÖ©¢Zj¬¯XÜ!]Bc¤+­ƒÖµ¡´3Ö> vJb„vMo áufÅøÆñàbH†Œ_ß $]K¤v-„l'óšÃŒ!ëyHк1 Iÿº½ÿ~¾ûÇ Ôàiäa*ENö;I`®+™áÀ–‰Cö!\7\œbrýÏ>ŠAˆÌ¡»!Pј™(ÿ¦6=È\¡ˆ(ÅŒý’PGtu _:¯Q“cS󡱕µ ~"=Ô¤ŠŠzjyœm€ZOà ¼/‚&r¥Úí‰Åï Ÿ,šHÊ!£0uµŸáÓO¿[£Ïÿý¶÷¾„%TF%ÛF½ R6µ™£󜶥 †‹ª‰;z0Û`» Û”)­¦Ð³ê÷ OŸ?õ&ý=zPMé›…‰ûäÀú{ŽÔà­Ÿ ÀÖK*íM—?¾œ€Ÿ¼àÇ2›£ÿÏÐöÏâÃÊlÒ'ãñw‡¬÷„ö~&ù €Ÿ»ð¿&:¿ÿƒvƒ-Ùì¤Ëe´ÛÃ1m¼½)–)*öœòÆ1ø+_­Ì¬0šIëÉÆÛ÷%_lÝEKàa|fF‹_³æµ~}—sëžV›+eZOº;.‰ø0vð8®ÿ졵ÐÐŽ­/¢ÿk+éÙ›}ú+´Åãn*ª»·ÚäÖø ¶ÎìX*ÂW°[85uÆogµª=©Œç³×±gW^tLýaÚhÞ¾h)茿æ_-: eß¼l ŽQŒ"èd ø&ëc.jç`¹ñÝó ú[4ÜBô‰Њ>Mc°µ¹Î2òWùê¿Åý÷óïçÁZ„]âÉŸ¾û±ž&þ•l#׋Cï˜å= ¥•b(–øÿv¢×ˆ6h¯’ 'Â9o›í}0Û…8RR%pûY„_A\ÉÙ7G' ÀÕPVÂ^°4˜"ÈRÁX…S‰Ÿ,Á鸈-ã– uÑÓpŸmΛÖòƒ’˜sæíó¼"¯ã:Wë7°|oWÜ'b× í<àÁ>2~Ú¾ÄÃÚÄ®ú¤†ÆŒ÷ºÍ¿Æõàéò°ÅxŽ—Ç%F29³~ŽÊQ8cÚ&WP~ðÈ+§ŸŸ 17jÉ^,.Û$îkyo¹zdBSìý\5õ5¼¦ešçþ³µ}è k€’*'jñƒvô\œ‘t3zýV|> IóŽROB{Egõuº£VÔW}ýúUë©ûƒ˜²[´õbïsx6´&M×PÁ%/‘̘³ýÑ“Gˆ9ÏdZ2¬l‘–`{"Ua¨«¥œ*OÞò\kyG€…Øh¨ônäÆIe…ä D£ ²„]º‘º0IUÆÉÏ$”Ùœ/íü«÷Ÿt)Ý@O)50ÓOƒIFÛ…n&±uhᛌ­„}5¨ÐÙ¦nÏ.Á°#†Ô´Â–|Û1%„ˆ4¤'áû©Í`Ýð–¼ÍZ؈BÝìÎõ“G6ì%wÐò. H+Ù¿0—…7y6¤?–x8œñ/ýÁï¡ø÷óð°f–}þ==od¹ƒæ®··ì©Ͱ…eÝJ['{sÌ¢¡ˆwA™YZr߉ ;ØB ˆœç=¶º&ÚŸ¤-GÓÚ§Wf÷ñã4?A‘ú0û“nˆAôO:gÙèÑŽì¬Âíõu­õU_ÿïW3û­—MâYà:½YdÌM~é[Í7i2|d·ÇîÈ+âŽ`R Fÿ½Òtkˆæ>Ùç×7{ÜÈt°ÕN M|é‚ ¨"†xü¨ ßÙçv,µJÙÕÊ’“QF»ÿYÜ'ÆÀ-*z‡ï'+Âý£þBÉåÿ“IÛ9ôÛ‡€á›ÝƒùßZQ¿{ÉŽMÛˆ7 Ç•þlàë¯ã ‚6ÿd:û[e¾c_L育[Û@bÈG׌o¸/o`P|‹ó7^ü§ËÆÏ:dþß¹&„ÀÜVŒñS|*…¾NqÝ:Óïåîêß- _›Åû¬ý>ïüå]óëlÀ³À”8óõ=Ÿˆ*<ׂ­¾ñ¥·±c=±Ì*¿å4DP1‚8üÍžåí-gÚj1±Ìº`Q"ÑdØ…Þ‹kŽ¥ØÃ"úõÓEÔâf©Ç˜­ƒY„L*1Ð :¡›*øV¶Y9>¿ü Æ{%&Ztu}ªL_5R÷Œl}R&u¤ÿÖhNž™œQ` „­³„ÀÀµ5BưúùzruÍê„jèð¥[PŽ¸Ê‹ÃVœ©=ó¤!*ðâ€ØÑíïrUD–ÙsÕ§ ‹3® §¤„èœLDgéõÙô-´‰Ä´ øhPÚOÃ14û%©§¤.ÿ–г)ŽäAœsþ¶a¢sÖ%ƒÀ9“jÓ Ún:v3! 3Á¼âÁn‚ ¢Ú¦PšH¨¬†Ø'Û¤ÿ…ÀѾïX^É9Àg2ӀЙ1ØaPùÀE”F:4ãs6QûáÄ›>yFú¥ÙÏÚ6Œ¬ÍT%¥Æ§=‹£”ÚUìIêêÒ‹–Žø þáV‚^nRç§‘ö£x òÕ$¥V‹4òtÒ=¿²±Œ™oê1ÉBy8#I‡ºè_ŒKëËÅïD­µ°œŠÿ¯×eø{”rœBv¥¨Á¡iþ&5Á9»qˆx°ÒjŸÙk×<ËH2u{ê…áŽHÞº(C31š¤J€^V+Xe¦Éôóépžž¢º"ÜìÔŽ[Ñ @ÇC‚îÁ½G‹º-&†P_'§àXB‰À]áx¬jÑÈ.pÝàÑZRŠA0÷ ñ™4ïܸ-õðyô»Õ!‚ß“ârˆ‹]3•´ðÎ>g‚Ò0¬’ûŒ}iÀ¹é‡à8Б·Ÿ6nõ; 3ßKZvðÎŒö“G›5ôWï”\!Ê]û:æ+vßtƒ6½FN ÛîÕ‡.½Q‹)qÍ¥XKÐËz‘ü¾€É…ÉéË'Uð¿.Sö}GJ†aþÏ–²¯Ac 5ƒIñ–·?Á n‘.^DŒE³ uèQyŽ´­n‡‚ Ÿ§_NŽòdm {øÎç–*my¢OÐrçWù÷óïç¿ù£2ÉVøšMäPÏFn„È»XV"ˆÍI-œÅÝ™Itnˆ°ÚWZMd±1¶ø„ZjR˱M,SÎ`h(O³N˜ò³ª”¼ì-ÒaኜêNÛdQéÞéÓ2 :!/áÅ›l”•³D¸BÛN@Xx,¦cWføè¸Æjxµ&&Ê,ÈtÌŸy$ƒ›ûéòWV–Â\…7G(Ü)z¤ÁP¶m d^M1™eB¼Ñ5+9&BX<& J”,LUÛ{'Jæ¡\v…=LG•)9Ñ$p–;»@)5ý¸”u'N"QX𶬴 ¼€zß:íƒp!ÈCÑWã_Ò# ŽOáä_~°Ö‚Aß%¤žÕ(G¸~0Ù4½aê–mXBñûÔº=êP©¦pK¬Ãõdfk¯zþcÍ]Í#LzE7v>³HÑjèÏíººZ¯^Ê«ÖZñªõUQ+ ÖÈþIb êu—Û£˜1kÓ§åpgp[—y3x°¨ýIŠú5,É ÌÑ.oƒ3ô[|»#e÷Âu%eÎ"¾ƒÔ¨¯)o7âŠ5 òJJwMìn·(×sˆR¢ï]l˜‡³Kåš|³ÂÕœ Üñ>Pà¡ÿŒkš*Í*ó¤Wβ4ˆ‚C†]i'eJ¢éдì_£€Íu˜R/@UÕJb8d?-ºô?V™¸ª„Ô p”;NlRØ[cI%€DŸ+WþIñ£þ‡ªâøŒF$yù÷·á+nanè¼9îQ›LRI£Ø´¥‘¶ hÒäÁÍ0}ˆ¥ìƒS: ßXÔM3ÍLVÏ&•ýKêq7>§UŽ?iŒÜHÎxïQ¬ë @óßÚâïše&“B,r;ª«­‡ïÂÚªa9 õŒB$Ît·ˆ6õoFòÚ!÷½±UÀ´ÍÝ'](0爅®TUÕ{}GýždÿŠþÏrä÷O24ŒÊ†fÒ_.:O§¡­&”ét²ÿ;ý”ô%q”ÍëTNØb«ÚNñÎeáÑ~15K°Ï$q[õ0@mܦÁܲf¼•xò‰îFÜKÈð­±3Sô{6æ7ûç®EYhF¡ŒüÞ!¹Ì§AkÔ¢5«m.~˜*²íäO{a©KÎpP^÷ž çPk¼×«0OåkF²¥Q~`(“WNÕ 0Úš8ݬ‚Ø oO“t Frzœdžµðþéˆy%áS'蛣¢ÐOU ´q*…î_á¬díâÒÔ¨ã>KðĨ~¢'ïk^¼/Ikè§×{ù,f·Î@×$ Kÿçù©¾Ü(ëè ïŠ 0á@'í+m"O·'g]«Õ âþ:Ç,ÅDù‡³ðÏfŽöïç{~"¬ÿd–z72çzIýOÝKn2BÕB&Èhœž7¯±ìçØøÚ+Ù8lC`R¬±„Ùš@a[$-®…z©ûŒYUÒ‡ ˜” Œ€f³Éuç~¿dˆêoQx±Ùy“ÍïA©V´@½¤¤={ÞålBÒÔ6Ø,Â3d,ÔVámçÒÏí¢E̿Զ5Wú|2'»oÒÆù޽¹ç $—ª *RaÂ( H[rX˜A®6e ¤V–PÏ1~b›˜£ÒolÿÉc4ÅF’߇Ä|ü0ÚNe 7ÀMóú©ì½¢Ý|ÕÓ{÷žøÎÀKÐ<ãRŸïûÉ óXÚȈ>l‚q °Lλ·„>:áÔN|`wðvÇ0ŒÎ‚_eï¶>;0ðAAÿý€|+œ]邱¶7°ŸÞN†bÍ@±&Àöüd<¿}8Œ ·ëþJøQ²ÿ]ÑùYqôõ£›q E¡òÄFêéApþœUÀÖòŸùù§ñ-3Vu~,ô²‚ùrQ”)f£ÒºO£82f€‚c£`*ù}‡‰ô6v’cÉ’^þb'xp‚{Ø5|= …Æ´³c1ݬ†3×kGé#–ÏAË!ݰ,Ë\Ê«CÖÇqgŽ2Îèƒ\@,Б(( ê8(¥àèøfú&`ÔÞGú/Ö°¦Õèm"¼&µ#'KV70 †PYYßTîíi23Úî¶ØuÉL[)"hPŒR½¸s(*#˜ÅcX»èï¼#YcãŽ> ‡DšËÂ÷vì*,iŠ¥…±Ê´¦lRº:nva¤i#náúÞ!1‘ùgB±Šgs!îoì‹íÞ;GyƒóNqÈr³€20Ö©- ‰<F (ûW3§ÛÅñˆ»³‚!6¯­¨ '%mðÄpr÷Ä0ûû¾%KÝ]¤wîé»0¹Î £JWš¢ò69ü‚K3Ü¢DQ!Ž#zÇ@FÈ‹ØÊ†£û¸~¸|‹´z÷æÕtvla9¬)ÊÀvØ'0ÒHŽ]ÛIé˜Ì´Ï- Å“”9ý·9(<ØsºaØS3è8¢‘ëÞ³ò¥¢—óq7“1ßk3Íž”ö¬‰eÕ‰üÌx VŠ6dI¦ï9ÀŒºå†•„à“òkÓ»ÜKe[ÎÁ–œüÉXÑÝêlHn<œâ|FDv>Ë’.c*m¢ßîhΔ–1è¡îÒ_¥›2Ñœ›¾Ø"â?^î6 î=¹:©ÿYÞ=þ'òŽŠßS[oX×±$^ [¸Õ;·ñýõ3­ô0w•Ó?P´“g¸6QØFï,v3ÿÐ Wzø¬€>]¶óDèà ,§ˆ_âšûÖ›}C{9Až¨!=~Ÿû¡ZÊñǧ%SŒ¸°·q‰eõE’ÃŒ6À¬ç÷ÛöþBRlçQÌ.ò›¯¿Ý>á¿):o‰öûŽnðñ²œ»ùØ÷W­j­Ð87`úN0SG˜¾¡«¦!”º•¹{­Þü@ÓíÒ)¿þŽ­òïçüð§\EÔýß).ïó€ÕІÁ±˜!R4ÿ s#6ÄŠ «¨,ÚÉà O+ŒÍMKðvÀ¼egÅ)~ÁÆìDj×ÒÔÊ Hà¤PŠŠ á@äkád¤Ae„š\ÊaÓŽ*#4Uá¿/ŠãÜWÇ•àª}3“t;Ûq©ƒOÏ¢K‹ƒ‰„QÄ“÷OÈ­HœZpþ¶Üµ|¢ÞÚkX“™t0¥Ž§ ïD§y {ËDÔØº©yJsðÆe˜q-Bi@·tÁ³rB/3=ô1ƒÑ꣗irM³ÖL_ù€'Gvès3hX8$W‡PÍù›ü—¼B÷°Šâin59f¼>o`g‰xº É-¯‘Öå}:Cî½–MÊ9MÁŽáF:ËõbqàõD H³Œ.)`µ ðŒùk³DÉþR8>ÁÍ/St(°Z¶>œë/ýb¡ñÄá-8‹ë岩Ï]g¥Ž¶Š Ó\_̇—Kø1÷”|VÜMÓndrì¾Ð>G~³™NŽý¯( 3ïˆÐ¹zÓdm:ßé%9þuا°!¡r1·»e M>I.—ÿE*gª‡8óÆg;Â<{|>šnécrõqTdg¤LûËS6&[°O‘$B\&oÃ\GÞ”äæPJÍ:myæ9ÒÖÇl©Ü‡+y¹GWúÌɦÓ™¶ˆïŠê$Yöpœ5®ù(5Øc•Ú÷p/ú<ƒøy».fFÞÎHY+Áñ5r|rN^ÿüžËš`oµL&ÞkQÜà›“g¸øÄ9£ýß1 †é ’iïqT ÿ9ÕšäÍ®ˆùôư6¾ ÷iŸ{¾&øj¦Ç°û´w­uý=Ä®¾$þƒe­\L£ Ù(ú¸E· gzô²’P‡QÕä£÷„ëÝðl¨¬>„Q§˜³®:öø;Ëþ?):ÿþ€ Ü×’œ.²bø=%v­¥ÖÚ&þ#º?òóK&˜Ô†f2Ò¨¡ ¨áÈ7ƒßv·7b¦¼,7Á†¼vÊr/((oB3û'–SœÓ—i‹x~à¾òg ~ 9B LÎà$èUªâêÝ-€¨)Ûœ LŽZñ9©mX‚ÑsƯDÅ‘«ìmT“ô]­ Þ1ÁÄa×ÓDT±›Û^ÎëïBf(#3ŽTzåÚ&zéâΊÑ'«®KŒd8(ôœKfØû"R˜<ø„Óð–­Ãì„CAðµ÷ÎX@<]<þ*EçÞŠÛô-Ê`朜 Mú&êÌÿ×ÖýVvj¤¹(Æ–Ó}=I0À@°TßQ &VçÌW‰6—á¾Ê‘çµ9_jFys°Ó8 /,Ý@N\#¥\$8X¢ÿ®™Å«Ñ­êüÕÂs]<µ{q€ý½æ/n Àƒ“²2efwk†…-½{[?`‚Ïj:eÔU š ¡þŽÿûDç-…¼yÜf“Ppø:ye±À«š ¤EXD¬o­3y§®id?íQàá%{°cб ‚vµ,Â9”_ÅMØAÒ|Z"á³4µJL¡;ưÿ¹_lLÛ;0•ICÌð÷ù€/¿&°ðÍ-°¼Ù+¼ÞîqCLånÄéäLö&Z2Vo¹ÈeÂÏr5ŠpÒ»ÒW†:i(žwÌd¥gKV}4‡·…™1õåhŸ!…œòÈMm@f;ÞÌ ËoM+¬äÀ*W™Â¢Ï#“ûÒÝPà"|l—k¥ÆŠû§‹LÏDL«!òû̶ɔ±‹ó’ôãz’ýŽò¯k°`´.ôvXXÚ=&Zñ׈ÚÐð¯8qþZ_µêþŸÎf‰ÄZ-gS c úïÏc%ìzÐw¥ÃlU Xü0 ÄÞfP™ž Ç-ºP¿mH—s “õÀeI{Ëú°u %‰Ç9.ÖæðL‰Ö-"8šá–/›‰ÓJíf.¡ë³'ê õlˆ­ü ]Ö6È®+3$LB¤á{-Ã1F< ¶eÝh–²ÎÛlF`ꟲuŽOòù ì0A¯P¨ÍÁ‚6Y% Ù?y%jšÏ4&§9‡G;€¹AB¦ƒ/’N‡ˆM¯3HžÞ¤èᲿh|›|¾ó*ˆ«ð‘Œ‰àÌngz·þÿø¯N-½7’¿ŽüéZ±ø46À’iÙ·ÿ PUöÔA°þEu/8>5°@á¿rÇ ‹¸—EÈêþÃF4åí œŸ‰iì3ø~Ø·xŸèþTÔ}92Ô ™Í/úkEçg=ž9Ôn’ƒ8ümÕKškˆ·Š–:í³¯Ï£âN$—+¯÷‡´þÊ„$G¿i8Eð½r£ž'0˜CFõô)›!‹t¿)ÓР+¡¾Öd^¹UYá`aä7nŒb›*@8#…‚ÉL·7©d$×ÅüHfNž‰8& ÊÖŒÿ–S Ë ÚW!š™’t$<²GMúuJIÔ‰&Ú÷oˆ‹Èªc9`‡q­¤Òê@ÁŠÐȼ3êÐ<€+c˜*Æ,0ñÑÔÌHÌÏaؗݬÉDFö¶&‹21xiJD¡§0X<Ê\Œâhv‹œ45‚þq1ô'×twQ27§2…(ƒØŸNŠ”’X!ÀCkçPâ%ˆbtú›ÇÔâÔ€ª¡C[¨–Äõ1d0éÑ ¨²Nçoo?v€ñ›>÷íxÆÙýïb>V§(AºÊ¾Ú]kl±?Ñ 0œëw?sö÷ÐÏP/yµû˜èNªÙŒŸ­BÞaŒgØ®’ÙÑev¡ë‹=ýÔ#ΔbŽå4I ÐÝùSÎë!`ع»B˜¥høµá2&±­¬evñ—ç½^í?O¿ßü¯_ûbª.â†mxÐïAú< úf4¸”r®o\“ÅR^^BOŒÚùÉøçì•{Ô×»uó(¥›çÌ»¤ß}Ð܇¬cŒQ7ÙL¦b$,˜eû‹@hcßÏ>¹J-x€ÀþÅ?†þýlÀ¸Çq¤2~ïöq:õ:Pþ­‰?{‹èKZ _^Àÿ1¥?ðˆþÛ¢ó÷?ê' ùL©¯jUö.<ÏPà)5`$@3:f9¬Ç+˜w¦”ÈC;‚²è¾¢¡€¿Ò&ðß5ðüs¿–·OXÛtù@2ð¹Gýý¿ýuÇϬ´y^ç¾°A%£à®"2c…œ1‡pÑ Ì ì ýeÀS3fk>'‹:, &t‘úª±k¢Zàw'“-Ô>öbÁ‚` èš#=Ÿ4HS¦´öíx ætOk€åKâ öEÒ-ÓÆ¼Vïa"Ò.åX:ÿkSÖeÿRô‡ÁB88 ÖÄîÀˆpß&2Eh èˆcøT33),b諾OÇØ×g˜ÆÑ5S˜mQ̦):‘•‰±Ëx\“F$f쭸É$­MÁ0ÝFQM(iº¢™KUÀ× B¸·Šâ ì”OàÂa3ƒ@˜H”Ç©#Z]!ˤX“*‹èš[æƾû(,uèÔ÷gWqú‘ÖÜpX„¦ed7¾dðÆ`cøð¶Glán1AqÑ vÐ~|P !–¥½Tó“- •´(ÁÆÈéBðDF@#RƒÑôì ´-ÐS»"&Àç#ï4ym Š{O™‡}…¹57R0¾«°´¢êäþ¿j}½^U®GRnϨ!KVœz €É}ä^?ÕhfïÈ6}N8gÑI¡¥À¤$­«SåÌŠ÷f؉#·AŸZ’Ø,­¤`šmÁÉô ÷”‹â¢+»ÆhœðlŽÒxöç¶åЦR^É”§–á‰àÞ_§ɨRzÕQ/}\oó"p™r1Õ¹(#qf4!á*%ßµœòœÓ±á¶ÆHúáp|ù^2“[¿îTBòŒ9ÛE0,Sm²Aí\åùL;oÀèørmî‰Û>AbòŽUl€Ý)¨Ã`&l¬à3&oɵAÞøÓÏÍ“»PûŸU —½wØÜ¬8Štvª„àJRÕ‘zv—•ΘlÕ)X2ÿÍÏ£ «yˆÁ —™©ù,§f{!ýÏb¸˜¿ tÀœÒ[þ€ô˜¿øK]Š\@.yÝÖ׺Ż&ÕÓ{¹|qâÒ7\žXÿ¢ó”¤Å:9yç¢3yþO‘œƒƒÈ𮼳<£²](éÎŽÊbe <–Šèä_Z¯ÿ'c\^ƒ-ùXLöGaæî ÔvbÈœÑ{àa*Oúëöíþ‡Løc_ˇßûï‚ôøÞ§ê¿!?w VŒÕ*"ç¯Ó5æÇ‹èR#ýx˜.c~´Ðèé¸÷*ItÆ9ï{ « `@Nòæ^£©½¶jar™3ÍNx$"ë—<æ3B ¿ýYÓ11çøœ)ùkÓÎúC8µP1– =fÚè’ñKý©`ÁÃû1xùB¹Bγaöé‡}IY-ü­EjuÓàÂú¿ûpzçóóJfòr‡#R‘–±ñ¸±{g|ëyp¶´â f˜MMã‘Ð,›ž[—ͽ%è%\p‹Ý…ù1‹”Vµ†‚{ÒQ‡’–ÆZH‚I:/´üórêÞ xüyzN¨·Býå ”H%!@¹þvÂDN¶ÿëüïJ«í{ ™W¦oŠ´¸3]¯õ”èžZë£K:ÁLNÉ „ÌïMƒüR‡$œT•êÜöyA{°ŒÉP¥“K° ‡ÜØŒL$ÁàÏ=Ïý¿k¦84ÊR!²ß{†ùô9îƒPÑ_mŸå·z uÜMó"‚÷®ï6 =в= §6M p½'ûDáJÚ«CâÿŽô‹…dNBƒUÆ ZzÁè•Ùû’B½[¥ ;åZA¸g‰ñyÉË`SŠÛˆžŒÿz±yû‰‹@CL×ÃjCð"4ûaE- û%`‚5…!P•l< 1í4[„9d3 áð‘kÂÆœ0‘ÄUúæÓ:%œ¦ùL¹£àGÇY¹‚m¡ŠF“»Q ŽÉ(*GÕÌÙ½To iS“:UT¬¾ÎÀ]Ù©¡œ`Ý#ôê°AÏCt¥eýª/q ±LÈìÆ‹a6¢À¸‰ðã¼àPS¿ÒJVjÀ1É!Ô;šå‘YCÝ“¾ÔçJ)S€p±&ïɬ¡WW¶Ÿó_[ع›å½{°Ó©¸ÉÍ1ýcfã) ¿qÄü¦5½§¼=àzµ6ÅýäHß°ÿЕiX—3"ôÐîAbGé2ºô:µmz³ì v¯l‚­YÊ2”yÃ-ÓÝCîÍ’;pj)1œ(ð[_%JfnQWŒè[þ5€ Šuйôgرˆ·µÍܳ,<{¹)’»À¬U9Á€8#˜ù-W‚ú×Á§@³yM)Í™b˜ç…ÇE•bèo÷c1—¿bò–€ËY5v,§d²¸òþŸNüÇ]ð‡û:NB-2E¸yö•RžÐñ²R4±züçMδµ63Tpµ#þWÞÎ3…–Þ­äÈú¼ÆŒ1·óYî­Ãô_Ñj.̃|`, ÿz¨ç…ßdzNµAÔsOFÑ#Œë…‡pÞ{mŸèüæ3ɚ؅A`±i#6ÊQ52í«ŸþF²9X#Óñ8ª’u‚ê’ ÉÀޤëñ'+~ÉÓ¾¡üòÒ”î;˜ÓíšéLÑ€f…œ˜yΗ¦¶Ø á°õFZé¨9 üäûœ¬¤øÛð¿,,§›FŸk†‚“s¢,d(‰ÅÐàb³/÷§ÿ—ÈòQg#9ñàîhOù–ÇQĽ.ªlÕÆ ’q#H¬]/Ë‹}™Ë^;@‹ô‚r1þºeM¦æý?I”³ÇlR·ñ•­>Õñ¦çxÎR5Ý€&Ä5†ÉŒb6"3²—e„+KQ–i’FÛ<3xÝK~ yG†+»¤Š®aî7^¢–w9×Û/Ÿ^"P¤¦Õ/»ñ‘µPF®Þ´pÿýƒ×ÿÆ;³:ã§_,& ÿÖM`oY ëC¬Íˆl#¯ŠdçrO.bÞa88Â3ÿ˜dze*„áX `¤»ƒY ÿ8&Yp¹kþÄ‘åYßÚÀ~DÇ:EO›@i:ùÆ 3 [lóUŸ•R0åýÿ¯á psŸùtì ¯ÜÑèíòËÛþ…g+$©o¹áIù»r×½ €u[.µžÞO”ÒÀŒþŸHÛÿOé«|ˆUwÍ#žÂÍDNÔù÷ó¨tûåóVt~7¤5ôß2ÒÏ;|5I¡•o8>c´n´Mt`ÖõŽ6¬<ÓÀO ¿f©¹UDlUBµóBøò¦YÖNÜÛ•¡[X²k½ßëxxSgËIÀ}ìý‚äB¶<—ÿ™;PD#áôlB¹h–Zî§&pOèÍk³°,Ž0â›M‘H¬xÄ…$ÐH=ŒŽP¯òÁ(9ûSíëøj?¹ˆ`EÔ.‚ ŒÐÝ–€à*r7šEG¸° `ñÊ=pfØÖ°˜ƳM'o«!-ÂÑØ:ËÍ2¬2G§äÀ‚G°iÏ"@34¥”dóÃmÆx·)bI8<Ò;:'îD´ºx'P¸j;<Ì6µ…®ô*T²‚‡±G˜ë”±Ãœ ÊÞî r×B3§÷ì<Ø€^TTßÀÎ&†%ã5uZg…ºŠÑúR!ûeœ]KÞ¶'³zõ]r4²z"qcÝ.b4bTãU‚—äMgÁ›>²Ÿjô§iê*‡‡zAcÙ”‹ûØ":dŒ@ ~ë5JešbVŒˆf0idQ£]ÞCòÑœXy¹/]lój ZR´>Z@ –âLjÜTlàcÓç)¼zØ]YÌöÖÏGõêLoŒ:½ìzê ®8_šZ¼ø÷£GÍ/•¾eݨÆRxˆVRÕ`ήÀë”þ?5ÿó²5:ØÒ€K¬Ž¼f®Ý¾˜wÞš>ÐDØ"Ì}¤e2µ…ÆŒ_âw>fN’Œ3½Å䜗™—‘9nu4—.ñ|rxŒ‹L¢;Ç ÎÕ¦­¾4=¼ðäpYÞ¨Jm¸âê΄Ówlòb89PR5홑äÄ=ێɘȺ¡Ã™ÓÙÓ£qV³„À0Ĉê\¡¥ÃEê ê{3ƒ»Æ 6Cg €Må‘ÁyÆ=-ëØ‡ì©ï™}ýjS™9ùmƒþ°Ð‹p˜4Br`Ý ˆ¬|8jï˜xó0•ûÿ!‘úoªR;·ï@Çð&(wþÃw\êjEŸy:Z}dâÿÃC'p…çBÓOÖ4ó+€®äûçDt~ú†šr*Zl[šCWÒãÿÿŸ½«mp›Çq‚·ÿÿŸqbIà›,g2mŸ¶s»{ít&ql‰"A`]“wäÉP "³ ­’“õ’¢ã-ð»þëV]*BÖñ¸öœ÷)Î0Å%ç°|àß×÷ ­–?ñƒŸ:…h^™:;ó‹£ ïß®"÷¯oɨùõõË‹O®–ËÓúÑí ­'ÄgžVü¹è Òo/!‰®î,Py—çnÞû!t9˜é[ðStIIpÖõK»zþ[š€vrÇÀø À³l‘±®wmFø¶ ËúL€³pÜ:˜ikçä‰2ÏX¨¯%3=gx4±ìaÙƒ7/b×9kÐ,zžævÙvìC…ÖôÎàÄ8Ä3èÉs`ÔåL©À)ט¾Ï|Ö;åµu(ÅïͦŒOœq¢.ä Ïoš;ÖL&ÙXÝi¡SRO”¹| A1âLvöÀ‰W+…FCÄïEÍŒf0Ÿ³öæ µÈèŸ*­Æó½D˜Ø EQ{¼½c„H3ÕG7|iÿ¼ü~ãûÕ©Ešÿy™½™¹-ÜCs`®´.t9œíÕû¸&^€ü(Ì¡rŽÖÌÕƒA~nÆÎ>5éšÌ1‰«æÙcØy`dÆÎ'ÆÞìx * VQk ³ÿǺ«`…‰E·zá¦W —h¦G±‡ È‘¥NŽ•ÌVX£Î©6f̱KUØŽšÉpjÝÓA©ôçtzFC¢î«ÎDÑ+´m˜„ÖâÜLÎ>‹U2árm)Yx¥b‚#¢sê‹ó°ÁY©»ãÜ×xÐiÆs,ïàà ý( ·ãá3-zÖÐsÄ÷«ŸŒh‹‘ßp…‰>’YÒYY”Ý ÕV(¼¡ì<Üí¤E€ØüÇtŸtÁŽw²HUïdñy/Ý¿w{–—ý<ô»—Ý¡ù/FøRkgõ•ùAB“piS|4©ÀNÔ¤Ò›qSDâp(Öݯ+¤ˆ:*¥w@’“.PÔr ‹’E¥ýÀðœ4e°ån44’RÖ‹gñ‡ÅHT;èÌ/uþsÞ ÈS­ Üãûq wèz%ˆ­µÖ~LŽ–9øÐŒ™\3N÷#ì'Ç›ˆ`*u“»IË#Ô¿¥þwôŠ9ØÀ é(6p÷L-‚Èû5ÑË.ÑWyHæ‚£l¥ªƒ]-Ýe£X)¬}. _p;¥±@øó o6s™>%všô•]¼, KSRÉΜèöä'6µm+–ûúÏ]%dé1ÍÃ/k´ñà ÞhÚ 7Zn,t”ÚÊ…RÒ¼½3ÄAh͸ÍxÁê/µLòP]ÓábéGnà-þP…0úM€2:ij)ëžZc ¬$ŠÅÀLée÷=ÇÍïùuüMö#í;c)ûó^ïbýã—|¾YnëÓb{$:@ëG"jjvÚê˜Ê2Âe è¯ïˆ<2?oE^!Ûi³û6Ÿ€ ]b ›tw2ͧ8<={à=Ïð(4ðô•²obŸe@Ž¼ÎøöÂüÿõ€¶Ê~ìu+MŠÕÞRü`žÝi[9¤‚á²M–ç ë*ˆ–þ„§3ªÈºÃ#mˆ–ñHÊ>/ïwd'AOÈ}‚B}úf+}¯E‹GEŸ1SÐãQæw—1ÇT7u)7W .ãÍõoNÒÙ{©ÇZ(Ÿ›xÒ„hÒž[aÜÀâceŒ§÷Ø7@Û7ñÔÀßn]ïöÑL|?øLáYá=ó+·ÚŒ±ôÆ€Ûe·Þ¿¿Œº¹™ëÚR$[zÞ}Œßþm_¿z ïؾ¸ë¾oàú‘ €O/þöW‰Îßç]i4óìúñÈõ£Duç}¬Q‹aüô-ÿóØS•uý£Ž›‰–Ÿé´#䙤?xo»! %°Õ‰ o i4mÍÆÁ!ldÂå¾²«Öáo·U]ÊŒ+µ(©0š.ÁC…zÜ~0^*z œª(©ÀR¿)P¢À´1 5·èÁ??ÜsIóÆêJõÇæŽö;ªCGqU›ÚÛä0žþ2{5p”c7Ì-*È3[m•Hêðvkþ\'åý‡CgØÓÛàÚYV–tíñÛ3pêî°oiY¸ÌŒÌl3ob1“oŠ®egáÈ©¹`<‚{ QŽÙM[hÁõBP\ …Œ0oúôÄpÚ~Ùšw,“ ŒÀï\ùÌE-ŠqÏ2LÏS/«>éUó–K³ÊÓ¿Aê 錪'š(ùpifœ¬›(×SeVFÜwz1d’°“ú` þXÙ4ˆàO*ñQa1耖it7oŠ.L›$3ôŸ‡÷E4óx$XÙ l<`°VÄÚgntñ·Ù1(b¶_øÌO5“ ¦§ò5ó¡ú:4¢“=øò£Áev p†#7'qÝ‹³ç{2ºz%THç Hs@¶©/d"4¯a { ÁŸ¡]^ÞŸ3^_\t™ 2° Žãh­á˜±áŽã?þwÇË   óSKdzwI‰cé®åm½Çœ,Ó`kã¬ë²PƒÅ‡à€E”X\F‰ O%ä°séuÁ$óÍýâm L—ÐÚ5l—ës½#“.ôÂI("`s¨ÒêäÝML Sa¾2¥ª‘æ&$r°ÊàØN´Ï¨ºû)‡»SüÉ9ÿA²u7O²í¢Ö¥ðMÄsÿ§+‡Õèßû«ÐÌjñŠ7tYïxQ{èSgÏ>2·ç<ðÐÀxB[ôÃüµ,c‰#ûú/ÊÓß^óî’Æƒïþ…_Œ{ph‚Ÿ½ON¸Î0‡ÞitôQ·1,ÈöŽàù¾ó >öþfÑù›5™íôËNìcË-C¯Œþ)ÛBŒÝ`4¯šO­µÈ†g>pv=¢ñ¾*äŽ$î¬NÂë BFñ‘5þ̯aÿ¿|P¡f ÞÒPã/2a•êÖ [ ÒFãóG/ÙªãH(í4¥î“¶›"—‡€i—ÂéþØÿucå³=5…0l)›Ðp/ L.~€™¸P‰k3­“ê†e…·^ƒ¡ß‰QÕ™³d´ÅòºÑ¡kõTuñ}lLGÕʽáÑ6©e˜ÜÕAý`€WHïÄŒa‹Ê<ˆ¥¥ÀýÁ>gðµ1~Y7ËùL:Ü×Ù«láˆküÎj”0aˆ¾¸"þÀ¨N’ Å0ôHpt`–‹§"ŒÑm. ¹MawWâ:¢w»üˆZœ¥§hô˳ö4•ó{B¥è3D"žÔÔ¬É~ No—H±r©£Ñ2ºLôSÁ“è«.MK(bñ€2šÚź¦ëªÃs0Ë”p"3™ÇUŒ,§Y4lL0ÍÍLÿ»€Ã´¬TÜßû©°Voé콦Év˜•0;Ô¥¾ üÁÏü-/¿üýVý¥ÈsRßÙ\–FƒJí*ÎU4—oâÉë8PÌ\ÃÓ®UZ„0 T¡õ‰Uš›Ó‚ñêö.x]·_T¾|Ï%å€ý?/!—nXgµÓaXýs¬ï‚eR(ñ«?[tž¸yZÌ¢+M Îou`Æh̪FUd—´!‚[Ègt™/íq³Ý+2"H²©ü\t¦/'™·DX|¶§±+$Q)F?v5‰ '<ºôÎÝ<:±FS Rà,¶©OÔ ¦a©ãbu‚ãíMïÁHã› ¤hœÓ3ÂV:ØâxF–1+K†µ ] m¸k³aާßCøÊ^fùÜʉó`k•ÌŒá€zR%* õ.2‹ÕZ9„k¿Ô®Ñu’‰é›¼ßÙ&>°ã …›¶/m×*Œ™(RÞê(Ô>TAüæåÀ/m9k˜y4ÈdŒš*7]Gì`[zÏܬn°QdaÙ Ô€ü£@iæÀ{yJ>ÁÅm%ù˜މr¿É§Î=z\éñ±³ÕkyV<<ÒüÁN•·©ÞFk@¿»lˆ›«½hñ F¿qòÃm >Aº¿ILoÇüVu¥›âhLlêÚLgï‹©šÉžq^…ƒ>> ´N^C~dSWÜÖ¡t‹ZÃýȈÇ9³ÏY¢^&Èblᄌ­ù厈ãåø¿ÿ]Z?c Y÷Ç4³¤;<Ôâñ/bÒY5ÒE—-âB¨€¥Mº*gol[+£zE+Î'­-¶¼7H¶¶Í1d˜&Îx^³ƒEJ‹äÑìÜWÙxö8…ò­ýñ©¡Šõü'+\È/ø¯TA2.ðí÷&ž)ù䪊=ø81ÀWnPkm Î16>/#ß°á­¾ùö$ÁÝÆšKßa½Íš=¦¿àþ­OIÒC/À.ýöS΀Œ €ýe*ÿpyë¾É½ö«·ê¢½™pm*àÀeIÚP[úÈ]ÅþU½½$›t0Up=n’ïZ*õüÀœÙVg¢¾­@9xW/×7øß":¿'l¾ǰõGhÁ•ð¤ã®ðvÔoègä×nÈ’Z÷›jÿ0÷ tJ_z%¦OÇžk©ˆ)Qá$̱)“ì9{‰À´WÛÛ¨|0Ó VqVE|Ú‘0Æ}hN'§J¸8MÍXPPþñ=^¸&«§Œ¤za@´¼_^ªÈ”%a™W™¸5æ‚óJƒòÏlnJ#uÈð4ÙCd5f™(¸Pú¶ΕóÔ±–z¿2Ë–FÈA2.|YAÕ”Œ U#¥B_Ù‰]&Òw¯i»§€>KuèqfŒ˜BB¦ÚЃ6lôï}ªöX{„Œk|)j8Áìëy9:FH#˜ÙaÁBE"χyçéc榣!s^IÌœB\Ñ-ìÄj69½ƒÉ&B ¢ÖÀvšþ9E¨†]ùÅ®çăi&4:¸ýd4¾ 2ô4´ÈkÁ#vÚS7º+¯¡J#ùhÚq¼ÿþ¿z# 2Æ9ý*¨¦¼>Œ‰äÖä¿Çc#·²NlNóŽbýÙßérµçôøåxþ0;æÀf [HÓ«ôEWYióËß„&Jò ù¤îŠvy^ɵ›¦oŽ™ÊJMb>}R†÷)µG?ì¾ ÙwŸ aÑ *讕ÁeÅ׬Z´E–Ùj "JÜ02ÒN`8=Æ`^è5гMŒ=yù­&ïx2œá^Ïãl†4]Í+çŠc™ßš7gl¥qñVa¢— ?E$>ÿ_œíÌÙôŠïÿÔB ü¼m¶#±…ò¯oHdÈB3‚i²ê´¯‹Š?QÙ»Nï@„Ôï;%ŽBp÷,Dÿ°$ɹإjqÚH/Û³iÓB’Æf ’b¡—çoþu¬M–п»ÿ¨IÜ.R$,˜5–{¢ÿãd^ß?Žƒ4K1¡ é$Çru0‚ü>¡·gVtœŽ¨#BˆˆOkôψ¸xé¸õý£¬éšîëü” ¢¢léY¼rÆgcK”ÂmD<µ¦sd œÀõ5îŸ(:¿Fór™µøgZ<œQËK„0—PÔûæƒ49²ÑQ²»Ñªël9Z£þàt;‚3gGøœ«µäR/{m*I˜‚÷œxØüövàÓ î:# Kñæ•ÆTà¯èS|E<¨¦_Š,½Ñ~^ð¶ûþcQ  ©É06®M3]âRŠÎb†ÉšÓNv»ˆ 3ÚyÞÝI¡Ó Hh‡—£aK…_“øïñÇ\¨ìH_ÙâA³Ìý°P/áÆ9xe͹€þ›"ì¼Yšqy3ëY°\¾ˆ<@fËØÛHð•ó•á ú}5üªâ½7ƒò—àþôDÿûùtkÿ²Î/Û‰¿Ùò¤}±DžLÄ7BxèJ&•‹gs;7‹§Ã*„½w¡-©¿Ýñ¹†z;vR”1bàÇêÄ„+SaÛ%¥à!eÎ¥ŸkôÏÐNb"çøt’žŒ¢ä=¶ðü{`ZŸç‰kø€Q[S‰cèJnã^Ñ”<1¤F¯wý1™¢¡V¬ƒeL#)}<@ÃãÇÿþw\*@:È‚åÏ–ß(þ%™¦+BÕ»Hvij’;eéÄHÝÖ|PézHŽGá¦Ô|!ê››µ,%Þã½ü6íHp Yô5 ”2Â,«I ØO;ÆeÈ.‹çDÀEb`×eîÍ—½Ç³ƒ5ŽÙ›XX™Ö§>é$ÿ²»¼IÄÙò˜ge$ôÄ{Êë4àpƢɦnØ+Сk-HœßbÍÕ¤tìÆý-2X&1êïÈŽZÍŸm  âòr­˜Û½™Ã²)”ÜŠ)Ì ÃÛ‡aÈv•2€ÇO6÷÷ &;,]2ˆ1²í»\íã¬Zö;µâÇû\r¤=‰û×ÇÖ#ÅRͰZQ¶FíÜË2 þXDø]^©“ü ÃM<á.îˆ[E²G«!OšS~ûÛDç]jÈZ™"–¡,™l’f¬Ù9r©nsH䄼oú:)ºÒ¿~L¯F]’ùÇJO áËÕ%õ«cžD¯D ‹ª°†·5-ÁØÿdZ–·Ò££eÅý$g ?¬/‡RÕ$ƒÓqõ~œˆ¡MÕ¹¤Ì¢Ä'†®É;v` "¤)tºü$¹‰T“°ÇÙ˜.IÞ+dÁ è>‘5î4xëN"ÿçUk­§Ü^¶Öptùhz`ã1œ$.sØŠÆ6‘VÄr†©·¥°:ͨ‘ßWœ²AäýÑ?ØÒ´Í…É"fk -xsVÙË a#—x±¬m¹È| ƒ‘yƒ@ ˆx+áñÈöÞJˆáL, Ts¨P×TòVR ”®N2]Í9N4]§ÜŠýrâ{ ~+1IºÂ ù_`ú¾™ë¯é±yõë>f9<["ØÁ÷¯ iX?&ZÖ¹R« Ya í5×û <í8EÚ [¼¦/в#™Â›˜ðÌ_uìœ-ÿr†¨Ær;A’$+”{2Ëï¼7oºY2‹Ìž#Ð`=S•BOJfLÄñ„ï8+:ò«¯hK’'O5 &yXáG0 sFO6j¨WÏ`¨ÅyŽ6Æ †¨ ­…Ðôö¿ëë8þw ‡dº4-DêMß÷€7ªÎÏE:ÝvOÌ\­ºh“±‹³Ø§±QZW{€­Ð_zŒôH>1ˆ˜.ó³óø x¾}ê¼{^îÕÔ;êlÜzÃó51ôÿÛ Ž$‡¿–fÇ˧ðѿƫÉJýý×?ù/܃¥þ÷¬#”þ=Ųѓ~7\2þ"[@áaô|1HÉL‰ü†À¬(Êÿ8Ëù©„7æD(Síª}Í~üœmÏ/{ìÞ„´_­³K(üzùðÙ € ù"Â…ç½÷”V.Ë©$£/=˜}´<Ë9õcÊ×°îÊ\€ä da& Ѷڟ=$Õ’y1-oÁÇwms ÌEE<Œ1µåÌ¢ù`ýÑeX0ÑÂ¥ ”f3±¤è*ÍȆSÕRû†fÛɘ¡q„-÷ŠlI9•æ`˜Y)Ì<>h$ƒZM„×â$[kgtáDK»4v´V;ÝJ(qÉóQ°¸«8ä?1ÑÅELÃÜòå“jÞÓa`pž`"î† ‰tK—Ž+ÔG¦H•Ä‹°Ú0®!ŽÄà›Sö}}J(Œ¹EœÇDHÝÁL3Ý•D%&°´¯ö¸X–˜qŒdÁÁÑÔd¶ú‹ì÷ôt–ñÈÜ+0ãø4= ÓìÛ‰´¸u%YóHιŸçë¿TvæužRQ £XÏ.M;k€Ç´üÛ)„÷Ádo 'ñÖ`¸kú û«~õšéZˆcµ;þrîœ×ó£Øå ÿw¾>ßѱٱKD>ÂÛøPZE½ÈŒ™óͧñs ð‚ã. /ÁëÉÇ‹þß™ÿ˜žÆS?Zk¹ÞQEVh®à6ðœä•³ë$•O<"H•—\? ‹ÅÞçÍ86>È‹Ü=Éã“{Qzà-+ b<˯çÖÜ9CfòGƒè¼ȯ:ñãßBš“?}Ý¢v1†MÉ.D3½ñð¡pÒˆ ž¦úa¼ ºH$ëbèü,V m!Ôôx—Lñ>.m¦&Fb@êj9vEJ«= öÓ_íÎ~w;‹¿ÅË¥&0¿}7ŽQvþéEó¼à¢â€Ôl&ŒÄ™#Å¡æyÌ*䯯T4ªAj|†¿uÀÀ–c Ð÷ŠÃïó!‹ìgõ Ø^œw¯¼Ô‰Ê¬ë—£CÿeÎPÉ)™Àd;U²’\ñ"eiÓˆE;´]½¡Ê•‘Œ" [$öoVƒA éÝô]›óëQyÃ?Äà>ÊÝ—?º£ß3Ó;ÖÁÂM6 +³!÷4ÒÖê1–©IneÅKæTKã1ðۻ׫›p1pͤ1~m‚ÓìÉõR™>ãT®·ad_äöÖ¿'vÔω¦AÓbÝ_zôl»ï{€}\v°¬Ìœ^’N† \¥ÝË9í™bdä½,#ýp’ë6ó&ȇã*ð^<M6–M¦ Œ4ïXÅŸ•‰(e˜vv[¡Õ,týã"ˆå(·=M-¼Å€»¥0Á Ÿ`8a1šû‘ò;hØÆŒ1¿ð`hjêîN!"YSo&]w·ö®¦œt…HÕAcï\ Šô™…vsìžç¤ÂoÔQR¸<Þ.°nVùN;ŠT9ZJ±‘àJ_ÞÑñ¨CÌõB&Ò?Mþ¸™¨Ü©%xžü¬žuâ›ìõë{»§ â†qʼn €GÛÀmœÉÇšë—ݹ† ‚¬º,ßa4ºßpt`ëI=͵q“?3*ìÇË‹4{¨ìµ“ k`羦—üµo}h  ~ÜS½¼n½ÛndÖÁ1¶i[0ÛêXArkñÌÞÂb&Ä´,\­ÚÚÎ7ö2uæ˜.—7ª:!¥fdžÈêQ!*ñ_ÖN…è|s »³l= A—^yÜså2wÇ(HLøt}4'÷aT‚š» ¨å̾øõƒú8‘3mʾʆ/ÝÙÙÇ¿á(¨YOÞÜT pÒ+¡rNƒþ‹ò\߃Ì|+Iï†8ipu"@S#Õ7d»¿£0ÏH×âk˜pe½£lsã›Ô¬Kýc#€P׋ ŽlùÒ B^’…¤WlRΠ´ x- MgÙ~°ý&'<ì ®Ÿ9xÏ‚«’WˆN.XÓ<–pÊ¿‘dº€vàxqþ_è¿$VÐö ¶"ÎXs0ͲÊ'‹xÇy|‘œn£éx+šT¡²C×cÅž¾5Üæ¢~¶’Ëðø<ÆòQûÒ“xAɯÿ±¯dô>¿úêÉþïë¯ýú»xÞýz‰ê(Ä9D·½ò¾Bü¿"N ýòßöÿzé÷+—ÜE y¥†[Œ:óuž¤:ÏAü°ß¯·ú«EçÏ„`ô„´°q¯Œß·+ŠKuù.´_@¬‰¤å3½–;Ñô˜ŽþøŽí+ƒÕr±÷Ûäv3ò'(¼àéþ»^2­í)þ”tâNðlU™úÆÎìÁxd­_ìŒZ¼WqŽÆêØ1Yh•©Žl•FOÖ/âEЖ{õúôw\ì£b¢`yH+ 2}vd³´Äõz´ÊáRðg±˜m±€pÔ …˜Á‚éº^ðâÜð ÈZY˜p5t@ÈÃ'ɺƒ­è}Âòxž¯-s1ú>?<…8OŸ!ìLG‰äªÊ4'%´ýá¢óM­5_ö`fß½ƒ!”&U.]¼‡~Të`0!3ðPx ßÞjøY'ênÈW¾~`´ ¡šJê¿éZ‰FÖ:µãDáV!¯K i#Qæ`“£Â“„GkÌcÊþËLGÆòú‘@+L?½ñ‰ùÐðì×õ¢X+Xñƒ[ °ÐP(q9$lNQ3ýoVÓ4fµõœYpƒxùK"u8mDÃy!bîH«½F›óZYAè`ô €†#;Àq™^QâX5Ò’€9ì ¯lÈDlwˆÃÐ=ÿÄ=8ʆÜÅ ººqÁ!g^‘DAC+YV˜UÑâehÙPеITDz¸å‰•tt¦—u¥í0Ùw#dcd2h“yo"tBÆ­Ã`"ÏîÄ‹uøoXõ+çu¿¾áŠÐÞÉ8X þéO:Ir¦«v'B0b}˜¿85Xí{"~ñþ&övšf7¶†3ñeYx›¬G‚£¦Ž Ì• ›4¦ y“;;›9ÕF4öîæÁÇ+éÄ'ž€ÁgC¿w©öÄ•‹à`ÔC'í¬âÿ£`Ý^D‡}Ô²àxý_¦‰´JÄ7¤§¸:173úÝùÖ!ÛAÝøÅ"If÷š;°Ìä;u>(ùv€µWϼòƒkDËûK{Ý3€¡¢á-ªøŠäßó¢ß” ,ÔšIýøÚüËò2®Ñèzà·•Üùà…}aà»/M³¸MUýò p½ÚOá·ÒDðçi %_ß7øž#÷7ÜMŸZ¸/Ðÿõõj8b|›F‚ô%Òi[¤Á}¦€ÓÓ…ù‰òW‰Îÿnh@ÖˆjIØÁ¢@ΞqÜX?Bf¢;†Ç×ñÎÓz0À¤æM•äΖó©õ;•øî”-vâÑ%Y>ñ¯'Íx´®_¦ö¢Çpk\¿;¢,Jz£ú€¯W W‰­¬ŸÕ1ÉÙ\uÈÿx3$ߣÒÿ‹ŠÚâ¤Õmaz=¢6?º¾é€Ÿ£g>?N¹Ö¡>’\oÿAdµŒy&©ÒŸÜÂ…=#÷픬‘H‡¤SÇ]µ{ŠÐEü>«å9èSœrIÈ~[2? ÌQVwcâOnåCȹñ‘¨‚aƒˆÏ£Ñd¡ibáÕ=-dU2ëâñm :¹ûÙ £´×ÒId2—Š,ƒGޱŽ ªC ÿt½šhUSP#Lª8šS”_wv ‰`Eå·e׿ð1М¼†û{ ¬PÄŸ“þî©-û²d–SÍîÏH½ÎJiƒ+(Æ)Õ@dm.>L«¸?ènÓGœ0{¶1—ìs¤˜èƒ±ùr…á%®‰ãE¹ÏÉŸ» eº ïOgÍ:Ìwù’âN)Ÿ4cˆ×…õ Ñ>§ ÿ ¸Ma%ù§{Èë}Á1|6ù¯Ï«%4¯ë,˜X¯éíýö)ЀÃ`t€¸xögz@røÑ@«È§—¾Î0pg ox}ž „§sl‰ÑˆS5¯…‡¹ê¯²ññ9™8ƒ´ Î ‰:]™zº)Ÿn¼`%ŸÎ<ˆ‘Q}GÑkiO6-##•/:€%ÙâQZm9i•³Î´Ýy»F•MNÒê&àpØ,‘üÏY¬”d1¤ò|ÀúÙfŒËIƒM4 ˜ð£–kgÄtý5GL»ÂZå­Ô'†ø«žxyN„›&0A¡¯A>ÞiÖÌ©ÿól ¾Ùú-GK¿¸°s—Q¼¯Vä‹Eg’ Ï™M~P–®êÄ*ÃøÄ?ÄV‘ÜÃ'Z*ðHÁ^0ûplž”œ#;ðÚŽ0ÒèŽÝ"Ü ¹³£¯ú? TÂ^dÑ^…Î 5;V"5±±`îm–·¬­6V£‹Ua÷¬¡ÛvÙúo3áö"2Ó‡l#)«u’F€Å>Ú¼töÀ0%±k7SáGãÄ(¨Ü¾kÉ—û¿Ft5T´~d¬;nXX·nq»fá— Æ<²þKb³ XR™ “Ôê0‘×CU$צ³–J¨YQì³ P.8]1´_ÿ¾¾«§¢ €'ÈV3 À$ ã$è„MÉ´lÊl8ûÁ¤—°ÃíÀî˶è"M¶€Dþ+B·)§+û*—ˆ¶ç_"ÌšyóQË Ýˆ÷Ä^À" FûûÚI °bÞ@|´áøÚr…±¨s¸Õjb]€ß®–åöÂNE!nH?Eµ»Óø™®ù\>N¿Cð¢Ê¾?4Ó]¿[8c›(ýß”ÙÊÙM£ñ™¯{{&åä/_®p¦¯1¦àËÚ?ÚíMcWæDÓvr»KPn>fµwvIÞuˆdB\xOvz~ý°NØÌµbLñ])Á¨iËB¢?Ô°y½¬ètóÕáêhE˹8Qe0\™´p±Z ÌS_ãÍ:t¾~i?Us}«ûS¨l³YñꑟÇrühlfº37s pR“L®.MŸ\|mi‚r³@GË)Î×ÝF³\žlè£CMjŸ6m c˜à¸ÞŸóhA5FÈÆÌ“@•´ÜR8ÇÑ2¢ž´GnM–¦lŠË¬EÛ¿SÌ– ã §œÁ™á+¦@šÄë™ò^ ñYÊ€Ç.äæk\‰ÙTj±+Ý…:ãj7ÕæRûþ&_¼Q™àbíß×G¿€ßäVã¦Wõ•–¦ns°¥ÄÑ;ýŸbí_º/,!¹Ñ ¢œô÷=Ô!Ýþqu3ëË}]mó2©5BŒAƒ~¨€þ·I,Bn¯¾«]nªV*än³aÁÚN´×ÐÑ4‚¦°äBŽ«|ê Q©3ö¤ÓŽS.›D@%Ý4ãø 4\ ,Ô<\ dF¾îïVÑzç³ÝeåóÚMƒ»½Ë­wÇ&Bÿˆ.FX¼f²*}–…ø7å ¶73HM /Ïø™‹ÄÖÿìÃòi<ß‚ôÌ»§rkT# ùÖ#v²àŠî´8ÃYMxt;ƒ4ýÇiؼ¢ ¯_ºÍÏYJµœ_(Ú´I4IIJ7èÿ?%ÄWÇÆ+pÏýÅièA~ùãûá³÷H‡*\þ‰ÍûjO'jÝÿ€)Ù`å< ÿqhþ/èyž-i$µötHšõ[ˆ dsÞ5ÿDç¿??{5á4¹Š¾;öGÓuƒ%ö8u½Eöï÷ÐÆûþp=2°ž:D~dÏȸ’@¬;S˜X„ÀÜÔ)«]PßJ´u7âͳ ÷/ó©•¼.gùà»ëKB&Æ“‡›wVq{·¦ŒÂ≠Ùö—,:ë, 7,[; þ?¸DÜl튓 »R§è2yïbÈ#¶¿eƃ´¥‹Ù„åMïXrEó”„Î`Å£û —¡Yz‹¡¨§u}-ý £«0åù“¤™t­Ò%™gÌfoŸ%}ØîÏ›¼CgxF t6mŒ¥!.RȾÑg˜%ÀÊ®5c¾'º1ú?¸R˜XŠ™ïÅ6Þ‡>×Ͱâ ³9È_ˆ«?"q¦ÍO¥!øh¹-x3®¶ ü¤…uz@Æsåý¥t2Ý[ÃN¦Â>=ªÙ„‰ZT=xõR¡·½™ÝPkÖC%fíë±äSKf±*òÓf¯gJÓwÊ3†Cw:ºD»„q üŽ©ÖO´ÃtX6Ô[mĉ|›–žàÚxH›Åý¬s?ô 'a̶ßoͲ#acê`qħìS=DŠYÈ&P'óŸ£À1 Þw‘ÁAã{6æ:^2ÿ/OžIÛNüð2@ÚOÕñ׉ó‹¿_˜:XµÊoÛÐùÉéáIsiWĤK×§B”|uÍ]&P0ŸµÓ æÞž”Áôš>•-™W°%Iª6]¸ç=ô!A’uÝÕˆ¬f¸wÊ£õg ¨04&Ëtôm”¡5ÏNÿä×išÂºÞF[_ ŽÖCK “eÀz•·¶ÕXëØh ظóIäåSp9° ,Üìë«l˜ƒë Kõ¾ ý¿y·©ïG:ù‹ 3ѬB¾½ßk,÷*—| Ê_öN²Sƒï=ÜH‹˜¿Üïï½N¿‰ Ž]Ç‘·¥ &·®høÙâ·ÂWÕØIZ×ýýùýÿßÿý9›g;í~C€·K¦µsRQ‰$iø«EçÛC½¦tåèLl©xf hVáSŸiÖ”q®ÏžeÁËÙ`ê)’”áñà€õRªÌ€àçjà»m5»ó[u¸˜ój*P´™[³»‰3¹4çOð†ÃÔ¶³¿á'¸qùt7 SÂÕžªüâ¬s†î팇†™­Š¦*cìïwDú©Ï¼V„a$¸îk1€þLS‹\s&ZEÓÑ7gâì¼^ÁW†#ƒ¼¨MRm l &î ùÖ)ä:Ž801b ÇÒlÛ{Ðð&5,Í¡^*cÇ(N¢ü¹kÃꆹ¦:Œ*¥¿Ïæ<­uzZˆT†¥Ôï‘D]ŒÆ&娎°l"ÈÒ^кÚËø$¼x?jl²2IJu•°UÓa -ÿèõ Z¢fÎ]´IL ÖƒrÖätåˆj_Fä ì©%ôw™³‘(bE³9DõÁŠpÞ­Ú 0‰ââwSãÅÉ®Ÿtóϳ‘§”#k¤SŠžŽ‚‹d¢/…³]/ËÏÍìéŸ*:øFŸ­’ªG)ghÕ™uB½/.ž¥ÕÑtiÍ ónk% Oý7Œ¸¹\sHF!k KÛ¢›d¿~ÌÔ‰SÉD œŒÌAæHÀ\¯¦†ý~L_I½ºU`÷î!£wðÝÇS| x±‹Ï˜<ûÓÔ xÛkKDÝa½¡¯†6p|÷ ãÿŸo‚Y衦8µ©>7×cTƒ‚ÔpŠ9žODeä…# ÃØw-)Ùµ¨0'É—·âûHš’qEk—äRê¦ö0`à½Zæ/x3,›„lxÿišSOï‹?)._ZÏw.ˆl¹K…ºx…‹ ·&?žo2ff=;ݛƌÊöÖ‚é2餄‹Ý6&Ež8ý¦ÏV´ßIDJ£h6ç q˜ð†¾~ì ]úG5„²Ž#Z5c¤Ç9öWíí–x¼h¹1ͺuã—Þþ6 q¼ÍŒØHèÿ𽸚úTRT¹ºùT§±‚ ’-°5,ǯ¿~:pËóˆ­zizœ:ÖI¥éª àý5ÆÌû· I1Œf'°.&íô9Ö¾Bí×ß²>¤¦©Š:îʯ½_'¶/ jUòÆ¿Vùg!íýÓ&€öÔî껿J Uë{œpýÚAðÛ‹JPÛ/öÕ Ä}dàËœ¾ï˜¸û±´‚G-R½Èª˜þmÝs¿%‡G†ôZ߯ ×µœ«½ˆê…%cdþ‰Îës|ê}[Á0˜OÇ ï‹ç—EÑ—CñÍeòípð# ØútŠ…yÓ³µçÏäÏæÉÍ•;Y£“a¼Âë.§|‘Žëe7ÇîõÂâ]‰´hæxÃòöß–V\­&–§i¥Y*7Þ`XàEzÔ$¹œálL–™Î\¦Æ²¬‚×PÁ5ªe7£Ó8ÁÙÁr œ²* írËľhÜ‹±Ç¨Š¦öy3X—{#v$äuCå´ô¤Z'«¥à¥ð+åNzìAaz0ëúÔ'%êIáL/ü‚¹ò\0˜ ê0HwÊê±Y>àâŒÎu;Bã €xPZð F[¹yëÉôPF2æ³0õž %œ}TO7åÜEyiÛ¶¶>Ú–±ns.NÑä# bŸ$¹ ²¼eDÓ% @ÈD_—{.ñ囪UÐûóȧï%Q@%C€U-•šáå¾vX’!ùÃhú72¼ÇàÇé¡b q¾‚=¯wS„lÐÑZŸ4pÑòzuPXÔ-™o¥m­µ—âIï³Y…O‡7w•þ³ß)n„U˜\»i’uD}Éü¼¸ºô–ó £×d]g£»†–˜kUŽvñ¶§”à0ÚÅqÉê¦lš"þ!± T¨¹ôFpCÓÅ“ k¥rEž'êDPf9ýÃÞ/ÍYUU>–b‹â©Ô³§-…¼&Ï ¸¦ ¡WÀ´i^±%GéÚ ™JÞE/60š%K3™¸+Ú¿õY!¦9A*å‚ÇAí Î~Ä e–i_Ô9%aÝ?’•—ŽÇ¢º·@ðûÀÙ[èóÏÃdXyâð /4Öt¶<,¾¶ÿæ£O È¿¼ð}ÕOkí|ì[A|5%H©Esñõ ñ;~ñK„Ô~Öâm)[L'ª…°ÏBÊ,?E+àóœÃˆO-J'•² SKèü£ñ´ýŠ °ÜHƒÉ%ªJï4«ÿÄ{³½É¦Qê˜Ð*¢•Jï×w`Ê €Ï]HøOèß×7ž-nã¶_(ßpÿ„a—tÖï4N', ¼‰„bÅ&|(|,=Sd[B #ÌÒ•„^mLŠjUðáù›9jÿà`Cu™ÎH&ó_6-RV/¤ŠŽv·¢—F ¬c‡m—æÀÛ«.TÈr!²ìÞÙ¿l˜/3ž¯]½Õ½;dyWÖXù=LÄôÛ™BŽ×\é‹9ÄkežmÚ77C+xíôv!ޱÆÍ±#¹—±{ñužçqW÷~(²ëq²s†Ëº*hõûg·S 6õtûú•ÌŸ3A˜K®É¶D½ø+_<çÞ§ûÂÜØ9À&kDž;BMˬqårhÊ„F¯Ö‰› Õ+Èjsè¼ÖksЪË6àÀèóÓ þýEÀF#q_‡åë_íå癥8<½4Ýíñ&,ÞY1Dñ 5ø¸®µ±k¢™‰¶N)r汇,L3*iÔ–ùÄð‰)Ô»|cnÃt úçˆúkâ]mÈC£aD¾eFdþ¿.KKÈ\>l ¤Šer@ƒê\ù¡Œ¥9<§0IC¡0ÀΠØO˯Ñ:íb­¥a.<ëþ’É‹ÀL6Q.kªÑ Zž'8†9K£_•¬®Õ±µÜ¹ìcfW²ÕÚmÉŽB7HÐóüAD0=m'ÒàÔé’1©ÓžQ û¹†ÉÖ‰A´isÈÙ½Ë D”§új;ÁIvì”(xn¼¹1ºú¢¢3¼s¼’F¼Ÿ™zÒJ˜>®Ã»µt]…Øì­*'`qå#Ù;ðxµiιʺRÒ\ŸªmãÜèM…©Š›ìÆ6_ `¾I|×"m5ÜcÙñk^ì³Ú7GT¤+X?ÊÛe ÷Ð?}ÀJåkÎø·;EVíÌì‹û§;HÝËe4š¿Â@鬾º†'­“Vë¹ò+‹Â¢õLjÎÇΚ{ˆ^HÕ‡ Æïù÷dŸÚ\¿¡Í  —±’Æ oÖéNÝ´9æfýâ€+u‹å¡ Ä+ŒüØéŸX5ŒZÙ“’NN£îÛàkáÑÑ¢¶² M¨o™A ç­O.o/, Ž«“â–žû™>¤š0™ÂMüE¨ ˜õ1E¶`{ŒèÊ^ÙC|ERU•U(üÚ08­1Å,TaÎ+ŒM>áafìø,¬ÀÿD©1´»A,$F…î-=ÈLee iº!N];™ÇHdµ-UwKAYøs"€7Aw±´F™{EÂ8˜¦U°ÕâÀ”àÊû¸¬0çÁèŽ, dªw–}ůuλ¬vÿBý_ßÞê{ï_?¸ÚŸõgI`÷:¿ª•Ž—Ã7eP¹/†ÿ}ð¹dKëMÞߪ2¹rB2-¾/uˆ¢T¹ø$! u};´)ò9ÍP–9RÇ‘bÓe®ÀвºȈÁtûg¨¥DžÌz)"Þgݹ¨JмC¿s]¦‚(zâÙ$ÝòÄvãüèò‰˜jÂ=Yš32šÞ'–ëåàrJì墰eF}˜ÄÇ/dšJÌã ·¡§G¹i%ºPÚç0M1¼úag2* QNŽÕÂRýqÀU¼Í5ümiÏ>÷†ñÐbŠ­ÝS )³±©dŠ.õ¼ö2SïC£ õ``*Ž]‚ÍDŒ «H´¿¶,%oÂ:ï_Éé.}ìN’þ¹ZNT×O·öÖÓT7/ùÿ‹²›€¦«è0ò“rèÈ~{ ·køS¿xÍÌh|µÉ§&ªËa5PÈ—ÿŠÒã³ ’ü–—Ý^1š¦ê”WJXYï¶k½Žè€†eÓFG!o¶n9Äc3©?Utþk»“+ÛN_Qo÷pêN´}…'YÑ~c ‚ù7dYd*aò>FÿdA‘ìGy-˜ S*5£êp‡’MžÀr VKV0÷MýÀ<ÓG‹’ ?XÉEõ$°!º½³fÛc˜¢ª0;}‡Kn·õ›Ã4Þãð§é¤õä56ï¸ ½Ôï…Âðý¿ú6F**…¿£¹Ôޏ Å3AØÓVã/ÜA=ôZ€çטÑ𠀯>˜M²é?—µo\ð->À3ÑÆWûx´V1©TÔüVL %7ý':Ê÷€°ø×½ôU°œÕé)x_gÕ>Ȧg}Œ²ì˜ÆHl3òç²yÖ~*wÕ65ì۸ü¢çù2/ïc@eí¯©û]ÉÑ¿¯/†lxPí†ø¶˜8F±hwbâØRÕ%©4AÌ­QÅ…\Ÿ—»¹¬QsðJVð­Yíh©Ê‰Ý,©÷ î˜ ³âð{0ØdÔßÝQl¤ÄÃ>@@•F#c·(kœÝŒ¨2˜(¥‘Q̨ŸÊ–¸Ò,y…ÀÇQäŸ=NÁûHÙNóJâà_gp…9?îClÚéZVáÂeœN³zÞ“b–c“‰Âì§F“%ŒÓLîXd/]ƒ&mÝ0OoØ Ãí¢^gP¬VgLø"ËÁLë {¬3õ˜ÒoL9v¶vhc´¿Ùb`)Œsªƒ”mr+!|(6Wkbˆ‚FR¥Þ ™^°èê;ŽÛžš¬Ó“!Xz%8Ýàåb.PLÚÙÌ´¾±BŸ÷Ù…é_ÌÛÜjô» ã?ަí”p ö=¸¹A¨¿ÏìˆÒÒõ™Ìû¾R»‹)+[XkÓ›t±/a|húÎ>´÷úðÇõ‡Ã¤—;Ž6&8þdöëº;À˜£Êž-écìoqzïÛÄŒ0úNÌ¿îýõ Df2ãÙ0a"S‚gÍI’{›¬ÙhÇË“½5-?š®ÔèÊdÚ¥8Æ®ƒ0)(íÍ„a"wUò¡ëfÙ‡p|r7»yK¥Q=RcÄ\änŒÏEÄ"­4n‘9’(;`”’®îëI&€kæl I!É…g/Ã´í æ¬Ò¶‰šqCâC× ae2hÖa}fÔÌ“"÷bبþÅÊס½–WÎC¬A”±[©÷ èÊ Ò¨å}"ÓJ²sðã¡ µº)ÈË|Ì k!>³m6½R¡jKaæ§9eæÊ˜C Ñõþ],U?µÃý3-8£¿9´}â[ ” *AiÅOÑ»—…eËsƱöp^¬ŠT-=•sù"œž^O"ý±RÌ«4$àŽ»tÒ aš™!sEœœÌ)»ê,ŒõŸKo”'Ò”ìŽÚšÝÕL[Æÿ‡«t¸)L¬Mæ3ýÓ§º¿kœ¾¿‰ªöÃ&¢#Oô‰7p‹ajÚø<¥:2ß SÎÊ©ýÅ¢ód±øú' -úïÎä{I@ŒƒäkVWÑ,†eËêt÷cŠdô½Ôbê%—¬¦HpÝÍFEB«+Û[–ûÅÖZÛiRãÛ#PHÑ£]°ÿ;¼ì±ºŽ¯‹´ÝÑ4ùëûéªÞf1NRJk„“,&c¦'µ[±|®§/ðôN®Ø r¨54Ó%,ˆwRr×/IùÃ$»´õWW»Ó9Ãk† |ã^#ÇäêèK‡«rXæ­–Í MQOñü#}Ñ&6—‘¢‡dÙÚ¡~Î/sÞrŒ“õ[1º0ºižJ¨ŸÌÒ!{pfJ²ä§…ðËöÔÔ÷¾ú\ÿK>9ü­Ø:X~Æ`éWF+(>±Ð|´ õ|-ê#|¶½IóÐÅ ×”¶x‘×!”AIªé oªî½ú0Äõ×CÇoèÊ4 .ñh¶æà ¦Ã¦œ =4ض{4d]d™KOçæ¦í³™Š{vÏ‘ ùùÚœ ìàFµ£™ n9¿E/-WV¹Äû¥y8PFh43jÁ'g L‹->?̃ÕV†¨Ž÷¨L= æ¥?|͉šdHî 0~c˜ÉJ ¾°l᪠s 3+ç”ͱÎ,÷a< ø$“'úʽŠjb8+ÃR¨äÍ€mS™„öÁ¦È»³ Ñ®“I—dÀt|öÐa±ÑS[kZM.ì-}‹‰© ¾ÿD•ÆÅ,àŸLP‡cMnyLÇ¿ï|¼ƒñîÂî6aDEô㣨p=Ü+©å¬†ó=’ZZ'Îæ2àXmÎNgÃ}miÔùxKâvê}©çxÁsïm€pŒn+ùܾÝd–~=d[ õïcyŸHN5Щē´Š—ðÖÔÎ# gt ðõYG¬K¤{ž‰Ë¾LòNr–mv×r.3^]Õ:ú¹º^ÅýÏó\ßmêÚŠâø«ýÝ“ÄxP’YE¸`îÔK(‡÷ •‘ÿ¢óñFŸâ)Dò$ Â|ø0Öd§Ù •³›=FÑqÍS  ×…6›Añ«‘¡+°6+þŽÙ‘*÷8&]4/âÄC¹ëŠ©߯"D1!X1€ŒêÞéAÎÍø®]8Wøùf5“÷Ο6w™K"/ÅÍ’0ÄgÜ›+ÒTæ™GÛü-Ð&¤ª0K.Nãƒ"·“0eŒu`§Z«)=( ‡'¡è¢SD/:Að¸|'íŽó5Úe£2,Û›Yö èLÇPƒù¡tñÀÒ \<¯ ‚ƒ j"ûŠ/F/;¬âæç½ˆ0ͦd’‹wø¥Ñ¼÷\ ¾àœwò%¯‘íù{ÎòíF}Å8¹”ÒŒt˜z¥5¾p¤^`w®';‚ئ¢“éSšÂ´îÍQ}£i6n1âòîë÷<ˆyÎ'A²•Gb{{~g?–”‰ÞÔ&ZÛ£zkì£Ïm[™0hJ°ªP>XûLú9›ó‰<€=O¦®=+GDÁ.¡D3ÎûÇ]ø÷Rf¨ð 1Õ§FÃDŸè_*û?Nb›£s ¾Öà”*RcƘV.-‰ü>žìz)V›Àz8†ÃΛ³OkÝDÏß’yÔ˜¸yƒ‡×Ò±}å¡¥€À¯]]}2Î7µ îœù\¯2í°¦åØôÜR­ ¦w­NÌ JìMyÄo Öî¬n>¶7U8tF¿¬ïTÞôßÿî­¢ÙoÜ$†MÕõ#[íëÙКpCùÿiÂ&ÿ8€CƒÌ_>å—9´÷7‘BúÍ¿þKRJŸÿÄÿVÈ¿¯_?é‹—œ:­å5þ÷¿ã!û¥mûDèíÒ­Ç•'ÿå¢óú¥Î‚üìãõL•B¸RÉ…Ÿ´6Ù5!ˆu0“T.N_¬ž;ÚÊnjz]êÄ_û‚PMáVrñó'ÐÞc¶|-ûî¼ë{wq:Œ€‹‹bæÎÝÖ¾8†Š>íÜÓ5èv°TyÉê|Æùj s¤ …@%i~5]n»‹fŽ‹5¦JZ!Åœ N Ê]„‚Ñn¡¶Z«J4k›CÆ”°Ä~‹ÍKê²Yáµ:qRì&ì•XªÑ¨v;ÿ†Ù ¢Å]MÂŽaò9ÝüÈÕb2ª4™öŒt¼ú_ïµj¥R2ò®«s] æí³„ªŸ±?y7­ý^›¬+´à¿I×µìªWðÑǾy÷Ÿ—àK鍿ßÂ#ÁtSŒº@‰º“Å•d2ñ7½£ !ã:qØ ’Ž–ûÒ¼7n²h¥¹ïXˆ4ñÁDaRœ³Tpù ¡óG/E‡Lˆ^/õ¼”+[ó"°…ñI hÕÄ™K"ÈE]‚–Lk”˜ Æ$Ggú^ØýZ3S¬öÚÿ<è=Pe½wB}T°ÀóEa¢œ¯&1ùj(§EÑÙÎÐÒPíº¤ù`M· 䢵S&ó,ós<˜Nꟊ":ª{ÍLäs`8 ¢>§žö ±®èÿ³—ᆆçoñ­þÉ9ÖÝ)è³íý BMR€8ÚA7CôÄÃøˆít…˜ÕÇø¤“3Êñ¤,K¡ó°çx™¢-]{% ;埓  uJˆOÙ䤂ãð¡÷¹~ž1)Làü­­î™»‘–á¢DýËâ.a&p/,K(›ÓC¶<0©ì KÒ1ß‘Ûzmýk6q'ôüF… »ù±ª±$Q™±pÝΜ2‘(…P*È Íè-µ„èš‘/G ¦àIçšvEuÞîTEº®î‹tñ“-=¼•&_óúÝ ŒŸÅ½WÀC© Ö{‚B_ƒ‹G°'ݾԥQ°m9lñÈv©víW…~÷˰=È¢èø^˜ÉW"•W{ý·ézåª0^"È’ŽUXKPÒ(–oáâeщ¤2ü<»fíŸ7ÕøóEçMž0H¢Yæ`…p‡4½H\&À˜ÎµÔ‰§ëÞÔµ/ýa(¸£3öœØQ5;¹‚*ÏÏ¿I&Zã³ç4ª$ZUX{Ïz‰¸O´ž IàÇw„,þ²`;2ª;Œœßò‘¾¥aPœ§ÕÃÁÞ#å£Û? "hQéélx]24½ÎEºBhäÀR÷ï¾£H(\ÚA/;'f>ƒåý… ežXM #}/Q4.Q0d#þ›µmƒ¡¦–‡Y²Ö«IzÆ[ãË¿ ¼ñu*ƒ´NÌ­™Ép©—™ªˆæÚ6Å êR-9)ÒÅð¡%Îlã„|;Z·E“wL©ïðÏUvx|\-¼BØëÑIÅ$Oxv¬ÔB™´a€÷n,#Þn1•×QyLuÞÆÁ[¤‘e]°DÏ{r9ÄÞ5L÷)ˆþª[(’òÏbO±Ý)«Þý!^afì sÞcX¸ð ”vQ(ÚfCͼà%'7чÐêLÃq.²¨–ëXgΉäÍcNqf§ʽƒ~ƒ—}˜˜Öi?Ó}[°R¸Þ7™³«<=üéég[+F¥‡†ŒÕë4c—"M$Ê«³ äÇíúPˤ8½ üÑ¢Áÿï¼Tä•¡µÇ`œ5¡£6ÝùûÊ iã-A‚4¢8Ëz,ò¶'¹×PBé7à~ØqC.È,²) ÅZ™oF¼Û] maw¤ÇE'À€t")/ZJ â)ƒ×î9Ò|HJWHzÒ/Lˆ +A<|¼_£šê‘hà›€ÚEŽû+Q‘‰æ-å} M¡(óËJn ÓsÖõ}WÎ놫[îjJP§%¬=½“´P2l{à÷ý$«G”ï í#¦(öÐP×~ƒÁÚžv#Þ hïáÕIqÇà1o ?û;SÇOêVÔ->îµõÂG°¡Â¿!ÞœŠæEñÍúê3ذ—쿽Ôt£ív­pÚ‚€i'‚û0j¶sÙܘñaF7ßKý¢ó#µƒ×Ö»œZ«¥Ë™‡ö"ˆBôl±ìhÓ“aç$¿Iݱ©1°³%YÜã/Ë u6¬…O~v¸ÛêÜÁ0cŸºdŒx; Úk·ZùG×Ü¡‹Ä~en‡Nm¤‡Óà\$kÄ ¸‰ÂÈÈóƼ(GaP²OŸV¯2bâ3¶ Ÿ@£ƒy‰˜á²Ž@&|v–‚ãIÌèÌir4ý(‚Í´½£ràÍÃÉR#üâþ'÷ßmæpª5îÄ…é –2 Ò:mpë¬ÅÖõ'‚†ðíµ)["ò”/*h³ú!Ó™Ózr'ÄÅŸ­ögH•FžØŠM®µ¹Œ,䵆=ìðCSD‚‰ÖÎÀ6yb|x¡2Ób6¼›Â’œ6ÌLTšÐdr|÷S¹ðÏš§ûÉs{Ÿšâú]æ½iý/^dÐâVi€L”!K€)^t>LªÒ./Ù2Õâ p=ßT’[°Ø~/=ÀN丆Ä6;›bZ¸<`XêŠð•©QlM îŽ,Ì“úÖ/^ÁKª 2O$f¢ÄáÃLN¨wªÚÃ9A!¢ŸS¿¾¿*&é~èýa>KèTm"•`Úî3žÒù]?½Üc^~_xÈ.Çàö`¤H*_Én´m¶ÓûSÀ˜Æ¯üÛ¢“È·1‘ïú@{àpv ÷.¾ùæû5Þº…@W[è_·tàßìë[®sº>ÐìŽñø#VÉóSðS£Mÿ¾~bhÿ÷õM»<ÏóiTÇCO¥2æú̹2Œáö“þI¢óIH#?äo²ù” Ã³/¼3\+îÿI­T3n™Tž®ÿñ –¹‘ßô@~ì=&$Á0µ‡ÌÿåáÂgü%MËί&Y?éôe¹v·/ânÀ}XônÁF®a$Öw¾]Zž:¤Z2Þ¢1iIN©d{UÑc¡@3÷hzï½x‡•ÕEì‰rqËÏÎvT·$ïÖ¤©ô ` !nµÞ…hâ¥!dÖ‹Mú("¤ñ¬™ÉJžœ.}·f¥IîÁ¯tú8°N•z_4ÃÖnpl ?ˆ^?ÌRcëVp1~b]cA&-ÿÑlA¡ÝõÑà¯Q ZÚÿÁîÞê ´æ@Ȩ!‘õ$y¹xv±!fÆS]ç"Ûá«cµú2‡Õ ­D |ŸÙLSµ*g”…Èh°½b*[D~6ÔxŠq¡OË·y‰#2–) §@°›(ËéP„dcª•é„}-´ þõ‹<ÝûÒÆ—¦y’Hÿ“N¢CÙc¯µÙàjö²¯Ï¹¨Çä£Ó.O{å*ˆG禌66¶³ òÂkFÌéûs}ââÃæûæ×…^Ç£¾½t{Ù‰!›.Komøà@ÃTÂ$õÓð*p FÁyÍä pK‡¦;AØü¼c¦&(OÅ’“í>:aÙWŒ†ÕFY˜3Éb>4ex#3žQŒÉ«›$u~\¯¶ÅÀ2RÀý™í[$€~ý¤*0#®ÿz¹zs²âùFó)˜jX"4òqyí 8Å×qt¾ÑµÁÚUUsG_¬,“¾óú|㦢@~éwj „òÊŽj{©Ÿú¨BVŸ–+lI×i<{´Ü7OLÞcïjà™HCzΣWQ%l­ãØUôÜh”x&)º*®k“2&ÊÎ>˜wJA•› —ëçi;”&2´dìé4kmÅ@G– á¾a`}Îë %d]ñ Y¶²h@ï¸;6õÓ’çæt±ìñÿˆ(" WØ’™b½ž´Gl•^-è®Àè¡e¾ïHS¸`~ ÿêH5>DvÒ¦÷œ‚$ít¨Á0[A™EAì^B9ľ£•ˆw“ñ6›¥Ù8;‰@:»¹ñÑý4éèÄ$ñ¢_øháhWƒ=VAÌáÇèñÌqmiÔJÕcŸ…õj*•º>”JÄhÀÉ|BºûÓ'àè¶SšÄL§•°õÚcZ£$˜~v RN£¾Nº†diÊYAÔÁ!¢yÑsü0 ¸Òä©uŠzpi,ƒ.Ñè­¸“!Kè¥L'+^&¹6K lÇ?ßjËwb†:ØH/áúP±Í@Ûપë[=I;–šaWÓWI»½! ŸÎcÀlr˜™âÙñ€ü˜ªò¿™¹t˜zÖ­$n$Dã÷rÎtc"ĬbÓkâ ÎrÓêqÞD7oèî‡ÞQàäH¥“G0*ÚÏ+Ö=lä±~#ᨃǻÐ^3£úMÆË f  wp³ÇçïÖµ8ù²ˆ)µ\"úo{T(Ú‘­×#2¾èO ±Qô¨$¿[Þf·ÖÏåAß®ƒ¢Í—|3ç3à'‚1ʸü H%*noyÚ%ÊÞEå¾ÈÓEì‘xŸ ófä~×j1«ž[B Kx šg„âç)ö âa¡Ö\‹væ¢Å϶°-t½œ…œG€*¤Z0®*EŸõÏyÂp`‹dñg˜5\¶â)“Œù,×Î&³-üB&šR…ùZA("L¤ë“I:‰û“òË_?to¼F²/ýÊT;žÂ¥ÙÁc|ÞÀJ²šÜ °Ãð>(~%‘ØÆ*·'0ñK•"@Ç2© v¡3XÈH…&CÁ04dc¦×ÚË÷ŽœÔññjõÇ:ÂòÅ(¤At)Ð Át9°¨ºg¢ŸªC(°Ä—Ý3½m×Þ›R¿ÖáÁ‰ú ‹q(¨ÏÀjN¹ŸÓÿ‘8ºÇךKÚ''ê 81’—s<ƒºp³ó^”ÙéMøc¥k÷]ƒ§Pp™êBgg2( ¥¡?`iG9®;ÔƒuœJ$e;6ÒÂÎA6µ£Pÿ£U góþ·Ìðtûÿó_þk¢~íîE`‰™Î;žX#ÊÉ‹#üy§­1Ž 2^=ŸÛH‘ÕMÊ“ŸU–'íZ%¼ïÚ sùŸŒu¡EžAèÌ ÑZÃ%]Å2Z+fÂ#t˜:€Y¸Â@ô¤ RoèicŒŒÐÝD¸_$•YÃg‚±J*ƒošì ã«{ЋeÌ‘"=?9hVnQ˜1zäÞÍN‰W' ô?×Ü»ERÊ JN¾ù³Ù"êÎÛš¡53ž’UôR2ô…È †æÔêtæ£ÚœfÅ^ZH1!Ñ—¼µÄ=pL+˜¦&Å ©Ÿ¸CÙÿú=Ý¡®§\~Ë(©ÃÞØaøÉÌ»F"“q±•–ÊpܤÔ)5w·»¤¼gsI§¡È-Ð8e~»H:bÿÝUçÀ¢К=÷™}:3ÎÖL_–a/¤½Ó`(F{Ønì äò2Ñ…È5¨Þºh„˜~À^I¹Þo—¹ä;Xv Ýšå›wŒ[Ë<ü)QÕ±Tßí€jUý Åeî®ÎMX,Ó8¯Ô~Ò"n‡ï&K\óudÄ8ÕmÃ.ÜÝÜï6\ V^Ûý~OÍŸßÆý›ñj·¯x‘±¿³ ð_ë0ð® xIøÖꯨñ;·Q˜›¼ý©´ë³,ZMµ$ì ü»D籦¾‡Ô { *Iéx“{ÂÚ_9›bú؈ëÿÜYé ÒØðÊ€äUؤ–=)Yt8sdó—ÈŶÿ*ôïë& {+R îÁ h<‰ŠF¼„ûQ€†[ç¸%¼Ç/Þ­´|N¯¼8l¦¬4+I@¸òrD‰Ÿïdhäk°à½Œ›¬Ý·@ë>Íl‹×sCü m$Ò+QäOFñQ§Þ“1žæñp¶@ÿ‡›u2E­vÚ´`ë’%\¹Sf« ‹Á…wÊMüI9Ý“Q{i‚ˆ•ðíŽVO§îùÐÚMàÛnI¥TìÝzÆ®éžatD.7Ô]…>ýšÂ :8loÆ¿`êt¨^0¼Ò½Úú&PPzÎÌÉ@ʦ 1!»Bt;Ì­E8Ú솹±ªÿ™:]w5;2k*Ž‘ ô-Åí´ˆ>gŸ=Ôžv_ì‚ÕäÐLñj*y±°Ó|Aúµ4ªÙ€ßSJíº>?ƒ:jï|;°Þ#ÖbÒ·ºUË3¤hžoÁÕI$û(»¸+Š°Ê„`Õ­‘i¢c9Î÷H¦Aˆã6È–M£,ÄÜ~QÏ»üœª”ÐC§¿Ò·h; —ËcÊš/‰ä@.1!ã[˜/ÖÒ:MUýªZ&*Ñ Û¿JÔAiNæØ#ÞâFÑ4â"¼º¾oSÔbŠÙõ0.F¯J—)¹N[ʤÍ@¢U2Ñ>‘¶ñ¶ÃÖb¦2Ò°´»F&ðJѨ:Šþ/ø¿¹Ê òÄýÅ ¦óôv³¼Îj³»5€œ˜ÍK3©AÞ;¸Óý.!n~Jyʵ©ÔMê¶ ‘,l^ÛN¥FçÕs­w¬»ÁÕæyÁm„~/ ¹\È–´æ¹¤÷-±1«™H F€ŠÁ­o™ Ñc#¨20οŽ"žÑ"Äp/4ù¯OÐè aÚÔ´1IáF,êÏs&„¢KCšÀYÃ4îö©Ó-LmÐ3ãm É„¨jW¥Dd¬ÎŽ|ýу»B‚•,CH¦ÔÌ:ŽDËCl Iž§k8ëüßÏýˆ»\A`ãrøG¹U´Ž^Nr n]øóù «ÜJCct \‰¹.U6S YìޗϺtV#âe=Ñ1Ä jÕrZÖù¦ œ9®³5žÕz€95Ö­° ÷U·6ÆÄ+»ãî ¯nø/.¼ ùï•ËTTÓ `N=Ù !L8'ÙbøâÀb?p‡÷.%tèö2…®šÁ}/S)Ä'†ûwÑÿ—Ÿ?ðæÑïÿÀ§KWJ4T‚Ÿ†êeóy½ùÔ­ˆVI÷Êz÷Œ6'}€vgðü¦,Ÿæï˜ó¾O–ÿ [+¡€žð]ûý—Oð§^þÓq“ª`þøm‰ðÎ"VYæøOÐV;“ƒÆ'Ⱥè|ºÌ§OûjO/“o7àõƒÊi‘M‘såÔ9ÆJõ¤–‹ÕÅý°?°­ðŒg»ë¿}udžȞ:~šä$>Rd‡iy[ìë™_Ï|#×ÛX¦·¬”\ŒX2fäa›h’ÙKb罚ô¿ã(T¢h{±Bi}ïØx2Êj¹‰HçüëŠZ‚ˆ¸ Î6©|°‚EYí ¦‚KpÛ3aÈÃÍEº… i÷N€õ5dSÿÖÅ*Й :v½Ó¢ÿPÄ)>c0Ž|ûÙ²¡nÐ[&oÎN%MÓm‘llˆT÷"ÿÓ{,Ê]íø0,qÎ+?Ím§/òF%— A:]ôÒ)žžuÝÝ6¬ &÷Ëx~¼ÊYâ€ÍÌr0…ažÄÜm?G¢‚?\ÌcZ;Yº[h(»@xç\£ñ"§¼3 ‹cï®f¡=õÈRríºÒ£"ä¿Rºöù(Œ­êhÔV\|¹©=×áXÓ:û —ÌÜ3}=Òrå%d¬¾ËÂPMÏ.Ôï×Ù»ˆƒÈÔN“x¨®‰w³¬QLÀÛÂd‡¦3ÊF×ý¢L^„;Ƽ)«¹}üŸÜPéõ“ÅÚ<…‹ÆéO—Ü„Îti’Àêv5ϳ焬..$’£B&ƒ……š\¡ŽïÁ5õúQ ‘ø‡Úþk ¡“hFO›·"c ´À¿’Ú8½ï:“ߎü ¥Vù6]F‚“ »Rû\sÀUžTˆ0‡Ÿ ˆàÓ_W·×ø+™®MT%;ð[2;Ù×çWŠäþ>H‚­ÀSüß6†ß{F¡@»½…€‡™ð,òBÍöÉMâÞû]^íë&Uÿš2åx½3’T6e0ò·iX§\ìZï-îyÚ°;¸‘ãbÎÊ0jeLŠi A èÒo}BiØH‡w‰»o¶ÍŽ}=í|Ežþv?Î@ÏÓóå•äWy›ÿnÑùú (Ã(²=µgemëÅ(ãm¢¿ûÀv\cƒ¼f¡ZÎd¦Û TR-#""pÑϳ”h?I:¥,Ç|X¾NüªŸý´? U»‰…Lö™s#YùâûËhVïì™l°Ss¡­ð>+0q^´{†Ç9)'“m Ïn‹p"ÓÝrÅe†~˜ g0C ÷8B˜*ÌgR–˜-aYfmÊË8¸áŠ„™ÔLyÈê¤A9מßÖ˜ïÄIÃçehdŸ×Ks1ƒ°g夻ƒþ§Œ~ ~òÙM>HÔO°Í!ÒñIâiÓ²‰¯œÏW¶´0ZàXT€¦¼ÉÈSQBªñ3éüZ t‰dô/‹ùé :—¼@Z‡8‹+ÔÑ´&™³ûDŧ€Ë„Ó“H->\üIó„(æÖ³ØPFQÁ¨Í“³æá²èüÀ±€ïDõݤÒfpÐb´,ÍwÖªË9šï'þa®By gˆ@ßý@U²ÿЛH>¹$— ™Ná-&qX‘W“S…FŽøJGÀ¼á½)±]Ñ5ÜMM°mY.qëÆÁžŸª»„Mp› U.˜åÑ_pö…Ø4W6…§ƒxƒÄV‡…›QŒDTM,˜â*o–C°©m¬ ¬Ïjiž&϶ìpØÉΡ 4'ØÓ\îQæ©“/E÷r®ÄÑ_Zxx™L;xlsÉqIõç„#ºþƒÐ{©@ô2ìá$Æ~"]aì¸Cÿïw DÀaÞ³+&NµŠ¯är{YõpßÐaærø‘ÖÑÛgêÏÓŸó¡Ö¡õgóqBÅ ã|êšðæ«`)ÅÁ_“cå IMxÿY_Ôœ(äX)i%ÏÀ_ç‹æ®¼šÚx©Ç+oç›JÔº#Ï€èá͟耫ÆE•pÓK 2½êcžÑc1Õ‡3>«\¼r[DM”j°nVŽ›ÿÀ¢8âý“LÒe«ÃˆfÄŒXÌÄâ~“2Í£O¶ó¼½mÈßÀL®ÑUrgþµ,-hê™0ò’u¿íŽ¦Î´Á›¶Ü#³þìÁ×?œNìýbù‚­% €_>àÕ0°RÈZ.\ÜÀ7&}m†-&9O¶Ùç{I'±Q2ÿŒ˜ëÓYçæÅضmæÁ›¬á½˜š¹ƒ {ï*R Ä8ŸnÞï«ï#þŸ/:¿\£ïXšs÷™³}A™`äÛ¯úÆó#9Ç_$3úCV•xøøäx!-÷ÉåÕlrÀø¼¤æ¯¬©G7¼ÃžÃ}}–9-Uy6]„Wˆ<ä4¾Í“Ü"&¶+8[9dó^ / —øvj›!“Äü,ô×›:¹¨´¸/õz›Öê.!Ag»¤òmÞ¡FáÈ$¯ÿ=œvÃ^Å£ÿ¹ÓxÜõÌi2¦NŒ•ÝT7¸µ»Ü›¢2[}—Ú͸ÓP?`½æÕÍpºó} rý¯,àœÏ’ËÃIcŒÓÒ¦¤"U¿™ˆ´4sîtP¹‹ðaÅbfŽÅf™M²g0ï–i¥äØQÔHÂzФŠÔ5Ì„5 @÷ÿw½yÛ¢Œ¿Éì6]#0Ó¦?P|7ÖmÚ„QcÈÊšðÙqª v(NM,Ži'LÉZÕ3²C:^ ö›³UˆÍP²ž¶¼[+2:äÞš¢gÂV‹¦Ó„ŠE5iu6u Ó Öªt .E%EôÕ'4üþÌ+‡B}—×Ë4_"å^ËØ~¦Ëϵ¯ƒÉ ©™P 5¢ÇVµuÛ÷¨hD¼/ÃlRíê½;p­ñ¿u~¥¯»^¤=Æì„„‘út³ùW[ußS× €/Ý;hz÷sJ{†"o¯Î&m3i”!&Õ¾¼G:¸3Œý9› mŸ†¶ñÞo½ºPOõë+!‘ªð•Põm³—•J!ŽEáëñãsOé³àòpÈ"FÒ„¸µŽ¸Ù,½°hSN[|§àw'‹ÄµÞÌ}ØŒg‚¹¤J;Øãç¿qïµ»¥4¿²±’Ào.:ÿè1§Ê¡Ë_zûy§¶tåÁÄ`/[±âÀŠ4ŠQ+2YÈ*¿Üç£id¡“õŠ¢•R ÎüøPlù㘦×לxSçòIÇß‹ } ˜1ûž^¿kñ"bA®bPžÕì3Êò'–ô¼3³Sû4¶žtd–ÂË&¯»x¯çþé‡ÂFÆ'¢‚ÀÐÇ ’Äj¥ÝE'tP”#³ ÄNìÿäü¬Mœ})¨ú@@!Jæ|­¥ í¿n÷¥*f€}ÈÎè]?6#46ËE=9÷ë#vû4Ñr¤•š?qAÿ8ºNÎκJõ¸ÐûÙ‚‚çÊiKí4ÓšCĦÈÖ"„Ü¡Û}¢úk ™©N´V•¤¨b2§›sC·œë‰óîBb3cp *ú×Í‹xÐÚC8]ý—eí‰Ê„‘ÀÙ© c㜡{Sìî;&òâS¸æ¡GDØèŒÎ†º%v:1ªÜriÑX½º-¶šÓZÙŸxr­©Ø³ º7#\û›/F~ ñÞLDE²Pþ¹éh»¿Ñ ë‘TmĽ‰êƒ%ºZ#|Í[›H€rŒ[4&D.æþŠæÝÝ@F˜ÿ`~¸ˆ‚fêRêSõÌéÇÍذ¯yÿÑù<ŽLî“ÍæŽ\8šùÙÚpD CꦎéGmÕÐv Çge-·U÷"#Ïc׬ Y4.® Ù2Ç1g‹dýõ;(éMãþ­œ·é]©£ÝO ŸØàÙƒ6¿<•¼î·ðÉ0Wäš]åú³ÞãßHFÈ\üþÒ&Ë_ÕTykÇ‹ƒF¼±¸½È—ž=ïi0õˆÆ”Ôö¯°SŒÑ$Ö¬qE€®˜@ZI$Þ”d#KC< 7Í/kêlvYŒÊ‘\ •B\ÞÈ/ïXcŠp`¸°¤-zþ¼‹tŸê,}¢ã÷µÈçíP·¾Þj›û ì{Zz’ç¨Ø}¨Œ]MfÖëþ’*¿ Þí=¦ðÂÃÏC¦7"Í1‡Å:u¢ð˜ö´®¦Iâ?ç BäìëW´àyNÝÔ¬uŽz-Úq% æ¿Vã2¯´@r|z§#¼\ œ°1æ.„t{F“ Ø}©Ñ <68%JõI:sõìÑе¥¦Dèl©Ë|@Á>ŒQ:•wHðl7$ld÷Iž HEGUT×¥Ù!š>—’…ˆl«™^Ç´mð$Ѹ‡Öt¶À6ì‚ô[1´P­zŸÅ(808¹Î\Ù1D¢éXl¢ sŸ*>†Â^&N@W4þxR2 ô·RïÅœp§-†ŒVéœ`4ÒTJâRþ·77þ(‘pec±ÙØ8wKÿ·Zr×ä¦ç ÉG·ßù5¡$JÝßÉ(9uÜÜôœÐ°kÈ%ã±NÚjÙ˜ü7rtÏ9´8¾ð`Ñ­åv¨úíKý<æä•ï‹`ýjOj 9ã*äóz¨$€ò^P¹{>àU[‚3G10pÄyªDŒXÚ‡‰`}ìâ옳QCK©¯J¢Ói½A•¸ç"šîG%ãû´E/a%Š¢Íhs $«íZõÛ*ü¹hë®|¿=ÓoQ™ Iös(îÞ~yþŸçÝ tÕâè™Õ”îÆ¾ùoøuÿ´¯zF;÷v$ó=)óæc¹œÐêv†WŠLi‡Ö‘)9``û`ãØ€þ«;dˆ-ÙHam2öUàj:´LÊ4éu¬áýybH>ï8G µ®tíötªtÚ#lÕæ²Ë½ÏUÈýq&å´Çª;\m-sq hZ|&‘4è¿P€¸ºg&“–oô…2g±ÁÁ²R0Ì‹Á‚¶f÷Á.Åßi—Y"áÀhðP“]âN¨ÿÕϽ~»#ãÐÆò˜£иÄdæÈ {Î.îP!ƒº‚ÚOžRÛЖùžVϦ óK£†·yØ»ÉkOË##Ѳ¼&Æq ¾Øý-´dzÃÕæàÅ”¿üM@m·@ÎÓΰ³§äôæV;áÖ:göúù9YЦåò0¦O{ȸͬé°Þ¹¯Ll˜‚°ÈŒ`«2ãñÚãf×LÈÔyìÄêI€·˜ë ¤Y<ÒÜ&רj*àå¨#öS«ÿôY€¶;¿¸n쿬ڽO©¦‚ÈüS7ý;¿‰Ɔ-Sˆ¾ØÝÅ+Ò_üêƒÐÖ?»ôÏø úÝÑ1‡Ô /ß_}äHõ=&’èü7\ͯ¹ $ø46%­[!PÀQ¡l¯¼ëbQæ—åïûϼ–ßnž­¢Ÿ>ð‘³íCôíkF¹dÀqƒUo ÝŒ°Eéöp{d"Àcym3$ç¼ä Õ"?Û‡V5o¬óä'ËgNPX!T¿àcÆ­w¨E*K­ÄΤ/v#»” W0Ùˆè7ßF²@R[¨¢tï"¹.íl"w£"_²F3ÅMJ[M(#º£0'¤Ñ7É¡‘ñÞ’ëè p2†êÈ«E:ñ¸Û0q&ÿåƒù€ÕyÁhë`Ôq»e‚_(ä}æ– Q{I€‚ÝO«lÊíÍÌM’Ø´Ê›©ùó>ý(b;zd²ëÜc„šLö5ÏÞ2=Y½ûT_o—îøK?Êô—ØC\寴ÿ(ÒšÓ”qÁZ¢Bo”a{ºtýlÄ%ar­º£QØlPÒèy Dó—£³÷j—¾z|yAÛ l§u¬þhíl<à•³œöÒ«Qp=ExÁÅÑ(>üŸ`Fáàz/¹žÖÎk›½ì|›:ïb˜ ¤¨Vu)Kúêïz ©”ë»G»„yºÛB–ΞŽ:ÏFÁÐU *ÏTFÃÙFdjs¨÷4ú$æ2ÿk¹V°Á‚†‰1D~™û’×À“lí…þó ®v\9E÷—œ š¼9à θb\5Ô=f>#vú˜¦Á£y~ùcbð=F_nJ¼ÈÕæ¡Á[aˆçÏì±R¾ŠH¹ !+.F]×Âr€Æ”"ê;­e£èHÍœšÍÚOJ f¤Þ§8ŽÃÙ ÊÓü†®U)×`’â"‰Ì8|L iî[¼ö´‡g#h"Ï€’KÀ@ú‘ýù9þ?‡¼—Š:yÌ’…Úº,àÔ¶ÔçI½¬ GÛUJñ%wÆM&Ï„íKÀœþ9…*™¾ Ó†Y­ä©7ª¸fÚľçä§Ó,>ìÈÅ[Ã5çêöËgdÒÌ¡«å8Íf™/¯óeK ÷畤;ÒÚî&¬ µ–©FܼoM&XÂxº%¡óŠ÷îÕl*u®Äd–nR޼´¸ˆ«PÓ€vÉó<ǽ­äbžÎ]£(­Ëa[Øh¾Ísúèbv®½Ò/ê‰l›ÉÏÇÌüi™îá4£îmê5ƹ ) à””D ¹nXC·Á:º) ¾’qS HÄ‹ÄL?Ù4†£‡Ö_,:ß …K<àhxLúéï¾Û•Í Jº¹hÀJ¬¾o£ã_‡ ·Á½·Avù5‚…ÊSM! hƒ_F±ÿ{D ´§@?¿Ûöì­µn›Ä—/÷ ï|i_¸ž?Íõ¶[^áåC¯–ÎMÏTñ»ò)¯±iÜ¿íäã§3E&¹<‰rYáÁò£‚v}‡{C+Ñä^%B¢‚è8Ë>úèk¥”™²lÞíÖ = E¿ÏŒªx7±în/µM¬ÃO23kLáIlHþ̺ÏY…¦iwðñÐC|$jÆuîµ3ˆâ!»%Æ~–k¸}w£¥¹¶ãšUö@Î Îú2i¿­ÈN-Ú§Deý\46ëO¿Ó¤ýŸf±Ý˜?;狸U塾!F)£—tÌéô.⵫½É.ÂFUêöuZ€ª‰ì>"(iº2ÃòR>Q&-šÏ çÀ蛸:ŒE>bÓ¶ ¿æð  Ò…–nô{NnÍ€‚怰ôÜ$ø"Å ‹þœ|Áÿc]I5ºøK.×_¹´(‡$§0#ŠŠ t$ÍùµR ZPìFºÔõõ¯¸1„BSo3ŠMKÑO¡tÌõpÞ„¾,FŸ$¨?Ê䥑£\# BP·½1Ý„¢@;Ãÿ>))x*é$A`NøRMViy» ´EéJÓ{NIDøò%É-Ù*hF¹B 8¯Mœ,ÚmÈ•³h|o—ºáGÍü–gL@S‰•»›‹½V4?÷ñôv½O¯vƒÉá9dͯfM»P9¶*Æî⣹ €.oþdf£é”êÅ'+«RJx.÷åY ¿¢´ã¡,‰µ&j4ôž4Ý5ßa+µÑ´XpÇyžn¦!Å}'Ú'$‰/­ß˜Y~Ø\Ý«}™@ºz¡ÈÊöàöûp§ÿ“56¹FEcC Î*vŽï[—-ÑîÅí¢JÒBÔ2ÅGÒ?Xtþ±Ð|Ì·r™ªáUÇg,Œ³ ’é÷©Ù‰¯8ÿ>_?\n~Pî?u[BD¡Ç\±ßjA9Í.¡ah¬ç>0U¥[Ýk&-B•€©l³…~hõP¹—õE5­‡)˜Å/4k8®ŽãžeïÉ¿ÞVår º kúÃRI¨ˆóŒA¾nb|y-0œì%—»[Ë9ùfT#>ÞãöïçÙùg;M…,6Ägz:lëGML»·dßHëò/…•ÔHäceÊéxxÂ?Ú¿fkhfFnmYÊ“éþò?u\í­OÞ;óó”€G_f·xçØ¿µ<Ìqgû6sˆ_ñ׋<þÑlwªÿ¾>ùµðp~5œçù¿ÿýï¿´,¿íuãwy^üÏÿ}½—{}Mè聆+'üæâ7S'C=œõü_ÞZÁÃÿ-œÈønæ‹·’æÇÏäámü)¾ ömŒÝwÜZD}Ìñý Þ ’VÕ:眳ÐôÍxÔ[\7Ü´p‘æà¿Ò €#Èà ý€ÉIÝ>‹—U  áÒvIhÏ·à†¬ [ì¬eÂ%„EÇ@¦=ó l–Þæ@âÒeeöËMú¹2ÚÛ­î#ç2v)ñǰ›”0žðš›ç'Ã0:>v¸töŽ·¾ÚV±·/'òÍûÃZe9sirºýe€7®i®\'¨òè™~Iå¤ú:ñ?¿)þS ´¥ñoaˆÊúòíÀÝmÐQ¥Z?ÍŽðÎj’Ã͉KVœîô³¿a¨°É!­9’hy³p™Žãæcœg¡ÚŠ,.•ʼn“`Žhh å«öxïÀúþ"‘ø*Æk T¨a÷dÂ$|™a€ öZ© :£>š9Ú‡òÔ^nXÏäñ `SH€¤C9™Ü ´0Ô®•¬.÷ÒXÿÑù ÛÚCV¹ÞÓuÌR–{Kí T¸hn襳¹*²xYÑ¥ÉRwX©¢lˆºAz=lò03Áå#Ûü¤?nÁ÷ïrXøò‹ò? ?ÄO~à»$`ê‘qOá´l¤?] ʘã‚÷î;âS€í‚QU$´j©]aìiFÒb¾¸w³°1À=¿H’eº1•W¾ÙÙ‚9^ ªôamߌúêœB3Ðy 8)ÊœëYº¥±8®|2fI¸óCíAŽYˆIç…U›-ÁDza^„£?UìD(Š¡ i°r"Aù‘¡èØé}Æå›î£4v²¶€Ü…±MªœƒŸ‘´Ë4oc˜wH§/Ú´™>ȼ\ËÑýÕÒUgâi’ï0*œÊv“š•JÌ’¦$ã•y^éÓ³;m¢+{²ƳÛêÂÚž“[ÁpÂð³Õâ ‡d¨™˜Tzóé“ÕË“aHš1N‰©`Â5Ým¦¥i´Ó¯« ³˜Pu+˜­¯¦é½œ½_)÷KaSZµ#õmS®h8 ÏõaçShlNí­ÑB°$UŸeví /¦\(Œ‹‰ÃÓŒDSµº— >}o§ggÎ!Ý‚'ÚA›723".Ò ˆˆƒÕ]  ©eËsäzoSûºê†Mºëº§aNn&ëH )ž"òÈ’*Té×p÷À”_·²¿ÈÈò7 Z»g?D9_‰?(fzÕG󶨆màg#6N%ãö-7 Åzür ·¥·¢äùÝÏYùþ[0èmŒX0j¿óc½²Ndì*Á{»¶k3t×JŽËö€÷7‡iŒ•8уz[†gXX8è^Jð‹¦»›ýžzp[· ,o·ŠnÿcÉiBò'é+ì×Ó(:ŽÜ=×Ъ*OÄί…wÈ›´mÚÃì[€µ€ù¦’ÅøŠË·w&´‹:žîƒÊb½ÝöW`¶Þ]Gd@ØÆî$­³9;C! ÁÁK>^ ]Ë$¡›×£÷ãä÷2>éL¤0|€!ieÐ¥gÊU}Ö_†« û÷ôOm˜ýcD盕ÌmQhGz!;°G!÷.ìÛPÙï|íª¼8ú«ïÿˆŠ©ì½”0c 9 J4VO.*ZÓõfujµÆàZjl‹huÇ#ÂsWÖ¨«ÍÅ8Ï'1kFáâNL}š§g‡N†¤£-¬^¬8Ž_39E¶þúï©€¶Ñ Å–U:46RÄn§‘Ê˃fx-ê´„,6î}½FI2¬áXZ@!(V¬›ðV1 (XüšN¸Ë-ÏÄÝ9 Ÿ÷Åí‹ÍU8 ëR§€5ü¥?Û±X}ÞcQ^×=â–™…ÍÊYp¡«MùŒîw؉—4Ò;"¡'›/½Û×ä#H"ô¢‘Tüi¯k"E¾A‘Ô¸ ÿ¿l2që]¶×žÐ4So¿øëÑÿô5÷Ú7ßúœ¼°…!XŠfñQ0Œ–S1W²ê•¬û)&u~Gb4˜kùpæ¨Eƒv…DœÝ×Xüã$ÂÁ·hÂC}‘“¹èFreÒëÆÐ 2‚rƒUDº<%QùŸ÷šÍjð¸²gÒém"mª„ U‡¢K*â+AZ„ä{’¦°¸Å邦 i¦–[V³nOæ!T5‰Zð¢ sD"žW&PŒÓc›ÐäšnɧBo|Pø:»qáQ•¼Ô¾VÄÜJè>·|ùP]õ-µ—·kYfMŇçÊâ‰y™€\¯²}ý½}•̧•Ñ–ø‹.Ÿ¬“«êíÉnþ3ä~ÿ}ý7¾ðÇ\Û·Lü‚’êáÀò#‹cÕ“kÍ0ý¿÷ñ=)»~WI¡§Ð“øýnïvÏ–"‰4N>¿4¸2¤€aã–Ùt h£áItÀö¿²2˜æÏO4ñþ Àw.²«õ©éxŠÈÈ´†GIÃ…¨¤4ã¹;QqysÂ`ÿŽÞ¢=\?ùªÃ޾4Ñ1°“ Ø8!Õ²)¹X$[Ú£!N`Y\1)†Mhy¥\­«|†Ù1•upÖ«ÑbæBݘ…(=Î…¡}áGsc¥èÓûc|îÃëê´®”žÅj›Y£˜†QLó*Ní|ö› Ž>¯¿b($àM ùD/\Ñ2]…2¾aÎùxÄMi Z1ó–hi+ý†K­jT}ÊŒû´8ñ¢ZQZ* õÿô;mÞ˜ÁÓC–ä%³v“ÚX ¼7Ë.jŽP˜€b­’Qƒ´Ç=^õ¤ÿ}g,hÌ¥u<à×w#ȳ[–%MÆ.AÑUQè]‘ç;¤³”ócõÎ0UŠa(ɼšœòÓmZ>\;/幓ìÃ]hC4—“Pt’¸LÜÄ  kºã£êï ã{cAði`Î)¬æ˜èlªh‡æàÔ.¼Õ±õÁ’Ñrq;zw 7I¤1”)Ï÷ÏÁ\mbÐ2*¶7Vi 3èyöû‘À3áXÁÒRØ—-Bó£U+¡®$,j莈2m6¯µÄ6=«°]N¢3?S^n¹ðNö'Ðúâô*"—|áÅ Q¿µˆß[æÜûÁ“ÜŠ"sÅO†¦°*¿°w%ß‹‹¾ï œ=Î…hO:a°Iüú‰Z&A£÷ü›tÎ#ñ|DZ“‹Ï{ñ,^ç.‡¶'ŠÀ;•ÇVòJåzD½@Ù>mÆÇyž—}Ðy*øêE–Ý+¸¹a¢PÄÐ>á“ÙÓ[9†hNÖ$„Êã¶a“†V™cJWdÎÛ[+ösD9r¹~Hv·ÁÝ|-Žæ}Ô%ûpàwOâg}¸pW¡"];Kq'ú%iZµ,×Ðd‹Ä@†€ Å´ïn7si…„×[ €1œþ½ÿ÷õû~‘?áIZ÷;gë»ÿÙ@¦7v­ƒ¸£è×ôGäÐÄëÛí«Û%ép§U࿯³ä÷ç;–õBxO>i¯,ßu*€¸ãt)Ž Ø?õ§O¼7âØ¶ûGÇN3÷URGí‘-a¦=>ýæ(‰¤N:ØZ·h§½Z$@¬EšJËÕ©¥i5 ë&|… ¼¹6B¿'d“ëµðŠ%i.<Þ×ɺ Íýh¨ïÄÇj0fÝ‹T†· \ ½gêþ€_Æ–‘ù¤B‚æRž÷-gàø±`À‰3:œ<[Ÿ½™XøÑÉû4h¤™ýµ/dNm¨À'2F&Ä1b˜?ëb™Ífkq6WÛl×(BÆÏÙ¬|ö¡¯CGp¦4Ììr·¦Bìnš²ƒ1=H9™àƒ™ò%ä4Zv$?°/]ÐÐ|ðˈ¡lµŽ›µtg˜`s> CùÙ H,ŸBK0râ}B„<,zR)MMìdênúÜK›BI**x5ylaTm(ÎÓóK8¡UiKsî·ÅfU/gôT•€9®"¹3‹’6›3ØqúÿƒÓÊXhqÕ¬33ì­o°NÖ\ªÚÙTÃ×ð"»Ã®ª» é;"ËÁd”±~x†˜w7Ï-Í?Š &ô!c7ª[J>z¯b=ìÐKL‡[˜îMëjªC“ÈfŽþÛÿò…šc›ñ䞨ëF¡Y6 󀞜4Öá¸!•tÒÌ ¬{9•Q µ¢h“å­!°¨ø´V3Xw€T¶åNÅ߯køøb[`:ëÜ96;‡m §“O" —sõ`¢¢†1®4„}à3T¤ZÊ¥}lí¦ÉØl¶§WÕÒϼ\Jó×ï¸?4›G¥ø~ÏL°jÐÄe ƒqóVeÈö©Âe~Vó_ØT_T±õF[—„dHVoïs¸\©£Îà4Š;`kÔÛÈ´_`×—˜ÎÉáO‡Ñ Á"’$">¬ý)ü_7”÷Ú-¿nÿa<À1ÕÉ2Ä6(”{È"Ø6cà:­ŠuÙac‹ 4ã„“ò_ÍIÎNÄéz†¸‘ lkò‰\EµœR®èR×_Š-%‘ã/€ûS⑜{ 5£_=b¥²*Ëeøpá)O£Êx{ŸÐ¿ž¸ƒ&B >tæÕ 纑Nî~ ªF2Å!a îšøÝ9·Å×WÈÞKySï$¢ˆ|7útj<.|¡);ŸÉBRô<„”!‚ 1àâu‰¼vêüòäm‰x¥Øpa»oj~ëÐþæ#ÿ¾žà°³8ø㎯_Ë|ãHÜ»‡rý⣥íã72rç¸æd®_9+ÆÊ04m"à[g’EíÍ 碋ýO¹ƒ’®N쀚{?ÉfË’ñ·k Èœg辪lRÃK{ZF¬¬«[¨ùñ2èô²«\t®%nÛÍ[¾IÊíq>½¡Mš7Ѓj;LŠâbåÑb_‰Í¶Ò>ÖU 870Ö€½h1MšâŠq‘ê^¬m‰ˆ{ŽÔ> öœtö{!YzçWQ½òû+žOeµQ´×ŸIÉxãß„Zys埡þþŒtÅwïÈï|¯{"vê|‹»ì>è å«!ØùE~é™ÅöÙOÏ‹¾ÆZý5¹œÅjÿC_¿\ÇÌZýœÜ_¬ç°s3SüdÞdü‚Ï»ìáGáøà#tÓVY~Ÿi>¾bàÛ“†Û’i™ë~°‚ý¶íù†èüF;3L ¼:Þ •Tb•ñ>I›ñ.Ô½ËÖæ›²í’sšåbŸÏSÒŠÑ-ú^ïBÏÇæ½ãV$ÁN—ºÄg}Ð [j´‰eª¼0Þj& >]†ÏÀeFN ¦«Kÿ>-Ϙ7±¡IáÚ.Ø¢òŸ¯o@7MóÓ”;5ÕŒ&¿wpÐÌù3fbø#­@<Ë|Ê??ÀrYC‡õ ÇbÀ#¡œA@þ.‚ކɵ.ÙŒáà>7 <²ùÜ ´?žP_œ-‚ü¦Õqî:c|¼b.;ƒWÅÇű@+îÝ’Bl3Ä 8Øl "ûí 3Ÿ©élkÈu­{Ýp$Lç c¸ºµ6Dj'>t'¼"Ìõ_4?åÁÝù¬­Š[­0+'&‚WMø¢·NÜâmK>]¨3æ:´FžNpÆNÏBHOŠÓÙÊŒDdx¿´8‘üÚn sÍ6Ôžñ Ît{××sýd8¯Ù×ïÝÑæ´alÂkÝ@>-pt œ©åDKYï˜~gÓ(?ólÇ1|eºdtï¤]yãŸÍ“‡ÁíËâdpWN`¬¬(š}U“Åi'žjÙ õI‰¦€—¡*uË +€“¶ð øí H†–s†¾•úHƒDÖtýWk‰â›0r#6ò  c (ÞØ7е“t‡w+Û7$Sÿ»Á–Ÿ$@„içPX›U\ýêÞ §-§õÞ%íñ›”=$/9¢$—úf7ë}Šñ¡ó¥§×!¥ ÖízÞq&0©Û±?Ygýzá u°d–÷%Wx?q,ž×ßûrßÀ†~fàQo"«Á €"­…7DÌ­gj"v7Öâ˜g^ ~î°t'×—‡–žÂýUà‹Wõ)¥…G`óq1´o×G êCH¤Q>¿Á‡ïñ;€’¶µx6Žcùôµ~zY²Hûo<´é4êݾÃ`Öxdp½n¼Ø3«‰‡kÒÞä2ññ‘^ `â_ß¶yàÒÀ_óõ_çiÈ*\òú¯&Þn{íKÚ¢Fï‡Dw \¨³„1hÖ}¡²(²4þSÆØÉ'ôëWé!5ûÇuý÷•ïVw„œgk­Ý+ã¡Û?:‚P¿qìøÚLÖðß1О7DµoÞ1äyÀî«!”f|ï#ßæšf‹ø?9gTT¡(Ih §û˽çA«d*ò}H€´òä^»È¿&·ùÞØâAöö%ÅVÿñ®ÿ÷àbÝ3š2 Š‘Ý½T„>&ZQ3ô 媨J~AoH®c K‚ä Ájh×ñ‹ž jH´\9œTø²²§× YxJ>ûŸbø‚!× ¦ÞÀùÑ5öD†G 4ò4qW{·IWŒ~bóeDƒµ—ؘ*÷É3bô¢D$*S·—/8{®0í­¡ßJ '‘) ÓOŸmú'nG&BÂ8$þe•0¢¼Î°]I~JßèÁ‰ÕÏÞŒ5®™è´ï°º5ãàÃÕvYúɸêǺbnO>Æå"š–:¾õ.£åôâ&Í~]јhÈçÜá¶½QÎ12s2þçͽ(®ƒg…ã!*!óö䳞ŠïÐâ¸õÆ'&É äDRi~nto E.Ójˆn*©Õ&ñ…IÚàÔ Š³5Ì×h%†z<ž¾7®Òí{¥IÌnßÙÏS ºe£§÷h„ÇvvÃ>L.¨M_s÷‘X#>ï%Þ_amÃJ#µ RX]ù„z%õÀ“wÜû1¯šfÚ¨›-Ï ù3(ˆ¥(+¯õ?1#ù‘©‰öˆzØ!ÿ9|n$ÏX­d¬åwXÈ.=jCVrÏSï:õ‹ÊS¥©Ã¢­˜ãiÞlí$DZÝkFWˆ¤y¹!_ Íâ³k™`×"qi¶L°ººlŽHÊ5æ?$¥0ªLdj>€Ú{'”ûsä Þ–׳è|À|n&÷.N¦½´mE¬ïž¨~¦âgâógØÝ×ùÎGâÄBÇùnR8yNIWúö¤“ÕÅV“63óØù%„Š·ÚcÚmÂà}–@?ÄT ’BÊ ÒèSè•S#Nöæ–!Fá@Ó)”;¨Èsœéù`Åë×ÎþÎ¥º½lKÞ×ë`œ,G¶àÆ ð×ÇsbFn pCc±ÚOP…t¯ÀLŸ´Ÿáæ@JWM$° P|o8sLe‹ÆÂŸ>rPÚä0šG@{önHÕ`ŒÈ½XJ´¿F1ö_›%þ÷õäØ@€gŽ7‰¸Ù*,3ï³ûè-±@©ä2ôÔ 'Ø!9·à3¢Ò?o³iéIˆjÐÄ,Êê€xÄÊA·¦³m@ݤÆaršM! .Ñ=ã~IÆKœB¯yˆ£á€Vs±K†—·…hÅ è¯R­ù¬ŒÚ?äSç,V„çÔÑÓ»m‘¶Î­Í@9òëZ^u• Ù* É.ayn¶½Pï×›g‘`0IƒpÙh•Òz™Š½ùÏFfËý ã’~fù­æK†Ñ–É]Jq%$m÷±ÎvKœÜ*µïo`fŽSþN¡x°ãõd`ä9ÛoŸH—»ä?é"|î>^Y8­v«q—÷;¤•fÞßò¤Q¾Û·OTˆù{Ü{9}ýEø d¨Žoœ‹õ;k„oC¥Þ”òøÊs‰_?!@Éçüþ ÞÓæv˜‰p ßrä§XÀ?‘\í²µÀĵ+÷fø+*×7ò9üf×Ïòú`$µ™-‰ªð»®ßñª~ðj¾óDÃ]¬#øV5GØÁUš[_Ϩ<«ømžùÉÖ«Z»Á³ñäN#È_T-o·ŒÌ² QláýÒÜԸ܋ª`¸ÛÐ"ç…Aô,@$x”@ûxKTñZoF†‡bÈäÒY0Ùì—É$2‡šVzðJ8‰‡ÉÜ¡ufx&k' (X‚¤s»¨œ9÷81'5íNUчñ¦¤è"”’³ù8¿u ³XLµJ£*ç0 '¶MÈ-F‚îCÖ°¡EÖµ4‡Md?ÐÌ4¨+q¢¥½`HCÒ‡Êk0À.¼dÇû¾;ÚGÕÂQÆ;d5QZ‹Hf¼Ù„¬©>+Þò~šêM´šqþ¨rκFÍo€ë¾z$QÝÀi:z¶ö?1;%lˆ^+¾i 4žÀ‘ÅÄã­–¶±y‹<ÊA£p†qÊp)ôîéŸt rF ¶&˜¸³ŽLál-¨Äqø[bŠy¼úÍë¿}÷ô¸ú–½™ÐÎC{€ó8ZÖL[;4s9}Eµ»dºTäø8ª ®ÎÍ{Åù>ÃpU›ÔNOP;Õýƒƒ¸ÓxŠé}º=úÒîGCÿ¸03´9-Àk+¦¦¼#ç!kGwE¿Äz×± õÙMÁóWÂub8W7MTuL½î‹¬B“!úÅ™â-þCï©®ìÁpA|G¯{[žTÙÇæ£àæúdˆÄ½–¼ ÓQÈ©\<ÉK7yH•ð(ž\«óˆ‹û–Š1Ð~SI_<]fª Ä׎UÀ6N›½x@™><Œ0zÃû„½÷±’œâiwüzs¦µeµø(hú›£~Y®¼•ŸçÀŸZùBŸʘUEì]ÉÏ~.± P^. ‹-ñ‡ßŽª?»É¡{C? þaÇ([tˆq»^Qå´‚ˆ‡¼c0sÍ ~Ƈ¨H>¼E>cþbÑy>>6¾ä°k…—é4-­,¬‡ë‰çrÁeã-Z7wh¸´cøaneOšJPoßIü“ úî` Òç=®ØÍ|tѸK—iì¯+í>yýb óš§LÖ¼ÎKVƒ.ƒMÇ)•è)£ÎÞ=Hô‰w³ÖÛeî`í‹eÎBÊR¶}ž‡‡c8ùM2¬(©Æ_§Ãó:æÎ·¶™ mTŒíº»,—z€ª1‘å^„ }l†ÌðîÎäR,uïg½w y$ÖÀ4ø’\­–&nÖ’SæeúÊó“Ÿ×Ü*ñ¡Ñ ݧkü¤WPYoEoáYU­ƒV¿D ;ÙD_§‹ s0÷dž?"bh·{ Q7:“y*’@3„c‹ U;Ñcº€r].¢½&‚â¯ó<52IsÚ´2¯EÃ)ô¤¾ôÃ9ÖÓÛûž¢£*ÏTuA·ÇVÞÖÃô}G; ÈgýæÉpÌuÈ&¦r±e g ‚A¢ÅådjV†¡¸óB¦t2d:à\êöóbÔЉÐ'eð2ǰg6>.®5¡Ä_o5†^?0ßtì:*Eúgs©/§™… 4P˜;è"9ÈÍ8ÒLA€q“_:»êÅy!³DßfŽ“Ò{4–xÝ%X Ó ¢ƒ”Ò=ÁÛ:§b‚Л:òô»ÆÚ2Ž~ábQ(öÛNçab$é1¬3–i P4¸Â(àü0â®ÜuÄÄ8’ÙZdÏd§$æG›|Ì ×›JK$$%{ «‹Ê„y=²™eåo5 ^*ܨFÔÿ”Šüî&ù,Í4¦`Ž]³òwO>ê8LKTªNÍÞ¶&“8f‹£ðð:ðÜe¯¤зïuÜaL¿¿7§m¼Êdù>xÏ7*§Š¼“E;=økœŽ:?Õ¸C+z²Ý¿¹jF±+sg SúëŠ:1EyÖöî21Ñï"Q¬úÔŠ‹®ÜÂÆSè­‡/Câ¬Ð³¤gaèq\ßFôè€"É^àtnjrGOÛ¹)FÄ!Dß¼ª†¤YXv>ìû"¿NØŒÇé­#9“³êŽæÔŒ†”]ÜßS&¬)S×#D²a©RF-†ÊÅ ÂL:rÒj8Ê«±7kU/Ì¥6àÃuþÉ{ˆ#ŠFI€0 ²OtuRdÍ¢2l".õExEVÂ<³Ö}{Ò˜Êû?8óþÖÐ.«½m8+.}&¢$?‡Yã³sëÖRý¬ßHŸé~>÷ ;8 ã] GvΘªÂ‰Ü8Ú½wûéq,n}x8<Ö•ÂtšþÇÍb|ÓùLºi ®:Â2–›ÕHèþ¾3@åé&ŽÍOçÃj,êôfÓ·¿W9&™Ñ•_BÏpÙÄO¬åÔ°Œ©bý\2ŒÀ¾Ã3heKxŸæ*yÔi·H’zµ4kÁ»¬_ßó…·ˆz©t…+Á¿úUwg?rø ðT•Þ‹ÍÁ­®B¸B ñä©@‹'ÍÉþ²vÕÔ@ÃG5HâH#„EŽz¹…Ù?Œùmz'˜`£I8óΓÍLqb5ÖRÕtíD!g*äm`Rþ¡´twÖO@ 3u›[ š¯¨%¬í&SeÄ1Rª—lt‚žÑDé*ô×y„”)Mcű“ÝoÙ(ÕÞ¥cSEè}`3½ ØÏv¯çéÎz¸VÞå@eŠu‰²æz;{–=Qò!+QþÖ%³`ÙwODV„ÏŠÁA>¼•¼Y(M“Ã1¢Nõ v- ò»³Q ¤ÍÑb턯“Üð]Ò6ž>‹äÐîØ7gjá׎FÀCÞú@tQ%]{tÿZN<€0°Û1-™zCƒ2@œ @ÜÈk¶\†3¬â7œxpó¾Bâ™ñ‹÷Îø8ÚŒøMÓýpbs!ìxÿv1€ãÀqèÀ{oKÜO'Œ>D6P5ÿRü§â/ººêgü!¹ßãÀ1Å.XM% Z…ƒDÐQFõ̓¯¥F­…Bȧ­“©ÁÉߊzô¸Bòƒ5Äãí6[kѶä-ƒý†± sñN¢²w÷b[ZƒÌÞ)ªÜ^Isó~Píà —[Vušˆçd¥Î0q§úûuÙ á mæFñÿ‚Œ˜GزŸí99N8[MR/¬q—{!h°3Ð2æÍ¨”»AcȈ~¾ãâàRÍú"ì`¦ÅÇÒ‰üÌtÝåö-~XZ*²$‡Þ8DÏó Š9ð6È]ö—cidž-•|—€”ç kýóÑú÷œ»&]j|ê¼|sÑt}È>l³ŠìίÁw¤—¶ÃŸÅ¾t&lf›,5%$ð[e^ñÅ8L\ÅÆ,ü·‚´6!lŽjŸ³RäT"ν¥¡·Æx ôW>æEäoA3Þ›.â÷€„3«±\@¯O6¨As÷ O)N±9g[ãyœa¼™dp9LfÔ^,¨¡ÿÜO ÑáŸý ;ÚEô'¡4D¦IíBЄWÄÞ—69H¸X¹®%Z Ëæ(jÒjèú2tÿ.ȸ‡Ç¬ Ì[91!#Ñ”a´åFåÃðµ=ÑC6b1sìCgÏà] 1‰ôØWºûæ*®– ÙG语׷ϲÅ¿µ.ó7úðó@òÚMé˜Âÿ¥á–ØÇýtõèòòÖ»6"¿ >4¥ûÿ·EоAŸä?t}Çgw4â…gpÿtYyÑíÇîF}I‹~d4â„ö.(KA ÷@½ÕäÒ—û¯ÿúg\¸™C1"ÅΓ®™a ?Ù®½0%vR••ÇzddaþîbHvÚ9Õ#^£Óa¯mÚš–Ùäo¹%~S*ï­Œi% ùíw\A´*Î>¥E¼{Ù±KÄï!h»ŽG´t‘`àab!8»Á›Ëà‹ûNÜq¡­ ~2O\/hý(s½ “5\¿5% ¨>F×y<ÂãÐÈ)4Ñ’{2¥*dVbŠ{]ÖƒÙ Yõ`†HŒÄ4^ôÍŽàaÁãEË YF¨ÎLÑã49Ìýcèé9±#†+  ©ð„„ÑÕÅ&uð\îY¤Ÿ ÅâƒÇÉÍÌîBELìo²5~CÖjeËXA7#9­Éñ˜툵û{FÎÕ?èÜwÜQº*I#…ÏdˆíjÖ¾:ŠnŠì¤îÏ&^ ày6ë6R¤ÁÉIL0‡ª¯!ÉÏNí·¨û{.­YЏ§Ð¥0‰ÆÚ#ÀèÜ]DóKfP˜˜È8´Tm2>û%Ú碜2ÖÚq ŠÞà΀‰Êû@¥DÉ„°7l¶áÓ •÷dùØ‚Ž´SŒn‡÷~óÜh¶o„1ɦí+ŘØÏLø»/ŽQö×N?ûÎþþóÄêÖA.Jè^VÎ-4 ‚Y•¼2Têê¾<ˆôQ«…c’£í Ø#Ÿ±ó%aÎz«!éúìÜÌ‡Ì ½8äM@;+a#X&‰l&Å"†±¡7r¬ÙIôä’×AÍ“¡Gî&1Åç#¦)zS¢ÆŸ,`=ÞÎ[2ZAÁ/s6wãÌš2Ï¢Mu\JýLS†,£‚`ð0R%Q(Cîîiönu¸¤5=­n æ@@ M{äbõF.ð ®î~—g(¬8áÞ ‡¿jÏF'3ɨ‘üH_Ó*)òÄH˜¾ûÑÃEζ„#„#6Ï `³R€Y;C¾V÷ü‰&ÕÔÒ‚õz´øS ¢õn hî¾ÙÍ9qDr&Ú…gåÉ8éÈÀz¬‡à 9!‹mä?ƒißPÒ Í€4Hõ;‚¡¾¤ªMÓÆ/¡6~†¸gªaÉ—cáÅàF×Á—¼‰t~6îÍoZ´*<{°èÅHË5ŠÎŠ‚”Ý„|I‚RF-§cW)€Ã-ù%NiOp1;:pÛ¨_@ )Cÿ/¿‰¯sÑèΆÆ}†o ]i²YË ô ã:Œ-˜² Û;ó(>Þ}-Ab?3¤Á@Òÿëì=€£9NªI¬VD!7oÍ'1mš âòŸqÜ>Ôr¶‚ÛNž8!|Xlî',Â^/åõXb#ŠHÚ$gËöà$9׳;,Ódz8àˆo(?u 6cN2w·ó-¶‘döj¯TÏ·•‹–ìór,žÛLDD¼Ÿ˜xÒ)®[¨‹J‡+ a‘¤~Ò‡ä'ûÌÓ©²âx$;Ò¹l "š{å'¸ß/oÙüÒ¦)¾ñ§¿é.½,ÜÀ—y"ñÁ?à²Öý¦;²”Ö# Qv1MÜÜ=!}û‘¤ïSN6Pd'ê+ÛY‡ù|Ç›õç ‰* ëÌùÀêQ ­L§f¬Va Î5™³^®¶^Fª0£W|; 4”Óè2`ÏE¸c‰EŒ¾AÞ,)Î`s®ëÍ¥ckÍ\ ËõMfŸÓ¶_²ú#+p¡S‡ÉšK›ä˜+¿t×;¥ŽRgëêC€é©€ò¨´OD0xóN´ʧç~„:´„þŒ'[ca>K¤÷wfÚ$BñzhÈ¹ì ŠU.­Áüì3܆Tfš‚VÙ'[ý`6@æšu¹(\Š:5¡ d ‰¥‚¶½ÆFÝ\Xee±°X P€Dæ_*A*ÅO¯š'²0)¢ñõ$˃?q_vtI¢ —Xÿ†$oÞn3úÙª‰Z2vÅ‚ßî…‚wŸ{lÜXwàð‹Ÿ––FÑ‹ÚeR.ý0~ÒpƒW©;0e¦[˜‘±ùмÿÂX#eîú«”³EÛÀù޲%Êî@,$sö ŸT®Ç°^X)ây{sÈ̲ÌNp•G…¤KLZ›õ%]î@™úœ}|«4[R9­šÐSÁ¨ôxq‹3÷‹ûëDçË­¼°ÀûbþÐ>ÔëýK¾~(hxôN0r–L«nÈ$ÃÑ-õ® c¾Õ³pÂ~f’d˜¼xÈL< ^®P Ùüˆ %¥ª’ëùNÊH”“Ù”}Gdõ]—QzÝd¿a5Fe"¹=ÌgRcCÓÐc‰uGòü­#6?¨tÈqš*= ˜ÔΞz­{‘ò¡Ñ€ 4Ä%f%'&gpj…±`öT)ÐBû2؃ҘU^¯?˜;=§ßqâ¢@‡ÁŒ«¤¾ ðÃ1ÔŽîø,é0"*ƒs ªÍåÕIÁ¦˜à`qvm¥œc‡±¹Rê2>Õu0Üͺqlá5¸ÏiÆÁ¿wÔ·ÀLöçsö4ÀžÁëY¶mN"l|&:˜7õË{ŽÐw˜sÛTˆ0ŠPd“òæhÃÓêБª×­:kÇöï{œÄ„!NNjõÌì‚ÃÑ ÏhJ¶j¸òRÒkW–>£´ÒÁ qû,¦2SúwWéÐXF[t@-Õ1Õxm £ÃCâ`r²@•aºpMJà2uº‘fìÅȰ㠞̭S¹íçFaÊ7ý®D`–»‹[‘†¾©2&ÏÚã±Èï>2&Õ=52K¨# òÿÓ>ÅM¼Ëo(¾±Ñ¾øÌ¾tHîÙ~ƒ¹äié÷¯0þ÷•DòïZvƶíQÿ)Måÿ-ß¿u•~xYâ8ÐÚA8äë_„¬«ºÿÿüÓúaâó³5ο¯òFñ3·zäH¼”[°ªŽ½lH3´iÿÖØ\È»òÇ$æ4™DÅ*­ ÝNLœù³¡¼Ö2Äs(éw[žüü=zï¦X°êòqªA±þ&îZåãEϸ‡c6ÒÓº%Cœ?MV*Q•ŸÒKè­$«{`¯Xú ™ua.@¨Ø‚bÖ¨°·èž@â<£0>Ö·süÚðÓРˆl/2CÐà\/ʘ£þ0¼i]—#z&¥ä`Á3/D°Ùy‘„=$wNÉh¤æ~Ré°4ôÖëȤYÆÃòÁB¿¨>\š£BÂj}:g¢óly@Û/ã:„ˆåéþÜ$ê®­Ë>Ç0ÈÉÖÎæ‰ÙSö¦¥Œ×DWhb_*úxt¯ëe8Ò{èãè 8=Iÿ6l"›âµý_ñð½…Éóu'OͦÓî•3€]Yr¼õRo+Ïö’cÁ˜‹ê­ÖWú3ôZÆb_±d‚ûOúlÄ4 ÁE\wRøäÙfãÁ \¯yâæ¾h“ŠäCùˆ(bSbÊ —[r»‡á:=¾QäÚ¸Z°S†Q)!Ãn˜ælL çÐ=ääB6À¬žÇ@*Ô?þ|…ôþò¹H锯<Â_p’ªÏA» c=ͳ ^óg¬A2šÔ˜o²ùaq7œ²8 éw^KŒ~}Ä2ªS‰\¡qí¿`i)Á IcmÊ9<Ðt¬•?>(IåxÁ â ™qnŠûMp7è^fH¸x"°ªä“?hfÐTp¾qË/}yä!µó^ØvÍ)ÑbøSÐq훉-3éó´lÔgŒÛsDŸþØO/»ÒN¡ÕÛþŠôfRâ ýÿMãÅ™ ÙVc¢‰·É AªYH¢qj÷„¸ä¢š¶ ðãþTO FÅÜ»F_œšÅPÉ¡Çg1ÈahÍN(¿ý» á¼W[ªÏs^å) =‚µ*ŸµNñ–Ý‹ › Ê“| ¹”>®èõ U\róŸ³ËŠ‚0¶&Ùˆ²#Õ©MGü†H~Ä(ÿ¸°–!& ²ó–Í‘%MÛS#BöškÜ«ÂÏ¥ïË5œ²^~•“vŠ˜7&LpJ$ÐP‡Fuó­ñ5Z»¯À’lN‚IB·«6&¹ZçN²IP5 Cœk"zS3WLyŠèüWAãäâ`øn^Á8×¼þêMV ¢…¶ºãçGÚÉd-EQçÆÆDÚ»½‚àf»•/…›Æ7<+0÷“_xÿ%¿™lƒgä7h9d7-„.T®)fÍx´‚yKÝUÖ†5/N~¡‹fÎù¶OCŒ8#Ô>øž‚#°Q¤‹m!;ßó^²©þ.¬0¥Xm‚”LÃé°ÜÙËŠÒRNIÛ·](ˆ¼ö D Su8@‚ß³ÊY ùt]L?xç{)ï ÚX Múÿ·ìèD-|Cໟá{v7žN8|ŒÍO5«´¸+\ÞvAtQçâF¯þu‡[îA{³´£aî ²_—bë”i/§+3å¼£Wq¯N•ë¶„ò¡6ûx}JÇÿ¨UfÌý¡ärÍÎFã¶Ñ}åÛÕÿ1A‰ DPÃQœçDRh-é ×fì·ÐÞMT)d ¶R-¢Æ>oÊ)«ÖP;bÀ鋟?FK¤‰PìŠÒµ°8ï^ÔQiK;FwM sÚ¡úøe‹©™‘zQ”é³£hôŠ{k6éߤ·7íÍ,<;.›m,À#èÿ‹ãN!ç¶Ÿ’Ô;ô°d½c.à¦7¸Øä¡Ý”ÓYNŠ˜»$ü#0û&feo¥©Ì³ãfHTk)‹¯Ÿ7¿•!ÄnÀ¶ŠŽðׂdï¯êŸ<©Ù’ +ÚÙ²¯ìÆŠ Nˆ#þǬ2eöv&ºïµ ÿfÑy:e9™ÆïƒªùÑ……¾ò›hö§‘l >zÆo|ý~fÓ&ó°­G>2İÏT÷ÌÆY †Ÿ–ù&ç@1wM#¬ÐôÅМ˜ÒÈF&éAËnû s/€˜–ÑGÛíîÇ”HZvlÇ ÒœÏÔ›Ïßp‚,éƒôè‡ÀÈ`wtÖ}Îé嬤³.v$†ƒƒš2af²hù¹¥³gÞÝ|°eòU=Y&Ú1ÊŸæ$äw&„*´•+Qó¥ß[Ö‡m•·ºp§˜ šdÔêAi8™¤Õ0BAôV½×ûÌNB‘:†Œ…Ù"†24’ÛÐä†+)ò#9ñ0dÀŠX´pŸZq™0qý÷õoàÝûèq*˜Å鲩†‘bõÙ&¯ÀéþؼóG«Êhz¢ÿ*’îü­¯^‡á’¿M€ }uMæ/^Ü\Sr_“íí š!Ö~àH¼Ehc²»eŠ+$h¶(L€ºJ¬S¼ºC¸à«Sƒ‰K<PLÐ<©¢ÝƒUÇܘBÞˆ'ñÑu6KÞMX‰å­Ž#¿k׿W‹ìè4`’J’‡õ¶• ¥kfyºáê{WfAPLǵ†.Ò<õÀ¯Á‹¹3|O(T oú+î­µ£CùGÃÅ`kaP»ûÆ…ü®h§œ+³=’Âq†»nÜ`ešç£J"<Ù†âÅ…4s˜£Yy'*€¢)'ÚÆp ãT5;潚GWT ä8½>*ìÉ2mu_š#}|AÉÓ5)Ü‘¤¹‰A¸nÖÊ ™4åCð˜&Æ£7œKÑhò\}Â2·èö\Ó8ÉEeÈlÇ©YÄõl¾ƒž¼Cx„Kk¸2ßBvP œ÷02^MÚ9ÞÕFõ§/1}zJ¦2/8@–°L~-º×¢–ˆ9ÿÊ¿ÉPûÇ )A€QÂôåò‹irœ²SYú×w9dþÖi…27ž§zãè”ØÖH‘/3Œèi® ?~Ðø•6WqüÀõÇœEþŽfüW?&Þý.ÆØíw>±ÚÖbôfW§º}#2Í‘‘u ¿öíê‰Í"k;ôB¦î7[1;$o©`*žI{°Ïóp•k׌jUŸÒ·q±wÖÈ÷Ìéãm­ý³U„¨¥H_Wc/L;˜Á¬R´ïaF.Çä7›§|{çâ«×¾Sž§g×ÛÄÓ—g¶Q˜ìe{h/ÍdÜnB<Ë5Á—ðN@Î!ŠÓ]ƒT]ÊÃÅ·¡¿ÎÈÑ'q@k,˜!4:¿r𢕽Aytð®ggS©eík\­¯ ­˜‚”–3Dæ`–é‹#L@;6ݦlɹÞ-ÆBµ5íÂÏÓŠ’ÏE |Ù›dÄÛ]f^£4Fˆ6¥µŽ¡)tUŸÍ*cP‰ì,¡ ‡% ûÓee:§Š4½L†!]…î݆a6u ¦GV¸£¥Ï,´‹h[¾Ú¸eÚ>ðÚ?ÛA~Êú;$ êÚtŒr 4¢Ë®9Ÿad‹Ëü°8UÈâ´jkÔÎܲ-EÝ› ¸RÓyuOôÿdkgð0¦ôýS¬ 9‘-HS‹c•K`Và;ð¡ªϵÒKI»EmAᄐ߱|x¢ý1jEõ[~~|¼Bt(‚P4ÌñÍ[Eu&†"ÿP«å°*Ò7?]Tåôg9'Ì<6r ±2XhžâóNr»Xöi°ÒOšF*ÜÎröωìV§Ö¡ÈZÃîÉpßRZ“ÒT>®ôfü’XI$2ÜP»š¨ã€$‰4VeLt*uØKx>ÓO€þæ‚"½¦7Å1ï3ÓlÑì ªxbð†ä±>6qlNµ£óׯ qéé²á$;è=øA€Ê¢ÿó´ /I®ß: ã*äÞùAÃaŸ$à ïn:ÞEE'ñúð |‡`ÿƒíþÓÕëCD¾U†¥w+ß3=ÝfÆ2¢g‹…t"’›M0¢Z M#B4ðÃØ·Gxº=ôOn}@T©ŒzØ÷÷™¡V~¡ÿœ°ùè€ã‰"·G‰ XAŠü&Y„¯Áld’ç]»N›48NqeNü»ªŒ{¢åKNºljyqgØ`Mº “)3^œ°ìÞÖÿ"“¾¿“ Ú‹S¶Dð6ßmq³x~ y˜76ë)2`Ep’m9Õ9T4æÉ¡£=ÀÂA‡Ìu à`>«æ‚µþ‹˜ ÇÝîÍ"ÅÌH„o•ˆZBa|²½žŒ¦äñER†ö³%Ì«¦{èÚ@°7Š*kúÚ™‰§ÃèÖw\Óöš¦¼IkÆbÄ«ÃX« ká±x*‰„íT¦GlŸÜœ’+1Ž^VŒ‰ë.ô;FÁMO0p´¯_$æèR—ã¿~ø<ÃØäµÿŽ×Û…wkÔ3ÕÀ{€a;9}·/¸ÿ¥”séÿ Ñ´.¡výŒ1‘¶«U€ºöñëÎKÚÌ4e{Ørü#ðRøø/Ž¡Þ#ÑšÍZ47s¿¡\B„sÙµFÂc¥‰‘ä^*ãÆ\ýlhN¬¯Ø³Þæí.”#§ùÁ`›Ãϰ­r“f¶ÊØ]L÷ºpÈ9ûwM¯[öOÍL7¢â“CÞh„Žgyâ Wþm8‡ù0ê{-Œ¨1þ‘¡žíµ!+£QÚßÁ/—šX§a÷i^0jµðÊ$¹‹_VÚÜMœE±ªV"—Z½Œ»zîWO«?ëšš5–Å ·FÜýÅ7I¡Bð+_¦è¢§¿•WW˜Š"ŸwRþµ‘‰û«}ÃJ9œ€Òó'õ“Âû91¿c+Æ5>?ùhíªHˆþ!e7³¦kµ’ûoU(гb‚;ãÃÛ3FsV·'ñˆD1˜–·IO>8]7ìx"}íñFÃËÀ±6ŽLÎ¸ÓØ·¨óA‡Ÿºp™ÉŸXB“hæ¢BŸÃO—åB‰îÆ (Wú*hâð85¨æ_oå«¿þÒ/…:ns.¤çlðäüN+$,úL(?¨Û„mg²wð±eø´••ˆU·´ »vŒŠâ ’­M h¹I½Ïcp?¸*94ƒèFí$'s¤YÛ÷™ašd茻VC)…õ·2Ï"n2¥K¢)&‚†o²^¸V³wŸ˜˜•°Ú¹÷WÂlÎ‡Ø»Š§æ%;ÿ„Êš;|Ä{\†iCf˜³VÚS°8ê–äl‹ÑƒÌ< ˜#à × pÔ½ ðýê8ªcŒ!ŠÇO0ÕV/´ô¹ ¬ä|ÇIñsÉæRP¨ƒé½êúœu–Áá/ÑGàldŠ÷ÀKà¾h¸œÈ1·›Lï©zMÐs)#µùA‘´”¦’Eü€CÄ!È=ÑÅ”ˆcÒóü4å6À8Sàé2j€j5\#-ÂÌùÒ¢R!a´œí çœÜè/B33)@­ïwö78»Ì^ºH?¬\O8£u¿´—Ë3açFÜ„«@ŒÂä+t nË…j‚Mõ,OMõ.Íç]97é)CL¯çÃÆÁϫΥ±§Ðï‹ÁxœZbXà€«ò©9©.!f·ïȶz÷#ÿqÀÉ(!’N±ý.»àþxAZÓÙN†m<:' 7:ƒNK(¤™©w²o“%X6ÓÖ¹‡z‘LÅ«GãjàIèfÖÆÚ´©õj¢jÍgÐ( µ”v —eÍ0õé LÊÉ`yì1ÚØ»½~+V½7+¨‘—_²æ--^VZLé>}þÔpû}U½o…‚:ë#gê»bF­^lÍFýÔz ›ž}'y÷-²‘XôNÒ­cSÉi«@½j ¤ÚDšê„1Ê;P$õ™ÿ!ºùМ#4lëóÄ5šATE½ÍE§zeúó´2„¦.C~Çâ]W¢¤r’ÓìÚ=` ì©8mšh&Q™Æ Û{¦ñµz•9#Š£Üªæ‰zÌ´_i2­üf¬Ì{få%%CÎb@šP5c;U:ùSEçaÂlD÷ÔûâhÿÎåh؆ÅÅÂÐð1Àºåˆc¯ÑrsïŸ}eÓid¬»†¶¸Eo"øp 1ïHT}¹ñü¬N r«ÍB9+#[œÊ?™ ³ÌàAAö+k@!l+nü¢»SB<è[ÀÙ«§©±á'3²3YÂD¤ýÞÏÅÄf—¦>v™"uK˜Nè/—VNçüÀÙ·dŠÇõ¥ŽÆ­¨2¢T,0û3õ!Ôn0)èÔµG§›«¥÷ÂÂÊmâ%Ÿž‘4ÔðY×Ñ ›ÌÔe$íNþÙ™k¾8±tÜ葊Ð55:!éÖ73˜0": R³ "Uô/0URFRq9 *·ÇW1ød ÿ}ý„6¤?gh4îÁø_èpl7Ad®Î[:tï‘·šT!·B2 ræ—êÏ×8Tó`¬Fc?.~ܤgèŠ.²9Ox$Ž^ƒÓd¦éóK´ø%’íŸåÔ´Ð}OWÛhØV-k4_ÕaˆÊÃ;“äé7t>×móe'l…ŠOæF8˜ºýãrƜѪgac§À`®ÊôI~(_@‚̵éVbæÁåQâXßÉ}Á”ÚŸz‰iû à‘!r2¨~áݫ݆¸ñ6l·óÓo\ä^h){6‚’z‚i¬<¾ü á7[Û+“ùèüÂÀ-ú«¾>±¹K²÷´÷îðo<P†ˆµÿ·?·¤¯°õ¼*cã~ãÀ›7ü;oÚŽú) iµ@€ç™^ý¾…S ÚŒ1@£;¿Èàcúöݱëø\ŧž Bëm¦sò_’†iwô):óü­Q ¹þä`Xnàç̧SìÝü©Ü^¨ªgg!-%S¹ˆ²' $ŸÐêgº`Ã"M{Ó8±,g-|2ö!‚c„ªêÞ.(o„ÁôCß><¸×·èV¾O Bk-Oº‡ÚèÜ_¼vÙûŠ[IÁõðÁLèH倈¨¶ Rj}fÈ´È£oÓn( ‚ÀјšT´÷Þc›Èžܳ¿“œë •µÜ3¦‘gØ:BS¬Œ/ËÏFôQL™h™Ë—±é˶yP»åñ ,Ö ™œ¤ª ߘbæ‚õ´Š y´ÖÈ3 J:Ÿ-˜€[9öè›è#¬rˆ¨ÉNs;PçX_Ú/Z&[é@3'Ǽ“^ºÂÎ ,#wmãj¨ …á8îL_}ç~ÄÅóõÓäˆjÂÒ.•ÁN‹žcC¾æzýämúð^÷W²üyPEüs¹ýq9·ÿ«ë-âvCV–21Ìš¡žp¶? …iŸŽyŒmvBjò÷“!Ycªì'¬è1âkeüjóCL†'æºÍ9i“\î|½;s$Õ ›x„¨ãõt%  Ì0äE¯¡+ž/±è%“ H.ò|›f¢µš”iÓCn$a2¸jHɳm“°J²µÆ}’pO!•½³5&Ot‘)ñ{UV©ÝÈ1–´IY¥!.ꯔtCrðg±ëâ›n|ÆÃ÷+ùý«/âð'?ÂCØøµðÎ'±˜áŒÜ¹‡îf>º`,,,?ñ|[=òÆ3=DË©,C¼÷hY”š¶¤Mž+¶Q|>í¯ôÊô|3“ Nêøcz÷¯E_ÞQ$€ÊÇr~"ëíà¶Md2 f#Ê€ª@댅×Ù¶Ù÷´;Çé Åêg®èüf¤°O’Ïä›m7¯0òå|7£­â ¿¸2€5Ñ m~=Kï'#M O½п¯_ûõû9›ŒõsÔËïìÄGÏ­Qö“—­ïŸa…5‚õ¿6<å¶96Ô$4\]ç°‚]¡i ØjŒÁ2%‘ôÔ ©LÖ u³¡ Ή4ç¾3§Ð¨Zûf&b¨Þ»® ¢Èõlq‰FMüžsèyÚ9¨Ô$Ô£»7˜¡=ଆ„6Y¡^éFÑi¾ XߺÏCÎe[Ub˜^[‡»ñ„e<4RY£W#]ñ©ð¬mì~í âc¦>^/&,ó¯\º÷½–ÝÐþoÞræ”\âGphõÔ[gsÞÍC/eè«ê‘GçÄÉ^Ä—¼z\4; µ°†9¶"ö0¥Êô;kÏ3*~4gBQÒz#GÉÌ;%".£q´wqU¿ÅpKÅaBgC9µ÷|Þô‘TM/Cˆ‹x¨œÓZ[¨Ê¤ÚD 1b,óSЀU¢Bkiµ;ößÚ¶ò#ž+âŠà7¿ßª”pî°IR¥×Õ+Ó—öc5±D“—NöhZ^ß/fˆšžýÍ hVzxè[˜›cñˆº«B‡€ØŠÌÙš9H±whÍÌû^çÝÑîÀçt6xê‘ÖsÔ‹Âqê±ù˜‹7WJLA"ÙGE].ê6ÕãŽÇî":¿AÜCI5¥C+ÁFoª®Â&$4’WxëpÙ9q€Ç]”êæªhüpÃeN¢ãê#I~ÐLaÚ`g:ÙzmìÝMÓßàêGiíÌlM .‰ž^D{çÙCcR°xObw ™:nND5€‘q`XÔ„6§ ù-º¡s0¶™þ'43ìÈw0ämÛÜ D£'F¶\Ü.wb@ºèŠÛú‚Ù¢•ï%­Ö•ß?Ah f í¯è2‘J°j¼óii&‹2ù.@Þh9&ŒÔ.€VÖ”ÁÅ’¦;@#Já ¿tŸ þ6‚¯Wr¢×ÍŸ¬öóÏ å³7m»—÷ö“æV¸[×»©`åb´vB¿FT½µLëÌü«ÙŒD¢]yý‚†x¢_íjvJËÓÌæä‰ÿ«Åƒ¬9R­Óž[ãß­BN£‘E›"ö‚ ˜™7ç€Â@¶mó&A„´acNS¦^6ËZ¦×Ó†Ù8p%ÃÎVM´STÊŸ¡é^¾ `»Kr]7˜-±Šs/x ÐÇbEÓérKÄÂúMñ•5ãi,(ÒÝI£áž566˜½s£ž€¨ŽÏ½lošö46bÖц_ t¬1 àß´#Û®‡!Ò]$óE]ÜÃÎ-ݤ¨Wû’Í ù>o¢f­…CÆ¢R¸½…¦žM%Ör…âlÜ÷«|çoÉ>’`FVý» ìØ,¹½ûk6®ù“èóí3ølõ¾×Ëùøªø)þÌü Ö¿ý¸~êÀ¢g𑇒áÈ©5æã p³ÙÖKÅ׌Ï|gMpíÑž4Ή¶Žâ–™YaßèÒ´icÖû‘ ­Dew'¢×Àm0Ìå—–)¬Jwв<³ O2¹~Áåò‡’o±ûOó9Âà=־ᣉè¼RÁn»#O'–ÆîŽð-ùИ+úQÿÿ6ÞóÃÝ6!¥ÁÞXä®”—Ðû(w¬Ø·‡àò'Â*°œ¡ŒÁb«ÈÞîΦK¤ÕV 6Ó¼¶Ã“9KšIWÕÉÛIöÛ͛ӂ°‘Äd?£—v‚xÀ`»ô=šôâÆ#n6“û뜜ü¹ÈÁÌ> 2êÜY7Áô–¡¨TÍ[“º•3‹eƒ»M[Y³½(¨ºØh PóîŒÔ‚ïð¯Yß×m˜œ:ªŒŽÿEÕìýWŽ@qq~°›R¼õ6¾éŽeèÿã3ó«éNi2ñÆu¾)ú? Rpù…$bÇcû—èÉ xó½)¥¾Ž¾NãG„éñpkâä.wü 'iž´þY¢ó7/¨Ý ›bÆù^ä××Ç.,ÆBØí³£‹![…7·u#³L[¿ø®(Ç{®ß¾¿û=þåxåƒeµ‘¿1ðšúÛi8½Nþº÷•`y¼ÑžŸê=ɈCÒ î @Üþ° ðÐA=HÔ³€éµà:ø1˜ó.œÈ–3ÖÔ3AõWF~ìzè. Ð(Æè gS±·#¦.­è4-§oþÐ|{#eÄ Ôõœéû‰£Ø4拘ŒÎ –ާ™«×tæ:JBÚ IH"ä +Ò ÀØYEžõ˜VœÑUÈ8Rpˆ¡PÜÉtM¹Ó.gò‰ž”wH<ØNϱ¿š¤Ï²iØív«VÙcáÎðY¿ùáÞŸá…¹¸”nô“Ë#¥æ=d¶éÓöºÞc&á†Þ+bŒÉÓ>¦àʉÐZMj3]7ó áÉ~oL«›ô?Ûz÷ ê“ClŽç?ÍÍ’9Öõ}hµßš™SÀ@þÑÅÙ{R×rTØ€IØcZѹ«³l˜AÎ(j‘´dâæš¿˜ï¯604glœÙqB¿“È‘Db§ÓÁC9³Sô0UK¼ÙÆî—tÐèGÁD½›¡mÊ7$ó»“GY¦G3-‚ÓšÓþvkdmsøs‚p&©K‡7ËÖ´kÌŸ’cXs6îÆjጵ¬FÚ7ŸíÝM‹Ñ@‘3Q”61ÜÔ$Y ,逳”´&HÏEÿ æk…1aB´áöÂf1Ld_Üp³æ¤©Ø/Üȹ7ó³¾ÕîMDÀÂâQ¢gýÄñ¤Ó¯*YÄ=¸ób· $S…òJÎe­†_ÜUÍ}«¥½\ò.)-Ú)_UÂ; ‰!³Â¹ë¡¥Vå-ÎzV(˜ó½ßX¥ñ³÷‹u#M›É‹aI¥(LS{fÄï59šw™$‹C„j0Î ó‰5›Ó"tJšèG4èiu¼XEû63Ä1–ÿ7®úú‰ü0º7+R? <Ò•N&¢RYD’€³t •WW³d¢I+/Ëìë) šLŸCž{›]µ¨ÜÓ£-Ò»®Šè|+T>xÉ7£H‘§WÃN§ÙˆÙØP ™$žA~b ¼?D$³Ž‚;d-†ÕÈo4îÙiÀC.ûÜ$§Öæ_Ï|kuÇŒoÁ¾N`̼#Td4Œ¿ÖÔÂý?Ѳ3êÏ62|¥#ù}ÚD @ˆ.Ã|”¸'âúŸ´aGÑb€Áÿ祽m†yñ6 ¦O™M¿CD»/¥¼2å ¤OùD¤—Ê!™‚ß\º&1‡„'51óD -Ñ[ð;•‰ ÷#Àº_n‡ð7`‹süT$XÇu&‡Õ¦åHe$éEìà¿ÌiI,>*—‡ #Û4J4uõ žžãæcÔj‘‹WhíþÑ`šÿwÙP:6Çq B±]A¹ŸÙ>ÑEWÒ?¥HP8›s<VOÄ] Ì8*\Ï£G+‚˜dSÍ6%`oÇÛÄ¡¶SÙüsiž×?B?bÈÕö Vr:Mékl3ca|dZ7,rêe¥ÉÎXÞyó³Msx"Ö1/yÑÑu>^²¿-˜ù2·ÇË÷ì4±­…,™¢´Ñ:Õ@ÒqÕ!ιΙ½ʼ]§ñÓÞV)} ¾K 9à°>ˆ_K®ð²]5Q§Ê5a«8Ì^ˆ2/›Ô¸—>Ì(Á‹ 7+@+m:>s7KÐêWŒLr 8•-‰ÞM=KÙÙÓ ³vy(¬ý< Èåêx“½ ºXra‚À:Õ0»7OÚvŸŸäÞtè–H×û öw#ñŽÈõgdiÎ>GÔ_K-áæ3ðVP—ÓÙ2üý[eR? ãºc«÷¬¨µì%lhbpHýÅ ñjÕ4Váfg ö¸s¡ëý£ ŒŸdìT‘j·¡£O‚>]0'0§§é´à¤©q©/ÐÅVyDÉiœ àx5±|ëGº&¼vSúL¥pó=9K¨¢S~WÀÄ€‰>lMËTC‹Ƕ¦,°”e»4ÇJ‹‰ŠÀÞŠt‰eQâÌJg› 6|ë sw¢èÂíþzMfyÕûç^ääÇÂ9Éàñ¹c$ã¾÷úï•›¢u̲ßÕo-5ŒÂ»ñ“x¦>ø÷|í4‡~¾_Ó¿¯?åËá¶$ÝJÏ]¦¿Uoçw~"STçw¾߈î>«ºþ‚UÂÛŽÂOqY-ü'Ñ):ß>½Ôo=Y²,óïœN’ÅÝåQòlja±}Ü™ôã'?­¼ÞG·¦Á=~~Ð'¤¿ä mLüþóàFŸ.ãõFmÇò`33¹õ ðë0m˜§ØÐín>D˜ilŽ‘o5‰¬®t@›5 p~>sBêúþqD®"9Êñ§æÿ BÞl™oáe@‹Žo[U\CÖ[Iü£1œ Œ©ÌY®ò–¨ÃŒ0ŒÌ‘éo§tôý/â Rõ-—ÖöèUnë.ÖhD†Õܯ3@¤Û1þ2-î?4éé“BiÈž²(Ù‚sT«ØÓ¬r§Š:Í®õÒ/¢·ÃØgî§X~k­µóäìS_r9âŸE?É6ñ4Æ_v™®×–nníïÎ\ IÜ['§ÅŒ¶Ú6§%ãÃÕnSpN]¶S0v˜Y«ŽÈ_×p¼f¬ÚäþO¡›É“Ÿè0†<™a€ÛÇçexÂij]G^º?W/ôº|JËßœrýoÇ‚@t°mð´(w€Á_Î@ìþß¼ó¥§að%g@2«f>Å<îLWlFïTnùÕq“0"Ð¥*2 >';ú0 tbIbâ°J}ïkö‡Œ-BäAÀHr0ê>£3Is¾Ö]‡ãR[Âå#Ò}Ž`aÂú4è™+&¤`]B)£FÚ¡ çqmFbÒ”³7ØÀ ‹ÊE˜²”@Ù Ï !½oÉÔ©7‰ƒ5Š0§S\Ppƒ¿ÐŠG#õ”¶ÃãÆ±"Xƒ[×ã!ïä~ çañŒÕ”¬nÁÂ=ùw‡ë© ô[uå*ßH4ýY;I6Ñ.)`™°”ÁÊ¢K %ì>ª²ÅãLò²ëR"@¦çîpØ`Â)© Ê óVŒŸ}ŠG#ãEm»Ì\|Ëâ2~3ez¦òGŠ8·Rø(%%ïòÈÛ’wïFœSpúJ' ŸüpC¶ÅK»NÜú_)Ü> ׺җUöIhìÅÅiP.ÜÒÓÕo:lki V[¡êS@sîóš<²{] îš(Ð\œ!“ÁbfâõjõÊŽr§yÜ);^²¤§ÞgÊ6É}“¹…[Ñ?‘œœOqdœscmªåY¹5SZ¹¤0ÈÞÂh9&¥áCÀwH_ÑÒM­ì¡ž¼K¯òT½CÞþ Ñyõx€Ÿ8ÅCŸ!E5áq¯gJæ³ÁÌÒ¼Y”g§X¹œÆ k÷f²ãË.t åöB—kÏ!rQ‹•þuìþwýwvŠª—¹àÜEªý•žCDTß’yÒ·?7gˆßŽu{%ÁK°â+ý’u©cÿ?­ÚƒT9²0(4 KÁmÊEö~ƒÏCÜä =³»Ü.ýwèkïT7„J›Ôpkˆ.;ä5¬ò;æ›…× BÂÍ0ý—øj^Èë,2ðøÈaÏ“ ~ü~VßoóÍö>#ë6-íbsêàæ­\`#×[eºO¿x!TӈȚ–nV`5ë Éa.ÎÃi3:‘2æ”|„ŽÐ8«¬l<œv̲§ñš™2¤+JxõR©Ù`#óÝÁÿ.µÁ¾êU6烞ùÔk À˜r;ódšexÉPS¸Öt&Tê<˜ z‡¶d‡8uI’ª±moS³böCôMN«¼i°šÎçªq›Ÿb˜óáØÉÊ!S._²Œ&O[Šb¡Q;ï¡s++¼;\¦}çu48† qVœÐkRz9l«Fh¶:í`T ,—C(ý¦íxÑN@0ãÈlI‘eͪV…Âhv`[SoÕÀâlÉŸÒÛ^åÿFÇüF­=7ŸB"%3a 4¨L?$îÁFLËóûÇíÅ5>K |“™U髱ôÚ}§¶Òðk´§œ†Î}‹ö™t›§Ë¢Ç×´}ªÏ[<#~|1,PžÉùÊ cc«ìJ}¹8êÿ,Dx6Û¶…„€"%?_iÿ¬Áǧ7D?ijÔœ˜ÿŠ’oío÷ºß ÉÇlQ }ÆÓdÁâ„–’‘V¿«§Û&ìžQ—WçðVa7£¤Á&@Šš…@·.oÚâ <Ÿ6:’Á˜o½ÕÖæ1N13ÿúö‘–?Mth™ŠÑù!)» †v7‘dèªò]›¡û+ÉÕO‚ùá&™”‰“á¢"ÿÀ0œgÖ‰ol×h¾qC§˜Ðñ[+üÇìÁú˜ëxþ¦ ì^œÛôcŽ_·Öj_¾èeÙÒÌ³Æ®Š©Aoܦ̒Ἢb':Gõf¾WÓ§m!ú׿^k_£A‰ÎZTje^Ï*ôqI9ÐcÌÝŽ¦“åi$g ’ÝÑáý!S0œi¦xÍOs‘_cÊn4fž¥ “ÊÃ4“ý£7 W° «vK&3®\|,$)0c<òÕ±ÒÉd-“~Áj‰§G㿯P{,ÏÌí&‡Çz9­]0~ÚëàƒŸè ÆÌÁögJ•¡1ä¶MCXÓš©JIJ)Õ’9¯ äH»ÃòsãU£MéÁ˜º¤ ^~%l¦›É¸<&Åàkü!ØÏé¸ÒÑ&ÝýJÍ•bî”Öòz@-/®9'gšÓzÑ¢ºÆRr^·Ю"gE`—ü;8 ÀÇÁJZq8ÛHܶ\[‹ªÄà,›VȦÈ7\/ˆÜª=å)x|¨áºSƒ0ì8ÆrƒÝ⽘øh›@ŸýãFy7—éñFâ¾Ûêüêø%—n"ŸBêТ­ÐöO//çû'Þ·gÇPÑ­WÍÿr‘_Xá? øøU_ßjðɬÿ6ô¿¯¿3µö=G俯ÿjÐ~ç—ÎïY™WxþæþØ«û¶† ŸVFC×ß¿À/?½LU“Xÿà‹*Ðëß®nÕù€™¶?ý¡8ð¹ªRÒ¦lBFûCó–R§ùvMßaúy˜áaƒ®‡ þ%ŒC~‘sD·9à¦cCDy´„\é^Јܰ95\¶ÖN:Ȱò Íð 5ºjçõ;\GØ I]F vÙ;mE‡šÂlaÉõ:×ÀˆvàœFsat“S ž×|™irf^´S±Ý¯IòµÝIy‘²Í1íâx8˜¨À#f¿—)уF)£$˜è„,¡bÜ@ýDV2¥·µ#Û±ÞØÍšæ9“ù†óB‹˜¶4Ñç5ø‚Aµóò…éüX@Nu‚Gz€gk‡6ô»jšDЉ^‹Í‰¹;#³!ðJú³8ÍžÇ4˜ÁÙŽ9õÙ²Ùvû×›ŽvmVvÑ“ù”yñö}üçì© ËÉù‹ËAÀÉœïÒ@×f?m Nø¡§Òud ·}ì¡@~g$éj‹œ¼Bã`E2”ºžäÅ{nîüN-{ ›–¿ÜèY0•º9›îÀöžP¹à\FåH9ù,+må²þºÚ937‰„̆F‹–ø0^')}jP2ºüˆsÿ‰}$ês2ŽÕ)áÓÖ #Ž:m0£ÝB÷Ìs`•ÿXóP< ¹û¤®¿¸…òGˆÎ;iG߸ÍÉ"i$ ßúVN§†ËÃ%‘õ`'mV௧˜/adç ³ :Ð\ÝhÐÉMˆ8 !ÓªEÈâ¥M,2²vÑ\b\ÍηêwÃ.[0´í€Œìc:1}ûFçÕÇÖ áAïO¥“>moÿs¿pƒü|ª?µÅ?q´õ6µÅ¡~oiá¤×^•(V·3ÏHU^¦ÕõÃøs4#ÿN/6á0`£Tû©‹p+mzî¶SŸ‡€˜˜_2¥–ÊŸüºƒkõVžIûZ_| ê¯Ç¡ž"£Fïlâ*z©‚yºT)2Ò=M•úÇJäáæÖ'¹ßšaŒùlŒ±Y³;ÜÉ–/æRJ(úñ—ÔbæI0·`TÚ*K¢ý êÌk›lƒ±\¿a`Ž6×mÎ -PðØÒY×.åÔÙU}!{°PÜ5ÂM¦EfŸ?nô–'=ŒËâ”n+þ`5F³«6"±rOX¡Hš•J™ÅD‚ªÆüóU]Ħ ¾^·—Õ£OÕU Êo>ŒcÑpŸåÂÜó,Ç §E†TÔf˵5 Ì^†uÉ]iGž¥×™ ¦¦g’d§ÖfjyÃδÂõÓ˜kZ¸â6Ó ›?Êàφaþ0d³`Lk¢È~V5?9ô÷ó–´²GÀDå à´e2{‹^ä\æ2H=n› •qÈ3Dy#·["/îÕÈLù)ަÀý¾†[“} d¯á#ÁÔMÃq\í04Úx)¸Y%¹é#¥K|[@€¹†ñÿì]ۂ㸎#²ýÿ|Œ}°%Ér*Õ·éÚÙ9=ÕUIlK ‚@XQR;ž*ÿ 4Îu ÝTãPûQžÏ¡ÓNÕ‘’–J¬j`wBæ´û@¬Ä]_/×û%¼(|'À†€>+î]©ý?í ŒØ[2j¾Bÿ)FN°®çẾýBÍU QJ¾2Ÿò9Ìö*ÊA&z4|çü»Dç7ê±øáǧ+Õ£±b‡JBZ‡ýlô;Î`}¯Út2âÕM’²eूãžÌcä‰4‘[81âX,׆h“_YÒx±b>ZT˜¹*Ô(h€ÿ¸¨çõ‘áÍx~E’°r!ª=´Ó˜[´ª]ψÂ2¤3¾µfÞ¯p³3†žks ߌf‡)á¨*r»NòË-ЀÍQ"GåOªú(¢ƒøtQÃ;óµ(ÂZ(ò ‡ž/¸§9#ßF:æ«keèÁ«È–ÕJÓà´€ˆ£Yeé¹8„|†>x[qódê1ÍÜdi[R¸ÿ¾þ´FƬyJNi9_\|÷Óèω¶Ënöw‘ñnMåçý ××ì¥in¤Ñ5k/Ž"¢dœy¡X$.ÂAÓnßWô·Þf}ùÏØüuÙqc׉ðÂлõxèÝÙô¬TSé{-zÙiϯ×ù›/)š»Ý ä»ËÅãéJsx-,TtœÕY§Ã¹ x‰ú?>¹u¸µÙ+šwöslåâ ¦ò~Ÿ=S¸a°¤õÔÞ«”ø5P9À-ù¼[Xr"±ª¾c±Oì¿*fEùí;}' ¸c§þ¿Š þË À ÇéÿLò‰úÿïð~áçüîÐ,ó(Ü—ôÿ͘­ v”æï(^«Øòü<Øþþçï Rm„D´èùóâöÆÅçÉì5ßÄ,Õ_ùBÌ/êÇ·ì¼,\å“í vÞ²bUlÄëw—¾j¶”õ×ô±yï° ÊÑT—±)w»Ko=¯ö0›ÄN&5ùëŽÉ Í•¼îµÎGÍyÔί¹3Ä Jµrè=Ó—!~v1‚XÖšh‹¦-tÿ‚CýºNô3†XQj ©˜=YÄ‹|+-_?3õl†˜ca´ÎÀ ¹NÐ.}hذä”6 ”¦ën=ªv¸j¿)hE7 ¨Òç*Œ+Ü­L?¨ägú_nxŸ û:  =M£³FˆÂAÓ§Öb®êÞŠƒ™Ùq¨˜}¹ 'š]ôG{Yµýb@¶Å=/ÎCÒúÖé‚<ðÂ׆a¦ õ±£÷ð\ÞG”Õ’q¡HáQ`+f } DÏáï%’\’¬¯½E†èˆ9»’Îòo®\ ímÓC8ÑŒ­ŽâaPšÓPñ´Ý+¸½^æävÌëá4=¨4Œ ¬«½bžéd§P{¢må“ÏŽá«DŒÆüΠТm¶!ÓhÁÆ„çmêÚLÑlsëÒë…EÁ»Àâ']uìâäÒN¿^7^‘rÎ>'Ÿ¶ÍY#œ7ýœ·(„œœ(^nfë˜%Ò¾.Ô±M t•îãÀ¡’5þŽƒÒŸg*#¢Úýù߯ñyÚ­?b 5 \Ä\ráƒ{f%¢†¹ƒqèE<„È&On˜ÿÆÕîvÖDw¥‰ŸšŒg|B€j¤Ý_¿ËzÀ_i¡ 2iÄÕtõBVe2Îèg°jŽ ÿe¤ƒÊþaêgb.öõzlCVÏ;| ¦æsÎx=c"g´f'°¿·ƒ{Z‡¶(ÆSIã©r¾áð6'J±wâ$'Ë”“÷DøßÂQ0n3†„†&†rÚ”öÌõÙ9å€Ï}IαýóC ð‡ONµ´"ŸåI5•H«g:Gö;»§iF@ãÐ^d’L° §¹']QD[ô°KrX˜~)vND¯%ª=NðXIÿc’öÌ{̬i~«W‹ŸÁ3¿Pàf`ÞL:«Go}Q}í¨ÂÒA)«kFYµ nïþ]ifn™óºÚ«7uࢪi°ÖW—tQ‰ƒOU·£¡šOhfØ0ˆ€özUú;„ñæÒ±e¶¦†CHË”U§Ö:nØ~³AÐ0ür5]˜/„©6¬u ¢³óøM¤l­4sϽkâÀiþvGÜ높8f¥Qé]W"‡Šñ¨Ñ Î!‡|7™VëfµªRë°á†0GwÒîMYÏÙ&)h{A»tpj_º£óy”rÙñªß 2úM;œE#ã1²„e³ˆ`ž¸s;®Ø_âý91]ó¥?IÆõ¿á’øÇÊÕÕœÇt“åtoÜ© mœÄÝ´ÑDfí­ÞÛÿƒÏBÕÓ‰ I­^iC´‰ô§;–͘2.Z%M|5g˜§€¼ŸÕã¢R…$qiût&åÇ]žlF±[aCöÖ›‘þXìh†Ã‘+iÒ_-„Ûr.÷ÈQyfwg¶el½W×nŒ )lAx ó¥êå¹¾xIDò™ ²d7TVo,,¥–mL%ßÈ¿j¼Ý Pi/t&h¸wPá‚R8rͺą’ÒƒæRøz+ðÖSô™PTµò7†7$}vúI«qîw0µËÿ¤§¦Í’7ÅN­Q¯C'H¤HpœüwU¸—½aZñ‹ûÌ$w{}W´àÝz)~6–äÑJ‰Ù¶}ìß̰ùöª(:O’lPeòØ¿ˆ=e×…éMúm J^™:æpºHu&šÃ3WGܼçNb¨a†N[“Ÿ÷<2Òì8Zmw‰˜­ÊõD?#Ý–äë¯n‡;” Õ  ºÖ‰×\r!œV ¶¤¸ n?~“veó^ÈNÕA¤Naɩ󠨺­§~ã–vûÿI-ÙrÚAâ"‹úÊ«¦` ok0Îo²Ÿ›­íâÚçEOBEħk8§QE‡¤×"M óW¶aæ “°œ„ͳÔç™ årí™"|ºp1|ÊÉ@ºØ êF[uéŒtÞ!N %°Ø+g>wƒå ³z#އ 8Åõo|Å®Æ&‡çX”-Q›|@꺔zñLÒNþg|%=žJkà&¢c"ycqý: }oëÑ>ßH¦¥ècë‚˧µ£ér$æÎ²Å½eŠIažP ÌQî&«NÛdª ©¶ƒøÜÂ@y ©Òou¯ù¸™§ÎöWÙ‘Òp½õ\3Û26¾ÓÇÓ‹›•$QT’ã^$€¬òXóCC»bf'P>…Ü4% ÎŽUíÍ+&¦‡y9I_|_7ŠæœGÐÉ„`|¡–JÑB~ˆ4ÒÇYŠJr5|h×¢ØWÿwnu Žf€üz5v²ÝÙ¬œg!/XÓW€d5 ^£HüP¼ø`~hrH ’KõQ]îoS6wÙÈHÇñDǦÿgR7*M%­lyÞñ¸°,µ(«fG&k‹4ý·‰Îï^‚F{¦Àêv,x/*8C#QpXßhælM¤Ç ¦kŠöd;‘IÅrÀÙO¬¦šïbÎêÉRåÆ >2Ÿ%”œLLù·õmz0T}g/ãá¤×šít»lwæŸekV "rDn·KªåÌÎÃáë9¶Öþ‰>pðyN0 ŠËêàGöÒËžW`n\NyX€7u=K¡VèÒéËŸ‹š’ÃR2ޏ«ÁlÄV=Éü ªÖêöKóVMd>—\£ÈL™ßÔ8ã—´Éþ}=<2oÛKß÷”"ÍRbwÙ™ÎÔÉo5µúpTÀmà3„KQÉTróÛóEKáBox€'/Ãá©õCÐä ß§âãWÈ:&¸Î_Ò­]=†}˜¼u b·ØŽ¥}€Üƒ€oùœÇÐ!VªƒcC ª0šfÝu,d”"8ÎèL 8ÛQ®:âk-‹š¾ž=´Ú% $1)›Û¿ÝÀׯùB1¶$öùÏ–ËB\<È[íeÕBî²ÜÖéE…êq΂š}ä ½>«æÈΑÞñž›Ÿzz€¯(Yó÷j+,.mù+Lë¸?X÷õ‹œjw$¸r|2άüh4 €›ÁiÍòÓNúºÖX)C¶¡BÏo;ÜŸ¹Cز¸ÿ{H=ÿ´8ߟ«}FÿŸ"éšC|˜û‰ 5Š-ö«Ÿ´NpXÃoï$~ò³áC‹¿Ñj@’bvš¿b`{-P?}«Ïœoï¼;«8ó“D矪çþ»›"6ð…µö…eø£59Ùþ™$Óœez1e¤+Òµe±U°@ê3ð ÀáxIÉH`6‰K)6ÝKY¬’Óû4Öå 8å²ÌtNa ½ÍHe^¤&U(¼ƒýíÉôVhçªâ!/Ó…¢Ý[ð*’…o×§òé8S 4Aó~¿”p¥Ÿr4Fâ"èZðþoXk+ÐIê°ßë¸Ba^_ûÍœf ïÇ)¹,'±•ãÜK“•ˆVlhrqš„±†i‚|!“Ö2ÄyPT¿Ã%Wv6¡À{÷(¢?âJtg>0Àï-Ö+-*LБÆtáT2wwªƒ£h†>çŠ!œ=-W­($«Ì|gQ0÷Ãð šSÉG-ã«a×G=Ò¯ˆÑãÐ ;•Ž`vá¼£((©1ƒ2‰á›¢azp€ÀÀöÂË/ffvÐ^^áì8FÐÁgÛPTËF@kĦÃC6¡œ£LªÅ.ÊOD¯5I-G­!30€ôÌó»"ÁC,ºÐqrà\UJ’  Àè%E6æe˜æqÄ×ÿâÎñq5 œÆÝ›õÌ#P}92—¬ Seç¦sÈü6Zîùyù¿Vû@P§xìw¸pue|~¼¿KÌ[”«Gɘ-ÆÃgQTÂpËË·Éà @¤ÅýóT€LûaE`ÁÓ Ç·êÙÏ`Jnžê“ðÙ„Êm·È>wuœùK€ì……W!øv}UÌ€ÅìŒÜÞm«ü$‰Mß>¬M9iÁ—d0~Lòk.¯ŠqÒ“e4– ”Ì#Úįþ»AR¾I˜ß| ûÞzs¶]Gë5@§ô£j=MÚfß4nï}ŒžÊb/cýä¯?^tþ—ßH˜»sl¾¹Ø ÄçC=«`'Ç}ÃÄWqepJP¸doÜñ1[¬¾¾C­€£+(µÑHˆ[¥Úc@ðç_ÇOzZ4ˆÕVwÊ#ÉšP°g/ Ï"eɧêÎ…¹¾ȸ‹?Bbí¤ÿ®ADý*uQ !*»!ååMV!x7rî+gÜ®ôú«دZ6Ë-p<9HP! ȳ€ôÌ7Ûîdœê7âäÉŠ°²¢ ;³ÎDúò|Þ ¶©®©7ÔÖéQyÑ•E#§ÈÏ)/`éùGÄÞ;:¼E ÿ7Ì<Ù×`W² ¨¸„ÓC§*›¡}1J\~îyö"UèR ­Ïã;¤¢y3H³ía½äÅy Žæ/QÙÏí„ÞŸ:åˆÁƒ*¿@7©“4pz+I:Dz^‰Ç@ÞæWæ³E1°òó³‰è„JDP蚥»ÓVtëû¢^­Ûn* IÑn@¹Sèv!Sy0”xˆ¥€ÂbPFû®Ñ¸v˜ÊÇ0‘o¥í 1Øð.P£–9qd@ÙãŒ:‰¡Ê’CXN@IY}Œþ±²r'+ Ÿ( ­„)¤-?B‚åóÃEáøý×l ô稩ÀÞ¢êˆeïð`NရžXXâ°1ELJ²v;l¯!V& Û¹¢Tꄳ UÃ@š/ùBq~õÆ`íƒf#‹Ä rª}Ý"ž‹ýÌJÚCî!n¥v†]WtÈ$±ã_2Ùbø¸:`Ï*j®ˆñÊ·õQ$˜00®%ÄNA{2µÔ«Ì^¢, 2¬”pCl’LèÁ€€¾qmšÈ[•ö`Žt ˃G=ãåà,f¸y“¨Ó­D\ëgtMQôYiRm>ÜÁÐ&Šžžý[ áQ­ÿÀ·¡eGæ;P3Ú vå°ÿ9‹;0àê¡K;ó&°¥‘í™:,P¤å®¹ÿ´€Ó´éܵ3­mwHFð¾ ¡)ã§ÿG)µ¼ªÍù® Í϶ÎåPFLp9‚“W+bZÛ¡Z‹C?£Yr±$G@fŠiP>bþ):Lt·r¢^Ë>Ÿ¹_ã.Ȫ½ÆF ˜káNä° X m–õ×Kå.”ûwb9;Eü-W‚, õËÙ?Nt":¯-„¯o çݸ(Òv'Äô¬m¶>ÈÒ±‹ITLöa ìI—±¬%Pj$™Ö«¶  ™H½žáâc ¤Äè÷Ï«dw w²ˆÌMlÞn`Jwåti’Å…2i’ßät¡i‚¨ì–)#£ €L‰ýp•„ŠáÔF”#ªß€$ ž c¿Ã:ÙÊD¤BòñþrÕ1›UœovN º³+-Ÿ¹Zæÿu{ëwÕú'ùóÙgûF•ȹ44Ÿ¾ÊÃÏ˪'’Å|^>’ ª‹ ‡(çMXöð–7{…—^‰”›wb,.zùgiY0(ùx î|„tÜІ.ÿè{º1*=Ëa‡§ª+Žæ«:ÞãFÑ€S°?ž™Ò7µh¤ Š¦U±èÜ%UÜ Q&Æ;ÌÎæøü˺y£^5€’‚­¤±#:Ì6ŒzüŽóžïƒ J«øïæåLêíRj˜§D°áßUsQs‰øyåÖ²éöÍQ,½Üg&÷ºhJU¦yý6 4:³±¥·’¥%CñòîUÙZ7”¢•U»ÈöÌNQùï`ôØqC­òîƒypk´ƒ zBºj3Ž7'=ßž§§ƒ¤&_èLÅ_‰aá=Û•ß›«Í¹Üµ$榴’ŸDòeŽ00D6ùÿÜ“f^2:¾:_OL ûW@’/ÿ))ä3à­6À3Ö|åòòþÀ;·mñ?š¨6ß}4ÜÜÔ_.ÂÄ%Kþæl§ÝÎW¢ÙßÏ÷é·mØE=@2Ÿ7¯ ^îODŒîì»à3+;í»¼Žfm›„ÒïIí÷hÀûSŸ^o²èüöÜÂÓÇ"Ù£•cšß{4¶Ç¸°xZv6®ä¬k™Õú•Ž·]åöq€™M÷6ž…ûü°à•PûQ{»Âe xU¾½9Y¥`uõÀúçen9Ó€'º„Q „hˆ›º'*,-²Á‘ƈ[á¡tCTÚWÁ.î¶Ã¼o†cÚ™oï2áà|­-”ÚÙ•…Þÿ눷¨WVÔ+trR q(çܺÏÅïâwTñÖÞë#2Iúd›©ÍpO/±vþÆò‡oþÞg ñ}8„s56À{Ý\¸`×6<"ô…˜†Ì–ÄkþÞ#ä0|Ä`I¹,ïè@2î’:àahGbÌÑ 3W±VIB@Í¢‰¬HÚÓìõ {áÜ v…%‰&¡¥Æ¹m ¦7dÃãÑäsÔ%Öܬ·ÓïRív6 hŒœÉà£Ú»]Óaø$÷·GŒöF‹g$Ø—òh×y}Êþ4mž¬õ&ÎÒô«$:Õ3†C,±)äZk*ý¼%¬W[lCé=!óæõd2‘KgBÜöѽyÌ[ö1§Ú› ª)ð$ã+ñª”cµÒã ôïÎÕv'"V:42ØßST}'ðØ ¤/T9¨Õù1WšÛI-lCnd9ìÜ\h6…Þ¢0¨›"šôðþê¯RrW¥¤ÏøTþÌ­ày½úÁú÷Pþ}ùwnGÚ:ZôÛ>‘·$™|„äv±²vÇÖ`Á,ú½=¹mDøg>âÓøòNÖ0t•ó[¿_‹f#e¼µ û¼È7>;¨©Ý×ϯÐ?Ot~ó…Û'€ ~ï5óÇ’¨æÇ‰ýÐF|ÿ½šAtö"²æ}µ ÛIÔýeÏë?:€EGâë êãj×=~·;Ê¿`¾k‰¼ÃåÓ'¼l@ˆ¢s²$ã쮿Œ¨,LeŒÆ¡ Ò„¾O>àøøMb#A…ôó>ß“Ù;çöœÌvrg£ƒ0˜«Üëã87Ê\¹,Š/YͤiìšLì¨z‡@1,Õè»íÏ1Czìw½ol­Z–Å‘PaLà©;xæNq‡7÷Îÿ5ªü¨ˆZÜLÓ¶­ÄÀúzÕã’ LKÇMüRh8|{¨!« n;iÔ ²J¥²9håå`}·èÐuÉÓkˆ‡Ž@™†ÿ4àû[¤Y2+;™þÙØOi·c4ÏÉÃh/¼ºq€CÀ±}Ï •Éi‘GË:ÿ’OuÆiÙÒDŒúwο<(7¢_ÛÑÙÁ¦~hïCÅwâJv—<âÙhÇ`Љy¯N„9^¶›‚v»jHv5È¿5rè Û^'äR`ɪGH{¥ëHUUDKg¦ï‚œ?[ŽõB6” #0L’ðr¾Î£ÄŒqø¢¦Í™@'uÊ?(50ë#Öý6^$Uâ!sIÁí!R€Æ úp$èŸU9X*að® ç,=¬B¼»½zj]°áI’ç5™!fÅhá‰Bâ 5`²AÝ»b‡R…æèÃÒ÷‡˜:ŸÃÈÐ×"§pr<ô*¶Dû=œÓ5)ÖŸE\×ìê,BÆ|¿ë*×õ ½iе”~CöN†©À êÎxjoLÝSMcÏtøÃÀʹðV6T£'gÕ9Ñ%•2Ô¦:'ÝÀý…×U¿^ð˜’-zг,6$9Ñ29÷,Ì•ÌÚ½Ö’UcrnD&#—â æ™jµ®×çðŸ¹Ã.r)ç€Ò󳕛«¾ãÂ+x¶†ŽlêРJkù©eu¡=%BO$_¯×>Ò—çÅœ¶Ë|µÒؾÕ)ú3¦ag„ Q+k¤*š&²®MEùLKCa›×TKáTEŸ"œå@Q+VúöA€†ƒ>I_©¡Ï fõ%ÕL¼NB– Žÿ`ˆô„rÞjøõÍj…šƒ.W?jãXª)Üz(,+à ÜÔ&ªKÅ8HÓ‚©Ù÷tVÇÓ§Ëu,ù(Cé‹pöŸ*:oÝöŽŽk[}‘lšÝ ­¥H6xÓZŠ)Y»©¼¾¡Éú}í¨7öÆíaRÿìçë“ßóëæk­…€‹$?Ó*²¬Ø¶™Tñjß8|Ћ{;Yºº’ë’Ëa•^•k›hïÌt}ŠdãUû Jê³ûÀúßJ> ¡@ p¼ ¸3¨Dzq5-r¨¤¿OA²±Ð‹Sн}1n×õ1D ÈcðfQ¨z3)ÒÁ'r5r2%Y\hdëÊ üR?’j‚³yHãsò`Èòœv:’á7ó{>œË(št`\¥c Î]Ÿ†jº©¶¶ó(Jb«ºéó#ƒ³2·?ÀË(§tœ 9¯cY=E¬ÅcÝöí•õª“ÌœÝmœœUå0'c7§n³µ&×Ù!À\™Ý–e.îrÚ` eN­+¶Øör rݾi%VÆxéŠ0;¼sÕôC”ºU›³a·†ÀOS«RËBd[¿c}˱~îTûÛ'gçŠz%ý H…®‘€R0U§Üà€íáϹ„_þzVGüäLxJ%. ãÞÿðãùùÙ>ÓW‰å}¸x“z¨ >8pçeŸe^r_‰³‰I?ÌÎÒàp°¸AŸ^®aœ¨hxåP¦Q_ÀÖÃítAှřÅÎaxo€ÕFåí™[mF ããfáÓ$õ¥©ÙÛz>»{ÅlñâÇP=ú•ÈÛ_.: 1Ów¿©g­q±þ™¸8DT!wò~#À«âpÌ3~>õC3`RX­0îL®7ž Ñf‹Üʦx3Æ@»“¶¤ÿ¶V”ž®'QJ¡ax”õÑ‹òضø&6vH!K=AO+ù–‡À&Ç¡øÄ!TË‹;ªDw¡3 P¨IµZ‰“Î,DkíK+z„¶Váp))U àt•Å=eå#½ˆ¢Êáœ?÷8T0á]_Fù×GZi$û éïW&D÷Ú‚Æ´»…xÿaKaB~ýƬ’)`"M=»ü–{ü“Î<âÁ».4o¾É°ˆ Ä^î·XHŽÒKÙ=®›ã2¾sÌŽ*fÂ>6§IÔÍsk̨3MŽv á\ÈǬ9«ÓÍšð£Äç‡?-ƒýrôø= ­'Ç ½¹Ñ1‹Ï!œéÒ$ËÜä8~ Œoë,häŠA%…¾b?(‡Ç$tÉñÒúGUz⊸+PYŸ<KHûÕoxÓ5wÀE–1×z‹7aîÍðÂ;–‡oºó†ªƇ'ÊXzxþ‰ê›°%™3ð< ߊªÕvÂôÅ'¹Ä7Iæ8Ÿ'nžüòeÿÔ³øeg´ÃW¶®T ÆBl¶ƒÿ¯Ôøçõ'| ?“Ïë7Ïèߊpï%~C–ò³ï ¶ß¶÷}÷q À ÁÑo¿ŒM{ï)DóõÃé/7dþy´s½ÕÔûíܳ\y~x4·Âœ_Õ!ήU„¡¨/Ð¥í¨oÞe=K’öC˜Ž¬æ²¿/ÎÿÔ€Ë8’[¿oÎÔ?-Þœ˜2¶í1pùF¡À¸Fa3‡¾ç1T TR¨¤ÏH¥{t2Nvß5‚ϺGiÚ³;/ã0à¸yh—œ‘º§^pzàû÷ã¢ï4Z0Úñ]¸ÐÖ¼äx9NƒE¸pǪ5}‹f à‘AºÃhÍ·ÞQœ¯q˜3¼…›oÁ¢R$ÑÒÑEi¢/k÷TQÆ`I£¦:‘´‹€‡÷§ˆó–Ááݨæ˜q1ï\lÉÒÚIöÙçÁûð"Ù:n²&ÇÙ `„Jª~!!yãIêKc~.D·É­`T­¾ZƒÖ™9ûó=±,Qeþƒa+ÃaãZŒh N jÍT(ñ¡¸¡Ù‹¢¯;#g§Qr™ÏJÑîuíŽÓ ç PH*bF-©$ "=aÁ u€yqÏbäÌbRÖâm"ÏóÈ @[ÚO\;a±Píÿp‹2Šc_ìònN£ §hš!ÉÉx¥j9˶€b»VÛ¸˜{4Ëbå°¸ *«ÉÚB‘æNH51«r¯ ÖNÙþ÷mûÍR£"w£æØã —¦f¨VbY Ê|e€ÕÖƒÇt¦•ÂjXÞêõí õ¶›™3ÈêA%LwöXn‰5\¼õ``\Ò<¾+áê{;ùÁ#ìM’k°ó ½ák«€ªvGÜÿØüª'K&µ—bQ¿Ó¤³ÙoLD&ûú„P?­‘)Τ§£ƒ§kò cH …½˜KÍP…<-1¶B:›/œ(WU§×9¿[(ÿÄß]æøO˜LŒ3Ø  ù´X¾uþæŸ$:oCHEç’©òhñΫìµE h²€ìe";ÌñÔ@ó;ϽEÒŒã¢ÒxËŽþ!º3ëå‰ãÑêkœø˜;xcT¥"þ¤èCÛùõÃcÿl‰fÇMV]‘OãܵyÔ-,KÞÓg™ ðÇ9ÂïÜ X·M.|¡9GúϾ¼ÍÚ9 ï@Рܥ°:bdjÅ)B2• ²…ª¾üÅa†cd(¹²|À]Ì…ŒÍþðŸ:§)Ño4p/Z?=Jð‘}é=ù® €TƒÐ6´5ûIøì«w؇‰êzsÑ £X ðcóy¥Ž „Æ€êi9r¦$·¶Ût~Õþ§›Vò§³f8€Qt   /¢8>ø«é)IÂ{ËŒ”ÈÿÓ l2ò ÷®¶”Õ)ÒpHÌDá)݃.ÍÓþ0ü«v¤1’véXöƒX5ÖJ‚ÏùhêY~?ÒÏpDÍlÀÅL®‹ã"œ¨;&ËžÓ핸ÂBz6ÖçY‚Ï©{ÅÓê*õþA¾êQ­øI'oQ]éþžŠ:ÃN,$ä^°]AkéÒ>£5TÔ¸ñ©•ÚVE³´Ä,σˆÃL[£LouâûQô^1© ÕªG&BQe‹»¤7íÄ’|+’äWtÆØ$i£uè¦rD6é"ÔwŸ=µœq)FOßÊÖ’rðÀPwœuFozë.5ø;‘c‹ŠG‚üàŸ3«úÌËzÙ»x®Åþ³®ðÑG6à†ï{¾Þ?î›Ê³Ÿ¼¼@ڼĹOn¢ ÷–Ò; üDé< P̺6}Ô%¥Ò¹7µä´YmP×T9–tÞžPøÄÚ$ð…@hÎQÅÕ”Ò3-¤ì+ºm'€!nÚŒ0;1!î%QpëZš£Ó±¼})kÕ fñpyÒ_^ETP?7}<? 'W9ž¹ì?§¿\E-æBë2˜FFÎÒvš*­óÛCÇþ¥}1(øhòh'M¿ü.ÿf£ Ð_ê6"DA×ñ¹èªt 5ŠNÕx èÂl\색<Ô{-»pnS}q þŒSìNp'ˆ]ow]¦ÎAž…qJœ«…$¹žÑ>èë–ŽTkxE×ÀqøÙšQ Þ¿äÎÌ&­)–ùĤbòRŽ_§œ5…5›C´Á.ºJæ†tªCo–6bÚc&ÙÏ«ó¸!³„»?,C?(# PåÀ±ÄµHt6|Æ·„Qž¾Kd7Uƒ|ÌxÿQu/}øªR$i¸ÝɲD1„-˜Yn¼Æ§,;ݸjÂÝÎåËÅã`Ü9þ”i\@7n±{ê ¹yä½Åñ¤¾TPL FÏŒ™ý²¨oà%ïxb&/ÒSr&Ç\ÖÈ_iÍt×àôh6xÿnœÛ0G Šf¦ÒaQÂb)üõíJ'=)èçaÓ+LéâÏÆþJÜ+ .lèÿhjdNÜlp¼ÊÝã¸Â:*‘?Ï#P«|¾!0Üe' ¿>ïöOø¹…ž–gÄê´ZÎ+#q"×xÍ€ºÆ¬ÙÀ¨‹‚ªÞ0›çüû•"Mxú'Ñ{b”ZÜ1¥bˆ¦‡…ù$9hš½æf*7 rh¦¤ÏGVQ—Ç ÎµV×öôüKë0èez« d×VŽ×)Üåõ¢T]o |¯cÈ\Ûm#\žß‡è¼MEçÙ·ØÓ{þFcLU¤–†YSQ {8Í%¨¦·K ®P “e˜*/µ"ü)ïϲø@J/ëü÷©Å>Èwþ3Z”»z`¿U_ SGeÚ€âºç…©†b pºýÝ+„ °pÈz©Ãe A´­†æ4† (±7­\‰p œÈ¸ðhÝòé8Òó¶Ôý;¿MR˜¨ñ'l^8È_»6rb†¿ïPs|a0Vw>Î6¶Ÿ(?[Ü ËåŒÿdKo]lߨ8°Õºyε> ÄˆÖð6²”ãàÁyIÉÙ…¿é5“‡JßuêÚE·,×|­ÓuÄkRíã¡«¸I¤D—°1@Õ{!ÍpH÷‚é¤<óØè%è亳s ñ²&8%Ù0º9¡ÑÚO/„JSG\ûÇeÆHnCrXr¨õ…4@Ú\"œ” EÂu6€azÙ$xC^ík;ºdM禾é‡h×­ô^Gë¥ûÞ4•ûÚZdtÙ…êê÷'tºD̯SƒË6«ÇÍþUØ)M6»A:·c’+—Òÿu^Oß±eåûË$‡ÄB|Ÿ˜ÝaYºÖˆ^Të.‡áOÈÿqNµ®ZØM5fgˆ0 jH.¶Òj(Dù#(¦ëªu†ÔQ t×mf‚Çt«10pØÝxÓß&P£:¬|èN5^ › ¥oá$1V1#_¤R4£€ŠÜ`»!ù€/ʹ`ƒ2s¼`Ø›)Æ´Úé6&IDz¥uCÁ 6åÌ0è45¶ë¸õ…€Ò)T_V a½Ù£Žiœô‹Ê<3 Fe£oà×ôcQšéhkþt³FqÃßÈ¢´ÌSQÍBœ”þóÙº?aª˜†Êÿ#øáÍ–k %p)µõÓ—r éF§‘1³îâÑ Žò¾¤§3ÀÏ•6ÁĦ A¨½ýßöšç¢Äcµéb*u«fz”3Z†t>ìA:%ôÂÅíLˆºì0]7›àÄû½§–K ʼղ¹ŒÌV~þ1j1i7²_šqŒVÒÍrp§äDž[°+n¦2nÙ¢g/ßëï§œd¬d«·T€v¶=£™Kç~ØÇ„ìVV'Î'n z7X)v7ðMþ‡åæfxÓÑI©2}ê9‚“âmbexϲYLðÈš–ÝVWÎÐ{?ÿ^N/‹€(M9QÝÚ„Cë0xCÍ^S JIâ#—òŨAÛNøÆ`<ï±Ã6x“ÿ`€§`8ì8ÿãU"JøäËù¿ ,Â…ðFïåàôÐñcÏ›4Èõ'qÐ;ê˜kö ÌôoÄû¯ýZ)ÿûz³…ñ}C½åì Zk.q×&¨ÆÀû˜´»ÜwSxÕé™È«¡…ÕM@ÞLºÇý¬ð©$ÃÞùé"E£Ôd"@æm|eE©^aй]ùÔë%UÞ8½¬)½U9<8‰ÊÛúcž*5ÆJÌ«R•î=ïy둜a°KæÀ²¼Þ"žÛ,¥ï^ %Qê´j øJ61K÷ÿõ ©9Tò dFšÃóp|_÷|äZ§¦§OܤËÞ2s.‰ýï-‘¿þ«OÓ¦¿–&L%¨! à¾þüUÛoC û'×ð‡”ÌŠ½Ÿ çâäßOâÑcyÔ‡ÛñÙ^V€›qjVåǵ—]ïx _üÚéÆÃÒÔ÷jy|ÿ•ó—+岫Úß8ÿtÑùïßÅù\i’¤ÊÀAl”Ý©^Ÿx½NUC;ëNãáe{Pü޼çG‹{œèŸ½ÇÕ­¹õ³ }þd„ù^ûOóL÷)ýÔS¿Ž´Aq» ¹¾ÌßË“ôƒà({Ã~ÀhÌ §É󽔀sèMÑÆ*p¾×Ç B,¤SéÐ]4ö¿ÂeŽkCñO¿Oø_-y•Dû4‚‡a$˜ŠÖµ'“{¾ž)2T^2iârB˜p=¶Ö“èzv,8xÕ–l²‹ Í»‘I©ewŒFH yé2Ö•š”gðèŸw‡¿šK ‰eoia?å +ÝÝÝÔFâþ’c$_E9Á£.‹ÅÀ9d¬¾t/çŒj©T™/¯„" 5ûšƒãþ„}Äì’ŠãÚ¦G[vé›Wï_b¶Øè?£• æIòší3Çÿ\ýF—²Ó»Îjœ ,• XÖ$Æ\»VìÐÓÇí2¢vBÒ^@{A í”´Â8Î(N©vZ³£ßWYpìÔY¢?›.ýÓ Øh ?€ãl©£•áÙú85šH ¯ó€áLwò,žÝÈ ÃiŒþÌ9º¯ö¬<EBlaEφfðdúÑUGW72§5fb®:´mXãHè&{ýÖi& *+å¯ÔGîîU ºK(ŸÀ–V ƒîê#ÀÑÄà©„·žª%Är {f‚[P´¨³ŒÚjÑ¿ !0ŽÞÈzF¾Òš WàOªÌ¡>V”†\§všÙÌaÁ¦£—’kêd#K.¼úñÌ}ÔRP´zÒD¢Ë²¸—t#AŒ6÷+%Ü®¡Çåz­?äœãJú`ÀB,ïB<°‡îØnù-²©u“ %¨.³W0¨hœ7œ¨­%¿ïvlÕãš‘@Ö;È+8ÎÀ`/ð2?)?\m,Ñ¿9&oM˜µŒ6rû ˜Ö3…‰‰rõaôüZåâžØcÒ½~ª1+Ú$Áœ}É9Þ¼dÜá?6ag®uÒ’Ó)ªãrlº0»Ãequ‡d©µ† âRô·dª ølÙX´njˆù){ ÊQ›Gšl>ö™Iêâ«8m;À‘èCÞf€+=!h–U‰Ìü›rµÂ!Îùª×aK‹³müwaå/&î*êü9WƒAŠ«Ž2ÅI­25[¾a>~¾ì¬0é[ÁUvú—ˆÎ? Ý>¥Ç4B3&‡’óÆ‚‘„rr‰=¯-O0¸Çs‘.èÜ@¡H¼tCÜÖuùi¦yÀ>Òûü÷õ;ô¿ø*?FHªDZ8VT ²¶ Õ®ô¿6düác"ÝÑ5Æ·áß`ñ²L¦^#ïÛ-Ÿ8¾óÅçq“ÕZ®¨€û•c­n¼æ^O9¨ Üo`œy¯r%šÆˆ7%%Nï¦Ã#ÐϘ'5½{·f0,3rÚm {ßœXÏBçõ êARtuHú¡"ò€oƒÒC¤åŠáôöxZ…‡û¸ñh fÿk;êÕÁ}/Ê!µ3örªþ 1ⲃÆÐ5£÷|ÅcÑïº=/'FoLµ†:3Ÿ®3´ú½d{.v 47aÕuÚG;ÚüVGÐÈ?†ëK×· §êÛ,„ýÐßAWCé=•3¼:Ê7„ù#õÒ3ä@lPèÈ›þeBchZ°˜Wb"œ„Ë9­t2¯ÝgL£ãl ã”ìPÅÙë!Æ;Ñ<«<Ò--åÖ£žÔ4xPãâ6é ªÕ}®Å:ë ";.é!9úÇãääÂGJ““V7g1SÃÐF¦ª† ÉRÛ7œl˜”R.þÒ}½KÁh‘ZYV½ÇÔv}䢂벫@4Ü;¸Í­Ê­I·«o»Ñq’“ )!)n.ïæY@Ê_H5fŸc êŸU$äºÊüúîÞ“¡ÐSšÎQ)j²ã!£Á2Tmnh5«dÆÄ¿†¦:•¾qòÑ«¡n--ýuŽ®/†õ ìA®÷uÆæv°ªýËÑöÀ†bFy q´98íc¬¯7´+žšhæÇݨÐxÇÏŒ.B6¥È$Ú ü›ï?–¾3:â ø°GaE V^hF+ôu#Á.qÁ×ÚœÌ.µàSÖ“ÌI-\Û°¢<¨è¯j&q»JGÜõëð LA¤«ÕñKšfŠóÓEpFNúðãVl©—†L)(ƒÉÈSÃ㊿ÌLÖh ªmVË)×ù“éš14î¼rãƒ<¸=XeÆ< LÚ^“Œ-(AùÅÓ‰¡D°´ø¬žÙÿ Ñù²—6=aWfxí+ƒ·#&<­‰5; WMúª9Ŭß39ÕrÀ y`ö<õtn½ ÀÑw~ýÒŽb×pjhjœ {QKYD!Ü ëÂΔmöC„s4´fŠÍŽà¦£YÊáU©•ŠìËdÑ=pié‡x{·S›ªÎ[…îŸvÈY/.,X›ºÔ¸?_¡ÕÚ28„ ja /ŽôÁÝk'©GA_Q˜,‹;Ñ¥iÔ̬­´ÿ¾þ}mžßZf~Dè]ñnu{5;&„Rh¡„ ™KXµCÿ18B´êR?ã$l6Èn€`àF5g`€“ªÇéù[·¸ç¸U*ªD¥Þ6ŒGfïŸERIª(ä è÷mÄRš©1|·†<²ÜÑ<ÁhSpÞô÷zá!-Ð:„s«2BÍžyœ¤´d/iI}½»”À9­ŸÐ‹â²W7±0½m š•`d:z ü›3UKfgî#+5Ý}R4ϧÊõ—‚Ã2:V†Ò¼Æ Á—4ivÞhrWÎ8@‰Í{ëÏ"Ž+×Ú evÈ:?xo>|T¨túh†¡‚÷Ç›tÔj½~dêÊ €ÅöëQÏOŸÇž0}9l0Q‹ö§(ƒBý“ |aßÿìÇöh]ïÕ¦¸CîúÁ €·XѦ¨ÚªCáþ“» Ÿ¿ÊŠä5ÛÖo5°‰n?B~GiO3.X³@­DñXV±G"rÈŠ+y¤Àgùi‰ÀgaV¸×ïh5Fο‚œ®ÂåFJªVÍ„}ÇAòG‹Î? ÝoN¼ß÷{LÉ–xO9òØ|h¦O­§Ü>þõcÜ»ðO¤ƒp–#~qõ ºL¢àFá«ð˜VZfRâÄPYÍ—Ot²Èt h-=ø²•§Ñª×ú‚±C€š(Énj-@x .Dª˜d˜ÁEÎê¼þ3dèDm‚윹Aÿëj „ÝB>‹gv÷LîwåÝ(oZ8ØHnöƒ&ý¬ÂÁdqO=¥®.ü ë*g¤°‘ÔV7¶WÇ" i·TÒ9Ó“È×±ãD¥’éØÊ¨øZâÓ‚õ#Íà™ŒH¶Ë"ÉUPó_­ç«¾^×¶zÍÒs¿;cZçÈ:ØIŽ¡^ÝŒD@n bw"?µq¢þΠÕÒ”âqiôa€˜¿@úuÖPû¡kqþô!jó´„¡q²‡uB%i]ǽ| ô4ű!uCóX?ñw²¹ 4&å0Zæ•”þO×Jê1PÞfî{HÛˆ€ÝNmhÂBoXs=ñ‡éOÿ¥ÏNé\x½^§âÚ ¡ pêG¸=í§ƒ“ ˜Æ^é”âÞ(¡T,÷‡ž‡Â&¡N” ͙p¦™Öd¼eÜÂÿ6ÅÎ!´;0îgTÀñ»ùŸ‹xåTˆ´—lV9?69Èàw ¼cð$³ëž¥ÆÒàÜtf%²û£´ ë¦Ìƒu·œ‰b•q·Ÿ¿”¶€LbªÞ(éCd·¯œ`lJvsô]ÓM¼ìæh¹9è˜Ò'ôFàLz{V52òÙ3D)„R´¹1ÙÚ¸}‘ШøïôAòAHZAü^x½ð:Õ é½ìE&¤gc•…ÕO.¹·òñ¤Å±î¥*ŽðèÿûÄv–°èýåŸYlTª>Ž—Â ÌÄr­|Bù&ûeqZòd·òÈ<àË[aÁ§òøÖ½†ûÀ§Á[(ç·t¤÷uö„LNeýåÙƒÇxjغá˜ZÆ»ãnè‹8°†qçI EÄÖ îšpËX<@ó“µ'|~ üWDç¿©`éBvñMk,iJŽ ºT›C íî92CêÔöì~ä(.Ûl0S®í1ô ¼ó¼/þ°_ò׈ ´ #âÝgÞiö&A„ OˆAŽÌ9¸_œÔ‰\T"6ªl°·‰Â¡úfVøÈC¿[ЩÏZ&U]Øõâ@²·62«êR.êí);ã18¦áef!nÖI§ ›„8Fæû`÷u©³nèIfWˆº+âþPbáÕ“U ÊU(š´‰"b© ®’kXÀß:±D“>è§R:~BDQwO¾g<m^õãÛhÇsçJ?^vt™ 8(ñÂ¶Ûæg‡|9 õbÀ—,—œšÐH©0>Œ´¦Ë~°+=Œ:ÈP&Î }£lg‰þ;¹•v‰€$Ú;XÑj¯´£•ë—×eÛ ¥µqHR+¡sJ¹;_{àÅ!G žšoœC¤ì²:çm<'#® áÞÞiPpÓhéEƒŽïXÓj;…¡½Ñ»²Ú®Ñã¬Öl;‹l׫»ë¼hP·Xצñ+L½S{a‹_Y˜¾ÿ°Nû€\4²+«~TEŠª^Ü0cn¥µèÚ/¡õZ´¸‚'7$%-Ò¡üp &”n•;®ûÁÚúb†Hñz L'×Hys `Â1Š”Cëʺ;wvb_¦D/“yvçœí6Œ3‘ά±ŽæÙ\g©Ë—&NöðY¡èÓ¾lžð(ñîx×x:8;Ëó ›€T„Éf®,Õ«ó΋Oljd€V÷ÂÝí|d-Š­a>ÊÌÀ}b(Rp†ŒÝFù++Ã=¾ËûšþÀ¸üs¨y‚»qÞû8aÒØÕÁjlÈ$-®\»y¡·³Å~á@j¨­y±úEïߟ¿Æ*nøŸ<g<b\Åòe„«¾?çÁr‰.mÀ•ž¼Œ¿;À;σ¯,æñÝ+}øšßL”W·ÑÜHêÜ‹ €â½y7“tb×ØÚ‡‘Í,jôñ €§GÛb!ÿEç¿é(5ßnô|.j¾w–Æ]ŸƒÀÚCû‘sÏ£¯Ñ¿\$#ƒ” ÿHlx^À'‹ˆI†·(w IÆD&Âd(;¶áWëvÐø\¬/Y¨ ³µn›[fL†E¦­õÊCJ˜WHâ}x¥Ô-“CAJuñ¾ôtçƒ*¨¨žð¥Òá>_Jß:ÖzÀðpêÇõg©"xrLGF¼ÛÍ_ƒw£&pïøú˜’M¦r¼’nÄîíÑf Šü0`‰AyÓ“³‚Å]‰+Éî«0br‚–­8v=}õ:)ü¸,wQe20ÈÔÉä’ȇO>j+áiÜ??ˆÌ{Ià⃖|[”+¤žjµëà…˜ž,xwƒ¡o4; €Í ˜ÃW#¾`(ÕQ7ÙT°°.à©HbÊ—ìáÔ:ÈŠ~3¼-ˆ´¡\±å‚cì%¸Ýpö&ÎJq¹oi1Wq`.TjbÝ«&6ú»x“c+ÙiÿÕk/`]éCÊoGéhœ&"7^¶®sö½Ý ú­wüÕáG˜&öL2u:2Mfáü~åç5¯üñ¨=Æý˜>=…Ú®¬w›M¼ÑÍðˆ±]¾ÁÊÙ]öCøé¡ƒÕª,pÿáìscáŽ.HZèuÔúnÈ¡yxÀ*s&ñøD,3íñ¾ËDÀNŽ$¸õ69{Õ ›_@Ï*H¡÷#ÍÓΡÖÐnºè*B° Ett•¶JÚbÿ™%1þD~ Ÿýè»Gæ±w‰k·†Ÿ¿ñ^䊚ÑÎ/¥ÿÿé†UÐúc[… õ·ƒLïmZ~–éåá «øŽe ?«X?sÁˆÇ #Zò] €‰@ýðU „Ÿ\¤?v¡_ô¿}i§»ý›Æÿ²èü·=p¥üî›ü;Ìø¥é¦4+¢xp+9ËÞ^'Ïð}ïÉŒ„Ádißå~|â;Éùß^èo’üÐY¿ï´E·®zIΦ~,xÏÑKx’|€ÐÉ íèKÂ;š}j®(ߊ#ÅLA•¬,vâÿ|r; 'M„ÚÃrµñàKƱ}û •B ÝûI¸'ˆÉ¤A¯˜*¬Y€;ëÊ ­ö<ŽMÍwÀäz©eé ˆéÃGð!Ÿêp•LHNl!‘ÄiÀ ZJØ|ƒ)-^nÑø“­¸‘à¤8äÒ@÷DÇša®ÕZ`¹4¹ŽB‡À‚CÛÝL(Ëp+ë’€8ÿž]³Ãã܇áÕåÈôÇèå‰ä^º<ÁÈù @Ä»è÷AOýD”‰2?òÛ#¿¬†@n¹yU›³ñ°·Øl=!åFŠ7 !¼k¦ˆ ̸•×C>ޝªÂMÛÍcÞ* 7@Ú1@;¬³¶FÄ”ÿÙ\3pâ~ÂÜéèÀI.BÑʾ{³A[nàS€õ È›æR¡êAÛ%¶-¤äe7¸fáw©Ö¼nT†Šä££…"€×–açA±w1ìr¼èÆÌcâ»÷m^îÚU’Ç™4(òfNƽvëËÞ‡ öf©ÔèDz›ýÑ SèbîEÍ4(ï­Þ†[ht™6ï‚*£Ê‚èÿõË.9ԟİ ,é&¿_ÁKŠˆ$XdÜ’“CN‰Æ ²™vv8™=êy)ÞÚÅ £Ì¥2EÅ/øP¸#‘‚†Œûpé¨KÈ1Æ^EÂÉÈQ¡EJ f NæûØÐ‹àVæEŸÈª_St7aÓRÇ "Ÿ0œözšåÖãuáoOQ: ÃÒ’„ŸÝéôU¬ŒØ•zÙm]§ Ã[fªu•.c^šHYå¡ Ûr$^^8SoA(/Çòd*!×ÃY3€d§vÈ$$¼Zÿf¥ÔÄõ  òht‘¤ãV÷? )7;²ÄòxK1[Ú›b ŸmÊYéT>Ø +*kC coìJ9‹Ç«Ÿ! ÍkN"ó´v!*¢;"ç¢- A‚à)è’å ËM÷ôNÅ>C1Þ/áäDãÌjÄøä¶µSFërš>çt „åËókÈåàë‹åovÁ΢)ô×z-P²c——KγZjÍa¹iºˆKD¢ɼ£â;áÕh·áQV]«ÛåÔ‹%«0ÝäHRÁÉÿ Ñùy_ðÑ.®5X¦Ø?éà7 ÌT#ßÂ\ý”,nçz³¤RÞVYI5)uNñÍfy_cyÀâ¦Ts•#'èl?£˜k \$̪7'ã8j!VòúÌcN3È!ób½î’ðe>X‘Q&®šq§45|MÕVÆ©†WïJ9˜‡v–l ‘v&q©Nï°É A¡´­}„jŠ"Š|sg’?¿Ãô‡w´Þ¾c¿åuãû>þŒ‡ù¸=‰…o¢û3Šªoö8ýÆú3Ñõž.Š:‚Εõ4Ý5vH£@|†éSYSÚ>na¢¶ƒ¦¤ ¨é‘ÃP)5¼ûùz¨xj”õi¤ù&TÃÐÿ¤/‡\qøÐBÑZႃ›œ›xÈz-!Gi·9v\Ô{Í„Üðš5í dÝzáðA‚¯¶¤b#ïÖÖoZïÚÜá~m ÃrÅøŽ~í-ìî+çŠ ×ä; LÃ=idÝ®´ÝÔ?îNz…ùâ%Vcá‹IÖMêª1Ï"_tÏaè…cÈ IõÒÒð–2¬žÒmþDÈ„ðâ'NTõ~Çýë €RÛÄýÔÜCÈDÄÌ’WŒÿ«Jl‰ÆIQÇe;ï€ÌÀ¢+SgCÑèÿ¯×ËdØÀ]%7—h)Ÿ‘ ÀŸKP‰ù¯ß=a:óúâ!ææNR$\“¾IÐ&‡‹Í”òo“V–žÜo?ŽGlÊú'W á¾[â ŸI`Scì›Þ¨ˆ9Õ¹j•½Á4t·¹ñ'+ÐùÚ€}ÝÛ7ÐÚ–sB cý¦Èa ätÀ¢ÔL](RxMŠ¿¥îvCua²Þ¸â8…õ¤zŽCìõK4oñé€õ*'ךּéàcµ¼1à?=¢Wœ‰ÌWßô–âYt¾üÝþï™9ÍÞsÚšøùãz“û­>Tý:¿SöSûJþ ŒêE׬î`ð1y;` %PÑÜt ù@â»?xÉÚ{Hz;!“øÂ°ébÌ´¤„ŠˆÂh3ôÊÅZTù œ#ýn–ÏÊ–ô™ñà~a9Ø€þ6—ÂÂÁ˼2Î쵔บàªÒÜW¬.–ŽiIÃôØBÞ­Vì³_Ä]àCuœ®W€/sU™é“¿}Œ›h”®çÐèZ½ù›ÂéÛÓqÈ)ÊùŽ +nU†°—Ìü.4,x®ÖR¬ZåÒÂB²^„OÈL‰Õ?C­?ñ+h;|çªÞâ$Ü6·‚ï䔚ðFÆó/ãøw¥wFî†Øz}tXú®ù=nû—?ÅPNÿ½"(ݰŃx¿ëoù]Ëðß×ÇåßZt¾|/a ó—ËÁ•#kþoá‘ZËCrå7µ×Rvî{ÏFjsš£Ü±ÌÌ/Ï•Ÿ¡—@+'¾-UÄOÚ:½9-°v¸eùƒagŠúÝBìíjüÐõ DAGçÿiñèX »ÀÎ5=CãqÞµ8z&ž•zµHºør¿©a2¢Í1Pg1~±È°Ì×4Â.Uˆ¬´›L $ v°xªœî:¥èÍ’ªíZÍ Ø×^–2ødNn£YI³3óz6¼,ˆ…ÌT[QØØò)wòÖÙed…‘ˆ´ÄØ>,7•žCTϵf šW5‡ž<'ùƒzùx]óLÖ5Êø½}¾)¥e: ˜¥´t²“#‹:Ü‚£‹R\]`O>kE§er)ùËkáJDéÃõåÜ„ÙÑç<[Õ×Ñyš½àþ³¯v5zˆ®‡Ðó+éÅ{Æ­>lÐïE¡ic÷Õ¤ )ÓD‘ûiÞº"=¨¿<Ž^~w#(4|Ý 1Gªg¥à¯›MäÈÌŽ#€û^Ïá´EÿþmºÎ.)9è€/ ºôº ¡ P_Gƾ€È Ø_y½ðüüñì¶ N^ˆ®9úÌ4É(“Ÿàã³ô½¬'ZSè`š6BÄÛÚ³ÞÑ 1Ôgú78¬ بé&Ä„f/:oe³ÃìÕÖ"a:&¡*6”ùüA-ÐíêW¿óשuDQp¡˜‚¦«s {`¸2•KŠyA3K³r\Š1ø÷=²÷NÌÌ^ÃXê 0ô™ZüÅKƒÈ'ðXVJÿs í£÷b¢<ËyݯFÑö|&0—Ýp'šÎ-¦\,á‡~7üø· áHäYÍ6Ç+ÕÌ»»W3(œæ¨ná¤Â*ýA7ŽLÈèʺ¸:êrÊ9p£Aµ;¯š1Mˆ-‹À!Ð(ÓM Pf=À4ç¨?7&[ñ•¨x²†Bd"ÂH]l&ã‰y‰Kµ5d‰™'ÐŒ²¸Õmì/ê8‡ãwðEoÒ"yù¤1%QzúøJýŸückx¥T(YÎûÒ+–Ša¢OÑ´·çþz!ˆ¦ÁöþN2óJT‚Ö¥åvàÎÅMT”Ê%g>îU¢IY`Ù¥Œƒ.Ó € snNJ—BûåÔ[cSEr@QØ_ø <¥šì±NµõtY’7.ÁÜÂ+ÓMD©vßvx&º’•ÚÝÐÕÁx]–|Ü?àB´:Ó…«°b˨8¶ ÛˆX¡ A´èjàäšœ}–äÁ„Öï×\¡ìЮC î¾pW½5Š[®ÔR(%´J‚Cã7É…ètÎÙþFÑùÍîDà¶Û$õŠ™Ì‹°¦¬Å#¦ õ¡pP&¼^Ÿ‘~Æ)ÒÕi»Ù}™Í´µƨêÀíH‚èÓxlÍ€à_é~}ô«›œœ¿c6ð÷ þÿEÄACm'°cãr,²èÇ4«C̆z¼ŽøQžGE@‹vŒ:(LXá¡Ã©aJ[øÍµóÇô«7~¤„Ï_cž&ý|öÝÇúdà­Ç­¥ïž€{BÒRé i:¦oqdýŸ|°By 2§¾g9al|Ò÷/˜-¾þ;4­Q7)û´0üF­Iã‚Õ´r ëSÌ~Æáˆü£«„@i9º~B»fxÿ0Ý4NÅpdÚX•$%,m9C¦‰®S«ÙŠ Pê´Ÿ;鸞¯*P³Š£WAG,ë¾_\^2ÁîÒjªIss{DW‡UÓÀ\Špô*\q5^×'Ý zùc*£ÂàhõfŽÃoµ‹ô('‹‚×€ ¨Ê`³_ò4Ù­ÿÃx­“9Fã¡1³($IGV [qØKÙ«"sl”:U&ÊX;ð&Ã)~©Ñ©qr, ´[§²›–ø˜~Ò¢JæâëÒ.Â"s\UKD`º]¹®b %nÖnÞ1©ÓÀ+buO©Gâ Ü_” \C£që 7,8$jm:‘ô½uS‚B“A-A›ïa!rÏÂlçÒ¸`[2#ÏêY3›I¿÷²¼>Ú.ÄÃðVNæ¼4)$Ô°¡}ã2™.™É«¼x“ÕšŒÛ°É}uØ£öôÙ |Ö¢Ð3Wþ‰¦Sd˜‘êòˆô͹ž¢jv°…K|AeƒÀ®‹Uš:`µ/Šx¸ÖJø§Ï/s¹Þ5Eñ$ÍÂ>ÞãµÇWw`\Ä: ɳ¨Or!NµgÜ’Å “WÕ[ðÀ/:¿Ó3Øm@v¡ö×*…¬(sšüêÕÊ € pØ)2Ýž×?mðîG^Pgô6_Ô‰z_ï[¨t0$°u’ÒRsž-j‹ ·ÌÂCèQB€£ a  ]˜¦V:—-—:í¤zc Tý7Ó´÷ð»´t€`Qž'ǹ¸ˆT/ ¼ 0Áƒf‡E‹x¦RjÎÏêŸ ‰†öÐeä³Éì"ùÿÀUÓ7üü ¿¯Ãñ EÑÛ0ÿÃ7S•AÕˆ{ø¡ð­wèË7 ߣLnv·šÞ»qø«–Ð?ëŠÃJµœ½$‚þ,"P0NEáû’£{Ÿ¸ñ'Áðéí¨Aš 3+·öšŠè&ã°CÓu£#W6Úõ%Ãñçs,À#7TUeHÚ-ñ¡µq›àQr—5¡ª‡š™i&7À¤BÈ1íDî˜{$Ýs(Òsx´zh•NH^”ƒ#°:AzR8Ó¥Õln­90”ÜJá‹n‚®ð¬‘¼³øä@aš É"ØNšèµ¸œ½#‹k´x–ëÕ- î2h߉ƒî3þô|îçÇOLw° ñ3o…’¾ÿø›>!¡/æÄn?sÛñOÓà'¤*ÿ´ˆþ}ýûú÷õ»Æ§¯"ÿnâÏýrÍ‘ÿÖ!þ;‹Î—_ÇÁîþÝF¼~Í}[`FÂÆxÐ(Çò ªþü¢°x4Ó—–oyþ0mM.æŸ5¯>3À…_ÜäKIÁ¾ËõS›œ;á~Ù­‹‹›Ràñ•h|u˜iH,_}|ð8¬ ÒÄmÖòÂR:½Ü£iDûÓ›ïnüÅÀx)(îaî([ËMè…ãÅ&  Š»ZúOÍÌezD¤¿ò@ m&D½¢è52~ë.¨}4zhdþ‘apx˜e Ÿ<÷gŠÜFa„OHýe¾Ú•ÄåÑ`ˆT ¨^<ÈO‚¥0„Kv‰c°Qùæ½™¿¥â[ÙZ\Ý9¯McÅi›žïÓQJÎêæØ¨¼H¢Ã͵ɴ_´4n}eOïKðõòÏÌ,ð¬ûËxK•Áf”Ú“£¨ØùA3ò¥òRÃé0ëÀOm~Ž@_mS¢ù* —Ùq.¥¦htõxâÌ»esííj W"1œŽK žB¡zô¨Îœ×äˆûh³ˆÐ1ékA YϘFïX)£±ÓÅó¡OŽÉ…\¾óÝÁ1¯/šzK#y¾0†:‡«B;-záÕU¼µWUTº0rp‘ÐJË›cÕŠû\ çÈZ_Úb8 £KH›5"ŸÓ„!O¥+üT‹2Y½SÒõ×8d¡Ê&0B,Fûuè©¡7‰¤—`æÉ;ý‡³ðàpšv×>OŸ&Ð&Za*…רjdŽv1s /ÉÂè 8i4¦éÎ;VurJ/0P<œîä‚•2éŽ Ÿò®ga7>™¼”¥¼Àú"M¤*›´ªÖÙh9æZ}UÌì‹ûEÿ’&J3ÆMjUfýëŸËá¹dð0ב5Œï}l+ú訊‚òy[!òh“Fd{ ™­Vñ׺á|Wœ€“oòIYy+V°rt­Ñ·H6$Qxþ"¦j_èc4f{öOµ¶¦?6€…Ðí†Ï/U.Ñ…?ðÛøêPôñ«hÔ“ïÅšafllßÖAÆÜ¬ÞÞë =?ñ™­‹²¯tÀB›Qr.î,V„z•‰£?DÈ”$<ÿ3pÊB{{ápâ:;]~ç;æXé¸Þ;Êüwã}\ƒþ]o&μæ[€Í ëf"ºeï1Þ­nxæëí.ÆÄ="§ÔÙ•âëƒìf/<;b»×GÂ.I¥Ócñ4êãN¬qžÆüÕ¢óa{æ6ƒß)ÔáÒ'pAÑè²ßk‘Rè,OùáüDò,Åúò5…ËZ@Çò] /’HþùýàÇ“”ò«?â;·¶F»hÌjàUš1½éŒÜP¡[qÌÇ]oûeÀ 9î2X1$Ðznaâ[šê`/GÔ{ý†öšp»Ñí%ÐOâÉ.ºÄp¨û,!c4så~n‚ûÔåcï˵¶Ï4ÝîF{Ë—oœ÷âíl0z‰½5Ø!îT´‡¤÷È–ÅÅI‚#:VÃt2ƒ»ª5Ju­Wûx±º²\W 7@…#ºKYÌ`o€€5nõÏËÁÄ›£›¦Òf$ïÓݹþÌ .֚ˆ €¨´›[õÞiZ+AZ –[D&œ(·ivè¾xsÒæ†hÀÐY©êp›azÙ½]ƒPd®:1w/q¥x™ã_Så45À‰jÚ4/êµ%ÝQé„ì]cÑ©ˆ,ReòPxuN¢Ñ5ŒIªEÃ"Xè[ù¼ŠÙ£nVLË.\”kÇ,’Ï` vÖœ+Y¶“¡L+I¢"Æe÷ĵêT@íÑ{Ø-ö— æ´¿ÐO€šœ;;UM)?î!ú3®íV‹m\.‡tÞ¬þª6ô ™ Ï­¨ç~…¿'·%Òû‚ÕÆ€jn”µÕêy׿‚k—æåýŸì.Ï,VôóæPûä–öka ±€Å'ªÄøØÃ#Ùó,.pv -È(_ì¥U&À!ûB4OUÅÑgg„ãá®æ¸zó8á3ÒJTñŸi×+¬0ž¡œ ªn܃½6r—×S ¡£˜µË¨*ÝJ W…)?–A=#Ž3#?ù¾'Gàä@Pˆ„þ3e»­P"oý:$‰dX'äÿ®?¿0`­óâÃõ7åÀ+û7Bÿ0o233úuæ½»»-9ä.zÜæP°ÄaB/‰gX>õû/Ÿ8•†Ø± ƒãuF½’ó'»º‘qÍ^x5á£1ÐŽ;oJRIŽft¸`‡ãóZ¼éÕùºú*Ñy陇[a¯„@pízÇDêRA¯.û£ ™ceP#®ÛÛ—ÆD« rèÏMÎaĸÍÍ„Üδ;ä([Ên”ûºÆÕ5»®ÇØ[¸uBÓGÉ <£"–†Á.¦ºÅwëV *òFï¹Çuàç}Ö8pýÓ–jÙè‹’’'ÎHòa2wêºó»A3^´Ÿ§^hÅôsa´jiµ§Ú€LÔxò‰—«ÆG"k”x7rÙrx½¨*@¤ÝºõŒžé†AoËN8_Oð®KâÆßä¼VŸÈÊw¿Ãƒ½Ù”Ѻ–Ùç ª˜hlI—.£Ì¹Ǝ²ºéÄÍ‚Êû½$É3Þ\¼4'ᤠ^cb-¢±É¨â×±¤=úNþd@Æ&<´ùó‹ŸÁò­YÞТŸ½ôbOk¹Ô´YïДös-8 Æ4i~d%ŒQ•k°k`˜–D )•V–­’¹ßÈëqHÊh”ÆÃâ$»ÝP\|Ð/·÷ùxYTK¯Y!×[¾¸óœœ¿sLù-ô‹Þ/3„òÉXÕÝyº ]´g2nZ¶ÌeÔ ð½’ü[÷2¾l;/_Þü?^tþá¨JDñhKѨìm´g‹ê•b£ÍtuB@±xZcdæÕw,¿ix"Á]/Çóõ#Ø}•ìíÇgÉ2¿¬kô+ÞÔËbØ~wNÃåºÄÉ$@Nze´Ô†â2-® 9l»¨Ö³0Úve(<¤cöžéTeV­­Pîp|ïd™÷˜;°Ã2ñª ×#÷ÜøŸØÞH¸e.òsFÀÉ(à +©~ô­Uý½‚bïŽfÝoì®l®+z®á±ª£;-øçjbêÁ zD“6‘è¬ùI£Tèr/`¬< -&RWë½t/PxÄSEæ¥dÆŠÞíCƒ­“«±K{_Ÿ´Co!3l¤¥=Ì0he<Ž¢ùéV¼Ü„ï·6@Ó JC“í“Ôr\vŽ/H«± ‚#**åîÿ£áö— zSçÇ5ÚÏfô҆śì8ºÜ÷ü,$H{·‡C²\WbuörhS\”¦ç"wuZ蕊ëÇŒ[$µ-JôŽ bG¶_‘—Ýòe˜žg1¨[üõQ'Ó}ú÷‡ÌÁ¤Ì\¡²P C Éè¯y`ÜL‚<„Tç®—`cnF2,™ûtº³ 8,ÿ§ÓˆEjǺâ_ŸéOTñ„l@òv?0Ô¡cªŠ?îÃR7Q³ÂÇk›*ÜÐÿ—ð ³Ú¨)Ù•c‡QaUßx†|OÑÿè ‚D² žCЄ($þu«8úc¡~~j§ÌbˆêýÇ@ÎüáÂÁZç”Aýoxù'wªøå÷ü7ÿùßúÂΧ[^>ìD©~àí2è²é=@®—ƒ"R$x]0|`œE€[F†"ªí³œI—H::r íêP ˆ[r8mʹ‘‹T5[þ.ö:yC»g0| ßͱ:ầ ËÆòïFâÕüÎ / .ó’ Ï<ÔËÐI‹"Š)o¬÷Ýé–?0íÇù±Õàön¨hw,ÚbZbÀýÄÖ{Sîò2Ù;sÔó·¥>ó\‰?+Þ}ã!Ǩ4¶ðÆNÿam樂OîÅÔ5wþ@°–sÖ/t»‘˜FsŒG5ÊÀ3¸r (\ïQ)PH}rç-O\>ç¡sGüÏg×?¶Fg±ž¿¡äÅgïÈóíðËoHL¿dóp‘`|è0|tƒµk‘Ê]ÛÛÛ €Ÿöd³AÌ7=¼š¡ÆS(óƒëxf»4Ë?xÌñù¾½KOÂÄotÂþEç?Jã–o}F›GáÂñx;âÕ ¶ïpÒþÑXz1®ÃÞ\1¬àåÍ!X¿Ž(⬧œXöÕ«™¿NžŠG ×¹ŸTuù3‡ù#$3ïB§…¹C§— íRT€F0§¡?"§ÈËH{u©…Ö`¼ä(ŒM=BÙ½êKN cö9È mÀoŒ­´"…öõÒ ÀQ·ä;4\A±åÜÆùC+¾á»„'+Ãp”þ(+‚rÊFç<à–S“j/W !Åþ_âÛNž‹T6ë.«õý¡kWê:)UK¬3³µ92¢¨|‡Žó$˜äÿãêC‚_=˜Ä"ÅF Û\Qª¿ËE”™ªî2k‡P3q~¨æ€vØÅ8£qø8ØÉ¥N-Çã÷çwÐ>Ö2ˆdݶkùº°vF©»œB[X&U7Ì+×#U'P5ŽMø,÷hÞ.êUú*Y€Sïxhø›ú§‰^^®fDÚPèÊ>€6ÌÏÐy=ä¡ë/¤'¯6¶>ë‚HøeÙ6¼9{™gᣱŽ9ÍY-ä33“yú:ïûZÎͨK“mQaØ¢Îr1ÚLÜF kd ù•8¨²é3þ ÕðÈ6òŽèPÔsŠ“f“­DÜÔ™£Ï:©,n)Æ DÌ.füè¢EÈrôÁÚà‚…™*ý²XQÁîØ*ljFƧd¤Ã¼J̽1•¿À@æœ%|‘qì¢Xó>“þ§HCc^—`8Í=Y‡=,czÙ?2yÖdožÂ²g`1Tþ6h¸|%îo¾5ƒ§;+ÿò—Ñ$æÉ¸›€ik|©ÏÁ*éûFðýû‘¦¼1S­œ¶[ &ú*>ž­‹ýö³.^ÿg6$8Q®ÅÄÚ÷EÉàšãÃÚjhÿæŒü,•GתhÂè£Wcp‡¢¥óüYxMms^È™·ÄOçz^êi «ËYa#ìÝz°…°ÿÓ-¶Æ2"ßîÉä\p'dg—ã…!ó;0}5o2ÁELE(¨’m²ü†q‹Éþ_w;°a•‘!õ´åY^Ú,JdQ ÍîBjfÚ>·¯™?•Ý)jèóZ­É%'é‡ýû 'ÁCÏ€ûRcñ=Æj¹®K4ÍÀ 8â…–øRæ(àÄ2¬ ¼"Ô¤Ÿªë“q²†¤i$ŸÜl]<ø©ù(#œdsL«‹eQHTÕšÈ(Ä \ç›·ÕÚÊÍ 7H…’g5ª † †¾›¼úêAQ—÷…ûlO¹xý¯—SE+Æö'œ_íÖÉÉwãŠcó¿ ¼÷†CF6ÓþínÙÞ~µß‡¡ YýƳuAX‘8É Ñã«Í:·«@P=ÎPæÚ⯣µ(*Æ&iÑf¤oKwoløÔžñrôqGJ¢„Ï×{²a6$øO»€žÒ·Lµk$›‡¢±qê6¥¼²8Ç|ƒlb±Mu\]¤1ÙÀAVmBPh¡WôÅÑ`ҤǢ)‡j{fÓÒ•mÚžn V§¯7µÏÈÈéXô€I„ù9@Ù¶dÆpz¥ŒEÃÒyqcHQ ÛtMž3TF¶SÆÿÿY1Ü<úé|=ÄRYÆøSß?ÏË‹­ñuÕQ* <ÜN« 'ªóÇüóa$[ –åmMb* RÈ:cO2ðú7¥ SÕż¼„’í½Ë˜Õkñq¤UÍ[0ºüõE,3»6ÐFÁˆ_À«…gÚÎWiáÑV)bš\Êè]‚N5~QÕ·¦õyûí¯c“MDž¬ÒP’Ù™äꆺW&ÞÕƒÃ8¾›Íej›‰Ë\i áüèo!àYP ßüïˆÎÏ`nŸÆ\ÕhÐP‰O¼§ì¾ !Е²Õ¨x[ Èíʤ†¤’üõÅ^Ýgõ´PP`ÝÇôlÙ2륦z‹ì¼¤X/ÐÞ~¹×\?ù}ÁkWä^[aXÇC ´©WW~¸àúÓe„@¢LúîšxC U¬¯Ë¹ ú¯™¸&Ü*-A/ò}ƒøýS’ù[z]ø/\ä÷‘ÖR?(àx¥é};¬'}‚ǸÿIo?®œ×²÷)6»‘ë}I¦…ªYä:M¿dÏÊ«LåÖk–Öeðfi) kž¤–×p‘ù>¥˜tE#Lí¨†ØíP±îÈ¿“y-ê蘯håW!3°ÞƒðlM›3qÍÌ“’€ÅŽºàÎ7¿YsÎ7¿yæÞlÃÚÌ—Ã’HÜOÇÛÍŽÜDÚ‰ÍO&pf©©4‹+°½”mW¹Úu–étÖÑ„Zø¥#õ&A •6Ǽ“ªËŒÛô˜æÀ¢ ìÜJLvÙ¦y~,wY|žÔX™I²~SBSaÌX—ÒÔ¡êFYõ²ß­-{‡þŠŒé£·Ž ”ö¿{à¦èÞ½eïÎß÷¬²6ÅZ‰[÷oE„ ±eâ&¤‘…å9Ö-wÜ@1߀e lÒzç5éþ¯nó'@Ò¸›À§sÉŽ ®?)Áõíða*6 ùÔ¹~²,QÇ QeùëEçË+ï²x¯¾ŠÌÏý*[•³×Ñÿï¾°ͳíúG<[V@L¢;¨þ«ªÐNq¤½÷±¦üvðˆë’²(¶Ê%^f?`OïŽÂ|õClìv_?É™Ök8Úƒ&ÐŒ8ÌHðpŽ”ÊFomÚ®v1Øá"ø´V(óå\ Î9ˆÕ= Ý`Ný²¤»Ê> þ³6ÌÈ—ÈÙÒÂÚï]i¸E*²–/bÒci÷<Ëî th®‘›Ú­#øÚøjb’0¸ÅÄ'ò¯·‘ðSn%¿ ›ƒ2æð’$O³ÞM¼Å–f/Ò–éS¸[,Êv½˜pþœ‘xÞ3]ãHö€£S÷9‚#^ÞôÌ÷íû7áÎÃÔ“a¥_lpgS<Biª]5º#¥f؜ۇþü©Mo$^×,À¦Çußi‡™ñ8GÙö0^£ÝiŒ±šÁ±—ú /«ü*Ïu’,bm¦ *rÝE~áƒÁûM ‡Ê E‚¨H5š'uô†&ÃÌ/ y×_*€E¸sÀÕI¼¦4ÆO°Ž£}ÅB‡õFVZ’s쩺Žºhâe3úÖ²?¹[»ò‹ÃÈ/êåP3‹ !½ŠX¥óÐ¥îFWÚû,¡˜ 77ÏšââîáÞÕ†¥­U2^hN¶:^ibŽº©ôÐ$=Uà·M(dM*ͤLo»OúympgTpj¿¸YZ¦5‘˜)QßË.kä‚5„À½/Êï+~æIÏÏôëwPC6'<…PÓ<äC¬ÈÃþÅ@<ýÝ,§ûnÆ(Ä$„£²EÎö''¢ó !ÄÀqŠ™ÒÅ0´ñG-ß½kXUçµOBb/§v3g<“µSâ¶–ìé^m&GC†ÐƒJX©jQëÁ[¼`U› Z‰¬Âì¾}S øPÚ%\¸»õ[ÞŠ©J~·ºŒ’Ëså!cÓäˆó…vû1š;ñ[PÊ÷SZýíÜƒÔ •yÀü2p±† ©· œCƒŠFÒ’W¼u\Ó'DhÍ 8üb?GâïÈ“c‡›NžäV Y‹n6ºÕK=³¢6HµÙix1–tÈñ&¬ùÝÜ)@Q’¨„Ivœ­þzÑù[äí 2è_Ô „·‹%‰©ÉÎzòQg©Hé”°NZnÏîrÈ À¿€Iÿè"]›}®I§5ˆ@ZF¦‘ošx)¶]7úL(ÁIηnÊÇDw¾&IÕÛÄékÐýäÛ'åÿü73¿ß¡ë‹î‹-ŠN·"Ååö¢¤^^ÁNrA‹Òδ-‘Î#ƒØüoi°üQ.~_£ë7ºÌÿÆó„Ý:räõd ÍoÝЩ©7Bõý 8 "V¢=6q$åŘ/ÅÀ³ GRpù¨‡”‚däa“/÷˜lpÐXd»š<Ä 5éês%ФTwÞ0¥¢á³|--[ryäl~†Å oø Õšf‘Lq(6ጠB9ê ,ãÎ?N-ƒk!XfqG±eɺŠ-·1?ù]³‹Š×°q/34=ZY–þP¿¸Ñ÷Šg:îOásþ9)ËDÝ×o‘¦ÇAûI¶¬}•‚Ñ‘¤µWçYçRi ò`QÿXgÊ'”£}⬕ý¸"Åʸ@±G©x³’4$:þ.í3GúQ橺ù-Exwr'?ƒ&Wc•‚€<òvëÿ1ìÙ@ÏËW#™åÀPøKn)¿\Õ} kºC¾ª{´¡0µ˜ëïøÐGéè{ÞbÑ6ÐQI˜ÎFDõ®ñû|M†2?r×3ü´=*ÿ‘Ïò– s`g˜£@ ¶åWÈ,ºÆyÞ`ó›ìñTÊc†¿;ºñA<®±W õÜ,Áö–)฾ÛÄ y{'€Ú䩯Ã7K ¸NÀ×&ø•h„Ô}›K²0ÉåÏóR ¹[Š3¿ÒE›{lŠEoÕî^ÝJ~uã6ÞÙ þŸ%cÅ6ã^ˆX4]Êþ­ùÛ¬’¿ëëG:«·‹²£Ú ùÙEj¦GK9=]Ü ñßE%r Ò©ì]øFzÚÙšÚh,ËÂyð:HxŠÍŽ+ˆA‡‚>%߯@\.Ùþ£uزjЩvÒíÙ'HN‘ãZ±!:ØÉØA.ýÛã‰{GÞ*(?⣯\»Â_fº·ÙZ{ª8v`åìy‘òÙAÎxQÔÙ~ ÁI±Šã2\ÎÉ£ë ÷¦ƒ`‰y‰ÅŸºË‚ÚŽeãPVœKÖÁêö6óÑ"4dô|9·šoqõæ(X8ÏìN´ÛC13ñPUàí·Ôn'J}(‘4U…^§%(üœ’/ÇKšÑë¯EºA…åØ}1‚ðшÙ^·£•7ÇÑ‹®!wÝ< +fäËp8;à3®_Üs‡öìWgJPúú¨£ â&ÕY+^@×jÉÛø†Šwpá逾6ÃÛü†›DŸƒ«2ÖÓ[J»ï2ÉÈÊÝ ê#›9A?AH¡?#\AÞ2Ås÷Ò\Ÿ†Î=9fµŸ9©ÕýžH£’±Ö~F ›[YÖ#ã;(…‹vŒ2£ \à—ʹÇçú£ŸÑÿÿ¸¯ŸãO𠬩&1ã{´>›|OPýdÀ•°÷Ÿy?W;ño76SRsfÞSM‰§«®¤gÌÑŸZoìì¬4>‚„þ¤ g_óA}gÃ,@[Ò¾ý“8³_ß`Ð1JüjXúÁ™7žË­´Eòßñ©ÿ&ÑùÅ.r? aùgñJä΄ 3tËz¬+ÅwîüLxmà,¼Ä¾²¨þ,  ¼ ¾î¹Ñªt>ËŒr1´n]F Uƒ•NœèùDö©Xoën±Ò˜ªÚÆ‹aÁº ã 'ŽÅÆôB3œæS 6`X?^¸Ø±-áŽÍUòàè7„7¸yž4TvÒ³ŠÿKF½b¿“2$tÈ0àÔ7]àˆ±âY«¶ª¯óìlªÁCÌXÎÚî0¬jÄ…‹Ò;¨¼±n@ ¶èt W{µ¡ÜCöL¸"È 4+òÏÃ\eç´œð&Yÿœf[x ®.Y„¶®QJ¾Äè/œù%ƒRêªH·f†¯¸B§ˆºIlú>Iéo÷òthÍ¡A ŧ>ÂŃH¼ôæÛ8í¦)Í¥í¸bÝX Ù¥Ocv¨¯C“N9Oôƒ'Hv4‘œ«‰¤¢ÖÇàþR•)hÇ%ù"! iƒµµÿé·sŒÁnóÊß1½þç8ØÞJõåW£0êÑLc!ÌõÄ,†_§°H@Žúh­ݲ£Áþ—ªÒÙÀãžcõÁ˜ý¡Ã]±’ù¯ýOèxüÖ ‚5?‡Ì¶ö‰Â±Š¾‹Ú6¡%–½ "po¦ÒQ¤Õ2#ô’äê@pú^›Ù«£ÿ±:lƒÈù¹U&Êa@R÷€_G}n‘ 3ßòº#CˆÑyR9+×2§?þò‚΂ØtÌ;h2)Ï”—Äî•fâƒÄ‚Æ8<ÔzæÇëU›rú´‡ÌáÖԂ˘’beê¯IÊ<“U2*4U D„9¹ è…÷ï3gó]!Ð Á°Âˆq$y™Ã8<±TÎ)Fé\FHU²¢ï{`!7:ÖûèRÒØséj1_‚Òv« þEE¤bù©½À¨Ì)sy\x MÆëŠŒ"fÕÆít•'}’R‹eV)LÓâ!9Øz†€–Ôa ,"‘ÇÂf¾—ÕHÆe¢6Bi G½œmªö[ߺY+¢«•Ré»›èCäî¥>”d;äp«!†'rzfP¤ë1f  å! Þµs€³[ý¨›ÐšfW7u‹WƒX/%zA+UBYRe*ñzé.U¶¨üV‡é³ÍŒ¡;†4iñÖÚ8pÒ#Nzï)«yý;¶~e–Ó?Hî˜cê(Hçqw>„•Qâl“¾,ÚY¹ÈFv³H')Ca*zO>[\é˛ȣ‘¥_«¥5ß.òªo‘¸eM$)ù7Ï'àr^¿èü\$gÝã=¬ì`ÅvÝ]—Ûç`e<¼¶:‚Tê:Õ{6Áý´1‡c,ïQ~¾T_?f,¦‡muîãæÈ›ì®:; €ÂÑÎ?õ™·rvàS« ÌKl&Ì29K*¯ßÎa¹CÛæEÿ/¼J3œÁ¥¸¶Ñ†#  ˜³«Tè©ïRϸDáã£ÏE&ÿûõ¦~ûùÖeÁì¦ã–´ð¿Ú+ÇÿòWj.u‘¯ü…*±•^fö˜ábed³Ñ‡LÂÙ³Ãpª¯ŒÌ°ËYrʸÄ8vGN“Ž85¦ÍñßacÖå%9ÔWãk$þ0ϳ½òàæÌ(3-›äÉ¥¯ÁìÍiCphäÒ£´=‚&¾È¸Ên„Ð \íMPÒ)„Œ<vÍ)Miêöâ/7æ Ú‡_ÌØB ›A}†t7áZ ã¸É6ÈÆ8g07CÀ¯ÄU.ç+Þ(‰Y¶r!íù Ä­±æ~ï"¼¯‡)üðAz´Ë4Ò‹CŒy§¶_acêVŒ’Ù³ëåò;eð-†Þª&2tmê›0r§X²”‰ðrY2ôë9µ§D…ì,`¯N¿‰ôÅm*fØ€gF±³éå0iÏÒä?½HI˜“¸ÚÃzzÌ©ÜÓ%5oF+3s-zn}ìÅŸºŒñK©0ܵžÞöiB÷–i$r—§†ý³Ùð`@nÅ6š\#߀ÊWáüE”¸Ý¾ÜæúekXgu- ?N¨üã Žär¦8‘ÙŠþôÓÍʇq£è²ó7wñwKË>Ș¦ö7ÍmÁýˆïo®á+¨5,ãLê‚IHbeÞVIé÷צ¾›P]è0Üaêò×·A¤ŽÑød¶:< ;Ûy6þ®ºPdY¨u–iæ1ëÎWÉ ›7Âã^jÁߥæ \¾?Mþ›¢ó·è?|º¸#Ó7\9G±¿7fðŸøúa$ä^:{urš¬\ ªGIó$¸¡— 'LOQVV^šéVð|r v<Em„’Ðx~óuY[6hjŒÒ»öo*­ÈX—Ÿ²@½0®zsµ£ÓQRÆã’%ºñ`4ôàh$^¢1Û+ã~!‚gµphbÛóIFìþæàã-È4ÉI¿À*\1ñ¥‹y z÷„¾Ø,°¯¸ õ-¿ ¤¥~öïпÝR¥hÕ1Z·v òöŸmð¶KËéÃânŠ.™*âD[íÎW¾‡$2Å¥Ÿèù!Rñ„0°Í]¥ësÒá­$_—» ¹– õul9ÒÚ,D ½˜j>~«±ì)S(p„Gí6#‚Îì×|ªø®n§D¢­ÌóÀˆÚøwbP*tŒxŠª#í«‹s4Þ†· ëWüŒÈxšëb!/ÿç¼^àhU…ܹœÜ+„–•ï`~ZEëà&.Ó›p– ºwÐ(>÷ðîA‚:®?Г>Áèb™ý >0¡ìÁÌâ²[ž£\ùbûx¹[·"¾ˆÍʯ—kº %ô&w /[„ìkúÕ¿kø÷úþ_ŸÜÿ®…êu«hÿJç_8òøÙ/Êo¿cŸ,ê¤óù+¤£~Ñ­ÙÎÝIÓ»¸X)¯|ÜÙ"u}˜P½§~0ý‰Y63…?5¾\³ö”à Õoºߤ´“ó§ß?´üq¢óeœ;ß~~.CÐz ¦ˆnÈ:ö`rG6h½p1Ù³ûõãó›æét~µ)#š³ €ÚÑ¥ëäÔ¦{ÛÕT„ì´³lµ;t¦«„:”%¢Mßàjp@ãÊ¼Š¥§‚ÊxÚ`dèlyÅ]ŇSX@Õ“Š5p}Þ>=?:ËI%F$BIͽA ¥„j*E³‘82åCHPìØpЉþñÜ’Ä.+(üšSo· ¢Yáu¾ýžFa,§Ë-tð/Œ‰ŠÁ©Ìo¿§Áî)JE!¡§ãªrY_8]WVÜ,v­jZù_)WT[ß3º±ÜÆŠâ’ ¡\æXp*­o•Å Ü*Žl“X ㎛N˜Ž­æ-¿ÄÚ×s}Íú¼êFó0.:¯EuZ¿ò”]†ìbãS qš@¯‚\¿ -zâ” òÁÖYRÖÜ£áeùj!…×’g³G?eqÚµ‘ÃÊ¥}œãêÉ^”%ˆä}»«f:ïd—wm›Oï¢LÇxA– þÑ‹H‚ ’ð?wëù‚á¾=² ˆ2HjûQGúÖŒü/³ìaÉëvÙÕy®uc2q8Ò£ëzБí1n~Ø{ôgú2Æ%­£+›\܆ÑÛa³65—$¸å.A+8ë n¬T†Óºýü›W‹Å,ª#%]oÀ+Ý@Œ’¨ƒ,`8M&ä4[âKpøÈÁ¦iOùÓ­3XÒýQ8N­T+~²vèNÿ$w§}€T}¨ø)QQÈâüSòÿa%Sw-²æÍ-»^BK߆ÌN%K ˜^JÇë2W²É{^âfÅ!3áVÈXídlKÜtd6HKQºÜ{µ•@Ÿ0u•¤‰OFÛ²nÍ­žRö­C’^ÆVœ—ý‹U ¡ Öys¯}/†òÕÀ@5¦48DéjùªCÈKÒH4•µé=)´®Q³«ó››––üçŠéî"Sn~Xà’(’õÁÒB ÚJ˜8iWôÉÏm.ËË«5U·VwˆŽ# K¶¢bÉ«záè«tÆöÕlN—ÓAb¨BÙhõôåÇ$T: HYØA)éëøÕö/ߥ0½ÚTÛº.™Jùé>ª*£ ´12ÊÈg†¥HÓ±º _a`â •Á™wãÕŠÍ~L³£ ÒÔUnœèŸ—@œÒÉ×*Þ󠇨`ǘӋŽ.0·5¤ÆÞG¿áltÂnêDÓÃ1 1C²„ Yò÷£dŠ''äÛ<Êþ‹i ºZÔ¾0ÖÜ,£¸´¥9¨› s \N“”v ã™_ýÎeþwDço?ÕÐúÜ—©|Á,èuŹåµàBÐÿكȪ¸ˆ¼9ŸÜ·² af3#ö_é0NpùÓ v{ŸóbN Öaeà‹Ô–ÈNLjGƒïO„rñð’ÍÞäÊ™é°Ô]aÄê€ÞA”F´ûMÙ`"˜KUÆíÒs[’…Ãká–ÓŽþ§&]˜OŸT4Õ,¸\ßþ™C¦)»Ÿ `‚ÜØÎi ̵ ë Là,[¶å­çŸÁ`ËI+òþUC ûWÙÖô™n_Y4ÉÀ"ëK½Þ§áˆ.ˆ½TM…-—ª™~zÖRc±˜n!­à K?{NNû„&ö–ûž¬Œ:ß¿½Eœgy!‘oªÿö‡ÜzŽ.,¼Í}ÔÐ.Ζsïø‡VO29•ïp2Ø!·l&•8bš;ýáÛs9·A(È¡V…ÎÔ/,DêÙÜDxUӪס±ëë¬aÆœ#Å ß³©»à©ÏÑC 7æq+hx¬êÂÊ— u˜CõÜÝP½èüº‰Xêÿ ø'àîø¾¿3k ´o5ømç8˯¡"ùË!¼Bx‘1ÛpÛóòpGýÓÂØi vuΓÓ*Ž*¤Aƒ¶BÌ©wšgt‰™Ñ}lcàÅå¼GBcéÑǰ¾àý¶5æûñêfôØÄñ@£æT¨hòüLøþî {‹÷:û[ô-Ęϔݾ ˆïNÂEI3{Cbá#ý‹oøÂîO}íÃ~äR³Á¿Nk}%Ž…ªÊ‡ƒC gj4ñ >&÷„˜ºMø±^ýÇ©¾ˆÊ8H$êÐñu3Î&ÿqˆó’ˆû×å B¢ä‚·_ñ Q¶Ï>þÛl0&üz…‰‹ÎÕM½Ê]¤Þìe¯\Œÿ¹_Çq<Žc}9ÏÑÿ_ÿ¾þÓ_ÿùŸ_»žC‡ mú—ý¥bj ³þÙ×ýûú÷õß9ŠÜ(“=éåÄrç–ˈŠô`5ñÙ €¸—æ@ënÉÞùî‘&RyÐ. Î.]bya‰uW37Ù˜Pô'¡JÃáè’Ö¡þ%l²6Ó&V@ÓîD‡¥±1:´‹:E²ên¤Sû/(ì$ϹOi ’ê²XQgbá E0‡à‘­6.‘ú5Õ³-!&¸ÑÔH´«d²P¸J%"Úo5&®Ž4vTŽnúÎh‡ +º¬:&`¦§¾^ÙcÒ¸BKiŸÔù+Œ¤’7›wªœJÅøˆšÇNäJ3¢Ús,2~6Z¸‰ì0;o4`÷Ȇ*ʵ$¶Òyæ×za눹bÁkÿUîz<]ì„ñ +½G%Êe‡pØÕжK;M<„nQ6)Ÿ&‘ÓeóhbÃ4²»Ìà°ãŠlø}cú'4ý OþKb¢Ã¾†‘2p\ú?ìs ×oµg×°œña!ù”ØÀkŒ¸]þ"1Õg`V“¹*¨ñéùT·¬Øµwb¢`¼ÐµÝb¢GcÎÏ6rÖ„mØO|ÏÝ,Òßi!æ‰Fœ7%3ŽÑ,›½hwÓܲ§3 ÆV6ÃbPÅGñ*ÖJC ±óÒ‹t!âlKéhð¢Í¨;å|<ú^Áò¹[H½T2~TÚüߨõN5 ¨µÒäJxX¨t ¥½¼ÜÔˆL ¦Ö¾Ì%o‚Ñî´Gd&d<àÏrœ§Â,m+fVBL˺Çm¤)¦÷ÕÆLµÄú®2çÎKÝäG(êGÉóû£,œä¿ZÒñJö¦ÿ&¬˜ˆ“Ô4ˤõ‚åMqêNþg¡í!¤ù»lޝz£²Â̶YüNºAuÔš, Œ“¬Øío'ëŽ1>šé/ÜðÓ´ÕóÞ ó‘À°dÒ[:8?Ky`úcda–Á¼N6á܇Ê0y!¨ÈRZ‡ý@àÒmÕL÷ zr·¤]dÛÄff³D•Ú0çî6€ݾõÉØi²ø5à,,|×¢v§ü3[™•¸r³/D`˜h9ZW§|DÏ÷å°«Ë˹cX£ßz­hÉÛ âÍ–Ù ÖßæŠÞ‰zÆ9”~x!‹ç³Œ‡Ò=ÑM8ê’±4‡PÓÌÙÕ¡Ö+Œ§h˜P )Œ%Ag~ÐÞùS…ÿˆè|™cÚ4zñÆ”W•‡B½¾®TÈã|#S,ƒv²­¦sË*ášl‡;Ч9Ïïý䀓ÂTY;ìtG¾­s ±=|o“¸ÀÿR9û‘û°Ñ?ÏšõhhÄÑÓq€ðÄšbÅ%³ &ù†¼-‘Ø`ŽŽ26Ÿo—´õÆÝføqE? ëîÞ„+Û@Ú4x?é+aàŸþý¬ÛU½<–‹è£Ve4ßç ùü/?÷Q¸‘Ío&ýŸùXVyûûƒö‚šÄš5õG«QøA(Ý?DÀ}¤Ëb„ÕyÚSQHÑž.<#Ú‡¼`ƒÃ«ÁudB2ÓGŸì ;w]éðæÚˆlÈi¯kŠátP“‰C¬FÙéM^¥«²9j={³”wwÀ,W8 |‹Ã´¥†‡ñ%^λßï RÔ)S¶h FÎõÛ¡‚Ó9"øks` X&ˆG:‡“²BUGàæ B4` a‚¼öð‹Ñ1ˆ(¹z8Œf´¥¬R@‡_½ªÃÔÎÏ<å.mܘ²’¡¦®÷±JF—6QLÒ^~Ôoum,ÒK ùEº”y'iYõ¼Úò=”¿þ™^­?´# «Eç’>¿8K%{ÕâbŸî(? 0DZ!†]°n¶:­ UŒ§gÛjeÏd©Òºóô’¿O~%@Qáùñ5Ûm‰¼tÖRJÄæT`3MÑ©FÄmï„{5/û®Qû©rýp9+*ÊljW‡ÙÐÆÃceÑRñ;‚¿I¼ID8\ís#4*ÞXaˆ®Êc—Ò¯‡)JùéMì~-Y¶…þ£ã‘Âån÷Àø0i!#•’nuc»¢}»lÀßm:©·h Ò‚!pלè)AOa’Ä~jŸl\5ï1‡Ø›²É¢Ê±T¹#æ[[X€·^3„ ¾w…G)ìSu°6á…ƒ!@ ¢×n³—ä=‡ù'vü)¢ó›»:©ÍœwÔ:óoçx뇔“öŸ°6&}¾Évµé€ ¸µ­‰‰oϬ=Ô„Ž‘« B|•Ò%|ŠŒ. 1ùƒâÅ^¢S˜†m0H’²õ$Á¾¤A&¯Ñû^¶Y ë6½¤íî\‚ÿgî|þaŠ…ö¶·E#èâ:œKÑ`ÖΜܾcAªqâ­þ¶PøÓG>ï6‡Ù'ßú÷õïË&P}‚Í`~¸A >FX`Ã\`nÕáûZÐ|±1 jy åÇ2jˆ¸Èö@ÑQžƒËi·O;Ñ^èº?|áü™&âÎ1 Ń‚U4°¼A¤¤U‡£–_±Ú™Õ ìè€v·v¡N1méÈJ}ÛËo·m”c(̳ëÖ9( æKÏŽœ1$ã*[ßp‚| z•Ö«@²Æžž½FBÀY¾/‚ú|>kÒT»¤`-ZÅ»Doñc ‘ ç”Øgu,vÐdA>LY?}8í´ý— (<¹{M¯~/yÆGb½:oX|[š6Õ¾¥šõNú›°Ž—¡c‰7¿Á±>ø0ü£åŒz¯šSBø¿¯ï¯öÿ¤º%AÊÿ®ˆÏ—.;«~™áûUªC±ï}Œ¯À}›gÃÞ㿪ýo(¨ù…}É?ëJùO9ð‹7ðã¯s>‘ÝrlÙÛþd¡bÑ(hg` +±@@XdTÙbÛó” yU!HãXnƒT4¤¼!^zµ1"˜Žá¶®o:PnhGÿ§<áå˜Ú¨uN™ø³)¶6,ýpZÇuª)ÓjÀŸ^Éa²ˆ*‚c«É’ƒK¨¤S½˜½H‘f°ú_&ÛúØìЂ³Lªh‰u’ÉÊà+oB” ½óýR)[‡i©\“Kˆ·çoˆ~L “þYÙPë#0gǰ©ëÕdCŽGó4*Å8ƒÊw$Z.²ºM]¡a ±@{žñòaÑÛMP]_¡gõ ÷’ª¾Ò¹Ãg»ƒ|yéÙ a1ÄCçämÛào´M<…~|bÐxÓ÷ÕskÞ´rÙñYv »òÌð¡»Ý”[{è©a^Íæ¢y^ýéhñýìÌ^ÍØ©ŸÖƒ ¬‰î°‹´Ê1š!?cjÌ­Â^ÅfàÑd‰:XÊîtÉž&d䱯ó/ëÄo½4fW>;¹ƒògs y ÿGó‚Ç\sœÙæ˜Ãô†(àAçy í‰ÊÓ4yí¢ŸÏ õí6Ê!Þ«Y’<›+MóEñË"=G3ƒZûJè‚K0* !RœºRö2ñÿÓá8h~CÈ ° É­LŒ‡m>ÿËN¦ì£ çUkuž°0‹ˆpµcCÆx÷Såø™Ó“šyŽná_¨ç)2oÿ°Ç9ë¤/Üû’8"Ghå`¿GŒ¼v}­þAÝÐÏÇ„HšÎô¡îh˜cÊ€C‘¿o;R‡.ZÂæ" °No)ŒAÿªi¹¿ZÄyua¬üƧfùíÏDzié†P¸L|J=ñíÍŠ)‡ŒŸíA­¨Iñía§æÅüÜàÓÛ6[^o£ÿ}ŸQ;Aâ뎽; iæXÉxÝ…[YÿdìjÞôZ½ž+ËýJäôµ`l8ˆ ߀ÿ° VU‰Dó#•¹" q­érïCåø áP#=ÒI”c§‹S•Sq¯0~³$ï# ÎlBW_”à(Ô8Á_ªG¡q¡užö ¦³E™]Þº~!Öí•¥b} ­nä™0Q3šO‚3®—Õª¸´¶¢¿E3ÄÓMp>úýøPE¼Ëà ¯O²n;¹cTò(nß!GóM-ŽßYtþöo `×ì;e.ŒóŽ¿qšGé3Uú‡g7“ÑNO :§^)`£"à‹Ðt»TˆˆÎ˜(Cô˜øáïX˜¿cãô{>Q©î†µÛxiä!JÚ!¹sŒ °þì4žÀH¦[Ÿ`2ô¬…7—ÍÐ| ãëpg¦ùÁì!EоM9 – Ø{àÂÏLaÖëÄíÄÁù¶7wÞ›\<·ÊÈÚg7ŸýêRoïåÉ|éGB¾52½Æþ"½N&§Õê3¨uÚé8ÿyö÷#XAP˜]Æ=ßíˆÙA÷i¨LÕ2 Õ@IxRû*Onà¥âã„®áÏë5„ïL{Y3§xßUåu Š]«vvkO€þìtê}¿¸¦ƒ1˜‘§zqغ"C¥îB¤ù<“ EzÈh¤ÇÝÙ“•Þúºìë_Íí¦¥­$}„Ðvë*c>Tý‘7)xµ¥ÝB—µ¶ËÌ[æ¸EÂð ,pš±Œ\s<ظFï'BOW?¤c§«%ƒÅ ŒíµÒ‹Nc©ˆÔÏBaÀ7Ó j‚jìî3i­N%Õ ÷m1-™NqÄ Èéõã“S! ~Õõi†-^=ê™UoU<ˆ-wG¯< XêhÑVš3iè”eë,L:×UG‚(`„É’,„$‚£{'3¾‘ã/µÌ¸ú”nPQ?ïàYÙêÈÕ`¹FÆThk-2HÕ•*œ|Dž‹q(†GŠÝBÉI:Y×±¼sHæ¤ÙÁ!‹TÍ£y޼–3<ñþSY`Íønj&»ô©1öN†¨ÁæÌë— þ7z!’aή¶*×`ÚКô(bè@ö'd±ùx“(—Žcc¨nž e4T„gY|V€ôÔ"/Göeôø:ïu@&´—ø ‡°SÀ+^Je­²c¶ƒE©º8Yã°XÔ Ë¿ÜÀÔ }X¬K…œLXsÕš8=P*‡LßÑ"Õµ‹x¨>µžSƒ«’•ó¡ :Y«Y7…`\´)Á4DS7Pz hÚkŠŽã–Cdk¥Ì~ë§ d¼;pýÚ¸‹ ª|¦H9Y–½ö–5ÖªGçrØEºn„ÿìÝaô\Õº8õ0A/:0uýs©ž`a­4½Ðÿƒpè þ[RmN":p¶Àu C|«£¹e\È=؇ºOÀ(i<ã4oL¯É,^{‡³CiæH®?Á)õt òŒ½D}7 âÝF8ò‚[Ñ͔ µj4ÿ½r‘xÂ;Ï ó51¨Ñ㙩Ðâ° Ão`ÿRnXŒ OR{Ù;>æ”AÝ¡‘ò2T†¯ÞðÛ×áwû ´7ÕALŽV¬ë&že¡ãXØo÷6±÷s%˜¾]ÈN…vK\ƒc Âä”̰…Õ­Ën›·\!Œ#tŽa¯*¥¦ld _늬PÏÁ`óAo º<*qŠ¡–Y}ó!ú^`~Ø7‹lÔôÿ¯,ºïLö[Uâ¾d³=i˜Çeð×8ª£èäþ/0 ÇÛFÍ_û ÅÀ·g§SEq=µ ˜Šr¦cü$ÒàŸ_§Ô×~ª—¶èÜ.0'ÏíY‚Å1È0;(E!¾}ÝÀiÄøÉ(?_Ž‹ñ…‹ÙOhìß,vÄ1¥þÖ¾íS}1AùíEçí'Bá_|3†Ç£ƒÏ/v/óÝ ?¬óæM.›kov¸²”©v]ôa$Æš{9í¤HVáøæcGÛ)ùvž{w hóÒ\»ñhŒRsât25hPÅ0—]e{Åat}î–JI©d°x×XI›¦9V¹ðÒ¼³ÙÒ'²^–Ól½|¥=šƒÝÍQæCÔD~¥ñ, M–‡×£ÜÙѬè¿w80g;™ÛÏp•…B,ìv¦Á ¹<ø س)†ïÊj¤;kÂIþy:4õ„ÿ.ªó¥{ƒ“M¯q½m/«á¬JšFƆ~ ‰ŒGUíRE`«™ÃA7µá £ò¶a„˜ØÉ¾}Pé–áâ7y¸Telö—¤ö†u³l’ñ„¼ªq|Œýòhx;âù¼ëÇ™7ƒÜQÎsÑ1,õêƒ0à¥ãúÄqIBµ±vOÎ$Nv‰ÏõÕxíïÈë„<œJ¯|oê@׆Ñ+8Í`3Mâl¢µ5úÞ¯çÃ;G`Žó;Ãs˜£¤DZø”çì¹ùdŠyƒï³  ßí ŽÔG˜fhsÑz¡QwçŠÚæ™úTã;Ž–Ü0˜Ž%[ãYrV4©6ð˜hx ¬ÏxuõdË]üƼÆ`7£Ï90R ,¬Šð¬A@?¾=¨R¾½ÉJO£ÿûåµãÌi‡ù_9ä‘gðiÊ@êRäëuzƒçdAÒ§N5h¨«QÏX-1}©LýZ©­]ݬŠVóýßLÅ5ÖV–ó‡‚Ô,¥/íÈyíçPÑåÃÂ*{å º+Ø2îLw2íâáá±—DÛ>&9d>‰ÏW\¸$`ª/•#«Û)¨a5_Ì0]vän/sŠfúõ›×^äõàGú+ÀãÊó½ï8ûÄÊÞQ ¦%–Yøµá€›ñ¬éÜŽê*›Åe$ºuy;ìc“àÉ-4/7ȉzIþ>i9ëà7Heڻܨº×wo¬@ÿ´wÃ|Â7AÈg8Î(gfyË;"3ß ýW¯ó;‹Î¿7î°¸ÌL•˜MÜžvÛ~ãÓæ:êz'õØêCh'¿ PìrCºª%¬ÞçDuàý €Ÿ€¼é–pv5ðz½`1pþã-á9G`CWâ½ €G; Mx¥ilºªWð\˜}®˜šÞ-¼°¶…骕¦6¶79î0™FÂÓ,v!¶’$bô™“¼GQ”²2¹!RÄ€ïÎ&–¢bœ~ [¹X(}ot,ï¶E~5Pù\ðØ:§±p.C'ÇL™lVæ²LP¿Ê¨o+¦$1/0šªWÕ^lŒtÄ8Y®‰˜Tè±+aPŸ¥=0š×â 0H¥åöC&ÃxFîæCÛ® Jbí›HSSô@­ì2'@Ìo¯ !3JRcÕÕqšà/eþ 0ðê·'øƒ’ß0ªÄM@Ðï57¾¦«ÄM!ÐPÐñÜI€%®øÖ˜(«ÖóæÄ æ j²Õ§ŽhCÕ0Zœï'l€Û‚œÆ¥×2ÓE¥÷eöÐTa¥p¶†˜ jÓ‚pqk)6ÒCÇ09åØþæ=Où-¥½“1GL4¬¶`/“†¦Læ½é\ªÑ7{™a Ç`š3K62**Žh¥ § •ŸÔÙ­*&%ƒ¤6O?¾^]Ç’;j[îpï~¶w~Ë+YqÏöÛ`æòe,‹ùm;gÇÀ—x4ýëÊ·êÝÿ0n{¿‹«’$õýÌêA¥o¤V œ³H Dô'Û‡E‚÷å‘¿¼æ£½†J(7ôC.‰ÃŸeŸ¦üçK÷èLà3úÅUæ4ˆIoƒªól{HøÖÝØi¤×çbc"?»§]y7k ý4›[ðFÕß}âügEç¿xÓn­’¥4¸~µuèKô•É-yŸÆX¬soƈÖ<ø.ù†ÜþŠöFw@Ü”e‘™Æ“ áøâ4Š/jòYüÆûѿѕ°'œ»²äU©lâu$àDÿi_—Ш}1¦öˉó ÿ9—·ruž”º6 ²âÀ*Ó«Tc|±Ü ¿í«I®=V- ,V9«ƒpž“ó#©GVõ°aAïãœÆFÚ"¿È®˜XéZ+wÓCMž@±˜iºÀË©‚· N_Íih;gX YaJ–Àd14å®ÑJFêþuŽÃ§4»|oR$ýÙÏ£ùð`Ü™.®¬€¢ÕËžÃE».‚4BÐ=Gùª˜^xcŒ1i»Doèë+O²JøÎÈ×yZˆ!u¥ÃßZ¾ w(<^À¡n¾MÛ0ã CÖ”Žê#H§†`E][6¦)SW_è^¤sÍšf¼6¬Èšj– µVI@ ß0’Æ™ÍqèI·V ²eNSJ?\¥hÙ))gÂÄ™”^Œù·£¦@–šo?"€Æ²@¥u *¨1ò ÜÜFH¤½Û!ÓÍDFÔR9Ñ€è; ÓF¬ëfç)„ËQDg”˜½i9äeÆXíõ@ž³åf†ëš(2`ÔL*‘ÙS2ôZ›(›D©kxù8Eª{® ð ®±"¯ÿãäë¾Pþ{ù¦ŒÙX®Ï ”RÿǺW˜×v//Ò†¯—“J_«×Ãuh-x½Çr™(Ú•Ù~ÆtoMî9‡wy?—(ÌI¾Ÿ"zlªŒ“S-‹6‡–£Ø+ý¦DSÍ ð½ÐšU駺¢Y·Ö¡Ád^êëzóåÞì|7öh>3ô0.Z'ó¤¶8…qÛÃTù;“ªUíOpÏìk2¦º–3õ+túg“ÔÃU‡v¡äV`ùókàQ]ëðèÌŸlòÊ+Í+AfÿG²¦¢oÐ4²rÍÈ’\Û4â¨5 ¹m¬ÓGãñˆVN¸É²)‘ Уæ–'ò°¡ï¥©BŽþò³Ú¶EÑÔ‘ùìƒHæt5@;1\×ÈãŠ`ßMf°ò8Øß•¡y$kf<‚!‘5Ñóµ-ùÙìõ9–]”¨úH2ÿbÑyÌݘÊ$0DZ€ÏUx#6ÃýO?û 4ø·ëãRýy «¿t'³Û kc¼Ûûs}šá-Ç{ä ¬®]T®c8盌!ÓdİÇטú÷ΕªËÃʫτ{ôÿ¤‰ÊÑ(ÔªA±Úþ(Í/0¨Í¼¬‘úàÍn5C¼‘Jü÷õ~ýÓmú¿XÉæ„~ÙWÆB;8Éà‹›& ˰^O÷;ö¶Sé‘c°£éwcŽtûè1iNLÝQ=ØUE\)Ò«|õòp™ïè͆B®¥e2czôWûOwŽ´|¶ÁwtqTI þœÂ.ܼ|yæm—P¾{Lp]Påý7Z 9I ”9êøë ¯ã—^™x)úÖ…ˆNe¸,V™2„†cCkT!®ÝSÒ›+iå²!ëÞËg)ð h,‹Wæ®)¹c"²æ)ÒfFîb®”E9Z·?$€o8»°¦’™ï0\Ø©–ñì!mÞ:Yokª´? &JÏo«W†±)2LdWÕ,J,A#^"¨Äõë™B.Õ wª’¥j¬Z ªtç"ð€rVõÍߺ=xûpÏ€)VÚ8S:ëøÐ€IG²0¾ OÔ)X,&¿ŠG¿ûŒxûÐ"éG®œÍòã¶Ñûx:ã"Âÿ6‚ÈpS´ÂÎ-qø '¢Í%ð‡¸G¤#ÎôÐõºö.ð}ãÊaÍô~VŸá¶MÁ¯Ëï4Ö¿öz½Ž_Ôzù›)xL·çf¤qfz¦ìõ?å¼ßÙø:³žò·å€•–Æ'+ѧ…5®:ÃÂQæ$Z}rðÆóè@jÍßÞÔ?gæì? :¿+£Ä·nÚ­ ù£¸—ý™>¸÷Ùn„U@+r¼ÑøÚÇû±••x…#škÁ'CQ–Ã8´÷kä?õ÷—ª*2Ã~8|ÅœÃWV/ãSÃògÎÍd­ÆÙýmšàÏAXÖ­ôDv¸sÛ0Hž©†£ë·O68ÅÍÜËD¦Z‰ãÃrLHŠ×zè짇G l^ÒoŸ9ܺ9ØJB¦¿QÌTrïmo¼[ú}±r|”= ?œÇ-0òô…ÌgZz*þ|4½x,w#‰©€Å®ÎÏ \½mÜL§WßÙZ{ê^º™Öz¸ò„3×¹áòƒ}Ø1U¯ã =t'ð}ñ\¸-½ªˆ¹°W‡y®‰o.z5OúíuЗ'6¼ÔÉú$Šfv 7 Í¹À%Z1þù. ‡0;ü°‚T’Фy+£—¿€^µä…:ot‚ö«1qœâµ\o†Ëì–Âý4»DØ;í. ;å0¬þèÌ ±Óº‰"[±$…:Ê÷†'Ꭰ‚Æ´zsa烡…èËío’··b.´æýÐÍ+æv˜ìJt“HÎ…ì°çøÀC… ±áfå"~¦ÄŽ÷ªzÊ<©.„¹æ˜iJÏCfêyžñ¯W®²¾2óþ‡~}+%ç{Eñ'Æ„§ þ¼'¥Nxÿ¾îïÖøÿ•kípòyqÁ½cpñúÔSî/}h¹à_Å"ÆgØñŸèw^<þ(!õu{˜ò¥3ßY>Õ“ÀÌ™º»ÿöë7¾Ó¿ú®jç_­ ÷peþm¢ó!YØx©Y›oµ<û+tsmÌ:¬êá\ÂŒåÅJ¢BŠJ‚!uêŒc–ŽêH¢›7ÎEå ?WέÿëóaÞ•»c&1Ubˆm„§½Ç°, 668ov~ ‚6>ÆH²ìuNS9ÕKÃ+©#µ0_Ã)¥f ï7ÜEÕLõzm$©§ßŠˆP‘ WÇ2¹ß¹çêÂë§Áãj9aI–†ñ¢#ä±¹‚Ó7Ú¯ÔÆOo<Áñ3 ™æ@ _¬Y ³¡`jÙ Súǹ¦‰G¢c~ÞÈr8ñ9½ÀsðsÞÅžRai6¶Ú43C%cªÿÑâ)W§æK˜æPn/ÍpŒCùIÌŒ§¸L”‰ŸáüÞëe¤ñ0¼xù84{Òt|ÙeDÜoñ)?¦ìB?0ңǔŒëÑx†@°rm€è}û”_:Ö7¸nÄ%&ãNÉ^ŠB½xN\À5{7ñ”šaœghðÿÑËÿ˧½=3;x´ÊÞ`¶‹žO^w²Ë¼÷î3,úªÂdÙ%VÆC– 3{!* í„שý£ýî–àœ¶o? BT± Ñ2'šd˜ì–=GÁx(Ô9ØCñ²dë^ˇl% M‹†•õ¶ökæ}¤Ç‹9U"Z–m£*ÍwäM‡If#žˆÂéXU³ž \î{}´ÂÜVËÀ‚×ü(ÞÇ…š2jIÁ„Uq™¤\ƒR±LŽT˜‚¢:it(•*}¯¬$ºª˜‰@DÒ0×ãë224§³ˆ|²Wö@—ô€k^Iƒ¶Y2¼ÞûMª˜Ž´%Ž&…oK`®“¥³ ê(¾!‘/ÂJÀÈ,éNÇÙìJ(ð~Á™Í<©¶97ç•Þ^uWÈ`Yä®&súê Ÿi.apº]Ó^EJ*·`cÂ`uKíN–ŰóõZ›2 ¹2¹Ð”‚+WìN]w"%>\?5TËΑĠöÑóÊŸ¢‘ ÊÚ†R<À³”úœ95-o?}vêQï2$‡½×‡T®“¬ªí‰9ªÉ€Œ{’×ÔSqr-QʼGѰr8É»ª¹ûv ¾V’ªNÚ©2, pß³.ãBÉg¡ Ðe!hÃàeJv^êŒoŠeÅßû,ê"­£n…/Ê,Àñq À¬ `wߥ‚h’ŠŒ{uäCdþPh6WIÖ-’ Áª‹Ä\'¸Á;Ì‘ñëLôëAýtbpÌIC@<'’þ)»íÅØÚ@!Dç³KU«`T?ÏÖÛÃsW§{úPyôö¯ âå?ƒ>é—~ªÄ6•­€Öñ¯uža°5kúpqæ¹Þá×ðON¹ð<Îp_=ÉX}µ¶óŒyàM?ÞC‰&í HyÐIò^šê.~×ñ¥4êYq)zᦒêŸGü áÓ‚°ÿ3#4¦A,ƒ¬…EÌa1±H 桸&D‡³›î|&çhv@/‹6©¡¢jÞü7þ½ƒ°˜˜O:í8zX @„¨¶X„|ã ^€úï&¼°ÛäRÅ4ÏÖ’>î’½U È`zñK-[™ªÝÎù¯8$"Çs<}vo<÷¥ØÒfqP©“;}~jtÄ•ýþ€·aꇛ莀™ïÔí (QñDÉ¡‚#5"‡än÷UBSJCæÿô’Whi`FäŸv2*üe úÏ”µIîîý»6áãåèh1ƒz\ ÞkL–‡€P±³»Èº^gX{‡k#BÍŸï<šhïi<€3.oËÚ@}*„½f®W:Äœý0 ‚æµ0e+OVˆ\Ô™Ú?ânG^ïÇoiÛJü|úÚ3²èðƒoEçøæ1²ƒ\åëeõ­í«Ã“ø×”rùW®¶@‰¹z¢~]OV*¶×Ú|ºœÕ§åäûæÉ7ZéžÑä8Ž}á×?ùë%Ü©íßê ö×kâÐÈÃŽÃÚÑF)aRý;Ýš‰yì¯ý$ "ÿSjìW~½ì—=³ÉG h‡»Ö±«ý¢§wüY7þgÊCi0|ßãßW»ÿMÑù¯ß´Ð«Ã×Ê¡‡ÍsÐ’ ²9ùÄÑ$ž(¯!Y³›XÌ„©ªš›‰á0½~ôõãYY„Jãw:PPWßx¡0ŵæea%äWòœ<1•äR1wvNxô;rôâ÷ïFüêF6F•SËvEv‚n4BaQÆ©¼/â·ãE˜×ÁT;_%ΉÚn’—¸){a]-"ñ±zBR ìÕq…YâÚË5ÊÅ¢‚$ÓTCbÉøña•\ÕbÀ•¹\~ÓN õ¸¨[I߉£¾€b)±¥££»ÑØ6Ô¨¶ðzkÍ!¼XωSàÞ¥å«@Ȥ#Ô7-æªÚO,Oî(†càì2` ^x°O¼¡jgAòèÁÊšå(à¨BöÆ»éSwtÉb¡ÏÙœÅCkNÍ[ƒ2˜@& Hég CÌ0çe=UÒ~$$}ÌMS.ZÍÑ;î›AÕ¤d>‘YÖ“ó#£Ô ªK Þ ùÃŽŒê´n“ÌpÂl0â> ƒ„0Û³b¿JœÂL)¢O ítÖÓs᩼DZzÁO{œÉPiÑÉјÕF D¶¸íê"¦Fy2åèâ4¤ˆÈ…•`PÛG÷65[’Zš·]ïÀ U£û(ì7ÒqrÐeeÙ({$€ýcYÿ&*@‹Ïìô†ççÈÈæuº+‘í++¼læ1±`ý§âzk½/(Žý(ÂüGDç‹óèùz@W…Þh ì<‚BÁ:áS«YátÍzEL˜%•!NWHxÐèÀldÐR Ê]ZMÎÄ È/4ª¦Ö¨í^׊zÅNCRáÌ÷ègá –œ‡ý?8`¨ ±©F¥™Øü’öbë `@¡E»¤)e­íÆ ÎþBtgè;­š 5Æ[×µÎeŸýý]O OïÞ¼¾ù{xwu|åþ8ëKøú»Ûð·þÊ@£‹‘N Ç=¾¹´='Ù‹ïÛ¯¶•5Å„lêSVrÒ” è1òg†Ÿ pú› GžJæy©€/uÕNv%åÞdg¦ƒÆWŸ/àïq ¥>ƒqî"kGuÚzL­4‡Ô;‚ÎÐ&Ò(ss2 †MˆX€ž³ –ú-h´Òj”š*-~Êçœæ&S¡¯ÐZ©8uz¯öŒƒvUô¿„‘EW¯Oœ4Þ9Gõ&Êq6@;dXo:xm”þì´Ïæø,2ŠGáÊ©#Áh¤y"«Ô1?tœÝ¦¢ÿs<Ã(‡©ªÛ'“æ Wn%¶kÉMHð%Ö‰?Æã¦~tóѶœ4†Z¯]a+4}‚´pSTK`­oQeÈqF³â³ d ¡Â(¹’þäPwŽæ1%O~6¿æ¨4¦UÆŽæ+ØGúÚ­¡¸aH]*ù:LË ­6œ`É ˜¤”*Cνmßø½ý×};b]Úÿ†AÅ€Ä~X«ÈME•4T± ^?8eÈ ¨Þ{­Æ;ß™Q% AÍ(\ýîÈŒ‰ë[7òÌ”fW#칎D¬ËwšP=gZÐ6RµÙ GäíSh¼  °”'‚U0-^ o×]‹Sˆ\Ú|ÿ˜j÷[íê!t|¾ÍãLüÆbëIÙ§;m¥Ðæ¨f³µ2°xŠ®Óõ7Ú0·àé¶ÒJ-¶®j q|o!ïìÐMžù-úˆÎiÁ¾Ó:~¦‚#>‹<‚ñ‰ÏÏY^$ï‰fY’aûõ׫wR¨HƒO&ÇEX½ÀwçþULZ`ÆAP²KÿçÕŨ}mn,‚¿ÔNùIêOœ ú7Øù?Â…kÙÿdùÑ4e„¦Éæœì+“¥‡‚vœj¬þ¢ŸëIdP€êд Ó‹$Àž7¼‚Ï =bŽY,§˜›˜FÔù¶VI†w«îjí†;šx¿Ï’Zû¡ëþ¸Zê6¤ÿ/± ãzýW–4ד°¡^„lKƒÑ ¬ÛPtç¢Ña4…Ÿ‰UÊ)~‘Säh¦½Í½cï‡ÁŽß>pùøMGÞ7Åy<ˆÓ£ÊÅÛá¾Èʹs:ôYëÚ™4}ó„ÚNkYî£þžtÛÒwsR²m=0ßÿ LáÕë-ÍÒ"{ÅnJ‰—ß?„š ÿ• ‹åÝ8þ„+ù綠g¹ð ¯áÆÒßp3Î^OdÖí+HÇâëëìf3‡ ³ï|ŠR;ŽãßãûÓVì—i1ýµ¨Ð\tþãëóËËÙødý v0÷! C§ÞszöYyù*gÏ®´õiéÞD_AË)!îÍ?éy)WjàíMÈé¾äGÛqgQOx§ÖÓš_–R_–ÂÁó¤­^øßd³ ^ÝlÑdÖ`,*^n½®„~FaÍÐß=.Ð Zeƽ!ÖlbMÌXHåe~Z—j˜ w« ê8$«tA&¢jM9"Z±òUº±B”½ƒ…Ü·*Ëy¸\~û;Öõî>0O)dœ4GÒI¸ÁZ£p"c­XŒôiŠiäÇÆ²n» NÓÄÇbŠ9{ü /nÞ«s'V‰w-‹Í„’ëÌ÷K÷$•ŒÑúÚ¤Gµ²ù•¼igÂÜF„à˜büÙT.Œa°Ó{±÷¸ôïÒýBû^VáþN³¾s\#ÚŽèAžM6Þx`QÞ€a.‚èÍ^6ô¨U^Drc¹W@…©4¿ ý 8öÕ8¸Àâeãó‰[Ë #^âG/øßH¼ºÍ¯2µ©}2r4®»¦š̰çèOœ«åõ2™Ét§Ö°ó5!%¾ …n· ]0Óö‘ .^]ÏšŒ›ª¥é@JSÁûN)FûÊuô—æ[âýÖ]‹Æ<µ5NN%êšÚS¥Ã/é`Ò±ÁxîN«¦#Ñ…'Ú_¿\ Ò´'PÙX%÷ËÓc#Fùºl27áwÜð óIð~.îV_[¸ƒFk—„CŽc$»6 ~Ú-ï’?…ì¤K`È>w· dœñ<Ìã|йú¢¢³i ýIOùT¯ž…²ðƒ.x«ÊèØÏ °“"dPÚg#íuƒò’@Œ¶kÕØî6¸uÊÃñÎdpöú1d, åW0§N°°×»ª)®¹r4‰ôÒ™ÄÄ£ŽÞýq¦¢@kô<°±¡²SUõ&†=:7F¡ãqˆ$ÀÑ!uW‰*0×,Ëù­ð.œn|ËaüÜÎþØú^ÁàQ7oUǽçgu‚"{áx@ÂÜU¦h¶”­'»~rp$Æ%€|çÓiîÙåÖ¶êi`Ñ'"ƹ×RÄ-ˆìL„¦fÂÉeׯB]'~ N„Ð…÷éX¹iË›©TjÒtð9ßÄU@VÜòÚûDÍ– ³›ìEɳ”S|𥤡²cL®Žï1Ò(NP|EϺa «g¯¹@œÿ›¢óßûÏL6µƒæÙì×ÅZ¨ˆ Ò“@ „Ni“mÓò+Çÿ³ `‡N`14þ†/¨¨ù›uÄ "p$20ÓÁ‹ýHEsO~ùņýúrM‡­ü <:Q^Œ}é2ÇRÖ‰O0KGî^ªP­ÞyªäoÑÌ|¸2«ù»"—ÀãµýôïôM•ê—P mÚJ«•ßò0XMÇÚDäªoÓ¦‚ šþÅ™ó|o¶Bšk!áХĨóBC6ÎB×döŒK:3-8 K_=UIƒñpÝœòÉyÑô¦¨«fm:¼wLh¡ ¡¾"LûnëN1»¥(Fj‡Y»£$FÝYXÊŒYœ€¼)Šx /âÈÆnŸê”óµ#×D,l…Íëò3wñ‘¦Pà{oa)eˆw< Ò°ˆnÞ£AÖºV,OR÷CgßiºÙ Å‹ Bl8Ttú¦<Fæ>ƒæ§w¥…Õê>^Ê*!KèÜ }Úÿ^>~2Ÿ¡áÕ ‰…L›èæœh>r·D!6@õïÝìÓ M½š~Ës3á« 4sK˜i ¹„beê ”{„Œ^?½UÂô(´#nPDn‰…ªU#jø=ëŒÒ £z*lO ÆPܵzLË®mxýŸÍ4އIFd[Åv„SX H—Úð´»)]óÌl§„ÎhXÙ HÎðŽO’o±¹¶·"“ô–ôCYÝVà„åø~Šeà Qœ;¡ý³jˆEªLfLd5€Ÿç¦t®wâ ‹«÷`w¦…nfÐæØ­ˆêθggÌkžñ1¼8ÜªŠ¢GÞtj WŸ.é4:¼«WH«icÇc ¸ª æÖ%ˆ¶Ð”— ‘¥ìÞ’xžÚ³ØÐ® éPÔØœ8 ¢ÖÛŠê‚áI¡|.°ÅùôØy`V}(η-üšœ&' Jê¹öu_ØìH @ãËC$&áò Ð³Aÿßo÷¶~»~t=Oç=ÝÏÄ%ý‹Î¯¥ÿr·uHüK ) &gJx‹r¯yú¥V᭨Φêg5Œ­|©¯L5Ì&¸œ@¯÷äà­¨NÖÆÈdÑksmâ!7ѺpÜÉå?šæ-ÚF€Öɘ«æzÄA¹f6s\Âê¾Lk§¢ÚÓCÛ“ƒ†æ›™è÷þ[h/üûz7cú÷õïëfi°Ôù fMôšþºÃØùè“Ø"cÕ ™ Y‹³ðL…E#Øl -/‚‹Cõ._2÷ŒOÖn¯ É#¢WÚÁh‰˜êÇ ŒX$´„ ë@ÛMÜúàaƒ˜Æv+3¿«öÑö1‹#­7T)p <aƒ3>«ô3› ÀDˆb_ ø?ºÚt°£Nvظ;€’ ª&µÔÖd<ǵ’UeÉi&ÄÉ®-öÍŽ Ͻ¢  øHyûÒüäÙ”|5‘xÅ$»œä¼…ï`ï_@jÀî&WG;1ÃÙ»·*šâ¦GÇÕ@ÁslïùT.«úG<>¢mÔȶËRúÇ~¶’‹Â©èE¼‹ÎÈh~>£,Ô¥_šÁÏ»øS 'nó/_Ã^ÃQÿéef'öpÆ €5ö›<ä<¹ûõ-fÊa€=ðŠøuË­yC|]! ?íÉ™mÓ¦dEI`ÁPÞÃ&3?[%n>À_¦bòýåGýÙÕX‚¹e§¼z©_[á—¾ûî ü‹ÎËF~÷uô+46²‘I¾ÓÌß s†·³Ü°`¹ã'ž“¤…ìW™ù´lçGZAà¨Å+Yør¦jÁ÷öðd l=çȈAkpóX"ío:CLi®„B¨hÅY uý¶ÑdîjN,†¯ µ€—½IÃhŒuXÆjƼ:vpsªtoÉ­[Ácñ¬ ÿ¹»PΡ‚TÂQH0 Ýìd–x £{—Ì-¤#ÜNÞDdl,ç‚ô“ûÄ^:ªÒbŽ÷p4 H/¨}±+F怄bFl;H[Mpúv–¤¢<¿^•{H±Í¡Øw*m—è'°ÇX‹×nʤŠäzÔ3cÈ£³Ñ‡ËJòz—cÚa¶ƒÜ†¢T¬êT‚†¸Ó1‹GÜ"û'ô|@%„àòEW" <ŽãÕ™ páòüL\h3ÃÙœ‡Lt¹ìó‡Hñôp5¤~¼<-ž¿ƒÎ°yÂÐa' ý Þ}qè;kú uðd²¨5¯‹ý­á•Ò}ýäx@Ñ" òÆÀ˜t~Š©®H«äÄDcѤóTº€~íPÞ‹MÀg°,í4^@yœ!†ü‚_îi e¡@…âw·âÞ‡ƒßeÔ˜üN ¥X4¨IÖ­µf5ûácÜŸ][Ùˆÿƒ!hOHˆù-ï*=¼>›¢hRbC‰O(OVÔwÒ‚è6^t­ú:6MBÐs0¼5Ï(€új">GfÆ!JŠn©Qèoõ5ûz½†q‡m0§Ê¢È*3†-øˆCôÚuÅîó)W´ j¸Y:ÑoÜù(º‡eò¼Gôl\é]ì‡{ìæ>»Dÿm ñs‰¬M®*æÉìiÂ)¶ÈØ”,墿ÎÉÙ’ª†±±ûÐèRæÏC–ëzðb”+$³¿;ÏÑ0ÆO¾FæÞÚf_Â’nT›l*¢"ÜQ¾üØ1[KoÁùǨ°²N¶[ÌÆ_âœÄŠÅ|[ïý¼^ãé;ñÕfÙõõ†lù‘Âf‚úJJ–}k!msoÜq"ËM]_¸ÄR«í©'­M(á%6Z5ü$Êùì,è®NV¿þJþ°U‡¡Š¿Rt^ÝÄ?îÓº÷ IÛ›·¾md†¯R˪1Ë¡¿ë_KÎEOõ@=l÷ìF="9ŒWê4þM@_ê=p 8Ø(1ÖÌ«[Ù'FD<ÌÉ€$=¥·¬ý[¬ÔáWï7ãË—ý¬¯gþS 5KÞÞOTÜÊÍ=ÆŽh̼å[Èí»8ûù<‡»§{”êJÞ¾9l«ßzË5ú?(ɽÃ"YÅNÞRôoöò+Eÿý]àÑͺ[0?B²?$Z F´~S‘lÏû|’4;T÷ÇíÏÞm@Ó³¢Á{_ßb¨è4`ˆ­z{]Ã:Ósd%ïk;ÿÊ¿²kAw#_h3p¸Kø€ãAÝvåÒ³ìùZ®QÔpÒjŽ*§úwÙ(HÙ¯â§À:uJ,Rü›f¹¬¤«c\nëÓ8˜Œî\DÕAO#Á~KÜÌ*¿‘`"½¢ÜáäÁNz #ØÌ1lÊÚ¢¥'[C+0Ž)ºŽe#cÎΪºõîXá›5ÚjQºË#ñÊ& _XÊNñ¯Æ‰¬ämS‡¥‡Ž€ÞF'袮 Þ‰»þ ¥„#–(b Šå)o‘ߺj›Y 1pÓSŒx‡%(,Žk^¡cP)ÚM9æ`:JÀP““u#ÉôŠ+9iÈdFšš/ô9S'úÀEƒúúƒÌ‚ $]ýß.áÓ§x{Ò-H^×° ³—¸Ÿ…×W;ŽC6¸³/XD¾P”a>_»ï(TôL-/Iu‡¤ìÒ…Çã¤Òƪ›qÛA¨WÁ²eûÙš±Jå!’Ú&sB·dÞ’…–Í­/îu<%j8t”bl¸SZæØÔ³K .Z†³x:!ÛtzéAvj§ˆÊ`¦š%Œü‹]ÖÏ…Eg!ø‘T$€£À~K3©L“œ5<´Å6b² m% Ü=ÙL6…çѸD‘* Kj]ˆY¨šƒAR¼]ë­Í8oÖh¸ xrO…gj#»R‹bð@a<§Û“r¸ü¹R8¯¿n¡ò~‰º¸Kƒ]_ž–Æ}8~Þ “Æ/I‡ª¦FÐÂB.é( nEûAìŠ^«Œµ¼-sðrðÓû3»i©c‘{Éàñ¤õÑQæ w› ‘‘Ù-¿\jí,SVéÀFŽþ­J> ™øò•µ­uÆCt]4è0ê¿\ôbïÖ§­½[îš+Wodù8Ö!ouqÞÚ²âu°t›e‹| C¨¢T{¸Þ÷ÇÈÑ¢!jµ8í 9L/Z2ˆ / ÐÖŠÁ¾0£ºAç˜õ#Ç ¥M\!›¶Ø0³Ä)gqý÷¡¨:½Ö«"]7Ìý_ÿ¾þ}}ëWüY2º#+ýr–ܹ}kúzaÝûàð§Dò‰V„â0)” !Vwê0z2÷Oìå÷á¡öá:Ó‰ütCNDS+îÈ>¤åÐϳx tXʵQêPÅ@rt8º!(¬œ«as/ˆnxÍxŸtžv#ÚAÂÁ”ÿ¾A¿ þ±w;#m¶zËCô÷óº.œWº|¸£±îz(‘­Ç{¼ý‘|¾Ó¶Œ™[îüpR‘ï}*Ñ Á[iwy÷xãõî~Ï­±À:6ž%6¯Š«'H.F@LnWïoÛZÿ­Vþ‰'&Mm~0K„Ìy€²z6ëôur%i'¾À„^Wò28¸‰Ýì¹¼wiÏ&æwmÜ\?¾xá†7"œÙÞ‘SÜÏ®þÕœ±wn¨ ç[ãë¯/‘[ÜÛZüZBídD'Ì9€þ×”¯'êÕöQ:ú ¬ç÷\àíÀHËY;»ÞÏÙ112ÿà]u ”cÛ}| ·¼ÔlE6Ë .*·u3æ–Èüë&vÎñü@ß} |ßþ odöþ£ÃÜøoÿü@åð+gʪY4ž}¶&÷$¯BŸJl-³YGXs·<¸ŠIΕó¢%)ÕÄŽ@©¬É›’Š6cñÕÆU /]õ¥è _Ãç¹>Õq^î+œšM(¤³Ì”€ÃpDPÑÝ>Û67L"™ö>X§¡áE¿|mæÇØÍâõó 8—pX"4q Y^˜ÕàóvÊßXlYáK§p!Ñ™ΗtU+oüâyŠ„³»Ñ=¸Ól7(Wp¯%³`£Çkwœ¤¾À)LÔ…_Ø"'ŸÓN¡4>ílpÐAò¬:³ŠÑ, A¾hðóÄwPìˆ!iat$„4Nœs¼ x:Ÿ™/TxœðèŒ9G n'ÇS˜l/ ?C—=t"°'oÐþ)¥†Gê ôá‰|Óü"³á!§'оؼ~~qÑqPF>^Žºäb¨œ$QD_¥Ü»~ð¼xo ñK×x çÀM9÷LüòÍmäªLÿY8·kéaÑ.Þí¬{;m¼¥:IDlë98˜æ5`ê…âM\,åλ Ï~áK7ë-ðÉ^N¸‰u%˲`*ëù‹¦KÄÓ`uˆø<&5©Æý ù"†‰Ùì!ª&$^[¶ c‡Ç+chÀ¥ŸÉŸYy˜Î÷ué褤éɽcˆv #"Hbuèxm«¦OÖíðMù©õs/jR¹9ËH$ñ7_|eÅ®7lX.,nÏ€ï·Ëß-:ß%)~/iÖÅ:'?~ÌÃÃôÌ ?S†;ç"6Ë„†‹ràÖĪ(ùÂYÕ­9W†Âñ9ªâ0rÀAª(0mù“$€~kb;—݈´€G`h¯Ô‘U6Po¤¤­ã¬3²]®×‰tNt™:©^&äÖ–.LâûëûâJæ0®È;%o"Ǧ‘ȯÅÛGÈ*ôçÆ&×Y½& ?UÙ²†×D½ôþow^ [>iÝ·ê:p¤ð ¶ŸEžjÛ”ZÄœCV-s¦;Ì/†Ò³H¥¶‘Ëojü”úpž»·ÐÀ¤I>õ÷¾äg:ó½‰ÓŸ n×S¼(SÕx æ5j21ûTøä Ÿû^ìK†í./ ' £ñ œh¤v „ºÈë˜5tàó8)ð¯.ßËd¡Ï î®íe%I:ÅduÀþ5ÚÑ-ˆkWGØñr6÷fÙÔo ÕÞÑñ®’Ï.õ™µsú1 ‰« ‡È˜=臻6­[aÚ(Ć7t“$ûÓËÁ† pkµ…¢„š¾­Êó Ã†çNÃ=ðʲ‚ì $Üt ÍùB¿åå£ßøÄ!ñBQ1ƒ©rB[ùÃßy#x9÷‡±“]O°‰(¡jÇ÷¥Õ¶W{ \Ú­:÷A57ÀH1Œ÷4¿ëˆ\Š2ŠÂª¨èMe@fH46ú†#Nò7Kh¯J´?üzýHŸ¥ý÷¿Äœœêúâ@>Нð^Þ±¢{À 2è/¦ dZÂ…1öþýúCW( ®“&Sön¶N(âàõÊOõ¼£z*ߎ!_SËbC#aƒ¯Y«"Kõ(Î.òètŸq¯aX:µÑî0"~Õgœð”{^þÅC5šÈù%Ã’ZQ××¾ôas}ÝJG潇Kø6êT¡“†ErWå—)[õÕZ!R­ìvtO ëÕ*ÉÓÛˆÉB¶ ϹÃ)âj¦Ï `„eßC©Vm°¶Ô³XüÂ,Ô¼Ÿi¯WUx¹ò Òu]ú†Ú…òáÒ‹9èŽ@?ïË01ÙPëÏ#2nuß);[; þè';*œq–5rãJ—[&âPµ§5È9[±å{õãç®ÛIQ*s—Le6×ÁÍ­ˆ8æ2W5™ßÕ8.\QiÒ°A”zw^©¾¥ì›èÍcÓ(:<0(qC/+Y„¢eÒó3%fð†â×&¡‘ÚËÓ>ÊØ:ðê¹6_]è¾}\Í”Êï¹tÄDn§ÁöˆÎ=¡áÃG{ޜڤ» Aa´À2“™å„³ €Å%Ô¨WsÝ~{¥¦Ž–ѳ2K‡GÝ7Rã{0࣠­gŸLM+ry=^8’ ¼EÕxµ¥ÒÔb`“(‡;èXRø^³×ÿ 1‚tuX:ÍÜ×P^ÝÏÏa‰,Œ_ß݇ýw þ»w‰•fî&dÊð¢ìù‹Ç ]œßcZ1<â>lá†à@ ªênfÂ!Õ2ƒ3ΜÙërïÛÏAò0´o^­é£72Ød‹F00Éûu|À:hyaoÇγñÒ/5 ¸¢ÒÁÍo~¿NTc ~7{ÃD³^¨HŸvHäædÀ…jCÁ2o~,Àeá¾5\`ÙÔK5‘ûQÝétÓg½§ÜŽÈ:.ã2wX’`Àîz–V»5ÉšyÓÚÍMY¨û`OºÑ´©kf7ˆñå8{×Þ/ulC½=]„lZŽ»”7%:ÌìâK¿:z:Åñh©}ëÀ'~UZ_˜;Hî%5µ–|q³gɸu“Ú,ñøoÊ=]4“þ‰MGfïÄì¶ðf/_ýÇÒÿЬÚÿnGd)—¼iú"·}i]?Êz`Æ Ý—ûZøÒQMû²F1àU)n£_Wõœ=÷ôŸYŠ?¨ ¼Lu’a^.Z5’[vü€Y#üa¬¾YÒÊ}„àÖ*i0a*ÁO„£ÿ›&¼o«CÏâIÚÂk¿xî@L ?_•lü.áÚ\HªslKÝê˜h̤Ýïx¸]DãT‚ÏA¨‚O†Ä„.%!‚ê÷à#z„«UtÆÐ8ÉÃê$•ê=ØÈH0?:s³;0^]BÃå}üA»èy¡MC§{R¿ßCþ¦üãŸpp~\¾ Bc¤9b=pé@lƒèìjëž ^\g–-bØ4úa.ñ²§Ùò­Ý‚f¡<èàç/ž=-\äNÅ_³=Ð׫1cº;aíá¦èÈÆýF9cEÁcM×)0±ºh·3ó6m‘k§L9¼Ý¬÷œüVãmG.&E£ áeîÍÚÓnLy›y‹«âî†Jßm¨îÔ} ‘xÚ¿Slèà~©0ô…#Ÿ‡mÝBúÍLÜÇ{Ff-"ûËDçÿ@òhžt¼55ñ3‘ýtó“ÃˆÃ»ŠœÉÚkDf —o+)c±KëÕ8íÎýE'žgà\Wœ½[œ´~Ï…°¸ÊÀ=ìW ojj &¦^n<]]™¦~Â*ÌgvÙ™¿6˜}Õ"=ŸÙx  ¡5—Óä<â/×úåÊpóJˆõõæœ&úGsX\:vbƒG5æ¼2…MÞƒ (èWã'ñŒæÖçU¾õåì£J·Jnq÷2G›š™äÖ΄Ÿ"iäÄWl]Ì_óbVŽ¿Š¢  ¿<:Þ—q_KnÏ:hïÕ(<ûCÖ¼£H—à!íe´k"ìôÇ«KÛ4µ6íûAÄÎv–UX}` Félrû8ßäh‚E¸@Uê®ÿ»‰}c<>ˆà¿ ¡žpg¡„… ûÕÞû“ÛÞûüŒQ¤øÆ”âÕ;xÄPs)x¸™563øQxEÝæGéC˺RÎDWQÁ´ûljBØÞ´Ru±Ø:߈AÃM]|²ßˆlu©žÿaˆTÈ[*QŸô0ºº’a´sœ!3MúA‘L‚9Ëî¢Lµdxåp3.v¸X·'"y–@ÿ-_ó³Ô¡e)±bàÈp:;„¥¤¿Ü€p:_%gÆbBßÀ„dÎÈÐï ä‘÷¾ô áÙ!j)jDHU{"àšd 6Yk£3PøÔPÆ—=)F,Ç`‘Ý„ '’sÀ½mVòÿε¿,ÿŠL =­ájUWÃzQYÍ…V”é¤ ^¤Èšn¯‰GÜÚûw¯Àëe†^x]Cñ!3÷Ü*ÁG—@0w~Ü£ÎvC*r‹Jãöêu“ÅÇJBá7»^k!z%ž+µ¾¹¹†ö crj&TL¸5$—IT(p8¼®Éô×ëuö GæÓ¸³äùõóg"»ÈÞjɪܶ–¬Þ.â†]}hRÊñŸÇB‰RBó\íÅÎbØ2gÂèHâ®./²ÀªÊ«w³m6í4úŒ-”ßýÏŒä7{ŠZDqoBo¡m–!ì5ô¦"i;@¶¾ñÎ]-!û¡3ƈn’KB›>è|Eµ£oB”üúTå|°Ûd`òS÷)ìC¤û®#¸ç7AÛç©I›Y°“ n×ê/º_EñêÓc›KÀí¼Ëb©ÙÄJPשú.ĵ £‰A@ŽÄó¨l”dî¼¥pÇÍ“ Åý‡(eLÊS~°oç(b¡ÏžXÕ¿uÉîü˜°}f²3ö‰Î#>· :ÏòLqêU9ÝDÎ/´Z§®ã‹¬¬Çq‡ÄÌXŸ´‡(òÖI˜&ë\ F¿skvÜY˜ÇÀ0 œKWu‰¾XÇÃ{ª½mq½;€uB3JåšT|˜½²ÜXÖÓ®yqLÑ뀡ÜHåxéØû5ÎÞ{Ÿ~ÂüÐ*©ûÆ%TÎÏ­Úï¼3_~Á_{y§„dÁ§±°çå÷™_'wv,oÊÙ/§)4ŽØ¦5é1˜w$5ãÁ¬EÙ0÷Ÿ¦ŒçVæuØž®”¿`?Â7/àœ½é<£:xq¸Lãç‡ïBåí.ôÿ O Ðó5vHQM‘Dø7fr欓ÚìÂå¹ÛÚ*¢˜|"él¯zzhŸòÕ5|F9%Œ~ä4D)àÉêý õ Ý(HÂwUu‚«Op äMïû÷#@ÞÍX„Ùõuíãz|o°6§©¸*ôæØ\X­‘ÎÑb÷¢ç}ãÙQI¦|óãl¼ÎÁ÷«¨ÖçoŒ“—•Gà$5·¦ž\6—.¾•…C×DQ° ¥i®KÀÐÌh=¿ã8èúmhÔk( VÙ–l v ×¹f9g`ÖÆhÿ›N°ÿgïmÜÖuQ»ÿÿã|°%/’í$3vuž{÷éj3‰cK ‚Àíõ©“ª…ôÔÍpH5ÛÔ.ÿ`ŽG_m½¦Èé,ËšMª¹3ôäåÄWáÆ;£V¥ÆÎ½ €Õ4{"ìS‘›ŸÈÝœ¯Ù¶­@p—¾O(pyÇ wëå\ú´T_‹‡l:È rô·yÖx#' c‚ xûoZ_•3Dzí¬ýr%—zA©H~)½¿'¶> DÀŠ_a©uñJ]‚[‹:732ôù"4&F&ªU²B=|4Pï/Î|¼ëLhnÑkµ¯ÚÎ_‘Ãfª“ÇR§‘6ÿäUÜ„ª,S}–þFìÇÈÃÉ÷‡·ôm¥ Ûaà‹ fØZ»Cã§ ØM•¼|¿!ª#Wõ”·;w!¥Žq¥ ›ŽÆ¨Ÿ=~CyžNj¬°R¼ã¯£[îâ=az^ERÜ HtÍ ™,á})É׌˿úÄÀ‡ƒöÇ­;ANþ¢Iª°®Hn&á·ØÆ}ÌpìÌG7®È b.À7ñ‹7žý»«ìˆ*GìÞ«r¶9­mOÀè«W¹ÜoàÌù7/M¹e¼òûÔñÏü)Xͬ4%òïçHñTCìßÏÏÚ /ª`éÉüŸ]ÿFþyá"¹~ÌŸ~΄¾HákÂSð{^8÷‰ššˆ ¨z‘bÞ@ægVÑ_+:ÿ=gÐw}’@(UèÌ\…>ô¤ê&»Q ×ʪ3²Î‘‡Q ÚçŸ_E–? _M/àBþü•{ÿ-—MÐP[ªÚ¿+1Ýðe7·äØbñËb@ß™±©Š,~݆+8ÇýÇä>e6ç¯ÀbOèϵ€ÕB>}|…7aäf°á Úfĺ@}|¢yf ÎÒC>»X m»Ž º¾½ >ÚQª®24ó]‹7‹mÈK³«Oj¦MÖuüz¨äL¯)BˆV{êXP{®œh«ö-ôá6ì²>D2>æD¢¹ˆ¬p©ð» wæªyd;;‘$DkÖ¦amŽ¿Š½Q¶»|Ø!´ yÜ~svS·ÉÉÛïD:!cGÇ2BMGºùÁÖ§ÒÏÙw)ôX#‚‡M÷Œ|Û3"=M¿÷ìÀ/Óûj «wtAý.Ó3æÆ)‡îWÑÛÇý%U•à|ëÝÈÿ³aÙNtIaN8/{£Ñ¶ ý“±L7³©ö½TéÀ‘ õ{x5Èßù Q×;lŠöD“v-Zq‰@BC†æ„‡T´idHèTÛ¸þ¥Ø¯ #k!Tœ™:iç½Û«öOèè™×Œ §™N9¤Xñ¬)=‹é§Bl¶}° Æc9ß` {TzßyGI0ÄHX “$,ußr÷Êø½’”¾:¤+Ýa-Q07!ëÖ0"GßÑ|ïÍ:r‰án{h›œ¦ÇHüVprBdáAÏ<ºÓýÕÇ0ǹ¼Æb.«DIÞ(*]·È®ÂPëÆà6„ºzQ˜N”âqXܱ]J&_ñ0zjy{} U$Žà¦]ßrgB—՘΢ßêñr±ÍãHvuB4±Tv‹¤´Žä_M7‡]5#ó0Z)ŠcT Ç7æèD)QR üWãã‚1y¹Gâö¨‘oš›[+¸‰¾ó®äGàÂ×v…Vµ@Õ?xGîDLÜÇ57½”B‰¥ocåz¿ŠïfÂ*âêj“êo%|¿.…ï_ìKÌoã8ʺL #ú1ªd±¬é1‘†+ÅCî|ëû§š+Ô5·=’ï t««æäk^[ÎŽ£Éb¿ÂžSzÊ|@Âq3íÿtT¢×•C÷ÓÔñè†ØÔ#˜ÌëìTBW¼lÛÖuÞy®.W® òau†p‰PQ‡ÁJÜÜÈïfíæò<÷饳ûTO7§Ã7q÷eÕ¾4ø‹Eç¯TU'˜DÑÐ’ R¾±ñ€Ð¥úlÃ"ôê°Û(ìIu¥„ Oj[±+2„- ¸ÔîéËå„©8$€$ºp;}uïç:À.üÁ'b •d«ùš°Ú”ŸèTÚúQ+¢ |ÜþâšlqgÀ®œ%KÙ ðä÷6C?>`¿õòß#&Þ)*Í^†4‡w†˜§DˆèEÈN’wº‚.jŽôÀÃbÄ+­NZå¬!$xì´mën½ÚXV¨Áÿ}Á˜ä‚xÔ tÈæŠàáÿî‘.¨ò!t¨Ïbv¶­qr4©zàe¸!G÷”c€€:÷Óëí&ñ’ÒœÖ4‘ò_$¢hª¶ZJ ®‹Tvù gìú¿jë ª2”^=žÃ uBX„t ›Ï`•Ïj;¤ÅØ¿×ôtÓi£|SrŒëé·Ûa–kα™°´m!~ïj›©·3QìËŒ×!V:_Š@Wà]›CÁ“Ó#w/²À:b3Öõ(ÚC·˜&kôDz›Õu}~ÛW 8EOkt ¡ÓmhŸ×îØd$ö(c^³"+\–꟨?Öw˜4üZçéæbAŽ–‚y9UåjÁ°¾@è´€©ÀÉ^.×¾Çpyýh"‹#ݪ«&ͨ±çßè}']ç…ØÓ˜,QyàØn£kSsuѵ­ÅJ$‹Šçé ü¼6hUMøíÄÙ¡!ø ª‡?û*¸*='7­ÂÎxãX1np[8 Ô¦8D…µÇ~då05HPÎ#Í÷ú ‹×:-ÀõRmüÝ¢©R!3ÁÐçÑŠ6¬øòKTŸŠ]h¬[ÑÒw`èØcȰ¡o{ÛTj)pu9l ¨¢|°¬¼)iòì&ÝXÚ›lK{Ût‘;·s½)—-_°pcàîNºò7f!Œ[ƒ×Ÿ)ÄÞ­ÿMÑù—#•UöWóI>Šyßðóö§Æ„ä#GЯVÁœþI›"ÔM@pÅsz²u‰Rª±¶—'p.Ð&¸|E÷U”Iþ¯zs½±ÑòFé 舘Åá% kTóÝ5ð±ªá¿ÓøBå=|ÕE¿ltÂ/¼®ŸøsÁý¿+ëîýß$t‡»x·ZôS úóѵs„®ëÚ ªA™Á¡ùZ™ÈÞœúA#-1WÞÞðÆ'^øV_lïNÅ2ˆs ñdë’nÎ6sÈ5°Óq¶ ¨ÂÞ±°9-;ÃÑV.¨Ó o2+×!ºËÍ^[§¾žÓê$hÂ0Û¶An:40F)ÒúìîH)q”–Šãö@;ÐP{­¬Q¯vèTAN†ùž³·uºàvžnmÁýä§ ™ ÁV9ìÅîX‰ÁÐãqO@¥?|ž˜Ñžzÿ õôæë^€£ šút)!“¬ÛxÜÉËAzû¸–ÚºIì˜Jøû×ÝNOù¼¶PÜ]wü€2QºÈ?_ñè휌±0Jºáà±bÒÿžÁ¿ŸËuCúÿßÏ¿Ÿ¿oÙ‡|áøÙ6ŒlçÀVâ©Ì£â³P_’ßp»þÑùïJjðñµ±˜Ò¸Ó‹àÆ”íPj½ó¶l‡'ÌOh=qÒÖ›Øæ$€<Þèÿó¢ñòoV¿ˆÂ`¾|\¡ƒ_ â-Ê}EÓé EQ-×6“?P¼µ@Ÿ¦•r¯¬TP†Ô×séowJY̹£BÞ R¤¢Έn(žd— —÷ïSZD`™éüȰ1,ó—X|©J|ˆ"oaŪ2§Ô‘–åÜd1›ÈzàB6Â`©;Êú¢ŒDùyêùNĶô;ºt!+vEøBªkU.~;aq¢¾õWf—$Øþ0 Á©é”–Î A6œ}OsYc€@'“‹aë#Ž«ƒˆ `cåGg®c ãÎÎý?õ†¦N¹’Ä‘<)ä<•dúÿûX(„r‡7weÉr÷Ø{¼_†¦º¶·¦5~væ¿ïÁ´îÆnvhò‡iªv­'‡…Íô¥ ð´+¤&KÐÖ€uèñßNákrnó¶4ÛÚï„!I'…ÂÞ H¡|Â8.ƒÁõÔ‹0H‡h?uϦ!-åÑ`¿Þ1B¼L”Î(­ƒ-ƒPå „L'ª ç3¹Ù í5§S¾nøð™¥iz*åa÷,5’sÞ“­¦É1Ê!:©1fÆù¤6›ÇŸ"=PT /~4‰ˆÒ6M ¸Í[e ~‘¬øY¬ ßÍq‘'åÜ›Ýü|ÍÞ}úÊeëÙù‘/s`’ZѹtFê™]È;I º.'¬ðþ5VùÄø“YXïéEì2Ñ:±¥Ûd·oÉe1uA¸Õd‰FHæu¬ôGKfTÖÀ,ªÝÂi7_¢aiЇ®±æLðî‰ú˜Ÿ ñl=VšÎˆÈ4¸ú|„/;\Í YM{JgÊ-CÑ e¯>ÝP Qÿ¥Tþ™¤¡o"%þ®†ÌœV0ÒJî¼_VLåÁçÑ¡JÒI·?}if {Àœa÷=qEŸëL$™¤Ù#†È/½>·<£íkMQÎ.ÜgÐ×Ê?^ým„ô]«ÛˇõË2ú™'N&0æä‰·r„pØÐÉ¥°G*ÌÅ…©xW‹œ XUZ.¢ÿ#°1|<Ëù¬/nÕÂŒ„ÅÑù-0à©óË¿ñCá2üxÄ·v i^¥#‚ë¬LPo V4’Mà™ó3~E?^tÞ<Žø-‘)g×þâ6¼–Ó,g"£ûñ<¸;¦Ø¨ÃÒcw´I>À¼à2áo‘,†Ýüúž}º”ܸ3ÿ™È2Cÿ'"@C¸¡[MÓŸM©:Êùp‹ö$ý¥Uh}÷ Üx7|ÃÃ}~UÓ%~?ôW¦ó…Ù ž\ÙlÛ?C|É­ÄÇÆG×Û÷þÜ]ݳ~è­“H7ò¥¡½-¹£ó b²ŽYcaŠÀ&“ºíï^T§VU ì”në&øº½°Jè?Ø~È‘^“»Š:ï埸u7`'78­žæ) OkžžIGvÈãŠÝ'±·`Aô¹æ÷vz{áFüß® N¼p0æ¨x¬Ù^ÒWJ¸§›IÏ•«å)O´.úW9¤ŠÔ»<‹9ý–¼¡·4º|­4¯½ :Bv7„·Á¨—N+Ô©>{€­¹ öN¯AñŠÖë¼+ÇTÉO¸¡ÃDZÌÔ¾f÷´>šcˆïºÂ„|¬H´çVdê.ï¦XÐÛ ‘Ÿ1U*©k8K¸ô›¸}’à¦N-úBò ´wŠz©t¶‰"o<ù]› fc‚û؆ —ôFNî ]/ ïà@¢1\v’·<¡gj³e¡B‘PëTλ^Õ«÷ÐcðLà©y™óônEÙˆZ‹º~'·çE¸Ø‡Î<ì> GÁä£I§edÛLLrœˆ Í¡ @¦üh‘e5xï®Ç/ $¸«þ?®h¨âFsØ5û˜ð½~ÌvþQ‡Ç‡4®ÃY8)ÝÙép=›Ý¹ÒÅLº0 í&øc¢Y$ ¬íÓ‡ËF*ƒ'¡³Çó™§ï£^ Š-Ôr®%w$:#Éæ5ÁS—(,×t¥À ý¯¹ƒ»-T!0Q’}³\lÉ[Ï·’½~ Í¿s4¼û…07Ý£¨@ÖðLѦËz sJ{›Ë‚ô.u Èí LZ)ú&µ+ejºYLtǹ@´¹*>5í¼Ì/áµKƒ–U8þºŒŒFqÇH”w' —»¾-JÀ2'ÎL¢>[ýk_Š¥:ãaAœuª%/eÒ§ú¹°*:ž’§{˜o}}ì.ÜI³¦ÆÊ¿Êz17àƒÙõÛpê/÷)Ô*i!´êÌ*䉙±ØÑ„Ât¹Gªçx~ô~‡³¯[_UA\š¬€BjË.’à²Ð1§nês:׎udøáÓTæ¨þ¾5|îMþîñ=V+€O—7/þXüú(ß‘Ÿ§@yýÎ'j¿Áq*{ù åe‡Â9ó-×éÛpÝlÚêáÓh—NÒ†Òƒ[µPŠ.DIŠ{urþÆÜߨÇ;ñ»Ù=Øõ‘Ì穊mRA*ÓÔ¬ :[¾õbÁè´älÃÁèǶmvXýòŒy«C¸„º1’ ˜'•¡Cä6)?ÝC kÿüœÍûIÂ5G.C_<6&1Z'pêMsÖ%»—ëäß¹§üåé4L`óo<‹ß üÒÖÿ+oŽ)&;ã`´o¢ý¿ùoz¿a¨(üw%Z¿°Â pä¯=jÒÈ7¿ìÅ/g˜ø“ÕÕ]pú¨+®Ù_‘Cò/ß¹GXÞÑôZ£`?w µÉôg†°ÿ~~ovòí{Ä÷9ø!Æ÷·­qÜ÷ÐöøáÛ÷Füaéd+jͼ üœågŠÎ]Nøò×½y£ª= ¾ÀuȺѮãÔµîå™]•wêànV{¹5ÝI˜ßèÿ•Z}‹7~ìÕð|–e&WA0ÝꀼâdðsZ‘±BÃÖØ1¼Î¥ª Id×h+¶(îÜ@¦«A¶ˆœ? .þ: VNÒÍu;¤úÈáÉèYÉ鯗Cãîý•Çà¾1–p†ªBYD ãÇñ:bá\=¶ P<èöúf,‹¦¨!ïP³âü®£2Qà‚-HÄß©«¯;rÁ_*üežÈF1(¤~è­1x˜JJtÂh}:åa«Ï¼x.vƒ_w¡·9Ж»|£¨¢_T&%~ Ûw•“áPzàh ©l069÷Aˆÿ¿]íneô2´“ýßÕè*®ïCߥÍLГÝ;• °Èo˜?Œ'bë˲CúòÙcª±õ æ^g.î$ô”á0Ì:,~ ÿP¹Âý°·!ùoÀ¶mCüGf?ºFD÷ÓQ)á0Ñ 1 ¤ø$‡ÿú 4N§—Îæ"}z{mÛÙH­zòtͯ€ßkœ]Bà L xˆB7aïxÀÀ.ÔØEH¡˜j‹tQ*›Qfi.@>ñ8â1ÎCÖúk–Õé_­zKšNs¨ìÌ€¥_&ùSlvš ‘!ƒ Ojú1ìŠ2¿è¢mñâØÜžbž ÏŽþû©t8ynVl}JMœƒôfùÎч¤ë˜My£¸£»øb½#Næã/–édMKfí¢#öBÞ½ÃOÙ}b9H-§Ýáÿótx.Ò{ÜË€Ó÷­ÅR&Þe `üÖåhÖÅŠ`Ø™K”…÷¾VØ·ÃbÐWøcbkñ™~©€ìPž%7u3’yFŽ^åÄuÈJ3ð×ÉËëU à{мð JñUÞ«Ø^9”üÊ6笱„\Ò½3n"I/†ÉªÜÓ7¡«0ðú»)ÕÜBñý‹™Z˜w¼Ó昅º«qÔHŠ£ÝPŨ«ªaYÜ9QubÑBÒ0[™÷·¡sMó=€Ù“õ|ÓWV7R{2Ýίœã(;¶$$h qFùƒUÓÊ/†B&–µÜ½`ÞØ/a°¡Š3ÅQÝ”ñ\(+ ŒãŽJ9-ñ×BÐ):oÑw.Z+q¹» ›òO5ß«¼>ù¥†Óè´·W>D¤sÖã 0ñNL)¤ÜIt)WEÎÂY#ª=×!F6J[½ï‘úl ô‰f†Ñ“ÄøÔØƒ¦ª©®’¿‡”x9„Ù@¼}|Á´†1+°ýéÍAÝYx7½Õ­Z¦$X½-Ög~~†¼“¡¸‘O4^gm¬T7îî~„½r­s”¼Æ†òn@?7  z ¹òCøâà˜õPüH&d ±Ž½qÉ7áD4z‚‚ h­Ÿãð‰ ec×g˜ †¯"T­ûx ÷ì:ðAôü·}ØýÿÑæ â Ìg ˆ1fÜls‡ñù÷€Ê(ô¶è'å!z?è0„q›m§:ùôVÔpF^ЕµÅcYÞÜé^æ™âÞúí5 )Xˆp¸Å[”ˆÖè̺¨bßH¨ ;Î? ÃÄ:¶1°ýïDÿ¥÷×¶„J&…V!µ³ ÓœÅq®G»G c% ñ¹iuU¹€ŒhÃMÅ0ÿO!U߇.Péþ+ÞE…cwfÅy A\v(Ž5ô›qT5˜5aP 1KÌ=Ývÿ˜´r‹ÈÉ"MÙçxŒQÿuÌý¤dé,–ŠQQÝ\ ôìçÐTyyÔç†:¢ˆt ‰ Û~ÌIo(šãhºäb:Øçr˜¬2ŽPu¸‹“NôCXÔšwNÐØK‹N`ú†7ªº×säQÀ»H£C}Ö«®?0bq A(Ú©ç A¦¸‰8Ls٠ム­¢;¬2Ü f QÈ™ltÒ0JJz©ßëbý¬½5Zaæ1øÂ¤¡€Ý3ê7G(3çsbÅݤG¾¬ú溉2¼ ^ã™ébâ"@¤ºjoÃRtjt!2$‰ÕWëY“4$L‡Äâ sYÇŠ?gÆk1hu!Äã!Ä¢°K‹Åœ.;ìINAÌ ÿ3ƒß¡Ÿ/$†*ëAêÜu݈…¦9ç.]Hø³>Ê.ÇÄáxÖ‡íU›¤Ë{w¹ÄjsÙÍvç§&­±êÕÄÔ„–ÂÀU¿¨”é³?JÔ§¥^9¨N·=˜-* Á>á¯X¼µzs•„í¦Ÿ“8_/< JD]D¯zfyºâ¯×‡*[KA^F$¥Û;_¨U_„ËV¥Ý÷«¯:Ù(> äãÃ1¡]wûN~¹4}øÃ9ù_bH& и9=ä騭&½5C­ðè$·L5¬ ûH`b•Å*YJq‚Ýg¿4nPú!é¨÷§Ÿöðõ;ÔJ{}?Æœø5ìßÌ࿟?øá£žŒ]å7ÞòõºQÞÃÑõ)j:}4›ãR ¤7W³¿ÔÓ‚­RÎBÆ ¼“Iñ™3ïžþlÿö âæ«þÈuƒ'¢â%-êôxJ^«‹ühiÕŽ©ÿ~Þ<ËRü8ðNþÅ.z!3¾ùâ¯Ó’Yµ®ÃJí ÃÊ èý|¸ =o~P˜Xåɒ! F^-ʦôÝ¢óßžŸÑqðòæ}44¦4¾~qb÷xÿçü´DÕRšßŸù·ù5 ޼/×Ê~µ²«WTÐà:u¼û WU gìWõ(í{°Màü{ŒÅ‘½»!sk{7€µã¿[.vÞ5Bïþ€ ^³m±­){Ð}k•¿Á`Éþ±ü†é¯‰ý¢/QÇj’ÀÚ@Îi)¨½?<Ö#å¡Å.Ñå§ñ«ÛzϧPªXo2뢱ÐTÊg"ÛǦ9ÖCv}žŒØÖ‡ìp Íl&.À¼>Ë}tç•.Ù ìÌPô¢þû©­33†•`7Ë š€uîcö9˜À5 ÒÙÀ|Ã*QÕ³¦¨ŒºF„_Ïçü„ÿôaûL—EûÊ_Z>—³™±OÅóé8F.RÊŠëo|uJòဳ:†€’»죅ØÓ üÅâýÒ ù¥ÆÛµ“[‰ñK¸-沦ާ!Áµx××ÁÈl“ƒë_ò-ÊyRùx{½ý ¥lˆþa¹½A‹âߦêUöÓúM\ ¬¤-&pc›GrnqGp?hä@>ÔšÏDÕ^¿‡ë dñGÁ×®/_'þ~G¥½ä>óKàH~ÅÔȰxþ¥ùçµ›±ÄÐJ*øEFÓO-ö8 ªƒû£¢‡¤µ²0XéÊ?iBt2òBÞ¶Þâ·4Ìxëg‚W°PrÿD¶ô׊ÎÛÝé§t̸–¾¼Zb‹¶Pf÷÷òÁ)M¦/˜x"ªßûRÆd*ÊJ¶;´2à §œ&™ü‘œ‰Ût‹up•` iÛv·?qÜ=ùÞ®NHË¡®z)V‘‡æÓ¸­Ã[2å¿@¥í£Š¼f«ï‹É#§«î"‰š÷êÍH)˜ÊÍE¤ê-Ir›¿RtÞg’x©9r·_âo`V|bQ˜ÁÔ¨r ¹lÒ\ Ј„ØÊ›„Þ¯BsuBHCå¶é‰€…ÐèõÀ ƒJ|Ä©í(ïg¨š×­«ÜVyF&…e¬ñ4\Sœø.²®}¹xšî£(¥ºòTCˆ•Ók ðß¼ò¿Ÿ?¯u8¦BúóËý¿0ÊòB‡tÆßV)ÿ¤„†PóiÄÄ"w v6ÑFºÔÏá pa•m2MC0U"îØ­Á² »’ýÿBTampÈiC4ñ€{·_ ùæ§K2b<‡•.#ÂÈÐýèæËɇÐåý"(îˆÍªP©M»î Cѯµ¦üÓ´N…ðyË”é#脉äSÀÑsÂîj8®v?Û6lÿÛ¶ÿá›È ]ÛÖyuOvÜ–Yb=}ñæˆõ}jbÑu›Pm‚_ûèÁeÃ4ŸÚÙÓ:‹=¿}˜óeJñûŒï“/HJÙê‹T…ÆÅNQ5’'K¨÷ Lû|v·>ÉÝðÕøã&f Å›‚Ì":ñ¿PÝ}ûâ{VéÕ²Zè+/ß•/‰?däúAþrûýÔÑË·‹¿Ç“ßz80V,K™¸µ_–³Þ°W“‘˜Ö €Ùz:ð|‡Fl®hb­y³û®"XšèüÌ屘ø¨{ðoØ8xÏ#š_vÏ+R?²aCõú¯û7NÓE<¤kƒeúzXùƒ–ÎÍ®áüŸ†«×9k9—lšÈ‹só+ü}¢ó߈!Ù£ÎÍÍ ƒ“\8Ï8n4ž÷E'8µ„_ßX¿$ m=PvàÀq×ÔªC‰ÃyßÀ©vPÁz3ÿZ*u?{A²VHXçûtî©> Ïð‚¿˜#˜Ù¦:!­[kÖ©D„mwwØTf,‹.Ÿ½I³…G±Y²Æòõðª€Íf.”Ë«÷ÀêªDóa5¾V‘ö !¬ò\> sÒƒ76V:8K^Hø?È_œ·òx`#?u’ãT¨î*f{K{ZYgÕ”én,¼ó8ðRDmÊÛr½ªÊl i$fͲзì³qÈÀ—jË}Ý6H»b7µ¡só3¤{~˜—5"@óMäÐ5ƒí¤í<þ·ÉñÛ¾‰1ëPKˆSïôûJ˜8a]ª¸QŸì†™qç ¬wNëÞ Ìl¶­ÇâÖéÉSûvÍ2t@‹NõkèäSþoãæoCpgìA!ú÷C|Hýè çƒf ?Ò¾¸11ƒxè9Úh÷ gs ϧõ¤q¨OÙáÙlÛÿ°Á¶Ã§ 9CÙDŠÏ†Dðx…¹þNÞjì„:Ã?f¬©æ¦êaH§g ïÖwDY¼U‘q$ø‹WE¸GùyXëQº=‘€[‡ˆb€(8¼¬ç:Ý/Z$x—Þ=eÕ¬µpÿ(å›O¿sô*§„Àê2ïjНAwE­Øqbt1¿¦åô%Jäú¦¾ÖÐ3Õ*'»/Eõ†çü|ÿø^ãƒ/ԻͬóK€ëdƒ2õêóÊ,Œ|êp=ÏnÕD©”ù{<1lÜ}HO1ôµŒõ²¼Õ8jXQ) j‹7ÿ6ð)Šÿôœóß_§tg-7?v àÞùð¹A©#Ôίaÿ¾9™¶(r²0x LWKi¦º‹ÛñãÃ+ÿ¥ûUýõBIòáÞÿ»Eçfg¿ñ¥Õ³w–'®Ô—~$uù(à-¶ˆì"O‚{ Ý8:wîΖ11T#ý¼•ëëØ’ÿZ  [Ð@½I‹B÷ ƒê2käéî‚!YœÊÕ(As–›$%ª‹¢¿úÒî =ÉÑÅE-ríÀ¤ê>i2FqÅf:ŒÀòic¡x„êÚ1¿›°Õûãú®ó ¢ê+ë.»0øÕHŸÈOßžËmzwjÏåd[‹ïš†£û‚A6ê Ë:¢x‚ôäÄd•°!ùÈZÙ,fÏ«©í8¶&óõxÞ[³tcªVIŠänÛˆgɾ[·åB.a°ÁÑí »ÁâÑpúÝ è*oÞ ¶ïì‚;Ç kV»†qì4ʾ_rFÂŒÒHh-çÑâ úªïû}(n»«ÎFœ‡õ¦ü P•6¿®`Ôûs°6©žnù¢Ì×xßî$R®i%©Æâ‘Rh¬Ñs€‚¡¥ÜÖõŸyÇ8D‹6Ô(}it”D(!~q†RÊAy¼ˆrv Å0êNèfÔu.²—§ü‹œA‚"ÞóÀŠÑjVOð ΙÅL».§ò7ׯ”æ“‚¤äööÚã`èÄäÁÏÖˆæ Šd„´7j×P²ÎLüÌÕð>5».ìxÐúZLû¡š¯_¦I•%Q÷?)“G&Ȧ$å™§GxôÓ"cªKà"!M«ôÐi¥ê¯lÿè3Õ;µpÖ<=¹,æt0‘ô k@Ïõ9Ü̳v²ÅM±ÊwdÎ#1Ï…3ä¯å~‡²PŠ #.‘¸ïÊ­sÎikbé9‡ùy yw¯·œ…ЂsKX•P¬’I±µRÍ$DD5Ù¥ ÁRú_öo›]¢TJ·®æ_aì¦ÈCósÙUÖVo[ÒKNʳ¤°¤TJÝÁ@ÇaZ¬äÊšq eÊe ƒöðÓ;_Ÿp*ðGæ#7l|ÒfrCµx¶"ÂSÇÐÖ¿~ŽÃ(@ÿóv{Q–'»NÀëùI´ Ž¢SÃXÅI´10^'ç¹ê· :VÚIÁŒ:F½¿‹tÓ<Ôp¡ë•×L8Êgò2òb ]Že|·ë®ð¿!:? ow"×ÿô©þY™Ô-”—f´äWŽ6ëÙûIS¬K3{$Ã?‹ düºDyA7o±"I[˜oá€SÄøæq%¬_šÃU¨p*éÍ8s—‡ýeË Çèç‹64_×?áϹ ?/¶½þ¸ŸÃü×Qâö½º#oB%œC ƒn®·ÕˆS„Ô”i¤(CJQ\*O-}©jÑç NyvÝ©ßjŒ(Ö¨ùÒ2†‚Ôl‘û;‡‡¹ÝeˆAC¼™ª”‘kW ߆šÚLcèèêò•êîZÉvÖ¾%í‘ â ÝvAŸP7¡ÈrjîÌ—´ø×¤üÄú·ÿðF~êË*Ý£>ôâ÷:.=˜ïò†z6²`¦ุTýà ý(ÄŒ Q²<(‹Šáwù(¹ÔI†/KØõ#ˆ°cFu]iýTÒÚÂ.ðN(÷‚6§™cŒõx—ŸxT‡¬â÷)9çš§á;ëØQsÝy¤Åÿ]Fšß”½<µ&ž¬T ÿKÕÅœ]qçF{A^qx§òYM”J?|\PÕÊ’œQNh,'«ÛX8ˆæâHù#Cº—ãNÆø3rè÷6çB°|r«KèyÚ°D-5|ðˆÄTЦ.oÅ¢Wåª^øÅoŸP¢ ^ø‚÷R^\ïœ%—¼R™†º ÿSMð ÔBáѰš€8ÓØôD¸sIPu£;¿ÂËLî·*ÊæAUŸf-ÛÄÛÚeÿÑù;ñ7>óÏ}òw¤}ÕÏ/ÜÑñ-x[ðÙlˆ¬êæýXW¢(¬² Mˆ9Mú<…#Zˆ0¦— ‚(Ú@º¢;Á°SB‚¶urü½gÏÈÚ›'ñ¼õ®²^>‘§õø¯›à~/y/ÉÊ|g(ºñ±˜"‰Ñëâpñ yç~ðA‰ûü6׃Laå­{ËË Ârq‰ª±3»™ñviþ.uFEe?ÎZ—‚4lO«gõX`¶³‰VµD°æÙþõБÙwšqç>pù£®fÝ'¢|4Ú6t fÜ÷vËÐî3Z÷š2p@sÔ†=ä ®[Btƒ"Ý÷×Ûfã¡fôiÂv¾žŸ®ÎHÈo`°ÁN“Ü­“bK@˜·L€ªGãd–äŒRn+x–ë†mÃö?ÃÖ”ëvwŒ:j¸KU½e°G„Ñ„õÁRÌrÒ.š=ýWƒB¼öBpïõ¾„ ïþókôí¦¡ˆ’΀ÚnúȬҰÂâéðîäßCR`â6^=^ÙŸEZ=É<Žû;/dœ²#Vâ7€SW°¹XãoLZ?u³iΟþ†_ AðGÝëBKŠŸùþZ}Öµ˜5¨ç…0’?¡ÞoOÂs4øgÍ£ ÿ‘…ð]`•¥àë6Þ§á7^̼}¸øÑïÎÚdl¹Î â³­ºz÷¿ùŸî„ù¨ l˜ìåûOtþ7žˆwŽÊìì½xdÚìoiÀ.ˆEÀzÖl’ì·¢œïïmÆ ‡]êòÝ8{ˆËĬ…B×u›™} cÞÝwì¢ï…# 0Dmú,aŠþ÷†Ç‰öÌfŒ1¹µ9¥—ìo!`Ÿ„˜õ©,♣ ‚ß¾zK  JÜO_MSÞñ}Gã…Ã>]ºŸžè‹‚wz1Cr/Æá›:Í9Z (&ÙF ZFäý;û\2ÌÍyô¿o>lÕtµÎØ4Ùôb ÁÐ%¦±Í‚Ô:ïžz«Û£lÛ€ ÿÛ€ÿ•$D011>R: +EÿÐsŸ´ë8:V‡…€œã•BÅ¢Åв¡¬8uð,hª¤f hº!ÇZíÒÖ¼£ÙþaŽa5¼[6‹ãgøW‡,ÌñÓåAè¹I8Ö{áyÞ™3(O&9bS¸•ÅIçåð!™p0›+’’…ÒŽ„Kö8äät(ÿÏ»ycV\‡¨³7§·xÈyq´Ò„y*ÍÔ@ªºÏ‚—û›3©¦ÔHŒlx;ø20ÊÈh¤ÕÇ’àFŸàµA¬M9Ô)Y¢‹.Ý÷PBÏ]l S0+É2ê´žZÊêôòz,B º)h^1•'š -³-rF›e5WÅ?’Fkk"—ÁûI»’½\—^@‡³ßìv>*31f©²Šÿf(h«Ôv>S¸÷J}“…­ú„\‚细^"¡]Lð,¡g_Ì ©<¶µ¼˜Þ‰Ÿ¸÷¹e@Ý"ÐÍéÊaó ¿Töx©o"Ê™J nP€Gí¦™%o–þ°O r”R㉾ia<‚.ƒbÖ‡éŸå¾Tû#ñˆMf…Ÿ³€ª$­Äz7Ãîå¡Ã.'‚ÆŠðìÕÛF²Žsb<ªý Bm­Î.´`N ÙÚÅÑ\QYƳ@#Ú×åÐëòêŠ(pdCÁ§7304imd5sÉ‘iíãµmÓ©˜(¦šmX¬M?iÃÁýÇö?í€Y¿{HK¶ Øa´P˜îÒç“Ú;4†tªUrÏž’£=ê¶ë4"ù~ñLÐ cƒÏʸ5¹uh6#ÈøFr…éòxvð"`÷““Eu±¼¡Ü7ê¸s_굡n`aìÝÓbÚ`‡Ylï^yßNb6¼Œ €ú*YZZóâ‘ÜfèW‚ûâý[y'E~”ɸ94ø-±æÉ#d ^gœ]ë–xè‹Ê-“‹à%Š'×1 0 eÂSºŽú£ØGxà¬ÖEÚ¸¥çXs¾£-ðëmójA`¡Ò+'œ,W½³,ô‡Jè¹B-ïO\ãÉ7ýúì™Ç7^¹£Ìå]p|²5it¦Ås²×,¾Ëkø,tnÛ".ºIe™&Óx n©`^æÞ¸Ggã÷tpFᎠ¡ëX£ït3‰û„ÉÝ w5õ¯†á¨®¡Áâ(î(m¾¿@¸™`P½˜íùÌÚ(´kfëC·MyJv°z@¦¿‹:­¶†šêú¢6 ®Rð“ tëN©ž©¤_£Ê÷ͽLä{Ø¢Ã@®ºì;Í6³}G6ÄJUÞû {A°6™¥ë.d§&bƒûO ßNj۩æ¾b×ë9þ¼7Kôûq9[cæ¢]®t8†ô¹+²Ï!¹BiÏÒ ô×wÝ´¡ˆC§³’–ø°^¬€ÆmÃ~ÊKÑÌö]9—N¦äppű.Q>…6Í¢¦¬±2á~³u‘¡joÀààÓµ1K—'‘b̵ O33ÛaG—æL ¶(ÛùU¶­½ ­’2Í ‘¶¼ÙûKÓÁŒ.9 J–ãžWßæ<5—èŽçó›o“©ø(«e°Ò«ÆåÓtkÃMÚ²‚ dz¯ü¹wáø»š6(FÉî±nƒ®d©þ|lõ;I'}pböŒL8`–g©¾ ºêD¼Pª9'"&$<^ü3MA$_ÀÅ«3²™â AÅ¥o¶”+†£¸«Ig1ËÉâÁÝ÷^ggYØN‹luûÓ+Á’Þt?Y4p¥j,}–šån^¾D>þÒJ/¦“zÂ?KA›ú[7»õ"ÚDµ‚#µ ¼Éyˆ±M¨â„òãáEãvÈo´d:¹E6Õ¦YÛy Ð Áÿt©¢Ñ 9¥n €›=¹6~vÊ a&YÓ<DJœrÏIi£´¡ÌŒPõ™¨øêÔr¦…` -CøûžjÁ@7œ02†´“,LðnÛæZŽè.ä¯lO¦Z¨£o6ìa²òMÑ­lɘZIIaµÕœð2lpwÔgîãèÈYŒåè.bùK Òæ ÙbH?øðáQ]ø¸ës‚äÀ8pº ûÔ5Õ¼oÅ:–iX`SàØåÊ p¤Ñ™W©®Œíʺé³Eók®JTÉVàV¾Xl¢!*G‚ráV Í‘´wæçÿڛꉶe- ¿Új¬ß£K:m½¡Ÿ‹Þ:à¿ëô,n>nG«eˆ¼õÞ¹mTLdÕºÔ±:E!¤”w÷Ø ¨–úÙ ¸w$¸tãÓ)û ´tf±+'É´ï»ZEŸF¢fÁDìÒ×n‚ @Ÿ»Ý$e;ðmBþÜbxs½  Ar†äÍ¢©O1@-QvTTmxÜ…x5v_ìb:ž§óa±8©Â’ ¬šòiµóª‰_‹úNS‘Ùæà ÐÄݽ¯@F§¨hœrŠS÷ O×ïóÞîX‹½Ô«÷u½hpfá¸U®Pø* ÅË–äß%:ß ˆ—Ž¡’U×äÝÜÿ…>ÄË“‹/ŽÔ§ýúçW“Ãñf(¹a…Aé$Ú÷~Y'¦Ò Ò8Αt¢BÅ(X r¶( âcå…)ºÇã¼ê RàìŸ *öÉrüçƒçkkÅþ¯óc^¯Ýë 9¼°Ãnø“¿7(»u3Jù[.¯×½µøNèÆ›„Š)þÜóF]ì߬¾%Fêçºu0DS\@RÆ.ûßî‰È5P|ïdÛ†ÐãM~ˆN„’}º¡{ÃŒ¶Ñb»¦}ôÆÈNGèÌêOKà6õ ÊÀÇÉy§Ïö¬Š{žV‘Ñ­QÍn‚CÖ)OUi<ýÔ{?ÈÒòT»z“S©ÏŽ0\Cs}™lýÈÛ`;Z4(–•>”göüe¥Ï¯cLTIÃòzXÿÓל§_ò®üäï—ºbxzð3£Ç ˜-^N3]ò5 ƒ‹ÏæÚåÇþ¼~çKÅŒ?a^ŠQZl78¶ÿ~þýü! Û9¡XÁpø‚æÉ¿Ÿ¿è‡?ûÔ[à¹W¿øTügåXûOæ+0ËÛë!Jî{ll›ÿ{y]ý¬üä¿ñè×­ñb`N©àr ­ç æÿŠÊæ¶»Ç_ŸÎñ®ÊÁÕϯ[hUùá2šó¢ôw€y/7M‹ê¡Ñ9¥œt<Åj?g?œGK`è‹øytš£¡öû6d¶y§¶›sû0u/®ÚâÉ%ËÏœ³Ð†´·S¨KÈë§Vx¥yañÔ‘è~™AUÔ(ÆÄŠÏì4ü ò™ß ™¤ñpÎq;ùV½ñ4P¹ÝÀÆtê0µÌ‘:G ëËôÅ—9´I’®ºP!úe ²F1ÐHö 2øgäîa6¤¡û,sÝþ äqLJ±Yé¢Eêhrÿ¨ã~l[Å¥ß-Áay|Uwר;Ýø–±`r:–Ó×ÊPÅ¢0ä!DÎኤ )§ô?†ŠXw lßyH¾p?1}þöÎû^Qsˆ­<°›¡ÉöpQö§9ý0ç_$®¢7t`ÁãƒÕñ­gÛÌ@ߨûTyì“ÕäêôùsÇÖ†i_𢩎eÊÃ1ÿDrÀ™ºBä|˜ïôÑ3ÀÈ®@A0sMÑ•±Í~S”6*èn£†&p ;#Œð™ð_èPïº4˜f‹Ósø>›Ž<³ì¢Á¹‘Ÿ e3ð"o ÄfAÇ-Íœr½•Üz‰¤úê¨ôÄlRç^ #¹Ù6)l‚¶Ð™iühíXöÈ[Z&_¥õƒ'2nOoßåZ›”p,./&¬Z«9qÅ™xõÍ{5zŠtöóÞí™M¸³sp½yï¯úIJúpGÒמ,€î®ƒÍLO8Î<ö–ùüɉ0fœ®¹5­pf ›ïê&°Ê“'ÐÃŒ̵â¼ám.ïŸû^­:,«±çXÏzÆFn-^ܲî%ôÞs_^íe൚¶Œê˜é:W"]߀6Ä…w ŒÉ]ºƒ'~J #KÓ¤UõGgrqm·/· ówöRÉúäK0lÀA‰MGü—}ÍÏïìg±®EtÕû‘±Þ"Ð ÍTŠ7ù»¨I¸,Åx« ŽfÏkÕ5>-…ñtï™M¡wÞû Ù_›U[ÕºšÖ2«6Lñ•r-yOËè£ó×îõË•ÄnÕ¸º¬\mYE‡y!bŽ8O :\’Uo ô>¤àé„ä½–jÇd½[ðtC¢$nhþðCø£™õö|tèÿȜٸؑ^-Yôm΀rx`j¾Oí`u•`:MÆæcL'N_UûÇÙåÔV˜´ÄE˜NéXž9‡:Ðñ/Û££^x8fM§×tô&(VÏ•…ú½†Ÿtéã¸h]La²Eám 'œ€X sÀÊìTx?ífꢧó2@ª¬ÍÊr[¿ç¥`¥>Sš „ó>öº/…Le¡ÜáðÓéÓrÌ'Æ«s«Ïs_0KN}_Gr¼>8Ñx¸¤yó4Ü:˜%ù'Í£ר6¼ð2®z¹® Ú‚°ÖعTø½²@X®I²üä…ðÊ2fÒwFG (>X®y®FrýLË{>XkÞZ€j8öj)A«›€×ý›o±Ëžæ™ ³ú‚,«ñ¥ŒIþ —VîS§¼\AÌ÷Í¿uh]ÜATè#mí=ƒRi'ïúV/°-ñònÒa|3¯«ÎKœš3y@ø(:.ouÜ×8òÌiv Rm]õÖh|ÜEaêh­…•w_7‹ª”wTÆ4¿*®ùï?¿1«ë¯¿1ÒÏå-J†ØÈ[¬yÒ#ÁN´ªa3¾æý¼ÐïayÅsÿÅàå&ŠÝáª-‹1t‚È»…þ­riACßK5Mkã¹=4]† ¬)u>Ø;2ÇgoÞ™´æžhàÎ_3a26½””Aâ‹É‹ßð[ƒâ¢úÚ‹Ä׊m¾1‘@Öú¢Ó¹„Ëšó)ÎòfÊü…·%@QSÞÜäÚonâ?*µÁÇ—['äo¾cRÎÑþ‰Rý†@4C×%½ÕÅ÷­]ÔG¢û»&.£ÔC‘¾&¿é|à”fp38^k\~úÇ7_¥ö^¿*XŽÏNÿ;GãkÐá—=S~ó|‘q&æOñ HX){ÛÔzñ•ùÿÑÉÜj´ÆWf»Ø?;.Fµrãi ºûuKt­€‰äæárÒ~áC‹*1Uqœ‡Âø—•_›FÈ ¨ÂÑ<Õ™¶çÏÞZ`Àj¦^4bPl ~ãÿf^ éûé3éìŸÎ¼oÒŽÂIY¯|áªbsü}o)üeùöþwéýeÒË9L\ÆÊoÞ©Ÿ,A¬¾ß“{½4•ØXÄi{@5…Òy^ílhýd}g ¶Qî×fs¦Zb(_×bȵ.D~ýÃ7¯ë= ëºt±©”¾™¦eëvÑ•éâÌj2§&8hkÊøë¼wÐG€ƒ•®ÁA´RTÂÈ6Ø~(¾Sôzx²Á›^¿a„'È/‹½ËúÌv˜íܶókìçro¤àAÞo!ƒ½qxïç Áù·TâÄÈra‘Id®Épn2(÷ÿøz‡ã@ëfPì’¾óuÏáñ.úcôï¨È#¶y:0à’<'6ÔLüñÖMƒå/y\ [cS1z¤ö5‘öŒ*é471 è= „(TXJ^^&é +zPç™ç¥Ö}Œ0¢cfݰê÷ÑEém’Ir’üÃã¬Ý¢ÿôI%â\†îÆyvÃt—:W1¶f’±A[D©n M)1ßåÆýʬË9iŒZóÆjívãm¸ç¾»+‡"Yß¼›~SîWXPµ3°Ÿ…˜¥Æ‡P5"ŸU¾ÇLÕ)/‹q³pš)/U†Yòf:r—ò-þ/Ô®±ZF¾É@lY½ˆ=ûæË—c)_æKWy4‰½sˆŽõœhOœ»§ð¢°ºBñÚ`Þ'䵌'ïpvx2,ûÀ­• é¸‡Þ¹˜œ$rÀÿÈ|³–R¶Ó¢[åÀÛ°,ÿ¡ÅàE­gŸŠ÷.î|JsæKVÑë«TdlZWEpYmØ’AøUrŒ î™™í`Èyé\³Ã)­ÈbAt°l©‡â*åGU´Ëgìú6Ìþ@ÙòÛ÷!¥¿w)ÿ(ÒHîq|¢!ha±©î2æ¾+ŽÍÿÚ='ÖïS+Hwž£ÐåUvG cÑÃ$+ß²z45}8‚1¢Ð@ð|ð&ÑtQÑô까›Y*éSw§ÖRXCJ¨ºº™EuÉÑÏ”ìŒ@OÅÅB.C¾r 6µd¡üׯˆÊš1HéÃ1™ÅÚ‚éOt–ÜÍOeíTo)À¨wãÚk«ÊŃÝNiõ*„Þ¿“¤{usÒ?÷u'Èx™f«÷Ó0`ÿRÑy· cn“]{8åsu1HÛgÞìI NÝO`¦;ë~Rà|b ¸'¿àyB¬têi˜f˪÷4Jra{2&€UÚÄÍh2Nb¢8„¢ÕnqÃàøY–í¦º€¶SÖx¯â¬¬àÌXÄïêtüûù÷ósz)92}fTŒ5^Æ÷Þ“ž ç/'½F¥«Aäh‡^áAçߣ±N2ç„v!l…7´®Øwâ)à)OÔ;É!Çt¦C¾ß•hè,uSÿcŠ„æN6ÑzwAüÏ9¥³5¬IÖvÿÏÓ9vàN:5å{¥µ‘‡_¯SÇ$„#G$ór⎩¤rqy}zp}\ÁüBN¾3 q-¸ÿZާÞ風 HLŒC6 Áe«ïÍ@0ÊgÅ\jã6÷þ@hú*Œ›fLÐ’òq¥×3þ«=šE-V'lp'Mo…ðý÷ŸÙ žƒ‰×¦æ_žàÅÓëë1àÎÀ—/u~~Ó8UÀŠòRx„_@øñô] $_“éÂ\—ÿ‘ÐwÉ_ÐÿÃHÁOº3·.ˆ®z÷ €ŸsÄ 4ƒŸ¾6A~â,Ûåe+‰þ…C:`ø ­j_O&2ꥭð¥ŒçBáß‘kÜž™¸·„Ysa}Ö!ÿðeë{†ã?úÝOíä°5Ú€™í¯õ ÿFÑù[[þs;ù±Ì…´¡,ëïÙ¡ðήjO4Мì×bäåY"Iß }KÎp~Ou­´ÃZñsì6‘‘QÙRc‰²5ßEuwÝ›‹œ.8FSA~6ãM“ýX°Ñ¹úÅòþŽ»„-,LÖɸ]7JIG—׿¢y‡ËRÅk;!Éz €Åè[l•ÁŒKð éËr‘8ƒ•à€Ò(ðVÙ×çaîˆ'†Â´Ïx²±z{v÷åð#ÕXIaß(ôÓ¾üþà›÷Eí7ÿS›B÷Lò!»W69‚ÇAÈp’@íKw‰ î/ÚýNt€ñRu£Õc_òXìz³ÜÑã»`Ϊý!Ÿ¾Ä¢Ç?Hì!ÀSihŽiHî-ÈIåÜìîÑò€þÕDÀ‰VØ;’®\  û2 | À6ŒGá>ƨQÌ¿K ÀûZ×&jÿ%Vj¶ÐèýÁ>ÁI“aÌ Õ&Î`VLŸxo&cFu/§g§ç×âìÎçëí÷}:9Мøž¢ÌâphÞÀ Ì‘¸^þ]ʺùC|[”ã)Ö»ÌÉAÿå‰äUë–yç>ç55,Ò Ì<]¢vÕ{øíÅëÓêgÊ#³hJù¾:ZkÑ"Rf«ki„¾³&f2¹N”~È7ù:í!Ñúî 1eÈ'>¨¨I®JÎwNpïFá×6‡ý?— 4•‚ŒyG1æÒRRÕ>»öîȹ¼@¸¡Ó9¦ÆRxã3^ÅF1[¿ßeœAç/Ô—7ó‹Œ%Òi[ç†Àö¶è–§ï <^¾9e·w|æÞVySœQÉ37ìò¯€õ­+ƳZ³$úðÃ]ú1_±ò?»Èg÷d±¹.=pú[‰ mÛ¶x(±è¼Ï:nƒ3ßžÞ¹~;ÊÇpt­ǬS*]önžÔã™ÂÀ¨–ŸÐø@_ÿ8×E¶Ž­–,D¸Z‡xwÇJ¨œ…`ÇýxÃ5(ÁÒy§mHæÎÞshúNŠoûÓ€ÁîsrÕ+¥/hÐæ-VQ†¼Þ"ôÄez]¸áR]ãêà @×GH5oûÿf@^ÝC,ôÆ.l’e†ÁÊyÒã8þ…Ò…Éö0úöqön±`}0,$’ñ{ô¤ýÏ1ôŒ §¤~±%«:„–. ¸?‘†­ÙšŸÇ혾ê IÝNC. Gê‡î/„¶z:²t|vò8¼äµÃ«à8 @r‹û”1Å£,¼·XJtvâœÿÂèï¥Hz»Å! ¨ˆô¡5Ù„aö>ÀC>í=᪦B±RæË8¤óá„}šÆÇÖ`éõ?‹aP0 ]Õkmè³;ñ¿S· Û·9ŒÕ,¶.çÍ\ÖËЮÎ0á¡æcP3 $®SL—æ!î$ƒ¯ÐØdŒi{éøA “t'¾#gûÖ[7ëã_5ÚÜ C³…+1ÌtM>(þ¡CæNøžbéöã‚Ñ5f´*9JñS¶€·ïiPÕIt‰6%Ž4¯ÒÃØñ9ôO0°jà*Û¥2öqÕjNyT[ÍBOŒbRK-$†îÞêÞ\G²L ¦²ªCi”p%ÖdS1Ü)múªBMÁ9kL×B¦¾há’õàŽ"7)Õqj™“ÅïØZ˜‚1øâ­•î–¤Órˆg7ævj"÷BΛo4•wxåá2ͯg`•dô7”AsÍI^´sGªÄl&»õ<˜æÃéæýXw~Ìn¹‘þW#|Gú”€3Ëê5¨âá ¤Ñ;â-9—™ÂÍô_ݶM>.q ƒƒ/ËÖ\àzû,aˆËöƒYL ]ÝáiS¸ìOY•B_ÎÔ²—e™©Ý.Ar SŽV0c6ã>ݯ¾…B‹ù©ŽG† ¥bÉ È’"r)tOŽÎÇPihˆÎÔ…òàéÁxëp푊šé»€ݧ##ƒŒ#h¨ó÷ëÌ@ÇüªÇú¹»ÿo| è*Äø„f¥¡[-§À·í‚˜Ê.™pŠ)R›=qA¡Á”´:çGá™f\Á®3ÉõRè¸sâ,͘5xò¥™}Ѧ"í/çJInª¿Ó¨Ü2pÝ4 ur7!.u·†U¼»ßZ|§[g—3UøÈÌßÐ-ôùɯ¼Ty®2K_;”y{ ÙAx|ê9ÞW¾¶©j…kPÉ)è @&éwåø›_ÿƒbGÿ~'QÉÝykÑ`åôÀÉ êcß§='•î šèH¢Ä—à½;#XÑÚk@æiŽ ÞåtòÈ­¦‚ƒ{ɽӡ ÿ:(ƒ‡ô?„œWÏzÆÝs ýâÞ 7Àý¢‰ˆæHoÈrGz¼ÞFD¤Æ EÙ½üRËAA:a€†u|ªÖ†ø†€Ñ”æO Õg~Z‹ ç„pZÄÒÁ“6±¡Í°‰ÚÏ0áM®3–Îâ˜ÁœÑ#òj–ë:a}ýKÜrû¸0òºA4}pÀ/ôªï<Ž«—L#`ï<}1sv!±6Ó1q.a9C›|‡óã½ í΀M,î8Ÿ_³×&iU8»QâÎåti¯¯ö[HÁ’ÿ>&nœÖçò[_–›²†Œ_Yz?~¿<PEÓ‚“‚ô; ù¿êþÿ9Ó0Óáñ1lŸQæ§Þ©'xÙÓH"Íu%‚T’„ß2° ¸ß™„°¥ÙÀG&ѯ\á¿swÙ•zÈû|t9§jŸåò>­ÙwŸï\tq:]ö>Ÿœ@qî!uø)^÷ÇåþnBÉUcéÖ…ˆ.÷–ß®®¯è,y?—¤q}Z20O®i@•±¼×ôS%ê ü®Ðgûs7h†Uhñ¹‘¯ë2]OÔl]ªPt£Y¹»ÑRÿA«jC©Á´lŸ’‘ŽSEÇ„Ô\/Í(ú ,#ïløõ˜ö_Ñ–gÙ§°@aÿm“¯¿g5‹•×8­—•8&úæCÜ(ÜkX=mÏ §·h‡ã¹a÷q€¤  yÙ£Ò¨·¸ºqC2©ØÀÕG;“xúü·Í3u1QÞe¾5dÂçŽAÌjŽÎq<~›žÊî,TMü7±!öu‹iË/ï;MÖõ¨¡m€ü§¹¨ù÷ýÐý~÷ØŽÃÕ!óîfP$0v†#”;å!ììØ`—×mÜFÙꢧÏ#Ý•E—Aho~Œv’;MìÝ)OĈcpÇH¥ü=a_ÃhÜŽ6Ë9xOÓ…8õ¤hàPÜi=î¦ÒÓ† bMÑK\œÜ|bh}g£ M¶å[FÀ 0lÇ)¢î`Ö‡Ü8 À¸üGÎ"ÈHwîßi…ZeM]ÐÍYf­ãÙ"M¦-rŒŽrp}.?ã ŽŸ8ò)^½ V„“ެ"ƒ™ýߣ'ŽyIÔpL è»Ç¹B†d!ö~z¡žZÎåàÔǑനâQèêÒÉ/6ÐÒeDÕošîÑÍùjÔdn<ë$¬i•s4oª )æª;‘Ê3¹Ks©É=MM- Åή€RFJ,ÛÝ<U_€b!#‰—Ô¥ÔØ"ÏŽÌ>Þ¬’.“qù‚¹`0) vh›»>4´XO æõjŒ¨ò³cZwêLßÿ 4D%| ñ’—„K{†L„Â?ìKHÝ@Ì𹪪Dz W( ljá9­BT‰ÅR1ûûËàTõlú­`<•ù+qŸ²$O^8GP6o‰þBOti°êá`ˆƒÆîç΢¶Gb¸mt (* úÖÎüüœ›±ú3 ÐI÷e­ˆ‡Ü ™…|Ä<á+„* å,¹ãËuëzY_ýT[¥¸Ýe«a5 EvÓDterCã^Š5 RM÷BrHŽ!»/ëv»jˆ\®g\ ˜~Óã5ŒÂŠ–•ñ—Làš]ä ˜ÉX½Ä*¯CŒÛö•“¤}Y $¿X#17UQƒŒôƒ€ y­l­ž.Teõä.N'b~÷÷›¯}„ê¸õY¿ £¹òÛ°« €±Ú ¶þçû¹ÇŸ/:ÿÓ'nµÎö¿’4³£Ð:—g. Võ‰«|Õv}¤q•†F ‚õxq‹^qì|—ÎCÇ=ºÕQÁº6ïE‘®~¸Mìm>K™Ÿ·.Óo¦®z0%gÆ´giFŽ¥%ïçc××ì>|¢¸7½ÓÓ÷Êó,ùýƒ~œŸ"\ûÿöR•ŒgYÿ&æºÿÁséâ‚õc(Di!aQà$Ú Ç–hìÁhÉ!b&‚8bܚлLÞŸzþ'á¾wxÞ18:pO‹lœhÏh‘´] vß΀Ü%RžUœú¼¤”-‰¼6P„çž‹dþÀÓ;‰°ç[Ý  o\›1«»9*OÜuƒ79êt®kOìMâ?A{eüQÚŽÿÁ¶·™~"ˆ¨f{¾-Õ󎨧”<Î Ä~v8áPÉ·øÚ4’<ÊÜ*yÛ,†âüè#Þ¼î0&³ùàk‚Ó¤áã2oƒÞÏH#ªÀ;Å$ÈäϼÝ_ðøÝïkÇùÞ=ÜÁQñü]ñ£T€úh‰küEÆw?í†åQöÔŸèƒeû_ &tõºPÜq2(Öêà_¼»Ê`ã~SßÉ£ÿ¸«n¹»í·cÿêåA}3úÿ$DÖݧzxKFcõ²W3(†£¹FãÀá'Ým?]mShòWZµ7åJïèãÞŸxZÐܨ§›×f*‚hdô’¦Œòœ¶ˆ’ߨK^;Ê`†x „>ìÁTì0â!c~fyxIˆÈiß[ˆDK¯„ibM …㻞ûœ0»Òp©ÜrêQµ>¡“(Ž7[u±$(Á§±¥G’Krâ^–ÄÈ­Gq9È|+€ÅÃXGãáÚPè2³©*„ŽõEx©Š`^ÒA•ˆ+¥H2‹-ëEÒ·Ò„mZw\Ò3?0JË݉ãÕNè1»žd¢ÿ››´L©_ùlðKSeZÜÿñVÞÄ¢çié Y=åÑV+äÃ(=SHTbY¾6Dy„·…Y × pAõÈ#Jm¸˜N–ÿ;­žNoH‘”½\X]0åi€`é[:u"ù,Ȩú{B6;‚FÓ­(Ͳ¡nh˜Í¾ßÛ?&”ízkÃÃÎgb¦–ë†G]¨‰ñ,:B9°?W_¡UB_v—R[pqÏ¿Xt¾<òð2¶áïoY0ã ñVÆqQwy s‡‡î-¿pi‹!æ˜øË¦#ÐÍÖ.r`² ¦¯¹ §ëãfweö*Ñß­ 'Vzãù ‡…gJø÷#é5½øÆ_1ðúòËÍ™¯é(~Ùûþþ@ôÁÌ/˜¯®&Æ7(=žÛ/3Y ’ø,wÙ\ék?g ßRPöfÙH@jvNCÀÞiø$GWb„'úÄWtÉO%ÌvxR€¥X†8AUv§ED£ûÐßôcÄËqµ½áÒfücL¹ãÀõ{1'Ò# 4LÓñ6À­˜Ù&·å•ÿ…o× Ÿ/ðÆúb€o-6±Ì`lû߉þ냧GÒÉ Æ™EFÌ Êêw&b"ŽÔ}ôØk¨º¦^¼Ô—Åäþ0Üaü;’ÚuVy¨¡¸~ M"5úhá­1x×Ý£laêbDqëa9 “EÅîòþ0dõ·NKÛWÏÇÒ úOÓµâkpž­JRÍGß,s Š\Òåy™ÃÈ™pÊW˜.ÞBÙ­,˜i! I•°Î‘KÊ…^p iiC¸pêx”sÕ ÆU°YT{õ©PæÝVx\ÇZDz‡©£ÌeÀÇöÞsð)4w’uÇCƒ¶Áì‘ZŠ'‡¿·ýi¼ä桨y®îd€_Yß±.)à µþ'QûvÚpŒ-ЋOõ”ð¼#ÒàG7¸«¿Ä‡Ì d\êµ`E/†‘­ÛËN¯â‚KWXþ²(NmÚ#8!¼Žø¥óCŸ*MT5uk—û?cܸƗ}^É<Õɧ굳Ÿ/@›öfNÙÅ·¾uèðÊ´.›c±==FÂ䣘—âlé*%NÚléd¹»H³Í°VïíÔs½Ë6Á%é=F³UDö-q£GÏ‘2€n' fM&'B°b›ëÖù8N4¸Ý¾ãêi¶ »Ü÷wãÖqltݘ.~ÒŒlCÇXÐû~ööCy†žjßÂ~µƒôºc ÉÂì]Ùúèš¼Wèæê´c#üîCцas€Ü{û€Òs8Þ’Ü!WGnè¬å œ]öRWe©=2<h†­ÝâÑØ,„©s CÃ7Ä÷ã|;w=¬‰›9q¿²×= ?Žgïs‡‘vd;´¿Øhj !›Í ÷Æ€1 T–ÙøÃL}‰å1¢j4£í;-k‡Í!ãÂ8ž6Âáí>ˆD3™—ž”º†ÒÄz Fî¿:¿Œ…'!%ª±PyùîÒŠ¾«Rcbp†êjÃMµß"Ñ ª27è ÂÓ¤cý޽rÝpêÅ1ê× ÄSñF¿ß[˜­…5_w^~ëý9Õ¯0†óñÝ‚#þçâT÷¾¿. FrÆQEˆ…£7R6Õå£Òm{Á¡¿(Ÿy‰0œÂ¼“Fº|/Wнå’ÇE¢9 ªz¾^Ѽ˜ïýÚÚ„ IÅdåÆh©¢„tïãÓæôñ‘cN|{Š“vE²Z{(ÖP=œ³‰YÆq²M £ÿ=º n`ã2îD½5%.®  ;:AG “‘N¹ùÅçPƒWn…#7À­Ó*iÐ+¬ïĆ/ÒÁ'¡þòÂ/´v9þ¿özG¬²)T…cºo/Œþ>Yªè”‰ÁXk®±ÈÓ­ËÚÜ#b(€½éW@À¸`UÕŒð p½òÓ–/¶âz÷C¦ÄB6þ¾Ýy.+_ÃÞºÜÍÄ&[?:ÖÉ;U‚ç;|±õÓåJÉà/›5t+ú;,<{ï©§Nï(Àʆ·j IFS x§?ŽÇp=¾Dbb²òÆòTJ+îÆÁÕtáÙà%€øsL·¦í Ræ>p¦Œˆ«»û‹ëëèô‚c<™³š‡°ûöÖ Öd2þþ :g§ óà÷¡%ÒøðÑ7–šùÜ©žÁ¢­ïÍýRƒL t­AîÁúÕšÍÉ¡és¤Â8f1üMD»îvŽÑÛ÷SHˆ{ ÒŽÅG› !þjµ…ò5ôñBèÜÿ®lfÛvNlpnmQz°õòH-œQ4Æ$‡ñ0+ $`³mk] Dô¥0Ú€SÇ"¨k·ØÐ|æêB§ Ý]lЇ!‰÷„}Á ª“J kŸ¹SE{’ëgGtjeò¥zÂek¦AòA€¦\`Ãï;åĵ 8ª‹ÑÆNqô´ý+=€;ÇgÍܪä³q÷PßR’¤8XÙ°.î;¯ýPéº.®°4HÐ?*üâÀ}©n_†0w]B+\ÖõÆÆÿ _Þ_ŒÑT¸šÀÂõú›ƒk úª©-…$¹¿4ë˜iSg½v8ÚéÏ TYñT%-J-ZwÄqÜÊ{þ[§”«»MÁâÓ¡oEôr¡tŽÛÞ#‹f”}Vè~D1%DÃËÒ?Ê®´l0´ïTÏ…'å\ç *ÓaΩÂÅ¢`  cyŒ³Dÿ_NõKý÷BÉk©úòèsôËÌÁ¢ý-„¤#XøX‰kÞÌë†ñÅ·›öê†!èm®x®¦»È–"KK”Šyƒ,$›ÊMŒ$~¸wF +"¹©TÞ9¯F¾úr3D8›t¬P¸Ó½P$ŽU®•¡Ï¬ÄÌ%»ñk?Û[GÀ/Œje/AoBH=¦å¯ã˜aR•ß…â9ÃÇüßTŠ„E|KªñažÝÒAϲ—©Ú÷–Ó ]ʹє&âÇÀB˳½˜˜¿Yt~eqåu1‘íi½fêZ÷nÉVÏiY-6Þ{²Ï"á ëö}¿Lõ4g?úVìLAÆ÷„²ºwäɈÌ,ÚôoÈù ©¢an†‘|bž^ŸU<8ø”¼ÛµÝؽ‡'aømiw¼à¯·ÿoüàÛG§"*4ò­‹î£$rÐÀ+•Tk~à¨åY»ïi¿tl 4´o]#Í‹º /ü¼ ɤO£FÜfØý‰à5Åþ7ãDî§ÝŽÐêç(èsHãy ºAÙDHsã™Ú‡èe„ŠÒF°öq$¹öŽœPÛ­.˜« ›K¦8±R§yŸít?hÿÔ…ÞÑt›„>†´ ¡ë±Ù d…MI²Ž¡žƒÍ°ÙÉúG°wçÔ3•Ku«‡ÍIW/ಱ÷bª°Ä7Ó´¤Û;ö´qËßoÉ=ÿÀoˆñ¿3g£ MT‘‰ÊyõÌøæšû÷ójycýš'öoήÞ,±Vïû6ýßÌøÇ çðç<î?¿k›½¿þ¶þýÛá¿ô´ÿ·´±þ¼…‡g_ð¿#:ÿ“¢ªGÁ!|\5<%*úÃëýøô`lL¿„pÕ æ&…~ÑÿŸ‚fÚT&û¬|_w°}öË'Òc{]ŒÐ óœ2=¨ èè3òØÞ^$á|¢²ß@äaZ Mõna0¿ú5gC·Þ£8˜´ ÊϘ̆šÝÛ,%ómkúf5€ÀRgåÙð“kÁ-Ü`¥­<,KÿŒ?eE®u}ƒ+¼?0aØŸ?föí醼M)Χ—ÉF&Ô•Þ}‰åÓs•}ñÇv$i¯²G€CvÅCªž‘Ú@pŒ[p¼ËfÜãËE„"® Êb˜sì΋óåÀ`¡LÐû†]Hß9ì°-  °¼´ý®pß‘NG#Î7ÃßñN;i¶£ Vr»ÐÁˆANÄ&’{³6¡7_äÛ([B-ø&4SÑÁ9©£pJ Hò6»Nrô{w$›%óJ´‰ˆ´»pvN^¸ŽÎWÁÖÞÅq ÏÙ<>Mþ§7” à íµM€hx[ž×ŒƒcN@ÛÌ@ ’2+-tï[㎠‘éK+CžQ‡HÎÅpÚë¬{ ° sÚD\Gÿ½ò–Œ¡WRðiœ‡—Â:-@ûÊÆ;üÜGw 7ÔŒ1s; ÷²ºÕhE}f%+<ƯÈCëNZo;¶6¸m *ß“£ã©C.-Ž"žÝ«»¦³'úUiHòuåw™Íè”7î¤G‰çÐ/¹W­Gû[¤©…‡e2Û®Yƒ¯Ïî[?wšÜ'j[ñCªùä;sýù‹ t—ÝÐl5ëØÝœðΔî·à}ßÞkÚ”^Nt; hxÇe¸™TlE%6¸VÎ2Wg ¸zn´Ãasp9ÿz2›Žî¯mÔF´ï©3Œw΋ŠüþoM°–6ƒÊw?ߨ¥Fí>“E.3>r;œ·¾2 o"èå­CVM¡B_'ó¤~\)†òÚ¢]uÚùmT¯" ?:Þ)ÁÃ7Ï!w1U&ŒÚ:]£“Ô¸uëˆEtú*Š:ãº8Cä¿7T‡Î^½¢8ç89É>±–\ÚEWö`_œT´i2|ãø® !•ûõÌÏ}ßç)b¾úcɯj˜ ‹áômÈÿ‚èükäØ@$Ÿì¾ëƒƒÃ*–ÌÉ’¨¬˜7íï3‚!¬@™MøåYGUFòÑ&XÓö”ÓÜgø›wU²±bû50…ÝláEÖFüÆV÷ôs&è¿–~F©íÏ!SJ7‡Á^mužÛ¯v‹BSÁXÔ!8ýÑÆcX½ëÂOßýåkYc*× ¿Ý•j}ÜTZêd½r†¿Z9»¯[v ˆ÷žÙ¨aü€á5FBSÓô+ålå“ÄÈí6ѸáôT=·5§ß–: u‡`함µYÝã}cgŽwLÛõÓH‰±Ð "mÛL'bOvÌ~x06ÜÉíOé3‰ôgUæ0r¼÷îØàyA´_tîBN´-ena§Ef·'¢SK•³‚J»y¶Cæÿqd9ãíŽe=¦W!Ÿ?¤Ë‡á  Yd›×Ö}#0œñ£‰­ ¶G½È¬´É6¢™Ü1LEˆ¶‘ºgÕÝ×õ‚((x?ˆ·y„†MsŠE”ÓæXÏÆc…¾bàŠS‡Ž~5—‘"7ÌÏ@"G3,^҆F'pJcåf­N—a™,›'¼_-8ðò˜Ê@%Ý[J"‡;š®Eì‘ §“¦âfô¸¨™ZAÌ%äd^Ò OØyà›Ž\4Tè4”¹ãÐäòq÷H¼êˆEŒjŠÍ’ܺ]ÉSžu`‰ÛZÀ*Tä¯cάÀ^ç}d´½¥€gP ]xª;œe±ÍUp¤êöLw]I @—/š>Lr4IŽÚª“×`¥u V†[Iâ)­+§hÐ×þT~;µ$¬¡("ÿÀlbÀ"#ѶŠg‘´Ùû<Ìî'd¼0øÂCÈ|?fúV‹&–;ÎKÓ–g·´› ÍG˜·g–]ÊMßTR_ßäµU ¹peh#läÏȱñHš:à¼TQéú3AlÉ"¦ÊKø›B7*eéôA­Mîân¡Ÿª¢+³%§áÑNã¨:ЩvÉÚÅÇ»°_-/ҧߥߌZ¾ŸUM¦o…ïC{/E«ƒçG`T<ôXjÏ­°JùÊø4b‘‚UÄZèèÚÊ•“¿ƒg! 9ð–J ™ó.tÁê»±Œ~wÓ›¥P~YäX‹škX¸¥T”S·).ì¿!:?—þ‡ÁDÅåQ=—˜§½#ä«ðe³’w‘@¬?·ž .ÌY’.¢ÿääËý2Òö½5@x”¹àÆa"ˆ„ yGÝq½×ô ¬±Ú|³Ýž'l50A§˜ÝoRG™Ì­•7Qó7{Ru–h7½‰þýüûyã‡Iý†ï¬ä)pÇ„ºO‘Æ›½Æ“‘SùÙ„eI%æ}ÄÒu@¦ãº>ÛvX>FùärP8L€á9ÀHæ%C¦œÎïpÇžîJ§!Û¶GŸ³²’f=| –ê3fjÒKgû*aX Xa´wb‘˲Âá —6 pÞ)™AžˆhŶcÍÃÆcÀ¶Í&¬ÎG>¢«R±BÉg³«gÞç×ð±ã ¸ÿµm:Gùn¸‰¾‹šôÒíæ: ¾ÅgæýÕG /Ÿy¦0_}ºr¾‰æòI‰$|Œ!y£@.»ï _ @¼G§€M<'îÝ«–ø¦ûûÑ]†\¾iYuÉÁåÀéø–hüÂBydùÖú-ƒöÜãè£ÅŠýÒ£júüÀ4z®ö÷ê*­Pn­œ²òü ™äç2?ô⧆y¨hqhy¢Àâ&ý×DçßÌ…>8°m›ÒõK;ˆ$Ì`N2öãI…|³]Œáþ³€ú¦ÿ:q}ß÷}Ûw³íd°´^ËeÊ{ëàŠ—Í€, µÜNaó¢çKÙТÛgµG櫈õÁèq4ÉBÉeI©lBH tÆD' ÿ1ðÄQh\£ç¤½Ãp')Á‚²Mu)¼HÎR¾¢Zì#|µñ—ÁÝ ÿ^: :”6r-Y±O:¡†JóªIégîÿ:E§Ž ª§'·%òÓ•f@¦ *;_k9eÅÙ_´ŽAxVr± | é‹'€"n#Û™ž±w•*Ç+ “Œl;Ž•Ãðâ´¥¶ m÷’­$hº0‚ Y\»ÜŸ³ÿÙw”Hb Ìý¨»ÎŽÃNGƒZh M&_µ®Æô™x X§jñgïí„1`оëÎì±ÙnÅÞ#† L»M[¿X´Ytòþáõ{:ƒç?ÐN$ßfçéI©è8aÌî«¶!Z7´.ÕsHë‹þÿÅîû´–½?nê_#Á’š·±X|Š*„íÜWØÜ0&ÛþlmH›^–ÙºUÀ@½2;}À¸ê´5€=ñ¿Ú‘y1m”±¦_bP¿|ˆiT• +ÖÿEÁiIŒ1žk°`õƒ¬sÕ¾.FÕMú%ßÃËlîÖ× µ½zlŸÄ«ð&8>å~Ì’‰ØÓE~ÌÎ~N×™ '–UÅ=Æé=žrQ>Q:.·Ò$þdsŽðM|o±ÎÆ0±ÌçWÑ £›XÜ¿O㻡áŠÓ *YŠˆ9žFwî¯5Téßú*‹ÍR*­…Ëõ´ñbà£xØ9[lp´Ÿ"…Þ¥¼„ó„!¡A†¿ŒBLƒqU‚ŒWÍL+j=AÑÀ/ Ò¹{50÷äipºØØ÷~E¶ä£CÃË©loyÙÓïs†×zŸÌ0z‡Û^ò)ýâÖ6ñšÉøjˆ¤>¨Ÿ´ñ)„ô;Ã4i¤ÑþŽ'ögÛß–— ·¡<Ö W+–Ô_%:oI'%Ugéu£™²zèi£6ᦠÓYðm oE—ÞA}Kð^ú=K‰Ékªœfš=‚ŠY÷¿Fà s¿õg¶cè©’}aÜvDÁ´ñȼÆ€”Qô7Ìñ©`%ˆÏD'Ä…ï(«¢3ð­ ÑË ‹ÏŸH÷úâåÄk‹ÅÍ[¥¦H¦ óð‰Sr†d|äü¸]áûwõK”2ð[䀗¿on})_-ç zže1Í6¹¹8$(Æ·- «#j§ÒT1ÈÒxãÙbÜiÆù•µP[¸Ñ³NÔf]þG±ÄÆâ?¯j:½±àåDq ü”¯APÒõASdB¨Xĉd<ªÿ0÷c&ìhZìÒ ë_/ ‚ˆr÷ÆLùá+¦{E豎AI`+œ~Gô®Ðfˆ9š†@Ðnä®ãÙvÛx¨îN/ù(& q8HK‚b4‹’1 è5‹XÉB?šâIÃa¦l' Ÿ!r·c2”Ãtº÷ÃÈ.Râ(ýIù'˜›µ ט`‹ÈU:´ƒ—‚³Î ÕZ'~Š<²*‘í–h&çõPoŒ±^xÈJ®u¤ývúk7&…mknsFP•*1Ÿ›c× ý—ÿŸU gûÐh•ÒB9&¬ÉGï•Ô½º•Œ€€–CæŒ_Ë" gÙ¨¾ZÀæD‹"®C41̉cµw_Ý)&!éçhŒâÉs!ª+$Zç öÜ`‰I© /P·FZ^X0“œ#ô™¢ BR§€iÙõIã’n¥jâÿ­¶@ÐÖðfÀ›}uЦĚ¼YqOˆì|…™iÓß|¡ Ë èQs'HM4XÄöàsH\ª.gøpuU¸‚]¦qÔéQTDT5w±9 Ë”VXLŠÅžêZÉT¾ËXr¼ÄýçzU#è#¥¢mŸÎÀÊvfL9«o&õ†ãÓI5ÏÊP`r‚å}ùaâ•j¡WÏÜ|šþkí¥èÚ—¤?¯ǹŸAýWïC‹ë js«FIîû¾mÛl1ýœ5Î@Ã+Õ :zZòHÃ8IßiZ…D"l¤ŠQq¹Ðœëó’‚:|U½u<0ÜK',™¢ßäh vÖrx™i¿hLXÕ¯á³N‡¶ÊW†Ïœ6’¼äß/:ï÷+Kí7÷ßµøçúøxàÜ—öLæÏ:‘qÞÄøàl\ðcðég?[8ÕAÞÃgªc;ÇÀf8<;°üfë ÜIˆ–Œ¶<§ØoÎ2*Å£Níø*ÆSwŠ¢m;Ùù›'Î>‡ßÿûù÷ó¨ ñ}oÇZ þZü§µ“™žËè&Â}î³ö8wÑ+ê,ÿÂxó”ÙwÚ Šÿz€!qDˆ€uì"ˆâÐH¬¡2oIûÓ÷ÑÄ|Jp&ý²ÝRlº¿rw”Œ%aCäû#ËÝ€­z‚™)ÐÑId‰àS":Ñ9Ûmi0¸ží9Äç«™Ñ6(.aðÍàEÝ[ÈâøîC*Myc+ú12–8t½W¯aë¾d:ìY”v&Öá¤FÌgêŠÓÕ|ªÔyuН_™ÔY*.‘¯èÑÆâ<–¶¡'–Bqb¡ÀR“ÃðÞCB@_=NoOÜ­%–Þ»’å (^Ãe¾f‘ÿPùÌr@lµ Û-äç´ALnÄîs‚ a¡’5=¼¬éºÑ`-€æ³×¢ 7êhœFUùù‚¶è‡Ýצ)è@©à*s|o`÷í¹“Ío˜1ßf 5ò°ùµSÙ‡Þ„M}«1úОó™–Ó{÷vÂ1æòÓ'vG‘–:6 QÉТ16 l}ܾkDÑAòóŠ?ÛæÕÿ/°©ì‚ògz«zèÇ ™zh¡’üQOóv£`4,îµ.–"94âò€(è±#Y¢äö ê+Š¢ç–};c–:¢È蚺h¹o!ŠdÉžŸå 6ÃTNC±Æÿ¡§X1Aîç¹^qˆOß÷©‘äÝCZ‡[%ï¾ü=t†mÈSè1<²>{aÅo¦ÿ󼘚+NUhžAÈš¼}#{ô¹fžB¿”e(âÊ–ïP|ýDœz¹ŠçÓ'r/<Æï’¯Ö~Å:­¡…Bœš^æé 9ý _•—©-?]^Û¢Ÿ;ÂÎU–Þ$ùüúµ=Šrð·xVê¿®p¯@oycM„ˆ]º>‚9¶Û‡÷JòÅ–’€ÝS°»µ*ešÇ^ô zõ0 SÕ‰¨t8ñň^½T*—Ñ`d=[xe„ óŠwŸoÉ\{šÛñ«Wk¼Þ¾6¯‡Ž¯úp®tNËÀ6xÇ`ûÛEç§ðÖçñgëdzÈĉõ)Ìæ³¨£‰›—q<$C±›0"flºQr¤þ"«t´šè’Ê~AÕì;àñ:\úT ÔÜõŽ*mÈqÙ{í¹sœ¸çƒÕ곬5q W¬èf¦ª(è˜PN§¼•q%JÙsM/¦A°‡Ý«åY,½-–6É¡´ˆN•ÈÒTäÅÑ n¤¹#'AíDúKç†;åá$ G„JMCùÍ>,e*Ú •l-ñÇZD®þÛÂÅ Çöá˜a;r ¸Â^FJ¸3ÿïÂ4$¨ ‰-}`1öU¸i4tV‡w*€Opz8M› ìÚNW)”o½£Ë… ¤ìP£9±æ¦qÃ}O[f€\‰ ?NYˆ#`ïa¢¶M&ÈmôM9ô'b<-tA¥fiD;(O†c>qx 7Gù~¢4Û6þ!C¿§IÀñćgñ©‰ÔF#´RÚ!¿O·mcè(FW9„+rYÚÕá¬?ÁÑ2wqZ÷ÐvÞ¢½Ý‹£ IÈZ!v@‰ Tw*µôz›¥sJ¬ õ-õÊ•‹é<©\qúºD™®0öä?ãx3Ç(+›iÏÞS,=—éž•jFvÃkÍZʽ@WŽ> œþNÑ󷢉ô¹9CÁ†ÊÞ‘û­)‘¬²¢V" éô]\Oϱ†Ì»úœ®EEÁ£(Û¦<øÊ8xþænÕ­« a‹!x†{é‘¶æUø0³}ßÇQ³Ç×¢uQÒ¶Þl¢¢„ ôÙ!£×âIéî)ÁgŸ} °ßЄ‰ÔëK› ÃÈ@\†¿Ði3.ï5rš†%qGu†œ.ûµ/øMÆÒù¼4µšªlÓŠ!>N*¢.e½Õѧ¢ìÝ!5O“By#—ðNĽ¾*àâÕßq:P!7ož)ášA“/¸J†Ï}f?Å(6ÞšxÊ,S]Û;ôŸWWÏ aœ ×-üi¡°ÿ“ûð £ ÏEµr}g´2žý .\4‰úÖ½;@›t$Y§e÷²a¾`f¹¾B $WÚ 6Ìmž/¯ÙŠâŸ×åʘð5ü#Ðÿ…WÎã=^Ú⯷ë`òdàbxúåÖÝËfL@KöÚ •ú•+qÃjô©ø pOTŒçOÛO|~ÍÈïÇ_n›™m.~aÏ3£Áí;mWÄâ\Æ®¬æh<G1Xd!o%/ëªBÿJ &|â•Èpª¿¥|„Àeo Þ •¤hMY ƒÂj©´ÿ‚è¼]en¹ÈOLÜ^§Çwß¶C,4 ¿_Šê‘uÊúç—–Ô½ j;±‘`ù'Í‚)½4;*-Ï,icå^Å¡áÐ6€Ö$Ò9;ÝË@— +ÁyHWˆÜ~fÄvê¹u™™ç“úý¼<\ç7N²±T¤<ÝÅ-×Aõž2Vé¨pê—óÚ…¤ûD¯ˆo»®Ï:x]xø?öç{z|ý•Œ~g7GÓŸè:›0ˆ88¸Hì–©ôe2áîùLq+›?ë°¶~“®iÔ§`a7§»mï!–¶ïTÛLvÑ}îÇPðz6?FSKÂf»+EÊ.! w…ÜÇÍ ^î8»ûÙVA›P ÷ÝÔ #ï¾=ôßòç. Šy"ø-S%líqðÜyÛÎÉÉøCÿ·"N©¤‚²Þ[‹ñ…ýL‰°ÍÄIÆçÐùXP›l¼ìÜ›b:ëiY½¡ssV Wó(B1.ÃCŒÚ,p´ØÐ€·†°¡Þ¡q+ÖFÿ®ˆ·s‘q>˜ÜÝc1\ÅE¼auXâmäöFÌåýCôUÜúWÛAÝæ‡?ï0þ|ñŠ ..«¸ÉW– Ÿ™õÇkëwŠÝàvxû¼ZþáÊ}÷y½:.c10&Àp1¾mU`„ÔO‚>˜uwH³æ¹àÄÇ=œ4Yýøö+´?ßx»G5ÄßµV= | EúZÁ—u D]5¿ HúMïx .»ZÉ ßh´Œ7Íá ÆËC÷sMÃ7_Æqùé™öÚ… Óïm‡ÃkèÏÿHÊô]‰A>|Ç(¹ØYWçH`Ƽ=É’+µ\KóÛÊ,‚× ¡jbaS>„ùk°B÷Ýk¹²O|Û!YPVÄiih¯Ë @Ä:<õ°HB2‰GB;:lBŠå2ÖUá«Zjúqï¦b ù8˜ª^ÀNM,‚: Áó÷Qk/>*õuêÛAÀ‡Vè ‚é/"O€aöB´×° ×ÀܬEL!–!‰¤•ºŒ„‡RSÒl³ä;¤ü€»ŠóA HÆSƧÜJSÑbh ̇Ǜs,F¾Í¢æ‡n©Ñ%§ –¾HØÿÉ~sö Ÿß¸w4¾Ë8`D9„r6 ö惂Q_»êaÛD©„ wXðz½j”?-e÷N:W6ßÌlàÿ‘Âð”ø»·Á“ñ'‘Ç=‡²Û½Ù½ßÚLΡú!û·ŸRgØ›ç°ïØHú“޲OÕ¡D`ˆU¨c’Á`Ûбè¯ -˜è¼ápYcŸ¦e˜8Ž¿25àœûÌÊlccÀ³U0a2äln«™eì‡Ã¨Õ22Ê=˜W¾ì9M-ÒDi±ÝÑÑöB-ªpƒ&ÖPp[F†7RVIÊí?÷ %ZŽ”Œm %øç7ð.b-á=z>9Ò½î½~ωþ<·vÅ%‹³·@d° r…*®Z8ã}P¶îåqiWÑÃýàpZQL¸ã‹0ŠçFw!†Nœ}U†/â}㵞I~(]uÌÝsÚ ¨Ït¸Ú ݲ\oL“EÉWÔÚzÐJeZögež ñ¸aM!=ÛcÉÖWà¾9¿7,qÞ‘ª8´ágÁBÚP´ UK‘…–F¶“0HùÔê4¸D…A=S.fCâ·X™î£h$}?ÒÜØX¾ìÖð4‰'™ò¶ý7‘^¼`H³´gKµ¶#uYÆF”¥Êõ‰c¢fÖ[Ò¯sY)àtHŠ@1²ìBZÙŸm[6A.« €,ä6ŠÄ)ÿS~Fõ‰^6"fÃð¨øugÕ¥ÒØ9m¶ ”ÔM/Tz"9Q’Èv(ƹÚJŸM’¬˜Mð´ê#L…ìzNY+³Ê¿o7ïf¤œÙýƒ­ÄaºÄSx¬‘;òm0Te¶<Óåoä‡úÛxn©k)Szl‚¬"Ç}ß{KCÓI½½™QýódV`¼RDó&1ׂlt&SàØrY0; ˜žpkv'fk¬ÔŸd=˜ËÿtF¼áZ†ûE£m¨¹hY5_6 Æ› Ö°l–Àç¥Ò_(:€Ƈt·Å¸Vœ{Jÿ/£¨Õ9˜xW‚«_Ðw {eþ„¼{õN>ëþ’ìÈ—vî4°mQŠJ=¿º¥sI½iš®¼v#H'ú  çš÷XK¿ç¥žÊ§}ù¾ì!¾Æ#»g;ÚDOî'笾 Ò[Y,F|€Z3œ,WHCQ›UYˆUî¦ñnßé3›¡}¨­Ÿ®a½Ó¿É¡…¤;d(†+(ú9^>Ü™–ˆáòPòÑý3pS G/Ö'O­B3îæd¸ÿ@ÁÎýà#¨èFVÒâæ.ZpAªÈs9·mCO7G<К4‹B›å‚Ù©4yÍïà:ÈHCópŽˆãf,2 ±!”=Ú¹ÜlSC uF©laDDñÆ)œ©ëuÖ&hìOÁ™j8Ú²Ö³²< êwc†8ÂGÑ·#éÀG³J@œ¾`Ÿ»Õb÷ ›êemAÄ‚ÇÂj”àÉXðò¦ï¥Dÿƒƒ«G¤É'Ü þÀ¥ð±aLWJ†V‡YiºTH¾1.È;ho²éŠKÞãß½ŸºàŽ¤È åqR¡óRø1¦Æëur;ß+ÊYGëÂâa?K'ëõdqÒñÏXÁ˜<*k®á¡ýAâÌ“P †2Wɨ{ƒÀ8ƒ ¦Œ@<#HÂdü¿€9™:q“€ø½Ù\çþ”†í;R+ô¹ø•ŠÝ]ÿ :$º´ÿ-‰ ]W÷#©7B_e~­“P¶zfEüW£‘{B0w*©wЖée¿-XQâDƒÜ8V¼X©o’½=°öm¸º7Õo®ˆ$ùùÖÂ¥ñ _¬Æ1Ò Û û¶Ÿ‘ïâ,ߟ؋7Þü„‡7`ºÑ‡ÁÄNÃEušcz{bw˜˜ì¸«so5ôNú&š·Ö"jþÈYD}~ dÌ! [bÖ¶E˜U>%£Ä¥-@ü †VB0fÕëøþ'Dç‹·¾wa\†¿ûçÚ¶‡æ_„°~ ýÕ1­Óñð´Î¨†Ä% çÝÔ6-bSkY}=ýx>͵QÍq÷Õïш”céD·ÎÏòÉŠ„…Úž7#”rQ‹o[R¸Žñ‚š_,ž^÷ïŸnÜ ê =Ó©6†×feç0̸- ‘#eÙÒjG=[’*5ˆ&¾Ouµ9ÓaÑ?}ó΂h;ÝT¾J7qÌ;ºr[üÕGð‡‘{³Nî]Ú1<ÐÈô­í·Ï=ž+Îu©lž)t4MŒå5NïøÐýßiÜ÷ýøžîcE¤É«"šœ ª%T1øW¢7àü³0·-doN¾¨´è»5YÃPàÿ˜¨ù›Z‚½¾CÞ÷®¨2£ÃØãe%2”&ñ8­ ¯_†1yø¡r/ Ú=PsÀ%¼Ê/y<îÜ/nÖ7o= :SåþÌ›ÿ ‡°2ydP7¦f¡?L0ß»üþŸ»ÜX¤„t¸ílný½îl€cR| ùÎ7‚è.~V·È€UàßBÿsh·¤³Ò¨ä»qá‡Éï½B(ÙÛûþsA½ûuy5Ð2‰u˜)¥|„÷èñÜ>ìøVnÒÓ—)l¤jýF–-û£ð3·ï_-:¿ÌëÃÎ6†)P¦e œÝýk_à»>_AñÀ0˜ªXjQ¦Ÿ_Åg†{òíù¬+½ý?OÌGÏFÓHðü a(UwçݦõìÀGؘÇQÔ£““K5Ì«Âæ‚ÅF¡8 £>>`œã{¹z)+óù,dÓ'}dÞ­»¶ì+52¦AØW*ËZ ØŸlFJw6³ÝåwB=éä›"Û}X¯r·Ã÷È@-µ¨Ý¢s˜Š :W>s° ©Ò4s-®š@]À•èÓ¡Nsžœ›.ÝX|ŨšÙ~P–7¶/ iöï'j¾÷žoÄ¢V.R(í¢/Meíû¹Ð~»„êÈXoô ¦ŽÑØ•¦ÏA“ãÞÔÙ00þ}'ä—;•†%®+5°]Þ!ösz™"ŠÏŽþŸœÙ=•ŸÆi?HŸî NíÜ÷Í$¸ Ùä¾b¯¿-õs €Æ­`žt^f× Kw$ÎÊ‚°RϦuÏ{£ej­ ûËÍD’/÷NøT“¢aë3°ž¼¦í7.´>Çïú±.d-Æã+ ¶ü)œmØùÃr-`š©äc«â1r΄‰¨¡Ù;J­4vµ<3gÃrZœ³Ðż‹œŒlœ;¢Š¹°+ çtÇ@šž…ÓÄSb÷+ÐjâÊ•“vðXz¢6잡˜¢Îj/Sà°Â…y½ÀIJ®BJDF—ÒiBߪô¿õÅÏìW˺gq˜’þ ª·À&`p›Á¹ûËEç×C|’#QXé|’æ£lÌ›,b;_‘Îíí˜xXÓóÊÑdöC4´õ Ô¹'<1?s Ôivæ×8v­OƸÿÍËÕÍ]{–QðуëV†•„i®f-ï ñ€¬*,¡…/lë=ûØŒ°É³ä§âQ1@B‡&Gº"zÄ01ñï5½57ß Ä!Ú‚‰k^Æ7´õP€O^Yv‹O@ìÓnçÎ^^×¼«I½œ€0ò:ë‡ÒÎùìšá6öÀô}޶׆e0/·Ü C()œì@dvî•úÃ4ý@ÿ¯ÁÞÝw¡ ÿdâ²=çÑ$ØJ®*ÞÓÑÆañ¾Á×êT›Û¨)¢—vk|kHt¸ X7zxQñ¦ca7R1(Ô.Æ6 á!,ñÉB]‰1™ #¶ HºÍx7¤3'^È]Œ8’‡ò׸ˆóø€x‚GìC¬1˜¸C'߈¶4\™Ý6Ö óë#`U=ã²j·K|¯B-…fVïp1×¹0ƒ«wâ46'íØ+¶¬q¾‚xàE½+2ÞÝùâ+Пv Õ]äR\ô ý¤‹P°œI + 7–|†˜œ¦ÌÚ /©íÊx‘³[ye}„ë5-†+øéeÉ…°Ñ§F ²-*¸v>1gæ ¶úà4á³ËI™°0v5jÆÅJ§é2]½Zäþ_dÖw =WŠS!´ Î{…P¥ùE;í£ö;C†Ï–²]bE7©ï`—@çå¿òΉ“ê%ÎÒaš K«³ã“ÑÆiÖkáèŒdt·‡èx+ÀñÅÇܔԼÌxÛ»¥=Ê›øm.ò5>v3ã¶a߇ À»ï«ˆ¼Å´¸|¾\&]:ÀgÒš=vÕì~b çùW¼`ý›O3‡µòÎX†ïoDÉó¨ØE(¦s×—¡,X—S‘&.î¼TU>->à@ÜôTשԪ»3BäNsЕ–ÿiÑy.°^.è eò¼ð ÐåKƒü,j¼ç>ò)Ä1¦1o&Ò¿¤*£?ÿ·‘uãéíàà‘WåWÎzavèæJ[­çmÂd ó‰xf»øŽ qv°ãS]µlú]!z¼|²0úX´à{­|á¥ý„6À§c²st‹ «ßàs6½ÏD›50§¿r¸y§ßΤì ^È@Z|‘²alÕÑØjëN,µ1.bŽ‚ÀÉþ—LуB‹¹‚W-E7~€¡ŠÔÓ#6ÕC)fÆ—'±fV¶ÁB_) :ÜßµÞ™;RÙtÅ Ryé+F ?»dCå…ç†sŽ%sÖýÃMgP­Ä¡>ž tohH´e£{tä¡b¨`íˆîS·šÛÿRr€¨Fwm6賿hüÎ@£×[:ÌÆGV»õ8ëÓëÇB½â€~x)>Ì•ÿÂØ\4‰›óBË{è‰lNî§;ËÈòjAôµHÎC醖®8È5ÒÌ=.1 œ„‰`FÎrÚò‚Î긇D‡þU‘$ÖP{‡GǸ£‘á!™ ÕuðQETPŠK¹¬2~Á–…PH¡Œ0IËn³U±Z 8}–“èKe!”¯³Ó"´³^P/ò†Ò]¸߸‹éý+Sù›Vt(Âl1ðG¾ÖªK0«Meõp£÷Cº °lYܯ£‹MãlµÊ¹Û—ƒe3ß˹>••5E2ô  Oðƒ–‹éÆí¹4¦=ÒoÎidµ¾>ÇàžþV˜êÄ™;[!æ§KPS— >lÖR‚×H"ª,%ÔœO0ÐåÁ香jé-22¸B®n-?ÆÄw–‚èY-¥*)Ì’¦K3E/ ÚK(u^]§:½’Ýß.:¿_Fê-J;rÇg²æìz˜¸± Mj·¯õ.׿Ÿ…õÐK4Í…’8g|*B¡ëÓŸÈGW°‚ø| ~üÛ 5Ö'žuÞCÒ‚•ÎTe@]Fy¼!že„Óp~10µ%ðÏÞf¼û8Xø+-9¢ä Áš´(^½Ð×R,ßKïò¦Ä,ÀÀ<ÕÉB›„]Ý?‹OTª˜};°—©È 6ã•w怖)‰äu”æ(z|4×H“{ámSéïUä¼{›PÔŠZJé4ìîè;¦‡m:öjÚ¡Äà¯{¾Ãæe"½òo§âs:0÷ ê§âE3†ð*= tsM>Ö"UÐV×)Єª^´áÀqi¾‹öÕÿˆb>‘b 0×· ´øoîø]׆'€dbyê×îéÍQT^½}.]3É êõ@STSž¨(JY•C¤Ž ÐéWœNÔÀO›òÿl–^ðâ˜éŸÇ¸¿ŽìŽë¦£D M°Ãºß8[ u8z°Ò¦P”µë54JŲ³Z1aõi:Òz8a×ìö{C=×òK…Õ¤êã‹^Á±–ƒõ¼Ê~tè­øQè ÊÑé=öMràPµ¿óéRnºP½0ÃGVëÖž¼4Ù®Ž`Z©«Åy¢²^˜‚Šdžµ¤‡´ô¹;˜>}HZ‰ŽSñAÓ^¥N¨ôÈÍÀ?èá*'DŸD~WµjL̼•µ¹+ðνÃb·ÞÆ2*S…»fÁun¨eËz'{ÇTâ]µóƒ÷Wÿ&U0üyr3‘…I^oÀÔ¬-÷W÷7Ṳ̂œC¦¯In7CŽƒóîhñÉKa=+æ¬F–ÿjé²³t@v‰™Ïe“wMÑËŠ%ì°à±!’Q”›¬0îyÂNžlGû8¿È„äÆŸYÿãMóòø¶E€óí¦s_ðòñ«œY°‰áôóRϸ)rß¿„kë´ð¢¶ÙKw IùÞœË4y®ÞŠxƒU—˼‘”´‘ô4ì¾9™Lìá*¼†n1VÂ8]1ñ°Ä0lÄÍ¡­òŸ(?nPÍŽ’êÆì`òÿzq"Ðì7-å&=²Š¡‘ÓWz¿â@„qçiäx¬àÎrÌÆgù#™âf×êžÙð žvΚµ@6XÀ¦Ú›K$¢9ËPäŲEŽ5ÀSüý?Ö‡üßÏû¡b¾ ìë£]ÇY–póÍë¡ »ù¯Ú]ý0Ò¶mž³Ëô®&SòK‘…qØ–E|_avõqX$¸3'C{‡öê±a'·mÿq ëpÛuù–oiÊÿÐ #‘’]Kï&4@ýGtæ~o{:xåÈeOÿ$ ¹° ÝuW#€ÝI²”õJºfÀ¦¨¶«K¡w+'rty$ÖF Ã&íìa²m2«äÝÖËQ{÷¦ãøÂn|7R̶&_¼ˆäÖE>y»¥*®=ƒžÅ¸ÐÀ\ؼËw `æâ?”D6ûX޹`-éç®s06n>9Oï~rvçï/ûÎM¸³%G’Üólû - ¥S†Ùíû ™L€~Vüû•*z{Ï~‰²'¹n~xâËw7>þ1ý߇*\ /yÔàSØÍÕ¥ý1%qFâ~žÐ mïo¬L ÷Æ‚¹cwüÁp{øßùéö6ü‚0sûã¯"(?¹M> n\ÜJtþ{Âry¯ž.uvþŽÀžhâ°4¾Cñ,V b…4ÿJ±Û†¹ÉݰñýŒŒO–Óø—"WZ¿;Qhfüàð046e˜‚sç.µË¢¶?N¸Up ™’ÿ;ÂÍCx—oMœ«ª[6úç)ëLvý6lFÜèaì$¥œž»‰U&Tˉ»¿í{°n²cÞ÷“ <›ÈÛæÂz·© 2t)]wþ_W“•>.ˆ!å„ñ¿›u#Ak A¦Z(&­d6;íÌrÚt›ºxnB·‰¡ØàUÊ|kJA¥õï t–‡¢tî°dBç’~ν^|Fq«|˜bôŽÆ4‹™—Ç5é[$Q£¿°ÿöÿífdD‘ʘ Ë— ²Ä?GÔúocM)´(‘¶QR‘<3†;X1žÑÒÖ²FÈî5§Œ·í¢PÍÕ£ß'[¾!ƒ{ãÿo ÷DoA ÓÓlh&Ÿ"MÌ&Ü&­Üèá^¨Vsðx(ï°ìyßìò`úÒ}ó˜$ ¹ï~ 7M-‰±¹/<Èæ#•ôõŒº2Q2áyó®è˜_ž¹üôôè×€*¤@`³{³RËk˜~úÂ3mùés(»z;A¨ÖJF}—3¨RèŠêDΛ&St'F³%FÉ,ÙrkvA"ø™Ê»ØÍìµþPråß¿L¦?Z©Ý='`}&Po´lHOw±[˜ß´AB¿èi ~]‘G»}nÎ>»üÄ%Ïr6Óÿoßs<é|ÿï_âfÈnÓáA™# ¶¼ßE»L[>Ú¹Á=^)2XÐ »Ð ê+m=oUíGliµí½ú\i¨Z³1Ä9A‚­G.=\y^¥ýŸn¨Ïµræ €´lè‹VhÎbÊŸGšû¦d)å°t “ ^Hʨ*ºöÅýœ¶MÅ_bM´ŒºlM3€¢—Pl&Š]¹Ÿ£ ¹·MË@ñãµZQ6l¹àýºäo}$“6ÒcÒÃÞþ#}#\]ùC¼ñ"<¼F¯ø?[ô|,ä­÷Ži&د‚2¸ÂÕ:ôº¥§ÛRöæ@~ß9¿`´/E|.Úx„ªøô:¿”À Ê`¨Åóÿ|²·‡ ŠÉÎ Z xD“ݹ`ÌìŽÜR” ãÑ=nÓ‡] ~Ÿ„DŽÙo툭ñÀ-9ÐüQÞ³—ì’Ë ¬>ðõqc¤c£~Àf‡Ï¯JÒ´ª¤;Ûæ ÑbTB.˜†‚u(ÝÝ»cæpùÃvôz†ÕéÁÖµH”õOIZ€H­2†&e¢Z83uJ˜ÁYƒ+Ü E  ³ÔÍ*qoø®«Œ:µÿ‹= I}WOìƒàÒšõ'Æ,c©0ÎtŒÞN;K™tÑ›§} —Ø¥gÏ QV¦pwšÒ+Uûi  ”8¼=™M²GM–OPú¿H¨KÑœ |Î'ôrÊuIýíªš*±^ÐO/qØ?Ô“¹Òxö¨f/« (ò°Ei!ñ¶¢Ï…è «npý˜Ú:ï;H§>l²Èn»{ýö„ŒŸCZn©“<ÀV± rc\óÜTA1dÄ2¥ó•2ëÔy·¬éR.|zë¤nHˆèIÐ×´O¹ þg`h¶zТ’|*Ên7UmÃîûÉÉâïjüç\õ‰ŒßÙâ–'­Z@kàÉ?Ͱ$¤Fnšr†+¤þg®èq+62#Hæ§ðÎA,Sp¦Š|1ɆËô.{@u ÄÍháß$:o^Àô’”á%¢mæ 5sA¸„ûóëÝßpþ0Y¨î|9ÞŠ¨øôŽ€i‚é‚.tgÀˆÓJá˜(”µp'1’Àg¬êÆâã=8© ¼IÙçÙçcÐÎßmò³Ù0±ê<ÿ~~Þ+–Ø[ƒ9¸îhÜ}ÿÂ…[t44o«H• ¦Ðœ­ÓVË¿¾3ö/Oc㦠 A]»+bI3¿(ºR¾D•£b¹‰Ïš „éëò¦LÁ ëœÝ=HÑ›m³ ·ž‹Vñ2þ*+mߞة&£X÷š™7ukœ]‘ûJ@BŸ”M|¤Ò¤h–ƒ8MÔ½”d³­kþx̹ZÝ·”irvð³BÂ-Ȧ¶Ód9¥¥£|rs.^çM, ii»ô$»êÕ+¦¡¸ó€Åqú FDG—¼¯ÔÉ|ñ‰4ËÄAÈvÀ¿©uöÍ•v-Ù˧_ï§É)NÜÛ[…™Øw‰×]ÞaŽ9B³Å¸^‹~Äí^)ôµè¿“7Ò­\âÛoË;Uè·žv_ª´&¿5-¸ÑB˜Yåaú[“ôx=<ñ4nò|+±Â÷ŽHQ¶Ñýú ç§?AÒ¿sûÄè˜÷8û\\ýí+馦¿_v—¿kE®ÿ˜µ˜0Á u\ò[K´ÿŠèü×f2φ«V*@³N\ž×»ÝxS¬)ÔP³ÿ”i³wñ/yn£YLbë™>ùø|å[‹¯:nS;Åúk¹k 6¢¬LXd‘˜~?ÍîüÖ«°³ÀÂRçé“Þ ‹éNYƒåBæuŠH[®72vÁ"­Y9_wÅý^MÕ–uÌÖ;Îθ¦z²>ÉšÖ:ñœ{)·öšX4l޳¨ƒ*±]úÙwjráßœ]ä: ÌfDg–DÕû±‹ÑæÃÈ´|×1Øñ6{¡býÌ•Ytê<§þDÕ)Fáˆú6¨>lØòÞBp—Üén<ÔUôÃŽsù2ÏDoÜPé/ÕØö©1¸nũԴ)5عP†N¾D'Èl9ƒë$8Çî‡uÉ1O`ÛÉ>B03¨ÿ8_{²ß ­_áD-Ü`—£ønÌlÛ Ûðyg·4™5s‡Fé‹}s7ªL¯ò/Ü–4Á!Gß½äU†åÉê7~Í_¤³,O7‰útLªF YÎæ|*€+l±ˆÅ˜ûÐ7ÒÁ#dßßî¹wzRÄ‹ÌhDºà®Ëg¢!â%îßǼBEWdƒ¢ÿ:ó¡àË2ÅMé*sÕÆ­¤›lË\3}„»¹mÎuØ>¥¿¸&¾´ÍEXVæÈ‘$@o"¾á Tj¯5FU«° 35VíúCMqÀŠÃ„½ÑqøH¯]qœ££él·óÃÑ>g ¸±–Eú£hÄ)œùRÁOö¿h¼ ±1 ŠÞŽ‘xìAD~´è½¾Sc2êž™"Ó½4´JÿçU‹õyó7o9žª?<>}´PXéîú*6Ô—ðƒµ¼0èœþ'·i6˜Ð©]З·ݨ-|àã°x2íÈÚM%Aú 'Ü ¹³«^îÀÝט"uyÍÀ:>²>!kº³ôm9¬ÿñ»[Sd.{"Õ¿‡¶ýý˜ùëZþ]©/j•Ë!é­Ï’g2Œþ“ªðߪÔCÔÚ’Ø-Ôw©•éù-•ßWâpDÍɬU[—èÂ,Œ2o€§3tÒkIŒ®êMý(ܽ–HѼ ÓKÉÚÜK®¬êKÌ›Ë÷ÄG—¥ß´¦ÚË¢§ŽÎ†ºÿëîöž—¦9-K `D›uãË郎䥉UVENzc´ü!&OÁ„ÆêhJÙð‚³Gè Øµ]ÙMÆGpÜ-ð¹ ·O¥g_aÚéü‡ÿ LãÀ°wtÖÛæärz*ަ†ß—GW/Ãò l3ì ‡:^½yþ½ŠÜ ç!mÀú)f¿Ê*@2ózþíû4¥ïm¢<.¸õà…¯¶Cùj‘V˜Ü`Š„„¶ ЗJ“t—OdÛÔ¸O±0/ÁB\€ …’°»¯z„K÷Â\ô/XUG›:T#Á{þc¼ˆ‚¥¾Š%e1ÁgGoL3ëQꂞÙ6o%2ÆKòXóÒdHš.°Ž`s®X&ÍÅ åÓâM1 >=[ÚÈ /€…‹›‡¨Örgç¡^7•ãôèÙ'¡ŽÞÃ~jZm¶õ_ö¶áÐÜET™ã&íÖ£gw¨*Þ>ÄT™g]°˜y;'br ¸Õ¤q8ëVßDówñPœÛÏâbVu?˜5(©U´]Û˜Žr–ì+ØgXYYœx¦Uöט•(¥t ’T3¨œÁNøò£_=Ö¬à„Œµ§5ÔÙz„0–‚ ®$s[½5Ù¼ÏAÀ{µ=ÉœjªÓ 8þS$Luµò…œ€AÐß;•÷ŠIOrÇú/Þ—¡BÒ=þ ëÃ…iGXrëJO1¿JÓS†„G’ñºàß8i¥ÐW"ýœ< £„(¨V~NÉ9¯n)›*.6¥ÿg¸X÷ÅɃ)PEŽ[±PÅÈ'è}¿üõ7O)ÿÔh¢‹fZ Ïîb¥P+7ß«b棄)'nç©9©„¹Æý e©JXf ñLáˆÙÜ¢´âÝîݼmƒR¨þR¤zŽ[PÒéõ>Y*èšÝVIâ0ªx§Ý5‹oJ¤òЭÎi°[pfÓ·Á¤Çÿ®ÄŸÎÐ܃ HMX,÷*°—‡5ÈðQ̪ËÁù¯tu„‹ô—û芋Íùç”ü"©åÙ‚ Í`Èĺ|Ûø_7Qs‰½Èx¦ù‹îk$†ôl±}Ü!UakE€HÞ7wßã.oâøçä•BgšÛ{ð¹¿j" œäI/­½Ô)š +JÂzÊyH]A®qaþSðù÷óý(¯”|ÓåÛaò“ŠVä Üà›ïX¿¸ðÀTû³DVØ}³ŸÇY((°ïKw:ߨH3‰5Þz?‡ŽÄˆÚTnåÍ>ì9{§$#/ Nà³}ÃŒ²84lئ¾K­h]½´ç2Õ€ÆèLQhjà­ÒÌ`›g ¨çÊè9Ÿ@}*ì|Þ}H›K*WÿÁh¶Íð?©.WK2öÕêíÔ«ÎÖ·>!6aÍIé !Gf­ùG%ØAî2WJIIIÜ èÝbÊQ®_Êíè2AÝ(¿(­pFû,ÏEÊVJÄßx„|˜©]ÜÒè–Qåt´R’q;Ì‘ÎÑž­aΰUÞ_%¾©ŠÃ+_òu5‡¯šàô’Vþ¡ëk¡?¹Šþ§~ÅÕgï‡;ªGE©68$uÿê €¯Jÿ{:#ÈLׇþêÙø¢’LHˆªî¾õ|ýÀ­š÷îÀ„çÎÊ*ê&$öÆ€#B~jý(Q î“ Oµ¸H3>UTa½xØsnãSß´›ˆG>øöc½#5üÖY®å‡æáƸœø¶¼Lªî“ç¯ö€ï—³7:9ƒn¯ÆËÕ #ý½6pã¤(hÌmÛïúîwh(/‚3¸J^ùŸ¾ùó4áݬb™¾¾žIvšÕ÷<ˆ~šårxå×aõc—ºµþëüê'¶Ã6¿ßux•qKqLëð‹CØ [—@a6¢1Ýý°¤do—ÏÓ†J ®Å w±‰² ñ˜†ÝŠwÑó~Õ÷xóå6 ĹomwnÑh,øò³Ù”…Èc†UÓò{¯ìây3¼ËŸî MâÍZufò‰´@иXÆ{×d$ÂÙ´t2<(8f»ˆŸä:÷xýŸ&:Sðs¬rþQ[§éÃNA`7jS8Ílƒ±y`ƒÃ2nª°MU múˆ˜ ÖßÐî'[Ü]ïÇï{‚]Î ƒ[ê¤#¯«V·.äqàGCl0îQ°kXK¥ …á~§U0ÔJ_õP‘A6(\(‚îõ\!¸¦‰»¥¼æ4þ…Õ F3ܘf‹“[jÒùV0|,.>™) U«e,b¸¹Yä°‚¥°*ÆqŠuÂT>ëRwŽÓ“£HÈ…üì†Iø¸J?¸|ìáXî ×q ‹šÞEþ‘|S›÷ln4Æ% Àfذ?½p[‹ï–¡Â½ öƒÕÿUó7mP¬)`wK­ÐlÂÊn‘¸C þÓ”‰ /xÌï6X_?ÑÂxh9½Dæ|~ôŒÆ©ÑÝújJ-©õ³e ràõý´Œô,ýßY(¬)ÞŸÀ›¸fL¿*¸…ÜÔ§¾ÒÏÚbñ†ɇ#¯;g!Ïf}®ýpoìÃo:¼ÊþÛÜño=‰¯…¶®‚à)¼‡oÿ®éïp_ JïÜ™«Lä"E*šƒiLíOüq~u³Û΢ó_µ€/¤uÇcÒŽÀK7y}Dn?î=Ö0®W% •®S=é]Fïß&Œ¹LovQMÜÇm¥‡:ºéALNÒ¥¬:k×éÁ¶ ÛŒA-ÌΙÂj*ä 2™0°Ó1¹2~íŠ%Ce©Cn›Ó‚ËÆ´ƒIIšÆ²XÓÑ-·%¢ý4¿ökÍ–¾†¡3†Ùm­¶¹[È@ÄAŽ?íŽììàWx¶W¸óˆýí¦»©Hº_¬à@t¡wíXøY÷õhÇ@Ë÷éc »ïûùÝux‹C˜¢ õpðÒ ÚE$è;‰¦JÃÜ7‹º=N©\çB“9èP º ÷éxfÖZÖt8ØF JÑ6ÆrFôpÚ4|31¶Í6Ÿ†¶ëÈ]ÅMÆè}šã¯;~pLutþ+PJÒ`̰§çfP·_…ñ;“ê…'m…äKlÍŒfè[l¶õIøáòÌ€AÀÍû‡±y§€BìFôÇÞ£h§—ÁÈ*àÕ´[1ô]Vt$/WÃEí‰.@e¢€ ÏÁq úÒY'Zdj³³ï’YtQ\:GkùËBŸ¥ˆ•G˜×ö ”æ?ÖèWþ€í­•ì6å€Qån¤€#Š"Üu¾šdXh×ä6ÍZ»Òa£Oãµr‹”†ªžâW–Žyžñ7œªáÔyi<ó œÃ5§˜¡£ÿÀ1=tüõ8z‡‘$,ƒªY qgîæà*̘/îË¢¿‡³\¥Ø@3^Òæ5X)64ÿ`×~–^tfTŽ{®KHÍ’ÕP†ÔK$Áô5«þEî™–¼ ŠÂáú껄]ÍP0 rcö2{à}`'ˆ™<â%\ú¹¦’c —”šZ¾n¼Po“C<=\v:«Þ°+Jád€¦%JG¸ÝîË€r–ŒµŸÞi20EFÎe,âÓc.{i MCL´Ã‚êÔLøRGe%˜cjUfÁÉÁÓGø$š>*D $wLV"Šå޾ܩÛghéM}hEy2¨cwf9b±"eWÄÓš‚q¡px&ˆ GJk®3`jÁ*¿%»CÓdi™Ns"àpIÍU¬®›4º/ªÅŠ(z³âf“ðSkȮτ!¤Ì%võôÆ”‰“´„“,ж9õ8^(JsvÕ…÷åýzÎ;Q!ÛáQ1úT¬ä ‡PqøbyéÊà À®awMà…k«õA)ËøOt¾ DóMõ­±+1Ÿ,þÞW»¹¥„y´x[mìû^5R¾óöH 9†å€aÆ¢Þ% Zî²ÖJ¼dŠwfŒôb`'µðÏSÿyØÆïþ¼ÿý|ùâ ®žŸx¶K6òj—²'»îg,#iÜÛ 'À¬ÆÎâk*y'Äu!¸Â­Ëò(>5ÆDûõPÔf)×ì äówv£{àëS²,úRÓÎ÷fŒ#uzí8)è ü‘þ)ª‹‰ÂAIÜ1q8t›lFÍRÉá(2ìâ=Њ˜ç)2,‚á[ CI›PZñt— ÇxèÁhG{a;¤Jº„‘™a'o0ã Œ¡y+í[[ 5 ´B%‹ë\x²ÐÙ¥ˆ9»¦¿é0ŠLSkEw±…²ºW—&PÈ  G€TÕYq„7¼h?n8áÔÏ%ý"®ó›µìJŸ½ŠºŒñîÎD \/£9æ@dÈû©:þcÇÙö©¶mg@Ä ¿/ê¸ë̦—úü¢ï@3ÏG~]Þ4è2Õý¾ž`>MxÈÙ}yÝ(™›Í×f–¶ª·Uú˜Â öL£ÝƒY‰h—-ž:Þ¿;°Ð–MŠã&œÿÎý— ù)ây÷k~ ÚØ\Œ·¯§z8ÑÕèîל`CÁNâË ¡œßÚçŸ]‰%PuÿoM ;*ÌÁkÚEemO –ÚÇ| ýô¡çˆå¿”œ=>¾uáÃ*qŸdQÌé– ^¹W)2ÆÀÇ‹qLí‘/Üøêè¾²–½¡óRÐöÿïµÕ߆·ž-ʓׅyýõê6¼üS¨_?ôÏO¤Þíí¯ÞÝ%þ4djPYÿ‰Î¿ùØíƒÆ–ÎX0³Ÿ9”óÚϾïô¯ÿûÂü…jS"c˜»wXi5vâr a +<‘ä§b•Ö*–éxý*àÕH'nè¬Ïs|_àS­5Þ´ßjýÿ _üÚ“§c«Ñ™ÜAÛ¸2–®¿å‘Ô@Õ‹/Ây’¦¢;j«5¼LˆzÂ'þñQ¼Yf Å*Ì̺´ÐÞíW›GpgñìûÞtÒ›_‰ë€ø¡Í ªö|¥@/´ÎlQ-NMhNThà¸~D¡Aºrëº=®À8ù ÛÐÉçÞ:"Ç-ï¢ýXþ °ä°°k÷·^õ6t~šØ¿Ë!œÁÕ&4;Ehû]±wf;¸ÿGßæ\K /ƒ&ï„ÖÀvgW_~þ÷ð4íвZ‘¥‹s\¿¢êô”¼RYóOê¶Ëc† 3a'x'–?;8/|‚RéÛ¡Ÿ·¡¦. ÊG5ÏL|žå ë;v;€ÿÓ4dCïØý˜:+vg2ò,Ãæ¢pP¹õmE0êçi·ˆx?t2á•v•# €‰Í7¤®%¶þ檟’#?ÑMò>WèåçŸé«ûû½%ô32$ÄGVÿÕ6­ä…„À_ýSðN¾õæ,©oÿè¯h|dÿ¾Mú ³ü´0ú#öÀ+õÝFtþu{Ù„~Œ³ö3Òz Jœºe`q’æ ξL:Fî·"’]­²Žÿòë·†uan^Ô]µu¼-È÷AEh|ñ¦ŒmÈ“®¨‹Þwz% ss”÷;#žNžÀb#%º°Ë(Ká?¬aë ù®°,"³®r¥J·Rß]äéõeß›Aω,‚9Ä™y¸æÚɱ\û³[¨&Ï„P=0ÿÛ,l¡ ]cMrà±]=Ÿ+<±/äHL;ð}¡àLš6€W UŸ™>õ¶8á³³I곫RƒvHì KCp(ä@ýܧôŽŽe%ö9‘üO¨âão{«±áøÇ·<$®Oa" lŸ-£ÕÜ…91Hù¢ÐÁó%Q$ÎöáºjØ};$ú›.ÐÈ'vö.ºÂ‹†¶Ðçú·ègË©Ž$Ønë4%7Ê·µãgk­3ˆ5Pêìš íŸ¸0–¶EÇK\+æ 8¸Sê[‹m¨ ù#È ÊµÚXŒ)Ð…ø b?=»©Åú”'b+Ó…Sm1D¬¯óÔbÒ›ï~àåHò¯2bËl]p¾òXÞû_úÆywä pÆó”L4î=£Â¸_c®#Lÿ#ÜÂñ&j,‘BqW|jy(.Œ3(5~:SLß¹+ •ŒÆQs"~£pt ë¿ «¨,ƒ WÄ ‡CG§2tˆø4Q´&n¯W71í`),rõèÓ³­§Á4v|¬7MZäæ(\ÖE£N7¦Z+¦H,4€ìjâ’¾R+eGY¥yn9IËö¼^x]‚y1 ¯Záþœo&A‚ªz“—•Êç„fl9yV‘ª®ÇjÞ¡og`I⎘VlöÅcõ­6…”rFщu^T¼Ã=T¢”º2/.1ÿ±JÍæÅ–@—Å@í’Ž+)oxž…ê„ “(¨°Ö•*™ßaû…‚ešFu½/¡/f#zåòŒÿ—/\né‹ó4KDJLtI¸4}†XênEu•oÁУØÓ%(¢œG UË”·±¹`9 }éÝúƒÓ l›>1CŒ&õʵÅϘßîƒÓiÕmk1¹;luAö‹ cNÞÊ'æ èu<á5ö2S1#.ô‚»SK¨å)ÊkAù˜žGÃ!|pè@Gôú;E瑟4Š?ä!Ñá1PÊÞTùŸé~-†01V9!oÆ«§_~)µò‡‹þÇäÂ~Ýg&M(ƒ×2¢9=´ ò\Wo 9f•š…J…Ϙ;Ä2ÞþË<ð]?Ÿlùþø ¸kÀ¯¾ŽÅŽÊ÷.w¯ýÚ½’¡f¾Øï‘kÆTƒëˆID†Î¿íýD–h6Hò©*‚ÃÚ÷¢úÒÙ…AÎY’.6qt"jø™×v>Eõ71£ßmx¯‹‡¢‡ އ­wÕ´®û³Ÿ ¯Wº¸S€–º Æ‘\míÿ_&9{!œqrBaàC"òîÓ “¤ŒMZáaõ_! ÕÌàK¢ønã@Z$÷·þ’ ‰Ùn¯®m:âïÇ,{7¬àwn9š,Ò٪̈eB\Ô3ËO™°ˆ$çOFµÔcf|åôª“ÊõsÌö‘I4*ÿ 8E¾Ïè_Áœ0•ÿ±"Tìâ^tÝ·&çµuw¨ÒÁ}`)F‘ìpzÈàºØmÖçNܸ«\y!Œyò‰àZ#b™eXk³¨yˆãOp©,À´ßap8#õn0:@ëd.tÀ#¨!ó¡˜×£Âmu Ö›–lëS²Ò˜îMº‹ß ,‰CfµáRž».·”ÀîQ¤@shŽëPšÊc>ZÇb¿32œI1€¼`å–ÀMÆ?½>ݬ²åÄáø¸bQaZ]á±¢J¦æ=¶rEB¢ç_jT/^*ªº´(§/ml¦,ù•ï“‹ÇÑH»ó-PTE¸ªêÇÖµ%uôf¡ÇiÄãtòÖØìÊš]ÿõå›_=G»!/¶z@Ù«÷ãó„ê’3pIm2_¥ås˜lçL¥¹û€„Pdí7²Ü{„‰@Û›hÞKÐEñÕ°2þõ÷A2&Þ.AÞëˆÂê‘ ¬¶„YKï3çÉ¿At>h1=Yå9®Ù|)=w3 –þÊÖžËËïóË ÁQÛ¸–Úú‚»È•ÌýÄä1ú* ‚»œ|•IS§ðØy¨åULô:Ý#÷Ÿ³º~yÂãlû½3ÓƒxE*òË£Á`¦•8'çëhÂóôÏÆ:Üfêx|ç)ƒå£]|Æèb#/[[ÿõ×ÑM›^’CƒMÓ¾ÀåóLÃ5M±ÚÁXJmÖk6Ü1cwÚt¹²Í—º34Vë+KêtLjÎQÑѲ¢yOZÊ’¼„öÓì¡õf@¯Üõ`bð¦B)ó cŠ,ç €>“¶¦Ë_ÓÚgY ^ÿT'åÖ¡50uUô¿¹v>Ø(át³W ó;M©…{D–*zH§-–{ùò²³¼W÷ÂÄ™<Ó5ùÃi…->±ZMãä]ªEÓB¥ãÅô*PÉün|Ž­ˆ: ÌÇÐq•’uBU.9Q©PÓ;¶c ñ*©¥‹Þyö¢¢}¥°bçÍ-ö²UžE´·½qÀAÞat»oª‘Æì“ÆÃtj§\Š•Þ^ùú–&¤h¶”9º{Z½·æçk/]„Î\Z¡Q³üê.šIk…½[)£è|^S/¸ï>ò.¿c^O-1ÂÛÞ„æ§{-]X¾ì9‰Þ-õ"샿ߞ’ú+Rà×jq¯RgÞÛYLídqTã8¨©‚ƒÐc§¸‡U>¦ÃŸçYh„ßç!ùÝ ˆG³„éÓ|âcn¯‹G+© ¥¬âø"Ä„0Žtñlù%OÕ݇ôxc¥©Z‡©e˜-È_URÈ àZÓÒyâº?èÆe›qÃlïàŠ×Ô—4q å8q}‡¥èñ›†ÐY6¶À @!E]8{†ìvOÅ¢ŠÄnžì™þRI³32Á¡$@A¢Z€÷þ\Ð8ŠýÿÙUùC˜ñoµÊ>^°5yíTü› ÿ% ztÕ‹* ü›m[áÀKZB§YšâΆ`:2æÊ’Ú{k M•¬¸9š®üpˆ {¿µyA{™Œ?°–}Än®®ó)ÓôiÜИ º[H‘z|½s8ÈIxw•9­6M3°²y„—ãbˆ £ì=¨Ï´ Úôôø{¬zè‹ÃßCa¾­èKi):-ô˜¼ !&LW0ä+¨}àsÖ¨áï2t3Z}‚4f-‡µ =J8>ºÞ¹þw®Êeö™'7 ƒt JõˆúKN`!æýPD~°èí)ÿ14£ç‡¾C›\ pþðÒ9Ͼ"¾é=ÆÚ k6íh}pwÆÙEÁ†tÀ >Cw 1+¯:¡"áê¡+gn0³ÊÄS–ëì»ak=NûŒæÂSÎæ¢ç±ÜmYóÿ¯ˆk¡üya¬Ïž“FÔã2[ÐO[q¥,r.4ÃjUœ*ÿTHAx+4j‚0ý¨6ÇIÇðÔ/ï0Iû…æ 2¸£hFWÑ&HýsŸT“nVƬKÄd’¾$8@§±È2O»n– Õ”¬`Û“ØJN8ƒ0.ˆŒ!6ÆDÒܽ’ྫª’!I# Df_ýSEµV`1W\$ße(Êfs»˜¶U®ZÜ£`u$¿B"Kê—MУл„K';=w‚Œú‹ |?v‚=8gÂ*ž_ƒ;÷Ž£ ‘±¹keЗÇD(8Ú9•ÁµÅE'¢1AûߣUŒ+4¼ÄôH}q®ý˜1Íß8HñË|±"Bb#oƳ/Ÿq¨§kØQðЩ‰ƒQì›L„(š”›š3´—tª¶ÿ§~®]#^¹×·^+*¾aÇß2_ιí‘€µ™wÃæ3©’x‹¸Õ¬!g§ÍÄ#~ º}§Ü"þ´dÑ9O;˜ˆÓv‘$§‰NEûõÔß j*Öµ“ƒ·ÌËŽaì°îÞæúO‰ ¿(m4Èß„ fáÖA±c8X£¡‰^§Xnœ9 ºÔé_Ë^ƒ÷^Ùl§ÿ¶Ì†r¾±{áÕÈËuLÖ¥ÇÏèœ(Ø àØèõåKé’%ƒF|*r½ø"ó4÷~­¯ü ߼׳*hzüÔwãµX})<»‹µÏ1ÅT#Y~  Ëè;+Qªÿž\× üøŸ®þŸG¬·/¼·˜h÷ï=L¯¿ãfX*䛟ûЯù²ä~ ÍAJþYâV@9È|Á°ÿ¤DÓ°÷¿Ÿ? Öý‰Ñà kÞÅÐùçGŽ9|ã‡þ‹Ðù ÏˆÎ¿°°¿þã¾]è5uÜù€$¦–lg%vwà%·5WMËØÑg·;™³ö-±Ò¤ˆ$Ðs4Ûi¡åâT›9Õ̺vÃH.)ìÜÌyÆdPË›‰ô¶oÁ‰†ã_;½xƒx ¡<Ùs#9¹^jÁYNpCgîM'˜ |!téÅÂ]ÚéîŸð³)ç8ûÆ‚ö{61¤&9»Z› Bb§¾Š›\ÿ7=Áª½.GŸgt$€Ô\¿ (Ú0Ù+³} ›Ð„az[~3!{ ÷φŒÜGÏîîùE÷ý nsøÉµï½ë­Ú›ÃÇ +kãü‚ì„ö¶Ù¬C³Þt… µ7èŠtºÙ«©u ¡ùðÈ9ݶdÒ1öqò‚‘ÛŒìŒa:¥»™í<Ù¡ä壋ó|ÎãŽíÎímŹ`¬1l#Óîcîj’l£ 6€é°8W#šR‡0ÐSŽÏòN¡›“dzÙö¤!¼åƒùé·Ï ýo­|ÞZ¤`à‘ù-Î(ö²",ѺȘÊÑãÎå\ä:¬<—D=6UKÎ%‚ƒž/6³Œ1¬#ô#š}Y8 5Oõ]™– Hpf¼ÍŽë1šùs†Î$Ŧ,ÏKŽcå˜]ôiä+ŠïQ‘™`þСÕ}ñO‘8,žS[NøUŽ‘KÐ_p·éoß,­Oɨ;´Îýœl'Õn·¨î³Mû?ù”©ÈXܛ鋣8iÃf-®Šƒæ"'pîk¼Så{=wR„ä‡ý4O±„+§élÓkqF$%~‰ì¦Îíóú6™Úò4»@DP⪈;pU”y/&ƒEÀÿqL@„Ôߪ†dùIÂ{S^j#äŠw2p’ÐÆõrÆþ77ù–´ÇT.Œ7JVª„Ølw£ôhÖ³ÕwŠÖ ‚óÌ£¯¼"D¦ã%~5`P’ßD¦ °iƒvÂt¾[?ªLÿÄO Uädl,ÜOÜoæÌÆpgDz‘V+Ij‡ÅIXCy¢\/5yÆ~r[üfoæÜÈõ{jÄÖ1ÕÒýõ©ãE¦÷êl‡MÒ58¢„Ãn\cÉÄ–ÖѬoŸíœU½Ù’¹Ÿ990qiÚqKmlAó­[L]e´£‰Î#º”X[†i?LÌj@÷{qùÙa:»]_+:ßtfÕmñ§Íûp/ö ª à£ðëËËæÌOEöüN æ9øÓÃcÎ}YÏ„ËR¼·Î–ægœOø9ÒPã7¤Ð $eÞËe‚øH[ˆgÚ‘¯-À·<é*y&¬1/λ ÷?4A(ïí½ÍvÇWBGÌCgþ#ázû±¾2ùCº.γ~®¿ë<¡ê=ëÇÁ"Tá"Gé‘›¨åÐÆiVÚ_¡¢*ÀaÐÞàø“{HÐOÜj¨@|Þ²í&„™;åèÓ²g‹¢ƒ}»›:”£àV£u¹·F,Êæ©íæÀE†‡ðb>Z晈GƒYÕãH®Ÿkââ°í@ŒÆ`ب_ïùÂJŠ à›0° k€Tï.¡>ôQèì%‹ÈëÆ2–'¹+5¯‡B$Þ ‰H¯m–Ž™,jIX yVÕ1G¤=¤¢=Á8Å—°Ïêû~þ.gÃíÁÉ‚G8¥\óȦàSyÇàAz×F½€d]F(}Ñèš^IÙ·EêsÐädÑÕi û-8ô¢wêªVÂ#œ§&6G ›-œ£IpðÚ=N§çFžý ÁjZºd´]÷3XÅ2…!ô(îNM>hv AÌQ:ãéT…6I‘@•a3 “¢Ñå|ÇÈ ù°± O0JdÉÃ|FbÎ'Ñ«%Öà¶FHký≆êçÙæ°8^d1}8 C{Ìn•<63!XA ^W¨{A@¦|1L;Z̆¬,1­F׺@rÔZ r]ÇIƒËƒãúW¬P{<)Åð8x™cX©våÚx­ÞÝT&΀BÖÇŸ æ B=szaÌ•©Æ]ø«&µÚ'—–¡Måûˆjô•¡=ýCOÇ?-ûqR¦!÷‚ï`˜aº|„þ‡[ZöðätÂFìå‘+å€m‹‰ê |k3ìæÓ¹‰ž#qwrcB¡›°îÔË ai\=8šÕ3n`¾åÀe]ä~sSám‘ºÌ-LÚ~P ³ÞzÜ(,³)E§N>ë#á©È€ëñ†J{|ï\¹š}Ê1O‹jÕ*¨ý?ý̹SR’é ‘ƒÈÝ5ÎÕUïàø¨è|ŽtåÇ]ºÞ¼€ª[å»3‹h¾¨ÇoœøÈ½PÄÕüu ÑI³jTüó&1]f{ŒÝ’ßÜË­Ã)¹Ê Dæ¿=“öïçåËç~¢šî›]:Úáå—»GÜâ½c&ý9ŸuCǦÀ›ŒöÄÐf»èpJ¤™fK=ÕþñSáay¶úªÃ™/Y×+*þŒÿ›£lDc­ÔVBJAbÑ•F­9F•çÇ&yyø‹6 txÒS“°mضíàücë:>«@ Ï}Ÿ¡ÓdŽ÷–Íû%Yéƒ2ÒwÖÞ<ø-¿ry8WoλØÏ´6F#‘:œ•5÷>Ž™ýîxl/ÙÞ¸L?‚‘Ô 1¼ù˜Ѝý .„}€°Íšzמ´sv”¬ž¸wÏñÎU [þ6Þ‰„뉉}ï§ã‹–Ùÿ©\kóë³d¼ºIßùÄÖaþl!ÀµãÌ¿Wœ~°ÐÅO9A¾û¬²ïÕ^ÈHÐù‡oܽEÐþ™Â-ï\U¡°=÷2½¼ojêðG©ÜàãrjA5ä‡ÀÜ|ôWHÐýŒ²’øýí÷1­r?âAH¥å¹µØl¿tµÔ\¹w¦fÊ©tŸhÈÌ–s3Yýw<2&>¯ý‚1Ô~T¢Äœ{åùÆŽTîFë¼KZg¬!%‰Yæ&ñ6DOiå©Ù ÃÚ@âX“˜o2>_ø eš¤˜Ò –·,|Ôó÷îTó¤Žs¸¶+Vã¥ÃI?íÔdO!Ã7§jŠI”,È<G#òs ”QMß™ö¿[Ï+æÔm’•¤ÞUè”h­>µ·ÇZ_8X~pß›7­x^’vX ¾mç¨îqÏw÷p£øDÔ‚éõ …F>>éñƒaw»˜ç%žCjÆäî"NÚù¸!÷½Ï©÷[×­Uq¸C»íî À‘Ö) ßÁR:åàR4ªÑJg¼Ýð®¢ÅßPÿã÷Cîˆqu‚-ï_ ú¿akο”~>Çľìxñ"£FpÍ t!r³Œê} å„û›Ø­™Bß”ÆOéé†Ge^¶v†9=¿ù·0óÝ¢i!Zø+ÓNY)'Nï[Ì"T €´O¸œK'&#˜ªÖÅLÁ·Ñ(Û¢}aku—UIÎß5ª¨“V°µÛÄH!z‹ª?„¢õ·@š)>bœWÆð_#Íl …й‰ ªœø¼%£ö¼KA_ˆÑ‘#]uó¨äø§w åŽEjÂ×S;j‚Xb°Y¬ôÀÔ,Ñ_Óas‹4MN”øn“.7^î½G~h‰wæ¹W—uɇțJcA8ð:tðIôŸÌ*È‘q²_­½9íÖòlÿ[oqÓØONn”¬ç8 ƒé×Dá zÊFÚt€™ƒŠ[gÊò¤™ð÷eä«Ä‡¦^w_Ò}5T·XQ? ¥âm¿´ë6å(ÒÛ²×XnðëU ¸ ½¸–0²v½~¤d•çó›«bbyral¹ÐJ :×¥É}zûk7|zXÿ¾Uâ»÷ÿ­è…q¿­74úî?â6o^¸€Ed$yÉs»bð±ë×—#þ_+:?i¸™0ã›4{Ù«‹AÙ,Žô˜¼Rät`ë+σ§ù(§ Óâ—Ú~ä N·Ià¯/Xls–"g Ž"1CÚ¬¤åüðò(ìĸ¾ƒú¬¼­NV»tŸ#©\áNªùú4?Ñ×ÚE&PkZT75 ù–üõ'Ò]V*ÎÑôzï|Ê4C@&…5øÑ(¬Þo-ÃSuX…Õ Vˆb#QtB›I÷p@S­±ê¤?°ñ=¼™wuD¨ÈNÃÛ£“™ Ø&‚&.Å<¾ÑÎAÙƒ·â« †ÏM™Ý‚çM-}¡n¹9;ÁEKggï‰M˜Hœ ½#R¥a;ÑiÍ7â|gõϯÏ´Ö…8ú2‚;Y,f<' €æíÏ ¶yo ÚuE•@Î8˜9çl‡I ëûÔeÿÝ ZÄýq¨¢¨ó/Év™rÑ{žQáô!ìc®îäƒY禇ÔG ]?iÄ“–ò]ñSÉhø¥ RNtÍ®Â^žèÍ Fgê +«< p¿O  'Ýý$â¬TœÂ‰À6bcìBÌ:H>'jžN,7û6³cNwÞä&RSù¥ÞŠN÷2(ÉÚG»§›£Uo oãƒwßuÅ~©ôµ@mòZØ6ó q曘¡3’kÊ%˜AÎ>iïððü*Oùöćâ¿ hjƒ¡=ZÜ·GhÝL–­³ÎÕ‰Éë‚âPgcy ®AA±ŸêÞíÉBžO¡|Æ?âùú?Æ P:+³9Õ^º9[„?Øü‹ç8ßV3— ŒfNgDÿ†Îvœ>1»MS¢ÈÔÁXBS2âß.:ßµþµÁ›ôeE0sý±—<1Ç»RY”iý1?7Ÿ j"¸&ua¹W2¿êÒlxŸ¹çÍõIIÅç‡且Éé¥99œ”˜`™OÈšÿ¦]þýüÖì=¾Ã ŽÒ¼~ùvñªØis¡¯sDÞéñ=÷ÊðAG±Ao.³Ûßi;¬ûd€©Ž_ÛIöãsè<2 Sñqpßõ+'k0—?ôž ÔÔPz ›¤À QM´rš¤}i¤ÀÇ I­¢‡#%xêø»í´‹DëôlvøÞ3>;_Xæv plÛ:‘6ZEq>VI/¼Ú“ü3§x1¸8 /b3‡—>§á»Ø¥Ž8î]d9§5k°Ð¾h޹Œtý“*ò¬d·×Æ?q*éâYañïÇ6¹ä{JpŽÓ›œK(žÕa›ÓåJàø+$LpÜ[½‹Eû¿&Ú­nd}tšt* GPºP“•õÚ&# ¸~£³³jÈÐ6 ?­÷ŠÒW„!ß$îÊ;!ö®ê+ùh缟±¾ƒJØ=Ö°Ï.ÁéP¹3ðþù²ž¸xë¿G:㎠Æw$C`åþD·ÁkþÍ €IC‘˜ãL„.ÍÎ ~ѲüêUÑs˜KŒÚ컥±€iÃgRŠëEÀ/ÛOíˆbÃ÷K³âîÿDçÍ üš‹¿¯fÛyõ8ðû»Üœ09ËJæöDÿMõ×Y CyD­S¡]Óä˜Þ'o@i-iôdÍA’å%iP¸É¶~ņ”º¡Ð| 9­×0 æ·CkÙª¯Þ ³n€u¯ëóà‡9tR3„Ð¥Rb[—’ÖXDšÏjlÂIÇ@ɬ²/í{§ø[g(jO¼VîͤL¥†ÊµdCÊ£ˆa&á„Î÷ý¼!N¿¥{º ŸÌ:åArÝMµ¾I3Û›9¬CÌM3[¡øÄÂ[ñ~ ! >A,#è<þy„!ˆB‰H1=74ª3„—îî*ÌöNª&¸ K…£¬ ¼X †Fdz:õïhØh£®®>Y¢lMÝÁ5³M¦U1P¼mÌSYøáñž2?"—1n,Ú?õ~OqhÎÑ=ˆÖÖPàã€ÆÒ*Aðr#<œæ,êÓ€-Ÿd™sžôH*O5«|äF[;·Ñ–Ïå@wL>÷[¸>®ú°Ñà´Þµ_Ý2.©O2¬AjÉA›ÑÄrÇ X·>å^Úoþð¬SÆ•š~º«`káÛ¦&>Ðæ >Û–»ø&¬´ü]–†s. /-&ú¾pý©Ï6IU›U¨ÎXCK¡yùÑwoÈ›Æ)·Ñ±ŠBþ%5ó+%ßéŸüt MÓù›%¹çí~ÂÈæÁÆÇï¶Bøñž8œ´Ár÷LKðý ÷¢_ý7@ÒK .–>¼ªÚG÷+»§Êðö'ÿx[]|üñÙ- $2{ã5:W]þÏiªòèeRáþÓ_x0ß:S¼Ãš(’ê¸s´ ž¡Äüú5ãÖNDO‡ŠyS&˸sФ‡ˆ÷#LvW€»B[/…ëkS€oG§ÿŠè<>]&>Õ¶œ´.!ÉòeÃý´3+ÿÜŠö§ž‡NqèQxÞR]Ÿ–r(‡˜Ó+øÓ ÷æDIT-Ž8õe"žY1ô1×ûÂÖˆY¸-݉X,XÄ[άºr kÑ{xJ¸¯ü<= œ\“b ðäó¦7gÖ/`Â:|¥Î·6Æ`‹ÔéÄÕBƒ¹õ„@3ìbGr^>½Þ„ Š”¼õÔx ×˜8¨ù]g³á«~\{Û™›uï‘¶Ð;n?äzÙµù1ð³)düöx·myA¶‡y2š]bÀ„Ò¶ùƒó‹ÜT¯‡¤Ù³<Çä0ݼ!SÕ‹(Õ~¥ &zf‹ÐÊ‘c1I×û„X‘×ey Y‚0=o(áÎC¦ /©ÒVž7 .itÐ %¯š¸Ûd¹§ðÆ:eKdÌŽÛz¶PBié·2™é˜<òsÇÙ8ôÿbc¡i V×ìô1pVgO®fmåÃxä# WëS¾‡ï0{¸1RÃúMŽ6”tâHˆ:†8so(nÁ^>|63ùz—ð2AñgNÏ.Ø\y\•®m–º=z .¤qàJ0z— PS6sƒe·ªÿ¢{žñ ”Òÿú7ªYçFíª¶l˰,„Øo–cŠœ÷âִȽi'0''É)ÚäÝà=¼DCŽ‘³ü0Ýb¶¯ôO Š&üŠøtìi¡ü³¬x-K„{+ZÔ8C¾Ê1î8/Ö›×d>!nr`ÒÄ œfÞÑÕˆ<ƒ$G"TÓ/¤òaµ»g¥YßBèΣ¹‰q¬$n&¹L©>(ÚD¯Q˜PàL@‚{XVÅ<—µÕåšàþ&p³-´Þ—kÔlÄ¥þЃÆE¾Â°Ëp•_,)gÒA/ézÓÂY ·já~ŠYÁ‰• d‚SÔ» ;—>yqQݳcÞ™Üä ›P¶g8{ÊAŒÍËRHj’„ ªòpûU¡êÀü¤¶P|ŠÏ çN8ÒzöÇcu8y·l»ÜPœ|Uß ¢?á¢Ï#‹´t¨8ñ¬†DhÜ*Ú/æÛ¥S²É_*:oƒ™D'ÃŒIip—~tG hÝû,–í|àåÖ+qª›çÚãŽNñ†õdz‘¬˜YcÎBV¤r„¬Â. ¥ˆª5¼T3,ïÄûPü¿Ÿ/ë'þ©T Ùœðiîâ ßq“è;.¼ûÕË9«Rå°¯€í­”"8YÒgˆÒžv|øOÝ<|òö¿­ˆ$¨Ô€‘ˆÛ‚àÞ Á†%õьն#N>!Ó—k(éï;µÍÐý‡}½×d†Ð±XŒ,aâ(!…¨8¤Ÿe÷:'ÔûR]÷ôà2ê_d¬UæxL‡€—÷Ÿ;¿¿$Ó¸ú8‹ÖêÁ¯O}ú;ð¥ûás_v5Pr‚=ùˆ«¾€ÉòEjÏiÀÄ7 ýyDb}o—*°ì1Ôvá‹«õñ €â/[ƒÄ­Í—7‘@ÿËsâ± FÈ'wøÍ €Êìúõ0õYoXûtíþ$pC`ñ‹Ç»åÕƒc÷·‰ü\`~î–q'È|f ú7(áonzg?¿Í ·Â‘¯­L5ÕÔAzgœd¡U´®ò µ5Zè(9GBa¨+)dM÷QôÐÓr=óÿÙ»²ÅÖq\‰’3ÿÿÅ×u$’X)Jv–“ާ§ûœÄ–%. Pª¾?”¦Fðô¼{ĪS:§Ûè}÷ÿž›Wó“Î._º>ª(౩€ˆÉ—0ãº>qÄ jX—öX·\åzZOSÇ< Só|úáǹ7`ä¤p_Ã"ë öš<ëòü2Òùn…U ÝHx"|õÒtEì²[‘|GÃ7(çú{u{“k׸Ú.vu½M’©j= P«»"ßBdZya‹v3Ê6‹±ŒÖû£yðlôÞbj¢ŸcÙhˆ§j†0Չ谄^ Å¥Áì®:¸7øTG_/é €éYxÀø=± H T#´œ=‘°% ZñeP³ë­³ £RDRöŸeqÌJ¨ié¼·‹ó“Y‘Tt u õÝ«ÿ;5U²€›òlÒ°†g5šö ?9’_(NÍŒZãÙÈ~žCp½2Ã-[> 4Ý~ØQiÃò¿ã»†«#[Þimì¦k3¶#ݤ@žÿG8Hºµ*FƒÎXs®v`>ËPØúämÂAûá ìž'èݤÙmý†v ЬGÙ,{ªÁmµÁdúßÏ!™!Ò©…”äoï˰OÔKó{g€Ý"ÈŸ†GhìýšMdäsm6’{n`ÛD v¢jŒm™uR¬2gµ©ŸN¯’BŸzŽ3Ü/1…÷ Ù=5º–û‰íÑ4|íñY›&XòzzKG§Ý6ž]'«z\©l3µ©‘ZÁ qšiT×ü(8} óI± £iL@Q7•ÅØ+­Ô'2IL_nï@ËÒ±Ú zJLÿsh! œ¨ ŠÑm~T) ê†ø(îj 1Š$%ywøZ>Š}×ÊGÙ×;œ¶UUL`ÖûnJ£ÚìàJ»û¦°F 3ÚÉeº³½kœ(0ÎJ{à¡gE›%Žv/V5 s¢‡#kw½Už‡%î%­ö45—àΪQ>¸®BcVŸ—ѱÝg;Á~Ìà5Ý{ÑŒ«úÃl%[í¤-]yt©lÊb×|Œ0 áaa™°‰"¹bìóp Ì0kr,[ŒxÍ®ª9ÜÕgc†ùÐU®³—éEë òo„èþRH¢ÓtW^7¼P¡Ìã ÚSéßÒµX`R¯z“t_še`¡=³È™!D½ª9ø9'}:éf!ù{m ’L;’´".ÐÄëo. ’†½·—6ë¶óp§r3’«µžÎN[M®áR@V•iáˆõRŽ÷W´k-’æÍõ¡Ú°_Ù¼w}¢ÓgOÂÞNÖClŸ¢¨µõæ*ßö|Bý¤ƒñ¶a¤HFݦùÕ0GÈûY¯YR#=]˜ŒXÔ’x¡ ¼wí׃܋ÙH&âk8'5­¡ì4RA_<¬GÙaî#bÚÄb죡{wá`etOƒ!H†Â^éØFÄ£¨`Š©ÓHÐZ¸ç>4žèuÓ–IŽ&‰‚ÖFÐÀæ~û†j×äÛ ´¥÷‘ÄÀèt¨ÙŠü1\óÖUµŒ¤ÞØH žm£»aÛdÛLþV4#|F*9 Òä¸él”©)3àß,ÑK>«D©¯²{ 5ë¬zH)¹êHTÎôã&‘ʳN‡`Á²¸Ã»Ž=}^F1ȦøiGN½¤Á½3nñ\*—¢àSž~_™Œ 4F¤h€`Ï ]Î…ï1ÿIr0x>TÉ ®—4^}’峡ªmï¤AZËwÒdðÿ‘%)‚úìÖwòâzƪŊ6gØ–fÒMž^LP§u$’ŽHwu“¼ë…~~€#K¢mB1¯EŠÁŽ·uãºÖŸaÆr Ê%3öê±Syƒ•pí•`Éß^íHÂøŒACä+8¯îaÊÿ³Uh‰øu¾ƒ“gÁ’£Ä+ªÅ)‹½Ec™Úªó‡½þ¥»÷¦ØwLýò6€ËdŸû|r6bÖág/¤ûmó\•Ø„s:ñña¾îjE¼}4Ô|ƒ)‘(¾"nT¦{=ɼØà8ôƒü@>Ôšañó:¸ætƤ‹Î]ïšu±ËŒ£Ò¬mŸÁz ÃÔºŽÈÌàï!¬íVÝ¿TœàÕ€mKЮÿØëCŒè)lk="VNu¡ªNqÈ¢/ täg¶2½4ž›+VϲG µ¯¤í_,äÚ±¼˜Ò{ü4OûUèú"H—|óðÑž7ï ;ËOqýr•"ÿŠ^°X‰Î?w¢eJ=»¸xXÔÅ<ºÒÎöNâ£êm»dÎe× Q?µ°¼Ñ›òþ¨Ä3 $ßë/ì7 :íÿ úW c2ÀuËt%ê½äˆBŸþ]¯Ò4O]nº[w=ˆpSeË©*TOr÷Œ@¯øEþ{i$d“ lض £Ê–mö¬©…&2Ķ“þ÷òÕ&çɹ{¸—bN¢¨D‚åZ샥÷y©qÇÚ–»åÊ_Š/{í¨qܺ礩¨Žz‰tíï>%Pì±HqfhrXp]A D&¥µO‚»<ëï=iÙ+ÖùÎù›ÿ2Ó%ÆåïÀÞO}­§Øþ êì·÷;ï‹ÓË´ñðE»5Šþ‰?ÊŸŸ³©þ&ãûÖQ³”º9”Wh’þëÎ7¬æôPkUAk-·ÐT®çîÏßknNñß%4v“ÿ8éüÏâ0 UwÌû(ƒþpÕ¾¦‘±IÀDá\}!Ü•«Ðß[å~ +»iÑbë¸(hÖÞNÆ£i§ˆð%Ѫ3‹ sæÁmHoÔÍZM@‘]Uúwô£}0¤@POAÖc¾›ìÆ$è®[>½@ÖJÙTÄœ_¬eˆ•‚öîš;ECB1È[¤ØTö©Å*½S]Ö]ž~rSM¿~Íl`ŸÉÖÂÆö4Š8Z)»ölA²!0ç,V†Û ¢[`¼Ü|NޤÁ.°»2»óbÜ!…ˆ½4Åìc¡7Ë "­?/ªÞöÍbÔ70_[¶àé¼ü±È‹ÀS·$4Hºw ap–DeJÂnép¹ùHë3P¢Á=TÐ;:ç¥v5[+‡^°]x±`ó€ûÎæ¶®`ktÙl›tr3Ó'N•߀RñÕûs¦–lôì] Ѻć¤/žž1€@:ïÿÖü’q'ªläèÙ°m½{ØL”¨40,zAztÎôëS}ÈÆvˆ[=)ÁËÌ©Ãöui7èPfpVé *T;FSr ½©S\‰Ç´† {"S£AkË×ãì¸Pÿ„ñä‚Keë&ú±Ätš¨üQ>oØZ«} К),;Ïw¥Ú ²ØBJU$æ*ŠÄ KÍʯ²!óð•NÂPüîßô!aôSKÓz”y:@ï¶ (É|P´ÄGMYì`æVGO½Û9µ¤iÉbZ :›æ: ëJJ}Xø“ F†Ø:õ°°,ˆõ8¼‘c÷®á6´2À]P],Ù‡³GC?Þï2$«Ã#ˆÆ ¾KEæÄ…ãpt {„Z-Ç:B0‹¨îzö}'Õ¯ôÐøÔjh+Üè}Á@ë‘<tEœ©§¬t $F@¬PF,$µ7ƒTUÚÌÉi›¼ÈÌ|KÙÓhC%]¾ÊxðÓ¡ÌPÇó^cå=¸§HœT†öAæa¿–‘¦"µäj8à/µÚDæŸ|±,42]*¤ÍK8é!ùUT ŠæØØÝ+0ȸÞœ0ع¥~>Èý_ÑzR™zÎÈ$JCÌ8c{z]‘°O]TSPráà –FŒ/–?'?Z».¬Ž•îõ®º”mØu_4R³P´2ÔuJm¥Às¬É–k_]t_Èq ÄK6µÀÔŒ@¸œ)˜•“¥»»¿ÿŠX›½þœÀjnÍÆç|¤kÌót>ßœùTÊgß­ÃÔÖ fä”]¦ôqæ&hΦ>‹4s°8æpdŸØ#¦ìÅÀŠ¥­˜ÞîmAI¾&BŒÎ+#Õ¡æ_ÈA›VÝðåÍC€÷öÚþ'2êKxï˜ðÖûùófŠKéðÙ»ÊF<óË4Œ3)”ìB± ÔÓ8*oh$è\#ó䱪@W}Ç!ÝC¹i’+aáSµkÔó Ì¥v½ÑâÁS–…é…’ ¦Bþò1ß9lÄÊ2æ­èb¢.ð8ƒpFî|JÐíVÚ§jd‚u` u@Cñ¸mØ6`ó™©'µ'à #$~a?ÆœY¡ôep=Ä“‘ØZ!W®]Ä[ðà*RÚ_›³˜è•ÂÔãÀ­& ЀSÚÈ Ð•«=É¿m «ñU4<#ÏqÚN–¼¤¹M#Ù¶MÕ³é’ð#NÝ;l½YàTW¦X­§…*ù™5;ýKæ”W)¿]DwtÝ9œpÙäò¦8ÌÌb_Gµ’úR¾mVNG=îJË0Ò“K›6¡2èá|zèËÍÿüŒM¶áoA@þIýzþGÊS¾`Ù½¼÷žO%Ï¿‰ù{ý½þ^¯¿×ohŽb@èä?ZÏþöû=øÜW¡ÙmÃt”sû•ÓejeÔ¸CS8Äe½^:)ŽìTòÔl\ý^;cŸ"òäH;Ô]ƒˆß¶Y7¶a«ÿ¯½íÉ!û áslSØñRâ¦|6òc½’¦ökø>Ú„ÕY>Ÿ¢™N¬x½Å}+µ3îøÞAÝs'ÀΙÖ ½º}D!lÒ |d|£4}¼­;(C AôIÖ!ºQV(mÀ$èDˆ][íkr½‘Íþ§VÑÀætˆpÝHÌþ|v‹<ç×;ÁJô[È™i¬¡>%+¿ñÖÓW‰v< ÅÆq¡Ï'‰¡šB‹þ'ɨ±™ •ŠþLó™åHb!&™¬dÞw+áê~pbŽrÄéQn­{HA8Ç~¦©Ë?Ëm@É;4yP ‡'뉪'„ñ´H§u?Ü„ÂÄG°£“õsí*Šaƒ ¼ð‚Úl{ 휤à•å‘ÖöÜ[`š r ¿ìœSpYïÃVm7nèdª¸c,6"Ò" Þ˜iŽîbO¶‘œU$4¡kí9yDâ÷öù;åe>­‘LOL¥¼õ!uûaÁ¹lÞbzž®Ž~–»¢¹Ó²åÉ&]:…™põ¨â1)×¥âV˜Â JÑp—.9vG®¸xõÕïè(÷@.áh즩3M(ìEèèMoÞsdÁ:uoæ—’Z¹qeFŠŽ8ÊihŸ4MŸ·-. ½„fÁ¬GÓ¯ÖÈ Å÷FÈ’öì¨ÿì¥úÞÞñÜ~Ô‰,³~f½Í¹€¿ÍÕÑWÅEýHÊ_§0ްr †(ÏþˆaiNÏ—R¹‘1g ‡ ‚ÌÑéÀÂê8•7¬ßØ R4¯ÕÐî}*x[…XÙ!X¿9ìD¯ÉGåÒþIçia´Ž)ew›’½Å€ŸµhÜøÎ)y:²ÆÄذ~ Ë\¿Ÿü´ dGû…Îúc.¤ŽÆtׇr£é‡qU•£ÂÔò^ZäÐÈÚÔs†P¯ú¶7MÌ×Öòðío¬÷=£pzÈ3Ϋæ1ë¸ØA–©ÛBX‰Óç~žð͛ҀŠógÐx°ÕÖWÍéÃsޞÃX`¶?m ¦•$¼H<Ì;·vÈÇBsþuéÚQ‚“ö#ÎXŒÜ¡¢žÑd<©U§ÊØwBçã<Ø'šîtGaz´ÊëŒà µ}ìäÇÕ·ÞÃÅ–JÙ6Ù“¤RWéHWg ± ÿ`¢˜ ¬K¥áqè$ º ü€ìÛO 3k,gCC…af€—Ž{¯±:ÅåÆìÁ2¼¦N:'i|{eÐL½MV¹”R_Ff˳ižõ¬ÝÕÌ– j^KéÕ²ö(6DghE' =/.–®ôaÀÀ$H:;tÚ¸²AŽÝá8êÅCYOlŽ0±µý@<hãd‡í&V9b›p;í6^ªuX=ŒOÉé?LÛÔ8WD±O•’¥ GSÎÓˆBÛ’‰xé./Þ´ –VæžÉ»¾ö¡j Ò 4ZŽî\+hx*RÅ0xœA…h[5€#bàý¹1JR ’@Š5[ 6àÌo›¦,â=O²¤Z²f(‹@ÕÇJg£8èŠk›á½öÜöJ¥$ÄË<åfDqú´ÄáÈ)_€Cý—R3áÔ1¡VB5¤¦S¸ l:ܰòy¡Ü(”û„"£î›K²,Áõ¡ÅgðÒº:{§mïŸG]åWèÓ=¡ v^OÆúÒKu˜A¤sêðs@‹s‚üj“LCÏcÎNêŒ6ÀK”c~)JÆÚq€ ¢^C±ë÷Ê® Z›]ÐéÈc'ŽŸÖqæHÜ„G+úû*í‚yjc² ïC|Å cXÍ蚦¾l¾kÈP¡üRˆV8\’†7’‚KÖþÁ5‰]Ä—ã鯃tRPÍêt§­BðÜÄf$D©ËË”8þ‘LÚ­p{ÌêµpCœ€¡\"@»faW®Š0åï$¡YLDvRÛwñ€ùäÄiž•ä܉åòt¿¸r×U`\uÔF! ÌG>:iªÿ§!STZ beE9÷(O¨«½°TÁ¯ºèöP czÐìöHŠEÂFI…%s—'eFiò–®9€-pUÔZô]8Ø”. 2Æ(âU¨^'M/¤ˆUtpüaÆÞ_@ ±A° ¶äçÀ<©Y”•2õÄ*Ï»Âä Ûµ®eÈÜÛãϳsÓ×8B®•¯[Mùžj˜«âÞÅkJR¶Áaý‰ð™ó„+÷³n±Y‰¸ØúΤx¾ßÞèü d•îñ}ßÄ9åÝÝg}ý6*èyÒ“šwƒü6ïØw|ÿ½$ê ö·4]2¿î…ôôùÑwü†ÂÿË(Ƨ­AÊçð ~û±ÁŸ¾Š>ÍLë6ß‚@ýãÖææü‡)ñc· Àûop]àÚ0U)1Ã÷_$ÿ™§ {Þ¸kwÄŠ×+#ÁõLóÌüNzSP–ëÃd;’r¹žPH'*÷-«ó—ƒõº§gOQÏ£"£Õé´\>ÑÕH­’¶×ò;JPéhf:$§6½ ¢QeOÕ `KKRmû(€uuÒ:Â)+P\©rú¢,N–0ý¢["©‚-8T™4;Ýšïc6Ÿ1]‡s_G˜Ž…êÝŽ…-L†º/±í@ <;1½m9gŸØ ä“Hfà ÅÀ¨›¦§ÆÑ»«U!* Q¶_a e-&aÐrj‡´‹Pð´2Á»• 8I)~¢WQ¶ú“q%]Üì&ðÔH¡M#ôš‹®?ò4E}O9”¨uø>j_»ée84E÷ Œ¤I‡ÚI‡cêÿ úµ&&³ÙpP—Á–…‡þï£Ä©Ó\èM‹§Uv›§ÊÉ»ïíÈÇî"‚m½Ý 슜;Ê7€¦Ù–d2Ô²Ó™Në-¸mÜ@jŠ«¸W)ÖÜPpN+´ªÝ!rFßSÝçÎvëAÆM£6„¤ÉŠ·:Z¬Çq5 ¹èªEK-!7þq’OˆízK=+ æ¢<wJC ¡gºðùÊ4¹E‡ø«Œȳ{E^h2ÊuUE¾:l©ýè´FuSœ­Ç#¬­jvåyøÇ)uŽäe1C¾rÁ Î[ÎSkØ…Ê\¯ˆJS•24eDMPRqTNg¡7uÔFc%JèÌ*Ø[¶°9;6޾#kMåQujOÕDBÝŸñy ^eÁVÃÚuIÛª@´ËMОc’VÊÇ¢…/Ž-µª|2zØ=(Ýu&í˜Qʨ2IZB¤ºøg%×6,³†0œà8£ê>„aÉ~< S1ÙcPöDÖÊÆ÷æ},K`Ÿ>²‹ùG‹ªœkMKÚÐÕ̯CHˆÅØEÅÝ‹†„¶ucTóO*Fl½pÊüsQû>2ªaŨ€‚Ú(ãP»ö%”Óõ¢“ú*O_v]ºªÚªgµÖì¯üº[¬goL/À¬½ù¤íB}ø÷‰¥Êî¥]DÖëøÉpz“ªb’fæÊ¹\Œ$ßu‡¤5zgæÒâ7Ò¤/ãþr‘ÿgbIB"_¡ õÙ_A:/ËK~½@ÇÍÛ&¿åŒGŒúïn0o.Å¿œå+ ,vÅÍ?8áJ:Šø[¾¬ýÃØx<ýÄ«H`Ò³Ê pÐy´Œ"MDÏtXÎt"¬…¶ZR²¿°TÆäd3ô%KA[¨AÂR´÷“6óZÎ4f]Ÿ‡KçÁÌ4¤Ï|Sp§»˜eȵ™ƒtæÙÞö³ Ó¾E€[/êýGÏ’‹*ºÑdñp]‡¤ÁŸrºfÛÉÑG>ÿý¨Wïù¯#x>•X0(Oq½ìbáˆõùôH®ûuë DT±|püÆWîaßhU$Ї–©¿õ PKLô{ñ®”nïo¬g ™”.iAÓ*.AÚ|8”ä´µ„-K‘¯ê4=w9}7 EW ÝÁ‘°Ñ`Ç©Óx“‹ÓÔ—!¥ÉµÔÒm&èQè±7M'1Lug!IpyÖ‚…¡w:†! §ÁÛ»l3 ÇŽNÀ¸“d@àeÑÐu ÞÇGžCÿ‰%53ÎV§÷ÁÞ¨Nyz:Hc’YˆçQ{óžÆ½¥¨éFuq$K“CSÆj„˜ÆÑß NHÓFÖUY˜:ý‰ÄPë¡c*$&ÇúaC Ãôw«ÒGšÌD&¢ð"UîТÆ@ãˆCÿg.üš€`žÒø=J6*Å0I®ë¯µ¶]©5ÐÊý BñY ö~𼎠,ûp‡–6G!Òô\ºF… t&8KSdz´Ê”|º»0%@“Ú/s®5®!’’ÒªŽ¶Âè¶÷‚f‹äÚWÛÃ:¤èØ­QCưhÃÂQhdÚ s’ hõ[>ú=GUÄsƒ u3 ŠÕ]¶3’/¡îm©ŒÜáŸIVÉÕ0:/Ö4 Ô¨"G=˜•.8© ›S³Á–™(ª×øS¾À³!µÞû¸å1#ømÁKw»>· >»0ìæôÉÍŽE”S²éëZ6&Ëþ„Wp¸¹,Jt¸ÒN©£ÚÖéôƒg¯ž­„Ù*¥£’ÏX^ì˜(Ãèü6­¢íú$™ úüЧ8¤"ÒÅ^fÒ¸]FŠ®Èáddã-¯3¶eJµJ©¢±rÎÚ8Âz’÷íêD{®¥e+éÎP´ªÌ9߇Di¤]ÆÍ#¯º®³No&de%ˆ¼õl;é¼åúéJqÔG/ERÆ–*e«½ùH)€ªu?q*ow¼þŠ+³Þ§çE#ò ïüHÈ úÔhBh…׬ËVöïY 3zGÿii¯˜k_Ç¿_øèßëïµc¼™Z'2‘8¯¤¡kgNAÍ uõÑëák"d8uöz öv ¨rÿD*¤AVœ©@ç¬#é¡Éy¼²¶fê©úü-µâ@~$-e<7€(bêî¡ÛòĽlê8Ç[ïÊQN&ÌÛ~«ŒXJT nã…½àßhÙ=›l[ï/H÷´¬!!¾º ‡´.úÑô`ßc‹¦6d®Íˆ«É$FBáb¥_¥µÀ›ösVVz᩸t,¯jT*.q¤ùPƒfhÏL2‹›â DQwÝW^ôɾæqRa R&í xëÖæ‚sïô$³2(=h¸6´†üz޲°Bï\Qũ徨é0ÅN(SX¥„Õ¹pyûƒÇ{?-»A,´¿w2jßåLóD‹5“©¥ÉD¼®ŠNã¯~ôëÃ44i à¨a$^H˹¹½ŠÔAèâ[%œ.qnìÔ.«êüÈð­©Í¤ë+>ký~‡úÍ’í+.å¬4* ! Ø©¼#±V¶‘ DÔT”ˆe_̤¾ {7ó1G¾®µ ÷¾ ×%4tÌÉ&VéÄ«q¾Z\à½/Ó-¾–’Ã-Ú¤¤ÒÕ³ Ù{ì"²õ*j»oUkÞÞe¼¿O5aû_ ËVÛ½x>É=_t˜«dÑ ­|RddOíR1=aËøŽhÏg– ªþV¤k`ÝëE· céõJóQè€ÑÎIÍ|ulºB“Qÿµ?:ó?# ÄBÿ0ñ¦¤íó¶*͈¦%!mˆwj lÛ¶mÛž8.¸mÀ†m3[jçzbPÞõ&-˜Uzª•5vÅ+1«>kãl g MIõe-œáºÇb3ÌP\ó㌕èŸuþ½šzg†=ôƒfçØ–m§*-,¶1€8ŒW¢Ÿ\OÚ(œEÙy1­Íh@T! 4£´0‚£cIçAŠÊ'ŒAîþAï>¡ÛˆÖï4ˆÚ" ì)Ì“1RŠÝzÀ¤[®Å{2 xó#O¯ŽÔ«yP—ðR,Ýú…ÅU•”tu\ûƒš-M?–;6ñµÍ±~ï åÉZèuÞ%¶Ëág|šRNí--¿!›Í¡‹1ݬ!Àkßx ‘šGÊgjW r_²~¸xëR¨dêàN‰å„a+­Få[³g“«UÁÈî8¾Ãga*¥ÕêÈ4'¾¯nÔé¥&ü{×Ûf:¡VìkKžØòQÚ¹É.VÚï&OzÔÞný.u*Lß±qRYÎÈÚû¢ÞäùtNnó3É.7»‡×ý3Ü0û‰®®©ÓíWˆ¶E¢Ñ@Eüoè8Á/¿&WEëíÏÂÑ\Ü«ðIãÅ¢³ŒÀ(Æíeê̘ABöuL“ìÛ/°=ö@KF@/ `oÜ€’dÈH`¬!Ñ š#³y¦3ë®Däy4{¸=:’”û”±QI=ëU¢c_šÉ±rn—Á®œ¨·$GR²ä²äÁÓù~ˆdF¤&ï Çò¯ž°±QåÄüŒ§“ÓM™º–5mäa a”a?òGi=>¸y˜ gujŸÖ8h¢}{Üà‰¥“tGº”‘¥0ÎõÑ;Ô³®z:T–p,óž–ÐMýÑÝGâ«IoÂeóeë›Ø*RP ¸MŽƒZ‹\KË¢~ï‰ô¨>ZæõxНu¢Qo8¯¦“[‹2éªctà‹Ë|Šð(fU!ƒ¸/${âÃB»ªt¨BêÅ-º¢Pq…Ý%Q'’R°•ÓG1Ìÿáy1õá“,Yb¥&wɈEZ•IYº›Y”cªÑ` qý©™ñøcšE[ 4üÆ ÿCÃi3'|0C afQÎxnf'ÕK€ÝÒNÏ…åt؇y‹åÔå•FŸR ˆ#Háó,<Ž@œ¦TÒëOËåÍ¢ÈÂMˆb}åIŠe>¹š6dB>Ž@Ãþ]G6¾?H11Òu££!#„2⊌¨Ñ­ôØÚŠ¡«½Rƒ×OéIfÂô§I+>¥[U7!H˲Õ+âÑ3OUŒ³Òb£y‰w#4ë‹Üì´¾¹KâŸ:]§PlZ ÓmŸF ¿t>©ˆÂ]¼ê}Mr-Ž,q²æ ¹pÞK´ÝÊÄÜ;ÚÚ€*íúŽ˜ø:ÍbXÂE0Úí¨£©€ÅùÇàó÷ú ¯·Õª]ÑYª¡ l©Ó ”à©OšÑ;³TP[ÿ -äŒQudâ-S-TÇ[‚pGîÚ2²HâqÅÖ:°¾Öí4MHcTC꯷ýˆ9%ZHuüÓàŽÐ ªVI 5]uE)Ęrnýõx›Š­zîæ,›}¶zµ^)30øÞ!9–ÜÉg^¯=ÆK.É»lŠžÑý &䵨Zñ·î¤»^ûŸb™$;R¨7&w¡Ô¬2/8}T62è׳q±CÕ~±‚ˆy'£o±ûN¯«”?oÝ>XqnÀ^óßqé’^·HãI •VäÔ!Âó›ÄB“5)tà-ß{§[A.?åE[‡@öªl áFkqRã Ô¤PïŒS]ÏÉtiø”À X}þ™L°T¨Å÷™¦—y¯þ¯ÔÌ8¦ÒûÿìWÑpau²?AÓ1—ûˆÞû˜"îLY4Ô³ùiñï¼Nöõ•¿Ò@¾HPsÒ0±q1ªn¦~(g ô‚˜¥ ûÖÖÞ³]‹KÕ÷WîUî{8µ7ˆ¼ÿç3\‘|5wà?A:ÿÙ땦—¤˜‹Táû˜x'¦i_ÆgŠÉY‡DhQ¼NfMS¼BŃm‚Ãc€¦ ûB™`é`*J•¹eSµ`ä`F°eÀV«eÅz½ð}ÛºpÂÝEs.5ìQÉ.WçwÎDZ (HRô"¹pÆ»¢³•Hû3{¼ –Uú_qSX€”¾ÚгdUÓcòCÐÉVc¡Í2 Î §öÓèûÒµk0–èÃìp«ïš­=™«Å¥á÷`XøÙ¼0ÃjÐ* ª;©W6Fa³# RõÝx ,ë~/cÒŸ†íEÓö÷àXûW£ÄS-á#£>0kU´FTãûm¶°í­,€#Õ2;%a¡+(v$bhʱ TÄ!yÐŽe ÞÄæ¸hXh;n+½ý%¦öœª}ldKŸ”pà(0 b]ýŒÂtºU2ÆfÔ+mk€¬ÔôŒˆ/LËlŠaðqz!º«V k…lÃà%Z#rBpuk7|©ëX·¯¦‡pfSÕÓûËWbe— Ö4úÿ§Œ2]OŸËí{À-T4E¶ sˆ`ÎToêc_ƒÿ/› L•tß…PL ºó½Ëwàcwã‚w/¶.È7Ãkƒf)’ªoÎ&µ™ äÊ–xí{ï"üŒ§PNû ØO8&–¼ëPOýY÷q´ B>KÎê•`´í&&pÍ\zåÁå+ CMíJþ%þÎo'ÏðÃo´,“>†öz޾vœ…•é9ÙV¸£{ÐÛtRŸp¥w0ŸöU>ÐhÄ)Ó"cg¼È$ ìãÙúw8Hˆ‡Ò)äèU’@ù¯Zœ©)OJ ·S>ÁèèƒçhÄ*dÎ3,'LËæ!ÎlïîÚÂrÄ*ÕÍf¬ÿ‰_ ÍVS 5*v– 4ŠÐ£¡µâÕN¼–Ï›kO"O-¹÷T 3¢¿¬&x£eòÄV«MõWJŒ"vF‹Ž‚oèoWÍ;8Êñ-õÅAÍ¥'šÏ‹Z‚Zw¿™gåµh‡<r¸¹J&°ÓùTÞ·×$E_õ@½–´†a`ÚCߟlâ¸âZœœýCJ®¤â,Oƒ4j·âH¢¹*Ë0²Œn;ÀÛ}xÛl;¿ÿ1Ûvp±P{‹JwÅ[¢Ý*R)+«9Rú_Ÿh#=Šò)6G“_š¥Ñ诱üIû®5i#ôÅ ‹§¦GOØß—nx=Ji«°1E%XØ)•£SÉ ~VvŽ­1—!®×žF(ó=»•ú§çþeb¤é&Ú•B8ËývØÛ%—ŽuÞ×¶+m9C Œ<»]ª1‡&ï ¤Fâµ^b"Jé2exCu¨¶M˯4Ì ¶˜l¸qú~{†/|ûóÛM_ö¬D_aHè=ÞäºhfNeê×^]ƒêA÷¸8ï«¥Ö=7¿46uärÃTÀüXÎ6f¤KE3wz¿ÁtzÁ(7«–-8oG&h¤«íÙÇ ƒÊ!úzsyÚ_Þ˜ 쓃ÛåZþXo¡Þ°'N‡"áYod78½å]êÜWâÕ”›å¸ÿ®S™7™œb×_¿8²X6:–´¤ñH˜ lo 8à$OäbEtÆ@¯J ìnˉ}³(¤×Ùœ¬2.ÉسˆY˜4.ÆB炎“·E­ƒ'ÙØ˜'Ðu+I”õ˜@!“Œè„q¥†?cX9ˆ%j6¼×psq{ØT×$S¼´ÙI"‰µ9çùU¶³þë¼ÄÕQ‚¼ º«¿röªeX­ÖܳG˜:r͘Ób UȲS8J–5E!Õ—"`â¨à­f—4gRz·Wºì—7µÓlpìÿùšiçwé6N·›oïnŒ~…f”ò“¢±#E$«ÕÄL9¬¦NàŒ5%+¤î$ª„]\êäJŒNƒÂtW¬M–ʼ‘ï×OòF¿’t>;ëãå;Ç)OX(1F(g¥ì'KB„E>ŸÏ³†‡·µÎÊA–‚./n“ ËUYߥSË Ç.Íòƒ^>ÛÏ‘;iâÚëózã=®½ýä¹ðÆsäïõbºî«_ ª¾ó˜<_TSi\Í1ù7 nÕŸšÝ„ÖÔsí˳7©ú‡ÃT™ªíÃÕ^oGP¸°R=Ng"Õ-²NPBñ·‹ìŽ$Æpø¤ÝŠ,ħ#©ïnÈ)+ZëA7·#UË“DæGµçÝ:qW€˜—éHu!Ïgu×Ö€¢Š9j:@dر…æÖ-h©ë„ûϘ­ÔìĘx …üVß3–¼ >;âI}/ㆶñ6+É«|§m(`BÜÖC{=y +ŸMöÐT´SHÙDžêq†Ø«ò¡É§áàèeÙ$47ô2VlEþ­¥Š½˜= —Î?dz{´Çp°4õjéÑï¤Ê{#ÕîT>†szKs§ÿÁöذ5!ªvÍø](ôÊo…œ8‚×x͘Í÷ûöünå羸ç{•Tܽ˜tš(1›?Z‘\¸üm&Œ²àe«qóøÀ™f4³­Ã‰¢¶OÌÆ–1ÛZø—̆¶Ä ¾úT¿;}—RĬüaô³¾ý‡D>ü£ZûCß8ϧ»Y¹èY©µøìûv ÞµcAÓØTàjgók˜ 4¹ îûÆ'{‰?cC_°f¼ë+ê' >C×ns<ËÀ;Ë ƒÊ5*–®XßàßåU&ÀòÀ;î[¼ý)n,ûKÙ‚[¶‹¦ìŸCÃz~–™n%†ÿÒy~îëïAqàRP¬PœÍ1Jβô±èéea8¨¦oÑ€å{ÌWa30ä5o…s{ŸÎSìÇ$vïÚ=0[^Ëa]IÝÊ€2>T/q‹øþÀÛ¤ Tሚ Ÿ&©þ1¼õGˆS÷‹þLs‘FŠ‚)˽‡¸ªÂÀŠØJ¬Z®¼¤…gDë•öY«ëÃ4úÃQ¿=©¢ƒôÁ@M®ÈW µ‚qœÌØù@²r¾lDñà!8K} 5ÅC Æ a¤‘©”ìÙ\ö€çÓåZŽP“t¨ó qañ,Ù®K„9@ª¾ FpÖq4öÃË=вhñT§Ú3·Ûöx|ü¯SDŠ·î {ñtVÑJ¢äæ­±Hc¾…©ÀÎÁþ’%2™æ-™Y¦R ©ï{b¤C§i©Ïj,«cüœ²8T/D©˜ž8 £ ¿5Qßga±èdIè€aˆÚ Èó¬RËø¢'ˆ…£N{ºî”²t “%k,ÆHE£;5Y‡6kãz'AXCxæq̽ððGæ{ˆ’ dý#éÅù6ÒBÑ~ro9v§ÐX,¯àl…¥Î£ ¥p²JqÛÇQÄeßk˜KD'¥ÆÖÊ=ï•^r0ûèWc5–d–âL¸b ˜·®£ü,pÍ =€ÿÓ ÷Û·KòÔHüGžvȧL÷Ê”†âüá&¨¿ûàTw—.h÷¢?¾‹áp·%ˆê%®œóþW5w•xÀwwD@ £”7ð4…ó…¥ÌJQ®Èk¯Œ¨¼tË/ë\›pkðâu^œµhF–¿:R߸¤Æ¬üyi;0¥åYËÄ5´f.7‚„(rD*®ñãã:ž R¡…—gt½³*Í'Mr™÷/*›L¥ÆgÐÌB+žyIöå. َꇧï©0qwà¿J:ŸÆ“þìS+f9g$ÊÏ1œ9hê2ÿWÚ³>0JØyTÊSø vH=|6ô9tàº8•O!wÜ?§ŠÀ @°ŠIãÒr¬Bz^ż¯+ ß _dU>ÍZÝ ½kË+ ^\N ALù]ÔÚ6® ¤öl±t^Áø8qÖEäi+wû¨ÉÆ`õiþ3xå´É•t Ÿd攩uaýPl“.š( .K¶ÈTBÚr©0‰iZñÅŒ=z3Á öWáu*cŽ¡F{ËLó„ªáhÛCµ½^¡lÛãñ±=>Û¶'|ž$tSífWeúi2>¿/Lv$®oA¬m7~%GnBGm•nÛ½á8ÿÈ»Ø2ºàú‚«,U)³>;8¯ -RÕûKP±\  á'NÑÑóSéä—ÔFZxõJ¯¿×ßëï%"‰Xôïgµí¿øcPù{ýËË8†áKúJÐñSîðI_4ˆM°aÛì]˜êŸ²É'kø@bñ_ßõ›ú§í_—‡qÉ¿"#eÅø€7 "]¼]ɸžWœw$©»£óûhö´dêõq†GÌ€‡F2qtØïðÖS4gJoÑ@+V! ´Î|Ùä$bµ ýAŒŸ‘¦ˆ, ¦-fgûr;Bçjø(4ýƒKôŠ©M£ÿFS8E\Â8¤ò /}ì90còIÆæiÌÜËÔôsr·IéXžýeAj›Ø«yÚwCß ©¦ Ë?´§¿T©ž]ÒdÏÆȸr8;‹Ç%õÈk”l?øÄ¼Pžˆéf˜’IX©w³Ô³•ïd?lýûG[“­ˆl×l íŠHQÔ>î­¿§ ÞõîØ»*64#Ý8Ì: ÏÆÔM(Ÿ®1®„“z ­üŸ w†zµ\ó»u³hÐz#»‘6€Éí@T÷€:újظm{lÛ>¯OíxÊ;Œù¶$ú¸£¢°cçbk 4îÐ>´D(?UsìtMƒÚtšƒ­Ød-¯ÿ4oèNžbvâªyQthƒÍ-nì²"ßQ»Ì[%±Có‹.ÕÑ4víím²ÛÍfÜ3ìuž‘>6±¢£ü¦³?1M2Œx4夢y)1B¨DÛÁÖîf ºo£¿&ÓˆjÏDO¦·× N+DŸÄÐܤgkZ-³X•¸À1ïQ* ኽßNN®#<UŸS‡2²*pž¥ðD6nG‚I=¹yJèÖŠÐØ´”ƒ×|#á^'|•Æ®®¡ —ö-æ}”;ÌØµ”ŸÄXñ'ø…2ºÖšþ}Ÿ4sp•à>EZÜ·©@JU]]þ#ÚR²ÌX:: jˆëpC!\×Õ ®ëDHàY¤;%UÓc¸ëÈÌ0¬ìY‹÷XüÁ[bÊt¨øÏ›³é‚Ƥ{^Æa(ª<,$Ê2jÎáÛ®ðAùÞðj(w[í¶áÄ=?¬:†7ý)ôüÇá>ø &ÖoÔ1¢d©Ke_aP ü&ƒ=nÉ1Lô“E능Ɯœ“œ°‹ä\ ÉîÏÖÀ‰ÍЮ@[´¯‰ÑLG>!d‹¤%©‘\ÆÏ‹PVÅÑ·ä~îµPô-Ê4q7ëÏéÇ©¨CnŸtWq¡üÈ"nìSIsAt’Áþ¤”s±–î"0Ú9Ö¨dÏ!x·hƒÈà,Û-¶{u­pRn›¦RÐ…Ž¬f¾w8eq™tÌ›Eª+LÚ~?é|J”-†wz[sŒI¸ÄÌðŸìÌdކ]K¾ q ;æßˆ¥fFºÑõÏ »s6ªX; Æ,PO ]Œ…èwÛv0ÒB ”ŒnìME \9|!(èí€ïû†tWv¼¯DÌ?ò1 Œùñvá9žz sÆÓË«­®îI*@2Jëà4n’"ð½qï‹È“Ï £ ”èÄðÌí=ôÏ ñ×1>æÙ;Ó5@rhЇÍIÑ;ÉpÎjJ¾­Á¡¤áy±}ñè`îÈ*µMf:4@?î'ȳ£qÛ¶}|<¶&"µçG¶gOte©¨tŸ¦Ü‚Í>lájÞ×@&ýxg;âä#w‹fæ«~¦×#žröœå’Õöëø{Aþ“0Y¿¶áƒmâ ߈Ì*©‡ÂP¹Fu‚ï¤Â0:í×ö †€Óë1§Õ1äøfŸÐ»VÐ1ÊÕ8§tw¼çév0?h½&„"U—¡M¶Þ‘{j™,)h/'á­eÉtùf†…¡NG, X±€ë¯@Z™ZÑJ·öT’÷3øùˆýwIç Ûã1n,}l½º£@U0¸à5-Ø‘··)qúÍï¥üˆSÅnÃðÌcãÔ£Å0C%#J7aµ*8¿bµð)o5Ëf-~ú—°ñOýȾޚMq¢„L#‚õ@gCCfjØ{6¤lÀ)¦Æ­6í^1PK@ÀqP%î ;‘¥>?öï³ËÛµ’~ ¢|Åý'­8´zf£nîØGÀèò"WUÕÜò¨6ËeN:%Ð'ǹqÀ˜PnÜ‘ð`ÏA4þ¸æ£a¬]ì“L¯®àF‘Çã±mÛ¶=‡ Æÿ–¬ç{öó<ÏÙ2zå+RrÿeÂÍßûËöîfa¤L¼çλբäÅ\#.¯a·ÖRµë`.ÆÂó[Ç+‡ ã`†]Ĺ«‘­ß±^_]T¯¿×+väïõ÷ZB™þn¾¶¿!øÑAù]Öõ¿‘ýªsm4?m]öBÊó)ϧ¯ˆØ°Ë?ãïDü{-­¯¿µò­~ª6¼3«þ†W”²Ï ‘&H))Ýi9»UÅn;Ôrû¨CT–TÁCiôéjf€Æ;;† ΡßL(nê£jûBû™—¸„¹n±5"–Å£V0æ\Ï›ŒG±x Uv£½q¢Eœ”Ñi=TVOÄõ%tü7eBJ˜DrÌÑ„„dÞeTšÇ·ê`’5Í\”)€o@ÉߤXš:ÚÍX˜0„Éí<9ö¨êmìoïQÏË>EU‰‹)–ÓBnI•ã ê ”ûÃèb ¤”dª:î9˜ÿ©Òõ:Ä‚ˆ<Ÿ”“~ʳ7‹)š’½K 7ƒR7ï?h|ÒpÕýp,­V0—†‹ŸGÑDWŠßô™$êVZ¦¿ g¹ñ¦¦"îN¨çØ1iª!Z‹‰ƒÑ‡”²ÓXþ(’4¥‚˜°]Óœuov‚Škg~‹ÇÛ-÷“YÓJ+AQ/'ÑVÚÄÇÀê½ 1ëŸxk»§ƒsºVß“$šŒÀÙûâRÞº±k˜€]’W¾ o­¹ä/— ŒúÑKŸWºj®v\Ž˜àq²¯aUO­Ñ«&¤\,=›ì†që¦jr©I´G—†›¡ÁšvBs0ü)‘ŸöÛÙÜØ H@7:ÏäÁèÛ#]ª­Iç” h€Ýí(ÒÇy—sjf±0ò<~´ŸeŒÍí6ìµþÿÛ¶MÀà`•ã3Ò£û•:`'Œl:©$4 :þèXý#n—}“3M6B‰£’$: Û«G1É‹MåÓÌ'{ˆ†·bC|‚•äA±O£ãïà;š`nÀ€¯#ïâÀ&ÇNÅUŒõGFÏ#é”Ñ,Z(âr˜ø6KH´ƒÕdÎ<`çÏËÎaªÍ*z”Ø2Ÿ¶o@Qé#µËúBB.¥õ1fu|à=Ä¡ýÒEFŠDý9D†™%l|éd„ʘ¶ûñD`ir+; £%Ë0Œ3 (öuOÓ)D¨Ä "0|Ö,ÑĺèD,Ÿ:±©‰w5'²69œ$S\ñ 9g škÔñyH—Kã¢ÓàVFj´»!¨Tœ°™³“³ˆ†´¥èiögՇÙôÊÉa.¶Ö¦hÊ&oarëE¦„Ì‘®,KQ@ñZ¼Šš’KPH4ddæ cd54ã¶.³cÅ5¯= ìFÚà?«æ¤í—0© ÀÖátsŒ ‰ö£TÛj™[jËC­`dn22C|;åâÁÀ)š¿‰*^_µ0F£¹ÔlZÇiz§Dž?|'ö©`y_þ½þ^çv«Â_è!þ©—)Úa@/@ª õ‡?0ÿLR±†‘ùµ­xø”mxÛäåù¼ýEù֝й×.C¢Ð£“Q.¸‡4ßÿ‰ëë È;w5¡§·1ÿ¡¹þÚ¯»3ÊŸbÎë•/ï#o8MÞÎ’µµؽÆÍ¹¸ˆ»Éj´Su*M°q¼éLÞ–¦Öèƒ|̺ŒÅòíª¢O(†Q±×þ}Pbc°æHƒ¿îØ¥UèÁÀl‘h¨ŒãÆ»±×î¼·bŠæ°´’>N6ŠŸ’„ˆ§ÌaXh°çï š© åí±ocZ¯g …žŠ1TŠŠžB?Š>!`a!¬asx v@œ4Gæ¼î9F¥©^ fƒ'ÎB¾ðŒ`.IÛT`?‡ÿÍè7éKTJ˃™«yâKŒ&n¨ã÷·?Il[¿ös¯þí*qCàv$^;:¯8ltšÆîijxTµ…¡"¹=/Ñõ;©Õ·6J@y¶ª:a€V)ЄsŸ¶¤O¯B66˜Á'!Ûst'µ:LU6¬BTŽ™””7ËÏœƒíaá@k XR•Œ3Å ’²m{Á?¶­gO¶Çc{ìì‘BCuCY% ‡«ÜE')IPÕb™ÂÉ•OJBã¨3«Z‹8 •¨*°[Õ…P¡ïEÙÌc¦K•ñÑRÒt¶ Þâñcz\Ì4ÑÙgÄiĨH¬+ì83Ø÷(ع­šß ³@A×…Ô³g$´ÛP{ß4s…$L£¸ LávʧŸðÄ^!š·—B7’О-iùÓíÕ 2h…³H`1LÚ)r†bÔ´¥Ü¿&dnqÈú”eF‡Š5G3bI À8B =Ñ·,¹fjÕ31›bá`2ø]IEy{|HûÝçÌߣKETX[& :7ViK—Z†$Á<#…»þ•Í6è¤Î;è OL8É2 a—X}lîĺ¥.ØÈ7/¦û7ÝòCÂUÈÐ ‹^”ì㌠O[ÆãYÂN³)Š$”#fLpEÚ ŠéBWÏ¡µfeUÃã… ÅòÁs–´{R¸‹9²¦J™õB`l.wL>éëùô¹=—ëíwÅ ßѪ¼iö¨ê`ê+•@šºJý3Y˜“¶'UÂQl+p¬¡vJš¥Vó¢WÀm$Žk ÁwªRPÑ~éy*±/˜yž&ãA*·˜~3Y³—HÒK‘¯[ËY4%´ÉRÍ‹c’-!ÎS1äìØœfí·’ÎOΙ.U˜(:iºç"™ÅZSh¾æÐ­öœTêó:bòOæÍĵ#nV8B1ëâCŠRÆ=¹›T„Šõú•#¢rHS"Ø¿×ßëó_,"ò µ|.ì;:ËÃðÌð?Lj.$™ÿu}Ùa­sJA`eiíX 胿çi)<¼Fìnàa÷Ž2ÛŽLGå&uDŒtPœgbÊ4·ì4ã5S4Ùô$Ь úIo!¶m{<¶ÇÇãñmCÎHÅ)¹LU5' ¿P8ÂõŸóœE8 àåšÞ ñR*æ:Àô)Wj”ò _—|ç»j=&ƒö’`T¥Åõ‹ò¥;»%¶˜¥éYùl `~„Øê¹ç”úÑ–¿ŒÃ6—@Áþ_÷jéÒ¯òñÎ+á×ûŒ€ïö®¬°kÁíÑ¢ŠjÕjðKñ ½µ`áÞÈWÖO”ÿ­;V7yqįß'Ò€é#¼nõχiåI_\ª7Ö‰å¤\”Ö€Ã;&~}|êé(|Sä+WTò%ºþ”â7Õ\Ÿ¦Œ}“Zƒíußü¦ zé ¬hR×@@\Ÿäraþ°—ýuâ÷”u¿ýÄÏîüÓ;Vä·Î¿ñˆî½k|™aª*ÿwN*ýëZ Àâ¨ÞS|¡j+¤låbtaëùÄt^>Ä|n¢t½ƒ"Í…‰Þ A GÃYLÇ(Çx}Ÿu9äN¶XÇì‡"¯W™s¢Ù¶Œ|MQ»„XÝ5ªÂÇ߯¦ˆÆï‰2¹·—Ç$ð7Ÿ?И§ýÅî34E^Ù6qT` B ¡ù´§õ3\¿•*“jê¹ì¸hôO-]1ô^"£Š~Ïh¸ "²¡—àÓWÇ´?½Bºº¸¡âpâ<ôb–œdZÊÁØšÞZàâ©È{üiÏœ˜Š0wä÷²á£t{]öÏ^oN`{<> ÛväúA&äÚ S7zšwòuÉTeò,°ÉJ'ûŠà¢q#ç1ª[œ¸<&Ù‚¬Ä¤³çÔ{É |!5 Îx’NïC¯åÓƒ=qy÷ˆ*+Ðd¾CRÔ­^u“&©wݯêtvH"”‰{‘¡üäÂêÐ"°=ph­“Ø^k½†oQw­¿rý¸¸ ŸMè¼æzž`ŽŸ:¼_vÜ,¥‡¿’½]³IUm_|ÙãÑ›º @^~ê ‰Šô»¶môcMàÔÜ‹véêöÍ/Üü¯&_Ú¤éýʵÉHè¾°cŠ2Îr Á9š5r Ýr‹£g²¹MÑ”F‰‹c´ñ{êÒM#DžXF¡ž¯9ð-Ýš e—ÚÐ:ˆ£œ¡±F¿k J}JÁý-O>¨°bäÌR×7È¡0ßµh²%¦®W©“4[Töàˆš{ªvHȆÇvˆúnh36H>°uJ U<¿ ¡©W'¡‰ÍWjÔŒjb<ÞlûzýnlÈe“¨ž`„{!\uãõ¤AE ` 6ÛúÁyÜ&Ê›Q½•a³Ìª>&ý „²‰¯¾XÚѨöÍqØkb©6¡;ÞŒ=aô»à284©ë˜QÄï« šë@{ä”~£‘ÔÓvYJ›=–ΘŠhÆn%Oc÷K£ÒÜC‡mÓMêm ¥¥c‰¹ÄÐ2õì`8Ê2Òc¥!tÐmáH7Šw#°bˆQÍãX¸ëïNâÞ}ÃÑÅ AEÄ WS†‚)HÓ÷ °&Àû2gıñ ¦Œ.Ìá8n›Oôé}3‡¦Ð€'ç±”EÖg²3 ¦Ý©õZ]ù„nU½Ž`¤æšxaeü?£|môv´<àÈ>…±HÐŽi‘bM:¾ s8Æåa-2 } ¤¸‡àO'î°cÚiîÂ@ýŒ€)=0o+Tk–™˜öÑ‹«òÛûŠÒdÖÑ:}OÄÂÏÀºpNv¬YŽ'£jNKLÖç>8„¶MìÌÀ Ñš2»· ]Uºµ\DŽDâ@ú&Ÿå±HE@ÿU~Ú¨òPˆI|¹ü5¦º¹8Ž6>©³ƒuýCìâC§YÚÓÅ@ç;Ú7f2~63O£}â`!…£§™3»BJLÓQ뤬uà{† XÍ&}TE”¿TûŒ¶Ýb¥¼â6ëS‰˜‘U4å–Ñn)á_ä`¦“‹îõiÎô*“¡d.%ˆÂõZFãYft–˜Œ³¡ã‘™pH°Æ›+ôš¤G‹ Eå‚j ×ýT!cþÁ)R¿ÚYÕG¸* _!Ž“œt&æŸm³Ãéü¨f‘ŒÀ¦¶tÂ…škÄEë›{ìô¥97ÑŽK‹ö¤pq­’&³ZŠø®wMì“øáÂÚÖ8P&ãžê4õvBòuáÿÁׄ_ñ¨°æâ'±ºf(N.|yï·Q¸·;ñ]÷FEÐ)ȲIÝó…Eu,ŒŽ 0bÓâÎË_ c¯Ø“b‰ÅrŸwF3~:´‚QÒ¡”¸£O›fãþ«Ô¬r§†_%‰ú²‡=@‹ñ D°mÇãññ¿Çã±÷aè€h&z߃;‰xcSOß1LúÆ®Äý¤x ïë·Ãåa~ÍE¥ ÿÄ;gÑÔ)+Á‰Ã¾@VŠ<Çú‚1¿p{ è²[ÛŠ¢Ÿ¯ÝÞQ ‰Bëun·«¨­¢Žò$&º°ef§«†®Q $ËœV ¢JßÇR÷í(.nà Ûê£Y¹ÙÚ³}O@¶zÐ?¾¾KW¬õ¦þ÷vÜlÛçŒþg©ƒþ"¢ŠÛc÷zÀF2kŒ´<7‘ïèàíur%ÇâVÑÆUµ·ì ‡“¥‹Ür/vhÚP‹…ŒZ ×ð©!©–9æëlÿÕ€^´ÃׇbW/¸åW;ÞC¸7ˆ£l-°jC€¼£ÛrÞ9‡5¯Ø¿k¯þ¬à›òÝ÷8.é ¬öß!O ácV¦•ƒ"?q°àvF®O85*ßã\í\„KOóͯ]ËÏN3ÂÄÖ3 óÛƒøÐDRÞ*«D^È„K¨ú‰b(a-oL™+ä´ $zõüyÀ1Š'oÇÈ"‚Û¡ðÈïöžq-3Ì@·¥Ó9Iy'À°h|Bä§¡Š •k°dj„ÅϹ¿>ŠùÉ'IÒp3\õ–MLz¥U7ëK,›ÅT ýÖ.L´ Ý®>Š‘÷R¢§ÈÁ&¤Ê·:¤Vãµc!è†ërR‰J8GËŒjôŸ|)¸R^ä8J¼íÑœ òx<í±mÛ¶W)«Â=u€N-WvÈ´C¬¥‘X"¨¬V›¶ogžÄŽxVaªGÀ–ïj=gTÈ¥Y8EG¤§|ó´ì~†+5ôL-° ¤#`4¡¹õlëó|䊛ˆ°<î­&MÀŸÛMÜ8=8;Ï zË¡–§wöeÓ.!åLØÃ‘f—ïÈ«oãý/Böß8jÆë…{õż?ðCm/s½Ù™Åи0Eÿé•ð«^÷s¼¾Þ&õ§oò0þ±×"ˆQP ÍÊ<'8‘OŒ¸Æœqø‚…[¡ÿ¯£§àKó†Ðü'-Qá/µÔ{TíVàF¦‰_¬Ôtû0¿ò¥çò'ª*]Jòæ-–ðÿHç%ãÌ.^¥ ì OoBÿQ1GþÕj£Û’’G•ÿí,6ëNöOÑ̬¢˜ŒUpŽŽ3‹Ô¿ÂÁëßúÁŽ–?hÅÀFìq&Hl s Øó(‚ÅÆBIS!ÁØ{”î©\ì<>*WwHD|-¸¾ìÀ,f­Ú\­Ö„ôáƒq5hp!S6 Ÿ£ƒéqG]MÊÀß”‘Œt >ŒíÛý 'FJØ`k'ÝdÂætf8Ç´&Ù‘qàæò=÷Ç'ÚçÙÛA q .yàá„€Ol¶ü½Y»žUPz›:@äÙ?6<­LdäÝÃÒþ@ø¤f'!Ÿ²m2)Ì4®oMßÙe tÆ »¶ÅQ6ÃÔÐiôMª#Êèhxãk8šû2mf¬Y3´­Îl£çìyœ °=mûÀ&òäNô@ÿÒùý-cK³ªFŒ!ÃQ{¿4ºh7:ì¾q-e†9(¬P¯ßб¤Æ:ïz0”u†/LEbÇ0`¤¢ÛL“]V(Z@8xZ[­ «7‚ ­8îLf¼·ä"öZÓ‡àLíY;MX@Ñ8óvûŽƒ*¡ìqf·gÆ 2·Û‚Îí§Qì~‚±êo4FwøÐì IŽ.f¸Â°½¯ ¹]탣©©&Õãì}Í4aå@'ŠÑ )ˢ.†ÿPÀà[¨erðRZö¤b'ƒÊâ/õS6+H`Ÿ¨S(z¶,t0»Æ’KÆy°B£ƒO ¯IßãŸ1U°Rg3Œ…wÐÀ¤Þˆ4yö•¤Ï —‡BÖ¨²³HÈ®¨ùÙºa:Ž×¬òHeå”sLðB“c SÏüA¬¡ùBâ" ÌŠ!·é·:ùFÃ>Óóº‹xô¶yëyé(²{c€‘«czÑä¾uEy!Èjºg4¡“lïK*œ5×d½ŠzØ Ç‚jÊŸaMŠÂåP’.øÉSlÊ•˜>EaÍÁù vbEB n/K,ï,"h^àÅy%ù|v¨B™úÎÀi¿ˆvôˆ¢xjBÍQ/Ic_ô°Ø@×Ï£#–ŒˆÉ O†ã†½.5ô5öìÌERñKD\ág“3a.$œçö¨)UF´¤žQ:aZAlr„*d‡_&*¸š]–7à½üó³¬ËÑ ‡Ó?`dÃç¡BÖw}(Êiwœ7p©‘Žrn8ß‘  ÀÿìÞŠ‡sñXåŠk§nðV’*éi¸£ƒ6à„ Í*ú÷ \L=(U'¢ƒ/S0¾•XS ™ÆðÅlSÜGQÁX¯ÃÑ©¿–JÁÙIJà“λ½šPE„θ†ö·qWr-nÑf#IPxVŠæ,â%ñø³>j´éKB¹ô¡FÊUf"˰Îþ”oú-ÐÚ˜;¯"R´ŽÔ o§Q¹}¡_ú«_Ÿ\Kô]I·óMù;_,hðeÃ9N¸2\™õjÂ{‹¯FÁT˜#b&ˆgn–*yš\‡ïwˆ¹æãÖ–À°Û0RÕ±jˆ^µ?T.ÍCÄá Q×ü3Ö½«È˜l:~Òý¼ƒF¡àã}K—­|ÚL¹qh§Õ¶=>>>þ·m½áøåóùT(´aËv=b¼¾Öç•ñ^ì²g°À­ÒG‰y¡=W6‹ÈÙ!øhu.Ý‘ÃR§—í"Б¬/ê»@Ñ„´ã ³Ü ³Aþôªhºòÿù¥}xß³ZŸÉ'=0¬Â@(®ïÜò8¡´g†çÌÃàL—7ÍrD~³ð*´9?Ö&§µà³ ió½JŸµFû¥[¾xóÄ5TY$ªÊ ÏQP)(®¸r!–ÒeyuËåìz6ûÙ¸Û_«úbæ¢À”DÌ¢ÅF­Hj> ²ÆüÁå¹-¿ H?5u›[b²žAQ'¸_l0!Q¹ghtïz¡üFœ¯£ÕëáÁÖu@îl¢ø·Sÿ1ÎGÒŽ…Õñ‘ô¤¹˜ê8Þž9`ÑÒŒflF+s‡Ì *GhR !ÌA%+å×þûÐ[„VÈ™úD9Yö† ¡2åŽ@.šG.ÐON¾è¤Ù“\nÏ2HåHÜíØ¼•r©ÀßJ<7r‚ ð Áˆü?Ë“hlN ˜-ð-P€„Ðu®°üIÅPñzLßœVX¢pHnòúÀ|j€ünÒysÔ”uúÅÖÍRSÿ¿¯àÚköíeFóß~}UíÂnéaR*ï‘ôSx^pÉ µ¼Öõ™ÍßCãwXŠO‹KϾ|逾¿ž‚3.y/2ÿ®×+ïÕâc3•]3Ú¢È áÌ\êysˆ9˜ªÁÁ¨oR3ÝÙ5«™l”õôç«øW‰ØV( [« î Š“¡¦ÄnI1£ð@‰EÅíaf¦U ѰÓµ‚Ý'û‰ýÜÑ“QA@³H ˆbƒ`ö¢'b” À¶ Ÿ¤ØÇã±mûñÐû«ö»Ê×E^¡Ðð eá:2Ë/¸”í{ÌsÔõŠÕ9è%æþi´3Ö ¹ü!wÞõ?òÛ ¦¿É+Xxõ›N¹Rñy6žEl‡¸¬—Ÿl­>¯¼!æ7æsc’õi2 Ô¡ÚÂ>øwª!þ^¯—#gèÿVý·yÍCÿƒ6Ž‚ëS¯#þ15gü[ŒW–Êï[û=%ðo/‚mŒmcýü{7.©³Mü4î›;gýÀ>aÔÿSê¡ÿÒù÷îÇTxùõkªTŸJCLg5k¶k¦5ÛjNNŽ[ºFBUL¼.ËØ¹øFÓ{_-ªÕ–)TÕK};BÃÀÝ‚Žš÷ˆWQÝt’4båÔÓ=qV™‹ŠÀÇ\‰.#,ÑŒØyŠeb0B½\™šÖA¿YCI-á*‘Š´¾÷ï}3¤ÿøÉê§õ¯Zy#ñ:ÞŠ°}'·ª?ïì2yƒ ×%´BÐŒx þ‰âå·ñD ËvÏzé»? Ë`Œ^ý1CŠ&O™Œ§‚¶ŽÅùKMŒØv§¤ßŸÀ¡µ;ðãK-™ )ò|vb¿L4q:#‰Ýn– ½Ñ¡7»*f=(Ô ÑŒP¡¼¢ÌÆÞ_ÊgS/€à9øžc¥ƒA>y 6â.""Ï'1ÞIµæGɾj<ß«‡Ñú­`Sš‰è°DÀ¶=ÛãÑS Û! Tˆ¥Q(±Â=—„D¾~b g>›'Ç94éxf“~úÞ}R©BôÁäÌæSåÐCÍ8òàYŠ)d6æ–ô¥³ˆè?VÄ÷°Ý.œ4šnnI<‚¹W?¥4ý‹’!ÃLf¸Ëü×€ÂMâ[’‘}ût3ï< èÿh&­§”l¿Ãad{82dÙã<ü±œnaÞÅxO¬,šöNÕÚéOU+-Óhû µ:Ñmˆl±î_¼IËvYUªÂ裟Žp@zWiJ)ŽBßûÃPÙ«Þ`Ì˽|„ˆƒ¤é/¤è£€ÊuŠxR•8r7CÝ‘•³¹rã¨a©9ÒÛÈ.kdÄXx†º“0 »HUc@?§!VÆàQJ&Õmû›•2s†Ð xæŒ%•3QÅÂ:! I˜7à¸:΢nÃo7¬`ì²èÖõ¬‘«42‘·{}Šóã„—Á×”1Y»úø(QžÂì…Z¦§HÕ'Ë©c‹ýÍIé¨åeÌaɤ9ãž)3óå›ðýÞ€žl»ÅßI½4Õáx"&•=¶Ö f@<ô­ÿŒÞ@Ö‰œ™\O]q' Ù#Ætð½žÐgÅ9bmE§”Åà;RÓð2d>Ý…^·‘SÀÚÕ\W ´dVŽý.ÎññÎÇIV¾•܇Y_ƒ«ËX@Å å Ë…DKGà\«¡j°²D~?ZHH—£ëSK{ g*¸¡SüZž‹GÕ¨¼|‡ðÉ©ñùå¤óÉ!Àœâfš[ªf-ý¾»Ý‡ìhþ™-i€I—Läü)Z“»´“Ô¢ŸL ·× r—kæ ?©É4ulG2ý‘uÉ3ÂN®—=˜¦Ì×µy–;¬â;;&ÀÛ—äÉþ#%7õ~'3Åé¡é–+•´W'ÛâI'n”ú(ïá©êÚVõ¬kð¼è°7X<6‚ý§{-ÀÂPûp­í€b¨õŸãéuyÙ‹´ ²ñ0t®…Ï')Þ}EºDºg¯OÈ«&³óþ#ȶmÇãCZçÁþ$Oü?U«±ß¿ÜñúÙ»ïÌXåwÅ<¿wŸ8)AH¨·®Ä“.©P•‘ȈX:%ai˜<–ëÅŸËøŠi'38.—Íc’㪫½Øøl±M Á”²4}n0í ë\ ÛC’㺈ا;Žº“4|$Øu‡®^qA DBäbš“böÃåÿTˆß\èwÁ!0Œã4½S^™0Ç…ë²G×íW¶ÆN7G1·BD5Å.Ö?0¸M0}’„XuÄ¿ù{g}aì_R{<©FÔ§:¹ž…Ç<YÒ@X¼q|WÙ»o˜A…5ñfçOÌŸÜBºÉýC‘ÉŸŸÒÙ÷TzþË)`$.u´ïW<‰+ˆÇ}5éHA´Å¹^„¦4n:\¬¹ZR¦ìzY1K …,v%]3(UeÖq‡‰MºyFè¿WÙdÑ9—¹Gî‹T2Lè˜OLŸÃ­•Áú2Ææ‘%–pyï$j©7Þ‘¡AŪ4ë4ßÁ^ÑDù`NôôDëGûž²æ4ÖYmÕôæ*µ#@YŸ¤.:@"yÓ9Ç‘hß-cÓdÝv2ú¢Õ´¦ÿ¢ËçØÖgë<®]sT¥4iäòóÀªˆÂÿ>Òù¥ˆæ•]ùö€S!¯ÿê×vûÜùsnå”/*owŸ‘2²¾ÛPƒÃ쳞5„€D.ëä¤I„èäó NÏ‹ ’¦(éJ솤I{*ô\ÄñhU/TѪ¨i"¢A\ÖA\2ËŒs‚Ê3ÝÍÀf¼Ì]ŽÊ½ÛZmEDÇãñ±ÿ³¿•ò¤’,À­[ ¾NK;®mìK¬?g±5uûÆ*AýÖÏ«”A·ŽS¾óC&’w:' àÚ=+ñ9­¸BP°ÀùÝ)9Å{¼w2ZÔí\a/nÊ^ýÏdÏp>6jPXî9TwE·çÓs£oÛào…È>:!¹÷÷ºûú•¤óÿÚÙ}lpìH¶4éfÔx­SE·S aŽž)·ê=K Ug±Ê ñà k*‚ ½CRQøf€˜OȶÂÒ\ºB5\—ͨç¶ä=GJº½]c¦HËë’"“Ny+ tų°#'”IqÔÈP 3·!Ì´«uLC!bÇžªø§WuPÎ@ˆ‹bíÛ­´x{ ¥kIusù€1ÎtkI"V3®°Åp ßs`âõmëGêK P™‚ã²·RØO³^,Ol[›&Ø•Léz¾ºPrìÛç±ÑäÌNuaL­EjÕX)¤×†þªÛkßý½ƒhR#OϱßAW¾Å&òT=χ&Y§‰Ò¾–Ç ;‡¾í{ß'Z÷Ýfx2­Y8–%(ªŠa;„vS{dr ƒPè -Ú€ÇÎï¿›¾Ç¶mG9fÌi4s—ÔR—(w/GO=ÂG Èæ©oØ"c-õœÃÙ!ùEì»jl)ÉÄ—ÃÛUë]_ û­ÆbùCªÕR°dçB4çëmýN’zNÉ.§ÿªMV ¨ctt÷ßAÔ æ:q(O>s|¢È~·¤¸:j†»0úƒÃ‚Žäœ*f> ™‘ÚE nùˆ˜×¤·‘ÃЙ·1åÕ;²“°/zÙá_X äˆ?LÚ~£¹ì þ…ûà³õô8Ás2š«”­ŒŠ«rÊkÁK¨KŸˆï m)˜eàbq+5óNÈ% 2L×=¤ÍÆ’WG#s>ݽ†~pø<Áçç Û;Žð1Š•²¿Eåè•vµûœu{‘æŠïÁ:«œp?fâëê­(KlcŸÍÐ͉5dVH¢è_óÕ¨rš‰2>ó­ßg;Eß–$‹kR ³€:çN %ªïm¬­“Ì1½S®ôŒg×|†Ž{5ä'û¼µÃZ¢¹v‘HÊ-õÌ^ìÈ ã]¼;½Û›„ï€Ìši¸€ÈdÌ*ù\v.Ñ•'ʆÏR½Aìäó K5¾ÙŠVhFáàºÉ3{ü©=L¬ýo%?ž7ÐS Ù‹ÇÓnÉ' W½y'b'P7.¶$ÕxžÅ=$biPrE7$V—rõIM¥oèËæóÑmf]ßM†»Õy2†¬rÊ,C6LѯWŽÑkW:¡’·Dbêð]qŠ,áN{éx6t€z%*]nÚ¹=¯3ð0åJS×íögã迱jLÚ%íGdõtÐDu‘KÒD–}L/öËœ]Z%#ð´ ‡BÀ`uî6;ÛXH°¨rV蘗ƒñ«Y‰"rçÌÖW¶éª£¿s°´k?5«æ X‡þZt‹ÖIùß°‘íûxSÜá–iD¡ß„i]„z5$’çϽþÿñx|üïx<‹mHŸÃÙ)žâ¹èv—ÂÒˆ5†«M´ð®öS>ÙÚ!¥wŒ&j GjïtwñІ¡ZŠ>íäŘivZuö´•-¢»L†u@)!ç†#ó¥i u’£erO"Ó3 À’ÿ˜ñTú‡t€À³€{«ƒ‘7DÄÎöLsçõ¥æ°÷O™~ämì¯à1?²@ÿø°`|à[“GoÒ9&z›”µ)ž@·p ÓJº/ 5.k 1¨:ø4˜QqÊç\8Qõ¥æúÂ,²/YN‰ilhdJ„Ù¶Â2Ó®‹µ 3 zœÇü3”ù²?èÍ:è¤u‚”‚Hrÿ3xuVG"†«£¡q‡@¾ˆÜ™%y±‚ïÇt(êN,9݃gjÔSM‹ü(:ã-™±©øµ©Øçá¤9ÎåHÁø< ‚[6 ©¨âlJÃPB9ÅŒe[z’rvjÍÂùš21—56©<…^cÙ” øò° {K+s%ÎdÈNirI )Ž„qï@ÁÜ€X’ë1fÚãÌ2^¥w,o¾r!¤*pÏbhÁ˜ý?Ïç Ѷwèh­`y$Ù³/VV²•bªg`éttnµ1ù°)›2h=þHYVª¤¦f4‡c!‘‘ï ÄëWäâjó’æ$* pç_N:o#‡¤’d€oQÚ)åT·F¹&!ÃWNÄ_Wý¢l/¾>Ž:×aeFŒÁ—2K4p)ÖXqNßôJÄä‚©w½èpì7]ó=”õXý{&J”,"Þ5n¸18<=»n„4>54¸1;38ÍÜÝ J#–H£óh«/¡l]<Í—Þ´œ†lUiM-WDÆúw¨Ì ]:Aˆ­|×-'-øÞÄÑcwXlC'Ós•*PúTÝ/¥<Ž;ß‹ÿÇÇöx`ˆ·Fjt/¤ÁÖ9÷ÿÝöå9 ¦\‘À+–mí[ÅÅ„'Äá³²ZfJ‚¯VìLUXIËಬ^Ò¼Ai]/êb$×i `~x—­É ·2û‹”™þ^¯Oxñï®t¥¥5?é6l×ö=wï~â+å•…K˜Ñ¯ U|ƒï›‹ Ùþ÷:±Ý—*nÓ±üåÿîˆ÷òakƼö§ÐÏ+7ðcG&f_¥ÉþçÞÏ:´'éü?;qÙé…7‚!}ú/¥,’FϘ_+ú:nzï°ÎG|OôûaDÿghl/=5%fP­ž´øJ¬WJQøŒI¹ßbà!@Ï` #Œð•G{ͧÀ§ÑB¾i#¥ã6ì:ÂZÄ´VÇ€tÌ"lYKJ8äp^=æ'¡UÙ±Û4xfÊdÑg=~¥.Hv#wµåy´‚ˆý{;ä;HÜuÁNÚK?G}@Ÿ2.]g[¯|™•Ù=ii( ÙM‰£‹N‰µ1-ߤÆá9¸®˜Y³,z;‚ÉÏÁ-õT™ÿjlö¦å `ØÑTÑ ®ùnMxghAgUÀlªÊT÷}Q½Ø«–E'6(ÉVt¦–J¶í¡Ôv°m¶Í%¬©ˆàW tfë>ž…ÆÊ`ºíû,¥æƒº Á”©ò=œ+7£’qm"ž+žÚi”YrdÞ±+¤„£¯X¨=f™ð¶ ±ùárDƒ†Æ&p-Ñè¢B×—Em8Ó*0‘‚:únÒ(ûÔ‰îL³È4 f%<‡F’6fºiL-2ghï8ìM$GuáçÛFo¹Xž„ÞMµ/îRû Ú%¿4ÒÐT3,ÓZk-I1[­›V¾}j”·`›ÎÀBq¸OÃ_‹ùÕ)˜Ñ¥xKˆ“i°õ_£ÔõzÑyúj—ÿi†c=&Ï µIÍáfkÎF'æÀT󾨜‡Él±bww)t|u7Û ØX‰þ¼Z2WV|T’ GGVP$eŠìzÝ®Dǵ½áœ9A÷ùe¤wÕwWY_Öd½ .¦Œ7fiç ƒ“éAŸ)0­Q]ÙÈ¡¾Ù®}Õâ’‹@Dr'>-7‰uS:^Ø¥‰ÑT·À%õ¦7ÂêÅõLúi¹4¯0Ÿ 1aþàjj”ºaͨkIÄ}ë¬ì¡Ì‚á8œª…éN(¹¹Òæu†k‹ªý‘¯«/®ôxõÀYÊÓ¡uºTÒôËàŒ•Kx¡Ê¸ÛÃÊ0f Hм´WdtT£Ždo;˜Kd-ùþz’æ“Î÷;þµŒ´S0´`m1àlKeNÒØ2§ÖÛ›rèupD£ تw½[‡7ŽÂŒßòÃÌm÷;O7‹5ÑÛÑYw‰FI`;îq,Ml&P„©ÛCŽÍÎÎwK¼d:É^ÜàK¸dIÏyvE[²è³ÆôVthË«ò]a>£ò@B‡„i8k”DL¢SÚZŸøj• Ðìî¥j%=OE§β_L©ÅT®*¸q<ÙQ!BäÙ›øŽŒõ` WÐyKùÊh¼-%n…ùG‰ó&ˆã 9ØF)äÑœªþ¯JFxlÛãñØèd8äù|*¦|Dq ÃèRú#Õô ƒmEk7Þ²‘7:Ðͺ÷ÊË©7¦Ûµ™œ€´ëŽ;.Û¥:Wb†[ÉW¨"M”Q&Ö²¨ScÔ«¡õs0«>7-û€NG\NŒœt„½}ÄD²5[8Šž†IJðѹb“0µ0\Žz©i±¯ØfCÊ"}ý{ç ó¼ŒË°ÂuTÐÑ-e9(gÁ±T ö³øT'ô,™Ò¬ßê@ ÕKîˆéÌ1dBÞż¿N”ÿ{žRû.:·gF¸³-ÂüJΆ±qÍʰð<8aÛº ,'ÒIsΤäåw ¶˜"íaìtCb‡‰o°oj­qŸièr)š¿`Ðïéf7¹P@¢¥|qqm¨1m‹ŒBæa°•‰pÍ.H ÛèïÕ„À݉Hi|¡ _i„­8Èä@j)Y¸lÆÑK´è:g°¯yhš•½*yÿŸÝÐUe·Þ¡†Î!rÈHbr»*‡‹†Æû²uVàƒ mƒØ¶ÇöضÇc§êy‚ÁI’‘‘ë©4"0E˜{¤´OhÞ $eqfñ©mÃhÆ:%_P2ôsÌ5¾TdœDôe÷’sŠLYJ°Š<öŒñlÚ'ÏRI¯4ËíXkN%˜ûÉ+²Óò¨ñvx&,8á|Db,¥$MÈHÞ@ç.ô‹gµW)‘Nu…ôÇ·³ØúŸ®øþ ˜ês†c0Ü­²Ž~·÷ØÀ‘«Q¡IÓq&;<…ªMm-Æ4È/-”Op¥"º¯‰|™U2q¯¦É¦‹çì¸Ê+‹Lõ`­×Hž-Ÿ4¦hâ³£Oï¢âŒtHe- ¸„·#|芸Ls 3Œ½ù³“g&O2CbMq?!€ò”ôD>·Xéû7¾Æ‘bd¯oÎÙ‹N2Öü.£„{[«œ— :J^ÁÓú¦w d§¦êÁÍäçƒtð‡W¹„(šYÖŽ*ÞL\1uj™ì×ËHnÍâ•áwô7ÐG ê˜RÛÇqAx¶Uß•yÔ² ê0â¤Ô×t?¾ùÌÓèë>#Mz‚œ„ì\Éí­xY«Ì?ÓiövÕÆ<Žlår‚ÕåSã=Zƒæt}X~—õ{_p'&=—o8?þ Òyñ%ç$“^ìð iê‹ØË¡z&ò¾+bÑ*L·­@iÂÊ¿l˜ ©ùHÊDÐZíGŠ|“¥À‚½ìÑï{Ušªab€ œût¬íËÖ°ü’)Q€92ÍBÊ™DFc!®£%« P»èÕââö›r «¦\r—s³ÒŽÙbê>xÖhçØ¶9|›zK§~b’¼0YÊaSúŠê£ß¤ÈSzmë”ë©#˜®‹y7´úÝ·•>A{þ CT`V(šÎft&ÒÎqãV,ÃÔ$š/Ý=3Wt·]BÁ†ÇöØÛãcÛ¶}î(OEÑä¢v#óZ¡<44 ÐhóÌ*ÖKìªy>öTŠ‘–À@?Q†Ê‚ÞÕt©œi¬Xú¬ “FËÙÒ,ê‡cŽ‘a&? rDj1yе¡£Û­ðþdiÆÛ"6GtcMD€ú[B@ÇBéÏò&lÅaöm£ZA„z8µÛ*K¨K×]Û= ‘j÷é9ÁDÚ¢¯ˆ,[I»Ñ È€2Ó€ìô‚Þû! ã_f *~2$Õýœôqô;{Ê AZË´F6Ý0G‘X‡ôÔ #ö}åæR;HžO3îöÎ/k\ª#7Kh(Üç|½øRè1aV¸wæ³ÀìÏA“Áù:S¬v8Õˆ$úK]½£¨Kd¶­ºõ Ù„€ÁX×ãDáØ0-m " @’q¿ª¦oßó”ü¹ç»lìñá¡ ÃT”0rÈ”rЏ?‰µÓ¸Öø¼ƒÐpR»LcͶ¯Pݵå~ŽLZŒ¹ý£0Ò"ucx"÷åí€{ˆß¦Ä|.ô2Rºé˜ÅJ²&)©E Ô)RΫ¥é&×ôsH=7ï…«;R5U N ƒ =ì¼@qq’uå…¬dË„DÜ’99C†ÿk€£mVÌØÞ²2é™XÏ— G„LãlŒ•oD>H+â†|vÊo„õŸ§pQ¹µ¡þ—¿ŸóîË‹áµhÉîwkbµ^ÌŽ N.&Å%蟙‘U$2"XÁâÕúA¯ê°’‡[FG°iÉpÒl™UX Üú¸ùsõø%ÐBù°žE§×O:Mk>iŸ34uð.¯í¢ûGûŠã|±ïX³È8½rÖ× R÷eö_­†”þ3¤ó,IçÝ 4¢f‚ ÌêJ¢3°˜•ù¹rR«Ï¾¯Àœ)§Ûé¾ ˆÓ áÇ€«ævUIŸ¹Îeºþ^¯×^| »S7r,% .U¡hÇ7 Jí—ÓøâK“NǬ֓¶x1î,oˆþö:ÿd”Oh&OÛ ”*5λ®{˜õ)Wbè°Ù+e`ø ZY¤Ó'³W +wW1m¶íñøøØ›¿êËÐØ'™jJšÒÁžÉ“õ·RÚ²Öߌ3OúÓ¶ï⾺xC|Óż°¥þg–gDÖÁnoÇ#'e S²D¤êÉKs2ðÚœŒú€7@ßd\ƒÊÊÉdpæZqÒa匤ÃsfÄÑД—á3òíðÞoHÖ[Yʤ·‰ŒÆ…}šý(¯_à½öƒ³oé°2ô.—Á‹wø‚á¬'Eì¸×Šæê7ö`»ò™ Z8ÇoMåu„óLKÊ×YCN+ëƒô:×9]5•ŃwFs±”~ɸ!éãK–4‚Ò§ÝvšÿNs7åLj<+9‰Å_ÕõPoy®µ-Ù…Ypû$|ÏjOS?¸~½Ox€³zù•A`w ¥Jꦞó?«|ûN¼4˜‘n×­y½¨É•î2øÊ'º°Ö{ä¹)_I£U”öcÚ5._Þ°!¼uÙþ;¤órB:ÿF_ÕX0ïy£ùÆ ®ÝÕ×G— @Ü+ÀV#]¾Þ:]|iÇãìL9øBŽg PZuÁµÒ~,éæÎN±ôteB™T£0Íùa•‘‚=_d˜UÚ=÷1¼ÈûíÐd¿{>õ0Æd§3Rs~a€jj5õB…ë@le(¸wHö-ÌÑé*Ê)ßîr Z«°ß WvÀ“tþõb¢ô>Ù ëxzöNßB”n@×ï5•¿Êܼj.BóK)é[ѧ:Fñ¡@(tžhjrzš&UQ@è¿'mƘáúÓ"R/P§†²h›³,44ßÀžœŒç+ˆÎxî=5@ƒ5ÙÕyùEdŸ¹è[Œˆ5“°äö·˜›ã…:Ὁâ?¦9#¿ †$÷G*£˾ æaóÚC‰†`t ¨†Çá[>Äöß­Eh£ÞTAdI¥*÷×(½šn(x ®Cª5å–f¼Eê 1ëug<ÐÞÈÈ4¢qÂr›=›±×Ë÷pT”ÄÅ"èuÕLÕf¤Iºê‡Æi:§¯rFE?Tù¿¾ç1ûoÛ¶a{lÛǶh¨RÁ‰-¨I³ÙÈeÐZÓCÐý ŽšÇPv#Q@CúÛŠ$´‰¤©ŒfC¨×tÏ ñ„†x8\åDQÄ> ìª6ߥdŽÜ›²¢*[¤cðM tñ¬¦Ð`eP¡i¬,4O‹M¥bP‰ÈP²‹23É3 ç-Ûˆ³Bµgغ­ñô‡HKN {¡6æ0l½¼˜1¯êh²®®Jïªþÿ§?-ºÜ BValYjB¨ÎÒ{ümd4IÛGßQ»zD‚/¢ñ|>C*‚Ý.Ìqÿä´×±7½Û\ò¢ŽtyUlä×ÇYd¥Ð]¼ÞÕ¢¯âH(‰Å0«ðZ·1A­É³/#ËàІs8sJêoÊ~r,ßCç&„¾?Bt®óª •ÍN™Æyhôg8­Y«âÚ·6-é ™Ü0‡8µ¯¾£Åj ¹8kšB¬û‰¨NÜŽhýu€õXd|o6F>Ü•ø.‰Ÿ[ÿ¢zÞ^öèü+XR”£(dTI™ÇLrhD•…±®¾Ì©|FÀ™¥¼¬‰m±”Òò0K«$°™†Èý Û¾Ðé |®—¸$Ðù-àõ¶Æ1]c-~–eÚ 2gø³0¡ ø Ó} p©5ÒÁD˜‘Æö7xße^íFù|Ân:{ä$yƒ¹”1yÅó#ÅD˜al2ñf§ÄÇkTL² JJJ°,¡jX¥‘·’I:ˆÆsÐè?Èg:p:}lHrÖ”K‘õ̪`{h±hFƒhŽ[e8ÖÓF¼dÌ„ú(u—¥E`kO7вO¡½vp°Buç°àDQ Z¤œH|“ w-<-_PWÔÛþ6I7V L·$·eÏúE½Å؈–üŽXNÌ@Y ‘$d«6ÑÜŠÌvn;Õ3NZHeyþ[¤óúÈä¿ä¥.v[jî xrEk#ƒ¢j5fnK^JÛwD +§=Áø›&>vL x¿µžì"‚ü ¯W‚öï• ~Ãk1K›ÐÁ[æ¥J‚&–*ÉÉœ"pÉ :Y/RBqe[ºdßcÉ:æí üÙݱSð=:«™z‰6¥6Ž£mP ±ÎØ(p„”­Õ%EO-áæ}[E坯Ý`êmüÁÞÐݲ ØÇǶ}4ä§æBä<vaµÕšcˆ_ƒÙÙˆµ}²Ñág]¦aÙ’çZø<+$Å_Ï7Ÿ-`ÚþžãÈYÄ ë'®œ¦}HhÏLýºý¤À‹ÞÑ`ý+^Ù™×ØäWö9ÓŽ‡1ñ Wßù{Þ¿å¾vwNêå‚^S„%cºŽÆÈkëù¥#†×:©Wê¾·±¢Ò›£”ÏZ€ÎcM4~,ùDÑ&§ëíl£ß\Ãñj—¯òÄóè#%'5^|•¢„Ëo›uÄ•;Ò}§Þ|a›Í:ʸõ^À/!Oü–q®Ï´D ýFFÏ!’ÂZGö›_3Óé ÏZ¿12¿… ]Ê)Œû›¿Ž†À¨LäI>©»ÑÈ âM+_ùŸãÛ>M¸Õq­}K£d<_Vu`kìø¼¾c¼°<+ÞÊa¸û-ç‰X£L¡Åßæ"tþ®‰Ã•î+UA>‡:{νÃrH ïDLö„ƒb´ÕÉ{*EW· Æ–Yô‰}ÐõÂëaê7•0Ó¤ê½zÅΘhj9²mÛöض6ˆÈóùÌg—~UÒfAî¸9gíBùAMؼJÌrÓâÓ .º—Y•ÞÝRÐé¹³ô޼@+n¬”~®¥ãÇÚ"Ðäø‰Bð½t]jKçÊ+†™²K°¦Ò-A+ZÀӛϤÖn9mgL~ø&‚ùúoôÛ_?Æ7ôüäEäG§½ïúy/4ôת¡iôt’ZR•åß¶,@ÿ QŸ+Š×š¾Ð¥ÇäoƓŴcT*@áG¹7g+¸É¢Údíß þ‹¯Î×[Œÿª÷^³c×.m/‹®¬@%ï8@Œ)óþ]>¥ã )ÉýÞƒ}Ïñ|²ñîô¥0ùë»Fð+Iç݃àåy¿· ºÕwe¬sIN×s0É.¸¾™|µt·×-‹õ T>yoîS~ÈøðM>DÀQ±¡d0=»{Ôræ²|“=—FÐÀ2ŒÑÊ@z©4Ì4"鋆"m-ªå;Šã'ŠófM3½w¬¦’ˆ˜ ‡$Û>ÍIFÿ­‘Áíg2Á7uÉ\‰}¯ÀL%+E³Ÿ¸jË܊ǃÌê§ý¢Üˆiܨ%õjçãQÐ6}õ9ì³éb^Œ[/Ë… ¥a¸ã÷úÞ¡Z†üÖf†¾nŸ;¯5eÊN\¤ÛÓ¡ËôÛ[·°Š©hÿ÷þ¹Þàmþ¶Ï0J’Ég.ÂÑ¡2©·\“;€šyK/µêÜضmÛ{ä¶mضÖùJO3#žº¢ÄÝn;Ecå¶Ïg‰RˆJ–Ù' å.Ž\Œ9èIu´ Ñ å´}YÓjš(bñzŠÀæÈ1Þ|®v)MJb´ô¦Ý#^4;wpaìGªÚ|4,CpÅE¤Ëâdv‚‡^„Ò©òÝÛEnÊ|Q¼„ŠEÂ…šÉ„.-eÙ½5{ÖÅQÛé¬Ð¼} î ›&MCìÔ¡zÅ9úÿ–xTF¹Ð,`ê!ñÉÈA¯æ]d]@—†­òç¾ )SMÍ~Â(Ó™¦~è“¶ÝÃÐLVxz0Ô®4ÓV HÂ9c¶ÄXª‘y anYÔ=DÖ…¾>]Š‹šûoë–u‘Mž»‰ØXLˆ½L¾pÆ:ã- Ä~ £C´¬SÄàÙÌ@O\f@·ÇiÇ”š •6| Êþ`Ö!—P$Ë´õ·«å7\Z8ÝsPœÊ‘ë0°|¶TQžÐX va©Nü?‚DýYÅó?ÅEÍ)¥Ù!C¤‰|`¹bü/–^ÑÛádÕYs¤4 ÛDO)l4í +áAcçÞ-Z¯º²vs¦‡c&"íÜ—p$õí©ê~¨¹DT•©áqlšm=(&›;XÏ)Z‘q^‰hlÄd*òªÎ¬(TvdÒ{ìü?‘B¤> m1ÔŽŒf½+ÎtS®D2/NbQ∠÷dÛh$w”T…4ïúë´fQÊ’Óu„\÷WÛá7xSW·ÕÇ¢©›¡ò“- ¤z@uVÂáwms~l9xQ™hßЦ?×M„í~‚ƒ Ýo+ôÂgrµ<Ü´Åè¬ò£Èd¹sùR“Ö©a+.¡3âzá`Á"2l§NáªDÊy±ÑоeÃÿMÒy‰2á˜%Ó*²É“æ^öTWŽ0Ë&¤}ÝÅ®‚—SV¢ ¨FS,ÝüúmtØ_5îÀ×G²i©ïKý ÿBmV#ÿ©õóü´‡ù¯¼çß9õ"'ú¡9üxa§#[´áÀgȵL~²£I¥xEÚœ’¯wØ"}zUÑPfHQ‹}zв‰äç3ƒô°ï•QÃ0Ö‘ˆ…9£©òÐz#ú¶=l›1ñ­ã¯:Ö‰I2ð&'kìÜ$'ÑÓšUa—eY ÏNvL¸këƒ53uOÞ é&^l±8éКGéÒd%þ-šC¦mr“„¢ÖÖ7"Ë?((s.·2”Ÿ¹h’ÌïŸÎ‹¥ÏšEÑzµ)8Ä×MZ‚&je˜®™Î.MÐÆ*+;ÇsAÏ.¥ü㣄vVòŸ%¼¹}ê·­´÷êÃI[Ðý‚¥÷TYú8>hZWÑ¢AµãÜ¡9#§¡9ù lÓ( lDÁ: RÂE/o Bv¶©õq$(7U|ãEÁ³êuì ȳ¬Œ‚àš<ñ2Iç¡W "(ƒÀZì†z$§¬£çå^ClÀúÏîdÎJä±À¸òÓyÄ—ÒX0íEŧxÍvx­û†.À ¿EÀW¿(8êSÊ\¬…î ݇8×ÃÀCRæ¼àÛbj†¯^å|sM“ôÏBªS&!N‰¶.*ö àByçĽ~Hôd»ßœ½¹&90' /œŸ¶ÕKÖqßp&ŒØšÉ5n”ä©=«wê‚1Dhsø;½øç5ä™ä2¡ -ׯWn4HŽüâi¥M:ƒz0*…HãŸ|¹‘þ—Iç—xŠÖs+{ùßm²a»¶"Žéâc²møB|ùr4zg,2ý¿ò'ï[Âåøöøûêã¾×7ùÞ×pÔ¨ʔOÌôÖÍYÎv¹º’Þ÷7¥1ºÑ>ÿ>t]~oR ­î¥äù܃°VÔÅw!žBgÐ4µ¾«ÁÔP±‘5NùvQHÒ•~Dµ»pÞ®2O{­@ë•h€¶ ÛöØí±wôA¦SgŠÂ»UÐMoXª\ý9Õlh™êh´¾hó£¢¾y£¡Ú7[sÁj(0 ÑQ1„×-U%BÅ÷úÃg‰º˜¤åš3Ï·NxÑHåăÕüÙL¿åÄý2Èâïõ7Ôÿµií·Ë¢FÓ—ÿö þϯä¦+uT@ó¿=øž¯ã5}¬ øOÕßËÛäó^„O\ÉE€ ±qZ°œ%{ l9¾ýä àoû¥ËàsÆû?Dó9Ç0bÇjµ§.o·`L²£J•{@ UÛž!š^ê ‰)Õ‡upk³U}Œ·hìòPÄ>(Bà|]ß2oÊùïG 'qèC÷‚UɈâYno‰ÄEb™”ŒÖ«ŠÅu ×£¸?:M7âñm‘7}¾J¦Õ/E¿´y0¨NF"ÏžÕ•\‚;\Õø¥Ys»¥SRÙò,Ë3¨ŒßíWÓý`KÛè f3"ÍRÅ™$âXËqt‚øbC[7ŠU7b¾¤}#ššÅÕHc€PÙÖ•6Ô8²äâª=u­þ@µí áäó)]^¸™4(+|ä åPÙ„ƒ^EuZѰn΋ÅgôkIý*yÁ#¡E`Âë½ZAB±àÑ€½WommÛ6ll…_œiÑÊUM›Qã¢r;lc •@¡-év-uèRZÑn¾©³ ~¨1†¬è uëù¥×Ú”0|A,—IçÂR4Ocá¨ÎXˆY<¦¤„öß°,Gƒ éÜ]”xìXYßvŽ)Çw0/?Rärí”Öäÿl¦Ÿl ÞCWh'Î%ÚÝZÑ>qnÒZê̶¼릟‘T4:]8gtzšº|Ÿë¶§ŸÖñ¶g'}HkñƳùî‚}‚C¢ù8¼Eº{àйL{z¥ª7sbz»)5MÄñšÌ4·§“Šß®Ü…©ßNdßE‰§.É€?¡kÁ¼ÝЛÜW¢>ÑažV³£ËPB/…çâëÓGCœP3NsÖ­¨„SEBÇx²Õv-šwH·íȯՌÙR]* ;áw]ï7Pl\j²(Kúo½ÛŽäJ¼êKwú¶þ`ˆl O[ÀGÉÌ£vë›P9;æF=/…êzU~‘shdú„µDí BÀØŸ!G¦ãaòÅcv.Sß?¬zB/ ažuúÑžË㲫(‘ŸšdÝš` ´å¨Y˜hó2¶î²×C*5€$hŸI­¦•È‘¢$¾ßÏld ‰ 6 srýñ-,©1BáG˦ʮclåïΔW±623®§À œˆ*Á7ÚÂØH½â3$¦Ãsz¥ô…”…‹T¡°,_Pá8¨V0©Ž‰ëU²6ÈÒà$M-HwÙÐgê»oÂ9 åX³•0Œáy€þ³²TŠ{9‘ˆ>ú¥¡Ãªö®0³u‡ÃÏÑt;œ7ˆÜJõ¼+îT+ÌW£"W»"qÒJí°¹sµ¶õ§¨È¨D,«–†×nýŠs–©Ÿ¬ÿÒùò(aŒ„-zà®X°õÄÉämÕñzé²õ zÎYmJÏ \î.ëzÄ?ý(åðC…{€5}7wÿR7PÄžgä«þ˜â¹‡ˆS‚µÇûÞ\å÷vð3.‡×¯BœJ¶â¥ýÄ鈳WeËŽô%øãJÍ.Ú¡ö/è8-àïòhÐ(³"ñi˜íÈä³+ê|ÂIu'ðœÚM­…„z€!•Õüä¶À¶* Áʤ¡VPÁñÚ¶í±=ðxl;óÈó©¡Kêï=±Ñuq´ŒÖ‹jažò†Ð³³ìªÈÐ Oåw?;6lœØ b.ï>o×"!È–R!Ô%¢Ê‚rÄS_¨o¢šuGa£%UL>–®÷ÖIÓûaŽ~I˜dýqƒò*!ê ¬F*MËܨS/ª9׸Ó À$„Äy }Ð ±R2ÅVŽ«¿Ø™b{e!´Ãh¦ZFSŠ‚œ1e¥àÓ¼h«ÂbårxŒ¦æuðb’70Ú‚Ò-dYNëû˜+×3 ¨]¨H"ìØ;"r[ÛÂY5£ ‰[™ùÁÊNNz•—)µ2¨þUÿõäÞ]¹k½ê®ì’•‡!bT[a–šc¢€Ð<„w‰t좻‹Îô ›kÈ)íP VW¬rì%²ù·ÃŸhÖÞò¯RC6=žRòŠCš)—¸A{Á BØMUd¨¿ äuKê¹QSˆ Äÿû'69ti7S"út2½Ðó¨] ¾-ÔI0q…ô°fZ~!mýš‚uÁõ°ñ‰‘lóÀÖ æŸí±‰wÒW‹_æ9¬ÜúéØÑ¼Í²òäMäbî ¯Y÷E<‰‹§ §éÙÜÐ'3¶Öð` O ÓGSiÒ•çãÚÅÀ`i OŽ·K¼Ë«wÊ÷?ïñÚôÖÂ{`Ç¿×ßë'¾6è>ÛÏ|ñÏÝýŠ“Ms)–“¾õóvÛ¶?›ö«^ü;¤þÁ8ô-8Ñßëïußn|š@ŒÙØ:ÿ£ú"góËHçåt6“s—šnì³í¢•÷dœ5Ç?´úi/)O‘í4}cñÖ®ÂÁ©Ä±å‰âùÁa”`* $Í®UäE—ʪŸ@tß“K$ e:Uýß±rsV*x­š¥óTŒðüR¶³VÆÏŸ(S©·šß"Öt­»öž3æîÖ¯¡¼Ãq8a“¸÷#_·} iL£‹ OAÅ´²mBÂ(i=;{Iã‰ÒýÙª÷¹å¸Mõ.ÝÓïG+ùJvÑÃ5DöËö)ÜÚFâ(ð·;pôåªJ¢å4žêkÚâéByª„½G¡œYÑ£ù˜phzHZÀÖ¨;ÅÇmÛ¶ímëò=6 S ub§=¶)RW]ÉÎE¥~8ž‹ú»éÙ2ba¿æÃèU½7‚M A|wõÈÕØ*vµùü0])Ù)ÐH¢!8sa=´KÍ_äÙÙÜb¨ß¡ ?µÂ¦²4™g°ž}§²ÑÄ"µ}l‰<““LÌO¦Í¨ @ÕD·0±ÿ̎飉‡ÀßCw¤‹=ξi+L²œó†ÙE÷4êêÏRN´ªM@1±"Ÿum¸¤%ëKÞºŒ<-:á@ÖÔXg±p@úì‚Þ+ ©S­Q'rX¢L“䢚ñZÏûñµöÙF¶äze³ë/Ô,<†i-sÄduVÓì3%É'csî³@d,A'ª‰Âk¥ÝòË…7«mѾ«]7!ÁøŒ¾¯L;µ'áÖ{Lì7ZøPŸNG öt†Æ¯bÐQn.¨YJ©^ŵÝOç‘ey¯ˆé\у³žzƒÐ6B&õžˆD¯Ÿ9A³ìº1¹ZO’PœO¤ä”5ç–4ŽA¯&^Z<ö©—˜/º´…í7‰ÅO ;^0×aÐÉXÇò!O—tçÁuÉÓùÐM„öbüêà HŠÛMÓ©oOy6.dD\ k Œ¼õpú ŠBQíœÈ5ýËŠ³ô^Ü0.ƒjÏÆF÷š<½ˆ{s¦òªa K®Øi¯ÃM„X7 i—ÄF[Ë^¼…Yßè;äļXã|j4þeÒyr1ÿFd?ýÝœy/ÄY‘—<þö Ï>Ûqm•k‚³6 CÀ]íC"šª(*_¸S¬F«¹þ¡êRÁ%! t©V ÙëíF\|Ów¯òêο¦×!j œ½‹re±0 Ö>ƒu”úµŸâ€.Æh„¥ÐôXÙ|)°<øš®¿MÇŒØF›?¦ʹvÕ~µã¤G5˜y“™®ò‰ AF€¯ £Y~f7LÃm=±DXÖØ€ÇããcÛ:qÐ$ùb —m°„ù6æÄ€ž5‚¸5 µÈ8Gþ «ÈÀ<@K¿Œ)šb?Ý!ƒ|Ѥ-Rò™üÓÄAéïP¹ø)ÇBKôR‡Kûª¤„>< ÉÚ#ǯ8­G¡ Iížië ¡¶Æ®DD)$àR9&49 ÚT‚»°2[4ΚAÜȉå¶â…Âû]´ åh6r}ï5:Œì ; YÛyMb;Îo”€ÄSÂ3cŽgÝQZÛCs¬;¶ÓªÊR’\™·€§ØÐŒQ|n€.Ç`Dÿ/! ÚE¡ÿgxf&;¥ø´¯¡»)P%+¡ËU åì:+Öv¸šYTu`ejŠfY† :bW´ÄÝ0…)^9Z…ô5gâúMEË:$«i˜€§7W„þö- ãƒ(¼ý kEHVhPæp°aö¢LXx”K°´Xòìâ~.þ)ÚNF½>QÁ¨îA Òö ÇTì˜3 ¥ùBßs¤×·&OéÒ¼ÀE²'!˜Ù“NÇ:içŠèE÷µ _Ùï~¾ü~!éüèé0µ²Ó|¯‰qÑÂü×GîŸýòWÿâÎèŸ÷h·)""~…¤–ùÔÃ_Š]²Àð_¡.úªLecø¢£H°U3ÆEì9ƒ´ì0Æœ€˜ºøÉòP¸áÓ‹Ý”þk`êt "Í`ÁNtŠ 3Ý+³\5¿á‚ܶÇöضí±m›lC¦8‰ôà!´àmÛîî.ääçŠ|s8ðBe…XôÿÅÛ¼eƒ€ë_@·y»”t†µË¨¶Î0[wáÆTÕ:ÏÈ¥øS2×-®óóè ²h#¯Sb#ïb˜iìœq—Ö )¢í›<¢X~Ã_W´_\¿ÉQ»Ž;»ƒõ†¸ë·„¾Ÿä¨þk|½ö_#-ßóXáó~yÖbÀÏ SFÀUôÿ¬ÁçÂLÿÄãüz_2;ÐÜÙÓ%AÀvq?OKñ[6ï[¾4-ÿËÅ@°ƒ™Óß+]ÿ4éüšÞY¹˜¦5±mvúßX–+Î7¿ßõù“‚(¥ì ñ¨÷.ãsh t0 Ŧb$ ß<¤-&À‰U.BÚËœ:zˆÖð š$ôBÌ‚ÏP ¥+Õ"8·µ<úYèЙ+æUZFÚŠ ¡¡#zú¥ö좲¾øßVƒBg4i)dZ©»iU! ¶WEýͪoÑè Bøä^úN6!ÙMmfdè§*þÓÕL­ŠøP«ÛU’Õr#ºôŸçîW<4ú>{qFÖ|0¤_Mžd¯I߆XÁ~­t†JŒ«µC«iEaC«ý<¶Ç£+ì |ìÑ0eûC³¢XzÄ@E3o¦PUøOÈ­@WtêÀ?+"›àÎ%[{ìÊØC¸½"Vpø Fi~2znö‹j­ ôí¢û<¨×ðäøä ̦ý!D‘iãÌ-®Z‡—”ÇÈ;…zw†ñXË<d“·è5‚B¥>Õ=èŸáÓyÈ¢¿Á³Gɳ6‰„h Z¥°I©:\Ð@åLh•Û _ŠYò¨ˆŒHog",€¦©¨ÚBI<¤ð¯êÙxÕ_¬Š%íøV|èºT]íܸĪöÈ• WUŽãúµây¹£ÝÓ”—Ù€—VÒKÑiê>ÏûF‹XN—¬^Á8Ò’IÜ+ãZëš6å´r ú¿:ౄÐÕ¿ïî"XÕ&[ƒN8U3~Ýú\TVT\ /gD®®ŸÃ?6ºcõ­ÜÝ¡œJèvº6¾iêÜ»¸[èµ²n©/™yY~Ó†O/GqÔ‰aÝ·eº¦nW"+?ö¾jáÓõV%‚ê* ¦czgfËöûÕ\¡þÐã¶Þ-tÊZ£I“* €Å¦¯ ο-pm`uéylBÕŒyŸ œó(ºƒæG¤Ié¼cù;ñ¦ñYµSn¸ IƒÎ@’ë¥ËSj@®´ßa‡Â?R#ÏVÅ[\Ÿ¾Ûiš2<ðþ! âîÎR_ŠÚàÀÔÙþ„€VOÝœ[Q‹ÈÓ—“_ñ˜Só“Ë£…*? Nƒ[ˆ­¾Ž­¡YÍîÙ9¼a(³KÙõƒ†úѶ ZI\)8•‹ë(ÀÁ›Ù£×ü‡L×סU©¥b½ôÖÍÁÛ¢„A;';€á`?(sÚ£—ß6<•³ÁA z ÜtŒJ]º]±È y hª"C Ѽ¸„ŠCeˆý*’̧CGE;‚m{lÛãññ¡\vÆ+N̤ +ô`›àPòëý„J¨X»}è¡ùr̨´2…F,êL8WZŒšIFã38[dšû¯ †9Qá9Éhªï?¡É[a\Ð’¥“O±7€?œ¡Hã…FæÀ•un̲õPQ–ÀOºxÅ¥± üè$km‚²®.¨ˆöOlÆO¡Ñ#ãA× rF÷‚>"#WI=(C6d|¿=SÚØ[ûNMG~. –œÕs‚ÿ‡«®PW+â‡bÒlÂäôë9H( øñÚ6ãùªYƒ¡gêF0žIj;) fÞ1dEÂ+vVCåMŸ?ªƒÕIË7ÛqVÛ†dÖ¾<´“81YnMñ©»te›S¦ŸÕêÜ!f`cdW_C–)ve.gªã¡¥`um8O[ÀH]YÃ2j˜Õ¯"øä*Ö\¦„?³Å#p‡˜Ðz Qð)|—µkme-ŒŸ $ëR_Ô&PåoJ7×ìUçl]y0mì´Z %DÈú,J‰-ša¹»’ǪœÛ¤Iäsši,p% rħEŒz:'HhÌj%Y@+  ÕîÑ!^éasUŽ”üÇm'ØžeÏŒ9%N©–L¢+¡×—'#çšg« ê]ÜeW ɰãÚçq˜,É[:x»ÆŸ§Ï`yx`¥ªÐùèœçJ50Ù†ï$ ` „Ú¦qxÚCKÏ<§@‘3q‹<0éÙd9÷˜/¬$.f"“߃ŸÐÅifÏÒS>‹–ì³Çã‡Ó¥üW83¢ÀJá…Зé}š¹.O5ÉOœ~E$eÑ]ù”nª_I:ÏÒù<‹@SÓ½bÖ!]3éì·“GMWÔ;S«HÒç½>Þ@÷ÿ÷ú{½°p{Ûœ1p »D÷ò„îÒÔm &5uðjÂîèÐ$F“AÐõ§éQ ƒ ´0 &œüèPºØåƒñJTP¥ ü:™Ú0öÎi͉ni±þåb±½€ÛAOC€Rõ ÁãOݩĶ×þlÛc ‘' \_ Oø‚§E¥oí*ÕÝ÷™í+r-g#xçô“«¾!=ÉeBbÛ‰ ”ê}ï4dôd DoŒá|¿Ðî\Ê\™Jžºœ0HßÇ⺠¶•¿­…)j›þõtW-TP¤¥Ùäë|ç&~Ÿå9{—Îɽnm~Àƒ§¥#W,îPœùD?Å'\wT+cþ³#=÷¬ µ¿d¥…Uë;J¾^ z@–}à3çôl×ýd’Û´ƒ09ÞÀ«£Q›³¢ëû o¨] þp†ÉÛ1BqfBçy¯)b8÷DÈ5a¹OxRÿסÀÇ¥E¾ØAµ’ ¨D€_3á|‡Å¿sâšÊ³¯™éŸIÈþß$}‡¾ø°ŸácuøÕkêÚÈ|ŒŒE®&á,˜—U=/êBïÁšCðÊÃX“9.aÓbïNËÃ4)É£N`D¦x #(°¢V§Å4ÏZù:zí:Ÿ!¬dç2à€Ñi9ˆ)ŽìFf˜ü‰Ï<äC3«kÈ­ uhÌÚYó“D¶;ØÍç w¹¯äx²óõPxÈëÖ ]åÞæƒÏV¯±SE %¡Ö·µk-?j(¨3Ç–me³ðLÿhô>©5‹aÿñKЕ(èEm4tCuïÑ…`kFØu!ÄÈlÛãíqèVµö•ÓÔç «‚j¢é'² rEJd&ÔWah{¸`¶éO|‰åç0ÄÄ’Ãb–œ8SËÒtœ¸>0ƒh[XÙ<ɨ¿Ì¿_A3Þ¶ ·Í¶«Ó L3“C1Æè:ýÄI¼s…^2Ün`U5õŒ_½(EÁ…zÑÍ/5é]®…éžú=´œ¼f›û \Mêôòˆ Îê€èN‚Ò•ÕúŠç ù64úö ./á8£Cj¼<Þ40­Xkú~F°òƔ竮ªâ¼kj’Z‡IAîúÊbX8VQói/zžá^ŸöàJ¹"ªø ¦îø"x°ùù“ãà†9Kp£—”ÿ0³6ÏàÖÿÝÈáÊ…°ó´ì7Ί‘R("mîI*\\i—ß5 ýM´ø÷·¹²çKi€ù™ÕkÛ?I ×”X¹éoDuÉ2²x³©¨(•¾óñÿ“¤óß·ØÎ%¼)í¨ãìÈ¥­óÊêA†Ž2ÐíÊ\-”:½“Z¯÷=zØ{Bþ(müp§ <…¹Dx8q“ cm-Nƒ)èÒÖãv˜E£ôÑÒ<0ódOÃTåFœ1ùK Ù†ü–bù†¦H^V-ÔDø‹™¸ñ¶ÑN¥qyº /sbF9ÈÁçÏüÁcO.4ÒË„C©1æèûA ÑZFÛ}֋ͧtž.·`Ëa)Ô!ÃøüéÈÚ¡ÀäÍT牺nžËê WqF ™<AH'ê9Rq£ ÁC ¶Är™€ê!ÍŽö_SIÊVE}™6#P¶BÑðwîœãJìTà"ÛöØmÛ€Mö”‹Xò½VMßm…s«¾E“çŠ>IÆY =6A••¤ÜR Îó¨˜9¥!Ù´í-¦@‘Gf$šBé»zãÅч¢›E¨;KÊÊŒ˜ï"Õ: ©[ûnø:Fj ±{Š(RÎy/ß}¢L v~ìA”Ô– ô1ÅÀì*-½A–’©‹#ƒZ•¾símÀ/^†ÔzW;6—')¨ŸÙ2fe|‡Á»ä„Q”yYóy‡2^.tV%±ß8ÓûúŠß¹É^öÀ¸ÈÆyÒ ²ÌNf fMÔu{…£û¿B?Ì2o´Ùʾ¬4OL¡hkN¡¨~ñ1b#éàéa­÷1MÉñ†'Å8ÓZk Êš**”>œ&‘§EuÑYÔ‘"Õ½&Ú/aðmõ»<”2Êû/àÆpÙлfÜ]V8`O )Ý¢×ö¶€ò_ “’¨:·2nXX³À æt×÷RS±KЧáÜŒ—VÑt@¿;&éÄDñÒ÷OÏ=K¸tÌòðÐ()ñþ ån³.⿞ÇI“ð‰]ä9ŒÈ°´†N*8#VÝ:Uåp»xð,ÎËVš¹gûCK” «]ü©©†¼c&T Šñ l¡A'ëZqƒÈ FÀ¼‡ŒÜ’b1{b"°®™°çrÖÓjòL¤'zË(}&Ò—xœÞÜÅ;y'ÁÉ79¤£ $ZÞâàøŸA‚̋聆¾}SÕ÷k!—kã†þ,ŸU¼µ×N>aÀb¼w“³bL'—”Š.~5îp_´”IÉ`WT(ŒJ¤¢ÄøÌÇõ4/®˜æpX—xq7%nhès‰Š±¯‹åõŠÿ]®2ú$eÒ ²©fêÊÉ3´NV!_ ÿqTe'¬>_‰þ‹m†XݹðÇè¥>‰×òÚH¦+ùÆASx$èÿ¿ÿúwIçÚ BÄóï¨#ŠÒao#ÌSn*’Â0¿Åz‹/‹MÀì,ÀM˜kÐ~÷¡ # ÂhB“&Û²¦ ¸7 d¦Hü#áNȉĿhÙj#'’5ÁÓ—À‡]2õ¸òñ·T< }êrÖ” %éhW5w® ¡zoÀ¹\”<åHª$µÌBXïf"þÈç;òœ~ÎçµØ ™€VÃNÚÑÑÅøF_ó@À¾Ç°=¤{…†ðª‘å0 Áèc¦êúžÇ­ööÆ^³ñ}ý xñÙ1ñþßÖ³MD¿?û¶7pWtÊi¥³Û ¤ÞY~ve6  ÷ÚC¥PØ•;t¡Ã:iHT]õ'ÀvÖþ[¶&4¹hp™¼.ñW„á³ÙŒe°ÿۃ͵ü:c91PIÙÅâ[™ûÒ^6šïWízšé¦ê”fo9¶ÍÝD·ºJ 7ºU_ •da$†ïãwÂhît@c\ŸJ ô'Öm*Öv*y@óDJKÛv]ö)ñ3\A|£G€%î€9âa`yB†¹ _I4Ì]"ÅŽ6%:} ±ÌTªIGüŸRåéÍò$&Õb#¢×TÖrd˜Õ›ëØ`£‹&eí®ª³Hš`fùR,…Ž[Ávqhþ‰%ôánß ‰ų&ÖmLp5ç„-ǘ=R¡W%^RxˆºP”þröuÇÏ|SkimLa"ꀳ¬Ì{›Dw5ç(^Z¨¯1x ”ÈÖߦÆéƒ r¿Q†p’é¹åzGɳö9“oêVÖ­Þ9 œ’·k·žôs‘ªs‘Æ6zÅâ„[j.Ïr3c 2:]ºÃ-ó²HßëàS¦Ž(ý/‰Rk¹¿™CdêW.…8û;+ƒ=‹ò5·AÀýaÜyNûýÓÌ(ÂxóÕ+¹ ¢~¢ØÈSOìi^>yRË,‘Ú«]ÛÊqƹv M¤Ímìm0ÁÜOè-tщ;¡}{èÕo$®u³ æ3¢ á@_hÎpl.ºïó$t…¢ÝœÂá†PCÉ–¥]ëwÀE×ÅAchŸE‡Ä/éuf½', „¦%L¶†›Pš$”¾Ÿ'5’0ˆcÁâá1!䉓•ò÷\fóêŒtE ÜGÆÈ8þŸž8Œĸ’Os<¯úXÔÕ(EàU(‹@¼V·8žIH8–žÃDš<ÉÜ‘ƒìÖ{Lh˜Ûe®«}§<¹¯¥r_wqt·ä0ㄯðÀä‚¿„t^“ ÃGUS«{nÏ _1€“D]ö5pQ¾“ Hhe°VZK=‡*^/©é,FËàýü£ªS‘?,]RÿN¦Í¶_\¨]À¥o!jpÃű‘€ˆL.¢½Ü&•«wÿ;º½é)w$ò"'¢ÆÈÞ:”rÍÙòÌbå¨ ÃÓ­OãmtBº͇;§U(ŠÏóD%|¨jt¶5 t\,vDo8>v* ’r4`(âŸ>#/ᵟë•R®Úe«MáeB SÒðiOKо¼oËÎpG̽%“wø>#V¹íÀÝ‚„ÌÁ‘b¢õrz¸'•ü ûôÚaPO0q?ÇJ¯í”ɘ¬éòVJ5ñ3®­gÌœ¹ý«6$£†"ù–z+^¹ÇÓÊ?T(bº`Y…¤o[’0Qx OŸ•ÜrÍ­·Lè¹u\ÖûÜ­œÁv_Áíü<·8!çj—¨˜kžý9j=ų-çÁ”wù ª~Ë÷¬É“€ ØOÚ\€Ò¬c,i Åv££Sш±†©Å&<^âêÒ }‘ài’Õfу©á_ùÿ=‡#ÌäU·]×¥ž}Ü_ëß@’!ÔP\ói€iT¾ÁàÜ0•Õ¯H¹ÑàWR¤òê9 „k©‡§ñtœSо`{ ]Î#RÔ«˜I½DÅ sRÿüxºÍ´¹³ÉÊ[dê-ü&Òy‘O}þ¹NÂuÈøÑû¨B–AŠó::ª—n¡6|•6›¶pý,ÈûÒ-x¡3Ia)ËP½2q¸ ò]O–Ò.:¸'>°–xÆ‚£ÔJH sâãñ ’xªŠå)^þ+ùæ£HØ«Ómq¼«õ`ÏpwŠfŒŒîX镎‰Ìu`•u ÌI}jÇð!xòÙûpÕå¦\űþ1Ÿ‹{äÀg{‹„Û1heÛÎk儤'ÌØùCǶCï÷ : ÿ9A«þ$Ê$Ô9Ó–µ„<òÂÿAFƒ{¾®[üsL&å²9AO˜}…bs>¸É#Ãtâ¸ôOwDñÎD¼ùäøÏ‡Í¯Ô@|èp•,?l.!É#pùï~¢Q©^Ô¾o7á?³{'˜ý÷ú2þ Ç{¢‰úE_Ãw‚|ä‹ãT§Aá¿|¶/¥É»ÿƒþ¿y¶îö:DŒ›>&IT‰å?bf|à§mè:0x¿Æ¢žY ª¢E\¹rYÍðiÌ?|ù8ø2·õÏìÎ' ËTJÔ*}ʾ»9‹ÎNE1ÁLG@àûÈÏK¿¨¨†ÚÓh#Á«š’ñ!Ll–¬CkI`„Æm(Nûw,a¤­ÐõDÍQccižô³5Û‘ز/FB`ŒJ“¡†4˜5 éÕ·Û®iá«êÁ¥oé§-òÏa˜äé14Úz0„°?F{Æä‘‡‘GÂÉ àÆ ‰ÌàÞŒJ½;¤aï,Ë9æô04™‘ÐÇ ÜØ+ÉŸÒ¨ïy@u(ÙtuŠŠfÌJ#Ï€qÿÓȧö¼…^Öºº¹¯ ¸wÐ\•/¦ìê-¤èȉn7ðäÓ8o-%%Á8¸-HÓ± +ÆÑG§sifèþUFbßfa Ÿ­ðÿ(±_“¼èÙ²´u¶í8ÝK~ÕÐôM¨»3ZÉÉZ£~«½¹ã]CoY•Et )È3r€ fׂƒœdÌRo*7ˆæ×éD)ƾҽ›Žndÿd]û,í]Tí’ƒáÖY-•Ê«jáV»:ÓÐ{qô—c¬Éó„9¥Û±¯¹=l·1|:¡t„ô[Î"!»ŒõØÚ6î첿LÅq`̘ÈÚAǬ–ÌÙ®J{ßɹdžý—_ñÊꢔ?>xÚÚ~oÝ-„eaâ½Ån÷Å€O n ¶Æg¿Ô¢Ü´Ìj"Ò¯Ž#¼Ø?ž!°ÖÁrY8g5'k@Uëi.cuš¬ÄAuÁF'ÉÁœ0ÇekaŒ€Ý‡ÊÌÅ3Ú[ëÎp¬üÕ•–á Mdt-`ëLšc/ÔÁšºÚ/›=’®ˆr§Àx°4›Y!AÔ¨´$N}Å•Äì”–Ðys%Î…¢94åÖÔ·j&„çªÄ8è,¤ ]ºrçfðƒ¯´1çl “ú÷2¦ô÷ªÌÃ%yúÖÈÖ “˜« dµñ(o~‘PÞñEÊ׊1”(mAmWñ&H¢ýnâK^ÃûÁÜ•Õ9pàr²ÛÞó gñÌ£„@pJ,ޱ;0únQåôjI{GÒ¬hâBIõÕÛKÉ(úROè_2F¬û<òœœÓŒÒX—¾(l™a~ŸÏ'ƒÎ‰`yEÙwÔ\!½De‚jŽ. àY)=-¿÷h_haNÎÉ3ºïíÒúmDÃXõíåÍFí$£Y‰ÿºÐÂxmyöÂ?­¬pø Æ},ÌÀt)ÀL1\´ :Ì«Kb:À°‰Ú?sâo£p¨4 ÿÒy΢d ¨Õ4G\üšà+µÞ TŠÈ s¼  Ž…:¹FØÏ.Øa‰ª_ª’ Ï~ÌÐy͸ܵý< ¨d|ÐZ*«ö9/'¸æïι½mxÜOÌú¦=¥ÞúuU p½ÿð…¤Ü÷2 (K½UžùÁ#‰à3#àÚMÅ7CItÏT[ãØ{ãðÜß«G–íA?´[:ôã“´\{ A»S¿b$Ô:®íƒ[Ç*šNÆ *%4‰ãC½1ÅÑëHn©Š¢Á¶m ›t¹²"lÎò62¤Ç Y{*UT|ÒÀÞR?KÈÀú©JËœ:ݶðèÎnœ ¨Ÿ’ôDÿ˜mWlfu Æì˜†eÀ¥^KÈ/ªÒ!óU#pÌ?§W œÖ ¬_8£]"¯Y<™w¼,šqÚ¨ Y`Â¥‚”ÐíÚY’3^ȤÄ}±`mØ)X—¼ãtj€ÈaÑ¥OèúðË¦Õˆ•zšµ' ª fÍ“Ó!‡»W]U²ßÒ6È£/vŒ#1÷¤9xë¶S]²ëƒ²i†WˆÉ/¶œ z dåŹRÐäâªÓ§À¶•! t«ÔìÌoö8•C½*o^§No*,Ï 9,„Ý×oeç Û‘§«2+[¾W¾z€’G-‚ÖFJMýG¬Ø ÆC](2p…جð()µ‚N\®œÊ?âu¥Æ¸"›¾¿—>ym“ÁÂÜ/*:H:'ê„™®vèLT § Û:û“%M¾  ×NÜ[D/ä–h ct^qHuHèà+ëbqã›c$°l^0a¸Ã̹²À5Ëñ„°bõ¥­GÕÂR OÍrGS©(osëýŤó/^£¤.Ôy²ÙŘwü˜ûJÌÀÇùÚÁ½ù[d¨ÅÌ… [”2/5|×yÿ]sT@Iâ”ï:|—ië #‚…+°z]¦D?™ƒlpö²Î4 ÿÍÍ Œ¢ÕÖm[¡a¥x {µ½*ÝÓtþ½4ŒÌ¼ò>Ðíx~óûUÞp‡®>âH]-¯?éNS·CûôÇÇ±Ñ²Šƒ£SüØÅp>îé}!áÛ¶íí±akõƒätžãŸ!¯¥Æh@o¬ ÏOªÞã>ŸòÇ>÷_<ðø?ÂZ¡±ýGë‰_µÂ3Q©ºð$é}@k5·nѺýA@Ê(­„®cÖõžªfË#«ðLAz`LmØncÆIý7´é`°¡3= OLÿ&Åå’|©ý¡aT¡Â— Y…ñ÷N{îB3Èh¥×k³`~ ¶Ü¡SÒ#ÁiŽ1AJz!b(ÛÓÝýÇk;*ë;ÇŽ¹D•„Û=4^ )3WdØi Ÿm™U ¦wô…° …jÐýèôJ϶†á‹|ѨFä)²m§i_èâÀí74ºüÖ ÌŒ× å±Ç”É(‡D£íØS#ýGG†<Éþ„b~Ru zSÑ/ õ7ä(’t’… ZaR±¦QmÆ–ºÚWè¶û—z?Ü!ý‹­w4(lš­K\RÅ/gÎ-l²£(fÛÇNÖU•—öÜcÈ1wa­Yc1!²{Â…Y^ð¸‘Iõ¥+ áÎËÍ6†:, 'cÉè["?&=åÈ gÙ“pHú{ aœû Š.œÙGý)!dÊÃÀ“ÞÎ$½¼7…Ò4§r9·t’?gu$4´ù½Š¥`qäuÖx9»­æ„1×ÒVÜmÞ ex¶:S4=ÕaVÈ­:áéÞœðoU¶¥ÇIËãP®ŒÜQ ÌP0椥k- IœxÄ( Jd¦ –ÞÒŸA;q½zÌÉdO ì5íFäNfë*¸Y(°&HÒ}â"^"$ø'kB …PJ÷nËü(NÚ;9OífÓKeHxû} •Èt.aWE0Ø®jw÷J–¨t-„–‚qÇÑxξ%v¦”|u¹Ü§à/:FZ9ÒR÷ñž mÙKÜ7…œéÐÇMþ¹ÜÕßÞ+šMCÎÞò;\tÓràŠq p¥Cg=m¬÷è­±v”.çd#R© K¨š¯:cN%”Ï×ã´>ôvñ~Å©•R‚¬4pÜ…ÇäÇÃmÓ×Üx´6QϾRÕѧ¢xÊ ä¬$ï_ ”O+ÁMÑÍì’Lz$¢ì½F̸¶,ɲ¼˜Z«ú ðŠƒ¤©7Ù&ÌÉиn±ãd¦{mRþÏ %ÎÌFû~ùì„tþÄ™N¨xYbN^{qS/ï¸âÜtÔÆš/뇅ˆÎ ÎòAÝ‘ïÅ$M€á,Ð3ÚÎ-uBα3‚/í€ (xŠc˜âM®yƯßœi*†;ê]wÉ×ËÂR&m e»ÏUKÛÑݹ–'e% ±-3( qi¹¼!›)ž+âÉÚ\VCi°ÃÅK‡ÌYÔ—k_“Î ¤‘ã‡æûã›XÜF·¾ßGïÀc"j¯Ÿaæéä!´¥‰¤ö–ö°=°AES覂Î.pàPz¬1]FcBÝ&×–ej“yjIhçSáotdHbz@ºè2ÇŽšá´:¿çS ƒÎ;Žé{‚Æ6em˜ÉÖB‚í›ÍGV´°½õFã-Ø£ã–ËðÃÁ *SàXîuÞÑ,\J ÿuâ ‰ab›-R®z5I¼e-´1q{Nnl½Ù* îx¥ &Gj…bHG Ìh ”ÿ„5Ûï|XN<¬G‰ì‰& ѵÆùì†N[CqKkª¬ü,\¢Qu 0Q¥Ùꊉ߄cI#ÝÄ"¤âGØ ñWVYòIòÌ&ñÀÙ2o¼çÕ 'ló›µ±G02I ¦)bLq¶ö¤È‚,IžK÷#˰51*O²T†â­å‰';"8¸™Ç ˜—C…b¹(DÇ„'ΰkaEÊ:3G–:].>N– µžó `ûF¸¿æú¢XVóüÓ#&†ºCq2$i¨|ÞSkž$0\MD³vøêZlÏYxžq€ÀåK¡jJ´Ò°ëÚ{×0-Ÿä°«Éjf†BkØ£Ûï]xÛk0³é©(• œÐ3Õ¤ØJ¶Ë^be™qÐ뻚mº@³D†:êk¥",ÊóhQ"r­(øG.!c‡×Ù¶-½³@©•Ô¾8GW§^c»*Àhb‚1h!(CêhÒ'–òÈÞ§[ÀQÇÅ "XðÅGù^p"OçL[pÓÇ|ØdÃúu5Ê2ø„ ˆsËàÐÿ4ÆÜ ‡Üê,pœ¬Ûøâ€tžE¦ÃÂ71¨Íå@n «\M#h ]øêäo”U €ù¯¼øïw– €ŸÄW±P¥²ìÈ/Cÿs<¨ »Ì‡ÑÊÅ’”m´RXÓõ z?cÀä"a±è>¹*z¤AÚcÂ’ŒTÆ>i”ñrÚ¶XƇV¨Ô?:l¥o D³li£w$–¦Òk "Ø6lÛ¶mÛþ§ø£Ÿ¹·•?ÞÏ"çå+½¶±×ù}•'^¬ŸÄk?¾é&Žv•ͺ@Ò~âóטý¿×ÛϨŸ}Wø›Ÿ¿×ßëïõ®0ðègÇuì•ò¿0êþ[{ÿ$’vø óÄúÛ®nÒ#[0ºvwZ“^”M`TD‰a ·öŠ%¡=.e”À1C3"´=Ìö·Fæ4¶qkf”ÑŽÜ® Õ×ã¤lÆ0¡¬’ÈcvŸÇ;ÙŸª^ÓuŒªlfÕ¡,‹Lù*™øÑ!tý”aUÁ ÈÒ:é¤Ï¾À±j9ØŠÕ{za™üU ÊÓ*ª£Éòªüú(’n¹{ÔªºÖz'ØQê—Ç3î”G{÷ž0àÓpÞsÔ‘­î‰~bö?L"äÓ8{‰ Ýq  ŽÐbW#°Ý^=ëMbS-úÏÞ«ÙÑ{¨}G“U(Öi²¢ŠM!"Ø6<À6( ”1yŽo«p\»,1™QH;ÌKb¢ FÌä˜/en+Ž„^®Ž‚ÁŸ(¡¿$ð8(Ž"šgôEKD‹ç"2;}ñS1v¥ ù5Å9<“ë{ÔíˆPåÊû[ž¦C¹³Z±­Ó¡nl0êvñH2î™ ‡Y1ÔµSY<.ŠæÍ²•+±Cbå5q×Ó.4Fí¤–¼™êi©<4Ù«½je™Ò‰x£÷ëLeµn oÞVˆ*ÄÏèøŽ…8-±#5P©$* ‹-åOæP}V ßÈÕá?­±éÝ NDµá¬X´¼®I“’ [áUk)ËN™" ×<ûº[È#¦jçÔê$Ã:]ܽbOöÓî÷›5_I±Ã´©|b[ ‹üø„œÃufxz °=Dz „ îà$Bì%Žð'-xŸF¡ïL\S WÆotuL#rQ!Áp"¨æÕ’†;ãH›Ô«vr¤æ¸Õ²ú¯<Û Ö>Ï‹4Ö}Ÿ &KÑÆáŠî{M®«¶¾‰Ýœ½ùt7¹‚ÓØÑ}?Ýyq&îDºõ81k"qôÑWnãûÉœ¬ït*.騿lÇšm㢵{`´BU_¯9wÎðA%2ß«ý^B#V‡Žs×û÷; Rð¦qc?aÛ7º¾¸þp<؃5XgÊó™8Ø÷¼Þ ŽI4ÿ,Òùi9Ÿõ8//¡u#Û˜œ¹¼ô½ÎšMŒ’Ë”5`îF*"éÛMvk)L×[ff;õ¿ÿØG¥-Öê\Ñdà „^å5% ÅRP’}1'ë<í\`7›!˜ñg_\k:çø2e!&èÊû_&~Ê:°J ä†+Y¢_ÌŽ‚fñ)ãNFƒÛ1œ„‡ä¯®‘'wðžôàMré`â·,øýiYFÜ£*Ο Îô7¨Y±ò*´‡.ºÍ%:2!Û®a0@6>bŽ';@× -²skV•³ …Øö†uÒe ŸÂ^üÿmÛ—ýV5j¡Ø1…)U¬‚r0¬9j–,Q:?Ax ]ê 1Bû‹†bO˜ÓTÓ­oì)»ØÑç:]ý œO:·ëÅ=òîrns‚ìï •‡¡dv»ÐŸV…æ ƒ˜þÞLByƒˆ˜¦“9ðî·C¯iÜ=I:^˜¶9søÊF8”/OmDÉczb€Õ‘Š:¥1ŒEéqh`$¬<[¾ž0J?0‘? ‚K—ȇš)àÅ´U‰7•¡!rÈ{_J.Ä0;©44P)‹\BÑ`j`@vÚS­qñ„ bé©T¶HqêÙc$‘#ÙÚqê5À„›q[Ñ@Ôå|;v7Ù4I%0€œ³‹§Ž®J–šºˆXÁÊr9 §Œ–Ïnç‚>¡i8DBÄEc?Pyà æ´é9îÝW& ¼´Œiiêô ›˜R?A:ÿÄäþPŒú8x FéÍÔܯÆÕ#Öh·Õ®cø¸ôjœ{BWó@OkÅ4ï(ŽÊš1†0¬@Õý»|kl ±‹Ê;ÉÛ E´àœþ*0–:éyel²= a+ô? )C¥—§VJÚÂ0~_–ãk`^D’Bb)ë 3I€x×}Jy]"² œo{ŒÕG]~H8©ÑƒÌ`ïå»B” ö¾µ[QÊ€[ýŸ¡ºW@ü³§fŠÁÍ!9YËq®ÝvÓΣ®êíëREÍêô‚YšêRî$›ÁA9ືA«sfƒ&ŽëÌ¡™Q·.åÒÊçm@Æ81;uRiÍ;3UÈf¹AÔ¼GÑ€m;h{f£"OLrJÄs–šóz’²Z¯ÓVén愾®‹¥G^£Æ›.RÜ­ò6%½„§Vg·ž²a۶Ƕ=°m=¤ð¶© $ÞLýN®_ìí»…§µ—Ùs|º)eŠó&_šÀ’<“v¹t^h6 ¥÷†ßr°ç×áÝ+üüãîÛ6r;ú÷ºìЦðoÙÕ€|ñþ¹œ¯X£3IÄêyÉì|ï­cyôNº@ùe,)?!.®:΃öTîýÓXl8ÈSñ‹lw"ûòrÿ™´B.GøƒgñT ú‰~ȃ|ˤÛ~ÁóV…Ï2åsœÙpÁÿ‡Ñ'šŠ}àÄM,bU·èECVßik~.éü>ÈxóÌoºµwØy÷yC>àKf-Üà‡ ÷ƒôéÌ UÔ[ìIO¿CÕ¾‰Pa4 ÷Â8ê]ékÒÆ…  ¾|J)NÃRa˦ƒ–߯œƒúI4 P¯Ñƒ×ØÖ…SöСªÖuz¥Kšˆ:J¦œŽ^‚5Ó°Ã<øAåSIiPÒ‘È€™:¨q¯nUY7Dž¶¾â‰œ¯¥ô³ª~Žúˆ^Ê>•;ƒ |rƒ%¶ Y` i ªŠ;­'¬I~Dí ?.,sÑsM¨½?bTÔŠ=Ž­üÛc½ð?Œs¿¯NaÙÓ1Z}lZ11 ïí ãVXºA°mÀl! ÆDfõÄy5¥Ár ¾xœè}%qiÚ¤8iAªâlœD¨;)L2Šc06m»¬Kâ@±³YÕÕל @ÞpÙé†ÞÅQ¼óT^êž;& €ÄΟÅ=n`à+iV| ¥Z¿/¦ûü ¿X?“c-y½ΑEd ”»îuÐrvø½ÓOÂrCâ‹8¡Å­NÁZL£Ñn…Mõqx6›6Ï+†`úrÊZ})˜àLg~é$ÝÜc·zOºUm:4¸¼_YE¸¾’^\À´ÅlíðI+ÃÊ~PçHAùŒ<æÓg'_VŸ™³tŠCÿ„Ùr×´/2ï@)`§Lê  Ð…·|%D<¥@ú¢aŸ_®‡ˆ€Xíß7B¡%? ßÒ‘”(Ý>Ñ£Ô°˜LrjOÎèë.Õhg1ß»Q1u`u"˜ýÁªË~Júnº(°Õ ®Ñj}RÈ ±G}öúÇù99€w-›õëð¨è3<¾§hñg-jÎN¹Î ò…çÀŒ}åeÜVøš:ÊÍSO§F—ÉRŽ0ìRC /guWVâ”à ôìíóO#œ ì¸zt¶³Éã?“±ä©ùªÝЖ0•ìÆ”c6mÌ"åôÜ—†Ä•©²§mG{Û¥ÂVHù8`?fþyDÛºœlOq½È<LjU„2“žL §–:€T,LS'Š3x¥IêŒs(’ÁùŸ~!'ÍŸ{ˆ'rB˜µž ~¯§Ïè)0a5LÜÑfy¶ lÐüè·Í‘9]óÎãØ±ì ÂØ(úN.ˆÔ9$oiˆó%Š* x; ÔÝmû¾æÐÏPÍç¢y‘RMBëõ¨,ÊÚŽLÆþüjÜŽD¶íÇcÛÝ(±°ŠÙ”z \õT¸ö.ÀFæÕ:áʹ”S¨Ë x Ø;£wž© ôN“‘´Q¤MtÛPTS}òá¨/‚™ÈøÆ"q@›^ˆäSTn´µ¾xWËmèöí!¡zLöXÖÏ`pKµL´Q0®¹£ c£D­EìˆÙüJôô¡°0ÛCMCDÙŒ¾EjÞí¬™#2µÐçgà¾sgÎAžª\^V±KÉøÃC÷®&é`Äã˜ÛŽv%”€wßúRF½Í ÷µk$Iç€qÐ8)wxÁ(uÓd‘¼šæÔßÇIãjˤ×Ô¾\tgUûŒ+îp+O±YñXÓ±€ ɸЖ°È•G8çPÌZô½u‚Ñ5 =‰‡¦Ù,d}-›„½+Ýê@$j~¹ŒÖ#@ѹHË<{$è· r%}aÏ›ÄólƉnÑYJQš­¯,‘¸’}´.þ.&D4+´{ƾ´MŽ:NåÐ!ž9ÃŽÒfË×Ì' Ýnâ\*ù`QïY駦Þf’äS>J*ò|=CW±¶¾TÞqý¶ ¸Èµìc Wý:  ¿×¯|Q®ës1ÔxFÚ+BЬþÖ˜œÅäÎÖ³ÞœtޣѴq ŠúÍžÖüE±²}Jyw¤<ï´KݘƒÒñ*ë'­Ûm¨£yþb”mΞ‡<¨ÿá_.ªZL—_îŸ)WÐàû·Ê}î9¼ðÛ7îtÉÖܵ½Ÿ&D38WsÐ ¶F9€>œÀËÕ€×qùú&Ûl" Œyy§(ÿMÞ ?ŠÓgä• €OºAø¥¶¸ÖðN[t%àŸ„OíØ/Oô°þ±ÊjÞ±>DVu¸ìkª•ÿ¯Sß`6FNè3oQóª†jðÖþñ÷&9#_þ¤zŸµ¥_Ç}aÀ§Ÿ¬¼QÆx’*¨hÕž|ƒw[üÛ ø2c;Gÿ_Øæx Ó黽Øo'ÿÁUÅ‡|éž´i¢·l|Â>Òš"Àü 9Åv4'çZ°wRIpV™+AÂç¦Ýx×âü¤óo1Â?È{>²J8=¹?ÛìÜšâ\QiãžH¤ŒDPù¨ Æ‚ &qyg»#Ê +gª£mzSßÐI¿¾Á5ï-.6·½I44e"1í¾¦ÀVëÉÒšŽQôp¼ß°ËÜZ6±ØßÌÌNoÃ)¿u;X“ö4õwôŠ~-G h)s;»ÍTìšM¬Çž×m%vI‘vÖÂ4#ÍQÓÁ!uÒóöýGQí}|ˆ¦'ê1ޝÚK1Ç÷Z½„½€”M jØUCõ˜C¯„ýJÏÞЯ;¨^z±VëQ8þ§ë‹z©¨«šºý4ß¶ã*{íÆöÀ¶5b¨›ð¿Î†¨ZnXfæK6ü$Ö¼ÐgBÒmÊe £*¨Y‰÷¸dX_ ÞyÂq3Á:yU­Á§Ì 3éã}l­zŠËø%Ö¬ñ’ß±0IìZ›g¢ÎµE¿ ˜ "η4FõØ«±Êbb.È °rÞèCa–°¢>ßSÇqPâ[AÆà9”‡Ïºg¥ÆuY­Ô‚†0„b°~!«Àð•_sÇTqBù³S(¦ûJ±·Ñt—ÀÁ¸<£}z“‹Õš¯ oƒÖ‡9áO! kK?™øv`ím©ÉõjuÐÀ-ñf`t;àgÚØp´°GÒòÒï5ÿ õú ݽ™OÍLê€.‡‚ïÝéùÍ>îWQïk²÷î×!Ô©¼…~’¸ý u 0µ²À¢¹õt=–)`qm96 ×Ã÷m»òŸ&OZòS÷1ŽÞ4¦ýØ~°ºÔ¬Tg‹\+Lq|eöv¦Ô¬•ãÜæå3ß—1{2Ø-›¤©ôÓ\Ÿ’ Üù‰¹AJPi‡æce˜ÃªÀ×]$wàî´Ú_­¯Ó .W¶ª¤GÉ:m}$®íeƒ ôcÃw ώᤩj0¸úÀÍw’ºvŠ™M.É‹ætOPßTät]Ç«sp ¶Û´ÎÁ™ñäI]àç‰H)Ãuj:…´'¿Zl}fÈUû hÌ­º3$7£èz²ƒ2ƒl:Ÿ4y@XÒŒžJÕ‘³s1Ù#v(ótÏÄVÕžþáÂБ·Tffçß"Ç ȂÉem^Á‘Ðû£;ØŽš4%½RÍo¥1›ÚžäçÅY"°Ø†KUÓ+é.­(…²N|ã‹ÿB×ôkOõûªn} ^ð\Yà®Ê´ÛveÕ‰nõJ†‡Åpm€@ÃÔŸæ#Æ5Ït/yPîqÐöÛÂý¹£“#+ãÁ$åâÐK Ó-É‚ÑÀ‹À‰i®PœïÌôX²èžðç± €ÍSk›uTÇFŠéžJ³þ×ÄC.d`omˆy{òº\C½q[¬ž +oSѰ’(vuÐgßé²I™îê¹"›M¡¬}Ïdê°¢dJ&$¯ù âö*ääyóuÂkKùöiPk"™½åŸ9ùicoø±š’¸\І#ºF@‘^‚Ÿœ‰eÒê7u/:»1”d‘_·œ®ƒ2'Msqœä¼H; Ë¾<&áX:a«\E«ñ'¢)Å7œ-ò•RÙ å}ß§Ü°ï°æŸ-æš¹`¾ qA4[›¶Ûnf®#·ùë¼q¦Öü„5“‚@¾Ü€óSøµ“}¶Z¬Ô2´î×¹Û êJ¯¢+âà £÷yý‹ÿ6é¼®DaPô%,œÇ€Ì«7£´lÞš2iáõ±âàÕ1=“))²ÝüÛܿﰰºÎ1ªWœé¼xuËÊ2:ìXÕÚ«VöªŠkø‹‘â'ÎÓâé×í6rmÑPÐûl©*ø¦T‰¨¹aå·’)q¬níБS j»Ÿ^•gÕj1’áF»þ)^l2Ô%Óüûè8„…a+wpÐ\º:VàË %·’f»Ø• ¡u lذaÛ•~w÷í(2ƒfÿšáÔa^ÙÿF]9o'U‹*F©kb§¾"991]ß©{ì%8; ûë(ë¼ìL„f›o°©.a¬ …wü”—ÌÓwo?é{œ±À?uÛ_u¿£0SOkÏ÷Uu!}Eå.-ZH4S¾Åú·§êÇÞ«aæožôôwÚ´qö/é±–Â…VÛœ_†þ¿ÝÒO¢ß‹„‚”@W­×ù—pŠÜêËÆøÄÍ"¯ÔOøIYÉüZãs°ÿE„QƒDXë°Y7õ«‰S~åÞëþóóV{v.¾‘¤¦Ó,~Ú#àìø‹a/>s*ƒ1å•¥õÞòÿÙ·üˤóŸy(}QñMlÖ›t5o1ÝÐíý+ªÑû? Ø$5‹àÈá|¸.|¶¾ï= M èý’´RÊ®»¬ 5ê {²-û‚Ö)g,]nl'lòëðE½+ôÿ宕5éüŠh`<~o÷K¿¡ÔÌI‚»£émÎoÝ“ö!JàzêâCЦ“çÁ?á‰< ¦ ÿ/Xûg:„w9d5 Ø¿êVî¿SÞ6ø’lXÀ;_«Øˆ;œp ug ÎdKγ-5Ú(ͬa|ÑzPŠhB*uéõè»·ÜæbAêšùÌ‘œǧ8]^4ÚŸ ¾ž‰Š÷é$Š3¾¢2õÉMFÑ\þp]PÒ2àpöN}èØ\¢G”pìNzk8´ÓDå̸ÝjkCÒžÉ"RW¹˜dtæÊÆÑQåBà]ž†Ö‡UaH¢’ØJ9ŸÕ×¥2¿Š}‡¬lɶEJ^³Ðð'OIœ~ ðà7i3eÒ”pȃ9>«@‡ÄŠŠáP¡LBoGÍ &vÓáø:"‚<Çò>* ±P\¬a=ê¦X¤°)Ó¯‚jæ¥âØ f¡×‚­¼>•gqD²¼;ÚT£Ï#â9FßéžÔŽmiÍ"5Ê4-Çå°xƒ»$ÂÁïGñÿx‡­ïnpÕóAZo¡ôêéžnÒªQÑFXØ¢øãœ›~¹Ÿ éàÁtÒtš…Ç>ü¨Zœ,sιÛÐ4*0@Ê~„ƒ+Ú 5Ô‹0=È äý=¤ó2ëúµi¢ü’΢op‹¼Úä*~§fAâ®x ý_?!Ë~Uû…$å-bÇøä+8ßÕpž°ä[6ïLô¤oN1ÍYjªìÚÏ­5¸3×9;’‚f¦ÃÊß-xjm CÏ4ŒÞÚJjÎ*ÎQPn¸zˆ„.<.Íqæ)X 7🤅$ðTb[˜êÛˆDB$WŸ×qÓ:£"@B÷lÛcÃc{<Ž^Óéà’0DiÍ{ŽÎÎYûؤÜ·JŠøæ¨rF`¾¸˜êd åU±Ò+¤C7a†ç áŸªø2yÐ •²É°IÙÌ„ uÆØ\kHo”AÂ8{š®šÞEëéȸÏ[¯-eê4Ï„•+ñcV2Тsí<±OFÿœ¨@àœ¾6 0(Y‡>®œtÈt:J":÷’É-B¹¼ôË›ü=†Nî¾kz‘¤aî®ñ,©µz%LÇZƒ×ª2ùº˜n(ÅÄAFßb¹@:±¸2ª¯{Y˜ÌÁ—ZTñb­1ËÍ¥ Ey_¦N•óý,¥ÇI"ñÜý%Æ ÛŸu `a¾-YΠšÊhxÜd‘ÓÂK§¼r×:’ŸÈWn¡uã )©nT¡€9{I¹þ0¿æÿA§w«åòÒ÷ÖŒ!ÇoÁ1\Þœ$Mú±]cx}Šû'^‡Ì`5ô¯—î^êHœé€â=;óûAq6£ X#KÄ*¥ZÉ;Îo,öLaM'S¬or1§¸à®±ðN£]ν0­g[÷V” l_¶Î3Ïêäý8mR–´Äm{Ⱥ M[[ l›<ŸKßx†<­ø9¿t~œq\yû¢©ÈTÂÐýÖFÑ7¾>|ˆælûë+E…¸¸¹Ò>Ù_Ô5µó'½?FÃÂæz ãóœf\ý&.òAf²¥â%GL¨Õ[Æ¿CÒÌ1õ+ɲgdªo¢‹+pÀSZGCE£Ìx€íöD„®Ò£_myö„î{𡡸1?ÔÙiå&Ó´gc Ò+»ØP{~'ÿ ³nè*xÀ†möÉvdC²²FèiæÍ4A¯—/š‘FëÃe¾ìyŽêæîþ%ÆÓëÖSù¬ñ¥%ŒÉÿgïÚÇq%JÝÿÿÇëÚ‹$®%Ëé$c9³=G–xP5º NeZ¬ºä¥˜1pS”ø/†Å7¿î¡gû’çü¸DŸë‡_ü{~®qÙÞéúá:L@H&j´>øÍGàzîÿÚšù-/r’~®ï2SãXu] ËÎwŠÙÿ']“ÏõmòÍ$WŸë[î^Õ6™ëL—gŽð4O ¤hÄÂ$+$B§Ð€¿ö5FÙ†P<\×>VáBÛÅÖ²ö0BAãÐ(Q,ŠSäÉúÉGºÊYtŒSö†¾¢UÀPôÄŸ+æˆ}’U´sz€©>yø2xUkP"'SºV¦•‹Ikm¿ËÖ@pÔŸñßbjfÀ»d}.ã5:ƒ"òx@ðx­ÚwOPì(¦£(HÄø6£NÕZ¹ž÷Þk½¬"TK läC2m_6i_ó¤ˆ<¨ A×Ý[–†î!„§VîÞR8ØšÚ °$ú²°Mn}Én‚6ƒƒë¨Ñ>kC•4€éËB‡ìmñüûoÌhçýß'Ý—JÄMZ3šv•Š.U›Xc•3DRÏí×§îÆ À®Ù4ýèê¯á÷ƒ§Ta}kÉ´”®P£¼ë„dïPaçëPt8ºéÃ(C(6”Ñ ¢ª ÕKY+ªJÜÐï0ŸÐœ!mí†M·sZ‡Vm%»À~ò@“ °Ïo4­ €å&ðsfÚ tužU7¼Žšc¥›=˜–ö G„Ã4%ìÅ6ÝdÛÕÐ)’¤ý7ãÂÑ~„¤'#j·…bÆŽ}üÅ/¤$Œõv˜u Œ~vÓí‹L3ÉòÎÕËq8EJúÌ9³"婉:ˆ ÑnŽ:¯àÄ-éÐ1Ñ­k5$U7FÈË©c7J 6¦6¶¢ÀÒ5y‹Áú•Ž*•Æ©ëwʆ‚ûÑp#Á5»»´’#tf? ¥(6ú«¥÷5ëF—s«wœÆNˆoM胤RÿZ'¥¯tQš$Œt Àr¡ˆÜŒÌ4™o.ê“(˜}÷•& ¼ 7­Ã1˜B”gˆÙFUai0ˆ–ã®’°Ïøª*Pÿ# ËÈœŸ½`ˆ`Í-‡U‹ Į̀Ã3a‹Äj˨[¸n‚×pKO$¶~·Xé¡låI‘"dÜ {¥yÚõË8©8F¶aŸ5Vƒ`ÀÙoPÓKªùDrÆG¬èç24i5ñÇŒÁ¹äî@ã|´¸¡äžr³P2³†Òl˜¶&Xû®ÃyûØJ·¥vkT;d$î瑡룩Ã?¶Þq0­¦·ëmº_- \¥YQ¢¨;èŽìˆ”qÖö7jø>†YÞB›îQ È~̦3‡¦¶ jÖ}[öMŽí:#ƒ¥åä?‚K@RET¤òÜZFÐ0ù”./^‘áÕ4uÃ\) ±—5vs£Z{õÁ¼MÿÒyÆï›sú!³7Qœ«RÚé[‹½Òžãò 0&ÖwXB÷Oðtj&­¨%.¹\pHF€|[Éäû;XI¾¿± ¨Î¸¨òŽ_¸àqßýey~±°:Žœæptü;T¼8õ”%ê¦ð)Û ‘Ó áºó²ðc+(cr} ftž‹Ð±Pt* ¿GÎ!†IÖÐ{‰ž;†cjc^½{0§X²®Ÿ¬žHœEOC6%`º7œüÞk¶¬Ô¤ÀòWÂy š#h°¡ 2_…¦#cncL×^ràPÍ]•Ì¿3  ˆ/'K´¥'¼ðÈ\΄ #m†5¯ï'Í(åaÇ1²Œ*¬±„Áµ "vÀ²à‡4ÀÎO·¬3X؈Ñ3ÍòšîÇó%?KM©?ŸÅýg)„iTÏ5U›¨ ³ŒŸ­¥Pfòjt.P®)JkaäïèO"˜:2úCÓ…kÄ%faÜb}^·SŽë;Þ?ýÆš4³ÕãñiÁKÁ<—Q\¦;Ô†¯—Ý÷|PŽB:aÄïkGÕ]@2Ú%ýgÎç¡[詹fÛ˜ŸÒ™M<$T$ª’;¥'w¼ˆ6]óû†B$Ö^ÍÙÇcñ¼XÝ@é¯[cžï_¬ÄÙöµwèÿ4Òy÷¥¼dÖY)uÎK<Ñ>Wzý½nBxÅܬÆLo¼è tO™lïé߆„óŸüêùo bk´]Ö}µJ¿ŒFØëZÿ¤Y&XE«Ž§~àPL¢Ò™ \ ç.¼.BʆœìÏ¢ìÐ?ÖPÍm^?öÿ"Iy$ .Ò+­®!ÐdÒÚª·´2á£Àžq¤V¨ÉÏ¥‘´?Ù~þ`û³mµ€—x‚W›3Á¤–þQ¾›g6OévpÙ´Yo:¬žbEà æ÷›©óÆg“ß{ñëmòçú\Ÿës}®oxmÛ–†ª<êùß}R~®ß¼ì?K÷§^Až¶îC“ò¹~á®øPýöˆ½J<N)$¹;‡¤KLXÆD¸Q³[IàqÖÒÑ>SþúßNŸZ8PÔ ‰—n±Ö\à­”%¤„ò²B *:Çôñ$‹9'JÒÂîæ5f´4` ô gŒ‰‡¯ý¶()† ”9þ&KKÿ•µIå²jqª÷Wè¸)ܱëI ÁDùÐz<ÕhºFÄQ$ôÐð>£nGDB‡€­à¡?£#ªé7ðPô&ŠÍ` Õ¾ʺ*[ÿÜkh$7úõl ]#ÀáYr˜9 vnŸž9„JOV‹GøMQkðÉÔuŸ5ÄÔyxÚjâÞWGv©­f°LÑæ^É£º–;‹âÚÓY¦öpªp§øÙ6l¶í”ó׋q1&ŸžéIQE;…Áþdn˜R†¤ë¶à ƒEõ{‚Ne¡–8ªõf”\bú•05´x/­–¯bÝŒmŸ¦’º^_À +VTóËþ_Oõ¢Íö®,鹇ZRg›|}N¢qÒl±ðßYÃ(LÙ¥V¼/$¦}­YQkKK#ŸV˶úR[û,)h aÀí#“ds³éW÷žî¦Ã¶N¥ú¹P°,Æ’¤K¦̰à¨;ŸM_^p|–‡9=IÝ(CÊÊ ÉDg_“ñ©¯ÆëÐN%Scyx€Cp¡ÓJz®ºl3ñÌi"Š·Ñ­.ë/š"2{6ÒÒ»+<\| ò(§ðßuÃÖeÒÝ."”ú%YŠ« ½;‡¾ÑNû7T–Í“msc0;˜›Äáøàvzô["&¨™²B•PIkÖ¼&½¨xuìN8× Úa…ö=tøû©QÊ£²ÄJR¦íë»ÏLtÉ P¼ÌÉýq•}œ¼c1çN žÆê±° Šú‡¶<§«=½P•´©-fa²2€ë…ñTncù-zÅjz™œîƒGkIýtˆ¨ 7>õyq¼#™ÄÊEI3l/áa—Žž±r 5m…C¯ô·ýÈŠvêIw–ÌobÐrĆIƒÏž+ýF(:ÌÖ@?Ee)|tÜ‹[âp3ìðÞµ£.£FÁÝïœÒ+m¦Qö9ÙûmÏc¹Ý6žà¦#FÙ QœM†÷¿C:-x)n†3­!ðô©è' ʧ•×>lˆý±êè„ŵ‘DÔ<…Öoï&œ4$^±lR2Hä¡Ú8N!6“)ÝèLùøà«™—Áì:×:ɃM]Rý¾ e„ ÂC£œ1Ìk¯ëLýë;~M§"45€Òv¸æ–á»8Òóö7[in tÈœ?Ò˜CƒOB¦46”§D1ÓÎÉTÛ®o×ìJÅ f5‰ o¦ãïÐt}Ú·kÊÑÛ¶?ÛŸ¿ÏÜ “û˜;ÀYæÇ•h\# Ê »X ®èó2éY¨×(¬Þ׸bøÃ ´ÎXr]‹Ó)Î÷€U7 ILÞ½AÏ\2 м¼'m|›Œ¹iS 6kævˆŽ <ž§=æþÄÔdð9ʸgš©ZÔ‘Áý†ˆ “5ÄÚãZqö“Û.l ÂŒègï`µûpL•ú#䩤¯Ê¦TƒþNŸA‰û] íf}K ž¿'#¨‘$~ýÎB)³÷\ñÚ)Y©!@QA•bs0ŸgQÑ­&Ç—:>bE`š€"Èü&¥ðaÎùdÛ)'õÌÄLRq~î uO ¸Qßœ‡%,úwöD§n\`òð„Ê r¤ëljÑZŽ#v¼N<†¡Ë¤èð¥ 惫:*ÀÔà‹A£õ¤’ïêà¿Cã˜B*Kýº” E¾Vˆ²¦Œ¡Ä€ÕìŸqXmhßkJGPå6V€×c°>ñ·² Ñ&K쀋ê˜ÆvÜÊaäÈÍ@”Tù¥¯SXªî™ï@s…^ÊŒ`"ÁÓSF£N*c¨e2¦ø4i ŘÏÅ=Ft8[“ÕzŽ+¹]ú1'Õå™8’ÏÇ8Mm_´ƒ(³vÝÓùº"*\sj‰n_Ñ%–Ò:i¥1cN-±¶°ŠÎ:„ÐBYz·B„ Ù.PBJ¢£<£_dÎoocJ'<~_IñN ¶zöÇ<ÝW±Ž2b"жÂzè á¤Bâ"—NtóŒ*]Jo:Ô [Å’¦ðu9¦1âj¬z…ÿé¼L¶!tlñRü¦ÍŽÜkð‹ºË»$Í«€Ã<ÓÉo™Dǹ‹¿ò¹.cáòŸczˆ°*ª£Š›üjMÑL VGѹçOѲ0Ä=HCSC5¨`…ï7ÉZk,\¨“¦ÓD*€ÇÐõZŽÝ”jªàÂÀ0A•m%m™TÝÁz« ÜÍçÿérnÛ¶—ÿo‚$›"ð% յޗÍÙ5(ì^ÀؘUG –C[ž|½y×ɹ]$³þPð]ˆF~ݰaÁöÓcûë=§/¤äüØ6цJü¿;çC»I˜jÖ-òÿ˜°âC­à¼úYøõ#öÿEêüÛÏšw~Åû㋯Ÿð³Í|5y÷ÿ\¿Ô†bU?çs}®ÿŽ“ãã/lïl;™ £T×uË쩌p¨‹íÉœt2—)$¤wldœÙ‹LŒ_hkÿgÉ8ÐcMO‘4€)‘¾lõóþ (%Ä Â=]94TÇdd…{/Þ‹‡aêUGbTB9Ùª²5ÍK2“ßR‡ ”)"¶˜¶ šMFª•æqoô<Ê*wÊŠQ¦ØÿwÓü|†Mø¿½F‰ÜÒUwáQJþ»î³š—½šcXâˆVè[F} õ̪ބÎdš`J¬9:˜¦o×h+óA{}3ŽšàN‘+zŒG¯xž¬OÍßmö±Ëô½±Uðâc0¢ä3ÒúFÝí\w‹"°ý$Ö€ÉÖÓO5j–%”V&ûЀ[¾„XLuU軥ÕÁLÐýøéxr‚ßi$áê8`˜ÅÁ[öt‰`T¦P[SÕÅ“"6â  ¨Š“ý4€Ñ­ “¿Ô·&%¹TÏ ª @úðI.òPëÁÍ*ŒÅ0U-):Ô Ö¹È¨ÕE[j|t¬…¦çÈ ì”éó9ž.½ž–¹€Ž§!üô)q—>Þ™»ÕѼj¼¹ˆpHäØ[E&–Ú2§"jE?:£œóz¡sêÈyÚ­¢ÆÌWŠ%ǧ… “ʶÃÉu2]['<Ø™ʶL,…Ù"žT¦2JK‰‘×Ï%ÛSÏ(×>6öAvÜû·` %<ð¥õþ3%[Åÿ#¥[=Æ<–ø]³!§`ÇI[/<«…y ¨”EÓΩÅmòÖ¨{\N³5i5‘–N-ߢb‘“‚Rú@Öë “7åäÁ\ǘàN çóæ‰örç€<ÏÌ¡+€#ÿLU‰ìÊxg­¾àוiÇ‘5ý<>PaÂAˆªOÅ ¹¹˜ZÊÊÙ€ÑvT»óCMù !Ñ%1‡^§þĪühÛ y•†I“Mƒ b«t¤PŸû«]L¬¶Òª³¢¨Ç&®¨.šv8‹RÁ ‡÷¡A8þ·qñ¥úõÑ1«œ6Œ|åát•ÕÅþÿMÒù¯¸ð²ÏžPÆs%¤J }5×üW’°@³SUÔW+ÃØ+—ÿ&Øüº3˜ÔÑp§ö­âÔH6D]C¬¬’q³Vóæ[³DqDøN­gÁ»¦ˆæ›†««Î'ïlr›È£-'çd’=»:ED6Ì“ºÊ‡6ÑHp,¬¬?  ¶u¶(NÚ¾-aˆK؃vEâ¼uRô:¨×wé¨hˆ&„ ˜nm3 ´4ñÆsQÏÀgfí)ˆÐÉ…Z†ƒÏï €mÛ¶?·íñzŸ$IF$:çcÏzÁ­82·daV\3'Au=WÐ~t J¥¡G•Ï£(ž&ýî†I«Æ8àÔ„¥àÈ !ƒÔ˜=BßkÃöF—‰mfGÏê° bU¢gtL5¯wÑ2a0aìèß wT8URŽ=_“ç€ô6jmFt*pôÒÀH~d3K3GqE;ãe“¯±³g©”l7àýZó@Mžý ‹É ½¢±[û”=´°}Ï‘ùS€æÓ“—“å$-ßÕëÒóL"ñŽOVr$¬Ò¬I9L!GÓk'ö¬…¨ŽE÷,˜;‹Tâ~j[ ŽüS=X£&¸«Fp‚ —­æuÀ1Žï pá*×µ;ë{¸\ß {å‚}ñ$ÄO#D5Ð^ÓjV£±†K'íû@Ÿk1½sfa+%šj^Œ4‘¹g†tZ‡«Œší'i?Ùµªw¤Ùs02”vÑkηPrV*3î´%á}ðä°Õ!·ªý'Î8©Ã-ég¡ÁÝ4Tè\óù+CD°mB>û°aÛUÿì@‡sDͱ~—u#¯¬¸´ªètcíºÔLþW×5Õ0ÏÎâž\;'t¹N£Öw„£²ö5;C”Y5WÂÍD#üwVõê£LèSÍöŽ¥¯×_zÚ°ŒSüΣòB??nZ2ç¿–wŽJÂvù–ø‰mÝç©ßðÝžÅì S¼þ¥·*'òŸíˆ×©HÒb…¯ï+ÿ¦$ßõ(YAP9Lï³½`íXŸ,†õå&¾lQ*!Ø Z§œé™Ëë´î“Enž3+]ZUâìãä ‹ö³É™ƒÈ‰t±À‘¢-±c†d ö2˜G­ôÁ}•S\‚5¬ûÝÈ£QÆHؽþžÖ‹7€IG(Ã…ÐwU½¨èj?þ<ýìübe\©wÂá³q´LæhœÅ¦Ú¶~é•'ŽàÑèx8šŠÔ—ÖóDÖ{Þ‘ã­W´Œ¯¦ò  õ›Ì¥6g-#ÜÀ‰êÑ:V‘žè2•ªˆëä°B?¢!4§bÐàãýÓzð¾eM $qœ©Jý®m“¼÷‘¼f!¯yï‘HíœJ^‘ÉŸVNÊoRáºî¸t\¸RÉÚÍô uÇÏ·W›øž¤ó/úéGŸÃ$šŸ/˜ ¢»;zÆ]·¿¬Å“i€û=µ…óQ÷± ®-;U³ÆoùËyêO©í³úµÚ©ýNrÎÑF:tÁ E5¶­ ä<äQ¤^‰âzÞ-?€‚p>‡²«Ú¨xòÔzGÆqoݧ®:É‹–¦÷Ij¸7H.l›:Oì=#Låa#7B`kÄF¨'|Rá+ôôìÖšW.#@rïþz ír4o¨eˆ™à€àhÜ)q¨F88_4175oƘöGÞ ðkÚj[* ¤ö+Ï0zP<ÄíôÞÎ6Ò°zô(žþÆ–SÇxãZyˆˆà4Æÿ:´º˜‡²>4cïû[µ«Ö ktïu,@’»$V«ûÈjŸ*(³aáa‡»©ôWAå]v2(e†‡³åøïÏ`Yö¼¡éGõ¶‡£•C4é$t1­­ÛÜ–n¥V/Ú©"jõjûÑHƒÈuSmóæ"CWꚉÀÔ÷4ÌT©E¢ŽT’üÂ"rȨ`böµFmñ)¼o¬¯¼¬¡n¶0×Ë%½ìó“¾-I}¸P4Æzñm7kHôÚ̬Ml¥~žþ<‡³D“«ƒCo ’CÎUÏ4F¡â¤í½'ô™Õ´jL;àBÀgü]3JtT:=#©ª[݆2á$bLè1A8lf á)’2†<ðËxªÌ ‹®(¦V[3ãBÿþˆ:’È$ˆ!Kãvz…ºÄ•ˆÖH_a3¾ÜezG§”2‰ÐQMKûùR¼A*å8æ\F¯ ³nK9*ÿ‚ù¨ÌŠ føzº¡Äº2‡4KT7߇8Bh4ÒWK”Ê×)ds>øRºz:2WHq´ö…Ò Þ” ƒw·‚(ÙîbémÚXÉ:BڙЌÏ¸ù•s Yœœš²„Ðÿd•ºßŒq…t¨T¹Ï}W2ùa: _Ó°JЋUã×Sôœ!¯põV. 5¡Zª¸®ºÓÙ»µ&ý*©¼™„ƒž”Œó½u†©7¿˜­q¼{_ñeCÖBÑ ¥€Ä(vR;¼; 8·$Ú]¯½O™nëâ4¨3Z“uqxñA NIì(MNÔÀSÖ,žS9€4/5×Ûð`w&6³­R`è–Z¬‚é«Nâ Ñ`¨]ÒöЉC×Òn‡êBŒ¦áþò–Né'žGÙ7õi`‘u>zÿÒù,•ëV5"ê›58æ–á´äy„eîSƒËpè­)£ðë;>×çz}Í¥Z õ³ú¿ÙÊŸç€QÄß:p}tE[DZf˜ú•ÀmA«N*Ql \?"a:©]ç&9â9#*QÕ ê<Ñ„MãÊ”G#6¢S¨°°¾*Þ6áMUÑ<2Òˆþ·mÛ¶?þ<`¯:§(m9ž>ú–\Ö6CÉÑôLñ¬÷IK¾-Zz_&üÈGQâ67ó£g ‘ Õ)΄6÷` k?bÆ$$ÖmTÀ› R|Û½s1ˆoBU.b1i€ã‘¢à,ª£°ƒ€›^к{ïÀÒªcÑ€µ0ЇQ‘:=9o!ê9°Ü«6ɦ‡ýÇ'¾°~²Çêç ÷U#·n*ð;ò4ðaÒpûvv÷;’οÕ9ì`Æ]ó_¾þ. >7¶Îê⚨•/˜¨–AóŠst ”¡ªçN@ NP™J>mÁÃõ ¯¢ÂÓ­ç4Õ §ýúºhž‹ "ŒºHþako!V·ò,üöZböæfÑž ¤Ž}[7žï5×=MQçYбëN…¡á;ÄaÛ7àCFI35¶NEdjN“Ôþ¨ùØUiœ!å š¨¦•§ë ‹©êB؊ƶ§à/6ÝðØ;&ºò)±ÖÎÂS¦ž ÜI©ŒÜ|ÏË©La|{e°Æ•p" NôbøŽ{¿TH{Vž “L˜xjÏL9XJCùÿŠLÊLê•êNënRç¯M˜óp¤N MöÈŠàúÉÀÔœÚÆOêÇ7ÌMÓ^~Æç) ‰ÅQYß¼7zéYËS1f6ºÁÏ£Â_ÜXøfÆ/×p3ãýdSòÄ3-ày@W”±6Þ9 ëðÁâ¾Æ—@ÌlÝWñ¤ ®J~“ýÊ« ÔÂ@Tt¯c¢cßøÔýQ¿(euÀå!]uêÀ®æj^àÖN~ÓM,§’Dò‘){ï˜ Kº(¼D™'E:xæHÖº6ñB jGê_r%ÃŽ¢gÍr ô7/Qg‚j}Gß3ô`ÈïĆނˆ -ˆÁ»ýŸ»k9Š~XIS¦áFq‰ÿxÉù¿>”Æ4nï8O#ÍšPBb˜°¥Ýƒƒí‚ ­Q(O%ue`Àä/œQ„-ÏVd ›WI´Þóg1]=œÂ‰¹5zgVäøE∎%NS&„#'ñ´Š-¨&˜§,ÇŒs©úÓ³ÖŸ‚ƒµ;µ¤–PCÈg>h¶V˜oh<ô7²Û»À»´¼¦œ‚¹ËâáÀß'áO?5ej«“ßú±¨Ö´AOÙä+Š÷ý\&YsOk9Ó$ …‡’eÌ0z°<0{›;LËWì›Åòú'îfCÞ½MjF)hR¯ÞX½mÛŸí©ô»a£¨¦ðà¿ôf+£-µ3x—Œ]¯VbSôe$ sÏfÉéÈTc^&áÑçØŽÔä1OÕòºµ^si”T)–ãYixxf8ú…æm’ë…¤ÃsÙhSF¢…ly(CÒV-u1§ó§ ÁŸ^$mµÂÅ ÝÓ¹ùªIñ- ×Ô­Ÿô’+¤Ê[Ãqae!ƨÀ¢ïÃ¥[а‡3}n3[‹Ô¿ÜÓu„·t¿ M©¥3}„C§f°%ÍËdµâ?ì¹_=ú½vÏKê-T¢0Õlœ=ýÙ3QÚd PÂ%QÓ¡“¾xœY—¾Ùß‚†´Œj#nƒO×Ìæ°Î"ç¿X©×«y¸ìYDÿÓº§ŒtQ“J™{i”åÈ 9On² -å‡ÙÞd×›J€Z òtsPêóÎéÍhwY‰i½Ç_á(8ÀÂ+ǼçÞÚ˜ˆÅÊí+øiètgdáfvbe”˜EÚÃzû'‡eÉTƈâ8ëèÍ^F¤êˆàÕPåJ?пÁ©Ã]˜ŠzÈÚÉW@ºç§ç YÓôš+’í‚ ÐaÞÎrñ¤8І¨è+‰q¬³E õ9¢êwx:9=.2°½®|˜€Dƒ¤²qBhˆ–ô®l×Í¥@Œ”N„%a„7-4·…ƒ â€HZ5Oo=&ñ­%<)‰GæOŠÔëºEñ"Š¢r+$âtS^~IlÙˆéè’ ¢JRÜÎᡊÔ+‡Õ*Ê’‰ž›*£lÞÓpµ\qÒÞîhôCÚµ!NIºwØ0G÷n+Â(°*:j%óZvZ9o¼H1Ñy@“:„Äh0¶°àÁÖ’®ü·_ ŽÆô 5=ABߨœ§Æýsµö‰µ<“ Ó¿î5!ú1g¨©”uH! `»©Ì2ÞÝkf$H˜åá‰Hû8Ç+ñ"*V´ ›Q5 ¥ù‚ÿ éü©$Ë‚o>¿“„jÒ³ wz‘ é‹ó$gZ±*etQ°¿§ëïÙ[ _¡Bìô¿yqßíxçMåõ¡íl‰#¤*wÁNΓ.O¨áÃ1GÄl6 ¶Ô1 8¢–ê¡‹²‡NúÙrZ—çí7#ìëâ^VÒн›d÷[;x¦ÜF± •†÷1¿"º¤3¨Òëj˜i€a÷$€ Ûö÷ÏŸ?hÔÿäƒ9Ιtó¼–«Í*O™^¦ÚÚu<ø×! ÀÞË„×B-´å†„ :£†ò,8WŽ) ˆ§Îaí­u¤_ q {æ™ {’˜£‰öHnÇê[e#„*Ó+êç™[fy+ýŽpéy\z!«‡wÒ#^YW>H%Ëg!ªVIåd‡£õ÷U\ËEŸ“ŵE؃&òj ã<#ú¯06FäŸVƒ^èˆ×ÌÝû™µyî}¬þÿuï¿Ù¶8 êž~‰¡ûÈ4½…£„‰µ¸§Ø®º[Æ þ/;X®¢Ìû]gå,qúPÙDÐ׸Aþlø}r×ðÕÁç±^·áË›øœk¸£€ªå Õm_b:ɳIßE3ÃTØŸ[8±÷=&"—ˆ†;ŒfL7E¸íœ|6+´#NÅbFg:9æ6Bṳ€èBÙ"w9-Ç×±± ]«a(ÒŠ ÔûyºB®AùïB ™`…̒ɺ ” ¿ÁÓ¾Æ6±€KÏ4‘Àêð“g͸yšOÀ;&òÃÿ3®¿6$ÈÙÍÊíªyGîZ$ºBñ†”£*›ÅuìaåûÁ.m+HFJsŸ÷ï ÈÆí2yLj¹NŸ<$/ÆÑéF<`{”ä!í»÷›?&eäŠ~S%iÆ„ˆÉwšÒJ’ÇŽó³¨lÿÁ.H4èdH§»§Qíp­‘Wý­¡ÁÎ_×I}²xÅDhêD[ÏØ*ž4?l-×/À¶mÛ¶aûƒæ2Y¹¼OK±_oKHrˆÉ¤`iù`‰ên¤>˜F*1 Dƪ\ ¯ÇÜH¨Þ5sÆ©ù˜ÆTÝG\·¢ÁŸR¥¾è2ýßåÙáœí×FßÛ›áêë›Z¨‡‰“Žý§×ݬP?È õ™¿ Š2ÈŸës­‡w ®Ç+û¬B×$>«õ¢ñGþw¼ÍËŸNòÀÎÞ€|ÛÀ{"¼™îª‰$ì;¼˜ÿÀiøc@™Öuk ˆø·vsõ§§5øo÷§C¥¶® Nœ^gTµ÷¤ÈÝðMãóŒ·.o Þ°} 9Ù5‘Þõ¯$>×wó‘ɯEØèÙ{ÒX;ˆ&] f‚DaÌ ·T= $Vý¯x¾³ÎÔàK¨óGytîÛΘ"Urøl†A a CÄò)AÔ^’BCŽó+ÔÜig»5⨆ôLnÊ2Þ”áþˆãÚH ŠÖÖ{lðùÜ‘4:²u 1³‚Xµ‚ö¿êî ÛVh„UQÿ”1IÛágÀ…r^ñ³0Iq<Äyª“ z[õÞn«§ šâDOjÒB_¤s’Èg]n“¿?J.Vâ…œ!þwU)ÈAÓë……Máúpæ—'äpÕJ±ÑÙxŽ÷Jz¨<—MÜÊ13(†Ör½F‰½g¢Bö+–'2á2‹tž1šúJ{¨'¸)ºÍ¤©ãØT:T53÷sÕ‰K¾µÁJœp‚­¹LÓÈ.{¿°žF Î;ÿ››,¾ó—%þn#úשJǮ˞ëÀÕ÷ä²`ê~4öz„ÚpF.E RC޶ཹâ Å@Ó.ï<„Â$×ãAõ`Ï¢Ûy°÷dT¡æefÞkö»‘Ñöî©¶¦"CÆ-p@•k "ÎÀ ~v`lÛŸ?þ>yW{¾ªçB˜àï<ܩհwvYÒ™sËÂí.ZË‚<ÉšSO”„*kÚ¡`«ÜVì×jßæˆž<±½k€e¶&a=±ÄR§Om2_¯»ð9`CþCBc*›“Ö/A—bÙ@ <ô2\š:§‰bäKénÒ*ÆYkÉ ¹›XÊ£ì¬`îd7IÙBÜṈ D.ˆ¬aC­ÿ—ÉðFôÿ˜Ã ÅláëË9yÄ›èrâ†ùb%ž\|®ü ‚e³Š¢Ò¦Š‚ÍXB%¢eK–ò:QÿC³¿oâr«#…Z*þe’2—Xt$Ô ^q€TOÌsöGŸìˆ!ßB¯Juß·7¹´ +Ù3–7õ}0ù8/ ×âoÅ/ò¿Úaááû¦zв°bÙÀÙþêLˆF°ëTJ—äé=ˆWæoúÃçžPxÅÿÓ –_­j‰ô.z1RšrˆÕ\ ¢Ú˜i@fIñ¦S}˜È¯jÍQ‹ÇÉt7Qb±"þ•lyÎhxsŠ&Ëá¹ÚÅ€ÕJ,C½a0±ª¶8Lf“¡»% Â…M0ñ°Œ¤UWê«Ã†W4¶½`¨Í„Aþû>Ú¶û#û0U¹f¾Ža®ôà3ª ñu* •é±È“”\“5ÿèÿ¡ÙÔýéêîGë@—B Øðg×ûݶÖ0rÈRôV.Ä«¼ Sb`±áB²ø}Cj¶Ebó «Ýò/¸:8ú«ýüN¡¼úÖ–’?éa?×çú\Ÿës}aDô¹>äçú²À»_úÿöH}!»©±åKÜkø^ì*ÿˆ@3a[%ó²UKÔŸës}®ãcE;á³M>»Ú¨¹PèiÃR•‘åº5£_¾æˆùABlJ¡q‡ÿöî1dUʦ2“ÑÕÅT8Ý$¥ÊÀ%¢ ¨§’öí™×Ú$詘vÆô0((î„$O\£eO\õRpK=jP†ÞºH¢Ú8ߟ!­>žœ  ̎¥< S: xS]ëÚ5ƒ}v+G©7ˆ= øÔF…ÿ;$¾É@Ñ©ÑúÎÎò`ï2óÚ³¦ñçþ”øÝëÚ¶REvçöÁN¾îFZa£Ú‚;3 :Ó9z=|›6ôr%ͦ<öþSQUÚš#†Ä'°÷D`ëçy¾ Æ5)|:qQ6n%üÙ¶mû³ýù³šÞ;ñ‘jKg“¿„£ƒ`½Ò*בÎ$‹Ð`$ü\1… â†Q|(éz] {)¼ù$‡&Þè&ñæk´]jÚ…_è=˜Ã Q³!*VõBº­Û§|šÛÂоjqGˆj÷µÖG"¯Â¨°Ž÷X±–£îí?gÕçPZ¤ü7ǧŸÙFi=pP ¡j‡¨jÎT€·úýŠzéí¶Áˆ0Ãß+”ÊbšµœµîO¦g(®$ãË„ÖíN¨º¯ef¥Ñð¬zyrø‘+¼UÂ,bt¶¡ÏncXd¨…hKç?,CXÁƆu¹5–Ãx¬À‹€d~b°_5ÓΤޅÌ,1y<@ÙX A^ÿñþ†_/lפö>éˆQZJYöóP—܇AáápH؇2Ñƪí¤Ô4¶L¹‘Aîafëüévfr=¼ˆèpÁ‰.BwJÚ/‚™¥*9&õ$¾ÂQ²*Ýø±ˆ¶ª«­ë|5{ ɤ©žÔ;6²ðVtñ#!ú¨uµ23¯’¹ÐÖaþþ‡µÀ×àQ]c¨Šz›¡nîï)öoÏÒ[à¹sÉÓ¾°Ä—ÒX3àÌiõ*B[C­>–ÒVL-£êu¬Ke9½áŒ&Â+™ŸŽÖ4Pž Ù 'ù,g<òâxxc[ÃKÝE$IŸAÁÖµg!R"{×QSu™a1 *aÛNÑ›ŸrIêøÏÊ6÷ .PœFŠ› {‡lk§ï<ÀŠ,ºã±Åày‹!ç\šçŒÉQãÎyëCô|cVwó/È"ŒA\MÁg©÷IhÒ(™öÀ6Ôsm&GtðpÂHÒâ‡cw+lÏxÞÁ¶hhÚ®ÿéüÑ':¤ƒE¿¼ ˜ÊPÿ!º"èÌã‚ïÅéÐ+ºx$£[ÎOU¯R®SÒ Sázä! -¥^Æõüä_ öä‰xñk¿k¥×ö»¦«P¤yV³Þ©ÿyØCÃq€ÎGõ‘¾ 5°VyADv’ŸÖ%@/(J‘ýXvdþé ðñðxDç÷ßÄÐÂsHcŠÆƒÝ(Uºìoµhž__ÕÐ[–ä™nï– ©©ç÷¢ţѼPƒpø>Éæ‘ìÄ?þîCÔèÃAN. jÀ†C`Ú·Ï /¡‡™ü¥i7ýín©Àœ1Vè‚j0G5½ *¢$.ÔÜ ]Ž#¦ d—LÍì‰xl!‰Öî ®B¾M:½ˆbج$f'9ª5·b.¡´LAÁˆ„&„Þ› o’ªß,ÿZK0⑃,ÛQ6+•¨ô)okò\†Âœ* :¾SO’”*?¯é•CÔ=ƒËCøÎˆ³Ó§èŽOA×ûÏ©¥‘L ?ŠsxÂEO=Õ•ðã.Äœ”¬7ûh‹å°ðëÚpÙRÉ:V-”ÀC °#†°ÄÓ9X7†d‹Ë?×.šC'Cvæ(0¸€œB-‰̼[”ó¯ÖÐ éÀ0ÇÒ&9S]KÇqp'vkŽù69 LLQÑÔ( rÅq+©²3‡”ÌÄy ýW7Ã|ö+”>Ûs·›ïŽ (×U.kDóÝšªëj˜nZg…05VËŠCç'¸a)2‘ñSkt’¸|JÃÒ§­:šÀ ¡"#Zb$–Ä;%™L…[ÏRªSyGÏ8þ³ÚícÆüÅ£µÈ8¡EŸ¤Ùa†Œ‰f°ÎI7»ÙÚˆgú‰rwÃì‹`‡èÇõ8@×ZPrÂÑÑ=ß)‰™B¦¤ÂN-Ó`Lže–βʬÎãÊYË#3W ŒÑ!«#4¸3àeã÷‘Îc"µ¸‘”?m¨ª*Ã2ž¤•óšØˆçÐÞiÀw¼N=ä_ù\?îªÏó`qR‡}é!úï£R“%Åܱ¨»Ëþt0JB¥]Ñ~x[dæÊkÖØœ¬·Õ¯”X¥°“ÚQÒà5·|À S-nQÂá>6¹·vKÈ~ŽQÆþÿ³mÛüÙF= ¹‚þ\° œæ¶Ûéˆß2TæŽ{ÚC/Dq{0…ït ðšyÃù#ä·ò+^ûsý²cõ—~åçú\÷-ÞÞiù¡Rx÷PkIËÏõ¹>ײCJòGÒB¿ƒè­6„ÿ.ÚÍã ¸XòºþµEý°•®ßëµ|wo¥R%4Æ!k¤äkòšÐ]·!¦Ö²¥cVôÞþŽ€ú_Š—|I«z•ðˆ¡Øq¡-“…‚¥)$Y´ÒIWÊNùITœÝƒj:DÊqfrï>ËÀa¢sÇ^çu})Wˆ¢ÜåŸÅ$%ƒUžy—~—qKäaZs^CæÑ›o±{^ O–š&<ע؟M5!RSÒìL?.ƒl”Ë{ÀNë*F !»Â»p{¦(Cjö™Z$=‘ºÇ“m‡`õõ‰Â$p`ü>'¶,C» Cûìv‡wÕó¾EF2 7Å>©Ï)5ë?ðdþÁì“Ö+ž N6=±7;è÷Ë[PÔ;¥˜û±×ùG†ý ©D-úËžb²p¯åÖ¡§‹ ÂÎt1Ùl«Î§ÅÀ™²$"{ZÏßXv—„&¿­ÙæÐzÍŠÑJª^èI–a!™VS[~4ÙËZÚ‹ÛÍT”XÄ:ÓŠ5ë— ÿý47ƒßŽ»JýZÝ©ÀCÏ=[ä¨_A¯rmÉF‹ óq’!"Í„cævM¢_ªô©7–ÅåHe^Tàqåa“I¢)a#-D¡ª´M6T¼¿•ºânô'õ3ÕI}/ÌÁ°ùÏD°zA…UT±“(U›üöC9ŒçÎ’á za+þ?pŒ=X︞¾TvØŠOrâÄÆ´ÎœÖÞô¯›t3ûèHK_šÖÎíÙ%š1çœÝu˜ïš±Yw¶éÛhdGǺ‚/Êßõ¡ÎBGë^Ž-ÉÉáptÀ™ÑsÀk*µº¶JÑ ýpF¦0£t8±=Ò׌DI²¢VyäBàô,}‹ýäaψ²¼Ë”ÜàÄ>²Åòq[Ñ€rÿޝhÜ—êÚØy¬ôôú3óª :»&{H?¿6Ù%MFªSE”ö ƒæ(åo™ûl¼I;²h‘aBsçiUù?ðÂÄ1ž ‡+Ä•JVþ=™wÅ#¶®:bì׬dØuñ'O®é%>l@Lîù¨þHç³×Œ%¦ÈýóKk9wÉÑ `ÆÊ5 ¸ˆ*¢ÿÊœx¼™…Q]bó ¯jÙ›è4kã€~ r’Ñ•%Igù÷`¬qr³.v2ÝãCjßžB˜"öù™ºl¤ó€3âAE™î8ÎÛÇõ7v+\hLã‹êx[ÇmEü0&ý@˜ô ;J‹& »ùв¼{ŒÒ+{6¢Õ“ç˜Ãs÷ã/ñ'2íXW¢3= qí:`j d›"°É¶mÛŸ¿Û¶[˜Ñ=€„³¹ÜTiRÔgZÞ&k6ŒRÐýt£a6‘¿sëíÀv­fKů ¤ö·šÅ‚ˆüaÛÁéÄJ½á¤íÔ —Ï1úqM9Üñ… ÖdAÚå½5’Ï|j¿ø­rÒýh…c4ä óŽÍëö<)Α14ôÒ„o»%gÑ|â€åcSSE1Kia\åŠÕp¨]Gˆû‚YÖLÂa†TaâÆ€ûkÇû4Ð`Èž›ŸÄÿÝH/Ô •X#²K?È\ˆ ØW"NÀTÅõ¬e÷òϘÚÔ©÷‰´˜b!$ ’(bA~T@ÌdŽ˜} Þé2êq-“|ï~™±b†5>ažz©×œ$kkÎ,|JR_HàrdÌCG¼ž ³¢ð2ÊÅ`|R¸!–¤¹Y@&¤Ìƒ EõJ²9oª÷øT$}ÇU°ºC'ƒg÷ü³_"N 53ô¹4 4r5®Èî0 k³KmAk»¹‹IS ’1ŸÀÑH)• J¡ü—­ÉtW¬8áNͦ¦Qk½öÌe ÒóQ²ü_2 À|¯»_™¤ "CU¤¹t¸d޶ËI°6Ñ. ‘,!|áWCÖ¼ŠfòÆ£¯:«špNÚ%p« ~Õ5´4Kt¤ËÛ%»Sþúî;;§bž÷íFÆ­º”—Iï&Ú®wG²‡X ª¼1Ö€¯b¿¡3pù ?ùƒž †#–½Kó3ÀÖÃQ iÆylö`ywk—jÆÃ¹³!)ô‡“ŠŽÐîÒ€ë1‰ò¯kÒ4_ ¦ïXp<2Ëtê¯Òêmƒv^Ý23xþi¯Ú•“À´a²ÉS” 'Â*í.Íò×Xµ©½ã‡oå]xOnþwÓ|Á>|®hÎ'„Ê?k*™Æ´Æ÷™ùû­™&·.(€xƒ7¡¼õûÖ̯e·à¹yüãðRà ïÛËm½ úc†ŽFéCD£¯ÉðbCòWAœRGˆY‹ÆÛ‚µÊ¿;Û%AàwÉŸ´}Šœ;£•ßM:ÿ}ÂÏ–ŒZã :‚ÍFõ¯@ßÑËÔ 9Ø `ö"n R…ïÝžNÔåÈè:¨ª¹Ï՚)Bóo¼½µ*»%ŸT·ªDn»hÄèÍ>ïópt]x°õº4ËåÿôsþtÑcl¶­× <œÔ“S:è!A^Õ*÷oØùf£pÔ ‡œTªÃ„R¯âf«ö4UŽ¥Ÿ(q*3Û’v3SImM))ÒÂöåqú)$–L«%ó(NŰc8üä¨êxyQ)±x/xWT„98nv»„ƒpv‰× >@ N"‡ÑNð|à9W4‘îuî¢r Tg¦r‚Ññ¸uÁÚÜïbæ­Uo|ÆZý5“3‰Ì^ Ö’|ó³)"®lïÕè‘ëdìhæ¥-’ÖpÄ« vƒ±R—=®o¾o޾¬¡ÜÃ, ê1Ë@j$+ój½µëV&U[½ Q"Þ {Ýœ:Bá*ÝùbeE£)xaÌ× ÿ§F; ÑQåkx2Š¥I@ö»°ì:µÏƒñ¼°N¿uÑ "¡V×½)&…rÓeg9ˆîÞž®DŸ|…1'(éÑýcP*t]»­kõ ½-ÒUöW¹•:Éê +cXÅîÄa+GÁ.Ußs¶\/l ™d–¼9ñÕ‰ƒ#xÞ™wƒ‹NÖàÁY3åIMñ~ód¼bs@“›ÿ"ÒùSßøRáýeH‰DÕ¢Jà—‚nñÄã±0¼âÚ#:ŠGfU¸ŽíÇzl–\;;È;Z³Š‡ý«™ÿ ¿ô…ã¼¹¤X™ÙµAÔüÜD9Ë&ŚʆÄO¾ÐÒóf|˜Bf„·-h3˜Ú>ƒ¼¸Q'AH¡Êæ cÚøíÜ{^æ^8N½'A­iîo^‘dIÕ©¤Ö¦ÄLæÆŸYŠl;ϾCæõÜ<`wØÈ!ÄJvvÊŠÂ"©ÅEËgg™”û3”FG!"°mÛŸ?»Ú)Û.‘ôh-B#¨jcÏ"0‚S;ÀêˆHYš9ß,Ó‹ÀœÝVRƒñ]Ä V$di°vÊ `›·¡E›¹ÏkOŽyθ¥¤Ï“ôtLÇÐVc‰é¨1ÑTqß•B4¸[ŒGº DÖþï‘Ì©ßv‘ö¥¥„™WfìüDÚNÊ"'³{@'0G[mÀÑ-¤ÌuƒÅ&9è¹Í‹3Ð;Dfφ˜Qqô'Å2ÿé¤m•ko.…9ú­'/ÉgÔ£!UQI‚‹å‹’n©L•c׬ã|e1ãÍÍIßr…A£Ïó*RUTˆ­›Ç×¢ˆÌ'ÆÙG¾Ì–VÚa@ÑV´(2/HWDF¶zئ—m$öŽºtÖ€ºØj«#y#Vð4#81<ë®Ç¨´¨êöµ?Ô€Å$K>þ%Ye *txÏÅñ<Úέ(‚b+ïODÅé=ÛÈ…íÍY «cmóbOXUÛÒ´g<ê‘ä %˜¡î-«6åMí陯Y³’Ý.8ŒZ,ÎIÄ Æ¹Žæ‹2vý6¡O³PCDzCE~ƒœo*xkd'•ìøY]6¡«I?+C”B)—J$«Ñ°B:øúV Ý}±õƒ¦$ Ê÷€+>Ô” íSVë)]˜YõÕjœ Ô2FVĸIIÀñ<ÕFlÂØÓwGƒ!€ ›îX–K(º'ô_½L) Ø;và©î—ü†¨÷f$×\™vÞ”ÿø€˜BƒÎH §àQ`´p2¨–“H¥¥&zL„Á!qD%(f_–ÅÞ0Š‹ûOQñŽÙ$hyØ€ÚY6'î4@㦒ýä«{ij$€jŸ;µÃ=/ /ç[TXô!ä §J]–¾7¸Õl׸ý/Œô:÷ @ …™"üÆK=¼-Ø€M6üÙ¶m{ö÷§¡^/4R°EOÜËÚâ¸ó@°dËqûCw²åé6þ^®1ê5ÄS\@¿í:‚­O–äu%m¾±‚ƦÂ>x•eƒ³w'Ž ¬4SÝàîM[Ÿ Öž=ç±fÏù XÛSÍÅ<ó}¿ É}¾åÑp¾÷;zÙr?×hª[~šMm)/p—è n›T¼úßró̽{ÜõE,dÕg\_uï :åŸå‡¨×#群Š^ÉâÔíT 7<Àq=”b!¾hǤ{¥s‡b5%Œ—‡úïm"¿vEÝ·wR1l‡~ªˆ[}{™ © ÿE†å¼a¨ÿ}ujÊâzc(* vù¥Ò«‹y4/UbL]Ó ‹~{um94˜vJIêWÞýh+€Å+»ð¢nAeÊø.i´X0¸fdÞãX½æW<hÝ ‹_O:ÿ¤Â~y2xý7¦BÐ /Ò9ÆP¾IQý'ô5•jV!Ÿ$*£‡‰¹ýXégvÝ:{½Iù+OnoX }¸r" 5`M(Ÿî`ž8=ÕkB2þ î/)ð_#ή<ú®=Ž’«nOM)l쎦Ó··“í*F~:´Zr—™h·zöØ‹ð\NÚKÐ$ÏêùÇac! C‹V:7 vžW>Z.j§ËBìßø`Ð"×ôölí·Zööù”‡Þº½ZÞæ.²þkÖC9Dõ*ûÛq…PžQ’ÉÃ4‚.J…Cwºƒ°·Êz? s°è¨=OÑ[Å Û¦ùxì!Ó“ùðg9Úˆ¼wm›ä0bvGŸ(?µ½™Gx¬Ì“0Ó…Ú¨Îy:±°“Q9@£;Ì%›ˆñ<¤“v=ªâD3²„âñ7µ(žÍª;\Óö©ÉÝ€>ŠtfV;Û—åÈt2™¡ëz;ó”®uZÅ ‹„מÿh £°Q~€î¥ïØ ™Cešù©×̪$ÓñÒ gêb(‹‘uJØ;¨¿Z€¬á/Ë©ŸtU™±’ iÑ!ZY›@‘E,©ÒžäÙM:…ެ‘:%j³¸RðúÛÔ¡tLo]Cõqí¨gFjÑÂÑ™k¹óPª”‰÷‹®üêcBgJ’~írNò…>_ŸéoÏEfð‚¤ÆãXŠŠ¢sïÝQzBvhZ \n) 1#2© Ì™Ï÷ÅâÍI3èÚ®­¥Tõ~kÌ9ÁF¢ç8 `š ¶¶å&G¼ŠY˜¯QñK‚ŠçciåDÒ `‰±dPÁéËxza“bÃCž“tmîóÞÌ¿ x>ö™{ð±Éfë§J—#fqVûÀNDZæn´³›ÝÉBû ¦БqlüŒ GŠïQ¨¹ëÒ¯Ò/޽8‡vôGzF7€;•xzõÿéê4Å ðÈËZcC—²5Üv°Q§çéÑd9מ{˜7BEŒLc¬«2#~i¥$˜Û”Õ¦Ú¶ÄïÝQÂmaE xëâÍLbªø‰zÒÚU˜ê& ç’0¿5€p‡maþ)Ÿñû«õƒ]r²9™‹¥ÞÃuWc©•`å<ññù“³Pñ§d ½üÿ-S7”Úà ….<:$NŽÆÅ®þåâÑ6óëk?[C“srÑ|]êXY ¼yiQ aa,tÜSš÷Ͱ+Æ9ºøxÓ{¿N+ïìþ«:¾¨ÏÀ¶¿"Å«çD7°¨¶öåTbUoÉ3óÂÂÈbVˆ-ÏÓj];‹³ïYlxa¤0_½êÈ]þvÔ†ˆÕï¤äßqv»€•5´&e|ü½E@>oõ[È2ö˜wÐÊ:âàÐYëi·5yŽ+5×Ô$üÅúNI¥ž~²Dk'Oêb³®cY{†û<Ãýèfð’³ô«Hçëƒø:t­ «ÏSìä‡ß!®ûc0ôš)Bù;ÿ.¬ƒ>§"eºÔÏÇuáɽø†4'W>w_$PÜbl´«4ñ˜pÔ€T€¶€Ïb彘ʼn>šE6£ˆ“ íÇÁPÊU¶×ÈŽtQáæn ¡ö»ž¦åÙ „«ßsG’VCƒWìJ…¼¤õc41Øo@"³jë!˜•¹ª¼6 —±Û†m6g櫼5³PÉ®¢'KP³»ÑV`bn¢'?®„Ö(à3Éi|BµÐÂ^n [êèz²{=êtG2!Ä·F×~÷F¶ù3Çâbÿ› ?_‡ÝÅE‹7¬ù³Ïö£ ²—_ö]Ù¯ þ#ÿ­§^ˋ޽aœ p!|–·þÆ[’Böž…ùždÙ¬·¤†ðHm×¹[aT±:ž½ü= ¿ãØäk+–_þƒW¯†ë—¯°CS|A¸òpÀÅF¬ÿÈp“Ê/œŽï–ä^Ç¡b¸[n1&ŒÐlª_³zF6Øv³ýšë,Nê³"_çºÍø¾/Â(*xÿ3ÿfÒy*‘瓮ݑ ~rq7•VÓ^¯c$H¥2ìu3ÑE•­^[kWîygÅÈ#²>Cµ Æê&õñ‡T™ j»Çßæ]PÐ'÷Iâ+Úñ(QI\Ã60‹pVz…fë‹U¥+õŒ(ä ã³ñ=‹?¼¯£Ô´¢ò@"#”×Wsد¿(ðšN,;Ù`{+–õ0u“}›S¦Û3@ÅnÕÛ<ÇzxðÑW°uZƒÎã£HŒÔ³³õ÷ÖÑ1Ç;\ξï9Ø Æ—?¿ —Î÷_iL+¡lǵôÕ³¹H}SkâCÕœ@5\Z»|t÷±ý%ʾg@tÝ܆g÷£l ‘ °äEÄæ“i 3D´×vmºyR‘Õ¿/+î©ÙSÈNv¡–¦ ²J)VéˆÖJcInÀ±,R|’”Î]A · ô–°ÇK7‡–¡JgçVš; “ ̓mÓu(y|4< ò‡±"é ç™fë>© ZA—s³zcš%1z:ýª³ªqžý‹h‚^)²¶/^R}/Q%$ÄcŒj2äAÓ°c ÙwŒ²KRñ²[<Ã.dtgóÛ&¨AÅ÷!ŠtKÃ["Y_hQUJ;…ú­± !–Œ0a…µÀ´ë$ƒ}`y #·Œ¬IaFÝV%1£žõÃEII8ã´½x´<Š5™Dsû–3Ĭǰ‰›B)E_Ò)`—eõùĘj-?„"àr‚À£téÄ,W$<úèÔã9‡|ç<ïž+8ÈÒx:Ä—a+²ÔüBý(§Yøœpo_ Û6†ûʈ[iQ†YweB#9íOŠƒf)tM*»œ;¾·:¾º§á噃T-˜ù’VÚ{A£2+ùlÕ,ôSÀExZù×l8ÊÅÌWº ª#4GR£ë·úQœÀ­c#ïH¹)>ÜöÖ&{‘Ü|4S)YÀwÏeáåÿé<´¡6y²,†¤Ø‹;ý‰+Ðì";`iÙ‡Ú2(Hiï_ÁˈÚ2e æydÄ옸Èÿé[×Ú@X7n@çÔ¤C¿èÖd0éÁ‘{á¾÷^))ŠÐâÿ,è÷13–ö£åŒôš‚ó$ y]¾o”õ‡ö Ú°·# 4„)¥öCiE µ®QÄ&Ãaˆ§)±- 9 9¼lÛŸdcc8éÌ?>ûH©ëÈ9ußÊ´×CÃ’£­žkÀòž%„qÊ4ø"LÎU¬b!ÐùdU.G„ÝΑš·½A ÍO8JÃà&;ÆäÔË`­¹%ªgæÖ€¨ ¦ xùÛ—~{!9“ºî= ™Iüe·çdýJVÎü"×¢ëƒØHÞ2âaê{í—¸zç³8µ¯Á»T"s.éÉœ+@’5fSL¼ïpqf@I‰ëÇaÚ5_ÛzXêÈ©3–yWøWΣ=û®9wÖt¯³•,±ë­ì×ݱݛ¿ó³ÈôuÎ$®èÇý´MóYÀŸ#ìs}®Kæ£Tp\‚Ÿ€üñ¹¾‹¡o]µi”ëz\i™®ßúë_]¹ðû2ÿ|ÈN¿Å,|S üu¤ó¢tðŽ7áÙ(EÃ÷™9Rœ<4M±é˲~’'‚¨çXá¯Ä¤E`jÐR¢MìBòoj¦­®Ø>4t÷h,†‹…—ÄA–(’,­Æ¬»2<ùÊDÝu û¡­ÏÈY b/ON—Kvs9)CzzõJyÝk@˜>qÿrFy[oûWãùÉèB5MáÙ_Øê§ãé—ÕXèºá zãccÈÙ— êÒ0¸ö5ºàŸ­LE%´¨jRÅ>#­á=!=hlNv IjM€ÁÊC³”Ÿëak Y¡Öõ};}Ž" Ñ¢ÃÐF¥‚«YQèÿ³?ŸÈÿ&ضmôJ} f#Õ~­:“8ááHúº±S„Ñ“FÈè‰AÄV©9¬…²ŠMþ6Úšö·I­¨]…l*[é]b>T—¸²¶Z|O‚˜†,§ÌñŒùp=q°ó­ KÓ¢ œ2aÉ(_Rkhºâ‘Ÿ'ŒOʤåYÛ°Ô­P¦¤@Ãb¥µOX•òÃÛ;â B8AzB7Ýh¨‰üìÁï SŸŽj š’ú6¬ùkP½2vÊY8Ï'”Q(ØÍ3Z†]bV<%“á–@¾˜É,2©NÍT¼7’6JÏ8=•¿¥²³®è%ÑE*çý¤9mOÅÅ2ƒ¸5ÅíÜfwB;†ÜrÒ,¿Û4•0v<”…Ü ¦BÊîq²é¼xB둞`ÎlǵìY ¦[ŒÇÓ¦d/#öW´¿Ý¸…£þÁ´ÑAõ93óâY2¿Í4vQ ûY UÃàÚ™%ÐJ™’ 刨¶RÙ7MZÊΔ1` !{»gø.Ñ ]ti0\?u¨q_ˆòË_j=ÃEÍÞ†ÈV†éö·Ä¢žó®HjJ‰û.]ŸŠ…ŒÍd©#³Å¬ýH±,úåšpjV¤ñµÃÕ]üI©­U?ÚBíÖT‰þ,¿S¢ÿÉü ïþVTíuÿƒªeDˆÇMÛY§s:÷çj‰ÈSW͇gYðv²¢ÑˮϢ`呦ϩ §Œ.rœh¶ÈÉF4]$P¬“sàÓ|X‡]Öîš5ž!N]ª/ÿuˆ£T>@»Ü·v艡êbŒµù€¶ ÿ×uTŒ8´ÏÅë¥n¶Qk 1Çè„¢ÇK”Tÿ8{ÈòAãv9U¸¡¥”i—‡çz6ÈáêŠg€Ä²½Y°¬5 €Äµ@êP»wê’•1°m(²%ȱh*XŸ¤©ª¬ë,g)ÀÞL“»Ùè:È4Å^ÁÀ˜ÜcÄßNt* &ó&mÙïêÀµ÷8Ù(aòrýÏb~1H¨:3dB°¹¼ Lu¸¦u¨ÆJ{t¦RÍ0Xœ:ªQ~Ô\ †Ñ6>C'…$ ;<\¡Ñ1ØüGzõ¡ý®]ÔVžŒ®¶?Û¶qØtzð&mëfµÐUž"_$i ÍŽ3Æ,Hx§Ý´ðWJj(B9JA$¥ÅSÛrƒ¯»)ù — X9Ö*¾6DO.9sÂ\0¹?w®ó¨dãeòxZïjô×¼†)±…5 TŠ.¹œ=K€6ÝP±O¼ ÜpdœSÔNγ:–ïäbÓWR%4§ðb@ëUc1Åv.~ýJ­ ,å+—dÚ¶ÚŽôvÑðeþýâZ™¿˜×I‘†lÎÈIŽW*]ª”‹Û!Í$kl „M‰346mÌ Y®µÔ4Ûq­Áÿç;Ë®å îvÇÿ󆤲]ä™á䄺êuíf,-¡€äÂWW×hÆgë >ãä„ì°«Z‹\6¡:)¥i°À®Mã #zXœ!àÕ¾,ÂY ^^Ý•ÛˆÜ †«"ê"@(¥Xìð!P!hs&×!ûóC™kètÈ*A¶¥ÛÆ|/“¹i ”>âÒOU^¼È-¤”rf®su!³_ÎJz ¸hB‘¥ÿÛ‹»âVÍ\|£ ˆÈ@ÿ-29îßRnÜÌ;ÙÅ•F,gÉKCÍ”äNò@&qûy¾š÷odU[váä[µrÈ_õçM&R•ÎÎÇßJ:PlzwSõúó“]¡c>`Á5|#ööosý=¿io þýuÕdðÜ—õ»npÒbÌ‚ð|)¾4²3ù<’(ǹô¸'1]W®¼\+öØ—°1•MçÏ}4WôÄ5ØCÄ‚hÅmÛ]3UáŽQÎÌè/Œµ‡¬m¶?Øþ6Ý`®»òº0û¼?žs  ‡ÿwìvråæ `››/lR¾f±bwf}LŸës}®Ïõ¹>×þšÀîŸëg]›l²}†á†ëÑ[4®”õþ®55<ç‰ø 3‚(|„à){ü¹>×çúÉ»ýñi²:õM×¼_8]ø¸›úСh‘(E¬ëN«)n:Më’&ü+½ÊöÛî¼3M`…{Í2C/õ^e»@q1ÐZ¦éªØ40èJ9sÿõP lkT ¥O×p¥*Φ®÷õ-ƒ-$VL§t?I‘K(çL |ù¸§@ï B²\;ÏA`óïå pXO€×1šï­pãå½4Hb»RÛaÏôÑÕBÕ¼õ*lì„õ–’EµFr¿/u¥ d…Ó÷&÷66È×טÕÍ=2Òu $©,ßÛ]):§¸³!™ú‘¾“u5‚®´Ä°uu‚†V´5ôë;¼ÄCT?q¿õ3ÝJ³IȽ¶jÿáìd:¡0Êйíû½”vÓõž$Ýp1²*–zÁè;U9~»ËŸ{†Jœ8³^ °–˜Q½d+c «Œ™mþÎcv²XJ+ŒJM5¾."ÕÁÚÁ0­—H«­­*†bäRGŸI¾'§îEaºÒ%Z$÷qœ‹ÞÌàœ‰&(¦Üê¢ì%‡ >ؘ¬ ŒÏäœòè‡N ¦z-í.(þ^?p_Öójvû†V»½vKqyb ‰›<Á[[ׄ—o%™¾’,”„=‹náw7É'ÏGg‹Ë»l¥¢Qí¶·jØ--/ÇéÜ*9²³j–Ô×ÌDåË[ÌíàRw‘©£îJTß½ò’ó²Å›9­ §»¿[äya\Ï? jÁ½×÷¤Už”—MWXfZÌÒkCrP¥ý‡\®kL p£c„ˆÕ‘º¸gÞÚ•„Ëì~:)Zt4tÝ߯ó¢·ÿÙ*4’•óaBñКÝâ—À”@Z)”,÷òÿ¬Ê]³ÖÑÒJ$OK+K%Kdá$ ÆTj¨‹s#Y­³›etvìP½àzG2¾®ô™ÅQmTOÕN«¤f¢š¶ë]E¦òn‚Ž:\.HÔ¼^‡÷À"‘$½Uë³WÍ?F¾Â”p€¾¦:ñ  F[™¢|#:šY º-‡³G†m58Q æ9ªDw3H¥ýî—J¦ÐJ¢’Ð%ž¤;çÊL“šZb8ã[Ffx´­ÂK.ø)ê´ED^ÿ²yùoÎ÷>³Ár£T0+îT£ÙKdÙªlE‹…4¤’Ø <4LöFÚfTmŸˆÙkžgŠžGKÄ„£ÅÀ,ŒŠ éŽøŒFî yWÏ üﺘ¼jæ¸+¸ð ¸¶Ï/Ävzœðã–Ã-µ`LpÞ0W^Wó¨fX‘ <^õízV)í碂J]æí á›óÛ60¬wtÿ$¼3P´©u ¹co›&¨¤‘w¥‘+hO:Ô~]»¾cÒ]š×)dGÿÿüÁögŸ>T#˜¢²iÍØ‘O´ž‘-HLòèœ0ç uÜnÕ—\†×>3D1ãC¡ùuEٺà åº61:?Ä0@1lCMŽ¡ïÿ >Fe–ë£Ø™<>41iÛEøó ödAv²&`ç,Ê‘C’ë «Ì.f”×±¡HÍÖÞÓÓÞI¸Ê« ®ƒŒø&á,G 'ÀK$)©ÓüñcÂ*)€È"¤ÑžÚxšsËç^†Xô?dµ§)h“37ùrœ¦CÓ…$MË©¨æýàUË\ZÀ¼=K÷ýh ӀسÈbŸ.¡cY‚Ÿ´–êˆæa&I+öD¾—ä9€zib ‹5¤Œa V#ÆõÑIÃññ$4E(–íMjê´—íãL ?¦ŠtVµFo‚ F‡M v½»^LG}å¹/4‘pƒ;(3ª˜ð¸ v fìêÉÂii|÷­µ¸ö˜’Š™QrÁÒ@ÉÜ'j?ƒJŸFjàÊ8ŸD…‡@þo­¾–ï8`¸?[bІù ¹rd¬ñ}áÒo6Ð˸0ÁºSè_æ«ÄžH Ü WkÔLã¥"KsÇ.`êWÀ%æö„yT¬± %*=Q·¦ðŸÔG†ºa:Yþ¹¨@}éÛ0F˾ t¾'ÿ˜d;HkÈ›Òç3 Ö.ð‘Ð㱇kõ=Žn@Õú´du ØgbòX"xݰ”tOÎ7­¿#¬¡ú4³fÈõ£&bf`¦”@Ý¢F iÈ|¼JÃଠò¡’E$ÒqaR>¹zˆü4ÒyÔx£–zJ”ýŠK³\mO‹‚ýi£ã´xÿÖíê5ø=×Q úv¬Š’“wûë£ð­®/ZˆXwY{û«9UU„i@ÕNvÉ4o§{@$b¨àk1×uEÞÔº„,Èa!'OŠ£»Ÿ*§ÀÄ)ŒZ6{ù?þlÛÁ&Ï.‰3«ˆÊc[±OX8sÒò•Ö÷ž¬ÍOãîg ~ƒýý¬ÜÏRùïm,T…93÷!‡„.ÄÆü·KŸßg àç‚ÕØL#¡oìøÅûsªæõ¾•0ª­1·¯S.lÐï~„åF®óz¿v×(n°]Ë’¨ùïþ’0þ`'„¥oe¡d„Š«Ý¶…ý¤!ìi­JCâ?úU?dƒ¿2.}ß´zQ%^|Â4À‰ ™4k´ëïóWóžPÛLƒ6Z Žã’ûùPÊ4:lTì±Bf…H{Ü ÈO]B„WK;Yp0˜|žAö áùEÄuXXWÇGë ¡€ ›áøq…%)ÆÝzxÏd%™.¯miBœ-´HÄ2ÐÐI-`É­ <ü4)ŸÂ´ïEF®tB³ùÓ &ŽQðß»ÿ #„(™>g Øö2¨­çòÁ¶íì<ϦègÑÍž¸õD®ÓŠœt͉)އ/5Ês4.´VKH5hœ4u¨$¤ñ…‘KÖ3åF=SÑ2uÕ>sí6q‰LÆ^Ó`ÉX¥Á~g’j,‘iï¶Ò¶²†!Í?QN }@?½¥¥æ•@’ 2–þY©gã¢ÇsotÐÁ¾©§…„£È¡<¢_þs¿{̹’Vužóª×>}0bG÷'}*UŒxf柭›>±Æ²ÖƒY]5|÷ …R7!_W ä?§ôµ-½ P¹‰Ég8ÕÆÒ/å"y…ˆ'd¨úHzU¡¸ŠÁÕ’SÔ/ôüð \"°œÑŠ{«£æ{ab(ŽšVÇP0ò—Ù—´\õ>Ý}‡ôy‚©ÌÚ»ª„3-ˆ&™‘%à’éÆâïrÅÞ]Ú\°ÞtÍ.®Š>rΨ(ã@zñÌhA…(R—ßÒò©òÎk$*¶"oê=mÍà"Ó‘UèÀþ›ßÄÐ l H}Ýu?-­îس7ÌÌÑŠ‰pg÷¤¬g5·Òv‹f;Ù;®ºa±=ˆÊF©p’ ’OÏ‹¸ð=ŽÔdD ™]ˆ=õR$½&n Û±ì*\ùÿ2v€¸õºRt#´ÜûG3!2i â¼T±]ŸÓ"4;Ìö¢&§[ðñtO¤¾C~¾wWéRûŽìY§jÁòŸ ,0ýÚsˆ“W1UÛ¸ëñ.ßjJw¥t&m5EÚÈàw“Î/ÌZš&˜áó '"6q€ïš•ÏèŸÃÊ,3hÂ3;ÑÆ3¸ßråÖþ°XpH9£ÂXR› rHl=GÈ–£#ËJ€/^Ê;ÛRJ2žˆb8AÁòB$qîJLгãœ3Kq” ô‘Á(׫¯±Å¾¦Õ2“mˆ±0¬†+÷zKãV8búg¶›SÈ…£ ¥M0 ŸÃÑõao‚Ý<v2± mwÍÖàš}K Щó%™"äèœÇLýcí_HÈýßt=ÂÇÀnwÄŒ–’Ç£²Põ¦8 =Õì»°¼ÓÕ›á>`—‘жŽ#8$>rBz6Ę¥„T­¸–-N"k ¢²ŽsßÇ“¶¶£š]† ʶMÎ8Iæ8@jEÛµhý¼ØOíuÃåh jìa2>?3Øz xÓ¥¼YÏm;ú¢êÅ%î8?± Ò .Ñ™x݆ó!𝧠yüjòÁç“É1ù ‰â@"Ͱ@Q]…ï¬kL°>¤ç+¦Á ›¥¶ <ŒŽ7Uvnö^ùæbžËY´0üáQ| ì–îMÒ–jXQŸ›räÞ{LF?³ ^rÅWÛÅg$éˆëË0L‹Cy,d(­ã×V Â[f¤ VDåÑ }*¡ú1R#©n£g›.o«k@}0Œ&ÖÂ÷AJRîéCêð¶ùéî,´ÆèYج"gEé7YHôÍÝaž/E†E=Hht»Ò(î,¬q Çbëcx%®Ý)ÍÑÙ¾:7R“å?¦¡zmÐX¤Ž(/¢QÌ-HIöËúTu‹!~•ÆL:iy{H®ý@C30ùL2#ŸÜÝ݇ÀH£™ÌeGß虌º]-ìÝ ÞgYORÎìé‚|¥>m1ÎS晸ã¶;ÌMŽ-¢³9†&úˆj%ƒnÓ’‘4¢°u&àYÅ9æßï¿B:OC:ÏáÚ©‚×Aöl‡„…Õ†ö6<©§ÐšÒ(vOƒ LÀÕ‡ ìáŠ]ï8ûPý·.«–¦m(×ï "ض¥}ÒŽísÌp»ø´U»ßrî›dÂùkTX(CK‡V¢‡hTà) ‡žA/ÉuÐU°›lþ4Œ£»€KG…¦–àc, eàK ˜Y×ýˆ1| ³W?MZ.‘ Ë$vÖ’¿Šý½þÐÿ• o¾ïö~z‹ï´Ä~©Ã l2Î Ž?XFv°x_Û¬€Œžz™ÉŒñZ¨{f蘉"¾tëSa`*ŧŸ³–çn§éó,;¾jÓ¼|–Xá¹åò/§×7Yòö¡:5+œÒ#ãpÿ~ù³"¼š›… ÿù ÔM/ ß±’Ó€…8…k†tÕŸ©ÿ_[ܳ«\2ûÿv É“7)Ýp|¾ë:ó‹‘B[廜c¼h5rÞö7§;.…¿–tþÌW¸Ìñ 0òÉ;xýÖOψ÷ù£€ú倪ç£â8YÚÇMž“T,|®w²F -lán^§¼ ÍY9LÉ”9_تдùrÄ,`Ò^ªiÛÅ…ºÃ¥gÝ×üïñØOÑM×S/Reki€roÔL yö®d榢1éùie·'ß $@Òñ”L'L1D5›Kž±Ÿ¹¤èƺê»DÅ/ÃÞݳ–-ú¯2 ®ËFayŸð Ù6l°aÓš± TýYu%bè)&½ÁØ[¹hžñB'‡exfž^ƒ0óxyÖ&ôê)ªÁ/ghEÍd†}¡sQzÝ$8kg^…­ynq›#ÕÍ~ÛƒóˆÜŒ‡Iþ·VÚ'i…: P:Í­4 lö¢Vx£SïÔ’•ÿßõ€ýh— }¼ËQ-­Ê¤{¦Œà§ÞLÎenIÉ_0[œÇöVËw ês X|7œ5*â `ìßkSÇÊÀå?ZI \ ¾çö`ꨌŽ:ŸÀˆ1ò‘Ô,4(WfmP«kç·Ã±›e¹ãŽœ…÷-¢lL˜n1Ìêš+lKã$Õ躎¹L1åŒòІBŨ m¿Ý8*'wˆŒ\]¿« !ÄEdXí›É:&ã]óÿXøõªÏ;ÚŽ~tÂÚÓ@7˜ö“’\òJ V"W»z•´+€ŒçJ*9ªßE:ìʇÜðD—j>ˆVZË8\^aõ,_¤Ëû)ý‚Ñ%/ÙÎÔNv¬ŽY½ëøÄßô÷4,-¬ÇãÝ^L^©U·³ôËp¿yħ6™ä” ®ŽàXÏCò'† B [ ¶”!DÄš­G1=Ë2H ž9€Ç^µ)S¥Ã6U«CÑŒ­{êFm_C÷íÎÒ^€Ì }â¥+t„Ò+àýPPq‘ÏÚ€æVS‹Ô9¥ëQ!‰·eŽ4ŠªPX0`oÀ<Ì¡j£EeÛ¶íO§êÊ ªÊvçSoZÆA§éÜ¢b¤gºº¡è ·•Bÿ{šKE8mu Õ_C§5’ÅÜúÒQ­vÍaƒ~†ô΢¸†w5îHÈ€4ˆU±¬þ¨ídC`ë‡Eÿ͆å¯Ì€6»É¬€ Ä`23<•ÞÓÒà­†ü4m†Š'‹!¸TëÕõ½3pÀ~Þ=œa“4CU@KÐÝÐÕBÆÇÀ‹CtzAUïÇœÙ1ƒðn)ˆâÞX7è0) PÌ”p™ ßý-µáÙy†.–å±È@ÚH±ë%²òpFäƒ8Ã}U3‚>ïjÇœ®q9„mH· ÌaF|°¡ŸÈ•;¤“ÆÔaò67ª]l'|<¯™"†R_&GdD” ¡§ª¿ÖÞÝ:u=[}pHU.4>ÒøV&žv\oá”Æ’d»ìL9ï¶>aÆÔÅð´˜`g)ÿ¥JƒË­PˆN§Î$ 1[rí¡ æk&ùƒìn5ÄAÙ œBfñ§UÕB‡pº Ð^.i3P´ Çlï{JæácE/à\;8XG0ˆ¨JDoàÏÎÝ6ãàCoŽ€!=‡—Î1aÑ·û ~Ÿ ŽH[<ÀD#“ìèÂ\§'ž¢uXAmr/ò>°;ÖTgvMsÜìŒ=ëo3óÎÿ Y>Ì–|œ$®l¿ÔVÃH¨ÅXþ+š¼U§ïà”•§ê3a²²/Pi,¦m£’K2®uàä-ţʘU•éôfÔx§®‚X_¾ïëgoìH¢³áf¥Aôvg½ø‹SÕ<€_:ñÿôÜ¿k¾æqë"ÖÑ«|èéÕh5ØqhåÞ7þ‹[^ ÀÞÙpvrS$g¥àk ÇÑ7e=RgýŸt(—;ðæ±ø/òSõ~‹¡ë®Þ13È­mµùÑŽÕ4@üóü“z ”¶Õ¢ò–S曓·gãwj«^äŽzãKáóú÷o䲯m¨éyçh¡Øss˜ öªb,Þ7t˜…ka‡鮣‡IcH°ú)&‘¶Qbzþáñ0P¾‘S'*ôq5)HŒš)˪›Ëš.dOÿ²«„u}:XYÒ˜l¥BWÛ®ˆŠ¶ÆTŽ9Šã!dlaô ý„(=WÑ©r¯¼•²K›ˆ@„·g_Î6º(EáHö G¢—ÔÍÂáöB‘mE¼nv¾¢bïQc®©žRiÕ"Í»ÿp~ÿ_lv}¨G Ã7òÃðe§še|ck;¹dÛùÒž¬þû\Öãhè¯Gä]õ <ó ®œ{'„jî€FøŽðõßyÁoÙfV#ï>k ]M¦Š`ÿeÜ],G\8q¶1Ú–Ã6ò©XD™ÆÅdô¬tÀé’~KüA´Tí©°y1\¿$gŽ{ûÈK!½# PÞè×Le/Ǽþw< ï¼Ù+犌U°B½aÑ|®MÒ͸¿Ý­s‹Žpìðð€Ò ¢wÌ:_¿‹)Í]:0¾Ô͹H™¼˜K30 \xňí«3ÇÙÇá¿f½µj,¤HW‡þ±H+$®iâÎ=€zQ Õ)24ÓÙÿ}íôüõ¤ó«Gü{(syÐÌ{qç…J1ÜaWéºÒ=šKF-®ÜgÍàÙT+ y„ªªÙ7ôîÞµßù»l‘qúø÷&ÓéC9 Ó>3Õ•ÝÛG=¬f_?¨¢Oµ)P±±(­9ð¿'î†A=¾ºsÖwU¼—Lo˜ßÛ»„Ûn•0 ]DäÁ^Z%C¼dE,¥] Ì‚·/ßÄ …AËY€m/èGåÿÑ® -NÐ^ÇpäOòM_ô\L.Bí5þµŒ(ÔÞ9^Ýj°€EîÁ– »p9D(ºÂõ¨"]µì,G)‹Ýw³‰Aè"ÓxŠAµ3¨j¡€!;²ÎqcRjÌ„ncKÏr…“MÂlˆ7lƒÄJÅ6<äF' ÃþÇÒÑ oM:ó¾B:“ų”áŽö‚µí¤v¤è9çz‡#+[DŒœ°äX…ƒë‚ÏÍ(O¢wfßš–)Gw»fQÛtë#-B4)ÝFÍ÷Áì÷RÊg1¡2ÊG´ÿ:’¾Í~L(†¤ñâZFu¬'Š‘wìµ0\zt@öÉI é ÐΊQU˜` †c¶ü 6©cæ3ýÄHÜ,{Væ¥e7¬¢Òõ;Ù wôá_*TÏ:î5d }ꜼŠaÆK³™=Ÿ¢*ú@„âMÒ~…Å ý„7¡S{Q,Â1Z«ì,¡Ñ#ë¦÷Õ‚ Î§Ejž/Ñ{ÞÍv@ê !óé=›UsOº;uS?Ý/M±vd£A¸÷4`¸\&øoœŸ2:ú ‹„®ð”ÿݧ9àE]§ÏPß0aóèó(:Ã[eR„•5€kÐù-PTÙò_ZÄíô‘AFêÆdΟöà{kÏuç+ñÅ9iB{½bãÍÂIqF?Û‘XƒþAÀ Ofø‘ ØŒWÐP_ç³Tö¨çT³g¬ü®™åЧT¡M‰9×È"¶„!ÃIR,F¾`”µwÊúÎ6SBïˆÙ"´¡†añ\¯¹BÖ¼APBYù»Z«:ðšÎ æœ&g£<µE‚í.]„¤¼á{J$·\€]`Œ8GΆ„(´3<‘^Ö§â}Úã&áMÊ100U·­öhôæ´MwG ÎnÅ`å-ì9+N#q¢¿Ãx ˆÈѾ™^%£ZK ®~¢Pb™¾•5#Ýž@bš€æÿ) ¹¾%P@ ßšHRÿ_kÎ`îsF`OÈg0è<)×VØ)­ö@SF^ËuÙœLÁãñÿé|gŽó=ÉD=]ò‘mÚ±=p€$ž{™n¶Ìz(–ýÿ0ÏNM:4GH,¥dÜÉÏÖʯåx¡púFg;>×{¯/¨'é–ˆ^ÿ *A?ß1œ4·e& „êNwçkIIxJƒd9Œ'6ò\-Æ—Ç2#5ï„Æ1ÿO}˜3M„è²½ÝCÙðdh{`p‚©†¼C—ŽžVr‡U'ùYäçÂׯè‰2ëäYTMst—:áÎÈÓq}[8™Éi ÖeV„ë–Å9F“.UQùL!Žc’ÒˆŸÙÒ{EÒ¬XÜ‹ W/rÆrNµëh¤¨Õ%ôòúX áøåKäša?þ6h°ùÅû}‹ƒ‚ʦ3iËÚ:¥`;Eëƒù_#å`e”¡Âd ŸÛKŒTÄÇï>ß§  æ"Žÿ° 5#Ûþü«—Ͻ"dÊH3Ûx¹v>áèÔØÃ‹Ì«¬øº×q¸/8_+¸ËªÍ?Š—Ç:Ûp“†É7ÿô—Е̠˜:ê0H¶`¦pÙ+8Ùðâ·ž=ŒiºÊÉSoŽßl4m_óMÎñ±áV¯îb@º~¹ôàÿ¶/:Ž_5äÑåOwHTU…AgËÿÛ–æJ5¿3üÉ'áƒ&éÏvœY<‰BÒrÀï#—¤(¡IêpT] èMFwvÑRÃÛãëï™ÝÍK{òeðßÊ2°ûñ6Ö"áØ§Ž ÷$Ö²» ä2®æ‡ˆ”OAëeo €Ò´N‹š:¡®ö†OW趨r=}†Ú–Ô^I Kú_ÿO6ÆPjMV‚xÛ3Z ñÄ  ‹fìô™Vô¶’KWÌôÜ*¿s…YüÅ÷<·…øÂ3œr›Ò¼Ú?ø—\"¦¥ ý#ÇÏuøŒÂçzK<7NÀ·ÉÎŽWº ¦·>Äš^= w‘‡–e¨ c­6¦.½¼‘g–8BaÞ`?©C_õ²¸=Ÿ›Æu‹R·÷†B¯zmwưßÀjÜú‹™¤ä÷0çx Þy£.?Ï÷å\û\?Ûùù·‘áM¾Ï¿y|‰Í8M¥ùŸ ç·çY*tL>¤f ýåÞÿ9ÚÓ;·3žHz1¯æçf¤¾è8}r^!FG'eŠûÿ<¢Ú/S—²Ð•fuO\eä7=Zgî?:9OÞ»î‘4¾À|Åä—¥ƒuÚ2Á:v°Të§ ³CדSž`™KÖR&UtA–O¯ï.Õ?l”~í>—Lc6lƒAÒ7«Ÿê–€¬æ+`p˜;wËq8&ËŒŽ\kQ´YT §bíåÛJdpæNûÅ˜ØØ}1›KÞ[ì1d±Õ'‡#PHàs¶êù)‰Ôø¬²” œ¨½¢~"èæ}ÛµâÊH¹²Ã¢f®åvwÐNîPŒ’"€2÷‡!Ùð»Ós58‚÷£¦SCŒuŽáÓIÆálcJÓ4ø"0 YFy|°MLÐXFæéëRZ^Oó„û€`S7•óÓyáÿN‹ È”ðísÁí–gíÀ$2®<ôêàªÛmîhµ¬ìv(Ú™IŽM` /*©™Õèóeƒ«4ª^71¹”Œ¥KÀeÓý«b[y{§žÐós3š.¬j¶…zšŽ/6:Ò‰Ð!4(‘)7HOH¥‡¡àŠÍœnÉW«u›ñ;lÑFÏÑÍ%ЬÓZï+ývúë‘S?餃­›¡†=ÿÎE ÕB2ýÏ”^‡œô\ ÞÑ8\ÂD›sÎqf»§¸qï£X·0ã6‰Ýê…€§ë`X£tð'yÖ‚ÎëíºòM$’3þHç5b‡Ž¶Õ¨ÄPœ0Ü0N&r"ú¸ì–ü½k‰+Íl¦Yà©® ))¯c©Ÿ@½gd«=ã{æõY0¸'nMü±œŸW“‰gSißøÂâj{á…ˆ<©Çḭ̀’ÜxnÑm¶• 8bmHsÔlÔ·|¤¹@ª}å!($l–ð–TµûÔXa–Ô¾2D ²Ðá»Z –óŸü™!OôÓ¢Õ»ÅRÝù”½n U‹óJ‡Üócĉ¶“8¸öôfµÁ¹àŠ9ÈIøt³ÅÕ­…òÐ#%¨n;pŠ%§¦ã>nôaƒ‹ñ¯E«­iÏÜ>á·¾ãêœ3£þG±”ëŽ~æ¿äþ̵!Ÿ‰FàŒp pð `Añ¯­z&šŠ¯ Ã3|äšðhL¦ŒÒgàò$Úéo ÞŽÂœWOç—æ˜ÐûH< ' †&öª]G€ñÊH³~GTË.ÄZ²„5 -r¾Ï!36l“bX9?0]¦djî¹¼ùé§N†p/ˆ`ÍM9Z^ï°˜ˆK8öé‚ÎÛ‰ FGQÆ8¸3¤nT87gv¾±`²tÙB^Aâjÿx5Uƒ.Àâôw¿¸*`º2Ü8²˜+¨Õàd¶Ò’íû±Wñ ¦+w Á·£RƒP=q0i(W]ž8¶&‹C¡I÷Qbœ^¢E*a»@[”‡ù+"‰Œ¨pÄÌŽÑíÙÓCšeH’÷ˉ§<ßÔP¥#Y}­d•2ü-öŠcìhLe²V{ÚµÞô?Щâ,ÕçWÙe§ëR¼šDæÖ F¨ïÂcÏzÈéT%=M—*®CbçT‰ëüÌçê.5NV€¬Bôo˜3«£Ü¾º”ß@ÿ¥(•ô09òô»Þm+;â#`°$ÍU›M·ss%RÒžê ^Lt?ÂéA­ ƒ^H!l¹—¡ÝŽÏc:j}36cöõˆôl‡5É¢Ö ÅÏ®øI1çe,ôP¿Ñu÷&gC­øŸês}®Ïõ¹êà¬ã2$¿ù³.ŠÑü'&"‚m“Vd²,›3œ¾‹l!Y ¿šXßÐ[ÿ‡#ƽ´õO3²^Ÿë[šEÝ?‡8äk¶U¯”RM¸ü ß¼ø\Ō޿NL©¸ñ·9«ñ¡ñüVK~ éü7÷QI™’ó0ïÞ",÷æ.¾~’tè²!êeo`Öò<>'-þÜ«w  j]}¾½XXw‰êÌÎÓhº­U¡…Î?#Ïm[Vô ľǼ¤ÇHÊÖ¢LbûytŽ¥ŠgѸ´/[{•ˆ°‹“héÒYc(žÏùP²0ôõœOÊèŠ,Ž†Ù˜# †Áɤú‹ÅvË£“¿h³CµƒÁôòäj5ãû6{ä^LŒé¦lw@ãé"å¡x t”Þìš³fÜa.l­)ª© suSêr“¾РÿmÀî~>ß…`(X,ÇWájRq°.‰V-]4îPäþ¡ÍæÂ8̽rײרß×7e’æJ¥´”P±{Ú¤¹fU?ExW¯ï“ø•>mªúxäöi¼?­M²v°Ä;4}8•ñÈ;…9-KGízYC_L•ëÊ‹ÑÄÇ:B·§´½û„Xòëå†Ê5½Ý‹0lH·ä=½Î‘£ÍN ø‡ã´YuÞ…\—ªÄ¦ÌUjÕD[)¤³ERÜ{l`CTb~œŠ@F ̪ʓÎeÀÌ„Ø2ÀÎ#“'²J×ô JSX =zóš²}ð:x:"9]ÕÅ¥H¶g”“ùAÇG‘LÜ"5FÒ)`žŸ²Ezç.³»bÅcŒuâèBö9ÃN§€abSÖ1ˆ9ËãnšT;!£'q;6¯BÌrøà Wa Ðî ÜÞÄÔlKWKòxpxênÇÐx1‰ æF(žJæ\xM“Sœtã„eêo±J}=¢s,7ˆ <¬ÃAäȸ†¸ïAñÇ_);~Hgv2#ÈŒÏ7 N¡ìŠÉ2ÂΞcr÷)Lï»ãüCG±ÑÏh7tžš„eÓä‰Ó 8芪 ÝQž©1N àL>"£_³\Šug?Àzަì)QîŒÌ‰a•ž$8¡¸î‘@ ·›š/7ÈÍâ”*N6kúŒŸL%ì?2ÞÄ\éRv’2¥Pnv½ç2þŠàémµð;ÖzDSãíN¨ ™v‰'Á¢…7Í.Ñò YÀX÷sí° › tÍØ–Ö¤’Ðn8 æpî…st@KÔôJøkEŒ{)#]—|>»jyGk.ùÛ!šö¥ŽÁ©ÇoL§| JÌŽ[}F£)‹«Ž‘#æ?·éqéªüwƳþ]£PÝ ‚NË<(ÕSíï‘Tî$½ŠhpD[K‡ib—6é|7ֳׄ0©ÛK{dá Å ¸åFÁD‰^u'ýk~-Û±JwÊt"/×¾f1}8ô?£Ø¢â­§ ‰•°pœ„þ-“ƒ¯,m~¯òÿcȨ:‡roRæß§…^ý½ÅÁq*§símøóRó ð…b:D½€i¦kÑ¥ÈCÊ`·K¹°‘“0ÍÎ.•ÑùÖû&–ÄM3$åí€ÁîMÌBî~@À¶ æÊC? òÅÃj &\p]À9iÎ DŽ-á±±‚`Ýßl†K ðd5éÝŒ[<+é ý ãõ–¸ cf¢QèB¾`¡¸n¸Ðqã©ÓñD'LFsÆ–€Ât``ö8ãÎÔêã§í¸‚€g1ÁT³“¥‘æÉ¹ãÁ_òà9Ïcor‚Äe-6}šNHøX ©:ÌŒ\ý†#kÊìù*|aq@©8`ÆwÛôpÅŽ` 3¦l<1g½€ 6éxåôþšø6f‘©‡ºdG §Õ–„s‰Éúi‚fgc0wX!tˆV'.œZx¸q ¤“:4ˆ¥ˆ(‚ûšÀÇèØ¸›$V "°µ0rZ7{*™áù…ÝGç aÉ•*fÔ–kçh‹±´¹Í’ŒﳊD^RÕàâÉUšŽ<%¹OÄžŸïè®ÕLÅs7ª¸È8¹ÑÙa2YZŸŠöDãÎvÏqjÄÅhVåXž@kטoz„ l‰'Öe ªóqÏ X»Ék ]]ÙÂÂN)›Ëƒ.BÐÀPRÿ¨‘÷ ]¯â¤9€ÂÒÊ‚ª ·š/¢= ý÷”ß¹¹o¯±†]“ù®ÌR\_E!¥è£W…û K;Çã„WΫ¸ŒžçžêOYÑdÉ-‹Zuç,†JsKX2ͧÜÏ$C*¼\ß.–/¢`GŠ%¼œ©Fïëzáþyéñõ÷ê‹}aGá7“¾ìóÜýO¿p«—è< mxôëôÇøÚ—Î˜a¤¨Ðñ8¼{Ùk,H]oÎòìAe¢Ûã1™Tpã@ÿ-±,U¤QÜ–¢ØQó•*cŽ.» lˆl C}¨#G Ïè?ç$ E9Šô¾rËòeîÎg™ î§ûä~®Ïõ¹>×çúÏŸ«§‚FŽ6uÝOOú¹>׿ A¿#È`øcÖén6¹ò"ß~œßµsÞwðÂ6^þ<ß¿æF‘â3«ñ±/ŸësÒPÄã›ÇRKs?±ñIñ1OØ—¿ý8xѹ)!N{~GdÌéSE>ÁÙŸ6ïɲFMÉ…é@§Àr¼Ì{#™‰>ŽìÉQÐ3©Sù|•°%±jE÷¢/yÖÛPFòÓrJl!¶½R°é{3²-·÷ ¡d|GgÌ˪§>ƒñ„òCA>L[­÷ì겓úÜ ÁÆÇCØJï÷áìc×>öÀ¨±WŒü€.˜WâobÛvG×vu]´ §®ÃV8 ²!Å£ã“þGd‹µs DÏ×Þ ÚE‹žô›²=ï¢&;“Û ¶àÌ.XêÂÛAeÀw–¢8d<±½M|õ÷øoÐ~¿ÛæË©+HsÑQÚ9Óu‡/«áÜD:Kë*x8ËeàºsW²-èžÃQp÷º3Jò˜%„8æd9v=›Æ<ÌH”:³…=õßXå[ÅNj¶¼èvÓ0US¶Ö0ðfîd&Õu(rJ[¿h{>Tû„Þ‡Ð+†ö4=s"¹¡™{†‘†7Ç+ӼݑÑÿ*¤]0 ݱñq¦ëvn¸’ m?–ÍI@¬ =þ«‘(9ÐÁí ëiGÅe£‰ÐšPH†"gl§‡Kk8¸ÅÀÝùªI5“j5¤ôk²‹uªÝ€÷Q'Órªÿ‡•‘ Gku7Or¼¹B‰¶óZ*Ž…PI|Vôe_I ­©ëã|ÐÔÿžŽgÌAH!D¾/Œã˜SN“ ÑD1¢9}¦çî2ßg3 ˆ¬äõ’èh‘&cUu½Ž°C4EçdÂ>â¶®ŽÁÑ$¯ñü¼$+öçJ^ÒËï}P¬ØYàyoòvp©ÂLjÓŽùñ}ÆÅ†8ñÙ¼ˆm|*5šDÑÍRt™ïÀ¸±»1™ÁfF;½›YB˜tžÍ›Hg™ Ò«Œ©Öy}z¤&‹Uÿ t‡Õ矰²'ö×IÖ½VÊ9eãÀÕoç„XD|«²j6‹Í:Ó¾¾óP£¹<êøÔ¨Û¤f8j[I½é¤uéDpaéNÏÆ/#×ø§á¿P/#!VÙž0ýÄ<³¶••0xçAÏ-V½He ^A¿ €j&Ìs0q4<àcœÆjÒ«ž ijëë3ÛÀ3ϵŠã˜¤)_çíØä}³FðHXÅ:œ+iånG@CÀ­» |<éj¡GBcö©,¦åðD¡ÂeZÃf€U¹Ö "azg‡ë„DYª@Ì«08äšO÷I3r§™É|êýˆžÒµ,¾€?ïl•I¿CÐGb™ÑØm’PÔ.ÐL£ GÊòÖ)IŸy /øÎ`jX¿$LÆÂ9ð˜Eƒ®4¥ù@ˆvlŸ‘„á҆ÓÑäØ#šî\fÊ ËžýÑ,%Nàý+õýiÕhɌϱbp³h”~iM¿eÅ+6bü÷°L'ŽÕÞhFÐôâúóº/¢°+‘Àu>äìôâ` Uœà)1@¨õ…¼HpZ¦h&a‘ ÚQ9•&åÌ:;2Øîl !ø˜A˸N„Q‹ ×JàÔaȨBâ<– ̲Ú È,FÇšï¦j³þ", ¸xN@ذÆÈ!lž=¶èRWÃŒÐûà ZsÂ*ó«šÇ}ñJ ›"¢${Çå^ûÃ(8˜Fìu PL(j‘mdzÑ{O‚‹ÈJOCT5ð•)w9,¤¨^I…šm=ëÃ?æÒ!Y¦¢3•Ë-øUšæphaÏÁ"Ã&PêQчcjv-&c~‡"÷ *M]Ž½È iµ"M+?4 ß(Ñ„cžÚös2ûG795b>T8û=ÉŒ^!Y>#ð5Y=+ìF‡Yë¬TB]WÃÂÐ(²ÎW¤)n)ICú‚tÆÚ+ž+d` ,<Ͱ§«¤LqÏ/¤bÒì…ÎßgCZ«"è<àR|ˆcxjA"&x1;sn. Îö*EZ[Ð"x@ÞpªzA€×A#fR¨ÐÉ*Aºïî=\æßI:ŸC€Ï0…»…Aí™3øh+`KÐb-nÌÓ³í%‚û5Úí„ÖÅ«óãÿà8ÓpæýþÊçúù׃¼¸ž‰¶­È‹ÍZБ¨Ä<üô©2û)û~q-íøc€”‚ÜòÆžÝ華}¯¯Ü4št¸õ]`G–ÞÛ0}ò³^ßdÖäå³/·`øªMÌGøÖáõQúÚ·õšgé‚ 8ØÑ+ÊÏÿn­¤¾8ДŸ¯Åðï{ȸ1«€oï]q‘yéÒÐ:tÞ±IE×díÀÜLßÀé{au¡¢OØX³öÄ™üäÉSêúoÞ%%âö?`…þ^Åè€ØÎpÒ{½èÍysn¼2–Ô­-+j†4d;(M"‚Ãdª~E 5 Ôwþ Qlj˜B‰s{V2yó(ÞÇ!ÚÞÞ ÷A>Àæª8‰æuq©µ°w Ý­(àƒÛ¶ímV`&øjê.GÍ»@ÕlŒß6iZ’šÏ;;*¤PÞ?F¥—ÔƒTCEU?<äqŸ>TÅü;Ñ?MCéÈ㵬"ž ô!tãEñvl*]‰K,¤'„«è6N0eüu)óÈ!)cP+ZDDúF}ôFÕ¬mìóÕûXвKŸÌȶTôÿê-ÃhiÌç‡3àˆºâ„øí¿<ŽjoïĪ*J&Œ5±$Cä4WþBÕ^ Z©©£»Š1ñÒD.ÅöÓÕ‰ÐRl>½¬MµØÌÕŠ3ÊEMà:¬€gÝÿ¶9é{ÒæJ^åâ%±OD F;:ùÒä7B"Ü™–Ò/ÆÃèƒw¾¯âO,:qy3tu °3¿zSt³üºÑ3’fËð Ùé.¦|2‹SLpO\ð]M4Ä$‹ëå3É,êàŠ’é>3Ÿ%Eªf½ ½DN×sà%Õóýü}ø(@3T0' ^‡q©ù"ã'Ð|%œÜ¡˜lYmrCûB–ÌÈȸž˜¶AdÏÌc#ZÑ ¿ç˜w>ë.¡ÈûÏ•r¦ÁÅørFKzÆÊØÿEQüÑ< Íhaú5Š|ÎUfuô~(é¼ÝŠfqçnÁM”#¢Wè#…ìà\Ëì6múŽ 6)éVlq)ª´hÈCt;ðš2%âô`J6nÀÄÏ´K12íù™ýº'Õ#ÙwïXmÊHyµ•é ­9¹(f3îð`ìjT=‚ïÊ/b½½—þÀ¤1’V¢Äl¼réP“…˜ÕÚôОæ;/z‡8¢zˆ6¡H÷…w¶%;J˜éI®ÚQ p á‚*™%V#·2ßÒÑëY6`N_ÄgcSãT†@t›YÚ +eDçKb‘'0 '¿h EÊ Ø×òéœQA“DMmô§ûYM}XJ|E‡âsl¨¼%y¦X¿‘Oéé¬Mûš€y;=¢%—W¡š*š½ˆÌœÙvJ*³9Üç †*EçÛWºqÉãÎQ‘EÆìó)Š‹Î"uȨ¢"Ç÷äWɄɩÂúÜ`Š€ˆlб()–èä¸:ÔV¨Ý«IHéÑȵ±Œrìø OÀ[À”{Ü£çüDHx””Ÿ¬:q3¢F+À°Äˆ¢Á„/NGͰ k–Œ…Zé6tbɻќNK¢K¶Ÿ2e} Á”APƒ³«Œ3´ÿüTñqÜnÌP]‰º,m¦Ë3rCt´ÙªÚ¤prʰñÆFÀã9¬’ï#C`ôEŒau’pâhu ™ n­TƒÜI¬ºt¶À.61ÁèBŽªL@ÏŽÀª¼Ä„| ”c He>RêqpØñ0CO³%¥{Xaô0Y¢ÐñÉâžÝN”Ìãñð놫¸´v¨Ÿ$Z±àiÛŸ¡@J2o{Ü4-Aáw˜ÖBIt\«S?²„ªyMˆiãg⌳œM?¤­˜s^ý2ÒyñÕØôôE&í3âCã~gÓÕ Êš †é•š05û÷Æ\Œ,)”|ÓëCôS/ÎTž—1Xn€%ªXñVYž`²]ãgésèP-cæoײ„Ÿêyà `¥?¬1ÛçŸéãRS¶`lö P‹Àœ«;`Î’6­eŸÂtLò^7ÇÕt3ÖWü¥ö6È»ËWY¿9/¿íýnx5;L³5÷<ö÷>V1Cƒµ–"²F;}é›îÄþnçôïô/:¾ïhžì°Ò"ó-‹ßb.¼#Þµ»§výö*9 ]",Î0ß7NTÖÍ×Û:´7{ƒÄACpù…¿°ÀÛ6¼Åœ~4ìw{nkE…<70–_F8^¿Ðµ÷úÚ-á¨ÃëÔ[ñ·|Õ¹Mv”®rXUÜE}½v.¬…k-gAçôx¨wÁÒÃùW€ŒVÙÊ.îävm=!eþ ìð+L_n­n¯®Oëv¸2%_Þð£IçEI`7ºœz~'Ÿû‚]ºù9éÄRÏY®¿fy nÀ¬†o%ÝþUÌ/Ãã3­òÀŠÃ Qûƒ©Õ¥¸ q´JI:ˆ¥G¸ÿ«²úyxƹläžì]„þ{’± W•ŒÄl-Š|6(Š-X՞鑾éó§\¡b3̺íÚDi"~Y)êžÝ¯Q'°šØ¾\C_Â^РÞáùªZ"ñ‰þ£ËRMfûBc]TÆ-‘Û•-§«µì"ë=±ÔO­³Ðµu&/H½üÏÅÓ6AÌòà^A½mn¤FI‹)^šÞu,*YØKØ¢YC§õ ¯ÌÌJÂõ/ÀïÍÆ{£?ò6öð”KCRm™—ÐLD;É›'¤|ÃÔ¼µUùK‘:J¾dtÀ»É¸uUk: 2Ãw`:"é|»-HkØqï†'ªîº¢’ÛQ‘GŸ9ËÐ⢟ÛÊ9Cå”’õUëŽõ(Ôõ­ëŽÛk¡ÿµó•zÿýs;’5§œœ§}°ßm0UGVeÜÓE‰#”àð ÂÊ0ªT™Àv)>•³½®ÓÅxäËšãUþ£“ŸÈm‘cº.<ðºòÚ¬9˜JI…EáölíÉAÁ§u\œp–neU €ØCóŠ×yX ‰ª‹þÈbÎâ›æ_¯¤¨ýdµ ‚º{Èd;z›}l;pî1w*) ”ÿSgš¦jé`kûÁÈX«ÜŸE‘’ CÞÛj‰øöûβJ:¯Ú^ZàäSÓ¯$ݰ”¡5#˜påýŽöG•·©Z = ¸a ô½†Ñ¤v”µ Þ7|6©ƒ¶Æ×::¶ Ï€Õð|nQë¼UÉb‡ ¬è¸ûÕœFá´æäÔéÂ’³ƒ€aãØæk¤PTï¹Æ$ü.\„šÞ'û”W"¾mÛãÿk÷^¬Æ™Óm:Š¡k.Ó=gÛ`\Òý6¨Ï¨‹-ÕZXÝ·‚ÉrjÔC8—9xÇÖšÛ3Ù(þ}Ë;la_ƒ”§·”vâåÐ*.¦ñ ®Ü•ÉÐJX1A7˜ã¡ÐîDND@¿›èÚû‘„bí7Už÷FGMúcÉ„rÿØÙ [ª¬§V”±§™}xËóÏ”ƒJ‚n]ŒÿZJcþ­çήá/ǽÆÍï<Û‘‘Éd²ÚBÜb辎pCåR%{Ä->ˆ"½jäê=• º4Ä€aßS$³Ž^Ø Ï›R~aØ*s¾ŸA§¿œÕçe³‘ B8¶ôà×Õ°.ž#eÖjb7Ý¢Ng½ ›ÕCnÿ’Q~ª£)‡ Ýž1P‡^…Oç^q)2ƒý²LNÀ‚¬Âlz#Uì:0ƒ‘ì9X3–õvEò(Ö—nñªù°á%ºº¼”õ¢ô]ÂTcĸöqÃö¢y}â*¢‹¼œCFê‘qà9‡\å Vœ lAòUŒ½çô þ5ÊDÚècJ6¨&¾å¶¦!(”N~1‡a½•F ¼zú€ƒ*- C ·Fv¿1EB³Áƒ2$z ƒwŒ1fà8î‹…«rìdjíq©gÇà¦\gù«—ÉÊK»_aKžãn|x5Nx,ÄÏÐNz4Œ)Pž«‚&jFSv_k¡`1Y€t£)î2ÑXufkx©³úTãvõöžÈË:Ý#"K†ÂÌÒÔW:ƒ7÷‡éXŽÅÔ¶SÛŒ ˆñ{¨ÕÀ?§>O>j²zl6PdË^ ¨O:y<ŽdEzÑkgÃ-¨¡‚}3'–q„XèŸXϨ\c€´ƒô,G4CqÏí–œZ`–@w. IÜû¨D+''º#ØÑ)DZ:½åUòÊ~ë%‘ŒÆ*ÒÉ8¢‡A.8ZUèm~Òsà¨s˜ ™*‡•$Ñ¢­9··º£æÐ*kJÀ‚¾¬ûÀ·Ý–{ž .ÖU9±ÊÂ9Ç|’ )Ú(@å •ÕÆ4¥7—úͤóÃÿfµÜíêÊK¾¬"äîíOhjµO@‡Öq HìÜÆn NÐb’²JÂâZÒÒRyÌÒŽ¨ó^k׎[~(€~ÞŒÂq`îB‚ãÚ¨¦WäKQr#µÒ?'ù wæ¥}9›2æ >c§ÖŠ@Ÿ¨M›gu º(•[9•š ÌÜ#§ÃÒ‰_x]²jÎÜÕbeÓä ðÅw€Á¾ª à¨\iã›Êâo׋ýþ'™ØÂáįãáú Ø€us9³v8Ó€••OÀ7(Õ-P©:‘¸û;Þ±S\@‹o<¾ @è7 zŠ|ï¦Â%.—°ÍÓÇÔÕ€‰Ñ9‹¾ÓÊÝe„,Âït-Í>ÒìÑÛB¼kûîÍTq´6dùïã>^_ŒÈd æû]× N³°…µY=0£ðzÀç .²¾×\±•“ñzÀ‹¾ªõ,W:²PªÓç|Ö½D-¯Vò‡‚Ð$, $¯.X÷v6q¥ÿ!Yv\qpVÖßp6.ø‰dL”½#`û¹¤óRìü¸ˆ³6ýë?œ±÷þ&¿—dž•.®PÎo\D=Æåj¬ËNO¯Ó¥0Oôˆ*Öãaü5Îûj"lU¸Ì~ŽA­CÔ±Mènr¢›Œ-¨Ý&]%† úOFW¥¥1õS= ¡ñ‡QÌÎîè™â¶‘¤±Ð0E“Й2²{sÌpÔîzù•§p§ù§­vNô™ôpë[>È÷VÅèÑ'xÖ%›Èª×jg­Þ†çw3ï5¥Ç½E‹-õ\¹ñ¹ÊÚ™Ë ]¿ÉÁuöQ€…Y{ª`uÌîÃŒ¾£7}ÁE¸âª‹j”¹ùÞ%sÇ€·6BNYŸK˜Ó¿[ؽjç«—žóŸÛTÊÕ“qC@\u!ß6Ö³Ò³SáÎÂ:é ¢9š ëÙ½ŽäwÀ­—Á—Œ#–¿Y<9ˆ.­ì+1‡ƒüÛ„~.Sp='¦<Úð FÅÌ.¨øá *¿å¸$úp—£¸²fßÿE¾þ/6xkNjòÛxí‡ü?Ë €Á¢³£õ>f™g-{Wqšk¹ ú³9:ibµ»•ŒÅ]öntÃ,¾EW’ï%¢¨ L¬æïûÉÞéÞ®±Hç• ˜ ö¼”8ã0®ú ec¹>ಠ¥îl+s.64jÝMÔ½T©;z„%d½á_Oñ±3ù4ë”õÖT lPž¶âR‡„ºjÕØ–Ô–——ãñP=œûò©I¼Hº˜„ž‚Ô5# œÔÑÄåÈ6\“nìûo/coÕ§Cßô¥)Ô¿î{£Tî—FÇ ™is¤üz¤0yoõÓÖ¥¥EF1ß§¸üÀÜuü¹ èä>Ï;ŒÔKïßéG%KèxŠÛ÷™EçåÐt"¶­›C¸}÷Ÿ(&"‚š:­gÌšgª)ÞïñhÓëÙ"è+“My_û>è–j•*a740ÊJ>l ö¯‡¢B…b¶IŠ0U{ƒšµ o^ÚªrÁZgÆ ÊƒˆrÏÔ›]ŒètBÁŸ®ŠKIAÒ).•<4«$>“MÑ™3†z޾Ñ5MšVSQL×­‡Ôâ;Ñ3îÛ‰Ò&Qç¶[Ú™pfPÞP¬ê7°Ÿ‡²?c£3uÇ»6y ¦=õ 5©“Ô¬«KéM÷”¼K¡ïÓD40m¦¶è­`l¼ä ™¹YâŽÊ¡HNLŠ}Sï§SD!(fŽ8scÆ!ÏÖ@ô$œEŽØÁ¶ ÷ŽWÑ(iÍ*£|•k;4aý zB¼d ›´rÒ¥ šhÎo)ïÐìm›ÞbëÝCƒKƒéÿ&¸N<2¼‹³ÌžŠ90› ´C—OƸ…­j3–ÑŽ*jEäI01nÕØæPRˆSf’Wk¨œêM®ðþæ4‡éûSBécŸÙ‹b ét—`?íÇ{v;ò5ô®ïµQûló7NÊÜ‹gAš&èbzκ*ÍÔ$Y² ³(Mù,€$n$L@Ê9Ûã«!¥}Ô$8©DÈbâ9Wó*Ã'Õæ€Í_ÞÿH–s_?(zÒ™}»k¡Ï ¾Ð1Ö• ñvòâs~EUÿÛcWG¡ªCµNl‡ó1é1ù} yOu8‡~ª²ôö¢ÏW¾-ÏTe:SàÉ{ŠE﹪œŠ])!¨QS>±)Œ®Ò¨ps¼š’€iV,~H”˜xó‡µÏ×ÁërÞñ€çä-¼»0øßвIàzÀ×gžN¥{úETk+8‹ KeŸÝ:½úH Qq^ò=mgîo¶‰Dĺ=X*O°= —QRµ` …Q'íäÈv¸ŸMŒ2%匙¬æé§9/ˆÖàð³qD'–ì@€œ½Z ˆ4S=^«û×G“jw¾«Vu•g¬Ðè+¹^QÁüü‡]lÅE}È¥<ÆëxY‰šãjGRU©¿5 Ø!³‚$£Ÿ‰ÕA‚p¢+XléÄÁöÙ WŸîË7]ft}å®L°*ÉÞ‰û[¿VëvÜÛtÓ‡2¨é¡>°ƒÖVõü…º©qÉ3‰”Ñ;Ot™¼!•Ø›§øØó£¡6#H}¨? ïÄ9‘¦Ö°µ¦Uâö¨7vOœ°7{®-øí2îC]êNhõˆQƒÕz· Iƒ)!ìˆaiUUµ%[J-7­Š M%IkQA òfj÷—Ù|°W,ºm˳wšùŠšÈ*)XÛê–ðˆ*]E°ç8çò™9£ãz§äÑd£ /WÏ•ð¥·×ð }b¨6Ï:ËîÆ*U0¨õ¨-ÓäÔ $(c[ZñT®UÏÕ †8sèî$¦2»ÚÅ:äå¬ÝÐa0Zƒu}j| fß0i÷Kæ*k5NzËqøbiqx(Ñ ]ÕXà\éÿ3 g}©¿²TÞnqê€3on‚Œ ¹d%Wgœ'b:­0t]Ox$-eT sŽ’ÀºÐl#©#4;f‡1´ìâkúLA>¼7ôqL óÄhN¨«LÿÆljž6¶0Ïšª¢ø±=˜@Ñæ¡Ÿ3†ls†1W þ!ê–øXϦ[áO8WuT’Ãé89[’Ô»fAV¤èñ܇AQk¾†|àV7sôtg ¡€Ö®4Wwô©ÃTI"¨;Õá¨wïT®X‡ØQîhy°jB±eÁÒ¹uó"îŠî× Þ†!nºXýOÍ Yá-Žü?nU$öÃùµ§Ð…aä÷{#òÐÕAWý Ë4¨ÐJ‡„pˆùV/˜zêÈ'þ(ây¸¢lUò.&g+ZÈ (@¼ÇCÚÄšZõ€údÔÏœ©ùSÏ•·} Õ :,²ÓCŸœé”‰ˆÿ“ŽLºï¯ûÏáÉ`Ç=ŸOp´¤uËcG ÜC¢fL9î8Áì‡(}V'i8ZúòÐg‡Ø}¸0,i‚hþâQ:ÑU|fÝ/K18®C¥gO š3ï ÌŽßõºo–[½†.€+.Û2‘Uf žd…s{CtRÏEÑaY’³ }=ÅmÇ5fÂDm„Ö1ñ ¥[g¦²á§@R7bÅllÛöèL ‘*X€ƒ…*šúI¤óÍa£mÛ|Æ ÊÀÐ"Ûìüš9¬çÃ#”*r^%ÝŸU1ÒåäWš’qfT»Í ¦>Û5Œ­NºËÖÑr¥ÝXÑY¨[[èšþ%¼¿àsÌXÊÉ\}þá>HtmB.ôðßÛŠ‚MÊ ‹À5£ÃKþ9šI—¨õ4DèÔö㹕؄å[„ö ÒÔBF¨NB& ·®iéód<À‘1„àYH·ïŠq“pÑhLcÿÅ0¶¾ØÍpLäÕZʧœÆ ž’¹î!8fæ¾Óná῾»ÍCÂk¯‰Øv²ÜOÅ¥ÁŽÌiÞ"ÇÛ5*Ú¬‚1Ú@Qûìå¸A*^!÷Ž‹Œ9œŽÙ4™DY ËZÜ5¦Ì,»0y³%æzp|ãȳžt/'‹Z…46&›œtõ©sƒý˜xöWü%}Úbuì×¾d¸ÄêÜfÔHÈ”Èb•âh‘†MIIgª¢$‰ #{Ñ)ðctKw‹Æ÷z”¢U,¼«ã‹$ý¢­Õ1GÏ Ó’ÍáØ2ÿíR®^ÓV (¹ó˶nºÉ¡ÕÇ 7’B éAL4ÆtÄj­”¨ÂÇís¨qzúÒ´3¬±¸AÕÙ!›‰ý‚D Ü‚1k É ˜:" ;£Eʑҹ?´ çB­ /4/‰X–ú$á”J(;/Ê5¬Ý›nŒh:òÍH¦^@fm–WzJä-º@m‚ÀžÃ#.",[¤i½ f7q€¼¸g÷”þ8œzŸˆ–ãˆJ­A|m’~€è• ãé¤ñµM§iZ\VÃ3·w ;0LF7Øõ•Zld-f’¨ŒÈr€ÎÏ¥ˆË«uî(aÁAÒÌiÈÆzÅ6á è§»@gI“¬L•PL¯ÜBš‚„V Ãó.FŠÖ¡ôŸ%PâJVQLTÙ­œ’Ü@†ùSIç½IhžI5º¢¦¾F˜à„Þý¶ï 7Ã8ð𰘊”ü`D¹bc{^ïÿFœp'yÏ~ïëL“ô8°·=qÞÎõ@ô½DnY (ʹã¢i¹šRç,À4j•T'5¡Y8$O‰†Ø_&KÐ=zu ¢& 5*ÏJö„þxÇ.ÁÇH¿™«=j˜ØôW Çéÿ ¯lÁ9CÓ‹[ú•öÌ{iµ½¦Îçú\Ÿësý*÷òçX¶M6y!ÇûGÆçÑñ„¨!³ ¹§ðÁãñí©Þwð¿²H·m{<¿nl ›ÀÇÔœYû»ä‡tó “¥rÙ?ÆËÕŸëmCm ø/_,wRQÈÇx|ìç7#þ¹… …뇆FÛƒþHâ‰î“×É–²"B¥¬](þ-5F0´ÛÑ´Ý÷Õd@ïã˜K¶l©Èæy@P5BDB¢"õ!”X¡y?ú‡’i¢¥†ØK¥©{œu]CK,ŽÞ×þ|¦%Ã=8屡עr/×z<4!†õpúh¨&—ç¤mxN8”Gž0¦<(ÛvT²í5ñÌšV#³,' ÆLª%ª…ºCÏ=>eïZ€hŒ\­¦½Ò-ÒÜJõ˜£au?* *ø{÷o§Ô€.¶ïíPmaÛ!`¼ç‘…VŸMÛºÈ&T¿ÿ†º{QÙ‰ŸÆY+ ée$š^+݉ÔÁ²m—XûUR©ÚÚEÏl‰ÅotFØ0t’ž“ÊèXï;ëVšLFo“ä*ÅÛª ðqèø‘ƒßÐ0àEµ×W&ºh6—2wŃÕIth­‡h—.¬.·ëÆñŸùÝ=ÇUM=}((Zj-W̯˜ÚuS•ÒÖêôÒàéY­‚©9³ºuQÊH(‘»R~÷•ÌÛï&·h§'D‚ÒкI]«é% xⲫ™y–ù©ƒºäý°&ãÈÝã!åNô îjLaNfI™®ç7P}®Å ó:Q^6dŘbĦ2´à¡‹F-T{Üu&JÛÖ!g,kX½.iÊÌò¨”ÐY;öÐ/º{®k¼8OŸ·*4æõízn­^$…?x.| §Dé8K ß1 Ÿës}®Ïõ“Làû¯ïÞô9¨wËÑäÏu· ç-xçbü-³³~Ü•» Ðæ%3ú³D~‘ëºû‰¼7·¯¥Ÿ;Zfùs½sœGUU{½ÿˆM3"·~õ?ßÐ þ½¤óÇ~‰_v]É ‡ƒö®!Û›QÓF,j¯3W?O û.hê¥8Å7ìe2þ Íñþ†C}ÈÕ|!~ªuGÛ£]ñ›¦™†ˆûQ"´˜Ò¶ì!>‡ï ìŸv]ö»³ ‰gVB*© •mïCZðÖÃEtÚlº›C“û'R(û=!Û)!”X ùüŸºˆm@ 8ml§rÑõ›4m\@z0‘õ¦#I)Ðݳé¸S ¶ÛmÕï«ÂC[¥ÝtË×­tÓ“nm®Mr}âZ£Æ+T{@ïœÈjq%¡ÔIõijËÂðdˆ²VõÖÄ‹ú¡8xi vEì&gø+ôÖ –ì|2_Î$D;;æ‡bK¶M•5²{è¿€Þň& Ž¤d§©*â š¯óž§Š›mzd¡dÏÝÌ7RŸ;²Ï…*|”#ApWO›ÞWEL b°› I‹šÇê¤CþžÈd³£L÷òUkÑ6qí±X í“‚%Ÿâ™yN6`•ò=!ŸYuý`tWuE±ð™rªF§ë¼Ü{ü>솲Žc›ú¦[žŒÂ†Ã‚¦=dªj’­Î¦¯‹9™ºj)k‡,½ääc§¼2$¦î³jöñ¦Û©U^ _ ½i8 ´ß·W\”­Ë§¨ÊŒrZèÈênïc×UVðè\SÝ!È Ù’ànúO)¡Q°B8m‹Æ ™¼\îZíOæƒ2ÓÓºÇÎ*kÛîÙcÚ³yS¹ÈØ2Åžg§Àä¢eÚÕöŒI;¢²Ó­ YqkÞŒ9)¶ù2âH,Ö¶HàÌH[š¥pÊ´¥…j„:L„^¥<ñ­Mö.­^žÎ™*é8g!œs³‰Lû—q;1Þ0+® ¬k|¹ç8P¤F‹”E¡Žó)€¬æ'ËQ͘þ‡’ÙEèyW]fœë u7ÜÖ¿…¸3Œ怓ßbx3%ZΗù*†i †^FšIÛKí°OQ C©)ieéÖ8å¢5øu¤ó†j¹ƒÛ¹ÀØœd’䃴à%æË‰£þ†kT-˜ÍB7Aªn•Æ.ÓzyA™•ìËŸ= âŽ3ëÜä´ÌâÖŒ˜ŠAÝ÷ÁÐð ˆ2Á退,ÿ©+Èõs'÷´®™°_8_°éTMjË6Gøèì=íøC@ `L{Æ4M¬ª¾[+*ç1#žÅt^Jb.**0x¸¼ehîa¦'µ‚{@ˆ>Yš¶n:ô®%¨÷†Ôù¡¤1OŒîP`/а*—I2a©#`ꛀE‡X¬ÀúX@5™±ׅϘ8½žžRK{Ôq¡¿OLkŒÊcx¶å~D.5™©úúÐTŸJÊ=Í×ó!qå±%ƒŽ‡Z^±S@ïî B@°6åIëQF 5`pµÌQ+ý@õÍ¡¶ÆÑí0ZFŽì¹ºo†*UâÕ{1¼¿+…SE½ëP¸Û„˜¬l–»5>MŽ Ò…>Cà¬ô>Ùø¦!—bŽ'Ö ~°áº‡ÝáÙD9šÙ&‚XTé@/SžJ "·Ø¨/ˆR;—çŠéñžV¯F§.LGLÌþ½èIPUÄáÍ}<£~À +`¼KÕyè_ —CÍÄÔ)88ÂÏ + ­1Mº‹‰N>+ª‹]”¯ƒ¤¡0vó0Tû¸õLýä%ÜÖ(&–r’šL…2õQUI;rë·XÌÑõ|’/I’n€mºßkL²ý1šq%îµ^ÿ C‚×Ý_íËS j(×{w‡‘ÓVK†ÃeˆjÊöƒ,9U·Ìµã¤’%={/Y¯áÊ’8Ìó˜,Áb¼Ô裸3r2mÏèÄÂÑ»N€K½§Ew;DdÛÌ›ðÉÔêqat8È$’>oõ`PYmtôE#T8\Õs*ê˜L:¥p ~îF…¥ ƒ<ŽÜhãR_‘0d¢¬ís"b´àL²SHêi’¦4q?u†%°IDÜJvxäu¾ *yÞÇö kXSÎÚS[*Çs”F.˜0™ –ˆu€9ÝΧ%x§K™mdÐQö‚TCT«R)ÉÑй‡Ë¤#wDœ³XïŸ O^*̃î³'éo!‘8[iŠ@ ‰*µ¡*“-CégéËœTµ{£¡SðÄå#83 ò=.¦¹îa“êЗϕýõ_7¯ã4â‰üsaò{ªùê„_ήt#–üˆ> Ø&CêÓÁ!0Qq]Š£ ž š—öÔñàFÌ8WMÖKò´ïÍ-Íx7»k~àsïŽQ~ýï ¿÷¸ñêrú–Šx߃ý°ÆLü˜=»ô.¿¡[߂׿³uÝiþ³ ¡©È49ųyšábÕS¢À£ƒ_îjõÜ?\-õ9Œã‰u±â5G©¨Þåýg 4! CgèíwL,­¹7ñ-úñ¬7š*>BÕ-ÓÝŒæËq¶)+ÐqCófÈ6.ƒ®I@U#òÔ®÷LlÝÿ*O.ÿ—,¬ÂÑ*qõeñ)PÙ`Ü´Ï®ïÏ#{Wò¾ã¡Ï–›ŸUB¿÷,Áíö÷àEyÓ#Ÿx³:X7ò¶ïvŠ•A8þf\ç´ œ•!êéIb  åäõskeÀó¯”,IseÖü’PL$Í•ö)'…§§6‰{A]`ÂqM#¡‰9ôõцËåû\Lµi/9ÒƒÉ=ÜM»NY;ñlVPÒ¬bb†K²Æ¸1­€î£+Ï]&KçTº‹q¼MJDÑÙL}²©lXN%“©ÄX•õH0C«Gz3ÖãULÎæFâ¿áŠ0‘Åbè½0{'*xg.CÔÀã㤪}¿bªpY”ìÛgZíAŒ,€xÀ5š'ކ+ÁýWk˜†4еd:06rb(ÓÃר •B´ùx"× È¹}‡kœÀ„þà˜Ð " yA Är¥™ÕúÆÐ86«çÌUÿ£î†Rò¾KËè'Ç C¬©R“`¯}PTœ! qbŒ”Í%K³Ýû|`ÏÊNB¿Bû¬¨»$q›…-z.ØùvÇŠ!ÚbP›'ÓáÐ,#Ö+KÑ´D8¦wTdž;Ö(´{¢X· `ÒOú„$WS‘(&{ê*V+ <+:-b(Ûõ‘dû¼3«AÎ×g¦áIr‰öÞi`µa =œujÓ]X SØMôŠÎªª§á+à{Ö®k €Z–-âÞ¾g_åø) 8Ûô‚‡³ˆÞPìÍb¨eèd¬@-ª„¸Ø Û¨êœo[e”ÅÖÙd˜†|¼œ³½ E—9OBSú“‹ä†.@·ué@"ÏVƒCÜß.7xÎ ëO0áMÈÉG”+©ç)‡ +ˆ s) JAUÕ¸ev¯äa÷„55;##†É4FúÍ%W0nu)b‰Ì;Ÿyß ýHb‚vl7ð{ A»¹HVQVCyø$Še.†µ2#Ú°\RqîôÉ=ÖSŠ×N…ty©œçžv:c A5òúó@¹å#ÙTS5è{ÄNu¼bô¢k˜JIy¤ù‰ÎvʳDW3g…–§[N2BÀÓ5ght¤i v¿BŽ¿Ä®ÃÃÇ„CéÖ”í gË›)@ƒêȘZwdZð¤q+G3¶Ô“®´uFÖ æM²:ðŒ¾O3ø\ç!3"ZpF'&¤O“eãþFÝ’DŒ])u uÓBC†ú„1ÓÕ 7ûi˜n»ôH¯ÅT|¸9Іõh?‹t1_v)/K1fÔöXZÕ!®¨Ô©ô\ÇWÐoa]ëa$ã*¤(¦å!ùfö¯‡Â¸ÿjÒùHÆñÏmÙY 1bZA*°¶]´)Uvx…žs­¬<À»«Ÿ[¦µMæ@œ çõ<ˆU€µÔÑqCšè„QÚ->@_q¥”|‘ç$óÔÜÐ x<ýa¸oL¼ã ñÁê÷ϧfr¢ôƒœ½gÔ5>Ü#æMq@êXµC›`*®‰òë-¹0×2 ïI¥©€‹¿®š÷=ì$Üÿ‚/½ù¦FšèÄw¿Ä€¹vçõ%—V.ýH¾n +;Yn×`GiÛÈz¢®bØ“Xt)K”N«V ˆ­ú϶Wq9ê3b¯:Æxy0Ýl1s©=G@7hí3þÝ4¢Yaܪ¥©åÚbå!ä9ëå» …Cñü÷ã²AƲEÜzGqž 9a3ñ©…‚ÚÄV$<# 7åÙ&7’þes†§»‡7œ3w§àÌjëš¡ˆçÛɇÂ[Gèå1â|¿ÌáÚÌó+ï½+ÚôoຣøÎuÅÌl5ܽìÿ—·bUg€AEÉSÓ÷ev”_b]o{ZSн¨d»B^Îa}™’ÇÞÒŒ,])„Þ ð%2^"žLÝ+‹ÀAWß\7‚ÿü¦ûó»ºOcË{\-¶–&áA¦;Š l=±Š¾t,º‚ß;w‚3÷ÄKý›='=±¿.6Y×_¼ÏŽä?±²¡ïë°„‡oê: ÒÞ?èfH–‹¯@ÿÅ•D3!«ç¢+{{ éóè@Ô=^á/!w¿ãYÈ¿›«áú­-U†‡b¾ÒÉ•á{uyØëƒQÿ/LGlÅ“èBÛÐòØб¯$P‰Kâê‘£¢T`á8û¤‰$XÁ“™‡ISjå’;¦AEFR£èm"¢öÖh9ßÍ+„òØ÷ú ÖßöeƒFzkáò½>‡Øœz}ÈHsZOtèÅ2„>Ù½2x¦:לJÀ¢psŒ–•ÞÜ¿¢ߤýZªæ*Âê®; ,ƒbù"‘=Ü6Q,kû¬(rõY·2ë@/×OOjáW¤’s ’æ c«|)3 úE)æ´³ÊÁ wvò~ š!a¤¿'šK"ó<…EÂâD¦©vÂðw+¬F§¤.…šúºÔ·Þ;üÖ•ý÷ÞIG“€D0ál¤­âsƒÃÂÏlãZMê[QÌ‚@ ¶™T ¸ÎYsTÚ<}eÆ¢f–*L¸<4éÚ21‘>šWÕwnG®£ )W ÏÐ<:#ÑÇ4ÊöGÆ ÏÀ®* L/JÖ oØÔù}4yxŽè«³·(b}Õ õhê ÀRVÚ+ÝYAZF»EÁpç±j:ø21¿DvjYÈÒ8‚Ú”I)µ´ôFápo(¾î3áÏ3ì‹Ïùsâ¿Zi2L½›;?ê´øÿÈqPç*%ÓÐË?„ôD.ûü=LØkTè–¨J@ŸÐ"jÚÖEjCÆ’ùг5\ó M!m@Èü|žSñUµÅD6ÍàEV5;5›@ÚHmãZ‘»¯ÔR´1âiMæýUê ãÀDÎ*µ$­iÛ’ä$Ô^3Ô&2ªí\dÄVfßu“Ó9ÏMßÍ/Â^Pu’Žæ¼¬:¨¿Ù"ÀëL÷ÎJR?=›ÐÝUË•úÔ»æ4™QQr¡ð ÅžO9]¹a@qü“Î¥é$„»[n)¸!íCœÖ Õ AœÓÒ rŒŒzøº#dß÷–y©4ÐN²¦H™àì'rExrŽ tè06|]yTÌÉm Ç:ýç1MÁ(JD—AĨ³=‚6­™c[ˆã3SNC@ÔLf‡]ú!‹)OugÕ&Ý,[×_‹IP8^¼‹dz:™ßL:o2ÍÃOh>dŠ@ÛxA!Tön¸näEš„;ß™7BE *ª (X02oê¨îŒGe¦~;пÎ:uó±{Â,H9.üçÅz%2r×)¾ü÷á è©ö‡—ÔEä㎩³QáNm¯Qô. Xä§[åýÄÉ£@ÙmbÌá/¸ž×òÕ=~)Å:YÆSÄ? ó ÑŽÏçX3*L/¼g¥•ç ;ñsæ"Ç’®Œз¤Ý).“ä;¾ÎòÎ[òU[‹¢øs. ƒ<¯àÿÄÁÿ+¹–»OŽ£7ý ‡lñà<9X[;\0°GØÉe±¾˜©x÷\½Þðžò ñçØ ÏǵÀ2@Öš—\ufË!S£ˆ¸ÌËss¦`´Qâ…€òüêiR4­tðåòa?½TÀºNæ|?4S·9ŠõQ5þÿÙw÷›®Ýà`"L½ö½•௸Hå&ÂÉQ©; ¾ÍS~ð‰ùÂ…Ô¡5qÊ æhF*¢3_ùëÛÁ5É®X?Ý€ ºúÞša^ÛØ‘ëÅÃÌüdy<³yðJè•غ¨+û5¨••HÈF9E(J˜E¦Ô¬¢Nšìïè¡j`âÔšÃ{i'^8õ^Tb?׈þÃIç­ƒ®ÏºŸ¢Râ¹ÍqÂŒ[Öþ"Y³¥Ì,Â7ce|)0ÉAçuÎá×Ò>ßê LÍ&¾!ä(É~f와‡÷œ´zE¨h³fèÁcÔ•1öçceYÔS1=O8=HK1Ø,žÃi,i¢bŸGKZÛè¡=›þ7¥&Ћ‘Õª¥ÏD&Ò£r¾á»\¬Tf²Ü'd–i…¯™É“F'áKúÖ*C†•”¼Ø’êý§]8:Êfvþî\éD')èòÛ‚ç¼î¥Õ˜H4Â6AKhéwU:ᔄ‘0KafîΘ:Îò\±b5j¹©:AúdË“=`U 3X¦çY7ñxÂéxð¡[m’ç ÿÝ:ž}Å~³îx4kmŒ.2 K/²Ñohh“¦Ÿm‹ÐÃu4Ôâ9Q`ºŽ,y ÛÿA;ýà­›aÐÖ–Èš.d'xxÞlh(êðgN¶ç« ®ïwn]o4Dñ±‚ÚQðÛ>®wÄmBè~a¯L¯kïF:D'R„ʤ©ÈèæG'P“kÈ’Øy¡„±,v ¢–ž@ØûÌhüUñ?aØTÏ_$ë —cé*ßÇÄùØËàßÝ{ð­r£=‘nÌÛ#òº?(§Gï³>©È´ &~s§Å/)Go4˜¾è_ßûb×UÓ' XìÁLiò\Æn+;ÎÕ˜7=*bû&ýø> Fã øÒ~ô¤iŠ`°Ü0¡u²㎬ bƒÖXVjg~ hOe©9³ JÇKGØÝŽ–®h?‘ðAh5ØRÌ ”)YÎνIYSl ¢QN”Q7¶¾ ©€XãÿŸs‡©M$;ÅyOØûÆA—´s*;èסw$ŠPÚ»î$îz§š5É;ŒŠÀ€NFi×Ùê²_~£¯·Èp­žG³YþZ¸;•³­³‡a]&dªÑºä‚–6ow’,3‘iGXbãˆj¶ÓásþÎpÑê \SM .KE_]Ióø` }OŠ‚á"¥Ì^p£i[Xõ™ØJ%(¯ˆ`B4ªÏcß'ÐÜ6ƒì71ô‡ …(V9³Noæ$‰L êpgµÙ5²ÿnïÖV’" !¸ßܧ&Ùñ†j'ñ ž‡PÞ¼æÏ¡ ‰ï«É)8õ"†7Úq‡ºªÓDñÛ¦\}`òvš‚t?!˜©ÜÁê¨{¥Î}ĈþKÑ€ Ö–˜x¢žtbN¹³yéʹ„x§«½…€”ÉÓ-÷¨šäjÜ ÿð ë(³¥k 72de--·Ôñä=™kÎ7x6R™#JÛµ#<“ŠEqe 3öªÉ23”=Ïõ/±ØÚrpìF”#ì8ëQÒ°iŽ¡í…”PüQÀ›çDæÅ@ ‰+l°CßK„ÒÙ3[Ä~¯bcˆbݶcNŸÈƒ·U¯|NŽ·%'µ3¦…û¼rÎâ\E"0w'~;é¼~þçvA&”µ` (4¶£gUïùÎÛÙ)#uKhçüŠD€Óº Ç3¶ž‹JîÙU8²µš%^ rNÂLô¯SEWX,;ôI³ |4V¸åSZïê…“Ø{«d¨îHå.äî1ÓOÓÂ'³®:‹ô ušŠõ˵Sl\!,ЀäÌaìµòŒ[—׋•í‰æ ¹Åt’Sc>œÐ¡ ž3‰Srî,vqD–•WÚÈ8¿V˜?˜#½ÃŸës}®7™ãy™û9ß|¼°áçú\Ÿë…ítØøú«ë‰N=ïFlónÉŠßÁ£õaûþt!¬˜×½‚õ$å‘ûÔó %ÿùí„O÷ÉP<ñëIçïpË奢š= š´¨O¶ª€Ñß?¨á+Ý*òOÛ5öC9׺½´êY1vrþm<ªb,ÓÂÖoo: uïɶîýÊŠo'ËBa0%€æAÕO´ŽYEôŒñ¡]…}õ¥ý¯”QCéÍÂ+x[£ùDÿ’ÅÈX`ÐåÈE°=Û˜{Íñ³9ê)"`-¦ÿ¦Ù}ª“‚¦”y£ûœ]LÞQ(ÊÎ@"9SW"]ŠVUfä÷tR[ïׄÖxMž%¢[×SgãûÑ„2£ñ¬=öVU 3 á'CÐ讣RX`ÔÃ1„°;QíGÕ^ rñà(TV‚­cÛNÉï³×«ž¹·ÂC“Wívõ€¨ù®iV¾³= –g„ø6lµ•—+DÂf²6^Û ìVf"¾Èל³ (—ų;› Cýd˜(”t8zðœxÏK3Ñ%Û½:Ëü]-`¿ÄÈkÓ­E3‡ÛšŸÐi‹™™ßÿŸ=Ÿ¦©æü[ŽRÏ`ïµ¶×´ÃëU"´!3†ÑNÚ~QØn†6¨DÍCUGϺÍö"Z[|³»š£È@ÃçWŸ#~Ð U¯—¨¤+žñ̨±Ž=<ÃQdx—Ÿ_Gá­­_翚4v ö„L§Nû?kÈQ$>B9Òy¡«¶Žr«7zèö‚ÄG5g§ÄÈ»õ“PÉ®]X§½'í‡SàO°¢ xü–û-ë˜ñ¯f[*RÃE(æ’´|@“EèÏz%PiëÝ8Bur“à°Þ$†ãYãºDÓq ïPÆl< î QÿâÐI<–IÞ}È¢YÅi2Z·(Õ¸S• 3ìǧï‡Y•ç¡ù*ue\ƒ{&•n“žôIa¬%L’$® VMùbpªÿÓÎ àvïÑ‘ƒá ?˜ú±Ö:}”¨ž` ´ÉeÄÕä*zÆ0möÚE¡¤T²¾Ý” î*^$"f—~¡ç¢åÃÓO@W½Œ@MàHW+)îvwÒ óôEº‰’`;ò}Oáö4_))+gËÔ‡y{v¤èÛ7ŽW½5ç]Ä{Âù ž”#¶bĦ@Ç}@*89¶N?¡ Ëä1na>KPãž™¾+•n ׫C”ÁÆjî#’ÑÍe['’<¶3OÓ£äCuJ!Ç[ØòV/OßTJ)’çùFœ1ÀÌ­MGá™á˜ÐøV,K‡¹ƒíÊßG:Ÿ.Űn´ŠbË!¿S|í«òT& hη¦0+ÀD⮕f,Rj—¯7k8c>¶œ RgÝì7„í(Š¥z‹ünÓ1t½üVù—9ÀãWžEú$±mv9Ù ZÌ\lƒï‘µ¸¶´énŠŠEŒjðoÍÎW½¥U"®$gõv "•ܬÚr°Ø¹¯hÖ•¢ ë°SÚtÞ0l—G‰Ø„Ø8ŸP\gºÐ“ouÉs¸ÂRŽ™Ù¤]3$”£ŒžúKëaÏÆ˜‘/-?uÂ>'DÓÍj 2oOê^–ò Î.ç&ä £=Ê­í:ަІ> …æËæGLé Ø?àÐÿ|«A®ñº…žB°Nbv\yI3}â¾§&k¬ ®Êú8(×pÄŽëOêCã¥ÃÛá”ô#‹3??‚Ô£gyª.:6˜¤ ÎVY ÃìïOYð8ç„éNtZ<Þ§=ö Ù¥O(j!O¾rÙTîjU"™õ&f2¥{õ”ÅÈ‹wjS¿–Ê~õ:²ìhàyÜ»~“3S׉J–>æp¸†*CW¼Gï¬þárˆQû¨ìi`«¯ã0¦±L9ï T”<ê?MÅ0±\´6T”·½ØBw(Y”ƒü “øÑØiïe‰ŸkǬ™$ÞÐhdræps÷ýlÒyqb‡! kÜà_ –» VËsj†$¼’nåî_î£y»<1\Øúû3xåº à$w¿òl2îž’ôjðôñÒÝ1,Y½Ø9Û²¶êСp…qú66ebY§ü?âKÞ9er É ˜´O0ù\Úús~Õ“êòæ7í g{ƒµ!üº '÷wÈþ'H;>ÊŸës}.þ‡¿ýþÓí—]Ï9ñ¹>;ê}ƒì„??—Mâ!>VU«w|®Ïõñî{´Ï}îÜùõ¤óßt¥Ú~,óc UŸU7j8­7)Œp6bã}„:CJÔõï_¿þ*ædêÔí§¾Ö†šQ™{O%G÷š«Ç©Ý6LN¯OëöÑÎN¸=ížßsǪš ¿ßéT³Dòê0´Ê+ڞܰ࠳l††x<žü?îÎ^2w0Rí}S;WmÔr¶X?98´Üå@©£ÿ–騥a…ñ•z]·¾wûÛÜœêeó 1m¶w¼nïɧ!‡p\ýZf†v)ø2bÒLÃØêí9 ™qÒ~\ÍgÓZJõry¿Õ– v†Ø#Îä¾ÐI{s»löO=Wf î±›NÏ'Y\Ðs¡©‚#G#ßslöN÷¸š{¿rÍ`PªÒ~ÓZ¾—¹»2¼©b ÷æ*ÇÆÇ­›+c›B3,}×À½…ØÎ*ºÐón?napÔ=lz/ßài\ˆÄ¶>éº&³hL»Z%Ã@¡îX9—™ã‘bó`‰ãÚmM5h¯à]ÃÉŠ‘–É4ߎ¡hX ùû9}ÕlPꎺÐÿNSR›=N/­R’3ƒ-%ôUÑž!¦£¢RçÉ}á˜îàá=ÃS] Ž3ŸI®v7®UÅÑåæIåeQˆ×DÀ Áq˨êͱ8JÝAâ’]tü[³zÐ^ƸŸÆ¾îŠGR„±°Ët³Õ³‘ÃÊ~´ðZW€³Ú·KïXŒÝATŠÃ0y$Ë\Ùk‰Š`ï TÁi ÎÈ`td¦­òSŹ/Ö®Â}2Ž»Àu¥gá銻 qÊE{xö)÷õ‹ãTŒ UWœIãà´×ºš8!9QGš(jÅl¹_w+©j]Õ…Í 7Ë¡ÇßèÔª°d˜N—†i¨GdÙ¹)9²^­ýÙaîô·³&¬¾×Z eÆhºDÌÒ—Ÿ„ ú3óX•c¢ö=²wޤOsÅ㜶HÛÌ?YL ›±@ Ýcß¶R×û;9\®I™†IÑÊ0ž¨prŒ n*¢¤¡>H8·7:šä(Gæ<®ët<ý: pÍZƒ+ýbÒyIHç™5SOiŒIi´_VEp%áÚJ±ã¶TÁÀsÉ@7·Ó¤·–©¼±õÈÇ‘ tBÕaÒÆS*άáÍ«ÎG®¦ßçÂatS&1ÙÉ{¢÷yŠåj#yl£ÈóÞ°ˆÈæ”lS$_|2DnMTÚÔ0‡T†K“"<ÂñWí®¾I*c}ò~5ÅSö”€)ª  … ôžØšª…=Ýw|Ÿ-9£Vãó\êbA¾qDÃZTw  ¦Ô`l2a×{ÑšsäTâ9qh/+U÷–ãY­cîbXU~èçq„%ŠóÈ›nDÇ3ܨ‰ÂH-Õ’àÈ õ —äÝûaÜVƒãÅå1’JËvsêu&,ïÜ=mÚ8Çý‘å~£ºx$ß§Þ7‰{JMLþ¨Ø21Ò³ìO„ˆ,#0Ã)<Sº8EÅÁÄÀº,Œ²Ð-–YvÖ¿äœ1îhe•®¢BZ§)ŠÌè-|zlùϡ̩að53® wHuhråA+˜ÌLàÇÕy¶HÇv’åžã`L#šøh(]–"€ôN8&O:I„U%]RytÞÚ¦ÅY&NåqÂX0ŽUq™@0E”ÑÛ«5fhAôáØ±O%¬=¡dÐ+àu(t>(}6[£6k07ø´ñîWØ`áM–›ùÞ£o´Vyù¹¸DËÝI‰Ö^û‡duó}H6lãØTæ{@ÐòëÈ!ÝÛ¡óˆlö]™ñÁ4¿ÆÚ0‚“¡þí:{S’22b—‹Û±Ð_áåYqçqw9QaŽE @ü8Cb'˃‰bÙTRz4Où•é8DÛÂz¥Y4ôÙ°3¸EURÄ’÷$´¾ÃµTÁR® (b‚“Mì'8ž¾À¨õLN_= \2•I‰aV‡°Š¹báBnS›Ån7Q²aexËjëpX$ÄcT;t¿t!Ò Â’í$i¢£ËØÀ¡&.ž‰Œ¬ÈÍý"éÎZ¢D¤R´Æà¬ÅÌ<ÏD’ñW¾Û…ƒxà¾ï¸y¼nϧå¡T¼N ‡d†,à‹ƒZq·.UvïÎé/ž'`Š]ÐjŽahÃ8Ômÿ!Ÿnê¦TFpJ”rá3o£Øyç^ÃÈTá˜ïwå=3î©oÚÀ6/È—Ø“òö 9Xr}ø¡×§Ùñs}¡µ=rŒô‡3`‚ÿžŸCÎsxfüö¸WZí°!Ž9ìÎÂ#¿h_~1øe•Å?˜Ôå_D¡¯oÿçR­.(+•35Y‰Þ N­¨CÖË· ›IU#ósއ9ÙýS¶I}{#¶R×ÿå§çqÀO±âßÛØõ&ç_¹kÿs¤ó‡œ*¹ðK‚Á,Çêû¯Ë`"ËQ(Ï3†åÅ£ó/…ÛÈ7QØ„€!)cU0R轃º~q™r`¶u RZs hu£Ä´ *$TTÚÂûM×w§ð©î@êN3ak’&ù õ Ò¦M²ltiº¸Ge¨zéh¯‚Þëñ5Ç}˜F £ :ÒWO(jzegŸïBØ^í1y¦Xû9hà¨fy7vŠï§•fê"+Ú…2Ú¸t1²Ë…,â^¯ßCà ³¦çœ9'š3>kí6B\]vbÈÒäAñQÁÅŸè½ì°9Ø¢-BÓMlh/™e)\7é•aŽ^Ì-FãH~µ?ýmãBZ•Ÿ=†)¨O Kw»`FiH÷N>3õßv=µÈÿÜân0§ûVÅg5g¯P‡vTGŸZ O³Ì o.>‚§ŸÆê0oî}–g»Æòÿ*éült}¬X§a°âhŽÜÉyÃ<‘€AHv’¦hû¹Ú21å£JhRéV ÁAÑ$P[×Ôpd´Ó>*-sš'Vìy‚#ùmˆ:6ä‚/tÀ'PõÓ‡Ê( tŸø±ÇÇæR;‹°ÝΧ|—­gÅ%ö1žwžq ¦™³}±`˜‘Ètî‹û{¢Ç÷‘պºmq°}Àb¬ Ô¨Gk÷éè¼ã£sÛ›C5†«$7ÕŠÁšÙúƢݣ“oS6ZÍ¿²&C8€S§(…R€Äþòš@%ˆØö~nm‰ŽXžÁ®`q+ G}Á ]„òü &6‚´¾!›Ð»Â„Êu¶ÈTóHºHi Ö‘_Î¥*0õ¤¢9eZ#›‘7ÀÕy¡¯X8‘‘ÄYsƒUO*'Æ–‚#¼ø8[gg9"Öv¬Â$†‘Áiû}F.ØÒ9|íŒfãùf"ÞÂêx@F¿³>É`2|ÿÒΤ²ÏÌø \Š9Aà3 IúøR„oLôÃ@C  ¦ƒpvËãq <7P1z]sçÄà¨ò^½Í‚öì]}±/¸ÇY´i–Hö ZU­›,A™áþ¦´ú ':ë\מ‘ȆÙG‡>K]"ÒÁÍ3•œXI`“1\ª‘ ”ó€Ì-°6Ô ¢$Þ.&<’©V–`ÜÑ¥šPÌíŽÜ“)ц < Rb¹9ªcüdcý¶( ̆ˡö¥\§~Ké#º›ÌÐ2å+¬Ð7æ&ÊEðÌ ¼I,íC :QØI¡/<Úy2íjaþ yM¡Ôñø*–ªÕQRvû#”’Á[\ÁòÐHÜÅ×TÉ0Ÿ\>^Ýj¤ÅÔ?5ÎO€~Ðf@eˆÔú|<Æ1rdORZ•³¹k86Eפ[{ÐíÌ7®$,Sv—t^ eÑ‹a&Á¹„Ú»ÌÓ0d 9š™yGÞ;öß{ªFž>ÜFDêiô_OÛyýh¹0Æ(y"æTª;÷¿´ß•²¨bpº’w«æ„Õ¹Œn”Îç*< ÝjE>”NuÓÿ~Û ´˜”©eé:ÉH°°—w’œªÑ¡ÍcXÜÎmè1qŽ^b£Ý‘t~¬é–ó¤¦*¿J*VP·*pžÝžùV»õ¼áED|þQ€|®‹î#ŸJbøJ"‚³êcÚQØNú°yuÏ¢Š„KDÜ~ÂB:×°ƒj!xðÔÓœR<Ôç 0­ê›ú/Ðåx'20çâ8}“Yù5ÊhŽa\~4Ë7~ Ü;ôÏVOë¼—ׇí'Ô„·aýBwTÖÎ;>×ÜO½¢w¹°4ÓøŽôŠÙVؼ%qÛý8Çå^/(⥯‘Ì$?z³+Í{mÈ¡5À{ßê«v>Ž/þ®ÝÉw,û×ox"(LtSwPxƒóD§íÂ;öš‘ã´É)-26@@+nâÌg•âÕ†8ÿhô)<ðH«MñS:¾ôÜz—÷{\8ïà „à…‹X使Èf_&ŸbõûÔ Å”y¼fù#ÝâH ‚_¥qµI[BÀw Þ½Yä*™tNù‚tþè1—–Þ°³"ºc%cвb%Êj%þ=çßõ'€×U›Á“Õåêš—\',üÌÓ÷Ø ŸÀæ ë)ãÝâáöózÉq/ÝÜú¢)–ö¹%6ÈŸ‹.iü÷z«"ñ˜š¥z•eÚÁÁ‰k]Ò!ؾ‘Épàs¯}T½€ÁŒ2™¬9ªrjýwˆŠŸ´e§<è®gOŒBõ ˆ.ÅA>\2SšrPñ©vÆVÊa&_pÐ0¶2 -]~4&[±ù ×Ñ%†/„O—ÐOW,¸?+ˆkËû56¸ƒsú]ü¥®œàRüšÍÓñÜQ¸ÊAùâùB”»½!]|Êþ¬Äç n1È‘$×¥ÛòŒ!‹ÕØ4qÜhŸþ=¨GŠÙ¼1Ôç4~HZ˜[ ßjþå ̃_U©WZUr›EYeÑy'hˆA£¸è¯CN©ª.ž®_e…ŸUqtÜI_ƒܳûÖ8s×0ž¯f1gJ}Ëlщ%Svµ+QÝW¾ã¾óB„00¬wRœ{«ÈƒO,U¶mçJ—åy„nŽyåû{çN“ûg5sº­íÃw£zOßz^ÿþÎì¢LýQ'‘ïx“Ãg=àø_Âù»ÒP˜¶ƒÙc;Ëgͱâ6ÔŽÑä–ws†y:‚ ´ç¶´ú‡t>Ç¢Œ›tâ Ô¬,(G«c¾wÞé øÝòdÈ#Ÿ+—BòñxHëÛiJv.ÁØâYä<öÐBÝ! 哺2#Äþß_¨xÆòþuon}e?h\YcŸLŒU"U~*´¢›*=ͰME™¯Bର.lg2A#÷|âà0¥çOA»\áu‘µí£<ŠûjnüØ;¢ Óú²ãá[V¥Z8;XóVv$¨©ö‹)2²¿aÛ9Þ?¥1Ö†C,–œê˜ÚÏ/¥<¨ïÇ{9úkø5i•ƒÙƒæþéWOjû[¦B5 ѧÊ%t²døùïýd€cЀgü†eÒ0c† "›¢ž PäÐ3ðju !§ùa:ºÔ k¡¶4мú0³a ô_Ãw‹*¾AZÇD4!†}± P€"“ÒüÑÞ;"_¥§i³¬Ç_-z°SzLm«ºÏx(¶¥8²Ñ0Q=Sÿ$n/Èr®fy€b÷Q|­ãB“+´ÙÇð¨Q6$MóÖ76ó=Vª[Þ§ÈúGq€d°ô„ºŲ́x‚b IL¿è•>çSàUsiÕÿÅ“ž~YÂ1SRžõô+¾:ìå/†üç CJ;+hE©FBÅè„t…«¾«˜òèoïyÓ{q0>îÿÙû³-Wr&Yƒ±²ûב.´–ÞÿQϦé‚ÀG Á sdW×·+7“Œ@>˜»™K¨ÝNn“@‘ŠÏ1ó†FOÍ¿©Ã4r Ã/Ñîǯ{Ÿ¥¹n¬úy;¨2>D tÏ ;– fm#!\Õ\Šaöœ£NgÓ´óC€¤*Íì ûâ"\^F„Ov d0¢%ñˆ¾I³QÌc£Ûg2C(W/zÛ0+`…ÕfÒ"‘Žh~¤ e½øOø8̶û°I,«ûx¬Âæ÷ ;ð@}Ù#'±ª°M–>0°eH€k?#„Ѩ1 Hl)¢1ì J”ߢ“f[2“tÐW„øR·+{øZ €X‡þ:¸¾ÂúÍš6?2Mµû(–TÅðF(¢e$ý—ŸÿŸ):¿Vþ<69|xZ…îÂcšÍgbpM\†ÇÅ¡ÞÌ ¼ÍØ †q§Ñÿ‰5+P§§ÈùA XÃÄ_òz„@ÛnIuë| Mš“/äÑãïÁw÷¯.-P;ÕGÄxHêpK2‰ÐÀ3´ £AÍ€`1W¯I×Îoµ;!ö#5€JXd‹Î›N¤]²/“³öÞùÎ}¹hÆ…„™ÑÓÄ¥÷¼,îß ­[¸Äaî§ä–ý…ñ²;Åô.^Øûç‡l<œî‰ýc nxAOß#¿,¬ l`Ф×:.£>‚èêU‰+OäeJµkE\%¨"Ù`—‹¼ÀˆàÅág})@È·k­¹=ô¦MR1`k?ÌÁôÏ4Å¿ã•Ô½ß÷ÒÞ¯æ&¤/¯”³ÁnÀö]ûHËc_èÞÞÇ"¶]:Z2Âqf‚I(kÀöÕ{ôgwLëéÆy2¨Jäæ4Uhåža\QÓÚ³’/bà´1{Mr8~ŽW袼,0“ÇVµ}W3µÍXHeÆ ÑO2ÉVNLhM»¬’Î+|çwQÊàDŒÏ˦þBÑù0”ÄÙu|†°‡QÎN¯ßŽæ>å\f $ée˜±–»Çùr?GNº½êáÅà!3¥oÆâ€—ïà¢IÂes"Ï =ÍZ*¦¼Îw—ˆù¾¬ÐÀí‹É³Ày!úý%¢ó_-CÜ{-U´ÁÏH^³ñœ¡¤Òu$£ w&Z«·0’FKžK>@¿ªGm:üìÃu} i›!ÝŒ;gého`û®å}aŠÉQ²¤{ЈìÐ;‘©à*RœC½¥:ΤÔXVŽìý±¾÷ÃzÅß)â1–X ÂQÛ:Œ+å^ ¹†®kä/ŽøFÜõyÛQ¯íOdºØ+±²æñ¸T1õT ‰ö’•Ùé3/G=´þˆû‹[Ta=ú0”‹©›æ"¥ó 渣>—VÞ@”ÃD‰Fq4"]A×=D¨ ­¢îSYûD®vl¥° jJ|ñ¤ëÞpIçÍ@¯ñH…‹úe:Y~ÔÚn„ ¥ôø—6‘Ø{Ý"h]Á‘C1Dˆʤè¤(Jx¤ZJKuõé(±©x¥=jšàQžlêúìÓíb,Ûib㜆<g " tL/œÄ@HÑ輑½-¡tYQ…?©QúóygkT)´/ã!ÐߣR™²øÈ0X¤$ ¾M%P`ÍB,jÄí‹cófAüE˜·V"´Jôϼ›`ºg%$í¬w>T€ªÑIž|hä ǨÐ1¬ÿtïÇžAk¿3­§Æë¥3ãT…臞D`tãíBÉôEtW«üÄQû|—Œ%Õ›ëuÁOI!C¬>Vqs;΀SãÃîþEf•¢šPmL ÝùYž0-ÛªOt±*RÄ8ŨrZ˜TàÜËQ¨GPÓj_LÙOÞ>‘ÆÔ,)Ñ”ªå­_Ó!éŽÛ,÷;ïbâÁívHrÞªÔwdâ¥_™ÌƒÑ›„QË'“ z8ÒÞ’˜«A¶¡Õ*uÑ‚n¼†X–ÒÍöY=82ÚnÚ`‡'Ÿ’':6SM•¹J4‘!·(ÈăðÜÀˆûüA;²` <7bš;˜¸IÖßK'Râæ#ËXFl Þ↲V&œ q.£y¾Éçstw JEI[¥8Ž×1<\ÿ’~<ᮺ”© Äڇફ'}phs.lchCV„4ê·Âþ]êêvÈuÁüQqõ«Ã~—àÉ£  ^RÛ +tœ:„T™]ƒçÃNÀÁƒg›–`î´®Âl—•^°÷vFHoUŒOÓäçœThŠâ­ûE§µ;äAh›ÛàûûÑš}M†}F1ô¿ÛSÌüÓÖœììP³Ò0wxXgqÁ%®îÑÿ­³¿>•!ˆÌïì;†}öWíÚ3QG¬FóØÉu£É!þÇļ?TUmÊ£¿0ÔùWý{}æëuÂ9_œÁ¼?v%ˆÍu`ë›C\0)n¿w•/IgôRmŽ‹w”›OÝõk€o×­|1¿‚oéçàªf¯Ÿ~üŸXPq³%÷~·ŒR0×xt3";àŽy\œ\D±¡FüèC$Ã/yV/õëN·g´>Œfó¨É;ÂWÈμ;…ˆöàÚ¤ÜW_¾âŽ«%ð—?xž—=V~úhqMøJ_Ù6o¡ÇtÞ³~¬èüÆåu™T,XBÕÜ|¦Àè “ý"ïK9Cù¸äéƒÿÐÔƒ£ š¥ÜD×îž]‡áƒs–ѳ`³jÝ®_…$pÂõDëòн›0³ÄÉ‰Žº'¡KI”;ýã7F’Ê`*XC(1á$´m¤Ç@5kPñˆAæVÅÿkdmëF}®H½–}\uØÙªEÝ £×¾ÂW4@ µúI}Y¯©ofvU…š8 š¡XÆ™²u}0BÇH¨³ÀÂGr8Ý(Ö‹óöÄÉD¡8 l±ÝB£‘9ù+-ø ²t$Y;‹U 6è¿•ieeK˜Ž´3QëB­DddAºXd‰AQW˜=f‡¨¯ÛÑd˜0NÚ=Ñ •èõ›/ÀS BŸˆõ’P0U¡Û¤NNL°IÜc§q€=H³?š3S(ÏÒ.ò|©ÍÅh™¤òÖÀÝC´¶D.ÅzËDoÙ€x49È¡ ˆpE•Êפfäî »ÉÂ4YJ-ƒTï®'½ óíãT §1¯ãxcÄÅÎk­KŠêGyh‚i{„m´¦k’ý!£Ü ÊíVÚ% OhRÖCÁôî$ä…–€dÛe4ΈT¬¬ºì¥‰ÙýÜ;rÆö³˜‚Ám Ñ9ÄÅl¤&°.-© §lšf(ùHC¦TMØ/Ï94|yêæYj™2^Ϫ=þ!òhÔJcíO©bA?/ïå×Áðƒ–ÛÊ×4ËàÇE%¶è'‚y™dX=ÓÖ*ªÞ¼+eªnÄF7ì,›hMY´ÆÏÊn¯¢b XVsîŽRœ"MNÒz•¼X%Q )=´;»’š¾ ÕúÿUm[ÛÓû2°:úlí|>ÿkçªÔžúÄ*5(ÛoJy F6•dÒÂå²Dëãèe~©±žLáÍó‡+!| Ý9ÅÔ¶¨5Ç}dCíY{*“¹ìGë?pC=þ³Ïb{‡ÃeË›+vpç¤h¹ ¼LÍ´*°õ¿JÝ2ЀV %€ä1¿ŠÑ•ÍA”‚›µW¥¬e½á¬´Œ UÓl&%«P'€HñdKýO?£ä†Q-׌Ƌ_(¥”Ûráç-—´ÇÕþè3§q;¶KëxS6¨«Éõz÷ü¬CœnG?ã+ðš{wOÂìÍû™Äö-“¼Ë½ÏÊê†ENtu–QßppbÔbΣ §©gÂvœË ‚°ýí)C0t±¼zÇr_¼¯øÜ7ÍÏ óÏ,ÜŸŒÜßëïõ÷ú{½6fýR–6ûÃ^ü›óõò%½ø¿wÅáI€[gÏÈÕ±¬Jý’‡q!V‚‚n·r»ª¯¿×ß«|Iºocž>#ðꌫ‚Ä_îÿ»"5ûGÕͬ+¢"Õ¤ºh ¬ë¥÷R’žeAF)ŸÏôå!Sk)¿ZE^zÿ8"Ô6Áç¿Ûívà åvôv@uŸÊQZKmëEFú yHgiPjõû—¡D£œM7¯ú(¢“IQéÈmÙ-YÞTÕéix½’U9‚§ûcIPgSE„öæc‡‚)MÝ;Î>qn³”"é» Aÿ’ª èª-¥¦Á1WN68zZ­xª.|ö‰Ò”{»³m¡HÑä3ÐR‚£ìеpD™Z>kèq‘¢Áãæmí&· x‘ädltžšÞgÇÌâFõòvX05ÑF õ ÝªôZk¨Š&÷öÒ˜8à¦DPñ8õž×ls.0Ä4AläÊE+CÐd/‹N["w£_> ö²™·±àt{eŸ¢ É$ü€²#¬ YÝB<sèçŽÍ=Ú¥}˜Õ¬œpd'7.kcŠÇl¥h»ŠñM S)WŠƒ`CS*+š+¬F¹s¢‚f÷ôaë+v¼‹F—o”aºhÚ쑜Ãî2<}få‚=¦ªƒRp̘¯ÖQ8ØE[Óñ ¥KÒ]üÌ6”¨s2N«–|Kok’S¿Ej–u‹E9ìS¢•zÏ,Të¿ß È {õ°d”öÅ«³$íN£¿Ü²ÙÅ,¯ŒÝÉx8´}Bšˈõ%åeDpÎ5Ɉâ?yãNI³åêë.Éõ lA×n_L|iL©Ë—¤ÖdD5_sÅò(vaÉg|Ç&bÑæoù~ºèeôÛIw\ÃExÈ´uC<,¶éb£-ùºÙ]Æ!…“åÓ²R§zÂ} £áZ¡bíUtÈj.éöíYW2·WbZ¬Ñi™=&/€Ù¿Y1µ’lÜk–ׯÂ3þzPüƒŠ/v;ô?Ü¿†«©iµð¥ÞZ†sb™G[Ö;IÖKjuáu=JZÉxš0o‘`™f~X@ÎÜõî¨ïü=û«¨cq.î.<ØLzÀ5Šó„–éð^¡iÖP¯¦+ãg­•®ébë2ù0gާ*š\ù!øB@ô¥Jº p*¬•iÕ!n •45¡ý¦ §DäPÁ¯ã6h°"ž°8?Ptþ´בþ*õ3?D±Ìbž7A3ê†IGÈkGû¦A£Ãÿ5 ÐG«¶@Tœú²(¥‡a`ÕŸtÿЍ õÞë«ÙÖwò?Ü €ÿþ»ý÷ßíþçößåvJÁJ0ü`Å`ç™\Q˜á‡Ë^Ç_!·4é´‘aü"p»ó^!tœ,ò|:U w%€‡+št‚SÀ@–Ðàh|1%›S–k2œFMßÂm]æANÞɳAÐúpDÕ'ÈÆ:¤ð/ £¡ðCDyö-¼ÖàêeèÅ1讈B®›õJV•f­1ùò“Ÿ¦¢¡åf礲;ˆh×€»%›ðœ…:•ˆˆ°•¥–HÒAmø¾ó#Ó'ugìe,ˆ^ "'Ö0È%ÇpžÜ«;ÊÍÿ˜OÛ"H§?ÜQéݪ~13ÛBÁÞ¶ºõ¢ÖñT%*qR%¨ ö£Ÿ<ÜÙ©#¥C‰vm¸Z¬î±§ÑÿÑÈKiÊŸ¶ìÄkØO)]8¥e˜c(k:žå=^ê¥AjÊ>sͶ+ómw-{©§sG22A“جyÀR‘¶GmnÿÏÿ|üŸÿïB¶å%„œ/ÏJv‰ËC9å4ê´îð²ì CÌü  ˆÏÒ8¿å'¾ªCM‰Ú£æñ™.ƒ¦2wŒ£~å…‹læA'ŒÐôö¡wãË)wXßCµŸŸCðå)lýEÇà²öÌjðoÿ^¯Ÿi ðbí—ËÅ$*…?á•JíÍ^ù{ÍÒø]jÔ/Çe­7o—(îýÊ+OUxn?ãýB·_àqÿ‰i¬ÎXžèɸÝnr=Ÿ•Šüíä?_ü‹Ì}Ó ˜AŒo:¡õŸAÊ'»ßï/:ÿ“¶t+äԒN“3¨VkNE=’Ün…„¦; ?Ê7üïÿü÷þ÷ãÿõ¿ÿûÿþ?GYç? ‡%þ‹b²ˆ%(×¾‘¨ À )ŒÖ6MFsPº[e º{½N±½ÔÒ4»ƒÕ³ 1Äí…Þþ w6Æqéô£Z0#KÛ¡Hp\*Äöƒ·„2àôn3ôT^ÌÓÛÁzñìâ= ?1Z: _ DŒÌŽ\¨! ]œi­EP+6úƒÏ$jÞrºÖi§ÀÕ9|TãœHo×y4~|É37ÌN™†OY„šáÂ|ÝøÀp*ö<QèvÒCÿ&rašAäyåO/z20ô•Qr-»ƒ^Ó$ÄY–}¤¦Õjè Õ‚ibí˜Ü,ÔÛ)ý—ûÂ,«}|ín·ÿþ÷þ?ÿ¿ÿ¯…_Û}1_d”Qr1–¢ô»)çìÁøSÆ8ÊãJXßÕ~H«|'rì&êÏ0™0›øE2Lf³ðàd$êV#÷d€¦8Ý5*·ìn€3z}C¢Ñdt”§P;Ñ6œ÷\[9Á~ï;HÏxxpõd!ÉM >õ‡ü} pŽ”ÊÐ$¡œ›‰Ô4ŠÕVÏmº9¯¹ƒN>ôˆ0]¿ÃdÄ‘£×}„ŸuÍYAO)±êc-±Y§' *1…çš í|?¥1É'ËJ‡‘9J,ω@ñ(jæu7ÚôoÌ¿jgX¶-HszýQVØå—jÆFŠJ@å¡n‘ªÁH _oX\´´ê[”Òfœ:¡,E)£'‰¡“ÆöøÄÉnsãl`$`eÁ†nM(Ý6©kÅþSÉY $J#±;£ |á'÷i[¥/bLøúÇÍ(xÍm~þ^úSî_ïÄ©@f×G>uÍ-Ûð-DÀ,à«…¨ˆ\%?eÏpº©Hf´–ã{@°$à“‚\C?˜yC¼o?\÷@Çã7®¿n¬²sÒ¡SO@"ß×1>ŸâÈ/Í+;ǘm…+ ÷ɾÁ\…/àëð.à;ˆÎŸ°/YðùIÏ'ÈÚ’‰2Ö“öyu•qžíy’ŠKò86•-Eç | ?ð‹ü(7U-Z@~w¡V Lðk=C à¬;fe•1Áë|C¶{·¢ÈM#S@¾KÜŽsgë´: fìê#âg­¼³Ü‹m¾7lò6váøÉ½MÍi“9¥JôŽAH=¨ûtÖ¨e•†¬ ª50)—kêª= $} ©6Eƨ•ÁßÐtéßDÅ]k&À·=ëBXÚrA«SÁ2ß4“ŒêÒôðU'@º1H-–EK’IEÜÈJ¯’OȬË0™x<)ªBÛ¯m^ “ÄÙï¶Ã˜bsƒµ<1õ11âèJtk±>Îý'}ÆÅžõYuÚ§ø'¢äç¾›ÈÆÛlðø…8gC^ÈŽæò2YµÅEmk<ÿøTw'Sÿ)è´ÌNéi!£ãˆˆ)DÏ@œ›”ùÉbN6¯^S[¤; )žÛóA.Ç7!d]ÿÕ³·+ÈÝRLÐ׆î+»ž ßšWqÝXj·} }|™á‚:j-E× Xp’s¦|h8Þy}ñû§8yÑ•Üà-ÞÇý7—ÍÆu#Pæ Ä'ê­ÿ@X1v×;ßæÉ'TûÛd®,¨Á]‹Öï—± ] Eµ‘âRLj-"‰aZ‰‡¤¡„ x¬œh!m 5/.Á¾Þ-³®ˆ9Vߺ=wJXs»h:t}ïùȉSÉ­«”Ž\QéX$Ó£…±o8‚’À ³µ5¸Ã«ŒÅ]ÁœôÙFjSf9hav/Æ~(‰õŽüCÏ[/oØu`@Ývúè*@q.}dúŒ !Ç²ÄøÛsµu=¿²è<”–õ [ ˆ§ÔÙFŠŒ!·–:;ˆLRXt29y¸»*‚Œ›&Ì$5k¶ÚÐ\µl šÑÏs®ù¥œr„ næ—åZ<¥”'„™Š©™|Ñ~ªæKL±k‘zÂ4ÂdØMBDMã@i)†wâ3«jeï“kpê&µr  Êã®ÀTiSŸiG†7ŸJADjê€Bh‰õA—„Gr>!ƒnºUrÒÁmê#Ez¨’ÏzŒÅõ¿&§æE d¥…ïÝ>xF°Ùo‹Ku1ëƒ:€Ý„€$ÀBTBž±³5xA”²ÌÑ!%ËÒÆ­°Å"ŠðÐz´PÌF¶ìI šsì™\ H®£ïÑE.åZ¼l¥"M•Ðh0:½@ÈZÅÛa¡tãCm<Ä ó1…GnBô6hO„KYCUz%1¬A9Γ#ÃA¡Þ(éN ×Ý¿‚Yc%×Ë´è±ùïÔªÛâ™fÖb+(!Z³GûöTI´æ=g…ý]|'p5.^³Â„„þ¸Ai=_†L½Ý ñ£íÆ$ôÑÖhºÈ4EOÓJCm6ò“Eh×J“®Àfo²•ê&c£Â ]) jÈ­pOÍç7I]c:và)p4x´›VBGP/»Ž¿r«š¨¾ùwBª¶àÕǺÌovÃYÙI'=€"ÔàójwŽK©µVþ‘@郮dà¾\(X‹8bü’ì=(ºõб*ó¡Šo ²è\Ëß@3ÊU}h(€ÓéÑÈd£zm!6v!G bd;tI[ÀEJ<40¡•¹»;@\ž,N¨Aÿm§ô{<”.1`i(5-_"Õ o«#eðˆXìFC5ÈnØ’(ò˜'2­}8R)‘I{WÄHåj½iã2Ò¸ªšë„Oºþ‚µQ}$1àFw…ª‰B(ã±|=@hQB¬êÄ6š¼/ã  ªŠ?ÁUËgN<ú¯2W 7ÚeC€ÉÑб×Ã\[\FÙ½'<Ü „³R3f-Ô?0ëo5#g&%”ò¹+‹ ?'úcçñÞÓúî=Ä 1Ù0§XžƒÛËÀ™Y[kãèi!x%-N5Ž‹ÖÙ3ÂôfK‰AE1¡ÍëÂuduˆ¥ SIÑÖ#g‰Øî4Íü6ÿ">5MÝI2 Ê~ŽU²/ú8øíœ´æ­Ò†óÐê„#K~ÚX•â7½Sã ÑOJ"cn¶wPV¬ZÞD:ÙÈ`kP£,¤=mcW­m͆sdnŸÐQPÁð8¡õþy l£§e a ¼N…b‚åï5;@×Á8ÿ|öT#C–…bàîÒ#(E"kùðT³4`/Ðb(rõ̲IÂLM#Dwô·ÏÓ‡Ê×¾:Ö"3œ?¶‹ð¨ÔÉ6?ռʚ‰"pÝiR³Mo7HÇ~ˆ+dèÃQør7-f×®kFóA‘;H¡CÈÇa7h£]ýÓu÷kÔ|$õRŸrŠÆc7õ‘!o;.(1›}âê¸õ>µ†Ã3¬j¥åƼ@YlL0œúïË;‘‹u}aC'î Ð^>”ŒI.dúmvÈÓ3Õ–gã·ùÜ[ºµÀú4(CwÍ`Wèó3äoñâ—¼9|óÚ9I[€ù›ƒµ® N󻔀C7¢dq ÎOU¿4eÿZÏODŸª`ÎN}ïðÜéøéGŠÎû)èÈye§ x&0£eµ°xc-Äa°†’i®ikš)è¡Ê•±d’•+'z)ý^j4¼®Ì+IIÕ7õ‘ÚŒ[Â&ÑÁÞ!JI¿ô”ñÁ Tˆ%tÈt!éÂéãí†N‚×îÍwǪIÇ]³éMóò²›îŽóB3ß!é%cWûŠDHûM’B/¤ª<"!ÐÿHTº7Å2ãôÔƒ¢híI[ê:M‹=Î 6rR|`F‚ƒ Ã4Ìê*[ïqôz£ ¶Ë§ã1<ž>MËœõŒu¾‚@íÔ¨Ž¦¶Ueû‡¨Hýý©b_<úäO+5¹ËM­ÎƒâDbKóhýƒ}Ö‘3ðl G(é÷ÓÕ¹üv¾eMŽXË¡&†ë0è·R¥/ºut"©.Qb­†æšA[¬ò °Ëê%€႞ë#ÉËV›2$×±Ÿ”ƸtO.Õ•è—­¸ÒS¼íD7@¯ýWö>/[„ %œ)5Üw§À[ ’ôZªX‚f1f ±@ÎÇIÍ Ðš»RÚCˆ À¸AjıU˜‚DÂRZ*S=±AmQÑ»ß7PB@PU`(¼ ÚéNv†·î)<(¼pÑ/Ç™9)Ð àý¶MŒ<Ã;œî˜„† B[mWm8AÖ—;ŒËD|÷É40ßÞ&ô­Ór:°ÁÛ™½a¨1šŒ…¸Øð@î£|¹›$¦‰Ì¾Ò(¼c0 ­Vìó©4%¥¢âZaFZ^ùÅ¡> …[ÕeȤ6µãV«beÁbÂ(ÏÜ‰Í·Š‰4Ô¡1ù 5 A‹ èð—E/_ÏÒnÉäéÊÄ*À’Äž>/MÇVoÜ„âÉWiH"øT<Þ,eƒÏ» ’óуuKn¶gž(B¦ÆX¦Å!¶Ù6Ýk²š µµT¼¶òÒI’Ì`ÖÇ6ì°ÑÇzÞn·ÛMœïŽÛ"ËŒY‚Zİ£²Û¦îùÞÿy= áj­‹Ðý ûs/ì¨dåUº&¬ëBW2¤ƒŽ4öh$y¿Ìºjó°4’òçUp¸PÑÔ.îLcð‹íÐi=%µ)Úº yDT3&a?Ô.Ó(3ÊÐjMk4Jô´ûnÆáºâ µ>Gý¶Ñ,£ !Ú·ù ÓÇœýCë´¡”ͱ§Ì’yQÙÌnº&cpÐÓcª&É·#P7uÂÅ! øUr£GÇ/tÆVXˆñš}½È@Ÿ(Ÿ×ûSEç@+y:Ð$l±j™5­KÈÝHå²e±TÊqãø{q>:€#0|X¢‹y`ðDI±uzšÅÇÆEüŠŽÏžf.›oC®Œ6¥þ‡¾q¼0ŠP  x6 5tI7Ø:,O¸]5¬ø@ìÞ}·>ï:[‘F(®Àw=v*ç©Oã Ü7]¢@õ í®~M9ñFêÒ$‹£—$}+<Û–ÀíI ´÷|­¯˜:ÒçÜÔ÷´ûÓuÄé­ý¶Õã ;€W-äb·µU­4bHýX,/–o­ÁF0ˆd¸ÈÀSÏìnDrpÒ²ïÓñ@s‹×“BºI} ïµLå🳺q–€„ÍŒó½|Ѽßt“´Y9Ÿ˜äÂHHƒmu‡CWžÒø€Êÿ´:<9PÂhÞ•GÖ–¸@c-jµ0˜!™l•áè”ôÁ¨ ê™ÙI/¦6ýˆΜMú]„–;.æ|T$¯²Ú›p…}ø*hÏ“ _¾š0Ú`m/­ìüÏc@Šú·ÑÜÛ:MQâsÙ÷Ï?ÍxÆùγXqp üf·œÀ¼xéãÃ9µ\Æ’s±oÀ‚9@‘½ª˜£„gÂvd˜Ýˆ#Ï:†ãú9‹Õ9`ÿAòżóåÚ>uqž7”~iÿ{ê9<ý^œÓ1r¨ÆOªg^r/[j~Ÿ ‰}ÛžF½®O3>E˜áÌ~Qí·V'å_jß¼êß.8.¡.|Ò:¿qyOXøç¤ºŽ™Ôê×íìÜáW^ë«pí:~TÍ@‘²PÎ ñþz® O+ÞJB#NšœèM° öwZ¶sç½­cPr>œµÛ~Å`YV¯ßN'ž7•O¿}û1!($ër$œ4®l/<ò¬maÁ¿zª@?Áž_ãúÞ ú'1z2ˆråWÛ:¡O]ø¶!]uN!2›RëJOè?Otþ‹ª@q¨ݾw(ðÀ(¡2‹)TeEi¼ˆïDÜÂî?§Io$KGQ¶ó.‡°›õ39»äâ;µ@Ùß^,ú{+oOú£©+`0¡@ú$J ÀÚušÆmGs«Y¶”î”lü¡ÙB{+ @H"³wÕ}¸ŠM.¦2á„Ìœ ØÕ®4V~xÑ c+!ˆÐ­ÑèJvêmìçXÖˆ2$JÅùAp!¶4{C³k h1êˆ FŠ`}£(µ"Zò©Ðþ(ÆlÑÖç[]Y‘îKÑG‚ÒÅÛnTIúFÀ>Ô¸jÜÙ¾ÁöùÔã×¥ ›@UÕÄèR.{‡’óSŸßŒ‹’ÁªwMÄcp”²'™–’Œ-(´YôbIè¡éñt¼cjU±æG;ë?´G § õ @D‚æ8ÃÐù­¦„˜€×C‡ÇãÁ5È­Ø”&.ˆ5€#˜?XÙ6H¦P¹7›i¯`±] $áõœè4 wz6ÛLê8†cKPû5#“šçµ=þ,V Õ©é"û[É'($^Í–Ôˆ&µ–rU”´"m0)õp… %¤vòʉ¯Ö•VLLÏcç».µKYz¸{1œ¶lZ%,¡Ék²Êy$o!:àþL›¬ÃÙ³m)  @\Þö&‡DÓTŽhÖà=&ùf6ý»¨? V+2MZ¥4PØ,ߣ)Ä ¸vðÀFÕq]na pÌ}GTƒÛwj7!¬âHTڑʆeê!]ÛÝI¿æì´^¶b¢_ë 7´Àõ‰J¶¡G0š‡zbpŽL ¯¯¿œ©Ÿ _öÕµK•FJ]¥EÛo]2]½KÝ£ñÐ4Âbx’á:Ñp46NékjºazwEê[]Û d²å.žs}ìÜÆ²qÜ ±Lü`JYEª(¤µ@vh 0ZÑjªk(ÉŠ«qÓç  ñóDç“z€4à¶V5R"Áé‚rÕqP°Éð‡ØK#cç‡Ü КӰµFlE%Ì7Ïì&¤ðYåTÌ´ Ø7bKCç¹|FÞZÄ*I ¼_¿òZ&(d¹-̵ G‹ØÌ!Êþ ¾¡#í!•s62÷>#œ¥îÀÞQÑ ,´Õe’)]ÐdV^úH0yZŒÂ»-8Ù·küAÄ4¼IÖåÀµx¶ø ‡Ê‘ËgÆo—½ÜhŒÝ.3šÝüÔiÝüå½ßF ÎPšðôE_ËàÀå1P†ÌíO®Ûr|ZÝ4 Xp ØR¨"gA‹}þ@(ãýìåI{þÒ$DÁü¸ïëÙUX›ñÆÉG)—4#þ ”d, Ê•ýjJëŇ&ü: €ù[‘°‘e í>o|ç¯Ú`¦Ôëǰ¤:[Ýç¾af¾/Ús#_Å ÌDy¶µÚÛ8_Íl¹RÂg+wyÍMª#§oëÛ5*ÿ4p4šª, “—q kÉÍç~däÉžÔÙn õ2~&„ ø5ðiÍ1CE[cbqX'-Ê7dMPæ•›‚'j€1õÒ/„ÅÃ8Ó:ÄôÃ/=ßåzÁyÅ[q4YzÁ˜`Ùü&.€QS‚5ÐöøU9†A~¦£ó¬ýt?LV a‹²ºõk5):uñ€žå¸mžØìFµÜ¡7(ËSC[)v"å¡;Ùœ…Ó’F¹µåñÜaù©¢óáC_5Ëæ´qÕ4qíøOkÆ¿óõ!K*ð•"%x¸‚ÂCEËæéÎÝøïÑÓeéÚ®ÑFq ±”¢”è^‡Ñön*¡šy*ª€G¼„‰Û:(é =Ññy‡.99X)í ^U7òâC¼j—Õ[åê½~†Y:E´üè…*3¯¿×ßk)ðÇÝRYÉ4¾ÖëiSý{¹ÿó­Wî,ýÿ%E¦Í£©‰¯ ì.yH¿{…*[‘åû”x^ñÃ>YúE4”Ô–Bý[áJ|›£ù;¡ï~®uwâ=9³ÐnlËïú©)KšÅíë«÷ ãürJtþ«e*ª:Ž¥=ˆíç:ü ÝÑc4ƒìÜ>+“oÛ§¦ü0¾Ø¸„ÎŽ´ƒ¬Úúe[^ò¿ÇP ÉÛMn¡«YD1õã Æ³Ö]óœP+hCµƒÕšl 9_š:YÌÀC/1?Ñ„C9À•#RŠ˜tW×B&Э½U ó~‘šþÛ¢öïQ¼jH=ÝHUBá뭌К"C)Od5ª(,‹KúóÔ*ã`°»ºN %íf&‹Pi ”Ϊpíô´%¥•›ê—^ªañ+£;ý}—Óñ,z‘ HuÁˆ¤QS¯8 Ìì…Šø  ¡6p0©­S1è[¿Í©NI Zþ•Úúˆ7õœbBd ¦`lXÙâà³òUÏð}²tög( 5#ú‘'à =,u³1•,VlböIJÂí'pº|–šUo¥Ž „DGÎ0à(¦2RQµQC„2Ko’œn¬‘Bƒ°„ΟPKº!Ôñb9„ÛΪ†i˜GEv*E‰õ0Þ™ôj&|ɺ¼i‚TÓñ”ô)FÊ]Çú虇a•:MÊÕ:”â,'Oq½8r0N÷¼3¦‘öÀ€î®Õâ"îx°?<³µâ-=ÃHï@laÞd%¤+ >4ÁfúŸ~2fèuØC2„™„’šz„Ð;OÊ>P^¤Ìam[h·ùÈneè3­¯¢‹„°øT®n¥†ÑšŒ9Œ‡X¨,Q”ÚI)RdI·ÎfõÓüçvdèÌ|z2TMK æ žu“1E–JÃÈU,晉¸dèÂÑÚhèûÆ%¸½¬#JÝuØŽÊ,ž0êíÅíê×Õ‡’HˆZ8Õ¸,„!™;NéUa¾½Ø‹<O‚ï|?Œ’xˆƒ}âOF Ú`JE,-Ÿë&(yÓ³,bRÆ6ô]›E)®QrkÌ1¯iÍèœ?¥°`ûŠÈm]œOXã>06c4JLøK…’pÖ¢v¬«¶L¡z’ }5»’ð{ŸCÆ\ qp‚”x†ƒ|Ûå=¢ñvíRÝ%Rû >°G_„‡#e!Y€ŽÈÕêm¡ª®ã$÷ÄQ °V@‰ôPŸµž¡öªÆ¤%Í ‰tÔÍÁs €?ö9CYUÅ›ô1Ò§»c!Dêà1ƒ´–‹g^©¤K:ÀÜÜz+¸w€J(žhÔê}P’vÐb¤ƒÏGÖø;é"_,RÍñÇ‹Î_dôÒc^¦~·ïQEaÍbDüÿÐ“ÉØy™B»Ì„Á"0Š=-ÄgÝóD×\¶ˆu—Ò°Û;*¥”5.À_¬Š¤žãI,1N°›wÞ¢¦˜Ræ?ë €´bÙÀ ;Ìj},wzÿgä|&7_ïV†KŽÈ1ªsñ´Nê]´ƒÏÕèbçµ’‘OCèGuºá“-óós¢ý6YUÊÆ»q‘X À§y„yañᣡ©·rªj4ß÷Œ &’×lrx®XŒ]>)GQ<–-–Ó/Ç`òÃîWŽÑ!+Ù+,ätÓði•-Ãp7³ú\uXþ˜ Ý¢ýµdÑÊpÚ9ž4‹©§Ø‡@ ’*^Ùëà“PT4ÒeüÙà¸a¦„f£@,HÃÁ¾mxú”pöv4A9Ò ¬ªïÀV^Öªh+ûe0|ÉÅ íI4®Q× ‚ °¿åÂK'¦$Ö+ÄCïeÜpnÒ¨ðY,úXM·C¨(ÏOp­"TË ŠË ™ûùd{2:iqƒÅ8ç”8'‹Ö_¸èâôi¶foè˜EªZ èPô„NÞ€¼.f²rC+¡Î˜„åT5ð–Ç£WîÎk/¨ö­ agá†}@$ô„%¥\%ÚãÄëQ¬Jºìî™ÅÊj}:2@?0A~øP ÄÝš)Qêµ¹„7Âm¸ÓšY¶IF-p‹´%†…£\¥§gSG ³†1Ü3'»ø•JÌ@R&ÿÀáÀ­ÞЏ$Û Õ™ˆp^^˜|~k!Lï¸p@æ.Îñ Z@þdÑ A¦ØW.d¬¦ŒÕ”À,_õ!]®ÙŸá{k-!ÞNq ŠŠV"J–à,´¢Øêbà ~›èüâ¡H5¬¢_ä$è3¡\ä/~ר÷ÿ×ð¡J ®.ìôÙ{e? Ü‰£×uÕ?´Ý@QSqÙ*žAÎÌ“ls=§ŸÃñ¡šIþ£¿—r»ëÀ ŠÝZä§÷êÉÃ<BH(†ÜwÏW&8ö›5. XpÍÇ\ @¼ÝúþIý½þ^¯¿×ßë×8í¿×ßëïõ÷ ^÷úÏUÆævüÏm¿ýóV–¤6Þ»1Ž›~~3|™!ÇaW¨W±EÙUG÷5¸£'«œå…‡1ÑWb)Õ:ɤy‹»P¾S6{~=œsú£ßÉö¦þaϨG-{ûe4tÃ! \…Ô´ÊŠ”9n25H=XC¾ ¨-Ð)ͯÇ”« ©gd\:fgŸ= G~$@.*3®¸· J¦n„XUêD¶žKÕ%&”U‘¦¥Bsœ$³õroø(™Æ㊶vƒ"Él“¿Œð¨çk‰Ú0˜ß;ÎU±Âû&ɵÖlqò1£ÕC˜æ˜Ñ ½Pì¥Çq§DÍ# Y°TE” …UÚÒJPëø[J˜( 593kêÄAM;èl¢ ×a÷xÅ„”Ñì÷Ð Ùk$¨R…¶øù)j.(/u³oˆ¥ðqéÁÔ EPBg¿p&x\'dPú=ÈhLqàÆa³`sÓ 6> ãYÙÎê¶j•ˑᨌQútr(#R\‚‘ØÝ ?¥ãURÅd¦ æ:s2…È:2¬aIfpï(M³ ˆ…$ιéLÇ êî8Œ–jL—>ÀȰÁ#FTÛ“*®8jÙ =g Ä$˜*µ/iþçû|íGŽS™ghu¢ ¶†€^{Zm§5Œx•=|8F!Épåd#TIQ?Ó }ÏbÛ±7&eT~±ÈÀíIß ùá º-ú€†éã“Iv0FŒpà°°•døIv\¡·Ï,N~(ç’s¨baúe³ q¨a!‘+½s¯ Q¸ž÷B1 P­øb:ËÄisG5G  ±Ù=•jîÛøÝ*ÞÅ®è×…Œ0CÌLÓ–2Ñ AÕúõäŒPk÷û=x4-}ßÑ[W•vÚŽ¯5m³À:nËP+?¶ÀE«>yã 'ÜÜ ÅY®ÿÝ]ÑMŸeUÕ¹x´jIXãHë´1>:Ü ‡òˆ«]Âʵy"ú •LÖü0 ¯wE¼UÊ»•t(‘ò*@‹W⵬æÉ–˜2]s’¥Cý,RÛ}A²©£C%‰½°ÔJÇZrjËÓr³]¹)hVìƒ $î^’4`¯uüKTü()Éh3œ6‘ áB¸NÐmoðªÓ¶›<‚5!Ž5„åàz4»U3Ç!o¯‰¨“JØLww¶9>n‡*x2Ç £¿rˆJù ¢óõâ½I¨¥ùx&œJ’l§žRRàd¯ÅãŠA÷»/õ]{oIÁ‡Úxˆàœ¾âw=²Ü«C-Ý:8)'JÀTs‡žÙX{XpÎ Y•`—3Çiþ%ÂÓ±ø±Ã¸^Ýô„×ì«‹?°ü½ž}dŒaÍ¿Uú{ý=‘ï°zH÷÷ÚZ¾õpïup¯¿×ß+=ŠŸiôr\㊫ʸßÜȾ€×ÕÿeŸ˜u,>ØÆ£â 覆Yç÷øµ|®:ø)7¢xÉ&ÓÝ¿ãMþÊ×+ ‡e"cjŠ^ùH‡'—„ü¯“yׯ'ŸÓò¶Ù€÷ž¨Iíêzç°0åXi£#¾ª>£:¢Ðú o¸Ýo÷ýí‘Ôˆ©UCÏì–ÝvJÊ…ºyÊD5Ö|¬œíj5A/º­¡ivoP8‹˜±¤W¢öÕÙA(xLìm—|ësÅë÷H]ýÛñAw×!j™WíF–¸vX+Àx”žR A¯i×U޶¶+C¼v­ý0­—d`ðÇâh3Í›nUï¥øzÏŽ ì¤Jêû*…ºPâñ‹0ÌùÖšUŽö@'O4™Kß såqiXM)Ž[Y]˜6fúøÒ»¦ ëŠOíkŸs0¯J X9³ì›+ádóÞí"Æídˆ›éÅl| ?·ôžüXµãrÜ·”2­ j‹Xi@õ ¶7š«a4~0Ü œÙ(:ójBrK¶ ¨”±"ÏÔâ¸@Z£h¥4á…ÄTÃiÉgw×O i“[¸Y)ÌWA¬«[ÈŸ ¿í@\ô±–u Të«× »%‹è;}îâLÀb»_¿› à` ­™t­ +3Z'öÁad^òäØðžMf>ú–.ãkâZªý ¸èzži©'"˜+QÙªÑ.X:Ã]Ζ·2jÆ3É«©è›'¤Ž ó'Ÿœ^Š)<¨!>7Z‰³“¾Ž<,³>h¨È­˜ÎþÛ­k q.•}æì¸ËM¢Ä؈0BçPx(’Ñh×ßÿ{i›Á$¦vù`ȃÔþ€d¥+ìûó\Ää¥Z–þ~—Çþ®òdßïƒÒIA°DdJé­2"î; ¯@轎éL¼èC…™<Eä§¼#º*‹±‰ìl‰Æ)¥,Ñ hÆ7»/NıƭÓáñ×·ãc¤äë|ˆÅÜ3,RjúH`‡±Þ‹‘ü÷Rÿ «î‰–ò<¤]*;™ž}¤•6j6¶’´SÚWô‘W‰™ZjP{"‹_ Xä¢Ý¯(õê–¤‰ãÏ9Ef-Žƒ ù®v˜ƒi˜¡,#U]$0ÓøL‚»PB(Ùã lÆ@¿‹æ¨ˆkŒ]_€Ø´I²‹’J]ÑfQjÃTóAÄÃ¥W€“ÛNi¤ùzBm‹ %3°©âÙIÈê¤Ñ6ÜâåCæ»Û à³»oâݰÓB ÷Ù39{»ˆNM8`@ו$å}w£5Ò/dÝ&÷†jL(æ8xÝÅG6í8G;óüQ:{ 5ˆ¤ó*VM‡áQèŽîP €Î½k(„OA`53ÅŠ¸±ú=Á{Ù$WwGUjá˜7œ+PÈŠÁ•xžS©_Î3f>Ÿy°‚F×ÑÕ!,c÷n}ÅÀÖ󷽉6w•„gïÏ,Í¥ ¡‡h@¸áWz[ æë\!‚næõd»ûl Upf^V$,8„õÑôÛV½•èâOl°«–T',~4ܳ§c;,ÿsMçü²iË'‰ÎOÿj¼ÊЯ“üœ§Xôt6n vìú}}¨œK‡´·8Žï“UÕk0A˃0ÇÕqGžƒr:Gï¬[Ao؇œÜZßXWèw­Á¸¡°ˆwF=„Ç0”¸ß^º3‹é>ëvgš1N'Zs\ËR@oDÝ1ô¢ÉGç»mZµ&G‰`WÔÇÕ@V)S%¤ÎÜYÚÄÝëË¢eôÆé9“Šá¯¸î05óéø¸Ë ûèò)ºügo¿¯k3©î|ۙΦ–Bõ–pž$‡B´_‡çŽ+í¨×ÄEØYä'¾“MÿÚ€ÿóC(3Ê+žIé²c»à-m ê pÙä²ö4'Z—ÖKÙ—Š^É-Ëž6´5[Ù^¦yqwç=±&_ˆÕtôLRp:yS/6¤?•ƒ¿¨Ä2@Æü( š ŒÅ7hÈ´ƒÅTá ˜>KLö0V=Ò<¿-ƒ/°Ð‰Pi¥;G­×ƒš šè!iLî®Æ4²:H1þI—™Bž ®ðA£·|ãœ_ ®§»*2ƒr‚Ö?ip(#<Y0’åI#˜‡ Š@ËìsÍP@Ž6P$?#£¾}*í‘ £¸dA½L)%C]$‘è¿Ò6`O‘Ö‰Ø_UãÁeb=ZAK>¢v¿ÞíÊ CßJJÏ)pðP5ŸâÎ:ͧ– Ú·°Há$=h ]<ê¾”­Ë4_ƒz…´™Ï#Ø¡+ž„£Þ‹%‡ö‰,fÄA0Â×)«ˆÞö3y—n‹ætèÃnˆz¦i@:AøÍ*rw ©'®{³m—ñ. 2Íq'à ”‹ß}eè×2>õo¹¬¯*“¢wË.¨ÍLmoƒL´ÜCé*õ­‡¦úþ)Óà´}Yz þõ°ÝÞiOu‚†ø ¢Êî ¡2GÒ¦ƒ` kÙÕ„.Ì)0‚@°rG2¨‚ µ¡ÞÂ.#¶‚ õ G´ÈJ\ñÖ­G?Í¢h164Æp{Dp¨˜½@äE}—r|Í1.B¿¿ ´ô'C¯h3ÅGôñ,±NÁP×Éôœ&µ5)&š0E‹xŸNð¶Þ`@¥úQ+¶íêjÓÞ¨›O |!ïGŽY¢ÊÝj7úi²éÎ>ÏÔtó<š[Fõh`®tX“’·®ð‘šETé–N€§öDæ=V°­0ôCE/ ÃþÓ®VAÂÈŸaÒT D´€ÛF ½tô@ìamè§%€‚]tâqCçkBÄ@§waí||{è±ÐQÕ쮑ôåÉutê k>dkÕq!‰ “=í|Åç–î•2&=Ô– Œîƒ}.JbG,À] 0¥úªzBkfU††ûÏJé-Š"3”¯O7F×%x’­ŽxMí=ˆŽœmT ž8;™Pæ”íÛ˜¦6½’j§ì \¤bP¦`ÇkoÍH:t+_·…=›e?Ú ’t ¶-×ò e%Ú» Dý¢¹B"l8K„ü€jÜ G´³Õ†¨5› PS1ºÝl0drÛß nÚ‰j%Õ…Þ0kŵ4"Âï³G›4gm°Œ'F` # Ài„VÛ]¶þÍ›ˆ0Î1a”~{©žv\«KPœÜŸ,:yç°ZlÐð0ƒ¸Ýàåƒs8«Ö> Ô 6pÒRÛU’¹e2¾k=EÚ,c©€vD]õÓÚ×Ö¯þe@%©Úl†Î<ëbh¸œ“®¬•6é”ÜCÚê9$æ—˜8»:ä —Ý0’¹¦lí'LŽëMÏ7Émifp1üµ§q°dÃöOÙ~Í…ÕÄB£î»Ð¹oÇxjßð¥7‰B7—O<&k’752Àeƒ. ¼Hl‰°ip'.{Æ#!^pÛ••ÉŒ0FtR±Ã “¿Gè'#dDv—°rÑ›ûÄ*׿Š~5Àw0Ãy÷8súÑéÈ0AxÙv6]6ïpôR×ÿÝç!¤ùg 9þ`Ïag€%‚~3gœ×n’ºqIñözí)ÕGû1Ëíïº]sÕñÿ"z8?;ïÓÕ'œÞ2uÖ3Ïjîžr‡§D<ØQ=ƒkÖcàðÌö¸tá¢èEì^³V˜ã+¶&Çw©‘Ù߯?Ot¾lN@Ñîæ¶=ÿl™píNâ>ñªmöÌéø0ÛƒœDG¥ŽâÃô‚!`ˆA.4(R/@`|˜UèµÃÉI½Ýéxƒ5dŒãl'ÏØŸôC,5(äÕ—' ÎÚ n®ñB“öq—žÉì#¸Ÿ2ô¯JlOG¹_XFðgáN²§ørbô‰ä˜Œƒçw"PÜÉÏž1UÞÙ^/gÅÈ‚ª‹:nîºk\VÄ~Áó‰¢|§“Pa# C-z‰¤·k'eûú¾VªE·@*…&?ç…/óèžtQnïçôR^²¢~êǵ÷»ƒãhz-Lb¿Î=Ò&é}Û;b—ÀèáÑ›Mfjר–jañõà`Çó;Îocýæb…QM$»N452ÏÏ"¢¶­á¤ rÔ25&×rÃ6}wWøÔÈÑÿûý0Ñùq`LbîkO·ò8nYîzÌ8b«ÏCzð©q$;Å–Ï–Bò–I—@…µÿ-Іn®«ß¹á¤»6`0\ýÒé.zÙåjõ{  M1¸cà¦RgeOÕ€˜> ‹ùÛåŒe6‚®¶@—£rtLÞ p–:Ç\i  øø¿BÑ‚O(¯Ñ~ïA¡ë„ÍþóªÖ«Y•¶8*åV6Ò †Lt5Â!Çèµ@BløŠÖ‡Ûv…ãÏ‹VK&º8È’Ú‡PÎ!$ÎûPV½&•á.¹èþùn) ò„IÐsµ­3[”Ó ¤2²Ôê¬ 8íš”z’nJC‘0‚±´b ]“cC²º‰jVÄ~2 €C)©†~áIñ!f•Ëì‹{ðÈ—ù–ûþhÜèLÇþ]"ˆtj¯!þÊWdÐU.gð%Ési¡µ¦º} y›ÔãU*S?k¢†;P§Žä£¡Iè?@ˆ5)A0{¢‚”l‰GXÂ0~'Z! â!mÀn/”Á<)4Ê#,ÍÉu åb†â݈WK‰Nt‚â3L¦gö ‰`Sä”s2»Á½ú!òÿ-TDI¯#ÉË…‹'XÞ—\1Ÿ½ûUµ—'RÁ×è‚o?Ÿ·gyÝ6ÖQsƒÅ»Â|Xá[JZmâ‘WMñ•Eï'kÒc•n6©WÇΊMÿÅ.(ô“^:3‰jì#tåÚ±4M¤ì¨> vÃ~|ÌæñR̃^  ªS,!ñžã†G{¸0@IjþŒ¶Ýa›´!z`¥S4(¥ÇQ„/c!aU‰¸+ÌFÓ@`1Qu†ÍÝš¡$v¾JÅ)¥¶ª°Ãh«±,U)”¥n\‰˜bÖfü|å#DÚr$#ÔÂ)–·€Cá³g+@+°€hÔ±Á†–!šLÉѯÈ8©Œj‰Ö~a³ZEÜÔÃHö—‰Î¯ûñý¯Ç]hi:[1€6ŒØ´v|ÆCÈi­«æ¹aˆ;5¶¸0Œ"uTSDŽ0z=-tNYiû]ÜüxNM¶.v·$/ïÀ³¥NÖŠÕܧsg€l³7€ååÉg/§­ÍL3\Ô¨.‚2 É;Uäw ng·móü¾t’×½V¸—½ C€“çt±ÏìpþéÚÑLc‘Q·™åÃÁ<¾zyñôC»øi‰žP~úzD(Ìà.aÈÑæØ:@z”Ê Ï~n¨ËNË9ž¸Ä±2Òž€¨êL,a]"£2È-gß“½¼SÁô €ò@¸/9€»`ß8X &ך†8ÜÚ¯6½T™®vŽ É·$_]&‘S¿e Î{¼Xö3òMÓ+}_3¢óz@ƒÀbŠ9úï3öç+Éõì:ƒ cÒű´JbIjç0ð… jŸH_:o@[l€/œEñü¾~Ã?Y‚=鄨XtŸxŽÐùŽT Šãeð8¾BÚ«Öð‹:âÏ¿ :÷ÚÐ÷›ŠÎ¯˜&[à]-¦ú­çGðn]SÄ:$îõKœ¦ÉòS€êéí*:@“hWëð!©þýú]%”J»ÕS cªŽcÂ{°ÁÞ£é8W߬РÒR³C¨ÖTÚrLWö%¥ªõDþ’J„âz3<Z~…A³uhVÒ7ŠT@AŸx-Þf»àÜ<ĦdO½âzlpmáƒWD¡r#$\,J€ÆÃc)¼K 3ƒ>ÆfPô°AQ01ÐCŸ@oA¾~²$y¾¨¹„ §Aª¾ëRãíl¤3Ä6y$]L‘Ëî@Œ¢M\ÉÉØdØI¡´Î˜ vipjf»òµÖ¸¨ýPÑè¤A&â•?Xfê»ò÷Z–¾Äá²:›‡Qšßv”ÖëÝÆ8"7Á¨–si¿X”ðÔšãö;…Îêë˜Ê&Ûs|¾©ÙQõidÑ#všôš8 É€4É›A'Ë éä°˜ydU &í\>ãvåA÷Òƒku÷8XB8*k*—Ä4 Ìú/8˜„¢ ú æÅz|zx­sQÏ ­¥F Øk\XU}5Œ}X8þü ÜÃi z²BSª Yuï áÅÁq%B¿á[°g¯I—¦‘!»YL èâ]ЬÜÅLp¡!ŒI4œ’ æ8HMŸ#éäVòÆ”XÒ]©˜j,˜†¬@e†`6™")ë`ƒZfØã~2BÌ4MñØMî ýTô‡* …Ñb ©\á¿K½çZ¨+‘©N¨aÏHÏg9îժ㓉JÊY^ƒ5ŒÕ~Õ³È ‘r~â¾F(rÔœ¸Ë‡DDzFm¾¥„Äft­Ž,—YF—À›áñP—˜waåkD‹ÆjOÉ¢þ¦ìXæüzþFˆ‚r‡ÔtoÚºsÊBK«dp. ƒ•*D¤ù3€ÃÞѳ5Ê)&M³Ç ÷0‡ù´œ VN‡‚…޹9Åäɾƹ4†Ä†ÍÔÎèÅR³3® £H? î9X½•Ü{¼ë¼ê$J D6¿õŒïIÓ®9ŽÁ>|wÂ2]g?Û?Lψ|é•·Ö2pÓ$î÷#5¶wü“ŽX3œ ©ù)[$EÕÇpÒ¸d69àžK&3:2Èãae¨7iª2w¸K?iC…í.øÂÖ%ù+à”‡œõ ‡î'ŸjâÐè@öõÿtxFòÉ>Qêâ£æNc‰méüçÙ|Š—b¯Vøª¬Ò6ÅgÉÖ–Â8¬wúQÛ7An& O‡omŒÍ6€¡²¾Üÿ™E Ÿj“š!;Ѳ¦‡k¡a§9MâP‹"^ç®{‰q{ß,ÕU§p?=eúÛ‰Î=×q9^’m·ÿWÔ|²‚óZ»ñ]‰k¶×ªW6k]I¦áxö4¦PÎóK2ݸÉßF}ˆ¥ÉDnD³Š'J'¡ÝädS…Þ„Ù„ØÝmf’'Ç0À ð±q ïÔÇ/~pžÛ©é'žÙûŸ“í>ÅJçs>Òœøïõ÷Z «ð§ ñ÷zó«¶¾‰\ë.àÑÕpäQ·›ƒ~‰tùzê5#²ð:×Hg³¾·é’ƒéþvÇß닜ђA`ºŒ­êö·S~Àëv»ñ„ˆø¥æ_γÿ{ý½þ^«‰ëuFr>xÞänQ²è˜v:6h¥™5ËÚG„t¶JR‡^¼f”FW,ªÏö ¡$û梇«Â´a­¥ŠÄ@v•˾&}Ý=šä3= 0z<‘ÒŠ++zÅŽzû ð/¢kLÿ²”Q­)¸¬Òô¸6 ƒ­âÄʤ"@¯±ÀÊW šÑHµrµË_îÏF B”w‰ŸPnžf¶ÒGþÜä÷”ªRTœÒ£­‹¢ù_öíõgqò!7[1ûB>:#×Ñk´—̰[ÑŸùŒŒ°¦”s†}j¶ONШW^WEèj1F.)èZÊ”©J§·èb6»éLâI‚¬([Ç-ÿbçyz"£«´”äÕ‰ƒuGÚS·„DŒA ìHHÇ&HÑ4zk¯¤X˜6oª>Oar žxü_îPÛöñãéJÔs£qóH¬eðƒœ"Aºæù‘œö‚ng¿~Ùx!…A ,÷^ ²1̶ְžNª»¤‹ÿj륔/ìðÚCAÒMftA%T4ûçö˜ö!Hfk ò4ŠUùÝ>2áZùçbŒç .ƒ,%‚½šIw €!Ó,‹ŽW$:ƒ¹Oz«6Åš8¿9ªÜ3`}åÂ$ä(ÿYjßV_U;òvË%~ Cô…ýSŸíJ¬œÊè'±$ÈÀAQ f-Ðý}FTâÖ«§™OE¦õª r‘µ&1ºØå§$É{«ö &A`^k|¥ÉîAt»³÷V&mœ2bå{;T³‹Gèja(–4§ %wñ(ÄÉÖ%”bÉ›«~LÃÖpoqž³"l<ïMG»ê¶Î[)srîélJd<3J¡Š4ö„£»£Gö½’Oˆ0^¨ N—Œj…–?“iUã©ØÌ¡6 Dõ̱¦Þâ¼Å&úÏÁè#ßA^7‘Ðäwå0räÄ‚9’Ã4oÃ’·o‰¸g@M”aÑsû¨—hâ̺Ĵv ˜‚GçÅ¥bÁ‰)µ¥ÞX¬†{椾çVº~+ô]Ëô4ä,Ö7©–×Ù1 Üx߬U!opopjç$ (t³ƒ‘•ÁM‚è3õÄ7eÀ1¾Ñ 2Mox+Ú¸l lÀ?eš“Â[¦N±öă˜xïÚHSÄM&ý˜¹]ÉpØ÷?Uê*…Ñ–âËi X‰ÌÂý>WfKôBdäêóÎ8&áJº»pVe±ïé3ÜXf¹µúã]úlŽw´ïhsL€Îóe\ÿ˼¢IJŒÊ¨¶œ /Y<å;J¶|²ãîN3·2´½WFŸ3æ§úêÈø,´#é á©ÉÀ]Œ/¿ YÎ=o¿ ng‰4Ã|﫼‡ð[ZõLD@/ÏC&“kêD>aeÇì,HtÈ; …Oc”ljy‚$”\„P³/Óa¹êXwW HpNéã„Úžž,¹Ãu¾bý Eç“-Ã…¨©»@ ܾ†d9}¹:¾/¥ð¾¼’xà)7Ãt¢[Š+ü¨×Ù÷<ûì:Ã!6Œpl)•ÑÄðÀù¢Êæ¬q†Œçl§÷Þ Î†˜Zù%(îOjáŠÀåÈê¿|õÚ> Ò¿×ßëïõ÷:çæçøÔ£Õß {[Ãÿ^¯Ò8#·Û]Þ Pxÿ½KÂï.åôköî_´ù÷úq~ÿoC¿Û‚lP:ÿ^¯yøð÷zn¹[0µvU12ei’Óxbð·ÏºdæÛåÃn**¥ )Mk²V¦ÄŒ§cÚvNM§ÑC^Ýɰ U—ã2ܼ\ÕÒ¿­­uÕ£w¬ãÞ] ¿Ûgˆn;ZDèÁßB-@´H„1ªn¯§ÿP3\á\S í~õ™J:u°×ƒ>©ø´$ ïµYDÔd‰&ý#få©-ÜžFXçªÂl¢*÷1ž¢«'êa|Ja39±NàþQ3=&—Hj§/‹¢õw«±ÏˆGR(®8’F"J 0‡,”k ÇÐ¸é·±Ž˜‹ fp–‡­úržžÕØô¨Ê;…3VÅšþ(·%´ó™igÎü†V–ÃÊíÇ ãÝò½ ”8QÙ"rtGR·$Zá˯_\Œ½.Ó)io-ÖhÄÀXÛ œ‹7Tdà,¸ê1s9&j¼)°µÆ ¿Ø¼àøÒÑN:ÿ,«òâéM<ª C(2‰^IaInù 8F;‡¨RnÎjü‹¾Î›SóW®F„i·¬§OuFFLr^µ´º·”‘“™ÙCÍ–…9 ±nåfïÞ×LÚPJÖ.ë…³<|¦Y£YØZ6Ó€ÖH.¯7óB½‚vÛÇÏ©ä(Ÿ‡·Ç.³XœxéLñÒ5ÈŽfÏhÎ>ÕÊ–2R’Ú\?JwqG €–^ɱª›2c‰u+–h¼„«‘íá¨x•Y苾‡ä^,£Ba÷gDH½0ÿ#ÔSW²G° …Œ›7°¡½ÕniÚm,¥’6{´ÅAv>•ãÂÂ虂¹ºÜt«,Ø¡îËA”\¥`ÕÑû³f yèÆá¶Öh±Ë8ÖÔz>äÕÏ6þÎõn˜F5#g§¤þ†mãö9|=3Ú‰ý„QŤ@Ù»^ ƒP6{ÇÏÌ7£4IbëYRÖGé=µ Òxá²Ãe‰UÎ]þ’•,B¥7¤#»ÖLsq.ßBt^JJ/n C_IšTq]§CA…Ö'Š‚ƒ'¢COc°¡ˆ ®š<u¦]yשº]Ãyd´35/Ã]:±s •uÐ{ëÈ.äÇ$pðªŸÑ[±˜E&¹ó„YÉ3®ˆ9˜æ‹·›²$éL?xJuÞFw4`%çlFÛT6J2ò@Ã$ÔW¤öU€œB–ÚK65e:8[ÈåÝy?>°9?©Tô(¨°”[Ç…P¬Wgï茥d]ŽÈÐÜT0‚]ÚGrêó$ð9סýÀ|ËFVt8¶F—Êj#:dŽ£Öxbtáþ¬û]—$< Íⵌœ4•ö=$  ‡† È—2 Ú$³³ W%iæ0ˆ¹JZ‰èr‰,©÷B"í¢=l°[¥Cq™£™›åzn‘mÎ’¢PÄ6اNŽ´H•äÜ£ùÖ¡”߱Ǘ~FDƒ ä€^S}¬îÉžDŒOHH—¸•PxFàDK½›»£… D"ü=ýýR{Ó8œƒPHjxX³ôl&•^ª(cÖX(PeÌž¤†ŸîgÔpU ÕK?÷W\íþ¸ÝÄ0š¨w€õ7¹2õ‚¬¸bKc9«HB®HÜ©4U µWz@[)ƒMD«_}r¤òOi@e8‰ Ÿý..ý–pð€ÿ>@"Mm6ñŸ¾š)ƒÖy+&¡t}\•ŒŸ•¤ždv¶˜Zˆd `S[×ê,"LËó_)J‹•‹]ª1¬,oÐ^£ìÉÐ÷ÀU†À®_¿vr\dX†¾ø6õ$Œ"l“¯4ð¨ÉS^Õm ˆ°™Ýª¤¹ªù‹-Ò·¡¸Ño£¸ÅÀ4~M«¨Á¶¦¥ÒÙÃ!¨© ¢`€`"Ô¶”™¯oÁq4ŒM c©6ãeCàAšh‘9= *ý˜c¨”?øÉ´þ¡T€–×wTmÔÀb.em!±™]ˆUºZ¦Âr–”^sÕå ÿfH¬„²°( v+IWOÁ Ì~픨âàAº^ÄFÈÆ/) f˜>´ù2Dø2„.Õ‘2Rl ujI'9=­sùµWe˜lƒ×PØG»¸|ªow˜ÖŽ©ÿ¢óâˆzLŽ‘CÌ›yº ð¢×… €K^f(Úàu±¾ Ãé E½U㚈ƒüã.‚@³>f & o´Z†¨®œŒõðœeA_ yîýßyç½àþ$öO¾á û‹üìŸüÍ›ÆÅãéûäê»àÊV?êõÇéû{=gg~×:pëÝ(Sn×76P’Í£>VÝòal O) ›7uOuýˆ„ï¢"Р‹°‰X÷8þViþMùIÞ×Û5/ˆKÕüäO¹a¼ü3Yž5ìzg¼ÍHznÜ….þu^µ7¨¾Ø=­ Áxùý~¯½0û7ÜÌŸhå^že˶o!Ò…·_8BlÏœc2rvúÜaü…WþjÑùMºlàåËu®!û‚Å·!D •§×2‡õl_ËÀ®á2н öwêø™ü¾.ª«DÙaÇú"•¶{(P |Pý0´O€uo =Õ†° ÁòD=­÷¦‰‡»uΞ)j>^˜&D"£FÐ’9è jÚ B£æŒ­pÕ3KÚ9SXLA£- Šú”™ð·( e+¸˜ôZWp™M0³Ý.Çî%‘méS™ß<$‰Š$bPè. ].„ ‹*gÎÑõp(ç¨DÇ'è½ ¤á¡1”‚JOgÔc`<ÕÀ…æÕg°/E$Y ü‹¦a9°~ Öá*¤¼Ñ>Ÿ$MU¼ÎC)F’‚^rùâ°žÖCÒKt­0 †žÒq<ƒåAàÇT1…8’,Ù ‚öŒèåt`®KÏü`×¶2s ºeì!K •ßµV¬¢r®âÒÛX"¢[h*'ëso8įÙ8ø¢…¸Ç¿õO5Àîlú˜ Ó˜MЦªwô#›‡!´}0áꛃ™#dqÔfŸ­‰|¸t¢wR ‘–@›h¶uá0ޤFªß,¶n`Á53 íØöB o:dQŠ“ŒuV¬“_|ÁDŸ`@V# ÿ|èÔ‚ºMíYíå+~4¢£«(#|ð4€,GCkÐ0ŽôWEh5I×erxd×ãµ×`AÏŸµâ×ä1¶¢5Š€—w³F%ø˜:õÁyˆ³i•ŽMèyû‚l?Ї‡@P³‡Jv± ›xÔBäZCLQ¦²X…·&ÄÒ”Cæpgß_¾ûo®”EÊ“-!T¡íIøÌǨŸùmiì¤WÊ&C¬Rñë!‘|ìmDAsyºØ)'ï®Þ'Ö?ÌŽT@¡n ÓnwÉ›˜2 #7"Ö 'Ù5¨áÐt©!TH*¥”ûÝìf¹¥úG)¢ˆ2)C p²³%ÀÜ n·ºÒO¡ˆN$“BLE§HÁ·Aœ1¥ëËErEˆa\)ïÐ4µ¦Zƒ}ⵌÒjI9Xä­ÊôÙôZ:Ýú±É[ŠýFí{Ä«"šÕÖø‘-¡–òzè —8Á9£b÷+Dçåmo «©‰C“£F³=<™L \ÂØò–‹—|5V‡?ýºÝn'2™ nTo£Íï>œ<Š“Ó>Æph›þ嬭vÓg¸¼N•c4]PŸÉç¹'˜Õ‡óòèá¡üø™Î\[¥—êU’?ï!¥óä2qö¾&‰C<…ohy¹šðÞ'_â§l™/`Éw]ôf÷x÷§®öµöÄàPOlä‘Ñü Âê–Žš øÀ§×rA‹ð¦€IÍ=ütííl7ÀJäòʰ\ŒœN¯6íRÌ8•e\ÍZÉ1B·õP>/øÝa|šG{OÄ*a)~ÊÃ(äçF¹^Ìz•°2ÆcbB7¯»÷‡-L‰eÐÓé¯><×~n,‚±âŽžš{û‚ÃvBtröÒhŸDg¸ÏEx<±äèð²Žb‰ÏøÛfizþõ䇾®è<¯[}¶±µå €w,Èîu¾ýõ!Çø—ª!—¨ð½Fk!/KHotã:‰`¬ùQWæ)AÑh’Ÿi¨œ[Ù:—¢ëÃÀx¾›rëM§× MŸ J¹›†ÅÓCè]þtmÆm¬XÛø –XL1A&7°â$¶ØÇÞÉÞêTE€zg¿®z_IèŽó™ÖÌp©q¼{hTyø†6Ž-Ÿ¼ÓñBs±¯ÒœÐÞÌÈ÷²ÿvà«R Ó–È7ÞÞåiÀF{Â.¶Ò¿-L¼2›–JOÁ sÂÄ„ Á瘧Î$TA&7š–#_¬*ÛΞY¨£¥®º1‹÷çmÙž+¾ˆpåª^²×bZ¸.31¨ówL|‘ŧ-‹ÏáëE“önöžÐ3ËXÉœ ‘Áh/RB¬ Ö-A{;Ë „ f0ž‹eVÆ&b’rm Wq1Ø«‹Í’#§n|hÞ\«ò|•BT‰Ò£t˜B&ŒÛ —Oi½ð€8$ÑHh°¼%e¶ç{¸Sé^&ªà¥p ] ׌´%š*¶:§”ôÛnz½û˜Sn»Žo<ïW ÙèJë%¯i†à+RŸE°áR§S²Ô9éWˆÎO»ô`¥J]hϯ Ե렽(BN$OÇ$;ÄwVÓ1åÖˆÑÚM»¤·µÊæã{>Ú,öf–Ó\>I %U' ìi^‰Ýð\Š59Bäæè棹X¯†mÿ(Ô-0Ô}/¸WÖ+ePês×ìºÞ ÐGIn¦uìTSÉ[×h8£ª»+É Yauvi }Ø‘;•ŸU=u10©ˆˆ·zg¡±z^¸Óä ´K`¨OÈmD¡"Pk(­¾zÏÁÔ·Q„ôE 1Ô´986ýÇMÃÆÉ#gQ B‹¸raõgX±ñ¾WÁfã¤Á,šÜ÷‚Xíý¨lŒ_r²î.¾:½(ÈFSy¢MQú€ µõüa ·ì6E½HÓ¦}©w6ÈÑ7Ö…ƒ ¤× $q<³órÑa뿇1Õ¶?Œ­D¤o¤ù0±ôI~Ø!¥ei”DÉ0€$z˜ÐUOã ësžÊIïÝÐúalßKçÆöÑñPÆFÆ é½ú˜ñð .ÄþFºŠ`O+ÀdÄ'ØŠ?’êO®'@*O±H•CÒ¤æ–EÜþ B<è¢ÕîW$9Og-Õ ‡^YóÚÙdOa ¾’bŒÒõ%$·7¸ :ÛMóg¨¥^/&$.·ÍL~·çÕ¯h^NwÙuî#TsZ] ‚ÅñêN¿ŸKUªbÏ¬ì ¹·ªx…ìTíègËPÅymÂ^DÓ4Õ0ì•9‘êÈt‘3v}FQ¨±uzA>»r¦Áðz†l‹ÈD”S÷L“¢Ô°*%þJK«6·(÷„…)tè Eð$bÌH&] Ç(aAFæ3éó0Fã êêJ.]JV¬2ߥƒðÞÂÆic MP‘¨þ…3ušàJ!Ò.)ÒgvËu¿ßÏú5¢óB :€Vù „2}§qSÃÏòe,C›u'JwWÕÔ„azì¬xÙ>Ê÷Yq@-Î;å ZC›7<öLU‘4Õ/£Dœ)ŽešCMÖê™J´\üI±æÑùs«¸p[:7.S+xy•Ï܃±“8óĶ–Õt#¬iwžzXïq•À¯wH§ãúÞó‹ãß>‹}ó„ñúJ €Ñ©Û—>YdD€íe— LɆÕó¹¯Ä\„ãÜ}pzíg7ƒ«ØXMa¢CÉ”ƒròÐÔ9@•öÄ<½Íâ u\ ÓN6'BŽë 9«{­”ˆÐ]š/¿„mµl§¬tôáÜß¾)ö£’ÓõB˜€‚IGüiÀdÄè9O¤=ÅȺ)Ï1ù´3¼Rì´Õ_—­–°rºðiíß'—k£º˜AYãc¾áuô È™_‰÷Ñ\ª÷=Pϵ €ëcÝ©ˆßn:‡8þÅdï}.@UgÇžg>røF0|±aàþ@ñ)ÓúT¼û²DÈMƒI—¸Â2®‹À7“F,èCX ­‰èü~t07ØW‹ _ð\_ñú°~oi×pÕø._þº°ƒYèQ’¢Fs”ËÏKáÀ‡EˆŽlœÓk¯Ÿò_X7â‘·8úëW=ã7baÉ9ºJ´2tký(v*q)>-§§QÕJL¤Šuëá²¹4²K|þ Ã-ñ5ÂíŸþ"N!+«Úó-„²ON[Bâ¯ôA/÷gp#§>ãª0ô…+W•+ .®ªhŠ/µÉá×· ~{5ÞÅ#Áµ…‚™ý `íû°º ðãÔž’ž\,LcãásÛ6k·þ$AX)9^`_‹(÷²æ+ó— ®:»?p}ú,×AÕßñ…ª!‹Å8wÍ_K+aåâ\`xÝ®øä €NÅÇäªkøbÖ¨R´¶ðÅCb4KÃV›:)_R÷, ÙD¿±º Ö-›<}¾Ä¸Å•Ó@¢ù·?Á†…ü ¹¿|þsl -#{þâoÀGî¢x%&òrÌšü$/üõEçè¾\4v'Â0î•Í #.=Êæì …¢JY¦9ã1*´ÝNб[Øê1š½oÖØäŒ‚˜=óÑÌUz\“ñ \?Ï»·F²€MÂ…Lò(õ 6Ã"Õ„µPK‡ö»zž9KÄBîr5–§õ ¸dª8ÜÉáF¿¿H©~ùM ·=U•‹ˆ8ÀªÈ‚MnȘPs;'Ԍڧ¢võŒÒ+¯ºÿw5=¾?°F zäêAKZ)Xò(¡Z—˜ÀÞ£FQé=¯¨,’µt±‡R„“›ËHyÝíÖNb@×¶ëÚ¢"cÅú]¦ÑZ$`~ FsÜþb¨ab÷7²CÒhºm0Hnˆm—– ¢ÉK•à`—1éãào‹o!²TDR\{œ°a7¦pE±/ž:üÊÒÔ‡Q²5D׃b€p6ö;­’8õYw#%'ZØÔÆ€-Íô¿Æá=ŽC¯m= s—Ú½-’¡iUp|d ™&UÙ_¤0R-\•-z¨”0°‡TlRzaxØ\»äZØ~MÛ*¥äD´U™ÿªsÄIžà “¹y(ßTD¥Ü:¶ŽÉ×YÓ'DMÌyd1Íðõ÷WŸ#%x╸l”©,¨ŽÐ´´ÝñîI·öÊzç”d¡¦ÅÛƒ´°ÒÍS9–‹Ã[XÒV¯ IÑcšA+…@[¢Çj¹Y†t¾· 6Š]Á&…3ï+¹›”TdR³¢c«©ðÃ(Q¸ýd#”}]!ÙY¹îtwewœú\<–?‚xKÃ[—PqZDÃìM]Öˆº}ÑmCéŸÿŸ5…K‘Ùi†¸/µ2rª× UçRÞn ¸ •Ùõ}d÷;Çκ•÷†‡Bš7Y[ìÍ1ŸÀžJÇÌhýª²™º># ‰ÍâzgKÁÛwI? o ª¢¢"…X‘ÍsJ‚"t¯[X¢Éz6ž\BnEŽƒ@Má2¡//™Äp9¯-ƒ! ÝÚö`‚DÆ+UhEÿHû n·P}U©]”U @*¿ÔFàv”*‡¬ÊCE9ùšlË‘V»OÒ†^ôÑB§—^‚åk›ø¡¦ˆ”Èý©ƒ!²kØkäT{ ú@”Œ T`x”; å¾홇|ÜÚýN ÷…aIqÑ…mó¹öÑð˜øÔÈÃø‹Ì&i@}h¸KQÞÚÀ×*h†fT»”‘K•¾7…%As5ìŽ2ƒ‰%;3ÙŒ‡ŽµVþ-è>ðc„”r*ªÅVÌóDWæò£é†Ïy5…/æŒRû—/(:¯Âbåd"ì^ÑÕ£`¾ŸdÛì1€o;-û¯ °·¿¸&Ú±OùîÆM¼jZ±ÿ|ݰ.ôÞPÈ`Tð|x€?dPPFØÇ/%Í8¢DŸbþÀàCyârÄEÇA 9 ÜSi fâŸNÍú¹ aU@Ùe!q»G—â±)}GÀfúó©â€¿Dêøïõ÷ú{}ªEàR"þ5_‘ùœqõ§ßà  ±‘óñMŸôû—»”Ö ü}wͰ àÈr.ïø$C'þóë›:ó…—ï}1âH L€×–¹Xuä‹=¢KŽ@eAJ,üwÙúï)Ð ¼wWÿÂÔì5ŽÕH·Ñž›gf-\¼é>Ã}8 Î{B‚7Y:t-ƒìöG._tÛ°Ë~Þˆ•·ÞjQJö:BMq:Ìùt3…ƒÑ'½“/‡Îàˆ2ÏcsZÞ‚,Ÿ}´îŒ&*VèÐÄ«ÿ‹´­øX>Dl”†¾~(ˆZ§º œKúC¿ÒÉh\M_–#º:AG!Ðf:鈺¹û†ÆóT6Z°¦ó«j£ªwùÝrp[Äêb7^“¿Êí4vÅ9êv²Iš] „•c%‚(UÇF8p^Ì+C±ß\©IS9½33g+ú©u@H )­º 5¨ÖMî$ g1 à¥CçqÙý°¤*s2ÚwLN€ì'JîPª=§ßÄè™ãg…P ívÒÍ%x°3êÖö ù`X„ä®[è’S‰šÝ÷(äàg­7 ouþ3Md¦§È£©ñLâ©Îs„¤:—£yÒºj§Œn»ªf°7O Ð4™R¹­€Ö[FEoEëаì^eƒž+YˆoÜ|Rè2£AÿŒj»½Ú}JPefeè ï$Ë¥Rˆ°2K\ÌôWœ{êe€¦ ¤b¦Q©“«Ó‚DÚˆ.ít³ÄF]g˜­esÔ„ e8Ó¨BfMè‘Ì!ÏØ•ãŠ\ۮѥ2}‡ª¦«” Ù²z4”"!ú»+^Š™£!Æ(w2ÜáýÙ¢óE’çLñË#`¡þazUm[”%zÕÆ<8µ€ëº¯v]¿È8ŒÃÎÅ"°Oh¸ï;@ç[üH“Õ¼áüv TzÖ·E_0É2®¡ÔÀ‰kÝLã´á7L>&zàaʤˆuÌãS0F$1;GZ”šEr‹½åJ! Uä3u)J2ë¥OIÛåN™ Fc„ó]D 9ûˆÏÇÃd>ê^]‡=‚]Ì:IØÁŠäWš ÜhÉñ{Â÷a„“ÛØþUÅÿ'ÆÑy•"`¡0rܽ”+b¾ø×LÄ ãægvÆÉ ¥ä<¥°,ü®„pò3,€¿Dnßè†Ü[1ßÚ¢h.؉•P`EÑ.4»¤-Çq¿mr?Úó‰RVi)Õú4CžTE)¤ *µ2,oøu£x"‰ð™OA?ˆäP&$P{GÀ =ùuÄQ$=¾dÄ…Œ X4¬IÏ—é Œ„€ÒÍu6 ßz ‡e†ÓÕZFg#á¦9Ø+D8] §hú-A~Ž@Œ¶©e݉p ðÁºd?J0÷¬ƒç€<•œÜÄ›øl¡xcò¨Ó­{ãÓ\y|%Ô#^ÌÊ[Q;,Ó>Ðyaòª<<š,†§h É E=¡'º éúû¡ÀÉL@¹¶+¢‘ʲ×.Qô°öÙ·™o‘Û%ÊX?ÂnÚ¢ê{€¹?£V}¡Ñ׬†„…‘Æ+ÊĈ2}Fš`ã$[{z]ëon½—œp®Lüa”#2e¸\²ég­-n€ä4Éf ‹oÖR)2:7ãuKkø³@»<âÔg…Ù–•Ò¾}0žÿãÀ7™§Ð톲új#œƒ®0ÛÅBázÌv{þ®¢ó%®;îbˆy\‹ƒ¥dY®sÓhò^¯ Ñ¼}€á¨b碱×!l7J³uä‰Ù¹C7¨;¶Ó@düR&$A>‡o­¸Pº»“B†÷‰k‹Zr¾Fù^ gü2–„é4™¡ŽÒ€’q\ÌmœÈ£óHüHf9mÃ6?‹l&YLªG÷rÈ­pLŸ\$CàŸn.a§Ad{D Å ¨+a›Ïn3r†ŠÅŠÍ$RÖ+ɽ ç‚R+á’€vàúug.sÝí¥åE£kÈ™±è¾Ë}©‘hýSÜ5˜)É4I·cÕËòîƒáæôk» ò~UÝ݃l$®þ"Û(vì}eð9JÂÆpm±Α 9–@ÑD¬ì=s]’èìTÅÉ[ûÜ+ÿÀi ÖßÞ“­ÛÀqà¥/Á kþš¡QÔKÓÞmua,{3ãuÖƒ œ²ÿ¨iƒ l#ûÁO1Ö(Rz9Àpå©ã@ÅÌÈN”`$Ø) ²­ðBHN”ô,S§8kôÖióJ!h™Ùί¢UÖ/µ+¯,¨é‰Y\É'½¥‚úSñ²?Ø»;:AAì+Ú“E #JÈÁåÉ=Råâݨ87‡d )£c; èÉ e“øÜî©ñªRRØHÆ5ž_•¿õ½ÿ9eë¹²Ñ$z¤ÂJEf}Ø0;5ƒ–ßqFÞlC§tÄ×–_’¤ Á O§Tñ´Æ5@%U#t8äwÇÇA }P18ØÆ{áèƒ=2RNdzék% úeÐ< ñ»±°È"ÔŒgôåìÂMƒˆ÷8ü- €fh â^ÚŽ6?ÊÄg ÈÁžìr#ÊŠû_‚…ÀB <Ë õ #.<¯—)ÀPV®Ä%9ô‰åOS6¹q û¸?|Ló­'ƒc0³Û[ oB•FÝã³ïø V«`Œ Æ:!Æ'‰Àe(À¶Ôu—P‰cHk\«éÉÂ`> ïCOqT³)T±#®¬@U±uf%M•ãkøÉM¢H q¬(Bºä ¢ ²2Œ*೓äxyå}à%šÖH•Œ5uª:ƒ¨vÁv{”™m@çO§•¯Ë¨Šè3Ö[tøžty¡H/‘MC=-2(S±ƒ°»}¸‡#FxGáé%Jˆ»¤úÅÃ'ãÍõ˜g-%1¸ ä°,ÇÃÃ[Râ&„e§•Ѭٸ m–Åç@ô¢OK¡¹¢´"ËÒS1NXŠâà ƒÕ<´÷Vz‚ùš‹÷<ƒã¾ThdŠvÕ–  ä‡#(DÒSY¹z­S"ÔPb€;¨ ñ顉©Žqî®VOcú o'\r]šiÄS³9=´­ l…x¢ÞÖq3ð·‘ÂÏ„¤•K‹°¾]”¾œ!•á ãÊ4~Gv'P>Šü"¿ M.šõªP ölz&ºPŠ@§ßÌuý‹uDDXC7|+w1¡ÄП« õ¢D{©WÍB¬¶ž˜Bå²éÆø[D›\á—]€Û—*Ðv\¯J.ª~ã#rÔ*èp¶Èša:&ª¸tñÆšÉØ¢b6‚c8m©M;©M¼ª@ÕÆÞ´»êãMÔˆ!ÙÃ)²g×®;¹•K]ƒàgI95y®¢‡ û!¬†Ø" “öÐâo!:ï,Õãžï21yf0¼|¹à¦yÆKiï T¤¿ôÌ„¤Ï¥_ž›%n&aø×Gy'×èù%ŒõøæÊüK0IИ#+ ©x‘a¥ýªòÒYÖCö‡Q!3g Áä/úÂÉ·sž¡¾ù6¾ MïOèïõ÷ú¯×9†¥ü³<_6àûô­©ŽŸèB©žX(³Óÿ‰¿üÀ³õ÷ý=ÿ¿ 9‹ØIµ @! |Ïà7>6öïéÿ/‘vè¸"ù÷zá©9€Øû½x‚c5Ïo)åäø‹¯vTÍPÙ«N_#ÝDUàý¥» ‹èª¯Þ€ß4øå9¯¸’>7'É‚ûÕPÚ°v> =:68EŒ#Š…úÞ£ÉI¶êÓG¦ûHÑéc´Êk)¦¹°óujÄR”˜Ct‹¤?êÝOg©Ròðr7©Žr€HÃøÙKìÆ±ôîjÅ„Za¯ë˨ÞÉÀéTÕˆfEYñêEß›Øgqœ¹)%ygQŒu¯Ü"Lu¿ˆKbz Eî~ç}‘¥V ÈŽiÓiC¨‡¾ãÁ8’"Euú~híÔƒ•˜úÐ8¡§nõ·-‡µ(¸rõ)òCÉ'1œ¢¡Ù29BÚ>&Sïå†_N)¯ Œù²7ïã9¾ç×~Ûó ûÉ'““7Äþk&Óg d>ÊV(Þy Kù£tMë4¾Ÿž¹Ö¶Ÿ6¸+Œc,ÍË–‘Ë#ßÇ{¿JÞ@†ï£¬mvqhù¹60b°Ô(ñiÄüX´¯Gë Û¸:ÊQp¨©ÏÁâ· OÑâ¤B$߆3Ÿ lXFÉ­`Ô±°xÅ’øôÀ4 ÚâJW,¶bfÕá~a˜½’€µ‡¤¦ý1.¥,d<ßÖûÛ(F(ÉÆL×5®Âëý³lM¶"O÷1{ºÞ“f˜ñòª"æÊ™Gi»•iˆc!”æÁJ·ò8 C’@7ÚØš]çË,>íìËðÁ„gð%qÒ$~o¤ ÌàÊà›®ˆÉ¡ÅpRvð¥Öy"ÈÙˆ°~ì1ø¡ýÕ­±Ü[®Ea Iߪ/³õP'g‹Ž5…æÈ…`ZÕ|u¨Ðµ‚ƒ„„ƒi ¸\À•Ò)š§¹ Û… >¦öÄ—FÒËÎyÓ°üe 0x®oËýYµ$ñ¼Ÿ&),FVcQÜ꣼‘O”[pÖtÔJ< ¨žrQ›·©ˆ`jÙh‰€ $Ã&Ü´Ôz»PQ“ááÑï´®gä*Äôq,–;_Ùmº¶Í‰k{Ψµ¡?nˆre;*ÖžPÎs˜¦­µ°‹ëèšQKâ>†÷+}Fòn˜‹}QÑù¾ýDÇfKWwI’&år¦¸Ý5 Y—®"ÏRʽyF%‘RJ½Ô·|Ê4p¥ ‚ßäC¥9?@ÑGø˜¥”«Šð-CafZŠC”ã½1¯™}œþŦۯ…¿W@&è1d1U©Èƒ¸f±3ä T>ð`®1/>äCF#ü$×ÂA„ô åß¿¾¹ ±vÚÈÈ8$4WPrdÙG ÔÆ¡7œ(‘¦Jºk>4»*L1Ó!j©NmÁ@{Çü²yD–5 ŽØ h@ÿ,ƒ|±çÐJLP“q‰ÃÒÞ™{§Z ¾¦$åÍÄD\kÑk4´Ë›U\3T(e Ê¸è3@‰‘¹î*ìó0àÔú匉pdÊ+L–˜´„¥AF;BÑCYmôCjcåêÃûÈ&&9œ;´Ð/±îAæ½P‡‘^ð'i¥ÁsÚR0R©@تþf08¨¢î4µ5a ²}•€YÛb¥×U³¬VÐ OKVŠêqÉLqL+d<„·8šb¢V²H¹ £½©f/–’†å;Ulj…sç¸ßäPh©”‘ PŠQ’®ÌÙ‹²y]…f]FÁ>Ñ9¢ƒjªL"5ó6€åxlÒ5G²%]9Jÿ–šXæF+J‹¤œWOe¯@£«Òëf„¹–܇."¶ûQ\^\ä0$ëTu&v­ªv?bgÅcó®|ÝóÉZ7‚=ê6êãÙèœ=8²Fo9D4üÙ»ªÇýÑ¢ó0Ó@£Gä ³»ðÐ/]€…GYy¸*ýÇc¾²s*ÁI$ã0ˆª>Ê|…jé+7·Ì<Ë)ƒææð«'õš´ 7n+%µSh¸„¬ÑU¬ueŒé*äf9ž‹á € 6Ó…ûò+Ll/Ú¯\ž/.ÁñBðÚ½ð#–æïuõ¢ròœùTð9BÏ5Úy¼pûàÉ+aá§/ˆ‰æß[q¢ã ž<œwAÙþ?f™Ãý{9©"!ízá³ù‚Z_|çùŠå þüÝÊ"­Ì˜Âë7Ÿ¿‘õŽþW¬Ò—Ðïºn³1 ¹+ÌùÊä`y“vø*ùbÉ™0š×nªòKæµó¥B8^Ð>4ÑaJ¶Òº‰o«Ÿ«™³ìåÍ}¦ rÏá¬zÒ³{ÿ”Òúb0‚³²ÒŸŸkXÈü‹»úSÖ65–~³ÕFp¡ÒB19O¬»N››°ÛÒ3n÷ÈmxW‹ØèmÉ•³¶šH«OoÁ;á£÷{©ixA¯!Õ½½^|@£U÷ÖGªQ˜<þR¯Uãq TØÄ÷NjÿQĸ˜QêQ>Ę Äè«dË4ÀÚìiŽâˆQä‹<¡E÷Iœ‹ÏÄÍ 9§l©ÇÝ‹L”…ý*$8æ¶T£*(ãÊ–Ùý „‹ô/1é‹ZsŽW ããšLÀZÂòÝÁâÞ!G,xØ/w³‹ T5\ç½u%¦‚{×M§Av">äàz²Âù”‹gß¹.¬$#H.¯ƒùoÆÙG aö±”Yn®ÇÛ€ݨpÌþ}I)>èmv»yK Ú±ûÓ0°%Ï‹ðù7ì%ök§ú!¶*øf}øˆWèÛBû>®)Šmä´oä-{aÆïG×Ó ¬0’Ü/ÂÛOF&,1¥P·p@¦ 1C-ºî{†·÷Ð?ËÇ^ CMXÚmçîÊ+RÐ=—°¥ë>»ÅÅCžJ˜T(ò»Ìµ8Y$©ÏÕˆÞB©O[{ÕY.Gy^3¡pçÈ ÇQŽN¼Œù¦l6MM[¸µdæ¢ãH×Í¥¸L CRj^=vW×0ñºý[…ï2”y¢˜šA26˜ZŸLׇ)ÄS]¾‘Åôm0VÉE™ƒMƒ²C–ìdeÛ ûE?f#DŸtÀSø!E3 U𥋄$«ÇÉið)\|=f¨ã[²h}êaÁ"5™Lx_ƒ ˆ6•,OÛÓ S˽eM3› ÿ„œó•$€*ÄÏ{ÅL3ïñD¥(±¯~~”ÛOæÆ# † 6_²ìet6½Ìuz\m¢™‡hˆâ”®~âäi¼‹ñ’ï#=qCØpp“´^ÞEÃ7_ž@½ÿ…מÍ7^ýIÃyÕ•àüÎûô]ÀOûª§Çáqä±Ņ‡}닾À¿Ü ÁoÀ“#"¼ã žNî<½%€Ìö®PC¸yä'a©nö@¦J?Ùâ}>cqºÉzrÁqÁSöÇlíÞFöE;‹±ÛFþ$>ÇàžHÈ·cDÀý˜À“''hó…¾’bçŽÁ+¢BŽ£¼æìÒßò@áôßîÅÚ¿¯I¤ÎÐÞ.¹'Û‚ðtd³q,®¡•7Zj«“mTGÍ3_X5*Fí$ŒÎéÚVóRÑÎo’óR½çtÛðuÊ$bZÃ1³Ëݶ̢M¾5`<·K¥üpÑyY`â5—·ó)'ž‹Ó ¾Ááú~(czž™½ùú-nðQ^)ᥰD>eƒ¿CÜʲVÃÂÊô¢yüË>NÐ@ØhÕ}isïÂbÁ+¶hC¯=·O¿÷KQ3H‡rMç ,9Ö»To$Ê•yvy¿³ñÒ]O?áôVãÞÎ$Ëlè}š”]ãó2H†s :0MF. 䤸¦œ5—ÄÖÓÃdâ}^xÒr,ÑžXNŠøð2Xèò’üLQÜHêÉõ¹¸7Œ¬Ú¯A¦a#^õÕÅè„¿zGïBI/úì3]í‰PJçøŒñS`Hò2àžEß«gBÝjýäi*öNÜlÏ<_@È ¥¯6­r4âójÎn@:ùís‘/êŒbÒhËmõº–®~µ…en©Mßü¥*ke#®— îK7ä{nn-’ÚsÕÔÉ¿Ô,ö¬§}9ä·s=”*´zÜ».ÌNƒ˜-9hË}ƒèÿŒ òìd™•ì/Š›öl0±É*Z8óaKÊ®šI®ëë9ï ã+âñµÏì‚|=Lîùƒ˜½*Q  Ü0³Ç=ïc{ÎgŽ*L¡Õ9½,á 4sv’²+לž*u©Fë)ØÍ†ùÒ­ð '‡U—_/:¿€ºœ†,F¿è£D«‚Ò'TÚ ZûÅî'å!™=÷¦gDô¨V«ÓFæh‡A¢à1…¾¹‚þH)Eç³Cú±zšê-<0äa± ôÊ›íâP¨stžu)åÎ.ÚÂ6ƒ[­T¤êŽR¬z›ÐhþÆ\^u‹ÛÌ09ˆŠ%Õg6™! â¾â$NZÛ†úk# tê`—jR¥¦SÈLl;þ(oPóòP5YÈû¿;y¿ßïz9ú(t]-§àۖ‡Œ¢êÔ&è-&„“š8%ÇŠÿæÞ†4褽ÔQô–­ –«i{¶^µ®ͼ×Éðþú_AE?êdUÈãvZ©!øvÿhUurœØ$ý`ÞP¬]Ÿ~É‚Â=q›:À2;_`r6´*^¦Ãèè=®*W-Pj)NIËUéôi¯méèƒX7<ýÞëæ‘R{° ‡™}$>T2hê!ù ,ú~¥_×á%²3 5ÜEtÙžoÄFÄ£íˆÐ8 `¾|fÝ H¹2±+Áß:BøÈ ‘ ªWîdÒG²:W†#DgW›ë°ÍÇ}sçAû+k2hžDšn“ðᡦֈ¢´SqNdö*;XµlëxJlE Sßôº0‚¶¥Ò*…`û„¦uå$8­L§Ú±½] Ú/Œ‰Í¡XÀmÂHN€a$' <3Â=`A!Z"HAW žµW Ý¥Çy®£ñÃÂ~ÁÊüɉ:-1F¢rê6.4þ+ (ÿ¬G9†¼xÎTÃãÍ nÖ*– Eù㾇¾)7Û¹#Ú:šÔ¤XÆCr«Ê5ã•¥;1:v†<ìªQd…BýÝZ_tz¢ädB§O¢u;‘ù•Ö¹ŸXQON„‹SPüRëST{³Pñ>mLê߀~ÀÍûÍX1@‰i+ßÈ8B !|A/VC¥Hd§®£ J¸â¡"?𷘑âwÌúcO¢×„ÆE|L„[ÁȰ h¤¼ú“Ñ[Ð22Ã@¤­Ô©èFû±2ÆÔå+Ç=ñ Sʆ?¡¡ÌÑX¸¼É@™Ê±GfÔ#v8ð NÔƒ¡ ‘[ ˜*„X%êb¸v+Ç&Ò×ÒëF‘¼7 ̳ïñíB)ûn˜Tðü!³$ðÈŒ¹·C|ÒJilM˜8t¼nŒ¸_ÙþOt-g¸ºŠN·dVcd El¤jímY&ÔKwÊý‰¡»~+Ÿ:¦Å„’¦ÚÕúããO“”y¡Át…D/i‹œ…4áÆc±Ç²]ylF“ 1ÓÆîú—o³žVº§xê•|²f¶¢@>X"`÷wˆÎ«3²«"Õ¢TÔ¨8ùG èαÆP»cØp..}V49 UHÞ™êGž¨Ü—@ÍQ}9:A/•Ú)ò²eVÅú9/$úûÈ{Æ1p0>õËDoh*Eá¸TJ(„h*`–Z+aær–6¼Ñûý~¿ßyÿ×ñ‚`¥þá:{͆Œs:Ò®Y<ÃãJúnU$;ïë¨mž O{a~`÷~û{5;›¯`dmªTìyúà] .?m>woŸÁÀ+š¸iÀßkùÐD„.šÑ³,ž€Ý5(‰µŸJçF8¿ùÕ2Ù½²â@ÿˆbk?À…¯6Î×0Œ#õZœgÛÄ|%oW@Ôc…³éÊrkÛ‡'QM:Ñþ¤Øb¬è_c‘å×1òk˜‰§Á°ê‰mp*¾Xäý¤ãžW—û"[§ôs"°;Ƥ¾n]'!’þXÞ«Ú•˜¶LúùíÁð`è}¿ÌÇètlÆ;ÅX\‰Î1tõ=Ø*¢ KÐ ²ó6h„Ÿ™Ó䄼Ç-wÏŒöÎ'Èp;a‚Ó|J/K`Îü-iß: Ç FÃp¦Ïp™@ŸVHyð~rc„RkWËþнìÎ=ƒ! ÏËf‘û0§èRç„ÁfzŸµ²óKDç?á5µúYHyaºò…ó>.½t;,‚%þgzw›ú?k ¹Î[·>Añ* ´t87O7†ëhÓ#}ìh¾¢VÄ?~ÑþV"ƒÆ\îX$fÊÁ‚Ãr¿ßÿýû÷@ÿïÁäÃ¥>xôê´ 5@;<Ÿ-­ !{r¼“EßjY`Áš"¾¨ ÁuW‹wèš½r!øÓ¿qÉ¿~Öà—z];Œ€—¾íí°Ò¢EQ©ß¿Ÿ#¡·•ä…/Vz×Cp} ÏY›½*/½‘0ï‚ã}#÷ºwªeÕ:Ø×5ü\îwIÕû+–Ÿ4!àòçZ™§-/x®ƒm‡;•³M\€¡5ѽÿG ¯ÓT#sY…Dk ÏápÅO·v—(8õv.ýó—jä¹yBÈÛGïûĶØû«G„.*ƒìhd¢ ¯¶w§Î•Rn]ô¤¨†kß炦Ñ$¹«ªñ[2ê E­ H ú~)À!~ÏÃ'6ýÊüaGÆëˆ;jH4ó´—ªõºðÂP³Ñ:qUþò±)î÷;ØÿýïlIÁ…Äò¡³íÙî–íZµÂÀq7<æÕKåÑ/¶’…Õ”æGàwÙÄ(Üp½yËÉ@Ø'Ýg²‹E;ØÇh%-Cݰ£+ÿsC›…Ný&dýÔUé§Æ%b©B@dœ—´E§’ÑêòÉéG}|½ÁtP­“…%¹ ÅKÿˆ³éͱö(‰NpµaD¢Nu2Ó”Â^°Ké2—ܲ”°À„âœÙ4ÎñÞÅI‘H«‚åszøè‡ÁqnmNILlL#Rö£Ä!G*ƒgÝ7m” ň—"JÀ7ÜÌ5cjêzPTë(ëÃNªœA¡aIèáå](R£õ«.³È«‡yX­¿%¤t×Âb5J·M©W]½ÊôÃXñCyÖ æ°ì6ó=BˆÎxHƒ•’igÜ÷pn橊DeRH~×@`Ó{ï·È¢À};ý_”-ü\ÜöoÆ#YxLc=Ã]ߣ¶JD7nW#Ka\ŠeŒwWö˜µà-ÎâktUÅ*V©†é™ºn²I‡áô´˜(iVVn*Úl¡sßE¬INÓˆÖp ݶ±‹ ГL•»B ”,Š"ì éC=4nž¯s i{†¤ VxÖ ÓåGJh¯¦Øî%|Oe†ÖëÜB?ò­oŽJƒ†OHÔ@æØ¢f¦øú8™=šÁUG¸¾(5=9þ‘ýãÞv‘=–uxJ)·c‘oͱÑÈÄù™Ò€ºuíÄ~J*˺Gc g­x%Øy~‰ô „Ùooƒ9Y[CÔ Ï଑^@a¨Ä"5¬PÝ\ æY'ïÓ).¢\„e •³ÀÄ;¥= tÍÎCбåDéû3šÀMc»d`ÙJAR ¯KSA®a”¿Ø}D‹˜‚¨EV QÖMTè¿úù”n…ê}q›øm˧Æ´zLw«-è`g¤qRø€)ôxÔëTÉæv’ˆ‚â"r*‘u¥QÄ6*͚˸įH¯bŽÆÜy™/Ľ$0ŸÜ3FVB|Ÿ—Å$'h-Åq1¹–^!ªœ›H-%gáZ8¡–Ÿ+:¿QøªV"Â.‡»£Ii•ˆ‚ëØ$‹¿@S\ÛAÀ3|²ª'‹RA^üÂ2 [ç{Äæ˜”<ò‡±Æ\®³&|€¢\¾¼@3°Ÿ` #Ó‘§£ÝErpGÌ~ï(Iå~¿ßÿýû¿÷Qê[ËQi±Ï…04œ§‚¦ãQN±¢ÿ%¡‹Lž'\ÕÊÓàÂ’¸TÚ†ñvÐÐ%ôÔ­÷˜°°:§ Q¹´…ÍãĉFâ@S„³sŒì¢viqˆ5”ü`9{ÞO|ä{ØÜºiXªz¯´hm¥L‚6[wL ‰^)Þ(±kijþ@F²Øûî0Á˲ø¬~¶¤¤VÄó®qxO#ìÝÅ`Åx¬\Ü" ãzé_í( v`i€ÝŠzÛ[¹ÒA/ªé;Ûó-‘6zØÍé48BFd ,miVš‰0ÀPCR£:Ñ&†ô‚YŽ?SùEÆ:‡{ë°÷¡¾J¸Æó 0Ú¥q™\jµ§HÅ.Åí«ÏcÂgGˆ©sŒ~n\ŽX%Æaós†¾xÍ` 1ìÆX‘µú!Ô¾Ef*õ´*úZæc‡JèñY3>¤ªyS)Mm|'¾BÇÉz—}dK×A‡î™¸¿$+xÜtÙŒìhAë=J ´‰1_6Geý? 4lÙ[î)`Kö…q4Õp½Âukc1‚°ò ØC¤4µ{ç…ò¹¨[ i¬'†-£Í”Þ£CyT‹Ü½óÉ씬~²úôaÆXD2NÂRE ؇ä$€Úž3&.{,úim÷Ò2À}x%P UAM&±T²oÁæ>|¯Jj› ›7ßLRx$EÑ×38[u_÷/ŸÁ>KÏ¢x åïå^ÒPbq·{»¶ºTYM·¡èãÛNÕïÄ•–E¯À©º7Žu›Cfìºw^át%ÙÄû۵Έ¦Ìö‡qç,÷ÿ÷ß¿ÿîwÞïÖˆù Érùh6ºÇ+ðŸ°F{¢nd<Ö³’+0£)ÌÉosÁÛ}ÓŽO<°ËÐÒ¿×g½ø÷ïõ÷ú{½ô,Kí…ƒ_èþÞdñê/xKúD¼}í^¾„ß1Ðøêbßh½Ù§•øú]4Räæé@p»¼Í†™£D;˺v¯_‹é˜ºÏ>†…‡ä†T'·ÞН÷Âÿž1•ÁÞÓôc24¶ÿk1¿þÍÉAµ×ˆ ÿÞŒÛóp¦»ÿiÛ¢ÿü›Eç¿à93‹©ôm (†éªûÉõE°¦†K²³°7ÃÖäMË-ª!ÍN–¦ÄSÊ!ÔRœˆÃá:]¬“ÍJ]ßm/íìHê?ƒho©Üºb²‘SŠÄ€*VîûØl×zUã)¥”*#f šÏT¹t¥Ï%ð|šGw†iÚ²;j%Ø)º£°î±¶Ç²? Ôì Y#›OÓQi4:!‡Rî÷;ùèý¿ÿ»tE4Þ«$‚ºžá£‹}ŠÕã?{KÄCô¡3‡;OÜ7”ŠqèŽy¨î‰F·§ý1TÅPQu'¾CVxŠ­‚ gõ·Ð‰ (¹NøFyýÈpœ†¾gOÉ%4ºó?lå·¤œÚö} {`jÏž°Eh°x5Y*«›ª¥ö08òԸƥ€`€âû±íŲQÂ…ìK¤Fbl‰?I‰íí6蔤ûÊ™èp¢µš™Qê85âQ‹A-‰ÎKe%(“z›¥"Rî.¥®‹>lØnü„reò£c#çŠMý.w¯‹\Ê GÝ©]Nù¶Â 5 ‡ý÷‡·”3©­TR â&,3Ö–ÉCâêÈaÑ Pœ­‹DÔ”=CA‰æ Ù¾#(bž‰ly®=§ýÀõ,”(+öº9VõVó4C½JÓ#2òÅñÙŠ>êµ÷GþƒèëÒÎ@/ –þބŢ­®!º~¸AŽƒxXmßÖ”’kYp§³\yä4D%Âé Mã¯?g÷Áº[_u˜êU mmœÏð1YÓ¼‡T´FI«Þô3&¹u4>Ú•øÝ!£?ÈÈRtèâÌR/£4˜t˜ÛQ íË®%Še€Ùù+ˆ•çIa0\wOªíè'=Ö&iÉNÈ …ÑÌUÛåM!*së¬SLjšpR'j¿‡B%öYó8ŽXétTaº`NT4’òC›ìÃÊW^À#AŒånÎaJ‚JŒ`É©Ï T7ïüŽŸOtÖø©,¦Ÿú¡ø³%RöeU–«eï(mƒ"ÓH nù(=u7A0³L Ûº« iF—å·Psãæ#C–×4}pèMe?ŽÜÙ2‘˜ªb ¿Wyœ&F½V)y"‘I qø&t•,Ê EÏ5#^ iMI#9Ö¡áˆÈ-g½x£œy£œ}qzö€÷…챓PüÎùL¬“û@ kF¬¦ä2Óï.:Å's¾ûÕZ/8R ærÈNòÔ÷™ØXèÅ!F‘|³nÛó ŽY.j9fÃ,£Oá£DÌe7Ϙ(ýËøØ\yT\‹Æ§ãJ¼â™kA@Œ±—dˆŽDÅ'Œú3IÑ[Îd-e%B8¼‹ûýßÿý¿ÿ÷þà†[A8O¼FÝáãÆuLQÏ=çi OˆÖck‹ïã4,PXØŽŽ××Dw!Mì“Åй~„¿ÆèZx²ÓIóú&d¾lC2«ýoX5UÉlïç_T(CT<ÚvSv/ŠLˆÕz!·Òž5â¹èLí»ËIÛÓÛÒðÝ‚ÁÏhÁ§vç—ûŒšÓE“·¦Û¦$Æí[ŽKQ#Ì+«nÔÑ’!…Af^É‘æ~×6AqæÍ–ä-|Ÿ{é„¢ÜÎZ-dYƒM^;"TR3m' î1æêÿ8$n5vLHÑI`â]O¥‚V—¦¤"¡SP2¬U8„Û®–Ðpèá̸¢JçŒã<w–ÀH?ÕÃßCâ|d=˜”¥ßÒØr–Úh×F1›å5¯D1‡ÓcèíˆRvÈþ9m„>sd"ޤÉR`Ë]2饓͚½pȽ[¦žzÖSi©eBŨ¬Èz•Ð^Γ‰}¸b.‘¼ÑWUà¨Ã\­ZæRôÝY:0`¿±|s§OŸYgSx< Ûív ák.£)S´®D!†NÐ~4i¯TDºCN* ‚‚[ÌGV…\#åâêÐföÅÚslªØtøùvˆL*Á`¾‘^Noöhg^É<>r¤NxR‚fÓ s%õ‹–ÀqŠ+Ò×») ÁSxÒ N™ŒDDC”L(.7‹ê—.¶÷TZnZÄ4ªŽìcGùº§?Mè¶2Ào$:ŸYøŒhåA5óirœ¤~‹“YÒ‡e½+諾.~l—_ yê}4Cj—5Ó¹(çƒÈ¥-9TÑæ—‘cmÕU\^ÙYB¸9G°ñÚr3­¦<ÌãýþïñâåVJÁ-PÿÑ4¯PËlTðE‰Íôði2{ KsƒÙùÊÈ0Kuç pÔþÜ4!H®BÌ$'jôVj¥òŸÆû¤ë®Æ¸ýìú~\O%©Ê! çÞ‡ÀÄÂ<ïbÎæ.R—8—THi¢õlµŒy7 „Tú¾Ð ˆ"xÇúÖ]éÀŒË!T'L@S3ÃÙúl?y”Èþ&F¬´›ârÝñέeNC’#õmJ½mBûès%­òŠËbûù`¶¼O{¨šL‘Ç@0ÛM†•Ómè…UWTœž>Gª«Fžp8¦\î켕Ȧ¾[ R„‘;™XkzÂÇÃø‚_+:oä(§ÊŠƒ}ˆ`sÇ΋ ³q<IécÏšyêÂAB˜, vŸtI¢"! ȲµiÄ"ÝëÁ5Ca)™®ó¾ c`lhl̤ßÑyx¦"n¦ÇçÞ×Àèªh܇Ýp:“ü@ÿáÈäѹ­’ÃN?Ö)šŽtfñ~ôþßïÿþ=Jå7 ­¡Äzk«ÁBqÓ„,iUuf2ÜTRa ü–H¾Ò¹ƒ>º;/2)G¯àt¼ÇC”xÍï@Ð ‘êëâx@Ý!(ëÚ³7A*r4(Ö*ÎÒŸ?ˆi‚Êê°dx•”“âõÅu¯j!G…ÄM1”Ìé'jሼܙ–È*%ßÌøX‰ukJTUjb6!Û¦ýi'1sda½blDI09[Òp÷ÉqzoçR„ôJ/¾aØy&*† ÒÎÉC¢®U „ø?¸/ÄêéÏTÊŽë¼Îî¹" ¶5æ2G1n'1Q¾jÄpdÈøÃï;ŠG‡¨Ž3 ½a«f´Â=#þoËÛ)GPèªd¯¹¯€ö¹AæS2*=dBŽnVÝdÑXMG‘¢öŸ(‚ZµUß Ô)ÂïJ£ÂãéÀl•7e8à1ÖÔ´2EåëáoÆC ¡«,™‚Ïà‚¯÷„C°„˜Tés B¦ª; K.?äÌ.©KÍPkÁWæ1ÎWUDš˜/:h#5ÕȈ“Fö9 3Yªì'ãø†Ê3ÂÔ¸±C.™t›OȽÞK~ll®”+v¼[d×v÷Ù§™7kj9 i¾¶°9QSÌ3öžÆ[ù&éÈjZ 9© =u;¶ c1RTí$´±*n…ëF;Â@$7 _j*¶ ;ª()üÂÖ/k¶8{~Šø4_çг9tù j|@éȾ zÕ3mq¼ó1¬YtOBÛ²èXŒDóuz$×`s> ,¸VÄ@¯D ì(¦r?%ÅÀkiKÂçò:ņ0ƒºÎ;6”ñõÖb+gOæf!‰"`1&{¤™\K$¯)«>(eCŠ'˜–rˆ–ÕlŠXèT% ªQ(N›ÒMuÔC*^ óÑÑ÷·c“Ðʳ.,daª°ßRä—‰ÎÍ?žj¶ÍDwŸ1þT³Í̦jíÿÃ5t2æ/åê£'ãôäG¿.”ÚiÒuˆ5~¯ä6‰¾XÎ<çälSHŒ³ $é™JÜôŽÅö ®¤“xBíÒH’ôÿ~¿£PÊÜäÍK1è–LýO9³UéÒ­=R6¦÷•.îJÌרù¯°0Wêï*™ö÷zñ‹?†Zû÷Z7ï¿ìâ‡ò;/^¨qq²’a*Û¿ò…òItxlñ'@ÉxîR+ôòéå«Ìâ›·ôbSäsO6O;‹â=œë/ªúuÕDFœè^üî› jž¶¢ì_™Gð[.ÍphÊž5ÂòêTÕ!<¦;”»Ê™ÇƒŽ:XLD0˜Äå9ä'WxIŠ_ûÂÆU›ö'JhG`û$^¸,©lÅ8‚ çŸèü³VÏáã!Þn·AeÔ²Üù¾U;^áªëêÖ6]¦Èy±ðãéð<ÚÎêÛöpIâñ]¬D…íg&Ä\g!‰M|)ôPa–Ò}gDÝ:,aA71”¯öOÚ5ˆ,3wÙCRU“ºÎ =…§²0A¨§ìKRYlz:Åh{ôþ A±l "ºcDÕIÑ¿¢ÔìÕǶ“ㆭ¾‡ž*¯ *œíöé_ló`Ø;V]g°º}9°ß±¤ ¹ÚaÀp‡+ú…s‰3ÓW7דCŒ0’9¹»þÃ$}§6ì6y] k<¸™»êyÅ—ƒ“˜Þ&‡î/v`Q:¶J´´ â!àfÀ “£’¯[޹6òÐàYÖ>‘NV …ç„m;p€#ý€SiÕ. $ƒÉ²~d$(©FãáPÒˆÛ|„% ¡wˆAÆ%RsÇŠkqqSŒš^E,J¬°Œ¤_¸kyý0*ªµï±’m(¶síÐTS0OC*@Ò`¨‰hJ€¢Ø‰S€&3®îú@öGyá0ø°<7 •£õhSH7¼òÎ9&š˜y ëà†Áýe+?#æôlö¸!’ŒŒ‰Gˆž›$qaI²ßcvE¨†rÔZ¸*Ì‹ž„4€¼²«âÈF~®—¬u?;9°.T¯÷ãÕ <’d¦ß':º£ IÜ="}ßšªª<}M Õ& +Ä*C¶Ph”a•n« U÷klÅñ©ÊGOí9shcü?ˆÆ—‚´Hž—ÏVšÑa¦ l—…·sô5‰õMƒ }ÂÚkv¥9O—eX.½k qóÇöŒgbWð;y¿ÿw*¥aŸ éÞLsAZ) XøÔ8y÷`æ]èL&$(ž%à b,8g=É6`!¬&‰‡ =r%¡óGÛYà D‘†qQ¤ˆÁ³ F½39wEáßáûŠHbÏ+ŒLùo€Œ unnÜÑ Tõ8j¥áÒ0b4Ó@øóI#,æ²AÈJ½³õÅv„'šolßU?\S*û1 (`sNWÈÀ$ /_î&Ä[˜Iž¦î,¼Š={áüÕð§¥Ç½×"mþˆ¦¦È®„c¥¢e0M¡\‘ §ÐHðcÔïµ0Ýñõ‘;Ù|¸¬`N½U¨ÇbhÑ%Õu1· 7glQ70H¿­T»:h%Î7ÔD.e4Ñ%¡( ,_i*3oŽ+}ÈR$¶L”D+y—‹êLJ8i£é R=½áõŠ$íÿ›jòRYæÂêäç£à|°¸¬XƒÑýºÊ¢£éG˜%áq´¡]NKQœ•#‚:?~I¶”äîu;9P]òþ‰ªÙ¥n dŒ’‘FƒØý %€ŠÏm ØÑâ„j0ÇC}¸Xù¡poŒ‘²ðu"] ¾Tú´!9£%jPqN(ô§5s¼ ¶y¸!Oú­Q&¯IMõ“ŸÀƒýëWq F »‘dá Ì6!7sIz ؉n=Û´7h]Œ£j x(p %$–äT+&‹M‹10ÔŒ«GçpÿQ6 JªðÖwHî ÎzÔ<­Ùt@Š8‡&wóZ'€K›´wÇ`X„‚̱ôW…º”Åeýò@Öb°ßݵÇêh¡Ò6 Q†éhWµþ=¢ó +‘C@/—ÚA€rké‹‘…o7u»ÝZ êŒÉÁèK @/©*]øY(—J­ÆS᤯Vn¿miþTÈM6¢9‰„Tx+”ŠÉq`ÜmºÓDÁh¨%Vükds¯¯ Y$ƼTùÝó wŸ%ìÿ"² ð]/¼êS[k§Ó ß\̵F®/ë¨Ö´TâÅ»è^ÑL³Çg¿™óÇvvçÀöû³±Ó €WÝY’J,¶óbÇtÆb7fŒ™Ë(Ãæ®(ÿ Ì@ñp£Ä0îÚ:øbæí;ÙÝê˃?ŠjLÚߟ½m£}ÐìŸ4$2ꇈFkíNØÝ}àŠ¬Ó]„Sé.³ÆÈŸsg>ÁCOô0ŽekϼÂ2…àG£ÕÞ”³¾Ê_^ÁH—ô©¨¦t«ÐlÃõ9ÎbÛ½ìã›mmqy‡nåJõ n¥Ü‹—Û^PCqãùüŸŸ—TR`c1šë_•Ðñég’Pß{lÈp¨Õt“Œo_ê ]´ºÑ(Šß+:ÿT†Ÿ¨œØWÏ?Q~Jºzå~€Y³FðhGŒ";óêáºlMâî ?œZ`T2ïöÅÎË=üc<בñMuÞU¾ÄM^Ø‘¾õ‡‚Újªý2Œ;Ë©?¿´ž<ÂÓÖ]Jñ˜Ò ÿ‡èÿѽÐ.Wt$1ÉÈR3°xZUöº0¥Ó´U ;ñ,é)hA2ÂÅý€%fö ú”WZIäið u›8É|Hï˜Â>ë‹°^"k¬ ÓT+FWøƒ¦Á¹+¥jؽù]J­K(Q\ƒÙÜÆa7œÛÒJúËsOá ˜î«×Ä"_-‹{zòÄvÞP{xƒØÂ×”Ò¬ÁÐÿ0C)1ÍZûl”0–>Yw-# ÚWÝé¦Ybf;m\Ïd€ì@×ßZÖ¡ü.UÊ'y$Æ´Ÿc† ®›[Jè”}n°… ÌU˜¾÷‚D züt jfÿ¶°2BìºF­³k¯Æúû?ás‚ã¼Ýnæ"/連æKÁ;.›3´Ë„ åÉžêé+FI&žžt1çj'Jseàà:¸° Üu­h߇îë>CÞLLþ9¥ÄZ-€œºbrtÜ{)·‚û ´CS8(>k½*ñjåZ”¯‚Ý_ž ,›îÐÇFÒ0Š'”¼†½ûrj$ëeî7=Hˆtµ¶÷‚œ—Û]ôÅ*§5}0ÙêO›™ð›Ê“—‹è<3£º8ó´x™/àœé0$3ç"9bX®Ž»ŽS­]Ðî1tè®eGvu#ù[õi4é žT^ïGŒ êq^›î+¨Õ±ÿÖý¡5/îDÒH9ê"Fb¸Ö‰[˜ŽÂ%fܳý›è†àó`_Þœ j¸©ÙM ÎOý‰‰5»ä–ò»Bì£þÜì¢W ǵ©ƒô¿ßï÷û¿Cö¥”\¬€CÁAô±u‘a­h†bkMf„.xS\•[8f™O] ‘JB]¼žM0H "ìOÒ(\ Â=Ð#zqÓEþ}› €@–”©®@¾ñ”õ”†åa>ÔŒ¬¯Pa©ŒWA—Ò2é? ò¤õ¿!þàÿ–i.¡x¢‡J(ç¿Çi¨¥˜>R‰å%ë~Šk×ËAvb_W!°êÂD«d—*‘p#=¥¨Û‘bþ_KHµ–ð…†AiåÅzÇ0Ȫ,!|œÌq±j2àj]NÿŒQ¥Nþo«)á‡ÔؽúF_ÑåW-ö¸»!zãš@©ý† »jº„0 ô2êlW¼™"I<{HkFØ5 K ¥ÌÛØ Çsi9Ù êIfˆÉ…€ØcEYR¹RŠû}H¶¢q^¼g>1d@Ï­‰ˆ|”¦y£—þc±þöïkc2"ò¤”%“%ÐAh“›Nhî·ÓÔ/›ÊçÂbÕ¤t˜Ú¥Á+e©ÊÖUQ5¨š†(|ö;^M«6Í"ã²Lµ"…Á:.9ÝCVhD ˈ÷¨–G ¬É1HÌL™ÅÐqKW<„uH›”¦ùnCÄHÊPhR­¨·£Ü`¤jèb?½Omƒ,6Úd[O˜”2pð2ù%ÓOü"õDõ+–†³ÐØÔGˆè¾¬VŒb4?Ó*ÄJÀcFC÷ Åa-4£°VóFX§”rŸ2騯9Ã{NmüYˆq¦i˜±À×÷{½ÆÄʃlDÒ°ùášë‰Ó¼ãÛEñïz˜‹ÎÖB /óO¿e‰Á†3îËe8]÷#pW ¹aßT›ˆ¨¬Gç˜$’H‚ƒYó)‚›{* ˜n½³€ñ]ºH¶®/òRo´Emãív;}°ä…†ç-í‡$™c¤?É€­-§Û†Û›ì«`FçíÆ×sØ;ç䞪!el]Ôûâ‘E­Ýÿˆbo­åy¯>×òC’ÚöPlÅîA€#À6Ƶg´ŸR¢R³l™OtÝžƒû>kA›džqRŸ¾¡C@ž˜ \´C0œ×ÈKVòi—­wi€’ÏõØäÛ’– :ï(¸ºòˆ4þv1®ÉH…ð RàïžÔŸ{ðW}"¦^&ä CܦÉ]²„ðñxÄ  ¢Y°äÙ¡ÖGÐZJu7 Yå çÒúLKDöwF%‘èšV,iâ¿§»—uz,­h=˜{q׿?~\HÜÚò¨“÷B U ´j= "ŸiÉs:¥’”MŸ|…Uy±.V#óþ»ßyJŸ©-D~ªŠŽ”¾í• tå{MÉÙ¿‰ªØaß°9f{zÑt›¶¹¯n±Æµf¡Ž)Ä,z•» ‘¢ 4üTÛÂwSB ˪Ge1,[Æ'1¥‚(Vyº>úaXÂÀ\Ïìâ\ ·½ƒÈ4™)šM©ÚW(Û!4wÈ‘µHšSª4ÚO$ô‡A<Ïp`3R‡J­ÆaÞ‹>ÁZk’±ëSXF'ÓÁ ôºå“¢¾@G.¤hà ƒØ>ö‰è #íc 6phr8^˜¢ (%ŒÆ©êQ bW/< ׈Rôj0P±G¥U#³ª‚^L®tº\Šý{a>PcYÌMà†‰á˜F*4œc „”¹Po/o…ÇæMÆABÓbR¬ ÑÕü›ò^1ÃëU?#…ëîÄùÒÇ»pÅâ(‹GÎ(›u"6ÕFTø¬’Î¼Š™G(ƒ&ÄçU®Œò\uuú~‰‡&Y8ˆw›·ðŠP Ñê·u݆`´¹ðXaPE ŠQ›c0„ˆZ}QnèÇÊ Ða³ ¹Hu¤Gø‘†þÐäý¤Ãï)2‹ÜºÕTÔ{¡ ¡ÈAt6€ð£ÉVÊuu€ÅDËB?)¯F_ ·dí²¤ g9$kßOM]kšøßR§aê¡_ѾVzEë;=NbôØb4•+ Àª"HÒP«Å±ÆÂÈ£™)#G>tÜ…&Tt½P$˜P¦rÁ‚MxˆdBP%‹V@ò`jwJ3ÞûŠ[;·5‹\ÕŸ´yùêE»¨ŒU“ þ¬ ÅÕÎ0ÓƒÔÃãŒDä#N¢ü{+šsWo¸5ÇË¢¸»6â!° ‚…jvЄMÂt·¤à"ω,Oà@³Cêqþ]S!z¿ÁÂÛí&ÄUúêj8š%ѧv"<¶úÜÄîú’¹Õƒëj¶(”ÜI´;ξ+êy‹8Húä$–G)Å(Ôoäyi”ðÛ!Ûÿå.’r4qÙŶ Pþ‚ÒÃ5HÏ5!®éùuc‘j@'¼i¿õØ]é´:Ê,Õ¡ƒÙÔÅ!ÉZ RDÿ)Å@†ýÅv2§Žð—è¼ÐÊ£ËËŠ‰k=}æ™JqÛù21•4&=a è_!]õ*ŽÊ|RTRN…Gê™Ç°ûQàÅÏÛ q¥å™µôb®j 3.…ŒšØY4Ó“åù-9øôàïl éÔЃÏå|=¢q0þ!ï÷wÞï÷†ÆZÄ”Y.Å©TЄ=ŵ՗¢õa_Ò„êíYTΊ3F¦»—ÓYaÀâ©~¹Ù­+iMîyDÒp%ž¼D\÷ôÉgô½ï"øÂŒiÉãE83›’žåá&k[bëR/+ùÕ´,R‚§?î,èäܞ˄Íë`^}Á7©˜LrbÀÙŽ0 ã§a<=ĘŒIi!âŒ0Þ=ˆ\f ¥È’À V’Å  3úº[ñÎ zš1ÆU£ù‹±šJø2kB‰<û‘KÜKZÒß #XZýÌñ‘§œ CÙdÐp\>EL¸Ü©Ì5hf¥Ÿ!€ÉL${ÂÄ”ÞÂ(’{¦VÌà›»JÃ)Ê“°ïZeŽÄx¾2öEô”¼B=Æ)ØXYNÈ_|›Ð©½Ó€çifa³i<jÔæY¯„>€ÖæF?ABßÒT[3gBÕš¢‘é4 ¨…=ÈÔ½:‹¾´K` ˜Lç ¼Ãª¨Ñð2˜L^:m•œÝf±·!a»` ¼­NH¿ä8¯\ˆdÜïµÔë`EœÍ^v|:òú­3óÔ¹ˆn˜&NêÑûjð@ºÚe €_-:  ˆ¹4ˆ†-/3þ^E fIŒq«õóf*õ ktÝÙD¶ŽÀâ«H±D.õy½EW­”ÿ¡H/qîj#ðG…éæ[ï;A¹‹$EƒÁýN–ªüsï ²elEGÎ<,^È ÇRæ8v>è†bž°ë‚cƒUz`ëë Ö9B¹Ô^`q¥¾Ö {š ‰|üS?á÷¹<þ½þ^?ôeˆAïŽÄ¸ j¾ÀÖá“­',{‡—‘µ¿ˆ­%[¯>m¹?ÍKâ’S"%€ðy²¬ þŽÿßR‘G”þ2×ë/<¿_Æcé„玲yïü5ZCo•;¾Å£Æ¢Ë5ŸŸðÐhå¥áÎeëvö£ZC¯½/o3X¾L6&pOæqT{“T©«oÚ·y^Ñ|!Sÿ~Ñùk“%åó RÖǶ’ÊJŒ¥´›PhÀ5jŠ^C/€!?nÖõìI’üØâ}(Íj$It|k³„‘–EÅÏ©Dk:£7kéRíýB ¨v³K²pUVI€@—áß(ôa û½1k.‰Ö8Îv]6‡áÚô‡¨êͅã’a(õäaÑT zVÛ£½…÷û£ù_±Þä[Üë§ô@´/…¼”~#u=Öv’ëä÷P¤°Pf ç'P<רdØÄæhúFª;H¬K[&Àénô©qœDIµ-Ã“Ž—ˆÑƒ2=m»¬šCÇbÖMµNÅL¶câ"ârsêð$»²‘=…Š9­BVÂF”s—° UõÆSww¶µjMâ&(„1¸=Š.æUÜsg9ÌS1ŽÚÖ_d¿g]1ËÇwÉ¢{{M§s<Ã.axWrIð±4XìXÖ†:01Ü#U/EvºéY~¨$L—ª_Xê“g3Ez8¹q–£\l<þÔíºZú͒ס¾]>q¯÷†AÎÞõز\§#ÉbD>á#ãÙ(öM¢³!•±Ò¨‡ýI€;òs5›'£aïÒg¾z¬Pñx|ˆ ’C­¤†õ-!ÈÆéA÷“ñãˆoCq× =!D³Uy!}Š[ã—ñÊž±Ig·t%aõE*W¬öS2•íöágRØ2í£Ë±4­–FmG aT5‚}’Zñ¤ƒÒºWVå­¢ÈBw"½a‚HÑ \—Λ3Yn7…mD:Σl$z¡˜LÞwÇ^6·¢–:~vÕC.à€áÌdÓ¶sçÒÕÊš6‡,vúÖo9{'råO#©ÎBG8‹IË¿h·¤B‚e0wgØ ÝG‚oDZ‘•J‹²6烚¨Ä&P#° ”«ÙÁ_kG[žYÖ‰dïb¥X%€¸°+B]F²q €0OÒ+À"Ê Y.?XtþŠ¢L ÔˆB jë =÷”aµ©)É,QŸhˆ”©Æ÷éXR2„5„9jE7Û–F)ÀK$€»Ç68×ÏKÄcçÚT_ªL{ìÍhA¨’iäÉ^{0Àq[ž7àŒ°>°d’ØÃsy\êý~çÿî÷û¿^èŠG,VëŸ%€ u«[Of_3ÉŒa¤¯¶ËÂ57è\¾õA¢±f(È…7aóµâ†FòÌÈHoȲ‰Uô&Ž€%€5Pä׊è]ˆ‘²Äê ÀÒ.:T8Xsº¥€áÃ-æ;fXbò»‰êÎÄŒcº…g¶ØUkÄŸ¹rxÃ݇‚t¹Œ×Бk8!æšœ.㈠…ìhYm(švŒ‚)îŠà ÇI $WÑ™Üþh~Ç|O†S¶È1NgšØ5 ©JEI`­[ A(OöZ ä£è±×Ä`´‹?S Y2&¤@û|&ª¤z²ÎžN¨iL¹{ÆZæ2Ê@5vp’ gžÏŠs"1[ÎÜ!°ÈòWê¯ÏKÖ¯0O1 û¤¥ö=ŒàxñÐÔÓ‚Îo—Aý”}3ˆ»Zhù¤F’k˾9ŵ"Ò¡.y1F%Rêïlj‰Â`p!æ[â9C Äù%¬·1c›Úæpð ÿµ”úÁĸgŠ0ºWí=Q:…¬¸_^H{v«¶B¬òox%ër}1Üûùä:\buvi9r7@›`§»uà !ÚdáIæie¯m 06®š’ž/sá&a|Ij´T+f £“çKÒv[_Ù›œýYj¿Qt¾ ¥hƒ?DûzÍ&à}¶âǼnWZþž«ŒÌݪ”ŸÂ# jÝ4&^wL\5éi–÷µÁÑRõÙ¿ˆS©)ªK%-rt¦ó~çý~ ÿ²‘i/sÚãÌÓÀîàÍIYü©¸äÑNv»áv»Ýn»Úècñ¢ †'^om^¢ámßô÷ú{ý½ÞsŠÿ^¯_þâŸ+»ÝÔ?_Ê`ýY¬¯éHðíÍ þû·ßaÛP nfCÞþéßë;‡%¯¿×ßë¥^oR©¤âÈ’oÊʯngáCRUP•õ‰×Y[7ˆŠÑ½ñÎû€œ¡d a¿@±ñŠÇ(Ù¢@õ4ù]C¦%Et¼¶¾ØÆ¢ë4yÜZ‡¬'’‚ÒÐÿ>T›Z2ãÜ^U‰ESê>)¦¸‘GïÆÇÈßûÿîä]Ë¿´fùãîþ «’càƒMú¸õ–7huÄÕùª%U@9±\ÞKל ؈Ђ?j¥`ÚO“¹Zaí¡Í–ƒ“½G‘…K wÓPòÞqhŽ™ì*Í:¾Ýø”ð8@k÷ÀÌïúìÄx”qã⬈³t©îÙsÂgLg î#Ê÷‰ MÚÙy™ŽPfqÚ\ÛO\ÐF!‰ƒ\T‚4\Q+€sÉ2ù¨<é[€@D›4}>|{Ô`Ó Ñg2×)­—ú¥ª7!‹GY½Ns–z€œ:î²ç¡ERËö‚}*W ûænxu”€% Ë«s'öé£íÇb»°1 õî±x»º­Ì²Ô¡##H”ùÎO õ¿U÷ÐÄ,_—Ó8ÞžÌÎ%“µkT¹»ÞÅ.yé~¾¦µ]º÷K*óˆ÷‡³Å”±Î%Ê´qj²&P¬·‚SóèÒ%…AB—ËnÒBUˆ!ÝÂ('(Ó ^ Ù¾q ¦aH)»$Y¤öª»>²6¹km —Q¿dÞŸˆf×f”B]¬¢(J)J²·›¦J42SÍÔÄÒ‰~!C©ÊÜÎP ïm#ܺd Øå7ôsáüj¢#ôüP_œÃA3œwdaçŽ' ÎBqΫ/~8õdŽ3ñä|Ç,™À5ÝpÞ.I¿½Á=÷±Ö@y+çì&gÄ’‚£ašÿäNOÎëM$ÞÀ”Û]'{*’ › ɘ‰-_Š›ètr†ÊiÉþ¬R(½Hf³2±ä‘—êO у!®*Ë•Áîñì9r§r$åÁßDGFØTF©$õŠiÓ<,°lME¨PÒ—1F°ŒAño²¤£å|Óärü$9˜ A¬S—kÂÅÙ¤tˆ"™–‹Txcœ@Ófò“EçEë&ÊÒV… ¼pòüÜEeù·Cš,ñ”íÿo!t{û‚¯Û™À=[yz‘ŠäTxr‹°„ê7s¤>O:3PŠ™p‰ÁE¿dRû^ÞÿÝùïߣý*ÐIš¬¶Ú™ÆŠ¿AÛþŠDûw~mëXÍ×…íq¯¿×'Á¿×ßëïõ+.yÂMý¿&³(¥ì-¯^“žñrü–?‘ ÏØ2À«sŸùgýg.?¡ð¿/ЦŰã„NOëu=è j?C#o¼¿×ßë=¶T±‘Æ>ú –Uó¿×ßë»ø^y¢¯|â—ž7¾°§vξëCÆà£d xLô`Tf›¦×hh°ÃÓ{5â‚n€×½KbZŸD²Ê:qêÆÙL @ýGcx*WPn}”õdaÁ¶“SuUr#Ô º?Ê<\¢uuØFcSe#ïMùÿï÷.•„^£yNµ… uÑQ¥ŸDÿ¿=I”‚hsMyam!އŒ~ƒVã Ù‰#æ ƒK™È—DÂ?~ûo 2 õQÏs`yŽ}Í /ŸãqG¾ô‰¥">uæ^º†µ|ê—ÉÀQ’GÞ/ÞQÝt°t }Ñc–,>á®æº!y# ™¤°ÌÑ&´¢zß8ô,M¾[‰Œ&8ae;µ)‚ 3þÎõn"éÓSÏÕ‡át_ëÞn€x—†ëyÒs‹†.ˆ9¬<™Ôæã¶à÷U—ß Õ1_:gP9ÞÝÀÁ*å“®‰ÚZþÛ, fqŠ75‡[F±†º3|؈ŠÌoÀ¿-Öoâö~=÷1:È#ýÝYà…ËM2î›wktĞͦ¢8ØÞšVÊxAþ *ü*[ƒˆ&¶)ŠÖÙg"#jÃÜwõ¶ä¬¥MõvЈ’L]‚\z³9!Ø¥ËýCŽj¿>©y4 ﳯܗ‰ÀnZè%Ú—®CºO©gFêŽP—KÂ,…Ý6B+ϬÕÒѦlš²i½z†±Ÿ¶ƒ‘DÞëg¬íŠa×ó›‰ ÖD"'¥¦×ª+—R=’ìÅX UE<§ðY|ñTÚàýjÿÐpq0¨Â#€,§§ÓõâezÚ%;u{è åí”1OuݕɊëc0Ø~‚C…Mß »šb-cðæD$[õÅ—o<÷ ø ¿Ôh¬x4§«T€¦…©\„q;&eÖq¿ß×AyìW-›—%^ !ž8B±œQÓܦ£VÄ\L=†ƒùÈ›ú?\UáóBQ\Sÿ‹Êœ“RÖþ§&‹ÒÆMa°)(.À ÂÉq^fž¸ôq?(&b†øÝM¾…<Éå†J®Ð•’Ø¡:ÃÑ’òpÇFræâ>6ÎëX_騊6èU®1?]¼QÀæz-BÜ·¥™Ò"Æ£¤;ŠËh©=>[M9Žo¶³UÔ.Œ¦.u’ƒ=Ô¤{É☔ÇÈeÞïÿ*úß¶$yÁ% TtI¨ï~¬•‹Ï€þ Fšæ©ÊÔ˜‚\Å"¬”ÿÇî*Fˆ>Ohüdˆ³=©Q)îÛ%Ï êHG²iBZ'*¡`ž&‘H`ÿ"Û?ØcìO•¦}ë“yó=NçëžA˜}r‘ ÜùN „ÝÌ[fØÔŠa`ŽC7!Þ 'È9Ú xN±sÀfÛ"‚bQ‚4Xø«\ ÂÝ®äMË| Cèl5ìV¼M7ä#0Ç"y HÍgáF%–ÎÙí5`PÁHB'¥ØíCY!ƒP0|DÊ3z5i4}]]Ä`ö” k lNu ÙóPJ†5T¾XÞ<Í™qÈKffº üyì‘>BÑ(‰´~½íð»’ÝE†KH]»M¢wnM-è‚â)ü_vÑn€6¸×?€M0Ù¥yès6úgG© aŠ.ô—~›šÊSVÈãÑ.°v¤1!JXâ ZãVYÈž(¶h§KµÞC-ž…ð‹.•°´8` Ž0üÙåºÅ[–+ùÒë¥ÈÜiàñ£³_g’M¹úD®ï×l®.B,]•‘¼æ½×r úÇ…4Û%@Ÿ"Á­&nSkŸJSiEùEhImiyœØÈã‹j‡¬KDü$à ÙNB’šÑ²Ç…(¹&¡ÞTÐÄê”Ê9à£-ì¢SÛꂨRd­0û0ê)ÁКÙ>13¿O'æ4ÑgÏüÉD-QÝWø(#`UúÝÒM#Ï…Džb<èC©«°¹Û8FÂbCáqÃŽ¦†å•GО2(¤#chm|U#BT¤D¨ ¤m‹z+ÑíÖ²u“†t,s´…; ¡ÖU¶×\aîã´H1ðø·ùlsS’)Çè*]Ø^Œ‚S<úâÒ&‘nÄ#gVÄ\€ý‡¹0З‡PJ5yQÐRÁyš ‚OVù©¢óFs>N2õPâqrn¸Õ¥½ì©‚×É’‰uÀ€ðÔ1ÿ¸ê’·ÌIÞPµ®Ã…‘@Nt—×Õ2܃õ;eü×,{s \GÞyÿwÿ÷¼£ÜÊ Úçr:éÏ)Ör¾`e•à»<w}ÅôN6){ølòéHOÐY>Ùö÷ú¯§·_ ñ¢ý±Oð»ÜáºÂÉ‘×~³…“b˜c=ýÓë?›>òK6¿íº.Q(z9+lGÞg“Ý«K^¯? ^)WHJ_qIå-°&£t= éZá]O§o¡…<µ‹ÊãTØÏr™§ÐÝ,&Þ²Jr­Ãظs<¹j å¨Ï²Ê¾}Yvó³â7žz¾`Eà¿2ï‚aJôÙ*ÚWæò5¤_¸z/d3|ÿ•ùa¢ó/²¥þep÷1±«þƒ•Gg+~,D¹µ©¶²[ zîh“Ý'uKçý^ü¶ûÿ³÷§Í’$Ë•¨ÇÜãfV½tË EfDÈô†…Ò2ÍoóûçÃÈg¸Ì xv“h {ØÀ«Ê¼7ÂÝÎ|pw3U35s÷¸qs« Ô+då½ánn‹êQ=çзV”¤S"^Ú®t °V„RÓî±vG£ ¥˜J û\•N ÐT¨«¥7ë&”rÕ9ñËÊÂá2±Ù×b66×E”š¦·ÕÚ¢Ú¾âJê!¦7j‰¤Z¹³è‚' “%ä_ªcÐr³¡+GSº¦®rövª>ZrM²/š.‰V´>y•xÀ¡À½lÞ9£aÌn,Wg黈Žãõ—½ÇÝßÕ€sžHw§ª>t/¸A÷.·Yqø8®{Åé0vq´O’iTíiM ªz<|¦tð5ý5h|HOdé>ãÖIÑ-•Ço¤£7m‚·÷i•Õþ„뙿eó]UpZ<ÎË@³€&ûepJÕ‹cÓ ž‰×MΣç^Ï—×pbþáŽõ8Óì¥;ìr¸Õ²xÕåí>›¸òØc}\ê³tIÃ5>ÃkRˆê"LnWúÔ XE¬ü)Üå!ñeŒŠNÒ¸ŒµÊï;{·¹c@Eç7ºà^Ýk¦t¯í¦>0°Ij€õì'ÿÉH±nm4^¸sDþ3’"ÊçFk\»r>Ü2Ÿ*ÉäÐŽ•F†Q0é‹_ñ+™7ÊZÅhçZ'6¢b\Ï,üvÀdÐg?ë鈊|¶ü匞8Sw|o-wÊïÞO{¼­g½¥_p‰Þ5åÞÅþ±ÊÊX¡Êô<õ¡3ç8Ðjˆ³>ÜÁф燄°ªbÉçªÝï'-Îhá”Åzžß–è¼BMáÚµ2lØêè˜ïšŠÓþãgµRƒÐ7Õ*ÌrCÞ6íñxNÚ‘¨†ã&n¢ª¦ˆxÍbRÅŠÛ} %¤g©Û±B×ýð›*lƒhë «øL}ãôä#ÔY  ‘¹÷ˆ™ /”â/s¢§ *ÌÔѵò•ä_¹²Ý‚¹RØ=.I³—Þš’´c˜Ô¢v²¹,_Ô4S„(‰Gš²Ò}SIˆåœe­—[Òõ³¤…âÏk2©·ƒlÂj›ö†¥g:ªkÛň•*Gé=aø åFƒ}eÞ³sŸv@²8Â[ô28ÉŽ1Åk?ŸKjÄ/XÄåe"¢.¥¦îÉó6Í‘T'j_tÔOQ ¶ø‘•ÜŸwÄT¢ÞÓVUB-kÂâjQì ]¬·˜½jÍòG»¶wÑuäJCÍ^¯’>'‰ƒ‘[ƒØ²JÂ,j!ç xfòh.MªD±Þ-x¿ºœÐ>+Ó1ç@ÙàIu(6P·Zá·ÓN»‰X¤o,è¢RîJÇ«‰5wÔÒHq[è0»/¼`Ûµ©½IÎH:‘[xÇNbÑŒXУ?yè7Jy%2ûIºCõu!û©@1¥¶¹ÉbN‡Hðu­²rH½ËWŸ©ÅÂý@ù@i;)ªDØH®woÁô€`Gzž›xˆî„@êõÐO¸¼}åx“ö1ª§¯…ržb9qÀúµm ËYT1|q‚ºg m7í‡2b‚$r»F;8…êÁ(ºÕVÍÙ ¥Æ¼,£V6³,÷HCÐæC#3,]4¡þ:-– ý¸šE£¾,†{¶;&ó`µFßJ¹‚‚/J-gÍ%RH½h´–(EúŠÃ«ˆj´ ¦þ]Üv FŠ”p‘ØÚ– ¨M† Ú$¯ö’E rKUHaž¤V„ê)n}wr™¡ò?Ù²ëæO?3øºß̧:™¨IK—‡¯_’¯Úþœ <[ç)}^í±·ž®&ǧ×Ë×yˆpoB @X´­F֋IJP’£‘†I‰‡¤—k ûتù:[Íb¡ç²{è˜êí"šÈ¶Â5Pu²Û:2h÷µÃCw#vÑñÔô³«•:–)°i…QïWRnžy×Õî)•yuP¶¦ÎÉšQn¼ºŠ°LEOÏÑKZ÷ḒxX„ÑïÍÝ„U.™[JG’Í`ÓœPõç{¢ó>øQmbØ*‘ýZ {¤« UþËzª2€ÜÝòáâ?¶©ÏX-Øïoy€Iy]e]ŠÒÁá[ccí“°Éúèðà{zº=mu@ÒÅaý½¤6_£ÛÿE©`\XŸÁöæúCÐ×_* kwÍš±UU˜ö⟦”Oν#­’”½!qªëï8SÖ{غ¿çëȯHZGíøÖ×q ²<;ð¸o租”ÇÉP¶¡¯Ï:ûØ(â<~ö<–àÅâxåôO òg#ÈpïÔ ’â”÷ˆ½íMžP™¿' gç=¿8ßðæûl‹@f®´·Qàуyð‘:¹[àaWSÙ·ÞÅK†ÌtafúЙkUûÿ§=¨m)ý¼ágÔA);’xßÌq °»Ê]¬çw¡½÷¢Î²wîâµV[ŸpöÌn•èsïÿòZ(ܦLªAos¾sö÷e›#mìݾ_äӦá›.y¾%`‹s>  U¾/²cýã•ò?^Á8ú´aš&КEŸ=Êh ¥ŽJÏñ·ÃÚ­‹÷ÈÌÆ{n>q¶þ¨¯c uᮕùwÖ= €oOtþÎp«Ìì\<¨,BëÃ÷1ùæ7÷ý>ƒ–Ts±Ó¶²F½>ƒÂLÈoµnÁK©[ÂÏV$õ¦æÆ:S®Yþ…ÍŽ‘F¸WGÛP:4-Àÿ‹ú;«AÙéÙßVT{)cäÌûß$¤R9ù³N–{¯nÉQ·MfQ¨ éz6rãœÃ†ÿ€µ‚9œepÕ`êkf±lÄœžEÔÓОfóÉKúšI{PÐ+·7>Ê8š_iÇeù2U‹” ™á­h½/ž†þ¿¨z^NxÈ'½õ•~ÞkõN~Ù/Šßw Š9œYu¶»d縆"þØÑœPÍ<­'å‰Zq°føã×6Ó•Gì·xÈ[¶ pþŠã+è¢4xí’æ¹6ý—¯$²D O/] “åPþê3€O ý/6D­²ÄS€Â‰5㬛ßò‘a÷T8r56ã3åX¯ðÊÃ8ëu/5û–àPwÊÉS…rH~K²g €æ[H¸Ù‰!Þð:ïÜó!éÎyuböé|wÎ+‘~£~V¯Ž÷*J®=7Á‘âÓ›ÜU¿cÞfm’Je¤{Ót“P—Æñå®Q!¶èN¾B˜Ÿd,8ƒiŽgëìåTo#(Ä9úì-ºLB:$yQõfñ,ÅeÁv")ù­Ê7þ‹ÕýKßJMÛÖØu¥³Žò8UÈüÆ¥->8ð„f2aŒdòþš†±ÐäWR$!Á@§+M8ÓÐa‰½EÎÍQäÇéÈH°B(=­_]ŠÑë$ó³µ ºIGr¡(2¤Õa£T3ªÍ©…ã·ŽŠÌ\^sÁRëäв]ë4S+å!QPܶ‰Œ¥NÖLýÅȰUp°Œiër“ÀQaZÉ‘·(K¸,u¼ßNí6gm† S”‰BUÄŠOU®ŠBO&×ÓN_ ¥žT¢‹MîÙÿ‚…Á^Fè— )YöÙ,@}ÒAQžË‹`û¤Rj¶kL\Úé&¤l†ÐnB‡Ÿ6—GŽâlSáEÉUPðPDH´ãÀRÈÞvVË• ”ZF\/8Ÿ!Î~&ýèÄÙlܽ%—«g'Ð’…Õ‚#µ‡Êp(©+tå; Ø«;:Ó®>Éý¦T¦š|A1bÛ +™€0>™™[l,‰¨Š|>ZɼS°åPoSRÜCcæn[u°’?˜wªb¢aë^.„Î2 Îû¢%ÒÖŠˆþ4RbØrc»Þ¶€dC¢AŸ+“”߬ [¬—…(ÔSÛ"•8+Õúü/ÔEtMX/6έZ…b "²´‡›è³U!´ÉA-ÓÄ*×Ò&\Ì1|1*,‚4ÈÛ©Øh#Ê÷«eW1¤“âú E‚”J]¨ãqgÌF~2~:˜ ¾)‘B–ƒ‡° V˸s&1dr'‘o„)#—±j·»¹®õAc ¼ÊûÛ[ªH®^«4ô´Í£0¿‘fAR8rÀ¹ïBú• €ƒðâù¶å4f $_7måŒ#`€°“¿ÙÂDðz *¡ì2XÈw0e'Ÿ3EÆÕ €"Áßh:‰íÔÒC0¨:Û›J?ÒË’BhBKðMR$2ÆyŽs$ã¹™‹V% š^ G*¦HØÝ` j¢ñ~·37÷ñ´”n°± RG8¥Uwtÿ›¨-RÏ„9¿‡×J¼ñžzÇ6F–jSô×ÅãŽnœ½-ÿ]ˆöîj†’_Ìpü1áÀ'â“ñÙYrªý!ßä¸ }5¯ þß•â˺sÖ¯V6ú‰ûþOw&&³ºïνTA„ô®»'±*|ºÞ |Í‘-ÞÃûäLúÿÐÔ˜o•+æh»%€Ïú\qwà+Ô»úúŽžO·É¤ôðÓ(5íMÈÕyô€üçcÃ8ÈN9¡•óù/‡˜Ò>½À½7öˆgxö°ÓÊüRÆ•%÷©f"8¶?ütËó¡2†ܽm<öÑ<Ôöåþ!À^@ßÝ+áÌüܯ/Ì-°JùŽë 9éåsÃ÷×·tιéAµLz¾nU#)m•E$ ÍƒšÃy…CǺ\ÎÔÊ m…¢û@î\QB8Ó¼Ö]u0ú,… ´êˆXã_Ú.M2ÏP?Jú"5¹l%Ó%§Je{ 6YÖô½R/d“¥É½ñ[_z®P”°¸y¶qY]tÂM©%õeóOH¡H™\´æ#…‚°ÙlÕ’¬„d‘jÈ3—æ‹ÑúvEACâ榩[”b7TªèI)hž¨ àK¿ÏV‰•‘êQ®r”D3÷Ì€²Š›a`-l¡¾ÓÙó{¹ÚºÐÍâ¬ä–ô_4 ŠÔåØJ¢'µ%øËæõCõ9*}¹*A}Óèx9‹¥GWÜ‚ ›¸£Û[ÅVì kìl©µYþ§œÞÙÍe£K§fm=ù n3%¾õ¬aÆõ©Np“Ñf‹>~C¥ƒ |QÒ×íž›ª©ä'@'æ ¢Y~Ý5Wi¹ïذÒqû0’VŠ_‚WõÛd+Ž4|ˆ9Íûß‘xP Tf^ìÂcÔÊkÜT{¶ˆC!KŦ‰D\ Ju6ò.æg¦¥Ð-ªæ%B„0P ¾È­ÉÑÈj{°N]œ§£¢¢´¯’Å.œ‰êZ¨,!p”㼬õ¶.Pù¼Z½––òËêÊŠ²¥ÑœdÙûˆLŽþ×#P}±]58 ŸjêsVåÀnñ›‹ÃÑ`3î]gèßk‡b r±Ïk°ø›¨>¡•­„XÛÌ–4Q Ý•ÞäEç7-0*që²¾L¶mí}{`žzpð…ô_‰W(³µ6)èmÀd©¬¹;] ±JÿÇN*s )%3(i_½wi bAle^œTð¨åÒÎÚamÂH ™—òGçû|œy’…¨Lþ骠ÔþœZǦƀúye©Õßòsi©îçp¥ºVÀ îh©nŽE¯8(SHU 4eQïJºçø[ßš+ìÖaèwµ¨iòÐi–„^º.>Ø2%ߦå&Õ¼}à :ÖêáêOßš´nãŠ*Ý+%ÖWÖÝíÛ-–|àŽÊ–w0qš8©„W7Í-–ÅÆƒ¶ºÝwÑy{ºoËAiÌ®(/é\¡AºœÓ«î‰8rœÊô•ZX¼³çË.yÚÝäÎxµ0 Ò!ß¶½x<ýè¸Æ÷¯sð+CUø Eiâ`z% k²[ò­÷Z‡í'º!EÝ}°NWà“M¤ªĈJ<ð&$vÌpjŸB;îd<ê(×{]êâIÒ©úAYÿ{T€Z@š^1,A Ak uÜÔå]Þ¾[Ñye㼫Ñßÿd*£'v?s/q> ~ú_õÎÙ°1½ÝkFó*hã×sxÁ~€ñ­‰Î“‡f YyCŒk‡°uh›ÆµïtýuzH1 û—ÿ«|Ø ·v¸ÑhAîX!L¹§»‰‰iƧjä¶:/lïOtþˆCf!;»en K:’$½Ü€rxÀ¡ÂÂ9˜JÈU7Ñž½ÀU%µTÒÃnkw•ðõ7w"È]ë¡ñkÛ¦¾oÙß_ß__øÕ€Ç#3T„SøV¹{G Ÿ1©{øíã#÷0â—uX|?¿¿~S­Óñv·ï"¯<¾¿¿¾Ìçb}¡ßú¬ï"¦Ð‚ ûçþ—åõ›Ð[oùŽQ~½Oüûë7¼õj•nkZ°î¶©þÔ¹bó#Fó×T.³õï§.+ø?“Ò„w%<)ò…VgXß*K"ôA·£Dn†i”/ÛìÓ¦H*Å›²kD*;%¥¸•T®€QÎYXÎÅ$bðÊDU±d–š ŒP±JÔÉÜziu‹BÎŒ#ËI~ð[4—Cž›P°ré&ó¬NJ80è?ÂzÝ‘(¹ÁtûT½‡…¢ÿ¶ˆ $ÍX£ð/¿­HíŠj‘š¦r[ÒjˆV7WKJAº:ÑrJN·§ùìæ°+/+íK¤TcJ߸# • ’–’SŠ[0‚ÄŽ•·Ý¬Kà°¶¯¥º€çý®:¨QÕqÉ,§£éñNœ’U»ú²re )KÍÍþ´ucÔÙP7¦Y\qÈÕv«±fÇŽáx}¶~Øe{VŽwÅE©Ò¬f”³rÝ>¬ ÝðÅÔŸn/F/AÕTdì.R ÖU‡!ÆNJkt±ÊÕ—yíùó[s¯%)HiŽOƒÖSÊk9¶Æâ\þ"÷NKy&†”–µ9ñ)bÙÊ‘Ö6PîÈÝ9&È«=°‹0~k¯»*¯S´å7q*ð¾É]š«^OÓ͈•J€õ£TÏQ;ï(;D˜ó¤`LëMZË´ÌÊÉ@ YÑAÖN}ØÔË´8:Ìñ@­Jc¥´TW=õLÎeòþÝ>)oIŽ„}õ°´`ZžlµTµÚÌ%°2m÷4I*™'ä‹Û¤€F’åOèõÛÖú-.µ¼%B"+ù¾ôÕ|JCG‚ÓÊÝÝæ¤{®¹·æ®i64pRL½–€0pëŠòî«nKd¡¨GoG9é\l¨h\R¯PUY‘ÄÂŒ4™R×ÙSŒ©£M4©•—ó X€7ð¯. ÅF:‚Òî#E š¢g'˶JHK,°¤8X…¶t`lT4´8§6Mê5)sϱoÍÜ% ¥¤¼Áè Bªá¬Yþ¶}•[6ÊB:(ôþŠ®©^³[–uî­â{8Ó©7+¢&ÎS[Ú›¹ó «{ÔÎ;šw-ÜÛ ¨T†f÷ÿ%ÿ*È *Š(Cv³AaÑò%ª¡(¨Z¨~³­õÑÒ´p?Õ«#ÂÊÍ@{!(T«I[¦< ðÜ$èdžÍL­Ñ‰¿*5.YÛžáì.Ìm=± 8“lNqpP*I÷B#«ø©§ü‰·)DAÏÖ³Zëñ':_&}sÑ`mP\ýªÀ¬t°ÒæÇ<êïoP<ñ·ýKrÌ ò±®ô ì`#I•˜óØÓ"}'Ø%9Ãè0«ÉtM‰ʳ¬Î Jm‚r"“©Áކ•“`4 l˜ÚiGï¿ØßŠ o¤Euj÷95¹°âtocHR–2‹¿cÿH+7™íQ` bá¨ñtÞÔp=L,d‘²7^/@0ï*–! ZGÈÔÅ^x…õzg0+²vWþ®Ö©q‡âˆ”gdú7nÅÉqj ¹hãïô·~ùFÚ GÔ_[¨ëΩ{Zʯl½CÝê#ÞÕJšn©Ýö)4 B˜m¥µÕÃm aa¶]ï?wñš'| go=î:ÜŸÊU‰™L i´ŠmÓ•ôéÀèæY¶çÊh¿L!ÜMŒ.‚ÑÙO5«ÈÊy²†eª=WÁž?ùlÈ~åâÛXt€HVsÍuO9ÝÜâ§g}Y°SI»ã¼>g6á~Ìöú“Ì÷YÁÉʽ{²Û˜á³‘ ~™¢ó9n…Éx”X2´P·_á—ö³Ká,¬WÅEÍl€%$zt«hÁpd ªÓøeóþ‹µÀò£i^ïc¤ýí“1ŠHd\ÔH6žZ‘T§Ã!j«¦f‹¿tŸXeß>á‹U÷î–¤—|}}}}}éGÀ÷×ëñû0~}ýr^KûÞW£fB “Âw âû둯/\%ƨ=‡¿¿¾¿¾¿¾¿Þn7”Ô%Ë~ä’l¤&#¹ûVnÒñ*Ç>|W‚¶Å¦à0•lÝ*ðAÞÑhVäf–M­@@‡•Vy°äÔÝûYãÃàèQ´_®iûMJ¿™üµ¹\SMÖfJtšëuq]I`@²=t¡¡ÇÙ³M¸•0PT©±Zº±­Æ%êFB;¦Z·Ç˜'®¿Qaÿ›xNÕ°k/‹Š„š?ÚèV©Þ²ÔÓ”%dt5Úvýëž4U·0mo†W”¨+öÛ#)'UÑÙ±ú:°†ÉÊ@¬evV¶}b(gPª1îvȤO9®šúZQcÜñ«(ÿÜs\Nm¦ŽÕ"±#¡qd_ª¾±Ø0½Ý”uñ£ùMZHlc"ѧàíû”ÿ ÷¶àÎæýž¨±4LÝ ÷bg.ÜC©œØ‡ú9ª(O¤r J¿B?P*ÂéÍ­Ô±Žd:¬`îÁžªE{‡Ë™ÃªO‘$+–³š›%6kRÔ#¥Ú†)::C£Ã÷ìÖ°û5¾àPc¯‡õ襸f⟓ZŸ•áªçÑÚßãØ8`¯‘Bø%O]Ý¥ÛÃCFôüœ’üÐYÞþ’2ÍOÀ‘«uBòûçØ¬Ù]Ê/Dt^*bu©ã‚Z“CR¥u?òM Q©3Ú‹{¼é<Ûê•\°z»3dž¸ʾ{íêp×¶íõ¤ ÐŒéMÊ3AÄ­›"V4¿KÆ<ƒ¹ƒaÁ]FÔdƒ]²ýMŠÍÿŽð3ß!²D¿÷igÕ÷®:k*÷U_\qïÕY —0¥¦´H± 4k´Œ‘1 ó™¾ "› Y…] e.(WúR§œ”€$Ç[èvl¬ø—'}_Ô›e¹g¢ÔQË_³œ ×­Å8OU >« ¬×¡u‹ô¦ö©­ô"ɘuQá¡xÀºº6f¡ˆÿkHfvA# µªØOœ·*ƒnµ´TjÍO”$û¼t’ iAZâL¥NÍÆŒ-ÑüÓ:Ûd¸áîÏʲÂ,H4«Ùƒ„”jeðX DÓÞ ‘ú¬Š=¨妃]¸äx”ˆú‰ºe‘Ò-ÄÑ»•ª[ÁlT ŠpÆü¾ñ©pߨnƒÅJ;RiÀÞÂmqÖ|†°B q÷Îâå·¢U‹ó£©cnGªÊg_»ÅÀ)•d¹sÄ1Â.Câ"©wèíðȲï`—èÝ©HYLÝn›¬æ¡EV Ò' ôö »ód]Âbå±®&i…3g›Eå€ã0©ôrµ¡[ŠHÿó–…ÛrZHBª` T¢Ð¥¾“Ùr!Ãj‚ ¯,Îå1U¤£…`Z'«3Áß®ä|øBWÑѰ®rD3âpƒ³{¥\5µ©%ÍC¥dm’Ñ+¥`è67½¾­ R@¨ëï-h û%Û)Vwª„ò ƒuº†¥ñM‚öð¨ð…lÔ²V=òZ§%ܳÀT'§‡~ï ›¸zèe»žœv(ÕÆ›’Q8çEò,dôÌ=ðÜž×0Jÿ¡¥?uÔëªùñE½JéòÓÊa£^ª•$ZýdyHoøÊ°ýwÀ÷R¹ˆÙâ"÷‚PIÔšÀ'¥Ò”¾õL;sV®sÆ©b€MáØÚ‹Ì;xqµ«Ã¬ôº]Xû,™)×_ð3 Joÿß·¢ìAíïÄ¢®ßÁBš[}ç{«‹ÊÕ‹íå Ù²þ}t@•cóÇ9¾ZÑyR±Õ­¨¯Ú¥¦ºrTÖU[¬…ˆ ìg¾êVSA“{ ò§/°ûñãþ“'ïÚU€p¿ƒ.(á\\Ùç–Õåè!ºÂDà¥Îùý»§/&tX¤ˆ~8T]¦†I‘ú'#s€éj¿÷;Ù’Wn¡zL-ZK÷íßé~ñäïák}…âÁƒþ—2û¾+`|} ôÛQ6È €GE{Ÿæõ][â†_ÙÓIÉá1PúÒ/DŒB׿ñ-‰I~r¿ÄÈéMã“~¾˜*dqü–¬ÎGkÙÙKGtþ³Ì­/mÂ÷Í BzJ}Q2; ý/<®¿ˆ®ËŸæz¾o Åɳ×ÿýõÕEÒwœÊFvd'N¯ªÑ›W<ºÌñ¹F‰òj{„€öE6b¸Ñü¬`““² ú§6*Ö ÒÇAÕòúhqþ¤>Aª¾^ý]ŠS«ê©Qu‚± Í$Ì­±ª«aõÔ” ç¤1«¤•rXzž7ùÒqÚµÁT=ÇÍ$½#›©z$cŒ13YDHøøuyŽöƒji\¹šæZ´éNï J­ôï².FèigAåR…®’øýý|]‚„à VâÛr-P.f#'·¶ãbþ•HƒP×ÅJý¨r>lº¯ ˜¹3 Êö•´±[;LG£‰Ç¿äL˜&dó!U×}ˆ¢w ¯ß ôÑLœ¨aèb›d×ú¼'Ðõ§ö¾¯ñ 5ypÅo`®–‹©‰¶ñòüœ§kßןyGÖñÃÒRè^ð)¸qÈ-o¶d\u%ú…n®ï<ÜÔÜi6¥Mi=ªK½´[ y¤SdëéÔéõ¦%Øy€¾c £X”.«»$¼8Û¹Áoœ£8´¢hÿ§DxzÀé ;Ôåº(Á±e*‚®Judí¦…É#ØpŠ·  òE/mÐURöÅ«æ=÷4ì— ‡aœà¾0GóŸó+&µšîàž–8°XÜîÁžøé\æ  :íëRêP§™½­•maA§šÚ›ÊÄ#}¼.ÿUŠÎ‹°ol ç×iÂ)8(b%(¦‚æ5TëÿÏ×ÄÕ¸ê®9Ýɹ%Šopüà<µ@ Šºqph©åY|N¼’!øM‡·˜Îcÿä1züÙ"ÔžEºâñÔ'< ¸˜ù–…\àwêÂ[ì\"ÒÛ|K“ĬnÍ´Î’ûIëo³. æÐ!Ý› n°ZÝ TE™åoÏo°12ÎdAHiK?•I‚޹Wp'Õ)´ÛBŠ'à¦(PõñÊK«ëHXR‘%娄`(z¤·œFo^j£°6!¥Ò£èÿ,ê5°Ñvn¶’}(°§õFwcÖUk(¡çYyüúþî](ûlƒþ"U›P 0ƒ{F­ØVg|€âò-N1-”G&É­-xúF{c© WœEæ[Pü¯ÀÑ*r^÷Z’Г’^÷ ¬ ®ûµOÈŽ*a/D7Ps’艣±‡SqJÂË6›yNJ€÷IÎTÂzU¨ËQòtî×òç] ‹6ÌÕ©™cwµ‚RDYC*ºêÈÕêIÈGR½”ôÍ&2 #•º,‡Û꺊žšÎ²u{j§úëÖ("w„ÑÂZ¿+­ÑMg—+3n‘è­ž+ݸ*‰A¡„ÀXXaÀÄÜT‘4–YÀ¬ŸÓ Õo)²¡Ý]6YøÌð…¼¢ƒº9"Ðô$û¥Q©Q<ïYɲ’jdïªüÁSû&«³ÖTèÞÎA䇶ÁAw @­UM5 úÀ&öv4J©°ƒÝc‚;g¢ž®EÄW»(j-”šPê Ô=)E¢£Î“YËd€ZÁ„ýt«(xR "“Ô@˜œÄè ê,âÏâx©îí–âø^¼.9,«,*sZFO·²b¿jã\U­œ£; ˜‰D z@]ƒ«•…i­&j%œShù£õ¼@ðNp•ŒÒíÂ67e}ªfƒ©mß0t´˜Š-F¦ é6„• oï[?™B2¶²§Ö[?ÆÍŽ«€}KjQ¿Pkëš0F[î–˜.¯œäð멤IáИŒM1î#°=D·ê”EC}0w,F;­±À=¥ftÄÔˆÕ>V4iäý?AÿÚgbi£LÂ/V\¥¹lÑëUºp±Äjž@ÙÖwê×3[˜žþD-|t* káéjß  ÷ÑÍ·Û/ŸÁ¿þ\Ø®>E­¨ï¢8,ôß,ok{µòâ%u×å¶žÎA8¿Ïô±KüÒyv®PMæ(¾Ôµáéãá^Ù[3E¾vÑùr]+É”gö ¤Dƒ&åT¨w]1p€‘õ° Ëù»ìŠ™c’±}ЃüL €NN?‰nêü—€Æ®|×Ðð\ØKiŸûôÂzK°Ñ§ЃýÂ]U'ePaãrg—êqaÁ¼NØe#Û(:ȪÓs2ãuìò¦@xÍ&–DnJ¹£“uOTèmW"Oºà~ŠS¢?à{Öw¹˜/ôu¬á鎿O³"RcرÓã;‰ó3½àž½  †`œÝ±j¯b<äÄñPj¾rÁÑ1§VYfj(¹O…íÑå¡!ÜÒZ[r{kz=Ài?þd×a[&ï’5.çøù«8^A®U²¿_۸…±åQ=‰ðʰT™|®£ïaq˜´"Í·2BÝÒU,p¬‡€Ü»ëß!/\PRŽü¾©l;`›ÐÜ2£|òèÿ»#á·ØÏūߨ€û4?çîfõ¾°0ø.ª×Ù驜Ìáæ\ ‡Žñ& ³¥¿å̹'hê?ͯMjéë?xì/—Ðû”Æê?ðÀPyénpæ÷‘›}µ…ÆÕ7?ºïHÍŸæÔÙ*“®2ŒÚ »ÙÂØ²õ¥å9zÀk‰.º{ÓºlÆ3ý¶ù¢±é±ð¼-GÅTdá,¬ZuL:ª&©+Rí Œ$%Î3cTܪÂùBß­’?É~‹¥4OŸ—xÌ*[†øǺÜÀ=ïòw2þŸTˆzÑm#\;*wÛ`¤'ú‚#9îV«`2-n&.¬®RêDiFêÕ…ûwèûò"|fŠ;jÉ!}–£™¼EuÔ²!ôšñÐûñÊ’8ú=ð3œ€ßQoáŸZÎ1¼s(äMžiÕÛ^-zù`£ø:Wúà#â¦ÑÒˉvƳPš¡E„ÇDÚg㙀h¤2Ÿ¾'ÒÞZ|ëñu$!(ª1<4“ &)¬2 ¯Q;•s߃sª¦ÕPÝÑn[(X³1:×v÷Òg£K_KÕdˆ:39•Ö¦–ù½S(©–WºNg­-ž²ÿýìIµêHí.mKë$ÍÖ¹ÁýÙcCf@NfÃ`E¾¯á³û\TÏûQØKÉç¶ç­ÝíÈiJãC‹Bƒò¸ò çqÖ§œÀsáluÃv[}+D™sÜ AUû.ßêéahPÄ6)ô×r ÀÎ^•Îêü{ÒNò®8ý!ÈýÝÑê)ܹ~$º*d µšÅ¡ÏËm;‡ b*ÿJ¬œÍn7½4‡ô©­YwÔ6Ô®Ð|;÷$€úÓd¾;‡¡iW¨v*?¶è¦xø­Á,lÕØŸ®8µîPô•·]†®}/xS¬ásdçDç©!±‡\Ф[²ÌLÀ̱Ã\OL?3cͦ¦o´&XVúZqõz±ˆ04c‘e¸ Áh%2IØ’VzãÖSÆ.Ì^› Î©ŠŒþ¯Û LºÉ ­ØnFuXyÑ/ê ùÉeùþåâRÍ‚z>—¹œy—Ù½‘wôH£4 B#E–-5—oZ‰pZg–šêYˆ‚Šê.S53Vš—<ûÕD7[^· t¨ÌMR<ºº&*fhÏ”öŠÚ•ÑÛ2Kt•'uÓ,)m`¨2Ø“Ìha¡Ö@e@S|ò;°9ÝÉÒGª=ÄaJ5R¡¤j§ju â÷§d#BqÕĹêzß,›¼àÒ|£'õAßnÄp/Í ‡ c–Ž®Ü`?Vg«–åÑØå`…R¨ ¸.t&=¾dsùãps€‘± ‘Æ*£SÛZ،樶xà G&¥I¡óaxXƒÏʃåçê2{!I£ŠZš„°u4²‘:cdÕŸ‰b–Õže<0T˜TL‰í¿YIA G[âZœ®s-·ªjRçFí§Õ`ÄvÞm¥þ´ç’#ýÜ2Kp a[ËS7÷8Rd›Ö“{[Û+(MÄUøP²Ã„‚À Ø!(t 3Vκ>Vz‰žv…€£ŠœKe¶P¿nælߪÆÑ®ج¹ñ0 QîEV«Ó(À‚Ô ˜h-«&B¡ùì;¼P Þ ÷+#çNPê¶— £Âkd—XÆä¢Õ8µ.Þ.¥õˆ×zž’ð>ŠÈú§‡ÍÀ°S«Ð(l{É6ç75×»ÄÓÂ-b¬,³#ªCÙ(Ž’Rt k¨¹\ìTh;Äô+FlÁª)ß[Hªemsë¨9q›˜¤){×21ºûKk B”òßV®c…³˜m“eÐ…;¨4hOsvQí ÈY€ˆž&ù­4{u^™R[,ár[(W0X©W5QTëA„íšàä3•/*nl$–)}E˜6wTìØ•Ö™?£=°»@ÇPûWô*ߛܟEA0¿Ò/ªµŒP&Q‡JÎÐnŸÈ:ê`}>öÏBÙ¦xRnûÿ–×UÔÚµŠ`5Ék=¢ÝÛiÄ]…>d!GQ´¥–Uòn—}1,®š_e^ ͪ[‹\1«ýV#ž“þ¬C€+“8u”©bj(>VXüöEç3bÑ«\´ÓjuöB›\+¼¬!“¶&Qø”WHxÔ˜õ ïdHQhà\îY7úí²`ššæË¼ (m×ön\;ùæéážÖÛ¸V¬Á‘ô3|ô‘.hñu_ŸÈ‹ÐOaÌL–ýŒsœã&ªo, ]K5¬èô¾ŠòA7’A/eùÛÜ­Uj`ŠU™«å)¶S=éðzš¶÷¿Z¨>tLx×ïó[|RM^=j 8üqß³y 'h ¯ý">z­}!ÓαÙïÆË\²~:^O¬;´sùšÑ“¡H‡ Ðqªó„¤Àþ º9÷çÄa?9tÞAi¸uŠÿxõ‚i´‘¿ãÎÚùü×ÍJmeàjÚ›Œ_¡0¨RuSr´]ÙyÖÜYA=[9ÃÐαǒFýF“K7 ܱ]}FU‡Ö7Û;u21õC9¨‰y–ày"^Ïiž‚–ýÊ¡F›àNN«ô,¥„Ë«¨–@¯F²¯Œq÷¶–àoRó£[%DdNNM»Ì[Kz²ÃñØcx¾¯zÛ¤AŠú-½@Ó4àøÒØcð¾©,%4vlîÿöh9 á¯l0DÛµ`oTºéίìÖ3š €Ö<9È@ãõÊÄÁùb¹VÇg‘Z;SØSÚéí“GS3ìQ5Ø>`sk± ŽFÇЋo–p·èü}wXd]3 ìçZß_ê5v n&Àvس€0("1YfêHy?XFQg¶›ªžpF³Yï&ÊR4‡ˆL¶ìWÿcÁd{+ÉBŒ²›<ÔÁFY#\ûI‘¸¨þsŽKíS™|¡×(ê«@ݵY¤ ¾˜²uð^‡ þk+¨Ö=<¥çqïÒænM£õÀÃgôI‰‡²œÞeQ>¹<‡€L¼Ùj ÿ´(Þþ+ÎIÈ|a¯·Pí¹ó!é5y„È#Þh%=¾`Ðàû·Ž=R¾â™ÆOüjÃ2¸p`+e(l·‘PÏ\‡*°—ôñä'£RJ7È¢€#Ï’lÿ%KqמÁ©_K*Y“y® €ì7æJiðØÞRºP᮹l¸g•΢HE¶^µœÖêÝÉï“D8Mæ¯? ^¯æ!ý.1 ìÃ÷íküaÊ0gÐ탳èx%Ü6ÕjHJІ"i´…úcÙè0½oø´wåy™ûæœÙ«¨u¹—ø{oi7¶Ð^šòPE€òèÑð?·|¼*ÐM¢…ÊàÎA¥Š‹>áW Ù‰0V)$K£) ÇW®GôÑTLVpW¹y¹Àæaåšä²¿ÓžŠÞŽÜ=@ëŽ~éZ ×»âãÐÿs…ºì»oY 6V³.O'Ï2]ƒj¸ÃJäÕ1À¹v·âñï³ä!_¸èüYð¾B.·óÄNÏ1<MQ5 ¸íäE!HIúA±wÏxBg|Yí¹ð£ÂÎitTt«ÍÓÉ×9qÈ×#q<ÕÂŽÅ' 4J2Ë=:@ºAœ†™Ü¬U Ɔ‘Ų\>ÛÅÊADÛÖ‘Ñ%êÈØºÿ!‘Hóêb!¿áêJMK‘3FÆÈ\nÕzGþ³iÆa!|Rß!s…ÉÔ[à™ŠšŦP3 5gÑ ¡QƱŸÆŠçO¡.¾,õ£}´] P£ÇD¥ã³H`eÓ Öm2ªÎQ]#³.—fŠYk¬„ߣš¢6Á‰ìr‘,yê›¶ÂàP—|R£»!buán1lg+¶ÌªIÜÛ±pæ‹R»5Ì!ŒœÓ2Ë79¥’—¿L¼òÆZf¸mÙ%óq=NRL16‰ÙÍÚð\3éP˜‰h1 ¯+*+‰,ËÅÐÂË4ÉM|Ôacƒ)«¦Ri;$°ÐÏõLг˜•qÊnP¨$lÅãRèXáÍȧ"(ä*¸1‹…lÊpRtÒâ4s¸z{ŒxÕOµ’>Ôý[nO“+,±DÝ9öÎíL…H«f&\¶Ë,ùÝÚ,7 “°ã½ÂT-GÒÛvZs5KèEÿŽöü] dÑ]ïJ\ º ¬$׬JÑ꽦Fú+¬ ¡WN@þ—å}I ÀŠM2í¶´2CÎ){JAIÿ—mÓŽH ­_Âj«ƒ@TÇH}@²ÜmA¬Óõ½]dd­ÂÂô@ivÅBŠÎìp(ak²„"Uï<ÄLQÖ“¡~Ï2‹ØöíeŽBé¦èdi —Ð-»Í?´ÎÉeO€8’ñ5¤£“ ; ÍrŠf9xã U|QËRˆð嬤R.³/Å«Réuc“ÕúB;Ÿœ.@D‚2YA!¿çâg%o ¥emÂú¢¡¤½6`ªjˆÑ:3hòmÖO£‚ƒW K’ ¯÷’EG7 s|§Ý‚&Ðõ6gï?³BˆÙÀaLך„äœF¬{óz”¦}æ.\±D˜œÂ{€‡¨‡ '0ܸåvùÄQ5:Ò2“åèJäÓÀò7+:-9bq6‹Í=óaÓF˜n”/ÖsÒ’PHeõ^dYóCÕ‰W•XŒ0ëñâ¤ZLg dì.ÀåÄ=¨é]ÅÖ`Êì³RõŽ×$© €Ú<­¼ŒúÍìœÉé?ÚñК{{½Õ‡´8¢[cŒ3cÜb䬚¯™„  b…caÇ­£§±d`KÝPÅ>wuÝíˆa¡Þ}§+“²wáŸùÅ×o_4 Üû]lýÀþ…à“0½öçå•Ï¢35Õ~|£©åÄ5NÒþÉÙyø~GŽ*9…Wùû~ªåÜ8äA €2¦4žÚ¤Õ.oªZ°ñÕNu¡b¨F¤?/ÅBNÜ¢8Lµ2G©r©B:iµ6«~í·· Š7•v”@ZÁ<ù„¤­BI)0<ôyEk·‹îné¹°ÒÃ$[–î´Í^=Ükü]¯XÖôÙ!ã‘w2îj…,ÄvÚººíìóhÛGli*3È ì;)gQ£Ò;2²6Ô2êÜšÍWjO¸Vÿ˜¿5®j&[‹·¡ŒZ—¾Ê«R•!»3Ÿék;2nM3Yï  a’.ïÍO’Í=v@äX¿4a1 €=Ëê¨ò§ÛÍ–ólÏi÷IÁÕ¢ÿ!ȉ|X!Á@ @TÍò¬~É Rj×äà Р+.€»wÒÓB`gçÒz)þ(âŽá‡‚l¬zëµÓ˜öGp×þtüÆl€lTÝé5~4ºÅÐ qy,muF·Z´I—­ærC¯"ìžb[˜ÜßÁÊŽ§¯šõ‰ŸOõðk×ÿÂl©H@;‚ÚÿÆ>1ÝešœîT_=R;(7ó¥ë)|ê×X}ë#/†_ÏòÕžNœØ…ÂçR¾ž, ¾ÜS‹õ_«©éæUÚ ¢pEê/ãá§ÎÔÁO—ò/"Íñ؉éxŠ–£v°HVQ ÐÒ tŽ…ãîhŽ  Üß4gŽ{ƒMäè³BÀ¯=,oþUŸaˆ¾¿îˆ6ð}d)É͵èŽùþ:´€™óp·óØþ{LÙv_·Ü$½u'ÝC Ý#5EæXæ#ÖdÒÚSñŽ‹Ñ¨qýo)@sO:ªPœ6잤^"ɳ¨”‡¼MÄW˜8øé˜ùAOΊ¯Ùp¾ú󛸓þcÆñ`ÔÕzàœ©Wµ’þç›?ì‡K=•ÅkŸÛîxá5ñ­ÉSb}Ÿój±OƒvïÌJÖ´ -R˜$äB%ªvS¸¬:…«Þïã·SÒÇîp-mí˜î¼f‹¢²‘_Ó:ºÃµÃWÛÙÚÔß»5€ûM‡Ç^ÖǃW{,A§Eÿù%o8Ú²RŠÈ»7 |ÓÃô)×ðéµc7\¶ÜaòY…4Ì®ªÅ°ŒµLƒÜK½X¬ÝÚÜÙ µZû²œ5«Fý!/uRÈ‘õùl%«¯§»¶Vl>jà\*6+€Ï‚Ûm=kAc( $×jÀvc(p‡•Lº}Òû©° ‚µ½e§ËeDÍæõÚ`½Š‹dªj HdIJù~íÜÈ)X ⓪ (Ì¥ÄR«-¹š{Ñøæ±e%ÔÍ[ ´ŠlD(™[ÁÆëÄ€²o° è¬3Rw-*éªT¬é¢‚f>éa§eâu¸ÌuìP·¹@÷]¦ ¬~©™&,Vµ°’éŸÕ~ñÔûUV»^M6s~Ÿ‰Æ‹Í "-[I$ÝnÙÙ#F«UÈFò €Çúf;#͵&Ýâgi=Éçmû¦J)® ì_õcî­o ТIyÕ6†ÄnÒJèHÉ£å¬ÊLEW ƒv”ã\‡eŒ2’B–°²"E<æN†´[h½.÷:¸GW°‰äl?-:'Åe,‘^¯»Ër·«1Ô[]V6KÃDa\ÓMÝI·ìyªÛíäƒ ÉÊN>êÎßv¥ +Ñ-kýf­«º3—d;] .*7š¼Ž@ÍÄ·Ä…þúÙjèâØçêáôïJð"cÌVÓÃú¶s“Šp¬WA/iš’˜’xš?e×Fé–ã¨Ô†:âS18®Ð9MžbÚ²ÞOÕxŠ!0ÏÈžhów•é Í!¡%€ì.OóMø_‘è¼÷.C®‚ ÌÄ—¯†YqEþ´µjã•"¨5æV6^R08`—ÏV¬ÃðªÜeL×Ð#srvÍ6•€dzPCÎÂ:’¤û¯ÚÄD¤`(†w<¶ûÃ;¯àÈB¬šåØl•B~NuoÇ#[;B…O“îht‡±¥Qdà0²ýu=ù 5rYá~™š`Ö„1âµÀA X7ÖWïìÜÑ•>°‘ä]º9óîÞѦ ThžÚá<\².ÓQU»:&Õ/ÚhâØà¼¾eŒÇ‚wî¼Ù)DJºþüþêacü¹w¤åJ©NÔýh²?Õ „îÀGûoЊým°ëµÕ’æ¥êòvmVˆˆy®”Ã¥§W¼šÔÿbáÈo:´xr ÅwðàåÔ# ǤgRNˆzH+¼ÁÔÍŽåÙÍÊï?ßâ*ö·„Ø…Þ"sÎëÍù޶x¾æœvÔ9"=Ô9M5Ðd; eû¹E'³Né Î ¹Ï¦æIBgeâR2Ö_XüÌþÎfœ5"“ÑÞD æñ—3¤`àðfºÓ#ÙÞ~›ŠÀšgJä¶©ãÌZ–]QõxbÁŸÐl!ïx×Ó†Â|«eè] ÜXD¸30®NL«@[ßJ$Ò mÖg+»+@g‹š‡âÒN¨Ðr/H#k€‡È¹­ˆö`}d¶ ûêß9±E’•áÕç~}i¢óÒOe×{Ù3ðà ‹þ¯µÖÆUãt-ü[~õέ^ÇŠêÚ<'°¯a4cåÃ=¼“í¦¶×'= œrD0šeêçï*üN aíš^›ýã¦òcåWàBq<Ž5óTœÈ»9Ó¯Êmß|1Òä4ÔX8Þâ›Ôý½î¨ø¾M}}}}}Òˆús½½—™ÞI[!¡ìjÝMÇbÐñýõýõýõºÕÿ ä‡ñe ~ñûÖ_ 7ˆ‘(†ïƒ"r–ý•PÓïº$où ö•Ýéçy~à‚À—5#ÊΛ·Ú¾oøß_Ÿ!¶z£’÷mtÃDñÂ}²iýgÙ¯¾ý縕ãò1FIÎØEBËöå L5Ö µh] •\Ú±Z%EVð\÷³ ©qTŽª)…LEÕÜAsÝšh°™è¡§d у¯AÇJwá9§rÿÖì/"1’qu¬[³ô­ýgë8#ÊîUÂNÁ¤d2O ò.3\GK1ò ^iU¼ÙÉòÛ‚馩€‘$JLT_cÚ^¸ÉJ´9±­U:RVq5[ªÇȯŽíSDL¥Çò÷šöýŽ’MšÅ—‰BR"R,‹ý¯ëgAgÝ‹'A&Õ:ôh=ß.ö7ÈRgdž£ç›Ô+4*²5š¡:ÊÉoˆ<ìäß%­Â”­› K[ÆnT x–SÜËMÊÙƒòáø'E›ø¹óü2½¯X%ôvŽ]…ÐÜí@ø}½éÇê×=@ͯdçZj,ýû;…=¬uÖeæ÷ÕrQݦa‡ÉcÚ èŒÔÆN-öFÝ`uz×,c»ÉÒUû)þf¡Ü:ó¶q¬uy2gQm?©/,„Òd71r¢ÆPW{‹æ-ÝJÖ™úóó6¬eÃn ´'½M~«³òn¶š¶Ê„° Ý6®:e”ˆ[1ÕñqÝ’i¦ªR$±7†r)a)H‹•åÓÂ*–NÍ1ÌÜü€Íã"GÔJÓ3Y"Û6ĵîÖ)¨©`ÞT<ÄféNÓJ/Líø°T¨šb[lÓõ:¯³,éšÀk38-Šb)¸‰#Ä&›7v­l &éÍ^£"áw3¾U[1€Ý‡T]ÕÆˆIí’›¢:Ë™‡dýuÖEÜëx¬†Nü:LÇNŠšÂûb9´uw¨D/¸ç^‹Zاõ*Þ^¯¯6 V:r (UdY0Iõ`¢b,á>—Å a‹Qm²–ëÿÈÄ@Am°GDõØýiQœkÐÒ‡Õ™|ÄRÂ;èê›-( -öÛ7.:_Ôs²lûÙí¥èë·g£»xKùŸFÀºi8± ù±B; AÀE¸_„6®0Çž¡ùP˜<´½³a—7ÒÇ ¥ÕßžîÜNs×Äîo!ÎJÈW7gËŽš5ÅOãn• Qz2 — a…:¥sª3Z)œøV}ŒŒ³™RDª8°¢!²ñ|··>SÑjüúÙQŽH2toæÖY ²l¿y¦åØOÅû2 õ^õÁÚvvôüºIìon~÷Ú“RZšBe0å]6¯,:²·t@TæÀªr¢Õ±òÄʃ¦*Ktá=ï‡lojk4Èéé=m_-ZYìa0ç¦FR{ÝÔ-W)ðÍ…£‡+±¿â¾-óØfk\m¬½(_©ÈçzÛ”@#JÛ€îÉXLÔʇMÖú×:çU€ž6ÏT ŸûÈØ]¸&„«¤ävøHŽªLV3×ÊWk‘o]à”jüï`8ž>éA7tÄÝúÄoVtÞÛžÔ¾òÏÝáÇÉmPömÎøýå¼FìGƽ`ê„h­³ wÎÈZnßk‹¯UrVoÏ%TýÊ‘œ é,P¶uáÞÍ‘1’$gÆy±ïC„>»ËmUt+_±.Çšù%,γñ½ÿûß)Ñß_ß_ß_oþúÎ$ÿ"Çð«x,üä£\uõâ¸Èѧ²Û2üýõýõÙ7­ï“óûëõij° ïÿ˜_öÈòÌo/PÛ÷åûÆ»£µu:éÎrÃ%Çm6‡ÓYÎâIa|2j<›xOñ|Q’üÏÞtVê>m÷2ÊQjv!0E¡[á±¶Mß1j1£­ìÓáÆ{VמYûedïâPÊfAœ>‘’~§ìýÃ#ìàØþ©ÞÎûÐ,è=8Ém´KÃìó¢ °OóiK­hÅЂ¼Å8²Xç6õQj˜¸Ü}"šáÓ¥–¤hº¨Zc\î1;wbºQ&¨î4-ó/Ø8Há›Ï,´6ƒ£‰²ê®Çw¦æ ¤˜8õ)P`{H·§w'E3 ŠP©”%Š€äTúÑÛm{ÔmÃ>€í®¢í³÷z”l‡WÉ•¾V¢<Ç·ªËŠ© _­¹Ü2fYs,Ú¯RHD=/’5tŠq`;Ñ$;Ð<, v³©…{¤+Ì–Ù(î+öËÌ>zÊ•¯béÆ-ªºÀ~/á.×¾evZh¡x úº¤Bû ùšD½ö…µôÎmµR@0j]ñÀùöЊ¡©ÀsÎf¥œÆ¶<‘§ª„½1kÞ¶1õMƵ¦ÿ긞-ꥭ\yÝFÈZúLe7V H%[› ³½Õ4ª’K•š©K£é€»69*ÿãæsGb±;LÔ¬¨äÆÞmn8¨·ürðòXäy@ìZ.v®èH¤ä™QeÀYöf§z`¹’ZxÍÄ7^O”_\¡€²!lø ‹+T" ܉lI+—BP®Ó¿ÊÔÁï;IcãBµsí¹‰#¿q­µ¼ÌKÝ“^0Z–àgýNZ@<Ö7ëÜå,J­þ›ðPQh-ÅâÑéÆkò\3„î«ÃƒBˆE7÷vw¬TÙÒŠ/³q$¶9õß-ÖJyÒRäúfEç[n¯ëÿàÉé°.`) 0Q®K+T+bo§–üµàµRËš]JNÑF«û愼 <4ÎÌ•’PhP$Ñ=¤@êŒGŒ4¢v.ëñHds·×s£âËu¨–¾ë.= K1Cµw³×ëšØÃ)Öǰ3£ÂW‡Î’Q/ˆ²($ql˜òRɸ4þ“1K=/¶ÄIðW)æ­$•MðVŠ¡­V±¢PiÚ6²iV»ÌÐmÈêx²äìÒ *³Ä:(¾6ÑVBÚ<,lŒŒ’àŠŽ®J‰é¡\ì}„Vѧ«®³!uGd]aèäĵæ©NåÚ9 ´ZÍ™$E=׌X–Jè낲ˆ´K†GÌ®@mËYî?!)¥¼ÜÑD².±¸ZWò¯éž"ðåaФKé›U\¿úƨµ›¥)nF䦄Y"ú«˜µØU®DG)RšÍ8¬ÕsV­G±—a+1b;— |\b {“ÝB/ ò,êO×ᇔûd¹dê\³N+Ôœ[Ïø®í_,£:ø(”Tì& [a²ŠIYùÄTÂ-Ž,Ø\@…GMþõ;⪺n ÑÞíßì &%únâÌB°ÈßfáF¿Ì·Ñܸ+ÙF«œ—¬.ë;Z&­\qû"§Š«¾B–e¢Ôv¶S…Úú¡¹ßj…ÍÖ¯ Ñåña°HêPg›Bu­: ßAìóm©"vÒfÍzç1ù ÄEÄÛ:ÔwÈì-(_Š--‚–¶xõ› ÕÛ"ŒM•2W gÚJ丒EÜ+¤T¥8e!¶ ­Ö…OáQ õ¸Þµº¨¹ï®4AÞLJ=¾LåZ» L‹ÄÝôª¨«Þ§-4í1I6ÝÊ<FÛæ²õ|€·x‹mŸÔZ¾˜ìvÖÄ­Æ$+GJ%™eIJ{‘-t·‹~¿|Tª½4øÞV°€²¿udºÙ´û{BÞ‚ŒëFuÎ{‚”fù$5»eÇ%d8=‹¸òëAäLt³ @Ù¡ÀÊf“ñ-_6%2-˜¡ðu`[kCxÙˆyp´ñ|°{QézÇÖvBeÝ§× ²>Rr\:(ÈbZ©Õºæ3’.šnNèãÏ_É}P\!?h‰Û Õ)–¢½d/Åä^F® ¨U+XŸÃ,Ž UŸ#¸ÿAèÜUÈ)>­ÚÚÎÅ W P^v!°ÖJ´)år»çå*ì;çHý÷*(r®2Rftš–7ãCõ€À÷õóR]4@;ÐÚ+¶ŒyÌq€]xÅn§Um´8ÈûøªW øÜ¢ó­±«§“³MTµ[U•HxbqZÜ\É£éÊZãî—HÉàÖE›%¯ä4à!­¡£ ÍjÿÐ3t¦ó‰ÒÏV^!û¡¸„ºÛâkˆˆ¬¾¯¾5îï˦Éã,Œ[àŠÑ7 ˆ|±$¢ÓÍ ŠlîDþÙ¿¿Až¬iÞYåye°¯íì•)>Û•ý2zßi´†çû }ů ßЉýþ:³sŸr¾˜ÙP¿Íûî¹ê3¼Ö¢]RñX>ÃØ®HÖ§\_msÛšÎõ}? ëëF¥YþÍ>ÀÁ«ºÃàÇè-”<¾‚ n[š±½b‡Kš‘mÜÒdñõ¨ÛÕÎÇÉc°E¿ž–|ü@þŒ¡LÁ¸c[¸£ýÿÍŽfWGe| KÃùcÎ;ÒÝÁÒ÷<äû«»ömÒuf²uŒ:}ýáÕ·ËåÏwÄ£'%ºö˜÷­”±ü¸l_sã¶þ|Õšér0å§¢eEmVóÛÅÕk­G1U³SÙYJuÑp´-–+ºžÚåQݦ-ÔoõÕ¢äE·Ú`>˪ÌŵŸɹvüVáÅê²íeЖ¹ÈD lœÕtYÐ: Ke9÷Áª÷9›€íÁ}ª5Ö‚À©m¸Ÿ˜òbÂpl¹ÉêKO†òcRû@EÑ-øº%WIuç¯w¨9¹5=ðäµ !|“h÷PêäÉ«œû >|èé:6Ûo5Ú §¯³·É÷¯~ Ü{]­Ž)7„¦F'gÀ‘-c×JÇ?ëÀc«wƒ²›º,hKV?%/«ÊúÒ(Ïšˆ;±OêÚÐÝóÝüÎŽùë`ŒÆÀ8]c•1ïÂþÓ|ë]GY Óó[4\Šm£ºÃúÔ?K@59O¹•x2¿¿êa_þ¥[îÒ¡c:g8¼°tûñ$ÜuŠ;åp<éµ¢?"ÿçÀW8»Û¹Órá‘·G»¡Ø+:÷H^•»îÞ¥¶Ho;ˆÂëuç†Æ×µñki§*WÊV`ê“faܲXìP­EšX¿”þ¡¡Åx ß­ÿ#«¸;Ž( Ó¥¼þž¿òî)vlû4Pi!:TJ6)ÖØ¹Ó+Üc㨓;η):ÿJT©õhšcÙ¯W’“šÁ™q2 ¬5èVV(7R«—E÷° Ö¤?P‘ej('3ž6>Ñy¥‚‹Çõ/pØ —=«šØ™‹: IÉø€{Y›>P¡‰³e‚ܶ¸ZVŠC–%ƒPç®(7Dσ¸Ìö¬j<)\dJõÕ‚·@­À,µå¶ëo•Óºî"Šf«bKõÛ´¤f¥Ù ®5Ðû„ªÜHQí­ç¤Ä#r™!‡Õ©\d©یJˆYk¤¡^ÕA©`vSd²Ð¼}ûàbzmÓ Ê èÃZð‘èÝy“<²¦YŽ'‹B¥}Û‰-Ã}©ØÙf¿räY+DÁ¢2Ö…ÜýÙ€6%Ÿ‘•ðš³åOOxÛVÃZ§CÄ¢/¹š~¬‹šTB)…zk!¤ê­(©8åkÌ6)†µU–j Úc]Pÿ‹‰GZ-3ms©L]WÖÑGe¡´£4rôÖ,$š$ÑA²Ú°Ë mþ¹·tY‹"¢® 6ÜÛá hÇ«Fs®;A*lÅAÖOEÕ¼í(a#–ç ª'=VY¡P± ‘Ñr¦­°^ÿR-½ôÿêXÙ ¬ 6(̕؄ õMfž› †_[鼺;uqgÅ{#‡{[¥¢‘êo§ý7j_!]’Ö¨µ8 ô¯r ’5À Ñü#}´‰%Š£›a–Á*\ Ù¨|þj&¯Õæ×.šFHêt(åžs£Cu1žÀºRç„zEu ¥ö®)Üä$¢òšâ¡ü³Ð7\fïz<<¼‡`öj!jÅo|e¥C¥¢-–Ò’ZÂV•”etÍöá{ŒÙë•çVÂЩ¯PkÞÈAmqb…w†Œg«î—Ƴp„zƵ´té(7a¦uäà ¯…thRyV­ýlìc¢á•G«Ý’v›MY’ «Ò:W‰5BʪD·-@æ,Dq@å«%&À€´&›Ÿªï¹IЖ[µ[ 6šE:ØØº±Ú1µð ’PÃã­ò>JÕÙ¼—ÂÄ–ÎÞHÃRIxXó 0O÷Ey°  µ ýê« (ù¹¨B<µ­®ÑJõ‘l QÀk¬4ðóB‹í–)Çöa)½õ ïmÌ5æÝ&g¯\T¡QB%P–Q5ÝPŠæNB ÒX[š\õ×pCUòa hõL–ÉXG¥– YŒR&®“²Ü`·_¬Ó}Œ»ØÉÃÇìªÙ¸Ž6Í@l’îqk ñü{D…&CÑ`. ò>c-O‡Ó©jªH¨ÞJô)á†+æD“@EúZ?Ùâ®Ykå˜l!‰oàJï¸Ï’È•¡ €½2·%:/méži$Ý#T.nFÿ«!¤¹ÞÑñj…çÊZF O «XVˆ1U¡wOزf“6îýt<Ñ絿K( °9A\ zºÕ¨Àu礀>pYAqçK¨ìv³+ÓD’1Ô¦ÃRֽˆj¯$·Ò !(ÂZüå.Î÷Tì&RVÓø¨¡æ×þânYhW†_ù:Ø´òÀg|d`ÿŽÞ”Paã*uÍ=ë÷Žëúä €·Ù>øi§1z³‰Z öÞùa‡o™ÙˆümŽ(ôŸH¦á4à°ÜÄ~Z…v3|1wG"º}€4ÕO¬Ϥ ²Œ<·jJ`±ø >ΨœŠ 8B«=4EbßN™÷ý{{õçÚôxÇ~‡êøµÊã'_Š>ÖÃÑÍœî‹btÚ±ŠÔñU|àlâaµá«?©d*ƒGX—oöh Á»–Ä5:;U v-OÎç(MÀ[ÄÈÔä—ÊN§ë'‹N9/ æég鯶b÷& €ûàÇèÖhyùS¨š_¦ £,ÖxV4Ñ=Ó €Ø8j÷ºÏmK¥;×é0õ‘Ÿ¶îjÁß‚¼ŠP.HòíѨoZtþ.2îù ïUzŸ™ 6rÉxt› Í@ì,]ÜàCeEN½Æ2@)Cz—VRØ’¶àþEæ!fð õ“Íøù¶ ¡hö€Õ¨ƒ'™%µËi§PLjotôc]0šÈM¦Ì­0¢6Le5}(}“Ș¯=[53°J¨?Ãí¹wk/B‡cˆÚV‡¤÷À«þ¤‡kÄÚÁÄîëг©M’·ó®H|?·ÖsÝ‹?KnýY¶¹g‚Oxµ+ɨ‡2<~xÜiþõ•àpú9ò _¥µ.óŸÞ,ÃmeŸÍ+¿®jòÁÝxÖ¦‡oæà°ïÿZ7ÇÈæº¯ß9ÎÏ«¶ë¼¦¡¡/QwY¶!ûLlGž¸†N;5\kk9ý€IOÒf68Uš)*Æž÷]Ãܯ¹{tÌô|MéØÙÎÉKWÖÓ(ò ýñ°éÀnþ9¢&¨þ4½Eà 2Úx»ñgVn1†©5âû ‹´Ù÷ñðŠòx×FûYžŠJ¿Nù¶uLãêüxw,iè¯Y@Îvä[kóÿZšƒ[ö~# 7BQé?÷úµñ|qðß}:Û´µ-Ãzئ‰Ÿm 9Å-Ú—ÞB3¿Ï é™`Sr³0ﺢÓËãŽ@Ÿ‘öÊQu¯¯}ŠÇÔ“2bûÅà+ߢè¼Ï½ÞScÕÑßPz7â,ÁÑLçM{³Ÿ ªžýL4G>œ–®Zëp„k:SÒðL—“}›ë£ ì]u(»-›/“¸6²s’zС# ¤MÒhâ Ú&"M./(3d¨¨m‰Èf˜$Pró–„*[²«<²až¯ê‘·eÂ_µë'ÅÅ ©¤À¨þˆâlj§w5ÕWú9|‡¬Ž¹Õÿu›U!¤IF)üÍ汨(g ©(xM+æˆfÖ…ôìf‚º‰/™cÆp'TDÓC­¿Ý m?3æ,òÍ‚VÁk…`(åë½mØÌé²Êf„%•BeS€à:w@OÉÇSë¤ü²f|æ]Øú qe9™R˜‰.^}‘ }[ãj\ G°¥R(éhÁLyŠ:ÐëÛ aïA¥Z´FÑÑ…+X°h¼”QQónS}Ji^¹CG©ÇÚukœKñ¾×7©ÝNéÔ Vˆ7W ©Tj¤LÊœŒCNi³ÜYG,47ì玻RŠ+C#¯FËöâ©3Y 'åTOìôªêú»ÕƇÁÔÒ1Û¤òj;ó0»¬ö„B7¬/9bO#•˜œ&k½«­[I¥Õ`EÙfì5—ê5EÛÂ?Z…U¤¯«:?Œä=„ µªtË(RXƒmƒÑ²ð˜ ªå~ƒŠ(¤÷Mõ°eó´*húú¢î'ÐŒæ}Ið%Lñrƒü¥ctͱ#>°—¬û5(ìœÐaÙb”šùzØ¥É9ØöÐÓc^ÇYž©û@£—Šb#X•]"=ÑN…¼ž‰6„Hsl;¹[­ÊÕWÅ„…p¤ß¶Èžç C_ì>,f»„=ÇÖô õds”ԓ[ö³®‰s;·>%º}räAü P)Êå¶Â²‰©ó ù0¡†u‹ä½‰5 Ỉ¶cýEçÙ&`DÍL€ 4ê7éЦæâr{KUH–dAÕI ¨F¶KJÞHÊ$Ö>¬‚¾$]Z4¹` ‰qRø ˆ,Ö]ý%Zè£8Ö·“  ÒÈ§í£­Ñ5'>è†Yh ´Y½¦\²I&­K -ˆü¸ºõ“cïD–'Ñèá‹m]u‡=îâbEÞ¼]*Ò!¶kÔq¦i×ð$àüs³ú]}ËN‹@ŠH–rZ›³Ë½Å„kè5>˜³mËbã@î@ÿéšõ˜´´wº<ŒF/ÖGnªàïZ¨W±·šgJæh¤-l™*Þ<€ß S¢óveêÀ*äe:°SrGÚܧã]FM ‡0tå­´ø&>ª²W«S°}š~ô:» Ê|OáîT”§JòÙþr¼§ÛNYfnìèÙðÈço lãÆŠåŠWBC¤tW C‡®º‘* £p¶Çw^J°‚ÔÛÍIʜҖÏ(¸(ìd"Ò¸—•±/•Šn‡pg­vg]º³I‰ãóNŠÑ¡*êë»r¼»Ã¥½òÈ„ü¢^=€þ3ÞÇAÀqGÌ:òa7ÇcŸË;FêÈšÃ]ïzõ€|@¹é8JŽ÷.‹§ûþO3ÚŽ|»“CŸKTÀ„cóyÖpó{ÁîÓÁ!À½k¹ˆãgBɪl»/#®òèZKZe€€B†ièJàŠÛn~Ű jQ¼ÚŸìôšÏà9îxþ…ÇÉ”míÞôÂÝç#¯„{ %zÓ‚ðŠUyÏqÁO=N( Ñp‡¹ïóqpÁ¾~#Ä‘+qÛH¨€”× €”Ø7Wµ ø}ÃÉ][އ… í{,|OÄ’<©ÝÓŽš?ÕíÃÂÁk^8£×Ýfˆ·“¯o¢j¥©ª”(: b#aEn£õ›³Ø%Z¦³ Úg ©i¾ìÌ™Â!ãøªÃáâ­Ž£®ê}ëÎW,£ç•¿£×I–ú?gHÊb£Á¨ÿ­KJP.yp–p"Z½ÿ™:±õñ:0œšðQÿä®ܧо!Ñùž fjKí€ýqgw3ñljä à—ö²3jôšî“¯6"7ÃÏç]©¸£:Ûó†¶s?™nRÕ¸öÂg÷ƒHGzƒqý€ZcÓŸ¬SwóÝ ¬QnWßâ"LóXSf°6[ZFå®·'eÜ—¾ÑŇDOh×lü=‡‚îà.‡p,îè»ðŽx/¦ªa‹ý;o^'ï¼Â/w£ùäøÀØ#¿íŠU}~hæCø–èÕñl?ÉàΈÙ=!Ù{ LãÊcD|ÆÇ“Ú,©æ¼Êö} *Þô‰ûЀó‘ËÙ…²ÀÁ¦[h“ž¤?M+MÎ^ìqíik¿¾¯êŒ–£f}o¯ÏNùÇê]w Ñæ)njvâkð¾²ç'#Ýn Ë~ȶ‡OþĹ» ?.¬mtÁð`ËÜ›(ħD•|üø[cØWmgM¤^µ•ãyÁ¸sÙ$ª_­F¬¹¹ÜßR3Ÿ"iIÖUEÑFÇÌÒr;ƒ-£›dŠ4Ä’¾œÿK ²ùøP³žM}ë×TxåTÇÍî–:¤›ÖPG ŠOÞ×ÈÃ'ToÄtÕ|¯±Â ˜=‡Ê÷Äx³ñû¶Eç›Ù‘Ú2¬H{ý^Tî1–S…}­ØÄ€U·Y$IÊ.Ê‚€ØzFêQ3”U·ng8vflíY^õóÕÛEé½^О â06M¼íf{æ˜HùQÒÇ£’YëìÓqŸHÄPB!QZù ·8ýø„éÖ²»¸g¹Ù`îæ+Û…>œV¡A½…¹ˆ²HD=FñED$ŠÀŒÒ"ý³¶Yºêç˜ó=ç“ësÑT‚;ʉ®îdqBbЮ¾©(‚§)átD›V5d1ð÷Íî³ †C[''+é…éSoo(6*_ˆéd»vYä8y¥Ð”vîSÞ­Z©.¬y1kmÐ=!ÚI—ÙXQ†`lã`‡ûå¹›)’ò Ìó¨†Þ° S  Æ´= KÆKÇ UÄS´ö ,$DݯM”7ZÖé& -áiÔaX9:ÕÚ³Š6e÷:ÐvÔDõñÊ¥‹®T‰±µ&DoP™=­‡üP£}¯‡ŽÞ±Æjs!zxyMyÏ\„:„Ò×!Âë€%êD«ôU9?œš¹2ôaÔpSØ%eúÕ²6°bÑ,&B›ÏÐ •´ØÖF‘¡š(å$Š‹dqš°ñΊš]FlM`Ø€ÞEkocå *\]jD´P&â UñI1V±O8’^Ì J9 ¶¶IÅÔµ—ˆ2¶©[« ÄsTˉ^ÙŽOPj™+U€¸)%Þ$aŽgŠ£Ò*@ä½&Êb% šÏÀz>t 66Oa‘!( J’qkÜ$€ "µˆøÑÇ)X‘¶¨¸˜¿èí]"D`ŸV(a¬u³î_Yxˉ®B€ `w÷r4¢5_»UËœf¨Ce€ûv£¯×RéIåP¬Šnû ¬1åÊ­4yg‘²užxP­Ø ì’íøšñÅkLµb9E „„ á8 £ø¯ÓVhES)b\ÿq;½k^Éb!xU.Üÿ€Ú €µ¶¿âÚ*InOõ„Øâ™ÅÞ~W¾ùØ0ñuc—dmòYé‡pôðldÁw7Š{U¾¾QT÷ê麴9ap$Wë=4*G „û~PÖâѯghm8†½Ü'9Ë4’÷ €"äÙ@+CôµøkËPv_HÍÐt¯@ý±Æ[J?ÙwãI)ÇPn“r®§ÇÖi÷Ù!ÒÿÉ®n.µX3°±:Ì+b­oLtÞ¶–Ùu¡íè«$Cû €*Û5KRsÀ/X(ý_c1à W"ð…Á*“ ¯Œ=ÙÍâçT[nEÕ¼|mrµÉúQµ¨Š®Óªñde`€ú~]s¶Î3Ôj†Ü 'Ñÿ-¿÷—l¤p;ØjåãüõPé¶¨Þ Ó(¸vËí¨ló;Çó y}gÛ~}]/¾ÆóäΣ¶ú†Ñ”‹×ý)êÀK,Gá£$ ðF›Å¿Óàäõª–°’À7ž(¿óŒ"’_Éãú2gP;9æ7|×5|üÒgÂ+"îSI{_•ü[z ¯<ûQŸc÷zÌXô? (ìÐÕâ„UO¹Þ¯M$³¿KŽŠ”}c ÄÇ¡„14_9cKŠ\HúQ8­„¨^˜Œusÿ^b°lìqã甊(YÇÙ˜_(æ·µùé@Œ1nóó­‚`WÓã‹ÂßsÃîÑÙÓct¡°n3'qíï¯ÓI\ÙÌžmÍä€HÔáõÝÓ³Ô²§ÂI«ƒÔ÷>‚%þv-&tGupèZ·9eÝ@:ñŒ6µûy"¦"2¦3hÝbPÀÕ·¹Õ0iÛ6¢zª#Q‹ðÔºP·l¦?ÙU>køôs0~Oΰ©ûÁg1+õ—R2ˆîÈ«›ÚzÖŒªù¤æâý˨¸äy™˜‹¹ƒ“IHµ¬­±Á4rbµÄ3qr{/ "!™m‹ÔÂJöÈP’„²t;@òSç6îëÀ½uj°«MŠ‚¤î´*ó¬ ÛÜrQ2 ÉE d-÷R4‘zÙê a%shtláZYSƒŠ[ZºQØÝ®äS8MI¬„6TèX\3ÍP×/Õ_Ùï£ZH¢—±`2n4“Å;&â>rûT¸[qçü>h¦dßÖlà†)‡z~æƒ\Ùò:Ëæ9W&J/ž‘Žj»ù-®´ßM&C©¦™Þ@k£rzXYIE¡diU…)äfFQrS0º$ÅàÔ2ƒ»ŠûŽ[°*)š yüïq¨Eìâ1ÃTiQ%¢)Á‚ ÅþTÆÙy ±æóÉЈ|×_Ý~ÆFÙ»–úªáy]·H–C ¥¡R2_¥ÎùœÜ"±¸š%P¡ÔBÕƒ`iÈLZ<ª³Ò4ÄtМàÏḋèèCíŸô£0q¨œ)Q{ªP:Ô(ëylûKÕP[âÿ(Ñ}pTú?ªÝfÓb*ûwZÔUG黸èÄô•õdE¤H-cy—×r•D(zÊ1ufîQCt<ÍRwt î4y*Zÿcš·s²§!/~Ë8ÔD²BeGù´3©Á˜a=ª‹'^yâ‘G:îÙ2¤Ñ;¹å„9ÇòÂA%D[ {8©ó7®à€Ó©Ú8qŒð„š[‹´J fÙèâ‰"˜@WL*Ï`'Q+ž©5œ£Uº“Œ°Úæ'Zw·µõÌ/Gr»^·™Š~'bZˆ­Z3¤}ôCr -TŠ•òçA߀œþ‘Éž¢Â¾øK^)sj?ªˆšÊk/oÿÉ0> ˆ"Ž!å¹kœ¤]‹½ŽÖ’«UtʺO)_ÿlá~¯!ëz¨“ÈZÏNÿdÌxr¸H¥¤ ŠeFœOçAØÚÏŒ¢Ú¦…•Ø"8EïXΚs^œ.cgÚgõžΫ¿()¢hªg!ÆRð ”RÐnƒý;·÷E7C2ªÿÝe$YÿS–ÐZ;fÖ×–ª;>¦ƒ}·VѧšÕ÷…î{p> e¡tºa*±PÖ4NÿQM÷ÉAU*\ž4 ¤ô¼i+ßNS<\TqÌ7':ŸïzUÓÆ™Zë‰j2ä”Ð[_Å^WÇ .)Ç(‘jµM ý£ˆF³r4à-–õˆ,“|‘g…UÏîÍ“m´Qbæ\¹pá®»€ Æ[ñiÄFš€;r°vµ-¬G2„ViEÃùdïc6'¶.Å zÑ'K“ÓÎÄ£dÿ­£pfœ3Ç<÷›rùaè…ˆÒ@“>4]Ñ€¦ ŠÉ9Uçš+1ô–/½¨ê›,ÀjÛ[bg.`¼ÍEóõ¿~„þÏÞ8yªÛP"ÝŸ†€: ¥–eeÍ÷Þ l·N¹ùo‚Ðþ jx‘©—ÀÝ;Ã+¼©µ~Nó‰T1ŽeN¥”ÕÑ#Ö_Ϧ!ôçmÈ;f§ÈÝŠÙÑ>{vó¯Ý š ØÐ !,"qYà{ÝYn1QõØÙN`hµýʤDéÊ´".{úZŸGzùõ˜y\•á‹ ÒrŒDEKXìQ6 ‘•Ý7l‡ ÛÜÈFغ>oVpj*°V‚’¾É‹LφîhOÒ˜4¦;ª‡ûC²§é]¶+õ·ÝfµÁÝú?»ÚAžy§Çh=vª”ÎÜì}£tàŒð¿´<*+ ©¸Èý£Làç”C€ƒÉõélÜk#ú6EçÛÑw^Ò\Ýa¥´S+Î?tgÏ_K5•¥Ê>ÙË5ˆ4htS@ÅtÓ3Š»á3JeüC¸É¾8g•Jé°Uƒè~K_Ûgw’°›É¯ÿ‘Â(1æ8¨œš,Œ=^¥ázvVRú¢lo˜¢¨©ôI¥VÎCì9¢> Mýþúþúþúþú’_1Š”r‚ŸóB·Òv Ë~—‚9>\²¥¯k’ß9âß_ß_÷FÿŸùÈ‘7}yب¾¿^—&•Ü;ªöÞNèfX°{ VÞùÖüúWñ›ñ¯þPd‘ß_ÿòoû7¸>‰d/ÿƒù/û3V5ù3¹–ûnQR­½Yí'f˜ŠÕG…qP6û[£00‹cÞ>4Û!…­„› ¾‹œ|}-QdÉ@-­ïÁ÷×ø(×t±Ê!ã–¸}åM:VåYd½ŸTZ>yÒ˜írñJ#+Ÿ¼%‰‘lõ¼þÝ(ŠP™¡€¢…–§ßv&ÉvÒØn…ÄÜ׸øö®m0\Q%†oþ*iP¤ˆb™¼2 QùÅlïó Úçsk9¨Ì‹ n®Fg­ÄoÍŒg%[¡,áȘ»#’N‘TËÀÚv`œ Ùe&B POwûmŠ„lÕLó̪’ŠXòdƒ hTzhuu¨ÚŒ r¸ÒZ™×3p»ˆºb[~Y´üh[ÖÝ[ÓÀÖJ 'Ó5ï¦OoiÔ*Í—m™ÒÑ(ŸÛër³²ùª~éïRZûƒè~ÿ1¶ÝëBþúitÙ)oŠ»—/Ó=èYÞÛ=ËÂvÇÒiËÆ!Ò[ßQ™n4ÛPêQyjžH6(F«ç ž,»Â%{;~ÌŠÀ,Þuð»poTCM¢n¬·K?7”NŒîÂNkoÈT ºDµ42§¦d¶Þé¨ýðè-[ÖªÏ^e¤jVÅ’v÷^}DÈŽG¢¡×$èU«ëHqݤÓ^º}ÞãSKÓzAJ w}FyÀ² c뢉«Þb&'{í8æš7ÑJ³õ©â!-€‘eG¸¼ÀFˆÊ‘•Œ¶íÞC§ŠT¥ ^ïÎYÙZÂwiȪIPBg6ä!‡Ï×ä7ðσ#{ä À§Ñ5.¬› ƒ(z»+ƒ Æó8kpd qx"lošæ$­µ²ÐB}͇º›ëÞA\lÂúäG#ÉnçuТFG U!—ÜžÐfì/ðä–*žÀZšL¬ÜtOÛÿ:átþeE¹ O:cSé{‹P5¡Kô³–Œë™0+$­µ>¯ûÁe;(â*E‰*'/Ä:˜^ÕÌ B+H†§«.o{±‡ÿ×-:ïBZ)…ÕºUj´Œ”«=b{s¦¸?ó¹À¨…A8ð¡±~¶ž“1Ù%mlTØ‹ÚØ©`>&عޫSl?z)f­áCˆƒ ̲í†msåRˉ®É-P†ÅØUé(N*[KoQY> YlÚßdƒuC‰3ãœ4eË'5ÓP’ÅJÁjXÃL$ïD‡¹¬µ›¨-ÛX{[.ÇA0±4qlå%C¡”ùk²¿¦Wm㘤ÿ›tÓÍ Šp“¤2‘+Ž)‹˜×Nå´È3Øe» ·©7t¶éÌ3¶a¢lŒP¨ ¥k¸{ȸwQ‰ð–)ӡ̃Íü¹‹²vØv÷ôÕ¶G/ŸÒWUJaµe V5ÒêOùÄ=’ƒ{!ƒqUÏÝÁ“h-¤N '‰¾Ý‚ãÏ!µ¼ÊŽ¡mK£XU_G4Û U.jlC($<Ñ ëœøÆü|»‹в£1¢¯”f,ü ¥3ÚÐAi‡„“5–_޵\ÔÛñK9¨u 5µÍpò¬Ç‹:½˜¸Š-Üc`/-Z=“¾ÆªWµÌT~¤b¿F:J/´m tO€ÑzÆÉ$Öˆl«­©ç«=À Ÿ¨oÛ«=8? ‘Z-6 &¼”ö÷™}pFÇÕÏ6Ó„4Ë™ÊÔ%w^èÎ’ÊÖÅ ¶£dVÿIé%É.véæJ•Û™e‚£çc[/eÑnyÜ{+7¡SZ?/&È>4ÓƒŠ,A¤¶cÖl ¦ÖWæh Á}îÅ)\˜ŽÂÁ²6Ëðþ5¬¦ÚF“áqñÔµ[­xg0döŸÿñ’Á ‚kN¼¨!5„®K„Xy É`,0.ãDA—7-Ⱥ `Hn ‹IrXøˆ¨A³Bn‰¢Í»‚H€Ö…4Í€ÒAV÷À–"A[g÷~I²‡L¥ôÇÒZEhU±qS8IPjípü¤¨$YH”Û² î½\CYÃfŸwòØr‘ó Ðó6éû1¤ÆK¯^ o{æ©SÌÕvwÇ°Š¨Fù™³š‰±Ö_2¢•ÕdeØŸÀk’Pï,òKw „Ô¤&®“Òš]@ ‡WHÃdbjŠ|›œ¦Gô÷©JŽžâòÀ¾ë!á>:\¹b4,›Ui‰z{%=Ñð¹Jç*ឈì¬áŠþsž–([¡Ù¬+ ,’z£Úx&þ`wGþ¾ ùÕ®¤WÖúŽ~‹p¢ž¿¯»‹ï¸/õ…_Ø­~'Š‹•iΉ™øËÚ,ð–3ò uÌßbâ›Ã}Ù{‘ö|KCõ¼wxÎÍÍï[ë÷£ÿ›Ü–?×Håöä–Ï ÿe?ù}Þì 2U‡©¥ÂÞãA‘(”¿øóß, ?9s^@2Éî@Vï`w[Mâóf>3Ï„Œ‰SŒ2PdÃôr C˜b¼„!¢0FŽapçÅŸþßþÛôçÿÃ?ûƒURjeú‡-„Ië™Ú;( ãðãïÿŠ€ö{Oó‡øi¾MKúøïÿÝ¿Óf!1¼ûÕú’þÕŸüÉR1àZô‰Œrãäˆ+o`½§@ÔºÝø´Ê¼¯?â¿ÍíR€/äî𭌲íþJ.ø/¾ÇÚ—>ÑÒ£OËlvYéÕrœQ[˜¼b?mø d/mÿ£8í %/ts¶ô\ä-x+ek¨zÎÚW˜Žô=sq©åÌÒH·¾z ¯ò,¶5°­A€Y¶ƒ•‡K{ÍBÌ«bQUnGo”ybŒEÃÈR¬•ܹY6Ú®ó+#™§ í¥ÿ ÞÉ®ÁL†D ÁÆõ& ´„Q{‰V3[AùLŒÛ•Ì7…e*²+E›N£ZúŠOlÝ Y!fž¦#º^æß ´Ùú¾WDÖë%uî 1wÉÇìÛ÷üìð¥¾Qzòê|ÍQüÀ={/gabøìÚ·¦ãêÚËÖ¢<„lYLûÀS›•:øœO`×û)ÜZ[êö·#Þ̧®ïÐëÙ5™ÎnpIh…ÙE‰ ³fõ`îí!¨®ÎDÍÝ™^ªÓù|HH4ÀX¯£pJë0\?£˜ð 4¨œmUH ¦³¹/?>æX,ÊKVŠV(¼V"¦Yi†×o‰F«}­»f¥ÐÍ=š_ÕènÏk/횢Û*Xø•É!ÏçËÊ2¬vØÒÕ¡]8Àåi³3í‹æëöÔÐ~5’¬ÚÖ¸ÉÇ2 ·Üð [(Q\¿ú¨n«h¬= DKT¯ÕÃ\m$+¶ª¯çØ"W§|+€&ó¯©R ã[ëzíGÇÒww(Ü Ùvzæˆ${°6G²5KmÝÚÕG'½˜uÌp&«çAçIc”«Ã jj$Âð7“LȇޑÓçïþæoÒŸ{ ÿ²¬«àE%,r<õâ’9Æ!Yí )™ç`ä4Ï"Œ1Æ9ˆ× ˜W]—!Ȫ׳Ʊ7Ì®#¥ÄˆaXþó·öñ«´ÈV,daÂàè_Ç9DÕ•ƈ!ÜžoË{Caÿïÿò¿ÖŸðŸýÁ”Hˆ„qøÕïÿÞ¶™PbXÛÇ‘ñ b3‚f:–ØÐòPçTÙ}Ïc)G^Ô¯ÉtÜWÛe?¤Pg8zÈmÖ¾o+u3ù ÀJ'Ûânëå²ÒZ©6@AGè+ζÇôž<“Œ‘îû :òV”¡.Tn&·zf=Ž~´õäW":o¹3‹ðWͧ،œ·§QQQDódkŽùž:XÔž)ƒf®vZŒÜæw©Y õ5ãf$ ðš‘Èáâ&y²­‡6•ø@@Y¦ØhNEm£ r­@;‰zE°H±³’£ 7€"1f•WP,ã bÅ¿*ÆÙ [iTi¤¦ä¢ŒÇÊ}V?7KŒ_Sv’q–ÅÆg³6²tkh_yiè$©/²­ðsS½V¨àrIüÃ4߬ˆE»¡”Ô5+k#ÚÅÞl…>H\ªˆ³„+²Ö KµµÊá\K"nº’)›d‹k›Gµ”»ºBæÄ;ÕPŒJÖ². ±ü»>ñJ´k·á—U•£­êkm•kEŒ Õš5S´È%ÌÀ‹$Ρ¬…ãÊùäÈvmé¬.¡“µ±^*zÎkg„Ùaq´•ïN˶G¶•]@‰¹))¡º‘ìõÜ/X\W·¶Ä?\iäËæj…¢{+Ú-Ë]ÌÓÐLY+P3‰Ö#ïqõÒ)•ëtOãŽÜÙšêdõ£¯æ ÊU“*ãŠ_š™§E–ÒfÇŠ’óTY²Œkp‚òÆXÊõüKR4BJ¥óQëY…¡Øõ“ðA­ÖZ•µ”¢õ°µYæ¨Ëй—"rÎÃ5ÁR±ãÁÂ*?¢ää£r‡a·°®²v-Ea·’?X¨‚ Næ:¯o–(Ðiëb…l™™U=/¤ü qµw4â9TÌPìÒÏs©&À(Dnj%ÙZy\‘ÅÐaC‘ŠïW@J&f”TQUøÓ¨<§‡I½ëì”Òèž)9é2²¬ Ý@Y` áPÜõñ´[)_W«H‹€R†Æƒv2Æ–ÄÂÊŸ‡´ePUûÑ1&W[߀ÜÁt©*ÝLUe–8…6ÍPˆl¿/ïâXŸBÕå Ïž6pH‘ªˆU´·m E‡4} ÔzÑêžùAÒ.«bu!hE’‘·Ü´,³X=‘µˆ_q‚ H’!ó£3Ê4aƒ:»þíßýÝŠûÿôqžgNqôXþÖ­GI¦1ŸÇÆqfŒ1Œsœ aœçå–£ .‚ÈCˆ«Yq)) €‘qž9 ÂÃ0Dr&G„#“­DFLsœæ¥†a›EžÂÚ…$>ƒ¥â1Q$rš®Ë{/—Qæa¾Ý†yš–oùë?ÿÍ2‚ÿéúŸa¦ëty÷ô«ú{B‘¸a¤¬­”I%ÜbûQ8œ ”û*ÕÕ‹ Tªä™=[«•Ôö„"«çÁZõô¢ÂúpßÙ›*½ªë­k×_ ±ˆúKo‹b«´inÉÓC·”ùœ- T:§dÞfÉRr(R]­kw¿)aê…ÝÍ4lVö,I/µS) Ì̤Xé²R‚=ödEàâ£|}¢ó[­¾XœPg[%Hžß\L;ý!¹rÖ¨‡uH§r±‹P5)?é1ßà‰çÈÔÏ _KôßÒJ÷) õ¥ÁåƒTÚ”Ižs¯*un°;ñ®Ÿ•R$ÿn-*5GDJV¶|s ˜mÏH÷è¸?þ ^xsnÒÙÚ;'øëùþú†__™ ¾ø©É/yX«Rœ402~êÍàH1ïdhÏoiCFÿQÓ0Þø>[Ò>ùø¨©ÄFþ¯“{­¶5¸±Í‘8ð”z¤Æ1cÙWÇeç§2ð»¦XƒÒói÷Þ/^µà¡22bˆU$}è#û"u$Jâ_ë"5|¡XÒÆ÷¾Ü9Ø´zÃqúhé&$c¤².§æçÛmz÷t‘(!Pþíÿðw"òüÓ‡ù:Í·9γÞèŸzÿÃ0„a˜ç¨$Æ8„$L3†0ÎB‰1NÓ|Ç¥oošç9r3ç€áò4ÌqÓbL·§yG†ËÈ8Cœ¦p…Â8‡!Ünó%`¸ŒÅvÌ¿)D2Î1Æ s  Aæ("¶ž„åvÃ0“¢Brš¦a À0ŒÃ0,Ê?Ã0Ä—ßù·ÿÃß­šCã0^ÆáiüÏÿÍ¿I³Ÿqô˜z—¾AÔß_~_ŸºŒ¢^Šç[+ŠÙ 8:•¸jæ4¼ÆaxwCîÜ…#ø„ûù#uB£üÉ•úûëq¢óø¦Ô¹”<ÚBeàCºÎ¥‰ ù¡Œ€çƒÿ5XUñ$7¸¬BÀrHÌÐnëªÖæµñŸV0È|©­¬YfÙ[i±B¼D¯}6†j¯²šÉÆ+„DÖ€W€UŽÛÚ°Â?ª©Àç«<•5ƒÔÁãrÏ|'s@'¦x¢'öi»`Ò”¯jùÖ²º$ôvôÆ•³™ÑóŽ qïø‹Íµ ½“Ð ‡€¯èôú<;æï‰¼J|ŽÁ„wƒmèƒÊe“…riÕ˜à‘‡‰‚!{wGŸÆD ýN£@ñ[ü„ŸÅ¡‡Ê}þTtÆTÕÍhÙUå<¡@m™[vÊOJ9 •iÞ£Vo+§ëîÍ©ÕTvƒ¦dw‘кeØÐ- ´ïNti›ÓY| ÕÂSëe{8¦»ŠõAzºë$7…R1è o·½k>®^cNÕ7ÔÏüh&“ïøzôšû€’³Ãþª-{ž /¾[€ 4yXÓÈÑ© =‰]À‘À]Š¥GTA5fs¼F³¼»«V‚“÷À(gñŽf Çð(WàÕ ‡oShHß©ª·‰¨Â5š…m{²Ø€±1'Ï­ ©¿ûœ^É’E6"¹aT-Ò"”;Žÿ$ÂH2Fß"ró,åõz»Ý¦qÿþïÿ}€ÈÇŸ>Äë4ݦ8ÍÁ0„´ Ð@"! #EÀ8Ž—8OÕ¹ 1.Çö,€§Ëe޼MñrÆe\/Z./1J@ŒBF Œc›ÑÉakV½=Oaƒ„(ã,2a|w ó< A\ƒ`xºÌä0Íá8”.‹€Ñ4ÇåDçyG™çY ŒqyB!@BÀ9^†)Ad‡ÅuÓ8 ƒa —ƒÄÇqˆs !,ÐÉt›Hη)Nóp›þ?ÿÕÆa†?ù/þH:–»;%ü‰©ú#ÑŒåMÎÓ¬ë/!—ml»†àfõÙzˆ¹·ÃkL?wt‰ˆU Jo§­¹+dBÁÙšW”§[Š:òˆ¹®×¤rEËø£{¶”â÷Úú_“3éxê¦Q¢óî;}x²=¸|ÀùyÂ<:+°e¡Õm”z¾Å?üd[°LýlÝ} D ñ3E#™–e­ìµV)&wþòð3ÿL™AÞΫIAdGqPiÿﬤ_7²3'ªëÙ ¨? SR'uU€¾ }t™¥¸ŽY²Z3J ±Ilè•¥g´0‰´ûÕÖ™E;µgé)’KÃÑOAñP+m_3×(À‹uÙ ‘ÄÞ,6r>AQ È¡á¦Ú꺎4E±| Yý³’«¶Z¼¥õf%& Ũ§´•ˆ'èIÖ°˜†,ý5mûª¹ év(Õæ‰b+üЛ÷ZÔbQ½©Ã—öaØ‘GMž#VN¨¼#çþ-öÒü‚ê— ¹ÿFžÌèëש¾HשּׁR³LOK¢x¤šÉÍZ]À™ah\¢6†É(öxì=»%0kˆ®†ëò«šíÊä_SG霿Âmg d=­—§vÁJmf…«ÞRh°ü3ª@²º¸mà̵¤V{³`±¾B­äQol®TIc“Pêä민"ŪˆI„héO¡Ô‚hê(D¥ƒ´ö&°óοTröÓLOç3O¬lq§ðå|è´]’adÚ3Qªà‘‚ÊRŸ Ó·sa;™kñw3ORx Êä 01¸Vb”526-zG3µ(x*ªÌ¡wI®âs <·m™~3㺛³€ª1y…™îK~ùÇÐö é¥zFj•…ú®ÎJ€BäÅ«…A<׳BªeSCÛE½µÙÀ.¢dâ[¨ª”S˜æ p€ƒ=TÖ2¯-5 FÛ–‘ë}¾(\£ð¤1“b´·©W[iqQ:h-Â=[¯ò¬> õ%m¶?ûm:x¢ê8ƒÉ4²F™UOÓ.‘tbÝÄd­)RÖ.rϬjBœ¦i¼ 1Æÿßÿò¿ˆÈOÿˆÿøó c¼½ÜdŽ‘Èår/ã0 †°^JXAÿ»!„ÀƒãDAXzðÈ@ˆCˆÄmšÆaÃp!§¯·1R ÁÆ0DŠÄY×iÂ,ãÓ¸„È!Î1^oò4C! ã(@œnóm† ‘q–ÈŘ2ÈåýÓ.C¤ˆÈpá4s©kˆH qmùÃÓeÉã%1F‰žž$Îó<‡a¸^¯ÃD%aÀ0àv‡ažãª9Ca¸Žã8Žã*ÆB”¸HïBœ£@†xAó<Çi&9Oó<ÍÂ8üÿïÿ  „0 ò_üQïº‹Š *d=h8 Hj-"7aäbŠÖÒ:màÝxwG«±ï(VºøÛ®Æ:Ÿ3êïÛ.PtX¸&!®°þñúîÉ(n©TY2T­†E«ƒ²þÒ¬ W ²lûj-Ì2êuþÓújJ}= Öì°µ'¼¬FTüÈGjX/… (cdÕEçÔ´à€’¬Ïô_”è<ì4 …¹Õl¤gju° ã‡nuûŽ€óÁ ”2Ê(Û[†»˳¡’‡Ó…ÈŽŸRI*½Ùj/[d¿·‹­ò ÅÅç_Uƒ«›õج:ît÷¬Iþî¬RÊxlD*Äb½$ÑøvƒÅWß :`]cƒmn%:QRVØÁѨ|{½=p’Ž“ €ºôV1`ûÎ…B¼Ü؈>µLtçb(÷nZÁš¥ŒµÊ|ì˜Ãbhl#Ò‡¶?”Mwa‹p[MSà ààežë9Ç+·ž& Â\ûµ„Ç ØåZ~Ø òàƒð‹ô€/à–Ù±8xí®¡7¿ÂÕÌùÝä¥Ú<ôŽÇÝè;7À¦Ê‘FF&¥»?QbŒÿïþ}$ožãLÆùú|W'[†! €Ãe.CÆá2 CX+0kã2.A‹Á¢u³ß)q‰s!gJLÓ,‘‘|ÿt‰sŒ‘2„eÁ† 1ŠˆÌ‘!„„€a.ã8Ïóø4ŠHŒœ‡! cœf\„@€„qœo‘„\.#n×9@D†0àr "Sä%„qÈÇÊ0 [w!!QDDæi@Æ!2`Â8LŒ!„aæy&0^†#ÃeD"% !Ä€yž~|zZ4˜Æqø‘Œ·iÆqž¦8Ïã»K‡0ÏqšWoáÈDXfä0ÿÝûÿüá÷•žù¿øÃ?’T@‚.šo˜^£U˜t\®_íñqÛα :c5^£ÿg7ùT\¨­wS $ƈ­&áôȹÁЉ4-û‚vÏØæã©™ ¸CûÿM­¹Ê‡Oº0¾IÑy^øŒ‰7ï»þ^™ås!fë~üŠ jÓ3VõÅC+4±y¥g#éJ×ЙBµB>ÊòŠ"£#”Ó’”«fY Rê`¾“f~TÃy¤Pb$£áбJâM‡$\cÓDCO\|sE›ÃÚ–½äص¡Û«»ŸIß…~»^˜}$ G7 “¬çJ{+Ö¾(ì½ù÷-¯wîžçį٪á³Dz_E¬:µÁ‡~ì'ö†Æ÷ßç+b†7^B89Ο¢h~íå-¹‹EQÄé»á>`"ܧú°ö¢µÄ­”‘Vv¬äkxfþž“Z83>PÌ,î‹wy¬—Éx}sq»cš^›ŸxJ{7R ½áèÏ ?òL†îâ/ÞZõ ~;àž8½¹Ï“Ç–p|‡|ÃÝo¯À·Þ†S7¸»£ËǪ³‘¾ðÑ®÷ñgqp¯+x'çW±ËîèT©ö§ê³²%êšu°‘Ú4 ¯sHo^ëµuÛ¦ýúwÿŽ"‘rûéÃí:ÍÓDæ9‚ —A£Hxº2ŒãåÝ8 C†Eᇜã$/þ´ËÖ¼¨Å9"N! $Ã*‰/AdŠQÂ02Æ)Bx ÃËmšnÓ|fÊøî Ó¼Z?].·išn×¥y~ƒˆÈôrÆ! ãÀâ4O×ÛpdšçE-ÿ6ß_f¾Ä8ÍÃSÀí:ßp Àûa!‹Kp`¦aˆ‰B9Œã0 2OËÖ;ŽÉHˆä­eÕÁ®å+˜Tø7Coš.Ñð’´­µÕvŠêsYc {Ô©Î'=¹~‹d1î$ǽü_š¨õ+šk\Îó½ O߆蠦EÉÉó¬Üí`ñÅö¸QoÅöLów4 û¿ê`wx‹z}puµâžÇ¿;‹ÎQì‘«geŒÝÙ‘úq Wµgê±»69×™§ÅcywÅøõÔ·ÂêúÈqïd?S‰ç½·ôÀ•sÃÓòíyè ’²ãTGÞ;&´Pººp­*é"d_¥B«ñzþۓó‹(ù šÇ_$yì;š­î9„f¬}D:…wµÕì\¡ŽÝ B%¢Ú¸³©«}kÀµã&ŸèîÙ8£Î…F´Z§-Ü™=¹.tßyXN¦òaµé*4ÆÖ¥à»aHîÇÙë’F(o‰U_´ìQ"qbýñÔ#­:Xjcà218qú” ãøXÀÑ5rGãä‘ÒUê}˜4‹Ãöý€t­GöÖZÁ:šÍ/<ÀBkYD÷ì±ou‚<2¹}Cô%ôóżÞôˆã«bŽ#±ñ×0 ¿‡ý@»ûI¡\•V¥sjë¯ùþ_xð6‹/k?>Ój])Ýf„voI€G+.YÞꓟ¬–V¿ÜØÆ€ €—Bß•àߤK8;aަÁx®Ï°Lä¼›Ý'ž·äyâsnF‡/Xרø©'ÓÆ®GÞÊ< ²>æÒa·í®ëIq1`Þ*<¬zÿ¡¤hAùwû7²ˆõ‹Päåw¦ëmºN ¾L!‚Oïž.—K”Æ1òéér¹Œó—ÆñKHaœtŒÀ(‘ˆ‘@`%ˆÄ8¿¼@Æ1† IÎñzpÃ0LQž¯7!ÆxÃÓx{yž¯·ñéÆ0‘ "‰â-¾p r½Î‡Â<_G˜oãe9^ú™¼»ˆ\F‰ çÛíÇžâûq¢ÌÓM€iæå OŒ·q|™cÞ‰HŒ"†8Ì·HˆDÓme²Í³ aX˜8äÂLŒ‹Ü/b\Ââ¯;OÓí6½{ÿ~‡aV^®/Œ1 93Æ™†0Æ "—‘‘X™»Ë3Ž CD³`S o·y ããÄã|‡wã¿÷ãòL~ûç¾üáÿõ¿^ ¶Öv2æòYYšV ÝD þVcÑû‘¸æ~ÓúÈ¢Òÿ• jnüWmâG¶æÆm¿â:ú_BÂõ­ŠÎaß›¬ÆÄ‡èò‹©ÍYUF˜¦ÝªÁ’é˜pfsõó  À²2BÀ±½%G~E«S]á³Ró‰ÔœþŸVìõ­A4µÖ•(K°)ku¸u´²Óä^gÄ#ŒX€YufÉ‹rD¢ä™R)aõH0÷Ç‘,•-6€å-fý)¶2癤¬èÿ:GÒTX™"Ë=p±ZÞë,,wfܵ 1Ú8ëÙšìbœaE«Ó±_oÑ®-€HÔïB%@Zý Å$‚ÒÎ2oD)„íÓiô˜ô/æ`I—L3 CñJOªD,'$´6…ÈF ¹Õ Iž¨ëKŸXZ’¥NÔo¤¥ÎBÁÊ[pâ)'«EX°¿ ŽPiûä…Ôk.ÏÇgý•Z‡´Ø04i”›µ=Ka°4 å ï6!¹HI1(ùù×jhÚ*ÒÙæÊÏì&«GÕ«‰ó»Fo”hSS¨ê(õè£å¨Ò¬Ñ¨¡ò&LYübI©P¬dP1bM0yp"ù•n$™9én“–‰x\õ½ý×6q/`h*U(½ÿ¡}†–N†'ð\CMnÁ¶­îÅF ËFc­$çÎ}šã]Ëç7VÑUÁØ"Q‰ªZ ™£%‹l÷A«™‡Jˆ¡¥ŸLxÏÊK{L|Ùâº$×âb´á1=€šcZ¾ Îúeµú¶£´x¼¦“a €Û0o¢êI«iÈ©ý¿µ·M@¶€\í(½-J‰IÏ™Ü" )÷ dYr§]uÛ)}Š™èxW3k£­Â•«Vtë~5qK^¢õ’ΖȚk€z*Vês•Oïo†´K­¾?\otúú{_Å]‡îvVeßH&µaVëŒ(']túÒÇoKŒ‰[ɪ¢Xû»pJKržV꺷¶<“šÝî¤]΀"]ËC¬•®ÅÄÜ}@÷Ãê:ìîÆ4Ó›³¢ÈqLpT(•ÁÄÙ»€Ö1Ìé²Rm(k> áįéæçD$1ȬΠU6Wsÿoÿú·ã8NÓ$"·/1Fpž§ëmžcœÂe€ à !„q¼¼¿,˜ûåé`Žs¤Œ— «*=cŒ\* $DC F™#o×ø2ÏóÞ¿‹â|||ÿþÇð|}þ‡ßIøÆ!H 1Ì‚8Ç—Ÿ&¹`xz BÞ®ã0ˆäÓ†k¼=¿ Cx7!pšqûøòqæ¿zº„ø4_ù2]~õþ]ˆÓ,ãeˆa$ez¹Î·ëøþ=dÀ€!aœçy@bšGJŒq¾ECñznSòà} â4E,ˆ9ÎÓ‚ãí6Œ#oq^‡a—ë- C’B¸NÓÂé"`dÇa~†y8“áÈ8ÅÛmâm¾^g¼„ù:ïÆw¿þ1MÖ¿øÓ?‘?ú×ÿZ RAF-l¹F*Èg%¨âÞ£)µ.l#½ÓÛ 7Ýck­>";o©+…)ZFC¡¿ÚBóÇ6ó´îaEQúG:‹õêíÉnÅÖÜ‘²çÁéÔ ¥9iÔñ§ÏÔ(&ÀÂN´êæéiPZÅúÔÁ›¶»ŒîX¬]¿¦tiÏc êÚ"1Ù;x¾iÑyxÓ¯H0Ë^i£×Š}†HqñU À »MnÉúË´ŽOR4âqêß^¢{¨BX)ºè‚Š"Y7¸ëÑQ}l$Ýûvà´o÷=@‚ã=ù"GÖcMÁì@ «kG‘7¤§‡9¨K+‹é6ŸÉÈ8Kœ“šMàKAPfÛ*7¯Ó¸ô¤ õÌQµ°³]ulÖ‚û†…UQ(ö·K hÖ‹bAC²Å8tæÑ(Žû(ã9Ù¡– σ§½z8ü­gŸ`Í«k)QeFüŽ¢Ð)zø øÃ|®cÀàn?õ¯³U88phÈ×<ìUÈú}Šò¼WÏ8éTÔ–`žATK°A²9ƒ•;»XŒC¥¢=¯q¸{µÚ^µ7îÔf¤V!²•_ÍäØ8ºŸÑØâ¢ñðð€U§ÝÕ°y¢uë@uRðV§' žë* Ì¢‚¡±b#Ñç ª*v¤;ûŠzXÆ—*·êç‰ÇÔåCúéóÞZ£±8ÑÕ"Sö§&«’OO^hwÖƒš:Ÿ¯ÿmÊM Tëg€‡‰Ûéäk¦ÐÁ„÷l Ê¢5@kÙ¦vàÚAO³® 1ŠuÔ; «@ÙÇg­Ö3û^6[lVv劓Àí‘®ÅpÏÍô%z¦3ÎÕî]Ο Üýy¥ü|"ÊJ%‚&««z ¼Ï¡Ú^²xd{Òa\à~AéŒCg5OÕ±ëdà×Á"S %ݬƒ±,Ìh† YŸ/Ÿ\XžTÔûe¶ÇËZÏø»¿þk ²<ÿôaz¹qfŒq½Ž„K†áò4b ã0Å(2 c`ÇË0 ·é*"Ã9Ïó0Fr’ÓDHyº\dºÅiŽÓM®?¾LÏsŒq ažï.7áô»áÆaQô‰˜¯/_Âåòö»Ÿã<Ç[¼N·wïß¿» />Þ^n|¾þzŽ/_âüyúÝOaç—þÉO?<…iâ8\§y~™ã»Ë ãHÊ|›1Ëôñ#nóÓ ¼\†aßM/²\íõ6†?L×ç‰a·ëÆ„ ¦/óËuC¼IÀÃe˜'Ä8s–ñr ˜ù|“a æ‰Ãnq¾½à:ï.Óm¾Íq|ºLÓM‚ŒãEÉ€§§Ëp½]0=?`ÆB˜!BÞæxC|¹ !ó0 –iÂ0Ä2ˆÄiqžã4Í·/ómº>ß.ï/ïUà7ú§ü¯ÿµ‰ƒ"7f-ªêbœËî>³y(¬• ]<®1þP»vÊj;¾è-Ñ®Xõ³uIuÜȽ Ï;treðÐÀí²M‹úE1N@^\Ž”þtur_ W†ÞúWÍA­IaÕ]Ùâ·-:/µi!¼óÒ4¶Scy´åó& ýOL.ëÁNdÈ+NåGÀ†{lµÃ¤ g`—qÝ¥—ý¨ð á®™°‚²#‡Ž²d\ôrÎîó;êß*Ãr”bÿ¨ˆµç>rÑü‰Ñòò´õÇŠîwÛ¾¸­ädÒH´·{ùڦݭGþîpùé_4÷A$±ïª7ß_ßÔë"¥ó–§·¼A8ò Ê{êL8­¹/÷}E~¼6HMör}£ƒ¸~=j­ñç#HÆ4Ý _Ìbš÷»þ?ߥVv¬…ùFúK~Þ ý~Öþ¢ûÐÄûÌr–è ™Œ¶Õ^—$(P·ºJZ±4ñ7¿ýmƈDpýùÃ<Oó»§Þ]€AžçùùåúòòÄ_äãM~÷ñežŸÆÇw™çÿó|šgü“ç7þðž¿{¾=?_~|7ÿþÃïæ[ cGùù?~ÓÞ]1OÓ‡—ÿáç!NáçáWï¯2 džæðñúî‡À/·—[/üðÌ—Ûü4ÎÏ3…Ï×[a|æ— òax7Æ—› óLN×ÛðîégÆy\&0òã<Ç3n“Ls$åW¿¾@Âür•ézæù6ažFÆyŽó,dŒÓ<ÇM!SŒã‰Ø1ÊmŽ?<]Æ€Û4b 2 ! „Ûm s¼„™‘×ëM®·8M·×ñi†áé×?@äÏþôOÓDùçôGTvÙ@&<Öå‹ß fpíZ"búx|ÕéÂ÷óL~Ù¢óÛB1­é&L7'<›(Õ©«Ø^<ðÖûо’#»À‰Â1ý2l›< |mZ3rƒ»6Ä6I˜:´Ç´yLæ½ëGZk°)Aæò ‹¥ ÝdékRXë –Z›øSo´ªAln=‰œ#¹Šþ«AäwS$l=ÙØÔ–d¹Þ !Š ùÚ¬F_H9Õ¡˜+z‚*·§ò·U™^Xq2?JVcc£«c‘È¥òAfsç5Ƽ:™ˆOLN& U³aQVò ß•Û3¬zþ‘%Z«/dž å‚bÞ'u@}5Ša]Y+¤ÁC¦È5»;)D]«‚¯ª¢õR\ãÕ„"¾›¬ó$q æ©›ÿÙ=)®ºY*Õéèþ{¿¸|Gè¨|³ÁÊO˜ÕSÉ T‚6‹.Rõ8Ù¥ýtD -ÔÑ›ÚqR×"j?ö& \O°¶Ø’2xU¿¼±ò<¦-ë©›Ù6xIÿz:äÀ<÷¿È´ëîlTM”Þ§šNæ[$ñ"7ü¦ù§Oëâ ÷¹,VÉa½·7 ŸÚ©9 ä-]ÕIÒe¥Þ­]‹šæì4 ë)¤;^½(Îó/ʤµ‰Iéü›¥wÊ1Ü- ͨ¬˜ýœê¹ë€9«ÜÔÂG‰¥Š¬eSžip„žÍÒ¯üÔœ‹i™OlÒép.X)(Ó ÒO¼U’€:È…ß.V<½¢‡qË5˜¢M¾ãr„ÌñrxU¯¿ýíoÝðü»ó<3.ÎwÓ2¼à0^ÂÈ0ŒC㸔BÃÌ™3Ç! €q^Ûè¦g^.Aæi–yŠ!È$·Û5ÈL ‰çÛóOC|¹N³`Ž0I@ œ¯)·nÓ8@nóuÁ[Ça|?Þž§ùÃGH˜æ8D>…ðôþ"œGÁÇÛ4ŽÃôáï.ÃO !„ˈÈx›ñn%¾üÃË,a¾Üx‹1Jøá/ˆq˜ùùy¾Žñ2¿Ç«„çŸ_ž‰iB”ñv»þãËpåÝ‘ñ)—aº^“j”(säÏSüðA‚¼ûáÃ_½›cä‡I®Wyù¿›_¦8ÏF¼{z÷O ˆÓ,$£Äk¼Þ~â‡adˆžpæx?`¦<_cä<¿Ä[d¸‰‘ë™7 ò„!õ"„1È‚nÈ%<].ÃÓ4]ç8Mœf™¦83Nóõ:]nS†—çë8ÂÓ¯ß!@ä¯óùƒõ/M|½A:)†‚I˜Q& žm^ps°ÂeµdÜžý¸³M¥eG–9T‹Š´ûÉýc«Ú"r 9Ý9”bdŽ®]ZSB “õ†ì(-m'³JSÞ„IÙ· VõE-/ ¨JÜNkr´ðYïD×…3àØ0¹-L4Î*Ðà:‚Ò ±u–—UyE~!¢óÒBÉs¨»æå•§ñú…°-T9,X–è2€ú?ÜòÀnu5bÉ´1G¿rÐÉÏ;ÐLÑ£/©˜Vû‹[̸u®/ñ´§1°üÕ¨° W%äÉí`o´˜TÁÈIagme®7ûؤ+ Niúú*œÇð\Hˆy¡½2rŽŒ³Hêý(ä±eðýÝpÅÇ™6†õ o”à*¨äÀ>ÔºßÜèï,ƳçŒ^-ÔS{G«jƒcÛJìC%|cŽìÜwmOÁâÈj“y­ 6¦pC6¥y÷<æàŽÞtÔ,þ`5X€K6[éíK¹a-ŠWK¸˜`n1º~Ci.ýãÅ…)H4ˆë“WÖt ‹ Í4–n´I;gD­3/Š)LîL$œ,–½úÕvOÓ-%ÍÝû_Š‹ßy¡`§ÂÖ*—>¤QªEÍ®«#Y$%ÆÕKÚ@ð¤Ö’çDY`S·×ªîíb ú¿bŒ!„ú׿©&zÏH`¿õ‰™M\Ôù]æ”^I?ãèN0zð|'òÑ®U)1jH3ø²øb‘Î28Àù¶¸Ø¡@½1’vÅnÚ;G´8bß­éÝYbg*Ú©ÝÙA(„¦Í¢Y‘±ÅUH7;÷.MBXpÿ€ý·Hdm¹’ßþÅ_´.éùwy{¾^oSa aŽ|zž.#çñÝS‚ø/×úqœ§Ée™Â(‚ižcœdºNb Jœ¦)rþÇŸÃO1!€· œ!!„1ó5NÏ·ÛuÂ9Çaž x)a ¼NÓËÓñ¦iŽžDçùåv[|„£DΘæ)Æ äóU€ççç(ˆ!üø.¾LO¿ÿ+"Œ¿zÞ¿“ynsŒˆor›…—ëmšåéé9‹\_æiº ×9Œ#§q¸Ý¢¼‡a “H|ž†Kàx .ŸFÈ-ò÷ÄóËËLjL·+¯‘·Ûðã»á‡wL7™g‰?ß¼Îñv‰ó,ÃÓðþŸüd&0<ˆÓõÃs¼Î"׉?¼Ãe”)"Î?<=×™sœ‚aH;<âçCD *, 0 —(CˆÃ„1ÌSŒsŒó$‘‘Ó|“ Â^^®?¼z¿ÿí_þUš9ð/ÿQ–êWïWÙ/\¸ 5 O’øø6ÞG{='¤#§uF5ëDŸ;Ec’-ÏåH%gRû¡ j 8„b£ˆ ‹ö“M¿éÈ&ôZý%6ÍÞKM¬nAVóÑg:b!¯iCçAßÀo^t^|V½è±5`¦V}ºO¤„, lD×[1Ò‚ë.ðM¼PöC-ÿídÛ`›CBÂé¢(Ü“+§ÝËýåìys ³èÕY²ùPv°¡"¨£ÄHF2‚‘Ø †êQm 5/Â’ÉA¹ë{l±H/pWûEªY¾ïÌ9) þýõýõýõýu0ûÅÜê™øŽ£çŸ»yÄðßO™û_‘19»ÙÀ÷±9ˆzJtþîoyíXù2ª‹ûÁשû *ËWnl¥B¦›.Â4ý€Œd`HÉOÜìoÙî%ÊÏÕK¬n–;v4|ÑÍú6Uä Lx• Ÿ Ffý’+çUDuwUvŽÍu‘.^ûkü¡"¡òLÎ2<‰ˆ”5°Š©°€Ø¾¦›º ’ªÔKikÓ“Ig]þ„õXê¬ð¤Z¶QH„ª nŠm¼wW^?*W4<æޝ‹:Fz0Èl§m6Elv}´d[ë]‡°·ˆý±R›­ôàhCø7j££‚‚c‹Q|šÇ›ž#ð5ƒªGÞî{¼ÿÜRCêà…¥5Ð2[!¶Ëæx·°pý¡|€d1-ç¢ì³rêÐmÁ›JÎÈïXŠ”ˆÛ× Ç`Q{c¢ÜÙÚ{hõêå­ÄÎ×–V+†ÀTý…Åý)DÙ/$º¨‹êg%‰ß "ã(†¸ù÷Æ(Œ1`˜£,Ûô»÷—8SÂ8ÆyŽ· ¤DŽãí†H’·ëÄ)âz»>_‡q~ø½H÷7¹ä_üñ§ØW´æ 5)Jq€Qñ¤JeD&Ñb¸jËÈ–kBz½)ͽÁk¤®ÿFÓ›jù^>4DD¢HH­âí=›…‹‘ ‹u_Tº;̉j˜º½cÅ£yUˆIr,ü!Cw£T¥6÷ºL©†$‘¢;Н_tþ¸s!ÒG—z¬êÔ3{¡—Õú6)Ôe¹Ù„M¦€“¦%«p“É·|öº‡Žh'p6ës(YÌt“KèR^m¶šT»¦‡b·àAYCå³b§ôúv ½Ÿ{3ñ˜J”‰u®ã˜ClwºaÁ+Ml@»X^ Kca"cZ~_Š(1&=2%o¬ ;‡›Ä¬ Y1%x>„[O#š #c“ Zz_G‹EZ¦éÉ€;=]µ‹ä¼BcØD#}û`aM3}„ЄmÑsÑû\zœ ¤ßdîŸjÚ™ xZ©›·EOކ•Q3w÷óú€/#}ˆÔcÑ¥}ñ@0Ð)Ÿ9¸yÐ… „ðIÚ6“'-¤c=®µäé+5ë´ãËuªÓ\ºuƤø^W“±(7Nx JÕ0 %Q†b»‘ºhÖ)mí#ø:RÀ"ô^ú|P®¬ë‡N£Èb¥}Š…â¶ýxØ eèCnmþfǃ‚’‚‡š×ÓTAyTåzY¤@ûáªÕÁ©"Õ~OnÒMR#@Qê$é6ÙAs:º¨€ÄHÅöÆ^iVfyc=‹pMMg€Û"{6ôü{k64[ /ÖÕ¥ãÞ2öfC(NŸƒNåéß%w–™œYÜÆ¡Ô:0õÚÏU{=í]WW×*Î릈²²Œ¦ýŸº&b-:2ùCêÀ€xÌcrœö¿ÄÞJh”‡— Qõm¯‹vAº®Ãˆ¡×¯l1 ä 8õEÁ6(vŠI ¨Ø4¾Ž;j?Ó¼8sÒ­¬Ð·M¦s2˜Ü¹òÀÚqˆG Q¶ÅJ™k0 {™ÕÙ™N0`ˆ©ý@jr¹VÀSŸ/â°ÜƒÇè©Qƒe*7nF3ÚMÌÑh–J( ±ÛìÊå3KÌÒQO©=í©Ä–s¸Ä“* ˜fjRô¶'Z L‰„o2"òþçÃ0F®‡k*¼üôqºÞæÛç9 ¬9 \Æ!ãxyº$ †Ë»0CŒaŽÃ%ܦ†°È̓H@‘ÀçÛüÓË@Þ?Â0Ë<}˜g"Þ^ž‡ç—ùùy¾1ÎK«ÿm@$€yŠÓÇ«ÜbC A~õþçÿòÿ"1\~ýëé"2·xýŸÿþÝ?ù•·ÏןŸåÂiGŽ!Î÷›çŸ_d¼¾È0ŒÃ8†ef”9 —A†¹ý‡ÿ!^¯q¦Ì12bàåÇwÃðÄm~žÉaž†A@‰—wüñ×2 ÃÇŸæ—ù†(ó‰é6aüa|ÿ4ÊãËø'ÿ',ÈÀûwCàüÓ3Éù:Çé&Œãô4<]0OÏÏó²SL׉Œ×ç—8óý»—aoÓŒ1LÏ·÷¿Â—ùv{™'^g\†c1Åáýé#"ÇËFâz{¹NןŸÃ%`ÇÁ0Åù:ñz›øë1‚æ9bns O—!C@r˜æ(óxIÆ9H1RG×q¾Ýâ4“‘”8ÍÓEnaÓõv¹ŒÃ0¼ûõiÚþöÏÿ|)˜r£’ð½ØÖ$I˜†ró³À«µ;êíî›*àQê.¸ª»%o’né½Þ–3ºfUʽœZa²¶G²ï¨«¦“¤*kZ,êœÅuº3Ê6`îå1€þг°}l”b0n­»[ê8&z—f²TÖ@êb8)À`ÁSŒß©1|“¢óMíºtw«˜q¢K=na ™Ó)Ö@6udÝË¢qy>¼çƒ¬‘±‡0•ˆlû“yr_õhlæ¹¾jÔ(k,¼'ô놌µáeAðDž±×½kÂ9¨ëRB“™ÅÏýoïSR{¿± µrs.@±×Ô0Q;-Ëë˜Z<®÷üå¼xøÒ_=³¿Þ¾³µ?÷ ý‚¦Â›~Q#ú•lßÙÚ&`à=€×ùT©Ó;¸`ó—÷’¿™Bým`÷<ï¡;ëãîçËÜçñª»jY´ä€\À›D¢Ÿôèæ«?ç(à-æÓ)ɗ͝rŸ¯EÉNídI·,amõ†Å¨Ù¾?â’® iù›ß ð|t†c|ü‡ŸoÏ×8Í«KGˆ¸¼»HÀxÃ0r†qnó|0½¿Œc€üô"e øø2¼¿¯Ó8„ çør»ãÆq„2MŒÆqœ§)þü<>Ocdá0ÍÏñãm\úâb˜I^.ÿûÿzºÞ8> ?þðÃòO¯ÿð»ùöaˆ/S ÊËK¼~ýc¼}”Û3$ÎÂøC˜úxûø"⻋¼H Á™39<ÍÓGàJ’x’ ñç#Ç 8óÄÈxE ¸F\FÆëLÁ?Ó$s†ćó5Æ òÃ{~ü0ýî9â6ÇøÓÿõÿÂeüñéòëÇ_ý^#ýÃ8„€Àiž)òt‘a Oc\åº ·p¼>O/Ï×ù§ùúá™aß_ÆAn>†ùiøñÎÓíeÂóõúñöôn§Ë€p¹È8ðz½ÆâmþùwÞ¿¿¼ÿ43@0M1.!`žã‡§1’$@n1†aE"%0bZ܆ 3DD¦È†A†Yd¸!R¢Ló$‘Bršç9ò:…a˜^nƒ®¤2€d5/j…d¿´æÓ†½¨\Î6¿!¹,Ô5Ÿ}Ç4¾òüoGtþ\ÔœmÈ|PÉ€ÞÇ{ÞQo4÷û<òqìcã©:JÊ—RÏ‚2åUœ–­÷?×{ŒIÍvV]&Ç­V› MºïZ&LRSŒ E°}Ûµ­¥+G̓‡mÍ.Ý dëöR¶Mº©X×q·ë,2RakÉC*¦ª/Ì_P€3r<æƒüFõÍ-Íi¹^Ÿ¤ÓdˆÃ þž`z™Ë&Ä®>MÏsëøÅUÕ¤¢½ÚùºóƵ~Ï)ì‡oK÷PÒÌ'|’Ã’ŸzpªÖW¼:|ÒÈFk1 q™`WлXÚ„Î]+ÝÏ+bÅžŒmj=87<=û#·&Ü9<=6Χ]ä^“í1é*˜ÞG>É¢žÀ›}ÉÎyˆ‡l1\êMºì5–O±3!ÕÞGÓ%KKü*n´AG8·±›ûÈ#”^Á5É-ÄIÆæÌŠ5›©³õe)v¸æœ€ *³aÞ3«ìÓW4ᚆ¯ˆU#³òI_†ìîIö±ã¢c VøE´´ŽKB5B=Iâ™÷À¾ã§Vö§› œ£5å³,ÕŸnç\« Ò Ø;FݬG?±E¦–É2ô»Ý »G/ h™?›… ô'v§·Ã÷Ó z™¤¦[Mu޼Ž4$lr²‰jÉ­¯¼0÷~ÿæ·¥ÿóþèOÈøWõ—"c\;5—Ÿ?N׉‘Óõ&‘X°^H†0„!BÂe|º\LqæÚå6…KàŒ™¼ ó^ž‡÷ã|›æÏO¿úA¦™×YD¦yž_æÛM†€™·ÏOï/Ï?˜oóü4`ºÅ[”ée¼o!LqD^æaœ†ßûÕËÿô×/?ÿ4ýü3ç+8óçiz¹q9ß 2þ:ÌD| 2ð‡_M/ŸççL·ëK¼¾`×›ñ†pÁ8âÃ?H$†'†a¾ÍC˜/GÆHy™¦›ÄA8ÈR‰ÃÌ+â‘‘$ƒDÄqœG ómæ|•x ˜‚@>Ä8ÏqƒLÏq¾IˆqˆaÄð6É<‡p…Œï¯fŽÃ0ŽCÃÞr~ùÝ3_nÓÇÿ0Å9ÞfΘ#ÂðûáýÈwcˆäõ#æaŒÏÏ/?߯Q†[œñ#9MÓ»§ÏsŒ!¾|x–iºÅqúé%yÿã‘2"Èiâ<Ç!L‘óõ6> 1Jyo/Ó0 r €Œ!,F°0<„$ $FÄ9ÊÃ$cWå„yšæi Ãt½%“€¥ ð/ÿøOÔÖ†Ls^õ"ü£n¸ªšÿë^*u„jÍœÐ$tÎ=úSQ4}õYÍîqÍ:ë9¹ùßt@«tR…+Ò9L·mðÑï–ñvùÓc; ¾jÑy+òÄf¾¡>Ï%;UÑTÑ£. !ÈBw{ƒ €1¼%%6GR¿š¬äÞZ}‘ÔÉNݵª­scÂ$6 M:1MáXM›© ÷lоaýá.J¶Á˜ŸgÖ:³tÍÙÔÞ\Ž=&nøI ˜'4¡ÝÌkÌ ’Ù&[ùQcZDTÚVbĤ2Ð ½7¬hñWµðDÑ®¬RÉvõI:'…;g'mØÏ,Mµ{ZVâ0…=»˜íìQUyêÿpJBúpj Iµ°õÚ@t »`À;Ø<ÚÄV·X?#ºhh!¢p`ßT¨A;fqjAf2Ô׃Vêê}€7wP¢×t/; I´„P•AšPæ´(I8ιʦL"p(”tW 4‹?kÁNo$¡ûì¡C'”O¨Þõ€ôÂë»;5wÝñæÅ_ ».Ógl«ÒŽWz@õóRÙŹµ2K@ª7a"þ\R–‡`¼løZ¥g©þàO7Ÿëûßÿ×Lòôæ¹ëÜ„¼t]Ûõ?cf– 0ë9çÒß¡1€&§œ$ZIº§ÆºSQסÜ jH†G)ìüðÐAÒúS©œq~‘))ÎÏÝÛÓLM†¥d†¶ ²ùO\~æÞ>ÅélÑ/ÑÁ])NHaôpÄ~”.” ܬ0"ŠLH€yáEÞe(% ´2 ´aÌFlO)+ºˆ^Õ€Ù Z‰frtѵ 9, b †prÐ’¬9„ž3P9'w„Â;Ðéz›»g{8X{P~°Ã!¥£ ]¡½= ›—Î,@—Ææ“¦;·j½ýéO¬Irj¾óÝ|LñêøðúáðêÂùoÞžŸ[;¤ ±-áBNÌMzýøê{¯¼D,tløüùÙ¤®âaÙ HÍOíáá@”ö‹óù¹}|ý`j Ír2BJ®HÉ L@NI@ñ’šLÏ`aR>!/.Cî.W„{ bÖo'­à?þÃ?ègݯÿæoM¡âq% qѦŸ|Õ†þüôævXž³øÑFf´Ú”/†«¶ ží(3+oz°=´]¤¸Îî¿Lãg3[?ÓS¸dj瑘µRßíe˪v-Ž •š{aW6áá´³‹–ÉÅ_¤¾‡:Ö Þ~1¿Éë»>t{ÛC‡êúÎ3 Odnñ_XFRí`®2ÊÜj«ý¬_TèüF¬ln§-zTÝünZ¥BÍÒõ´Y8á3ßL6@#}èCäjˆwplî~ËÛ¹“—=`§zS{1ïÜô†aµó¼7²a/j®¥1Q÷¹ë|Hw»&{FäüO&B¦fûtp®ùÎ1Û•XÚBñf§VžÕ.õ ý¹ªÇó1¿XáZßâ2¾ý|ææË×â×½ZÅ-]9?þ{|Qíä·½©?ßÇ?ܤUÕ¨hÔU‚h2ñ…ë•ëtéݬÞá©ß92cU~Ýž›©¹Y¼k˾ûÎÅ»_4v¼²Í[¿«àåU‡_ÅÖ³*(¯üµ*‹ÉüÁ{ûn·|c*ÜÕ¨{× ¡&¯¸Bià."éí?ly×/^®Å­ªŠ¯ŒyŽ0 ×"™cèÕä´  yÙª7ÉKøž—ÌôJ[c›ºJM¾™,Ç"#¦Á!ÿáÿÑÍA8¿y.‡{)¡ˆDú€ÿ¡„œÌ,ƒ¦d©I´DÅ!'ÒäŽQkÀˆCBr tl;g)í[ËÇ ƒŸÎÌpv<s ¢œϹiì¡)ç³ N¨c¦’±œ[€©Év<œþâRm{¦N®(É#^r–ÂôôŒÎ"ÜšÌò,© ©“»I&#s îA$B9CчKÓdNÑÐ`H&)d–Òƒ£ =Ã"„0šB°Üx{v åìQ¢@¦8$¤×ÞY™Ù‘# •ÜÑ–­Ÿ:;$4G¥L6qîR˜%y„·ÅOYxë¡æ˜›Ç,Ñ:¥þåOYŒo¢_ù;ísËœìÓc>™@#Œ(mk<ž¾cYèzã8øPÿwi”¹F/˜´¬ßÀÛçª_䂬â]®{¬n¿Rh,¯õO|ûùj¢Í[-H߸ÿRÃ"m}ú*-(¾ßì¾kžóÃÜ(÷¾¸nw{Ç»¿o'¬ “9™dÅ VuæÞ¿¼pËÚÓVýàAÁ÷ç9|…óöÞA\•ôG“ª>U`iop.Âö~Ò@WÛ9Wö~OkúšÑô¾[ä6Õwm:Ts. ßó¥éÎû^ +u…ÿ~#|ת)©€|¯›ì @%†ºa‘×x·Zñ²:µÞ4È­ó‚/½9+  ְ̂+ºà§¯¯ìüŸ~Ô>Ÿ%J1…JgÞ1§G@ 4dAÃóüìÕ§ÝÛçòödÁ””L t.0$¢YJÈv:KQ:XIYDf„Y"P,; ,$cd…"HH ‚¹¯m6SäDÕéù Ë­)0,)<—Ãñu~mÅQ¢=6HÖDëP0›Y0ÓŽ€<ΘšÔ•x~ôçüæ?HÎÿâ7"Ù,Kêέ¿9ŠûCã§ÎK Ð;Kéóœ_™âéŒl‡‡‡3™|>=4M:d)Ф‡Cr¨+HÉ já*á¥ø¹É’Ö—7§d4"¬—ŒFZJ³T’»³É©4r÷(.É‹Gñ5è‡ôGþË_ÿû³®¸: Ì)PréáÜŠ%/ø?zÏsóšæÊ–/= õr#ë"ºÔ¥ìƒ­ìïRPûŽ˜÷8¸wG’wð7$Dós¿u¢ßhˆá<9¾†C.ºB§û´,¿hÊ‘é G¸êàæ ¯›vpk¯‰u3Äʧª g3ùol.à ,r Èê"Ü<%r€Å„ ÛT´ÃtÖ"B_«-W˿ΠÌÅ£‡Áb.äLF °ç~¢§ö™§/šú¸©¥À-9Ó/¶Ë…rDTà Öõ›—¹6/^š4k£}â­ïrŒ6_æÝÔí›&#&ì?W Ÿ :jRË:}#,yLœÅ €¸e=î7`¬!"BÕÜ0œUÄm–çûxÌ_YœŸ-—Fi±jÐX=ÁÖÔØÌ~}š±Ë{¹%®þ‘‰åc.¨Îe ‡¸tÎí¬à¾ñÝã>ÐÄ÷ØÊ×o#n´þnbcõï^kZ©V³”›»ÀU­ç´¶ ‚k×P[ $޽¥\¸yóAÜìp•ì² ³›X$Ú‹¬U\¥êVóôBl«V+ä÷°»‘ í'fgà­ÞûøÛP¤jßÒ~ QX_zÿ“|y–êÒ¿ªäxkÄÙ|ŸÐœïQ¿øˆ©Z›œùïœ/jð…¡'.Þìõ0yÍ0—æÛÓ&[3k§~Œu#êºÄ¸:H9’ňÌîvîi¿¸Þûx ¦µ5Mî*h]n-ªb3+³ŽUË‚¯¸Yžyy•ªóœ=Å-œýz‡ØØ6µq2N¦Ûl­¨]FRUW0Î…ªb·ç¸šCZoõä^HM ¢Ñ¢¼z;"Îkîq…¬é”¨9_Ú2KÔ¢Å/,ì‹ÕXõÅÞ^“{33~Ðë´è/ç†kfo íÒÐ'/oÖXÕ¡ü«õ>À먹ksI”,è±õ¸:”˜`¨Âë¦"+â¾h¯j­Ü;³#««^ŠšQ‹Ð?7⿬‰sw( hÉ"—–ô4õ—Ø|Þ*"_;ýÙzYVõ»›írµ·4÷æÖˆÈi¯œ“ëfý¥‰´Ê,t¬VòÁÅ’«²ì¼#͸î Ùè&¯–älç‰å³îŽKÙ?oe)xɨFUa˜bôïï‹û¿yvw•pwy M‡ÌØÓ~ÌxȉÉúdEHÉ„¨pÏ€ !'ƒ\hKaN綤R˜Í;Έ&«+Ôµ]÷|n jsy>[DnRWú…,IAâé§Ïo~ÚyI‚1¢t‚‚p¹û9 îaB@!z ©Aˆ,NJ+¾DÀL4y0f‚шdDºL]“Ëß¶Éh†|àñ^¬´Fæ”Øn! U$1r¿“pw„Ì (d—T² ÌM KpIE‡D[dTb(˜,AÑDFज़pïÞª´©œD>H4FqÈëÎî]}׆oÅäçóÏ£x~ȇ×ï‰éü6E€Ö˜y×F~hÚ}ù¶éºî¡I‡´îÍÛ•”2arDé‡C>è^tWÒÃ]{Ž¢üØ4M##B¤¥LMI<‚ aRéR$åÜPˆ&(E‰®mÃÃÝ‚ä]ñR\ ?ÿÓ?ðwþÞ¯_jQéÁp¢p –ç½=SóÍpÞk­š#® mš¦ë°á¯³êHAе&‘֬Ί>ŠÍ>´uhOk}{b&[æ,5Ľúÿ\/Ø… >êf(s‚ÉTFN-žB ú1P…*L!¯k)lA2ïJAOÕ2Ú°.¡°•H×éivpéë’Z®-¢õ¡õM‚Î×A6ÎOúɰ¯'O?Vö+×L×M´žó‰Í‘´gêÊ¿®û®_GÚs¯§š6QNüS£ÀÖ è…•›1ÞúëÚUÝ@}­­æÔ³ÝØ!ßa<†”áPTÕ(w<½µ¾æt¶u³zÿ§œ]Iïr+_oÀ7¶Í€fßy™Ukú7¯àCW‚¡Ûh±øfð:6‚)»GìKOuDõÅÄŸ«wÿâ’› ¹¤ÂÍiÓ«Ý5;>@w§ÿMäß­øãíCñþáµÄÕG]õ³œÑ˜AªB„[àÛ+/[T×Ëòçò º@KUÍûŸbaýÕK;³P«.uݘÕ{^èÂ{ÏèotܯüÞ«~{ØoyÚZ\•[Ÿ+ÁÖ•F-‚ZW?“«ˆÉ»X¢0 ÍǺ9o\lÖ-8Ï÷™+¬¶ˆ)¦»;v-ª9íŸ×,¯;K7Ïü{œk…×KL9Ë1í<´–6Ã6†zŽþ™Ò"¼l­Ë „I©­®'ojì¸'úzóämñÎÃ]’Ñ&É›d¹ÉL4ô‚¿ù˜IRN)‘@DÎ% `d2²xîË<¢ë¼-:4‡ Yy{¸ŸZ?£9¤æÕ!¡·? °‹ÜÝKIPnéÏOmN`’ŸÎϧg–ÎRktƒ·†ÂQHæCŸû(ÔF*L.SÇ€õj@¢¨œ•ˆ 4þBHÐ$ôœÍLÑaÉr)nLDscçÊ`s¦&È!܈žD8ÍàF&³¢¦”3Ãi‘r²Ê3H0…„œ`0f°)!: •§/žÒ[X&+g‹b½;ÃÀdá€,% šÌ,ƒ%Jçd0/XÍu´ïÿ~µöÀvžzM~qDfñ‡õŸs—Û«‰¼+¸vuáò=7qnô0^—|¨Œ©pQ«–úÕä%)Y Õï¸ê.0õMÉ+ ù1‡AüÉüáÍçíKþ£x…@™zâ;dfL)%³”‚{Ä!ådCC‚BV"JqÑʤÜXN&å¶CzhÚRð›èJyÕ”®ë’ œ‹™(Pûå¹{>¿ûúøê^Ü£säïfx´'!¤ðÜäœSЇÇãPÛõ©‘óc‚¢xJ)5Ù²YNŠP‰(î5Èc8M’•SÇlüoþí?øÇÿ±ÏI5×ÊÒ·OÓ€hë_WµjÒ`%›,N†›Æ?×¥³îúÕ¡Æ{æ­oåVÓçÝÙãªôðgZïãgf \<¯ø2-4 þ}.ӴعMºµ%ÎV›;Þ•èÿÆkÖ„ž[V—EàUÄ™ë|87k¢VÆEgÒrÛœÙDË·³5•®Òݶ̩ la±1.›Kf ;ãÜÁX˜êc`»ye‹\±óÖêC}…nühv×o“\mÀZPäœWriíÒr^]L’´|ÿû7§x9u¥+Þv^ܽ¨“ ÑR²d©É)™†˜6™-ç†f.(á…Ddy,Ž;f2’Y¨œ[Š–å§#ð܆»!šdÏ‚Y4 mQ(JøOþcdFÇÔXj”ˆ¥Â½œŸJjÐ4t0–·\ —S!AvŽRºÒu%'Qङ%KLr…G8"”=QÖ É‚¦¸‹@J´0Ñ‚VúDAï(tväñxðÎÁ""Jˆ§~Fzœ dÄ9TaH@ ¹åˆ¾QN`HŽ1† Is\AZ?)F–3ádF“)ÐsP(˜#Ì»”.FtT’§ %©3*D’H£5‰ù@*gujÀu¤<Žm>í)òc“ÍÎOç’§ÏãÜzŽîÜxèôÔ~ú«ßùôW¿CƒÉ 8ä\Î¥éÚrj›cÓÙKççöéí9?6$N‡cóéÃA`2ó¶ 6\„BˆÒõˆî9ç÷”ŒÉBaÙ¤™$¥ˆœÌ/ùªPh8ô#¼+$-¥?øßþ³¥”~ãww ¹ôÇR…¹¨fTúñÄoY3§ãky€V°A.i’t±äk*ØðÄWm"&‹Tºu+±«ýãcšðg꟱>ªT{X8‹HMU°°ŽÜuœÝai\">6pO1åK9"YÅ+JH‹p'«ms¶¦yØ[9²Jø|EÒ¿¸Ðù¹%²ð|/Æ×VÚÖ¼Ú5n+K`ÜÊ ­‚þ—ᜩ¹W#À`ÓÕå¤b*ʈ&Ëɤţç8?µ^€B‡5²ðö—³{ç©‘%Eç¡"EdC‚æ”`Bôpô1bÊz Þ¾|_Èe;€ÂI&*%DÁè‹f̨Pœ½;ÊæFOMã*NX¢… , F ÉeçP žQ@ÐÌ`ê ÂÐLJi…f´,wÌb’»ÚA¸ €å@×÷,@}òÀ(‰¦H"Q:Dƒ€¦1ïŒ&PÝ^” (ÖCûÁb?y4)A®-ü¯š¾÷š‰Ýù¤ÏòúW?%Šám÷Źtåðé!hjËÛ/ÙS9µ‡cn߃ò)RnÏO´#=ÚŸ¾Õ±±d§/O¯ÿwß#ÁâIM:—Á”RJ¥s²Á‹Ž¯”Õu"èP‰dê5Äœ½”pSN}ÃJDÈ{ªP "¥x2ÿþûÿåCsüäÀ¯ÿÆoõaìqkª«FnJ/j#aúÎ#ý%|ÿÓhß±Í]âòGï¸ s•÷¨·úAÙÜlÊd¬~õ殾xW´^XóºÁú˜ ÿŠ^ ;~ ç‹}õí¸ÿÒž¨;¶jê*ùžÇWÌw16>À'*M¬ÉšxÉ#æåâcݧ€µ¨§î1Å7—èåý[§ödÖQÝý\À¢¨òÊì—°ð›ú ./åÿ«:ü«îıQy†ºeàn4üú’ûTÓ¿)È‹Œ›™‚_¸§þÆßÕ·Ÿo?ßÀõqì÷uÞ§®‡943d¾Q‹þÝö oD›íûs꿞_ápö¡[f>¿Q¯ãeCðµÌE ËK‡ëåóAá?ÛÁàͰ8o¨­ò¾{éþ§ŸËéýó36% î~›7Vë"Þ@Ü”~™ŽêœídËäd-"¹íµ]ú†€±Xð£üÙ=ßÞ=}@ýx¯ÛËùöðõ|ȯ-[×¶N†ÇƒeædÀ±i$t^yWâÔÚ±É`×¹‡ó\2a9ÑÝ"¤p•ˆ–†P ‰¢áùþeéC†ÎÊ JÞ»g:¿mÃÛ£’áÞu]×Jþ|*ÞDÎIÞ–ç7]D˜)÷Õ€Yq¶"Ò\ §B¯ÉgF9˜Dc‚B0 ìˆp@ð)ƒ”õ/Å".D „÷ ™L0ÐHR Pa‘qxEïPÂ`IHôb)‰€‰¢ƒý,JdrY©`sì!‘!ÈC)õYØrDSèaèÍgiQ:XÊØUÄ4õ (ú›É)^éϤ:šR ¥cwòÒÉLá h` ¤¥£§Ãáôe[¾lóAtçš;SI– æÃñtêÚ/[FÂX:oÜÍxx}MÉÔEC"™¿9?¿xã]>>ù•ï9{uúhR£Ò `÷0¸#¢Iäd}ðWh’,åÿsá1´¸*ÑE)^<"¿óúO¿ÿ‡þþoþªÐ?9/2@ßÐóà—Ô•Ÿïä¸ßVÐW{úbUœþ-tþÃøæêõ^ ÷µïWâÁ‹²ÄµxÀ|²ÕñíKôw­Y51´Q<8{õÚš.UÜæ­_šÑ/ ÖjpUx¡Jû]@³TàX¯?)êjÒ&Ò–9³DY,Y¬úÌ{t»Æ$ì`~A<Ö"n²LëL¬¢K[–x ág.ä R¸èL­F¦¡Æ`láT]ê2éTa…”ACEžôRCBÔ=#Ïn1Çþ±±*jేœþe*‘Zº÷SÓ?·gõ4ƒ5§ ­)nÕ:Rs-°¾S|ÅLÐ¥U¯ÒÄZßôúÆÄ½ N=£yÁV¬Rø[Õ —B›êÕU4¢å’›9”× £Rë>p[çN*.^s%b2f5üg½Ê¤+å\/pÿ7ñ$7­7ÍŽ õ¦£@/½eÈ‹Qf†‰"rQ·#&6."ÇðçWîüüöyÀúCá‚„{˜Ñ,1!å”R*ÊFæCîLJ#ŒžhH"hdN d)¥xt玧óAJG¸G“sÎÑåV JI‡œ“Eו®c~uxÈùùû¿Ÿˆ¶!P襴~fJÑÑ”H©íò^M¡Å 4G(^ëy@Î-R‚Ù <Ø /c¬o¤@ øÉCÉžAù”PÜBð6òQ¹QRôPé#a ˜úsÙšŽÜa9‰|„^‚iœþ),õò€#ÎGqô) ½#Ì lÈj(7ŠNp-€ÜÐ »B$Jr‡ÉMNSR¥Fm<ûOji9•î©yu4B4÷ð¢ãã!INoNåùM>ŸœÎ%?ÏÅåáƒDbw*Y´×G‘0¡{>—m'ñgßy}||ôs+#"¢m™ì`db:B´¡7Fͤ@$§á’<äQ"Ü£„ÞExW,¥”ÓŸü‡Iã7~ûwú=ȸ8qµvã®&µF×¢ü¢‡Y5ÔxLÎ|ªáZ™ü¬ùÓT³­yWƒ‹“ •0“ÜðÚx³Ot¦›¢«ûç&{K¯“‹XE¾ªA*cîf‘$}Á‰¹`×,œÊÊ´®@¬Õˆƒ]™[öIêÚ/z¨Þêåɪ(¹jpÑ/t¾ D]jó§é[„m®üsU–è%$Ãa­£ë¸ËŒ¤‰-Xå"¨¹Ó¸4óP­â{RM‹†Œ9îo4å¦1Á+x´¿É; ËH¨ $=Ÿ…š£òþôiÞ“¦â ²y_2tÇ7®ƒ".ÞÃ<ìÅŸ\þmð¡ ^/SÆb¿®}½¡ôßV2½ªÂ£Yxq檄Ê/:=Aµ§ì4WA‹%±ùöøs%ê¼tl¸êüÀymîfî¹Ôñ%¨-‘‡û­pãòDyY.Ö³¥›1ýj_Ð2ï°àîV{–fÊÎú^eÝðž«ÃsŒ°ãBÝÌc+ø»ŠÁ_y-º§ÿýyøýûÖrÚ· tÑ~»SL{ZVÚå½ ·•sxYµ÷Îi¸Â4qo‘TIºzlÿªË„”ܻ‘ ¼wEèftxgä¸ÞY{sÍlÑjpÇÍ4TÕm¼[õÌ®´ÀÜXœT›¸yý+ŸùÙp!ê-ÑX·Â›_A Ö#{ÝïÜü›‹ÁÖ—È]=íÏßqÈê ¯ÅóçÛF¶ëÆŽ¾ùr¯¢/¹ÌwÞ´ª¹°^¸Úýw:$Ü‚™;Ï¥ÛðBÑ×ëJ µ´)ÉÆ+›û-²Ñniöf>ãä¼Í+_Ë1¬âØKÒB-ÝÏ7U†ÑbgÕÕ\çMùŠ»†ë£l[ä,ÿº„Ïò®»ÛÈÍl9EÕ~Åuäk) R]—^ôí ‘‹ºº`”›«³_zÑ^!5ÝÝt²–ºX^ä¤ê]iN|ÖZ†gÊ–Ô#­±ìLã1üãþùfЬ†V¸Ëã°AÊ×RN–²ˆ|8¤lѶfìq?–Ȕҡ‰RhF¶½JQJ.€sÛ¦~@¼à©Å§‰&>S2„Ë#%¤pJ‰Êrjÿà÷;X—+êJi½Cb÷LMQ$*,$? "4 wª¸wQ è ,"EÊRòæàqáê‚Ñÿ‹gNÁ„” ™mê `‚¥1L+€8>"b”Ø# Œ-܇Ä0Èí&“Ü C9—(n F9EJ°,]çÃe¥‡¡ GE–bOfTºq[™%"0¡8P€ e)†šAHX‡¾&Á@ :"à#ú(ÄF Å9!2 hú6‰ ̓ B”L&(A%ÂÃfh»çî‹Snøðú@»îÄC.Š(1 Öªýëî§_´§Óáïüv„ž?J‡Ãá13Y÷ù“¤ç/Ÿ¿÷Ióú(¢1ƒ„®Kèºó—OÝáÐ=Ÿ,åOþÖ'Ö$/…RÎfM’ ’É"”“õ§~J °ÒuîÅ‹§ˆÈîÞ¹×ÐÐöP Òvé>yàûÿîßþW¿óú}Å|ÿÑ¿ec.lò­óvˇ¤®x²•xøެÿWì·.|FöŸï?Ô]QÞò”7¹:K“ûõcÍêÿñ¡:.9€¸dŒ·&KŒà ¡víu|˨=1‹;k¡bóK_x /±¦xEˆ•nÝ^xmÎ(£îNE¯ýYt¼è“oF¢®ý±ö]ÐeÄrfdé+\Û{òVVL»ã«v¿Ŧ“¦—LÖ[͸xÿµ?û…_˯~„9þs{ño?ß~¾ý|ûùÆìMúÅÜ𾥤}ûùöóbæ«ü63CíçÕ=(0Äè¾ý|S>ýËÙG:›¬]ûF™ã ¹•1s mp,Î#†°FÂ1´•dÒ~ðÃÅ·ß<»»JA‡{QÈK¡‘iú3S‚Ô<>4¹é–- ðèÕ3Îmk–z²zJRçtw³öù¤ˆtléøê§mËÒFI¹ÉáŽöŒ¶ }ç•^ŒD ÿÁZÓ䇃“L™•®Mf!Áõð½WÞy×¹©{xýè¥D¶çs‡çöÓü¨âJ̉á2‚%z­ ("ú3-‘†ð&5)7¥k-Ë=1•ä¹ëº>“!É»â¥XW¼-}àþí¿ðÛÿøwçÍÁšå‹Áª³lek<þ<H¿,öÚÏ=tþý|×qíF…ûâûþ›ö:ùSÉ w°oì7 mÕ‚q·êS€• ÐJsbjÝž•ùÖJµC°6Í&ÓÖ3.+o–Ú)*š:؇l>7úÒ—Å•¤¦ªÙ¥êžÓª•ƒÄ¯.T ý¨;ªÌqÅtX¿®Ym奒®Öþ:cT©$r¼Ñ1—9+ÎbÿV—C<È­‰Üîj_ßð¥ gº„%¢`ÇL^◶ƱʪkU”„E[÷8è\xƒðKÂ…9"j£8®.EÄ™0¯=›Ý$¯Ì¸+[Ç<±­+»ØrAÎz¤«)¼Lt]\5~K÷mh3éÑ¥bõ®lö5¦Ñú«6ÛÕ®à¸?B«Š7Îq];Ë{¶ô› õUËÝÕ­{zÛÕ ¾^Ǻ|øÛ\Ý8SxkD¯\|^9Á =‡{fÇ­ÃnEäâî5otìLVÍ@ãë½SGwá–/Þ(f%ùšmw÷¦±·ÅA«Nµ± ¿þ©éîu%(1?MîhÐTV>á´QXzq¡®\j+H²ûÆf ¼iã-ºD4`7çÓ¬Ýv¯äeWÜT3³æ¾Åó¨~Uæ mTš©>äöÑ´ãs^¨û2'öÆA6µTÏø‡Skïïzù&îßXÁ1–‹vØáªà}“Ü\»^ûáHV«\ó¡æhÚb¸jTË^÷q±þ8&Ý;ñ®ümU™ÏçËöö„7蠟…MÆ7J.¥I+l&íI±¯6óY«Á;‡ô¤ü^z½õν¶tséIŸ»7F~üϲht¹Õq4ï÷½Þ4möæÏ8Õ5„ÊëXÜ'”ëÅUã¦Çû;3´¶+ëÓ•BÌ;T*ÅÁa˜]Âþ³3©¶Òõçò'³ ÿX쯾ʹ+ÌR³–ÍÌ`ÖšÔäÆR'gNùØ›œRŠãCמ ¦œK)mi¡ltb“B‘»Â&™BmK/z:Ë= ‡&7)±±(Ò1'£IjËéOÿ]6Ú!© T„‹¥œÏEÅË“—BJ3EIÊ Àƒ„üìpJM˜ID:²=LEDLV\`*²£äÌý@Ã*njdò¾pÞÐËäBðÇ,Á„”é!¡„!Ì¢µ]°eä„à(03)‡Á/Ã"zîRï-ªÈ@¡>(Ù=#‡”€’¡Ç•˜@âÕŸf :0iè%p‘ÐÈ*rGNLÑ0RtÏÚèHìÈ”-=¤B§¥œ¬;Ÿ-3è2ÁLáJy‹ö KI åœÅôüy(¢sÀ²5™ÖFàéÇÿÞL‡_û¯ ÷îͳ}r´Çcw*LJZO4ËYrw{úÉ—¯>{eŸ¤ljŒäÞ¿)u‡û¡ItOMcÙZ²Cá][B’RÓˆ‘r6c °ÿöíÎç>î} Š×i€÷¯~ÿþîïöÛÆ¸Ýq¹_qÚåfµüÒuœÇ¸ediíÑœõ·¤ðš…ª¼ƒµT17ùsë`,þ aâ—_­î:½Ðq&£a ~iÉ«´(*^ 5âý.’£¼Ù ¸ž­ã¼7ÀJ[¬¹_:è|}Oï‰ë¯Ýæ¾ep2®ø™w™)\¬ïQZÀˆ¸6ó.®ôoláeÔ9€—õ‚8F¨®øÃ”¨« ²îÒä^˜\…W·ìCIKšÅ­…¶€rWaçÊõk.ðµ0]\fËz3Rv.(NYî9Èš£Û9¹x#B^Èìãú¸ˆ"¨ös'ßþ˜!Vãüš;\³å—DmÄc¹íY_u2b·•Œ¼â?/¹ÿ˜çc–wÈ+áÄ¡@Œð4­7p­1P4Ђò:f˜Ö±È]¾ÎÿÕ\SU7¸N\¦Çêx¥æ«û&3µ[Q‘Ѹ €leè´ÊÑÔ6Œ¶£µ‡vßþ£ë;Ýò~¸SWåé-Ó\7»û5‹ê­ÞÄü}<×|Mó¾ø47s‚Ùš¥âøuâ9§Õ³41UïÞ{[êt píî.G‚7¢ÊSïì eôKÖÈ:©È )hcדVd-|ɬeâÖß­›G¹=±–áýu“›1‡=£pžxX2—+è 7Ã}õÖÏÚ¸œ;ÚÎ1hŸw¿ç¬‚€SmÄ–„wÃ/•¹¸1Pëð?'—âJ¦uÓsرæ¹w­ÐOšP[¬˜•µT7ä¶$À¦ïQIÎ\4Ô¦õ·™Û»yqçdZ‚¢0ASusÿçFVå¶ÀÍÆiÉÕ¦»¼,«vú嬺§ IÛ3·¥W°D Þµ*hÍB¯€ëÜ×þèÕS¦âþ/*ˆ·ƒW¢ð —R«äÃ$Ô´|ÒÊŸÚeÇïMxÌÆe¾yJµÉ¹lVïÖŽÑfig[Òú)§„¦´š“¬»õ7v0]Ë,")÷û±{þóuðB.˜½‡*Pg_n$:,MiÔý#¿úËÛ»°ÖdåÌ`‘õ¬Ekµ‰wKؼ<è¿qú‘kóiº½a²Ñ¬uÛbþðûß_üI_ìBRDD\Þi„[²ÔäæpÈјYß7ÞÉ Dv»|W)€”Ž^:F“  1º”2 *ž ˆ§3ºB 3SÛ•ˆæ˜‘ìЉ(~þÁZ†›¼kÉ^¦5Jxë]:D—€ðÞ£I¹¸Ë¥£wfTÓ8hLÖ׉ hJFDo¤’‰J¡¤£÷#œòpPšZŽáP ¦¡¿×ß‹‚pDÏöÉPѵört#s‰B@7V‡¼xJÈ@𠀩‰t„;ÚRsù1A”Žp z’ÐÒðíÖ)„Œ#R„NòfpGt`ƒ”ѵ`@ó pÆK¦cD«pŠD£tH´Œ8&$kâá`^¬<±;ŠÞJYéá DAð˜¼tÈa¨RÉ:‚Þâ|6é­{‚%ƒ™ŸÍÍÏhß:Lv°RØýÅ Ý'¿þýÜÉåÎPœŸžÍ`柿Aøw~õ³‡×Í!SdW<á]w:ç×L–¬Éù¹-¥R“ðR:'´æÐ°dµ†ú”d–s¨q/¡âîÅË4À¿ùýßÿ‡¿û»º¨gAƒFd,i"¨!à 5eEÓ*Éïåë8‡¾ÑsûyÄï¹T²]ãñ9¶æìŒ?üþÕÿ:@~<úðe¿µô²”SbH©É$- 2Áa9eË¢,[Ó寔’Àèîý@YNI8„gGÀy«&³k›!ZÚÌxòVqLdžÎH†æUô$£ÇÔ~ÿ_£²J@ÊѾuEAt?—ÒyWÐSÜS0Inmë%dK<¸‚J‚„†$ÂE"@ZRn@Y!¥w‘…T)Hrc€9rƒp”3hpàŸ ]8þ¸ðô› îc¤‚Cà÷’À1N}—@ßù ֢oó诚OÄŒ&!ú"ý °4\?€#Èñ5΀l@"|è*!e(à´A¦ÇÆ› ŒÜ!)?ˆ”™"ØyƒP>2ÈH®C èÝùóPçC6„Hñl:?)ÎÁ–N)äŽDˉVä† eJnèaí›n,ˆdv ŠPÄç i§ÿø/ž?æ`¿úOþoÍ¡9?ŸO¥y8X„™¼=Ùñ˜ÇÖ%!ëü¨h;HÙÈdF2¥Ì03¹",õmai쥑ê ”šnŽb9Ñ=:> Ðwx¤®”s÷Ó¿ük˜åCóú³O±žª"Ué—ö›Œ".¼ƒ~~p-8öíçÛÏ7Á&ÁÏ-tþ|q¿@m͈Ô;é˜rÑ-#‰Uõ oÝãW=*uþcOTËàHž×}ˆµ–jÝuq©ÐA•`­~q'3@ýÆVŸ[ÒeãËíŸbüuLL,ê骊1n¤›fº¿6Þ)9"8•oÍöþÕ%VMSg6µªËüT•p©áØ•´t;9%CÆ–#êæ€Ë-m*•R¨ üxKˆ–×Ü-ªòµ{áΫ£wbª ¨æ7w-p¶«f©ÙÌÒùÜ>>sr!dù±9½=‹lšï:·dÆd½¶¯K–S1z JM“¨Ü•®×r ÉÃ<äf)¥p/ËÝ‹Còâáñoï_‘d²”³¥”~÷¿ÿoxé´Ö†âÐ IRÓAÏ™—(ŠyçÜ¥±~” 劽å©Ï ×vÝ=–úi§mdêD|ièV/¢¨­»ßæ$ÒÚŒ×V ñFÀ»Ù‘ÀT[FðP.Îq!¨„ÛùŽ‚ÄWD€ï7‡~Á ó³_ìßлš—­¿€ ‚ ÉP5‘^&äÖ¥Ö·} ©Ÿk"ÓiÆ.Øoƹý”WñVë¥6ýSíEç%HysmÏ” F<×5_EQg£ªUXJ7fùd1ަîò[ÆÉ?=ç˜0×îÓO­«Ô`ô?ä2òó†qS˜ÄRq2 «\G=³!ÖIV'.“½'¤¢†ÿpÑâìÖ‰eÐz‚ìë>ËFÄá þe§/}£ÕckŠkDU™$ic&èÐÅÜã·Oò:æ?éhvl&+®áîg!®Ý6®ù$šsE§×h³ïu‹œ¾Dvl1ŸµmN\i]Gî1ý<ÅÙ$¨l0nDí©µü€´»·’“øÜ Lîì73Rþêa5g.'Ð6”hsJŽøïùÔ¡8.qn´x…~y¶ËzÙ`éiÚÏïJ°m |éR›]ÙŒü¸¬FŸ}îµqØä'Èëö]W×xo–PÕi¿ðr§›Ü¡íT–k³ JSÜ%¢p1ý´µ´Êó]Ì%ûeÞo>-Î5o«k÷Ý=vmS8O}\J™´Ž,h›Öx%î°Ýß}{cH¯€®JV·´¡ÏÔï]ž¶“@[ïx›Si²X¹Š[h~Àòv||«®EW£ëTeán.š9ùg¹L7÷%ä®|ÑÞ›¯¡Šša<¨Yë¸ ÙŸýÉŸÖׯãþ=¸|˜dÇW2‹Îñ\ÌÌ[gñ§ÿô'©é+í½ëŠExQ)m”BvL.F,YóØ„«t%ƒòÒ©â39!3HõåüÓüp‡Y>sWÞvÏOdé‹è{Ø$H$¢´ð€e¤ ÷Á·¾Ö}å_bñ}p±)Nq340 Š/PmøÛ^gX˳FËŠ~÷ ¨?‡|x¢K4?7°ÇQ‡ Ï4,b›ˆšf€Á2,AÒ$dÓúV õ’>>ŸÌ€N`LGHl[™D0sRÂi‡„”“åbnYÞžH6Ÿ&>§|“ "#­8YZ¥C„¬}=nÐ’å‘"x tþ²;<žJÛtçÖÇÇL2ÜòÏþ_]+?û'ÿC÷ædˆôpxõÝ×9÷U¨©¨´]ѹ;dâ©Ðøê˜=¼{ó¦¤&MÓ4F ¸‡Y²ÉãcΖ,uKÁ3kÖd;=™¡ïH)Ðyx&’ˆð®´”þùÿôÿI‡üúïþ¯32ò‚ÒÓµ.§=kNŒ4Aœ9üŸ.Ѭqg`]-{a÷€âR[P[ÎÐBðkFª€gím §é4ÝuOS¯¤;ó©÷Ö^ÌÿI\l/±j=¾ÜØÌ´¬„ 53¹«ñ¤vDx[Mg‹àÇUÍ ×@ÿÚ€ù%‚Îk‚ÎoCxjúPõ_‰ŽÍRªws€²V^°¶ƒK3A¯™5÷Õ$sñ›Ô\óVò]ÉŸ÷þ½°ŠiYÕ+¾C¥É¦­àЍ¸Z µ7®Ï†xÌöƒðE>G¿i*úûeýèvÒô…ÈËñWöÂ/ wãcøq/ËoÒ|~¯k­Zxø¿ Ÿ‹^ÉHÜøêöjÀ·Ÿ—î_/Db#‚ûNöåDšøE7xM¤\y¡¤K•f]&¾’ÿZFõk:¯8]£jÖ‡×z½;ºñ/ ;ß~>ú)¼‘óФ¸ u$aÚæGÏ”—ýÅþürõÓ›'o‹wUÜý3åœRf6K–r‚%3šúÄ@ˆ¢tXJÞu!! Üun”Î6¢œÝ N(œNž¡ó9ŸKœÚöù)uEŸ¾J LJ&JA“”SiO’ápè^Y"øÜ¶þ˜Â-Ø…«ë¢“pëÛæK ¤H1ÑÃÉ0 :<@A?,Ú9€{ Ì ^à^ž¿|c  Räz°>€Ã¥… ŠÃ¬GçÇ ¾+‡4À Š÷KÏý¤<¸}7€5àô$Ÿ q©& x!—Ü%„Ë€A€.¡|Ucú:Wƒ8ÄëûXG‡}…!¦A`^R @xuƒ¦1€ÐÌh&0œš)I0„eKá94 ÁcjŒb×zR¤óó©œÚ&¡5¯ÿÖgùÐa¥ "eÂr>+Ô·SD „€úuÓé‡Q]ÉÖë9„¤p—«§y)Ö•þ?ÿÓ^+Àoþö?$ÇC†} Ö—¼F€”|‚ø«.ä{wÿOÚŸ¾Ì_|yÀ7~g¾íÜm¬¼»«õa:^h¥üÂBç¿ÂÊRlõ½&ÀøïS7Ú«ººV9õ5­áŒ‰LS¡ë6†C¬ŸsÆ*úT3ˆTÃI–c5~ß-ówÙÚZc`®N;]6m›&z„ÂûòV-*ÛÕaóîÿù¶Ý‡ý4Tk­£të ôsyöíšÚ᯴¥tËW»Iezßo…=Xô ×Ý 5Mgž‹}¿àdCÝ[v\ôÌgæ|ÛøxKM›”«*Û¹ªé»~˜íåÍøâcáÝú°v·ºårÕRñÖ]ßfØ­ñåÆdâRhòþiÈÍ×kÅõ‰Fì¾£ÅáR/,ÞõþÕË¿ï›ÞÁ¦˜Heﶦ®ç»s/öŒQnïz—ÀÛÇàk­ÕÖµS)þ‚½tg¿»ܵy/ÃT]éûaÇmsW[À»ë2}„˜'qUÁ~ é¥_¸áZöcÆE ûWzå¦3¹½"Yó:ëBžÚ©þ ¾Ñ¨Q×Ã\ØL7ŸãcÖËÎå÷Ûjnùíßy jÙmp÷ _±ºÇº1¾Ð_}÷ªÆ:¶k4pÁ|Ћ|Çßœ;(ë*Æ»ü@®¡˜/S,¸ómï[X×¾e Á«Ã¾ÝT´8ñî3]÷©ç±ÿ¾éGu-îRT+³A0l$""ôã¿øÆ’ÿ(ÅÃC¡Á·N¤™¥þ¿)5dJ–r¾¨K00¹—óóóùÔålMs8<Ü‹wžN¥±8>%t]ÛuÏþ¬st‰–Ž„:/í9JΣ ‘nLY§s‹dÀ£´ÏÝ_þ‡ô¨³Cç’œfsbTÙ¹$îçB’Ø2®F˜ °¨=¨X³¾ZLªCXo×ݢßî4…Ç0k0ŦV­1°vž8ËúÍ7÷ãÿÜ i?Ü<Š p0\Fì5ÅŠjqÙOjʱlä#ço|9áYŸ&ïÀ­göÒˆÞ¢e‘‹o¬êy?õº´ëRN®;TgÍÔ+ðË^W­*E­Ú„©8VcÊôíûçF}ÇËòyÝpÈ+ìãnP[@›ÍÐó¦[·ÀŒòŽäÄ ¹[ 0ó"ïÊPj/YXå–*°ãœ£#нS¨­°Îê¼w´µ(EuƒSeã‹îÐY〾ӷžx‚ËqÞä þç}Û/–œ§u´š.¼cžÜ_bMGbe¸¯æê,5øà‚Äè÷sïO€ýÕ_b^ò‰ Ðh)Y2ËffLÉ’¥”,%ôÝ)YNãíÚRZ‰f0ËÍã«ÔWƒ‡{J91’)E¨mujÓ!ÉCÏç‡cEMrÐ2!=\^Îç†lš }ó¤dùõCþäÑ=¢+Oü¯¡Ciß$oÏÜ3»Bt9 PÓ¹d R8Sê9<„îð€ iIƒLnNÈ¡iøLªx}ÕüÄ÷nˆ˜+P.Eñð!1ж°* Þ—ù"ÀA@ H`^¡9€ið¿è/A!50ƒJx§7“y5´& Æÿø¥vùaâÃøØ@›RFà0þp@`X¾=‚Ñ)f©9fïg[ ÚhHkè]x×A…°ˆhšL£Ô)œ‡Ä€—6­yõ éXŠw*$à¦@J Ü]tHbƒœ¢¼íœÅ£HÞ2Èüé"ºîàÑ=ÉPDPŽèZÙžaÔáQFZJ¹)Ñž`’5¸¾ø—ÿ³=~&óßý»Ç‡ B ZÛuÇ®´ožºR¢+m麳?}Å()?„™˜è®Ó™ÆæÀ¶ë:¶õLJC µç. A8»”Ó!eHÉRÊêm7ëûD)–öì»G” <ÂÛ~ƒøÃßÿ7z©€ßøßiùõ÷>¥ñÂyšô —²™CqësÒ"ôÉ ‡í‚ÔVЮÓM¬}ë@ðt`-@Zš¼SÇ~HœGF§(цV3'÷¯Üù-;ÚlÖ~ߤVªe¡f*q† ^ëS²¦ßì\±[I¡óÔ¨/k¶íH,í§Ks†ªò‹ëŽ–sá n¹Û³ï¹ Îù>«iOzOÀ&ÿóZªI7º”ªøUþðûÂÜñ»3'§«|omÂ^­"’+ ÜÙ·²j|ÀjÂs§+azì[&ð3¯w6ÍÑßÐfÿ—`44Ëá¦W´w¾ì¥c3JöÏÒÙ¯]Ý-ßïëöØWR$ ë*ï°€ñ¡/Çw¼‡Ñðu.Ú:¹|[cóë¿_¾ßà kŠü7Ÿ2çr€ÜaêŽlÇKÇ»ôr‚ëæÍéÞ/ºsW[^•_YÀVÎ^Œ~­ýÃ4ëúé_O9KW­vÖ0 VëEßÉÝŒÈÔ«²®ü¨/}»7IèsŸuü¿cÀ»=õí÷êØHèRÏ¢÷yW§Í,uõÕ4ïÚ^7n·:t_ÀW /ñª}m¢@ð€‡ðøËŸýôú/]‰âC¢ˆ´Kè?¥>úo) ¾¢YJ&3£%Í‹ðC>‡¶k¥<Ÿx:¾óh2Ž)!yz:ÙÓÉ2Ëó¹9%}úZá4òÜ™›FÅK“d–Ï!SyÄùTâí ‚·g …¡ÇWÞžsn O‚Œ€y‰^‰@ £M=æ}2.„ààL#4Íð·D õ²º£G;°#‚Cœ=igL‰ö}ýC ÁRª^¦=pŸ#Ú‡Å2¾î4 d0 –1ÄîE AÊ ŽÀx}‡H0õûèŠ ”nT¤ >Óºè=“Iò"ù@êõ‡óa¸Õ(`¦ÀœìAÞµåt:7MÉ ÝÙ­( Pß–D&ÂHBŠŽH©i(+]Ý”,ÃR"-Þ’å!ˆÈ£dkLtÉad¦e7D1©ëñD‚ò#ì ?»ÑD>@E(@&B©qï\²ÒÑFç_üÌš#ßMFf+_þ ÛC>‰s'°´åé͉|ûÉg¯š&žN&?dv_ž˜,˜Î%šþÅ[üî';4ùØd–€l}ÉVx9ñ\tp;ÆLÌIŠ e<ä($‡+—ÜŸì¥ë†b¨PH½TÀ¿û¿g)¥<ˆÿ“ÿþ¿­êâˆ\ŸX"£›&àT¿G<¥Î÷~ƒÝ—;Þï[Ÿ7—½¸Û³.<ب©ç=uÅ_l`è[èü¦õxµlQܶ¨=ä¢Âs‘¹RÍV—&¬% ´¯Œ¤™ÜhäK=‘»ûæ’Û-ÒœjÒîœECqUOb¿Žlk´U|ø‚¢ýÝÞMh ™Lj!Cù@u~÷Rß«›VªVU…ôz4 =íÏpV‚l|7wŸ ‘ŒwÚÇyß2çf×—X÷5Ü"×=Ù{“Hß Óoš/ڪ؞ê“õ®Û,?ä=ó+©“¸â¹ñÞÚ7ÏŽú(ÇsÕâö”âG\O»í–ו~§£ùÞ0®¿yÛÈ™Òíæ¥`ZKžî^w/ tÏ­ÞkÁ´Í’m·H¿GŸ/9îî¸ÔTŸÏw^—;v¢.~¼UÉ=S«V‘ÿèÓ›·æ;¹–`Õ yn›¯hfR/£Àã¼B²f•Ü3tuÉÞݨ¾l’nk¡¾KÛźÅaï1÷˜½ßL1‹Zê]¸À/z#«NÛ*Ÿù!¼z~0c󸫉8ÜÁ|I¸Ê¶Œ¯W7ŸEBHáQ\^TŠŠÿÅ_ýu”"z&‰‡"nÔ¥ä?%¦>ô?Tý›™FÀY / ïÜr2’‡‚{Ûå”PÛ¥dÌŒÄCsÐÓI}Åv¸Nçîõ#Ù’ »wµmsh’ˆ¶ã©å1祗¼³Æ‹Þþóÿï° Ù‘ˆÒêóKBôábÁB’%I3!@,˜‡¦²_ z KP Ér†Æ^ñÍ?„ÅÓÔC~©¯ï³jÑ!%äÂÑžáá]A×DôN’±þ˜Z÷z‘„ï3’yt 4žp C Q!ûiˆ±ïU1æF$@vœNsMÆëÏОñüÅXÊ€K>ƒƒö@?]¯¼óîTRÀÆ2!Êøíw´f‰dsÌT’ýˆÊ Å¡‰–aÆ@ŠÂȆ$S–!úÅE"²dÌÙò!\Þµ– ¤”[€° QÒhVÎ.!Këd'GsÈ4‡yi{2òq®¥eYó`ɺϟ½•wqøNVk9µzn»®µO^žÛ6òg¿’šÄâåÜyçÞ…‡Á¬ÈÞž:+‘O?ùâ!£ýò٠ȹК‡¦ëÐY¨¶X“˜(£‹f–²©@çÞÐRÎ !eóÈ ‘r.]¤œ,1" …+" ˆ$/ÅK!i9ý³ÿ÷ÿÂDÒ~ó·çÕ÷>{óäÅ“%&›› /vɧ ä5$ë^ìú½Š‘?R¤˜‹†ó=£ë½ÃÿÛt¹Ÿ)u`ìx;µ®"¿ó6ÿ_jèüÆœ¼q'œÕX±¿Ô¥:••{oÀlJlÆ×F6ؼñW£¸–°N@a­W÷&çpßÞ«ûw6Zo7p.T£)&®Š4ÑñÆórsÑU ˆ¶ægƦæñ÷+ŠÂZí‡ÞÎ4Ãǯªõž5gÝ÷Þ“æ®Èeôácô ãØ2ËpA¾M#ÌÂ$—ˆYU16©l„°ª\Í¢© s=X^@ܤŸL—Uå“l)Ÿ_RQS @Ó^Z.²TKA !²ªÕ¼Œr•°ž©@Œ÷8ÑÆï/,-‚{›®çŒs‰• S¸|Ù’±ì™Zê¹’.¸sª¡eÖ쟈«‚uëƒYUܪý_)\¤NwÈeÓÏ…­¥]ÅsÌÓ[+wµ¨äìg´©rzŸëÍJXDlµÚ¹oøc󎺽­‡[ùXrnyU<÷™Ìûø3ÆY]Ñõ®ÒWÚ|Wœ…ͧ+ã-¥Æq¡ÞH¦¿žÁ’fc3b‡65–Š…Ü`w-h@‹íõ’Z樊55h¯Î9méZ˜nÚ¶Æ5Ël2Ÿ2ÓŠÑNˆ¶ú¹MRö•€ª¶ÌsUGæÆr\¶’¶ä<ª¶Ú$Ö`Àñâë Û–¿à¡Kr8(¸cÅiã¨zD8ü¾0eûCc««dš[)õii]rvÔö.X…iP·8£fj fNe¿qà^pW;5%õêâl{¸Xq¶l\â‚Sª:ÐŒ¡Âù~Å•=:½Óš[Rg¿&ëƒ[Ô6ê®ÌU]S¯åŒïHªqi‘M %gVu'5ëǯi•\è-o`ÙÇ:¼ß ë¤ ËyµÇrdRË^§ÕšÜÒ^Z€}zeÀú˜¼ƒ*37ȹo híÅ]?u)½æîA!àN ðµntÎô“u¡öÎÍþYÛÔl‹àú«»Ý¥j¦6‚ Q!l^êý«¾ÔlYÝÉŽµü¸*³v¦'Ô5ÈïÆ´4#¸êaä ux‰ÍJÕîOsÂK©Þ›îŽ©2ðuAtÕTßþÞê¼Åd“ÏÙ­ûængíON€¿µn¦jof¶5V;µfVjôÄhÕjÓ¡ÊÔRq•òö?ÿ¬;Ÿ~úü$—»÷Z£—Ñè ú°IéSJ–Œ4öÑB#®ïQÞÂÌÒIõlx:L¡(w¥D‰ÀÑÊ›–¤{‰Qð¤¶mígîÆ”›Vѕ΄†äÃÚÓ9T`–Þü‹æê¼ˆ„Â:’0Áé*0š%1Éh”[. },<ò4‰¡@”€/ JO®‡쀔F‘^Ae€óôœaḭ̀w¤„l‡ Ðô˜þ§¡HßW¬ ÆÉßë'ݲ'BÜw8xì¼ –¼·HÍØ¬`ƒ`oÎèáFîèãìf° ëûb0ÛS‚„7?EéóØU@(Fs€cpz{8h Óv 4Gn2‘%zWz0Q„B­š…³”0Âh€BYn²Ð$˜3!E"`Ì”LåŒ \H’„C8‚€ ¹&+€÷kW ¤’åüJíswh4¶^Ȱœ¢(‚!XŠÃ«8?ÓhLå$„Ó„Óßœ›£Ì¢ ¢uv0ÎTòRZ= Z–ëË/OožžžJ?ýµÿ³·mêºç7Ï]ëí›scÑíññøê»¯ÿóOŸŸZ<®îÍ3È®õ7?}ûÙßþôøÉ«â d¸äÁâ¥XJ–r –ìáØH2Z°mŒaÙ#Ht]0"¡Dƒ£ë§,ÿíïý^Ê©—–TÚî·~çw²56Ç‹gÙj>ËèhQX1Û¹*{kÛ-w®Ú¸ù©ÿªÚÒoXø;EK1¡ÑC¬œAá®zÆ—g4Ãõ jÉŸi1ÓÍMà‚}ÇsçJ ê5œÎd€õvÕ–y6Ô ÿÂCç/ómŠå$}¬ñ«5~{¥6ÂáXçf*øãä¼ä«p\OƒU2WŒÝÅ"írc[pÓ¥Û1sßµ4À¯´§¬bX\}“öêr´-Øt.¡+­K}ªxW)»MÍMçfåkIïS‹¢eº`7Å7»ûpyA8•1Êå Ü(—YUÿ^âò^Ö~0³tEª!ƒœ'hÞc˜>F+˜6oÞïýA¼W7JJõ•˜q{–Ö.õ‡•Öûƒ~¤€<êw°]¹ÍËç;½µò|×(Í{ÂßCÐû±‹[7ó"BѺNü+ïxÇMJsRö;ì‹ïÿs_û˜•¤Á2 ·-T½Œ€»j¯›ïU~£_n çÜÕ°ŽIn8ï5?X_Ø -“æÚR~É“jGG…{s€ûËýN¸ö‹VØ~ät=²\{ˬ'fdÝ›+w]óµJ£¾‹›zÿ*Þ<Ö¼;åpóVw…-ðúÞ)²Q½g»^÷a…ÌÔúso.~ãú³Þ¹®q®ê¸œ+…¥kI¿{\šœ†•c¿lËúhæà=oz³` JóÞ¤sjiñŒ)d¸ÿøG?:¿y.mçÅ{5ÔK„iØ/RÏ÷·¾®>õø£¥Ô«Ã î1¨À Ò¯ê»Â™fžŸŸS²(EЦ!GJçWx}TRœ;OF£%šS”s›ó!Ll;òÜ…çÅ—YqþÁ½}öÖýT@f ÷`VjØeË FA&Yî5{À¢@s÷ÃdCh»'ùXFó D׫#ƒ‚õeïŽð¾Œ$ì‘(”fƒÀÀÞ±æCq‘âÀIƒ„Ò¸'*‘ã¬÷c„}¸jÌ:É Ñù>î/‡€ˆ1uiV4D@e¨A}Σÿ­4ÔßLÞ³ k b‚Y“RÈ;—º(ŒŠè3“Y¸å$Œé¹HËÖ@à#¯‰&²»?ýÍ›Æ=á@ÖAg¶.òã[– J¥ŒÌé›"`Hì•$Ssxu8È‹{×¼J©‰ðP~fRÊêÎH}EJ‚)=ï(J9ãáˆãwðü†í—OùÔá;ßÅñÁ¼ËX.fQºî©ëºèÎåÇÿë¿`ÎÍñøk¿ù÷< ËhrãOúÙ_þÍÃgŸ,¥ôp`£O?} ×íz9¿=EèðÉcéÜFΤ•ç³¹{NR~xý )ÌL`×µ–Ùä”)6 J’9:—Š(î ¹‡B!ð áݹ-?óî¹=¼:þä¾ÿ›ÿÕ-@)¦R¤ëH®R—óô~ä7¹`ì撬ò:n ¼õ3¬1ñfÌ !„óÊ¡½ÊÍXó//t¾J¼ÜPˆ+Ã}ÃI´Bé+Èvg¥®[ëÄïŽ í÷8/ê?îˆÍïÿ3¥wúòêêvq©æF$k ÖM°‚î|ÐFˆÕs_r0ÒH%ô!ú?·õ>Û«x=o†ø®_t-È·5ã#»P'0v· Ão,Ác' ;pß~¾ù~¬)p8®¸!ëçbœõÑ·©’ØSTf§oÊ Ïšƒøá‡~NñÇšâg…A5Ùü›8ë¾j(¹ö\ÂKuñ;沕÷s²EÜð`/Þêײ„t©€oöø¯<ë9ÒUaÛLìúcì¼ÍâãqÁ>p× OûQêê[ÆãÇ?ú€ç/Þv§6ŠGùAÏJ1šÑ³Ì˜r¶œS2îAF÷0!$÷ÈÙr“{ýC’–’ÑB F(àžY–Ù»¶;e&¢ø©ãé`·rluj»·S2˜:WœSN‡&³+D«&{¦€îÏ~$ïžÎ]*gµm´}·¢” ÒØäbfBô…ê*¡l (Ú©_¤ 0 `0ýÀˆÑOÜѾǘ{_k×—ü‡@ž$ƒSþ ë ‚” ‚pD‰ˆècè¦Ø`ex‰®dXFÎÃ.>N§>=`Ã/¢O6¤Aº ûGÀÉ`',FÌ„ 0´Ûh•ØŸ^*`@!UÁï {íRêE< ˆD6Qºžh¦ôß7O¤ ‹–á ¥tH¢x Ïál^¿QÚðNà¡憊@tˆÖ‰Též™,š@Š.,›Ÿžb’™¡!M"Ñy¯{ D”@ç0°l–³rÈ–¢”gÇ׊‚Ó—,gä&š¬>sº'¸+ðB}á´)½ñ\òCÊ‹°”›ï¾ŠŸüÌNçæÑH~þ£¿N ýÔ~þüü&ñÕ¯|7=}Ð1ëéôð˜CxzsÒñÌÔÅÃgß)ˆ8·¡öͳ4œßžR“컯›CÊJºÀC“GS銒yrÁ<*q~:[Nа0¨´ÏçÒïüñ»¯ÿÝ¿þ׿ùÛ¿#Á’¥dc6ßeŸ8ãZÃÍï–öÓW´ÿ¿(X;%ðŽúÓ’žîN/¿¯ZÓ~ÌÜ[5õ-tžÛŠ;/–p¬zʹ€:lTÔ-‰K³`¯ÜEœ×‰×-Œ³Á/sH‘Ö¶YõøXô£cƒ©-–î𿽨²ÙT«T!Ct¡ÌŒ]3—¦ Ó¿¿ç¼ FËøÂY” ÎrsŒÈ ~Z—˜^šQ5KÇlHð^&Ç,ÿ ê-pJOPœÀó¥£L.ż"‘—ÖwÕeÁ`Q4¢ªcTS3 jôÿ‚çS? EýãEY 9çìšž+ÀQg¨Jï9#-éK1:IÍИSø·xà5‰³>/mˆð­ó‹šQ°çÏ_N]´ÙÇf¤K&ê"©;ªÌnŠ7ÓòËÔjs¸š¹<#´¦ñ‘µ~Ôñie,îggc­š0ôNÁ']Ûú„ùs`“Ù5=,«!Ø»èªà{¶û“{ñ¾µf —okˆž¢šËÆsƺš?§I¶gZ`YnØæ›Â²NÜ nnË~k8^Tů¦IiÑ[Z·ª€Á´`ÕYÆù]O‰ú…R¬ê-zÚ¦8ÅgÇÓÂ72ãëÜÒ’ZVG^kÖ¼œ½kÂ%H˜ݪ ƒ[ý‰<៙s­vצö­±uKé¸ùŸ=²¿wq3Þ¶œ¼×¶ÜµTõ•¦Ý-Í·«·¹“ã= m¥ºuvIÃ_uÜà êÚ°”r¹§¸Š·ºß×vïÞ6ý²®Ô;&ºÄÆCë:—Wõµ¿úY«vÜwà®o~óW6 _·Ôß¶m éŠi·rÚ®9c½¿àßþãý¸ÿËùÓ•(’‘L)59åd}€¤1çÌ”ØM(¥]Á`˜Ý#甎}Z¯&%€²K0[óêQáI¡ÖóùÙ€Räù˜|>YcFúÓ’EJQÚRš‡ƒÿè¯ÚÿüW§héR) WÛ©tÌ$2æ°lb„„„™$Â,3A`Ð! ØÂÒX/OD@6hØBc=pLhއ } :0DÛi ÃF°„¼ƒÙÍG¯‹ Pðу ÔSƒúŸì‹÷EÈ ¥}GÜlÚȧ)g2Üé]'õbÞy×ÇÒš©9–^ úÂÔ¢‘!µ0¢IêÉNá°b`%•"(º@(2‹ˆ/[ì‹Rþ•_ûìñ³‡¶}xú«Ÿz÷Äñá`Ч/N§Ó_ÆÃñðøPÄœ~úæ1“ÇcF´§ö¹<’âÕ'GsoáŸKcTG‚¥º_¥à1åD©”Ò×t!G˜‘"“1œámiˆ`¶Ó'KæÅÝ€{äs>éÔ<Sc&¤œ&¨;¬:í§Qk¶ùâÔÖ­lü×Õ *Z9™¹(ªx!ò…»:ŒW“å\»ëÚ}—Z¤-Þ®–gæþ]V?_ÊMý%‚Îkra*«ú„¾Àq ÕÑÕ° 溘ej© Ì|°áy/çê…E67¾Ë ·õw&õ»úó}2ýý-7Ýó+z™Oy52y«ãP@>•ÍN¾$¹ìz^1Ëy?ë÷F^e‘zà‡vR® Ñ "_»j³_݇wÕw„”>(%ß~¾ý|%æÛGßb¾ý|…/òï-òE1£ñßœ§ÖÇÿ–_úÓ+gõ’xG³ôÛχ™šwu\^y«_Ç»[uxÏ=Ï‹‚抟³£f™àWö$ºQÇÏ©‘s.÷êé<%ÜUÊ_þä'ý_öÌï=YKf)å&[“RÎ4¦œ%™ÑR˜šœ-"" &ÍJ¥´‡&§œ4£¼o·oÉsÎô¢Ò¬¡—(’'Ð\B2?4~:+¼9f{u”Â?b0º7™â§2*€’Ïñ£6çõ|~Ž÷ççR¼.+Œæ¢u*ê”"™†~pË K*~)°EŒ=ø$°Ìc¥• òöDÍÐiHô*Áa 8@úÎ9ä=@ÞNo©kAÂ/"Ã;R†#ÌÆ @Â.ݬi,Ûøú÷”!¡´°Ú'@xý·¬&x@g€ð)Á{ÚM‰Ø c,™o?W¯ lià õ£Ä>¸BbÊ”Rw )dL’ÌLÅÁP"‰âʇ&5¥µî©S“¼ JÛÙ¡Q6(莜Râƒ5:ÎfȹQÀÝ,eâ`²ÌÜ„'É,'ÒiáÌ‘ Ì’P¼ ÈÝ# Ü-rB ˆÈpW§^™!h!öÌi¨±”2J‹(€/p‡†CR)!g€Ö¼zð?,l’Ÿ»óß|®RÎE¤Äó—§"5Ðwå<¼:Ïÿùs9'Z¢¥8£{.hòá³WåmËCþÔN§.!fñöm{JùõÁ‘[R{°ädQ$K oÏçNÅ-'³dÀ—ož‰^×C!$>¼~ Òv¹É)§”“¤ós›r™òDÖ»¢81ÌwÝ(ùÓ7ç!ëÀ°‚ï¶Ï¾{C6`v0]™'?÷ÐùUàþ—tÑWØÈ´m‹%]Êï=Ú…;³!ª\Èf Ý̇m-oh«Zh­B1é‡q·Œ¼¨¼µZ5üÚºnt"Gk‰Néå—<Š ¬³F=Œ£=»hÖÛ¢êv¶k¾ÇŒ´f]ÄêåzjHpÕuB‹ÂêTÝT阬䡆˒°+²áãH IFNè†a$—ø4\¼ÿScÕ1±žÄ^d”³ó.‡šp0<å¥l~Ayš5 °®ÌUõv¦au—§÷ÎI§l†,©žƒØz˜Ù±VT¾ðÖ{À¥ÒlîMψ%_MóÑkÈ꧘rŒB%@5ß|µz7—t-g“xþ®®5w@[%ç“Û¥zóÚøÝ¹Kºëeß ‹Õ•eûº1ÛŒÎïu¥F¯9-ìšrOí[ß6²6JrçBõÜ»üüeÍJ f½XÔÙmTÓÏÁ#UEl=ƒUõim(;M.¼T¸¾$’¹Uè­ŠÇ<ßÕ‰¡¿´Þêž–*¾*'äF>º#bÃU~¸b• p¡Ùv3nÔœ=·ñ¤‹#y{ ªzcU;Yµ;­VâþÀé-s)™è:W_]u„O ­ "n¾É›[ ÛíˆÂ.eiÜêvh Ó½jþ¼‹-z9\ó±å-{uQÝ«Õ6s¡-=«"ì-Íi5N´$^z—¯”œÔý™p§òïrfjw9ŒÆ³ó‚/ÝÞâ7wF®ÎÀK«¶ê?\­Ìbe³l_k›ëMyÃ'¸ÛûØ5|o¸ KmÔ€—É%»Üfßâ9V=ß¼þÅs¥Éz¾'eÑÄ}³àŽ>˜=¥ôÓE‹ÿ_]Y‹!º/1²hów’NÜÇLŽÜd7]Ž -·³YX•s2ëÊÔ|®7‹M¤Ò=€ ýZÕ]`Z5þK{%ì¼í¾=øZO­…„wÕ\=Œp&Ú¶:—MsÐV¡âæ’Ÿo¸ó.‡aÖ­OU?¾@@ÌÑÇ«“©rà50Ö9™ò{»IHˆ@ •ò£¿þOýßœß<÷ÀïJÏü!)¥&¥&YN–S2£q€ƒúPÈÝ%¥œ{Q–“:…áÞ‰mg‰Ùh0&Šn0–³•0B§S9µ|uÐÏÚôøÊ’YÃÆ®SÜ#"ÂùpdÃî§oùú©<•òG'ïŒ)’ZÛžýtJá(ÁR¼s#gG¢Q–šæõcÛ‰ÉSî:w&„€–)‰í[¤4„û É, Ié‘é!E‘HðÍ#RB9ÃHöðIzŸÐ}ýð€èàçÊßò¿áGC¦A‹óc†”}Q¹ ­ö9 r(Á2ƒ€ ¡AÍPw¤rFéàOöyøJ `ðf_ÁÇž†¾{€„ÒÐdp¡PJ  AÞ?$Dä$x߯ ˆ°D&Á¨D!ä CŽ(‚)¢' DÐ`¹IÇ#©/QÎÏݳ¤Tž¼ëºˆ`2•Gs ɺž[„·!É:²É‡‡thšW‡ð8½mS>ZFw>Gu]j˜,Ù ^¦ Á“[(œŒˆ0 †ÂEКìÏîE‡G(J ïÀ@j€@iÑ>3k“u¼Ð˜H$ tÞþìË;K­Ú¬tjöø³§WŸ<¦&1§lÔ«Wñå›óö–ùØÙœÏçâH¿òY´í—oN‡ÆÊãÃÓÓßyƒ,] K‘ r²îܹ„ÇC€% ¶Dœßx åæ¡I)…cwöt4’4;?_}ú*59šˆ°œò!‡{x´ç6Kx:yDfîw€ëÖß² ¹Þ«LêìlšK{ÍúüJEû߸°‹.žˆÖ–úޱgY­ž¨OkÎ1>aOÙæ.Ó¬°xkèŽU.s„ËšÆÃ™e¿;Y~!¡óã¯S MŠ Ã¹ÉËÞZû´}ð¶2V¶®VNxú¯r,¨BÌËåE(ƒu8z?nqéä®Çª÷‡¥I†Ë è:´ëH³V!òzoÑYÂù«B»‹ªsyf­]4i/2¢‹ßRÅyW1±zòÔê¯y4»Ù݄ͦšu/WÔÌÛÛú¤D»™ƒ¼³ îÚW_û…ê}h/n}=`¿‘y)@ŽïZŽ’©¸žY5Æ¥îxÜw ½ñ[¾¬_þºl€¶˜Rë^òûfÌ6±V;¡û b:æXwËí8/ú©@•;}㞇 95h‚‘wÌ€+Iʹ“0ÏkN¡º¢m¯ OZ\üá&;…ò÷Mѽ}·æÓlŸ?p£‚L[Ò$Z<Äò3;%7ÇZ÷Õ¢HëmëÒæ.vûŽº+k©®±P?ˆýè/.×9½yò¶xçá>dß´Ä”,&C"Ì`Ö³lƒffÖcq>iv84vÈ w„¬¯ªHòâF¦”§³ÉÉ žÝšdE2q>ÙC†ËÚèæ»â0óÂçÖ!½z€1BÑÅù?þ°çÚ§ƒäåôög eÞž²Œ´@1SJtëͦyý‰‡§¦m)bŠCBc8ÇaK Ý–à½2ðx8Ë‘ ègH TtúiQ ¦ÅãhŸ‘z€Oâþò¡xœ„P GhÐî ú(_cȘ¡íQ?KH(ˆ3Ò˜ „Ô€@i!! :G>€BtãÚ0H°Œ”á-Ô÷pRHT°‹¿Ò‹ èb®²¯ÓÐ+úNH}'AŸ.’;ÃFßL^$§ÑÀtŠðs:$„¦R,3<”3ÈÇît.:[†…”,{G >‘Ó(AoáaPã…éh¥í»æÀ(ò€C% %³ Â‹]ÈÍÅ"²ÌšÇèÎÞv¥G„J;ˆ4°ïç$SßàÝ€]¡„>ÝX//]ñ/Ÿ¼ÉìZ:K„Y×¹}絿yÎÇ|x<$÷ôÝïvçμ;6éùíŸOžÓ'¿öÙá!Þèô³7zÃÇ_ùî¯üíïu]yú›/¼- ¢É9ŽMëñtò‰W™È R×¶½LwIÙÈç§§Kçs›svw/®P)^Ú®œ»îÜ–¶x)ͱqÅßý­ß2Zs¬ë*wݹ ú*ß{üÄ{üLÝñ•i7¦ƒ9wyO}%Çî£H‡_I”÷ñ-ÓàÛÏ·Ÿo?ß~¾ýüòž‚ß~Þá3Vò~;¾ïâ}'a°±¯¸¯ñE|jÿíçÅ~öFyF]2ɪ7¶þþâÏ~°yÕ>ô_º=ý†è•z­±”3R‚Ñš\BýÄrÉDu~z>§Ö›CN‡¥t|õà€—p¥l sÇÄC¶L&áQ” "J׈â¥ôj¾&&3m‹tÞÍ£•sò'!™Hûyùɹ}sV)f0“ÜKWü|ò.$£tn»L4ÖS~T¤p)úéó/Œv|ô3=gä£:GÊhÀ‚Ò¿}´†d@k0B˜Ç²Í@Œ¢ŒM˜° &xãdGĘ +">` µ£WßMHyÏFп¼/« (€ *ÄÞöbP  ®!ô/!q|Déʨl0½žÁåVr·$Èàc¾,Jäy/m*F ™wÃÃ*Ð=K ¯³Yr/Ög@#`64È…NJ)=&A¥uˆ„)aî‚¢; åÙC(!€O̓ydc“øúðˆâ¥ q7…z!b6螟-)gÈObI¦(’; ^EAâñ!E¡Â‡F(dHPÀ# @é†EIG”ÓðÏ}:GBÅÕ3l”úPS¨à!‹hûç6@;Wz:3ððÙ§|Ý|ñWŸ?¼97ßù¤MÉ(½ÊÊMwêrêNõ“§¥ôú×~-:?PP¨k‰xøô˜Œ§/ŸÄtlr'‡ ÅùÅÏÞâx wMJ½ôÓÛ³ ¥ó~—þü?NàÍçoMwj!•sâðx<<¿û+Ÿ_-Ù%Nù­íðíç^óæ[èöûý2¯þ·¦E}‰ì!<îñ‡¹¶Ýò´—Ãä;Ì%Ç.-Á\Ü¥Óƒµ%ÚÁ}ér÷i©å€L»™®¾'¾« õ–Ðqÿø œÏZV‰{c‚z€Õ’kÕsk*,‹Vîd±×'~]ݳ~Pm½?¾lÉ-®wíf0o-uG ÛªmsÙw‘̹ü?ÎvIn¹v–ì­F«å–²¡o¶ÞÆRÜYÅÃ|oÜûÆK‹&GpðîÑuÇÙpý´ÂÇYÖSŸ¬6O®»œ„ «}U…™A -oµ*fcrKj{|4¾Pçvëþ±÷Šoð^lèmãyv?sÖêÕ•ÿNÛŸx1C±n8¾9&ëÚóÅ3îܹ–ä¶Z›ª•u¥;sfÎÕ´©yeÞq»×ôºhbõŒUóßš¹;‹úêRñBÿÔ|¾jÃæn³ÉbZÈn:b³ëŒ…ÿ n†ôº^%ˆ9Æó%š(UÇòÌ6Á‹ïîZvæ©®„½x µ~­{sg7ÂÌ•ÁÔ ¬e¿#±Â|NÏüöCÔŶ$«ª/ehé0ZJ4“179–’ùQ)9YDx ‰lËÙÃ)%K ¥<·‡¦išÃCÎ&çDï::Riaˆ®øsgFó® 'C*ê:Q9 ‘“YBs"ÏÿéÇ~꜄(Dø¹È½íÎ¥t^ÂKII™baEd\‚…@6ÝÕg8T€ kÂݤ@ÈRîÂ…\*P‡® –‰à!“©—¼èˆblËé éø¾‚^§½2Sˆ·¢ :è¬Òž¼5Y>fÉ»S …œîž’!‡"$…˻ҿr†Ÿ‘¼ {èÎP7ˆF"gÁ%h.ˆL¦ž®4„Òúž ™™¸Yº^r×Ñ\->Ÿ˜³™9%_¯øþÏ¡ƒ[–à†ì)3'Ïd&³!çœé·¨!*¡žÍŠ.N’¢Àõ®sQh ]$ ´§t"£—¹¥B(¡£¤NI¸F…™+WpETµXžäªç è`†:¢Âl¬'˜aVQûÚ•Q„*•¶_­wÏßOp‡%¨VÛ^ŒuqΙãï8, "H¥¦.( ]¸Æ.t|4–«'Š)®—áé¡A†—\ú®Ú ‹ÎÐ/K€!—ŽPh6=vjæ6“1é#(DC'Q,%Ï®*¸–è˜Y šâ)+/¡{á˳H—\B¡ î9õ–ܲ„¾ótõ”Å*"b‹¬ '3‚8’ ÙÒÃ_¡5ä+ÄYHP«í´ºÎyy,#mX"Œd®ë¢áU©¤Ì±9IÏHuatB‚_S½ —Aÿú1tzOïNÝß+]øøç飯_¥ix~¯—ô—ÿí»~}N¡ëèOÿçÿI4ˆ é:ˆ†d–¾7 æÉ@ækfÌôôÕ;J¦ûÇ¿~t’`ìcˆ!}ÿÍûþÔåËpùxyþúÝÓWÏÿóÿú¿j§ªÊ––¼¶¢›MnxO&ÆŽ'ÙjW?–òÛíûæ¾Ì×­õë,ûœ˜Må–®MëÛ\~Ñš´¥£r”>¨`ã«C~¹§l¬ÔámÀ"¯¿<ÒËRO—ÝŠÕ¹ï_e²ügôMž°m3wƒáÃTÉdlµªÁŸ9¥ "_S~t£ŸóK–™Â• Çí€MeͨQ-‚Ýé¾ø¡øpÚñõ³Ã³)IΚóæ¿Lœp‡ÜXú wõP¹•¥½s~k,øÀB/¯L`Égýp_²’‹~˜ßøCüÊ-¿~ýúu_ü%ü¦_ïèSîä'ºh°­ÞùRk¬|ÒþbÇ÷#™€_¿Þð|åÕÄŸÃÀÜâæ_sqür½±@û*²êh ˆZSâ]…BöªX†d›áÀ£÷Ž‘{ɧ»9lù¬côËtüPëÿ\û?V§‘›ô¹Ìe¢œËnHÿÃ?ýÞÉë÷/4·l9g!¤SE5¨¨jÔÐÅb÷b!fx£æÕ&·©7gt*hV‹»©fÙìêûY¥†tbu Ç~"»!g||‰Ï'\ ׫Æ`ÙDU»ŽÉÄ3C‡ä$û¨ˆ1™‹àòçÿH—!œÊ|¹" H Èž‡aH>2Ýn¤«2Wï %àb‹ºB>} +¥÷‚ñ `ÈV‡£ 4E1W)r<ƒO4mNã¢Èj±Ë\±?…èÃ4ä$ „Ì<*òÐ8=—ŒŠ#èÜœX2 X‚(Pmœ»ª»7HHÉ%LºÒ¨þס†ž ‚œaVù?ź5 Ôk¯€¡ƒ{%UC`…*PJû}Ä ;H8ª;±ó€ðjx 7 à&"0¹¤UH)_Rá„æRì¿Â¡‡g¦«‘`aõ‹ŠvJA¯!ˇ„(HqV‘Jù\Ð^R~q /*¡CP¡Ó=¨`é’†˜e'CŒPQ $¡6$W•œ2d ̸^¡€8hð l€ ã"§Õ¹ $XËŸC¨à  p‹'… bNƒX£wE0†’ì3Ë>˜Ècˆ¤×§ëKêƒÒõ݇ï=Ùù7_Å<¥Ë_³«¤þé?þŸÿ/ÏÃ`®ö"§w—ï>BÃoÿ—ÿƒ 4çÏ–SÊ)›9ÁÐ…Óó¹ï: ui§™íO}wêþ§ÿÛÿ=ÄPxÖ§§ŠhʼýG²Aûw{íÑÇ«·ÑÖH±íw^–®Ü÷_Ò„nt‚D¬w—qã½ÈNqÊ ïª¹ºŸ»/A–çµ±#kç]Óêɱ%FÆ ,,@tGÊ¿,Í5ÊÔ ÂKtV%å¶\PšnñvT³É^5é+ŸÆØ<+•9’Áíº¾Û穦ÿº$ÝJ/m“IÜm9ž:/x/Ö—Ï/)a=@¹žrûcó¿yYô=ãGGSÕÚ7­ c¿ï{ ÿLÄQ~ùÏ—×-å.“ŸWº!ÚPJ>ït<’·æ‘¯<í·24©)ø{íäÝﱑ¶cCVÏF6?ËÅ´ jáxöo+Nn±± wSÞ¿-Ê•£×Ƕ_m¬´mÁ¶y³ìy'“ú°ííöcÚî„-™zÀ7’¼i”ÊÁpØ*‹V†å!ë‘uš¯Q9ea$Ì·¯pòׯ6øÃ²ŒkÑ\tëwŽ“Tøð¦Áå„ß Øå¡¡¶þ„&nþ\²£È§·YryãÔ¼-´_ÜÁÅŽ¶»ê𭠂˰=ÿ¼E)rpÛöä¯úOúNxôÆ^/8Ȳ¾­™½ Òêñ’«Vý×±¶»V€{דã5EÚ+æôÀe/Å€6ôí7OÍLr£¶n^]·Òì^N®9îÈÝó¿wf½õß^G{`cÝÛüe·¨‰‡Íð-/sœÀÂeƒöçÖ|¾Ó ·ÿñÝË_¾Ï©Xzš{ÅÒŠª(Cáû‡€ Ý©wxŒ1vªJ×Åœ­Ô-«ˆˆd§gïû³_®è]˜Í™µ`eR·þtŽiœ‡kPZ§"`Ìy¸&! I9]³}âs¯Bs'4<Ÿ ¬@ˆÂË`þgwKÓs ùå£_‡ôr%ÓplH–2’»»épñ ¡!¯â2;I…(AdC­^cG‹CB%Øc;ÊXØgP. U!)ª""(¯9ìO@€ghÑÜö¢Ä•,î¯EOgªº°[-™'»q=Ô±l¼œ„œ"ñÇ*AˆÀ WˆBK£jµ¾8l¤®ÒQ|ÒµæS ¡x (èÈ($CzÐáC5°ÑˆXLÀx%åyj!BœÃé–Ð+HUÑ nî©+ A˜[PQéK{ÀEë£p³§<JòJh$”¨ˆjgCvåØ*«©*ÕrFÆ`hâjî,h(0#[bÑ!äT]ˆ†!Ã.ðT_‡^«îOÂ2Ì«ºáåÖZfŽA}ÑNЪ³ éb@™’¥-£²“ÚG"¤„’¼ (@&£ª¨àú!ù÷O}÷Û§ô—ïUhÏçh»¾‡‡—¿|¯ïžý»— ´«ÃŒáé7ßœŸN)§—/4§Êõ’þãOÿvy¹¦kþêï¾îúîü|N—A5Æ>Ð=]ÎTcxÿÛod·Œü^ª¬å€±+qw=•C½â Vyóq–mëðî–wSñ`§ÿ¶=Òñ³Äx‹VÀ#7PÙ»ÅE´ÿÙ6w£¢ySob‘ÕvÕ(uûÒö™ÿl óX(ûÒܵ´Ckϳ·¬‹[ÃzÖºW´ÐÒÈ{g²r{ø_ž ŸG­;ðdƲYaÕÅ"Ëø{5Td÷2WãV‰Ù™p$,¾wÑÂ%ñ¥ÖpŒë¡Ü¢o£[‘½“ÙÄ0wz)E¨­Œãd?‰¶ü/#Û_ K[ƒ~º´«ï¨D5FØÓðhSÓÓ/ÿ³f™<\¾Ö³V¿‹‡÷4ôgÏ„9`çäÚ×a½¯´YÊz³K[íñ`'…‹˜ÜÓÄä–²ÈÆ”¢išžÛÔ§‘Ðd/Æ ˜ÁlkÎÝG°à"SkýbNpûAëì`Sè¶£nÊ͹²eúì‰ë¡ÛàŒõÙº™.”V<®21; ÷%‰] uå2ñ€Ê€veº8Ý4‹Ÿ.óÎËm~xÃçhX`2Çœ…èMrŽ|P¹[õ÷É–Æe$6užÊvi}J¦äèôeAé—åhã^œí„ÞÁæyîɇ ªÁ½ «Õ·íHÝNƒÅ f„¬_ƒ¬·9oHØghµË6wDÖ%éu”àvm†Üø×%lŠ«ßÃEžrUn¿(×Ûðø21C÷÷znæÎ}z~Išìk¬ß×=ºr³7‘hÍË–@n&éfsÜ|ó6‰×ÖÑÌ.¯Yfâ‡l‘lÛ›káä ¼§¶óÖóù¡ÌN·ôÛÛÃù˜:þß±RÏI›9Û !¹È–®²˜\”nÈr‘Ùîî÷²‰²Xbõz<÷³¿‡JÑÙsYœÉEv#ëöÉN©ÈñØZyÈÄü©ÿ¡ä¶ä‘ûYá綠àfõ˜¦Á‚Ž´Ì]y›lVÃÜRÑdM–ÛÓM'‹-èOдÏoÄ‚çÐV†)ÄÆ"#u;ý7îl0O÷\äø¥då¤*²V¦³Ìþ“4§ù÷ÿòïøÓ³”Ý'¢,EA%hPíO½ˆhTˆÄ®37Äì&&¢¢ª)™ˆ Fš›™d:sV è×dÙÃóY bâr5Iƒœûüa¸^®Ž‡—áô͹뻗K‚eôÑT$¹t‚ôrïÏ1}!›;TÒ5›åìF3’–S>2nWfó«ùPLx „Z†ŽRÕkEBtíH‚Yéâ¸å: "4Ô:wÚH±G5³ÂÇÇ«Qнw_Q¼bC”Ë÷´Œ§&ø€Ø!,C€PJòʉÜGKn¯ês1† ¡Våsj¬g5þÏÀ“º  z„ñ­ºt† B.8.:cð/ÌHpª"*  í –«#B¦# Õ&ÁR`A>Ïk7ˆ ï꟡¢¡ëlÈE:'â.~ûsCløÆÆ¼º%—-¶„š(ºˆbl"8’Q@xž‚G¥ ™Q»“«d»Âä©ê±ƒ“Ì! ÈWô'æ„A¨Bùù‚PJS­ëw«‰Ü‘ó3Ô'\@@5Ÿ]žCª5½Ö›Bš@!'m¬ 9uòÜÃ!‹bB *‹Ž€Ð@&HZ¶W^† ¦ÿí_Ö÷!¡YÎYß}uͧë÷Ÿžûw¿ùOüëwùã÷*T³ë_>\‡!†`äÇapçÓû§÷ß~‚Š@ý¹iÙͼ,€ÿãÿåÿ*QwŽ¿²ªð!÷K%eг·…-}ä&-¨›[*ÝZÀYEÞ÷¶×Ãàà6ã²^fN “¬Õ‘lÓ¦˜´æ­ÏeÕ騮Òêe'Ø”å/Ëy¹Pâ6ûׯ©+ø¸ôMnþµyš_t¾õë™#º–ÿ8µQÊîwó@!·ÜÖ·ÀQt!>á½ß®‚iƒÔ–Þ¾²ÔycE»ä(ÉêiæÑ`m;Ž~m<.9JfòužT{jÍ+*OÖµ£² 7KÆßd ¸ÑsÚÏáž*Gжå,ràxç!ü°ÅÛ²Æò>‚ß¾\ÞHm¿a*}JêzgÚÈ^íÔg¼âãªÿýoþ‚÷¿~½zÙøRòÓ£Ëæ1ßå–ŠÏš¹Bü?þà‰L<0Ѝ.ÌyHfBðâ~ý8||I®6$ZÎÉ,»8…»„ JbF…”@€¦+D ‘EÓ/Ò¿j pG6B蕹Pd_jDèE7ãØ ¹€n€C" }QÒ_`WX©wØ>¾}Ü ^g! €ÆÚ©Pn[BM<„÷¶ dA˜.Z|qžº×Š,Y¤ê)!S)ŠB 7X‚Dôgd¯—Q¸=ì#N€‚V 1@O€C Ìs–"t0ƒåê0ê…#žä: Ú!žpBjÇÓûè.ÃOÜx…²>ðÙ®£8è–yPƒèž ŠÐCÜäú‘“à.SŠÕ˜Ï_{zñÁ:€RæG6z&À„á  ¸ÂbIØ–¡@| O•€”ؘ+Lž ¥YÁëûÒ)cPEì»ÚSB B'smª ‹œ•OrÉ‚@ë"#—qxÐʪ§œ6$ØŸC¤~y AœÉE¨¸þû„dÝ×_I‡á{ÿÓË]ÂÇ¿~âJ?ŸOÝ©ƒˆ!†o~ûUÿîÉžíéݳªäÁ,›å,Äÿðú»§~!ü,›b?çÆ/Å*_úlõ EÓŽ¸7•%ül!aÃæ˜¼—nŸs:ð#ì¯ÿ½?wèü8‚îŒVùò~hüæCéöÐgDá›ÏÏÛDËQð}ó´²à[ý`¹¸ˆ]›ÞÕñ_p`d*\$Få¦vpèÞ9µ-Øܬ/ã]U¸œ;àâúŸÇбt]lD*îNrC>i9§ûUÐ3€r[’?uåon\öòªÛNÚbà'þx\ƒþZ1VÃ=.gÉTL}/ãöv1ë!öÕ:À7ÜÞ¯_oy^¯™Ÿîà®ÛÒ­Á/ñ‚åÕÏ@>ûÆûöl˧?’Ùh›$çZÅ•U¤ì©AŸ"Ï ø" ¹×@³Žyo?ÙXæ¾zøÎ¥¯‘ý@úeõ¦‚÷¸áë/þk;긊ÄeîmÛ£|lB´ŸZÉéÛB.þáÒåþÇ^Ø?ßBù@6í莫ÊÝÇÎf)+…g|U¸t‚)òð¿.áñ¶ÃìÑLÇÒp§gø5 €Ûß3Ó}äSoµ&ívúÌå–Ë|À60öeï—V-,6?øÒ!àÞñõu;á2?ÉW-vwè•þ>23§’ÐÅʸïE 6’üÓŸÊKyùˇárõd4 ª1„DÕË:Iªj *j4ŠjÔÓÉÙ³!(„0sf  dPq£(43ЏSz¸ —±‰¡”/+¼X;%šF€êÆ’í¡"é%Ã¥yÑ÷‹­q±D®‚òÖ %I!JdÇõ# ˆB€9}¨-ªµþY ±8\H»ŽY´Ñ³sÐ P€0Xš3.*p‡åQÌ(¦Š>þ,"P>u ’P…  ª·0õ7 !§jÛ )! H@(*"*ÜéÖQ„ ¸ •LUdß§eô 8ðD¡2;¨ô„Dàãw§»þœAœžÎ}—.ƒžcîƒÎñ•z½«+È:…° ‚‘ÎNbh³$-ºÜØæˆVøÚÕŒ?BAl“Ëù[»Ò„ hzFÍ5·Î<’’¹ó÷ÒŒ`N¬¬Í"UZÓÙ¤xœ¤Y sޝ–7•mÞI£aÖ·•€7ž.ö˜;{!Ü&Eni7Œî¸?ÞD@ ~ïö¹˜íU[m÷ø¦TQ&ýt‡:´G¦ŸØ+ß ËÐnÜlœ!š Üg È’©Å½—8ñk¶Uì[*¬â†­ ÀYY.½2³V}Ÿó+¬ß´ÂÄóî^Í­Ö†E‡š`ùZ—P‰<:¿‘yùÆ–Á²Í0µo”O¯ú dùL€;aS´±f ÏºË›FÅnÊ•;^ ÛGÂ¥šÏÄÄ&‚œ÷â¯{\õd¤2ÞŒSkFnù«é°Kœ—8¸ž§»æŸÛ‰s”+P¥qxLƒCä³×ms;Z˵r¹~î°(ÛæBY±ûgÍ~U}ÎD8ÃeÓóx·•úá>7o/ö*n{¼–&³JK®¼ nd„&ÑtY‡„ƒw*[ZKÓ5Ï ÁfeÚË×Gi·ä=êÏx˜÷RWQÙ9¦oÎr”4ßÛ2Ò°Û÷¿…«Íp¹Íî¸eö>˜ å¶ÐîM÷² ùà\¾„Y­ƒ·‹³¸ýjÎ\sÔf\åîM‘µ` ×Ü~ö~Ä•íИëYuW/rªÓÀÌpØ6m˲¿]g§ZÊåYY ˾¡¬c‹6i±@ ¬—Çq«¹SÏBiöQ6˜{8Ò-¤h›íâ‡M¦ý{ÄÛ`gþ˜?þîw¯SU/ß½¤ËÀl„B5Õ €D 1dwN•¨Qƒ¨¨ c(OÍHo]zÔhÉUµ Á¯n¤¦k6>Ÿ£ÊøÕ¤¼Æ@jïa-jBæ ÂmÆòíddy_”’ñìÝ.@›²õ;YÄ=“¬¦>Hös)"û„`üľ>Í´ŸPB8çÜí·ùLîï@½åYý-É«ÆÞÛðX ¿i âOã¯Næüô)ÿÙ:xìx¸èÎiþ=à¿|†bÿ£vÆë=P_òÚb»Ÿ¼/“›4ÄÖ†ìµëæºsôVƒ_Ì’(ËŒÖrs”—Ä·t¬M;sç'÷õ¶:õ]i»­õyô@Æ6YuÔÀÍŸ?Þ8ÿ;^zpMh+ƒö2›£ãÝí~µ=ÎÈß;ÿ߯ª~Ù°î5/ckQ°ù$yåï|¸`÷Ûˆ…7Ñ$Užý²©”sÍ¥_øã?ýãnnID.ß½äËàf‚Ú…îÔKPÑ’³ AUµÓzNO9è5V]Ýݪ h”AByДb×Á-*=Ô! â0ó(r%Ì#yqx„ 2_L»èÒ«ÀI@.ÿô;Ìiá©‹0;”äšÝ…—+ótµá’‡«zÎv³Ó)*¢.J©«w#¨p,ëÉSá¢0‡^ƒ0(PËÏ¡D×Õ7£žX†t5Cƒ ŒÀò(^_Á1x©— |/Vtaú¸ËXgG@F¹_ªãn›£Ê‰€‡Ú ିXñ;†„šl`¥'Õ\H¶ú³9!FÀ+èãç«Â‹{­€D(¿Èª®nPgØé@C~´"á\³‹ª­ó2$¸£{ª2:ÅV“ùP²Ó`É?%Ì] c_ ¢ð\[4Jʤ\!Æ¢þââà¨5û¥ç# `Fèª/€ ˜á^ûæ¥RJ)öÏ5à3̜֔mX†èÿ)1X:NÊxcW; ƒ p'2¡@òøò' hóòr‹ÑtµŒD`  Eˆ†ÒjÀ҅И³‹ˆ¡y†(”hìBŒ¤}ý›¯Ÿß»§w§¯žøôt’¨CvQQRD=† m ûßì›§ßôç¾>¿ÿÍ×µÆL–Ùá7-õ-˜›ûýÛc€~‚µuò¶éÑ€ù»{µ?€&ŸãYþì óÍŸ¿˜öî* ¼qž]YcÍNË€µ}Ö§k²09Xô—Š|†ì[Z˜ï«¿‰G“xkhF¬‹RÖ…ÜŸ¦©-Ë3¥%5#¯ä¬K1€Õö¹å(‘»‡2ΫˆèÚ»Î-n˱ïǾlçÔä|ÿÌ×B™>£bu<y´b½jÐ~Q戵4Ú‹ˆ¬+y¸ÊÏžáâò£?î…î-óè¸ùÓàì¿% š¯}Ÿ€®øë‡|¶—ú²ö¶¥âáÀþz6NuágðrcѼýS²ê2øiŒçÒ så³|ú˜©¦ì?$Þñþýi¸t|Ú÷¼j=[R¤éN‘GûqiièŒåŽžÏ[çŽm–`¹ô”–Ç­n?óåOïqÚÉ·ÍÃìv¼BýhçÃf“¾ïƒr,Cü8O¸)¦{ÿvð¬8ûèÞÏ`ÏÏümйE<4϶Šýa‹[í$á„ÈŸþéw7îKCxùË÷é:X27ºH‘î»ó ‚»®ë®iH)UùØ] ªjãyËÌÍrP¢^Í‚ ªCÎîJ·ënt飜cÈ9…(Tí”ù2ð»«_”zz>ß_®É-jè…ùwûN·Ü ¼úžJúèsK! ’ò`>$Xòë€a¸æÁ’ÁènQÒÑucŠ¡¤ 2sæâÎÒÐ# ÐAˆbœ®°±œþÚaxAˆÐA`XJÎ3´C'Èà 8Åã÷!CéɈýH´ÇÈèÇ\Ñ_+Ö½ŠÝµ5¡uxà˜< ¨5ÁÑTZ“îUÈ.Eý¥°Œ/‰‡0°T¦^P€F=k½K=r; yÆu"@&аÙÒÀ”¤ÂT_jÞ\ ¢Ðˆ.‚†l ÐA»§§Ë‡<¼X¾ ,ˆ“ »‹Žœâè<<7õ@8»4›Ì—]IM«Rµtð ‡Æ~¹Ž|¸Á¬‚˜jíÿóA…%䡿QæüMWfµŸ£6©ÉË5 ‘Ó8~FYÝRM !þÊÏ$ÔÔTŒJ÷ >¹Ã‡«8#ƒ ƒI B„Å󙱬ÂLõ¬Òzög'ò%ŸÎúôî]×ÅÓ»'}ß]/—N¥ë;83æ0‡ªÌnƒ=‡÷ñÔŸžO§§ó­„«|Â*>W;ó Bþ'³g­‰?ÂV%œ–÷r뎖ˆŽʸM˶ñùu„•XþS…ί®rí(p( W2 î#Û†Iûe‘5!m ‰eM /oJmßfÙÛeËÚ-œ;g9õ^/»hïF_°HŽˆÏã-sóŒv+nÆ¥§ä8›é $2æƒÍ¶gzjÄÕ™.w­eGqf?* WÆN¹ò•á™%Ü`¡-ÈŒr™s¶Õ6[*RpÁíYTþcêØÀØ&>AÖg­eNq¹2ÉüŒeÙÀº \Õ„ ˜Gí±Ýû2S畳>~YŸ½æ6 ® l#ïV1¬‚ºÌ쀕~·ß¥ÀÅ=­þª½,ÊR‡Û•·£ºI¡­àŸà(ª g²Ô˜—Ÿ×Žw¶ÔQ¸N@Ëæ;MÙG? { ‹¶+}NŸqa­Í%sh»pî´^ß«ç>Ôd7¢1=3|ÞØ›È†q&G;ðäíÖ® Ø–l³a;,»ÆöÚÌWÎ3lÛe+¹È&…Ù¶ñˆì+Îë·Ëfô-깃LÚ¯qߩԫœ‹÷.²w‹÷&Ó*<í=åâvíò+²±(a‹3Ùü÷cKYáwä8 ’UÜÑçÊ æ‚ð k ‡‘àvœ“7—å&×Îè½E@À…n;÷H¶¾‘¤šÞD™ܘÊõù|ÑWä¤ö©qL§ÎóJ–ÌuèÓÀ ±ÄGMjÛŠoÔÞ ÷ÂJiZS¹€IÈn„‰ù‰mßUVŠÌõø‡g„ÝÊßÍßN Ù'¦Í%Ïu~6Iv¬÷†IÔ2«çò!£Ê¼í¥rÑ´Ù/YúÓ7±‹=ðÑ­p³än"½öù¾­Xm ‡™Çy‰ÝÚ1¿dø½¬ª—)‡;û¯N¥cs̰1rÕ@P–E,Í(BëÚ-2û¥9 @dÏnÛ7Â5ˆÛ´â¶M{=Cȃž‰ Jk³Âí!ôó{Œ¦£7»ª7*ÛèNU…—NîÜU¬÷“›KZvYÿˇ³OÜkƒì‘³-MjhÂmú°Íc–ýÙËXo‡{†7à¨HT–Ïtù6åvÞQ¦R.Ž#Ëe`oýX$¾…Ój3aæÏkV4 ©Dþôûº½>|üï†Ë•ætªªÆÐ÷=B "Ò“e3«/Ã\EB"Òw½»Ã’‘$²™¨@DÜbÔ œ5€Ùá NÏ9 DR§îlê— 3u;Mß_´ PwÏÿò¯’®ìƒžÄÝ$«%3 ª3'ÏrÊò"ž³¦—Ár–œóÕ(™Ì6@H„:ãK½>G>-kÝ4ÄPÿU#Ì q”Úfµ„¼THa *³BY$„KpƒiÍ¿x† œ A2Ô‰|P¯¡ª# ѹ¼MÕ†8$µö¿Ìœ¢YÙ‹j¬p«õõ…5”ÓÈä)µð¡ªÏœ¶A"ô`áíÄ1ý0ÊAý D½N›à„'äRçîUþVB¥ºøˆ§ò±Û Ücpˆ6×Ô†j{[&sdƒ<‘cxÁÇýÑÓó;QæC¾XºP;ÄòÄBuf–±Æ_:¶S°=¾”1ˆ§ú4&?Þ<€FÐ๦jªCòä™ì…T¦¬Ê8Pt|Cˆˆ}Í]MrêQaU{©˜3r0⤸þ9Ž0@QÒ˜ì+«§ h¸8DM’ŠNÑuG”QÌ1XÙJ18D$t'¥:Ø?¿{úúëýé›ß¼÷Ü?ý—ÿ>QžŒBxû… 3¢AIqwºGñ)„sìžNïóÍæØ@¶‡¤µÀù‰Ï1çØ¤\÷ÙT&HƒÇ¹q6ã­”ðCZs52þÜ@ùòê¾Lûán‘õȼHo2\KÏcŠQóØGÚâM5L\@Ûi—•í.¼‰Ðù&0…+3Q¨FGkýT›± çK]1ËÛ½ ¢ÎzŒZ)æ¼'z n°×V»2Ì%º~q¢Á[Zkwó(·gýT&Ë6Žò3ñ5FÄZ»ç’žäãôãòpvS8Üè©ÁD9Ÿn—ñùüu}¥€ÛÜ®’[Ü,cÓÕ?æÅið—6C&·½"åñ7´›ß•­ö{Ó‘æö/}<ßøyÜ7Ù‘eßÒ#Ûd§^Ï+Ôò1¹Y­èÊàC›‚·=ƒ[Kï¤"ÿ»¬Ü?KùÅçø¦n»/<{Þ˜ç#%óü¬÷ôšOx p§@I»Â6wËÿùzÿÁW¼î£Îýxg‹çrÊËëÞì£jéRßÙnÅ7$Ý×ò%nSK;„£ý«7v¢?lQÏ×i7[‘/Тpè-;Æ]¯™tv4M‡‹ÃA3¨¶CK°(HùëÉ—ÛÀjÁ9œcò@РJšÂîä²6m²“Ü ¤Ü|ÌbL?ñ}™ÈA6.·"wV¹½³KÕ»ß2¦YÖE\­EÊ®ÓÑ:5}|kùË&“yt«ÕØYVÿaÖ™Ÿãá“ÇrÏ2¹*íyþ`õ¹m¼qô·3GX¤[x{;ç¨\ŽŽØ³#²ÿ4ÔšÁʵ¡üóïãù\¾{ñ”Í̆HˆQ»».ž;DTBˆÙ²'«y7UÍ2=v,ƒD4ªHõù=IJ—ä!8¢*¢*ƒ™“žRè: ½Aðñ*4ݲÐh’?~ì¾~ŠïúË?þÓàôtóàÌWxòpRäTµNzL1Kæ)çÁ Yá$-¹¹¢Jœp@•ŠJŸ‡ÐOp@ /ÅA¢;U’{1È­ØE×Á‰‰°÷VÐ^À2òøÂP×_Ñ ³ç¶v´àØlXŸ©`“ hk}e{Õ{~ G1Ï/:?&—dÐä’·kX¥RŠÔÕçîiO–ã¥u\BCúß*2ÓøæF•Xš—þ0¿SnÎåxWczt"-ê#åFäí¤½š’iyÝ¡ãÌ'ÖY×6ÛÙ,ÛQÌÇ×`¹%˜LuC BE¾@ÒÎo;ŽüP§þ{‡x¹aò– }-Tùׯ/®"ÿÒ^ÃJUø©¾“ŸñcÿQ.½Ý¹­ûXÔÁŸÏÓ›nÉMù[ÎOS³–Gã/þöÝùCØâöþ™‹ôeíÂþºsÂŒù]5’ƒ‡È'œ²Æ$ïè¢ûi1äV, ßÿùÛå¤étàªðfÉØÛþ,W¹±Øc(šþàÒÜãöÏüç¶ezSªJàûÿøîòá"îåoCÐî܇.jÔØE Á³LÒIwªœ0—UAÉôDï„ ÚàˆBñ@sAÏQϽ^à1ëB¶‰W§]é;8cè |äåÒÀ!Ó!t¦Œ.ˆ ÄèFÏš™Ý,¿8ÅSg.ÑD ó”"H–HЋ›$E¡ µ†ZQ«<ªOJI¸AF0‚.BŠ®­ˆ=Bä+H¤À\W»Œ¡Œ4@#B@”êî[ìö$TöŽøXîci7jù? „0¸e¬è÷jNÀ±’]Ðì–ù ‘ 1V~}¥ükÕß pfbÖ×¼¬!(Æ¥Ú`´Ú”QϪ]ðKöÄœà/ÖÄý¨q£fJD«Ê_ªìƒB:HÃ8ÊcÆpAúbB ÃpzWõo/þ‘ÈdîtÌî "Ð~\æµ&ÊõÔÚÿêŽQŽC¨E÷åÊødlY¨r{KöЫVÌ¢0 öµä¿´MÄ®¦@$ÐaVGQ1Þ­åÿ“÷oùíK Õ6o"Âjª16`Ì N@‡jD! !†šð D¢¢WzÁ ‚dHwtA2a€gDET ôûîùÛ¯Ÿú¢ê×ßÄs§=ðÕûwÿ÷PK93[‚EUé‚%£hvºKÞÑ<§üŸã©‹§®{:½ÿ»oæÈ­Ðn‡n‚ $û0j–eOûOðxõ 1ý‹0åç²]Ê—:ìýÜ ó÷ã5iL•V¸ÇŠäœ¸AîœTu#3wMÖX•¬E£Ä»rˆjÄí‰ ´ d›F˜¹¿aüßÕ7¶ Y[jß” üuQ†öVˆ»iKÙÞµ,AÍh‘橯é%mâD;iþ4ý²©}Jcɲ¾R–%‡ vG Sѱ!ÕäTãйˉÒ"äèÊ®œ¿#a½¢iƒž Ã&+m% ! fF-ˆhéƒ.Ët³Ì áž0uÓèx"Ú˜iîMÉ.ÕwdGÚà¶q ¾Œ½DÎo]ÜÂûÛž/6MÚM³òbÀp6¯Û,´l@.Ä>e£íò[\í´,4®’yÖϱÆìã½Â{ ·’lçíÂe;©oÕý7=ïØï+\8ülš\ÚU_¦’¯åŠ»ÈÐs%³Óå´!µïpÇ­~jÐ[Œ4ksó»÷÷ë- igkhHh²Ì3/vÒuß(p }rÿEÎÞý2<áÑ".l`nËi±LHO±îj´ÊG¶Ív¬~ïx¡Gw9µŠrª©m{b«áþjÀ¦©vSÄ2ÿŽÕELoE¸Wú+wÔÿÅÆ·h¼Ý¬TØq}­šG÷ï ?8Õ3jÇìd"i`Ͷœ½£>ÏÕ"#û,µ±Ë{éeúò*’ÙF,]â©ZÙ¨A4˜,BK:.ÉÔÙ¼[ .·$Kîü¥¬§ ïíœ7®r®w–igØšmøp·a2{ëôìŒ=ç­ìCØñ‡¢þÕ…É–jR{Ì׳ËÞÁ5÷læÃã•ãšCòÆù„KfS^Íî„Áûâ!ß|à·­MndZ6ëâÅ…`‹@9ªÈbs¬‰E²ÜW¯˜<,F“%ƒs> lÉ•\mßf¯òž¿¥'µ3·¥pÛ5oI#’ÅšºøÓfÊËnÝÕú£vh•v(-tùåÖÑz}Æ|0´};Ó«‘Iþ’6Ý8ÄM³¯¼m‚rŽIeá¢1özüû¿ü[Ωðýé®®.ézqR ªbÉ®×ÁRópêcc5V×_Q Aáp)Ö«¢*$».PE`æÜ‚&‰P*ì¤V€MÙòžžŸc»Swz:í„"¤¯¶Üi…\ieBž-Á#Š£R©e¹_Œ+î|¼!WÒá—i[m6ÈQOæÑwímúKdé|âǸŸ=Üp+[Nï"\“Fôk$¨ÍÅY­å ¾ZÁ_J O({-Ô+ýw^_c —á;~¹Ðy.$q™Y©KòDE©(µíö<¢§ìvºàÜŠœ$ïæ˜?öð &xèNCFÛç±SΕžwoJq£²yA5n=jô\ñ[Oæ©6éˆ< "à’;Ùˆ·'æ>º‡²—2å>5s­`®»h‡Þéÿ³©ñ/4…ZÇÕ1\vuÑÍ´]àíÛR”W&ç&S¡i¥—%a¡@·¹9bìÈq.vK¹¹ÅØx×¾i.T@r·Ïi‡wÿ¹qËä_ç¿\©Öã·¯0p·E>>škæZ"=>¨s';rX6°{!÷X&rKª~UÒYZÄŒ$d›DÙô@R>áE…ë´B»OozWÉí¥mDÞ IvVäÝ¿mC’¤¯Ü_š×¿·äÃjšßò°œËeºbŠÉ¡¿¦_n'»° t]CÞp Úyø²]ÖÅÔK ü6_Ûg¡ñXÂU~‘m„Œg ãU‡Xâ·oäôªw'w¨lÆÉmÉë3\•‘Ä%wP³£?Ѐ[B»>cÛ€ãº(NïŸÖ°fÓ‚«7…´J"ÛÀn÷Þ‰~*ß¾M˜¹=»[éãÆ'pYñ°€ëŽ?¼z;íaï±&¦æà¿ðàÍF¹šõ; ÚZiôH¤,çÑ]›>¼zQ¾™Û[b͸<5ŠÏhzÏf?Y¥u˱\t"dõfÅ¿þ·ÿ¦Êõ¼üå{ËFw9eww"h ”êµ ]èú¾>‡.ºç”LTžåT°Ý æ¡ ž2U1O¹?uYDE=§$AŸû'PM¬Sùøñâdg )_R|îðÔ é–=æ 1§Ãœjnÿöo@†¿þkò!¹‡$gÀ“½xΦ0w·«3š¨¹S;W¥ 4‡»H âP‡“ÔŠËw®ÐŽ@UöcÒÒ Š¾‡hX$MÕ¨gxŽ ”`¨‹þp9‚ ÈKì+ã¥èSÕÔtYÂX–ÛB€ADˆÕ‡`òÔåhA\ü0„ˆ1¤‘Ú/`Åâ± ¾’g‚‚´Ô¡^Êäe΂P1‘"J‘¸NuN Je÷»×»‹ðÊÖ/YÑ Ù‡¹ÂŒcœ›È/€Ô{,ÆÂÄ«3ð$?øèPNI”<‰­¹03¤ 8=4üê0Gè"rÛ¬ò‘ Œù)´§Ú— ŠX†ÛìƒUXü$TàÅÂÁQøQ¹Ðœ˜Á«›Dua^í‘+/µÑŽj ¬Þç£~4!þmœêÖüÙ›ƒîxHÉH•~‘ÙªsÊ¸Š¨"¢™•N!ÑGœϱf§žÎŒ Ë úîtÒØÇ.†§'9BìÎ÷÷×äÉLÏçĈ.FÀ©Át¡["ÉÝR~îÞ….†.vçÓ»ß|Sƒ8މ²ÂÐ-½‹ð™ûaˆÌ¹sÈCÂô*… ÊüÉMzí>›ðr}FûÄ‹\%Öï3ùÙ0¸‹Ç»I‹4iñMMþ+ü€Î/œŽDØôubcÄ¢”*+• 7ì0vÊí¸,Û‘1¬më%Ñ7Ø2º¾åäò˜À÷Ã|Åûsoªá¸¯ñÞK ¼…`#³ÎN›œvRi«ž_¦=‰o_g~Z_ò îÓó~ýú™|ÉϦKïykÝ„üu üD¾ZîÏ5fù³¸m~îÿvN éËÅæH ¿RG~ýúÉÓ"‘J[ÅÅŸâÅ~†Iô§¡ü²÷xÙÏ*VÁBä¾uØX°=*;áö¯ÿöïEôúýÇá:XΞ „™M¹C- ›.D ÒE §¨”Øiˆ1 Vä< Ú…4hÌ„®€Ó‚1Ë!‹Œn)DÒå"B*èE¡¹DfXÈlìºCêÜÝU4ôg§ÿÓ«§Ì$Ô«]Ot·ËÀnn,]jtÂ) Œ‘T¸1Ð [ ÒD #we¢úè©:µ†Q‘ æÃåÅC0@Ü\µŠ¼ÕZ1'UÄႜµB{èUšBˆªë”Å™s ‘|?N#Xªö±¿ºà싘®£Á¯zŠkš@á€û\–ãcÅú ¦Ó•õ+sÉüÄ£wÌî¾åo}¢èhuæ±8GŽA|üABØù5L0Ô^„*¬©@E:aöá…ê÷k¹òòµ>´ŠÜ) ŠxÉêd)%ÿ¥º?;\ }e÷‡¾fV}l¤x†Æ1Åâ³.‚ò½^d¥åQµš^tmx‹A‚‚Žt­¯Ì­Â‚¢Žy¯ä%#’,°i¬²ÿ›—%ÿ2à ÷l~«&ÿCrýéÒVÃÞÞ–kÑøÿéªêî"cwýî%]š¹¹;-[u9TÕ "â"AUc°dA£Ó¢Hˆ$ö}-%æ ¥@ݲ[ŽAC ù’@„ ‡ë%Ä.ö;…±ëtxºà„¿|w±œº ìbß…N%ÉyŠêúÅÄ­;Ÿ¾üþh)¥ÁÔ³ÓÄ݇axI W˜ nfƒyŒî`^P œIƒìOÈiÆÈÂ…ÆR0Yjü}¤ÊR€•*š§ íG^ƒ« À€dp«–¿…¹Oe©Á×Âçq­´X˜9ÅZÖj•Ýd¥[°ûJ„‰3“+è_ÀXd…ʘ4 vuH¨…," c|Aê³Våc¤Óصþ”„*©Cà"—›¥¨Øc˜UKÍ|Ô‚ùÑÿÈé3š¸CCé67r”é‹ÄQŠ÷1²-"1ªÐÝ^¼¸æBf6©atnê}ªŒ®U˜×õ¯p“‚BJ!?–ª+@y¡Àˆºšœp"2ªOrÝ(–FƒBé­ÊU@Aˆ`F¾Œ<%¯|!<ÖÐ|~žžÇFq­.OÛ7õ·­ú¿•ʧ^ž÷@¨ÂS;’"ŒZX”òÿ 8 b¤ b€8Ø!F¨Î뇴íûîô.>ôt–%v£†¨¿ýÚé¢j$}ß™1K¢!Àz¸‰œÍ†d)Ïç®ëº¾;½{~÷íWãùakøXÖššXV)^‘ƒÍ¿-rCíçhŠÒNBYaâua€²/© nxöæžì½“å(]é!²p'Xö(þjn ;²÷o‚´4'GNáÞ¯“åñ„ÿVǔ͖E™œüd”k´. t>T»½uV!~Ê\G]kaêV±Î:sÏÐ’9kR°åVÊB¬¼s›ó÷Ë*ᱪ]ÕX´ù‡vûi*nßw“G¼Ê™ÄT¢:±W©Y[”Û+Õ­:‡ùAl;‚eصñ½¬Ù£Vâå Yd¶kð¦áhþYî«´·ŸðJÊ\ƒõÀÂ`ï q`bqöçFBÞ_x°[­"Ù¸O± [¸m¬ÞZ›ltÿ‘9'¦ÿÌÇ÷qX@d Z:?ç"ÛyïÞÀšš‘ù@%Ù±'Êòˆ³ôŸ™l9VBÄ6 ¸f-5ûõÉòÆœYÿöå\k±ä®H"m›ì ÝÅ*™2š,ŽØ¼å‡…ð¾\£÷Þ}û'Ù¦#îç_3ö'Ïù¾·EÍ‘DþñÿøÇýÌ ª/ß}ðdnôl¨ÔZ„BŒ´rT DbŒ×h4— ){2†”@— ~Bé5j-k†¨ÒŒ ³ì!Äl–sNqZN p7ËR¾^ÏïNÈ9jZtI¹¾  àò»?O!Cz¹äˇ$n^Ð9Ù,áF/Ô¥ •Òrö½gíƒàL”çJÂ)Åõp …Ð8ÊÐDN`ž)})Ãb?ÂmPùø~…Û‹kØ%TÜMÑšàËã/eµÍ =Dá ÃK5§-À‚PXç>Öž/1&2šÓª -Y=us©‘c=ë7LõþS˜*ô îp©UÿØ!{-K‡Uå]´b|´¯­hë »ªÞÅîXP¡@ѓڵ6ÌkZ͓˲š H`¾˜†Q¸‘sä4–Õ;X|zG"€Œ.»¥eÁX;,U¬à µ¿4LØQUÿb¥ÿ3×tEMZ”>Œ\?!Vå/°<>:Œv¾¨?ë^³M¥‡ÀóÌùQ o´þU¼&KL͈VªI‘8= €Í¨Â#`0CºK$ÀIqŽ,ÃC‰Ð«­Ál<§•5 ïºó©{~º(Ñ}óu×?AÄ̵©Ä‰‚™g…jP-.Ãðl6䯟¿ ]Œ]ìŸNßüý·‹ãÐè®Ö:gm€3KFÉ-'ÕOC–Ç­+)÷œ×DÖ`É[Òáœóʘs.LÚ9ËŽŒ·Ž\çG³ äM…»!7Ö*ÑʾÌVœm-+øÉ¬!iµÙ —öO² òeù‚Æ‹+±„ão:?‘$‹Ñæg‰ÙJ{M¬åä+4>Äzæ¾!Œp{j²«ûË¢Êf9C^]æ%÷dÉGë—>Ñiû5¿k©°,i´÷@Ü˾!*/ÐóˆÜ“„ý§^ògz!òð÷ÜË1~‰¯Çz”'g³µ»8?ß›çÝRÅ_¿~ýúy}Z¶RïÚ_ÑýÅ`‘Å‘ö ñ¿Ž¨ŸÀp–¿¤ÒÏvK8l$ú©\Zÿ:ýI-Wr¬|©§qO_`Ž—É‘G>àç¹Î°iàò¹‚\Ö"Ðü˜þp û_¿13:Kï¿g³l–3Ptÿ ( A5±Ö,ª¨Hˆ±jCv ?š3›¹iˆ>¸‘Ë9y§îªµÀ™ÜS !¨Š»×k™ J Qä OY¢† éãAýËŸ_žÎÑþðÇlü˜sþî{{¹ZJùšÜ\a‚, ÐA3'uì”4 EH' Z+»áЈ`sØÄy¼ÔRn˜A¤ â/¦¬U×ÎÕ¶ªðqzªbÙóà,Ôõ *:¿žñBËH×ñ¯$0ל¡c8‰ì`FÊc ¼ ¨6%±fâ_ý¥ÃŠ c—kCqäÏ” Iý×Rþ_¹ÿ„³zÞŠB½–Ò£݉;ty€Ð6ÊÍAaDn+Qèf¢MOxÉŽdhDìÔ*X—n>zÛHC’Ùɳä!DçRTå˜~ðú„KVFàpÜc½B!<×üMÁ1•>Ö> |ì)¶¡BüÍÀâm0À8öÈ ¡C¥×#a©tuȨÙ”àiêýË/‡ l)ýÿˆ úo ÿ§|Ï xºòò‹ƒ@‰¡\ „Ž4T“ê xRŠa¸ÖÆ—s ð‚v@Mh‚‡.âôlzŽ1†X_LW&¿>Ÿû¨Ñr.æá™0œ Kv gY:ÞŸÞÇ® ]ìNýéé¼(ÇúI†Î_Ðàׯ·¾FÙ-äþT‘îÇn ¡ ‘¥“;9·}ÁHïÄÆ¢S°®µæ- gi+Ÿ%q²G[¯$œ&sóé)O5•+ÅÕoæº w* oSt•ЀT¸IŠê<ŒW‘³`óW²È5Îmú.hâ™n½¢d•ü[|¹£1Kó¹<—íœ+ä#yüàÆ¬ åÙé”M‚njj¯IÖUQË«˜z_wÀ熴½æ/cµÉ_Ž®Ú‹œÛm¹‹h®ªêdNžóà”…•?¢¬Ÿ÷´Ë¤è¢&™ó»;»¶À¼vœ¼!ar¼(ÉÞš³7b¼ÆMá lüÇW95-ˆßxç{M²uv–9ë̹7LgP¯©“››m 9ÖigåÚQu´¯ŸJ¦ß]­íw–ÊyfMEšÓÚ&Û„Ç 7ì e±>ñ@*ð 9p7^¯R˧àýlÝ‘Ù8¯(0e #…;w{7iL ÷c}¶Øƒ]ÂÚfum†ë^aNûµ!Êa´¶}Iµ†h»àsG`Û£6†¯27‡î¯‹`÷^¨{ á^ÿ˪Qu‹ø‘öÜe«Ñ¼BÈMPË^‘6üšåùmų7ÖÞg¼½_t£×a;–])‹Æß¡þúë]þÚ×k޶•q=Yoórè|–Üqtîo²hBLiúÂeQx¿Ó¤vдöð»‘û"v k“Õd–eîoìœe÷Êýî=€µ¹îÜ‚'GD[}ì¾Ë]»ž#`ÎêÇ·•úKïîÚ2>ù.Ò²kË[*èdß¼b<í`šnN’tŽÑ̦wþô»ßà(%ªjù×ë÷/n.7³lh–•ó£!ľ 1ŠBc AËR…€™°” *OO}²‘¹V/#FgJ9A{ÒÑmx¹BDEº>ižèzUø`™9Å.º›¥!»w]ì;Íæ¯×âÓ‰üÃÇlšsz¹ú0¤ËÀœsÎÅqÖ ‡HCH¨ÐA¡H¤„ÂQ1d„±¿úµføh' À3†\EÕÐ#§Zò\é4ce†PÊÞ­ÒZBWúb¢Jx Q‚0A„êRàïùé sœO@‡©oSV-Åû„x/D*RŸZÕßR6αô¾(¼!VÜǶG-È­R0>UØO5ÜE²ÈùZÿàÃÞê•”|eNÐBz‚tpŒu÷XIútÄA D¶Ñ¥¶\¼×{ v€i>¿dCr†´ÐH˜zJë±Ð¥ŠéTäñ<ö8<Õ‡Š7æ6‹”«ÇCõˆèß!µKÀ2ÄkÎ/eþ€_+y§P˜JïEµ&fMÈè‹Pø?²¬÷7jnÀ¹ïv/ÍÌ î?4ßÓÕÌQµ[°&7pªYeB‘D(Ì(4@`†.¢€AÂ!ÀY±?Åš¸´;8ÅMD ÌÂ9jªˆ]çnÏ÷ŸM²]SVÑ”]ÈC–Pj Ý2)Q@RÒû¯¿Ò ]ßÞðìuDóöj)îu»:¬¬:yWúÿdµyO-àý«½ ÏëÌ_K7/»‹7°HMØ>+fKXÊÃ…û”‡©úŸSKÛÞIêÖ›…ÑM±ø”>oì—´¯“0Ûòÿ¹ýœ‹H|BºÛI“[1þhþ,ñ³£L8Ÿ¢¹Œweái˜L÷RN*swÿ|!·ThHmÿý|ާpFFLªÇtßQ6ç…[ {QwœÞÂŒZà8åàô½>¨m1E²’ngPvKÙ 5Üúœ},ü/ñ‘èˆ2ž`<\r½eµqÉüÿÙ ÒtU-Z¾[L7ol3Êl]Kª†l4ë51©-eÀ1Ó’úNøíê½öèÙ{CÜ[lf‚'5¨•rZ0Ümû¯cqy|P ™r¯\W°§9îþL#ßm kÇÍ=ïŠ]eâwu}}G¢ðv÷ît{@VŸö%b§_ö™ƒ˼¥ÌKâþòŽšÆƒÝe6„Ylô›É¾Æ- Û1#ËY¿ DmÍd5”Ú¥cŸÖÈEºtTR¥éˆ'd®9­ì;oŠëmÍ4n•-.à^wš¬][wwˆ­€z'.\gnÈ€\¨á[âN€v/ßÈ[·¾$&. =óÞTQ…2¯¿c@:ñiÈ=¨¸ÜÍZÉJ¬á”~¸Ç!\Bk‹¶ÿ·ƒß –Ȇ¦$Ò†Û ¹­á÷àËhu=/ȵ´~kÝF.`ß²UÑòµ÷ÄSîÇs†þÚÑCüôÃÆÀœÛ€dDT6‰˜‡?vs´Î¢–ìRÉîœ yøòƨAõ5ɬ®¼·¹=ÀY,ì-6µA§î‘VÁö­7ÑøŠˆ'SAÍò:d x|ð~öß•î,· Çd£p_ªoƒ×©¯I•p3Ee_wn|x½åk½W8ýÔ‚zÏŠûÛŽ1P¾±_nÌ-öZØ&Þæ…±¹Íº„¹r÷óh9XâJÇ‹voøK«-ñÿø;’!„‚»Sµ¼ áãÕR¶œ-›¥ @TUjYˆQDCT *ªDD4„Ð8³›€}<‰PAR‡4dcèc×÷Z>ɳ; ‚zÒÓ€¾ÝÍÍ@(\¡éšú¬<£{ôœm0ª ³)AZ²%;=õ$]Äÿßÿßáû\®ùã5]ñl9^^¥¨kPSÀe‚¹S¢ÒD%]$°¸ÅÖú°z*Ð \fB‹§Ji/èövÉWžFFljíIPÒ1nc•=ªvŒZ³ÃBê½úÁ†0zê °bEk` ú¦ ÄÆ+¥Öã‡y7¢ƒ©ÖµÈD˜ s±‹ T` RõêRÇEJ¥;<@ÏÈð7t=\ª£o݇â¨û×ÏpkÞGNáàg¯Ô –¤K†R˜H±Br0ºSË@²’gà ŽJª)])ÏÿéL’å¤*Šß²I퀃:vÈH1ˆæÕ¸$Ê=¥—ÑóÀkÛ„[MС±F1N˜×ÌAælÒå –j†©B–‰¿”ù£70`µØßǪÿЈøEåŸþJÙhZ+ÒˆýÉ hüNéKB¹GÖu³$É@„€ØA…! º8rñEÀÒ€œ!ØS• *ƒ†¨Á³äœb áý·—Ãé«.ɼï´ïb2Ïê¤f(@Ï–‡ôþù+U 1ôO§¯ÿîÛÍî¶>à5¼ª½Ü5e­8NÿÜ:š‹ŒxÙe¥ætblO²r±~„ ¸»ŸGÁ‡l½õÆÂ‰Ä‚!r†äìîË»•Ó\ tÍ3á½Ú¦rn²p“͹òf½À .…‚ñÊ[À… ¿‰.ÚJ·µú_t~:`pY_8éêÅQ&û¸&#ÛŠô¥ØQ?f,ež‚x‘6,ãíü×v4áêAÒû8Ñu&èÕoÎÚìÁwwÕØßÐ{úíÛë²8`•޵ÿY]ÀçhŒ,ˆ¿¯ô%=8]Òßkó°ŸçëUåÖG¼c¾F à=#â[ù⺹Èí›á—zZ¿~}ÚôÁm!áÕs€?‘»zãÅÈŒ\?Ûñoó±ï”ûIïvêÈzå’²­ü¸S¿¿«µâï°Ú?ÉÈÙ…‘/:?Ns€ü[Aýúõë×åÊ—¾Ô›­¡Kþ"1ððª-?Ú[×µ7sB_ÓKáÿ´ù­ÚŒþô»ß‡I!¨êô@>þùû|,UEî^êýCQüUÑ ±ïjPEÐÅH·Žš¯>v}ß…h¢#ÔS2 ê9=¨zJfÔ5xÎ)›FÆ(!t4£ûðáNýé©¿ ×t¡ æ]Î}t„![P Šä—ÃË÷×óËåš/ûxÍ× /Rʃ¹ÑÍD ¢$ƒûUZœ"úP”V@!¡:…KåÈŠgz©²×±y¥(¼å+V+Wcm/õõER(lwâ@qýuˆ@»YÝö`!BOÈH0àVþÎØRABB€' BL@ùüPÐh€H¨Î¨ªp¯£ÚÀj$[\v'|P¹…ØA#ñæ3ÐúÝÄ‹*÷1‰û \GŠ´Ë‹6Ù‚8&ÈQØHö΂^ÐɰÒacž#;Tpêê/«@0gÎ DƒhP }躧wç¯~ûNNÏïþ»ÿÞ’¸äèÞwúâ,”0† P¢¼W#Žëuð!}õôµ† 1ľïϧYt“d»‘WǃŸµàׯ/gÈçC‰ÿÒ óS ¹ HšöÉ6E´™[mòÇ?Tq¾)>eq§°n£,ÈhküÖ×¶¦ì žˆ… è:%“[¯Ôt6²Â} í2é·ÈµŒÝÏÅpw¯bºäÍÁJ7Ä2³ÈÚ‚±¬ø“íÜiºû¹)Žš2v Që–‡Ÿ²%îšu­¦ßÆítïŒÀ£qs{i ìåÁ5jG»µ355A‹:Knu2Ù” dg…xÀR¾²QnOƒÕ |¨~ñÕ+‡¼i~=ÍíÓWé•ç1âyˆ€°+Â5mï×Y>ú9›çiõ:Z%ÆåÈ*ÖûgÞ]AX¶Ðƒ§$Ín‡r¦…ÈAñ<Ùzcïeolã‚æ–zaÄ&ÓɃçö0pB^ù}­g<ž<÷²ãq´(´lŠÖ;éÆzj±;O‹)ï•ôoíToã¶{ߘXÜé® ðQQ÷cêÁpô"W¼ÜIü|1g}E²@YµHÓ>yC’ûÁN‡¦SŸ5r}­¬ø9Hå|Õ~ûgüç¹=¶O›’|Ã(jÊÊ~b‡wY؆/x 's±ãlGÈN¨»»Ø,ÇnÛªõYÇë=òêAïtñ‹.?;ϵY §.‡fßâíκR›6·ì{©ìƒp‰Å?ÿþª!çÒ ¸;€Ë‡OffùšÜŒEÎ!4ª„.†4 Z* ’ QáádAߢ1áˆòDM—á£.Þ:íÁÁ¤sº?¹|‚ˆS™Ì’9Éüå œû“‰tÈ ‘]§] é:¸Yxꇗ!}ÿ˜åᚆ«¥!}¼Øåš®‰9!»ƒ(˜}‘ªéW—]`¸\t=©ceªÀ„ã#A%]P«þ ¥Ñs­_-B¶gG·ÞÙ¾Zéý·ì®SlWîÙXc>15¬?΀fn'„sH¥[+\«9m …éŠ0™ôŽ4|NÇkEç©íÇF¾ü4 úF(j¾09%BbMfHC ‰µÜ¾\›D@€ Šü}‡Ø×çPò( ÐAÏ*P7@ƒDõt¥»[Í  Q)/”Q8Ò òݽÞZM¥ ñ.µœ¼Ð†9(B¬~Ëåü­‚a€ B„Æê\ÔùúÐ|,nTÄ4‰Õñ¸V™:L  F(!9C¼v~ €qÀ‘‡š-¨ƒŽ¥ª¢•T•V•¿ z}©ìdžûßü¶¥ý¤Ñ+øÚ|à 8 ˆJ8Ñ DqŠ8Çú@Št±…(v ^{\ ðÑÆY ª” úØ?Ÿ»§SÿîYú“iøøÝËéýsÿ®ïαš ªBª;Ì `Ð( 9%»¦¯ÎïËÔúÓ»óóÿYªD?Šº¸Ç”IÝMðKØÎ|RU_Ùmdâ®>r¹cÉ Dý  Ðg¾iÞGl7ý ªTö*ÄdЇžáÏ:n3öì4¬/Žå²Õù¹Ž7 2PÞ=¶ïö‚,) Mƒ?—^uE¾¡VÂñ²#sþWY`êeóŽZq§ÿ£Á4ÜN¥q­ÕîtÌl.Y/¼µlLÎ],€ÌÝ«­¤ìR€|t[ò(`í _sd5ÛÍ¥3øØ›3cæ h½:9*C²¯öIÓäôCs‡VãBˆ¬'Ò¤yš¸[n$nœM×/B ;›ÙÊuAæU SõòâÄ&/KvR_mF%W Ìoq}G­v8Teÿ°8öŠ5‰|i¯ŒË“»J9Ÿ‹™A®_ÉèbBR3ddG±—ãöömËžT½Þe' ÈuÓÔ9\áDvÞ’ &{rgè6Ëê”\„2KüKд~aò ™¶ºº[pIlY°.h»Ï²y˜µqnSÉÛæã ÔAvò=¬ET+ñ¸Mª.ØãázÇá˜Úœ‹Ü°Æ"¾­ÔÂu‹‚!‰Ú^Ÿ ,E²¦Àlœ{„›×µChz-Áý1'M.…›ìêü@Æ~óJçˆ4)×Édbá °êíŸzm8`;n®_ˆ¹eꈔµ¢Æy¿â1ùzvËóâ«P|/Âi÷Øö>'tìZÞ_ ¸šXót7lirU+úå^ÙÓ¼iqÛ…¼ŒbCé¾U¡/7À½G6k5;‡Žéš µIDŽ_ÃÑ{bÃH»#.rf¨qÄ›´ÿ4Û˜à¨9GÒñ­Ã*§P~ÓôóÒosL؆?À=NÚ\ü7âKã n!?¸™TÝO‰=tЖÅ"v{!Ùñ!±ëÊs¨ûO\-YÓF¶`‹×ÄÒrëæUÊñ*(²Î_.{^ ÜlŽ7x€Î¶ñƈÂþ wzV ž9‡¢Pé%캛_]AO=¢3‘Ø®WÏCaÎÐ`@¾æó9’¾¿°5Fê–mb<ÇbP>^ÅØÑýòÂaè:||¹/¯^„Wû8ø`LnnŠÐU@%@¡% ÔQ‘P]dC¤n¢cNxX|÷#œ^àò@åÕø¨s’¦L}€åú¯Vñ¡j÷…Ìî a‚‹”Ï1Š”ž œð 0À P>Ä*°(Æ1ÍN@jC>§üÄXíÃRl€;B+à Õí@FVg`‡ˆÖâÿò·è†kí6(ö¹˜ß úoT½d/4ªô$Ðé ¡3?@¼|¾”äJ„% ¼¤—êlœ.g“Ûò¯ ð^¨É€R_Ð=æ0GŒU­Ö‘÷‰’À0H„„1 04óWk“„ªû®ŽV žàÅ:Âà†T¨>VE=%òD­À0ˆ•N¨@ Œ"³jñXÖúØÂ#q̾4 ˆ.É?>þ”7áh 0ïŽÝØ@`‰ð}#BÀ)‚†œ`D ­Ï¤“ŠKA1¯ÅØ©"e¾Åîtz~ ý)åøôüÛwß¼‡»„pî»Òµ`îÙ%›»*ThNO4§yUÿc” ñÔŸß?¿ÿ»oɽ¨vo"3 {>O®8-“Óloîòm`r¥Q`±Q7e.Óÿ’¯·º‹ÌÞ¼µ“ÖcÞr³–EU7d³)Šl@Ê 8/—¹SÔÌ×å*,ï:Úb«¿Üäx,@lÂb™EµµzÖmÑÐùÛ•¼U•ÑÊÿXž˜JDö+J6¡÷'•ù¼µ*ŠM[Úڼœ¹óMñ NÝdÆÞœ•ãͯò-ñpØIa7M·gRøæâ»©¤ÞÇÚÿ¥MßF ›Köõ"wœTebËó÷ C»³`\áäÞÎÇ»ÏX$+ÅíÞê.‡Ÿ<`ôûIyÖ·ýÈ]6·³n?pQ¯ëøA­Ú7?@eÀ®vòÚQñH]?"µŠ7[ȹÙ7Aà[̽éÇxeo½€©Ÿ£Z¸<ÐðØà¹Õ°_,3³·_?T–ÉÌnúÓæ‡Üî˜üÑÆÂúYp7‹ø#/Üòª 䳯²ü2þSŸ  /ç§JEºíîû%ÖÌqtÈq ;ÀÿŸô‹û¡ž$ïÅ!‚Ÿ`£ÇÝCYk• XZM€câO¿û]ŒŠ:ü2¤!_/7×)£q‘.„ÐuP‰§¾ë¢¸Aª* Å>t¸ÐÜAt§ND˜èƒ#–à C Šs"N³„Aé=ÜÝEÔÜåƒÅË`1Àœ–H£‡òË./ƒÜm0ÿë¿Å®: jÞÂÇ¿¾¤ë~½|ÿW{y.WæD3 Ñ„DU1ÄHUJfè:ÆSU3]Æ‚w…h±o]ªùS¿šÜ B@ˆÀÈäÑn”ü–‘¯pC‚;r‚B fG „–á¥Y!F€èÏ¥E€Õ›ÅR‚øSÊC­nÛA¿†yÍ7ødðêã8*—ê+/:²Ð"NñÝ =€¥30«¾_BOÅX RÞ[`ùÇë¥jý‡ éPh0…¨v'¡9Ë81ww‡Óaß VHËÈCEå¨BŸ€6Tg`iqžkCC¡ð‡'PªcAP˜UÏ(/¨"›aALPZ6uT4IÌò}Ï #% à –G òˆï/Z~.^¾Ž!C"‚Vk 0dc5eõu^oBÞèþ#€§¢ÿ(Þ Å* |Y#÷-R˜F©6uPj¦¦‚£Šn× 4 øèpC—X‘MŠÐ Šj¾ŠD²oe`ÂÕ ž; ±ëß=Iìôù¹ëzJ> <å—ï_bwýæ¾ÕSŸFÚ5_’=}óÎÜÓ Ð4¤÷O_©‰EýzÿÛoÛm.Xý7¸MÁÄÒÿA@;­Ó¯'ÝŽ(b‚ŸÝöHê½sÿCç÷]«ŽˆËoÙqe©nï-ñÖHÿÉ›°#_ø+bÎ_ñæl¶®<|Á ç¢ÔLSv³ ÷u½‚2ÙÍ“Œ<^qäØq¼-„=– —R»4ß`z°™w"[¥HÞºèr‘é{Ëáè53|ýYðՂЮÅîÏ~÷¦·rëäqûøbk#ÛŒæTãÉ·<á[¢¯`[uJ¶Ð»Û›ÜpüiHEŸ(ƒNÍgMaÕÛ“¼E+kkedoiÿ$uš_ø]ÌÞY?Õ—½àïm7vÙÅÀ}æ#ÒýÜÞÜü3û€ÿ Ê÷ڕ째&óKÎz¹k—ñË‹ŒgÙs–ýÄ£<Û¨ò8Fþ” ‚½­ð ïû‡¨ÇÆí§i#’ï Üñ _ðä÷›"9’Ó2Åi‹\6ÿñw¿ÓèÀ݆WËæfÌnÙÒbŒTE T ÚzˆªB»x:Ÿ$[A°t!ÆŒn)Y…QDžÎtO~M𠪙ÔÐéðòñšÂÓ©#©@5šËË }øîeð£Y@‚—k¾fyŠ6ÐEþô‡.:]@H'jjôðîÂdpžb°ïìÃ_?0_™_ÒÇ~½ÚŒ‹>:0„ 0ŠVH",ÿZ%ýœÏhI(r~Gíª˜+c¡÷¤¼–ÿRGR„ª9Á ±ƒœ*ަàbBt@Qä‰+óGd¶›TDJe} eÄ²Ô }Ĩp‡ýHŠˆ° `©¦"&;Üisl'-f¿hS“A-T]ƒ'Ì ²pÖP›pËsÉ”@šA;q²hñN@¡'Èè+Q%tÎàe¨ È€,epâΜ²Uº’âµC"1;,@:ô à$a!^„ën Ö·VìˆC_KÔC¨Ý¢ jµgÐÉáY¡å?¦úiîˆ#bŸ‚ ‹Ú{XF¾À ž0¢à ^äv"@DIPyÌʰŠý%™T¬#ld÷cV ë?…öã#Ê_›Å ‚Žz#¾,ù7 YD9/p¾ÌIQE€³ ;À­öL„Q†qŒ> RÄŒÐC¢¢ë´;uï¾zÿíS÷í·â`÷$]§Ó9è`þáãЋ"F tbŸ¡=Ò<¬z¾—óðö}¾ëq;Xÿ¦fÕ(3^šõwD²È¢—p³i•µt·Ã}Ƥp9õîDZF¿¬Livïq\)Ë›ånþ‰å±zjWšQ8M« ѬdA´ÚHN$×ïrœV:L¬@[«JŠ–Y°×"Åb;$І¶éÚAc-à8\>@Ž«Uûíœúäæµ4ÀŠÁ=•Y»wóaû „à‚}$«®€ú¢ÖËðàrµÙäo¸ŒÛ°œÒ«%‚£†¾s«™þÐ`Ûð+X_*k¶'Ãô°Û£ê1eëé,ë“O×CP³q%&,ŒžÚe›|äÌڸѮßéíÌá´:Ì’G½w ö ý·ö{ì]ƒlåæƒŸÃê“%»¶ÍÃì-Mt7úÓÎ4¹óའ/pßê÷¯ŽU"7”Žëñt%Ëp¸¡Ê‚º×ŽòÃÞÈv´%Jûã+²Ÿl]HJ8;³R[e Ç“íïÿ,¿;½ ž­j9€‚ˆô]Ô® AC ¢JQ ]‘ì ªæT ±–T{ÊCˆ(Uh4#3Ü•t÷«å3CÏ]ÐKPuÊbl9ûÇ«‹jÐÓ%½¨Ù5¡ÓbÔÀŽp¹|÷‘]ôÿ·>Q±—œÍÃY]ÕÍ,þ| ’áyÈéreNérI—‹¥Á bÝ@‡ö”R?^êÐE«…Þ*tŠj_õôé@ V{5Žkp˜ñ&¥¤½DuRù(žENP  WHÄ5CA@EâPËÿà5ôÒXíyQì=Ìá¨í•S ép Pf@»ªãêÌ_`å®Äë…Ãáb$à€OÞÅÓȋ〠õbŠ•kZ:g«˜ùØA,Q!t´—| DŠU²"t`Íœt9«†.Ä(D„´œó089¨Š!HP!Õ IÒ’(BØEËf‰"ðÌ€‚a´ðÕqÞ($@H£úß -¤0#6²‚¨µñ¢f"P]á©nË¥í ü– 0í^`>Àpg¨ÏÖÁDw‚2«™puК•ùhÐs^r³ú”DF±ùEÃ,×FúçÇpNpL]…1  žgaAQGÛã P¡ ´ŒŽ‡(ºPéI$ °aÔN´ ýë&)PJ¡ý©;¿;ǧçîéìÒ W;ýMTíÎ]úË÷×ájñ¤¿9#î™È9Ó«=³åkþêý7AUDºÓéüþé«¿ûv™‘ožˆ´kâDp¡Œ¾r«i[è°n4ä˜5Ø~UN$M9Õ7ÏäŸ8ÍÝ€vÍ&JóÚ½IÚ:–­“"KÍ 3ÌEVB„4+…,€’L”…b[gÍ–í;_=/7´ÝÁÔÞ* ²)ZNdKi⌱‘·ƒ­yõ~¹Ðùõøœ…‘…eä Oƒ QÖÁCGiÿ¶‘Y[MwŒÉjQìR4æs UçèÔ&#•oí£ôú”×mõÿ5 •øè¯äÞIw7#ú©S<Öªo(¢;‘í($ܺ,Yb¾örWYÏ1y ÷j„>OÀB–gãÒð¥¯|åüœ¿[}(?½¯­ZzW[?¯_à^ù_ÝA#ÐÝð¤§y ¼¥‘b¶·¬”¯cD0q·¹$é®°Ë8„¯? ñ•æ 6Wà>­ˆíŽÏ›‚Ë^Γ/3Ûzþ‹Ñ|^îØÜú›åqá kÀq$Ø‘°V^|s¡0ßxÅXkUûó¡fìñ‰f§;ÕÓcqjã5Àu·&›`úظwÀú‚òÉÏüb?z¿à Ýσ,G”¼æ—r /,lv†æÑ G«ÌO-™wöäͳkƒ÷ C]î~Îê,¶»‡·yˆ¶'ø3Î>؃˘‚mîð( üóï~_^ÇË_? /W7éQZø)rêϱï4§‡ E–íú¢’s !¨f³dA'â4uÄÜMéˆâYw7=ÍÒãÉÌ$àÔ‡!;1N=ñ]Nº„¿^/¨ÑûN¾û3##Ä2&ô °kNƒv½dÀC€›Ñ-¥Á³1iNw—P Æ* I=‹*W~f¥JªˆBDQ™9jý!ï] rBŒ@€[UX żJíPA)(ŽSWkÉ-¡‹ps £/nù§ˆªêp‡ $ÀÒ¹h¬¢T‚»ç”Ah'¢ ³@êS®Y<ÀĈšípÈ©Âã5@Q½j+øž•¥T[×)§Ö?« ØÕÌ}v.ƒ.€3D¡‘ÒÕ¥¸‡D‘¨#"}À’ó€PÈ?;U}vÒÍI¢êž¢"–“ˆÄ.žÓÈÐV¡:]¯0©8£âmàRQª8[KÕªµ ¡ÖÚ«Ž·ZGŠYõãÕ‡1j<Çt5š[" Lpƒ]Àd°E8¼ŒEÒp¸€jcż#¢|‰=2‰þZý!‚ (¢Æ îÈ6Iscž@f ŠPëý% ‹œÇ•Œ€ @±qÅ@z2P‰Îm!”‚V›$|€ž R‘Ïe¥ô–¦ŠHР1Æç¯NÝWÏ"'P®ß_óÛ÷¿ýºw¦j—¼7{¿ÿí7_¤4YÛYÿÞÛniì7ÀOéXölø?K¨÷§Æ›.y[h1Û¿.­4Wu˜Ÿ¬¥ìˆõ\§6äUŸøðæ;VKð5þ·Ç­3þNÃM‚áþxžrSm§‰È%þq–}–•R?m\CÄëÀÇ·QÉo†×LKäXZÞV–¢Èèsœ‘åÔlþgO½áf¶óä@Þülç;¼ºÃþá#082ùý’£¡ü`ãù/ᦒeÛ‘ñÓÿZ&ñ(k m½€ü<ßøÝÀ|ßm°ÂÛFžoHϼ)<•‡ËÀ_3À¿è{Ü…ÈNÕì—{ Y\e_äKÄ;l®\yF{ê¡ü8 Á¯_?Å% ŸÜrþY$ ?Îà«àˆYùK ¾^‡ßݶ׼~´¬jüå'õ ›ºµ¥{ØTê*¿ûÿýïUúÿîC¾fOÙÍDƒ ]_&•ªöA%HЮë"ƒg1‹A£*æF: ª,k²¬ÌLÉè1FËf†' ®twÆ`".Ï}ñK¶ >ÃõrÍEø”óSð!¾˜`È€–óŸþ ÂdþòýpêUœjÌÙRf2KÉ‘sò®HÀ°ì‰tQB«+B$ žÁ„&›æj®{~ÇÐϵêÐujv9Ú–ªða¨ì—èN5 Päf¥v/ªíF¼ºÁPÐ!}CÑ)š«TÝßÇ£³w€"*T"tÄS((!ôpˆ §ç^5ºÙQïN´ †ä¡2‹l4.yˆ  #zL5–Òò{—_óÑá€J¾‚–PÌ !À$Ô :ºÑƒ]­· pŒB¼Ý¹Àœ†„ŠÝ!ʬîB‰¥7Áºçç L×Ð-pºˆ†Ð;“eaèÁŒø z­¬W¸# Þ KVFflQõðš#a€”Ÿ­"Õà¡æKž`ãJäQÊÓG¯‰"›\>Aƒ%x†9à ! ï:&BU$TÐAàDPT3á„.HÄgà¨{užô*Z€¤ftTáRsT‚ÌêF7`&Èc\€Àj' c:¡¸"ØQõWè Äj’¬0¦JžÃ‰ÒÑQ¾¹8_kìú§ç§¯Þ÷ÏgJŸ‡áýþ¶ÿêYÓËÇ+ú. 9¾ŽïŸA˜ÐÝ…€æß~óHcßß=}õÛo7a?}[oÙϹÊïñÿeÙûÕ´—Ë'm_Üf XÔâÇ‹{~¬0£éY˜À¿=èüJ°ní™Xç ¾æG'íãw¸sjÙq&`}mºk, ›3šÚ½9k¸i=áö™4åTdºn+™üœ›2¹#Í1NW‡j^?6Ó/À=œZ–§^kŒùázØ+Üçì"^ ÔÇ'½®²©å„βt—äz¡u7V×2[T̃¾b"é È¢]ˆ+~Ȳ͖#Q`<¶ýÇ“ï7ç,nC¡R‘ œ+æêS¶P²©ùn¼™>põön­0mI¨L Ƀc§ó·aú”à回0w¾€e‰»™²"ë¢kY~n³ÕÛÛöœ Û¶©U--‹›™,ÿ¦µU_ ‘ÄáÅò¶ÚpS“Ã?5]Ý[Üϲ`=É1ë“Ù=C&·õvBn<ëËô•5ïf_T™éÍd\M{.{ÇVc–-@aé¥yœ.“òÂÖ@–ô‰[îñû™šfö·“gjèo_[fê8åÊ"(­÷ò´ÈréX6Nb}ûl·—‘¢ð7~=¦ lÍÃoŸÆwSŸïf0®a‹TÈj W:oA»¬6_®€8¥àk<--T­;ÂïÒìhBFJmBžެˆ?ØqHZ4%–ÏhÑ{@ÀTÆÛ_eEíí A;c¤±Æ>í3–³¹Yì4/¯‘f2m-×§(-ç“ñ,A‰qç+/Ïh¦ÊÕ•kU*²d¹4ÕÍ7>= ÔŽ€±ÙGÚ™°Í ,{þdÍ<|wuçkvzÜݯ¸³«Ô',ûon‡–Ò†#6M«…âgË”µqòª‹ù‘oyP^SYæµPV7Ž{ß­Hl!_$\BD“ådi@¨¤Wp€î°dôB 7¨ƒŠÐC»V}¼øÓ–2|täÝ×{u üTk½µå‘}«`ì¨õì:º€ *: ý³èI$PE À8ög…;ÝD]”ÚÅh1ç$ôîé¹h 9»t1 D{DE\ò0 Dq¥{’ ’]#@Üá#¾©4"T!¬O©à‰€Êí¡@be:i‰â„nvQ¦ŒØ¨ˆá™×¡Ækªc¥ÿÃÇjPL ¬T©,¾WÛg4 ­­1ÖŠ~®¹¸€¨°±¥;×ñ9Ú< tº”~©©$¢HÏâƒ@É)|!û Dâ¾ E°b.ÝA‚ÝX—\Ì ÆàÒÉ®¤ D4jìcwê zù˜¥Ãù}x÷_þ»ç÷g ’®9gËæçç§ð^“ûpÍv½ôÏg±”-%7¢‰1žžÏ•ü³Ä-Ù÷s üÖ h¼q÷|Ä{a ·LOYÕóÞ+«½jÜŒF2Îl8·¥1nCÐí rÞBdѸÝy”¢ÀÌ\_dÒ‘ˆ4‡< EWZª¢Ìá4w*íwù<;[½Ü ›oĤ‡ˆÜVYÝlöÙ„#-õïo:ÏÕ/•££È¬nL„¥‚l–s—§íI8_^ïå7xŠo9ëµ2¶4äl™ÅБ`˹Â57º0ö“Fˆ‹ËCÎò-ì}ÂÔ=_së÷ßêDöæ¡ì~wÅY2ÖàýeL5l›¤H4‹¡91°ývܱÚ\±½_“KztÜBŽ4d¾bÁZ³=Èn…]y`ÕÚ—fùÀy‚7š¨…^ÝÎA6ü.jã³§‡[Rºl\ ¶RÍ+‡Ã×O–ûëþS¸ùŽäñÇ÷ÚGrOHh“(àþÂ/ËánxpÜ­Æù-¶L‚Ûõèò¶§°2¼8þðuø³“w•y¯ºëŒ´¦ì©$²Í¼UNä_µÑ¹Îp¢#.É€wÄß•qÌþ(’6gì²±ðØßsÀj‹³ÅÊñä½ÕÆøjT–!®´lrn(oÛÂw‘âs²;'§†ùú–QZCÖ~´œvËÉlRjr»`-ýÿh_¼nlÏ /JË }‘‘y$/ýÐv ÛmXäX«åÓ(7Û|øŠ§x'ãr{0˪j}^Ãr<í÷î7‰¾v&J“ç¦Ü|ëÜ„Tk,+ò™ Wë¶„šÏö»äÙãSFëî)éö­¼ê ¸0šÙ•‹6¿‡|ÓÐäö¸çžíJ´0Q›×í9EY‰ëõ`JÁÿñŸDäúý‹¥œ® ^’!„xê¡cо+p÷ØEQ 2‹ukÐtrͪz˜i*!ò`9 !â‚?w¼¤tÒ5wOˆ2 g÷”’{×wz‚ Ñû.øû3º/‰_’y÷î,Nþû_™³¼?ÿòû ðìn6 U´<È@š)[ÊW£gˆ«DÂÜ’c#‹æ[Uš@PèbÆ rŠ`âõ{Ðë©^Ï•ä~zFè‘.µhZ6À4@GzŒe0AÚ¡&ða¨t5Ϫ$]”P¸P"‚6N{¬ :ÓŠBbp–¨ÀEB@‚‘ÎEéé"d‚(€ .æNÑçå/ÐE ‚^‹yá¬þ°ép^Ñ@…^²¬þ·£®?ÖõÇ:À ¹‡ad(­Y!T ¨žNÒõÔ.„3C$)‘G¡AI×P4v–7— 1ÆÐˆÙ ž,D¥'ﺧoß¹y¾$sÓxRÒÜé¨p f @ Ð)#„y+Â*µ×ü­Ô ýZõçcO@¹5ÀŠs@ìП@‡Â’‚Ôt\žaò€œà¹þ£R¥t+å)P«‹r­(c2ÀÂ'B±5fíD)ÿ[’J½Ç+k¨4mC&‚Â!¼dÔ<™@kÕSí„“ÖO<' Q %‹0¹U$à¤5R7_­†À&0TY3œe ¡3Hçs÷üÿ‰‚Œ`—œ?^´ëº§sr|:»[8Åß¹çá’Ü2“ÿæïÿ@×u¡O_¿_oØ£s̽Y,ë÷hœ· îDÅpÂ{ä"Ù³žId{¯=dlÛ Þûr.*Ü}”Ã}øs!›ƒÀ2<:ßÞ×dãC9son©x›€¿Ièü¦ëuëNÇ JøÈIaÊɲ…‡·TÀOhª:§ßš_åÜg¿Ž’_ý Åã)¼“P«K\,ž|k[k³&²úÊTþÏÊm{Þ¼Í*ßmßøÔcÆ'Ht·8~…ïÓ¤àvá¯>‡üÊþùÛûú•}ñØù Á.ü$_÷/vÊOjDÏÉùM#ȯËǯ_?Ý%ëuX©ó£lÊü_{òx•Ú—[Jä-&¿~=~$R¥´¬@û¡S“µS{Ê`‘…œ¼&G…áwÿø C/ù0\®4w÷ !vI *]:u@¢ªb,‚]ƒ¦§>z¶lb©$GqxÎ9wž³ YTwÒ¢D’ùê]ùåjÆx…ÆÀStÍfrv‘L^®ú'œJ 68å$ìX®\h~ÉWÍaNÍDX(Y q!D«tç62m¦~ª,’`†lµ¡°*韙D³³‡l«ðvRÉóC¹™6Û6zcÕ¨.3÷iÛFÎf,løõ‹”íäæÃî'´×cÀ±ô`í+ ©^ÕŠÏŒi‡f;IÖˆŒ½òû]´Ö:·È‰Ê sg5EÌ‹|2ÖÙùðÁ2Ϧ˜wûšæÕt†oÀ|«ë]þOÓ ÕT~’ª–GU—7õ3ÉGæ¬8—é&ÙáùìUêÍh•N­åÓ\ ÿź86Û®ºcµéª£sÜ£e¹Ëp~ý¬4bŸ\ÒØþ®Ñbo'r(Š5Ùp`ÖocY3¿5¸ËÚk"×ÿƵV'ßeOˆlB†±¿j a÷.d±ÙÉ’%m‹Æ­˜uoîjð®ñßfôà0¼‹¯ÙëËYÍÎéUì7…¬xEâ þË+3ö/¬¥ôìijӷóè$¶û+¤qKX|4ÛæŒ>õ¸ÿöÕwww…lzvºøÉH&sàÅ~¹²-YM9ì0 ÷¦õ–,1¦i¹Ïjå-È~ÿ;¹|ÿâɆ7# ªP¡JŒ]è#D]%ˆHPŒkfßu"J:ÈB@7‚}¨”û>jŒ"¦\\4Š÷JvçtyÉCþ?p—¯žbç¿ÿ6ÄþúÀpÍAö2ØË€4ÿùßRT–œ'®N5rÎY˜Å( {vgÊ j!blt¡ˆP±‹F'jô ZdE@(‹BMCH"á „s55­uß /®¶ Ã$´qD¥H¨t²<_¥H° ]ŒŒÁ®FMQ…ªuPB=¯+ˆ tÑ@+pú„$¥!vΠý)t]XÙL”–$ ÌI»b—/9ƒÃC(1 ‚!Äka»Ü!DðZ¯ ÂGÃ>çXÂ7¡OVyuôÅ1œ-x;0 ;Ix @M”4…Eijϱíbw²TJC H )‘4º¹ˆx¶:wÔCˆ **ê`Dœ Ñp:ÓA/˜!%3%>Qéb¯ 7r‚´8bŽ f(Tù)@)7+@JÀÚ!ÊXÌ®ÕÚáú  Ë"]j:aš‚E‚r‚ "(Œï{H¬ÖÊ申+PrB„ÛˆÓñz©€©ša$rš·6 õÏAÊSñH†(ÈAP‡e8ከp";°±tTGÃáBÿï^FGAˆÕü D„  Ö֨׮´V˜#›ÐY/F "Úº§oŸºwO&]wîÏß¾K1 Fÿx=½{ï¯/W=w×Ë5}NïŸH^>^™ìÛßþC ¡?õç÷Ï_ýÝ·tßÃl–=¿Ëò.—Yba4…‰¸¹·Ù³ WÐØö†™½¬N˜$s®‚¸]D&7ƒà<ÝlÙ²h8¸Uß0ùóIÛÎEÝg ®ê¤'•[bw‚f®b]ÇkÊÞ¬æ.ãòÚívÙ@ÿ9‘ë¯Q1$ÿ–¡ó“Ú1÷gÅ£Ÿ*ÔJÚâúªÖÉ~œ¶æ¾î¼Ö™Ž}çƒäê.{2É/°ÕCb†ô*õfÍÏfùáŠð8”E Œ«á·;!—̓ƒ‚ÜwýãŠYæ ,è.8ÏMÌe¯ÓJYÊÇÜEØ´‡Þ‘¡7òÎ.û•2g$nB:Ö“ù Û%«áú€€G¬Nî²ò÷D¼¥ ¶ç°ŸŸ»uæmùs›C 7»OÿCÙ;Ý ÇàoÍvï"¦ç¼é“)ðèBøÆy‘!_yGŸÆ]ºÏ:y-òªoß$·d'“›¹0á#C€‡KA›Ú[§°“šhšÖ°T¦÷óW«…=ªÄÛìCC„¼´—Ç:†¸K6¡<fU¥7BÂÍvãöÝ-1\nb¯î#¯Šˆfi‰¯Þ3ñ'_m4מIZĶי+Ùã²Ñ¼~@6Žä!ƒÄ‡Å²mìù)]JlÿX_å÷ñ%º*‚¿¸½œ°?J(Âübe&« ûÊQþïåÎ|ÅùøógýZØÓüüú³¹éÿNîv¾9GýVskÂÁsªk6ÀzDÂý S]s­PEïe,y+àh ,P‹y×Ó=a‚õJF´ÏßCµôÂh³ ™SN+}×YB’RB€È”yßÁé&3Bzúî-ÛËç:$­À{±ƒïÌHë$:# ­ ìè·ã!‡€íèC ò ‰Jä©2%<Á;Ä âƉüs:»±Î}¼VS9¼Nº?¿ÀåI$ÑF;V¡÷Ö+ŠÊ]/ã˜N „—`©É4 Õ$J©iJ¦{áˆêÙ3Ø""K¦¢…ŒN3޽f)žjmÔÜk" Í£†šFgÛ–hmÒîGÉ~Tð'×܈¨0vhȇ;P`ÁBíDm›'„hS`TëR &¡|ü„® cŽ'(èw !…‘Èã1}{ n° x¼ Æn·É˜6urœsWc­½ÜÆ´ÍxÌ‘„ G%@´á¢»Ž•þÔXû/'àhB;´©ÀG§ßf ].ÂYVÍD ÁíÂH§Ó{/»¾ìvûožwÏÏßüê›Ý‡}üå§ùœÈ§_}ÇÝNôìÌsvû>«éÐØõÑjk‘‘ÙÒ»òáÛo¾ùõ/–>שÜ?ò Ýð£¹ü?¿~1f¦»ÿ$#àO:ÿG¼kÒ`Îf p«PûN·+n¿û+ŸËíO>×ý,'“î«ÊEm–k»ÐœË·Ï j5˦’'ëÞq)fHq’þ/&×'2¥"ye[¾$oð’!Zôšóô᧺˜m«IA€“¡'ψž/¬N”§YO±•aâvÌx©H]Ç:½¤-Ãy-’çŸÉsåÅoå꫉í4ê}³Ñ%pݰ°¬ß¼š«„äà.æŠÑ´õE¼©D¯êŠçMF³›}ùžkÐüãÞNn÷ypUxw‹Ð´<Ùûq«+°j'¿UõÉ[5ÕWNÇ‹JæøƒÛ“ÝVùn!ä­‘÷€ÖòÆ]ØáIêŒmæÛ“ö#kÅþ¹ÔÏÞ[ƒx³ú2¼§¦¹«š•ûw§ãaëy½þÑ–Më–¿n\Þþ™îÝŠÙ;¯Ùk³)»Lò¼ÄÓÌ}U»Lœ[⦫ÕóGäÎ@žÏbWü²7= æ\Sýæ}g&½ßkx]ÿ¾,º~óŒë1ïÇä­ÍÒebÉ>»3ˆ…uõfßþÀ¾ˆç} ¯ÏýË:î Ãógí|çîÌo[×Go Õ—±î'yÀ#ú¼“ºSu½cÒæ*Àõ^ñ)úÑGmiìö&h,râñpîHþÈ}‹SÄõaÝ[oîÑç“ÁWÜæuò§rYÍ‹¹ 5Þ)Û{÷7/Ì·^ÙeYµísÖÆ·l²¤®ßkß!|Á^ï~9¢.Êónôå>híCÈÛ¾Á·z {>xž'ÈKC÷ëq¬œ]A ä?þÝß½~ÿ9#!©¥R™Ê,^ú⥀òR¼”B¥DZ).I™ÇcUÉâÖ;ÝJ1v†,cS褔ªÈt©c „©5¼c8@2:>îú§'ûÝçøü9 C„†5ÄñåàÏO»§.¿ÿçz¬-¨¨)³ãç­²F¾6 ÍB­††¨‘Mîäž96B%\„¨ É dÊ„ŒÔ(˜H9&ÙWy*í7dEVxŽx†éÒ¶zÑÇÍ‘šìÇêl,»]¥ÈZ#L¥w ÕD§àJ³f,E#•@„<’&“™1•Ѻ¾°ó|èžû§ýó/¾í?<=}ûüôþ:š>Ðê±Ú¾oñ5·×ãgR9´þã3¤”²FÚ¯~õ—ý®ß??}û›_ u´ëûÍxú¼pÝ W¹Q<­­BWKÙul¬‡fß|úçòZB·—°7@Û ÁÛÞô+ÚæÛ~nô”Š7ƒcrsñ~L߃¦šoÞ‡kèçJßä"¤»ßp=~ÛTüAçO‚̹ˆ¹©ññÇæjùtó&õs©ÝŠË®±šœ³Àn‰k3ìÀ|¸ë:j;¡Kðþý-)Ë%pÁ¬@Ñ, à&Àí«Ê+†—!ä"ÙbzNêÿHy ©1c²,'—ËuÖèØÿKk¤¶fýKœI[œ»»/ÁZËq'.…Óžqgf4O‘Êö“vzìçtÄíúžaÍ+y­V·ù«wMzø’Ó4C“¿u<ÚëχÊ;9/­€æ[ü±Õx{Qy í°v[Ð%2ÃYc£Gï*>¿P–ÚÎ2„»E¶vy¿fï+¼®ä-]«Á&\ºÁùšë4¾uü…Y~k¥õ.ãmm]ˆ ]PK¹y¾·¸-´ ×x¾¥Ær†'¯à |c…;b^ƒ±¥MYûzJ^$§ÐmOˆ¡K@yœéfë¾ð}{ÂU»"¹Þ:Ìw'ÚÎ3Ü̯Ü'xh¥­nåô@ëÝÒ-A·ŒFVû­ëÛÀÑÀ·R‡—Մ륜oJÕ›rþj¸j+¯µ/¯ŸýK^«4åJDå$=Τf|GêÊJä!òíò#ï\öß–º®îÛB—¬Î%Í ï8½«/Ò"¡»–ïåB~ÌÞ“/TZ¬/Ëâû´ØUZå ƒ‡ š·Žci}®|vó¡«ùNŸº©€J[Ѭ®Hf«¿¶À¹‘X&.›€Å¯/H´Úô^à{Æö…5ÑÝÊœÎòJW‰4-ž)­C¦›WiΔœÑ'¦åèɳ~´pKOåÿ/ÿQãøzÈ3`fîF#Ý®+]G'Iºƒ&È(&ÔÌV“šÊÒÉ„u¤#ƒ-[¤R„ÙS1™ŒÚÊøüÚŠ±ìJ…³Éžw„¡°~:¶×!‡ÊCµ’å©:WS}º¾(µÿòÏfªß¦l¡!âØ”‘-PE6+­e(Bª„9ÀKM¡ˆ0ËLÄ8ÕGú”3׉óNÕΚ¼[Y@ØM`Ÿ ÔÄpáU…`ŠO"²2Bß»ïöý7¿°n—uˆ<°ëÜQ0–}§Æ¨ØBjI/ —¬·6¼dKÔoÉ %›)@±ç'+½`Þ=‘;â«"£)Âh‘Õ@´iöé="´n'ÕÉ 9:&À:Æê bÈ 'ƒó6§;…S£_qw*œ³©< îa‰t¸±ì:•Þ­\€Ì˜ÉDxGßõ¥"jÀRPŽuãÉŒH%ý2Xi™¡a²t2ãÜÃż$bDí¤,Gš­‘n´Ö†•­*Ž˜ŸD¬D©$ЀHDL6× ÜQz<}‹6’‚)´zéɆhˆ™+2O"˜÷0:À@‡€]9††&”7(P(>%*§Ö‘óSz #2Á±!±]#@ÁgÒãœaDVH¨š†CRÂëØ76v½©`:‘Ñh`”û H"V³‘ÃV`3øx÷q>g¢µ >b)#3e0ÚX ifì¾ù`Oºýó/?|ó›o»]ùð×݆ֆæ}‡®‹¾÷]Ad¶4ÀŠssÏŒz¨Ñò7¿þ ºõû~ÿáÙÌvýÉÑ€ËÝÔ…(¹æú¥=ÎEã95HºC@½^ÏßfòœQìç0qÅ6Y¬w§ú§yÑè<ô»·½&à¯t„y©´Qè±Ä .ÍO2—²œÖ»y½§Nèžž¹ŽònÈu·1Ž›5I=ý,6J:—Os1íAëû:qô¾&èÁˆEÐÈÆ»àr«ïí¤ÓZܼ28ÑïõJÞíÏÒÚg½ç²=~CœñÓóˆzqIfÎŽùòo?´¡ýÓßý]Ô ©lq2„¦uÅ‹wFŽDs‰)F¢o)†”Nt»®9Ô4Ài]1*j4F¥ÒÂJ2½1,[CÇ|Þ{kr°Ž/ÿö©<=Õ>uÅÓ µyÙÙ®äqÈ—#!›íÛ§×ÿå¿¢…=YˆV•i¥å¡¾Öª%¤2[Kï Xv;dÒ­uIÁÚTZ“‰&¤Ì4‚)iTNÇJÿ‘‡n'š¹H”IDrºênpN0%òdó; ßMSAô¨†{gi ©CÃ1²Kç^E¢¤UBŽMmnFC¢/}/öÈ&¾’,=­ëÚq€¥^ æDOÛ]²xÙ Nú”\¤›æÙ$Q:2šbð®©lHÝ$d«C3iûL¥RôÉÆ`2æÊãä=;2âáëµ¼v¨:Òá¥ó²7/f}ª£ ‰5€Ls(k}©ËhÈ”Ò:cOÀLJ°q„ M¢i 0sÀ"ct&R6iVdÆ„Ñ"’æÅœL Mò(O^Á„^Á±´?:ÉcÇÃëµà}/HÃáXå$ý{ÐŽŸ‘ çd‘‰È:º£\îh£ƒ4aßÁ Jd™Ž‚ûiw;zKdÀ}20!Œ-ntA‚ê” Ä1ŸQ5ùjVÆç@, gÔiƒfD‡é¨Ht†âS½ÿ¤û;È—ÄCËðı£ÂŒ Zÿ´‡›ïËþ×ßÉüùãn÷ÝDzÛõ¿þµÀS¬‡¡!ÃŽI·Ž$³%‹×ÖÆ¹)#^‡®/OåÃþÛgA4^Ìhg+àLÊçC!Äï}_Öýÿ9 €þø·¾ó’Þ%¯¿k<üI@çO;]húcy×E*|ÄŠ•)­™$úµzÊ¿æ¤tªZG*áœGáܨ¤œÓt–é¶Sùü¤*Oõ/SG%”yBÿç…+׋ïä²çÛ¡ÈÄÀ¥rrÆV¹ëTª7ùÅc¯‰)4å¶NPiQƒ¿h•¸8Íl°èNTW0œ(·hK+Š 6 ¸`"û†âL‡°&éi}¿Öh~ÐóÁï]^=ò¾öÝg}­/ÚúÞUˆ+€–ä¬÷ß·eö4ŒŽÛö;wÎG÷ÆÏ7†Çe¥ávÅ(ÎlDèm9ÿúVLO æ  Á'7ÕÉLuu^· ±±úÏ®Æbìé:øúòpU¨}½ÑíêUݳXºsÚri=!\*zu)v]oæÝBÓŠ|v’ç½câ£Ùò$~ÄNæ<£ë=Sß=,OnU¡ðæå®’EltTlVèÌ*Ôïîou3ßï¾s§=κâàV-ù½¢ï›͹9÷ǬƒÖµÿ˜ZÞAÒ]o¿ÐÈ÷qÃÞGž¶ó9§ZîU¿ÎÌ&Zw•e^ÍzºZD–+Ézâ½v]Û´y?Ïû3Ñ¤Þ û£Sñ÷ ‡ôNjÞs‹‹uíüB]¢ãÅ¿Cüâ6uÞİ~ÅÈrjݾÍÒÌB’«µt«Xòíb£ñbѶf¶ Wû3xüó§ûá¿ý/ÿkÚyQ'af¶ëÇC2÷Òï:3ËŒˆˆ–iH £LÉŒ™’`$ hVÜz£”4Cª(C@¨X<*º$_}4YmÙŠ—¨µ}úT8ûT×÷qâå%__ÓˆcUŠ)ïKý×y~0ƒ ÃÇv2#ŽÖ꡵¬î²ŒQ›EÂH…¤+3¸Ë]h–Õ é­ÊÑ'•¤ÆÏOLV«[6 ¢›æš8|F¿¿lnm|¸18J0B6ɾ#>î صJ÷ðÎÜú–¬Lëw©pt…%P› vhûßVòõÓpøAý3¾ù›_¶Ïþ:´D_jŠ„•}!–}¢;+;óë'f¿”Ê&«f ”Ax×}$ÑïûŸŽíP¦¤Y1"H#Q3ËÇ TFe´ÃD•PöˆåDOõ…æÈÈnd×tÝûFÀHf*‘É@†šHšÌSm,ÂaG@R&sZš(¹¤4ž)ÿYÅbV ©Ì ³ô=ic'‚ ­ôˆV£V¦hC§ãÀQ! ‡‰wß„lÓÄ FXí`ÜP DŸžë‘œ3f€ÆœAæIÜÅ ±º¿Àæ¨ÎáuÑ"Ò¦$“¥Gq Ç©xßjè:äh-(GTMÄ! 1:[ÔœúH$ðJ2Õ„zrô ?ù4s’ñ5‡Ijlk(³ªÿ0$°³©„°wؘ'sЉŒ©’}RȤq:f”™í»þ½ ½ëŸö»ý‡_<í>>ïÿ⯑¡cMô»lCJcˆµÛ÷È>¿î><+³5†ö«_ý&2úçýwñËÚ»¾¿Óº§Õ¼ºYP>ïÞã­ö{Õ¾[jÀ@`¾‚_&þ_–o^7÷—7vê¶>÷£²·VÏÕ“oîæ×A‡ÞŽàÃ%c v´ØÍÎAØ\´¼¯1ùÏ:?Ó@7ž„Y)Îõ6ûXý¢R_C8@…ó¥Ûî¸]FÜ$Ÿ{|¹­Â®e™óNø½îÐó–÷éáh}skaƒrÊzœ¡D õ„³4ÁÜ›¡OØõËZÄ͵úštçâòІ4ž]£¢¶ŸÍkiy1^ÞHG-§àó8Ÿo¬?n½\a+…¿àlq&â|× ‹>—‘ß­£¬w—¤ëìÈ8»ÏË5Xdµ9ϬðëÓ¾³E™eGu~ÞÏ-ºìË8ImKÊÕg-.ëb0K·ïþ:Ù¤ è¹ÎK^ô.Ì\Ö(N ¸f“†ÎH¾•²ãêê.ýœ¼¢§mÀ¬lcu™¦GáN}µÝ=ý·nδ'hÊ_KíQsÑ‹KšÐ­§WЊ&ßãäZôœÿÖ9€Ñe㢛“Èò°îÕmJ¥3žŒ6Gšt__gD§Dä}:O‰Þëy®kÃï§U¶²;ä[y„9ƒu6`®×ÌC ]FáöR¼ ½Yœìâ ¾”®ÜÙÑÜñv¹ÌˆœqdVØ=Σ½UEÉ .±)Òk¹êO9‚«»sãz>u\*]4ŸwA@ó•Ž«ü¡ ­ÌãÝ›V†KÐÄUPq/óñpà¬åvëüñ\n…WG?.Õ:ÓÙi;ó¯K€£¹]©Kãû)³s6‚M;’OÿöÃßý/ÿ›"£¶Ì f^ÌÜ­¸ù¤×z×¹0"ÊRŠºK …L!DBŲEg,fÈZ¼ëÌ™±/fÄh3J³bfR¶8Ôäç¡ûÆ[4}x.õ‡Oñ¯?ìžúy),¦ï?·cí¾}vgý·Í×£h‡†Ò›PÇŒÚÚ­f¶l Åp YŒwØ\fˆJëdH™K‚‰HDDŠÈ‰ b„0"Œ¦©ÐfáR:qÌG»'údÓI! 1 ë ðÐ.¸ìÆÏ15Õ0$Ý‘,]ñѳÕÒ”4¶È64÷½}ÈTÖ×£y×íú:´ßý·ÿƒlh¥{î %)Óh*@1ßÙn¸`V ­)) Mj,BJ­[‰h„¦·ð]<Öl­Ác‘-éæ™*¬Nç -Ðïœ4n  ]öêQ‘Žþhkìúg+EY)„¥RHˆ£[@RÈÀ(‘NËù eìÁh9"sŒÿ333­˜0‘- ¨ÐF ^ß¹™ ‰tÈ̳ˆ ÒŠGÖÈ–u@mxKÍ'ç^%Ú€¡ž¶. l‡~ë&ûÜi¨äT× ¬8]æÔ“M0ÀgCh¤$íF†ÒÉa8cÊ£¤@¢%Hdàx@Ùa€ÜQ+ZCHDÐLÑÀĀɫy*Òª 0$0¦*Æ×Xï?—FF"‘É‘táùŒÉŒ±átD)èˆ ¸ÀDKt.´†! yP©Pb’;cçn§Î»çž¥ëw¾{îËn÷áoþÕ‘™Øíwì{ó¯Ç–0·®w3cáÞ?ÖÖb¨YÛo~óHu»Î÷»H•®/ëükÎ$£%yœº·ãº^,–Éòõq«W¢ÿ™ÚÈ!n§ó¶öp '\ÒÐðµŸ~ÝK­¯ÿ[šqfûw^ϳëB˜Ç¿Tã\?á#ð%U w6_4-ë­€Ÿ|zx'Mþëß~éÃò“wüØÕáëtü4×}ÖÀ+[º/ ÷{£¤w Z½å¦ý¥3 ï|âªàN[ô­€y·7M~¿OÆ ¥€ïíMÔí)PŸîˆVuv:õÎï)uö…ÿîÿû¿µ¡Ö¡fmhìJ_ºÑMwƒYé:!S0wÒ™])#(&#‘YúâcòHi4#D:Â%8«ìدa@§¤aÌ#0DÆXÞ šõõÔeªþë'Ï–V«u°¬%2‹s_Šÿú‰îÃÿùßKïúÐÁµ!j;Û¡Ö—!U3›ZZÊ<­ ¥šØ’ÉJžü#ãË•u,5KœÄÜQ•%a¶ØIŒ%Ì– Ãʉçȧé a¸@¼ ^Д V`š”;ºuî„ UT¢¥t,Ñ÷„ØQ:šwÞ9¢f‹¦Æ®tÞÁ}ßu ""Ì\ær´±ÃNXIÍHd6 ¥ª²a Õf" ©Œ¤™ÑÌ”ŠJeDf§–s7*ÑèXuȨ,†è¤sDNX°I3†÷PAôH‡§y÷\ž¿¡ûHŽo©lã²Ó˜BÊ©K¤Ã;%¬‹ ÊL)`°2 nYº’µÖÁpgŽÒõµE†Ü=Ú±ô]ÙuÙ¢•¥E‘ÌÌ '3­q|Íú™­µijˆ %¨Ãé™K¤°ë±{f'eK9ÁŒ'' B %‚‘yïGN ÿ2ޱ‚&+>>#"íD×é 3´â'†‡(áD&ª„arN£©‚#€FÆrü9GkĬb# Ý(ÙN…™0 “‚¨B:¢qò`B@ŠÐ9@CKt¬ ”Ž€Ãˆ‚©·&χ”pÉŒrCï]_|çÝ®ï>ì•HÚw9¼ú¾<¼Ÿ½‡™ºCËš´,ݾ)bT[ÖÓ,ge·Û=íAd$˸¸/­ÊĹX÷§÷ßÃfÕ(ÆJÿ÷´ÕÒ|óG/£|ǾE¿ŸŒï‰®:ÞØÍ] ï 1VÐùs]Âê’ý$í—Fÿ? žê×ÜËž2Šãt^N—êT[¨5ñâÒ»qISñÔÌLaÆšU¿kî´y)[ä¹téêIZ&³fÆÅ<„—â3;¹ Ïëß·ñÝ×@6RC·̯Ä}^9%.½s.Þ˜n(›5c|÷ñN³ øÅíwM¶ï ˆoVðk1~7eŽ;W÷÷>ièÝ—é±ÔߪD~xjyÿèÁ#|h1øchúÂËC ¯=”y_wÁvk®>»B½w©ü"d—÷Moîæ¸ÅÂá½Áu>c]‰;Ú|Vȱs]êúé_—âkÍ”_Z.þÈÜÞ­Ç=<À4ûn¦á7¦ˆbi;¼úBaåC.}õ4×WÙ±-ÛéN}ðîÎä'NܸïüZ‰™·v/_øsøáœÙzÝ#ÿpãý »sc¸þã—Ê ëÛ½4§}ó‚ŸðºgL¾‘˜×tm$^±8k_-0—ƒk–àKü`ã^ýX•çÑ1³ª³”îݽ1òZ•thõ?¼ôÝ üŸÿËÿ”5²A£ÑI73ë÷»Òw£˜’»w]I BFf¤™qÄãf>N×f5:7§Rµ;•Xõ2;·bVC­%Å}±f;‚lÅRÍör´ç=ˆÃ?ý‹íºnWbhQ›uÞ}ØÕ—ƒï÷úü/Ÿÿy°bùÜE Ff¶P^u¨qˆŒÒ¢Â\¬“a,‰F–4Ф‰ªÕ¹Z GÄINZ& ´‰ä“6ñÊ1ÌŽm@p¨à\57aa@¢#º'¤0°ßƒ@v|êöåx8ä!ËSÙ=—¬Ç:Dh0e;ÜúâI–§§!†G¯:Te+6m×»Jͦ‚h ï¬t¤ÑaÅÆååj)¹ÇxG‰ bÌ´TG—Ø¥°±’/U3c,meÑ8fÆQZÌâ5ò…¨ž ©mÚsŒÃ2cêx` >Ü襳®ÏÒd3E(aÈ€"¢vû.DÊE& 9(f]“B‘…¤£ÕÙÂå™jñJ3å,])¡$˜J u,f&Ôè¥8½xC^Uk{}ãK´ªƒ¬!Ù”ȆˆS!\úG€LxÃ0õ@L¯œÜ¡h¥LŒ&¥ŸÔïáDkxý|yüÝ /Ÿ‰ã€|?B d½Ìߣå205š41…&t 0MzŽ F8O + @è `%â (ª©ccÑtèj‰Fv¦€9¥ORè „£Nd$`Ðhfpö½}øXÊó“õÏÝÇçþãSqõO{ûÅoœèûÎw @‹T­­…ؘI1:”Gm­¶:Ô_ýê/y×yçýÇç~liš Qšö7c‹ëYøºçòÇä²ßÚ¢-ˆ 3ôÏU@óîÀ¯*¢Îã*=\|ÄSVE¼Ô¼//Î/ÜRóoº_·°µZ¿÷Avž;áPÃ?7èüloÒ+¶„+Σì•B|u³¸Â=ë-*oýù²‘_‚2ð¦"ÂÅèF¿Îõw.ͯ@Ió†o<¶kDñ«Ùdk—Kó÷ü<´AÕæŒftBêÏý.¶£>-j3WmóA{–¦¬ã’¥Ÿ\·x¼Cgȇpé<šSgH„N®‹&®§á¹ÑMxéSà%záBž™³âŦÿæâ}¦ÿ]]xŽŽ¯áøë=Åé2m~þÍJ®Múè [ÇÙäu´×³Äó^žÜ®^[òÏEÿù¯Ðö³m8ï„XoÎ3›a×ÄÔÓÜ´i½¾ïر:ÑSÆñæ ˜óæc{uúäͧc>ccႳŒEu6Òv)Üg„— @ë¼Ó KüÛßþýñÓkFÖcUŽä Z)4€ô¾x_º}ŸZ‹Ú|×uýîx<˜[* nfÊP6‰]W@¶VéVÜꊛ""F`HM°÷É]—EÉf2t]iCS„Œjjt»ÂÞ­³Øï[þëN¹{êuèãå˜òòéþßé°‹É‚Èc‹Ö^†Z¶š5¥–™f£ç. $‰¾œ†J‘k¢ôŒ ¤B²2ñðK6)¶’`c¹ú©_€ «þí´îa(MT8]nVà%£y7¨ÏüÙ`†ýód`@gñòùÕ[×uöôñC(Ÿ?¹{æPúÙÌlß—â~ŒöòéÉAнÀŸ:4w—u0; * ËsçÞ%=)š&¡7i†ˆJk„E eCÔ1Ñ6EÁ¢¬Ge7N¦I ¥hp#*,iBÕ˜-cF×€rl†kÜ'óÞ±g ̧&€ý3ð̰=º`ÜD‘¡H"ÐfzƒR–V–ltv‰Îœå.ƒ÷T dî¿û0¼Ú1Ñ €‹ÖV3›ïK;¼Ò-…n÷LŠøͼРR¶ªâõ5ZËà êѬBTÁЬˆ1þ#d ™èwèv“ƒá¸ÉÃd'ufK ' ¿ÛôQÆ©wÄ ‘Áz¨q©xè{(1 ˆW|úð=2Áݘƒ9ØÁrB µ6UÖLTMNÔX¢ F˜!Ùä]œ@ÜÀ¼¬„9^ŒÆ½£wŽ`Ýèh  aXLÅB±ƒúqA44¡f('Þó8< Ð$ŠÒQ:zWÊÎýÃGÛ•Ýǧù‹LD«å×½ûØ÷]_v,Å»-i¢ù®‡û´¢Öz¬q¬Êìv}¿ëöŸ?þú<%j4C³­jkÎQ?ÏøkòA)ö]‹Ú\žX7n­´3n‡ÒÒÑò4îÀ5~cþÕ—€ K;ÏeÀ¸Ø_ãC§ ‚ G¼Xcò„ÈݲºZóH¹A¹æ ãöÖnŒq¾fE`\/²W$œµšs–LØh¤¹t³‰2ž|AõÈîöO:Ï+èüY›]$±no|.,z^Â[¬á]Ë!1äbeË|Ó dF…zoŽä–˜³ùy_0±œ£è¯¬ÎãUüd¯k°e‘Ûª`{ÍMÖƒ#˜7´ÕÍÌãæUÔ•ÂHÜÄ•]ÑŠÞ2\%¿°2=ÓQ¤›ú»èFº¡i>š“=ëK|Ý4vhÃåø§êà|X¾fÀ%µôÎ.³k7X~… ¤û²·ôÇ4žîÝÚŸü@—VïiÂU6üÝDl¤ovèšÕþ¥ï§×Ѧ§×W{Ô¥w<~øâ¯Úêà2w¾¸¿GÊÊ;:–Ö!ó2¬KÀU¦O7Â…ÇêQ^Ë€«þWf™>Ñûî÷{!•Üp±x{=øZ§ûÇÒðEóñÜ$çG’AgÁÓÂÀ÷«®hœ»IÍŒ˜®f#Þ¹ËËôæ%¼½ãƒ}ô‘?zúáõøÙðÆüòcÇÖ[ *~ MNˆ³yü¶ñÐâÔ´Ê ®;/ÆŸý¯ÿïÿI-[kÙ"R^Ü»®Ûõî#¥+"¥4Ú ¤{¦€”à^2QÝÆƒ1ZóÖÔ†ˆf})pE”-CáîE8D†`†=…YíÊžD"ChH4š¢Öã÷/]«¥F÷ñ Çï_"2UÅðý¿"b8T @Ô:(k°f¶L$µ*› RÑÙ'QL“]jbdá×cê­zmdk/ÈDƒõMæ®t¨@†,ðH¨ƒùt3³\öQ/´d€t„£½Nèkð„°ƒC­íÐú}?&ê ÍÁc;öÏ»PSK4X}y2ëŽj]ñh©ÑÏ—d1“³ë½”V!/¨Š"jCfưŒVÙªw•­IRc‹¹!RÊ ÝŒ'cÝŽV}z¥Ê”B£³CJ)À rXb¥óš…zòÝhQÇþË¡ª6dÔtM$œfö$™we¢uÓà¦ÌlƒoGž‘‡Ži¥Ëá5h:zç}GÛíÌžåž­—h4YÃhŒ¨Ÿ_5¼êøªÚФí3Z›”úQÈÎQúÏiru›<ÇFXéô»<—Š):÷Q|O”sDÀ Jâ”ýdbLÔ>c¦.„Ö°{š@R#~*8‚€ÖâŠ<µŒ0(#G6 mDãù´bœ5MbDQ@ª§9ѨD!ÄÚFWaÙ˜? „k©OrúdÓhðsî’(ÄHé’>=Ù‡ož¿ë?~÷¡û¸Oò›¿þ¿¢tF¾@·²ïûÝ®¥i¥ó¢ÌÌRÙZ;Öv¬ñÿö?wï?~øð«oyîã×¥¥¿ÜNþDñ¿ðWf+7œÅÂòÕCß/ÇN%5ÔµÞ{)*þQ—ð+u¬ ¹m¯À-ÛY®uò7bßIúC½~ èüÅ `Ë|á¡Ö‡ÍŒÇÕý)@~_¯rÛÏôÊt’çB§­ìË:ZÕIjJ+¯Ÿ·ÍZwm[Ž3ÉÌ|sæ:WFó¯œëî`¼Îõ¼§Ôò®<·ͼŸ•øÑRÑ£â¼4éÁÐt–˜þˆ/=2Ë/ãÈßÛ,ÌŸj&}Ÿñ£Ïa£ZpCáÃÁñ{s˜? Ä÷'ßô}Ue_ºL¯ÛåÞ2ù~Ï ˜9ÿ8F¤0÷4|›ÌÂõ R_ NÿÒ©öb)ÉÛzÍ£¥üÒ«†¥Û8þ ÚGíË·‰C«M]Íú t;%¬E#ÎÙº‡wú“yH—Ôó/ãû2íË ‚¼o­ôîÙqiyt 0+c¹ù~n0o~ß›û µÇ/ú—©¼~ò fíÈä¹þ¶#Çed ·6ª§š‡êôïå$Þ3“Þû"^ТN“óúf%²Ð<Œ?fxœîðßÿÝß?xýþóðẕ6æîýnç})}ßõ—B“¤c­‘(÷±H¯ ‘­©ë3RF(]é;Ï¡æÁ-¢/l™…fçÐŽµuÌΜ´BQ9Ð;‚^kSƒ‡¡½Dˆ,»Î?ìJçñéCµPÿísf*uüí? IS êá€×F<£Š!IÙ&/ÃâSgÈ87N•QýëàÛ䃚qÎñ’”r´-8êûŽ–håh‰îi´'=ÏsT0M©”$£QAI ¶ÇHC w”Èq´]*-¡†FDdßG*ŸöÏî~¬ŠýSA9:Ôjamàêv{ßù¡E8ê».•ÇÖ¢&|'ª7aù.jªµvŒaàNµ¦no†lm@™–UqZ„´HÆäÄWìâ]o¤6@ 1(ŽDLÕûen*u*?NÐì¦<ŠÃØíÑ(}—n°ž ÷e MÇÇ–QýC4¥Uxééòý®x‰¬™!R2F î6 GEkíèf2µ:ø®£€4+Ïfn¾ß}|&ŸÚáH"Õ23'l<;FB-‡£Ç¡Å!Ñ25JäÉh7Z §á4ÚŒý~jq #êĺ™* @ŽÊ~i¢ùÃiä™!t=JAòˆYC'¿_+ Ãz˜Á+Èœ\(Æ„DŽš{2j`ÊÁL¨dLgDbj;‚ŠÐ0ý1/ö¿J ž6ô.ÄÈ_zÀÆæ Ž t{Eä£÷užtG_`œ•ÑŸ¼‚§Ž`*A+HwﺧoŸ}·+»RºbÝ®6°z=4GôºþÃ>[¨È ¥t<¶¡¥õ.!#¢FÔÖ†šÿñøÏ¥ïöÏO~õÝ0 ‚ö}¯E³:î6€ý1ÇäÜÞïèþ[ù¥[­c¬/[ÏÖ¸³Ö4®p ?á…»YxÆ÷[[[&r£Öì8¢þØ%¤Õþ•³^+þʽ9Zg8‡wj›Û~?H½ù„,÷º;µÚ+ÎZF¶¿ôa.X!§Õ}á8}ÙŸÎzú' ˜ËŠÒ¹oüêüxK£'Ž’RÎZMVmÏ«Pî"·L%ºÔ8]Ч[ŸÚxÚÅ%Xyöë W’>Ö¯…YïDOà ÃY7TòëòLn tæØqa°18'(èåª\’(çÿ7¾³žã“×ÃÜ¢a¤`Ëm|ÆF?§]f×`ý¨lpÓô¦ò»ìrZÿl)Ÿ,ÔÅj\^Ö%E« mMqávVˆ[uñÑ›\Ï¢ /Ô’UWâ,¹4»/3ÏÝœ©¸µÒéÞLunÄZȈÛçsêt»˜°Î¦ÝYãü±s™æû¹n¶Ñ÷v¹ôºs³ÙïA»a™œ=tâòù˜þlJ;ON-×D­&ÿËU\´Ä-ÚæÖéŠ3ÿgqõÎ1^Pg«’Ž ÃᱬéÜa‡kGòÎ’>Ÿ¶ÃêL”zkýž0ˆ—™|mŽÂKuãüTçYœY†÷ü}fçUpörAÆXþê6iö_:ÒN×ó6eÁÌX ͰDºèu| Y0óPÒ²áñ:)ÁEo†ýá jñV…/Vcr ã–>o~]ím.Q˜„U³êßäÒèfòj1Ì´ÌiqÑÀqJásµ;þZw6Ž3„ú|¦³‹çv³eêù·xºP‹a.–†õì¨ÕÞýj¦¸bK.Ÿòåüp+½±êT˜³Sp·éUðˆn_öE…É)G‚3åHWénäµÜ¼GP^~µ˜Š/Í- ‘úÌ®º½Hk¾,Ì&hÎæB^ ­ôøsmÿt˹Ü;nÙ2oì%„—®šŽôvûÌ ¡sÝì¿y…—&“9Ï9~iÇ¿‚çžrîÞ8­TŠsÝÿ&ëùê+¸•9€®ç$žK›fi†eâýÍHm ¼Øoÿþ¿uøôš5êP£†¹¹;ݽ+ݾ/}×õ])…F•S‘¼3ƒu­}[­‘])"¢¡ ƒ»õûžPAÉðÑz4K})5h¨Ñ©<¾™ÞY¸ÉP8dköËY¼¾­sxþqGýþÕ¶{öÖtøþ¥R%ZÒ;YB©l ’@c@9²ø P›'†‰”’@×a2ùÕ¥‹dtUYÿ! G¿;I´ŸŠ³ ,L0µ:­7“[!i0'ÙgdÈ# x"a{|Øï ñúz dŒøu/„£aÿq7Ô#™])^œOCóçþƒ,!õâë0”¾/ãOížv»owM6ªÒžÉÚ3²ˆ¨„«™­ë˜jY4ÐTrª·4ó8Öáø’ý̨ˆ„sTüAÂ)´ U´#TÇý‘Ð!sº&:1åG” 2Xw£!ƒÙ~¯ÝSÛùØQLH uY[´Jè#B&ZÙûî#‹ÃYú>“q¬QÕqsæ=Q³…ŒâÎt}—cN&I3/u •þ¹Ûu?¼~¢‘i£m ›G­jD«yÔqh/Ù_GŒhê0a|hp¢ÕË.²ïá=D îà¹EÀ JZ€1ÕÚh® ë1$B £t0ÃëËä1 ›ÄýÑ À 0 ¦¯v„h`^¶L­¢µñv¨æè[Ìà¨×ƒ69O;å„eb7Á bÈ,èlù À HÀO m›…X˜NÊÁi::&zÂÇ$Üdº œ ª ´ñJRI+æ]‘õ»Oÿâ—‘ì>컽 ©ÝóñeèùM÷üle­Ÿø·Ýó³:—±I2óŽ$[„BQk;¶hñÿö?—¾úøôͯ!i·ëѠΨæ+ èÌøû!ç¸l>ìkÏ;x¸S1‡n¶0^{lᤛ⬣sÚÞ­èŠ>4ãc_Î{Fš‘'ÇÕïz±y æ†ÓYêJ=m{t[(™º­¨ã—¦m^¯{{ _ꈳþ„õÝÁ•QÓ=9[çè)`=Ó'Wzo8ü Cç KÅà¼@S5Ëò!¼A~¾PY4—5–Õ^Z‚6ý«î—FÍïãWO¨Ü ±¶ní)rYd-‰ÅZâÎQ‚¤r;?¶l5uÓ³á‚úÖÖÜ¥”Ì„âæ[̓s£vÜtpàÉ¿x’·/Ö»¸%7sŽxÜÀËZÀ7²`Ó„wáo‡µ_7Ó6Á¹ùh!¿=úw'åîÿDrú}ÙÜëþäuß›Nä½TþOTäÎ Øw~ çe‡×©ùyS[â:Ýðg¡ùà8\:IàÖ 0¯Ñ\,k¥à.žûÚvá_l‰º±-ãMÕâ acž—½þbCr^ŸïT¼Y¡ðøÐ̈́怳õì2“óžj^Z(·;<½«gâŽÑñÕºûÆÊ³yëuM‚œ§q7€›ˆzþ>:.Ï6o~òæ·Íƒµ/븑µ»>Þ7>ò­â=_½ÈzŽ©ÇþÜÜÜR¿·@w‚Ò7¶QÞÃRÅÿ\Be¹¬š'.¥VW¢½ë§äÄ]Ý×»Uù (­.Âöóµaè ‡¾kàñ}ÓéZÇçféK7¢7QK»¦mAýR8ÛºøûQýByøþ5$èÅͬÛïúýÎK‘ÐP+ÈÞ{)#@3só!ÑT;ï­ëE¶ï:X<¼fm‘Ú„Vžž¼Ð2 å˜ÓE PW,½7ï¤,ÊOQ½…iJ!†-YJÿíS‘±†íz7¿ÉŸþë?–çâ ÇP4ó–Ö-Û$ëÓF*>ÜTŽvp£}oˆ4ÀáÝ$È6LpsØd| °“ëxHëaݤe{”ÉøÜO3–xà ìSÙ›wª¤’¢™ù¾’}kAȨ"÷ôWË”°ë8¾¼b¨Y:dƒ»ív^ábD4´®+$_xé>ö]ÿt<´ÒÑ;öþ¹ëºýþ ÈPUëˆ$Ô•Út¬ÃS×uÅ3òõø:dûØí­¾Ö×@ZfU67•âÃá³ÚQ}* ?!J¬@CŒ§òðΞ (Ðäpš¤N> ÑNµð£1²]0Û”Þb¿Kïe}š÷ýSFæ±¾Æk·{Š9T0ƒ©¬£f½OoQ-އ~ß uT¡$Èl°ÞKobPvûáp•)ÒŸ¤¤w;µxy9@Fc˲)ó8:à //‡—W$ÐL5³!*Úëäèˆ)h ó)áQ:À.-GÀTLy@´‰ˆDkè T¦1V„ÒOeûph ­a¨Óá~©iqG_Àµ_‰CƒL´ÑЄ:ù 3æR‹Á€çÝxk(%% '‘%jLÛ.ÓdV<ž„&TNã¾ì̲Ó"„Kj ½Á $†î(>šŽ :eÌà:º= ,`)]ßóqÿݳj-ß>!«úŽûåG7 ¬”½ï¾ýˆâCd¤‰ ;¥ŒT*[DhíoþöÿÒíºÝÇßþú;-DÀiN×ÉQqK}ÿ²üãcò÷·n^-ºøŠ­õ~}q&®Îï1¶·xœgRÀÍÅYžö•HÖ|ŸÃ¥PâÆ¾y™]É÷dŒþ\ óÄ¢äjã¸yk¤÷^½Âù}}žº\’³Í‹Ñšnó—¶M=N½‚ãN:¦u ‰LÎJþnµ(,½ÛçÉ3 U·ÚÒ7ç¾is§kk®·”#ÞD|ˆõNsã÷ù¨Bÿ.qC?ƒ´¾¦øü¼îŒÓ¯pïÞ·fðçÛÿ#ÆÌuÊûçëùàŽzªêø3Ÿ­ˆ»Í2?v÷|ƒó~é>»ßèñ•ˆí_rèÈq1ëðxÇq,«u~ÚÙõqÐéëÚmõëÜßy3Ö]þ»ÞY³ÃŸl~Õt¾Þ}#N*O-|øfü Ð#ýôâûò©w~ezüÅ·Oë‡íìÇüvÝ,Eþ¿ý­4êЯŸ^†Ã næV¬ÐVJé ‹y_p® 5‹ŒÌÍÈÌ”e)ÞYJÉet]WúÎ@µÛ¤ðš+%7_Ì”fµV”²+n`€‡PQ7$d–b MLdJ©Èlán&¨/CýÝ¿ZÉDÔZ3£©ÖᘵƠ¼ƒ˜¡5p$¨Ä(î‰6É‘è ƒw _p7˜aì0ÀÌ&ãàªÑÝWd™ˆ…c‡ íp€´,AH+…DÈTÍL3`ìèNs/ÅÜ!Rj‡Áh,E-¢™©Ö²¶lMY[Pq …˜`¢ê+êH0a@kp‚‚ønJ ȼHóc‡ÁøŒì)޼;HNj¸ˆ6RwfÐ%Ô†ˆ` c+Íh8‘9ýãÐD¢&R²ž¤ù(T!Š¡sà“7AÈ )3å I0Ž /ý.0Äx9YŒ.NtŒi6 !ƆœÑÙù4*DqHh‰R@CJÇѬ{·3ìž Û??Û®dK£ï?~Ì6°+õpl5ëO£»B1g)ô¢PfJŠÖ”‰TÔµýÍßþçn×?}óüͯqeXjSWµÿŽÃƒ7à(Wt~½m×M‰ö‘£žIÿ´~wä=ÊÜ 17›&+ýÏjÙ:ÊZßî‡ý"f…ù¼êÆÁØÅn”‹*ùÇò¶¤¶P|Æâý}bKóÕ¼ÔI³ô rç4jÑk?s_<Ú‚ cáê»Î]íS•çþÚ[ñŽfÆLV0åÔBxé$Ä*':þÏ´ÃKªsúÙ<§x¹´K¦‡æõ„\G{ Æ%§ÉÅ,Ê­X‘œ#p®"à†ç–”']M/×x´Ç&¬óõ[×ÐÎ[À´9©ßwí–éG0Æóæ5Yg›Þr2•ÐÕyoªn.S£¸6ÐViÞ*$ãuCßÄyçýºªùåÕñ¯»óî^Wm3Ô×å±ì¯jùWv¯XT½_ï{7v­«_¼þ«‘_tk¤/[%n–ËkæÝ|~¶ª§çÓËr½ã‰8oîž¶×\wý¬§Š9[m>ÂÎg¾¤â\5Ðú¢_—é‘sØÚ’©KÅâ|ÂÆ¶§ ¾tVhµ,C»U­bžÅ¼üaZEyÙíã²"ò„!¾îžá¥5[ ­É\>ß3Zà7ãÅŽúô¤^÷Y_\Ç·ÖËÜrÂÿœ«ó_Yu-ŸùfsîÁ&0ôçû^ºÍn<'\mJHÿüOÿØÚÈÀ0‡^Ù†![*š¤H© xçîpeæ¢õ}1Z8„h&ÉÝ(°ëŒì»^ÒP™á4 0[1ËÐÓ‡[¡bhU µÖã§×ýS PÈ„¬AŠ!jÖ°`’L#Ó + s#/¯ÈÈÿþOíÓ$û‚Òcx­õók¶c¶ÚjHÉR O­R™À(’&4Úü&Ú3Ð`/ M“ðš-§EÄÁi@:X&ܘ‚Ò½û(öÔ®Ûïi;³^²˜Dk0SÆ0ìéuòùU2•¯ƒq ¦rél€Ìlßï Ô¡zW3Z6¼~j«¿û`¥£óx8Èl·ßu}µESß•ý®¤0DÇÝ®t¥+2fƒgP"ö]‡ÞË7LÙ~È×ßuôzHë>ÄQ$š&ÈNúõ¨íšÁ FÐûˆ‚QzDÖ 7?ŽÅ¨'Ï>!|‡$â' a]1îwYú€¨F%Ùc÷¤$–Ìc¢5EKuÔÛõ EÝY<ut³m-äMh4‘fÜ)ˆ™RÔTËl »þɼ(¤¢‚´Œ’,0³‚¨–H yT45Å‹ê‹4úýV¨Á¥Lî¾—„Óx•òñ‡Ã1‚w*º"&+Â1‡@¢ M°‚¾Ÿ´õ¡¢V˜ƒ†ꌘ2ÍîôfÐê#ZE4´4T¡&/Œ~t¦RÐ AÒ{x‚c‰$d€ ˆ 9òdP<¶GdÀmähq¬ØÆîdLP ‡DJè r"nµ0åÛ˜@ /(Ž&xL”$/ì;ÒìJWvß~ãÞ}øæ™Îçßüå§ù]Òw¿ìùéÕö}d¾þ÷ë>ìú» !]Pfˈh™CmCýÿéo½øîy÷ío~9MÆ)®·…ÒjÜ(ÚhxWÖ ï6_}Þ阸î?‹]‹5z&‡Cå ™3PÊB)¹Êèö‚³Ø1ñZ;k\ŠVš‡Ì—<7¹Q½q ëý‹ëMݨå|0zFØPbö"úà,E1‡v.…ÿÙnXˆZ/õñ—ë¯Ö*¿f»LÈáLD³Ô—ÇžW¨¬³D!.\¸g‰Y÷vNe͔⌋ºä¿Me]ZþœG8·WIá/’w žo îÇ;®¤ÆåDý…ÓOÒuÁÓVŠú^LñU¡>§M)ÎN3³ÉQAÔ•ª»Yg¶U 0ª¶·DØÙþr›’£ûÑÓÍK̇F‘fÈ—s¯{D—¦õ;½Ö%º¸È%­œ~Vǯ«jAݘ1¶9Hëÿ$ò­²ssG~9Ìn>ÜôøÎAº±f,ƒ§ s"OVª7×ô©êŸ~û[6)²xýá³Z¶Ñ¢µ6¶fVJ×—ÒwÞ‰ ¥gfD ZkCºR>ì÷nÖ¢Õ¡ŽOX¡ÁpüüB„õûTÃAÑúÏÜï¤ÈÄðéÕ TÖš"ZÍhé½·HÅVj(^í0ø®Ð¹÷R•H”¾ ¨}~mdžZÿwÝÓŽ] ©âÙõϨCýáUÃ1£ÁCT)¢E¢* Õ $"¢ì}÷ܽþî 葘@æt°‚qR$§;áPí€ÐŒ=º]úÎùÔ¡KuÉÞPÌ{¢¤r×»ÄhŸ3@&åtŒ>Ê )"£2ŽÞ§†Œ@­`žkC ÀËë+xÞïžv{)?}ú´4[ë ;uæ(¥cFt>w}([« t$”Çz Á “ÞQ‘µ¾(ŽÝÞü8|zýTŸªvj5ö»Í{ؘ&©%¢å¹6O &þOÆôÇ2ÿ6Q_Z›*âGõ_‚,ˆDTxßÁJ!ÛñHEi´’V,žcõ|g`g»Þltvd+ÞÀŒšÈT"”ÖeŠH§™ä™SR D‹›Û©z]’‰0gŽ4}(㙈ÈÖÔ"²©ÈŒAÇï¡ ´a2òm§ìˆ ¡ÈÚàv*áoS> Ö£ŽÕñ/Ð9[ ›ú‰Sr%w(qøÇ1ÖøØÈêPz('¬ÿ(\FCˆÄØ* Gƒ 8!Â;¸É h4£÷`#‘#EHQ£Eb~hSòLD F©ÌÐ9r¦fÑf‘˜¦ÖŠ@Ü&¯¶0"rJ,™@¢ìPS¬ÕC¾òÝÓþéã·ÝÓ“Õc«uè÷…æÚ÷ûp¬9Tûø„}'ïÌLˆÙ2kÄPÛP£…¹wû]ÿ´›EQœLqñØ»ø5¾›¬-ˆÄ# Þíwêf$ýf°wíy³àvèn8˜jk·Œ;ýjµ½Û±63û›oÅît`C·šû‡aiÃð€¶Ì‹åçœ;8¯gœE?¼U–r- ¯Ë&¸®ÊÐRp»…?aè<Öã‡7ŠŸtÓë­Ú ë­å&TjñòM æçÊ—Gk÷þr´«oÈ8s9ðnÄýÎÊ"ƒi[ Óºèo^ÞøöfŸ[*¿DüʯÇד{WK·£µŸ_?¿~~ýüúc}ñfâð§öº ÷ûùõóë§xZàüsÆô·w Úïa¬Ü–„¿ìw·Ú9ž^ÿ½ŒB~ÅÏZdv§<ŠôÈÕÔ?ü·ÿVJ9õw¡¾ëq¨Ç:FW­¸%aî4óRlL”B#Ý‹¹ 3Ö­5;ê-b†haGfKDÒ­ßí-[U4kÍi¦¨5£.Õ×ÏnÅ3G-–ÇVw»"ùñó'z9Ÿ}A÷aŸ¯/*F! 5^Ñ’îü?ÿOßì%¸[×í^~÷¹þІHöÊ6˜·a¨1„u2 ðiyêa„Aȉ´Þï!1†¬10Ñï§*ìÒ>}2¡‘ÔM:¦u`_TŠlGî¸ÿƺg¥e8éT)¤{“Zî…nôÎ7F{X³µ :²QGòjÃQÙMMªˆÒv»."¢¥±;¾«yg]ñ}é Í­¸·ÚR-»¡+{+ž ´úT>TžßEjh‡È×Þp¨¯Fëø!ŽM¯Ÿ^Í”Žû\_‡ 6sû°ÿ&wz9¼D6gÔve¿Ûí_^?ƒÕ{°±Úýr¢Ø +È`*EÇ™î2JÂ1ë•H'²GÞ;ØÈ«A—²ÈÆ$™ò]®dFCçÎÉ♞MjUŠÄ *DsÂ!%”2¢Fì¤ÌAðȤÁKGó2n#•HR(#¯ÃËq´Òm¯Ó ¦px™Nd<;ÄÄɆÈéÄ3A¢”©B£À TB“ì Ù'kÖH4f0 V¸¡Ž:;@¡´˜Ì¼Á2t=¨¡: L ‚©¿‚ô6Šû芨“ï.ÁÂâô=­Ð:x9](S0cV Ÿ‘‚ljMð±[´ " PÆ)ÛîP‚!Â8þ’417á@‰Ç+i³f¹‘2d”É$­¸÷ÅJç¥'yøÝÇcíw»ý¯¾©¯ÀØYq/e'?|þÝgçÎÜDE£R23[´¡Õ¡þÇ¿ýº}¿ÿðôá—ßN9ržŠ³ÅŸeŒ¹ {@ŒýùõsÔ}K)ýwx{}•½â#—n»’vÕ;²Õ;dr&þOŒ“ ð< 5Z9Ÿ+~Ÿ|©µáœ´q©+äT0 2€ä<¸ÜO]8Éœå4¯Ñýç¾ýÓÿ_0E9Kôñìø= •jàÒLO®?—öùK5¥–Êø´šŸ¦Fž 4ÿÉé|+B”6ó^k,Z6êÌ9ãl©¥aäF„rùÏy˜î<(³¾‚7¹@‹’1®ÙL›ua´\~:o[¿Nñÿ¨æª%ìån¼Àð\J¾Îwz¤¬@ÒíùâFÌ Q3Sò\Ry"ÙáÊ`öÝYRÎ:Ù×Í’gþȦÁÝC›²!êº$ðRñ¸5aßAì.Û“–Co4¢Ÿê-ŠÀ©ô€m˹C×¶\ңε\ªæeN[Z]ᥕúÕákÑæpžã7a(Ú„çóêÍ亖'Þ™qçiàF»È¶gfŽÈÅ£q!ó‹ùVLÀ庾Å™ÕhÖCºhÚ[t:Íž}mð.é-[Fâ³a®Íx•™æz~çæÆcÝV¸¬È9¯˜{b­DÖ ËoÞDټѹrjw¾ñÞê¸TïÎaN¼ÉH½E‰´÷;®±*wÆØæ<’¿?9rkuÐjd^&.<ÚW Íyâ± ð£…àZ < Pž·‚$$BZÝ^Qhñ¼]½y3t®šã¹6dÅ™äÖ²­[„Ðõ‘ië‚® Qœ#µ’‡ÇŸ½e?ÛƒðK{2–ð—“¡qòTMG³ß9÷dk Àöj»œoÞüVÀë]÷ªrª=׌>.~h½ph>JN˜ŠiÏý[[ò¿û¯ÿ€¹+Àë/ŠŒ•H©%$3ƒÓ¼+}7þÙÝJß»{·Û‘p›P¶Ñ"™aÆRz#k­Ê‰‰ñzjqäþ©|`$!Ôß½ÔZýnçô83†O¯uWž‹wµ ¯‡—ÂR¤ço>€^Ë®fÅÔ¨©úñùùÓŸ>¼ Ÿû~WãÀ®v„ÙT´95(Œé'¿WB Ñ÷c8ÀFä='å<hˆbh£[–„Š—ÔÌ2ÂØ9½½V3yé2"k=Çn¿È¬ƒŒ0ï:K ÙZ-•F"P‡FÈ`^lг5"Ÿ‚æ’g µAM ]߆CÔÁ{CÛ«Tíez¸âˆGY8µ8-&þ>€H˜]ºsgï„‚&Œé¨< v;À`šºF»Ýý2qlhðÚpì<i²,¨ LÈ:½¡æTbŸ£Í0±·é }ÙH {‚9Zƒ¹|Çîɽ³Òʈq µ±Ì¶ ªGÄ4©£Øh¨H˜Ðõ¨AQG<XBxÊF“ƒRé„É O£pWNx…134±§Lâ?BgÖ•Ò•¾ì¾y*ûgïŒÞ_‡òüLáðzŒá…û®ÿÅGëJbt.IO´ZÕ"j´!¢¶¿þOÿ©Û÷Ïß|øæ×¿Ô@³]ùeß8 Kï¯2:¥Þ寸¦Ä÷ceÒ³Uý¥Lb½€o5rr‹_ÕY ºÈz30çé ’&&ŠÞjgŸAЧýæíÅ÷æÊÍ%«“\ÇÒfóà:ÏiûtÝÃÌ7ö¼s&ÌêTÎM¥sCS^éKÅCK(üi4^oÓBËàŒ’2+p$e š»-iX ¥„˜lL$HKYYÕ£Yra&aŽÓá¹ Y'¬ÿ‰.p_^Éäõ½9G‚‹jš¡™Ýö­‰åLÎRºu ¯ïŒîŠ“+Áíç@×ê¯î°¹Á€cZÎN«ßÔ±ÙKvƒætKYÔí5zã¿6å`Þ›4·&¥«Î$ÞÅî©ÿäì1Ðü –]›!ñ¥!òœæ[ž¯3@ÜÊbcøéÆM›Gä¼7`ù¶eõµ=Àåwâ€-£yÝ~`u-½Üûgò¯îmu•°ÛÂiã„Ó´¶Ú9m޳åƒx‡~—³ÌºÈþÛä ]]wlr¥ã-,(pÛÿU[JöP‡o&Šx!âÙâÍÒamc [£”·F̦ú&ášvÅß8–íÔ‰)a½}nzS[^–ü\í¡ÖCdkéáæä­åÖñ aî’±9‡º‰iÛ2ž½¿ [‚Õç³#ÖIobÓÞ-¬^fð ü­[¿!p¿7üÜNÎmçfÞºAï8ñúê^3ïšœ¢K+ð‰´°(е{ºq§LïUÖp o7}p7Ò¸—É(ŠïË|Ý •%\ƒ«¸4÷ÙºgÒµgÀí­æ†k·3sÚçš›q…þÙÖæø8ÜrÚá…tIhÉZÖ¨þ>¿FŒPdk‘îVJ™{ñέA^Š(˜¹»•NŠT˜/"3€™¹™2[&ŒFB©”(ûÎI ˆ64d[éÝ܆ϟ^Ê †ª­e֖ʤ RµªY´¬èJéžJÖÈÚˆ47£5³ÏÿålÙðtñCú~_ž»jÔp(jÕë±ZÍ”ž¶“¡4ÐÇèÚÊ :ÁRÄÉÔ×v`–IÂ6G±±L¹ËÜAf]gýÞlûh¾—:£Ó ôVƒ=FIjm´µ¥õÔ`ž–*¾{?;_#¿ÇáÅ¥¨'ÙÜá;8Gìv;u¨Cm²„ÐwÞïúD˜£Ek‰½í[kÃíøÂÖ ƒû²ŽúüòýÓ‡."Ky²,Ÿ_?}þôúa÷Ü>Çó·ÖxrW:šÑ äN¨°ùí·ß%tˆãÓ³ïáf¢µš­¢Švé&>RGÄ€–³-kb8B1Í H¨GH-_“FÉ»1/sº; H¨E­ŸYv’i0zcvÝ“Ój˨ÉJU#ú®dµ{.Ãë!ƒpDŒ,w饸[m Í@Y1ó"µ¨È­aèÞ»³}þt|=t1t<(¨ˆ×±ˆФ¦w'´QòD¹¡Jõy‚ëcú÷­k4Œ.cŠ C $ÑHõèrRGͦ3í]}›²a왈óg²$Ml) °‡9"%G8áT/n*cRÁ;ziî}ßïzZñ¾/O»t«M­¶ïþæ?‘Ê!i]«‘PÙ?yïè½¥™©6 ÌÖF#ñ¨õ?üÍêŸwOß~üæ/~IM›·©¼†§òÖ*Ï9K™×‹?îè'·÷0Zéý•Ы£¹ì®â±U½àúÜïŧàB¿^67.\ ‘KMuL¢ÜÛ’\“HçF]+ |žb˜˜^‰ÄÚmSØ(Ÿ›«®¬Ì‚) ©¯èÀ7 "ƈúÐùÕeÛˆBf]óCY¹Êüþ$^|›}çy¯TÙŒ$Ï|³üfCÏb´"if3%à¿]Û¡üM3ÄwŸ7ïð~nžðMIüëÝÉßóÈùÙ¸üç×ϯ?×ךöóÄòïô¥?èèûôÿÜ(þu’€”xª?K=æ² m—£æ8Ø?Ô¬ÌS @ÿžãŽŸ k_4¤Ï«†µEÖâïÿî¿p÷±ðÿåwŸ²FÔQ³ddžûÛvO}×ï¬óLÑ™}ß÷}àõpÌHºȈˆÈLINš›™Á¾ë”„’ìÔj†l-»¾{úÅ^I}WÔ*Õ:÷Ï/‡v¬,Ö^ŽRvO#?Ôbzs†×ƒ¹ŒnîñÏ¿=‡ã§×:ÝSÙв Hc¡†¡ÆËHZšy5³E“R¬’E9VôI*5>Udc¬Xà“ã®|ª>f;`v(ó¹äŽöv(ìáûK/æÍͽxD‹€ÌM2 ¡H MR‹z$Rú„ò¯Ö}ªÇ—¬£‹bœvÊù{4 Öí@'ãB¡%d¹ú´É Ç äˆî PëõzÀñu$çæ‰“³.s¬oLÆ6´1Í$ÑrLÆtA`h“Í/ uTêÞt{³‚h5ÔbÊT$ôEh1™fO&8 »CˆFÈ`GÙhê+h Š05é’Åiu+ £sdLÃcv [ÿäÝn×=,}—‘0ƒÿîÿùÿ0·ô§Þ­kDˆQ‡pïÍK¡e´¾ejZfìžöÏß~üö/5eŒÇ¾9ù“6ý3Äòºý¼SøùõóëvŒÉ‡m:–‘ñêãÎÑgaòš;û«M›Ô²]ët6¹Óªãά¾1ÚXÍJ0mBIJe*¤fɳ jçôe«D+ã,N•Å«†’¹Çt(XäâˆYË×%El•»^²f'œÞºú~é2yé,;Ù,4+“µKÕÁCâÖd¬Áám–èí:ýu¯Ú(ö|ÔaãªÎFÒM°Ð’¯ |¥DË/ßÔ6¼]õ¦Õ/—Ñ|ãoyïÙ>û—/¢Ès;nÐîL7Ë:³+òÏ"‘wy¯ÞºjëKxæ`­[¾îë"÷+'ŒOÓÂòZòññxçíÚøZ¬cuà o¥wïyîX§ßb¼A[¡‚t5ß~>x›Æ3# ­?ÿjJÒ¹:e‰ÚxøÀóÅ»zä"¿/˜WêJ‹[®UÏz@ÞS®/l=Þß \8RËK¶Ñ€³Ý À;sò¥H¾š«JUφ7êl&™w¬L;oÜí©îçÔèÌ›þf'¾,\Ðb¸ì вõé~N‚Wm·ÊÍß7AœY|ï[Úµš>Wé nZ³.«ê·Oðê¶éÚ4øšòôÖ)œÃfÜIëª7ÕÿUeղž[†ÓÒã›íûïÛZŒ5£DÂÈQýZ6¹¨<¼©Îe7/‚ˆ+¾såÝC %ÓÚòo¤©êòjÜ=¶TêjÏû“©7ž)®­ãÎë¬Þ™‘<ÍYZnU½&§ú‡<Z3;|zm‡¡kÔV#û®”Î ‹ î悼ï|×™[ÔFs#%µÚèJލœ,îî.)"22"ŒèKgh€èžÙBíï¤T1÷ÑZ¶(‡cMÅÓ¾˜U7# ¢¶ÈF«Ùê1iõõÐjõ]/Çî©÷Ç¿ü ÑÔŽíå9(¢½Ð]D}-Ã!‘aŒŒ–µ©VYÖTV™XžTŠdSióø2‡ùeNÏ ÐÁ òT¬mè`Nï\ܱìi]´ž|B·:XGsv;°¸wÅ‹Rï]΅†›Í ’úzü8¨}Žöy2ÆHÇJ¸®PF&2™Ùí²ªJÏã`R4Ä!^ݽô»¾'Ÿêwß|è»òùå%¢šYŠ»n'DkC¿Gÿ´—$´Ï/5³ýâ»_ÑŒŽÃñ_J·³â}ßWC5Ä®/1 ‡üÞ:>•Þê¾ïvÇö9ؘ°¥ ªh´áªÓE"F€:”0ŸÒ)+à Á}J*D‚^$DÄÀlV:Òâõ³˜à',Djš¨4Ö৪”iÁPm£ÓÃÙ.ÛN‹ôPážÄhGŒÀÈRÕ“ &ÆÂdV¬†Ô1c´rŠš #€h(s9§’J7:‰"&Ÿ§D1å Œh -a6MÁî¨t<¥R€[QÈSã†dšêýhD>Ò„Ä„lMp½À Ø6¿ú$åÿQÜK?åyJv "½Ó€©•t*ëtäs?œ¶¿„èR„DNgç€UìL½1mÌaeJŠ(G$x!ÝÍ;ëwÝ~樓 ^6Ô:ÕRO¿øè]߀Úêñ_~(ß<—_| ÁÇ>”4kˬµŽù·ÿù?ïž÷¿øË_kí³sZÇøVç/¯lg¯ØßÛ`ííÍ;úLò!+Û·Éâ—Üòœþã½k6rÓç,BO-òÙœ±‰«fºíuRwbßsÕļõøfÀnܳӎo…Ï\ÝNÞ3[¾¾AW+Ï]ÈûŸtž‹m¸þ9çô–Ô¦7¯Áù³õÐu]žË<µèƒ‘&æÍ²SdN”ßóïm Ÿ¸Ñ­¹öl¹Þ¬êJ!ãR˜ºøyœÿuoÿÆ­nÌóú/hÐÃ[mQ¯n¥À®OÿJ+»*ò^&yÉ ¡Í…íTÉåYÓy÷œÊÇΦót#ùHôNÀ êzI»ž\µ™Má²Møú‹tã~#å© ~s®³oZÿÜŽ7âeRëÕ›|Kº½ÿXT¥è­ä6‡âb˜h%_ë^Ä3ãÿ¼ ³š³BÔåÔ:&6g×ëŸþáÏqæá‡—¨-†6Âyu})]Çâ}ßŘuëÜK_ÜdŒîÊ<Ô¡GéœòR‡EñÒ•B²Ö:M)ÞZƒ$5S72aêëKû|¬ ™gF?Ôð,,ný±Ž5º®×Ãç—áõÀÌ?<÷åÃ.k³Œô /%€öé{üÔ>¿"£¶šmÈz¬­BIƒ˜Ã±†÷h혴(ž£Ž//&uAˆá˜Ù†O‡hÇTmѠȉ¨ fDC ¢É,•j ëeB`šg[£2ÈSþ6ºSycòì~BuÅPÊØëõ(ïšÜ­GcŒÉDw¸¥Ñ/[Ñí ÌИV¬'2©tÃnŒ Y´¨nh‰<™lpû‚H²ï•Þ&,’0¨ +²Ú„ MÈ€¤ÝË~×íz3»œ¼ãÇÿôGa}‡CùðlÅ“aô2·b$["RmµTËVÛ_ýÕ蟟öŸ>üêÛmeü¼5!_]®/ùùu¥>ݶ­ü#e·UÄŸ_ˆÎï½n—BñëÜ@þQŒþÓ™W„ÿ^ÏíœÐ 1‰³«óÝ›R/e«ƒF«(3« ]Êù/î¼Ó¿/9DMµ¥óºÊ o"—ßeZ@j\Å¿Úö"œyÿê‘Ë,‰¸ÙlÄe‰ðÔÿyšþæ)J½1ëðzªÜð%;uÅÏ VIÏî™÷•¹õÀ}TXú±ãú=rÖOa®ðÓêé_—Z´˜[ß™Rn·>|¡høàt4«¹xŸôÖgßn¨ä©ºœ·3Ç«‘.þñ­ôú:‘I–W  Îׄ£™ õÙsƒ{!\7i«S†_óäyC:·; g~ñ\u½â¹;L?òLt º1nÞ•Fžß2Þªºóëú²ëskÚœ $Ë‹'þÏO*÷oÌOšéŸT-æ—ªÑÓÎã®'ùW_5çå—&ôÀswñr=óÃ?“•¼¾…â cvç˜ù#FÖæP[¬æ€û¾Î®A›;ý¿ò+¼ã§¼ïz”Þ–,„<µ™'4ië3§iý~ûÛQ—ÿŸ^bh1´l‘™FZ×Ѭô¥ìz/NšÌॴMîÞ"4Õõw–R2ZæT½if½{*3j´PCqî1‰$3ˆÖ^B×í¨j&¶Pd}}µPšwîý‡ç§oºzlRwøþuj´Ìï_ ùô‹Ýþ—œ-˜Ý·—ãñ‡<4 mxU f­ ¬ŒÌu!1G9X°"/Å‚1¬"H“ûIM€;ˆ !ÛiM÷IÉõ‚6ÑÏ-¹G÷Í?Ò>À÷ ¡x)=èÍм6¹§QAï:¤Ô4U¢…j”‚ÎU­faúT;´á dñÉ@5I€c‡»»yñÌŒVÕ¡ëí›_=—=øïŸÍ̺}€ˆÆš¯ÿâí_¿ù«ÝÓ‡':V:z±a¨‡—C*ûÞ?R­Â8ÖçÃïÐ 8Ñ‘ˆ`« ‰°‚H!Oq#ß'ìÔØJap¦®Ã¨žÓ "r²±Çÿ˜îòp˜{fšwf#ŠH(  ™’Õcx2¬Ð 4S°mÈîÉ;G«8¾fÔ)Óf>YknêºðnjÛ@C—rƒFómšFìóh¿‘gEG™Á$ÌÊ®ëúXòð©î>š/ŸÚÐøTööð2 ‘ªðÒuÝE‹ŒŒQk=6µ ðë_ÿfÿñùÃ/¾ùÅ_þšWõѺ/[œË½7‹©ç €+jÛmÜ+üõû]µ¢Ü6j$Ð<²¿µ±_³_ç_+b¾Þ{èb¢{³ÿûnJ†oI‹èTÀ®‹n©/nou“,I…?èüuCÅ-¼â›pŸ“ ûEu0›§®¹÷†ñ4˜ç·‚²›:Ü º‰°6‘^ÂQÏ ³Y’óÜz‚ ˆÒ|T^ ÿ§™îÜpÒ0N²þÙ?mš.jß™H€%ZdáÖ=;‰\ˆu³ÖòÔËs08»t‚šžÎ‹gTðY'9ï5´Í.8Š-ó§žlž§j ñâR“>Ûp*¼P9g<ëAÑS‹lãN.ÎNj֪i˜\õùœ¯ã¹Çm™ÑJÆÙ¢ïœogì„-àÊj…Åâ´:³°¶ZÞu=e=:aér€ZõØë á.xÕ§tÁù,rŸ¼sö¼g‘}Íø¸ð¤4ß%Ì©úÐõœ>áZé‡ÜPìÎ-úšwqm’ZNOW9°-µcÇ‹E~]Z»ÆŸ}ϧ8ÿøËœ6KqIZS2xy*tÅD×ö’¡9çföẹ̀˙söÀ,”l^mC4³š|Ldáµ¥8¯zI¹ëßW1–g´²,¹–]1ç˜qýw:ï’t¾ü‹¾Ðó¥å¼²I¶Û¦-·Õ—¥gõ›K¦ÏvR“7÷˳)ˆº·1ٚ߸‘/™%Q–=‘óÝ¥…ÌÇ2–ÏØ6àBs˜È|Rš-ËÞe^ñâÎÃj^ö>ËÕ_o­oÁÝNyò[zޓݸxÚ®µ8®úS_Þ¼ÕqãÞß7.1—éçìßBuÏ`2$É ¬bX‚O'6?g½ñQ×âû* °±['V,ÂÍcÖm÷€ ²ÍûrsªãŒÚÍ–äå¥×eæ?Ø=KF¬õÍ[ObÃûáêÄçßqMÝXõoŽ.ÑzïÑÉù£›4çÃu3áts‘:1,oÅõ'_XIÜÚ Ý>³5ÕGšus_t™®@: -G)og‡Ö¡G`©iò,¢Öˆ„iÁøÇø3y%¾ÿ<ëXøO²ë:ï»Òl¬I¦•R`&ÈÍÌ­E[ëá‘9Òÿ#º¬ÑÉ,È”»™`…ž*HµŠã`}Ç®Pê²¶@×ï̘Gµãk# £¦užèh°ú‚áåµ(R¯C×;÷=ÛÐUÛçÏÃp¨e_âøÚއŽí娣‹Ø|'Þeã‘ ÙÉWnôP­èžÐu0WK0Mª¦ ¬°€È«“7”púžf]äÎÌvûoÓ÷ÉÒv½u;À3R‘4#f‚ÚˆA3ô-ÍaèÜ1ÔEó]«¯Ÿ?µáß”¿cWEIh „ r7¼Í3¡dÙ@éòøùµ½v{c·³ý¡8À_w{Á~iŠÁJ¯ÌÌ£ u8û~/e¦òŽ¡fN¡eÖÒû”WŽz=êuÿô¬@†¾ÿás±Îñt>~x kæ ¡G©­õéûÝþwÿýÀD!j /|†Ö&¿ßÀ„åù˜5cQühk †ËÀÇFU 1¹ëDЦM¹„Œ‰´3–Þ#4y;ŸÌQZ\üÒǃûaØ Àmì¯8 ÐAµÀÎUGð°0„HdƒÙ0šŒŽÍJŽã—êtŽ$ºn²ÿ œ¤pa$ï.¾I¨Â $Ô0"$%…FŽÇhºÐŸ xz2 *`„ÛTêX\]Ž:‰Ã & ÀFõ¿Ð]cÕ¿¢†wð~ÜÁ9,ND Ñ‡1³%HOª1A€]A)n ”*@”n'+MÎ è ö§´D4dÀ8rÌÒ†Äyë7¶ÂèÝ­ß{éK·ß™Yy*¥·î¯þoQÛñå˜üÄu%£©hVz€F‹hQk«¡ñþú׿îö»Ý‡§ïþâW¬ös)ªQ×M¦œ‡ZâÖ®å¼Ölòzû ÝÎÃß’)g"o™Îq„S‰±Ö;i»ºæRÏ¥-³¹ÕÆžçm¢–É”sdMn¨?[±°µù<¯¹çóž<În¤+çI®Š•&W0,ïÛR»MÍS5Òyk9IŒcž_4-O„k[ ub¦ Îeñ•¤pu§þÔ¡óÊ™EÅŒ_®Ktwé½^–eél@W©šÅ†eáxK„{gfeœû†Sáƒõ7_Öݰ閨³Äw kt£˜°Ìf›‰¿wG¾"“O’8OzÂl NåWÓGêb'‚¹ý´® ×b ÏÇ(oÛˆmèBÅÁZÒ¨¸–HOºÿj‚Ùü–Õñþ ¸¹%Ù†²¶MåÐVZmy¸ü>;þ½¼x{†üå{ºÚ?ßb¾ðµ€¦»åx×%âO³àÝ¡»&âbµz£@kßW9‘ßKÀ”=¼÷ù°µVN⮽ü‚ëõûÖ›©¨?À1^6¿ß>`þÄ<šŸ¢À´}êÑîüUÖD«pzÔm\³Ÿ¶ànþæOäõï¢þk æKƒµ¦(¢¶¼PƉæþþ·#£”àó¿ýpüô¤•®€æÅYÜû®tNwI-ulÕÝGõS™F7Å=FáX¦±fVédk-SHåPûç¾3ä&бëŸÍLB?`Ö†"3²e V­>í;Ð/jÇ׃ÕÖ”‡c#Ó½x¡a‡Âã04E´j¯CÔ9´ÏŸ[½´DhÄ—‘å„÷h¯Ò0唌&9ú¥üÿÙûÛ&G’$IdQ5À=^*«ª»g‰nˆŽèþÿ¿ÙO³w;³Û¯Õ=ÛÓ]™Šð}0`Ü="#³*«44á7SSSeyèwd€Óßa6CÛs r(ÑÈÊ=à´ÁüCú£ÑE£¢:'¬ ÌÍmªcËòªBЙF)•™bˆiTQ§­ù©Ø÷zü¾·žÇ¢T*þ¸Û­±"¦òù”²+:2§r9¥Z7¦†‡-ðxé9¢g  X‘_”.¾ó=·ªûϽã]4â·u|Þs¥)ë'íÐ¥à+¢ ~åÐëZ´\ulÙ¼íŒveVð³DË¿,èü•u*iã—N¤;ÇïŸû¼MpK뿚ù'wÝJr?þ6.•Ö=LÛ^ÓçŸ) wN‰`®Úd¶D¤kUÝSæ~¦ëiY¶xªUÔlsJý-KqëD«)¢ž ¶¦~A\¤{ÝñO»S›¨KéÐìØuÊžÒw4óSÆa¾­$4¾ôNj™çØ~Æ7WzYêyUx£×÷õ õϧúC!â/åÛÏ[Ð —ú7< ¾uf|ñ¾ò¥úüצœ~t²B§y­„5îƒWwµ.ãøJÿü½/³"žÙëzÛ„åŸÇ {ë [ý•¿øN×ÿDÓãë¼,x7Ö×ü—¯þË:4ŠqÕËÂÿF4ÿ –eßÔvôÍFy^+î'3¶¤ö¯Í•óRÁòÚ1B,§DØÐ/ðŠ $ N6½'ºzès",ˆ¤‚¬^«›í¥Òõ`u8ÝÈ*¯•îHDkÙ‚‘"iì!CH“%@(¤à¢¬‡GoãH4ó‘|*þ”Ñ­ú1‘ DCtDBMu PD*4±ïI+^Ácª#"£Áz6¶CÛí¼ìÝ?ž$•0Çöœ:ºUX ÕåJÑ­g¯ƒ;kžòûc;BµúCPÏŸãa7Ð,‘­™êµîŽÇhÙ‹ãùøÙiècÿ_ã{ƒ u–qyʬdÎg÷©zÝË…t¯„?ø3 ‰8u¾÷KÐ ú©á>gÛ)D‡Õ9»£@Lä›×æIýŸþ‰¦Òx‡¦á%˜ˆ~u A ME÷BOPÈ#Ûºæîu›j~({rÒîƒR儘Œ§Æ`Mÿ p?ŽpÀ)Œ~r¤˜²Zyêå„ RsÛA,ešL‹§Vœ‘&ìD5Ô‰#”(6{ Åg CÒ5!z"!B dð¢Ì0²uj¦™ìoI¹Ó åÉæ¥ÃØ@zWZsBYÕ3‰‡G«Âñ)@ ;«µ ©ñ0eéf\ÒŒEŠ9âr¶‰–£:X€‰”{ñúPë~+uØïÊ®cË0ß½ÛuøtþðZöß§DËž}l9F¶®Ôo¿ûÝîñaÿþñÃßüÖ‹oí\;k{ ÝØíù†Ã²‘/ùÓ+)ë€õ><çËB9ÝÉ|Óxª>•„¯nb+ZÔ}‚wØ›”¯«Îe×^6>~§þç°XüAçõÂ=|pIº4ß›¥¯×Zqý¸OiÚfçÎZÿ€f´ÄI0_ö˜žû—¯=«þl]2‹ç¡­:FÝ.«ãô !Š ŽË²¢SÊòÀÄÓ ‰³L/›Ï_X" ¦&"@Ιz”3å`º|^è®K$×5…F¨³ð‰½qL-â¥>ÿÄã¹nm™{ŽVy­é6‹‰x¦’œQ <“d8Èx#ƬnaÎ œÐµs å”ÚXüVáÆ a±nœ{±NCv¢C\q*´ñ¾–]ÖþÔ]©zãå‘.$Ó+®<Éû¬ŒµºÄKâ Wyå¼\õI[xÝäöy»oSW—ð,š¹$ÝvÄmo5÷vûë>:n w\ x:C;®ô±ÅÛ{­\­5käÈòü©Íu]ÛŠâV:ð0Í¥éÆmï”ֵ䧷EXrP6À.\£HÖC}z 抺SÛñjº­ÛÅt;ûo·ÌµŸøå•;i5ÀÊ5j¹¸/tf^Œ—òaÝLÞ§l\u&œ‹ñµ-ú¾¬þ®^¨k cc,.˜³Uïß|1—·í‚:­üÒ¹Zj·~bëe¹Y[.Kîk, ôÊ÷ê¡EÀrýK‰çLËš{E¯`pWãpAKÍTÄ{Á‡®oø”ØFñë«ÔÓF¹ÀúédÃÄëôâj‹[È”÷âÛMŽû™ë§Û|£Ö]·}ÞD¸u>ØÈ?nå\߯u ÆmkéêÏͪßVšÔ[[L.xµË½< ¼øBò¦Ýø¼¯àN}Þ”­9-àwrs{'— Ý© |#fÓŠþ³¾òEð¼ªdYžQyÕ˼Ž0ÃÄi&¯[ûyN†ÞYªof°îÐóNsfÝÄÍ 3€Î&náƒ/‰_›E›E@×ÀFuáÆ£¹;ÝÖ›úæu\E×…T\_Ð ni¸%­Ý꫹®eϯ–q:i\-Àgû³›®¬p´½¤?üó¿L÷rüôÜ[Ö î‹& 7ƒÁH3Â蜤}ôÖiÅep('m°Ÿl£SPfPE *­8Lû[hüã纯Ý­+-Û§'¿Û£z>ûØñ88 Ÿþ]’%ZëH7}ðži4C3ö±÷ãçCÿt,ìBS4óĘ¥ î9JVO Í`ñìȧ ë:«ÀAæºrN•Ë@";h 4d"P¥W&yoÕñ@`yÔî%a"IeëiÙ‘É4j¡(z?6/‘=ÌK;ôìÝHJÜU{´ñ9l´b-"Ñ㥹©ã˜L'£ êf”“£]¶cËL$ÖŸ2ÝŽY«—Z¬ZdZF}p77·ñØžŸº ¶ƒUÐq|>ó‘ß=¾kqè­qÇQhdu«c´Äʱßþc±:ðáÐÆž}ð²/=ÅÄY"ˆþø^ÑžqªÖ d (à9¢ÐðœÈ9'AŸð+° Ùg·Åh`ÛĶíÉqdÇØa޲‡Ìf¶þ|¢Ndƒµ¢îæȉh³DÄìL`‚!¤éâ¢+€84…èJh‰ 80N`"Ñ‹4å6pÐO$Q}nJ†ú8¿lý´†%ÚPÅ#2f0Î9†H _¤%„¡rfîŽâ‚£ ªË ,(€9|Ð¥sO.— RGÂ)SSbm¦cMK‰$*gf·^ÜÀh™”fÆ.AYvžÑÓü¬Š¨CBó†`§–”Š<̽8ï> }Æñ™Ù-‡]Ý= õagµ$ÜÌ"¡Càýc9Ë®¶í?>æåáÆœºg Ⱥ„®ìÑÆQ™?~7¼{xøøáãß~ÇuàiA’YïÐ×§x.•½­dO—é&‚½…›/K î`Z7O2Ú,‡¹ú­Å´3•} áæUÓ!nÏþ[êïԼƥÖ:_­&ž×+õ+>ûÕ7\ ä—²ßEÁí‚vÍË¡XºjK?Ya^ò¦Ð˜XVù®é0ËóÌÒïë,æ^ ²¾4$¾­>y%ÌzÛYè— ¿u™Ó‚¼´}•ç½å]]åi–'£ Ó¯Àsñ¸r&Ôútý¬éнø\Î%«CÆÝòvtE‹\^úë8MÜÇ‹-éë ÌÔFµ’¦„øõ!xUOË;©Ìõ‚‚Ê©•rjRA›Ê·.…ÿÂb”¹²ZrüW¢ž`Þp€YÍ9*Ðö1E'Íï4>ëž‚S‡ÊJ„ndŸë}àí5Þ7bÕµböJY¢ÞRt}gñUáè›}~¹_¡¹½¶c¼µ»ì†ºþò5þ_“œæ·¸”‹ìú¶Æýx æ¯î“Ó·œäü¹ß~;²Wú«ëX¶êýyg]þñ+…~ì}Kwæó›zg¾bŠò^úéE|០àþõó«›9îÖh½ÖÀ/ò‹ù9?÷]w¿EÀ¯Ý¼;•_ìøÂ]Æ®¯Î&.ɹWóðgêÀfèÿ3D-ÚΑ¿}]ú‰Bƒ;[¶~ªqû)ÃF]!jxÄkÌäwNJèô1”+ +pgtˆ4iÐ^(Æ ·Rê°gy÷ViÕ¬JÌLÂ`„Ë«MT”:X?6fŠ”²^½ñØ«rƒ™ÏÅÒÉLcX&r¬;+¨Ç8Dëí¥}ø°ÐZ«…ŒLƒQiœ BÓêÆ¨­2Sm­÷ÞÞ½¬µ ™‘½Ö!°š‚Æ8°b_†Èñóó8¶c²¹•]}蟟¾xBò8¶>~zؽ\²Öâñƒ?ÖA6öìOýiì]'—.ƧÙé7ÛD<šËÿ'öŽ—¹âf÷úqß'–ÍDË ½Ï²þd¼ûø_~[K5³³$~Tœ"7mÊù|ËÏ7o¯ä—„å?uÀvÙÀ÷;¾úÀ£…i.êîtO<9ëÏXVx¼üLßʾXéÁx õê(ü §ö_"t~eÿØ_·ÌC\%l^ì¸>ùÞŸ¾&ÒÖU—À×¹,ÿ¤!ö²fêTº}÷ Ë=ºþ‹ËÆ”1sÀÔ†–—¼ßU¹ÖÙRh¥ð¦°ïòŠÞ,¯¿^–“+NŽV«….'gûC.¿òÜзš¥¼#ÐßY±^žMÚ„}èO4_ø³Êüóâ+|m1íÛ¿ÿkoøGáÿ”C¼ôƹ®“•ØÇ7¤C^þ¹_½ƒ¿ÌËþvïük›î_Úé4¯j^Œ`ùê뤳Ÿô¨òg*å­‡ùÇ8úüyÞÚ7Í¿:¿1hôv~.jó¿F+ó‚ò­#•Ÿ‘öcN—çÓÏ0W¯j~îáùê8Þ,/ANw˜ÿô³ú?~>ô±÷±e„$7v³«¦ÅÜ­˜—Ê è©L€f€Ø22Ò J§[fF¤™Ek…ܹèpÂ6ÑVZÒTñÔÛèÇÏG8£zkÝwÕwåðý!žžÇ±#3Æècö|V¤õô]µÚðüÇÜ•dicfƒê#ô¥Ê¬ÑZ[ô±µn=é®i•w4zÑ{ÀçZFœìdá(‘';P”07Ðzòø”sq¨9bò[&|0ÌJ–êõPÉâ.=\SC‘-2›;dµTft²kF YŸ€“0’¦*…÷Ì~8>¡´µ”lxòŠRùø±ìÚS÷ÿDT< ûã¦Ñh^½JÙÆN’¦8¢}Î<´þ¤÷¿ù°«ûbåðôùøüÜ£GDöÜñøî¡)Eì÷CÝûóqŒ,Vz˵ֻb> Cñg¯”~{Ë1ŽÑð¸È:ú÷O”УGÐuÒat"í“dZ@]öÉ7¬ çr{Llw pê¬Â b¼`ñÏvž)L·3—NN †lÖý'šú)%P &Ð`åT¦`B|b`!Ïý Ee¢ Yr ÑÉŒð)QFÈæRý$C:æ¡Ñ¯(Žj艞ŒNÒ‘ÐØ1§¨ˆ,fÛÞ ´˜ûð“auêÒ×<',rœÔ‡ å”e1ôÉN™ ÁhJ¨»G„Oo4Ì|8á„}Â49œæÍÃF …@¸²‰F !€ÁàÅœŒÕ¬”\̽!GG ÍÍzkí(/gÔÕ|†3ô4TG íyÆ®¡šþøÝÇ÷ûvl¤ì£`~ø<&ãñ»wÕÍH뮊Tñúþ‘f™-²õ>66¼÷ááûÇ~ó_~gîw«?—-wú8V?c xßOO[„O~ñÕýÊŒ¾Êy’s{Àõ÷P/ò*¶lÞ˜áÅš oPèÅÇ¿Dèü t³ßãW½ñ¹ÝöŒ¾r¾.èŸod«ô\(¹âþ\7ºëåzʳÛÄT«‚ûs'ÖÚZ둹 ^µ¯¼àij[:4ŸÎƼ8‹_Ùm+I%g6¾ ¤2Säi\Às塞ú76¼´àj™ò;{vP«©´Z-´`óœÝ/^è3¡då9À…ðOhÆRbîxâ¥qìšz2Ýò©ñC×*çªkøÖx~ñ·'`¶ðÖg>Ðr=¹–ËáÕMÞ|MTiΛikÿÑ‹}K<Í©j‘ŠYµ=lžÉ¯É(gÓÍH]¾êºtõÆ+~ƒd±Ê-]ž ¹~VKâÂ¥Øø”„<ÏŽÍAá…-uãN±±`-—‚íöõ•x¸ÄÙ˜b¸¡!\R¢ºæ®hŤ8¿tŬҹ“ï|C—ž®Ëv}²ÃÃVm±ý—Ü€‹,*N ÓË{JdžÒögX_ç×_gô¸\®6{)µpiÀ ¿æ…ø@×oÃÕ–ù–üÆíËÌ[Âq5)¶¾C‹DW\¤)ͪ«QÐmôÉ«?û¾,sÑ“y‰I6ÞS½\€Çï,?ËiΗ@Ýî¼2‚ºl€Úœ1«m`c§×VS˜ï1y•?Ovà6ã¨í”"ϯä‚ë´ìV\²(x2Sw*õïÎæ[:ÇFæªÓA«p£ŸònúáºiqÁAÓäÌ« xx[µ›_½ŠúB ñ嘼Eˆßü™MFÛÝ[[^~•t’Ôy­|ÃÙiQywû5kÒ¥6ïhMq¹Ûð¶ä?mòf é¢=™×qµ¨ÛÆY_5ærs^"C7îèŠq;ýÏõdØ>ÇÞ¾Yë7ý*°]üCÞ±½YUazÎÏ„k¢Í«¹šs#ü)"Ð%>×"Μì) ëvük'ç· €îì—7d¼­4)µx¤ZÄr'漓º—¾œ”f²Ú?þÃÿ5ýÅáÓSŒ=Zd„‘n‡jsá4è>•×NëKD̤re13z"ì("9W«5¦A¡÷R”#"]4$ ÆPïŸ>?µ¶ÃOG= Ÿÿã)Uìfc*Ÿý¹EŸG¼ìkï‘Çï‹gšEo’úØCé…`öHB¥(z´Ñš©GkÈ”:L¦.Ý­wE¦ù·B˜ì$é:rªûvD|ò&Ê®<ìÛ±±Œh¢gÏXØß“n,.îY>€{ÂAŠD’ ’¼ØÑdoaîæ®ÈlFͧ«Í–@Z1gÂÙ#[æÓîÑ5r ¦Ò¨õñá·O?ø_Oïß½§í„ ´”ÀRJžá–&XÑ¿OÇçñó|ÞïŠJëm@©u/EJ‡§p¯ôà0þlÃΤ6v«eÈh½«X:>õhíûaGŽ$èüô)¬{ÁñØ#æ)leæõŸa(Sy7d‡báj‹Yäêô&¢= 9½mæð˜<ÙÞNß–3˜ƒ@Žè ¥Â 2DGL¿1άâÁêä 3PÈDq@ˆHôìdT0YG˜¨„A 袩6e®#À‚B œÀôàdur!íPmVØÝ®ADBR™è‰J@Åì-ìŽ1`ÁBŸí‘BýÌ ˜üä5:ͱÐÇye±F8°DçûïjÙ—ñ8º¥¥Æ“©€À‹@¥N¦Z&„ˆ x…RÄlW ЦÝÀ:МF?æ¨ÞyŒÞŸ¢ìŠU Û^Ù[ïÇq¡²g¦” £Ú9N‹Ölö`‰ý­ÁùP)«»‡‡ß|Þ=ø0<þö„ã§§ñØÊãC)þðñ=}š9¦âìˆP@ʈÖû±ås>¼|xÿøøñýãï?¦d¸0µ6i9{ŠjC]ì˜ v-ö&-Uè[yu;aµÞ?î½¶ïncî¥Ë¸ª ]ÕkSÕYh|º‘ 6¶Tñ–Žú†Š ×˜á ˆçBÑ9Åf¸tg.Ñ»Ëg¤ó‹³`L &ßmÄuÒ¸Ï`ç óÌM™gb‘gXT.Æ‹>‰ëö-×ñZn_e´¤çÿECç±V^ç8›ç±_X-½ªÎ/ î¥ëtÃâ º°¦î< m`œoÒH¼¹ªU„½*ÿ×Ïkãß¾œöÂRìº,Þ¼å_tQ¯vpAÒñfxµ”è+†áµ7†o˜wK±ÿk ‡6€õ__­ñ¶¿ùª’­¤Õ†drç‹ù¥7qŽÎ¶–ˆ— ^_ëš]%fø†«Ø2÷WõM ±Øš¹9JK’÷×ta³vaNsK/è̯Ém_z~¸}n~Ë7Ä€|։ߨºkmÿ¤›â›”Ý{Du¾¾ÞO¬J¯Ç*_³¸m³ò_ê ߺ$ݧøöõæ‹’%7R_7+¶–€»ß·<ÄÞÝcJ-Q6o†¾>3/Ç]æÎ[ÈNøâ¡Û2Øô|¼_-±ªƒYõ¯“‹gûÿ÷ÿ˜þãøé¹­·ž=fû^3/îCõZЏŠ3€XJ‘t0 Ée¶É•px>8QwC)Ö$™E$²Gz\Ñ™£Æñ è»ãç±{­¥¥P¼îjüpFzÒ}¦G1†fƒ:˜šgϹFõì=àØ >ŒùL¡ìd¨;¡g&(¿`˜™?8ñ—f4MŽÞ „i&×`râ0[ûÁ Ì€Éé—sn€€696註‹æzöÒ³ â2xè 9y<¦Ïo™½iló+•50 `š$¨IGH° a\!SV˜!i4)GÁœŒJ¡ì ­ ªÆ5•ÿsš,è‚:=Ñ Hõ<B$B@ ‰Èœ™bÂITÉ€“ëïü¥Â s’HƒCQŒÎ0 VÛ…º×qOÐ@Ctô†ÞQ P Ð@‡™ÎÀ…“O°ÌY¾{üîãÇ¿ýÝ¥\s!ÕNö·^®º)¼³©_•éµJáÑœûUÛåÛýæÈã"^ñj+ÿ§D]o›GŽjã*Ê?ßp=ØKZ‡t+p¬Ôvžê.uªßÕ›ù¿•Ï\a`x§O›š¿ R¼­û †Îc}W…>ç:û¯;áÝfJNÂ[HÔ91p­’­è ¯ŸD^íÿôŸÍ‡rú3 ”Á4£ön>o]­W„ ‚H(—6‹Ü3ñJ×^ÍÒ»êù¹¨ôRêx6™Ö+íNÛkúéá/*¬xr¸AÚò#çÂýwó•ÿ%²~ýüIß⯞7úuð~aŸ×mHþ¢˜-ú+{…¿éDáÀé¯bCáM³ê¯Ÿ_?¿~¾dúZà -{$~ýÜž°®Ì$ÖGwÐ?œˆÿÏßn‡1Z?«8u¨VŠ×²ÛïB)3sw3[ @™ ¥M¦Ã†T¶žÅèF¸MaJE‹¸2¢+""ù¯µX( €ñð¬Ïÿñù˜i©Ö‚@óùCiÏÇ<öŒì­ÁÝjaÆ1?ýGþpŒ®ö<Ê&/T1T+¼šP<>æ±3º{ôÌȬ.våTr^`TvNv$„+c*žåàL Q Ê€2À|þ«:ޤ1Ôžž£©É‡Ç]IÅqª‡z–GÚçè!Ûn¨V ÈTX Ò¤ѬH&Ò­d&232LJ褒I™"R^`†q<‚h;(h­õ]ý0ÔwƒûÓó³ÆN·ÚÔºÒ‹ ÅÑè…±k}<¦’='óƒh@b²uÍšòX´6¦Ò ÚØ”àVkiã!Çê5»µÔJõãxÇ0³PB0ƒ³ôÞÆjûa8ÇãØ'Yyª¿ô:»×z‰8À ±¨ô—}ö’m g‹° ÷bN˜%þéˆ<•®O•ï°Sž€35hRòôŠdœê{ }œ¥“ÔD_Bë@` {¢CÙat iÊ LzÙ¬G¦æV†ž¨¹º ›Kò'¥B’ Ã#|€H¡Ã@ï°ªZÈœEª–ˆ@"™ÔÔú”àäP=TdÐA¥.í•Ó¿ ‚@%cÂyì@5줢 X JQÀT‹†:XÀ‘ÖÍ@è(‚•ÙPÁ9¹2 hê "ŠÉn0¢¡âSµ19™32Ä@-He3s<ƳdæP&#jA;"…2Ìn³UƒÃ"\P€œ’1äà„Qbêðáu÷øðCûôýÿóC­öá÷wäãoÞ¡º dHIC±ºß¥™‚²G´ˆÏ}÷ðððáý»ï~ó›¿ý¹Ñ®uð©kó×­ê×ã3þØÒ_~ÿ‹‡ÎãB¿øÆÇâOâÉI^èןÌvu›¥àx6µ,ÿ_6«p“Ôs±<^/rÜjÃç"h×¹½cÑY¢ÙµçÔBt^Dyá-˜*ó kÚeeî)á)(H*.h;^j‘¥“'ðLw4‚ye»9Å«`Ó¢~A,Í·¢)”X&zíÜ }jø’–`…-àÁiÌÎЯóíàÄ}™Gh"ÿLm5çn¢3™LkòÀÜÛtÊh!Òk˺Èô&£pËæXyÔÝÞ¯þåkD¬ÈÔ±Ljœ0z¹Þõ6Éw=k_©¢\Ú,èꢷôŸe6ñErA—Ü^¶îÙ‚´|V×i®ë”â¹ mCÕÆxÍÓ Wiž{V-.«ù2'ßX{~SÔxƒ×]5Þ̉õ”[ îù6‘& ŽÆ²ËkµÃ­-´7P2ÓµˆM[Gñ÷k±\_z¸®ÝéØ~©œ;î¹ Ûsy_¥U‘Âí³¼…èØ&­gSö×i >—yœ÷ë¾G,›·®‰E¿&.–%MMhçŠ7|³«2…ÕÔ8÷cžVgÝÜÿ uÕ¹`-7©›÷[×ïÝf!ïuÇà•ÔÔ¼¨ ¸`š.…ËþÍWÉ%†M/Ù*•s^¬òKcãM¢sÒš—’Öí¾®÷ÄS]ï)â9ÿ­êeu5_o ó—ÿÿ2*½ÚŒ/oÛb‚IË@ñM5Ý/€S¾îð°‘á?1_³+ù2EõÇä3tÓ˹×ó”x©i›•y÷_ÜÄÎï'·–³­ÐuÕŽWâ’×ý’ó2æ’*ã†c_lÒâíJôÖ37'Ø9àËázsàB|¾9NÞL³—ÎÅËÒ­° yòr$Zuèî]œ™q7½´§肘›zkWí¸¼Ä ¯U]ÝæºÄí²L^S¾–ûÞUĵd:è „ºÞÛ=Zþú‡üÇã§çè‘ÑzöD7šÕ]-ÃgŠe7(3iSÍs7æü­™ó<×” @k}‘N$‘¡¸1éÊ‘H3TƒõnÅA;>þ×çjBÞ=FT÷ñó§>¶xsÌöX~øÏ¶«Žcç‡ý‡ÿí÷ŸÿûÿÞ‚ÖÆ~)R*µÔGÆ1ã@Ÿ2¨N†!€t¦ É ’0Ì< ¸cºË²g¨ê\SL @ "ÂÀA‡›q·£íduø0€9Ú0 Lª¦lg¹3„qõãœÀz™ÃåIÊgÅ…ocs·ÿt7ø„Ü9ñÍà°™)D›3щ²ƒr^z»èÁ™'“†Ô§,Ò\6RfÈœ(üì)ìr׫Çs¨2ú OtBb4±ÐwòjAL…=aÆýÎQðüÔÝ bìYOE€ ¸K'-P³a2cÂé\Ø€ÆÓy–DÎÇhð“¿bu¤$À î¥Â²ó]qÐP˜ÒÐ{«ëPÈè! =‘B1dGëxØÃvÀ4&ÖÙyzè̹‚›¤]H˜IMJúཥAfÁœHdŠ–§˜^¡Й¡l ávê! ô‘3mËA /CÙ½|üðãócöã±üî£Uï‡vøtH7˜É +)¶ãX÷»œ`pÁè½ýpÜ=<ìÞí><~÷_~7½ÝqÚìs¡\•9/¡¼¬ã"n8Àk)†÷§¹ÚüÜi@,“ËƒÚ ´Aݺãì"&Þó<¸Ù¨ÖÑ ¯­º=séú¾TÍÎEö ɺìÚŒë íêî΂ìêèúuÁùâPÇ›³âÕ8jͺ¾…›.¤¼uÔ+“@È»«ÇÅ+B<îªW3a±¿ èüZñº ï+õÛí8g¡þ†ª¹Bâ|l¾Vc–¤ë"a47äÈm…s™ûÄÊ5”W1îIlÆ à¬SBy5y‰Û9~R{nÛr/p%`k‘9ç¸`hŸß¨²ÅX‘®I³@œÒÛ3Kó›”瓃qîT㹺`¥ý‰Wjù6zÁ¾_ð¬WG´›x,УWggj5Mx2 º=¿òœãX YÔå q¿™D/õ†ä˜¾2÷æCöæÝvô¿%«Üãu/DZ}õ¼Ö ø¢_ _Â#­Õß{ ¥^d‘l^'±j!¹Ñ§×Seã²ÎÄz]»p+ݹ9ÜHi|Ñ£çÝ+ÄFd´Z1Wë+2ÑëpëÕ¹ÆÍì†n[rôrµÀv2ìU•äe`7’¶¯=~ñûʳÂÅ{|ÇmüåfØU\³PË_ž—ó{Ú|w¸Ì@q3éµýÂwúM߸.ê&xZ^+ïL6Ý»YÞ%×÷«í…ñúÆyõêñ*ïtNÙ_$þ cèÞmExÂBŒž+×¶…Ìwæ“Þݶyî/DÀËlö©ÃK$úשó·÷J~ÉŒþSîêK닾èÝ=S õ¦ñ&Ìí[NC÷°Ž«@þ+?_šuY,šß¸žL?ñ“^ ØÎ§Í/žcúÚ™yÏ.ƒ‹•‹3Ù×> ›™}åÜÆž·µ"w‚Á¨˜\m“§Ø!³õFÐͦòÿï¿ýgÖÿ|h4š{ê”ð:ÈH0¡±õ2UÜÎyMSFN‰PöÖI8ÕºLŒjχâYwûóU%ÉÈ~8ÀÜw¥ãû]ôxþÔʱfÝÃz×!Øf ÜÂK}(‡±3òûÿïÿî„+£gŒ­8ʾ˜–}ìÑ[;Œ=|=2zÖLå Ò)‘¦R ‡W€¢Í ž*©§R®ÉÈ7Ê0©ö@ƒWÈ@:m°a2ÈvàCN‡­tS!«@·]yØ%2{r†ø$Ùçâ. ¥™Q„™#*uP;ŒÖà %¼—‡Œñðéß?ûP‡:TùŽìŠaW ‡*†’B[´Z«ÕBƒ™h=ª™4¢ {WŒÈT‡9UÁ;JEOdvHs˜Ùð°#Ñ{ËÈa·;ö$1xu7±‡¢uP¼ã863Û\M„ŠÒûA‚,8Ÿð+gø '™8Ð 1ì‘6Îz}tÈPê\L•#ÌaŽ< %"æ^ û3q÷í| ™œo'·€< ¢V˜¡Â+ÜqlP‡Û¼ ™Ïõ›”3gæÊ˜ùÜÃ#\È#Ê)©Á)H‡;[jØ‚ xuSL.d`ß? »Ç½„ãØzh±O£¼îòx 3ì ڈɕA$ Ѧ,IS$á@ž°?mE g»`L``à—Cj" 91TG­ò ù4?Nš}÷P졾û¸3X;ÐÊ>ªyèÇc÷¢²‡€6b¨ö }îÃè mòUŒ° ˜PØÔ„‘ÓûÈjˆì³f35÷ºA ž’ÿš¾M³É|€ìsh;£u½!"h€‘„Ój}ØïûÁ¼ÈÐÆVÞ»¿ÿîýøÜ‡Cßïäìc¦d;0wIÑ#Z¯¶«ûZwõáýãÇ¿ùîžô¶Ìÿÿúù)?äÛŠt¿é¯üK€ÎËìâŸ|f¥}ãÃöÉÄf† þˆ1¿É k¿¢û’²ºç–±®yY—«& mÔv/ë:¯Šƒ3ÓHe^õ|`ÝEM1ehsÇ;I–Ÿ¸ªS?ÿò93i§[_XÔúØ¥fâºX?É5¸åžÊ£­f«·Ÿ;¦xÉžêØÎýªäå qî{ñ ^¹¼¹` /Té¾öz Ýž|ixn^YnÔ~/£uÊ—^åÂÀ^xûè~Ùømÿƒùªùþ,W½}Ÿxm•ÛX¬îܪÖ$-‡òâÂô"hoB]­m‹ý÷ôŸkÜ®–à ðÊDo~×õÓ9ß'7Šúµ±~í¦Ã×—¬ ¹ñvèKV—›+?-§Ë9©…w:q9¥¯£ï·½WÍ0óô¿©ÖÑí:²•ŒuÕà5ß‹jym•òŸþWÁ÷‡–ËUF+DÛ‚$&Ü à·Õ_mKP\Cú¦=|Ñhû’•éÝuü—‡Ûb]-Æðâܽ긼TúÔåeï[¬É%eðúºÈ•üfKú‹wñ Í ´EæùÑzçuñ6ùõ{÷†÷ºÝ—«–äór{ƒ9ZD®ËÿùÚ"¿® âF3ÐÕ±¸ñ7–©éϨcdn]ÖkïÔïs¿küò3·kòmñjLÂfò[ð†/Ù¿¸¯­Pf\¬ÁâÊQ —ækà§\6v 1)$"rr™§[û4öãØžÿúoÿ !s¢3aﻇêPé…R¬˜ÓnCÑ{˜‘)’¬`Ò`3°HÌ0À™a0f´>G¨¾K“ØZ“̇â½÷8vQãSÙjÝÈã¡ïß?<||ŒãѪÿø?rÌɉԫùÎY0ÙoÚƒ)¢Ê>6 åa–F©K޲#Òà J @"p‡,€Ùà”V}¨õãÎzûØ ”Zq–:üp8Œc²¢î0•Z—ÿæ¶{¬ÇçFËda´Ì<™™ÀÓçñ݇})»OŸ? Y÷UiÑLÈì-™4x1§CY€y-†žJŒÖ3ͦ> “’g4r^ç$ ™È¾ˆ  ì$ï8‘¿ŸŒvuªF7Àg`ã|î,ÆÊ0çuèèˆ ‡5dŒfšÊÕ•œ}¡“ª¨•C# c—~ê*˜ðHf`ä0±¹BšêÐ%¤! Çf2Ò^JÝ=ìChp—eÀ]­5™¦pOR5¥€»ãÐQêì]š@²ˆ¢HdŸS S@'O|#4`' ¸¸ d'fL9Ý«ïwuWKuš'ÝËx<õ ìÙRcƒ'w{ƒ 0› Ke ™˜4ù¡‚>æ‡9 PBmî]2Âö*…Ñ‘1µ¦,4v>Ÿj‹íò·:‰þP@ÀˆIy+¨%Ý«¢¸•áq(òhIµaÏÇïêoþî£ï‡ãÓÈý d—Ÿ›=ìSÈ,ÞÇž½õ÷>”2ÔÝ»ýð°¿^ö/,pÖ\ÅWˆí á\O½%,вI¼b»%-úøcB¾[žÀÜpz0Ü  ¬™³gg]ÎT™MníæájóPýóÙp {¾ŒôÚÑm*L“3çÎy Ë#¯ãÑ/‚ò¯ºpa_î}áV˜µ,­$„¿xèüå?fÞÏòþµpÞ~°º²ÄÖ¦n~ÿ¦÷ˆÜŠ]WæÁ'ÕË#[¿á§5I\Ù_‘»x«þ_Ñ@x©Ã_‰0ç‡~CDÕ !¥+1üÁŸæî 4„³¨0õ\(cœ;Î`Îõzsƒ*[qÏÎŒ0¤°‚0óŸxÐ òùƉëFüŸÿÚÎ N“ râŸX®¹^\t\ K<÷çÔW(l-Ìåy…mÁÍ™w|Öo3ÚÈ]lŸy¾LD½´&Ÿ•›­C<ùºJ8ÿÃ7Göëýdã*/BëwŠÖýkÞ ±ÑÖ¶Œ®î㜷Ú箇MzQÜæKC{}Ü^¤Stñ°à¦ŸÃÝÕð•qºEÿßüáÍjÊkãìût)ÞðŒî_¹Ö¯t!bÜ£W÷ªëÌÔZ"?'/ ¦Öü]C®Þ#ܯg­ô‚qõ×\/[â¯ÞBm¾äÏK 60?Ú‚oñörcT5aÉÍ£nütÃæçäð~'óÄòl707379ök£ m/1§Ízµ]p;¹²ÞFogÁ͈o`16ÞEý$Ì/›‹ÏÑ®›A±úMÜÎ ¯Äz nHËhðê­ßVá߆¶çF&÷­‡DÀ[3‰%å ²±W‚øÙ]áÆó`3¾È‚,ƒÓ»Ü¶¯Î(ÜèÖ×|õó÷»6c ¾¸Û½=csŸ#ÙÛuØnõ}ËI`ãL¸‹^eÞ/8ÛT}ñ”¹aáÍcþJfë•SÐíydµ£]ÄëÍßs¡wÖ§mK“«uz #¬Û­ÓÌÎÎ2WÉâõ*y9ào2^NóÜLƒ:ë‚_|YW¹â\þM^6Rœ˜¶§Î@‘‚(ƒ2ò‡ûù§Rf†¤ôZk-“_e‚Ãn(»Áu7(•÷2áÓ9AshBô©v:™‘ÇÆ±[-`1SŽÏ§j5ÏRd{dtlq«+òøùÈÁuhý‡CîûþÃãnWÛç#û!íØjuåñ¹ÿñÿÚOÙâ¬HÏÞÇ”z¢g×þ ÞÇþü9JMVç«æäDz»©'âô<NXž‚ MœÏc$2aŽl`…9 tÌe騨;øçêzþžJ¦D£$áNÀ‘­åÑ ­7Ðëî¦ìpw05±Î“´D]™A3 ‘=¤©’½w¯FcjèAeÆ(¨ÖøIAEëÍ}Ι[‹ÑÑúøX¼z(Õ=L’ŠÆ^ÀR+S^Ì2c$¦¶†€;2 ßaxDòÓ÷ÇR`e¢!Ù°«M'‹Ý±w=vQ{K1Ÿž 8¹DX2@(Yåô „ÚÝGxuÊ]}liCĘ™sýZ‚'Ô¡€€èˆê0 šz¦vÀDïUÎÜÿz‡xÁÜÌa Á¦ÿpÀ@ÙÁ JÈ9·Ôú)¸#…¬œÚDB,Š2‘ ™”€ÃºHû<‘&ÊS@î0B†Q˜þ{(,†DCg©»ýærŸf•¬ôLe ‚UËÃÇ Õ=1޽%‰b¨Ž sÆÝì 2À‡`ï3,¸Mèÿ“bP…É ¹†òìgŒRè°©1hØÁ«•)+•¬û:ìʱ­cƈDl€Jd"GС'ê»™ù3UúûÉœq²M4ƒ¦n…ˆÚÍ r¤Èì‚ëä<§&éKÑ † çňìTÂLf0+ï>üLØ?>úÃŽ’ƒ µ<ìZk«‡O?vïßõ ˆúñ}dÆ¡OIk£Eï;,ÕËP‡‡ÝþýãûßýæºàdvýåË›¦î•b`‡\¨ººÆWD—K©'·v¦Ùåì¼³l¯¼"D^:Üêëãçår¥Eü¢‹&zÅó¾=´q’¿¦ÉëNqÄlŒ¸f©,b­Åqy¹ek£¤i­àêžRO® ©+:¿Ð§éÍ’ÒB¹ä½CÖž/D€W1îÂzòâVú—Ÿ%nÜ;¯n½²ÚR±Vš/<÷Ë{LÜÎ1,m«NË«Cå×ûH÷æäõS¸Ê,.‘_2·f‘’^ª°áÍç,ù¿4ÙÏç‰v°>ŠLM}A3Ò œZqÝ¢»,m¼”çJ®WÀo¬4_Ï´=íu¹ü×ϯŸŸèó¥ ÿ_??v áwñkÿë¯3ë¯tòÿúùõóëç—þù)¢ìm›ÍÊ”%OV«zâÌS^|]èŸþáïIx:~>D볎b”™×â¥ÀmW‹™%f‰$¡æ–™¥”3«¶):X݈ÖA*2„]õÉ@tRðPÜ£—̈0ŽÕ"ùtÜ9Í‹D¯–»]`úÓ1>µO¥Çãû=9Ó[ïÿù?Ý¢8b ”ÁÌn@o‰L°Ç#L󎄲ƒù„8Â'0b"ÿL¥ý²À+ò\’$€0™P²Yͤƒ´Äøè‡(•S_'+Ípxú,¥•á6¼¢åflÇCo +û¥ C´F$‹² )«0cD#R&’Œ#[´ÏO4Ø”@JYJ¡•Ì4#,͹+ÅÅžŒÌ0²õÞ¨¡îÜKñЕ,DU9>?Ûa¿„¬^£=)»ä±²Oj{EwÄaVÛ9Ý2“l4¸×ÞÛt¬Ž–‡<‚iÓج¿O³2Íœ™Mb¡gÓ©t3z$²–³ÚãìÓ;átrúóÉ*`Av,+ &Ù @´ñTVl(§/™«þ 0Õþc¦üKhGÀáÚŽO0C)ˆŽ hGØí‘‰vD5BHSqGZ"\I F7¤@W7˜ 6ÕNM"D¢’¦Œ PH÷ᡱ×x ±Dhع}ì=²îʰ@xîà`µ2ÆDb²²`•FD„¤&ÇTKNõï#ÐÁ6Û £€xø®À÷h>±T`^†Ý¾îw^ÜÈ$}(0ƒ ªÇ¡&+­ 9¹.“®©=D|¢óï°wX™»18¹ Û,ÙÏC]u0PŠGgˆÅ÷^-3Ô{´§QD†Bæ<Ç&™§§!|G ©A`t*•A4¦Ðj¯;¯»Z«+"…ú¸ßÿæý”-<<üq/ˆÅ¬Öž‰ãÏbrìÞï?–Z¼–º>>~øýw×YlòJÐúiÀÜ¿ž»ïÊâu·¼.íý&gíMˆÀ_2tþ4”çuåk° W ›pnׯ¼©«xóÊW €«•s_΂“qîP9aKˆ—Úì5^dtεx|Ï"¿xe½½¤f0#m—rwÖ’3GÒ”bF±¨ä9wä”Ð8·œ™g—mœË•„K)ìÒ“ø\y~gjÑ¥x_¼Î á îq·zwÎwœ,Üç‘´õ#¼ôàšË´%¦|ý|üIìá¾,›¥»–€úŠSÚF·½Þä‰úcª³£íâ5[]þUfóR@IÝø o^Äm­éË«ú}7I@\,|û®ÀUÉò]³!]ïs¯­È_™™à¿L¯¿P\Ôîsàk.Í*ݾjÂÍP/êxÓ°Jó„áº,\/¼> ¶V_€ÍŠÞóPüÎuOè¾qrŸ=gèïÕ+|eÌ«·}•n€J\m^§wPoYyôUnÖÛ~ñ¹ÝZf¹˜þ§hïÒ¦eGÌ+ï‘.›ÏUqÄ7 ¼yç¹j5óµž]†tÑ ;mg ‚ßU;ÝO!Ñ‘¯Fi¯w¼¶s\EuóC»±…Ò«›á›ƒË7^ù7Œt§nAzùeýÆgŒ—Z®7«¢^;ó¼2†K-`UA³åR‡Ë[½ o´Zÿ¿ý¡âµÓÓ0çKÇá ¿haªÆ7ú5ó÷vx[ÐjÞI/ÜëÂÑíÊ­oY¨µ±U4ý&hª¡Ã±eä®Z1#²ÚäÊ™æ4 âØÛ²…r‡öÜ#»¢#¥æÜ=ì[†ºúçÿùƒê°ß ‡ÿû‘ÈTF«Ta.ß!3ÇÏ™¤èš˜7Ó€Ï` Ÿ v4!9ÁI¦­Å+Ê#$ÈP†yÄçÚÎtx.ñæt4¥ ¯À2Ä!é5eß¿{G¥ú>0-ž›Õ#»‡a'f£s9õbPP¢L=çIt!¡ˆè )#{'dF 6!pÝÌÈìÅç©}º0̬pŒf4§óêhOísŸzi?ÆXwåÝþ÷~l‡ái2Ðm6¹ÍSÄþ ÃlÕ‹É9¶'ÁFK¥–âÞz3‡;zd0(Óütü÷BE•¥õÞu »Eæ@Z'â0ZÉRÑF˜Ca½¥Û ‹Ÿ”ëé¹ ¦þ”YëŸ_¡œ3ÓÒs«Çœ¹1ÔIôïÈFØpJ& Ñ”fˆ†Þ¡“€U0Ñh€âd€D’e/wX!:¼ R–'×b&”ÄH ŽÏpº³Â‡RŠÜC §í<Ý‹Õ]y–ܸÛŠT ­e©d ·ðè™9Ø)ŽteGSzΉö#º8#@%—€ñøã¡BŸÌ ŒMæeðâæœ 3ÊàV(hŒVŠe¨RHÞAìXÀ"¾#‹Ên~úSC‰Úì`<½† å$&kß!;£ 2¦Ek™FRiæƒHM”K“‡³Ú £¡î ¡P—#ŒÏè Å º£=7¦?¾{:»‡ÝwÿõïÚ± P›ºê»Ç0G­²v32˰ەZË®”ÝðøáñÃß|wU ÏÓ.p‰ØßZŸw±­~·ÛÆY¬ð xÏpR#—$¢5 â&Â}ãVy.–ÞT$/µÿZ…ÿ'‰ƒ_Tž1>P˜ó®y%Ž­þøf˜WG”u§ÂmH¶ºó+b3mc•W?q -ñæ3Ÿ’zs`³Zk&.H*Ò_>tþ2‡ì \´û1èúµ>¢]Qì—=/\”k,s|5Þ^ias¿²¶ÎÆ‹ñâgxj¿æÖQpsè*¼>½À·ÛgѽŽ@.žbòÜÉÁå—L}­º¤—bèü?Ê¢èº?údHP(; h瘜6œ ÊNϧaK®hÌ'âK”=ýõEÇ¥N©Ó¥^YIëz*k©êÜØ:,Ñç£Àz]»üñÚ,@Ò¢Íâr‹F¬ëx€Æ‚„בéw}íߢþreD°^sÞ(¶-×ÞE/qûYôäh[RÚfÖ¯ö¢3êê¬Hò%5á¤èàÊx|u’Ôqƒw’÷÷ ^/­Ø‚xëš¶³ÒCo\ ®J-ÿù‚Ð}¡õÜtoÏW7¢›°C‹¾¶ù¢V7²–o%rñ®ìÆù˜}°DŽ/än¬S3náv\p«íŸôõ›pÜ Rñ²ß]Ÿkn!”:kîËý{I¶[¿Q×:êE©¿^¶¬4îð›yR/®òÂÍ^¤8U|[æqÑÀáúª/ýµZDª|!ÖVÔÍkég3×FÞ’º½èekçm7ÙvÿãÕ lbÞo#Äañ’l¼¼P_,;^1²&Ëš«ÑY1õ¤ÕÃÒ=±ñÔݹŽtƒ:y¡ ƒä Ìn-.€oH“¼Ð+½Ž§·Vïͯ=_ÿúg¸©dníYWàI¯üÆ‘úY¾'Zcßxµsc,yµì̓O]'êîÜðâùpíuçXrÚÆ.ÊËmæúp}em¥K0w¡ù¾Y…çÖçëão›B\{÷2½XH2ôB~K÷ßê¶vX¹›H¸ jI²½Š¦n†îVÐ×Ë銛´â€OëâžÓù{1tZD K¯ Aÿø÷?ý¯ÃOÑz;ÛfæÅ^ŠOUÿ©´Z̽µNkeÿ&Œ¤)ƼV€£F‹ŒÖŽ>ÁÜàžÈè™iªûf!&©¯z`Hdfë=Ñ3¬B©6솲W4F´2ÔfüÏÿù¹cdŽÚ}7à_ÿöŠŒ<ôñGNÑÔ*R **€õ#(¹¡@ $<‰²+ûÝpx:D&hÑÓ ÜîS‘d'œ°B6K–Ü#p˜C' ¼ @™ìÍ÷æEƒ”a e4f­ hdf› eCì^c€3£gti²:Èã§ÏÙªgšà^ÄxDÒÜlrÅ”9"™ÑÝáN:q¨ Ç蕟ü](¤ñØÇžQ]–lýÐã4}Ría]i»=ÆDçuK+°:ÉÂp·â“y«Í6‡Ã0ˆ`ŽŠœ3ÅÝÜÁ˜ò[Cqƒ÷Ö1ù±V7Dï ”j}Lf)f]‘—×Å@›íš‘ #q<½§¢ÂOÆÂ)øŸ™ü¦œD­ÈÄØq|ž•sÄ/P"‰>}ЀÞQ*Ê0S±*'úÞ™]. Ó2…‰#Ód:Z 8ªc÷AÆb˜YCÉxü¸swóB·Ãs‹že_{{Ïqìô,BŒ½CÙ»wwè8Ý@ët"Çy–†Ð’°³Ž”ÓÕPˆß:Þï"JA5Âm¨5ªÙàV½8æÕëà4IcoaƒK™–jn¢1‚V¤‚tMËí©ÍÖ“os@Fô€az¦R2šÊ@#ʰßcd¡Ž˜} ¦ô™×9å3}›W(П§E×%&\àÎkubÞ}`yh=ö¿ý}©õðé¹<>²ëðüýS'ö¿!é îÅ]Í|_êPËnØ=î†wûó[ ¯¼ª–"&AÐ.¤n Ú7;/µR Úæ¸¿ÉÞ¿¯òϼR]—„éê@ à–‘²á;Ä;…7"—Ñß‚K^ž;µº¦%IKC¦v´,oæÙ Œ'µ›á%Mr«½ðìXù1sIAÕ1ÁŠ“/é†àzP®Çbü¸ êèÒHñ\u|Æösë¾ zï”&ìûâļq°Ä_tþòG¶( Ìsµãå.q¼.¥xÄY3¹ÖÈ—=k÷âr[,²(ˆ¹†’¿Á4b«`Yk¾Ê]§îÁ£¾¾Þê| —–™œ ¸Ï‰ç7Ù/_©>«Êå?^Eé¢þg›#;]´ù‹À f“·î¹b÷Ô kéwë8©åCÅ•š&~Aþí;4½'ô¥0|õjÿy üÖ—ý3w$ýÕ3*îTÈžõµo_aúëç3G/hcéó'ÝdþWÉ¿àD×Ò>~]3îÍ¿¦ùePæ6Í×ß|ƒ_ú/t/ô'o»ËoØE\[méê<ü-K ?uв¤úœÿhyÊ>U ØTb¤‹/ÙùHp9KýÓ?ÿ“òÂ8}úã§ñ0"2S©ŒžV¬îw»‡×’Bo͇RJ‘!B‘]æ­G}¨e·s¥Öz{ n^ÜZë"TŠ9Í+ ¦ž]aÄ*ž“ j<Çÿ|Òà^}÷XtTo®l½,wÕ÷Ÿ»¥øÜß}ØÿßÛ,ÿðDÅØFŒ¢eR.=ªVÈ•(˜¡ПPªè`¢ó™¯Âvûâ¬;³ÀPw‡ÃQ“-­Y*¡©Øß²¥“9{Ïž}•I Ï§.wÈÁ Jx1E ŠìG3§9hÑCnL AþÌýÐ2: ˆpcé^hŒ±©7©çøüÜ>}ŽèÃãCöN—¬ãtüu/îyR¼“ mf©cô¦¦®Ñvƒ »¿©lÖ¦ÁÝað:å'¢øP¬hÔÕ3J)žhå!Óp|FåDFà41•èÇ”š•œ}_ ŽmœI9ŽœXf°È=ÑiY'w‰ÓÉŽ„²ôz»›µHõ$¿äcŒ@h˜¬b“óUqBùŸÚŒ'§À $˜£”¹ùŸ+ž?£1Ž8>£ {˜í€Ì™M?å¶zÂÁQ}ÄqDuÖéIVG4“­3¥¡$“ŠIà&´ŽZ¡jãQ½î¢”ñ?>‡è…î.d{;63§óùy$•½g‚ì™&+0t€ETb¢¡Ôqèì }J×@)'`à÷ÄßìQ dP™q=rìóÞ†*Ct¸[܇:½Õ)'-•Mí˜ H•]%º¡c‚4’21nó’K›Ÿ #²ƒ0=”@ ì`¦;£·þ$ÛYöc;öúPŒŠˆ>*úüë~î*ˆ¥ ÚÉÿy@Žˆ€ ýˆèVf–wß}|øíGÈwïvûÿù™Ùð°ëc«?ýÇåÝCá;µÔnו‡>ûP•ªe_kvÃîqÿðîaxØ=þö£Nî¯ZÔ‡]eŒùíb +1šoé¸#Lÿ|ýO¶n×Ä‘ D6—5ƒ÷áç¿Ì“¿yÔlårpÓð5‡–_tþîáû<\æSxe&±j¹6ŸZ%È…ºö¥‡?mzò\1²Je\ge6 ¡Né}ÅL[x?pqX”³i¸iJ±n£¸Ôá—Í%îTYÊD†<7pÞ¬N™)Éé$Íl*¢Y&^~ó–U9놎yùѪi1¯xeýa«»ž0§€V—¤5&æ§×ÿ§Á¯Ç^¼ó«~‰ŸAvà‹¨­kç½ûøÆuKQø¢_q¯Lîþ"ûEÅ{~‚êÅý­0¾-Uûzž¿Á¾ñí_/…V¿ú¤vüDüoÈ‚©v{“ÚðœæÍï}£ºÇjZÏÛö¢ý”¯Îµ¥“¸^iàº;§õÍÓªnãë×áÆ ïó¦èvîA¾i¹Ž·¶s o[úÃB„nÄ_}»'ôu²÷›~õ%¤¬eâ_åû û;®¸*.;×eóÅò]óœ^\¯Bz~ƒ ë§b@½eÃxé6碮uƒŽ®qr«Áç_ÿÎ…ËV$nÍäÍBËó­½~b ï?¨Öaoñý§ìiCµaˆLµþ°+æ^vûïów¿‘R²¸¯Zµßpº#×oÎúÒ\0Ë[°ÈZÛ\F ºQYOºÔϲÛ/Ú ù ƒ·sƒÂ=äÈt¡­àRIý#âæ?öÀ­ˆ†›rÖ¦ó]åk•£¹´PlôÎN â¯:¿:ÞP˜}îªR·Aµ–oª™iF-[Ò—c¢‚óežoÝ~â,\P̼`m.B¶N¸‹õ9ym¶ÌMÕîê}&ÞpÙÑ®K§ü’§¿HR‹©edžêÿO×{žÉºŸ¯#P.×ÖÁ§Â$²+ è*›t³Žœæ¿Ñ¦Luž©ìNä—Ù¶l§?wqßÐ'Îm'\Ô5 œÉ¢Mé’À“05¬Øb\iMg×óÓáE—¯§ß¢­E€w4n—_Ý,W$œõ´ B½MièV¬¼ùÚM<ÐZ¤Óí¯—±ÛÄʦ¼ö_¹µUã·@kÝvïë6ó¶Ìö¬Þ%bsªqM >Ísr¡?jUrÀUÇývŸý-Raé_1÷&i1¶·ô¤»È¿å©ws·Ø‚ÜhJ«Xw.®!—Ÿ–nVä»0>ÞäXt;;„-û„ó_òõt ®Àg÷‡t'ã·œ/I«ç2@â¹#o­¼èºÅjs_ ë¶&φ#¬l '"Ú9Õ9ñ¹Ü*–ÿõFŒû¦)Á*ͼî¶} –µ Ç—x&¬È·k˜œ—ß½xmôÒ{wæïüÝRèÒÈç飅(´d„¯—"^5äâµú —…õÏÝ9ïšUtÕ‰6¯pZŽ®tAþiCCÓRÎZ>×Ó i™°¼„· ± Hy]”p£ùcN0·ç´[7ªuõԺȰjµEKë·ê:„¿åþ\£ØÎËÌ Éx.“'7MÞ"€°‚`ÞÎs0µfÔòz+|msyôrfz…f¿Zn_ ^6…õáærØœ`·¯ÒÔ+Þ¼§ç[—àƒ‹ª¬åÍ.»î¶û¬ïÞ†Qú" àjƒÐ¹G\‹5nsm¹&Zõ­‹̸"#¬qv§C%_®ÕpKÚ~!ΪÂ92\ü –=ò·¡åM”pþ¶KŸ;'–“ÛË2Ê>ooÿö/ÿ2]çñós{ô®”BæNS)Åj±bfNbŒàÅŒ<¦éfÓUFÊÜ" ƒGÏTd“ï…Æì­›12™YŒ¥˜g$º)w€žÇø>BJÈv­å13z‚a¤€þ9œ™2óRq|‹WwîkvÀP*¼Zªé˜‘òej#@G6X…—‰„èaØ#Nx’*…1:àVÀ‘ tdö­Xö6AáI¤RISjB(ÊTdë¤ÁÝ܆Ç=Ä;Le¨t†Æ9?69}mz?¶§–ŒÞ½øP:$æ®X!ôùÓRºW)"ŽÍÃÅhG¹ à)tˆ2Ì…Õ)&-‹Ï¼Ù?Gô'P°ÈÃx€ÏYˆrñ>©ó€­a÷`ï«-F9f*€ÆÞÛ˜µÚn°6æT¡b0xkšvx ýLÔx"j3èÂfÇÝ™ðc%"aÚœ¼™ôÔÜÆACúqîièŒùOÜQ¦rr¡VØ "w•ý€h`ËL´oƒ¡è„ÚÔ«CT©Ð jì’ ]@Hƒ•=Þ)“;…#Ò{»®”CÇ€'"³{ïá®"K*²÷TÒTëä,ˆü»ïÞŸùð.«÷kõ2>NÈÌwÞ¹ºùàï~ÿ›Sl#œD½¥W@qžšn’ý˸éꬰ°·šáB .ómE5êÑ ~>—¬ýˆyÞAp(‹u)¶åÌ*«° !λó2‰¾ø1ÞrN°r^<_Ägùål6ã:nâ.ôçÕÙQ[ßÓÉjëÈ£›˜tyà>Ýìu©·–ÈÜþ^ÞªÿäIÁâÿ¼Ldº*AÇ üKDóUÉÔEˆüK‡Î¯*Y—­–\V›\Jø/Ñ¢®ÕË 9IÙä„5Ñ׎«TÄúàó’;ÖKÞ‹äÒ—`ÙpëÉv-­R¼ˆ‹ãýrç9r–12%$ÎàJ¦7Û”ƒù4ù2 Žìó~G¿”ȯ×ß”$ØbDrJ ½dqþûu)ÿµßÃÛŠƒÆܽV*ËÝ„ªîÔ’ÿ¥þÚ<ßÿ<}³äpKŸåÚ2oMú?eþ«ÄŸf~IÑ­þlA?±KëvDõå«„Þü7[?þñÞ«ž8«ëo¿l~õû“þ;~Á#àKÍWÈ‘¿äÝŽ/v¢ü|î²æ¿ù<ûsg‘—ãÁÛw=]åÿÞÒð‹žÏoéøÓEË€÷-oë¿$u´ôK0,™Å\åCÏYêÄ¿þaRÿqøþóx³GF@03¯Nšg1«µ‡9[7½ˆŒ©{ì}¨¥ÖÚÇqú·™Ù{Ð @s³ŒÖ{Gˆ‘%»¹‘–½ƒ 5To# =˜(â!z#¬Fɽýøïÿf‘úã¿*ºõþé‡ 33ÒÙkFhð¡Á ž:Žíhƒà¥‹ê‘HÒöe¯v˜Î÷$ [Nä¤)í={o{¤höZ¤ãKsËDïã„H™žœÏ¶³suùdB&êάæt¬¬dy(Îݺ•’"A“1Ý+‘¡˜H·"É<Ùg1²uB²Äð1/ûÙ]™„­Ó©ðˆ†~¤qòih‡^ªCJ6#h!)êà^ÝͰ””4Òj guíǧgÍ(Â¤ÔØF8$|wŒ#Kº[ À¡„ˆh°„Û|Jm‚iJ–øÌ埲&^æ‘àƒÆ>¦ ÃΪD-{1ï€Ò£¥˜nØC‡çfŽÝ`½¹¹]JNSjêÆH Ñû ,ô èh^/úOk`  °Àu€Ù!‰>B$ŒÇ9@G ½£·“í³Xœã3{ˆ®ê41™3ôPY@9cDJ©ìB¢%Ž|˜CLh·š)+=˜GÅ(«*n•æÙ¢g(à†Ý`TSïÏÏ]E°89æ,AdG˜„`Ëiyƒ&M€OÀž &µ0gw‡pççÿ§É†]-¬²Á3¡Øc<tÒM‰ÙçE6•RÎkUjn¤˜=~c–˜l¢ý$²ÏÂ}­€›œ+sP‚ýÉæ “9¸ˆRQvÈœ³}ò€pdGïÌ®>R£Êš•}yx|ç»u ;z4»ºß%Ôz´®ÏŸŸ– µÌ>ŽûÁw;e eç0:‡]÷'[tóy¡X,èz2£—;6÷ÝVq\ùZiË£Œ×b+æØi+>áÏŸ“WæYøBù?Ó¡þ’¹ævlŒØª—wމW Ì×tà¶zL:±LþZ óØJW¼Pµª®\÷Øì)dË”Ø ¼x˜ZÕ M`q+™úõFå­™{ßÛüî]e¡–9B-2Ro^ÊõYT“KGv(fÈß2óv]=¥×6ÃLM¯vréÊ“Xº|›UcUÜÈ­ÿ÷5JØ_ràmwû-ÆD¿Œù–WzÛ‡v3è/ýÒ¯œŒ7.¿5þôší ¤­ú„ø‚y%cmf~æq{[õ6ïãÿùÅ⣾ä©,+´©×WþÄøahÃGømkʪGŠo_=¥û½To\VH7Ýþ÷ÝÙð²mû îq'.üó—gäšÅŸø%¼ ²1tŽ?pÊ¥?¿vÔ¿t޼à_ý3}ÃÖ´þª=~Ëgþ«žÅ7Y#O¾`?ÅÖºèz87Bç”Þ¢¼s‰l½¹¾Ôþð/föôýçÃóˆÞ³Ç|øpz­µ™•ê4Ûx<¦JJ‰Ö›‘)˜$ÉÜé©bv®2mѳudÔR2Ãa=:k©uHÙ¢Îôlƒ;ÚØŸè)¢G…Ê»}ôÞ>}V(¢õöý¿£Edãáx,L*ÑÇlÙ½jW2J`Do’±8z¹·ÇRzëÑ 2=mŒ–‘ƒ:@z"5ñáýcïznÏggNÀ&áÞXžŽ‡$$fæ8޽u3Êž½7S¢šeJ¥xFXJ(»É$jÁ®dž4>Ñv¤ Y3G ˜ Tj<ˆÅKÍhãÜ gd23¦ÿUÍÍ™qÈž¾w+”HO's³Gt²»OÒ?”]Ñ‹Y>?Ã\£š[f¦y©ÅA=?ÿ dDñúÞ~@‘Ú j7ËIjÍtckÇ^4 »2šTÜüplsKĪáé "j"P*D›d_C&Ü¡8M%ÆDMu=›™™•>ÎﺅéÙ‘)7 {ÈL–$¦jî)µ0éÔu?wH _)”ŠÌ¹ðÜ&K؉(˜è#`ˆ°½#»æ&Ô:¹ 0F«;˜c "-CÑ勱$]rNOk-› Žšê{•v e:L43gáC­5”Âcá8F—ÓMèÍ"£1¶ç®¡fôy)aÒ \¡‡¢ƒ‰.ô)T ˜ÌuCÏ`r^>b\¡v p‡t”>À àDF€Çj´z…ýhî–`fÚ¹_ËúSb`JɤbØ! †™4=G.¼Û§·ljvQ^¾pò©žÜƒ(´'äјÙ0Åxع»ýðî7u¿Û}üÐÇ‘Èì9|ü­µ<ïäÞžQ+wÃqlfDËáa éÅ÷?þþ;ÑÃ}*ì½PeN¥ÎÜjQèeXµæ‚œ‡óøÜ 5Û/„¦UªîrÛb¶ñz]€Ü„Ã,¤£•§üÕ‰‘\‰O+Ëm*qÓ¤Ò¢ÿú Zøò&õ¢R¨Ó»vÂ/ð&Ï—6¼¥µ¼CakLV7F^]û¼ë¼w“§~râZ²ç;ÖE½B§­^ éjQ·€Î3åÚÇb6Q”°qB{á®Wœœ{bÁ¢ü¼ Å{·¢ê^ÆkÁöœÿÊ.¯Âù%»åQ'<¸ñè§ÑÐÖ¢µèŸ7èóšþƬÐ$¶D),¯ërZ¹öÒŒÚ\ÀA×Ísð°¢;öÓYÒÁ¥—ŸðTF»îÑþùŸ3óøù¨ˆè1[ï}B ì÷Õ‹ƒ´âpƒ@³Z Œô?¦_1™ƒ€¥äÐqkñêuìBBÝ­ôÁ©ž=#©v4DƒJEtm?´®ãØMàØÇ^dôDS9¶ÿüOŽ R>·‘1ƨÞ.f‚™]F$(¥¤+#5ôýÒðôyôÒö;ƒØ[úÎm:á}:H•:»¿N] ÓC l7 ’Ì!€‡ý~7”>ÚsÀöt£„ú0ô1KŽã8ÔÁ ³æ#¸ƒ»ÑϤ€™L")X5ݱq€h:IÝE¸M1ùÙîö%[€%û‘%ë®VZôÖÏ(•Õ-©ž>øøÃ“ ÌF´BF•ÛHi HENìÚTK(L ã»Ý»c•á´ÞqZÅîRNSd¨÷l ÌqŒçãØÛ˜»!¡TÎúøŸ8>¡ƒC‰À ¢ÃËÙˆÕ˜#5£xžŸdÌRÜ•ÍÜ N³]­<=“Ù%¸Y ÈhÙA9U‹—Ò}rý…æL€´ã¬øôc§Â¿ ” l*œì‹'¡9ã\"èVà‘èRAr( MZ3pÀ¤íCp‚ÑXwt  zÇ11ìǘªîÖ¥ašŽã1ûç#ŠkHÈ-{O™ù¾Çñ0VƒŽG(kE&¢! N6בœPH™È‰IEx…'LHÒ”ôrCÆÉ(@*°Z †'J‡W„ÐGÔ†wò!&|r6L®dšÍ)œ©„N9Ê8'TÌçJÿ<§Q5§ˆ¢¡D€/ àFdGo8Ÿ4¬ çÜ¥1­—î˜üÍ}˜K:3@¢‰i©CVØn"PÍØãÉs8FC±wß=ìßí?<þÍý}4C­¥î†±µª½?ìÆÞÝ †}K"“Å‘Ræw¿ÿÛéÂv»ïþî÷Óþœ_“¤xÒJuh˜+JÏ1ÓkyðÕ{bÝŠ' êöø%¾åb™×ª*.q©tÍÊû¢LÀmb“,ÌíµðD:‰ËmuTcMì¾=¶Ï0¥…  ÅF¿~/®¡w ¼%ý.Ü›.ÜóW‡F7rË ù«0æ¼ Å%°X>p^üÒTwKÆ®$ÞUÔwêÔ‹°­ü, ‡¡ÐùWûÉ/é ^Ÿ/í‰Í¶þ¾Sâ¶9øª™gþ·wŽ+éŒgº$®T­*Óu«¡p1Zo-(_–¯@‹» SÝ]/°°¹ZŒ£ÖÜ,–Zû§¿(kQRP*;¢ Š´ËY˜7>35ly´¾W ºµB_+©—%c™-:Ó±ôRóó´ù_µÏp‘‡xQ¼þê’¬o[øÖ°—nã­_ñŠ-éÛîêÛeXu­ôbÓïàÕʱW/—oÈz|ÕÝêþó!¸%|/´ÎoªwÊ$ »]vd´L1 Œ½÷Þ›0F°#ÚØ•2kK- öcº›<¼ß%ôwõñ‡Ök©mì™Ñž{Nò*f¨½Â¼zFk‘^LÊh@AoIÉ’ @*TÂlWL9ŽÝƒÁØUBÂñsf¸™¹§ÉÓêî&˜ìÑwï>”Êh‡R‡~¾ÿîûßï²GÇ:<`p§ïûxÈŸ{&¸{hÇC€õý»Ù:Hyñýû‡¿ÿ®ølÁ?aeó~‡s[JôÓEšÑ qOÿ¶{®Ê¢ÏŠÞŸé) Ÿòz@~‘ln·àfÙ‡¾é!”¯Bÿß\ñ¦u~I_–Í­Úìò¿OSý«‚ÎÅ$\¨Â× /ýªeUÜÂPkžÍoUÏ4¯å䳚¼ªN¹1¯’¶Î9Z>ÐKJrk¼mÍžú™¸rî=WÌëÔOÅ«ûÁ"?0wð Áì:¯i—ÖÙˆåä®{6ÔJ]2‡óõÛÔ¹‘’¯`i뾆#L Y—>ÞËo!V]È×íÚrtÁÊsãÒÄuýih'®—¸ƒÅó_º[k™<ýÒ’ì5™Yxe²Q0ªW7â V»­ß¸Àšäµœè¿õ:½¶ ê¸y®×åm“‡EÏÎ’…Uû¶WìÊò~™^»Bfðš~sú­ñ›+ÓÒ@æöoîv ÷×}IÓ¶ ÞþËâm*éúÉ,ZŸô–UUZ{¦_¡}ÞRƒÊëY¡«¿^]Í|³óúuó›ýŽ×U«"ök ×òÿ\:œ6GuÞmÜž–$'¾¢€ŸË‰WÿÙÞì^Ú¤sé Tù5¬F÷´Æ©%lÅÖ!n3Ƽ¥'7ší"tiÙ¶™ð\¬¬çb-/IK·y®w—†³ë}u E»üÎ3Vo­ àŒº{²ØŒ`W÷xéäõ|¢î…’«¶U]/3¯èÔ } +uU¶ë)ÆÕKtAؽ¨ËO¬‘ ýëÄÙÈèz½Þ¾»µ[ˆ«zöů»0ˆ^æ.”Ïåzr;]ï'+œÐ·î‘ç9skF§;ô›E‡âjèÓcí”5 ­~l±á®[¸©uãÖtï1q¡†žçƒ–\"nvV•w/ÀîË—‹Þ«Ú"…òj)XA÷´½B¯6°EPúrëâ-éWÀ“ÓºméZA~H ìîìúr–§­õ:½ê'¼:RNXƒ3<çDµxÙEaÏÁ„î$_øÃå¸éŠ3¶nw»²;/*Zbùò°Š >ĪôíÔ˜¯ø×}úãç~{ eD*Sµ+óZŒf0úP›šñ ÍŠÙô 2{Ÿ½5ÍäVè‘“”©èC­µ@Ã`™È”ã±òâÃ~|>ŽÏŸ‹PˆÛPLIDïíóaüáè«G°}EØ~ü?ÿ[¶žˆÞ…L1b" ´dR‚9Œ2))wSä`4S?Ž©t⨄„PÅ}èÇö°ß›#" O3ÇÞ³K*¥ô—Ühöû¡T¯u8މì}¬õÿÏÞ¿6¹’%Ib ªÙ9DÜ›™ÕÕ]= ÉYrEVøÿÿÁŠìÊî®P„Br¸$‡¥Ìt÷ô«2oàç˜é~pà87o=º:!YÝ™Àýøy˜©™ªR#Zï’Ðóxl€dXQÆ‘ JñúäÑ»R^*ä-ÚQm‚tk-¤÷ÞhÉ´]Ù·MF­µŒ„N;Œ ‚vûòú=€AS3>Q*¬ 5wˆOß±h[%h ëÑÀHeKš`Ldk,Åö»R½(Åðì4ÆTzaeeI†JÅ Ê8ÝŠ8¹dÌC}viv‡9h ½Mšø€!ѧÉðd|ºæ©½Ã$aU´Nw˜Ó„b°2çà¥B (@¥Á ¤j>¸<-M8ö,‰cb„¸Ónd¤Z€¥®±ãØD²‘ì¡ À@ŒS÷=Ð5CçsðS>NãÔ€/teƒbn€l@ŸÔÿ=ñÉÀ(ìp* ¡ 7ÈwPP+†çy|” Y÷ÌP“§î{&˜àq -¨”MJ3@0‡dGtð¤GÔG¼ü=|‡aß!ˆ3$‘b3ocŽ{Oaú´WúIì+ÙÐ_9-¨v˜ÉÈ5•GòéßýÅw^ÊøzÜ÷ÏOËÓ¾ µ·1 %#³KÌ„;ûdÑa¿ùÍ_NG€WßÿiG€ÅŒ„›k’˜>©oÏq îX˜ÞHÄ.`Š+Ù¿›Lå,ê³… _Ér)‰[€R¼4¡=¼×s«ë½ý^ª§óŸ\+„—¼únu'¦xì&ÖÆ—0K«Ý…2osÏ¥,æIÅïJ»\w[”î´q–ú¾‰TuÅßGRµ¿Iw¤[è ߈ÅM¬ÕOn¢ÇISçŸèüªC+¬‰«e¦€°Up"f wšÍVÀçÀòÝU€%²§ë°SKtZxqýJ7… b!è3AéK0u5#—ðÊE€WgêîS‘.Ú¡ËŸ.~¹ÈUËÝ\KÆÓý²¤InRïßIûz’Ž”NºSZéŸê%·Ïw¹ºæ‰zYXºè­ñÀU]èAEô”ÚØÄjå¼\¨rk㉃²–~ÆÄy0µ•6¿úß/’À#™‰­ÿæUú†Ø xýó†ãrþPÑú÷Õ¸w…5n2t[㸿¥lÇ ¾øÍ1àû†EoW©>òäî?ú,·ð…·j`÷`"½ëÖt]áºLü‘2ýfÁoZ>èÁ^³²#¡ÞÑ¡»Ú­ÏŠrz×-½¡rÉikV¸1¿yÏ›[ËÿéªN‡5Þ÷Øòë] .ú‡õñ}òƒ €•ôýGƒ¨Gß~ó¡×¢ö[¸…¾üåÇÜ‚ßÐ:Éò¦ÌíäãQ»;oÔpÞî< îaïïì[û ÜëïòÖéÊ/ÞëØ”7«åÒYó{ëyßwJmè,¤õ¯6•Ç €k1­Šßj4>º¢¹µ¶n|-°ÊðÏå,E˜×A“f~”¡LEþoÿîëcëck­÷žÅÝŒ^JŠ—’F+nfS·/8)› …½µã±ÕêOOÏ=šR-ŠZ«96µ®ž­…PK“ÒÎwÇ4(RÈÁ¬Œ~<ŒÃ`éF—Ú¡KYŸ)L¤¥?ï#ôåßþñÒˆ°|Ú+º²A&·©¶4IvCOC©»t/ƒÄ×ß¾z1s«¶‹ÈÃcJûýà4j¼·ècß=U'3UKµðc;¦rØ ™S§rr*Ž8½8˜ÆJY-E©Á.fnÑ¢÷˜´”&‘„»ÕâqT}p3YY"ûÎkSHš0S"&Ü3Aˆåãšú­D%|xñ¹u-:A-ÊðSŒÈœ%MÎSÊ :bêz®³„ý„Âó„Â'™ÙŽ”¹92Id䡵f?ÒÐÕ#ÂèÏû}=†,^Žm[OÅ­Ä`9*i»>¼ŽÝ úˆì ÁV¦v{‚„ÙìÔ dMæhòW1=ºH8½™‘Qª ˜LLRnúø“d°’Ç6fDöIÇ®¹¬bŽ>`Æš'g‚˜ê§tÙNՋꀜ†:f™ ì Œ 2(B¬ N;-ÂnÏZ¨C1îÈJë°Ö Ù‘])˜açÈ# 0Ê©]A—@J„CÙ‰&JІvrP0` ¡%,é]<¹OKɱÁ¥  €†Þ¨DB#fñŸ"|6Pi #«pG5øV°ÀÎì6O¶$@bxžÔ{4Ih+æ·™#Fh"ñ°û d[;¯sâ1•I‚e.½˜c÷Œ2 7d‚'àÈDŽ`Å4Îa Ùa6ÑqºP=Ö/sƒÀœAk¯VŸªïvVvuØ?zúü/“­gïÿøw?þ€ð«šXгxC%“úqüó?ûË ÑP÷»ýó>zH*-EÒÍ.Ê-+ˆîQµþ^4³Ñk«ëÄâýLû”n4]r>»nµôÞq]ºô^~ÝиÛÿÎK:÷þ>>¾y§§áN?ÛU#Å)pY5ƽæ½G¼tqûçTJ\¤U¼/LE§Î¥nü×m+âÖ·/ïô¢~±\š#­SwÕŸ®è¼t•¶èÆ,+Æed«›ixî_Jðý™ævçÐI}껇‰ä} V’9É`.G¹\Úÿ" >×¾ßúüéÓ¦xÅÌ@£ó‰,à}Òúû,ߥû‡†ryýòúåõ'ýúF ÿôõqþÙ+Xñw!+¥“qÓÇÓý®îò—×½Ù¯?Æe°¤ü"3÷ËëŸÌ~º®Å]rû†³ì¶[æø8ºbÂ×É$JõÌ–-&†ÞLº—bŒl-ênhmx!ÚØ…Ü »Ö[oÙí@dAâØP‹‘)‚†XÌ'ÓP £w &hD‡r„LdGœlxéH;è°2»›C“)ñ¤„9±¥¥{ZÉ’pÖ–éÅÀ0ÕcK û§Aa©žÙ”ÊÈIs^=SÈ2Ò2Ç—ì?B0?©·˜ÔáíÔâ=uÇlh ¬ ?yíf€T2"äÅ@O0;H&àƒ¤ˆˆLÕâ‚¢«îH•—»0¾¢³ìƒù,3)óÌ]á†:\à’ GÆI#~êŸqsƒy’ÖÉ“òLÁ,$D¢Bã{§U˜AÉv¢^÷ –|¦¹±ˆ”P¢Š…"zP hFÔ„ Œ†Þ@ƒ×YÁ)Oûß4rš3 3 Of»æÉ[ ¡Ä4ô¯e‡8 Ä+¬!'ëwö¹îžên»çh=zz©e?´ýxÌfba¨Cï½½ŽHýůÿE(IÖZŸ>=ýð›_­µÖ¦^g-@HÍ>!ï µ~‰C¿Yp8ß~•Zé¥| /þÝÐ5û•ï½IÓNvj¢‘þDŸùJtþç&H”‹/ýª§tã¬ošm©0o¯ˆE¿ûÄe¹ynM!µTé8Ó–5K]N¸rÌÅÂòûzàÊi'2•MÙ5y­¦Ë²ÎÆ)Ïé1ÌÌ:òªqùŒOÝX'eà"TÄKI‹é‰ûJZÕ&ßjj5Ö\vw%ë9Ésé~‡é»w‹{j!WOúf],p¶Þð§¸Pwz€Æp«ÅöAÛí¶Eü©@ÉÛB:ß9<\ßä[¨áÜ@4IB-¿‡›fƒ/Àn¹šRËEy‘[2¼¶Úéy‹î·:÷zW¢`W= 6œÖObõù·F@_À.ÌUt³žï×âJÜtÙÐ ×æ‘q3ª';±3éºä‚2xѳтzù!Ö—¸1÷¹q­\×8š2:1fO]í+†-aÞþ·¬žz6>€¤n­9¾ÊÞl9ó3ymæ®mÍ}RTÍÇ WJ€[ý¼WXéü©¿Ë äZ­ë´•o™Uêþ˜œº‚/¬¿Câv¢,>HWm©Ú€ÿÏ C^3A±­Ä-Ïׇÿ‚Ì}¶»ßŽ,®nãÁöþì[ö(-‘8½“lqä-™{…Ko¶Am>†sd¾eÝö¨ê¬`¹Œíï+é,„òHq±÷,˜—\õÓÒ¹mz¾ðWbXgª-oNŒ¥Xå…à»ÚfOY'™È•æÅòàÝ’jÙŽÞÏ"Kîsô ”ÅÍÆ {ÅÆø]ë%ÒåB» [ìÂî¿•÷™GéC7[ÄÃ…u³‘¯§þJVu±"´Øôx‡ÈMN:qýWÒ½ay=´¯ÍÞ7“ø€²RzÜT軈·û[~BùN'õô5§”…^þá·ÿþßÿûl½·>©ý8cõÂbu¨I–R‚¡ÕKô( ¹êîÅÝ[›ì…½;Uj5ç€Ñ@€,°p£4‹ôÞ›Ãì]@ÙKÜœ…Ù#ÇQ†> Œn©ãOÇla=9†€^þ›ÿF¯=È@…~¨É¯Õª\Ê NëˆÌŒ§Ýà^^^Ç—‘©q¿ÌŠ3–Rv»!"Rpgk£9ÝK<_ÇvÜ=í2BRY&³Ýa¨nè^Ø[d\–HeD7³Z\Ñé–‘ª´>‚`RÙmWJ©-QJí 7Wàˆ&„ÓŠ[ñ]/ÙŽ-K¢Yd~þTˆrÇ ´¤4á3šÇ3FªVo-zë)y;  9ŠÍf¿î3Ä?­ºLLÞhP›3²©CCo0?©4džP!Q¢eˆl,;1BI†Y𪲂Z80v¥…£{*ÇÐ(Á±c)†8Œ‰ÄÎK¡z舌T&Ø(h.Û¸@a 8 I“‡§ž‹˜ÜžAct Ð6¹ƒc.M«OÿÀ0Yó…óXÑP ̃Wø(3Û^ÁDÀi¾D(Ðð N›ÅTËù/^JÝ T™}jÞ'àQ¥À ôÀNrF€·ù'óÌŸvÁ¹0 O¬&¸Ï/Lj`¯§ÈÚæ"Íø‚xE;šÁK­fµÔ§çÏŸÊ~·ßïx)õ¹Òýôò嵎Áâ’L1{Ï–}l¿úáÏ{s«»áó¯¾ÿþϲ”¢T0C)~:6’ËH}V$AVɯ®ÎáBá¼ —´N^—R®›šË0ãÎ9»)øàL¼USÔEÑx;ú?“·açÊvi{¹h¯_+j¯GVKd Ñãe:µÐ˜9߬=ß‹TpuK{Ý ’|4>º"µn$n"ÛK¶°dìžNý 8§ËÝ]@´+äâ4Ò8 Ý\‡wkfÝ‘µ¼J´?ƒ+¼ãOSt^kÝëõ-i¿Mß{R‰¿¦,žÃ) ›/ÑŒÒ|⬈u/t½¨I^»Êneò€ÒÖüî«ñ“ÀdõM¾ûþ] ƒÝ©ë>2OÔ]Ìóž’ÎÅÍAŸ;ojË×ÃñÕêNÖ—â&õ•Oæ â·œqú¹³tiËqÏôàcàù5L¬“s¥#¢ëAzWìia@Ó‚çRߦ_Á#ƒ‡GÍß\{F½)Œô¾'©5>­ŸSá¿®zo^ÌVüµ¶¯Ý¨ðßßÓu#¾½L¶ªÄgѾÀ5¾÷ðzìmì…&Ö2eҖݺýáâ±RÄ‚$Œ« ÖÕæ}·]d+D^†ró½õ+lš¼.¯ž/þê‚îáÚ·„ЛØñþ%ßÔsu I8n„kÏæÂ:`¹eé¶ø‰‡KZk›ˆ¯ƒtqomeÏÚúaI÷ù°Xt&q»Ô´‘üÌ£ê[µˆQ7 ÅUî^&É{êÁ:ª×ÇÞâkAßÞ¬ÏýìpÑ;paÛŸÊb¼pÓo4àDãIËŽ³Ž„M]¿ø_ÿç×Ç>öˆ ¦öaXu3K@F™±ø¤B½s’e´q„0¸-BB˜™R=:S$ œÁÝÜP€%bl¨…è2g¶A)^Š–B9­*^X:: ®­eO{ýïÿûþzÌìRÁÂbʰ9?4‚*`Ehf²/?KÉZ÷6D*ËPK©½÷Rª2{ïu(Zo™an‚Ü­E73Ê ˜››_BÞ‡ïv;™ÙDÙ³–*%…Þ[˜33zŠB-LŒJ*t iJ=¶±gÏ…Nx„ÕÁ8¾ŽÑäû}†º;ŽÊÒŽ}Õ©;ø¤œ^¡@Ž0G~ê_¶OHs ï£Ñ€`Rì¤5<ù% hÈ„(dH‘*n4·F¹£‡(˜ÌKö„´éØìí Q-pPñ†Æ‘tͨµpL;î Ð1’=•’kâ4P¨ê¬À˜@b_™)„àD ÍòG@?Y ¤æ®œpÿé6À ¥ç®V‘6ŸÌ‡;Ê0 ¦Í¨;j™ùJôŽì°‚ÁÜ*T^sìÆLÀHZa)ÙÁqªÁD‡bVû1•h}.ðL™ƒJÐg•ÿÉãzFø²Ù 8dG6ŒG€„Mđżìö»ý“•¡ÕܹûÕ÷H±Ôáy‘û_}ÇÝÐà(5Íižv½õžmêdzb»§ýîyÿéWßOz€Ñ„ÏE'’Ès»•î·Ž-‚@I›žîG\9[m7?F·5†ÄïJv¯D?nŽÚõ5_Id¯óÓ»Nƒ[—~þyrCãEžæQ`±òÉäÅ$“7=C×hÒâ9!)n‘nÜé¦ºŽºn2•Û;¾í¯âW]×;-`bc_PíLþOWt^X7-ì΢óç2Æe\¯ãÐeçÐü§„2±lg|:kí½ºÊŸÿØØ€æ Ù‚ê¶²øé©êj›}A´*+^äšO?/@N’{ˆ†Œ¹OàM˜"ç¸a(4Þ-}û ƒMV@†_^¿¼~yýòúåõOãõ‹¶È/¯¯„þ~–h4ï—ùÿËë—×WlKêêïbE»E†Î4 .Ȧÿñ¯þ àáÇ×[#{H ÒÝÌ=ÕngÓUwšùØZ‚˜\ÌŒÌÖJ17FÌzkHÕb$ ¥ÓR1fj÷Lß smäñØ`ÞXRÁb¥¸E(Ù;2‡Èì‘Îêûºsâeìî„ZË×ÿñßöñ˜½gæ„õOpùÔ‚%ªæV&„ûÔ¬ÇP—/Ç—Þâ»ï?ïvCo½=zš§WóŠÈ ·ˆ`-C*zo¡€ÃÜR2³a¨Ù#Sn^Ü3z ݋؇ýŽT)v8Dë0cdï©ÝàÆBÇØGHµðéyß³‰™­u8eÆ„„ºX±££ïì‘ÝaÕêPjoÇãa$³–YÁ“†OGoꩽ7mFð{‡rF`'œ}z?bö;`|&¸?‘@-3`’n/{Ô}ÉŸø||ý©µä¤&ïr zôÌCµ!Šü1^2=%dOžÑ„àd5¬D¼ >ÍÚ,-fKƒ ˆOÀ Ì/vRr·Dc·/”‡¢¸e gfÄaTÝÂó'¸ÍâþĬ.ÌÙ-vRQ?IÙêè ¸A}îùœ)ÁHGv™‘}1Àˆìj)žö”ÃÓgÂNGî3½ «Q67£{L1&’Ö C&¥#r Õä¾d$a KA‡Žc¨‚t›>_ÕÁ áyo‡ÌH°º;z0RH€©0ƒ“šX!D¸£Ô¹òaÔ2ðLPvGÚéy9JNºR $Á‰=”‚ LÀtH3Iœf§4wKe|9(æž›X 1[7Ógÿ^ML—€fhuB2ÎsL¢#Ž3 3U#²ý4ÿE¥2<í†ýÓðùón¿g-»çÁŒÙúë‡Þà Ǟ íˆòÂâÑ3S}l1¶ßüå¿$m÷¼{úþóç_}‹Z:I+ÅO Û¿DNÐã×Já^£Öîfpn›áÇÀún¯ß§è¼¤ÌI\í›<ãé‚óÊ>ä«s·¯d\/">šm¢ÉrÖâÒÍ¿®Žlðw—tÞÒëXÿT§áé?SJåBªAŠ2]ÙgÄ«VÛ¥‡Ý¤ú„é¹Nÿ̬œÓ²;õëoÖV7ý'¹ºñ+ë]ª‡+ Y!e“e±Oèô”´fáÜ:¢/$ns}Ýú.nm„zË[ý4—ß›!ãã©ËóS¹÷-:Iùðæ)lÍvžˆNç_jÝ˺¥ëÛáÛ÷­wÖ‡6ÌTyŘº¨{õï[³Ú²KºbÐ]]ö-Eñ2ÔïlQ?·r®iîKi¡ÇöÚP-:ýfu“k±­^m®ÌMï[.‘ØÝù«Í³Zg µ¾›[?Ì[Їîüj]¾çÍÞ¦5{Žï;Šp;'W{º¬™·u~n&âB§iƒau³¼% ÏëÙ³ùh¬àEÃïïæÚ¯g÷…²ËéãfØÅ:?ÿÿM®ß#Ìö´·Ü*Ix0,÷šðOZCköõ^õ§òéE¯Œ«¥³¥øäý½oØîÚjÖx€åóæ/¤[0¡Â«Ep¶ž•it(‚k·7¼Óßä<®m ób¯¸·¹Š¯–¢†›—³•†éЧ¸ðCÓ9ÌЦÝôãÛß^ü[m) ]N½gè6?ž|GTps®¦Ç%¨s¸x=i¶LŒ/wô- D_“,Ÿ§¬NðïÍê\Kºm}ÎâÑønÜþ¥ëî$ùú"Þ’h¿Øûî(Kòz]ÛŸ“ü«ÿðï?½Ä±e¤BÈdnæ^†bî2÷sÉaÂR'¨ÖIs´žµøT•0óè²$™TÍ2cúëÉ,×¢1±/ž\ÇérÍ88ó8êuluDZÍ4ãXf´ÌÃOG:ÕºBÑzwËa8¾Žt——×ÿåÐxŒ±G¬OjåFÈÀTR3°=??ñr8LŽ¢4ÔR¼L]ÊÇ£{x9I Èï¾ÿ Coípx}zÚ™sWª9³¡·–’Ñ3sš'i…F/¶Kű’|_2ÐF'C9–êFMt"zo¥úd[+ÌÌŒr“I²Á÷uØ ÃᨦÖ^² ŽÆÍ÷U!/•áÕÊëá8ްY™Ç`† ˜@ðrîÎÖÔúÝ`$¢Ã+¼À€6"ÆÙšU„Ø0ƒ°“®^‘„Ra­'þ\‚8¼þ”=³M­qÙ|á"LjT"‡h™Ùó`jVõÐfœ£3¸ÎÕD¿­e,¸¨·ãÍÅì]UøÎ`‹ÀÃ,Oá® w×uui/•‰Ñ·ÐCü¦xÁטõ’[}S¿óõè[üõ>p~¼ `õꪮðÙ«‹—™7Š0‚®³ziÎ{jZ[]'â9ßÞå*½*lVµnÄ^¸¶4âfEp£B;ë“.5R.Ÿ¨û û+¦öÕàó¦TÂÛ"úém‰É;Î ü[å_¾Û»í %_nΛsøtä\ŒK–»Îù k÷­¾Ÿ·ÖÌÖ[húsKƒàz”¶v‹­jÖêàäêÜØ¢o²Þ73«C ;Ÿptf þM0sÞ›¯jž°äïÿî?NŸvüí—vhÙC™0Òà^¬¸×Rj!­#t· Df¦¤Ô{·”S &7*²-h$”’FêP\92¢B¦$•ʰ¼qhi°8Ì[ÈBå‡Ê½0ºÛ¡÷ÃQÊ”Š€â„Úë‘Nõ ;ÿ§ÿ¯±u`4C~Nj²0Åà` Æ) a07ǦÄ0T3ÞÔ8ju+,Äáx(Õ¼Ú³? »¡Ä¬¢›a€ƒÕ:¸[[*œý‚!•47+e¨©îVhPëJŸ•$fäš– ˜à¤ç±¿¡º?íjµB!¢—Z“ýÓÓw™ŠÖ$kF¼^CðÉ-%8ú09ó^ñ'ÑN¿'¹üãá• ãËìX[PèÝ'”¢!òÔoà~ê&p*0 &ˈL˜1¡v + ¡ÙGc*•(^ å8޼;õƒg"Û¬¾B!…°9ʱé= &"` Ñg`Ë“D»08(¯æÇ6i+³Ø~2êÉŠ× /­5Lä®Vwo1†ÂŒ j-¥x¨Y™œ^§Æ{ĈHÀ Z‡WbŽ0A—[3Ä8«Ç“(i=f$ÌDòÙ\DD¶W𳏧±eB¹3Û»¤£3Š–Ù…B:h»;Z&ƒ4x²š¢»bKåÅŽ¾\‰pS&ZËJßà´@ ®2‰©»°NY"C f(Ðþþ?þ ¤þñÇl Úì'+ÊKõâ^œ„’=2"Œt3)lF+®R¼ƒãñXË'Ì*e4HƒÂ;b¨®”Q‰‘R„öúàê©c¶ã8¢cõrTkåÓ€¡°X!û—£J¦Úøÿµã±ŠQÑÁ˜°Ú›”Èb´ÉÆ€9Éx˧^`‰Þ&¡û€6¸=€§ò#¯Úê>ž[k-óUËÿƒ\ðÍ·/0@þ.ö§E‰õ<¬-•[ÞË·Ù§øp+çƒĖ78ýÛÇŽ‡î8üÛõ‘zÚcÍ kÊÑj'>ϧEóú‡¾˜_ahüžuÄ3@VÅÍ[´µd´Ž.»Ò7°Q êgÍ‚Egæ’»bm½×c±éçíg<ôÞ§>&±Üœ/Ë`a{Ö}•zÆVKDzó÷+W¬6Äëî^ªôÕïÜØnW-¼×%½¤Jßæ6ušŽÜ\ï÷,¿9l‹›ÒÅOlå—öu9ÅF@ÞRÙ:³Z«ßÁ=¯Üé–Ý>”%äÊÛF½ûØâÛ"†ÚÒèÑZì«NG=^ߪ>7¦æº°=/Âß.uøÊ¸èv’üŒ¥„“””¾¢°bl¥.úJmU®7Ò©Çÿø×eî¤~|éÇ1zdK^Š÷Áá&! ™y­ ænz¦Cn왆â½õ±§$Ò$yªgv)Õ÷nÊæ(FcôTWë)‹Ö‡ýÑáp©…ËÃØ¿SPKzUöþÑhOOC5Ã~PoȤ±%;•ÇŽ¡þÏÿ£¿Ž©ÞÇG(AKÓ']x Ô] |J»M^g`ÑhuŒè=«{ô^jUæáåµ½ÅÌ}(‘½#³>}²®v[¦†:ŒcŒ¡Ô:xïm2Ú‹ #ÆRÜ<¢ VBÑ;Mc“•B+0WôÌr78Ɉ.‰ÆÌ–¯¾ó}5¦¢ew 0ÅzKu½¾÷O;ö8¤=zÿôü)¢Ž™™¥Zö¯/‡ÖÒËÔè %úqF{³Ïªúî€A§îæ P³P"¡ÈD-è ˆŽâ€ÏÍÑÑ!!§íSPÂĈ>‚203ʆ1zÒg¼u>|,Pâ8»ä0ø€±“z aØá65ãWx '4y˜Tïðw:LRôc­µTl·RÙƱòúPͺ™»™cËTJˆ~ò´¬b^™iší&ƒ 2Áçò¼ ÐÔlA™iRØ/É eLµ ÈR”WY±žeƒ‚=QÀ””Ö3¡É¥V–æÝ=e@1#ÐKDÏül¥›ðrŒáî0ËÐjгq/´”#"F” L— d$,íË0 æÇÀ®Lnö¥Eë鋆Zƒ¡VPˆºƒJAb2ì 4Œ#Ø>œß w˜Í¢ü" =fc²ª6Cè=áÃR?Yd•ÄýÄJ+1F­“ô›~™BÿWÓf‘²Ü4—h]j]ÒŽy-3Æk=Àëxp«,~•½êViö±¥ÄÉokéŒt/‡Ú¾ãºR®å&³d!ë}å˜MÕ ÍŸpQÏ_•¶çµuÖqE—¾h:þÍ_ÿs/¥|ùÇŸŽ/¯½…ænî^ÝkñZÌ’KffDJN¶œïuìi$€Á½’¨f""Ô B/Ž~Ý ®pTOc¦TÌ}¨ˆT*zWkcƒev¹G¶¡´O{3BÑÙD¥~xEkï¾×Ó>ÔãK{ý?ÿ÷ÌÀØ•]ŒvhÊ®èÙ‘)•‚j2À“ášàLvV°9¬ãa¤ñóçOî~<Ž’¬{'±{ÚõèRŽ­ » ðÐ_¡I·ˆ^ê§]é}l=sn:án·› ãzˆLÏŒ^‡½z¦‚ô>ö°H½–Z¼šH!Å („”Fº•Þ€ZÏx¬–RÒç-/ µCk]T±Ú£¹W²ãxlcN:<ÕÑ&–s“õ$ˆŸ ^¡½1»¸æä d'H]1<Á Æ å?ÂP@oÈ„rVti¯³ÌzO¢ê„e°§§á˜côd‚È¡‚6?¦„`O(ŽÞa€ àT¢pôOè¯Ø‚?a|…$¤£ÖÙ`R™GH€ƒQ`æà0c-%©.d)6ÉXµhF&­>™,‡¯Åh-¢GV¯ÑrÒŸa™¼g‘~DÝDíG"˜–¥Â@ sÌ ¬S*cˆê¢ „u˜qgFª'ZƒÉ†Á2qÈ¡ ¢˜ðÚÙB2xbp&Ð;Zè 4ËHíÍÝÂ1Ó(sÚ¡gfÀ(òÐ3©Ï†§â.9Õ3«kL@pÂdǤXÈÔC…à©”ßûëØÝêàöS‹—±W²ø›—Q‘gø~ØK¶DŠ ”…/ ³áÄ„ª_X˜M&\~2ž€ûÉ“'}eõžð‚ì*”>—ædRÿjdô1Ù›Í T  PñcòæÈ6O•#hpžzÿ5“f"#å bL†òý÷ÃÓàŸ>)Ÿž?í­îjÝ•ZmW†^‡€eq¸HËÈý?¶Œ [ÙOŸ?}÷ç¿’`çXšÕÝ3°²Œs °ZµäM"vkw™Eð ¼&­RK® ÿÚxUÏÞh@¼| €÷qü-TRWös«†„…0>ïj2_°ÞsHÊ Nv‰ºØË¨þÒÍ£k‹µÍ4Z ø›Úƒ®bÎ¥=Ú9ú‚»£E¹J…®«ç0‚gœ‡ @unY›¥ÑqWmz«ßçújÈ«0xÙÛÎ5ȱŠÌxNèî‚"ØJ¢óZèÈ.DçÏ2¥›Å ݼ¶À}Ìåë³ç¬¤÷Ucn ßÿ7ßòu5‡É{=H̵gÝà$×›ÏMú6‘æT.5¥W“ÛÓbÒsá!q»1é:q#îL%,zn¾ìŠË¹ÿæëB×ÏyŠ¿HÓ|›î¼o÷ýzÿõüþ¿Ç}åCoÒ·þâß àÏþ^æë}ëßÿÚãïhŽ=6ªÐïæŽøûÝO¾éGŠ¿çò÷¯dò>ÀªmêÊù‘ùx‘™\w\(·åX郟¿ØßÞ“:<ŠãÞÚ&/j¯W×±¨oþþä­þ€²BßnM¾—špSÄ»ÛøÉ¶jlß–01[Ö®úÐõ¼µÞYqk ¶îž6 šøÛ¿ý’"ÓÌŒ|ýñ¥ÆÞZ´A/pcu¯¥î*Ý¡¤&Å⌘We1ÒÍZ$•ˆŠDDh=¼çÓÓà¤2¼BjÍÅÌN‡2ýi°IšÞ[FÀ<ŽDZ“ÑT”iïHrÌJr_#3™ãÿò?Bœ´2¢w´–9yËFPæ”KÛÛ¸|‚"ÌåçÂ?矧`´2ÔÞ;¨ÃáPë(‚Ç×þô©–Á¼ºU­²( @ö(ƒË‚†Ž—ì2Xq³fánÚ±eh9‰Ì ÇN³h™!»ý΋­™Û„ô ý(VäžÎR÷ÞŽÇH”BÒE¡õÑKÍÈ{ïîr™!r”ØÚ(u£Yˆ_nFæ »4e‚˜~›t`ƒˆPÀ HÐaB”cRWŸ‹€q– RCo³(Joè#zŸe|N¢%0ÂÈòµÏì€2Ìž4ZµLC¢$"¢Xb ¹·1 Føu ¸ãx€U N0 ƒO BÔ:”ÊÞŽÙÓˆ®^Jq ¥Ö~?ù0$lôX£ÿÿê?ùOËnxúüüÝ_ü Kw·¹éYº¢™¯Šèüú˜cÕó±ÿ-Àmóô²”ð;¯2ßsjß4~µÖÅñ¾´nð›sÏu*±ÙL Í{1§ÖY¸oõQ×Wá.ïÑpÿZHãOt~®gq‘êûÏ¿j>]1¾y¢Á÷E¶ßJZóÒ´véã-¾¸€Ô¤Û¬tÑÔzO?ÿ| »¹[Ê A”k¸Š÷ÁOB©\ ô_ë¦ÒkTv£[ÿb@Á-ðaXð³ ›¥³Þ·CT¿ؤ-²ŸFó_ø}Þ;Éoü‡èß<»N«ï÷•ÈëÃï×Gìa>ø ×Ê`( ~KPâ+@½¹C¬]j ”5‘¯˜™ km} òß~`0ÿ`•Ç÷~ñµçÛß­µ¿c’¬ø8`òœ<ܱN=󦡥87á×›hãÒ/mîrøÐÈl`ÆËf°ë>f^]Õâ÷oÉi®ÂùUÞõÏûuE¿ø™'ɲaå¹µQŒù£|ÍêÎ~š_î*:6z÷z_þäg¦Ióô×ìÃ(PÀßþǿɈÌ$yørè-²wõLÀ|²þ$Œ^܆’4J“l(4ÉŽ¶ìЬZÎ #{*€ÁÜÙ;²µP 9“ÄQY‚™1xé %3""clÑ‚F3yÂÝ›ÀÞ#˜­á0ÆÁën(†8ÊçŽÿî¿=÷jI¥2Û¨qT´=#3ÒMyÊ9Õ¢¸ìRVgÎ6…hIë»]…(0R¤ ƒ—j4†¢õænLµc+C1ŠÄPë0Ž£zbç`*Õ2”!wWv3Sª¸9­GL¦Éb¹¥gŒcTg©%zgq´ X²gÈ3_MÈZKÜ ¦ãx˜¯^áæÅk þ¦šäÙÕuTvÒê°s³Þe_žÅk)£eô“Õj‡êgd"H +ó¬Î„9lŠéD9å­“·êD#hœ¤Õ¨/H@sÂ8gµ&Aîôê„)- ”R…ÌKú(Á cLßUø£Ê­£5ä89øÂsPÀ+ ÉÌ^@CÇ 3“Vœ$QÚØAy/$Ÿ÷û—£dF°Ò­»ç}‰¨Ãp_œ~l/±"M)#"Q 3›€FWÒ *h ;zcqÔ#ž2¡“»=ÄA 16É‘ÐÎ ) èݪƒ¢‘ÇÔäˆÛC‡˜ *ìS-­GOÑ0˜ÕIßI:&_•cdKí 4BƒQ‰1Ò¦DRP¢CþñË"zžýªÙ1Jöµ|ÿTFiÏ2áåØBøÕ¾‚O¥”èûê¯-š¥QŸa†œê@ŽÔɪa:¶íØ%3ŸO¥Ù¼7)„IîI“¯A¨ B´ùÃ)ÀáüTÈ60"'Ÿ ¡ eL\€“‰G™™“÷9,€ŒIR ÔáNC¡ÕÝÓSÙíU}÷<<}ڽʯý»_iÿÒŒø´«Ùâ˱e)z ŒÖ󱂯2â_þËÿ¤îwûÏÏßýÅŸÍå2\$]tɸµ0·54ï>ºEðÜRü>×H]g¿{Ðä=ˆà¥ðµqü‚=þ3Ì.¯ ÂW` ·!÷-šyGÏ%)ÿƒÅ,Þ1_»ÞÖEýyaê}UÕ÷7èý‰‹Î¿iâûx^­²1ýìey1ƒÒæ,ZiþܲÞWòI<ëלXÝ“ÒÚGy©5€³\¹}íÌç],…9/SФ‚Á“eù‰1˨pú›ó[×saþóæBY`¢ Á.EY;3.MdZ,Ûÿ—Ò ºøu-”„¸fç‚΢sp1ïŠ?ºª¬”N‰³ÎÈþRLæ&“;3™f‹ðÄ3†}*µpåH¾f7¼£Ãó4¼QÁ8I ð¾5 oy¸”ãå\iÍ|[9—4oÕ5¶,Î_êËÜ*ß\¾aRfYlK«ß,>o«Ý]áä}9^ÿÛåj¹¡Øq©XñL/äÆêÎÅ;ÿÁós<—@–»¢´-êÀÇâ·Â–åù­v’¶Áҵ앖×z£ZœÖ‹ÀmKhssÕ¥îvu­Xp'ÂØ•Ú¥ry]ü×úÓj£¾pãN;ï+½ ] $®UÂÖR=º™‡×’ÛsKW+ y-GàÝ®ŸÚMç$¹yTëfîl´o÷­ÕV»Äå¸Ú\7ÿzê™Yoó¸>o¤T.‡é&*zÞ¥.—zÙã·ÄƒVzi7M)¯#'i<ÍLâ>¯îüÛK-Ri¤$È@‡Î¢+BÆì |ÖZ‰q|'LpÈi ÜæA¦z’˜  %+…æH–`²v¨ÌL«_¾¸ïÈ@öê¢Cú+¬ÀËÜ”Ýúa^”d eH7Ÿ•J£ṟ±ßù®f&ªTîöûÈl]¥–PÔyŸ~êbqËYø°IÈwÖdqÒ’ •7Ë’“‡-À¤XT;-HÑÒJÁvpc? ;˜s¸1R¯cFZqNXKZ>—RŒc«yFÑ„a$dªQ½÷ÀSu7HÊ|rFâKÏ@žs}¥(:QŒ™Je$T‰Æ/­R?[Ì-$†âüj_[æc¯Õ(2-_‘ CN„ÍÒÿÓtò +8 –°Î4Ù2g¨ÝN1) "Áœ¥x¦ò'!¦.ÔO¡®ËûECLR1»øúÌYw<Àìô-œ­°­Ìö3Y…ÐäØ ¤Í5 &!—×â»òéÓ󯾳§OCuwÙõë?Ë¡Ö÷×&)‡}€–Å!F4e´c?Ž&ýåoþåð´úüüÝo~}e'…‘…ÒÛ biC^ø ´@+÷:=Y©î]iÌ·aùâóÖ!·{n»tk ·8éî}ÂûAHžµ¼u .²|«¤í$n¹åº8»†¯Ž÷wàÿ”îÍvAë€Jëô«ÖßÛþ‰µüÐ2Ã8ú\"“¸ ø™Ö\ÂT^ÁÚ+­ËMWÒ¾«’ —îa8+/¯rÃë ‡°nŸÃEY}Cºê>öOSt~JõN#½-:–¾¼Š–Ïú–²T4ºjC\Çü7è¦Zˆþßdù›…œŸÙ¥›l}‰‘QwG-€ÛO9áÿX3nô_ÏÕƒ% cÛs*L “š[…¦Ë3ž‚L)Ð_»òÄÂe­Ç{•Â,ºÿ¯òcÝ·æyÇçû ·KÀWqÌþ0m^ï/dÿ>ïâ€àöNöº÷˜ý“a<ª n‘ëß%ÜhåæÃ*òïhP¸%’ü‘Ó[]üÃ>Qþ.ÿ7ncøº›þ=±6çö?×2ß’°*]HïZ§?;”ÑÏÀ4y¯›ç*x¹{‘÷ݹøÍgâIShYˆYÔ'Ö³ð–p×Cù7ÿK@þÎw¥yh?`HïepUŽà·!¨ý^ŸÂÏb,ˆÂ£ä[·ÀÎ×EÞÅ…º2HüÍßüµ$3‡òõ~êc‹Ö§÷E› NÝaÆb¬˜{1!LJ:‚›ÑLÄTFj2 )I96Û×ãa$`оØs-ÍHS–žñã‹zwº!U‡=22&ÃagþÔ4¶4#Q~÷„/üöňÌ#ø¼/Å£HÔB ‡z¶™‘Ly9/@™zÒ‚Oª59';V† <íw„ÆÖª{d'éÕmÀê»ÃáøòÓaØU$é%SéC©ƒy8cl°ênÔ €±Ej$hÞ"Œì‘Êt/¥x^‡*¨Gbr²ˆdФ¤Hdë3 "-…C1A¹a€—Âa(Våfþz8$ôùû'eÖ¡V ÕêµÖãËòåÐ%´–cFÂ/à$ÚžÀ$÷s? JAŸ¤&èV`B„:0„OÕA,°I'!f’Y)¬EIE’‰' ”dlM ÊnGëJƒ)ºvß}Ÿ­Mþ†í€DôɆ7Q ²ÃOÅ 9JÌ2"/ûÝàÄ—/ÇR}¨u? N¾ôñõp¬;~Þ·–"ÇÞZkß}÷‰¬¯//Ñ[Ù—þ IªÌ͘ý¥C%Bi"PFWÉé=Ö™&UTg4š?d ´ƒˆÉ ³ÎŒ“Šy×Ü‘‘20‰ÖS‡næÆ.¹q0{t($ŸÌ:*‹Y%ìÊ®4Cˆ¯=zLÅ¢’Rñäе®£&saHªÿêyá§±w³OÕ~ý4´ÈíµÅs±ÏC3:ö0OBO¥´Ìž*F+p‡UX:¬NOe€ÛüŒ&L}òˆžJÊ D6¯Ü3<7™uÏÆ˜mVŽšK ÓÌœäª|®1dŸM2¦ R9+ÿX"Ûi7 ܘ«VçÀt@`Ì^38K cª€ (Õ s/õó§áóóðüi÷ô„ý :ÇÀóççjƽï÷”²”êÅÀÖ;"s¢@©ßüÅ¿Øz~úþÓ÷ñk]$^ù}âAóÈ­Oч?¯'øg2~f ,úbÞoWûx}œ ›ŒF ÷¾Rwy«éî+ívï+Ëw½oîü3_6Ó\ätu¼3¥«¡tôÖìàîàWL®«~jÄŸó÷[¥«À†#×ÉW¶+Kز¡œWJ§Þ(;tnj»g• ó‡绫ïúèê^1ÞæåM4ý“Ù%*ñGº¿÷F¨cw‡ëýcVÿhŽmÜÿH®MkÏßßóí¸Mmàíø[‘üL?ʵñó謿¿‹Ô[ûè×iôüÜ?—ç¦@‡Öì¯-'èúÿ ßûÖ$m4³_Ñ|û~—M.xÆzœþÎê%ÍËþðORX'h?KÔ矄2Ó¹íæÃ~ɸíä75 ÒÙ¶ûæ».ìš¿þ뿚âúÃ/ãáØÇQ³…™‘F377šÉ@3˜Õb0§°TN›])·LAô˜liÉ„‘¢ô:Æë„õ »3!ÉèA0³EŒ-Ic¤Wo‡N!Faê~j͆]:ÓÇc3Á‹ùŸâ0B¾”ïwñ?ÿ[ÖÆÜàè/ JóDOƒà“?!¢FAÃÊX2¡ÛÓtd9©áðz$‘™î’@ZI…²™ÕRÍÜAÂE$VÌŒ“¨¥ìw»Dv8¼NRëÇv¬E`Ö¡ÀÐÆ ÷¤Ì«ÑR)tsW ·¬¥ôA]éÕ¦ã¡Çd€©õ¢yI±Gv@o½T Cp<Œ¥ˆnûý§ãxœàc/Ö{öh0µÞ‡X†2É%QÎðhö¹»šrÁ¡"ˆèÈ>w#û0H3—"N(*„ì³_«e€=‰ jî÷‰h¢4ÂÒ§m$²§zPà “àÕ3 íØ‡§í•ãQ=Ê.l@4»¦§i OÑh€˜ÅÙ££8ÜAÉRüp8ND÷ý§}±RªÇÑ*w¨O»]FŽýXJ~þ¼ûñKûéå·HÕ:”º{zz_ІjÞ28š$/Y gÅ©W=ξÖ˜®,b$5 GŠxªè~1ŒMÇHY¸²Ö±w‹HN¤¼ö0á³ùKÏT fî–‰Q2Ï,Šhaù“&y- fžØ™ï‹¸R‡—T“*øÙÀkȉÁ½§Z¤$ŸÌxI7þíË(iWü/Ÿ‡}±böw‡ö¹8 Ï»2öxmáÎ}õCདྷ¥p_ýó“¿¢…'mnóŸTŽkóê›ûô1kédÌ•¤©>7Kñø‰¾) gÇÍès`ò÷¦C‰ Àæ¶ú0'培$0©ùOŠ qú‰èHÍÎØ÷ŵK&goŒ‰‘`f@0²bxæ¯ÿÂ?=…VjÀJÄwÿâ/^^»Œc*Fµv°R;³^«"²EöÞÇžþëßì¿{~úþó÷¿ù5VÝÔ—.Á³ýïIÙ™ÁÞﺹ°cës¤øuyw¦yÛÑü{´vúªXäÆu ]d[/Z< û¶Èµç´HŠVÚðJ~3_Ã?aÑù˶·!:¿Æ7 ›£½]¢ØÊIß3~W\ó{c>S]or‹GÙÛBiK÷cÛ]y§Z`ëj¦Ÿh*³à­Ö´%ž¹Káš•,N¹€‚¼eæ'¡ËÎsi²’7^l¿—®ãåŸÛ[=à —CB €‡Z[kaµ¾¡êsQ]â ±lù%“aœK$Ë‚ÒJ™i»7szütèÓ]ߺK_ªï7ÙŽÎR7ö&¸Ó º±•_~ˇÓçÆ y&à\(LÄ€1g¶Þ¢Ûôzü¯ÝJŸËÉs5ïWŸ ­ûãj0VÊE\}"ï>´K[Ÿ.~é sá®ÀµbÚF= e“eyqKjã2Ü×¶GлÉz\?ÉYôë#µæµ:N±‡icr^t¶«š×Ö>‹£ürœó*<\°=:ëÉsñ5YB ›µè‹®Æy?ëk)é<‘–tO-4-Ï­Ó´»ôóÀhuèòR2¼ˆXÝ º=§„Gå }¤ Åýp!u ÝŽæb¸û“»^DwOÑ‹¶ÄböÜ}x‹Ý위l±6l¼¸Ú(¯¢¢“ÃÛe!o콺ç¡ÎÒfZÈî-ÿ˜—£G§ÌQëhÑdqž[WxðRxå~ùf5nEÔZþè6ºPV–ê÷Uttý_Ä—«Z>ì¦ùG‹±»\!oV¿îF^‹u¾d—Ÿ7ï[)>i;o¹šl÷Î÷þöZj±-N¶½‹õ¥Åæp9øÎÌ^]&óåO„µ6Ÿ7z{ uIòVÍj!8úWõïiæfÇŸ^ûØ"²GeÒ¼ÔâÅiF©Õ|î§¥;sŠLÆÁjë1‰þ' šp0RHåØ1ÔèQ•^\ÌÒ:w%8¶Z¼ýøBgX5P:D ŠÌŸ]Àس…CG-#zïa)!'!sÏ£¼VÿîùøßýwHõc§³·¨+½¿3Z"½ &€è&+“C-Ìç°[œÛ‡§¢À„_gÀ|>~{&I¼0ÅãADs73«ƒ &ÉÁ„¹yë#ãØ‹£«÷Þ™p–ô©ÌÂd*ÃX)…b_«23Ô£ÓHšï ä©n…]ɈÔÔÑΓËî)ËKHÙVÜJ-¥ZôØÔ#‘Mmoøôô)•Ç8f`&ºZfd7%[ èDñâ^öûáp8dæÒ˜ÝLÄüÈg€U Àz½hè‚—fÔYÿ‡ð§ùãÚ­ÌÜ‚œêVM$“,Cñê1vuÀñøÒ£9à«P²¥–O-Ñíýu'º Äë\à1ý$òT™àŽRW £Éa™ÈžŠã¡xr×zìvEL«xÞï?å®GØ µ”zx9üôÓ!Jì²Ö¢4’6ìjÿ1;%i0‘ÑÅFî ar—¤!e›Œ˜í·Ñka‹spqȰDJ»b”«w“Ž‘= ¯ÇRSíD¤;kñC‹–:ŽýÇÈ?ÛÕïì\»ÁŽÉêþ¼+Ï-|9v»jÇŒ—žÉÔ˜ªi/ð:óE0©ó×Ë6zi½_èW:çÓo “G‚€ÈI(k~¶™€ ÄI©4O¾1kèL†ú)ÖÔIÆÊæØÌ-°i?„ââ?œÕðdSš{õ:x­ûŸ9ìwO^­e'\VøTŽ&s'*ÆZÔ2{ËãqDOeþù¯óüÃççï¿ûá/ÿ|‘pŸôÎÒž'.å"¡¾9÷o‡oåÿ6a–[„Q xç\ø¢\°<…Ìz\i*ê ”˜žØE ð&¬}þ¯Œfk,‹—t„g¥¾å‡N|."I-%’o4÷œ¤p–úÀïQË \uÓÍ‘Ó?\éŽÌï×Tëž5 Ék%Zòªâ µ5ÈõÈë[ä6Ø’°×RèÚ+=(IœÓ tó§-:/\Ôi–¢ó·YÎý?wGu%gíÖz·m¨‰^§ŸšP.^VçWV¤6ò£´`iGoÖ9¶×ÜI {-ªÕƸðdà¼{-RÈÓ8kk¹Ë8mº‹];çöÿó†FõàŸçêÍ–û]¸J$ïíBäò–3–oûàçÖ£ï3Vi<^Ïï¯"~Fþ0€¿Ýå>þ•,¨UÌ¿îÂôÆ&p·äð³'áF©ñ1Z|SN×G†C?oä®oh˜üœ§õ!ÀúTÔ› }¨/ã®1(o F¿²àÿAo±Ã6ênkÔgéJõõ¼©¯ä¼ÉàÛ+éãÓFû978”·•=¬Ëm¿bû¹Ý{—Áå×uÙŸeqî5\¼5œZ&+Ó ~†þ¯CÖÄÍQ~ûóÏë£nÃ[§1ùHhñÞÔ8Åmg‰ö÷b¤Xõ¤ü®jº* }hâ|]˜ý•çî: Ví“°ÿfOÉïäv~¯‹?Ëî;>\Ü'hêëÓ¤G³Z縥)Aüýßÿ•òú?Bˆ±O ã½T+V†jntÛ¹³J¥R§ÌsÊJSÊRÒH 3#äH§ Co‘‡1"œŒZ-ÇÑGîwÃøÒ©5¼FÙUš)zödF‹Ì,ÕÜQ+^Ž-JËÆbņ<ûËÑ"äÇòýóî‡O‡ÿýÒ?˜Wô`e¦8´#[ËãH™¡©N T ÆÙ\ôÜt3©Oࣄž3VX†@a·+Å{k€í÷ÃþiÔ[k­“tcëc)…œŒT/…ê$8™(‡,:˜LÏPïj-áV‹{DK¡˜Œì°Zô¤Ë¦xœÊù±šYFβQ Hö–¥øn_"` £ã¸v¥ÇÑÕßa(µ‘ˆâÆÐ±ÕM “ÀùH Àw(30š-X'lô„ód‡×¹cšå<{ N6­tŸ fm¨f§BdÀáh’¨PïÇh-#¦Ñ0 ÍÝPKf*,ګѽÀ?ÓLJ¤¡>ÚtØ;PÐÆ·%f ¶Ü‘ ½H/m¿"ÐÇf@ñºßOØ á>¡`|­ŸŸ÷V­÷xún¯Ý—Ö8öC©_Ñ™/m쎤H¸™¦Â ƒŒLJކNîQw*…Já$R°`íF aùÚ‘€nä8qn2ŸÜŽ„}ñ.ôÈ–jB.KSZ>•òSïMaÊÁÙSfé¢ÕaÕ”™8ô,B5NBU–ü®º ¿=ÆäÄ ·žà bWl¾ôø¼+F¶±Wã“[1~? f|JËdÚkv$ŸvþÚûkO{Wf’|š¦¹Þ6ÑDÌO:QSé´ÎO:yS'" Éˆâ?`Žè€àe*MEÍ«˜KDJ œmæÍ9Na”ÏÛ‚NÞÈ'œf^c€@1àîænC-»|7ìHãËѼìÌ?ýë%«MV…Ñ­¸)äŸJÀ¦ín<4ôP ešñéûÏŸ~õÃ÷ñëSžpioYv~²ñ÷(ú¦èÁ»²€¯eðCz[dÿâvwFrõPqs³6ÿʰ¨V|l”ô5'>ß“‘WœëpëÚìdq¤‘[Í>?'²$·çsÑaÃõn=Å?iÑy-M#®DçoºÏØzø<0¤ŸÝ¿òGý¢™âÿøè’-ïÀ_®¦ûÂ(ðÔŽwçqlòDÞ’üÐÛ»ìÑÏ{?Œ¤üòúÆàüÏv<ÿ&§ó/¯_^ÿ¼_×íoÇT _–ÚŸÆÞ|ÓfòÑLàkK71É""ü#[w¾V‹ê®Ñ/¯?ܨŸJüÓÙè¿fl û©èšÊÇå6ŸÜ°X¿ª5ýõ_ÿ•2½Ô<Œ‡×C;Žf}Ñâu?x-©ô]– À¹óHefÏìFÖâ$gäA9¡Û’BiF#KñîžJŽ[«H×Ðcww£9Õ;(ºqW-“pµ®."”$ZÒh`©Å7ïxk-üÎØóø¿ý¯ãßÊ Ícï/ dGf¢klŒžÙ1 {œÅ»§dfB£¡ìðô¿ýx 33Z‚ ™ÍÐ*I;½”2øóSI% 㱕R²GDWLT€<F¯^J A.ì÷O­µã¡wD± ¥¹!ú(FÝ•0µv¬¥ôhHÙ@swÓH§)32€¤»ÃsªÔÁÇÌRt3Ç6F´È¢×ôÝ®¢“ô×—NÃ0ìJ±È–4ö±+zvÊ.K{~zÖ—/Ö²¥çœS&2@ƒ ôW؈>+¨œQ× À šÔ0Û±JEõRH*ÊÜ]Dd‡œFn…(éÇcŒÓÝg†¹“@dFSb47¯¦R£WQˆ@ohG”ŠèèG0P*4 ›P]‡ÜfB½•IçÝz´ì™‰â¬¾CH!º^¾¼JøÕOJƒØ3^ÛñÓþé·ýKCzìw»{†èt""• Œ&FWqªb – m2{üÑ  Ž8jL(D¦LƒP ZêÑi"ÆŒoI$=|ð½Ùß·öS‹}ñ¡ÐˆpTg5¼@¥Zq´ž¯MÏ…%‘Ž”{·RžÜ'€»: `æ=ѤcSÏt2…>éÞG dï ç—1,Ğ܅â·ã˜‰Ï»RŒƒÛ«âµç§'ÿÒ[G$å+3Ú¾{ž«D0ä$КQ™sI`r_͆6”ð2«I(Sá„ÈIü‡0Ÿ-gpÿ´æ©p5ÙÀO¾ßsÅ`ž¢Ñç"Aoó·Ì´Ì<’È€ú¼@¤Ø:F/îÃîÓSv¶{ÞOR¸?ÿçÿæxhG N!3¡b]I1³z G´¦Tÿé¿ù¿|þÕ?üæ×àª=hÂv´f0óŸQ®þ•M{gÑŸ¹À²9—´‘i~ucÇMâ„{œé{ß$Yû_¡~sc.^˳l&~¼â =ìÊ⪚‚så$ŸpÅ©'·cöKG®Ë$Ëvê›þ¸³Ðþep·&é‰?LIEW7xzî ó^>iê º²Ä;©Ê,²û3Pâûðÿ¿xò.È9“ûÒ¥ýöz´¹PšïZ7º ‹1™›„.nÒíîÂK¹l5G®'̺—ä9Ïáú½ÛFWµØj›O}»uòþ«Ñ]Å7Ý\RÜ/|LNÞ—=b®ÄHV…»›)ÍÛ-ýRú]Š©­ÞtR…ºZ¼’Â÷®æâ¤éVã‡w!÷òj­öëõ—•Í…+úÕ ¼ØYLç%TwSFÓzëZóYhgý4®»έx×BFçPîú¾o%%nû̹5àÒÝ!Œ¹­¼A/ßÎ…ìׂ¿ô±Öž]í5P­7+\ÏÀË‘{#Oµ”ÓúÈË2Ï#rkxN›Ì¹—Dº]Ó7ä…€ŸôàAèj?Ñj[Þr¥~›p_•ìnܳøv®bÔtEˆÓµ¹Ì%ßpûjÎçÎc/M^­à3£KkÇØÛ©¯{bY~ë"¥ºn'9oZŒÃE‹ä.ÑêVüçú/Ó~+JÒŦlù9WúBËòÀ’:vê¸^‰ê¼úßã`“§L®†u ¶æÃ’J»% ¯5þ¯{®#´ëÃî¦åüÏö±ñ`_{0¨ç§çØôúB66}-¦ÞlãCIVò†··ÍQÓI`„çàù~~s[w¹¿Ï´‹YÍ«Íl-…¥EŸÙjië=©Î·©{i%lv™¾—0óB¶¿^Öâ‣ΖZPKñ¡eá–$þÌ•\‚o^ûßýÝß÷—Ÿ^_Ž?)"zÌJ¦fu¨e(Ãn`)=»2£±eÌhÕif=ÚÔi8õûgrÖ¬'2²G(² eb ’=êó@ ûò‚jÖ›ECóñnjع—]‰¹åñ¨1!ËÖú—£U/ß?']b1hŒ6öÜ©ž|ÝìðïÿW#Ì2»æ+jM™1veÀ"zI¦QÅ è` vVÿHĹGý4Òž»ƒ•xzŒm”ÒÝJ-‡ªýhæE½M¤ìÙùÕ v»Áì‡Ö^O^UÜÒ\L +bØ›û€CgeæÕlçC©ã8ŽÑI€–Q°„Ð%ÀdêJy—  R½ÏÌÈžéî È«kÑ‘=£™wZÒ XkMêÃóÞỲk9¾fßï‡C´ÞZdW ”ÙÁIÉÇa«°‚œ”ýOöªV`Ži"ЧNí 'ˆD×l ›ÐìV”â´=eiV¬8Ò@³R®ì­ ¯NÍàŒLÒˆ€è¥PPƒnHå©ÞA€ Ô‚8ÙL6°˜Á ’ `†è0³ý°{y[D-Ì#z¶ç§§èñÓO¯ÃPkõý Ú®>ãÁ­yµc&Š2s<ÊI¨úúetày &ㄎQ€“AklÓv™#‹‰‡ˆ<"I´ŽCW©‰ 1kgB&<ÈQèÀdÁ]h…6F:1¸ AHffF†4Fîˆ]ñ1ó5àà^Å_2[jgÖR-ÓO;Î?â(9X„:FšÛà‘ÑÀ¹wsã®ú?Ú8ö4š› ïŸAÇžŸ†ê#ÿá0†ðÝPêí·Çñг²h¿³n9£ŒÞ­@=‰áó¬¤?Yõ(¥"Ú鈚šýmD­æÊÁ%YjîÅNÐàð“v¿Î” ŸžwŸž­ì¼V »aWcýÏþ‹$YÝàV,Ë`ÅÇ&ÑǦ¼–ó_ü—Ÿ~øüݯµ’8+ÞLÛ!ÐNò8÷qÂõÉ©-U„ôuI€–°Ë‘x„¤h-)ü•ðÌì%¯d=* ¬eЗR£×VW07Ý H ŸMeΨ„÷zÕ"-o¦Ï·¦¬W"ϸC{¿Ú¸ ºf’ÖRôí¬JÎ÷ĽwâÒ¥éY$äVVäìbº˜ÅÎ+Tç¬Â²¤®¦ÂŸ°è¼Î Ò‰UÊo`<×:Ú\ fn0<Ž¢¹;YPq–­ž ¯Öêäõ0r5…Öª;g{ˆÍ´Fk}¦{®î­³KæÏÅC"ÖVË'¹w-UZ—X–@Û5Î1íš‹æ]o%Fµô2_²üWš±¼Îë×°=ÏŸ ¥dÑ:oåZÓg[~Á+â½âÝBs{¥qŽG ò>ŠïÌ…ªaë¢ÈÕÑôv~ø^0“¼Y?º~- =ÞþT½1›býºW+Ô–'ƒn–Ü#Iðe™ëæ xïØ}°8É `ôë>iãƒõÆlx@ä{JÄ„‚ôµóðcýfc앺úýûÙÐáYTõ„MxK  >^Å·1Œî¬"Þ­œ¿ïQóíåC>ºÿÛ]Ä|ôh%oÍÝQ0×ûž+ñ¾ÇvcdB¾ý]¼®ÓksQ¼_Cw ‰oNcm×ÜzÏ}}R=^ —ºÚ×Í® EÅ«Ì:Ö ñÿHë…® ïÛö]‰×ß^ú=ºïè)òZ]ýªþÀkô_k͘‹Œú2Úà#Tw£Ür‹ßÖž´ŒøÉ7çè·ÀŽ7…âôöƒÔ{pvH;¾âL½{¨¼ï¸V¿0ìµUß¹è¤À7‚ÆŸÿ´n ùs›ÖÒÿ×£¤•Î-75'73” À¢íâ,ë|ɦt)HŸ3$ÝÈÙ]Úþæ¯ÿª¿Žý8ö69»ÂÌèî>Ùž’µ …”Ñ $¡Td )L À$gR'2³pÂ"Ó¤ì ;ç‘ó} ¬’VŽ# 6oGôCu%2Ry}QëžÅìÙJ³~Úà»aÞÌæv~CÚ+Ì1 è à‹–|œß<ìfà #„IÜiÖûš—¹f«Þ‰v 8…z0€Pƒ:R° ú%Ü€è`sq‚@ï(é…>ì¿ûôôùS}þäu`-´=ÿìÿúƒÕž=Ý«—1iئ Ñc;Ž96'­øù_ýWö/C7ž!Pž1‹ÓápéÕE±ú¶cLëà +]¯q®Ï%.&mö¾#ÿäWÀ+7͸gwÌ»ùε‹°DzXòßläâ;1¤Íx žC=”¡äMʶÓV¾cù>’-ßü¼]ˆ·--æ?œômÞ'o$GËÞ#¾Ùyõ¡ÅþG÷Z× Þû*oãÇO-35·öо[OÉ>4 ~yýòúåõËë—×7~é)Ÿ_^ßt:‘b‡zJЭ3%þéG/ú%Dûg½œ)á»"{ͽºjØÐâ2uú›¿þ/ÿð%ZÏÞ3e¤7÷2ÔR«£[dŠh½™Y13²GdJŒè:7 )Ó)屉2·ÈœòF êÝj©ÖÑ{ü؛Ҥ•20¦.izsZDüö ÁvU$#Ñ:ÄÈ¡Î]dµæÔì›´ýóáÿóÿ¦ ìŸ]™“ŸnzM £ÉLeÍŽ¿@Ÿ¥<Œð ·¹ýœÃ¬ßmp² ]p³' fð‚R</¯?ed&Êà$YÔ³‹=3Šïª ÑSÆý“ÉzψˆÈ^e¾Ô},•ÅžºÙc fQÜiÑ2l »÷h…•t „,;ϴ̤‰& ÎÞ§µP‰Öz†¼B–®Ê =˜H¯¶«û¢g¸XÑ£»yëÝ‹ÁXK³«õ^|†OŸŸ^Ç/Á.YYZ%Rá; ý˜„I@ˆ˜5[Æ#ÚqÖ\r‡&º@8ÙєͭìlØA"3dÅ-$§™SÙÕLSIADš>Ò Ù3£Ý$%¢Ÿh±°©ß€¥"ŽˆÀ°ÊIÕ]#)`p÷}yí5ÆCÿî»g’½Ç÷ßï«{?Ä1ÛÎöãÑêð ¶lm< aB·x=|q]FÀ¬²0k`GàÀØHA)8š~j2™²äQ{V^ƒ°T¬ðéÀwd$ÆPË|"½š“nÕA—Ü™%…ȆœÌ)ÆcÊ)0 íÏvNÙO-ZTöÅ yìÑ¥b6Ø„{íY‹gäÎX"[Ÿ‡òÝS}i}LµÌê *¿ÛWw¶Ìβ›>ö§]¢¦¶dVƒ/9*aÃLÈðŠLô¾ÂÐÓ2!òôp'#â>‚†z* ”a÷•0œ¦ëú'ÌNß'bÊçt0‘'£wP8³Iè§ù\‘ õ 4렯 ¼0÷ZŸž}·¯Ÿ>ÕÏFè˜*‘ŸþÕ¿T& ‡±—Z+½GƒXœ<öÎHôž­`ñõŸÿçßÿå¯i”él­1»žý?Ö›¿¼~yýòúÓzý,Ñù?¾»Á"ø½ÿ® q Ê»ë÷HÀò¶brÃ2žÿý,C´Ú¼áX¼yÏ€TV?ZWç¶A—>#M%3¡ã¢öqOCéºò, 1™QˆËî=.KVZ´.-•…ÎFØguEâFÚ‡S÷óWk[hó9~kn“ÝõŽçG~ô‚.¥œ%€MbÖî[Þ4Y¿k²=žˆ7z? 6 î‹õð±Ñíú¢„«é­üÂMïÁW™ð®LÓYvÕx¾^(äûæ©ÞÕ«-|hæ_Ô´Íï[1]nzN×=ÚhúÞú÷ОûÏ"”ºˆ¢mµ“jñ$¹µ ¯ö5½Évyï‘pwvÞí~@+Õõ€_o:WÚ7+Ù«Nð³Û–¶A|Ïâ¿›ø¢eôCÃÌûËéÎnÏÑÐФî©7:`›ø›»lvšThòqõû_ªð\™ú>¾ÍûÎS·4‚M${9Þç,õjVÜ.rɾ|ûæ;:Œ—o]2Z—kíÌqÕ%¤Ó›2oRp>ê~|ÓæµÉݹùXmzyýnJ ÷™œ߸¸ªmjÐF(öVì¬w±e®ºõ•ëôá³âBêw'û©› 5yëhÅî9íÕ'×ò%‘7¹Á,l*.µ÷$ôå~û7õ×Ù#ZÏœ›¼Xʤ§_ëP†êµôìqìÌ©c‹a ¹Íôƒˆ³¹vJ³Ä¿zG& eLnºˆÙŽ-zøÓnJ&ZëÇ#¾{fq³#AŽ)ï(Cm`¾‡¡¸Yö´R²”>¶ha­Ç§'—áËÿëÿN2!(3R¢3FJ0”²©(€¡§žôLx…;zCX€ ˆˆÓÞPHpn6C)þôü Àáøj@}B2»­‡¡ì„â^2¤£²*µg aå8Žr77K0C-1¤U–êÏÑ##SNk­E&Ó”°:[ÃdÄtçS»=âŽvì“öRa¡Ó‹ÌDS1J¤À,»ân™uÛn·£³G[kmLd-C󨆗ñ‹ØÝ!eÇÁ(gDuÖω¹ƒ~ÂÜ9Iµäºß•r=ˆ ±%óMQÆÐ¥Ý~*¼ÃÜ}aè¾Tã9‚=‡œ÷>ð̈cn!JÛÑoåH×7²ÄQ7žßÅzô†ßÈmQÞÚ=Î¹É ] ½O0a‰0ÞŸ|Ò]RüÉŠÎ_bÏkwßû–ok‰¹ßšñuZšK¡¦‡’az„tœyF:Â;¶]¯J.ÓËó}]QŒuÒAžìÅ8O@K&î2]èP='¦,‹ ~y= VÌ…3­[ffÕê¢F°Ð¿×r;1hN·Nq–äØFt>µ&0/Ä…7D¾¯>î,Š´¾‹M±wá®Ð$ºدZ¥tYÏ\,áüxž½ºžã—äJeëm ÿ¾úÕä[ØÆyF.&n†ô!l\›êåº"ÍmŸ6¼Y²¼%éFcŸÛÇëÕÐ&;nCï…wOŽ5ÈzSÚÀ†´ù£kiSÁN»Vº65Ù>ûô¨@yOué„çvÅaóɯÔU®Íh‰ûè>ô¬í`äJÜGréjTÈÕñZèÞWÞ‰Œx­ Í•¶4oêiZÀYÔýBµÀ¥˜5NÕT=®Yßdc¡ßÆ»º’MÙVãyg”¼Z’odŸäÏ>Þ­Tòºz±QÜX¿0ëÊáán(¬;õ:mŸ=«óðÜ™øvzA­å/{ß,zw¿7Æ•ÆÝ­Ö9 ØòQ¸§`sõ]\ãùï Àpú¿½€Exô@ÜU›u¡sÐ{Ny–˜þæhåwyÏ9n;LJKB5®fãò_>$Êôp–.“bÕ—ëâöS ®·z­”ëäˆÛkó&é%ïÎßóþ¹.mݱ޷K]_ïÆC³ÂuS’¸Ö?þ¨÷µ¤‡)Ó©_æŽ~è,+½`lŸt­.Šž¸Tg!uSRåÊêé\Êi\ßçËxýí—>ŽÑú_ÿ‡¿=¸ÙÔøoÕ‡¡ú0ÐH7™*¥Ð,#il­M(ÿ¤.-š2§þßÈÌÈ¡T'á€){¨G)nD›™•>š 1L¸ªíjË‘©ãO¯ugEÀ`Q§ou¤v‡Œl_Üï‰çýßÿ?ÿ1FF³¤2ˆbR2s)ÉÞHÝ&Š  ¿2:ÊNtGï3ÎëÃÉJT8¾ÎÀߌN 6À“òON²6D&2à:,^¿ÐÌé^Ÿ„–Ì^Ê®ËDDŒ%e”™îæ>D¶vh­ÝXw»cö‘£l¬Ã`V³ë¯Jìêî0އ8‚ %‹d†¨eB%g¼2$0Ž=…LÔRJõýSéѳç±÷a¿w‹ŒäP‡ÌÌ`¨%ˆJ“4ÆÑ¼}ìÍÝ( »Ò4Ê‘)Ó—Om×'Ùøœ1( i€è»É'Ø"2Cb!©qš§ÕŸŸ­8Ü!C–ã+":½œfVй–Ñ' ·GšÕ]1C°9=#ѲC-È,z(ýÿÙûÿfI²d9 s8'³n÷쾇$Œ”dš(Éd&Qúþ_f4˜$‚üîÛî[•çD¸þȬªÌª¬º÷vÏÌîÛ²±™ž¾u«2óüŠðwW·’nL*¥Â }‚´»Ñ  ›bDÀÀ$ÂA™N3óÓ×8õ©›Ìø¥êË¡ ‡Ú‘àaŠ£zW´j!£™'¹Ðú$p¶žhtŽÓ…^S™HSÍž,AºŽ)&¦¹{=Õ-Ii4˜›º&© Nœ2§ÔXœ´L¼2ÆbpðÔ$†Ã,Ì:Óa >™˜RèIáà|íù»-4S¼I§=U3ë™-³g3¥Èž9k~¥Š“,ú1&VxRÿÛ–næ…'ÅhöƒÕÓ1³‚ŽT«1•EC·fÙ¹#fýý\è_  (Ìrþä²÷ñ¬ãoåjÂrÉ!8ÛùbQ¦"m©KÑA[l~ã„ÞáV¡†èg³Äùw/s›˜E¨æOX$x½CIdPº ÅKÅø ‡È†*ûü7ÿ{D˜VjÒj-!;öR!<ÑR­gµ:‡²Æ:Î ˆnµWÏ¢ ±ÇMö§M¿å 5bzû|¨]òyo‚ô¸—i ‡Ýk‘¿·Ðð¨µkÛîäpùüÝØqåìâ³ÂÆ&'žˆj5º;jCO£—;­˜ÕH»ÉË寅EtÛ^¢ÝÀð‰Ë°å¡Û{WÆâ[•­» €«ß'ïd‘nSCâÏ^t~Ó}òp_vx'„«uÐyÉïÞ;<誓ޣ§ýÎ'~b^øžWŠ`W€ö/îÝùEyp17z¡ÊóŒ63˜Ñø¾®ŸèQ}€âðÞÚðãõ+Ûþ××_îëW!š?¡çþ'<¿n‘¿¾~ñ5¢”ò>êøPüò½í߬íaÉø®MÂÏÕ+÷ëëçÛSy§Ü©¹}Õ¥r‡%l¼·ÏÒv2p¿øúãøÛû¯þu´n4‘¥+œ‘¿2 Ã8x)VݸÀ¶JE&Bx±Ý,3/ "Ifœ¯×H™I‰Ê‚4d‡"õúãWµ>~>„[(j›Ü½“TTX:3¢Q6ÐÐNÅ$d¬þÙ‘ùã¿øo¦vÊlÙR³'ofážnŠ»gÞ¹¨‡)Œ)¹5è mZÀ>«€AÈÄ d_$>.µ|ë*³îÃÒSën^J„úÔË™æ*céÞRQk5zt)Ó rÔâÑ5RýKËÓ ¢÷™ ë¡."{ö 3+ÅYQèÃ0œÚ/‘î®Ø}D-Þ#gEr+Kß¡£t¦¦4Ö…|ýš­i|©/¿±Ì)ꌹƒ=Ò -[d³HÚXÇÂÎŒ~øôyê M]=‘‰4Á´´HÏó.à³* £¡5å<erj6ÐêѺÕÌI3I‚Íë@SÊ ô”fáeEf@r´ž¼.VxÈN˜gŠÎáSm_´nB‰‰$èP T Ú ï’È ã‚&ÏÐR À‚RÎ.ªÝÊp8øY„lšR˜:¾|™ÆÏ‡RKoñÿÂn`ZWö–MÞSDƒBÖ Â†êŒTj’TÎ…êD”àÉ"U##Õ( ž¬°ž08«ñ™"îNÌp<‰Lr4T`L¨’ƈB#ÍÊ\Laë’ñÔÒÍFsS¾N!Q©OÅ*y¨Žï w¶Y4 ,fôNŽ•¯MNXå8˜a’k¤;ìÇVà;ãK6uXj¥JþÞOÃr×Td@«‰€ÍO`.”þ¸¶<Íjþ¼.wØÙ±c†õ­ úÙÇ e æ !Vû® °‚ìˆèðç¥ø\J³9ðRçm€`¶ø/ÏÑ‚8@Eëå“jE…Cx}í°òÉ_þÑ?r÷ 5ÔìÑ;õÃ8:T²g—ˆèy:5ô̹ÊYüÿðÏÿùoÿ£¿öâçS˪[ÎÞK¢~}ýeDçy²Eü]L0ßžåß öýÙ‰Î;öûGÍ8tÛØ#r[‰ÙËþÖ…˜ \,M/*w…ÈE’ `ýµ|$ìÂKÓüõvæW¹\Æ ]ßP„×-^ž³Õ;®En]Ûÿu©m-´×bO‘E«ÃºÓ³à¦ñÿòí|W@·N»=ßo >ßI¿a¯›„ùKK+ëß_Çô*±³<œg­¸÷ä;>»äŸ–|bºChù&žûïæ­qª~"`t§qúÙÃ[¯»EâÝ·÷T͉)MÏUYîz.WønË›w=Å ç‡ws¿@ª½–v>2¯Ü6»¼ë]&ÙïøÝËévAÝô™ìi_[¡»Ðþiû¹öžÓGïã¬(½:‹V ݳ>~©ÔâNzìkg»~Ôót–ü±“¬}˜›/›W ÁåÉHÚëÙÁ¿u ñÙVüës'ûµ¯êŽ»zÏr]»þâ†úµú­[VìãíbúÜu§½ÏåŽïQ ÜDbÙÙiÈ¿ö½s{?7¾QYSFnÖþ=à­tcýèÚæ¦ò®oï3^êøÍ•Ÿû–¼í„¹W óš^гu3’¬*Ì-3•36™­‹¤;g›Ùyâ9Ac1¡w›EZ«$Rqj½·îÖ§Îêµ[´ÖŽSªÀà¥Ãj ŠP±:õU 8ý7ÿ-¤ì"{3§È®Q„Þ”VCBÊ¥ˆ€YÀ³T‹€ –”YÖY„^’-ÓI6yX `Óàs r" Ña³L.˜£ ÌE†êó˜dJ‡Ã!Ñ_¿‘ánêP32•Y¨Œi:*rj­·4rán{-52BéÐ0%¬!ÒÚ@¦O F¯Ü­Ë\Á‰è½Íèÿ\Ã2äÕ†RÙhHX-Å‹y!Å6 ‡†¤rFíðrˆV2òËë—¡¤§Å©Ÿzö)3Ë¥G¿ÜjD›¿Ž:¦ 2õÙgÕ)>¤lFcòPR@öh]t/t¥z‘k;‰(ð:ˆ¾ü³Ø­ŽOÑæÌTo§laTad*Oê0Ð2[kS"+XE{µ?¬À|!O˜"¬.š0LÂè^Àã§^^~{xùÝïœ^LœZ¶ÿíKd(ûë)L>z*sâ×V«ÄlG¾¦ªÛ\m:}Õ(SŠsí¤+;Ò`E>1f1-`ξĂÀ*¡tU°‚?öL€¦¦$øWÅ!L‰ü$T’à)²åŒ ô&Œ S¤' 6CK¼ö>/î§Œ¦,©PÀì+Ñ"‹Ñ‰b,nÅ8…¤4³êæd&z¤9à e( ô€äYFûÍX¿öž‘‰<µÐ ,É"9F@:IÍkp¶Ù`]ÅùBj©Ò ' rq™ÖLÓqÐ@,N^ÏNÔóFë¾ø|”$D_tf`/K/;²Dž÷Û8ó*˜IB ³å2ÔA ‘D"/Q¼”Ã'ÿüI>šË«­EôV1ÀQXYÐ{IØP0õŒH´ˆJy±úrøëø÷·é¬®•ݶƈÒä3&Û£ŽëóO7Må·à›çåmW'íñ‡õoÄfWymí=‡‹ÚÞÆÑ7x߇ ½¡ Â5`ͨ}®N¸Ô-ð¶éd×6ƒ¼oлŸþ3)DîýflWÚoß#S‹ÌÇ£¼q—ü,:¯»Î¡{9ã5?â,!¿ÌôÌk¶õÔ{œòIÖs³åгPΤ•U€½ýÌu ½úRžIcÜ rr»*Î _«I·u€…³P1ÎÈá&yZQÑy·g(óqÁ³MÑŠì–½²ãAÌý;纘¬ ÿs.±Qd¡®›Ý=èË›_¿>ûK‘A›š2× ¾·ùöù©ž- ¸E¿®'º6õÈ»ëZãggAlžµ=®ô±TôF¹Œï9ˆ´9åv×%7§7Ë’¶÷óï¿"—õOíà‰x†3ïì3zzöoØÿz™ò!VòŽZÀNö¼B1¤»sKØÎ‰øÌsòF)‚Ûbƒ¸{a;GĬåFÝ@²{ÍÜÙÝwžÎ‡§§Å=­pG8þÑ ÜcÊZß÷±nãšÇg뼿ÇlK)z­é~¶j;ŠÚ3^àv³Þ‰ÇtÍóÑÚÙ™3{Å mVó.§ò=•Mí¨èÜ[@êaYa_kÿq =2itÜ4’ò¶tuQ\!wµ _6òát]I)Ý>û(ã¶(½Ý‰/ÛÍ6uVÛ¸ÑU¼ïÒb¼°‘ðÜ,j'ýY‹º†óo5…ëæ1<š†ÜƃZù줬§Í^Š¥ó(óîóïb\¶‰»XWùÂëeÜy <ÕÕáºú*ü³béž»¬µºÔ½#à t>†tß“æ57¥êEHá=rƒš?“ŸZ•¨¼8f]I×oØcï*ª]žÉÖç ÌÊÌ·±ã}wÒü.J Í"*stm¤Î1#uμpÃúÆáÇ¿ÿwÿvúrêSk§–™$¼–Rkws/,ÞOGMSôP-zï##C'äPKq—±Knœ5R3ÉæŒG0d…‰ŒÞköQDk§ª§ÌÒÆÑ[¶Œt·C©˜Zb‘Q222/¥fBI³êeäV9¸À$ˆ°”4'œ(D)ÃH³½‰šµõ‡>™—6õœ¤))ªgë!ȋӬõž-n‡‘™JA‘€|tó@ H³Íƒ„˜ÐsxY6}s”²ØD, ïâÙï0l ý¶Úo2SùêðÏÕ‰æ¡v|mS›zšûËoÆÞ"ƒý¤!Ó !;µÀÑJŠƒŽ‘Ö‰¤ í„\èC긴û™Ï.†&8¡|.nºHTH‰‘4SdbJý.ûçb˜PȲ‰)U¡'šÉÝZ(»*Íz‹’Ý¥Œ/nð˜=ÅÌçñ0š!­‘FSŠD-Ö2½Î0:«9¨Hõ€,ü!³Ó”T>œï·’>dp_¢x·Ïê¶üÈ›¯xûºoó} n@ ·‰èíš¾ŠpmÊ»ûIÛ,œWPî{, /d‹éÿg«‹ø 5€þˆ8mŠþ•€÷§÷úÈ<úi<@ù—÷„߈ù~]zêf¬?ù¡üuùóZ™o1¾û[øÞ§§çÈì».€;4©§6¹2Û®né÷˜¾¯ò>wœ7Ââ÷0t;îßÃXå?÷B½@%úØ(KÈs‚<çX¶<[åê¬ ›w/Ùºæ¿ÿÝ¿ø1uƒeæ4µZëpD˜³ JÜ ¥ÐwËìqR†¢g$ÈÁ˜dÐ)dÆ,_ÏY„p,®³„2#{öÑP ¤Ð4…2}™éÌ¡™‘®šÙº ž’¹y$ü—ÿßþ:eïì¡Ö¥Ö{ËÈŒNK‡a¨6¶SK5+5§N JÑÕPH$AQ²¹5¸ˆ†œ…ÂËù¡hæÈsg¿lé…b€±@{³tøµF忥ˆ]³['hN¢x±éÔK ²Œè"i@¶~š¡í˜af"¥º{=žNF½ʬ4a¡,ÖŠq 㙬ŽVÍ’!Äð´#N_ÑÛÕþ41« Ð­DöÖ2¢Ñaƒ¼1¢ÆXë¬q$ËRPýSd늃•H/ã¡D&¤´‡*ºYMû¢ÈÓ”©!å—vl@@Qæé•(ÎZêxüñÄRýðb0#à.¨êNZo-(=##ÂafYÝ-}±Éh¯]’Ñ}ö¥˜2—"L˜æ¤B,…ÔĮ찤››ÆžÉÆžP@À Èã+ÊaÑš^aX†™ÊPe¡¿"P‚^=4}ýñÈÖí”f8¿NÇ#à^ ãLjÈfh™òPv ˜R +Pˆ£Í²?p©A•©L)¤Òh%ó‚%&O$ØC½33 .$%t$À œœB!90€‘b¦dáJA=Í du«Ns¦øzŠ)òs±(”Y¦2K½W? näqRˆf‹O™Çì]*µÐªE—9k`-¦®HᥔÁíØã¤°ºTA§“ˆ…vcVὉìKó~—¼Í}‘ã_:Õr‡€vB&h(Hœ  3¸#Z.ªýs!Á|a $‚ ‘hŠ#…Œå°”ÖJ]J3¬9W#2h„™º™ƒFXÃoþZÃáðùÅhShúÃëËK-Ò$Á@Xk]òè½z;µÈ¤ÝÿÑ?þLJß~ÆÒ€©+¤»mðØ"‚Ä –Š¿åWþªpû†· *Ÿ‡{ú©å^î¼v¾—ßþá?gföç%:ÿ »Áš¾úaÀŸPºË-ÖÎk?Ú[ñݤ‘gÙÜî«Ü/Sm •çÎõ#AÞW3uiãù,gÈ^ß¼7^e‡ÎÕí´òFüGàN›½ñÝã?š+¿ëý«ÞÚ=xŸnF¬× §Í2~Ï”Õ7Îñ_ì ýØlúãc8<¿c—¸m.ÐG} ¿õÿL ŸŒÙOˆ\­ƒ¾·Îø™²¹~þ”Ù;/Bß°¡^ÿ×Âmé^ÛYøÇ>BõÓçüÖ¥òÖ¸Üë{ŸØÛ‚WÞoÓ7vœ?ųx'ayeH»ÃAÞ ï6aÈæ‰<ü­áMÔb+§Ç†Uú9fÞ› -lœç ˆ·Õ‡€ïëØºI9~FüŸ›´íÁ¥è#MOwŠ{º×›r³ë[&ùÎ%¿Ù+Éw-¸ûÀ…C©Îoبvyˆçþœ'B@[¦%."EgZÒº±l#ÝÌ%8›ÅÓtÛ ‡û¯ÿÕü?§_3B;M­õZНC)Ce1˜yµ:TeRŠHJá˜Ù{dZ))¥ÒáêA·ùë"²z)…ÓÔ efd¦IÕq"…’†º¬€¦@¼Î.±–Á¡ä©£§Ãa¨6”öešþÍ¿n-ÚñÈNáÓtlm2ë­7ŸŠPÀ0ç§Žn•‡:Ê2zÏÀRÈa0!ÍÎ{wÎŽÅ‹H7Í*á†RaŽl Úk¾øÖÎc8ç6$À\38;‘ÎŽd¶èê©iê9éÀ„’™¥.â ¥‰Ñ3»ev"33ëP„"2SÂÇRJÈckV ©ÁÉœSO#z¶¯_;]q´ÓÄZ=²G—•«øÉÜh™)1h(KaÎîÆ…rAhìVjq7+J3ÈÂè½OæCåÐó+(Ö†ñk{=µS(Ýë)›€R½e ç0VÐQôJVÇe(Þé,¥(R”2•šäÙ/Å@ftš5;XŠXB†d¤Ã("=Áàt™(DŸÍ#F©ÞF%œ2{)&¥IDHVAÁÀymëËfgÕ—@9  KÛ8‚în,^FôÌ©¥ù)&ôˆ8}4½6oE¤Œv ´ÞÂ]Sv›ÏV®Hf“ÁL2 a™ê)$ªåb_Pœ‹ Ø0‹d@¥1U;•èÊ“Äè†:Ó ¨K Ù•P¥ FÁ$‘²d„ŒöÉ7„ZfOQÝþqJ½†q0+@¤s( ék 3j‰TPéFH^<<[ »ƒâÔYh¥Ðá0YÑ×Ö_Ys®¶Ñ¶WèbPGïgD;ôBqvë=Ÿ‡—Îä9,ÊóE;(ã¢Öe¹”1/ç€×Å.{Öš¾@¹\ÌôÃÈ€Xl!3ð…âÀlµ³¬à€] ÍÜ$' ëAãoXkªúøÂaÍ?‡À—?üÁþuòƒ¹{LÐ[iš¾~9E> ^üŸü—ÿüó_ÿv{öž[¥\å¶Ò½ÊÄîµ—oÃ5îV7ê MÝwmr¿.ü¨¼ó“o¼°‘/çò²ó¿>Œ´Ÿ0¾pe¯Þ‰Ø|hD®ö¾ïDɵ•¹g(¼áRõ¨¼ð¨a|%¼ÿ«ÒÜéÁÇj‰¦ôí ÇßyÑù' SÏ2lí˜qß¾ ÜÑ»úéµQØäÎ2æík³â„ë¸U1»IýÌ;1åu±’ÓºŒôŠ«ýHÚç¼ ÿáƒ.ÿ²ùnÛ¢f2óyýñ.AÆ"SÅÛäŒÙo›©ô†úüR@ÖÎí$9sj¹)´‘¸rd®Ò^ÜßÚÎØõª¹Q¿Ø¦¶\‰èoåb.£®;± îbîç›»Hù_Ö‰—¯^•hÎĠ̀ëf‹?í‚êêW®=´c[Û[þæ9?ç”Zün¹T¼kÄ/æƒ[U0Þ\oö =Uо4ŠVÊ™jv³ìîZ(Ü4jçÉ]oîÞj}^…WPïæ8}\ð¼¬×ÀÏesçZk=QÖ&MZKŒáúÓÍÝ” µ?¸zËãöž®RÁ—Ÿ¯–õåû¯uªYDðÍÒW§ø½ó¼îþj0Iníú¸x+yª:ƒEëVÙM¬ò¬@þøŒ¼¬ñíŠYGkIºË.ösùÝ;_<ôóÔÝDÚò÷ ®í1´‡þ=âBÝœpÂÝDÞÞÒŽÞåÌÓõÙ‘ƒÚ…­× é[ÑÝmw“\¯'î„›+"'B„ÜrA÷Ö5*½ahÞDrÒ:(Üé¸SÉ¿èê^S·_X èßèïo>™ÓÝž7[Ÿ%P[íÖTä×ãQÃU³Ï}(>zÛ:ÁÒí1µRÛºŸNgÒ.µyl÷wÆ»I)겉]ÕvrÄ˹Lîgg;´zìiÔ=¯ñVÞm_èyç¬otÝ^°dGÜîxÁ=1ÖÛeï¼­\%iªR‰\kzžƒu» /rIçú¢Áúoÿ‡úŸ¾ûÔúÔ•iîJ)fÍÊP}¨"†¡H‡ÁhÇÖÔz23»"ÝF•2ÇÿéF÷¹ž`0 BÕhH¶ ’†â„˜™‘^…èÕèÒ±{-fȯ§×דÃÌxŠ6|PÊÿêÿS(õ8~ýêêìÙ§Ž £!á43OM-"Ì1–¡ŒÃÔÚëñ5”€ÜŠàm’Õ,n‡—Cï¯BÎæŸ˜rgðÃrü’3‚??Fg  „W@Ð#ŒÈä¢q¯„D8»`FB€ÌPB½·„qJïirî%·:÷ .×èé–;ÈÝþ*ʳ“¢ž£‘ÕÐó&ûØ";ë;X75Ü(Ø\F—Û¤õ·ÜxzÍåJˆ;³\©×ã)*õg%:5ÀµJïVÄ­4Žîoq…ž;Ðø…®dó·{ß×}W˜Ùáµ_…q¸¶7x*¢½Í}øh3ú^ÀM‘@—•½µ•%çö>.˜ž›âV¾Ãï­Áîa:+®jãÇ«.¸@•ú8€Oê‹8WHÞa•òÁRêu§åÛ"@7ØÉ}âŸ:àCêŸøIïÜØ‡ËüYßþ¼~všâF>8¿>ö•ü%Ÿæ-à§ËŸ‰ð¸nÿ(¹÷2>þPòL?°6ŸqÿXj@¾‹<Ëõš«YØà›"…Ÿà¹€Ï“Y¡ÝöDñïÈë&uÐÓþegÒób>ë¬õû·çå…où½oû€9A¥]\WÎ b^Âú;Ÿ°íÊÖ¯ójýwÿößÌo8þþk´È½5ià†×: UDåe I³Z#Ôû)"‘eëR:¨8N"2ÃÝmÌ=#£7dFªKˆîtïSiÍlnΠѦ¯Gƒ -¬˜Ì¦0;TŸæ¹¯¿ŸÌ¿ß%‹ð±»æweîü‰Ûß-iAþ’ÏigüÅ.ÿÖ}ǵêá²ÐŸÆàŸÈTæóxì§§ÚÇñý6"¼„§ß>tÖ7ÉÒ;÷Û mú±€âœ­ßr¤fFÖ^_ÆV=[@tÝMÿ pŽnüíÿ˜êÿzç›ÎE³ p¨q&¯µÀzv1jŠÓÐû)z^ºSK1åYl„׿bs€K pv˜C³ógC6Kï?Äâ ‹ñ/È€ÞaeQÞŸ%xÜ­·xÕ+wo-j…öcžbjux?FLQ‡œ»ó3£·œy©¥˜™2fëdñLë=O= S¨„ wˆ:¬dc!Ghp±Õ`3FX˜£2k€ù`Ã*` Ò†Þ8Ô± pT3¯–¾ ðôÖú)k©Ÿêp ›¼Gø0° ™æÃoG(2åµf":he7‡m.€©U‰lrsXÉ€vJ æžJ3=FcF…P*øPŒ4žÕ~$Ϫ˜ÚñÊŠC½T“ ‚;•”jk‚2 êˆ2 ;Œ0CŸ];c]s)å4³ó0¼¼ÄÉêa8Úôå8fÕQ9¥ûR¯Ç¬PÐÅ蚌&A9[øjÆk›’"'“ÈSjÊbð«l MáIœºZHb5µ&ÒCj™4:ÙS-TÀ·HüþµÓðƒsKÂŒ‰É"µ¸a“Cõ©“樧T º0õ…kÒP L¯Ô¤âjJHa‹³Â¨ÞÕ#+ÌÆÊ–:²T²*)™ô@t ØÂŠªJpæÖ8X`–¥´ºà³4$’ËßPGÎûÓ 3oJD†‚œ‹B&R@ Ìâd‰8¡ ËAQl)6(€rY昖R_&`åÌ?˜‰„ZG;‚/„ e„•CWáÔ½²üð›—¡˜¿„y’Ñaäp(3‘™n‚d´lM}ŠìÉêãËøþ¯ÿk7Ö´¼øîžOIÝÃÜ…’+ä{§ßø®€î|æÿ\Z”ô ýÑ´Û¸·žÆw§·Pû¦ûx“ú~›;×n@Aµ·÷=GÞMÇÆ EæÏ™ÿEçw¿‰gðRã`®É1kÊøO­ÉÒVxôÌ—ÙršÉûY¾?Ùn€en…{°‘ Ú*VqüýÄÝ«§é>«ÿ}¦X/Iåê°»1ú¢¨µù7®úÿ¼-#i5³fˇ]4'tx»NÀóc93ÃvÊ¢¼uð»LáNÄV¢Èæ3YgÛõ™m Åo¾m+ì±—yƒ _Vf"q…½óv ]wÞ0µ:]¹z÷|ù›â/Äíi /uyîÛ.e­ÕŽxÖ'-‘z°æ7Ÿ ì ¿Xò!7ƒ°ˆŸpÿ©Üƒ)Âs‰i^‘ ­'”pf‘I›Åz×Õz^÷º§Â­®ú*”Àõì–Þ‘Øk[NÚèR-„—‹žÕEè‰Ï-‰-ôÅ=¿+æ¢ü€»*·×·âÕ"n÷²U_ du×1rQêX‰Î_·‘GÏZw¿ WŒ›ØâRº¼½þ}…‰Èº¢n÷¡sÑs[w{ìu «ØSåzÖ[½•:£š·£µ'±sÞÒµsÒ_g­núš«mïă ®g„5qð]ÑÅüzßàƒ`çFrí^tn5¯¹·vâuï Ïó†¼ÖÒ:˜Ö¨ñ–ͽ{eÙìˆäCòý|ÜÛŒwew‰Òwb8ÜŽàÕ‘+¹”Wnð­:ìR½Ö%ÂÚssÒ¾æÉyw凈¼%ÈáF£f%)ÆëÍnæÿE»½œoG·p¹n|v"«-ôÿ¤ÈñAÜ™ûaâ~*½s(ÞèÔ_#ƒY®j–‰YÍ­dçV±ÒŠ­æn’˧oñhÕÞ³Kýå#ÂÂåNu‘¢ZDrÄó¹DÞkÏ]'×¹¥.s `om‚×;9Bø÷ÿÓ¿ÿîøãטz´-"g®6­V/Îâ ØP)ž§Ž”¥J ¨£ÒÍúñôzjÅ@7#¡RNL‘@‹LY­£1K15å$PDA‡bq$kÇ@Dm„Œ=‘ü4–<µH%Sb¶æÕËàÓëÔzSŸ”§éëWL'Oe¶ŒFj(5tãó‡”~ü]&Ò¬ÛÃX†Âsø”¯¯Ý§R¼DNfay²êƒz´T: Ìê¥TïÑ2s½ÐÄÙº舎  €¦Lœ[—¸¥qÞ]‘K“2-¦¹ƒØÜ ؽ""2rÆ¡–S›^'4¨LÖR-S0$™ãXÜ0µ¸¥œŽ'%¼X·Þ2ÏZ²‘"3pöâ͆2Éi‡Œ)H0Üz'ؘܼ*b1˜Â8»$Q’ðc?yWMÈ*š{),mxqá¤è!CñCa)1þv<} Ì3/FÂhsN=¥‹¤•¢§Í¶¨IÊi)#H]z7ZfdŠn€¯VF–“ÇØNQ?óOÝ+ij"¬JFKÕÁMvjÝ,Ý¢H±wz¥`„ú+B("úJ4 SyAeoèÐø¢á…ñê½÷éwÇz †áå@"³Ælùµ·šBËLeÆI}:Å'7£÷¾h2MRÝØ"™ »2¥BÀI"fì]€Uó¾F¯¤œ£‰¡àU9‹³55嬊ïd:(T \(¤™)€ÅÕ)cHÇSê7Îúq¦Z$„$ŠÙH…DjA4¼f× Ám¶».4•`É—¡ žÌ ‰”0š¥2S 6‰:YU糓&/g g[”ýÝ=û¢ÑÔ'ôh¨#¬ ca´l~s  Á°Š2 'ô >"N€À„ó„àȾ0 2a³«Ç™Ð㎘ÕrqGô Wÿð¹!jH€D©( õ¯þžµlðŒl€•hÿÁ߸[ÖA‘ShúÚÆ±š¦)DÅ ÛÔ¢eŸš^K}ÿËÿÇÿ]gxE÷Q¯ÚÊ™u€~‹8.GÒVb1¢¹—xáZÿjØs’YAOü–^¥=ã×õaGòAYb…~‚†ÞÇ!WÝçk:žW’Ý$Ú•¾•¾ËÜNwA ߨ«Hó+Kö¦Eÿ.¸½ÂxÏÕ¹2Ÿ3Üu½®¦Ü¦ÁveJzeôrÝ´ªuÞ¹(|®ƒÂÕŸ_Üi®ß=P]ë_ï‚ ÿ|Dç—´’Q]ߪ½‚h÷ Ö¶Çù!eü¢3¦-dw¶d¸ —ÝX‚­ý îÓåûÇ“‚Є,tŸ,>alpüwð’¿À[ñŸÕ\<¯jÛ¨úðA îlÔkä,°xý0½³Míýß)±<‘?ß….GØ `ìYPà{¼Ë oõÌß=>Wûc¾cÙâ@WëãšßІö}õî¾ßµäÙƒÛ+0¼çsŸ´Öˆ¬v_Îü¾'vw§ü…Æê§)@¿G;c£}ö‘’ö[£ËŸì6ÞõΟh0¾&£ïú¨ŸÎÇüÏúu‡ˆýl#úÓþú]uç§ù,>Þš÷z2UGšíŸÔ–­6yÀý†Ê]g¬[…Í]À=v¿•'Ü„¡wf¥!ß=#ß>¼>:¶ ]‰f¶N[1±¿Hvû´ôèÿÆ•ù„Süô »8þO¥àÄoÜ¿Ôw|ÖmÒI®AÒæÐý¢.+3àZ=^y8p…XKüŸÿç?¿éôãkDdì="´ä7ż”RÝŠãhî)"fŒU’µÎãI‘=¢@=#̬ÔRÆ—Ì>E`JM(•…î$MžYÝB +­õÞÃM",¡¹©(ÕSJ7„Ð=Ôa™ÓïþP_êÀSÖâtl¯Ç<}ÉvB‰(¥Ô&YI03q<£Ã_²Èt·a4x ¡7™ÙËa_*#òˆM Žcñ@­¥÷^ª·R‚P‚@ž­Òú+|„˜`€L C7¸#;ú[ 4Ìç¼ÁØ¥€™³í@)ÞN=3Ïpa´Þ£_[\æñÍTëMJ2P5)¥L³b6Ôža:u8p³ânÖ»HçŽ}R$ÇOV PR¨Ÿ>™¿d2¾GY aS°”1…×ÄXKáXÌZ›ˆê„7d¦DhÀ)¬ŒÓôµ'HøPÌŠ[Ël­õt÷ê ’®ŒIf&ˆbQi€2¤Dš|&¤»±xöŒS7¯0SB­zqÂéŸG£ Ÿäxù­àEÑK2›”{öÙŽÁkutw3=OÇ 5M&Ôè*)ƒ€ÄŒ/ ˜N`2;ÊDÍ›ÕOùå¤é ŒÓir£Ú‘áN¡26ç0”Ê õÈ ùRdu¶H—>ƒ k!Hæp³©wNe§¦@r Mˆ¹•$$­e:%â‹;€ctLã)U€—j™YÌŽã8te¦:’­«h‘‘) c-C…;¥k?Óõø?÷ ^}€îš–î1Ê•QÂ÷EÀ?)àÎØé;Љ"Úñ/à-€ÀïŒ~Âçô mÖ[ÌŽ»x!Ÿ³3wÑÀ_øõ>À¦ËlÇüáÛð†?[Ñù]t‹[ç¬'ó‘‹SÁ71~Y)Óy;\5]ÿ)¾ w¾WéàØ¿³J»æò›Ôñ\¯Õ¶Íì¦úÝi‡q“‹òŒfqåVðá‰ÊK=ïzçï¡øné±?µeô‹ ×·OþtÏG?ëüÏ`wQ~ÜïüŸ{šþy½ô€Gðëë瀯í Voû%ÖíÏ1ÕôH“«ƒïß þóÁû×û¿ˆÜ±Øú@¶³›ê=vþSÜb¶vÀ—ÿ¹½Úo%Þê]ºGù‘‘ïOiáÀŸþ†ß“ðlü÷@›©¹î†‘"”yÎZíª )ˆÒf¥ùÿù?ü¯§/Çì={FŒXê)VœÅ½÷â]‚±”’Tö˜~|íõ0–Ãèu8e@9·ö+B§S?õåk9 +ܵ(%$¢õ8¬™ÊžÓDbTʧP挠õQ…eîín&¤JÊÜóÇ/Pª ªÇôåëôåKN¯íëWää­e Y‘$7£Ò+Pæ¬KdV+b –©æ&«Š 2­>Ñušº9M™Ó”bÒÀ„ˆ Ì¢ôP`0Cx `€D¼.íÀ™WÅð¬I‚EZdž`6ÿ»@H=ú\-(Žx›zïqU›˜y È™/mãPNSWÏžRϘ]UKÍ0©SF–b9©·4B!ÁÍJ¶ö,õ7?pX ½:Æ„Ç,¼RÝü“«+‰ú2ÕK¥ŒDaæu@¤X„„UAn>ºGk&  tó“ÂÁN…ÒÜÇR)IV­˜$¤³ЧÑ22Z(Dšƒ¹€hšRpËL„*Ò¼Öú©p¨½¢—ÑÁÌLÊ(ÅYœó•½#p¶‘0´Ø`æ†zÀøy5qõs¿lâtVÙï¾{zñbCö¼cz~èNþâDç¿kZ¯H?ÅÈnvE¥àJaùZšXæ=R¸fÀœ‹+@ŒëZ*?0ÆÛÄde˜·nÅ¿IdôH˜áþe%rt}*IéêN~‘øßPãÅ3ß=gCªL£ã¶]7Œ2¼ˆâ\»Ï¨\Ëöænœ*6å"ÙÚý¦‹´ oUÖ­ë»’ÑØâŸ+ Üu5G¸—,ÒõáH¸h'sõ»ä¦µùûùŠ¹íª¾¨2]~g%Ó²*l˜ zTDÕu/¸<º:ÿíô.®¶nîÅ\æºÎWûÈææ^tær#¸Êªl×Û¦o”ôÕ+žWÖNÇäÊó÷Ün5Ä«\ÜFÀƒ×qÇ•ì(psÚ‹ožÚCÝudê=û*îTkAœ«žÄ|½ë)¦»ÎN®(=·[áÆâçΕwí5+ŠØU¹á¥‘ëCØ5LÚ¨¡] ã¹îÙÝŠír´sê®E¥6|«6E܆8÷*Q÷Ç»vV‚nOñ=Y«u‡îê{¸Þž÷×ó±Ö–ÁÝ-j}ÍŠ¼­ÉãQ ´>޵½ÛÇÞ=ᮤµ˜ÑýÎpÃè.ÊáîrØ>‘ 1m½Òt£ u¹µófˆ •õÚá̹¤'A ßš†ûQ!ï7ƒõvOÞÖ;móƒµ-Z­Ë²n-Ѫ¯›w¤bîµV]xgWú'7ùw]í/ T×6 ®†çúöCöÝ® Ý´ó¯­®jB¼ºîÇ‘[Žçê4yú`÷£º=Ìšwf»$u½UÑsøž«2C3kj÷J|F7³ˆÜÓ¼»­4V^6¯:6«sä–)y·ë¼”i õ¬ƒ¹{"ÜË tŸÅvVi%º+‡Š †Lö0‘ú¬Èßc*Q"1Ôê¥&@³wðhÌ"ØsçyÐŒS‹L”RA“r09?%R9s$20÷*ÎbWÖ#z&eAm’W(5~®VŠ»³8­@Ç!¢ÐTmFËSš¤äƒ\ÑXô“…yµéÔ ‘9ed¢ îÙ Tï2ƒf7Ýã´ãˆjl)KF°#k1k‚˜…Ã'Z¡SëJFO7U fë¯1M³ /3ã J ’­P¤9*-=Ê0%Ќ̑!–¨’-Dª‚f&ñE%+YÌ(D›µƒXܘ‰TŸÃ¨t3ÆY±Q gÔÀ,2rÑ·Q9{Ø:0ʃ@—:²€å…'eKµ”§ò „ªñ¥0JÎ&‹†>œ/Â22,f   +Ԣݟ4×Òf~sØŒ³P`‚Å" 4‹q^zR8þe€^!ŽÀ,Ð?¯Ù¾€ [Â'#P.½$ â¯@&ƒXA¢{ðóÙ‰RÑ;2rÆUXU?Ï"–QŒ¯ÃgsG©Ãßü=wvó#\­{ô:ºÑJíNÊ:¼7À¢M-§‘³×?û¿ý_͈”|Ð.AÑ!X £s € èIÁxUѽҌϽ9ÏØ¹Xßw@ß 0îë+‰Î‹ŽôOn8°U2Ü ÞˆKHÄ Šp>roÊÅÂïjõyúعÁˆß »®eV/rQÄM ÿ°< K¾€kdþ¼y%ó"Ì=¨k‡¼ÌU¼Ãvµz7éÜF¥þŠêOÿs^òФïåpôúçy‰¼£†#ó[­ù[IWÜú˜ß¤0ç~™çvÄÜ(ÈjU0¹G¶Ób-ü¼Ÿé½VyÜç±]¹ˆæœq'-!çõwε]»•fº~z¦2gÉ˹§è,ª›«‚±ÞÆ-u›^¯ieW€v«QÛñX©›¾eúÌ÷î–°ê 噼•ÖÅ•·ê|Üvr=b¼¥æsFò_¿Û[Düög|¼Ì¾©aûBqÚ/ô¡#¯\¨›Ü|‹ë—úÎÛÖ7U<Iß_^a¹‡XäûGøÍàé¦9dwóCSå'b~±‡ÕEH¢è;b´Ë®¶²óØ¢Û»Ëbƒp¾ƒ4 {ÜœßwÍî”'¿é‹?ôåW¥ÀݘŽx ×½ûþɦ淽åã×|`nò=€߯À·Â¢üð“áóî1@·.Ú `éYEàþÚéÿ<‰à߬þ“`Ýõ?BÒÙv?B}ç¶ ‡ñÈhøîyþÜ à>ŒþNi¦U=àç:·×£°q>Zå²sÿÍÌÌ€³*2C9˜".* ˆŒüŸþ—ÿEPuë¡þãk?úf4÷PšÍè&’Æ2 9[ ºùÔšRµ2"°'éžÑc‚¹g›:ÄtD†TÜ|MÇWÅIh‘VfÅm ÷ìýˆ«0ÃðV§×¯ÈŽaÜiÎÈîÅ"’,Ñ2&‘Q CŒœdðâê^«[ïÑ€|„„8‚9Ã_È€béžÿ&:òl°À~n>”9¬œMG5c‚óȰh©>Y¢»b:ƒf0BÇY¼Â @ZiBöœZOë¦a"JïáƒÚWÆä™™J(™„ éœ;îéCýÍo€ZƱw©·L-Û * ­dÖ‰ˆ¼”R!ƒ!e’@•抨ɧ$dŧÈhÊ™ ÁbPADŠ@­¦PJ3ÄÙïPˆtAf3+À"SA—25áæÙOY_ÆñÓA3¶@7gºÛÔH±À‘’2S!’u¨)͉àÈÞNbÀ«‘ÅÕz“SæM•ˆWæ‘™„É©>ãȦlÈ"–LË0 j"shìÝ ±p|9žªZo©ä¬ùc‰™ƒ0[ÑšdÆêH!'{fKY1ÐN™“²ÈZÏ)³š<µþcË8;èÙ12nü«¡dªÌ‡ƒYf~*Öc–Bš;ýÕ#-q(F£ ìô³M‰”F÷3é$9V!"3DXú'•À(Uöa©<åàYŠ\†„”‘9²[ÏcÄKñ ƒKê<”IH2(5óo0;—Á*r®¢Ù¢Õ£YtkZâИ¥l©XKä vnPKAˆÅËw–š?Ç@K´ Z^+ÎvîÜ ™Žc ‡X\¼€™HC¦‰ÕQ9!ÉPÒ1ïÆ(ÊÒýPǬ¶SÇç‘ÅRB†NíË©~ød5ú©wÉ«÷žÇדED¤„RË?þ§ÿlöo<·½œq2Ñ– ðzu´Òßc\!͵áÏ(ç®Ì ÆëqßÀÚ†ó <¾¯ÿó¬Èñ}YÚ2á[Ù;EÌo»kZÞ²]dWró݉ûGoÿ# €³RÊêÒ Þ´ý…‹Îßð÷njºÏ¡ÞŸJ¯]‚ï)}'ó}[Íð'Æë) ƒçÝz·'n“ßÏ%€ï^~ï#¥ýúúùä¯B*¿¾~}ýúzOºñ—ºWèg͇>–³ü2ƒþS\Í£°õ§Ô™ùÙ 3¬¸TII·þÎ/ð='ê¿3+ó–÷€sŸŽ-Ý:Xú»fí‹XçùRöq<#¢º :ýáõõxòD´H¨ÔJwJã˨™dœÑ-ž!"™AZ­%2#UÇ¡÷p¤l éŠä4Å©y-þé¥#Ôº¢€V3öè?þC!Ù»EªŸZ{mVÍŠ ?¾þ^I¤e]`âø/ÿ»Yäñø½I‘=ÜhDk™B)D‹ÄÈ@B€Y«GHÂ$¼š£LÇÈ”2Ç©¸ CÉ’íD7:*«C’‡&•±ˆ!õáàékš™”Jô ê3,x†õqígµ`3p.?8²#ûÒY¬¹*@(ÁË‚6.Ö +CÞzÏœf0„6a ÉX* óÔ±b^Jï]‚;$´™S*„ékvL ÄÑ•|ƨª|5«ƒ Y†A©è=e¬¦Ì$ÀÁ, IåŒeOÂéÔ Â×ã”yiù嬿ÒiµËÈÅun–Õ¡˜Y.ÍŠ§³6[[±…$3EF&ebŒfÕpL ¨0TF IJr¾ìR(ntºtŠ4¡:š— É’pgq89WgR4ÃP1,Ýl¾dŒ/f¯óຉ…'O44Ê“¡ ¥Ø`e S)‚ÒR6È=SAÒÕ¥¯Ê횆”,\žD6¤cAC™Á÷<3˜ 8Šƒ¶(óÈМˆ˜k"@ÂÔ%®Ù3ú?OE§Q,f,^@lÈXÖêÐlVÜÌÉ e‘­Š $Ê ”È5xA&JëÌÛ`rJ¦c-¥ÔZêK¥W|ú-zûdðhéÑK&r&Ôu¨ÿù?ù'¿ùûÅYnìÖ'p¥pa Sz Ã|Aþyý]Ó-å•m÷sÚÁú?]Ü•æüŸEþó™ú4¬ä/>7Dç¿-ú9Bt­(7Ø8þmœ[—ÿì¶im»ý×Þ ç¥3þúÛï•T½íHÓþÌm;³V#7_V®·¹ôÐKk;j]góEÔëâ*­„o±ó{mãú¡]‘«Ü†ÖL¤Ï<4†ÈÍ_«Vh;Ìw¾ßï.nå´xqÞ÷ãß+ßm~›6„Mÿ«pá,ñB¼ØŠ<ìmMëö•C±¶* ·-oGð;‰”+kÿ‘ß²ÖW½&½³÷ºØôpm®zVd=Ü ï¯òÂç#¸¢ä\•¸*Eí`~¸ÓyHí¿“ÜÑ…^¯Rç3¼ñ²ó¬[vâ‚À›é—¸óY<ãšýµÿ$žË÷ë~šèV²€›yw§twtqó±W —½þ_>½ v›VsûSþj¹‡­’Y]|84ï.Zß ¤:†k{êÜ?(ÝmÏ4Bx{µjÞõ´Þ*í„»®^ë‘ 1”tÝóoŸÓÊuæ²k`óµºÇ›ÔdéJºý•2Ú@kNóCU¯5óî‘ÈêýZ]«ö¶}ÜX·¸ÓCñ3죟×sA|ß,¹}w€]ZÀ–·ÇÃØÿ_ÝÞ£Þ˜èÚ×»¶¯ì=–{xÆî6ò¯‡~ý[\‘qyç¬u÷ù×áò-Û»]—‰w¼®§÷¶±Hº\óö:îoäI `ËæF(p¯ÝM[b8n;*a›Q~t1ĔޘüO>ê}%!®Š'Úß™0¾Çv–[Âìªy{vtZ°„ÄžT~ùú—ßAfo¡ˆèaîæt/^܇B`8Œ=Z‚æ®Tq£ÙÔÛ¬[)š^J5d¼žbšØZdÖq„Ö½@Ra1õÓÔ`õ0€ˆ/_«™›Å…ª¡žî?-1õÈi"ëôãÑ_e0/õëñtüÿý÷”N`áì<гŸ0}Et¥ žfgWÞLÒf®ò2 »¨‡ F¸ÁôìŒR‹N½Q´â g³ÞeòhÁ ¡‹Drx!KT³è™iîèHA~žèg„œñýŽ&¸ÁüÌÆ0ÀgÅ~¤Á ^ ÁÎÒäçò—03{œfä®óÌ«zþLÎÂA)h–#·³> ™Ñ;…RêÔÚlW©¼ =- LVj)өìEïn„Ù5Z<8G÷‰Y¸'‘9›w“[Wš±¨4¤)ƒ„ÄŒe³H³ 3¹RÅ-zÖq¡2eŽ®½ó 7sÏ„"z)©ÄÁûšÐ Ţ᳃FEœz›&tŒD¶@áiîå0«ëO¥+òD˜ÊAÑ1ýÈìp€èˆ”:Å$’-qŠ ¨Îi™r‚u È»餋+"謰ž*4 ‘è‚ÊÌÑñ¦ŒŠó«³ó¶‰f&½¤ä)ó:˜ýUµþ6rÊ,F3LÍñ%úà™ s-#õÙ©ÜZ©µ&A¨ZfDt4ˆBI§%Дæ„1ˆ†4œ-Òø|ñ1½È1zxA€•VM½õ©•ÊÊÒ ¸ê ¦cª/±z–…–+JE6D€ü æý0`s§ÿìKhqx)Ñ9½v÷\6„‹JÌE†À}±çÍEŠsyÏ^à£û8–Ãh¥¼þþ %÷œ(ˆŸ²!Z ufJÔ˜6,CFÊ;ÙO'M' À2+#39‘F©¨þ–‡±8ƱúçÏþòC¶)†4`(Ÿ+–ÃÈÓI­Gë˱‘]‰Œñ÷ÿæïÿõ?øû¿ýÿf.?ËIWÚsºV’/‘ðU±‘ëðf•ß`y+íÄ«Æë&]¾9=õLnàcXçm°ÂM—7¯Ú†¼.ºÏºM]¸’‹]ÞÖSi's_I)^ë'|>¿‡<úVH³ö÷\åw—K¼mZ߀¤Od7Â+{¬õ:kêp-›³ îÞ.ÎlIº8‹3_'Ãy&-âۼȯ¤®ÓGOÝdõÚÌÛG׆³ ÙÆ«œújþEˆÎ¿=¯ën=Óï¶ñ³ž_3®sìÙŠ˜e0çÍi­¾.lžßJôç"¡tÅ&ußÈ´èª.¶IYï}“¹}ˆïb,m÷_>Ö£x³|RÖ²ë\ŨçÞžuoÑUˆëºf„ë–œu‚øžöê'¬i^ÑÚ[AlÞ Ïñ´[ ò·h^;WpL÷0Ü“ÏØÎƒ½]Û¢ù{$0¸Ó<¾Ç[qqܺî°Ñ7ïç£5MrÿÏ·èãêórLòJ~gz|[3áói³Õ3Ðó× ñv½ép3Ãvþ–OªTWÙ®âþ†¨'U7¯á]@ñ®É´­™ «ë+Ò7LN¼9ÿ¥­éOæ÷=*îCá;Å&Ýíezó‰k7ÔÃø]ü®2é·<óÝ?Õo7iîÕ~îXëDîÐY¾S‚í›:=KòécÖ›ëôQñÑÔU™ýšî]<_ó{Ú]È s—ðþF¥-]vx½Yoþ 9^ï¬å¬â­MàõHûgwÖ)OhÔo^Æ7Ps7ÁÊ6i_WGVU}jðz]hœÜtcð60ùø‚z4(ï¬sVÃÝÏ;‚š› |µdô®m¿Óm4¿¡Q§d..*ò\ìÎéïüw3Š"†"æÔü"áë↑õÞzoq~Œî^ÇQÎ:„[¦Effœ" ¡”‘îÞ{@jÓ±‡¤ìrï©ãd‘~ñÃçøúš_¿¢DóaPïÌ(cµâa '3ZpîÀe€LI=å™úýïówŠè§)ú±C¶t#;<ÕúIý5Ú1HÒéL©µÉŒ&3Ê^ªÜÐ$ÀÎ3Ñ`ȬgD_ZÀkµ~ÌÎŒÌÞƒ@­E"YÍ„ ÒL)˜ea`νö󼈜¿aióÀ ¡\äDÎfRȯçæ}CÄF¼W 3ÌMÙŠóniר~¶¦A„¿Àí"耯"KA™²·Y8¨–âÅÚÔ—¦rA3À¶„an0OeTýTD°4Ñ[WÊÌ诓€ ÈàµäI+>õvzÅЀ˜Ô:Í Ø0 èLsÀœ°:0SSOå"\ê )C^-¡œ:‰â5IpvûuN& &ÊHj©UÅMðRY‹B öç¦Ù8cš¢MVcùäfÌhj§ôì§n& “)KôÌéq‚%N=NM)XªºÌDÒ gĹ f‡:"PÜê$%}1a44ÿ>ÏŒ=!b IQ–Èž"Xœ¼ƒ€™˜Àb9營ÐPMR  eHÆÑ¨ —ñ ȾF‚(ÎÙr¡)ôˆÏ;)¨Gv)ç„-³Fg²|’تT4n¢€˜IœÑÌ?ïL8?}ª–ìJ),–Ìâ~(FÏ׌4Š>Ž¥ tYTzû_O&Y…`6ÓÐÀ&è QÙ.êÿ)Ø+ÈYŽ?auÁø§))‡ä¼HÏÆóP+ $Å!ÂIs³âð «6¾„-aIž´Cñbî§¿zV«žy4‚åáÓéXŠË½ñ‚²Ó0¡ÇYOšÒ"ÛX_Æq¬ÕÿÉzúñõøå5Çâ¥L9ü`ÃË¡v´b¯_Ó^²Ö1{WªÔbÅþÞüýöþ}.öÄ·è5±1¾„eÚ†]kpøÒä0«©MeüVˆO‚4®p'þ¤áöžøÌ*Y9P=àvâ„o ó…]_Å5†ù}IÕ›ïø}úÔ¸6{ÞëZãÄäe}߇àICÔ’¾€NsEa¡j0’F‡;á^†*À½ÌºyÙOP¡¼|‚ ¡0”™b²0Ña•å@¡OS­…%ûô5"2AVÐOƹµ2ÙUzC-††8†ýƇÿüŸã(ñðùÓ4µî>Œ"5e0õ=”¡2"{'àC^†ÿý?ÿ?•ZÍÜÜn±A>qlÜ ml‰î!ÚÌ‹óÌß±3– Œ`ö¶üõõëë/#EH´Ùó§):ÿö“rëž ~G ½¶'™O3ëz-ñ^*?´n?Þ– ®l˜Uyg«1³篺ÀÖ~l²Hݽð´¬`PäŇ\›æã “çVãèBõYû}àZƒ’n·‘á¾à¼ä›O»aÒàª"]‹x»­¹¯ëö"oçÐY»g6¸_IG<ð}çíõoT¹æ)‰+é‹Ç¹½ÙëmÞZ6? -ld¿É·ö¦t}¶`Ö®[òCßíu^³\í6š?¶+Y·õòÙ@òí›îEùþ‡óH,ç²ßðãÒ1>ñ}óöý?Ü»nö¼óŸyk—Ê'Oá[[¾õÓÞ `ì¹›ùZmõ7d½9òÔÍ‘õ½Ç¬ôìé>x¨»¼†á-î’×1»îþ³,0Ÿ~½V¿Ú/ŒæÛŽ|ý»ó–zžÜ™ˆïµÅZKx±æ«^šv+µOÙ~ã7­"÷²(û;ý•ŒðÐ \ûööox—½yÙû¶nÿæ‘uÕÆ%o£ósótçÊÅ÷lû÷Qàîo~C"þ„ñ}¤®ÂÃGGôù¼»“­[k»ý,éÐ*Žß£ë#užlÒ;ßýŽÿ®ÃP«ÂÍ:¹jhÞÓ½gàÔ=þЯ?~í¯S;µÖ»4ŠÃ­Ô"š¹D1Ðç ÔIIÓÔ¤Jé§éW/LÝBaN±XÊNSN¯:–Ã7µV/,Ä4ù4ÍQzËSV ÜZ¢OÁL;|,Ó—×L È dôÞ³§‰iR›¦Ö²'iÕ€²—2Ð( )-{À,)¹-ÔfÈEœvD‡ Z Ö$a´T~ýPÒ,ÍèîÃhÅ|¬Ž%e=OÓ)HŒ£ê¡·4tšõ0¡r’2šif=/)לÞzYš¿KEæ¢ê>{ùF‡Ì \…Ë•‹1+ç¿'Ê à¨)ä ©Y¥iiâ–@ôsgWZdO±Ï³Î…a0‡,V’Ä\Hƒ5Z¨fëV!D?M™×”bŠÌ©T«•.SpÕÔ{ïéôˆèS„ ŠÛhPR²R]"f¥)IS.°oÎ&¯!†"2Õ3š•c©³eî0ìf¡ÃÍÝ£‰•¥Ú ò›u%˜Ó²eB™=ØÍ«Íúõ°@´~j>¸›[eNA…JLiùšè郲Gg þ:60†OÌ#újB„””©u´‰%ÒiJ%œVÄ€ÍîeKW¡õÈј‰ˆ¬$M!|•2Ô¤Œlž_JÉ3¯@Ë<¡3 ÜÂ脦L 8@0Ŭ!$29ÌìµE!ƒHàØƒÒæN72AØ‹Ã=ël4’ÈT£›µTdzïb’½×dZ¤¼av÷M¦(%A†¬îc1Ci(Õ-¡4¡)«ƒ›gtõ)4Y”ÈÞÝAËZI“B &KÌ",½ŽŠy¹¨;(¥`©TH]"X–õE‡˜ÈV؈lèh´ê¬¥”æfNw1Á:5»Z <&àR>QŸ ©eŠ&Ši£A½·€n]…=É3º^ŠS†pȆO®fÅ­þgÿ ¡©õSИÃËa8ŒÃPbê!8$Šs<á–-¢”R†òÿÙ?õZhöÌiv£zsmî½IMxýY¹¯l$u±½#7æª/Ÿß˜>þ.®Cù]tOXÑ€±±øyÀTÞ§yÜÿ¶u0&íé¿Ã¾õ»qåš¹óe|ï¿+Ò=øF”®®níHˆrƒÎ¾+}Ó6·Æ#núJ7÷¢–²Æ}×HÉ_ˆèü¥µ_1b-¡µž wÿõ^)b㪕ûmëko„/³ƒ¤f]ȳÇñ|¿--à™æ²Pn×Z,µ_žebOë_¨÷Rµ›ûÒF.ø&‹“TzÈÐ;{e‘V¦Û\¼uæHQÿ…$°Ðy~·[§vÖ·îa³•ó7{"¯¤³3§v¾æ‹`ÁÝ7jƒÔ¯óÍ]À…÷Ú;z[¬Ã½ÝŸða nÚüŒ¹qÔÝ›wzžômlUÇßÕ'Á}aÇ^í§?”á£Xñmä}'ßÞÌZ¬ô™ÀëmwÛ“,Tk­Åm‚ÌYm};Èë\i>¶¹š9«’Ø%/ø :Â÷>X75nÅfGP]:ÐΟ¡Ç¢Onêæ§6À-®#½·Êô ÇTǾMè½ €·>§<&¥¯ÀèÛÀþÛg'nZýõMÉêÏõzÔWûgþâßiSùo…Ó~}ýé,¼__¿Žø÷ßͯëûOô¤ø®"ÈãÕ½çï÷ ¿x‹ðË=fþ)!ë¾9EÙ7.øõõÇ\ Ô£½})€S’Rs¿é¬òÅïþöwnöúåµO­MýtláF3c±——n2«C¥±5µ(3k½»/Òž‘Ù3•"á³v„D {ovX̦Þót¾ž’lnu(æEóZ©Ï&P†é‹ÕK…"ÝŽÿþef1k_'º¥fu„䔢Etu)‚ilq9ˆÙD–º›Yö‚RÎYå,eš×úâ\”Ð4ÁÑTO‘(2tæà ªÃM¢N­Sz)#˜ÍS0çØ'Åt’hîsÝ¥À’6B™îFsD[D{ÊY‡u–ñ™ z_ðw7иŸ†˜Á*$öÐ\ àìô›ˆ„Á8¶2Žì DõÓ`…mjè—æèìyJ¡Žä¹0°Øš‰ÃÒ¯í^QJbȘ†—O,.™½Oj}¾qEM™}ŠânCÜe~:M§¯S¤ÒÂ`> %#cꣻ»”9Ãz6o•æE™ ‘¦„2CqwÏ¥J©³»2ûÔçr64Ë3A¦h>Ò>Ó)™9‘%Ã8·yËܳ¯€;Mh]•…†ÞgÛÀj6†ãëÌ`-ÙD™WCzt¤ ;²);úÄlˆá¡ Z×Ôè‰Bö@oÉC1%zÃi©è¨Â”F$RiÔ`ÒŒ"º@å)%‘ÒP¬“G©eÎâ_R°Ë2vb¨L¡51`ˆJ7 „×/n³ BθWJ@NSöÌ—â r³2ËQ%"5¾°;2a0c1*¬K¤fQy‹‚)¢—¬t#ŽÈÉR+XÕ¼ ¥:K w@™êÄ:V3ËŠV ëif"º¢ÖR|Tœ@Wžƒs$2YLŠìQ jU$"À0¥ø oø(3˜!ÉK‘‰ ÜQË‚øçÌLw8ƒC Â(s–’˜Ô&0,,#éÅ]çÍ)#B0 FR[L²T&¸{ªÁm,§fè>ŒCýWù›ÿ]‹œî>MÓc—êIže„hgRÙ¹{Wëy^XWúÖ<šË"ÓÒàtÖËü™Š÷ ñ¶gkÓ_yîÝ{`}­ŽïøÐðüàs\ç¹Jw{œùhí÷÷¶ê»ðKݵ’ß·Çî~Þ=NÕ–›¹pGKÓÇĆäÄ÷ÌQ==Œ¤{Æ€~:ÔnÓ¡?Ò»hwß~Eºª™|#$¹&šñÒC¹ n7Š?ø©©4ñ!Gä13áŽðtÞº¯óC³«AxÏöúÖX+M­™¶;ï/ö»µŒ~îòù1…[FÊCùóF³îÒÓ Ãç?Zw_´!Œ.½*Ú^ÛŒ¶rEÜìÐÚ7¬†ÿhòiEæ8Ÿd ÏÉxŸÌ˶A{çÖ7vv›Sq>^™ϵܾ¥‹aßí®¹l¶‚œÑ3³YAz[x¯Zßî¸zýqRŽ»çÇóÏc¬¨Z:óÐ?°çþ‡ù¯³‡fؼ5eRjñb,î^ÊX¨µÊ˜Ò8–±ÖÞ'@Cñ¦˜¥½32"Jñy®FæÜ> °·ž9K¢ ôðLa­éeDdÿÝ¢zØaÔúÄÈ2òõä’ͽ°"óo_¤ÈlÊŒ05*Ôº2¦¯Ñbjh'D Nȼ˜§)‰ç·¹½ŸkŠ@°,âK³ÐâÚöJ-"²‰†rààn6wè+ØMÅUKUo,ÕMÞ^ÙØŒœFÊ‘ÖZï'e ˆ±z©µ·>µSfÒPî°bRfGÅÝWç2Àl4zñ X°H Š¡TŽË mÊé„á7ååe§“ Li±* „P Çßlba<(äøÛj}ê³ê\T0Cëðqæ‚eB•`Foþòƒ™ƒR©Ììí”Íݼ¸›Ñ£·©×RD:MŒP$˜)'ÍœͦŒìÝYçU7Û*f`@2šXæÎe‚ÙzôæV3€×24lÎ]ë<ÌfF̸|ñLÍêB2à˜ºäV@º[J)°GžÔOˆ¨Ãü×Ù'‡b(§¯¯Fg¥zBn&Œc;½&ͬXk½) Å™æ’ÐOŠ D¨¥ŒˆdæÊS š>Kx¤BqŠtP„…ÌU*Í- Þ1 Ç.%„èÂoAˆ…<¦R…*Æ@3˜K˜ËÝZjêé`2 Ÿ¹,¤ÛY‹Qø«j§†LU ™™;ªqr¥+¸(t% æ!{G:e*2£Yž YaÆh(æ2›¨ƒIuójµÖDF–±ú8ÌåL0¥ Ð|G³'ËHܳÏÁ¤PÆÌ”Ñ0tšz›ï&cî÷7…e˜dJªd24RD'´hddÇ\ 1 ÈÑXTªdòR Èì]0“A™Áé¬q~J–èfŒe'R©…]5Åë!#$K¹{õaˆ¨PõZSÜ^F #?¨‡ŠaDèåógœ¦Þ›R΄¬ƒ$‹ñÄ6_XDøÿñò×ÿèX)´Åb~8k;Üž6w£K·óU®a•º^}µvEZ7Ùnóæ;¦ ùÐ@ïÈRn´[÷X¶s+ó ®ëî|.þäèÿU¹õ¬TôÑ d¸½_úe/¬àJœb;r7š"\§'ïB¿7²éz®rñ@ìà̘'pcðû^r›è–ËË703]½˜.šëk†ëÆÛù/DtþÝqó LÆÛ9¥÷x#‡õ„Û½½Ù-Ãc~žçmç†a³ÍVØPLÎKx«ìr+Öód8îÙØîþÄufk‹^MÀîSÔr& ¯!zj‹jóR ¸ì†K>’‹¿‹ò,[sÞ*´àõóvɺqf¹¥uÑl·ÐÝs})óåæCÈh³›p×ß"ôz>a×}WÚì¦ßí¥9k[Ù,Æ%»ç-YžXíª|p B+lÝéðNp|GW‡WJ×ws4¯ ¶•‚?ùàÌۖǹÔo\ÕW†îÆ™O–ÄUd5ûõtØø Ó•¼õüЮ ¼¶AÓÍÝë1#på|~Ç´¼>*=®×ìkdß Uñ^çhOñP÷êIOÄ_ÞT¯®_®ÛÅ·Àã~ iý¤u+¿úÉݼ•î„ãWƒÀû}á!¸AÙ@r"·uuî”wEŠvÅïö)Ý}îvÏåÛêÓ~e•x %¾Úè÷QÃN•uëwÛ=’âeCÚè†èn7;spyÑù×ó"0/Þ÷u©;K†»=7 Ûo×JÖÙÂ|Ì­¾áMA𾂹f_žs€ÍO6¶öÔ»ô Î|[K¸nÒÜdµZ Kt!³¾ ?×)Î'¥®çïºÚ¿ÒÁÛ,Œ•`ë›ôò(/[îmïÙÓúX’´Äü7w_ñD‹ëúõV:I—Î‹Õ ¯ç©öÌU0 "¦îEöÖ‘åÚ¥`·ñ7ºlj3¯Âx|3´ýx{ÀÛõ˜G¡ósâüJðtCC~3ÿY‡Ø@‡ÍCããr7oõ ®¹Ùj—ÐJŠ«ís^óåÿÿæßL_Ž1õ65äÜÛ› K1¯Õ‹Óiî^Ü¥xËt@=³DDŠ&ɼ(Õ[‹H(38ÛCòR¤ž­#ÿÿìýk³$É‘ž£jæ7«ðêfw£Ù.eeFvE†ûm–üÿb>p…Kaó1Ífè*óF¸™ê™æáûÈÊ @ …Ì{=ÜÍí¡zôè9ß´Ç4™»Œª˜gJFèÓ3"u˜ûo~‡×ŸýÄýùXìÉLúկ ä§çž•êM4¸Z»íЋ‚½åqî‡cdwÉè‹NJF†Ì hÑ;î%©®”B'Ü)Dæ"4äËé§ÑË&‘0Žrœ;¤7Y&fK…ò­§³šAÊìŠ6Z)S)“Êó®Xt¯S1w:½÷$ ÈZ‹—r<Ì=rä" Ž2p%2@COÐàõ$¡h–¥P1Â*¦½œ¿kdŒye…}Vo(»²ÛWÑf«DÊ*"ÑvßÏ¿mNEˆìiUVNŽÄ #Ò ÁP¼Vû±Y5¤ÌIR PJd-ÊÞ‡¬(©„ù®V¸õÞUªË FÚ‘’•JR¼”ÖD ÷DX1ÚÂ3³©ôÖݬLEpä)3"Iw޳œôZH™ÜÈÄ*"Ü¥zoHPÙU+…©—]™îè’¼ªT'™ßEôdÀ܆ê;wn>Aâ R†‰ì@ >!Ú²t'c ŽÊá$ëddFrrH<„Jƒ Y ¡Ðf ÇY‘0G56!;ƒ;[×§ ƒÒi„€™Ðtc)x 掄 ̸wf‚Š©bì‰Y&D õ¬@"dH«¤¤@ËH@&ÆXVé,¢ ™™Ð¨ŽÈT§°€ŠÌéô]ºhpWqKœ04”rˆ)a¸>› ýÊ!¯/È`PWBÙSº%ÇÈ– e8@ùNf4C²Ð*I5fÐdÞ*U”"àfK€î@A !T@-lÙ“eE½Ÿ‰(¥H–A+nV¢[*•r+Üõ ¥œD)­eÌÑ“‰”yupw- 4=}ø@1ÝPwÓ‡½•©>}#dôØí˜•¾¯A•f ÖÝ4Êz­+{dDï)#½Ø‡ŸýÄÝifnWáæâ]%v‹ªÅŸ§ t±‰ WòõºjOçïÙâq•Wñã"XÎŰ”+ýÿ•p•ñœn™‰gø5™xnf=Î"è à:Žž„¸Á¥k6ÌŸžèü+ßµ­±œuç×LÌUL݇qôèõÝÚ³½X‰Ò-ˆ›€‡Á·ul.õú0ÞÈý_ w~oûܸt¬ë¶çònjT­*Žõ/¯›M™7"æˆÄ¾–:‘†iÇž”,ç~„P¼fÀ½¶¹Ëñ¹Gä’9ŽèÇ ƒr(‡_:²Ì¡Qº )űÑD‡I‘аБ0Ãôdú¡“¡\`•8"F˜c>=¼@ «ˆ½Á>-Gmµ¢‚2è¥n^³¸¢›?MÇïžûqÎ.ŸJoǹ+(!#¥/uî­÷næµI]}08#ÓèÑZzTŸ¢Çð[î³J1ÖÒç¶0=sÈâØn¿‹ŠÄÒ’ËÎÜ¥QB‘yaqR¨u+¢1[Ð\jä¤èÌvfS¥jíÓ3"¸s!Û󜇙.woŸŽ¹\Ùz ™%AÃÔ-“4ö|†’šÕ»ŠQ %zÀ:JzH‚æ.åÂ]+žnæR"²*02¼eÌ’€'X(‹#+vÈh€}±¬Ùè  adO@°@£4'·á0 *í0: ˆO‰Éì»sf!;ä€ iA\Lá`ºõj4ƒ ÞRR:©Ék5d¤b0÷šåh’Ñ­däRÒ®^ÌÐèÅS€ÂJY¤Ñ3"ƒf„%2s4§ÐÍK÷Ž‹„ÒÌP&…Ô33a°šÆ43—œ š™•>^C6u§±(ûâÈ-bȆŌb€§WF$Ø Nu@òìnu‚Y²KLºƒsöy± ‹ÈD7“íÕŽÏós‹Ælfî˜>|û”Í9íw¿øiûS)e?ÅQ‘ÞûñÃO¿á¦}­-ÀÝÎv°yFDë]@o9Ïǘ{Fp·¿ù7ÿŸüÅ/ànÆ›ƒttÕ úÖsþl`xM‹¸þïu8v×,–Ÿ €|,×HßmÌCr!¨þ^2Ê•éòïeÞñNÀ—x^m˜…zw&w6øý¾Qù}ƒ´K×ËCHúO\tþͨ͹s…/µœ~ø®!ögÁæ|u)ÜP|Öóðþ,ÚWoûq¶W|©´ö–î{Ûî +8]—^ ®ý…¶»é(ÈE/py@»¸Õ­õ®mÍ:2n ËzýóÍYÒµwÎG˜¥î¿è/}éáªÛp%7(ꦸµ¡†½T|º\Iz &ËÛšoß3ôÚõùyö¶å®fËeÏø¾˜1_ÆZ¤—N¬¯*ó¡Bð»ý½„Lþž‘w¼'{ç=Iïö|<Ö/öÌï¼ß‹Së7ÂwN[~™ûžQÒ*ûðN£ßËT~ñ[mû¯ý4¯ªu/·Ö=÷L³.šuĶ5ðËÉíqÝœñ¦¨ûó;¯·]tü~?÷¿®M\…Áï½*_ aÎÍ_N¡f­ø¿-Zpÿ¯åýÞwý3û<:mVžÏø{ϫɚޱ¡døÿã~û±[ôEÅ‹›Ýå¿Ö)ƒB20[#ŒDÙÕ)£×2Õr<‚¤Þbq'sôŒ‰3ÈêLDXïš&~xâÇç®Æ.õðÖû¹÷¹Ù4ñé ÇÛlûIÐñ¿þ­ÏÖë®=•ÉÖe@RgkóüÜÚó±ÍÁ"ÐÓNÙ)E_‚IÐQ @÷v†N&pöö<·Hæò:òT 1lju½§ÑêÎw»*`>ö¥^FÞ?ñp˜¡A1föWÚ(½÷’¾›>óqn$3hDFfΣA¶‚åV–äw±ùut fÐA)¥†Á¿šž¬þdRëí»Œ¾„öƒ¡˜-¥ä©1 îtGÌ¡Ž$–Â@Ç@™@ V![(Ž™4fËp"2¥9òpPHiîfž’(SdvRf&YÙæ©R ¡’qhs¶Lc Â«ÓØç¦$ÔÁ •è Q¦BH™Ñ3).ÐÀÝ)eÊ ²˜š”A7+FßI3£¢µ-; /ž&B´Ì–ôR€ÌvdݲÙ[Ÿ“}˜Ä&Ô¡ž µÞçîfΑŠLEMd ;B éd$”l=¶sfWv(„I³– ¤Q‚»¥r’¥4gØ-09ô ©5irö¢z‡ÜYFJ‚9{¦ÆúPæd¦,ǶÏ.´6|8÷<**‚¨Ø½šˆ{`“ÁŒF'Í £Ä`îJNÇC‰è&–b‡°+œÜÝh&™LŽ}ªp³Rè€0s×i7Ëžt‡‚(î…†Œ”’˜F $ÍÀY4ñ$dàîi@„A@R J½(£!ÃMdB K”ÿ€!OÉ2`8‹Ó)äÈo»Õúøóª¤`™Ål,Z’ ›³ûA˜—òxŒüx|>2c*œg"ͽxÛMÆ©G2x˜EÒŠïŸ&ûù·‘Š9ë‡)”JÉJ?@ÚTÓns #¢÷vhs ƒ¬”ù¯ÿ—Ÿÿò/iΗ¸•·~¼’n^t!n1ÝÓ¹§Ž:rÝèîQû@÷+ûʯx£ºòjà÷h¥¸î±Å=%ßwðsö{¯xà/¥Ð7BK÷y¥Ú´À¿ÔÓNòQ¤3wþ5^”ÞóÔzçKƒSâÝœâOBtþ‹$Î綃GaðªwŸ7j:z¹ðq½¬x¶ÏZSÓ^O7€¹¸4Û*áÆÄœWù¼Î4»ÛbÏI¿hݵ|•«êÞo]š‘WO»èÏlËç(‹wõI Eg…›e¶kž@â"ì¶Àÿë1åM#˜Ösø¬°p´Ñaáy¿Ùª[Që­xõ*O¢Z7b'·ïFÝë»Ù0*y³ÐF‰I+)Ý{-k+MÞk‚Ðò.ÎøÇEøàÒBG¬Ñ ®%€øp}ñ^íl­_« ¹ÖIæÝÂâò7ºª0l*×Kc5ää£r õâÎ|£(²Vÿ^‰_\w]l[.)®z‘Ö›Šnþä#lÍ_TÙeZ³”)ÞªQézw>ýƪ÷éZhoûâuÛ1xcüþ“í3éFÒGkAž‡¡oÐJÞ˜ëÂû·ÃG¿¨»»ðæ÷nê®Wsw,Ê·»‡Vj¥.¸VÖX÷*]-Á‹ ’n‡n+ïpûòµÝ¦nPn­ôÚyQO­ã <>7[âö@½`¥We»•øŒ¤Ç‚oˆL×UÊKÛí ˜Î•À‰xÝËÂ÷Q·óQ²–ÛÚ,ùKD©Õ9üREMwÊ®·„w4¸ÈëºÊõ´Yn×Sr[C_Gäg£PÖtõºÏ'ñ¥™b™æ×}µ\oÖ'°[§pðaûÝ•,(Ç)K-ñõ*nôÖyo6é*èyCw¦È}>”É«ÈR÷dߥÅG³û´,:¡·}ëâýeB®âûµ;Ð=yY¬<ïÌÃWCís_£úÂÕP¬[}7ÉðvŸvO8g0Û¢ÒËAøýã{;9¿l~ËcÁw•,ÖvÍ·`;^§@­E½¶÷õPT—¤ñZy`},®­ÆáÖú_þóêÇ®ˆŒTj˜£–©š»¹Û¨nB"M0rÎÙ[°0{‡œ‰`DÊ ”˜v;EÐ(%ÉúÛ) ;± [Ô¹Yï))">~ É> H”ÉJQ• ÙrÚe¬TÆâTx†ÃHhx$àð 2  ©T?º ؉™h ݪ‘‚º"ÅB&eJt30¨F+ Ú±·€LÅJšy W8´Ý·µ#R^ :•=Ì 3͘‘ýØan–^ „™`Ãá¶G„;¬0S„AUAIîeÚ{ë3‘ÅŒ@6S(Hµc@„ÈH¢eD‘Yˆ bŸçgqFDÎM  ÄܳwÆQ‡ÎPΈ#˜`Òm<0†°ó)õ/dMÅdA! > bS©!èo .® ^²sê'•-1WÁ¢–ŒŽáŸìÂJ'A3ôÐrӳʡ£–&ФNnS±H øüÉåpÓ‡âD–¡p0ž¡7$µÄÎ!„$"{o¶›Ê¡I€òJz-Q\¤Ìz¦Tv»±•˜»{‘0<Ç §§()ÍMš”ÉjÇOÏPšû‚7(󲧦I¢3ŠÝÝÌXM™è —‚lf2²'„žìôBzB<È\ðÄ"–‚•eçµÅ 9"Ž˜Ì„' 4˜™Q Xǰ¥žC=ÈlfòE;þ˜i…‘W©"‹ß˜’Múfßþìù·Ïæ.*{ì¿ý†¥¤dÅbô7ì§ì2õvì ô>ÐÿåßüËŸÿò_Ð…v.*%´;8(ɵ·’V¢ý—ð`1R^I’\¸÷žscÜcN¼ð†Ê²±í½dÝ›¿æ¶åá:»I!uÂa¶ê8«8úVÆws->Ô6é»D'çóŠ¥qÄ>B¡‡°ÆÃˆç f]½ãUõ‡xÐüº–Jç…ó6N”tï¾¶ZòÛXñ:rÜŠo•ᯠ1é,¦µ=×%èºÖØ)ö9LYtò@×F„Ur¢óoªN]òs^§®×Àßrñ+S‡TíÒðÐ~oã-w øav¼0ú嵲ߦzªƒJX ÿÍÂçý»#®í$_º%>4Îæ¥qÿÒcæÜëñºÎÜÛ:ˆ/.ÍÀ;d±›9#¾Â¶ÒmoL„73þµ~îý±„ÿίáýSíݵàwÝûÇ<›ÞÒÀϽ«?)ó-ÊôG§¥÷¿ë‡4½íªü#»Ý€?Ø~åß ù¸6«\ì…:ÞEÍuI­¿ïvÉǾEºñÖñ½ñ&jÿ¢ÍË—I¸%¼½»à¡ËØKQû÷‡Èo£|7T¸ë 2‚@oš ï­+àÅ]‚øÇÕ”•K %õø¿þû‰Ö³GöÌLš•][©¥ì¦aþi$Œf6°oBF²¸›•l=%O rm-nfǹÕR¼s'iÊè±›Ê8‚æCWD!˜1×âØ‹™—b`ekšçüø)çRÿãßNO¥Ë–ØÃ ùã1í0[ô8´öépü4«Í1{ ¢÷¡`sÂBÎr¸Gˆ _¨h-D6³¡rwx¹ðúi€N sݾî»±£ iH²b‘æœbî€"ÔæÈ†âîŲ÷Ì^§²ÛM¾«BÏÅ«‚æcDgØ( ´>+1¹‹¥TçFO÷%û´=†VLz‡b¬Ç‚>(Zíä¾24Ib‹DäIæh˜[¡F‡€4ÂÀêì'dǹ0 !;hØ]:$²Ã+H˜C"’’Âx Qzöl’YwsKÈ8üe¥é>•º¼G¶~Š*³ºÑ«<ÆÈ”˜xõ EFÙMÕ,Z¤(9DJÈYÆé1| h²jS 3gµN«° ¸ESŸ;å¨P{žM˜GïÆŒç#%T(S­e4ºIdJŠ>Ks?¶ù ùèèLõL$,©–Ù»™²‹G ñþÞà¢K¦©Bº8§hVL™\Ÿ„NÛ“|:ÄTmïÅ"SéfP:¬#ÝjΜ&wš’!KL´ŽD$jÂ,r7ÑHK$`ÀDTÂ-Ai2˜P o‹Lº1eÆêÊý4Ì ÂU”!&É̃†°±™¤[f7-4,»½ö>Žâc!¨ºÛó“y),… »Õý“kÇ„—e›Es/f¥DÌyŒŒ0w•’ÁèVv“T3+Ì AŸœÃì;’ Ÿœcfç!“™æîRÀ1›‰\Š‚:AÿÈá× ô ¥H ?‚D¶’Ý -a‘ÑŒ¾«»Ì¹ºž[o¥gK)XSG!Q+çF…™;TÈJN F³éiŸ!2w?û9wû6Gùf§.O•ýÎJ9ž±›¼7Ò<2‘’R½+öW¿üåŸýË¿ôZÍŒv’pYžî¢B¾"{йâB­‚ª1üqÀ§áL%}ÔðÕr¿­?Ñ]fÂç噢ñXÿä«Ðñ·m…ЀËAð™5$7DŠ—ü½ø.D…w]ƒ?K6à vÆ' ó´'_Éæþ$Eç_£¯hÆlC[‰š»`À+˜Ê•Eð½æŠÏÇß.Úê§¼”4cü“‹æªÚ”:Ë&=Z ú¬ ç3Ñu¾â»ùÕÐ8’oxã+Âßç%ê/ ù¢Éé&«ÿKx¾« jÔ{gÄûÇÏ—#¿” ß°pøÞeöÕ~áû¡íÀ˜ï7Ä•÷/oý€êœ¢#ü¢áëW×fúuiu--wë¼A¯ˆkë7Ô\6§Ò«ïüm1•îÏ­!­´^¾?x»ý×Áÿ !ã5n0áš!òU×Ê Kþ\2Ù6Âk>j~³¢Ó§ø|/0ºNߤä) Âûï׳BCÚÞ‹[-æfSµb"Y|:Åë©i`H4;CãŠí8Ç<‹Ü³¯î4 ÔÜ•IÀÍbæY=@ƒr×:îw¹Û©¹eë€ÑèµæÜt ý_ÿÕk*S9?““yìñq>çãÇ£÷sïsCO…2“64‡Ì—†faˆÒøÒÉd¾„–Ót¢·EøV/yhŠ,š?c&z]x¾Òâ¸+AýÒ¥ãfFÖRh48¨‰ÁZ§iW„lóüô­›){?F €™%’ÎÊRé™HÔ÷ÞçÞzOeZI¡…_¼8œæbEÀ„P DÚrçf/mx ÖaÆâi<Œ<Œˆ¦Œ-ˆ ‹®ÑøÅÞ@@ŽEB~µüsÆ3À‚rR"êÑáDdÀŠ„n:$=B@á©©Û8\RÙ3%uë³Lc!}YÆìM’´Kµì‹‡âá»Ó~Çê$Ô3ÙýÉÌY§*Z;4¥†µ•e‹K$Dƒ+ZX"[öVvÅŠKˆÖÍÍÌmòÅ(Ó”]Ñ“T5R ±'ÂdLš 9w˜ˆ~üqÈÃAóŒèi™‘@§fö”Ì-k°‡4B]M(‰‹®RH)c0Reæ@V …bZ§X\b* ´¹»\f*Æ+Í'›îœg¸“©B$‘)P`ÚҠZ°§Eg$ˆ,çBB](@Ž¡ïzT£Wkˆ§êôÌŠ®^Šècéš»±¤Ÿt-Sšç3àŒœJîk™&¯¤YQr,'w3K„¹›•È.R¦Þ^H‹Q|r)¢¥¢ÉbÈ4¥LfÕ¦E‰Œ±9ÁI°z™&HÙûØJ£Ï^ÂÐc>öþ±T·b´„@ 3:(ȱdÙ)ùLàøŒH@ð‚2 û`(Gù ;6A0©Fa—6õ–1G›çÈCÌMMæ´b&¶£rø|€P)剥x-„§ ë„ýTz–_üùÎLµÌ‚O•ÑóØ»"QÜÜ£EB>Yï=æcHY)ññ‹¿ù¥O•K1æ•ØRoKŒxK }Û©Ïmxý‹ðê×+ðåHìæ¹ø:T"=&Ô|fÞ´ª_§­~íœeUÑ)L_ê>ï³Öíúš9÷©‡ùÊqìl‘«ÇÐÙK ׋½¶6̪}A›.n>‚Íÿ´DçÏ_¸æ=&x½Õ9o“r=ó´.Q8×-ÈZºÓ¬/š<àJ¤hˆ³l„V.m;'yÕDæ…·wµ¿éŽòšˆ¯]xn߸,™Í®äj.ýG‹XF›Ë¦ZzÖÏ8ÉB-‚B—gÙŠÚk« ÄÈÏ– ÍN1ØØÙœk§·»Ìª„u˜Ç¸åx¯:é<éž1 ïQæî_ö$Çt »ié&ZWÈ7úþËT;ÿ:_„й2x×þÿ Ï­$…®aÈkÙ­¥y®ãž\Õî즫ªçúÝ èPÅ» â$(qÕ¼SÖJƒd5绬ûG\–ÈÖj粫=ñæîi½ØV̯õCôv«uøæÇ×m:¼H¨m}:´´YÏÞü‚w£HÛq¬âíC‚ƒ´MÜõü»-§ß-‹ž%m³mÚ{q•ÇÅða©o£¤rÝ£z«C¢”Öö \)£­W-×QäÚÛKÛZâíÊÚHn½¥¦°ú½·Äª÷Ú[nšºtOìß}5—•}Vãš´‘}ºèzññã½1œ‘ô:Àùrýö-p 6"nK,~™°+ù²\"ƒõ¨j½1Þ,æ5®óž£[ãž+Ù¾ àŠÃqÛ<«‹êÒµ¢Ôm+±^MÀ®ïI›o>ïx¼¶âÕWÜmŽ»j©^öë°S›Èr9x7*]½¾U‰+JÜ}ßšûçõf‹^š‘oK>`½áÂY`ÛÀÕ"ç:$¿„wØ´¹þéÍÕÎÛW’åÛ ðÈÅá³PxÞ~ÑM 6ÖºgW3äêÿ®ó@l±7RB·_~uX¬Úut'U>q„ßüæ7Žß=g‹>·ì}‘èr·©”:”µÍ½ÐYJ%0·yÈri ßõ|˜£õ¡4mÅ{kyêóõÂè‰ÈhAwsfs“">³Ïüî“;§bµ.74Fðù’­«EV·ß~RïúOÿ›v^K' ‘<èx8š2s{žû±åܳ÷œ##G“‚) &§ú/C8 úüF‚ÓÝsm Ñ‘qšðš<@"™ˆÚ çTk½7HÊ€{fDIYšs·›Ü-²ƒH­z)z ¯®bKX]=Ü&fôRÊM‰ÌÄ Úçâ?Ü–ˆ%J )¢ ,0¢ŸJ8J€h #Ìyz|:ƒ„ˆ`.úC5h´ˆP‡?©½zE&èP":šåŸ!ÄŸ õ ‘¡”L 3«‚„nVQò?§"2)(óŒ!ÅC!a¢\™ 9Íh¢¹„ù8[Øô´‡[©FJÊùpL‚™Ñaff¦DÎ BùP|gB*J?Xï³É•Mpº`ZlÍmÌ~ó?³‚öÜÛwGß[D‹Þ²'"«)m><+šO©ùØÙfl Ù"ºf!a¦„ȨèÒQ]è Ã’g€æbRÄó,"»†kqîŒFìŒsÒhûÏMU·©Øä6[r2Í=¡–L÷=‘T ´)]HÂňNÚX)HôLݨ€&Íf(…æè]Ñ¡ž#&[2ý9T '³Œœ»¼¢,iKZI¦Lót&©Zd–fËRŠíJ-®ÖgõJ*òì¾™ Yji½¡'v^¦¤rºÜ£/}:™‚DŽÚ¤Ó©Lr4ü­A„ d#ŒuW$Ë€RŠïª9aÈç&S?ü¶a¶—i—ÑÑÓPÒÙ@f£Jzª¬À 2YX ”½©þŒìJ1ój¶æ1GϹ·Y9÷êäX`‹oÂ2Ln»o>ìž¾í‡ V úé9v:|ø³¿@p6s÷¢ÇzÌÏ3Í뇌IŽQÏÈ6÷>wdÐ}Ú•?ÿW¿,µÐŒ/•y‘ÖÙVgÚ¿5Œ^8á©m9ÁÜô{^gh:Ãnp?:à¶ÃàAt½Cõj¢sÔªM}âæ ½Ùmƒä³¤æ6(%NÖ®|¡+÷Ö?ùˆ­bÃE8þ pxùè¶óáêñïPjnЭ©=×8¹’¹~±À+y‚â w®•hî]­•;€ÊšÃr5ˆEkçAáaáo¡½U4FÜÚlßÑš÷³nâ ¡YƒÀÿ¼EçWì¡«ëŸSœ³ì¨”¸/¯Ê«iu-uu¶õQL7L—¶§ÍªÙ$ÿz]öVø /é›1—{€«…·*máì[ŒQ§¬õäwµ&îd/!ЯÔh_Z«sã%l™o¦`]ጯù*‰ñ2›?sbl$¾(0£Õ¾âµ">ߤüóíàÛ¯ö‡e÷½Zóý>‡G>„'¿HÀ „ã/Lè×ëµ£÷ì€÷þöRS|¼Ç|ŸwúWÕMSOK‡Ÿ3"/ˆšßÓðK×_kì>¯àYò[!ÔSô¶–Ì|yRßÀâ7N%ÛÆ4ôŽˆþgÒÞ_¨Cñó½ûo ÞÖñíZèê+_èà= ÿ-}¯©jžÿûÞ€[½ÁsÇþ+lnŠ9/7ròq0ÿ€>|Ñ÷÷RöØu/#+úõ¯~5þâù·ÛaÎ’ŒVŠ{-,æµÐ=—_U„ºuÒF¦š™‘ifnV ª™2ÛsOÀŒ^œ^tœÝÕÚÔSÙ …—´6ÊŸ|È]g¦h!¨ÐçÀoŸ1wK£¹ÃÑçÿø§§ ½'Ô€2Ú±åqƱµCïs ƒŠõ#s¤†žÌÀ!FÏ¥`Å3ádÈý—“æl=„h .=Ë–×fD‡Ї?0k)fÈe¨eÊd»§š !Ü• xI  AƒÍ‚i¢’)D_t”„¤ƒÊHì&Ï®ck‘ GÌ¡8Ø¡\èÛÀý°"à'’– çÊ,2ô¶Ü']™ˆQÞÈ“/Îð~ ´¶ 2™‚íBô‚Hôøâ0è­zèDbùÃüD@eÈT<½”¤8Œ ($IŒ¤™³z瘟Y á¾c¶4÷“¬(S’Å2UÖ:*R)ıG SßñÜɤ¹së-ž~úäÕsnR§ØæCÌχ2íʮҀ£Fš‘Ùcþt(»ÚçpG?˜VܤhskGczi™Mdž쀢͚PSt4¨“‚§")OÌè*£ý$sîˆÔDcjZʉJZg5HðBO§9‰TFÂÒÄppGNÅU³Ðàðj”kžcvå£Iä' šˆ>øï†½Ô21Á„Á Ø•Ÿ;ÒD#BR&hÔUÇÄÞYˆ ”𡹧¤IL“'!Âó„¥Y”’ægj½ôTõ¬¥õÞçy÷“o­²>=y*æÙ¦2=™—Ì$‹¹D‡ûâ¼KsʇÏXÓpõÌR8tÈÆì\ªn¥dªTHè©ö|a€§áÞS<"å‚»S!2Sqãd^à¾@ü‹€y,&Xl‰—²¢;)ÍâÀ}7ÑLÊx>¦Z*3s©̈D^"e¥N­QbM¶c€Æ:ɪÑÅR¿ý©ÌdDâùÓñÃÏwæŒÈöÝ^b’†)Ù#SÊÞ3@uûåßü/eWÍ iîöÆ|t |áåÀCãmÅdîS¼.”í/§7ùB«ðõ®ðØ?¯tèý!ìWï¸o_Ùšò»!¿µéãqìýu²°õ$¿)xà›èÎþ¾Û[Ñß/ôÿuÀ½)õ'*:þ—;ÞBç %t§' üø¹SÀ­ô¿x‡p[/X­œ/»¼ß€?ë¢|þRÆXXÀó··cï_ç\ýq)ýøù“þÜ0þ w¡¯ø|?~~ðÇ—<^Þ9‹ß ¯ËGy§Ææû•¯&úŒu¥/|7ïéÇ}˜ ­³?®;_ž9Ô¸üJ_Œw:½Z@úõo~süî¹÷PD¶X¬™ÝÌ­ì¦R ‹{) ztœÖ[FO±²²?ÏnÆ©"ÒŠ©8CÊ$z L+ž="(ferµVœÜ»eƱõ>gK€%RÓ^SÍ”xšØóùÿü?áfp«5½RIW©(n©Èê½:Äó¬CI,`ðØʀ̑N-´\-l}x0À(aŒzîÝ]æ¤×à(' áø »§ÓÛ'vÓd^Zt¸ä*Åk-V ¶R´ˆð2švå­Ëh0D(çÜ?¹Wëi€£õ9çî¥ì¼Îs›{«‘F#€˜%Ô‡ÈOØýOB8ÌäG°ž“ÆÊ"þƒÕÚÏ °Ó@Ñ <Õ´* "@‚Ž´åšF(ÑÚ‚.’è‚(/ˆLT!d>I€D!Ò ˆ…ÖafªnVÈBÑÜÍ(X&2;d^*­ ”Ñ@ºR4ÒôT𓥍çò²’>üü©Ô’©$™‹)@o]!ºÁ’²%€Ì¶XÑÓÌ´c‡²5( estö#`dëyl6!#Õq|öÞÚ!1Ì(Oö­¡KEô\0ÔÃŒãœfÆd„ A%hi°Ã ”1ˆRªW6e†h7¡p¨Yî÷pãü pÑPªÜˆS‡P$Ÿ&ž‡T…:æPòQR7LN½©S™šœG¡¨@„Zd×Ò¬qTî+ê^g‡¹ ¬(ôJQ¤Ì…Qsɬ%<°ÛanO?ý‰–I2(|šÊ4±Òh´eÎÊKãß ©÷•Ŭ”1š±¬Á$E ÀX†¿42FAVœC6 *R ¬/Ðñ¥Ì¬+}Ž˜Ç䫘øø u¯@.ŽH° $˜ ƒ£ÓŠål™‰Î<*5÷c DtŒÑg"’$œÈޱeHfæHCš@ßïýÃ%Ú¡=}óíþ'û®^^“( aÿÍT¾ùF~ØhsŸM=zëHyñ¿þ›¿ùé_þ¼ ~æÝ0õ÷¦SýBõ"OáUÃ*ØÿŠßpŽêxŸpr¯uñ3c¼·ªé =×ùrky3%æï¥ï“ð|²jóâN…‰EçPÑþÝ€ó âëÒk“™7þÖ¸é3¾¼ÄKC8Ö…6Þs½þ> …«]®ûµ2u9;~ð¤Ç²N–ö“¡4ʵ†ï•]6ðôi+97L‰àÅìû²PnîëFþ“möFãRàƒV¦·b[¦éZùG7 é7@Æ¥Qáö¥Ý3)¹”Þïœ`çæ GÛÙysÙü*o7Ýâ”z ¯:Ë.7¶ª?ÞHè¦:¹Ö"¹)êæ)µšz¼—ê>|k›‹ò¤ûp}CwFâÒ+xV)ººê¦NÝÓ*¸üÈÚªnZø®å"ˆ÷€Ð¬—ÅÍFÀíÓ‚÷Æî–¦À•Ô™Ÿï¼þ‹{+èNyŸw|ZùÊk¾y·çßÒµ6¶î êÛ“[áª{x'/?À>ºm^-y.ý€«w«×÷^·v]¶ÓUóÎ5·|‘Á2Ñûz}ßoÃåfBÜï.¹7~¼•iÚJƒ]¿gj£kƒËÜÕõZ߯T›ÁX©zòþ¶£ÛeKòÞé³Hoõ²^Šîny0çÓñÅÐâ$òr^ëÙ§ëcXë“ëVF÷—î"ôºÚò´ýœECu« ¸m,q€®&ñCy$®–ÎgeNµèÔ­ Ͻµò¨ÉäÎë|Hð,1Äúÿµ4Òký×Uƒ¯î žÞ»ð‹ —Þb>zÞ%½ÒŠzeq¯‡ý…Ç}cÃÝK­{^|S#ØãU3Ó×a¡q«%këõs·±ëÙ¢F*‡&ÅÿosësDï J)¥8àVne*µVÍhææÞ#3‡¹ 0³âÖ['Áb17ÏÖÆ£´¹•â,¥V/¥Ì™nì-Õ{¤ «µ¹0ÏC”Þ[ÃóŒ©*ß~T-L©÷Ìÿá?ì÷;[Ҝ欵jÇÞ{ôCÓÜçç93æ–-iÈ¡æo/()DžÈ`NÒ=C¯ß>†2¡ :iCfHÑ€ýRcI,€°û8É鸀JÖ½1ýù¹Ük-{7*£ Ìz5g„B \(ò}aØ|h=²3ÈB5!§×Šˆž9{dûZçÖßeÙÙ7ßLÏ­Ó‡ÆÉ »'˜CáV?Ò¬Bói[5ˆ'×_[8û<•Š(”é¢ðz>SiÈãÂkXl&FEbðýGñ md VÑg¨f‹)±1Ê#h@™Ù$÷RFÄ´Û‘ì¼N¦2z/lH´P戠×êS ¤›[q,N2»H«e-iÃ’XÊ~ŠDšgLIšÃå”P>MÕ|ØÇÂÌz1s§ÄÞ[´#£#" z&#,= ‰¹åóQK¨£ø”ŒPkP œÄ~5ät¤ìi2vâ˜ÊQw/$­øp3¦ÀÂá }á,àÅ!3¨@t$ŽeÔÎpè=j&‚,xVNð'hO&ÙSÙe„{ȉJBbK$ÒÂä"pŒl‚C…¢÷ÌÐGˆÂ4iwÒ$Ò\eìØÓ•.£O¢Â¨Ñ¾’€VÅq&ÌëäfÍ(+VŇy…F]gIDÄBš!AFëÈØûÌ`&¤$'æèïi¥š[FF.'…J-£TD˜1•è]³wß5Ô;¢I!.…FΙ„:jAýù² xYök/˺`NV¦Ié´dUs´”€Žy¾ôô((Žò ”ètšºMÓ$+_&¹ûÅ_Ð:)«¬ûi·ß7À‹¹ï€”{D‚‰ìmnóaVh ÑøWý×?ÿå_˜ù+Tv݈-ßKÇx§Iq­®¹ÑØÔ™}É“¯2P^Ǽ›…Ýfx×xÃ=Å×5 rÇŸEYÖšš›fG¼dHu&Äo‚º›çÓÖiêê´ç=ýܵúë=jÝ “f䵨„ô€Cò€~'.ÂõXËÞà®fä)Zº2z¾â˜_Â"ÚfD/NÒ9ö^ O¤%Wê’|¡H°ÆÖ«f—˰®2¤å>ˆBËw”NZêÜäkRùY´ñŒ,q-l¾ERþyŠÎ¿%øü0ÿÓüŒ2͹€:§¹\oW;¢îöv¿ ­p»Ýéfiè²M^z~רòi_vÐëÑMfÇ»ˆÁE‹~c黹Ùrn=3B¸ÒO>ý¼V¢pËÄ¥`sÎxò ÀÕ‚¾Lö»8ëæàZ n=Œäcù®¨SÚêdŸ¾HwÞ â~ï©GêÈx?B±$žç i¥‡ý‚ÉKÒIºsdÞC]ß@èãKWºÞÓWûÂ]¥oÞ_1¯»|¼·þ`ç»Ô ð@MŒÒõ‘÷ÆUxÍóú3l–ßú–ueŒ~UBºF¯ßú'ôý¾=ˆË¿ÿ•ïßÜV«xn]ñðE[>›Û´½s½úf–‹¾ï~Þ°ýñÑ÷l×Ve!ÜVNqô™) J¿þͯ|úíÇ8̽u)¹ÍXÜ‹OO»qZùTº»¹E¦ÐO*¢ÐÞ{Ù3£ sµÖ¬3Æaæ~×b®îFöÃ\w…Ÿžý8—ow<€¬» VžŸ›æ9çÞ?ÍLY ç^ý§Žÿ¿ÿ’ƺ›à~lF7Foi¥L,Oœ?Îý0ç±åól}VJHz0DƒXP ¶èx,¾Èc«X, 2Ð¥dÚ(Žˆ˜”×ÅJ‡è‹0Π̦¤& Sg@.H:i0c¦éÃO܃XbfJöÌÌåÕÊäχ @N¥ ”(OafÑÈRö¨ä®¸eÿ4w«¥><Ï,‚ æn¦Ì¨Æ‰Žè($}à sáÞ˜2ÁÃu#B…4Ó!b2°&âù]FJYL?ý@<á(ú´§JÎÉJLS˜µ”Oso͆£7  s•j´R«M¼žªMeÁ9ì„u˜%0ÜzÍÜÝᣠ)AÁÒifžJà–ÉèVJ!iVŠ•]Z‰ŽŸýõ¿ò]…›‘útTª%vBíy®ÄÓO¾‘¬0&‘Ù3zW Ò_ýÕ/?üì'cqCÛHß¼¢ªÆ•VA×Ë™øFfýŠu±Q‹ø¼ ÿ^ÒùX s­º‡ñàlÆ5oóu*Ý£9=¦=½”0Iº÷>tåzFÞ}¾*Á3ŒÑ ß:Pqû§÷Dr6F£+âɆqáêr޼NÔuCã2¸¼}“›"É…L¶‘y% =ó:6… Ôzö9½‚¿Î¾ªäŠRÍ?)Ñy¾›¬£W Ÿ¥ŽüÇú!¿z.YîåLFýv§Cú TI(%å¨5™4ãx!¼é~üüøùñóãçÇÏŸ?_$¶ø¶ð’+?¶¸þ̪?ö›v•™|égÒ»rõE¨>õëßþ#€Oÿôñøé HH^k),»"°ì&/V¦‰d(‚R©©L8kFmƒ4ÈD¢÷PoffdÑ‚4ÛÕºŸÊ®Pïýc‹Ã¼/Ðq®T5οý· ôéÈHµ0…‰ihŸV&ˆ”7 ñl8mHÿ>Îßýã1>ÎhͲA!’;»ÑÚ)í°€0j"‡ìÅ ù»X|H ‡F ,1 öE2³P,Ù€ñEZXðK]Á¥÷ÁÕXPJD @VÜI£R=Ed¦¤´„Ñ‚iFóä Aô9R‚=”YÊdî-Ó‹¯sk=΂<‰aQ˜ˆÀnÖ0MøÅ/`ÙÉÁxø7@ 6Þ¼lð mâ$gS÷e‡+¬ ` »c$O®È\œÍ!Ç0ê‡ñaõ’ºOnwc ©ì¿QIôì+zw+#5Üí¿¡a4“àµØ#S`!Ý£Ù°Í íÐ}*>¹OU! F÷G´lÏIfTô¹Cœ0öžŠDtY!M1·Q0K«4÷ŒTOôd&\#gkq8Î-Ø{´C*=›ZÄ,´TŸ©½#;Sr.L~œìH%ÜJÀ¤ûLëMPH‰R‚~D*™“ñû®fýCµpw`S£øE‡Zï–YU2dÏä²Ê˜¡9³“±пÛÜ3ˆ"$ua†¹:*ø)¢ .ìÁgˆD¡¬à(y/¥>ÁvЦ]a1ƒÌ 1^½#àæK• ÙfšU³â atºûpx¶â4#m<’d:æ d bdúc€!÷èʹ„Å-£×B¡Ôˈp·èafˆÔb†‘]Ù]‘”! ©zCÌ0ÀNkai¦´‹b½Ÿ–’˜;F¡Ë˜¤¦ se¢ÏCXŒ½+Ú²$ËV`C0ÁlèO¡}›¬“,Õ̸ÿ³_îöï÷‡Þç™e-I8i…„±x‚Šasψì)é—¿üëoþìç?ùFóÛvÏ îñÇêKì“ Ï'¨þ:$á[è™?àHî®Í×–üãüÿa®¤‡^¾_v†lY¯ËY¦¾®¸8k¾‹]uÕîüÚïnEÈmËqÍpGŸàŸr®Î- $äëkÙNâë®I ­„°‹¿3ÎJ ZG³7›ÊYm‰'¡ÙSÀ‰»³VCÂ…Óú¡…„SY[É¡{R$/Œ÷å¼SËÕýåéázÕÍT_ë°½z«Zéª?ÄãÚù+®¦û¾“æ‚®ut®¬Ï7³mÓ¡G'Æ…‚½J­W=U­–7œ¹swÏÝj«=z´SGÍE@f6ñŽÇùì»Wž| ïXÑ$tÛA^I a»Â._ð5ŽÜk@CçæÞyªëæÝu¤;±åKí)·Óèf—|m…nDœÖ—çYAìú›yiû3W4¬vÞ¾˜ó/mÉÔº#Ï¥SF—Ãçî \÷4éU«íSGÛêÝÞlw6š EãÚ#ü»NÂ,ÚNmnŠ?[°Nwσã…ô±ÚŠ´2ËÍÑf¢;ƒ.ãÂ÷¥]¤6P€_”ÂDZF/ÆÉ4QE^ |áQTM('2ôá{,ÔOž>þI¤dN“AÑáµ°dqÑ+ĈÈ‹–!A^R¦$ô¹{‡IRD´cä^:Ž8†Ó"2£e$sñézGFH( ‘‚?@9 L;çE½gl™½Á™ a¹h ‘Y +ˆ †åOh¨ûEœ0½s”‚Ŝٖ< rùy¯C;‚:|”rèbܼ²N¤W¯I=tºØDc¶î^3³?÷úaoææ…ÆÈ€¹—2”©F05´á3æ>Ãk53…̵ÿß~÷©?Ï ß}¬» ´RKö0CÄŒL§38Þ^¤9-º”‚TzH`öÌ&ÏìÈ´B˜ñسµž¡Ö,{ï-æg‹ŽãA±ˆ-)‘¢I $™4ŽöEžQ„ -3/0›½”B;†§RäfnÙ3{rWX=Y>}:<¹5·Ž`d:é…ö®y Ð&ßÑÚ=µ§I8dö N0Ø#}pp,«¤¨ÁøF›“™Ws¡K]è ˆ&™ác-(‹9·£VÝ‘@´»Ñ¼ê=l*çP)ºÕionÊ\ä›vOV ÝX]”ÀÈf¤OEY÷L(’FPŒÑ™$e”Z†õ‡M5yìf…K1í·ÏxÚyu$”ª¥dU·uD•–pPF"”Ùè¾|‘a´a:Œ4b!16 ˆˆžffÞa£¬0|f fdh‘ý‰“= aŽbÌÎH£»»[ÊÓzõb•bµý_þ?AY)Pfëmáæ¥¨°{BÓ¾fª÷ž©èÑs´f"¡_þËõí/~úÓ¿ü3<Òý¿:³x“nÞf÷Wçü6ºh„•þÏé[¸þj¾¦ü&±¼¾—•"å)´¿uŸâ-аIioâCi{­þ”x{€s]Èô:aCz¨&°…|.ú0·m‹—›œt»~/xóÎW à6ØG/áÀ#Eó­Ó‹t’ÛrÄFÜù¦Ys-šsÒ¹+uu=+.Â%º šÜ-“\Rú >zF)ø¸àO@tþZvõz%ž%”Ö?¿Å»7¯ûnçn›Ê¶±e¼_$éy¸Í¿6JÇä»ÑöWÝ/. ÁKgÜ)w .Ŭë„õJæìº]ûïðV>ìT8Mn­!æz‘í=Ǚ’4x:KRw®‹ÜlzIÇæ,n†“ß0Wͺ}ì|¤èuxü/å¤ÄÃÇ{óU¢¼÷î=T6tS0ÖU™®PÝ-GlÑÞÙyï Ž§íH[ …·çßxľð#|ˆ@ߘ¢n09Þöˆéξ{0èºFqÙ¼Eâu-h~3îÛ~?^êN×›ÛUñv®à/ßuÓõø¦ãËTVX*¯Žë;_õRA‡ÀåÇÂ7EòÕYÈÏÙ‘yGˆþÞån´Ýy§uôÖúAâe¡u× noÞ“ßÔíþ¥ÓÌÕ§Ñ‹{ÒF#î=“âÑZ|SÝý…«n¯Û9|Ý#y¯œv™-#–æí†(\Ö« ~½à®LÐ6ÀÕãPI¸­x½(bxsšð…Z×ï[ñÍ;yÃZÖ|ÓÞ» v®v!âá·AÊÉëHuõ½Xž³^'d|\Ýâ¹8¥×åxȦå‡âQ`Uf~[™j¶^²MݤÜwT_ï®uô©×ÇË%Wпް7j[“!w¥_Û`<ªàòeÀýãó§×85kZÞË® ëºM#¹hÝ´šø¥ä3µå4ïy'‡]ÝÅ¥[Âo~óëãÇCôž=²Gô)·Z|*tTK-ÕG°^j¥-ó'£·yîúiN£K ƒÆìI2¡ö<«óØæžÓ¾(Tâ(3IýpÈLŽÙ[&qlrΡh}÷´ãOvœ;‹Ó<¾û­ù7OÇÿø·ÁÁ7ÐØRÑc>vËÇ9ç¦(Œ¹hmSN €„ 6R?ýtx8¹3í;³Ã¨ ØpËMôÔL< RBÃO4!;g ±˜ ^쨵 Á‹ ¢ðòÄP¶žcr¤ršª‘ÃVÙL„ŒHs™ÑCÈbÞ#2$äˆà3¡ÌŒ#‘™‚CzuDV9p/¡!~ P—%•Ç#̹ Ëy•× Ç†Eê'Ù  î£ô²ü˜O£±xH(!0Âwûâãp´ 2¢=ÏÏÇŒY½•–èé†Ö*Ó\h™\ ñ”¤J¸¬tÒÍçž³‚à‚Q-¢ƒ^‹R€Mô"zÎ L}îpS)ŰçÀ™ç2‹° ë©gf%À0‰0É‘])"SÚƒ;[;ÔÏø±s‚ÖGAú¤ ‰ ÑLV˜ži€%Lî`ï rg™0¤¡ö>ƒÆiZˆ¤»»dÌaƒAZ…˜31œZz5(ƒY´Tæ€ø34@wÒ™Fcó©È–ƒçn•0+„æØ}û@)¥hˆè݃ƒ¼_͈¤Ž‘‘€) Ûd1+Ž|ôX¬ H+F7¥ÊDÒz›•fÈ¡d=z´ƒ å?æÅv»D"$ä<6¢›•êuª»ÉK¡í¬­FèÃ/ÿÕî›§†òã§92ÝTœ­§Mô©:F¡¡ÿö>‡z@FÊßþùÏ~öN3®#]‘ž¸æ›< ³W@‡ôJ~¥«¼õÑÏóþ ®-Qçt³ŸÅ>ç6·ÒµˆSÂx ¨q¡å]2ºIëôR¤óÙÊ©+Íšm\¯—Éѯ{•]„¶7Ì…3•jù—sjðˆ³ðBPºMY·ª;¼‹çߥIñ-ù§Nö÷¸M—w¹Î˜¶H3n-ãδҵ®Ñ‰\Æ­ÕîL‰Mr±­ký ˆÎ_½‚çÈmøµešt)ä}–°ö 7¿IŽÞ¢}ÕÏ/œ|Ž+ùû>åú ‹ËÍyµ\ÐÿÔbÏâiüâ¬eþØôÿãçÇÏŸ??~>»xõîHáò9ß}ר“•7E—7ÖŽ¾Ä_X}•Gûgÿ¹òˆ&ÿy<üUƒ·öxnI‹|øsoñ9ûõ?üÃø×çß~ì‡9"t凇iÙ+Åk’EIˆˆF§ТŸ«|f`´Ü#z¦ú¡EeÐÝ̲õ¹å4ÕŒŽLXâù­ûSáq"•l!’»bf*.J?yÊzfJϳ?íáæµö¿ýotÐ`N$E˜{Î=]yTïì}ˆû©nBˆ°‚:ÁÊÂT^èZv"MD¡í ?8+2‡ )‘ˆÔH^S@Cv /øÎ þ ˆDq(6‘”·è2G²Ó¼TÊU¨ =©dDësB,I«î5$¶–Å%ÂMn/™ H©ì ¥²IZ"s¡ç ê'æ•iH@DJ…UÐÙ¨ý(¿bCº'1Lƒ æ 埄 Žg¹x˜ª°6dŽ@bH–ŸµõYÑgäè 0 ”>GŸD…ï‰4’ezÚµ°ýn?&—Ê]í½BŒ‚$§§i ¹"G¥º‚Mj ­æýÏ>…JÐ(cf22{Zå´›ÌÇfaV|zzÊR¸3B:ξ¯bôc÷ZNßà€“î’¢5³L"-©@HȘC)3ËÊœ#;Ì,ßåó!#™G´ƒ7ÅsFGd`@ cÃ’Ft dÌ 0”^H÷ò‘>÷˜JM´ì‘4/¶›ÌÝzh΄ÃKyrëb<aV©æ´Z2¢ºUS;~œÑ쳊¬{ÀsfjÜZBH#MÚNS]Y°êÇ ’M8f/F'”38 £QÇ€ a’h Ë®ãÁ¼ L½£”š!&/Su¯™ˆ­š»$s!3›vV÷VÌ‹Ó 7ÂÝiL…Ñbî>‚'Z¡¹›Å 2}7ч˜¾ŠÐèDÊŠ«zÊ ¥I¦ÔƒeY%ç=!†.Ý}gœ:¿3tºèrwƒnfJÀÈe®Â'¢PÑXDV½DöŒ¹²ÿØY"–n!ÐP'@žbq+û‚º/e23¤1;Q3Yþ×V k1‘fï ö­7+Å÷ÈÌœ¦)¥2³E¶6:«¼”éiúÙ_ý [‹­¯ÀºM-üGXåÍbêNÀà üFRæÌðß0šµ1Aüã–úzsâŸñêù=ˆÎ¿=×…"ýÕöqö|]Џûû7ß7L²7ëMÝoñáIifsÝWw#>VÚ¸ú\:xùÇiœUhç3dÝöƒU£4/ëñW·ôlÞrûîhïœyr­”“ÒÑâëk^Ä,Ô—^t¶[ó^p-ÁqóB‡dÖö#ЛU+ÊVGãÒ%ò…¹²aøò ›×Ã2ò(Uâ$³´õ*¹h‹ðúyto0x‡ÔªíÿžYsüL›ÛÑ+«þ1Añ’ó=úž( «1¹bH¾p è-+\÷8Ò÷žñb‘{ÍEÖ¾à[‡äugÅçä"r—Ïü>ê¹ÞÚr;’9*¸ÛSríꨇUß'RZùfo¸'§s¢êñŠÖÍ _SpøðèàãwpWóéö9/ÊçðáæA®´í©—­˜¶ß½Ò¿{‰Ñ«;q¹îЉ›¦ƒUKا&ß jKô~_«àæÝü1ã%};éà¾qÞ6a¾¸œîÎ>êе:/ ]|´4¯g̪íø\÷cèåY³m&•.]DiG=˜®wßÝ]’üF˜èͱ×;+S¯Íø·Q‡/+ÊÔÃÊÒù®u|N3jÓ¤›†/žh÷ÞÚ›Æçmš¡«3óÁû¹´£l…0ÏQøi®H/o—üúB§{-u\º•~õ¿püî¹Ï­Ï-{Ö}€hF÷R‹¹y-t3´žÁ‹Ül© ]ww™9èkRfäɶ¨Ð!Ôý~ðÍ —æ£eÔBkÏÇòa¨83`ŽÍÈòaÇÖA+¥¸õÿü·RÒ)ƒÈL¥Ôrž[?tõCÎMÑ\IKó$™L‘€£œ¸G™ BqQ*…GIªßÀÝSaEŠÈ¥F¢¡ ]f`…Ù£lG•3¸DGÍUH¤M‹Û§O¤ ËY¤äâHƒí†²¿¬’QÌM@(CinÙûÜ#gÍ x%£ŒNj§àyHñŒ’ýtå)Î8¥>sƒ'2µ¨ý44ý 9l*Ì6V=a)x‚¼;Á|‘~qG™ ­/¥:Ôa¾Ãþ?âp(À+@@`Ÿgd­õ‰,ôÉÜZ&°J2ÍI3ÁHC"C¼‹C"M,9Ö‘3ÝrÎHÅÀ´Ý=fÅ ÕjbÒI”jŠJý0k?)Ò«ÅÍ"”3†Ü½Ùu"`ªTÒÙZct#ññY-ìã!ßÅñ;3æÜúáúÉ­VȦèìB±…*> ^Q™è¡T3ÀR*fåh쑤U!Ìsœ´4ë)»êØOAö&8sô·<í9UE§9§æ,ÇcÇ("¡šVE4"ÏsBD2{Ji!š‰ƒdB‡>¸ cÑ´rÌŒ¡ûK¤cª°T0k1ÑP3:¥4S!I—™Ë&¥9\)s°w áE©ì]5ÍJtÊá¥FÉ܇ y›fà$”V'Êir2GÝÒ¨Ô©I27´þ3¥Ñ¾8 "7#¨H9ë~oÎ9 z]Ç—Ñz(Ͼêââåms-…E½žm¿wœeSî© ÝŠÂ¬{C¯¿úRž¸iÜÔýÉÁ‡/ì¾$—n&ÿËU¾¸tF:÷q¢íõoOü­2"//Y+A™Õ»F?8s¹È>KßI÷Ÿë"/ÁW ¸à¥ëPo;0oMÄVÀ¹FȳŸ¯&øªdá"ž±:i6n$ņÛ×¼ŠX¤«)¬„Îûùù´¾¹¢^nƒÝÌ]-t5–ºÜs•Ÿ¯aÙ¸}Ñ«{Ö‹ÐÿKÚö§g×zuxÖ5@Ï»hî:úÅ åy¼%á@ßÞø ZÌŒ´zž›2W¹ÉaVª˜ê…ÂÕݸ|¥ÊJ…Pì+ÕÎW+oO ø@ågÐß\­Œ:ðnÝVND:ÿçÑ..èáåËVJ´ D×Ï(]—êNy.o&ã%×Ðý»Öý€û²1ÞY»Ûlž®¾ ÿÏ¿ýØs´>nݽÀ)Z™jÝí¬0R i4 7󹵈ža¤µÖ$ù)Í/eJÅ2²Že¿s7LÕÌàÖ~wôZܬ}÷IÏŸÊT)¤ 6s¤Z)’è©Ò Dv·žñéˆ9æ_ÿ*Ñ4´Ü•²B"ÙÑÙMsS;€™€!@У†îÿЗOÁ"Ìž(, ‰~ƌÜl6‘©{Œº2@¨Ó*™V÷È®hª{Á–m–V!ä±!Ó¥˜Õ¢Pëa´Ýäœ=–Üÿ´"\‰dŸ¾AŸEœ”˜ƒb©hMJ¢-|vŠ™jÙÏèÛRà Ÿ²…5,!4<Õ äbÌk»‘0À JDGœ K‚ HäŒ|‘]Z¾¥ì€‚LôŽ6û8Ñãtâ$"€/Ȇï~³ôa(àƒ!fˆsº;Ìe%îÌÞ“^`N7 >UzQ”…²ìŒæÑzö´R`ŒJ/Š–“×òÍ4 e&K`>ÂòNZ*˜3çé™”ï\H,P63geï©V8¨Ü¬NJÑ™ì™è™­ T„Ug¥Yœ;{‡ŽÈgÌsïíØZŸQ³«,¦É¬wõ” ‘€A–´H y¡ xŽè0€¥¸¹;˜""õMµêa‘…âÜ£NÝh@SªT¡©jô„ºfFÛ Q0‘™£f“*ËnÜ;Š[!{*5?"|1ô{J;D& §§lR“’ µ’ÅäþáÉCŸÒ» ݪ›èò6ª¢RÊÞFg‚£Ã PÎMfV&£{)tƒ»Ì%ëWVÖ@€;bá¢Êó0z¶©ÛBçÊxWH,¿P{Á;>/½áiOx{Ò÷Þ\:^Tƒ^é ¦ßpÿï(ÎðNùG÷4ë¿Ô¥¿GYë•øÏ©Ó}^}÷ÇÏŸ?š¿wYùOq¨ÞRÀ»‰c¾úö —Ý|×*›_ñË¿þC~Ù“ø-×á´ø×‡úµúK·}q¦ÿ]¿óò‚Pþâÿ:ëâÕoS¾KbøGÿP›,æó–à•O_îñÓ™ù‡_ýêøñ¹Z´–=æÕ­” Íi» 7º»ÀÞƒ‘$át³²Û j­õÞÝ=áîûOÊ© ıIÊÖuLJ–YŠùOön¨…íŸ>foùagS ÐZ'¨Â‡3Må.÷÷ YаC˜Le‹vìí0£{"š±Ó%î¤ÌÊ䮳 pŽBK%ø{GO  ÏÀ1Ã]A:A¥0°ÎBÒ"ú(ÛÙd^KÌ]iûŸý$sžÿñÙd’”¡Õ£T@苹¼™‘Hfzô0"º©5›ê7CŠ%ÚŒL:™CzVôVž&1£òÓ3žŸ•3¬Eë6¦UrN!é„~ 9-S{“¥ .–YCké|ˆ”›fä˜9ÕÝ}?ÕÇB%ÙJq÷&ƒÓmçlÙ…Þ²±a>t± –‘š´£¥ËÑi:¶ˆQ줡 OPªÎCW‡6(%ã€îQ^é¥ÈJ’²‹`Z5d频€¹{Dö æ®”™Ìn™L™OÅÜhf^Q\nô:7™ËKÂÑ)¯ffîTvšÁÍ]ÙZ˜»›£¸¢™¹9ŒÌÖ3:•€*2ÆÔ¤(Z¶d–¡üµˆ˜AÆQhKšŠƒð˜›¢+[¶N3æ»ÌÈÓ¾Fähr¥` CÙçOÙægã< ª9T’êÈ€"Ñ‘JÂd…þš‘,VhVàÕYБPyòò´ûö¯ÿW@fì‡=`Tµ TK©. Ñ‘4ÑL!µˆÖÕ¢÷. L>íwÿŸ÷Ðx}Ò¬Ì{ÞK·ÿ,äïðÕÙ7Åoè€nJïŒhÉý|„·ý‹ŸXÏ å÷—¬n=Qïu<„Ôõ¶©~ËæÕ¢óïMß.v½úzs|EèåD`M¨ÇmÙŽß7‘\Ãóç2Æ«·ôƉT.©¼FÚ¦ä#Á‰ÜÏu‚~SµÓu{ùØt‹ ؆L¾K\c¥qçÔ»³ûÝyC<º¯wv= n®¯ÏÙâï•©_lv¹6n_“eµ~7­R\Òé½ F/ít¼º—WýíG*=<µøè¼^1s©›sð‹„×ÂÀßãâúíM?ˆ3—ˆ/ÅLê}B¼ðÞt†½V_ÓVø‡Ÿ?5Þxwü"oð†\þà9y³äï2Ù·jX¸t²¾ È?½ZS¿ô·<(èâ§~픵 ¹sÂÜÿ6]w»Ü9ø–±~÷ny¢ºÕòŠëñæŸ\ùãN3„^äƒßUb¿v¶½*‚¨\…Sºû¯Jîð¦Îq£q¤ÏNtG‘ç­r@Ÿ€ë Úx¼Yà禼Gìþ?T"xûL¶M\õôÿ„»xŠº>ÈqÿÍ ‡úî7ÿôí8+Õç93m`©Åën2·bFc)Þ• ©ÅØ­ZNû¨ãq–”)#ZfõbÆÔð°UF’(æI¨€°TÏ‚,ÿø;ÿv—ՙᵊb$[Ïì VZd ¬ž‹x·y±ãþ¯€ÈaùÙçTfs[ö>˜îA“{ZAb†¨R!@ %X!‡•%óº”vߢwäŒL„Á\ƒoÎúåR2!d›Õ¤A Ìñiš¨o2gØ0>ºÀôDºž7¤H ¤ æne¨·`ÕI‰(QP Teæ"³(‘N¨\ôg`Fi¥0z”ZÍZï©@¶H«žD̉•Þ‘d P&(B† ˜c(¨\öºñ'Ü-åB‹ÌE¬F€«È!aˆ1È'è `ŽÖ‘ ¥29l 08 +V‹z)‚ÑœVès˜Óêè$IÃP”mg”ãt6™;E›6øÙxúé·ŸnFg;v:•¢É,S‘åV½ÍGEÒ!dvØ‘Òì‚9£2Œfð|îÑzÎ3»]aæáyî=‹ènrJGÅáPÔz;@=gÿБ2™]ðÅfâ¡DAܼt±‡P>UFjîà˜Ò=3Zs·OûCäôô¡§ª¡ì÷=ÌTjmó¡·îîúœyTmŠo'ŠèÏÙŽ˜‘c¢#plp± dæ"ŸŠwà˜aDqSÇÜ2'(Ñ€ M„ ötG‘Kés CErƒ:蜓 ¡7033¥¹{éeÈ=óÊêrŠæ»½•"h4Z5&Yh¤ÙzQ¡EŠ4R!“Dz¶.ˆž-]u9³[CVˆ¡iÙ»”R´bõ.Àоp³35ZJ@f¤SFÁk†iT°F1+æþü Ü96Ýl¥†d[¶ð숾œf°BV(i¤ÓF+nn,Y k§B–©üìßü¿úsóê>M‚e„-¥%Í‹3™=²¸Y‘[ö=²‡ZdÉRËîiú·‹òÏÃãOäç&:`ï„ÀZ7|ê6^x :ô½bWÏ狤Íu(õÂá~&8¯ ¹*\ÅzE<óŠÌBÁ×:žx9]| ¸Vï¹}IÒù}œC¹¡ß¸íJàË`×Û0=J†ßév÷—Þ˜>/?oë§>Í;]7èÒJZƒÛÛµš k“? Ñù/ý_ð}™E÷•Q¯°UáÅ®òÕ3®^êõ$X72lgéùç"ªƒ‡Ê<·ºÝ7øÒícñÜžþ @’,:‰üŸÑÿ•˜×…2¸¶#_'º¼$A—¶¦sVt£jY°âJÔŸgÅtž4…°䯋4›¢ÀIj¯ß¾ÎµÀï2$׳“To.¿i(D #o=Xñkm¼+û[ =\?—õ7”^ƒ×«bݹUí©Që|ëÓÇ›Ñí@¼ßꦪqW(âN½çVr §Þ»u¥ýr@ÞÜÖ]¸›·u>uópÚ죗W£Û0…ÛÚÎ î ·à§–¶4­m ‚©›&«Õv3†«i­;Øì½Hm%1v?YŒ÷ ëwú€ÄðXûÜk Ý€B¼=‘ôB‡ß Sçæ,¾‡ÀÞVÛë)ñôå}ÿóëkltï/çº.¤„GVç¦Á{*I«ÍÿE±NÝF†Ø°JoÊf§xOw¿–£èË–ÈË,ZíEºü¸]¦×'&ù¸j»A%Ý­œžÏ§³~Üæºwë!ºÖ¼Zaõ×a·õg]•KÏp-Þ%]”"××ÓÖ׺ÞÊÏ]Föªû.1þJ@æ3b£Õoé®êèêè¸/þs[É[a5Þ«°®Ç„¯¦z·XúÕ®¾Zï¼ vn³KOèU†²NoŸñ6Ò‘ïÆÜëƒ_zKcìúu¼]èý…Ÿ»ž¼ FÜsÖ£<‡‡¼2LZ"•%@®‰´.¨>N?®&ómÞ~;zwÇsý·gé§Û‰ÄësîÜÏÛÊå%à7•&-Vµ¼È `Kɼ/–Hé׿ùõáwŸŽŸÙC)w—@ó²ŸÌ­LµNÓÜ›ûââªLCI‚e˜”h YC™= ”H+–)e„Ûˆ|3 ÆxÏã1z¯Åk ¢œ@‹p©XùfgB´–´|îèaµCû‡è†Z¤2ƒéçgV¶cGk1§z ¤~Œ„ ÷FJôHi ‘ìC>ôå0‡–†ØKfh3’ ᕬnEøÀß/ÒdáæKvïJ$<$ƒ$Ô°#að8ü.ŒC ¦‚?õTùî7 –CŸ›ºwäó±+»2Õo2(7À]¤eÀÁ–çó'32RƘº‘AW‹€HRáNÙÑ;ÈåIy° JD@~Îe@"5€è   v+‰Ý!D Çp`’å †2Ê‚cñûõ…æŒö V–b̘þ£63Ì``1/F³PŽ«ÔÊ2¼›Uº“©Ì;"&ô¹ÓÌ*)A3em«R Ý¥€­>¨,OO$¦SfD&¡˜g'z?À@pnÇRÊ´³œGK ܽ/–= D¦Ä9ÚQfæ6n&G˜+Ѻ¢Ô•ÇCFCÌC†H¦hè SZÌ¡Ìp‡M,(ÆZzÍ®tYÂÏ  3Ò‰™—ý®Ï½ªÑI†—h Æ®ƒÚñ“gšsªM`oP2"z/Ñ2¡}á !ѤšîfÃØY„cGÌM=5ÞÞ™4áÂä¨FÁ@–H‘âqvANødH£Ü©D[" KÈz˜j-û½O@“™X…»¬hüÁ~çÓΪCÈ3z-ƒ H=d3 Z°âÕ$MHIeòì23AˆDOšE)¥$a£ˆ§aj Ì΋T‹z?zuJaF¨C ïfÂÊÍŠ¦h­wº“h}¦Ë‰hÙÛA sK…ÅØÞR zc†¢/›‰tŒN3€TÐ@7ƒŠdT1+£:b•©êv^ë/þ·ÿ7$+F7A¾«äÔ[Ÿ3Ì'š¥LÅ3ÓT™ч9Z0B1žÂÊ®þÛÿÿ½Å3®A„m·hnr+{Q6æžè½4§+ðäQ¶>yµçpJ+½]rŠ»ð×BÆç(k¥ÇÌ“âÏuf­qhÞ ®â«³håY|ôn²ñÀÔÅrg%šW!ÑÐÍ(ñ^eâý]Ø¡‹0ñFÏe«÷8ŒµWœ$ ëëPk´e3W–ŸY†úò´Äc‰"¬Ä¡´Å)Ï!øùVuÒê¼.4qÝÁ² É.ÌU]~Ž‹I'H›—ÅE }­gµæOi• ®p»kîÒµììuø©»ôòÞ¢ó·@jPßèµQußþÍ&ÿxD¸¹½ò{<Ò^Ïœß_UÕÝ©Óã|Zž_òUν«w¦û·½ÚóHÀx_äk¾V™;âÎAÞÛ.ßôð÷ŠÓ×9îk¥¬oô¿ÿ¢y‹œó·ñÉ;¯ÅeϮۀ÷á§¾ëGõE.ôΡ—0à/ûÜúðûü¯yÀÛø¬€?ÒÏ;ø–¿óuÿz|õ¿?÷ù(äá¼BÞ9Cž×ªwš ô:Çm¹ók®×ßCÀ[†ýúgî5W­°f¾ë½7†»êâx,áúî¡~ß ä÷2ÒAb‡—¦Î-Ÿ`EÐgîQ_a÷SÀBºÍò×ÊÃeeº¤³ÅÅ•Pïuú’øŸÿð÷fvøÝ§˜»z,=¸>X²°bt—ÑÜ ½‡ÜCÖÇ(R=ØÕɈ€B¡”hûÝ=” ©gHi4YV ʘ{ÌÝ¥…z÷ÉøTO˜*söÞ?ÒZG5&ð±Iˆèt÷]iÿ÷I)’o )’9²E¶¦6DZe ´˜ÌV'˜»™ˆ>ò#‘g\_pç¡%“¯x„'ä@"‘ódõ©þù·.S4«2é™aI•i3˜¢F!M6ôñt@‚ ‡!Ä"ª“$M)‚¤í¦É(”ˆÁÁÝòÂì-é•´ÈtºB‘=)™ÌDdæ¶8@R3‡Ä¹71Ëd‰4À̲'ˆ£MÃú²F"á–è±ú‡}3¸Ðùa ¡;°À‰aÝPŠX«‹ÄÐÐ>BB9Tj`;¤c8"˜¡~À€ ‡¸W¸#OM ËÞ‰šÊê{X¥1{0EÜçrœ•椃÷ciFE @ ú(–¸e›aŒLm¿Ÿ¬IR´ÖÜ}W]ÊŽ”Dô.ô:~‡™uteªqvŸJfg>Ï#(’I+…PûmD‹~œÅØ:D?´‘d>R?.ŽÁÙuøg'v…6‡”H„WzMIyQöž™ ÏTMá>™È¹3Dª€ªž½Ãi4M%#,›e8f‹–Þ-30ð˜9ü|#¤`1‘“9Ä.1,=X¦HC?ÎaPR±gOM¨v<Oß|û¯ÿÍàògKzX)åÛ§Þ"i>í¼0S"‘‘ ddÌ-[W‹²¸ûô´û·ÿîÿغñFY|á;èÑAöE3‡Ž¯uèëE«Ðý€5CööÀ_±CÖ•€ûÑ—>;®á áýëfõecÛÇ‹Ö÷JôæØiUïùBðågµ œ:p7 !ß• º0à^¿€õúÚ—ÛÔÎ¥üW+z3{UyåëHŠýsøð«ýð Þì‘òè¡Ïª&×ߪÏs­Vq㦋—ÊÃzçûßô»|eÁ¾ ú¼cö–;ðøÄWðŠáæ [è!—öŽm,u?èÉÆ‰_ŸÝìQï¹ä[ô¿^`mzµjÉЫ€µÝîÛV¶^j•=/!Þ_ªopàç£üŸ%oÒÍ?!ýMÇÃûÔðŸ3óˆ›Øé œ­L­fãkZÈKÝ õë_“<|÷<:f‰^‹¹•R ¢î*ÍS™ÈôP"!D‹²«nßUJefôÒ }n¥–BÃ<·¡u£ÌT9zÈÌ9Ĩû©ÎÏs´ÎÙzFæ."1íi*=uÌRËñïþÞ 2%ṏ¤€ŒìBëíê‘mŽÃ¡’€¹‘¨Í2"F Ùɨvˆà‹è‚Žà¥.qkÌÀ 8 ô½ûn¨zr¡ fFæ\v; ñ„y«!Ô`&˜ƒÆ 1÷'$!3W ‰&Jº]Js©÷l2ÒÜÁLdŠÑçÖU¦’‚:æÞÝ&‡]–Þ#ö»9К sKú´¯sÌèV‹751Å~±6ˆ%$IJE hÔBÄ“¼ªƒ ¿–âÜ Yæ˜åén°L #H@EÁ¢)TŠ…Åœ7`7ˆÌBÙŽ$ÜÇN?8¿AfZ³BšyMêL¯®1¡ rƒGacîň*R†Z4GÈZà%Í<Á¢„(va*½U‰’Кzõ8ÇìUÆt+]d‚{¨?õÜ êbLJRPÉD™z"’!t©ñ³÷¯O–,Kv¶–{Dæ®îsîêe0’à F3Qúÿ¿ÊD“D‚1bf0sÝU;3Â}éCîGæÞ¹«ªûô9÷1wÛµ3=ÝU;_‘ËÝkªU4ºCådT±»d§êQÖ±JäÜ…L+–¢™Õã –°Ákõñ+"E‡;è†C-Ñ™in™ªOšÓÝ̈C"æÎòÑ-HIp9 S’Ñ„L0–~•SXµ\r‰Çœ"["´dB¸Q”›e&“©XŒ—SŠ6wáŠè‹o¯²gŸ{Ÿi¢)3Œ…fæX@Ä©•=3äE)¨SR.T³vÕIÑ ê&£Á!—gq«V*ò3˜u´â8üìOã8©V/®êè½ùaì=`†Œ6“WkÇ©G÷œ[L-”¢±V¯Oã?ÿoÿH¹îø½Ôÿ^ÞX+ùû[¢½÷Ä„K?Á—Çú†§ñº°¸.7~Ú­ºB7 €7÷;úb‰êZƒ#ß?îûÄm`O_º&ˆ|­^aÜrK/»7Ý"µõæÝ¸ìtwDþ†V®™.7‰_8âÎ]yHWS`­ €Î¿™Ì¹OpE¸t~@P‹©?wí_7h§Ì5½÷œÊ:™xo´ÏÓþõç³òZ×y‡ËË×^8§¨|ÍŒ¹”¦5é>ù uzÝNsÞMÉk)?ʆ7¤Ëeûú¸ŽÙK÷Ö©'ÁÖŒþ øBçÆ° Dçœ¾Úæž¶K<…À«[wnÖnæx›u½~ç½rRnnx´—¾‘5êd5ºåp¸í´ó¬(OÔÍȸôKí`_V‡[[º_Îäâ[®­‹ÏåµÁÕÕ5p£® 3Â-kb‡‘²[õºçáNÝØ´ûÛ9r{k¶ƒcyël»j^i–Óý«{¿¸ ¹ß—9³—oZãÃõž fuCOÍ2ww…¯Ø`^úì´+X¯çȃ‹}5Û—÷¢¶c~¼Ä@ë˜e&ÜÃîÆÅ+Õøºg|½ún&_‹7ïÇíiÝÝq<í¡§¶¢ì¹aq“/T®a<›âC¶žó'ÀËêMx³lêfvîá¥ô6.»­Í½»A·Pü»åoãv´ÂÒÄÀÿz¤s#Ô߯¸—Ë Ö@.ÝŸáÖ‹áFÿ×圵[`¿³~é>þ¸¡épgY¾4¨R¸s'¸á)­V`â]ýE÷†;×ÛS¹­\y‹é®Üé^¯ç#ˆÚ™rz¾ùܬWï+ü¿Ä&¼{{n[ºûÁkïê+×µ;wê<÷þsÁož_Voªÿp"7«ë–«€{Œšû;ù:蕌ÅMWïÍ.¯·¸7‡à{Z¥/qÞÛÇ{_v¯íVµM íçÍC½¾ÙÎsoE‹ ®ÉÎ…ö³Rÿ¯”Ižßö+ºîªASy*À§ô—óŸÌý忎©÷yYêP# ê¡ÖS¡ ‰~:„AÓøAdª¥O=Ú<ŽEBŸæ„|æ^Ý‹!eFÀ²·Ö¢÷><¦ôŒ:V8ÏO*µ:²ç0`ž›¹ÉÁL|j.äwc; ´¿üFÄiX&TDDöscôh¡†ìs¶™¬(»YdC7sËlŠ\œ9¯¢ÿÉüö|w °$Ì¡X¡ŠHxÚ`6Žò#æêxѹðƒKÞc1³¥„Žì ƒ g0òäú© 9iDyŠÁ†Ö»šêHÍ$„è‰ÌD´.¥[¬weš ± ]´axd¢¨¦W;>OÕL‘^­#(ÂVÓB–ŒH Œ€!ÛÉ¥À ÐNS’¯ £uˆ§)¶p„à§¢,s°€ÅÌKë)‡; Ãqš³gq <"²/;ƒ';BPB„U8!;u (%bFÀ¾,ήH¢yõ%ÜS.UïVž-%™¹2é–Šhyaj† æÑä£%ºƒ¥+™$¼.€$Ð 0#”±ÀßÕæD–añhˆ>7IJš"‘15Eze)–-…„I@‹lÇ0³%ש”¼´˜ãØ©œ“‘Ñ› ¨†,„L$è0Òƒ—ûà•Ų3„©‹Õ ”º†|Ž8º»Zkn޵ àT,¡!cÉç™zïd ¢Å_× ÿü2Õnð·= w8‡—xûD‹Z¤gíš#®müÎx]ÜÒ@Ïõu€tÑ47°”JêóÚËÝó sô¢|ñå–r®.WÐoÞP”/àÅ实õIBË2uÒy¦òf{Ù—iC¥Ù/T[oc¨•uzæ+¸Óz+v n›¼·ÂÚeMc—½@.—»1ê-œ¾˜|YÙ%ªÞÂ"µ‚­Eƒ›í7¦µÛ©¶Ýú¿·Ðù7#ü ôé<ût°]‹ÙK­Çƒ±óèÐ{ ¡k`"Û©.ܳ‹½[&òô“y;†´©Š;çvNótVðú»=5דš7®¸z¥+¥m÷á•Kùÿ~µ•¯ùƒ\lxÖ+¸¯fîãÿïFﵓàgïJŸV>ž zßæ“›‹º]pÿÐx/s>Êo!¸—ôÚ-ÜûÚýb`À-•î.1øCêÞïg×ÒðzcÕëŒ)}Azù7R«ø> ÈO~ê¼Év¼ÿ¡íåKøeÃŒ?î~ã úÒó¼& ÏP¾³1tC×Ðð®©s¿4ò]s™ŸÃ#ä¿ë³×ðÊHØÀAOéƒ@ôZ:~}º†lÛ€=o‘pFºIUlãºýg«Îï(ˆxµ è+ÛW:¾AýÈkæÐÄÇÍm„rW;òP*_g­õ…Úô+ò;Ú@â=söͤÊ7Òý¿Ýå<îî½âhW׊6¬HÀ—ÍŒ]³Á·™°Tô>O3Sù—bîÌÝhe,u¨,F3™9÷¹x±Ê¹ue¦péôz›‘iÀ0”ãKLǨ¸e¤æ†Ôü<Åu(Š[—gäáÃÁ1È ½`ÊCíÓœÇÉÍYR6Öv°ìp«6ýÛÿ`Ëf‡¤Ð3©´ÌlóœÇ)ç®D*R™ŽÂ‹²±7*弓,àâ™ O¢< ßr1ÅÕµÎÝ3X… ÒÝmç8Zš&¤È— 2"ˆD& I?°8‘sF¯úÂ**9EŒ¥>”!³£ç\¼¸sž#ÃH†©Í@wñEKÍ5˜=(ƒÑ]½ÍŠËå}ކê 0$îRf;žhæRpCt@ð¢ s„PG° OPÀF”ÈXlÛ@[JõM–‘ ²0 9Ñ•fVëÁKqõ#­S<ŒO/ó KBˆ3pIçת·¥Óã`4f¢°"SÖRNž€…i…Θg‚Åk¦ÌA02h棫¥F ½÷2Ž¢Mf43`¤¡ÇÉâUryyW›‹ßÿÙÏŸõ2?öBõ®Þ ÀB6JÏÖ²7dƱC/½g8CD$¤ä´<*Cj2MØR]8"Òœ#ÐRÕÝXB®4%vÌè$I²qiZH§€\Y>š‰hÏ/I=sD0XçÑZL=(Ízh0cêbI¾°%™¡ˆ˜OKÒK¨pÊ9’3Ô¥©R)´„¨År{$ Ù¥&èi€4–Qœ9E–Êj\”wsƒ—š%;Eöâ ´E‚¹ü€2‡õçbtO,6Ž– é’I'Ý¡œ§ô:dDÎ*P Q†ŠTD:ÉZ¼,m!¨ìx½®yK ×›ÑñWi®Œý“¤«äÎ×%¼ÕðN­hó¤Öüˆ;3Äý¾z·o:ðÀï[)øÖ†ùdpÌuU÷èØªØ»?w©ÅÕ7Doý^@ç±±ñÀ}ÀMåÓZ–½•,øûˆ/Ó¦v Ëö<ø®ÍÒݳßþ‰Ü#¯ŠUué_ nÜ#V®p_¯GrSxzcþAý ñõ•¯•ëÆíÕ]â­Ñ¥ôxœßåLÏp’ߎ ö‡ÏO%|›öÕ©ý³à+å{½f“ü»ö_{ðä·ãÏðýê=ÖÈØi½y=›ñ•ÊßO%ÔíÖ‘ßèþï/î<…†eWè¯ ì$­B³íÃYUþ|“ˆy'iðº¯ÓÒOùþz7Æñ1õ+ó1?ÂÖå‡g~Ò‰Èos»ý(¿íŸuuŒÎåi×iûø÷2!)ò×õ·õ‹_ 3#‘i´È(îuËPþ¹ìJÑN­0'éSëI"BF2òùóÑÝê8ÔêóÔA!z7÷] æfdŸ›€:ÔEÚu`j]­Ù±G„}göÝÁ#ÙzDZ eÍZJÓñßý¯=Ò LæJõè­eŸ1GŸ£ÏGµ2Ä"´-E—‹?æÙ¤yJªð\—çŽ_‰2á ,§¢Ã @‚Vá£qŒh/û,œÃ0HÞç°’ê=3–~‹¥ViáÒ ÀµȬ° ö·ݾÿˆ‰DzãÀaz¥¸µdb©.!#3;­/ÆBh>NÅ8¥˜={OÂDµÞÌÌ ^à¦DôÞ[)KµLà츫ÄRuŽ~‚šˆPG„€þ¶ûw€ð*€G!º’„»¹¹Õ§ µ.WöôªÐ$4å’‘ÌND År`1û^@¡8ààâÁ -âc¢+E:¸|ƒ!rÁô˜U]"ÚRZ±âZ*—Kè†hQ‹G{ƒÑrRF÷J Ñ@¦¹—â#ç¹÷VFfoõ?ýEŸ›¹e,ƒÁ„#žS-¬Œ6Ï興ê*¡PGk‹&dš{d—ž<Ú¬ @#¡JU³ib%¼šÃÅ:¤À¸LN€™ƒ0™09g6g!Ù¦îiŒÙåeæ±ÕÙã×]ÖÙC(¬à[¤ibÉ,ª½œéb†˜HCuƒg¤t˜€)³…ÄŒP±%û€H„Pȹà ‘’i”ÂjЩZ¦žÂ,«%À– ÷Ÿe°§ïÊáP¾û9ÇïzÜÝ£×sSœ{Ó¢“Z=ÈÆÅX!¯•dš|‘¶ IF ÝÍ‹!Ò`a4#L! S&Di’‚‘‘Í H)» Š 23Hf%Œ—_Ieo1¿aÕDdo}š2QÆJC*¹ÈsóÜݼÔbFº)š"Í`£Ú“RÓg(hv‹0+惫”¡†‚Bº»¹>üñÿÆÇÚ§N?äÔÊáPH­5“X£-d )[ïsïSS«^ŸÆ§Ÿ}üÇÿìÏ¡\£é Pá½Ñ‚~P£×p×úiã£îJünEÜne¾)¦ k^‚nŸ›´)o•^é ø!AÓ%p1Y~ϹÛ—çò{‡?Åx\f—•7¤šß èü;ö/×À+ $¬Á×D /‰›Bú/Ÿì'ƒ†Úí¥ kSëÛŒ§Îçsa¬[À¯?sÓ|±*ÒÚQí-=j]y~Ñ 6 ñ÷;¬¥õà•Ö’¿¶t’Ëþ†—¤áÊσwÒ“nßç{q¾…Ú0hNJÚe ¼d ­Õî5ôÕ ®gÑ¥G†×§ÆwÐÛ.Ù•Ñ@¼ñû¸Zf_>hn8ÝTÞÉÿØP îèh·ÈþÃþJ²^½y_„Ìó8åðøv‰òk’ïNâè|;Ïh½œáÄʶqo»˜iïNh-ÐÞÀg6#òâoÁ7/ü¾áh7ßsoR»tñ¹}nyq_T»ã&Ý]¬hS×k½®nï8Vèªó©üàÁ³É+¯¸“÷ .÷™>m Q»MH·çsÛl…«vÖˆ÷JYÛZbí<â‹qù¢j\HçGsÛÎv^Öt™O=“—wÃÝ›ûÁDYçº,h;Ñ·k®$B>Z¹§2óæ)lž¨n~~wWp¿Ñpó¾Âý«ìn!á~cE„Ù©”_“ÔvCÓ7’?;P?¡EÜŒ±»k{—õµöú÷x§9ÞÔΈ¼•m '_&hb{ë<ï­}oãZîßóÝ<ÁV»kèë.:ÞÓánBà FÛVÓ»Eü¼-"×Áß‹£1ø—êõ Ÿ÷Úp‘´i.¿½ÿë…å†l³ ¯áë$Úm¹Íê^­V·¤D¾'æÖ*DåÍõ®8H»ãö&Æ}w÷ç…¥WŽÅÝ¢Œ7¯åJ㺄Á\/¹䉸‘½‡2§¿ùå_ÿ§¿‰Þ(ðT¹Mw÷a`18m(¥”R ôÞ3j-–ÊŒˆ”2z›"Kõâ3:•RÈDëÑ»e¬:NêÃ8BÙçÞæF¨‡êX½JÌ¡èe¬¥xûÅgûô"£çá0O} ¼Ìí»žjÿ×1¸ê‘Ù’ѧùyÒ4gôèÁÅ 82#–Á#S €/Ë;ääI‹öÇ 6B:ìl‰…+nKì]  BÖŠéE´RŒNûü=I!{f0"%J4äÍZ!Ó>üÑA@k½ÔÀB ïæp);{r²ZÄ´,žJH™è¬ Ô²¸>r·¥Ê;#•¤äª½‡@ ±TSXiíø2™ÉŒ(pÁÝåt± C,/gÃb|yQ/ 0Ø(dÀ¨§4I) ]à¤0Ѭ´R†…UÃqš¦<ÊXjId›6 ¥ ÈéØ^ ¡,¬¡p!Ô1”Ó^ÛáÅØ&™`2!p1KÑRN+´Ì.2©¤ H »R÷ƒgxŸ'ºYEéw¢búèÑ)DNÏV‰tņŒã4·T,ˆþyzþtŒž‡ïöT ÒA0Û\ ÕÛô©iéOPNM9xYœ+2g°ÑeІ¹CA9g)bYò4žâ'²B”H-¼•­Q³t#1 >T&½LsȼGB’ÌQ³W´>Í(¢YŸé]&‹¡"'d¨KGäà,àâä}Þ./i! ¾X€Ž¡°Â^ZôèЦ…ds˜É*`PGq €DAU²á ÜQŒ^á)Ì-4ºªÙÓaŸr8`8Ð*X¬êb@Z9˜JÓ™¬±|Œç v¯Å ¹°›Y¡‘Rú@Ò´€*JƒÌ¤è™=£I6D7$•½Ï™a0w™êfy–ø ¬VEIJÄòíÊÖúQ ÏJ²OsJ^™Ùtse¤ÂKɈÞÛ²0R’²ÍÍpäË’”¡qd?ZB¨´´á£ÁŠÂéC*K¥¬>Uu”ƒ}ÿø/“Ì„Ž½<Õ|(ŠŒ”ê‚ׂb¢™ÙraÑç6÷˜ZÆYý?ŒO?û¸"C.ièÜ?×Z‡øP,á=Ÿb‹ }îví9¹ÙÜ0WBóy“qÆPcƒ>]Uêí·ý}tz"ÂÂs¡ê~NÀ‰ëì&”]ÿï&„xÓ›j(_¥¤ëÃx\²²î*Ô¿t³£Ò5"¼j‘מ†Ûwýô®z‹pmeÜ⃄™./hàKD´‚ãKWT×'{Ë]Ý>êÜî×´ë­8sÝ2r5ŽoöêÜl„¹i¾¹á«-ð›­;8ã«r³ˆËgô;¹Òçþ@çu¯à݈§ë_ÑŠÍÿˆ|zòƸ^Õu ÝBo6á$±Üí4 ì1ï’—·ºÓ­øåB¤µ.y;NÎüà}ÂüÝŠ»âP¯¯kû,î![zø€Î~#÷O³lô¦[¥ñR¢~ÙölZ¢îJØßCáZ@Û6vï‚¿® k5Œø¢¢mÞ2ù7šÎ¦WáŽä´âø¯¦ Å€‹Åä{–ñ}rÒÄʇRÖ­HõÝ{½ù]{rà½?Í·e§¶à SÅ?8³Ì·ž×ûD_,}i*ök/øÕ45wdüˆ¼‘ßøµ‡úÁg,}Ù¯p½¦ò}ä£HÝýÂ;slzcxO.guôu’–;k움úç‰:Ï´{=;:òLæžñõÃ;û ç6À¶ÑÂ-„F_7©_ÑÁ¹kÔ£áý óú•ú÷‹î¯›dÀû÷Z_ü‚æûÖ­×Ó¼Ê÷k°ä¾¥ÁîL\¥ñxÞïîó‡ŽBý€Å_?d6¬ôý/Yí‘Þzàéƒov<þj¾/W«÷/ kÛ=ñÍÂI!Ùx~ß§ x3Èy„…øõ_ÿâ?üõ_Gï—¡gÆ:T+f^|(^¼”R‡bæskä‚1¤EÎ>Œƒ3 ëP"}¦ôü9 ¨cäÅ£:§ç²OÐP‹zÏ6›I¡|žñéCɧ‰ò4øPòÓ$ªÀœ&˜},„áÓqú÷ÿ>Π Ù#æÞæ)^^4ÏZÄál ·ä¼Df˜Å9T–¡/¶%ñ±XÝ.ê9sÐN(9dÈ¥ €€Ê`°…p.ë‰b4DiÙe¾`Ï“4+NXfSB’·Áƒ]i‡?ú^Ó/_4Ù÷?‚ˆÃè4S: £U¯V˜`dôÖ)ˈâ¥Ï™]¥@ÎçcFϧCD;¡Ëa‹M¯Ñ\Ñ3 ½Öj=¢›ù<÷èq&©&€ˆ“aÁÕ»óƒXUÔX-<‹íg!d< ÀJ4øÁPçi®¥ ÇJ©–ññÃ÷3×Kkv¨Õ½Švì/É4š q¨®òü|̘Md‚†4,©ŒBgÉé¤Ò½Å8rqF¥™`dJbf#²?w%m(#3Û 7Ðü’,îfÙ_RÇ¡Ž1GéQk1³Lõã¯Æ§JCF‹ãsŸ"i^FȹØù¾ÌªèÏMMµ”iŽ ™J¶.tEO—!QÁ–RÒ5aDr9}«‰H6 Ý«¢„t„R9÷ dff6 }Žb«w4FS¢°Í‘­ãA16ôëÄÓl%‘JOƒ FW傽GeGæP&*Y@#;³ZÀ`š"gàE½K "àKý¼@;a²¼œ¶ëè(@%ih&#œ,"ÈFäg³¼€feÈ*Š~÷!ߥàe`y’»Õ‡’‰L§SŒn½'äV­äBqòƒ›[o ž,LhÒKõbŠ“ k&º”©‹Q6 h3¤lŠŒÉÐÑ€ÈKu°O“,OÞ>3fek}Tp A+Œ>‹030ÍH+¤2$² 3Ã2aVËòT'€s+µÒ(&@ª7ôåÞÒÉ:"š1Vhé.G³„ÒòÃ?ø‡þ³?öâÏÏS¦æçyøùwåpàPL:þúè‡Ñª±x }ž½øÒ³sÏÖ3gõüþC¦þÏÿì¿Âb'³z#-;éMÍd*–î÷u·ÌÆ­h®­n»;¾/VÓ{¶y|õïõh/µWî¶‘~E-߬=ôÆÉ›@™ðé§èSDáÑÖPÛrµ¾zåÓß±VÖ)÷õñ¿Ú¸ M¡×Ùàq#Íóµz‹/ˆ]Oòæ&€¿ÙO]ôcîÕ”üàa°*DÓZ`¾T÷\7z¿ïÐù»1ÿ®€Ý~ÀúË×Uí¯Îe=ôlý6Ÿ„–ÜÝúØþŽ|Ê»…’Ò·ð}áOÃ0ùŠ“ÜR‚„ߊÏïL?þ>¿3à÷äbþðûÖÙkÕñµ^Ä7†¡|ý×ýÈwëkú³õöÂþÛ—ÿQße¿S¯³ËÖ‹€_Ö¼‚oÐטּ#-|IKºà¯ÿê?.|þÅç˜ZöÌ‹[q¥x«™Ã¬Ž#23#ÂzdkÍÜt™ 33O ô¹”Ì’tC)¥˜eïÌ­µ®iîs+C1$Brî ¢{ÀKÕÓCñ♂){hîyl/ÿþÅb(¬ôŰ8²Qì­åÜѦ)[gŒ@ 刾xòRxç€:ÝÜ:œwžÄÿSš@`ÂGœ6N:`HƒÊÕØÝwŒOÕK™æ‰žîŒÅíô¤{e©@iD•jÖÉ s2)³@<£ÙÏûñ;l!ðô µî^Czq3¢ufÅŠ:23f)³F)6VMGË =æôEXqgï8>·±Vô˜¢×a²÷0óE5& m /8a’°ê¡²-¡sÿ5‘‹­%‘n´2‡ÙX J«…•ÃPKSÛR/O>z-°_÷_[Éxé½OBe``¨Ã3ҽݦ!gåìˆD©Hb1 ¤Ô£ D&¬¢áæ’¢KBF!Ôg‘mÎ’£ Ùžû±—É“l>Èæ6ý:^^ОêXzþõ±>êPcz›Þ~ýÌì¥å0¸ek†6•je·ïìø‹¹MrÜ=…<â%€„™² ¢å¹§ÜO%‘¥Z ˜”fQŒ•fîsë– ÐB59[¦G<ÉŠÙKö¡šJÓqŠñËÇ8ñÁP £«g’r‰3i—L$K±9·,´â6÷>EXMŽ ÉLÑ@ÊÉ—YÜ$ËŒ…ÆÁ”XÈ ¥Â*hí,²é”Wë<•Ä`Ó¬‰%‘= Á?Öñ£×1‡Ñ­Ô„ C,a *NsCtw ÖÞR$Ü(ÐPJÕb½™‘ºTÓR©tsÙ;¤í„ Ëh‹O°"h}‚'Ú¬˜ÐæÈf´è ¬ Hm~þ¤Þ͸Hüæ‹7p'<æ”9 Ifô\ª’3@ ­.ž$iJq0ª(‚k…(IfZ¶ÀDuÏÈLùɘNº•¨€1LM–Ò6‡üVS­'=«µH†% ÂD+%6·T¢)„˜[›æÞ‚WãÓÏ?øÇÿìÏ7òá 9ñÛ«?èïæë‹#Õ‹ÙïO´ê¶ØúÇŠk/¨ÄǼ•ß·MüµÕB_l«ø{ÿ!óDßzt à z£;ªÍõ^R{Pޤ‚›í>‘+¢àR0´r;§‹ídV•÷©ŽS‚g§üݨ½ê4º9»²®Üº/Â\ É‹ÿÈÉqí½qñk Ææ&_­¼×·xsòÁøÞ3Ѹ«÷ºk‡Ø"tv¼r´&…ìð=6{óÝ£pÝ£têþX›_Ûš.:Ëo|}ùZó<Î ©S¯æ·€·C†{8õªÍŒ0@§¼!öÐ6û¢Ók¯û>µ×¾E~Ÿ{ vwãg¼Óµ±ÓÿµâÒÜs{y?¥WÀíNÈË ºÜTSî^ÀÅåú ·Ô[ásõå{åßwà½á¹½©º½ žo>w4’ûuë‚nÒ‹xݼù¶¬uÝåy‡øX×ë®z÷n ¯Í:;l´u{c²%2ê¦n͇î=èwÈ;ëÓµtw}; ²ýúÿ•¯—5æÔøxíPz\nÃÛæ½b«}º»´Í;”Ø4ï×Ü §ÍëxWdô5ºÿm3ßz!Ñj8AkâKÜ®ž~ eÝð‹v–¬ÛURze‘Ô:äm,mÙÑnYÄBÝxé¾`·ÞjŒrɬ÷M¯¢v;Ïw”ß7Í«EÙjªn§4l®¸›Y-´º­¦Y•Ö´µó¬Æ]î̬îÈ¢®MÕ[Jâ{¶îÁ]Ü~&‡.ä­­èHìUßìü»Ïn êñ ð•SÝ{P»‹ÄÛy„3êAÅÿ5®âyZqËBÛݘü_þͿɞRf¤º ™Ñ«£/…N‘p—±¯µžH‹P&ì²w™iV†Z;¥H¤R­),Àlš±¸÷¥{€¨¥ ÷·cà ‘˜a.7·L7/6Œ^«ÕnÌ*­ðð÷ÿóè*›”TtýØ4 ÙU†aøÙéŸJ:ÙÙ[DkˆÌÈ…üsQÿÿÉõç©[Êåe«UôΕlrù!ÞlH×èͳha›½eâ\B|×p…¨p´f¯®Úó.*ÔÍÆn»ñYo8¸ÊÎÕ׺ï[#0n$<®yÙ_§ ¾w‹q½lÃÚ[,7•g)ë’'ÞÄÒ÷¡×ëÚÌ•ºt…îð â©ú›˜÷â ëö}bC·ìž·éš=¡O.8|^*Ò7uÜKm1P|XØ´äKâî~|°¼½·×¬ÚŠæ¸¬ lî}kÏSS놛¿3Ðù÷Î;>Ú?Üh+úÕ´µí¢YŸÒÿô]œ¿îç¿ð˜pu¿Ö­XpÕp¥ûÕnçÅî!qîËÛªX\Ýå úï•æòíÔ+ªìÍw>Y·Ë”›_ä-ÃCçÝ‘a©S”xÇ׎v¶–Êï*®îl5)ìé¨o%½B C_¸'Ec½ o&ÓjßÉ–¸iEVyÐÍ9^oÔúryU¡®MçwØ« ¿…0íàÖùížû ë`è+Ðì«3¶ú¢‘}ÿ$õ@XÙÓ×¶¼oR›À½¼¯NH=N¡ÜÜÖê­ÝÌÁvŽ><±Ýíõ8ïTyoôkü¾'õÀ/˜¥ï,9xwNY{Bó#µ[¸álï½°YÌwCC wL’)@¾•]ÙMò‘nËÛkä»–È/æ½è«ÿµìáÞÍ'®áðeí¥¿˜r%{n½oÉk¬6~2wåÉze¸ë&À‡iÄGyÒuØ»IÙóÕ)ü£wl,".ˆüíbÀû¡ö /ûžWÓW9ò‘ñÃ7:ôP+µi¾~Ĩ‰ÿЗyï»óÊ¡×3h½’l²w;´Wnøã–áÛ…ŠS˜_vîUüU6ø ž¯îÊú_ªQ´Š’ùòésÌ}ñe„ô7ÿé?ES™ 04.…œI²¸¹‹ªµ‚¤ð2êîÑÂÝÜmž³¤„¹µbì=<±ÔÛv!zxj¨e!eF¦Ì = ˆÖ¬·JSfÎnš[D¢8ÌÚKÔÁdÔç©·Öþã4zE˜Sfïó<§>5v02Ú¸ô^6+ùÜ€w89dÈÄ©ÞÖà<¯¨0‡4ÀàõT lP§;k<¥¬¦Õ jå0÷ˆ…¤Î,¤%D&+ê Evzfg”:.,èèG,˜”&7*S€Áz4‚Õ‡ÖÌÆô¬eŒHB²^ËsËPhQm„L#a–Rf¬#-,‹ —4+c™>3åî€ÚÜA„‚™‘–ÙIK›;ËbD ‹uðbÃ+œÈHË= ¡ V€â«`›&+þt¼d¼ÌGsKÅRãÿùó/¢¢H²*³e‹¨*¥ -o\‰RAâøùT%}jM°À d,N¥0BuQ7hÑ‹Ñ^‡®Pd©EP¶˜?OtPL>”2‚™eô §Q95°{I[²[ð67öôR‹Æ`ñŒ©R‹d}:¦²ó¯Ó ˆdD_Ìu'„@ÀÄèNÔ¬¹)3i6ŽŒŒ—“LÖºh0°« UꈙYH2=ÉŒ %»`fs$ˆ Ÿ½7P/¨K5~@b1Ì”‘UXNDn.¥¦0¥ ªŽ ±eÒH²µlR²…†ˆL!—øŽpÃ0ÂAP¨/ˆ†ÖA¡.I£ÀŠ”%˜%w”2À„›ñéP}´2jH/¢Èt²Ty)P >¥4Œ23 •aã©Lʹœû©ªßlT‹@¡›“f4¨·}1¶M/„dlf‰Þr°9“–6@í¨6A-û1Õ(fKZE§¬_æ‚r“¤$`æNCÄDÁÜ™sÉ@HË} Ñ­šå² H‰Z@I³ä™FkKÛE.ä(šFij§Jñâ ¡2«cðHpð§ÿí €nÑž'š yl)¢+ZÎs>ÒÜà€ê™=²õ˜{FòZêaü¯ÿÿÝ•wñþÝ­'¼'ß·_ÆÊdhÏq¶ŸX¿Š7¤Ž÷†÷wÁÙpñÖGWoûƒº³§ãJ\Õ‡}í¾~«Ò~c#ÜGõ¹˜ó¤ÇsSºsõ0xÍêu{ÏMùÍ6.×¥úy•ƒÑŽÞsíoNB{mz¼? ˆWÑ·Bó/è6锽šAæ¿N@úÃç÷ú£“ UâTFdhdþÃ矟æóÈ@_Л­7‰[å’‰xùÕçéóKLmÙsýê—¿H)7YÌDÐn¨ÅîîÅ{¤ÀqeÈÈJ™ >=Üýx X2#úTêB 0Ì X™‘tÍ—G…c{)>ù‹ E@©z°ÌžÝN;m“%æŒÌI’ù)´ÁId(^f07C­ßóøÒhfdĉÌ¢ÖÁhÇ©ƒæµ¶ì,×ͪý\f„%°b¨ %=Û|¬2EôÖ*>ÙÉâIJìA ³MñRÍ[<#ªy)15“E⥕p̵x‰˜€ìRPvBýÀiHÁ 8r ªX`5¨)ÃËKfÎæ$Á˜Î4ŒZkÑ"»–ôƒWhfveCê(Ú Lpƒ !Î]”,DX4e¥yäRîn3:­eqzá‹+f ºÔ# µDgÌÉ&ðkd{è`68: „4 ÙQ]F(–jxF7¦–DŽ"-™™î†@4‰2cO˜Á=¡Ž¶ì¼Ïˆ;¾û9ê;þ:³Ã‰hh ¥ :Ì`æè3$Ð…†ÅlNf¸ñáÀk­Cý`òüøÁÌKD˜‡9?>y)œÂÇQõ $sdKŽÄZN•ĆR ‚ ©$O²»¥(‚"eRDD"3›"TFÎ2gÏY1Q 4“˜B®œ•Ý èH¥RÑ`ÊM Z’Jd.I²¥J¡X•zF_ ÿƒ„Sif hè= Ä"3[ìË1pj$e€’ 2ûT…†Úàþý¨ž‡¿ÿ­¸= }iô †»FúwÈ”" ÈLEf´ž}žsîÑ€µÆÿÛÿóÿ¾ˆ‰š}UUýñ‡ÏïÒÔì\t@üdÀ•¨ÅvÀþ°ÿýä•+ð#?·ßqèü›Ãò'ÆÝTò­¾M ’·<™¯ÛyœŽ~*¡¹ahåè}>ê=¬FÛR©[À„W_­M€uºðU·¯îÕo»Óžë7· Ȇ¸6sŒO°[·¬­gäkO‘Y»ýSwëîùŸW ÚóYü¦ÍáZ¼N§ízâé2²±Õ¡.‡Y™sT[ÔØÍõ®P{Õßw¤ˆwdtõ2ß\Åí=¿Ö%ï ^øè ­+ôÖèzkŽ?ø‡Wüj÷KÜïz+x×+ôÚ±·E¾MƒÏó]Ú–Ý®o1מӺñ+Ý9ä»S”|å/¹]^Þ¹ê‘ø f”6EîËtZ½°y·LíöSœÚq^í4¾~›ïH½­õ®'ÈWFoÖjÞ¼~p[†óêåÁõ¨‡¯ý6w†9w¬‹î¯PÀ-ÁNÜñFÖÎ겇1y°î‰w7é=ƒîÚïÉjŒk<¡×¾h;RnÞï_]Ãþ5–¼ÚþçòM×µèžuÇ/ñ¯ ”N[_=œoùÊ®«Å®­:|Oç.]?B€Ê³DŠ[ØúpïlpâÙëì^K¿ézy×{ôþÔemßT ÝÇ—ô& è•'Æ5R_ôU¦U7Ãƒßæ"k~™ûqV$€_}þÕRPf$ÊPáffV‹»Ãä¥BÖÈÖ£G-3zonfBŸ&«ea°,ô·ÓûG™Ì´¡FoãP¬–Ì^%ë&ðèì Id,"Q08°Þ³' 7úãŽÿ¯ÿÏÉ61‘!I½÷œ»fá9+M­-EÌî.E,¥²Ñàê@´ tÚÀ-Üja},„p‡v.l§8lÀ z"¨C‚Wƒ#"a§ë­³6+uð Ùჹ™z2¡Bˆ©µ”2RPFë}&íÔ¥ŒÌ¥(xñ#hb-u¨õ8½ô.w$RCe²§™£HA$ ñH*Ž\ð ÝPZDº!#‡zˆˆÞ¢x™Ž=#eô&•j­lŠ[Ÿ—‰£È™“‹ý3ÏÑœ!ªÃR(Ž¥âð”ÁlÓ‹PósD u8 ‡‘9˜ öñûÿÙßþû¿Š`º[-ešú4ORª‡"3 a@-ÈDÌ 4°ššè¡zHBýåèõð;[›2"çÙ(˜eWf(œd{Y×ÔJÙ{GñˆÆl¦DOΟd•&H­ê³D•’J*¡.v¨ OðŽþŒÖÑ ƒâ4)qîšÑì?“¢ p‡,{‘Ç+¦YU(ÆÁPˆ™šLæ m6µO "äÉ ™aJ+ƹé1q¹³Bé¹L ºôÒ"“á '‹Y—"d5vgËøaDzbn:µÑ‡;Q|ÎÞ ! :¼‚€ôÍ'ƺµÒd´áû'ƒûX|¤„i¥ÐUJ‡ÔÒhV*½C“¥ Éž‡B7AŠæ^¬¢2ÌŠÉt-x3š—¥ ª“êSS) ‰ôŠì„¢ub®93{̳Œ©ÓQ š …Å,0‚)¹yÅ¢ògJqždBÊ ,i‚‹+r‹Or5HýE µéhÆ2Ö24Ï 2#ÃÔÒSe É<#£éîÕ½ðÃઞͬæÌñ»'Kï3{kÏ/nß7Åiê,v ÷ê}{(¢||bµÈT*{¨GÎ]=2€×òOÿÅ?ÿù?ø“mȧ^âÄÐ]}©„Å.zBw"À©›·‘ò&$Ø I™|]eyeÇ¢·ÕÔÕ¶;¨5õ™¾*}-äØ ¿UÀãu¥:­ºÖìE¬H놀LJx«^6׺oé\~ {÷¯ùò›—2û5–€ï ÏêßÛ!ùê¹lŠö7ªº­7@¥ó%m»Hn…® ÄüÁ˜ý¢Šl·ÈH¬È]§mêï/tþ@_Fï ÆÝ¹GÞ(ì7ôTšíbHÏð4Þlµy{N¯Ú"ÖCgÍ!„LxE5ÓC±è4*u'5-êñ 5,(A[«­·÷@‚™I—–¸í Çk°°réÞ¾ÝÄ{¦$^<¸ðÕηë5`Åȵéç¸ÒÏ¹¢)HV»;Ùû’4Y¤Ý~ù뎔wŠÌjM\Ýâ¸/Y?º½çGw ÚÖ…{Ye;W»ãVMyës×Ãó¹)pÛ“KÖûvžÓÍoãé–hñ®²‘Ö6~¯¡m¶’wõÊ=Î?w^Ìäƒ4Òû_sob7[ÎÇîÛ43½ÚÂÆ×¢ªwF2Ü%ŠÜe÷´¯§Þf´A­]¦Â>½0CxÆñþ~½#6Å=.jO(æ[‚ýýô_Qþ·BÕnÒ×k};7·~“¿I¹I'nB®—¹íS㣻¥Õ7ŠäýrþZ€{ïFB¼6”±o¿¹3†¹Æxé̬¼ßpû¾MH{'¢»ÌÀòλgî'‚vˆ]+µùåŸà«†·s‡ÊGoKmØÂÍ­[r|½\bex²Ê‰soÇWœ¿½T‘o&‘´ æ÷ßnk¡ú®’`u¤Ôþ{Bè{„æ¯ÌnÜÌ+îdÂ^]Üu‡'½¢~õ>”í£Ýì:ÈÞE,²Ä”¶U }ù:1pŸ`]­¨ïº Û¢œõJp-;ÙÛç½"oÿ?­+Ö©°ç_~jÇ©ç¿ý›¿¡fe¨F3€ÆRJËðZËPÍK 5 @­ÅÈèݤLóÒ[›ææ4¸·iòb¦Þ@[úÉûÔ):SffÌù8ÕÌþ2C±Ô–¸qðjBËÀ D*³ž¬0ƒx*Óÿ÷_2Áj,Rfo½½ôœÑ£Ï]„Ôç™QC¢zf,¦È OÑkvDFM8Õ/_*âÒ`¾Ô"ÆÓžC‚(‘õ#Jˆ†ñɈ‰/b.ÖÁ¥^½u/ÇÉÍY,™eÒ£Wz9æQ™CRÍHÊ’ Ê\8ýsž„¤ì\Crá„cc¤¨(Š£Ña„-Õ”ÅÓ@d *4˜{rŠ#Á)¥Äàp°…8‘p¡h¬àK¤›Ì‘’‰GD ÍL#iH*‰l©Å/ §rBRÒÉðFY'¨z›Ï€ƒ—ÅXqgÅy• Ê€RYÆÁl0ÖôQî¡éDdÈÑZ µ|÷Th2W6=¨Eѽwÿþ{IäÉÁÖ¡DD“¶¸qÀ\ty,3ƒ–æ©èF„R!RÌŒÞrH=$¡72A É€— ”Œ9eÊžI3Î%•±˜å$Hs³Ì"’)šSF$Ôá£Hϳˌ"TUË §ì@vf1‘KABN¡$­²DÕ§âÃ0|wpÖrS¥¿D}yùñï ,¡âô§'ñi‚{­eŸZù0ö¹¨Ëég.Ëm¶Ž”™Ñíÿò/þùýƒ?Õ¢@(ól´µâ5Þ#vÊ/öc9ÞÈv<ˤw\º%¹k&¯n:Äkþ‹;Û[è}²øºXLn*8ïݼnw{{nXëPa74º—>®ð/÷:º»:— ‘§ë¹bN9xíšìDª;â­†&h)´Õz«½e°ènŸ~zîúê~{.Ì ±}U wÝ«iWökÛo¼ÞÆ3q—¯¡ßU³'_êA’k9Ü¢ÿ¯} ¶ªòß èü*ÚÞÙˆáÙ¿)oZaû¯`§uŠåNüæ¾°©« ~*ù0áôÃvnߦmç’_Ûµ÷»Ëzqåýå;Òòê–òBîÚ.†?욯^¹Wÿ¾ß6ïmÎäÚžñ‡Ï>øüž|øžjÒ?|þŽ}^qúöGúÃçŸß«•[o¤/Dó?LüÐÍæ›3]!D+Ï>ÔŸþæ—ÓË­ÿíßþ¹Yq+¥T—Y1‚,î +'L4 Â,2 4Ô!¥išL¬¥FdŸ»{T†ZJ…Ô£Ûð4¸+rŽ`l1gŒÅÕºæ™PÜ1:†Êj%›Í¿~©,´86´ g¸»}8˜·ÿñ_‰Ic¶È–ôÌìqŒœ[ÎsŸ[̳ÍŠR­õT¸ ´è©L/È<ù;æÂ[70N·\B JA$à0;ÿ×ÀåÏl8‘Ö¢ƒ/‹ú ÌÓ ²IÿJʤ±ï zo€AYJ50ÔÕ`MMs¸U§wf›;Ð(ô`š³ÍÍKI±µpæ0xns©>Ô!Sh-Sç2´ŒÞ2’~ºW'mwí8ôÌ:B$XÑælK-XuSEjÎ93á4ã@†Š*ä¡ =óÓ˧§qü𡌴—yîs޵´Ã$E´tGùpÊâ¤ÃˆñúŒÿõ_¸!A²|€Œn–®´¹¡ÖŒ RVÄZé𥶘„Ìi`:L4z ©³}´™b—0/e‘‰„L)´ }‚;½ÈG`F› `:";,3Nþ>*&Ì/èÁê4C dr)RŸ§ÅX[Fº±”Eš;ºpe∠Z] ¨ñû± ÖVr„Ùb.M2uªÀ2“òPäŽ'³’±PGÂ:\À6 0N ¡u¹ÑR:µäºR ~  ñTÁ^‡‰MJÁˆ%k“°q³ìÔAÐA"Ü18º£ßàNë«æ©Ö­ÓçÀ¦þð¢z½ë½ÕÕZû–1° àãbÕûµƒo=©‚»@ZûQç&ÀóE¯S*w7n\™Às-«Ã6ÏX¯¾FöŠ÷¾í4»i?Ñz~_Oñ hz{Mâêw†¡—q±-þßüöm.׆–m^ñz§ß˜Êçêþ»¿æ1½ùE?§ÿÂw|»¾ðŸïjÊyeèèÇ]Õô•«Ô+Ô¢ý¥ú#ã¶~…o>‡ûBûw¸~¯P][S£÷`§¹™³Ü‹•VGùrpǃѪ¯w8ìåc·gàÿ¶Výveþò ŒíZw]þ´î\Ý”Hëµæ®ºt±÷Äšjwïì¼"¿ÞÑö¾¹{qeZWé‹§?€_ºbo-gõîùÎK\†×Q)|ýû¾.‚%¶VË;Ð¥úò×>ñ‰«xîëÞwß’V¯÷½.6žÒwÞÔ¼]÷º‡¯7j¿¯ö-!à¾E~™´öÎ]Í{º^Þ7¤C=ž©ë]ÏyÑ:…Rz×ã‘^~ù©½Lmšz‹_þêî^ÆêµÂèÅWX#áVÜé¤Yd rÉÌìD¿Ž ‘ŒH™»A9}žRУ/ªž!ËX;tHÕCp ÿå3žjÎqìQŠOc(š ê™Åó8v8õñÆOÿïÿ"µ°É"sÎlÙ£E›úܲ÷l±PªÉ4–…H}Á°ƒv2´3dý$dûyx”+HÂ*h'§ß%  3­‚¼À z€Ž–aBÏôryX Ÿ~õì‡Áï%¦—gsëóÑ` ü ªjuDDLÓñHƒúœ¹— D̲â^Ù[Ë–ó ª»H0B‰žJ”wÒ F3ÒE)—2;L-í÷†4˜Œss7õ¹3™ w‹è½§QóÔ3¢¤hR@fÒ°ðIjE&ú$¬ÑáN]öa‹B.N²pØS9¨`êGÈžjùP6Åô<C½š—ÁLÅËü\ÜœâçéÓ<Ï£(ÇФÌ ‹13[‡R{´ùV0~ d' t¢ÏŒ4«n£[Á‡aÈž}nT—-!†!º—B/è]¢ØA[)2xŠŠ ”3…PêTŽšgr½‚µŠ êæö®:ÂÁÞÔç“?DYTçÄœ×Ü䀀”`(5¨Îa4A™êÒhè3(š‚“Ñ0ÕDUáêÄl!x1½'”™â`ŒTÊ>ƒ+$7šÐzF²8=­&23«fD¤\’–¬¤# µ@˜- IÀ+ž|ª”†äÅš<èDšRpÁ°Ôe#€  O§™(WW@ƒW+Ce'¿;ÀŠŽ]NTo^BòÞ¬ŒjMÅB1Vx©fž ¤Áº‰\,‚ õ,nDf4ètS"R 3Š˜ÑJ³Ž>G†CÌÝ€ª„¥D©›dN¡˜#[ôǃ4º *=A.’°@ NÀût£ŽOP'0Feôy–2æÅ2V(1#ȈL/æ0ºÙ2h" Ýi¢ÐIæ¤ñ0ÔÃh65?'–ÅÆC9€‡?ªO–å0äÔôiîšñÜ2bYŒRFra\ÚŸÊžê¡ÈPʫקñçÿO¹×Hy-iæþáþuõjÙÊ©²t[£¼‹!ÙíËÜÛvmâ=á3ÿa[´¾î‹µ­›¯ÄPüâ€Xz}¿rJì–ÿ­rÌmÕø#Ëß/(ÅW¢nÚpÎãBZQ>¯Õ¿xmûŽí§ÎÅUJŠ«½ýæv*u–£µÎDà–jEêÎày[aê—:w•µÄtBTݞŲuZ¹×6çEâttÞÂBÛF«V®ïöÛxÞÈ›~¥‡ÓögËL»söôçú™Kìp»&s-ÿk—{¯½æâéK’x\çyŠ®¨F{D¯Y™\F/uoesOEÚüÖyÕ{Ñ®Í{n§OÛäÚ»s$Òe î¡Cût;`ÏH+’!×i²7cÖGÒù+œÂÕ–C—›éŸ~¹gÅ7™ª‡û‹hßòçÜùà×êÀf¼Ý—6wþüµ»}ëÜCßîÞ½#…p“âÙ›>ÜÛúRÞ3ºŸØ¼®ÄŸñ«ùÓKŸZfþòÓ¯¬xÇaPŒæu¨©h=H£‚Ä23S^Ë"¶žtÒÍŒÈLedYifóËdÆSbSˆÖhÆP¢»‘‚MGK±ÏCk)13Ÿ§&Y1§ŠÇ–©&äq¦9¢9@¦>ý÷ÿCDä‚V‰ÌÖ£EÌ={¹Ÿˆ¸JšÈ "¢eœ*è# ™W¨eoZ˜Ú džŒÛB€Á ±äHd…Û¹@*O¿‘(Jô@=`ð3dÉHÁbƒ?yÁq:R€¬‚è9GofðRz@´PDN‘0rž_ÄF*¢‘nî¤)ƒLxD‘FÐR‰î–!zÏZŠ ÊèlŽB&+nÅŠÍSï¡â(ª!˜Ñg#ŠÕã<3å´èjÇN“yfIt¤rQ·3°X˛à 2‚>À ܉}1àíð $4AŽx‚#Žq̈å i}ŠcŸ†Rj™újŽÈÌÖ{´üðÁ?Ô±eÔ´dòþ³Å£t<>OŸ- làð饙DÌKòF,0Ò*¼Ê`C­F/¦–B·RÔ!sÊ%uw7/jÝȬNQ­»[ö<ÑtMê'ÿäÞ‰\J¸™È.מBE-ˆ@Lˆ8S€'Aô~2 nMÅÑ9åULÁˆ)à†á€>#sO¯:ˆ™–MÒ:zàEz³B’`˜fÉ d2Ç) ΩHfÅ(H • Iâs ´ž-E ™ftXZD—L`r1Q€”ÌðÝVf²-*m $¹¨H( Ç¥‰ää»ÈáB$†RQF@V•õ°`‚Ó°ä.J?ŽÖ0NaÑóð'ic]’FÚÉœWtR"Aõèéæ‹} ]¨ôâÊpK ÅȚ5K g)Δ‘L¤ T©Š)R ™0egôy±á%,˜P"iÅH}±§6óÅTt’ê=2¬‡7| kp&n@OÅÒ†Ä}…‘à {&¶ˆðÍ1µºŸ"‚ ÆåzvÒy—Às –®;ßmŒÃõ5íoŸÏ!‡Îö€þë`ã*ñ½Ñü+ÛCò]êöù*©·âLÜ"UøJñÄë‡~­niãq¨µ­Úò¹Ö(/ao7ü—»©3þ:zxEóïy¬·Súóvo®‹ÏÛ¥°_§'Ì+Ë%Ÿ»¶5pÛÑÂ[õúš ¹ ºyÃáÙnï/ÂÄ móJáy5óû¿¬ ä£Ëå]*o­õï5\&êu ¼­¦Ý9Ÿí*(_^…vÎm`wtA-¿¿`£¸p§`3Õ¸[wµ¢w¬ß×ðZ"êFÄ{µºï±áÉí*´ºg¿éÎ"íÕ¶];Öš××gµÞZòO?ü&ßÀ~p}û3ûiçü÷?|î†è·¼M-[¯ËïíøMÎ?}ãò­:ÞN&¾ú2Óoèa¼ËüG[&¾Ño½Ùð;ùzúͯ¡?íXyŽøÛ—ãÉ)"Adä”/tà$«„W€¤Ny±b,NYΆ4RÌŠÓÝÇjn Ά^L†쨒!Þtê}‰Èž¥ :R xRÌ©Zœ*‡†Ì0&e,zAe´ ÑE"sRÐÝi{›dêÈDcÒe(1O9% eº#¢CiCº³'(ꇡçè]Ñy¡yÉ!¡™"h÷  9C™I+ÃX•ýT,™Å‹Ù¡ööŒT´Þ68N×ºÌ æ¢æÉ E@*é…„ V|p«…µ0ÝéÙÑúÀ's9Ý3å2ùTùq¬¥dþ˧üø´°„¬Pð¥‰dy®Ù{νÏ=zQjù?þÓJ3]k/—rPí_-ˆ×ïdØu‘«tëò«WN¼ÖpÑ…·nÇMcÅ—ôe~;l¥½¿™ù*ÑNß(üÕ¶›÷ñéµÅ{ó3¯tðŒèoÛüx¨ü¶Bç¿ÖwÓaô›×PøJ»ù}Nôk¡LÜíæßÚ^ܬm·ca“xß8,¥»ëzÌ[uœ÷êk¸òºÐÍ\•“akAüc<¸Ój ÜT³¯òŽÝp)•Õ{ÎeI¶Ý›.î_ï~šÿ‘ƒâögôu+»¨_ºòs·Ÿ··òuÂŽå*¿úŒ~³"Ò?ÑÐCàÍûq_tYü)×WG_û××½àùz©ÆžëÏ6ÆàEpâkï%ÞVÑë¦nüUjÕWñ~,Ë£‹pƒõåi®ºy®,Ø›Û:Z~ñJq~Æ+²Ó¹\ý®„~ß;õK«FæiÜ>Lpÿyü„A¿¾â)_ãüÂåê§ÖÓ÷ 5ß(ðíÚ´ï_í7ìÜaºošüÞz½+¹ßj¾~-÷;š¥, ›*ÃÛ»³O¼'"}ó®î6{‘÷c¯S÷±”Ö·uÝ[š‚²}~ñé³¹y-V ‹ÛPÌœN=£Gf¤séé%#s¬®ˆÌì]Ê€\@©îFæÖ{Ï©ôâ^}a‹@²V'¨éˆIþT3ZïÝø<‡Á?>h]ÃÇZ ñ¹¡Ùé5xZ¹©ó¿0O*,'èÛ™·âL0CXNÊ8ÒˆE‰^ÜMm8Œ]Ì.Ap°´Åá6ò ™z42\µõÖq%+ <æ´ªyš½Èësöv:ÛaDôtCŠÙsÎFa‹)÷´.„f*¡ÎÖkQ÷`–Á2R!¥§*׈@ZD*´lz‡%¬€Ëb–Š2¢w¤ 8ÝÃb…ÅÈÖ[úâ¤Û üÜÔŒŒ±"ŽýÅݯŊ›‘ˆÈÖº¡Ì­=0:M½‡eý|œ&ÍÝuðaj žÕÌ5&&Kyž‘‹/±A€ eaž43Ô¥N:Í(C7È${SW&e=R™S϶8Õ @o§éf ë¥uö#G#RFÀ†hì‰Þh „¤¤Š#:”H(4t"•ƒƒÀ‹PY|EÕÈÆ(HK¸âÓ`½è¨„KËóâ’SD5:H-Œ}´bTÎÀ§Ð`0éëâK¤Kæ¬Ä0J¥KPó“”P•h 0 4¢ue(À . )\˜¥ Π€Šbp‘ ’(\Zhq¡u‰pG²‹]3Ëh¬rëâH0“i"¢wÓǑð´»H2fq;3½X"ÝhfФ%‘âb:fnêVŒ¤Ðrš•òŠùÓÌZ]ŒÙh$„ º¬›©xéSÏÖ½x?¶>M‚–e c±øÍ™)%͸4íÊÄSCD¯Å¤PÏH³þd@„˜ó±M3‹ËÍm” f¶¥)J,…æ¸,‚‹÷IeÆBº CáJÓÒ¾3|ü9Hk-‡B+ÑBŠáû‘^»ùËóß}ðu,]è ËÓÁ½EÄÒt9÷\æOõôçþGïOöHÈ帧ù=Žû(å|¨ùjw¹»‡ú¢}ðk:þ£_M£ïu]öº‹ðLjÖ~ìÀOvΫÊ{­7žÚN¿ÐÕi¯^xeû«kó[8]ûÎíŸi‘—&QI™’R×Êê.º´áža„çÀä[l\x¦q»íÚC{?(Ûä›ò—¶Û¼+öæ<©ô±~I…éæº±¹CÏÛL ]–˜KcÛºÆìæäo_Ä\÷h]zŒt—{•¡À ðþ¦mŸ·ˆ¨óÿ6‘ù®[¬v–¸šÄ«o] V£¯ëºCmÆÄ^Ô¤;Ž.6è¼ûÅõSºÄJ¼‰HÖâÝ•)¥+ ûй¶UÞ*~¼ƒoþ»yŒºÞ¦íâ‰Å=‰ô>í-rGô¾{Ü{› w2¿÷î^&Ú‹W÷w-¹'IÞâÖ Uî®Òý{ûòtohºüÄ•åv·F=Xö·)ñU ÿÎŒd'áÅdz{—{}9ñ‡òèíIÜ¥ªx©ïÓz[ˆ×wŸ÷ÉûžÜÕ×mÀV¸@Gnð¥÷mÄ»¹ ·µ¼ËÕ¬<6ËùjÝÞϨ\ðaÚÄL× ãí ±­ëÛ{¿å»¹Ü&„nG´ÞTH÷³î(4–h’;:×°S¼rŽ76s+€ÌkÉzï±3Á·H·s«ñåè{_x“¼ß–Tl¾ö­ô÷Þ˜7ŸÒ}(|ù§‹˜¾÷%šã´|‰Ý¹Â픸¯^/w½ù«ælî¼ö.s}¶7_r?×~Øš~î´ÔùÆæáðü0ù¾ êv–?¢­m^Ç:ë‹¶øoÿÕ¿‰¹Gë­µ"QÆÁª'hæ(ff 3R™‚²'ÜÌ©2{Cï}¹ FóR¢7Eæ²Ç(ž‘‹B DZq33+˜è9Í£itu¥Œ’WqÖË|œÓ23Õ‚©£–c-çÿù_G‹Åµ÷Þæ>瘻¢GWvIÔ|T-6T(—Ò~ŠÅ zRŒÓÆøœ@O0a@$`œj3øRæÏSÓ€;Œg¢ð2Ë©^†…ƒ/ƒNÞ¶I? x@Fô¡9çQr“m¤CðR#šÓ[N9Ÿ¼ ZÎn @m‰Ê­@ÀñSdÇðJq+H¡O !ºyºÌ ˹µ“ãiÊŒPí˜2e,^Ì Þ2úbz2IÌPÜÑ£C¢¡g‡?iÝ20Ð:´àþùpK¶¨?h=¼‚*½ÍXôæ…3c0Z›ú’XàVz&‘¡Ì˜ÌPËh,ªù2{Ïq(Ÿãùi<Œ‡ªy&ÂÌÆZŸç>g&'eö Ë_–Ó³VP7F3,`ýè=;EEG‡@«ô,êF/ 5õ>wFÒ-ÈÌ>+úbYlŽ áÌBë3èJ#nÈ~Ê=´¦>O@ ÙÑ; U šCÑØcéuá0(Œ/]IT§0R1ƒŸS'ÙƒÌÑ1'kד{O[Ô]žI…œ4C¥"„çµ ÒH8Ø„” Æ'G„ª¡[ŽÒh8vú<+RŒÌ¥½¦°7-}3^P é‚#¨ÅM&AG!”T’HFEØbäCJrPuv* µ@¬Á«[-ÂÁù8YÆá‰•ñ4z)>Ts³Rµ”Ùi •B7wC7ÈT*’æfŽácI!g£2Õ[ÎÝ hÁlnÈ—¹x,¤só'r~žÑ5OÓRÒŸÓ,å Þè2å"ñ'è®Þ:Šô Q€ùàBÒÂé"Ñ Â­Í/îªOOÑÂÈÌ€fZ!:¬ÒܺÙàVKö”NN¦RÊX†ÁYm,ÝäYkÌð8²y~~)žì0d²xL}ú›c›C‡j¥™Ü‚ IdöD››"²õl‘þáñ_|üãŸýÑßÿ^üçuO~°—¼³ÖÍfè&lÞ†bûT¬õ›“ô¿Æ^+©ÏÒÕ¹6ä>ÌØüüîEè6/ܼ¸y·eXEVç‚ožµ/^1wÀÃ…}ì h¾V½}”DY)îû1ñ¥4vƸŽo~fo ¹ÝJ¼Që¶IÂ,ž= »Z÷C·bï·ü+8ÌZÓÜ^½n6S›ýÓõÖ[ÂXû¦Ü㚸p«.HZÞXyrsݺ;àj>hGE ®¤œ¬²Ü«E¯ÕýĺžÂïtž·û…ÛÍÝf¬ÞÛ‰<Øl¯k¯¿´¿b½ýâZ½Wó^§Ó6¼ÛÞc}x¹«\Ï·6³ÚÊz“Þd韴Åóâ7ª¬ÞÂ=xM`]{ÿb⣯úÑò›ï²¶~PûåÝë|§Á'ÁW ã_R&¨w?þ3B_—þ½ýpWx|œÉþêAûèçù“]䚀}óøüÊ]Å!« ß{“oÞx;Áë+Jñ×¼~¤¯{4ú±GÀ‰_?ôöÍ[9½Nñ|Øv³îz?pܾk­þ©>?”€ôf¥ÎïTÀ7:š¾ÉsùAæíâòóc”›½ž#ùÊ_¿ìù^íñÚ-rÜIoj›¶Ù &Ä9 ýÅÿø¯£õ˜[JfVÆÁŠ{u+Õ¨RKñ ¥¸™ÍSk}ò¥0cfôP-f„»“‚4¿LJ)$[ïjÝÜÍH™è ‘N™¡3AæÜe¨‡âOc´~8T´HèÃÏ?¨Eo©1Ô„ë¥ÿ忊L©ÇÜcîÙ""úÜsÎE[*h¥<•ÛÓ282 IV+pÁ F¤# tdGΨ€êð%,L䩜™§'f„Ùm)ù s”êÁ€¤Cå´2‹±ô9_  ®#Û fçLÈ1$ŠrNöRÊÔ¦DDæ‚ÍAB V  ;"àe­ f^Ymœ¦#LHI9eª#=I¥5AÏ<žŒÆU2»;j-=új§ ÷“Ð(˜ÒéðŠÌÓrœA¼–ZWIÐÜRáVHošË“ ¹¿äâûÊ>Žƒ˜âTK5™£tDïQ0¤[LTËÁÀçh-?+`æÈŒ–!H`ÀòX?‡I~²&”s{6,- \ÜSš ¨G7˜¢aî)AáàôÜÄ>VÓ ʆL(„ät„Š«MhÜ ¹üDvÚ²a“@ È š¡‰çvR/B(‚R£iJ5æ0€B@^QˆéY„™é;’´Ùú,̉JŒI•è™H5š„ÁÝ 9áiµ SÈiÕŹ)¥Rql2S{(¡åŠŒ’`Æ©KÂXè6*&˜Mn( LÅ@ˆKdp–z§-¿€ˆ’ŒB4G7”QÑš¬Âà0¸[Â`Eᤑ´³Ší]ÅËPÜ‹•’¹¸_C‘ææe-ñ'–²ZpအôLSïj-aH7øÐ‹ëå—Ÿ™3A7P0¤R)©Ÿ±ÑË'!,= qi‹B_¼2°¸ûÒJ¡±”Š¥ÏàØzk4Wz*dµ›I¡$ ³‡[²-·›2w¯ß)%‰&ºÛ²*¹CÌY ÃÒ¼dACURÃǃûˆ™œÅZ¬0˜ ž¦þÒÚ”ÃÏ><ýüCu edÆËlã Ý—Üg1.¾/Š@D¶Þçž=HZ±Ãwþg²Ÿ©« ¨¯óÛíÚvé4;/tþD»Æ×•kÙ”~·:.:õ—v|YäIò§Ò ®Ãæ¾`O~3–ׯ™à¡Øz®^ý&ÍïUgîóuè¿çÐù4Ѷcþ'îƒùÚ“¥I#/m,<;è•Ñ£K€ÚVªî€€ š››³îyÿØ/ïQ Î^y×¹|õbà#Ÿ7k‚¾Xª Î~ºæá9±*}nåR§ö#è57±w(¡ßdÝMÀ]!õoµö¼öpàE?䄸¢¤ý44î¯Úø“ÜíßÔÐ\ Â?ò ïªùñW<žßlVN|ˆßŽ .EÄ|ˆ÷¼¶$݃¸:;Qäk½d·çûÎñoŽÿÖ%øîÜýãÀ¿ÿ6¤ô¿ ¸©ès_ýõnGÛ  /àyµô~O'ëý¶f½ßõ"ñ@™õ× `þ|lÇ Êß­ ÕÇѫסˆè Š›0˜2A¼ …d­N!OëtH‘HÍ­—ZsáV×’eÖRdvjKÈ–D/dqA·êH ÷Σð2ÇÜ̈±æÔÚç™fÑ#ŸþÍ¿ÖÜÙ£÷>õ–­«‡ ÙÙúœ¹@üMÅliK"aÆT @ üg'¿YÃÉe´-SÞ Ý0|„ !À@N@ÇI®²k-ÜB¶1œªÝ­B„ Ø7¤/­Õji9¥g1“3ó2†fydW”},CX¶6•RK1w;N/jZÌS›`™±ìHM=O^»½dvúùÝ৆nˆ8-f=S=§L¬ZÉ{ëó ¤\¼Õ•MZ T‡“Sno’š;´hÀ©”~9Ù‘vRÕu*»C4”йN#I^é^%‘N c é>À2ú (Åh²"eöhèQo­Ís/^ÆÑ >úøáðôÒñy:ªg(fÌÆBEfJv(ÃÔšî€-ý`y-ÎAWQäe°~lj‚ j‚!š ôR ¨˜°®²GŠ@Ï~œÂŒÙû Fãé!DƒWÍŸÙ;XÄd6ˆèãÔ_¢³ ª¢ªƒ‰LTP¡Å­ K_¾üísN3ªË ÉLæV«?=ÕRôyŠyB°|÷ÅÔ3"Ü,32³Í-zϹGë ôêÿù?þ'?û{¼™°Em¾‘óþú-Ä•½óõ €ßÆÏ¹QQ?yŒøM"ޫʶêxýr¿à‰¬{iïä òíòT^‚³;ˆµöt-—ãë €GД-0[ÐûØçíâÚJšøÑª“^ûÚ¯a»þ®Bç¿hšîjýÜ\Ø]¹åûñúO½~¿´}œ‘zU—¸:m#Íì‚Ì/,+î)! àœ'Àµ`ÍUXÝûÓ?nÀ\¼Ë»¬çÎ¥õýö¡hýY5ßœ;t}ùèÚùµX3Q<9¼Ÿ[¼VÎÏ«f­›a³9üõ>ž `–~…e保¶t€­¸Ç+¼äÚ:tóeZ¯pkx7¶Œ Smºø¯Ð厷[Ð .êºIzpݼÏ5ƒé*³Ÿ¦)ÏÔÝÇ{ïi X½Qöm6ô0\ °!ëðê È›âY=¯ÒÎê]öH º/ÖçÎ vñöñm–•;W¡u¯Ö)ï»̯W2êfvèq:IçŸÒ}Üλ÷v1âvÉ$ïî4ïñ!dtÕ¼©½§µ·ÔIù؆}w¶ë€?·.EnQRçŠÖ˜ÔнŻ8e·UVWìäúÿáùî©Ú¼)­¶×”ÃÊ~B;Ot/<º£~Ý‹³¯º£ðæ­úèªo¿óú½ZsÖ¡…îÁjZ—~\OC¼B~x#Ó_"ºÝ½Êû+€V_ËË“gÌù¥µç»?ßgý°îáÆìñ&ÀÙàÆ.7N¯žî­î~ð~\=êˆß½Þ›îÝÇ;Ö%íÕÛû ÿgó‡UL»©IÒÆ§é.ÖýÊÈ˽¢ÑëÞpáüýWÿQ’¹¿üâSŸ[Fš»×âÕë0úX…\~¾Ö  GdÄ©µ9±Ðg'Ÿ:‚¤›u’½5‚¨ [Q1÷ˆPï^ºGoŒ4õlýéCŠR„AŒlÇ9zðƒÍÇYŸ¥º›ùÓˆ¡Êýó¿üŸûó,e‹¦Ùz3)z¶PïJ„Ù²T@‰dºJY ma#:aDA È–\,äk7Ø ‚â\ m@)Ðòó ËÞaç}sXgàå 8è¨#zG)8|o†3l|[N©ìLZE&hV ½·—9ïjU](ާC}’ÒXÌÐbî™jµÊaÆœJs«eˆÒ£Ae@žr©”@^ ÎÂIÊ“]È|ê@žàø=aÚ„PcæIâ7"7`V "R'ïâXʨs‘D F–¢D3òéð4õ—D÷ZI˜!€ˆ¥ÎŒ¥8Âó†)3ÑÍ|Xñã8³DNÇÌ–}Jq3Ú}îÓ<' )Ÿõb$dX¬†iç›c§%ׇp?€C4 ÊŽh½TÔa˜>?Ó6¨Í¢Yf2ô}n‹®;¦£Ð™§‰\ Ù9wd‡™@²K)øÒÒ Á‰—TE ¤cOÈHSm< aB TÉh)–¿TTQ t±SF”n)¥ƒ3œO5Iq ŒË´FÏd.»DºÁ©UG5†Ð¦¨…>zfF*©0âZº+•¢àHÊHQ¸¨*7*F°#ZÃâB¼l\-‘‰&PêÅRB‹ÿ°…L °0úX¼¸†ZQáÎâV‹¬€F:a^YżžQÂDKcY$~[L±¤Afa¢Ô•™“¢1ú $²!;(;q0‹[€Å’ ¨ ]\ŠHÞ¦ÀJÃdÝ©L@d[òïMÑ]RÄbøÝOb n§×GôeÏ×c1ü%=Ò¬z'̳s™¬G÷:–úTÈúaÈú“–”Á4[u¤´,€O5Ü]HD±˜¬)™ÐÜòôÒÌÌŒ9úÔ¢uõ8ÁŽÜþáÿéýÑ?ø³Å1;ª/ôÿöþµG’,ÉÄιWÍ<"³^ÓÍ™Ùì3äÌìî4°àÿÿH€K‚ËÅ.!–ÀÎLUuowUf¸›ê½"‡®š™ÚËÝ#22»^V‰¬Èps3Õ«÷!räÈ9Ü&…Ÿ kó÷ã,׈…X—,ÛÈv$ð6Î|—êÅæÈÞD7ºº4³é áÅ»QÄ­¢ t“ÙœL_Ï5X¸BÒîSî,Wñÿ=É >®¾¼ÛßW•¼LXÏRżÀpî€WÛF[ œ£®ÒVÃü„Šm/ìôŒ/²Öµÿ®äI 笉´­ lS"Ý`µÚBºÔÁá–µtsí.;æ@ä%.xGŸh£¼~¦xkmS»7ºÔKâ#tÿOMtþ} ÿÝät›a ^ýmz¥M^s]38µ‰èG:ðÈâèÎÎñð~^k×Ö}Í®»~?þBÒ;ÖÚkË‹?qÀýD _OÚç³h4·qÅÝHãÕðCïØìt+¸¥w|È£Ö„«ó÷¿*Ò¼ýÿˆö¾Ò˜ÞÌÞ(”]-²[¿ àoýŸHšûËヒÑS„ÑZÊ®–ZË®Fï0Sæ ÎG$ÈŒH?w3zæžÑcîurw“Ë,)C̾4ìšME½[±ZK*\‘KRàáÅìÝ—Îjš»"ýçàÖ_âù?ü/ÌÈÙ¢·ŽPDŒPÊ”ÌHB&-¶ç±bo´Bi;È€ÄâPÂßkÏ}(f™;¹q'¬Ub:€!:ºŽ?¼¬9ƒ>æPÂ÷(Oì!óp«uªaË3œIºzeˆ‘Sy2Úsÿ$`?MK/öáéƒÓ/˼̓g2§Rúô$¶@Éx± 7˜#ý^ D (àu” LI‡åà4Š{DfHXàÇrq¢PMp";@С@VçÞ¢­û••³ñWKÙR,+clÕ~B0O 30•½´d´¥/‹í$;Ùc8£²€•Îì°5EËÈyŽe‘veJ…¹õÈ©”ƒ‚3Èž~ì‡X9­èÿ0N`9A¤¦ìíÈ`2¨õö¼ {„r™#0=y,Mi4E €Ù"—db÷3C‰žˆ8êG%¢£ÇðìÑ©lt“4Žqs¢êPÒ];Гt…ëû,F¤"& Tdj¡bƒ‰”pq¸L;‘“@µfH¤AÍ33!-ákí ©¡=ÏÑ—a#µN  RAѨnwn–mF†2H`gfÌ2îXGt‰“ pEr ”ÅDDàeºLâÜE2 ©A^! N…YÐ%TÐÄaаj½ÁàÓ4‘.L²µÁ­X#«y \Zÿt@2]ám¡G1Ö²w˜%:Ô²?;äֳόN«¹``Jõö¥M“” Ü={*Bbd£âh”aEDݦBÙŒ¾ˆtÒ­ÑÂÈÈÆÑÞ1¬~3"³ƒGxÔœ-!x™hTFfnÝ ôZàEeØ;W/ÕÍ#ÍähMݧ_>Õ¿þ¦~óqQô€·ì‰Ãܬõ¾´ê7O“¯ÞC…¶,Ë©mn±´ì1’ˆRË¿ú¯ÿ›Ÿýõ/VW¹Þä8ú1Ž×7”Î|_וöއÑ­½þüx _1âå»/ø½'ÎðuȇÇÚÝ›l[ywá’Àv7F³àBëŸo¥ý2¨ë×l >œ*=×%›lO¸gp¦…ñ32®?eÑùÛ·]l0f–ìGy/`¥×¿î«-XÍì\xPüC~•÷Ipc×þUq¿#“¯é?\°[; =t³Á¶@÷‡ lrU Ö#Ô^zˆ‘é¥ù§Žÿø_çj¡þÐïð/ _#B|Ô?Ë{ÝzuÖŒ`æ{oÿS4+áGCb‚üQ쟵ÉþT¶ûsŒÞN½~P®«+sí¯±)^Õøªæì?zËÏ_ƒW­ ôËF—›ýí¯ÿ€ÃwÏ9ðš3w7˜ù®Nû]©ØžIèe¨þÓÍA))(³Ï¡© „T‹%CÕS eªÙ3³·œ»æÅ„øôŒì»Ÿ¨ÓD‡ Èh¿Ñóaú¸ë@š ŒH«–æhùü?ÿO1Gf,­›Ðúh:HJ 1³“ft3T„4(S™ÙR%ÇÌabªð 7ˆ€ÊÙæwmÿñµËk€ÅH A Ä21£LÃ*l,¤Á DÐ̼ªÆb2+4”2Éèn™-æÐsqM+3ÝÀ+­0–˜ç9±)’D&ÕGÏE—äú/„wæhN‹Ñ—h] /…¶îI˵‰ŒEz)Æš©ŒÅl§4²º<›ê¾Lu¯âÍÓfYÈ#¤p«ÅÌ)ðß°z:ñ)R­X¨&ù~fYk$ TË‘±tõÞ—eY:¤iªuªÿ‡ÿö¿ýö—?»Ž¶¸mm£s ?Ǩé½éÝÛþyfÄ÷ ›‰Æ¯®Vû3áË3å¾òóÕ5ŒxÇæ÷^à+'Wáú»èüëô^Þì=Ï·É‹š×é~ÈëŽÿ[¸ç~!sóáG½Ž¤Úc3òE#ß‹@ðõ©‚£Ã+O§Ü®À Oi­¡üi…åvßÀJå¿ÜIpÇPý_¸h;õyóÆí~+:qêx9£?×5ÝÖÎ7r¾”[¶æ¦›âÔF²5P?öÌéŠÚzûœ¶M17Õë«KÝ …®·áf#Ñy’óìu©$vòËæ—&ΦóëQïâýbŠx÷ _UÈ;üˆW /§§s½N«u=rsï,åëzŸØx:ß`­º`Ÿ}Æî¶•n::q±Dî^ÊÛj„_%ÄÙÆ7!ž®eŸ®z^7û!?wOÿ¬àíÝHú¼æ•“CT§ð¸·ú™šÛ½Ç‘¿Ûó½’u+A–¶Ú4¦êüþëÏÒv¾Üõiô\:k½>ÚÛÀñ*;àjÝ…»š)_Ðt?7/ƒ»DXIg½Ûpi½f©»WÞÞv¹®óæ·¿þÏã¯æO‡¾´¾t¤2S e7YõR«O•ÆQÌhÖ{S#͘‰è ‹—Leè1n(ºØ2¢ïöu7Ùòüœ-% #ŸvmnuY¦o¦jàóA/s±Ä|XèÖ{:YŸjÒµ,õÓÿóС-½GDkA¥¯²;1´9Iž™æH¥U 0«¬Š©$Ò4äk  @-ð@[~ÈaUzŠb…HXÂ7Ê6ƒe‚(ŽÿiÍÃH/;…Š4Á$"Jû~÷qÉ%RNº˜}Qáþã‡6·¾ôà‹9„ ½³Ïøîåû©ìkÙ½, £5"æ9œÑ—ô‚Ö`ŽLx…6£8|B2Ö+VÀsn eî%{O%…Ö€û±g"1dë3 ¬b>ŽR9„†`ÎÑ…˜ƵšB‡9ˆh>M[]nN•)€.«?9/K¢ïö¶ŸÊT‹P"µt:‹³í÷µ3[g 4í°`?í?즙/}RCÆ*û# ðõ±Ò×*Ž@ðýfR©˜ÈIÝá^2a–p ðBZÉÔºd 9e®á¶*CvÄ'2Ð:"U†•ô‚ù°j1ÙfÐÐRf`É&#« öè(•†£‡°lP0é*f°ÀLYÁ7EKPLs´Æ©¢ÒSEíì¨.šUT!'ùK µ€d‹\"ÜYi9,"$…@¹Û(œŒÄ'ˆ9tˆDd+£r§ƒKH¦i'« L&¤ ¥£ÝÁ…NzjyÝ:‘„($¦¡‰ã¨ÛÁŒY4¦q’ðÑ£`fU˜…>yÝy­°*”òTëniôâ»ýîé){*DÚ˜¨¤Zª.Hè³HŒHºh–Ùp#Õ–Oχï~[&ퟦT›Äè ‡#cIešê‹Vwæf޾d.6@ü£q&D˜ˆ²Y ¤±Ž½<Õ1„±V“D$!·b4`8(d™«]ÀßaOX1£ÃG;‹ïìÌ}2+îÙ»¢#2–Þ[S'¼”éi÷_ÿŸþ; )Ù=åŸkÛMÉZŸnß}£*ÉW”Ö·Ñ¢(Cnqòµhð6@ºm:ÿì©<>ö ƒ¿«uy·°†íàlòÇPÕõñ&Ýê c‰ãÓú,Ä`SeYù*8ƒ¢WâÅ: .K Ø”øJµL¯À¸ºóþûæäW¾¹ov\üÒæè!nMàˆ{r·… lš™Þõl?Câ¶€WGÿýlM¶Gî}íŒÏ‚Zø­½®÷«a_Z±{gcÿ퀼õ@È{¸âçuð~5õbémÀS}Gü޶ƒ^-r¼vêâ5ŒõuÍÆÏuå]ñÏXgý÷Ï+sâÞººÞãn–Èy¹ñ^Ñ÷»øŽbÎ÷E)oðåG ”÷VìƒÒ£O×+‘ä;ëhïįë³Ýiå{(.¥W/ˆg9R^"ˆ¸Áö7Ÿ}CÂ%¬Ç}×ÎCº­œàž×È»*›ÚÔQ¿Ò~yÑÚù˜sñ*¹`±ò‘e–^iP=eçÆ_¾ I¿›ç\Yÿ¼²å]9E}Öë.íý•Sòsxg¯¦…z¸ÉéñàÜÝôùõ">x½}§Â½d|OÿâçåC˜'èí‰tjÖæ©chؒܽ‘3úÿÝK;̽õèᥔRX¼ÔbÅaÆâæ–‘‚"sØ1ÕZ¤(SÅ ¡XJš‘ "LpšùÍF,=g¡ÉR =­«Í/ ™ì%?ìgÌhÔ!Û~ÖºzúSA­­éwÿŸÿ°üÃ÷ú4g‹ž-"—è¤Yî2“r526XBœÂܲ±+Ye6ṪÌ$  ÁbAV/È~ìÐ*—ÏDô¶"àCï;@ùNâò†Rí÷¹ã!_hI“s7+t/e×–œJ­îÑç–¡.u}xú€:‚°h ÆJ–¦¹ëP|2C<´O ¢gÖzFÜÏ•µ¡ó æª?#®œwóŸ¢÷\‹ûjzÌ ô•¹£D6(eý ï1Òqè °+«¹® j‡q$[$T]-ž£!"ͼNÓpnÑ æã4UO5¯tÛ ¹kÙzÚ}´‚RøÝṉ½-µ”P´ž&TDç§@rPû±Þ†qBLÀ`ˆ>C+(äV(R¹ c"\^T]Q¦ýS.=X*ªjMÏ/ÏKý(+Á¥CbQ*¢g±ÞM桎èHc¥ò@t  ìHHÁA+KI&ö¶š´:XˆbÌT' ¡äNâ{åHœ ¢¥£ú¸×P£ÛÀC¾^ˆ–aAvíŠ;=àrjG+f‡Ð¡¤J«î)Ô"鬎êˆÀ!R‰Þ!ëµØœƒ–HÂI hP˜vO’#m gJ¡ê‘ÈŽ>lÆ ªá˜*@-€'Ê¿?Æír°¨äB¬Ã'ƒ(fÓÚ¹v¨{3÷Z|Ú%«µì÷ôZ`^k©Svfå{]Uû{GÊIõCk}ñÝ®ìk& ^H uhê‡RûÇ_~£˜3[_ž©nÓŽfVKï‡Ù €ˆ”c™c^àBe 6&%e–ÔKóJ8 ª›Ré”VK“aæ«ìÍœe瀤bt(º"2–¥N¤E¥¤KevM¬ÖÝ$“£%ÑÝ‹MS$ö¿ü§ñ»µð§}üÈ%²gŸ_ô´ÃnŠŒœ' æ&ÁJÇMoM©©Ѻ"ÖZþå¿ù7ßü“Ÿ›+v’Þ>ET¼†ßªUJõEÞW ÐÛ‡ó»Ø·@Üge~çéäƒ@üÚøŸÛp¥N~FlýU^¼@°¸}Ö—áËûoå‘–ã5tN¯îµWðÚ=<àôÅ÷ZSóòŸÈ‹6é0_WTË#êrLI³þ9\8:MmñëÀqÄoXÍGÖ÷ ÿÏùó=%9ýÙ>›ÿ¯K^ÛSúFë×Ñ콬çšùÇ%ôþUü'øú)úì.`F}î!ó£t7ýåõ—×_^”¯?Ky–¡»•Ú¸ÿåõ‡øÄøGólNÕŽ¿Ì¦?˜-îýЙú²Ê.!(]0“ ÅaŠI-P)˜œÄÚ¹B0†W `u§}>í`¬5Ûí@9MËaø+dd6õÍ™/Ê¥ÏK<Û’ý¢H¡µQ[1¨&«,Ë3*UXùª°B²Hêm¶žæI¯²Cçlè #oó!d”Rê͉L£-’è¦T_šz꩸Ùé9ÃiL$ ’û_ü³¤ËÒ¾ýÀwEßÏ-Þö¨U½·Ã-ù¡ºWÑüg!¹Y¤"³·@¤Z¥):¯þü÷óñWß.­Etó ^€ÑG'Þšþ#ŠB¤¯æ9ø—×O‰zmt,¾ÌWšàPÀ¬;z5øŠ~ÏüØá‰¨-üEtþ"j¿ùÇߨ¡t½ØšßRšt9Ââ›V¬F‘[ïâ{ųËï¹Ò]ÚòÏÕ‹KÏt}=u¤röѾn]çÆ‚þz>“·Jï³V¼põÖÍ£??mH¯§ºÛý΃ã-ÜØ°nE0t=ö—$Gm{ÄpþÔ‹{ÞÜåöÞµçÍÏy=ž<6-=']ܜμõ[²ó½¼ùÎÏohÖ÷£Û?êMWwz4S”»ëÞ Õ+NÐ|¨ƒ³ÝÕ_–KÈ+×ÊÓ‚Ôùšµí';­°ó×li¾ºøáEauã£ÍðÝÖµu!n¬›ÑáI™h#,q£° Þh·œ=zîMÜÎ*¾~¶cÓw¦›ëߨyoæòhÍ}‚6žÜhø¯RáßÑ”ÃÛ õ–ÜÈE gÚ¹ `[œºmƒÑ½é¬«âüµ¢.;T¤;[¥6Zh ãN¿qû¯œ›«}ÅÎX¥ynFY¸M»øTŠ×‡éƒIœè3›6D]œ×ç6jmŽOiËÌ nLÍ/7Ë;TèSâÕåMÇÇF4ð]0æÅx¼-hC¾"½¿³òºÍפ+¯ïbE ð°‘sÃ%çeßèí¼Áéntxå•€ñ,õJŸü;®œ|59ØRñtÕ‹»‰I^ù–S`ôª$À›xoÒÿ/gÁõN<”vŽ8û°l³6W{ùWß;Úq·„.l(ýÇÆ:Þãílétê‰ÆU¬@þú?þ¯'÷´åÓ!–Ö[Ïã·hF3³ZÊnb)µ–T†”Ëb$2[kc*îÊÜ}˜Æ¹Pk]ZG¢˜)Sf(^ÈÄK÷èQŠ!ÕKr_™2IKǧŸŠÂ–ß}ß–þñŸÿòéçO:tîJ¤<–ÃþmŸÛòé¥zió¬Þ2"Z’p™yÒÑ3Wf¿1 ÊufLÁ<óèßµŠxÆqà&d_¡ÿö ¨Àž@‡MýȦώX3ú Øà€ I¡xŠçÆ’³øT<áóܧ=lÓ`,Õ}ªæï¯I4Ò ù¯† i‰«¤2•K›{†”ÎZJYæ9¤UꇶžÕkÓ{F Ü?qhà `)Fg{ÎÝ7Ñ;Fç„—£=@®{c,gýŸ1݇1,:¢ÁŽ_š(èªRXž×‰g†ˆµ£À]e ó úð†¹s·àó,rª>Õ©2•Ê®^§‰BÏCfOβÓRͪQd‡"`¬Ì­gfݶÊe® JD ûp_@$2`äD!f;›vˆ’Vò Õiú¶˜ Uqªí¹eô«íЊ@{†>õJCå’­-aDt¼|§RŽìÄgˆ±Ð[Gt¨ƒ´ZEaD‚I†Å¶'§ ‹€ŽeQ*@¯¦–‰N~Üa_€Î}Å à°pÕHL¤ ½I†¹1R<¹æT)†öfnj™]*Åj±]V²ªn=Áåè2¥zJ2eöH#{fÓ@ðÑ•^4ÏÐÂ2D_·.ŸŽ¥#…ò˜½ö+HÈ4û‘ÂŽæ:ê(Þ턼Ðá==³w¬{Û=Á«y!J™vf4ÑÃ×vòZ24²ÐÝÜÍ Àò²rwšº`†ˆ0#Qé–`àeA›‰;Т½ôv ZB©ì­ÛÌ{—Bcéâ“d¾i9ȶÓÿõ¹Ñ¥DXF*jTˆyŒ@8Š[Å ËŒè!É¥–Kw²f驆PÈvܹ+¦¤•iŸš70Sè"Ç|«Ã‚©: ¿ÊÓ>œù|PZö”˼ؔ*ò:eÏÞ{ùð¤³n™Š\––¡õoÿ͇o¿ÙýìCDì¦i˜f^žK<µµ^J5êÌEÆ¥@è—ƒn: n¢c^ažÛha¥ÛðÌð$Èq F/r½t»÷7ôwm¡®‹¸ánãàÝpýa|v¼½Š^½e¥wëaPúèbÎ9#.óœûdü×ÂÝ/ÅúOm×_z®:»ÇXóBЀg8„'ý—ã}^ n&îæ¯@¾;ìø ›[¯$õkÀx,FŒädpÒ¹å럅|/o•W9ð%÷ÿî¼Ý~ÜúW¹ºÙ^=Ïò1×ê¢óó«½eûŸ“sÛ­Â;ñmN¡ ÓæM¶| T>2¾¾g8¬;o¹Þt x'ï÷JÝ¢.7 ÷ &Çb¨·´«ßWÐ+m>—»Ç%8Fn1¬÷”yñnwf¾fI~KêZçÀµ"ÃÉŒ€P/OåuòU<^`Vg„­J:nDü.1¤³ìOIóöd{ ^ßèñë,ÆóšêÍÞÜÓ5’~}ˆú_í»zïñ & /ÙoÞ|ï”?î—‹Oâtoƒtº#]õÊâ{·TÞYn§_)u_Ÿ'Ÿ&ï>[á¬ëÁâÕüy( ñ~[e]Ô—ôJ!Jwçñ}Ðí.àÑ“Õ]y¤kQôËpèá'éæcn–ÙçLë 3‹ËqÒ=‡3$ü.)üûù=øšbqwO½YóÕ³cádÛÂË;ùÃë ìUùåµép‰.¿c¿â©–øSb¥6|4éô¨nsGÁˆ÷Êa7ò½¯~7 ü%tòa!ƒ›¬êZ\ìÁ7Z4?0éºÿ±7ÍÛúù=.È;¯AoN×MJ÷ M¯;¼Þwþ¾ãüÏ\T#uöE€.¨ k©ýÒÛø²×~%@øío~ ÀÍ”yøý§lÑ—FÀÌ2“N+Nw+^k…[d:4ËT£Ã¬°…‹COµ/ ‘b† EÎß÷ÞᆾÀ¹Ð„ÖAÁ…©rÍJ™soP眈Ԯ¢ ™"`Æ !¤¾Ð„‘¹/]2™«~ú¥ÑÑR”>X<•H7x°¤‘!tµ€“—½ãû%`´Ä7'=‘îü8¹hM4º!’æ@²IsËÑz2"f#Ç·T½+‹¼"GIÉWsl$´€£ûÄ€DoŽQÂËP+Œ0Âdt@†4éè6a;™•šSØ„ºó:+ê®ì¿ñ©‚+´2jbÅ-Z°«.§™#|¡%±$I¯nFdÊÈb Ð-–¦¬–à¡ø±(ºbQÉèT¡ìDB4Ê*$DǪáÐÔ‡°¯ý7et ‰!…0 BÃ+Û IÄÒh\zr΀—Ââ eBq÷ÉÔ{ô1¸iÆŒT.{“˜;ÂÄÜïª,3å9%ÝP¦æ1UKY†%ßô³Ú¾?,™QÒwJ” þa×çE†0š•\–ìÝw»â47ôž=("3Úa‰Ö ü—ÿú_=}xúÅ?ý'™©L”:ùüŽ˜ÅH.®ÖZ¶îà¿4^Ô]ìî}YêU®»2@üüøulÜ—>%®$€Þyׯ¿SŸ=€×¸ð›ŽJw°#SŠ÷FäD üªIÄIÉû~”{fVèšX2¬ŽœÆMâöÞõº!†ð=!ä ñäÕ§'^ÎÝV‰® —w® kË#måFhMAy…=ÈÇø¨¤ôg*:µ»D«Ó.ÄdOV`7±þíâ¼í‰ÐÍÇ;Dп¤)æ3wƒ/ßʇÊÐíÓØLáÏ(àæÅŸô×þQ/ü‹äþþòúËë/¯¿¼þ4_¼ãEþ—×_^yý)¾Ž½zM˜éÜ1°‰}oB¯L€¿ùͯOFv‡ï>Í/‹ ¬¸¹‡Ò̬8Œt«ûÈa¤€ ¢aîÞ3‡inq/î}…ï2Û¼¨5Öâ5r•ƒe7±°,ÚM¨†@DðÓË"±L.e(Ï~XüùwÞ³ýÝÜ ‘Ù¢¿¼¼ä2gô’û ÐÄ0ц¶Æê=d((y ‘! î€GrL8â°µÏKfJ0ƒà Ï~¹MÎXAöÅÐól!P' QÌ L;޽F!L]ÝDz&óEÏ2ò÷)"±D/Ù£²,­õØžê­Í ¦:YQ榹G ˆX50äzŽdŠÄñúSê0ú†ˆ # s‰ŒE ¬¬8É芑Ã!€@¢Hè ^ ûo8=•ç¿kÑsÑ`Ç[Ù“)e‰„sL¸$²P]”(s–©(™6Y(CYAC‡¼8Ý‹s ô%º›W·Ñ5;]“µH¥9˜‰Ž ¤‡x—I¯ LHAZŸ, Ú‰N‚’y†Æ]…ÕäÏŸôýÁÓÓÇþÒÚK§ùôá)Z,¿ÿni-^fà/qˆî“ˆÃ%†½S¸ô’(Ƥ4ÇÒ¹´4²ÈÌU‹ Š0ˆ±´ø=XÀâe¿ƒ¤YÙÒD‘FcD¸PÍXl”¬ž(ñœl¾ÑÉaFe¾Ì2)É}A-&ÉÅɸs†b™e´}ñqXr–¾5f „;[¦­”.["J*¨LØê8Zb8†-µfÄ‚´#™nti¢+Š­90xMaWR ؉Ò«qR/Vw|ú–»½àþáC™öV i{5˜eegV‹ JVLR¼’Æ!$F#¥˜pXÊLž½«Ëµ—Ä30·\л²"›—¤5EdH‚¹Rè3Ü0:PBCyÌÏhÅêºC…Œ«&ÒjÈ Î2 ÑÓ`9¦‚Ñ…Ì-•jÙ3 CIßËÂÖ›%:K›Òá ¹³xsN/´œJkÝ÷ÿ=ÊTú®dßÒÐ7ŽÚ&o>QïZjo®ÛE¤Ï[¯üø²K¸îa;ëÄð¬Rtyk¼h2ÔC¸nŸ–îȦèÔ¶öšéË—žÃ·í—ïJæB×kc‘sšl¼^5…›§  «.gÊ]]’›)õÞ‘UízÅò™× mHg¹¬³ïy ñᱡóhñ-÷å³p§p3.–ÍvWÓ…>“ÞžŸ%“ýÚAw¥ ÅÍSºýn=ºa«QöVûÄÐë—ûí…(×{âžµ×È+ÀçóÅÄpq£ïŽ~hŒ}×¥ þôš!Ø-ñ‚¯þâ»/îŠõÿcð ñ­6]ÝÜ´Ò¾ý9º‰ðÀøõ½zû‹?HxôvV½:Œ÷Öt¾ì+êÍ„¸Ë~ç7þ–!ÑÝéί‘§ç†¥íQz coo\Çe}¡§´ýþñ—™¿ù»¿£™—ï^æç%"h†â,Îâ†âÅJ©©¤Sg^›2©'Ù£:œ;IÐ,“ÑÛ€¾M‚ÑEÍÁVè!Z1“0÷|Yúã²–µ–öëÿ_;œÝÔÒŸª–—yi¡T¦C˲¼|:´çÑ•Ý],œ ³ÔÔÊA•ék94^’åXý Ì`; aþþ€¾ÊÄc¸×ô¼Ÿû¹zƒ%܆ýKƒŠŸ{)õé©´e–ÒŠEf¤"ˆ.fz¥•tX…õ 2C<¼$ìëDÀHŠÜÙ¾VeôˆG_„ õ©20ÀÜÄ`ζ5 ÔW{DÀËt$VP Ësª¯X°W Å’>¯ó¦lþ\H I^VýÞÑÙa”D”°B®È/Í Øy$ƒ(£ÛÑí·XJë‡É«Wgwƒ¹¹–”˜Å§6«LêÙŘÜ[ô¹=»»”HÎÙ¤&a*† æ@[1÷ÌÀBG£!=´Ê°D02eÙ&†J¥(¡®œËsʧç¿ÖZ¦Òs™çÃò)~÷in z¦ºFf#ÁýEqB.È9¦ÊAó‚HÀP)ºœTg&<¹ H I»D£¥é9û¨/nµ ”Ï%ñ«É×ãYøû9#õóÌÐ23Ù€½¹EŒÌ2a©’6ÑV‚5E„Å$¨ ÙÙÅ•R$ƪN.úîÐÌèF}Qq Z2æÈ4¨Ã‰²;Ã=7nh ÅñƒP'øË'LZC îðH ¨ܘ x]3'ÜT'=}°Ý·¾ûw+Õ¦‰ÅÍÝjaºU'ÙS0&‘Vlxt‹Ý,3„”Ñ êÐë®Ð½/‹úèYY"gä3ôŒœ¥ž9g4*R ’Žlè3è¨åhFB!SÜײ ^‘±îEÜy¬\µ€~¦¾Jê-J©µ²ôÙçM*e£·Jp¨BkÈ&¯pƒgÝÁçh™ÊÒ•ˆ´'·J/Å«©bªåg;Ëjiþó_âÓ¬yÎÝfÓØ>÷;£q¿Ó¡©C`ÝMJå²`*¨ž%H­uõ@ÏeYùÏþwÿ…»×ÝnÿñééßÎó ¡ÖéZ“¯±YtQÕÖEoFÈ|wÂÀ«#ýJåø]o„~·—óNì’[-åÍ€¼KýÍ:Z\g*ÚäƒWY†¤Ì×:Þw#¼’ÒVð%O_ñŰò½<ü(E}Ž’ïhIoùĺL¡ïðµù*@ô@„€'‹\ÝQθ^½šžmRå ܳ“§êÔÝ–ñsŠÎ/ÊF.ž»î¤ö—ú—˜ÂŸ±è<.»î䌧\òægzTÐ=ìûW~«½ªñºÀyDŠŽ '¹§ °÷²}Í\t½Euk¯$¼7Êû—‚©×¹êÐ4¾‘Ow=6»ì•’Úøÿrš"ºi±Ò:;}÷u·õ‡7(ëÍ\äƒÍýêéV#_w6Õ£E¿{È‹n¥+xt+ÕvÂþu18[mŽ0oRÒawQæM ËUR«ueß—Û} Â:¥ÖIvÇm¦|aìr:xL½…+]]n%wñÁWj¼ýeâëMùÒ]wäë·6› /Â{w‡ë{½3¼ÁME=Ö\ÑkJa×6\¡»‡úýâ=MýƒW¢íº/U¨ËíàævôPãþ-éâjŽž ¼›óxì],ðTt#¤ ¿ˆ›ÚýB¯uo¢_\Ÿô°&Í[ɽõ–Žå ígÖ.=x%—û«ô‘%Š×ÝÅq¹í} ­t§’É›´E×–¼)?àrÜ1— 7W œÅof¤Î<äÛysf]Œ!/÷}ÎŽ}ÿ‰óŠnÆçxù7y_Û4ÏóD¸££×»où4øÏ+oØ„†ºÍý.¯SÛKØL¾;¥ä+A¯|Èù¿ì2Þ>¸+k“š\~Ñ)X|E$÷rä½·qÛ›ÿ>¯=¬2é8Ó.íâNŸË±ÿlvÓ1˜×MwXj jyå–q½óžsÀºè·ûÛŒ i^’h¿ÿ­W³b¤Y¯S%;eHÙ® =¸;ÀÈpãù1÷"õÖ‹œÏœJ¡Ò2›ÂŠŸçn[X-ÚóœûâûI6UÊS¨õ>+ bî~V?̹™»Ë÷ËòËËË¢hmi™3•10]ioÉ F%ÓÂÎ )¢8èè‰èXõa˜+B.ƒ¾Ùªø?hA™+-Ñű¼`÷t4ƒ@gžRm·+=CÒ¦ÝnžçÈŒ€‰¹HŸTžà“uÌû飤C{1¡x-VL`ÒÈÈY,Ë2«g¦RÑååpˆž¿mE=l ÿÇ©×ç#ªØWÉ£aŒá…+D /€T‰lHÁ ¦–ôfX¨ûõ3Çp !QA)‚ÄX4xÜJ ”yei™ T“½u-f083¢–‰°Ãò¶ÐÜ8•Rz,lÙzdð:9¨jµw¶>³`é­GƆUاà3ˆÁ.Ž!‚Ä£ˆSœk?Ù!¬¶Àî!ES™ŒOùѺ|¡#_žÛß>ƒJY¶ˆçÊ)ââPX¯v@¶þ}À\S!€v@tôp¹ ÕÑ;¼ Ö¥H!Ù©>ŠTç˜uAI Sp™)Û¥x0ç¿ë–‚ LÍ”¾uxZy„ñ|é-1>„i  IíŒ;£-Aà³2ddå*Å,3ΙJíiELà‘Àœjû=jY»LN/·µ¥ä—+k€“ݵ pƒƒªãù„W`ŒšÄ'Úd(;Ûkõ)ÄJCfV‹ÑA—1:Ì#ãè×¢d‹ Ê,MÃ4!G+L7ÒÓ²GƳðB-Å3rI”-£ª(FkQGo«`QÆ*4²–ý VšÿØ£ €­æÛë!c'’Üñïû°['‚H'êÏÙ“©aþ¡ê(t¯L¦Eñô¤˜öIJˆ«›ÊÄŠª2Y©,?~P$zNö1Ú‚|òJq–¥Tõrˆß}ŸFúÄýäF+皀DW†zIJD õˆžŠîÕë~÷ôíÇŸÿõ¯ <==)6ƒ“èÈé^/R*nq–/¡Ü*àß#}\G;÷"À‡ŸÿX!ýš3‚±ËKÒg†…ºk?§£ó]Qþ‡ ûÒ5ZÀKpæž62μÌ×¢ÇW”$/ÃWn+(«Ã¬.ÆvSx•t-(³2=p­Yq/ä9+Ô6ÛÄÎ6±¨­Ö“®ÀùQ>ֆϡWÝFÙVÐÕ%^hN ºî“Î@‘»ãå@lžñ– óJQJ'”ù”ßIY0<)êÞ‚¬Ú¦ô÷mŠÿEç_Én®U›¶ epZ÷ö;œki—¸êÛð1´vè*yÔÁðå4°ƒv³ñ]íÌ;ŽØI²¼¿ü…O›?üMü̸ÓðuHˆøé^ÿØ-=ü‹ÑÑ‹?Úñr òB Ÿ7Bó_óøã Â_Älþ°wµØQøœzŒä~öØ|½€åÑ]ó­þ`æÔŸDüNñ) ’+öv„7ùÔƒï7ÿù??Øàêíù%zƼD¤™Ñc™ê´ß¥22´â&mé˱ÈCL¥Á V êŒ^Ü 9€ ËØ¹Â¡Ái‡®Œp›Œ9Z äKïñ¼°´Ü•qGþTŠ{Ÿ ì=—Ñ3cyiP({ô¥/-#@Š4¦Lf¨L IBJRW'üU + ®+vA!Ę;éøÛî| ¹ÿȕ㯅RWnr_`‡ÐûÀLÆT«Ymó²,3 &LSyz*]‹2]¾÷Ý¡½ÌxA& n -–4/ÁªU«íz„§u)8G¦„h«C¯ûš–*’>±úÜJ°rlJZF‰l+Þ¶Ö<U?×€„ù2×aÙ} 0Þ\‘ àPxÔr!b ¬@V©câLµfF)$­xé½gºÈÒ£IáFs—u÷bIÊ(oqèÙ>ì?Hjñ}-Oµî‹×C›ÕiŸÙ[oHÉ᜜ÖJ"ŠUkyÌ: V!1JE†ˆ£1òŠL ‰&à•¤·ç~ç»Élø»ˆç¨4ë²}¡vsoÊ ‡O*ÑÜ–ˆ<4…@¡ó@L8<‹I&eÁ¢žLÉ:­bïPd=ƒÉgÍŒ“› ¸ôhtˆ,#¿ïÑBßÖò¡Ze‚5™9‹ðÑñ}ÏB)¡gRì9›‰@“–¾:$¦Ñ(e&@·}áÎ8§hCŸ™éA#‡äM-¦TDîhF ð©Ç¢Œa|M|»GÙ#Á?‘Z¡üÑè0”¸„uù˜ 8@”r\bÀÓG¬¨úPÌÝ%*ÁV¸Üi2&2“¬Ô½†n,f ŒîÌŽR˜™Ì‡YÕ§©’TJ©aõ‘Z@™™Â\´ß)¿WB rClP:W#çãþ0@v¤Îšë†ÒQ_gf´sy ½¬±õøÅÁÜÏ„óÌqM}kSÎÈñ]e¶ ÚªÓ%ѺM^Z"röG)°%b±É›WîÍ ö{ÓŽ¬½Çô_þ ¾¼X¿Ý/ršÅa&ƒVJìk>zxB’–f»=̉̔2£‡zäÒûÒ³‡‘ÿÕ¿üWÓÓÓþÛ§Ÿÿõ¯¨+nÉ…$µÒYþHuýø) œþñÆ]€»¨ÝnóVçç?r¼x·Íü,ýÀ?ØýÏPtþ= Õ&ppåap[ åOpý[»›R‡tQsz-e=ÖWÊñ’ïH\pãƒþÊC¾_ØÝXpåu雽æÌ÷|ho¸}@× Ö+Ù¯·Ê2×5Ò›…u¢¾¶d7Rw+tCK}á<äT*Ðå¦`üºËêy¬C?ðžyzˆ¯7®\Sw7-oº^Ÿº õGjüŸ¾’üÊq~ÑrPïéùùjóäó ïŠÞRÏÑ üÿ®ÖŠ×Æåv÷ä^4_E%ë´nîâkï~ ‡ÃçfïYjï¹^ù•ékM©³;Ýê®÷ô¦;ìÇN·NYÁuíÿÈr976ñ¦Gï}Ú“ü)É-îUø*!éÆöé^‡ææRy)&ó“%º[¶Ê‰XtÛ~ñ5«=WŒž77ºWÅîŠ}–%àuçðÌVÅ-¹êÜv|¼µý¿Ç;µÜCÿÿóÅ…š-ß?ÇÜÛÒ  ÝXv†Õø¤Ö• еp¸5(íËZÁÊ>¤ŠJ… ×M) 1í†í‰g ¦ža°oë.-dD¬3§»ûN>˜J¾–aõ©J²%»abùø„²Ó¼(zßOØWöŽye`f´—­ÖT*2Zo‡¥ÚØ‚ÿ«õ¯÷÷ûOõs\5KoKÝvºë:×úZhú«';¿¸Ïà¶à}ÁƒÞý—ÂN~ÕH›o^Æ&¼£ýøùý¦¼-HWý€ÛÑ}Ð𘛶;(…Î:ÉÇf÷žï/Ò>ùrõ«õ*u‘©^µ~“'‘×V—’[Ú¨PÞ÷äÙÕù<ïºÞmÛý5˸M“_Ñ&Ý>Ë·´ÿv¼ ÖnrË·ËDÜ*%€n›ƒ®fÎ-¢þ /»‘}¿g}|¡Áu¡Ðuº â5ðñêK ¶Ê ¼‘Mб¯A—R9[蟷17®í÷3ÄGŒÅ ‹+Í=DùÎxíi`x-Ú¯rÖÆiÜöñR•öÝàÏGÕf—Ôh\*¨¼W¯ ¶îÍ9ôŠœÎIe3¯Ï¿²ÙxD»WòÌùG¼‡_éðfqï¯6£À;ÇÕ©¿ídÒVàZùçr–Š×såjfêXÞ\ái$¶'Ã|å¦p3GŸÓâyn\CúÒkïZ fs¦¼ªÄµYe¼ý \â»ÐyøtGÔâjg9v^Œ2ù8ºÞÇîÄà ¼)Lð8ĵòR~èüÔt£íx¬NÞiŒ;’ý62:|;Xs‹K\¼–fÙj}žp±«Ù±-ên|rnÅô¯ÅY.|Ï‹Yú‚/´zŽ o3ÈgG“mп==7ëä¬È~‹ÝëN¡å\¦½mú½ôqÒÍaqg¶ßv²”¸Y’çq½Ñê96Ä^%pڄЧfÚË­m¬…kéGIo÷‚SŒ¡M¶Të,ÆÙC õ6×â$ÊÜQMlÅ™©Hh½zÒ±$^欞sSwùýßO{·ÉÕ¥Z¢µŽ’Bïm–ˆ…lf‰”Ü4¸ú‚ñ$¦ 2(I•€¢#4  <"×1ùþú?ß–P® [$H€~X…tzàó+°Û-À ÈHîC(?{ïBL»§ù°´lËäó¡ÓšL=>}÷]Ï^?2µ™ð&riÍÐK©SÙïì)3 ¼ìphK;dÜl7ífÍ£ÊQÊÔ[˾Äêq;®ÇaÈ;.L0»8eÖÍ-W)$/CÕ†ªˆ—ßcÚÁ Š£gé0øM˜£Rh ^±¤˜ú°šI$; ]‹§U+KD™v‰ndô–¥VÒæY`¦Éðy7©¢&ÌèfnÅ…()—¥Ú§]¦Y1µ3sCˆ.=Ö¿:ºË‚RÀºöpä &Qåt¨cú0za¾ i”©—Ì¿O|2=ùò}›3:FÉKËòü¢B©À§„í3,É®e¡\˪CÐ )™H¡. Ÿy⥸Q9VåðxH0‰Ñ—ತ*ä·]-;³ž‘É–i#Îr Ò®p «`¦T"4K!Eo€×€ãY K×äF¢€. ¤À!Fß)˜ÑÜÔÎP²KÝÑM,Øû°gg$‘Iw €{-ùšµv6’÷^aÚ |‚ñ,€#¡èèbMAé"à¢ÌŒ2¯Õ ¥næVŠ„ aÅÊT̤RØÚ##¦ºgW‹@I/Ù 9»EôƒÚ§@S.©…JFH‹"AËHE_ „Ã"{è;APÀ^×r Žu2åÑŸ#±ÕˆÍT‘P¢7x…äa]Œ^`CÌjôô, !Ÿ ¥®ÞÐPvPÀåž%(Ò*ý9‡Oܣɦ‡OæV=ŠÑí—Oòª%vûŸÍ­¥•òËoô²¨5ü>2€Ýû‰µÂiÅýçߨE, mA-i4¡õÖ{ÄÒbim^"â_ü—ÿbÚ?}øÅ·?ÿë_òTf$OçØ9øÔ}Y\mc…£~È&fxÛ÷‹7-¡·XÛeàt¾NÐx!Ö÷Š@ù›nCw [ìû•J×=}Ë2¹ñw.„ôv<‰ÃÜs>G/|5g¾g6ñÇh¹…¼?c;¼(ƒÿèKí'}éÑ´ÐäUK—ñÁ©àæŽtÏdá+lvî)ÿüH*@w;¾tgþ)÷¥?É·H*_½Ñ×;îm1ƒ¥s(»µv¿—¶Qø»¿ûÛˆî«2=),ß}¯žJ!“ft·â^ËpŤ٠µd&Šç`&s FôÔ~ªK*$Ü<22“ C­5DødÙ;YJ8RÐŒ%‰°,ÙÕ–ÆÉÕL53ÛË¢ø­SZΙLBÜa~nýSSkŒž± C!äʸ%Is $q”¸ÂHÃQ3c-â7U:( ‘ú#›g…)£\™Ø^P Ú @ˆeå&SÈŽ:Aô#iWxúø„ħç—è À Åk©žºu†ï괫˲ô¥¨;ûø³§BÌ} ªf1“;¬G¯eê ‘Åv„¥¢µY¥iYÀ(–4Ì}ŽHuŸ/HDÂ; ýGX5Ö‡Ãíð D~A$]J”ŒWBG×$–g¸£T$P*hˆ6ÆiuD ` 8Œö´Ã§mÁ4!S½eX‚i6Í­ÍK¬T¦ÚÒEÂh‚ÀY!3–ºK©- ,#{2©õÜO•ðl‡‹íw¥·ˆÖÍô@¦VÆÞR€l•þÏD™àuUsRÀAøÚÜ UÔg”wóI«ù)IúÓ.©ù%¨Ndä¹ÏH¹ÑŒ­©™:ÕaU^Ô‡¶ž€sN‰ )wdà ÈŽL¤ðqï•| eƈõ.>ìÜÀ–¢©pȶX…N"Á6)Üé4§‹*23óÊ€¦BXÒÉ䨜QØ›™Äá›L‚V”ÂD!$#]Bl¡ZLd¶Á‹²hr´Æ@>Áµk„S]Õ–Fu\‹O<:3kó=ÌA­å™1‡YE_\©îÝ}=Ù‡X`À/Åé´zˆ ¸W¶ÞS°4“T$R¦Z'hI¦,‘‹4»2£õyQöl/Dª·l³¹AsK„9d@5hí\AÝEH´H¤!µV΢alkó :¯»QN(Ãû7Î&„Ã% XÖ]ˆ†eFݣ[G e}ˆ²'$š¡ÈL…DˆôÑm}ÂrŽú³_¸Å­zy>ØL }W ËÊ—žéÓ“ÿìÉ`=Ñ­º éUÙ¢g¦Ôz?,½µŒpãþÛo>|óáÛ¿úÕ ©´’£>ûúiø,:ù&Võ™±Ÿ¾ 'ü–™ýÃ"5½’ÿübñ†W:n‹+_¹“x“)¼#³ÐçÝ»:~œÌÛÒÑ@þ˜Áø­võG+:ÿJ}åpÿÓ&ù_{×;£ÿ?ôO>|\[‹æ¨Vå¹#cð•Ôºlü_W¢ÿ%xþ2nýkß±™®lØu{xmŸ> /ÆÂx-Â[çÉ·—É›†~´³Yw<¼ß[лmnÚ-ôÞνEÜàTx§àÇ/_ð:ØùÓí<—„ïÏàÏ #ˆmãÏO±{>"æëÇÿÆÏúÙu¡bmÁøò'¸eyœÁÇwÌ7‚Y^>É/Öã×Ùi¾FTræâ¾c|¾FÿçWìúÕ[û)®Ø@ÿèU >,Ü;—·VÖü‚•xãÐzʼUø² ïlˆ»!׿£ð“>¤÷)*}õŽç7ΰÏm°Ø6´¾ÏúxÛ—õÕŒQ.¿N¶òßrÛ_w÷ûøë£àÏÊ=tÏÞß=gÏx9€VJ¡ŒÓ4…°(¯îµ”‘Çû-n)É••Ò‡Ø~ŸM‚Ðz´¶8™FÒ89'…wµ¥ÔóbŸfíkꙦ,Î%å´RÐ;?îu8à7ÿ«˜ddB=½°/]ƒ¸¯ˆì™Kïs¶NO-M (e‘RæÐÿÑÐxAG.GpÐÑ?Ô7M#g/7;ƒþCŸ@.ȆÑF'Á!s¸A¾ŠwáùÓË0“õ2>ßÊä½G &ËR|·Û{±———¾€5ñòýЧ“e™R½L¶ôŒZ@Ò\æéµDärXbÉjÓÒZïénSÙw5I0)™0”“§  ÄÓ7 #:` à2Áë±Ï4¡4 ";2axLbÿ "` Ù¡X%•ltB8èaW÷"Ù²õP½/‘tôÜOÕ‹µeé!·jÆâEÊnn t©«y èqXæDë‡ö»QÀ0Cä `^ƒÉÈNÏh«ûjö¨#¹÷0C }0 À:DQ™€…©¨GØÞð ¼@¦DÓSN&˜Ø•–ª` kRž)Æ÷Xì ("ÝJŠ&.J’)ôÈ”Jµ°ô§cI©7¸ÑŸd®è°/B"ñhMqêfÜhd±ÂˆiCÒjíG"¡>Á Â5|§9­¢hæ°ªhPS}R)é&w!B”¥:ò 0 NXŒRˆ(¸8ÈÀì„˼̆ 4ÏÏ17E*BJ*”M¹ ¨3£a9Âý£fT2ÔwôÃê²Q€H˜£îŽïOW/ Òb ކ›‚ÓA`<!±~ 5dGæ4$S¡Ì’^9í0©ë9–cb%­˜APuËÂÎi÷ /»IÓd}¶°øÙŽ=-ƒ‡¹íðvXäBkÙ»ŠI(µ ÈèRªÏK›—>·”èþ¯ÿÝ¿{úøôÍ/qsÄÞéÔë^¡r6¾WãÒ–öµ&€¯Ÿ6ò‡'Gï²6!èW/\áþ_\Ø€À¯‘´x㢰պù¼¸÷“¸I8šzåº6Ù̶•öAçìU×*&ò+®©/šw¥,N²@?Àü'%:ÿ¹¹Éç¥D?üo*dçî‰.{ô×>«m–®¾NqžWÛ[ӅЍ¡Ê³Û\‹Îžâ¸ì 9­Ž#å H#.ÞŠ³ þÑâçB£_[tR "·ðûIv×ÍàÚöïŸqÓ ÐíZ:çž"óÃ#”›¢À]E‘íõ\ø†löìMÿÏù™Üôûo~Èm]ãºp°JÅœtö7íE:pÎ1/÷î@sbÈë۰Ĺýš-~ìf[õs†šŽMª;WÓµ$þÐ|8ñïöÅmM®ßu»™ñÙݨ½ðò[ Ë>é8±}6·e‡›û”n¯á´Ð.˱g º6 úb#®Ú’Î@÷j}7+‹çöÅ£½8DyýÐÎmŒhíNåŽþÒe h]ŸÛHöŵǫrÓ*Ç«³–÷ªB÷‚ .ƒ®$®N»‹^‹:Îò麺¶jQ·ñÀyYë´ažäÔöûížž„D‰å¹ÙŽ¢{‡ž!tQJ(…Uz›‚Ÿd_¥¤€’Ȇ,xÌG?R³!“‚>C±2Û{C?À†šG®„ñ!€³úËVPC<'W@ ™4-‘™ÂáeÆ à#E7 OOÉlËÂ4kÄ‹Z¬qg>z陥à¹ö»Ó³GL“M¥Âº¬QÜâJDÛH„w7++§˜äˆs=ÃJ]¹ÿc+/1L€G[`ìëàœ<†§«°V D «°cÉf1|m¥/‘Ê€2âiª · “Y’ŒhžìûÝÇC;ìÝ[kŧ¦Cô6ùÞ8Ñ]æÙ{òÙ+éÙ3Ÿçï`P$€¶¤ûz…íðôÁÈòô«8,úfW«³0Ó ±‰‘mòüù·PÝŒp“™ŠÑL@Ë0{ô¥­ÿ´Á«ÿïÿí¿ûÕ?ÿk;+Gù ^f:cæé`¼’ˆD?èÞnòäg_É;ûÿ(:´…û¥7J âõŸöP.Ã/þбyËk™¼ b¿– ð6οüà׌~ú!ÿÇùòww¼[OþÏìày_|Ty=:¸tÒÀ%KbpoWGÛS‘ïn9Yúío~cîÑ»2Í|y>@êß=·y)ŠO»š‰ºÛÉ)ŠFÁZ„Ì&XqêÂjHW¶L*DÉ]žƒLl*ž=ºT)/B* 6¸Jï/ óИ€’/™RVw"çž´Ìlÿýÿy·û@¢?RØL¯Fdks–~8ɤP”)(¡Èxd‹3Wd XñÄ)W(-ˆj°çQýÆ Ô! ô×g¸£Nðì@ƒûQNg8‘úÿñèHÁ (n>îaxy>FØnÚ'ò°ÌËÜMVvŠˆÌlÙ#õùûÖ[>ý¬Z)KŸ‡q&”íÔ2!æÜ?™A™æ—8K©œ \ÝVI™@…G|}8Ñc½©A:V—ÕØ0`ÁxÔCUypÒóøëÈU§c)vP¹s( !P`–y‘ÒŒêáf)¨÷Xš3–iÿ^ó3eôT9„^|×ÕY½ZÏlîå©#çÃ!3aÈL5ÄL«2ƒâ(†ÎÕN–‚T£²* ÐP@:A!‘‰F=,ì%Ô•BÒ T °ðåY8p’e*‰%Ñ»Š( ’D*CòÁôGë‚ØºXÀ]¬äZ­’v%ÍÌÝIEYhfl)1—ÈB ð0¦àމt£ÓBèèsfÏœŠU˱o™ñCñO-)즔q>¢‰n´õL'Hš͉x²ÒÑ$|p8Ñ3_S5UÇ!ˆ•ÝÔhdÍáëQ* ¢!sT‘8=É -5\©#‚Og¥©Ñ•ÂiåD_gìX_)˜c}²:Vw äÐï’Æö¾|ßüÛ——Èöéà^ …’FºÐ{Dª'™mJ’Hf0ÛŸ Œ‚ˆ~èm^PIf.Ñ»22Bq†u´@ŒídT r¥óeb¤@a¿ZÍ·!X_£%@®®ÚÐÚµÓ™k“D;@D)€Ð_`˜n(vôOö²6먃™HMY3 uh ªºêžwgåSõožŒŠ[J¾Ÿ¢Vî&Ÿ|š#„Ÿ} ïˆÔÜôÝb?ÿ»){ ÷HXHÕ%(‘Ùz_Z¦Xõó7ó‹¿þ'×lçÀ ï)þˆ±-¾¨àsɯÐ8~‚€Ï ?+û|­à‡ Ô#péŠ*ñÈOõ­?·Ì¾ÿwõ¨`#U¿•ì½à¾p͆!‚·òøsÉë¸dË­ç2ïÔŠ>o\x]–Áô*$È0/ÿtD翨à´}ávðãsÍ ÇjûD¾.výºfÉ–0÷È„YzC²‡@á5¡öQPïÓ¯Þ®gþ¡iáÞŽéÝÀƒKÿqú|Þ>…ô“ £þ¨”?ç‰ëj*¾I¿†žõµ¯á+\ãÍþcÌ ÇVEïÝ6ìÖËÂ%÷#6^ðÙùõ&П„ܹôE%‡Ÿd[ù)$nxd§àNøÁsßdD_½œ·ðÿËQÿØO±3lþž¸öó£íÏXó|s!Ødz=¾*"é†ev¯@H¿ýÛߘ9 Ò@êÐÙ}xÂÂÜ{¤¾+¨f€OÍ’°,è=Z @FHˆHƒ”rg]y`BëKdq+n ©TÉ„ËEdÄËR¦ŠPÌÑcNÏÁ†æTÒÜŸ&´øô?ÿ?d]ìuW3Գыœ ÓüÝ!#z›-cŽ–FªC%m}G†aìäÇ6´AÊ*©‘GÅ|h0èÿD"|Bÿ‡7ÐÑÒÖa¶¦¥nÎô\õ¸G½¤îΚB4¼,/(;ìvû #íåÓR¬r·Ÿ"zË`kʼnÃ| ¡XjÎåð©'ññ»–3æ0ÆÒ^Ri,Ó@cÅÝ`\YÃ[Þ±òŽ3««ô¿+@®>ƒPœDOX\©ÊJ ¢½©¸qŒl-Ç2ÖÖ‡h°QYi0ÚÓÓÄËá@ÒK™œÑZ;Ô½ïöûÞ–ù¥÷¦Î´âK;´¶L»Id:Õ³Ú¬E¦©NHPˆ–èè - p Q&îP H¸ÃsS~²4ð[ ‡ *̆˜Á1«5¢SnÜUA›—b£‡jÈN¹à¨ úê«™-©P‚`R©*d$#E`ï€0|0F©©xAËU•g˜Yxb’«èƒS’Tè†ê| ,]ÿ¸cŠ•¶D¸³š9ƒ‡ ’(m',6Š^¤)°,D=¨nP6A‰€˜*D@-%1\£eÈ'C1ºAPË ‰ÌRÙ¥†trš¸¤¼"G\ed,Ž„2ÀÂБ£SDZBzGJ…&$‘\+IÃÒÇFú\ò^>A‰ßÀ*h+õ,NyI ^±´âÏÌô1ù'#³‰A¥”zÍ@óh®4s£LS6P½g_ Rcí@«(ÖI¡hœ'}°*òs÷'ÀºBy¤T÷QHÃ*pDÂb­×Þ‚áÒ _Më9ˆvè3@@ íÃu\@„ØmQ¤&LJˆÕàÅÍ­¶Ý'~ñ³ú«î//õiZjÒRY<öñzòÂEúŽß–h$v“Ï¥!{¦Š}éÙû‹³âÿößÿûŸŸDÿ¯É Cz3AúGIPï¶-þ±EY?zx|ã‡üƒÑÛæÏ»€¯Nû†ÏŽ»ú¬ïnà˜1 ïr–ûËB§é=y雵\z8ãÆNW€„´|γüÃ?Þï†Ô¥ÆÎ;{Ž$áÇ2d%.-”OöÑäƒï<þl›—ŒÊtò¼¾§ °:ikû·‹º?lA)—âÙ^~'3 \9mßKöÇ…–K¹žNË ÁßìO¼ïÉ|¥óÀÕχÞÖM#ç6­ËÄþŒ·éFåä.J¶}:7î1âñ>ïÖ Æç‹9·Ýœ&÷h Û‚$¼º‹»  •\Ê(ðrǦª{1‡ys¯Rª·­ºz:‰èܨmó¤ó… måN®NbWãÉ:Míãx]Øfœ/ñJŒGwîòηl”ø.í!y³}]Ž´tÿ€¸7ƒ·ZkÙÒ..uÕÒ]J·*O«æÄº`yír¶^8Kš¼ëXyIÖ5ZvœÀ›=ôz‚]¶3j«ñr%þ²-ê®Ã¶-ÙŸ5mÈÛ­|#®µjÞNôKñÁKº·¶W{¡v©ÍÇå°+{ynt®r’×åuÒ ãfË|õÍ뿪,§sía¤Smÿ¦]ê´Áó2€ÐNç s“G‡óé›xqr‡Ï±ßåžç«6Ćãùu©ÍtCï?Å:¼<ÏÏRxÿ •é.ñÿõ4f{îœJWjŠ—êð«·[ʼn9]i¯½'Ò¾J†_‰B·©ÑaÀ7zd/ ¨¼–…Ú4<ÎŇܽ+Ñž‡-Àzâ|;mïÕD¯{Æ7ÙF;h{ñÚckÓêåeñ"ë2ýÛ_{)4öç9#Õ`¦H4ÕIFE÷Rlª}HtHj™ÅLN§­^¬ 3Ó($mðÒ3“=•"æ¬" Ÿ–´äþ À…BMÅÍ„zfO˜Ùnç¢ÓÓJÉÖ˜EM‚¡Ø*Î#Ò¸lfH†•ž9þ„Û¡N8)ꩌ6$PÌ@¥d¾–êVï†oF!DtÄi°‚”ˆˆÙ{X‡Dw 9$ƒò¬ +%ˆt–Ó®f/ƒ‡ß–çX Ìôü;õ¦ë"¼¬"—cÌæ°‚ÝÓº.tZƒÝ †û±N<Ü\E¢ƒBŽî™\óªa0FÏ &XYÑè`G¼Â‘° hmë Â(º [Ž`(c5`§’IvŠÙT½rú«®—Ù@µäós©ÆŸ=µÃsìŸÔš½™?È=3eEN›¦Ìl½ƒ³ìÑ[¥gQ3¶êÿöoþægõË Œã|´ê …msøMt}–'ÑY™òËUk p Ü0¼’Ë$Zx£NƒT _ðnE¯ä2n wÖoaÙg™ì/ìz½€®¾–w/²—7ó/ñØÚ"œWè.¾ÐTùš—“™ÛKÕY+ä2¾ÈGuþ^Cƒ8aœGŸU¶[íÛ;}«'ùYU©+ý&Þ°cOÚ([o•˜q•Èo®ê&ý:««óÊu]ÂCûõRwëŒñaHK«ÿ“߀ÝÛ¼V³½È".¤’ïMƒSÓq ïæu¸*ï~ض“`‹5^åóW‚Þ·t$^CµÚ&-'©ýWØS·ÉìôZ›ìR«é´"6šñ[Ÿfm•ãߨ†ÊŠÔóÆ*—g´Yç5Œ­ÛîÃÍ—·zWuì‹g²îá7{ëí‰s{žXiW—~*´ÜÃ\~H‰ïÊWy£ ½…Òu‚ÿ7~'w•à¯Ï«w!u«ü”ÄÆÀ䵢ϗMáŽ%æ»KoIA=þ9U¯Þ ÏUºK t½ñ¥à»ŠÒÀ•^™=¸V»Û´¢;ñêgùú>¨Q½:).¯–Ûé—MŒ-FÅ/5Q}W‰û^·.L$¾6¹E·Hý2ÚûoŸñ^ÜX ü˜»Š¾àW.Ut޾5ÐýÏ\¹Ê§µ¬›³\_LÑýe¤7ǘWF67[žð°ŸèÔp]à—ÌÀ÷3˜^ÏJeþÙ³iÖ}™.ùžÝé Þiî÷õ }ïèÐ¥ƒ6_ÕQ[Yu¸B6oÏç •¿ùû¿3³öé ˆA‘Î š“+úh¥tˆË€{-`s[vʺŸj䂤”Ð"§Âb4©µ½“«B‡çV÷0Z1/‡—™ÏiCï"’µ¨¸z¤BÁ4,ÿãÿ}l‰–1Ä9SlF³Â’‡–Ö}¢ Tëý æœ]‘pm¬VèYäÊëG®ºCXcpó‡„ÈXá'uø$ðieÑž$•¼ ôûŒåñDL>æ¸^‘Bµ•üÎ#Ÿwüc*f­}ªC΀¹yqÿðq•%—/íe‰šÕ‹É—%¦g4,=­@B¶d…“î%¢ƒ9øI@,ÃŽ9ä@j•ñY/r¢T^`Dë€Vn2¸6:ŒÍ0np Ùø|8W•mì[å ¡œÎg]9yl§U“ê6M»Œ>/-3¹›&3OÚH 1í>J,-i^wӾ缴nY‡%­aæfféi=ZW¤D–d Þ!§Lœ '$N&‹Ú ¢Ó÷@¨þB$8‘…NæbÞv=MN¶ûþ¹þ·¿s——îÏ-—ÎR‹O/Ÿì) :ÝT(%²³ ãáS;t‡lØ´2(8Ü1VÚ¢L[e‘KÒ B˜äN32SIvhçn«ø0Ÿ «9€HAjÊZœRïQݨe?–òÒ[ëDS²°˜›°7vÓÞ¬%z¢u‘ÉÁPè6œR’D!—vvÔ‘äÌýλ'•-,ÀÐ ²u¥$h+ˆÑAR1 ! X1±¦€¾âHî²ÝÊpÿ^ÍØÚ²ÓDx‡ãª¶o^áãWŽ2_ê}¬\“¤‡H)Ö.–txUú³šeGW*3ceôׂò3D_¡^×—{+:ŸCdÌÖ*Ԩ똭ëè3­N!#¢ƒÖ®šŒ£FÐÑ*àDÅRÀ†ÎØÑfèÃ/AèG÷òêf²vÈ.U“‹™,(ZDqs÷ZÜ̲’»É>~óá¯þúðé·™©ÕêÇà ö‡Ü,O53ºOt×KW¡M®@檤–¡ìÑ—Þ—­g&A¯þoÿæo¾ýë_o@—Ù·¶ìÀ5’¤^Iô*lt_¿õ3µ·‘ÅÑpò¾iiû™>L·´ë/I’NŒÖ÷ÀÑ—Ãõ…rI?€ Xò Ü 7}Êü…¬¥ G±[›½wÕs‹ÓÞ ›°ø=·sA'»ú¼f-Jy2¨»Ž#ß5c.Òý0[Wz9º%ß–§îtWÿ©‰Î¿‘×\ù޼Tm4n^É9øî¤òv5³¯•%2“¤ýÄm\ë—/ü„òÊY«÷ίz‹ü‰ÇŠ÷Ó¯u ? àðõEˆõÓ??Þ—~ #➺ýOõúC™_"+ôPó“(ÅO_û#yñ'y”XKþ¾‡MåpXô¬i¶:–‘^=çy–«Œ€)%v¤€@ôUi$Úa_ÑÃÕŸ V€!$’Cä怠¶Z³ÊƒŒ<$}¦£Ü¿C"Ö}ÐNÈC¬RKÔ*”4:H´žô^lÚ¼ôÓÄ:wY§Úc)ÐMê¥V"[[ 5–0I ‚ÞJý@gïÊŒª×aʪ\“Öbµ/­{Ú$•É*\”#»JE‚¶†|…0Å¢ùpÈgÅ3¹íõí.σÇËó÷r%TH/ˆŽÞÈt_]¦ç°P$îbV 7BF©î±4MN÷f­÷Qv±'ó¹Ó “H13ŒLAÅ DDÎ ìÜC餫YF@^Ðjå¦÷»z—–”ØFk¥cúðkHÌ]žÌ97µÔÎÐv}Y†Ü¼ªž,S¢ :‡±îÀ¦kz_t“Qf4€ìc£ÀýWåв_—ó3ÄXÝ…`©ñX-E¢$ú²JðS+ÑuL㱜3aŽ\Dœ¬sÝv/ŸÔgfbAž”¯ÆLvX"r½¶aYÌ“ÁòQqXÛh2Ö.‡±êa qHä#×JI,¨æàËú[ŒÕcC6¾º‰Øð?H¤`eúÏ@ö£çýÑ‘¸Š}†(B‘ußÇÃjzª˜¹Sœþù?åÒ¦yiµªF~xÒÒ‚ß"w=ìÃN-úaÉRQ,‹"¸ŸhEFôÖ³GöÈL#­–ºŸ¾ý«_m)Æ› ÀEï%þ̈B]ÿ³ §xE Ã]ù§½¶¯Ýv¬H~Mrû|:ƒ7a°•-¢âgZξ‚°¿w–üa‹ÎãÕ)ËÏÅV}ɸ½ÿ¡<¨W½ý(±Qc¸dJ¯åOä©åôK¸O=zZ\<š18—ñ6¼«w–ÖÀ1Õ?uϜدE<º¶Û’ö–È~îÓ#®ëQwã¾/Êy'àjÚ«tàmIó$nrG:ëºö ¾zÁFÓ¥úÇ*ät-¯p‚ éÁÒÒ­'ý¶íèö"N:?ç²ã59t·…77õhŸÐµxÑY ç•ÞÝŠ?mnäöÙÜÎÞ±ì>×o¥Zî ×ÖÎçq>=-n…Ýy:bpŽÃõΕrTÜ=é}­»Å©wë\l¾ªbó®"…®åƒxÀñDÞ Ø\uZÚx-¾vEñ¿\¹øK^Éž=ð8¶‡QoLøÓP||˜ßÙ6.¶†›/9wÕžïöjú®ýjkƒßYáäf¬ÏOm#ösÕ»QD¹=çNŒ„MƒžÞ“]¨âܸ«óÜÒµrnV· N¸h?~\¨$.wá«möRkhÓLÉ tW½Æ<ÊãˆH¶ïY2hóSIU·¼ï伨lt9µxý¾«6nB›«ËÙì°[¤tU¼ÝÚîìbzø!›ì¯ *zŠÈ6ZL࣓Ÿw÷sOâiKØr”.Xmº–濽3]x·H½nßsâøàjö]×0îóΆ•Àfsú¬ç4ºMnBGmXHâõÌ<M|”TðâD<>ÿÏNx[°á!ÿÕ¦­ó–¨;9Œ.÷Š ºß†ðÅ£NËù9…¶gy¤cì°ïa{V¶ÜÖf9rE è’_Uõ…lÂÿŸ½k’$I²4±s˜EÔÌ#²ºª§{@3 Í^æ‚Y`±˜¥ÅÿŸxÂDK¦/ÓÝÓ3Ý•nª"Ì¢f¦vuÈȬ¬ª4*ÊŠðp7We9Ìü†’èã§êÎÜ+ç–‘ËŒjU™ó²¸+FÚáóÀ~7ÍË2/Kfʰ/˜v¶, ÙTwf¹ôYõѤ±ÖgÊ Ô£v¸CpP(fˆ¶"4Š©?0›ÌW3wçx$æÏ*ûcØàðØ*eöÄJ®Ö£´í½ˆuœG]6F‘2`¶*•^lYZS€PpÚ•ŒÈðµ(1ÕJÚŽû¹}j­OåCïyP[º;LJ‡²Ï™ís™i åË2´Qt d´=íÅ,S ²ŠžLƒ V<,û¶0°¤½šßÑLÅ!ÝZC3ŠO •‚"Y÷Ø}ÔòÊöJíà„ˆ„йtІ0ø >|dïH×´#ŠHdX.| ?¥QŽ5sÄSBÔh…ÙïTS¬ˆ)£F&à‚ÌÌØSNNîKJ™øÔ»w*QÌšg!{J!´`SF¶¾*ÝV†œ­Ù  .†" âœ)±-«H&è2žÃö =T»ï¤A3©ÓL"¬ÖãYj%é‹G;\7’žÃBÃNñÈð)˜vè}]˜n(umÈ@ôÕè{M ù†ý@ZósCU—p8€Ó„>£½~̳„,+»_óÕ‹˜u-جÿÁê¡¡/(e:ÚH–©´ÏÑ_G duÈÈŽ2`/àè0è(Bë°ÝñmÇö&0óuõþ,çLV;\ó\–lÊeé{3ws¸GeñbµîõgñºôÉø¡Ú§ÎOa>íf:£ ™ÙƒV¦"G~>ÄKÅ­º¤ì=zDë± ×ß4³²«u7ýÛÿï/0¾W§‚+§Ô+Åëd>®ºÓ`v/F¼[K»†ð±¨ø„·bÑ»Rõö’î¢pÃ'|ôãôÇ Ïðê¸È÷™¼.é‘ʺ}m ÂxÔ ¿L—¾2dÞ¢ÆOúWû¥«èú ]“ÄÕwÞŸS{æ–årzÛ3™ñÚóÉœ¹+ ß2*qAµÜxA=ДΟåN€®lÇÖ¯vß0V‘°!|ŒX ÇãƒÎ ?òÂZà–€W÷â !²·¥wB™)-2Õ)q¥o TÑ{’˜Ë"7Ñzïe_$³¥ùÜÊžjÝkÉD¶„!?Í¿ýýß­“‹§2d™Ö¨‰Q”J=iºÓŽÕüü)X:L„ÌD¢82¸ÈUÚeé£`8awÍ x±` =ŽÂP޵´+›«¡ë×FQ¹ˆèÀÑÛÓN• ¶BºC«Áìø+ØËè "2£yM ‹Hõ.K¤)úaðýnÿáã®÷,µ¤Ðú%uã4Á"£Íû_¿0—é»]‹ì‡¦”0W©è‡•Ý?êÆé¯À°å±wAÈ&$D˜PªI„ÒËpt–ïV¸Ê`—t;hk‰ñh‡åïàšèÈEafh¯è3ö‡ )€Á†Úµ˜Û’ ؽOuÊÌÖæ:M,Õh‡åP¼îöÓ¼,-—LôeIô©0å½w„¦:%`lÙ v!v&Ťf²Ò½ôn-;©è²…iċ̌éíïØ!7¨kG8;jafö$QP ‹[K+1}L€èé2UådÑepwfW‘¹ô´Š¿AOpÆîƒ}JÁê´£<ÚbUµV["A(sGΞNd(¡5É`r÷b1$†=­À³‹ÒàÌHÑ‘L’^ݨaÄJ6ä!2”•îd(9lèÕQ”=”QþA&ZÛÈГ–*¦$SPÇk¨)Tò»Â%4¿Ê+l}ÈA¤U0@—U˜†" Š‘@Q¾—g¦Ù`®¡ïŸ\¦½‚+g*Pe’¢ í(ðD?zkO/ˆŽœWãk$z‡ÅÐûÑÐ;ÖŠûÕ#ÐÛ‘vÊó Ù¡á¹!˜‡OPB¶‡lmjÁÈÚš:Z]íè7äoŸ€d‡:¼ªÏ]¦²_ý4r•åš•iÅ~rÎ0 ×5œ<”G})ÎP²5—y´ø^¿‡Ã6À¼ÛN¶&KK)u¿;óRÊ?ûç¹DfækÚ®âåãÎýÑ—Xæ_&û¸‡µŒO³¾û`¿úH³$ÇöÖ3"ZÿµÿeW¿û³_ÿ·ÿúßž|°fc7‰~»g’¨M,õþpÌó­ï?Še¸´“Å z…›b¸/£ôhÇWE _¦¤_‹æï,ƒ¸QÛîbiøÖÍÑ»KXÞ݃«”À;ÆóÍú3ÞÃ=ÝUÿobûÇ¿þY1ø½ñyP”ƒmÏÌý#/–Åý¸÷«½¾úI”òœƒàu¸|§îõZçÿ žS¼ÓðXh=Õ:ãaEݽE{kUx™”åf“üê=ŠWP°mRíÛ;4ß—x¾Õ«àøÅßW$Eb=¡üòúåõËë—×/¯_^¿¼þ _vãÏüó¯Þö÷ÛÔ )5¤£ˆø«¿ÿO§ŸÖrFFPr’^ðâpßMJ!`ímž©X–¶,JC)…ÄÞw­õX+¹’ÊåóÁLt#93+!(ºÀ¢7ͽ÷=ÀTXK¾öD(Õþÿovõœh-˜½GdiPêˆq s¸%bÎÝ>>~,ÅãõÓKö& =®ÀJ0MÌ!˜eX^Žêû³ú?=8~%_,ÃEs‚¾úˆ§Ïêj»þ"BÇza–µjxd VqðøžtD`WJ¢ŸwÇÙ'•Óø`úTŠz" ¨^Ä0MÕœ}‰¥µŒ”²xAI2A,mµµÍ–my­ßYï-zZê𠵆(aÓZK )0C­è32Q*äà|m˜PCï°½hȤƒ™90)C3‰ȶf”xdIˆ8rTŽuЃ“^&d ŽÆÈ%Û2·– @žÈÖZoYhé-£–ýôáe¿d^zW.±°¨ bŠîpa²úéõ•—‘à`J\¨ %|¯Œ\BfZ¦ÙDN ‰ÍæORf,ˆar°‡UÔâsê`¨nn½ÁÌü§ÿ»þ ßçë~=dñ—©L•Ó›¥]Ôù‹2š/¿ÍR‰Ù’¶t&ÝÌûÒ_J´LîÄ®x)þÁM©’Ú^[¤4Êè§âÝè‚Ó;¢ÒWcj³J\ÜWO edhU¨FMd¤Y<•–a22Àì *'± ˆ9:¥Þylà]´ÄÜ1§†œ]“Z€&‰»½†·Aý0̇É*/G5Ÿô* ½S!V•r,Z÷ÕÚ 2X_H©U¹†e2ÃŒFë7°"f0)VÀc[iH¡'Ѐ;²!ûš¶cŽj|eTÜÃa;_#}¥Ôiø! ««qÈIz ¤áf|¶­ÂÊÚ•ìrd‡ûÑ6#‡‡F/N-pƒˆb+/KB¶5]1,Ê×’][¤ÕÅäêD{R‹ÖŠÛ59&™6zq:T½Â<à}?•ý¾ŠWÿóbSQª{öµcgJö[ÿÍbkIßïâC]¥{PŠ™"Gá_zF´Zênú—ÿû·&®u[Ñõ³;’ˆü/¯?BYìT,òL¹ÿÝ…•UãåýEÜkãêÙíö(yë+†¿@çØ^öÍ)@·í×§|˜è^WŸ 6vzPøÉ­¥î—õÝS§ué9q‘@Ùº2o _ð*·‹kÔ™}qæ»uuþ 5þ¨*fêqÁêr‹8‚¶½)7÷ü¢[ïÜáq ;º¶i}ÀCÐûªfŸ<Ë7,µ~äšvq½>‡N\òPVÐÀSÞÖ£qm¸ßÚbîg5Ô'Þ²]d/‹Æ/K‘uo3ã+—›*þ{3^êÞ¯êŸoºFîWá?!è¼±îtãoM=¯Å^_ÞÑÆsI\y?ÓMï󚸹ô#鲕›ÌðlBOè‰ÕúÿäÃ]…Ï­ÌOÍ8ºãÑýÞN'½µpßhàfêœúU¯š•/ŒÉ7gÔ—ÚnVÜ]_§‹‹›žd½cëzvO.@+—FÊGŽÊ—¿ðþõß ‰y9|Ñvɧ³óêƒó]Þîϯaë€}2°»þùM¹É·,o¸Û~»Ã릵ó'‰r¿èûyÕ:xÏ·ønÉ’îTÛEo½KµØTØ’n=[(`ìõ/þŸñ¡f ¦õX2©¥ò¦±†–fôÙÌ ë½7†¹IÊßþ}˜àã9jùG½±¯AíP6ÇàØ0\p ^^¦Ýnz_{„Ï Ô¡@›aLDWKÍŠ#9|Psž—Ö›JÙ•š@ºÛnš–¾HH‚Âò9{'ˆÈ†© -1}d 8JÃájÊZ‰l)ä«° ˜!a0@5°îØ]ÓËh\_§qôcɳÖD KÐH ôUµr„­rÁþú +0G›×=‘0Z­S›—˜³î±ûnš—$4Ù‹å´ä¡¡y ¹[ôÍ |ß^ è¥C !H@ßSI6cKš%Ýè¢J æ{õDjG¨ú’YÒÜÉ¢$F»^™³uˆ‘%ä{ñˆüÇÿÜâï-”ð聯ÒEÄÄÜyM÷iQÚ|€¼rç¶8e¶O/Ä,[òujWª2M…üPÝœ­õCäT¬&"ÆÑ#õândëYQ)U:M…l‘tÑ¢CÕÊ)„RILàµg!‹›‡ZÏ4˜`]° SwiÁaÿÀT&Íà KÇ`²u!R;'C&™ X 6mU@è HÔI¥ÂrHŒ½Ó\$ÍVœi¬@A¹¼¢Fb c´a˜™Œ‰Îq˜ÌHëä°ô*ãÆ!Á<ŸÒGïKû„XŽ+zô¬Ä:‡IÀøyŒÛ2Ð: 0}ëš²&ÌÆZ€Ðù§† ÀHÆ ¼`ôbXA ¡#ň„ïVc±¬ÛN¶Õ-YBuÐ CÓšl¾vÜ‘ìê({Üåpì‚*NÐÉX tÛí}ªNÓT— OŸö ÉÕ—ºûh_êË"ÊýË^Æ84¸+P*†À׿eXþö¥g^½î§ÿþú÷°èöÄwBä=Žïê7o)\7±ëùmï–ÛßHnŸÂÛøAº‰Fô̵`sÿ‚øçÅì_äõ=tûæº òÁ\ÇMÇÈM÷t†;(ž¯ú7Ì Ü±þâX÷ÈðÖ»d‚“nù 4ÚÇæù=ÖÍ;ïþ–ã­;|ƒ/:ˆ ×øÙ3Eò$Ó\Š_\7}nKÛù(NÉ#qè’ãýPv¹\uø:û½Â]ñLg,ýVF¡Þ8Ç>°4ß,Z\vœöó<;ƒ_ è¯oÁy§¼ÈhÛp Mÿ·†íÁ—o÷Œéæ ó†“ÃöÌ¥M`ó¯øO›-/Rß·}löm7È´Æ#Këî}¼Ë`zàtS´ªÍl¾×´?ÔZ‰m愦&ÅÓÉüª½n,òóôÎi^‰Ü·Om— 7¹©ËDÅ£çͶ·7(·æÒ³~Ýy¨›]Žc©àöPO¹Óxtû¤Þ”¿ôDÒå wz èJì:4mîoJΚ• róuîŠzâapÃö×en`eJlYaÇÍ–W ¼S‹¯ÄVÝý•Ä%dí2r‘©Ðí#öf-ß…ä=ñxî»p;M.6]òîxž 7²åöËëíâŘßÍ®³ †§}§µ¢¸ªGyã«ùþ4aq'‰|Í?’žH–¼‚ÿœœ*¸ÕÞù8pxß¾qøŸóè\„w€q£ÏsŠ€çý„éwiI×!¬®,b„‹'ôÕ.uKØâ=¾»ŽHEÞÀ/W¯×<ïæ÷.öIòV:·žŒ7½›wYü÷Ò<ÔãSŒÂƒ4µîŒ÷sÍ5h_ÑQ·«ÿA«ï-¼€Þ¯ßoïËÍL—_yžÏ¾0x^àͬ»§þ_{:ÜËŽj•\.äû»Ÿ» Õ')«1¼]§)ù<´ßÆÐÛ›®ó–p*YÀåγ%Æ Ê®Öÿê¿ü—ãg´XZD§„Aóv/» §yñRhJ®;ÑP̺²½67Nu"”ÑÊx–®™h.`W‹)L*Hµ9|W¢Goi{Ï%Ø{Ùí¬VµÐÜ_ÿ?ÿ®9:Dˆ™,<³«—Ý`a… ¬P½G1ªe J§#RÑWþ¾92ýXö ä1Ð\gµ*qk•1`+Àp ¦ ƒëݲg™@;í3 ì_ÿ<"tÛ4XÒ÷h))øÀ,ù®N‘!G)¾/ûC;¨uòˆÈŽ\rš¼-ÊÈ–Kd X–¹–ÝnªŠPOÖ!ZZ[²÷Å<Ës0Ï<“u£:ú‚f ¨ò²¢ö§D¨#‰²CnPÙ‘C£? úV1!„d ~NÓr K› îΊˆmL•½"ÚBØ £ ™kO',î¼,Á ©uä8³*Ô–¾$®©÷¦è´â¨ÑçDR&*"N᪖‘½¤»wuËW¡dV¡Ð^Ý,ÍjF‹Ï™Öó€bfÃpµ™Z†Fý¸2r7H*ƒ·ÏŽRæWPê^3è¡òaŠÝ¤y‡¤Z='›°MÅv»ñ-ç×ê°ßBÕ´3ßÇÄì!²šzË~XRÂÎÍL“,Rn,#D7Xr‰Â8𠥋nktmcaGšÛ§H‡È-Fó„˜M(*†œ£X>ab Å7‘Á„ >V I= &Ô•(D©kPL#R4¸#†²Oôe8fË*Rê K•¹{qHs×à)]™Ö¢M ÃbY]9xÊ:‘3Ž€ÿ!‹ @î€ÙÖ¤Ýê\}|Ž(q4_}tÇî1jö©3M.È€€ rX=úîâè1Ž5Xêš\}°íâD!Á 2Ðûš3‡k¯è ú2Pm@"F«ÍtŠ6 @?538ÅG‹Àêv@7RFÊ`¤™£żԩìl?aª»òg¦;DöeÑܸoZ:íóû©Vçäb±°l-?-þ«A “€RÙçÖ[‹¥g$«^_vÿÃÿåÖu¨F­¤pQ¼µx\L·¶e[qê& |D½Ãm+–ϱŠ6ØåÓÿ.tÄww|]Æ•düor&óÄàöjy'ÿrb¨ðv¬¹ <ÿϯáqQÜÛüni饰³\Ïñ(Dr£|lˇy“"Z!a@ï›÷nïé0ï9XÞÔ·ž\.Î*Ùùpw:.Ïôé;§¤Mõ˹^kTvþË•gÃl÷¼òæ:Ï;p1I7Å ‘ûZǸcȺ„+mù©•Ç–hkcöhºêqÀUMÖö¾js'~È2åìÂ4ú£èIû‘?ä/Í}¿¼~yý˜‹Rèÿx6ãÀ˜ÌîL™ä•^lQ³˜¼B6÷Þ©ÈT÷µì]s«0Í‘ÁY̦À÷ ¥“±7ŸŒÁìJsz2Sæ• :Wk\10¸Iê–†2Bd$"?ø°ùô#$$ ÕN¹d7á‚Ù„dW¦Bp€D% ³%(„ëÍíh.íUõÃÚFÓLè±®i߃{£œ /›Ü ¤âžê( )ûB¤¥Ä$ÍŽþKò:LÈ2i²ÁÕéð‚v8úôæŠ÷Þ}A,ÀéÃM9Éhé½\Ð&ÞîЀ ¹°ÝŠ3V½¬@Y7‘ó;íÕ«¯ø‘&” ŽØÎ°›dÈÿü½íwÕ½í¦ÖÛîeßÿɯkeH„²e°8¾«ÝF³ˆ ´ù-úÒ²Gfôêÿú¿ÿ?üêÏÿTÛÚ‘s}un+ýħ—ÅÅúa¨ë_^o ¸~~G‚oÚž»qéÌç­!?éq‡Q«­¿Ù¯ãÖ'ÐLŠmiøm!ý‡í_ ó_=©Á“÷ÒZǪá'õ«È6µ³M<4Æxbw©¯œú’ƒžÞ‘Ø¿kçùS‚–·|4ØÜT?!6÷+Ä=6å<—ýokÙtÊ êÆQUⵯãíYšg_’{ƼxÓ3¿­:þ"ZÖ-æQY .×'ðË© w¯ô+§à»þ´·Å“ÅîÇ(…ïYÏêÙ]ÝÑFTç=üþŒÕ;´œçó·Í Ô—[ëK7„;Ž¿_Ü6½<ü…º©KÙ– ¿ïónÆû<¢¹éEáåZº›æ½þw\·9øM¹„®×ǽ¬0ù{ê&)L}åöþ|Ÿ=—õ‰§.:HN¥âäÓºŽ/lÔ<îaüaÀò{#/Ý<_Èsÿιˆé‹Æ÷ŽÍ:¸¼ÚKêßÅóeû³ïça­NRO}¬ÞðRÚÆCº,xgÓ`¬w{¼ÜyÝXÏñ=ׯ{-œJ®žŒÔ7ˆY¯ú¬ž Âvðµ o¶-}_¢óšùód$±’ô™ú0Ö8Ï.Þ;G)Gï¬<‡Ë£Ã6õ—ù—§þw7³Ì4³Xºòèzì4s–bŵ: #$ HèÑ3²7/‡×¤aÖ•t³L½uµŠÆÞK-Ó¾­eë©Ló—êŠÈ¹P÷TÌÖó6¥yvtôÞ½/"È: ƒD^ ”uáÀZÝJÚ`˜(eŽÞb–µC³IÆ»âOxY‰t£R¹’Vl×â=Y4Üp [uê!ܯ7'×;h¶ö¬òâ‘TÎÁÖ86x]ËÿˆaÑÒë8]8`¯‡aÕk“y÷¾´Ì’_[rùÜÕQKY–Ž?Í󙃆žÃƒ÷h.?®³½"N†¥<{;Vd§ÐX?¯„Z‘ÀáÓªøsÈþ¾y[BJÐWzø`•¬MXµ{ƒ‰cuóñi=rk'„ Dj As”Í#8Ñè9v¬Ñ ˜û.4Ç5©hyÔ¡Ö)EÏï—W¨¤ÒмËg§[ó@Bb—²Ác¥ÞGÑ‘‰˜²ì‚^Ñ›º²&‚0u-‘€B‚ÃÑS@'-Q¨Nô(Ê vMEüýÚ`“½š›óå;+¶¼. µ%\ðýKDˆ¥ñ»¬žŸ_=âpX²°V("«¸T„=?‚Nô$ÜöÐkàc©p""Í=‹(ëè=®Qþ_Àt"udf $YˆtzË霤DÑH³4 ©>ð½ $i2Ï X2C=@r*<A‘kˆ¹|ç #fØ} "„M°IF” e:þQmNЭN ­”º«JE,f>ŠÉ™Ñ }Ns«/S¶hs˜É‘©4 à6š²Ž¥­uýÄšäöÔ}ÚÊ:=iÔ‘ ««@ßÛ*ÓŸÃâŠâP…Mk}&}íbQ¾€6 –Õ'cì'æG'ÞS$—k3AkјÁêñª:ààÑ3|Ú¡ÖdžŽ ¶ñæ1v0"íNx,Áhµ¸l}¨Ð˜´irY©/n¥"ë4ÕjSE5¯œŠïо›º€áùN«&«ÞÜMY³øÅ’è=ef)5 DFfv)¢ÍK´ž‘ã‘ô_ý«³ÿ°ÿÕŸýé§£õl1´ jmÿ!þ#Ï£5°‚ ÔíV{ºN<5eýªK»í®æ“¨ã‹¤º'êÕó0fktü­*.#¾yUo^ÒÕ×­×'ñQpþ\O¾_ô¹éŸO.^HtÇ뼋á¹~û>k#ô½cÚ·Sš¯1°' íýˆ÷ú"´i«~q?–…<Œ7ÝÑØ{&ê³í“!À…˜ò _ä*t¿Ð~þø óo(]§Þ\3v~ÔÙʶ9 æ}  ïn›Öï­ð=½Ä v—>Änü¶7 Ýc¬ž5as°ºšr8s²yrqÖ†ýU°Á à’rž[w8wGå©þ¥ÈòÌ Ú²ÅNÙÛ»vG ®PöƒŽìÞþü¹h‹dÚ4ãløwÛóüåÓý¸-òbO~ Î} “?ŠxA7Ó] [Ûés O¸ˆ.:üoñ‚|¿L¶INðØGz¹I¿‘.;ê®zÒH¦« »ÿæí£ó<œ:>Àuìt;É¡s6÷9è^±Î•&²ÚÂ]f›¶Œ›câ,“ÜhÖ†V"\ªÜÇÏÄswÛùð6 s~(lèV·"å²÷ÄÂm§ÝèAÀzš<ºÎðfæræ/¤5¾¥ó?í”=1ž£éF÷Õï“`z’¡®to'ÙíƒnDçGÞ¿tqCÖCÂ&Ôã¥éă?\„1›<ÈÅ"¼i°Û€Gn!Kº³·œâ™M2€[ðÒÃ}·D²»¡ížxÅ‘?Ýê‰>ù4z•ª‡~¼Î+Ý{Žñ*ü½¤z³Q<%›yL5ê^âb›c¹¿ß} èÎæ}o“¼ÓüýøÜ¥ÍR?å7=§ðó`¿ 4·ÅW½‰]„ÝÛhK>:<9Gm#rÜ=R9¥O{‡Ï P>;=Ï_ŸA'TàÆžã܉ö pËÆIò>ýÔ¦Î}´Œõ°eœ0¸¢‡' B[‚Ñ"âãw»Ãá0÷V*§É#ÛÒR\ Ÿ_?÷žÑáì(7ƒ›eÆ™5” ²*û‘+r$p¬ ? Žãë«R™€w ûÀ[ fëÔ1¬õÈ:l”ê xôcÝñHŒ±í}-yŽåHUx…€¾j"~l¿Ð¤Ñ.ˆ¹!ƒ,9ÃP}·Ä’è`bF{{t”nÒ+‹ÑšHY*, KXBMbF„4[Ën{´ìø¾˜9¶è¨¨{ÏCôb}N“V߯n½«)…àbÌF&–L! m·gþúWøÓ_Ç?.5N¥§òÓ¢Ïû¸«ôZiuš&ôÔÒ—l]Ñ= fV¼jd¦2KG¡½*°DrØËŠnÅÌ(e€¬…™¡HÂ* Ñ«EB«ñl‡ sÜÈì¹D§_£…”ž•4g‹T_#D¥ ¥Zg –X3%]Nˆ>JþsG»È+ àWD\ðÑ+CŠH&åŽ2@àÊ`v«/Ó˾#–© J´•jFiÉFȈôê^¡Df„Ò êË^@ÿí«›¢#Þ`yDöÇ‚–ǤW``Œ¡Yg¦CohGzO¼®M?e·Öþ— ¨W ‘€¯rôµrß JÁzlEJ]·‘±RÌój@‡:ú+ê8!bmTÎ+S(6GÔ˜û±³Áà¶n€åÈØ )iæ$öFz± – ¥–ʲ³S±ZóÝÎÿù?ÅëÜ{§k!Š¥¤1”N*¡ïðš>µ°4°:=s â[Dëm^²‡2zñÿæßüwÓ~úø§¿^ÝéÏBÊ6¦: |®Â’º`úo"™cH¶Õ".éÂgô§î’©%×­ª_X½âŒîÔÙð‰Áê•îÿü×ÝMÏSHo¹êR®“W•‘·vxà쥫O¸‰À·å]º*rÓMàåñ´]\yù°žl³ôôà°Àçi¡“ÖrÅž:YjO*yðÇß¾éSôf#©›2Õ//äâõußÐןAœõF=Óí™÷QÀ³Üäè¸Îaþ£<ÛºKü|^¿×ë?øéͯü‘¼~ÄÎû®¿w#ŸnüµIJyÏð˜D6ãhä1/,ŽR¼T]a,ÀÐÑQˆ„zÊ3bàøYˆì‘èËBzYš!«­359‹CLevõ®â3Ð2TJÿûÿK—¥z‹e^^gE‡/ÑeH 8Å<„°è9ô9c¡ ˆˆ%ä£R”ÒªÙ)ÿëþa«¦ïn1´|[ÕüSæÐl|ùö >VHˆ»õ¾’Oh° @¢øZÑ:xÙêa@¸eÍ þ×ß}—¡Ãò©yD »Z} {cr²Š¨Ÿÿqfm½éöû4br*=K©uš²õùÐ3rÍOåÿGÏÉY‹ÜŒ@¤1R„¶€XŽhôºš @™VσåÅ…“¹³ §&×Z•<˜'£Ò_j€ ·µ`cÔ õŸ‚d½' ?fDvA¾žÃS¡À¼,©€¡x-VsÑÒÄá’L˜gšhÌ}Ê$Ê‚= „ç¨_—ë–"YèfK˲0‘õ@Ñ Â0gÒiî},8j¡ ”B¬$ÕY©Ëw¿ipoT€Sq¾?àîÏ´)Åâ­õ¹G MÚ#‚Õ 2XËHŠ©ˆ²vÐøbØg¨G)>8^ÌGJ¦˜? ·ž0I Óè^@ 3¡~4…>!$z*Äη¡\KÒ©”^;ãˆ3Ìh̦Ö9€6Iæq¦9×r?[ 4´(:ݵ–.:Àw*¢Ò0– ÑèVj™0¯S)¥ÏÕV¤¹»e;ÌA3+  Pûtˆž«VÞ1œ*ˆÏh‡coJ®À}– ÑŠã–™«Ks%ÿÐÑ;–@Ùƒ¼À,(,È£†7øi¡Н®:‘&|B3ðr„þÇê <ìÁ‡`7 a믠ÖeµZl%Â?Â1í±rÏsÀÅ:ØòO~’iyôC8A÷¯oô›µêWZ´ÐùŸ­$õèLwÏPíŽÛ—&¾IUÜUÀWL‚²¹¾mÑìµ3ø×£ø®ÄÄ-FoŽÁ–ø±-ÌÖãƒëÉû.sàqmëת›_µS¾ÿ‘»)3ÝöD|SB¸NR~-há~“Þ5?î Êu½ö—À8¾`Öò¾%ò;OÿåâÙ¶‘´/’Û.]Šßï·bV=°ýJ½–ß WÂÛpk99˜Þx˜^Þ© þЧêöIü®ÕsR…o³÷7·ö‡Rúø£¡â¶k­îå 9{’¦Hžôú#‡†>£D¬Úôø†–‰²ªátPk±0’Þ£Ä^Ç¢um\×IPàó²ôÞ#£/”TèÓ®¶¥õ% Ó«½L{Ж%ûg¨£¸Ë¢Ži7Q˜|÷z˜ËT¢/óÜ34@"vL`Äš´@ VA®î°•Ì„.x T´)ø@ü Mò¨U¸Ã¢X«˜G ” V0ÏPƒ9¢¯…?åH#Q‡F´Vûóµöy­íÈ>ÔÌ$`‚p”þãH>iÃËóxpH s9ܲô×¶D/9HÂ9H=HJ®ñ{{ Z L¬ÛAÑ °.™\àB¸ Ð(Õ»ºFÛ‰š„9£ †D¦‚YœèHSwqÚÕÝ+5JA‡°CÈ}‰O‡þýl4èÐëë¡û—Rç(´n ²}õWwdËsægGJ%{4íÌ!Ì™n>)É8YÉ‘Êd!;‘-I2ƒêà I9·<…VF˜Y$º‚ÀDk‘HœEE -L"„ÒA¤jä¡$HÑ•êö·k¦ ©¦ +Á >­~uZ+S¶¾ìºY rˆvh‡n^"Ä4Ð24 ZÊJ¡s,Ñl‰ ñÎÙf›Šû—µåem‘èK8$øꈎÄê}Ý­až1}Än`ÕÙ€ÁÅÁ‚ì°Ñ°Ý[ÊÑ'|ý\úh«d?,2V[ò2­uýê+Ñ«¿®;Ìjà‘PÃÈ¢”º†À,(/Ñçc£ƒÃ'¨Ãµ:|4§É Žb†ÂR4M>ÕÛ×t//ßÙÇÖÓåO_¤¢eΖ˜jöÐnW2bnÝ€ý.çΈNÓ´yX™ÅÜ EföŒÖ³õv²RþÅ¿ú×ûû¿þ•Î[¶§‹ä¹KoÃøRyzûˆ¤ž‡ÎßrÙ7|‹n+S°UoIÒ÷CâÁ ðª^[_,ýôåÏK”7Ãy!/ë¦Eù=ôÅíhß"ŒŽÿÊ[¬Ë©&þ¦Mó‹Ž _O¿/KX.{ ’YK„Ðy¾WÚ{ë_ËDß(û´i€?íÏÇó7ˆ6¢%¯™[[ÒÎÝsZÎ÷`e•á]í÷ïÈmׯûŽÄ㣕c[̉”rÁß¹uo;ýW7Â(ï<Üø!@¸mºà=Ð÷£õvùÔ"N\¾õBÇp¯Ì¾ã µï v¯fÛ|·MN ^/\^®Ã´é‘ìCêȱ¹+ºsK~Ør&¸íŠxÜ õä‘/èÚÜ` iÛûÃ3ªýYe÷ Lû ¸1ÐÕ(^<Øpvd9,@\ôøè&! ‹œÏ€º;&륮vOÇœ4ÇlÒMº…w·aÀ¹ýJä1)un¿ÓVFÑYS¾ÊðN–„ÛŒ×é“ÜÈ’ç3=Þ›·Ä  ¦Lg.‚b=ž ¼˜Åg/ó³î®»rÛ7 v¼|]p « yz¬l(UçÈìn:èØ?tÊÞÛñ¶­Œ[[—† £%]rN7“§ ß%ÔlÍÍ]>?Hñr÷xþ,9q‘¶‰']ïº 7ݯ½Øl«ÎÏ­wÒ½k“Â|@œºøæòººám0ŸeÚu1ktïWm@§ùx]ëqÜÄÄ›,².6_âè=æQ]*_Ô×ü¸mó”àãøDJÞv:?"ÿÜÞÛ¹DæèùqbûT¸ƒ#ÛÜö'Ó© ú’üs}áï<ÕÜ·=¸fo]SKŸmµÁ4ñN~îQàÊ á‰éßý{ЇqÂIÉ«Èû*uq»«óó)X’ô×õW$hìKëË’‘nfa]©©Vº™³ìö4£ÃÝé£BLˆ4'Iµì=hôÑ)”B…»w;IF¤ÔS.µCËLs«Š¢ÜUøçÍKhþ¾ѳ-aŸ»¢#zÿþ°æ×׃Zô¥çÒI˜ª™A­÷ ƒ“SHÌŸÊ'ÙAŠP&Ì…:4¿•°‘† +¦ßJ)½ ¯6M»¶Ì½g “D „YÉAð?6 XëyÖF ¯VÁ.6[Љ“³òò7ĸQƒßgì÷–ðÖÛ2‡9k-€2uø< ISôyD@ÊTÊå!MõCfv5wf5+ÆEãúiðÛ´Å瑟>´û¡¶¯ÏÛ#‹˜îFB4ø÷r ibFVÖìÅèx° 'bYÎF˜ ŽÞW+…ì(2VF ‡OGÛÒ\‹£©£²9ÞsÔ&›õ¶Žó¹’:V)áIKGÆQ.4Æœ˜€%0H¢A@PZhÍàJ(mÜZÄl¥Pæ\Mi‡¦…x©ì¦²XK¦©{·-‰¶(E$Úð3õT$ªyu.’A™L“v¶÷ú´˜J¶^hÅ”4íjd22”š fú´ßMµ"'²3†¹G¶ˆìÖ“ÅP-MÊn T´¨·E… IT€ÉbÖ0s •ÈêÊp0CH†©Œ[Ÿj=2H¹QÒ(ÞÏDJ#e–©¤DIh‰Œ±%ÑR;c3!l™ˆR“‚ÄbˆPNzµa…J­Ÿ@ˆŽÞ×&º3„f+ZÉ3E‡^v/™Ì“¬„2Í<ÉáRfä°7Ë2Ä#ø"¡ L? Ùúà+ìèfÖF¨atuD_3‚ê/ß¡”Õ4îQv¯WÒÖžŒp¤„`JV Åa1ˆXeí:2¬= dPÃ0ñVÃÚ~¡5I¹¶æôµ_G &êÑÐ^ ê¨;xEŽà¯ñ°3KÀÃ+ J1ó⻉û:•}|³ìw©ðbż|÷±·ÞZ°çþOêR\•}W@ä¡GȬZŽÄ’»2ÍKôÖÕC=3bøýþ7ÿÝ¿û“?ûÍ™¨zÆžo²ôÒ¥èÁ»ÆG\”' ^!SNgyn7ìqðž?å×%qó˜ÞFW!Üø}bÌ‹ æÍRÖÓïºÍ||OÀ“ʉ÷K‹äÝÃø9hÙÄQëêªJôniÅÕg|~U—§1mÂ*âlŸÆG¢áýÑ>IW!ùøA®"ðÛ 8Ÿrß¼/§:[A—j)ˆ›&˜¿-îZgpk<À ymÛJ„ënl]»\ˆe7F [Ï*>¨ÒFn:MŸS£ªt¦oYHç€ùé$ÿƒ„ΟÛ:~ãå©M›÷׆ƒ­Ç™mdOÐGkóúØõÎÌÁËë3úûnÀ•Ò{›Œ¹·mê[•(“÷³GÇA{økÊÝÙö£Òôµ_zÏHœ:Zšå»MÖíþwñz-þ€Z̹àGñ^†õ[t|õ”ùÉ>ø½ ðÃI?º­Ç¿òƸíxü$ùFÃøÕÕ?&ãæâ·õ3ÞðQ.ß'‰ñçi›7´óÇDÁo¶þ~B^ÏÃS_6Åo•Þû¼¾{Ûx>{•ßç£÷x>i¯²d7ùùÅÁU¼Ë¡àÇ™RŠÊßYÅ‹7}ïüve`_Øðuïž­…ñÀuÄýÆ9ö™ ÷ƒ€»”Øo:ºïBÍ^¯Ï)’õ—e¤yñZÿð©-s_Z¶§s3ZEÊYj-» Ê̽@4³ê­7D ¹5•Õ-A£)#rô0( ÇŒœ²fFë4·â^"ª£õÖ_[/´þúfæ… UI¯½–y9ôÃk›çè€.hFJÞÓR."X³C`¶·c¾ÎcÊ/Ñ!„V±løúA¦Yì_joµ·ežgäš×R½/KëiÅ>¼ìçvè-sÔçZq÷dS&iyîHD˜¯E÷+/Vø~µWqDL´%‰”¼º ÐËþ¥7½öyÚ• í¦]„2b>Ì„Õ] ï@JRîÞÚ¡g§ŽÝ œkßÃpÅQÏ]ÙZÛNú^ÖFur¤ÉÑ`e-Š]ý£V °| ^×ýmÔk[]Å\¯È8~êD_0YuL{d‰@#C@d¢-p¯Õ Ê=MÈÓÉ6ÙAQRæ¸ÿ2£‘,UѲ§ §Ã„ÔQ牢¤xLÞØbS²LH‰Ýøš=±„¦¬ "”D¦ª™i ÈD@ ¥X@ö dar¦‰{·déV4¹ZçbÌì» ™VK!fu+%[ƒ—€ƒ”}Q¨¥+ÕIžRÿÔÔûg¤è}×#äÙKqäÒ»î“Rµc”ªYoÙ]@§…%™)å`e(‡ -„ „²·h=z ¡Ïk©ûéOþì7çrïc½Í©G7<ü‡©tëMö5ýQ€ÔVúáeí‹ðU_ü¼ûû~ˆ›/îøÁ!«®j†x©ïÿà€otê»6g¢ç¾ÍoFªïX@|BŒ¿yþ4ðåÀp}ÑòøcƒÎÿ€CÚÐì šñC;ÊŸñkSDûvàV ünÖ ÷ï]o™XèÖTãñÉüÞÞ÷QÜ2ð¦&UÏÒ?ÒHÃõós™þ?tçáþ†·—Ï–kcámšð®4ÍŸ|<õ Sw>ß÷'Іôø1Ê'¿‚?Ioæyô»zxêËÿå:ý­ÇëÛŠ•_÷¡¸I+ݲ(7Jèvꎪ‹ÍWç·7Ó'ztøv €o¥Ï±ßï#ßUÑ)]ÿó¼Mð·š ¯{XàÛ«ÿ§žÇ· ÂN—÷7ý‡o±—Bf‡ø¾ÏK,=zB‚­//EÆRKñbÕͽ”Ò²KA†¤ù(fŒÖ@Í„˜1ílø¾gHŠ0:Í-¥6÷¢Ô¼d$ùK-D‰®Ö#22Ñ£÷ON‹CkBfÌm9,¯‡ùó!–Eѹd¦`QIˆf4™:®”yWz†›§¨v•Š˜åˆðöu2ׂ ôD™ ;"QÍh¾´Å’NG™§ÒÝæ9¢å ÝÆZ’L‡ÁÜ|u>p«¥¶ÖR‰ͤµ eæš¡0`pffP;_˜€–ßr÷bBhf‡¦Ì©Z± [[jÙ ¬µdÞ3ÔÊäHÌó,ÀQô¾Ç2®ÇF­ÚàéBkG€˜W’xıÊ$Þ¿«Ààž¯]KJ˜HÊ€LhF!C‡ïÒ_‹¾YAm½!Qv ²­šWD?ï´ÔÑÍ Ì÷%–ˆ€ÕýNó™ ¦L2UÒ#sêè©àÜ:Ø9œZ:j¶0Á⢘ÔÒ±¯h‰äRô DcvBÉH–Π<#$dÀ§Tf(¶ÇD§æž¹¼«¨Ép`2"ª7z&`…œ¦ž“¼tN7ËL›Š™uãCïŠn„¾Ä¡»êj=̘”‡’¶D ›d­˜;Ùr_Šù´w·®dHõI¥™Â;ºØ¼‡hì)‚]Ù#l±ºÆîÈ õT&ÑI %@ÊÁÍ™t3И"D- "FöPH°HGTŽR+kdã€FÀ®¬Þ­V65v H˜ÜÈ L©iÌf3öö‰N"û¼XQÝÓÍ ôj™LuID*}ùj%æSÖøÕ ¥¬Y¨5ˤÁ€²CvônÈ@h…óp‡ ·aq1Á Ìkò€t_)•V{²Àh¾ƒ2{d±Ú€è'¬‚B{]Û#úç£7 aˆ5C@ ¯(Æ•h”„O0´šoXÍ/FJÀ  $zCŽ6ýn0C©µÐ&î'çËž„¡ÊŠ‹Ãœ¥TM¿þ³~Xâsc©þá…˼šï‹¦"0—ð;uY)ƒ¡¤ÈŒÌÖûÒûÒ”IÀK)S)Sý·ÿ篣‹úIS9‰k€¯¼ôJ~UAœtÙuw"üÉŽ ?¤ô'Wœ¾Õ‘þt4å fAÛÛXñ`À5^õkCÙ­³,y;U·É ODÿ³RüÀäùËBÖcÉõÄ~ ЕâBÜ:aS õž%ðGÿyËå§Î˜3÷$¥›d nØPwöç›Ù~6$\¦oßçÊS`Žóº¸ú9éTà/@åRb;ȵ«7òˆž kÏÅו“ºbéœôûÓ^qJ»êFå¿<—^”ﮆb:6él~íE³ ´µsV“ÇΔÍú^Zƒ5y}SǼ¹´®Ò)ébœÓMkÅÁùK—Ev[èÁqë9:héñ–sßç†1¿ýÝ›MO玣3šèÑCG_'Þæ–uûtñdÅey¬N(…-Õ|£bïûi‰¯Sº—޹Fúœ¡§)Æ3žçâ“lXD:­F‚çþ'\“BŽ·õT}ÂuZKOtùöoÎ:qC£â‰B÷¾¼È s£®4kÛÙU«ŽaŸ?rnb[ŠÍõ¾rþÔkOØ1D.é7We¸Äšó;Æ lÆEáÛi¸v®‰§©„›6Ë‹`üv-ò,õÞæÏ‹ž—‹íDºÙ¿Å›~Ê矑W:íù£ñ^×$ug|.z;q×c€×AÝåìÓ£tSÈnÝtÑê1 îN N·jÃOÙþo/ùÎÀ^t3ñ¢iññ"ݶ£\÷ Þ«ã¹ÚßRb߯Ý/fy‡¦ýüÛF±—a·aôÙ·>_xUMÏËṯ/ÿËÒX¼LêAóC!þj}aXïˆîô¶ø/:/=jx¦&\gaר—W´{ÄÉSõoÿã\¯ÖmDó§×Qn™‘ÌhV}ªt/¥”Z@Ñ}šjHÅÎìòâ¸4\F¥Ìå0›ùÚ¹"!C}Ð_dîâu†CB©u°Ý͙˼0MÅe=òµe|D­ÌÏÑ—Ö¢©âõ°|žç×%[MhîÅVd!ëƒb®é$À€e1ÐS0ÑPZO‘@ë°Ÿ`@¶USm·G¬Èi”SÂz´ð²´ÈFg™¬µH5x1‡åÈ!¦’†Ê’*™­µvôä,î½¥Ò`SÝ5Ì™9¸:')+J±2!•ƒËÀ'¥BÊiªJ¯)°·¾ÌÝ‹ïênØ=ˆd©Sñ*(¢ ½·XúKªgt UÛ±N–ž¸jJ^•G;† ËæQ¦1&äBV €‰ ÜØ¿—Fµr. dÂw`@‰aƒó.+¬<™‰è(e%¥¨#( €÷ÿs8ke]Ú2fÙà^k)‡>«§Ñ¦—ýáõ=˜ì#Ù@Àä@k€sI„ p ŸÆ‘*R%ɤå(i½Ã‡>ë·^Ìr~äQLXH&ÉLK‚Æ ÌD™&³,š…"cˆK7‹Lšz?$«Yél©æ–óBß§{/f½)”f¦è¶tÏ™@ô\2À4ôŽD‡¥QcNŠî#Úq "…œp(¢‡*|õê$çhvQbéêÂ>„-— 0zï‰É Qž ÈÀJ‹€OjDŠ*¬Ð]ã®g  !X›DzzÜmœ{׌ÊV@ôS})’H^ÄŠp‹,Ì3³{13@‹¦4’ f³Ï}Ä™ /:J]Û_X‚ ·ÍuÔÈ›ùNêÃÝ`5÷¦Á bFÆf½Œgc…U_™¾t£™%%I^Šy˜˜Íèeçõ%#•‡Œt#C±š$£°…H˜¯Û—bJ‡ËHh(„f4®©»á>2L †'ǰÇ: ëG^DˆÑˆ ‹pDa­ÜU{Ù±Û çå’Ÿ—±ZÏݯ~-:÷SñÂi§• ׿V JÕ‚L¦æ‘(‡H‡úsS&¯^÷»—_ü—ÿæß)óA9n bKþzÝÿp󒇬ۢÝã·Eǧ— e8ѶÈ}å–\1b.c^³œùEŠÿó*„¯@=FOŸcC6¹ ~øV!ÊiðôÕ-‹ÎŽöÚÂô·i€Ñr²‘>ðC¹íoßF†W*ðÕ¹ætßGظ%ûK#àS¥–6†ÅĉK+Þ´™>2»ºÂëü+ Í DèÌý¯EÎ [gÃÆýê¤J=á>ëá\8k¡ëIss|€â<‹ã—TœÑö¼Rÿ¡óWÉýôÈv~J÷y¹ÒÙþ}¹É+ûågÉ´›d¯x‡ óž_ýÄÈí&ÉôCŠúηƒW¶÷¨<ß&ùíò¥z¢ó=‰Y½/©¦/¹">»ýw;¾èÚß}·.Aöø&p¨÷Þ¡?ÜòΕÞÞéÞ{sŸ›|í„x_>šïipøÆ7ë[±†ž¾9õü†žÀ˜×ÿ{öÙv\_‘#×_ zÏXóÎjýw÷ÍFwüÇY¼w%–6pœ¯íxôÑ—Ô9ÜÕzïŠã_·ë\øyaÀ6ð£tü9ó Ôå%0oLÛáè±ñ-ž¹?ÎS†Û /ЉÈ-ø)ž—Áɶäd{Àðwó7tW³SiÆòýçùó!zdÈMðR ͽÔÊâffncÆX­NB*ÅÝŠ¨v˜%8¥’œô©¨göž3Õw“Ëo¿ÏLOЋȖ¥Þ+£ÖIч–O |G¦Ú<÷˜ÛáÐçC[>ÏŸ_áΜƒ 'Df¦¬@&)…“`YÑòd€™ \ʈE¥‚táú ÂÇï^ÌË«2I” Åk.еeªæåõÓ"tVl·ÛÁì‹ÃÚ’»©îvÓ<$˜¹€Z=zšYˆLsd"BC¼s‚0 ‰+a^öŠÚÜz¤s]8ÜÔ‰ÎT ØT_"bžû kÔ:¹×¾tÈÁ$±D\©¥G5—R†ñ¯tÓ0×ÓãüˆÐ:Ü"ÇãÀWÉG!…¶rù‘II)×Ú&ùñlk¯@øè0úªøëè™ G×Z•GóRX3úç•a2Œ‚ÞÇ͈rXs+^R0+,áîmé9'IùZ¬“ÀHq­ªEÇ<Š©‰a^…D( ÉmîY‡SBZå°BHL4“tP ÒŒŒ„ %A¥&!Õi;óB™äR‚%ÿ`Œ\Ó½æÂ¤èæÆ–r€óRˆtŸÙ}ªê‘)•â“/P̳§Ü¼µD¼.ÙZ25´”*Å:„q?>9¥¹÷AÉ‘‰CÒ†'‡"’–ÌH0@Zï’Â}àÍ–R‡1«ÙkdJDJ` "Ñ9çbáR¨–ÕãÍ Ì•¹z5 4_kÚèˆ@hû,‰E(†,𦠑@M£¬ž^ݪï¾ûÓÞ¡p…3ÍŠ[10€²Ï1瘥ipйº=DV¬¬Á›Çé²vöœ¬¹‘ ”–P ¥ÄÜ×+Ò¼•£†ì¨¼’TSe–énô"s±°X±j y=Œ`©csŒbAô ¡ €#€cE‚îˆ@QêñÚFc!¢™Ekm}_o `dGã´âÑÝ÷µ  }†¹qÚù‡)ˆ´—=w»ÝŸü:{ôe6wLËœÜv¿zéÝ"z´XÈW8Ýá½ædŒÚÿ¹õÖ96µ—Ýÿø¿ü/)e¦Nx‰v¢sýàÐã+££5 ¡«êŸmÀ¶~œ'³¼m®â\÷ù.D“Àã9þ¿÷­ïJEè^éõ–s)ùñ¶ââú”qÙp[íqvß^½G yvÌ<#×íN}ýÌú£¬‰¾IÀ&sÆ-qèÇñÖMaÑy•«Å7•×üz$Ä tþ‹–ÿ{ªÙtô2á·aM|å ënk?Á®È/]í@ï/@«‹{›ûrh T³¹kþí«)#™!Áç9³C†Bösø=€êDÍ%E° ‘޶àÕD“¬G†ÒÜ&‘B0;©A£Xž)îl=Â%Dç ø ©-`µa¼@cL¢™GÖúTçLïî*.'Ý–Ö^ÿñ³Wó]UööéÕ?8-»I‚÷®èì¤Ãlš`uH # üà¨ÆÞ†(Ùm–½dP2}Pé]«ƒ²+“Þ©ˆlA JiîZ ˆJaé@1õ„>ATvXΕ‡3¼²•ˆNIJôZC_°ûˆH, Ó¿ùÛ¯Lž±ZÁîS_d;–½ô'¥¸M5SÑýø®DbywRGwƒ™“ÈÞy¬)ׯ8·úŠðz¬ÑmÈX»«½8™BZ!µ–ϔاï}ÝðV­)+«°’ÊŽ$»d4/¤U÷º£+uµC€Ñ"¢cäƒÜ‰YD}ø– ýˆúI„¯Æ¿¹¬tœh›‚ªò' àé’¹ˆ†±<ÖÏ #’t³âI§{ý¸c:Ú踓Ü$LJ}ùÍŸROˆVŠÑ„d—  bfñWº læ=2–ý!Àܦýîü¿ý_·-Ú§ÊÉU-£ØßýŒe ëzcÞô|ÿX”Ò?ììyTöàx~§¾é¹öÈ<ù§þ°’2E&`ºŠ/d‡SÀ¹ù§;ZY°~ø û1e©ßwèü¦%ø›MȳÙò7ß½tÇüˆ¹8ä»bød”ŒáÍ¡éÛLåËÇŠ.ÿúž;QN¤²Mª‘×ÛÓ5sJŒw©£÷ÆKüŠ•Áµû㢀ù¼!Fœ‹ïd`¸©§¼¶mY%½Kñ‡w?ÊæŽÞ6ò +s·ü%ÿèœà½‹!ÛΆK”7$=žtãô>•IW„–›¹µAW\¿Ë Íá¦r#¢iã¼|ûp¸|à}5v‹Ø¸.ßö+J§‹;ujS6J_ò'Ö–7£óÀsœÜZÎ_•FŸ R›Ì1ñjt¤\¬èÒ¸tEÍlšèpþñ˜¸rtÚìb7ðK0Š®æÚý N›1¿ÊÜžoÒS]én±ÝÂþZm?úå ®œµ¨Í8Q,t߯ƒ›úâ‹îÛ-_ë¼ÉÜ,Ÿó<ÔuLwëâ1`Z7-\Ï]ìEWRýéX¥-?îêztÞ}O{#o—Àæ7<*3_·|I—÷r}¼õ¼çÍèácT›ÑãßéŒÁz;2>?¶+å´C\Us‘׳èzÉòÇ9òö·oÖómBâf“|n%ý†Ýî{@ü_T ±-8ÚöŸ‚˜§ØJ^íHø¢+æÅúàåM§Ž`v¿óêC=ºÅφ÷ £Ý»UQ¦ôˆN5YW™€íAôÉ¢¸Øð“.ºV¶«“gÚÞÊŽ<4ëÿÍ_ÿµBîõÇl,_ÿá·jA™–©ø4Y1/ÕŠAZ•`Z©^Š“Özèöê¾JÀÑiðbméI+2WvSf¦(wK©/ ê]Åvµ¡T·ô¾,c×gæ%¤üû¿ðRÍz,ÑËüýëòùíóÒ{S´B0Ð"Ì"‡gešÉ‘L3¤Ì|´P´!:G7³4O¸h(Gan¿Æm5óTæ cG‡»Ñ,½'äRv`1/ûý~·o}UÐéZf•’»ôB/9™SþúM¶«½÷®4+Rww+®¥l³’¨èÉRa%##išê”™Ñ#"I¤Åþ壀¶´ZêPù–Ã⚋ٳI©¯–‘ ¡]Qô!Òa yüóðòűœy BlTæW±¸ÿ‰é©Qµ­M„–4 ]V`ÃE@Prû@®¡ÕÔT\ê¦U>aÚ¿”–|Lÿu‰ì4•Ö—˜j­¥.méK#QͦýÞ:–ÃM¥X ¼Vf‰eé™1<ŠY(Ídˆs´NkŒ@šíL5­‡ TsX¤‘t`Œ &™”‘YH#M,Fs“‰  KË]Ú4y¥ºÃŒ–†LÄÜY‹§}*|™H”ß!“²L–—Öbn ˜sôÑ’’X /àG±5©Ài™™‚§aˆúE¢«µìs²€b›¨2òw£`U¹‘‘R Ê>ýÊ"9™LèF sÂ)Tˆð¢²;@a,˜&èó‘Òl(Boð‚2Á+&CM°À+ÒרË*@1N/–“ùDî¬~€¯{+»¢ÓFzXɱ•ld‚NYP9g‹Ó}^g/‘ël¡†°21b1¦hr# ¿E;`Ú¡î±´5¹EC)Ç®çÈ£”÷€ ^ Íiżz©t#L«·BÖqìÕ0XR’– ð\­ÂÇÓvòÛ Í™VA¿PP'd‘ð„%:àˆhÈ€ “ä!É R42^t¨ø4™U³b…Z3™Ç篭þù¯ ¨»ïDø®Â¨èm^,Á—© ] zŠS¡ØZ³RèÑûÒcéÙzFP¨Sù¯þõ¿ùßüoÿùå ýÈÅáë9xÄ õæÀ}áØ´ÙžÅ‚'¡ÌétQõ¼Šî®#œñ¥á¡QGÝ <õ8̽8:nU°/ ,^Ë|_e¼&m»1·B.`5§ðuƒ’½w78úÿ6Ö±ûŽØÇ­1ÝV1Þª—cAéx‹¯âÏ«bÿGñöƒ1×Õ5n½ò¶ Á+z"G­2ë:A +nl+WˆòÍðÞ€1ÉíX¿YG‚K¤Õ¶%ûªÃööCó>{›nц´uºi¼}òêÆ‹wÞ´Ú\žƒ¸ ßAö߯—ÿƒƒÎ߬ïM£ðùÜ}$a]ð`qÔÝ/|#ÆÒÀñöË{”Ã-÷®ìêÇ/ÏæwÖ5ô°pêÖ¨Ÿ$±÷f_ÎýÀ­ä‹kµM÷|qu:;ÞOÞsoç ¿0C÷¶[ùý±y¤âÚr±HÞaÇ<¼Ž/¢û>J×ߊ|ß qÊ÷]‡®oùVÞÆùyºMa¼çâ¾ åBú>7Ó=Æ1ñDëßJúë¿ôrù@ŸzüNº}2Ýd‘Þº/Û]åÂ2ã™Bý@nÖe"Pwÿéi–ÿs@oȬφçdgr‘‡z°þ¯sFwÒa7‚íª|$ßEÕÑ“ãYéGwCÎדÝZ—ÏÀ{jøí†ËGõ,¯ùÆÔôž½š.rü¢Œ"É{‰7]ï7 êöFóé$ཽánÀéS%T}»ýþ§{ÝžˆÞ÷X¬ñ“—¿<éJ~Vúq¯y5ƒü‚_wß?êð}ðö)Â;YU\¥V7ÿ½Áož£ó×M–ÑËCÚ)_xøÇOË뢔¹ûTÊ~*µÈXJq÷õ¡™™™)sdjŒ‘†0½ˈè43ô×CzÖ €KËL3Šž½ÕioR~>˜%³{võôbãõpøÿÁvVzë¯K‹v诋rÔ„®ín…$å]6öt¥2“Äq.äžp­¡t@X«ÍWÎ5Á\•2ðÕÀs÷bûiŸ‰ÃáPªYµ©ìÙzëÑݼ|°Þ‚dëË|˜Íª{IõºG,²Ó„)ÙèœêdË´h;(Ì­Q¬»RŠÑvËr`²}V?zdÀ ˜±x¥yD¬¶¢Å3bYºµ:ˆH´Öqø4ç„:™ÒJ©nHÐ&A=Z"à;›j]­·œöVê4¿öჄ€´ujùQ[¤#…¥@™ãg­ñCtŠ* d æÈ¥7`€€ ¦”e'AÁŽÕÊÃs8€@Æéñ ùQ—™¯F üL«fÅß·ˆ˜jÖâ/ßíÖçו-C̯K4ÈkêËŽ±ÔRæßFDÒQ€– 5»8ÁŒš B²%Ü R±HzO‰ð‚J·@Df*Å”)‚;{¢‹3¬°¡KÏw…2 -PŒ­“;¦©µ@—™¬ºzdfq³ê‘ZzP‚i™å­ÃaÈ<4[¢ÕŒïª!N3§ºJÊŤ>CƒÛ4¬˜Wq õH¡˜3M™µÚ’ÊY€vtHƒ#PÐD$ÔZ´žIdÊ)º…‰xÁ Z%§iÅÓ¯½@Ã¥Ö©ÑžÃ÷4dß  r¤ÃÆÄ((:àðÊ©¾È^÷ÝDÉH'w@‘“VMTJmݸ7+é%ûgåì^éÅȽi‰²[-æ¢AB¤àGãëHÓhr†(¢Á °C[Î'U+°/k¾U&™™ïºd“»—:Fš›Ê²£g±âî’Ä07H4™HA‘‰ìÃj{³F:L0í¼ˆb^ Ë[\„²‡„ÞQ 1lòK›‘3è°Ze53²°ÖjµD¡WŸ¼ ö“µ”YÙMÓ¯“FÐvVmNEfmá/ðiÑ{fªW¼Ì=[¨÷£G›[¶®HV}ÚïþÉ?ûs(W&N 'Bö¦0ï*y?DåIüˆýHÎ<Õêéyâ‘bwÖ 7ýw×ÐêQÌ{Wsü†êÕ»ë'pcšpSé«Õ›÷g<Ž\ßÑpL@Åò;µ­_¡nL"¾>¼O‰[uû³UO‚ØoÕp–ÈŸ¡ÛùHR¹ï©vr‹|·Ö°¥ç\iâï½Aº)š¼YjÐù{)‡G ñjê,3^»¢Üá~xÀCÛ:¿è—×~§~Ï®WX0‹ŸæÖÞIqýÜé=ïÎÊmz-~gSò—žÖ߃µ §)¦ßI¯ë/¯_^?vF’:Wƒ}Ñ>yÒýÏHÖ?œÝ–Bœ¶ö“oÎP!ÿæ¯þÚK@;Z²’#H7ÚçÿòÛ~X¢Í­Ðj-S娊'2"%Õ{6X@ä®–ˆèKvJpÄÜÝL™«|Õ ô7ÍM¤ZÇáÀZ¸ß!{™u2câókdGÈ æ5ÿÓÿš™Å…ˆŒ˜?b™siB£:B–åÆL"†~œÑIóœ^ ÅjÖƒ¹¼@‰ÞÉ"Ú:`'Òw8À÷}Ý ·ÛÁ-ñ‰%ãÛvÓÁ ,Ó¾xpª»y™i 1B[ QF?™s·„Mì‡D`r‹µ#Õ¢M2+¦Èh™†:9eÑS‰„A™‚„D"ÐK™XK9æR,:÷»—¥Zj>Ä4M总›¹{¦":Y‹ËˆæaøLôÌ>†1é0ÝÅà€Êk?Ö¼9´ÀëÑmSkŒI_g‹ÌÖÃ0*pƒ°VлHÁ«â€~`) cY²Ú•"–U#^Ùëíˆõ~K9Jã31aÞEþðºŒæƒ@¦™„ß}Ìž¯Ëòᥟòs.D{á%•b1´N%£¬²ƒfØE§ˆ%2(ÚiPµT˜ƒqJ½ŽÙÕF̑Ÿr, ‚Ã… ‹0UW´°D1ßïË(ßž¡År÷aÇ–S0-Ñ´tÏàι|:,]‚õè– ˜= (WS·âVS SrG7 e§Ð¤l`‹öŒýØ ¯=ZhW|"æŒL¡ €2Ñ¡(“0u¢…"§ïÖ€¯N´"wЇ“/ab ×WLM"8`P¬à)ŸVþLÙVX÷-è{á£×óÉJQV|ª^ D“$3"²Lês€6M™ÃgwïŤ–h )W‹Œž]¬È'*„@_z ƒ½?ÐU¤²ÇZ¿”XÚ ­utuQö@1‰=“æîUðR'«UJ…`$-•ÙÓJ¡Y­PO­ ’E,á2d0S™ãaR*¬ úzakûŽÖtÍp0n ¹¬í ÃØl]_¶ ÐÀê58†ì “,Ø+ô4ÂÙÍwSÊ —ÂÉZó¢ì€Ù¾²˜kß³û€ÌD) ºïX“te""iÞ¤ù°´”;)-­·¥EëˆL¡NeÚïþÿóÿ”`æ¹;²Ï·RÛR¯ŸÞ Oïÿ$ÍÌF¯Ö”×/¯㦬‰ow]&~Wg¢µÔ:;ÖgÊÏ`À±É÷ü.¯è‘¶þ§Ó·ížÐùŸÕúÝ^ù©·ÃÌòh]e%¼Çn—ų×ýXÛÞQž¸¢ïÔ–½yë7ÆÔ÷d´›”aøJ{9ößï¤Úüð}²œ®CgÏ˾›³YÍéœ9@îT‚nÐ?÷Óa§BÕ›ö¸-DàšWs«Qm;î›An CÄ] ÌÅ_Îô›bÉ“_ÏÃEt2¹w\ׯò= ö†Ép<Õj“n=R:NŸLç\ªxmì~×Wþ†:t[æ½5ÑmâJræyl¼à¯Æ„—†":3UÆ3íh)yÑõhà2¼.8¾¸K×ÏÿÍÛlÌzŸ­ðÓûÜ´žènä÷Œ°³íàЙ‰t¾ž#©ëê-îÖ¦^ÿ“®³?ç€ËBQžœuŸ¼ÿmñý]SúÇ‘Mc£pÃÛáEîåüµ3_I÷6Ìíð="°œ6¡M¡…+ƒé'WšlZçävq3\7iûk—«‡âÏͳéÔæ|/Ô¸÷¶§.8mç ¨Ggºù¢nÐfÛ]öôáÏmë¾vK»h ¼;ÀÝ?x ±:ßÅëGÈCwù¾'€{Þèí,Î55Zk/N˜§BrÜö2¿?æ{O|p¿6ä‡9®o*îÍÚÓ_´eñtŸslžR¯žîx „÷uð¶@ïùïÚTƒm÷ÉëUóôÜöíº›çÞ=}”uÐæò6OºíRËÔßÿÝ¢ÑݗמËk›8H:M­- IrC™ŠWWŸ¶ÌÑ!%…”éÅiÞ–ÖH‚­-£p׋OVdé`Œß!ˆÃaª‚döŒ®yÆüؾXÑ6¶BùÇŸ!°Sª$¤`ÉÄ‚—?—-l'f ÐfÄ/`Å2¯‡u,Âô‚LœÃ[XÇgon\XpÚ´1ǧO¯)üåãÌežKw¸—­GËyn`"±›êáÐêŒ4kÊA¹¡8Ø*Ád¢ƒÁWÈ].F‡Ñ(„ÉMSIg*-dOUqgž©/Æè&R²„;ʰúL ¦Êh&èÃPN£-’(ß9mÈÓeæÜ^+ "˜©(å^Uè„BŽÌ¡ÉáDq5è»t7fæ!Q‰áž[? aÊ`0»DØ.´3N´Yj‘9Ñ%~ꡎ.1f]o’¤ö†Ï]KbIÁÈJ¯Tw«â,¦aK ˆmB#‘à ôµÏÃ^P ” ôuÐfe‚ø`uoöb^“,Sa¹$šq:£ú¾BP™@š›Y/Ù–ù;«ÜF µÓ&234Xù^QÊj[½æ‰± a°t:2€\¹ù…ÿ† @ô¹1šUƒ…(Æ¢Lsg-£¬}„C’ldS,½˜™‘Ù^_IgRªE΄<1ò¹#ÁÖ˜à#å$ oŒ p†@ˆ«ëÇqÇ(ÃZcAØŽNÄ !‡%jÀ ©³˜Ã‹c²Ýˬlx±}-)ä¡;ƒ{·¦ßü“þe¢Z)ž¿ý\~õÁÍè$L„C*U="ó°te2M± é?Ò@/Vw»÷úA÷u¯9?ˆ©“UæÅÿN(GÞsoŸÈ—Çw²Zx͸Žu/ÞüêÀx™.%§‹tþQå¹¢¡êÑíÆwó²ñªÜøëÂÈ'@í+||eK~¾­2t·]7·Ew‹’Ÿɺ“ ÐÅYŽ<å¶OÌÒÔù?:kŸC)4ïs;b‚Lé êi«Kžæá8ŸŽ×3î]÷÷9&àA°½I„lç݉-ª÷'äV°Ì%îævêp#«áú}&Â_ù4Ü4²ŸäFn·¼¦îd’þ@ ó_ä J8Úu÷Psœz>qŸg´ð齑v›¸šHÔýâö.ðR¼Àt:`žùQx¦Ýºjßù«.Nå$Ql«]."¤sNH·?Çwn½ïºþKĘî:hû‡“Çf"^ êüÒQä½í*ÿ>~½w¶ëajì}€»‹ÐöÙ·¿‡3s¯ÛWïªW ®Ñì|ÊÆ0¿ár‰]zû‘s> IO"š{-£ºÞRŽg>\Ø_±—=_ÝÓ©õ;lzѸäÅÝ|4‚·©â‡[áƒtÔý¤o<Þ"«¾1,-[Òñ<Áðñ÷fñò@† =ö;{N¦_œ‹ÇUÚæŒþƒ¿ùë¿¶Ri–Ê×ß¾æËá‚æ£D,h£WwÈ(^Ükñê^+Íh}Ÿ’Æ¥e¦[­î½ÇÀed‹2™¹G‹D“b~}Pwûuì¡¥iªL(Œ²y6ƒ—P@£ôõóoÍM½S&Ò‚Ú¡gŸÑ—œ) "m|ÒLE‰‚˜Â(:‡{Ž¿˜+kÝ:À*àk ýðäáú#=Ô ¥Â *ÈÈyéŧýŸ_^l¿sÈÌ&hô"¨îJà˜•ˆÈ:•}©=’Wß%%µF2"ÏRˆDo]Y(e ø´ô¥8’†Æ¹gë¢#•ûºsæ¼Ì2§Y1€”mn$Ìm9Ì»‰µØpÓ,fÓ¾FŸç9vÓdÑ¢Í)4e‚pB)d¢8è8ÕDËP*òH3g"†åéðé=UU |?’èD‘ûA™ „ÑÑ»µÂ«¢ÀÇ ÌrFu¸­~¤s‡ú ,°æ¶;1óç%™_ö/˜~øí\w•]Ó‡iimi!5wo‡8ä,*è9 îšsG5(ƒh2Pš;,XH31¡„Er"&9•¥3;J¢-TiÕìˆ2ÃÞyPƱò(Mf™s@Ü‘¡jp¢€¥È‹‰Ž\ B©gïá>gO‹ ½ö4øi¦9¢=`hÃö/; \1Ì–u‡`,$å¸`UÚê·ÚÃ×’Š. W~îŒH¤n4XG6Œ!Žn¢B hL& ñÚs¬{ø´æ«Ã 6z× 4¤!E/"‘pBoX3'„UÈà^àaL‘¶sÖYö„Ù‹•·â…VÁ5xÔ„¨Ñj ™;Y!#›´D2{ k-;"…W¨!ÅB“R1ü¬G„š‰Þ@®?l5 vA#itŠI:h0‰â‘¤—êÓ^) ^öèÆRóbvlg2šaKFdt’´Œ0~ZMh`À µB ‚@‡”PÀd ø„éT޳ c½*‰Îh#LA¸«q¤HRR­”ç®Ö}`MŸþé?c(?ÊwöS¾LYû"•=¢/Ën_X«ÁÂFÿ’/™™Rd_ õžÙ{ ëŸJÝOÿÍ¿þW4ß*}'±þªèŽ—FQo†ÆzÙ\I~¤ë»2üû€*LjÛƒ·•“¼Hlè^Yäæ^ðçÚÓ‹>™®ÿýk¯äkÂÍ'Ôï ›ÀÍ㊕²)n:j_Á–ywÏM§<·ÐÖ€[ÿ‰^Á…}ÄCÓ¯G—qÓߥØ?¿}§ ãtÆ<POþ|¨>l4­§Ëíº¦ûÖ9ðîÈür8;×êÑ|ýªÅp~Š‚ï=>Ë#B_tdæúßiÏÕåý‚úåõËë—×µdþ{„Â/`ª_^¿¼~yýœ^v|+.‚©ü¹mõ›ÌÁ¹À`ëþàïþöoéÕ¼(ûá¿|nŸJeKÆpƒœ?êór7+Õk±â^4*CÊIµzñÒ"O§¬Añb¤eÔ¡ÍeT΃K[–Ïôîµ0f-‹eÒäÅl*]¨B,Ñ[«/S-ŸÿÁÜÔ3ZFJ€™úëÒ‡~˜—C3…AH²¥25­¬´¦ÌµpÀ¸ Và°¯ˆ@6D¬š²Pɉ•‚JD TÈ@G J˜[ 'sI”Š{ïI‰TW¯^¢Ñ¥øÒz¾L;eµŒð¶ô8(2‹—L˜z[T͈â æÏ=^ÐædÙ•ež#{ôBXd¶ ¼¸z|úÇO4£ÁÌSÉà0ŒH73³âõ XZD åÒáFo-½fÇaùŒÞMv4Ì$e‰Áài³•ø/ ·±L"íh‡8h6C©¢ˆu÷B]^G2™'L9$,0;©Á›0:;VÆz iMϬ@•ƒ–ƒcSa&¬Øn7ÅÒ£+{F|®¥L» N3R²—ÝË®ff¶hr”Z²ÇÒÚa ³ðT–ÎŒ(†–¨¦Lì ÅÐ$|IV°#M:HŠœ; …{ÙNˆA¦~†f)´b%”¢Á]ð$¨DK„¸«E$„jQ5zÜjˆ/ȳB ÓJ©…0 Sâƒ8SG&˜œ€= L8ÿĸOE,n¯&ÙÕ–YÝJd:GæF@2%™ÑÝt%BB\Ãú €´ÂvЧ.€VäE£Šß|µCp—ˆ4Ǹ"¥2!";Z[õΑܣ¯ô¥š—ʲJ´ÌëÐh{›jÎÝJ‘[©^!2w–‚µ¥Û–v²˜ì™D1¢0`–ÊH-°š}!½åHGä±8¥Ã Hä²êûÀZé¿îÇGò€ø+@Ü Ãó6M†>”¨ ¹™ÃàNèTËlMhŸar‡›±@Ù‘©hV[qC̵½öχ:yæÉÌ>îòÓ'™—iâ¾L©œ#=çC§ïŸK13³8•Zæež_Õ–ø¼d,Ì®Œä™gtø˜”9ÚõŽcö¢î€C¡KàXSlƒ4zÈ@YqóC€;`(æW”Š2YáÔ´d¦ÑôˆZJ¡f¥¬„4/AÊáR 4/‹¡ès(\^ë>}‰‚RŠæŠýw˜>Ø?üÔPwµÅB03 Wš™¹aÈ`»º‹Œén^X Ív¤Ï‡YF§‘Œ ϲ©½~~•ÌÌL“¤~ ªÕj‰†”ÿöþ½I¶$ÙîÃÖrØ;ëœî¾Ã ƒd”‚D4™$#øý¿…^fHˆFb.0÷ÎéS•¹#Ü—þˆ™;ŸUçt÷¼05m=ÕUY™ûÛc¹ûoE×°XZ'5 CC‡eÁ©9`pƾ™åHà± ¡ÓD‘4!Á8  %Ð"&ÄI.¬®Ñ×n+&k“†° ®0$rb÷lû^çéÓŒ·/oî^wuš‹¹A˜çÚ[ËÒr/€^÷mžª²‘Tf?ÁFi<2MH¯T I¢IÐTœ TY—O‘KçD½Iql7ìÄW )'“ÓîZ: ¶Pœ˜ ºÖ²B¥°R-Õdè5 f—{a){Æ2,`{—‰&Fh•àÁ2 ;"ûP§vfŒ.ÁÀI,4 Õý t¢gs˜ÓodfP9Vx#L’*Ø‘Ò éX¥¹ *UŠ@š‰†Á˜rÊ2¡@KHk¥|)i˜Á«ÓŠÕà”ËUÕ—O’)Mi¤—Ý$ÑÜiU48IÒH7Ò4 ïz(™HôÞ—­Ëh^8¢£ïµ4¤Y¬ÖyÖÛï‰BÏ!§Â*²¯®Å£1ÀŽ uŒ>\½(R0Çn 9bÍ4ÙaEÓn—#V*ÈÈ UH:SL©ƒ•BØD#¤ˆ\¬‰F/´âŠ®”Ž>%ë?¹¦d¬ Ĺ „€¡Løü+8ÖéSFêÎACï&ÔⵘÕ4³‚’ŠH“,Iäuiú>ÝñOþKs›´D¨”œþ鯺•ÞÕ÷û—yŽâ>™•— „y@! ç%{ï}‰ŒPJ šÙä4ÿgÿÕÿñåeþüé…ä4MÅfã™5¾ðÁ†Cn¶J7ñ-/·Àeç7yÇLà¶J×e°W êçJÖ±™õÌzªûàÊGÛY=‹Ot/®úy Zù1W°­ÆõÄ‘øA¤¤»'ÿ æø¬Ï_Åc×EèÏö‚³i ½:¬Åðé¥xù„!©ÓüÔ {ì èÛ%¯ŒÞë {ß¿ö‰‹ø“„÷üh/„$IïÔ©Qƒ¤žÞ˜‹ã/:¯»Ù¬G«Ä¶6ÿöæ®o{ìûxÒ ÜôKlÈкMq$\ñÁYlY=wGì•c{›ÞÛq_ß—#Æ[l9xw ÿ¨ëúãÈóÔ~°B–;›EÝQ7·vl—6ûós”¦‚p'¡SÎA7‚ìøÊ%~úu£«êÁÚ~%‘¯þiÈ_BŤKáè¤ÿëÆGŽòçdó„ÐÃC;³¶u^³îñõÏÚØiÿN< ,®/ŽîfkŽÍûÛ«¸ÄïpFî=Koï'ÞOŸLnõÖãg µ‘`OñÁÕ¶ˆwØöu?}Ç[eø™X««„Ôv˜óN$Ò;ÌGÏT^ü#ÓŠwR×ù;‚»îAö/SF·þTJzç7·õ¼h<%èßiP=Þë5Œç±WñZsçµ§Ãfèþ³è"0ÓK­‹óN.ò"7 Þ<{Ö´”nO‘6ôx:¡B²¾*©Àís”ç€ûUyÑ=}/ìx’íÑMè¿]äV‚æv…Þ@o•dž×Š›T§$¶/.Ô)ëÉûé·­bºÙNm»»Kµî°˜î,¥OˆÛ+q¡Ç…Æe”ùpsº#|cã*«dìÝpGߌ{ ©íÞþæö·zÚ—¿üÊ-⇮ù£ØëbgÇ¿ï+¤ÿ»;ÀwZ¤ovQÇõnÃÌ=yþ\¥7{’ñóÿôw¿ÒòzöqèC(Dše§+ææBJ'vûàb»A23´˜™WfÏ4²–¢Þß–¾û4Gï^JBÕçXö­-ÙêfuïmáÀ©´ƒí&SFôbi^Ì@Oa9`éu¦$´ž´Þ»ÚÒ÷û|Û3ÞòmÉÞ–}Ëž“É Œê6åQº¢ &å …@ 9HÄ‚ÌÕ½vu á¨Ç…;0à? fðiµÄ¤f€¹.¢Ñ3µDK»yäÒ–ýÛ"…UUFÅ êLeÒX†œ6•Ú»¢ MŒn4ÏŒ:ûÛo—ý—t: Z_¤ŒH%¦])•‡}Sæ(\Ûó<Á"R‘Ý bF[œ¦i7M=‡ý1­p·›” !Ú0†!£yëØM®Ñ»&þÇ ›#X<•²®±à(ÓæªÞf"I0¥„ ÅÜ@‹d€Ãª 7kêêï›H@Tö.4c*ŒF æš:Ù¡cv§kû-Âa¥ddô”òðv0M3‹Õý²´Þ‹—eY^£#1³"ºgY›@¡w#,S“I¢ ™Ä®´DËœ¤›8¹f3S†¡uT H]R•„XœÃ]JÓ Â.KÑ fGʆØZLK$À.õ€z/‚LÅ­Ê”Ø÷hÊ †…@ ÝЄ9ñF5ÒL’æÄ"•1œ.ü9°ÜŸÈ$K¤Q*Д4º­Ú¢Ò’È€Ac=9‘#‹ÖÄÖåD‚î2Ê )XO‡U°¯‹ªÑq¬Ç„ut ÜhE^çá@áåS_"Es‡LæôZJL ³KI22‹MæFš—º>ªŽsÐ<­¤,hÅLuvi‰~hK‡Ò|¶I=~”"Ûad“*…ƒyÜ" EG{ê1&û~M˜™¡:è° `™%ï½—ÝK™gÉFê±4¥Î ÒÔ¯D˜£±*£î Õ©³²+R)­LXëážZ)ؘãXG„Ð¥€…(rfÐ×mK&”™±È mró:€\²G-ÅõÞ’S”4ó²û›&!Ó~øœ=èÆZ$ uÎ}h –´ïv¹ô,Å&·Z#ˆÙˆ¾ì{–èIŦ—yþáÓ?ýßý¦â/µZŸëäæG«_žd¡-Kòþ–%º³ß=‰Aºšl£–Çñ Ÿ(à wΔp]茫Š|’óxíÞÆëMðiø‚tyX'_ÿ¾+/ÞÕÚž ‘Wh™÷^LÜg§ÜEÿëVþ;…V§;®;{'cèsá%)’WÜ üokz¶êù#½x³/ãõX=Nƒ«·ƒ£«{f–wG©nÈBwï).)—wdŒKîù¨ÙH"˜Eº»7ãSåûî4¸œª| ¯óh“pÚfÜ"þ¯¦ÿ_*tžW(à*Ô½ÔÂ¥vü|gt¥&CJÁŒ ¹»[™ªÏµÔ"ÈÌG9‡™È2#zrèB™2S„²”¥ÌÌ¥+ãph–Y¼ ãm¿o˂׷Òæ]ñ¨µ~šÐe´l¿{3t–:úÓ_÷ƈùóÌ×/ÓT1cŸq ÷å°¼}‰·×¾?dk½w¦üÈšžàªB Ø œR`juúõ¹èîЖµúÕ †À͵ÄfEdhÐ`†¾ÀËú€ïÜ#V3‹Èˆ–JšU7¤ …0¤ä©LsƒØ{8jJ¤Þö&J)»]1Gî5ïJ@èíǃÝ ¦„`ÌéÅ‘¡µªÜX§ ¡G¦rÔĆ:$eRÌÀnž§]] v»*ÐÌùözˆè$ܪ è½TÇD”±Ñî‚,×ÒûQGï¦è¹µTÒûòû7µNíuy;zK³Œ®â†ÔÎ9uÏê‡ÖÒÀÌBôÀ!a`„Ê€¾ˆTƒ“aÙLª$­:}‘£aµÎp{HÂ8ì$HÊ=mh˜£ÝDêÒ”lÁpÑ@"Ä} CšŠ2’n*´JûqI49ÂÌMœOå@/Ä‹œ @i‚¾“g¿Ïn ÉOÆá„Ê‘ßiÌÈ!¯¢ Ú÷Ñtž¤itÐ5 ø%©Ý@®º³¥iüq0›p´(ÉDïˆ e‚˜¯3Îk±i6sÖ½Î>í¢Ë§Ýî‡zï­-¢GK@e*æ+æ.P0s#éîã€cM ¦I}‘¤ZÇB¯\¢+‚ì`˜MN.ŽÉlM8g¤Ød†ÔQýsíÈêSwœ¶j‘PŸŒe2«¢9˜­µ2}b¥{IeÙ}ª»ÒÛÒsQ’ôÑAD7g¶®Þa"Â$õ™vd%!u² ˆŽ¡À¯µÿð‚bð‘3$ va3åfEEî1U«sñÉܲƒ,ªf]»—ÙZ~÷YíW¿ò'lòiªÿäoúï_'¦ZÀINQsY(`´fóLgH2FCDö–yh±´ÈPªÿóÿî¿ý'ÿåÿ^½¿½½!2Aš±/nfÇK,ýEluSƯWä¿9Þ7æúsÉ~î=—¾1ûšmÖ›!žŠ'j¢×{'y÷€?ظ:÷z÷b>®¯ºÉÍüÅBçÿÇpöŒ|Öúð¸,ìÑaä\N_•}´¾Ü[›è%ÖÞ£1½Ë×j¦üÀZ¦Mé?;ªëv±¹g;sçÝoÜßùÜ”fÛgpaÓ6½a¬Í¥‚ÂwŸ?y¹â¹¼ðf…Ñ7K8úÚ?ÛüÁM㔾íÎ ç™Ëí á×é­ÏÈBwºo>rƒ´í‹Ñ»Óˆ×'ï¹ ëÖÿúXc¯ÙÏHŸë:x\ºù\µÇ}l5àùÔ7vB:þ­»÷ò£#éçòs¿jthTÑ_ô^ÝœÌåM=Y Ž?½áú< –žÿ^lŽäò |ÈÆkMMßtþn}™xs,º:‡g3î+ìËÏWô¢[ቋ驃 {éõëª4Ià{Çu§×ïÉsövþž—ÓsMœ[¾9Ò׃1sj-»·:=ë@º³Ž>qIºîw[ñr|Ìgi[B6ŠÂx6‘e/WmUOÖÍw¾6LÜÌ{}ÓBò¾ó.{Bov#z¸1ØôâCîÓ½*­'—é'îä7–†Ð½{Ÿýþ”_Þ¢EZ´aææN7¯Å Cý7wIæ&’ =)û’ÉÌ€ÒäN™Q R©ˆèÊZ@™Êd3ˆåm¿´Å[KŠ!*I±°z[–Ø0¥EX-˜§ž²Ã:,Ñ–:Ñ×ÒÚ²¨·¶ß÷ý¾½½é°W[ p˜RLdX<5‚á󱎗àCC©•á³²ÈG}q€èHŽâ0«Eä Ì“¨;ÄåÙÛ–DÙÙ~Ÿ"¦)—¶hðDV(!»ïª¹¿½.‘1;™V«÷Èx‹âõÓTé„)z{ë½-I}š\+–ÑãpXÌÌÝæiî­÷ÞÕZ3‘LsF‡¥ø(³—˜™©œvuþ¥ „& ^WÓÝÖ§h[*¾ý¤W ½dr鸓^¬?a3~ómëÛ®É?Hð‚M«GÅçÌÍ6Ú¿WtÿÁ¸ñAŒz¾È_Q·wÌ™_ÊUwɶÒüj³v{<Û†Œ«a|$—l?‡W/ØËæ¶ÍK x5Ñ7èqÜNØòfâžÄÿ̤÷žÐühFÿ¹@çù?ù†9x­kàh7¸vmtÉ Ï3l<·Ûö‡¼ç‘ã· 7'"ä=»ìËÜ~Ö¥®r^£íèør1ŠVŽû¦Sdsc_Z°±¨»N6Ý]yùPZÓ½–]ð~6pÞOW½Çý¦+?غ®Ï'Áè¨Ý…„_q·¯]nÆËùxO.öe²™îîëoÄN}H»½·ýç%+èÒ`›¥áõ±êæ¡wãÁ»lñÛ1tWäñYuL:‘csÓy/Â;,¨kâ?o³SwiBܨöä;é—“œ8þwࢠýøú´5ÈÌUI>ÎÒñV|å€çlx^Ï”G]¹?`µ þκ­Þ.|wÍÖÖG‚7ñvZl¹:X¡P'@Ü:E…[î—Î\«-E—©’³X¦§&Ú.YÚ¬@ÛYÝú\[£7<.¬âȉ—“ÿ­E›em³["ÓS¥ÿÎcìŒ0åe6císÌÌ«pbÝL­GË÷âáqŽ·IG\ÿvQ}ðè ©½Œk ú.s‘w=,xžôÿ‘ x¾œòtVmïóMHº¹FÛ§ž÷B®Ïµ;½½+.é&ã·™ã>mø©z7r=`xŽmîÆ¼“­Ð9Eølë{7`å{üœoN4?™ w#«_mÄ{Ì—kèå~l»ùyw›÷~Mß x“-ßh7¹eã©C™Äßýú×ã,¾üöÇl=z*C´Zݼ”ZXœnV¼”2þ~õ96Fïу6Î2­¸¤ázl™J ·E!–’)DôHz,=°,/6M†bPw5¿–Wöæ°ÖºúÒ{ﮜw3 ý,@wƒ}é™Ê}kmÏhûø²¼½©Ô:¾jºŒA†9aÅÇÖBuÔÇø "BÇ@‚° ^AC_ƒÍhÀ ¸z@Kš¡8œ@ vdysßDFÖ nÈž €f&/0/èhVª[À`VÕŒÅ̤°Z–}f¦Šy™ÝÜ‹áaà›!”‚R陑ìu¶Œßx•¨ˆ€TÝ‹À¥µžh*eÙ¿Y¡Oî¶Ë΀ä±{)ûÂnc×ks™ÙYèÕÔXˆÌq¹PV›ßR€Að&8,”ÑDæz}Æörü>GÍ=ru’ ؉ÑÑB Ýíì1¢ rÀ¡FJ`…üäQP®(s3(±Îw€›MÓ´Ï%3,áuÊ óË\Ìß^Û—×üƒ%æR³‡ô×f]¤±ð°#å©’Ö ãÎ, ¬ÎZ…âÚqÈ@ A¥™#E=R¹ÂjaKì;í2áÀ!ÄäTàUfê}Œ,£_2ÞZ899.pß” se"öÙGé;ðJ„HP¢!¨dvãŽdÐiÈȤÿÆ|;Ù” -‰J8)æÞ©‡’S…%M!ÑÍ)´H™"8Œî¢!EÍe#ª´Õ,©ìÈ‘DÂ) ÎÉ=‚°ù%3{k43¯àŒZ&Á¬ã€F‰æVÝŒ™&™Y)¥Â ÝÎB è0 J³$è“]l}ßJ s{]‚óª ˆÃŠ]#‚²ZgA‡€\0º% D?Ú#W? &Üá†v€™DzZ¡dI€t BÕ¢­; öaI25zL²4*h0!-e#ñ€£ñõèº=O{`‘È=ÔÁ9|MV„ÖÙ´üyb-Ð@Ò1×RæyšÊ§—úÝ=K‹V§C)ªeúô½mWã÷8øR‰/ûÖ—€jf-”›eº™}*Ñ»ô2Gf(¥ÞCm‰‘¥î=ü³ù_ÏŸ?íþæ; !fDDŸJ Ï©ÛG3µQ*tÅÇ»Gt¹à~nwõp¿U<ï– êò¹ŸÓ†þz¬ù¸üÉý`æ¼ÕÞ/¶q¼—lx7FúªèkóÙ[ÌçÕÍÑM@¯êøÖÎU’äáżªx…|H‰Þx[‹€ bþkSM·é¥<ç´;ØêR¼ÙIiSÆrµ‹¹ØÍµ0]—rñ¬å]nÖ><RÔ¨OÐY‹÷VˆãŸÖð « >Ü€›¡øä9uýÒ_ô´&òVhºBÝ}ÈLõyÉåý€g dzԟ>œwzø!RÚŸã—~á×ü1ðÿwÁyi”ñPÃüÀ1é½ „Ÿá‚êŽ.Dþ÷îñ©égºÍ؈Â׉„ÉdÏŸ%ïÏ•,ÿó]îw¼wK/ÕøŸoho!•8×ó_—°¬–|s¯™,ê—Åé£3÷ôn !~rÀýGÉÃçÑ×yÜ-XãÓ8ég|ú üº óÇ'ä<Ý{¿³ò|ýÆìQÀ£¶€oéàÞ¢zï. 7ý¿þßþ7€t~÷¥õ!–š×R¦bµz)VÜÜhk…áZÓA[ÊñԨ܅0 ÚµDH%#ÌEâ~O%š¢·2OÙ¤E?¶Ì°Ï/ÈD©þñ7¿û®÷R†VªÝËl&DdÏýë‚ò¼î±–/o}CÙ• ‰"͆˜HÓJ&éãóËÇW"Çx0ZÁjÓÙ`¥Âg” ‡ßë0Á`é¶úµcR«HÁ´{2-•æëÚ’aÊŒR¼/j ¸MÕJ¦2¡ˆžãÂyoé¦õ&ÉüØ@GX©RX–Fæ4Õé…Ñã÷ÿ‘˜g¯ƒ­xa‰èŒˆL”áÝI¸{öC­¥B3=²: fïh{‘ª//fÞKâàŽâRï3ÁÒ§Õ-y] >Šó…Ãè¯0_½2W7Ôµ d¤ò«|ɂј³°êÀœdŸdB6ˆ.Lrø¥®|’„yªýÏÕðÙŒ½):¼Þ‘lú!MÍÄŒŽZÆý‚’êx{[ö¯­ÒêË&+þùÓ¼ìa­î™µ²# ša?¶ì†ï£Û%[õ Æ"™{afNTß+Å.¥kè|;°Å(x—jaŠÕƒ&‡` „˜Êݤ”¬ä"¤H)• ”—c²/‡ä^ªs6fÇ’"°ü²3ð™¨nHŠƒÎdPfJ]ÜwÆ·è¯-wfS¡"^ƒÕé4(µöÏpd}Rdrd2’$°ôÔwÙxà:€a»{$'i0¬ ÿ34ÒEQ'”˜ãŸJ8‹N•žðL„@w/^Êêš™Ì8‘•Òl®eÞÑÊ(½*“+”ÙXÃzï Ë‘],R&kýôý§\–Ì= F!½©w) Á¥E¤°*&4˜N},È$5 F¤ŸáA’|®dݦ¹˜‡:ò"çÚ" n/–.#!Ž® =[G(&0Ñ:Œ}3‰fŽÞ@v `+2ÁËÊ7S ¬Xu"-Óé“×—RwsÁÄðE3ùw»·žeWLŸ(¥ô/‡D¯Å4¿äë›oûÐô2à_s÷2}ÿ™j¡jM 1¢Òÿžj‡Þ—Þ£;iÕ_~øîû¿ýU[Úú„3£™Oµ ÚPÿO5 ›g ~ž]ȇžÈWþ±?Wü£»þ‚~ÛëͲp§¤ïR´ùÄl7½²ü9Ê<þpšÉ¦à£ãj•þqR ßí¸_nò5»¼Ÿ5¿”ÚŸwâ~ ]?ý€®¥Ô÷%šû=ëAÐùèà_×pÂýGÝmVæ»j|Èïí±¤ÿuÉ×òõ ÇãQ}A£K Î{ö¾‚FÜ m–ÚUº9»Á®ð”¯>7=ž·úîàÌ—ùzËG—)á[ßý½4Ê]Óâb~½¢úá#ûÀÓíœ}`þº<ÂC€ø©ýå[ç›~úÂr5U.kî¯OT¿LÞå— lÖïµ@Ü9·wã¼þcWNÕè÷ò ÆÓÍ«x[~ÏÍàܶö$KüsæUÖÈëÒÄù^€_yŸus"×’õíÓ»o}yøü¿jòëgˆ¿aE|Pþ¬Ë/·íAñR§Š þœ“ÿëã°w>¿DT÷î{ÞVý$À‡¶&zWeá=6¼:½rHÿfèõ·¿oû¥·ˆž¥º×RçjSõZÍhnN“‘‰cí©)2ª-IyT9E…CkÅ^Ä£GL»¢ž¡Ã¡~žÞš{Û—Ì·ý‘Ÿvõå¥.P.¿{p8´Œl-1$èË—Ãþ÷o‡÷lK.‹rÉìL@Šm¸µ!Lá,›žF":èG@4 /0[×øô¦Hì Ê %j­ÅŠ–ƒ2ÍL™Cùì 2Öþ€Z é­50ƒån®™z{ëË[î>¹Û>ÓR:LÓLà°dñâžîJõ¢Rä§8ôþÖBAÎ×l³aÑÕLÅP&¤ ³Ñ:Í; Ôß´0ýCÊÌ s^Œ‘eÏ7! T§[ÂB0j­Z¶õ1¼äȺ¹”-à†®uöùp &”DШ޳Š›!-Ñ&‡‹û¾Öö½ÛJú¢dr2L`¬¬b1Âø–]3m²Ò0î̇|ÝGá4³Î.\üjM}èø„Ù¨Û‡9J( |Q?þV ­ø¦ìZGH n(;Ô²uÌLæÁw/ôšðB·âfF:‡urë0c©F“Ül²ê4¬”Ù¼ l·’)£Õ:e_Fo“‹ ã&dä¤L¦è–ÃÉ™ƒBUXå`oÙºbícP 0ƒìì•SLᲃœjÒÄJ+j¡—y·Ì.u`"”c¦A½50Í:r`§Ñ 9‘äêw=°ZÙWŘ=àHÇRÚÚÕœ:³KO‰dã:µ×œÍ:Í ·žNUŽ´æä˜¦þ»7x±OÕ@}*óTL;7c-9‡ïvªS̶›w"Qìp«F̱_ÊTI;,.½|šaµ“=Ñ[öÑbi="Iz-ÿ§õ¯¾ÿÛ_‘œæé˜¡¶i·syÖ¯Âϲ¹ÒÇÃíÛ§ÿÏë¿ROîÅí xÏ6-:¡$¾Eþ9¨ßúSý¿ ¿¾6æ¼êø¶ù˜?ó¡3âŸFŽåVj'ð¨P·i+ýôXƒøü©û…¿Tèü£7ùxà\nöU6ãØ)_¶ ã!ü穊Í÷ú0.§ØeXÐm¦äîæwm :zS_Qgϧp·ân`ÔœJ[sðÍ_]€ÎM«z¥ж'Î׃eç†ùòζžç.ö•“py«/€k§&—;Zζ¬õòôtfH]r6#àâ3t%b]Ž)] b´m¹Y‰Ê'H‰¶p$«lû÷¯ò-¼Ê´ð½æ.Ñæú'[¯ƒS/ÔmƒÔI¯¼£°kÛ]t"‰\w'ñél½U™Žä¨•Žq‘à¥x£ òÄ â †€›í¢eìF‰áæ»èÕÝÇËiu‘ XkÙNÿ»ŒfÞíÛÅB¸ ÝYëÏô–«Ì؉†vš‡fØ`зV›é| Ÿ† WX¨MÓ–î̵›B7ku;ž\"áš?ÂÓ‹2ñ<‰ÛEGá•c*ït+­÷Uºi¸àÌ\"^x1^OG*é#ÕåxÚR&DärÑÀP: €ÕqL¹õ€2d_˜q6Ö½åØ@0®9‚R³ºÎÐLÐhÅÌ‹g±2™Íþ«ï JNÅsYŠÙë2Wrž­Ìñ¶Ô—ï#¥C,û/|™Y“×ù3Ð?U°î¦îUÅ—ý¡Xá‹¥›€¶ôÖZ;¬ê?/ŧòÏÿÛÿîóßþ0PfÃ+BmYê<ƒÒ…A•.PÀÇö´á>G;ë?ÁÐwpðB»0Ÿ-bâ§ä.L€/Ûo±„§°Äób¿£+œï]|å“iK„ƒ/ùfÓsÛNýyý>:˜-Vˆ× kêf;º9þ‹¬ÍãÂBÝjGUÒ{7ú©à±õÔó¨øNdˆ‹@þ6¼ÄíÆäR^ÐÍÒMœýˆfyõýó"å[¾ÿøÆŒ7—î¤ !OçxQ›v™DÑ¥Úu3ªySy{´¼K.L×8'^#jÿs€ÎŸ¶0Gýn’à/ ]^·ó·Ûeøxzö‰ÏÒ_Ã»í¸¸S?wMßY—¸ÌÛ½ÿD8¡ü¯ çnñô´º —wÿk‰ w’+ïtÜ×FôÑÒ½g™É÷»~BžóG²þ¿lÀ} û'$ܱí¸÷¨ü¹ýÛ/?t»/Ê翵üôëþ’Ùßv‹~¶€“EΙà·ÑE.é‹?¥à‚?yoäþ„»õ> lCÉ<‹oìà<¯Üø`Àýmµ¼|$¿³&êC³íîÕºˆCvèñBzÝðK|=rRúŠ×ÿÂ_|nýs-Ï;žNòÛïÃ…lø#]ö÷ü.àîñ•µ:¦à/²`J ?ÀñS³Ó<ûÍßýÇ\1ôöû×Ã~ÉêTlªuª>+N3Q€èÅd€hìJÈõ!{0‚ÆPÊ®Œ¾J,™¹ÈçR Z–%z%=º¼0»±ÿ‡ku«uªS-û¿ûÍ=Úþ­9iÙ‡! °ÞÚëb½/û½Ú!—¦ždBRB”q%\c³^ÎÛ±ŽeȰya—ºòFh+»í±ûÁb&ªð$ÜѬe(Ü«{m}9´e<ªw‡µÈ$Q¼ƒ;ÒÓš:—ÌXgWŠ9¼ïÅ Ÿ¶C+”4Oç! -\Qªe·Œ$4vÀiI³R…#y¨GZqZ*“4Ü‹”{9–8è «T[: ”ZŠJWaHdàðÖ#²Tš9i‡CÐc·«K´åDÂQ = î(^}íÈ4äç°³ ÚуwÜ&G&à(†LôJEJq€…aJu¢¯Ù¬a»J“¤ˆXEm­ö@ëÐú+A!5’?ÈåÌV‹G!*¤¥åí@bÞÍËá )%E¾}yËLƒG­} ’FvbtÒa|¸ãÄT˜–ê ñ©3ÑUzÉ×Eù£lQ/rpß¹4Õ"³Ü/Þ;ºÉ]°L=3 ÉI2EeeéÉ ²Y =UÌBB¤ö™>G¡„9a€ ‘êÌBfËÅ ÉN~2› )í¥Jo ™f±JMNΨÑ%*#ˆÀÒ²V6¡Gfæ[BÃÚ ƒ¤ù0½ˆH¦˜ÄàTE2õ6n‚ˆDèhVškØE/0¢`$‚ô;˜ÆÙK]‡”•á\aÅA£¤bØA4+¶û~—iqèð¤A‹ŒžèÃÙÌhpKc¤'£g6©Ë%ÊÜÏÞ-3}ý@ P'dC߯#Gþþép!²u¦æ0G±ìÑò•^IÒ’ Ô5Ƭê@oË+úa´Ë ƒ VÎ&½fˆ\²£™hÔŠÞ€rÅúäOÅ\uêçV†Sq†;i^¦2÷ê/;tV/“×h`-}v½ •þÝ1}7ë7¿g!~÷¶3uóEÙömù>4ÕjÓÎrXùìæ!EäT(-={kííÐ3Á«—Ýü/ÿ¯ÿ·á ,¤íÌH÷wÂÍF÷—‹ ô‡æÜTz(Þ|^%,lv8O‹ýõž_Ô>þeîàOÝtíø)åÿøvÜ2ßïÚ\ÿô¸úRâÔEnæBUü »‹Óù=-!âiõ_6tþã¦Ç¿tÀ·À¿îØ~…ý«çË¥áóóÜÒݯṙ~ëDýéм§FŽ?BÊ?uÿ¨#dežÍ¯~ÊGã™ÿëÕ÷ïúoÿò‘?zÊø;¯Ÿ8ø@Éúš3¹Ou»vÛÉüªä'Mj>ýlüI o»«ºŒ·¿Á%ä¢8ägT…'žè_¥˜¾Ÿ8¹ëüº§Üѽñì‹.š.~©Aõ¤Då=€Ý1é½):'zð ¼øCˆ?12êݬç-œé«ú¤÷è‡hü¹v¼Û²©Û-ÓÇ­´íN:Ö¯×íɧÓßÿæ7'4qhÙ»†Ag-VݦÊRÌÍ ¡ˆÒ2œìCØ¥™!0öÖス%@ŠfÙò°ì«[œJµ>¿L‰¬Ñðöš€J©»Â©¾õ´žÕøéûÏ¢ÿá?-­÷ŒßÿæwÊ,†jê‘P(¢/­–ÃÛ¡²[,} W&WÅÕ ÅΆã0I_[ó¤‚AƒO+C\†1B4 Ã+)™ ±À*DÔi¬~¦ð},Åét¥z Ödq˜ ]¸³ V[¬Åi8,ôƒ_Z´ÖLÓTˆèÉäÐ ÛÒë„êEŒ#w®>å™ 3wW"²27³rXh¤˜J0ÅÝS=» ACq#ƒïLo™Ì4+˲U*K1©g´P¯6Kæ^ë½7iŠ%Е©Dvz–bŽrh}ˆì§’ƒáÄ› ž€†ÁO¬¤QSÜ t…  |àJ˜–ÑáADp¶gJ(29O€ql®Ê¿oMÿˆÈÌÖ{(Í™<ö½§HíªYJ­åmÙ#- eÀPœ]1DÛ"8PdXaÐÔÑÊ(š—;¥/VMŠD ³”²÷´dædv!²§/(‹d–}Ųq} h¤„‰¬®–èc€›M5ZŠ(œ WiפB?Æ™„ƒ•L_mä4jRYÝ Š’HiʸdXf6¾fb$cÁx¤lñÈÚ½È|íÍaÕç#ÅCBÙ±$P&‡n(¼¢”c{‡ÀT2±8]‘ Ë#ÔÊðeL2Ÿlžà¾îÆGNV¦Ò—¶â•BLf"à&é4I`î%™F iVA0]I(…€Á=óÐÚÛ2œŠ3aBoGÈÕ°n6¬ÊSó°Áˆ à˜C¶ÑwT! ”Çm_=™3€‘}¯¥•þJÐ`Ãqäȿȥ1 Z_›l–@´16@ :Ì×cÙ—ÓÊIž:ÄW˜2ѽ–¢já¥L2s:¼pN¾ÏÏ>ÿêW¥-eþœ¿úž;´C©…&’š³ Ì ºúüÒaÙ»A>Õ8",½Žê °êåe~ùá3xNù<Ýk‚¿‰Ôí¼çóç~ñXå+û €G›<.JÕ/<Þœß×+êÈeð¾¸ü³zþ}…¨}ì'¿SyýMˆ­‘ôGæÅU$|Wý?ÙoÊÍt[Õ®[€ÀÏyI¹2&6ý4?)ôŸtþ)¨~í¹l¯Ãõ¿7cL®Þm»ö»ûÖ# æÂæþË.§ŒnM’ïӮωܻ YÙüäˆ9+¼j;a…tlŒo;ä¶ à™(q%îð®> ëC䩵fËûàÙ¯K'>ÆÅë¾åê(‰›.¸ío¹-£=í¥/J,uy^ò‚™„5úÃÅÁ£PtìÒßj¾gŠƒîýâpÅð¸%á_\â+Ïú‹Ñ£‹7¹º5'¤ˆ.°ÐÛ›½%ÐðÔCù J­;õÊÚp~®Ì‡¶}z:^ÛÍn¾Î×I'nÑ%³MÇíËF¯ÓáéIp™˜<èÕK®Ú^6ö@àÕÀÙbY6ñ(·X¥Ëñt•™áæœÇÓ†RrÖþfGçúmUûéÎ]Nç«rsÈ:£¸Ž˜ñމ†nÒHÄ3¨ø`ð¢ónÃÙ‚µŽÓjôôòò®ñ&§Â+Ÿ«³}ÿ0N¸”ÓÆaåèvŠ]gqÈ»Q¸‰¯ÊvIÈ›3/Gð™¦s˕Æ‘tïb_¬ƒ› ÏÓG]CÁ„ ¬mÓ†v'¢?ñVµŽ›¥òâååÅUKîSç8ËuÆÛÖbË„½¼ߦá^/·€µí÷—·ëÖµYgŸ–Ú_ÌDâÒÚ‰ïvâöœ¡ØÇÖ@Üô{­ Ìù>ò¢q舿<^Ћáæd/Ãtów¥v<å$>Jä\´Ê>H$|çóäÀn#㫽ÍÝ€÷Ré¸Â%«p-›JÑð¿þOÿ¿¤ÖOó¸ò‡¿Äm¿DD)¥ÎkñZh$d£f8Fq¶œ -“ÖÝ_߆=€Äˆ03šõ¥ÕbÌž™BÊbÆ *©^­î÷{FËè^+£–œÊ÷U”ÐûÛÿúë¥5ˆµÝoonÌ¥§#Kïìí°uF,­ù¨G•À•ê3ù:{r$!¯$!ÀgØ(ów@€†¸`†LD®èP H£ÌÊzÚÔÁ(¾‹Þ¢µbV¼,KKtw@¡CÛ§úìSï½íƒV– !•ᥦ.^RD´V¼ur°æ^#IEö®èi^ͪAT"Zz¥×r\$ÁÍd0U/Å£g[ÒŠV&7Ck9}¦‰LsÀ2¢šE–/n†aÎÚ[WHžrGkýÊ«)•È@ï¾ -eË…nÇá0gtBÆñ°Ë++ |€ƒP@BoÔ(B]3¿  ¶.‘LJDMˆóÈw• WÕ4ìdÇ – wë‘ã`z&ˆ¡þ¹› €;÷È,ntNSm½9`Å”£Q‘0c…%eÕ]LQÝ& $DÚP¼Ñ DV8S‰ü½Ð{ŽºìHB ÊΖrƒ€H3¢Þh¡ÏUö¾‰vX0WBüAh© $z­ ‹ËÁ쀡Ð8®|ÐD™¸õÕëZÍ4Ë&³ ˜±’(„¤HKfIÌN$G©xj´= È×Ô¾+ fš&x’Ciù*âgWŠ‘” –0dR)$Ôµ³Ó|Dè'©9¬®˜È€ÕŒöÆ©›í†)Dô¨>+Õ£ÑàÉ:OV „ ÜÅ‚H¹›É[oÊLW†j¥Wë€Ì|$Ó¡8%\ d²ª#öÔâÙ}` 2 VaÔjOí~Á¢é„û "ËLYÔºKCJt.Ùz Da‘:•Ò-ÆÌá¶½«¹ølÀ@0fëTAzö£„cw”èÇÊuAÃ[åDfušÍ¥LmöO³M÷è¯3Ó½ûßÊîSFv7´Ì©¸û§¿)̾üã«í?|jo_vþbSU!3%÷Ö‚•œw±,ýpèKo‡6 ÿp«»ùå‡ÏÿÕÿù_lÃ.» ”t&ðjØoÒãþEî/[ëò髯’ÌîBñŠr©ž~¼N…§þ¿2ù]Ðx|Á©=^ã?5>¾‡­øˆ>xIG>¤¸Åõl¿*’ßÝR^U…}…)Âfœl¤™gpÈÓ)ߊz§;¾AÎè¼åçcyq;`n9-w•÷w£Õ¹å¸éÝh‰<'$ø sÞ¥n:î„ÓÒ#Ö÷Ežà1-ê¦Æùê:ß+»9vá雵AOrÜLÞÑ[{bê¤]œ~Äg˜¦»Üü¿4èü¥ÚôáZÈKq†¼'Çò‚ªô`ÍáF âõÞü½¾§oê¸ýÉÝÀ£Æn’âYÅýx½×õjriFÍ- ùzËy±8”ÓOßIÁò±°Áda6®ŸžâÒ=uýgÌ8?‡ÍÜ<[>üñ¼óŸ¼‘DÎR´îœÜ•ؤ‡†'·÷Ôâûu÷|K¯RüX®ÿë*~Ršð½Rq}åÇRwGËuºEÇÇ“|5¨K7?+†™ ¥æÌ†>5Âêé¸ÿøÇëÁ`üå¾Ú:“ÜùÏï÷UXÿóÛªÑßïø¦«€wÑ_yoyõÔ¿üLéaæ€7½¢Û Ûxn—^‰ÉÇ?»(—~0‰ø ÷჋du< ·>]™t%$h¸Ÿ4þH¿çÅ¿oV+ïºÐžýa¾®µæ'v||ü‘ü%6?Å»ï9ó÷··76+›Ywò Ú$.×[eôëÿ¿dÏÈÌÞ{kh\ÞƒÄÔm¹’Ma9–ý½§SkiôBhˆ2kj"m¡…\"â s˜’ÅÐö½ Õ»½¨OÕÊî%ÜÍà$­Xû²'¸ÿõ´ÌÞö­8Õ#‹Wæ¡-ì±´½¨ õL˜É aº{»Ûz™ÌϹ+²³7€Ž³mð¸ÙD˜ !Ê„ ü{1ÃayKK^a^Ý Nkµ–——O­5ÆA½ÙLµî’ÑÛ"/‘¢õ왽k9´¾ô–*ŦÝüò7ŸÿÙý/Ö]µ•Ë.JÞ‰j´w·µî œV0<)e¸5ùüy¼ϵк‰Öžòx/BþPÀ-ÿÁI}eaÍí–Š>wËpuï¦÷ÔÏG)œwÃ×G˜øSŒùð¯/ˆx%-âz§÷ènÝ-sÑÑ‘þ«Fõ­ÀU`U¤¤:tgOxiÃy³ÉºS'ô ï³íàðËü6™ã/:ÿN^p›O»+ø@¸dÁ?=øØ†÷U›ÐòüÔ_âÌùxÉýÓûº§áþlå/µ÷MgÍ?“CýÐýåÇñvÝæ{A×Ÿï¨Ø~Ço›j¿0NþÏêë¤û^FIw?>'^áU:Ûܵ~öÄãüÿÝ‚š_ðYþõÎ#Ù£ô¶€â«b©?zÔõÍ'{—¥ëv››¤Ñ†“úã?üîwÿÑ3"5X#™f¦Ì®n4w£ŒÅ&£™•bÅa27‰™ás˦(nÌ: ˆˆT1)!c!#ÆZOµyþøŠáüÃwüÝÙ½³"ËçOö·¿’‰D0£'J…ÕÃò&Ài)¶Ã¡-½/1Ô«>ÔÿþßüKû/«}ùg¢üœ;ý‘"}+Eä¯__»qÿæ»ô5-›ÝÕ‰@ç ëçæ_/¿~$E´ÊÂÂe-ø}WÛÛ«÷ñ£z7p:žsvñÓê/:ÿñ--ñ“”Òo~lÏèÉy=ªÙ¿›%½Ú·^¥šT~øBmýܯ§üvöo«'Ÿ$¨M^MØ:ÈÝoÎ~ð·†–ºMò¬mA=xùÑC§^=ž“ÖÜpV.ßgÓœÅ;h>8ž™Aäc½Å ž:Îl¥c·'qÓæIä8þÿEÒ’{[ó EàÎmÓ=Nß&‚^¥6Î]VWŸu}}Oöìwzˆ‹jôµaœGüÔQ’äëøÊÍ»ÏCE×ÃáØ½¥û¦°—UGüÛe÷íÃç¢b“¸L]Ì…‹ÓÖó‘ÿìUº#uëÊäþúÃN O­Ÿ.ëfž? ?u»þ>nv¸·ÄeÉo'Ôñ4/~uþ1¨­§ñ¹ˆ7X'nFÙ±_ð\6Í;Wð¶–Hÿ÷(¹§ëóáÝvFŸB>Ïq|üAªÌ倸nâYüsöÿ؃z‰µ9ãŽÔmQï8©ŸF”®Ë_ÈͳèºÈãú]>¤Ö.×ëÆ±Ó¥=­ÑW5\w ËùÈäâÒó6Ùr¯³b;Ux¼;<Ý‹eóŠÄû©=ŽGo^®M{üq|jsn†õó ìn›äUxô(ó¤ŒîngôÝVÙ«OüÚ(övß{7@¿Eü¿Û p¯‘âö‚ÛŽ@ž 9@î|=¼þþ?ý&{0÷Ë êw©ª‚L¤ä†:W–’¢U/e$ ÔK¢ƒ&ˆ†ìDc”[KNª#³+™±4#ÜݪÙdÕ„LSЍթâN[¢õô¹ZfÀÔc8ØwÌÿð¿ºÒ"K*£gôÚ{;ôXZ;tóŽE"(>|3eDÙA (~,YÕÊÉ0åæè¬^0Üè+Ô"Fñ¥) ,(@:2†“mnªäL‰ÖZš¡õ6TÈÌÈÌ‘˜§ÝÛkôÞ§êzf„¡ˆ}U2\}TÝdŒ}öŽ‘ž‰€™•ˆ„²ÚJ©X–æî4D†”¼²ÎÅ€ÊÌHKh¨PëI¢ÂE·‚”E„§{uÀ”BR™Ci¥›H  Å9*2Ì£¸-]0ry]hpÊ|š!:hkeqï¨\y>LˆØý0œ ˜]ZèÓJ£Ç±TœGðÄÞð’(€Kb r©•¹  ‰$Ѱ¦bå¤XÈLa•‘ Š›e™Ó ²/fb•‹2ô°–YÒg›,âHW¨+j5$ºñõÐeY.3× Ú{š¤°*bG®˜O£N.© UË—RRjN(žÜÖ@e )Ãà-@ZK)QÆÇP=ÓIºRËz|²fÈ NXÁdÖ#Ǥ%zäš©+#˃”ªY’P†X]*M–”²¯Ï›ßZ ëíe°ÂÊjëf¢)IÉÖ©T­$YŽ®‘ŒóÂF[KãÝ@ƒ¸ ý£S‚`>­–Ñ` È€š3–/h™³³î!íM•æè­TSÆÒ€E L/UXÛMhn ”Ñ[£’î))€˜¢¼¡…L豦F$${Ðñò¸¢_Á„9#À@O¹ÃŽ%­)º`²ùµ-oæ/^ç–ÿù*uÚ  Ì€ΕßÄËš{>ÃyÜ}” fÐH8dƒV€¦513¼O†mF©À°\ÎcŠÂƯ2Á¬”âµìÍ9ùËΫVÊç9èì@#?½XÛ÷ï?Á‡¦Ø—Êy÷ -»Ö8¦rºÈ.#-j öž]-#ûÒÔ""UýÿWÿýÿ]§èð2”]{š/Š:6áË=Ÿ)‘Ò}HãÏ¥'~H¼ÓÕÆðið¤º5tA¹Ô¦Üù°v¦üPóeCâ­Èó¾â×nkŽáíù6ÜÊ‹÷káÀ Þòò=ïüç¦Òè}åó`u µ¿RuÒ5îwóV•¾…X>2i»9žM#À½ÐüTVϳþ}Ö0N° '§ÿ(‚å¤Îˆ|_s„’Îtmò¡FÕÕð•ñÀ Þ]÷:¶»‰ Œ*yÙærù«Ñ¾Ž•K}UYÿ¤æ/:¿™ipUÛ;»ÅМ:6.ü¦õCOvaÇÞ^BPñs¸[>ß >‘þßiðt﩯9’G_Ð¥ä*m¼| ]#»ø±5›Ô-é©’|Gy¿'Tld»û¢É·\?]ë‰]Fwx -×ûâ-ŸÿŒ1—×HÝ\]P䮇¼ý=$úókG>ÍÀ< Z6‚îâÇDжJ7tårÈ›ñwç¢ûhm}|ðð·ö6-}“&ÐÇW%}=)é’—~I¬;=ÒóœEÿØG§'ðs¢Ÿ^Äg™–›DÒzÉcK‰ë{~)«¿~óJË'ïµÞ]ZîMÛmZáñÝïsßú"lì·äÅ»kÔ8•.“T›‡1¯–´Méiɬè"1BnY޹EþúáÉ'›µëÀcÓYˆ‹€fn?å+êg¶ZìƒïڲܸØé‚¨w‚‡¯ln‹ïM×£¿ËÕüãW-IÿèùŽúƒOîWp¼I³eñ×*çMÂ1ÇÈ!‰]ÝÅaDk6`À™"ðãoÿ›_ÿ]o=# ÐÍ‹‰4+4Ú‘žá!¨Å­x*$™‰Â»R–"ЖL"jë¢ 'è ¯o­gýT-“ŽRlª–©BXFìFV¨æÝÜ[9}žû¡/‡®Ìòi~ûŸÿÝ"Tccªg[z_ÑzU¸‰@Ö£–|1,¡u#@ À…G”¶!;r”$ÛÊÁªV5pZ…~ V@_Ë1F±¿œk$9Øå±ÈKD@$hPµ—éʼnýò–iN¯>EËÃ~…º{„2Ì«¢wM¥N¶|iÝJ˜a~qÂF¾ÂM Iˆ$½ B )‘Ö{áÅ­ ‘ÔÝhÈ$3”j4)#yJöx,Ãõµ`Ú±í¡æŽÎ Ë%"Ò #T«2eΔ| °dBa!!2[O’µÌ­¡-¯ØÍåK?RÖ¢c+«+°^@?ê†fÒ(UžE[ë¸ib=?Û:…¹7IОx5~JIà`+‚œ@"˜ž4!™ÒbîŒ%SÔ©Qo¡ÝÓðœ4a²Æ^iåE5]]rN•ÑQ~È\›¢ÉA˜ áa³•¦ FgBøT«Ìz  ؤ ö®$ä¤9kѻ̉zd¢IMÙ™s¢•Ètctú]ˆâ¨Å¢cIU¸/L4µ4 gNf"5‘ ²‹;ÂDJ•kðg€nÙ8,…‰°”Ð3ÍÙ„J.‰$fÁÄ%×Zš’ìR—©– irº¯•ìNv±wX•ÙÈ.‰²­Š#…Þ×!4¾Ì`GaԳà ±ö—pÌn[UÎè°Qψ£¼£¶ÒÀ d¾?ŠR™{O³,øœh´šýàeœá^èÌ€,Ǥ»”ˆhifÓnVz2JÝ3ŒÝZM ô=|^Á².;ÖtT ͬþ0©LËÛ[|i„†æNÀs);´×ô/1ÄWUþn±¶2Ȧ ‡è 2×òŒ¼©€úÏaº™ÍZ.­ÏîîM%Aùöã[?´¿ÿÍß#•¡b./4˜€áffŬ'Ø#Š»¹»‘0˜½Kî.$–æŒ<³jiÊh‡F3ÍÄT ÷îFFG†›y&“yhœœD¾íSÊH™XKöŽ^ ¥%SKø¿ÿeôjd¨- zªµþÖö¯K³t‹3‹êQlm>ÅÅækujñáòº2¯‡ìH¢£'L3¬ ‡þECù Œ³òiÎC· ДŠ¥Bެ×V3¤½ VɧigÎì¶–:•D¯© 2â€d6uhš)†Ý®ì— Lõ„XwDdÄè`£Áè‡hÊR¬NpD ”EÁìv3 ûh¨…P½‡9THK­†ŸR+HÒ•};ÆAÕé)еHÌ.ƒ ©Z-Sуt9BiÂЙi‚eV'´¶2Ä#ÐL;XAîÉ+â%`ÀÐñ†q‘hPþ& €…0É @ÉÄWª>%ŠrͰƒ)ɪH1ņjIF®J¨#mpϘ†ŽIÀƒ¯êGjN¹œš Ø šd%­$Ó²ÙBÁÅ) 8 g÷¹¾ cy-½·L²“çÒc†›la S jA5kbH„zʈB£EÏ 8¹“XK*¡ÆT °²¥Ü݉HexRrÉ"ÀÐ3’@+¾¤f£’fp®I ~2BX¨$?“fÜ÷0MCH4δs>W Gš c-‰” 肆-Ð…4¦4¦JsÖ2êú)arl@´e”h ™ðªÐ:=M ¡NP®lúá!®,£í~4³†C^ÄÚ»’ÔŽ·/‘KÖï;Yð’)+»—RvÃ℩Ѱ`¾jª B”T–jfÅËZdí´ÄÎWzTz©CƒÔ5‡1²mVPª²år ÞÞR=0Ì•1à`µ¬ U,ŠèÙ×xÖ8€À4@= }YÛž$P+tgÊ|¥ùŸ|}©µ´Ÿ¶æGKvÓ ­YŠAmÆ š‘•*^¦ú2û¬ç擃ØüúT(Î[€Ë#è Þ•y×õ–<¢Q®0@wý·?nÉzy9tohiCÄâ銜¢ç“w–.ÊÑuSâËLÕí•ÑEÏyyïßJÝ‹õ®Û5u yÙ–óóvk¸Ò¦U†|¢*?r•½e,­<µ±:QO‡éæ"o ÿÕ;ø½Ò$\>Vt™ÏÐf)ÿê‡*qîËÓ¹€ƒ[ ÐU7Ò¶`åÝÚ*žn8ï÷Õ^°ìnÆÌ™·Kü¹TaûGâm“ð½+xîá}ôâ÷£œû¨”_év@ä3:t¿ìýXÓÃ}oî¶8ý ‚zú\ô@ð¢žHÛÆ’g·ûc¤ÅŸRm÷ñ u½}¤à#oËM’Ö2¨S €¤‘×é«;Eòþþ^û»hÙ[Sæøs+ŋà T—H3€¥Ð@w§¥ÛT«›‘4w«³GSfÌ]=•¼³B Z1˜[kP©î¹9¥ƒ,SÒüý‹Ëë^´Œ"øeÏ¥å¿û÷-—©(ÑÁl}YŠÈÖ™Dk‹DÆ< 4ÓÑQÖ0Uµ@KÔ<+†÷o`5ûµ3ßnŒã!A»ŸUŵ~ÔaÓjÈiŽÞ xöÔÒEDë)”iÕòÜáŽÞ¡´jso´ÜÇžÝK™|B}ápWf€‡×Þ²ƒ*5{G´¤«ì‹Ì,›Ã\HEF×è@ŠŽèI$Íæ]©¥v&mDq, é{fƒQôÜ4ø,f€ŒžIÌР¬Ö÷©>`&ªÅ"RPt™{†#Ñ#jñA1êټؼ›bJí¦b´ž™‡}fÆåG öÀ.‘˜?Á½Ãw‚±$<¢«\¶½ƒûŸô—5ˆLÀv¢ Ò›i!&Y‚på«å~P› Z®æÆNõ8®o &@P‰H¨³»iIÉ0ƒøLNª"f‰Þ%ЬÊB诬Î6GMTV$FÑ~ £;^½ÂSÊN7¦¼Ô³Ïżx“ÐYÌܳ.t¢:Fúä(Cf4°{@ÔμË,Bq‹žà¼f¹º¢%'wGÐèÅ¢‰"L$)OT¢¥ÃDNÆÞrìŸ,©=àŽ>.ZC! ±€Z¦$“pgKæ!2G(ùâÃ}yïDqvgqÒ$JÂ<óÐ2„ ‰ð!+w,‡U%§ÁìXðž(+ÇŒ‹×óh#LhEЀpŸ+3*¹z¬ªãŽcÅe9X‡H¬.y ×Ì…È22˰97Ћ“¬˜eB¦æNƒÁ’=3HÒeÖûÒ•! á¼ùѯ}„†eHçyäLÆjzÁ%2Ð:£í¥ö<õ›ÖÖù5Ö·$ÒV.”GD’ÖE¯lÿG ÔXý„ì Ñ^P_ÖTÁpö€B?Zcm“Ê„9ÒX`Ö­;½ÔRKa5Ÿ}~©Ÿ^< V†Ñv¦rßʧ`&Û•R|®Tºó@6P»©Ì3Cí·?fY|ò”˜–Tö¶dd´¾,-–>\ K-e*eªÿúßþ÷ u-©`˧Ð#LéeŸé½ŒÞ‹¾6ÀxT–ûËR¿ˆío˜¸ åïb¿©àBY9†EúYrWþ;ðm·è‘SY¿žÇ™ï6Ÿ< q¯€KWO+Ð/ûÛ·”és·Åú´füi—Ã~âY^nV/UÑÛ¯Õ'žÑ´Ç÷¿°¨]a`›ÛtlGØ£ž†Û àÕNáhpg#vu»ŸÝ¿Hèüí,º bzx¾7vÃÙ»mo+O:éñû÷5¨ËÓÁUëÃOý¿ê>êñ!Þi9Ò¢¶+ËÕ]Ð{´*6弓?f¤ÇZéë°þî‰:*‘—Ë,ï­â¼!¦ð‘Šp|ù!”Ç#5•÷Õ輯t]ƒÖ“¿¸‰:Ú)]Ä'¯yçs®½ìHòò1r5´•¯®Ø#wôg¥Çꧤî¤ÞnSÜÈV÷n ‰kpÌÝ5™¸==wjÇcNžó©ôPÖ×¥xºÝG׋ýŽuüfiÝÞX]æEîÙ\Wgë‘Ç)Ôà9æ=€.åPnm6ÎZê6ówéu]¥p.añ¼³æò:p7J»Püy%òn¯’.§³YÄñÐÅkq3Yn¸:ºY£…n¥þ]’|6ñ1î~föÎt¼Ëü¹ÍðDþ¹xr{;×»¬»Añ ñr“ûâ=™ذ ï<N#ù*¦¼ÔŸæñ0´¹ëä¦=–_ùh¾é&|‡t'élo¯Èù_£Ïøn2‡×ã~#—Ÿçø’¢÷ ¤G„¬wrXzðÈ$î#PoIJÛòcóïæ“ñƒ²þv[~ÛvþU*ÀÖ@âú=/xýï¥ãɤd9jÿIÒÍi¼æWŸ,-êT¯½ÞöÈJqífDØ4MoË[VrËðí 4àèך€:è°zL?­ûæ#Ü }a¡ÈC)E«ð{ÃNšSa\ˆªnbAzIuÄÑBL¤)2YH™’àÎ\£½ÀH3äúÿ2èÀYŒö}î%%¦^mQJVQª£sÉnÉÚØˆîQçÒ#)&I¦¼&Ý£Æ×CKI”+ «Æ‡)$Ý,‰Mƒ:¥¥!©H¹Ñà`Ò3-£ÒÚ>†›7ºÌèÆž4b2“NZ¦k5’uÂÝ @B¦(UCd0Ê!8F¢d¬ù;7Iž ØH"ÇóóM2 ‚]T˜àòéMŠ´Ü·ìM£c†h É5ßã«-„©@Còöã,½XËJÃ#4øHÅM0CÄÑÇŠgº‡ÿÖö Ô:š$Dì)Ôù3ËŽÚA;Åœ¨¥¸yU&AsC"f*Cd%S‰P&‘¬½ç~¯úbýM¹G´öå€ÌR×ŇBGãb9ÚŒ¢÷Tb$gX€Xa>0WŤ9«Áv¼&c™9?åôc}scïlàeÜq˜#^G·œ4³Öׇî°îÓs4yxA5›š¥yÙy‰ÉêìuvV¾|.uª³ÉŠ~l^\‰²ûĹàåʼnÌKôyÂ\§Ýç˜ý°ô(Õ~õ}JFvh26${‹h­·h‡¦L3+Õën~ù›ÏÿÍ¿ú74;ª”¼¬ä8cfð{ñKrð•w"½GÂÅ7Kÿ·pó‹—mä–c¨®Ç[à'!#NÄg<9ùŽŒûèd®Âø£«áV<â“èîI½È½äÇËâ¶t÷oHHçº[^ Bªu®ÍiSx*= ¿«Ë_hÜuäwƒÛ ÒË…ž~ÁTÙXaðò4bÞ“zÞ&‘·FwWõ:ÏUTn®2.-Þ øïy~\Z=HÇ|okp[:3®Ôªïæµ$Ïšø¦ØüO:³-ÙÈ@\Ø»0+½7Ó &©epõ¢írš'K/d.‡KqsË‘ÊiWóÐz "=‘‘e*–9XÎÒ¤·ÿÇÿ‡Ñk ½õ÷­ê¤¹S™‘Fyñˆ”`€w¤K‰v•µôµw(ÀÏiD™P4¤à3ìX…WäØg ~H¢Œj\ƒæ(;ÐF‰ú*¥å0 -0!cðî-ÕöK(‹Ã2"33²˜j! è­7 uÙó ,›öm€·mxáfT­ˆP4E‡ÍÌ\­‡Cl-NRJèÝXHX¡Dw›^¦`â°ô%Qà4efä`‰ 2¹ÆZ‹/l-Êä^TwnôŒ<,{cé{G&P€DI‡C?bª¤«º¨E${}È—w?pŒïì¤Ý4P3TÀ…ñ{S§¾›ŽVÀd`)½š7ªfNÂ4ãÞ4tg(²Nï–]Rj`Ì høÝN•V Èa–ëFC”Ð-3d†:{¾I Þ=X+bo d»(†ƒKfa1W!LÝTàûè’Õâö‚ÊœP¨f=ÙÀÙÝL­§ÕP(xÚìÖ¤È\Rnš­´ ûlf–¢S:dX¨^”²ÂC¤z¯‰ê¦žêQF!¼`f@€"¡åp|HI¨ÅšËŸ ì… U°•!¥ yP†[ÝHt©k‚wRH¨‡2•q¬Õå}5ÂUÈó$z;¢ÔÝê ú²šxÓ€²yXƒz_Åtœj¦†‡-Q ƒÝ_*"ácsUèµDVµd:}Wê^fX1w7pr£13[o¤CR6¯4O}2sëË¢h6”ý÷ ²ÃÞ¸ÿ‡â_@ «å5€q»{sMRš:è±¶/ŒZþQû?iEüóåï{X 0Œy}Í_šVÓã H]áØ0x,QóMïl¤"B€z%bühJc…›å\LÅË\Å>}vŸJP¸H’ýí 8Cô—‰ÕT¼ï—̰ϟü»Ïoû~ø‡ßã»n¿ú€W÷——Ö;ºaYZ¶ˆÖcéÑ;G?Y-u7½üðù_þë#³µùÊŽó¤ø¼WøGß8ÿó|·%‡ä϶·üùïèŸÈnô—Œ*O,¦ñ‰[ϳí²þÜ¢h>w©ñÏEðç¢ð:.YþƒMdþé)û_åŒòÍÚéÖîç¶@—Å|:æ Êi}왥'ö¼À©8—¹7õ»Ï—ǫȫZß,d¼t…ÿÚëÌËRûs“qÜeI´®b”pÊuv5<´Ú‹é=ê#ŸäΉ ëàÙqþ"ÏŸú0xü—ºT'ï— lÇŒ>>àÛþ‚³ãíÅûëCRï­ÁïÖ-甬ÑmÉì‰Ë'Í™ÐóÁµ‘Äuì{·šWÏ/ÊZï*e‡7ºy´Ü·¦ä§OåÓËËÛ!–7z‘®®ÔGë…Ac @Œ«3g0f “0aXhø>u”DeBR¯´IJd(øÁ2€O  I˜S}ñ,­zæ’0™l´Šˆ„ª42-SaÓê8ì‹§„4dQFDgMÚž¤ ‹ÌÄN]YÀâJd÷ERa)ÞÒéK,‘˜¼†ð¥-8{•+îfÆÃ!39™ïŠã²,™è‰¹ˆ´”hF!!˜Ì!!-j™( ÝYÈC$…O\ ÿÉÌ‚ì©Ù,$¬ø:*á\] ¶s܉™ébè$*µú.ï‹Ð=s*nä"ÐTIH¹„ ijÜ $Rˆ~~.Õ £Ò<â(îî‘s˜;’I©o@й§Ë®Á¸¾ÒVð2B1ä°÷¨ ''wfßûü}™>[ÝÉD NP‘=MÌÜ‘’Šà>’²Ñby=ÐÒ‹²ïûá@:~›o¿.lVŒ½u[ís-‘\“p£ýA#g6&ú öŒ}ù¨úŒi@¡@ÊþÛQÍO¤$ÜÀáìëÞx4^ÃÞyM! ÐÙpúTƒ×õõV‘AŽ HœüL/Wršê2Û½Øn·«Sü®©–èiKw/¶›óþ_|ߥ°rh©·f±ÇË‹}ž¬gg)íw¿iö‘`†ÚÒ²÷l‘­gLYñ:×:Õù»—ùoþÍr¹?®ÔGØÃÕ‹tª ßÊ6G›‡ì–}LÜ¡©ã.~•¸ÿQË͵¡åAïímX¹Î,]Hoç=æ7ëþAêA)ômSòæBñª=÷n™íEýfæ–ƒýäâmk¸ïYÀÞ“ëÛÞðÕÖ„ÏE‘»Ž»×có$Æ<îmý¹J’·Áð&ÂÜHâG Î 4}¬_Ÿ'š¯„*>‹ï߇Ù>*a¹kÒû‘ûžà»)˜y°;¸‘_;7¯‡ýå8øI#ü)@çoç è¬@Ðyûµ;»G>ø”¿ù ¿n<žéÏ%ŒÓ‡]±³ží±¼ìÄL>? /iy2JNÓ÷W@Ý9 ÞÈ®›‡†Nt >ЛçŸz?~„ß<Ÿ®ÐP—züµ ¥G§v£<^\I^Œß{·‡›ÔÈJ€¹¯›[÷nônã¬{P«‘ u-(4$qפà=ÍV'8Ñ ¸rÈî0› dÛprfÿܼ?ŸÞn•“KÍútGΗòî“ê¹Ã÷—„‹xò&“£›–Ò‹ù¸J7žO2S·)DÝ!yð2î;:<¸›Üi®s\§0úŸíZ)Ôñæß<Áuivq:¼ÿÛÍÇó„š¿?aOCêá}‘uﺮ‘¾M0]žÑõçèâ§äCºÌÆ‚ýÈ´Î&WÉ¿ûÉ=,O!ÞÍôx6uŸo nVnFÖÙZá$Ͽ󸺎9îñ<ÇtÔ6Lyìn1þz´Ÿ¹ûL9 Jÿ—™Ôì0n±IÄ%ï^W b>o<å­®n$ÏÉçë ‡ÞöòUº}æ¾Ã1;Gcwã¹ßUΜGoÞÝ€=ª•¸¿#}/:¼Ù ½%d3ömôU‰Q¹ÏKÏßU„;¶Ê÷`§„%ÿî׿&YJðöû/ê‘‘Ù©´èÅè^çÉJ‰ 2I¡-m¥*»·ÍÐT\n) :SŠNZöÑiu*¥eÞ”¡··Ã§—É‘Å9Ç›gJKp°Ñ‹¤i®„‰†Zi|ûþP2B‡¥J‘l‘™²ìbÀÌÜÜ=%8•0sS¦Ld*¡@{C&æºÖÒFC&Hئ`vÐÐökb`ú„\9õT@T3gö€Ž8zÃFÑ:Ñʆfž™„,PæÒË>˘^½«¦=#–(ÅY*I¯æ´ž”ZÌaV@Š––º¤9ÁÒ%«ðYCðãÚB«–½Ã2-2i‹h™‰‡[I$ (³Î–Èèédƒæt´êtwzNŸ 2£‰P¦PaóÌïþfŽÅ{ÏC_<Í}ª^2–lñ†öúÚÀʈ×:­Ïýaã7ÔÛuÁ1 a¢LrˆÐ$-D t(¨âæõÚ X3QQsm~`€:ÐÂlÈβ·Ò“æÀ¨•NÔ“3bü®¦Ëûññâ£DšêT·Z¡‰‚"L&TÉŒÉ)íЖÍDÊi4—×j (î2kJUGOåÙK(i´7˜³ZÅð%`º”è03)„&ç«ðÚ!X8afÊ0ã$3é 2³a2ƒ)IÕÑäÊÉ-½§R³£fR%œˆdR~Ü.(‘‚Ù’TàÉxŒ¾„B&%0"½š !ÛzÓ‰b0¬M3ˆ€_k¼Ç×¼ úC•öõ‡ƒe‚JVªÏÈÉ™`„•cÄä+Dȹþçx’ᣂ~¬ÁèèE Qv/Å^¦âs}ÙAÑű×M¥2›ùp396™‘Bbä¯ä„¢gëM|3ÅÿŸ½}’$K²ü°sTï5ȬêžÁ.âÁ‚ "üHþÿ_ñ¢–Â!H`A»ƒé®ªÌp·{U?\3wswóˆÈ¬¬îêžv™©ÊΊp77»½GU§¦ ȱÖû'R𑓈µäʇ^uÀK^h©Í׌gC›—E‰ŽÈå뻃( yY È\~ò²¦Éh ^mÉIä¹( qx*!´c€>U¯é²êOµde=ÕÝÊôle2ŸRaÏIèÉç'¹åÜÑa¥ õÚN³QOÅ¿‰þ»âØì7¿©¾LÆ<«ˆlÑO-{ØŸõ€¿ùÏÿ9!§—‘µ &øj%Í&œ^?k ¢3ý€Ôý‘ŠWG|¼»,ý>€ÙuÚW—® @—SÒ%¾¿f ã·¢ÛsľlË5+7BÞÇóLÊÇá7¾€ë¨Ç‘5o¹¯wUYÛo÷ ä{TRò5*¼CØ_‡±Ú`9¸ëÑø¥…/oŒ™ë ×Œ›[Á[ÚÏâ¦y!ÎŒmÝòxñÇÔýqý îÒÆW@[Ñ}Âç†tEª¹†Ì¬Ç žÏe¼¼‚A½^¨»¹ÿ"/¯é¸7ÓÕEýyBçïßdcŠÀT´¥ úk`K-•p&ÚßÜô?wGñ›Åö=+Lyu¹ù¤w´¢÷ É¿ô‹7…—ú#]Å—ýðWtÓ=ÎlÞlÛðÇ›ü~Šþ¯ü—Z)þä>ç —o½÷BôÍ¿*ßü&Â/ÑrøF÷Á7þ¤áü0 yÏ<Ž]xubûãͽ%‡íÒy× oòÔÿ$žoÖðKOøC톷¥%çkÐö¸Mÿêÿ÷¿q@xÌ$úœ=æã<´p+Su·¤y±Qþïer7@N“èrôPŸê„bmžS(µÌsÚa22û©G;ÔC9Ô˜;Š)SÙ e‘)åÁ19ÜÕÔ³·žs ÒŠŸæ6ÁÒ¡P5–?ÿÃߊJeïY œ›Zïsk§S EÒ̼$²Gè7R1|¦M9°=0Á} eæ¸$HïXDt[j¢ÅQý ¥¬@sæJÿ ó‘03wª˜;²¬U¾—‡$=§ Y­bΖ¦ibœ2`(##"à0³ì…lnp·Œè¡â¤@j=†ci)4±Ï)¥îY&G’"{ë„'ÈÙ[÷ƒW¯ÅýóË‹˜åPS=F>3úлe†hÐl™I“•t÷2;" s¯f)¡+“Ž/I ²+ó4çÇïj)8¾dŠX‹ZžË}R‰Ì¥Þß+”‹|yN DgúQÙ Ð)!;R²£dÈ’<1?i9…:,iÍ`RM”'¢›\I%šŠf&šÐi‰ûÂW§IŽQÉJ IBMH©ÀF¥åxûÆS ëT'ªk2µŠVHK}6…Ô$Ñä ººcNxqR=#€&?ƒÈƒ'Š@Ë$U › 7&ðÉ|ŽÞ¤.,¦b”xœ{R¦ì…PíÉ ´ DêÔâØ{ªÑeæD†ªDÐ3û ñ¢,G%œ,D 8–‹$))ôuMÌT æì©Áü±YÚR£›Ãηú’!ë ÑAÿ\,Å5>L}‡uÀèë;"[ ¥Aˆ‹¬æX”ÃBîn#… %J…M«Äë€CDÆb!àˆðɼ¬VãdV]"^¬}þìYyq˜1Êá S¤§R̽0Ñ£K sƒWúEsü8ú‡ò3د‘¡g°®©ù@&²/MCèçºp¡C±: ò¥ýhÙœ:dK¶fý Ì–UŽ›Ò¯Ñ|ÓÌîÿðO–`F/*uá /b¢Ã!Ä'Ù“»;­”2ép¨uª/ne²ÃAÇÄOÝžýðü®°ª òÀš¢Ê‡CvÌ?üè¥âùɼzö ·® ìÃÓSñ~œ%]ÊÌŒH¤úýÔIЫOχçß|ð7ÿ쟟üYyÌ‹¾º_µú¾¼3¸xOækqȶÐé ë~] _òZþ,AÛÔö÷Ľ7ô_îÎÜy)¿г9Ûý×ôžk~”@z×iê¦ÞŸï½ª7ø;—¤¿ÀhßÇjA¼Ó…ðfÀ/3Òî…¥ë¼ãŸäzµM¦Fãæu`Û‚¤û/Ø…óÆšîÑ+zo|eËÑ7¿»ú¬xe~Ñ]ôæeèuÕâ¶^u•™ùÝðÖµÞ­LÜ7ÉæC‡Ç[9No9ž]Þw>@;¶/÷N®zÐs¡MU¸ö.{Ï1øíûõ%šÒRH|õ7Â#ÇãË÷ˆ)WÕôß áëëH‰ýjn¿/nûâ›~™óàçÆOV_´R?ÖÐu{‡È}ûVÆ÷L´¿&\~_àbIJò&t¿á$ö®ëàÀÆ+z’¨Ùº°«øÎpØìÙX}‘˜{F&í­pC[×뤠›ò2®ngº®ˆU—¢*Ül ‹C«­A§Î㫪­·CV½¸4ñܾóÆÌ˜_ºæÜÆ ·è[Sï:Ù·›‡Þ¬oúês×+…ÿožÉ¡ð>Á0îóù•™W` À¿þßþÍùÈaæÇ>Eë§ã)ZYjõânnÅëÓTjäÅ"ÒŒ^µÞÓ¨Þ²½Ã579¤¬Í! 8MˆÌZÈlJ%Àú¡ÞU{„Ò¦I«ç×éoÿ_)dä{zDOhAÉY‚=…Aã·«…nÉž½+ˆ&J"ÖÑNi¶ "³µTv…_¬t€ð 8lBÆ*j!ŒÓ‘Ã(ج€/º¤¨‚{Ða‹¯*Ôáe1)„;bFF–:»%Î.‰h­ \JNõi˜ÑY½t€®Aö§a>%š!Iú´8Óš{.i} ŠHX=™˜“…&?ÔCd¯¥¶`¦" ¯4xïÑ»Hº{DÙ{&1ìFi&š”šcâøÉÚq~þ8ÑØzÖæ4ÏJeèä‡, %4:0:¼¢”¥ˆ{ŽCL‹@v˜ÁŸ%!f ­›Zj±$MD°+¬a(©€%üdÃm9'øÉ`ÉÙÒÄÁ‡If¢‡PÄn~"eÀV ¸D’@Ï¥ÞÔ,(iÁêbOÌB1H:ûÌáPë0šñz’Ê„DΟü»C¥ðr LL‚Ÿ{Vq’ÁLÎSF‡>¸ue‹üè~€Ílô˰/ýÁ)9—rÎÄ< âʼn÷µ¥êTÁ§0òcrIËLÆýâÃ!ÈC ç ?,]­²´´¡Q¦µÂ€P'ˆTf¦L‚A’UKd¼t2‚i ©ŸŽe¬À0·Éä`˜ÑÕ,êãK±Žu”çB"ÒX²r¥Ã®÷Á8@Öíµµ X‘ (0 ÏÁ\º+ÆÓ‰\<‡sɲRf‹ó6Å–>Ÿ#Y"ªÇj 2-g? V'L¥àà¦Â:Yj²úì^ØÌQ`2º³Ò<çȟžißâÔ£‹…ÙÈçg~8dœÚßýp•¹}>E—ýö?èN³ì‘=ûÜbî9÷‚W̧éé7ÿæ?ûϱW#|)r\£Zí¸|ñµˆÚS..¿©[¢%7‡ý7ËuêÍ yýMíX¸‰}îÝ{2ÀÝÉî—–¶^õ=~wvÃkáWž¿äwÞ^ár­=týwÂÜ7‰6¯ý~oȼòô}KI¿êW~o> û͸­qùòcÅ5ÎV÷‡Dœý¦÷©?ç.–ûÏ/ û¯t„_qÝÕ¯:¾”í1g×øöh¸“ˆ}„×›«Ðë–¶÷‡Ð݉ùhH?:–Þö…Üq„vÁh¯í¯Ò„x½Ü(S›îûå,¶ŸÇB¹iQ¹eéèËà%}pm°ÍëI'^ËÛ,š^×Âï¥<ÜoáÚfäW@Åí,嬲\Ø-aÕ6D ÞÐ_µû\þ·®ÞãZ<º+iob ^0\ÚX,|±+¶Ãú£¼ .õÅ;ÍG—åT7 álâµôüâÎ9ßÅËÍ”.v^ÖtÙJÅÝâŠäÂóÚ`ýv¥ðM›âæéß}äM äjÿÞ éñ9×[íÍTÙ'%bk;…-Úƒßm"Â%³ =®¥[ÞìÝ—DÆzÈÍÞyã9q!Dídyv@G7b<·o²¿×ë6ˆ=€tŸ±Û@u¶qûžÀ£œÎžñ†6«ÛûýÝ®' œzQº‚\€Z7]À—h…-^ÍXÝŒÜ5€ÆŽ»Ä.͸# o$ؼ;0ðâΣ)Ã;žØfœŸ÷µs ÿΞÖ;u[¢²6qž‹U†ÓÏÝÛér®ùx=z¸ÓŒEý޶­9'W–o@û‚Ë/‡ÒËÊ»•óvHð&Éy™ÓK‹:·Öâ}ò‹¼ß´÷B+×QýÕS½ÞѾèpò èp=¤ï—ì˜Gu@oÆ^ÛÞÒ×3»xJ~ÉÓó§6šlªVbö–è_¸542I¡±fš]Eþ£Ð5ûöe¢”åd0‡1øZZ(ÛJxYFäè0ÇúD–Lƒ Jp t€Þ`ãS ZäˤëIÙú‘tDÌT-æ­]`˜ FI=îfá™é+¥{À Ny!”ÙX'ÏPi.Zd/uþ=³Nŧ”LeXF¬×/è£Ê’ØÏôêÁˆ.#à ³”BXJæ4sˆ°Þ;i]È–Ù¦O)3z¶;³+B/k-óx:&³ ŽÕæ5âpa¦¨ r†}fšhÃìÖ™3‘è¦8ÁGµÿ drx½¦ÔelpTRMØüb•þEÌ”9LM&¶¤ÀRh]ShždŠLÚ‹³¨8X @wëž@ç±óy®Írz¦OÑ-íE=眼´@`:ZÏ®9¢ F™Á;ðܾ¯f 7u)S&O*2O=IöìÊÌ—–)Ó3b$#ųf/‘ s†‘¯¥Ù$ DÊ€B}€ ,ÆŽì¢ÙØ´ëÂS€rüŸ×ùσƒUæ’¡ ‚è ÖBr‚HÁ ¼@ Ú‚è»â‚¯Y³Dè ¯Èåf€#×ÛVLÍT¢ýH/Ù3À Fбúë&z++ÜÆàÊD•°jæ€' ^=“R¦4-ù†]‘=[˜›p£P 20šÐyý³,bØ0Æ8‡ ÕȪÒ/‡’±¼¤À¾d `E ¨¡VtD:límfc¹³‹ñrx´%‹°,•\<ÏÇ+~@|^=“Õ=ˆ â~ñ^yx*Q=Œ?Rýë§ò׿í?Îz9%ÔÇú›ïòeVâVÿê;™%-Ÿ-$¦òãsÿþcºK@-ÓwT7óè=zë-úÜ¢õ˜[fR°êõéðüÛóÏþùm ¾a–.ñv®†–FµA‹Ü?%pƒIÕ….o‰·útÃõ½êiÞiðK%ñuð(ü|G(µW'¸_S©7J0öÞs•¹ i.ðÌØzE_H0ñ_!ƒ_GžgËã¡WËS„;ÍpœïÖ¿Ù÷!x%ž<§xÖšå)‚çCêý¨xDÝØ*ä¯w¼'Q´›eyü+ÜdV‘oÇ|rñËáæb/²+wôëó¨¶F»_Ø7ïz#’¿ÑÝA=R¶/hŸk(3·ûÜW¶Ý^Þ ×Ï7Qø™¥”>ÐùÇ";·ÙÖk=Ÿ[›ÒesgÉQâ–ÆÎ]6ïÍÔ]ø —‹ÿ&å_ô¾mêeÛ€½€máiùÃ_ëÆ+ã²=̽ †yoÀÏ}üûÆDkµ)ϼBíGSÿïIÿìQw[;zðÆwøÑM|u,|“€!ñe¿àhåϵ~ýÕ̶«qûÞ®/˜57†¬°ÕV¿È¼Ùäe¥·B}éü½„_k¨»êàûƒlÉ_Ñ ÇfÕËyãqÀWAwsCÚl®·É-ôœ¸´nåu½â™õæ\Ѓ}`D°{Á/¿Éàü²Z˜o5¾¢`¯Ðéí0ú+âæoœíþ33/êÿù²Å¿ÿ»¿¿ùõOÿûïç—9S§ibq˜ÌÝkañ€Ì,3œeO{ MµöÓT²³µ¾ uÜhÀè0Æؘì4Ò¼ÑÜÈ\ƒƒ“³T¢W˜ ÏD“â$ üÌdè™]‘‚6hxÉbUÿÇjØNÊŒÕ)‹ÄŒTÔ—­Òˆ«ÀxÐ\tj­ÇÖy7àøC‡`J¨#r!Ýû ¢!¹¸þNÏ0G´Õé×3€l0G¬«D™–V X]jÿmÜ{ƒ Vh…¬¬OµL“ÜR^Ü&½8Nddñ’]z¢Ò,£ftC¬ƒŸÉŒl-Z·ŽL`ä#í2 JAæŠ,+0C¶å2–ªð‚èñ¹ !åKEÿR·”(uãG²že"6ŒûÕyô°À\š-T@_ÓukÇF©ƒKFLVè…µ«µÉKõ飅™M ó‡9^²ü&ÐÓÁ¿ûÀNµf4={ûéh‡äS퀕'M¥g¦þæ{O9ŠñP£GDË LEë§—SFYk©O‡¿ýøŸü³ÿbS¸sGá\f±©˜ÑÃsåcA|[8yçÊŸð®UØ©6úªH¿üù_| {%û6ÒÏùõ_DïÛùÞü¾YøòU±ô¶å]\œ zõÚqâ XÎ Úû"zxhºvÛÛ ûµmãÙ×¾„Uµ“¡ÙTÿýrCî×ùú èüÇ}®{¯dõeÒÖãŸþÜ4r•çôÆëÚ›'UðjÙ»ö_ë€?—ÜëA2ýZÆþf_ãË¿ö–ŧ}ksùžì¢~Æåò+~QWòìA˜ýZ¨ô{™m¹®.J)ߥz×ôùÅ£4~ÑŒå7]¿Ñó¾˜,]KÖßðò®°EÔÏŠk_IhÓ5‡W–`¾g„.åñËY‰KGÌõ°Ò €÷F?;^ »&ckHª‡â²®ÿq•QàšøÜÚYß Ðw™-\}ôxÏÞÔ|mw?N3³«ê•k÷Ýë{®wÎ2n²’z%¸¸t³ê&ø¨ ë(ãßzñx¤õ+9žkn¤ÿ3ög$.s™üá÷?¸’½·ñŸ^~ÿ©OÑB™p¯ÓÁŠ'ÄAÿ/»[ôÈ^j-pJµÖ…4°ï)’'RJIÅiî­5õp÷é© Ü~72f0’­Ùܼz™Û¬tQ3N…6=—ãÜ s¥Xûïþ{÷‰NÌ}ø…ED¶Ö_æ˜#N³³”Z’ˆl@˜yf¦hE¤ˆ¤s;ØqÆû,ÔùE”Ó…€¥úxÌ‚¡©U³1_†zH”˜E „@t´« aÙƒJA$(Ä -ŽÐP6§ HDMÍ€ZkWËž™0K1i2Ã@çø¤çFLÑ#Ñ5è&¤ï=ÍݼÈÞÆUëܠѨc¡ äi>õL1¼G†@dª>“*nHDfö.HØú&¦ÂŒHŒ¥˜Ñ-3æc«‡’hƒx¤X<Ñ‘ ÑíùB(g͈'r,! œ Ѽ.5Ýêˆy¸'@œh L ¨‹ ²!!P¥"gº«½¼˜¶loƒ8….2™¦áF“ Oƒè&ia$Ó£¤EÐÁYjB'=tÿ‡)hˆæ©^T ìÈÐé vL³uòB y²¦~²cM‡ÑüP§†|é‘ÊÅæŽ(?ÌMÀS±öIš—B‰¦%krŒ<ÐCYÕù2÷¦$õ\÷ž8¥„—bîz"³¦$&Hʉ‰ú ÌDd:iÉJtd4*+¦Ì”L( Ð"Ùç }’u_JêÆ–7ZC¬'Ñ4´csPèmÎØãr\:l–DZ€Ã–ÂA€u™Î0êßØÐ©  a¸A¹2î‡VŽ…À zG™ÖÞÖ(Р¿,€Ã èV“$3z¶6=}0ŸÚáó¤,ít¤Rê‘i«áîPR†Bˆˆh@Ou“áE0à Í=cjsŒž”>/~Å‹#ï/°2üˆÞ„ŒÑY øÙÖÞÍ õ¥Åa$6øÙ5—IdBÖÅh!/˜êÚ#E˜!s*¼ ,(ss÷œLÕ>NV†R?Îü=‚׺%^ëõü¢ð?7Lüùo£ëšfý’jì; Ð_Mä^mŠÍù¸vþç…ʼi°~øÃgÿ_lÔÀÒs÷Œ~vµûkg±­6÷ª‹èæjor|íòÕþuwCíÜþ¿o;Çýy‡?oèü›ããfÁÓëË>¿íùò‘A÷;›0v] þXOsSʉwì1ÝË6ù2f¹pÁSŸY{¼ps û"oðóVxM!ØNÛ½p«•òv/]„BmÉ9çûµþáÒT²ùo;µ¿zCþÝÀ·—s?•nÞtáð¾ËïÒ({óÓCÁ랣ÿf1q1õä=oåªDâ"´LµQjo4´×"‡=2ãÐQ·ÉÂó¡ÿ\-|Å®oîqáuï î}£í#×ތ맠3Sfí1Õæ&m‹¬¯ZG·ê¡ôˆ’Gñâ·|*Š3Ühð~júŒršë"N©Òtøn‚‘'É þTÑ’,†þÿïËa'FبõVFvêÇ—œg&Œ–h-”R ç^¤ù(”Õ¥øâ«ÄÕñr!q1ù¼À“xYRÀŲhà*ý‡À³ði‹j9Z †Hs‡õꄾ€1rC”ôT¢ÍMJÅÝÌ"’–¢¡ mN÷HÀæfJ!”xqˆ¡HóbŽˆ$ƒF€3dnV-CÕ*Â:Î3“ÌqüÔÉÖ 5 I}†x½l¾¢Àð¢Lp33c>Rfö>÷®ç罇ÒÓÏå¨Þ>£E"O)"pxœ÷zôqfèãÙÎP’m °B‰˜‘ ¥’pÀšÁ# FP ¦¦÷!r"M ”`@YtN’‰‡Ýk Z@t4Óh> éÔ @Dræd’>t\(’’i‡#H!¦H#W„žÀð<µç†u×Õªbé«È,6$V››¢‹à“Ã(§1¥¸›²¥ypë­C¡BqRR X€çè½G¦„ 4ª%†'*abÖRjD$ T[6#‡ïçÔRYH„ÒÒ"#ôµlv┑¢8AÔœ1’gK >ÑgdÂ+²/x. ê¡X(4c~Ñá´…3ºdrU´±ö p[½ ˆG}^̥͗I=já[V—4µÌ롯Ÿ¡Cbœà.súS1/©$Õ•MJº×©Ò Df&²Bè¡V+Xœ62W)5Ím¤W$º1Ò²ÔŠ,èMI¨/iV¨ ¬0-isÐ9rT4IÃ4¸¯6PHÃ9À@¾|ýJ.i·%¦$Ái¹ÉHôÐ@v€ ¨¾$EÌ©n¤“Õž&ãTNµLOîÕÂ=+¢–õP~Sý8ã»Z¾û—b@|š³ÔöùÄOåßþÇAÄð†Ö쇩N,jÕ4yq’Ù³gÏì=ZS¤¬^‡õñoþùÿùÌ験|´=ŠŒ¤ê6¡©¸ 2ßQêu#ål«È«#üûô>è+8,nÎ.j½ n«ÍÎl•- õüÖZ‡ë™Kkø¹þÜ]¬Áåòaœ³Xv¨ê×2ÐYé¼0qîÂ=ÈõâeÃkàMÌ{¬ÔrHÕ ºÉµpƒozR¾ÔmƒaÞ֘ߜFù ²SÜws2ó>”Ýõ 8Ëû@ýÕ4Ôv _Z5îÈ(çsË5ãúúëÝáÕ¹½½BØu"¾ÿÜxå]‹0ÄÆüc;ˆyÓÖs›QÀ¶*ס;M?»ÍéwEQ›±3QÑ09A:,O‘-óàVݘìJ“ŠЩ£EcJˆˆžÏµT후¢;‘d “ Ÿ#›4!¸ä@L¨ÆTCɱ7éI–-"T&l¡gŒ5E¡ŒfØJH!hÉ .ùë²–/…€*Ÿà`խǃááJ®™y ؀¬´¸vã¢ø:}–%µ&‚¾èSÓóòeZ2:W÷h(k+À`qÓ…0Òˆ*ÑS£'Ìþ2{1?LniE†Œ¹ÑUŸê‡¿þ.g½üð){Ëh†t2Π¢æ$®<1{*z šƒÊH(RH Àð¾àP,‹ÉhZrG`É£HËõGHBŽÔHY쫳,Úr •ÊÊë/p_º.r¸ Ða‰‘£¡HøPÑLÉY´Yl&) Í ÜÈ©p:>бT;XðÒõ91Ÿd¨žì‚?ý–eÊèÛç“ÿ£¿òß”0žŽ-~|ñ¿®¨E)z:Ô©Fdë 2d(WúìÁ'/OÓÓ÷ÿ£ÿäonÃT.Ý`ì¢O\„#þ"uÞ7ü~Y‘#ö0ãW•÷ÁÌUs-÷•wEdïkoÿê¾û/¿üHûÕ!\¹6.|$ù…±.wÈîþæö!ÞˆþÛ16ª:¾ð[ëË0ßÙéÍW Øÿp÷wb‡=ÅWŠÈµc¼'¸ïcŘ~ÝtlŽP:þÁ@ç·áF÷ßïtù’>÷ æþá¼.•¥ïš›å^¯ÜHÿ_¹–¿Õ“÷k”^Ý4àæÛ2®1ô+½•¿ö×¹L÷â÷þU}Þ;Ohc£ûþ`t'°iŽ»*~ÌXü•î^7ࢯW‰ïs; ¼ë0}äuö®Ô~qÉ#à_ÓÊõ§Œ]Iÿ7†Æ¥éîÓ§73/‚~ú7¿kÇY½ghŒiV«‡“ô4ÑÍK)SUÊk%‘=Zïî& õ^|˜ùR@öhmn½Sé6½ôVq ÙæS¦A°M0éÇÏš›¢úËìS‰Ì"±”È0ã  ‚Bš—©Ä÷ßJ™S`2‚©©¹>½ÄË)ާ±Öeaó«iæHåZÂO3å üŸ‘ðsrÓ‘H”²Z.ŒìU â¦kô"#ÚR­<*ýK9?¸€Øû¼ú ÛêGº²ÑèHj!¾ÚB³Ù‘ÀI˜=Z†3$ ¡+8=U/}tOŒ,F†ÜånÑ ž©ÏT¨¯™38ŸN½%Q¬ˆf~HV|:½£ °0÷‡¥m0vZ=#Ï"ƒŠBô öfö „G7sþôr"ê%#@ó"Ò—¥Ó¢'…˜—mXrPfmI'dm'Ð õµå(¨X—Å+ËøLëD2¤$'¢†…Ò T.Yå]¡Ëb,êÉ BaF Pˆ .t{°‡à"%M–ra°¥a² AB´D4-JGK„PJNÅ2£J ¥LMùYéZÏgó$ ÓTZφ˜Ü$T·9âàtG…5äÝÅ,Ma<Í4 ꩃé7¥|n=…É1¾,ÌÆ-dÅÚFPC‡âÈÈ×6Ò…í3HP 1s±"‰RA'9¤ “„òRlnœ.¢ìˆ-mµà>ç¸|¥ýä:1mXv]YªÝ¶^@hqçöieÙ×Àe€9|Âé3Æub-xƘNËÔAt"UÌZ"»Œ HEÏhVÊq°âÿ2 ¤ŒMí§ì?(O^'˧ÞLÔ©—Ì“¨ÏŽ”¤l‚¡7°rêp¨Ã Å6L‹pŒšÐí97âçú“c¥²º„íÃCB† ä`r° 'Œ(eé›ì'X…½Ä‹8’ݼ–xcÿî«‘¥´j³—éà‡‰~,•l‚§—CV©òÑÌÍÐ?ŠçÓôé‡íyòÃ3ÀfDöN#)[C-½÷̤„ŒÌŒÖç—So’×âÓôôýÇÿì¿ø/pks·Ý+/}ÏÒ· Þ‡[áÝÿ}éIýF™¹„þçïð€Áù‹“aÏ!üÏFùËGi¿—ÝWG¼×§]'n‹ï,FÀÌv5åo’¸>ø|ÍSæ^Éð¯SÒx×l¿/ÍÃcÄ»ïüÙ)úzDñÕÿt¡ó¿èP¯¬Âo·zï[™ìæù=Žû¶ï{ø¾° iÿ­û×}•ý¹ã-{›Õ$•¥íb¹ð65[B ïÕ±DB“ ìúò· Ü£š7óNG‘ .úžqžø›znÜø‰ëòÞ$l·Ûï ïK©77OgÅGzµv|{{wŠ^yëF¿<ç\Í-äÀd“>g‡ïb´§kÞÖÈîð'Ö¯» Ï/Œ ê±#Í+æzEl=÷rKGÒ á7ÐŽëË¿Ÿ”W¿s•ùö³ÄW °]ôÈõ‡sCCÁ]fB׿tÏLc?ÜN£ÍZé]¼×'unZž‘.•/w3ñjDo  a?^k ¹ÁÃãÒÚ©«?ßô/¹üضcÓ¹.b8W°ÝQ¶ÎËÙõN íÃÐæþœ›K¸šxlVeîì–›CÏ­nÜ43^×¶<öì½,OW¨)`wÖ@µ~Ô[æÜì|'vëÆ‰áœÂ¸ àý¬ÿv­³J×Ýμ€'I^/&:¯áZw‰ 7hÄŸé4;uçEnë]|†Lk—ZÈMÎõêV¬{É­ðùÑ‹×Íg ^ñÒîf Ö[¢ “êµPïj r‰Ü›^qUº üîKUx×@²ÞÚÛ¾‡›``oáä6»rw®xµ…™ëJyÓq^vÆ[Â7¾ÇCê¦øn‡¥¶>¨7Ï»Ez;…?—Ò¾ufiQ`$üôã'£8ýôÒNó|œ•ª¥¦gVÌiVÜŠ÷bBì={6˜› Û[Š0s7‹Ì| 9ÙZkF˜3‡ÓO…9#ƒ˜‡tš:Î0ö—9'ïN´®È8ésBà±ó¥ŸªE-ò_üÙ:¢G¨‡è> â&fË8âØã™ÊìdR7º™SæZVJ3) Vxo`]ŠŽmh÷Rk)ñÊÓ¸pGðw,7@oˆ@ÆBÏ%ð¹PØÂ Žì pø°¶É)”á¸ÚGS_ôkØéÑ Y} x_vC„†ÿçÐLÝ ™§S(àÕêdê)£}Žpž&¥rw’Îòéó±Xdöúìý4wƒ9 hs?!áuBà§ŸæèQêÈ|†º Ð<"Deݦ?äµg˜™EkÑ%¡N:{ Ÿ&š[FAô¹÷éÀìŠÙkõìm~IÒ>|x>ŽÑÓ â$$Ð)GÄ¢Óg:a‚C fƒ1Ä IFFg¼3©Ž¡ø/ÄŸn€TÒr,s™H" ‚`64eHY¦Šp=]=KÇÜ%˜”³¡‚l8:THI3A£«g>‰ÓçP¤^º‘pçDæœ=én™áÑ;ˆCqK0U †bÕQÕ>ˆ7«@[N<´EúW"Gý~±˜Özp¤`bCDúår‘Å—dÀäpCÌ™¤Áýï3ŒpƒárÎp‡¹•"{F3a‰É5ˆèˆ¤ѲY†{2„ñ í÷ìo˜©ùdå`TËöCÆKf‚ý l@ÃîLÁ&‚‰.¤@ Hè¹ä,ÈMTÊuîKJrÙ¾s¥šŽL$¡¹8L߃§B`ùb Ù,X-ˆ¹åóóä>¡g´f“’ÀTxs6Ó‹8Y)Õ£ 9*ß{ù«gÑäÇF+¬³’5çS̳>øóÔ~8ÆO'DÚós&Ò¬× ­³P1Œa–vÑPöˆÖ³õŒ€ÒÌÊTþ/ÿ·ÿ«Rf”r㦹ªr›C…Î#‡—ÍN¨¶ ×8A7à{írï’sØ~9o¢èêøq„¹ ÎÆÅ¸îÜž¶¡òªë–uÃóiRÛØL;'þKä´†¥·gÏmñ¨ÞÁM oäB“¹µî@^)B7Àá=™ls¿× Ö}MÒ ýÃdÌýûïr/oþæ|ž¹þEÜ6·ÿU+]órnnË›”KÝ5’àqÓÆƒšý-€GgaíþõXâ¼Mi\\¶7ú}ÌL~•~}¸7ZeŸ‹Ž·‡D¿œ"/“gAm6Ýþ–î zîY@o‰ò÷jâþ‘áÏ:¿c›“u%®îRg·Ãx!òFk7G Åš+†×à2nÚî—«W¾žÃùnàkrÕ¯Üä›%f;—y%é€Or tº&ÿ|aáûú,´‘Ëwô{÷­ þX^2o˜šóuÑûµ ³°çj½åNíÒ-ö“ÕÛ»H¼•¸º¦¥ëŽ£kÅ ·äòÇ÷Õû’§¬½«åÕ—¼|Ùݱþ k^½î½"Þ™|ùû¾¡]=îãx®¬'Þül¾šíæ;/ 6¸;x¸;rôÞÅ@?³hãuJ¿`=ëÆ;¶{úøÕg¼Ñp‡¨<¯ÚØ0m)•øÿYŽ? þ×ñïΚ²¿ðÜÙð&‹ñFjíK7¤mâÿZQ}C½d‡¸8^/F÷¶ÛCÂ]%>79¿ûàì¼í™ žÊMÌt×°»OóîsÁë×›3Y¯tìØ^Ið=Îþð æÆ]ãì] ÊÝZŠwÆW™Nn7›7Dù»ããù·½î«dßi½_yõ—wx[¦KÆkä ì¼büþw?ˆè’N?¾´¹GkÑ;šùa2ÂÝ@ºJ!Góx)eníøé³WŸ¦ À0®¤zP½êÑ =" ÍÝ2#Z#­!ÓÝá¤w£2‘–¤M‡Lqž³ºGâÔ]j=Ø:Z-)aØtúÛa “ÐZ̧޳‡|*9°'©LyÒR=zö0({dˆZhâCô2`%m©áÄ«;0Æ[Î"“LŠcf1;$m¿=-‰–ù\Íi-2R‰,ðè ÈI‡rÔª/‘‘éDK)’²"uà§æ( ‘ÀÅÁY È(‚§„÷áU¹±k¡¢ƒ3ss$ˆQWN¤2Á&–Ò{Rp,”žaÒ«\sc‰5}3P°X¢%óenŽ4FÚ`µºyú+_˜½£/Ç õ–åWÀ¥'À OÃK‡ý„h½¶òK&¨8Ì`O¢4¦D›;Ë@!Gm}tàÍ,¡&4S!RD°dª Gã‹æ—”ËF÷ Œ/ê?š™ KzU$²g6ÅÈ*"t¤@[1>216Lhõß–»%ÖÛ¸z1Óa¾ Ë’-5<@œ`ã+B/0q‚ɪ¬L¢»:Œsën¬ß}@Wô„ÑÄL Vì`‡ƒ•§2ÕÊŠß·8É^bé9˜ª}|›Äp7Uö—–ÇßMÿè·üîÙDûî ¥œ~÷c|x /R(ÂJ!I7Õ¿ù/ÿËQ ±0$pU¤´îæK…­ô0|ùŠçwtð•mª%ß(´Û ›·'}íQxvñªïok7¿î¾ mÇ£Ú/‘Ò^¹w<¥/8fÞWÙ¿ÓAêõ„Á—tܦ+î%Ñ/-‘þ9UÕ^Qÿwõå÷|×2Ì] þg`4vgÖ~ õ{n ¯+ ´…é™¶3Ùÿ!t¼:ÿø¦]{¿9…y¿Ú­ù›ëþêMFívÅûÕmÿ¨¯r÷TõÍû5¾dG{ï\ì9õÍi ;kâóã_FË_^yýY¿ôóq”›F€_Áëm$–ð'²©në_¾ø¹Ü#€ð—Íà/¯×Có»ëM¾êßüëCÒÌÍìå÷?µSë­eD)ÕŠÑ i „Tqãô„TŸçˆ™´¹QPKu#³ÞgÒ” ¦ (äVœæ¥æé„L{ªÙçÉ©þrôbÉ"¦SnÓÐ)[·“£:ÕBM²TþíßzBÙÐ3Ns¶†Ä|:úi"¡ dö¹»‰èáÅ0x÷„U‡‰ ´¥º÷EÏ¢! ›d}"WÅß|1þú¾é✫ðPÿ˜­bâZw¼Á±:œ%N”Qà<”GZµ ¦z˜O'6®ÙR9èçÎÒ£³Àêê*¬%W‘§ñDL‡©"9·l½O‡ @=XD¹Éžæù$É ÓÇ"󜥦¢È™¿û@òóçSDÏ*w™™Ì2S=3åð¢@·´¥:;ʵï-„›ùS–‚LÌŸŒá­‡)m‘2óãKK¥µXÏh½çŒ”iÖñ‚L½³¸*]'…Ktåј耥d`#“C¦`B4SІžÔ L˜PhŠš)¥F¡¢ ¤ƒ{>jÜm”AcÃЙv"ˆ.UBOµ('ZÀGÊx  æ”›Uf$d()„y5‰OÕR9¿¨ÂBcŠfEp™‘pFK?8D:1‘™ŠHw›¬D*G„±:çŽãѳ 5\X+`7ºÌßrÏ^ŸܤmT±iáíÃÝ$ÖtSO{†0ðá§ðfhî<Ÿ×½U^ºEÙmU|¾²#lþ½®WhÏë6\p3+¹ëìÇz^Ͻ߷ôfuÕCœ·òKÁùe!}Imo髟¶mÈx£Óó Ó¿é~ÞVáH;õÒë±éNÝ×¶ƒM›¿® X°1û[ùÃŽÜ«Öä‹oï&„¾»÷ü£su VØ®fû¹. {•$›ž Ýì¾{åÿ› ”Û v™WÔfõæ+kã¹ÃW0î¯6Ô1®Øk¯´¬Þö§pmæÄ^#Â5ÐŒ£àµ€Wúj7£™¯Å‘wÁû¦;®7µfç°ëôÓKôø»¿û;¥O‰vj}n½wsš‹[qå0Edf0Ÿf¥¸× ¥'ZëVü0MfˆÈÞBŒR IEŒ-6%Œ¥Ï³”µº«÷yv/‹lÉÈ¥ŠÕüá(c#™ž‘ö2[ {f1#ÍØ !aòOÿï¿E&2ÛqFŸÙ#z“€–]G ©=ÕHÒæÙ#Ò%¡0ŒÀþ‡go.®ž@ð•ó3tÃÔ2¼,ÔþÁJ¡ F|ñìõß/,̼®“ΡŠáOl/(@Ÿ 12myÿñÙ™g=xm1·~²QMÕjÉ~ŠÈR¦§ÃÇ´Ó:aêgÏÎ*¥D$-i ÉbE(!§‘F•C=,á®Y-%3[o‘æ æùDxdHyz™%´6 ͨâ%"ã” ÕZN½„GÌ“‚úZGŒ% †2¹ÓºpøÙ&uE´ÈË£ >‰‘bIc7¦²³Àmi¯Ñkñsý˜9`ë¹Ë ÝO`_LγZ·È¥Ç" 6D·…›$Ž

3'¢°T±ö¹ì0D6÷°b4ƒº÷@ï'THt;G¯õ»i*ñÝ”N?åôýaÏí嘿û)Ÿ&>?—¿ú¾ZÀ¨ÉÙ\Eú|ÒwKY Ï{Wq?ëynÈT¡þÿŸþÃjî‡ÏÿÖ¿ûo¯à–1ZµšOs7Æßþ—Û"ŒµÁå.:ý í”çsǹ­è•RÞ«z|^ƒ—àf|è}„rëGº{:Ý|·õÌ_"Néî.Ÿ ¸o£î]ôÍ•¬ôzh·èÖÞibÿ\©Mh{@Ö¬êæ¶ìvšžn¯_ÿ½mï¥lüöú¹©ƒÏaJxÜ{ o6 \Ѿå[¦+úé¹|åöç׊[í^vNøàz0E:»Þ¶˜oürÚÚë]èÛä©ó¥/'.=¶±ÞŠQ×TÞ=RèöÎÜ ’­³÷[æÏ:¿z¼‰™ÚÈW‹3{ùé[ÂÏÍ¡ñÖ_úæÔªòˆïôÎÅö›x>ïìm×s|ÿHËs =Y·Å‹*gâÍå ßÚXòÕ´¿(ý²XqÜhô™ì(ÿzߩԽf==” ‰Ú›ÕðL¶Ð6íCÞïʯµá­|£6”îÇ.ÚP[µUýôž…sW¢‹¹o¤¿^}öûÁýL­¾.a·³`ó&ës=l1ÿz-‰ò¥yC¾Åãyåy£]€ñzœ}Ù&g®ˆ_³œ¼ì|­Iínvé랥Þv±Þ™È|çW»žQwsù± y¡ŸðþQtxŸÄÛ®›ŸáîW¼ßàW´c$±¹@^, xÍ×Y£Ÿw¶W]Р²L׉mÔcîæ›o×Ã}ûà"ó.Ÿôp£}Ðͺ%`b?³ÅkëõØðp6¦ gdÞM„Š+©Áÿ*Ûý`ëÜY¹Ì Þ¤œ÷×îOnœï8¯á+«‹¾>¹ä'‰w`·Èï-—øµ5‡kr–fÜ]gÆYÿøÃ§Óqþ»õ¯SB&ÍŒ¤{´Éܬ–ò<ÁÌȈÈÞ5ˆ´b=z‹äг •½cXK˜Q édºõJ §ÙaÀ¨LK?·t7£º2¸Y*qìúá…n¡„;‹ŸJ)}†‘ÌÎHTïÙñ?þ¿¼Gï­Ï§˜³+AÑçY6l82 ¢ êö”7‡âcg3.Ú" †µ)¸ˆbX`‰síö’ñ)Èî±Õ>tRçŸÀXó1 dpC®¬ž¡¸bqÇ)„ñ;nææÑg§ZÂà(™aæýÔç–^Œ^diÃOÓŒ¹·•¯®´IféVšû\Y8M‡!ì[­µ·t+ã{‹1ûÓÇJG@ˆ<ÔçÏíSôH% ó|:Ôéyª§9 ,ŘFdçž‘#šðtÄ °c.ÎÆ Ðáf0k©Þøù‡Rˆ9zöaf-Jª´§Ãà?Σ¦;Ç>ñPœ¦ê˜K-qŠ!·Ö¼³CTHžÁ™š. 3RDì‰ ŠçȰ†/›h!ŒnÀb‘ª"B˜ÅaÀL[ö%†üž4üžOBÈJp–zÊ€gC„E4`)×Tê” :LœNTêô¢SF!@:mVϰ‚FGu: P™S¡eƨžqì"ûS)u2O™=ÈÌPŠ"2MÃŒÚÍç¹W¢:Ê´g/‘P|u‹Iщ4=Z¶å…%3€P'‰@F­”¦ã€L-Þ ^‘LT[àòÄRõs¥?–º{?cè3,‰YºŒÙbè=yw”ÄÅ`I99X\ ¸ƒ2"²!:˜ 3ÇŸ €^a21»LÃ6àkÀ$#ÌxÈ e3¼šÁÂÈžŸ²xùHMìiIDO4ª›¡Ë":clr™rôiåË& ëêŠì‹Í/úâµ -¢? öÅäœ\Ò–2xYxb2ŒÓÌÍÊÉð N¤•ÃS¦ÌkskaS¡zï^R©YH3+ÆjL|*Þ>‹,FËœ2~ÒËé8±”¿>p2R™ Jÿô9Üóã¡þö;ÿþûˆ˜<†‹"BúüÒŸžð\¼™¥$Ð|`–3…hÑ[ËŒTêŸüGÿ”æÓÓáðü<âÇ\#(ž‰Îo˜®X˜¯U‚¼uf½*¿©ÒÜ)F×E‰Ø) ¹ƒldÁð,{¼Iª¸ýK~}¬ò(>»¯ÝÕú¿TÿÂWÁmxW¦hÿµÊcÞýÞž_ÏL|}Hù(ÜÆ¾¼þÑð|¯;yímý¹>jSbu…aÝýЇY‡ë3ݾ£›o¬'îÏÎܾáÜ|ÏÄ]”e^{®åG7¸2ž{ï)åæn¼’t¹qZ}tÞýÇ)/=’¯¯çWtåý)pUéõgýzϳ[_z·dTä'`¿(õë»!¡Wýåõ—×_^ÿ ^t>úÌÌÌŸÓvG.B+{P¾9V½WU?à½Ã_^æ¯[Gœ‡ÇHí4ÿ›ÿõ_)E7¯u +/%3ªt+Ó™VÌ'†a!){D^Ü‹“t·”Ü `ô®Þ%ˆHš»ÕZ¢3PD©^Yœ™Ù]ttµ´ìqL›ŠULÿø#ˆz K´Ho½Eƒµ²UËCùá¿ý¯=3#²…Ú\¬dôY³"zd†Œ ”y&6ä òº»±`èÃ#-_ƒs- *íl×nFY:DÔiQü# „•«Ä{b‘Ï2ÑGÍ»†èËSi€¥W𠆌äZŸ™Ê.ų?Ï}Žl‡‰&ï½75+ÈD*3bš¦Þç¹Í£éÂ(SéV”Èâl/­T#Ðc.æÃ÷²·yšj ©f4gaagë£?ÀËÜúéÔ2D‡Þˆè30ÕJ 3_ŽÇH´6š=²82‘}Á¯]5G³GÇCj¥+ÅkA?õHƒ9îÕ«N½;‰Ãa:¾D& šd…ï>~è=_Ž­A&Ù™qlh© QÙ˜a–4¢Q]Œ«Š ¹ ƒY%„ð" Ôb‰ž\ü]‰„zи ]EíÄYpêPÕ;Cðà¨xN!˜«)»l˜áþ”J *èB¤` sL¦Hû‚Ùàõ¸¡ HÕ•(‡Üôc¨:î-5g'YÍ2åС¸‘sÀ¨j42„â-2ÇŒÌ"FÙ}:Hjª4·&ö”:iôéØ8ÒÃC‘OI(’=e’ÀrreÒ,ùf ÀD˜¡;üÌÀµxŸV+…F‹¡.”K%þècÞ%D€zX>Ò6ŽÌ#E—«ñœƒÓ¥sCãjõ! xÌ9¬ˆ‘ 8Ìk\›3†ŸÈbL$‘mš ²ê¥TЙ„•RžI¯‡ïÜ>ôY‰ô© %†UÖé9Òøôì®—ßýsZ*”2%ÒL–1¨%ïDRèBt##×%—?»ÖKo{¢€è\|¹B`°²$íà „•âþÚ9“Y!)yD# óÒe­Eâ“3Ó_Ž`kO¥¸hO¥þU©ß=y2N)„æ¡8žžÛÜÁ"¥|J1#{Kýö{+% Äó«žäÜ›ÑÊ4æ3IJDïѺ枽#òŸüÇÿ‰›—C}úøá»¿þ>31ìßy¶HÕ?˜¨ÊÌò/¡Ó_^yý¹Nð¿Ü‚?ÍÃ܆ò¸ ã‹äˆ÷Déaóöh¹Ïµ¸î¸·e•. mI8_t¹¯$ùvÜ€7×vÝÔw}éwïwéŸԿ^£B®Þó¦Ìó•šgÛÎÍ,ظ\ýŽ(Þ•ï~ƒ«¶„ÛN°WÛ¨Wæ¥Wr·Íà¼s÷ %¯¾Ô÷Õ;ý–·V {e ·$¢×®gŸA£›k;·êBÚ­i¿–êæË¯ñ~ö®èŽu›ÿæúñÚ]{Çr©€¸ïÏÐf ¿ifõêx{õŠD½³Xo¼å# ·¡ûoÞÝöOÝ¿u!6·öç­Ò¸sYºÆÆoŠõqÓô¾·¿­%×EgÊòç·“™û6Ý ¯‹”öÊóoÛ·ÿóu.Üvß¼ÿªÿ1ÍöY_Weð¦øã•jÝíý¤mÀJ;¥%›wî°º†Öðµq=þ³dÞ{ØkÇòíËðg·1 v\³õîßL¾~þì·nz/p±‘_ ´¶Mð=k7Ä ˜ìýNÙZý+µà«8ÆìvðlKiþçÿçÿ§Ï  ;Ëa*Å“”dîÕ0="‚„O•ÑK­$ç6+G-°±f‘J£Ñ()#Ç`³ñŸE(NpÉ‹”ÙÙÜžŒ9ü9çÞ¸RùÃKdhªÅ©œJ#*ȧª|yù—ÿÓi>RéHÌ/Çb%#£¿ˆŠHF•îW!Ì(±ØŸD,Ò˜!m÷Ï `¹Ø¢¦v$”p_~2rU4mÇ|’A4À#¶LŽ4´3\LG‡¯f¹„¦'x*Ï™8Æ‹2‡ñ€[-^2`Åb²’µkn½)ØÓác)¥µ!½Ljóó‡i=zk­7L¥–C¢‰Îâf 2Â'3#Ž4³Z xùéØZÕ£—CfDö€O^>†’Dq;ͧPJ %ÅVЊ€Mˆ†ÊwÐ åzsr‰JÌÌŒ}î€=-JñÞ”Ín†Ì™°âåÇrš{ÖÝdµ–ÈÊVq`í­©§›·¢áµ0Ð+F°€bIÀQŒ&hBà«T*H“™ØÍM f±'žNE|,‚Â1–5vøÛ¦#š:Pœc˜Í©™Ƀ/’F!JD<áÆ`@±Ì\šO´c.zô*€¯¨8#…‰n´OÑ35LædLÈ’T…”áDÄheÑœéF_ˆi°ÄÁÌ@ˆJÍ=I<×Ò{*•D)nЬ02BPOå@ê’“’rÐrÄ©DPÚ–3ó2þ›dÔÐî'ªjz Š\‹÷wÞ|BŒ°„¨‹ë†aIŒEÖí²óeÂbåÉ›y!¥(†´K ¤¼@2–I=Vr/0,,¡KOÏøÅD;Â+¼"´&c† ŒþbV<`ô2·2•±,«‘Íd‰†'ãdNEÊrHØyìé ÷ãQYÍd†Lö£üiªO_~÷3Ò#©e8'<AÙ–ýùÀ|ŒPÊŠ5`"ÈŽñBë…k3A…U„ Nc… PɺH!«cšl'*¬*½+J9öèsH6}p„E8à ªò¯Jæï?M^ü{¢@’?0²ÀòcøÔ?÷ 'NìÉß|d±ž@Ÿ&Ì$™`DHŠÈTªÏ-ZÏ9þÉøOé^j™žõP?üõov`'ÜÇIêa¤Ž›øÎ™éáA㤠×PÀKÇò–LyMÙ꺩Oß^á&<Þ· ~]uºþ Üâ=õ®ã‹ÞÈy³\ý•£á+¤š{œˆ6i]—vrK2]—¸ííÕC ¼Öjò÷â‰Ý盿¿FÝ n¶˜¿Ò}þ­„Â7?L€o>üþ¹¿Ó\Wï>¾ÞŽó»Gõž#ßùP'Ýuâ¯Sã*bÌÞyíý7ÿ¼³ð¸à^€z´Œ=^ˆþd¡óûëÕõà ë¥C¯.*½ÒFÞŸ÷/ãÜ(vÇn:Ó_Vå㘰û^é±xS°øâi~oc~s›ÆxÌýWò›ÕüPYÐ2‰b‡vôʤÖýˆ×© |]f¾VÉïítµ\¾.Ó_F›o··Vm‡ßaá ¯…Ÿû¨>¾M›/'="ápÞ¿ªþÈ3ž\[¥r‹Oº‹ôöõÜ=ª­§÷ª¾*êîåtÎøÜÞæKǾì´ÃßÚÑÿÏïx¯J_V ;NÎg#hO³ç{Dm¾²RóÁßä×\÷Þí~Ô¶8fCpâú_wB!ï>h 9ot÷;EQw’äæ‚öæÁuÒƒ—·Û鼯:Þ¤„øð†]šf·˜}èll¡ó x°üJ‘vo»\ÊEDçmïv­ÚøÐßwœê>”á¾ÉõœYý¸¤n·ƒ`{Ï7ô+nGëp£W`™›ŒÏ6¨Ù$¯v‡+^=]dÕm3ÚÝ;\ àîÎaUÿ3S¯†È›µ{ó3ë`¹Ç] Ÿ»$G\¼eÎwáüÛëN»m&=ï3â¼v9ZkãÕÓ£dé½zþÂÊWç$¾O¿¿>èŠ\´Ôoëõeóòµß"Ìm·hìð²ø¨zàÊ„cSãðð tž?nøßî€çLèòÅ ]èü‰&oÂÜÿåü—í4g V§ÃÓÅÌK*Í\ŠZ§y>‘Vj wî¥÷J3Fëч7337J2 ÷N·âî^Ù32Ü-2ØÓ 7«¦Ž,•< fÖÑY ÛÜÛ± Î:”Ù{(äµÔS÷¹Åÿòÿm½zOŸz?1½MvÈè4{Ït¯ÙÂlQä½ 9p€ªm9jbÀ:†Xo cTòŽüèKÙç`õtH _{ˆû.°ò2À;À!” >Ô4@B4ÀávYJ¿ÐQ`.ÄŒhÈúâDú¶Áj)©.FôÌð>”bŸ~xÁGMG…›3£a޳èùùs³©û$3N)Íœplé%†(}næþô—lø· 8<L­”¤ÇT‹±F q*õÃqþ!c­˜#æE ÍXÊË*]bS/$ ™±Œü®Ä‰ Ü¬õ® .4ž<ž^²£V›êÄáåË4E~øðt<Í‘Ùz/nmƧŸŽ'/“ÕòTÛ|Š^XI%eÊ’…d3 4ÿl*Ý|e%”A•L—yöÆ‹ƒY"™€F (tDÀÀbèRd4g2;a ¤è¦bÉÞ§lŸ~R#½˜uõ„ÁV9Ò…”˪…8Ÿ­–DŸC«õ’æ´‚á2¡@r198oKf`,^SE°HÑEs‘ÑÃ&÷È’mŽ ²´;Ð>ÖÞ2:ÊÁŒ%Ãk:OD$~cö›g?LÑÄÔówìãÁì0241]µÚ÷‹×#“n¥T™éø?~Âw8𠣉Þ;ÀˆŒ¹©G´½ÿÿÁ(ršêÓw~óÿjn-zø7ZšBF^ó§âµïŽpgq‹gÜ”z\Ÿ÷^Áá¾&h½ÚK™ä9ô×>;eÁQow>^|P{£·$×;~øÅ=‹Ø±óy[¶÷¶º 6oþm(ø¦"¹-âÙõCzý jÕ×§{M»ä뜢{TÑCIn7ѲKÑ9‘Ýgö@ Ô#qðJ'~Ud?Èe«Mï”¶ÏBâ&ƒrñ¸ùœ7 ·×öNYs”Èlsìd´òÍ•ðFÉóëõ¾pÅíåXxý*¯¥óþ¤¸@˜v=þHù…°}ý/n?ÆúOá/¯?õÿøèóßWBó>¤þa]G·¿êÌþN©ËÛÛù•eëp•ëë]¡Ï^ÛÖnà]ïÆ­cðUà Ù+?Ë_lzþåõ‹o“çS7…S²Íÿîïÿù÷?Í/'õLÂÍÊTmª ¼z±BðR§-¥aÆÞ»‘LYŽŠÐé^6CR›c Msw_L­irš­`›QL§~PsSCZ4w A™íØ ¸™·žè½ô1ñ2?!§—ù/•=ú<çÖ^,Tí hBNN¨÷Ììm6OA9tÄÁíÙR É0Ħ;i‘ò H”ºhdK¿VÕ—²îKùððµ²píK]À#@hB$Œ¨‡µ²8A $ÛÒ!&"qøˆ2e¢ÀÀõ„N‘ ¡µ™†§ÃDqêÞsýH£(77cë­L„éØNþÔé(Å•ŽÁôñ§$À(ž¿û¤Ÿ"ÕŽöôÝäšÚT«2Ië‘=zk0B8”ùÓ§{d)V';ÍŸéJ(Zœ 21$ÇR °vr²eÈž§Bœ²¡H6Â2µ˜º$7zD˜™§|‚[•xz € ²ÚÓót8ˆbÖl­Gàp(­ÅKβ(‘©¨Nè@‘%¬Ðf3Q@LVÊl™5)-î½)›ØÂ]4 –'YÅá‰jlPKÙâè{ÈŽÌaE– â"Æ–l!@Å­P]ÊEÅ£S&ѶÞpè ôáÞšLS¥E¨ºÔ†·6â»ê¤½Ýl”[TÉ® ˜¡T"S“yWB fV‘JΙ.Ò̪{gLÎÌ42 ÙRÏq ‹¦oK KújÅ÷SK|– —rs•‚pø„Ã2$À `!Ï §hËEd/¶ÌPúj¸}ˆAmZôË‹F³KÏÁÙ{ €†ë†VoÛ1¤‡†ý†/Þ¿¥ ŸÀ JŒ¯6V­U}²#Ço l‘C†>c²û…\~ /b@w²ò¹Òž JK37aXQ Ôã”k-VL †‚@öx9õœÝcNp1ÞpO´Ž”ý3²Ã "‡ÿöò¥:0˜O Ul5ZXº¹}ižÈ2 ,0¢8B-q*håØ8•b~ˆ!š)ͧ¤I©:¹üørŠÖÁ ©GªuÒëá©ê‡ï>"ˆÎêEÍ Ó¥âÔùüA0OÙë¡ ½çôñù¥÷0ËjýØÕÌó”˜*ÿú7¹VÚôÜ=2"ZÄ<+òßùwÿ½ÕŸ¾ûð›ü×9ZWxQvÏ¡ðŸ‚ÒpgA¨¯©ÿÄNE?ã‚ÿ4ê—ßq~æÙÍ+üGÂýþ#?×Sp?SÉâ·Ÿ2õøðéñE õæ ¥_!÷íìkøk>V¿ÊvYŒvŵ–ô•À%íò äôZ½ô¦ÊîÝJ³´‹< v™ —´¯v®e‰ÍÇYææ^Ê¡ú¡xõÈÌÔt˜  §zhÑ{„ûD²µyÔÜF§qiL.E4H½«{ñQ6:B—BZtDTz/ÅŒT-Š8O­å‡‡ú$E¶N°|š¦òá Ÿ^Ú©ÍÿòòŽìêÙ8‡¢[D‰a=lîn^ „²N•JFÐ-•èr[¤y ÆQU L_ÍH·OÒ£\«õî:¨Í±øÍ\†}ÔP/ÊÚÐÎ Äø³cá¶­\jr§Ð¨ŸÅÂ7‡Æ´\œN§g˜-Ò¿9œV˳€—ùÅaO‘ùçzj9ôy¿1Ÿæ§Ã¥¦²øä^`‰€ ™µzyj§8”çÓOŸž¦"3 î8<Õh٦Ȝ~<ÍŸ§ŠúüôñÔ^`i²iz:Ž^ åü2[I®-©#{‘¹ø" á„f€Aˆ:¡[ïP»G1±ç9hŠYŸž'ÂæÓ hš*ÉynVês!§C™ç.áóO§N§H?òÎøð}i§9ò(B',b0…«ˆ‘(@£ 0¥Á]ì  ™ ˜Ìž|›¦¨P'dRiœ„N±ÀªJ7 §Åì6Žpdʳ:Z¨ 3CBHh" 20÷†c‡‘O–£~œŠÔÁ•¤Mnnž!AÅ Vz†W£›z°‹@G:é«wd¨nF¶&ºYf*i两. éÆPÌ‘p—Áæ¶èì$0‡lÝôÔH’D!†ùôp3ÖQ¥¨~¸JI8u   ½€Å"Ö›#nkÎXïÎY´uõtkr.ùEÔ†P&À¡¾4÷Œ+Èd[ƒ–c‚M€ÐNðwÄ÷W´€ìhr€xB­ÞÝn°4;Ž®>æxŠÀd­†z" ÜÝ?€ª™¤Áг”h‘щ’øw¾¶Ì=Ãà/¢ Øåðên Ôæ¼YÎÊÓeÍ)ºì¿qâº}ù£Ú(;‘H22•anÒZA¶IZjѳhPYŸsÀë Öဴõ/´Ÿñ—ãmúC+"܈̋’ÃnÔÁ¯P[ʇë(eáü°Â¸ÂFÖ2äzXàæH3f§þ2†rž!£Y¶“{MÅT¦Þ[MÍäÍZFÖ¹•©¼¸S®wÔò•åƒ\¥~°ZžÊÓtúôÓœs( ûñÓéÇ'¥ú©1>ÔßL‡çãqîáæ[ò—ð7ÕWïb±îù&N€¾È‰d¡äÜÃ@%Zë@"pŠÄ€FóÁñØ>~x*6‘ƒªÏÖôûß¿¨µ¸[=Ô9Nð8To1Ï YR4. CR„:‘ðI ÊL-3¤i–úÌšN ‹]¦ZPŠêãÝLµ"îzþ€S‡÷a‹ÌQÅíYi,ùé ‡BÀ2³TegJ^T&Z°DÔ±˜$LTÇa'Ä”&Àh!Ós-ǹ#h(n̤yD4uÉLaP !T‡œ(†bì5\sê‚Æ¢€ZÐS–h"]1ÿf^Ø¡N!&_ ÜÙC=–î–4Tž ó¡,˜¾‡MH“X G2ÐNË„%$ÒáËÔ¸h¼ÇJ§RKÛD®s|‰í«ðŸÐ‰èPÀ'€Èy6ú®àjàDÓ3JYkä±: K  >/8 Ñ4ö$²€ô5–ZR‰/ðRʇ„MåCÄš•©Ô‰î§O™’ ˆ`*"ÍÍÌÔ#22;s65 P€ŽìÝ4ÆÃ)-‡¡¶ }…ü ÅrÍÃâÚqùúã&+Á ýláà‰ÅÏ|äŸP–‰Ó §ß³|—LÁš•2UÒŠ :„ìÇFŠ®Ã‡Ú›NÇaYìO^¼<‰î¥Àøü¾ï‚2çgO8œµv¹;8M¥>¹¹Rñ騿 YduBͰ""ÒŒ"•RD÷¬µl©ÿŸü/åé»ýïü##{„™/‡è%<:K«jxgFbGmxIM¡y]a]\¢ô³OõEºô†mñpòfØ¢kï~]ÌNT¢ëúG}µ‹Ù;‚š+¡ƒû¥ë|ðP [7?¶Šr 6º©závl,G±PÒWvÅý]ûžbôµÂé­Zef7™×?èžJt“ey]2¾þË›6mΩ·o[ò…;;ÝéWºæ°_A…¸¡|_赓Zˆõô|ûtnÍ+$^óY7ßw+€èçýšƒÝ~¢ko ×Dœ8Ðù;ýçæÆ­Ü®¢åƒ{µ¾ÞÒÄùZŠõ­´®KÅ~¯ŒÔÍpsC{íu7ß§ü1z´î:ö@Áßàþ\u<Ú¡y‘g¨ÝT¿ñ#ûê$×v>éáÚôÞ0@HyýÙ¿ô ¦ï·º þA¿µp×ÌpÿÍöÅÃMÀý¢òØ…êµJo~Uéq¦ûzk½u*úêgý…h|Ñú¢ ­õÞŸêÍ#Ü—¿9¾1:÷ÜZ¾èm¿xÄ/|܇çÓK…ÖNÝno_Àûõ¥·Í©éœõ-~øáÇÏ¿ÿ±½Ìmn½GfZq¯Åkõ©Z1: ”â"%Dï${/Å͇i|Ž™g&Í,‘™™©!î·1(Ëä0Êͬ {bn, õ®A» õ™ú cŸç~ìÊRìPó؃ÐsÍÿùtC-vŠèìáÑ-5y½ÏJs1BÍäfÑâÅ µ "s¤»W÷`|K`Yï¡>£¯hÈEo0ý°UùB"ŠUÚ[¥­Ô‘ó[YYþrQܶz„ö†Rv):È„08¡†¾”;”¤H/v4(”9ç YÌ(p·½ØtøX¬öžŸO?|*OÕ="Nùùó¬òŒÃwÓñÇðŠ,dv’ ͧÔ²NÊVÄé©~@žŽŸ~zúÞ{dZÿ<ÿÀ˜B-?ç' ‘Ià¨Ïgæ pA£ªZ‘LB¥jxpTÜ}!’3U`ÆšDô6ô‡éitœ›¤Cͧ6Ÿ¢µ.qšž•øôÓ‹óZÌðr:– ?æ6Ëf"ã Ó³E 2Õ§2Ÿ:rXû‚G†k<¦0Y#Ƶæ<¥”#‰MAQIC)ôPÙ%sãéÑXk¦  ’] ©8Œ &ˆ-`d¤MR¤$Zš¨SÀH‡z¢CN–O@Ê?gÒXHƒ˜ª+ŒH‰’ƒ’ùì¥ ÓP’@‹‹p ÑPz‡¤›©9ÒÍ*ñDw‘‚A”"e„%•Êj¡!œZ~ž[<8LFQ h]ƒ5nZŒlÕÆÀtGýü^>£M¤Ã€˜DyB©è'ø+Ë(¢¡a„;†U¸ú‚ð"‡­Â²ŠF¬¥XÃc¥ù™…Ô§Eaɾè,^ë#p_KãGn/5|†Û"÷¦¥Ý§ÍPùª#Ç\ž«pòas†ÔÎRžúq.Óæî.5OR-¤t+$©@E¦Ì̲g{16©As?¡½PGcP="ˆXŠúS(r´çæ bÍYæšbt˜” ˜KF†}'D(0ÔªÑF2ÌL@o™9×ÉyjÂbít8ЪG›ja=ÔéûHg‡Ñ§¨Ÿ2B‡ß<ýÕoS¿{¶ñûO™´ß~8!¥ @-x>t$Üh…hž;{˜ÑÌ$7Ù{ï‘¡Þz¶P §épøîÃoÿÿÖˆL2sž¤­§Ó‡GÔ_ãqTo$¾Eìô3Îp¿ÌýºóýúÊ€wÆeäƒ/ȯ7EK_×ðõúé«ïóþòÿ7Î_…ÿŠcáöÖ½"LëUGf>6Æ}]jÿ¢¾„½³‘øåOH_z{ñgß]¸.çþeJíot—Óð/ŸJïërym}“5Df÷öýÏEˆïQËÙo…_yFþš]î¦øYÐŽ*ÿêröû¹”Ü”ëêaàJß#¡‡ÉuÑïÚú†Wå,¾w.ñ]ÿkm›¸c²s7þÚ4ä¯:Éõž™ðæÕϽŠ×îáÞ„Ò,øüƘ´›gþN¶ÆE¿\×]9}ƒëâ·ÿéGµ3¼VüïiW£„\{ýçÖÉ{úõÀÃFƯ¤9ÝôF{°ïßÁ/09¸7;”Oÿ႒案O§k ­;(ÌTIBÖž–0¹‘˜’ ®ì ÓÙ thý H—./«fçK ¾ÞQëèk¬WÐACÄ"/á^Ã>€¡Td_@"gò™("‰2Ñ¡¶\ƒ`mP":$.ÌÀÏih§ˆ¹Kíð-Oi4rLtšÉùéØz&Šc¾´wd¢Ç讟 ©,¥„¬`w<ÿõ{ôýgd ÕÞÁ²RÓÓóÆÅKhK¡ÑÈD.X›³-‡qéMY ;kò`[¥ wd_È62ø °ò•4šZ–Æ -o˜KÚ¯ÔÕ,7­Ü&dFØ †u¸c"B§8‘‡"?DÒJ%*«/n½¥š•h©6„ueÄ‹ØKu:šZÄ'æ'Ø™­tœŽ° ,ÌÔèvÊþ>+¦”™–”ƪa™ƒ\†ùAÌkÕ¿ƒHÄ ( (è(ÅáÁN÷ZªY,-]Q*…ÑzÌyLVáû:Õß<Á«{}*åå4Ç4ñCf)Ó‡bÏOŸŸÚ|ÒS-ÓÔ_ŽæBÏã§#?~„SU¤’eîý©f!˜ÑŒ$k‰¹ELeföÔªþÓøOÿÓÿܪøëß47#{ïA;[dòumèöXÊ/Í¿BjÑnµòã““ôÕÐò¯.З*ôÿgïÏšdI’,Mìf5s¿™Y½àiú¡ÌÒSCxôÿÿà „¦3h¢Â »ª2#îu3UæƒQ3WÛÜýÞ¸¹VZ&Ef¸››©ŠÊz˜ù;r%{÷]7&¦« ¯‡îîÞ·ûð·åo]áf©’©¦É¿½qÿèŸ<¢öž7Û×ïiãýf¼ê‘ˆGÆÔ·)Y´t¾êVºw…×…Æ[ÿíSQÂ׆¬.~çÄ~nü®/þJøð{¿ßçIý…@ç·oØâº×>ðEçz2¹­ÈÞèÉz€¸{ò½-d9 é›êö„«p·næ.Û ÷ªjî ¨M óvŒm?Ó̰­má‰ÿÕ78ã5ÿªœäHmÞ•œ?¦íß ìÓ’GÙ¿ Ŭ•]Ô¼Ìõ¤ó 4à)Èw]»ƒû²ë:§ØözÎMh\{±ÖøÁeZ¥N‚³6 Ï{«„Þºbð䆸çµpãbǸNZ¼d¥œH CÅ?­©ÜÐø¯€oì^Á4wF›:I¾Ü›kófc´Ù"öÑ#lÍneëGsðЉ\ÿð^}ÆM.S¾æ»Bm‹T.(ëW;Zmtû –õ%kBÛpI9ÒuEŒNG¢;ƒãJÖ}Þö¦Äöië~ÚöÜâD.Bò<ß Öz¼BZx1!\óùpQªÅM|¼£ÕÙüýº3ñ\AvQµ{?@ÁÄ“¯@ÜRÉ.ñ º3;m÷µç]Å¥¹Æë<öFñ)®Ó_.zþò¤óÑõ:=¦y^8®½åîÍ×õPú¿‚«éDƒßa±emJ‰¥;Xù‹Ùm `ûÀ1ëÑÖð6kéjU¾T…ïN¼§ŸB·†îä»ñ'ò›âºn-Ü"€Ä1í-Þ<èÞIÌÑ#p]pÜ®ÚD0Õeå'±ïÝ6äö¿7“Ƨu.¡ß ­Sƒ5ªWøäÖ„Gwö¹a s~÷»ßw±|9ö¥·eÉ¥Yŧ np³ZëTÌè´uj2º›•R2Bв,Ý}Ee†›kõ©Œ‡è%Ëîn„9˜ÒÖ# œòxà2(>°bzÈ–^3 zùÇÃô¼CSDÇ´o½k_ñ¿ý':DZæ¥fF›‰L6wô@N¬çâNPKäX ¬"c¥`›ùºH¬YÀ±Ê—²Wsàóî/õŠ÷Y}G¹ú_Í×Õ)aD,h XQ&¸#c%†›€@™ D.H½V$œ‰"ÃwTŒrîÊÓ§'ƒÍ/‡h½oÑŽ‘°ó‚̰ÌÌÖæžvOSÝyÁq>F.t,-ÀìÇ´©:Yàš ™?ýÝ—Ö»Oá˜:Z¢§"æ>ýE4x‹€PQͽqéZýBÏIK–Èe-°Ð ô#è¯n¢…¯Ëcæš” F˜-‹"BË’ÀRŠ›U%ªSÆÝ´Ÿ*¼ø—χtLÏ¥”òòò¦Opcëj}¦%˜´R÷Ñ-Íuìs23ˆ/xÑ~åë9ÀFcY(¢£5;UDK˜&a0ô U ªƒ0U‡'甀{’ÄJXåˆ!‘ˆàÈ`B¥Èd=©Ón9’"[À  Ó$)† ¨‡]@„hb¡ö Bçš­Z¬xQï–Ø{N¼‰qÇ*$¤ðwÕ¢+3EÖzo9Œ`D á8w©t'4 9 @KRÉ<1/bøk{‚¡Ò°ûÊX 6”àkäÌ€,§êaÚƒ†è0¢/§Üy!;¢ŸÂo9ÀF+Ó_Jx9ñ$¨“ùÇÙÄð $z[›…D4¡Ž×ÃaéŒì Ö‹ññ PÀ÷k¹Àðñ­2­‡`†È‚~@ñô+ó§]hߟ˜;úylTl$èÓ ¸ë„©8ZDæ1ÕŸ3Ronˆ¡È 0LϤ™¤Þ ‚à\ ™b uíKõˆìK†üÒVÏ’Á=K:r4jŸÖª‹¹Ù´óŽFTZ‘Ø{ÒÒ,n pÑ@ ¯-êäÏ>ùnŸabQ™Ì”KÞ[~zbvX–çépluWÔ=ZúÓþH7Z̽“´¹ñØè´buWvMRFôÌl±ô–=³õìÀkù×ÿíWw»§ßühdq7·WŒ÷é"J~<û[z=`Ü죮Ç|n˜ _C¸Øª\Ï^m߸9S¬æ†Û á…@zb‰òâ8¶u#û©ýêLô ÷,‰žT¡·Ää+Ý[ÌM}kQðv¹ÃbOMúJÄ|•?åËoäŠ]s÷¦¾6Ïè®Ú¸ùíÝ“üujÝ#ŽÐ£ {õX»éÜŒ“»ç›³|yíÔÉ‹¾}4·xØ-^éZ²?KZÚ2µ=æŸ ß¸Áa} ŽÂG™ÊÌeü‹Î_ÝùS5Çì´Wš­®ÅÉ‘xMH%ÝHåÛù7>+ÿ„+þ$¢KÒÕˆCCÙdh^¥þoµoé{çGÔ¢ûÞ¹ßVpëŒûfßGø\ÅOyk½ûûŸP>¾_ù¾áÈó–ç] ;šÜ·Tü’Aÿ{y>ïU¼“Œ¡?\_ûªŠ9]ÿÙU”æâÆîâÏžàº?ÿê=ÍÛóÑ;~M_Óô¸^öÂS_½OyˆåÑûÖÍÛ%ó÷7Xoûç/(°å¦à²m¾µ@îûÞ—öïÒ™Þ=ö÷ŒÌ^‹OÕ á–€L=–)¹Øz“è¥DRJË¥àn¤Eon>Ζ¶:EÈ(ƒŒ,¶ÞSè`O´Ñlfº=O µŸ^2ÂRéè/KG–©@Ñû‚2‘ì­¿ü§ÿèÆ¡ DJy<ÎÙæ ™ê¢€ÈÀb„#Ñ‘žÔ0cõ:Ð!Á ,+Ô›ZSì­®¿Û¸mæÊÄ VÅpgt˜ã5£Vði-ð$¨AÄÈŒ÷Ýk²°û 0É@Ù­|s÷“‡ðÉE€vÊAJ£Ù®–:ygë³Z¯îÏûçCÇ’ÙŽQеÞw»)"[k¥Tƒ‘8._ õÓôãχŸ—Þ§©¨Ûóói°”÷2A]­ÔÚ»dQ‹?‡Díùô›©æŸþ!ü›i‰Ö2)CzX çdiu ,R™ÍsÚ‰»2¢·ðìQ9±‚Ô 4x#¢e*§]Íi¡±N^§RÓ¢£ÖÒZ§ÊÒ’tÛUû´Û5 3 š#—*>ÑZ[²îl7í–yé(¢#3ØÈ@4a(û‚:àAd’!,@rro`rš¤d ¸4!0¹ÜD#CuÑ­gȰç® ™Á‹Š1ºRp0;Ðe ªT—ÍÁ ¨EXJ²~âÈ’Ï9A‰É}±CD,B!I˜d^ø\§9:Á9£õ0@d´$Ñ-‘©4’fâŸZ³%B¢ÁéÇ%„b¶«už[Ë4®¾Çq‰X8Û˜@¤¬(?€{•Šî'×Ù¡Ò' Ðf<}ˆ²„LØ Ã50Aç2¢P#z”}}s­ÅY©í#¢vr¬Í±§ È:ë1ásµî3ÀÚ½ÖåtÀP|f1;\h¯‰&k6ä}±¦Ï[EÙÁwð RƒMkôZ™Ñˆb,ÌÁ)’eFë„¡8"Žê3úQñÂhhF®m˜‚»ØB Àö³VÝ»’i))›¢¡¬ k –93ÒʉZf«jAJäq]{3Ô§!O”Z*m}¸©0 «Fö¥²NÞ[îJI*P~¬“É-§üéh¿žÂ¬“ž˜z§OO¿Ú/=K¯»jn,¬?>ÛÒ3BÕ[ }@èö{ÛOtÏÈ\ šAšçKGföˆ¥+À¿ú7ÿöÓo~õü›_EomYÌÌÌ A²×µNÿ5ˆÊë]¹n‘Ô¿DjÑ %gÙï¸Õù~¼Þ }ÞóGtÆ7D¯‚|ÛÿxÀÆxìU\Å]ÞøÌ_^ðqøÒÇUãG¾ßvÁ¯Ü÷<¾¿ç^å÷ ¥³Ãðñã7Ÿù+7þR ó÷ÔñÛ ~@J¿µL¸?·?®x%Ë}äãŸÎ«|koЕèüáçc«§þÀkívSAÝ“Eôµ+Ò×b¼ÞÄø‘¸ñàÑMÓþÞÿ‡ÓЯ+<øgyß´àÙü*¥ë®ÛÍè;÷ófÉ­îíüõ ]n·z¤Cã‚t뿺éMžÝcº®I,_“Üþõ€_ žóNd3Í\o·dµ_¼oùÔ9Ýõïý“ÚHmÊ~ù`>slˆ;ðï?ߤ¯¾¤ï¹¹É+ùþOð¢XçìÍõ5·û»ßþtœg7s÷Ú˼DöÞcéq²F,Õm*0ÈnÕH’©‘Ï8¬ekfFFå4H Cë/n§¤²ìÕ JpÂFZ¤’df`n¶+$¦_íÑ*‰ø]ÏùT="Ž-æ„ÙÒ:J±RãÐ㇬µ¼üÇÿ¨ˆp;„Ý\Œý¸´YM”à1œïô,f ´¬ÙÈ’2ÊÒËërp.ª‚ k%rD¾J]ƒœ²’J´æ(@ôS­"2WGP+ #$Ðá¶(Qž×¨@qÄ‚8ÙÿŽ íô!í$—‘1 ”íª:Zt£OõIÊ—ãËpoxšö ¶œ³Ó´óå¸(ùü›Of¥weÊl*½u¯™ÉØMu·¯æöyîö¼{ÖÓËï~¹IŽÄ¤/¿‘Ë-ÛðT)A”bFäÊa÷& ˺C”Ý2A¢wd€„Mkšöˆ¾ë_ ˆ„h­wöLÁ j)™BftÍóÒ;ŠO ¯}îbÿôãtx9†~îèeÂq9î¦}©»%û²ÄþW6•ÚzÈãaN¤&`X:îJ(&¦+ (ÖÁZ7(P`\B(šŒ Û/ÒO³d®ÂÁdš»"P“­I¬5÷ž —¹![Ò7§’ IL!E*ÍhdeR!x@¸¡¬ñvÐÊÈàŒ p(àV!„LeOÝKöîÆB3a*åK´˜[gîh™©Ò¥(f¥˜4 Sád( 42¡€ŒŠd)6Ó=Ø!…–¹·H ÔáEŠ2Bc"PÆ¿údÉØàVÑô\ª}š|^^~w8fôôâË(RyYøôCžZ¤•’‘431N9+Ñ»R$­8"¢¥ŒÌÞ²ÅPÿÿ›ýov?“6 ò:kè·X°¿òVâ¥QñzkFâÝ(Á=ñ‚¸°!}4á…e:ÎØ²~âtƒÔkNÌU'ô8&s rxÅ¡ ³”3‡èõΠ•“òwïó¯°,6§çR+b“0~;¼ë÷rkÜÞï=2Ã6ÉËYaÛº•°Ny§ªB×eÚêȼ”¬…­ úmŒ·y+÷g¼b݃p7ÿãŠÉqº¤×[áfSu©ýŠÚ¦˜­ˆql*@OŸÎ°5êrˆœ|Et"ºß«ØD xÁ™ÚY®Æ¸þçò¡]Gžïš]¤œÄ!Ñ^ëý®½õZ4{¹¦è•\¢7¶!kPA:«ŒÚ0ÇnÁ,w×ÚÍL{#ÐoÄ×àˆž.Ò©;<œ›š§ÑRz âk„´yì›ÿ(­Ä¹Í,r;C\a‚ÎMIM+èî¶i/×Á«bðØ Cg^ñày µÜöÏQ¡Ír3ÆßÛÇ\53y§Ó¾y·W=ý e½œÍùp õ‘ÍÝJõ;¿Úl&xfØÝ ¥ÞþÂ×UgÃü»X÷.?O}-.>ð•~¸ý'.@dÜpÖäÓìZ €ÿ_þ^Zÿæðùe9Ìk*oDˆ´êÓÓžÅÍŒn‚h4zd¨µD$ ÌÈèÊà^¤ÌJ™áC×I¶ƒø?æÈz²RÊ,PZªcî43w‘½eœŽ¢4ËÞòKË`ýͧå·ÿ5~jm°«I¦È€RËÒç%[cD¬ÆÉ‹„DX@ypyÏ`y÷ "úÙ#qmÛL Ê0À~¡kÆëxÛð½!ûúüz‡Fòò™€Õ™s 6($QâkjþòÅmÿ´«™9°ûžŸvÙm7=}~ùÜæœP~øÕ¡Ù »Ý“c×ú¡÷C¢F¤±ÔR2sé­úTêä…‡ö¹°ìê§úé‡ùwŸ—9ŒŠ„›;ÊñïgÏÜÿ°cµd™'ÛdßÁ*Ì †‘hìÕÔ3ófH€b(ªÃ6kûœc rX2˜™×è-züÑ1Õ:Ô²L“þòr$1}*VûÀ1ÉFhÊæ¥õÀ´›œuáüóá „6§ÖT÷Ì",HWÒä 2i“#ú2Â9ÃCÕM*ažG¢­`2ÙFd'l=FpV."aÕxOÌ­ ¡Ú+S¡d1ÄX+Õ3"-B‡UÒ i4çà*eÀ¡Òœ9J*U³®4©ÀÌÍ€6¦œžÅÝJi$2bW¼÷qp·ÀñD&TÌC¦z¦\õIµr> s)Z£ Z€2b†Zm ò´ZjÏ94dÕA*ƒÃ°xLš«+GA)¯C5†«¶@öñ”O²¯ø~LÈQ¯# ã4x…äiauÞ^i6z%†¨¯«Ö(F1 }+ÔÁ•«8Èá ýŠùr‚~…ÍÈÙ: §\VÃ[¸Ã„bàP€hçøâd¼4T߉“a”1æÎ¤ºÐs‹/óá'ä±´¬‚Ñ„© îkùÂkqF¢…q zBîð¢Á7×g–H¸Bt,3J…M§]—€ 8¢Q*î…f€l8Z¸±«£\Œ¤›4=íJÚôÃsþ|œÂ³u3S±——Ùwõ×ÿâ‹O¿zŠñl>írÚ—n‘eªt[Z„!{ºf…–=¥”§*ªìTöÈ¥çÒzï ù¯þí¿>=ýøÏÀŒî“Ñzo2壘 ñú â†r>£œjXO ã3ÀòaŽéõÎíù;è]!嬩=ÜØlöóÌxùPªÊÚVW.¬ÃüçŽâ¶nÓïïüx>| ¸$"L™ý%Bä«\r©˜jãY¹…ü»ã½sæZvPL^éÝ>Ã×T6ç:¡?jÜw«?~at1¿«r¾û·ÔçV·_>ß­óæV©áµ„-Ð|KBc\:‘ï„1®Fú»l«i^™ H×銺‘’.ƒn¼´Ô»W²5ôº ãá¦KÿyCç·RØ9HyþÕÇLÔß*Ü׿$x+ÑW–og€}dãG ^õà{DRßtÄþ†É¶¼òÑÛZÊEë¿éñ‹·²th_™zÉß@½®ó–7å7^º#l¿žu/…à]öÝkÖµËðUøå½x7ðȰ¸^ö¿é å\[ßýx¸ë{'èÛÿ@›•íF(ýÈé­¦ø€Ãý}âø/º½‡ƒõaÀå¢(=ðUx„϶zÏ žÄÁ ÷îo«¸œ !·n*Îòþ)’ñ±íï}Ñ«n|†ùàLýfyïw‹?_pB/æîs w*ÞzŒ_±”¾9ÁðM¤­÷í}2Ûõ’¯ËHÙ×´¡ôím{ó¸õMã•ÛàêEiö÷«x{ÐWNëïFïMøß·@'Ý^»îå"œößãÿñ¿þCëaF¥|ùÝ—\Z´^KÍHwÂYk­ûÉŠ»›„„tÂwp£­”×!R¹âDÁhtÏžf Ñ”9ÌnW?ÖÑÓJÁÒÔOuY:–ÅÝ4G›iSµâd¡¥‹Š——"åÏÇ—Ï¿ÃÒ ¹´ áõPFö%úÑ ^-ý`®-ci0Ÿ,Q¨æn‡\,•Ýà' Çj x ŸÀ\“…qÇ‚`„•‘~¹^fùÑWê}yBt´¥À ™ˆ†ê«I©=VkÍ‚aš  Ïa ›äõÌÅiÉè)È ¬-¨§§i™—” 擽,/ÇùX v;+E/?{ÆTséóq>¤ºWîv¥·ùxìVj1›Û¡€¶<íž>é¶[þáËOÿóHS*sŸS¹{¶ÝS9´/VZ]LkAtd¢Øª½ÂaÄT+–ò2Ï=rš,"% #Ê ù°—ÞVpʨÀ¯*-„P¦•Ì,”©¾´ì³-½Ã,ÏOþéǽ”»]éŽÝ~Šeòò$£Ç2Õ©çÜ{ªƒ\ÅeLȼ>A6jL˜™&38Ø]ê(4tt¢A;SíÞ¨“A;P!AŠŽ Ø‰áGxC²C– Tœ‚§f!3Z5ïMiKFZðÕ7A²˜H©.¥F§‰e5fƒ èÁäB!teO"ˆR I&·§Z"ë—ù õH“ÜñTýóÒer Eo¡:Y5[2¨™ÃÜò™B¥7Œ²’qzG-&e&Ïõ–Iøp†>Åçó4a™Ã'`ª6ª­3Û™”5˜3 @èVa F°#}ÓZ§ è×"l༰„ôZ´|Ší p(OžñjŒ\õ}Œk”b\ثȨKH :Ž  ‚²ƒDƒ%0ƒö“¿HIÃ^Öi…ÅÁÌè#zR¼”jÃF!{ゥ/4-Ë—ÃçÈÞëV1Aƒi‚£’&àHdƒ@ëì— ^7³™†Á8 SdEgK(\ ÒKÂ÷0æ`v€ÑË>û~ØÅ¯ê2šÊXeŠOòh€Ûô\ü ”²Ô¢¹‰¾ó¢ŠCF­”Ó¾,íÓŽ¿zF-2³©Ln9à£àÅÌeÞGoƒvS1óÈè½K¢!D,ǹ/-«ÌÀbÓóîÇþ€¥”Þ.µH%éînv=©ëCÕý}€nOÃÄ €ñ¾9%Zß´i¿ Ï|gò[?æ+rA¾oÀ7æ•o3¡ÞÔÁñ'ÿºµ‹Øòëõ1‘ôná›}wÇߣ'õíýá½?”t©ëú,ß•_/µ×³X}QzïÄw+ÛT|HþkÀ/Q$î6¬Þ¬ :ޏš<âÏh~ø¿Þ <èCߟùý1 ×½–ô5Êñ/Ãçüiкô¶Àâ›þ‚_ÒD¶?µ–âïA•Ö/þ¨-ßãMÒÐ&Qþ¬÷ëTÅû®èwà?ü–&û±¬o§”ü“Ř ~o{æûzí;{~̾þ±'ØÆ¾Oå ¿…ͺ½ŒXÇiô#3éïïaœ½ô•½öp8JšÇÑbî.CûéE-²‡€aÈYŠ™;ˆÝÓnÚï$I™Ãép÷Öû`qg&͵ÖÌ}¸ý0ó¾,ú®öžn(æŠäš¾Ë€¥¼PR.1ü³7,Ý$s3#z"dD¾Œ.ÅKO¨—fʤP,Ö¤9sQ&iiš2E(êȬ.eÝ*KŸÛœ(Ê‘§oÙ z©ýç£ÁY ì€öæÄ(?1‚†þe´Õ/ôð[øû'´8Á!º ^@ M°ÓShó+öd|ûzdYà´}y†áK{1ªwPvqn&Ù<÷Rjq?–ùx4âéiªÓt<,­+{°LŸž~h½‘p3:õTËÒ jýäfýø2Ss(wSÁ‰4G‹%‹A–­Æí`ÌnX)õ à°jD ÝàÏf6E,@Âa´!÷æ=‡÷ïZ-r6O^¥Õ¤ÁÌŠWô–™Øí§%3ÏÏ“»õì­/°Le¦™ãð²XEô¨î¥–y™y£ÈêÚÎ… Y#&p‚ æs²À‚jAö5_˜;ºÉªJƒÁ–@ÓTÈÀQ@€bœ S/O&9fÌ'g: §<•b’T2I‘Ì'GI6…d "TXAÖ5÷a)'Ì,¡—T¡”1 èd…{¥D7¾+•@{ V«$ByhË—è»âûb“ÙÒ{HµÁ!€É >·4ZtEf*r€‹r¸}p_ËË¡¹ÈOEº¹fÉKÂð$©Še§tôD)§ÚšôÓá«Cg/_GÝ#ÛêÊ«XÉZµ 8 ¸#G j ÌašM0AÀ퉶×\¨Q⮊¿Fì*×8õ( 2 ÏPÇ á«SÅHœ]³›Nµú8ÂuLŽd°QDÒ€QîCXY=½³Á ¬2O«f´áfÓ$MÊðbðìmAMÙ•ê­¶˜‹uTxÁñg0P]ààÿŒ ‡b Ôe‡Ù×BŠá^@®•ÃY¾Z"W*—Êjç0Êwè(O'ü‘aDxŒ`)Vª™yñe^ꮎj§C4¸¡Š ™Ñ¼î¦jØÓç¥õ„Ùþ×ûßütˆÏ}ñeWͨòÃSÙw£³³äçÖ\½‰»}jåeMSQ®©9ÂÏôŒ­gëÙS!eš›Oå_ýÛ÷Ã?ÿ›âÞ##ÂÌÖ¿"Š9i›œY}Ï­éI¿ýe€ï¥ÂýÙïåÿÓ x‰ìø~mõK„V>º†?ñôþóÝ?ÿµ°ÿ¯¯?̹ƒZzS›~$½Aúàð8ÏEWá±7"d·¾ŽÛ·1û3Ã×ôêwÇBYù¥+Ëœ¼åï_ï¨hº“ewªZÃØÎÖ-ü#÷¸n:GUÅKŠn;¼H2¼ÔûðŽ(Àkeb|/îã¡siw´µÍ¼¥¥? Ênh-Ú–UðUF'XÄ[éšÜ:¡b½§Õ[¯]þ,‘Þ¹?½^¤ˆó.&äŸK‘W›Lí;D=²Ñ½â¸?Tu7— m´n VWÙÿz½YÜòx´-_ûØ^â–ÖÿáEŒúÊwø|î‹j>Ú8ašÎÖ­ÐxQ÷óZ-öú«+Õ¹bfÛÃ×zËËìvnÞ}.>M¾†; l7·½ˆÛ&>Zs+ ^˜õ¾µ;^o̯àÜ>¼Ím+Øx§ŸŸk‹Î£SNÄW˜ë!þJè×¹ùo·7IÒfnØÂÎA€S¤Î9¼œÀ7W{yû¯÷ºÆåµëNä¦xs[tÈÓB{g¶ÓÉø¯“î~jýíi©þÊÍ®Wnw¯wñZ=|F{(œó…ׇÏ×éöÞÞýwçw<ׯ›hÁíbýfï^¿?³Ótá-þºéüÛñóó\A~ì›qzýj¾`ÚüÙq>Ž‹ûíýGe*³õ$‘™Ù’@)…F«%%¯N²ºÉ 6X½õžîôK@Fm5ˡࡓ£¸@½ )Ê Œ$G^®èÄL"r°9G1+ûI‡EsT"CQL˜Ít‡e罩9¦t¥ÉªzëÉž6[ïý=CHfÂÔ®‚P„œ.¤,‰nV¬ø.8<|—}Žž ›"Û‚ ”É ´!c92ÖÖ Ú°=«ÿgŸwpVHˆ@©pC; µrKŒk6ñÀ í÷€¡w˜¯ñ€Ä orr1e"gȰÞgj9Î΄Áf•é‘ÍŠE­ìw»L,óB îÊÓþ‡Þ{ë½úÔ‚…ŨRÊqyYúò %Âbô¦Þ²-së ¤ý4…Jzµ]ÝÍó|B)7³*AL í¾T  :|øÏFÒÂK¥êþ_.‡ãâG 1MÕÝ—eÉže²©ìyÄ(Á†<—+2FB4(²©ed&è¡ÃQ û¼´X Úù´ --ëΞžw-ºyiÑÓSgß–Ia°¤KÀ“d0w)p×  F¤%:µP@-"F‡È?3`‰JÅ yÑ"µ\ã exG›šPÒc,`©±‹­!ƒ‹z¦U# }hÉ "…TRF˜ÑErèˆì`&ªšUæ1Q™¤Lš# n¦B‡Ñ"çhsæ±ßí"âØ#-*mç^és†ÃÜ4LŠXZp ÿS1|ÀPöT×vZçcÌ Ë@ËÀF‰­ÆÛl$'S‚i x&ÂuŠÅ)É:V(ÿHWb= \€¾þk1d_±Zrˆò‰Éû')‰08׸Ûi·Ä5Ú—ZëQο:… Öƒ[Ù”ck­5;‡Q¹2b™õ€•×µºr° N¯6}^½F9g]‹ùTà•¨ÊÔ²A3ºµ%Ž-—.ÍÊC? )ÀD;®þ½ËËÚnåTB\Ý’1\¸ƒÜe'*à°6+šŸRì"`#úŒlP_k)2`„U°®¶É^Öj*ZP `±Œ"–LÒK)Õ¬ºsãäÑÈ\:– QOS9ôJ7òi· gÛz1ÉóÄú'R=å¿ù±µž‰4óâ=5t™£FF”Z_‘K´eQV7»ú?ý/ÿá6Évì²ÌÝÝIšÙ†¤qý¸à ¾¢>x±qÜn ùÑ=Ì·qÏ}Ôy_Ë ƒ~ïì?7ä àëòyuyÆÞï/Sn‡r}Ö®2ù¸ ùá{‘/²©¥>).÷à¥çƒÆ]=ëV5»+ W'ß­âÊÛôͦWÔþ¶MzUŠúæÉèNïÚPIïœ.2¦ÉÜ(ß Ý]¾F¯|¨Enn…¸©ÄÝ^ÃmàmÍT_Ÿåtïé¼5„? ÿ¹«~®î¸Ô+õöÞ·¼6Þ¦ÞÊß{[þK…Îß@>ÐkÞ⯞ÂÙ-zm•Æ3°ùL'à*ȧá›ã²ô¾3ÓÞ°˜Þ7$ƒ2uÞy•WAY¼~àz¬¿Þ È<êœQ~kjíUiž./î ?DÞeG__ß+tZw¯B"+÷ú,Q¼/IÜEµßþ™nƒ_9x/…®7/çcœ¥“©÷B5î­Oç·ÎGÔý÷F ½‰wßÏ7¶2wΘ×ÓÆU6Æ;ç“Ëv¹\T¿~Óp±_Ü,VzØçyn‡ã/?ùüÓç¾ôqÈ3‚Ò«[)îdõb6Í¥V‘ö"IÅÍ̲Ǹ€yéÑÝK*¤¾ú+Jm1Ê”èÍ2 +²Sá`¶Ì¹sï4fDû¼X5úÊé?½(²ÔRÿæy0âñóÜÛÑ'—É­õ@ë½7+jޱsK¶¾,T¤”ÄjR,"FÛ?—Z}‰)«–=ÍÒ§`Ö§§:/Ër˜¸¨®šÍrÚÙÓóÓápˆ–‘pÁ㔜¹’jÔ`Æ5í] :”H‚¹rEŒ'’øÙAk,!H,تdkÊmö7 2Qv1·£*ë3Ü'_–9Õaåónâj\º)™=%|úôÜ{¯“òç/?-ËqÕ%Í <¶Co™‚Ùq7í»9º!œ¯=»z[™Œ†ìi^Ë䡦·5Â;üŠ•èw˜# Mô‹ƒó—ÒfLµ”}Àl™#2E`Á°‰XåZÀÈ5ùzŒŸˆ5“9ÔëKÎ/ÇhIG˹ÄîùiÂKd$'›JMJlsÌÉ5І÷ÀqÄ“è'À”ZÈ™XŒžLR¹#:˜ƒ‘Òà²ÂS’õhÐ)A^0%39g(%2Vè=¥š€ªnÁoBBI1×Ló9•’M ¸'  ‹•ë©¢I…2¡R¤%'3z@£Ï=úä¥xucDZ$+ž‹«"¥t£¯Sç#’jž4Z¨ÏMÜ4(:…”RfHè»ê/6 ¡ròÈh€ÉVël‡2Çê"[F ìÍÅ)[Ú¯Yÿ£©GÑÉJÊõmÑ`#lÐÐ…Œ×ÐW¸¢gd 3d ¬œ´r¾êþë¡ lbÛsÖÄù¡¿Uàì@c6,‘u>cžQwëȧu*`…QS£ì‘Æê=¼ýÈX´,†.}–E;ž\ ôáŠZÝ­‡—øÈÓ÷úª¼É£j'VÐÿˆ‚Œv‹¾ÎE#fÙsý4Fär†ÛZf!ÁŠ‘EA$”A3÷@qó©z­°R'·ð­AŠ> öy9ÎÝÿÅzšès›öµüðÏÈÌxYZƒ—*K•²ì§êæ¶k)2ãÈæÉH),‡Ë}ë±ôLóZþÍ¿ÿ[šÕÞRÎùþpw33³K“¢mZÕ=¦ê=c³‹‚?~ÖíCÇ®{R#ß?â}øþh¤‹=úÝÙ<©ïÕ ÷îk^_!cÜIçÀÝÖx;eçcöWßÒ$uø¦ë∉·Nßó†ÚþvpåQÏïÜöÓ}¾ª…·¾ë•’~ñxù`¿-"xîo£ÇDùoäeýÓ„ÎËT{k™p©¿nO¯œâÛ°Ï_«6îþP¯ï_ƥﶢý¾ø!Íí¯¯¿¾þ)¿ É­ÙõyððkÿBGÙû Äß÷,¦¢’ÆîöO”úZ^ð{>ÈnNÖwÜ«*þÁ«Ùÿ€WÚš÷½¹ý˜ó©Ðqèþ_¢w¤2¡LæÅDH¯Åkñꥺ{±õNã)Ó_Ì\ÊÁCÀð­$Rš[·Èýng£—f”Z3:3|èÙL¦ˆbD3}¸nνKýËbÅÊó®/Ý!N™½Çrh¥8[D;á¡ Rý‡TŒP³--{K,Ñ·@Ff*E¹Î…pˆ2Éi½õ(+Ó.8K0÷yéÜK)(6µÖJñ˜;-݇Å*)f‡5”º†Ýrs²ðºfôKíR×â$8݃Ó2ü{ Ô57v|8‡UOø Sœ@#7ÙGj'ö#l‚yw4L“?=ï3ñ%g3ÐrªE!^æCÙ—ÊRkI(²õNVLÙÐzôf Ûä»–s6 a†åДØÕ‰1ýKyª;›"»e‘™egV-£VFšÉÒŒ 1,PòÄé-[ôèAšçeyiþL‡½³ LÀa>F&Ç °[äIÍXã.Z³ª­ú´¼,«mCE6/xª“­Ç—ÃË®Úþ©Ì=zK¹$‰¤£»Ð`FR˜” ¼‘ÉWà“´^È6ƒ;¡#ÛPQ)ß–è ™Üt, ¥h¡&ÉH’iE{c o`*—1Ê4ž»µ&GV³.v ™•R&v,]i)KHî`‘ŠVª„ðD’l`¥ b8N¡»–™‰B©‡‘Í­€Fzûí|,®ÝdntÚTIÂHK¶ÈÖÑ• ¸+æ2gØ ðÁ¯Í}µÏ?«€sÏ# C/K[´†½Æf%ˆ –S;È€ê„ç'Dƒr/8b“é:›ýöeÍ4W¬ÖµîPEn¼ÍV—áA¨Wƒ\>Á¯ð“U¼jgrÊî-ýÜx¹êTÀ‘ÍZ´}*XY9E#´0êWüD*ëÊf‰v€Wüð7Рà uBÑ «%ª;Séýóa·ßÑ[k³šŠKZ8)—ŸF ލŸüòèë>| –œuÚEýˆµ¸¯³\ä)°' @ƒ ÙA;å3" ã¡ä)ÈÁ‡eî ÕY¥Â#V¦eñ v^áøÒsûõs}ªýxÚ¡ÿí¡N“ZºÌâyÏÏGupWìÓs­5Í—žXk£þ (晡žþ³Ì ™­+ÿÕûßퟟ>ýͯ¶5èka›²G’\w}ýõõ××ïùXñòæIäôoV¯Iÿúú 9ÿeÞù¾6\ñ{p|Gä*]ñã³AÑ)½ó6^}›U}/þ¼á”lòQo§“» š·ü>~·w&cÜùåõÿÛ°#Ö,Úmÿ6f~¶á¾WwsQ†Á÷”Þš‹ë-rͶÄ啸óú@¸eelü™Ö×yýž^©»&/YFÛHÛUqùî·³ãyýzÇ]’w* n–®[]òTlpeí¬Ë§EÜI.yåI𦙶Mq}YÚ”Y¼–œhwr¿öàN÷¸Éâ½ÛU^?æ5ò|çÙÞ:¤ðv¼3±]\<µ›|ÿGiÞw2Âï~Þ>çÓ”t5q›Ú¯O¸Û¯åÈ×͸žå.‰#º×ûN~\ÚN‘wJPÏê”6pY pN×ß¶Ò½J–sÿº™;xï+µq1ÞXˆŸ&>ÊÓy%ÛD¾{]å”ãÇ‹¾§ Wìr|¾k>Ëm€®-pïep¿ÞLJ¤íSÎVßt´·Í˜xÎC¸%úÝ+¹=Cd_g™»9ÛÙY|tý¯žöçtûËÔ:m6ú£ç–@ª×î÷–Qð6/ãQÅ;Ô³íö¦œ{ÃáÂ[(¼Ç Ív"¯ÇšÛ'y~óñxüé%¢gèåó¥”Íhn^‹›Ã9è¿ænî"K±2Mf&Á]Êé“™’²¸K&­NÚ)0ËKE[º@¥iá-hF ‹h/›[ýaBëöT£K¡è»Éž&ôˆèÌL‚sÏHÔädÚÇh‰côÞrö®ì=—c$"=³g¦:3EÕ‘z\ù ‰Lßišvëáe9.³¤2€R aó|ìÏOÄÜõ&ÁÍxùù@¦¢Á/¦ÈøXµ­š¾ÎV†h'áL+[‰²[ÙÙµ¬6›gÑIgŸa¬Žè+;~à5z[M8WI¬„ w˜[-;…Z,µúTö¥8„ÍŒû'/>ÍÇ #¼2#{CÅ&ÅÌ,eŠè©Ès)Ø=íŽÇ93Q ƱYѳ `‚²QIÄ–mž Ðh^S‘£Hìý ÂóÌ€„:Uc™ S‹Ý®«K[Ò:ÛïŸhmÎLÈRéVœ%ce"ãs¦\DjÙç…ÄîyZÚ"Oqˆ#•“‘ÌÞ³«±¢ԙдƒ•B@¬ èF{‚fô&,-…<Á¢l@EJüÙs¦U—@Q½C{ÁXL‘¤+J8(K3SxD »h0‘é$çLd¦T@6GÜ™MsÎÈ"¡¥ŠX EdbG°žVM!ÃÀ¨äÞ• ¾Dt©#äá@C,vZFKñÊäÎc„Rsv£XzôÌzªþ¹©g*F• ªÕþå¿ÐôIÿøÿÍêbJC.´%†M,*„²r°Ð¤“•šgÔ=0 :Ê„̬Ó(+xŠ™NíTasž ê§å$V+`&¿°SŠX/býmw¶„ SxÀÖÈ Œu€¯åà¶V¨ø0ÿ8™`#ˆ+¬yýyš+:À^‰|Y1ú Ã6cD)ÔÐ_¬>³ Ó™õÉz;ôÃ?”É•™ó’Bc¦BGPÏi³Ã¾ÞË0ïµ§h€€FÈd̜éx\ª••Qf¾F%×­†ÖˆÂ`½VÝŽÅ+ò 1jyXÀ̲¸ªE­õ©Z7¥³Ìl_§Z1÷®ÖçÉ~—â>Ǿ⇧úÏ~àTp쾟Ø3jÉŸô½OSëQv»$™I®ìþL!³·žÙ–†H iF/^¦úôã§O¿ùÕ)Rôzûa©b¼A^žqt¹ÝH¾µ Ð÷Ȭ¸«Ùü+Oè‰Û„ë[…á—‹D|p€ÒMfôé9 ¥«Šdðý¯º&?8\Ýr&/IØ·§ô¯JT¿{E§³Çž˜“w(@¿k«ûŒ—3êήø6-ýêÿß$ÍëVåÔ]ß6M½=ã\¾ÿú¨à]èÖÅ—nÏõ«Âè7*¼ó}U÷n)ÀÑŽG´¥[‚ÓU;ýòÜÿÇ¿ú3ƒÎÿÂq÷È%{U}¯¤5^j·•f¯Ÿ [©õ÷kg·í»Ï=ê;NDºÒåGsÝ´[žÍ|.l_ÅœÝÏØw$Ö75–{åhº+v¼jzDÓ–ˆÛgyO˜Ð¥w¥Í­¢Œ®ºýwëK üUæzŒ¼øÈ£ßܰ…¤_pȉ{ŒK>Ôõz­7EhÞ F\ót *¿Çy²e¸j¢cê1?侸ó“sŽ¼Ûšx¬ëÍ‘n÷·B—„o½ÙÖo„t‡Q±¹ò›ZÐ7·u_Á|yWPÓ6޲éÎÚF!ÎÊ´¶gWúî>ˆm¼†·ôú¹~>G>Ûƒ‘Þ™µ¥Þ>wnû7W£Û0£E=/⇺žMtq—ÚJªwÖÜMSlÓ»?Àc¿¬ûðê²E±n”ÙÓsi3"]ËôðwÿÆpB‹žälÞºÁÜ–Üž×»ÛíÂýõ˜|oáÙn8.Bº|޽fÝÝñã†øy—ûÿÖIò6`~²W¡.·¶güá ¹rÛDw7…W(Ãmgy=G_tß}à¡y1ï6?X:x=Ùk¤NÐÈsw>.‡Ÿ¿ÄÒ#B=>þ¬\ïÀ̽3ÂÌݬs³âRr³Rk y1%eË ánC7R°ˆÌL„î!ýŸ¤’„"³î`OôÅ‘4PÁžŠvø²ì`¥pyi–Œ™s€]ÅÁ]‰/Qé>Y@ù÷?GwK2{winõÞŽ_Ž‹hýpì]Ñ!eJê d'Ñ@0‡le¸Ó°§ýsX–æVÔ© ­Zm9»YfìvušÊáxèÇÆ†JÛíŸ@KëI-K©»]Yæ9F%AG`e­13Ì,|ú ˜ÈáŸik¶ržº”UÍ>·æý5–”B.8AÈW ú€×?RÊ"Ô{TË4„<íªe'²’Ü呂Rïí83«LsHÀ{ïIG=[ƒ4‹‰·ZPŽ}^ù2@ûÒ9†¬Pë°A‹;MÙáÂrhÆ1f²7d 5+YB}9ÆÓ”€Ou_&{ùé°:ˆ Ÿ—…†§O;ˆµLó2Ë<÷Þ3OàÍQ€DŽ”ù´@ÂÐûB&„âu·+½-*r0ƒØ‰É8Àw`ÕÐj³Ã9(Z«2¡R‰Ÿ „?‰|¶<ЪrÊLZ‡‹D ]<9{³%… Xjr€ö¹J÷Ä’°4+NB‘Ùl–d*FÑåDÌ*E¶ @Ñ5dh!S,R ,`9²³Ò 68ù23¤ä´ $Óe’ÃÜ Üv¥8J({F,fOpA¤AZ¢;¸sï© Ò²… 9ɪS@%–„¥¢T~âù»‘JÅØZÁÉZ,©Öe\yúgMµI)jrvÊw(;”„,P*XB Ü—˜ §E‡P‡:´¬Øý5Ö«Ù/b-层bh]|ý­¬ñŠ3_%ì•i3 >t²°õm#j=h9c?ǼŠS@kâüjAÜÖÙ'mO'ôÿ°¸0 Š4(֑ǔ碥Íu*óñ¢Ê´ Ô¿B6(ÀaZ€Sâ`õñõS"×Ye´‰¼‰L¤`€[H,Ÿá¾ u‡rD2´Z¯‡¡ž)«]0 6Ù *Ng™g©f^PªJµReHcuÔbS%Æ%ЂÓîöãÓô\ó·Çü´ë†:U…òÐ`®–Øíâ‡çÈp@bWdݺRFõlKCf¶ÈècÝ4£OeÚOûþÃfÛ|J’8Éä$½” ÌÍîàV@པ¹Wôç£MÀ/U>²Ïù#f€ž³w®Ž…w¯HŸ»7ò¡=ÝÓýͶ™xL ÿŽj»^=õæ9úPÉz½ÿßœG.OmCì»Á÷~¬ÝEŠ?RáY¼­ƒß‹:\¹”½S¹ûÛëCÄ ÓWŠ©<<ÝÞã7KÌo² ³Ÿ£ƒ²Cû~fÎ Ðù_2Kó¾:µyÛ8Õ-x™äùüOðUþÚ}ýv2m‚¿ˆ'ȿ؛“¾óÚö^Jù'J<úÓaÚ|•ïîëªþ‡òÉ´][ÁóΑ€°,‹”/¿ýùwÿð»èAîFGADˆF7˜y-^|¨ÿ¤iˆ_`)ÅFᘊ†s@bü䩊@îfç*µÓ6Ô •QaÓÚ¹­-Ížj™JÍüòŸÿ.ŒÅL@;Ì#3…èGöìËìè ×"t#-rvCšH‘è¼õ$á2Á<¶/™ùü<½¼,]mO¯»º´yv»Zm¿´X ±ÒxZôh9í&Ó4^–b¥õžƒiÕæ±&:| {Œ˜žVÃR7$^VªÏS¯ü5¤ÓOµBöU|ô‘}€àeµ]#fô’‘S”j}6ÖôAL\¸Ñs²=êÒ{7³yY†´àDCôqU €²b¥-]Jú*˜Žv¨w_}‰ DfDd‡üåÁWf"Ñ@˜:ˬÌ|‰Å¬h=¸€ç§O¹Ì aÙ)C´œû’ÊÕä>ÐãÕxyhoKϵ6"Ó'ÐmWkÌ-•¶ƒN CÌ„Á«8Pì陳?Š6¡Ð~¦7˜QPPֈ߹aè¿Âl˜D•Zc;BÌ4â· ž@JØÀ€@TÔ’¬+à²|rö ‹dd9…à[¦DI†É È V%¡Ê0kø°Kî,„ŸœÉº4Q#w9$A aW¼Ò:sÚMé%¨÷~l‹¹Ó˜D­®Ä¼´¤æž“[Ï|éñCõªº@$ðÉkJ‡Ö›@ÃÜðù¨¡jãä¶DöˆHZH€™rdëSFºh¶†¡½Ò'Á S©—Áʉ³šÈå” ?4zG0ÖèûÚU¬Ÿ¤ð1Ž·×IÌ|µב»î£ò“Ö¯S áô¯kéNå8|µ{GŽXÞ:?œ“~i«ªœ*x*äøUByBçF˜ À´Ž}µÖ?ÁŒè£¬ –h32Wá~%#B¯éù¶VNŒk@±F,$ôeýjhG°¬¥:; s”Îbî¹ jÄ]¬À'´@¬˜±»©Vq2”"›êä»§"¯æ–Αf/s/Æ&‰»â?<µCk¿ûâÏ;{ž´óé‡'7GªµN0½¨P"þ¥£TßULõÌÔ°{Îh]-Ã& Åk-uWÿýÿü?o=Â>ädö××__‰ûÌóæ¾§þø®þ^ï98üõõ×ןÞÑþ]êÃw’%~IãxÏŸMèö^Ê=•öv}çuãn-á/Ò$ߕѴ¥lŸ?ãd+ÿµõ}—ñÍwâu+öªm>rà¼øÜÂ)N±i¨÷võšfN\A. 4Ô2G Øõs{ Âgóöíóe³?tÞÐ-¿càànáäDzIXEoÕß±Vð^$þë’óþSà›%5³ŠçF¥?³mÄ·+¼ÝÃÜ{FÚŽÝybçñË[Y=ü^> 3\¦ðþŸêÁsã{µÛxQý³ø§,íSPùRT¼2¾˜‰n«buiFz3=RôÎlqÊi~4»ÝïÛ¾Ê\i7ç½Ás‰ô:6ÙÜß'âùžx¯Ç¼å¯~ëøt¿JT7eb\g;éCûi ×éÿ»ámâÿà íçlêÞ¸áóšË×ZŒ7¾ÎÀ¼ÛJoíN¤+¦ÜSíÚÛ×<¨k“´»£ùò—7$€ÓïzàµìèT*tæ+mïKê½E÷§ßýtüéK¶PO 4Ìv­•r¥:ë4ÕR##¡ÈÞ›”1¬p3wläÓ„™”îŽK¤ùÚ{3‡+GÑz¸iW­@ ’rþùð´ßM;Ç®Ðɤ–6b –VŠCýó±€ùißç…¦’÷ŸS™¡”eJ-{[ÂæºÇ’?g—1 wKkBƒ!²ÁEs·4C&&?<=A8.øÈ‡­‰ÙÙÂzÆÎwæõåxX–Ù ¡>•ýTvÇ—¦Ä´«ñ« ðËO_H[ã-BJ®í°ö’<ÍÕãprô±{B;‚BV0a^'î¿ùi£r"ۼ⣆=@žDÏa«K”i­Èt¤²÷¬S1Së³›ÕRÍ8ÌN3£§j)«%©p˜_ÜÆe^†£ÃØw¥­ÌîRmˆÅ`¶˜{$ ÜV-•†H€È^Nr¡kŽÆè|Keæ#ÍíÉMÀjñýnß#ç—9£ܬ¤:‘­G(Pk[›YªažW-u̬y’tO+ wÕä! #çÃLf ݹÚ-Tªàˆ€;<ˆ> 1DÓ0Z`Aˆ ¨3%-ÈŠbâ› G,Ïb%,.=)LÏöäÜÙb¬¹rƒÍ HŠÆ“!‚Š0¥ª"猱Ëy6ˆ<²ÿÍð[ÝIIY’e*a †»¯3Rä0Œ’nY"œ0G'i¥ì¦Ú²QŒÌZ\Ý)í‹j= ©Ÿ—^ŒFÌ™a¤.‡í+Ê:”Ê”ŒP-Ó3† úڱ箩’¬jµÓÅŠ·Â&ùtDV–½­Á¶RÎÅ|€DÁ †BYÓíÙN[X_Z­«Õ­e:AãdæKÔÝiÊÎÀuNÌ×Éív€€ÄuX‘ð‚ÞN£`ÜEœ¢N¤ÖÂÚú_ vZlÆ}­’} èÀ~ÍzbÊbÈc¸@¡÷u™Ycx‰~@t°„ ƒk¾îœÆÚãXó÷•ð «k­C8ØÌa„† I‡Rˆ¶ÿØZÞ˜ãå,cJdgq3£š›UçΟŸê~W›|ܬÇ`›%Øó.òÐë“§·Âl÷Þ´˜ÜºúçÅv~³§yV Ví7%Ý"5z%¤²§"ré­uEP`1÷É‹›ûÓ¯žÿÝÿð·NG{ë ?Ý/áÖÝýâà´~OâTõ{¯¦_·@žh.D¦|›|ôˆ|ìÛîás·Oò Qß÷øýH«¾ ×ãܦHW¿¸_?óí{”‚ý6nåÝf¼@kê«‘2ç?ÙPoi0WÇ¥»_´ýœ«œñ»Wõ‘«Õ‰”ûÞ§é›óåß®¸Ûo?’.¶Å¢Ž;ÝXãÝÀÉUõ#§ï¿lèüGt‚»(Zò\ÞÍíß\›nFáø¬>µ-Ùá®Lø¨p窉®è»¿ðqën{;ˆÞ¶ƒ.Žð{|]ÄÔ-`›¡»bªy‰UßyΛ[¨Ûö¼nƒÚ°áx)^ÝE}]>Bmq‚ÆjRuú!O€ò¤^ƒ]çõfàü~ÝSüðJ&Ò 0…³¢Nr>æïâ`x£î^¤Ižßõ5 'ÐøåcÔ-[j»ï8‹Ë7_~£›?ó| ,ñ¾öÿàÞPùuóøÖ½×'ͳ¶öñÍG'Îߤ÷¯”7ñ4Þ¼™7„«Í¿ê¡÷¢C!ºù®§HœÏŸ£þ›×þzcÇzÛc¶#ãm–%/Õ%ÐŒ¯“ƒLÜ'jʺ¿åþˆ[%·óàÝy·4I­ÜÞ~þ›©+”Ò%æ|š¶´®+õK‡@ϼÚÚê<Ë]ÅÏ~ŠGœÿˆÙ¸Žþž6S|&Þ›pîRß9AlB]¼qµá%4ç–’ù0nzo0º_}$`°…ô9E«pË­o¤>2anü$/¹Y¯pË Ún0#‚—ö?ÿwÿ¥--[ +^jдßGŒ¥”Ì€™¹åšåψV¬ÔR¢EVPl½ŠôÓÌ%d&@M­×8¼©W\MsH¤‹d.iÊhméK?v‘±tÞÐTÑS°Ì”Y Q ±ý¯ÿ¯æðbÊÔ†±´¹YQ[TÌ’ÓÒ[‹ÔÒ{u¯µŠ2 ÙÙÕ~÷ÓÁ+¼æj³I«SéÑC¡Ìiª¿þá×’}y9š™¯û}&>Ï_ íÓón*Oóñ`àËËÜ–Vw“{msËH7Ë Ç`<Ž<%R FvpEy˜£7xE øuY Æóöòºò÷V·'…q|~¾ô5ë?Ðû ð¯_vЊàó¼DK ÓT–cÔ™cÎF¹»CìÑ[7§kns´ÌH^WK S­°¨u—˜3†Dq0Ê•ì‘ <@†^à^×n§<è¨cŽd";¢A‰9 °`WŸÔ °hs-uI•2µ¥µ%­Nö——#“;ª§ÏË’=W–úIÍ$\±ïÓ“í?M‡ãŒL¯0…;Ó…„ HxNî4?LôNtÔBPypLÉN#àÐÑ„™¶Ð8)Ê#ÙI(€hò ¼“®>KŒ""X“™TÒ}ävCPk0³D.BM#)&e“0c±DÌ'ó©âkø’-aɲB¹P@ öSÆw‹ñ~Uc*CœŠI9÷‘€Sù²t/¾sß™[û›ý¾˜-ÑDµÌž9™'SÀÊ Nn¥ÁîÇÉ/…üT}îÙ¥BK¦›-‘-2ˆHì\FHÌ.ùšMß%5Ð1VòRV-{8ôޅކìÈSMÀ‘lkÖ|ÆŠ¦ûÇê·avjšØ*0­ºRa9b z½!;È‹?ŠxÌ€¾ÎÎ,#ÔO³ú©¬ç"€²F ¯4@ãItÐZ+ÓkLb„ýbÀy–Lið‚ ŠÁ€ d¢5´DöaéÙË:‡¨ Ë54¢\ùþ2׌/P‡^× #N˜²qÌul°1¹ÙëÉm…¢ž(g˜¨;”Œ U³TÓn÷äQJçä¥îŠUå±›±G°÷ÕÒò¸H/‹ui_séÇÿßÏ1·ü›­Vÿá)?Ïú阻O{¹¦2h‚hD¨+2{ÏÖ3B‘¼zÙïv?>Åëÿø?üí–gy±é¸>X\í4À°[jäÕ¹X—†=xµHzÃ\åÝʰo+P·Âè·ë_Xäo$ïý 绢<·PçÃ÷]Ë6ÞÛO}ì¿MÄà‡Ø[ÞyNœÔÕX!¿¯›ß›@Á/¡®ßÕÃ?¢b_Ÿî„oåøGr·+>ê$_…«ºRÿ? òntí yú6Nð~'º±g{㦾-pÕï¶$ïÅ$®B)÷Ä\l2úôq¾Ó_6t–Lº=zç3onÿ¢¹N_£5뙼3»­˜W¼*Ú¼q˜å7L_×PÂwߨ þü_÷Š>ÆéçŸÈoZ|GX¿+Äüðþâ ËøO·½¾Ïr¢¯Oÿ3ïÆÕ•w³®oéíßçWõ?.`èÛÖiþÂÝÃõîümp¤ÏK˜þkÀïuÓóñvý_r¢ülGÖe¸œ"â\2#éóO??¿dKEfDôðJºMS­û)ëÓ„ÖÝÝÌÈ©õÊlÂŒÓ~2˜›wµIÊž4c¬;]NFÀ̶—lë?E 0ke¡9¤L’È4a"ûÒTŠÈtñðåàæK¢O^ú²¤Ùá?ÿ§çO{ ÷û"Á&õH"{ïÑ—ƒšsa)eѾԣ˜ÕJZ˜…Kä²$è}I¯(Ëu²LÌm6Kó²x±ã20Ç~÷‰²§Ý§ãò2©°›Meë]//Ñ)áðr$Q¬Ô©ÖRæÃÜObtž>'Àq ewRÄÙ)çsZs{%Xåª*ŽRUû;%Ç©‚”„û*U0‘8ѽ}:˜ÌT„6{vOv<ôio©8º9GòxšÜܪ›qé20-Íà^ ë¢Èi7MµŽ_Ží@‚eÍNX’³'j_ñëCΊ¬`ú„æÃ=•è Fì©–i>Df`ÉC?ÔRœ;ffN£íwOÅÊvlÙP§Ò޽å=[ )9tX¬ÁŸ@€ ZQ(^¾àœBCˆ¡ SìÃý]z!÷2jä¤Þ¥+1G põ[ƒÍ丅ª:x@€Tü ÁeQ ¾Dîɉ4™–éZR¿2X"€.U/ FV™¤PˆH)sAØš„¤dÙ%_Õ&¹p !Á*ÕŪ¡€N dІiãK#'`ot%ÍRrKób‚»hîY­D•ÇÖ&³Ck$–È­E7#”¹w— T‹LBPK¹±8lÒç 0g&×:€¡µš£Ÿ¦°$˜ðT‚’ 7qxO°³Ó£•ÌÄe:XV9{-79%ƒÈKp@·y„`9‰Š†aIë†2­Éø~*è!Q'$+§ú êëèw”‚ÈÕßÛ}¥y9I¾vÊ‘d0®Òù˜Ä3¡†R‘@z í>Âq:ù'Ø1÷°‚ Z[}G|D‘¿‚i({(±Nñ†S•Ù9fNÈ@o+ËkÇ +[i…FÓùp÷µõklCÈ‘YV1VV(9­Z­^¦R'æS­Óô¼GØ$/‡t†¦’¿~*ÕËïæøÇ—žš zh{*zšb”Š)’è¿ýRþÅoʯÔç9+{~úâ¿þÁ&K!Ç2ʱ´h=–ž‘¼zÝïö¿þàßýû¿ÅUfÏÒ?ßE læ÷÷Áº0CÛ¦DñÍZп¾þøåo«øóÔŽÞ äüÑI¤g øôÿ?bëýéô߯ªøëëû´ð>¯j Š®™ÒßÚÓ>8~•ü»ëÛãëFÊùú€.õê·ÅŸ÷†î‰Úe§Çöª—á¨ožàtQ@»½ëóŒ]áp©K| fæÁÍð½ ðm“ó­ãýøÁw“ŸïBÆÞp›%òA(È þò ­ûå×_,$~%Rï};ð{yŠš“¸ñÊ&ÞõùHBûÅ0æ«dÇÛr`^Z óÑŒ›r¼U:zó3nyC|¯yø]»È9üO&yïân]§¾aeÝb…ß%/ 9¾¥qßÞš|b^é:z_‚çýl/Ü5Ýz7tp¯aùÖZÁ¤ëý6)Ng›²oý¿¹p~cÐt[ÒðuOäÈKÕY8yžo‰œJ,Ž?¿|ùùsôž‘ÙC!š™Y©¬û¤1ÑZ±Ü]i$RJi^ZF–bœinKfš;IÍ€©°Ñhƒ>4¨2óò)´_1S’»ÊÊÉ{·ÎjrWÃ|îÉž%µ5Ó~:ø§=«‚>ùÞ†ªÙ""ô©Vd7¦²)óÐ[ä¬Ò’f¤’JÕŠÓ“ÇTZÉ¡5”ɪžX<( òOÏϵúqž{_J™ê½ÀÍY¼*sšöjÈœI”Rzï½ÏƒŸ¤×Õ-3GÝàÇ8¸­½Þ"LçZ xY;í@ù[*¢Á„ÈuÆV7à!wZ9¬ :â„η^!½/ aÚ¨Êæ¥{/¦zü2OûòücÉŽ‘„ÊT²…ÝT[k,i°êå8×(y±ˆ¼`b\9a†¾À=GÚ9|‡ãgDCõj,ÑæQf[2-vÓ”Âáp(îTµ,ûj0 ëqnµÔÖæLUw£÷¥»—¾DÆ{ OjìxÄÑa€%O‰.K$6ÒÀ"& 2ö…Ù ´@ÝÉž•B¾X›ÉI%0zQkБž0B{-RXB·ÒRQT¤žlLB)ÐT'jÁèDêГ!IQÒœ¢TÀ~HÄɽØn˜‘;ZJ!9S×0Ú°CF:Bëßœ&+ªªºe@)…’»R½çîħºÛÕR&Û¢°”–ˆ¹ôn$Å©øQ†8I³CF U'ÄE馽Y À´s[2N%RRB9,±á†êˆ¾F¼Ö¨$(:ÜÖXõlq(á3Øà_í€:(cXqu„^ÙýDJ€ÄTÑ'ØrrÏÆš€_¦Õó6„Ràõ´^ñÃgpN>·«€¯“`ô V¡DÆ)»ßV°¾ÕÕÀ`<Ö•„µfƒS'¨Î üäâ:'C!":Œ˜vX¾`>À bÔ(Øj3@ NŽÄ"Ìшå4fO¥£Fa8‡çiB7Cœ ̇q±V ŽÊ„<ÅH8ê– HÀð(zÀ÷ðdkD¥5²V`…%ÞÊ”¶‘niåùÙ딇93sQ†•ÝÎþå„©Ä˱'õ¼·J[2w?<õ¦>ÏÝ+~ø”n‹Ÿ*æ¥ÔêŸ&Ö I¤)¢·Þæ¥/-{ ûR½>íö¿úôßüë·ÛM×GO} UU§*ú³?ã}õÿŒxÝ^ðæXø=Ždïäcò#¡?–”É3SÝ%ÿ"T½¶<'ÞÝÞÍ8þ³à™\n¦·^=ƒ\uà»Guw„ß80}¤¯.æ]øÏ]Æé¥š©oPïJ–%ŽþB÷kš//ï]ªÕ¼eûÃÛ³ÞWMÿt ó߬|o³þúœãJæ¡2ïvÈ´3/ëzã~ß&ѽ1\U­Ýz€ßŽèí<¬3 buF>ýÏ©tlΞ7ª²¶?Ñù?§_j-²xåŒkK¾Û5ož‡ˆË½YyæÜ„ï6È»Òèc˜à¦tåUž[Ck3ðœöð€(òJãØÞ¯.oJÈûÿÌ,Ù€DÖt¹òl-¸I‚¼'µÞH·ºÝíè óÁÒ¦³Kè•å£WÕv»¦ˆ|¨n­à^êó¼¡lf¼{{1\±o¶ -ñ¡BÝü'un+¼òu¦•®Åò ºýEú­ÎÿzQñ·Ï´ulŸë_ÁÖÔàT¿uæfñîS¹ä}l»ÐeAÙ噿‚ ³ Dq»Úº4á%@儱?ýêaðúb/‚Ãå1)ïbÔpÍÂåeÀX—G…Ç+.¯Çü‡›ô*SC—tØ‹ÅsÞÝð=|목Û@ëíÝ9ÝŠôW³òEê>ÛçÁæãê¹½®ï²S¯oœgàßýxßóÚ™_£'þÒf¦×[†)—?Ê¡Õé|5™:£ÿW˜ôòÓ—Ÿÿá·HIˆÞÍ÷Öú¼Ã!/SvJžÞ†%¬¥µšðÁª‚–¯„ŠÌK½ðP µ<±šæ>??=µ^"3"]¦`ÕsDCÄK´©ìƽש¦Ô޽îËòÙš²Uý'a@q¼¬ú]n«g諵o©`‡Ó¦V|6 Âʪý4ç‰Ü €èíˆ ” /kð@B[ D¶´'”bŽÒæÖ‘€=?Ue(¥ö#ôÞ$ÑXÜÛѳXÉ`yyœ‰dyåì‹'sT`ù ÓhËšÔœ¹^0_þ6A²ìÞÑ€´]‹íˆ 1;L]©yžAì§»õxXæ¥øá¸1xGÌã$¿BÕ$Y\tHæ2‘dçd!¦ÑšàtJ Ó±+J7¹–Žé“ ¡·a¡«jh‰9䂃YËÞ‘Ý:q0í]ÓOÔ'„”†õò$SRÈcf€Ït³l™]èR!, ƒU!ˆ¬ˆ®\`©,Âì´D¡VVB!lp؇ÌŠeÏ$3Ù36ö^ªnÊôÉq²˜õñèŒ9G°·²÷Òi’LJƒw¼D_K>¬#$ì ‹Yw¹ÆTÀYYÏö}e4ÉÖò>JJFØlÄÉRŠ@Ù'ý(ÐÉeÚO½‘ Ávëχ)4Ÿ  -`"Fß0°C‰R¡@q¨ wX]óÍÁ/ë`¾Á#–p®na"µªðëf36™Ý§> Á§µ‚†àê!ì„V:O겯E-f0bÝqÔ +è -à¾Â‚æŸÖ*„eò5Î1b k D40_^ &be-FX…aE')eÔ+(fïðá–Q"O®XSþ ôIJ€N ™´‰SõjUÓÞÊÞ}'sz|_JOð§½%rI¤¢ü³gûÍ'™EtWfÐ ¨8-ZƯ?éŸÿ€¦VJ_zÝy™ª{åqÎ1­e*•ƒqÖzöPÏÌ$Yj)ûééWŸþõÿï[kÚdeq£ÎŸ7Úkk¾âh^S¹ÖýŠ^…}Vç¼ÏíVóâÈñ ²°5dzCÅcW€+µúæ£ÎËíYívúH¾ù*ZËY߸½Ø-Dé‚4ɯN!_ww¿éÑ¡_”õÕ¬Šogál[æ­¤ŸmÞ§îžÏÞQ">.+oÛü ¥H7¤ðàoõÿÎz_õØuymtò÷º¬¾rL}µ}æ·×|èü%3Ä'òs þL^Š–/rÎïá­ïU|4õœÕ/êÑi€W|Ø<œßûBÿ_o,3o'ï0€þþáÔT|íý‘`ýÑ €‡­Âot$…g¿vµÝ„‘^Ï×/š×v_Ó°§Ãô·Uœb¤g§¡“ãˆ^kNɇß}þÝý‡lÈsYñBX±ZªC^|Úí£v¸ËK˜J ™’=Ð"§ê$‹×Z2³/mÄØK£Ühk'É ŽÚí‘àJý‡FJ«Rj J9ü©[FÏ$õó1_–]õ(¾Û¡:'c,©êóÿþÿ|ú´w·yî´T ûgÄœÇÒȦÉ-ˬ̱&šµe.¨ º»£Ô©D.‰äHéÍt‡z{•){mu ©ÊÇÏð‚˜‘4(1< ÐmIߥ£z©Ë²‹Ñê®ô–„iŽ6'-Ÿ?}Zz›s*@%ûÓÁ„išæ¶¼|YzOÜ!Y_s›QjmÙrèØŠÜ g§?Á ]È*øsi`Á€í•I¾p%éLड ϳŠQD†(t¡™&¡7fªw–E1tÈ:õ4É×0±ž‰%I—¹<9…5e ÀDOëÊÙ‘¡Z°/K) mŒ"ȇìl4Ѩ2RNÖY«ó*ЀúºŽ«š5‰© &qr‘A˜BHÊ4³@&uˆ>Ñ ¬õì5wVçèŸûRá;c((LB p¢VCuÓrÒP‡³!:ܸŒÓ¬½&Œô>Dp)ö^@‡O(´×ìõµîÝRà2Á‚²;yÕ æ«È^*zƒ'l‡:„îppDwƒCÆÊÔU5kp+m-ß>ŽX™W£y=WjãZ3æÄQÖ3„FÃÐÜ×9>¡á7ÀuÆ0ÛˆžÞ<"î !"®qD%¦‚¾ Ç”`_ƒ몑P_kF,ÁlÐ¥¬u˜£QW5)®!Ìhx½Ž µ¬!„èàÙ ˜'æ1<'ì*QH§ÌÌÌ¢3ù®f1wO»§ýôü"K4(¥ô©dŠGäK³n c'E—EŸŸó™Jeñ&"‘?ôã“j‰¥ó°Ä¯žùÃ> ŒÈHŠÑ3ZÄÒ£/îµÖ]ÝýðôoþûÿÀ4ÊsNù]gYoÚõm7*'~ÕkÀÖçóÞYê”Sÿg•œþ}Tïq»×‡@Þ¤×ü4Ô»=d«×¿}Œº›B¤Ë×wéÌïže®’…¿{çÿHÀï™ê«broHê·÷õÀ4îÛ+¾¹åÿ, óÛ3­¾þ¯Þ7»WëB~Kßx¸ƒ¢øˆôwyÜß÷U¾F ¼0ïyOùäe„ä{Ό˿æ»t;ݵ¡_‚™º6l¼\¿I<úÅ |NUÿ(kñ¯>•@üAºùkeÁ÷W™õV˜ƒ'çª?>åÇ›_¥X}/êÌÍ̼Ñã¾",qSj ‡¿¼º“ÍîT—?tù¼ˆp3-܉$\Î6_×Lo)ý)¬ ooÚî̽—zó»Ïü®¾2éãîÏßu'¾Ý;¼qX}«€œ_ÝæË,>6?(Cþ`<åm㲯™t¿²êÊfMß8³Ëò`\K‡Çç¦-¾üýO?ÿö'„hÀŠ›Õi¿‹ˆ!pXÊÜ'GëÚ”"EEu¸QànG6)Íbô¥ˆÌ$aæ½7Ü­‚€â6nÏ,#²‡×BÀ ƒŒÒ¿in2ëìZþñºß­qóæv<ôL³É¦ãl|jÌüßþWº X2J¡UZá2÷%ÛñeQ„u6+ˆ\bñšÓ«ö–t–Èž™ÄÊ‹aP`†²G"›ú®Næ8Ì—ìöå‰{ëKÖâÒ²,–]Š0‹ï²ÙTëÏ?ÿ”ÊRë¡-ÇŸg Ï£>!¡xí­Y >A¶²AÖDÒ‚Ô+7ÄÀ$™@råÀÀâŠ, `¬·ÀXa÷¥žÒoÑ×z‚XÖé{ÔÝ*‰ÒÒ »]©µfïÊr‰£Ù^i4ÉÒ Åm†õžL(Ñ'ãБ§ìkׄ%Ô ¥ LO­n¢èèk²õ–æ£Y›çjfî ™•l0Y[zô¡w÷¹Íóq9—ã¡—ZžŸöŸžöY¬†¡å­»ý$,½¥ÑŸöS›ÛêË*Ð`€MÐNihë”AMHº)ñ•4°ÌFÅ „€.7._XˆÖSÜ€d ±XyB jBŽÙ°0'ðøúä84Êõ3Ú“=ÕÕÉY:&¥Ã˜8B)³"€Ö‰–0müøÊ(2!S°ÁÂÊõY[øJ° sDz˜#þG¡HRû(õh»ùΧÏóñˆ(îæxŒ¾ôÞ"œl#à"8ÁÅ’™ÔÕÝÕ”0º1,ËñäÜt•þ{ŒÁY/î+JÞʈiB±%/ðÓO†oöèö,‡U¾C#µÀêɮ֠D›WákÀlL>5?A~òŒ÷qØ)`2ÌFøm¤Þ¯æ'Óon@@ê·_´-`ºww×µ#ïÖšüc3¯Õð·ÔKÙ«ÜVFèžÄ{Zôõ îoÀpz$e¼.ܺ\dï\×ôrws; ®¾èƒžou¸³øš® MqãÙøèŒÇx%nÜsRKÍЯgºß>çäIQo~Á=eþ|‘Ú|й³Ÿn@Û ¹Sª³ýÔóØÖ©Ðf“iºÒ€6Õ”Ð^x6n'â+”Ïý]‹¶ík§Ñõ¿k{µü€¶È‹­ÕóÕú›µ„œ:•CnÑX<;OÞy¥eBlÚ•¾4»Ý®Ç,õãñè¶k1zæ ‰4lè§üheb+@G4ø02MÔºú< $H´#H£ˆŒ!×*Ý:”¥Nó²ôÞ!+´eéѳ–IÙ3óËÏÇÝn:„§§i·//_–eYÒ32Ÿžü¸D´¤ãxX"“†lùòóqÝó$*W?jTPFüË;ùŽË£r†À%"LhÖ_`2ÿ1<ÑFãDvADc. ïÆÀޤ¡S1C&F*Û:͹¥R plxI ì5†$¯â)`»FAOš”‘=¿"wCÁO™¡&­ÅE:Ï€C̶³p®%³iLà´–F¹Àº2Мû©~Yò¸äTI"“Û1ò¹N?N»ÃþûºoÖªzÓ²þ<SÂw°i €!€Š©B¹:C(90p4ãs>8]œˆŒ“_.[;VÎþê´$¯<£çG®ÁųĿÆL§’Œ™èÞœé©êÓÎËD›&1Qø?û?ä—Ù[/K‹ZlWí‡ð¼çÏþj½ÇÜ™D•RêÔSpf_¬‡¬7Ún2Á««G‡”=£‡zFï}éÑzFà„ýùÛÿå?lwYº@®r¸M`³ÿÙ‚r®Î[䯾R®ºÐ\$³uûÂ[§ÀËÜÌoÌ,ÁÕn•k2ï±Ht‰(~Ov¿‚á¼Ë ÿšt½v2Ýkº;{‚ÁÁ5©Fw•Á«Gy+}U5Àm÷¸jº7²pn1§¸—¡üA¡ÿq×Õö´¤æçG>ÿm¨Î]rÑ/y¸WÙKN· ¤»  »Ïúóћӎîqtÿ’¡ó§ÁþNu””nì­düÛgt#œ›K52×à5Ì·ïu|D 9·ÇÛÁŒoŽûn§©ïQ+Cļ 7émóÛBº“á÷vÀ=tÇ×…Ùߨ4èmY]3ãÅ÷+î_wz0ßÑ(’\ß €ók2¾µøà—ÈuÝšÈþò²ˆ7~ó à˜ñÁ U¸·ŒšõMr»‰Ó×´%o]w>ôq€.F•>ðäoö gL9îœ1tGÀÄ·<îQù^G;†Rto6nïðÓçvœ¿üôsFjiXš•B³â6=íÊT­”RK„e„ÌrM–¹»""h^ç…­¡ÖYê= Ø~SIj_ H#32"Æßfˆ`¥lßgõ¿@¦´SøÑ%tçÓmŽ.ƒ&·ˆPèù7?hž{ÇÓ¯Ÿ\Ñþ?ÿ÷çýÞŒn~\c¶H:§1C½L–h)änÉ K´.%)³ž‰2!¶`8ŠrB!È@_Ö‡['«»]b2(¥ŸæÖ#çç§Ý®î–%¾|ùRÌž÷?ütüùx\ž÷{Ì\––%…œ¦"Ùáe–0f1irY ü”žo…„[M!’%‚îÂlw‚S ÕW ©=TZïMˆ†:Y.Ê: W7ôeMï¤ÞaCÚ (;8в<#{ïYë”Ù†èÕ ¥ 9DóÞVöȪ‡Ž]VùR€pⓌØyFˆ#‡g?=ÙÎ?¿|RfÌŠ[éÑë=¥xYæei]eßO“ËÒ3áf=“t¥·Ö/ËÎr·Ÿæ¥÷%½XÝM˼ŒL¡˜+'Ëð:Ü»`.6³féÒ^‘bW(¢3‹°pa1zýHÑbwæBë ±…vÕ‘3­c2˜©ƒ/ ½i"*Ñ-aU"˜lB äÀ3Õà§JÖ‘F Ìì‰bˆ4š—)‰‚AIŽWjd‡Ë€XÏ™ #ÏÞÃïw˜ÒH Ò ™Cµê…ƒ|ƒL‘¬NA‘ªF•%"Zf7ËX–Þh4Gˬî;„¼—/\ž½ìÜ-ó ”9J¡WXÁd¶ÓÔR)™1:ZW2Bp ­>>~:–ùôzìó ÏGìHspôê|µÕ-Ï­ŽÅQêš¼?íÖø…ÝÔÐJY7怯pªÞmu É€q…ä !û*½e|ø ʵpáœU6dô²ƒôec\?@:ÛÜ;Müøö˜ÚÊî7Cžp:ÙNç/C ê(PVƒajrŽ"¬Õ6æç“0m+½pX¯-i  5ʱ:£xYÁ'FÙ© Öû@§Ø(À<…Fâ?Œfp—g™fsÖ¬¥bgÓfÕ+þå¿ÊjrX4zÞ•žøi–µX)(ÏOËÜsYôe ©?ïc?ibzÁäKkìÝKµÉ‹»zà§|Ú‹ŒÞûÒ¢…"”2’µXñ²«ÿ§ÿëÿERÞífË´‚×>ºÓÖ$ì§ÿwT§w¥®o;?}°@_¹÷ÿ† €«J懽+ýÿòó÷C1ñ/¨àí0ÒׯÞIHúmþ Ïk·êç÷Â}õ‰ì{òï£àûÞø»Ð_tþ;T|ÝÀÙ„©@³ë í×ꯊQýÇ7L\xºá¥4|‘|õ£_Ô8ß·3$ØrVíïÛëÆô;«´çýãc°Ô/ Œß¶x] ÀßãÍýAÈ?¼ÿõõ5ÛÞt }ÿæþN}ñv÷öÑkåFJäW›ï;…ŸÆõ‡mMf…ïü•ß’»ôËJü}æ/ÿo/=G=øq^ÏM1Þƒ€¤íþgÃôx¨#¿nž?ÿ]Dö•‹Ðן?uãÊû1rÔœ|Ì ÃO_–Ãüù§Ÿ´tDv«Åw“‹»O…‚z—À֬ؼ4[Ún7J©%S±,B8ĺ»rä#g“ÈLïÊvH¯^j%™‘¥T¥hìK³âëCý÷L.RBeWÁA‚¤ìR¢“}ª>w{Û—Ù%LKÄÿþÿ¶Ãn1MµÎs ÏàO¿.-ûñóÒÛ¼ß/S±¥3´€”̆—ÁbÈ€W$¡¶¦tHæšý:Œv½ÌÔ™ LÅÂs‰Ö3Ü<ÔKo­9vOÓ“4HÓQ -rî­céVJ´(^Œm·ßõ6ÇÉ +.Ün ]’Ôjœ²Ô_)áCp£rô#2Ñ– –—҄ň• a@æK)­÷Œl-MöT÷Íó1d"˜Ëq©“U/ÇC/>¥-­…´8K¦ÍȉVw%Ðû’Í–ˆÌ@Å¢E#y "21ˆ2œ¬˜5U•'6È?* È+³'^¤†(QÓÔ¸üÿÙû·fÉ’$;[KÕl»Ÿ‘YÕ M €8_ù?øÄÇÿ2|¡PÈŽPLÏ ».î{›©.>Øöû%N\*+«º\RR2Ïñã¾/f¶Õ–ª~«A“d©¤íwì¡wf‚¯˜#i. Ò°Pƒ¤_LS l ìèž3A±€*) D€ XªÅԤ͊úAˆ T… ÑA¥júÏY­…áNùJ€·…Cµ•FÙ¡4Ašˆа¡ [™JæH´h¤öÙ7î›MmK†2Éb–Kllm5_RsfnLÏj,ÝVB~𣺓L~’ö¡h(3¾˜ÿ¾w^à{?¨ü„µövh¨°!ø¨”/kò©L0‚ùÚã‚D,0ÃÜV îaª10AnëNxŸc½Ÿí és¼ gàÞV0/ƒq‚çJ:²ŠdrXåøQMå«AÊÚµ£ƒ_1‰ìë™Á Zu»¶×ÐP„¬‡–‚DôÃ3–‡ŽÔDjµ/ãAâ'ìEH¬IpúÍNÏv%2à¶üJU:t-À@!ûêµ°žˆ!É4¬LKwŸ µLfÓ”ði—>Må¯ÿý4ã§^ªÞMöºÅÒ³u“dd)U»}î»õd1½¯²Ä~‰¥£V›ƒ›Âê‘É”H$zvù~›ŠlKË¥GìA3¯å?ü÷ÿqûãûwý뵕éRØ>Úûâ+]{Κ&¿ÓFÿ_¸ÿOàuðþâµ@©7rr~9€oÿó'î Vú—j‰ñÝàÄ—¾ß¿aö/:qøyYp¬‹ÿšÄþM˯!Î n‘Ó¨8Al.ž¼WŸò@çÙ=¼jê>g^Ó™n: ®.çyps»s;kþ½su¶ôéü€.Îè¬Å…gu9ÖèØ*ƒc43"”õ'˜?|ê­øý¥)EÀIs·âæô2™T7Õ¦©/-"Ѓ­#ŠÜ’–­q?£Ôt.µt4—hff‚2R­‰´qÔS-DïÅÍmÜŽìaŕ饎RŠ÷?‹dJkÞSiˆmYµÉ=Ì"z,áC@2DñH´ÿùÿñ±g™bû²-Û´PöÀ_ß«†9ï}Zˆ¾´ýÜö½gôäP°L4±})sïÑám†õSYn =W+ÎzPßè«–‘Ñ1m¬ú&æY™rø4µ&µ˜¥r·ìô1£uƒ-˲)ÓvÚ|üð)æx-“;öó¢Ì¥ÍC$c°~ €â :bÉi«2)#ÔNÏéº]5¸, nÑc-Ñ:£•õ‘7¨å)”‚(V+ÎQè}0ì…m` À`B¦¿þzÓvÉ…p{}_ºšWk˜½öA '7÷¡õÛ}u==’ Ô ësÈüà¼z œ mš&Ê{ï(VJ™öË2ï—Œ4Úòq!+\&ÀL»××L 2s·ûäfŧº”sÿ #Aô%W䑯\t±›V~#“H¤À:Sô„0)ƒl ï*XeÝ"h «’¥–N‰"æd6- ­È„}¨ôbÜŠ‘êB¶ES.6ˆ"øª¤»J€aó@=^@:”BÝÙ_NŒ¤FdB]ædQŽÐdÄžÐßÉ”B,&§-P@Isޝv 6,=cÍz”ÏÙÝìu*ƒ)”™ÑºÜœöZ‹Ëzä"ñ«i#åÇl›Éþv*NfQ‡æže^×ÍÖ0§ŠOóš–ÜGá• Õ 6:W ‡EÒÖ”ØHç ‰™Cå?HÏ£½f”ᯉ(!†p9€ø‰âp—`-íG†´ ”ƒ@#é~”ÆÇ!Òºù!'Ñ—u¤ S_Œ~žYþªÊ­€y .íhîéÈhµD*kmfÚnÖZOZy™d¦”WJ=ºT'70"²G´ˆ%¢õý÷bÿñ?ý§_ÿÃߙۈu»ÄîV¼à«žw­ÞñX¼Øÿ¯ ‘µ`D1wñ OªƒÎTâžåIhzHë–„¨,Yg{ùG;ÀóŸÜ‚x•9ßÝ õ/¢åu¿~D– ¢¼C":‡Bž†Åó÷.0O}Ó<è ×`ç㇬ ÈQ=º©šZÏ)3I]hõ¯ñýa…¯Åh|Vþ{t¹îÒ`ð€ÎqÁE¹'%ßpõÎ'ÛÉG¬’o£ïåçÎmÝt(Bpßöòì·_Öâp·ìI'\ß·Š×·(§Û›ûd/‰{¸|Î+øÉ®üÏ:Óô¯{ëÝ™¼¹ßwŽg­z59#Oš‹.DÜ(…ŸY žöÇð»\·Ï>ÈÞ ´Üj¸Ä<¥B®vãº×pl»ì¸ºÞøß)K”¾ \_øË»#þ¡”ÿ…9^I_½¬ê­oz™çGrtè~ê W.\XàÆeá©àõtﺼ1W÷•WX_Ûð çßð¨ýÃA’®!Rüò몫LÄE\«{Ú¢.²ÏÏ–cXË»™‹‹ƒç[/$ïD‡ø¢€3"ÏçÏ[ƒ™óÌÇ›nçEÏR)¨Bóg'¯-À/‰®Þ\Ïr‘fzîÊûEáo·MOƒ›+NÜÕ¾îš\ôEçv…º©C¸·k>øÖÁ'üòþ ôýë ÿ°à±ïôÛ;Þx›töܹ9±+FÔ*y¹™>í¤O‡ß}üÍO¿û§VäñÓÌÍR«c&÷A"w‚f®ÌÍ2e¶VŠÀ²t}é"ŒÌ¡thê))Á@¢xë¡N›6ÕÝyPÿד1ÒÖÂôå­?O¯ÆâDA JѺ‡•’–©º² Ûò?ýÈ zZŸ6ï§Í&¥2Ð=%~øÐXP7 Ò‹ml³ÌêÖZ]”¯RÒÍݧå§^6œ¶Jœ¨kÝ:ÖZZìGP<Êí­ µTŸ¡Àk4èÂÄÕo0¢7²”2/­- ï^ÞeGD~üé£òÔÊd Ô€i'ôµ¨`p+±ä<«¥á¦›'ÿ" îÐø¨ãJ<RŽcæâŸ $P&ø„aA¼ì‘Bdù§V¬¼nÞÔÚ5a éE›ì³Yz±m}™ÛNJ²Õÿóõ=æß¯…ÉÃÐ&ÚêP:MÀ ¦ÌŒ°Âj¹ÉìFݾf °mÝ~lŸ¶eSK5c‹èóRÜLè=³/­-z÷òòúÃËîãH¥µÌÈ=™tÀS ÀOËvÀsgÀ„Á8®’ØBhô‚J®HÃXõ'&L`QºÐ¹,’©8­3„ ›©"˜!¤ÞYi"2É–0Áˆ}æk5t$‰‰Lhî¯ÀŽJCOU!Ä|!Í”!f+ ¾¥B,àöØ%$Ø%«Ñ¡äŠ2  †Ô­ÉšÕÃ’Õbê4@iîʰ„›» Œ‹…СÎÆ8Y‘³¬SÞpªJ· ~¨š² J¯Ìâ΄¬(2C;6LJ2ú”Œ¡nd‚ÔÆ Z(C–rÛLÕll|Õ¡š{ä‹W§µÌ%²û°_hÝÁ$º¢ƒ„&")wLð%TÈæÌšÜ>D,©êØ äÇŒ9„ÊÄm)»6š%@;€€E5ôqøaÛ©:~ä¥@l_‘XyAŽS3°60_)]G¹jßGÑ7Gá_M}Õ€XgÖñq“‚„lCt†f>ìÌvûÄý?d`ó ûÁ^X§FÞq^V=™`®ù (Öߎë3¨;$òÐ]wVw¾ÎýÓÿõ5 y4‹p—{]…†¸]œVïž°iíNˆ† ”„98­ÿ˜uÌIš£ SM²n^^­[ìˆwnûÍm̳˜IÜ*s;U)[×n¯©èÇõW?r[sŽüaÖ~QëùiÖûWkcþê}Hinn–ÊlF‚Ù{뙽ÇÒIò¿ûûÿ]}ݾüê‡÷ûkÐiv&µœ—ÿüzýøŸt•øKüý'³!ù…áežkýo‹Ÿ×¡âgøü l±ÉïxM~Nß‚?Òžè»­½ßx×¾;tþgßxë+„q2óüvŒ:ª³ÐrqÊÜ^±o_ýž7$Ýv&½±ÁŽÏ‡rÉSUð‰ ò›8Ë๜÷Û¼ý…gœ†£bs»¼Þ½»¼þÝ%çæ†æ¢çjæÃn¬S ®JÞ¥‹£ù"ÇCÄpX¯JZŽ×óBZ[q1W ‡RT^\óê¼l8ó\'ýÏz<®k®¯(O©‡? ïh?)Ù¾n9ÑÍ7žغpU½s×OÓã <6g?DçjÛmIµ.ŽóØú|yHùn<ÝpÝm=…—g*ßeÌÜó¨å5´Fw¦Ññ uÁ™ººÉºèbÑ›Ö0 ‹ÎFîu' ŸæXo;ßpß õ>ÓC镸â¡Ý¾Q7ëÜøÜž%íÖ!º{T×S†××þ³ú¶n–uÝ]؉_ 3åù-‘Ù[®/ .TîÚàP½vÓB®Ãvôlxó¶ànkçú¼3ß/&üq×”÷§Ÿ1«„{e>×!×¾­c—׿À:¬ù¼|†œ!ÅÞj\‘<•«š²ý ÓL¼8Nœ?”…³'­Ž£[ÇÞ‚HÒ€üÿýט[öÈÖ˜»O#P¼øŒ`ň¢FòÎü¸ÇëÆe?Ûf²j©Ö[qCÙŒ¢‰NX-.h7ÃhÄ4Õ>p@˾l‹2ûœÔ)ÉkÉ›ÿÓÿ%–^¦ÈH3È•A$()ôÖ‘0“,SíŸþËòûFø&IDcϬ“ƒ^6•,óÜ?ícóÎ_6ÜNþ K!'·[ÿÜÏ™ÆP*3¼ÔÍôKìã Xʼ—-@sZ*S᪦Çï€o 5«íaVàik¬šl€y}àuìæ–S"c—; }¯SY>Σ¤·œX+‚q`õ ‰4PWLÇi˜ üw"}CÚÅÅG@¹(Ààsô°®žž+üÇ ;߉t´QCîY4l^}ûWÛØ-ûß<Ã{2äÑÚ’l,Õz²úñLìÛNÊV‡Á`mÉ2è%¹æDôyM¨ ½•p5NÝë*lZ‘”¤¹9+‹»™íæ]_âe»µi ÙþS3·×Í6õx·­S)é¹(‰ÀŽ=s¸CD²Ã¥€¯(D¬pÿ¡Ý{Ù0½®1~¶µŠ?Á¿ñ¸7Y ÿ×ÇëÈÃ5 ¿‰è«‹À@­}ÀlEë¬)®ò·ãÆJ” €Ãt;äF[À1±îEú Ä¿ú2Øú  ŒÕÛ`¸äðÑ]O?úŠrG٢ǡi>xœH®/âñÌC¿ÖΆRV€’Ö©a -¢21º Êt@¥ÄšÈ¨ï€v0"ƺH¥ÙäVKÝVy­Û©c*›/ ¨øÆøkè§²-j‘D™»óÓf#÷ µyÁï?ô÷/n‚Ð2ôÓGmJÊòåEï˜`–)š¹D§ #ŠÈèÈh=[ôÞ•ú‡û流—÷/?þ«¿¶Zl˜™ÜÀù/vOŸƒ?Ñî•ÿ_°Gãº&­á"ÏŽcåm}Ä9éøªV”okXcªÏHDGÛ¥5g´^›-κíOáªFã:Œ½þ ^nºô†€üñÿž¨>ïuùÉe8v=ÖË(œ;=28·Otuœ3µ”¹|EÄ#`ÎUŠè®œúÈšÏʲØåOz oMw;¾Ñˆõ|(ž×ž_ÍÐG'¸­_.§Ou¹;KÄ-1éíòèg5è»ßx5ݧò>èvã÷ö=ùÛÛoùó‚Î븙Õ%¾ú®ëIzþœ¸/mðF«]»²y.s^}Â;1\Ü‘ÛÖüs=áÉ"p…Y~#ËîÑ"v»˜\ÜèKÐí«ÜÍ?j¾¹î%ùïŽT<,Á¯F_›;?ïà]ùüÿž{hè±$¬ë#¼­ÎäýϺ§FbŸëóΘ‹úì©ó\×ü|ÀéÒÇ$ê=qôN¾‡$%}VøÄ}ºßöÂuvàù}çó¢®#>Üu·Áô!Go†Ï2XzBÑyÓ§é(@Þ¥?Ýzо4ùFzççrpzjrúøfŸVe>ÈfžÏåÇzæ=¨‘.—–G)Ù‡‹9?“£þ<¬ìÙÂË3 ]+Ý_].ñYæó)»n*ôøà=jN¢;Ï%~n³à~ qc/sf9óè9õ ¼Óç nx½ý:tÓ_$‰u¹Y½r-zò«O"Š/HÚ}ÓKwrħÈs U8ºTÜ›¼¿ýÍ?/v}nméFš•RŒ$kµÉ«™¬¸=4wzHD1´©œ»RüûË@XWï½[kÚϱÙf[­Á,#ŒÞÁaÛ’óR%ó¢2.èóB#éÌJD²ŽšÔ4Ê F]))¥Ñã·¿]Ô…aE[b×Mžj2nßOÓäJo3Ó€©Û&Ý™ÆædWª©«¨è­½¼n6Ó$xt-KT/lnVÉM}¡rÁè °i>Q‰ÞàECÈ[É@­(›8ž‡ÌAd×L`c›¹Í]Y RñáãN‘L0Xµ²Ì½+mZEÀU‹ÏÕásTâç¨M° è+v|­PŽƒCW0QIŒ® ¨¯ /Ðh@E&ļÊîçþLiˆ„詼l·å§ßïçŸv}ée S%Ü e²`8«³îwK² m³yQ¢÷eyF¤«óÐÒ—äü£<¹›j5 °íôÊÃz¦ ºÓ(‘¥” AùÃïhþûßý®·¾Ý¾l7/î¾ß·i*ûe¡×e^êT¶›Í Ed).¥”Ÿ~š#r$H†úo¾&MW Sò“ 8®-b…A!ÅDNi m¦ˆ0¸B4ÀW¥Ëº@äl;*OH“0Kp"‘"á#¥  )¹oê㨻‡2ä±Ð­Mè ï=dJn:d)Æ<â§Ï´*£Õ£œ¹'#· ‰"$3Ddfk•¶’p¢¬þYê%S4°Ð©I¢w,Mfüq;1D²Ö2†ù«W3_²C9ÁÕn¶eÐ,3 «W¹/îŸ"[f0›B®bÑ‘:n²'aDÚ Ì7XM £x…Mð²»CÀæt ÑV…zøN“è%ð,g.IZËüë(ãà$TÑõø%±öbסîŽT®ãâm§*þáÅ=}‘ˆùg¸éŠQØ©ûg¸¯=‰ô¤‚Pá ™(ÊsD?ذ½£ÏEe8øC§zà`B£r¿®W©”Ã#kX£û 2ª†Z¹öÖHC Cn yì` £»—ɬÔ,[rªeš^^ÈRjbû+F`[UŠ™Ù¯hsÏ¥wÎÍ®Eïø›¿ÂôR~ø1æ­õºU¨×¦MÔ‚øíÇþ:iªNצ™Œˆž™­gì=#ÿîßü[ºm6Óöõ凿ý+Ò`&NPߣ ³îãOªž…²oÜ®_Ê8¯ ¼Íãä“ ]Šk$ß´)zé¦ïs…hÑÉçYõwý“—ß¾­ûjÍ÷qîU7žù0Ýš<½Ï$>žmÂrlÞ\_ÿµ2ÄSÉì-ùƒ¯ø¢;Ð’¯=ø»‚òsèÐ[ ´·o{ò'7Z9Ï=>¿H£ã=^ëÝ«w6B®÷…O0Mo‡5½qL¾¥ªýïòó þ'¿#'Ý“û¾Ö%[Ït>PWÀ¯ZioòÏÏ‚¾à/¯¿¼þòúËë/¯¿¼¾9¸¸ØŒ ¿¿L÷}^Wn6¿„¦ÑƒCàHÒ N÷ ¬pñ¾óôaކŒd•î$¥R‚4Pë=’™sÐ%€ßÿþwæŸvm?÷„Xª—Zª‹¬Su'2ÑJ2UL‰è n¾©j™UL)2 ³§ÅL3“¢g¥¸)zhnQG报 †„–ý¼›Û4mfän·|ú´ƒÙvÚn§º)%3—¶xqZk™ "zŽ‹âø’¯nÕÃÊØêÁxà`R²ŽêÁ>ÊC‘¡!úš¨½¯ëÃxÚÛ8‘ÕOàÄ÷0mA?ù¬‰G,°3T_ó Ç‹0ú|B);\Ò@Ûÿ¦‰4wwMµl75+»—÷›ÚLÆèfn¯ÿêoâÓbvhîÛVÛNøí'Tw3‹ì‰%àŵݰNËÒʇ¦ºí?¼Ê˜uR¦h¬­Ã=‡7b&ÑcÙ͙ʊø‡øw4ó©LÛió²}÷«q¨çDÝ)X«-ÿü¤Ž¿¼þòz*‰~™ ØôÊ_Èz£ÁvßcveŠðÕsþç–«ÔŸ7tþÏìu~t—syg¯’|gèˆ;ɪGuŒçé««it½øð3#¨œ÷ÝOLKG¯Ë£°B1NêÊgKþo+FÁƒLÏCiç^ÿ±%íÔWv<8^wÜix\Ä{[ñ¤è󯍼pJíÍlûà §:63ã~U2ÙZ©›á…f«s©Zö¹/™,¦Ø•­«§ædO1ÔeRqµ4/›Á˲‹T[è&GFO2*²Å."h^ŒQ°̶)˜P§-˜êE¤Ý ËvJ´Yñ²Ì•¤¿b1|åz«£ÇZEž}M (૘?¦ÌYæ¹§°Ùn–>/ó€^¤˜!z N`^šsr¥~ÔÂh#õêqxYYÿ ”-ÐX;˜EÕ3Úh&^[4ÁËz:›[&‰@b3!ò@9O(s-6¸%}LYfp±@saËw´œûÉØS†ž )XAÉU9´b^}Bb‰½W+r4Cx‹žÌâær£Ïsos‡<ºMÛ Xo}S'+î4©×b!íç>ò:˜»eæPÿÍKd/ :d‚Ž2Êeo½"! H’fZí´*¶–lE£ú”<¨ìIsMHµ•ÖsN5áÕÀD£4Ú<¤Eœ„è$Ðn$ؤ4UgO)Ð?v@.m s&‡Ð…-)©&8YÁ«äDr`ËÀëoˆ½@ÓͨXÔñ¯$­èœQÁÌ‘,°YÑðqC"lଔîFCHa*BS’T¢+˜ˆÂ¡1C t©œ|1ïW¼ϺÉö»\R)™ÃÂÝFþfŸKZ*`†´ý ߬˜û•7•˜¶h3–uƒÌ5“fBöSþÔåJÜÊXgßð‰>b'¢ÌȪγœ{±úmõ*ISÏÔyúÛpÐýÇé ï…‘ÒÓ9TO‡¾‚$¬bšvå##\×v"ªÃ*2Ë(³ˆR ŽÈõRŸO®}Eëö­£ÉVDB(/(†ì(/§˜*ið >!…Xj8U`e޹|c¡ÂëT6›Ó¦NÛMÝHÎͦ|lÁ’A›^û¾÷OKª]/¿záÛüë÷{+[ >í—R‚?íÒ&”—¶™ðÓû¦©àoÜhª%~eŒ$ Ñf–ÊÑC©¾´ìùwÿæß&Pjyùáýÿêׇ–C^ô‰ß„D׸~>nx@ЏŽïQ­-\o3å÷RþšNþÖ6=·¤Ô¯’‹(íÎÃéG_ÆæÛÚ?ÃÕá:ܼÿÔ¼z± :ß‘x·•ùÍ•õ_Ñ[‚çñ9X½ç Ræî¯>í.÷㸵y»ßÀssì»üœ7‚Dn‘2ß.¦Ÿ³^Ïg÷ÕÜÌ}ãÝ‹ü€þp]zÛ(ÂãÒï/íxËüÏ:¯‡‹8¿põ<¿Îoéû¤ÚžÇß…zrµð>//|Ôzr·‹â+V¹Kiõr”žË ˜xå`´§·—7tïkbØ¥(pîæ¨KÍâHt¥ žåõdîâP>ßÕu®ß}a—ÙÙ伄]ܶ3¤Ã%^ãpûÍ e;ëN œ‘Ïað:i™G‚ç•f¸^Âúa­ß¥À_´é|Yûã]tù!ûr@çóìðøl"¿[#]%t7<»é0=ûŽkx=ßæx ¦¿Ÿ¸8¾ÓÑ^ø(œ~sàbP¸uÚ î$Eî-¦zH Ï;þžDžzx}xùž+–þCYžO“¸X^Ž­#àêìF>»ƒwÝ(îgk/Æùµ®~¹„êØ7ýÆ'è“ȳÜñn‰¶þéÙv°Ÿ38¯†øãƒ¹rú¸zª½-evÿèÈ:‘×ïE&àÁcI÷¯›¯z„â»5“¸×xT¥Ïÿ›õá–E^2Ûø7wÛ8ͳc>»iÇtÄÕ>ñþ±ó*‰r–!x}6Ãx生e.¦úŽü3áÿ˜ ÖZ÷¿º\Ý# Ò ~ÿa|êòqßös›§:•©²¸y-n¦L–¢Ô€4+‘´è ÍÊ€OnŠ‘µÛG‡ª™W(5· ›[L•FÐzDîMSdÒ,¡ÉÐ[¤PjA&²GFLÓT¨4¢w3ÀX¾Ÿi P©ŽJ-Ùv å½÷¦ ¶lsÏlBl6GO„@sŸä@ŸG|ôýÖ #'ÙœÝ}š‘Œy-…+ØÚB,¶)/éV¤†lÑ ÂÊ+a©¡_f¤7(Ûÿ½B[/È¡f@"Ðzö2)b·ì²Ü H˜Cš/k®ùˆè ÌQÊ ¢¯Ââ`ƒ´¶jyôäGkÁ@u#ѬbÚ NØP ¹ÿ#P+z[ƒmàM3¤ù ¢Œh7!‡Ó^Þ¿XÅ;º­ø6#[[æè”mYºû¹G JD_zf7-($Ì Ìƒ—B*YJ1z›{N#Ü`»™6›IB‹„Ð#«AÂþck=ÌJ5fä>gA^1M>y™gÎóŽdñ½Ed«µFoRz±íkÝÍ&`¾çXkÌ!F@A ºèQdäs 3(ØH*ŠR°µK‡iêTkØHY:`deVXƒzœ‚”9"ÕØR&’@ƒI Z@ÍX¸‚ÀÚ˜þЫ‘© VbOôÐèH!á½ÆPü‘d Áyt¦I$dë)j 'Üehnž2e+àñi6ò³´¥KšˆN6 ‚»ÁØ3,Â>zI¸™`4v6s #  ZW'&ÚÖÌ î|q W˜öJƒDüPª µX“1£ZÙLS©ÈßúD l`ŽXYý«‡‘†8CpL¯­<ýè¯I¯³-Äà} OmPûÝ žèÌ×|̶/¯c·lÂú]ÌÓ+°N|úKÖ¼`e…ó fŽåÿ`‹=2‘0GqÈW¿ÈÓ±V !Ï­ðeè :n‹À&ôý!å µáÀÙÚa/ Ð$FÂr¤Ç¬€ãMP|M"ÊYªùÖû>û>˦wdªw‚êÁA$Œ'nµ”ZŠkƒi2N˜¦êÅ_6.·wûÛ¿Å~IB-Zköò‚Ý"(§’¥ôÈüðQ›‰„Õ"XV¹ù~ÉÞ)#ãCL…‘åÓ'ýð*[#§LD*[Öô‘ÿúïþM™Êöe3½¾þø·¿æEaï\˜qí(u»Ó¸!EÜEV>ÆdŸþ9c‹K©«§ Ñs3öô‰Yç}æAtQE6Ü›ÞÇóºêãRS¿°Ø»~ßñb7q uU^¾Q'z›§—”jï;gìJŠâɤñì>žo‘ž¹/¼Eï^w:7U€wÕóçˆö+ÑùI©ÓýÉþ"nø#´:ow’_·y¼7Å1vn çŸñ?»G¸œ¡÷ÿš—3tív6ËÌçyŽóíϵF÷ýý–‡þí:ø—úzÞ½éoQºÿ óOL,æ”öXtØ;ëQîùX×HaáLøvÓå:ÿMSÞ8áÿTL·ù§ó÷,[¿Çèðóù¿¼þòúËëçz ½a<™¼>“¨¿óJýËmŸ¼LQð©gú½É/»õ•´S¾ƒ—»ËQý¯S‚˜ÀÇ•Irþ°‹ÈlÒ2/’J)î>½l}rA¢ÑàΠÓ)eM²[¦º“(¥´î^^¶X<¢ÇØòïöt/ÕFoýe™@'Ð{Ï Ð^7"!©F¥–t£’Bu’(N£9`ÆòZA©§# -b÷1zJÑ•‰.6eWöT˜9²n^ÜèC¸NZ¥)»Ø{äÒUÍ­¼¢øNXšÁk±B#½’È–V«™)Af×bNE(³íŸ`eóG©i¸#/ʵÒÿä}Èáðiˆƒp(áPf©èÐfL/«3°—•²mu… ÊôŽ!Žõ4°â"ÿ=0âCâOÔ kÅ®bEÿ° 4¬Mµân,!F!0Ñ àH„€Ë~È”#q°$µ:æØ ŸÕMÙ’æÅ"—â%–,6uõÌì½3?ì‘tw.奖eZú’€¡ÍCÖ4Ks/{è£ÒßËÛMÙnJ*ÛÒ¨ÓD:„ý®|÷úbddà¥H@²¸ )õei¥T%Š{4…‡ËÒzOb.mü02uZëšEÁ‚ ÕJZ c‚H@BR‚Žüd‚¬H„‡Dªf0,{ÃPˆÒ…E"1";‚‘M)BRœ0ƒ™´°jªÍzBP“&ÀA*i@LTɽrä$ ,D—‚à€ËpÂlõ"¦Å™(D/¨„уٙN&29tiܸ/¤’Šì™YL“ù¦:¡Az0§j ÒÉÀŒthiÝ FgC2g¨Ž&ãK14ª)[ʨ8éJ( “ƒ·–Ë~IÕ­gŽ»iéß·(uEl 8ֻà ‚×µ.dÌë•©u ü ³QÎàóÈ‹2»—M?LüðwïmóãòÏŸ4Ï‘™G×\®ôp@kšmp¨Æ—Žïu÷v ŒõQ ÐÓÝ×:UÈ×u€µ" |3Qêhå€ ½­¨+uƒÞ‡Vjÿ(ê_ð°©&Ø#%¦ XsJv`ú'䜑­¹CßÀ9‘úƸ-5jYFoDø¦@MeaÉÞ3ŒÅº¬Àɧê/ÛɫÜ`¬%CÖÓ^&Ωm1È6®Í6_64ƼHZæÀ†2Düö÷x÷¢÷/*Fº~xá®±E¼Û²¸I-ºRÈ̽õ\zôž=ÿá¿û÷4›^^~ý÷Sj} (œJ¿¸–ýqƒ þr6®ºð;û—FCzPMÅŸ GòúÔ÷Oõ»?ûp>ïvÌüåõ(ðE‰‡?׫ñ8ý·ºÜÞ‹«ÜÉ·tÌ<úóÀ[ªK‰óÏèÌ+wâ~À¥ ÍëÔÞYþ'Ÿ±?Ô’ÿ]bò®2¥/€Ðð‘œ~ªqæÛFÀÜp'y¥›z½’_Ø+ƒ 'Þ»g{QÊÁ/¼?×Ù5Nås¦“_vùŸ|’ðDläÃa|ñ—7ì ³ši^¬Þºb¼5v¹µ¹Õ›¦ok=½<‘3ËØÓw{5žÙã>^Muu#È»ùð«ût5äˋs[TsÞ®ñ5×-*ºÌÝK¡Ë“$ H%3–æmQšœ)ÀÌJ™Æë‘›í„nˆL²ÏËd°Ö0Õ^kû´G†oj’tC1¶ÎÖ×úÊHA¨‡”Fz¡GB(uQiÈÁÐ0£Š+B˜i‡!j½)[´…-Ô{¬ aZ¡ƒH$¢ÍÖ˜!‚=‘¾©Sus+›.öp•b°õ §©4ÌV%Ýú2ƒ!=½”ú²R}?†¼—z_ÇK f+Dûß¡à¯ËŽÝút0kAýæ, ÀI°®Œ³œ@Â&d¬Øã‰ÿq|þD œ}YõÄñj¹. L[(À§uœe$¢Cqîźx¬¢äÚŒtࢬV}êÑ{ddFìÍ˦MÍ&0ɼl]™™±ôh(VzôùÓJ£ê=ûòÄO¯n¥”LE­O?¨nÍYܽ¸õÔÒ:€Z«jKH¹™êè~)æÝ=¢+"#{ï?îÚÒ[ 7Ë®Ì,´:Õ¾ïf+…ÌC—/ƒÙ“ h«Ú ÁˆôPõq7W{— £¨ÖÉI0hA—>¤<ùâÌd'“èR!%F(”$¢F¥DH«¨ŽÙ@#¡,àRYw)×Eeö$0bÂ,å¡ÐËHÒðÌü ¨!„4Œi«‹”ÃÒB&–&‰)AÝ3R-”4d†Pt¬Êf­,ŒH3»9­ÀK1Im 96é»L£’•ÆÍàÞh K#÷ˆRì½9RYÍ6ÅäœÚXݵ¥«¨¥NµÌZ„h ^1½¬¨.LÈŽ@[…òÑP `0Gv´OkÚ GÖðÚíz}¨t;âþ-.G2/À mðØ@qâU|ÏqÎ;!Ÿh«gÏt]Hóø,°âóê÷uãØÍAœq®¹íºÖeI¼‘Òª”N„sòÎ?Åg‡¶"6Lew°æWQÕ o4VÞÀó%ÝœŒxûöS6âœ7)|–Jxb:´u/°ãűò\c=}«N®¼ ÷X@gïc–ö©SלÎ÷Û5Qo‹oxžÕ9D%ºù¸›vÉ‹ãÑUŽèa§ <^Uº)ïàùü1χÏ3]ã¿x™Ñ¹Ñ7ï¨ô D¿3Ôx¼¸èZãa*é0ÏðýO.þòü¿:gòÂâî†7™Á§x]Óf>÷Ô:ÖZÏó%åò¿¿c‚‡oœÝ㛾»<·¶<¤¦ÿT@ßí|^–}ƒ=â—Oô·‡'q陇|s½û/饇հüþwîÏú¥?¿Ó~ârÀï1Dvüãþ¿‚_¥Vøí^v|óãóéÛ¾ßÓáM5vw~r™[å÷8”?örp:¨CÉì"þÓýǶ[¢÷QïOƒ¹™»¹y)¥s‡™HšU·ˆ¥2DÙ3 „´4´ÎiB1)))–Ùj1 ?Í…ÄäCbŸ¶Õˆž1µ»Ùj­îé „LN53*nm?×R3³}ø¤ÌØÍmY^|™¦"ÂIí[ö0KÀćŸ”È û~àOr*ÈŒž]ê¹êpa$EÁQ „EFÏÙ 4³êÓÆ¬XÙ c€µ{Jd™ HÒè%c2L‰Œe)VÊT m,‹@+¤˜J1"vŠçnZ‡RË!HÎÊÞID[›¼®„îž P*ÄUÁ?šjª fÔC )GÏ•§aGv` 5ÀÀºr½y¦Hf¬9q/ ÈDuL/ˆJüîQ Àp 0ÐÀcféP¼¦Q_V¢:0Û/Ý<‡|Œî]átS~üØÔPKÍ™Š², ¢%Û²Ó²Q Äáê-3$l_UªÊ ¬ —âÅÁ!ªD)…à²4‚½‘ Ñ•Fн¸ç)¥B@ë=ú‚D_"2?~Ø¡›NHÅ` bßlQ°•Ec’TÊdÌ5­­ ×d­EI¡#$Ô‘Ò&hb8Te7Nb&[dž|-R`OÁX ;©å Ã ¤£,Y0,˜Ò º‹¢™žT*…aC½Ê"@“ ž‡çè\°ŒsŠNøE£ÉÈT\…‡æ:£‘IµPBÆ$`ΖÄÈs$†Ò¤©Ö%'•άî e_XÍ™RRKfÂ6àš<£Ü‰¢É¹PV1§ì]´ŽJk°¹ç¯£îjüÆvAYÁ;Ÿôm©;-sôÁׯ¬¢·äÆ Ÿ`¼bû)ôÝš±;"wÖ=0÷¹xÚ)VqL§ÙañÒ|"ùª¶ûKÉ×k­£m@?CÁkýœÑâ3~’¹Õãk”çÛš¦ (ÈÑH´ö€qµ IÇûº判Q¾m¹Ý¸ý(ªoøÊ;O'é>ëè¢FüÁºû9´·”ðœ·><nbåó>€çŸui¾t½8Aî'ô›Ÿ òÎ;bž/§!À—8¶1¬ê¿®úÖ6,î>|Øýî㲟³/V¦J£¹ÓèÅËfãf’r‚Fe檑B!;€H¯&y ¤PD¯^éìRÚT6›)æÞ—Qðªå§=¶SôÅÈN²õø¸£›¿:—žÆü´g*_7ýã\«#bó~ò•Kä†`kóO;ú¼Äoþ—÷?¾Öí”î ” bîÙ; µÞ2#Z¬µ"kkÑ"³çT ˜©ìi-…¨îS­3÷:1)³¬ s@ Q27ƒBÑ[§fÙ»²›R‘½GôFIddv`ZŒÆ±!”íb­Ü4ôX¹êhS]ÑÛs[Kzkê$Üà:‡…˜¶è ˆÕ×~Và¹Ç¼[]C3WtÏ•ŒÊO3dƒ ØÈ±5±ÿ€åÊ ”Í*Ž’Úš®À±ÚG—q“­¢dÚúEÅl*u¿´eÎ>Ž›Z¥œ{+t§¹ùn¿£`ª½·ÔmÇÂdmð÷ ¥”Ý'GÙ¬½ºOEº•iSzË>7f6Ú3JÆTŒ´ t-¦¬›²@mîË®õÞ#kJ#i(SÉ6Á*þʵ&?†J¹!;âàÁ¡0v„!C ºAÁEb’tÐ0%zQëe+Št†“Ê$’l“"U€n„Ð8ô¦qØ«ÎÈ ÌT–œ‡:/xbÙ€Øð€YÐDPÃô`*­“4 úSâêÇ9æ½@ˆ2ÑE}­DQN“q¥ÖÐQÊšs ¤TúÚeÆ1Vó$v½o…‡R‰¶Ò-ChÌJk=)2ÙÇw‰ÛbM™žªdÑäPbÊè›-ߣ.™¹ ·Š"3ã‹{Wÿû^ë´™Ê^sÏl;€°tx SQàŸ¿°Î”Ö¡XA[ã=LD[ùûÈGÉ @ ŽV]‹úøvd jªïnÈ<¤*¹6 ñ0•xìû‰h”¾zŒií0ñí¢ÁNÈ` F›f$ R«Y±æç5ÃtWK€#àkX€¬vÇ<¸‘'ÊfÍh¦£N áÝÜ r!KO=ÌêÆ7ïa•æêP 8’™£ªÚ€b„²õÑñ›ÉÍf5NÀw/B|Œ æÆr¡ èKÑÜnkœ©9H-i4+ÎÍÄ©æFš¦tó—×åç v„KnÆÍ$#ÌÜÍôY›ÚbIÊÈh]-²÷èÁ«oß¿N/Ûí¯ÞE+åó±ö(Öð,ê²Õ÷º \çß§6Ž_oœkŸ«Ù¿ tÖ*úíµO9™yŠÏIí?G ~nÂùµ»$Ýn//ÂÃèÆÐéJž:7¨ºN|ùAÙN?kZåí"Ýw|ÿÛÅës’þüQñò­ð×oî•B?'¤ß%ýéV?Ÿ}_1fþœ ó_Úðü²|Ûl:™ßmè>Œ¤@n¬ÏîÕÕØ¾{ñïNŸ»8¦»ù†ã$:&®|§Ût4Þ÷pIe %šç†³çì©«íêwÊ÷ wë)xi*}=Ân¤2‚Ÿ‚ïøhëY‹F[Ü•f| |xaº Œ²¤»g~!æž‹'wOæº=ò¹Ñ¹:|¸Gࡃ8=FoÒ:»¹‡c8¡!ÏÙúL2DWjõ•f­ëº|žÝÇó±z˜Òm|zð9Ÿ ¤Ä3æ“®†Ž¤`^ÝSž²OrLwÚj½'"ØÍô<Û c~h{=c@]nn‰G™]·gšòi`sm9cñÑ0»¼­·Ì¤{$Áuu¹¨?Ÿt—íµOI/wwz³¿A˜> ‚ë:T¨žó¬N¸^5]é¿wèó7E‡‘uíÖqì(>?IÔÕ|;­‘GyüÉ.äLX犢çó ‹[æUø¨ƒ<£Ç›´:מo·'½8½KعÚ~ü®'s½ßxã“èúÍgåçÏû»‘îþñàq~©NÞO%_ø“„Ãê¤ÛL€p»ÅÒÍä¿ÚÎ?hOöòŒx¹¿½ nÆ»ì†wWøôÓO»ßŒ¥)ÂÜ}ªe;¹›¹g&Œ£ ‡¥'H£’&ë™l߀7ZgO¢ïçRÝK)ÅzÈK!åuC±}ÜYжuûú¾í>¦™õÞ2³ºKFyÁ‡O(Î¥»‘dL%æ¹ý´7“hQ2©$ìe;etüö“Eöì–nŽØ+ö=™°d2d4# «ì£à7²I|·[ŒîîmF¦O“Ó½øT2Rʤ›YQ,«j´ÈhµÑ€ìƒÎ.µÔžØGß©‡ùZ“‹Q8¯U8æaûªÂ;mŽhÈ@$èk9?FcXhúAy'àˆŽLxY%Ý_›&¨£þºÒùW~‹`ƒ¯0pä:2WûßÔAÇ(Ù0.ÛÀ•¬0 @!h­Ív f(¬ ì(uÂ2ç’ %ˆ½q0Õ3¦–Nø;Ûl¦mD:…ynŠDÂͼÔPÒÌ6µJ„UXÁ€ØkðI2)š9eóÇÈQmN‹H:•%ݹª®L&DS2;–O=æ4w¦]ÊR&woû°Šâ”`U–Ȥ5ŽÞ‹Èr@6²­– –`gÚÈýÈEtæ@$™ײ(’r‡9m e¦¤aŸ|)(EÞYVTœ-ª æ2²HIˆ¡ý‡"y°‘ä9àÚt² xtòcf£^iª°5,È1èm\0ʈ6Œ*Dc<‰«ÒA(HÐ&§5&%Û¤ ÑMÂDTC¬i%²õ¤)¯n;äÇÞ‹KìK¨ˆ4ªbS&P`sÜapZ©ëÈŒ`¾öÚÜJµHeÉ 6r¤úܳ{¥ʆÌf uðEtöþu³‹OC÷ÇazŽt×ÚdˆÖ¡¢ ~l˜^Äêy‹ÃŒûGtÒjøœh vØ„J”#cÐÖ¤Ê`y ‰1¹Ô!'ö¢Á€è«Åwë(:‘ßkÎh&XÖI-¢ÍИ­Âðr m}Šx ÚŒ 8Wµ2lMoˆë²À «ƒ„† ɰ/ð²¦××pÃH/eûž¶ ^á…V!  ¸UĪ›ØÛ=”¢[yÙ0¡H›6V2Sæt£B(E)xD3yÎ%¶Åëû_3…ÖQ7x¿Yþ~ kصºÙô]ßËYë´ÝDbÙnªÑö-÷‹ÿêmʼtdT·¶[ô»ö«÷n„ Ô þÇÒ3Wõÿ¿ÿÏÿùWû×2ó~EÁ•”z¨;…¡:ªêºØVv6:k‡½ÒêÏõ;ñù=ƒÜÉÑ_S Ç€ê´ 9ƒÎ*E®(£gBÄ)<¿çAua_TioTVŸ¤xËä=©ã`|v°Ðƒ(þƒâ±êz» <æÇ|Ó›*;­›õ ñÿ`ºؤk§Öq…¤™í^ICºŒyÏ '\s¾‡Ûþ3ˆÅ¼Ø?ñYó\X¿{GînLÞ¾U¹ ¦¿+¯?}û¥»*?ª“çKRüÃò©óÛ»âæ/Sî~ao©îç¤7ÞÜ? è<ÏrÆÂWul<’kx¦ÞB¨oV×u9¸˜¸ƒ¾b¾$pä‰Ë…]÷.8ÝêVYÉEZܼ˜Y¦˜ñ`bŽÖ»ÄR Èe K±ÑŒf–Ñ$»ôIzï˨‘òªè0ãæoÿ>—¶|œñ²ñ'*aÁeÙN›TB˜^k´ÓÄâ›Í¤Osºs?/[ØÒÝ@ʺ­YÙ£µŽÈìúŸ¬úø?þçÿæ¯A,Vx[J”mN-z¼áô™.ë·n—¾ªàñþæ^MÉÍë·Y"]–üÿYDôT%8UžSïÄ GÓãû_ C?¨u¿ €?Êvà¹CÀ—ng¾¹¤ú~Àóbç+ÑùP¼¬ï% ÿ±Rˆ€'‚?èüÏ+â*Ñü퉟{W‰ß}û‚sžxò¶ÂŸï–ñOefKÃÿÊ"ñ–r̳áW_Ô§67u¢ú…Oäïü…ú™›M_rÑ?#§2×RÜ™]Ó¥3ñ÷J]½žÿ^oºFã¸õwFßqzã*EÞßð<{ÔÜ(º·6®¾éâ¢üb×Qâ9Uz8¬/mÔß Œú–ÀYéü³˜ì³ñßw¼vÏ~Ë‹ò±/ÿZ~Ã’u±xøÚÁqqä|þ Àïû[ó‡]_Z_zöàÕ­“P-Éž1•Ñ{Fº›³ 2 ÑÜYÈŽÎH%Í-"Z­l·5kauAé´í¦–iŠ,³.-{_‰p£;÷}Ó ú´ÃÒX Ìê%-±‹ºñíT—Ý~™gƒ•j~÷O?)õþ¯^ñá¿ÂÌ̲wI6°¶±ö12Z„Ì8ŒD!e&•]KVe>AÉÌÃ7V7Ó¼ÏÈX©ŽdŸ»ËÒÌŠ Iž µß/;µ‚ÙÖê6eS1Qè-–¸KÍÒzBBöCwgú8°Êîô•ø¿¾kÙlÙÀl-ÿP7„YE¨lŠ^¸žÒh\5Bf¦"±Àºà¢ÐLpPæ m†,Wáï4̸R;@DÀl`K4fµ?ÅWbà+T„ú ˆò:2C̘ÞÀ݇4oe“ÑafÅ„:,•miÙ2–l5aîÑC–ts–yî^Q¦%I÷µEe(‡½K=.RÁ½èf½g*!Ò:–‘ ¯”£¸­¥š×”åjf°º&‰ÑÓEÖ"EôT’™K„²eviæÞ(Xv–]ömÙ¼V‹lP›þ¦.MûñÅ>ÍmSÃJªÑÓïÔ¯¯‘ÁžÃž=›Š—(¥8A¤Ó FÈT‹¨ÎÖ:zªõh‘½g&ÁQûÿþoþêI§¬Îƒ¦µNû:ž8"~õÖ*þQ"Ñ[”Á—n®b¿HázWvеÏÛ°õXï/UÏøZ½øÂ4“GCð7艷 €7è¡?ßÞæëB÷Ÿ_­~Ôvü €?Ð%½kü=(.wNÿ-í/¿η_Ø?'èü·\ˆ¯ZËÎÀu|Ó€y„EºñR>þ\ßKϼm:ŸD¸×Bw÷¾ó4ǧØÝEXRÁÁ)þ®)öEgß±Ýëæ³ÏF=Ó nòÉ—Ùö+’ÇÛêpÁ¨y$µÜ©¯<‡~u¤m §ÂÓkÚù‰™rѤ»:ûý‘ÇóPìQvìÐ{„É>ze]~Åùuã[b„n.äÍûαº€ÑÜ$+ζä5¡‰ÐCYôP|v<·R÷5¡òRƒ¼BÑí€B¼7än/Åõ(âm&‡—ã}mjÔƒkz‰é¸½é7˜áN ù‘Ÿy{./Ä¥„nú·éÖ7‡¦SËðõ <®‘RGRï˜"Ü1U=ŸÁºòá½wø×-ÆwóhkýuËK¥0CººZ9›;7ŸÓtõ†SkñÑ@ƒçÕ2w°<ÎѵGâ¡GG[ã àŽÊ~ÜÞÝ%9ñ\r{ð<¹Ó¹|KYÒý¥T‹g-Þ:oô~Kèây~.6?íp<'bx û:î|žÇ ·ÔÝXáyžàTŒwgÛ~–íèžF½§ƒ==ŽŸX¡óz#vký–-ÚùùþöŸs<ÎýO»ùÓ>[O ݬŸê°ü]MSS™Ù#h& µ›™ÑI§L.A-z¤zÏuC¨z)CÆémq7sË6(§çT‹YŸ÷ÑCñéò›MŠq’©²É(S_ºæÆbè‘­5H[Ú ÍûÅÜ¢¥Ûÿ—ÿWIM[¸ÌÖË.7î6¨:zDKKìÅØ´9€Ù’eÒ³ÇPh—9ÚÒ}"’ó~±Rè–¤R© …鈙ícæL0zŠ¢O!2æè‹¸Ï¾(s 5ê<ÈÀbd :Ê„¾ûÊͰ&hüÕÔ“0À,St ß׃ I@>¥DÊ”‚H‰ePøèè=]Ž0€„ µ®ʇ‰ Pk òPÇ+QÏêñ d¬…Æ+ÜÐ;p@¼ ™¨åUP¨¾ÚŠ– e*1ÕŠdëA2zÎ}Þøôú²ÍŒˆ¨Vmbfd&¼×íŠ:±‚êè ðÑ¡ ‘$¢uE*QkA"¨Öºn_­7ÍŸ"fÕ­è‚­ËPPd`´HeôïyÙ'Ò“O˜Ì`ÆEB“ƒæm«›µèØl¤€’64\•Výq1À^²¹ø¢bTÂñ‹©CæÑ>FnÓ¢I™4 B„[¦Àä>3 ÅÁŽ]ÂWÎ<ö‰˜D" I ˆ$}tˆnp± nª£Ã„š ÉçRÒRHjX0¢A]”Ãl;4&73*Öq `ðÀ³'MŬÐ" `G*Lô w.]™áÁɼ¸MÁ…D“Õj&¨hó‚¬Á€K¼mÌÜf!Á‚Ÿ´dÈ‘¦ÊÐg,=Þ½ ÝÔa´b¶ïŠPÙ3cž?‚@©+z+ûabvD®ù°aû–çν‰4ä‚\FJÌU+mV}úÁëKFŸú©µÝfûBûÉøÓˆF…þ±êß]Aà ئC¡½¯\þÞVÖ›=,ÄG eõ°­@A_ÖB~ÙjG¼&û mA,kQÿñÙϯl}–ÄH6­íJãÃGRdýCC V€X— /!ƒ[‘*²$Il³B3[‰@&A^IÀ”0#]SÍ Ë,%hF°‡¸ ,ÙÜkñ6•@°øË¦,Û ¿›íïþaûÓÎ?. `2+ÛBÞSSáËK™Ê²Á'e™ªöÛ)hÊlŠÅ ¾“•sF³\z¡G´Þ羴楖ÿ¿ÿÞÿõ¯ˆäˆq¹ÿ< ZîIGZðiqˆ¨KÞãÙ&ó¦àŠS—{¶ã?| žgxþ—k¤.ޚǃí㺧B^ð'?ϼšîˆûW«OŒ¾»ÈxC^Å™Ï5â Ø’n5±»Å&úL¡Öq?q¨þ?3 ÒH=Q¬tGîÐÕ®÷ÊEî‹dßÛ?¹âÕ|©ô%y}EÊ}@îcMönMý¹|[}mQvïÛÏÁ»_}õíÇ™òíBö—ÊýÇswœ?ó6Ïtj¿%¼ß–½ûÌ=ÿº+JÒ]ùõù÷þ Bçu_=¾ùÞã—fæí$ºÓºÎZàÞ8ðøæYÌ/Í£¼qðmžò4žé/€òsò›’xß5»«Ç?ûŠòH~¾ÔáM]Ÿ¿ eÕû¢ë7.?pÕiF! ˜ç%úlÖÝa¬Kv–ÃG•†š%³l+¤fÙbƒöÆV0)%‹Ðji)ÉâÉÌ$míЛ¥†ˆAÐ “® c÷ ¥®¬•ô•ão¾Ïæ(òéðA*›lEíd% QÌ”D:AXJFËÌD$sä{Ö£2A;ì´XVÝð° #Úl5WìÏ:Æb”¡SîuMá¬+6¤wh¿j‹c1¾ö:ÐP&wmvŸ–ˆ4ùv³që #{dCss’ƒ»²ÝNK›³ i3’æ@ -@påù´ŒÌ”Ü<ŠÈ!G÷\¸|ŠH¹c*2ržû@G¤=sô],ÑÅD®9áò@#VûêC`Éf(Ž&. o”h!ÄJ|Ð!s™LÉR‘•8©®NžNÖ•‚ž{ìePs‚±kO5‚ƒá@@fª%Œ4µ>˜€QÉ=4嵚F)2e°6¨(Vrö%CÜ…X«ÏM0Dj|bRœŠñp1e®¾ÓÉ„0ü‚è¹úʤ$K@áx&á€GVØ©”z¢í; †ˆ‚Fu¡ˆ­çÄÕœ ]KnÍ6“¥ë“ú§}ZŸ¬í [ù;ŸÞ—Í?Û§X\™aš¶,t…”Ügï=še†ú‚HXÚ¾çðâ•øcrŒ¢û< ãl0Ct~®t~ tOÓk¡MéxA©BéVBq*ʯ´ö‚\ ±Sö¡øŸ¤BGâä>Ì-¦ †51ËG(P_Nè †[m}€ØcxÄg äÀhî1`âð ‘«¥ðIƒÔÚ½´v<$x—•w4RGm,ÀÈšØÚNd4Â^áB…d6“n e3Ú$ÝÜ0Ü]f橌„we¦B4té/ÅPlV2«91º‹¡òwÿðòncSɺc-åe*I¸Í»¹šs×Õ£…øþ…)xÉOZÏt0?í0Mîãqš2Õ#œ`Fo­Eëá W/S)S}ÿ·¿µLGoäs;ïK=ÆwªòÎKDpYWFò^t¦ÕéìÛp'Ž=¤'¾ºŠùʲèVW}(êé6FÂ/Åúåþ»'›§c†å ñª¹Bâ›;Èï\nüíøRöË“º¥¯æÿYMí<»«F Ài%- 3•|"„®ˆ ÕVõßa[¯ûhYr”Œ]œ‰|†k­§G¨­m= ¤¨¤Áê/(/!c)t8P脽8 ÏX6à ùÓhjqµù>wlx@ñJ7NÅõ&áÙQ·ðŠeÚ ô_ …ë¢DÂn ƒâ¬@% ¿a_|(›À è«gÉði¹À+RÈ‘ãiä!±0Àÿ.(3¤äJ"{ÝTs¤ºPôhHE)ŒÈ)¬S¢†Û‰°â^Ù~·dköZý¯ÿ¾šùnÆfÊõÞº¬Ô˜—B˜¨©bßséòB£-‘U2#àfÊ Ò)Qˆ”“J°ß·ÞZ¶°Èˆ P&¯ÛÍ˯Þý»ÿô?œᮞ³°µÛçü±=\T¯i‹¿à]àRôC!Ì)K¡/;ø§2«žË‹W“俈œpx\›u1º¾ÝàšøzÝ&¨þˆ›¯V9¿Ô{öO{ÖÜ«Áÿ¡úO :ÿ ]Ñ[zôñ ðm‡Êí'lÊ£Ž»}9Oüœ)ºg_zLäÞ_Û•{ú?» ß¶¡}Í-ç%zEŽ€Ÿ™$¼"ŸU’óL­âÅ_žE x{ ÷Ícã $_"CtÍLçó ³ßß°¥nD˜C/H9ⱸïªâS+ŽåB«ùÌÓü¶KðnÚàx„‡Ïæ-/æÜ¯ûâ\.1F7Ôé³Ó8 ‡‡g­ \ƒ_žHS\Ÿq‘¸äá˜t$‹ÞÁõŸnÍÙ%»í&ºí~= ;Î9C<ÝÙ³Av=°ø0C£³Öˆ›Î'ºCc?ƒäyEyì¾ýØãpº×S| ºb£é²‡Òpž(.É4«­50Î ré±Éá1Ýíüît¾^]¨ã ½·šñj7p¨Áj˜‡ÛÛq‡@E ØÑ±Ž­ÔÇ/Zç¶Ž#öØëyïJö?}úÍoþY)Hæ}0‹€×R¦jÕafÅi4ƒYi½Gv)S+‡‹J¤ÜJ-…‚%¡ dj·ì«©xq1s2&b döZ<ÒݸÙö¶Æb@,s²€Þ{ìï'ÛV,õþu»ƒ¼Öe¿h2mnêùñwŸ0Õò»ÿ‰¹ùê©Ù‹-¥Gʲ˜X»ÂsV™\Ñ’lËÞ¨dÌË.ØÜ„ÆH¹m0¹²d’,fd‘§e2{kÑLÕG1½¥²Kg¦ï}˜v+F€æ‚3´Ë¶¨kT¤ª!g˜¯æºyœg‚ùŠá.[€èË`¹À ö4¸m¶Z5VÒB½‚”"f.qT¹“CwdÑ%³!§X†)³¯”ɶ4DBí c h'¸9ãj€}2gf£q}Íà`o dùøŽL0±ìQ*z;”Õ‡jnJö¾DvCQÇËË+ió~é-L¤¬õîÅ(¸ûi9x›”SæZ‘Ý‘á ‰EDš»Ñ̌٠Ȟ餭©®áìHIp ÓEÒƒ2AÁQîmEtYg-@U4&±šéCŒRE4šE C“6Ž4v‹{óÈÌþ. +´Ÿ9î$;kÊ*rxÆvΆè‰Éàâh:@¤\K¹IÊ‚Vj¿˜ÄäcÉ#“häÚ¤±¸,–.ZÚÚ4ÎædÆÒ|·DÑÌO­ÑÒFW‡¯Uð6}“)I#”ŠU±at·ZÍ*mJ:Tlª€E¤O¤H«¾™0®'™A«[š¸,©YXä£cËsLdmåÑd‡ ÀìlÑ>A 4Lïõ5 P^Ð÷˜?Á ðiErÙmÊ|d ø Œõc£!û˜¤£Ç¢Ã:¹öîŒq<¨eà Àü à~`F²ÒÜ ™-å°L&B4B±Ì3©„úÒÝ™,Ãfžd–N¸Õâ“ü#i­Ç¾·Þ5·Íÿö¡Ø;ÿû¿B”ž—­˜6UDŠæ´òus2ÐR¦Ó'{ٸѴ>ÿ”j½3r鈈P(§©Ö—ÍËïþýú?w6Ç ŽñÈQÕ¡‰‹gÕ0²>â.O(—·ñ¸Ï¹Ž—õ´ÄCwUóK@Î÷wû_G›U>°<çê ”V°Dwyì1¢ˆ<ìU ­(´ôuJŽ¥²ŒÉŠcšF?(%f´i¦³šrze©´JzdÔ§])T†×j¬±„`f ƒ àÄ¡·OðuÜef˜§ ¹³ƒ ٱ̈́€àó–ndbÚ!òXõÍÛcØz³¾¤™´J‰HÐa#OP·ŠM>|‚ùæY‚á·q–,Ôø­Qs5‡ãðüL!.ešhF{Vp&\ÆâSÏU±À²­=2Q¸.*áœ*T™NsO ³Ê>zªÏ°¹àÇE™¾ûÞͲg_#÷k{^¹ïþÝœrgH!ÛM¢µ–&hm¶›éÌO¿ùøŸÿå_ÛcioA¤½”VÛüÈ뼋ÕûuUDté9¬Kæëâ]‘ºØÓJCŸ>¥¾´Vã Êq ÉÌWÅ”³½‡Úÿ K?K Æ—ëãzeG.œ«´/µiº÷¥ç•§çeN_zH·j?9¿åŠð—î5¯4â×…Î/=Ô[…T÷ktîë§·¥Ç_¤Ÿýa¤ät^ÎüæÞÍ ¼{2è•*«¯v_ø ˆ7Ó$·ŸüþÏŸtþ}÷×›éë󺪙ûÊ›èçjCE?çÆ?ÕÇþ¨á‹~}ýúúõõëë×××E©¿¾~¦œÃ¯¯?¬~cGzÜBWj¼˜h§þÝ¿ù›¾¶X[ô”TzZJ©¹–©Íj)î(fDO‰ŒÈH¹[-eCÛ&&/Ù{ïQ¼¨•ŒPô\dÈÙ»>|ÿ1m޽š'fëJј=;úd³±@qIm=¨Öú቟—d®¤zfëñãa¿4'vîå‡u¥ØõçC{nëšµúÿ¯ÿñ»ÉÌu‘^ ´èk—Ðj²°:ÓzOBˆE¤„†èuWÌ0{·ÜI±’ŠÈðN)VjFÁ¡DËŽØ}tš';­Z_W3˜‹Jª›Š®P†R‰.$úŠX¡€qÓú3a^P‡*'ø8:@#Ì2¾sÎRªTÍiuÊ­$à¡R˜Fú씑= Üôî,ÊÌÖ³G®={WtZô½àð„ìÈŽX¡¥€†~Ø>Á—¤ªl0IìÝ{(ƒÃRx˜£‚ˆqÊH¤C ÔЉ%ÃYH(z[[®È®R\4Å}¿?@Ô,@æÅ'/„-KH™ÊyW3¢–š™¥âùy‰Hî=Gµ²¹e¦3#m <“ Ì·ô+¬²µuÙ/K¤B²QˆIA¾©Ç55ŠÁœr¡ãùwDAZC„>É¡”Ѓ"R¨I§§Œ UÈ ]N»^g¦°H­ƒ»:Ã|>´®šh fè©Ì” A(8SYeÅѺºbË:-±>€ÐêªÄNœABÁ,2˜Šh9ò5"š„á,@tÑŠ˜p±D5!(%ÂDAH#K€Éð”krŸÌ 4KÂé*°DF 4cŸ2ÖAô.y·âeø –ˆT@4D•› X3eˆ"'­h2w'ɆDº#vQ€^Z„²èª”¦’‘+Ù«£[·v *,´ÉØûHŒ‰âÕ8go*‰2s´NORнÓQ‰RI˜±Òg· V}W%$™ ó:Ñ,פ™[µ2‘(£IYž~S'¶ÿmOC´"¯(2Áá¯ûÒé ±^(2D‡UÐ+¢zƒ^ ãïºo€ ÔÝ<¥ny…‚cæÏ·œn›'ùÖâ\ÑÎ-pr>šDo½Ay4ØŽ#™HˆN¯Ã|Û‘<Ä'™`ƒõoF7y±RʤôH«t¦eh1ˆðÈï'ôí»iþþÇš:,p >>5˜=¯«`¥>í¦hß=‰©lɳzÐíü)k$ ½g¦Š‘¡ÞzöÞ[W¤ÜŒÅGíÿñWÿbóKßjö¹U7òÌ|¥“øD‹äãK-ÌÏÁø5rýõõSmþØGðµŠÿ›BêèÎüºûÿÑ€€þ×÷§RÿñBçn@ïWæ˜i†Ráº(÷ÕF–wÞhWy²oÉ×­SÞI/­ùòåEç(‹›Gñ+4«‹–„±.Ü;óÎïáŽT‹;GpÞ⻜¾ëåV?ï6›Ö[îȶæåª]×Aðviiwš46€Ê…KîËÑ<î П]ÝaÄWè¬Eñì°t9ÎÄ¥éŒö"\Öâ_}ãÝê{·Ók\š‡Ó;¸)^éKŠ™8[^êùG5=oµ/¦†î”<]ÏóW–*\uÜ9ý­¹Z·³ïü¿«Õò~kÂv Þ0ѽ…ÏÜ”™¿ çyÿôÙµþâ­ÏÕÝý²~7+Öˆiœ5/—²K<™ÎíË/§òèÕ§õÀÓH¿ ¯t3êop½^?*bº~tâñ-›eV_º7=[àȇ7=¼´wOj¨ØCÑ1zø·ÿúߴêÖE‡›¹™“ØMå ˜«×j‰4cdr7·lNÂ-#3²¸pw/½çñ‰H¢÷5Zcæ9Xͽe¤ÙäŽÌÕXDrðšzzDGŠZ—¤Ìh¡5ê‡N- ™AHèmc‹÷céõ{Ì»ˆ£ç§@‡O ÐWж“œ}è0‡•ÛTAA,ЂÐLϾM€…rú# g€d;D_²Öi=DDÔ©h•R¾ûþ©­«n6Õ’‰å°ok"„€™»—D‹6ÞP×Ö`2Ø(/¥0ˆÞm*Vª,QóóúKJjr3Ìy–mµp0!Q,@“i@ûÑAk":"¹®[SD6ˆvb‘@¶`@µª5µÈÖ·è åK_Ù*D,è4HüÉ.ÔBšhè‚;&ÐÚ4ÁbhTœØæ´&U@¶Ád$(w” 6êí“I™‹Œ›15K†Á’˜@§Üè2§«*"ÍH0””ê…nIV³%ÃÜ'/J5oFCÉTºfôJ!…¥¡¤ag@·µ&30=Çó<ÅžZRó”çr`³îµ•5:™ýáÊ–`檥çú wšåA²Œ–’°®™Œ0Ùðäèd5¹¥Ï™bŠ¾Ð»²÷5@ÒH˜T¬LÆ9#a¥ìv„!—aVËEìçÿv’=öÝ^QDÞ§‰Üå𬂛¯Ë ÷~ý–t¿œö2*?íZô u™ï–оðWoƒd=8TáZÁC!èòWÎ!Oï¹Fg¼Ù7ëV­»%ù<e¼WNýÂêøãîéì0N»º«šý¯Pu½çêÄuцÎGСó»ïõ/½<—ûm çw¯Â-¸é ò¾lÁË–äü¬q~¾BÉ}祹úÞWäÐÛ“½Âéü¹BçÏÊôɼo?nn6¨w´ŽËaÔâñ;]¬o?êQ2â­à !îvóè­®½³<‡ÎÌÜu{åøïoŒÅ ¢{©ŸKd÷;ó¥¼QïñÈ?óâ7r¡À}sNê¾<Ãë¿\êÿ|39¬ ©æ2^úÂC晼¬¿¬×E¤/¬Åxoê›7ÿ÷ÞUÓ;?[W*;ï#vØm£^û­ûg¦/ÓdOΉ9zýúóØxîlq¥¾;­Ï²=âíñܵiÀc†úû&Å{ßÌwÜ”÷UøwåèëÖ×–à{ëÞË­u†Ny€=èOÔ}A˜'>.ïùuç£ùà!:Ȳï(^Übg¿É³-ÁÝùMæèêÁDñ§+«Ñ¹óÓV~ÝrùM3ï+¾ýu샡໎—ý†Ñ2©¿ý·Ó÷«RnÅ,¬X-FƒÊnr!><Ñ -`æRITÌFö…Æ”ÖF‰L?b€œTÂÌÍØ­P…&2b¶6Ôb«¯X×µ+f%kJ™×¥÷e5·u‰ŽfB;t õµGJ…Ü™èÑ)1ÿú‚÷K*{„Õ=”ͲÃÒÌ§ÖØÛ:HKöbÕ‚ÙSlqXëäîì}=ÌO© 9¥9äÐhõ)[· ëv çðÂ]ÀêVûO‡Ñ7é%ú wðhû1Ø5§òk œ`Jºvä ½Á*ܱûž”EdJHx1AJÄáádâ±´Á6×´a‘Bdlmi4¢wóZJ `Ò”Û’kWÙ•tŠpçÚm¿bþMüþ9çê?|×ws©€iòžèÈÞ¢{áwO¨%ÅPæ<¹Ýß±+S™Ù#Z‹j!%Á2y™ç¿ýx®8Ÿ•Þÿ9䛸?èüûv··~ ï9Ãoä}kÜÕ\}kѾ¿ç½ýó›)™oìøfqú᥹Ó€__¿¾~}ýúúõõó¿ø@üþ㯿„>Õ__J3wómà¶Ôßþ›¿éK“F£“4ÛM“—Œ(nÕœµ”iâTš-X;¦šNž¶å½Ébž>Q•32"FA¯Sˆ˜jq#Riðb4« ³Q>l“À쇾: ¥ÿàùãççþ¹‘‘‰ÏË즙h¥¨—(JlÿÏÿ±wÎÕzëkëfjfª³Q¨ÌF¬=úZ&·h‡H±ç"°p7ÕšÑ:Í3û(匞Ø ë’jÝ1Òªµu)ËÏ{ÉXjfÍD°Ò²§‚fÞè$ÅѨÃq4ÀÚûëV뚣|~èk„€XaÜ!“)’uªOÔ U+3KQr X5¿3 š±ÌEæ*Š®\!Å(eľ#‚ŽõÓ™{FƳ `6 ù<`ÿŒèˆ#’°£,2þpžÄÖÑØëFÕµÀ ¶¿ð&‘NG.È í,[ô& þD7e@c¯ˆ­XÀÝŠ*zïktܪWb]¢µ¨¥J2óALʌ²웢ћ»Ïó¤"ÅpzT)h"Z6173Òe¨¢~(ÓÇ¢šMÙØÙPmÆlöêºß/pqé”+M(àðpNô„P£ËA"–ŽCÀ%ï–‰žáTúÆÁ†pÂ!²9.¨óð̧ÒLËžxèè+˜Ã U)D‡ŠA“òØO\\Õh¹¡W:Ű™Ãø€pT°ŠR´ ¿5>……'LNTL€ÌUÙ©n„<ƒ2? (EYÅ ATÀ¤" ]Ã%+»9™›Û°ˆ°0±S²2K¤Ü‡† J Úd÷l™._"­]Õ8 jM÷™àS:Í0òq`€.(wÅk墶.J[é2pŸØ¯L Õ Ð”åsk½Kì½aßs«Óq8+Ú˜1Í0 k×n3z À=3äîær'ͤÖU:¦jS5/V ½$‹¡ôÝTÝ¢¥y13+æSÕ°XY‡6™m®ÙŸd¿QtãÈ¥‰rn}6©-Ð nÈ‚›âŸ#õepƒÙVkOƒbãf1”°‘Ù` d“é­Àt‚†äŇoD¤Pa‘€ ÀLÉTœüb•‚axí`niÅ<Á…ÈX©$›Y¡[eq©Ð‹£Ú4!-:öŸ€‚§…% L¥Nµ ¢šŒøþr*ôi PeѺªP=’l» dî>Êé}ixš©ÿ­÷µÇÚ£÷áÝëµ”yúðÃGÿì_ü7›ËñIU>uR’¯sü_C³àö+zç×ׯ¯Ÿ8d· ¦Ÿ J~Ê1üJÀ}ç+3Ýýgº¸ŠÐùol|]=÷)±‘™ç6Ú¯g^yx=JŒ<}Ë= ¯Z"^׋î]¦û¦ x©ÿ¿~O9ëx؆v GyÃYñôK—ýt/áÉ+Iê×Zc¾mbÑç׈ëÍå‰àÀW,-†^œb·‰}ÖgyÖË€‡cÎ×ÿþÅÖ¸8‘»së=UÙ$õîË!}áA^¥ßåVóÁûõ^Mô½Ý#¯y˜ÞV8Ÿã“te¸ËR^ar?„Kñ—ö ž¥ó¶ßc²×¾ô¦±@_~é.oùÛ*ú·Nåõµâ.‡ç•OàÛ×óÔðö%îc—Ýa÷‹)nº¡ok¸O£túų%ùõ9ª—º¸+õѾªG¶Bw®”îNísÚÓ©õK[+úÙƒçâÜOÿ=|ÒŸ!€¾8_¡{(›‡õïçmËßG½û~¸ÿ0}³óûŒ×³ç=kï¸ß©c³ÿ+¶ïlc#èÃd’ÊlkHšžff¢u¸±¸ÚJ¤¡dvuÙ<õÖ¢­J”+z ÿø4Í» ²%ªZZ(ónš·Ø?SZ?íÿ×ÿ,æŠC€¹»Åh)í ™¥ ­h µ`²¡@*"ZÇTì©Z;ô– ¹×ê•´ )8×êFrêëš®Š´Ì.¶ DD4&;$&"bÐlЊÐIɈLÈÃ!DC6dG_¶êÚ2Ã+úa+B·« áÓ&´•>UŸŒ•¬bMUY5N61‘ˆÌaJ‚2 |§[¬«"Ì,±®ê]d,K®‡ŒÃÒWöV‰´nÁt(aD$¢#;˜à¶e&äg”ëo# ›h¨„ˆ:1ˆÞ£c€(²£'ŒP#U`©UàN†°åÇp—º—ÞûÀåøÀxëÒÍèÅ‹D 벺U @v¤ÑHŸªIX{oKÔZ>||Ê®Ì ¬mÍbµ­Ý VLæÓäi‡ƒÂdV†:Óai½¥z& lzBξ*÷*p›J‹…%ÒC)™te‘,`M¨°¢Ã–˜„$Z‡º%®ž¬bˆ1äú„€âì©4ÏHög[CûU6Š•;SRBú¶­Äȼ¸!%'ŠÁ“ B +$;ÓÆµÂΰ— Ñ¤f" UJ#TT3½ˆÁVUÉákQwœtTœS’HKOZAQ´n‰­™ ÊFwLÚFDq؇iZ#ÂÒÝÓ5¥™[ƒ±2IëJd¢»uê ‰ #¦Q(Ÿ,´æ‰Ô:|T ”L'iÊÈ}Ó0Ñ5§øÜzWh°òK´U^`É ª™4() a;Ð`b“Úˆ:Ð CÙd“,Ó‹Á#{uRÏ¥ž¾ÿ¡LŸ›ÂjQ ¸•iê=Ýœô4dë^±F£‰*t5‚åƒÍ™‡¦ø=!Ð`!4Jˬl˜á÷»aJmKèˆâÞC…Ï‘O2Û’[‹´ u V‡€áÅ3i8¢¢”˜ð4Mc']Ãd {õü$3iÔÑsxä¨BS š™ Ùi€ÇâLŸ¦ á^¦Ø3áîæ ó¾A+f{ê?ý§j«ÿÝ'­µjér÷ZI£™õ]ÍÝ=cm¥…vsÒFºÇÜu¯U©3õ¿EVJ™Š×êf ÿå¿øoŽA˜m›zØ'òâKs(/ºýô L×ëõ]–&´Et_P¼yU‘zÎÄxùÝ‹òþ—Hì¿âQøýv覂×9Lâ|à£:Û²èA¼vLÞ`ž( ¼9þŸ£4Gç°Îóû^ày¼L7âÔ­›ôñj½¿èøî 9—ä.UªŸ1—õUÅwOóú¤ïaCÎ}²y.c¾§àܳú=êèUIþëŸ7GãrÇÊ«,îÁm®Z|®l·_Ùì|©Añ7ú Ü%´|»~uî·ø ?[è<Þç)ÿÖ‘<¼F_²E¿º °³.–¸«{íª à”h9þüšŸsuE®ú?.mç/¦Çë®È·‰™³_ѵªËgåŤË^.–³Fºë5—|•Þ~«W^¬)| xçפ/Fì.%DW)†;*Ï+ýz/¾B_cð².^Xè]êÍ˃öEõ½ÍîIå÷Ú·\ñ61ûÍXJwþ?ÂgxÆtîJVaܶF^ñq^øñ:t6S,Þô_”¯{óRFôlšœx(¼;©/㺻†g(MI»Ç»ý ˜ô(ÛÆÇ"¦@rj><Ý«!Ü3º±[Ý÷ô™s~Œôæ„<õ4ŸË¿—‰9½’˜:«ˆºbñÜÉ<êÎÕ½àd=&¯=Ú}ðê«ÇJ|–?³õʘH·$÷c1ö=ÊÞÝÅòÜ6Mw–à“uñyÕ±|‘‚{ùeÞyDpëH?»>çÿ½XÉònæâe]Ç®L/Sûn8þ…á”îíî¾Õ÷®¤âWnŠnÒAgóZ§ð•$ç1ËÂëe'ÁôWáÑñÏ0™’ð·ó·m¿"UK#ÝlªaÅÍ=Ì<3CFèó!|Íïž¡ˆp“»™idé‰R†š‹`@}š¹›3Z,Ku‹Öc]•i$²W÷ò4E—ZÇæ®C_ÚgNY"zô~¨eÍaš«B´¶þßþÂÖÞhˆÞÅZT"QzᙽP,XV1I¡ F)2V¼0s]ñTÍ¡4¬‡æÕŠ[‰Koµƒ-Kk¶›ëã©4ʪWP©È.L¨²NHv€ =TÈ!£wôH°‚2ü6$ʯQv#¸nf>¥vôj>[Ùeá^VXŒ€ËeU",ÇÔÈž° öž½2óhÙ«S}}Îõ“ÔÐû´ 4¼!„€€@róìÅÀˆ#„uŸÃtãJ%hÈÄ©n}¬Øé„N¤ €'H"8RÂ2Ez)òJôÅP'fŒÔ $ºû kg‹ZiF ^jñš‘î½k]×åpp+Ó4e×þs#•‘d)/Ä"—%ÒÕW1øôôDºM¦ÓTÒΞHuzŽQªÚyLrÁá>; ëÚMå7èL­mÞ%£££/´… ÌU ºX]!ô„“ZsùàŸpÜ£@"ÉdBæÇ›Ø†@nd`ù¬HÔI”z²w©Á&<@P•“ %`4SOÀð‚‰!ÂCFf']ÏDD6‘])¨ÁÉIçÁVS’T)Ô &aKƒiÊPè¢ÈØæ|zbô]%4Ì”\ôâ-;IÔ”÷T†‘¢è*¢2¢1!kˆCª!³+¤h"89­ -”Ë–Tƒ#’…šÈÒ¸,È9†¡A²Ú^Ù2¢ƒ@5Z:¼¢7D|ŽÁYmÊi(ÇX#y64÷†X`'L ¡ÎòIMÍžÈÒ‡ÛÓÓGóŠ€ïf¯…pG5š in4’D—ÆrL'  Ü]]*t£"#zhgöÙMa‰tý ›#"rËOuØA€?>–AD£îË̾Ù9EiôÇÄѰD«$$÷„ÉRµ*¶¬´ïJy*æ5{f &±¯¹vz™Û’¥"ƒÙrÚ)ñÑÈBÇ t)¡$d¥XÊH³Z€Cé½fÐǼ˜Hg©^çjU(•ó?ÈO~Ú»‘e²fþð1ÿþvÅö»½=ÉóÑŠÝ ðáÉ„0†’£ÓlWÏåÈ%Ù[µõµg¯^wóÓüõ_óHô6EáÌ.N§ñÞöŸ¼PòÞ¶GÛfIVÒ/{ËK›%^yî½yx«vó±v#v\}Þñd®BK^Vµ êZ®bÎö©·0“ËPöFe7%¼Þ5†»ÝÒ>r\|¯ÜðuRäiØ_˜¯[<¶yÙ·ó*1s.‘ÜÀ»oNø£æK g ÏuqÒ­À€û=ñÿ›%À_´¸å€¿º+¹Œã¿’ ƒÇ•L׻ůNÏܪ™KɽíLy›"úªózRÿöfúWÀDï(>Š-á6;°öEÊÖŒ©¹˜¢Gjž&’`4´eucq+Åš§ ƒÑÛ>8ÏEÁvXµZDÖ>ƒGDP²âZ#ÂDƒà€Þ‘õ{£ØpÏn(´Gfp?²¶^ wó™ÎäS™?X-™Ãvcÿ\@—H§:¨#gÝD@K¤ô¼çrȶ<Çóï-"Ô`ÞAŽ\@td Tä4 ÌÇ~ž ̆«-ÌCò¨>Ø ÁpÛÄ;h[úzßZP0ßÔF#3’&B–mZ†¸„º¤M$‘JÐJ±emháænäÚ{1# dtdW)®¹BŒÈÈ,¦â%;z?LS-ð2 ]ñT&w.ì‘£Ö¸(Õ«8ÉöVçâtÚ‡’ÄA6ŸvE… S¢C}O/$™)¦?¡5xgÒРBPÒ ‚›¾ºÑØGk ‡Y“ŽÖ™ÒÒTM)qØùÖQÀ M€49*¹&Âࣇ„´TuzgcšeÃŒ°‚¾åñ½±B “8w#! 5éÉ0HR‘;Ði‰E˜«õô Š” È+Ke54ÃÞe[çF¯#ÌY‹EªÈdJÇ7T™ï™ 8\EÒh€§5ŠBKUòɬ»Öì>jË zW@LöP]ªfOSq7ù)Wµ.×È9¹Ã&%»I=ÔC[ã‚£äÉ€€÷-¯n€( 7ZŽH$0 ”M ï“Oà¬9÷2wèK©E4+B±bJQf9tÒ  ©O^6+mbdæ2{ÏŽ ›ì7š-ì¡­X•‰F¶gX¿ ?|K!Ûè[·9Ç„áÖÜ3¼½G ÁfC2™c{ F*ÁÂq#Ë\-c "éHq=€ÙSiµÊ<:³q]ºí澪¯k¬Päæ\@BBµ²ÇQôLJT·žNwÊe…u(Ô¹ÎY-½& ÷Rk$Ûÿ©›ÕŒøî ûîý»bI0¡©"Rß}À§C>/ýì>"¡ZÂ}N‡Î¾ÁœŽTõ”$EFë£ü¨ÿV½>ÍO¿ùà?ÿ¯þZÇ’„SéýQŽ=Hˆ_b¸÷zýÍâ©HæÛÔ‡oÒº¿¤÷××;/ö‹`÷âþuýÛÀüÚð'¶÷äÛÝ¿¾~&iõ+ZþÌ ó¿@TÔUãÎ×%^Qÿ_i¤xsªÜÍ}Å,}Üðí/bÎöá^õô;ì ¾îÈîp‡ô΋ð† â·‰S÷Ê7AmâX6~á“ðˆ º´šÕ¹ˆ÷uÖ·ÂKý’Û×®߈1¾èDôöÀ\LÍËPJïŸÕÄOW‡m"opŒøÖɽÙ}½±Ôê^§2©ÞuGðlÈ¿}.=ê‘<}_Û‹ÝË®¿ágváðÌ;¾ƒz—írœÕæŸ/Ÿ« gøâ}ùRöªåýHáÑ’|¢Ïé삼ÏèÕwýÑò W=ƒ¨$Ôé!­³Î”1•l˜ žžë/£G25Ú ˜ù»Ãóòù°>Öµ©ͼš×â=@¢:hâ ï¤EæÓaÌP"¹öaÕXJ Xdºm"^Ffäº_¬:Í0„äzhZ×§¹zz¤ÑŠEïÕ NÔʦ”¬˜"$"éRºYõ,­å²,ûÿá_íæ‘‡5 T¸±˜¯ÊÙSò˜jº¥o¥ÚJ0:(¦Ö– é$3Šû‡§ÚÈÞ×Öbšf’ÊÙ¨ìN¶^]R±ÝPù2L¾#4*Ñ?gºXè(«2£Dïm/'”›J¨„”øIÅFk¨êÜ  ÁË`§Ðë^Ð ²ô5•‡ù7Í 0³È$FïæžI¢¤‰9°îݸ"z[>£?«}ÎÞµæðãµD æXèŸQ ¢#t´uã}ÃaǦ«G-nˆtØ@ÿJ˜!¾çŸÁ ÜÀ¸ LsQ"Õá‚!4Ö‰¢l@ED›á…Jeq'ÁM' º¹y™§%0»¦™JAŠÈ§R¦iZÑ;`u®€2bž§}7Õ'íÐÖ¥÷yWž¾sóoX›gxîSÃÌ" c§XÄD?°X  "c,»ò}=‹'Í"WN´ÝÀ*§~Ø›·¨½5e"+`Á'à™H(žL„0)‰6êÖMDnýS)*`¦ö¢£T‘œ™”©ˆW`…@´„ép1 ¶¤NZ·¬L–Q˜ŒiŸ #¤P(ê&¤èâÈ9u"ǧ´¤»‚ª{ ƒ9°‚Mè 7ó"&¶zeC&¦ôuI:½€"Ó"2=^Â-pP˜žS¸‚Jf[óýFEjíÚq¸°3ÃTÌŠPÉL¶Ì.Ø‘ZÓ %Œªä;ôM¹1•B$̱{âB j€d€ lÇÕ7QŽ ,%LðK0QΠ¢!Ü fè öeB–«×6Í?ø4×§ë12{F*Ê åž á*j«—‰^Aƒ ìèÍ‹™—ºû|úô÷‡@ÝÍjj EX”(`èv2G)ß\O'õ?3#³õh=Öž‘¬ú´ÛÔÿÿìŸýånä‹¶ù"žÀŸb9>Ú’ð~¾Õuãyìéä£ò~u÷)†ÐÛ1õUtj=å9î 1ºä½+Žú«àKFÇ{6[|gyÅúJc'ž/»Ü·FŽËòí³qÐeÛøKÀO¦œÞT‹oÃrùã‹)ð“ŒÛW;Á¾Y–û³Š°_ñÙ¯$¾ðP_voZ ~Ö¸Aäòª½æ§ÝR}]ÃÄBË»æÏŸtþ\7¤¾ýNy„îáû¬€ïžÔ±îšÿóÊ:w ~ýŠ|Ý9¾2UΉo.Ã׫s•éÀ r647=Jº~¶Ÿý]Ó^øâH„3Uû £{x½c!ÖųV×òÞ=ÖÉ}ºø¥L—ÓÅQŸ#Lî!®.ž­/t—*ü¹õ5[ãt¼ÚïhÕçÇuu$wþ—ῧÍ^—ßW÷^º"u2>Ïcàð¾lÈÝ©|…É“èô%/û¢íOg{.q‹/0 {y+Þ<½¹¿«ÉJ¼¼ÛOdÇ‹ôÂõ”äñÔKe£î'$xu`/3þÎ1ëìËzC¼XKlp&ÞfŽ' \±ƒôš’j/=åšt5Wu/ä?»zzÙrèê.ç}Âù%î¤BóL8~üĹ$‰ÝÏ=¤¹o÷ÅÅùÒ9}'(9»,7TÓëGæcŠ:§ìœw/ßÒîu‰5ÅÕ\á)¯rÙ.Î;3ÿâþÒÖRÞ™w/7çkœG^ ú§‡ÜñçÇŒ^v,·¦— ÒéËØÜ{Hóuß;¶ ¯=¡¥»1ýÛñÖå…ä£ô"…[ âÄvZ†lÃIϼÏgËó±ëS_2S]Ѻ"”Z|ª4:+ 9U3o˺fN‘SBÏK«¦‚ÂÒÕ—ž)ºé°`*tW¦Ü‘½G뵺)Z 2‰Ö @¥ÁjõR)°¯4€m OE¤.·–eÑ•œ¾âTW°4-ÿÇU¤åÓçhJÂ!˹8hzèM ö¡ÝÔC è€úŠRbðq±Û‘í°Ì { 7Öb¥rþP!YKˆå°NS¡Yd®ë:ïjšêTÖC‹–ìØg‡„ UµuÍTôÖ—£tNXA¿6Ý0,·7øn˨;lž4 6MÕw•¦èP2;•;C¤Qв&'Í žÑ \Zÿ½Ú³±Ç}/Ù:š6ßìà±þ—ÂÆû¶¡LùÑü3 óüh(ÓÐ*à n(!ŒÜ„ÁfPõZÌ]! Q "ÍŠÐ3[2 éÅHöž‚•2rÙú0#€–JõACk d)E,¹†¤äBÕÇ|>¦Zuˆdwikï™Ðw?Ì¿c/^XP§º,« ëH±¸ª›5&cÐðìüèþÁú¾ÈåVmF²«[Z¡Ñž“a2"Ühé nÚT*:tƒ™zàH;‡’2%‘©>²5ƒhB鸞®i êvîšÉˆ˜eã‚.®aM¸`Ä ˜é;#“£‡£TµSgæYÅ!“º)©D œÄ :Ë${±@ºo’tÌi£ûÙA‘V‰(0¥U™!• l鬨î6d‘)¹fHÜ¡ôDö4³E½7UX’Jådè -ä¢ÕM°* ¤Øc3æR€@m*úP©Jô6Hò‚y·ùokœžs5¶Hl‚LÄ@`éXŸÛ @m5YvÜBä&ûÂŽ`‚ ¼X~ßžk™&*‡£”±Œ®23SÃ|šfWH‘dŽE™jÙ•åÇç¶d™mš¿_™}ùVººú 'DL÷6Rظ7ñ)ŽÄäxt{Ùš¶aŒðŠh€! ÇfaÔ°ëûx¾E&æUÇ6€Ñ¹ ­±u càXdiYÈIŃS±êå€@²LVŒ“¬=ÒŒîÅGŽRÕÓˆTq÷ÿÍÿvtÓì[ær(‡õ»ø¾û Û÷–öyEïriOµ|ÿ¿Be[‰ °ÿðªpm;H¤ÈL ‘-¢µh­S?«ýÿ§ÿì/µ-÷ǘðyêጶ¾®Eó¦ë |ú<ðœÛx]Ùse‘v Qáƒ=ÓWç%0» Éx ÇÏež[N‹.0Æ[tÈ«Ðê(¤Ë¬îÁànÉÎøáyl~4ž÷ñÞöς䇮^-Lz§„ôUìr]íÄÏ$Õã6þªÀM®¯Šé§N\©jwãçKYùjs «:žó7©P{W¿U ±þ²±Ë²·7˜-7^iÂ=fÈqpòº¯†ëåVô<:z>ÌÁ¼Â³=ñLô…ä–Ëa¹–ÎÒZߔ xý¦;ǽ®ÏþyCçdŠïíí̼MB\ Ú݃¹j[ÅÄ_‚Ãz% @â•ÞŒ«;ë+rïïxÜpÄù½#Gþՠ뀙þwg÷~‚Å÷W€þËÆSü5â— ¦á^ þq/»ðååèü ¯&¿ð#~æ‰ÍHþ_νÃ/$Þ5/¾êÔãÍŠÿ¾ëÀG×å+.éIlçƒÜÆîr<îxxAÞ×ð§ðâæ#u™]Ðó#BøÅÃecˆ‡ßîk‹µ÷ý’ëºW ‡^š›—ÉÝÜ|ªC ïî)Uxqçn¶µAê >ìb*‚z&3rª™€2ÑÕ¡e¿ÔâJ%²ÖR‹AAÝbiˆ¾›k¬míAèÙSäaiŠM/˧çõǽ»«°`bÈ ^K_×ýçeÿÿø¿~÷)>rRIY¯…jpC8M¶®*ne"Bô5û²Ê ŶªàuŽÑ­Z!yø¼*•Ó\ܼ÷ £„AMóGƒ!š""z[Wyu©NwWïË$FÁ=$”y ¿á^aبÙ=`ŽR=0’ÜepF€6R5ðn^Ý«•/èÏANÀ@2b“9zFo«UÖZ¢2Vqø”qPëJDß’í°ì›C ­a˜ÇŽáP6å$_Ð+°‚ÁF÷£Áï0 ‚2±­tÃÕ€$Ê¢CŽÌcŽ8i d4‰bô”¬Ü]¡L‘tZˆPº T©žÒÚ``H¥¢õ¦Lói*ÕÔÙiÆÖ§*3ÒhY¼ø~ÙשúÄéÉ•ÆÝ®ôŸ¬GFv÷Rd½Ç’-{˜¥qL‡t„©wÒµÉxîQœpWS“|ÎÖ¼RÌ,+¢ÏSNÎ µ…f«A˜£utV шP„ÉH4©c«Ÿˆ°1—QM >8( °À;S²$‰BÄ$#Ø© Ò¥ –eKºi*à®j6>KHVn ¦ÄÁHÐ(S²CmÓͨd””ÑiFöL˜(¦iÌ¥Í"x$.!:e:DßòF4/2šé9 8¼20PS-µvÕÃ×ÈPN$?VY$!š¸„ ÜQÄ€ŠQ@vXòãDzfxŸÁ±H«¡Eˆz)K7ˆ'$x†é DT‡aûÉé±ngêg‹íö™?PlÝûaÿ÷ßÖ%½Ðm /}ª^”2c™ŒîCf_º¼ 3•"m˜Šd©E}MYa‰²sÏÌ}F¦6s‘±:‰ mnÞÃ"8µîP?é `:"`ܺ—HPÈ„¸Ã ` +»´¢ŒÜäm‘iÊ@"“2#[f?0½! Á´]) †C¬ÅŒEîŠ&C­Q­{Ÿ+§âsq/hjkOAbùá/ìi²««w3LnþÛ(UDLÕ>/Úøqg'[Z>}0˜O–ß}°Lì—˜ª— )•™9ì’€”™Ê>,{ô> Æ¥–²›ž~óñŸü—uô;ª©)yÓŽ‚}kœ¾=Šxÿ~ä¬öÿý¤éûmŸwÕ=þôq¾bÏôn8 ÿ,Á”<+ä»H½WIÕòÃÌ—m¾Jÿy·´¿„Kù<È?|À/H+Ð×—ºÿÇÿ©ùK K·É¿/:›«dØ{èLwó(_t]ÞóÇy—KC—ÇBàW&xÎÖ¸/<轄”? ‘ýÖ?ˆ¦þ'MºÓ«“à«üšwéë?÷,nÖ·Ì®·/-ÿ4n“ŸáÖçÏt7ú¸nIÈWÈ?#½Û†öó.3ïqÄÂyù·'xVpþ €·L“þD¹–wûeÏêw¾yÞò¦§‹ƒ Bž¯›M8Ï{z¹ôüw¿_ž}iê=×¶G˜½ÑÍܽ¸ióø™»¹%XçÙ—¶†Z¥ºT%ë-49Œ %ɶ²|ßûÉ(üù„Ýû§'Ý{ËÂý­jóK¨MúªJÿ¯ÙðÔ´“ä]±çÛú/ÎÃ|­ˆø2þ6wKªßÌ]Åö`_±O:;Š;é³×z¯ß«x^t\É”7—òÂþKkÿžÞûüï¾ñë~r™ûu®Î{*ÐùÛsùÉ×ùŸd.ñòÓîÎäÇWäEÉyeÙ)ŸïÝŸ×èüxÕZ€Hg—ã6nÝЧ®µãúÍrÔ~ô*á rmKuèxùÅc“È(Oe g+9o*Y/Ë îÍ0ñ‹¯€—?ëSãÕÂ}Ù:uϪ'ü.*¸mCî¤bt)ÄÆ‡Û†ó¥ñœýqöœŠ8ŽVN<ÿúûÁÝ9ïá¢lCw„H]>môÊÓF7ƒ¼n=8‡Ý\A6ÎY;— ÓçÏ¿ñ‚µHÜ–:_Ì]­Œçð”ÿËåÇò uÿÆëBç Ïe4ð„ÏøL/'puSŸL—xÎé¾}œüxfôR¯q‚véªçà %\R?p­A^"µt³\PûuqKâárgaáŸã­u>qxûõš¿îG>•ˆáïDݹ¸/gÆ—'o#µ›n8âö¶»ßÃx/ŽÛ¬é¥vk½¼Ot½¶u@oØäëãб±ÜÎJ}îéÓ·¹è;M|gÕ[ÿûÒöàôïÉÞãŽ2õéav•ó×Ù¥y³øâ.êçõÙø>ÚÏýéêYñf?à-¤è¾¥ÎÅðÞ›ÓxáÏm£e<NrD6x< l[åÇ<ùôï·>ïûa͵!ó€ôâŒÌÞÝ«IN²xËHÐJ*óó~qîꔇ¤¬d-óÓ’ûuEt@R3n\gpªÖáëóZŒ(´tô¦ÔT‹)é@ß/PúTÛa!4Ë`b𢷵UƒÍe$¨4 ëßÿ;¶èŸô®Þ#£{bU´¦H”ÒlÔK{#s*ÜG¸© ½ï¸žÙø^ÏlsxöŒuŸ^Š™ƒI1H7w^ YèQÜ3¢µÂ,Öe‹»|R –¶Cú÷¦AQÊüQïjmuô0” 4ŒÚùí°ÙÀ2WågÓ9G ¢¸ï2™Ã7 "Z´åsê`¾ŸÒ@oXÖ­‘‚™èÏ("À£|ï‡Oõɇ½j”d aàǰNkk‡§³?ïËô”ÑZÏõh½±™g„¬©££¤$+éX;‚p@É „6ÞBd²s ö ‚m«¯hH@Åñ1Eg´š,Ðc0:ºé4‚ƒ+Á’¿¡ˆ•0• ªˆäºŠ‹P¡b²¢†Ü% ˜èP‡Ì Ý*®ÅT(-nÝ>Ì,3]”ŒÞ<‰2ÌìD,[£ÃÚs9`þ/PCz‡,B’á Z&=zh¼¡)]¶†Rh)ˆÅT¹•¥P ©Ø%œpgRãö·‘Ècu¦€y §Îݹa(É"ëÌèÀ@, GŠ ›ú¯Ü¦ë°DoÇzÿ¶umAÎv¸ÀÖa ”(ö9?åZg›g¯…‘&'&XÉôš&˜Ù ïsãÉ7‚,T(Õ˜™Jª1å^X}A½†ò„ºƒ„¶ŒKóÚãØÙ³þxÊmÜ«õÖ;v^xbþöŸtïõhäÿcÎUÞñö«¯–âó¹ôHC³FðYãÍÒ½³qÖ£«Ï{¯×“açKñÉÎá=\©¯8…‹”ä7tÜJ`J¥ÿcëø‚ä»Þaœú¾`ã$!ówèŸÚKïLç}í,Ò\¸÷vðÕÓøEv|Ûö3ö_辫¿õ˾âl¯3¼Ùxà±›ÆýlðÕSßxï~EÀ·/u_Ôð!¿½³ìö,¹{ì_VuòVÀy´a°ËI:ï/y¯mË'øô÷¿_>ïû~Qï Ó n^v3{ÀÍw³zW‘H:- çÙ¦’èèÊXäTÒÍ’0#SÝ2˜ÉŽ^l+Ïu´eµâ4ÐXQ”«: eôeßJµ]µØ/pCjY£¯}ªÕf.y¶Œ5d0s!A#¤ôÖý¯³­ê sA´ÈHIPE™–,E@ A;ô¡ÝçTµ•¦v ƒ€¬ ÑkÂèSa –&¯^­F%¡º´FÒëȬ@-»šÑ€tGocsÖN&|«ÙVÞ0 .áÛ¥©lˆ!èwèh09›ü#ƒÈ­~u™ûX÷Ѭ†§¶f¤A.„bÉ|#{*•±¢5hP}rõ  e‚hè+´‚ ü¨õ›#…ì0ßþu3|Bö#ùG[á©nn-{¦œ (rȰväßmÃHÐÁ"HÕ¹ÿ2F¤Ï2iÓ»“V !Ú˜í‚!cSÍ-C–!ˆfa)zar#«‰’ÙTk";Ú÷ó®~xêhmí©lËj‰òÝl%çùÉÍÏ-”p+Å??ï{ÆîãLXkîeÎPËÒ}r-iC};P-@ÙJ~<(£G¢Âkè¹w ŒÌ"JVw]¦è¨„ \WF‡ %ÙI) Ê„¬‰)8adà*Æá £UŤ‚‘‚ƒ½¡A™Hg1ô”:L¬dqöC² ›s·i* !Œ™ª)+Èfs“Ü T3’ eÊÙ‘Â’­BâÏBÑåîy€§ùr-¦½5KÔP"dzµs¸ËFG¤š&; ‹H‚a2™-Ô»˜tÙ¡åš)bm´%1SH©8‰-Ç6»÷LA¥—ìo„9PÀÑ M ·ØÒƒÓo&„̦qQ˜}»hPßjûÿ?%`À)P¸È×Y_Lä²Ý"´Fúg‹Û' {úàÙtÅ: éͪº è½ - vŒÌÈ ²dôõs©aU,uý´j¤wˆHäÎýØcB¤¶ƒØ\ÊÇz2òyH$DvXÙ(@§óaëìø‹v, Iĺ}ò‰ìžѶ\£FP"Ü©fÑ%J“¹S!U>”B¯Ë<¡Lœi’"dÕü©ÖðŸÔïwñ¹ jµÈ½·(s¥—…%aý¹u£},^JÒðT@+¥öç} –@ÛMÈè$"ŒL)AyôûUdFäðûíqýÿ«ù/Ï”îÍôwKm’·qÙ£8í:+_¹‘‘Ï — /Œˆô@‚}«Ì“¯{ý»‹‡e°wu~‰yïiòÇ!ÞˆSù`X¢`˜góçO ànUï{Fã^À—µ2ß½ËÞÓ4ü•LxµàQåø·w„¼~9Þ߀o°&þÆrøW6þöÐùŸuÍü¥¹ü&çáw^”«€÷L¶¯Ë±•o[©ê¢Õß rŒCà)×{G¼äO¯Å_Üx¸¨Aæ—ÜÃLÑ/>òK=RÝ¿ìú–½ÈvüIguþ “á*'£_Ö„¼FÁüAÆn+ç/ïÖ’þœ'öy\*ýtóñT@téÝ<Â#/\ê·}!=ÿîsöž¡ŒÞkõè•µÌ ™¡˜¡²~x‚¡?G¤è†žÅlîjI 2w–„µê±ä<*.#Ñ{ß`ä]²„3·eë^Jö´B:™Þ×P´¾|ÞÏsa/ЍSiKÏ.‚}m–Ù³c•MVæÒ+Z·¹šQ"f;üþ¿}YÔÑ÷Ò`CnV4oÓ Á Š­:sÞåTU ÜÁ„*›Ú¾4`À¬ežL(…©®0uEF)¥'á`ôˆµIBÉ2yë™)sº—ŒžGCQKyn‚> ÜÑ”‚¶‡:6 Š„øV ûÒ' …ó±éb)®T)À{)Ù#Õ?+Ø[ö¥C9€@C—Œ€ˆ¾ / mœÙ±u$Ú0ç 0Ûl~ýcø|ÓÊÁ#:Õ‹ùò:RÇc5MffÉ7WkÏV” :Ûªe?†)3dO¯ˆ”R¥X5^ŒRŽ€Û¤•ÉLÑÌ@d*ÈÌhÈPDQ¡·L8Ÿfo —5––ÓdµT:ý»êŽÈÏ~®¥V›2òùyÙ•R¬ì—Ö…]¡fJϽ¾Û}ðد{‚³×¥«÷lH+^Ëú¼ ”¨QRØC5ú,ZXHk‰´2-³[F­ÊÞsM#hj öPcOq¡uôˆ JˆÎ.$P‰5å@‚krížÈ ù¬nè‰)Y‰yBûŒ'ãç¢I¨Ée"õ#jP=Gå} è&Q€Y,‚`aLW_àuިꢻ<=89 ƒ›ÕÝì•]‘4 °@Dïu-ͺMŠ‚¶ëÖåcvlXiÑŽÓRFi?6 sdli¿¸Ã :æVáÈÜr'›¹6ôYbA` ¶sn+ú‚ÞQÊfHÐ7ãÂ`C% ÒÜDûÀ¥é ¥Z1ÖR'«S–ÂnÞÁ'÷ž]ó‡ZþâÇóÚ×hÏa^¦ºûîãúyÍ –²€h|šæn¶_õÁY=s®ŒP¤ý¸×w³J133K$R efoÞ‡Ñ="u„þÿÓ¿úëïÿâ·—›1>ßcÝhÐÔ[ݲ/;oÕÝýÜMàZ|*té+ø­Zô¸^êÎYê-±_£¶¼öK|ñaÐûªq~a{‹oüöŠôÙhü3_–¹yÿ†â¼¢ö= €oÛªü5²ï™ïªò¿Tö<®N_\wü“‹]¯œõ]Ãᯛ ïÜ¥~EçK'ðŸtžß4WšUûõ‰|Ív»sùÌì^¥æKÏUwË›—òý·Ìm>æîÕyôÃëë ËÝJe^Htï™Dܵ„>vmòiåù•ÓÊ£eòŽ^rÝã#’/J8+ܧ˜â&á5èò£W§¢.*€H6m™ôãóD—œ¤ 4tü¢s†Ée=1¯ƒ!m`#.á¼}ï R^-¢×R2/&Îc7&}ùe yl廂/éöQw‰ü¹è„8Cç\¯º9nžÍV]jìWñš®†ïÞ Ó‘|È×4¶ó 1Þ<úkO%JAôË´tZ|nà/W´˜cë åÅ—vëËËw¿ˆçÿÌ«³>›ÕâåÍ÷‚Ϻgu7bá Ç z¼îßéÅãã-Ä nêÎûy—uι:!ÏqÅÚÚêt±°]!•®,Lx3ìïKÊ= ÏŽõ¿¦³s<±`ÓÅ“'éùÜ:ÈoŒƒO“ý¥ÊìALªùþêÖO—öÂx¡Ñ¼¬&ç¶WÚ÷tê!¿‡ zOÒâÊéªxä¾t^3Ôò׌×åw»)/MÏÎGéL¼!<¸Q^ÂD.ÑQ@81tÓ1»|ÞÇÚ{ïý°d )ISõ8¸j™¦¹fë¤Ñ€¥ç¸$=èѦI½Ef/îFZ-j‚yñn¥f™j×`ƒrÒ=hŽ£T˜§õ4Ø6¡“Ù€ï¦v8@Yë5˜•ê…U-­8Ÿÿý²¬ëÚ2–hû8ìÕ–ì-#ݤDïXC¨²R`wÓ4 ZŸg¹o†–HXˆQ™G枀òèF›‚K²øö(kû5ܧ¹ÖÉ{4’)ÐÍ9 Y.Åé¡!± VX:¨@ô†ðmu¯IÔyÛ“Y?ÎØ 6,Ü i×5Ý$´nɆ‘ظÛCª#²¡NÛôX¡\a˜[J¶±¿ùgàé·zzl'ÅÍÜx{zd¾<òi™aæf` [DnTq#Œ³Ái) ¡L™"a¤¸“äzè„™™9S ¦™ ‡lÑ)¢PŒd´Í@é(Ni*†DF˜³ä¨Oý½h­³BÅ>|¬óG+%iSQýPgól¹dzqh©¶<§\»ê`QdD/VÖhk܇'ª#вJ¤'«&P¼€wÕ‘«¤2ÚÖÙÉhÎæ2T'eާ 0Zhvnë«:”‚€dº\dƒI 3Q G&W"S“É%°3²þA…ŠFKÀ„šœ$Q ¨„#\ì L“ܱ›PBÅÉ9Òû¤‘´„I§«–=ÓŽä¨#mŸ0F0RÑQN ZZ[*pÚs Ö¥ª£çÖ% ‘± ¾J,ÈÍ®–“!MÇÜèŽâd¾öd¶)ªNŠÈL)1Í ])`޹"€~¥¶8Jÿ Œ{ºn† Ðå¿Úé¯ v0ak0ft!wb¬8ˆ%`%ÑÌJpŠç©ºE[cVË –Tº:Ùr]€U¶°ª„P©g!56—‘x·LÆl dGÌr‹{½¢N[ŽpÍ Æã¦¶8,û–NPl&É™G§qƒ9bÝ#²³Z1¡+›RT5ÍeòðP9¸OOÓTfd…y­“Šõ}ß-¥²øGé¦â¹vÁPÜæºŠˆêÎÒÝ`µ{Ä=#!YŠ––æÅËTÍmÍbl.຀H&ô|P-æìf*¾B6¯Rlm<¬¥–¥õè9ת©¥{i‘Ù£€V«2AY)ÙsT HBO Z[–yÔ—¾ZªA]ÈLmé$½8•±t«îO¥ÿÝßȲµ5‹–½–C¶Z•’¬V„‚ž0TàN+¥gÏD$ªéÕÖÑ ë½åìª"Å„ÄÒŠØ–îîV¼Lõ˜ô5½µ•ÍAwI):§©–ØÔÿeà À„h€a=€@ÇÆg!討u*`®Ç^Ž8–áû‹»‡°y«c"~Aþ÷±Ô¹Q;6nr„R ":²Á쥙—‰÷Ìí7Û¢Qˬ@™b%6mÆ f´BŒ DºiHeЧÌP_á…¥øT«,23ÖjGC‹á¦d²¤Y¥Ë‘b²+´„Ñ$ÌH „ÍÌÈâÞV­‘*©g®‘^»Qõ „G£ÓŸ÷ŸIk}™§Éˆ´ÞÖe÷ô„D­ö|ø±ZçÉ?¯Ë’JÝô¡ÔÊÙ’«SÓäP¢AA¹²ˆ <êú1«;aSÿt(E’b;4ZÐÕ}…ÕÑV˜«Öz£D )„˜dHJbª,¶9*Ã@æ$3 §<Ù8›¹³«wÙQ“q}M‘˜\ÕÀ Jù :dÊ„aˆÄ`‘g`š`>©7¤ N M¨H™PAчå…D AøfLP¦uP´a` D¨-Ñš˜tZDfH³ÑÝ‘ 1à@¦Ö–SŽtö|H)#¢XšS-ÀˆZiPJ™@),óØe‡2 À·r~#48RÏ(U€ÁÆí0×\áH´ÔQH)ÑúðKÀ‘­µý9ÎÒyDñLS´ËR¤—À25ò€ Ô&–È®ÙÜ«,߹໹ÀûÚ ™k2æ¤Áz7‚ìÂjÞ&)è+h`±åö0("c»£O†Þ<–X9*Å Ìàúåη桡Žmÿ”[?¹B£ÇEÛ2BG{F˜ÈαÓ)é^Êlž=ÖÕÂPV`𬿄])uvLe7qWk V OÓôa²ï~K7A–RÊ Ë@¢”N wób>Íkï>9¦ID([OT7DFŒèËŒCýW$2³G_[[{ö®I¯þOþò¯ó~{S—£ØýàõOæ*ä[AûQ÷x\©þBu¹»Ó“tYvÙÝù`’øÚù€¯69œ•Ìèn}u‚ð^”ÇëhŽó7¼#(ý ¢ÖG¤“Gñ&T>§?Ý·.øÚÃøYì ¿¹àÑÇþ„“«‰üÞ-ÔÂû”àäÙk¾h¯gé}9.;Nó璉¼G6}U=¨í\1Ö¯NðÛp[ÐýþûâÏ :ÿu7ò£œœ^²È÷×ß;çþfÖ×N†Ÿjj’1_„úyÿ‘ÓF~}ý©¾Þåtõ U /ݨÿ _ôëëz¦üÙí¾ð*ë§Ûмû!úçMÄK©>N®óú‰ð?#FU¬Cƒ8î.x·ûß}Z÷‡¶¬Ñ:Rî^Ü)ýø?ý_æÿú—î¥Ý“0¢Î5Ö˜zf¦{ÉeÅÿþ#½DëʼƒDª áµe*p¶Ãb»‰î©4Os¡Á‰R¬:ͺY³w¬­ÿþ“¾›çy¦`Î>ºN”}i&d£×Rs"³° ¿ûÿÉ¥Œu]û~ŸËm\¦º¶Í”*ms¦NCS‹«*3„ S3è7 `†u 4L2ÒÀ¼:²GÈ …vØwužhŠžJô5$ ( &:”Z×u¸ÝBˆÅÆÂn}«ñ§AqÔñ)›¾«]D¶NAõs7][éý`pC?€@‹ ÕMÀÊKÙ>Ù+¬¢:`ÈØ>ë~£¢× J  ¥À F±c­‰7Ãä@oˆ¾ÕW³’´âè=Û V°&2ÒY™>dfƈ€Ñ°Z83ÖF°ì†J;ÕyZ~\¼ZÝMëçmÐõ“IÐhb¡ËkAÊ­›ŽE@3€ *=»°|F©Ü}˜TíOß¹#Òs­µx-žû§¬SÁ‡Lôµ…úÇßýæ»ve5³½Âª—uÕáÇg¬‘êD”™•uÁ²X¢ ü¨e¿v‰æÎ*5"JÉ蹄B2ÉR Ž ŠVbÁpKæÊÙ©}‰)8Ú>‚|2ƒ0)(#§`ŠÆaÓÉaº‘ÑBª@1\2ð‰’`"7Ê„d6pBî€wÔ‰L0‘ÒÚ±+ô ýGsJ.K ¢ó‰ Öªj¨d)žµÛ<š"Q—‰Ø—ˆX[$M&Jê‘ì0!T*aTÔ·­Lk"²ÀX"™‘è©!ÍG¦b¶Dnø$RF3ÙS™ãÉ,¥Æ¤ÉÃEE 8!6‚ ä¥Ñ34AB™ŽqC F®BJzÅÁ„åpÉݲ§Ç³SvOîÏã_í¬&yȾɳÏ,ÈDïä¦:D-ú}/4vÉ“†Ü7À"3JM³Ì@×Ön`uë(BêPÀ aÇœ_ÝÒ£}§7¨cú€8âÈ0V ƒr3VyJ+gûq äð6ˆÍ!± ¬Ï‡¶€ŽR¡`5K¡CÝcU~^YÌCXÝ&Ú®Ö|š|ª|j»Iw²²üþÀÉvOO*ÚåõCé‘}Øâ$IùT”Ðaa©¬Nyèètnæf=ú˜­¶¬±ÛÁ‡±ŽIf*N'ÙuTÿ—–=6ìÏTþé?ÿËïþâ‡WÂ.¾<Ð7ç^hë‹æîAwjÑî•ܨ2úÇzױ囅czô¶£Šûv¿îk~F©ëׯcþ^õû'ÚÖ½tüa‹¦tWý%ŒìŸÓFòÏ :ÿK^ÖÞzÏ;n†W{2nŒåñJ¿Èݺeþ¼ÚþõöI•³|óK6þßsNP8¦+õÔØå–Ýq>xWP8G»§^¼{îNÑõCöÃE‚Œ>ÿîS;,ë²ÆÚ”i4׿ù×§'ÿ_ÿ“ÿíGs)j©[Q‰±Gª­¤2kÝj#FÅgD8‰.ÖTqÀÔÊǧNX¤²÷LÉœÙ#““cs32ZgdÝÕh}C¹÷è?>G*ºZ¹öCÿ<=MN´Ï1ý¶Î»9––=óó¿RtôÈuÍXÐè‹ÚÚ[/%ÍTwpW¬GÕÉ7ÁºVô@&¦'¡t÷M§ËãPj×X u+ûµ 5ľ‘­#S‚ï3J*Fiqk]-§]…±e&å [n¶ùëÊÝ‘è= # nRì(ÖPÆÃ:bU"»×M”Üœ3 ½mköp ¶ºUÜ·†Í±µ ¤`ÓÖ.à3òä7:mgqÂDÃ&}r±°c!ÿ)úëÛSb“&™Ç–ôíwˆ†Ý®²@j²ÖsõìF‚Bë)7të-Ê”^‘¢¹c"K¢Duº»™!©° ÷§]ö¾ü¾¹›{wËå³êÁZ½TψLšYBÊîÛ¶ÕÙ"zäÇߨ“˜©yf² qxöyVÏÞר÷¬eWVêwOO³Ï“M)¹s2—2šËÞ«: ÖÃât‚ÍÓ+wÈÖÛ¸¾Œã¤¨¨BÊ,Í´,ê+•P²7ºo4͆1K{PÉ”Ršì;3áŽ.-† ¶Î“5IäÐÁ;‡ípV×\‡ ëè0¡ ¨LÃ:˜R3åÀ¿ê,E,P}B‡–¬° y•NKñš!'™C,tÔ#i¤°ðB§ [¡‘%£!>'¬L°ž‰Œ ¾d‹&/¸ÌÑËâÓ¦S X›cé€28—Ñ* ‚sµ52 º pãÎì´Õ·uu*”d‰AXªø„‘»´`º(F¹Û ;އG Ü<¶È gì g~¹ãþëØT{»T9óø; ùOïɳŽ?ö*1Ñö˜vð,pƒ;Ü5S{šGiRd®„E¦{2¥™PC¶ïÍòï"áGÊ¿•cò!VÞcQÕ*Ú:™Žf!cp¢ƒ^·uøl ‡€ÓƒÑ ïP»(æh 35$4ÚÚ Fg™u0z©ýcµ2ÍYû‡§úq†»%væ(^Ýê?ü }¿d¦¤§ïŸ:-mãžIôÒ!‹‘®©S6Csc¬idnæÆÌ0˜2K)IFôDFÏÞZ®=[Dï¼–:•òÏÿòÃß¿¶M{éÌäKp|7îÅÈøo°é\<&xÊ]Ny†ž=ñK_"1º¢‡;ñ²ö¹ðôvÀv óÎCç»UÐת™nú‚“8j w9“º`A¼¸sy§}ë«!âíÏu±›{9¨+©è´¥½Þ\œˆ+¸sòºÝ2¼ªÄÁ™ÛU>k¿þðÛÝ}‘ëlÀ£·ÔÕuבú0 ~ñ¾¹"×(?¤È}Ãå+Qýip^µŸ}ƒsgÿwïJȳýûù¦ì>†×·E·ç~©½]œÄë[¶o)$E‰–Î7Ñ×ñ_AÄzeÞyÌw%à÷¼ >Ðy~Ë-öðÓnÁýgtÛpeTsGL¿¼ çý"·”ª³=W._Žù¶!ã4ý®¸a¯ãËΟlwÎKç|#½oB^ú^2…g IÑ[J1îjôèú©øžy¡K4ÚzøÞt¯dP>€]Êýï{˜¼t¼?8œ‹JÝöÑýpG@>OÃèî‰ñ‚ar×—á!§ðµp†¯‰M|0¯¤£oΓëÏò{Ã÷Í…ÛxF¯‘`t›í8Pu£Lëçñ3êJ5¾='^\zárî¾¶t×+ø6â|_"úÿ¨×Nûaïeõ¾²$âÁßn)mûŽ3­ŸwÖ ½2è~ä«7Ò¹7ïø¼½kÅæí9¾ËjåüÂèÊGîÕ…í|<`çûƒ‹Tò«¼W¾?f¿~QØq¾“yÏòsõ<úºVÂã|8÷”¹×÷1 îܸç+6ÜÞ#^F?þÝïÛó!ZˆrQ¼ÿ/ÿúÃ?ÿk3ËTBîš ë²ÂhÓLѽ˜ÙúùFÕ+>§0‘´>„€vóä ÉÍsÒçu]HdÛUš1·¨eý¼ÄaáþÙ~ó=»ß~è…ëÚsiœJ;ìãÓÁ梥--a˜‹+rYÖüñoÑ ¨ÌÞ#ÚÚŒ]¹8²Cr!Ò)ŸPf¶z×(ì„Wx ŽP*Ô‘+Ê&¬lr¹ÏP"@Ð`€Ê6½“nGêùSW´áèÙ[«¥L¥tËÖÃàNƒ1SëÚé¨yþð1 úñ;ýþ“Ç3 >ÜzcË@¸mCÓô‚ÌŒÞL*6Ì'7ưÕòoáhhm˜þا­ð JdlÍÔfqlyâGà ú ¥"lôÍk(‘'êÈquèǶ‰áý;Hå1’óa×ÙÐÑ3%” ¯ôb‘^Ì+  kO":”àaÅ¢›™Ñ’ÆLźø w¨¯¥˜WGâîH“¶"éZJÑ¬È ×} H3ƒh”ÒŒ,œ¦šÙZÏ­TÒвeƒÉ>|˜KñÏm_ŠHö–èËôas]TŠOÕ%ÍÓ$ËÞ£º-k¬l–Ê8Mé8DÊÕ?¡€f\jvÉDtG5Û2‚ DÛø* Á®ž:€ht ‰ÆwB(™Y¦Áf¹j=hàŽYŠ”Áî2»¥ Ö‚}' F—TDBèÚò×–*‚§ ~ed \š [`ípB>Ê”6–§l tzOJ"­£~œB¸sstp ÞwêlÅ 5Aï+òPVtë ÐÄRY–ŒJµÜ𒯱‚¦lè @è}@І 9¬)0ýÍL p±ÁF†C‚ ÜL%0‘1|¼.ýÃÝ<öåFÑ1 ”­Ú}˜ A Uþ8Ödé2’Öe$}.•S!›&:ÿú„:Aö„Ü£MiPë´±\…;r…5 †’9Ú |†„Æ$•aD&˜pßòˆÛR3Å LX?à "8A ™ðÄÚÁº% p´17Æ+€†Ø#;"m#þ“@†g»ÓÃPÑ…ÙŒ•…ÅÚjà“s§§]¢–ïŸlžbíuW--‹£<µç¥NÅ[”³ïæA³ûÞ×àT8Ïþÿgïïž%I’,?ìUs¸™UÝ=;»à» `±Ä>àC¯þé|À+Aá V(â‹v¦§«2󆻙êკÇwÜ̬žîžŠ®Nɺ7ÂÝÜÜ\í¨êïôŽ"óè²iJÐÚ²fîJ™÷³v³2˜CÍ̈Ì¥²¥jÔeËìÓ~÷¯ÿóÿìNÀsYrÔýµ%yqQ—Ç·H:ÿè«"š® R¼(Ù¹CÞ~ôI\§nÊNˆo#ÆÞ{‚ÎÕûya?Ðt³9½™›P¨W÷E×˺÷¿p)í-‰WÌ×vg ×+zÜPr‹òW½ÎS÷Ç-=ü=Œø[ýJ»-ã}ï)³×ÍÞgëëQNâ;L¥KÕøÕDÚÕ©½ê´ü­Ç÷÷]™þÆÕ?Lèü[2· ¿¡ïzŠ~í¹¼ð{W9€Swoºr„ßÿ*üɽþ(ÏÃ__¿¾~}ýúz)UÁ¿x"ͯ¯¿Ý¶F ½> q'gu*1Ø6q}g1*ü6c˜þˇŸ>¯‡µ.k®¢¹™Yû_þ[î?îÿåì“C`$ÜšQk…2Ò¤ì5–F8©„…Œ‘“sžSB$Læ%3aÖkÀs@šQQ—^-_?=O?ìÊ<©q¨‡O_f"m?L†¬»öü¥-­Ö°˜Ìýé¯>f ý@¬Í‹Yq~þ›ú{ªønžL"ˆˆ…hõp@¢¤Š"#¼ˆ1 ês*ZÓ¼Q­…\‘½‚5A"¥  –@ Öµ+°£p.mAÙíæJýéŠæÓL™Š%PfOEÍ`ÑU#ÐdŽXÀ¢xÊåÓ—åó—¶hÿµB^+ Z·Ç,Ý xâ&%GͰ6Ý&ÚÞÌG®h10Üf ªdwøþÔÑ[êóPñÊ u…Oˆ$Ü‘´Á߈bë ¼À‰ ÔÙ@óaeÜùë0…ÌìÒ“Ïp7Ikk‚2°d˜‚"à…JLû‚ÚÀ nH*t[¾DýþêßÙE듾Ks]áDšhtsáé’™@ªe²É‹Üæ ùYm ›J™\”íR&¨Á"…Ú<[,Ò’rLK‡ã<=M ¹ÙÒ–ËÌ=…õ¹e4Т5+¬5¬@лý².þ„šª!Å`ï´^.*msòîZ]¢-£ÔÚ’hˆ¡“À°ªÁD~ÜcÞë9©àD²ÀH%é“*@àƒÃăйäDîJ(wuûßÂT£HTÑ]H¶”f£LÍ4ïÓ~rK’_ˆÊ2LOÊE±"»òdB03ÊiLAd Oé”Gƒ 3}ÉDkh`2™N;¬qÈHËÂ"uŒ‡ÒiŸmmêR{ýFá|O€qYC¥ðCñL|Éè]–aɉ;ZH! GM•“¡M¨ý¾s˜†În„Úš£ŽUÛ"ŒQœovbsq+ݧ° ”KàÜ<~íÌ-”g  «b]>$ò|ï”°²ÛH8¶ŠNÝ@­ÁO¸ "»ûð„¤Ã&”3(u÷q€MØ ”Q|¬Ñ`Ù6¿ëbh Ü@ÀZO:w/v6 d™ JD ™Èµ­ôÆ!¢¡;#«™`Hƒ {N,d+§¹ÁáEeæ‡>~¨•H{§d!ýǽö?´µáPˇ>첋õît¶ xáÎl·ƒ{6•©Ð<3×Z{¦\ÊþÐm‘¤¹0¢5Y[3)j‹µE …2å“OO»ýŸýçgÆ)g²,nDØ—±sk*=¬×ÎkáH¹á{«‚~%Ïü‘ÄÍ_B´ýõõç8zûÝ)ÿ=åþ¡óÊ Ú C}–¸Æ¶Ü6\Iÿ|ìoÿ ÒÿNà*ó®&—/_)ò:õ ž!¯€‘p5Z·<þvl[ºàrÜ}û›ݫҽ­›lÖz_ˆ!º÷ÜEFý.a‡¯¤8.ÄF½ø_ï|ÍÝß“8áÃ\Ë[rmç'¼Aͼ|©ôRmÀÛ®².!L7×V‡\/~èÛz6nQ/üq¨^,?+êåÊËÕçéÎÑ[nÄ‹O¯wƒêtì&¾º¼sù`Bâ-+Ľ±ä#ûfö¦Ó¬;; ¼@{óáÉA<¢qÚ™¿­}¸[ oO W O7CÁ;Ïœ³¹}ºc,{ÖQ"|]Ò[zcAúƒQ“CÛ4z½=ö Gtš¹W'¾}zá9¿\ÊùêñŸ©;]X7ä§ËÎS­Þ©÷ˆ%ÓþÁ•g }þÛŸ–çC["‘YŠëoþ{ßÏþøO­”2Oî0#Ú¡rç“},¶ßµ e牑ÜÍÖš™¯î1C^¬¶0Kj_& ”IšÔ¨¸¹Èu]³ã}„¶TµôɤØÏÅž—úóçܹÏóáÓs‚Q[ýüÌuž?”ò´kŸ—²ó9?ùêÙàvPËnFÜY—…Z„5ëAyÈh™i¦BZ®iJV¬u…­¨[q}4L:²À >‰Za@]ÑP¨uè}£^•0C]2ê!#X`)7˜XÒ,k3ËÖ²-Š¥¼ P5¬ ÖS;)s¬Ë¨îäœ.ŠÉ@GT0 ÿÌè-ŸÐ™P 9²$†I)â¨ßgˆVA‚]¦D¯Æ¡„éôÌìÇ0|MmT13A‡©‘hú]¶¹Ú•;Ž4F‡ütÅ_9fä$he*"kÝéVäJ„”>SÍ|†$U9Ufppæ•ݞסÃV)Ë4§`4¡µ ‚æ$¬+µ£>ÛIɬkBöÖy7f•M–¹jIJž/—Õ0…Ú ¶²÷l¶·©FþáÓ—ßìu8´C®óÇòqÿa?í ¸´‰õ9¡œ&ߨå§C¬a˜öóÓ§z‡V%¤*vÛ”T…‚0(¨Fš°%x(Ä–Þk)&La? “Ê-Xi2"… L.”à؉„*´T2WиRUð•-‡\knRšX%¦(kDû°„¡ˆlhö”l@Ð YÄ4Ã퀶B„7È‘›³€íg¸afGdˆÕBª“OËj¬´E ¢¥O˜ ç(ìÝ'QÑš0„ii!ˆØ4w€=GÉ-ÆÙ_0}Y„Ïêvó„}¡…žÈpÅ>mV´É™Bv+ãSà¡|PwtŒA4ø?ڬĻŸ¶6“Œ]Á‡ðüe¸ ä~;û—ÞŠºü-\F˜…(µ;‡w½>"©Îô@`@ é Å'9:¥è@ ­@Ïáf[WJžHe!d‚‚T`ÓV®ÞŒÊX?ýçÇ ‡Úví…PB ˆÑƇ£têa8,rÞ`"­¦M*e_8M;L,“æi®Þž3¹ä<ékrÂÇçòã“ÏS‰È¨µ”Yn5‘IÌ3Ýe-…µ†O&À JRFæÆÌ̼?(ÍLLE‹¬5¢6Ieòi¿ûþÓÿôµƒç7îIïçEýÿUèwÖ|ÚAë"š9·"Â:ž:ò^뀽{iÎ8ßtêD(Q3[0~ ·¼Ö¶Žü¥›QåÑ»âŸsì£'Ú[¾úý¦÷î­Ž— '¿ª—'õBmòyRç¾{ðõ&ÿþǾ÷Š<êü¾•Sßµs| Ò7¬'qœ¯ð^ï+úË…Îç}ô](^l:yc¯ÀÛ&ƒn$ûÓþ–eäÕôØÝ[àQà½êÓ5ßÿN`ìÞt~oZñ±½aú(¾yò^.GÜ~v$<Æ"|ÁÜà>fnCÝÓKïñô/5>^;®8zmšézíÔ ³›Ó/|é¶ÐiÀø÷o¤ñ{ÝÓ×Çœ9ž/5ì‡bæ¨Þ£Ý6Ù½kùhhÈëõò$ŽÀò2þ&_·[x -çÖAã¥ã×ësP÷pü·~ :³iÀùÞã¥oz dóN¾ílZ]ß>—¥P|Kd$Ü+Æ.â6/ñÒÔà‘êÊ’š&³.[¹_ôé8ÃßF…WÐÍéˆWL«³5ôáõÃ+5 ã± û$¾+jäÍÒ¯r÷dz]ä-ƒOg Ø¹õÕ u7ü}¾Ü¨ˆwÿ#i&£¢OûÓúù9jëî…4k…Ó?ÿ?–ýžÅZ„”ËÚÜJføÄ¨ˆÖ¬‹Î2KWû¼dÔi·£8ÙHÙT¦9ê’‘M2cI$-SiٹኴRd„%òó¡-«Uè¿}*ÓTœüœa"¦°C~^ÖŸ¿Ø_ÿXöÅžÿŽ“—§©ß˜IGËFd´UíyÈ\ÔÖhʤ˜\fŠ.¶Q«>´ (;X ·¬ 6䊨@WÕ)8[¼ÿ@™À¨QaIAl2å€#,Ö¦ëBt‚9›ó΄mzzºHÝ DóqcVÀè6ÿDgŽ×¡¦u¡ñ(Df"…žuèmî°¦sD dOC¯Â_÷õÍaAl€HˆŠÜlW‡æX‰XQ||Kv·ÏD® aŽÌÍ‹X Gu3¶ JÔÚ‚ËT´™µ…›Eh僙'æ0§É"i3 S‰”úmAš’uT‰ŽÈ7ëù>×i7™ •pÚ4;©È@`r7óÉÑœ¾›üï~z®¡ÝŒÝŽë2ÍÅwJ>cYêÓn¿Û==?/„vÓláuik4›¼Õ0™ÉL^òÐtH#[‹OùÜI ÈZE СU¦1T5U#D-{ û¨<ÉDë9b5LÆy†M˜ÍZ¨&p"K&'ª%m"…V‘‰ÙmO hM‘˜ˆ"’ ƒ„DZg>% F ÊÌiJ+Pg¿Lj©£Q€=‰/2JuEv(Š f5ôyÕäô .Ô¼S -¡Y‚XHS6´–4”l†{&>}Ž"Oˆi€!h]:7^ƒŒLõÚÿ¼yLØx'õÜZ¯Ow×´S×]flÊ(x*VS6ËvÀŠ)¹vÙº€EH´^ýzøæÃÑ²Ž ±+ûì>ÌsÞ·Û¼LH¡­°Dj$*|Ãý'gÄý°újcÁí×όРtXC8\›UoWdŒŸ¡Ñoù¿ÖF²Ð\€„̓KÆN+r¨'÷Õ[æ/7¿ö3µÁ3žáx2c‘Ñ€ ©ç–HCVÔÚ‚HD¢%l‚`œf„F›Pž¢|Àüŵº5LS™w阊ÿÕGxab‚g1[Ýûd Ï‹¦™ùiá²§Íe%:[¬Øšcá LÓ8ls…Z‹I£›Õ–‚”Ú{R´ˆÖ²EÔÚ–- Øäó~÷ôÛìë8_ŒõNù{·°ÂyzÚ^\mÃ-zP€£±SÜþà±tà÷cÆÇúìË‘ÏsÛ(ÙçUáÃ&/]ý]Ugæ§ç‚ôå;ïÆ˜/íÏa |@H½[ZóJñRKíÍ&k-JAj.-KPM¹´8´u¡*3ˆ4ä¦:I©èju@’ ƒÞ-ˆ=?òª£D…*L;DZy/é5Œbv³Åv—¿!¡Á’^,ZB‚¡ôÖ Q5šJ ­\mÓë7ÌN­H‡ÙPÖ†vMÔë3d Áw˜Ÿ†Ýn¯,î‚£MCž£a2° LØ}D]G1¾Ïæ›O©†‡§2@›"éÆ3Ì9}‚9åßH°Žž0‚DÌàŽÐ漡Q @BuïUKXFʬa2s7uCJÎ;ßÍS*R j.%”©Rdìé%/}8Ù¢µÐ®LFºÑz €Ýí)Y¡›3¡4eUCÌH±È››¡¸·–YT‡¶®«˜Ó„OŸÁ}†¬}©ˆ,œ”2¸1„¥~¶˜ÁlÑ–µ>yyšžíÀçy?Íe·®‹Éš…™ùŽjÐ2© ƒ„X{ïd÷«…¶@‰°ì~ª&ØÐoØúH&Œ&ZSÒU&,‚Uî¨HHLÀÑm¾¡]5gN¤&Lb![E3erž…Ä$LÄJ´  Ý % 4ÊføÂ0é‚ëÚ©QeŸ²%Ýd †¢--!G4¤Ò ž^Èi'Z÷‡Ø&9£×¤g"áTX‹ž‹ˆh-•€9áQvøa·‹ÈOëZ[*Ѥ8«&˜ŒÑYSD›¶’ ÊŒiÄž°ü89ŠÂ3*l§ù#ÚϘf¨¡ü i„¬È…L©cjUï®äÙhÔí>ðŸî®‘ÌpxÆú<8?þX§(à¢ê—gÉÜkÀe‰pž¿3†3°î0¡ÅøÏ&(Æm›Ý¨À èp Ò ñ.{ÐK?Õeã+wÈåªÎwÙ‹||xäã³ÐÝ0îÁ1¾#ÐâÍ__­~¾_dÊûf²÷|yøÝâ°íêwãùð>ºô¼Ò¯.9 AgÕ1/9ÿ¾€óW‘§ë©§í =w™”¯6¼sÈù>-ô¦$žç-o?½|?óñ;îM8ÝX¼zÛeQOÐóó;ýX‡Ók$ùjØzшz¬žæ™åïÉ,ýüŒômWëQ?ð[>÷Ý87}7×0S=Ëígë,ó}5wyÙüûÚ~ï\™¾Ü=¾ÜKørWéÖ‡|TÞÞaÇw>@¯î,¾ðù/7ß]¨uÕ¼r3€FëŸlÇÇØ©• åce–>ÿþçõyi‡µk€>•4øä©Ñ$Ö:ÛÎ@S2³ÕÖÝý´ˆ¤¯µí vàµ1¼¤m່\+BNØäa–Mô€™ ’Å4e™™-hÓþ‹¿ýïE8ï­ììã_}hk[–f@mõ‡6›Z[–ÖÊ5—UÙœ&Mn0ÀØ©  QÁD—ŒÝ¨Z„j.Ĕͮ“¨+C@4dŒ^ÛÙAÝâ²kèËšFˆª-"28 ëê Z¼@HD7 äÅ·š\,à˜ ¬ ˆ@EÖÎ7œF |ؘ<#ÖÙÛ ƒÍ lÂ4!*R•>’ÎñïÉ^^ͶùyÆÖ1˜!ºc÷¼Åvð„ Þ <$erÂUk& ­˜NT£ #8•"‹ˆœfFYzÒ»²o­IÈ€âÞ ”œB­Í K™ÕV·æyÁR¥hž¬µëð6sž&Ò`t‹¶föRwÊ—EÙ%Xœæ°5Ö%6ÒFÂÌvvŸ×/qˆiš½Ìæ¾Ö¥}eÔ5?&²,VQWÐЪž™Û –XëH˜ˆc]6GV&¤HœR É\üývU«lÐÎÑ€çH xÑÎi¦lÁL5®&¡&ȱ(®‘»bnêÉÖÖ»60ÒJ1¦PÛ\DmH©¹œÀÊ$DõÆšŒž @ÿ,Ì¡À”l ç]ì¶l´!‘g¢Ue‚äl.*©TLîf†Dq"ÍÁ])³ãóÚú ç©|Yêƒ-  ³k¿$wÅVå4±ì¦8% õ˜‹E• ¨_µ;÷жy_'2QfØFÓ²í‹:zÈz!ZŒâü±V$ ̽WøáGÄ3bÝ`A—”ÿí{:¼çt{ê¬Þ?/IAýŸÞR`•þ½YG†X‘<:ã9d£³ç:k¨@ŽÈQÂO¡ÅFD$¨+,6Oà ø°0é6$=•hýjmÆ Š‘/ìñ€ÚÌ®³nä±D­Xž‘ ”=ì 48éæö!“­}a™Åe»§2ïµ3zZ©îúðT 5d£å¯ÿ‘SÊgÏ„×9ÜuH04‹™b‘‘Ø”>‚.SR»=ö.‚!-)šÜAˆrvyak(ªìžä@2ÀÒ3@‚”‰Ödƒ ®ÜâlR”䆱²Äd`p$S"@X, jr­hêCòem™9ßûTSµqA€twJÝaº¥µ%ÆÓ€i[Rxš±Ÿ)S:D5æÓ‹3, œÄ§ôdÚõòøP팯62yÝAƒÍð‚¬0'DƒÖžŽâ{/ügŽ«i€úÊch Z&ºL@¡mBÿ±µ ¶ÜÀU ‘›Ê›èÕ@ãI1þE Fô>0l)(ÖFžRŽèéLì~l½>Ç=à0BXF@ïoè>L˜òwd§¨å86ëÉ uE«#¡¡-ÁPXˆsAoq’s¦ï¼ZAyú€²Ÿ`{bg¾‹²£ ÍlžedÀg/?ü@‡öö~覾ÉñqÒ‡=v{f]k²”dŽÝ”N€FvÇšZ[ÍTŠd´fî4ëÿÚÛÁLBf]ÛZ+ZDmY» •¹ü'ÿÅq*]IÝUCoÕÿ£‚|.÷lY^lJ¶àœ%/ÌNU/ìöâãñðV8Æ¥„›Ý›Îu¢s–Åmñ‰Îص:Ç\o*Q_àF>`*^¨gØz܆~7ÇüŽèî\.»Ü¹ó"êã)x×™ C¿zã3ƒ·Ÿ‹„üa6;å—S\_‘úå^ïB]iLo,JåWÅ7¤â_+BÛQðW’Ð/’ÚûE†•ß8¯øÇ8ïõû_]žÂœSÒDoRßßœ§GqcWõK§¹‘€?¥¹ûºËáÈ7–„<ú¨¿—'îYà~?ÿ|j©öÿX8væý{*R8A.ðùoÿ°|~®ËÊ”»µŒi?OóL7s£,%Åšlp_ëŠhœ‡u i¿µ"¢ÅŸw“©˜æfF¤"LINº¥ä‘B'­sòÙz•k]–º¶ÒÒ–ê?îsmÓd‘©¹ÖhÍ '?þõú°;üü9þ·ÿ!ךʴ蕕0Ÿæ2ýH-8|9|úÚˆœ…V£V¨12É€+±ž²v pCÔQáÞ©5]éòœÖááÙ}=£3ñ‰ú¼-+9Ô«®õ¬€ù¦ksóÈè®ã ŠÓñ>½Z‚|ЇX D™g=:ùÚ` P `È„ç×Ü”[ÃÁ™$|?0ý´¥1̆€OCbH¡L3>ý~”ðw ШýG÷•EW»·gç›÷ÓéÛó^†Ìó"äyŽžA!Ø Nq3†k°ÍŠyKDä‘ÑnðHтԴDÈv©õùÐæ©ì&J¡Q–k™Y£f¦ÂÀ ]‰Ú²X™vÅ j«ë»2'B&‚­æTŒÄ¼ç²¨V´mQ¿³–µÕµõœÕ~* #˜›',hœ5ïÍZËÚ»ifc!Z]ëÚ “1­u1ÑàSÌ"kV³û¬¢`iXåX½*6(*ڂЩ¦»«ÿÜD^W&¤öG Ú¢AԮѡ? aU>‘>!*‹sNeÐ&$PKNÅ KËæbrÊ^ÑŒb8ÁÉ@cRÜÉ7ÎD3¨èð¹¹IŠfi{Ð f2ëþ ò.Œ@܆nΙÝ„jƒ9(Ôo™ P0³™óäz®+€UQ×èÓ&š2™²CèËÚÊä…lÒa¼,Óèx“¢rwÌ3̱Ÿl-é.Ÿ1;fcÍÖ ÀÓl•™dBƒ iSÃÙ¸ÑÆÙA0 è4Ø8ä·Ñ¢§h€Á„V±w˜۬ƒKv9z=};ýí,ÁÞ¶¼¤ýÊ1;9–)–(†àÐób{c4.½@djŒgÖe< ÎÖõzŽ•D¶™š™L§9´ÙNô– Ðºµ¢­cÅ먷V´ë‚ì‡ÑЂ{7yJ4'6ùŒ™ä\ô4•ýSN¦]=À²›¢ »”Òd»ÙöešÅÆ‚*”'çÄVËÂb,.÷ÌgsD$†­±Ù"öE²¸Ñ˜©”˜šœ­‚@]kÔ¦µuRfæóôüëÿäí¿ÕÞ袞ÿ!hû¢žoÅêÅÿÄSMý×ÅT·U´ïäÿœK·#—v?p–ãØ*n^Лþ¼vIוP—[Òk­ϯ1÷^_Ã/ó½¿ '·û…{éëBçW”êŸTÑó%걂ÿÎ=ÿè÷!‰ ùFëWugüåBç¿»Zò¦ ï¼×|î;s¶s¿N¼ý"¾üÎ_ôîøz€oФ¶ 3ï~âYíü7%ήáCÇwÔÆx¿Ÿx!­Ëw,ñWÃ÷:2Go0ü¹‘èÞJâ¹™¼ sð’ùô›‚Öï¨Bò•$] í|A§~ÃYñ¼áá±’.l¼‹fž·&{U“NÿzÇ•XxP<~~—Ÿ×ã w㉋¶W>@ñ‘ƒî7ä®.©ÞµŒ^ ¿mHqÓp¹òçqáý¨ìˆ'ãìûë»ÐR•6LÔ«~tm»®¸Áƒ¾i|E×ê÷ÝʼÛ{w‚úŸæ!;“£WžUZ²9¾üþ§åó¡­•)/Þ”Ó~绩Ñn0v B¤“{ÎÈÌZãP… ²EFüt°uš>>1“-¸¬eÞ±0ZEñu©Ý5Ô%ϤÁ¼¬­ B­6Ïëa8Ñl]£®ñ)Û>å~"χC” æ`üüü‡ÿ×3í‘ÊéGÔç¬?·%×yŸ²pøy]–g >¡ùZ¿Ô¨éhÙÒ-3’”OR ê¶X)~Ðoz'›•‰žGOÚ®æûÀdÑÚ&µç(º?¥ †Ö¿iÛìÒ£Ù¨Âm JDC$|‡®²„Ï&C[QfСÏP/Þw° M'Ý›Fݽl¤%øÚø–îT\¦íð ÀH0´@™±>£­ˆ†iÆÓ}º[ìpÖêeó,%´¶A eý‹²m¢mŽ‘ïñìÞ§´ ô˜jV {µ’õ´Ÿi\×¥eÒÌæ2{q©=}ðÃÊVÜ­¶–‘4ƒk¶’Ý?¶U ­ Ij÷Ñæ½·šÙXPvÓœTDUÂ\V(èphmMc!BŠV‘Yw¦yª‡TJÉ;Rˆ¢H¦Ö5sZ§'§v––«˜Ê¼C™0žW$Œvø´´È¬Æº ])µÞ˜B˜…hÝ-vbÎjs‰BƒÐš&ä*¦Ð(&&d#Cʉ–‰…عvÒ”ðE2 z§!­Ñæ‰Ju½Þ„SLÁ¡n  ®‘Ž5éTem¾— lL‚Pö³&ÅæDˆ Õ[³²uØ;PҨm¦õ›®{ôê:ÚfMÂÎÌÀ§²[[<¯±ªÖÔ,Ìb–ÊS9ÔÖ±_‘JÀ‰P‡ÈOøðaÌÆféEó>ub”ìEïº(h‰-0QE=qÈÓÀ-Hýž²!ë« ¸?9JéUïžD7YÕ÷Ž%àuÔþkÓ÷}¶Uúˆ³'Gщ„KV]t¾ÆE %d zÆgëïÙ`œJÈ·´_™Œ‹%A¢V`E™àÓXQ£vã9’ȾNÈDVD®c^„cMˆ¬ÈDT´@&Üà†2cšXÂäŠT¦ÓfKeöýÓ\öª¤ûôá Bº<&Õ¦â6y™ì°TkQæRvî6[$lÚÖ2SÊÌìC@—²?[LeJÅ­w+µÈ £ˆ~©53Õ¢u©ÙZ¬-#ùTÊ\þƒýŸ|øíxaÓy,ß½Ó¾©«ðf+g;©GØÇ­ò:µ ôÖèG„𗼝Ößop=ÀE0w_ÍѱóÞϛŽ×7!—·|”€9o8øå½gûJæéË^ÐRy¹øFë5†íK—ã6  pÕp37¾É´ë>Üøhø£Ioߘƒ9Û\$ðZwÂ{ÕÿŸsœy3-©a;–=ý­_‘»Kúº©ø:ÿBãÑ“åŠruÑr“·xuò½ÀqÚ~ý˜9­l— ‹Ksé—aJWåQææQnæ<½wuq_>å#óçndP‰×w™þ¼ê Ôix¶5þTòuÍ0º|ÿüˆî yöa¼øê[ ã‘Â}}´—?x¢Úëæ‹t´ ¸+âÞ~//²YgSz)Ír‹ª9Þú}ÆèNf‚·“{Éâ6÷Á‡÷ÑYCÛÙèòó_Ê`o4#Γ9|%S$\®sw'óåÓkè»òùuväðr¹¶\žÚu*ˆÄFUí”#òáà»yÏ€<·ÃöˆTór3ÄåsúDg}˜šxc$z߆… .(«ÛSòr%ÕkÉ?Ý6Z¾+P¾Ýv~e|yöP¼¶·iÇ0‚…-»q^C7Œ?ÿíO‡ÏÏm­J-ë:Ù´ûðÁç‰ÆÈ°›\$JÔJ˜Z5)j­Ë"w´ižì‡2Gjñ"²L^Êœ-ë—%•nIÜïv€° Q’¢­.`YùyÑGé§Ïå‡,û)n˜Œ` o%Û§gËïÿ§ZcŸÄ™k¢&›[0К—Lóy5ƒ¤X¢=‡MIϨ]ÆÒö;ÌŠÚ¬¶…º"niDf禈âaiÏÀ~šžk«‘fãÇÉŸ+&·È<Ôæ._@Áhzèªýn:|\e†Ï(=‹¦TØ.MR”LˆïØ+ÀL™4 åš~ó›àe¬é9Œ1ðž'ãfÑ1lÉ!à˜&!‘%Œèélʼo¥ýyöôòËßNöø^>ÛòÒ9 °•ùÇÖ”sÆ[å=$ Îý÷Óó㿬S¼ˆLä:I°™@¬ÿõyœo÷ÆH š¼k;ñÕki­—·é¢à£'Kox—!„Þª_½DÀûº×;;¾Ï—Þï¸Ò¸øÍ_ú~rʧ_Ûíð-™Ê—gÅë«Ã6ÄÚ5ä_Ûð½ÎŠGü‚è•—:^\ÿ®¿Ë[oØðä×ô}úçEYúßC1ÇÝâ/xAÞÔðKœèÅPç)¦—ãáªåë^åoj”þøËù‹7Á•A3IëÐi\šÂoÐótéóOŸŸŸë²*ãyY}*eš­¸;ÍK ®µ®l™‰Ì¥Öˆd)ÓZwP¡ÍD«5>}jO;zI‚óTœ †y:´+"RÈLs÷BÀ3ÊtS­h¢¤¥*´.µýôeÞOìUhE³P#§d3¶„ˆ‰¦9x e‚³#…ÖEA5ªÁA¹T8™ÐÀ© Ç’`i˜úNÕÕ¿T•HÈ´׆h ×ÌáqmTt›þ·½s¥OV‡Ú]Ü„ì­'n-i|švMy¨­JMP†; "33•2ãn*Kí¦'ÝÐ óV@Ã4cÚÄü¸cÚcý YM4ô&€b¶fp“•ê{ÙÐ}Ñû:£Þî@˜¡5°óŽ€Ù6Y¼Àld¹iöÚZ–Ãè{@Ÿt’ò··œv´öÝÿíìY—6·4Æ>ñ|S Lû› v— óÃ&ûlƒ6,*z"Ä‘v&ø|,,u•3„‚b4,ô}zB]C)ëVý”0À x)Éž+ÚqG›jqúnÂ~Þí|Þ7Ÿrö6ÜgOíæ06™±¹fÖ•fÌÅöEeªf©l5 E> ŒÚ2eƒ/¼=ã ³SÔ”] í Ù &Ôj]Z¬ ­u±øŸýÿjÿñÃýÛMÒ»Sÿ ³¶?^ÕÇJ@6ÌÆñ ÏÑÖÚMf»øð°àqÉŒ6±V=÷þ€7j/u¾ rÞцþöó•€×Óo”›ïÆ|ç6ÆgÆT§ îí_±¯ù¶€_ô²|¥ùŠó#ø»lu2ü¶¾ ÝÉ‹œÅNõïÞðâë¦J|Ç€oLJý'ÿ@ óßá–ÜðÞ)ý7ø1ûB%å›Úï¼ÿ…#ü^4ãò>Ùî¼@_¹¢ÝíãVù¬7~æ2ÿn¸ú-Óú/ Ò®“×î÷8±?'?~¯“|¿Ñ…~ñ3Óå²ñ»)_ý~ËRrw‘½4:¿,zͨçÚgí—PëO'þ½žÁçðÛ¾ žUhürOåã~öÕ ÷­nW>Ú7ðÝG…ôÂöï]O­÷ÍŠ{Uç}:å½·Âç‘q5¦ï©8ä6âÖ/‡õ°Ddm«MnS±¹h”q* sߌ¼Ò;é¢S-©æÊ¶®yÈC¦žž&h¿£M%RŽÌbѸDN¤M;šu¸=çâFHëO‡º¬˜}þøªíó‚Cõ†¨M?}žvóúÓ笑¿û˜$”íyYþ×ã®ð E´ U¢á¦ŽØ†gûb­eTåÀXˆ”¢‘šºþôG®È>–6`Ö Z8‡è w8mðŠÞðu¦sIÃ^ ŒÉp»ÍýèßÒ!<™&@ð=dh ì#¬cFÚV„ÛPꢹƒ‚ïC6d…´^¶2aƒR€Ã €ñ¥ÜÇ{:DÛ¦­K  ~Ís«î–¤†¨È˲w¿Þ ± y[×XÑÆ÷Ú–$@k ‘@¬£¤Õ§’”§[>®‚a@WxPŒÔ¢I4ÍNZ±ÒdŽ aëÕœHW¶›]‘·‚ÃÚ9Ц¬¡â^¦yJ4³V•hª~Xkæbi@˽Ì2ËnòOÙPXk€ñ7O… ²æºÂ òC˜—åK¶%ó›}°a}n%–x®M5”˜æÎª«&ŒS¶¦qÂìw_ DqMÌT!ê…ãfH(˜a)4#4*-Q³RÉB¢1÷ÄΑвXzrAÌ@@³áÙ;B¼ ”4yGù9Œ©á„"¤ÒŠè•‘$‘I   ‚kФ&4°šÈ‘wî*®¤n¼qò©6¹DF/ùÏV»A·uC€MZ"×H¡Õ”§©´ˆCmĆýy®-óÚ+Ð fpˆ² »Qv á𦹋·42|¦ÚÛx­óŠ4$ï.Ôcc‚)ᛳE6XïÅÉ‘žéi³ÜLD¢ &¢Â ¦ÑdC¡lóö8êûýåG;_`g˜ˆ ¬g¹ãkB?àÁ Âcð¦¥oϰcé·nãyc0Žf&m >C1ìy{—€úÁ8ãØé:¼r؃Ó!–‘‚=z‡|ú  ¨½/ŹFš#ú·CL47ò%¹+¥ìveÞOe7O;Ìs-DÖFx€žÌíÇ9•)›]»ÙwsÒ­FmIKŸwN¶Þæ$%8¹4D¤6CR3÷VkÍžQqÖ e¤Z¶¥ÅZëÚœô©ü‹õÍû݇ßýˆ·Üï³ÿ‡ 4ÿ'q«{½ ¡¾B¥?û‡ßõ=Rÿïua^›ã–vôKÅÚ_—à/ñ~ û/[Íu–øŽ&·ÙžlÓø_|{w„Þ%ý¥²ß%—ðbfHß2Èw7uC|•ç~—ùþ–ôÏÇç|Êý¹Yt|ÓqÕ~ñ iüCçß²G~ûÒ Ë*‡÷¦:Î{Dî>ÎnïYò6ïx^’÷>tÒ«fËWlá6š FĆ:"O°œÈåz€Fé„ ˆ§Ý#Øä2sƒñ8£[ÜJ4c°‰tñ"WáÎy’ඉïF "{§ÛdÈ© –¼·ÔÞ»wšÒnRêç:OñÏæÌ/ƒ¬M¯Îò’qWîoظGÒéJ^P•¶@Œ×'{[™¢Ñ¬¨‹|ËQh8bH¨Sðz%ì^k¾>Lýð޼~'~åE©ìÕWR§‹§«±¼Ý¦Ÿº(t¦ßöß®³IDÜD¾¸p¨¾ş©súu}Þ¼¼ ^Í:ê^®‚ ܱìQRc;µ3¦¯ï»£ˆoJ”ðôÙ÷f_Ý.–áó€]Ž}ä1$â·é"›øb#êÝDÂÙ=Ä‘W¸énÛdY=ÜÏo§Î«ÅO®È¼8;Þºóÿ¦zˆ“Ü>þBbÞÏ>OÓ\ŠVJ—¨×Šqro-К™¥a¢í>ìܬ-K5›;cQDX%šÌ H!™Œï4=°ŸËÂvÿm]³Åõc.»iÖó—fHÔŵ´ÏÿóïeòŸÿç4M.D›"2j¨ Õ=}4–d®”§ÿÐì`Ê®|P|Âüq»]:¦DXŸa¶”hGÐÀÝ0¢ôë0nCt¾M—)5Xÿ}¬»q¥søj½r{hKÈ sËîôëH‡Êe4”ßXŒ^Þ«Ó€rZÙ@ƒ9¦'d¢Û4AeÄKîC̶Ùur¨‡#àPƒ•Á1 ‹Ñ®ö‘ãŒNĪ»ˆß= 6d¿•­5‡y²ûè–0@4ezq@ô,…€i¤7¢,EÏ P9 ‡™H޶sD‚ä<—V[4Ÿ—ÅŠÙþÃ~’²ñù°î÷ž–å°F(eAXÔ´püðCY>£LS*,![>kfÏ 3kKžkËæôˆ ÙD­¦9+“÷žAÙàa²Õñ¿YÃá÷ŠÏÍSmm¿ÿ”V¸ûaf™š``)S;45%EÐvªRM­Lûi9´^½ë¦–¬¦T‡ÿwâ<ˆäšjÀLíˆTôŒ”’š'Ò j²Ö`TÀDÓ®¨þEIÉ“0¥A‰&C)q*5'[ —XȤÓæjÕfC4)Ç£&RÈ€ ^B ª[ÝvõMƒ9kC ¹°nh94îãR–9ŒaûãÝv50»¹%„–jft÷QÈt›ÜS `iña*ûb5òóRÔÎkß7Ð0M˜gøŸPfp‰XàĺB@]ÀÁèX¥CŠz§¶V! Ö;¼«ÿ[+ bsÌîÏ'bƒ_qÀŽŽ<KXž‰õº‡ò,ëD#5ž0G»å¯çʱeGõu Amœj$"0±ÈÜšånÍàÌyç»ßzªPsÎó<ï9ïÜgYIsoš5æy!öOO61Ȭ’MfM^æjž©0ïz3[ 2aæLˆdfÚ¶­×ѹµá£LJÊÖjk Ekm©Ë²2åä?ÿÿÃÝÇ?þãß]Iª·AÁÁ“Ë/¤ÿmÜÖt—÷37•£Š{¶—¿i‚¼'ô|}Gø<äÕ·á9óçd‰×‹F6÷žv#2][’êœØzŒoPÎÇHó;¤{Dþ+!Fg_y3>‘þ¹¬Ï#}ëHz=z<__ÞG UÝÝsl•™¼…öœ²n´;ªN;ð«ö‡w3.S¼á‹ RÝOQ¼¬ }_uòÖãáåÏ—°{ãNÓù^ÁÒki¤û:ç Ïê%+Ú+:ЕsÀ¹:|5±ÏÁ&·KÊÙfô\ö{Å õ—6ñÖ%(æDݺq ác„ÀíÆðJC•2ô(ïò— ÑþÕ{­oêEž'Cz÷Ñ…¾|öæóEŸ·ÂνÝý;²¶×2íÝq¸ßpµÂ<Êv¼,(½*2¼3xùõžž9=«»7ùã—äG<ù_Iý\gGu_?=s_‘o©ã~{_Ý˧òÎØ‹  c’€ß~,o*%çûψßï"ðmàë¯ÔûÇNxó vü‰›^â?R¿õ—/Sº»¦â»´N%peö¯$ÒhÛOð;ŒÂýüõ÷jݺÊhð6ûöðé&Çþ}g–¾îWyýÀ9Êä½ÞÏ÷>üªJœ«]¹Þ>7u— x~d=¾5Q\À7û¥}þ»Ÿ–χhM‘‘if’ê²H*S17O³žëÎÚzéqf 5­«ME6A"a™qX‚6ÿ°ûò%i–»ÙÜ B²˜¡@3y™¦¬íPW#}IÖöwŸòÇ=@=ýøƒjË?üÌLýô©ýáSƪ„¤üi)?ÌüÍÆú¿þ¿3Q[«îͼ%„P4D³¨VžBEî*.W¶Õƒ6ÏÖZÝí;¥‡p) ¢d¢Ìˆ‡Op›ŒQ¸š 6a"ÔÐ8æ|Eæ°åì â€ÔC0ŽØîmÖ/Ž9(3² rEWæFåvûÎÈ> RP—Âa 6´®¡¶ âÝQ€/@bøô"úQb?t)€¯ÏiSó n£ÛàôÄ·S¶ s„?GDRw?î¤#ŸáóV80ÁrÔ†Ýï¦Ræö¼¦!#môóX†ÕçÈÚf›¼e>†lj›ép´-¤jk)L»Ù`k­L…Åóò¬°É§y'wŠôâKki®h™Ìò-ZZ½5‘•µµ2qï‹ WŧuÍdJ`kÈ؈JíØ2K¢e¶µ ê‚æºrixr|ú F¬aóì`®U¥€>ÚÍ“ïfqˆOËR¬05¹"W&¤åy!¤V}еóRúŸA)éiFÑDÇ—F …0QeÿsòIzr5 “dB³”4lÉÙ© >'-“Pn°Dcá´4­B„@| š¦Hr$© œŒÕ$JÝÅH“oæÆ”™ˆ„¹² F2‚JJòIÅÁ€%J°†XA—Öà$6Ëß^˜ßÕó~'z÷g§/‡Z³÷½`WŽ®qÝâOáXz;n=Úô•¡î@x¿YkûE;xô/»§/ÜýÞoè¸Vf¿cô{–¼8¯9Ô±Šàwk~Ðð¸@è+ÏéAZâUPëßsÀ»Ì¾%mv¶ºãÖ%mcÜóõý"¶pƒz¤~EÀ£DàÝ\ÔŸZÀÕØ¾`öðÕŸùÆÀûöÞ—[Æ¿ èüËÃÅÛŠÒKéÿ™±÷'/ÿÞgéÿ–)oÖù}õÒ_âõK黄ðgDÙù®‚ñ/Tú£\=è­Iˆ—Öý?Þ ðK´~^ôÝø÷:ï>ôÞ™màU ÄaÞöÕ[¤?ùåã{ ÷ÿÞÛo¿Ûƒóù󗃳?Ú3øšx{]o3vuõÓßüaýò\—‘f&&ÏÅ4J^ÜwSŒÞjgö£Ö "ÂÌP¢Fw¥D h-F€ó<Ü›Œ~é’Ó:¹UJ¶Z3'ë*"óùЖj³ã°ú²J°eš}ýÛO qb|ðùã~ù_þ;¬)¤yÀk¶ê có’Ô˜AYZI®ÞA* ¤à;ª1˜ÀŸã8CÌ·­˜÷ !W”=²‰Ö ø‰ÌôÉD<Ã'8ªÂ|ô6ªmż¶E“ÝA”ik«þ­ŒjÜòåjU·õ3~ü'ð q€O¨u؇v~NôŽÍd¸!Ì`Ó È:ÄDt<úQwÓàiŒ‰Q&ûä~l'q³ñ §Ÿø)º0߬’^†ZwÚ¢˜°Ø.€‰8,ÈvÌUÔeSwÕëh†Ü“¶QD £(˜„;Œ#×"ŒsIHŽZ×ÉÊÓn¦YË5SÓTöO%é#kx¢YÑÓnÇ)#Ûä~ø°y,Xk›Üw6ìÓÏÏ í÷…Y) *@u-0£™—`~©V ]L°Ì4'ŸY ¢MkÕb?eÔD>ÎOªX–µÖŠ"çT×ø¼gN¥pPÔ„RdN$€ŠL`I®M…iÄÚ¸&˜Óˆ&U‘Оœ`“ %—f2Ò—¦H}4‘JH‘i¡}d÷hÈ …c3Q•1‹tpR ¦è¦¹gÇŠŠ¡jh VÀCp¥fI&¤(¢;¤jîCÈÊÞIT[Çe]ŸSLÉ€gQ‰ÉF_NŸ·½ˆ¾Vpë–Œ@ŸµåpÁPfm1/Å•éÆÉ]­µhH5ˆk›ŠeòP£æ©…±»>ƒ:ŠÃO ŒBuÆy@ر™crö9.ç¨G7éý.¶Y¸ ½1¢[–.ÇçWA “´½¨ 3í2ÁÖ“sÛqL·çY¿m¶ÀǨĶ?íRÜ﹦ëþWÛÂ1ç)÷­-#Bé@ ¨îé¿Éžêë’õ´Õ(óªW"ÚÀŽYAÙ#È“x?÷᣾¹‰t‰»­`$˜Lp²Œ#Î4&•röy6߹零¯s‹â§sm ˜ ÿqgB‚ѰFìv3ö´{j×M0sË̵5‚¡,®w4SkØðŒï­EmQ[¶üÇÿοKc™§ÝO?þ£ß½†]Å¾ïª ¾‰Fõ]BbK|ÿÛ/-µüÅ"EΓ@b„îE´—ݘãêá¯6ƒýÚë×_‹«éÁ›ÍïËî½§ùBÂà^ºáÏA«º‡îù%>ùnêå{|þŸ1tþùœ|}ßRþ]5›·>o/ýØï¯“·="—¯‹ßz9 ðݯB¹:eÿ×6fÄ%„Û÷_`8p>9·µÙªôÏQ)qñT¬~oi|!¿sÞ2œ‘ήó‡«2ÙípyÝàñ‚2 œŠƒÏ¿èé|ýSmSóŽ©.Ê‹ t†¶ÐQ\æ÷GgÍd½s§nù´Q:él(ÎZ~·ÉÇ›¼…{ug_ßüø`Nv¯'¶ÎŒÔ¹+×ÛÈ0—]Ÿ—Ô^Ôågðö:/\fÜJÖº3wy\¿Žg=&äÅm|³Ê#¯TgžQ§‘&Îòº9 á"þºþ\TŸÑGôR3o׸Ó_ÏŠ¥OÍëYqN2â6uûM—7¬®/s/ÓÚôgH±ãQñmKçÙ( Þ/iQŸ’Lg´#Cçk ò¸¶6á¹[ÝE¥ù¢Ëpg½„wBn^dïD¡ÞÞ)ojð~ÓP§ûÖô—㮹€¶Q»ïwÑšGOÜGðåÿ7¶ÄgQÔycø)L¹j”ÚÞ“™[¿¼I ¨Ôá§Oëa]K=¬Š˜&ÿýý_}ø?ý—Ëì¤Ñ\™(FPëzp튡x6Éz˜ø±9mY3,£º²¸…ÔjãÓßíBŠÃáØÏFå™Âs¶¹¸u嬥=¯üh(®öÙª ÅÚpXø¼(…ˆvXƒÊ0¹Ÿ§Rêÿçß(-eµj{nª©Ý e² LT0;l¤ËIT[¸̧f^”Â(p.~¹ X6(?‘’ð Qá”ÈŠi&2àŽ2ÑʧQÒÛI5§ßëy»£ï¨Žï<ëD6tË.¼Ñ‘‰Ã‚O(óå˜ ­! ¸‰|¬qê óÁ ñÈM»ç`dwÅiä!Xúáœu<;»ø8pÛ[eߨ®Õ`ôs¡Ívµ·Mô_ñ fgð;–X"BðD1Ä—jÓ°öí  ”.h6Àé*ek2Ø $°²‘xZÇû fï H˜ÙRkmš÷hÞ¹ HµX!Ì6›3³´em\Š{hýòs~ù9§‚-à˜ç¹®é^ŠÉ­ ¢Ï Óv>5´¬YónˆÚ‘¬ “iJºÁðTãdSº&g®ZëJäÈχOûð‡æ!ì1y1E,Y[ËHVÀ¥ LbЉ ”´ L˜0¹V¡ f˜©L.c~Nôl4¹~pÿ)# 2‡Ä’T3Í”ŒFMášÄ¤ö9R\•Fv‚?(#Ì…†4°nÁšd_^ɲÊ;åÊ^Ê/ŠÊd6µmÛÐÈ ÚUpƒÏ.iA@$X1M¨&˜Fiy¿}Zæù:º¶ð4M„ž—µF;òF)„¤–î-z9|GÙ”2)Ü1—þÞmÜhÆ­ a»_Æ1lh¹a^ÝùÑž +§»¸%2᎑K‹ÜXþó΃œÃÞRSŽÈa¬­­î×¶ç@œIÿw£TnoóË0£ç AÂjü¤wL5m©ŽãwqØ¢À‘,HB~ˆé+*P¦ MÏFL»±Ê™£ì”¤È-Ô³áMl&À Lˆ„¶$bOBû ög I k¦Â0q~NÒ'÷Êìœ|7Ëlþ0K¦ƒ4¹j“’, ­}òÂÞX`ër²”4³B¤Bî-’ƒ Kš)S@Fœ"˜>ÕR2¢Õš5ZmÙâÿÓ¶,ˇ?>ýðác·ü}M¿×ú¯Û}Æ‘V±ý—‘{R7þ¹ˆóÍçѵ7òÃgñÞÙB»„[¬Í×iý·ti^¿–„¿Ö  3©7»Ó;¿øoòêÍ÷|nõ*®ä¢MSzTÜt¥_œ‡þ=µÖçà±—GÏ`›Wå·ÈèNÙú=ÐzÉ-™ubL½=¬¿Ÿ#lãø¥·è¡›øXÎÓß*Z]QJpo¿½ ç…Âð—ryïJè\ð ¹!¯.ô‘+lË=Ò÷ÉýTBæÅ¶‚g¦Ò/$ ÌìôjŽá,åò»®Ééw[gÞØppõ-ww§G³Ü»WðUÊ]5ö mt›M¹w\/WÓòHX:?ŒÐyÞ¢¥^XKï^ =XXuå|y‡<\‚/ÇÿÍϸ÷¥Ý_¥™Ý{‚ÜÎ_³¾ŒTú–LyAû&NX xÛQê]MðåutpÔùm«ë½£¾×(É·|­qÇËßñæÑW^įåÜ;ñûZ÷uæèk02ùsoÄÛø+oâ9ñáÑ㛯ֽ«§{Ÿ¯›%ïf˜¶u’/°zÛ\½Ù`Ü?í“*¯oš»ÇÌ[sŒ;èÛNÔóì(_»þgþ8[–ò•Ùxû¡gKë¹Lû¦üï×ÎÎwïÅÍyòy©ûí !×µã÷¬ÂÒûÒð_÷<»¼„Ëpðò„.v¸7OP½¥&âë§Àà {‘-»ú{!µ”_~ÿÓú¼Ô¥fDf$ôóýýñ?ÿ?O»B÷”º 2R²þLU¬Kv?ѵîZô¼‚ u kéëÂinÅV¦2Ø9ÑZ.©Èx®ffeâ²4¦’ª ›y1üù $®î0ùìùiíWÁöSÖ(O;«¶~Z°*ÿö$³e[êRJ¬Yb]ÁUÅÍË0]dI0Iˆ€Y4ÿc7lðcJd7àÕP¥»%o7È { »h r…„Ü!!Û¹07 6OŒ>ƒazy,rB4$ 0Áy²ù˜O7U…#VµºPð@Ù†e«Ù}ÛàD%(+^jkA•„UFDk•¥x²)ãùðY¦L÷ÐR$””ؤÏT)F ªÂo 'ÖTÁ i†ŸöÎZ‰@Â(€HÌD,ÕÒ JÃ^Fe_"*±+“ž’k"j²›ÜÒ²5z&"Ù(#\˜HÍ4”ª„ܺp0„ãN‡7Â6AÞ ¨&Ól0Ãs…KÅÐ ø/ˆ†Ãr’¹ó¬F€—%Z‹/)‡2eÆÝT–ÚºyôTü¹E¶ˆ”á€MÃíà ¦ VFj°·¼ôù99úutô92`[®N[ÏÐXž¥ q ¬&‡°®’YÇB„#l‡ðn¯í›®¾ÑÉzÖÁ^†1rË‹‚¬>> G9øô`¸ªýïW|2”Z ëÀuš…²uÞpsèB"} Ų ß+À¶v¼XÏ scŽhlF Ž“{y[PžÀ Ñݨm¤Uúß”H"fƒS;tË ÊlgV&‹âÓ¼CÙûôÁæyúá©ØèWjM>O¨_Öç•€Ïs@S‹þLŒCËdí6 0ËÒl.óÓlq¬Éá™+RDt›"/%#2S©ŒÈÈ^øµýïþݡ͞>|˜žv?üõïÎJlô`¯1*î¯Ê…n‹‹^öõæ€{ªÍ…|&¢}Óvû.ú=®Oîî1ôÆpó5ª¯Ùu¿at÷G¼ y]ØuARº1ÙâƒØ’ß¿;âŠ_sSx~ÅY}[À×ç7κïÒü]¶roÏ¿¼,èß*ÚWJô•”ÿüËûêÒÈÛŒÎ?þ-šæ½ª,]%Þuï¦IÞDz<çnÖêWèüsrG\:w¾ ¯œÌ|ËŸèö*ÿNòó×yñþqåŸzS&ÿ|.­þ2î²óNáëÑ>ïy–\&~]áÿ~g1ù™öç~…û¦èd©~i»”™Ÿÿ‡åóóºÔÌŒ ö›ÿòÿ"Ü̽‹Úîn‘ 7¨fýôyÚÏF´µî‘îxvóeµi*Q Ú=ÍKC“–5v&KÁP™ 'w³¬¹D¶”‹"°Tì™þíÏÈ€“-‹!صgæOÏ‚'åFŸg}Pû›ÿÅ"}ßà­Ëú¥åŠù)X˜Tq®+áé&q*FÁhæsô¢ø^09$³^ö€‚Ïði(ì±ÑgteyjOP Îx$b0Xüƒ mðyóóܶã)Ô^èÊÍ6  Þ«¬ l‰ÖÅÙ‚–ᆺ@9²Q¡ßiþ›v¿és›Üoð‚¨ˆ6„ËÑâ`[éc8ƒŒsàzZ¨ý^Œ|Ì4ÛbŽž«ýmÑ`Ÿ¶ò÷ ø÷ÊtŒv ˆQ´ÛeÈîûÚ‹QÍû¿êHT†¹BüÚ†!jn5ȼÀw£ 0«QY¢î&ºÖô,°Õ¼ÓÌýÓ¼?|Jóâ`[–¨•¤íç}D’üÃ~·.•®¬±~ 'çeöó³žèOO¥¡F* V º)‚<¸jª™2‘@&Å[›I÷©F…à‰©¶¦B&‰®¨D$„ '@ÎDž+¾$&BDH|®L`žz ¹¦*PštêKÄÎé&%Öä*c&›$b‡ àø@ÌFƒ2äŽ8„’,fa\½û ¤-Rƒöbç³Ó¥¦Cpf¯ÁGÎDêÍ+ê O4.frÂA%¢ŒÐ$º!FÐПœ†§4a*OH¡UÐ`qr© fÝ)÷ qà %˜/Dê¹¶aö›Š5Å# ‡áwxy7ø-5`€]ø.$³Ñ J‰†bƒMÔ[mÜÆb2˜cg^ÁãW †bƒ¦•¨[^#Çàe4dn†–§L°ÚÑ$`+ç¯g™€- 1F¦œ=j{†À‰š¨Ï£À·›q`Žì¤Ëô†n¡¡ïûÖJ¸qôõ9±l‡%” ô±—]O)Ár˜¥OO£äŸ3Î{½-GvvY ÇÔÛ (PL)ˆ5ðDAÙÌb(`)ÓÓ´Û}øð!ŠÃgNÞd»yW&óRò‡ýsÈö¥xY)E֖ŬN…óä¡X´²ß!"Ì[Ê–i6œO; (#tàžV¦232[ÆZ[WÿÿÙ¿àó4ïçy·úÝ—ÉI±¹Á7ÿÅJ¿èiÝÀÓñÿóñBÿƒ•N¾ï¦ÿnà××û²Þ«—ÿ¿¯ÿ^|®ê…6Ž3'çïp¾o>Ùsú¯€D]%H.jûzÎŒ—ÞõW¹¥G"Ò0_=ßʱ3ï¢Xà ^vð¢bÿdiþúÅyM³9KÚ\üäÔ¹x¦ÐuQÅIu<džà/ÚúЮVàû 5½B¸3Ò÷Ox¡?û± _£Žðò*]Wx³Ì:Óó^`‹p‰&á”Í• 9.úþ®‘g\—ë9΢kØ ¯>]œ¹lÞµ:~ûqê\tóBŠ~P„Ïs6ßy9Ï%H^§ÿÆûP ³÷ŸÏº³j•cÓÆhìÔ0»a²ó¬hkœyðÕ娫Ùp~?é…Æ^~ÀÙP_„æ§aãe™ÿÖçx6W裫Ý:HóÊüº]àŒüs$QI;/3Œ.îÆ»d˜oÀÖƒÓ!ëüNÁÅ:ú†N½þ Øš¿ue¡{ —WþPušzÓJ=¨j×#ñ°ÛºÏ(^°ko—YÝôÇ´;u g<ž7÷Ûáû:wÊ ôZaÞa;{þ_Å:}øü7wøô¥ÕV[ñü?þ›þå¿6ßÃ=$Hµ5˜s‚ L…Ù”‘K Wä²ÀmùòŒŸ|?ÏóTÖˆ4ËiN"–˜fghÍv¨š‘¥uƒ`8MJ›K‰¨Éì6S)†pXâLO_[k_ž-ÒžÊîé níçC€˜ #ñóÿ7ÑĶ,Ïk]±jÞ €`ˆ 6@l+8±HˆìúunåEµÁËVÉkCþž?`ÿëϧG öÊôº½scpw48ø?Fìžm(ÚÐàé+KA[ß dh ! ¾á>¦Qª‰2!-‡ˆÖCûËDÄæÍ»‰šÇúbI8BÈÑÖм‹øÒ©Ü [¯€ 1ÛÈèO$ÜϪ˜‰‰Hž·ãKÛV­¯bïÞ5„€j›]pŒ»º»³Y³(ÇÐu)S9 s{̱»wSPA@&ZíÔ£Ìu¥Ág¸û~ÚÖ,˜¦¹fF¸ËôçOM\eªKZLT¶„–¥ÕFøIv˜ˆ)3QE÷Y¡¥Ê¼Z’TƒŠŒÉ%‡]A}æ,€ÌD4éÁ=Q-šØª¨,¤Ì³lmÒÉœ“b.Z‰¦n ­ !L€‰În÷ª½õÆ%DGµPrrš°_„)Ħj4`•öNI_RÌdÐÚ!dnžÓ©n˜‘n=ïƒF”ÆXiÆ®,GÃ~fI4*¹IçRR&£«G '1ÕˆP6¨ ©Hº$v“XVpJÈà2q¼(ŠKCŒ>NŒžüìÞÈ~Öÿ—n4 /‘Æ–Ùr&0ù!Qeub­ØÍÓóUD„ŠËLp7zd‚tss'C’RÅ‹™¥2ZïPÐVûß ÿ#ÖúOþé?—’´2O»O?þõЃx ü·ìÍ÷©7‘Áý½ ε›€ËŒ.~~7.z£ ðš.ZyüßZÔê¼Gá* ÐuòTQ~¾×º» 0éßÕ{ÂsQæ…!ºÝ%kZ‡9öq;®süϸÌx\iKr£ÝÛϱCf:jO×Û½¦ÈÕ´À=üŠ®H¤à["ï³Jäsž‰t§üþ >fr¾Um¼*…¾gmª›A¹\ôßH)çË£OØ”¨vnOóQú‹½/ÝË*Ó_­v¿Ä’è+nÜcì貪ϙ{+˜°ßÕjÏßü² |—ÒsÛNqW¶¾Ã±y‡,û:M†ÏY=ºÇ©¾ÿB¥à•öygç}~!x5‹Þ{´¸Ç/º}x?úàsYòï¦é°˜ò9¦åçO¥Lùãš?~þ¡|,$kåTÆaú½2³ÑI{r ©íËAø,ˆ;ß?Mø²°Å´›´T­¡]Ëšõyõ¿þ±’õúï"ZË¡6R’’„ï• n’ .5É‘ 4N3L„¹ µq='µÃ]Å´€¸ðéßbÞáÃ_áÓ¿…ÜàDÕPåCßÌnë@ …RPvƒ „­ò¾‰]÷ ¬lB]7ªÏ4”;/€oÞÂ>>Ÿ[ù.»7ï¦ý©âJ8Gb ×ÇÖÒÑ%,†€ØQV¹-©!Á§m\+`Ð42½˜·'¢mêžmnŒÓÄY¥ÿq>ç&è[_*\ÞÙç¯V ÔpõT;e•yŽ<öa>Á; ¥ ú‡ˆ¨gÙpŽv„–qÐ’›0`€"” ëaYæ5Ÿvû†ÚjÐý©<ÕÖZôÖPÑ/\)S$d]ïBriœª­©YôDVNC‰fœˆ ñE1%a4²Q 0Þ:,…e6Ö\¥%U¹¾ìLÖS`MÔ¤„ŒZ¥ en…¬ÊçP¡¹SHš&`"g£jª âŠ>w±RlB¡,ÆÈ)†–Xî€ç0Ö(¦ÖoÇ ÖÀŽÄŠ“›,™Ø¬ž€.‰wh~ ²ÉUÁ‘)d©„ºÝ.¨yOß#W±§çÑŽã &G'NŸÛgö´ã/]æ6ýW7–âlÑs(røýÒáÖ _A‡D$Es7£˜aÇèº+diDf@¥ Ì° fǾsŠ·c6÷쩳È4Šú{,ls“í4"‡y/àçñ´õ0Aƒ ž£~_@½©ÈÑ™úßoaÛ`>êv»‚ù°û6Dp°›z~n¼ ™ ÃG¼kˆmñÄY— X¶vïôèý @ ˜a=³ØÐÚhB…j‡iwôEM}‰J8 r)˜Ýæi*eÂûý<xÚ—yvs+VÁ–¦/KUø\Tûs+¥|^59}J¡&I$ [äx˜CÈ ö¼‡‚™·hì™–ÜD‡LEfd«-Öµý“úÏ$ù4M»y~ÚüÝÛ6BçaéYPu­i“/F÷÷v:Ýßšž«Àoã@¾O¹ûþ 4¯÷ÌWÿ\»\ €.UÂ#mû2~½hçULó{eå·lQ_ÙÈ'”^’Mß·)¾.Ê:mïíîÙ¾óÞu|}®À&ïÚv½—XrW }ñwyw¦áÚ·_u‘¯7G|6ãÂ'ñž†~Ë^ÿ–­ÖwüG“ù-‡Ê—ko‹à/ponMÚ^È(¼%sg»÷•«Ì_>tþîûÊ£‹ýGáÿ\åà홽”ß¹_ÀñÜÿ^šþ4_± _¯ð¯¯÷¯¨¿¾¾ÃË~ò__¿¾ÞÎ_þüùŸÖ/ÏíyA„€Ïëó¼›al Ÿ&F£l,[d„2º €Añ¼ØºìŸæ¶Smm2ûüül©@ÛïŠe–¶–?ÖÖz·P0½ìfkÍЊ\ÔT˜õ˪>‘?̾´vhhY~û¡M´†õyÍ/K$ü7OåýÆ?î>ÿ›ÿ;¦ ªf«ª^¢&Ë¡”93“î#ÁÕ¥(pÌó(Kï…ó Ô†4ïeT‘÷òüNðWÚˆ@6a@[·j‚„Ù@ð—2äø^`k½Ö>F±p7ÃLÀº‘€‰Ö†¶ÕaA>ÁʱXbX»e^æ)s0x÷m´,„[üè¯k†Z`~ÚHªÑêÐ1;8ˆ~ƒå€`;XA6(ÎÊ1˜æ‘÷#‡ÂÞ…ý•:¶ƒ´Qu¬Üþ1ÈâÇÖ5mÑsæ°Rè5¿²Ó¯ƒ>"ï2Ž¡­£ìq|Hƒ•Žw‹Q°‰(3o5>?ÉŒ¬øùçç~xzÚïZk™"ÜIµ-¾ð]œJ´‘­"ëºfSMТ‰{cVeª&H84Œ €b¨Ð ØšLœ3øLÑDÁ7x¹ž?W EÊ6‹„˜‰U²n·iJ@bÏÝEh!Š4ù©¯u+Liа3|(ö%rö¦½aß5Ód*?8%|Éœˆâ&¦D3î‰hŒCŒ„̸@;¢$ˆPá°¹n‰@ Z©§èÆ­QƒFIhHí&èÞ!C˜ü f1‰â‚C’“šÐkí{ÊjÚi& 5¨g,„ÒglœtÒsÒ}Ü$v[j]›õ” ÇÍÕg»06Së”–Ùh`ê¨ÁDš™,Ž0å!ͨ‘°b©¼œŒ¾#‡{Y¿pÔÄm3Öv ‡çv7BãÖ(# `9]£½€ƒ˜ÔÞ{?tÊ‚kµxì0`(D:›éî±öŸ0Ûˆ^Üqº:7s`‡AØL êÐ0ïc“+›Q|Èúhƒ:Ô­’Ý ±¢8ÖƒïTz¾ÄGÂC€¨*ɹ7›1í‹—2Ùn¶§]þæÉ}¶§9Àšw»ßüøQÏësk6•ЬDÓaµÓKm±½ÊB˜| ­Uš@’‘æî^ºá7H!3‚ÝÒšIVRщÿmmݸÌeÿñÃÿø¯î«z]d'·Z›×ìlÿbÃý‰௯__±;n³sƒßajòëë×ן¾>÷¢ßòw¦|GéÿÁGé øƒÞ`·u>]UÕòÊÈòîßi¢W¹úÞ+ÒËE•ùeÁåÙ^w3tã»g S~õº<™WÓ…r¢ê̕Šï”Ûê"÷ª -æÑá]ŸïëÉ%±d>tËÐù¾bõ©·åj,ñ‚á­pe¼Œ¡¸œ58¡p^ \<*e>¯õ8W™Üóïú¦pùNÍÖ[óØpUáp”¹ùܧ××›»gögÉKHÑ«ŸËG~PºÀxD"9«G¸O£"¤W‰…äyÀñG½L{+ü¸4ƒz|Ï› o[0ï§¥yqUõR+Êñ'ü¶Úÿ‹^/=ò¥yHœº}Ú]?õZ÷„n¦Ø±ùH73âØ\}OÚ` ×MKo~àl9ö³%÷e¹ûò{Ž1ë«9>n:½u*»|Òo¶‡ŸÏ·ß×—e8×쳯¸ì>='O4,Ü’ª:ÛçyYŸµzˆj(>‚Œ”;7ÐT°Öe7•*mr/ލ†¨5mž§â–­†Ì]œç¶TÕ(küæ‡dHP1#ói"°6ª‘Ñ<‘?¤y2­ù»øŒ\k|Yâ÷š¹QçîUj;³l«¢&šYÀT˜³Ùô›ÎégR˜3E¥sð] Òà³Ðë¿ð^#¿Ùx¶Ž°/X0Ç´C´^tÒ}Ï%ô Ö®©õBר]ùEkÈ<éÚIp!Z×77DÏ1h3È‚ò­ Ko-P&Œ"tŠÞ‘{CAŽX6ÌB•ã¢m¡6dt'rËôºÒî,ÚÄ›FIµ9 ° Ùuw#0\v9¤|sØ4”é^2 lú~7î8 è8—Ñ6 (6Œ ‘u š«ƒñH$‡Añ±¯¢;Žl“-uëñ@$õæ +ƒØù\žÖúŒd4ÐѰ~Zð4íÍP[ûýÏŸ,-\L ‚˺DD…¹»Mɵ%ÖDTΆU( çdxNPVN)/–œiÑEðPeÂLë«ïÒ~…ûÓú©e¨R]äDwú5¦j"¨Ì~Š b€ŒrÀº„Mî)v‚*°JJ:áÀO”DÌ„Kæo ÷É&Ô¡UØœ¬ ¦J Dƒæd$ÈY0R.€k3û€('4ØúP 5D@R¿5fc˜"ТWë«•m†J¡`Q—J­'WOøÖ"Ú°äm y/ˆÉ£W0º×ñÔ;ä¿«ÿ^@ »;x÷Í€¤ÌD!–4¼ÿ ðÉánæDpm£ÁÆ‘Á®¤*\#Ÿ§­p\£§gXˆ[ﺅ¨È†âcYðããÞIP(›Ev?=JAT·;HœF£l‘þm\XÊèŸÀæ½q ï}Œ`'iË¥ðzÛfûÑWKÍRáHGdÁTƲlßkcÅè8 ž?yJ@1þ¾|B6„¡­è×}ñl€Ì$ýB6ÍX Pv6Ù~æ~ǧíö»yòݬ–Üí³ K+»bJ*æý®M-S¡[¤òR23kÀmÚ—*ÌLм¸€l)e7 Rbðd‹6ÔÿX[FþÓñï•yÚÿðáÇ¿þ«‡!à9”E¸ êAØtõQW;åGŸöŽ-Ñ)ò¹Úãžcß(Í¿ $ÙçïÔ½HI—Þž¼õ¿Å cpŠdÏp7¯g].q@÷ñ’¿œÌõÖ=à6j/«Ïˆ¾'âÃõ—¾)–¿a ½x‰ï£‚ÏÆù-_ýõü»›¦“<óxNžï°îö\LíSu’3^irÀ»áÕëèm}[[ ¼Þeyú ã™ ´Þ~ᮀ3/˾ç[½#Yë„3yíø_˜'¯ »w±Hï½[–ý«è˜ÐùG½w¿èê(_™6·OÕû3á;ýן÷Ž™ç=7ž_ëãx?¾¹^´«ÉöI”‚sþ/‚¨Çºøp2êL£â«ú‹ONâ:Æz¤êݪ‚:=&ožÅz¤}%Ÿ ð8x]z18&-N¹“KÚù¥Tzž†ð.MŽ×Éí^<äxy¾Ôæwy¦gäâåz—Kü’ÎI„çY›ëIƒ·Ü¬z8OÆ­Åå_çúÿ%ȳoèoÛüη¨&á6;»„wR§UþJõv,.rf÷ud½˜_¼}ß|õkÔœŠžîñ$Üõâ-òá]*mÉ€‡ÛÛ Æù´»:‹ë&îñ$¹|Óùs]¶"Wf4„^%»]¦â¿µ}õ^|ð*?J7KðKI’ÌüòûŸê—×Ï?‹œ¦bÓ$·4º™¹·ˆZ›Š»‘»yúôÓ'ku÷~œŠXÉ¶Ê–Ú zR¡‹}‘Ö³ ÅÑ˶:‘£çE@Ø(,‡Oƒ dòÒ>ú"¸ob«N¸ÿNÞï%Æ0Ôˆ!äÑ+ÔíI #ZO±tá²neÎÝ`£R{0C¶=’…lsIí‡4Ž Å“Dm³/Î ©²C6Ô/Ø} Áø’8÷»}mÏul”Çáð%³ðÒ˜ðFt³`«h5™4Ky^‚ÄTphøR1Í`³FÍ5z² ‚˜{¯ Ó’˜‚s¯ôO®‘½nÚ@'2ðåӫÐfc€3Ó ì®ÑÙ)=  P£B`ª…êåês"¤ TBÄD{b >'*`1<'—„=µ7| ¥0™ï-+4A-ùŒ4Š–H îú ÑLž óÎ]É› %dòÒ$ bóvÎ13»Ì‰$ŽËZ ਠfj ìÈn } ÌPŠºÙ5‚;)µ^ ".pƺ€D lÍ3£ä_gò·_VtØeu‡9&ŽYwJƒåÑxàt ¸Ë ­BŽ5EQ¥µÂ Ê VØÜMfæNƒÕ茟µïØm3ØØºmº ¯Ü²eרç,;#èèÜÛõwë‡m˜w0`ù‚0XŽ•ªÛ–¨mÏ Hœ¡­ë¨“Çz7 Ç “Û Ks5š ÌÇZ{]=( À)$ÇRÃgø›G¯ûŸ¤˜#Æ8þ!‹92ОOˆÏcUÉ-”ú·jÐ m¦Á='›‹Ïó“~ØÏOOJæ^fí‹¡ÐnÏŸO¿ÙObfº™—Ïk’f\ËLúÜÒÀy²HÁ» ™IÙÚØÐ“,^ªZ¦ $ÙjCf[[Ô5¢¶Ìüßÿ‹SÿwG½?Z§ ¼ÇîoLO±ÍN°®%òSÁ–nTðc¢—0±g¶j×’Ù âàÛ‘ |\t‰]áŒ]Ó'|—®äÂQîÄ#!ÿ”'¸( Ô[Ê5^:Ó»tï[Qæ5}\ Ðt£{ëÒýðŒŽ¯ >ûi(NCB¾ˆÒƒòZ¾}òÞf‰.Ãé±]ë¡Î™Ï o|î‡Ägõ°¯›“½ Æ¾%°èJ¸º7îr€ôxнA,&y¶Á¿W öÒ–äx^Ç€Ì|×fçVI¿âz½6°8¿ßþ-¯j©7†:×î~àÕžúö3¯œÞ¾ûÓã Ù]}ÿÎûµÏ?3èü=_‡”®ÅõÄ»*s~áÍ—ˆÞsé¥'Úî虿D¾÷Fv8˜£ªwîÚòÝ`|òk'úV¾®á/óõëüÙ^7ýzx¿ød¾çÆõÇ>Þ_û‡¿öÉñJ þu¯Gÿ@^zѯ©ÿ°µø»ÿß¿åÚ~úÃO$­÷© 0Á”2R™À<­ÅÓÇ=´ ›&ž—õPWa?O€OËÏ’ýôÜ´æ§ä…eúá7OÈõ°,Xõùo~òâiÜÿöGc/Æ,KL,™£d&EK¡Ý*#kËâðqö§}ýùÐBëó_ª£˜\€æ ©l^Óè9´¤…@Ú$,÷h+CËî*<€¥ÇÝŽÜQÙ> Õ™ˆ þÿìýK“$I²¥‰Ã,¢fîYU·» ÔƒnÜÆôk³¢þÿj l°ÀMš·oߪÊÌp7Sæ3 5S{ø+2"ëÑå”T**ÏÃÌßq®`5¢~*ºì8ŽŽ¤7G PÃk÷„#z½V–=F’{×Ô¼ Ïq‡¹Œ{¡†ÅFjÿÝ® v=®«äôs^|X;€›„súÍkŠnøú.Ñ|ÄBXGeƒ%Z[Ÿ‡;ê0èÀñÓ±þŒû'øîœÜo)çÕð“0 ~òû‘É6ˆCº§­/hÍ;©É‡=CæÆH™%ŸkuÿZª¦"Ñœ˜Ôüe³È†‡¶$ Ÿ?OÎééøœ‰l¤)³Û Фe¥1 3Ó­Yj6|2<€‹07í-!KÑ UhžÈdµˆ™(B%–ÑX: ;À &&3R“¬Q‡T’*ÀÜ28¬F)S‹Ø„Éà̤5õà‡F®1žº»Eâ@U:ŠMZÄADj×%{ˆÄ"S“a‰˜7Q\ÉOi‰ä@E‡ðÀO^ÓT64¨×+h‰j=ì%5f·|޵k„“˜­ ‚WÔJ¹˜¨bDEäˆÊO{ÍDTïÙÝ@Âv¢ÁjÈ*[ @K+ynŠ€okD(D¬ý0ºöí%Öà”Uìö?°•AO!Ú€ò°@õ4G[Çr’°H´¶ ° ÛIö므 Ðø;;]÷,{3h¥ßê4F€†X0‘9®6 ÖÛî©÷§($×é…§Èåj0Þ#…cÆÀÆ4ÀQ­‡'aÈ@­°i(þè ½@Hƒ*̰ hÛ˜£úd¡y\s—–yÌÆ0–Ç< “ðì±%øPq¦‰ÅÝw>Y-m*Ÿö|Øáh^k­µõÓCùᓪZ[.eŽ‹ÍÁåaG°ÔR'‰HŽm·ßYÁÜ¢ª1£K¨<¥íö¬7JR&R¡ˆh¡ˆ6·˜[´é¿ûûÿ¾NuzÜþg¿»ÎßXç]¦6f âŸõƳëæßJpxUEzSCûÛןùA€{m)oê{£Û¿õôusЇa_Wð·¯_žùs[*¾É \¹lâ­§ ÞµC¸wy¿·Ç¥ p§±è—®³Òù]´ýÂæþè5ôBæk²£n'¤ÛÔÝ;ª|Ñ7ø¥Ô‘[žËõý¼[4ÖÖÌæ²V†› ]#,>pí­‚ø­¥î¯(¼bœÊA¨}ö¦bEy½ñ4c0(×ü®‹âJÝd•ß3Œ~Çm˜H.Šr®ù1ºqCzÇ»áE?ºm†5±…xå€tò­Ú†m·¿V×\¦©@o jž½ÆùŽü Ã7E‘ºvÞ6«6C‘ ùÒ4}¹ ¾ç2¼ƒ¾Þ.M%ßnÊ‹¤ŒuéÃMÎË›ûÕ/]ïvïtŽ—×ˆ‹µV_óЋ[ÒKªÖ)OïªîX«[¯‘_þðÓùÏÿÛ²,Leª»K‘YfæF7l™YkÉÈÎ01)JhjK@òLdÓîq÷°xÁ„Ë?~ Ù—zXÚç]ûr`%wu÷ioóRŒl¡@CêéIiYÌvR¶TR@,©ç† hòÏŠ‡vøOÿ+CحЬÍÏòpÕ…®B/r=4ÁÕŒ ó´]ÖcA&v¥lÈÙZ1Ö6,.͆g7Ò ÁʪVw‚ö/cŒGªi×Ѩ³ªÞ³t;ÓŸ+Å~;@C‹èàJw1-¨aõ!°Mµ–£”Ñ'“ôJ¥( ®QwÍÍ!V2 Õs¸w¹hp¢ópºŠ×ÍxGd¢s6v`âHx¡ˆÈavz"r ¬[ ìïîÉ9\y¥ŒBæZÍ@hA,0CVÄÌ•R²Ä»¢Ú]Î`¥®r4x¯!èµ#KšÃ6¹Ç"‘ 7qZ”Éà ;õƒ­[{XYjÝ=?Í!#¨ñSËhâìeW‰¹¥ ™îðÀ¡Ù!@èiAHlGT7&—„˜ËÉéV2Š&‰sfŸZ´úP„``•æ%L¦”[0 ÍB! øœÙañ½Ovy:S]|ž;#“v` ‹á˜èB-¨@!&TH•šÁš 5iÏ’Q1G!…‚1"Õ?=$F  JB%Õ®HtÝL†´âæÕ«d2Ñ ¦ë‚¡¹Dø„Z` QQ‰ ¹Ó ŠKÉ]·¹îê¿S=¸iÈUJ.{ÈÐK TXŒ"Œþ•›‰•N³.¨Z“è×jM£š§; w#ïþkÑIkðê!@€†ÜÈ3=LPr0äqÕúp³uCSêZU0¸gÄùÝÆy¤ØGÀx®ö¼ý¥h”´6z³5+?61¼µ;b5èø£^½Ñ‡öö»cÅIôÂïQ”Õ¤‡´˜v‰_#QwÀ4.Ý•d!µú…Ì”Fh‘ŠXCžxc-Œy`cB¤³3š[)»©¢z™veçeoSßì9U<-V§ŒÔ’þ0MsCaÝ?¶€í«/î-1»Ï ™É©<Ô ¡QÆÌ=„ì±åy0*ô“–-òýþÕ¿ý÷u?M»Ýc·ü½ÙºÝß J½˜ßÿ索Jà•oñ…šõևןtÞÞƒ‹œ+¾Ž‰üJN+/¶èo«:/Wè2aB¸ÌfÝp—ÞÈ;ù†ºßUÀÉOò•Ö¸^ Cñιá̓†î 4¯ —|ÐÛαk¼ŸÌùËÚï=c¾Ü?„vyõ¹n\©Oãìt¢wÖ&¼ÿÍ_±>øò×÷ÐÇï©“¸¬Åy«õqîo ºŒ%\ߨÕûÝþõ6 ë•Ĭ¯›NŽo>pþ: óïy´Û>üJ·y¥à¦ë^ ÊןñõR°w? 7Cœ—KX/•»–õßQ«ôöý\Î7“äºL *w„´³4ɳmÖÍš¥»êó¥t%/߯ÖgU¡÷W›mÀª˜kýå†íà v;¯zÃíõu]vQ6räÐ*(ò%Ùõ:çÕîïrnÞœzêqEj|…=ÏëRêìY½¯j`ߡꩶÞÏrß…üwÙZDœ2ÿ.T®+­n-\Ö ÿrâ»h«Ý,½KoÔp]µôUŒC7ÂìÕþ‹7x“³Ú¸Ú\êÒ×oyÅé-õk¹ì€"Ÿ®§“ÜõžñT^{?“G›W¡îEÖCµ®]=øRÈëîví´qÝŒ§kôÒèZçàËÃ7zÛþ¼‡uÂ¥…Á½PÈð YmCx1§_ÁÉ^Ó¶o÷W‘®]Û`ÈFõæå¥N¥qÁ€íÏœç™ Xæ¥˜í§šÏ‡å8·ÃóáÐÔ–Ç]Ѳ´º_‚¾hÿ°ƒa9B¶ßï|šŒHeÌs,|üü8M%Z3—޳‡² ‹–C[(N5 i–ÿøŸ²EûÒÌÃg:Èvl,é%s¤[I/£-¥`n´f“¢+ƒVP«‰b×)Oì¢ÔÁ®¡€#’€Áí<¬3Q׌×21Dº®JGi¿¹Âpbåj÷üôÓpü„ý®—YEr4Rð $¢ ƽ•A R¿«U>S‰„b†” ÄŠÎ訟þê»­q‚P‰džŒ!)Êv¿™"çq[>(ù=«ÏðšË=¶(8Î>¥Wb¯ÑÞz ãå-XžG‚mÃÐ[ÅÇ.)öëô̘°WÖLd µa ØK÷\ši„JÁ°*V”À"Ô>á¡BBÝ˽$šd‰C<)uïÄŒ¶ ª[Œsyš QzDA0Ñ¡çn-6„}ŠH!rxá&I¼kþ¬:(»‡(¤$ˆ9Õ$©n0«ghÁx• áð@„ò¹ñ˜4S× xLTŠ`¥$¨cⳡ@G…‰|& µŸRN åÎz Sø­Ñ¥èå8 ÉGIB¹wT*F"”\,»å±ÜØ;Lˆ—À2ÁÀÐ,É©.÷$w­.²œÐ€RÐȤvJ $L.w˜CÐìÑ;(ܸ«óÅЀ˜ÁÄã'hŒ‘ß):=kÎû´Bÿû\êëÜ:f ]@í»ë5ÙÇ \˜gDq²iMŸï0"wÀp<¢˜!u®kéñ’s` VæO i^+½'¢Òçe˜j”2Èžj@Çã) cîððÇþøO0Ç4õX€{ë(XërDXfcºèã‘kš?V_ñ6f6Á1SΞäãçËõ{¨f ÷Z¢2J‹ºÇ@oðaµRG˜PöXr=ô$•ªÎnì`"f° * «L(æXJÙaÚ5ºÜöuÚךÆÏ?x±\Kf¦ÔÒ÷?ì—\Žp ‹×2M’RœÈ”Ìáp‘êk'IKIJÇMAP*2I æ%;ö'ög÷éáó¿ø;Ü"¶Ð¿±¨só/nÆN '® œ8ÁpƒË·×$_âÜo6s[ ËÍ÷ð’þ~zù>Ð-Týöù7›ºåÙlÙ2kÜâ½ÂȲý^%ôCù(Øà¶7yªre u±ÁÖ=UŸ ø—G8ÞQ‹7àΛ>+Akn×êÈ&l‘=¸'Jà7ÿã¢ëÓÏÿða±õCĪ+‰üÍkžÎçÿN* ×ãÝör/Åóús?¯J/†ÞõýVE}=6pK¹Ù†‚^×µOÎjŠòö{¹¼FÑ›Gó-ÿçöâ[ ÖÝ©IßÃð¹ÌC#¾*…ü¿èü‡"y×ш ˜ë*¿þÖåæåEA_7Õ¼òÊ^'åá †~^¦o“_ôßs{·aÀoPðk}}ÐgõµX+ÿ¤OÁß½¾ãåßþMò&<òUó>˜…ÿKB‹ØÆ-~‘×ð·«îåeÌ`È?Ôi??ßäF¿Rðë½»“ð+7s~ɯÚoWüú3„¾ecþé¾ÞÓ ïT|Mv¯>”/ìpß*ÿFioålã-›íþË?xúÃÏËa9Ž̌Ջ—i?y5˜lÊ%’„™MVvÅ\AZ—D&t| @ñåË“ÒAí>ï¾ü៦yiÓ4Yk»Éó°äT?}ZŽ‡çŸ¾´/ÐÎC,yœEª-„%œ¦„¥Û²´iIÕ²üþŸÈ °ÌŠð@Òe.†Eµ²€ILÄž;bGÛ’óãã.Û!ƒ‚`LÒLÛmiÀª ¡ e°'Ë;/+.VªõÉÞ–âM7¶Õ&‘k„t–̸æÈW[˦¯y¬«®ˆÐ‚LÔ tÒxwÂì¾ÙAÛâ–ãž;9ç”ÕÛWþ[™ƒY[ô/a÷©.G™™m ËÕ“è{ý­xñî:¬mlƒN7¨A@›AÁ}-8è°”²Bˆ–@nÉÝ„•‘ËÌ G(sÄ3Hxüü]½íss­°:ÌåÈ&©›Øp®f'sxAWÒÍH…\°4²`òòP¿¿Äœ&="càUÈ@;P3•² ‘\k TÊ`bâžú9é MZ;³"µž&N@:E2䨶æ¼&.™I$èÐDV·Ÿ•'ò¨Zy¯¨v*ø IÕ˜`H{ dX –ØÂFÏž(3̉‰Ú9ý1˜RKˆØSJšyL5iG:ðœúì 0§M½¿›:Â¥ lM ,k™,¡D¶ÁÒ顲].êÑë¶ÇPö`Å ñ©€Ü†ºC¦ºCç¼ÇNÔJ³q½mWùø.€© -˜ŸQˆ D®¦ßg#ÛîŠïïëú¹ºF“ ÅÆÛºu¶Ã ,q|†ˆ2Á ÇÃÙ9£g¯ûÚ§¹ã8**ëóLêlþ¡õ°õAúÕ¬‡åÄj’ѧŽš˜.è+‘]V¯(˜8Pw«ÕpuE½¨ùЄW ZçÁŠäžò¼Ç´ÖQ© ×pGH}Šˆ#f0üÒ1‚‚¥ æO6´#¼¢a=fx|„ˆã3âr¡Ïf»´ÅèI1BjÑe ¼¸O¥>–‚ê¾Ó´Û}~°‡½Žšà44ú燥úS(–e7•0BÚM>™ÍÅ}·ËT¶&Z¯Š uúW?^[5’‘Xî¥뮸ü:ÙÖªóým¨×nù½*ÿjNµÍÒ?ó=øU«ÚE]/!ßý3_Òð¼ó%äï=1ܾä¯g5‹ktî^q?Ú"wzé˜]6iѧÃá*m÷¯ê›Ý\¿x@ßûÈ•dv½Eæ€èjã½%„ߨw|pÊ“¾&ÊÆ­¹ñ·‹JÝ¡ÿë—…Ÿîø2¡§ˆ|Õžà:'ä¼ÓA\H«mß½B«æ»°b:©ÿ)üüÇŸ_ŒQ XwUfeW½:HIt·Ì¬…»iÚ‘™mžcY–8w»§š•†œ–’¬î>탹!ÛóÜö{™-‡ƒrßA$¢`Ê:•’óbž<.‡–m/„03 •bÍŠDÛÁÂøóú¿RÊRLKh¶(‹WTU«©’ž„O-¬¡¦Yµ‚%jqÔéðÔêÞ ,Öá÷#;“‚MƒÒSËÈRÏ©¯ÄƧ··ß‚8Bu(×'XÍîIßG˜m!låÑw'Ø> ‡•%Ò† Ö÷žDX†çe¼l%Úèz†˜N€¶žVÜ? ^ÑsbÍA¡-ãf¢A@"‡Áo{ÆÌI §þÛf«XY r•V5Zo@„ß§œha1€ú³/ç@~(QwˆyešÛˆ äº¡¯ÞÈÔhŠ6ƒ@™FP¡{w¨‹9Ü©ë÷­±VÑ€1£%aüü»q<€†Ý'´_~Œ¹þ hœƒ&B,h_€#´hi°ìö§2щŃK—¶EüDTiöN'ZªéxPØ%0…lô£J. J…ð ì‡%%aš8ƒ @JuؾÌÁ&U¨Šì]‹z`Vƒ„&U¢ pÒLG ÄN‰ø“ð ,ÒÏB@øä8¦vɨÈB, '`öÐ'ÐᘅB€jÒ,ìÁ„ä6¶cK÷s(‘œÁB5uÜ:wh’ºÊ §µ_U.Gᢽ k¿¦Êr9ûQÎñª1–‰ý'D`9ÀˆZ Ú‚L<~‚Ù{Eƒ Ñ)ù 3 Ñ€.;s£ŽÝ+Óè癘«7/B«MÕqÀðPQˆãóZBÔ›« ˜J"µ~Gí‹tˆ^øÂsˆ±;`Ž´ýÈP–#FàøŒe9Sû¹VÕœÈEòÓÃÙÇþZ‹£>ãÙ¹ ñ´«îÈ)ø&,8J0 ™HB6¦‘ná;~$Fã0Q  û7,0!ž€LˆD´þA>±ì5ÿÌi1sÎ3k³ã¤l`˜Œ•V̰3ßÕ²Ÿv»=w;cµý®NQ춯HÚ~g¿}t€™jÁE¡°‡ªR„2Í(/"¹ÌMÅX‚ÕP‹Á,rÀ¬º|džrëLJ!Zd‹XZ¶ˆÖþå¿ú{H4+»i÷¸ÿüÏ~wŠ1Ÿwé$.ù¥mù^Ø8ë­t«oy¤ù.úù­Þ· \Š^»W33´Ò¾»ô£Áa·Å£xåy#Õ¯'äëŠØÛܸžÂÏe¼u ï;7|Hi:5ů¯¦¾’ÜwWlŽ*×5×g ñ½Ð׿,p—èòN¥þ»Ï¯~âKêõÄrmO}gÀnímoeýîl=kêæ¥ÿɃ‹=Ðù_¸Ûu7a¹¯Xu¯Ð W}ê«‹6nßàÝH î•Z½2¹¾ò‚¶æÒ¸Gñ:ÝÆÉø”º¼åó.Xî5ëBƒk1üe&>.Hâ¯õ-LJÂ!ù¢æ{<ÿ¡'˜^(uÑ PÿÛ9˜´ÖCj-‚&¶ §Ÿâ™Öw&>Ý\_÷^Ñæ'Ñûo7NåÍä©ÈyƒØãéï®—oîɶÆØ4ÓÅLLnlrô †Ìüã?þ#ˆÈ<>ÏÑ‚Íl*6˜{-³`]Å=KÀbr§"ÅL±xmK53g6¸ÀZ¿üþqxžö$Z›Ûa~þñPkE´2UPÓäÛ<ÛÏ ²ÃÒ&óÎÅÖóKÍn% TÌv’!ýüÿþ,Ë‘, Kp¦BÀM(ZL*Y­ŠVw^j%µÔÉë¾,‡g¨™‹;¡†’¤T6¸‚bèڧרdž:D àð™äjzÉDäŠ5 d®Þ¹ÖšÒ=ÒfË) £-ˆ8dz˗‰ˆ@¬" jR;˜S2¢5D;ãþ±º¡j®¿™›\xƒ-Vi à;°$Zë_Æ] ĔӸ9q¼ §Ó1tSåÑçVÿR‚†¶ c€’Ü‘G(b×Ì•ŸÞ[˜Ëðf€#@L{€˜Xeë*ÐJ¶îÀ£Á »úPÞ} h°I–Ö“‘m‘h##[wÅ5C„™âí XÜ ±:ŒæPƒæ”2c“IùºíÙ“&>P‹T=ñœÈÔ'#i$ÕGŒ-.‚G IÒQ˜$€A,A#l™ *½)œLÇ”ÑöD&…l«+o*”É |&,):öâC@‰Ÿ… ¸‡&!€E(¤22ˆO¢“)UÕhO3pr×?1˜P)«“3i=þ‘=!ó¨Ã5@Uˆ(Åa=뾌¿À Ûë0£,ùø”=ý4*QºíD·åè.ÐÆµ$ czŬ(uØCð ߣ ÄT à0C pLëö(V,¾Ùu2OFµ=“ý„ºZ7gݼ»_БÝö6ðüÇs­O,p! P(@¶‘2ÏU"ïU;¾µú`‰\ 9Vß… XZ|KÈàì3ùØ3y'°®îÁc…ÊQí¤5zç-Vð×ZñÓ!þ§©àTc4¤Ä€aDïxIÎëêÿÉf¼[wóú˜„Ý çQ•ψIg|™r†Íö)Ëó—ÅŒ’ôÏ\DpÏš†É‹ÓÛdœ¦,“×]ýá±îö¶Û̾,&™Ôz|^~‹ei•ôâGæTk~~PFÌ‹%Ò˜í«ÊeI€-¼LuòÎY+|Tˆv÷P¶K›ç%—Pæ÷¯ÿž¤×RwSÝï>ýî‡ š0·g¶‘1CžŽ—lM¾#5dCþ¹aU\' p¤«œÈ$ZÑž|9JæÀùt±å(ܲ•·Üê_¨Lm$'®áU²Á] ûzç €K6‹®Y/ß$_Ϻ§oßÀ›¸çÍјºH¹ZSŽ.·Íýе9õß €NÕ³4)lâT”rqr¸`>qËSå­wÅé”pEÀ¼ÙâêuÈ¥„zÜv#¹¸‰wÅI^‰ ½IÀxw~Ö%uudd‹Öá¦óaãfÀó}wõš<¹‘fß‹zS`½«çÞ}³Wâ÷Ë…øó&gKy=ÝéúÝ“…ÛWp·àuÔKéØwoo«w߯¶úu ò;ßøŸtþÞÕ¾ÉG¼gRºiÞEªÿÂn~Õ™?’¿½È×W¼Ã{éí܃nðÏôK+.a~ gâê%ñ[>ÚÕèüxÀ/¿Þ·ÇøÊËßV|(«—ßôé^_ãõÝzì7¿ùïUpª¸;ÚÄpN[Áo0õM_*¿É|uØñ÷º_Aú…50ß+ia³~ÏJöƼ[pWxÏš·ÓTà*7íor73^Œ§µóýÓ?üÃÒÒ N›>ôuôRkEqº‹&e€.ç`_=)—EY ²‡©<·XZ”Jíç/4›öSÖ–c5ª˜»~øüi9Ì_~ú™™ù¸Û}úüéé?[Á®G“ féf‘*Å)m)S4ýôÿú_ÛdŽ4NæFçãl£#–ZÜ(wEICy¬Å*£f0‰29 ѽV¥A©(2•©e$¹÷ä@l÷|öˆ!©€1À>} í–•]Çï™òƒìá ° 8Á¨8ö¥!riEÛGÇmLjàÄ‚Z‘†ymê3‡Ã­qÄÔ·‘&Úª‹MMè°Ó‰=a«xQlhm½{-4Ò‚9pÿÚ°¼‰ ¸?F c˜c5åHãÕ&’Ù²ãV¼Œì–¡[,OÌkë ‚#3DX-O$Èñ×NIrq‘åˆ{•CZ°Tù*(w-"ÅL.^ÑfZ N€éxD’uÒñ‹”,Uý" ͶÞä‰ù™íÈ>u,RJ ¶ä䊢®üp°˜L½¶Ã©â˜!4î ÍR18Á@)…A‹•Ú—¤Bé´Ä¹ˆ&µžIruÍeïBÉL¨’K¨!p²Cù{ÅKJF‚x ÚN ¤Qn ‡€¿s¸°ÓøEjàŽ6)g’LØK€Äç”;ž¡ ‚?8œI½Â€@5Ê…™k÷@'ºpj$×wt~®ûާ¯t°Â ŽDöIjøñ‰u'3Lt~¥3삵­yë±ñ–Z{r ,Pï!Ç‘w 8(`B;@!TÖP+^â`p„â+Ý‹ãi0_ã¿>²æG5Ϫ–uÇÝQZÔu|" ësBŽA‡DéÄÞg” Þ#Ðíœæ?‚‚} q°‰ÆœÖ‹l: gà _ÎÖÖÏa„ºgF`™‡ßFkcÊê…+&漬1€2ì ¸z `eD8lµêp½ÈE·ÍK1ÀFO¡@1ŒXª+ÚxÌÜ™&=Óá´+‹Z$KÑÜÊ8ÕbµL¬µN;üî¡Z­eg>«Y\Aƒù~¿¸©µ%Äc$P¦2U{ Ì µ“½àÓ$c“¹Ã¦š¡LÕê}vJXº ¯”)Iæpg‘2£E.ÑæsSÄ¿ü×ÿÆk­»:=ì>ýî7g=i$.ðN~ï§¼}ý†á­£(¿ÙÁâÅ}Ò÷0«ühNå;*~ݯk‰û鈯l¯u'smõå¹CÇýöï~)­ðK´—?‹¯{®kØVüÙ ”~É øVœ†ó])ó6x{o·‰ÿ¯Þ×Yíßö¿® ÿz ó¬x)²òÑ_ù¾Sá«7#ýBR›+àÆéý7ñòKùsóx¿Hú?éªï'=—¿ôY?ÈúŒo. ~ïËs£v‹W¶ß¬UôÁ %þŠcæíÍë¦ÄàÝH¾WüöÁÞ©œøÞ ÇÕÛíÕ{åŸâ­~×Ýï×nF_  ?Þ.µµV»&Þ¼ònÁ—ÖÚÆ&.æ\c"nÌ :ðá÷ÿåB)â’y<³‰t‡ÅwS…-F² sp3y™­-q8QIÇy23—혭¨fbz¬f:<–ÃAóñ¡:Ÿ‡ýþóôyß ‰–L×DPyØ/‡#€ùÿ¿-žÏ?/ÇÖ–åa†la¬KΑ»JÄÒà†tŤ åq/eešrMe5""£U©» \€jt¡AB.ƒù#Am¤Ð2ÄÙ@À±@í,Åä¦Ö"ZsÛÕkN û]½Õ`Õ²{br6C)à]XŒÍ¡¼s´}È‹ŠÕä“CCWŽB„î #B¾– ôÞÒã«0´Z¸„ŽXªÀš°dO•È(!Ç\- ¤)$0¹z‚ùB<8vDšž¥ Ìä¬ • HÂqA¸2™ R K™A6+Mz4-IA!‰‰ì/‘ ëdéõ$ ’³h£èSQ€e’¼ëÝî–6gä䜊ºëñÏÐÄÜQm])û„è@j©ÏÆj˜$¸Áŵˆ3[2Ÿ!`Iu\~çÅ7ÌûŽˆYVæ~˜ ¼@'dEO A¤ãóÄ &à …eÞõyK±»Èƨ àêRk>øøVPz°4€žÝ߆hÞ{—•Õ꣇:­¾gq»þ¡$Œ˜“yAçèQ½3×A"l„ͬWt—Á1æB  q¸"øj3Þ-1NÜ¡ÿ\Äû=™ju{’É3[WŠºzíâ\Ü0§—(ÅJ!ÃðЭê´Âãqõ#q„†²ãîq¿|y~þuõƒÝÞYëÔÔ+'гø 0‡O‰6w‹D.`B}f>±V l´42 «N$-‰$á&øDw£qò:ÕÜ׬SõR÷üôh楖2Mþ0å¢Ü1“ËÓ²ûÍ^¿ùÔàåqß¾Ìñ´4i™¦ƒf¬³WoKÁ‚2Á‰Š›³¢ÕÜ;$¤ÎŒM7æÑ¢ÍK¨Å¿üû¿¯S}øüðÿø»óú!ló+ÙŸç ~uÓ¬—w4›Šs~Å¡ù–ðmÕÚ^ýÝV5ÿ©Tæ{¶ü…Ñž¢¿¤{ý²/ë9^mî{JØüs>á½${%«ý¥»;$¿ZLÓøJF??Ñ–®õ\gÿRç Ðù÷|÷%—æ»BöZÁ —–­_b¼üþº·×ý«_¥¼ÝØwoþ¶¢âªÜäî/Þ‰ÄèÆifE]¶>…Ô¾æªÝ…±¼Ÿ=®u²»½ÂÙƒŽwVŒ;oçDÜ9{ÜßÜŸÀÛ׿ 0øþ)´ÀéJÝÛzÀ¬{M÷^!ºe­¹ájDL­>×Ài\ôîú‚®qžÞ#mÆKT’ÖÇÙoïCEÎ-øºóð«;ä³Ä6¤qöÐ[tý¯M¤ÍùFÛí*Æ/¯ŒJj0JÏæm õlzÙFÉÊò3-åâÏËãØmRö;3ßp–Ùlõ/O—߀oÈáx{¿€÷Bv¼U¼ów¸Ö~­iÛ €×}­x“òM^ ^[}ø±Ñó gs˜Ø¬gú^8¾êû•T\Éû›€ÀiØ\Ôå¿1É^l›tqnºWÀ×ßÌPÿSÛfµ“ ùã?ýW#S"A£~~Ò±e¤³RPË´›Z*,†âVŒJ4#`sä®R›!U º¤£¤{¸«Ñ–ãOõqiÐáççƒOûÃÏO¨¬˜öŸ?•­)cþü0U/„ôóýÅJÝ×ýß=>ÿøó|8„f§5JHótGqVó$fÑV2bEš8¼`ž™m¸Ç ‰!Ø„„ÊíYÅT'Ì?s™±Z# ¢˜ ‰).Ê€PPIgj2ø_À¤”lÞÓßÍ“M=C?µ˜ö´pæ…È”›PIBƒsÌTv‚“‹PPÇ>Ä" -!ISWžÖ™B2)w§È%sg6Á ÐË4²™YJ´ž¾¹GZ(ˆ©O=%À%¥DPÝ‚·h9D1BNõ’”*NŠ}ÓÒ€P÷’è¦gÕ×{áßà DÁOT¯aúñ þÅïH·bÙf- ÓyD&w{º›`óÏ‹ïd¹‚ìUW~Õ¾½Kß|²Û+¯~×@Ú ÐŒA£w´W§»§P|M±ÇH±ïB/Ù±5U¿U#²A>zuFÜkŒÄ2.BmFÖ”ü\=Žúr1 ;VjÖz åf _†pß Æ{bþØiqÔîtÑ«ÉðÈäå@¢­ìÿ³Ÿ4dýVêŠ9—cŠð á[[§ ž“LÄñvNó';E-Ànù€«—†.–ÝÏ™L«(hÉ‹‘bšÙQ2c17«4+S­»R'«û(Å?ÑplùyÊY$,‚™VsV˜ýð¬˜ç(~xljµ’^Í}že4çžþÜh°¾HÂh¯%!‡©1•RJ-r‰˜[[šRtû?ýÛ·ûôðÃ?ûÝ É±ƒ†±û‡ïMJù%'7^I<ï8(SA¯îí×I¡½Mêü埾õþõ¿6Ræg|ñ¹Þ>O'oïwç~]ByÇzñ״彪ØÈÿ¼—^ùmroÁ&w›Ÿï9¿è•*Œ¯¯¸M/ûæÍþfbþŸ¼à¥ßzö~λ~¿Z“c_Ô ®B¿Ð¢öëÂ0ßzÎù‹Î¿çR/……Îê?ì´ÊÌmÿ¹úaüí뫾Ê_öí5ôß¾þöõ²Øüzw»@£Ó^7ÒÞýµ·óûöA¼*Ñ_ëÓþ™Íª.wügº´_ÉõÜÿΡ_³À„P¶šýôûߟ~/R‡ŸžÛa‰ÖŒ(£›yqE–â»â­e­µóólS­•Ÿ>ï‹  •J‰¶,AÅTkUÈ’=ì¦OVK‹vøùçFøäq\ =þðÉc6·Œt¢—/-õÇÑ"ëÎbŽ8´¶„—ª™Nîw­/2×1J¥»×Zª‹%ËOž;™ƒ¬“•ºÏ”²;žvY\ˆt ™ËÈ¡îõŠeˆ}]€vm¦ tÒX%Æá‘ YÙ»ô³’ÇS«i®ºº'ÌËŠîI°¿Ùž’ÕÀ³N‘k¤ABvüH +#6$2ÕË.pÿá„\„¦=Ô9Œ½Â9rüÅÕœ3‡Z:d('DCéD£î0œ# à¹@l`7(>%rµ ˆêõ髨×\Æ'×j®“þìi×T¥L‡$>j»r r.$9X›ZÏ‘-­’½m<9lpäšùn†½­$®~ÁqµnÒSì{Äâ”:a\_›$[ðµzkÛé[+œg(ûçhÆzÏ:ûkøFP aeØ oðÕ_„+Jd>×Ëv÷iuWƒžûÏ¡þŸÒŒú4FFd´4Dp*Æ47·d0D#ûtè½ÝsªV+¦òÛÇâESµ]~óà•sÚ¾¢¶ò𾤠¥µ?>çãT&z=RÇiÚY)8ü<—ÀìHKÁ`¦ÌCª-ƒ Ý6ÞŒ‘©uþŠHJŠXæÖ–KS¤û7ÿá?vè?9|~Çük›2ÙáX¶UÖúu6E_ñA¯=Ïw†ì_Tœj~™Rögµ-üf}~ó=¯~ö¯q ø‹F¾|Õ€ý5¤ç׳×…û|óu×÷ü8¹}×GüÜJþÜ¡ó‰ò¾ÄÿÁ‰SCÒÈä†<òKêë&Š÷¼¸—*~I¼"mé¦Wo¨W”+&ÉåÚº–DjC&ùÈŠ¸­¶X«<έ}§èÞfêþ<ºîe¤-3ºIØä¥e‹.#—?z›ú|B9_?_ŽCè\o÷†çüЍ9q‹æt‡ÄB³:ÓëâY7‹º®W—sµÝKi¹\_6´¡r\¥ÓnrÞ¹¥ÜKΗ:qbÎU°±ÛÛ·q½C½hó›»¿ã Ç‹·²¹…méì†F£‘)º1t:—)^ôÑ«?áBðfÊÿÆŒ÷\o m——ÐÉ!€b[`ÌX†.çŒFá­O¯º²rÞ=N“øøÃg˜~ÿ_~š‡:¶l‡9™±´D›&3³¤ÑLJ­ ô¬¾ƒá0 @@øžS­@ÉÜY©¥­­Ôâ=}Td:(÷4'1'(sJžÏGg[bf&…\†×¥"g¿ãþ‹!h…åÍðÚ•ìÓyß…vbßwvVKÏÜÔ9æg˜Ãý<÷0C7iàÉ;ƒöãu…5Ä3ÊßO‰¾nL#åÿ„ûw1&¥‚Ëó0íõ = ¿¢ÙŠ×Àjkܱ<6ܺA‚—!ëR†¥ <€ÙZ6¨# ˆÀŸP&ÄŒRËpòau]Ù5bƒ6ÀAHG¯œà0–à“èç–ÏÀÒ`Cј6þÝf’ðüDH• 5DcOš†4ÿ±K«tj9P)6)¨FBh­;D3ЄdäÆ4‰2Ñd©¡Ôœ’H¢ GE!R˜¦èÐóLpnÌT]íy%†)%¹v* Åž8oD”ݪV–Ý^U ì E–‚¤Eª`!L°Ì(nÝšØÈEÈ„¹›ùA©&§‹²nNpoÜIEjhî\@¥& Žì¨Lñ¤¸“¾³°œÊ)$;{gZáî#[œ½謦ºæþ/¥—.áÁQw :² dØ;ž›ösü˜*ÌQãS–Ï¿ûœÇùù?õ¾mŽýóqtàbc‰#LÐŒ6ki­ËèÊnŒG[`˜W÷iv¸ØöLŒ"˜óè³áØAB6°õIÈWc¡°H‘œ!bˆæ=’—Ý™€+ðÇÑ"T*ºÇuß‹d s° Y4Á׌þ^?„Õo s±ÆÍ¯qŒÓÏ«â>Ž’…¡×Ÿ4yBÑÇn71lEÖgÔ d´n³NĤ¾9¶‚È [ Bìõ › ¢E÷ÿ°4¶R{rò ÕÙ³˜:˜4v…‰Ü¾%¾÷·YFO»ZZ¶§BqÛ=îs>+²ÅÒŠhÇù™`˨ÎÂÌ©>$)UaªûG÷Ê3{Z409‚¥‰He4ä1Z3¶*-‹Ì¥&È¡ ´cOo7šºcÇý€®õ ´¶º‰j$®ž6¸<».œë™wËÔíÆ˜ ‘è.¦]ýÇjãIe x ä¥ fÃûõ$G¦Æ1òÊáp¢L#aß˸ÉÒc N0!–‘¼ß«¬}ØÿÖ´yS>V‘=X²ÜÍŒHÙ"—¶Ì-—–’‘ÿêßýûéq÷ø»pBМºÔ‡ÓJþw_²?•çÿ5š¯Þ¿}ýi…¶¿‚óÅ/kjéoºæß¾þº¾ºÀéô¿þ ð=˜N—ÁûÓRò#™Mˆä6 ôšþ³~\Ùäû^W/âL¤|÷Zñÿ%c[ø ¶` Þ·.z—&³Qg6‰é÷“R_,켓l¿9^ðl0l3°Oi²·“/o[CwR‹¯ÒõÎm¨tÆé„vÙM®s¾·º5¶v"VðÃ’·X¤ “÷rÓ_lÄËzâ•$š5gÜØ+CBW::Ù_vÞTlŸ7ýé*zþ\]¼õµ©‰sq×¾‡+§÷¤KŸïˆ/oX1.1MÛÛ¹ˆŠs›á~~´õ–O³Ãù£Oª;ÃåM_ÞûéË¢Éëþ™t“t³õ×åÇ'ÀÓõ¯,^ïe]]d.h=¼ß‹.ÞÉÕóžD·Y`ï,WÔÂîy,ß œmrôy¢ÙN9§â"mk«Î¸ñ¿/̦W+WvCWÅz›Åå²7¼Øó/0`TÕeÒí=Ý{oÜÔ÷Ž/^åTl©µ<Ïà›õq©²!)Süýú|nó’Ù"2˜™Sõý~fVŒ…fœ ;£[ZKq2V )Ôg1åˆDfÓPJjfæYfD„¡ì'fZ´c,mnÓ¾þx˜@)•:†ª»YU²µ4 ÊÄ‘ZHš[/Éšè…Õèæ¥-îuzøô@+˱µùh ;ž:3A…ÖZ̈„R-M™'QÊμµ\žŸ«W>ìPŒÙ"rY‚©©ø1¢oo'w‘™HdtL–²EÆŠ@ÿCk ÿõÿïêTë~züÝç‹_? o¸˜|2];õ3Iî~ÆÀÕñ£Ò9× ¯ò_ÒÓGIùºçãG)Ãï”T®$’g›ýá‹P kȳaÀÅÖ|Û [üÎöÌòÊ]¤àJN97žÖâ¸ËMïEÎ2WÉC—Á«lŽê/»_tBAuæMÁ׺@Wî/uõ—:öºdè•©ìuJÞÕãoeÛIl‹Ûºy‰cÑ=HÃ} Ö;ÚötWPCÇ;ôì;\½´"Ý/‡;/Ü´ì |ïßx:¹Zjµ;÷Þ$¯E÷›ýjç¡Ûå_÷öÕ÷VÈ÷”^¾v^Ån›R›¨WoÿõW m„ížKÃ{–ß«-Š^ˆ¤Ý:Ü\êºpWwÜ^"•]ªïxoãkÑB]KÕÚP Ô*ñ¯Ò'–Õ €˜ö 08À õÆì†k2}X›¶ΟJ0GÊö<ÓC=‚ŽȤ„L¦€Po–eaK¸£Í3Ÿp'w™)ƒz‘¥ªZ™4̉¥1{±B"rÄT´uÿÕ5ŒÉàÀL,‰dQuh‰$;;J=´¤ $Ùqðƒ2ˆä!‡ÐldÝB › ±«²°Lãx]’"Ø H8)à(Yjd¥§%è³ O‚%3“4îŒøYBFÏO/nžDI%ÍÔK1Ò%*R¶&ÀŒfæÅÚ!À³Ãdh`oüÖäI#RjB%šº?®D¦ÄUµ Ò„a`Û Qƒ¤êS³$ 0“9è8DzQW]— a˜ Ÿxw°÷‘¨Þ‰UÌFXË×€Õ!ÀöÈVeÅc5q¦œ¶u48" Ìá†ãd¨Àj•ÑcN‘Ãå=ØÓFÁœF@±7Dw'ö{öá9ùú#î”ÛÆ”Òûgÿ—üÿý±i¦>«ôËv3€5c¼«@çÿX]ý<ê&kNqÏ_Ò ÄO´žúæ0!Ænr TL°,#ñ¾8¢ž²÷9¬Ü! 3ä>Åuè/Üa‚J0RXRÜ• ‰Å¢%¬VvNwÖÉEºWíÌö5>Õ/ÉGº‰Sr÷0áóNÕíÓd(¹óeZ°d1Ú‰IO@L´]µa³+»ú©î:JÕýa?Ai9"eÐ}nA¡ÒDJ­E—ŒP +`/eÿéáó?ÿíY–¾:öèM™øæ¤ÉÛÃoö^ÂmîŇ’ÚÖíÌI߸M°xyÏídEÂò£)w9×Wª nÕ§?y n\^<6}\J;N·)} _ýÄ—”èSÏ鑹Íí9ÝÇ 5}KyùÝñ¦¿ðµþ½¤Ðܱ ÐÛ­ùæžüM ò®d¹¹Î…VôÊ¿®PߥKýÂãáV&¼<6\œÁøz ž9?oþÔû…â7Ú7`ô[ÉòM€Ïëá“WÎe;JáAóÕ_WJíM¦Ûå||5mbЛ´oô–ÛÀ›ÍrÛ]_·ù+„ΤmÛö6 é*ü}¥ÑßíêW/âFCàû#.ßë­|Ÿù:Øry­Ûü­Àío_ûúÛ×÷ýâ_sõõŸúë%"í¯ôj7Ñèá÷X©Úõë¡þ\´¶ lmñå÷?þü‡ŸÚqQ´r m–âÈý~o´¤Jq¯%‘îD¢¹—9À¶¾?=T³˜—9S@Q7â\øô §M¾3.…̘Ÿ—ùéh¥ì>íp8”4´ÌPkÇ}qµÅwõ7ûšËq>Ê»Skn,‹\–¶ÌÍÐèÑÚ1q,•rVés;ÛѺ-&bj“Ó{–rk Y!²eF¶è2¿C‘ÇÈóF‚jŠ&#âˆv@<Ã/Ȱ6“‘‚:÷£ûp¦óþGÐÎ@p.ÓûšÞ @© ‘±~·¬DìÎÂö‘2?2î‰ê £> …ùÐÐÁ‡ÑnvŸR»OqË÷0¼-H D´0‡#á×zÖ­£Ú*÷¼Àœ ê™Ë(5È€bäeé“LFzo/žèj P:É'à»ÿ Qwo$g@ 5tYLlP/ (€°Ì8¦‚%Q N, ¥€ÀÒ¸Ñz‚@2{[C ,G” 4v<½ –ê˜{$ %pY˜@&ÊPmÄn~*¸`ÙóÔH Eª¤0²…6CÅàýØGuÿP-qŒ•ýNìÅ£Ô†óª˜C\ˆL%°§QZ”è}2Z·Žîž½³Dö¢“$¤) ³dÂÎ ŒÃAé«E8i;·cæÌd˜%¥h D¤©³¬½«I6e7¦S™a€²W› MêwÒ݉!d*€‰0 ’rK‡‘‹ú­÷оWw’xà¨û½–¡²b_e†H659š„„C“£Ú(”é`T(°,°ÚHÀ D; t[†ž„žÑ`8ûyP9»qèd¡¡Ë`†R`…tØ qèPës‹Èª´¹×ÐØ©­`}8‚­ü¶ªp¶FþƤä 0¤* Ck\ƒvk›ž-$s á^ 4ä~€¯ðºÖjåö7îã ŒB]$ÒWË \ Ú#h×%þÓ¹y`…67ýúK¿·uE݇Y1œ“Ñ aÂÌk¤j­¤SŸ&˜ê‡c¡Y)2§vå0¹ÕòYu?yºiWËäé |ŽæSÛ%ÒÊãŽK Ä%r7xýtG¦,ÉB3uá&æLV¯ dY‹¸š0 4©´0u÷FD[Z´ˆy‰Öafešþþ?þ‡ÏÿìwJ"½k’ÿd»¢?Å6ìÖ£õWßþÕl¨u6ˆå_fúOë/>züíë»wǯ’kÿöõ·¯?óe‹kN_"ÿjfªApùíóZ ` €@â)¥üfµ*ØØØn ¼ÉÉ×àÂ7E=¬vöçß>»Ü_)¯å±^=áËž8gþÉ6EÿŽùÅšŸsY¼!=ÜÏ {sÞ\ïô틤鵚âtÓ¼¹:?*‡j«HܶøÕwo_Ãmg¿üœòíaqÛÞh»ûˆº2]½«ZŽx‡¡Ö5ŠF÷;o+7{†Ê\×6ð+^ê{\ÀîØšêNÛqS†z'lþúõ¯³šôB­®+d®@R|ûþ_tÛ}eØÞvÕ7¾õR¥*tßw-Õ\Kz¡Ò»«ãîÞ׋­ùV¯Öš3¥;ó_|ê‹Á}kUÍ»½ç¢óK÷«Ù×ÙBRn•§i~›!r.ú~»jrÓ.¼*\|Û͸ó±xã€4ÚP§ê¢·/ò\<.ÖÒùR§ÖNiž—ãq~úãOO?~aDD¦RBq/ît33zÙíw U×=›•îNã~·GËåé©~ú<=îžæö8•Œ<üø¥<î‹G¶/ÿø‡Ç®< °º/òb‰©D ʵÿ´kÏ‹˜F¶%žžŸw÷› ›»Ís(#Gd¶bV-Ì,.µEñ¥-ÇiJKE~1ŠDºQÂH*$t Jº ˜JîÕ©Œ§åø°{˜ÜAî§=¬–âî6MEÅs_ô©Z$Æ®.kÞ¨”)=7íØT¬0—Ëê œ%‘lÀ”æ¤[ºP½–Jµe‰¶fÄÃI)[Ãáâ²,1/Ñ"#2ÓH/¥ìê¿ùÿññw¿Q+„3)u ½|ž¼Þ`H¸ªÝxžfë76az±îàEÏNøåàÛMà‰sμ͑ĻÝ>ß) l9$[,É]€o«¹|ȼ¯yZòŠ]yÙnºM (ã·6•7õØë —×ùå|»3~ä`wÙ÷ÖìW:¼”·Lä– õ2ºê½ÚÜ]ªÆë·÷¾óã[oníÒï;¾Ýé{?¢kþ¤ ½z'¯gŽ¿òï/LàUr ¿ª3\^üýÇÛ÷I‡—$­ç»;?úU"ì[cåÛ(ÈÍ÷ÿ‹†Î¿Â"~©e®ªÇ®V«Öæ»ü–?Únwª¯–’÷àwîÞù €m@¸-¿³ƒ½d†|ñÑCêÚþºny’ÊFÛ¸EN9}dö¼m½aCtÔÖ+oì){seÝk4mµÝK(ûøá†—€vÝSXOA‘á,¸‘ò.’H®ë‘.lüXC?kC\flE{}d^ãKZî¹Fò¥_¸fmh×›Ké¬_jÃÂãíù…i”×÷uVáy©NŠçªÑÛ²ÚÍ­Ý Ø^+ȽÛ:zAä¾Àáv(Ÿocœ ÄÁÃfÃx@Ú– õIfP2¯´ÙõO.£¼ šàTŠ‹,Ýï‹w{’6œ%žõÎWö™¸œ#pÕo7÷}!Vë®ÙÃÕK¢ÞØ¢ñ¤¿zwÑˆó…µ Ëév÷rµ/¶Gÿ/·¸ ;=>_Yž·«ÂxÉ/Uï®Dãë(æUGØ '‰ëþB¼šu~%ÚŒa^lXÏŠùæ´wàÃf*¯vH÷€?çxê˜x;|¹®(«t¿n¹×FTr1º ¦‰[ŽÐ¥O»Pá¿™™™Çãrœçç?ütüòK#`nÕk’f´âpÊ|ªU +“[ì)GÎbz¬ÖlžeÚÅó¼D‹Ã¡´VŸbÉôýTŠí÷¦–r^ÚaI4g“rɈfµÄóÒæ™H™v;k϶/JEäî¡¶V¼8Q¢-ŠP,íùY1çòÅq°òìl ’3(%HMn éê¶‚ gú2‡ÃUš¹1æ¦\:µ¢5 E[ ¹[ÎJhG «Ï ˆ•QckÚ~§Ü :v cÍîï>º9ì4XørÍŸí|ð:¨;#¿Xèyèµÿ V@WÞÆ¡l×Òùî‡Ës ’8bÕP»AOøíV­uZMw äã#FìÁÆÍ° âÓ¨ O ôê53׿- @cö$_¬×oP' Y§´ƒ9üN™XžVƒ„hƒŠn–È6åË‚ê`"Žüyæo3‰yá$(==ŸÈ†/$»¸hÙÌ_,Šö`¢™ KCÍU FeŽˆª™R4b²^¡ Ì [C {S²/m¿Ûï¦) ¦ frrªáfµ ½À=¤=8ò·?à7»ens oinø4©8¤2•Ø•ºg`d„™Âe\ÀêÆÅ¡°H7Sf,Ê–sd­µºR¡ÌԒǶı´^çŽֺ¯ÿãÿü?¯¨–ÁãÙÀ y>“Ýð‘y•ároKD\ç+ñœ!F^š‡éf»¼n^W£^Ô¡®¶TºÃèG òm²Ê]HãWHB·‚ÎF®åÍó¾×‡àöwO‰/m]¯¼^RâîR^¢¦\´‡´MµÚœ7.L ÞðDâe1Á_ÚŒ^~#¼ƒaÕÅöV—hvÝë7ï|߯âàu¸VÀÏФwis¯¼µ»ÊÝ{¨,ï3×hÖÍͬÃ]Wíÿ©wlÝx©~¼žDöÑVz)æ‡ !ïdŽ¿)_½£µ‘ýÛóχçŸ~VK;v Ô’̦}m)7¸s?MË|Ü•2¡ÁR R­“¤"¦JD›ìðt,m®…ûÏËÏϹ´77oPžÛKD©%`¾«Ø›'Òm!mþ§ÿjµú4l°2ǧy÷0•bPBA-Çážç§ŸrùYí¹N®ÌII!(dJ:½8i’Â)"²µÜk!z6fkDS¦!!‚‰XrUÆÛr©ñ=µ?b0»sU¸(Ëð— ¿<«3=+_> *{J{Àa¦ XÁI¸¡ìÐÚpîíÒX—່Sv°Ìƒ­1x#B?W3«ð‚îmÛÝw{ÜB«Iéx–5BÁ6‚•a{‰@Ù!° pgyw}+H½Óù ˜™Õ)[sW¦"e>&ë^ Ì€1ŽýgpÁñ C`E V;åXƽµe´êäð.?<æ"ÊPUR0³:0o<6¢Önd*5N$‹ZCç¥{$hš¤Ä¼XÄšC-"U ” !gCJbæ…’| iÔîðL”@ò˜h@¡lÐÿÕ¥í=¬Aßô8’°À¿Sì,ä³t”œ#H°ØÑë”|5C%äÃ!õ·p¬•ÆïwÃÉY¢ÜÌ›91¢<îæÀ¢DB4ÐÊL7K1A îZ-:#iV †cìøÖÒ9UäQŠu²[½¢Ñ©6;À#l–F´É fõâyFÙ¡8æa({MnˆÆRÕiWÑà6^¨u§ óÓ(—é@ùóTÍ1LúlœÇAñr‡ m†ùjšÝsí}L·¤ƒ„9 8‘ÁtŠ`HîCû>þœ>e™püñXJ{ÕÆ˜^©ÁV—ÝNñjÓðG[[¬Á (£ˆ‡ÛÜ™þW[eßÄR’8gôh”"Ñ`kH6»”:pd=—9<9ÔßNÏñ^ó>tüžÔ?D@Yžò@IXŸ>¨sÞ½„®ÂòÑìÛrM­Ì ¡V³Ä’Ùs¶Zê»–:dàÆñéqI-cªY8YÝ ;z>X>< éyŽÝ±Õ%űØó\ªy¯ƒØWÑzx´¼[a‚H±Ê’JÖFNn‘Jº j3Oæeé½Wh‘Ñ¢--æÔœVKÝO¿ùôoÿ‡ÿ±¯)'gSuÊï±ÕÙ&øüy Oî$³ÿ:’ÇUÀeîË_4æU"ø‡·è·g¡ïx0º¨øµÝ› ðŸù‹ÿ6·þÍÎ'ï•ìSÞ÷žõô«¼’Nþß tþý±“_ÿ½)_|«O9•C½ºøêÀ´X¿? —l¿j´¾¾öëÚ’÷}‚Ïk¨ž»ßzq²(úºÊ…k‰®?ö£)¿RÀÛKõ=æO~|÷þÏ&¯ !Þ’‘¿Â9ê"â½%•ܼÔS`íú-_e‘ë[4ö»ß ï$Ÿop-§ûºðÀå Ÿó••¦×¼š b·f²—Q{½ßïwoè#3˜ô¿î‘䮩ï½ubà‡^ƒîÔ_ð¢®òuw÷·šä=e—ç<ŽUTíÙ—zÁw魪೵ú+)yYÑÀÒ¯M‡ã«Ó&×Ê1]ìÔ»þŸ+ÓDDPJ)µ ]W+DqÛ“šÂ~r# (†Ÿ¾cÑÃç=½[N†e^²È8.Ü×ã_æ¦ý®âaχå¸|ùãO¶Ÿ>UkÑZ =‡y¶éÓÎéÞälÇÏ(;æQæ$±ß;ÌÛqVÌe*ÓTk53D›Û*¬ “ÖÄý~”]K¥e ˜gQVÈT}713æå¤â)€ Ѱü4‚CüjȆh A˨™ˆ^Q+r†FD¢%ÂPLÇO3•( ¥¨Š ¸IG‰Ö8ÎD0-@$%, «kªŠ†ãÑL“Ì5IÉN|§…½W-þ€ÑA‰Ý¶T¹«¨ìÞLi1TÀ9‚%‹@ˆ¨Ò5äPÍ1{\nðä1G”^ôw8E0±çpHNB …HRP—_“’°3«èHY‡ ™&r¡@NÃ¥ÕZÔzœ€tÁ©-’;“He*9òzEfM"ͬ([(EFrQB"XÜ™‘kd27µK I)#µËÖÉÓ•S¢ô(XONœ BÃn2y8bÙˆå!fš À•h$hJµb™ ÕVÈ G`,¼±âøýì>ÝÍ*¨¡w÷Ú,, Ãµ"¿ ^+´jD×ál*H¨WüDƒ 4–rƒ¤ß#<Ý]c¨þËþx]Ã\ ÖÛ=E¸Úƒ+:jÀs†g¶­«ÔZÖ~ìP Aø:YeÂ˨„È‚ÌR@~^©ºËÅpH^§Á¾žvËñ:íuBÝ<ÀÑ]`P a‰Ë͆­÷Qx‘˘Tk ²YÍ]˜Çc‚t‚lÐÃçý'¯tßï&Ÿ¦g„?+Uá‘?Lþø[úÏónòHѸƒéÓ>„Ýn‰äÜðiJ:hqڶΰI*4ÊHÁÍŠ±µ0'é1G:Y IGd´v8.hË- X)^KÝÕÝç‡û?ü_nÊš%Ú–Qðm•MQm߬”гñ0ð.ðáeiú»„DÞÔ`¯4Kòu±æ{h./9g¾,{òÛÉï»Gçð؛ʋü×FEÿwËÖõmÓòêÎ˸Nýւ׫ýŠoÖm|è­ñWñ—ØÚ“â¼8|´n†7uìú&÷våï}Ë!ùA‚'xý¢‡ý¨€uC¦z×é{3H…{Þo~Ö[>رûW…ΟW4¾þ¡·cú6Öo?‰½Î.~tûŒÛy2ÄÝz‘W`GwßȦÂåÜã_ªk)8™-lpÇ+ãR¥#îÁçïà@zà6±â,.ë¤—Öø ŒÍe.ëzѵ’ùî·:ãœ7snJ^ÓÄî@Û…«â”ÍwnpAg2Št­¼S¯±MÐàhèê1·é¥7œ âD}qx_Ä]Ÿ·ï5tÊe_J®ØìSÝô$›$Á‰b0òØ´Õ°›P+2!C$2Q|¨ð'z„¥Á«ŒÈV°3„€”U¸!mA6¦PVü=wˆ`­šg¶&s”:¢1™èú‘çU8@X ¹Œñ•Ë‚@§ É‘°?(@ ’îð¢nî=X: ̇›´Ck« šð N­…5 ²—ž¡q“'’Þ­›'®µ¹"0’ë…na ü„Þ²µšçd½{ÒܳÆüÐMzi‘È»Çû°µU£Ï†ÖàÓÊCë1°Í"m¾VZô8X`Èê¹ÖøZµ–ã &X‚kOèqÁe fþ¼ÑMÓ¸{ÜÙTYK©u7M³Ù¼sЧݮQMóÂE-ÝŽ­¹Çä"Š»w0ÔŒyÎ–é¥ØÞšyˆ9 )’}Íd:E¤"¨d „FtjØ‚æfž+Š£µ¥©- Z¶yÉ^½îwÿÓÿí¹<’áT•qq´Xùù×.w:å+wL›x)[l6MÛt^dpå‰xïà¸ÕJVtЭºÂ×%ÎÍ“éÝ:é5 â³ðØ/3Xî"¯èÞ)³^Þð–%{'Ýø[ËF7âÄ“µ¶]q,·¹#Ûˆx×tîškq¯(àòê'Åž¯ÌéjWù§ßN|«åoÉ´i‡w`a^ýô—þüÆV Èý_áù¨p’ênT¹ –Ò•þ¾7ïYÍ] +§q§×¨Øo¨Æ[õÿ ˆt s«!¾ËzÓ¹mË<Û`Ö^“ª¤7´ý{¸›~–Ó ­mæe@MŸÒW1Z·ô=õŽú¯Kg»+DÏ{r·ÿê¡óÜX±¾$q\ ÷'¥W–žÛÉç6‚9$b;÷žð/uä«—øùä}?y_O~9’ôúTðJ àÎç¾èøó½@ ×}]~úkøCýF*õ’àþ=²¾Ñ¯ü©+¨ø®ø+=ÔeàêVŠ?»nñ[¶Öûf–‹ €‹¾xÇ-—ïÎ5ùNáUûåo°sÿÓõÈ÷„âßWð}ï÷n"_˜Uïz¸½¹"^Ñüû?¼±CzÍæ÷]å`¼n¥ý7§sû9<|S ¶,mYÚÓ?ùñ´Œ„àneª,=)©ˆ“Yj>>?=>¸ÙÜb™—i¿/µÑžžj)Ÿè5#v;Fèx¬{îk|yòÿðOÍÜÕ–¨žó\~ØOî¾Û-DûýfdD„К œváÊi¿/;–R2­e;(ž‹±´å°Ÿ_ž3´dCp—0C­n0EöˆkÊ•{¶»LZ3è}DfÞ€9V/ߘ¡y`g2Ô-g1ƒ€¸&¹k…~œè7#‰u(z«ÆÝ àHÀ:c§‹z±–f8"  8"_)ÞÙý¥ %Ã3=>2²ãKE,ˆeø /Í•æ1, nˆ8KGÝ´ Lƒk! ^£{ [… ‹†ƒ(/ñÏ•24:n"d¢Tâpèm ˜ jF´ŒR ‘fƒ€„žç›ð®Er?º•B'˜Áwƒ‹2’î ¬À» <ì®9‹eà± päŒe¡Ž„avûœg*@`*@c$p¤¨ @ˆ M2ˆ„OªUË̶po ˆ'»Ž™ ÕÌ»ºM†ThŽžê«4ab%Ÿ¥ ŠuGd¸ S¡°& “ôêX2sE©»Yu(64ã2¬tád’]œ HÄ ik¢°ÄFKІEYz·2‰ZgDd4üc;ïÞi½ó$™RâÃd~iª0/Ù‰î,†bK¡E§¹’§—=̜ה#S²Õ@¢õr<8JE©#ÁžaŸ€5 Ôm'(¶J¤=¶Öà™:'gò“‰È9`™`·="±‡÷oøø§ÜÖ_Lc* P{8ÄÑLË!ûô8Eñƒ±+Ó´|¬»ŠJ+Sq«´9ñðÛÏ)êËa™ìin©å7»ÑÔ×AwA¬ˆE‘òÉB îÝÜ…ˆVhÖ£µat¶yi îwS¥Ii©%22¢)Z›MKd«^vÿÓÿõ¹Þ-¬3õ‹™bßôtpµaºÍy%ç‡|ïnè+ä‰{ÒÉwÌ™Þ&r~£ù“ƒƒîVüÚÉW¿‹ z Âú;ºÌ Õ·}›ß©€/gr]V¼&Þ½ûì©w€^´·cíuMÿ{ëùë|Ðeæ¸Þ˜ñ¶øu4èûñáþQŸ‰¿Zèüý%ìƒáßc€_­¹¾nyýN«éWG îQH×™ÚýÏå=ýãkÕæÇ.ÿø—òurMxSÆ»éàzY“úe½ã/›8Ú‰÷JôžÎÆsrñ}X¿Mñ[=(~iµÕGïDWu[wØ—¾À9WË|¤QïÎô×…_Õ¿Â>™—ÿýéÇá9BþË{Ë]ÛMöÛ+Q˜ÎÉ7€×öI›t‚_ºI:‘Ç©“_užÒ+ûo£õó ÙÅj :üôÔŽ-mn_þéK‹Ì$)d­…n–¶˜Ü s«eRÓ|XxlŸ~ûÃôXÇ£ŸŸŸÿð?~zØÿð»ß<}yúé¿üÎiWö¿}üô›OÇŸžøi?YÝW?J?9üþ˼›ööi祅8ÿ_š•H›Ûd2ƒÓ›BZ–CfiÅÍ,[;8b‘æÃóS<t8:Z´¬TtcX dI™I³à¼ˆI§1ÑÔõ«¦Pñ„“Èû'8QÇýÇ÷Ï•LÝéæÈNìY=-û‚[W¼uúp aSÏ? s¹ ìF*)Bk.m'ž—9FŽOÎ ^Fw79]]%wdC̰Š2DÎÎïØŸ.&ÖŠSU^—üºb(ʯʅùÙ ýt³b8¢Ð…VçƒZ F¯žÊŒDÈké˜ôÇR§2Ù|ŒÔ(AàšŒsX°.m倷ñ°HÀA +#˜Ñh¹À©¹af<ZLµ¨¹ba¬'P'—#1›ÕTQ BÐÂè§+Ì )š,Õµ ®"µ‚]ꆽ&Ž2q²sU 2¢…žrZS-D#œœ…8F œÌ¬Wë@H ŽZttà=Ø(†ÐŒÔÈ©·>8ô,rJhÔ) 0 €!M6*8äÞ°sf2(#'ã˜𙤠#˜¦¨” ´4š”0¦1Zšhn™@fJ†è5L¦ñ·ªNv›>¡>ÀÊÀï°À Ã*…÷¿z9,úßÙû·.I’ì:ÜûQ5sÈÊ*½È! $ö[Ïüÿ1kÞzÖpqfØM¨ªÌŒp7S9{DDMíæ—ÈȬ«#+éán¦¦***²Ï>߯ä=¨¶T,Áy¨¨ Ž¥'œŠÜ~h­hiß&"÷ nl£æ ®~‡±G¸õDæ6滉žýØz/û¢:Â(Âüqž¿ý_ÊRãp,KYÕfXBT°Ýªë‡aÕ^èfÿ‚(÷öÖ\[*’w¨NSÉ»Ý>FˆwjY…h9½£)¡ƒÿ§Û訂G¿ëÛ6¬F¯_¶;·E‚«Õž½Gª «¸X´>ÞÆ>Z—qí4v˜ŒÁ4fª1?ôÅÚ'«Æ.C Hpäi­b>ÍÓÞ¦0ø4ÿò—ßZòp—qçyNžâÛ_$¢H³’äîɉÝôlFh>VÑ–‚ÓΫ¥"dI2·¤èÉîmø°õ µ 8Di6«€¢Š<äj‚ÄRp8f•تÿÿá¿üÃÇ¿úÕ8E§vMúaycAû5¬:º»B}“z_Î{«lôeÈ”ë_ýâ…ÖõrNz›qƒQü‡#¬Œ?ú¥î©ñ|©•øË„åŸPÀzaI¿î`.;îìZÞ^1º¸oÚ“ŠÀ{OéýOôc ¶ô‹æ›‹?¼pf¾žvù ü{èë×¶¯E¯L——dž¯™ùñ'í:–•ýî_Z ”‘ô¢ƒgdQ_ÞYwb–ßt!^øÉ›s}Ë_çB¿0ò¥mz¼V*ÜZЩ°15óŒ>˜%:tÎ 7¼u&Ø1ˆkepÓÛvÅß>*Hœ[™·ë–Óêîâ¬ñzEÁëgÄ:,¯³Îy"ìF«ízrŽcho(ý›&máB'ÔϺ½Å6:©VZ2š~W3ÕÈýº¯ûñâʈÛ<…ö‰6cW¸zoܱW]£›ÖÇMã•^2F@#¯Žxø8h™TóßR'KÔÖD¼e\ߘ¹°Ž÷ÍËph‡—'S/=ǹÖ8VIÛµo)2Üwnh,—@–Íg<ëóÙÂ9Ñü´+cjey Wõm†Ç°GN·'øÔËÞŠºNÙr;ú òNa`ÓuÙmªm”k}Ƥ{‚Ýôo½ ŽoñîLµ:ñWš¹6þ_^úõzR\©hk'èi^ÓËËr*±_ôà×ù:è,áí¬hs#†7ˆY7[Äf½¸ùÎéÊqÃÓyé~ .ç®hÓLBžIÿ¸×È9Ú÷\˜¨\Ði$ž>Ñ©ÎAnïµ>ߌro›p4òm~ÚA¾ûüùÓç|\¢ÔRÊáé9Zä [JÉS‚3¥$À'ƒû䞌F>}úœ—üÍÇ)ž>}òäùK|û«_ÌsªQž¾ÿôôô)%Kþ¸üð)óá‡Ï‰Àqñ¨!äŠ4g©åó÷Ï9ȧÿŸè¨)àKSu­–ã1ŠJž'sÎt7…ëñ˜—¬r8~~¶zD)¹Öh`’ 5(•ŲPˆ¤¢‚N*!Dt9)Á¦(™ŽZŠ’£f–£ê3ŽÇ¡pÕ~e¢B&hê†w[‘K׳ª~6 -6³éï°î A†XZê,Š` =]“-ër‡” @-ý»191ý6ã¨Ó„"C¥s{¢Â'ÐPó˜¼÷Ä२½#!|•1ðèÃAÔÚëôîØ…£t·7’aiù¨K ùM†T+ÀD—‘p(äB(Ga,ˆÚèMiŠ(]Ÿ]ÛVj…*#aXÃ+ÔŠZºê:%µ,ÉÀÅ„’a [鑬G*3Uø„€jai¢©ÜÉšÁ× VóU*6NL{ÒÏã¶Ì¦Òòl2µO¶Xx`ï={7(ÀS(w|f(Üz'ÌÛà € P!‚UÝþÐ #Ø ?©?¸Žcd­Žc*ÑÓƒ‡ _%ñ@{F„ ‰Ü™r’©Å†€&5©±w&ÃìY! Ö ¦`\p²J„r¥ö8$ÆRžU0D¢hËMÇî¦]«^‚¼%¦ö±×Tø9Á'xœû}×",à.3ÔB$JALI$j¨ „lWa˜ÆmB»æY¡èÈ,ÆH¿ˆŽÿŠH0ˆ==ø·…ì²¶b^‰Žâ1çá»òçC,µ.5µlï¡»²^êkó½ òOóàw¨W›[4êmÎIpìþæÜwx“ï}SªT›½úÜ#™Þß½ýÀÊåV{ Ä´I>Ç€¡ •(#©¸F¯¶²bDoj5‰VŒlÓšÐ#¾åh½"QaL=Q Ïu Ê})k’ù@œÁàD)*AÉ>>N?<i÷v¦”vSb:VÄÃ7Æ}Q$ú‡]82ØÚr­nniòHžÍ@³4)J+­ !Ps¡ä¤¨RƒNÂ2@IQk0+¥ÐaRH9—’³JÔ%ŸÔÿø/ßüÕ/ÇóC漂CÞu«l«º¹Ðçí—âk2ö‰“*nל·<Ë UlaÍ|A•Þ¶T|Kë$ß[|¡oÞžœ/wy U¤LÌ+Iû‰SÈN Ý3=ë&SâUëÍ|quWžÅÍ×<ûæfÛpK¥å¹~¹~ØMŠÀºå&銧¹èe;¯@ž}¯ò’Þ¤«¥÷K ‘įkî Îíÿ:c©r%’_‹Yï’ª/øGºÝ7÷ªpÃ?¾Ý¾iìËoÓÞ×_<¯Oœù¯Æ¯ôaöÒÎ å‚NsMÿ¿8žk‚Í çí^–n±õÏœe¼©âs£AŸ•¾¸Qˆx¾sÛgÞ½Kövè+…=ý˜Ñ³’ÙÍèÎU}Ó3•§ €Ë¸€&[¼ÌI¼Ãº=ßAò~²<¯k©Ûâ×:܇k;N9ƒùKæ©~¨äçß|÷üÿ‡“‡Ã3C-÷s6“‘dš'óö'+KFÁÇ PH“[%Œq8”y?Ïó.r<ÿð âþþÖŠÓÃô«ÃÓaž“šeÿ¸,Qm¿3óÝGùñÈ9MÉAVKñÝÿKŽZJ­ -¦Ø³š*²Î`dÊ<5[2æC.K>~>jYâ¸,KQ­f"±TxãÕ4'iE­}ýÕR€)E%‘AWh4ˆ q*86TH&Beöÿ¯1¼íáˆî=ïí†Én|:¦¡.G"—¬`Áô¥K`B]1ý– Â'`Èß-¹¹CEÐYØÆÞÊè?ÐÐ%íF턜ð QížÐÇ-NScÞg— Èúϯ‹€ö)‚Òäò\AÇ<ÐPíEn7“P–Â9ù<Õz(ÇEYZë%4¨éøµ#þ×·[ã‚§ƒhåô&57äŠÃ» µ Wæ>ÅêpäógîÀ) Ò¨ …ò„(…Q “‰€‰’ÜAhɨ•©­ß‹l-óÖõÍkO¶òS ¥‰û™ Å1dA]J¿Ï†Æ!„#àæB1U˜ ¬¡ ˜ƒ¢‘E²VJHîaFAÊRÀB2Ç RjA¾!4*„dšÁ*Ä.ÔL>€ÁÖaÐæ“˜ÈJ`2ÌÆ ‘t©šÉÈ$ÛA¤ÂQBÕj‹àNÅÔìþ¦à”ÛÑÀÔ±õ2”Š2J±®lÂü€iî-iê²Q:½ªÕíÄšÁtª QÖ¦Ž%¸ƒÜEÀ»ôŠè‚}6ÐP#· Pj‡t±1v2¢ôÚ©Ú­ó¦ƒnÆÚZv:¼+z!Á ÓÔÿ CÍøái—£HPû í>7YÖÑù!£ €µòÃÖƒ?G8>KËXhý>šJÖ§gï„â ׭ѳƯÕ)Y¯‰"NZžVS@­°4Â9¬µù@ Š#Þ­ÒP:¯¬ÛUl³N¡Á¨€!9Š€:~]'|P®aHLî>žlç5qò‡‡‡GÛÏ–Òô/þÅœc—Ì’…`ÇŸË\C»©B‡Ó~~HÜ”œYJP´êƒ^ÉDÉØ þ ¼Äèm™‘æ5—P¬E#ç¨T)’J©Ë¡Ô\j­þú?ü‡ýÇÇõ«lx„u…èEØåÆ*pÇûjkåFc¹úéµ€|Íÿ–UÞ[äÑwoÈx·´ð®WyoÀ…÷B×¾OZÿÒkõö¥ø;•&Þ[Gëæp]Ã+ Û;¿;c™·ÞýËèù?¦z´Þ/÷¬Á_ÜðµÕ"Þ¼ãð„—Â#_>B½¼ûâ€ä{éKúð6¶ø;g$Þ'ö¿mË}-ͽ¹W1³÷|Ü/‡TEäÔ3tþv¹ð•«|Ý¢ñ¶¦ Ý å~cyæ÷X5åý}©Xxù•Þ!M½ÏX0\Z'ï<Êæ+œü·”Äî‰è£‚þ{w"¿Àým§äüéû%—àëž¾Ÿ$Ü@?ö·_89|#Qý}ï9ºtV8[ÈómÏý/Zï¿\eÞšóÖl~µÈ†·~Â÷vd5ÖtÜ‹aÅ¿ÆëæŽwòNàëßt—Cù¥•õ)û¢[cT¤ucØRž~xZžÿô?ÿyy>˜d)ÙÌižèµÂifL>¹ €Ùò|˜ |˜\hªÁP ªÆ<§ª(¹¤Ýdž>úŒ¢òÓ“»eE~z²œŸŠûÃÄg=|Ü¡òøý³ûî/¹|zòZËoÿwß)0hu!HÕºdA¤E¥9CP&I7f¢Qp(ÑtYDJªÍŠ›º7?2ľ¨Ç†Úï Í ¡Æ1(ϰ„Dé(m5ÜQçy(0ÎPBñ殺v¼ȧCKPB] :B/ Lž¢–Ϊnn÷yî®X œºfÚ‚%Xê@‚hX}["¨AêUŠfI`Sá„u4G3J7ϯ7€£–SÀæ©m+Ogc¼5kíÔ«ó» Y/Xê1žQûˆõ! äÃRÈH,ÇC¶Ô›ß¦î<|V9`zèhõ®íwsËz]WʼnùØ]ÌÞ~Ä¡‡»¶h„šy0ÐÀR±J`XY + Â)©V”ÊÉÔøB)©†²¨¢caÈ©ªTT" 6 ¹q'ÉMzÌéÆR À<’ $’@T…3 ‚a¦hØ~{W€Îi¦x°FÈÜH¸:&1Õ¨3 ÀéУ ® Ü ™)w¹5öz+„d¬dQmÓ› !=AdÇÊå DµdÖV媘K‘ $Z­T7QaæLŠ,Ô”±nn4-u‰{LÖ Ÿ`3Ü1M0Þ€+ƯX×¾1è‘Õ4¨äðŽÊQd–FDe ÔfØ BªAQ>úNÌ{`u««Á †÷A¯:t•?N€µË‡èøš^Hhnú€Jôkü~Ë7Ùºv²#¸G©ý¯ÌPŒ°AÔ€û˜+ƪŲ̀Ƴh²‘[Тtm°ƒÔbº½KóýÎâ˜mÐuüXÓÄÐ’Á^¼¡oóý¨¿·72(`ˆ¤‘‡ j'z)zK›1 蔀~`Ô¶ó¨}žAî ësÎ Ñ^ßà½\As>îöÕEŸ‘æÇ¦‡íçÿú_[Q²ºì]9žÉÇ@ åÝ\>ìÒÓ²sÖÉ—Y™&Y­È%䔲°*Ðh%‰ )„ZiŠ6ãû\k–Bb ä¼Ô\óRKF ýw·ÿððÍ_ýªÿ7ÿÓ^i›êþ¦Å“^[Q{Tt.Ð_hy£Ä w.à6]ªzU>ºüî:ÀWD®DœQ#ç™ü†w~Y+üy(ú?e`Â{vÿgñš?b[ð2;â§S¾8¾âwp¶ïÖ'Þ7êøVû'W!ö÷F÷äNñ»«îÄ“œŸŸ{¹,üº™ÄÐùŠ—¼)¼ÖQ›çÁ—®{¾ÖuY?ë{/ýup]œ{aì½¹³d+j]fülÚct­°5ü§¤³´1¶ëÔ“#´,î+ãûæJKDÎÓ¯`%iƒ¶¹¥ÍòŒÅq]š»ñXãõŒz–àÚ¥[8,A7U´­_:ïè;ï/h‰«¶Ç¶ÌÚäÇÜ­´æŽäê¾k»àæÝwoPu‡ ¾*À^UœnñJÖoÖÞ¥·#èÏ3iÏ/Üš²°¹óO?N;V. ._q¥²\,½û??ÂÓ"JØ@©®s‚á®ê´YàÅE¹— ­—ž„ç6Wçù"à|Û¬í>»¸—’æÇÝ.Íé›Pês”ãçƒÈrÌ¿ØÏËós­¡Ãò”óþ›‡ÝÃT–êÓäOÿíÿq¨Ê½›ÂSˆÁ…KUXC[ÖŠ(064TC’TU0 Ý{Û²:wó†‡ÐŒš‚Úß0ÁÌ`ÈŸ›~Ö¥´†žh:eƒÞØ àƒÍHDµ)p r!@hùª4¤]W¦èÁlêÚz­4¡Ä&ë1T˜†dF(K'i¬}Z§~×#Ø,É-u‚jgû˜w|v‹Nu¢dШ©§Ã1ré¡=þEŽy.i±~´@¨Å‚O'AgÉaÑ@"J;ÀXBiÈïw :Ö£ÑØ[ð2Ghh­(¾2uNzk¨XÚµsäŠ×Ó‘sâç¬ç‚d¢ð ´ š˜k7•Ь¹ô%“„vıð9£N’!g”à.:Ð<£uÎô„OÈЃ± -"‰::­‘ú-…Ú‰[Th i ©#Fœ/Âx¨±3£… ¨º¢=»˜H# ÂPÕ(@f+Q'Á`…¨d¢–3VÁŒ èRÈ’× 6ƒNÌb58a2…!S x°¾rpUÔCš²'J䉂ՈZBmQp$<_® ¦=Rêt©î@7ˆ¨($ƒ;jÀ–ze+M½´ÐêU¦ÞRÐnBT¸f ¹$ÈâÀÍ·;¨,`BÚõPߎ¬PaéTˆâH^W²ßGØxˆ[ì‹ÑÐ qÄ€ 6,ö@9Ü&” e¨öz@÷û—žÿ‘ˆh@«MÂF$5‘F_E› ZŽnë+jñ­Bµ‚|$÷6|°zêXŽ9,€ü ¢´©À¬×,™zÚykêÛ'×¾Õ-Æ·¬é4]k¬'5f¡öçVð[³Áa€·õ” „(Гe«€˜÷?|œvûô8?îöÿò_Jõžkݹï'/µN¦ÝÎJMϹ‚±ŸjJ‘:æ¥a‹âUÔÑ^С+-9fXêbåó3Pá{XE ìœ*˜€\‘ “ 9P ©õXX/µ„¸J2Q´HÉq¬È*±7›€Š˜ 3DV+›Á(T IFKB‘Œ8J MP šñ¨B¢ÁƒP¤‰>›•1´y°f4é0bÈ ¶thšUrBP óæÚ§íÉ$a'K‡f˜H@IÌz•p 2d©ZM°"YÐ[UœGzx¥*£‰‘e* 1jmBƒjU^T²Öç§…º8®G~X`Ÿ{O‰9j±îX}Öë×· M° žz®µ„'EŠqd–èH´”UºÃ©ÚæGJR 'Wºi†M°"uAl2w>ÝŒÜDŒ;Ö¦i½5¹‚£O5 O^¦6þÝz¨õ*…cˆÝ–` $¼7ì æ~ÐH;­U¤”^rXW‚V;kh¥µ¶o“†÷¦f£::D 2ØCýSBØ Šn0!Ð;J„ÄÔ£Ö„&hí ª½Mª5ôô‚õ‰ç§uVCÕ2‚ÇǹZ:Ú¼D€(Gh‚€ãÉá{›m*”±T´Sg6y¦ƒ“vS™œ;KÉþÍ_óçR­ÀÍ>kÄaö´Kž%ñXj LŸóᑚ¹KÊ¡"kå¥ÖgŠhOÞÚ@g@©•$`”…D¡ÔŒöäÊu9kº”PôÉÿö¿ü¯ÿò—Ûhü[ÜTÉÖ¥×…Ôª5­‹oêJ=+3è”?¹ÙiÍ)º4ÝX½5ñŽžr™ùõ’¸óN/ãOf#}YÛÝ"à¯õœ{¼Ð[ž“ä!áFÙ×ÿz[À ë´è5;Ø!@7¼Œ¯ôµÜ#ºnj)7E´wïJÞª|ÜVðñ»ýâõøjÓt%öý˜€{ö5 é+úô¿¸àå‚Äöæ½J¹xõ•ïž á*OàÞðïí»ÿyWyæä׺XŒÐyà¼ஈtÕ€;^(=^ÿÊWªÑüñ¥wNëüó)ûúú‘¹ÚŸïlYõgç÷·ŸñµhÚ?½Ñ¼©D¼¼0û#Ø—€û}î¼pÆèÇïA¿Òà ûö±Soò®FNàÉ:·Ö´úRUsyúô”9%"íæ†¤'¹{œV¡s”úñaÞMSÎùÓO³‡°H0WÄr,ù˜ñ˵֚KY2Ë”vÓ~~È9ŽÇe—œàœ|Jüð°õ¸ŸÝìÓÓÓᇨL©2‰éûÿªZâXr-‡œ“Õ‰–8/KMPT«EµD‹À­¹iåB0µ4Ú ó®>Â7¨ëèZX³ÿÏ».‹P…9Q*à X –ž¡Ðâ=5r5£iy;ÌaŠF$oS£tŠÇl*yxWÿÑÞº•šÄ?AŸ¡@ÎÝëŠ z×þƒpÒZ6Í]§h_v?8£/[ÒÞZ£ƒj†„4w92ͽTÝ´ûæD®ØajÔ "íGý¬6¢[§W.‡y×=Í›«µ —­± •jãG/Ò‘Ì€3ªªù…›]º•jÚÁtÏ¡CT4M½Õ3ªúÙŽ¦í˜7êŠZ{U µk´WʇfÇN¬`Îò¤RáÙhš²ƒŒÔèèÜ‹b4{8‘3 jA Ì¢IKe!Ìä4ö6œ[Æ64%"t¬´î ‰ ¡D‰Äxp›)+ˆ ÚQF“ɲ8)¼?»½@§™TÉIãÊKï°‰Õ öæ„2[prÎ"†&Z†£WÍ.Bᢃ$ÃÀÊŠl‚‘0çÑ%b®PË!="…™»yÉ%D•4cª]ó%ßÄ]æ1ž¹„hàtT¥o(r(º‹¼±ƒ˜`|‡4azè5¹yFT4óµ lÒT ‚)AÂ4ÉZãˆKD –LoU.1Š!P RœL±•E›úí¶V¤°iy1;ݶ†5Š|”èr#î¸ÅJ÷ Å»šêÇ iÛàlB-w¨—Ê€äÄð|n¤Uˆ·U«M"Ô¨ý¥ÀÓë¹éù%‚p‡§‘<œú»´\u%ø êÔÞ5 Z@`vˆ£˜ÁŸQ[ÝNýú¶¼*ÌbŸ»¶ûù_Šq½Õ6d•^.âã„ ¤”&wF¤iªä¢bÉm?ù¼3ßMûý¼ßÍûÝü·ÿáð´Ô»ÉåTÔôTÊ.ù~¶€=e1O{úq—ª½‡Ùâæ![ZµzÞjÑZ”!CÔ„’k4BV©e)!É4¥÷ÿ囿øv$Mß@¼G-âÚµuæf8_üè]V¯ŸþëÜÈCðÿ™5ÝøúýçÁ|••ª¾Æ’ž?ûXûó×îð+ëïÝÎ÷*oٜޜo~ŸEÆmà÷ ¬ôÕ>~bèü«ÒpÎ 8EØþ^Þe?Å£óš8ôZW‡ÆÏw#ÑEyëüŸõ;Hç†ìA{ØP®^èºíæôÃ7äÔ[BgFìó˜Q­H£³åØЕYõº9iCÝŽÜKqë>øúüì–‘.ç©wÆÖð ."ðÆü§‹ƒ\ùaó<;o—=D·n[^}CÛ†×ûð“;O•3íÌb£‹“¿~¶î³%ö¶ÌÖªº²¨ëÅyé²Õ@·–¿/<¾x1P® Ãëí:¾±B{(áòÚ­ò³nȬƒŒŒ3®è­1¶}ÿìhû+ðü~À©»þò&½<Úæxáºvý¹«„­¶ôUvÙöihpò]©[ãÌ^v\ñ©¸ê:ö‹r´[j=g\­ë7æqOF:Ÿk±mlÒy™|óV@ãWPÝx<œžÙžþÛ‘î›!rõF\C ǰ]9p7 4z“O Í­[éÊùÂ%j3¶oÞwÛÒÅj»[ý&ì ¢Â†X·›·Ôf™ºÂgl#´ü;)hÎßüÓ?>?×fûižk®ö‚žŸŒ¥ÐPsv‰±L²ÈŠ(ô9y+ýÃÇ©‰tŸ¾ûTkDÄÇÝîðùÉõ—å›o>8uˆzø¼TÆãlÏÏK©¹,å»ïŸ|7Í»iÿ¸ÿü?þ÷ãåXbJžUòœÔLÿ¼OBEJiž˜ó¢P©ˆèçÈM–:ºÖá–­ˆFÿo¨Á¥‚žCDô =Jí¬ÿ&X·AÕh?ÍÃÞÖ!ÄÜ¥ÿÌ^ThÖÔ˜ÉFÒhÿÜbLÁæm'ÊÒ0öÚ 3,GD“Þš:Áš_¾ÂlŒþhnžÙÎô¯HS'q;G”N2;M35@J}¶i”³ŽßAíæây@!럺C9|H“Él£K Yì«ÀÔ+íþ)¹G s† –gDÀR«ô@T•ŠidH†°!Ü«C]Ntµ!˜–¶½å›‡zPËmJ¿èù’fZ0Çã#X @"r`  òS¦\ ˆ¹– #àr1*` áP(©Xª&>ƒÍÔ Ø T€ÎF+ b2T£ˆ2D°B vˆD2š»ßáÄ+DË5h’‹1¬Ñ'•ÈÒŒ)X ªŠ0LL!Š”ªfcrOTgr‚ÍÓJÄl±Ò0ÕÄ:Qˆ8‰ ­'@”EÜiä>B®"PM.Öç´Ûíñô<#–I­•ƒdƒšÄG…š¢ýãAݦ4o )ëÑ5ßJhèõ­¨(”Œ’á†y×#µ­%âZ´iê7uK¬í=+Þ{Pê‚9õçA^˜&ÑQ*£€€¹]Bo¼4L»–!Œinxhê@0s{¬.ÇZí”Ù ;Z¥ÇÔ!áÖ~Óõ–Ú •H(Ë)È-^ØÁ©wöh ÉTÁ_ÿÑç®vx«bܱ?ÞÝ÷í×[WèEç6 0ȃÂÔ^ÄF+Šê˜‰h;­Ÿ`*P‚·ÂC ¬Ý°Þ+v#†dͰӲHoÅ5p˜ƒHæ‰SÕbAŽ„²†•'F5î=ÍÆ´Kîûùá§“ÍÙ s2͹V0¤òiQ(æ‰Îjì\£ä(*‰°)1O Wm!4á°¾}ñ®Ýì?žÁ1Z!$ µD-uüS"×ÕdêSú›¿ûÏó~~üå7Û8N»€ž-¾î8¹1ì_¬ŸÉMÓâµùçrU²‰^÷°QBÜ´hº½(Ò莚r޽£)\o~Õ œh¥ká@·—‚¯aˆ_þÛkUñ-"ã ãníÃ{\´ŸŽõ>o‡õôÞXM¿ÎðçòEŽèVxA¼>KÚÀª$±ã>N˜Ë-‘s¼+AZG­›œþöÕBÔêÕ}3 é&Jå&‡êlc}â¯Þ ²Æk8šíà¿ÃfyÉ‹ý*ëF+sgÝ^·Sps$|™qÎùÑm`È:Y9D¼³A|£Šøª,x}{^œÌWÀ Â×vìqòO²ÇV*܆¼Púbãžo*ϰÒ;|`·ÏÀ5è톶—'ê/ Vù#‚ÎßÜÏ ¯4rŒn|I¸lWº`øOzýÐ2ÿ§y[š±®d§/ Óþ²ÒÚË“ðvªÙÒ~†{97r´W)¥ý/mï¸{¥ëKÝÜ ày&®êÞk½ ÊÞáÆ¼ç!ýF^÷­iã,ïàâTÜ8‚ûXŒ;‰ëÑ­èÍku¯”"^7÷Oø[M½Â&JëK{,·Ñkç—ùÖG»O_ÃÜp” ‰¸#ûŸ«è¼QD9I¾>àn°Ñ¯ê ëVd3©o×{¼¾2ÂÝ ½é´_Wá®%ýíɽh½#Î ë›ìÁ‹îçK{kǶÍóåÚ×§‰®>ùæXèkÄ Îz<×B/—Ú/œÄu««­Ü›/É Yû¥¹è¥©wW%|á´vðÖDöò#ðÆ­úæ¥×vñr#øâÞ¹ÀûßÚ­mžZçQ.:¯i‚6æÿ±oßà;/.g)õ·¿þ'‚F—[F¤4ÍÎ4ûçž§ÝlfÕ`’Mɦ‰d)EÒ‡-G-Ç|ø|Üí’ï&˜æÇ]2ûüÃg'œîÆã²|ÿ~ÞMQŒ”x8,¹”¿øPó§yN÷žìÿëx.a,(Eu!SKLT D^Jƒ*ÔÊ(-ÞSnHj÷zÛHÅ„!yw—·ŒÍhÙ˜vŠÁìi©ódZ¦­7DÓÔFtgcƒø|0pÂä=8·imMäÊÇ.FGAÍGÞ2u)˜õ,\Éû¹w„Ó5m/8lìd—5UOõ+k…ÂÆÛ¸:4 ¨¥gÃÐAuCqUµôè`ð$#iøˆ{Ì/aÖïŠÍ:$zçš{ÜB’ëa¼‚uEž Ó4ÿ@ÉÀí{¤©(#ŒA@Pê UXEä~ü½ZûÓ× %wìOtÛ1= "w.J ¤à*…O ð(D唢Ô&ÆR¦f¤¯”éyÁLì$„–8©cÒ¸ª¡hEÄBd€ÐcåÎ(áY±!¤=i““Ñt]x®µ©»sëê*‡9Q!Ë…!Et*S†$Ôg‚Ð1";§*m礪 ÞëV2A´jT($KCƒ‰Jd@ÍeÄfê@Ójµ@S±°xFXP„ ¨ôiúøÍÇ‚ZMÎûŽKÍ%PiÇci–tšç¥Ríui´WÒGÍ©çf‘Ø-êÊ ~E %LSÇ^EEš»K½9Ù[Ft§Ö=æaý®±Vi©ˆrÊßÎ "0ï”fÔ< ¬¿]+(NIÅóCÇßs·]©;ç¾þÕ'Ób-¢t韩ßÑ¡^ÜjCºá–<Ð@£0ÐJL(K/² ê6û ÐCG¬÷%´ÉCg÷ iã§Qº,þSG˜€&зë>œz/ÚŒG”èÝŠ'Æéùj5#ƒ^<-·Ô´ÓÎù ¦›§â:öàž‚üÏýæ8¹"·Jë­«Ä{.¸›¦¯ ]~k3½<íó9Þ}3_ Äçë7ìjß)©_Ÿ½?jèü« ßëuâÚæ+^v\߀7ËTו•?ަ¯õ4Oøóן¿þüõ篯ðXwc¿O}||ãþÏ_?ÇÅøI‡Æ-ã•Öæm»WÍ­Fýïÿõ¿åC64 à˜ Í÷U?<æ,•ð9íw³C:>Í,&ß'Çäéû%×ÐçOÏ|:~ó—ß‚VŠjàóOŠzi›ÙŠPD‰R£Öš+B%g…™;ÝÓ~þûÿÛÿ}ÕÎú–­ü“—v 7™žù ó㿽SägXdoT¹õö%^üyüç¯?ýÁïö7µ®?³ÁÿüõutíÑþÚ]U?Ýàzà3ø oÕ+¾: hÛpÍàÁK#¾|¾FvŽÖ€^#½•¼Æsâ8“¶ÏüíÿÎÿ·,êo¹ê×!§ºí¿^\DhŽÎ¬××/ô/#QxO‡|«hyj»[Ú¿y¦/Næé³‰äÕé¸,Öñ|ýxú—N]¹7†ì&4öì,®˜‘[åd½ú–w.Ñõà¾Ù±xAÅZUÚ¨uc^^ªÍ÷fCMÁkNW=27Zo\ÏN‹óLžßÓØÚ5ÜçÞmÀ‹žs ”Î.é5icñ¾LüáÛÀü<Ï–¹>ìÕ›LÏn(~QâÃMâØ¼nQ’îÜϺ‰æ¿ÿ+º+¯ßîÐí׸ѳÌÕiÿú}wÖ•ÓÆù©‘äD]ºsAׯü«Xù­h4XrÜÆyoß}øÕy>—œz 6ð35Šßþó?s?ëØ04·i7-Kw÷á°~xžþ0Ó(éaÿ0ÏÇï¿O³Ï1y~:~û«oJD)A7DµdM<{xܧÉò§%€ãá(G?}÷Ý/vi<×òëœMu‰=4í"¢–cŠ ý쨵Àáðh>ìènÃhQ–…Éà†(@£ÜØIàhZ[þ 8¦¹Ó0(C#¢–-kwÀ²ÍûK­¸‰ö‚JðGðécW@HgNQ2jF-ð©‹eXC>Õÿ<Áj€ Ž®†;Â:Чùšm¥  a´4N7ºAž¡!˜ÁÓPð[vh‚9"ÿ,áBÎÍ1¬›H ¡^“P0‡qäO Á­¸ífÀ“æGvï‡Z ÀŠÈð„H¨ËJoª"º OƒO` f$"س€R+`Á8Ó»Ýê+@âÕž Û’™“#¼7säæ0 áðÙÀ¬b°„ªð@ÖÊJ% `""à@.,™¬-`@,,S"KHä¾ÑÏ…z g0·+bÈÂL̤AaÌ”Œ(J†$D{d9CªÒNM¶µRZ•Vš)@&"µ³M-`*¢AnUZr£Y‰šè¡*…(8&’¤UNd„ŠY õA3! áà® jb , *TnpYµ©0LRq„òjM®)%Ê!§Â=‘Ï‹¥]žKÚíPµ2íÓn??~®Ê,ÑRëÏpïÄ*#Ô.÷X‘ÐP+8Zv8ž`?eç=âÛ½sÀÚxL Ÿ{ýÀ&@½j•fÊG6ªUs¤µÖ–5Ý7Ð<ÝíÞhr/­5sºFßÌš×'û6—•¾¡H;ÈG0z}nšáó tå!…L?ˆh%°ál»,ˆV3¨£Q ¶bFK„£ G¿õÊho!ÂY³ÔIvVe¶5ò„ˆFðßÄkíËq8áƈ i·³õ<þD³ m¬yÿÑÂ`ƒþÔ‚=¶]˜uQjÀ<§"QæfAD™%2…©|㻚œnsÚïws§ /*V4ýõ_×PÀDZH`$«>Mµb–±–ç_< ˆ‡R=ÉÌŸ–üq'#Q3€«`mf±Ù¤H¡¨5jÔ\j®Qk”ª ’–RšRš§ÿô¿ýoWÈ’êœza¯vÃ<cêQÔùšøÚÞ¨•£rí;l°wXzËêbåtµ_¿ø¯­+seŸà„”¹÷º·LÝFÝ¾Íæ~{Áù*GèU—óÝuíÅîì,@ø­ÒÒHM¸áJ¾Í̼ÿ¡ø–ÅÿV¦Ù4Öã,ÆYo‰AnqÕx5‘øJz£µÿÕS÷¥ÚÚ+¨ô›Ý_¦å]Ûº77˶Em5^AºkgûIêN¡;÷ÓÚÏkµMóõñÂmu}®p‹Ôtáz~øsÆeºØ¸ÿ™7 ›ï\S¼V~×Åi¹j¤¸Š­K¹ŒÛ&‰ë)•÷¥‚³ãäMDÌ}ô7;îß§f¦¯¥ÿAAçoÞ5/t¹­/]ÁÑߘwÿ¾¹‹Ã² u8?Þ»_Þ>½áô®GÉÕlð~ûà £·"€x¶Ùt:žê9ׯyZCÝÀFëå?_}öð K‡j£Î™÷÷Úì/] / ® ±ö¬?‰×ùo×ʯÞµF/¼{÷Ëeu£uψ¼3‡®Ìlž”Ý×)7&øÁÅõ¢¸|¡^T¸î ù£åõìÂèÞµ¢n©üÛ‰é²br«´¾åÍTgÍkë³êZ¾ ö_ÓíÏëdk5ä²br}6®¥÷“.z¿¡Ë‚t}­´ n¿s<«B¬t›Tpq¨Ô•ö|³RÄëÂÑZ“¹$Ó´5^/Üzâ\¿ÆÖŸæÈÓÎå­OÝ—ŸÛQpµ¯áyŽÂËUÆ›#˜ÛÉëþ‘ÜÛLÝ\ õö»w>WNËæÛ=’ÖÕQã8Ãý /Ï t£>„M·}ËôÕE™áõg̦æHüþ×ÿd†{XÓq¤Ðd^'(Y|?˜¦4çÉé4Õz(Ÿ?}÷Ý/ÓRj*RTÀiL³+Ó’'³”x|>NsÚ'S‰åx¨Ï‡Ç)%èøÃ!Mþí·v̇%ÏÉ—¥xRÔøø˜TrD‘²y‘¢óØ‚ …#+Š(‹1ÃØú;]0ŸÁŽ0¢Ô #Ò4ˆù•Ý&oB³v>÷P\ÑÃÎ ‡˜0{öˆ@,H{à Ó#òåóŸz².‰eAój N@AÚXûÛÃ*ÔéCM33ÕH>Þ¿ï-îÒ;úƒãµ< ú¿ŠæÃïlÚ_û¹j ­$РPE*£L°¢˜¡]x•Š¡Ù-¤}JÓd?, ŽÜÍ)À–R¬ŠSZ–åxÌóãÃîa*%¾ÿtˆcåäû9LjŠÔ/ú”,"Zímš1ùXÉzï×i7/ªjî±Øœ`„–`;ÐQ2J¥ihYÓѵF(÷^–²€Ž|è »;ðGY=7ì ±!€@‹bnGK…º_j'í´aÜ/Q£·¿D…¡ghçe$v8"÷Üò|€B¦©»ãÙj#΄Û½‚¯¨ âØO(FÖwï 7½§ÜêjËOý!i0v˜Æ›šò> ¼«ÿÓŒ¨ˆÃxXÜ{y@#À£Ùâmî»:îÚÌAâíÆ÷ñÜ®íjN£Ñ!Z˜0§ä Êa©3g1Ò”’ùœRšÌÜvɳÕÅ›¦4OiÚyÚ¹OA·@ú뿉}ʹ–uJ1%Ë5¤º›viJǬ@N©zЉš¦t,:Öã~ƒ¹¡¶zfL‹ÍêÂ̶úµ"¢F͵æRs©¥(z&¬§”¦4íæùÃþßý§¸@qk‹˜àF.–µÃè¶!8‚Ò*ýoV‚.l¼µ×iýÐèDp¾y³:sZºèDMä wÑ¥Œ…->ˆ£“‘¼%MjÀ‘/V÷T°ßãÐðWEÉû[‰ífˆoÁœ¹p©X½ÊMß¼L$ß·¾?SønIi÷E Æ:ß\ldy¾¾±=xi˜±ºU.ß92õÅòûe~Å‹›[úxÜ^NM?'B,qé$ÛrQˆ+“;¥ÛóÅÇ[Xn\…kÞt%w õåªÉ6\{{ÿn¿sk¹­toïÁ f×–âõ†RÖ[#(®¶·}¾×ÆÔuë‚ñY»•¢·¥‘›Cîä¼ýø¯W\)¼*ù[$Ì?èü­\Ý ¡¹Zí¡Ã“üŒsÐMeó"PÛ'×ù£G×½¯Ÿª?ÅéýJÜ_fœñï=ð?#€þüõòü5_‹¿¯Ç§ßÿëðÞswc‘ÿ§Ø¦wªÃý‰7)ò½?ùµ‰I|©Pñæ1|ó–ÕݽÅðû_ÿ€çß|zúô”ܦ4•Zóñjúðb)EOgüê;Ÿ§_^<ú<¥ÝœÜ@Z>,ódîɧDš›h0„%¤‡´$ìB6{Éüôtx>'³ü|(ÅvÓ<ùn¿;üúŸŽyfFäz8,)Ó‚" ¬HŪ\RUJˆ©çUJpÂòÓlîþ†ù^Øæ¨%woóÖ 0ABÍð¹cÕâ‚Ç«5Q¥H˜ˆV~øÐ52Ëg˜ºàÞ¤ÿ¼€†´GtÀ®°û4e-ae(Ô¼j:œf›çrÌ¥Ÿ›þŠºàpÀã·ÃAÏnàmI¼–à3ÔàèìÔ# 5ߘÀŠrè<–ƒj#ÕÀØÃBéPt÷q{Ù\Z ±fŽðU”@C3µv„v=H>†ˆ‚B$ƒ;Ò ä#|îE‹šG™¡B¥+€»S{5B@,¨ ¨ J(­ô(p|bÍpª5s°‰ÚTË´àó3±`o°TLÎ9à•!MM´¬¨…¿ L®½¢UŠ ¶ŒbIL.ï±¼t`&ܹ]FÌdˆ…®RšB LN‰U±D °¨î3 ×ae‰RjE" Í-] Kº°%äF4ºä §1É„â¨fT@0¡¨‰l®j–`ôЍ¡páHà²ÚÌYaLKdVˆp£‰Ïß|(RÍ%9&÷5OIž¦§_ò”Ò4éX?ÿpȇü¸›÷ßìvSúî‡g!¦Éh1ÏÓ¼kîñÝÊý•¡AÏo–ÿC"wë­9Ì@A¨@(C÷¯h))½Sª…ú¶šÜ%Fnæu¨Õ&¤=@Ô9º^T Ê÷€ašëP(¬ÞZ¼‡ZA=v%JCnÉMý‡z—€˜1*£#6`=“åÆ.x´Ÿ¯ýlU· ‘µ§ë&ºM6Erþbþ`{f•äÓ.yNõà1ÍôiJ>{J•ä¯þš)‡š2q0ó„TƒY1[ì¦(Ê“kJ•laó<,Å÷ ÉÚdh ¬mXÝk­}žŒ¸RÿKYJ]J-¥5ãù”|J>§ýÇG3û·ÿñï{«ßj’ˆM€~첤”ž/·TþDLáÖ>çšÝ+4äswÏŸ¿þ´7üÓÚ}EÏõÏ|´·”ýw¨{zC»Í ýàË/¦áÿžßJ?Ñ}¡[]ýoþÝ÷Þb·e‘ë"åE!üÁÑ_O÷çÍqÞ<ñ–;þjA° ¾þ{½1*süøj_³S®å'nC¼ÍÒ—Þiëÿ×í{í !w¾ñ¦åæW¹¹¯-(Ú xôE§äìµu3gäÆ1 pë;Xë€}ýüÜG{SoÆp:?N]ýûìx¶/A¼ñÃÞ>û·>ë¶“bã|çm7÷y ËÅ?Ûá=»šÛÕÊó°–Îo=’x•ƒt½­‹³Ã—†9ßПssVXmKkF;n&´¾0Aj}a]u` Þz¿ò,^¯U–uÕ@ò5ŠY|ìM3â)}gw+ªýî|êy×F{t×òž'‚¥rï2ðþ#ðZï¿lÙÄåߌ¬¼_9 ¾ç>?÷¹äzüü¬ZA–ZsλÇ}LS­Q”&ûî»§ÇÏŸß>î?<¤H»ã’kÕÇo¿A”åùhË1?/Çéh`>t1 @jlœ‚4u…1„º ¦‡·U "7+~˜W›… s ¢p|ø¢ ˜cÚŸ²@Û<`@؈E=ŽF?yðdŸ@¡¤@ȇ5Ýmê!ŸtÈ9¾ù\[¥¢ëwfvq·úª“Í·$°–f›0HAiä|¶âþK'õ §áu¡!Å ¢QS¨¢”#Ta»¤Ê“êÊ#)f ¦Ö‚úl%Ó]NšôtÄŽ,£˜CÉH²VP(hE£zˆõ9L$&Ð[¨)U…,H¤‰a(B ™!§ ˆ‚H° 0˜È$9%¡B†d’‹ˆ#b¥^@†d¦ç(¤%ÀH'fv‹Ø$šZqH( §$])UWkõªhnSC•'-·"PI($貪¨¦41€#ÂOÇ;K{سÊN¶äößîûÝñK‰s øí7ߨ.ýão~sx>‚HKÔ¿œì©<<ìŽËq·ÛEUŠ ÙÏ5âB#ú¢ð@šû Š ›;JèCkõÝ7«{CÙ°vMän±§õ³ÕœÚíÙŠväÉ™ÞJ@­ý…£I¥‘ô1(aŽEœX»2¾®Ðb·ìôX2°Œ#´«Þ®­BžF7@)ˆ¼!°TPsÇEî¥Pªg‰·bCjFþ´wé==pÀ‘3HȆDXB- ` ˆÁø²þgßõ‰·õ0ɃŘ< •1;ÙˆMÞ€Œ˜õHÙé©Ö‹kƒl{þ9œ½.ÛÔÜ8M^„e”}zœRbb$Z²ÏJÒóôlÇiš4¡Ê—°ÙEZDJ@”š }šœ@‘}Z°Ÿ"Í‚üPÊÇǘ“Ü@ÖRJ)fƱâ2³V`ßkõ?×R!XJ>¥´KûíþÍßýç-Œ†[ÃîéOoJ7ÛÙϨ +y`ÓyKÞØ{ß#!Ü#¼¾×w^ã‡îˆ×qG•¸°CÞþ©W&x(ã½"ã9€B'\㸠/Ç`¾å]6e’mßµ`ûbxmV¯àÞjÝÚéÞÚÚñöðä„Þ¼Ô«‚ÔÛ«‹±t3AúÇ|Û×mô%rÐ…˜|/WzsÆîÛ±WÝëM±Éo;ûwNò%õFÄô­®——EAmmÖïW3ß®8¾Ð"/k·íâK¢¯T ø£4¯º"^¾pÃÛë?1èü ­!ësGÛ§aÀvJYº}Z´QiÎÍþ7Çç«M÷¦¾µíf ’zõ2}ÙÌyդ‹If½í'#d’é …ÁU‘.•éÄ8O©æ8¹z0ݪGnïÒ³ö)ᦞ¿Î“À9¤[0Ï´]½(yç,~ù®Áâ>›Lo|ÞÓOB:Èþú¹}‡¤®3úÕMuÛÂÊk ŒN<éª4±y7].’7µÝ׈¯«9›6œë†·--›”‚K*ýhsA¼Òé¸6,™³ü÷­X¬³‹vžOp m~¦ ê¾p~;Œ¢²³7×»Oçý„8¿Q;âVG?ç×ã Ey>]èæ’ðÚÎÎ!Äèân»_º<—Ÿó: //Âõ¼p»\üäv¤ñzýÑz·.;åÚ´tõÜ=utžâxþ{§{þÅIz³ÃàY‘``uyÿÝæMéÕ:^›š{{Úé:Þ=¶KTÑK²—­Ó· ÝÃ5§í'¼,œ^7*®%…³Ú·E… ƒˆW¤žö‹C®£.{Ûד±]T]4cnf»˜çõô¬Sí9—÷é;‡OO%—šóoþñŸFaUÕ¡fNš’´›]Šy2xò°þ›O w»$}þí÷ñ<¥)ù™jw"7›EWÿã;´V(ú³¨u„zUÀF i«@DA>vµGWBϬ4vARnî îÚw̹XV^úÌUEÜ·ÚN ‚¨ÃhBV` P„©%’60(X¤"©b PˆÍ½¤èEªÂäÞ„Á«p9…lܸU1ѲX“™ÈPª‡å£%"¤ !9˜¬?QK„é0š¨4ìÕFJaUŠªT4‘A‚Ȱ#Î’„Êp# dh©±›ÃVÅb¿ß—ãÇìiN1ÛRÅRs.“§9øí‡‡Ý~Zj”¼|³KÕùË¿ø#/Ëqÿ°§Õišj¹,²hHŸvŸ¶çZûÝnL ”Œ`zŸàs§äG„´ï¶ý”ûýrBK¨ô’X˜÷š…±m/¶&ÐFÕƒ4t-"÷7å9ÐJn£fV6œ(#±…øÔp^ž:FŸë1úÔÄÑ££–PR»¬ßÊ`ýh£ÏW%÷€î"‚5ºüâ)2JM¸çHÜåHPhoäeƒZŽQ%îL7ôæŽvFŸ„9j$n0Åêpÿ>å–QpÝLMf«Œˆ‘ÊÞÈi£±É Z´j£¢j¶‰n4û¬g“Ò*£ÂÌ9Oӟí¸g÷ Ó­~û/Ž¥ÎΩ„-9Ü[G~®Ú%WManÉ#TsU2ÌS8é3#ÚýÛžÝ5ÂhR c6°üú_Ž9j…à“OûÝ÷üíüûÑ¢³Å®®—˺ãàfk¡Ë*Š«ö†kN’÷l×ÇZåEYº±×…ÚH†º‚Tžªº©BŽsÓ~÷z©¼AXjb®¹>ä•õë õ†W5”;Lž!AŒÝVüÚ|t¾]ÂÞ,qõ"‚yUl×§îÕtc³_\Ë ç+ßõT¯Ë`ÆämZöGºT)Äó•:6Ûå/”ÿîqжô^…ä­¤—÷ºÑqa¿@ò_«ëç<£{nöƒ÷ÆÃÕÕ×4£ß)8iº”bÞȈו:»²ì9­ãí7Ôßx¯3Z÷®òiŽº¨“œCÞ¬+Ü}©o½µö]I÷ò Ö#X¾.o°+Õçj+ÝËû.òão˜÷V׸Í;= þ¡óWsêýO¤­º±¡Ûæçô1·ƒ€ÛËß%Ã×7†ë˲k-åíêÿWªÍÜ•wÚ‡$%{ïUùQ wĽµàÏ_?Á×;× 7–b?_8BÝwPÜ­ä¾éyÿ£ê÷ïòþîáfßpˆ?îs}ÝÆ,²úÓš.€—ú¿^ÚT¼ø··?ffØ8x]’i{ßs&H{þîÓñùPsýôÝoUÒ²€¾}¬QKÈ’ÿÝçý1ï?<ì¦ùpX°,/Ÿjýå‡ÝœìS.Ÿþùûi?MŽý~š&”rÌOǺU¢(èàf­ÖA VXSémh‹ÆB©2àØ]ºMfêÔ ßԼ؅¶:øøc]j¬9÷³ÜÂ9Û=ÐpÕ–:G–±lKFJ¡‚h2pEš0í€@BôlÞõn‘fÔ#ਂ£jrˆðÑÅå#ªbèe6Á§®¾­µæ«míí¬…Ðbl£‚8Õ6š¢×UÈÔMÇz+W^ʪœZg 7‘®{¢Ó¨µðDêhWjµýuð·¡!ê{ã¥CCZmnåžÚDÃ.ó &5žºBµ Ô‰ð‘ŠXÔ@@-˜ZØo*jE.4U"kEƒ€ÂÀ´Š"& µ}‚%Á P`ŠP!URæ‰0ÂÔuÉ8ZB$™¥E8J³NRLL‰Q{g)²µt¡5·, I0JØÑ!†ÝùšÈgôb´«I|0G¨;àÍjÄLÂÅ0#ŠŒ£ÀYB0P™[ ––Ô`ãU IƒéÑ Q£Úa>&ò¹eƒ…=<ì&/‡RJm–ðôa:.ù鏨äÓ>ͦÝlq”™ŒLiƒ)r,EÙG™§,ˆ J U˜|d¨Í3ð:èpïÒö©VÊŽ·ÒÈ@éV}s¨@1R…Ç`ÆèAiÉÀÈFŠ¡Ö~G44? È'È”QÊë[Ü÷¸}JôΆÖõÒ+nàÔ5î^„MH–j|3Å(­F5Ž6惕㿵Ïhð5ž£ ø)²‹þí¦n£ÑñhëS­a…ÚÄËÁÒ &XñéìAP/QO5ÑÖóÑ Þkx}2±-5¡‘Ž N˜dÈ*-³1{¢»O¶ó’h?˜v;$Ï`J ³ÃÓî¯þ휪Bjw›<’E‘?xrÃ4¢Î 0”*À‚á¬É]ŒdJFªV [þ{öïØ§^«ÿ6ùô°{øÅûŸþ¡¥“möôíñM½ ÔðKW¬[ÛO-¯™øíûèÛ%ý˜Ñu£·‚Ï•¸ß¿…'/.ñK­¹nú;ÞI¼ådn•z|í€ßÑÖU_ø†<ÏžýÉÇŒ^;Izãe¼Æ ¿Mþ’‹óZô÷W'¼d)èk ‰ŸO¡¹èøÓ„ο¯\ðrð¨¶A?jV¼ŽÍ¸9¼_ì´û© ×#äzfŽ3[ƒîßxÛž@/ßP[‹íeÅIoMº½…¡ó vü„·µ~âŽÞðo°cÿô2ÿí5çEzl„t_a幘~áæ¿= ò=—A/Ü]z‰&Âk /3w7ðÆ;ñÍWõ'=ú+û½‹Sÿ®Ü¸ž¢‰­AcCäÑÛdc醹æ–Ñæö8;k’å»FÚ5ú~ó|y_Ú¼­/Þä *#ºÁ[zó\qVЫëãnÿf¼÷’ãÉñÎů S7>ÚY»p†/{÷y²ižTáDIÂRêÇÃayø°³R“;wC»_ÚÓóqz˜Ë¯ÿçäšR22´ƒ bJ¥TU–€ÏVë¢ÚnÁª"´Dßè4³ÙͲCwfCT lNŠ•ÚïËYòa“ú«Îýod &Ø ¦”/¨¥Ã…ºwž(‰@t‹q¶¼qxÖîEëý ­ŠBi@Uúœl)µFÓ.-¥ö àÓƒÉ^¼‡ $|¦O(‹L]§!×a—lêd Þ4 º°ˆèÜ|0¢G'ÈaêýF˜¯³c×ì8»k{™¢=qªu?Œ>²mRcõxƴ憪 kÅý¯“Ú±)Â2Ê5w㳄ºŒxÕ€*ò( 0 U´j*d¦á¹b¶QV…=àAÂvBPYZòÝãÏGùxüæûi60 ª,$äšçGÒ ‡ªK%œ¨¥ÛäeÀpÐ׊¼n€¿>Å’uéu•µ.kÝ-¢a÷å‡ÏP†2L¬¶w1p°ÅZì-VžØ¹ºÑ-£–þ°ì‚:a¿¥ç E×ÇkëøQ×è[¡¢Óð[†›F)d<ÝÅí^X3å“AÑ›~T:.©…x·;º5 ¬žurëø,ö “–ÐÛ&(z‡óxŒ5k Æ8Ÿ`g`­]%àÓŽ Y›hõ¬‚ú|”µc!*<ÞŽQm}í†oÑïÉ òQ;ñµËG¥ï™aÎ9Í)MsÚQœ•‚Ûn7sNHÉÍç4‹œþÕ¿G å^³W3&³ –âJ2Éä®ä…Ìv.À«¦ãrüø a$ýÒÝ¥{­Ñ‹§åzèZýŸ÷»‡_|øw÷Ÿ[³[tµY¬Ë†=•/êT¶é;ë2&ѵ?õ¢éðšü%[ý·“‚uŽpkñ§s£´ÞGw¹±×ø´§{9À·4mÂ3‰·…x×—¥7­œ¿ªŽÕ Hw¶ØÒÉêÿcÊ oX¿"x½q<ß*¼yôÚõ~g&Ø—‰:Ã\…â¾<(úÀÍûuGœýð…y/|û…2€î#]κ¼IÜ©q¾½ð²-ì-/ÂM•ó=—C/œmœ:øú”üEóÀ ðå™þO:ÿªŠ¢s¦öõ$z>ÍŸ5·éÝóáÍÌͬì‹óÿrÜ5Œè…Ѿý•›×W;l®G¯è+<_W¤“Bçýiç(žóâüz6K­ž¨È jþvìo(@§Ç/ú:p£cò¾œ¦ÈKT‰V5x«õ^×öƒlq'£kôôá7ǧ³7¿ào«u/]¾ÒE%ðz¦Ó½²áù§¾&²ërU k/öþüƒŸ Ü ÃÏjg€¼Û%ÂËz-ucùrbO] w´橱üâ œÃtÞbrºîÛ¶zŸ÷Þ-…¯èĦÙX—¬“†¿™ÏÑcëšé¼ë瘺ëÑý§æ­~dnæCÞ^Ú¯7ÙÙëݦuí0.>àóo¾[žŽÿã¿ýw¿øàÉèæ)y)()ª¹£”¨â”Òd%øüÃa9wSªŸž1%,Ëã/>F)‡ïŸæ_}œö3%¶ŒË\é ä?|ÊûÐäVs}Ê壻O)>l)ÍRÀ>Ìîv|Z|N¾c=æRËÓ!p¬¹J…$åZAÁ"W„lØT«š«üG06çªÝÎïò®z÷¯ÿi:ûŒÓÒDý'CýgÚ}d3l×Ð6¨B,`‚9Ü_»9ÇS·ÁrÍ$h5 lìùæàTä:! V *L]ªkŸŽiÀaà®Kö*݇Û<³4ÐÕáÑ­Á1\Ì žSpÄæ uœzO<&„s‘s” ½ @k;‚†m?N·a¨|:¤<:ø›p Ð)ݦm0‡ 83*Ê‚X´!ž¢¹_h´‚G]zù§F*T¡@]è„5I´å·ë,z¡'1ˆ!ßBª`¥r:…†c™ˆ™\H]fUmÉÒž èÏÎnB‹ç YBm˜{OUÊ £¼(ŽädNÅ dö²¤Ô˜fT´,k†ÔÚb$hwZ¼‡‹;£IU€1n0Ø3‘(¤(Ï•ˆd2FU«Fˆ¡¦©XT&ÇD£êƒ<ÅPƒÊE3X\5²‹bpâü‘š|¿\–²ÔœfOnœ¬P9²M>=ðñÃÜk•äSBº|޼hÞ)Í(„Zíùˆ|Ä”Íù.¨öád ¸ºÙ¿¹ìm ®h³Ä s¤[‡% ¢.`r»#†Öá'â 5ž•¨ùÔÄÓV—-´¶”S= Ýò=~Ü‘3¢ž2 Ú½P¢×Õ8k4 ÷kr‰ÔÞEdvÊþm_Mñƒî¥Ú§¸î‹n§¢iqzÒ÷é®=)6X¡N®d7Úõ?È`êyÈXz3Fy`MéˆÑŸÑ V6 kØxë>Q´õÂL©H©ŸØ©bkº¸mVo­©9+Z=²…‘œ¤%7÷H̦“žÜS²äÎ̪Œ“ðWÍ¥”¥Tc®7Km :J0ÎŒª¬5“†`¦Éó£#›÷¬¹Ï š!Dš$iVJi„=…J.å˜ËRVõÿoÿó?|ó—ßr¤¨k³pj»6Bj·ÞÉrmÄ í–*¬u»Ñw\"î]ìÁ_Þu¿ Ö¸)›¾&N­€n ›Èìs*ñù®îíD– þMzòXgþ(éó–zµZ˜Ïp [äqÓ[‘Ö·Ñî…n-$)Ý l¸\m_Ÿºû›ó\=猑U1ÐXÂö}ÖýÓÀ1õÀŒÖ|S9=ž cNÛÛ¬KôsqífÃõ¿…_/éêÓëåwSÉâõ×;¤¾D^?í<3ŒµïGoõÞÆŒ÷N&_îw~A%¿Ty]«7ýN´Õä(5ð7ïÉïa».¤ÆE‘-üg›TxƒŒõöbçu‚Ö†ð %ôÆI^ÈZ­T¼nu/ß÷’£- ~3ËmÄGž°<ç²P£²ñúNèÝ+v½?Nèüx© ÝízðùHÄê'Oé†ï+[süI’.;.N× ·ÆË•Ñ·wܻž¬DzþX¼œˆ.Žj|…ôŽÒð‹!À[Uö-((ùr#ÓOZÊúòý¤ïýÕês/þ•¾ÖáojAç áž×K%w˜)üjçu%ËÝ^©ß0¬v’›¯¯/îàÏ2r¿Æðxéõò˜¢NíõlyzÜmœ;o\ã½X]½(\\/ßoÍC<•q6qÈ/üÒÍÈóSæåµ/¾àü¯òל+xi͸‘qç#Ÿj‹ú±‡z*ì`#VãëZãøôÛï—§ãçß~÷ðáÁ燽wL8¢hÞÏNîæÝÃ|üá)r)»…þ¸£AËÄý.-Ÿ5çOß}:,EâB»¶ç}(‰Öµ°fæufxíÈŽfG¨–* Í=æ5†“½_ÕÔûŒST+~„àiª5*ÂM4¨tlO°Ô9øæ¨†R±,° t„  )Y­a0YôtSG)'}Ó æ(uÔ%Õ«,(óFdÒg-ÁlðC8äÈèÜ!ªÓŠlÂdƒœn˜¾£Ñ’#&ÔAQí4ðê2’– T;©]>µÔҬĪ…JÂ_é-MZ tŒÏÔÕH8ñÆB߀… A8†(”‘¥“yì9¾HF+RK%5¸M’¤ŠVY¡‡DT"ÈM`ÔT˜ŒÖj bQ˜q2ÏŠdÝ–íÎó21YSb}héôÖ#…K’ÌL°1A© œT+jO¦Q5‰Ñ‹IÎQ p!Ž«¬SXµÚ Äô™vL{ovø‡†±š ³Òd<&²êôKÉö»Âúáã~Þ%3漘Éi2UU„×RÌkV„ò.¥6ö2j>±hAÞ ž`s‹ô‚MðÝèDáæ2¨ªíÈßeøqkJ¥­ñøheM …ˆ¢8‘šýÿRý? <\{§6þ+ÞJ/{ÓJZ÷ÿSבW¼£ÏØ×]®?ÁÞïÅX^I|ƒf½5Õlvg¿§Ûãý1‘Â÷wU?‡‹öÔðI£÷>ÃWíxã%Û(Yº¿a×ßüù.Çɵ‘+ñjÀÏqx:wXëæü곬‚Û×ãÕ€×âk|C8ùk„oúõ•@ÿ#:.¾ùŽ€/ÂÏýy·ïŸ?èü›9 ×5€Í„¡ó'û©àMx»/~Ø]ô¼Zxw]ðµÀuõñ^à]O†ô…ú£Þ sù}þ:?coİý|bÝO´|yâæÿ]t|Ý'(_˜Åyû¿Õ7w?rÀ/8ƒ¯þÖâÃO\4{£ ¬ÕFu Ÿ½Wx…üsÿskû̼9¿îŽôò mÊçÝ ·¬d¦ú3Ì4_w‘ñÒî¼»§œo½ì¸ {ãïŒVµiOèÞ‰´fïþ¾àŸŸö»ù»þîó?ÿ¶ÑЧÝäSJó4ïæˆZr~üf—Ì¥p£ 1;çZ¦ “~û?ûÃÓñ_þ_þªFüö‡ç~ÜÍónš&‹\—§e?p*JLFÖPÀJùvž=jqÓRµBñôüôý“}|X>ý3i¦¿˜}Þå–|(ǧcØ!ʱæj íP* CNVU5wyÏꈼ z[‡5µ+}ìêN¡é±º}ëKM(Gh”­0z-ÁgxêÙ›f-쥜Ý\íM›|¦zªO¬  ªS |F¬§0Û&À5«ÙêÓÔ!B1bH{ ¡p~0ßÍu‰å)CáÓn‚É`†ˆŠ’ac0Í=é´ ‹6Á5¢†›Iæ„H‹<¦dµD ÐÊâ@Ïêl@Œ€å5a¥0™wïp–úÇé$z/Š´Z‹Ï°47’€ÑSŠÂr,´ªµb $Ɉ@,@5’ø&—8 "㘕Â(9dQBʦ»‚R‹9Pn¥ 2¤C=!`&>àS(qµ2·†„–‘ÌÒÝUlQNÖ $yªQ«äd&¢°feÀÉDK¡ %@2£œ†&¸V& ¥¾çÐæ¦UU)`6KQ…©Yú(’Yµ(¤ gDDÈiPx µ¬Œ rÆLUB`j:/U+ŒäNS0 D¯{º!¼“q™öx³4ïv>yF6Oœ4[’OfÂÖÈPa)ª$È-ååyN0ϵ}½¢ °y §«  p¢öhY .L#½6zÉ %#€òTËAQeµ BB!á]"¯cö¨ˆŠ2’r·wh)£u}|ØèOPf$ƒM§ÆÉ6òÍG/N›+Vzž‡ HךkÝfƒ–þí µ¢ŽÔß^¶t¸ºY¾®ÖdÓaG#êÉ”z§Kë3ÐèKXoÒ("ÀÁèx1÷ÎejØ´jpô©5bä{§Nï1‚@UWá¶#–ƒH¨ôGi‹iv7˜#ˆZáè×T ¼U©ÌÝÝÓĹ: JJÉfËÁjpù;?¡"8Í–þíÿ5¹[®0ÃÄIá“[ëÔH®”*­•ã­²ËýÕ ²_ˆ4º™ÌD­Q«™Tãþ×PDÍ¥–Zs©K‰@Sÿÿþ›¿üv ^ìŸ#7hÜÿ¯°´ÐÖËDܦX’ç»è[õ7ÔÞ¡gÝ_ ¾ý37{ðºz°¡†T¢ŸK׫fØ”š‹À»œóŸçϹ,}ÅÒòúð nðã¥òmAâ-ƒóž¤¼ñc‰×›^ï9?QìöçÖ:ÁèÃçæ ù99òo¼‚çz]}Cà'.yݬÝ>øËë{Ÿâ…ÀŸ&toîfë3Þ/yù ÜVºÞrš®=þ÷ŽçºéåJƽ*ΫYå7oŸ{§hûX¼Ù›rÑÏwó¶ÿ™6K‚3}²E0Ÿ'o°ö$’·D×ñá/h·ÅÖst{).;;Ïbí ½=øtyc¸œOL—ÓÕí2ƒpÅѶÈyñ÷ZAr¼~Ë¿9kÜÈá·ê›ñÐqA:¿íN­«kîª-¯¸ÛmJxÉþw§´q+²Ï¯oÆ´‰Û‹Ç `g›=ž²åNk0nÆßk+[Ó÷Õ^‹—ƒl Ý-Äõ5Ë‹MÚµe@—Ý6gg{ýDÔiçÄèõ4jœžSW6ÕæP¸A³ž*À§¬«9lÝPDÅîýÇÒjÆå•ÑyŸÿxs“õòx…RòÏÿüÝ÷ÿü›$˜{i7ÉF’ÇçcÉÙ?>Ô¨±ä§OÏîöñq—~‘J.5/ØMûýdžvÓwÏGÔøøñáã/> ÂÌJYvszxÜ)çe9îg÷ª¥Ôå‡çTD€³*áÉ ºåæ8üFA=ùs®*°JV°žËÓâRR0ѕɢáq88Á›$»¶K{µKWÍpZ똭/ecdW¶Æ¿ö Ü;¸?F+ŠÂ€Á½ Ö> X¡.Ûõ ÝÉk4ŸÎn«ŽÅTÀ¨È35Xyï 8uÂ~Yº~Þu°O–ætš nŽéa¶îj”RrU›û*èâ1€$U wô¿ï€æÖo‘¤Ÿm7%:<Y²I–£¹ØiÑÍà ,,¸F˜ Ó¨R4¡¶íŽÚNŽª#®@0‡'˜£ ¥öøÓX`Ú5•P2NsÚíë¡DQΊ"P ÔŒš{Ìj«C”Œr„'ÈK¯u¹vpNjpš öeunIX³Aa!ž=YCK´¸^€8ªÁ y„µ§Å@ކ¬ÂDB(1mæT˜dk>idTUF23@f’BÕD§c©jüÄHd†2b2™” „)”:½ œí]˜n°Ê Cµ†";&Ð31Ì  4jrÁ¬ZìijmVÛ8N1'@NÊ À’PÈe5A,Çt#eÆ”ÈuÁ‘„[J«j°0)ÉÉ*-ñÙ fª5[ª F¥`JɼԊZP ЊRBÕÈ05¤„4÷|Ž&XŸ¢k s¤Öõ@¨eDR µ@ù‘Á¦ÐÛxޒ޶ɳ#€†ßŸ¥v6W_ûŒ5¡ŸHå- $#@„oZ¸iVè?Bìû)mBƒûyOn·›±•/ëÝïßrwÝP„2@^žóAÞQR/š²Å†§QQ0¤Ôa_1š$lèþíØ:C)zÙ/ϧ•Újé%Žs.˜Ú'Õ)˜[Qn©]˜¶6Lf´d“ ‰æœ§OŽTa„s2fUš0Ãá)þ忱_=΢j”df&¢˜,¡pÇl€U0Äh‡/ˆV*M¤­ÊXk9Ñx¤¢ÖÒuÿ\r‰R#‚à¿þÛÿðñáã_üò5¶õ%lQG:í!//%J:ARtj²Ø.FNK—–w¦Õ&|£ð¢CçÞÊp³<¾$pj¥ñdnfF†ˆË€‚›ˆ@t¥+ÝÙW®P¯*`¯©u¼¥ ^l}x‹r•í¤‹}±¶ÊÁµ)öüƒp»>ÝÈ©7rõöçÇd¿ÝÙDë$¦‹£Ð|*¾Œ¥ùÖŸvN†Ñ¯¿íÍ.Ü“­êJ“º¿(Ķ„óv½ïü-xÓÊ¥«mþì†XÀS(ô±{§§/¨}±¬ÿIü¦Î»-Ÿëg{£-Xì4t4¤–‹Ý÷üúëö>ë5õ¶2z]ƒmùâ¯V™uƒÕyi÷ÇŠˆ?¦°Á3X­Þrÿv=ht”_àË.j¬‚ò•ÂíMyÁQ¿7Tþø óy [òDˆßŒmPj»ù“î·A4÷ûAëcæÎIûñyË_¥àåbϽS+¯àT÷hKX;+o>§×€Wbx¯ñò4ð^k¼¶ŸMø²ôf½©LÌ÷½Ü×í¸MÒ 4ì7¼(ßò¦|ÓÁé?{Yfxñ^=o‰ß;tv’ÏccO·Ìyw‘~_:úÃæ¼ïü±çä-}»gè¼,xÖ8½é°þ?¼)ôþÒóu€®n)ÞË#æyÉãF/Áé©£màïæEuo›ò®uÇuÍïö¬úîÓóúqÕ@Þ¸ÁI…wWM|á)ñê§úÑFn¶±+ L§*I"BKÎßýÓo~óÏ¿ñˆ‘Rš¦dóäS ¶^=~| …úôݧ(5j}|LË’<wùáÃ>-Ád¾Ù+¥ÃçãÓ§§4ÙããÞÜ€¨9c)S®:.™˜j­FäÏËósÙÿâq.U¹.?üÅŒHÉåªZë!?kY¤P@…èH¹¶\wÎtÔå$ÕùÔEÿoÝhc”z Ò†w¹ôÆ}Ým¼6ŒÃ‚M^a¡µî«íòVêè Ô ˆÿÛå¹FûÀR@C |RéÝ8oƒ*Þq>ÓÌz¿‘'óÙD3E¨a¿ i×ü¦Y Yp’*¬ŽÖtË|Y€†A·n޶‘j¨¹ÃðÄ]ÚQžËqYª LHJ K9n6û|Ô ›Žó2¸Ã'ÀN$O=.¸O¥­$@ˆ(Ôeøî¨G`‚Íà„”Ì‰ ybñÆÚ‡Êx$4êºP–UšŸ¥³Å[?‡FÀÎLø 8j˜¤ÊVjr¥:˜$À³°w ¤w$ÏÂ爫 ªcÒ¡€Â¤*!n6 ¢MfˆDQ,P4~?d¦íš7Œ ºåˆ*¥f"Ë W$‚4ƒ@N’›`0ܨ†TiÉÍÚY1ÉÌ\QTdŽ¥Fið£!š6„#Ár¢ÑšË¼ÈÂ\“ÒÔ:*᠉˜"µ5j6×¼pæn~ðÙX—ƒ¦yŸæFÕ¥–Å“ûìª%2«Â½ú4;ÌÍ2Jð4?–r–FJû9?-5b—lÞí>}_:¼k\fýŽ+={@£œÐ"I,> †¨=ícžzr,½0ÐKvŠ&V‚¥1YÌNª°d„ÀCÌ®i–§¨4$›½: Ð-¢Zp¦Ç„CÑü/ÿÍ æçS:D…ùô05ÓUug …г©ÿµ‡\ZÔ.Jj Œý|D«q0jyÉQJ-Q—\kmþ¿þ÷7?ì>þÅ/ÏÏbGÈA/í=ß¼õâÎô$sãIÎÅóÖJ_«µÿ•ϸJ07-„´è áa#@¼Ðð³}½‡½~ŒsE£ý'#V/ÐÃ~±Lñ;ùzy,¾ª]\tèí{Ž»‹æ7t\ |çÊï¶²¡wBðqS0Ò»–ýï¹Ý6Ùgy¡øySUñjÀø‘ûêá5µgy‘ï<]ùLyya®'QÜèï¿ì[ôÖG÷ú9.Ûš~Ð¥ëcÿ1ŸâO:¿€=ojÕ®;®DÐ7”¶^´X_ëÁ·Þ‹¾òŒø1÷NúC<oE©ü~ÿ‰¯ ýäGÎ7_ŸúHtí¸w{s0éy£@øûºöãèųŒ»»³ëF¤–Ðó󃋫¬û á[ÛH]æÿüpÍø#‡,ß7¾×òóÞÖ€M/P·U­†Êïøü͇ÇÏ¿ùîŸþÏT…L ‹†’8MT”\ž‡9¥i—ösâáÓÓá‡j±”:{-ñùÓAÀ~¿UJ|>ÖR±›'7=>îvsú°ÿè„“uŸ|7ÅrÐ!Ó<‹õpôKù(ái©öñôß±3&)L â˜sÎÊ b‰|¤ª1J­I²¹éáÕ»³«rZ‰Þh*ùàÏ »n± >w}‚͈‚ª®ïküƒÖ­@>YJ>Ïé°£†ÏúW hç½A·ÅN£VÁ'£fx…l$ˆ œàÑÃg»`¨Ö&©»«# R‚¹Û4IÝ,Ñ&r2Û!S¨""¢ˆ¤E4 c &]kÀ> "GôoÇ' ö Nw$O»Ý|ÌËRªar3z…UТ†!zñXƒÕyo³.ñ©w*t–HA 3€zóAë6h?ÐáMÚ#¹Ÿäž‰j±ä§åsŽ TµÖЇ°ª!QPDî©°Qú iô¡Þ#bM²$3ª(“S"PÉ`‘Ð"(è)"Ñ&À¤£47æ·@ÄNmÕŽ‰L€-¸a‚9{á&«õ–P#<¯HÕÌB&,I'Š4€‰$T)Ñ@d" ¦`oŽ €D˜D!€‰¢,IÙip7XŠÂ鈆92THB“*ƒ‹±À‹Š(d¢”¤êA3O‘¢V+e:´1„OÎBtÓöPüˆš9÷¿Øûó¾[x˜¦= ÊT"ŽÅkšÒ/Ò7…ñ„¬¨‰V!«e9’à” Š«t§Õ€¹© ö¾C¦ÅÖÚÕäíŽéC×Ó‰c@ئ)lBÚDÉCSV×¾£ ¿ìŽÁÓðúQÁè5¿æ@îO¨›˜ëƨiÉ­Ђš­+·!¦>qÙ8ª¹&¥v¤X+4üW'n :PmÈ~ƒ¡—îZ´o_ºõZǘú€PÅñˆ4:«0ê€C¬×é)¢³$°%œ7âDeÇ+5$Q›áÃìï#Á8Î^¨Í«½õÊê•¶®þl Ç2­´Àmë°&#à½í€’D3:épÌ2aç¶Ÿ÷Üíƒþt(¥ÀdNó„R…ÊóñaWËáÓòñ‘¥@걤 Ð$Àr„˜'Z……ZßuÞ¢É×¥žú4¤-"š²^"—%×\ùGµ†Á“ÿÍßý§y7?þò›“Ÿ¹-mëYÐO±‹Ð ÿƒSßàíØ]ßïjaxæà;—ë–ò»”½oÉM«ýUŠõÍ5禥@?zíû»c{+>û+¼ÑÍÀµ˜Ï¯z{â'`‰^x| ÿg½ÄW…–ŸDEº,ÜR¯\›Â÷Û‘5°wâåzKºìßò|Ðù¯"óœÓwœ„ó3ÉÍ8¿ÝÍsy³\õ1l $7/ÇëC×çöâõïu\7ýl]9• ¯ +ša+–žÏǧtòÓØM[ Ï%¢ç¢õn|°û×èMä(®iy½Ô9'iœ)äl*ð<Óù†’ÃUêø-5›>V‹£›™Wož)yª]þΛén fn¬äºÀ"‰×®çÛZ¡67ÊöìÿêÖ5~©žK›O¥{òìí.ßµoxmìÕ¦è¢"°âqÈS˜øÕiêËJ½eœå—Þr•·Ô5u‡ÒÕ‚ Â<™{îô9_÷Jß;E8ñúuÖZ}£çe„û®>¯ÍÁ‘ðÔ•}ÖXw=j.á?/­_·pÕWÅfòÔDÃów>ÅÊñlXðÕjO­gçw-ïÝ|!Š€g¤'}á#ò^Û©%v{ÎO 1Û*4Û¾Þxœ^>·pÎ<Û ²N«„›½í÷&Óã+³oµñìÞ<5AŸM&º˜Ò¤uJ=%Ns)ùéùð›ÿþ?ž¾ûüü|ØïfŸç€|7Åœ@í’r-ÒÞ§ãáùø$'Ê1/χœ3!ŸiN;;Ÿ<ù¯ÿñ·!îv;-Ïiæ~·{Øïˆ` åRj`¢RR >mž|N\ªTÊœ˜%I˲ À}-?ÔðâI–"?çšÕ"„!& :]Vim½b=š ašQJîXB‰“¯ …ñ4ÆmBY,[ˆÒùÝ63&Ô…ÅI£ 1Ò‰)Î{÷i‚’àÀDN@2sÈ «Í gU¥ød¡g1PªÑ\ÿÇàÐä6tùV~€Ùô-DQ9æ¬Ê‡éáXÇò¼K‰°Ìhf4 Íò®ÞL Âýï¨qÀ‰µa¢Ôvm†ŠÇi¨ï{S Jh‘Z&àpŒeÄXT”#°:B刚{£©±-B͵kp‡9 X+§œµp¢,ÌE`«–@á¢QOB@N[€£ä]`åQx´F'@#¬¹dC4:= ¢Z·FH!%2€ d ûʬˆZÈk‡L1Þ#ˆf÷Zd‘pÂaY%h 1>ÍŠ‚t€äD@jÍ#E8’é°Š¨ªÉP’vRuD2ºy5¯V¼r"ƒpx¥ &2f9ˆ‚]ñeÏQ#Éón÷°{бˆz˜~•—OÏñ‹lžƒŠ¨-Ò5R¦ï, Ê(ˆŒ@Ï×5GÊ'1½3²†~ZG¿‰4þª×·´€AräÐÁÛœÑD^3h,µJÀÒ@ YÛh’z+!Ä(Lr´wõÜòuaÝã_ÕKqí,µ§^Œž‘Ý‚µñic«-!6=-˜½ù@’á´€ 6¡”%Ò>x›O4²¾;…i|§¯½÷[€ý4ƒ'p†“)œ®‚Œ“‘3§‰:¦Y;Àª™¥©Î;í÷^4OݦäS:¤Zö¶ÿ›€Q¥ÔR9Qó”j-Üï|— hVZcþÔ‘í¡·Ðë¶³DA»í#jºä’kÍYÑûÑ|Nÿî?ÿý7ñíJ”ìõzÃëòlkq3§I›åε«|³¯8Çöïtsʺû¼pÂè ©ª¶ >¥Î‰/fov8º…Aá …‰Ž÷sø ¯7]+Ýè yjô»4õÜÕ"Îè“\Û¤ñº]èògÖN®»î±-ºXékÅž:¶×k÷hÔº…"]¾×E«ëÅ!¿\Ù¢‚ø†ow~õ²÷åžq@gÕÇK©hÇ[Ìfcv>x„Áã²à=AmI^¥É» ‘s9ìòžçyބޫ`ŠsÂè›´ÌuCqñѯ½Ò<=[€Ü¦7°’¾Xpç '6åÈk]ÿZ𤠶×#nGeÜûº}xƒ·Å W}{·^Õ'^Ñ4ï]™kQðÞ]¶5tO†ÓFLÒ™µózÖ»¡×P\WçüvÁ•/T]Vcû«CåO:ÿ*b¨.H#Â÷€Er k_žµn¾Ô —2™ïu0\Ì{_±2t³$sQú1õ¶ô²ì¬‹gÙ $‰^SÕ6ÓÌkˇkŽ·”Ý+%ù…úлe··bm¸­N¼ú¹Äá5×þæd¯7ÜMv¡^ø0w"‘®Âî¬etS×Ý,·sç«WøÁÿ-X(ðß:‡ˆÝb. ` /j0¸sÞ¨áleõÛ,£ öÌíóË—²æG74tŸms!_õÍ¡³yqûp¼Ø÷è’ýBWh”/îê¾bà(®|a;â—€uvMίÏq~w$è³ÉúF_êËÏÜHï¸<9­Û„/ŒÍ ñÍ~³ÏÙªû×›{¼°³éUáæo5N÷ååâ)láœúzkìÞ[‹½H¼Þå] p•DÚÑÒ¾ÿ§_ë°ÙÃ>•šM¶Ûí¾ù0ýðô¹Ö£èfîiJK96ùo?=<ççPzM¢S¹£ÅØ"Í!Òõý¡£Må]»CÖŸS‹µ4·Iòz m6ßÁdfN&X¢9j­‘Vë³ò+‘—¼¨™ñmÂn‡r’ÈÈ µÔ¥Œ4a?ï%äzèÖU"ÙlHÇz4sÉÓd»‚ʼn¥Ô Í>Ãz˜¼‹€³•\ZàF‹O(êØ“@w7{ŸB”€Ò¾OC±†&¸à8ªr†*TaäO8>aÿˆy‡OOòŸ3´ô¤Öv»¥¹§ÂPJ¿ÕŽRj驈\-ŠâSÈh%ðD=)2˜ªjOU“£ˆ$ƒ ÌU«u‡u!%í@£ÍŒ"ðýÃí̲”ÉP÷P,;z2E+‘„ƒ¢s ¢&ŸŒJâR‚Q3“Yr”¬²2é@µê!YªABUjäP€‰ìÎxaO/ªƒÉ‰€“5… `Ó„2a÷ÿgïOÛ$I’ë\ð53÷ˆÌª>³ð^‚|.†ä|ºÿÿ§ÌÌ]x‚ ¶FwUe†»™ªÈ™fæn¾EF.Õ]Õè@v!2ÒÃÝU5Ñ#"ï‘7dR…H‡ÉTûÖJqGW MÒ²ÈbLÕ¡öý~Š—É^"Óeøî©óalÇ #Y¾ß½¯m“M¡qdCvÅ8Æ4Úu{+æs Ý-ÆÌÖZ¨V´Šlgƒ%#Üàsÿ†ï²šp[úlN+ð’u«`O„ DŒKÞ(mZ`8Ëëר ¶ —„Ÿ 4ï°Ê¼ë\X ¹á&ߋٴÀ>Û€ÏFm ÇZ¬4'ó5‹pnAÀb½´;äšN˜ÓbnàšõÄ’ àID\Ÿyeó“SsÀré_íªˆyM›Ÿ”Ì`=pB ÖÁ€¬˜í´½;{/×Êa­- sæoVƒÍ—äÇÜ-‘c, ]–t3ss˜ªžîÞw;ë ]²Ãhf…}é SCí‹wÆÚÞÿßþÆ«¢+!í™|êgÃ/.·9Í#Ìê?føÏ%ùçR|*:;WqeFdÖ¦TL5#³…éþïÿæ?õ»ÝÓ÷ï¡\Iè8ä<ŽÅ_ãêÖæãŽs)ÆF¼ŸásšðÒÙ뼕¹”|EÁ#{/„º‚ž_Do§º¿s ÙpS¥ù¦2ɡŠÝ§Þ†kÝÈaòc¸{?7šò60>»,%/º7rn+Oø9ܨÎ{‹4×äIA|[öCš(¯èÛÛ~ß7ìApÿ•zÓWä~€ [~Q·‚ЕÝÚý€/=¡m]ÝmZ+˜¢®K¯×~}B0}›~»®>\sø¸ü }és8;‘\-ê”m»w±Ý»þUðk­ðÍÆ–ŸÑ¦¯ Žíá# ·­÷ïÝÏË‘úuCç_íwÓu¸Í’ñîhß*‹ÍÃåúÕƯñë*+ó¯ôç¯_Ú×—y9üùëW»}u€ö‹Ñ¿þ[Äo÷Fü%\–MÄ{± ŸëZ$!3ûÛÿãÿš^޳¦2o|K×ë;ë|üxœÆ©ocˆv8¼{¿ønè¦iô®ô}÷òqQ§úô´íðáÐï†ÝSï@CîŸûaj(&ï^Ô†bDL‰—ÑÌú©¡¥ºæY2þù¿/Þ±”bªhb"[míMY+VR&Є—šýä¢ÙÑPÔ†Ò!gNÅ2 ,/'d`Ø-íÉë 䩨V‰ˆl}?ô]w‡¨])R>=í` FÍÉ:ìûýaœ°"þ½£R3ÂbÖ;G&¢!*|æùìPÊ2»I¶)[]ƒÉëAºÓcŸÍÑä@+Þš"DЂ‘ Š™È±F¤ÈcmSÚÊ+/Žée©ØIå3ƒÛ „7Ô0™C™š‘âfnÌ4'‘ÅÝ ˜Æˆ2V{/9Ýë‚IbYl&çT g"y7—,¢_õAÈÎ\‘ùÜ#à3Åà&2ÌxŸŠ bRT´Œa,»§2½ÔñÐÕ˜ ˜É*4±óY_S Ñ€fsY½CS›½™™Âqæ¥Ì®±¦—Ô ðý‰Á‚H§\ÀFÎ6‚:z* àôÞ8ej-·`ŽsšÖ“-£IuN½@¤Ù)Ò¼_«¥fÌ…r" ¨ÙÊŒ2Jœ²„ÁèV4+´æ²D0“È• {f8 ²Òê~íMD3DC²‹W@Án°0%³‚„bнbóßÜÔ‡lëÁµ±á3 )ÄÜwå° , ³«]×jT€…Ýtþ]CÌÓ9ÄÖ¾+ž’޲8ú"©1ÒL]Aï.1œ…Þ±£Š£ ˜½wŬs”2t€;Üû®V#ÍsïþoÿŸ4³Ù«° =@Á Ž"(§ Þ’–š3"|ý)<‹¡T¦-bjŠŒÙzž(¥xñÿù?ý§çß|Ïs‹íFñ4ûã…©%ô±©æ·‹¦þ{1t)±4¿]Xû§¼ëøå ¡WkjG?#ôç)ôË>´?fìÊýs…ȯÔÃfsÂÛç/ˆµö3 Íß:ÿË9©«ÛûI÷ã‹6¬Oòì¾(;t·ÛàØçr^õ…|Öç–Ócõó¶¶àœ»Oîªß=CöÍ·'(…Þ !mm$O囤ñe Žcó²ë~N\þËŒE÷2¼çºùØ7Ž~â̺=ó Hj“—Ü< ô©1|nœ¼¹27g»î{>áV´I?kÝLé´å9éªãu­æ=4»nCÄ×­tï/[3nêiîÕCè²ïWk±µ©ú^ŽdCÏY.5ÎôҫÙ)[Ø~èmµÎõb ¯k¤yIiº™?çf½ë§6Gze޼-‹ßšmOöÍ-ÑÆÂò¼ âÅ×mkÕ[çÇÜÍúÉ’$lªÌ±¶m¾eq×M{Çm«÷¹@׫Äe!ÌÕzpýÞ—=8­Ê\[ynr¾É¬k©'¸švw[·îȧOÝd¶uý´¸¬•;¯~<¯#×grÚÍ^Í4È™cÆsãöšê¿Ø®ñ²§üž5óÊìT“²6§Îk¶ÎH‰+c ©Öqj‡>|üáǬB)–¥ã® CO³n臉µfm}ßïöî7ÕÊ”%¼ëö~çµ6/½w]Ëh©Ãqr/?²µa×uûa×w¯Ç‘nV¥Ìœ&£Qî*ŠÉ-iPDþ÷ÿ XæLxoÊÖ¼'$cF#Ž™c¶„gJœ![‰ØÃ;D¢¾,žºðµ ¨#HÄ„Ü 8j…€’`‡©Í ùei:i[ÌÌ ­% îfæãt„Òhî%‘¢Th«ÑèF`Ìc VX4½´l‘¶R–™p¡ï‘Z•w†~O¤E] 6gemöe`­G ‘½/}OödÉ”@ºg¨fUK“jÓØâh^!1²³Eµ‚a”lˆu³=%èðÏÏ=L8dÓÊl<›ÞïÍ•VeîZ !ÙqWv¥÷¦†œi2D$@wfÌü«ü7s…ˆD !èKp6@(¶:'ÏYœD™}•$´¶QÚˆñ#ÝéèŽZ›4×8GC«‹È¡¸€Ye_žÄ,ˆböÀ$µäiBƒš¬§†ÄG© øŽ ñ¼ˆF ÀqqR¥Ðhé´Œ)ÐÌ ì‰$Cúèi½{FH3€]KÎõ4ÈÍœÓs1 ÆYAv×¼ZÎõûMÀÞ—ê43•œMªIƒe  ZÊ$€) ”¦ÀÌædÍl¨pXV ¥™ºÌ¤`“˺Œ”åÒ7b‘ád–Ä®·Î2Æ= þÂVêÔ½d©ßw¿9ê#ò˜nÖuh#ò%»V칤GTâÉž+kmGZ1·h!N‚Æ—±«hÙh’”ˆœ™NªpŽim©é–vð~Y¸½ |þ§…5ó×–NkH +¢jD$ Ô¶ Ã"qt¡Fƒu‹¿ô<©ÝV×nƒrýI.9g"û=Z… -Çf³ÕÇÊü¹XÈu 2ð\~”k´6—çƒ:ÐÉ8/6'Wl…¸ü«oòs£À¼HæÌÑ"rvbà@YU6›yL(ËM7.à€/i×¥mÂ/ 7˜F :lÀl`îa^h¥°¸%©"˜ÃÜX ]±ž^è{)ì8³¢`–Ì„»µbUŠwY?»¡Ç®Ì»dH¥¬‰38AC·Áþð¶¾ý*Fˈ¾ŠTÔˆÑZÖ5¤$饔¡ó®üÍÿú¿ž7ˆëÎàNÇäUó*ïW—è:@˜£¤S }8›®Î5»„”hk Ê…P¦å¿W¼­¹ú¬øvã©3êåb' «½Á+—åD¢8Ëß$¥«›tŠšNâ ôXÉ8·¥¯h¼÷é·ê‰î´^Ò^\žMÓñMñõ¥øÆMÿùM`#Fë$QÜ0™¶¬/LJ<,s^¸4ñYÑÕyÛŒ+]^j8§ÈY›€;v ºJXn÷-¯Ò?Db3î¿f#÷KÊ”6{æÓœHwò—÷ñê'w¡:’DzqçÍ7óüÖ’õ¡=ó»6—‘gS@nU”7V4¿"´Ým8Ø vÛ ¸æueì}‚÷r³)Óf³¶ô è®½2nïæ#¿Ynw»w€d׆Ûs95„ñ@éñ|äA·íÛÙˆì'ñásñ¦Îž{é«óbrQҎ붪 ]éæ~¦M߯'dÜëeø‡Î¿:k ŒGÓv½×]V|ƒ¡üm¦êq€ñî&ÝM ÜÞŽOvÿܾóíüº¬Ým¸Ù.˜¼šï ’d¹l=šªçã&_M•á rÿÝWëâÿãZ¹ø ×I‚+XÅã3|›æ'ÎLžR7ˆ÷ËØƒ78 ×jmß³\pÛÞpñùö:‘‡ëÊ¢þëæ¢.köI§¼= é†ëDñ&vã£#¿ÊläëK¾ì.´rÆÖ ŸëQè­à¤ê^@¦‰7ÖClס‹Ö¶ó0¥ŠyõzríÕñ.]MAžá@šUæuSµ¨v+Ší«ª¾âwßÔø¶6%~—ºŽ*^Ç&¾Ý\by6jƫ۬ۋy/Âí ãÅLØ|wÙ¡yAÃ$®²JF9‚t }÷d°_¦ҕˆèÊP¼©l­f=4€Å:“eD”TX;F›0ϩڥ]†p{”àkøë gÉ3¨.T™Ù2Á†z@D]RŒZÛ‹ãî,ˆc­O/¾(×Za_NÖƒY5Ÿíµ¹d³$¸£ì ÀîyðÏ¿«j/ |•ÅIÏÖ¾sja^Læ¥Þ´8èºÃ}Q„=Q³UùÚZ~[ãÍ÷'0×ÇÖ ;_ ó%÷`{d°´¬é;Ì®ì3@é¥BÄþyYº³åXdK+Ëâ~L|5(=8 ïÑ>Ò;b’F3šÑ­3×`¥S_LC¼Ð‹™›¹›“–-ƒP)ýÓ{Õfc°ï¼+¢)U•S‹÷{¹]†<œKþuþs?²’ZKdf‹Z[Ô–‘³Ù/IþÏÿùÝ_þf‹Ó?ùfq«UÍz_‹ªxQè¡R·Á¶hK[Ãïx®oѰÀ‹ÀOºÚUc->Þ ß+®v,J9oâx¾¾™Ã&ÝÛx^ü™©}kòô`“w¢Y?xýk[FÞ—J/c>\Œ.·h—BÆ–àqªá 1I°ßçú—×I•Ÿ“¸°8AP?Ý(ËÛHúáÈ'î"Åñ§ø _7[¼‡N7‚Ô\ê»Mà”à¸ÇŒyuo¤7ï? “½Vi?%Ýœ@6×ãƒç²·³3Ù›«t¿Q´6Äú{²Ô7Ùo(G¿+Î9œÐa›÷¹{¦·åmzì.þÞÔ[Ô¦××Á/ÖÃ8é]ÛTlMA¶c†K~U—ç·/ðãý×ÿ’ã¹GOÆ›y>¿RøÏÕT}VúÊóú3èÏ__ÿûõ €þŒ*úòÈw³ñàŸ{pÿ5ÝùÍFWÂW¡Fy¶»xSîq I—:*nËžH‡ã”ÇñüŸÿm[éÊ~×[g(Ý\¾ºëûz»Á5M9µ§w»aè•y8Ç/=Ñ=÷»ÁÇqÈé0^Æý»eš±3Û÷^þê»é8Øíûãa<¼Œ}qdÖ±MÇ£7iè’–/ÓÌô˜ fl¿ý[µ–Ld£×Öh)ígŽÑ-rLTµd‘2™¢CÄT¡ ï°ûMÿñ·Óპ¿C®œkÎΕ¹XSzA¡º¢3Â;2Vbx,z+rqûô‚÷ïöŽÇ©EICñ®ïúâ&¨¢õ}¿ïsFÛ•½»'Z‹º÷ý4žv;Z`Èqœ€´Çáý/ȶÈd)°Dןîç©|“Þ˜ÓI#™¢ê1àP’ BNÕ)©F§Ã?¦ŽsÕVðøE}.È-eQÿg%‘-²!µE¯Oï»Â`J3J½ëzh"­ŽÉ^5eé<À$$d,6 ó§´Dg€¡ ÎÅ»u†¡ç\p; ‚¶PcvD˜À† _0“ZƒµªN̦8¦A‹@+ŠŠ˜ «&Asʧ n¢¦ àÌsÏÐ bJUi'#ÐH±"²—‚< :(`'¤ F®äÖ2\»àP dŠÖ‘ælH½[ƒKdH½ÑaIEšrÙu%袨N*æÖ@E"œd"[ª€‘óæ@eÎy)#ç*W”²ÐRéZXÍ“­¤@ BLuN/æE‡Y¦‡‡wöÕ¼XëÈn2'?þ©«MÐË;ºþéc~  ÊÜ÷Ë–€•0fx©†~ØÈl(‰ÎJSkã-œÞJX+[ IÙ“T[².Ã{nz2CéÑ `Úâú`³ß/?f@¿@¢%²ÁÍ  5D"'¨-ŠÿÜTUÛu 2gÌýú“ùSf[oëÖ„„Á:hi@Yr"f²Ö<¤—DñÚãâe±кÍ{ç\‹wç¹°)ó<[ kDCk }NiÌ–ÅXöØ[øØ(_«ø3üçÏ_þúy–Â/›Y·¿¢]íêÜÛíçöo «^k4ûÞî‚ À7ƒÎÿqÏâ¢çÍ'qÕñp7sU3úJÆ[¼ˆÏ×cŠo’Ø(º1þY?ØÒRøHºÍÅn}\ÉM]ñ&òÔåÇéüó­-ûÝØæÞŒý¦ð­Ôç¶2œò“¼õÁ¼AÜ\T|NÖ|›•î_°×º–Êî+Ã[Ýbi.ÿÊ2ël¼½ukQÄÕ*{‰:¹(ðnêýo}J—ï6îß.þ}íÿN;É›êæ//âmëÆ+#ò¦±íÞĽ×ï< ®oïÓM‹ñ†3Wn܃Öß›K´ ÝÑ‹À£òݶ{>~ ~âð¦Ï梫ã¶:†›h}sìZî±iøz ûúãðáêD^WÓ_z@oï‹ÎóD×i•Íný2^YLÛ?›á³~7uý×£í&:ƒy¶oŽÇØÛ Щ½ýÎ]Ðí&o°¿¼©ãÐauò Ü2ŽÖ·‡#Ÿ~ûû¿ÿ1¹¥½sCS†´{Þ O;£bÊ?ü$òÝoÞ¥8Õ6½L]g½w//‡ò¼_&•RÕ¾ÿÍn¿+™z¯/?|@Û•Þ#B-ëÔ •â.Ô-Ç®ë„0Z´šÇ£õE,Ô~÷95(ñT3ǨôÌC4cfB•¨`5}!HG.U´0$ñã?N€Ê€ð²˜FRˆ€Ï¢vC«ÐšP[ô÷\Kh³¯ó¬Êu=HÆCkÒ (X±ÞûT{©9°a4še¶d*á'sð¡ëûcû¸³§ØöÓáP§Z§ô‚Hx‡â COuU§æD›!ø„Ñ`šräL±’”ʶÜ` ­˜B°ÖÆ­ýD|$&›{Ú"AÚ,Áç¦|ØôÚ‚4!á3=É9sÉÍÕ»;„dµEoż ÈÐÜ p„gÙE«)‘Ūj¨JUaëB(̕鬜¡¼ µµ¾87Þêk"G $"ÓÂwÊ€*ÐG  ‚5ÄD¦`Ë…%á8Û0$‘0!“HJBÉLR`¢…²D1ÑÉÄNéPE†P(Û Ó·ÒA‘œmN“`Ò­¥ª¸‹Ì¨D¡M`_JËÁ6›Î`n9 f³[@z²£7e¨9-•½3™¡ìè ž¨»ŽCŸ™Š¦—éð݈l„¥LH¦r&’»Ïù€.ÓÝh>ä‘’aNÜü)Üèc ô&O뇴ÖÊÊ ïEv*Dæ6c”ŽÇ& €èŽmü}+Ó.÷MG@&Cl4¸·÷¡ù£5Š 6µªgkS ¤B•Ñ Y Ù4Oçù±`ë¨.³$˜»4Ü–~tKòÏæì `D‘ wdE›#Ôä´B$Vð¸\©gLÿ\øls?3¢Ê7Ü*Gä¢"[ ‹‘@®ÅöV–¤×lűÐuêò1Þ-8BÍ¥ñZuÑÀºe^,ئ\æ{1ÄÇåqånÍsðràM<àkö8 $lÀ¼†,>ɱnYÊrY¬C tm}’”\¼ÖçÖgÐÿÜKh è`Q÷:Ø-9ë0¯<„` ` ,‘D§âÞ¹õdñ® Úy´7W×)“‚Ó<Íû÷v˜RðHKšYÛy¸F7Á˜R^oÕNÈõ©òÿYýψ“úµE ’ÿî?ü‡~èûýðüßëdæwe¬:[7òÓ5ó7+¸­wÄú[õ†«3äæ-N`K.#hËÜÀ…_î¥|ñ)½·=¾.ŒÀÖɧvmÔ¦âllxbᆆ$é6œÜªW…Ä+¥« ð§·*×û›ožB¸Þ½ÜL!É̶êÂ)Pç‰{ú‰$â’éúÊÅ\ìÒ?5:^Çé\üUÚ€sξgRÐíg­ŽÌàÆpùU—Ñ+žíÝÒ¯+H…΄ × …^kà¾[õ|ý‰¼á‡ÞÕ+·ì¶›a«´½*·½nz¼}Ù7©5¾a5É{ÞÕ+ïâz´íxeÔ=…·#ðnÀ+2ÙÛæÒõΑw:ÄÞ*ØÝ²‹uã}ž2Û‘ A0ÓÚ!y1ŠÞvS.Æùë³à-¯|ûk>)7ÿ óWŸõF)uÛð¹Ú÷éÅfvyä‰Ë+€Ï•:^4}4âÞE{4+_¹ÂW฻GuwxoŸŸåáÈ%t£Ù>ì¹y4÷´aîÝ ¤®a5ÂÕÒñQ Ü3õ¾ëðU•_ä'³ Â' C«3L›·AÉíÉñ„Œ¿}âòe[®÷ÃÜ ïÅDkЩSµᬮC¥÷þuÐõ;?¸:úŒ…þnSÒf=¸cFq)‰_Á(uÝ«¼©âùóŠÕvÞÀèœÜ8âõNðqfàˆ Kèþ*}ÞÝ‹Qt‘ X“0yyš¶4BŸÏc¡«_ Wt²8¸tqÀ–rô S!ÝO7½A¥íîä¢C–÷cÎ+TÑõ“òú¥ºAÙè"éqù4âÝÈo›xº ,ßr²'®'Ïÿ|7%¤-܇§”Àå–‘wV§íÞç}åUNdàó'm; ®ãæëÇ)¯t¬>Œ·¹‡«auë^ÿz½Ž™yøý‡û;e’†¾ëûþi— BCß—R@”aÈ”9ÍÜ©q:hœ¦—–r€c«¥¶i4Ån¿kH•ΞöýT¢“wÖuÁhMµA9ô29Žíã± ÅŸö68k9üóßëEr¡&:ÂÔTkL“ÆÌDc³bCIªeKyÐ2' gø  Ô,ë]5D›Y ‰¬Ë]ò²˜ßš-茥̖@+«Yh¤V…® ò²3eiã!¢õ]v[ÆÓû§ï¿ÿË,yøÝGLY«ö{ì0¾´::Ì{h¶¶¥,ñÅ¥NFy‚lFJ„^:7³ÈPΔ5«ˆ4GjÊ”[éH“?2§ ²Â ËgÙœAˆsÕ?±€wfš‡õ°n‘­C$ЉŒ”…Œôbn½9]ÃT†¡•`mÓc1:L̪C32i0/&.æÊªPI$1%z®–¿æÊùœ}ãÓÙ:€&´#!˜«ÑbB}ALÌŠñ£úÙØê¡d …LÎ,u“JGB‘̆H´¤S6·ƒ@d÷ ƒ«‰*TPá"‡$€Ã"~ªÐ µh/J˜¥4И@*”ìatGƚ娩%´3ë7ÏÌHSÎÕúDP)õ4@ ²Y‰í<ÜÑwÙÔF4…`s‡Là4£Úl!¬„!òL¸ï¬TU#è]f2¥"³ ¤X¬"¼„ubSoŠ^pYfh–*rG Ô¥ÙNž%­•¾îûÝ_´}|œ~;ð©ÏÁ†]¨Õ–Åìš„[æôI•Òi5¾&Fq•tô°„o5I9ƒ VØÏÆàwV6¢Ó‰´ÁÝ Ò’ŒšÐùÏ=†+'ƒ‡~“¸c'z› ¸›´øâzùOÓðGúúú†Œ? Пû¿ÁõÛø¿u<ý1¾^u…à+Ç«ox†üƒŒì/úÝß­œÊ@ÞrÂ|ëþ¾ôÖ•WŸÊ0ýç߀¸¼÷b^§‘¾®—þMMF|<}=—õš§ù9ÓHK²ñµûñåP_Ž ~ø½"AôC‡âýÐyï‡r¾ÛïaÊÐáÃa·ë¾ÿ.LJßýôq(·®÷¬5 ˜ZŸÙ™¿üðÓøÓ‹¶“ hùþûw»}'!£ek“²”œ* Ü:ú¯Ü ífl©¨a1;Òf²µÃÔÆFE¤ƒ„Q(vÊ&¹Ø‹'¥ifYä‚tÏŠˆ¥Ùt®dŸï½K•ý¬‹Í¿¶PA ÈYœñÜòE‰>1CÝÐà½õýi//GÎîû÷ßËÑ^¦}?Z¿ß×àñÃO‡¿ùÍ;·îeü8ŽÓ°ë ºâ¥j4æŒW UH‹Ÿíœ˜õîÙ·Örš™u½—Î{‡,§ © ¬‡²ÈI#ò£ò˜yÈï  x @ ‘¼”E×›Ýn}·TøjVÿmÑ1;ï%¡$;¤Z*; B†`æBDÄÆpOí÷C"³©°S2@µœ{̸xª»  ú\DÌ…Ü¢¥xqe(ÎÓ„‹G±L/˜ pø¢Ò(TdÅØ˜ ©¥èx¦‘€sÖD)‹lBMìÃ)éI@Ø$A0pÊYk\UÐÆ ‚B•:iä’L. CæŽtPF‰£x„¨°ƒôäÞ{#é3ÀgÌ,M˜]Q ,±§'ÈHs2“ûÎiV2­$Aw¸¡$j¤;¬01f÷Á…D¶•ŒLaRZÒÍgê“Ó „› `ÈJÊèšú>÷²<¢–T/UL&/Y„“«kf šKÊ>¬L–Å"y8þö˜•ð§þ/Ì]à·¡ò¸·§¦É@qŠ&Ò’cE^[wÞÆ¨¡1JzxLBKe‹i?K¢pC7“¬Öh=…6§ ôùG –,ל lÓbvÒ¼øÌ`®$‹ÁÌ,¬…àÜ@6 ƒ»XW¸söè‹•¾È庉³å¯œÓþ=:Ç®#sNŠdK7AY|±FÍvóžëýóuîÿ‚ýQFDmËŸJÑÍKÙ¿z÷ßK«³Îšù‚ÓÿL`àÙlnS~üsì±Ïµ?üÒŠß.ÄÇ·€#Ýt\h‚¿È­çmáWÊ—øT”þòõ–? ¬üOòë-“ñJ`ý¢ù«/{ /Ò¢Ÿû¹Û߯#ïè-wv“.¸ìã×ké´_ѽþ@ç¿L:¿è8÷oü*g÷#S‡Wœ¯²#ßðÄ¿"°IAo bäØõùèöM¶µÿz],þ’WýgúúîÁYê‹ßâTÔû–‰¶a€,¾4¯³qþÐä3ä=OÔÖÑ7£§¸XoˆLyq¿O—•Žjm¬Í Ù?¾ øT›¹Ø¸©Q¶, bŒÃ?ümé,²É¨Á5µ¬’KŠ6Mªcä$ÕÖé’e›Â`Y–RNÍ–­ÈÅ%’0«Zeµ£\Kq%P+jÃÖ9‘h HÈÒ >,(ð“}èÖ$`VÍf¡ðÓÐõ+¥÷‚µê~x}7ì>üô±…ÌÚPJù®§CËön·—RxØىhÈ@à†˜Özü™ûsù0AïÍ:É¥.ªÃ!3DÆK =³I• )€D«bÂz¤ÖzÿU¿ËsF·/¾ Î¥ÑÁ;(cÞyÎÔ&‹¹n½ÓEéfÆÕúÁœ]K™,ë–t3ˆÊP’È4–™&¸#­¢”2áŽÞ–t ×ræY¡œ«¼gY³Q˜È –ˆQµl€Aa2‘T¶ì1Ù©„(-±­£ ”Àœr>7¤p„”Hã@´”˜¤ìÉ)•I/Ò¥döf„èÞ=gZ63 RÆN‰È£CiÐ"×ÀPJJÐPb•*´ë¡Éj  4”ìL€%‰ÎtŒì¡‹/€%ÈmO„áe) ‹.5_ûÈRDO ÑZD‘j¤yÉÌ¢|êJÂÄ`% kVy0¹½Ü¥O»Æ}µV2 VLC¤ÃNF'îìùâ#¢eÓˆÖu]ìJó®wt³Xô&y¨8v]a–ä!yhuÊ6øJGÅT«¢¦¢IÚêÍ;ã纊Z h #±d}œkfH(;dÃø³ÓÙKðYúçE»áÂÿñu‰ö_ æië°¹ýÈ! Úb²}÷£®ìþu¿l«…omÈ„ÔX*ßg.{h6ÃX áú™N"BÄ,#Xkí…ÃO0ƒ€w‡•12`öF^=dæ.=@¸A«åïœ5  +«_ÈrÅ¡Ù`6˜—â\×¹¶òhöž–¬çî=¬[Nœkt(ƒ€ Kù’ ¬‰î=«ÙÔ:ôÆCßJÇRÜJÈ1t–ìFP¦)a{7Ij)!ä]ç$`1tI"ƒc¨…z¿Ž2ÏüŸ×à?gìOä"ýO-#yW¼+Ýнû7¿9 ö—³µÔò¢UûnPuQ¬wîY4^@^f2tÛBþˆWqß"}ùÖ êܬÀËÔëÛˆÛlÈ©9ô"TÇÚi­‹š;@oT€×J}×z^=pæüv¥-çoÞ$æmïãæP}FP®›Âö;‡÷³nVWÒíe;æå‹7ð×äkïݬJ_—øùŽšWÅ¿·ëÞ·•io!*·Ÿ~_×»JÉrK„½7Á~~yYÎî“æ¶Âú“ìò›ºu=±ËîåÎ"}ÕÛþY>¼ŸÈ'*·,^ˆ~[Þù}èÖ̓ãíƒêO:ÿʉ¼¢5ž:õ6N”o9’ûx˜Ë\ßrú÷¥§{ëó[z ¶ßlûfîºjßr™> :s9J®œd!.zWe÷âÒ›0W¬Ã-)F×Ü{ðê)‘çç¦ c«Êò î­æ§!Þ[èu5ç.ŸþW±ÂFÐ$?-Ùó2"}EÔ½¦8Þ'ñŸu­¹®Á¢îå=ÎÕ6««Ýu¦òü:Ý;ÆëCÀí‰]^Íó§Þ„ß7F·)Þ—‰×.Ø Õô6Â9‰³%ÙoáDëÜ6ün0n—ƒyÀW±ñ¬•o§îɧ’ÛM¯•\ž‡!Ï£éú–ë•§-/¬ç7s‰+’êÔ­{4χAðÆPX¢S }‹L•®<N׺É_,-t ê2õpƒ¤¹¼×fºoÎwŽ›–Hœ/†2ïÒÿ¹}’½®ÇëÓù™WÖXéÎÜ¿ØFêj~ðNNesÿyïý&ln¬Dx?£y{ Ë¿úáåÀ˜ûÆÏMõ¼·^%Æ$Ý™èÚ<x×åúÑyo½ôò»ÿÏ¿_Fw7ÒÈç§}·ëiäá8ö}‡Bzy÷]ב?þø±3…x¬ ¡6~:ZgÚu¤86–ÂïþⲕyÊuœb’ÓØÂŠ#¢ëJÿÜÙ1µ|ù;ÇCMwa–p,ê¤ÙZæÄ2Bc«•–Ög« +F¶”w!)Úßr);¥¡U° ´ ¥[jÆ‘ ;š€ÍN˜Ž DEél¶Ãœ‹^ç’ó…?kñŽEGnà ehj­6³â¢ÕbŽt¥ß{šüùé]²yÁËtœÆ:øžÈ‡CW,0Ayò˜µ°™³_§Ë•Jp_‡•-•Èkü,ÈÍ@:Ùità‘53J!fxN]>e>£Y¶É3²Ü èKž`®A^Žm®GƬúÑ `™NEzé¼ëZfkÙ¢…ÕîIMIßuÖÑCjhÑ`åxPçpX0’ ÑÝ#Xå¼ÞB&h(|Xê£gú Ÿ—Øz@×êéŠúõ…‰å's‹ƒ%:[Ðÿ1’D)$´ÔçÂW L•´dzP`!Ž'v¢Øœ†ÈFô¹€»¨pi0O02;d‚e}X4*3J¶‘%èݺÆvî$@ìŒ H³C„ƒƒ4#EÌ©rÂÃ`ê44è;²Á2 Ì‚2È$ ¡H4ƒûS„Ø3=)ž¢@fQ•›h™-¥Î­epZBùâùÛZLVLC%­Inl»L! ŽÞ‰ – dABc(B°TÏ.KxºÆñ#‹†òþÙßæÞ¡7+¾‚=‡ª:ìwæÍ~j;[=š)HcF y”&MSDR™¨ Ó\ª/´µ’½l’¨\‰ÿ¾šg› ÷È„˜PP€Dkh#Ô‰&T-TžáïËûts¦a6ÆêJ=¯¶À¬ÎÛ„´g6[h‹^¯•Z§Œµfþf3’Ù X åÚ°º,é_jçmMfÌý|ˆ1ûŸ­!ç²ý5A¢Ë0Ö 2–a΃º "søœÒ0(Wu~m²uGâóo•s N[Z¬æ8Oo‹p‚´Šñˆ}‡n‡$Ñr¶g ïh¤uÌ4!’F#‹wî(E]Û±4ôôbæ%­¤1èI™Ê²ÏHÙbÉéÉóy'@s‡Ë±EßÍøG¥ÎîPtA)lá?x¬þG¨5jDm™I°t¥Û ûïŸÿúoþ3¤ûa o+gx2 ä…w”mšæ@qFˆ-À7ºŽ%7;ôÓÎN—[~n_´lÈ{šÐÖÈŒ—ÖûFIÜÂîÖ…¼Á™^ï}æµZ—û•ÇjÎ-â®õ ïJÙÄã¯3K‰ñî&)r§DF'ðØi«Á7¤]n6‘ë¥ÖåÆáò…g±à¶‚ìÛèÍ<Ðhkù'ŠâY¼$J“oª=¼£(=Þ–àF~½duR….'á«j5¿ py‚_¢à“¼ë”K¾rYÎ O¼Ÿu ÝcšßÓ”ÞD÷~™rçòž‹ØfºK< ùêñ+,ò[„Ë Ñs·`ë–ntWY¾ýá§sY¶üÈ-`{°wÒ±×8¶ûÅþ b}&豞{™âÚP¥©·:ï–ï n0t@ž«‡ÝŠ+ú†Î¿’Ľº¶wßÿ~2:‹[ÀÙl®7ËÑÛÕü7^ÆÏM@ÞÕýïÛ^1>¹;•^G'}ú”׫öõ7Òá Ç{Þyky‚Þò¢Ï.zøãFŸŒÆß>‹õø³R´é©¼Ô >þîÇû{ºRæ­rÿ´ï÷ãËhÏeØwõX/Çþy¨©ÖÚá§l“ ¡ì†AUp–íåй9üߟºÎ]V:szúÉœ07³ÔññŸKññcÅ$½X¦2k*"‘u‚ÆãxÌÖ¢¦Q"P k$@mù!VÂÆÌ‘˜ËoÓ€‚ÞW±^1íª±øZr®:o@¢ï»bej£˜&ËH3¤-D/Ëå4G,0G(ÑÞíw™9§x±¾ï;äIÊa?}üÐyAÒÀ^ `|†—ú±eÍ“‡R.‚cœ°!ZØß3â†s2ÃXœÚ”^‚V³èÌ(Ed»˜&hŽI-e¶³`‡S¦$—+¶`RlzÏ¥ù`Z¬[ªàl¡\ŒÅ” Ø©Caß?<Û ­ë[‹TöÝN,¡È…f&+&ÏiÊh+¶TŠ)™KɳlÞ'ꛋ§eZåÙÐÆ¥9&dC›P_G´2–½ó\ÍNÀ‹r&ˆý s(AH3d–\c¡–v´ DµŠœÍ(w¦B!ækëæ]æ ø4ÚLŸz"'¡3”›Ò“Y%E+D*`ldA4diã˜À»‚˜ŠQáä@sbDˆôTg–R !Ùˆâ0*§`:“Äâå…Q-sn;ÉHK%Ms-àžVˆ15F‚ÒÔj²%Ú•˜&ìspìÒkf&ŒC S ‹>­ƒ#’ð¹80D‚äÇãO°Tq÷"ë+¢+jÓT=½Ûõ»ÒM§éiÿüSü0MÇ.­£“¬2GöìÇvˆÑÐêªé¯êü²äÎÍeáƒQȵ%Hs]y,³Ãˆv€L#¦iAÓäªòŸÞ9×ÅVƒ\·3m˜«ù{o(Ñ^~„ï`=Ph…ÊÞJG3·4áæÅ º/­t,ó®ôCvÅ­˜h‚‘L[>f÷ĺÒE Lܽ|8 ÁýÀ]/Ì¿6«J© ;í";þë*LÚ@ÿÛÔbjÑÚ\á]évýþ»ç¿þ›ÿÌ;ý _6m-FyÙÝxñô×5bBØJ¯íúùH;ý"DÑ}”¹¾ àay¦¤7mL¯‰ùþPˆ–¯ú½áîÔÙÜ+„~CÀÏ~IxÚ¡¼Òð÷Ã_¼?ѧ¬W¶øUÂ7nÊ#ÿ@’Å+ 郀?ʾ¾eþt ì+Êï¼&¿jú|ÑæŽ™Áç*Ákfâ›w|ÍMùùÌWBç¿@×’Ût¬~9üTöôÓ×íž’þ³4É}ýÀÕ±½âñ1tñ+º“ø|ÏÅö³÷«äJ~ÉÂÉ«*`~ù ýÄøÊù’‹Ûº»gªWr_>ϦSK ï•lÿ¢Wké¦Ìû –l|;Ž?É¡úÜç™pY…s½¸H}þ,áü#£6]=qol¢¿(*Ó—\¿Ï]RÏÝ„ü¼OÑç2’KüEGÒg$nê˜6ýðÜüÑÃLÃV<- w~õríÔ£•b³/ßœ5°—Ö'Õú´[Š•—_üûÿë¿?ÛTK)Ý®3/€RùáÃáùýóó÷ï³eéúãÔèVÀ©Uê4aßûóP¦ép8Ôãäíúþcª>|÷þ]vôÌùáǃ‘ì;ßõm¬ ¤Ôí:€V|ú§ÿJºÉÜ»Rœ;r‡¦Pf‘SUmÊ)ãM´*KP©4—%²“‹Ù û´N³,•DÌåóX)«°5Ã|°„6a¡„s‘x3 ÆúRáè¶Û S­Ï ˜›fgG×Y‹Ì†áh/FyŽÓ ·Ù‚Õè‡ñ0Åô´r!?2`?ì_¦Çéc´:ó²)K$ú®3Ö™D[XØV#P3x73@ŒVJß·±bA„$‰FQ:fŒ Ð ¥_’‹Ì· ˜Ó‚м_äÎyÚ™¶(tÖà `4šL’!á8~4/ÍÒA+}:²¡ô;ˆ–L"œ)úç:þxÖ³³–r± s3Ç|FƒuH!& _øì³ÇéLQ Mhêíˆl˜&„–òϹ{ƒ (Žhœ[ $ª‚BK0H!¬(]ÙXÌž±àL/J- øšrÚACÏÆ …²*;ZôDSª¥v$¨1´7€QYåNsS¡»ØÀ@v„;² -ÐÁm'˜8;²À@™$¦Yî©Î-›&ª/DšºYT(LKˆàSS@­‰€‘F©MLIÙl¸»R*عM‘FÖh.šˆ)ÆAJÆ^=,D œ0Wfwf²t™G×\Êæ2P)—µ>ÜŠ`ƒqxçÙšZ?Qƒ¤Ú•]¶ŒœJ·ó´–ù2þ´úþû÷‡ñãáðFL‡Ñ†wn»zøãhfßý›ïz™bÌŸ5¾¨'Š=’ŒÅò:r5˜Åòr€6 mD QBK®ðô ˆÍ;ÏÉ€î„ë1HÈ\Ü;f!·5ÌÝ1¡v;´†týRj N‹0CV$–¡Þ°dŒçÕ`v"™ûWfÇòlËãÊV-~Î^XAVPQ¢Îf‹1ÊYý7‡­ý@¥C7`nšÿÊSÿüãÔú:ϲÅôåj;»ÂΎǧÔã91@ —3OÓ Üa ²ƒ Sf43ïž ÕÙ;Ý^P$+¥3xézõ½àì{«èÂgÕßæg`ÊÊ>û.÷½µÀ±‚V")+mgHduÑâ¶IWËn!¥œvþ£úŸ'ìO›ZF@°RJ_Jß ïöý7ÿùdMùPP?qôÖiIت%ÖúÌ>ƒËœÌ'ÔÍWØç°ŽwdÎËHx[Ä·Véêª~ÿKbòsÀ§ÌÕuÛÿÐÜî'Fð‰º’Ï>q}»Ëó9¥M_$â¾â°úšØpž ß~`¼ò†¿Fìö*LÿIyKðŠKüEBЖ@òe*ó¶à‹Çá[i¾w÷Î|0ã— D·íW [SÌü8ýù¨î¶¾ÿBÆÿ/:ÿ €³ª jnÚçÆÉe‡óüu¡ZÜãöÜ#ˆãì €®ú%B¸è°y¥à.=ìQCÀ7÷à­¾Š+pÇ%LéÔ”£ë™É ,è¾T¨+ì‚ðµ¶îC1¸}ïÍõÜЯNCgÐÆ¶>…פ۠ò<pÅ6º7ÒMr‚¼øÅ[Ùñ+v;º2|¿/Wž1-<)eºÀ„_FY7­à=ð÷Ú-ŒÇ ¼­ñj¶­åÉâIܽ†\bƒ—¹/ÃoºÑ®ž-:Ÿÿ&>ÒejãR=å ²ütš|Ì„×ã'7íÁ·ýμ|2ßk«äåóãRl^ÏïêÂnóÅsíÄæ^½m`ЙÅÊkÛ„›ýÎmêÜ s×ûù®h+øòµÄà"‘ŸÔæ·¥4î¶Už0X·CS…Û€Wú©±i<ÍŽëqñúë_Ü“ÎJ¸p«ƒó~k¯áJ7Êþ ßìfÓJpmn¿Àº3:6éÈ%×C.–ºÉšÎYC›Åå”87Hß9ÅÍ=¿[õ.š­¶þïÿ#¦:¾QúnúH…b÷ôBkÕ ?ýîǧç}Fì÷Oþ‡òÃ"£ï¼~|±hœÚoÞï§h?ýxØCOß=9ELcMbW<j´—§çÝ»áý#]W¦iÊ€¥‘臡ÅH¸,†¾ÿp¨Ë²¾ÁÇÃRG\| )s±½´¥¦ldžpÿ¢–êÚY»_6¡Å)”DÿïS}FYà –ªm­P €椓fs¡ºÛ‚^Ê)h f(Å“¢›3MEcïûý÷9fNuúØB.†Z”“2ef'1t"3*dÖ:çúîLçº~ÔÓˆ†é­"²¡U$àE ²`jÈÙ< —³›,BÎòëDB J(„5xèàDMhbH{3‘MÑR3}]ä d¢”nä!ã÷ Oʺ4.gƒ8AÕIÝü$¢:=‘Ò% —vé‰8P¥äSA'—(ª8R<& $ wyI4N)7t®1aÐ1ðD*©Æt@"d 0£)C‹J—óá¹2+ÊÖ°ëå€ìà‡LvéCGt)Ò„º x“Çk¦ —5˜Ö€C¾ Öð:”½s7åÄÖTSÅPkÛA(]év¾§Ö;ŸüýËñ…ƒ†ٷʘpüûýë4!SEÓIâ¨Ïb@B!¨ qÍ!­Æ³*ËÑ”˜êòVZß-WìÏŠ :ÿ±KF¼ Kê®”ÅÖ„;ZòùNËÝLÇÕ(zE|¿&5ÝãnÏ‚Âf‡{ í7kßMõÐUí½$š®5 õ@/0ëW[•»;œ{¬‰ó nîúú¡›=!?‘Q{D ¹á }Z#Þ"tÂ…îÞìêáåáÝéšæÕ%½WQ{—¥ó¹uÐ[*ÎùDn rï\±{úÑ­6yu wy2·wp‹ººwñ>wðjWþÉ„ë­rúha䆺3w­mMGÉK%p½Œ'´ÐùÏ= Ñ+ÌóÂú 7€öçÇÂj)¤Û™{ÁÌæµôO:ÿÆÃ¸BðÝ}Ÿ«Ñ5›Ï0 eОžÉv‚Ò…l{XOçÅ»^@ká!.ùT_¦¿ß¶¾åIýJn{äzðuçw¼nýßWv|QâCZÿª·æ—1W¾YÀ›ϯ¤ð7i}MÀ—6·ñŠ¨Ï­ øV×îs³ó·t$½åèVú¸>¿ZäuÊÍ·C|ÓAݹézT¨ñ Ø†¯m$n]b±¯™Äg‡}êf¾ò\ù¹âÈÏ=°Û°ûM™¥ÛÕâÿ§à?y‚W_¬GèU¢Ûiñ¾ð½€»møzÜG°YCû?þ~:§c«ãÔíz/Žâ9Õnº}wüáÐ÷Kév½™ïܽ3ób]÷îÝÓn(Ïϻ֙OÇßÿôñåå·Qæƒïh®t³©?{7ŽÇiröƒ7Z‡éïÿ?ŽÂ$e€j-bªV¬격r:´ÇVÇlS›*¬¹7…(šÍžÀ }–U~ãÉ¿×Ð h# x?ÿÅ †X­bÛ "­¤h1Ã<úyçSLnv%Å‹<¼xm͘sYº÷èæÞ Z¢ŒY3Ü ¬¶I )ŠwÓ±î‡òîýwn áØZË̮нEŽ4ìúþX?Öv0,Hù–º/D~$¼Ð 2àŽÒ­`²¦ ¦+ÜÿÉóÓÞۉʹ¤L0GT´ –Ëah oà&µJV  ÖÙÐ?¥P§–Q…Ñ‹Y hÈ t;W¸hìáLÓqŠrD>Ä4U2£!)æTG„”kÙr®‹ÙŠëP²6*„G A"¦D ÄD¡"¡ É2(ƒs‹Ã\² !†ÿÒ‘¤"áÁvnjC@š!SADâ(È€ÐR=Y‰HÂ$$sÌøHé™Ô›=»O‘ƒ±cNtIæì™ (ÍT¯4š d€î`*Á®SqcX&­ä~/¦ÕÙZ©ïS ¢ÊõÔŸi¨ÁÓƒ†BOŠ˜R-Ò2W5SˆvÌü :¿RŠÙ0…æ)`‰VPæZI9ÆÉÒ TÈr€‡†4E³‰i]Ða0ǧÖM–-½t½ve·oÙºRŒ%P¤d¢˜gUm9ÅØ¿ï~úpÇDõõX?~/“Â?þ8އ|9Ôh˜s]ßS=…C¶¦ÙcE·0pbJ–îŸÙƒ7)‰º ýv _ÕQ€›ž€ys!øLÆŸý3r™ƒ™K[@›V¼Ï©Lfž°\R’R8{{í•ÐbèsÆë'8¿y`rÎ’eÐl,<û ÌÅ=;V"м ø\›o¡ß-G;û¨è s¦O«½ÊL:™£Ì—qî QÊr¥‹Ç¢ºhÉ(—¶¤9ó±¤V Þ¡U¨® £*‡=?ü@ë¬ë½³¸[g,n])¥„»yƒûÞ­´— ôýû½ízÒ¼Ág¼QnÍvéD ¹©Î­=‘».†Î3³øÒùdB™¨]²P–JÿÕø÷ZG»(üo-k´Ú²Å ý÷λý°ÿîùßÿ/ÿY¿«íÓýܳú¥µ¶ÜPøï%fÐmýÎ[Ev<¨Ð?k»Wjñ£ðœ8iG_ßð†Z—¯Ý…~"Ê|µàMÕy#ïþÓÛµo¶‡ÿ6ºû;²û·™oãD]SÌ¿]Y(uþ÷$³KUz[٨χý²®Ø/¤àV®}}!{@´¿°¾0û¼I}¾uýtÀ墾EϽõä¿ä®ÿë„ο®k¿) ²é8ˆ-å^¯u<:¯_Î÷¦Æ—7ˆÏB=ºå|ªúÒ€cý\›?›[ßöíPæµE•¼ÅêÅHo¾ê_ׂʋí€>õ üŒÁ¯¸§ßÔs—›$\úÑ®®[›ê›+ÅÿÕûß|únÕnýúZ5ù`*ÛÁ.kä¿I,ñV¼ÏÛ¬^ÙJoz>¶?9÷oék†éšýÑÅÈ#€Ö€øÛ¿kÇúá‡evCÙjë÷;ïKD"ã$·éxT4Ãñå0Nžóðã ²¶Öûyø8þx§Ô_~·Ï©•ãôò!Š«ïŠœ»w{DBôNû®DK þùë¼ÀÌûR†â…-hY…1s:¶:Ž?Úáq̘Sé#¦l“•^¶_KzÞi®c-e¹|³ÉdL‹€ù"Í"ÚŒ¡hÀ¬ûÇl’i$Ø–JK:¤L4ytý>bjQ½§hR¥0%¦<Ð’D›Àë`ë|ˆ§i°ßí£MF e(Åœ9MµëØu¥ëJÍQM((©ò0($s†nKH­ÃEp‚2UGšƒRËemP Sä5îÿ$&²åBç8áþ}äRìŽÌi •iâd!08ͼ”®¢ŽcDiÞ§ŠˆZºÂi†¦ê©ç}7­NS vNoÁT™‚H8ˆW °$3D"¦ÙA²a ÄD5M#‘‚‰ÖXGÌž¨\ºˆÅ ’ °ÕöÒˆ4°+ê#<Á–0h7¢Á„Ž  ИP²B d>*gÇÉì‚\…zIT³1ó 8È(ÆÌX•G¥R}Áž¨3Ö_ìa‚ÉÒè„ HD„:3›A<â¬Ø?¹\SÔ$s†ë˜2¡›»G$AKô„5HÁ 3ì” àfhEª)9è€=‘™»» “ NŒ–™4KM¨Ð i$‘‘¡´ì«‡¥‡:L]›¡„1ô©51ôþÝ{‡)Ô(!BÞu„(DMMìU¤øp¨Ñ\Õ Êîû}~üác«(C7u÷n¿{êÛ/u¬¼”ï±b®O 13…XNe G¡­Ž¾³:@G ÇÜw´ªÞ8¯º\+âç||‰˜–lÖìÄ;M0[œ{Ï}l\°E[Üõ‰Ë¯õtfƒi,}N‰e•0.jûüÑÎ0¢ „¡žKìô] ! ƒo\Zçõ óõÉâ(Öv"%Ì`Ùve>ª¹ãa)ëóÕa6\ábjÂ¥[€gÒÑr<‚­™¹nG^~²øß8¼÷á{GqŠ—®XWºÞúâ^jÐKQÐËŽìP,@UÚΛ »Ñ¹@îž±Ïü8ÙO“ÜÚso`J¼’¸Ô1Oï¸HHoÞª^^/yñsçù—0¿þu@çÖ$Ù' êqÙÉt+£²§aSª~gÐâNÕìÍмt˜8½Wp o®ä£cxå ~×)zÛÓpÙÞpÑTn×Ök÷mâm¥ ¢7V Î×ËÛÞvÅm²} ÖcKPZ뎸)*½ùlïÍÅ’½0w.‡)¯yC禳Qg-LW Ø¢†p¶s¿z«³äº¦´Îšû¶|æ²]÷Ná /NCç õiüºÞ{åó\\ áb3GðvÞŠ€wdb]´Ÿïä¦ðþÔbuq½7a.oøâZú¹/½tYY±í$Õ¹ÿj-‚æÕª°µ½mÚ€Wª*N¦gi]$¯Ö+]Hâ%Íâõy\Œ¸u~p|›]ÊyÈ?®˜ßŽ¡5™Ã ²ËòPåÚÊ›®ŠÙÀU8{]£s"]téžSÍwW†Ùñu»—Ùè úB¹OTw@W™p>"Æ=˜‰GÅþ›vÂÍJ´´|nضñp»¬#ùª—¤µëçÄvI!x¿âì¾t±èž6š÷’l—tß« x¹Ýögé®É‰®W(.8’ËÍÜþñ¿ýÝørDd?ôæb÷¼ƒñðrL©ïú65€]ñãqRÍÒ±÷Oͺ]׿ûÇö<´—ƒ¦i¨ãwïÞýÛïŸÿ»ŸÚ±öÆB´Ö¦–ûïÞµ^ê4Yßy)õwÿÇøBÂÊ0“ÙZL-I7† ã‡ƒZ•Út|Éq”FgSP¦É,ôà Ù_)JÁlåØ‚Ã³»gSt°²ØÛ.²~‡œœ82`„;v݉õÐ"çÒÔ¾ëJ_2PÌÆÝ®ëJWÛ”ª$XlØí¨Ó$&`Ñòyß™•mÌ)ƒ#˜µÁ‹-ŽqÜ »TûáåØõVú²óR³ ÛàûnœS„Fd¤NÜÿùÎ'(È@€†Œ¥@ÈL(”-)Û\±;ˈ[Üÿl×yFLœpÿ3×{U!ç¢û&”~Fd\h<ÅÙí,æµÙ˜ˆiœä˜U3š-kÃÜ!´—*j×ïËT"šwÞ‘‘G€È±Œl_>£ç<§3”k‹ )©T6Ôƒ¤ÔÆã,½A1•"…$0׬TÎÊWÉE¸ ÂŒÔL%kpnÿNOꋊ͞Ÿ¢hR•F€´½aŽPo&` w;JÇ„I=±£“ŠÌ^œ»Î: eÆä»U¢(ŸœF2=̬¨LÈ ÑBH]ÈLO.†‚FƒSÕ²+(½"GšDÄŠq‘féu ˜¡ê쇬ìÄ /2#fª™ êÈbÖ$‘Ö¹Ó"¤I)…ä¤;åâübhš¯»Ù.|HNÈðª!Axe3¹±Víº_ç‘mî3G«±ö\€Ÿ‚µžÉ1Q‘køq Ó¢È êÿ©”Á×£šß¶`yÛØHÒ3”i ƒDR`‚ 4T€Bè€Á:4æ 0mK1:¿•åÔf×ì%®¸8‡ŸyŽ JAÌ€|C´³MñÜcDâÌÍ™¯X.v,f(¢Ò!ë{cqЧ})꺿è½ëKW|èL¦±u¥÷¡”nè:÷œ’ǨjtžÞÛìí0¶ì3&!U,v]”"Uiû!ûN€œY:@(…>Çe gVÿâ¿8#³–œ ÿ7ê¶P&@/þ?ÿ¿þS¿ž~óþÌÃÀYJßìÖ°“ÛíÈU©7º¨Cಣ8÷l[îµ.^8êêÄ—à‰„Ç4†Û™ËP~Ùžœ¶Ø7á4¯"ßÒž»#gTâ e<_–í WŒV. Â|ÀÕ9µ­!âMàýˆp£þó¦@¯é·gˆ·é1·U2·„“{:ãç¡ßoÉ9×IŽÛžÒTXÑKе ‹#äõ®ê†aÍù^^ïäoøz@’ÁcklžñVxÐn¬WÔ·¯õn±3w¯ÃöN?Òo‰"÷Äè¹Û)avRŠîžÅët£[ªÌ¥ÜÄ× ­ã\ÎoxSãÿ(rÖ4ô‰Î’W`;§«ûHƽ-*¿ºz·ü–WÞó‘ó9°Ý‰Ÿ*èN»H­B®×ùK<ï-è!"éΠ§)¢ë#dMOobççÉ×ZÍîÝÄ=Ðù[‘úíٸ󓔟•ødÜȲ=ÎWÛ>ëºl“»- ¯¬ä¯t¼t÷¡z‘ø´—¯®\g¿$ͨ¯HÐ}›L‘î3'ô¦t3_[…¹­Wùyª tW”^5D½ùbðRÍ¿b¼ oíà+åƒtoFÜ^Õ7Ü «ðä­ùùm¡Ð‰-p·â•óØì ˆ»¡Ó»õ‚ßz\v\Ì'0<!¸>ÝðøÆÞ鸶_»ÉÜ}»7”¶,•L¯o“$}‹Eøµ÷¼¾­vàQMÄi‡ðzÀµgÈæÐÃËuÅFã½æúðÕw¼7aùÊÕä£]œ6³Vzè_\[´©ýöü}N ‘­VûïžhÖ ñÃax¾ûî=ÄÃá°¿óÎyÍ(÷¼³ÂŸþåwñþûç]ïhÏ}÷âZ"ãi(?½dÀ°ëxqŒ(Ç,æÖ±ëÇù¯!ECWR™©hS P…+cj9©Mu<Œ‡cÖjÖJdª‘… Y‘ͺ.¡„ù,#£Ûy¦:‰ZÓv Ó Ø ç´þ·@V¨!µ32ð’ð,6¢Zß—ˆÖ2Y:ß÷»âÖò ßaŒ¬‘Ú ýT1 =4)K­ –݉d¢tƒ"IÀbŒã`»ÒÛ“3óⓎ™a !ÛÌUê;1úcöÃô¥¡!*¬,FÈP.²&‰™2Á² ÎçqÛ¿ƒwˆ ã´àþ‘pl1;ÍE%˜Ã mZd’ýoë½3#e¬ãd–4·æð"Ò‹ˆl-•žn(6”)¦ört•̪–PR&‘FµD¨ÀÌm®pGÅZËlFi–¦–î„¶´nLg”9!©A‡ %£b¶m NÚÊõåOB´2üýGcWdv¬íãïÚ8Õr³ÒÇ&°)¾G[5ý Ô5u2ÏUÚ›ÿê«U…o±aàpAoå&ÆŸ¿iy~zäšc˜QBÚ<[¶Çvúy¬:óúè7lsÇRéo†n·ÐuÒ( °NðÝüÎ;L‘0¡±v-œ“„—dtê$€æÜ˜!H?çÐ0¯–§Îï@›…ò¥c ËUöM‘xkè{º£tÖ¹‘VúâƒY¤Þ­³ì¨úÐ÷:0›Ô|¿ëX}ÌJ·ï&Ö(6ÕèwO¨&uÉ>N¨Š÷C:£+ÈXZl‰–d‹}?_Yí::Û`Z‹ï_1VètffdfªeFDD¶ÌHÿ÷÷ïËÐÏû÷õ›Kî"ÌÝ&ö×A’o­ŠäâKò²U2¯wð1ªñ$A*û.ËT.µ¿­ÁËpêgÜÑ꺀|T•sÕp«o^œ£ô°ÎéF¢¿'äoÄñÏWô¸@èëÔ¥»q8@~³Ïâ§UÙËj¼ÍÖS¯oŠïÓçQ?“Pó nêWϰy‚/O‰ÛÄÕãO#Rãõ#Õfbê[uÜÊ~¾€Oº,ðæëîï~vÀý]ëiižógħ¢oèg{ÞÔ_’ÙýӅο1Ûôí+~Ù›ëÕ§Þ/ökîÒÜf×¾þ«àÏ_?ŸTÿs=)¿âÝ ü2­Êæ‹ö3æWBú+½Ã?ogê¹Wãó >Ç´çç¹ïaÓ£ãÿÕ-ÚWmìŸqm·»;}iÜËÏ7Ÿ“­¹Ÿëzóé­ž® ¾s9ó˜õÛ¿ûûþù÷Q£ôE©h1<í3#¦I‰ãO‹[´<~8À9µc)…àOÿòûâxzÿÄVÔXÛËqªíy_ ËÝÀȬ1ì;Õ="™Mˆ/£}÷“ô»ÿZ:Ò¬MYkÆTé%ZÀ‹»Q¨ÈŒ©Žm:ÖiŒ˜ÀPfå¦tÍæ™Þ=Ý JKAð2Ñ"³Êœ86‰³ ê]‡l ß4 Â€ÈEòÎÙ8Q Â2qGó„¡Ædé ¢ë à÷ïÿ2‹>þþ÷…Öæ&@¤edï­†šch²¥"ÇàÑ»ÌI PEdš!×’ad¬xz-LžÅxÆ•”ëÂa­-^Ç _»$m.΂Ÿ@çŽ6¢‘—¸ÿ™Zî€•Õ 5ÃÓ…n@rü­ H°eŠŒ–¤!-fc^S—HűJDéTŠÄ,Š LZš Ï¬Š†LE„ÉŠy¨µ$é‹êæÇÑPAŒl €Xœ~㨠´ÆÙÂÔr²S2P“ ¤@—’sžÅ€J"Ó QS-éptâC‚À@3ªAa…:ª&5Ú31?a¥$J½7¼¤v¢Èœ¨@q J¦5Gx„ä‚ÏÆÃD3ŸZ˜Bkô’»Q…^]Єˆ™:‚L¦ë0÷¶™RØ"é‰b˦n¾÷@ƒºB$}m Ñ|{‘Mj™’ÒAË4ðÉK¥¶ÒN3ö´Æ"—‘¥™b¶òTz M]:Ñ`ƒh]="Z{Þíº®—E¥+#[”ƪf2ÒÉ.k{öìl<Öˆpún·‹–/:^žŸÊalÒáX?Öö|zÞ‡©u:ms­¶½\|y©°@Y…uÛtçú[Û,°m ¥óËTªþûÚ=«]p^æÚúšS™lŽõcÕý¹þº¯`ë‹B÷¼_zwXf ŠƒÅ ‹Ú®uj—™bC¬ë†Ða\}|íš>'°P€8“Ĭƒ­Å^`eÉÌ} s5 7˜-k b&Œ-žÆ¬,Ýü䢙¡¸£X_JßyWlèéyAئýP†â1$“™igÖ‰”qô}×w ºNFÑeUGíº ‰.dš«¦úâcSK¹1ä/ÇìKîúåqlPÌÅøwîR¦ TDfdFd‹å›™ùþ»¿þÝnèö»çëÂÿörðþü$œŸ5Œ?ã¢u_,ø"­ç8BWýãEøŸ¡“þŒ×Ф-æ×|è½æî?àþåµÔ¯Ôz«;ÿ±ÜNÀ?Ó†öuw¶ €Wäìorx¿ˆxù\øµLŠ?tþ›O·Ÿoþ¾%ÏÁ+ÊËüÓ£’å׆ˆEÛ,ÑÝ#¼:Îs>é:Õt}PE7ðñsÏãª4릇‡øPòÔ+¡®5oVöÎ%;úÁ“ñN“š¸@aÃöÙ°-.i<[{A\Á„®Óos ×vÀëK ¢ ¥®.ÖæRÜ0åÏOçç£eõæ­à§S5ņ†W÷蕊ûµÍ§®×í`å«Í[IR§ÖÒmÛíUqó5)tSô kch=ŠUµ\Nž=—õ%\v—³ka$g¸’N-):Ûó]tÿé-àÜ©!jÓ`‹6BA\mêy¹R\/@Ú´Îò\ø¿é`ÝÒ–.z tÁ‰áÕíÓ·t}[7ouioµåâ`í?¾6rÿäÚqÚá]­Ò¼‹i»˜fº]Ï¿GÃó’c»„zëgëfcrÑvUl'nhU+ºiˆÝë¾àÚW|ÑiÂË—`µ‚×õ0º,Ú IÚºŸÞcmŽæuXÄ{´­—n/ïá‡ÿô÷ÿPÇZÜ‹›À„ú}©ãïǧçýówïX¼ß÷ÿòÿüòãËwÿæ»n×w¥üø»Ÿ~ó›w5b!2K…§ãPø<Øtå¥/¶+ÈãÈ0§FK%‰Œú!~û_;ƒjÆØZKã\"9Y9zéÂf*CÔqS´ j>kÄTÙ#’+Ùz6Ü$ï|x~nã‡iйªT²)*0Éž,«0;tŽ˜€D ¶à­C‹¹®HdCÌPÌöÃ^À±@+ôž;XVšÚ°óâ¥N-ê¡& èðì¦V#Ò‹9Q TÐðÆèº2ÕH‰Ì„E+^ZDFΘ`ìϬÿ¹â“KMïfr­ûmÍEú¾,†3ì{¶7˜½sgmR´5£ €(ÌÐÚ*ƒ äJ YjKAælÆ[a¸Æñcù^4GfDBr·LZcˆ‚L’¡˜!“ ŒÍ³f†2BB±"e*àQ3­ˆÓ<"ÛëØw¥ÖJD}aŒ"eÂT©©# Jã 0“:_|ƒÝ„D§(7¨!+ iI%ZÀsÒb&Lpª UfЇÐæX ÔÍÊÍq+ôÛfÉ·Mn`mo1;¹‰/®bŸÙ?v[œìv±&®¢Ì\û°æÚÆdx~ŸiÓ—ÀÍé`ÕÓ‹c˜]=æ‘0èîA; #"açUj ÆÍ€r¨ºìœËåSNî·§(¾ çWéÎ-@"üä5’`±4%ØLò…3– #eDAw·ùÖöõ]ºn(¥ï’…O幆¾¨p¤‡¹[ŽéOEfØÁ†®zŸ/SéÜÌÓãù’IËâIlsPAc)ìZ’¢rèr×Ía°Lˆ–`‘ŠÅe]‘5æÀ)(4·ÿéßÿÇþÝÓû¿üͧTÛ &áÍNêS‚ÍióÀÓ~øÄ¡á-ûbÝis3¶u[~rÉms3/ÃQaƒò¹·©ÖB?‡4¼ŽÇ· åÀì³UÛM9ÿõ†‘[¸éÊýyeWyU{GDxdpye>Ù&ËËÑpÝÃ}ò)À–U²^ªPè‚ñ¹€…s¨yÁ^ëÿƒ‰SÜ{q¯7‰¼fÀê“öÖº’tê²?Û\ÃâmûÄ•ÎsÑ¿žÌ+Ô«v–×koïÑrî\é Ž”¯S€î(†7¯˜Ä^ª^ñ’½•ØîÉCº: »›DÝ(¶weë»ìš×E^>X„´¹›-;@=·Æ­›c=N^îÂ6wáëÞÖ# ûvîß•q_oݸ•&`åuÚûj3Ýx‡C|bbÍ/\ëªk½¦áòf6ñÚjþºOh›¦9y_BÃ×oÅG ò[êåíÐù×Ïw;Òî"€®Îq{ ç_Ü<÷oGãëÇ|çÝÖϾr;x”eâ­bóàIzZŽ.â™Ïqk祥Ç+µ¯1”þTÀ«-a·ðüO¦úyI\ÿ’*‡-6_·\úÏ ¸nçrñb#=ö½£Qn²é÷>éK³^º+MëAÌ×;V=N'¹¸T·ýzƒÑÆ8`Ýã.×nñvØNóé"]Qx_{>­ÛÑÍ)¹m¼Ó?µ©¦×k;mrBÚÎî ƒQw‚-Û<Ì6u9Uø©9²j®çÏáÅ2ú`8mx0à£1¥»µ"àg÷r‘|.>èÒ‹ÓRww|üä%»ž!ïŸÔW×AœÉsðwK‰"_ŸáZ–:ÝÉ£¼v S#Ý¥ñ¶ûþ½·÷ Å ·wã{ÏRí6gtñõò»ÿá¿ÿ¨M)7³âp«-bjîVvK©Sef}™¢æûïÞ=÷<ët?üþ#v}ùðà #ÇZ¿ÞJqœzb¬a-½@‘4Ë:ÅTp×ㇿÿÏhµ©'ÈÆhÙšZ¦”d&ØÌš­†ÔÐ"#I¡Èw Ñç¢i¦¼ÏÒYÙ픵Õ`ä\—J‡Ï—sJ2`€‹žÞÙÀDQ13s26ÎÙ<¼ŒïáöÃ0ÒjŽCé"U¼¯­6„iäΧ‘ÓQ€—2Xç*SÛ” ÛˆÌHDŒ3Ù¿x×w= -¦T0GæâÖË€ ä‚÷q¢ÕE;Œº$ Î>$˜µ~_tÿl;@æÎ†ùH`°BÙÄnÕïÖ¹‚—5¯@‹E°°Ôí0Љl!P)¸R93ËU©1ÒÜÍ §‰æ01D6TT ?-„Í2³™ž™©ÄÌÅÆÅ¥ZfWÜ{‡7X«•Ó L–Õ§©EÜú®›úiª:Ð9@„À}©¡¶£”ëŽÙ3î €dM„hP7;CI`gÐÓl¾0I €ÑÌÆÌ~ãÞ-cL>›Eâì)“äæ?¥ÞqaÁŒ‰ïœõB:$ƒjÉè‘XŠZµË=­/*n§—>ØÜÒ•É’F¨²A^—~é4Åœ+wu9ÃÈá¢fCc ‚`5æ ¨Å*¶ a$dO†ä@ONd“z¡I©èÀÎl0 Ë@ö´ƒ…1;7A —½ïöÒË\ÃoN4CWm겘‘¥(Y"”9Bv&z£¢f•H†iªÊŠwÏO!fòå0¶lûç2ì†,tgyâóÎö»çé»}´üñà œý»ýË/ÿò»ÓX£¶:Ö-K'®‚“Uv·•ÿƒÝ?/¢¡‹§cl üO|õ“ÂãX,¦ç~öäÈM;oJþsUöO=ýd±(Xÿ锜˜]@t:JöÈÙ x;xöHG/Ð+ïÄ’ð\ÏËØ²JÂ0,êZ[ŽÚ,ͯCÖTÐÒ°ô$¼[•ˉÀ—f/K±®~ãtˆP„Ι¢àÌYJñRºÎJ)CÇ®xWXJßë Ìw÷¥°ïãcES釖EiÑ?¿78¼ßÁ<P 52™ MEQŠÈ£ïI ûž!ÖȾӪ.­$B›{•2£el¥ÿÔÌ,öέø_ÿÇ¿ñýðôý{-WdÝh]ÔœjH´ÚC,•0[ùòž ó Š<µ$z¾Eeô•v¿Ùöè¡ ØýYSþYêõè§¼SuÆ;•‰waÐ×BÌÍŽôþ†ë+úÑýy7wݸ6Wã±­(7)ƒouÛnFë éþŽx±íyÅ™à+v(¯.¼¹àSίÞ@=Ô¿¾…cãĦWS¦ÌgޏõWWêÖôí/®côÑ¥þäÑ^Ý·ZÄQ€>+‰¢›ÁkÅQ—ÉÄKLÛùÏ.ÂE)äöw?±³ÝØÕ_xqŠXÚp_¹žªÐùÏΟ5b?™¾z¥Ñm]G¿J+ÿã~=Rÿ¿òmÿŒúóׯeüRÙEþúó׫~Í ³c[5'[…¢×\ }v#¼²žßúÃoøÇÿþwÓX%™;KñÞÍ=RˆÊèv}›¦ù§ÉÐ_ý?þí»÷Ï~üøñ§4û}×wî;þøSfÛï»6M‡£vÏýT[/f«ßí]šb'‰”¬ëñá¿™3÷¬cD¦^”3…G5ZKóLÁ’)Œ”"ʘ¥“ˆLä„0™ „9J¿ o¦1§ãǹÄ5 r”ØÃi4FËl ›bæþ/;… Jd +¢"µ¸ìΠj&¬X¿"2Ry¬‡¾+ûç!ðEî²~Ø—ÌÈ_j­èJ‘Úqeééé+ÿz¶»@K3S¢x©9Q‘ÊùgyÌÊRίº ~r…f,ײbÄsÙÍ\ŽVÁV7Î ÀWõm‘ ÀÜf+Å’6ŽS'ÏêÞl¹´Ìg4–s”E DÔÌ&a)*Ðdi’Š¡¨J£¥)c>µTrlmñ0n ECrq.Ei#›»A™L+Ô4ÙËÇPw}×ÅOÿ„Ýž¿Çÿ?  '´x±HR‚K Ô€-.ðTªI°cl¤: vnj.ÙöDÎnÀN>¨ÔÇ@D ÑÝÔZF6Ú}šCÀHºå$š²&ªcg(È=x h6 ïBÍ>6–F!kèl ¤‡Ê"˜ìr̹ÒdLz/jBELX›€e@$r9Î05 Ìedµ9í”êiMù’Òž é˜Ñn–¦fJª˜“(`qKK‡=÷ñãñ‰ÁýÙ®É"¤½˜$Ì»F,%ÇŽ]Š&9&Ž£õ]¡0Ûø1D‘íÝû=LíØÒÐõC×[¶ýS©‡Ö’?_j­ûçቚŽ/ï¾þî·-‰qªy¹¬jýÞ6Åû§ÄÀ‰é’àýrϪ ~DoH!æ6_êîs-|6sEùÚ´¼ÕI¾Ÿ6ÿ¼\W` ¬Ÿr² ðMË—þ×WÊ+~%Û‹ü•F˜¯*õfv*mž!ÂŽÊÿüõ¯XF˜ÍOr¦iϳã¥è-~Úü³®ñëÝÜs±üÕ&8ûÓ™+ß:ÿÍ¿luóþ¥á)Tæ7ºÖ¯É ”süs›ŒçÙç±&´éÔÙ”IœÊö75Äoþ\Ä7¸g«›^Ì˂⻢ñUуp]$ËÛ®^‘ŸC]>¾ãW‘7°åm7W„[Žn{ÚpÕDòzy†fWð¥Sôä|JÚï'³ìoy^Ý­çí=|+8T'¨.›NÌšM¾®oö£q«;G}Õúé·ÒRÜs«ç)Ôй`{å.XA  O\Þ9rñÎh¿¸Î é‰êÍo.ÌvŒmûß´Å;%Þ·¹q=޶q;åuçWxÏK ×ý4eוô[ªMøj\°©ƒøäCôQzëQWŶ-à¾16¯üî÷ÿð·ÿc:N/_Šûþûw¥wë:³90ÔVke§k!ßýÕ{´úãïüðãÇ6NOïŸóW¿ÉV§ºŽãËq:âi×}üq,¿Ùw}ç°]†™E´$Z#Hßíò·ÿûlV_¦ha­E4*2sq (rnîs¹ã*i®^ŸU­¹°L–EŸ“ €Ù¢w—²J ‰TBqa§=C-D`–¨ÀRKù¼Öž¡¶Û÷FŒqèßí:‹²/fg'4D9Lc­*¥*²¹/‰Ör`@¶åðh°b$ún˜êØ4Îy!súaÂF°¬û©@μ³Â  [=çõÇ ú­B€iqúÕj:ÿ5!1Å\lËU˜³u]™ xµ^ÒÌ¥âTÏ«3›è¢3šÆÐ ”1ÓfJŒj¸Ì+bªétÝ!D !§ŒªÙÕÜ@ÍØ §A™¡TÒåfÓc†åYCxiµªØdÈÃ?±+ ÑÜ ¤x’}¹Ö†°þ”³8À1͹6~¤ud¦ÍR‘¢ÐÏOId’Uéf¸Ž‚3 3e:ä²$û N ÆcI|ïüØT:þKS¿ë¸K *pWŸ‚X$ÅΔí12z‰®O-&¸a6=ž¸ºJ¼cÈ…å„\-5³Xœô¥< &ÌcÇ HÐS:oµ4Es¤$ÔÄÙ5ׄ½q®Úî{sÒ“¹õ˜uÊÓ@Ð¥ì2ç®JKö( ´<'IÀæö©‰°-×nI^r±Öº€Ð.j—Í @Y‹Õ pckæf0/,ƒ:ÑÑvÞY)¥+–ðTÐêØŠ{ÎM'SÔc3—¾3iè†PóØw¬ªÎãÿÏÞ¿õX’$[šØZ"ªfÛÝ#³²ªûô4 4Îà€}!ùÒ·?ÏGò‰ 4Ù=˜!’èîéS•™á¾ÍTEÔöö}sÈÈKÕ)G""#Âݶ™š^—ˆ|ënR1 ié(5ªÌZ–H²ˆ-A7S†Èð¢é¹œrÌÑÑ{½Eô®Üà×^ÊßþíßMw»‡?|÷l°ûY’9PËÓZ¿CÆÃåùçµýìÕqàŠ' éÓÇÑOž#¯H¬:Â}N-ܪ\C®¶«×é/t)|Y¼$¯”é™D©SßùçmDqHá-2ëU5¶^¨ÿŠÊËÍt™¯‘ž|mÐg'”¿x<;kèö3o+ çЇQóÕ%áWßÑÍ´w~éÕÞ¤ïDשè7ÎzoîczýîuFºæÿ\À².nøsøõÇX©Î}žmN­oÏ5³O¿ýW¾çÔòŸÍr@o >]ÀL^õ 8Q^od]àÎÊî?«Ÿ–í_ô#^‘=ŽXžf¯³ìùæÀ¿èü'»ÜÍeý§,ŸU¦syçÒÛ¯1S½éžO8]gÓË ?ý,§ÖÐ|ÕîûŽ,3:+ÔëGÉæøËMªÌ¹/$_É^0œ¼A&ye sÛ¶µ©S%ŠâðE=ÝåÆrÇ“Ú7Ý~ÝÒk+÷)½í4ä@¾]D<Ûô]·¯`:ºúõ°eãËBâù~Nç€[0•3¹”—å‚§8%ê ôIœ†8nƒupf»À]ñÝ~záMbŽŽR)o>ÿKOwûƒ®w:=µù£N¡v>ÏFˆ^Üã_ìcø Áà«Ýæ¬ÞšW³†>½³<‘þ_[y¯wNg=ž|[ÇÖ˜V_eŒ¾Û|µ0VçÀ*ݪûýÄŒÿêöyu?ì8.cR7©pça~¯ØgàK&–O-NÆâHE>kœ#âE§ø s~ÞÁýõÂ~òòëýû~ùð¸Zž>îi6¿»/»ÙŠOsýøþñéÃã7ßÜnëÑ[§Ûîn·z*ÅÚãÓ²o»‡»?ý×?UW¶Nh®œêî¾:ï«„gt˜¡z†õýº.mzw×þóÿ((Ö®±¶Ì€Gf R¡¤ŒRÛzB6x>’ˆD©›”V P6lýÈr¡ŽÐÁ —°€U(À£G.ÐêDÜM™ìèOPß8?[ßÕ1)JPÖ{{ÚÇPH…²"§’ð\ÛBC-3h%뺮>Ý•§e) XÆŠùÅÑòMü©Õ¼Îëºì—':'*!!Vd†½%ò`ª±ý%¶gàH¸#µÅ̰>=.-Ÿ1Oµ?5ëˆÀ»oî?|ÿÈêNtë¹Nì‚Û]sÔ‚2l Ü·ü÷8låÛ /¨ï6;Üöª38FÜ 3L3Ì‘íi37©Ç­b"0Øab~ØÛ¶úyÆLÒQ&˜o("sȱ ãîRH£ø0O'Kãù}WAï­eŠpJ‹‰æéT&¬ à%ÙÑúK6tq?,»'žÀä°—80/m ™ÄÉì7Z,“ VK¡9Ü *U9hbôR«ÞPfîÜ7£æy2Á¥«þ/¬“ÿÍ¿{‡Èòþ =@fuWµ- iÔ<ËÇßH"Òܬϓ8¦hö¹zñ„ cbØ g"‡Ëo‹h½µ>â–$½¯åoÿ7ÿòÝ~Pöl>t}ªÓS)ê° e!ã:©´®}™øâþõ ÌÝLÇ8'áâ¸Äµ¦påêtiMt¡Çmgr£÷¾ )¼®ž%¯ÈæŸðB|ЯCPê¬t¹<¸Ó\îëÆ¿ŽþÛÊ}Tnl¡¯]‘y<ñ9v½ó¸ÊÂy“æ~\¹Ö…¯e©ÛÇ“×dâsøT|Žue¾œ“oÎkcp™gÄCÑáLzÖ8£ûkÛ~:ôÒ“½"]‹£àùÒðë”ù›·[ð™ëÿ¿ö3Ð8H×òÏTÝëÝ—ÅÖO“[në¹:²iŽÜà³ÚQ8ÿ:3±í÷÷?üéûRü›ß½ó©L»jµš[¶ÞÛZvÓ²´õiy÷nמöÑšA¹_§2eâþ~g¥<ÜÝõuÿôácß·ˆžÕùO¨µ¸$µÖÖ¶_ÛüíC™vkÓ>ÿóÊžÊìKï=ÜCH)Ô•)„!Ÿ Hdmâ!úÄ ßÒlé0GÄhz‡9lÈÙWÍÔ³ê¤aðÛac?!?±Í„hPqHÀ VËÜs‘rãT”n6õÈÞ—yW S؇ý“wwÓ‚µÅR,éP`¾3³l¦¹öÞdX3±>H"Wð2PòH!ŠÃ§ ÄÏ|.W£#úæÁ;Úmk“Æì“U~!Và˜{ ˜mÙ¸›Ød›¢)!pp8ß[¤a=d(ûæ,:’åÍ `€•(ähçcñD l#ÎDïˆ$ ân¡uŸÅ¬§Õê˺b³Ídö¡AoKS2 ›fkk.‹¾A4NsuçÇŠ…ý rdö¸¿óR1OÕZ7³¾õctL"(€Æ².Ð`à4¡%*P€35ˆP.<»YÞä~x5HÝl/œÝf)2›8™X(* °ÀH|ÎTw[¥û½çL›–Ò"¿uüδŸð‰GïFï\k°D©Lãt/†aA zå4`'SÃjêɱRJ8“&A°ñö‰}`IìÀ± -P! ‡·Ÿ¿·Qh"‰AsC5+^«{5só2ꆢј5}8‹„úûz·³ogKø½!TÊ„R! §ÍH|\Óì2@à¨:olxÿ ¤A¡ie¨¬=¦"Žj“Œr›<#Zï=²Eo=#X)^K™Ë¿ú×ÿæ°nñµl‹Ëì&š%’C]ÜOÝ·?£¯í¿ôžè »5~2SæÙXb[þ^ËV13ybppÊ$ÿ+„ä¯_ÿ”éÐ/Fû…U þyŒôS™ßî _Gÿ–Q9_EqÖ_\£7("úFß[ t^·æþŒ7x䌽Ð{¿Fà Ç‚Û)ý?Ï$q J¿)?V§¾—·à̶óù^$Ë<çðäwݨ9½¦üN¾¸èbgzãÆyîsq)Ú2Q¨“UgË@åEÊîK #béH(zC2OnZ× ÈOŒËƒY ÏËϵ|>/û=³ùúœÕ…/Üæ±èùâ_MÉ ËÝ‹&Ð+ê¿>×S÷¹•ôrÓò‹žW‡¢kÊÍgÜ þÏó9äÕ )Ää/é³r‡Ë\6Õ㜧,ëßÏ­ºõ‚õõ4úúþàõïìcª˜fûŸþCZdWôTD4I0KÕþ‰ã¡Z2%Böœy±ÀÊÖrVà„€0µ p± T°·VäAÍC!²o¿B.BcAf ˆè‡Ä0ƒ (rÙ/°ô¡t*×µ--ª{¨õìÆr7ß=ÜÝ%sò‚=öËJOhVËÜbÓi“O‘M’ÈHñ´¯8ê•(Óó‘6`÷ikšÔ‚Ö7-ÞÙ¡!Á[KöDk°„Õ-ÑØ%º`Úrÿyôó4¸CÚˆä›Z‡ ŽDÂ'Ðà¾áò™W€@öí"½ƒØâ ¨m$¦Ë’[®Êžé$ÕRkK#ÌMÉó4yDôõøl€°>¤\Ðæ0+—÷Pïøñ#wÓÔ‘–ý±ÃÀ_"™Å@¡ /$Š£¦áI¹BL@\±¹„’À"«ˆ‰˜ŸY( *³€4ÛGÜ;ì) wfù-¨LFP;h"JÓw…>¥©ìT"Ŧ,˜ï*ò‘h, ’Ú‘õNÑŽ÷ïD+Ù&z'‰ÉaXS½Ã Û²‡×€·d¢’d×–’=ÄÎq“Ú2XQ´i‘@5Ô3“¨¥É¬ÒÖÌ L†Õ®n¢„ézRd˜ssv˜Ñ’èÚ¥Uð£Eï¾,÷Í[½»ó»Ý|?å61K±‰uòU=2æÝ4ϵõµgß·u¾Ÿ»V¸?ÜíŠYïíi}tCDûæ~VkûlÕñøñ}¨Ñjüãç­!0ðÀÞ‰†#ÂA÷σµï(°ƒ?‡UØPÿG$@›ƒBnȶ ê1.B˜ï7§îaÒ ÄdÈ\ÁCùòö㘻Qýz~;-Ì'óœÈqÍë¸öéå›ó/ØÇ¤`\xr¾†|“îx3Ãã´àôn¿Žªu(S8¶ß‘ ‰[{ôÓç’”ÿS•Ê׳–øŠðRƒ\´ðO‘Bø=õ«²?¢——'ÉÞ<8Ž\S|OwÔ¯'bó•rú¯,ê•Cð1ŒtTþŠ€u1f¿€òôúõœ«ëá©+˜ÉKºÛëŸþéÀ™Î úôí-¹7;ÛëéÏ/òÊnAøùÆu_ÏVæ¸úÄXx®í¿žD^/ûl­ñ$qíz¸øÄ_E(ÿÕ¡ó_°®½¥§½r勺º7-d'; ò$Nëÿ.Ö­[“ÛgMYgBÐ&0è“3ü+%VŸÕÔzYï,§:Øí‰æ´¨éöàà…DŒ×B‡»yUü}aÁç ùüÀLÑK€—#Éè±#Bq¾%ÞÁ4;Þ#7ÙëXHwNÒãÍé[WšñzN¸!t^ßÞ¹Ê}B A¾¼¬Ü€»ßÆŠ? /—P'^ML‡¸Š®°JC'”NËIùzt@WQ >÷³’žá?:6Ó^/мGÞÓw<Ù—hêÃtRÍ§ÓØÏIoÐëkþ³?¼x©·Û4±¥í+Nø3|1ÚtRgÊÃð5xÂo¯!‡qª‹XÜYÇxC<ƒçTSžÿfz¬â;­õ¿Ú‰çº'Mœ$^¯p/†n>Ë ç&žG<Îý§µíÏÇdR:½ëQ€l¤`ùÒŒ}á0@¼0hÎ~þlJ .ޤÿô¾í—h ©>üø¾µè=l*Ó<¥ÉjµZI. $woë>Zb]ª—zÿ§?PPD¶µ÷”à•̾.­iÕ³Z–òô§÷÷µÎõé©ýéOï÷°s÷œwþ/ÿ‡N¦”¡Ö%J #k˜Bt˜dP0>ÃÝ’„Frè Ð >Ð10ö¾ÙN"Luhøvv0¶ôy fЦééûÇévÀé ém¨rÔD”2®–$h¶›æµ/°D ì¦ˆ±›çRl]ûÚ—¬™‘†ŒzŸ¹ ±ƒ·ŸK{Rßÿæ@B¶.Ѐ²ç0õÑ.X#+Y”þr“„-a&O2]töÉ·É8XZXzЃ1CEñ`|L.ÓØH䇡L ¡D´-›Ø@ç½!F¬@@4mÃF¸#"&/F(ÕeHv(¥He¦Áʆ¤êDÀÚ"Ò-†'ò4AFSM!zY'f+™Zß÷Ö‚f}5Z=¸±šG϶ª¸ $s“BC)U$:8`±F­¢pÊEʇŒìB7#ÄQ~cÒa^™LYA¸YÀ s¶m›Q$‘ßg~K¥y ÉDÌà]æ 3×TĤYô¤Y¤.Ðæe‚kf*D/Ú‡ba%Dê ò rÄ&˜€L(iðô"uÒ C†Ѱ_Ú0Ö®­mâuPg£-럘 æÈëŽ<ÒsÃþȶxÞ˜Oì`¡Q >Jˆ*8Xd‰Äöƒ>!Vdn^ï^À ±¢7(ǡʂˆ(Ófiž/Hü@mqû VXwæõ¡°º™¹‘¥=˜³Tšg °4š™sŒ¥3³÷>>‚‚ö°|«©Bn&Òu ¼Ö*!îÏ í|³‰v 0•ZY3Ó½ŠÕ¦iWêÌ:•0^º„à D t *…Öþø¡Àð¾Ëe}x·³wøðïî4&ߥ³õ4KZLu4ÿ Æa‹à %Ò60š»¤ž©R sLJd¤"Û²nÄÿÐÐFJ-û/þå»ôûWT«ÔÏË]È3þøÒ.è\7)Wêh ôœ1vÀѼ.‘ÏÌ—LÑçMÚK4˜7J<;yñͺÕÃ%ý Øä'©ÿ8³Z;nV‘‡çíì³úyrÖ;»™s‹éaúdÏå‰èì$Á£Œ‚ Æ)kâ5pÓ‰J7ö¬ù…ï™×¡Ñs~mž‡|ññO?.÷}mÊ4àÃÓ£Œv÷»i7•©ìŸ«@ôuéß}÷;,cØófg-`¹ßMËÚgwÙ{öfD¬ëÓ¾Ý?ܧûûõÛ‡¾ÆOKï½÷ŒŽòñú• µˆžB1”‘™ ‰bÕi.f[Y™¤H àëÚ$dnøšA· Ö-0@G$(DÛòÄKú攫D 0†*£©? ëǽO¨32À¡wÇiØ‚Ã1Õ‡À¡zg>î0yHéUlöžùô¸<-ëý;í¦©eK¤Ã滹iA ô=Úš#ß*tû…Í£uè†ãËyÁ8Ðxrs­…Wô¾µ€­Ã æ$ ¸QÆ›†!“†l"YÓà!°$ˆ¶q(só5Í#C\'n ²#úºÁˆÚŠå#æ©d¢­]]9ü„ÅâÈÆ,¶ôFã>>‰äüþÛoæ¥MëÚŠûýn÷ø~¿ìÛzßz3Câ6uxźm+maÔzþôsôwÚa.* m~wD‡xHuDDÛü~e›e®;X·ú!ÐY‘}ã˜e‚9Œº7òϨÑñrjj‹€¦™ BW˜ûDø!H0Їr'÷¹Xe™ Åi•P¹®˜vVæLgµdÂiæR_²äx±ê‘ z)–}ij›Ku¤aT‘X"1úSbŒßa0<¢·¢«1Û,P+vw,*4„¢GMõÎKe©wó}-“Õê‹©©Ðà=§–]»ŠHöˆ}¡Îµ<Ü—û‡|\JK}Øëÿn4MO JæÝµw·±D]Õpöµ-ã'$H™fΣÖPdF •‘½÷lÑ–½Ei`þûñ¯î¿ûö¸n ×pé“$ Þø+Rj.Ïá_º[;KöùTàEĵ“ïWÜ\õˆO’¯3gHÂK‘“[iªg†ä¯~äûj%._ü•[üm­ý– €·~ίH¹=6rÀÏ}L{£¦õƘâM/ ü†‰.×Ïõiß”/2±Ð? ñOy¿À\ô—ú>WÖÿ¹×ÁëŠÍ¥ü6¤¿/þ¼kpÎí™SŸ)àÛåqÞdòü´eŸonž°5.|mn§wßÈtøùÞ²Þrÿx©â൷yëïyr6¸‘™pþ ŸÙ!^›:9Ïð4ó‰ø”éïç5Û¥Œ{ûÒoí’¼þ¨gßç½ÛïŠ>¹mä¹@¬“…œ?qÖ¸U{Ì—¢>¯ß󼽿 5~ÞSâg ù·Çá3×Ìt äó©´•ÓŠ#xS$œµ³º—üaù¸ï˪ÌT>­­L³¹Ñm˜¯V+wߺEë?ì£õ?¼/jµúú€¶¾û–îeX:vwS¬Ë‡?NÕ±4fìjñÞJq¸I«~÷Ý7S-™ÿ¿þï@$“å¦ÌHn§¼ÁáhLC‹ÆÆŽ¯„*Ht÷d=xfH@î(¾ivÎM¶7Ü+rE?àïGš¨:”4ƒ ̬» ¢ :,-2{@ë–¸*À–a°ER™ 7ƒåþñ)"A¨ïïîvww³J¢Ìöî¾>-½µ ,´«°Ú!É·ƒ§VtƒìñœzœÊÿãÇ8r ‘înÉPê]¤ðháe¶9&5Â$0‹H}åŠì;8”ïNL94¿’ÖkÂ7.¹ú|lÀʹ!¿£#ô%Ö=äþfšôâ¹nÕ±À«¹öT2;ÜXƒ¤gF™R4Ä!Ø`•Œ¢LeFW¶¸*˜ZŠt›„„°¶P°Lž‘­õž‰H„2G½‘hÙ°ádvpÚl!à“poðÉâ,¦®ÈÃ(Ûˈ4s.†!Ê32 mgö±IHÒŽEMÅ*$ã,M½5²©xŽO°fh6ãnÆúÝ4UÌäºj]ñ˜zç¤i1í Ê“ª8àX HT!%áÉ•²±OIfÒ ¾ Ó*Ç à bóbuŽ&™üP÷ N4šd@ ¹(6¬=9’Æçd!Ö¬ð0vá[ Ngd[´,<]äži(MÊNµÖ\µÖöÃ~µï¦Ý\PJY\Š,³÷âtªrä_C=ÚÝÝèÖ3Мeß÷ü˜ïîî{§Çö_Ûß+Ñ£ù„ÖÛÈ—s®DÄ^±= €e ·¡ Ü?à¶é׿ðéà,ÂQWº«9mª¶øbjÝbr[8Óaw =¶¿‡Ãw@n$LdG|‚—ÍW£Ö-Å~ˆþ‚S º~·˜ï|~W{g´^f•¹²dï|þî›zwߟ²/-³Q$ºaÍž™B’¥B™+•ûn 7$‘óæò¾™ŽØ´…(x0 9«>Í­¨h[Gô¥ƒŽu/ºX5•Ò‡Y™J± ^9Ï^¼–i¢¢·—29<Éî„--{d)ßýïÿŽîxjËŸ~È}«¿¨ [‰y†ÜhU½©¢•i!*­Iåa§Ãìº[IŠdNIÊܰžƒç’ŠÑúö_è™øÿ/ÿõ¿}ëæàS¡Mjס®ØøÒu,J]lŸ.ú´ôöR æó…ޤÁY„_r¬~û†íæ™_ý(ÿìŠç`  ·«ŸÏºÕ#~IæÔDôëkR¼a’|ó?ë¸qeš!¼xä~é®~µ ÀMPÏÎÅGNÎk'¹¾ü Ùù«ÙÙý”ê×)@×ßù‰G’®ŠSëî34ÐçTð¢|êP|ÿÊÙö-€›(­Ÿ¨ó¾¥ê%ÎM ÊKùøoŠJ_†¾i\|qÿÇŠµó¬ú3þíç¡?u|ÿ³‡Î¿Öí3o\F¾|øãËÇ}ß/Êü¸ßìì¦RKôt÷Ý7÷ÙÛ²_ê\¹† £í¦:Mþ0Õ|ZJ¬¨ER¶V"ÖZ–¾,ÕÍIŸ‹g)SѲNsyxwˆemêOOšçþŸþÏséÈŒRÃÍQ¢@#„¬f‚ÔGéÂ9ʬÏ~PÔ 83ž¸wX…„ôŠ3²Ô7èÿPÙú–œ[®?ªí…B$ѱ«>„ ûG´%­l½rž•ƒÛíñ(Åvó¼_—L ~ÈÂæßN³C%{ùØÐR‰®¬÷(ú‚\á†R˜¡½Þøû ø´¥ÖÑ×Í`ˆ}Z7s˜kÏw;™ˆ$rYÒ‚ÝD‹?éŽtDGQ¥…5,jZ0re6ÁìÔÊƒÑ 3€]@ -0‰ö´‘‚2ѳ["Cˆ±šp e$¨ÌÀ u­oŒ ©ºd’¦ê=î©l«R‘n°>ÊÓ®€žO 0Ò³9Äè”6ô•ÝE×,³ŽÚ¹#tªjíxhf‰,Z©,rÁÉÇÔ쨥*)êž·bÕîv¼(^[F/ ÏâFC"ºh†Ö2"Jq‰xÿøžÐwß~óã㇧u!Ð{þ×?ý l>a]ÚdªDŒÎ ô@_aܲæ·p×IÖÿÔ  aËÌ·-y#µ¿lIú":a‚‘Ûä=*i(”Ýæó¡ aŽR Ñaˆõàóa[äR*¦²í,¼@‚ n€aÄ´`°õ»¯í„¶Ÿl[,Í F² “O³†ìOOëû=!s§¤½h,>¢ì=„n’ú¾*G  ÙG¦,1ÖÞGgœO’52Á?10WböòPîö¹¶&ˆS õ®Þ©íf¯óΦZ‹Já>2’ÅÇŽÜîŸü# A)êîßfˆûsU ˨°@«fKèÇG§wwØÕ5A7=’d†RQkuÒÌÆ˜è„R©è=#ûÚ¢õX7¿ßøÿïþím]R:—H_”úN=„òh6Ž*v±ó|Þ9=B€E]oüŸ'd‰ýìR’8!õ?ßÕTž i÷7ôI±†ÏÛ¤ zø‹2Ç…1Àé_?½ßäi|âlІ'÷³óñ|½W²q8%‘¥ëZžmÿ6Ç ×±M/¤¾ñb¿Wá0zÇMâÄmÅ„·ûýg$1Ê!ÔþÑÜÏ\}Bã)¹Š_à”xN/á[„þkéÆÑêR‡^•"/ðÅ“+¦éÅ›`ÀÛù—õß—4¸·h‘׃/Ä [rùášyB>Ó´Nã"ÚÆÇñW}òކ¯°’>áÁ dž·<ãͰÜë.&ßÏ+òÒÍXËÍa~ezUaxƈÏè8“À^“þd&€a~”Dž¡´XµÓ¥ê%¡ö&ètþ•÷t•|iô½1Âô æÒ«ñž_>ÚúLÀ~Y»ÿê÷¹…N£W¤õÐ/^À/ÃP¼°bÿ„y{ïÍŸå;W4?ã²úäwð³nä§Ì~ò+ùœ €Ó¬ƒëqu‘쮯Ù:ñ®!_;XüŒ­üº$¯ |iGóÕGúÕîï³ËR^¯¸òûæ¥ñõ§?ë²àSï’ŸZ·¾Úüη6–Î[–·ö3‰>ÕÏNìòú |øãíqËkû¸ß×»«—©²ÔiB¬ÅÖ÷ûû‡áKÛgk^üáÝ»ÉÉß?~ä<‘>UI5ÆN»åýcºÕw;‡}øð´|Ü?ÜívÅëŒõømÔjjd×^±@Ñ R‡nƒ-“}Hi^à¹2ÂcÏV ÛliAÐáƒ|]·cÔ°É;©r”»Çúˆö½3ºµ}˜ÃBÀÜWnäîR@™Oisß6ÏÌñYvÀ}àÀ#"ÊQÇTç -éŲ6DÔÙ£Ë=³kÝ7 ¥VÉëÑ2³–"¤ZGK2F"¥5 š¢Ö‚Zb%p)Á½¢'`¨Áõý¿A£:ÅG!Q‰€fuwL¸XÈA´ªR!`L¢Èœ æ=-"÷™#´pG[3e˜g±*¥Ò¹#º˜‰ß…}”žBJtC$-T ºá‰"P 5#U’žÌ€JnŽ¿‚dTøâ$hr0np¥l“H)ˆ‰¦@Gôƒ6~ßMJhQÎdkz¶Ñê(´]Ç’Ñ]™¸ —i€išfØÃí¶ZÝ·¶öî†w³—»²Î«z6¹hœkµZÊTk™„xZ3UÜ[¬ÿýOûµ÷wsþøÃë t+kïë½­È€zÛ/†áG$R§©9g…‹ÃVw“¤¡Ôm~H ܶ3kr‹ FbºÛ‚X曚Ëac.°"‰žÛäí$8ÄýaÞë#y£pж¹ g"ã07:·avóñ A,1œ¬$¤Ôy"s]ž2¨•^L)ƒg(b”m,0¶Êè•xz„v}…ØŒ2ÁúÆùöÈ£^ad¼@=iÌábBNV”lêÂÝ´SÁTj-s)µN³Ù¤y¶iJ —Ì ‘ÝÊVJ1zäüÝïôá)–æøÖ¿{g„í÷êf;”ÂèÁRrßû]¶Åré ÈKp S'”)¤„¤™"††$£EïúÚ²o€ÌƒßïÝü¿ý÷ÿî|»«ó=Ã-Q˜'IR›Ú¡cÁ!€rÂá{ú"_Ù=ë"Eý ¶~'²…¾¬€ÏÂú1AâYgø¤ñ+cùçÍÂýY*ðÖûgµóO­ø¹„oV_9'ü™È/ >¯{üÔ €Ÿ¦A}vÀç~ÐÉT¬¡›ßb¨ÅwñËW|Ö§ü|¢­¤W®Ú[øB™×©Ð¤«¯·ë~ùÐùWƒxÁ°á/þKŸiˆòÓ^Áèà ús{|¢kóM²ÝgÉÿoœ|¿`kõ•®÷i°ÆÅÒxÖ†Ó·=#¿üµ _ç‘ôuæò[„ÊŠ?5£ñFž¿ÊX>Øýò§]ôó;ÛO/³±M=L°`*0Û!Ö­|!¥n}8V`8 ™`…"‘ ¬®™¿”1Üój äRQ&PÜ’ ×ÌtP®LEÉ)éDPI0ØWéZW¡o`tHô޲o”˜P<4­t+½÷ ­ûœf‡£÷è-ì{²†!E§OnB„¢m¥K‰¢èíÖ^J[µ.½ÖÁ\·ýS3g­µµh­gËH0QæB‘ˆLíæjÖÞRC3Ã$ treå(/‘m ˆ,$À¦õ`$Td D–B™1’tIg £b"š¸ 2MÀŠ|L3èÁm’Í î]¬ÙÄš*‹YA5Ñ5¯þ¡D‘uÁ¨©pLŽÅ²&=;»/’¥%3ÈΔؤˆM2"GÞª !lèÉ#㜑"ISGfQ5‹'…¢ìHʈÎüÆýCô%²’¬C3 1Óš²…Šèä’É©Yq.ž 0ØKvK_(²!û YÎÍ Ë‰HÝ» T,]¸À,SÍH¤÷OnVÒÖ¶–,ô‘”,·¢Ìe]ØÍ÷s{kÑĤ‘%£÷´1%@‰eÝp4ÑžWŠQPÔ7C•íËâðº¹^‹° ÷mp?`¤†k7aؾÀ(ÓÑqÈsû¬ Ó_ÑVX›À£²mŒOfêFDÁ7ëòa `‚ 4ø°)N(ófß ‡ »ïù´²$™H˜SÙS¡t‰ÈL¦yqT£‡ÁÌKï áŠëêÈ<ðý‡wH‚õy=ÊvxÌCÎëˆ[ Ë –ôd$ð¤–fîµú´0Yë\v(µ¢Ô´Åœô|¿ï=áD±œª€Ê^óÿúŸBÔ~™=Ì6UŽR©ÞôcònÂÝŒD¶Àl‚Ã-¿±ø°æš½Ö,‡˜`J$kq™é`D æQÑzölëš-”e¥–²›þÕ¿ûw—ÁžgâŽ%ûPåx,Ö3¼çÊÛU/×Nÿõâ:]ô“»^¾´½ù|z ¯ Ë/²Adžîv~9‰ŸðøjýýF)í·wСBþø†ùÖöú¬s‡n”øŸü~•Ï{Ø }­ý '‰Ï6ý Яg‚w>BqUWtáðó·Ì±´þ5}üRôRÉ×Û>þ©öWÀ/Sz¾Thº¡×¿¨Š<3Ä^ îžV?¼rÙ_¦yƒÐy¼\훜œ_jõ¼mþBÊßÕÙSŸpZtUªrÑ‘¼âS}Ýb/9uogû™çmO¹±k¹>Ìw|}m=#AŸî*Ÿ[æZ÷~6œïXÏø)ÏûÑç‹â#t’êrSV¿˜ý·aòlñÚ¶ÈÚ`ÌgùÅ%·”é-ær¦6(B<»ûgëîÛ7vÑÔ'% ÏÛ n+÷xÝ«+éê¥ÛK7 ¯×H]ž/n¶9t`ÙðŽ‘G.ÓåVè†s–„³wÏkÿÈ6¹ECºqÓ×C{ãHÙ-ådŸçäm͹u‘ë„óW ÝíOëyO[ç¹Dì¹SžŠ—£A¼#œ³»Aºµ0è¼úf“áåH¯¤ËÃÖu ðjv®ØŸÍKÇ}öõâúâJF¾°CtkÉçv×1Íí¥¸ÊõÊñR6Çéþç¦ ÇF4Ϧ›ËƒÂ±¸äìÍœLäåÌyny|È}?b&íy5€@3fã/uóayvá‹pxÅøð÷ß/Ÿb¿¨÷÷ûýÃwßøT§yî½GÏâ=3ÍMÊ”re<íÑâ›oÞÝϳïמóýüa¯]>üø§‡û»Ç½Z“[›«^ý~ŠˆÖ˜9Ü€õ?ÿ?>däþ©µ^”Ù ˜!·ÜyŠ…ì@ÀŒ¢`LRŒ‘î·¶ÙrÂ7/Ím 3d :Tþ¾åÆŽÖ@ŒAÆ—6X‰lPÊ Œ¾f`»7mÚAš{é-°[µy¯…žt¸-Ë„hðb)¡uÔ »d #wïPÜæ©$:<77‚Øî| ¿!(Z?¾_ŽãaS^áíñÈ­þ@L¶%ŒhúvåACêÙ`ÝÔИ ˆ é5jæÊQ³N¸e¦¨ðn¬U=E…ž0ƒ‚°NÂÒ`”gC_¶¦ö2¤f0%RÃc×h©T¸²%¢«°˜©–)2¼"¤P°fFÊÄžðD†Ñ a]DïïQ=Û=’4õOº×Ý4ßÕAbpÌ‚™;§¹>=¶è’ùÝ\ÛÒbKèæ*„$pw˜åHHA¢MÇlg¶@ TÈJŸ\$ eÊG5‹ú(óLéL‘ä`ƒŠ‘É;ZB+ô;Ã,5ªWSO™f°?•Ö4MÚSi¢a íˈ¨8Œ+0%Ôpc> ïsALb(ÖHP©Ð g!µÙK˜™Ž¬ó„ ™3-31›¹ù‚PÉê¸W‰ô%z1á]”}‹}dO4åD›èhRH¶b ð9)áiŸVôÈ)“¨É5мÒi9‰Qðh™=³çªhRÝÙÊ^¬—pgIEiXj),u*j9¢wž ™Ù4Ü®-°¶\¾¿l½g!2sÍU+ÐЇ¶Þz µsi ¢í àDuøt`Øêàk‚RàDJx!1}ÛL2au³ 1icøGï[Öü°ÝP X` V=Qê6u¸o|ÿ4D;¸¡Ü·ÉaÛ5øV8…g¬ Ü¶—¦Q9¤Qð•Ü»ŠÁ‚rxdw3‡Yö†8Á…ì0<_9”sDµù—ð@,áv0¶MÙ!®*ÊÍ&™/µÔ‡én*Ì]ÝÏ“Yu«ªÏ•µxÌÃË"ÌzuBwóßá‡ñ§öí=¦‰…LiYé@q»sD˧e‹Ãd‡&™q_LK9YK*æ™id)®Td@õ^DÚ²öÖ³‡2iæÅËTËTÿÅ¿ù7‡}¯JÆîÇ¡ò"²íç5)ñ¸ã:÷æ9”uƒùP§PÍgþç•?×õ&sÌoÇüŒ£ Ë“ý<ÉÓÄË˃ ÞxÒ?¥vœ³^Êß8ì1u}¿ÊýçMï–¬€ 5ðƾõæSI²ó©âÄÐÄ•'Âuxäøsò¡[~ ^ÍÚ;j”Ï5 gˆ•ÓÃÿùÑü…èæ;;m_!T\¨<>žªžò[-‘ž (x©K=?€>¥ÓO½%y¬?ìóÅcÎÌYÒÌKb¦Þ@5N’|NðÍo9ªè i‰G![|ÊÙ€xÐÎ×4¥Ÿ3Ά2Χ›‹³àÛ¶¯¾ÝŠ]©^'²¿ÎqÌ·ACç C³â;üÔÉ_Ô£~ê8ý4Ôþ«‡†o¼ò:Fò…!¦Ë ùM‹+] ïoêÞ*ÐüÌ2p¾< Ÿ£O|éäôÖw¯Ëu—'þgY¯ÎPRn ›ƒñ8t»ï¾ÿã÷ËÇÇö´Wk"}ž§¹Ð]PôbJñ¶¶ùnzxxâÆ<ÍÓ\ÛÒûþñû?~ðZê·wú±·žFø\Û?Cñz7[Hûý`&J-a\þ?ÿï»*¡»% Hõ”@8œ0: Ú¬lÁº›3€—-%–†#Ùbc‚€Z‡gÍ„ÅáóV(0æìM,#à±EùLÀ›Žöˆì[V~ê Ù†®Žj¬©u]—k™k­sé}‰–f6Õ»}>‰9͇[uÜ}»E`¹ôž x=Bò âD7çá¬<„À†7«aŸËö\ƒ$n­ƒÉži0FœèÌáàm@•Ð]–@¡%¢djݰA6•©«–&šÓ&2&àJ:2eÍ`ÐÊÊ¢Þ°,[Mì~CÈhIw‘"‚aš* K"²ÒÝj1¢¸™í¥¸š†èïÉâ4ãòÅsKÛàpë…;DÁ˜•­+ržXwõãjÉ»]u²·è=ÝFr4›ªÙò¸¶I@ZfZªƒ),B1cj4È%…‡ q!ÔĶ¥¨I•*ÆL6'•–Þ•3Ü1R©Ýä‚Ã(PRŽt#ÒSñT´Þ5ýèïd½ÆÝ¬{rJ{d–•Yõvâ.l* ªK÷Õ¤ ¤”2v¬ ˜~p „(¨þß%P $ Œ- &3šcÍn†ª3’¡x`%쬹U>Øšyo>fì5 ‚ƒ… à1£’–DÂ$"±£/©$`\L¦¾€+Ú+¨ÝªYeœ D¤«¬Ù­Ö‚²lkóÕ¢ÈeÖÞ"Dk¿{xèkß÷U‚É" ¡÷A©ÊèÛ;ξÅeÒHê)t!0¨WÃøw Àpˆÿ/[ÉQ©ßð\Fð¥";4L5*`„(XgÄ‚ì€m“À–RRPš1Ì“9zaìÛ̃ƒÇ@j°€Mó€!‹8†Év®²Š P˜Ñ™´Õìx>O%‰+Æ9º Ã>¤xàKç^˜`Bop‡Ú!x¨Ì6ž[&‡‰z„@¥XQÉÈ5C ™¶SHròb^ë´ Ôâ>×»ÝÔb<ÔZ&{lj²ûšÕH²‡ß½C븛íÝÝ¥)Äe•‘ÓĹÊï-CîHéêýš»]‚xZ-ù4O²-Ù_‚Ûfœ©õEèA@‘ŠŒÑF™V¼î¦»oþöŸÿ«ƒŽ;Êkt¨N=ËÈ:KI¸>GñŒV{šÎŒKi÷+šŽGô£ôú:èü*›CzÖóF¶úEÀéöí“`Ÿ›¯çÄù@º€µëƪ'oÝà¤^ók2h¾VÀ×â!ð*Lò û¿ÛýŸŸÝ¯?£à,ýígùú™óhßö~ŽZø/]À«Ô´ *úM­ü‹>Aoi,žÄA^jºë„߯Rp­·~Ò£õWÉÂ~Ë7¼Zøò €·AŽ|¸Í7ˆÇê›ÄåßPÀ¯¿ùõúlÿÓ+~ÉÚ»_ Ýó³ô>Êoò->Þ/Ôyn¸è~•¸XÝø™´¸M~ýU[ÿsqh¿½êSH@ø³špQçð6îÿ—Ç®4~Íy—ûœ×÷–UG_w„œ9ikk¾èÃxc;zz¹>Oé`²þ|¢:$íQ'Káûÿöýòá±=îµ¶R™§2+L+%CïÿôþÉößüáÝÖý~}êÑz¶þ;mK|xúqYWeNÉ\š"zô»y¾ŸÊ/6Ñ}Y ¾sOe'AÛÿçÿ¯g×¾+žLr°ËÈP¦âfZk¾eWHŠ>RÂ79 ‡œVsGô õÜ(Ò8dÎnª}T§¾á釗¦ Z@;””> &ø„‘ÞNC!˜Ènî¾,+ÀRŠ„RŠîÞ{OåFù0Àà9Û†Zìnš—\¢§UÀsø|n £ Ÿ‡iÞ@!ßRþX¶è˜:àèû-Çß…©¹Þ¶’…bhÜ;"`Ð&õ‘2è>ÔA?A5eÖèpXyüÐ#èâÌú´_;Ò*–cUƒÛ"s®]Ý”+×&NÛ›âÈ„è¨.&³3ƒjiUu&°JÑ»³’V«›#’TI"W¤Òàe*‘QŠ•]*€Ä ¼!A¦ÐëœÓ=ŠÁK5¬*„¤©Œ¦»im @­^Ü{À0üúð)è™ÝX¥ûb»RÖÞ?¤(Dk¢˜HÀp¬N©š“ìÉ PÆHÕÛ29ü„l ™)pÂÀ'$ ¦ ƒ“\+TÀÎ]Ò  ¡fT_ z @7P¶†²hr*e†áÃK“½a:@ª&ýÈÜÎSM9ÕiÚMV>çT:¡Ý¼›ªHxa-¾ªû·S®k|\f|x´Zè´jðŠøð”\ñîv“JÉĶR³%˜1‘:PþÍ23z72#”êk‹ˆQB¥Ì$àµZõ³Äÿç NÒ xDóÝ(/~ÛÖZŸ“*ñ5%!¾ž¿õuõ‹›½Qïxã’øâí3> lüósøŠ€+ám»Jüd„ú …¿‰SÌoópyòNô«|úÉ —é_¯iì?´uuÀÔoã üËÞv3Ûï_÷½&|ƒFçÞ*Ô¿&·ü†•Ç_:{YüíSþ_w~É–üf&è'ÚùÀº®J¹éÖþö€ßs‘Íñj[Ûy Åià¢6R'U0|¦×ÜØ_ú¬jKšõIqÓé7]ÆäŽk÷%ÿüºgRØ1÷Ÿ·ËÕη°<ÔûŽómÕº¶Å 3 Ò kA´vEP¡áC`0ÅÖ“d}°hb©ËÚ-úب3Ý*àZ#"E7w–6³²Ft$Ú’kT:á"ˆ¥AY'š 6¬›Ó ”¶¶Ž "è}-uÚíêÇ=gX)…¤Rûe…²ŽtõPJvS©-P,#RÚ „ ‚¨`t@¡Õ¬Ø ŒÝÄðÉ&Ip”dl›™ªì¦&·D.M²í°GêÁñGØj/É BØ ¨@b/¹FëB%Ù÷²9ГY)†}ì9ǘ 5> i„ZÊ·XІé‚!!3qG/fkfPʰ–¨áßdý1Úš9ÓïÍ?F4%‰…´*ë0QPèТÜÑÞYù˜AðÁl=IhÙA#žR fãl,´ÇÌ•Jv+°*3ܱÈm¯ö¡=õLCXK3·,ŽXrÚÀ5³ÁŠh‰@ß§'JdG_¶Ìt¢oØýãò’'iÌc‚‰á˜€jð >¾¥e§õ°ˆÛ¶c1 û=jÅô‰­°i7o\/:êD®{xj„$3a êtX’Û=‰Z !ÛÁÅàe£¬™O궺+€ð²9ôXRÜflô&€4ЛƠ)Vó¤ßÝÏOïÞému˜o¡ÖÍ8nY£…H˜ÙäPh,æžiæÜUŸPƒ6Ùdu*»yº»«óT­–RÖ©º(ÉBú¸†—\V°ÑwU=Õ“„FéÐTA¥€–tãÝNÞ ¡0–¥EjžJ1zÉL%“Þ$n¥Ì˜cÅN)•Ñ›±¬ÊèhF3+>íæù›»¿ýçÿòüüs\;bxà*\í Oj2O¡‹<ßWKÏ“ý1rwzÔ°œ †Æî`û  ¾ I¼Ty|ïä¶á<Û£> ¼Ÿëê xz>¿­>»æ‘WËçºÉë € é²2àú#ÏñŽ/ÄžÝÌ\ u†Ãäq׸57¯1²:EØè4aþ¼)^ØÌŸâ‡Îè3Â*î/#€xR rÉnº*)?zU^wX}%ÉIÏ ÚêèË“§ÛÝçî­—º3^çÕIgÜÆi“ºT|øÊ9VºÂ@Ÿ>ß@.Ÿž-ù’Þúå\<ÕLχ¯Ï°ºq.æñiá’ç²ÆIg"ÃËð“ëŒøsDZ¯h¼” žMN!n¤´³)â´ ç"8ñ‹GÔ^úÌ·ÿÞV!¿ThÞv·Ï*ËÅŒt›õ éå¥;yæôžÜówÇg^2xÊ »Õ"oäÌüeCçoÂñn—^j/M]/¦?eô¼NFºÙµn®æ®KÀêÞ‚‘OO뺬¦¼ŸëüÝÃï+DóÙ,—Çÿð£gEB½¥™rt•$i‡SùÚ´A~h¼äÑíÁmcYHˆsôVQ 40ý†²+ryVÿ m¥l»C¯=VF 6ŸÏá °9â nwÖ|j-Ãæ·º—jµeêÕY;׈Fd»»;ûu%’n©¼»¯µ”5ZÚ‰2AØ =ÑCÌØµ¶E# Qa^'Ö …歷H5ÁÔa†@ÒØB ±lƒHDß„¼ì@‚[ý„Âä†)À€B™„6 _#HFhÓ*tK÷eéô´ô4s43Zx‡ÀLp0 ùzƒªè`@zÈ­Øòõ3³ NÖZD„êÌ HŠæ{0¬ÒµzP¨^Ù£›!3ܬÔÒZG€Ý4µýR&ÏH} IóRÙ†'‘B«¬ Aùôñ‰Ý(åãh<•*´at£MÉPD.Á o€iÌã8`úÆ\4¢FãðÒ%dìƒzžÚ ³³¸<ås®¡4‰´@ŸRó¤³[·Ü9h©9eȽÝk')̰‡EG”»ªsMIòéBH ›Ê†~9ìZ¶ÝR£'²lâ6X'g M²d"‹¹‚LÞY-436Ä“"V;9RxÌØ™Ø+œÌS˜iÃT`c8g“‹²ld/tàÖ¡LÆp=%(N¹dè€K+´C±Œth™\ˆÜßÍódSÛ·=ŸÌ! : ÈÐ׭Φr¢­j††îŸ‡ Ž,±<ŒÔy¨ÿÃhäx(u Û+ð øfº[*z ˆ€ØÄRKf©õu5‹1ÒGe ÀºB!sxAôƒ{ð´ù÷ ˆ¶I /ÛM{EæéÜLѹ!wxZ d€¯Û|K":zƒÙ˜™Ñ—Q´¤1yš4Œ‘=`aÅ;÷Ëû¶ˆ#ü@ÄÁ»e‹Ô—«<¨›B«V ì…¶uïyçxÐS2à¯6íêìÓÔvY+XKZÉÉÚÆ;Š~Wën*`®=IÔB3¶>ü” ó¤R0U¸k¿ç²Ê,J¥I!*ŵ1•µÀLJAî42F£KõµGëÙ##†Ó¯÷Z¼ÖöwwÿÝ·gÞHÏÈégWßsUðÕÉuµþßyúHœ&]˜u}~ù1ÞRðS7ÉB·¥øÃ¾˜¯dóžóGŸÊä‹g¿Û²NÕÀOï ‡žýj;la‹W…cœËÿ7’ó^UÍÞ\­-鳵ŗõ ½Zü𜗧s]zÂ|žyöZøEþ§~Us½)‡ê†€ŽOZaà-õë~ݪ8Ü|vÿgáaƒóÁ}Eˆ~Y){õïßVý.^ž¥ôšaæo$?úÍàÏÐL_ý”kÃ/óZ¿6B¸P±_ ð|¸óäí¤ûþü¦Ðù‹{ãe_élÇdùϳ_û9BkŸÕz?ëTpÜü&@ýúòns±Æ¾èa?Ì¿hþÒoøå}å]äÏs‹:³óþËø:šãžŽ¾m¼ý•¶ÝŠìàdƒó‰©ŽÛi•:~‘ÞÿñOûÛã^ûUOûýïÞ­ûfRÙUÒGVc_{Dþøãû÷þñ?3Z{\RŒ5Uâññãº_Õûn7MÅŸÖz7÷eýþ?ÿýï¾»·:Ù¬“îûÿô'(z*÷ö´W_Í‘iD’¤Á4Ç‘Õe/@jÓ‰ "Ê–-# ðŠ2¡õÄ$Ô¯ðºÙÞn8  R@§ÄC™—@ƒ:úÓFÞ7ƒ„H쟞ÈÌ¡[9Í­¬­G†µúnÞ™Y¶'%2P&ìÛš»‡© w»©õµxéÙá9nc@‡·G¹eÚn„ Û2¡>QòÝï²=AÑ—‘^ EÊŠ@Ä:Rk-=£Aë3kÛËÖNT2GÞknÿ:˜!R‡ µ”5”ëˆÍ仿®Éê‡ÇPGÂŒÞò± •»Jhñ¢HhB˜Xlyd¬VÑIã–Ì'Žº ÅážÁ0ÀçÚz§1u2d€¬³ÏSéf˺Òi§gö¨¥ÐÈ`DÒWÈDv€ÐJ@Ñš¥Tk=RîÅœ½­“Dss‹Do™‘"Ý-BJ-©}ꎸ«¾$ÇãÐ'–äzˆ.yªš(†É¶W'ƒÅ’“eôdPR„œÌÈœ!‡‹Y]FJ9™¥!S£³JžlFUE #?Z[9U½s4jÝû}ÍI\¥Ü¬ ’&xj”Tp¸­Šù-‰¤Á4Ù˜v’9à9)L #z"HT2KDq»Ÿê÷m]3Ìñ®TO:ùq I]ZZCg i±*•mFâÎü)À.ïèN>*BX¡ÒL›h9Ñ…wäìL¨;ÜÃ4e à½IpÝù¬‘°$õ¸.=8=ì0WƒS)U=×È–eWäLyªôN"2"A9¥Z™E†ÚÚbm£œÍ‹{­e.÷ß¾ûg÷ÏŸ“1N°|§úí³3¯ðÕ˜=z. §¾>ðòÆnêgæjÞÔ@/_e§­pÊËøë×'| Žp¤¿~}eäÍ€ŸòR`T¿½¡þËa‘¾öÙö³´ø×óÒk–¿êsýCç?+ð›Z8^)yéu\ä |‚q3ˆ}£úªs ^±ã×r1­ðê×mt5]E“yMJ‘nÉN7\†OXC8¦ìžßÊMåq2×kœ”ëT…k,ËI„ðò›=Wꘜ˳oUÈ<úƒ_"ºóÂzô¤š“§ûvñ¬àð¢˜ô¢NìªÌìÐ&à3ùðtO{D‚nz¦Š_Šè´BïF°n´9/;÷Y­ã±Žê¢Wè2þÀóœ{·Ú›æÀóÔq^­ö<9Zj"oìÒ5úD$>Tl ãõr`åâ:Ô ÈEÔm“çÓR\ž¤ˆ#äç±óóÆä)éò ssìá S”Îs¹¶Z=oaôb5ƒ®¦E¾’±ój úXp÷,7ëä÷—Kƒô9³ì–RGÉkk±>-ßþþ[œiÔÓ2£N“¹O÷SɘªËðøáÑ‹¥¢-K¶þí»Ý\¦u¿våšmº›Ë\!‰±8¬==R]’nDÒ|Cï Vn2âY¦7XAq`Àpüyò•6õ¤²†œk Fd¢-ðJ¡5!fÈxhvAëf°9ì.KW(‘ nèûL7%–ý™æX–u›1-#‘ifØM‰ìZ½X_ "‘L~è4`Ø]2![iÂ\¦’}E &)iÞ?>®ë^]æfõP6Ä]AXál¨öAh( ê „Qf°E8iLe™j N¾ó{ë±rß[’ø<™õˆÇK—M-Iæ]ܵµtÊh1ÙìÅ—E s@Ù;²këôN+¤Ä fG|Ô=Ðá@dÞ}ƒoîð¾*mš&##û~¿Ø½8®K©˜§º¬«†ù/ÐöM‰žÙº†ÃÀ­dK‰±öÞsL•‚õ5ÀBcˆ½u/n!+Þ{*e©bÜw=-=ͼ¡Õ ™ƒ^É"Ðl•:Ô¡,bRfœ,'ƒ#çTÁ•ÂŒ¦L§,•C£ŸŒJk©B=&+©ëIX]«0 J²è¾J`sXÉP¨Úfc’âд5(‚”ñàá|0Ù0Ð7,Þ¨ F¿ƒmÓÑ GÑ®­ƒ(éž~‡’ÔÚ£˜=FwP §y(SN{̾Ï(fNQÍB˜˜¸£ø … À"u FÛgvh‡Qx±Í "çäCå“çJ€ØÉ“‘<¡3I­±º›æ:Ö–…îPš›÷ÑêÙÝ—ÚΘ„{ ÷mþ…G¡¿ëúÏC0`äm™a¾ƒH¨V ²-Â#ÜØÇTHÀ ܶJ¦èhk>6«îVéÅkíO2s äa¾m?ÆFÒ +î´QøÃ܃¤bÀ1R>o¡S{ô†ãÒ2æ½±fÕ‚Ra«è¶l7 ¾EÇ=#`™°1 Ë“2Q¦\Wh¿•dˆaÍ]@!W¬(u+Òbµ21ÉþqI§ÕRá4ú}™#ó¹Ú·}ŠÉ²VLé¦2¯êÆ|W¦¿ùÝQª[di¡ÿå}”bw"8Õì}£ ºëá®™7º»åÚ«ôÌ(‘æÝ2až0–Òª YÜ×Þm¼Ï”"Û̈µgD¶ˆ”;K­>—»oü³¿ûç¸*ñ=Û`®ÏMžlyVÖMÝØ·n ÁÃy¦‘á?:;>ê4™å û²-îM¶€ûk¨¤Âå–ï¹Tù…}ø-OijÃÒ­ü‘â:Rtú¹Ø6^üÔ­}ôñÄ(Ý®‰×©hp³8ö“Ò¤çcô)»èàø«3”­®›z.ƒÞ:â'gÑó=>ŸY·Ïgù#·çZÖÐ9šV/Ð*NÈ/b[ŽÈÔYy,µ0¼.8Ð5ŒóFè@/æÔ\îŽoœ uÆæ«4 ò²D檜GbîKÇÜÏU˜‰OKägÐWCŽ—gðóùã뉡·*§Ïµ›#ÈÉž†Šž?/‰øEõ’qÖ ¼éCþÂÞäÉèÖlvTW_ò¡=Z¼®K¾„yóÅaƒ›¾ÇÏËÏÉXWSú)™íæòJÀõ#?Ïñ¨|ðÌ!_zõçê[ ¼À·¸õºß0þMCçOz×ug{É#祾îf¯ûW_óÞþ³×ãî•7ò:ÈèytãCŸ§ï ßùk½¾™/VGZ<_(òúèÆ<¦k¬ßµwTÂO ¤8îëõŠŸ¼Ý¼UXt£ªï½òÒ J±½Hc9UÌ.¤íç2£ËìûKHç)aÿrÊÐõ[>AðéêzÏ‘g·­è!ÍWŸØxÞªÓ:3’¸ønפ¾#ÎE—O~Zx?û›Ó]Òo:ÑÅy;ÃÝó<^GÑ^í¥<¡¦êºo}ÑîF¤éÕ›yét‚ÓíÔ1vZù !iÞxå—;´‹(ÒÙ@ÕíšîOìß.Vë“s²ÏxéÁN¶Ûóû­–9—â¯Ã¡§½îä£ôR×¾ù'l×˃ . -u<7è9زí|NÜ!Ž„ÝÁ­¤Ý>æ¾ÿãËûëã^û%—µÿþÛ:UºÕiæ ˜æ2YAÿÆŒ^*–îµÞÝß=>>}ÿÃõöûòûýÓãÓi~ÿî®—Šuí­õ§¥•R«!–VXBÙ‚Rdf&ª;)B094mÄ쀇ÎMÇÄhcå+7_ÜRá†ÞF^?d¨;ø¸¡D ¸qzØÍßüêëûï{×&’ u_@RÃyØeruõ%l‚ˆlòÜ.3«~—†ÞŸŠ›ßÍ»T.}‰}7ú4•@‡§²eˆyW{oN—‡`"80òˆµ™ Ý0uWË\Ù×̘´dÉj¶Ô`pHFê=¦ws{\­¨ï!¥²­+¹@GÆVmP}+•°QO‰HÀsEhåc{tѨÉÙªŠYÂ×§ÎPv!I¥6ÚDÕTÌ’&–Ê]}lªñÔJw6¤Ñ¼X5¡›E†˜Ê–{ÜGÇÎN¤Ba^çwb]‘é–, 7së«vw‘z³jZRÌ$$Í+µæKÙ’§"²‘n%––-AÉŒ~¬W H› „&!sgæÕ{æÚºK0옜­°á| #;ÔÁ–Q ]bU#F´-“Ã2ÐSÝ@ §ë‘l©,SF¢Öä’Ô”w3ôÑÑX‹¬s¡l5$(Ȇè*°‚xé„§¹,¬$#•ApX«K̆Ä.9‘@ šÜ˜„8™-lè–šaß2ƒ  —ui¢Ïæ)Íæï£'ô­×.=å6°fZ—ž+tO&±—h÷ä|O°@)M¤ }*8\lÂ4ôΡ‰h$1É{¦9]|’?¶•®mpõ6Ý[}>Ë“ëÀ6½l5FÝÿø«;h`„ìðO0î§Ã®ÑµeÙÉž6,¬qD0ø_™Â|R\¢ÒYJ%i𯊄ŒeD‰JÒ<§z•(“I@J…™  ku.eÊu†´h{(óVË0Bq^#žj`E™¡Düþ9¹d4xßëˆ8µ šà(dð´=ÆZn2F‰Lê 똞d“—ZJWvhuV/p'ÊÊÙn*0¯ÅæÙÖðÿîŸä»9Í,—. -t?óŸüÎXôî^ë£àÉL¨ƒJ/ܹr<%XdS†Y+¤À.ôfH©¥Ê&I R¦zE¨÷ì­+R€W¯S­sý—ÿúßèF.Ž.òhx‹‚Ê‹Ô)òM‚OD™+—µgËÓdœ'VÜKÏÅî—” “po ggŒ“‹?'»½:;«ßä"¾äî;îP$^à,Þø›—)”ÇD8~éž_g>¼:¼è:°ÕŒlú×9±ÿµÔœOt˜sÑNºuªÖÛö7›Uo8T<»Ã=kú¦qŸ8ß:•NúôùA—ŸSÍ×O)·Å©×‚g7ÆykÛÿ&Áè"®À/9¿}ú…ò«æ°ë%˜ÉÑóáB¼&®“­.ô»ã5߬e¿ C$Þôý;i©—EÛ—_åë%ØÈµúÿešþ'ï¶F~qþ¼µ@ðåqs;øñŠò{“*sÚ&Ç<ÀŸ;ïþ/:iø)½ëõnüUL¾êàúÂgÁÏOúDà¯_¦_ŸaÇüׯßÞ‹Óoÿ.¹ëA_y?÷ׯ_ë šljó:úDBC»Ò³Møñ€õá?îßlû\öZÖö»oæÝdµÒÝÜ3ÂÌýñýSJ»»k¬ïx_j¹ÿöáîÝ»ŒÑÞÝïlmûÇÜ?.m‰®xøöÎÔâ‡ù÷?żtýá÷ón^€÷ÿÇÿÓ]u΀Óí¨¾µÁÅ-h2;Ä4ˆ„Šw„à ܱ.`Ù–ÄzƒUX HäàW" ‘a¥–x|ŠökççMà$†,O?àþÁÖ­}ìõ–È‘H„ôAzøìû»;š¹ÛÓ²ÔR3UË”hbD6žÆ@-ÅP§Zz,9Ø ‡bXE 9¸íCÇ3%…EÙJ­Ñ#3½XÛ ±lì ÊÚ¾ebº¯Šuù¸Bî€ûf4ê¶A‡Fl@†å×Áî9z§bÐó¥‰AÒº”ëšM™ˆ¥ LÖö}‘Ü,BwSíkt¦Íƒå¤fÊ Pï V‰erWt`A´Ì Ñv$ ¨Ì®ôRîQÙ¬ª›ÊÒ3 ~||ÒnWK­^žökÜ…LÛ/-"tPE¦Á•2s›’2eF€f‘B ¯2ô[$èÆR¤‘f&ÌzÜì=…ŒjÖ”MØGTâQ‚qÚ¢CäÜrç˜ÉBLŒ€b¤ŒÀDÌ2˜>˜' Iƒ"a™w%=0ð\ÂÖ•YE*Avæ£í:»5Õ­Ê,ÑMæè‹]2ëð…u°€I…ÉDK ™R0%„J%*ÍñI;"G˜’Æë“ùÚ³£sQìÌ÷…ö`e…@úHÒ -¤‘Â? RHh€ƒ•ð!3€ôŒØÃlO*bjÑF‹I¬¦ …¢8<­$äbYJi½G* l4O%­·}Ú¨w DGt0°<¡5Ôºy gò#È3€ú¡€výøûÁ³©¶Y‰Ð°¶ Aæ[1œÏÕ›Œ¨÷$UÊa±&×^‹èû}_©Œ2• åÚÇæ#‚æu؃¥GTRʹÄÔ(ŠÈÌ(ó4W#%„Y#‡ ­ÂMJŠ’£Ì[hµŠB_·id÷6Bn„ú¡ØhcsÁëˆÇͱ Çö³èn%hˆ„Sa5Ï- 0ú8JÕJ£¹Ù<Íw´.À½ÑD÷Z±*'«»iê 9Üý÷¿M¡T¨g\xÿmy÷-µÕ8É(×|ùs¥~«ÖÔV ð-*ñic=#K žµ¹Nއ.Ïf>— pÃßèºÀá‚üsÍ:åáG<-Ø=¹ò¥ª|5tšNtõF/ÚDgˆ¢« ü³:Šé*i_¼  \ÛL›ï4õçÚ“wkVž<Œ^ì«W•Üz¥“½ ?Ü×2êµxÃ9[ê² ÏÆ(o$’§ƒ½6(?{r9Öu“Wã¼jª—‹s¯‹0tRpqýþÞ²Ñ:-mã±ûá ]÷L˜ŸÇ^0»ã%Íë$(ƒÐñ‘NÇË Ðö䃥:'sÏi[GœNj t˜EǼøá?ì|ìOO¹¬XÖøGß•Á¨&Ý=£/‹ÏÀýÃ]-=Þÿð>Úúôñãïÿ]_ƒn?þñÇïþð;“ÚãS{ÜßÝM¿ÿîÝã÷ö?|ŒÞÇûý–^ ¤ê²Ôÿ¶>ý?ÿǹ‚=£–ŠžµÐ)æn®3MHcðŽÙ¶ÏVG™0ÝæÚ‚Ö¶‚€Qá°Lð‚ìqÊ VÀÖÑŠ¾æ3 jè øܸÅ~-Ópˆ=Ôzˆ1#Ûn7·¥gD"÷OÓ\h3›ÌNÛÍwôLe‹Vˆê%²¯mAÉžÑ{n¬ß:8pZ¥9’p7³¹¾»¶‡,ÖžR™‹•!dšÝëÞXÝâýþ Ü8$F¨@ 4˜c7ÁáðYNR G¥EGO0e݆¡%Bü»ìÚ/ëè›ÖßV §jFRiÆÜYkA· +¤íæ•Ù™E–;ów“š`“Ñ2BYèò2î=#3YJõ5?Ü.¬Ne*åmí=ÒO­}\Ú¾G-^éÅ="2ÍZ×Ý4ŒÇ¨h=7‚»Û™5™´ýÿ£}‡`þ~‰È¼/˜KQªîïIO!7PŸ)3cAΰ»ûB0FzÏH¨x*Ã\±AT†™eŠ©Œ@ª­-{ïkï=³ú·ÿý»ï¾ýöÿ^7·YÇ•š<ÛœAÿ?-oë¥zÚ‹ýÔ±†V×{ž+é_A§x­ºóäzíkúùrÏ Ýõ­ù¿:gåžf;êSuqØ|®ë&߸‹Ã!ýô*º*`?ÖHûéñg’RžRªð\·ˆ+Z×±2预âú¹®±Z¼âóNê(õ¼F<¬^§X½¼ûÒ¹¬;.ÿyï§ ñ¥ª|”Oy«úçvpº¡ÿC·úèóSó…‘w,ãU=ãMÝÿY–>•L\qðúGÑœWRøŒb¶Nva—Zìå›/GOvâµÿµöñEóäÄ‹¯Bg»Ð[~ºÚr¤Éåsz‘lóòŸTt~ùƒ»¥û ô:Ñô2p|=×;gÞÚ¦ëuÏ÷¶8GDé²én#ëæ:qvh¼èؼ:z=KÄÏÛ§»ª«¤›/âzøœV$_€9ŸÙ—1œ›2ý ~ö¥ç,K½rLP"æ[-ü6•Ð@Ã’,Â.0ð"sDâÁ˜BtNF[iº'Š©Š]J ŒºnÖ¢†Q 1ÀMt1¥>Œ'ˆÒ€¾yä ‚a|‚8ÀÙʾ÷Q1&£ÇèO$3z¡ òCBEBMêRH!ÚíãW9:`ÂL~€•w´ïè …ô¨ÜÁê@K%Ac5¦´3[-ZF¦¥€Ö2r)ÌÀ¥‰Í&×ú]ï ý´¶ÙàërGĆë9ZþŽáã'jÇ`wÐrÝA"µå‰xW@ ƒ†:¡ÌÛDîo+ƈµ”©ŒÖ儹CêkÝ|V@¤Ñ¦€³2E‹*YfuOšIæÓÝ7÷Êž½œÊìf^̲g  ó•⥖Z"afÑö*3¸}³ùµ„QËc¡Óá+.Ûj¶¦ ¸m³GÆ3\h˜-8 ™"!DBNït ɘ!îµLŬHnVööÿgïO¿$IŽ-?ð^U3ÈÌððÖn²y8lö·™ÿÿ™9gx8ÓÍi6{{xXª2ÃÝLUäÎ5÷ð-"#3«°…B†/fjº^ù];íæÒ>®|œôqá jéß=ØãthÝŸK£˜=ã`¥¢J•Í:¡2ÍÖÚá°—Æ Ñ!Eмtƒo‡£ˆŽUtŠdfFFëêÑצHDaîÿæßý;¯õÃßþâöy‘XÂk[¤ç튮NK7ŽGW[¾;ži¤Ž~G½øJžß|†¯ØzUÊûÂâgøø¼•®NË—é·rÉÅYòJ¸yýøÕVŽñÍÒÏía^øùWeˆ«Ý%¯ËÀõ¼½Îà”' îx3Gã^©W»ÌSb›>/_ëþ‰ä{}G ¹s¢¹e óE´ôEÜcs0׉ºL\ÎÁRwqsp盢?F˜ìNráµ p™ÒøZ§:>w}ѽ{–=k®óè˜^þ|Ý„_’·¾ZQ}]fý¬||v=ç¤&¾Ô(w¸Ä¼=k¿ lŸ‘Ž> `ùìËô¹ÈÇ[þòK±õwß|n.ïE¦ËUþ®.2)ùZDûf2¿©yÒ™j÷Bwzvæœùþç ÅYç%‘ýîÚzÅ#ºZ²Ïßþ™hÇOOmzÛw]üò¥ €Û]ÈWWœIÿŸ¹ø¿"€¾v¡ý¶@=~ÒZD~Á«þZùן/ _Ø}ëO´ñ[2oø#_É*øRâä[p_Ï·ùúIéì—GËÀslæ3Zt;“õˆ_ý·Þÿú‡¶t3+Õ­:«×©šÛV¸a¢›–¶ôJKµO}úÙ‡OŸßÿóo2:‘êÑ{ûðþ²×ÝxíRG.Ò£yíÈÒiR%¿£u¡3!áè7ÆLéì’(M"°3*Š”9g†S8@ Oéáó¡1~¹‘yptA²ŒgHš„ ¿èQ‡4ÔºSâ?@ ÎfóÈ«„^À ³m€³er‹+ nÓ£Á`¤×bôªcñì]#Ä$¥ˆY…’¤ûMw›ªÄD¹¹–™±ts,3mšŒÌè#Z*iîae`¼8±óZ|*Ëþ{õPD-Úpa 0˜)+J‰¶ÔFdGåVƒ9Ô+Ì`@&|„8Àp}’b¦ ³ê€Ôôyž‹;­tBÕ£–L{¬¾º—÷;¶°¥—¦FŸý-¿Ëú³Gö˜g·ÃºØÉ-ZΓ€|ê}ÞM»s*AÌ%³ïŸºµ¨Gßb÷\î¬P )’ÌÜÎâ2RSf õˆµeE@¢ñßüÏÿ‹ÍõÝßülš¦qð½H[9Ö±^ÊLéHưé?ðú)ûOìxûgË9é÷¾¤giüëiù/GèysäàGA‡ñ-L‰— þ,æ×+¾¶Q¿¹àOmÌÿñCçÿ§‚—º‡ôYìÅs¬ý<Œñ™à"pÇè§Ð²¥òåㆯËâz†Cü8b_¿ Þ¾ê*§€÷^;b>3 k+#¼©Ù{›jÇ‹ê?à”¸­×®î\d½›ó|ÊÖýÜdw±/æ)¯Ï™Û|Ñûø›¢%¼’!¯‡>ßt¯]¼à5ô–¥A—¤¦‹ký$ê…Ä{žµ^1§¿8Zr2v®(/¸‡Ãº_L|“£* ÓK ø²W0¯Î˜gÕœƒ³±¥.Ý‘¿‘·I~f5ûÚõ¸jØËrW^–! ç=…8¯vÿŠ+Ùl¡žÿ\lìÄk›ëó_zn‹£Ÿ‡nJÔOõÔÏÉF'ÊÕfú«mOlcg=~õ_ÿûþ‡OkkÃàWFš™ÛHºt3cY£÷Ý®Æûl½¼ˆ5‡õðýLJZÒY3Z‚©¾,$r]žžó›ÃÏ> ú#µ› -%¬öŽýÞáI¾›F£Ø>` 20ËÜ=mxhšdÅ3¸ÆˆÖ}Cå ˆM&Ì/H V°Í ÂP,JA03$™GÕÏ*¢ÑÝ}·kÝŸ~÷ôðµhã$dÛ:Z\‹Œšc]Xrp{Zë»Ý$æK-•fFÛ·= µLë²®ZR©häêæK©¡ÂŽLm&!Á>„èA”RfP©pŸ¢5óŠD[šÓHœÎ {®Zž` +@Âíh³iÐðC6(ЦܑƒpÒ!ó›mrŒÔо‚-ÃXjE`a7¦³\«ãÚ5Ñ eöé ,‚÷›&Öy†˜Þ#WIy­‘6¨:F›ŒÊȦœrø†›Mi‰5©*õµ«’¥øþéðô´†P]è ª5¹L›¿ªŠr¨›d† î¹%°B'¦T%IZqOi†©ÖÞû^š AdÈ•ô-™ÄJì T€XµC_¨Îœ 1£Ä¡£ÐŠHÃ"šÒn0¤ !äT)÷ Ú02†%Ò…”ƒu&õŽ g{Ó”;$ì¥!°º«'˜p£q‹“=„9‡˜J Hª3¸è´L)‘bJHÊDB]pâ©'¥<šPhfìPkæªt¬jö®Ô¦Z)ÕßíªÊÁ¤¹îh–Ç]ygµGýÙn¼Ì0kO aÜÍVÕØ--Á÷A´Xg›aUh2^å šõŽ# ¶Ô9úšÛ.ƒ~–.*%"¢G´®ˆX{DôRþÍ¿ý_Qý»_þ¼÷0³;뼎;…#SëÚ÷•¯t^ܱßfˆ/ž.Ó2ÏQ„x5O”w5‹ûgã{;Ém¯ÌûzÜUùü›´žnꔨȗQ$·Ä€{'ú;ï=£Ù|Ó1Yçéý¼Åa^3h_xú:C׊¯Ÿ3ð\ÌWÍp/Ó$oO‡/¢ î~ó+zëUJµÎZùùht¤¼5  ËAñmbÆW‰¾4“ýÍ'á/¼¢³Ú†¹¿ædöÓñ÷ߨnwïk&Ø—D‘·È¦·è§Û/Ó½ZŸóÜê·\á½üï‹äú»iË›,t†åy;2åõÙõÍžÀŸï»÷ŠœxV W‚— ¿®üiŸKãÏÆüÛeñÛûýú‘û¹Fþ#…οùõç)üg¥zã2ýÕ´"]‘U.÷W@WÅ—ÃsÜ‹Î*xß4™ð´ž§îÇ/ ̼Ýù|M,§ÔsTü åm-MêÖßùô+ÞßÂâ‚›£;s¼Y~ïŽtÞßÍž²Vy±»Ç¦¹ÜÜ ó·7xEŸÔUäç\]>×sÜÊÕ·œ QÀM‘®Îx1' %Š|Æ ñr€ßF@NìeôÑqSy‡¿¨º:}ü©4˜—pÛË›>˜¼·hñl³úå žAˆÄ;›]v—;¶ ¼£þŸ÷Ñ»ºëe'Õ¥šf6À‘!¨®ç" tEÞÙ’Uø¬Hó†‘uùº5ߨ†5qäà¹5ÇEæ¹›nOƒ÷66gŒË/Ûý ×î‰ÊW6¼–ãõBn¼n®U¼ÙfÝYOPàÎ׉fDêÔ¬ºsü:ïAäèŠ/ïÌÏoòúQÞ¶Í-ëb¶äeHùX~«MPyÞ ÒG`Çxz:}B„~õßþùão?öêD)N3+[B§“·èró‡yrÅò´|÷ááaš?®Dì¾›séjœªGr×ò›OóOËÃþûÿßÑÚþË_è?ý÷öáÑ?<Ì_ýW[Bfw‰?«?KÄGþ µ°nÞ)wd PÅЂAʸ¹ÔÂÀŽ f0?> ôíW £LGONR)T ¡ì •¤àéÍ“×ùÓoíiÙ}÷ü-ÛµVº‚ OËÎÅæ4 äLµC ¦g´@¯¥ÌõáazHf­Å k[³§JµÉç5”¬Õ¦:=-m[ËÛÑGt$qÌÁ"„lr7[×CF”ygé= Ù{vš;š«¯jY (¨yo3¸ÿ½± NÛTj@4D;z8(ZB†L @`á¹î¦Ä.ÖgB¹fBæ(erÛ¥x¢ò±”"Y¬”w¾«~ˆÖ»ÑdÎ¥Té(ÖGI„ ­Å@¡E¯V3‰@Sïq"z¾{صC•™?üp¨Å¦)DÒ¢Eo€JO­]Ê>OtÀ‰HU7v I7‰BšÈST?{S5®b“! %2cŒL7_‘À’\Ý”)èѸd‚x$‚‚ÉÅJÔ¢U2®É ¦ÉuX¡eœ#pc€Š+“N%5Š@(DׄÍe‹ÚÆ$I!øØjgG2™´iØó‰b ÂLØ·éqЃº¥É4*Kö£ä’@F 쩌$™Bdˆfd—ž"ÊŒ÷¥Îæ]¹y~ˆ>Ó 9›+3 :ð3w+ð›ì‚vä#ì“òô>IMx‚fÚßÒW"  v⥈±™¬ˆ$¬s5 Ú͘ Ô`e3qƒùfá› G¯ï1¥tdßü~Û å6óyí¸„ †Á/¶ÐZO8P…8Ö1Ø1@/° 9†+2À eÞ–ëiF fÌ„µH¯@*:H¥Iøˆ(©¡-}Dxá¢óó‚âîER0­+åF ÉkÍÞ¤“nÔ6’î>¯û=`Fd“º` 2’„OÃð×FІí¼$•bfȈQÖ#DÈ– ßj¶SlÑ‘AÅ¥4DªŒ“°'Š™Õâ4ršçÝü`dKÊKŸê*4/Þ͘ªu=Îé&7ßwåÁþÞ~ñ>ÎS @6O‡·O j­“cšz[Z”2ÍcâY[+Š»r´xª÷&Cž¤Šúê‘ѳõX»zdæßÿã¿zx÷îáÃÃû_þâ°®îîæ÷òGtt¾Ú…Ý þßg°ßx3ÎÕçÝÖ³ÚÛåÄg#µ3) ÜrΡ¼{¼çùÞþøF”téƒvÿ¬ý?äµcùRvá=/îF pæ¸Ø‘éù;PÝOYûéÿ.]g+N{&‹^ÿÙNºÜ3½,/a,|)nO»Éc×ÐËægÞ„oÊ5;WœÚ“W›ûÏERñÆ8¥ˆsc¿3ÐÂPû’ºô5WÀó0x]ʹýÕ­Êü*ìèkI·¢ðÝ/Ò¥ëø©cð…¡Ä3fù q“{y`/ñ[^¿µ‹Cæ%rëuŽÍ­X|¥êÞâË_ œFã« ûKŸy;íÜmóל XGÒÎmc¾id½]©)ôÂ(x¶Ò»t¨{©C_±nî® oŒþÞ"€Îº ÕyeÉ8iÙoŽ|üBçï¥ÓºùR<ã*X~Ûò·ýüœbt¾:W†·ýW.ìëÜAtãîy>œX½/ / ¡}¶^O¥’îVüõç'ú9uq½ þ²øþ[+Þ¶¶>ï õ–/ÿª-ÇÍ.áÇoèoûØ t¦ða€n+¾ø{¿öÑ|ÞYa:ýÉÕœ¿Vpo„ð² ðGš ðs»ù+¯ð?;F/77ŒÌX3Œ@núÍ¿üúðÃS,M‘æf¥X-eªûO‡Þ²NuW …bŒ¹´º+u÷Pß=d°µØMn(¨æÑ×áº=@ù´ÿôñãøô°klïç’û…¥æ÷‡ý¯þ¹sY$‘3mK¨¥=ò²ÀCØG›°L2ª•œó#̱> 6À‚V!l™é£i­‚BŠö£ÑÖ¤A‰¾ÒŠ|¢Äh Ñ 9¸ÑŠÌAe.û§Zcú¢Hæ›ø>âr>#½„ H¤ H{˜æ¥-RfÇCö-X0•¹TëÑ{_è‘fÅkH)¡å"¦­e[ö1ÀD-°›$,˜D_àñô‰e"Å2›˜^¬/{š—bÙšZóJšeÉ Ôa˜GlÑÀ"§ÒQjÀ@2A"J@p!m­Á軇ymËÒz_髵ÈÄÀTÛ<•C¨AæT4$öm˜ëÎ]=B- ²Þ‚½gïBÀC‘‘ ‹L›|bʲHÆÌ§ïµÿÔxÜí"º™:´RëT+¹$(åÒ½€L¥ mÍhšÌz‹™© ’BÒì(ãlG¤K3v±eZ©.EÉ}®žR—ªÓÜÔbR–ÀŽXŒ“Ää0à[…URfxwÃ}:ÀTå®e-jL%æåÀlH¡:,áJô„‹F-ÁRàPfGƒŒ¹®|LBüäYÈÇîúšÄžz¬„´&ÍÐ ‹£xB ”m_²åGÄæŒq²½‘!9mhR4ÉžÁ)‰!³}Œ@Û¶öŒJËãJ8›™4GÅlgnÀlnRåÀÚè¤9ì‘F>`Ë_¡¬@H:òwÚè:3ŒD³4ŽŠ%”‰08·hñ¦þf±.ȶ6Ö‚D6dbTK ìØ¸—<Š{ýäŸ1¢£XgŒ£„KCý?9Ⱦ1ý·H›2ágê˜Ð;Jµ2Í0÷Z­”¶,fn^×e¤‘>Õn6N÷ š¹Ñ æÙËØ?= ­Ç>#O_nÙ-܉©"r«ÏëÚÅÃ'HF¦Ù°9Ù$5(¬¸qc¨A@(”m=Ö1ÊJ=Z, 7/e‡ ÷uÙó™ÊÀ„d˜O¥ÔB«•ÖH¯Þ­LÅ+»©ÌÓC€ûnûf^øð.2¹_i,»ªZÜ­ý‡½×âï³Åþû}yœëwS2ÓÌ „yñ©è½LÍ{äaY!äpOvšY8ºñ("I"3#{ëÙzo]=þáŸþ+^¦º{ÿîÃ/.iž&žY/mù(º’EOÿGÓ‚Ÿ·V|Ù>õe³¹W*~DgÈ—¤ÿ˃üýðÓÀîîçÞP£ª‹dy¾Aš¿Ò›~oç€7W.+ð çß|þ0‡–?@À=ŽŸo„¹8¤Ÿ–ru|%ô-OïÕüèsÒKÉ72.®ª—øÖr¾¦ªÜ›½_¯xþ›³¨ó·Tütëè)tþUôÿjp?‰÷õK*ÿÝ0ÌWÍŽç]úúÂyùó’ÿÊ–~zÛûêb)m-/î÷«<žKO¯Gݹ"ðÛçž·ùÄêËh/_XÜÜq.×y*È7lFÇ!ûõÊÓÏ…x™¯þœ}ôöoÝùëœÎù­Ü0¾i/ps ç¦f¼ž£ï׺òë§±«åös=üìÞít+?gÎvØñÖñ×à"GϨLäù÷ÿçþ°´ÃÚ[YŠMS©“ÕúÝ<‡À²,æ¦mY&›K}|˜3øÛ_ÿîéÓ~÷Ãý¾G_ž“{Ë÷ß/}ªú¸÷ý!öË;hýÕo<2¿Í¥í‹ãj:?í³ÍFÄÊu«¡;L*«Í¶"J”>Í ¡­HGÌ!† tmº¿ÕÍõ7ÚFæñ‰õ½÷.I^M©|"ºb€È"HN¥øôX×§¥-Ífd¦(Ô£èHÐ1`âXžýV ÛB·6²È‘¹ä’™™ð «ðaé³å²ô5 Ý4E4ôt³Ræ5˜ 7X7³P!ãHDÊ$‚>ÕTš[«„%ˆVŠWJB¯»:(Oi@lÙÇ Ò1R¹uV¦ág0˜?Šcrt vŽì×¶G F Gϵ@KÒ'#•™aMMáâdSaqC£[£u Z¸UªT*³Sæü0Õß|Ú¯ï¦55»Ai B4¥Ôúb@D˰â;Æ¡íûÒÖ©Nè,ÉG/ÑQ8pXÕ:ÛºFÉ”RÙ3ÅBrWÊa@—Ëök„R»-ÊT ;’ÌhÚüm)Ðl•ÜD™"îæÈŽÞb¾rf!Vb6J¢qªR²#Õ§D„;§"ZŒš2íŠ"N™j›Zb€GŠ«8¨HÑ\f* i™4'Y„òè+JÇŽ(€%%ÇKˆe&1#YÓeëêŒ-Í ËèAR Ã…UÕ2¨ÜhJ“Y“,äƒÛ9‘,îö±·}†æ?/åñ2è$+ àcö 4`‚*À“0²®+X±¹o¤†4p…Æe8¸Œ(Áe’\\!s ìJv¸;#ý<9þ@ô£ ï6F%¢‘wA–t¢ïCކ dn/°ã–1Ï2ˆ"àŽbÛìaJAo`À XmÚX‘˜h–™É2Ã̇†¸ÑÜÍh,4÷R9†ÿÆuÊqGë§'€e®û>¨óœè^fVÍÒÝ d„X—ŒK16£)23Í<32å´lJ…·ZÃP´Í:#bÝ0b%n“$˜½ÌuÞ¯{n™k hîÎóRKÒ}®¬•9U/¥°Î3ÍŠÍóýÜÉvèï¦uÍi~<<¬úŽ ™uŽÌØ|÷àÓ\mM ?Ì(cÖRH·ùqŽh­µèݦIK š$/UÑ·iSǺÌÀÁýWdôž-¢õ¿ûû£OuÞÍÓÃîÝ/¾Ë̵µišîo–ÎóO ýkùÊ·Êúq6Ù_öQ:s“ý¢oºwfÞ|kŸoü6/ø®|ðã 4/Ñn½…ïžáïæNþbÇ)³ùs±žkpo¤üã‹%}©L©+ísTD|+ŸôÏJ¡~;ïwUÛ[¡»>ûütù¯Œü*t-oÒ¹_ÉÃUñM‘¿ßoŸü eö'Š—RÈï.w.õô‚/±?÷ÂýQp:&Ðù7ÉëÄï7¸ø’µõ]SŠ+çá³¾tB"›S¡™Îeœ•,œËK[qÕe¾)qõÿ®VóëÝÔU'9©¸§ï¸ úÀrúÞ{Ó.o$A½€sßj;/'/5È3 V/騗4öÏÈËœ¢[<‡Žêõ{9¾ú9qf+ËÛ®ì ˆ9gœâï)mºÀ%/‡Gõö$²é^xë"™ÚL7¯cugÖ«GÈÀM×m¨÷·ézŽ1S'Ú̱ÓÿçÔf×ÙÊ—OðR>qÉx‚ܼïJL¾*>½é[Ÿ“sq¬‚à­è¬CéLíÕõB|öD¶WŸUnòúžo¤:mK¯*~„|Wÿ^Èæ:ûÚýzyEÔóíž9l\£Ë(ÎÞpÖœ›Í›{9¿íóAr\PN šóÆàeòÐóË^[òXfû¬ý?Ó—Hp“.zûÕ‘ï, èVö^8ç¼PrHÜvtžElÆÅçEmÝsÔõ™së'¶HùêöØÂ«ú1òåÏ–ÿûÁ*^àÆ®¸`Òi@Ãñ“Ç8–£à?ÿÿãÇï?-ûÜÌÌJ—QaíÕÚ¾&Òi÷гuD©ÒÝæÉ—\ôñû§÷SAÿô/¿õOÿðË¿|ÏžzëùÃ'OÐ}mQM “;h²T ¬Hi;)Ó;e²4fHŠº€8p+›®Æ –G Ê£äf^·Ž±| Û™†8$ú$B'RR™ëüá}Z¢£ußÿð´{O ’ÌA‡TWŽN¼†hPGæ±sjCEr“D&+¦Ìý~?R\÷‡Ãn·+6›uX¸YC]ÈËftÛ§YûRGip¢8hH‡yGFHÈ!‘ts!úzõºåHÏ…I Ñê¼éþ$" ŽÖ¶€‰–H)rð–ÐWµ@ïÃI h=ø€ê6×ùÓÇET§ÍÓ´¶%gš?Äj¤Ù#LØÛ‹ƒü^z2eNAäìu%gÊ[ ({g†™N,ê½ë°ôá‡Y)¤Ø»Ú¢y‰Ë~‰žµúh˜µõòâÑd…)en“˜=„ò¹ºwŒÈF™ŠZë)3€4ƒ;”9Op³Ãš‘[Y[&pd“)熂ɇ.ŠÉIsGKNU£»†!S­±ˆÅÓ&$0»œ“2„´':DYÜ`EŒD*&S+;U £3ƒ”ž•,b&>J&¬©B:À$Gž;ÄÔfËŒ-©ѵ6¹³gRÙS!‰L©ÐÖã8҃ㆇF'xW¬INN4*¹:(g™€‰þCF FßÁ&ê·™{䉭_Éä'b!Bx ›°# ´ÕA"ð@®©…™#ªEo("aÁ=û°ÙÛ ãXÜ3Š`°ÀŒ1lFäl>Z øØ˜V̶Bž ¦8JmÜ·_™Áˆü Y ÜániÙ×ðbV6ç^’æe°‡ˆD*{‚¤¡(A Øb—1è5‚”  ¯aî£AÁ{ïÈì½!ƒ]9üÕtÚxÎTRH'³g_Ó«™S´ *1nJÄf1B"ä‘HgÈD²mŽÇÀp Îâ6ùdiÅÊûú°öžèiî>#}š+«s*Ó´3L>s÷RÒÍè43ãþiõDùÅw:´tÃãì»™®A)ç)¬„äÈ™‰µŠIÊÅ­÷X[›ç¹÷=d)îÓ!Vw7im­¸m»¹Tt¹m–¿êÙzGdöÈ¿ü‡’±NõáÝãw÷ >ÇÛ¯ûÓþôŒb~Q9z p?}ä9Õ§ÄoÞIÐyˆ^SÙ^«ã=;mê,™á¼B7;ÞçÓ5ï~æØsåñó$ÏÞRïEHÀMúÿ"ü óz.a_á Î?í–`ð…ŠÆ ÷!Owghб ÝrÈ0¢ôvÐh; ^€·ÏOR:s‹¸½ñ—Úð¶3¼þ^Ê©¼#6áõR ãò„zNb:ÞÈæ.ó¬z_ÁNJŒnÆòWw½ ~õ®þÈ;çÖs/Š ÂÌç;ÙåürþÆó„ª“«Ëæú uç,G ׸m¾r¿·RéKÊùùú;ÖnæÛåì;Š-ÏNß¼ÿâ\7“çK K”Ï‘Ûzv’; ¾”.v+/çä;ß{ y%ztû ¯‹Ñ' ü) ÿÃåLáÄeÈïεݼ˜ç÷rÖà+÷{>{?òIaÿ „ÎŽ„sÊõQÔzéñ½%î26µ_œx%Dq>E¼À»šWp§éBHÄïä2Côì¡}eŽì©¤àêR¿ºà5}ìGY˾õUœÂ׳¤ù™ïxž`Ï›ÞÖV|{,ø ²Š¯¦:¼-ÿ3×q–Œ-Ýiæúú¯â+2‰ÞÜ+x±ìÞ~ÉWÂ~>“sVpÖ¶º–¤_ÉÇ9Hw ¾øjÞ0…êåwÞ‰%Ÿ#ÿ /§5|kî¤ÿßÛü½a?r¹ox{À7¶íkkÞ¹åÃèwypð$t ¤|ÿø¿ýûõ°ö‹¤Rܧ‰Å><˜¹(QPöˆ€üþ׿3ÚûŸˆµ•îËŸ’6C,XöûÞ³Löþqz˜«™`h¥D±&Pj½õÉméüØë5;ÙÜ@Æ.KkO9bA•>«Rj¿í] ±*1ðÙàŽ$¬¢63Å‘’c°ÉË8ŠÚVI©•@¡¾lÂXA`ýaãº_ú¡Í†M,àÇb(½mÛЈ ÷ÑãØ/ 1pá²çåÅvÓÜb¯!ÑÖŽÝ<•‚TîÛ'3À™¶¥µÄÐúCc"móÆ”À$…ͧ S®-²“TFåÔ0è² Å´!ønÔ@ݤ¯›îÙôwNb ‰ÐŠèì#æeª°^eUS! “…Äu&ÒÅ¢ÇÊHë©T˜BœíѬõ°¤;¡4µdÙ•V¼ëJÕVaÌ®\÷aÈ‹×jQÝr=,ÓŒ¾ïkË,‡Wîþéð´´yšfpØï3ñð°û´?´5¦ZÆýfŒý¤Ü-If7réÁÔQ Sfå"á.ôÌ ‰è]" ÎìU„J“Üœ<˰Þ-²à ¬R1ÌUêÉPÑHcqÔ‚XÒ1Ž-1ô×^d‚‘îbaOVd¢r$²§3‚U=a@ƒÒrvöräéÄ) 0‰’ÃçGF1y 1+ìL8Ø3A8-fÖ2C ²šMdHúÐ÷ƒ fc8´ó²FûAk í˜ œÌ lR $êpñöJ…Üfô”Ô°PÀ"ú\Ä^j[à„&²™:´ï[œ @¸ |p[J@ˆ3ÖpY<×ñ ^PÀ"7OàÑ[À#Bsù(†Z6 ˜—Í7øwÍã„úDvd¤"z"ÿöïþQÝênÚ=>¼ÿåÏÏ7!ó<ëv§/Ü®¾­à&uE¯ï ¾zÇòuIµ÷«æŸ×¥¶Gií‹¶UoT:^^ѯ"^‘X¬ €cá˜3øêá8ª{èâ¯;Rþ¢ö_¾¨Ñ¾¨àkúÞÛ+¾ºõlÃßsnaß^ðucç':“þžò+w…õץد®ø¬âü–áò' ç9û¯¨›¿ÏñþãÕ èøˆV~•€~‰úÑä´{*ß|‡¼{£?–¬Ë‹üú¯Q‚¿X£¼Ô9²åÕ:ZþÔ…W·rìÆú©¾ô³þ›„ê{zÿº›øvÐÞª½_Ù.2^Aó™:¿Ÿv}Žm’ßÄúéŸüvQ_ÿÅ&À¯w(žÅÅÏÿZŸ‹0\¦Ý­—zNÊøÃlsu¦ê¿2· 5E$€ÿóÿûO­ueZ)>Õº›êTÜ}ô™H–f™ó4Cùó_þ¢÷戧ß}ìÅ[[ ôôŸþ{qÿ$ú®þòŸ~ùá~n™%ãïþ~Y»>í›E›87«£œe¥Zv Þ ¶‡O*éûwÞf)PÙÙ|å¼}À¶…cÚ!¯èËs3òÆVug`Ù2èÍFö®¼`ô¤Œ„9:aFôC³©+åS–`G8 …7TÅ9*'Ðr‰”0"l ²aÈ\ÖÅ æyn±„ÒBì×½rd6äE°ppBl&½£÷E;Ú'd"»|ðÎÕÔ& 9ÀLfb@Ì5ª@z;N=¹%;Ü?íGP¢/G®ÑžêP2;ÄYæ®Ì%˜“¦BtôØôâ¡×KZxÿ‡ µšÏ, 8H‘z0fªUëEY*ÛTjˆfi´CË ŒøEk^àt8€4õŒž½³’µy¡%«UbX&t¥”Ù–Ž¢ùTÝ !w«^{t€-µô("]s1t©`]ÍÍ•Qmø+h¯´I%AYtI€o¼ÝÒ 35A#t591!/éeX |Øm¦Aº£¦”´ 6Ò¤;ÂÅJ+¨$…¤Ò+Qdaeôpd¸X AØ4h>JâÑЀÕàžhðƒ­œL»‚.ÊxÑ]6’Ù <•«"J¥8"k-£\€ ²I ìB¥I‘ŒF<¸u& šÍÙ˜;óï×>Ì~?õЪœ¶šœÍ*Ø%# 4¥ ˜@ÅVG8OÂ|~µ%–J‚M¹m°#RFîŒYÕ!BA•“Ó/ª¦ˆ|v¶aÄà°´ˆÜ¸[ÉúV‘°ÙüŽ·x ±©þˆÜ@'ìb gà"ÌQfXEt  =¡€? L‘+ttÊe†T 3XŠ,PŠtsÕŠ†Ü¸nk°8ðD8 É4c¦ÌiÅ¥Œu›Ë³%Ý·1ˆèVœ¹ä¨ÉŠQõ§²ŽHÑ´í=‚1æÆ­£ä‚2ƒÇ€ÊhêÍB¹C–]À®ÎæróF·¡›ã\£ø»2‡›OµÎµW jW—iá†ê˜k/$ݨ5Q yÎ¥xéî)ö"š~þ¾LSo-)* µÈPöÕ¥”ÌXÖnd*–‘m]¢EDdfô@™‘=þæoÿÌJ-užçÇÝ»_|÷ÚÖJ¯l\n÷‡üìöýî›uQÐû–üVÝ¿–7å#ð,M‚o&ÎßQ. .ï‘¿(p•(úºááyÞôKªÍKþœß(Þ= Å®OÅÏɸclò®gñ玅?éþõ‹Ä+È?-{²Ÿ þ‡:eð§q0à—_É *ñSøúü]óóWf<žÃe_ |{‡|ùÉ¿ô›¯‡l¿Q’þ¢À±ÌS?îþK€Î_u¤·Ü/yg¼Níÿê©åäy}~IWðŸ×o—ED8åQ^…ü¯Þ~Ö¤gwz\‡O ½:1œÛ[ëæ7ö?\xðÅt‘—úÜù ä9ÔœÒΈ>:Õw\©¡x®­¾ 0ðvGzÃv§^”ùt–ðËKØÌåÇñ¦Þô"0¦›ï¸ÀÊëÌðžwX":‹”ènøäl êJd>ñl¶²‘çÛyL>îê*‡ôS›èÃí¯¯r†Èsª O,¤‹'rÚŸßãé xÓxñüÏ);÷—­g‹˜óo½FÒó,ïžsÕ<‹±Ïf>éq8:/Ó;/w•.òžmõŒÝÜ>@[â-yÊ©>C–Þ­ÚÒu¢÷éù¨¥+5ùUÝIðÚ`OgT1Þ‰cI÷kÝoòW7-¼ÛÎ*œÎË.uFE"_Œvm¥|îu÷ðeçôÃÓƒ¿Ex®(aŽí~"7Bõ¹üY|÷È¿ºSÙ>®ìÊñéâFÞ\öÈW:Á‰ ›ÞpËØ@9€ðãŽ8zH´xúíë~‘äîænÕl*>Ÿêèà¤ÉÌh‘mÿñ‡C©õÝîÝnꇎDùôéÓ¿üÆöAK[¾×÷miß½{ä\¬Öéq‡_ý‹2KÄôwµåšß‡uS¢Š%ÅD*M *åŠôƒ‚ð5‰B¢|*öaŸ¾C&zŽ\¡hg‡ï,Cv"€–aÿ È’’#PjßOËÇC;¬õ½I‘TÆ-OßK  …¾nˆ¡A ‡`D?EŽLÐPÊFW")˜=E¬±éŽRj-e‰eûL;{vðØ@áÛ’H=à £ƒ‡.iÊÆÊ‘ìï[ý;bEž±ØÜ R[”bë" ÄæzmA¬P"V¨#B v¨:êÖdX¡ÞPD/(å¹Ä7kvóeÞwõ-P‰'$&UÑZÊ}AšðØ“ìÕ“èµX‡2Ô“–™M’Ö'8›VfËfHÒ]K:|W,;×õ°ì£z‘Ðz·âÙÂéªl½ÏÕÝ im-S½§ê!³Z=—–”‹¾klØ„HÌN#²Æ5ÉÀµÁ,f!#M°–¤’*à…3¡” ¬ ‰pÓ\@"0$uH,. !jl¡iÒ4AR%â`æGµÄX» FbÝŒø,9RêiKjråÑÇØMèC!:{v.†L™8‚M>ÈG”S)¦[â{$RØ2Ÿ2FîÛôm¡E¹J;·ær# ÌIꬤ’KÄ;”›@Ikªš ö„6#jTÐÁOЇãÅ:‹£|šÃ“Æç”ý NÀð­ÓÆ·*š ÂSu¸s’ ¬Bv„4*„dG.âè8H\ðiuÚ ×oÖ‘×éqg|uä3ˆÇÕCù¢HÌUìä‹äÈ‹¯;—Zx–ø 5:ýNW©1/ "¼ù§^‰‹ÜjWxî·áw¾þð5I˜$Ÿ{Ž£¯|®¿õØ5u<¥=}îiÞLY7g‹zõÓn»Ã¹`·Ñ;¯(oÇæ!$?J(/\ë¹á:®!§QóÌä¾Ä§åäy´žpM|e$~‹úÓÉu5qgÞhDØìùxw2×KÂñ+ÓËUÛÞ¿Á!˜l·S@ºç:s5|.E‰¯äÏ :ÛmÆ?·ê雵€—¬\¸Œãuqãu·áÛö¼³j_K_ú‘øéãÏ=UÏâ9üù¥æºàÌ"ä›&™3¸;¾¥àzÊ×g@0ßðÙüšÈà¥Z÷¦˜ë sÈùú~±K~N™¹&||ëݶ†ìŽÂ%WþFƾÞKœ ó—Kë¥'ßÐéo\a/.â…;àk·§¯o!¾p¼ŽÝ”9ë>¥W7]c:QG^hòj[þ¼ÿäWFÅ_ ós«£^EIé*Xy³UþŠ~þ²ÍÁ O“¸ˆ~ýä |û¾îjÒ¾?9#¾êä£/iFÞÝR¼%}âØçR©Ü"Ûµ‰rkùÏÿé?Gë Õê $iÅJq’­ºvE@!ÊTÍ‹aùÍÿu­æüõo¿ÿôÔwóÃTüüǬÓüë_¯ûV×vøÿå·Ðî—ß­¿ýøt8üÍ?¾wdÿMå€Cç'e*<<)1-òá0dh_j.Ô”öeN÷®@pjÝ¢¦iãÞ`À ¶ËFî6ßúm_ĉÉt6:!ª!7%]ežv?ߟV¥÷¬óû_L@ÆÍk}KÆÏ#ž;sK'6THv€ˆX·\{éh|„™ƒu4‚ðb»] t…¶â¥}à ÙÈp¶ŒÚ!Çob?rÿà[Ñ@&” ‹D0m_=¹@@Ž×ubD 9pÿ %Ô¡:²a ’B”USQBÝ02_­ÀFPÁÑ$%Y§Y_ª—²ûíaéf@¦çA™¡8“ï ‚ÅØu¶ÙŠÞ<‹3[6ìŵÚÜ÷ŸX׺D…{z1óš¡X{u7³Öƒ£ JÔ{dÊKEG[eµxôl­³¢ÎÓ­t-}iJ&c—fguÐàŽìð‚L­ $ÜX}èff.dº! CÕÀ’h€œ…’¡Hì $æ‚Þ‘$ˆðA@8Å.hBë"A1ÑP+üÅs}‚ÒÒ' 1•fŽ ÂjÔflæ%‹© N† †ÚølTOXPâ°AÙ¡ákªôÀÉ8x÷ "°fV³Ù½G i=ž;ÜñP9¬.!ÔE]D¢Ik¨HH¶”¬™øèÞS{åÎŒR£ú”ªÜª8Pm[¢LXl‹ðü¸Az€N9Íž,Òáp­©mÏìCÖÎMÓu<À6^¸†Ä4!;¢#úVdØŸï F˜mŽ#ÙŽäŸÜæŠí§gæ‘þ¿›0í s [ÌWDÄÇHFÇ`™!Wôu%Q'g™è‘½“@eF¤’4˳ °÷ïÑ QR‘F¦YõÌrÒF“vÍé6|Á3Sf ‰X!K¥ {b1³1E§™gtxš#›¶Ózlàµ>hH¶a”[cŽÊŠ(Ø(ØsUL™pšW¯.£×é}y´RW&K5šÙT2•n…¶›g«•Ô»w¨E8¶; 3Õ¢ŒHºÌÒ÷&_{åÓ4Ü_DšH÷ëjî=ÉHLóÔZ‹ÖŠJfRòRÚÒ¢E_[f¨eF‡ðwÿð)”išvS©õñçž RG:Ï­™Ž©:ãh¥WSõæ €Ë‰Ë”ë¼—j§oXo<ï|¦à9ÇæÝí*0/…azñ¥Ù”¯WÜ-)¸eßs4³/5!x£Æq÷,t·@WIý÷jGŽlÒg߀·$¤\Ehô¬Ñþ¨,àj2î>GÝü|‰PþþùV|µáÄgœgÂ$¿în;÷+'ó×eÁ[aq3Çø#ýyK8ëäwR¿ï²Î_™ŒŒ—â=?Öøýöp‰îdá¾q’¼Ÿþ×;×n…ø– €;’Ó_tþ… €7ëzŸ ÕÿzÓ¾ípnÉüVÐ_ÜÏeŽ÷ѺñÕnãoÙüRèèÂ-¿ß-יήS{ë‡%¢ËçiýþS˜Ljícûød»YïÊÿôOï§5“ëÓwÔ—_ïµ$÷IïmîVŒa©b»Îë†Åõ¸†t|2~b›+Þ4O+É4Ì@ú àÇfž9tö訔 Y î,@W6*´ÙaU’X¿?°x[ÖõÓoÞÿ½™å© èT\T&”më~Ëú‚{O ?cÁ}‚ššÁ 9œ =`€Sb70­–k?$r Z 8ᾕœ O@n–!ØÇ-б&@ýsôDo(¨£·ç26óMýТ!ûÆýPWÓ‚ž9DOÕX 0 Q°IµÀ“¬PÃzÀ¬´댘û!Q„ZÆTêCžünIkÀjÉ o²Ä*­í`ÅfËOŸÊwæÁN+³yÉòÃjÙÝP³n)„º‚Ó4e(3z˜æummé.Ò Zc%HN²¹N ¤zv®Îl€I0L¶1‘ÌF.6Ch@ØKxgùðQˆbÌïß Z ™£¢\ä6Ø@h‰µÃ‰] µ(…1§è(SU`°„'#ÑR®”¸ÚL*ÐAsÕ Ù¸º4+h -å„«%c• Q dȾy±lÛin.,¥À¹Y§ ‘´Zj™@¥Y'J™Ü‹Õ©ÔJ÷®ÜÙ\&—SsÑ…‡‡:a”Qó;ƒkÐd€°tœKÊZ[äTiŒL)Afoà‰ÖÂ3·Z”23sgfoM™šD2SýéÐKöˆŠøÛ¿ÿÇ”¢ûããÃ<Ï?ÿ°Õç=Ëñ#ÿö¨½-Äú±Q‹où¼Óáúî–æN]Á´y‹J¤{…_yzYâ¸Êñé[^¨rxÉAêGF½¢ êõGxÓ:åó“RþÀ’èKµýùëÏ_ÎIô?b?Ræ[V?ågp¢ŠÜ„^ÿ¢ ó—Óò+_p \ýv»Å|÷JúN…)È3hÏÅŸÓÍ>sZîû$þ’Þðžƒå™Yîô›»F@/GbŸ?Ṙ“Ϲñº•oˆ"§”ö³œÝÙ’Ý`+x•o~ý¢;7rŠ©ê¤N€ÜD•«VÛN}Çœ<\¥sY•ç;§çˆÝ ü3é¬9Ž ^•ß^ëæA޳áV^xn³Æ‹K}¥ü„8ç ®l$Ÿ?ƒs€ó~Y tÖU΃MϽô¦>À9+RÑéÚ¾<¬óZáfà]:é:õë¬ÂâÞçÌ«òCÞYÒFrˆÎ;)î™õ úZ]þœ۱þþú\Ç—Ï–gE©_êžõYs¡Û÷Þ²çxæO2Ÿ>óÐZ*[ç¿üç݇‰ÊøaŸ¶ÂSÝ4·ÞUÂÅÃûšS(¨nHrnê)2Ø)õ}_síf“S.M©àTbÍÞzÝÍ€M^ÍaäT'CšR&:¸ö»ŠlK'ñ`ÖœÊnäL¹3 $fX’BkJ  ³b2î€ H¥ˆf#S•·u&nÇ’a”HÓHVç0ŒM.IŽ-$¯²‚ ˜Áˆ.#xàJ‚Dï„À¢RP °î¥²õ´îè¹±föµñ¶J“8 ñOÉLì\ò4Ŧ”TIøå09ౘ;R똀ý˜O:–¢N8YŒ F‰ÉiÉ.u¡€–ò°YžG£à}ž¹kSß¹¡ Â0ÃfØÁÒ" 6àÜÐ¥Up`¨@@ËfiUªd@¸/S)âN¶vˆd†|‚ÖÃf©Ýði›ÃGM†ŽuÀ¼ÀÈk*ÖÙD óßV/?¦¶±mþÀ©­øc‹Þl.+z6˜‰‘™_§ )F€& Ù’Hêì}«³h‡U³e„™™E¢U·,¡®Ì:ÏÙöÚÈf¥DoêÝ`Š$F¸GÑWQ™ëÒוHP (¢#ûÔÁC ƒ!$aX8D‡• Œf’£=‡ƒ‰`’:­Èç©Nu*“‡1Ý­§ûìNw¸»»Š±xÌ\Õ­˜ùŽ‚äûˆ¢h®› †C·‰ì‰aÖiÛ|8œÝ{ŠÊZ'–ué­Ã’€™úÚ¢õ¾¶¿û»¤‘Åi|˜'š÷·¿ØØOÙöº³™ÖóÁbŒ&ñ–íx}úáÙú~ع #^í_u—©«Mß³Ÿ y{¼úÕåæ\&þ 7¸žû`âzïW'B]5ã+Èþsú%’Ãívï*þÇÁ»o¿A¼tI/A„NùÌ#x¥=Ÿ5*mâ3ÀÓ%»à>Ôèu\ÏëæªA^ ™¼¨y%…öü‰áœ/*aGãÐÓ±äžÜsþ÷ÒÒ¿Xñ#¦½%]÷³ñ§—¨ßoÍ ?WŠÎà?za4½³ó%î¯ay1]žøÉA'Eå3È{¯yãt… ¹èÕ7ºøë,ò—¿‹çià/½êxx%5oFÝ^ÕÝûËéë|ŸË çì±kSä7—F]O,orÓ=[ÆŠÄ£,tWz¹Ý/!€ž¯æ/:¸âžÝ{ |aZ{Mô¸ûpϾ…x™¿ýÙAúÊêùÂŒzQ‘†g°÷Å4vA[ëÒQ¤¿ â\Ó—û.hYG¥úy‰ßTèÂàf#øJ¼AºyZ/½…¯v«ßù†éæRýý¢0Ùmdá¢JçÈ¢³Èɳ†«[iÿµ=ùk÷vFë¼Q⥔þú ¿íâú\[è:îó,¹^UB½)ÀEÔB/hå|©1ø%öͱ®çÖâÉØáò9ññùìt —#K¼Týoÿþt1ºþ¨M„½^“Äóí oÂw®W¯<–ÛøØY°„¯¶µî<;]ô–ívgÙy5Î7ìßôü…|¥OÜÔëuîË~~i¡ó^7¯˜äð:<÷ê™SßT {wêySÕ889¹-:™‚Ì `¦ÖÖÿÿíßï?í36â4ܬ:œ™¢1%ϴಶ¨>¹IIójìßï¹›ù®j7¿ûþÞ{úþÉ÷ŸÞGO³fÿüÿkþ_ÿü𿬻=[L5£í÷ÿ}iˆúž¾®©ŠIHW7”ÌF„˜Äû…5ñTµš6%ßµ´+Ô`eÓß·h\AyD†@WI4qÿPcëB6l$ÿ ÷¿~ZbiþŽÑ˜$éØl`ã}?áÞ6¸ˆØø?ê0‡Ò@¡”g¯9±>mQò‘ݯjrï÷M^ðÁŒ‘SÜZ±ÅÌa޾ ­‰RmèÇmÐÞaºߪ"l@=F|Âà d‡–-êÐWdCÔ‘±B‘¦ÝÓ„2c³©ºFÀ‚AµuV‚fJ¢fQcO4)% µ´Œè¹~ФÞM*ÆEKª¹«õìÙ­çºÔ(qˆÈjAí¹ÊìÝELuÝ#•¹JïÁÙ—¾¤8[!Ù¢-û6ïàžÕ<›£·Ö Li vUj•J©½u¥`†QÏá4h]‘¥hÔ`LI¤ÔR•,dRZ©é¨ËX‹`Û S[IƒŠŠI8Z€’=%©”ŠLd@¾ÙÊH©• \9€<¥B‰$èâ´C  o”ÐÇnPÐB$"YÅâÊ‚Dš«‹“@k¢ˆ¸{"¥NB °Ó¸˜‘ À8”^´Ì&å0¡ûié MÉü ô0ÖÌÈLy\?d4éCñ‘€IMÑ…‡b!eÑ# ‰Æ¹ö\“„!,RM˜€ ð&Ð6ÓY&Ö28±³J’%$í•Zƒë`5Œáp÷-»-ß¿8rEôÍoã¸9„€v\5ÇXË£ŽË /Ç’ @áQNˆ¦-V7„EÀD.Û %F°ÂF1ŠÁ:ªÃy´hž¾™“KR™@ǺhT„èíM‘9z¡Y5ìr=D†U¶Ef8Rtäš$j©Ê~TǨLyN­gO3`EDfÔ!äºñʆɨŸPDZ€ Ã^b´ ås­Ran³ïЫ¹—•˜ÍÊ7s¯Ó³îœËTÍÌê2Úð;þÙ/Buôž[Ä‚ƒß?Öà4ëòȨ†Eö´9G›_±1… 9’@ôá—Þ£¯¥¶¶fA3¶C‹ÖÛ²FŸýâoa,ó\çùý»iªŸšÏGñ37´3o.]8àÙÏrˆîm¹Î÷kze¯Í³•†ÛÄ}_ ³ € ©W•ñËù‹ Þe¢›®T‚·¦;\æÝŸ+)W¢Ìgr-/O¼Wÿ×7]wµž+å7Á—7™O¾aË÷Rdâêò^Ò/6nŸ-µÎ\úî:Š^•?s®½Uy>VùÅ“ ôüƒÔÅý•Áóg6FðG^_ùóXäÀh#8ánêa)š™{:i…4S­4Pk™ñé_~ëµþüoAÑçwïŸÚïÖý²|ÿïúºöOKþüg¶¼ÿÍûõzXz’Éïÿ%–røõÓÃOæAšĹ)aÀÃ$>L¸xx€u>>EÍb´‡ž*]­” z*z,”BÑ7Ü?#Å!•A¹ 5!¢3RB3°>ÌÓû÷}¿bàþûéÝ/H®eFrS`Ç“ß,µå×GGï[îjJËæ‚2½Á“}K}¦ +à±ez‡M¤r¸‹N¸ÿÊ3Ûv="4êÖÃd 5`¸Œ´â@tÄ@ª í-ú`‚#y¿£-g™8‚±¢/@@‰ÞФ6€¦³èÌâDÐkEt¨$kÚÈyÝÂà î›rÎ) ¥¼¯ïÖE²ꇒæ3Ú!àQX[b}‰àS É^JG6Z±C[ä†^Ö^h“=ýÐ »a Û"S\×,^ZÖ¦!¿§Z(ƒZ£õ0ÂJa*‰Þ;ièÔônPÚ¨ˆAš:ˆD5ND0!¡Cn|¹NšÐ>1‘KŽ,o¥``tøN`²K<@*€5eD)ì©ÃSA&¦Š‡I¥ :z2ÅXᢄ5ƒ2Ñ;†Ç]AtÊŒFqT„¸dgë´’EXC˜ T£†Ú©DJA äF‡Ù áç –HDHT3II³–™Ñka”ôÊÉÍÄ.Í0™j)Q%-‚¥‹¦2©`ebÒDT¡ÒmŒ‚:³ŠÑáI*Ьßb%TŒ€¬@ |4âyãX¹¥ÒD¬’ºŠ£”ˆT1”Ù×Clå;ú€ØD)0m.µ&d"Fb;q^æçg!áL”|6ÁÑæwЂF%ÌQ&ôe37C_`ŽR Žø˜ l‹ ¯¯~Ô# Äæ,ggû8zãX“„á¥RdžTÏÞ¥˜¦’ĺìçÝ8¹Pk]I£I&™9‹™XfZZ4 ƒ{f›¸Rx4>I86Óä1S0qò:—)‘°’⊄›yLîS)u"ëä%ŸZÐQ¦Š2k*åÃÏ(YÏEfp’Rñá¸IÅ·ò½5¨´Y4˜£p…„[-<¡Ì“ü.Ò̬÷`Fe¶¶Fef¤"Û²öÖÕãïÿñ_‹¨ó4?>¼ûÅw8rž@é´g)á˜#2ÇW¦e$õcï\þ¬6÷ð Ôg~GÚÀ™?ãï窆)€»V¯¿ù¯G•¿þüõçÏíÔÊ?꫺¬øCNèzß?èüös2%þS/¯ÅÞîV0œ2ÈëüËÛüíϳ¿Â눒rÓz¶@Ñ©àn"´îïfˆ«VòVV½ÈÆçä²Ûº°SÌE ð&ñúîWâö»ß._Hד75õ©*þMýœ'J׫ßôfë\éRn¦®ßU[ë ¢Ãs’É­m×åGè™eóÜqϺߨ‹Ÿ“‰ôÙ q»s^Õd|½³ €³,ù <ÓEaöyjÅçâ´[ä+uXw÷Ó·å´×åÃ'Äøoü›B G&ÒñÏ[=²¶§<æµ[·­³ŽN¼1>=lañWXbâg{Åù+t¾tŸ=Ëû'5Þ„ñoóÈŽägèN‘;uSõq'» Å!·Óí+¯¯@wC߯”2\ç¢=—KlqS.…uíÿù?ü§hÝÝa”»;`t£W$ëB$ÂüîÝ4S šæ¶?¬¿û8×*ÃÚàóôïþåéW?<þ¶ÖŸ¿ø¿ýüøéñŸë·RÍ[¼ËìýИ%™´4È¢CçÕö¢ßí=ÜÓµ:ܼ›šñý’L«9Èû„®qÿ„9RÈ&7D"iÌÌî Ñ`N–Ë÷{«¥/ëúôë÷OóÜ´r}Ó÷³fÛÊ9Òü‡º”€‚Ñ ý°”²aÎé€2 ¢ì ‘eO Àcfw©r‡aeŒÀ¶¿ëè@Ùmiø[n‰ ` ŽU †ÔFù?}Ž:216Í7  ñ˜•Ü7¸Ð€rPÈŽlˆÈ@vô¶)‰J´8lBÔ„ÁÁYL’—$ó°2B“:D©(d/Ñjé?¬¿Û‰éÖ¡†¨~(D4±/=ÙÔÓQ;%#í‡%"0›1=²P¢S­D˜=âq·3V×¥Grí½¤ªûÀ€Ç¾}·«0ëJ„ºNë"ÉâëÚ"4ÛöK)2¹9dÏ€0 †LV!Sh%&"ÏîÀ ìŒ1òÀ IæèƒCC¾å*a@QL^ÐZ*S̶:’rÔ‘S-0]m'X°œ€!¨°me+N8…a -ô®žI“Ö„'¤Á¦§¤ ,èD{h¥˜Faέ Ÿ2°´ã4¾fJêÆJh w—EûEǽvººI·Ô­E$u Eà.RæÂö¥rûóí‡Ä»‡¼KbÌÝ3ïçwö_zúýzøb‹F¼Xèð:ù7›@ò~íî-[àîÖî³{¿«O8O±|‰)ñ¢þrÜ Êk’!oOä×ð^|aé¥õu{ãÓÍìÕGÏóìï-¬ý…§¬Sˆî§dWŸ£‹´ðÌm·yýq¼Òø¯Sª~„Ký’ÿÂðÑeÍÏÏ„Ð}Ôןھe,|vF:¿µÛÜí3 üõ5ê÷U¿ræªr~ˆ>?bßÜï ®5®ÏµáiÙzý@}ºÄ³÷¯àÖ?±]ÁŸ:t—•yG^âgúÛg ïÞ¼¬ß¹£³øÎ7ýî¬ø–¢´+ Òíª{ ¼mò“ü»Ñ‚x¢uYÄð9Ö´gUëì‚ ¿pŸyÓ3n0/u!~~c«3q 7ÅJüÌnù¶^HW‘€{R>_  `WŸ.0ž#È_âªëZÖu;ž!¹y…Ì¿l0IÒ|iKü¹pÅäHçT—£øÏ3 ô…:ÎûÒð9Zd"ÎažËº¼ —Ý{ŠÒµ„Î;{OⵓÃ9 æôx.tãKÀÜÅÎ\—Ñ…—](Î(‘çx%J¥³˳?§9ZÂñ-Úæ8èõyúæhÁ“ÌÙ!à<î¡Ë“Ïê¢zîœbwMؼ"^xѯ/°·û‘³ßðËÃëõuº²O¸dy]Ѧ¿Ô΢µP¨×}uxÕ«/.žW+ÙyÅôÛ—´¯2:;⩳ 4ÃqtþêÿúÏ}Y”éfp÷ZX¬ev¡bª¢0MŽÝD²+è­Qvî÷ËR¿ÿ^ß½¯Sí‡Cyxøî_=Ø~ßÖ¬ïø«ÿë?õß~ñ‹ÐÓ?zÏyâüþ¡‚%"!ÉÛdïV=”à¼rêüáåjsb²âŠ…i[R¯ðî z`ðsg,#?¸yÙUsÏ0N½ÛÔ SJG4(6õ u3È©¬8Á nÈué DïeÂhÔmÜÍd” &¸ˆ2Á†0÷Lœ†ÀÖ‘ s Ct´ßmñf 7Üÿ8Ýl˜ò0ø 14ýÜĸáïÜAGPÒáèý #(´²oîÞ Ü»;A»̶qe:´7Ì„V @…I‚ÑêëU²• Â+ž¦0KÍÃðÃÕá  öä£J;dË”™ zve's5Ô:•Œ0G‘ÊnW•‚Ô çÚÛ!DÌ)fO°o¤‘lOD‹4òÐC‰Y€iFŸˆ0PR‡ãRÈžê@#„‘±A‘ï Ob“Í‚]*#‹i•˜[ň›ІF¹i¤l °‚jÒ໪à Nw™ ¢øt@)x|§$PY«P®í1taåŽç–D"…žÛ¶ïˆ«aŒmù¾áÁ˜Â^(Np±n˺ L±ƒ„z¢ @“ VÑ]¨jÌ.±Ðhsb…2@R{¦T'~˜, &ér·ÕS¡b˜À4UQ ½jrªp?ÇÔÍÉüAGÓa( TRj˜œ›$Öm&ÐQëWü"QÁ¬¦î) Í3‰6(ñ‰ÌQ²ãËFL¶‰ìJ(ž1ý1Â~ ã³sÆÈh÷Ó¿œL€bøŽÀ+È­\à DeH^aD¼‰è0‚è 4lÿ„—#MÈFŽÂ B„ì[ P€i’Èj0A>,%¦tO&²· Шj†‚žêºS´ât&ƒ‚ÙC´ ‚¹Å;}:ÂÊbÄ¡€:r&gÎÁ4ÇíLQëTŠ“ÎâµN‘ê†,n,!X);«é\»û¿òýãÔ{Úw³É ´|ÿJkórG!Ë$ qHÜ…òø‡#j` !ubn›#™iF3rÿ¶3Òdô®„hÿø¯þÇ2×éÝîý/~6ßx ‡¹ØùC§£žÍÓHñz7{)<Üç.^fœË’WÙH<íwxÙ¼LW8m0xEþìÑý…2ÿûNƒwSa®D„sð:Ÿíê¯6®ºe |F¬¹…Yºü=ùàrã}•#òÊý¾%;òJå¿k p+”Ü"€.³yzÔÛþžW§š è-/îuËx¹Þöò‘t)þ–˜ÊgUæëÄLœ nˆÌxò¸ò/Óyæá5©Ug†Ïjæ•<óªÎþºžûò½_ üS°ý¬ ÿŠ–úеÃK¬'r7çóþçëRÿ¿6äÀqæ%xEþyÅfü ¹V÷ÿæÅF8{‘^žN_>Wß›Àù¯e˜«¹å‰ýˆ}î‹âC¼ ^j@^ /Šæ/ýËsDAÚŒ ߆ž¿é÷·7ØŸ tþj±¾Ê}¯w+€¼büq¾wû]çïøRœÑÛ#yWïs7£eÆÛÖW}/¾zÑ4›ÌõçâOñ‰­ýëÏ×nZø‡äOôw¶›–å°öþøîazZ>}¿_ž>Õÿúß&÷éÞÏßuÖ]íÅr ®Ÿª¾÷xKS³òØù°¤%ù^\&­Î‡½í‰¶˜Ñ ó£ObnV™ç¸†„ Ö“‡Åh¬P ÔéÃß~ØÿÐú§}ý0g¦=8Á\;2ŒÈ†\Ã.uHí'–º0>™ýùpáŽäêf£ Â†VËá;¬.å `òM…~˜'_¹1@Nüå–ò ¯È@ë0Û"›ŽÌí]Û?9Ë:™ ›[Ï…O›3'¡Øäþ¾"f›€ºpcaJbvº³»L±ˆÅáKä.½°whVÍ!dsÓ¤Îi¡¹Sš"¨U5¹•Oî[î½I È:-¼xMi9 ĺåþi¯ŒÝC¥9`™Ù–¥-ñø~¢aIÀ-²Ã°Òz‹D¦ X!šÃå&±‡TÏ$YŒ’ܹ{*©ž*Çø_ˆ‰XÊcn æ` ÂÃg“z¤×Í™IBA˜£ØÈ’fqÍ(fÀ&2†¦-óø',àõ!)¶ŽR¦LPT©Ì¡á !µïÑ€àšX;–ÀDôħP¦P„óKÌ"º8xôł̤‘‚hâ„’H*! =eGÂÁ%2GüÉU»IíÌpDS8Ž^’†uA­(;5䮕VE*zHï ¥Ì †w0HkÈE7‰DuZ²$™' p F°N¥T–%#hÝ·ÿÿ»…8Ù,Îæ²ÅéΤsÎŒñêAG…r@øóH74ÜÆqÖ`ÆÓ¿oóà1ñ?zDëÑzFþÝ?þks–©Îïù³ñz’µÖ³ó÷‘)Ž;9.ÄyÙ)ï[Ã×6ߺչJùÿëÏÛ%°oÜâþ%6éMÈë¯?ýù‹ŸgþÚo8ëO¯½þh¡óçË@}Q}Ìö \]êkÔÎ0Ï©¤wu§›Í×¹7Ãuìå¤ßá¹€C_ô,Žàâ©:æ—ð³ä }Vç»ÆX^½ÿ˜K¯óÁöl‚uo!¿lþëdÞ»êãEfË©ºõ¯y†$9ƒ˜àÖÛö¦5ïÇûGÎÁ;ù¾Á±¾ÂÝö˜sc~ÊgÁR¯}ûe½•„ËÛày 'ñz'#¯eí³Ò„ó{¼®X¸ˆ°_·€ðhÔëG”­\§@¨ çâŠSnÜË'á®é2q¿FZw[á‹ïãd6ų°¼n½[ß>5žÜ]Ú»§-ÝÜçMQÏ#ä§ €›Kâ1»ë|èÕ ÁË/Óuç½ zó*eí«¥ÿ—§ €ËƒÄ…/ç°×ŸÂEÞE†Å_H8ºõV"_-‚tXÖRJ)žJŠÿüþ—ÑE »tÈé û¨OÑ4;8Ô3—ß}¤³”©ºµZüqê?ìû÷­GûÅ/öôi¿üöŸ—’õ±Tk>+Ø«ïƒM@ÍÅûÜ Óõ³ß-i‰NŒ±â0•Ÿ/^O²V™féüðd;™!V o‰ºV™L§Bˆ†ÐáXH/æýÓ÷úôÏûÇŸK8”iâTúÒÚÓæ"€±›*[*=FÁàf8”„œ¥@[URŸÝªE's›hÕ‹÷Þ”‰Ù£Ô£pï+X¶ÜÞ17šaz„rcúgn½#q8} X9B6N8 Ïª`¢ÁáÓŠ „muÃ4˜#¢``úÑT`¬kŒ£Yåà MÊ‘0C—Œ˜ ºéSÊÉhÉ^¡rЀ$<¸w…ð®\+µ®ÀJß“Ui]X„Y’Õk[bŸiDì º¬¡5¦i®¥B±,+Ý{fÂÜ) }jî…ÅÖ5–µ3 ®=:YÌ2crfêÑ{ìŠ×„…4mpîp/R4-s‹ÄðJ0H@7P‚3NÛQkÀˆN[RÄ Ì„©!!¦mºíàù”$mËGh „b*&ˆ™„Ë‹D°Nð0à ‚ ‚ŠØ»z À¨9@ "‘+2a8zG¢[8(cÓÁƒ¨¨B°ILÂL…l®n*„ˆžÀ*8"Gz“ŠlÉŒ~'Â#'M«l¸|ø W6Ò.ÙL…,3ƒ2ƒ¨’(“Ƈ¯™•”ÁY”–è¨0J„e=`B’‚ɤ ¢’X M2 -ACµíáŽÀ›U¯S@qxœ÷Ë’-¸•£V´Ö:‰ÞãÚÄý<ó¶ =oÜ¡”!hGÕ¾ƒe{A­Ûo%`Úê†ÃÇ–à¦?;“±ŸÆs”Ÿy¹ "CtŒŠ(8,¡ ­A£T0 (IVv@MX¼ÖL)•4…²5dÒC,aà #‘0ÛÐaî@ (bÊû?ÿå]·ÞM€Ï·?÷6i×;Ï:¿]ὑm6Ãs«8ù–s•®*¯í<ñrä–¼ùê—¾Tðöƒ _Ý.óõÒF÷®ðq‹¿íeu*}Ìí?…1ÏŸÇDã7ÞÊù5ÜQÿÏ·:dÞx_žt{Ò;Ë:ÖmÃÞÉçz5eþ¥üúo‡;ÿt’â—ºuä~åÙ½ÕòÅÞ®3Çß{y©ç¥ïú ¿å#LÈ/Ó™~Íþº||NÖÐ<×ÞÜfˆQ‹éLÔ»‡C×91Ÿq ÿqçWúÏŸtþîÏ}ÔÝÂE¹žÎi9_:ƒ™æ®Ïöݽ"Ý0?.Zã¥îqRæp*¿;=ÜÙ‡ÜÎwÂ|éQl/+÷†y_²¾_{¥{Bø¥möE4þv4Ÿp?ƒ|ˆÌúuÔ%«ñštŽÛbÏû3âyçsÎÜ9ƒ²<á¾°?çk"7Ã×@.ÞÄ6N¤[“ô[Å7$;>Ÿ.g p½á•î…$žw€·2£nò®Ö¨ËýáYÃÜP`n)÷TaÞl„ï3Þo;,¡Ó¿ nÜ!®ä„ôÜðGp® R×a“‹¶âuàãeò)OŧgG‹;=‹o^_¯ ­/OccPð¼¯_mSxíqpÇ Ž8¯Ç¾­cÄYVOUÿ—13¾¢æ¿zÙ¼jô³àìÈè²Nòh+pþ.ê(ÏÉú÷ã„7KûyUògc/òŽ® ¯ÎdwßxÙûy<(G$,²©G?üîÓ²_bmJ­u7¡8$K­¥x%—e •f†vXŸöË÷­½ÿهLJ]†Þ=ÌŸöû§%?<.ÿÇh?,OK¯“)WDî¬MÞ{—Q»ÇؽÓ²¯q1fÄaöº°&Âóiö÷‹½[ÄhKÒ‡‚UСÀz@}$!†œ]ôܨ5Ô&̱‰(P}WÚ§ÖöûÿTÍ!C¢å~éû(E:¤êçÖ k;:²Á‚ÊZw³Hªµ®‘h‘ým¤×Éjí-èe~(¡•í@$ÑÇÎÅ;†3ÁfVœP }F$Е‚ >Œ• Bn¶½£’²ÃDÌ€ƒ›ð}[³¢mA ðÈÈn žKF^/…@E/@Lô Êø®fœß© LJboš„*?°:l‡>‰ß³.& K8t¦D˘˜®xâcõa½Š}Y‡Ÿ®V¶`tB¢ÃªgPZk·ðâ-0mQ[1˜Ü(½ €×Z¢å¹X "Ó‰©”uíJ:L3BwÈ6w„áBßòÅ­"ñð®ÊÓ~yzZ¼B†ÂZ‹G¬Ê¬µZ­OO‡è‰ ÛüE‘Q#zÏ{…AÈÙªCˆ Q&(Ñ;4BŒÓ1eEˆ¾9@˜ÀpÙ|òy,ܱb\Ž˜¯-a°£ó0K`EÚ1íeDÔÁ j€a~%“9”0sf*ÂÑÚ$:•/ÙÜF,- æp Vä ”Qò2f-’¤‘ ͼÒçiv/IËâ˜ÊTËdÓÀ %R‘;+ÓÿôoÚnZ!fû•O=Ì9W­}<žY@™ CcøIÏB´ÕQô eç±—v ŨŠ‘û¿%þÿý?ýk’eªÓãîÃ/~o;y‰ý9“O§ƒã1ä,½àä@·›TÝÆ x­öS¯ì­¯PÏG¥›ÜN“ÛË×(Ì®{‚³Ãñu…ú«gÑ˃Ô1|±‘¶ˆ‹´Ÿ7艺É<’ÎÏbŸÝ]èŸÛòsÊÂbÌ ÿå³Ý—¸%wÅ‹_Ï'Ñ;¨ÚÓ¿òÞ™éöäyg;èÏç'Ùt{:/¤IÞ•Îï:(|–¿Ï“»Ýs/ºQW(T^œvyuˆx>;Üã:ãEÌÈ絿›Wò^á³rtEGy ôzǾ›|cà-bßÕÝ%„|äô’Êý–¦¸ß&—‰qw©8¸!\Ý}¦w'×7ŽSb¦Þ¢ÿè!ŸÏ†{¿´3¼òQŸª¾í»tG»¯LÚw³ôtåKp¡|èõŽ­g%Nç±ùmÿËÎã¦àsêÿ¹ÞuZ ž÷_÷"[äç.èFÿI¢V/òuž/{G}?÷ôå €;“?¿°à¬4áì{ÿØ@üú×ój§|¯à3[Ø-—ÍÿgUW¥Ÿê¡ñxG:·‡ý)ëO Èö~–qc]ñ…Û>¾Rùq3øíöWB¯¶Ò«³Ã›-Â_©øqŸóÇÛÑò ;@­õýo~øþW¿ÉL€µ—±ÔBÂÌŒ(DÆŠì;w‡§ƒræÓ>Ûòîçñé°ÿô©·Rh­÷¿þ¡µõWßÿ k`ªSIZcöù¡®¿]ö‘,ì&£–FùC‹€U‘J.éAƒ—.G(¢oÙíV®qÿó;h(­ØÔm#”ÌDæ–ER2ˆ„ éBYžÒjÌ4ëV,»€ÐªìÛ°>ž’ùsv_}$–ý¾·î| É-Ø tz¡M´RveÓV´«Å"ž—»D¤#msæ°ì¬w¬kšŽr!n›5¬ ¾:³ô¨„ÁçˆìÕ¶<Üga(#¨æg¬¡ñÉ~$þ;€M¦Ääí4ô¾¥— /ðàè®éU×N@U™€‚Æd……ùÂNQR¸˜¬+›ËË•`2‹ "•(É.!e†PªE)Å O½›qdï&Ÿg§22Ü DïaÍ'ó‘-™Å±¶L̈Œ e[%73!Z0±#4$²Í™†Cˆ”R…$Ô܂&%%JDm[KA“sgÊd„RG¯y ªÁ£&@cc5%!Ê€RP&)¸îY¨iB5uqaj=Âʈr ;ÓI™@ƒµpQ䦸#P„ Pb9&Êׇ*PLɹF’œ¤µF¹ÌHHŽšÌ 9Ô–í3#Ãß"¥È&EÇœ©Ç´‰f¨• 2cHpõÈNÓb)W å‚´lUj@…5¹ÀÅT%ýÖ¬wØbBÂe€„"6‚“ÝÊ…–(À¬†p8±¦ðQ²Í‡vpù‡x8O^Üž~8öø®ôìNotÈk—rš§Z¦è‚àî-b  ”³MºÍ%OQbsL;d"úV‘S>81¾†ìh<€DH¸žW'#ì¸tØ[åV9¤#= ‡ ÍÆßºÁkh|]Àìùˆ¸¸ptÏMEv;ÈvLd‚‰ ßél€u8NçaŒ+ãÌd¥¸Y1w¸³ÖišK© ±ÚB%Ãén4øÃ¿ûw“Ä¥GÔ2Íu5<Îp §µ,µb®¨9澂ŒcMæ enèLPbgJ½t”•”R&6æOdì!åßÿÿÙû³&I’%;<‡YDÕÜ#2ó@@5€j½(j¢ž!êšÿÿyô:·Çýô9+cy ¸£ÛóÊ|œ÷LysÔ7Ȧ +û©‚£àöÉŒ?g€|¹?µ3йdø¦o¼$ÝK`]·ßzì¸g²«_úVÝ0·¥Tç—ðzìî¸-o²ï½Žá3;]ýA$‡Î}º.®yJÜ t^µb¿¼­?yŸÞ)’¿n—3áØ¨sí€óš[Ñ£gÕ­åš®nåcRýÓÏ^XHÝuøúÖ €7YHqÓp‘ôÁÖ(iY˜Ù‡¿ÿñÇ¿ýûl!Îq}éFC-Å!0–¶,­HmšžwOµÖ¦¦wÏ‹yd¼«þôn7½L>NuWµÿ‘ÕIhþynm6KØ¡N3†©Tg)³W¥€¤J•èî‘óìd[AáÒîߟ ”`09Ñ"Á^÷J¨Ã ÜuÛ^+nu¨¾«õÙhÙöûeš­…”ˆÐŠûO(¶ŠÚ>U +¶§®¿KÌ4”J3š¬ãÏ­Œ(n0ƒ¥<@ÆA¤…˜•ʧÁm™÷È5!Y‚é@¯Ö”—Y6®‰#`èl"s‚ƒ—wà¡ÉT ØÇPS­RLŠy-îB­° Ÿl×WF|ÙZ;ÌM…Œe­ÉSjo‰‡à ¨˜g¸cØQˆd ΋FÃPà3÷‰¥)B2XÁ² 4-L!¤²¨ÓKd)©Íìl¢¹‘Ô†;”‘Ëó¬Ôb¹Æ1ùá§YR Ew‰¹}Œñ©9/Ñös驈pún´iŽI"‘ì>±&U`GÙ¤Ìl°q[‘Ò°ˆÚ<(¨&/ŒÄí $”Â’HpØfÀh’‰.4)&H¨Õ;ÓIŠ(ª0ÒÕZ ¦¼®ÏÒÝ À5b£CÄ’+/(š»}ÇŠZº§mö"j!1'”p L¶Í»b ¶¤¸c`7@Y¸f )Ôµ| V È 2e’Þ“™ÒgeyÆ»g…Á ô,bºEI ÂEZ¼E!Ÿèάò'µ¤”L6Œá1†‚Ù«ì=3E²ÂÌ‚CûÌ%•…Ô Ü_L"Âh;ÕæFÁ ɵ¸~Ü•HÌ­Apëí8±Ä2·|ÿݰÄ<í—§'ÖÑ/-²•â»ÝЖœæÅ wãø!§`1–è£Z«ÏKh‚•ë}· èwÀBƒïVç]˜Á¸Þû¥BâìÉ{¬hˆduµéJ}/í×ö G`õ…öÜÖ´‚\ ¬k<áã}Ö Û¶èõMðhp¬MϘ\ ù²ýQ×ú ®¶(«úï¥øPwÃ0È 3/•^­–BãÒ¢‰ÏÿÓÿÀ±xNKßøxd-à8 2RK¨ÂXƒB…$e¯- Ne J­eögˆ+5í¾ú¿í– +æO„BÿôŸÿe(Ãóî»ô›/ŽÎÎ+õ¯ cõ91Þ-FåQ¹ÿÐŒ¼Œ,.¾üQ}+>óð6=ö"¬~…æª[çŽOáfcøzöã÷§ÍêÁp|ès”—»{íʈËbOöFŒû›¢×¡Fz³vsËHyKànÞâµMÆedžŸ¯Þ>¶òýC—_w•ûf›Ï/èø½kÖ}ñ?uZNë ^+îþì5ðÍ»ÃëÅᛤ.• üÁZX~Ù©½~9Þ~±Þöíz¥öÿ[åþÄ óÇ®¯ÛÂüÛdÀ½ïƒè’–óYù+Wíסd.Ä'&ç++ÉU›Â9è|ùîõÙ9ž÷{½5ƒþÊa¬dÌsÑøŒàqÛ}©[?náÔì²õêˆÖ¿Bm@þóTÆ•Fÿ`å:Ž€îJZ§Š›;6§µõ&¥ÂóFÙëÀY@Üù1÷¥ã[Uûêop, ê1o+‚®¦ÿHîúóÇÈúdÀ°å4t7,»Õà·~ܳq»-uŠyj§ØÌÎ26X‰2¸èÐ=Íím}¢®­÷žç­ÇÑ(oÒ—mƒ¦Ó žNE‰'Ý‹jõ¨ð[GMïªÒuhúiÇûèNÏ…V|]Ì>jÝ6|=DМ½“vøò²ëê[.Áš×˜ÑË¥O<5óªóѰè|1ºìh»æ ]ºËŸÞ°åtf–pÍLå㡽ñæ½§È£±½ß±x³#9vLŸ?íx–ˆyåöéuν YRäúÿöÇŸþþÇl4ƒ™Ì’pŠdk­Dòê?þög˜}÷ïKúP˲,?æeÑ2ǼŒÆéo¦ƒñi,‡¿ûÌ´h p0_ž‡\>ÊM¾KËt:m" «°‚ÖÉ3I¤1?<ùû½aã:Õbê8ž5ƒÖ‚Û)AsÅÖ.£1)if¾ÛÍûC4Y±ˆTï6Ü?á~>öTæ4¨5¸øèV,‚¶–Ý‚¥È*«» ItVzé£Í‘^P¼ D7Ú­>“Æʺ:Ü˨²sìPFLM«]ƒ „94a(©¥µÙŸ`šV.{±«Á )´¾Î$²¸ˆµRÄ2¡5 €^œn[bް‚látÀ8ÀwJ¢Qsãn'46Àª–ÅâÀPÁÅT„iÂüU‘C¢„–4ƒŒ,º'pÒ¬‚¡ ˜)`ͦÌfæ$ÿ¸Ÿ%Ö2Ú~.î!ÌK$5V§a |˜bžA'Ù“ d·]¨Eª‰GÃ`‹ HÓóÐõMîS´5­LW8,1B š` s3h€ê P ¦€Q\`²‡D¿þ Žêr[ ] ÄŒ)Pê¶~ }¸˜ÀL¸¢·*t7àFAv‡0@C‚™B2Vì !dˆ£ÆRÀ"ÞX„‚K(RJÊA“BR0Z(E%šÒ‹†÷ÂÓb/\<‰²Ò¬¶!Ó¤2茰dK…‰Ž=±˜ÂÓÍ,5Ó€EÐdsËYH 5t{+n)÷ì_ÉÁrWKÍÃa¡Ž©¡A†§§g¿ýécD'ècÜÕêEjcµiŽq¬¥–iš#;þ‰þü<”R~úiÿò²@(^žŸv)|ø°_–ªÿýó?íKs v×e¡ŒpG¬ C]½µé+0ÈùÚ¦“ °ž³Y£WÛ ü{ªÀ^àeí`9 Å´þnÄuw3sõ$⼃/«±y.ktw&wË ²+ð‚\VRLä–lˆ•Ý>¤~7Á5P„QIwŒrœÕU<«™˜H7ƒs3ÿú_gõ¹pxa´aM—yÈÜ£µKr,‚°98ÆÅ• AæÄ– )KPRÀ:+·>¨G꿺íADž1þé_þUJæôâeê®®…ÿz €Þßzñ„9ïè?‹ . Ž.ѱg!Æy•óqk}V,öš^Û[¤¸bûöÓÛ=êÅr;x¼iÛ|ܲŠ<Õ¬g7n"*žãPOõ§­Ë%=õ|K°1îy±µ:—Ëo÷wëøŽäZžqŠ/®ùqOÕ£ÖÇU÷ü›ÁúÜBQ=þžQ©tžyé> ¢Î!›:öR‘P[´Î‡Júyé“™ÞÛï¼JܾÁ¯K0ëyýó̓¿ýsü¿ãn¯·™êö»[Ñ´ÍÊ/¨Û½‹Üy$`#¿ltéõ~_}R âvsÿçÙfê$ýŸ³›^Au]ñI}é[TªW½76`^µT9ûƒ2qy¦o—ì®>ê-ä–‡êäÚbl§íç'IVwgýç•-ü=œÅ1?òÙ"ö]’í[$È»Õlßð 7ÿX‹D›y}»}çDx!6¼bss1¯.ô…tû'¿â_/u?>ßf„yýèÛ´GæW} —ßþF#™¯ÏßÜ hxŒÞÿš€¯©f8â®Ï‚¿,ˆøº.~>YäAÃÁmHÌuøSŸú•ií‹(ñ—ó7wÜjÏo:‡ŸÊO]‘?Šf¶OÞgºa¼]eRïfX¿pIù”K|í—½¥Sçó¦!×z¸SÕ—Xl½r¯Ö¨Ï鸺Ûî<'¿ùúé€L÷O} HÌ@âÃßÿôówˆl)™ñy†±Â½ºU³Ã2ÛP¡ãoþâ»Rà€„e˜>îãåðî©Z懽Y©{& Ãò£¿/³ÑÆV^^ð/ѨhQŸ²–+ªÏq¨ËlYÛÓ.SRà°ày@¦–I0øo>؆¾‘m¬?Üœlã4eNÉÜ®¬EvI2'å)†§6O?Æ~vf¶Œ„ó÷O÷õVÎîu€riMÅÖý¢’Þ–4sú x›á¥*+‹ͬ˜A)$-auç™Ñf¹¡x ½˜ºÛP›æ,Æ%uPþÅ¿ýëÃÇÃIb$,ÒºLaÂPÓÑ@˵9Ftϧ}52UFOOI‘IJSffŠ‘Èµðÿº8æ¤Tö¼xvÝ?b‰òßü³\ú¨ÔRÇ¡> Ï?|wKÞ¿x/²ÎM°ßøvVÿŒhün‘À+Íz-DXÔò-Ãêû€‡ßrê¸SŽsìøD¨÷ÕðzíØ·ˆçßxï(‰¸-Òú€o3zŸÓp5vÖÀ7Ç翯éß‹÷ïúÿ°ö®¢¯77|ÿ‰¼~¿çøÐjåÍ5ï¿Ðñÿ‘Cç&€q^ëxØÆó_‘¸#íqã7Þ&B%Þ¢ž~ÛÇÓm.³¼ñô¾Eä§/þÍo•‰tÏöAÍEš]5}zÖàº!æSßH=ýo}älzfŠzï“Nåcº ¹^å#ýb‘¶$êª"躨ü~fèÑ^es¸0Wãqùóµô+C§oxC}VàéÓcMÏy‡ËWoxc’}>¾úšPçǵ{Ë|öŠtS„ó-·Ë75LÉyzþÜpßžy"«Df-åå§1·þ†2”aY‹ÜÝØ2³ÍHyuÈlµN‰YË4£øóXªôÝP[ËûŸÇ±à¹DË ±L“>Nó>²‰;ÕbCÅ0¦ë /­ŠË‰\Œ-Àº•9gWC×ÂÒnûêÃSaP[÷©XËhÀî|» 3ø  ²h™mð“b‰^U¿6ØŠ2GBnÌ&ÉÀå0·Ö|„UÈÖÞlÄRè#mìê9ÍX`L ’ž­eD¦Ü½Ô@ôjp™$Y+õYð\& XÅÐd'Y­ 9¨íÜ‹ÕÁk (D…Ñ*ÑJA½0ËÖ:å4¥Òáu%~ÀLB²‚6m…÷Ü$ €—Uì[þ"h’–¢¬ÒD b'.è€9`‘•Ä‚8à§ £1j‘K¸‚.Ù• ÃÆ¸ôÒS8]Ò„W?L˜Bæxro-#±½µˆH#32¥q°lÑbNC£ciˆE@ÄÖÅ·H½p¹±òÄÄ"€³°Y3ó ÜÕÍ¥¹¢z˜€…2¡€ý»B¹¬rí4cØÜ| ™ÁAJÙÐl­÷*±:W6ÁÂÕy¢ãžV™(Ô ïqXEä¶t/SØVÞ+ØûdV¬ôÿŽÒê¡OKx÷Á ¢·@4Tšj!À%„ä¡Û8 ™¾S&bIk>)]±  €É*l@Ÿ‹gɰ´˜ÂT‡"&ŠœV¼jB5Ä.õD-eÜ–E ±û-ryY5å¶ÈG‚xcνÅ 5[“%"€Þ¡xQ¦!RJ„RžîˆXIý^Öá  T«+°oSdºá0Ï^¬kæý 1”Ú­‡k}>ömN%‡jÓ~ž R\‰Ÿ~þØ–0`L ÊthÈR!"b¥lõ„ Êzc®- ¶-õ]÷ïÌ1¬É¹•„fk@öuϱ&HzO@÷ðXmE*ÜWïÞ$Jƒr<ëó&@‚fÈcuRî_´BÃbëWè)„\}²¡àpdÒD3*ÍK-e°̬‹•ÁëP`.:@÷ÒUP“¿ÛÕwÿó¿5r|¿S$¹Zd&†"'¾ÈSY‹Ü×ÝßÒTJŠ™22Â,EÁ23 F*N%sAG'O ÷Ÿ›úÿOþòŸE‹67t+CŸŸ¾ûÇ¿¹©ò{k”ººì^T%ûÒ˜SÕö%ç± ÊGdL|ÿçt–Ÿ2²=ñinºO#u õK ÒÇJ§/>q}:ÞåxÉ‹9òÖ­Ú#%â&€ß Š{}ÃVtÉ‹6xþ~„ñ3º±ÉZŸ'@Ÿ…Ä_«$| -û«oŸßsàÿ«îÿëë›N¿¯]s¾ö¾Ó)¹|ïýÀ\ú[Ô ZqÁg[¾U³ä©oòâðÛs.¡Ÿç=ˆ§tØ•G±N6§˜ý®<ÉË|_ ’Î ÀÏ:x:Ú>c¶ÝOkB—Ύ䘥Óå¡]ð].z–¶I{}®ÑíxÜ¢ÜDýº:þ+v¿¶¢8;¶ââHC?ƒ4áÒVFÌ ÞÖzg›¦¯gÀÙ…ÜÖò’6LêÃÔ;ƒÏû”Ïš€o{ ÏéM¡Øë†XW©Ë·´I^+öëôãõj¡«¿9[”N7Æýéøy·=®÷ÚèÎ;ʯè>çûa]uo\½ïl%¾hª¼Ìr\­g¼4âXy÷Zûêãè‡g *gƒ°=Q6™.V_Þd´ŽÝå:_ÿÎIÀaš3óþãß,‡)"†¡ÈK©e|ÚÑ ¥[e1@Ruÿxxy·Þ•r82âðóÇŸ~úè¿ù~´%åþá¿þGÞ¾{®ÑæC;Òô‚aa­³]ñBîç6šGšL“ÚXSñ1£-«ô_+XB4d¬e°]÷\­PÏŠýíìA˜‘@éZm¢î˜k1ELÌ÷ÏÔN÷¾H«ÆTše‡´¶€ðB')* +;”b ™g–LÁÌ‹Y5Á¢¥*#eúTï°+lˆHXs°°Æ!³)g/2$˜ì€ksðìÉÆÁÆARÊXѲAÎ2>ãã¾MS`1Ff;´˜!µ`IS#P÷^ÔÒ7P8è&åšØ bÁ2ƒX«’3ᙘê¨j`0)‘‡ÉÌ5>§½Ð’3”ÉÝøj H6“\XóbÅR@E¹£!aÝוÕ\m^‘.Þ9ŠÈí`!ˆ„"³µ6/*Î2ú:ÀJ`¨\ZìC™ P¨·yGøI©Õ¸s‹Ì¡R;0 %Ø;A¤R/ —!¿Û¡2øsFÌxv˜V¯ˆ‘PRD…ÌÐ Ó=Zy|þ˜D²£ITÖTV!z³ñ$ègç F¶)eÏÜêAHw²¡l@†pBÂ0BIÎnbKMŒ°Œ.k©§%Œ´@ª ©´-‚ÔúøËD!vä!Ôºoàjñ÷ïž@¼L/ÕÍÍŸÆñÝ»]f|œö™VÜ‘QŠ \-›^¬¸Íó2-‹€±ø?<øø2‘1 e™Û»§ñùýøq¿O,K¹á˰•í!”ºšu÷¥¿;r¯ëžwTÓ–ÈÓ¿® +Ž)Ö‚îþ<ÅÂ^·Æ‚i²òÓ´Æ”FÐÑ„Œ{€VÑ¿cÆ:J‚u· lX¦ž„ 3swÀÔÛ¬XåP‹Õ"ƒ—âÕ s÷Š9É¿ø_þÚ–öünDñ9cÉ è‘ÚO“¸DTX}ªTÊ]ÝU´Ré/iPf_^ižBÀ»)µŒ‚I‘§µcÕ¤ ¬-™™j™ñOþ›±L‹$3+µÔÝPÇÝóo¾û‚Dþ1"ç{Û6Ú<ä8n£:›ýA?ûExsÛy¨×¹í‡[¨s‘ØÒy_G¸LðÌAíö=—±Ùz€§]âe7ôØ_Ò#Ï>ýÖ]Ó=«5Ì1N/2:Òkt§>ã¸àõÆýlqü‚{Õ]}èt½ùÒ#éó ²îð=nƒÃc…Ù{Üýò]ìwygäucbFlcÔ•ô¯‹zo“NÄÓmåÜ=4ëI8^„SﵟץìÂ3¿²ÓäÁä¿æ#'ºn8S瀆óh~Û¬ñ¦~禉ÛÎ`ݷܼËÁ¸ufþb”ë=È(¯—™OQYî2m^Gß|RG»B=¼X—o~ôηŒŽûÀ›ƒ¿Ý½òÄ ù dÓ+›µ·—Ç}ú£¶»…÷rNçšà¥ŸßkGñhl_Q.7Î÷Oä²ÓÌœïäevó­9ªWË«¿& €‹ôäÙõ èõ™ðçe^‚.±“÷&áñIqq}y¡Y®çõ¥ò‘Êt.žßfv%ý_Ýáüç–ñWî¡Ï͉]Ý퇖;9­×e·fÎÞöDÓg$ß–îë¼—÷á—s%—~ªÒ÷ J¸_é3½¦öŸ< Ξ\üêÅé‹Û+øê_ßZtÝéx¸z¿©†âÎØ|Ë‚øJræêN:åVdo¾DŸ¦Û‡å¶ÐóQ†Rß¾€†øõµ7ƒq‡„ø–Håa>šäe¦ê-WK¯ŒùÑVàv1øÒ€­oãrñýT<úÆ öM’þçû žÇ ÷2Ã׉£ÕÍ ¯wœÿ®›ýÃú›éå-jq¯…Åë8˜Ój!XJa,Ó~‰ÖžÆZR1OÕk1k- |÷¼žjü¼¼@±´w/S+ù2OcÉêyXÔÃÀ– “<šù~oþÜÊ3ÌWñµµMPŸ Ī„®Åª±­Óà†îäxdaãŒa ™ëy¶e•Ø¢ X$­k R‘ håä[cî’4V±‘)…¶âþûp»É‹XAÒj¦’ i$i½Ö½ÔI%¹’í k!¤h[¥·LÖ2%:a¢àX+~Ë@ßAÕl]aR$­°²8r^+ÃSR"æHVÊ;jÊeÈ.{o\—nÐ;"»Ï¯Z×2 ¨0OhÁb"‘„ו+bŽ: PD`>Ð]îš>`Þû0C¯±7Ù©¥èC!fJ Ô:ØÇ“ÈþùÙà`Ðmö d°5AòbKèã¾EÊKk>Ö2Öm^2ŸU†bûeiÙ0Í0 ›±Ìè´²Úó)'ÜÈT ûÓ¢$"Y Þ a:0I†À" ’³ªú.# v Rƒáˆ”<)€¦Ìè '2‹:þ¥H˜=+ðÑÀ^õßDGk«yƒºLœ›ì‹­ÜÐ6* ²ãQRïžé‰Q\3DÑ€&M€'ÊLpH¥aN5`ôÍ^"ÑÖ®@ã² +x70)À¶9ë†'(å« ¬•R–6×j¥8‚up1M†—\Zˆªaš#D5GR9@©ÒUé\Eð è95IHŽœÑ–ÕF3zNý 6c€¾bq€½_ ¤CÔO^:¾fŸ†Bwþô᣻©éi¨/@—9æ%‡Y™ßÿð¬Ô<eÆñ²Ÿ ¼{ÞðÝO>ÆÝ8ÍsËeí7òUëÒS`¾’ú{“¸‚t°áþ{>À°¶/˜¯í ½Æß î0Gí(ÿíÀÞ8•kS+kÏ úrä®Úé1ÙoÉŒõÍ}]õïZ“²ë™k3–ùÖ„fnðSÜ̽/¥ÕÜÒénf¾ªèÝÿõÿbíebñ¥E5Î?ÚÒÆ÷ƒ¹[ËÚÚÓzlJFs‡QÌÒ,·=˜¬{¾S©H€™@Ó*0gï§È̤ÍÞ[°âþ{C\dFüÓöW‘‘˼ôZ‡ÝPŸÆ÷¿ùþ¬Òƒ÷c¬5Û´nju¬2Ùö;{ðã¼W¯³Vk}ûŠË7‡:çñ¿Â†êު§µ›oÛðzt¾é=¯Æ¿¾y}¨3¾ â?Þ®ÿB åkû­ëðÛ:¾l>¾©œè›Öyòkس_½Sô™÷Ý7¬Ž¿Dº£á[\ÓßaÀ%£åuæÕŸ Cç‹G÷•Ìñï÷õÅ¿—ã×Õõ¥ÓêÏ :['¡[ë‘OÎù?Š{øDa¸¼"½¡ô¨2}ëÕW½Ê—Ë÷Ìk(Â;Þýúüá¬'âÊIj«þ_Cãs©>Iú²ä÷r‘õÖ¯æÝñ68þ¬_G糯=‰›`øXSõþ:WÿP{6ï%~Éá<ð‡ø ÙòŸ2‡z”êE‡×ñð‡jÓ2M³Ræ6¯cw#‘D*±,:ìç˜Ûà6ï÷Z¦ý?Ì*…ïvÓÇÃǦç¡ÖP´y÷ý÷/ÿáÿËÔR±ÌË¡í—8, µ·XÜåžðLp7°”0³¡v‡Ekëzå»á¤à2×¢TX¶ê×@Æ©Ž £*z ­ÙªxÖVÑ ÀºaæZ Oc¶T¦@¹ÖS„d¨6ÖΓ–)€å©zððó2<(c6k-½T§‘\Œ!eKrªÐ0ïgÖÂbÙB"äÊŽ423‹htB%b!k‡ÈŒ¤[ñZ#TjEº¬À\0$3]Â`&BÈÖæLÁ u­Îèî²dÛG&ÌÛÔD° rq­î¬l#—‰€Z½Ì|V[Ö2€ŽC HXEO2¢U„0¿"ŠÌᮘÐ&š0&®9Ô„–æJ‡Z£ÀJõ¢\7¤0%‹¡!F¨l¶d-ØÅë%(&$X­ÔÒöaeU¸ç‘wµ-ôò2‹–n+¨ÅàÆE¢ôžF`ê,  J£ÔF†i s`„‚Xð¬ÎV†l‚ÌE.²Ñ¨„ !9a©BB(FC-Ôr¼øÖæ„%×"ìÒ-ZÏ,ì3¦Õ¾QƒhÈ.øMŒeÄÚû–ÉLU§Ãš2¹VƒVb4"SïÑyñÖ93R é} #¼y`§BÂä3"‘ܲM™™œÉ$j››ÍäVÊGÂB¦âC!§ýA%Jnn´2XÚQeÌÑf0YÒÆ"e[ÁúÜ E¶¶zÄYÖ¶ 8+ÔÞf0ÂX±¡Œ­5³ˆÌÃaŸµ ª‡)†ÁR,…ßÿæ)Bó/‡9""ƒ†yŽí§&§™ÿæ/Þ)´ßOµÚ28ˆ¹E¾¼„šº¦5`ìöÎL«ÿ¶—Õ ¸Köä\?;úÌ[m<º'J_?3‘\ñP<6Bújp"¡-k:aÍ+Ã}®Kk4˜£Œk«DnŒ >P[w‚¡ó³d«Už9i$ŒÕ™æu(c/šÝ\ÅÜ]Æ `t¸ÁÒôþßý;"ÛaΈò<.s#Éê»±<ï*¤™áƒc,]J Á«Ì¹ùý)ÑR)f3S´Hmb»2S¹þ»oÎNÿ‘¡¿ügÿ|™æ>ž^Ükžvßÿãß܉F¤O€]nåÜ ƒQm3?'2þª¸•Ÿ.^'¾Atw—£ªÏ>¯Ç;|z›¢/Ý-iíY8”ùÁù&|Ö^j]nG?µ ÔFî—ØC~[ÆÐµ6½/ëwy¿ƒÒ¯¯?›×'r¨¿¾~‡Ê×.ËÆÐùÛ*~âó:!¾í3âÖá¶ýåÁðÔèÖ ¼ÏiBçiøó3[‹N®‰=ºº’w.Pß ’·I”ÏÐþÎúòÖµ)ÛÑÖy›â­0~#ËÞ©¿ñôÆO^ñä7† O ŽkÐÍyÉçeØtDuŽû¼)Pºët%ü]6_^jíÒ ÃW"ð©Äz­2:ÿn§v^ë}Û€yÅôXßÀ³ïÎ2§ ÛỶ¨òš¿ÇÝ:‰ uOÒåX;heç¿zFºòX¿¼sx/S‚›AÝnŸpYº¦;b'ïô€^ÌJÞRbtÖìË•rY~l¥¾¸ÿOô,^n /M€oŽçTΤù…{¢“,.áÚ»í®¹\}.æ?{q¼Zª>åL€›®žÙ¸Ý[•®>g­å\y‹à£‡ÍíËq!xP½rì._Á—ï»±ñ¸s· ¿W#y±©>›~<‰6:ûe‰Öê²Vžì|ÏRç{¿³2Ë{éïþËß~~isÜäô¡ ÃPJ)n!D4H¹d&µ¥‘¿ýÐFÃX|ÉÌôüü±À/múðÑçåçÿóÿ `š§Å–LÀ:²Á ¼¬è [ÑöØEÑA'ra²#J©­âuBhbˆÌ\‚áY¤n2êÅd¶‚«RR"!ôî s‘@iiá^Ë2-Ú@ê-2R{¡@J(µbÝR*@Ð' Bu—hû tÂÁJ¦uª?ÃbhÔ,¨N EŒ£âÀÑT ctKWTÂH@F%";vÿøÜú±‘(Ç:a®?DÏ7™ŒÑzºÞÚ!0€Ð ‡ÁêGݳ\°£)¦«Wî3Vm·s«"»§\L©»¹vÊP¤Âê fðèfÅ@RÖ`Ufàón†¡dƒU>—2{“éýóŽÄÔb¿9­T+µXi–¶XúÎE}\¦ý¡ðéæŸ"’ D3/J™‹µeQfOi¸(h…áè¸2›«³n÷5p ÂH;#yÔÁ8¾­*em™ç4¶§§¦Ãt ÍK)ÅŸhJ+JOušÚÇykJÙíjFýø2í÷³¹=íÆiß2ÔbiiØ=ÓxSײ:Þñ¤TœX7:U´ñî®àEúôÙW[.½²õ× ¶h›WîVÛîQWAïàØ1sŽZýýׯo€ 5µõÌòb7ŽÓ½nOÇyo4>éQüÉâëË=Âùç_½7{ |1<àuäÅ#åîºRêru—óe¼«©òèàyO$»cž{öõ¯ÏÕÆ¯gÝ[ÏžŸº½u zÌqÚGó\÷½@̺‡&«÷&Àg]¯Ï½)λԮúÝ?W>—buù¿vxÀÐWÔþ÷ß=çÃüÉBço„õ«TÉ; òÅ£˜·‹É­¤~ûd>†'gËòëü–†ƒ7f^7&ókâØ-èÞho ¢¾m„…oI6ÝSùøEµ ]÷¿’¶¿øtõ™wWK¼ýãæ(Ÿg;îœ=ÏCží¤ûû±àXuùíäÄØê÷£}ÙPŸ¯Â#]<x²Þ)ªîpG)šŸÎ.ò”¼èEº.Cºoˆz/{v©þkM>½ÒPÀO‹î<·îL9¾ýÓ›VžÁõk˘^IÉ~žÅÖýeîúwR!|CÎá\ø¾»~éj¡›¯ºût¹J|V0w…øüŒQ%¿ 9n\±».Rƒ§×ËO§ûhªµÔ¡X)tš#£ I(‡eš«ù,¤T‹·i®ÔáçÔz˜æç¡:!ÅÔâåãüül`S,OïŠ×z˜&äâu°hNÅ­”!£å´ÇøeD~Dk°1¯pó–`ƒº¢'¸[fväEçcd¬¸ŒP†Íë`Y¥±ìUÂ%Xƒ*è€Wß=†øxh/A+^ÁÌ,f]`ÓÜ4H)fëÜt³TQ*³™ôn„›)/Î"™ÊRG–ë%0€êbS÷S1)š2I[KFŽïŸB9¬<ýàØ>p0$H¦ s–êѯ5±d-Ð}73s´@&iJFk155´‰Ù:]ÞUCK2 nXÙMŠ>PÈF8ÜÄãíÉe›´”nL*3´….ñŠnE‹DX6Š‚Ùzþ0" ygj'µõáÚ± ÍÐB¾uÑ –1ÏÍ $Ju‚ÓaiÊ&ë!pIt S‰ é’UX eÇ‹ŒTƒv`B­{·‚?+Q‘Ä^) %µ†*4çဦȒtcIî[.Œ&ÅB…,êŠÿZfP@AÑÃÓèF+õ%be¿ôn3ö€#ÛÙƒÖ‘h°ñrI¡5XŸü¹­Õø"‰M]ÒÝìmP š4² `oS€œP0ˆ&eƒ%hžÁ0YAy†ÕÞ£n½¨‰¢0·éiD!ª[Ü0ŽùT­.C&„I§%ìðrh3ÊPZS*KËj†æCƃ alJ¦  fkKi£êG,Ù?®k¦JeJ½…E)Ìȵ“   Á+ÌÑœGkX>"CÁ0”eŠbžÊý~&±ÇôÌsdb·«¥–Œü¸ŸJñZl|‡&Å´,µ:´|øí‹9ŸÞ ÏÏ»ççáãË Øºwn)+Ù©/×ɳ¤f_Ð$R` ×òüâ'ƒßÞ1 €•Í•@,k9–e„ÓÃnµ•ö !… ô,©±Þ+ÐM&ú¿hÇš í±”¤à套¶:çÙ ]ö¢\í õpÎ\ .ίìBÞ°{¹®ÜÒ™ñÕy%_½|W ðwcïs›;¾á©Ëz²/Òy?S,þ\Ð~÷—Iþ¢_ôm?d¯«ZàsAüMi‹×ðž~ú&Tò‚ß·tk‰ò–|ÕÝŸ¿ŽÚÿÂiüE +}üO:ÿú<|Àñ˜Hø¬‘~£?Á/zßšYO½œy¿ÇËÑÓŽ‚__o½ïuŒçùYwÿ+bõ)ðU³òOº3ŒüÂdÓïz†|•zûëë&ùóÍ/Ìï&jûCbN^$0[ÆýO—ý-zÙ•½˜uqSQ ‚‡%óÐd m©£+馿T¼LK‹§bm¿`,Ë?üûA¹ì' Î¥Åþð´Ýs–ÝÓþ·K1 »R’ãÓ`óþçR²Œ½ð…˜÷Q‡UŸêEÍ™0/6Ž\ö22´þ XVųŚXWg[·p½K€+„íÒGZ‰pI6>ÕËœ&³"Íf’B¶ ·6Ì*­ºlÌÖ²-@$ÃJªYWd7FKddC·¨ -@‘Òܵ’Ì 1Zš(´"‡ޥ޽Þ,–J)¾EýÌÍè$#:¤5e"-µ ‰ˆÈ²EÌ9Ï’²R/.îô¤LD#C]͆hŒ'ÓŸIC‘;–…îJt¬6±8¬Kˆæ™½‰bšæfî¢éЈèo¨½hPqeØœÊì¶®”CÒBx¸g @QxéÖ6šтɴ^ HŸZ E‘© *ÖJ[uê¤yk_3Ò NŽÄÜañ@P“àÂ{/fz‘jCí|{ÇÞrO•ÄH¾„-EÉÕHN¦rpÑÉm5„“;i¯¥éFôÒÁô¶….ucd4Ä)u¾Ê»8™t‰‚Jo‘é, @.]Õ• Þ;Ô›dèÆL´ôZ¤³‚Ç%aœ‹d’1ÂM&Шàʼn"=E…n³!©›Ä–5ÜeÚPj´\š5Œ¥e‹5Ð|Ìj»¤KiQ7Zusæ -,@”–äŒ&‰Ê Ò$"S‡ˆh=¯óšAag‹2a†ÁØ'#}Ë‘4ÐP+ê`O»q?M©”°4íé©Fäá0»•Z|(ÃÏm‰ZýãáP‡R¥,¥ºʾ·ËçâËþ âéý0MˇûÖZDZ)ˆ@- !`°Ö É¥õÝÑÁÎs¸ tz[Û“9T¡€ ø¦9'Ð}”ðŠR×DÚ&³®µš|æŠþçÖLÐÚ–NðÕ>½ÏcòÕ`•¥yhš™{©Ns³êC±Z¼VÁ†R†ê¥’ïÿíÿØ{q Y´%G·ÕN- rœ å™LÁ3‘Ê¢tëÙÖYIÆÈÕU»uÖêºè`Mn-biÑ¢ÍK¶8ªYùWÿÒk)µXqÒ¼úóß]Dr:ï_Má¢Xx-màE«^ÕEÏ›Nÿ¢Ú#mïOmK÷j´~að––;½¶€c+õçEäý)ð[ª{ßtƒþ WthŸ__¿¾~}ýúz“àðGÿÃWïfÇ®!7NÇnƒSFïᅢoM.‹Po£ˆk<ËU/Æ9Dä-h©Ë¦ ,ëq‹·=UºqŠÕÙ“ô10ûœas¤W_0zxw„¿C^T‰_¦åuúfAnxÑ-zÄÔœ;[_|ߢNõ9g™7áf¶›Hg ¼§oÑiKœ’£<¶êìðxõç×ç<½ÞPðdµ5(OC¶îñq1D·­º`y–—ЃY—¹Ä{MR§ÈŒGÐÏé*ñº]à8›·å%&LdžièêòálÊ]š©{r/»yÝ^{Ó¶MêùB\~†ÎZ0€‹¦Þ£Åƒx±¥x}7ñ8Ƴþ¨ãÈe^¤=ofgnâͼÿ¬Í»m€·½{äÖESÙñN’x׌ìØÓ|A_:§©Þ]ª¯çåµ5©ÛƒÛ^•Ý>>ßâÅû ¯lŒxáRroðÏoRÞ¬¼³@hûùq Êÿüþc[B‚3w¹Ñé§¿ûm†ž~xWÜæeÉ\Üj´PaŠ1Oíåe®Ò?þˤÖ~üÛŸæÿø:rJ­:P#J“µ|ó¹35„¡TGu œ l·K#°jÅø~=oó¾zYF‚æÃ³cÄb¥bÞ ™2{݃0C!®¢^È;"ÂËj¹ æsÁsðî*@™) åi@F"S‹2Ax%Áy‘ïÀbmnj‡å°ÆÂµ¤M*H3¸¹)";ê%C-³Ð8dkp•”Œ&!"ŒX—5¯Ofž¶o4äã`êùËHš‘ (Zº³xçR€¤ÈÙ„3憖PJ)´¶¼¨Í’bbÅÇ#¡†X \K˨)7¸˜‰RTD°÷˜kŒ!˜É#CÜ<)´FKÐÁâ ‰I :a”-H˜‰Ò ëî£$Z¢í_©#½ö¶‡ "ÍÝ×ÖT%Š[¤˜RÃÒ˜J­â\ŠÝCÚ‰ ZN8ôuÕXVdR*F®ÖË$a)'÷ˆLñ÷Nù XLžö’ù34ŠÏä:(ÔÆBA);½pB„DX"^PÙP!ų-äb¦b[ ±U{v¡Öm³uµ­|»k ™`nÏG!ò”, Œ.,B!fQäA0¡€ ²ên(ŽpF•L`F”4õƒ6;èkœ• Ô#vC-îÓ4cÊTŒeŒ]ÌKcfATfE->qe ¶láÍÝX%É8hɆJ‰R±4·T m‰+s„VG„L$ÖJùf™ºz^à«À‚È|™¦hé†Z-–lÑ>|H7[Z#bqw÷ï¿{ޖ󥦥”úƒ)éßùa¿´ätXÆ¡ÔZR:ì—§§áçû–¶ØqåuàÐ'ç°ô‹(låõ÷è+V¡€°-3 Zà¶Ú›ƒÝ:xërá¶ÝÔZéj)´Ñàf=9ºÅÕ}. 7a‚¾>F”Ö"KáÎk,ŒÅw£gÌj­6:YK©VœÕKqÒRéäÓÿð?ö˜eÞ/eðB0ÃóÁl0ÊXàN3³[½‡H®w’@sæ,sÆ‹DKó¢´Ì½Ký¼ï¾„Tt_ßX¢-K,-—ÈHAæVjùoþÕ¿6÷R뻾»D?+û¹,ä¿æP\k>%¯ªµQ0…³¶á›§ÿæµhîêWu¹%´…O'JÌ ÌéüqÜdHèMà×W¼Üñ ¼ ‘yÚb¶B·ð›­LùÜìÛy عÕû¤€Ûމ³Ï¹îì>»à§B ­Ý3šÏúnÝöòê:¼½×›.Ýã~þ€»SÎÛF‰3ÃYwÅu«nwÑGꌾs¶+ºÙ0œï«.9ʼéEÐE¿ûFF>^һŶg¦™Çu—_îºÂ­t¦mÛ»—ìS²Úë[†·dJ®úî,"77À$=ºã¾àØn;Þ.9Ýe?*¾KÂ/SYu E¹d¹î‚úÒkzý~½âª½2n/ÿþ†½uÁo¹f‰¼N::#ëŠtü*‹F·ps<îødµûã!ïMÚ –òVö~gÏ'^¥ëÜþÕùoèF½åãã…Ì~>íÿ| ó¯sÒ®ÆS—òüø[ø)+TÞ20®FoCo] NºÔ•oî]€<>ézÀÊøÝXOWx<»óñây-OÞÂ[¸] ×=¯¼Ê™’¯Óî±B¹±T¸b/¯äØ ºÍÅ#–¸JÜrÞÁW&åkÇvž^x­"[·¿À{ñl/QêRå18½Uʯ²1'Š®ë‚6ÄçÖRMnJû]þV}¿;ôhu{Md¾é‘å¤È+ÅJ¼‘j·]ës„ËÐ7¤’›ÑH‹©.sdü¶Ï9s§:§³DÊ-jñ†`H\[ð‚NÊKƒ„ó4Øc\ßôG>à³Òo½-1øÙqÌUŸo™×Q\;Ö2€t=áW‹Œÿ lu}BF¿I\ÝÛN–—±öUîKoïÆ¼xáñeÇ]¾R_ë¯a¬¼Éž­Ž¦%§þßÿ¿þmnÊt·:u¨¥V /{€O»²³žöECk¡¶Ä‡Y´&Ù0<=8Ìñr˜óôóÿ¹äüTóp˜#ôsPcFZkÎJCõAE.iï‹Ùdùþ»´²êÑOãY÷S"^LÜE;ЖÂLƒïž³MjwVæ2îh¦ùC23Ó ¤F¯ùWÓÃæ´)Ú`p©‚¥(‚‹‚•þ/%èP£™RjZ–Å*Zk9 ÑX‚ÌhJ4£˜¦Òk¥¡öÈ€’ndw}µõÞ5£;ÀÖš[™é^+¶Eœ^j,A¥ô¶ Aj™-Ú>¼ˆî–ˆeᜩEZ¢MÙ•¤Mqhsë v€fdý º;*ËúŸ½VÚØõ3º)(°Š'×ê1lˆà=_Š ElOJ¦"̉)Œ¤QF5Ñ(DQLH-IºÒWȉ Ó Ô~NÀ(³/Æb%ZËP¨”@uš?˜I‹èÔªlJ!A0ûabEÆÏzÍ>‘Òhܧ”2ý¨(âmŠ^ìN6ìÌ+ekcFp–ö™I%9…ÐíÀÓ7&˜d\¡.mK~D¢ëÏ×;ÂdBìz°Õâbõà=@°›p%ɤuH8¸Ð”÷‹ìPCjgD‡ûĸÃÓwBÅ, /(ä Õ¿ýTÜP0ì`ÄÉÞ6„\PP@Ú’ËœV¾Ÿ¢°¨$³4|°Ã¶ ‡ Î9f%Êà>–ÝÓ0-K›— èf‚XÕóf0§ÒÕí’û(uÏp±`I°7Ù€Û øÖ ÕQPš¡«u8hŽ–fw5÷©Äó»QÈý|Ø¿,Æ2ÔBÀLKä|Øÿôó~žÚîýJ×éyôÞ¦º9ó(­Æ¿ÜâÁNãY-.´¶w¬u'Gûb‚0ôžx¬Ö)ýWZ·K‰Õ+¥[GôŠ~`Ùö]} IkFX«þG/[¦ÖŒ^+‡Zfæ¥ ^¼°CÁÎåN·•C{÷Wÿ²ç ÑF§{mA9@5³â è¤À²^nÉ.)s7Vvw -Á jRB¡Ö"¥,î ‹îÞ³µK´yY¦9[d&Áú/ÿÛÝûç÷ÿø7½ž+gàÌBg›å®_ÇžÕþIçÖ­oìR%ïÔvœDàKùƒ[{Á©‚åa‡Ï HÞžGÆøbêÏ—×â8ÅÄ-ñÕ¨U¯—}ߪzõ?q—Ñ{åpnÐÖHÿä: ÛMÝýÉ£+ñâÍz£Þö÷¼ÚcŸ,$^%?œº‘«®›Äõ&í†ËË>9Ýu)“SgÊý¶{ë/p5Ut-Íýº6¾ ±Ö[þbÕ¾oÿä·o‘¾Èõw1òŸ\¾v{õžº’Â_UÒ¿øòézÖo,e»;8ot øâÙwÙ¤t®žóQÞèíýÑëÑFý[NO¼ñ,=óÇ  =ìüÈ?§mKøåZ*uo< ús™®.Ч"–σñ«×¯ Ï™¿¾~}ýúúE_öùEM¯Õ ó³V¬ŽÃ?Vë ÿáÿó´Ã¤–4£—$áŠ8Ì@>¿vµ8ÏKdPé Kq ©©xhqwÿá»yZ>ü—ÿC¹0KBqXKYp¨nåi—ÆÝ®Œ6ðÝû9‚m²‚6ǡe`öò|”E&sÛí™(;V7qXæ†Y+0lJV†Ñ̇±µ·Œ¶²)$$ÜQŸ‡•Õ%5Ëô¡¼“ã]FX4PÉU˜í6©H”wºÒ†¹ eű–^š7ó²xÞ‘eÿñCJR3ÈÖÂÊâÓL-a]£e™€uæÍÒÈ #™@NK)£”1E<¥˜WÁ˜f´Á‘ÓÑŠÖ¤ËËK'ÊO?Íí%ºÓ¤²ƒ"æÍ6N½bÝ…ŽÒõÐX³oî ¡:´€Aàš$ˆ"zqïÒZ2“‘kÑp)I •0h@äÅí@¨7œT$”HÁI¸ê¸ÎÙá 뉜U…³#lÔaÖþ°tÑ¿»º.ÀŽ Â¥^éÜó¥]‰4`œ¨ €0áŽA Ù$ ¥"R½ceŒfîfÁ"¼“ˆI…²ƒX’ TÀIjB¤218ÌêÝÐa9ZÓ'ÚÚr±äj!0{BBh/H[åÚr…SÀQŠÍãwͺÆÚöA õÎq¡Ü${íù‹/ðIVðÝŒPašúÒ‘ŽNÒ_»CºšLÔÜá¤\tˆ0˜W0’n`¬Ð»á±«¾´Fx}ÒÔ­ŸÅ  Å‹–ŒRa,—¶’å’‹´ô,Hsd‰Õ:`öÅ€»R,K¨ÓdØëëc–ÑÐ?æ V?pÙêŽ[ÝC‡}Îóœ™Çt‰2øî©Îsì?^^c”ï­ψyZvÃS"‘üé§=ïÞ?ÿtøéÇý27:¬Â½ÎËÒ]L¾÷îãá£Ux…ו±ÓuÿŽ5ëÕúý ØÖ^MÞ\nµå t4ýÛŠhð'¬`™¶äAoÐúlŸ7£®ý´“ÂÛ*”° ”È`R´¬æ°~á½z!½p¬>sguU§™‘ Ùî_ÿ÷K ÛÏ©¬»ÁÇJsµ,!7æ4» ó<[Q †\SXåècàKC ¥xI¨¥–$Ȅ˔A+FYË8Vó¤"SÈÌHEÆÜÚ´d¬ÜÕö¯þÕðîéý?úá¸s¼1b=w2ÂQøç…5‘nÄ“__¿¾Þ(^ýáÆß¿†Þ¿¾~}ýúúõõGñú£ƒÎÿA>0Ïû3¶oßbbރݜFëóÒ?§;0)Lçm Wßzþ[§¿-àþÅ‚ÌSÀæ¢;ïò´ÐãþóTÇÓpöŸgų÷“W^ x^z{Å™¹{)Ïÿ¬µûæÃuþ=Û©ñ~E½¶2˜ÍX§Ã,ÖÝV„ ÀÑY"ó•2¢Ë ž5Q‡pr;ëá<6WÕØº®n¾åG„¢­úp«¯8K¢êÞ œÑÀO[1ñ²ê•dåeç¡ÕûêÞ„¸š'<ŽîñëÔ{Ì£ã½þñ2žæÒv&'íñ&Ó¶Ÿ¿s”|èaÍ×o{8¦«Ûê²s¼˜5LWËЩˆ†·ÉÿÛ~ÉËZu¾~‹œàEãÞYGÖåÊ{ÓûøC¯r·2åOÇ=V¯ØŸD|Ás÷^eرÿº'ô yu¢mS3wòÇßþ´ì§¶„ 0 #h"—iqòÝ»ç¡Ð23òðÓ‡éer0BÊ]mKJR`x¦ýòòïÿ÷å0µ–^¼¥­V ‡ÆîÚO¾dŒ®Ý÷ÏËÇ)Û ÊP8¾Óm%ºÆÝŽóK×ÚÈVB:sÖÝH*4£Y›2s.ÃËu&?6‚]Y¡ÿ)4ÀÐIÙ]ãÆ¼`†Ô¦ØgËâÅÍšçVJñb(«Ù4§”•ªÖzãe©E$`M(H¶y‰œ`=3`æ`ì–VªÑÁ’˜fVv)²X­õ¹,û†@*É:îLËܼó°;±¾¥™Å2O_À0gÄœmå2½Ä<Å¢˜3réⶪq,3HxAM´; T "¸ÒpÈ1±SÈ&R°jߥCC„Ì%p Îͺëp¥²1Å”¦ 3‰„½t;Ña>0¨¥Ÿ¿[Þz‹/¨§zá äsÚá,;vw¾aG}³Í{¥ÿbCwµßû졸ðmغ'n¶ÜŸüáçý€û4¢¼h…¿[”Èë£ÔëÛ”ÛHõ,¼™sz¸î”7[½S3ºÞžž¹Ðœ”Ûaov¾ÄÕ¾Y·äÐÏ›öw `ïa=xÁ zØBpQw­+Ïê_R‘º;÷ª`ùú õzŸÐgIbxíòG™ƒ»™W?ù j뷹云ÇŽñ«HŸ»Ø½í¤.柼°W “+¶Éox¿l~^BôhSÿÑÙyáýkfÝ'fÁŸ tþ¢ïK÷àk×Áox^=l¯h¯wÜ‹t#ßyÛyžàRž:ͺÞÐS/¯ ïµ6ò26Óyæñm¯MÍ£3àZ¶Â#ŸgÂ'YÎ;÷t9 øÚ“Н©¸$EO÷™'·Zñ9÷qû³ù³5úTÛñ’€} |Ä="€ÞˆŽ¾y§øïl» Wƒ¨­’èJ’ßž—GÍ›¸ñ¤ö¯4Ä‹z%én„½žö½¶³Ó’óG³až.¢)âÄ¥áí1?X{;ìz"ä »”¼ê¼ÔýxÛ.} bqßáeÄzu’¹†Yz-(ÓÍòt¶P çngž˜±·Y®ëþòyÞJÿ÷¨ô×®÷WÉ~èí¤¹o8Á‡žwÄ,àítÚ2{«ÁÓæèò`™¾@¾.Ù¾#T!½Øîù‰ÈX–¶,èJ)2HS†bÎB£eË”2Kz¯¾vÁ\ƒÌŽÎ‡Lr (µÐ-ç4ºe9ÌOß=—¡´e©¨t™”MXRT´†ˆñ©>LóÇ—vø8}ü¸L„´²Mf`…Åj‰i†h+2ExFsU«ël—õÑNZj$¼PÑ„mµ Í-,!uì>EÄÖˆf‹$"Å¥1“nH @&¥,&%t[6ÌÕë—·úú cÒë”êF¯Ý2´¬\{¦ †b aŒm÷ŒÂÚà†±"€F¹â]3M¡€À4#U`¦=Á˜=w`· øÈô”vPî‘‚8 %EÒ4ÂRY(jÂR„|T—éG#à ZC&½ˆŽœWÇW XŒ’¢cÙ}MÓô¥Ù¶Qê¶ØxÛd=GD7XÙ…­[gKF†4*x~ÆðÄÙe "…*ßÁmŠi¢!¤›Ûvo‰ÐÄp_×Ë~†3˜ý‡¡$°Ÿ^”ÊPJ5+áËŒc> ™)£§´žZ3´_&0µ@áµx¢•!f¬˜[´-Õ²?h{£ÏZÝo+Û§ëé¶9èk“|€ÙJÑI‡¼®mH+CżeÒ€—Ã\=ŸžÆïÞ?ÿ¼ÿø²/ÅŸw»y×€|ÿî]uŸ¦öñã!Smɧ§±E¶XèøíO“‹‡iù/ÿõï[C©ˆ¶ ôý†ZÉN†²woh­ôïÅûI0át`D­X›E| uSÈeýu÷µ ¤Â¥€D; û¦À×÷˜› ²a™6o ÂúH îD*B ¹{©ÕKI§{©ntG)žtBæ„—÷ÿöD fÚ¼4Îê> ¥£Ù;¯x2<™JÒw»qè¶nj €õ.˜A)wnLœC XRЍ‚—b=¢ŽH¡--–e™—67Döˆ»ÿÕ¿ùŸ¾ûÇ?¨?ïì}OÿºÜ’w…y¾]¨Å¥ ×&¶ÿ“ŸŠgðPÉ?×çyÚ_œ ®ç’3$ú¹sÙ™D{FOæEªâXþ¤m¯p:Ÿ³ ŸŽ¦%/¥Ý.Õ…;µ,oðð »1ý]eᬒ»e#ÛÔК"âÕ>í¤Ÿð3D¡ ’«º(^oã®OäD!Å+ˆªn“um¼OÍû3æí)TÕ£"¬{àïGå6Œ?N`=¬èyðÍ˽î'bxÚF^ìEoj›>¥L=Ty^bœ‰YÃ3uò¬ô-õÖWÐü¯ŒçÝ»é³ìå>ywëgyOȼØC]nH_n¨¾ôZw?^÷KT‹Î½^—¯¥Ä^{BéY¨WÖÏ× ¾rÀÎTIÝEÕ_"€î,,W°ë?ÿþà]þ•Üëy øŸ9tþZQ;“£ú¹ÜMÜ–“ž[J^YŽ^(~¿‹›ý¢Àÿª*ôx9Þž¸sØúEÖv|.èr^ßæ„þ^¿ÃÌ´þœºùGпÊWÿJßúêÿúú†å“ÿs?FÿtÃ×D|AtÅcWÐær9,ÿõ?ý—LÁ­”ÂZËà¥e£Ɉñóû—ß~ÔtÇjÎ% Ì,”âÃßÿ´|ˆF˜‡×â#X=gYÏ—(užê´ü8„y¦¢)g«Cä1áiÈÌ/Ù¦9˜Ñ Ää¦yY1+I5”Ùè(OïM?HgÑ&ŽÙ)ö4ƒí¸¼¨€iT¡JÀ¤€)£k^™4`9DŠf4dSS÷•¨e†Ñ˸>*—ÍG]J€¦j®M„ .&•fÌÌÉàé$MR”éV­”¼Ô¢È\’¬ i^$L/Óô2RË:V%sž•Ñ«þQ°ÿùÃÇßþ]L/¹Äô”HØ€R·ªð4䲿Ù|D}^Ý];«Ý( D£aUÛ‡‚2!"×| "Q|å’W2xg͵³'ò$¢QBhµNéùZÌݧy ¥™Q- IUW·]hpUÇnèÌ(dKÀ¡¶ "Ñ„ ´-qש>ÔDÇ3;Âi&Íê¤úMs-FR5µc›WÞ8¢éCGÝ¥1¤¹dHEœ˜`ïÄw²¤ ÚÄ\LpXãì…‰vΧÉàéB¥È*`hSÇ11v#P¡ )#¢uB½”H"î†tï\Éœ;ë H˜Ëš éó40Ña(ÈD÷C`’jÅû÷€9³ÁAšjá’ £VÅ`=ËbðÚ=‰Õáž0Á*8h­'¼r³sxª…>·K£,r®ÅJ­Å´_Ü I%4%â»§÷¡Èœ³§Â†4ÕeŠê&ÀêCÑDŠªäˆëY¨-5eŽ$ÌáBæš\$ÐÕPF„À€*’G¡¹f¤"[F,vC=Ä’‘ZËö[‰îd‘ùáåðáã^™ßÿðîp˜–XvOõ/~óþ§ºë¯;ZÌÅWßæ^ßùW¶qœâe­³¢P PV±žÚ`PÝÄ`€² #¢Cüµf»{0¯›=2Ãheçõež(,JnÒ@o\ š—±Žé@q ¥xeõ­ÙÉU  m,ßý›ÿ —'dîÌJ- 5;8XËs jy—ö4 ºzæ¡ÃËzŸ„t)EØÀp‹e£Ú’ )RZ*–…0ÙBÑ¢ÍË|˜IÂ̼”ùoÿÍó?ú™'_ߋŒK±º¯a¶õØ/ðñ±ùÚZTwìø•sw×±U¶ëúDxáçöǶïàcú×ׯ¯?Ê[r5¹å¯zß›†ò§ »îñ»Œß­ßÇ]ô‹rÌú¼b’qþ†·&>ûZñ¬pû4¾8À q¬øÚÏ {ß81ùZ+ÂmÌÅ/:›OüÞU‰®½V6²z‰]o%>¯µœyœÞi<¼Û½pn1¼þü’ýþO¯ûÂ.ŠèoK¢ô°Ã§"'»;NÔ£ÙÎ;™ˆ;Ÿ«ò›­óºÑá~ÂJŸ˜ ÇßÒ›ÅÜæ ώᎷëãët±úñóªÃ®v³=µzγ½8é3è/2.½gõ™«ÀyeØr›{£ó»ˆ½®^Ÿ¶‰{ìS÷¥³‹ÎŠËã½ ÐÛ’¶ÿqm·ùøÛŸÿëüO™¢›¹»QF˜Í­Ii@ÌK«²í3îfæòÒ0V7hÎL©eËúßé„›ûìµ O–a^² ájÕëÔ}+NÏv²ií2i7èì¦õ‡mkþZ V›&dOO¨#s§Fx¢T„„ ¸ô›˜U;W-«dœ)õ ç3V¦ÁÝÜÌ&Ê€§Œfwc«Å]ÊÃôB %%„=!w£¹)rFÉ’–òféˆl¹¨x@bYæ9«RO2Ý GÝìså0Gr ˜(ò“˜-ñ½ÁTô˜°ð#Öª h)áeY––$†¡Ôê‡Ãæ(æmŽŸú8ÏAÃÇýËwOï~øþ©ÍË1 î¾;æ¶,?ýöÃaYÆÝ ˜­>ɾ5Ù°D›W»rV”þW ” W¿ú½IaC·ìs=ß̵J±ºJ˜¯  þ!ÚZRàn©ìê7T~ªu¯©)¶ÌifýùWÜJÙí†Z ‹G1”bÅM,‘ÉÝûÏ[4†ÌP³3ššWK[áLZŠ`zªxõnÞí °¡cl{äEhˆŒ”5XX.™-Uœ$ I’¹4e¨e,­¯Æ^J©å_ýõ¿{úî]´]iÞoH>Õ¿‘Giô\ì…^ÝÏÜpF®¶WaÚ-îá³Bœ{Œo¹ãy³\;Å­}àŠ$pòù ŠáÓÒù¶‡Ô5ºsÛ,ñѫϊJ…Oë·U '€n/Õå­¶¿¦Â¨÷®tòÙi¥­ïö¼gà,’¼¸¬Ÿ] vV*x+ôI?Ê;XäÇWó ª>ï¸a.@œ¯*¤¿ÑüäTü†38N=½òþO9‡ëÑæ_)̽2toyÛ·’ñ»}îéÜ.3[ùµ¾æ¾þÚÝô§œ¸\nE¹­¾ûÛ,ç¾Ðù ì„éÛÎñ1@⡽ó'Љzܵp¬í;×öxZ¹V¹ìOÓ×á¼Óâ< p+ñ_²éJL'Yø2¶Ð*ù\+y!ÉYß1ú<eë#¼ÂpœiÕW! ¯;7)y†üÃQßÅã{í'åe_Ͻã^ï½õP'FÒu¯dÒxžL¸'ˆžH×êòe3ëå%ÄùòrPN¿ÂOäþóà~Óu;ÎÕQê‚à‚‹]I«ÛÜ?-7Ÿ}ß]tüæºèü .´ué1>긹ØT8ƒIÝëw:ڻ߄÷{ñ±Sƒò áƒ#<輯ðr¦‡É^Y,Ü\È;U|m{°6ZáúšÖÏ{úø¶¦èAºçŒa¦{¿ÿÖ§û½Ž]Þèè‘.v“Wì¶›¯>.€<> ÏXGzû¡¾Ò¢ûz—ë­ÏAn”ôcþõMÈk„;Þ&nÎ’{:åÉŽ'}>?6®o‘¦ûŸ>Îû)[’´âuvÏOMi¥ÌKssä)/™zÚUPõÐ"" &s€”ËßüWîH„y‹\ZJ^fÔb˜ÓówO–ç{)A˜Ñ&X²c«Å¤AìköîÙ¨œ÷^1¼gîe°ø1["m÷}S;¨ ­±3Ð3L™`i˜QÑ´`!¬lH8©è`P‚mA!²!š²sâmå›Cr' ÂâtëtyI\¬@†™¤Þîo™¥$u]“i–¡ÈVhÆB!YÀ*¸e´\P‡]@¦2–ðjí°¬í ÑÄTÀ¹r^^æý‡6–þ˦Õ5ÔXQ€ÌÕT–¾"bÖG»¯U­)X¶–ÕËDƒ¼bb¥¢ËÖ§yKÖªf[‰ò™lµ‚½“ èT$S›ÁKGæ+0z­«·%##Ãäf»'Â[kr³ÝP#ç (EHEÃ<¯’`D,Õ€^•ì´óè°pr––n´»­Ü "L“è„ •ÝÆt:P‰¬Ê€ )H(®.?fBÐÏJQF WЊ( U/%³a׬ ©'Õd™ì¥dt¸ Zí ÚëÓÑWé¶î¤q`!|ÄüÑ6ÄÖç8»£¯­f)XµÿÐêæÚßo‰˜×õ +üN•€X`CgA ŽX¤ø@¥Ajù‰­oî«Ü/!”è® Åt+ƒ©½L/j(ÅžŸžêÓnZ¦}ìD6@¤\8äì 4sV8–6SŒÔ2·T ÓÎǦœ–BqËHÊku¢µ)U¡ÍæGi—ÈNб¸^´y­¸ïçN  X6RNQrdšÁhîeš[Dš£·Û}ÌC®d/¼ü<µ ß¿±Ìí?ýçß’hËBâ0-ý=–`ôÌSß÷¸@›@"·îööæžPê^@‡fÈàÜ`‰èïŸÀI´ó~…E¬Sˆ[|ßg‹™U¯DŽ^_–™àÜò©X$Œ6ø ÏÃ8 5%öæ>îváÔXjí_oΣ»·†„ åÝ¿þ+EX­,‡æ/“ýð.v5Z€®Ä2Í-‰–eW‹H.d*­·]¢!S¥)qÑÊØ"Ùô¼Aö‡`jj-#ÔB-2R-R Ы×Ýð×ÿ÷ÿMú"uŒ;6åL¼Àl9„:Gœƒ¯a¼·Y?îb®*t …¯·‹ç îÙžü.ÿ~€têíç'ħ[+c^º ñ´©è$:9šé‚Uq!ãgÕ9”÷œ´¸ya]×IðÜdìRš×Ížû-Zë'ó÷Õ1žƒ€/âNž)W#¯ù“r3y“ ú ‰|ð~]z’ÝÖOmCqaõÇã^›·ë™3@Ç Ù=‰êvسø¥çà[w”žã=rY\y%£\q0>©þŸmÊx™¤ºCQºU|î¯úl‡m÷y{ê·Ãv>O„{»¤×$黚ø's¶9¯Ü}·Žkvdß\ ¿=>ØŸ>úÅ»)“s׺Ï=¼ÙyS슿,oñMúϪ~»Gõzþé3¯,îÉ |%íq…ºD–ñ’.>^²®S·#t\Vÿ, ó—¿e£…JçIzÓÝ^Yyªä|íÍî‚Ósðk’gñÈ]ÐmÀ§|1†Ó3tûö˜UùvoUëÀ«ˆè Õòo+x=lÿD¦ýŽs‘ÎÔý·| Ç„¢‡ç©/¬/mq½+L¿5Ã/3fŸ×õ…Óé«®÷Y>íkŽG¿ÓÉö§Q ðæèêéòKT”\çŸïÝºÜæÊq'wʨ“mn±Dfz-^¼ ÃÓóó~:ôzíJšÔZ¶eLsF:vÃnùxxùí^Ų 6Öö·ÿ^ ᬅBÔwÖöáaÅ8›|( ) ¹ÿyb4+&l &B-SuÞï¦/ÈŽóîþHŽòD‹—Æúi¡'³ˆL-”“8!¦6˜%‘P¦^á.IÙ¤N2±è|&P+dÀ{J(£@š!¥ ÊDеšLm‚™Ñ´Òv`Hë½VÉ\Àèü£+K¨sÒkF({ }’–-iÕé±¼–q·ì[´%—9ÁØ+#̽T§¹´P*æv8ÌûCLË<ÏË!pG‡K  0ß(çÇÌb—Ô½T¾çŒ#“lÊ@yBÌ- [ ÷£]Âè”LËʨéèí$ ­&™¢ÓM±P¤uUÄÜ̦eq¬´–¥˜#d15̹¿{•7—Ø9$i>cI,ë:~b¡P¨ÒC˜T À.êKv#Ì”²x2&ȵÐê[¨ˆX99¾ZI«8,™ƒ¬¢á¥å»ÅžE ä(ÿ7KS bÍB†l°+ˆDk¨¥¹7(3C|B¼¢Vñ€ýÏXöä©ôR6!èÄ›¾´¼H³`@[+@w^Qò ÅÑà 1¬V(2CL`U ¡Tˆ(½M$Awvxz¦ˆ¶Ë(XEaŽl–È^ÙànMK…UÛ)çñ©° 3¡{¼F.ÆZ@¼¼Ì¤ [æ\béVCÕF j±`ÁX²-s¤¥:Š•lÍo‡È–îÈ ŒÓ Sð‚¨„¸–ÒωîÖ¼ l@ƒÞ&úÁe"&Ö‰T¡Üïçˆìùe‰—<øî»§Ÿ>Ìs ašâï–ËÒ$ÌóR|ïA_‰I™h3Ú²êû½;§ûR$ ëã8¬Œ µ§!!‚`A ‘ Á K"'Ä ÑÖØfuÞ Vk"¢ –‘@V«Õ†Ñr,ã€[ZsFظ˜|jaÅXË0Žu7Ò9Žƒ›Wã F!ЉŒH¹?ÿÕ_Zõü°§>ØXQ 2•Àán*„âxËPhLc”Aµ…DdHIÁE¸õrkŠn³½$Z7»Î QŒJe$¢i‰XÖ'$K-õiüëÿÛÿzýWC Ý”²Ùÿ§]°~ñôñgv|‹0ï” 9+Wº(Hν‘¿ÕF' „zE¾ÿ’€_bÏð& :~—±÷+sâ vy¼2`ûÃݾ½•ö+gÈÛí3ªãÉ]??Å.øâ€GÂî·íø•×ôëëáõ»íø&Úà t^Ÿ\µÎ;~÷Ï”o$Ñ\çø¸øõ÷½PžX@Ç@ïsÊgôñŒdùô¢èÿsB—¯yØ>xðŸ*ú&¯W·Çeá÷±÷áõáÔehÅÛuEúñÙ¥8¿]†æ:¡qÉy”z¸kì{§¬éÍÕ_(]4\]tQ|ñØðÌ”ýª^éËÒ3ß44äMxç6ùJýúÂHë­«ÛÉVî÷õDýd§íã„­®–û_.ŠÝ’óz%:9Ý Å¶re°ÿíÇeZ~ü»¿/µ Ï;á&£—òqȇœb^š¤—}î÷1ãÜÀ»Z*4%éf>˜×e¿oJqEQ÷ûO‹´{ªmص¶pÿÒÞ Fîri,³"Ûaz÷v¢"’UÝPw(cÆô²ìf, t£Äv¨ã.çˆýôs*A³M´ªì†&%eš¾Ö¶g*S˜ÑÝ+؈\‚:Ûà¬tT½'`Pƒ™bž·Çœ$è(Âx‚õÔKleÚZ9µ`¯ˆ4 Mîu@T¨0ó2ÅO,Ìy‰@$Ú4OµŠ>©±-mF-—ýa™öóÇŸcšÚ’2tûÜȵƿÔHˆ:‚†v@öª‰Nð1B¶æ0œÂ{°u˹=Ôcƒp„€D[ûøøþ½ê ¶`™0í4vRw‡ÚRÇ%%ºg@´€ : óÜa¥غcóPà¦enFÕÑ Ö™)rÅ:ApP$|»! 0²IÑó:ÄX 4@”ZÂÁ‘èåõ]vƒœ´¢Á…æëµ³ Ö[#)ñm® ƒÚ˜{Ǹ˜pÔ<„ŠÁ‰eHÔL'pP­IHójµÝë [/*¥ÖqC=Uâë ìÉž—w[[=úv©G;óuÀvÿ6Ì·'@,èø0ð²订?ÐíÖ6–Õ|i“Ž8«—êþ»Å—ç§ñyxú›?Íh>^ëø¼{öRlðÂÒ*Z-¦êÍbnOÿâ/5·, Oƒ2s^ìÝ(ÉöK}‡ïžY+„ÜOÃöäI&Hz7xØËý³³»À¤’LB40Ã#EH(tB!-óÒæ%––‘”œ´ê¥–2Ô÷¿ý¯ÀÖà“ÙÈ{à­5wëýì;ç³j†o²‘y- |Üý}?Èüâèô­Qœx‰ˆ½i½=Ë ¼!(×9+öÞ{tJ¼ z¢×ØJow¾éè&4üVsçó¦ØåŸ¿¼*eƒ?Ò7;~E ü»Ts¾ýlyõ&¼,űÚ÷Øð;˜N¯WI_OW 0 5`ú6²æW3]ïßgìéo9_"k<ü¡.ÊT_»ñnž¹<£”=ìoàÉö]¿ÃÑþ#…Î…×Eúo©ÿú…åí&äÒ'ÙÕzp]®±8þ¼¢þ_õ/Þoz8ª•½åªïKúTºæä¾ùŠó–#vé&꤅®QñZsÝÓz*O¦Ž=œwé§÷,¥{‡}$ùlh¤ófÄËѸ‚Œà 5t!ån4#­§ý}Ï-}q.]tÍu³¿ý†ò¯+=oa<T¥{Ž ç…6g+ÌýÖß³·‚[†bËEŸÚú÷º{³GÄE È ]ê¶1cÍ-ô#ÚvWg“áNbƒëhnŠñùžâ6y»Lh븠í³N°ôr¾6FÊñp¯6:Õûˆž3šôÅ™€O֛ܿ·Y»J÷µé“O¡Ëç­ŽMªW•ðÇNÏ#K–gبõý+Ž÷zP.;j¯½mIÅ'wYwÚúî?rn–nÎIg{v§ ¦÷<âq–øõp¼A\®ƒ¼}ñ×Li\¦ùïÿëÍL+…ÅeF'êµà°DMLdN>0¥ãP£-/20/¾ qøÛÿ ³á}5µðÁ`0O÷Õ't÷ÞD˜ÂèÓsht$`w¢×çÝ Ãt˜iµdF'ÎÛá§DKFËH3Xy&€Ü EmRkÙŒn¾²MF‰™ËÌç!§î– múµ®|›Ö°ÄZáK@†Œ*$ @Xié«5«¯Wñ¬Ê·u\x 2VÐv'«H¢§‰Î»Ì-E-HÉ”‰,Õ@Qòl£5!3 \Z"eŠö!Êáʘ—Â6Í/m™búû¥…°1û„þ¬”ð¾Ö- ê”paÕ âÉm…JÀ€¡ ÊIh%šAR7z„—¹Kš&v„Uë#¦õ= ‡ZËê—Iw7o‰R™n^‡Òí˜%šq¬5™M›Eä@3÷lM)6,KïâÀ¢~àì®Ç„ i PAˆz}ÁÎ m`w"Á¢,NSÊ !ë= k+ÀêL0I“¹%‰]³iÈ,Àªå]È•‚íD¡u˜eŠ¥ŒïFå’iÅ ­iŽÈtFVÐ×…3'X 4À k]¹õùæzíL@·uÅŠ~:ú¤®, ¾CXáE€Z1¼*Ê€,ðÚ/ Ô JxŠÄµê€zWé\Ù5݃¸³æ;,{˜Rw$ÜåH§%ÓC¡[[Ì©,6J¦y©‰Œ9‡ñýwßýP^æó·Ó~ÂJ1ªÍ³2ŒôR[‹ -ShÏ9”I3¯PŸí¶¢®¢aW•ÿÔ(-”5±ß¯àÁºM2¡ ¨kí¿rm ‘ÊÃ|è?Y‰Õ‚y½@™˜–†Ä0Ô÷ßžæy)Ý8öX¹‡ùÊå×4¤íhÿÓ`¾…‹yrìÐfáKÀ*”XàL+kÛ°Ú{¬¿mA˜ÖvŸ>2k,¯LD"­˜ÁL¬^HM•x÷´Ëz9˜G­Cß?=7gw9”±Ö±VçÁ-Åâܧ(»]x‹Ÿ÷ñÃNîX²~< ïž8 Üí3¬f)–‚¾ÓÔÙÍ=D@Þá*Ê$)wÉi‘RôjÊ[ž4-[Äm^b^"áµ°xêÓ÷Ïÿý¿ûëu}Ïì(·#Î~‹ ¹Î$/°7¸Qxñ°~ Z~ì"¸R«OYú{\G^¾ùÄ=þü¼ùŸ¼•g/¹ózŸ+jÀùq_PJtìÇ?#¯Ü%lH¯è¤Ü4K]Ð ø€Hs’öoé×ÁÏæ‰ Þ1¸K¥xFñåJ¥tr3»Þmouqäµjs®¹=l>ÖþNRÎË}Ù®Ùbõ÷/Ð)$¿;cïX ùW<Ÿj¸ÙŸÂà«`øþð¾Ê¹KÚ¼=ÈÛHû-Ðÿ»z™̱ *Ø'Ý >G ã½Ñ™T´Ê—çôžãOÎí>Gu}ë \Ï]|ÊÝ[é;þvuøï¹åÞÜÏé Ï )·­S_ßy5K¿a"ê³2mwö}—÷/¬éßž#~x´w‡ú+½^?÷·$Š>9îÞ6ó|a¿C^ýùvI¹ªÑ>¿YÞæ¾qÁR;Ÿ‡gHëõø3€Î_]óÛ–¹3”úk¤¬×U”Ïù¡ÞØÿôÅ)¨ó»ìèÁpN„~]zE#:7z^Yôõå¤Þ°m:ß’à¹V:¿ªàŠ´w+1Þgý.:V–å+ݪo)}8BHÏuéû®žß"ïý vܤÞ˜s{ÌŒù¥:^‘³ï[|örÀÏìø]¥Êo÷Çdà·®®x°Ï¼}ó1}õ¹“œ¿|…Ä#ÒîM*â"@ùåË^®]ÊÎ×»S#QÛF”úø?ýø÷?}øñãîÝ®o-|çµT¡‡¡-˸ۙ[K°ß žÈTŒ¥aÎñ‡çýßþd£ÁȘVgëúTri±,Oß¹ò0/%“ÕgDkãó9Ä´àÙË8(½ÔÝS’ÙkT³ƒËûY˜¡î0¤Â:B³¦¦ù€h4cÝ![.s. È4B±â³µPLóªt·†âèé½^¾8”ˆî#z€z]³Á 2ËJÏÁÖd‘4ŸJéÑ…Tº뮺s™•$:—¥‘˜JéMŽÑU-[”È%Nz÷HüRˆ &PD“†íƒ1‰ Q\ÅÓ€ÂW¢”pÐeâGç Æ« ×úk¦‹„ˆÚ‘4È剤«S³l»¤¡¬"I«µî&ó2÷ÞSÝî#[ÎðŠFİ ô«[éˆð¼¢ý#B`Áéžæèö‘‹ÂšÌ8:˜f¬ƒ$?†Åë™u‡:”µx|£Xm»QèL×H# ‹Zq*[{Q«šœ€¡£+^I]è2¸,ÜQ‹g÷šûRêA?©cš¦IÖb)´Ýnßb™±ûðððݧÃãã¿û¡f’>y¥-óân„ªM‡¹EC.I™”ËÜ”0w—»{k=-}Èë±®‰Ñ€ 쫈łœ1ÆICÀA(‰ ˜P& åXβ†0#8ì GÚÃF~È`#j–Ö: =ÚOŸs#ák«Ð–rEýãepˆë½àv»1tü¼À´ÑÆ+‘ ¥€P‡úú‡6zÚºôœ_æzmK¾Û° †•R`ľìzï í‹?ì¦bu7íÜlA–©|˜j7`_«—¿xø0ƒŸöS:™,n]™¥¸ÛôÛ=»=“i©Ö2ýöwS~žÍ¨jtc(÷e˜Wdƒ‚äžu’• R™kÿP…")¥" øšõÊDH‘½/Ñ[ËJ‘,Õÿ§ÿôŸ¾û‹ßhU`sź­-§í²Î*DF­ñí#·×;Þø†_ ªðÙp‹'C¬Ÿ;^}Ë¡þš:n4§“ òÒÕý¹æ\Ù>eßÝÀS;ôuíÑ?SLþ Õœ/˜ßüìÞßðî;û•Cê¹$ ¾ºP÷gi¹xvŠ_ÑëÏ_-¿þ:d¾kœÿƒÎŸ—4\‡B_Öð’‡âë"ßÏ;ÆQeŽÔû—5n~¾%²œ­FgV¯|³Òzê›y_‚’W.–wêÞð€;~ß.Ð[>ûîÿ“øVÂúevã™zöͪßüþlàK×ÍSžG_lð-Nƒo>Öw?çÏê¶’¢w<‹t.ûó¬,çÍI^Æsß°‰øNîñ¬zé­§øŽ#y1š®œá~®gíùûß{_³Ú»·R]]ÉßWœŠôÖÃä)Q)ËÓÜs©îÕë®.óRöS1x8<=L;/e¿Û¡/Õ±û§¿]æf½µ{öÝT¾½ýÿµü/v?=Í!ÒKš%«LeDHf^­”–]^Ó…ž°ÌÐm˜[ô´èÀf¼é£È˜…œÔ*³uÀiŒ"Ë^ô²Ûe{R=‡ŒJw'DúTd 3º¸a4°U|åàÎÑ7 `­–õ¢­õþæ>ꣳc…mlåÒô­ó€Êãçc«&æ(øíŠŒì4os_’¹O@dÌÑ„¥²7Š% Upy:æs†äf*¤‰”î9¬ ; ¤¯I‹hˆ¾ƒ(†­+°‚Âi(H±±'(²€‰¾=!Ê#‘`)n•VÒLÅwP)eon…Ù>{1úD;`ù ¹ r/ƒkÐæ£+œZL`ÇCBÙDä̕뵖5~ª\qðǬ* Ó^a{ 2X|ÅßñôHÊee¥ YOØ–ÐOeN\L£àÃŒ–ŒêN8Å^ºBRиô'R‰ §Ër©‡Ÿæ(Å ‚Ñá$÷u’ˆÃì™ßyW´Ÿ’t/bØ›û~WJïÑ-ÛÜÔPÜ;B9ºgDËb«©rdƒ8–XSF£@¾ô†Ö»XA=Ȇ²¾ñd˜Á´ù'ÕIkŸÍÈ!Ê÷ß}”ŸZzkÓË–,µÔÃFbüí`v­¹®3[ÎiõíÈaÍ­uIä–Ò/ðŠL"Åúçˆl« VQëp+ßxG @Þz÷꟦ý®î”jÙiîÅ’™D™¦îôZ¿ßï½–ÇvõƒÙÇ¿þ—‘ÒÓŒïö‡Ÿ±/{šï¬gíiQµé/~Sv“ ýô´-UÃÒ!J0Ð8hJ)EË  f K³æðSi‘’„%ÿHdÖšzDë½Gd’üÿÍ¿ùôÛï¿ûËß®ÍOcž@:æ¶™Îe¬ó‚¸·ÆÓüâÝç7E¿PH}ÝQªŸ1˜ÑYüÊãW)=×]z7$¯¸ü&ÒØÝºÑ»ÙŠçâÕ[:ÄDÐÿšOþÙˆO/•ýý2ãònQü¾våèýòþHoÕ/¼ÿ ÆÌ7ô€}ó¢§_Ûˆ½;¿H¦õg\_N¿r‹À‹‹¿â póö†óz»ŒðÅ£ñ :Yóüçþ­Ä­¨’ë¸H[ŸÂ3Fç-:ϲh­4Aæ Çt·³ê¹UýBMº€¢\Ÿðæguñ+>gPt6(Ž”¿ñÿÊÙ™nl«³Ö™-2¹më85É›^ìé¸^ï$óÏÕϳÞ[]Øïjgy/lº½“ë]úÇFŸ8Mîc‹ê) ûì½æ-¶¶ØÕ5ìü ‡§c+豒₵‹ö˜è´âÜŽ’›f¾cöàô/[ï ~üÂíct¯×ã©4ný–Lçõˆ=Ç4]m=†`ÉSÈ¢Ë×é*éò ÎüÈ»õ£³.ÚããiëLÿ¿ØéÙœNMºêë>rXŽÓþ¶'ëbOų|é)K|o…â½Và«tÂñÓtüÀóÒós™ àíœ=³qçɦýCuU¯‹sž*ÛRH:B˜xÕ‡~³Ôž¯ž/4ß%GäUˆy=Îx£oýúÑrKº\Á.žI¸®å!žáݦŸÆºñÜæWºÇJ;ÝÂõgOÇÇßÿ„ŒùéQ™í°<<ì?þæc©µ¸Ÿzš¾·b¦vxúÝïöÕ)ÄÓ"&i„íÝf²õÏ™±Û³¥LÔ€[8-¦îõ%昪¦içõ!<3 í?î`¹<5¤ÐçÎ:}¨fóáÇ0Zæ,{ö™ŒL-VöfÌù‰^Æ` ™Ù­¹Üw˜„¡LñxX2Ga凞N‰^Ju•¾ü¸D gˆþZ ÇÕ6ʵØy-¸\¥l”°A_…ö\iBãøÏ=Jeyð~š˜<bgÀ‡Z+Ð`1"Ó2@EJ˜ŠY´T:¢EªçlË‚§CVùxÌ´–4­ì—µtÊÕ”u@±Ñ×:qMë©• ·¬@@©ˆ Ä¤ú,7ÐàEŒ¾Ré‡ÎØ;YT²#’¼j@“¼ wY¦ê £‹(3ÖZKAë­:Üýᡆ´,MênFóì$"Ôe†êÞ{ddЖ ,àN+Ô}MÞpX·n€Á{§àFnL“ÜÊ´‡ÙƒmdG „Ì@Ó´“1¯C‚ 7ÊEßH8#ä0ƒ± iZ,5‰Á:ŸœænÌö˜àS†6/†è`1Ct™ÊG€ 5›ÚÃÜz—™›E“OV¬>þ8ïw­×:yÉ0ÕÌ\ÚŒžÖìáû}ùĘŸ—¾¯“Ñwu³Ã¼°i~j±„ÑÝ!ä´+ÑZÄeÛ£TßF?G…„XÐÊðún§„c p8#ìbùqÓ3aF$×Zþè€ÃG& @ ›Šþ·¿ûýȵ ÖÆéIêpN*?q‘‰´ëz[o÷H¬ù"^±Îú-Løl'oƒL¨ƒ«@®áüXjœˆ¾öÑì¡ìÌL33Ùãò´¯Ó¾ì"sW|ªSWZ)ÿä»OI¦y+´©”–S™~óú§)ô})Hûê "Tw#OÅZKë i”ÛÈ2ña¯è0—'C2Ié=DïŦRp™§˜Â¨öOhi=$EÉ6ï-«Óoï={dŠÄ¿ü«¿.»úñ»ûï>̇yWëÚ5Ò/)æu^oãû¼ìCwËt¯?óTPòîÿó;û‹MÑ1Ð[]ÚxF‘8¯Žr!mý+Å<ÄœïG|ra |¹çM©»å%[é$úŸž‡açÇ|<¯·3>‡5¿ Þ}Úû‚†¢+ìÒÅ6Y—Ù;<¢ ÷-]¹wâÙ<Îq»wÜn_5þ¾Qü½ºž[ß —ãWä <ƒzcý‚˜r—)¡Ëiþv¥øˆ#Öæq5~.Náþ…ú–ºçM‘Õ-õT3úr?ÃË ¯·üüüf½ ÿ¼ °}ÎJí}"¤n¶þÏî}ÑËè.Òêî9¾@Iº}Û9×ãêpOøa>»°ã—uYx¡ —ä™Wïò•Zú®Q÷ÜGêköWrëY‹—ZÇ™ p” ®R©GøùqY8ù™ywÕºEÿéBç¯$©ÓQÜe¼ÑJýÝÿ™Eì~ûåÅ­¹þÕ&g}QÊyëÈógëÕdy‹¡úYÀuÎþµÑñÖ,ãù«àB‹½óæ7Ö&¼·8œ¼ ØãÅšÈ×Îäø!÷¢j}ÙÑòŽÒ{e2rüÖ»³ç¬ÆùrÄg;®Ó /Ÿ¶¾ÂìÝCè Òù¶€+Œ*uù÷_R8ñÖ®Ìwu\ /ϧÏApz™Ð.½óì©ðÐùžàrÉ»þê«Gð{çüíœÒ€Ù‚¤Ï_÷ô¦^’a¯QzoÙï|AÀ{.u™»:¬¾€e”õÞÝÊng-¢µpr*­…@+aô§y¦±VoJsšíŠÕpïsÑBRü>úñ'/|ø°sÕqž©¦Îèu*µôÉ,^zöŒ.ævy]“÷CæÓ¶ÍÈ€eBoG•­Ê~{> ÊÓȸŒ4dôU¬V½#ý3¦Òq¹ ³˜O|¤±‚ y$ültNä ˜?¥¯ VaCGµ5!—ý´Ûçfa2™Aóˆ§Rפ €%4aø[Ù™ðÊ­?)áf0€9¨(SugÁHåX”R§Rl„ÝÍké¤ïýSÙ?üë’B›jÍØ·H7f¢«Ž¯øiFï=EZ1ׇ½ZW-”@±:&/©ý$²YÓ9€L&%y‘ÛŠl\épr°}=Û¼ôÖ¢w„2¥LH^ì¯þÝ¿«ûéãPnææÔ¨ú¿Âtò¢††—Ñʽؔ¯„;?g‰ôeÈt7Žú²Î«/vÎ+PXfJäE•É›öÏt½µÕ1 ý&U‚o«"|_uä;ãÌs–Ësˆ[ÝðëŽzˆ—•1·°Óo.#ÞO¼#‘ñN9ò9 ýËø•§üëëбáçîøâzuü\¼£˜|Áw}.ü]ÂÅ÷ëå“}Ëy粬Ë%ý]BСâª@oN‰ýÜüÐù?Lù 1KŽ7âꟿ~¢W¹¯Üþ"«ΊûŽæÃ"ß°$ò×±t~ÓáõÎTæ×ï1ô+¸‚o=Vþ·òÅ ß³£ò›L¾0–nïÀÕ>SuxÇ•áK›O½v»~=€ï›³z×{/+#~¾qÊ­_àÜ»bu¤Îì¡î<µÃÈ·>-­xìë¾G³äÃþ¡)›ðááÃTw÷û^XhK%þéÿ`ó²sèz¨ñ´XO:å}7)Ŧ,Îý.{b*Ì’ãn’w˜vá)£2•¦À’>P@)KDfDÊÕ1¸Es[–Ö{8Iò_üë¿òiš¦i7=|ÿ)"Z[¢Ã«\4G>móà^­_{c(úGËh¸'#â2 ¼*-¾F üœÛ^õlþ‚—â›K`¤Þû'ßäÛïQ€~æˆôçÛÓ»|+_ýñË®ß~c|75%ýѯxGIóOá\þt_Çþ_ƒV°Áøë»D'¹á:ÿ­tÿ¯w¡¸ú4e‘ÞÊ?ãöŒ4€™Ýê­+à éÓý=÷ßùwãN>‹<&¸ù>óZÔ<÷ÙSù2ôØøÔwc^ÔÆs«×E%õ3.o4×€3"ÏYºþ~ýî)ë¾T¾*Ö»b7bÔý¸Bªëñ»Q^=Êü©Óo¶«u²?íptÕ9ȵ*}^ðtÕÀ|Aä9^Ì{-<ºÆ»—y=ÝÝ\ñx4×õWËë±ÍøªïzðYî ‹ õÂ'ÎfÕ¹íEÚ÷^”xúCíq¾LêÙ1rÙozÑ…º=Zνì¯|ú©œ—Ãÿ»öÓc±bœëÞzo}NŸT\øË] Já´CÝ[Dd²­š©À3Š!‘½ŒZÁ;q`¤„ÐW‰s…™§)˜0ëž`Ù›kšÒ¦9å|án@‰¹É‹0§“Js"c˜ bóG]2p$¶Ê\­e¿"VŽŸÖë=‰Ë´B~”:%(eŠÍ|òlÙçðjŠ!% ‚ZAvä qáꢖ4UødÌì1k9dñâY õP€ÝhŒˆAµž& ê=w“äÅP2#e2ƒb@Æ;z-½VAsçî UÑkr< Ê”Tjrò¿èR@Îì\š2áED§‚™¢Yar^:ƤëÃ~'ÅáÐ>î|_v‘r+¾dì [v)wÅ:¸,iòlÁJ$dÀtÊs œuYQLÉÕ–ÖAÕÁ šCéHGN*E.F Y?Õv¦iˆÅG0TÆj*¥"­Ã `äžÁ u “¡u¸qW¢Ï¦‚JòžðZ±ß«©£…“š²·ê©C²QH@ƒcSÖo ò‘m+‚¯‰¨ã“‘ÙVï0!:z‚†©Â/€Á¹úÖŽŠks¨„*†„ùê";¾eõ•¹1[uä}Ùe¢ÖPfŸCR-¥˜'Drn‡©>÷Çö³•:íÊÞ'.s,Š EdSOBqX–¥µOöÑÆ g¨wËè‹d&'¦©N"ÌÌ {´L¹ÅŒÙ“é°‡‡z8tVoã‚>#;2W7c0.‚XkêyôÂÙü|C ­- >!:HÔ:ò”N¨ýÜr{ÒšX‘* æšk±í1çÇ©áøÐ° Ù‡ùÉz#»÷FLŸÖUK„: `…ˆf`7—l^ Þú˜JˆÙ´¤R–mØYòaÿðiú²+;uPW©¨…¦ý~ &ñÏò±‰ä®ÄÜBj©³À´·º¤·ÈTŸJcãÃ~‡Ï-SÇÇ k‘;Rì)Aôæð¬¦Ù8%eŠ’”GcäŒbéÃ…üWÿÓ¿­û)2ËTóOÿ1 å0CÚ•JÒ΂Æ%mÏmáXÀ{j§‡®žÍ׃ñvs\Eñ§wðã~ë o}ÖtÛïy…sºœ€=WG3þ;Ïv¸}[°rîD¹þlÄ‘f”†{ÏqÃtòÁ+/ë0y•Op¾ ¾o®v¹ÝÕß ·^†{|è~oÈœs8yS†ur[4zÚ}_G¹Çš¹›bãÐp~^g"o¯Ævœ÷¸¢G. îîãÎÑ%øÔçë=Og£ãÔ㳘»õsùªÊswo~îÄ ¼å\®Ð+ÃïÅ€7Õv:îïžÁ¾ë¹´ÊÙH8)uÇ ËQE}W²óå ûF"Ö«¿zËŸ¼: ¿Ì´àj-º’á~.Óˆ¯Û™v-"¼Jȹ·²=ëømÏîŠjrEÁúâ›~¶X…„«´ÏÄŠkµmû“ç®îý„— ä³+©ßÙÍ/¿tø‡Ë|ºmõ¸ºk/n3§ˆå}¾÷+qÅ©nY¯I'Ü2²n3oÌp¼-Í{®æ>ÇÝ8ÿßõ«ðšìxñD»*ûxnE{ýÂiCñŸû­žôì£.S“ÏëïçÂÿ3Ù˰üBLÇuçâ÷3¡Ó5¼j›Õ—- wnêXkÞP:Bð9Ÿ€ JÏØæ†ñžOß”»Pwy7ýÁýÿB²}ñ‘©Û+ój+×庤{ÁÏ=”þ³ŸðüÜ\Ý»Qûý­áõ– —ã]gù6»8_îxÙ5è9¨âÙJÄ»½Ú÷úéðjf^—‘ˆn†Ýåßò®á·^=‹÷4]ðN뺞Wg ´ÎüðsÎt»†ââ}U3Ç,Ïž¼ÌÞ¹·QNqwù_ÿ×ÿw›[[º¤‡|Wû¢>·6/ˆÜyÉy±b‘±Û¶åïÿöï¿çy‡ i?íËp˜|j9÷Zá“òQóÜÝKßﻘù¸‡5YàG%1`+^ð” nœö1d`®Ìî. óÀù¬­Ã–ÓÑÝÛ£¼&@hµHµ–Nõ@ú´+û¢èË-¯wpÿêD6ðXÚŠìp_“k†`¥ù¨ÝÍ —¹§à†”¤ z)ô!Og™ C®Â I±P! ;K‰¢Iú’xDÜ—n(»ê´e qæ%ÔÜkiO=B¬°êÖ#{f¢Ö"ª)ª³p‰•űIšÜÜK.òòFá5%Co®)”]qc,±ÄŒèmÉŒR ݤh‹KÁbfU©Ö›™ Rco@ª¬¬](FÐ …µ˜‡§¥·pçÇ)R=Å̈®‚—BºùÓ,1«yo=38Ь¥Š•À^€¨ëž„\eé6#‹C%`…ÉTr8¯ŠêB6ÈEA犵¡à¼";$؆ƒHœ1~F‡eú1cxöZQF9íŠ>Ïh]Å#‹Ãt@ÑÃPœUtÊ¥T̲¨§MLͱ¤©U›6€¹éõˆ oš2`ãÍã` V½Ø‡< ”DqÀà$ÈP÷HÛÐð£ÅÖ^–á¢@ßÌ}ü¬ÆÜ¶¶A¼Ì$ ª›GIŠ¥x* EóSì>réËü˜û]µÔütHDD||øHÖÌtã¾<4-Ê~~|:, Ä©˜X¤ŒÅ`tóÁ9•Úƒ•è®eIe).)^½³f1ôžó<‹¶æhcãö,§Åf> >.Ý–,<™‚ ^@Âð‹Þ dk&o ~ÆS:rôiǬö¦àû™¹Í¶‚̆Ðf*À­3c$¢V`×H@ê4½ ÷ᆂê(+tHmu ðû‡ßþ#ô>ÿø¢#úÚz…>zŠûî®™­–éñ)>ìËîÃCñý_üÕ¿Í}»™Ñ ¥´½ÌmOv‹xê;±Úe1#ÑVí æ–µÀ=A›}|°„C1á­Ë‹!%M«îOyQªGBîãá—™AÑ"zDl}»ê¼Äî¬* W¼¦3a‹W¸í#ɓĭh®Ëו|G¬¹¾¥|&ÑòÌöýÚIîM—¯FÔ/ÈNï@ñn„þæù,½y-ùRì3§ün)öõ~¾U|ÅzUüê­y…zþ³u«Ü¥¢ÿUηß{çKÏm.õú#ä–þú˼îbm^¶åøâ¬Àípz—;ÀK“ò jœ. ~‹Gúý¥âO:ÿÊ~.[×2á…€oBxûú¬ØÝ¼é¯œT~ÅÇö 3‰þüú&wŒÄëBÿ·Ÿ¾ø/F!ÿà;ßhd»¹£ã–ó­n?ãilAù)JYµØóÿ÷ýÅÓ²Ì3ȇ»OÓ~*ÓÊfÔÝnÿq™-rùýOîåáaúø›O^qøûG¸í÷;Î‡ß‹Ý ÓŽ=c9ÌêÑröºì¦ðÜ«,*32УŒzumð™l+¸|Ì2:R°8e:FÁ56)3sÅîGÌÄH$ž™9%Ùb=®ÏKöyÅý— Ü¿Â2Djð1Òa; #°o@æÅ†ÔH+ŽQ«^+½ô¶´¥Ñœfi£¸j ®¶ôÞ±û@eúÄ\”G5°K}µ €T$¦)fii˜ÒÜ–•½TG˜—j}±ÛS¶ÝªšECчÍÍ݈ÌPh*Ö]í€0Nß=DËL(C˜"AÛU«…ð:y´PÀö±´ "L™t ¤;ënßžö9Gô@q+M£®º÷T";{+l„ÉaYŒWF(˜ÛÔÛœ­ ¬µÑCOsßO^Ä ú<xpŸç>·f©LT`çö¹ Ô‘¹&ØTF[@%\s*Ô`¹Ld˜Z`,p…£w 1A ƒM…ìUL ¡eÍÑ/ 6U%à(£r|JôQyí*®ù¿=1Q?!áöýÐz¨ì€0@]•QX¤"eË%ûB4CO •• ƒQúßÁºLæ ö, =6ÅrëPI€^àG´ýÃ"mó‰mhÓ'ÔÀ€CCDÛ6Ë0µ2dÈT‚2w”´¶dï ៾û>»ÌMP[ºw7§M¥†zëÍèãPÍ!ÄÓÓcÁTëƒ¦ÒæÌœéY*û’Kë¡ nF3wï?æ’^wÑúngÑ{×@MUX !…2AL®.d¢Ú‚h°€'ÒÖ^$˜Ž3* ÜàcŰM¦70Ð; ×ΉHĦû}b´µèh2ZÌàÛÞ< ŽÝuf€¯I –+Óid#F;Â]¾_{ S+ÊŒ˜¤Dtô,P@sø¾øhøøÝôá»~ø¼ûí?Böö÷¿#,”˽L©l,ø®þ¦x™³[)ûþñ»6Õÿæ?Ú¡ÑŠ“„ºT–ØG­)e!—ˆ}ÁÔF¶Ä|€[éB|Ø!¥®,; …˜ —Æ¢ØO2R<‚¥!Åì)AH5 Ї¿´RÙ—Öæ½Krs¯þðýǺß}ú‹ß@Ú·ÊfÔp¨?爮Ï$­¹,é:L¼cøsÇ"G€ãöûýüÁc¯/¹~¯îøÅ^uwï–ÙðMú2 ãW?¾Nº]5š?Âôçן_ÿ`^4–?ÏÔ»¯?^èü¯,¤:EVçA¿`Èž L+7m.Ï%`ðrÛ ó®uÞ_øúQó¼Ö$YN–¥Wݱ—xW»À„»å¼gáϰ;çÍþ°7ž¨Ï”%ãX_AÞ…y,÷?«D>Uìê^¬û†Rž;(Ì—ËÓuB)a;ù +1Ád†®w}«y]½N]Äm—Þ‡tw¸\Ž}œ¡à·_žW³ƒz^YåóÃóÞZåËkLËE÷‚Î"Ž}|™\—‘Ü+8ÑÖXÁ‹!zéXuúsÝ¡î‡Úw¶'›Ô~5ÓïHÊ·pÕ3o®÷¥3.s¼w-oml¯`Açr^©ñBgÀíŠsY%ôšûÊ sí¢è¬ å8Bu6äNè,\•ø]ü½ð³i³»[ÎVpÛ 7‚.û'´% îäså>œ„ˆWöuݪçÌã²ÌÛ©õßÛãáïþÛÿ¯õÈÖæ§…r9´§Ç§:•vû‡‡ìVÝݦ\t‘xzš&ÝèÓ'‡{ûq†zXD6 eFõ,F(O\<ÃSX¹%÷ .Jô”©§Ã çۆѫ‰Hp‡U@臕ϳ¾g¨üXR0§}æ!³AȤiÅý÷12 æîA‹‘W  á:Wè 0Ó¨^'E¥,{Ò x4Xªeš"¤Ô¨S6/ˆp£N¤zô(Èì(ÕJ––Ñt(€¥80/‹Lu‡^„–©DaëèOÝØc&ÃHöÞm…~°EŸ&ºsŽ­“uEoM%9•bÆZ±äÌFj9K…F–]©L‰F£4ÛùŽîS›çº›ÊÄX))3¸ŸvmÎ6·>«uYݨÂô2YQÎM‘è«Y® ºó0¢”É–yž—erT+V="—æž¹Û×igeÚæp9¡ RQIš©úœ-¥ïÝXËÒçÚ1M Ws‡¤@ãÞT(’(äDuSJìL¨Q£9`¬ £ü@ØÊ‘_LcwôeEê£\VîJIp¤>FËÁw@Â=`ÁlÈM–2‘}n–ÙÔÛé©k7Ãpîå„“3æ@HCè°1žGÂLÛôÙÒo=· tÁ†F ¿ßRᾪҥnK—­s¾¦FIû˜ƒã†=F`FXµ‰EÉÜï&0`ªÕ¢«-9U7"¢uy@âÄj¥˜·69¦j;ó‚2EZ!Kì¿›ÛÁUvS ©>/(’qéOu_õèíñQq—»Âd&Z2‡KÁ0<èZÙ>cR×®CèÑÆ¥càb-ó×fI²¦-‰%ÖF¢qñËn%D™ƒ‰Œ5±[ÿDÙìÑátþsŽ^õ¾ÛðKér/57;ÒÓ¯_ö<£—çï— À/—Ð>wåßèçÁ7¬Û/ÿímÃÄ­¡÷}½ïl©¼íðÆ©ãüz[|É9¹¿†~ÎÛûmÜ÷«Zì—¥ç÷^áË·­¬ã÷¾Yüå󌸭Zàrû‚ ~‰ßø×­óÜ2õ^Ø=™ëÎ̺û¶ëã½ «^^ΟMÇ«=Ú2Ži€+:ßÝ[y¿ƒê %mÏ>òÎ@}mÚ•Mÿçm|†çý»Úç½çžtTuyG÷å3Qñ+|Û¼9®×Ç®®ÄÛsÌØý£àY x­iK'Õò˜UyK¥<ïnKÄóýÈÅÐk'uç ÜX!\.K:ŸWTâäõÀ;’ð©kY¸÷׃WÐ5U鎲¯‹ãÐq’œa*¯“hW¹­!þê¥ÁÃç²[ºTÜGóßkÝþ6´W×ê·ô|ÏgòÞòªËÿ~Û.âùô. £ÛÿŽhUÓ|žOÜ\åW„Û4Ãé¼÷ Çgõ ¼#¾ïå“Ôå¸ùæ‹´Ê™ Ïå3ó›‹§§ÃO÷ûXÚái–„Ô‡ï?Â=Éù§C­ä4ÕXz÷y~|úî»ïö…ŸíÐ,éµP¶è­~°IûÔÞ‚¢ZYšf’7(-«¬KHÈËç#¶‚›/àT«˜ÈÕK õS•ñ:Ñ7YÓ¶ <ôMÙn( g2ÍÖ­Zl³8mù‹)3D´š;öÑá„€‡ò‘¡æK¤f.Ÿ¦©ø¡uK™–Òòԣ燣¸›"¤])»bVÍ]a…`陉Y’“Yúw;xA†ïv Eš—áY`î%#£§ÛÜÌw¾sB½¸™¡ºËc&”–­Ñ‚®¹¡XQWDóžK 7ß{É!.‘4/“;qhÍ£ï>ì–ËS-wˆŽÝ~Ç@ôP ŽŠ)e¦”­?Œ‘ 5ŸFu?•@%ÔH Nˆ+;¥¥R0@R,¡Qˆ=$T£U¥i°SŸ}ËŸá¡6 ˆ`†Èm¿&ô'€p‚ uôŽÍuee†ï`¶€DŸà X*% ³ÚB‘J@=WXü@`­B³NÎC»?ZɬEâë «C„ @” ÔVMø{ÙÐæ+èÈ v4´frÜJXY[pÔAš;¤~+Ö†-gÕ+³ja)&§'>ìvÃÚÚ¬–b±,ÅÍÍR™i2#v»|ž3rÖ<}0šæÇÖ{3£2l€ÑKjúXãsfäŒV9ö<+ÍÚꜜ‰ìè Ù7lH dè æ@®. ŠÍÝ·­mCǶH˜£–“%ƒ%Ð!Á ÑÀ²Æ1fkµþh{™ +[žÅŽyɵçiµèÀVþ߬@ ÑP fE‘?w›NKÇ«Jeö˜ÿ¹~ôúñ£×ýˆž¬î\ ÅsYè&¡7£iÿ°¯^döýßü/»©(E0s‰¬ÑwVÍ4&§Zôq·- ä²~hdN`ì+¦)I‰íi‰©Ê!ν=LÆŠâR©Ñ×µ&.ŒDD`3õéKSæþ´¥eäèÈ(Ŧ»ÿðÿ/kãËñ>­“€ûÝ´¥V69×çæ¶œÏÔLáåâ©sÊÍyØT¹.».¤àûb8¾°9¿‘AOßxúü.=ëÖ9à»l¾a­x9±ñ–¤|»9ø³çõ}¶Ï.þ}­ÿ¹ÿü‚S¸EÝ»¶—ÒøÍBñê:ÿ–4Õ¥^q­¸ï³ƒ[;‚/ºÿ0 óï{×xå‡Ù ‡ýeÇð-sJ7ÑÚ kÝmÒúrÌ¿fП_ø×רë:ëgÜ–¾ýáÿ%/ó ¯Î¦?ó¥þÈ_£g(&o¸üFÓá—îI¼ ÷îFióOOO?=fë ŠÈéC©ûÊZ§ÝäÄ27w—Ph-ãðw¿kÎKôôÔ»öÕÕC¥8æì!ïâR0õrÈlÈNŠtžÅ<‘X;D{Ty:DG&Ê¢m¿5p$ˆ¯(`è HÔH€A1€ÊôÍ&NöÐýñïçR¼ì\ÄÓO  !Ö‚‡ž–ˆNË Ä¢…®&–A‚Á~ž3a…P©î`†ºà$…j² dq "û¡Wèq,ÝK–ZRY•Õ¬Nå°ô"2¡¹Ó0lTÉPT* ]I8à"wuBBPj¸3tGº q-†…XÑ:܆îZƒà@¬*Klb G6ÐèÀZ^ Z¬þÀZ€Pœ»ÕÖ!‹¤‚Ùw ¤L¿ŽmM+¾¯Åkrkx¬‚2×ÃvA¾® ŽUk µïøܺj†è¼¶jUº‡Ÿ°VÖ¯ !;Ü6 íDËÙ‘èp÷É+Ôƒ2³XÚÁ°/ªî.33 ^JÅ„L»22Hóa·‹y9{o»‡–Z– ¥WtÒ9¡X™ç$ fš"YÂ@Ï㩚<×ÒûŒ•ûOÃò¸{ #iXÑè(ÖŒInʱqÍôœ´ ®¼ HÔ –Dö•ãó[J9•0c˜9Ü·Ë&ÙoŒ<Óèöy&€P NSI¯,ò¹Œ4uOuL^z†ÈêL.åá¡ØÇl³}xØ=ìA`ÚúÜj©Ÿ>ÖÚ¡Àv¾#½þÕÿ¥Gø¼6±ˆ˜*@LEbQ/û½¹±eNE sZÀÝ„-½´Û²›R¦âccšÂœxØÓMÁ0ìã ›Å/±–#ÑšRföŒÞ{ëê1öØV¼ì§¿ù¿ý—c=qÞ¸)׆‹ÖŸe²ÿölz¦vàgz‡I‡½´3ÿÓaª\êl|1Ï…ûÌ|»`wl/ø²€_ø½+ð‚–÷çן_¿%îϯ?¿Þ©ËýQBçõþ/¼·©²·2?÷8ÿæOáÛÏ+<ë8ßv3çýž[dq+¹¾#ñMƺïØ{ùKÝ3ú=]¡S®^T§uãòñ¾Hï,8:žÞoŸrW¨$ •nq8§"š[ŒÉ½º UÅ÷;)á„dºñ%¿ ±7¨Û=;ëu;;®­Xe ƒt—«ó–ÎëwI÷~r4f»ßž± ï“9o»ŽCÿ¶Oáfäßko[v¿0{ÿMl‹.½Îtôu»{/^þ¢›Öóër®óžõÛíêèa|•ñwϯxýï³É¤3rÓ™ùÄu'1ï:<ó4^Ïì­É»[ÚëÕüìÐ.ËøÖ•àþ<8÷æÅ½žŠÈ\šz(ŠûTŠ—Èè]û½GôÞÕKö>Õ©AÕSm?¹Öß|Èyøé¿ÿIs+ÞæÃ?ÍÑ–²ëõÙC!GIXÒÂð3"JE!2WêÅ(’bâðØäfƒICÝÃ}Av””È^‘3F^!¡4 @Ï@®Pì#áðB¹²›R0yÁ è2 ™GÝͳwIfÎjTÒÍkÉ`fX©tËèуtK—y„Á¨ŒÅÌÍ?ìÈ¥!§ý§O?=þí²"ÀÌ æ{ËX24ô Ü0ÉÙ,Y»·à\ÉÌõT2¨yÎ ›ŠÊÎP-$ô0¸ “‰[F™Ê’ 9`V¨°ìÉ lŽº›¨®ÃÓ“DIóJAós£ÑÉ:YŸ#33Â,Sa¥·¹!gg(ÑRêaªá¦LfL;K¸ sÏ0éîš)??.Õ}*F÷CO´,æH¨'z,K„§O^‹gHUc-Ξ™KßIÅxH%$rø4 Þjìk <’B_P*¼0sð !ÅAqYí^ßXŽ„á¦Ã!á™p€¶êûf«ªžÔÍ« <)Ú*£gÛ\y'$‘”5㕊j±ºC ½#Šõ·ÊU¿ ÑF³9ÃO4žAõáfB«íWkzÉ‘@ »@X]AÚ ×:÷ßÔj/°ãçw0 e‡L& «àÌÃ&wÐSQPJÙ·¾´Þ)NÓ$¤2sȹ™MK¤$äÜÆÒ£¥5šLS-î47%Ýë‹cµŽ®9›îSWÖ©d4Z s•Ý5’|Æe @ðÜ»ô†¶ ;²Á€lȽ£·1[7ˆÿ¦¼Sàí‰wÔÝšXÓŠ÷ÕWyäNVÆ-738Bîp„r8ZÌyO®,WàµóÃÁ²Zûî‹ÜÕG, ÒX&NÅ33ÒHBã`)‘3šÍ’Èô½q·G¦ËûéùãóOŠÙ«czøô7ÿK‰°è}îIó©V$¾ó]f¯“õè]ûjs1«ôÄ,D±ùôBéÙjŸÌÄf Yí}qO ´“g‘éƒÊ¿Âju,ϱdJ©ÌTDFf¦"32z(€/S)Sý›ÿù?ŸèŒ×j'ÎÔÿq=©øyUá7oÇHðü!|!å{s¯á«­ÝÕãúyl¬n·./l ÞR—ú|áä÷Ü©}~[zütm%å›-ÄÒ±+úÆ–'6è»9o‰•_=©—á$—Ã÷¶Ç< ÀðLÍø[ïóÈýNw^”Né-ÁãyHÈg^gµÏ¯ožó~£q5z_Ìz.¢}ËAŽüÅ€-¼½ýœ¦uM7& I£[c;oÐoør*â†yp=”n\¨¯ÆÃÕ}øêàíòôLíü«ßr×±ó+©ß:~¿°fÞ1¸¾gýÜO¾ õÜ¡«…â½”à§ßua¿¡"ùÜM¹gƒÌw #/wÜ…•½uuÿ*_‚‹û‡þ>žö[F×K©¯ý¿IsÍyþ¸>¼•vkº||Íb¯3x Îž¿Pp ðt.‚ñùë]¼¡<Ç…¯þ^ÂàŽÍ[-öŒÔ}[áùï=‡Ú¿º|^<›¯>ð²þõŸ¼o0ÎKÄËÏà)Û·Í+ñlíÚ¸ú·óóœ=¢g>ê¼½V—‰Ë€í„r_å«°]¡m8]F—_ÊgsGgá²Î.ÛÕG}£x·z²Çî×Ëk«sRìºHLóc˜7.y|1ý#œòRÜÆÊ—=W®è•¯4!ž76?·ëx­“ñ…ëðò&–o»†÷ŒGxƒ>å¶ÝF1áæã ]¤žnæÉ&¹_ôn?Ðé¶8¹—LÙõ£ÎFüu“áųö0>žàq”ÜnE~üñóüãã㟑¹s—!ÍÊÃnr¢2[7s+V¼~÷aªÓ´<=}þñ)~zœvºß ÔÒÌSêl ‘´nˆÈ»[qZddt±Óá­a~‚¥B ÑÖ ˜ÙA-0àÝ0Ì{+(QêŠì Á ⦂q3Ï\·c €a4ÂŒîVì„bˆGIFšG9ó8s™›ƒ¬€µ2xÙem¨x©¢^÷{ ed§Õ:Š´}ÚÓøø»ßet §&f’ð;dÒ–œ¡AúNÈ`†ðÌx0kæ¾S¡bŽfYKtEë}î’E1‘FÂàFöT* ’¹4 ;ÖsÒ˾:¼f-Áݹ»)R•„hFZ,™ ’&˜»O¥-=#³5Xj™{,ð­gK*ÈN%pÏ‘êÈDë˜Eª@XZ9yq÷%$ôI7¯!))ˆfÕçë)q*–äÒÂ˰EŽö8p ¤IĪqW®5וFÑNxY±‚4VgÔe 3``RÁ ££e!$m $hóh•@ahô#Uà€%guŠN0¶Ž®Ã±–Š÷¾Nö ðý¦é×uòF"ƨ Ñ–G`xä$”²u %¦ßWwÙl¢ 3ô†Þ @-0Àëú†bèû_¬ùòá¤Ý xN&|¼ŸäõAÈÉXéù>ì÷û]9ô¥ÏMÈ:M»ú1¥¥ÍHôPfVÜ6G&TKAÚ¡J-»ÝŽ}‰¾”âbo9·©Ìì£@>{8]}á×ø“*‡Ïeª¯×!cƒít„6ïƒZ¬wJ‰RЙ! ÂHË™c*k]ÿ°ó]ð#Lûµéa´V Ÿ’1Z2¶5* X#Œà€J –“À= ZÙAî°$Çó ëzÈ„öí“Uu§ù¯ ‰Ý,͈©š‹SekH Ê›`µ”Ÿ|*šM‹–¾ûô^wÓÎÉT|Ôn_ÿå_·Ã!{/dº"VÍ%y KñíÓTY,™òÞ±XÀJ!Ì»—0ö0­wQË4%™,"m^4Õ´k†LdB«ôŸ=¢‡RŠì½DÒxþzñºß=üæã_ÿ»¿ROEßBDò•­õ¼„M^m2jHÇ¢›sÆïü2:½dtê‚$~ "G|Ÿœ{[R~7*ºÆ¹ð­ Ñóâî«êÕ[§³È뜗Aϼ¬Áºã^vîlô†Ýþy,{‹¨¸Å<jÞQ‚Îp7·6v8]MK'|>î_ê[yâ„>–óvôÖ»t¶Ëº­Êøú™½À•OÀµ ÀµQÄÍ…{ý}OžÓmЫÒÿ­¥ÁŠZ>™¿¦NžôºüÖ‚0ÂÖ1ÊÓöjð\־݊îJi—¥‚Çíúx£œßÞ«»òÙÏ"§ß”¯ò=±³¡®Ë´Ó—åç³õ®æ~w?'¾·Jï¶°ú-ï¿Ï‚î«/ÓÞ™h·,õ7^Ò[£¼ˆzU¯ýÿ‚€û–|íyÒù’¤Ï['‹>ó9LÖyÖ¼™wz¶fïÛd¶þä óo1Q}»Ä›Š{õ­²Œü–kê;ï%¹}Å2qo˽²Ò³±þçn’_÷뙜ÕýLï_ t¬Û:Æ›§b¾„ {ƒõõ æu¢HÇÍÙp¨Ï+ôºo$üóß®?Ñ×ËÎf_¸_®õßd‘<ïàÝ †¯˜Aó+z¯§ZÄ;Q™-ÐÓÄYÁ:¤´ØÕ}(üàÞæÆRö¥íñ€hß=”ù)—Új !”œö¥·Ï™lÅ-ÈPŠEF*Zcrpćs¦¯•¡Qö¾múc—C(uåüŒØå3¼b÷q-“'aDÆš ð=ô !Ò‘¶%Bi2 ˜¯S1/í1͆ÚÎLx1¯6ˆÒÔÚy L2iäàZÐ ­$¥%l*nnÅwßïææ i ê[FtZ±E³²#Ko¼ZAtö§%V™)&l8;º+¥(r×(ÁÌKñeQ –Dq¢~0°GÓ32˜ÓÌ`f48XkSAñujÕÝs”L‘¦@’=ÒÈÌôjBæâR/Å`óÒKdf4³n:(3#¨N‚Jµ€ú‰€ï"Åa‘Úº,“É»¹1¯H>T’¬]FôÖ‡¥¸Ñ èNFdÏŒžUi@¤œ$hDB!T²”Q S ¹×a‰"6Á×Û-&¤i‚ÉZÍ@ä‹È1ü†nKB¹ÝcÈÁ˦·Û)g`Z *ÆH° Õ0Ô€DžÊa‘ _`‰ÚtÁ|€e·wd ;Ú²Má1SŽh‡iîP¹r{°ï€£Lð²bµ¬¢îÐç•#¿&Õ´JÒ#¹žÑ á—é‘ 9^åf ܶTœanpª>±˜®¤Ð«•É÷´1C Ða~¢Ù~¿k}鱈Do-ÔÃ:¢îê\Лթ÷–-&¯ûéaY:ÛÜ4«ns›û!%L‘þ¯0G4póÑM@ 9à9C)1úb­ô×ð=¬/[ÿe¨ö)ˆkŽ'2­ƒÚï¶¶+­L¤²f•F¦jà€†l[´äVàÉaЖ&Ô£ë‰P’Õü  #)—=°´Vøc7±X¥÷á¥Û’fäT+øÁ;Û‡Ƙö¿™þÑ?•ìéw?Í?þ]À÷ùOÍ×Å£îÿ¢~~š¦"£1{™0‡&ª²™Í² 0$¥§èÓ‡‡,NtÖžÅ8K‹×º3G2€ÆR­Çb–X7Ÿ«”fìöW…2+d ~"£÷lk Z̼xÝÕ¿ù/ÿe¤  “ƒ¯À6콡Úá²°Dßâé|ÇpO?/æ¹4€®LTî-Æ9^àÕýë¯hÇø…÷å˜ÝáÄ—ÆyxsÁs%ôçåÿ_®«âÊ[%÷ë?ꎜ·e9¾pgòËÕ·Œ£/ý*Tˆ/Bêÿùõ+þ,ðýQ ,|Ðù?–¥ì+×´«äô ]™ßbžs÷:«Ü/g«Ï 1ç^%Ô•#Ó;d¼#Jÿ’…‰×ÑÆñ‡_Òc…³T? î{cPžU _Ý«Wý;®6HÇ¡reÒq62t5uÎk¤ÎOž]ŒÞ2ž3*ßÏÑa9Âög(@gÖ/Ç@æò@ÎË·¿2Ì?6L_4Ü·Üæ/òx~{àùþuP÷Êë¿4+p*Î9WéüCoYRŸ}"nƒìÂÂïTø³±†ï÷«ðüýÚxÃ,ãkc¥”k«H»™ÿû—úÜ—e”°×Z¦;37£BżT33:?~÷Àv˜ÿùóaùû¹,iÞ{ÄÓ¡Hu?õÅ?þ˜‹ú¡I½i™Ô²Ëe4 PasŽ wDÄ0k„;ˆ‚¡<2K DÀ}eýÚ[wˆ+P x„WxA,@=Ù´š)tžpÿ™ËO3ùä{ZÒ3Â+‰ÌžcœŒjñU¼!#½šM±Jµ^Ü[_R­xɆœãóü9š¬Ö²³X²Í}´Pd(”+™ÊLfÑMÙ(µf4äšq°Ê²sOô%I•bSìࡈ¥µ=ˆzhš¦]‘Y1F‡"ánÅØ-{)¥¸§GY{Zc–A 733§µ°ÝH¨§Ñ"{¶®&#¤èý Þ¦}Z;D˜´2j…œÓ Â$Mè„ë© ^méEÅjypRt*“ @(ke7'"[†-@ÆRÝ[@„ =–J¡K¶±Ñi(¢€&QaNô„„™hÿ'ÙV‘ƒØ®5„Ó[KÙíËÒ–È,´ÌÌ_¶D¹Ÿ“a |ÓÄ3WD» “‚Dlù*•Ð?J‹#@eíz[xˆ+óG‰B¤­EýcY’æx4p+{¯J]Û ¾ˆó dëiöŽØ’cÝòºÁ…¸ªØkFDPm85pGl\ºÜžsUÔsɧ'èKßOÙC©þÔ~ߢOe*Å ¼ÖZŠO>¹|ñE’hP„–Þ/>#í©-f”—:©y™{óâ”3˜eË%àè€mí‰ažBÝC óh†äv2õ!Cð3ÍÔ– ÚÄj%"Ö?q[Ucn_d[cSn6ÑÀê'ìeM) j™%0|åÚCm¬b2ãD/éaYŠÍó=¦,ðaL¢â齛Ш“&Q1±8?}·Û}§xZú“M£Ea{NþP°ÛÛÃ>çxxx˜ööð@Eï™–¡LÒ3ûÒØ:2Õbu'/…9·n6Õ(•°4¥¬÷¢FJ¥LL™³^K®æk Úݧ^f*ó¼ð?ZÖ¹¶÷âæF3sÿ÷ÿù?¯³BÚiçeá¼Ó\û\ÔÏñ¨>+ù‚|À™Dz'†¹ aê+#±ÛÒ»›üo®Þ†ë× €{†ŠÄ—ßÝ\!w¾âÜô¶Ÿ_m4t»ß»ðv¾©{zÍáMhPòM1öU çÝ“|Oà8—îûIþ| €cõê«_r·ü_[ËÑhwø²‘ñe§GPÔ¹?ðK–•ãç-_xê®yï…ÿêû¥ou£ÿa&Þ± “ß‚⛩PøÅÖµ·qç^þí«Å (Z^a6ücæ þö:ÿ«ÖýÏÐÏ-ïϙտ<†Ë¹ïñËž—¨çŽôG•^ç¬mœUíŸϯ{ö®£eÝ­ ²\]à΃äËÂS^! /$³›ü²ç¸ÚÏëùâ­v'fã¥"x ÏßwÙ|=Ñ·K¥W”8œ}®Žõ!zþ‘JœÃÿ¸~Åùzsº&¼>±«±ë¯Ò½a²6ãòø Û9Qºó±—þ뎟{‰œ[7zé>šüùØâ91õ‚òsBEgdÎ19[–êlœÝ_ˬƒ1±Žô£sÁ»=Ú©®ÓåRº…®ÏQ½žkŽ[Ïè8çuzŒOé^y¼ùóÏ{”ß“=öÁ½Ç+L·-™›€ò‚±2obžEDewÛ'O§óNÚ5ßúúÅsÊç½>¸‹1xö6]uö]§-ÕeÞFëfà"gpɺ¾"ºðê¸Dê¿1¹®ð¸-¸3-ç­ŒÕÂÉRëT{fë9?Î>Z1+Ä<ÏþigÄKO%Ùv‹Ò©Ž„™$µÙ-³5a»Ú²ºH@:b’-2‚åúhÓÈš^`†Ün¯ ßÑsô ê´ ¬‰X ­BÙ+lB?ÀÜke®:¼‚F¯DÓ$ÊÒ+(ÓŠ|0 ºŒé…3GÄчC›xêŒAŒqóÄLÀÌ&W›b¡¹±–LÁ:èÅw­¶âӇܔ‘¹´Þ;² P 0Y:§Ô•I ÐÝÝ 4DæÒ©áªÛãF³§eAÒä"ju™z¦EÏPDÒ¹ß;)v’ÌŽ¾¯0K/SGrcrCÉ.$8yöÌðe*#¬J£ÜRÑú2+çTkOb ÐG…û€Y™2*0b"šÔ’&[‹à祋3 tb€à‹Y Jã„UãÜ:”IÛ»y$•ÆUÀuCuö7VPD—7F! &£Wï\À’0„„d…“𵄂Ӫ•ÞRƒ•:ÍË‚HµX(™a6<§×èdžÁì0¯ÞpðÇc$’ÞAG©«¶žãÑä€Af(ލ£ÏëdN¶Ãcµùµ\³úýçÎ6 PÑrb¶Õì§#çÕìwD{(Óú‡£Ò<·Òum…ðæèã»l[©c]YÌÐêÞ”óÔ`ÙhúîÃw»ò)¢·˜ÝJæÈY¦¡B¡Ìh‘IGµ©G“l™¼js—„T®ì­5wK v{ÀЗqïXi]ÉŽpІIÞM&ûTöˤÊúÀ©MöÌÕ•,j k#,épôÃckÉR\óOùðá“?| c¿û˾Kÿ8 D &鞥öÃÜ[³JºEÌR¼TgæSæg ˜·¥ï§\áP1vÄ"cõfcLšE­¡|us;µÎ ÿ{ëÙC™½¸×Zveÿéÿù÷ÿñ¢H)sä»ÅíîœïDŽ¿ã•@¿"æ<ê8>Æ7˜Àê ;° vŒŽµlj: ÈÍxgòBÈý8¯CN½ºóÇ3ðwY.·ÁäELˆ‹¢5J¼¬.âm ൭ÿ%‡GwÉ÷ã´ËÍùíÉÞbǯü{ÒcȪg è·?Ñ'Ïiþ7ûà;AïùÞŸÒ;mo’•σö×6#çªÁ1uP¯í•WŒ…+DÆ{ÇëÆëþ”ܹ‘WÎû†/òOçÇwµ•羑+*”Ï3/t*õÙÐÿç¿?â=7•äÂàYÞËóe?7[ËäÓËPòó¤çpÞ/¢±ðâ€ÿ*õÿ ÷jw¼¾ÊZ}iÕàÅw½ #yüU$Ñs;Öû ’opÁ›ÏíªYð² yà »Nsß”}êvjßJŸwŸ\Ï=°¾B×—9aÜÕj¯Ôªó5ù½63/k)ÿ` óW;Çó³êùm~÷½ ²÷áý¹x”]¾¨±ìvüqâögèÐÝ"’òsä¿áb÷F³X¼Øð*%}Á’×·<ý«Ëæ¡z•ØÑ¥ÇÉ7Î"Þ)ù:“Ëïí±.µ3÷Ö;ï½vñÛõŠò:ãÂÇüÀK3õ .êíê<ìýÞÛpr­¸ŒÌø|Àuò›ß#ÝæQ¥;ÂÆßýoûøãOŸzlK+SÙ×jÕK1ƒ¦âýÃn_«ÔÉL(35·ì}rÿøýÇ|j?ü¿̾«eúîS.¿ kÙŸLKÝà" %kHÁ:µ¢·t»÷ÕjX óL±$|ZµÈQI 9ÌD6€+PE )XBÙÓ«nS‚Õ2QhÈÖ[° L$m”‘Ä@3˜sõA`D ‚™î;…wÈÌ@”iR ™3dµF¥ÕÉùéQÓúã"¥×šJ}*êÆÙnn@æb^Öv$‰)°ÓJ&€î‹Zôx<F2Ä’‘™t?¤’ÊkÉèéÉd!{Ž¡»órw£`nFÓ&O©÷h‡ŽLfJé¥HŠÃBÊÔØæåó¬ìS… Ø1¸tj$m’Òšj‰èÈ q+jgÐHl©"¤³÷ÜU:‘-AVw#Z‹§Èâ4µ 1GD¶^¥XFÈÔÕ8´§NRÐäS Á—“2™P’œ4•µ,O moY<§‡RK™çå𸌟ïveÚù|hKOsÛM»yžy´e¬ýØÜÆ¿xA4d ”­&+j?¹B{@ ¢†‰îŠž×ÖI0t„ÕB«?°Ù©½à»lp­ZÑ;Ü! :¨ÓÉ3cT£ kÊmh÷W¥fÃÖ¸(€¯éß ê3V¿ØÎ朙„ÑA/nÆé§ÃS-µÔ©ìžæŸŠqió~úÙ£Û†KDñbôÈlÑ Vý¡zí½-mI¢ˆ4óD3G[V4ÌÐ3¡¾¦.h`AïPÀ¦• ¦³ ‚ô>½¢#¶ÚÿÄz/Ž…xY¿b`ÇÆêtì«X·(A0‘–+âl,zãò– 2Ö¶€‘†P&°¬Ì±ñ­Ù  „l$¥`§Q6ìžÍ³x?î÷sŠbíÁkÐC ô©Fßóóç'š¬Ð–4+µºÙŽû¿øëé7:ôÞ¢š¡Ä˜ ¨É¨*¦éCÒL Ê€M°Tçsö–Ónÿ¸„-ž+STv1œN—!SR"Sî&;¯ú&V¤RÑ#cÔþ÷h=ccý×R÷ÓÃ÷ÿêßÿÇ“åªF;§NÔl£Ì¶_ßc,îVŠK(æCÝ~ü)–eŒ`x ð}ÙZ²¸)Ç€¯0#ãe+¨ª·uü¯æº£ÆWþÕú L°ƒ„rò¾ÎgÚ¦Ôoõh/®&` ï‰ð VN³fu$¶³‡¬´óMO°@}õþÍÍÖr[nD A±Ù…˜•¥„jSq3K¡)‘‹öuÿq÷ÐbɈ̈´bÁÝ9+¦=;„ ¤b¥õÅXZÓçÇ¥Å}*hí§eIÊ[³Z¼·6P=ƒ ºÂ$nåD×GºÜ‰¿ëœtuÞ"w½Ÿ]ã+Àr.º¾†¼øºË3}N~=ø¾4 ×ƒµYãµêyïß•$}é†ðî¹V¾g†ôÅæz§³9@\µÂ߯šÇŸŸÏléÔÐzö¥çn[ÆÉN÷å,¿PÊñV>ZeÎÙ{£‹†èèÊhÙ{ô–¡ö—H÷9–ÀLÒDô֨ņð Y™b±¹ÿ@evh÷PŠ£ƒ»]q–ÇÌl ‡›2Ñ—fJ({°’BÃüÔ—fº2!å}gaÈ4!3TRèdJs %&Š$¤S¤öæ(¾,ý°´½[­¥/n9‚NL¤CÀÔz1`*ÌH ÕP­õ… I¢@@Ï$]ÉÉLбB*F#ÍR&ÑIlà @äp%<œì­g¢ZY–¥-…^ìpˆh>,ð³´òÌ™ -•cdíF-n ´9|ˆÞc•}ãˆgŒ ¡?ÐÖ¸ãH8f¼kÊoû–Ñ^ƒÑ0Ì~cuÅ8¢çÁMßþÔÊé| Ìbu>eccõ6n mî˜#•½­ø Ûõ¤²KLwOëè=˜$ùiÿ=h„÷hnEFkÙ–þXlߢ·b„¶’{ß› ¾Ð™3ÑZ )×®RWV~ VîýÐáÇÜhn¨±íjçÑž7Ñ#;Ó í‰¶¹.™(eõ V•_}õì•¶~­+U-kb FS®®ÑôÍYp‚X5š†— ¶C™­›&w›Œ´É&wŸveÚ},;Ÿ&ì ¿ySþÔ(™)½q^ªEîÃvëžœêGøøoÿ3Ý ýø»K¡Jô%ìû±Ÿv¥²©T Wã…«'„« m ³‡½„>U§ç2³Ð”éÆ„ÑŒPJž*Ÿ“ ×(ñ÷1\#F¿×òWó¾ûÇ¿=Õ†¬Z››“Žtì»rVö£ó¿=Ku§†âLT>~×ñ„—:ü®Sñ§¶vþS·z7îé)poOx‹ñBà…íåUÌù2å*Up$œ\Ç–Û¶ä"¼Ð O÷êüouiÓô.ÙúÙØWºŠ¹ÞO]öŸ€¶È/ÖšðLêZ‡ÑJ–Ü‚0’Û‡ðÞ^„ÏKm^+[fuÔñ"¦ù9ÝüJ#8 ?—IzNŒÐëZI¸åJé¬:ý–=zžº%‹Þî/Îîž;òÛYs¬º½çxw)©kLÍKÚ×qwx®wñ"‘wiqbñR3nŽŸsY·Ñ}9Ø^aŒœ (¼û¾¨hMç«æFöâÙvê|¾Ÿ"é67ó^ÎøÝ{w¾|]‰†Wÿ‚q4WûÓ—·´/í땷ljsQ­xùÔºR0®¼W.ûŽ6”—Åx]æõÞdóh÷/ êοðJÖ¸¢3=÷/ó‹ž-#xñPnS•w3¿¯´4ý)Bço‚=Ÿ­áÍ#øB`“^™•_3ߘŒyáí}«ÇK̺7|Â-cü 2ýåÅýL}õyŠù¬ÌúËSoèxCêgH']Ⱦ_W ý¦Ã|A7ä›Nó^À/pÍ´¦(®X?—ˆ)½Ï_ízߎ÷ÿP×eH¯>yþ|½ÓªŸqánÝúËûÎççùý‡˜Þ·Z}}f¹Ïî^ŽOˆ«%ûýøîd§‡ÛÕêÕ‰youþšJŒó‚33¦VpË¡enÉÂqL?þýOËÓÜ#Fi5ÒÄÒ¢ FLæ^s—‡žæÇÇßþåo>üÅ÷O¿ÿýÓÿçw»OZ²«¿Oõ<ÌÁJåAX€%Sh®$˜¾›IeW$h3þÕHø¶µÝ`ÍJxÙ¨>}Õ@k‘ò(ö_8¥ÓG G`8»F‡yæ‚ð•Ed¸dôÖ?çôAd‡†HtdvèV Ò•F3щô²ƒ fË4hnÉ®nÕÊ~†žÙB0¦2‘$¼”m0›Á§ò0/OPPÖæ'ePŠˆ~xj‡9–l³RPˆDï‘ZÌKé­µE¸ëÙZLSMð0…bœgHV*iX²76š—(ˆÚsT¡wÚ’îf^¡öt€R!I^ú¼æÏéàdæ0–ž}òQžleb_J)\RRÊgn¥ÓIRX2I>¸ïjyêL7>L“C (ÕÍŒ”÷èÂ"±Zíq€àV½g !HX6÷ ŒÎ®U_CdV«¾zHt(J!‹`Ê-:ýøñ!COZiW¼ÔöØrb›ÓXŠ—6·è§í§…en­%Ì€´Z|r- ‘£T|ã~z&Qè JE_€a«{dï´Õ×zt HˆŽÔ Ê<¹_¬éL® 0püCnçÛÇÐÁa'k0®$r]W‡_îÕ âšK3@}[:µ‘ý±vð¬Uꃽ3 Ó‡‚`.…†Ôl4¤§ç܃ðyù¼Ûí÷û½³ôÞ—å)¦ÒɈ>&»mùྴl]²Qè•®fK)Ӽ̄#m5m^õáÕœÇn¡²yä‰zdŽØ’>0–Ë ÐÚ±âÈŽ†HüLJ9s®ëÏŠ²šþ0è@EqÈÀ°ÒÿÇe@ƒïVs…qU§î-:D˜%w(FsøGÛ± Ʋ+eR©VºÕí³L¹›ÊnŠYîSF2`“si…ènAa_œYvÖ["–ú/ÿC)ŽŒ9K÷Ó~7M»šO;Wæú°/>öŒ|:ôRAxRIˆ™‚¾D*¡Ìînn­Kf^*Á:P@'Ìš¥dt ÿ9Ö]ãþ#”’ô/þÅÿèÓTvõa÷á7ßŬÇJ&]UkœÅ ÷¢£óçö ¸Ú;±¿(ÐÛ*Nñîíæñ[uà†„þB´ö\õÉ»;Þ¿|ÀgðË•&l~³/!/RÚJ¾¸¥ô2.ãY“†{Wø« ¶_8†+„Ôå0x™Úóú›×¥Û¯;þËæà7É+·ZÉs€ògÏðëz»ïu¼ÉºùÜ1â·þÜÇâÕ£þ£§òO§à×óz“ÇÞ+¯n»ÿD^_lö€?tÀ—caþa@ç¿Ehð§ùúE/ΙÕñGe“ÔÞŠåþXýW×´cÉÄWä7¾z5úºu÷¬ñá åÜWù‹.ëzKBæmãø˜µ;Ë\å2¾þ«ÞyûøŽëp‘Oø-VÁ1©Kó×+ò·$¿½¤Ë]ïkò<®sòÇ"ˆËÝÈ:p¹2Gûò¦o3 ‡Æ•rnÆÂ©­I@ÇÅùñ÷?=}þÜ[OI¦ÝT¬8J©LSNæËÒƒØgd5¶?Ûa>ô°ï?>þýáwÿý§öéãîÓÃò÷ÿ5s)|ê>Ó»Õ)`tHæ²’C–e,Áìá~Ú)d‡„RVÅèbÃæÔ|˜ßBe£uk OÖôÀàœ /ÍwN”Š¡uD€­ ¼¢TiðÖK¶C(—Z=Þ \kÓRˆ^kÆ00(§]XÌ3ÍP™µw8  èbB «®Y¦L÷RiÈPÀ*—¥Í‡ŒF`þü”ꑽC‘‡ÞfÍXf˜cú¸’Ám)­ô-¤ÑÈAìi2zôû©š™óSÚž!"c1œôâ½=ZuwFïtÆSÏx*Ö qèÌ–OOꊙHêٌ݇m/(½GöUÖ¦Ð×Bj•d…“‰yüˆpBÀ’zZšRLfT3±`çƒyÂeéµZª±›Ya‹.¦;¹º{ÂÁÒNæ„öaÕ@Xœ}`Sr4hiPø-é §FC 5JÚç§C¤„$2V¯ËcSOFb5‘°Þ映0ÇB`ÚÕ욦º´NYŒÈ"û¨Ä„+”mÙ5D_»XVÉhSð‡@©ð äj=.o !~ýGÆký[̘Y$Ê~k¬±•c3ÞPv0XÇNÌÜÌÖ–‚D-[Ê¡¸[ÚÊޑȾ¹r•Îǽx(åÌLŸúብì¾ûôOŸ õaïn½/OóÁX™Ábf*n]Ì4Òœ,u×z+VÁT˜[8̳݌FKÊÖÐËY+0š0F|ê±]½ì`ê˜Gc„@¬Eú£oc’Úz•lÍ)•æ¢×ïÔ'((›£Àj˜ÌuAY)…äóKB$P`BqNS9dÙ$cš—ªÒ¢Tó‡©hçÅKµ ÷Ýwù›‡˜c‡¢‚Ú‘ôþi‚ƒ/Û•ŽñðÏÿ–®iz<,åûì­Ù®mi}ÊäÕ¹”âÓÇ}A&¥õ£vS*EŠ>  ŒE>ØJ)02i&eD"ÒŒîî6DîŒóhÝ-Î^™?£ðÿˆûWdJÿòŸÿ+ÛMõaW÷ûñ›¡›_^÷ıö|Â-±üªËÏóÛ’÷ÖȼCVt‡ùÂ3MùKùß²?ÿ2aåË?áqÛmÕý7ÑJÞã+ð®pø<Ót Þñù|©éÅs"ñN‚Óœ» ¸#î–îïùÎM‰/Óüù¼ nk_¾šÏƒÎ˜¯0£¾þLn/ìÅ z¹Vú‹‡ëèUºì@úãSÙNXÞ×ú?¾¡(ÿ³)lßœvò+UùÿdôÜ/a¿ÿ:ÿ«Zvž[9ß[¿~_¸•·NWŸffwW§wå>ïþXמëÿ xy1^I:_tð…û²¼–\µÁ3†ç½˜þXçrüˆã ÑÕƒî™0ëØŸxÖ¥²Õ¼~²ž_.^hö·5¾Ûq¬þ·Ä‹OýøÎU³ñØoêè,Ä•o>ºõO=¹¼ ë¹.¹=çü^ œp9¸<®#|ë­=1V“FèâCpá]jÿ:·žbÍÛÑŒ›Šó¨Š7Déîuàù`;MϱÏ{7¥U›­ÀÕ7¼Ãúž——åŒÓ$Šgö€Üc Ô.xuA/:sŸºïmy5/:+yIIâtÄsëéùíØ¸[z-!Æ· Mo-ŸÝ6ßþâìooŸ‘äÕ>ŽÏ/îWñ¸Ã¼ÓwÖô&bÛo ä¢ Ž ôÃï~€TJ‰¡·¹›Š™·¹E[žž„Þh$”™Ë¡rú°o‡ÃòøÐþÃîðÃçøýçþø”ý |×ÜäÌ€eˆ´,iò é£ý2ÑW;_÷µZy-ÍæZ;#1|PEx…„ð 3ô޶À޵c`™×!IJ Nƒ¤ Û0ó\–lM^л´À E’(† 2VSr7’Sv&3ÌrÚdÜ—jáæ•¹‚AŠ"3ƒ!˜©KILëÚ”Ñ2#ÉÌÃ% õ~8Ì}9Œk¡ŒìjOj3>ü¶þ³ÿá·‡§ÏO?<ÅAÕ‰IŠ v‘}i¤¬X¶„Üà&=~îµVƒ™’…Òð…–ôsïOO &¶ž±@TˆóŒâ*@o`€ E²K„2C0#{&Á‘âÒZ¦Ô I‹(T`¦ºØÀ’êÒw“?Õ¥÷@Vs³t"³È"£·ÈÌÒ!‰wPp¡¥ZŠ$–¿—”Á f¬Ä„j%€EäXüA¤D“‚‰1 öû‚bÜÕšM}ÉÌ<úð••2¤xØï•Ù[#Ìh–ÀœÍrÜÙÜŠñënîGQ¹ £=‚~-"·“lMC,§§û˜«Êm°ºÖžG[ÓÃF{d‹f|òº)áu˜3¯é‡Õ¥öøÃV>pùŽäJ‚Àlƒ\Ï ·5c1¶pàéócJuÏñ¤ÜõÃ3!¸¬úäVÚ™28S„2Â$¨(Uvµ=Í4Sæä{ Ÿúì^ÍÔ¼Ì ˜“F+&t!KϾžÂæa0ÚlÐù±¦@2¡\ó7"üúŒå€ D€Zµ~=Ú:ŠF#ņ,µü†µÌÿh¡¼ö0(¸#„èÇ¢”u)Cž*‚3€XVó :T‹vnûœ:™ ½¸ÊîÁ§©zÛ|Ú{·h¥~ÜíÑ—¨u÷›gÚ~²}ÑÜõ°ó¥×c)Ñ{y˜8æ¹’{fûî·ŸŠ1"LÒåF¹‚úŒ4ÖªúáID/±Ô¢RQ¬…²3iiuäå2‡Û.û°Þ†F¢y— MB‹(v ²ËÌÈŒŒÖ£EžáþÿÕ¿þëú°Ÿ><|ü‹ïqÝù·A{òÄô<Á ®¿ÄE¤ó¬Pv#]nP„ dŒÎ7:ûþ_FžgVô¼®Š<ßKGº¡¬Ü`ÏÕÌ+dÁmôÆ çýä2 ;Eògôlû£»%vŠã o{ç¯èx¥tš×!øIt:sÝn.£Í«Àû ¡ó†Šs Ð1Þ+É|{Ö=¼Â\ñ"f䈨°Úó,Ä•Vx{w^­ Ô±»áž:pÇåÙ=\‡ÃF÷®‹©ŽÀ§oU u‹Úp¬÷wF·#öåˆó+vÝ+ƒí'— ÒÀm3ò%ýõxïx;â¹u–w«¼áPÛÍ/¦és÷ílö\MÁ6’¼ä÷ö7×Û³uìàˆ"ÞL”FKÛJ–ž«>SÞ’e¼Ve¾@(¿…½*L_·hB_ vß:QßEý¼šÛ;gÙ]¦$ñÆ=òYæ7«æýSx |yœëÞþî`{)ô®}úk øuæòb[Ì×OóéóÛšÅ{÷è…ªJ]O°#Š?=èÿî‡Èôj0xet™2æt”þÔÒ3g‰ “$õÊRûa‰l!#kš!)Ëd,È…‹ØÑETH@?™W¸•*ÄÒç–«©À(¦db[Ü–ž@J4š‡-œá45˜™ÓÀX”èâd#¿ÃYù@°Ø‡Rz.yuf*âpXJ)¥uS¢5I-WÉ~Àmz®›Í.Ð7½ØS½Á ÜH &"‡.2²:äÀÐÖSM­ ]êC+ ¬Ñ¾ÿþSÊO?=Âlšê§Oûy^ÚÒÚîîNõPdF*…”ÓçCôH¦­ +€XWgî#0lÎÀ±!°V 64?O«1,±Y˰¹f¬ ªÃ}Õ—Iäö$öÂC&†ì«¦?Þ 0d‡ÜÖ"zꔊì²#ÛÚ|Àí©626ˆ: æCËL>LHÔZÌjïaFs{:"³/$YÔ"2><|`iz]…B!FFô–TqNµÔÞFÒ»]퉈àV[ëfm…öÃÈḹÍùP X,¨Ãm­ë7®ëõ´‘E.¾X“LH„Vÿ…øê+`®M…H"bt„ºÌ„‰Sñ¤þÿìýÛ–$I²ˆmQ5sȬê>ݘó0 Ã'‹¿ÂÅŸä¿ð‹äˆáhtWe„»™ªÈ惪¹›_Ã#2³ºº»üô:™éán¦¦‘-[ö„;Û7&…P,Ô<%Ì6šJ²œÒ¨Ù> YÓ(¦ÉìÓÖræú<š¨M^kìÇ<Ö²:"ÏO"³æT­Ìû9U"\K­¯ûôi+Ól¯süñ Û!g©ÁòŠd*‚Qó$)ûÊ4³‚ô¤ ×"EkD©žÌr2©µÉ„°®ÑmG0^ÝKñâ^+ÿwÿ㿵͸y~úüÇßãà°sç£sq®Ñs? }3Z¹Í_ áä2;û{Ywò^fÛÄ©·ÚÊÆIÞ§Î|öÎ3-—‡t$ú„¿*IùhÀm²á™ZλHv·ö3ŸÈ™”öÄÌSnÐ:.åâwh–PÉ›S+뱋XôðóÝöúK ïg}’Wí‡e•y?¢W´ §‡CÀ÷èx—-ÄÙ~íº ï-Xƪ 8Ó6¾ØSnû™á¢à'|-| Q[¯§Ûƒv¥à!EøsvÛÔÏÅàÚI|*½œ¾Þ„G·~úü†¯uÀå·<ðPxxâU úÚgrµ}=´Ü€éß·Š/ƒ¯ä°øY½¹î¨íŸùâ¬üU¶Á7‘ÿ~Eçykžbx"øM,èz¥ß†àû¡z7 ãG "~‘×Ñ{ð, •_vÀù‘Ëþíõ½çÙ¯¡ÝìüÔY¥û|Ï„ùæËVDTDE|‰*Â=ØñÁËŸ~úËŸþ‚XÜ.H Ñ,TÕRJ!D€lfjY€:½üåË´›}W¦Ÿ^ìó0M»ùµÔ/žvSb¿›’–Íf'Vš”p×pÌ;U M.ÆðƒÙö‘äØ]K›ìFš ÿâî_Ÿ†îlivl>/ÒÞqaËØ|‚˜‘·À „Ð ÂÑ0bí*â•PzÐRG§¢&P¡“­V¤yaQ:E °ˆ€ "¢zŸÂáó¬ÉèáÕÝTLÍrö}q8¢j+¸GL # k)uÚ1"AêRä²î_^_¾|ÉO£R¦É¢Ö`EªpFñ J2ãX¥0¥Ðà1¹xÔ¦ó­ À'D g„¨Â"óŽÅCDhƵ BDb.Jz%’”œ“ˆ°ÖÖ¡``NÉ ²¦=«@ös0ØÀحЈy)× *pTQ¤d^}ï1(6¦¡ „(\Bpj[i‰Ñ š ɰ†ë;J€¤% 6Í¢7€D?¨N9R#«Qô8Z‚D=–Ÿ°¤û©ÌÕÓ¶Ï£B½ú¼wUËY7›aÚOôÂ<Œ¥øn7ƒHÙŒ–“Õ¨\TÎ(Òˆæ@@|)€–@YŒyf2¸ƒìv!ǺrÃåUºÀ!ç³=.¥Õt꫞>ö[“¤:@Ú•Ôκå@@¡@íø¸,G„½i½Çrñt$U¸O» °§ív¯0³âûPQdw¨P!Rµê ŽBA¸°JM¡šé±Ÿçaç>C¼Ö2 OQ\T¨ U®Î0dJÊ ±ÞÁàÞïw.`@’ALz1 Î w[  i)˜¤ý¥ƒdC’¢{‡¦æà˜ æ^#ñÅØÜItLÙÑt¾"œ9ÛÓQÅ:=©ôÉ)ꪑ¤i›6cJ1ä!å§”EÕ>o- Û ÇÁ°Ÿ·ó1³Éĸç6{ŽÍÀOÖ°M 2ÏõyÒ±,gH¡»L<(’æªÔò4„SE˜BRU¸{2a ›ça£÷¶³ÍL€ZEw'A63ùŽŠéAt;â$½ˆ`ü™k-•ÕIþË¿ü‡¼‡Í¦ÿå²ÇôÿðÄ$u¥šù«Žë¯Áë>€•ÊŠ|Û.þoþß2<è~~;½ŽÄÿˆ ÝQ^묖´Y>­Yç;Ý@÷ëE¢þ6ë1^ÿ&³«‡$€~ÙßoxÝo¯@ðã;èSýb×ü \ð1MqíÛçÞ5ɇwÈ1Ýê–¸zlá­ÏãîMßä|I1Ι§Ý‹çÁ›¨ëÕ2åU’ò%ü@D¸ì—;ÈÉÈú‹–¼á,Ê;pxšV+×4<äÒSl%‹„“f‡³Û¾lˆ9ôLž5R¬J_¼N6¸è\=9\y–=Ýq‚=P“´zé9•àšJÓÁUUN)GÅÖš>Ëo¯2žKªþòÕ<örã‚Ûp¶S| `=_-oy/_´]8éW8÷ÈàÉ•“Is2µO»áÞVŒYo 7ú˜ H-óú=k¥¡óÇ+ËúTá‹d[‰ GŠàý§sÝ5÷¢þ—JºxÈŒ{M˻ӃyÒ:ºÚ¡e邾{dÊzk!¯îÔ¹\6ô‘ª4ꮑÌ&È"òåO?Ï»é§?ÿ¼}ÅŒ‚´ÙôÞmJJFb¿{Í) 9³ì¹+uÜŒ§q,»yúùuHÆ!1þ¢VÕ\ðšÒ~û„(æ{WuUæáâET¥4®ftR?Y’ÆŽjüM³…ÍNy† ˆ"å•6Ö'š¹€§ êºX¤f˜!†-(ˆi\a‡&¶&*óŽPŒÏ¡‰"jYEe•H"Òd‡DU(2× BhIj™lÜšåp¯S˜H¦¤¨ÈTQ½Fø\ÀP zÔZ»Z%Ý=J§¶qUg;ä* QÄÞ-éðôÔõ[L|®îª),ÜC5¨ØïdJ„'QÝ¿:J($&:8°«–WøN `£{{Uiº7’à¡ÅáÆ$ÌÌ.B' žºØN¡PsÊÃl&•RœîM$šÊˆƒ„$‘ šðÇ$YAF©‚È&ãt´RJ5GH“»h#ù6œEø¾Ù 7ûÙ6I¤©KÃÞúJ3x4q’FŸ§vArz7¦†4ï\•d¢’LŸv5™©éÓ8$ AnÇÌ!¥”ju9™»{©Q èþ@)ЄðN-o³Q”mwÀ­å%AS/]ˆ!i¯-+{ÙÞJhM]IQ;=e(Q L—vƒüº@²t…œ>šúôk¶Í¥£' MèÐØdp¼WæÚW" j9MS%CEvÓ®ø<Û<$)yÌ£{,ív¯&îªi.`áxm%É$Á%*Ü™²FWqqÏ‘“%÷Å›t’{ôs'Ðút@¼*â‚ÌÛ®Þå(tèI*•t(@³¾ƒÅñØBˆ„¾Nü¦„ôJ Ž¡™ÔvºuÎhÒ˜Ò1Xøó4KÈ<‰›œƒ±sUM“Ù6嬹 *›A·ãF² yHÉ2$yÞ¦—н›ÑˆéËTÇ4P*…ÁúeÏMNfüÓ—˜*³r$k•¢ÿ¥Ö¹x©Qƒà¿ýŸþm7ã¶ÉýË•Xjå%8ˆ£W±®<Š1ÝÓX¸—³œSÎÎ;8ƒWR¸3陣² Ž´q\é}|„»zIV8³ÿ½EÖ“‹×ý¯¸v:n‰ª“gÀøUiÖ7Ýÿ®úå>˜]sƵ)8‘m‘uä¿–†½­p`òbé–?NcÖpJÿ¿õàpÖÑ~Mü÷L-êTÎö˜i]êõ/b¥{yô—Àøá®#ý3Ìå¬î€œ´®j˜ÈÅdxÄRøMÝüK¡’; 0—z ·º´±ŽüWüM ìòQ'J´—}7¤'âK×§÷Z#ëê8ÜW@zo/õ*ë‘“V§£Î×zÆÈ è°kão›åj»Ï[3Ẹǭ€ÇݪïIŸ]ÿ¯¬ÈÊ5!Ùûiïé÷¡W©ïºé#WÇóÖ9r&ƒó8Aîj›ÚÙ|~ó¼%pÔoB'‡Ëœ÷ºzi!~Ëtçz¨A^u < £ßà•Šœï ÿ8¢ó§—Óp9ìŽÛ‘4nÔ2œ—=xgøcmï­…¼µ_„‘7Ðe û{û™ßº’´5Á›7µÆyÏ+÷ûÒA ‡~jOp£Íîú¶t@¿]ÉôYŽyÎaÊea‡à‰«€·£‘Û =?„¢÷ö†WïÖèx_4è2Ü<û^ÛÒÖóöšŹ Þ*ª–ÞæÉÿΪUrZ±â"}Qn¸,lÉ­©u-¦¿]ª=^¯äûæãíí—¢rW÷Ù?åôËÊuðv²Ú±ï³ÃìrU=¸“¯ÚÎADÇ>(dÓÿFA“—?ÿ<ïö^ª™¶~4f'I¦œ}ž_w{ME#À:¿ßíŸ~5›_v2 –M‡ôú: _þ’“)9±ìÜB3sáSSœwQ$0¼1Ê›Q ×Õ®µÝÀV6À¯¬ÌD'™G „ìÜí¨@Â<#¢kÁ Pg”"µB…ˆfv*î2I$BUX…Ao1@ ˜IˆlE2ä%8Ï ‚ªL„0q5T§©Ìµ†v‡œ¤_`±Æëïèmt¼¾!ì"H½FÑ‘Ü ¨1¡l¡rÑêÚ5«*¨& ¢–fœ>mFÌÅÇq0ŒiÌ’NûyÚÍÉÌg' æÉs²êPhÚDX¤ùÛ&±êPm[AtؽÍí¶?D,ig¢CÛï¶û•^Oo^´MIiÛm±%E8aXÛl†%DAÔz ¢ÒQq«ÛqsY°Ý¹_yCÌ]¨íd½¥@ áû D2Ûlžš«ÅëË—iz5•¬ª¢UÊG¡ª^½z¥ÃÌ‚Q¦©Ô*‚ ·:Ü œS-)«%Í‘¦²‹(šT4èhý.¢`s! DsII9¥D–9½€¤„:Üpïs,ºU‰HË-Ì#ÐLÖ»¹¹©“uéRJ"ãBPªïç:§àÓ8&ÓMÖ¬IT’Ú'¦¨;q‘”T5 ãf6C6Kã0rÈù÷Ï¢ÿíU‡Å凭}Ú<Í• ‹cÌófH¿Ë6æêBçZ¶#L‹»|ÓÓÈ¿¼Î"®I79%™Ìn¢iÈIQ›«i4ÜÛ¡¬Ð]ˆÁÄ5Ó¹z¥&@TÝ#ª‡À!©{˜ HUqgõ0P’ª6Eº5ÆÐÐÿ¹ÔRë\¢†þÍÿô>ÿñw"MHºc™K}v%–σsÐÁýêvxvrÚÊí`W¤ yïð}o…°ñJF’]Z rù‹÷ãœûÀofû߆ö`Fº ˜ÏE*ï"ks·y$tSˆA¹È©ú O%þÏuðWÁ¼à!¾â±áù~¸+oá%—(Þ97o0K¸”îˆJßæ_ÄÒ—dx‰üÞ@®KI¼g\¤A§ÅÇ7­§ù®Uu) tƒtO]äœ%ÈG³ê€@Tâ|õ—™æC¹ï”xLý¸¾¬oØœq!½ÅœýÅZC®–—äÔjãM W¤¢åÆÆóUwöæÑs£êvâ›òÍ¿÷o“ûgæ- ûáBÔ;¾ûÆfË»{õ?¨èüµ»8Ÿá§Â}·N[üj_(}L$ü»¾~“úíõýúÞ•·ß^¿àüqM§Êz §æwT!Mø?¤ˆ¼üé粟¢ú_~ú’†*%ÜËl9å!¥Æ´v1;\i5ÆM Zì&Sr‰Í§íîçi~åö÷&ƒ&¾^P'†ûœ|Uzó9¤XC*‹¨õ8_AÔÒ‡º¹Kê"µb iQ)i(Þ Wˆu¢´bYj¡%@Dµ²• :w>!&…Ú0pdÞ‹ˆ–Œ0ÍúôY N/”yOŠ#ÔÔ¬ñ¨ID¨ ^g¨0"T@@X‚Í1µO&A$™¯î_¢ñÔž"šA¢A¾” {1 ð ¢ÓÛ½40œIa"²‘Ù‰J"šì;›V~ $|e·GXÒÍvÆ~š{õ'p±SGûòón€Z’Ý~7ï‹Z³ÍçTf÷Ù-icšË°±M–y&›ÒI SˆÀ›ylíšû!£Ïcçïk+H/0ÀV0ó®ÔUf5 ©» ˜5¤¶×ÀÞ.ã€-öׯ@Hg÷÷-«­Ê…çÀV–S¡õ_ ‡Â!³>òMcÇò’ß[/´VeˆÀ=Â#¥lƒé¤c‚•DJFÐ’yT@ÄÝÔÌ4BT,Yv¯ CîðZb3LûùõË”*­®á5`íǬ{ƒð„jΪÂyWÃ!šgoë*½@B  -EéI¨0xë1j>+*¯i/#UÀÔôx< œœŠ‹Š™ Yq|0 6éš4‡pXÒãçqG›²ÈfHÛM<AKã ›”,§â±ôÓ&jHq×Íàs¯cJYeóy+¦þ2 ø¤ÉhŠÏû¼E9ÇÏYÅrVÒþü* ‡œgÎñ»O…0’QÑú;¥¸Gë‹aõQ´Š¤(ᕦ¢ª‘Ô–ž7 Ò(º¾Õˆ¤ Ñ]}.u®µ”¨þ/ÿúߦí8þðüé¿ÃIÒ·°ˆ/iTÝõTŠûo;–üeÚÛµïoÿ¯hJvïÃ[?˜ÀwÝÀ¿å\æ!Q‘vÄ7úêo‰Ïo¯ß^¿½þZ[î;Ðóß^óÓƒñu›Ñ-G{é¢Û¢š«näï>Á¿ö"š pctKË^W7z¡Œ(7Á³{Üÿ¯ö³øO¾K0(g^WGÇÛ“þGˆàÒjéøÿ#rX‘ƒÎ µXò…‹z]çx_atŸ´clÆÎG<=’›Ooý¸ÈÄΛ{Gë·`eÎÎûO‘Ú[Ï–ße¥ýâ¯g W;N}€¯Pq„µóõ´Ù⼩GN;ÞëèuÙñtÞ|Ú>•¸bÝ$§Škg’§§)ΙÊÖÉ·}å`üÜ¥¥ºè—9S–’ âÛÙ€?Ri—“Vò“‡uµž¼îtÆi7â­úÈ!Z<ûΆîr*6vûÔ5åeÝõß‘Ç<¸Ú–‘îa:¼þåçi7…W†!„jj¦îNwD*,ûy’j„Õ ÀRÖͦ7)î†dÙær–?、9^šèØn>srp§Æq`5Ò‰Àbl¼ãº¨@4…ñ>7 ÍG©H†±Av6Ú½IçbØþ0Dp~-Ý' ­©¥`þYX˜20"jÍAÓ Ó¨!P}w¶ªYt0¥§1©%xZY܆QUÝ £ˆº§Š„©´O˜¼lh3ˆä^Dé^@á,ËÃd”¹‘g5‘z}-óÅ™ %@u‘³<¤a Y)…ÒÃT<"–"œê’æRga±¬™™ð¨D£YâN’DÌ" ÀÅ j`n FBd16ýiÕ §æ¶DÙ4"ðJ–ª*6¤6‘§ ¤>Yr ''w‡¤ê„GvFD VATĺ॓°[•'µyr/Á jtÖ¼ƒ :O €U–†ŠC¿ ÎÑùòt„‚@vP.Æ[׈0Ø öå¬ÃóvTÁ®Ö@XÒ§§aÈÉ’ì^jJ)‚›í²–¹ª`Ü$m(; &iHe®Ã`š’¹;ƒÍžW“ExëTЦö£½Ó%T$¬kéˆvÜù©[Fx…4÷>?oÚ¶èö(ÐX¤oxAJ}g•öPGWBé½APƒ&D ÌPií2@ *Ä{Ä!­´¶\˜,u…X,I @–‘–ƒˆîö¯fÈÇ<äý®¶§æÕÝ]„CTÔ£ÎóÌ`8UêbÂÙ«W³l–À€Q#ÔÁ²/á®&s"$$e‹ˆfà]4‰“‚îáÊ®õDï^ÐôÅ’¤±ø…L0¢:D`ËÌß…62‚œ{U¦m À—‚ÊA")š<‘i20$+î˜ÈÓ0´I˜sú4&VƜƄ§Á>míy”WOffSày´þAMdfe*˜JÞl«T~™gù²ýý³¶2 ¢¡›ÎºŸu3Ⱦ‘Œ?<¥©X 3††Ò™JК @­. æ$¨ 0•’R¶*[×ðˆŠæ”º#6Œdš“I¯õ€úîáÑ•æîÿò/ÿ6o6ãç§Oü=׺‚«Ô€XiÊùq‡ÛŒƒ~¥¼#t¼Ô¥‘“…ïŠÌ. žëãªÿê»Ü\ïK|œuÜÊH¤|ó¡/ø}xE—–õßñ]Ïè–:ÄenA®3m9UÕàcðýáƒNûNuŽäVNÁ7œ$[hz?Ü?ý赃ô»Üét}{àzš;ò #â-r¥âÄûðì¹VDºøåû¨Åá´u=NŒÕ×­—á×bpo É»ö ¯¨$Ý*ä\ì‹>ïáp_-‰¥ ‘WSùuš¶¾Þ“GÙ÷^^´L_Ù ®úv®D®§š‹ÿ|=û®Irõ“o)PݧQ#±x~o¸ù¾ÄÂEï{× ÿþ5¸ßìÇ<Õo¾—‡×U ¦S<÷¬=æúÔúÇ¿=Ò§º‚7¶”%ú ϳýçýº³àRÄâRšâòqÜE|Ðüüªm‘,“O 5¯¾ÆELGÁrUï­éÃýðnEâŽö‹¬SÇ—¹\S3¹‰°±œE°ÿѵ¾–_»yä÷ÓìTëNž¸€µ§"Ëó9¨\)ñàAñ3µÓ ¹‘õ\W£_øWÇû<`Å×PÚ”ÒêC‘¤”2;a,DTDcpëRo2îÑ%õ­)ìϤH˜.u‚€,Z·]X_/¯´÷£zÆáãÆH¾îv›ÍPk …îafÛ§ATëÓä¦R‹'á–*bšsÚ½º¥Eó‡G¯{hg:$÷½Ϡ¶ƒùÔ1}QPú‘ÚÕ±ˆº_>vùdi½2"`íÖô^ ,opÔ ’¬H UF´¸€õ¥ ‡¨½ µ,€")¨¡Ný¦Â!bãv1‰h™}÷òBw³ä¾ßëÓ³ 1ïËf3$Mó~š`š,±M’Y‘6éuÿ"Õ&â Wh@D,¢@¡‚,6GIYªHLRhyŠñ¦£Õ[Fj DZnÐÚD™¼wÀfË °„Z‘ÓÑÙ£[ww“¥È˶dé®àD ›ÕˆðxÎ)'-N§ ƒÚ&¥”rJ±1Œö´ÝÈ&ÙfHO›Y}N¶t;`“8$Dpš#HÎ:nʧœ‡, _§ºÉ³3åϯ;Áøi;ïæ¡žŸöPSê×½ÌUÆ‘Ÿ¶!@Pw3ÍÈ( âÐR¡C¨@dO%†šWkY$™yÄ¢:I5S‘êA” šî¿Šx°x(M§>ƒááµz©>W¯ÿÃÿø?¥q3~~þüÇßÓ_òjo”s"ÏaÍËŒýÀ?8ÊO^ M®FG’Â]&Ô ÇçjBqš¿]­µÚïgDƒg0ÓÙ7^þpGRÿŽð},û€1Êb«v¸÷sS²ÇÀ‹;!o»‚]Þã9̉•ú (åR?êÀ|Zbu®,®KÞ®ÅÖÓd-H½Öô—•èõ<ˆ7‰Jkÿ H?6®¬ VzGkùìÕgòÔ§×T­®U#Öô´3¸ëT…é–šÍ2Ú¸mÕvÝc ¾|Œ]tk(¡þ2vW¡Ã~Ç«^®9~¯z,g<.”váǰ$éWõáÖ3šå²•÷zÏiV|ZN8«¬×øñÚ€+÷µËß•;ß×O{äÓÞè8{Ûõ ¼íWƒ§çÿ*òÈûùŽEqÉ+l½3¬ãÖ~~µÎ}_ðêÁa¹(ß¾]Y¿z€^>¬KªcÅò,ÌxC|wŒ ¬@ÜÚÍ¢ó×j'¸\ÜëõÊ ö:|v¨ÞuøÀ-a÷ïq¿x«àòÝ÷ú^¿IýµÊÅ~Ž7È4ßç:øàû䈹žqÇÿ^¼¬|›áÿ‡è»ô\hç_¥!îÃÁÖ»X!Ñ$ã¿õ= … 0‚ý——†þC`9—©dÑ$3ÍéÉ£ÎûÉTS¢‘4ÉcN†4d‡q¬Ðú:©YÞ :ÿÅþ8š¹Úôú—×q4%bÞG U„2<à3,1'P{L_bÇL¹KfK@i Ì{ä¶8¼B:@µaƒˆ¨eï„h3&M¢ŠT'u‹4Ø&©šs)ñúS>¡¦"Šº×áÉòˆ²3µ,¤Šx¸ÕÏ»:l5ISªuŽ©°©Å'P¬¡$}ŠDD‰"!¬ ×p?ËÔ„D”ðî€x”Z£xñ2£¶;MH©Á©)[ÉFQ…P@%AºƒÑÊñ€>©åéËÌ9´Ù¨”Î_–Š€"5U¥ˆCÁð‹”¨M ‰$j hH€qJÙ×Р*‘²Î"8—DÎVD\e Z Mº¯QçØuçi˜ ‘ Z˜d!iZ"‹¸²vU  ]%Wþït,]E`,Â8èH·V¨÷"“;œì<ôVôcÉi‚ Ú -hn>ÏûˆØlÒ˜uïS­³ûLV =ªˆiH)y¡ª–Òáeª¢ÎyžÇaLCN)'3ð›^“å¨%UaˆæôERúòg'¢jj¶qγ×þÄ# ñæÑÍ“½õ4µ¥X9+(”Çʽ·+µV€hòSÍ@BÑtˆb)í8:÷?wÚƒ ÉD¤¸Y}0KjIÓ ²O¡IÇM–1¥1‡©~d°ÆCŠm L›ì“sLÓ®¤]Mc*/³©Éó&beþɪY×0}\kk;sé9‘ó‘j…8L{WÝÎÊ'Íg È'@çǵOí‘ô"xÃèü8*-»æŠìÿõ;ìýd·×Ï-‹û>^ øM «•4[‰Ò|lN:®©át2<ÏÉêäO«Á[çc¼óøßØæV±¶¼•™­žØù_÷Ö‹ÍáVIö‘vC´>Ø!ª*N•€Ž¹8òÖà^ÜÒ"4Õ»Û|®áP“ý÷?ÿ„lÍéRE”QÉF’4{> Ü4Þ ™E“yñZjÙ•±É@y©ûš¢n’šéü Ù‹…Â…”B²ú¸K(ŽR;l£#š€Ç\ DÊýâÕàÑ]|u„mÀ@aTQfLE‘3# 54\‚ C“î¿@÷²ùœÓ“”ÉZ÷±ñ©še/bó¼)EYKˆ" ûL{æQ†!©ÆôâfaDñéu&S2Ýl«0Âf)ÙÒÐÀ˜‘Ò4UYlÖ"ªÖžA”/¤¢ì§¨¥–˜&–͇¶HîríP±!©D¸Ð!ÐZ="T”tm¦ÄS¡>Ïó~/–:<ÀêR4ÒÔæM!”Ô|qqÞZÌä½{·5/S‚ f Q³Dõ!nÙæˆ(u0U ^碀š¢ºWFÀ¨I Q’’6ùBIµÃEšÝ1’ ìiÊ.Ïâ H€vYêàÖHñ~8V„BDÀ`×½ ! €2oÍ­A iPUDDÉôÓ§1'}§ÊxÊ"M¤ÜÛ=x…¤¨µÎ¥˜&+^)¶9'«óLu6dÑ6mwXBWÂÂ_Àýƒ±ioü[ 3 +C7éõÒãf¡—€pQ"´Ëà M°œöl ?ûØö @mÒZ© vƒ àÚ횀 ¼¹Ý´ eÔÒ¯ÁÝUà¥iÆ”óPkÆq¿{¥1›AHF)³¥T‹ƒ:O¥iãì÷/Bƒkÿ2ïæR¶ÛŒ çî…)ðZB ¦1×’G*Å÷!À›ÊP¹ÿÚo¤;TKûQkˆ®à/KsIëŸèÇ ˆu#„2#¢ ôo€‰@¥©á„Çv~ÜŒYm7Ï_öû’“¥íhCQ¦A?ڌۡˆèÓøô4lDb“™§RTÆçqÆlI§V]’üq®¥Ê&ÏcycÞÛf`­¯•âÔí Sùò2?Úêï>"ÙHÊóª,*týËŽ›ä›± 3=|Ìâ‚<Í5Y¤ 1÷ f)Ø]Ý UM¦A”ZEDaÁPÓÔ”àLXk˜B‰.ûSk÷Rÿð»?2™Ã¸ÝŽÏÛçßÿ¸Gäà ¹–@91÷Žxž6r’<’߆‡¿ ½»êôˆéµÉÔ4eòÓžÀ4ƒ¾™Òÿ’ˆŒ,¤—÷ry¯ÔÀå›ÏÈþ¿{ŒyH»V2–¼öQ7yy¢}ú‘Dtu1+ yNSüzÅÚÕ°'²È•êHûoÛ×Wu¡[{…»bøìu®ÅÛ²2¹¿°¼”÷Ý×»×âw-œvÝÄ@×M,om9·€ˆ·Ñük}òòfìVà‚uúóµÎuµÎSü³ÌF ~¥êÑ•”3;âëí踢ƒûAÜöqŽÿã_ô5š?×~V|Ã]¦üå%­fÚÛÿgãðˆèʃã¶@nâªßl= ŸèÍÌrÜüåÌ û›Yaÿ½‰Îórò\¹Ó‹çx½!ºL7r©Ý}}¨Þ\—ã¶~ _I<]K\¼w®ÊÃûÅ:z=¨;¦ûøäì?yDöö2¹ÒP&÷Ç˳+á òzNp K»þÄAy‡JÃÃ>*g°#q ˜ÿ“èî(¡sìKZÞÕT4–» ¶ac/ t»G~¸Rñú_O0OâTìæäÓºÊÓAu¨ÇõG™¾-ÊÊïHm’órݹ®ÎùdÁi(²n |7î¹¢N®âDéð!wäJ/v¦7§Òú½‡)|–’Í>W›Xok½Ý’ÊâHÿN‡õ1v—·ê²Zé+.e-óË‹€¬¥±Þ8øûSà™60Ï]žŒÖZÄôVy5ÞlêäÚ=àÚ¿®Ç1Ø­€ï¿Õ0~ìÄf_í×+¦<t!¼×?¿ÔRHŠÙŸÿ¯ÿ—Íÿñÿ`“OË6ÏQvs̆ìTÅs8€¤ÖòåO¯ón¶œÒ—ÿ*iÞù2ïªÙ¦V—/2ïµzÀ‚ê®$ÕÁ2 ìHj  ›á‹”„²ëTe¢ š—‚ä„R0 "&óWîö:l¤Î·æ1 ѼQ_~âÓïŒÐRPh6zuz„PÔ"Qé@kEsjµfÚ99Ô5ùô\…dx§ZçÚâ+“ã¯ÛX“Þµôq¥àù%ï›ÇCb½¿s9¼«æô¬:YY]ûªà écñ·ñt×£{m-ýÂjÃ+¶¿CÀk0ÜlP˼TЍª@b.¦\"~ŠiŸ;.œ†.]Òv-ƒ@¨*¨4BÔá*4e 1¢µ•gÒ}[ÑJµM=š Ê‹êm.”äl• rÌ&¦ðˆêbD29© ×–ŠÖ’DT(Ê$BD)'AÀ»}*`#±9èª.>Þá]ï,E:P°„Xã}·Š‚tsZ.–¼–ºÔý4MÐ#'ÍÙRÒÍK)¥ÔÍÓFM·Ãáó\Ü …4ÒúÒÖ¢õK„GeE ÖdJnM ‡ÅÙTøM`÷¢Öˆ°Èœëª  v”ñi®¼’ bpÀ*¨mf½j"´ð´’¤ûˆ,CÊ£Ç@É Ðêp«ª-mœXÊø@_d‚Ö–Å0ék§õpêu…^çuè‹¿–R6›íf»Ïn¦– aûi޲ZÅr-Ñ x§}­Â!guE(áû×ÐRxÅTbN´WÅ OÀ"×Ó5²MuªÕÿáÇf_#Œ£s˜ÊŠl "x\™â×tžµrŸAÛg9ï#¦D¸€ñÎþÞR5žÐš®Ôþ*ø1ôý¦_Úp»\ó­Ñ Þè¸ý5¤{·4”¿óóåÚ¡áqg·Õö&ïú¶õ'|ÍœºMÛ½nãqªip· úõ7Ý&ø‹Î®_MÀ¯ `Á÷ë:ûpÀã‡æ·ƒüDÐì‰o|¼^u¥ü Eç3ÏÜPéèå]®ÝW{Þd*ßy"¬Ž¿R`!TŸz§ÛôC¦»oÂé—<ê~Ð7…w×7ù¤éºOê µsÀSo& nÈ«Ài®—häü„?–eezuuŠrÅl<°häý w×BŠ+Ã*u <Ðo´:­ïðl.©âýÿTôû±™\oáÀEËíã!&)É~M@®F‡rÓrlµqáuù òí GáZN§ :XQk°r”p¼ä²m­„v6>‡+²œ^E{ãÉ/ÊEPݼµ°«]¸‰»7{zËæ{椢 µÎ <¥¨)œ*hHÉ•2ŒîuúyG ¯_^ç©Nuge®»I…H÷ŠÝ{Ê$ð&vƒPC3j&„ R‚%„#*lD$0P&7pGæ fÈOQg”"–(¢iHe¶p¡Øæ“æÁ-/4SRÆç ªOÔd‚®ñîûÊ@ÊIEs‚ª×š›áIòüʲwµyØÀÙè3ö?à y@-(3¶Ï‹@ ºJZÛ„A X„Ó)’š˜’@Õ’¦ÄÚ€™'÷â>OÕ ›um ·?bØt1z JÖNRÎôâÕ½”¦ãJŸQ&”‚pb ,R2 Š˜HD5éV®Ñ0åĨÎÆ‡wB„J¸‚DPT¨! ¨l¢è­6 è¥zк×, ˜}1èÅK©:äT"  3eD%T‘#“‚‚AÅtE·dÓfƒ§ Í–D ‚Q6y›Žû·NÙ¦·ͦ•‹Ê@@eAt0…(B@AkcU[¤]š ‚%XÒ Ê>Ä`9ò†T/Ó< Ã5ÖR!pÒFIc®sì¾LË!ÀâUán ‰Fµï} °6šz•B¬WC±j”5ÃoeÐnYÇ¥tÑpê€KwnÅŒÎU¢Biìlô.ZExéý7K¯1è½äúì(Ñ:2@ÀK÷èc¥Ý±£=,,ûRʼ€‚r°X¨]uª?¯yHfC(,¥2ÍûRKñp˜š{Š?³rÜlÂIe-¬¥`a °ìŠ‹³Â‹³¸ˆZ2FJPáíÊEÐúHb‘ûWöÑnþ܇FŒe[eﺴ6ƒ^›l´æ¥ `ó'ÀAƒ Ï@óàäžµ¶ Jüìõ9©$›„OOãæÓæóç§q;ʰ~vŠÊ§l¥xÛÍu«"¯czý2=©¤ž__¦¨nŸ†2Güé%mD>?›ûʤšm;f1sý~çð¼añðb K!È9‹q óˆWs0Ù‹Z­hÕ¤vë°:ûãî§6E¥ˆÃR®­=<ˆÆþ¯5ªG£üG0âºå&sHLɆœÇqØ Ï¿ûáx ®Z&ÞP"ÇBñCs¢,!ÆÊjVÞ¹þªèˆï ó\Õá¹ZXEOr!Õø¾ë½ÚFp+ĺ&ör3¨üN¥‘¯ƒ™ÞU8fßj¿ùì ¬yÇw#öÃ3:¸?¨ÈÎ+þÏMó·  ?Wf×:ÒçÒø½`³”‡Õiåë&Ò}÷ÔK%åÇ×Òƒ€ËyÙ5Çù´kä —ñeFÈ-ÐíR¥çl?î_t ¬H}÷Ri^KmOá3®íåBy£2ö'—gt,ÞYÑ\((ø6T³÷¶(ÝÙô¾žtÿË—m¯6Ÿ–œ×©öÉ^Ç=œï ¼1ÉVý§í#¯ú«õž›öÔË#¿¥ÏðËþvEç?|p,?V۸߿ò¸ùü¥\äÁ·ùÁ©rzÖܼ¹ØšyÙ\yú‹{Y·‰Û Õ•œùª2³(ÏÐ[®›~zÏYk‰\-öžŽ×ùÊ»2JaõI—æŠ\{¢ƒ#—5‹Uuo¹‘Ó ßÑüd/Zõã¯Teä¥2yÿàv»ä Mõ~²­É­ ÇaäÚUÈ™xê©D‹\CX×ïëREG¥Ì–„ŸÜ ïƒãÄRrj©¶ˆKË#çàåZ:4F_ pÏwÆ6LrÚiÈ3ÕÌõ·7Ð0¾J%NòÃ…ÄU+1/·ï«gçè»*“—›ÈIýç2µ8 ääl²,#Õ…_Ví©wbÀ³æµ+Û9Ï·­ã•U/êºcû4ØåEž}Èä4®¼Üߺ£ U"È&¦y_듼z}ǧ!» or$Û*~÷ÃóÓfÈÏ£=>${Ò¾ŒÐ$êfrNšD†©¦4º¦ýfxJ‰V÷»òÃ?}ª^Ò[uJÒ™Aˆ‰i»¹ñy äM.sžG5¥;æÀ˜ÅƒÓÌ1 5Á(»¢Óœrš6ƒG$KTcˆ¨Eõ%°éÑ»%4j„ŠDB"¢êQkÔ%Èù‡Í§r‡ö¿§ßýpš—K¨:KÊå2DYÉèâkÈydrП%vû^yRpoaêÕ„í>]ãÍ_Âw|k»“}­ h©‡pýÀ¥9 ±[)®Y¯ÜÆM®LW1â[ú Ñkëgã³$c×LßB¥ÎUYo¡™·ô—n¥¾W“áëGvúÙ ¸<]e>.M×=“=q:戼†áÌóù4äÄÑ…•”åYÆw&ÕÖé*Á¹’?ɹüþÙä»äíð4%áš r`ô­…’ä„Å£x‹<€¶·¿ íݬ¿:©Î¯7å°ÏÖ˺´p¯^u‘°¬ÀÖ˜þá‰ð"y:ÌåÕ¨³õK%ØS¾?ïÓª.†ˆWùjÇÆ¬ãYït²è|q=ÿ—ﻉ!œ=Ò“Yu\=ÇÑ’(æ$¡\cC'Ú]‚ÃÑ}Be¼“A¨ßÃñ/kogHÜ5Ÿëî-«·q¾Íü0Àz딼º:îápK@÷>^qus>ûö‡Ü#4w(3]µ”xSOìÖ›O>gí®y¡íq6%Ná³Jô÷!:»Ò|ò|/¡¼Ó‰ñ6VsMŽï¬°½–°yÃ+ã]Ã{õâß\>—ç¾ÑõÜ¿ÐS ö÷tàÔôTëóâÿ6¿†’Ôê?+èV.1HÞ´Ãðb®OÕuÀ¢¸w÷1Þý¢®é:z.€¾¢0ËQ3ø»9?¶¯]}@w¾§‹Û?è<üÀ™}ŸFöWéøFUèî~  .£xq×ß¶áfU¬;Ól½½.'¼û[qß ýþà¡ðÐÄ^¬§ÇNˆèîç/îà¿ý÷?k²a H¦& D˜jxçZ‰L¨È<Íe_ OCÚ”?ÿßþïâUéQ §Z§¼dM¤p¯Õ5H H*œp[°N‡ÏHhXüŒ‚(Ž”1Œ‘·€"Ò¨t5MÆ*È[³¤MµŠ&%Å 5 `š‚ók±l$)ªVö>ýÛO•)œò&M¯AÔ42gÿòçà¥x¨"o0>ÒAö<"m&¶IႪ¢’¡CW–)gzí‰ç,‚ðZT"æ ¥`Übó¼ M²¤÷T…¨ÇzÚ×ZJØìØŒT-b€ü¼Û=™‹Ív dÚ•4¤2W«Sú¼Õí ¦b®L™Û‘^]DX©"ûi3“IQZ"1VVq$’5¨ÚÓ v,¥ÇéÚÿH…tº)Q=Š{õêñÏÛç´ÙèfH›QÇl9?ýîó_Ya.Ÿ*kxQëyk/g8ׇ‘o‘Ý×Ry0ß»jCwöº¤ì|+y‰7åàO³â[Š%ï½>’P<Þpƒçþm^ 1¯‘š>œª\÷x×°àÛLªw¤*ß7|«à¬€·*@÷K oÎÆ3ð÷tÕßš<§¼iök|ñ\R÷^ßµÊî¤Æ§kþè¯UÅì»Ò« ·ÖÅ#_¹cß…PÏø9òfóÜäœ3{@&ø×›uW£‘_¿èüŠs>ؾ~›}ü.k¿Î¡>»Nøðg " ‰çú¹yÈ×4òý(ß7(`mbz½ô,«V¹.IÏÅÞ‚pĉ‹±<ò„pD4pЍ¸;ƒþËÏšš4ÈZcf•@R‰Ò4—¤CSFRZ£uÖPS²ÏQþ·ÿ4ÎÅæR^'u¦Ñõ±Rkr:¥®‹‡I„ûnµàÉ™éÅAð§ýÍJ‰]¶‚K¿Îé÷Ÿýp*¬vÐ3^¶âå/õ¿ÿ÷¿¨ Á”stÑn@z©ðZ“ä¼›ERf­’ÅŽxýi·}Þþüÿøúë4Ìu÷R}â~ªoêO´!¥MêÈp\„l¼`U¨,Òÿ€;bÂäÐØOHä5ØÄBÃ4=ý« 4¿þÅçW¯Å5‰Xšg Q¡B³jV^݆dƒê¾úB™Y‡q%eeòF?ÿÁTl¿Ÿë<‡»¥ÙçZ¢’® œ1ÏHÃYûØzóDuX‚;²ŠWâ’ISI¢ªšYE —pE%y ’¢½F išöÅKx;lÀ¸…(¢¥ "'0°À(e:¶+öß0ºê ëjΰ£ç j¥)’! ¡°Yh awz@ ­„@F@T¤P‚}ó±¥?€ÖùÕ±2ä¦q@*ÁR%˜€œ5™•ð¨„"5IŠ Ì¨ Có‡F{[TÝ0¶×­…p„£Ihôm´Ü@4oÕÕ:hr!ù èŸë•@¡Ö4ŽhXbhJúµ3åS:# æ%Äd3njÔæ{;äœÔÂÅãÓ³öE4 ˃ÔOfƒa _wEÁ+kZz þ¾¸Ȳ]šôþ54Û[ŸÑÚ1ÚRkÜö¶ôM;…_Êã~ím}Ôú¹oQ ì ]ÿè]ìÀ†åø‹.šÔëõMzHúµÕ¹ßZ Jj›/q,—ähï‚E 03/®ªóTæ}Ài9×R»¤¼@@3™k•€ŽB¯ brÔN¨*»Ô4kHP ¶ û(PÑ}¼›EA+~œl®½ªw´›Õ¥N£ ~(µyu°nî?{oB‘,ÄĆ4dr2“1iI¦›œóàƒ`£2Œ xq49UàÙò?ÿ^ƒQݧ’r*SqòõË”‡ôúº4¦º/’s ×w³¦TŠÒJfÑBªhkQ4]ÖÎ0D@^w€òó6¶€Ì¹Qø«…:—h¦1KôlfŒha¢Ö¼©áÑB𨥲†Ï%ÜñÏŸ~LÛíøãó§?üž öªã%´¯Bzùƒçîé‰~8„Ûê9òWï_Ç“ý _"X Ö±ªôª¹\Ø®ëgr+'D™U,*< .Nˆ@7ÔÉ»\ÅA9ƒ+T‹à9‚ÛÇá">¸‡^G/@™S_âóÏ„VrˆŸ×xå*]GéGâç¥èðúÚÖ˜ì™úÄå/ÝÖÕ¥ÓØ•G:ÓI„Å[šH—’–L´´—<ñ>F~'éœÈ‘r•¿“nÜä·¬ÝU‚֥sҾɞjp/öÞÄQ¿¨Cÿ¤Ê¡ì)WfàJž²&÷ÉzlO†àv¢Çu£0Ïég¼zÏÃÂ.;o®"G¡K d-tмÔe¾Ÿú]gÿÓjw:qý_¯‘K´ç¬´q¿ïç¨é´žögNÂ͹k€ §~ÏçØÈ:O¶½æ0~#r“|×¥:)ë-꘱HW '# 90»‘ïóMxôòŸLo ìÜê;€Wë§zpá9‚qKþ^V•‚ó+•£¹œÜž3r¶q]ž8'ÂL'e¡{˜)nËþœ-õ"ÍÝ2Æ!A?Yý——p¶Ê.•sÖ»Xæ‚•®ø)¤õÍÐÿ¿iÑyœêìO=QåýòèÓ<yµ=ð·ãk\È>À²àå&ÈW÷ZËÅq#ÇxïVv5Z}¬àHãQõóÖD^ÅÇta¥+°.ñ½$½çiÈ fÜŒÁO3ÕŸä½y­=t¯€Î6ôNÖÜ@iÅ…—?ýäsUU5 z³æ¤"¥Vz€ÈI?ÛºŸ'/*jYÕ§éçÊÜ׺+ýÿóŸµø<‡UÚ<Ç4oÛ–ï! !cška ˜šG(A$O)Pƒ  ! H A”@^¸áAÈ Œl@¦×€zõÓ6óÌ/* ª‰fÛ¿TˆÔÉó ^ëÓïŸæ}ADA5!e÷SaÀ²@°ÿ ç‡mÉi/‚pÖ¡ °X^*Ä ,k eߥÕ)0•(¤ê°ÝÂÄ TŒÔê¨Ô¨ 4‰"„t³;GË´ŸÈZ÷sye™P †gŒOÐg7°•Å¢=ïäkŸ¡ /Ý4¸iÇ7F³æ¾ÎU»@¹ D"A ! ÁRB‚°À†(ºKÂáØ…BLh­¯¨¯/ µM4 AÊ"NfjI«‡—Pƒ dƒ–¨ ]Z h¼i¢â@¯8›7½öNðã™ßà{'*©)ÙX—§€ 3ßÕ:ÝzÄj€ö·©õ."  ØU³°¼îöã˜(‘5›YÅCa»—},'m¢¨Ôy¶,5H2 –Sžv$½9 °;[4ò¸õõßÝz¥KÖ4Z=ºðòÐ-1X»y@çé¾m²ÙëÂÊ?líýµ@sï9l>¶€þíÕJí>n¶`áXóÓ”2–»•e4ˆ½‰Pð _¾¥yÈRX:˜ $µœ6ûi†ªO%ÜEÁ(Ͳ¼ —©¨ +Á†¨ó¾.fƒ…WH¨jÞ už="|!t„º«ù¼LöâÙ‹Ý'@`† <…˪³ay. P ‡6£z÷@+È! â&aÌi!ɘ·ÃšéîvPS5 Ð2$gL`ÕÃ~÷³™„Ï¥bƒM“dÒ“nw¯ófÌ™²ƒ|þ§Ï5 ÉbW6?ˆ(5¨I<15 *ÁˆAŒ" ÒS²OO"fð—IžU‡ÄZl®sN>S1F˜)õ(CCÞ4êƒÁ¨î^ÝK¥ÉýOÿœ¶ãøéùù?Æi—çAÍùPÅîW/Üaæ“8àñ˜oE±»¢ÉÂ_€ûëfS¦üát‘°|„‚wG>W”I>ÈV¾ëœ |?48ïŠ]ß;&—¸O#íwZP^å‚ÜnŒ½FÙûv Ä“ÊÃaç_¢ïJrì8»ëuÊ |ö-ï‹É·ð¬; 1x€'{’¼kR=’}ë€ÀÃIÊ}ŒåÆÀòÁóƒÓ`ßËUŒøÚ¼y…÷%Ú?Œ-Ü€àßèÀ·‘þÿ«ïâ.¾j ÜYÂW›ØDä]HÒ·“ØZuß¡ý»Ä”åÖaŠ¿vÀßÙKŽ'ÞV°ßG´2–Šò7TÿwWì6¿*¸BàjÆ¡|·'ý¡ò"ë½ññaÝÔÃH–Á»_ï•s,ÿÈ÷ŽÛ¾c¢v{/þz§”ï—\ÞiGàWœ.ìæ—ä—·Ž»›Ù»`]À…õ©¿Å7Ú¼>à/æó4B¾éS½ˆ`ïôÛ/³siì9v ½üé§ée·{ݵ©„G$"2$=mëî’ñ²Ò^™h¿M g7.nÜÿ>&ÍõÁ€ƒú? ­:R0ŒˆVÇjM| Öº ¼Ï Y—z-D:ÚÞ:ÍÔºkn+Ä‘¿¨05"¿ôAéÚAÂÆttÖ=¨Ø…ññVÙšgýùÔ<ˆ,#P#¤‰ õúux©ÕCMDlžj­UÄT(Y@*¤Ö´f ÀÄ ÑB!ílÀðenøq¡‰÷‹Q¢êòfG(kD~À15)3ô¿ç¢tÒu¸Am—RÑqL¢©’-éi³±a°qsN›,jJRÒJŒØ;?J‡A" Õ+¥:IµADLÔ°¬ãv‚ÓTaªÿêÇ AKÚ:dµ”!çÝ~‰éu§fãóTMXLØU°èDh²†¶«r“+#Uw r¢ Dà ‚¤‡Ê’`“á%úîµ»![²Í?ý8lÇíŸ{¥š×àù#<ª+ œéBð÷ýºPõ9 VÆAHï³ç)\Þ"½q1kôÿ#õ»’Ø.ƒä3Tø #|ƒšu-B?»ûí×߉µwµÌ÷Ë8œD¨+»Ú¿ƒ•ù•:ËHC£Þ~í‡\çO—¯~®¢Ò·¶ß„Yq«ð]oý# Ußû²~‘óïRtþjˆr«‰á{Ko}åÚ¿†Ý'ßê½ê=~L>Ò±(£œïÄ 3z}…‡:€¤ƒÀËA¶_–¦€S[®“ÿ­d/ ®-0o0\V:0<-뮾æB ±q+O⤃Ðá‹Î†l{^ÇëH>º€Ëa°ú}v†óÁݸ‰Ž„>—Á;ïò;0í×.GÝå/$jd°î%á©ææjCó³Ö‡Ó²f]-æ ‹×´6Éøå"äàÿ‹—?ý4}ÙÕ¹$3{~ú²{Ñdªj P=ª—YQ=JѤ)kRIJ&McfDÝWýé/ƒÈnòZ¥Y²N¥3ƒSJIÉÆÙ¦ B!H@FT¤ ð1äŒx…*Ðf«ˆ&„JšfÉ™Ã&‹åi^kzR ƒKu§(!i›Ò Ä\Ëì)%€OŸm؈JÌ/»2M‚6®ó+‡mˆ•À°e/ˆ€äPfÄ XB ‘Õòv«yðI|o^ÕL𦿓hD)VK°8¨M[e.»×=#4P1l»¥p­ÕM×¾q× S¨‹·fûpœwH@™:C<¢ v“U { jîÐvTÒ c£ªªGTÒd—èRˆ´þ° …U¤ à 1!’In |CMr6©Ñ!=¡¤…ø¯Ð´b ŠP!¤„ÄB*÷¹“ljfi‚Dì½ Î£ úZkÁu;S›MÝ>w=Ÿ68ˆÞ€B]º%R§½Ô ÎÞQ〥a{õœ0>m0DÙ‡ŠB9¤<¤4Õ9‚ªšÌ<"ÜÅTAÛOSêtqª˜PLÆ1M/Þäæ»¸ürTsqÙ=Ô°èí@…Ô ¶ =ba² $ƒL{ä !Òâ” D ²7cÛÔ½”Åzë Œ^u©»´A64;h‰nùkÒû Zs€ê RêF áË'×…i3lüPá‹z•×Vˆy?·"„.» %e <M"¥Ì@Ofó\‘ú¦W<¢w|(…ÒzF‰f4ݬ‚PG`)"ͨ€ ]މ—ãûؤE2è`Ø]™m„%%u‚‡lsÞæœòèÙæQÓ6Ù8¤œ5gID¶•[Æd¢ÿöŸÝ=æšrª*b€—Š–ÍžMdb’ê¦j&4Ý>  RRrˆH*¥–â¬äÆ¥zP ÃàR¼5G;¤Aø RlÎ ‘V%C嬵5 @RµxTG¸Wáá ,©%ûwÿá?|þãï‰`sCÕçÉ…®4¥qTŠZd°¦ìa·œÇÙ—±éýh잟ñ}xPä¼|y+®„§LÃ3FêúÓŽÉÅb¿Èt°7ËÊü$·™ g ŒÓ˾Ô4x þ¸".tPѦú²ô Ÿ ¸Pxýqâ!®[heÇÜâ Ïy5°xú‹‡g}]áá°GË{bþeÎÔ«zcÃIºŠå¶È£“Ë©/éZžpÃV cTyþ ×Yyä«®“\9ñȾ1ÉÊ=®Å:YÕ´äZ™gQ@Â#Lì«“ð²6(·ãyÜ1ò=ƒQîwÃÜÎÖëë¾ÀÎYgÏ•¡ Ý{Œ{üßé¦ÄÓœú¸ž#JçOâ0÷zâq͹·}­y}î­§×IN°‹#Äc&'[ûJcu½w-/Çü C:èˆÈ•bá²±5ă7šÝÏ<.÷¼ðõœežij_äí3öž™vë}ï^“Æâj8èo€ õÜð\íÝÞ0—bÈ7®—Â8k„åâïÌZ̃²¬#ðêäyï€ÿˆÎãD+âlǸ*ÒxYɸ¤ðÞ&Ξ«ÝØáq«ÇèÁ™ÿá7_•·º/Pù±ÕzÒúEòúädX=ô´y_Ÿ9r-ê'd¯Õ°Ž˜Ø©§eX¹F1¾¦Ž¹'¬ \Fíï€n/h2—%9„ºË»ÃÄ‹€žðÊäùÖñò‰4<¯(ÚŸnßg—Œ •ãôSÀ«cröøàI";ß°>Ó¯|ãJážÓÑ•‘7Kˆ—Ì»Ìu¿ŠÚÃUÎövË7o óQœçŠ˜âqHÞÕÏudÁë;ެò“MxVj‰„œ-N2·óóâ]£{zÍ÷wEYÖ§§Ñªu¢É*_zÆp๱À$qe3<{´<£]ov%q&ØýôeÚíË4OÓ`­SrÎ9L9‹÷UŒeØ“jÌ ÜÿoÿÕç—IÃ~ÝÉT_^Ë@ŽÛ ˆˆiª5Z=A ©á­ÈŒPhBT„BÆ.tm4rgD‚ehUØ Š¡ÖT^ ³Ø€ð¢`~Î'ÝÕ’©©Ï®&i°a3„S’<ý û¿¼N_v^çñ©ãõIcØ^Äô6tÁËPÀ2¼Ë@í‚û‹(¼”}Xq")rN&&Œ.•jBkÐZ*ÃA÷Z£Ô˜Ëôê50$< дèõ¬]Ž|ªÐÒ&æ¬ôUUµR¼îaJ„°aÙ–„„ ‡óá]¦A¨‡ùHJD›FwD@¥ô2|ƒdeÔp‡n¾ ‘(:…  ’Š‘®œE²ÀÁJ@‘4èá¤<˜¦Äèϲ¤hˆ·8-ÐVE%;vÌ®ŸD¬![µïUvó€,p`ób]U °o HyÁÍ—ºHWCgÿA´ei7nmª÷ã&›©W¯Õ£"„ÛçJ¨H­³¼RXÞРѹTóFêŒ×/µÎ$¤Öª­È¬»¹uWÈB#—å?€a÷E˜èx>{¯Rtf}ãF'ÐÁ€)Äý—>æún–€öò@û¹1úNÍ!埊:Ó¿Aö"HÖ¥„¸8'·Ö€€ “£3è±87u¦øß¦zèˆ !̺h¾,"<ÂnµM`²»ŸkZg9›©iØäÙ+È”R)…Àð”1>§4(Lc÷* F$I)Ù<zŸbŽ^"jmȹÉù¢¾%pˆÔvbERT†Ä.WE@ÙKY‡CT’¥!''j ²IJã8ÔAÓfLCNƒÅ&«Zne¶d…"?>£¸L5 âIöÅ„¥ÈîÁ!ƒðÙE°}[ØNU…i™«‰Õâ¡”œž~øì^U%Sj™‡§-’U‚B"ÄjºHž1J@;h=ӾƘ`Ú¡‚&ƒAg ât †{T¯S·B($S5³lÿóÿú¿>ýî,ÒÕÁ‹}‡**¢‹”ä ¾w¦¡~툾£œ{ÿt?ÖõO3ëB±E×ü,ÏŸë0ß­€C¬¹¨Ë]ÍäÏ­ª>@ú»5n+‰ÞNÌåÌÜéfœsNC9ï8#äªzëû’Ø˳ˆñ,n<¡‰¬þíÜZë|±i»žöòŽœwÈ›MWÁ†Îá#J´k€àÜhá,°oôµ ÎÖ'ðDƒôÍ'uHn…—Ó‚×´ã?–¾›¡‰·H¯gp•£~9FêmÊ×UØÃC~¨ Að0Ëõ‘¡xûsN÷ë@6W>Gü} €\¯Oܱ&¸¨@.·û{ÑÕ ~ˆÓƒCú¨rb½r¬\T×¾öuP6gùÌý14ü=•³·/éÍ:ßÍL‘_“`ƯYtþr\ÕO»Ó€‡í ÞyôàoQõä;½ÒÄþíu¹™¼y³ŸAï+Ç ¾¡ö΢û#‹Dñ¾ÉïÛ™û·õúm¢ãe‚®w#þŽQòc˜|çÉÄ‹$û2UâQo¢ ÊÑKnÞMu.îUL“ŠeQ3Mªª TŸ5›(™SŠ‘uªA¯"Åçý~÷ónþ¯_4@JsyNŠÑ]ªóµšIPw1r€ðn ` ÉàCˆÙ$þ’!¶ $º0K<|ʃ?}"E‚š³Î;ÄäO¿3K¶ÿ)`š¶iúR£"*7£Õ×ÊðOE纛Êk™÷“W¯¥2NOä 0`Ö¹ÞÈ#æ ª:áåOØþ*²Au†HY£Z²ÙèÎ:¹PÔTMB<æÊI¯5fF ¢º—ê•u"*†jý&€3LP¤ÃŽP M4¯>'‘Í«îÁ,,7OÔº§à((ÄÙ$À Ã5AÂCȬ¢9y­µ©±«0"D)”d)B„s(¢!AQR€25!%’ ­–îC¥„Â6!~:\ BC¢•8(±ˆÕDPرãàZÀ™È"'ò€d0?‚ûíÝTØ[t؃H¦P‚¾à#KÿDèbM^Ü›/Pö®C•&6ÏešŠ)Æ9Y#IƒŠbªÅªDÐ¥$ND„B,ç*¥QàM¬†£ÉúKŸ„ð1@»`Q{sƒ¿[Ýâ¸óDQ*Ú³î4üÔÁú&ä„ÊÔ ~E»CoN0—¥6ÕZ`“åAÿƉ¨Â€CF76hBQºÁÐ|w# ìMëV¨àªõ“½ÐZ´)YÝÎZл4ÔàŽˆR'T† «é°Å*Ý‘6¿¬d–.¡ÿ˾‡U–´X6µÜNÖXªX”õuò$:/×ÌÃ5®~“˜o «P¯mq| ,th <é$½]Ü8“_¿ ‘+…_\ëTZ·öÜp«•K3™u÷òù¢¹r^í=¹ÚCÑòö¹!§\©uk¥\ôÕœ>î³Ùw®<=x©E{¹»]sÓâÍзô|3‰É@ž; ! Ô—Þà$PE6Œ@xôž×֦Ʀ¸…‰¨YΛaÃÁF4YIAñ¤ž$6ÕDÕ1XýCªµl~žrRŒil3$ªº+ÕšÌN­ÝSN–¬+øC4eQM99‘6cÚŒTm‹%z„ÈT«ªv‰@Á84t)P‘ƒ—)‰Å¦™ …šH¯Õg—VkØhs•‰hç‘å”7Ãÿþ?ý'¬ƒO ëˆm…ö N-¦-Á<ë#<ïÛ»ÞT¼F«{ µ.EàToäúË*\‘Sˆë²!€¨îå Ü$G=F9hå,WÓõþ–ʾˆœÅ´rhNèwÐÕ_²EgñÈš¼|Gãõ’w‹|zž,í‹·ÌÉä‚û}£\Uu.e(O”Izn$'aÛÙÀÞéu8›!gï¿JN_Kè9œþq™ŸZæ^“Y¦¹JúûxÛhOzþÜ ‰GöëñXf'3WÖéœàPˆ HȰr4¥Y Ë^®»w×kèÌå z·žZrñ>ÊTÿ0¸v–³¼‰Ý\Íq»ß›ÉÝWÜËÍÄêjjsÙdÃ+†W=ñÃÅ¥Ðklw^ÉvßŸå °pP ;jEž|ë:1?ɦ׋êD ç°QJ;Ëi·Ðõg*çLy¹ÌâMíýîkð.ß·îÉ’EoŒ‹¡Ú!ý\ äÞ‡ål=‚T¶µl¼jÀ{M¸ì øèÜuS?s5¿uŠÝâ¹ßR%ºc'~±è3»E'çgÂ!^â)óï]hò߇èüU½ï3Á¥CþªôÖý¯»\P*„Ë¥4âYgá´wÞTò¹zýoÖ ?^œ õw7%0­ƒŸCŠþFIº['€…ûVh½ÜعÆý/Ö¿²‚t*‹xŒéÐ}·‹[ÅzrŽ^`ÍWñ(Ø¿XïQn óQ~„+׿eç_[ŒâUí´b¹OàÖ“w­ÀV©Ü¢qt™uñŽ‹Ÿ_;øgý=Ý=·Ò=^ͦïïÚŽ×íÖgã¾ äísñ­™|<ƒOÛ·åTèDë:°ÎõΈcôŃ:ÊðòL0w¥•(r'XºŸrœU‰ô+^=ñ«> òðc¼•ðÝž»<§f ñµ¾ˆ!phs=䨆 ”07­&É êT‰¨µV¤œQv5 ‘7¨%L‹ ˾F©^•š¨Æ4 ¢b`¼ ÌÐÔEcÄÀ‚éõÄXÑ+,5&8l„ÃgºJfu¦4†W¯^çN÷}ãUy•Rc4ŒI̬rv(¢Â SÌÈõÆ@—9dv™;ÞʽÄ\¸ÌKDuËfib”ÈÊq+ªRY„°IÃKWìâ*l¢èªbºC%gqgÎbDñ fH@QB$@ÒL#`3eA挀X %R !Å€Pi`.…¡ŒCcAí¤oJ„@ÙúZ»}³öÅ¢ùÀ*˜½‰ÇÀ(-°„Ù‘†nåÚ<~eѸ·EÜFTaÑQxƒ¥E•ˆ}Ž5 [»ýN,‰À7y»wû‰µJÆ!m7[æiRKšD„^Ô§qðR“¥pè®Ìsô"ó\Z¼ÂyšžÞ¸óª¹˜ž¯rþ÷l¼òÞÉÑ&¥¤ùfh:Ì›H©Kô¤ è’ÿš.œ.¼võ¡ã1Õßè†Ìj°Å ­…¨° ” µtùþV¥_,ÊjçZÚ'³ VzB–ŠÅâ¸= ê& ›aðú2Ï›Ïã¸Íóä9 Äž??Å—@¸× …‰F"€~GPoÍ = ©¾5ÜGgÿ%̓[ö–§7|æ_yUš_®M• =­Vù·èË»£/¶l?&ùrù‹p;¸ø•ÓâÁ©møõ8šüw!:"÷Ⱥå7ðÞ©õÛëc¯ôàû:­ïn|ºW2åW £#o†\¿½Ú/þZÍGÝ'ô]EßiÓ?Úvw4¹”¸P†¡ Þýô¥¼îæý$yýÙ†¬¦ª€ªm6IÜïY}ûiS_wœwBµ¨Á …BrÈ£|¼ºï¦éå%öEKÍ ª¹ÆÌ˜uP˜HvÙÐÞ*Ð)w}›&F/„WTGÎo…Bs×`é^  BÌp¬ J&k„éáÌcJI¤Ö‰P±<`ÞÍQ«ë\ÌB–}@CS0pÇüò𝩢›ŠzÌÉ#è `†Z Ú)äQ(H "1ï÷ás^ML$ÕbI$‚î.LtŒŒAiB(û)&/ÌŽZ,:q{²@èe_QIIHÙtÐ0J­4SPw»ˆê–˜’– ‚êT·–´CUÕýÆB¦%k­5©ÕäQÄB D*ÅÃQÀki6 "’DÆ¡¸2rFr8B&jÂèâA C…tRבW9€,’ÄBHH u™”Í€uñõ=æî‚^èb9M„ç'DÀ ]:Æ2¬IÇT CÊ£Í^è!ÚŒt;.©+Á‹@Piª;*p`“ŠNû}xUƒˆ7]¦èÐéy³­¥xq¡ÔÙ¬ólÉÊ\ƒ‘(9¥yªW'ŠÏý †Ö aÄJ©é0C!ÐCÖÔ¼²+4!%À‡Ê ò3HÔuú·ëÒ[ÓþÞS¸Þ¯!ÇjŽÁÔ¾û&H¸/–x›í.{{ ÐKG—‹~ÑRiPAxßµZ/g#š¬×.êû—™ê¡¢Ó4…s|‡ÑÈJwOŸ·­iÁçH„„ˆÎÕ‘tžc»Ý„ §aò=%š5q²AÚöêPD°yFQÔ‚:3$EzF1DA °Š˜ *È`ˆˆÐTE¨ªf0m¦ºª"f–,ë0XªÙ\ÔD=™B ºù÷ÿÎ_fzÀÉMЧ\MX5SÖ}M}uIYQS˜º»Æ”Æ!™ „Ôh0°:j*"Éa¸RÊJ™[ææÍL¼5ܨ¨(-¢r(DÐD%Hóû­QçRæÕéÑgEƒ®TTÕ’¥1ÿ‡ÿôÏС¥åmñ$B *k&Ì7EÚµÏèá¿@Töî óÈMVÖ'×áõÒ+øà@þ2#󷚤©ê)QôŽAd¿+œ>m¨êÒ@²ð«QøíõÛë·×o¯ß^¿½þÆÂ†+ ‹üØçœ—ä/‚·³8á‘xï]Ö+†Ü¨ÿ-æìLK³xdmȹ1Ô!ÞXù]ék;þgÑ­%(|#ræBÛÀB¸?íwÂó~è§åòxe8 7E„ÄýqÑ/sNÃYq§pQä<´Ì®[µ¤³…®z?¡“µÈc_ 87tz«~Ö°{–Ž`ý«4þò§ÿ[:ƒ‹rÏNûŒSó€þ=æéwÅy7WWtpØÜärÜÏ».ýÓ±„éç·pf¿~mjʵ1¼Cr9üxÖ­I^ßk.-àÚnÖÎÞ§ÂMG­tsÛû‚Û~Ç‹«%ü7œ?Z—YÓS®fË5×Àÿ?{ÿÚåH’$¢"ªfî@dUõ gHN³÷Î,wïãÿÿ¥{ö\.É~Teàn¦ª÷ƒ™À@df=º§qzj2#€»¹=TEUDÖ Ö¥Ëë¤ÐW}káê»I9Ne.á."ùËŸÒ˜ó8@iÑ´$Ü]¨5lšéUJ™~z#T!9|§æ1½•ão˜JTÉR@W ?îäEl¦ÑÒà2FÞ 2Œ2@BÇþW'r†5W 4 ÌPKï#f‚|*TÂÌK™³EÀûO¹ ¸i-sÔŠ”à0+.9”H…PEû§Ô s ÌHª¡NÐ0€0ƒ¦.ÈãÞ‘Ó&ŠRˆ¡™ª8 fóÎH€nt?÷p?VDE5‘Ø]Xé(D…5 `òRïSÂ$‹xx­¡C ¨P3©ÅÚ2`†i¸SVdÕ©Ô+á¥Ð3Ä‹“Ù¢ZÔPê~#tžæ!«{RV9¾Mî1æùPEˆ˜j÷»ýnÿÓo¥ÔœÓ B£#¬Ö3Ó¼úiiü_Ä‘º¾žtÿa6RIJaAÎ[¡Æ9xjrOTèÐ÷'¬Òæî¸Ð-þo €fÝ»ò/ô8š‚“æOðæ°xJ“¡s8NLF4áâf!X_8-Bïö½Z鈀ÒŽx;QzhQ¢?³ø)DDwI(Ie:¾ÕÊœ3YU%æVò0fæa7’t i*ZK)s-‘̤ÊRãé>Ï}$(¨;"QèЫ’ê¨Ñ¹–˜3ÚÇfŠMQJQÍ)¨AQ!EØ('Ô *:³ÁóïŸÿøæ³MI„Tëõ‘R-ÙÓ\ œgÛ©Hñˆ€0%µ¬e®ÆŒ4X­…1‚¶·K¨n"ID›öTD¨EifPRD$i-劖ÛoÖÃÝÙB:+fó\¼XsùM*9%M‰©KàüáßþëËï¾ÛºN,º¾ZÁškÑš•©ÔŹÉSÙ îE¼ŠTÖŒù3xËë`¬Å÷–è†+ÍÐwóØnÙ¾"®›.G´ÎŠ6#‚5Ã26Ĉnƒ+>Ä}"{ìWqÑ>+Šr^’„߉¢Âη´ìøXå2ì}'e‹ˆ›f^>¥{ ¡§1ºÓÓ±²¼^õßIF.HÓ¸˜ù¸ÔËÚ@ÿOB_Wì­ÐT¨%ô,3.Rý­X÷ó¾-ZÝip½µ´¾×•Æ‹Åpsƒ—²¸åià‘fé#¬ä rg¨Æ—©Ó£ôóf9Ä\Ï=ýˆßBÜ]?‹æõ‚ù0ú‰ðQa¥ ~ÏiÄ›úÊjï$Ñ÷ÇbcB®t·°~ÙÜÁ.D¡¿ánð©V㊧Ļ®¦Ê [­=~ãÝ¡}†eu…–ܪ±mª­5Üøq(é‹×šn,€‹`é«0hü­‹Î?^àW×yO êñ=~hn,òZÈ1"Þ™3÷hO÷þ{\Ÿ¿÷nü&€Ø‡Ö°y0$¼ÚǬ»w.>0šÏZ…W"–kÈïÔ¸²ÇX‡ñq æ_úÊmoÎ E‹^!Oq¾\.q?^Ý-éoEé= ÓÇз¼°²žï% nŸ×Ì`¯t¬çôI„¿d‚X϶5ˆºpÆâ2ÙK2<ÕNÒ"±FJoÈíÙrFÞÝÜïÆ&©Ë4á‰þ½FJc-yñÏóé}ùF3”§Å|•«m§~g-=^d4‹8Ïcãøg*kŠæºÈÛ“y¥å¶6Þ»^”â®SÁÍ#ùA<}®l­ªw·È}œÅãc¡o‡÷¢ãÛ‰ù®ààƒ÷n°ì˯Þðè¸ß*}[Œõå/ÂëÙðÿŸþø—ù0¹;É¿üø§4攓¤D%A Ãm~›Ó¦J8‡CXùô²oÂ#6ÊÑæ£/;ÿ_$,g ·šsÉCBh©ÐB¨ @Â+zï¿Uˆtôß@»,I+œ¶¾ÓÖ”@ˆÚ[òE˜9iNyÈãhµÄñ€ACLopžÑb5 a>—&UëMm>e‚$ û†Ü$G¬ åç ê«H8¢ÀæÚ‚¨¥·™7ésMá3|žÃ‹ÐMm’뎃Á;A",p,Ýu`$LͲuÑЄZ[;Z À!ÍB‡|ÙÐ07I"+æámð«Wwä&Ö㩪æîŒHžwÜ¥ Èܦ°h”R‹c5åôÝw»ãáíÓžPÿñG3 —™­»Â† ÿLÀ‰PÀÙÄLà!†ù‚@:ÃqÞ ?‡Õ®ØcqÖ÷_ft§¿Ä"D ’CPV:9cãB é y@ÓÒçO) 9U+µ”¼ /*Póá*’SžË,x4<: ‡ã$I!®²—p”b9^,!^µFŒeÜuŠ·×c«¤«$:îu†{œì>¸Hu¼û$¾¿œÛ!+K”¥éÞŸSBàY>Š@™@ófuÐAvJ×¶jïj2÷ð^~vž,¤ËæyÀ@m‚ø I!¤ÅˆIÁîêŒãg4cg¶7ÖÎóÀbÜ.W€hU‚pÀû[¸¤›­ë¿éò›w†A#`n(¼:T¾ÿ‡ï"búcÒŽŠ4ä,DÄ4ÏAËãpœ« Õ|N¾ËãŒ#.„êî`† 0GÔ¾#5„$˰[/¾Ô‚¹`>r!Šr¤“£’YETD5gÍYrbÊP¥¨6™v¡;é¢5(4å$ºsîþËHh Ë É0€0 ÅXj²æ4ÌöùíûÁ’$²ariÜ ÁP-‘àƒæa7÷¤#krÂS™Í<%rîUC«$]L›Óoµ®$Cš{‚‚Ív†æÞ&ª›[5›‹W«Mø) 9¥œò~^v*ò‡ûßo¢…69o/ò)ï¿’å\u½ t‚E/R÷^z’‹³ÀZöË<æ9Ø[‰ ®5&Î…>Â8ÎÚ—«‹7éýe~¥DtécƸrc …O>a¼Ö£¾*0n?¾›¸ÒÕ]=›XƒÈ·IéC 0®nï~pá ÕÞw§Ž'5¤SYbë–×òœqÏõ*aŽE µýÛùN—òÀ£Þ·Ç±êº‰í²ëj—D ëœí~ýb3$¾‚®SÚ{ÎX›Oö€ç–ã’x‘Ú±'º¸ÐRÝÈ÷‰+à÷^ãÔÇÒÁÁCß¶s(6´¿¶âϦé{ÀЦáÇæJ_ýëým0VâÉqB,6ÄÊßÒ÷qdÞ4ÅsOê|KűÓê^t3¯÷¤óo>ÊC㽦¯{“Ÿê—Ŷ¡ù¯êH‹«Òlœ9dO}2o*qq¾º`nuÍž*ó÷Øg²ï{€æ¦:ñµŸxÜïù^‰÷޼©™м0\íŸDŠoP"àoHtþù²Ä-~ïqoþë=—ˆ‡×ïùØ<ù¶å™¯ü…wA­sðð£Òã^‹¸Ø’Þ“û¿@ù¡øà·ôâ© ÿr¸{kà)+¸·Ù=_œ:Ô›ÑÓ}oÕøH›A¯Y|ƒ2ö/³ŠÖÅ®«y~Y»嫸ãÛ­üoç‹õíK¯_÷Lã™g{ç@Âßêk£8xQMæe6‡¿¼Î¯+ÖfoÊ9 Y’ª4ðp šiq†#‚î⑇ŒpXIÃKåX„Ùÿïÿk÷)i­ /~˜`´ú›Y¡HÊÔdiˆ!E¡™)`9Téˆæ°ê‹™'U÷Ô ]‡€£Ö³ËAw - ¢*9tI¤Èð"+S-ÇÀ‹Ô9¬*hQSêÃÞêQ’ iHÓ[©sIÙËæHC—˜i]É@…hoEM •]çdëÔ’º§n-P^ë2µôÁwƒ»rKsz„—&nã8̨΢P‘Ú@j@ÈÝNVÂ%%&ÍVcž­V¡jšÜ_k¤ê 3YŠˆ{&RCœ•jÔV@03RÄC@¢ìÆÓd/ŸdÜåœxœ£f{IãnïELjÚÉÀpÓ2UªÐ †€c(éˆæêÜäà›Â~ðõde 3„Ánç†w馳Àªp’À Æ¹8 "º?s¡cgCÃIhBJbVœTgHè| ¨ҟ»ˆ‡[ (: C­µ¼úüVë® cDš!YæZàž^vƒJ™ëám.³%…ͳGe„ÍîfpëÊ'=Áiíù­÷¨Ñ½šã䬫F…¦¡xÀÊ2Ža³þQ>A_‚ïS]ÛG½<Ñå,bÿ6Q~š Ss†-Ü x­ѰÓÝoÁt@Ê}9ˆ/ ûËâm5<‰¥Ó 6¢ 6¾Çò€›À ö¶páxùnˆÀä³Ó5'¼}>4Åûßý‡ï¯Q1÷bµZùôý>€OŸösq–d69}xÉê¥Nµz—pZ‘­™šÑõûœ#×%ºkõ‚ _’xC_ð¹|%o.k{^Û·Ô '–$NÍÜpd:‰zâ,ö±’èYn¾tÃËø\kìÎmqÆNeˆÛÙòÇáÉÄøê€=?¯‡– «|ìÁ±Ç_ú_T6«¬7Ez¬Õ~Îï‹Uye`{¿¢øÑÀ»Žs|/àå-?ápÅ-nrইèþt·àÿ^ üèá]5©m}ã)éùÍ[gQ²ÞŠr.‡¬ì€l¡*qÑc“Ž5¢ŽešÝ ÀOÇŸò˜E›$Eká {ؘ0fÕ4 šŠƒ qcÌ8Úaz=Xõáe"j­ÕK™m>¢’ V¥¥Ñhˆi0d€yHfÆÅ˜±¹‰6¬³©7ÐÿÔÈl1ÃvòH‚hsUáºgJ B„ž##^ÜÌéÅó(’Õlž'Ô#†Ìåèa”ð@! mvž š:Tí"PœËšPš ì]ç­µË÷£Aí' BîÎ:9$úÿ²!Öìèé0A5¸#9à`y­J$bBÂYª%•ð¬Å]á#¡"”R„ÈI-”*V+áÒ®V›Æ:÷cð6’ª¢ša^æâf¤Ž™ÓÁ Ž!ÒŽ/ŸR~ÈŸfËiÐEÇÝ0¦\ŽÜœ±òüv€Wbv­L¡Mà]Â}Á©dQ˜‘.èÓÀVkâ>f C ‹3îÏ f—g‡÷6t80*$A &g?DFÓ`7xôƒts}|æRêlšäûHx¥;Í+àVçAr@s©%î¬ûݘ’ÂE % »¬]ŽÇ: 9ÄÍ\™’ÀKˆ$ÔÀJÅ¢ò_gÀ AWê?oËÒáudñ4îf¿è?§"˜/ jW­q–¿6ê¶xí6ˆ_;•©o]yß{!¼ÿ¤A³* ÂNÔïzJ­UÿÇÿÒØ6ÃÕå|‹Nnà‚ì# mÂG7jîFÐ~,Úúj#€5Ý0Ào?ÍAP”<¤Ýn¬¥ÔêóçŸ~RUÔ-öyÈ%TÕ#†![H±bðý~7ûÑjÔ¹V· ‹`È©xm;€a@qÌG¤š`ð^°Š¹@”yÀn¤ƒQ”"* ’$ç”sÚ ºRÔ/{ч@&›¿Kn•GQÅ1ET"¤ú”ä Hõ°F‚r·ïs!ááÂpöÎ ¬oÇZKÍ)IJµZ3þ ÕR«»‡…ˆ„JÆ4ep7+Ѽ‚›I6RR³EL̽íu"ÍÂxé} ÜŠY)µXÔêæ҇ݸûᓹÿã?ÿ' vãÈ«°‘<ãÓg Û³úO„ßéà½eU÷Õÿ®QÚ-r£!ñ6Š!6Ø»ïIÖ\F¹§®—Ëäóº)rŸ”¾nÕ†6ú —2?/n§S{OYÅZèóƒåÞÍ«–ƒs7ËA~6Ž+3¿+‚ù•(ÒTèËã·glN·Ûq[Ë»‹ÐO4~¾Ÿ·s­3Ô‡u—;û†ùM0…ãmþî½nñojðÒê6nS“F×yî£O >9yÖ3ùA"³Auú­bÇ›æ¨ß„èð42ßÓ\©/ßì¶Oê?9’Ï\m|ÓþHÜ‘ úÕêšO?“E-å® Új&ã2Øá»ú0Bo»¢ó—ð½Ö‡_eÛYßÊ=b ¾N^OS4®(ÂWüpÃ0ãJò,mn§L`…R¯ûù=6û\65³ã6f?_Aû2é†`'6ç xÍ®¹8M²Õ›·‰Oë‘ \Š®¨Á›qÏ2½$EØÍ N†|§;Y‰ûǺ­ü<Ž+vëbh›{F\þ·ž”R/'Ñõ÷aS¿fü­cº‡¼àµÍÃêFÁk gÒ㉾·‹l•:ðþÊ øÖ§Ù²íáš|J_¸RÖÁ¹ç-6¨@WdÖ{,¤{õ`#[ßHlÊ|Þj^nEðõ;Oí"ñ{À¶»Ÿ®¼SJ[ySM½CKçÍÁÅÚX)­?8VB†ç°è9Êá½QÚ|ˆ7ÙUM2nÕÄÎZ§ªà‚¨tžÐ‚q|þ_žG+ᯇÏiÌ’”"m¹ C›ɬª$}2+»q¦éíøùÇ·Ý.§—T¯üïVº×H¬8’Šâeþf É‘±H™„$¨†2 Mó;A6C@=ãìÖÔǤ÷ :Ô1Ɔ¸uÕÆ| Uj" ˆùx0ɹ¢½wüä‡?-0Œ`^„ûSGýÚnaÖ¥?ÐЀ„!* UäO˜(ÇåRgx9£ÕÐZtÝ–í¡t[Ô˜†‰ 1I09,àTº»@’åL ŽƒÎæ¥F¸óXHÕ!¡U˜SVI"ánÔ͵Vx†$:šÀŽBsÇ‚g+­~3…BΓï_ĆDx 4êàÄÑtô•´Ï2 “å]Æ>JޡɩYðݧ—ŸL«˜à¨õ R\ƒÖüœ[-Ä@GrB— ܉$hÓJò ÐßWgƒ®„€€fÕ ³¡G ë,1ðò²cÂa:¦$ãNg+BÉšÌk‚T ¥æ”œßæp£33bÕ¦©âS0T˜¦Cñy6³ØïÕªQ(ˆC9ZÄ0ŽTZx)5IÚc)µK"<<<° wGB-@…*BBµÏÔ /˜CÃØÒ _‰:#'¤ïáÖ]©E ­Ô¸uèœDÁñ'H+˺ѥã¾sU€@¨B‡¥ßQ¼»-·j!؉2mólÖó+ÒØé¨ÝI»Õ=‰®/Ô+ ÑyÍZ y ô6ï뮯÷æ’@iu4Hr¯MhÈÝ­„©EJ÷:Íõ»ïsRªè±ÝÃ=>}÷zÛïGGµ0Bê\…"´HH*ã.û\»-1O¨ò\Æè{«u)ü!#ªª«ê§¬šr )å4æ4 )§d¢N¤$ ¾@Ѓo“ ‚Bωz„ªÈ?ÿ>Ü}Ð"‘ Í£Ô)'5Vrª¦<+4ÍÅÃÝ!3Äów/"Ô¤q€Š•®·àTÌ∈”’»Ç"ç-*aP73³U4Ã@x/Ûô‚]x„[T·¹Ô¹F­hbV*y7î÷é?þþÇi€m ;Þ²ÖLà…H]«34èiD¹®¸NâÜ:Á³S·Ná%A¸Öl?O‹pæµþ ïÃË zç¯\ªPƉ.º©|x `ü2(oâ6ëž„«æ¬‰]ÓsÔz-ßü¾oAÀÛž÷UD·fÊǪc„+Yظ­"¬µ+O]§í6¡;GÚ–·×’>÷aÐX×-p¡Žy°]<©å9®#ä‡Hö:ƒ#›­<—St5Ñ.û£.cQ,fÜÁ‹Þ—3q}õ½õ>ÃGØS˜ÂGKWýC[ðßEÆ´ ü¿Í//9賕´Kƒ¨Ý#,†ÝàÅßÞ¦ˆ(Se ‹ô´¹b‡³ô”|â=,¢ š¡±,;±"¡˜4ˆB¥‚Ä8àíG¤Šœ{y ä¡+)µÃ½AçîöÀJGð-ºómë¬?I5^w8á<áz¯…£¹8,™o$’†ùu_¤HûXQ  a.sÂúa½xÓ_Œ ¼.. ÉËó5ÑŠKB1hJiŸAN‡ù»ï_(²Qðz<”y~ùîeÜ 8eÔüéew˜?›WÀÉAXøqšz1i±1P… {$˜£V¡ ÉT‹$A MY’èdPæ$9A5e¡Ê˜8‚)éO32à {P´×ßQÂþ•Z¬/:û§êj1ïPåe@JpˆÙh£¨ŠL)kp hjuM:•a²G46˜¦`.á)'6Cäê& ª˜;wï衪fÍ6&¸Gï¢ÿÕJõRQkÛE%ï‡ýï>ýçßÿ¡”ªä’œÜA†#D0(g°:NÊõ× èSÑ,¿":Y‚̸·NÇWEA->kÔx3bÙhæx|î_7iߨ^Ý—úú;ºÇXƒé·2ñ\z‚U7×&à¡GÕÓ)ÇWÂB”Žu•ã2—|’p)Eõn¾¸9åÏ—ð³¶Q?`ü Ñî5€ü²ý˜p;øñÑ¡øÍç cài]þo>»â7™¤ý¿pöºÁøÛÿM ô¯I¡îaÈó˜ð¥5Å_â ~3Ñùçåm à—ÔEüšoùißà|NOîFX>}·7³¿¼Yì ¤†ñ‡qàÛqJƒLsˆ$-^ë<ÍÕ}N/ßzUCÈø¢jÇé'å` *ÒŸP‹S‘ðÒµÚðž´ì»¾ÿ«°e[ie€ (Qµ %¡éB)¡÷’º·¶÷wÀç‹Ùœ•®ÌCÖbmþ©¦,`­æa zá L³{”!“‡/ ð4¤¾Ëñ0'M»]Ny†<—9‡„Çㄈ¤i·æãfšôeÜ•Ï3OêÿÍû½ûžiDA8dÀ°C­Ý†:%¨õˆ”Q/ßwµ}úê—@­  Dó‚ˆæ6QàÍ` Þíµ»Kœõ ߆Î+ÂÑõß—²„7îA?;7½üíÀôß÷nø|Š{bqi¦¶!¢¯ú¶ÖD C×;ê<@3ÆïÉ<¼MnNAÎLYÜê:0¹H¦d‚Qæy·sN)ë4Ý+€jVç™”1ï4ëÛôæÕa1©Å!ÐVŸhlŒ@¬Â‰a€Rn¾Í Mªi4ˆdI%S²FÒB$JS~JŠÙ8&NQ§"¡ØÿcþaŸþrœsy0U©ô>$=zäL¦¨nnû@-~,~(ŸÆHJŠj ÐÌ ’š·CôÖÖfZ¡I… RIº[{€ˆæ¥„û¢-ÄfÒÌyh]•ÉÍ­T+µ–Õнd’î†ýŸþËïÿ ‘š†ÕÁwò„í”´X ¼‹Ñ]òïnªqáfÊS3ÁÕ©…Vo™¸ÄýÏm_ÐM½©‰SÖqÓr{Á¸ÁêNê~OÉ,rU÷¿iX…¨üúÀò¶ï&¿¸ö|¾O<ž óžÀÖײ9ï`±Ê½žDíÑ•R¯"ø¥÷ûÝë\þ‰À¶Å—$í¼¢ðce÷µyò• Ð1è_öÞúòÍáËè»Éæ†_Nü-‰`¯‡ÝTñ…¹ÑoZýõÔÀ?r¤<šß´‚Øîÿüöxè3Ïåç¨üUNÒ­ˆióX¹ÄÄù=ž~vÏì3¿È âã p]øæûÀ(ðž‡ð- ·þIcE¬ëfçÉÆÿ53ìž4Ü£§¼²L¿]g¦¥&RÝîœÞ¾È]·"®=ây¾3?·’,ƒt+EKJs-ƒxJÖq‰GÁljâ|Ay[¾zV%"k‚@,êq6o ò ¸“«Ò /®ù:@àªãû±šäenv²=èw¹–ˆ{>¼7¤UŸ;íú·ç /¡éK­¦Þ¼*ð2 ºLqN&—e^þ:/ªS÷ú2n~õ‡ëÛ¿_ý¾e,Þ–•Ϋr»T³¡{[ÎYÛ¦IZâeÁåJ“[×wß@8£Ÿ)™\&¢²k>3hV¸Äù«oµAOfÄŠ#¿¶ö¾øé›E,†®pæÞž™¶Ÿÿøã|8Z5wŸê±‰ÿˆˆ,èÔZ³&a„û\³RöC™Ê§öaøÓÿø1ºÿ~˜üÓëçë€áûnú|T¾…óD¯H.¡÷×3!j0Áê¦òsãvà )PébtnSw‡4²›Q)^©Ù=HhÊ@]à"ãüãgaèë[-eVX!\,æaH”bšài€¤¾ÐÌ !†D&‰uŽpø VpB¸wW^^1AÁûÀgéšæê˜&Ô¦ÊÒï¸j"”Ð&bPíÒŒp0b., *ÌC(»!…i¨×#MÎx+u—tT¦“W0v/Z͈šàTèM¬Í3F‘fó„ôBŸÝLÀ‘ò’tO$«jF “qŸò0âà)ÕCI>ï²T+BÍŽŸöã.óOÇÙwP¸VÐ]Ó.¼Ž/ÃÁ«ª©Íj;E%P¦ðÒ}úÜ5XÑm{ƒ0À–@Z|‚ÑU”:hî]°+&͆!DÊöØ›è[é%í$  fùaGG$fa²©NóÑæ’@U g©^f¯³GB„”Ùë:°ÌS»ýáöÇRbßï^Â=gr9Í“[•¦,40¹†EJéø6×b¢Øók+hËl70:9ƒ0G-H;xi}Ö!€¤.¹Ó>¤Íä”– @éÂ;Úf>PË¢a¢šo%«¦>d†¥^Mà«‹c3`åìÝÝ•›cp³ÆR<èÑŽõeÒåÈ–“ƒÍ Øa[JæH˜ ÃÝ!t¹—åz¨(>£"’k–dȃ a(º3Ãñ<ìª×r,³©’BÉa·ßÕY,ìåÓþíø:MÇãñˆBÐ%Ì!’u¨¥6êæô„¡ b—áŽ!#ï‘C@fþNsÒDIY4Ñ“2%€¢pØÁRNl>ºæ8ÇÑ4}³àcr¡€ éâT-*åm.I#ISÊ0›GµTJJ9z‘Õ£˜39(’’½XЩß7J€Š˜‚«°ZU”Bq/¥®T*{HêÑ%mÜ V«³RÝ€¤”†”†üoÿÇkãÕ¬”ºHÕ -—s¼½˜V5zÈUùŸqÛ°Ä–g|/R±éè_´ÑÜ—^¹VÂ] b¬ûo¸…¹Š+NýÈçhð²Špb­>ìï8…dý«×Z9qÃ…XÍul¼ˆ¿Ç"?q¶÷Š;©øyøc3ü{ {/©>÷%]X{_õ‚ÜU9Øì¾‹¸«¾ò®TȉÕqêÈZ'>·ò;ë§}åŰþº+áãó[?å‡ÇÖH®]Ú¶…5V25+è~vÛÖõzÞnêJZ„ÜDï¶^Ý›ïX=¯•˜.€>d}­äsAª¹IŽq¼¾3—¸*m?Ä{oµáðÄS¹)Žël_"òs{g±¡VŠ/*¹½ß­¤ø¤ÑôP6äœ ]à à;ðÜ&á |…_É?¾ë[Xí^;ð×—+Pª ë=|r5…¶˜ó×þrø2V;ÀŠ…¹'…ø/øüÇo¹îŒx¼áoNË{²þ›‚æ÷”Ÿ¯ª›O‹ÀðòaŇêÏÐËq¶†<#p—ÄsTÝmÿvEçoèÕáu¸v ”Ç»¨àÍ—_Á\§ÿ¿«¾?´±ÌÓÛ1ȹ¤Œé"vmr«¤¥V e@…Wµ ­U¤j†°‰—{-h€ZÌéÏC` ëOÝP´{G¼(\áÞuB(½¹–TÆ>2©4Ô C7aóô:~:¨Š>ÊÑ`52”¨SÌ3ÈnyZÞjG‡5¡õk†¼"jøO&øŒ˜1aQ»9ªù¢8Od=–Ö /HrV@UéJ5 _“Eœ6¢ëÛdà ¨“#Ô À¡$£8*¢eö£QЇfÏ/¤ ÉrÀó¨b¬µ2»fh¢hòj²ó‚)rŒßAõ»‚„ºƒ‚ 2ä$Jå šb‡âµ£jxR@†RÃŒŸ¦’sÞï’&‘bCÀ‚»üÎÕê§Ý8¸ï†™ÙÛŽCÎûÄÙ‹Ç|¬)BÃ]ñò²3•·ÙSFhö©X”ZÜ5ñÓÞ=ê¡{ºv¿@ÂÅîÕ—RA+Ü›PG„×€5`c‹oOÊÝJZ „bÿiÁ<Á†h"Ió6ûÓOÇAE†ÑÅŠUTÂuØí’øá­LoµTÔ‚Ý.Q´êUˆ<BæZÜ=å4 ©V;f€“Õ4M/cÎY§YÍÜ3‡q<îæz¬oÓÁÅtXÎ_;S «Ã 9ƒ‚(½åÜ Ì@C_/uF†}_P"° ž ;ôÀCNªX7 #dqKn†4 ˆ¨0[øºÈ÷D ÑExÚÚ ïd…8—Ûaÿ¢fæÑûc¥W¢ô–‚†´=!Nç›B½[@K# ( àµàpÐÛðÛWçQöã ¡y—}6Ž“Ü ‡ãÁÃÆaLYeÀÌúéUUòŠ×R5Œ,¹Z÷b’Á›ý¸d@à€,.Ä- „{‘!i7p$‰dÑœD™è*A„‰…“š…5âhbÁƒá?þƒýî%H;šf9}Úiu‰€K€rœ"e”‘Z«Í“å:ÇwêÓŒ©r¢é¡ZàjÖÒÝ€æ¾á"J‘Z‹‡K TAb®–’ Yk wDx³ðÒÍNþ›hè¿×êÅj©nÖÜe˜rú—ý×Oÿð=c±u&)Ü¥Ô»ÓE¸@ÿqâ¿PÿÅ¿*¿¾hZ¡ÖÜ"È~$¨~àhw/(º(|]ª´ö*íñô-5ô!”·Ð.¥”÷™Ý[F©éè: ¿Q?À·v~ÚÐ4¸á. Ð݈ß 073ÏêxÜÞµ·óu à©®®3™/Idž_ƒ|.¹/z³1s>cÅeßob¡Ý¢+à›§‹c’QžÜòdþåaî¿v,î758¿e%¥çˇ1Š/ÜŸ~¹[;‘Ó¾òiü‰Î߻ΟµIâŠÀwÕÛ½>h®ˆ ½¤“'>R³¹ÇˆúèwèÅ­óýÓ|‰ÁÏG¯£bÞ ¬z+¶ÝÛcaŸE€Z7ç…¤Ìò›‹üJšgU?‹o6Q¡•_ü’wÇ›ç$r³°ö/®V‘Es‡ì*ß]éûÌ>ÔÆE]c¨XÑ„/#D¬¼–Î9KÏ×y¡s¹ÝÇ9HŒ5§¯è 7Ì™uØÊKîü“µnÄjâý‘[¦P׌’Ó´ Ü0;íúö yq.¬îŸ7é x³S\×Q.âã…wËc‘Ûƒí¶®~Ûwï|[3yZGÛùÀº?/n Cw’ÕÕÆêùssú}³h‘›õÂc_Kù¼Ãä}ÊóÊÔÎ}¹ãµêÂåÆìyÂC.¬(¸¨ÝÚ(þòÓ|œ¬T3+^šø Evàæ)'†3"%¡Žé0_'0†Œô2”ÿþ#¬”bDˆ8£²N^ˆ,¦&3"¥`° ¬˜U_°û¦7Hõð¦Ë®M G A€T6è©£rTM;Õ‘È^.T guÚd€aL^Vç׃×*Šù-Z˰Žpf@†$äŒrì÷­&‘÷°Úû¬ÛSJŠzÀô +]®Äf”" @£a‚‹\»4}µy—ÚODJˆÕ€ , Ò[°áÝúÕ‰$ïÞÂa"$<`gÀP‡Fa8SŒ;;K€aÀ)•¨&’†TÌ¡Jaª5t¨;ÈÜ!sfÝe@RÒ) 9AU¼‚^¦”"}Ÿ¥šîµûô&~R]1f*Ó¼{>›ß&WõˆYHŒA‡„©š‡Ks.Pwóz äVjbñÖ$ ÷#ɶz2ãäú ì—¿&é& M&Ð Ç#”¦vŽœ%%-S²¤¬µŠê La1èØ*Ÿ<"¤V¸ó»Oã« L$TªW«flómŽcܽ€>JòÙ_ëœRb¸^ß>[`¶*D„Qz›¼×ÞS.€¼ÉL2@ôLpPèÚS­âŽZ ¹7§7ó€h(y3ÕÈb¬ÅÂ7ÐUpÑüI#b„;¼Â­3Dá„ÈÙM³+#Ú4®`#÷ÔnÙ„¤Yéz7ö`t bk¢ÿ~®óŠv  Ü›»%ÐþL55­4¸uÃgQªŠ߬ˆÈø2„JåñpÈiØívÓt|{{Ýï_^>íÓë¡L/»DÖRË\JÐ(“yíT$l½hE¨‡BÀ„s©9«$HÑÆªR¡Rñ¹ˆº§6|œÍ²ªŽ„áN9ÍÂü6ë«™j|¿J5O6 ’@qf0‹SÒ¤¡{ì\E%0Ï%"ÒnÀšâB û1â8™ˆÎÕ¢y©‹€tDÒìn¤#›¶CÜI‰°h?õp³ZÍ«…™•æ!¤¤ôŸÿð‡<»ï?±ù¯Ä‘ò¢&NìÞ%º> ÙðÚ_B,ôpÜ{ÀEA0zÊ>u ~ÜüÂ…ZË»©ì:Sp÷>BWg6êZšåQŽ“¬Ð¹æÂÿ¨Gk¹¤8»žž‚œXǾ—aì"ÞïA0íÈ'œÓî€lÐ&¾"yŽØ|‰±6ä"/u“îOWz<壒Ê]ºëÅ×Ýøe1`›¤¿¡½øDÛ_lU,îo_woúŠ>~«°È÷{]øØtä&j?-û/­–_1¶˜Jó4×RÝÃ=4¥”Rª"QÊü6 ƒ&U/sNÕê\SÒ:Í< Zª×?þéõ§Ÿ|žæiê4‡W÷/ô¹@¬F Ϧ;o."ôØ}»ïáI€ÃÚ­ç “KeŠÒ|O §Ftá0ƒÙk Ï" Bшk¨ª‡Íoá^f˜×yŠ:•D-pëÊñ~ò-(wš1¦9dxDÊ@ à7˜u 5ÕàŽh&M_¾¯ÖŹtö"@ؼœ`3?h7nÝ 8Ž!Bd "ÂÐ`ãsrHà ‚MT¥æC¥D©î,y’¤Ãìc8˜J8œ)åߥaÇ<º1\Á¤‘Bs¨É)YUS^”˜|š~ôY9WG&‰ã4ÏæÅ? /Y5é¡X΢YΤ€×ZìH›'fÕ$L@ ˜»‡èÔ(G¢€£y‹zíN³ P açCôö\ÄÚbJì:ª½¢`:è.€ÒÍJЪ×R¬²–*DõêÍSÝíÇ<Àf$… æZAÔ©Ja—“¦ê%" §¶(|;Ìá¶Ù›ÇcIÔp¸Uw $f±â! $™U·®›o‹€„d±ž¶€$#ÂPÓRmjû†Â¸0iاY‡Åt€['°ëÖ÷R‘¦ŒÔ‘}+íÎÃn¨@ Hî~œ¡ÔŠ2!+$`ͶAºj³W¾ÚZ€w‹`_šš«ì,~ÕM} DáÐÞæ¯ Òtÿ›#ì¢ñy€y{;›,êðIosæœ*f>Oõ‡؉’D±¢IrŒ‡·Ã_~üÉÌó )kTw‡fÉ»¡j`¡,t‘" ‘ ÉšeÃÕÝ„E›•¢*Y% ’Τ¦ôA‘Ó ¢1Ènü”TG ûqš…òý8»‡¨½Õ„0ÕªÁ€e!aTs¯â(zœ-PJ•<è˜9æA’…›÷r)Q5Í¥¶£E@§ˆ°mMµš{¸I‰³ I5«€»yÓ6ñjVÍæjÕ¼û$ýÏøßò~xùÝwýqždëô—“Í/!ÏÄÄ…KÖâp*MâB¹Ò‹‡Ü:¡¸J,ïiÂÞ ®*W0:®ZƒâRQó"2¹ ’Ÿk›•)±j¶¸ÛoK8¸¯ÖÈæ—“[clUa¾¼OîN†¹îzO››—]uø&ÁûÕt"éî²àÄmÉðJßó½»½ÁI®´¼7ñôçßùÜ#ÕÛÇí8çT0nÎSÉû×3.ÙAÏfX÷ ë¾T^Ú˜ÛW@Ï)¿ŒèÖ=Mó{è3ðÐÓ €¯íð½²:y^âÛ6¹óŽuÜoùõà™hp6=ïâœô3 _>y¾ú÷?ä‚óÄIý…%ЧSýkO'ïw…É}I_ùߘèü·W_ÆùûûëôJߪ>b~1ûõ.6kO¥«ýsEOˆŸô ô`Þ»ñÀ]Lvkž¯åƒðuÊqWœ€çŸÔÕ¹Eà¯Xu«C½]&¾ÍçñVÞñkvÕ¯§½Ý¯Ý|ð+¾¥dPü }¨ðb~|-sqo¸å4$¥!hͲ!D-Õ8¨ @ÿüçÏÓá0í/úüŸþËüôÃw?ýßÿ—F9N3QE<*•TMÁ°Ýhˆ¨€JJZÆ]Ô‚Ãg ŠJolï”ì›gkœ· z0‘I1÷02uT*"Q“hVM@6kû“yçcñR¼z”аðÙĨµ‹x´¦T›ª°€Í`Ó+ªÁ Q!4J·Þ&Òæjé*.Ð`kQˆ€D#+HWª©0Áìðhjwm¾µ'w(D8"(˜="°Ë° [… K €T C)‹Žù0RPBj “: )ÃÞ™*ÒN¹'’` sX¶PQ:,ŒirÒ€@…uá%Õ*Á4d¯eÿ2h©ÇCñZwƒæHŸ¥”R„ƒs€3 tsî²Qk †0¢IZUÝìp8xTÐp8*Iw†˜r®©0àl3)®1.[­Ì…_ ƒæ¢h2(ͳÍA©ƒ Òý6#ª “™Ê§Jž'Oy° s1+5åA²“YÑLD”yf"ا9ìtšjD‰R=G0äüÝË>‰š[À뛩@DrJeª>¹¸ 9¿½Õ¨¯‘Ø1îSƒ?>à HÌ ¹«ât”½%?NsR ‚R@ ïúhˆtk Y®¼t•d° d1w`t+78{'¾; c‡þs“ ÀàMMhÑ sX7n›´G¿»Nil¸?!@‚$¨‚ÎfTPDÕ¼‰n±@›çúi÷ ‘ºvÜA“s‚îÇ(µ˜Uo¬«a‡7£¢˜×p ¬ø1Ž}†Y÷ %¡*THNÃþ{Ýíçi‚CÜ\²ˆ©¸  4Q ‚~¬IRkâ¾O @wßÁáCнj)”¬:fÇT°¨*u—SEŒÙEP ¯ó1B‡lªAFr…¤0AEÄÝg¨ ®¤™‘„"bîµT0ªU³î+d7›ñf ÐÿÝôßKµEó¤æô/ÿú¯ßÿÓï.\—Îh‚?‚Péœ×§c—ëÀ:  •(n4n1¬Ç@÷5Íã½î™ŽÎó‰¼á×À‰~vnûoÃUËöχº¶cˆK{ODÛg ¼¶=âgP¾|—ûò¸Q÷žˆÖ¯",½hëó#a1¿èqÜ&¸X9ý¾¿ªŽé/üD¾M>ø÷׃•ßjÇû»´Ò·‚GþÆ&Æoá¦~ƒ…¥Tª/ø.~­¸ôûóž|âÆOž O 7š(±A[k€“y‰ÕõÜù²Dï÷TïúWl¾Ë¯¸A³O=õ«¤Ó¿ôP¬îç½à¼Elö)œ©mË5G¯ÜerÅ%ëh´ÀË75ôï‚øº {à"¥ZYÑoUâšP°60»ÜÉkUœ8».\Á…æÒVºu?»¶g¸¢ ÅéKãZÔh%htã w›=žX\·R3[!$×¢ëW?aœýŸ–¾ÞyÇø4 §›—.î›ÎK›]Q›.»ëÍâùgcgY=Úëgwînº8ŒpŸFsÝ3‡ #-¹/ëÞ¤ëôþz»ØÜÊVÜ•Õ àõÎs^Âwɳk=ØÍýýοø¸Ôì:ˆbc/ÛÍI>,äiRÖZÌÌÃá¡I“R•° ³¦œ0f±©¨aÓ1æ·c9ÖâðaL:ªþ¬´œ0䘦8Ë0ðåSê~L.RĹ‚ô¨T_Y’¦Þüž!ý¦D Aƒ8ÉAÀc¸8’ˆCI!‘Dr™«×€Èô6i"0Ç\êôêÕ›h¼&Xº‘€ Ä1VQŽ .nþˆ(hˆèL…^ðÎÀâ\zª[ˆ"-JëŒ3¬ïôN0*‚H€8ÜáAD´îo8O4‚P€Äá”Ð,{£¹ NU““0«PC6¯`èšã4ˆ‹*¹ÝE% NR)΃‡ ¬TBÓn DDÀLàÕ!€¹!œªo¯S3 Tp„åæð)Ì*¥º+Ìm*“[J’“kÉ‚Rfó]ÜŽ¨.®‚‘bŒ¨³»­vÄÜdg°¾…`ÝA¶ÿù4ïµÈ;À­©kµ·Fxj…$Ð9eJ Ÿ^öÃn_æJ—:UU1 Xj`æCUÄÌ cò@ÎÉÂÌM•Vá9ªJ±¤PIs)VmÕ¤¢ÓarqÏY›ÆRª»Càðc™b@Š!*h:÷6aÔŠœsàÛ\rxEë­SïÃn©aPm%%Ô‚„BÞ&¶õ%  ‚CäiØv’jPÀ‘ ð‚êHc—J¤)M0ƒK·°¬÷º¥°;Tû†#–€ËÙ i| `BÑ;ñÙŒ?½ì x}=@¡‰"be¶ðÉÞt Q­Öfa7bÕTw7Ë)'ÇC™ªª$Í¥–ˆ~ÀXéÕ…¶NU©ìR…v”¢Ædp‡„BdH))¥™P µ:|—ó@€ÐœªYŒßù'•×*hYHÊØ æJ1û4–¬Ö\G¼àîH‰?¼ ”¾¥Ï@Þ17"(ôjáJš‰¦+'*Bî²&ñpšQ@Të Ì—"@³Š1óêÍ@ÈÿðŸŸÇaØû¾;;›G/¥Ç*Òºþ5›s°{ ìgû¿œÀ.%Ô-Ko[VÏ¿|ê6‰àJ=o ñ·¤É×0èmSù:FЏŽiÔïBg2–,ãÔ”‘ÄJêE‚s¯ž2Ž>¸WÑê¶ À¥®:—q)ƒsK±Ð{¥Ãy£%rÛhrt=Ÿpž%%?‚%Þtw]{›*ë,`Õª´¡ðpOà «ïXù¯Ÿ/òÞK \c^LF¬aE|‰Ø·°›ÜÓTÁu^w%[´Œ/’>ÆÜy sÍžnpkŽáÄuYgr]Ow¥œ»VåZ>ˆ·7>‚WN…•Ð:y=Çû‹Òí))Yóѹõ™'¹-ࡹî&`÷PÒ÷Ä¿êz W³–È¸Ç XR½‹½ê”ïÆV ¤›êÅ·A*¯g.Ôºx“­ß,ðÇŠp©ÝÑãJ¿ëC˜Þ6³Å»ºò–fH7ð’Õ‰‡Ûóãpä»àãêâÝ û(|;€W=W<³Ûxà]§“Ë¥}uÐ<«¥þØŠà*h¹³”ð͆ÐàÃ+Cà§¢óŸæ-It³p¾ ¬m¦W4Ä[Û'÷x~&·W³¹±íÞ/l®‚;ÈX¼»òž#ü9,>ƒokËt{³+Ví9ŒŽXCŽ›Õõµ Vðß•–Nœ‚àk úô®|n¿`µùÆÆöµVåàm̽Ú×qâ\†Igþ}øÃç}\¥çy^ªÒ¯ª%K­c½i^É2Þn?ñ͹øÌ,ÿðò˜p›MðþTLZ}ܾW »Ð¿Ý¸í»5÷›í~c~Áhm2¾²Ê½²ÝÌ宲ˆÕ­Ä3u×XW©¸ñãÒ^ïáŒºÛÆtg6-lzl—I6#×Sêr?Ì»(¯ö«Ådâ´6 ¸1Çâìr=Þ±5º^-ÜÃü c•,ô€p3+ÕI3“Àðé%@E訦r,Ç?þOá”3Þ­™Y“>¯ÕSÚï(IèU1—ÇCÚí Œ@+{Ò¦`®²ü™Ñ oD1U݆¨V"B6›Q Ò¦”%ǰ߫¦ã_~t+6½Y)VªU@!Zºæx}3 *lˆq\Z­õ¼Ï Â­Ë¬7Mö¶É«vôA{wv«´Š‹UØr_,å«›™*‰pP¬%ÀXLSÙýšY«,½Ò˜M H‰!  lt*èΰ FõB €yÐa'Å  1¥0;Ó@¤hšD¢ §œœá¦"Bq+%¥:ÜLV›S´*È.ù~hÜXˆ‚0ÇlÕÝÇœÇA¦i¦×QYÂ…pe š*ëTÝ'÷šá5Pª™ R;ÓÂ+Ì X…Ä22 UÂ/7€Ö>ž›5ë©\ºèÆPÎu1w$ÊnÌîæáŸ?¨"1íl†ŒJÀI²@E©IݬšÕ!žj)r®aš¢"ùt¬QÂHU‹Á:ÕC™ê<çQsNÞJ<”œÒ<7­„Áà„ö¹JŽj@“EZ¦Ž®äa0…,¥ .‚ÀMÀ("P+ H ,Ü‚öÞ„@ºYš8U °³…u< Da™˜+&€3Ü)Â`ˆP³X©"péB=¨ÁK+…ƒÚõ²zi!í-è|…^ÆI`î¼ &¸/wnGœF¸cÜÃÑh42êNBS¢¤ Ç˜FËäp¯uÖA’""¦:ñþñÿô—?¡*BJŽSqw)'*h566BŒºäPQI*)¤˜”cQj ’TD…*š$¹à´vE¨Óf.Å>í~À…ßa*æ9é R€Á@š«쇀U„¢!:¥Íj&B‘vÆäÝ”7«l…âˆXUBif¼ÕK€¨UR´3@8‰¬¹”â  pÌÕª¹™›·ÿFAMúOÿò_†—ñåwß³ë´5±¶X€þ~ðÅ©n½–,¹8øþï: \ø8Ÿƒq)d~ú]^Uò×å×]ýø àZqòÙ åT‰)Óv2qý–¸Ñœ[ ®µŒî¤*÷²»xBJå^¸ºúð{r+¥ò®Z.ïÜðǺR¶.)îAf1š¹É¥F%Ûßà"ÆÞ’^Z5÷œP†+µªM¿°Ë;ä†uÙc·Öw­°ã±£Þcür³oèèzwþÇå¶ÞÆ“ÃÈ*1áûSºd¼Ò͸^æqZòT¼—Ó~|(~éYúÑ"ÙóÊäV¹_ÞR‰2N ï tâçÞ@þDçùÛ¬ñÔ…âµãæ½ües~¥õcXw½›ÙÏñ}]<µ“}O_qãל~R¿k†µ‰I!šƒÜß§ïß_ýúé:BŒ3Ãèðã«ÍÅÍ!IT$+E¤¾Õ@ìvC©ÕkÍy„„j 0<’ º£?À×_m~=¾Dâ哎Ÿd>ÄnpÇ1¿½áÕÒn—U4‡¡’U³µ~8¯@¦ÞöeMÈÝÒ‘M[?dAöÂ°Ž£ µ«Ã[@C“Ú\ËÌ4èOÿãÍŸ_ÝJ”¹ÎnaˆÒaýZ:€È o þ„¡ ñKZzó®š7iKÛV¡ ²à"½*, µT$EVP¼+þ»KÙ úlê(«¨Ž 5Bädv ¶OŽîŒêìe2bˆ€ ÈÉ€(NIB I±J=~6˜$'JÃfÐ)YD.‰’ÒBG3'œªa5s«´póÓÄ(¥F¤Q#ªG%êgªŽSM‡R3áIÜk(õû——,¯Çã4Ï’ ¢êLˆ·©xø0ê/û?ÿéOåXàžµ·“aM©°ÆÕÐ.-~:¶ìÎYÐc¨9A†®<Óë÷Þùx¢ø<Ùî%˜ŽŠâÓïÆZâøêV«UŸ¬CÎYkµy.yL€Å´*%åd³Ãaó\(Ä@„û0>Mu.9ç”Ä*£ÍNS3óR+è*[:ßÂàs¯~¹w”¼ã£h¾ˆ˜ºˆ¿|@X—ËfˆBc©£D'¦ÄŒ @à¥Ïa—³gµÂú[¬õm+{F´«ôp41Lj "eh’,‘+æ©2P: ;b@ ô•˜{­«»d®ÝD…Ž‹tÃT˜A2ôšA 4ÞG ¨.„ŠÀhaÓ4×jóTÂ…)ƒœ4g«NaE%¹ûn?gMÊÐÙìõõÇZ*‰!ÓapŸÒÆ×ù à’¡5 *–9é>¥BÊ$9Ä)ÉDÀ¥0œ>{„Ï^ƨ{8ê¡‹í†Å‰œâwŸT•1aˆÔQÒìR-(–Ô«™Â»ä6ÒdØ !ìðª$êT@‰ð=‚„›{xn[’°U†·âo¯‡«H¸Y-±ôû3"â_½Aÿ§tETþáŸÿÓð²ûî?üNº½É…ÖeGüOü³úŸdWMñ®âyÛéå+y¾Gàqœ¿‰/~ît§ÞÏKªþ½ÖÖ‘8õßþnÓ=È ýKıÞkû…vºŸ žá½Wøûëﯿ¿þþúûë·zÞù·6ñþÀ·ÿfOŠ fÕ†´þ]6™Ø å>ø”¾|ÙºyárÆ­sçükmÄ–«ÑZ~ý?ã{‰OùÜf\$?ܰ»Ž*—1ŠSWªaø\QáÂWXu9µë8ñnÏ”Õ5w ]çY†hiO^Ú–±ápütïÿm&önöÄ ܧŠudÏý?—5w˜Ô8É÷ÜݬÜh%]•ì·Û­/¿kGƒ§l+îÙ[Ýûµ§ûÔ¶Ÿæ‡r¤›+Œ«~þÍV¸øÈ´¹… nÈïëh}a§í岉ì‚ʳVñz°¨×ÏêvLÓfu)«¾¢åO\Ì©íB,rm€­T³ò¹fŠRÊvI©š$Ì0$MbË<Õ©ä!OÇâ?¼N~üq9}áóÿ˜³ª0íwV¦}‰!ï?ð ,É ÎWò5åÖ+i±m £ÕÄ4‚W·²Jj ­MŒŽ:»›&ùE Õ¦jó4ý¥À Q­ÔZÜjGí£¢ðÒ±ø“<³¸ eaÅ`‹Bºõ–T‚<œÅÓÃ"%øâLëM¼eùüðÞ Þ…ZÝ" „ÁÐfà"œFëÂîÏ'z'ûЙ"„Dõn•¦ÒxZ0,*( s$È°Š‰3ÃŽ’‚BÒ‡“ô5Ü@dØy«”„«ŠÒæ=R0ªÍG„KÀŽ%ÂŒô1å‰Áb6ääÕ‹Ê‹ˆ¨Å¬’¸+`V‹ ‚!j™)æéP~,åà^a¥¦Í]%¦ÎgÁ:%p ,ˆ¿/KCVËÃI¡ lÕ émóNˆt}ü6õ<êZ-uМ²ä!YñišUN÷PQ2¢1’®¢8æTæê°Ãá­]O©†”wñ©LQaÞÌjý¢€ÏÞÊœ_ލ€Á ‚PØ ¼‚Ù ¨™ŠZ»+5a°Lˆ’€€ oZ9Úíeé‰$!ÍŒZÚh,ˆE`ªSgˆ:A”YÇ,JQQ—a—4Yá³ ZŒÔî=Œ pü ³Î¡€uiÁm éöÂm±8 *$C4u èÍýw·ðð¶ÖÒ(ûq¬Ló)L*ðs·:Yª9%Û{Q=LS  þz|=Ö9QÂk“*Óæ…†rœ³Á P[µB($©¨RS¢ì3!(ÍŠ;àº8†0è– ¬Öœp_öÿaø^”"ŽšÝ=°ñýÞJˆ j±ã¨ ´$.*S­L ‹ÚKnö¼ î‡[« CŠ@­µUtDH(‚µ UUÕ½VkgDk‰uw†ƒR‹™-Ü-joùoá(•ßýóÒ!¥œö?|w‹)ÇeÙ9"Öz¸:´.N5Þ9ôN*‡‹š~·’¾äìßD½ça‹x/…»!s“ p%ˆ€w”¿ãÒ7ë¬tÃ׿VÍìGz|IGÞ©ûx-zÉï^‡q€òVþæÄ­@»Kª>õ[¤é¾ÀU¨ö¸ëöÊáð&|6nÜï´1¶tõª°ð\â¬ÂÇÝïkRÈó×Rëø3nfÝy¶?#dñŽ ÀÂÇçzÜŒ§†Þß @ü·i׊¾—W¾$ß'aÒ $þ¼êqCþ¤Uu¡ÿ»ªK®™WšÃçM0pž!ßÜY î¾ûÉkóê'3ñ'sÀå3?"ÛuUæ½0‚¾X«äñÍ~esñ&‚qÛþîÅßWNã3¬²/®ÅÆQ'âr‰Å'Åíò—âv|Ám.É'×é­W妖ί^~ŒôüM‹Î_ÆIÏ Ô ,žr7„µ7‰ïÂkë·Á£yÓûzÛö« a{C#!óëØ»%»ä©p¦.e˜ÇXÛö]ÝkûÄØt4Z\ø>8D¼#Zë˜ïún¯% ·ÎÚ5lWPà ï_Ù,÷:•¬´—ªørBdZÂ¥—ñ9mòtHóT/`²˜wºµîÉ ¾ëö!Š‹œñº2÷“³•"$·ø þ¿ÒùáýŒáþ¢^7­çÅ¥þ;¯FùÁÎrGÀëúc7…ÿîi1mî½ñцrùg9ñîWštO`å±½…­n›§Å•:îXÆ€¾$´·IÍ:¯ÃµFjà¬eüh׊ӧßÖ%o6¶¸é+‰€X4zvE^úz1wGt—„I(s˜W„ŠHNÙÉœ…Ð2{ÊCÓáuªs•úùå{-ÇéðöЍðâ³}ÿOŸTwBh’h)JŠ9ÖE)9 s¶ø‰n)‚Žpˆ A¨kªjMôž’c°fÕ,´7ÀÖ¼(ƒÐZ&—*/Jñ2y ·°V¼¢ 3 MÅàŽœà€æ>*MôÜðæ !4fP…hWŪWeIt¥»•úÒ=ݬÌá¥éÉþ½gòÞáKÝ?–$‚‚0G8ââí½ÒnÀl#D€„1 ãÀ¤i.–wA†ä‘¢¤pŒ0ªÖù5bLºóRÂ_•{@ÃÀOJz0¢8•Áð0˜‘˜Ç!t/˜¦js8ó˜U’›`ˆì2à^ªWÖg¼Í5¢"œaXµ,<|>Ôr„¸Û±hE¯á©é¿¢©3 T¡àhFhŠ8uåúË•@OQÐ…®+h,@B“ c.¥˜»¬á)'«~x+ã0 ã0yš š–iˆa/ÕÌJ×Ï•Z†ADP@,*´æ)éñXæJ”R¯~j‰Ž¥»¿ñKNö¨š`eaŠpÔ VȰzW—]µ^þFŸozªÃ³‰èVa3"-» ‰- 34½¬h¦ÜÞ…zšm@´Ë!ôwÿôáaÅÜ"rjÌŸ <˜4æªÌÜ©„e©`x€rp_û57CÂY@uñ]RhBJK+Ý¿€d@àa_z46‡ yL{4MÇ5æaEôc=&Oµ–¾Ô:£jÈ šˆ ÏŒþ]¥{á¿—@xì*ê ó ¡bб:K0`*¹zË](d³È4虜Nö¨( Â=Ì/(D´µo¨¢^«E´ÖððEBž¤ª ÂÜ ¨ˆ—ê^­T7óbnæÕNú$%©fýÇßÿËþ‡ï¯àöEʀ׸®ÊÄ­;ï…6 q)iÀEå§éD5í/„ŸæóÚ@µ NžpÏ{9ç1ün“6ôYÖú?ëð½)†_´EÜâÿç÷-’ÙKŒ} ÓDœÊ!q-9{­]{•[;|T…öî;ø \ÖÞ‰r»âC5€åwÞO¶ï7Š<ÌÊGEÎ@[ÊÖ>¦q9b7WÍ(Wiöп~.j·‘óº'ïv)ñ9¬„·yû#œzUA\ÝdÄf¥g-êu¥q{½tW—z’ûŠÛ}j-n³nC<5Ô­oˆ>¼_E{Üy£¹j<|ÊE÷u´7$‘ßûœ•vÕf»jÎÛ¬*Å …‰¸v DÜKE7e”_eâ¾+ÌGw¼§¾îrzßÜQ™ÛÖ¿½Ú»»å©¿X›],Ö›À“Ôo1Ûßvï.«µÿwoáà/Ó²±…|ÞÎÞí¨ ýõ‹Î/fIë'}/>|·\ñ½»ûu ¬lªW~ã\±«Ç÷õ©Ãÿ"g‹ÓŽ:ûÏ|#ÏÕ*RÊ¥Ô2›’9§¤P”*œëÅ¥LÇ"‚!iVÊ‘Ú4Ÿ£•ÑŠ4IT“šU3˜ŽP}VøâÝ”ú})iêõ j/uÄ‚õ3 èó“‹4PW< ¤&6%‹|?à3P…èLÐ^ç 4‚‹uÆLwTèÉ È•œ­š$½‡¨2ª ÷Ö/ð£%iá4¤èŸaø¢â$Ú¯¡ó3IPÅ÷½äCéˆgr$µ¿Šjª¥Öâ^ÚÅ»¦¹ìö£3eU0†!»[A¨bÈúúzp•¤IqŸëTçØ‰A [‘N”1Ò¨*Iw U“9Å(bа¨£ºMEÊéæe²HôU4ýðÿ8~žDEÍ‘‡ªá1¥e8ÔœöÙr 'ž?¿`¢ø^¿Ýú½ä-)ú‚ð\ÙöáH^+y=7æ5øÇs~{m"ž‰£·@”¸ä¶É¹QxýóÓa²jápóݘ…@©ÌCs‹lÑZ¥sßÿÃwœ§˜K•éÏC®ÇÃôÓ_^]ò8ŠŒû½cˆH9îo*é»Ü0cŸö:`©Ó«ˆÀ2:Œƒ!80rDÄH¤VsS—@ DÁl°:ÏaT/³O³oóÑç£÷Ë·Õa€£X…*ÄA‡ØÒ“: 퀀5XŒEÊ#>IúHêˆdÇO TPZÛøÉ„¾·H7tM½Ïºµ€†”PÛ£³lYõÒ¶„;‰æ’L+á6½ t†´70èZ‹kZP5õÞèR`.¤ ^鳓4Ì}÷Gúù}Á›”l…:T‘DЇyŽ"B· ¨CN‘#ç:ÏíE1¤´ÛoÇùí`Aâ§ÃñûÝø²暪E5s÷O¥èêV%Š“ðZ Ž0˜÷F~+]ëzõ†øÛbÐí‘Ï®Að€84Aò"_sÒп\Eî.RÆ1OSišM)s!<ï>‘T!˜§2a³OVI ¥VA-ègÍÂr€$’Fu7soíê °îu‡¥~ƒsïè¼ÃMÝ^›ãu;< Ë[ĺ=/+Ö>g)DQVñN+?Ü  ¦^ohmån(:¢™IP¡Jè!ÁD¨HæŽ*C„HBš¹ûÄáŠ*A§@„^+Ã=¢R£„C:P»Ö¿ $7U—Žþ‹‚pÓ”‚d™ t¶;m!Tí‹É`‘Eœ2Ï¥† ST”1šEΚ³W3¸Õ°Œ å\§ð#&57U”(T„’%‰ S’¤¤»POŸ²*¥†7š…·ÆN¨A æá*ð9ÆQ“þáÿYJeRò`Êš¨&A…jUq¡¬9››“ xÉ“Õ1Ùn°€»ygjŠ»¶>¬!Ó{X逪ΥD«½”¹»˜S‚ÞKLD˜·#¬+VæâÕOMýšRÊI‡´ûîå?þáÑBß[X‹«xñÔØ­ëO¾—§ÚºG8.T*nâê7ÿ~R¨äŒrÓoUDÖþU›‘Ïeo7Ú?o´o¸§<¶ó½ÉâòÆN}¬Œ’yÝ‹ ªÀ:äÛŒr~Oôæ2_¸j ]Çöüúÿp«r¹ w¥fö½ÆshìZ|2hŒ¼{§W½áMñë¿^Fº|º8³6²Þ¬H]4uq^~Õõß³¿ÆMãºýóB!añ†Ý¿5møåYà ï!N抧­èb¶^6ãÇÙKüº-ýbϺÓðÎKÿÕ‹¡X%\ׯ×[͸ÏêÆ×÷Tþ’e¹{Kä¨N\ö±_+/ÙUë}à#Õ/·ÍîÝç2ǯF pAŒx¸q]4?;šý-š+?ªÚôä]|ˆX°Yø¿§8ý¼ˆÍÕÄøæ`µËžƒÆG†éëç_}‡ù¶¢óL€?ªvz½DíÎ9è‰4öX]í½Š+ÞêEœð µÙ¿ªz>¾lÞ„í>$bìuc×Èî¸ÆEVñJ­{Û¥w¸ð–ã*Pé»-OéA“³9ýzK‚6/š7⦛ht›4^mϨõž±/ƒ¸vHØ]—€èªô+9®g­ÎÑ•|p–QŒ•B—HjS_ea6ŸZ!®3–«%ñ˜q7—"Ÿà¨ÞÏgÖ$©sÓÜ)ø™]l)ÇëZûÝínIã®âæ[=Á/0^ßÈaž!<Þhi]¥š7ü-ž+Qäu(tºó-LàɃaͽ}Ò bí‚»6'!/ygQŸ*ë#äDN>Yqœ?öfr®2n(Àö%xøñóü6Õ¹´õ²hN»AuФI$Ò8‚c¦éO?´j))‡´ßë_þô9y·Ûý÷ÿïŸw£¿}~ÓîSUÓ8 ã4ÕQô»üÄa·G3±C 7†!ΜÔÜá³›yÞ ™!éøæCöÌ!ÉÌ5…HJ”E¬¼ë!¨eŽr„}n(­¡ÿŽph V„uáò†u’à°c¯Õ@@Ñð}éÃ#„Œ î]ö§u•3Au‘%Y54„À¢p_| 6à t¨²Øa¨'{Èâkà„¬áÑ1|E8Á@"4…ŽÖܧž†,ûµ)J«`ÆA9`Ç7@wÏ*Ô2WMAgÞ%u>†UÏû©Š1ဪNÕ1 "*æI^góV/"<o:Eá–Jz­ajeLoÇùx˜Aš‘ky;†»*¤‹~ êð s¤Ö î@³ÀµZ."NXþ Øò[Á ©× „4˜€¾ˆÝ/r@­q~µ}ž‹Uw‡ªTó¹”0ìv#‰ãT’R„V¼”Ba¦æ]z;L k«µ6ä´€Ò™"¢¤„;<¼–]keY‘~Ž6z0#g—ˆVBh¦ÇM冂$pÐÌ¢[Ë,eù¬Ñ Q!Í9à £¢ O9dQàèŠü’ÁŒÜf{^L­Ó(:ºK­ E$Q)ÓœЍ•bÕ©Š C”aQàaî¨dH[ >„*P!„)êqiöwxcÛ´*šöá²÷7ã ê²Í9T i‘ä2¸w¡Š’˜#àÁœ”dJÔ”J©¡*ª)Ó4‹Š&}=|)¬†Ðò(6I˜—D¥P“ˆËè¬Ï*.RÁºSg x.m+Ɉ9âsðw‘~ÿÿAþ©–>ô°¬áQ-¹sÇð:/ ±v>Ø‚µnTyNâÿ§ë[Æ3Ö£t"‘Ÿ1±Ø@!oÚp%:øP¯à"Ì'ïþÓ½zþrV¾_â¹éìÙ„­?$Ýdìë·˜ãñNð|'7®•ˆÌÕsâ€Ã¥àä9ÁÂâqëG3ôÊXa®º×KxÛQ+3¹hœž¢Ÿ§‡ô^†r•F\IÿŸ§ú©è13OzY§âY¬q™g´×þ7`ÊÅÃ\_y -­å‰6[z4T^•mnë"ÏLãwAØ{ªÏ@±^¸ëcàÝ¥Ú³òà%úßá…õŒ}’ ô$ì ~ç™-è½û¦¨Ð0"œÕíÛÅ @üÉ[¿cDøAøõòdy–äö¿ä)<]}7y¿ q®ÍÛ71§ç6;l‰À<)µw«|µ*vòÈz×Nç©jÙß®è|\MÊõn|Oèq1àÝpñêí+\þ©þB¥²ÛÙû`ÌVÀ7ùð´ŽCVÏë ÷-ûsém¿=¿Ûµf:§Ü•Òúpñî1àÙÞ`l¶Üað)„v%3t§0z!WÍî½yÕõðíB›O ÿ Z'6<˜~ýßÉn~>^óZ†ö¦åíWP¹ú˜ÉÒÍDz2þøÊø¨ H<i}¹ªÀ½K=+›^¬òù0Õ¹´ŒÑ£îvÃ’ªhÌšm˜SÒZãó_ÿñ_~WŽÓ‘c9Úqò=þée.ó`ÓáTŠŽ9e¦4¾Q‹UTváy©ù»ìõX“ê4OG‰I_m ’ªf 4H·° G÷·™S£–2yu;R_%€Ù¢4èR™Bjõ.La½å „£xW‡É¢¨†±‹4í‘&ßß@aI‹Ž|‚æ^3•¼ž€~²;—"`6Aúoðv1k]ÿ€8"0ŒÖæîЛRS‚Íåáˆ* ©U3C¥ÉÅ"Ò ‘îr\½—:)ARÉi2Ân»Q•ZÅÍ$¹&À@T05qí ŠÚ±2™ªÉ§ ¨Õ«¥1çÝVÍP¦£ª¤aðÙaáó|¨&¢šDs @Aš~;"¨ƒV;Ò+Ãs:¦ÏÇÀQ¤ÀACrØR Ýq¨oŠ7‹u`ÿ+`ÝAv5ó™°V!"-’éKSyÇ£wÍw—ì€U‡BÇD“ùXÌÌ ÓTÜy.å0_ö£È`ŦÃLåH™aµÔöP…¡/¸À˜wS™¼z8½3Htãã,ûÓ‹I„jAjÓ â×, y±/6ƒž¦™¬¤»ÀÔ ¨p rZàÔtp;3˜@d€˜Q !”$:Œ>›×€Ð“¦$ x”ÙUzõ 8„©+R$à`&‰ZÅÙ,DÔÂàtTïÌoÞ\JkÞŸŽ,­šM›ˆ„7¹-AσÓ”"@…@Ts)e¶„; ­f>»‡S¨¢ÇùXÍtPI‘TóTk¡’ hÞëwÜ%£©@DC„Zâ-AʨT%XBæcáŒ$©ùŸÿMSŠïv®¢/{s#S<*$DL”ªÉXƒrLÊ „LÊì"`0"§•¹„J€îî)¥–ö‘¸Šˆj5sZª9Ľ¨ªu$ØIªòÔ¹OD¸{uwg j±bµT¯î5©æœÆýÿoÿûm‚“çf,–O'¶îi>>oüx’ âC(ðì’´ò~6½×-u•¯ž4Íßíê ‰Ÿ½E.Ö„'ƒ»'ïàk3ÄóQÖMKõW¥¿M- —ŸáîÞûv·=¿*¿‡¿ÿ ~ní)lôÆÜŸW‹ŸÄ—5×ó¶ z«#ˆOž; ÿ–_ñ^cäåÏã¢7W*雷¿8à¯k0¿ðG¦ŸïœD~¦Sëß›è<î4“Ç»•€ˆGQÓG2Ï\áfê·1abmfy.4mAwLcü0Ç‹Ó÷ªd‘T@³ ^Ð_7YoœFñü}^Ä&q/ÁØ sOöpÆ ©â„$_:†žZ³Öþ¢§¬ý\¶5’—˜|ÜDO4Ы qÏï÷Þ7^V¬®ÿÇ5(ÌKÌóDU oý§ŸÉ´àa#üG³£€vmJ¼%Âuñe'r̪pR·â7¼o²õÄCàû™(O^R×è[?»5_ø¢¼bÚ¼ã‚|ÖúŸ+‹±˹EË]QêÔíu^(MÇ?χ©çð °ÌSÊ)§$J Jz!bž|žkPê4>¿~w½ÚŸzsóþù‡¡Ò}üÓÿæ>SøõaÁ5³dû‘}{9ˆ‚?nƒM®hWâšZúd2ºÍ¾vÖIDÜ ùù5÷µwß™„|?·».™0xjþZbžó®/²tQocô«q>a¢ËóßÚ/N ×qÐ}þ]{ Üšî+ ¿»¯]"Ð éOEK„q&ЭŽÔX•9Ö×»6ñϬÆw·Ë‹=åbr7Ò.§2ÝÅÚ¥uWuþs,<¿# ŠE6ä$tÑïöeþ]›2GÏÿƒý¹¶÷u+ûºt‡æö-N”ÕÔæ:_[›_l¦(«Ê×-ãÛ²Wä5_ö4=y†;/J«É³YèÑa—aŽõ!A¼ýù§ùíXçâÖÛtȪ" %„†›‡E1ýñó\l¿Û S–ÿùÿûSÒøéSµãëçùðù³G)s!«BÝÏGh’±Tæê.›¿ÿ§TÃa1§#•7NSÞ½êp)æ£ Bñ¹ÌâGóéøS„IütEðI4"fw aD8Šu?7xmØ3ç*( ¢BÐç)!åŽ6¬Ö•ý«CÚ#³Ë êÔ€ìð²æwyzTØŒ:÷ý¥‰l׊ˆÞ¬Ý14D˜…“ÞhMkÞd»É`‡F¡lîá2TÂM ^]4@XÀÝUİÛèeöˆ¦ˆ’“R¤ÔÈY,êÈ<×0ך8ä\"ô“U‹:QrÔ£0ÄÝÇOö¤0¤¡í‚jíu%Š—wj¬ÇB dñbŸP‰a}vŸ ‡=¬º;Š0D è€! ÂÀfÚHX¬H·nÖ¥ýßqÖ÷·E-§7øŸ*r–Âo¸$!°îùìîf%CÎ%ª&-¥€°êšR=¥,"µZ ¸“‚ðv‚_kµP…Óëq¦ƒ  @ºíóّػŴU¸wq.èüi…×DgŸ€4¯ˆÒ}’Ïv‹enc$´9çžì‚e±öFvyÜG–& _ÃE ’T@¥nŽ$D DÉ€Xq@@w Ò‚F¡tZŒ1‚÷`°ùoG]¼¹°!ˆftì ÀV~kCÔÈCF5¨@X—Õ:=_7¸;´x8C’fЪ[™Š¨N¥ºÆKÚ¥$`¶É}&M_ôÿÏÞß69’%YšØ9ª÷Ü=2³úefz9Ó3»Ý3¤e?ðÿÿ~£eÉÊ’B¡È®ì’Ó]]™á€ÙU=üpÍ`€Ãã%+«º¼»£#=܃ٵkªGUŸ³ËMªux.OŒT1 µÔªsš1 a%YàSjL ÛPrp›šÿãæP-ÅL|>ðÛT¬9ÆÃ˜‰Á°^Cøa§§]ˆ"žàñüd4'õe–ÊÌ*€4¾>Fsö| ˆŒ>ß Ìø7÷ÖÂÝqÌZ‹±5Üiš«‹ÑblÍhÑZ¨…2Õ:J‘V¼ µ u÷Ãó÷_þ Ο=$ŒL‰Ç¶ÿþÇŠÕt)М±m´*vm=ôOJ]½ÐzÖ}þÎBâ‘Z¹¢gpS`½©¸fuóóóýFγÇðYW͉ý=ǧ«z|oÖÐRµ_uâ¬ÝxʃNXõ3”üy4uüyj[v¹($ÛA˜¸Ù¢°q%oä“×bÊ]8ÀÆëŸÌÏîv—Ÿ'¼Wáyö†WÓ­ÆÃ[tÝ»ä}:8Ïãý÷vécIç¸Û#Áã˜ý\T.ðôŒ €EǪSæ”ërÜgS%‹*skŸû§–&®Sª™µ«kÅ’ëüãB¶X¨¢o`Ķÿ¥€ö¦v³Ééú²Dì–ý&ØçAÄÐyÉäËäMíiÍWÙ¼)O3g¸‚Äý*”MÚØæaßWV‘ÕÇáånyÊ÷/.â]Ç›;¯±imÅ—%‰3Ñëôû·›;o­«ëv8Þ_![³í•¼®jßyÜší».Zß*Üߦ.ø9oª´›ZùÝ®ös4ßwñƇ½B„i½7¿Ùmü¦úü[‡Îã ð§;:ÞcZß—Áy…Ï:T~‰uĦھ9Þz½ ýÊåç7ã:a-_\»3s®ßúüºÆ n€µq?x¨zñÒ›Šê2ûzQgZáqO€ÖÏ˸ö‘øƒ_° o 4l™Œé‘¸Bñ>0[ÓâgÖ:çŠê÷¨$?Á-»ÂÜ®óæÀeŠðŽu8®ÖÇùe5€?¬¾Ù)]-ÅïÜ&pkà%ú ^™ÞZŠ|o§KG±Ï#$øúó/ãçÃtI3ÇÃ~÷¼+ÞíQå¤ÕË$^›yùP‡qœvüÝ?}žíùGñóÿòÿÜ ,•-|lœ(Ç]¼IðRŸXŸw„±Å4ŽÏ/ÏãØŠ#SHå¨1J„«%8H)LCñ2iÿ‡}Û½¯ñ)óÌ`ó ɧEdRAYDÛ·Ì6« @°:ÇËS›¥Þh #e@u¨`˜&ÄçÙZ¦>Á ÔaÖF» +W–|Ùõ—N"°Pþ;¡>bæ–hB‹“³J&2醮–ÐØÝÎ*É Ô<憂F%•…ssouɺ!šÐÄjò‚^©0³ÌÙÔDÏÇëNÃÐY7fNXìj>Pˆ±+™À¤2`Øõ7ÃAUNƒ+55ÑKƒ¼2L-r¢;‘Œ½à¥o“hMUtS†¥€$˜>U{=LŠ–ÉC›hͼã”-¤ÐÔ¤DNpƒ%”h l`‚ 6Ÿ½£_éeÑÓWº?–9"Âlv ¯´I.¹0 -B3¤~CS"1ÅtØçn§Ý“ OÞZÐà„z‰µí[dK“[‚”»•R‡VzˆÈ¾ÝP`áÕôƒÎ6o/9ÍaO×¾;@μøæ°þë}˜AЬ€ÏÀµ¹æt´àÂDWCjf[Á}£ip¡†gðŒ@N0ƒ]Ö4ZQñâ%#‰¢JQ*ejÒlý<§3rJ’4)aD&ÚP÷sƬã³úÜ'lfïâEË„í€ò4—Ü̈“-}€9cŽ‚ÙPtƒ‘,.Å¡  MÓØ£”OeWhÎ ·ax>å©–ZXJ“YÝÁØD³½azbq4§½å£¡øóßDÈ…ñuªCÉCð…Y‹ *üè%ŸJ‰|ÚÕWàùo~Ò;³‚ÃÔÜsgÍù‘Š4gd3ƒ÷Ê™”³´7 ›fN #$Df¶ŒÌ>™0R- ƒŒ‡6”Òü[‹6¶ÌŒÈ˜fÛAffÅ{ãÿúÏÿH³õåQ(;™=E¿¥ðrO-ë&âÛ6Q_6’ë?×¶Àf¼–[¾| ÃÀÏ¡« é‹¢ÐÍO¯5rýö¿~ €/¦l¿yxë·…Ñ_çë%|žëQºÔi¾uv}ž&¾Ecþ<´ χ¯=ßÕY®ƒãkþ3Wùå-¿® ~ñCgã4{~–¤_ú‰Þ¡®+õÿÛ®–¯ùɯ¿qÞš¸ê¥ä¯z®¶1ù¾¡–-©ßõZü&¾Õ2x0é~ót]4wEþh‰ë}gá/Ðù?ê×ýQª HÞ†ÃÿZÛø#“aL9ÞÏëá¦[ó°ÇÀ%Þ`ê¦D¼±w\èw+uýfÔü¶µí‡"«s}+²¹Èô±ý­Hë½ãµú¹µ;Ï'nþÒtׯÓ< Í•¹(|×ÔE›½KׇúƒNßUŽÎz¾m*sËzý’_VØ^§î¥‹OÃí8ksêuå©vJ‚yä2@¦Gešû§¿”]­CñâÅÉÈÎ3He¸ŒÃÎûøý?}þôûÏS˱M/SÆÔ‚„×2ì|x6³ZžÐ`>~>xÝýøòã˜úåçO/?>»ªL‡Êœ ¥ ^¦6*µ“(ö:µø¸WyÐÅô¨I¥ª,)SªcÂgÄr±ÀZhŸ)ÉÉ uÓZ9M:4 Ža3³'p P‡ ~ÆïLàì´öŽl-åSu7ÚŽ Øt è-ÛÆYxëmË)’Hu¢?÷ w‘ÚGcÕ@Sov'L Yï÷wª·Û§h”Q"dk1º©µ ‘Þ"É|úHG©ÔbRhØ¡e“ðú9 /¨•Œƒf±{bÓÐ&ÉÅÒ² *å©F›xñÖSzmL˜C¦h‡Цœ,ÅZ=D¢K8ÇýäƒE›"&KËÔŒÑ#¢ãë;Éðn·°@~"•Ãíú¾^KÿXŽ-¶¥ÌÔ^¼éµ\¬¸K‡õûìÞ¬Eñ‹œz3²Ì¯àã«Z-‘²Šqš ‡Rëø)&å?€3Zvµ› Ÿ.!C/­¶œYÿÐ2ŽgáꬼV­ ûXº¹OmÊ9}'²Aê ‡åe{á$—ßK¾tM÷*×ÃS }Æa÷öZÚ€á…-‹…eN‡©øŽÅA'ŠËt˜¬z)#”­å¤v ’¢ÌHëæÖ„˜ÝƒæI†Ü‘ 1!Ä"ëwq9æëÒ›sBkð‚R¡£ý† X”hÇ`ó'%‘ÈP#e0QDÓ~RZ¥eåSQªC-ÃÓ.j…^aÎ0OLŠM}g†à¾e„ö7—‘ù7/Ù4x1ð„yþôbÅ'ÁAªô"…y᮸ ‡@L­’(÷í•-ÓÊΪY1LÒHäÔHx©€BiÖ¨3”êÀjdŸñÈâ(#ÍK‡„efkéf9å˜ E‹lSvÃôL4º¯þ÷ÿø/ý“·ç/o´£’¯AW_ÏîõXµÌéêRB=o^îæ3ÿ»"úã3ûçùªmþú*¸I 9š¼âÑ÷.©ün?ûfþ†“z$ó¸Ð»6§«ñV{þݨI·d¥/Ò}¶Ó„/‹6¿8˜]çf:¹nˆÿ^²ÈõE»âôíõæ‹i€y£x¨ðF¨~•ìóËàX¥ÄÙhþ–ž¢[s¤uH‡+hØöö÷ÞÕõÍÓ«í‰ät¼¯zÓ¯«}­€ WSW¿á Ê]Gn_0wñÝA4Ë.ùxL›€‘/+\‹v¿B[ ‡7/ÁwSQø6@ê«®û'¿5èüºýþ×.Éœaç/Ïÿ•3® ®Æ;fæÊµOõ…ì~¿­!•6‹ ¯¿5xt‰:CƯ¡·R9ŽkôÞ‚õt'yzö®¦ Oþä8o0O"Úéé1é½ËrEÍÙö+?ë©9Ñ·æÉJ,áΑÂs3ÖÕuÝâj^)溽\OS•Z "ëÛžçY—N–•5ù:n>N”“ÇStö~WC4×#“ø[ÍÚÛù­®~¬È@ì$$]µN_Þ*‡´ö}(íÖ>ø˜]8WÄ`§¡¿7_ð‚ntv¹W×sEÐ:óú]þ–oÝæÂÒî­jÇÆ¹=Ï xïLÂçûXë¶ü­ vL<.¦+×9À•ÛFÚ¼^Õ~Çt=x ‹ìä®ÓìÞùb<; :»syuAW³ä°Þ~¨O¿ÿeÚ½utÿúyx~2§•âNšíJ-FµOjÐ4©í÷™Ê¬‘øù÷ŸbjeWwõ)’ôòôT}póú4¸L@"Ac!íe'úaéååÇfvø´7âé¹(§hmÜï£MOOn;oѦƒÒˆŠ0”ø<~ú¹Œ5l‘ÞIrk“¦ÐžRðI^Mûˆ)Ó ½T*ömjzyæ“Û~—ORo²îN¡$`˜FtñQ‹íj´™ùÓíq@`fÇsyHsÑ›óX0èƬHökÇïk†®„:ELÂc°·`‹,†Úñåý$kÁ$‚p§À)滜 …™$Ÿ0²˜E$#kõþä¤Hš;žž ˆTƒ'Í" ”^²Æ É^ „;Ì1Û —=z-‘–Óeu‘p›«tðÝÊ9À daùx˜\¡D¦&Müi7<¿Úhá Ø_vOÉB¯µx¡<ÍH–×ä¤00á-Ü­‘‘ðŸþÝ0Ôö4àãëôiúY[ւ罎Ã~Š~x­)=$)‡Bч]ŽÓ8µœrz®OfCÈ­T§A“döRi†$Ð:—¯³(±T8HÀŒ"-%ÑÜ•}¥ËB™PDdäS#•©TL­k÷ææµüïþþ?ùP^þêÇÓƒfaŸp Æž§~\žSùÖϳeUçéò?ƒ=çÍœ5ßãgêTü>=P5Ã=y3ù¼•üÜ›\«„× lO»ÏØ•óGö¹j8Ó.âœ{G¸^TRºÇ9çaͼø\˜ çÙÍÕÏà”­ë­zWèp>Ôm£ë”}[êz3á»Ó=v„…vköë»æÎ©[ß›·oëíôäÁÒ­|vSšÁÃ`(™Úâ¼]Py\`Z¥4«~¿ÒYçF-'Bß,/=¤ÞÁ©¦yz˜Ü„Õ¬¼¯zø¥q›ét½é=ò”9[·ÇˆA•òNÏ ã“hão¥ä·1×/r¥2¯ŸÑ§[ró {ñF¼K™Ðc¥§;—`“(µùÍ[ÂëþqA¾­Éèú¿³†ÿ<¡óç õÂírµnO >r¹ñúi³eäú£ÝºR«jâ¶Aƒµ´¯¯?]šî”"p;››ÿ('°Ÿoy=ÝŸ¸Ù$~»LÿV1íŒÍ½KýR7ú|°åù°Õ²¡»qþE„¤9Wmÿâv– æF̓}Ö›wæ{töKöâhŃ99;¼Ý¯}ç^ý>å¾û‡Äk'Þµ¿Ê›&<âs–/-Æw@w»¾ÚÔ¾cG¿t–«é!ôí €oWP^EXçowËr_±ÎܯõfÁëÖ¿vk žÛn÷`yÿó§iˆÜ͇âC1c)ÀÍe)å ”ÑHeä~`µ¿ýoþæç?|FêÐÆßÿ×áþ_>|x¦ ‡×V,ëó°{©ãx "…çÝH“Ú¡y­‘­ nTËqÿË'娯ÃP5¾N¶³éN)‘ûŸÓ?*ãX©R¦´$PÅH‘8d¶TYòSÄ@s1R…V °±e=,“S‚†RR—MÌ9ë°3#°œéðê6¤ Ö‚Å‘±ê='¦)¸Í.¦Ê™Q“yâ5'ЇáR›¹A)ŒA‚¥OT&صwK-Ñ0K¿ìö«óc…)ØÜ·-™¥¸»m'3øÀ2ø0xšrLXÝÕnxÐÇ3—ÁèRæçO(,43h¤™ye}ê]Ö˜&ª9µ@A“Ú»9d1Ff˜9Í ´F7¢¸¦È6NjbõÜšÒ-£e§ó#!÷hB!ž|‚Úˆ±Á,ŽñgRÓ‘þÏ-í±ÿgw”¥ (ý  CkP D ^æÂ™ Å­X=ì§Ì¤aÚÇDÕŠZË45µ©ÔäCh‡l u7«ökÉsv–&$¼þt¿¯2ÿEÔî-ÿÙæ9•¾9Š3ß? 'D ét/Þj' Iº¹›Or ÎjÃøi÷³ˆi®+ô7ÍD 0ád Á~@ú ì’¦Ù|xùëfLD}úÜiÎTDfs6§"ƒÇÄiœ45$“öŠv¶hãÄ6_Õ3€(Ðb©|pÆjõ‹½úPÎ}1dÌ•¼¶G x™k\ÀA3ËXk1Ó¡!L È­¼p—‰Fñ"÷tï%¤`¯ÏeeƒÊëD@£˜ùü7×"TŠ>}¬»JÂŒæÆ”Ñ(išš Ü ¼^ÛŸ>XÍhYž*2§ßÿÏþêK! ʆ!2Z(½%trbއðÝSz¥ g+Î6£‰ˆ)Ù‡Q¯ÐÙ&æç)Z&*ÊL•‰J¢Q6(˜;8<î§l!šØøÊ$ñ4ؘ’g+`S! ,"»¤¸s{Lɺ(<Áfh@x™aâ]±MB&4Â!²ó…R0!Ç[¯•Áz'×7u²¿B¢ú€Üa$Àê¢4&‘2Ó0×!HH'LÐÄ ¸ä6[÷yzF6î¥x:>üä)Y¡Õ(ƒ³"&ŒûÜâé…ÙJ ‘µ0Ó5<«5ÄÄHõšƒïØ&µ=j…‘^i ‘a¤rn ´ÙêOl5þ ðî ,  Ú¸ƒ„•¹¡Þ8´l‹\z—RŽ:`™ ´î<‚Ѥìe3+>µÆ@€+³o„°ü»/fhôî~C·o-¾T›ÚB½OˆÝm÷´ÞúÇž“0S6óH8]LÂ!JNÀ j¦üÃævû^—rŸ9û™@À€˜h°¨ô’˜¨¬Ï?°0$ºg¦ÑÝ ™0wRDŒ-GÙ` ²Mj“"§CR4&Š›{¯¿Y޵×âÛ1Opj6ð˜½|Ì—!"JYfz9Gó( ™ |s%¬€h”EÄ„¬°zu¯A==ïvØM•´âto$ Š© vH¨Ô”YÌ »¿ûwÐÒdú|Æ›>·±”ý8)­xÉ]-)HñTƒ´b<Œ6BQ+^Ê>vW­SfIÛ‘cµn$b€›ƒlBJ}+(î)E‰¤"#Ím>ŸJ-Ó…jlŠhãd™™RËl €“¥ºÿûø+åù§ÛšË.ã¶@få¼\u¹¼Eÿ M`ÛXôVhÇwƼÏÍ?½q _iU[¹äùnÓM êÖÀ¤7 ï’b¿Uðv}¶—F£o¡½¥Ô|½ð­Øï‘zƒÞXºhŽ|¯gÄ÷¶K½¢àëOPuxðÀ×°U'ûŸÌ¾ßÓz¿=îO·ýeçêf=ã›]ï_ËËxË)÷±ŸçvËß ¸¨;äŸïZ¢øÕØwÓ3ÿL¡ó¿ýÍd= wè΋扫9*›A/æ ¿¡EÓ­×¹0‚¾³œMñ>:5Õâ8ÜÅ톹si#çÐJéɧ·aÕ Á èè‘Òb\0ÍùÒñc¬¨ƒ§mõ+b›ãó¶^ÈËüÇaϹ‰ñxÆ/Ü¥±1í0C“xúØë Ø~-·âëõI¸à=]ÛŽo-»Kô.ÁIZòÑ…g+ÌH‘qü%]6Ü8Ú\”›£âÀûž'OQmÁóò2’JËUWþÆÞ-áy´6•èízVn¹˜§xõ|8H™if·|›Iê6':uZŸgHß[S/7¦Sq\P›yÏFªë «ûç¼EKëüú̬–úé`סÇåo­pd:¿—u°R5ŽÞý–ÄÃUçÆé<Ñ€6µŒññãÏu7xq3³¥³‘!+&5Éö_ÝÓÍà%0Lñéó§×˜¦þæÇþæwÿëÿýÿúÃO»Ý³ l-Z›jõRi-4µik '§¦‰I¯'“ž^†ñðzø¼gNÑ,#ûi#à¡:÷‡8d¿ðn*Éhš?±8Ì_‡ÀP,…–j‚žŠ2Š4‘"~Ú•"å%«sÌ,‰­EŽD#èhÓÜàßíR÷0C§·g'·äŒO Rs?5‰Ðlè1?+"g\.~TÒ)Ý4 huP€˜Ì$óe›•$¦:ÿ¼/q–ÿã}7l !ÙM\5M!ev-Z© §›Áˆh^KÝ=ÁêDƒÑÇ`-5S4+OŠ ¬Lb†âÀçŸÔ ÓAj€¡M(±ÏŽïD 1QH4¦”¤RJa`²E¤D!œ¢Ðй40G|Æþ˜öð@ dÃ4‚€û Pj³ì>?G-ÎVÿ™ÝEy!Km™rè—ÕgZ 4c—æ+è&˜HÀ´¹%?cÑè» sd ÅÍ«g„2%rY69?˺u«ûRꫨϗ4ÐQ|Þ%ÜÑÇ:ĹɽUf·‚ m m f8"3‡: ^(7)Тpæú…F¸J LÀ–†êœÏð0ÁˆÈÅßb„JFx¢>£RòÚXw 2¥$Ìs’$«1‘F33Df7_îGM«ôÁkéwß1¤‹çIô?ž´Ù¬8çG„€(»bK„bžŸPÎó ›…Š”Y=)˜Le1ɪ¼øn÷T94ä‡êUUÕPÜÅÝžQ˜Ž ²­IDGnµ¿ýk µºcL=Õ,ž¿ìóçý`¨?¾ìÝ£µ Ÿ†AÀ”²âUsw£‹{xB¬ÞŸÒËÐëë¡F¾Š/OC«®™ª…óϾIw.efšy*”-B̦h Y_ô™²åa?ªÅt™}€NC±ZËúßÿ—õã:p¾èY¢.Î4Ë¢S™©N":ªÕó/paÎi‰ ·¦ç&U¼àS^—ºÝ4ó`í)¸9Šžs¨ÖŸ´Çgâ‘mÂ;IWÿ½Sœy,­ôÿdnº}âüAÿo¾—‘ä•>xÌ%€œ@<.÷‚Žø¹Í±÷‹XkÍH9 —“9Ä›Ýy— ¨ë£ºC‰¼¦l'¸N¸ÈëwäqÖùÂò÷*®\këÇÄm£4µ¾î×1çf%ãÎûXã¼*ÃsÏš›• Ë;çœl¢‹’8°‚æ^¦0kîÃq4†·=n,€3fÏY½„Mg¯“¯¦Ïm²ž¸8gçùz\X«éœVj²¹Ùʳy[ÝêÙ¼ 2/ß³~TkTïd‚÷û ïƒ<¬+]+>¸âol¢NneRÛ'm\ˆ[·ƒp¯_k#gÔ*¥½L”yu‚ŽÃ,Ú…úŽõ’Í‹ú&,w…»–£®‰%Wácuko¿mew±Â×õªkÚÖŽG¬žò§ §3ÔÙÕNòV‚wNû¦²µA]æò›:Öu/)¶Lßœ!ãýC½/ƒÞйþ×­ÅvÚaŽÏÑ Äô”´¢!Ý\ÛæÐù‹Ã[]?|ü½Èù[¬ïðíµÍ'Â½Ž‘VH›»ý[%½/ý¯ É¿¸V'ââ¹X®¯ý™p¼(ÉXãßU;;æ:Ë.n|¢“Sëæ¸Ü¾Ë¯z½ ŽÜŸ·&ÖöéìñüCßY%|@~½=ÜÝæÿÇãõ=BM¡3hàúbpÍbºŠØîDº×[ê¯ÖÝp*ôi™Z_8­³œ†5è­hùÑ €¹zb–™óàê*ŒÖæÖðMÎÉÉ·úKƒ­‹Pé~¡l~4½g{õ€ÑÅSézHöDø¾í™¤³äôtU—±³•Éõ¶¡Í^/Þ’ápþŸÿüs›šKñRœfftw‚†0°“# %B‰”­îJDüü/Ÿ8ÔúËÃ;jüüñàôb*%² I0ÌÆ a“q$Ùh»ò‚¤²í__÷ì ,afq˜?"eÌÚšEŽÁBÈÔRôDºþÐ&M6ÀМ“žª‰8(˜UÈkIéS+Ž¡‰‘Ѽ$ dD2-¥>e¦d3˜`Î-Ýs«uÆbŽ'â_ ™½@|úÎrUŽºæêÂVc)"1 pG‚‡AݱÄÚÜן} MR¢Ø¼{O‰‘H`÷<¸²½f„’­Q|j„ù®ŒþÊÊÎ[kA£˜Ó$Vz!ÝH<ï0ŽÐ0_°2$<1Ò‡ô"„DÐ1éêmöÓžµªÓóûñÅ8 íýÌôÞtbDǼ? @CKŒ#ü h#bl(‰’½¶ŒÙiÀ¹he‚éÔÑŸç=þë¿ôÆGàg.»i¿)î2÷é#ç÷2G9j) Í³Pˆ€Ñ2SÈlÙfo]‡s.Z˜ÍEç)¦è½êÇk&ï/Þ¶ýg&™«F÷:¨|H å˜P_¥¸ÓÓaÎȬƒ>-n0Òmpˆ&D1*DsÒ£M Y9)ï\…9Ñ ”¿ 0þJZ‡¦qouçe7u~LÅtøåß톗1€\Iª»grè% ez1Z±Ú´6O$Ð&¤fìRÿVMp‡U(šÕ»îœ¬ )L\Š@âàìû[“4ñh^dÉ‹¢•An@·R2ˆRJ<ü)=Hñ„¨à`šQÉâu IöïþÍ4%€`0Ìô4ÀŒ†üñ¥¶à§±üôTxŽ×1?Ž­’»AÖ7â¦(²¥Ðc¦!@ŽQ¨1¡ÖÜ—ðÅŽaOJ™ ¡]ˆï„¢!¤ug ZNÓÔ¢íÇqjÙ…¡¯ÅJa±ÿÃÿé¿_èä < W ^6 ¬¼´ý/À@]„®×ñ¯dÙ·9Áëhmž YÉð«Â÷¹·ÕMF<îƒÂÉ7Òõå­ûâlPë³{Vöè[Õ:°âúÎãIkíðNjz?öÆC` ÝáFÞúÕ7)š›êØfwøƒù[,#òÍ8˜[ŸH_º?˜^›WTn$ëÆ6­«bÂöŽÊCOöðip’ʧÝ.$ãÜv¨È:”—žÛ8íÿ?ÿ³©ù¸ß·Ã„Z£å¸?@Ñö“‘†zx=¬øà0 ¥ÍGC$wU4Ëéð:–ƒÜýõÓ/mz 2#s˜`źý%Õl3OÆR¸³IS¦LOæFŽ™¦PJîfêC©4Ð ì—©±–Oƒ â!²%ŒLÉE‡…º‡æÜ¸Ò)–]ˆ›)4ZÐ! ±‚OçžñV )Q AºÁM^c[ØB,(i0ùŽ‘ÌÄÔh­g+Öî,˜eŠÓþ0u€®€V}œ"•µ´2ÐK…,côµÔ`КˆÂ2E¾¼ì"r¨iÜHa|ýˆødÃK¶H…²ax‚Yïè‡U”9 ÅY@`ELì¾Ê^ À`&Š‹DÀf»Î–jhÒðÏP#pÀSAZ"&( !mV¢;ýÅx¤³Uã?—b€ÖØrÌêÿñ›ó¬FÎÝâì\2ÃvŽOÇ®¬öò 5Ô‚LÈq›S‹íJS*Sh‘$¬Ï 0ÓIÓ?–„º­t÷>†ÍE.ƒ&ZÎßW·½Íùð¼rzæÇ͘ǢÉã±­çdWC¦½ž/žS/ƒ®[‘ôi$ãÁ¢=W–gÜvÞ¹<íÇs°yï½Ù°YJ¹°¶×öÈXšÿrìr:ÍŸÌme:Ÿ??NmÖ´Ö€™ãäñxÑ›SZë_¿˜<ÅRâ<‰ß—…—‹v"=lzðã ‹¦õâܬŠ_l Çá$¾urNÃFÝyñ ‰ÔÇ]¯¯ßé¿t² / ˆÿ‡ñó~nÿ'¦Ãa÷<˜¹›’b¡O­åÔ4”Ì̈qœžž_>þá—Ãþõéåå÷ÿ¿™Æéßü‡ó¿ýÿcþÈÏŸ^mÿ9Û~Æ2"öY öû¶3£y1S1ŸÆ=“Ù˜Š¶gà3él€Gâ0¶ˆ×iŠqR6JÈA¦Z¦™l¡ô¾û0×KEûŒIz6¯Îƒ¢)ŸŠ»cD†r‚ŠL¢‚‡È‰ªÆæIàƒÛ!³È-‡bMÙ)û¡9_µønW˜>T•â6DËƉÙP_£îà•1¢Ènä+ª“”Þ¡†aÆ÷+Á &( ´€%ì(˜ù3S€è¶ýóžñ ŸÕ^n{;ó‚ž§™tôÆë&ƒ¹—¿{ÃZú¬ÀÂꉀDšëÄbòL0òйÐf#_›u.øÙÙñÏ.M—ÇÙ[ÍãÝÃV¶ aŤóšm/ͪ=IDL¢2!68l-ÈFjÙ B4’ØÑ„ÂÌ–1 6Kº¶ùªcËÍÓÓ¾ƒ²Â)šTKg1F’JÄØ²M©I*4™™º…±™£NlIŒô1r«KO³Ùoëê¿`9Ÿd'Îþ - îÈDöé‡mì¶°™74#AzI¢7M›9 ¥ÀD: ‹ÃE9§ªÕZÂiæ YŒÁ € Á3‘øÛ¿~5Nƒ;lÈȹ?\ p¬f96!ùõy’›ÀiÊè Ih0·:Y¼d4;0†Ââ˃Þ2#R3¢Í’¹uƒßHE&s.ØSˆLE¦R¡Ã~œ¦†­…uçg÷¿ýoþÝ¿ý×Z{yyq{| níïºLåhíi‹u;þ*Š»v½÷@ç ¹Š?¸Æož~^X×&:º`£­I›K›ó (ÉótáMkÜÓ7³# Îý?Ï¡:"Hµ@‹Îßà˜eœ ·OOen ×üÉMÜâE0'7[㮣ßó_ÔÊ/êøÊgiÔVî†-îËFEg…„¹aÐvŠí/q·*+<ŸµXbfnåwåÃ÷‘7BÎùÜn¡ú¹œdâªËþ"=>¢qÏVç°ÝÇÉnÍ;ðìvçuÂ{•ë"õ\Ï5œ²´uŒs.ëuvv•Y_tq>,¦ó\IÐj›:’¸°ë‚q±‰´¾¸ï°Ñ\ÚëVEW؉³5y¾„xk‰Ý×Uîlç„Ûëu²>É×èŒôÿÆÈÎñ—6Ó—(›õ)ímûK´t‰T¸b,gx³£õʶï§ëÑí;&Ï÷ýŸ¿‘LzS>¾L[ð çèKÝnˆ$zs]ÝÖy”¸±‘n*à÷ŸS ïOàÛ”¹ËÛù½"æUœÃÍ{ꑼ)µI µ—Ëø‚k±J:.†ÊnÑùïF >Ðy,ÑÌÙºç dt¾ù^ƒÁ/>æ:2¼fmâ•®õ¢ãÿžóªy¡2]„Žúð©kM¸ïú~[§}ŒÚãnºå+sgÀ9;GçFåüÖµ$ªé¢ðÖ‚ãëÞ¸Ê ÄLÌvˆÖ–úÁò+3 ]fü½¸õ îF²qêæZXHh‘õ¥qiÞ?<)*ÿ£cÄã]oóÛeB>ûN÷#Ÿ' $eSÂÓµ J¤ÆÍ̬º)Õ ðjÏ’º3 ¥·A4z™ÑCšãb=¢Ó)êÈ+Üfì&0‡}Ÿÿ꥚)0IN4ïL™Â,DxqP™ADM©0¡L$þR40aBë~Ë ™˜x:·ýÔM‡YýW@¤¹L””„A4s:áfi–¥¸£v«dZq©¨z­¥†Ç“Mn59¹…Ñ"J™ØPýw—ƒÛØhfnÞ'¢Æ– 3OÃweêuÌ©i¼É™»ª]i-S0¯(Nón5E“ä¥tm׆dD¸›R‘ÍÌ:p§?@J)#€h ÉnÈÛZ˵˜ZëÆÓ8ø·÷ïv»nA<ýðáõu¿ê²8Wƒ¡W„’EKéÛ)O÷Ã|ô‰Á…D§G"ŸºVÏÈE»Ð#Ž²Ç¹Þ¼!§ÝÓ…ÏXã¶OiÄ5JþŠ ~Ò©·[GtÝIrÝPrË ø ^~Žº‘û=ÚÜsù½}HkÕàVÅu´™(ÜŠÏí~åAõ·û77}?ùÇÇxEŒ¾RدîGËÈËiï·-æ¿^‚q× ëøYî‰Ç^''‹£7ÛÆAòM&Ò×'ɺÐ*×€MuxS¹9î߉k£µ7ÊŸx‡âÿ5ÒØƒé×ú‡NŽÞ™®“t]ô8ݺ…´½éœ|ÑÎnêsþ»¾ÆSá;©ÿ÷¥”û° [™à·ýº® Ýè•ü¥jS}KÄ¿þI½kÞ_ +Øò#¨ô‡,å7EÕG˜ø×ÔÛ·°Îû§¾bWù×ߨ‘?Ð5§YöÁÂϯóõg0Qð—¯?‹¯L}£êóŠÿÍ·K3ûmŸ¼è ™™f숳TdüN“’ÝàÂÒí/ õòÅY„Xf:7-@—’Oe‚ÓþÐÆI)3;¼~*»Zªƒt‘jaž +†(…Â8¶ñ0>¿ì^?~®»!bŠœ~øñEŸÿùã/|ý<ƨý§ÏÓ®d¦>2ÕФ’ØmT&…%§1?ðdVŠ}ô&‚H'Lé‘*I™2½‡­T-H²8v#Ûg‹Hs”nÊÈQøÉJ÷“>¢UÀ"KaW½€)¼ÐTÚÄÜGBðÙ¬] Ù˜]c¥P7æ ͳ£÷%Ð{;¶Å,Dg*’8`©< ¸ ¥»uä¤Á Å%ëåÎÝå DàÓ«Q –&l M´“2Ȥ"5QI¥|&v+eñ:™kxB}¼°î¬åèÕy)@OedXªÁš¤gƒCìžÌaÜïíõ‡êžä®fV Ë0Å„Ã/ô‚q$µ)5ZM–,EÙ³9 Ç‘2 B’LašXM…ÝG÷èw'B³%ìÊ»{º‚ÇN|Í"õ<ëä /Døu>Hx€ˆ³Óiò¾°YŽë¾t˜#s¦9‘È6ÌÎÄñÎêV´³¦_>Û ËO{ºy…©Ð4±É¹ó’p&2#]+¦dê/׉і¡Š{…·¹“>û³Û2÷‰›ŠW¾&š‡3 ¸‚Ï&ݼÀÌA§ÑUû€j&º™£Xyö]z<•B÷0o(FÊÙ=d-2±éóWÝ|iNh,c¸#ÌŠ»™ÑûË×_¾¾«:ù¯MvÈ<ù…üÆEª/¾²‘’¾ë.ýøóë7»DNž›k…{Á½ÀÊ!õÌ9aáYå4¼á(£«ÑÑ>e³Çˆú{ß|ÔÖÆQ¼>b¾atv±Ã»šŽÇá#¿´]~ÿþ~qð8wZ¾d&Î=gºp¿9–¸·gLV¦†×Ûë·o-_´¾é™vwàtÊV³Ë>rwV"ß93{ç½l¹íju6;Û©ÑC!Â÷ÝOo†)wZÃÞœ­Ó"*\ýëÙä×ò#ÇØe ᬮßI<%íÓïncCÊÈ×ÏëPKqs7Ÿof¤„0ËÐ8ÅaßÜòó/¯™1µ$³Œ°«ÅËe°fà§Ÿ3SS˘±§QÝvÆLî3÷)Ÿ_ð”´„šB,¥eŒH—C>¦$¤„ d"ÁCRÑ´ÛaW--lÐg´B>÷‘ÈjV]² )¡%RaJa(Ö˜;ù>Ĩ,Æ„&€bFÒaSËè­m<:'Ìç3 É@VÉÔQ%¬–ÅÕV×0 … …M Q!¦à„›D4±"锆*J–]ÂLy"]õ3@© Z¦Ôa6 ³:µ ¤¦q?/Þ²´†]¡W¬uR&) é^Ç)÷¯»P Äk5×øóÇ6ò§[KñÈØR„4¢T*Sb/$p`)cÒE)GjêR²¤ŽlR&æRTBNÌÆ¡(T!˜J 3LêQa_Vy—%{{¢ÛÜqßýiiÍèÅ•nçËÔyLjږY~ÏtÖÓl[ '˜À™éÎîÁi§¤£ü{CúñvÓò¾fèÑÙgúÀ‚¾ØM÷ëgóaëLµÕ2ÙZ(T…ÐM)”ˆA/³>J1æèV‹P¤h$}P?t… ”‹š2¥Lúü·®ï—ùè:}k†^Z„M†ZqȴϨÏzú¡4‹ýÏËK ––9Jl¡~¢eh†¦lJº&¡‘„Ïï( 8Ò ì&Ó Äì¦`$‚ˆÏ(´9Õ±`Öœ2ð4š¹™Ë ÍéJ:¥{„›Šyu–ÂæEVeªVƒ’äb1{ü»¿±1@/û‘`iEJdJ6o €ƒåeWžw©ÅuÅŒæÙëd©¾ÇД™’›rw­ûÚºÍOŠb´â2¥TÁù,æt*"3£E[§l‘™} ‚4@föïÿãl™/?þðÃ_ÿئæfÅÍœnkW“—£Æ t¦ß‡gCÝ·|E”¾ÞÓjkF–—® d¾ô V]ù¼@HœÍ…¯â"¬‘Gä­`«6ö å=ÖÀ;lœM3Ï[aÌu‡Ýu×áÖÀCáÛ­Œf*o‡Ù÷´mx›ð¨³ q{yð=Q߯ È_PôE©ä;BæGCq]0:6@+ æMYa3¥Ò†ãšÔÅwiFËêÒã+sýÓs¬|¤¤òf äÚùöþÆÊ>í¬LxÜØ¾iÛø7Œ®±´›_ÇâÇ ‡UÜav="nˆo§§×x¢+ø W铎Öñx`É}¹”qµÇ~[¹óK¸º÷óoZ9~Ñ~x3Fí‘Ø¹ÅÜhµþ5õâMþÏqµo>Iñ®“~þšz«µ|s®âÂký¹eãæ[Çöæ£ëÏ:sçzÚzó\½)ˆÝ.z=4îöÖ$ |QÎõ÷'N¾`/z÷í¶z­“R¿…@ZEÉ*g§†¼§Íﮘ?G,çå@Ì×ÄXëõ«wÄ_—ÞÕÛ{¾ÉœkT—/zÓêýl8eþA^ãucTP_·÷ˆë·>ÃfÐǧLk˜Ú’_žˆw§:úÕ³ ÖÆMÀèéê<ä÷Í;{‘>¿9õsºÆ¼^çå7gâ=±Êα~ žÁÿßœÎ;ô¾x0_׊î$o÷?øhãÄ_;O©ß³õè v«7çÏãK^!n7NÈ5oîVX³qBN|V^¸šÉ^ßå—˜ÝÕÚ?%hý¨‚Ÿ~4þ%ͼ¯ÅÜÌÌ(@T*ÅÂRK’ÒÅ~¿ÃøÍŠ}ú—Ou÷Ôþð¿eäQ •ןP<¿È‘vè*6Šc(üTz>«O“O¡&¼ZóD!“`(¤›H E¦´#‘&©%œ`ûÈâòApZfŠÀ®rG;(MÂΰp°¨:Ç|b »)æ¼%’ÜúˆpƒÌ0¸M‘“²s6DÙ ßÛÆ³W#Ô¡glaÚ¹ªg&ý™d“¾K¦`t ¹Óû‰ Š Ist -…Ú«b$Œ0e #ÕÝH)À®$'  RÐ2­ÅóSÉ‚Ã4:ÌÍÍüùÙèpº,#ÙÌeæÓ«²”a÷t e4M e2Dó§<ÿôqÀt茵WS"ƒ0¡:Rd0›µ†âœ–bÒ4—N³ îPo̤w¼ û«!nH.õÀà’¥P–L®CY0¡ì`™Í½/üD_}\Jèú%"ÐüšÝc€KïÿÑl–‚1Bj `Ý`uAè éy|ÁXšý¹”–²lÆCy=úñ.ùgà^·˜Á;4Ħ¬Î5b»ûp@W½!0J-2GÂh3€Š“i†D#sk‚E1ÏL Õ¡:èðœ~‘0‡—“)l§Ep®|z"&Œ‘ûׯgì$d1‘&Ú¨®õc h€AìxQ‚Á!D ´"Ð@Àfj:©Íô!8dð>bPƒ;Ћ»Cq*``tÏaº3šÓ̼¸Ù3‘&s6&½x¯ ØËD‘0NFÁ¢š‰4Z¢Öß}Nd-iÜ vhãç‰bV‡—ne`€Ù0yjWÊŒŒhéÕûƶÄÝ2Ë<†§Dfd¢”šŠ>ùסÿ@’̈l­? Ìæ×ÌHd6¥"¢SŒ-[´qê¿^j±bf.è?ü·ÿm*‡^^v¡6N»Z‡ZÍŽžÙ3. Œ‘+’ÿº§€ &Ókä3⨜˜ƒÛŽndKÑlP"K±ÞKï0u¦gÃ_æ1µ…õntÁ€&b‚#AN¹à3šªuçúWzÅaßi-Œ„¤:Q½…\ Á¡!%aŒÎ¤QŠ to‡˜Hq‚¹’R"çàªëŽcfÀîÞö*;%2§æ;JSF*@¯OSjD+JSîŸvÊûÙ&YÑó Zêð ‡Ï0(¦ƒJAŽ˜FÖ*£Ñ%°æ×Ï µ=ê…‹™vO7¶DhVÓ#»VR°@h9C~¦„¡{ºžªYÌQ;笰?6ÿäÌñ/0Çx@4Xwñíu‹cE§Kí 샬;ä"ß/wÓ±ÒÀe ÛÑŸÖ›­ƒu³ü1"1Âê‰Y_@ÿ”3^a"&)nÈœ‰û|ƒu«a°«Æýûnž)ëæÙÑŠYw§nBسgNÈ„dŽ¥Z !õ<¥lfÈ±º¥x„%µ+2c$„ÆÃÄWñFæäÕ̧©_Ϲ{œd)URf—þs!ïõ€€ì#áÖ-I-{<Š©ÅÔÚØ:íÍKñZ†§aøðà?ýçÿÜ )œOc›¦öòôäf³”k|(¯X ÞÒ¶4ü&ß9v½N2ߥßõ½o¿é©í¿|}Ãó7¿æoõ}ëÂé÷ÏýÞoNô§•C][ŒœƒŒø[bøË××/° Iô/×ô7²ÁþQh9ßï¦þ˺úcGº^hôÇÓ±•æ Þû|àäÔáY‹_`^•ëõP°õÞCºá´r¼“ߎà¯ÍL/KUç¢8ßyX¼§!žkÊW“YëŠmG°/º½Ï«”½FÄÆÁé ê䣪ãU¸iÕDŽ+7­µÎŽ•1Ðø§­–îí¡[ƒ<7—Ý›èºÐ} 23•Ô©欤ÉsZÒq¤ŸgËægÀñçq¡oð] üqƒâFÞ°räùïéN¥äÖ44V³©§†šõøÊ {röo>P—)ë¡¿¼ am?ÅýÿúùSÙUsëýUŒ] ¥Ó˜¡Èdf‚¦ñÃðüáw?í÷‡)5‘-²Â_¯‡ƒ±ýUȶcJÙâ„”"ÞŠ[lŠf†díGxJ ¾2=¬Pµ$@—LK)º0d²PH!ëÐJ×>S‰€”BºzÍ,`c†’²mg%%œÔz¢ç{•"³Èœü¡+Fó†”I,åŽ ´G&†1±ótÃ~¢€‹}IxÊ€ ŒˤÎú`€AE”P€QrWbBÈ…¦Y÷îïÛ„)˜”’QEÙ_*¥£u'M½b´xz)˜²M­~ðBÒL>Q¼¤ÚÔ¦¶×4ix0915ÏÉ“9Ú4LŸ"“2T&”D£tüŒŠ$2ë£F"af™’´@r2• i`§©‚£%d` Ú\eÉÎ;"":?Ñç€Y;î]ê]Lç‚Ðék?¥Ìÿ~—ôk—: Kó( œ3â~®ØL½ïŒ %VAq´µ™Âo±3Ž`]Å_}3á'gNÑb0«ÿýÇ"á…V(2é9Uzª Ñ”p›"@cñj˜æ¾!î™Íè)ËAX)@&¥8ÏPÑ MððT‘ý°‰Lt»Y ^æï¶ØES¦^eD"•“cÒÍ „& ZÒ¡ª‰Ö)DŽ Pp!G ¡rà ä„l3æmMH´ a(>#£½‰~Û—^Ô!Gƒ‘nµš›&ws+æ„©tgb+$ä‘6ÉlRqLµ¸›knFÓîÇWeMZ¨”:d4Úd>–(ÏOÏ$Í“†–†{§1r€XØQn,UC™"«›2Ç–^ØRº»»gÄò¸Ï^ÂÉLïÖÜ™±~‚D·ó"2ZëžIˆˆÈœ"¦–‘¼z}Ú=ÿîC_Éÿñþ¡·ÈÎíXRF¸‚=ŽÐÌö¹Ö,ƒ”° ²ßéI)nõä}\/÷|`v™à—H¦·¦ùP†ôž€.zQ¯>Ý™uò™ü¯‡LoE†¸aQx/—¹ë ¹&´Ü:§ïŠ7p£o»ê]çJúæÐŽëØm3ð;¿3¶¨_Ô ²øÁn/Åc»é ˵êþMœÏw‚Sæ"ݺjç‚_T͸BnžukË”ßL•Z§Žñ9¶gb¶§^îœü•Ìzvm5ù^ŽY<¬ïð‹W±5‹°–û¯¿ómÚÿµ}IÎ|é7?ñÛÆã·në•{Í•áôŠÝô-kXïÑÚ¶…ßG^a¥{\6Mo‰—+üöžÌ‹ ó×sÿX  oUYyïËÞkáx/]¼OïÂõ~¼½«Üçv¼J™¬zÿæx‰”<îWc7 ®Þ‚—Ö­½F;Üj¡~ð†]cçyLÎ?óõŸ«(hþõ¢#8¤“°ÅU6’F&­YyÆŠÁ¹Ø¶}¼ó*ûOæó÷#Ý«8t#,?Ž3h1µ'n2ò¸ÇÝ|žÕ’ÌpµOÌ J]•?wÐEÖt/?XÀÔòЦ:›‰ç”«á©ÕDøåb!Î\Ö­YË‚ÑÖáéöD±®¼Ì¯–„¶â[ø{žOCßÜ÷oÝróWJ\ŸØeðwfÄwˆ®íŠKT´&²n¾Ý1xâI{ÞFa>èf~½éo ÏžW•fà‘¦xÞá½×öhâóü¨uÍqº5\¹ÞúNh…Ón¨{ÁîèòX9xÌّ럘ëã?ÿ<-tˆÏŸ?–¡z)æNë,ÒlSª  ¢•q?Nã䥘©uܕן?þøÙ­T½>¿ Óë…cÄ¡xHùQå$sÔ¬- »LN{iehž`c“s¬²Œ¨(OÎÒ¬ETø~Dc¶D y官À"aÆÝ^èSÃh*bÍ8Ð&¤LÅðÁʧœZâƒÓ‰”Ð<Ãó™ÞBLŒÔA)!RÜ8ϪqŸØ7‡´Cz™\[ZKBŠDÆ31Ôl¥àt0§W!X`Dg…«-˜MhPr†ädgÖwK½TÌ„ Š´:T?;;üxœÊqºp fH%Æ)+Lˆéc<ÿ΃ Rzs µ•j¥]\¤ñ3(Dkð:7eÇ& dˆ@g"R'­Ûa cAì*Õ[øMR¯å@4dBÀ@ Ì° Â™±¢Ú¬GS`Yr6[ꀦŠã$úLÊ6ß ?·ä;Ä“¯-2ýœÿ/¦¦~tî]:†ŠùC­f8úÏôºÚÜéDü ¥;­h®Xt»c L0’™ÊI6€¾€wڈݘ0N½|ôI8I² %çFòH—¥")ÈÍÝ9@I¹" ̉¬)šºErf×ÜŒßÑ|ÌÉ™d¥ó¯àTä\;7*F™% Ñ8Ïz˜JQW&CëVÙßÅ€ –p0Íê?§¾´ÀDäì#ÒÊ*06Àa@$¬ç†àNi3ÖÅÈBÓŒçÎÑ@˜Äf^}çY@+Þ eôÿÆ„=×4ÀÍsWvn¶{"i‡PÂŒj3Ò¤½˜Ùßýý4.‚æµÛ †RºC²p|sÌâë%hë4û`+Ùê°ØÀjÉ?V^É^kÕ¢‡=þå !²üúZ–OOÒ;‚˜V 'Ëà0°=g·¡ÄŠk*ž5Ù\Ná±Ye©Ó/ ™¾ßš/t‰wÂs7[–âÊY¶r‹êZÖ”¾@îÞÀ Ü2FÚ¬=tÐR?ú⦑ËW¾mþ¥«ŠÅ©Ã⸘ߔP9/[þ—wÆÉ‰ûŠKu­ëm}ç!ñe•˜\)ÏLÎà¼qå²ÇNo¾ãEÌ›I÷jñë‹jvëMéì3Ü©—ëÝÓx‰9¿ÝðµmÅq^y:y°­ÖÐJ˜oÌY6‡6EºkhÏ;˜ÃÇW¿á pݳ|KÜøÈÚÒ"ެÆ-#ŠÛª¶·ž„óïž>Ðz«™s4ÞY~ïS±oK½×÷ìiw|ä^¸¹ÿsµå-úØ#Ï‹+’íWÕO™éü(×-ÁêñbÀfü¦È¸¥B¬A^·–ëzµ_Ø<(mÝ!üÜÚîÖ¿ã9¥¤«rÖVöˆÜáJ§˜»EO±7×ÏEôr‡¿ôg¿Ø^/q­øÜÞ®a\›ûÞµP~£º¬« ák*úzPûu®ÅYLö…7j¢Ös}pM±»Øsß,ª}ÅÀ÷ªt=và_]ˆß¸uçü-ª£Ç½—`ŸµœJ½1àïuvn=‡îìû[_é¬[O>n®Æ« €wmØëëÇ>ÞÌ·3__ïÿ|–~ó½×æóÃE¹YÁ|þý/SGÿi~DÿÓ:ºAm E÷lÙ¦¨;§Û§Ÿ!–Zjµi?=ÿøaz}ýçÿ×ÿôã_½L‡)Óv5^?OÉÈHÚý#01€Ï*°†1•.!Gf ?X™¼`ê„õ6}B|rímf¶´ÔŽ,Æ.}z‘3ºÓe2Õ˜ÝQ™ÙBÊt@L’Ɇˆ(z?± ‚˜” 2œmŒe`‘©ÅÀ0Â$MH!`M¬¦ Ñĉ.È'; …tHcª‰“D⩊R‚£÷IÏ´9·¯ËÄ&ëoÚÄäB·Yºu`® ¤x6>ïjÓ”’ …¥eS‰F,ŠIHÈZK‡Ôì0¶qR+ §Î8êÄüqD‡ÚK#ZÃDppä(¥`î!ç\ɧƒKdi®¹Šì¢'Bª6+éN  “ͺó`3ò…DÌN´(K³?8“ß…Ó»õ±¸OŸžÇœUxOÀ0ƒnú%èù3¡¾?~r¶èdñX½8‰š­Í?ƒ…Ï•o¯%$«*r6s±Œ³Ïð÷ŸSòe†J„l³‡p$¢aØÑáÝÐáíÝšspZ3'P^áVÔ„T)N·ˆ&4ƒ– ˆœú¹6WbìW3‘³r¢¡j…:Z8@t~V‡")\hsA¥Û_³A i@… päL `^@k³Ñ·d%ú¸L?±•³7C7dΜ=Šû”Nš“fœ^XÜŠSf2'á^ªé©ô …eD£1ÈF<—လ §~Ì”I³×˜\îÞÜÔ¯(½€³8$c(2·TUº»¬Ä਴qÌ~ùáÕØ2dÇÙ ®dæRÆ2Ðëeæž½ý_žŠŒ ¹R‘-¢E¶ÈH-%Þ§`¤×òïÿñ>üõOë6€%šÕS¸í|P2×õçoðN~5\<k¹º-o+k_W~s:âÝhæ>²ö Aú<{¿þ}«ì‹Ç²Ç•¼‚ïqùåñ;\ËG'n/ÛoéíÉþäw¤úß0(}ìÜ}ËäÿkÂÿïp’Îÿ7oû}PöZI®_`ðÝćï$Ñ·_Ÿ÷²Ú?Ù €/¿N}Í7õŠ¿ €~Å-tCý³Ÿúk6Æß yìO:ÿø‹£ €ËkøÛ¹7¿át޾ô¹U.6±ë{éì/äåhÌçùíñÚûëØÝ´n þê'4¯†‡O÷uôð¾wßôWº5ß}„¬êêØ46ÇÚ½‡7"å»ñÓq`Rs5½þ¾ðã¶7Ú¹+ìÆÎ»Ž!ÞµƒošEß+lÍ(|ƒ¬éºvñ°û7̵òǤÓÿÇÏ8oMz?(®ú(OŸvv‘=vv5rÿó§ñõЦhô×Ï¿,èÿyÃ4µXI éæÕSÑ"ÌŠ?zÝýíï~÷oÿªÿßþ‡ÿG©<^§¦§w5c©2æt€™­ÈÈ!œiŸËÔ1÷ÞLÁ‘‚G@»ôCƒ“Å*ùIÀCûT&ªü‰þI1F>ÑF$LhÍÄì*mKv÷^0Ôk¨Á»tÍ›•t1š–…ËC„3(›ÄÄ”™€ÊLksU¥eW«I¨RhÊ$S"!R‘ˆn%*ërÞ´–ºTM ¤IB½?=ƒeŠ-¡@)8áR9áëpT_=oÝ\K`¦þcÊö(ÿ°Ø„÷ñ‚e³Pi4Y–ÄIºå€8(ä†h¨„ƒ€,‘Ý-6É>f‹?àÜÂ|šÀ›ßQóÀ˜weÐD2C`VW6a daöþ%¡˜áK-¡<15P¸XÛ"knHá>׎æè:Ö ¦¢ß €%"à>OpÿP'\Ooðg‡õ÷ß 3½Ç Ñ—30§ã€àPÀʤ#™p LdïˆûïMÚp‰èÖÄD›@‡ϠÁ ÔÇ씸f@£X&+³Ï.t¡€.(…Ih€ÌKSH¢U¨à:MH}š>“Ž2æÕV*й=>_ uçÞÞý­yu²ÍöÚR˜R"w ágBÅ<Û=º)7ÙÛÿcñBÀ<™Ñ¯Ùœ8H0:Ù}qÝèžîôêµ÷Bë΂Îè‡5cmŠ—arM»ÁÂòáCºB¨^r¢¿˜Ë¬²¡À8“¹ZJ ’i.1»iuάŧðR¢Ö~?a¨h)P™ýl8ÍŠE4ùÎu’$Íúm3“"2R2I*Ó˜‘ѦÖQ?Êœ³z‚4wóâÿþÿáå§têñÓYÈcœÁ‰ léÂãûHõXZÕÏ$Gr£pCÊ׺ñvïá6‘ñºeôÝáõCOfn<é×SŠâºm^«ã«ÑÉ|—ú-ô¿·óñ}áĺ1öJÛ}°Œñþ$ö:r~óNñ£Â”Ý–\ßîºÅ–oí×è§Ëèú©{ìdÈ´Y¿»x/_õ Àô›´¥›âªú‚ös>ðý¤§óÌý+5rájjùKo²­Ù£+½ïý·ðÝ?ß_µüõå§ãÖÊ:`¯öÞÍÀre¸t\t<o÷̱¯ïeþúWä;%Ýï½ÐoíÞ³®ó'`oòÖ)ÚjyoõÅÍZYšÝ¼°(YzÈÖûbÇÖ£F˜o<}U|±q'þÉCç¿yèAmùV”ˆ+sæ÷< x1·wqÝo̦<~ð,ÙE¾&\,Õx—‘ðñˬ‚‘k`ßœò˜]´æÁç<-ϳZÜú¹Í7õÙm›—aâ1å‘.ƒ=¨4r|žiË"|ô¶¬®šDŽ)؆wÙƒj–¹†[âæ¸ZŸé^¬l­­^àj}¯Îý¶aúÒÿÏãøòyCÊÚàøúêiòÜzoöj5©½ŠºW϶­ªÒǦMmµ G<âºc…×NæÇôâüPWÑ.‚õ¸f«œvç¿øá›Ï’ òÏò£×X€· -%áâöþÆtñÖk;„sªní’\Pü[Y#€dK­®Æú¦Ó,;¬7àŒÒ…¹#YXѺÄ?íÇ66HnöéÓÏ+ôÿ '`”™D¤»Mûñã?ýœ‰ò²›>í§Ï¿û÷ÿæ¿þÿç§/»—çßÿó§ýôixöÏûƒR;äA.8Õ¯°ÈÄVa Œ%,lôæÁ!ŸÂŸU?g¦«Ïn Æ}¦%+Ê`i°Dj0s÷îJ„´ë(Ž"Œ(,YÝ&K3ôåW„*Í„LüAá ÍcTödl¡)É6EÎע˧œ¥ÉLŒiA3Ê”“6‚–*HJ#™¢§‚3ÞAdžIÓ>¯¢ƒ%20±ÍLöìbèêâ3úïž”ýû~¾øl< …舠 Ï¯£C…`NÆ:Ôò:ÆdÉ€ÑÍÂ[PûBEBB$<#À0 Z¢5 :»^dÀÝhHSf}γ 0iæ” €¬7õ³Ó¥àPq@(‘s„èÃ9O5Îå“R€€º+€ƒrBJßÜË‚êªçò(î.­aꮳ‹‹À¢Y¢”Ù8ÛÊ •èÐ"ýcñÀ"@ ˆ6#ý£ê¿h¨ƒõ;2¸ƒ÷®ËÒ 'ÜgOuÚ¾r°2{Q°@dÂxÊ¥PBÙ1S‘Z…™¼ Ô2E$ÒŒ%}R(šf»‹@=í| 슙YÀà>8kEaÛíF¦Ap2N)ŸÚQ†ܘÂSBð$0¦ÐsÉ¡$µÒŒd[ä¨@Q1A㵄H'IdfLSߦÍÑ2¢Û({Ø›ý ÒÆ)#çöÿˆ9Ü/îÅÍ4+öÿýÿq®Äi±~9²2W¥@£‹—çiáRi<“¯úØ•6¥m.½k ×yÃÊY|jôÀE˜w|æ®ÂÔåùÉU| {tI6\¡mÝìË<î‘[ô¸ëGÉ­u«ó‹«k"ÖÙm|uGl¾×ý›åÚÍq º%C­ž\8Ç éMÉz #Æ5{e/\E^0··ê~Ðù­{æÝì7«7ÁJ×&£›‡ ½Y*þÚšâí;ú¡6”‹Ï{ï̼£3}…èʪ‹ic#»¾·O'Ž_wªîíæ_ÞøÀs—íËù$Û7˜¸÷”¾ø±¯™XݸåýÃsÀëöÒ8›àš}ö–OÚ»Îã±ò¼Ü|§Ü·;›¾ë±M•øV3~“›Å‹+wbúïþa4=N•òã?ÿÜ“R4~üøóýLvÍ:j&1NmØíÚ˜¼È²E›¦ýþÿõ÷ÿ¿úX Ënø¯ÿ²}=(óÓÇÃËS+Æ2È Z 5`´ç'‹i’=™Šq4 p¯VvÊ© ó³g2L`q¸5A>íl·“%ÈL&&dfôL…™ïOÄÔ&wš£5‰¬UT‹t÷âPFƒÔ¤#Í)3¥tcÎMý–‘©€§ÌŒ>ˆÙµ7/îµ–]yúáåïÿáN‚8—axް,¬<•„/5»½¡,Ÿ»»®ã¬77‚ØÛßkÞð&Å–[%’Í €õ™YW&.:®²6ÝȸÞ:u5‹¼ët9Hø£M—oõÞ´Á|p`+µÆ×O|ÍgäW²´±>ã<Y4{s€ã>76‚s q\4ýF¾.ËT—Õ‰u3Y.H¶/HîM|¥pùGLߎܯ|ä§áªwLàÎÀàû=I¾oú÷è…x¿SÆ·žø~}Á>ù=&6Ké:C­}Æù¶t¼Ÿ~õ €/–fq¼k–¿Ôe#VˆcsÃÀJ›0 9M#SL¤~8`‘€;(€âd„ÛMhKGÈwuž4£2jݳ7ÄÕÇ zšèe¶Ä5¦È&‘¨$©&6ugVˆ&ƒ£uÎf¶ÏÎaKÓ–ÙÂÖz¥Åjh1Cÿ™gæõ½±=w~2“KD°¸þbAÍØÊ0@'Dl¶“]Ya9*‚>+þ§á€´Ró¦Ž )Dä°Æy!L À*¸, s˜!»s/ÁŹ¡ûQXBÂcáùÔ"D ât9æy–㓱Ë׫ñ–ùš²Ÿycïê‡ÑÝÜ ŸK}|XkFnÈT5¸ñÀÌœIÁ´«Cj¤'8ˆi†‰±³6xxªÜÁͼ÷Sã®fA“©ÔLµÂA–áŽÁÇ€MQ»•«™¹±Ö©µ4ÂÜ"""3͘)w>æØÛw»â™ EkøÓ¹ÿZ˜nèæîåixþéÃøïþáBH>3¦'ºåN͉ڨ¶Ÿ2º#’·:Uç¶úU¨òÎ^“·Ÿû_ÂÃÝ^É·_è( ½GeÁÖ¾ntÚbtûP×fÂ\×Î:žZ»'øGŒ¾¶/u»;Ÿ¾VùW#Èg}~}ô¬@îå—“ë¼.|NßN{z^ö묜¯j9ºùaΪný/™ ÆñÆû“¾Î7òÆÉú"ñî‹ï”#Y§Í«ÑíÛÉ1ÿ8¥©‡WŽn]Í/¹ þÕ#ýoM®|áû«ö¥8$ÞëóØóçOƒÎô[€Îß_-o®±;«ëÁµ·e¸ñ"¸‹ ßÞoÍ·ÝÚÿï|ð[M-×[ß¶õzìf™[96´O @Yl­y[6=}ìS«ô¥å õ)nA×s(祒•¾y‡­ç  ›ºÿ•úv»ß ±tØÑõXÍqÒçüOsŽ÷$}\èù'ycÉ‹Ö`¡Ž|ž­Ù.¬@ó ôqÎw-Ž/ƒ¦«7N£¼| ®àPs¦$g‡×d‡­„Õ ÓEZ¨«÷ê ß)‘]b5Ꭻi©{Õ6«ÀZ/³UV m7‚™ÔÌ+‚âÅB_Ï\cÛ×nZÜq?Þ q'½[.øvÓJƒxK8Î{Þc|³N±$G6‚ÎÓ€sÑ}}ö%õ•©õL´–û\ l\+ðÖ%k-¹WÍzI‡ÿWŒÒ@r:Lm!˜óÓÇ6/Æ¡VÀhaMF²ø!2¡Ã~<¼Ž rlu°é÷ÿïö:øó¿|ôÁ‡ƒ9š+Rã¤á`´êÕj0F=s°]­V|ðÈ0’“>c„è­º‚ZÃÜ™$) `@æL›áÄø¡0€Cæ`ÁvôJN5‚(SH°:³ƒ$RÄþ&êŽ^ìÙ2<ÁÆ&—"Ñ 0ZSŽHu¯ZZÊ “0i’ÌÓŽ™¢ ””2šsW8 ¶¥CU º§9&‘F3ÕÝòV|î6·Bxom…˜H¢2`W1~ÎÃ-˜5[;/œvð˸üÝ–™€>»Pk’á ©VÑáÅKúÔ¦¶¾ .j/ú9o@Mszïšïê°¼Û04«îbc&HEºÁ|¦Ù´†:ÐŒ)UHI( 0N™˜è?3%º‘€!Ô ¢†^{ÉYÕÌ„DŸÏKj±ÕIl›/ÞqÒÛæVôX¾o<ëîµÞzoËÇ_ãLVU³g©­05ó(¥,C)(mšÆÃÔ j-Õ}B‹)E¾¼<ûTöÚFöJ†Í ¦ùµ‰²CLèŽÖ$Ú«¤÷;ž¶+¹Ÿ`"G)dq$‡Óo1-;!2zņ¬B­f¯ãjÀî4T¢å<°;ÇOá\¢ aåx6¼k÷mæ&åbË>—j2DæR5éØŸÄšßÛ’»g 3|ÆiFˆ¾3áfÕŠW<®e¨6 >‰Élp~ hÅ”µ aô¡°XT×”¥Ö=Q’Ÿö ^ª[£adLÕ¬;ß%Ƨ:Y¿"”y*¦–`ª³ŸèôLa23smš$"ÙQ€»»¤™ÁÞ_ºÀ;$u­?Z뜵œY@˃ÆÝ½¸³RvžNêÿ*êá<ŸÓW»-Ñ3Ïa&ºýÌ\?ã.´Ñ«@w5àªNR+yÃ>Š<32»Dàî€Ö¹Û „³n]¿ ] vÇÊÄ*àáñDœ+àWq¡ÎBd®³ \¾õ(é-¿µE¬¾àf¬s žG’iˆNÊÛÓå'6$gË9ƒל“÷dã¼ßw:=—xåš p…²%.04¼ìáÛ¤ \ap.@Ç—=¦,Gô ¶PE_)]Ô{6cÑ«.æmruúÖäßU{ùR÷gJ.ÇâOäŸu0ÎSÒª3 +ÐÒ²ºQ 8¥¶Ë½ûH£Ø-éä:ÙÜßxÙ3ÅcíÊ 3eê ‚›ø½aõq~T›’ß–xtÊA°½·\ª7ìßš¼¿ÁÝQ®ï °:¿ux§a*]À£Ö{ÛÆ)Þ$Q¬`_WhV®Û©Çvž›/Ï6­2HQ*Ú”êt0JÛD¦û“ó­é ýî8së篸\« ’Õ}½Úzàž´†³:÷m1ôuä¾:yuBÎ~äz~e“åuýýÕ2Æš2r tK'|·ù‡.õ»YX:=®oê;ÈúŸW{/W9¥îWD.þü³„Îo¯%nX.@IwŽs½®÷ù ÀÔÝá’³|sÕ­*îéÇ–'oi’_ìDµé—ù55¨rÿÍ6\_Àq Qò.ž¡.¬x£°Ï|ñ¡¯âÚ‡ïÒc^w^X%”™Ò•ÅÁUXpnÑóN ¹ @oï›sHz|Ôo|=ôÆom'ݼq9î•o’¬Ö ûx wc…;ã#GÉ/ü˜ï¼n|ó[õ ñ[7=è¼ín+ܪ¿öÔ½uÝNE‰~TFÍ8˜ÏøØÆ¦Ÿ?’[‘)¡À«[ Ekn$R9îÇÝóŠé°=Ú8}ú_Ó Ó^S¤±|Þ0¥â0ò‡Jš Å^÷dØß~ðžya­U¥‡ÃÄ×4¡ õ‡f‰2iÿЬCÃD?µ8ª`‰H¢¥d,"ƒl{•¦lȳƒÙ”íSjèJxã>5CAܨ§¹å¹!ƒš‚6iôÌ@JC²ev‡º€Фù&ÌEˆêÈS)ê‡j%*U ÆZQ~ÌIÐÞ@ÙÀò,5fØð /T¢VNSÛý9"»i˜F(Q ¹Ãáj+ Í:µ–Æ-ÓG´ˆþeùK”£-pB’9j!šçŠCÂÔ€ÏBC¢C~ N´˜õ¤ÈÙ}wÞî Õ¸JDLA§•R2[7n­…ÝŘP)<4IHR®L¸q U©àÌáÑÜ5Ž–L"¦„†Ùívlˆ†Â÷o†4`fì¯5…„rÑ”—êÅ hvî=æ½± ~N•»UØ´‚}]D+GoÙ|r–w7¯6M“Ëà­¡ ž™Nkc´V9’(u>¤ºC7an Ä„I³_®Ž×^ÈP©”ÙJ 5uq¿K(ãŠÈX‰EÀ|ç eFÕÍO$Ÿ‹³ŸAGýø<åÌÓ]ÓŸIMG+èþ¾K•Èë·ùÒqÀ¸G©ð:ƒþûY?šNÖ|Ç¢‹gÇ=±-¬¸9Y­˜-ÍÌ On»j»j¥°û¤ÓŒÞ,úÝÕvUƒ âk;<ùÓPEŠe><¿ZitV¤¡‰0¦[Û•,¤” prOÁ3hÖËHfÌÌÜÇÔÌÌŒfÆiŠî ÀK‘ÚÌ0N)"#£üNÝæ33óâ,æî»žü‡ÿîNÅþ“Ûu×ogNøª‘½Šzpº™w^#é×Áó¨]kÅ@˜IbÞµ¼ ÿ¹ˆ¿¤·ë~VsÑf³j¹9%°zö߯O^u5\у¸Ûsü=Íìu,ºÕ±ld3ûíÝAÚ郬|®fd¿i“ï]‘ôí €G„wI¤u,lôÃüª\8mÔè.1ñ¼L×ÞÜ^œçUö´®ÝПøê¸üÁu~Ý&yÚ€r-Ý\¿rŸÙú¢¼ðçWEï½²ßià[冷§—6^~©r?’[iUu½ê»1pf2sûœß5ix‡ÄöžçØ::ýËÀûʱw&6ë(›HºwÞzzDœ|{1lOð[LÜ.ßóÖÐùÛT÷_}à’dó—¯rãzéÖ×7S0·Lw¿å‹_ÚÒÿq“ôæó·úl¸Søúð÷8ý¸Ãô<+|˰ã‹ÃÓ_ñè•kô7.Üt¹ÌÀæÊ¶ÍM™mˆiÛT‡¡%|ð2 ^="çæÓ”œ0‹D!ÍÉ`ÝU/ååÇÓëøó>MSK9ÉÃ-ä•Ðôº¼üð¤qú—_ø‡_ðáÙêàµxyyÞýðl¥Næ)M­eµÒ„qGŸVÇü È† ú|`»4Iƒ3Z$¡=˜™OÆI2¢ f}‘x*Ü‹£ÓæS*”HVÚÔ²… E€!$¢ÉûF–œB&Í6¼F –j<5Ú¯«í Z#?ìò‡¿‘WŒ£FY†ÕÂ,™¬L ¥6ʰ#ȺcÙÉRSh7@‡vHå‘2Ð\€d›TÕ:»ÎöUS Z â¼>×eÕÞò¿©©ÁAæ )'L“ê0M“(»ÅÀ5Ñ&ˆp›]X+‘ ÍJ®MÔ‰8ÑÔa/9ex±ÁihÍÙX«×Á2Ÿ¾¼ìôi¿od ? ˆÄ½_^¦@±NØ—‡ œH (D“`†IØM¨„ÙÙC+Ÿs'~×ĸ8ô€;"æî~+³èß½ˆ»+ÀìT¬cù™¬¿-r Csn“'ºþ›½UÞú‰Í6…2ën×Ú”Ñ2èÕZ‹hÝ5Ø2ðù—=™ÅŽòº ÙðgDÀ P†y X™W…“‘¦ÈdW| È\¦Â’0)&Ø”¢3÷én¥x33“IC)3îßü伓9‘xüì}"„@ —®|륷˜ËH]Äo±˜-;óBŒ4˜¡8¨ÙaâˆÊu§µVÎçºÍoŸÎ©ª³Å‹;Í­X¡åÎY«Óž!V7S#/…Sîô¬ædC|xª ý´ÓS}ÚG|nåe7z±‰i !i!kâ«1#Ýk'BÉt¡Ð2S™Oµ©TN-Z4w33î®ÌÝ×nŒÈÌ€™­ÅÔÚØ²Ef´bV;îgÖýüý?üãé9£ ÅyÅÚqh±«ÿßþñwnÞx¼N+•mhé½1ϯ=€ÿÁ‹¾ct±áÔzñœ¿L‰Ï-¯Þ+ºžÑÛ{8:.äßþÉЗ.Úïugüi #6î%=`|½RϨoš‰ñò7ýß“pÝ{ûx×€?›$ô_UÒý¯äë±-åÛn¸üíûO:ÿG_&wö½­fëïuÕnÉé] ìjSô|ìž)Ø®HÏ#Ô™Šœÿ²Ø¥Š«^ã­ÙUÜo ¿˜EZš•ΞIÇÆÝûöͼ~œ7]¬NKŸ*ÃÕtÒû/¶Ž‘.RŽõDh¥ëYiéj^LPÞyßÕô7ÖƒÕ83õå:¹¦€iÇy¥£úŽÐ|ªµ¹ú¿`?Zʧe³~ç#êpµ/ë¢ €+V×uÎe­¾ùty³}èâ"®Æ·ož®ó³Õ§¤5èœçu1µ¾}λ9„s÷6Þ]ñw@ºÁ­Z´íéòã$ñq¸ñôZ—D¿Ë5ÍÛúúnZÀý¼ì [NOWÊú_>þóÚØÆ©eêó§¾@3Ÿiç}"$%F)PæÆ:øÔ¦8ŒÊôjÿÏÓ”œ¬µlSS*3%¶¦Ï¯9§0¥hVßj9˜}ú±îPKd{Ç×xù«§:¤OѬ´Iã;š†úºßfK¼ÐÆÖü­%³7×Âv‡ZÌìs4Q½É=º¨írÉÈ'ØkL*ª@DñUkƒs+4¦ žr²I)RÝñX-‘ò“3ô%fŠÉ,ðr©0'ðô’åî~Pöå O”¼žêS&?~Îiôùv;¨¹›[ÿÅ·j¬FÍ^ÓN3O ¥ACݹÓ'ŠE!^³Ðóå)ŸY¦–i0ÃsÑK Ú0%ŸlêËF´‚&æìle>"G ¤×*e‹ ©Tß°³x­•d‹–$Ýœ…Ù&fœÍÉ#!åÔbjmjjÑÓ^K}žúÐWÙúÏÿåì)/`“°yz6ô›à~{%¥HÜš>sa?`ãd:#9gúG†¸×¡øÖp­ÎV@ƒU Ísi›—àž®+ åüˆåV\. v:‡òø™ÜØfÌp{R@g¹+^à5ç¡p^«¡P^)Îÿ3ºqô ã"-ZÅkgÍûÆjŒUo%"ï¢]-È#·Gw(@7’áK<ÑÉgQë„NWœ–{G«­xír~¨ÜLНûÓï.uóÛ¹á*DÕêBŸN'É{<ÛãÖݸϽãùs7¶>nýì`Û8úŠQvž]­#ß3B’§ýÆxóuäø—µ† âÊþðF®§¤iKC¸Ã¹½ƒº_G¹i:^øSrt§:£Ùò:#nÐ̃óžîãÆÍßÀÉX¯¿8—œNwRÈË›z=Sòˆª» èãÖ^±ZÿöþõK’$ÉòÃîQ3óˆÌªîÙÝ;;½3;s ’ÿÿÿÀsø ŸxpA€ñ˜™®ªÌw3¹ü fîæîæ™YÕ¯òî®ŽŠ‡»=ÔTE¯ˆüîõ¾˜ÍŸ:_Öxiù¢óT¨ «¬Éæg]è@³e+ÝÞˆo{ºÜá]\º›ŠÍ¦¹$œ­÷ä¬ë|}[/&ð õ–µ¸.xS$¿X»?Q‹ÏoÉq÷süùAçoíëá}÷ÞÆ~«ÅíVÌüÈ]»„o¾Õ7I*ßAmKK×íjöž7íñ.Ë/éâi—”ó«}qñÈÝjîÞMÊ[­4Â#ßšüO;¯SÀÅ«rû»#(3¿aBl3èØ@ñ|ÑÍ7yç0?S@ï_¿;KìuÀºáûJj¾J¹ü¼ÉÞÁ¿¥JŸO7©–÷Ì,§Üƒ.w õ«OÔ-Üê›ÊÃÆäû•™ìÏzG}ÛfàKÞ\À.oÖfòê/ïóy^Ûrñç'÷ áÌâˆa€"ùòçº?ÔiÊH‘p“q¦T°QÏaÆ]ߦi§xÝOŽáãPŒ¤¯/‡—qÿzpí½”Ïû 9ºï?½îcšâõ`]áÇÝP‹^™P×íú¾˜ûkðYöŒ®×Pœ¯k-1ÕŒI”ùнüëÚcŸˆIšÐƒÅÌàŸbP@£AšRôä¨iNÉ“D0MÁÏŠÞÔ‘I¤¥Rš`Í ¸Î¼ø"‰p'eY•S{¹ÞªY½6Ã$Y m ýG À¾ƒ?«f-õ%ÝY†§õùdÕËhÇ ¾~(1'+”"d4Ò½M»‘p*™f0XG&ÒŒÆ.3[±{Fš™‘QÌ»ÒIÙþ™™27df«I‰È1ÕkF°R¼+ÝÐ Ÿþã?þ®EVÅrµ.I¸Àóz¥ßªêج¢8.Æ+bÿFÕÏ1š8.wsèz¥#¿«Oÿ!ø ÕxQ‡ÎÎ÷*¿•}¿,¾8cåg OmUdéáÍùeåÉ-ÕìÎeÐ:dйiöÝéÍ€/ƒ1^Å®ïˆÀp¾ë¹¿ƒ¸cSq‹ò+Ûc]íù;ózC±¶¡zªûæÁ¿k›}äN^9\~Ä{>åúÏϽ0ÞˆÐõÎAòå±›ù‡T“­º¢Õ(Ý„½ðλ=F0çíÌÂÆ“¾åY}ß{ò1¹ÀóòzªÔýÀi‰3£òkŸ‰wïðÏR¬¼©µ¹Ê.¼ÒoÎT½ñÒ;Õ7?§ºiëxµýb(ЗÿôáëÍ›ûpöÇ$ñ·ÌÌ ¸ÁÎ{ïúr뉻–×7ëÁ½ÿú ²ÉEŽü‚Ô÷e0ôkqùVžãVzã«Å’3ÿܶϹ1·ü%Bç¿Õ¸}ÿªw™,üõ…MÐQìϫןĕû–>¤pÿl^wrP-B0£DÉpÃIéÍè×ׯ¯_zTcÉ+ò*.œýóæ¡–‡©Ž5"R§q÷a×õ]R‘¢©ó¢Ì)ä&˜»E×yG)³â,ÆÀë!ÿ÷>üôy|ú¾/ºƒ¬¯µlÛô£âUS߉‡}•ÅӮׂÕÒy¢gañÑQ²ZF©ãþu:¼Žµ"2â;õnöyœ–ß™ à>R° )(‰‰áàÐ¥?ÍÙß4âÉHáÐx"à,8&”¨9×nG’!µBhESSøu±:šï²ÒJ\b|ý> –Þ­+B韌E^ú€G­è½¯ñÚ™å#?|Ìχ×ô^ÃΦCNSí?Êjº‘­"~¡†A÷B9!+Øú˜íRÇtJ6¸B·ëEä4BY€Î-iaæ­zý0u½•¾ìõ§C 8û]Or§¨ÕœÚ ]éüu3rð9ýÐg/ÇÚ¸ÿªÉB¥Ðjn½Doˆ)Aà˜„Á­%³fT‚qfþ´Î†YÙ°áìmFô̬5îЬ;Ųَ€8_ÿö†vŒhÙ숭—Êæ Š%uŠHušÐ: ,a0„§Ï9îG733#¡ˆQ“; ±ÿqrC´fÅÊØ+£†"S1d…Z(C‘ÍE g´Ž64'a‚^†¢š‘Y•‚šˆÏ&ýJÙ’Os!¦yDÚîÐbvþÎÕU=3 ç±“묇kcµêrß´ù~ï%»hä¸ò–?«CYu‚\ÖñdÁyã–Ýü±.é¬ B×Y_œ,¹ßpËêÍ­<}ÄVšÇ8’«äìVϯFîc%UÒ\¿xr˜Íi¡ë^3}þ×§q”Ò‹¿ì_¬t2&Ì‹µª±Z«FssGŠÚ=õ;Cï ¡tý§Oû×χçÝðòùðỺÎú>%+nÙGŒJì÷õª?=Ø=÷ôá»ÕèCöÔ}š`Yû¾”Cø>t5BŸ9ŽPîsìãµlôè yH”%ýs6üÝÐÃÜh–!¤ð\øÊp 3ŒÍäu’ƒ ûJ“(6JIÃÌ,¥ª( H!T²ž°Ù£ IòFáè?¢üуú¬³>ZâÉéNzg•”uêv¶ÿMòpÈú©óø©åê•‘^óÀ”JZgÌ.ÃQ÷¤ &³B@„šcj5Íf@¬Lhy>êcßé¿.£bÄ¢•¥-À<9 s±á=Î~…p U˜Æ±QD¶f‚¾ÔÃDÈ ag*=IÇh&7$˜µºa·ë¢ªïûÃa,îûךS„*ªð:¢éæ‘p©9ò¶oâë¸@c: ÙŠ Ýr:âOÞi©¼xkçÑóåþWaÿÃû¬ù–ëzðëúŽññqíó¸xzyüçOÊA ’',¤îmåÞ]õ¼õ ´C;¿9g°”byé›d&¾ &pçL¶‚íµŠ¬+xËöÐ} zË6r[ë¸UJ¼¢ŸmÏ#«Gò¸UY7ñ¢\ôº¾øNÁ܃`Ÿ ¥ìh´ù†›ü¹ñamˆÂ¥WëƒJÆ—?:QÔÆ· NxV€¯-æ×/ëÉŸ)Û?«jÛº·×ñ[ÊÉ_tþ‚±¶9 nÀ$¾êq:ïX±·•+à !Ä]Ô#Ëß­ï|«<ñÉúJj ‹›‹SÓÑê/ÎæÎ|áßq¿¡õžK37®þæGðÊ«vîÒ×åHÅN—WüÎÓòðs{»#ò6g}-éžâ%ÚþíFcÝüZºÒÃ.{y1}ŸÓ•¸öÞÞåÜÞa tHðPoì~Î,çæÇ-ßµyÅíõìús6S_ =´î>:ý­Ÿä«iè‘ÕW˜M¾?c²êk{4f[5ß¿ù1§ñ©7¤3ÖÏ U{ò_Wí±¯?¾>ï§±f&ÀÒ÷Ö•®1§Ú\gÛÖÍD„j-ÅÜDF"3Bè†ßü¶ßíì_þù_†§áóa|}}ÔEÂé^úÓT“쟇R<ªêXwÏ}íØívþyª%èæ9”—ñ :u.äxø´¯Ó Cã¨.|ªÚGtéFvß'èYLcDg`”>šOÈ Ú@îS5EòÙ9*_C²¹üYÒÜ0%ŒHÀ I¨ÀDeî&ä¬7éYi ”ïÐ?Ã>ºŠ;MÃîYô¬ìv½^j¼ÔçžYLª2ìžc¨ÐI»gÕ0 ™£ï`c˜‡±¤‹ÉÝØ)„S¡œ`Y‚·ŒF¢#š£jâLdâ\“ [É÷íûàD:šyiin΢y .,ù9yp|«jˆ6y I0³UÄ[±TY²>xAH}AÃ&==íú‚:ža}aÝç´£¦·Zû@¹¬n™KßHŠ@4P„’(†)Q€b‹„óæ.‚5g¾ó3àJíl2^+BŠ˜àÜOºÙü·­ÞÀ€—Õ< ÐOªlóEÀ¢}KؿڑìžÀÌlбìJîÕõ]Ö*d­ÕÝdØû®÷~çuê:÷qÉt"ö§ E€Z ‹A‹þB"7˜fpˆ¦×à>`:Rð~>µÖz2U”Ñ üBé@&d 0æSnsT’‹:,dÌYœâsâ$—6Õ9íd šm%†6 æ¾¾dÈ;הݰ$i19zZgý®Gqzq7/†¨3«VÈPþá¿e¦Ì=‚v´¾{ªU…̾˧ÞjZ×a?ænH·ÉmŠÕœµs)¤%9¤6SÆL/®ˆTÖTJ{ƒIiæ(ž‘µÖÌŒ£u¥(¥¬02Q§)"êY#k(B™½x黿ûOÿéé·ß-ÒÓ²ú\ïK­ ûÆît½È‰‰UïÊ¢±èâp¤ ^h1¼X|ßX´¯#Þ‹Ðîªêç¯ÎÛxK0}4>_U˯‘G\k¨åÝ „ Ö?/MuüniâËŠ­‡#VÀ«:Ø;âãƒÛ‹€öÒÆù26}TZ±qo×ÇœK~\‰²›Aø#ºö#…l8µ6mÉ}gDcÝ"ƒ~Ífö?úV\½"õ·ÿ¿ìù¹|Tïo¶ïÐ¥ÖÛ‚óWÄ‚HÚ§¾êj<"í}¥Ž°NX.õN³V~îxq¡ão˜ÆÝPOÃéHï¹³Û^f¬mðnA{ní—{·1uܤÜ'onÙ6;ÞLèþÛßàXqvLã­,{N[8B4\ÿß÷ºB-ÿ„7×™€__NñЯ _æef˜ çþL¦‹R°?›¹ð@]‹z?÷ç­~E­üúúóñ1#Ñ__™£ãF=þ}†Í×ÌÕ·ß8{O³T9Â~¶¤³Š› û skxþAnÞÚNgUü¿TóªJå±¶Žã›ß÷g¿óV'nΙ1)oŸ:¶]\uÏžçÐæÿ£¤ëá¾é³ 8¾íiF’ºÙspÞt–w=¯bÐ……Úªö|ùÏªŠ„ÜáÇVž«ƒæ­zšcïÖÚáþFGç{Ÿp^O+¼‹WÖ¸Zo®~‰7ì…yÁ´YÕø? ¿×iêmß·o7ónÝ­ÛšgE™§‹µÕ%ËóGoî¿Îó‡R$õéÿø±Žã4N5r?+.#Í$j­ÊìݦšîÞ¹÷˜ö/‡ýß~˜ÿÀøzøôy_÷‡Iym¨U¯û€¾s™Á0ô>Õéå%Ÿv½íÊhö½Û‡©¢&¦:bêb,õµì¯‡Ã~Ÿ¥Ò+MÖðî Î''A÷¨¢:3’&%s¤thB5q”vîá‘A&M² $U*-"$¹qG¾Ô¹ ™PCܤÔdÊ6öz£ÑöÊ $m’ÜaƒáI»bv(Š„—ù³%ö$áHɪºƒ 9vzþnè÷ÓëK|žÔÿ¦– ølN‚Ú§bÔ0¹‰µ“»L´N!LP²Ud„da¤ÜÀŽ)¥X c‡åžuTo"oÃénp7fIwLô†$h³@bÖ‚ç¢1ƒŸLEá­°]h ¢Ò™¥¦>柳†ò±·* |™ª[:|üÐ×Z£æ®Ý“¿dŒ¯‡)E/nå©//¯#‘S uB+PŽ а ¤ÄTQ;GaGW_©®ó½ÁŸÎBÇ}ÖûØ :âH¶>RWfÝ«6Žv­VuîzøfžF…™µÒ‘U‡ÇñŽðÁÈù]á:q~ké­±×.k;Opkœ»\¶ŽÑñ—çÖ;åÌ›ãäþ^r–r1ä®'|Ýc1½-\ɺå¸Ë{h›·7pnè.m`OöPËÆ˜e2®Y"¿Œõö‡ÜÑùž}±®ö²ö¸mæN·èËg_߉[É(oƺþÜÞO,…5 ©!ÏOø×%´ €OÿüÃáe?ÆD?tÖš5!!€Á­*‘"Ô÷¦ÃÈRˆéååSºñ7ß???•î÷öÃ?§$Ëož?Ÿÿ)jMO7ë‡R«†ÎË~ú<ÕSÄ”;ûõ#ö3cLì&SÒ4)3Ò”¦Îø¡óçgeâåLkq8I°Xv² õù›Òµ¦‡i®ÓF'2°•"™ˆ~HÖš™«‡­Ý}²y@£ÓF©’nxr>uâ}‡1 ì  ïa;ˆeýè–“€ˆq2yÊÒLO#p@Ýó0éù (ðÉTä*À=§I²P`ñê.šÅøªè:µ‘G’HjQüh2væT % ïß§$gwàI¬ÐaŽ”P6¯Ý™þcœ ´“3©yçvÐl‚Eº„Òuƒe­Ÿ÷cç„ñ¹Û=õ]q^£¸ÿÛ?üô’ŠFùévE‡:cN¹Ïœ¦4 ù§¶Ä…%2`†B ’ X\yGàs…"F¡0Í'^ÈDve~ZR'G_-N#ö4)ß‘€ãbWë°e2OÌçÞó4ˆHÎóp Ðæÿ¶¼Ø‘Ôbn)Ät á^<"ëY³^Sꇞæ¥Óa3jו1Çi•i¶Z"°¹˜«é‰Ba>ÂÆýr ­#€Ê*è ,(ÖÕrYhèËï‰SCôZÍç–Z²¹é¾“xCÙ'È>-£t_›o%”gÍÐûÄahX×…jÅŽ>°/>…+a[XÙã]-WÙ—w>_ïúw6'Çã¥&¶4™o:4÷tÛË9“_.Í#ï$Ï®'Ò[ãð.~kª·&«õŒz‡}'‘p+°>…kA|­/-îMúò¬âVØtÿ,Ö‹Ñq*ø „ίÿÕnX¶¼9ž¿ÉÃ{¾,ñFZ¤RðGûz $âTŽvkFØ|ð6NûˆÙìú‚œ)ðPuú¥ï¦±:‘V¼t(”†²?LÏ‹º­V\Ŧ±Â<öBŒ™Ñp¡&j“¹+SSù9ç* ÑFÌG5&ІÎ@"†yß´6Øé14)< Ìôü™YÓZ'¸() :`#y²0‡bÁe3‹@¢ùK˜[éºqš²åp–á]wxë8zWŠ™u~xÝKè»~ÇZGd.¨›ÆQ úçnÚO-ц9¬e„iBÆœ ¬¬& Ë ãŠÅñ8oƒ–ïIä4‹™SÀ¥›5£Ù ÁÕ2\€à‰ƒµœ[ÎrN~N@âé–ˆ SÌÜ`IîŠwÖ ¤¥ F‰ v»nç–†ÒwVŠÓ»¾3ó$+ZWÌ;D*Øýí?ú¾~î†4D԰辌żXÝG¾ÆÞ9Ú•2ÉBÕ¨Ò“ F„rš(¶Á5¸{)ÈLB­a 3§lÕö2³6±D%ÒÊ©²Á"³FDd6¹;l¦ÍKWÌI³ßýÓ?}øþãL¨l„Yh Îì“®Ôí÷73M”| þDÔ ÿ\«ëÙYZ=¿Q|÷õæo|Í:®/üÃŸË ð$8ûváââ¡ñËmø 幯Ù[\@Ö¿õÁ\÷…\Á¬΀ÿçFŸÛ;óÏçÑâÛ ÛYßø™ù…RüYŸÍe©æ—ç?¤^ñ ~òŸÅÒ¥?jî¸ô“üC]Í?xCÆŸ¨nó‹ÝšÍ¼ËÀ7 ÙÿxR§êóË´ÏÚVê~úý­ù²GáZÐÆEZlá{sº?ŸZ´xò~³Õ—™ß87žKóz—}±j‚—¡©îÆü.º›¿½(ÌŸ‹¼îEætPŸy:¿£DeéE¿ªg»{_>¿·qxÈß‹ft™xãÜ5ç9¾µ7ú¶=æÀçz];sþ0Þs_– 뚥*#Áňm®þ_ÓaŠHw³)º§Þݺ£FCý{*ݸëJ1ÛïÇ„ ñ›ïŸõÓ¿þ0¾îÿå_~ìHdýñ÷/µ2†¬„Å~?EmœšŒH¯6ŽÁÎw¿±ºéeÊqŠÕÓ·1T•µÂa#e‰}Õ@ë{rϬU…CySØ\ÈæU+ÑÇTM@<@…00”:Qà4‡HÉœ™'ÇÑÛ„f#kkV' J˜Ê€O|,OdÏ»9&Wÿ„¾“÷¥KK ^F:ÀÌ$‡L¡Fáãg¾Ž¹Û ¢Ÿ:ÒЃ*BåÉ"KËÈÞ¬¦"0&ÜQúÌä8‘uvê„ JU‹fÜP'@ÂQumΤDŒp‰ ÈfwÖX ù4†É4œ‹ýW=IK½|¾c¼³1P3û kEÙ™ùº¯Ïô˜¦ˆP)]]/Düô:¹‘¥|þ<* Âþ%v¥ÈëËËS6B}爊L(Q–2ö)‘šç̹tU³“Aëmñuñ)P+Ìà°9ÿ‘&˜H"…ÒAæ©.Þû¹ð?ÒA1ÏU5Q è`@eÁ–¬šfm}Æ×¬UHBÍGÁL´CLR*‘SÖŒ¤[ÔjŒâþ4<=?íjÍRŠã~IÀ{ëÊÓ!"+»~ŒI‰Zç\E;k©5ZÐá ¿h.Pš`š/ZãÄkùe·…*Ójü}.ö÷ž˜Ôùú7×Þ!lQüÛyÇÜYbÍŸ`~Êæ‹ÓºOd³ËBLÀتèIÊÜSb DZçt ]ßH;ÓºÒ÷Ý|(iÖ‹•C‚1ÅΘfÇ0üöß…{%»"³J:‡NO%áf1í¼6zÁ€„U03a–^lJjç­äßK9N¯ÞúŽa¤4{[“QÃHJ‘U©¨5”©ˆ eD >ÍÜܬ¸9OïÎÝÇçÿøÿtª¹;«.lø âÌÆþh<ý¶\rÉLÀ r\qxœ#×Xüí&ÔÍâµu„zoƒqg{p?Þä9œU½éÚº/´¼*z§¶ÃKVÖYôÅ €3¥¾±zs¡jlÖN]]´o)öò B­Þ­¶$G~µ¢òrSï<%\TПzF–@û̱[—=ò­Kô¼î+m®vÏÖ<޽õ× "¿€ ôt¸ëåB©û&ÃXõ¼cSöuj»®‹¸yÏÍ:å[[§k Ð»`gy‰[™[Wóâ0ø¯·¦û{Ð7Ú;޲Ò-¸Õ1ðf‚ö¨L=¾þãr¼€ ¾Ë{Uï3¿µ6Ý×"ü寛:¾ñÂ÷ÈØîjº±½+ÆØ¬|ÞlDø2 äÏ :ÿ.‚Ùã‡úMÈWçwá`©ÍûšñÚ¤-á "t„Ø_!sn>6ßrZÊ­Ztm^;Y¿™Ó¸èÚ“pL>ë"\…±K'·ôX¼¸êÆyжMVýÊ`kÀñ|É_ØH'Æê`gy`NèºÓµh£Š×÷ugî¶8{üŠ­Õtk'v‹Plÿœ·LóXâùc {%2s§Ôå2;¢ ÿx¨­—3Sw¡òb¶]CŽæ?ÞšŽïî”x;£riu·'z{z#Ïz!%ž›kœöº7îzQ\Š÷­â×4¤ݰ¼ýóÇá®´M§º£œù­gòÎJ©9v’ž¥üOã²ù;±~úçÆý˜‘’^öŸÊЗ®$‘„ ‘)6¤œ$3å*}fÖir£Mi¬5,Yv݇ï?üþÿ×Ù÷EŠÈ†|Àˆý!É&¡¢Ÿ`“Tñ,¿ï™R »™äý†Á¼BU‘eí- ‘T˜zPd§ŒN0Q‰Q1Á: †OA¤K-ä—˜¯Ò¬ä¦Š©¸!fEÊQ¸SnÖkè&¦Y'wâCbHT‰1ö5`º$˜ˆš(b¢$kÕk}fnŠ”’¾Z„PXCˆŒAŒ5£ L KI&5ÁJcð,å¿Eš 36Ó×ùsuv躹¤½Áè»& ÈUh™P×Rš%ÚÐj <6»ç,ô·ÙíùãÓ“ãåÓ«"©÷Ô—ÝøÚõ¬S쳎™ªµŽ‡‰,ÃónèËþ§Ï/ûéi~zÙä®/nãk §±f³±ˆ¨¨ OtÂXSç1ÛÕraòTÁ ˜„B¢ó…fÓDü˜g¥ÙâØ#d¨ €/ƪ@"J‡ÈŠfÁå|e, ¢+[‚3. Ä<¶:Â…ë»Òw™#¨d¢Ö ™rì†î€„Ðõ=Á)bœF)¡$ ”‘éÃË!2)D͗ϯMò´Å°¡1|¢}âlËÜn\®oh“û´ËgK-¿dbÚÃjž-wrl$YMœl!ûGÂæôÔœ 8n…¹ü²t²•nI‚lÞ¿½¹9 }YçÌå0§y)Mâ·RÒ}7tôbdKYLP6÷┹“]žÿæ¯Â-Ÿž8V•R2j•Êëä ;W±|*p„0eNÅ|R˜2/`í©)Ra!q%€Ìûofî&)3!eD‹ÉZ±¿RhM‘Z$wïJ×u>”áÃÓÅÔÿwÿéu²Í™é/G_æ£ö¿jµ_P Ò&©’+ô¡NÁÊ)ø¿ ‹/%Rn)U×ã‹Xn n9ꀼ귿@Ù®%‹`|6±XÏÀ}ëlFº]ÄoKØu4…Zˆ=›ÒÌEÁÍ›b-ׯ®ùK\Å«8Û ñ,sÂEºÒ¥¯ÀÙf^ä—óÝ€‘p…P_9è’3yØmH·ê®÷ÇÒ¦ ðÌ…ÄuLuýÕ5’ÿ!ÅÇíÉy¯¤¶v—nVkr·2~lï×ÊßJ<·’¸mŽŒ~\ºVœö-Gõ’PÝ7®™Wë?9?ß½üyrâúú¼oKú^tÌZã»ÃüyLjYÓÑ68 ò úֻѵ×ïˆK7ÔyžsØpøuº­÷9¬›êêµ²s‡D¡¢Üæ¤ãB âŠ!uºú—Äó5eî„Ñ‘Îlæ¾Rq½:}žë9ë“8Že†—Á Íäx»éºvÚzN®™K¸òxäiÂÛûeðÀmìt_€¾B×ÛßÕä¯ÙÜH—"øñoï§”6‡ñ-ik EYM\ï“hWsï‘Ïûµ9ëÁëw[€í«ÁkDù ʦÍQ TÜh.½ŽåI]üÙ@ç7í’x®qádûq–ÛÛºoíÅø¿s6æä·Ò$wR2Þ‘GÔò÷ͼß.#Ù^å"ñ~[òNÓýAÿÆàŒ–Š%('¯ĸ÷çKß““½wv§ýˇχZ§fGj]a)­Ü×Íjfãêæ$€Ä ÅTk?|6"÷‡ýKýé_êˆaè¦@@bN‡ÉMQ§qL¦p¨>”zAà>õ AÙ›>üh •Ôkè (åÆâ,ô.hèœÀ1If€‹nÞ¹ÉÓ*_Ã"5)It°’<1K2Ã$>ef*£j-Ù€HócKÙA³Ò! ˆbfEÅœN+T!z=ƒ,‘â ]ì*•%Û…n ‡L(F› ȘkÌ•È.-Bûš½±ÈRŠ.ÍÑU;DNE¢¬ ôˆ"9ÂLÄÔ¶‰siaŽ~‡ ˆr‡AÄ#¨Ö8øGÒ 1 >™:cRÜYdLÊ!u3º‚Ë¥tË ‚ÄëþÕˆlÕãºÁm_3k ú‚RUÐ8Šª5¥ÏR ÃîùyÒþéÃó_Ñzj|=°æsoOO}Fe–bèúO?¾Fž oµ¸·OO|²Ûw|×·t·Å(•sÍ~36Á Ô¤ÿV2ŸˆÀlih+(ÀQ ”nþP÷Ù- #¬,ºZ6D+éö™dn¤yßEFÓûÊÐO‡}2IX)ÍvXBÙ¥²Ž1ŽT–Ò§j2ÍÍ»aÜ ¨‰2# ÞÍ9 ™@ŽRàe>Î*4F}#EN?CBà̓ð‚~‡h0ÈÔ²O>[K·tHëÉ„-’Yéçï4T8öfÈ ž`%¨î©ëû¾õ,¹y¼Fé ƒ¹¹’‡¡—[×w^\ÞÉé¥$4J2¸yo>Ê“îý76Nôâ}74.$-‡bNd‹âŒ©1Y{ï“Sg!9 1i0¥¦Z«¨ÞÒ°xZ®v¡ÙhÖm ¤2Iƒ”‘‘¢”ÈŒ…2rÎÉÎhóâÞ—ÝÇç‹™ûoÿáf¢kãM¯z Ž †x^IòÎõ‘8V>¼/fㆤzÁ=ŸK(û·®^ä·ˆ~Ö6þ¥Šãgˆ¨ŽY7}³Kñà¾îÛvl¦|i@xŽŸ¹HàO‘p«àêt„•JÊŸ}¯}¶O\'Ú¿ºoþ†ð˜Îت­:i;_IúÅ;Ö4ü›9†[ŠÁý€k½ò]æ¾Ø÷ ¹ó :¾±\už[xDtzÏÅÑÏïšfÎÓaä#çû­@ê_ªEüÑtlÝ }M—áÒöÆ_tþ瑾L»A¶X§+¿üv|Ã8™·vßâUp–EÄõ$»YDÿ®áHÒŒKX×1ÄEà ¦­[©î¯¹ ׉ú+ñ™*ù®çôXŸt¢–œG«×vX•&_v^ØÊýJJeë¸9¯Óñzdì®7uf$æÿqU1ð§°ùª‰î[úH,­ÄÐJ€üÏÝUuÌcWèîJ~Ìøþ—÷Ÿ÷u¬íC÷ãgv]×ѹXPÒŒ Ý™©z§$ë8õ—ß|`ÄHåóaÌiú›€HB@$ “1o;¯~‡ r´û›­´IqÉú`]b˜cQ2á†ö ¶ö.wGKÆÆì VéÅ#¡]m‹¹ñãÇQ£Nid1”»Þ#°ë‡aèÒP¼ »aT²÷§®Ÿˆ‘p·DV¨óž(½w5©÷× Z'tž¥X¢Ù ·ÔßáÆHBbÍ×ýAÃ`ÅeVÜ32KfËŒfÊØ&¤Ó%dfdºY13ã4›‰‹ŠŒˆ ÊÊŒšsŸYé»–²b×Uÿþýßÿý¦3ŽÑR“œÞòŠ|‡Þr; 0…ð¦ØÍ0O7\y/b¼¯Ò#¶I»§j ݨÉÐE۞ƿºòß?¸Ú*ºüòÐè–ŒÈ/E^\‰¹§²îožéyçá] 3ôñçyŸ Ï÷-ÜÈ~h³¶è+£èË7]2•óDuaõŒ·œ¯ßDŸzü4—1û €/Ô"2ïzqî9¼-žKy_2&7÷S :šÞ*Ü•0a~È«ùj/ö5JÞYÅ÷M¥®c'ÈÖÕûFZÛ7Ó¦oôÌýÛ›|^ pRįÓB~¦üý›<í¯™²¾&µ³YòËÇ ÷ÿ7sß$…óÇžBøƒ¾VÓûº½j^ tÌ>[î?8w57œOëçÎêÓú­qY¡HÐŒ·{[Ö'<3Þ}ö6Ÿ± .€L“r¦k©ô·¥ÓK•Ž6¼ûm‚”šƒ*;Šê:³k{ÏÄqÝkv\°mnìoøíƒsöÑ*Ⱥîì;¯Í®ÎšÇèvMÚj›P*œwÖ´qU׿¦ÁRG×ÌËíñÍ òê®l pñÔáâû¸f¹^wtn•úܱä½ÉÛºb{­ÆÞ½ø²Ýˆm ðåfbÝZÏsìo«;C­cµfÖÜ™uÞ×¹4d¤ QÝY3Yg–ògPƒøÅæêø)ç’ööÔ”²Zï i` šÛa &$Qgçd:#2`™'»ã¦Ä¶Æ3 ‘"¶x$ÞÏzWl<2KïÃSGFLé»#ºnPÆ0ì//d¶+SÔý´ däç}Q"3³‚–Íc )²yþËÖwàq2ìõfBópMî,æІ, ÀhA(=ÌÐSf±4@Ùν/¡W$–DÌ`úl<lj a0·"ÁÍ„¬µî†Á!U¬#²ÛuÝÐ ¤[ºCºb})`µ¬Ä>ðýwÙf–â1f¥Ôu&ÐZni¢1§HÉz³Dd†“^ÒmO“d)u(æVkb¬9x») A1gÏI5‚‚CÈŒšQ§PRË0™ÿ¶/»þéû׋ÈßþÇ¿?/h <çN¬¼š¡¹}áëŽ|µÒÆ—eç„e9Á€.–Ý™¦hgúÿµ¼{ŒDVèã ðD§¼G¬¢ŸScõ±ù+\TpëtÀÇ Ìu”Õ.w]•U®ƒ’[>kÚÀª‚«ß¿ÜR\oœt@<[ÆyGöºƒÜyTUælçpº8gQêY¬t$8‘’niÚ/È ÇvùU *]¿s÷#[΋º¶UŠh-Ñ¿Óê´NãóÍÂŽ5›c½g³#õlK¼>?Âͽë UÔÔä)³Á®ÚºÁ§@ò<°jÂqÕ¼rB¸ò8þ„DÛî­÷z›[.œƒƒ®'žvëÍl¶XšGÈÙÌp_üJ*ôíN)®·}7¦QÙîWAþ©ðhµ•X#}°9ÎÆÿ¥M§«kxVâEzà°vKí½ú©Ö ‹G¶Nwv7wdúõsz ZS¡¿X·½‚†mšÖ_¦ÇHlÁ©ÖƒY›«®@·¼Ê\žË:Q]užºÅ¸¿¾bÞsä΃¾Û£âÍÃ&èü/tA \ÍjÇB·õ>ªÿ Žpa™‰óÚл$ŸN”ÍzÐÛWò2º¸Êy«w¸BÞ註¦®o*§oÊñ›µ¦.ü,ïOª·Vÿ»“ð_t^“ÑE}}»ŸúÞ›¼•’´…¬¿LÖ>bÿþ@Êá±æ:†]{ÏÞMlênÌTx6ô·óu·øþk‚+?a\iµZg ¾8 Ùþ¦~®€Ç¢ÞQ·rkÏúVƒ!/¢ÌGS·N'• &»a £k§<á¶Þÿu ùošÿÙ_zëhyÑõ²Çîþ7ò ×Mâ7¬»û2+ùŸ©@ïÚð_\ýå ö?}_u¬‚è¾ý\†žn]ߟ…Œ$d…P¼Àl:ŒôV!m±Ÿc?ï‡Þ­XЬ·óï~ûúr°çÝø?ÿ¹4chL<ƒƒ!@B‹¨qO‘†â2¦ÃÜÌ•™¤íh)yÉBœö”‡ƒåÞÌÉH2ˆ‘¨‚!ÈYز„…2fÊÇLÑ$C‚’½h®úw¢ïìù >";…‰ÆŽxby‚í©©D2Øw@"'L–ÏæÊàAš”)Mã`ðF„%˜9j”Y'š&Rw   U’©‡ñ‚éǨ–ìwtч°Äå`S E•‚] HZAgð¢¬È #Š/ÓTªCV9å d zcÖ&íéÉQSC“K½*™f=©HA `œ œg©×Ä–Dùbìx}ݘ]7||r¿ÿý^Åê”ÅìõubäïãðQ“cí:ïú¹ç¤fŒÒ$zaL1ו{3- è€&Ír< îP"sÉsÌ€„Á‰Rà>{Cð‘P b>þ2ç,³™¡OG7œ|8Zü6ãìŠÄöû;P³³‚÷èûq_§È¢ì†ÒœÓ´óû—We ƒ Øï_Ó÷ß|y}±ùÉ,§=”Ù; {ÙW3ˆbux Ù YÉ¥ÝAKc÷Ïèÿ\æÏc²Y¨ãâ`Ìyƒê pG,ˆ¤9PÌ¥± Ù4:Ó"*NŠÊ¬`-WµYÊ’s® $ÝŒ’ÑKéúÒ±c)ÅÜ$”RDf¦Ì§¤÷ŽÎjaÐKçÑÌ:€îwÿè MQCHEŠ‘”*½ïÌ©æœÁÅ\ê| ô©¢Ž•nC){J0 ãXK¤ ]Ë…˜;Íš~&ÈÈbNGðL#$e´LBÔ±ÆT³&%³9øs÷Ò­øuÉÿßþý?léѳX¿ÚŠ­YöúqÇ5ƒÿlí;;psóprúYI륊7–omFO¼„³¼m·¸éžófÀÆÊγO¼Þ(Þá\oD²ú’ˆ£E ·ê%¿UßaƒùŽ ÞÛ…_)=ù¼Uyo‹±ŒövÙς٭?œ£ˆ/ީݽ}_ßÀs/ºó+£ª>¦Z~Aä|Uâ}©Ýœ Ðox’ýlµœwl> GÁë«:î|ârÉ»Ûè›»§Îït|Éòru7ŸÊ6íÞóá'sÇwmå¾ à ®þøí1w‘ãüè8“yõf¿´‘’ÿY;¾'õËw¼Wá}_ÀÝYä~†þÁPá/:Ï•+·2Xß~=ûÒ·½¿âü9µS”ëkTˆûëÓèõÇRì•QÖÅÍçäÎ-¼óm&¾ á Àãšû‹Ï‹µ/—Ú;Ž7À™áÕƒÇs'!9Ñùëñ¤:~F0ýåù}+7ßñ‰ß228Úö\æVÿ»sñÞŠÀ.ê1¸wüɼ6­Št®òë%·X'0§ý4“º½~þTž‡R:+f¥d73d±P¦œª+DQV”)«}÷׿aj÷ñù¯JùôÃKé+¨×χ§ÿðïóù_2Õ“x¢&a’^É'à(ÝU]Á@#if&T²R¬8„‡QqxQLIY2áá2ÊÆd –Ë"›šËÉ"#.„TsÖ¢àfȆäÏ:Û=Þ82Ç ,¥èÓ =1"ööì6¤)ø‚x.–JŒ6eDf£EªÖ Ø9aðd%©Y—7A&h2À‚‘ªÊÎaâ'NOô}2X4òudLA:¡ÎÞŸ¨€Ùf¶/r*smµšn˱b(êŸ0½`aµÂÿ ëB¼’…F5ôd¶3«‘ MÄÎøTLBUàNšJaV²9O*[=¸õÃ0NÓ8¥2ãpøžV&IAwOàû;d¨jÿ:Á°ûø\’ã8ޝ#i%ë$ æ¬=pBœY4>£ŒÐJ.0"; ¥oÜ@¢Dt=ŒˆÅ7¥ €Oÿ‚ŒEþ3ÈHÎb« kÑ0G.z#þ“`ÁÑœeQX­ävÏbBÄg)IÛï§]?ôýº~ˆ8ëÍl?½Æt -¡á郩ŽS 0§ÃØ=ïÊ0ôñ¹ªS…ð¹¦Ó’°v¡8›´£wƒÕéÐÐOM©oÚ;Þd•æ¤ÛToD î3½gÎãq¹\‹ÏÁi®iþò6°Ï2…-iƒ9a°ôk™#…â¥ïºªVìú¾ïŠSHÈÜžJ)nŸUÓñÔu^ºgÒŠ¤®ôýßþ]‚ÆœËíkVd%«ÃC)f1FzK)àdÈ3ë‹£+2ƒûP#3ÆD‚¢¥ lžÖÂ.w3²FTÀHBÅ]¡˜ª"S­cÍnæ[q+îîOß86•®uÿíõzÑ;ìTÝOA%y¤}Cýÿ\Ó_‚«­ÒïûÛ€«À·Õä.õÙ¯ËÜ©Týå_kÑôç=†¯Þ\Ý_ÔëýL;Øû·L_øÍýâ./®@›K¾ùÕcè ®6ß#à>$áý1\ó?ѱr­3üq^ä[þÀ<ïǶ†u‡Ä/1"~åŽü¡·Ï?÷£ýø'~«{'‹_:K¿Ohz<ŽúK†Îƒ€õç] ÎÎuMÅ¿hå¼®ŒßlI¹Ó†r‹fv1¼7GÞ1‹«û íí]$Ú14õÿ¾ÝÍúß”§ß¬\Ù¾ 'JüÙ«uDnxj¯4€2{n^x@áÜZW¾Ï·ÎîbjÛº G>Ô›U 7·88+CY*AÖZïªeËú|¾’íHïîuSÒ±ym1F*[ ÀÅ[ëÖgï°ê¡Þ¸GÕi’£°îV»…½€m--°Â FäÆà¸²_*øÖ&ï§¾ü+¨è½Žûƒfbx49>éú³ç ß³±c¹Ûƒ \–øÍ²ÈE!Îu>üAwÓ ˆsª¹E8½yMtíŶϗzùñó4Ž­€ôõÓ':3KÈH'e¤D/!Ài¬US"UܼøT#%/R7øë§ñõ_~œ¦üí¿ùNSýÑìóï?MûÃ÷ÿð»éÿù?Qi%˜ê¡H< õžÃÂupÑL¤ÆDé°+VhêB¦aR% ´Ùë¶VK±7¦ˆj’&™ hÁ)S ƒSY!,ö°)6ã…š!wa h`oþdå`Ôàü°£U³äÁ£§:·H)%!UÍÅL š%D%E°$'é%ª`ÑØ,CÛÂCè(mÞï jCE€˜#RÃ*â%à :G/ÓdvŽé€L.)™bVEª/f.4î<äŽö#ª06 “£KÀZÑ‚IN’AfœæÆ¥cͰ™®•ƒÙ„D,9—yƒ"sš*Kç&ŸÆ®X·ël(ú„2à廾Ûu¬Ù»ïLuÿÚ«#¤˜­€=röø5ÍD~ZŸ‡/Ò¿€ð¥Æ¼3˜åôpzÃ-o‰ñ€â0GVL/˜*2zfA ô3?[s€fÐMäü¤7ñ}ž4{·L@ûC°e™"__>€Ujâ|zÚ½î_§i̬æÅÊ !Ö›¯ûW%ã`ß}÷ý¸ÿüüa@|6Æ—Ãt¨hçs¥?€\úÌ Â; A™ÖuÊSïÅâ§©+‡9±Òfý:ÍÈ –ÑÐ@ª³úOCJ7¯yŠå‹£=@Ë Äì‘ Á€&…¯Ä–•Ñœ9àb$(º`ÅͽÛ=íZ r¤ú¾PH# æ]ú®+…æ4võ_F?d±"SÕ!œ˜ÌÜjf’¥È2Ç©F g²ïº§abÊ‚´¾Ù;E«©af¤!3ÓæÕÖ˜?’¤P¶eÊÒ¦i§ÐTS¦ Éê§ïÊpr÷mêÿ¿ÿÝ߃÷¶.G Á\´x äÐ ˜“ ‰ëÜ“IëHäAp{+{ ÇZß´Ôî=ÀðmïvbM<¤Ž>{>éÈ>< ãWÉ‘d+ÝØÍ­ÃÚ Ñ›ûí‹fÿ-ûŒÎw± ¿r,6!Ë;­‰—$ÆkÚq ¦Ñ5ØþÎcgFây°qN9Ñ ;2Äf`]â}Åüå­}ñõ®ê.´†\xsÀ»:Œõ#p« Dë1v1h­0«+}3IsíPÚîÓ±ig½ý[žl†Ö M :}y~#xµ+>ÑU×Qÿ18l“†6 e¸ý Cø«‡ëÝÁrÍOm+תÁµ,u1ç@ãê‹Ñç·žôëñó f·‰®>„†Ë f˜±ìtyÜÛk¼VØ/¬èÉ[´ºåñþrñ~ïÑã£ôlǺŠ¢pkNk„¬³Ã¼Šë îFoÜí9·ö×·8À+ŸK®Cš­RÔ›ãÿÁ>›û7ëñªÿ­JÙëdíeMæÍ:ý#‚š‡Á³ÒÙÛëà&‹ ÆÐùó‹¾j}iü3\Ò:°{äF¿‰¢¹Ÿº ?¶/òfJõ–ôÿxbæÏêg~õoWÚß×ä~ŠN¼®;6£OÜ.Ø¿|œ¦’eâ?†”«Eé,š»ÝpMbz 7öÛe£ïö3齫ÎùPÖÐyíZ~Hý¿ÔÛ¡æ|v×ĵð?ó›V*üE8x•(¹Ç|x nZ è‘+ÿP"{û&~Ë€…“{ÆÆe£ýÆa>Ø ‹‘®añ5“… /Îã¾1c¾Ù¿vÅLàUöm•ºÖçtEäÌÖ?æ`Z…¾T‘˜”8LñùÜçÜIãõƒ` n³”1Ëô¸Ã—DÌôoKâ¡‘2fï„v Yg€¹AhÌ¢V¼nGÁÂ@¥t…šdsSº]â¥ó¾”ÌŒ„ „Ñh½?8:#þúo-ªÌØ¥ŠÑÈ©XXIº3¡È¡(£j³KéePï–»Î"«„œNô 6eN¤· ðbFKåa BnÖÚ]"²µ€dMSÖˆZ3®¶çß|\OÆÿþwÿ|;¦?þƒ+õ¿m»VÖÉUà|w÷¾‚²«ÈêLå˜ Ýz\sÐ]„6Šaîýt}2šÂ²‡:+¿ùnÉÏR’Ì÷Å\k×€‘ò­*§‹º >–½Gƒ¸6EXáÞ«×{À;Mo*5\öu…Ê9oýË6FÛ<–sW¹ÛÖÄÛúÔ¥°~qxî«o±Ö^.„˜SQÌ‚Aœ  «m¬6?ve7Æ[op㮽DÞÖ>þà¯å è2„ÿ"•äÎîûÍÍÄ:oøæ$ömë¦L©^ ýwŽvýS3;O¿éÁѲåÜðîÝÜ£còèÛ§Õ†w}û¾æó~®Áþ‰ë¶ÂÈm5ÿÝà¥/üóGFòû‡:¿ò¢ýÃuÍ!u#8\”H>rïÍù ;¦fÐùG~¤•ñγM¿¾~ÉWy(ðýæ-E÷@é\[uµjñ?6âÒ¦³Ó;tÔ%aq´âO¾ ÷&ßð×VÀÍIùÄåýVwÿœ™ª[ùí?µaõ IÑûÜ—>M㤟ú©z’t3sï)Ô„22Í]‚¦©8: °I™¡ŒìvÅ]o&·,ýëËkA*j?ôÿæ7O¿ù¸û_ÍÆ±~ü¸ó»±Ö©¦#žž¦ý>vTv¼c¥z3E5s l”èdpé­Uˆ’dl*háF‚U–R ¦œ‹o–êÙl–ddÍ ¥2áC≠Â5¨V`ÕêÔåSº‡ JNÕü³›HW s3Eee­Ha‚$tÆ1S†„˜0ç< À 6Qlöµ²OVæ j¹‰“j££ÔÀOcð…^‚á{fšŠá0 B1°CTL#JÁìâ*Ôœ¿pr.ß.&:ã`VÅÌ éà‡b5A¥™J›5…Lͤ}c`Ñ5;â6ŸX3ÛuC­Ïì 2Q¡¡‹)±ëK'ÀùúzØOêºâÅ^^÷˜êKÀ‰Þìó”n¨BßµÐ\wߪÈe@´úœ~CK14[·Ç\¤ïDMTÀ)À|׳Ì=sYtЀËçnî$NîÒàºaVÉ›µÀ\á.¼î §9¢Âh}×{ÙA9µï»OOCyþ\_¯ûÇR:ë;HŽØ?=u¥³¾<¿þðZ_G/e®£_Äw-¸:²Ñu&ºEp‘S[vÃlÖ|Ô)r6L±æÊ æ9Ô ðÖX°PzŒh !³‚Ÿf_o-1A„µ~ˆ ªÈŠÔÜ p„)µŠg ue÷4¸;ÝŸ†¡+~ˆúªJ)`ë× ¢ÊŒdšwfówR‚€¬”ê´…B© Û(˜#Ó#Ì;7Yç`¢7¾ ]1Ïš£¢€‡À”Š…H¥¥”Ö®ÓjT` ÑØÒm¸§¦¨1Nuªª!)A/Vú®Ûõ»3èÿoþÃïh­DG ÖòmÕ¥9°¾NZÙ,?ÿ5Z»#Éá[¸³þ„g_d _ËSåcwiK_øô°w X7bWþºæ/ÿp\k>M¶ÿÎÏºËøYasò«âiâýü©_gîŸkÌüúº•¾Õ3õeµ?~ÙìÏ:ÿÇ98¯ú™l@nîgb6›êî|1ƒ®¾jö|Sv¾z•‹öÀG¦¹[u¶3\´}kã”x¬m"6í­uwM<–½#žzp6Y’uºuÒ·õn­cÎU?]ëþßuƒ÷˜Jgn¼Þ¹êtÑ-«ôÍiôŽÉ O^§FS¦ô¸ÿáEE›VÇ{Õlµ.‘;oâ>^ÛSó ´®ú^w"ŸÿÝ U]wÑQŽ oä³–—+bÐéëGúg·Ÿan…û§V»¹Zâ¢ã²§uJ5c^Ö°žà7pÆçÏÈ­%Dز < çeŠ\Ͳ닩­×úö]o¥xÖýpìÐi.¯:N9…w+]G73£ e´âJ“d$3ËŒ1…:Õ%ºõ€¤Á;/`ßEÔ®ßÀõ»‹Ôá_~è$v®}˜Naf º;ê ÕÜ@†‹TNVÀ éN#£À©dNÁ")H¤(BQRm5Î’‰Ì€¬t`"Äœ¯ÅÜÜ3J’ øÞMÄ¡¨vì ­Sq¢¢ƒ=Ÿ¥îàÝϰC¦*)ðeÌHxX"zXßgNŠL:M̪4ƒRÀŒLiÛIv¹hŠ’Í¶´JÚ#B(ÁOª¢ ™xÎ.R{…ÀpH^B ƒ¼¨‘ñ£¢2;@ *Ææ ”‚.‘º‚Þƒr:Ã@_æ× ƒrÚ>䀨â|•<‚»uÆÎ­"A… ª9êÐ1ƒHY*Uë>R`Ô¨ ™Xº.¿ÛuPN‡dÂ7ëûnÒ4)½³Ý®STU g¸ÆX¸; Û§MÐæ°â÷¹Nÿø¼E;k[Üz 1Á j@‚f@C U(„Ê<–Z ¬­wð‚YIoM ¥]ó97€Ž¬ÑR&(Aˆœ¦Ï#„b¾Û}(²r:Œ»n«¾ÿî·ÓëáÓï_¿û΋uÓ~Úþ ïºnØõOßcªZµ\̺§À™ûDïèÅ„ÚPûˆKº¢6ç æ¶†£I/"ÖòDNpƒ;BhÍ‘ð…óƒÅU8 Ï§i>gf:P̆Ìs;ˆÍ&›rºÐYù0|}¿€õ}2Œ^̬ë‹Þ¥pÐ|Ÿ‹³òoþnˆ4*‚V鹜åÑùTŠ&ŠôÖÜW|Ê*©AÏÅ=YœŒÔ˜¹¯•@"s¾“D!Ô2`¢’CÙˆÿ5¢†"ÑŒ‚‹÷Cÿüýóqâý›¿ûÝ;sØgUýë¥åHÕkÑ×™à{Ž[qÑÚÌ·9§?º]­¶+¥q«5Y+º´œÙŸgõ¯I²×aüÒe¾AÙl ÝܺÜ2ŽºYú}e¹}c‡¢U™öí>̳RµvÃ÷Üý³àI÷¶?¢f¶CëÃÙ`“êq)s•ܺDë¼W(Ù ðÏÇÈ+m^è5âæ4ÓjÃ(ûŠÑq ÎùàeèTžr ¸öEÓÖ[oF®ÆÄ ­º"uðh™=oº õh¹ŒÕ3ÎÃ[zÉȺɽ<ßk_K¸«scky_P{;³¾¦Ë?y6ñœáõTv-ylés’„Öøµõ¿SíŽ+*6°QkÂíj‡«;ùù^Ý»ûû»Mò#[­5é½Ûw¼ÛLò]v>Ç4ðqñ8ßí^ÛÞJßÇ ÜOcÑnÒeËþqF½žrެ[ ³¥ۜۯÓ·›*6À+°öž8@Gõ„›©±7²šëÒëeåœuõóñºžÏt¾©x>r07æ"n¨~ç"ìù¤„[†öë€G¼ò†s}N_1Ø.Å?uèü­¢«FŒ«–ß³fÊõTùºôƒ—þ.ãx«~“ÔwÂÝYDÞô¸}g {>ójÙÖ¶½ñ⛸Ê%¨Üz7<<Ä?ÕuÎäâûl¦|°~]º¬­I—·óØÜ|pJ¼}¹6÷·à6ëìÐõÈÙüÎÕ2µ,Zõ³/ÁëÝQp>ÿób¾; ¸‰¼¼Çfû+W‰…SüMpµXê²{&àjK 0ou­ño¥Ät‡ð»Úi÷šÈnUTèÍÎÓTÞ¨W7á±ÜÁFüp„õßìx³Tíøü¼;';<„»ÓèÅl³•’½‰äÙr¢µb{OEàåÇÏ1MMÖÿüÓÝÓÎÜ[==If„<ª5•‘€¨5fˆ(¥ÇBƒrèºq?þô/?Qùñ»Ýô: C755E¤—ÏŸ??ÿÿîÓÿëîˆî©tÄôIOžuv1€r0’»"¼ê”ÎDTéP+ôN•i9×;+¤’&W&#á™)HÍÐwÞÐØŒrQæ¦T—9$䀾³BŠYi™DqëŠõc‰ÀTÄ.÷ ŸÈÊ1Yµd€Ž yˆ„ØË0pJ&(Y¥Ðú…I:à¢!ƒ|B é!IÉÔA1)-ÙѦÈJ3R\ö:fšJÇVÆ~DýÔ„âŠ*šÙ©”è Š#ÚO§5ðTXÌ^B“ôša!oí 9¸u )b×YE¦ДÍ*už½[qz(‹Áͬï±NéB÷Ô¿¾2Qú.ÌY'Ö´Œ)"àMt-ޱNMa¶ÌÃþ‹«-…fyÓùQìD,H[Ò³*3?âXÎÌY/±D+noÕëî€d³«mÇk… êfeå’f2€„¨)éBŒó|Ó óç¬Ã4'Ù˜9Ö÷Í÷ÚjóÇ—±&ëvCÍš#ÉÝðd,½ö‡q¬¥”¬õðãçZkÔS=Ù@ç´ü éK¡+öa¦ DÎy%”HÁÒÿø¹ðCÝŠ(fß}ØŠŠši|~Þ¡//Ÿ_‘ùïþî?þ·ÿŸw,*¦Oµ’¼¨iˆÊâ,%÷‰I³å¦yC¾sð!!’u´H %dÐÈB‰LÎŽèR³ömAM.ù_ ¹<‰”²PƒØË‹ ¸äæL–†K¢ÜX¡i¯.½‹Òƒ?`ê‰!X€Ÿ2ëOë Ò4)--¥BF`JL“ 7 CmÝM ˜ÐZL˜2è9‹‰~F”4¥vîÓ”šJ:hžά†¹LCES‰–ñp"G‡‘Ë$à ÔD ÌRu‚"…´p‹g§Àb¶´g±J¡"•b]bö°ª ¡á˜Ü05§\¢3x *kN9&ó(†ÆPÕJ§«Ej¼”ôˆÌÐP¬t]''zG4‘‰)áG•S3_>!ƒ|ñ“Xò¥El6s~j¢舄0x‚DæòöÙ5—("¦ŠB‘‹J."—†in§hýG‹ÆöquBÄ ¾OÍò/?( ]ÿ݇ïIN‡}c·Û>|Øå˜ÊòúÓ¾^>í_zž†¡ëê~óñ‡ÿý÷JÔ}?6OÆ ³Î÷7CÊIcmk×¹ë röõ=Õ§-éXÄ=„Á±ô¬Â i`™­ Ù`ç¬I6Ԓ͸¤¬˜F°#èsQ»ÍFØF3ˆîÝÐ?0c&Зì}7 ¥šuæiL$\¿ý/Æ€C÷ânS–È¢Q¡D¥;D 2£a«ºάPMFh²®ìJé”$Peãû´ÜG¦Ú䦘BˆÈˆ¤!sö ö®”¡{úþLýÿ÷¿ûݵ‘;RÔ©[ß ªJ,9˜o±%’°Ÿ!~áqœhf`¿Æ¿¾ ù¸ÃçÞ´wïÞÝ»ó-©u`þ!‡ô²q;jý³C¤šÙÕÕž¿afäãÙ¬ñúPI3Ë‹~œ?½Ý´á×ׯ¯?»5ñ½)Š__¿´{»Æôšüñ Ãf«Êu+ÃÏŸExtWQn]Žó…æ=ØÊ\­5`ÜòÆYRôø_èþ±ŽñT¼Ìí’¤ûMÍ7nÿõyÝ!ž*Ú9ûD^6A_6Ö=¼ ä;FÀÖWë–r.-ô«ŠþóV©;OÈéNž®Ë:»ª³°ü‘ÎÚ±Þý<<äñÆ­ß[—~½Yxw²xÈñì6;èæ_K·#ïS;Ï%ë®öã×§Z žì7NCçò÷îÏ•÷ÜéQÖYáÝ[®7ê>N`†õçžPÑ<I³5¬NÓ ÀŸ~ÿûî©ç¬ÑΜ|"§¨µ¢ÆH¡˜r£’¢yq‹á4sïøô<ÔZÇqÜíºÃçý~€TCó›<ÔpÛýõo†ôþ¹üðô>ýÿ£¨Œdb·C=2‚n9@Ž©H}x ãQù2²ëй©VŽÓŒÚ/@$"˜ÈF|’ µÁÊ¡HD¶ú‹Ôâ¹C¢s%–d‘;•Þìà‚Ëv„I:xB0“5T=h­ZUN‚Ÿ!þ˜fÙ›˜‘…,†*ͱ©0!ÉÖ  p¢3 (SuÒ jOëä-“ã¢Uîä;ó„ÊHìÌFåKDV’¢™î‚Dé@CŒHÍN¿$"ÑuðT!ÀCóX–@’é3 …xîXS‘"U‘$ëŒ N’ƒ[¬JA³ ­P+håòS¢$ªàdQ`û1ùi?Ž™Â”S7t2‡rš´{²bœ2¡œÆÉ‘á¨B1H³î_03 G“fçg©uª˜ÍÊ;"¦œkä­ýó·'JA±Ùê6RèhMÝlßÜ®ÏpÙ œ+Ü›ŒÞÚ0!5û74ÐXAÀˆœD&ÖY7îß?í_ˆâåÃSçÖem¦ª‡êô~×KØíÖ/#»rø¼¯‡q:Œ˜íÀ–ÚZw´'bš-db»5ËÝ™³+BÚ|‚ nÆ NÖ‚Ux»ª„ÈÖúPACבà3ÐO5q³_B™³5f0‡@Pœ½7¢VºÒû`f"ëEëºB÷¾ôF3§ÜÄgàã¿û}­ã˜ cW<ÔE¶^``È’TWJ)DT/r†{ÒÔÁtäfþᇈ¬©–ì´¤î^œcÍ)[º. BSB9MQ§š52J#IzçVÜ‹[)ÇÝqVþÛÿøÚJÄž/{«Áqù¾ª^Ü蜿€óˆ7_X@½ÀæVÆ¥psNlì .Š…È ‹0߈E/Ö>ð²û^]*ζ3×ùÅwªð6™§ÈVF}Zž™K.îaY.["Œ§7Îké .72w›[ñé£û—èê^c#5qJHØ'{cGQJ¢%ëRHH‘)& L 4R£Ö$*[u» Âø£b—苞Œ>Z™8z@Є!|ÏT ˆª˜RQ³§àÌê¤B,z´ a¨Ö™{0O­ÀFCP]A'×ÁƬnFšwt]Ú¨ìh"¤ÈÁìàa>cä²€ ÌFè "škÕ[|%è; ãˆÏ/xê±3vfU¹¤ŠÔÌÁí55)ŸŒnY3 f™re‚ séüíœ!eEGx7ëÎn€ÙÇ¡Çë¡/˜S€{1¤rÿ:6?'"2ˆ‚9ÐPþ­Ìü½iõh†´<ùÓJ³šCi u@„9 t†ÞP rQeC@ÎÅþí—AXž f³Ì ]%¼‡R@ÌIˆ†¼çdϨlïÈÈÑâéi7ì†ýücVa@5”ž,‰×Ï/OžB‘õåSôO½‡Ÿ^b¬Q JŒµ­Jýó®N{4w祘¬åB Ïˆâi§Ó„þc2³å Z©¥:æëió{ ¨,p:§LX@^Z†sî„‹ œZLz¡÷æ]a)]éœ;+î,ÍJ ¸ueW%Jo…4ÿ«ÿ²(Æagäs§Ï/+X#} ”B!wvO%Çn ƒy4ÔTÊd%ÝÚ}L÷‰È Cï-‚O/LÉlèK•Æ) Z¦YéºÎR™IeŽcÄŠÈZcŠfïáfÖyéŠ÷e÷ñÀïþág‚ÀR¸³ý=¨-œ¯v&+›®ö¼‚ÅÍڡйgï9‹|ƒŒ”üš0ÃsÁ ÷zFE¤,hEz½„Œ_è#gnL—+¾Öì±þv„t橳b²_(Dç¥*÷êwÑA7‘¥—Åä6B8zmq-W¯q]Çàáxò§PF7¯óJ¦£ÀM]*0Çâ‰;2Á9C`Ë?¬¬ÝödÞÜ‚Gò×wP[[TnáøñÚ ¦5ûB×Ûà ¡ôDU[Ê»NÏú±4gµy9N"«‡‡§xŽ:çqx‰\?ßGðl ÎïÈMüìÖ6ù!`È—&fdßåáwû}¸ÊpyìÛü÷[’³[Û™,~q ×çþÖáâa¼³O¼t\¾¿N`«¤ïÔ¶ êÙ’2·©¾—0¶­™ðúR\C¢6çáõîhYþ.?H3žðÑvÞ>OlfÚ®uCnî]÷MGÄ3Ž·1,oj|÷Ðüï(ÐæiÝúô{Âñ{½(·VýyÕ]ä9èù~‚ö½ÂâÅSsnìñv2øk¦©/ÖmïHðW£B·Œ³`ÎF´nÓ•ïDMþÐyèV"A›¨£»§ö®ƒ|×)<^vü­À?¿`À£¯‚‡60_õp®6iâóî)D?ú޾UsÀ~ÃL+7t_™[âÊÉöô戜h;A£­Ìj.€³:wäÕÛOÉ1EpTÅ–$À¯]P¿ôK_1f¯vIëjއ§uùÿfDü3 ˆSÍ×l§1ïôÏzŽšK*çþu ŠPJîææÅ‹„HóPµ®0”eú®3÷©šïz¯zýüº—úâ‘ùúzè»îù·Oùy¯Þó§Ãþ(Ž—ÉŸú¬#"÷‡ JN(ä9ª™¶ªJ(í0„w¡Ê—‘ð÷Æ{Qª7¨a™"ŒP¤T¶ÓfM˜)–$H{%©PºÐ;½d%ŒÎjÅT„豋ôd£ 4±T‘Ò:רÔÄ×H[‰7¾FdB¤%hB•‚Ê£x- &˜7{=ä^YæÜRÊTRc¦€Þ̈B›"Fe_¬z¤…C±p`¬ >ØÀùBTÈg‡a ^à`ÁëˆýˆBH˜^aPçY 8( ¤FdéÀªIÌ`wpšJ±J0ò% aWØÁjd3iöΣV¼Ì#­ Ê㔉1…âEQ¥$)äÔžˆ)µsYÁ°VàO”ýOd@Ë<•FÌÉ[8ƹœŸh¾ ¿áqRrvHž…‚bð0žÑ”3(¶\N€‚ù‰¯«f+AÐàsD *3m)+ê Ö0A ˜M‡‡—½rŒ®ïR÷‡W¼º9¤ €y7ôÝÓn÷"”ÒK£ï£ìÊî»ûŸ>g­Þ—§ß<þç}“ãtìüá¬Ô £ÿb²Y¨Xæs±[£(XËØ ’RsTÒ ü)`Gëûb© IuB)sJ€•9ë:™!§h Íd%ÑïÕ è7– òuè„,óÃþVÒYacçUüP¼«ñ¼¯á묘 ߯ §a˜Œ“é QcºÎ „±Ð’Š}•£º`]¯S†’VÅçÎ|)32¦šS)2S©b P¾þ´/ çÿôOŸÿûÿ~šȬ0p;‰E1™@7ÒÞ^këH“YI° Y7)‡²î%†lvE3¶>©Ì€ Ì$AîÜ(ÖT  b°LeoÙ †g—Þgã•X“ìBÊj#j•¹™ðôN`¯œ¤CÎù>#§Š„Œ³õîœi© ƒ%alcÌ -Z½Ð b0Ÿ¨Pvæ ¥21ŠÙG÷½"=hÍ”}²JNXN6Zºƒ†: º› N‚ w¤a‡YÚ.†ïŸa dÊ)™[šËƒÙèi@/#™Ê´L§íJ¶ò¥dŠB¢†8Eg`Lšm‡ƒ@‚ʈZ÷5IÀ¼˜uˆLBRpÁšjO¸Í Œ±¢/(DŽ3fç˜_;®sfˆ&Ö; áe.ÕÏŠ¼á€:(P t™¨#j…ŒA„,>9'Q±æTmÖ~B,ÿJ¡µP0‘˜3«Çi½u‡œ2r3]‡ß=Oûñõ§ñéiøî·ÇÏûןÿí÷ÝÓ°ÿüúú/ŸËÐEdÿ40sÜö?~vc QëËïlÖ¾â‘îµým.–à ԉ̣ãg3ËH[µ‰Ë¿:ä'“H#bÂ4‡h"¿9ºa–¼³e¡ ¡䜿S€ÝÎàź~øî©tOŽ>Üéì&VO:§¤ýûÿœ9Ì ñÉ|WsZj4ºG ÖâV§*|:žJ—wØíö5Ü!FúNÈÎåÙÉÙ˜9 )RÆ*(äD1iœŒ­ÔšSFÿET%22êTÇ)SÖ@.6¿}÷·ÿ÷þê»/œw «ÔóJÛ;†„(o±ætúÅJtÍ!d—5•ç•(—‹ ðh)îºäŒõö]v`m-Œß¦ªòxouÑoÜ—õ¦ûx´Ä—Aø 'óÏ÷º"IlŒ“/«¼þúÈáÛj©Ç@á›ä«î^®¿ù—Çí©ónÃâ£æñˆô ’µ_£àßšðßì2ÜDá­+Êq¹­âRj>ŽN%õóO”u~㢅gû^P‰Vòx ¡–v{ÌœNžOåºSÂ|y×8^Fso怷»œ6/ÈŠÕî«2èuKÝYŒ²ÍÅ9^Æ5hYìyž$\ûó=ÉruÖÃjKy*ëžS MkPþÅÖó¢ßê¬xõ­;±ã›;«‹Ë|Î*\uz®ª.©J«eûBMXƦ.8“×¶ûs÷æTµ5Gè[Ï»LŸ7sQW›•cÞŒ 8³ìjÃt·à³N±ó.×õϰŒžË¸î2Óy7‚κ¯ßØf,4/¦;®R«k¢tl3]•¤¶Q‘ùá»ß¼¾~ss7'A3šI³[Y³¿4`ªµe†Ò)5Nu ’(äwÏ%lç»ÒwÒ?ìû¾ôŸæúçüûÏ?`œ²†yùðù¿¾þßÿnBsdňvƒ8Šca %¿ýyivÄí;G(`QaŽÒ/>1÷(¨‚±”Û’9æ¤Ì¬ Êéóá§)#ôz¨‡¡Äîy× ]qãÓ§}jÿ›ç'sëw}ÿái|}íwÝx˜_ël8lóé7KdÚlÁ–‡Ëw8{‹;t{-ñYµ×ÒP Xæßg…¥•l, “ð­—Ç Ö.K‡®C éÙ™Þ ½õÔŇ>À¡x*ëïÈî¿xzùœBu7£¦)Ò‡È"ú’4êì¤]¤ÕKW ‡ýPiPõDÜá†Rbœº©Nò0ØqcàœR…-È¢šj”Æ‘T6_ßL)2ÇZ“j4bݺ§áŸþ»ÿéÀiŠ…°(œ32«d—ö’c€¦;ËëZ=9ÇJo%Ù…y4ÅùìèVÊU_Û*@ÝfÐ]Stž¸(.9m@t¦È`ŠlC\ož¶ˆö¼+¼gc|¯œÛׯ³¨ò2ÉÎ tä›  w;1¬cdž$ã•®Œ…ææ-aóXzÎÇ6áw£Ó«ÉÚ{ì äûcBëú£A^¬j€ÖÙ…{¨Þ+–îõ•¹ÀN8—;ÚÄÅŽÐÈEÇš¹ð:9.ÛRžr› àòoËgòñmÏ ¶Ì˜É£'ð)³ÑrWàãÎtmóð=ìº0èú‘ܰ[mh¯¶T¸ãrwk²:†v:×|¶P\Á¦ÍÖlªW›ÕŠ\† W{­è{׳ý#J÷k¥küL×kÏ3j+@ÙÆN¥{s ˜.ÛÐÏç‰kLÜ­a{t¹–ç.4ŒGÎz5VÉžñ–/жGÂñ?8’yÀƒ•ßF¿3oÍüxpìñ·ûﳡ¶çCžI&ªÛ[Õºï¸ü›Óò±ÐŸtx7àî½zúõ?7Ò_“=úùR'ß°!à=g?)ø¥ÚL¶¡Wwta=|êxW[ù×Þ°¸[!øý3þƒ†çòºö noz¶¦æëÙêÛ×ˆéæø¹û«°×Ïÿlñ[ n›G¯fv½o´ßš[ÞJB\oüÞ÷ÜͨôU ÀKq÷¨Uÿöþ­Éq4IUÍ>€t[fÖµ»kzfçŒÈÌÊÙ³"Gde÷ÿ¿îã¾îÊ^ûÈŒtÏTUf\Ü |fºHétˆÌ¬¬dWWExÐIàÃw1S3UÍÌCƒccVšR¼(S£ (Œ&Q³qsCŒÔ–¬bí£i=…Cªû×ï ÚßýdW«ív-¢¦îÿD«™­n í<¾P0Å×­GHŒ†ÔdŠ›1 ¼êDÉ2ãÎÐwTÒf¤†®~ ¥À Âï\u©0fN)5¨ÔˆK!™ä€C…d%;‹²d#ö.&)¢†ûê û¾ï÷àÞ\¦ƒÇ'Ô¸±ºXp—dQkÞ§j£>`C{BžuíáÁ¦ÅÖ,¥¤Ì¸7/àÕ 5@[üÀÚ‡^Yl ¬­™ Ö¬Ÿ@öA× œ¤7õ›WøøWD‡¶Åá‘cS¼¬ÀÑO˜€FÌW Àô„â*$ÕL˜T‘Š†î´˜¢ 7DT2Uu¨ a7È¿ØØ2_ Ö"‘ðÑŠÚjM¨l²ÖL3à!À '4øÊjâhäÐö a”õÏ„•ûl;"¡H1ºÑj–Þ×A³>@Àýd!PTd"Že¶AÓ?Æòƒ%R¨Ýfè`€ . "zD"µ°t£Þ€Úåà­Ý¶MÿØ+3»Øß팖]ÍÇÎ ÑÕ÷ÿöýëß¼möíîÕþñ¡ƒy³·}ßEdô5úuÄý‡e>̇áE DN…¥£.0ãÈW˜ö»˜ |@¬ÖÀö=¨¡¤¤Aˆvìmk”À Ø œcð’À[¸#e!ƒy»+Þ¶M¹34ñ©W[PÔ´¿A[(‘LBw­wõu1˜õm“`¥ÉpgQ¼­fM±7oX; ‘jQMtÐ{’Aª)˜‘ô’‘îC a¡ÌH‘¢rTà}÷Š>¢¯µë#rÜ<›ò»?ýÓÛß|Ã!ú_“éÊ × Ã¿æËôB,û¸nÈ9ñ-vjÏR±ŸõÙïÎ:ô²£ûGÕÑ…^×uWûÓM?Þõž>?ºù:qyYÌújþÿ“ ïìÕ“ ÂS“j¹ÖÄ­"G¿˜EÂ:À8ÏÉüW €­Æùe_Ô‘Ó’É'3ª^ã¿‘×Ë{l¿¨X˪­õ—"à 7ÂÍÚÆ-æF$èÒcåWžEŸû üj3ìoiÒð ÞÏi‡ùÛ’¦ùi¯ö™ßþKÿÙN‰Ë¤¹K賿bÓ¥ù«^J–+uÈîP—xbZ9Ýj+b{~à¤Î/ÅÃóÏ-ܸY|™$æ†Fˆ‚ÍÌjøÉÝë¹ÓiÙw°5¹¤µÉ,ž¬…Ï}óŽ‹™›ëôB#É€=;ÙÞH+Ÿ`Ϭ0 -Ûê¹ÀÌ/çz"6=î}›5¡eVpíÙaiÖÌÙΰu`QŠtÿæUÿp¨]¯Ô›wï>>|4£C»öÐW-†6X0†4ˆ¶ÛЛmN³.”ÎâMû‡ß6ê}gJ”ⵯyèÚûݧ?¿·}ãÅê_ß·MÉNf0âþ?üó‡ù—RŒ©»b–êB5Õgе/R¢º „šjH‡J¤%V%SZÊh2!£9ÑQkbxq$\¹2lhHôˆVV*šD—zTTêάT>d6ÄÎðÆ½˜8(Ñ8w0‚Q>ôí f¼ÙÊ,³ËR=º^JÑà†¦ÁžD¢"¤TcܳôÒ!ƒf íÍP3Ìš©Ð¾xEj m€™ÈÄ÷ÿ]õ¿¡40‡ 4¨‚ HCS`›è‹MM†¾bÇQ%Ÿ†B,f1x’ªO ÁLˆD];6žwC¼°/£Ô~„wÒXš;ôPÖŠ.sPø©»õhA<l¨]ÅQ&/Ù¶‰´Ñ@“h²0 þÌ<ÇCx\uBºmìâw"5Q‡Û~¼ÔRÊX´ 9$ƒƒöX;©=(d…YñéaÚLê:5„€É7•}öƒELî[µo»÷¢êáS÷øØÕԻ߼šýCÇÿñýÝ«Vµš} ƒâ{Ëì$ò3€Òä`Õ‹ `²ˆ8J‚)ADƒàœ A§íÛR ŒÌ¨=Ú±"T@‡kG6T}˜UT1¹Ä»¦XÖŠžÍ›ß€Œl÷2=…ȾxºY"¥Ù°>îö»¶¤Lê›}_ÌÁ"5HG†{“aµBÈ}ËŠ4;5¤ùàÉaHe†„:8+"©%ȈÌQ#k â^V¼¹Ûýïþçÿ²éý5·çÔüü9–3·Ûç…/“Ð Œ›õ-é­šÜì¿T O½¾k‹Åíha3oÖ6m3WÀ§òÈt¤òœayéœ^ÚY Û CÇ¢¦ÿði ç¶z<+Ôѱ¢t¢2¿ ÎÚèƒûL}^b«+h«ë䃻 ­~½~Λîl›|Ãoó8Óf:“ =P]MéM½JnÞÒy`Õ£»àcI+43MòD—¢}^ D?g¶¯¢bÜìvûõ / ¦Œÿ»)t0‡¾‚èÆÔÝ’!ø;KÁÏ…†nÒòùœÀæ–q|OÁ/ù˜V4¾ÏAv6å¶ïWW1ª›€Ñ[Z3oøåËnüéïŒãø"°å%Ö„gS‘æçõþÈn›G¢'!¾_´èü C¬ç“ŸùÕ—©fkœëJ0+z^¸ò8Vžó/‡ßWŸ9´ï\ÆñÊÍAùY‹Ò¬[c&€ÉùxœnFaÕIÊïR½à©%{œw§á›T?O½ÚŒ³Ê÷.®9h_qú¾0˜ÚŒ2í6“H“Îy¡r´#Ö#?¿Çåi¦ùsXs–ŠGÉÜñ W·¶ÊŸîq £xiö_btÎ?dõIÓ}ºÛ¹ÆÀ“§òõkR:š}–†ÜŒ¤/qŽ^à‚.Ø)üõL›™gÌ´nÖôè‹Û 9®`ž1YþW«)Sée&ƹy…WË”>c²3]–ŽeR”À:æ=M»A`lù gj CVv­úè:I1…L¸„2€¾’¥˜›W€„»B'5ê~×ö!¦dìÝ] -ÌZò ô·¯ }|84¯ï^ß5ß¿È>^}ûª´m÷çïíãÛï~[?þPŠª2Þˆ‘E¤Q”Ed¼k¢æ`!:¶ÈõéáŽ4ðQh†[3:9tÿÃ!3‹iÄ}¹y øÐ§¯Ý°äöýÞìØyyˆ> öÎâ é/Ùïi#-ÀÜ렾䀄îÃ2Gù%/´Ô£Äs›ÖÍÐ… ÐUœ…L¥ÓJ"+Šñ>mçÐ!kJ2 ÙÒÂÔš9ICµT J¨=ÜÁòÆå ùâ@Cc„=ˆÑ;HdEߟ¤Þ‹A ‹A FRºÃa}æpô:F&1T èÈÀ!`†b@Â1XJ … 8ÐPÂ,Ùš‚Ç 9 Fdœ9¶Õh‰Æá I4EíÝ@=usà.²Bšt‡€Qm郧î#úŠZƒîÒ }?ý¤ŽÍû$ÜÑÕÁ>&Ä çcˆÃä<ùç@b˜|‰³”¬ ŠÌEÕp A˜›"»¿~‚[iFäÆc×ýðÉŒ^¬>vŸ¢B9?ö8I¿sÚ¦‚Mÿ¦:© Œ–mÔÞŸÓoe…kNž2*ðtD¯ø "‚Žfœˆ]1HЂvÁ“ßµ©”¦©Ö‰–š±¶è›Jª´å±}›ÛÒµ¯‡¶|êúæ±kÛ¢¦DÓôU™Ù“QãžVÍ ³÷¦`lîv0îkônÙ”V7cÕîñðØ6ÓÌÇeƒÌLSâD"ã±Ï¨UR2RY3#3B9l¿lÚRöí¿ÿßÿÌa~Î (æçˆ™mÓJr_˜»²_ª__—æDÃIqVoșЀ$›Ž–ëùêE‚G Í|.4;nF×Kû¥-ÁÆ“ ÎÁ.‡Ž‹ñ;Õ‚ˆYŸÈ… í¹ Í§OyÊ:ðº”ìqàl6WÜŽÄmuW,P×!€#`:lü›º7µõh)û”„ÑOõººô¬^²º/^˜±#=+.Ÿý™ÈÕs¡v¤&è:‚?Çñ7[ü®HRœ/K¦t+žMÊÈ…„Ëvwó$š'Å­s¿?mgÊ[W8éÒŸÍÀÕ"ºQÖù*ˆ‰Y‚«yj3å ܇­lQ— ¬³Ï\”ÍÎ&0—fã™ã ÏQY,«ÓÌ4™ ,xp¡ãu5þúC˜ÕBæí\®–ƒõ6ßOsi [Àèå• Ý0Öt ò" K óJÞ:ßQWµôD½m|¸ Ml¬tón†÷¶´ ý?ß.pU\è|+¸rI+Á¢KõÜ6óçz~Ü Ÿ_áuãÍUÇôl1ñÙJáR`µEpíH4 ožŒ4~¢óÇÚÿ¥¯ãJÐùªÞ¦ªùjl7á¸ó³æRyàYõ†¯Äøü"Ùçü~ùœêÒŠàùth8‹ìWm#×oîÉe0_¨Öè-+ÙŠXH4F=² ÍÐ>ÃìK„çáQl5ÜÜÖ ‡ækŽ ø Ú€IgèòN´-Ì`ŠÃ »ìjùQ¯f˜J È  ÖMù‘6‚ìæ(BßC@CÈB­cûFQ !B„9*öšOì ·où¥£lýPÉp€HÖˆ@ôP@œÌ ¥~M½ÿ6e/£6’(†pCTÀFOàŒQ¨bt!0}34~rtHŽuN5äè?<”¢Â0 qúáq':¹q»í÷MÿØW]ðáÏïØÝµûW{o›Oï?Õ®"“†Œ[0Ðä]¿UøÜÑþ ™ØUëYÀÄ : ¯Ô¢ž?&sò¯%F1‡§Ï Z_êÝpÕÄsRÝ/5yø÷|q¹žˆdÏ¿Ûç3¾ô(ýØÑÏ‘ð·",sîÎñãžÈÏ5IþºXÓ/:ÿeOºL}í3úçýý´€£­Ó3vôY>xÜ=® ÂMœºÕf-X'/¨ë¢/º÷ º—?ìM©‹PŸÓáþÜ(çRà‚ã×BvàóÿØ÷¥¶Œ›XÄ_jYÁóœgC:çH®R+^•–:[GÚ$µ[ÏßPØ7†pö‰ó¦Ä 3/Ì ‹yjÔ®¹ÙµÑõµë³ÖþЃð¦‹»ù( N'´]ƒÈZŘ"ZbWv5’楩™’J»kT_µÂï¿Ù×úþÿëŸûŒ„›õÑ‹ÇG´EÅq¿sâ›ÿôÏÿõ¿ácwï½¢˜Õ¨ƒníC" ÷æ!ˆJ¥l´®6!C"`î=©ÌbfDÀÄ„²¥Y%›È±77à!"¥ƒ²1/Vª€›)sÏÒšuÊúêeBNòMÁžÞÊhÑd#fÊ RÀôH´¢'-Y Z<¶5¥(ìe;yQHÓ}ëûðˆ< ÔëRlè›OUe4 ÷gÏǃh` ªÐÞ@öÈ@³ƒµèŒ£ûnSP{DÂ4^;©5‡=(8Dz³ÑU×ͪ“$Gì“>~Û øsÁ€J4 ÌнçDÔ wÈ„M倣ðŽ }å€lÚ›8îP^àŽèƒäÑPóÀ(õ38Ó׋ Ýî†У8JÁ x•s4€|„õ¨G$à‰èaDqÔÀ;`à¤_¤Áö9€ Œ#(´$˜óŒ2²ììöíÃc§HuUn8ÔÝëýááPºŸ¹š¹K»õ‡C}QøáÆ9yR ŽÇGjÐx‘€ù´ÝåxS£†•MŸCIɆ‡^&ß…#¾`#,É2¾ËÙôê+ìZZM¡/(æ(»Gí‹ñ 6h^ß?â°—ûd+¼j‹¥º>v´Z€Ýn2¹Ì Î¼§U‡wÕÈp 6.¦$#XŠÃÚŒ÷$ CâÄrËÉÝ·Öj$SµöÑWõµë+•Ê“I²¹ÿáOÿTöíý»×Ó÷þ¡ovâ–ƒïôTlÒ\Íæ–Lý%Àë²ñ<ЏBÊà›Ê[Í€K„RWળèñ¼ùZ²’?aàv|mµmm}¸Ú]£•eî‹ W¶¨iý™¾î2?éîèò¦Ësy·gíÿ·>h¾ËXù!ßR¥¶ÛÅ~t4mÛmáY³â§GŸ«ÿ£Ÿ«ôÿñÒnÜá´ÊÄ-;êמÃWݪžÖý²Eç>¸ù“2›7/Pƒ?§2ÜÒQœ÷Gh¶wQ¶²¹b1“”Šn 5È5>72Î@QsaÑ‹Xùj¾LØÒªGj8egåZRü¸Ÿj˹~æWd #m“–{‹ÑùuU–+ÿz9˜ÆDWÅåºöÖ<›uÍhëKŸ˜ŽgU—¹¾ÕúÓŽ|õ-^êr.AÏfF4ÿÏòs0Øš_àño+â“ßøL0w=bÚ€“϶®‰ª:!ÃG\é"avµ¶¡·ò £Í÷_9çSëR ·"¥yö}êq"Ę̀Ï<N§aåyD5²§±$žï’—nðÌ€ GU"œ´©Žß7‘!ÔדÝÞI ú¨hâ(µ¸¤ûw¯ãÐE™ùî›wïøaxI}˜ö)¨ÖPÖ”ÅP“ #w?D ³ïú„úÌÃǪû«»æ›]Þ?~ÿ}­=úê÷{¥ºÿþÃ[£ýþHwÿñÿ—û¶qÇçì€ZeHÃÃ¥é¤ÇÔK3PR0Z kj[! F¶£„‘ÈLdÒ¸OÇýªK%Bf½äd—iÀÎlèèww³Üíu¨y^ «eçÚ¥WhhQw²q¦p¨J©4ðÊ …+(%à2C¯j-ÜÅAnÜ¥uŠ€•ûð6¼~²Ê:h²«ËtÏ2û´ƒ2Q’™ãæiŽÚ€!zD(@& Ôn¬ŒÐL à“´½ Hw !ô(´ÍDt1Ud Ç{Ï3a }¢1LÖѰ@'xAãˆÉ•·8 ±Ñpt#è7”‚ ô |°­&¼`Zâ¤\d“3GbÄ 9(àmû‚*R#K`lº7HÈÉ,w¨OÐG€£ëàŽ¶ {d õ‡À&mò¨ËW,QŽ_#&> »ÓBLab2̶¬HÝc‡È¶-”¶<-ÐÄrê6±XEòT3àä0<µÁë#4rR0‡;*`†ÒBkfI  8H  Œ`'ŠCÑe°`Â’Àž-L¤»ÁÒ¬ß5YÐediÊ«?zí[ó¸ßY×ï^ÝYSTû"âñòÞ\t…öµ‹Ò†áËa`KÁ¼mKÓ°ï[Êjt¥{tß·›¥ÑK±ÈÌúú»>2Ó DÖˆˆˆ®Ìš*f^ü÷ÿôOÞ/åîÍ«#žŠÙÅHÅ'Ör,šDs!‘£.Ä:-?±GÆmôÉ0é’”çy¾ú$úû‚êL̓™­pk8Ft¦w1pGM€<&h^5Ù8îg¢=:éCr5š‹büºQk©Ï.œ©m“$N(G‡él=Cù'M†áÿÎßpY]Ë(~/P©Yu‚G) Íc?n‰DcSr!ä²ê`¸ž}Išë -´xvµÛ“–3¿}Vu|jƒVÒ<Ñ[Íü5Sacòúާœø‰¡¡ÚÏÓÝ… ZéJ8Q9gób»8‹®y=KŸkLÍ´#àÙ;)aLdgô˜=¸? A¸½Z³õÎ €þŸ "5y–ª­:Z<[’<꣮nnžymµáóÒ.Š …—à;«U³Åç&ÏþŠÉʪm¾Ikm¨y·LoòGTj/|[JO\>€¹DѪ#j5Íæyêå®qÎЀíK8cË<Ë©nœgâÉkçbj‰N€âL:oÔŸÛB æ%Á…6Ëå úz~}|î4ý®E“ÚÉØs%ߟ Ë*2—2wWðœÙ ½½|"à\aË.Ïëˆó-Úód0¶ÄÜžÂfÒ† ù“Ű5ÊrI|i“ß,ëü2Eç¯DÑ[Š ³b³Á”/¥¼Üx›€ÛíŃëòàçÛÎ-"0/á³)«N{q"ý¸ œ´Ö"r¼>™ÎÐgÌ€¹ÉÚ"P¸•ëúÜ)~sÙ‡7ì5/ùpÞìäµøÏ…-xÝ\¼²¯[ÿ[ŵóÏk1›– ®aZ2¾\Íÿ ŒÑ¥ÅµS7Gï,˜§ÒkæÀæç‡í¤˜¼‘kŸíV—ÒžÍîÍíû=rνY8’’eʸR‰â(Pöm©µv}D¾ýîÛ÷ßÏQo$“ŒÅM5úPcVŒBzƒ¨úôxhš&#$¹A‰C²º¿~uÿøoùþûÜÿöÝã!A#?>&P\©öͽïÊãŸ?Xâí?ýúzøá/:ÜCg? p‰pÙèÊ!§ Ù#¯A2ÆHÑHº2(ÁXR@#ˆy¤CÅ mB¶f¡¬ÂC¤€ >“Åš†ûØg»·³Ñh·C>ŽÍé;3ICii®Fd¹üÀ^Q °  $ƒL<)VSRJÚôå¸yçXl@‚‰;…Ú¡ (F•ÿ…à„úÁ×—pG”ãÝðƒ'ð€’ ;Â0åü¨Ë?üu¹«ØD ¨m[î¿y­¾>~|D¤"ÁÅ>)xÁ 9û9'ÅwµÂ†•‘¨|Ô"9R`2Q+J‹AÕ'F;é>Ú{HˆÉ0Yƒç·‚ ¼LÌf¦xÃñyIPT¢ßgó`-[ÞÃÝ:m‚°;©Ý³‰ÚæÛû>`/p·ëzÁŒIôù ëÓ ©GåÃ#¤nߺ‘fËH–½—¦ë{d&¹Öxd³)žyOëS‡>µºÈª•Y£ë+jdDJ‘ùÛßýÞ[o÷»ænwÿîͧåÑÒwL¹Ç¡– îHƒXõj\Ã=_ »‘W €;¿¶úxcKÔYÿÔÅæŒy;Φêë£[º#^'5nºß>Á¸r¤^² Þ¶#zsvU—žóg0æÊQó½úd¿¡€•­n ÚŸÙü9ã9à³âÏi’óRày{¯Ò%°ûÊ‚ZÌ ”2NàéÉ.bE켑0§¢¼`LVÅ¿mÀF7ðSè8]f\£_\%?]gà3›ÂS«½çÇbð9×ü ór”°eD²¬þnö^ŒaiÏo^ÿùh–ï~ÀWBÞn>Î^¾.ñÓ4â/©tOÍË/p={i¬Â°Ï‘õÿrçéMÒç=ÓÕ€K7!“Û°Þß§èüçOÎÛív¾ÔZ¸âÿú9Ç ~.Ùå'øÎ£šç“ 7:Œ>_[ó Õ‘¾.Üýãͤ¹[ßÏij^8Öù9ØÂZëæ(Nýs•³;µ¹k•ñb[nKªô¥øLì:??ŸÔ[âÔ9†e¢we>ܽ}‘™5¢Öè+0’„Ói2Ef&–2e%M`‚FšeŠF ŒðW{|óV™ŒšÍýîÐõ(%ïw âðà 3´¯÷º÷Ÿ¨ñüÝïò‡)ä¨íÎÑa·ì2k ËmÒÛÑç !CdÖ£+hÐ @Ÿ3ñ8ýµ*[3ûÌAê~Cÿ¨úƒpW¼1Û‘FR‡ª½ ‚¡< Kò®÷ZÂ’Y”R FîÄ*,PÌÑá9¼ƒ‹èJ¶in,•jÈH4´Ò["{HP_¢‚–¬Š^YÌŠ‹å”†•É‚Õ ¦Ñ|DÓðmGúÇ $’¨uÞqæ­æÔ€ «–°IÚ>cì¯/ƒþ4‹Fo[!½P4ÊʇFß¾€;ÜPc| ‡DñQÎ~gð ;î'ݳ…†Ž™GmÐàBú$n“PÔR›¢«ˆÁᲉ´‘@àƒ1Ñ×S!a3B"G+ °Ñ*I!g¬ˆ˜À}.Óâ¹Fh}ôÝ™]ýø¯-nŠ,³_LAvÚ§Ü“Áø; ,‡ëÃ[£Ã(æÃ±(b/ >i÷ûÈá€õ;ú(›í8ê•}/r¬Ühz 2 p"¼qC[\;g«ôjÞþî1îÑ´E íÛòðPÞ¼R„% ¬—a×ô‘øøðŠ¤Ûƒv½Ì¦©rd?‰Ð¥r8 •MóW/bÜ›¡Fº“R¿D 96af¾þ¢ëº“[Qßgôjå(8ë‚ÿÛ±~ñºÿQ¦çMÃøu¬mìË®µ¯)êûå³K}ø_`š×ù™º»ühý•Yô3VÎùÚØõ¥æÙMsF— _ð û¢Ÿùåõ $=ó,úé§çÏßwäY ü—DŸnàèÌÿ{5KÏ[ æÜßMUŒKŠÙ7*k÷1œ<,7ºVØlÑÕFáuCBë: €Gi˜Ê7¯¡¯ÉZWk‰Ä¬ûøbgñ óù«VΕjfÒësþÝ1©8©žhFÃ?ò¯ón=±n‹ 3C‹ÌŠ—GòÌçHG‚äñ¿oqü;2 ® ã4™y!¸åˆ›Ká åàŸ¤¬8v6.5N·®{FØ_‘nŽ@yñ á5Äý¼ ¶Íž;™¬/Ú|lšÍ§ïTpæcqÖ³8]‘ŽË J6±ØêCÒyàj°Î˪v:¹·Í9´SÝœ—Wß|]¤ÒD)!Ó‰Í~2*_}ñëïÞF­™ùîÛoßÿ}ˆ»½9sh‹„ Æm0×…S‘Q#ÉÇÈ[c±¦‡ºúþc_üþ¾í#köÕú®½ß5¯vÝÇÃߨ]¼þÇo“øøo? RfͽۮO‡ïþùÿÇÿýÿU”AîŸê ÀFt•(£‡íÈ.%³Ê~¥93¥”4™Yf2BðiôSø¹3»/nBBMÄÛMŽJ$è€ 04Q‰@"¬˜É®T°cvL7¶ôZ"Þ@)Ì*ù[39â‘QœtµÕ!Ì&ãSºÛYWÓœLPLðAa††‹é£Ø½ITÁcàN€#º ZBBMôs´Ÿ€oM¹ ž€}ÎJÒÖÆÔÕž“²<ƒŽ?TŒ2úöoƪ@Ì‘ +È:r H„€~Ÿ¨hìã? Pµ•Iy?à>~Q$`øoŸÉ„L´}³©ï~(þ…雓ޒX@?‚ôL$Ð XŽ#>Á·U"Ñ™P &švTÚ©™@Â8jûÄLåÿ¸Ö|VÐ ðqk÷mÿØeä@à±Í¨娛¯É `T»š ZC%Ãl= µŸ]èQÚñ^¬ß&‡(4J÷À€,‘ÛÍbü¢6¥BVÇíÔÆâÇPc “æ‡>÷;*‹y)dƒ-­î^ýáÿHæþÐ'ÄÆJ­n%?=”×{µ»ìMÛÆÃáЇÅcóú•íJ©ÑÓ£«m$ݳF8Kª‘ÚÝ®ƒÙÑl ¬}”Pã)k¿2³7;€èºC×#¤>jß§))Aþîþ襡{Ó6wï^óœU¯Ór´Ê8²)záB?z¾ÛÎNÄ£-ðÉwóF|3BÛTÙTÕ¼n¹bs^uä²ö¼ÀA6•1H-›@µÄ²µ>µ—¡ïÊPçÒÁª­¦²yŒ¾´`>éä§“£h³ŒŽê™«ÊÎÜŠw¼bCèN½+…)2dóéù€sã>Ï…çæ¾WÅbÊi±/•(nâ•Þ¨}üd·þŒ¤‚I„êÚݯ҇eµl[GkµÏãVþ5Æ›óù@ñh2q:3t²‹áÉæuºz˜ÝV:>omšÕyÄÜX¢ŽÓzàz½HdãÊjÝ\Ýs5§MQÍÕ¦tÎX¾™Ë9À-œíì 3)›K3m®°4WÂXnHš] —¹æÆÌŸTkx}÷ÞÚÞçâ ;C_Fâ_J-ôK(p•½Í×ѲYKO¯÷#”3‡füüà¹D‹Ù"®mÞËFn®å;¿_twµÊÏu;nl³=q‰ ¬gþúQ¯ú4ªs¾Ôlqù`ÎpÞ¸ñžØKvGÁØ/Ágü6–”ÎD7–b‹ç–ì¸/\ùÉñ,žE«¶½js‰ÍEi®ÿx6AG>‡«]bzÌfÛFõ„'ª¡Í{¿íÚþŽDçqµ·‡ñn­Ìv~©+E£sýú!{6hçX—´ª® ÿ—ùg•µ6ÅŸ]¶™í¸Ïݪ /n¬øðâÖº€Œ7„Ñu¹g }~fÉéBÞL,odÂ^5»y)r^™Žám™Î)@>æf üˆrž—4.íÓçÎ ÙùÌhyþœÇCzÈ~o™8“ßÃÅÛ y‰J²ŒF0‹úÏgaóùâ:"þKùÌÍ b£B¶®ÜDõXl(Ç.¸§¦+7̶#­µ§ÔÉ]┯͇JK‚y¥åÆ`z>áç>ëýçvУ*‚0ˆrF:ß›}›5ú®Ëï¾ùöÏýkF˜Hæ#ªšÁ>+{k¢"S¥¡[9Df*ˆR{mØµÕ ©ZmiË;·7ûúáSñô}swß>üùcúîÃcÿЕ]Ó~û¦¯™Æ†ìººÿÓ?ü¿þeÐ|éÇ‹·9' V1Çnc CÅ4’DŬ’’Œ2#¸d9(š €;³N™$²<©¦eãÔ8t@—ʶZ“Õ%hÖGöJ#ÌŒäJ ©‚ni™ ÅX‚=Êœ-ì`áâ^H‚}ê£ÕFÖš‰j‹u‰ ìÍ%Àq¨‘ÐÞ½Ï|Èš”L)QŒ^àÆàOj¨:Œgh½7¢qÔâT9ˆ eà 5²Ê¦ ÷Ðzõ&Àlà6"d¥@$š=P PA'´'Ô£ËɹñúúDÜF«÷Qjæ”Ò *óBE6v¾À8' &Š!!x¢LfÅ9ÔräFô¦¥x$DŽo°ñýHD6þ¨ëÐêMÖkŸi]Fjô䆳96w³'²˜3¨k«Dºh';w©»0/~ÕíæIðëêØn¦ÚÄeeå'ç|ßÚˆàLå㊱Ás2ªõcZ²I΋jÏé­æ³íp±)œ¢å&qêYmJ<+ ]÷óø]ÆO Íè‰rÊÈçê6±ÎÃ_\£xùN¥¯$ôüŨÛfÏq\9$Œ·wã_ÂÒÎ%€^0a~¹¢ó—Åʶp¹' T—\6Ïïèv¹žg­’9hÿ²^å§¿Qx­ÚðE÷<žlî~¼×š3ò9¾¿¾¾Èüy^Öin| å«¿ƒÇ¨ÁŸñÆÓýþík…22úšÌT¤<\—9 ,ƒ&~ríú(铉˜úñi£r=slYímT¹±}_)N ‹û9bì}Î8 Ë(QÊI¥'(Žý(HÁ @Œg1Üï¡ëGÚÁÐG_ J3~fNnº#-pƒj<ƒæ~Žš6G`¸LHƒ„“ÄìmãÁ:ÁåÙO¦Á8auÓsÔÓ¡„tê(¿s,Aa»óOú?ƒåï±Ä—½]9 æÙÑ8gÅ€£tÕÐÿÑqWð÷Á@â(p4À÷~?þ|@üc(¢X3^ÐÈü Á5FöFTìšB‡R;/p²õ¦*‰0ºMK§õ¡¦Í}½kÜYú¶) vþ§ÿ³‘ÖpdzÃ!v;:=Ã#KÓªõǯ«ûã@ùêÃ!‰ìj)ÖYJÍtsŽ¢Fä1ýhh"µm@X†ÕTŸ¦ø©¯õÐGæÐÎZŠÿöhï÷¯¿{7Y§ã~¿_ÔYÎ|äuDüÊT;§Áç`p7 fsAÎ-Ú¾ s¿ŸÉcÌÌy#įqòßÚäü9>¯ÊøyÎ¥_gø´å12³_Çä×ׯ¯óU¸AOû××ßÂë/:ÿ¥0±Ïo!ºñ)¬¾z&G©?äö'r.Xzéîæ%‹³å¬sþ*«/^HhÏd^O¢Óe­ËDÒfºA³ÅC/¡ì ª”ÙìÚÝ·¯›×ÿùð×ùþ‹uʸ™5Ói>t7GRrƒe1耛uJQ!Œ!ŸªŽ!‘ìRÉTª'Þ4¼/¬Iµ¦ wm£]JT «…æt#30)*!x¦¸+žÃúß;ª&¢ƒ¼•ì™E J éÍ…ú”Ù&]†¤W&Õ! è‘N8`VQ)˜dèSŸ4DNŠU5€m;:Áítd¨pƒ ²õ„¾±rŒYç&Fo ½ÀIg@–Õ ªH »ÝŽKˆIW‡DáÓbÐåh';${ÿ‡žz›Ê0x H›‡bÒÂxœ¬#r¸s4 Q ¤ùmlíœ! h ã8CU£I„@‚å臡jÔ÷1ÃP•qƒ )QtR‚ ­áþÍmÿhjpüÃüT1ÎfØ$Ó4ôøƒÏq½;ÚðÚXäÈÉœÙi…¢Œ>É6x9 t‡‰w0øH£¢öhŠ5¥t0P™„I4+é`fÃÂ,Õȃ—lÛzнÚÿ»ÿ5ºÎà¬}©è_í˶ݵ #ihJÛÕ>>=ö÷¯K³ë"ú”Ñ4"ѰÛU3X‰Ú‘‚j©”‘F¶™MfuG)}MIa©N0 —û¾ì¬ë=žýÃÚ]ÓÞïïß½žmŒÓ>¿TÑX‹?ž7sŽ§Þµ¹Êݼ]‹øçÊçòª³ ޹+8õ\Fc}­>ÿrôÈmIà $é“ u†aÍñ9WËØ8OÏÂU˜­9‡âD¯Dw&?Óáv–Ãm‡ÁÓC”Î8Ü‹æzÎ"ÑyÄ£g¹þb“R½• ጠսl{ºÎÞùd«ïáš !ÊlœÍä/wáîûdR7ŸùOê$ÜöÏü,wÉ 9Á"~žÙi©¿¨[2ØsñŸ‰'v4(>I3MÍ„œÂÛùc¦j¡œ±m|zƒYïb¥Œ&˜FšG·l,:‚—»}!¦páªÖ;á¦sÉòæ ´fŒ Â*ë§rÚÎr£Ytjë|n±gÚ{$À#;|ºZž)âbîqE¨íìv> î™ïE³Ä‘Ç¿­H 3–g»åpwv!Ñ,­yæ?ûó|pVà=–#ŠË»¸Vë=÷>óeÙØL^ŽEž‰li6\|"9?#{}^mØ"Žw=ÜòUÝð-ÓîÑ1é8 nxôÚêñ_&Ý· ,>s(Îâ™ó}qû¾¢â‚->ÙíB(—}ÖŠrÛ'þ冖•ÎûòNçÛÑiM]]º°š~É¢óü¼Sräž®+U¢Kðõù3ׯ»~1k¤ + ZlßÂåëy—ÓÞ>¿Mœ”ª8ß”ÏWé…½PCà‰µÇk‘=Ïw‚ç–0g%‡£îâ±î°Àù–ŒÑ'´·.@ÿç«ŽË O—„Ÿyž­vãö7'Ü\óÂÀéó‚Ç¥éºÍe»°oîón™‡=çár:ôøÌˆ`ñ•7ÄB‹£t4柩b*>Íÿ½¶ NBAÏs`»ê=cŒÜécF¿`»ç)kÚ¢ p3ƒ=ÏŽbç«uw F¿í]Šæ[膕ñò5—þÝ. ÍvD­þg~äÏ)|\(\T³ÛÕ®Ö®>¢V:iDF@ÅY¥®¯¶¥Y­=Ì™ì«;ƒo¢ªìwFd_yww÷ûo›oJÖè~øÈÙ÷Íý¾~xDôÒXö‡þÃ"ÓÀÐwÿüOÝ¿þ·¾‹š bg>˜î°ÁX ÈÌ$¥fLs7tdK-Á]͘)/Èa 2cf9d*‘b¢UàŽ®"söÌrZEä*„!,颥 Ív W¼FQµR6¸  ïßÁ{f0™Q-Õ9¤ƒeÓ³Àx@´Å<ì¡Ö>’D»‹¦ælÈ 5f()& °8FÙ×húš„QdŒXü`„ ¢öã¿°GÜüd±;à“jÍñXw ¥AiFÙA»#º€P{ø(çUDŽ¿›šޱK½ øp=7¨G$áoh4?ˆ:Â÷}…eèÏœlcÜÈrø¨Aö§Â `ÈæÖ¨üSûQG(5¶åÛÀ°QhPØ7¢ÒCÄèw;H&] ú½ÿ«Ò{.{üÛäè]1hîë”Ì H›4è:_+%C7úàlä9\ª&  AëýŸsÆ{Tƒ†ç8L!U˜£´²W’t N£RAezTucÌŠÚPÓ–»&¬Í,¥yÛ6Ö³ô #w ùúÊ>óðáqoK¯îWç¡î¥!:÷œÓv°®•ê÷ÆF}cæ ‹>eˆ¼~µÕÛ¾¸÷ãŦ+Ì!þ‹²ÕgeË/ƒ¾nÔG—Z$:Ãøž:×Öéþ…!Ñõ¢ÎS3í‰dð&C”í­cþÊ+t(_CŸçí¦k³[5 fËBKÀ10ã…1º•pK?ò ¼œõ°^S³ø|ÅìŸðµÕùÁs€§ŽEžtø{yupë®/€]^›Ï>ß_<‡¿”Yñµ}r.÷¢/*?£õ64”áoåNfƒ†¶Í0£=ÎýÙÌøÕ3ˆ—Èþúúñ§ ¼¦éµH^tºŒF¯¼Pœ: iïÞ½ê‡Ú×H½{÷Ýû÷MV¥‘‰„‘!<>v܆ÙXcNTIiín »¬™MqÕìÿüëß}cÅúOíÛÝë?~÷iߪ«wå.ºÚüñ»xxè˜1º˜jßÜQzóïþ—ÿöý¿1dƨÇFÃÑ´ƒúÈ;³Aü=¥M'!wF"BM¡útgí4Ô‘¬© )3%H6?D$UvÚµP Ü•R‘™¨–é ØT3Cšàh ªê˜³uŠOõ+°–¢¨L°„GÄt3¬½²f¹+£ -ò 6½Qœwá(ê%T#Á‡½«4hÓ?ƒ¡.eßçm¨JXA<ŒJ/‰zäL³e÷g!8'%{ÀÈPÆžiX&¥x¡V´ƒ:@G=Àˆ’PAMøgsü^·±P‡ø£Š}Œ¸k 8Gù  Ø@èp¬ñQ'…ýÖ2Ö*hè;h7‚Hô@öhÒˆµ;€Á?y GØPÞbÄÊ DÜD&ÜF-ž´1b O>“I¯éÔÔ¿r@ϳ¤3'`gp ®@e3 $q4þ¦Ö~úK©±8¡™0†i`£xlÒ8 0”S:cìÇËo 4dÂi DeßìÜiæ jú®ì©04Þ»^ÉïŒ;CóêuKß±-ÍÃ'Ö¶e×TwÈ<²ÆÌËë×*ž]ïmã™f©¨ w¸±mŠ 7æÀ¦€»S©Ì$)se-©L´–HZ—q¨µÔÚVEßW)•Šûæ·ßݽ¹ýÝ»Áûw÷bÕ×4¨Œ¿ÐHàIîæOõòÇ xol;Â0Ù~É9Ö¶*d<Ëlèïùõ·§OµÁø±Âi¿Î¨Ÿ+§ÌIJpû«Гèí¯ãðëë××ßèÙú‹ÿz#ö#|쥚˪ ¶:ÅÎϵ/rͧf™Y›Ìs?·ù´¸¡ã`Õ«s^Ç×¥ köN^†/y¢þ}-@sù4W}Ñ$*4·´Ö<{’î±ô²81`­C“îâ¶ÌØŸ5ôDex¾ÝØàO·ê8x¢ÖÇ-µ§¹n~.W³ÔS.ÈôÌÛÿçóŽ·­¤©àÌzXçò@ÄùÍó‰àì–ªàŒ°l²à×siO8»þI"eíäuqpNÔÖS;‘˜8çÇâ²JÃí'·^ó© ë€Á¢ƒWìªÓIŸY^³kkýc5Þ|ó݇÷¥É”Üid[Xd$"d4¥ú¨¤s¥DDif¤7w­¾HõŸên¿·ý]ƒ¬}Å[³ÌþP…O¼~µÿËý³…2R]_ÚÒ¼¾ûpèöÿþO‡ÿ÷ÿ†È@T*SÅÆrPFn$p‡Ým‘¢‘ÙI¡¨l†Ô‰Ý¬£jغwf‘ ¨m¬ud"_/dJ1t‚REfÎ2¨ZRE(ž»–•ÙCÙ3™¥áÎM>虳˜="SrãNÖefEãVÂBÁV¨h;7f"[3s õ)ãNNG›&DE ”ÒZˆŠÕ£Füàì:êYù8ybàdL’ïtŽú ˆ !I˜FÅ!+(¢ æ'…þ¡õ¾XZ÷þWš/ÂP3,^p}ªÐ¦„sláÇаÐPï)ð2*û„ûadl¼ަ1Â&ôß`FQ‘ðÆ/21ìÃ”Š T”L€tcPn4YöÞÜ1Ûæ®¹³Ýݧ̪h[/o¼ +U´]ë­[iÂáã£Ù‡úü¡ëKÓºšZw»è#KÏz‰óiyÝãê `Zsœoæ¥Íçv…¢›,.sC=ÅœÏÞrÄÙ׿¶:þÎv×κz*OmäOmSà¨3»U ¸yá-çÐÆLZ¿Og¼gmgWÈ;³V6s] ³¼j½;\<®î÷œ6–èêQñ(º",}–ÇÝfO²s6ÜuPÛÆb¶ÍÁ\Iv]•ê¥EBa."sVA9–a6¶¶k·8Ç6Îq­kuúóM¯D¶F¢Æ|Þ¯gÙZý~QMÖ¼Üóðá<›3îâÂ8ã_X&Z h>둚ÉK£‚ãö<÷˜ÏD'–'ç™f,»w¯kdÖ¬µgèë° ;e‹Ò4Ž”¤:pC}¤¦-F &" hšÆÍ²ÖžôÝHÿÍ;š‘zü˧ÿõ¯oþñ[Ͼ~øË¸¿ûÝkôµ>öw÷íÇ¿¾ïºW¿Év¿ëû¸ûæ›Ãÿ³¹e¤™èI TÛ""€†°TRô@%1©|ª¯<„©©|Ð:dÀÈCDã4‘“IôÊÞ`Kæ€jˆ– Ï.¤Gì pùpòyÞµÖõ–+& îŠ ¶0'ÝA tL5¢À©ô¤¡IRxˆÌ.Ц×T@ÅYd½9*ÑqáĈ*:™¨âCÑ1ÙáÖ„„bh jBCÉd„éÞ¿ídŠ›9©a’Œ×Øh³3àe‚˜…èCH8GÿÁ @MA t0YûŽúE€ F†L(à>šuM­,NäýO ûÉð@SC=Gù~#ö;(‘9–4}&Œ°Á¾x€Ëc„ ×XŽ‚ÒŒŠüH Gæ#€kÍ=@〵€\‹Nô2Ü‘°3p’ò'ÁƒÉß/+€C9öøÛQÝÆý’eü'É©B ˜™¹G­n(—Æ#³-DAUO§ Å(švm!98 ÓI¼ˆŽ ¬i¼uÛ![Ïl_ÝAm³oê§°ý[{ìv¯îpLó“aPq‹Ø=T=v9d̬”¨!N™™1û¦‘Tk(s×øpW‘”5åfM¤úTW#²‹èkêk4Ú5Í7¯ö¯îïß½"†"©åù‚£Ô WRz6þ¹8öO£®$T:{—‚ò+Z±ç¦ç”êç@ÿ‘5éJf¸¢/åYÁú$;IivŠÝæA4~µ Ðy D_ÄÑss)Î ŽÝö§«›­NÍã]Ì©›ìVêÀË~•Q+f¦{K«Í1bÕç`³+–•Ò¢‰g¶Í"ȳ•´¼Á‹‘û-бOMZm-´ê7Çk8Ã9j³r–áèiÜÜK§€lŒmÃF§î¨«¡þeTäì.®M‰å?]-%bCP ëÖ.âù|£K¥©Û?窂ó†Üè”EŽK_‹º¯®À4×AÃ|9,á“ÂèTØdù¬2¤“¦ôÐ ;ÔŽóóL=ééŒìz%rÞžµj=º •»ýEó}có`Z.·ãÓÙÐNY™Ÿ¬ŽÌs­ÿU¹nsl/•{ÅQì^:ÿÚ*ãxsóÂÒV«ç ÷âKB)—7½­:±žÆv/4üÞZ†_£5“xó1]þ|\ûÊ~ËYœužà_øEáfòÓ\Jn^úœé-_ƒ\èSHðøÝk ÷14•.lqWºIžŒgÎçܤÐþ”Š÷/Ntþ"À´ãêóÐÝ£¾ÇíñÇ‚pS\ô¥îKçï3_?#  ÏÚgVi¿4pü’™´Ýò|þçw~oÅ7‰Áý¼ÎÄ‘¿âƒ®8ñ'â-Ÿ3Ο¯¡±hK»¢­­Âuˆ\+  ÀëoßdøŠ|÷î›~ød)…H ßdJ’ÌXÜES ®¶!íZ#8`ÁC œMª{xx|xÜ÷¦}}ç–™y÷ê®ùÍkÐÚ»]´¯ïÚ]QþÓAd÷×yï}µï¾¹OuùA™‘¢ÒI`© Zÿ0¥ âÿp©¯9tÇcrãp'TžÀÿ Â/±SÔTG¶îfô¦ŒPUÊ3i,9ú³¨8ì,$õ©#¥‹D1*qP†DÉ,Ý™5 (…’æÄÁBE$;ɉ{óƒF#ŠÉÀH‰@˜/剖@ƒG)£èä MÞ¶lˆU€2ƒ†~.N‡A\> ÅÔ]>É u‹îov£]ðà*~Ê.XÓ‚0CSª™ä w„>T2ÙALU0ÄTØ÷n>FBº¢w´;ó΢göÊâ4SÇJ¨"µ/掀`Õ¼Qk¦To‚dˆ–® `%ÒÜ!Os "¬t@µ, û,Õ3-jK&Õ„LäCf’r"©¬ÐÁZò0(§%G‘oP»ÑìwçÓû5Q÷‚€XÁD3TlêÍÅi‚S#½À¦¦øw`woƹ• *óBhlH7]?þº€Æ€@ã·d"cëI¸!Ü0(>ù §Hc_oÔ“ðýP ŒƒCCk¨ÅCÕ29bôÎQ÷߈b™ÀÆ%3D™?€c÷<—ã‹ûâGø^ 4#»¤m&­*I 9 šE)¸C‰Eœ"¦Áœöࣺ‘&ôÿȳÇ?ê@G¹ÿftxG#ËÎÚ]Óg …¢>#]÷ÍîPDÛÖä¡(¥IY…Ú»†Æj2VŒn^˜î¿ÿÏíëû|xd×#Õ¾½ßíoQöðÈ]›û¶í+€*eª©•BîöõýÇ ðÍ=ÿòCRÊè#k”Ì’êÝ@ûãïoÅï~û.¦¡ä,Dí¥YçòFãÓaÃOX0Øl’Ý4ûý±¤U'ÝYðÈSÍ~Ù<)qÝf°ºµK&™¸ìðxìx[qLq" ,òçŸõTTz᜸.ÿrsÃÝvàeº'_Í@ÒÍ"oúð+Ž/XMOÅT Û䋊MÛñ6oG+n~âsbp6’×y9ÃÁû™¹úS¿u«Pɕƿ Œo “þ¯¶? .œºÑ3v©î©'¿b¾Û¯ü^vyótãºeîgïUÑ¡' ‹¼ruÀÌÜÀ¡ÎW½®úolû—üß?=Ÿxþ áæ+¢·ƒæÂË l·3À>'»æ§’/jùQJòC·æìž6ˆg?ÞäyJûüÚcýå‰ÎMõKU¶Ž‰…øØÜõú8ÓηôU¢q%z¹²´ýú/ÇbNÞä­`®ÓšÎÐÑ[ŽÑy™Ý©£'ç/MÊåss?y´\ Jx”åYhΞžÿ*œ³+ÏFc ®_Î’Wñîpm+É—c!ðèd0>—i`O¢Gb6NêšÑiˆ‹ÑÆR*øYAƵÔB—+><=ùY'ùqòyŒ>ÎéÎ9¡Ë˜Óx^šN§7h+‡›ä*|"6÷‹[³Ó]K‘°ã,ݶb_73ž ŽÙÃ:s86øhþù\ì9'gNý샖/`3pšÓ=ß½{•‘R.ñî훿|ÿCd¶hÝŠoԻ¶”ˆ>S]%/2³áînfźOÿã{{/â±ï÷»F]Oi¯ör<ï¸ß·f<vMüð‘©OŸUQ}|ÿ±î[õª?üÀ!Næi. ÍÒ5$#&¤?%…Btj€ÐCdŸà„9QE@æðlˆU’Á]áñ¹¡1ZÐŒl²– Èɬh †…$­ "I´²C—¥3¢`ç@”1žÕ³©$2ÕÈC& 1)³I´H# |lQOAS³9rll7"û/1êõç ž/d?öé7†ì‘…kò¤N$NƵ×öý^gÀ 8'Î5c—úQ|u D‚†Ý}~ÊÑQ c„­‹#mÄÙ‡€‰Ñ@1^¿MJGGÓÝ£0Ž(ôGrüD?÷€øT0Í nÓN5›l Êtã¾?¬)·±T‚“úaôÝU‰¬coþà®|,cd€ÅÃ×@ˆ¤Æ=Ǝ܇aüóXwÕØé?êq$jÏi…!™ÓfƒMàæ”lKÓî„{) á0·’ÍûþÐ ·ÛˆÆïvgc(÷ÿô?‹ìK9TÙ®q(S¥)í¾m#ú¼4fã'Ø+êú»¤µè›Æv·»/n‘½;ïöÙõåÝ[kË0åRéôÒÇÄoYR¦2U3ûÈÕPê‚Ó(/0ûÃ?üÁŠÝ½}cnæ–}ÅvÁQ<##`–.*­Ëvˆã›ŽaV¶E'8ÏÌÿupÙù¹ë^‚¯Ã‹ç‡òtúð¥ È&=_Ç?]—3zú:ZX¡W+Åð“*]ÉuOI®©dœŽì¹6Eüù´CÀ惻.ÅyK‚¹•baž»+/W³ë³]'¾ã\4I³Zͱßk¦}¤™‚æâ[f×¹€æÏ¿÷Êù>E3 »µp’O»^FùžˆrÿDç±TG–8Þç—1®œ¡WO“'PžþÆ+¸ÿOϘë~½Òͳ‹Â·>Î[Õù¯+WN¢8ï‚ßü–ëƒv o¹XpeOÇÍŽ<޾}›¶_•÷`{³ÓeñÈKçÛ €\v¿vM7ìÏ=?kþ úÚw»úáV¸Çu`{^¼0,»ì¦·‘ÈÎ{ŽÎodUÑÊ"Aï¿}蟢«µêí›×ß¿fÙ ˆR@3›Cîp0·–-õ¿5™Õ,÷¯ÐÕ®ªûŸÞ|‹ý«]tµïY‹Æí®Ù¿¹Ë¿|ˆ>ÚwµFú¾9DÆ/Ø·{ª9Í‚H\Œúz‹÷K1~¯Ðv†€tò¼òfñq­$õ禷Ô9^ú†¯Å¸ñ“×À6*ÒCȳâ߯­úžr¾lÇøÜ¼ù篊†-ß‹@É_Ì×=·¯Î¸Ücñ7'"õ‹ñ^ºÙócî3ðóiåóë´ŒU€n ¤ç%ôçKy¡y÷ʦô†Æ^LŒ^ò8Ÿ+„ÎkÑîQ°æz¬ÙÿØ^óŸ˜Yf^qöx²=m2Æ…ç#\VFºú(µÝ¦ã®«C‡eñdán|ÃLâÿ|ê»ÒL¢hdÑþF°°áÚüWs`s¾Ú´YìçÅxM×9¼)òÐåg31BW½ +÷ìçe•ëüf€sÛ'^¾¥\^!_}÷6¥µ«L|óöÝÞÿìÅIOðÐ×âÌá‡Rf¨iI E¦¦àfæÖïÚ¾Fkæw-eù›·zµQ]t]­jv-Ú&$‡OùØÁ Mã]ìw¨©r·«þÁ™)•ÙP xˆ‘nÌÑ6  )§¾$‡0ù×yï†Qˆ%Ph…Jfƒ«’¨=ÂS„‚nHWÉÑ„ÝaroÔ#Š£1+®ìm€vÑÊŒ¬Ì舶º…Pûª¦Eê†ý`áÕ2³lŠ­ÎÚ‘9±:uBÿ”‚¦…7t†æôèY(,d'é2 €øø@˜äcF©ýHÔ^`>*Ë“±ÀàíI ‡6BØ`H ïQ ņª ¬G×C&j- vƒNÀ&;Üq ÊèÏDS·>F| ‰ŽýÃj ‰†¨9šåîÚñ^|èîŸxŠÑ?C¹Â&–ÀtGGlý™ãøŒ¾Ä9Õ ˆ4 á>Ê÷¿5 ÚÀTàÄ0þœ¨6ߟ|poæ8[0ëúWBvRù—VèMÙÕž:@ÒXÜjF@înVœ,¥ìJ fã¥xyÌjŘ0w/F÷¢áÝ®ñBïþÓÿ¥í»þã!ÁRØKioh$Fà®}H45wÎ}W«îwx¬©†: d0¡Ö>ÜêK`M’ÓÌL©ÇÚ2 £Â,SHI™‘Z£†"²AÈŒî^šbn¿û§üæ·ßÙõ}èÚ*3–8IþÝ:vìÔ'¾Zéx>º\Ãýòèÿy¿çO—ŸA6cç§.ŸÆ7Ö/p‡Ò¢pá·gßòMkuŽò”nðÈ=Ưgýâ3‘ç&Ôx†³Ï² Îv»Qc|¿ŽŸÊãëŠÖ¦qo%A;ÌÂÌ{g¯Í§‹{Ù]w¼ZUOæ¹ÍÙ<Ô3<ñ±›ÔFx7ŧž8>s  qfsV=ÁÚYaôé”–?ºø,¯„šqè—½ÇqX…q' ™›ö¨ 9R,)/} –̈¸¥d·¡ÛªnhEŽ>¾y® ¬ Âø<Ã;ëÍ?ß¶´X¿‹Ô’÷;˜Gñ¥6—7FØóe'…þÏökgöæv©Ù?éjN<­)WóêÛw€‡èB5^ß¿zÿñÃðöÒÌús7¢Ö0#À>ƒ1²û”FzS2Uk% ήªÝ5êºÒ4Uúôþ‘?|ºÛï›])wûx<<½§˜a!A‰ ²›' O¬3EèvŠsG¢ç"A3ºôüs6ÉéW²žŸ?G1“6¢–¨'¹)ˆxî¡už&md'-Í@¾yÜ8L ñ¨ªé<Ô¢L1èÈ-Ò†máZv™A«“ Áyä<Õzâڮ毣-5€×3áœ?‹N™SÚ¸ëeÏ<êR¦ÆØM§˜mù-‹ž‚–­iu!õ]k ­¦ð2*¼è™±ŒmTŽQòìn®‹x,ë7KÈS<¿ÞsÖØ Waðº”xIWçÒô{>7e³”ÂëÍ«áýLœäe‘Í”s%Js†mP³ç9ÂJŸg%³ó’°XŒGm›Kaúå'uAIÊæ%; Ï :sÙ¹ÕW\Á‰ŽrRg«vµŽ, ^Ƴ¸Üµ¸°SöÔÉciYœ©·é ~kͧŽc®Žr,uÌ®®²ÓôÁSŠÓO Šè\£a+eä ëÒ-«l%N2çUyLxì5šJ³øyfJÜ XršÄz§âV{èIÆçLvìnm‘ç²Qçš7¢"ç@ŸQ·¸hau<¾IP³ÊûJ¾øêU]’ »agæùT¹~BýòDçç—1?,¶U€¤Í³vîs‚`Õ•&nk@Ù@™øD-pŘ€ÐkÕÇKøÉ"úÍ=ÜozÁB*¸Ê˜!©XêÌó$ËMñ”dØmõÞgT¦5Ó£_#Œ¼Åê&Àñ‡+ÀyþpuMJZ{çרó`í–b¸æŒóLëùªJšŸ\Sþ©§Ë­âk§ãMç³þóéM<»!}aô-·¼)y殼:†/¹5m}'Ÿµ’x)|U¹Paæ9Ýø«ÔoûÈ1éÖ .;ѧDâõ·o?€j_£¯¯î^zø 4ANCfPDÐÌöû=”Zt#T# ²áÀÒ6Y»¨5æž`ÙïjªºÏ¼kÙøß>ôYwûöõ?~÷éÏ3ò äßéu=¼ÿ¤!‹Ô 0e­™¤T¤LNI ª}_ÙÒª23±$h5Q ‡¹JiW(EW¦%," ‡”¥äb$]ô03e*MÜgy8èÃ.z©$[ZŸƒ wAO3±f–;•GÅ£aè”ý”æhÏ[&ÀZƒù­FÝ›Q(?‘MwŸ^bòÅ`h&L޲˜¼P…ÚØÆ>%TÓ_ ˜€€9hPŒˆÿÐož#žNˆÍ¾õöN,)f×+?™¨)ˆ£šÚä}¬³Ê„Æk6ƒ8úS£j¾_“úÆÔ¤cÕn˜Ñnèb2-ÐX9ð)‰H‡€ÆáBƪH€f§Æhƒ&æqœ‡»k¬½+ äè,Q)‡¹£¸É]ÁšIãÞÛ°4÷â ŒtcñƼ7<‚;w3¶Þ8íÕŸþ3tQ½XS`ì:¯¡»ÍÌ‹êÁÜ7T¡ÉLt)ïŽG2k–C‡Ô#¸‡Gò` …ɲ˜'™ÊY3 ™*Fròu&k¨•@ÔP¨5ú:T`2¥Ìa¿-mùÓÿô¿ùÝ·Ã>åf6ž´)¥›´•þÝ5Ýœ~Ê“"ƒ~jÀldÓsŽ^ê)X|âÓ €á5COVÈê%î^ð nêt[ðÁ3kXÞð7ÍÓÏeH›êüÙã1([ òèÁÆJòâÛ»½ËUÏ.Íâ=]¼×…ø¯*¯1¶<¥_Œàÿúúr»ë “hÏ;¾x!ë‹?z=SÅ‚|ÉZÛbÜrŽZ>cvÅ8®ÑEƒ3u$·nWj?÷6ÏÕHn÷¢Xº¶}Vý…öF¼`2?/%n3Êxi<ðE3gŽî?A4³QœY¢7?'Vï¢óÏÝðÏkº z¥‘ôRµæ‹ÚŸJÂ?bбïãs%€°Å 9fV€/1¤×[ ~Êa=µŸaæ¶z[[ùÊÌjE"¸Iðª†Ï¨Ô°(:=éˆõdà§æ îܧ÷e«E{ü…ÀèdXxVõŸ¹*½ð«’åûÒw>gá­µ’~%þÉÏ\­‹Ÿ2£ãÂvoµ¹¿þîíGAŸ>E¤2Þ¼yûáý„Ì‹ïJF¥™™{)ÈTÔÈ$mjþp3¥‘€¼mÍAîŸ>Å_>úÛ{7¶…x}gżÐ–CmÞÞ=þõ=ë‡hïÛ7ÅÚòp8ÈØ¼{>e&Âh(RB"œ’E Ô\ø…+—Œ¡Þ²5#ñ¨ŒDi²qw¸€ÆT•­Ye¦Ô’™Ì’Å-R öÙ4´žv× ¶Þ„‰Ž` jÌVSëD‹»ê¬lhÕR,i™¨m´°Ý°W­ªP}Ö­W"Dƒ'8ô£€ÌÉ wpˆðâ©k~èLtêsÓǨ?ëp™üf1ÊËŒ£c8öbvÊ£”ÍôkÇòÀmûÐûï°B’ EÔªIp‡ï3sßö,èÆ @(F²‚Nȉbc÷}Ÿ(y2ö2þ+ˆÀP30*U¦Žó±¡Þ4Š „B¸Á&„}è'pßÛ©š2F®CŽ_1ªÈL^ÆrÈàB ‚0 €Чk«¨=¬Àʤ8D`RjJi›æã§ƒˆTj(ØøD`ÀZËH+ÜÝ—æÎºÞ‹ï/C…ÂÀ¬8+ÒHM1ô’hfƒÕ¯k00¼þãŸè»¦6 œùØÀ®Ý)³¯jêÝ]IR³)ÑUJ%"½ôI D–èÝ;°ïëÛRÒø¨†­R‰Ì,PìJU1"Rt“©PB’ú¾ë‘ʬ}‘FÒFZ^ÛoÊ?þÇÿðú›7Ë(™YûÚõÑ4,nÉ\:?2¿FÔ9ÀcìùGµkíŸC ØUÄ„Ë0ãkÝïó{o¢Ïí ¬™gÓvNìÕ× ÎBÿS ª‹áô¶Yî&íuVø²©ããô¬¸øvÆý‰Ís¡Åuõ ¶ÿÿ¶·‹m²ÎçéBLÝâOìôgß«ñ´/å\bœÜü׋RŸ ÞÆfæ CöôòáIiö'ž{?.”² ŸýÂ^CUs1ÈsÍÅ矃úqC£ç ýL$ƒÎgõ¹˜Áßf`‰_ªèü³SŒ#ýóLè‹PëÎïj9V*ëGÙ¥¥±ôö8ßvj¼´#vNzî Æ¹•ÄBÊ•HŽó–np -Ôû7ÍSÿ(#si"žÑ¯fí"ËoÞ&ÎòìoXv¼_ {Í*E'ýŸu‰v™>-h,ÒúkºÀB‘hÍŸXNÎ:òujHš¥÷<ú`‚—’•ŽÍ¨þ#-ãrù‰MýøGÃ(öHÝçÂ+Çy3X„bnr·ÔJ:Æ€£‚Çsñ„Ú®´èµS˜úM4 ž OoZ-Ëyz¶™‡\Ú€6öÙMîëÕˆ| '8õ€¬Û§ââ§ݸ£óôãLÄ_¼í¨ßb»/H”ÇËX±át³ èæ99­Ôy!h¡žtK˜5ëÎ<¦§|ý›·Ã:sß¼}ûÃ?4;²¯¡4÷f×(3j6ûAA&“0 )Jn»]}mïî²xf*j ¸™7ÅBûjÿM)‡Ö½ØÇ¿~@S|—wwM>ÖÎ:3Û·¡èz{}xÿ±š,‡•e„†Þÿ2+ÑL¸œ¦E5 …“™ê2ÐP`™ƒÈ‹zK#vÅÜc5Ñ8«‹–ò P„;ŠQPVT-#P`Ùd˜¬è®–¾ íÉm´á SÓ;©&K+-Ìñá=XE—‹Gd<¬ãÓ+e„¤†ÆpÎäéO1¶¨;€Uûs2 Î#‡À!{üžshEG&2F{ÌVpÔq—UEÓ œr3w°¤ì2ÂÑÚÝ«øØwß÷ƒ†‘†ªŒ£åØË_€£8O1ÄÀc H4ó±¤!C&ÜÇÖý¶àã{¼þ])¯ßþò)ºÈ‹<äzŽŠfУæhØ;èéc¢™voof§ë4,ƒKðq;rÍ~‡ª 9´ÿÇt0hÒå‚(YpW\bdÔ*˜NÆÅ40Ý­Ý5n,-Û¶ùôØE&œ™r’DBí}¹{µûôø(‡\ÙìÊýýþPAµÖÔš„s|û•L°Ð¬/…^ÒŒæ÷¿ÿG˜…PÍÊÝÀAf}†7÷{¾jÙ§?ôaû=v¥VDz>noîš÷õ±ÒîMSJS@#Ù›ЇR°.åÃnm4Á3ƒv ÖFÏ” R¤TFÖ¾"B!ff„$7óbVœf¤ýñßÿ»û·¯ÉµjÃð73۵âÅD¬8ïØn+Ð:l:Õ Ï8[kVؤøCžh W™–Ë)zƵhnÅcÐ…”õr쵕Þly[eõ‹3Ë•gWÈMLy™ÓÏû•³n×Ð_Im8d΄-WñqŒLt6æsɆ!ˆã‚‰¹´¸”R^g ¯˜ìœ)#ÄQË“M3º¹.rj‰XæDœé~ê©b#X±£óÈ&»¦‘¢“,ÚKÍ“ÉK|Q¿ÛŠJ®ëäÒ•2ÌæÈÏ{Vx2 áì¦×b sÀ‘Òm²ËíLHd)Ø” {Niˆçkž[óí¨Tpw^é!܈ ,ãíµ:.t`­n±ØBÏ$tØ_Á•V€þ–ϼƒp=òç{õJ`çIªól_€!«f£Št¶lT® 3+åáùÔÛÌè§}&yÆ §×i¨F-¿óÄP§‚Ú*ã;®u]n,^^XOÈ…oùògjv¸Ìžï›ËóŸ¼$y|~™\ÚþÝ'…VŽú?§#“S‹®6ö¢ÓL?:kò(ñôuËÇÆÖ£þÌWÅ3lÕ½±égy¾mv.^XŒO?¸+}‹¯`jBmqÕñ9˜Æ“0úl$òùÅÿý‰Î_¨¿ùÙŠçoƒÊu!1¹X8™dã7ÎåI¨–—NöKækXqãêé˜f¼€ÂëRé<:Éa®åÍ•Ôæ3«º·è‡\ž7{ÈùB_Ε­gÁ¸åR´P!Ÿ‘'V‚>ë÷ßvè.ŠX0æ® Q]Êã×q?gz´gÕ1ždù7ƒ8pÓ¥ÏÇCW*–ËèApã¨ZÁx%e<ÛnÚ¨níª¸*|û2˜ªAë“OËðób]aA·NÉq9·®ÿÖ- €•ýÀ—°}ÓÖ¹ª'<€x„â¹ÝSêÍwïtŸk_k׿yõÆ÷åÓ§7’d" ‡î™mÛ˜y ðJ+•if4ã¾±bÙ÷HScÔ¡ÖØ7UÙ?tÝÇGTfvõ7¿ÿæñû¯~÷¶<ö­_íø×ïëDäÝŸ~ÿÿük–a2ƒTÓEMµ¸’0"Oĸ Ùš2kŽAD‡ÜÓ¢èÀ܋ӵ´°Ê¬KC+7ˆ¢!{/jÕ{zpïd0öá v½Ä6KR•Œ µ ­c¾3ƒ'RMZ6Ùu²JŠ ¤ NIȦÿ§Ò¨à/ÍûQe‡Ç™Skÿ ÃL⨊’ëæJ>m±ƒ:Í0Í£N´€™jñ¨Å?¸Ð ‚ÖMJFUÙ»·­«(Í}¨ïÛ=Ì!ôehU®³A“¹kN»ëС?Èâ×@ã@B3@h õ@¢CÔý&M|GŸ°éö‡±*‘*7­ZIÃmÚ$ÖiL8Ù'Œ|r£Í  ¤F’DNíüŠ‚EJ4ºû{/M+ªû$,1øÓ¸oÛO}†ÝA´ön °XÓ–ˆØï»¾o÷MiËmiÊ¡ï$5miœfdñBáJj ˜ˆ`m÷z÷Íýïç]£½¾CȪ-ÓI ojÇè¥]Û‹hJÙq×u=¬¶ÅÉ8ê¡ÚΨ]í‡çAö((î^Aˆ=¢7"eÆ”:º‰¤º†š”"3 ‘JEßg ™A ÷¦x[v¯îûÿ@3w;â°vªb»›dë`B:Cøo¯œšóƒæŒðøà…MÐW›F5‹)xé¤þ‚IõS €Û¯mðëFዳ¼‚çòêKŒR«ió4'x^èx"h2ÑB´yÆõœ§3OÇÊØðN¸ÌœÎâ…•PÕŠp¹èr…À³”~;Õâ—™‡7#Ú×UM†O·~µn‹og ê±/HW3½Õ#ôã3Ž5ªËKkó“«åºK¨ þ–›@Ìü³&3¼ QòÍAÐv"s+`eË›nUÏ]eW?禚Òeíæ³:î$[€Ã™0ÐÆT½ž«>¹QßnÎ}åÌš«¶´€æóôõ|‰ûe6ÛMÑì :ãyD¦'°Ÿš úÍq»ÿóç ïóc©-Q â3ÕÆ_à(~åtÿ{ß6¸ùw?ç׿àkr#¸8™9ØCâçý*¡ÏY¶ü¢ŽÖ?Õë§¹î¯:#6Ý;¾ê— YïôõÚÅ)ã㪰ήg–·ÏK°‘/mÚ3þH‹ˆ/›>§)ÊŸjÈŽ¢³v¸Â7¿y÷À§ÇÚõQ+ªån_0øø¾i*ãÒ5MÓך™îææÃê°bC—¾jˆª}o»]ÓºšRLºÇ.ÛׯvŽÇ>2Þ—B3ÛßïúC¥[<ö(n÷;4ÍîÝÝ»ûÝûÿÇ¿˜¡‘‚¬ D2s@w‘§Õ3ÕȤ”2ÑèÆšYMgq„ô zòÞJ1'Õ˜õ¦ž *=ŒðjÚe6 PïÑSYhÁ]¸=ºAا:ÊEʝŽ™lU OKz°O™³˜£é·„Ô`˜ب¦7hp7žÎÙÁew@Ï1Õ23 +€EÌ{dåG _PPŒÀ„—á9㬳¦)ûÖÚâE 5ºGYÓÜ5}ÇÇï;ú»{e¢{‹Å D—#VNC)( Å$I„Ñ£Å(gdŽj ˆ`­BfÛxazƒl€ëÑ> ˆÁ„‚±ø1ôìG+£ï10’!†€b‚áÀ #sb*ÏÂ)d€„û´ëØX•iwÁ3¢‰GsÒYœAÄêY𲍢188 +µ§™s¶^CÎҖݾµÖµßµ­™»·ç£)-1ð6¬&§ kÛx÷îî„¢¦Ú][ˆ€È»6Ý3]}ÿ»bÍkt¯µ'‘¥„ñÁZÛ7}Jfû9²<¬Ù™ÃKºQ€YôÑgFj ¦¤e ;¨SPl¤IF_•Š25kŒÊ?$­˜7Í¿ûOÿñþÝëÌ||ìúZ›Ò'ÇÔèÁùîtâN[د*Ù¿Œý‹oÝ£ÀËõo>âŸóî„!·àLÙZ/{(¼Umëo^óêË?ÿ¸|êuÝîM¾>1Hþú¤çú —ð¯/ž³KÏø¢Ÿ gzþõ´;!”ÕÀùº¸Òýýíh"~]￾¾"jøËÿRþç–.8~ÏÔ[x«Öz&Ì^Rã¿Â䨼¾5\úœa)OD,,Ý–.] ú7ÃñLŽ“ñº…ŸGfè…¬WsGôIeÍì=j: ç—ô>žþ—G]mqЬÖsBÏJ*çJoÆP >²É°ª!ÏÁ\åiñ\PûOj8ç<¢³94í7ZµŠm²³§æD®æÒ¬Q}1ðG’ï‰ì;èk¤aöü7g5·±rdŸœXc#ëÄe;Ÿ¢¼¾¯J›O¦k›ÕÔ‹K”Üêõ;ýñ†¥¡9QZ”R˜SO)½Ž#z“áêȬÖ㉰¹™ó#þKŸƒ :`óy»t»ÚЊæe}†ÙÒ_Ý×™;]Wø·”ôú7ï†ñí»®öõõë7ï?~T¤—RöjЧ¢ÑLƒˆÌÀ2“„hNʘJgµW-0ʥ؛7{³à~Ïøþ“¿½ci¾ùçßÞ>ýÛûLì¿yUîv?üùû,ôböIå7ßÖÿþWší‹Ñ¨¾ÖuÔ‡Ž\Mí(#n8ëXØ8³ÃPJØ ྵRBšà‘†ÖX©tѨ&³>²ºê.vi,)`WÍ(Y=M¶+ö¨È xHT¢UzÖH6´ÊtA½EdˆaJSJ" 4fÊ')ü£ÃiNå#Œ#v>Xæ Z€„4˜Hm“¬ûˆenº'9 ‚D`"äXZÀX @¥jW=Cr·v§ˆÆêºÃHh¹SŠ“ÓÀ°?·†ŒÑE &Lð4LŒäƒ¬ðµB>Zû†&ö€ÃZ„à™„RrZƒ1RP¢ñ•Á[x¨08@x5=²B CR—“àtªŠÁQf\>™ÈŠAÁ)uÒbÒ(v”æ(;+-•0ƒ»ÕªH„¢Ã=Ÿ>£Ù55²-N#}˜³l„¹íÚV–»}S#RÙîš` (Mcf$»®ÿtx iß܉âöúduáîþEàÕ®›w÷I~üÔ—¨]/{èšWtò¾m¸kгÓÚöÅ-öÏz9ê{l ÙåPöúxµ¿gS>~|/©ì˜Iê»~Pi1sÚ˜³ÖŒâ~Ôªjš‚b¹ÛYSÜ,:eFgãwo ô>ª7Þ~÷æÃ¿}ßýëA}´¯w÷ß¼bãµæácÛg¯v?|hÜÚˆ¬ƒRËЄ¬Uus@ÀAJ))ÙЇ^°#äp©€@îH¹’¢ØÂ‚Ù+³È„d£û. iŠ’~Ÿý{؃©@¯„ODµGËÆLÊ´¦=EBØÃ€^™[Z§Œ*ô¼‡BÕpщˆ“03g¨r©#â˜JMwnáûAÆm¨ x3DLU+öô™J&û_ ($a¦Há–ýžé-Ë®ä¡t®á»"GÅ|ýèã6Ÿsüðî7°Ì#Æ@æ£ëÇò†7ô}›‘ñ£íR)™V½:-Žz>áþ¸ÁˆÒ@C©C“ÃÁ Ù?¹+5¢Éˆ€êˆ x™J/LP‚ úŠx ^@–×Ì.U„ÝIAOº{!aa‚šÖÌÙÅá±V%wd)Þõµ1ûf—RÕ³B)5îö;Pû»¶i‹È@Ò¬¸÷¡†Æy4÷ô}ÖZhíïÿH©ÖjdF„x ·‡pÔóûÖ`()ËHõ]Íæ¾·³‚ñØ™— Ö”»D!Ö¾ï>úog‹âr*Ó`J³¯!D[\™˜522j0“RF(!¦˜ÄœæåOÿñ?´wíÝÛד£³Æ“KËðeð§ÝzF=áµúÏ´óó|—|Ò ‰Ø¤xŸŸ•'HþV§Ø‘ù’TÀųo„“.j¤¾¬sÓ§j3"X½Ëxu«éá(§"\v~äçÇñ—Ó¹¶èÎÁÍ Í øI[)Ùí­Lã/p:ç퓜aåëž›£¥Ít÷"*?gŒeó ß;Ï0W˜Ñ.ë[WZsŸ‡­_ÐÕõ_ººÊ.α'ÅÖ_´¸fI÷L è E¯Å/ ·©è>™ºXWXÖ9ÔÕ½Òçx]·úsö—Ukž…Öݾ‹NËäTߺ®q2>Ç´‰á,-ÜV¢.!=óúÄreW«5—;âWéï2“]-­Rú©…ïbÊô¹ €uÑm±ŸoÖƒ6ü×Ïæ)0ô3í.§š7g¦‹MæEíM¡ÐÕÚå ·gÉ^ÑoÿÀžÈ²Ý—¼)öºífo{:¼<ø÷ø‹nüeäèY‚¯ÄF:Öc®W?`ù¢£ò+Ãõ××K¦Ík(ˆÓÏs:¾™/Ë}ým<þŸî¹Îöñy¢q !¼þÍ[øˆèkJìûW÷¯>~ú˜J™Ñé¥Úï Qfn$³¯)ÈÌ•)ÈÍ€´ÝÞ éSÖå¥v>~¨æµ«ØW5¯ïUûÚGûî¾m9<Öúé`‡ ²4ÿù+©x4c8âPöHƒPB—0¢ì!‘‚7ði‡Ià HÐÇ‘?¢Bˆ:V²CÄXJ1Gi'Ž“ûäf° ŠËxñ½šƒ:ÍX úˆÇ¾oKÓ”BÝ)ÉœmÓˆê³/»ÒîÛ”†Ò„úÚu=IGÂÙÜÝ¿ÎfÇßÿIû}ÛwÁ£4ªµ{¬µfï0U{K5VúƒËú¦™©”îÐuY÷»Æi‰Tæà‹€H‡ (ûÚwÕ2#sXq°!—¶ßÿÓ?ÖŒûW¯Ú]sÿî x¢ºÍ鉓èϦÚÌÕql:û¢?óV¿CFÿ¯¯ÍWŽä+ýmëLýš§üè¯_håå–ƒ¿¾¾üÓ?ÌŽM<¿ŽÊßÜË~Ý7}ýúúiÖÞ/Etþ[];ï6O¸gñ4o|óY=[/–š'~ŸhQ…â±½d³ÎšŽySÉåR¿Ò—‰Øtþ˜4³ö\¼oÁÏÙöçÒêóF .>~sJðRº±&_jVÄÖ “léÀ~fõ6£;Í-Ö&¬çÂUI'ë2]²“=:*/Â6ï™›w»z Æú¬¶¹­È¥í‰y3â ýNÀ.7òð7¬Ä+ÛÁÖ¢ÞœAMk2à™vÐÉ,ùrÃÅ‚lÊçna«+œ-ù ×áM¢Îjbp!ç°êR›}¬xIÅsÕ% ݲ ðú¿‘Ìc-Á¹ÅæÙëõ·oÍØ?vÝ¡ï]DÞÝÝ=<†tœ{Ì;`ð®üpb~Ä`AN*C€ª¨ˆ»‘tw%aAM„@ÅÀ6Ê1”Tü©iE%¨˜ªF¢Vuxl˜<ïã–NÄ j4BŠZ,ŠªÅê‹/ýðÄÎçBÄ…¨«¢zAJ¡ŠˆõA¸•”ÝÓ±mžZ¼ßÆD°85[U¹X&]ªfªf‡”K)fª@*¤¨ì÷¹m£i¬Bé N¥”TàîD.. ª™ ƒ =$Ï¥¨€"_þñÕ›Mµ©ÔÔBØ}xèæÂ=1DDE»0¿·”qx(s$rx—tÎ鼑³øõ KwáD¾.+±ø Ó#ý9zÍëÐÞm1\3~\èš;“3Çl4®]ÃHûâ§ð¤5ùÎU•<®Ç$²E¯ö×# NÍ$&!ï9“NqìÜ»¤“3I îrF=Ë Ž@b.D´/±œ“wåbìξª6 -†Kíq\OkN2½´4@WÅ^s¯þå ÷³¥]¸wJãªØ†Ì®~"!ÚyîŽçÄ ëXQ×¹"K{5—%û\™s¡n‡Ô/}à+‘#©›ª`õ`.N ¾n yF¿t ¬í`2^wçÕ÷Zï±ñÆuíöeIXm¾Üd þ ªàñö!½"·-“3k¼ÝÝå]1ÎìÙ €—i‘‹,ÜÓùßÀs 8Y’3›f¤W`²±¼ÞËëÃçœüSä´‘ $­åÙ™{Ÿ ïÉïïܺoÇf׿׳´Áï¼ñ9d$r/Ü›@Ûów˜+DÕ•ëþàG+:%~,13x%h¼æ¾Ù°¤Ü#W}ã¯wwô/³.¿¡/2{k’Dƒãó¤’I„É8žMrqc•¥‰}aÀž¯æ~7¼?eX„Xô?9×ËHáäæÚ/Ê$T™w_? nÏ8bž&¾§à‚çlFæbéXu¾8su'  gŸáÊ?‹ÏàLrŸTJîi!ì¥òdQ×l[ɬ"u~æcM,&ÍD»À1z>¯4 ŒØ¯/×)Åð¾UÍ…‰qq\q„· ä3Ÿ;rŠÔF«K–Êw”+æ“æì$»4¹¤•5 È&ç½e¨_-Xe³Î yN{ÆÌ«õÀésè„!µÇÔÃ@N–›ôÖîÃ?àãï¾iÛÔÛŠq·Ý>€&÷ºŠjPgéeêUL­Jé¤Ì£YCá…$Ã.„ÜsØÕ9„È⺫6uôã15ÅKÙî6ª€Žßö»MÙ…ÿâ_üõ?ü?ÿ¾j0 ÁE˜ÜI§ „½£¢œz‰T Rgµ›-‰šbÌ Xm ÆB‰QE`d)d‹b¤¹fT¢N?¶„  ÈtQÖ;4Ô®Ž#î`€ÀÜE¡†œ\ÄÔ dR¯R BLPØ{Ì"ÀI @H'CÓ¿‹_2axtÂD‚“éO–ÈÚo6N´T„n)÷`( !œ¶?•ÎЄÃ.. 8<ô]ÿ»"k!™KB&B줡°Ù‚BˆCO{ª* ð¾ '‡*p dˆB þ-è «zÛã€$Ñ•O Nä„Ð9â©äPú²wM8Ù-ä¶¿ôÃ!¥€U ¡€Øl Šk  ïM–©)1.lµ¨‰™YåÒ´Ù雪*¤›«ª&H"mIÁ,DUU5}Øo¡hK$ªÅ:nD›c*É…@ü“?‡3 ÁT¤uABå1h!b%N«6<‹ÓjBr ÛªæÆ‚€º‘oÛR«»£¥ÕU¬‚©ŠÂ`™ª"’¨8]Y‚ˆç’3QxhZaç4M‚BwGfê4¿TÄÝ;•ö'þg±®Þ}ù¾sáIl˜>ž¤Ö‡ñÆüïô.þ{(×ë1È<28#^“F†°×iÏ”¥Úö5,iˆ[-à{|F 8'8s¼õŠØRdŽYÊZP1†/1Õëå\õaMx+’Êç Çš}Î0K2/*œô›æ·2ì8B8ü ^Ëèž ÒâGÁ%¬|FÇÂ]EÁ¤7e±ã笊*‹"Ñã'Í“òzÅÍa,2cO3öô$ÇgÙsÓ¿ùÌì³E)í%Á…áϢɅÝÐó½r©Ó…yæ4õ–¬ƒ³£àµ‹xç)Cû„ëºÆ\QYGŽV5µ®ÀUk×p^ çIÃ[Ê$¯/Ì,êô®ÜÝ5œE‰`\íR\ÓêªÞÞSc‘¹·ÁÜW`ˆåì‡ã2šêƒ„÷ÙpöÕ±ãðŒ[é¥ãE'GW?‡.g ¿ŒÚ' |†/–-Ýtb›áë7ÏÕÉÎpvaî«ç¢Â$¿»Ó$²_GCDFÖ+Ï躕ù¤½·À¥Ào[ÊÀçý“%v—´Î’ØÐg»qàtSMn¢v÷x¤¯E5ó"奻Ïôši‹ö-Ï)"< þq‹ÎßY9žº( 6ÓëïÆOûtªûXÇþë•LÇpµHûœ þÒÙóóëM·..ÖÙß~ƒì‹oÄ_ôÁßh.ýÌŠúùusŠð\ô¹¸g.šÅ¨Ð¹ÿò½;O%Ie·Ý=>­bEuPPŠt-»&"Te)@iÚFCˆæÂ”¼<뇚¡’""·_hûéØÚ‡m]½Û•äïªàMrÕ‡_¾‹ï¶VÇM).8þçÿô?ýÿŸLqSwËpL;?`÷‹ù·(îz¬ß…P&ïZã%4"3׈ÜBkÔ»š¥™No„>OâTV5Œ"YQ»D¤OÈu: h”5©'+T:ÐÔ™GXV©à…Y½ÑÀ”-í¤HCíeë;´Öw<— :,@ôlmÜÃîÀî½”sß^ã`s 4àäÜ×Ð"@{™ X0š @¡a\iëøÒ™î*Ä ]rë€÷Ö¸,§¢…à ±r —þz:Õ3 }%€ä‘' à‰À®Í¿„>ð9pÀ ʼn©pªv—–ÿîÂîô¤×ò@èé]S]ßýŸûGÑ•*µ€@oI¤B…Œ(Ñ ÁE•Цá¦ÒèšÝ]ÝTÝI”΀9˜©›@ÚRœÐ p›’P1•ÝÃ΋P•¸ è*XtOi÷° !äâîEÍŠE 18vú§.ðrl†RƒÖ¶Å¬Ù¿GÉnºA*¢Ö¦b⥊e»-OM7'âvK¨»–ú)$Z°¢VRéì‹“{ò” EÄTÕ]2)Ì¥xñœ I-%·Y;'mg.N©xq³Ð£ÿ€û“?ý“ÍnûîË4ëTKå´²;Åû2>.6¦ÝÿÆ@Kn×ïÏŽv?ŸßoôÿÝ„ÜoÖ²þÃ8ìgÏm˜éÎÑøÃU7ùŽ7ò<Íò à»IŒ_<÷iÿ¤p^Ö-þók-“ýùÄG+×?O¾Ÿ_?ŠHïÇ!:ÿà xøL¸”WÆÏýüçEšKô†û¹L0œ>et'ƒÆXáÕ-ô&=áeñ“¼…Làò'pÜ'k?ÀÛ#·\•¯[’÷>¯¦Ð“nŽk“Ó•qc\«œD:½`óož¬˜a] ŠA/Ø©#l‰~u“V$Óþ/ïÅ1• .2ž‘ÏûÎ-ÄEGgõ ÈèS‡Öçr=ãú´à=¤a™mîà 1vÎpsm-ºgM>x…ļüí³QXåCñ{W‡¬¹m_~,£~˜ée-òÆ_㫌 +B:¹““ÖÙ•£@D”x÷Õß>¦6‘ÜívON¶ øÆh)t‘œÝK ¦¢(SUa‰U ÁÛm%ÑbØÔéã!¥¢V¥\ªMm"Oa[U»úxÌ¥ÉÕ¾‚H¬íÃ_ÿy>üÛ|D[‚AÁìR¼ðŒüwbï.¡½.b¨‚QVîÊ`†æÔ™^X(аÕ,€·p(;?´Ít'C8鯰À 1ÀËJ¸V$™bé,‰Ã¡„(¼@²¨Kk%;ÈdçôË@2˜NZö]£'½þn²ûÙ¯¤?:E5X\  pGH× Ÿ T!]{{€\ ‚PõûÁ)Ûê@ê^gÝéﱫ1ô¶ÃP,D«­ä\IHwÐà„*Ð×Ô. øE@EÏDäé“žÄ C„æ™@‚D :U úÈ –íT'ãcÖ_X:)”½ÛL·Ìô$û#¸·Jv … ¥dM`Ñ ®ÙrfÞh °­ÕΘ%›WU šrSr¡£$…†—pnщ’áÁ4XÕ¤ OÑ4Õ.¡®²æ,ˆf±ª H!xaüÕ¯ ™ˆ”í¦HÀÓ'mZˆ4!XŒ -`ÿPê1DÔ µÐM,>Ô­š43ŠÖ@%75Ls.%»™¨ÊÒâd[RJîΔéÌÝL1‹!@%V¦f›‡]·É¾ûâ+Ul7S5td“K„)}8Õ©ºØÎDWö„–aôBø¿¹”3™3’ËžÚÿýP*ô¤{{g{!Ïåg‚ýåÜ¡®ä*Wv{ì`L¯EÆkr|C©“Å(ù&ôvmYî쿜“"§š†XC¯Äýk$úIº²ws¨†1ƒáÎs@®ø,dþ'½‘Õ]9ŽÏ·3Õ®æ Š– RÖ÷xr-LÚ¥ð³š&¡\ô$WõuGÿ‹²òkYÙÚLp¨5M•ë¹ÌB÷áENnäœ ,§kÒÃgtï%JÒsˆ9äÒowË3MÖ.êû’¤~à{[k?¿>óXüÁ¿¾§Àæs¢?ò¬.‡?€;ºÿ0nq}ÚBj8©¿zÚÆªkÂñÙ{§¯Ë<~zÛÙFÞiÇ¥¦ìå9ûl?‘YÐv SœPÐÙ‹GŒ8±èûõžy‘³v¾“¬“$݇éÑ˲b¿.õƒ±YÖLùgJÎYløÂ¬3nH)~Þ‚>CERW…îîšåM8øoµ¼QP{bF z)ŸuÞó¾·Þ.±¨Ktâ¬\Z'–æá¯“N Hõà¹x.»Íîéð¤Ò!¯¤»«B4ˆˆAuŠ*(jÊR(ZH!•®1 à+5Cçåj$À« ^Šüx AëýFDr›ÿŸ>yÊ‚&ÚÍoþ1<þÿ71-(Å]Aï¯:t)µx•ÉTDX%ŠÞB XD+d!Ћ” SK´;„Ú"¶r†Ìû>wí|k!džB„\À@°€R €ŸÄyÐ}`ºÌ!@8/6¿î‚§Óª;¶ÌN¸µžjžÄSwhéE~,œJv› +èL}Ï)ÊÙKîГGîùŸÈí±x¸‚}}åÍÅ{-£ÒaôîÐ&À:Ðÿ¤ÆÀan`é]x’þ»öÔû"ˆöNá§ï-†^ÿ§›Gó D’j¤ºhªr·;f'©•Ç"N`#1¨jqÙíŒdD•ݳ2ªúÆ¢8ÅMeƒhAŸØz¢2Da.$%µ‘(^$ÐbBi TLT% U­A] ªViŒö°­²JÊîu¤ÆDkSkaóîŸüMùø);“D+^6µ´ Ùs¬ƒªæâ".%Dqf9Às†‰Ö̘©u­î.¨Âæ)§R ¢*¤ÃL¤MÙK‘Ràð\š6±8݃ˆîTÅ`!„:TûíŸþù?>6Ç"é‡cBPAJ©®+S“ Ù´s¬îðAœ;ñOtKž „§.Ô1}ëÒì×ñɆôÄ×Ó_¶m/æfq±¿éf`ËNÚngKÁÀ]HÆ-ëßqâw¥é™pÉ(ƒÊBΠñIIæn‚9Ú~UóZä›&®"So¹Å›˜«ú\A ç³nb ü2äë¥Y¬‰áL|J—ûKVÿ_¸ÏÕ€a»:_¹™š™úŠöÑw¬Ï+ýàߎó]<¥Z´Ð¢º„ÑóûÛÚ"p3×ÅB`±“tQ³â…ñ5™ž\3<滜ës—MÌø€À[7È+¼™¥ÙµL­•^åSú’§zaIT°nÃþÙ }Þ’óý•Öê¦?dÄy,Lr~?YÑùé'üÀó¡˜Ï]̉Åle±ØP²x0­-µSlþ£kÝáÝ»ÃDœGõü†ž¼{ÙÌûÜ´ŸærÖ_<Ø,¢¾sŒçô=GÍ"?qq’ÝÍtä—×èYKgÁí½ïW~å°>j…YzÃ8Â83¶d8®hðœiq£û8‘ÀOÌ E¶Ø\– wŠ‹ ¬£2¢[TŽýó3`‰4QSêÇ`x‰KsOÎú=Y;,¥Èc\{Ôá#”K‡ÜE–‘ãg5~†Sl[æ“|‚Ñ¥2Üà+öèYh»¸m)ÛcEÜáŒç3Êi«XþE„úâ 1P^G鿜¯gF×ã­ãžýæ¤E{ÉÈžñò•CÑ€1«§n]òî«"r|<–œPð°ß?>}²NÞ]Dܪh¦ÅKÉÉ*JH¨*¡)ç6Õï(&"VÕ Y²õvSO%5™n¢P›˜QÚãmU3)Ù™sU™§Â6áÎjW1¥’…¹-(ˆš«¡x?M …A$0(úöóœ„ Û¤tú<¶Z"K¦‹÷mì~Qb‡B˜B€’‘f€Â\6м-¤2ýœjË~ÒñêËnàÞ÷õwn½(½xŽÉE-GºVú“`=%ƒŠ ½T÷Y._Œ §Fx¶€öS­vÒžCB íœN þ̽…ïÙ ¥ó =ùxï6ÜQ8(X6ŸîÑOÑ¡zÿ# °Ø”vU"ÅÙùËÉ"¸¿ãuª©u‰¨¶Èíiå*¤3"–Þš8vÜ…®H™!Y„`*¢.p ))RÄŠÑE]·C¨Ž©õÄ/WÔTqQƒzàu;–\Ä£„Ù)0ajF@$*â&$ ¢’ Šª…Ð-(•Ð4ÔFÕ¨" ÓV¤ÞTÈÔýND¢Õ !¾ß‰ b¬RPJ ÇXyöhiMKB¨L©Êí–ª`¶ŠqS§\ÇÖª:7m¤l·uótô ?}óhªC0 H* }E†%g/YJQÐN»Cˆ¦U;©Ÿ/õ+u½Q’òØ4UŒ›º2UœPc9™Œ\v8½üíIHo¨ÚwQ’¨ …/zrœèJ\÷9§Or’e1}9鬜®ì,”qg†<Ã.š7Ï—aè¼Os’ûûz®`7S—¢Á!=z¦o˜g©¤Y³&WGæ¦`ÈõÜl…ìÈYjÁa¿œž0—=:YU\r‚èÂÛ9 ñ,…i—8tü—<‹K^„"‡ÁÍ3ð´‰ÓÁÈî4œÔè|ŽN²‰UÒíÝùÞ ‘úS'é%õÏË^05uãR¾s³B0F¯Tæ†+nQ¦c¸0yÉ=΀É"D54ßâr tD 8·Íƒëц5W"q2Œh—õ¤h4߬îV ¾óxºŒëCãMfÉðëºWö«*Ñ5Äd¨6ÌJ¸ ‘Ó£3çäAî¢_Ÿ-".YóL£ «'çÒ1Ô}õxå^vüÁ#]>_.@+‡ô3˜WCÕ©EI†›ÏÀîƒC¡§e+\¼ýFâ4×ÄêwÜÞýƒ#ôè¼eMfÚ<Ú†EË/ÒÍ”ëxÜó:.“saç—KnÞu]Êà¯Æ7rÖNÄØ—ñІÒLùù$ =êJs!ÆrXr%w~KæÊ.w³(xSÆpqÝ=µmØnNw¹tN Kšgˆ êÉ÷Ó` ß%`t„ÊËΚ—‡u²Bò[ìyKu ›Oéûlæ}àþt±/,åÝcO©èê³é`¬Øó²©3Jsø 5Å5½þsìêîª:ŸßÓdÀ뼌äwß{3’ÍÎt…ð='‹gƒ²u<뇒Ø~w›¯Ì«;TzD^®¶zCYî~Ø+ݼߎXÁäsàó¶ W­øçõ€_*~ÃÀ®µ—¿÷tÊp¡û¼§»\LZ.œ~G£ü]†4p . Lü,:ÿ†ß÷V×K@~{º^Y\+,N›Wàq/»÷ïÁkkÈ0{æ¢{/‡˜”î!ßüà ,˜ÜžþtäeØI…ï•͗뀻.ë ‹hå`9“[äùæÏCÏžõ¾îÿâu7$8ñž_—û¿ñ‡‰þ¿`‡yö Õ´ù¦èö¸yÿU!èLtþõß(ƒýEîˆo\$/Z'^òµÝo]bѪü»ŸùRã¨ttÑhY ‹ L6Ís»vó"–ÙI)h`«ÍKÌ:§³ßœ?;QK”»ï¹ÿ÷i‰\ ËÎß‚…HdJœ±cxÅíÔ?P2¹p¡×7ì±·ÕN¦0íâXœÙ÷rOSÚ ÕäIÝ|Üþ|º»sÍ$À@ÕoÄy\ûÆËœH!É3v“É$¼¤U监™ÈR§ÆÒqä‚þ¯âÙ1}®÷žs(º|¡,/(½M›0dÄu††w;ž0ŸËìÁ˜º?) IˆgpûÞ-»_¼C÷‹Ó†wµIïz÷ÛàúŸÌùNoö\41¸ê82¥­p Ä8ÈØƒC1G^êç§."ï¾üðMÎ¥¸gßï÷V…Ç!çPUVU-¹ˆ¢ ‘¢,LžS«H' y)p¨™vÍ–bP©0ÉÞRÛZj]C¨k ©ýxHOm¬ƒmªý—ûßÿ‡¯OMýPWõ¡mÓW÷×ßü›ÿUJ¦^ aCU¨±8,«E²ˆPîë·W/(äù“ˆB"騾€8<1ÄÓq0Y¤"’Dª„ TŒ’ï|Y*tÍÓ˜ Ô $ˆ ·ðS…Žá‰|;9~@;$Ý‘(ûCœ@hÇ900åì (m¿„TzGß®¯µsèÍ~e¼‹êEÜ¿ßïVIGh辂@vˆô~¿eñNÁŸì4[¬‡û;1"ï§—ªz÷FS!†¶ñ-ÆJSèª*ê$J§ì¯'u–d E\@@í$däÒfénŠ®F•@¥µ*×ùÝ{)¢!oB©¿ÃJAý>¤ƒmö„¯¿I)¹2 cˆQ­¶ T ²‰„úO}W“áª+4YÚÌìRY.ê*+Hq—PçÌ6„Ãû¨ûŠŸªß|Ùþö#T㯾òRbʇÝC Ç6§RBÝŠªä§bæÉ"Ì´Í*¤i®£íê¨"Ÿ½Í¾ ™®%«j)~T–c[Åà…*¤{n“ŠB²´™ì´Z)"›M¥fj"¢´Þo{©(Õ_ÿÙŸwi3í¶UÙl*UÀT7›ZU/døáñsñLíûþGêq<ŸYÿ¤a´3 &Šfk /n ”ËD b¨ú7<œÇÐ×4î® fäÒIj7 S¯dS–ÅVÌó.‘o]õÌô‰ ç_ؘ〽 ÄÒ¡sñÆDª~s\“Á’àÉ¢·Öô÷ì e.-i ƒj¢§û˜)œ„ž'¢ão´±Ÿß3K¶Ne—À”“ò‚œ‘ØÁJ=Ï‹–ÓÂm®© ×S§Å€dRÍZ°ºÈ4q®5­m\)oÈD=h)ߺÒW4ع†ŠÞÄȰäyš_À…\;\\C2ì ¤xÏŸÛCv…}¾¨G¡ª£·\ÅæëUaúÕzÒ@Vel.¯ƒÆg12_JQ1 žŒzÏV‚óaN-ãüOSïÉ 8Ä+ûŸµŠÊÉÃÖÝE¹µùy1¼ƒ{@½óæ7’c^©ÌÈ`± ¦òé×(ƒ-–ããã¼-* /Ni™<±Åw І%‰YB7êjž’XTˆZ–M˜‰5-JC/³C&uÓ+fBt C}•!æ1TvÂÕ’-OšvC’\_®Èb8œãå)ã#ÓµKfº^œUîÁÍ %®ëMkkmi…žœúNEpŽŸEÂÍqk· V,niæ ÎÎÜDK ?NÑùëU™ù|ÃRûέG\“ÝËê5— e­…h`L°žElï®÷lÀxf,8¶ Œî+`-=Ç5©Íë,Úáµúg¹î‡ÕíŠÃt‡õá-ú½a9h5g“q·ûhtŠ„"ÀWšÓd”£MÊɃÝp±ñ†1¥Œ Q2+eIÏu‚Þ®W]fÄ…;Åtˆ`ŒùÜê_ øOzÓn‹wÞ…ðL7 Î%R±èÖð,=¾ÌGîyo”cÈn€_PDªÍ†ÅÛ¦¥37y·ß}üø1{©½ŽU”RÉmJ!Vjª0#KQUˆ8MM ÌŽɪÕNxeÎÉ%ˆ9K] !ˆH¬2¹IѪíû]UWô7u½­>þîÛí«¿ý›ãןªw»ßý«ÿwiÅéwDDqëtO²j§}ï 茉#¼£h@i¾–üBØpˆB¶, “@ ‘4Qƒh€g”U¨ M†!†î+àHÇ^ÿŒ*¢4½®”Þ¿—w0C0G)ÐèÉÍ^sKw]ó¥í¬½0Ñ{$«¢‹ÊÔPòHYH-ÝÙjБ §–üžý NÏp((P… JÖ}¦öN¥T¨b4 …»[P÷NêGÝâæ3iöℚn6UòÖݰ ¤£ˆ*@ñÂÒ© Qáð-"ŠŠ, Bˆz×”nÁX©dV»HO¡F &ææTA´$º‰Û¬OÉTC¨TÐ!XÙü‹n¦(ŒÙK“M¼ƒ‰|¿m½D‘]!Òæ\W–š”É÷»TUp/r¨JÎñÏ~MÕD4OmQ—Ê‹DgÉ%U1HˆBw‹ØlDèî¶Ù‘R©7ÁÔ¡äí6‰¹3µIœ)¨Yó w-)ç6§âQ^Ü… ¨„;ßÌê‡-€Ò37ú×ÿéŸõ~㤄uJOw7µ Ì(%Ÿos½å…õ˜€ø,A“98Õj,ξ¯°õÎ83€ïã²yõ‰É ç¹³Þ¾Œ0—%ñ~£×,ƒÖgèâ»H²·œyú q|>c–^ ¤¹Ö¬±ð ·ƒ•0Aø¯)«òV^sÏJü0žÕýú,æ‡ùz%`^g]›6¯llÿá¨}¶q¿Î¸÷cç¿óBÅõ®£%>Ù[Ÿ÷çÆ ™¸)½Agœë= ð éàlôšû¼ð0:§ehD \ ¢pGÊ ¦ßù( ލÈm§í:¬§"S‚z2 ¾gUOÝ$'yø~·T뵆Îúx.(½yS?ŸK÷Ú3 ºk£#;B­u @Q $U©[oOÅýÐbWB¨*‰!ÖÇr,ÒªÁ‰`¡ªBöBºm¤qºt¬•$"‚(¾WòI­Ä U ͶVsx¨]M´.!3?=…*}û{«JnÚâå˜s€î¬J¥Ôý7ò~ç›Ê>Ìi¹`¿õº¢‰’~lŠˆ½Ûåc’ªzúøÔÚͦâCÈMŽ ”’›{Î…îØÔ™@ÃòvW XŠl‚؃€YÌU @]ÏU)tÇ~‡cãª-A )NŠj%ZÈc5jˆ¹do3È”rj“¹ªªÑÔTD-XµßœWùýæO?~zðîÝÞLOý\'j\/å߬º•ïÎcÓn6µBEºY9ö©YȆ)ÖnïG×I©ø‰[Óôor^½“}!‚Ãï£MàEgý[%Ĩpr¯–žŠ3{ø~%’+€ç^ö™}x¥sbÜT{D;)ÈUâw<Úß‹ä˵ËùYÊèêþá´â~†±ÿžóª9/j‰ü`Ô…_-`?økæ²;Þ=ü¤Sàbø‡‚þüúܰ›\1ùìëcØ1*ütDço_v̽ٚ:“ÂÆ×ºÄÞXøöû/~­2‡²'í åW© —ê%g÷ÖËÒ ›€×³‚3W…ãKP·xzfc“ØÑWžšd¯ÜÞØ(Æk@®Ãº|íÂP-Þ°ýŸIô°’¢Üœƒ§'S¶ß Ý™îíâê ¥¬·c­·ÊŸøÙ³ùÆ9JZG†â¹3]ïÃ@>}<‚“á–!þÔý1P¦ïy¶=²"§ƒºÇ`Κ#F"0³á“YªÂK)C8¸)+äê¡3OçÓÕà,µueâÉ™ñ1sb˜'ˆ‹æ~O(>ϬC»O>íe]ÎøÇóâÔâé0Èö‡…âù¡2ëUœá ¬Ô³dö€¸ Ÿ“qóE7áÆ³it›ƒ·oßï·ïvŸþácóô”ÛÌÂwïÞ?}úØQÒ‚š™æìÝÎ…’r'fUUˆš@znŽƒ€j(Ås!ÔŠœ“±˜z>f/ ›¸ÿò]shvï·°Ð[w?|ýT?Ôô~™Ž©}l7±9~:¶ŸÚí—ïöÿåõé?ü.îëÿÿ{´p2ÔÌf"B5 ôˆ¼$С;ñ“‚¿7( Áª^Ý^#$À¤¢ª°•ÜÚž+K÷Óx‹ä?-¼8ÜÁtšö$Úìa&=hÙš`Áçq“áÙ7£F¤Ó1)ë1/YãÔãâhxhÆ Ñ‰™Ì‘¬ê_æó–¾;ü«3FÞ«žuçq\Ô 8ÅÚ{  ½ì%G?µ]´œyÞ£Ë~-^\0äšMšÃÎf]§Úò`ܦ-€?ƒe.ú#ÏÜ+îíKp)Z—Swšõ²ÔRÇAröBî ™I'ñz*t{fÎsŽÈEÏ∽¡-º%€ò¼\†[N«úœ[]pò²ð¹vt®ú׎î• €“L÷Pb³<èH¡~×âñ=þ‘,¼¤¬lq˜T§×ÎÜk,CžG.ןn—É–Q°e ¸¹ÖÙ²äÌ[Ô&_†ó^yûÚ{ŸãH:—rÉ!Éј°]0ßÍícíÚ–NÌ;zÓ¼¢ók÷¢ ÐÍ öº–ô¥Ûæš?øÕ~ña@{Ú’dŠ»²FdvÄp½3yUŒè΂ÁZØyë´Z- ןþâ¼¶qÿ5†û¢Ìå=³a ÃÈýN  Õuÿ\äÀzæí м7éÅ”0—E›ÛœBkOF&:Ã×ÍÙ%a9ò×zA«Ç†œ0òõ#sàø3X´çÌÿ|Ÿîì6¨Ë}/Èßžk ÀR°Áû>laböD¹!—,ëµéA³>“eÜþ¯:å„w6‚GÖ…(îÏ…VöÖ‘*ź2ÝKO¯µéÎÃ_œ*gLå¾z<æ”<åýþÝÓÓ'P E¡PX/i“³†½ 375¨ˆ2w ÂÜ=—¢ÎtôJiÆÔO9†huØ«öõáñxøæq÷a·ÝW_?‚É3Õú¾(_x|¨m¿ËM*Móî/ÿNJùô¿ÿêo]+¯öîNq²A9\Xè-ù$‡GØŽtø°á.Fª€Y ;Hzp_LlC!r)”ÎÿÖ@‡{ÿ;€Þï¥Àj?Yòvu½gØ©ƒ€Pa :âb½ÙÖÕœOÂ>^ î'…žtóãÉ­·œU¦AÀìÄúgcÞŠ@ûZc¬* JI¢&@½©Kn@Wƒˆ¦ìÝUAsò’;- 5/-`Ñ*—,ª¢ÅÔŠç\RW<°Ží!å¤5kRNm“JƒªdK¥¢‘j®¢æ„X`°¸()G ïið÷-a^W°fP1¤›¤:ÖÑ›´ùÓ¿ÙyÌ¢íÃÖJ‘¦irFÖ¦â M»ƒàÃu…RB›ƒ…æJ7Á¬uÝ~{ÜV1ì7ºÙ0KmÁ,H±è”î"vZL»ÐÝÕ;”+„]*TAqz*šÝ¶Ù zÓŠŠÖ5àuî.„‡˜Û\RË\R.ª ¢ Ò‚ÆMµy¿sw5óRÎ{ʯÿìωK†Ð£š—A]2ßÐä4!Á!gzÍÂøP%wê¯#ã¶Y¨·ª‚}3rX˾VÔB9:_—\bbfsï¡qSeå|ÝVeá-cõ‹‡m!ç0ºÿÄK\1yD² OªØ"Ïl(yæ…q“µ^ŸÙÑJ –âS^* Úûâ -z9ƒÉÆÖ•ünö4d9àÃsH‘äÕ낚ŒßÓüBóÒ c$ze÷ ÑàreKw*×a¸µùJäÒʵÆuÁ² Æd WZ6eT«î?Ý6»¶wÜ«´#²øhø¬áêsX¼Œy§çu|„w—Ö4ŸßdoyÉ~„˜_‘ñ>=Bu§Ley–ë'7½A àþCíežÆ÷~´<§ÖxR"ŠÐ½.(ó”òEï•å®8!糘ãzž1ÙoHã¿Òÿ{ÿT¹þ›ß?àeª× –o0V"Ò5#–çòtdacǹ õN`ð™%Ù>—úɈÎ_©î¼Xh¦ÞÙœñ‚ýö§ó ÏJò¸C?âg>.gQ~ÊçÖV;PÄõNÂDÚî·54ßb:+ÜžÛÆIîÆú£äs÷ËKÃ;òÈWÍ¥þS¿ ½Õ2ç¨ ¾üˆ<"çTRÞïOj ¡ŠbLÉéNÒBUÂE´oŽÑX2YŠÃK)ÅEÍ„9e/ f¥¸DeçA­äBØ¾ßæ&Ka¨Kû˜,VðrüÏßâ÷ŸJΦ⇦ÚUñ݃Øÿч§ÿoJ“TcQ‘ÔPÍÝ™",(Q:óA@)m‡¯ TÐfA+b æ£äoEŒ¦$ AG!¼ÀIÍ¿SȬž¡étó tˆ d¸C aŽBˆBÜwˆ¢ój-©ç¸Ÿ€¸žŒ|;-#¢xoBÐ7õ œ Crþ„©«IôÊB ZÅP˜D´ÞÖuÛ¶A¨š©Ó&nM*UÛRq« Ås›«m¨ãž9'"—bjÎ\˜bŒ•U9•Ôæ%ÆR·mK…ˆ™Zvf’Q\hÊ‘ŠPIL¹ ›í\D •h”ÉqJÊuÔÖ¥HÑ $ÓK õK¹vg]É/ÚcvÑ‡ÜæOdŒhs0 †*¥¼©˜ajjRL¨Uð,,Òªäw/*9ÃT¿xPº:PWjA‹šVUQñ\ P\AÂ-¢·D¦˜‰»“.Ú¹e«@,‹hš"** Æ ‚œ2Y´Ås. PŠ8I˜T³—MÔTC¨ßm»sèŒþÿú7¿9W³GM§ãÞ¾íVFpæØË÷ùû"ñÊ-øíÏñ•#’?t ç Ao·OЋpv…üñ ´„2ë7¸æTtU]telgMÂC·û »ƒÎg˳¯I½}´ñO1~úÉ¡L–”ü”Rî2õÓTÕýùõók£p¡rÿ““öˆQ|ûÒÍå\Ñ’aR°n=²ÒWôòÁ\¥$>'0¾šÞ¨µKXüÛó•Í;ÂÆ øNèIûÒ74êÏ™zçžòëñ3‡¾ñn\)›ÞÏÅðDνXóÔá¬s4lE˜ûJ¯Ì‘ù`S>~¾¸ùì%?±yÁbX:KÏ*œÓkïS ®ŸÛgj;ç¾¹—¾è²\:!åœNy¼õ½·t¨33m?åNíC2ÒJ–µîÆ3`1X´Óâì§æZYøÖF3Uj»‡¢µŠŠ$ÏÝîÑ•Œ9öw˜•]Ùþú TNœ~NÀ• Y€W¦æ˜[·øèÆZ_£.ÃÓ€vøËâÍÛp»t(mtVíÀ¥qEúy|žŸ3m¦‡/ß"øÈœRN¹¤¬ªtïô×L­ÓˆW¡ôÒ NÉîLÁLEbªRÛäci ¡B¢‰z† •‚*¨=‰£¤â¤ÅpüöIT7µ˜JJZÚÜ|| ;9~óÄc²‡:lbØÔÞ&ßì6Õ_ý“ã7‡Ãïþ7iÌYTQ`Dro!€j€á€Z)&¡ã$Þ1° R'k×­‚"déMw¥Sþqñò¹… ¤+ €((e¼ÙÔÜÐ}l÷ip‚ ™€çqr%èZÍ;Ñ!(¤«œtÈ>AƒJÿS'¤@ì$t"*©iÉî„vŒqHÙTµUñØš’ªMð£WÕF )•œ[­ð~ÿ¡mSI^×@ :,DC8~,²kÍÁ‚†*´ÞIU£VfÁÄ„Ìvú YéŒfn9G¡Ã‹ìtŸQâ¾jwnžÈ'(ƒx@Z)šL¶RVе8%1<¹íöóÓ6Æc’jóí6¶9ǧT['˜Ÿ¢‰É¶h1©ºJÕ®.ô£Ãš]*CÜ¥I´˜Ì4˜j$î4(Ý©mx¨ 9CÀN?HÇö `äÌ^T…AX‘"’CD±Q5*’ÝÛR<;Huz)m›YŠ™šZ¬+1Š‘»÷û ìè.ª,ú?ͼEºòÞdk–ÌÜ,…ƒKy Ûfƈ€ÌvÊô4\³ä½—m¶Ä¼ ŸM’SŒéç‹ûí:$:™lƼÿD[$b÷W2nr²‡#vþM,ò‘§Ô ÏÏѹ00Œ=ãàœ•Agâ€õ13¶ ÞÔN½rŒÞü›9ûz¼8¹þ‰ íyF\fÌE)rŠâE1›Œl¦Œsü(s%è9ïä·» Ð…‡1²‚âI°è¤»8Ÿ“œ ºi¿–¯Nªk ã÷lÔjƒ!.ÆYÓ0 Î%,E\W‚Õ5>þDRfð-¼9»®mA2 ÛΡd1æîO«¦f ×ey&<)ïaFº¹,ÑEIši¿ÛG˜ïE<÷–ßáC8tå¸SCÕžñJ Öì[1H‚&aöåvïñ×½Þ‘zЙ<“ÉížWýP)' ·ó_çê0¡¿¢–öf Ÿg¦:Ö¾Ãd> k¸ô«kš²Ô³<iå”sÆQVµ&+q=˜î†×&ðè`Y’°™/—Åu°¼ÿcY]põª9£x•çö5Q gã•ëºã•=T¹ÿ¸:ëÆÊ“÷ð´î<­Ö¯Arçz³_ជ/9¹4ó,}°ñ9÷Šño›˜Æ‘?^Ñù›ÄD@éú¦GrŽA ÿ’dwKXAq×ôñ&‘÷àHíõH'RbWo¬„ÿŽ›7à’®NXœ ×ÁÇó0Œ}‚™²Êå˜1¾/úï“”‹çG2Š ¹¨œòôË;'rjga™{JÒkªüç¦%̾a [²¶ žëY60yÆ[åþê:kíÉE )(Ž’¤“NP;ÍìUPà±™·¹™4Ð9B–™RÁpEM^ï{Ž­àñc›‡³³ƒøÙKWnKÝ1Þ·4)e)p¿·ådÌå–…Léô[«ôååb,ôy»N¶Þ¼……ðz±_wqW—Åc¯kŒ‹§•\°qáÃ/ß—’¼/e¿Û…ºz|üIݛ͂B=(D”¤ CŒN§“&¢B0Ô5T[R›‹šŠAØ´æB«ƒªŠçÂ’Y˜s†jØV Ò1A$nªÝ¶–=Q¡K f;1³´|jâûm0Í%ãXšc«›?ÆÇÿ lBns>QÑ{ã@Â[Ò;•éäû%@D O"S RƒƒÚ ò@ F^à©×ú7 ÍÁy•§G*‡®½°wÎÚwë‹Á"Ô:“exƒtD¨;’^¯_¼‡ :|Y BÐ;®zÓÖ®&@AÏ"D!ª ŸËY}ùAA¢´®¢±‚‡P;µx5 9; *âÎ6µÎ\›&}üúx<¦jë ¢!÷’K[XPm+SMGˆ¹¡µ6åÖ\7Õ. Žõ¶Ä,‡ ­ˆéû;ÍšÅX1eQ£i›(™ªA2ÒÇ·&F˜zܰ…o7°>\¤(‚;YU²ÉÙ£CU›ív³ O»PˆwF@ +ÕCÎñÓcíÈûŠ¡:nê–ˆm&sÛ¤ aûªD£Z®6ž‹ºçÓ¶í¨Ò-VU”ÐAºj« µ“$„ ª `¡H£TÚÂ*‚†Þ†H!)9‹Ã=¥¶Mtªµ*T[ØIíGDzåŸRHþêOÿôâ"Û[ÚðÔì/g%ž ö»+p "2¬¬nf:ó3ÞÀ’êÚÝ{¿\Uæ] Þ^•ãÅÕ“X|P8~T„× ¸ÝÜÕ§–73<÷Ò‘2‹oeýáršÀâÎË™ÀûÒã…„Wr¿g5˜/"³sáãÉ™{£ÏK.½(ê°s^ù’‹(Ë쀃Ö+‰Ù •…Ó×;­x©V-Å\9Í9Ò4èÿp¥äv#[ã[Û‰^ôÆ¢œƒp[Öðús>ö z.sgÑâÎLuÍ&Š+QÝìNG›Ó續ðh•/Ö9Û纖‡ "cpá†ÊïÊäâ¸qg”¾Õs¬+±ˆ‡¾(Á]œ7Ô£íУ"àÂå]„îÇJ2×áÁïK7ãú×®î‚'åðq\Y›œ(ÿÈê¢~ž÷KŸéZQ䞇¹ÈЛ ˜ HÙÚ ž^¯„ó&ßäh¾ÿ]´zî/jµ½¾ªñú‡3w¨ºçyÎ 6ûnb®Y6¤²fSK{¤…’%·j³'Òb©b ¡ž=Ii­‚"Þ¤Ò&­¹©UÝ©êäB/4sgdw…Q¤©:I/ÚA»AJ/TÕDŠ,tuæìâŽR<%æBŠXŒ±®â&Ö;w§ûY퇤—ò«?ýÍ´»jh)sn<½œðò¼½àG¶»}>ðþí^ •îà=€ÍÏ¡Ûg8ÿP×A‡?´iÞ]׳rÓ3ÊýóŒüùõƒÊžgXÍ=¿üsúöóëç×ϯa„ôóë•iÉËcøqiŸ¤¼dd>ûx¾ 8·H§XÌà ã=U y¿Îü·úþ:™geèhoP¡×‚†qIgD5à”i:u¯6¡ •€1© ‘‚³#Ñ¥Œ¦Î¸6¾XÖ¾ÖÚ·Ð $—;“ñçÈÚÀ Ú¯Íí¥¢kO ñ΂·¢;»bk_â”5;ûùÞTøZ!ˆ¬#ÈqCʵϜN†Ó”šÛ ¾M€|µ“sb3¿@N¿oƒJ ͉RóމÅíãŠòÃõu:¯u/‰ zV +ƒ—Â… ,«ìˆiÛ〿? Ï®e"ÃYyº 8U(¦ .aû~ﹸ{n“—²ß?|úô‘€åbÐÔ‚&ªIÐà,î4Ò4p/"ZÜE ÌŽt i !wÔ«T²«ñ\Pà~h•¥ŠÁT­ÒXW¥-¢¢Uܼۦ*þáR26)ì7( »hu…|ؽßÁ,Ó«wûãï>n¾ü³œKóŸþ}|g¥´Lù莢¤vÂEƪ†é¨B(.®´Ò÷ñ;Ù)òw¾»LpGˆ}÷=3ˆ@x€¥¯ÛÁý$þã(]I¯“ì¿pö"@FÇ2Ò,€Ÿ$'DÑy‘Ó*¡Þ¥à쇺³IMKq @GD@à@¨b!Vôœs:$ÂEa1†PYT'Û”öU¬j@!^XDt³Ùªhjsjs]mXô‹÷¿ üÐrÛFµmÜ–âß¶ôRi•‹³õZjÛÔЃѠL^m6Þ„Y%½(6USP=*(M‘Æ¥LQ£$A.MKhû° ï¾*mÚ}<¨‰ö…¦c{kÔjÑc ¦!ª°I9t9Ö5v[)¬R“Ky¬rU‚ŠÄ"~$½°MT¡Š•›ÉV,Vˆ©Y@WÜJIDÜBa7C$*sߪo*” æ©d‡JqÒé^r“—x˜7uâ1=Ýø,@Å¡s5î ¤W—Ã`}2„ ¤ß›¤ßKä¬×½¸ÞΚ>ƒý/ÞwYÚì¥<<¼‹UüöÓ· @!U+±*%{.)%ÕÐk¤Š:©j’š¬fN§‹Ö»-®`¦ÄŠ”X¢jJÁ4VðãcsøæhAc㮎u4Q !¿þ6—”ôÉ«ÊÚE þ±=¦oÚ¯eζû2~õeÀj¾mYÔ6Ù“Ä…uX€V4œtU‚w*ûT$x¡‚’à€º<6bGlkVðŒcBi¥£ì”$!P¹€‚œ¡Š`È´s÷-Ý&(Aƒ”/°JB)`ªÁ,LAƒH¿ÀÏÚ/ŠºŠ¤8Óé~¼ÛèCÈ¥äÇ,.±bÙ5­w›ìmξѪª5…hJ™îâP±tÌÛí®ªê’·›-ÀòéðÉ=×› P£µm» UfÙíÚÜ&°Í.™RÐXÉŽàµeºµ½ 0?1‚ª™OO­PFåñ)­À£»š»ø69~ýÇ%l63)MJ%G)* ¡ÄªqH“B…æÝ>ì+æD1#$‰èã1&o›œ¶›ùÔ$Qã㱪cò”™fwî ÁBPT›*+Ù›â"ÉÒ¦.1:!!³ë?I”\ÄTЏ/¥u €8Š”œ½Í^ 5“*ì>ì;¾‹ûÔòýÃ/¿Ò^hèrXÉ,®– †zsk=‰ŸÎáì+¿|¶`æÆqLÉéÎ)W"Øë0kðÜ™‹<î¸ÓéÉáYtq[oªõi"¼¾øËìë%Ú¼‹Ø±ŒÏÝiÈ>ÿœ5£úþà©®‰wOk2¾»”yd\M:˹¢ðñ¹7ÈM9 ë'äôYL«.BÕ“ËH‹—i|9﹜Z5Øç_:¬taüZ¢:V|=—=Èsž— rdp‰a‡QÃZSU¹§ °h™v¢±èJ5©Ù ß>ø.Ε †]g9ÎÎ\á.á—Ñš”¥Ur¯ÛÁ0âZá@–amò –&OøeiÉ y<)9Mš{6&¼š®q,\»f3€%áÑþùœ”Ô8ñ%»ø-îuW6öËŸJO¤zç–~<Én¯Eýd¬B>Gîß”›ÉКÄi!L~ç$xg*w'ôvÿi7Q^ŸgV2ãºÒÍn­Ï‡ùÊR;ÕiZÎE_yvèXó˜lž}Å‹eÍ fp«:9 +èv•íeÕ (k]ßo§þêGßó½WÀÃÐh~n¾®1ÄdZŸ%/ú¦E¹é)l8©ðrTÒü1‹Îß÷!k’•k©Ê²áç|],‚¡ó~ì3W)^bE€PQ5€t@(ª*È©îb -¥-îBh}ó»i‚ÀŠS‹ÁTœD¡}÷GïQœDÜT$áLŸDeÿË÷mÓúSëOMeÆm•¾=JÅýøõ‘‡´ýõ»öc6ZUküâošø×ÇVcˆ€3h0?ÊÑoõ¡†–#¼ 2 Ñ Š%Ôb«¤K9¢5!B€4B ˜3D{=ïB) Þ­¾’àŽ®7Dgf¯ýcìQþ’!« ¥éÉÄ ŠªŠ)%20\éä€êMcÕ´-1DÍ%W¨fz¬jù˜›ÔŠJ`¨B½­7m’cûÉÝw›ý¦®s.OícNÅ4îÞ¥&yòA¡Òv›msÇ%`˜mÎ5v»«îiÇõö o«¢ä+˜þ¬j¾‹š¼æc*ëu‘E?×q»Å c?GÔô2RÂö5$Õ,a-#€¼ÁÂy˜Â¥õ(]ú »áTòñ]«úüVÊÏ:u?¿~~ýˆp³Á~r¢ó/ÛÀçfowrÊ,“ã¸§Šƒþ[þÀÔbÎ5ä·Nrpïó\Gìk}çþ”¹‰9–Í|¦Wý‚^bŒVÜÝ.X¸ÐÅ/žÑlê¦,–^ãȇ=v¯Ó¤_1½dÐFñÙáåÉL*%vì5u†Ô¸ó\ú½‘ôÈ’zåCåjmðNÆÍEj`Єu…%tßÓ]bÜ*¯ðoúõE 9wÀR.=}côÿó7#w¯á½cYèü—¼]ä™(ÙÁ”ƒ9ù­ ~!)ˆÛp.èGÚD“Y¾ÿÅ{µÇæIs›JÎtæ&¢bª ‚î%'533rÊE#¼/h 4UÕ=%§È…îˆ1@é,j3qH¥í§cÛ$ÉeÿE‹%e:!b›ºZ 6µŠ´ß>åckï6m´¸©Ž_?zqÛ«ªfé›OåãÑuÙÆ_þIÕþ»¿o›l §{‹f¥éêâ"„Í%g˜Dn¥®‘3‚@…ì8E‚ƒfd"FŠÀ¨"ò°w p„¾[èm{Mú6ìÎÓœ÷|) 0ï;É œÕsK!L@‡‰š*áU AMDJ“ ´®£iEû”ª‡°{·yzdCm›íÓ7½)º©?<ü¢ÚƧrxJ·»MJEDɜ٠K1ÄÇOߢp÷°7XÓ¤Ös ±Ò‚ ÌBÈÇ’B.©ÐtWïôŒ(áØ6E*R43?µ)µqüØæ¶øvÉÜ´9!|øÓ¿ »ÊêX’g/e_‰ra›ó¦ŠÇÖ¨?ýñ‡êéhŽv[‰³6ñÊDÅR‘2µ:6Ç`O"•ÃwuCúæ“I¢{!?µióno ­•1wS ¡‚©xrHÊQuÐ( NÒ<ˆ1x)"(d)ç¾P‡;rS¢‰Ï9+à@Î%pïÿEÄ¢Åm½}¿?ï)¿ùÇÿ(ç’SÊ)—RHpЧ~rìõÖIº ÛÇ:Å|R¸~f_¬F1l0íÅIʬ7ü­Žã˜“mس&Ö1øR™u _1[ÜxQAšoƒc°…À¥<Ïù`rtÌÈÛdUœËz ;ï-ðíÚ»0¤£ÍÁùá±; *æ*@2ˆ,Ë‘ÙJàv|5èŠæ³Ð°ÓZâô$žä,K­t³±»×xy.š´ò%Ï92™´ã¾Ý‡DO8=“¸ëû‚”§Ã‚_åD Æ‚Ý:Ǥò%õ¬Åü†®¿×'$&‘{äÜ3z*·27dq‹¿Ò;~vÓ¼šîÚ*?Û0Ëz= š0|îl™?®ÑŒ¸rË7¦\ÍÍ䕿ÞC⎜úÖ&Ûõ º\‰ ‚Ïxž÷ÞÈ0áÛ­ý·B»F €ë‘_ œ>3Éäxï’»B—·BýîŠfbJsfÉbûðݘ7t¾³;óÅkù{ÁûÇ2£ãàÇ-:ÿ’):Ûo‡èª. çûçRÛÈü ˜œA쓯ãQ\šQ&0ð[:Ïÿæþ'6Q»çÈQ×NèµoåÖþrÚeÏD¶EBÙl`dËNòµé³•Zd凓÷|’N{C†Gíé-rbœ-nñã1>‹‘ò>A½Åi·(ò;¼¥~î1—±ªýdàrakÌߟîäÕ‚ÁµUDx6Ó‘»åÁŸ×±j'êq¥|·L¡ê ý|ÒV#' ^´ÖŽ–á,—¬®JFŽ t9¥Ãýï/ Ô©È…Aà„^PŠ yL Pâd”,Ia#HY ˆ™“8E„¢Fý™4Ü™ý€:Dz·D1€€÷®¿NˆA¬‡:ƦI"° ÈýÏÂäÐ Å=AN5’”j5µ ÇÇV2£ØÃîáðØx)Œ–™<šovÝHb:þþP½«B ›í¦è£©šY°‡ãSÛ¶O¹)‡Ç§ã±=|<ŠÂjƒ»g÷"Ç6í¶uMi©ñ%l«Çâ)5Û¨ÚØ4 e_WžÚæ©m³K-¡•ݯÿ"UÎ^…Xײ¯KTß©A’‰:âÛc©"ßmÃ×H_ì¥VG„`ÿùÛ±`i] ß>áéhîYÑJñ–RêJ- Ä j)5û­IÉ‹K<Ó²W&ˆ‹¦Âœ[:¹É¥ŠÁLäRhÈ.ÍTJ)mÎÁ¬Ãòp’ÅSÊÈ÷¦-‚”3ÅI#  ŠÅë¸9¡ÿÿøoþ¤»÷´œ&ôÔýžÊ!º³ÓKUoLœžÊãƒâüåçpŽÔf½%WuƧžÜÊe]‡gÇp°·]—a±{"ùr> ÉÑ…¨‘Ȳx/'M±"×ìõ¤q srþÉ “É$Œ[BälÙrÂaïPÇûì#5,#œÕc–Ùç)´˜utaÃPò$RÁ{àæùñz‚ß/Ñâ$ò#8ŸsM¼É$¹ÔÝ=ð³lÎ%®áða ~:¸AÎÕHß>"¿Ïkç¥s¶R8GG©]⹑jÑpÜyÉö®°¯…@óÇ5×ê¹^E˜¨“tnä2Jº“hOŽb­Ek‡¡PÌÍŒõ~jÿœ»°0š]?Ѩ{B›ëö—Òkg'62|»´k͇û4=d¸üf°#sLYˆ·‡ÿ\} Ž™`ÖÊô˜¤ÊC˜aªžt~ã ^6.šÚI¬íT3f+Óly Ì+eŒ»÷y½`Ñ·p|í礘ƒ¬+Y‡'mžËfr‹L©ë·8Ó9Æz~V˜éÕžf·`Üôº«ö!Œöà–ÚÚž‹ (óEÖd˜ÆÖƒoM.o¿KsÜõz9/À‹Ü/ÖeæÅdXס]<øf(Ðrû X1„º†‹¸ËN`ÖExízøqµø6v9/Ÿ/ºÎȵ¢íò6p>ÅÙ@qözYÝ…—nÄ~¬¢ó‹‘Éä?×ä¶î™B] `ùCNûç'º¾RV +<éMWlH~ ¯çºeœ wãy¯.€ß_ Ø<=÷[>à;®-¾¾¬ÚçEŸãz.êe‹yˆÌ_—ør–þö›œËû½UªÃññhQ!(¥|÷'A"Šÿãÿ*tªì´xLº(Õ ÅÁ"Qh€hGl@°~ÃÍÞpqñLBB°!A¨’jd(¡g  ¢¸"êtQ…Bhì½÷Ûm7¿ý”=G)—îén‘Px1§´ÇÖÔ޽ȥÍm&Øù÷ªHUÇÎ1"¥c¬ã¶Þ›§R·•ºAÔvhˆõ»Ixˆæ¶<>•”·›]:¦öPLÃñSãÙ‘hUJÊ›M‚iŒ‡\Â6±Ã¡ýöñ^EFª·uÞq¢,I–$hÊ/þé?óc[€CBübCXmþáÑÈ ÿèÄà©¥UØßÄc åÓq÷õ£|Ø—MD0­+ì`ÈJa鿝þ¦n²š|H8¤¦x æ»*¼ß>6 D7›¤ÈÙñé €²P‹Ç”‚9ëc ^ÏîÊXå ¥¸ó’ÔÚ*zv-LIm+tHt Ï®¦qS§ªôâ Qc ªÁB*Y%RJ)îUˆÔD©à¥ë߀—ÔæÒ¤Ò&).N˜Y½©j…@DEMëýöÏþò/†ðO6ºÓ½;³ûv¯K9Z8  Ýí1™n¨K?}qV:”³{–ÿ¼r1‡ç'ÚZËÕÙxüQ2Cl¯JkIö„ÇÉa÷=úB÷¡‡þéůÐãë&î“z‰28†B%K4Ñ7 ¼¯LKŽ­€‡¸óꫲ/¹ržda¥k¾éO¤ë: '†å[ùÝnñ¾;dýÁ`€ßià&ë‘­Œ‰93C_á¨8Ày*Èa÷9#Û9ë™^÷n†ã¾ãïiØp/ŽõÃï£|vŽ&oY°[wü¨_»»¿Î½á-‹φ€yßzz޼ÇbÑð»/¼þ)ßÔ^è_<±^Öð\øI‰Î¿Å ™ Џ.ÔqQˆh÷]«]† ÏFò(‹¤â5¾ÚÈqUsì9ÑAÂ-“íáñ:•QFørÉ/mrÒÄÅTŸçÌ<¶5Šë„@±&+6!ÏÑÆy²zå!®xFŸ?çY1® Þ(k˜©,ÀÓ2g7__$ƒiabOød'ë˜X Y¼ µ€t~„Ëz13Á¦Ž!{é˜ê[É0@ W³Ê!ÀÝϪ^냸8ph:É•³äÍ ’UÈêÁ;¾÷+•¹†ûŸîs¢¡|½:0è4?A»FNz?¦gÅÈ™*8Pš~úI¼‚\¹ÁÅé=šÉ³Ž‰‰úÄDñíY¥‰MÇøÁŽ]Ù†Ÿ&=ÿZ1 Üxcv=øã(r"ýÁK `(Epj»PŠ.eû~¿}ÿðÍú÷R¶ï,èÓñ`1P†Î sFÝÖ1g!)îi.É6eq•FÕˆ*ªèîÖá â¦.õ¡¤Ì6Ó´d*,Å(›€âÔ&›Vƒm7ÑÛœ[×h›,=Û]Ý>µ0­?ì„.¢%•ÇOM>´¶ß¨ ýø$©Tï¶õû]Î,Ç‚œqLÞúî/þ‰ì7ßüËÿÉ3%É¥ xë¢Öéî BQwxˆ‰f€0ïåø, x¡X 8RéYÖéþ(Izïé¼3=jØ€”|DU—M½ÛÄíSóñÓãã~³KÙMÕv!ò”ò‡÷Û/>üâÿø¿w¢IY-XˆDq-4–Tj‹$šcc UE¨Yñä¾Ûìùä)—ð>6åP’WUR¤máò°Û?>>ÊSÉ.ª"a·Ý–Ç&Ó]v»‡ÇæI)ÁbÉÒ>æã1ïê¨1T¦šˆ¶0X{L»¿û?•],Ð]¾=¸Š½Û‡=cT6YSÙþâ]ý°ËÿáÛÆ`ï÷²‰…´OÇLþâ×Hm[W©j±©ß•?ìíØÈ§¦Ä üý7éýÞÝ#Ä•L‡CÛ«£šzJx.Z…¸ßw\5µÍf»• dµŠÒúZUçÊP¼ä\R*Úù]@<'’îE5xÎøœžKIÙs‘âpªˆE³M½y¿×Ó2ûó¿ü‹ÙáLz0¹»»“Îî#´ß‡"":Å]/ºæãnÿ‹”×b,"}éà\Ͼ?»¦k<í^Þo¤õúþè0£0C  Sø{iµ™å½\ ‚F¦'Þ‘yÜ1„æe†sÿþéR±¨a2ÑHè{‡)"ª Añi˜Î!§adÚ“µ01µÉLÔñ¢T2 𢭷rZbòIð"V~u®©#¡®þÅÓÿœÞõ½ Æ4»‹I€ Ÿƒ;TW“œ{š†oZI¢ÎŸI.›Ë˜ÈîÛÉÇ €¹êΕë¹4ꦾIËä›cúëiµ¬Ï+÷ ÀÈ8•\, 0#UŒ>qº¨ ÿºýš”ó8–ôá->‡.1ÕÖš‹Èr« fêC£]r ¶V3XÀË.¦çTFJp x”ã_%J=Ø= ŽÏ®|øã,f_+«`˜ÚÈØ‹gæpðW°£g¬Ê¹0ñï&ù÷€˜‹¢lñ䤞> “†È[:· ·<“pþ–Ù¹/cö‚ó`©siW_¦Ãs6 1’’þP¢\4qi¢ö|V7Æ4ô»|.ò“7wo‘מ=¯õÜ]rúóÂx\E]îÁÙñúµ6‚E-¸É8^yï$N˜ýÚÂî>Ò¾ìv|Öó¼§‚«6$§gï šQ?:Ñy^Õú|®¾Ð8ùÆeùYp_¿z§ºO³ ¾¢×mŸ¾cWŒù“>“s¦A‘¹¶Ø3²´KÝÅûòÔTûíãÿü/‹¹˜Ò‘)<:÷Ä.ˆ)þ»ÿNRjÿûÿž½Z:Tdqˆ!Tý`ªÁ…P!Ôª,”ÒZPµb†¸%NBC"43Óøí×&±Úm„GÓX˜!òí§ãñcBK)9SQæäÛ(&(²­v¨Xr1€ØmvNʇÇG…±õÖs¨²ª”¶ñÇ£åÌÄth•U¾øÐ’–ªMû”Íܪ@˜ÔQÉ ´M¥ÞÖ¹I&ÌDUAn DôñSk¿ücý•U¶Kn¿~´œ2•Ûz³ßÀ]2 ˆ‰ÅP4 K¶MØVAJÉßfn*qЍnkßÄÚ›ðT™½©ë\Es Ó!¹$ê‡}]W. D¥ 1Ó’¨"'yjY‰Qctw±à¥Xe¢µ˜÷.à•*FélxÈm&i"BÏÙUäXŠª,(j?H÷”™ ‹ (*ƒÆ°ÿ°ÿêW¿Úl6¦z¢Èt yQptº;K)ÎB:&ŸÀÌó{Fã¹ÅÖÅ^_|ê˽gÍ3‹yÝX|_Ö”Ï,¾I໲)ÊŠ:ÇåØné!È À¨yÛÝ,¥|;Ÿp¦(¾x¿Ÿý($9K£üÒöº•VðZ&k¸üó…'ùÜžúê3y}àwO-aÍ`&¡‰7di¼Iôy#Â[ ™Î0yCFÑÛ¬Á—3^µð° €;ëw¦³-õÇ©lôd¼èÝßàYwø À‹æòç½>c†Üu½á–u½¸þ±Ï[½à'):ÿâ/º9[¸ÄǺÞÞãú°V-{C+ì7‘ûwÈðúåŠû?¾»}ü&ÖOD)ñÞ²Mœº]x§ °X9xÁÞyCèí’èïL8õ-u 'hÈMµŠQÿÈ“7Ýž^XŸ{yÄ ¿ökòq¯çxkÈ`í,‚Fؾۓ4K¹ms.^¼®·M{tÑX3sx+˜…Œ@ö ETUxé>¾SoRÕhL”B]£jƒˆŠSµr%ÛæñÀRbeî¹}Lm‘¸«½INñâ%gÄ}]º?›‰bûa'_ìÅTŸ~ûñX›šÒ,Fû]qÏ^›—c*ž}ÿ‹½™Ø~‡*lÿø‹ø‹ÿæxÌÑ„‚æ±yx·}l÷þa³Û”œÚß}ô”þÛÿ«ª|óû¿ŸwsÒ)*¥u2©ôõ¶  hD\k/IÅ E,†`žR1’Bé¡MI)y»ß<||:½®b°§Ãñ㧦Õ~¿+,¿ûÝï= únTÄ`O‡"j²Ùo6»º¤"*¹IUŠùÉM$[Êꄗ̶´^¸ÿb+Õû‡/Š—âp-¥Ð¡»í 1 >6^iõ°«Ûß~üÝïž*ò‹ÿö¿‰ÛX)$X»‹~Løæãþ?j“7)ó©=´™VÞ…¿ØQäøÍSùÔää‹]®b¨,[ÉnÍ“l+û°å!1çz-À>õ›'DËûê fªéaç(È&jJ±Í‡娄˜¹Û›ˆ ‹@´-!ÕŽ&¤ TD‚9IBE‚À’sëT*ÓB¡N’¥i2IR!Úiÿw+«xN¹äâN~õë_oö›PEÛÖ›º6ÓIûhWšæÉŒ½«ô8Ù5ÿ;}tÍqrž}~—wøå|÷Þ£ö³èß_K¹o'Þ3L “VÊÅþp·ê]_7òí~íŠÙéßò²£p`ÿº˜ÎH—ÿz†Ó…)BŒ\0æ Oº‰Žàç áî¼üK‹¦B=¯—Oœ,œy`-¿Zc‹~ÖL˜¯È·Käî¿àë€7‰¸~˜0‚¬ª–sÚ¡—‰ˆ²° óÍ!Ô—ÝÆünž;Ï×1þƒNWÉg&YK€ù@G|éò\Ó9øn ’ì¤åü{Ù<Þ~d¿>O\¯t¾î®È}¾¶å—Í¥+-êϼ°Ïk½án÷c¿~ݹãÝÓrNZú®ë÷uþÍI `’øÌm¨Ï\ïQ1{Ñj~Qz}þ ³'% GÔ<â™ ùÍö–ë3cqZLþFdi‰¯èˆÝÄ—.[–îïöR¹>¡¯²cF·v¥þÚÿ”a£Õmï.K«y¸^$n9”ëº,${“ÚÀ¢’À…ñÈeñ¨¹÷«_Šk’SóОì>Ó™¿QFÐò2}úÃé÷9ràgmŒ×ãå 㣿K)'Ÿ‰ô?x×€Æ8“¶¸oJ“PÅɆd¤z4±¹?cC³å}ý‘O‡Ü–Rrë¦m³8¤‚ÀY„š˜(C€ªž“‡ÂÄÒõD›i)NRUé‚ÁD‚t•”=~Ø ˜ÛœU‚˜½‹Õv#žàTqÛJŒ™)·MiJ[­=l«¯Þ‹j..d¥pçñ›G@¶_½óTÚ&Ù¦Ú>l‡†‚ÍÛ‹!H0Ý<¶¥¸ÕÕöýñm¶»jÿÇ_ŸM“Œ äcõTï7»÷{¶­¢ºý°KŸ mr“ÝóQ¨?5åplÿíÿ¯W“hÌÉ‹SÌ ^Š ]Ì5:ÄáEK /ˆ|õå*üÏ¿û¶x"ˆ"Þoª°ÉíÑÔšcÙT»X×Ýîö>¼Ë¹MIª w»Ú%ÇJ·u*°ððÔ4ßoŸ¬’°‰€;rØiã»÷ûÇÇ'O%I¶]´Vx0p‹cΩÉÙ½-¾Ñªª«C“ƒàxäþÃîÝ¿ø;wßVá¿,Ù+¨o©€›/wPkS뉺ݼûÕFÀã±xL¾­Êf#&‚ì6©@TªLh²m4S1‘*ŠŠl«¬|:H)ØoJÊ·G+ÙQé®Òñ zÏwÎ?ï爨¬r¦‡†.§ ®±&­»éÆ$ãoåR2|O]j­gгlêÔx4(ž.N6á‘<60ŠóÏSJÎD¿Ë£8ïùò2Vš¾y=¯A0ï¬X¯¼±B˜›kÎ,íØœ¸jBÓ1ptÆ ÎëzO÷•~ðûòî·ÜÇ‘ÉOAt~&Ü¿¨ÓïáükªBžŸä‚ Ñ(†˜‘MçÏg¢/:A¸V|¿„€×0V[0î_ÏÏ-i^×:¼‚f?÷)Ï÷Gݯڛ§æÙËšìæ=GoG_Ï;‡®}ã´1p¡—ò ¯|¾ì¯3–Ú_³®O÷ÝKþ¹×¹·x³^™`8K¿·È„ ‹V×Ë—2Àó*ðkshýdz£=s åðÜìD05ܘƒ—$d¤§z½YUzx©W^âRØÚ?‚ý‡w¹x):½”ÊâñÐ@$˜‰ˆE¤äÂ:ç ™AáÅI/§ÒA%DµÚX)žI3Óhž‹˜—¦ø¦ º©sRWJŽ%—B¨%%c‰ïv"(¥´‡$^4‚¶­º+·>üæçI)í÷ÛôéÈ–öa_UѼ0¾¨Ú:}óÄã1¸kCP¶‰¤£m%{>6ùÓ!¨¶ÇÆ º‰û¡¶Oíæ¯ÿJ*‹›úéþWΡ+,RÍA'3EФMA¥¸¦V~ûÛo‚áñcvJ$ĨØ~óí!ç²­KÍûw±Öo¾ùšD ^~÷û¯…üÅ—_LJ÷OÇOumC÷í¦®vñã7 j‘ Y—Xf5{á§ãá›cÖ²}¨c8„­yV#Ÿ>$ÛÔr ¢>üÝUÕ6æ a·IMr_ÛÓc[´î*Øí*†Ø¨ív;h+ŽM]{ÀÜV±ÔUS¼•M…\üئœ+1M…µ)TÅ(.jRw(O‡Ü$n+|a™hbV±í¶“âdkñPeEÇ 9¤”’ÕuÜD!DÑ©÷»Àì¬vé&Bw@ÜÝ;XMRCGð’J.…tÏmrR bæä/¾ü’ÎMU ª‹fÁBŒ?'ÓÞ²<øö0ɹ±|° ÷b€¼º-÷¶:+ ²wï:ä³zVÒ~éîöœ|ø¹ €þ1Œ9§ÀFE â"²²{ÍOj¹çPG“ÞyƳ‘ œ;¼ÈÎdHÜ1•?Ãÿ×ø­SBà°³ý’«B…rVtžõg¼Yg×ýíÃ~ƒ~B:!s|Vp·#ßù”[XÿbŠ5w!ž7.ñ>pí™¶g÷ ~&&éž2Gm®ÿÎkxoÖHøy©ïa,>F91ξó~¦ëv o «rièþu4ÏUg[ǵÏàþì£Xöíæ¹`Ô¥´zâŽu߸Ôã…µ¤gíŽn /Ÿ¸×älop·ñÏþ~Dìû‰V9¼%`9Ž’—lI+;YÐØã­¼öúyk­ß7cLžK×óY“£êNpïe’›0ÝÌ¿çùÈwóúQ‹Î_/½`& <>©º®~•ðCÀ倯pÿ0¿ø9®¦na¾ßûPMö”gH,ÞÓóþ‡ñšçã¼ñ´^™¾~ã>4~D÷ù¢´RÃÿnþð”­>yŠ?tý¿ñÕJ'š.ï¿üð¤Òšœ²»×UÝ“Ô}o?D»ç%Dq ݽĘA/ªÖÇN¨¸SM ¢ ¨ ÄBK)‡ÛPí·.âD¥YóÍc96^×ÑDaBJ¹)¦0ÄýFÌJ)épÌMkueê‹SÈ"‘Sq©L¼8TIäOVnª°•Ô¥iÛOM>´a_¹óøõãîû °:„:Vûº|:ªª8=5¦Z½«²Í¶ß<ü‹¶mKóÔHõÆÁŽÿÓÿ(b.%³xv:Õ%%Xt¹ŠªÄ@|ûõc[ ?>‰Q„©-%‹j½ÙÔ_~õÁß~ý1%:áO‡ÖÅ݉61Ð*j”’Á(mÉÇO©Õvk+b»PZyjý}Þjë™Ií;Ýjqª*Tßÿ×ÿUIåøÍc ÷•«ßm¨òíï?¥C6µ›ÐTª°ADŸŽ…DÙVÇCÞ<%ËÜÕ›ú]Õª•Cp‹†œe·iÝQy؆MÍÔ0%ꦠmñâxØ€šÉî…¨ê á!Vµ˜ •ÃÎJÎ¥¸Š© „ª¨‰¨vƒ­ ‚uÖ’I¨iq' —LWR€Îã:§ÂRX¼ÛÑLõ7¿ùÓ"€HAMÎþ=ª¶{ÿp N5=žK "8úÎô®0èþåOCÁïsd%ÃÝsŽEò†—Ú÷¿õ.Ø)Ž bH˜¸3ðÒ~åœíóE­Wj`k Âui©I—^ ˆôýu×&çZkçOoGâøÑs ?аuiæ¿Õ÷|¿ûòÐ@f©»™/KßR5õœúóël÷ølC÷cÚ•ÿકÐâ‡_?MÑù7 ™Þd|Àš¼æx¿"jtýí×ÚZõâ~×îž!y6^ú– €á‡®Qƒ'±Úâ/r`×Þ;¼Ž;"÷‡S§7ÞЮ4&p©}aJ$™ü»{æóØt¾ÚÇ,øKÔ1WžYVõ…u×&•àªùÞ€±ß·ËY—`¡¿ã"ª,]ùr²ÿ.’‰f|Õéý_÷ûlÄeþ(Îò2ƒa’á Ìv„Û‡=϶“ÙÊDiž‹±¨8¿æ“ç0nû<«Ù,½èfœÛi»Z3¯P÷o³ú—zç9¦ç_›4úÝA6¢(—Ö9o?§Ánv"L U†?%Ôη#œô¾žúƒäNGkœúPñðå‡O¿ÿ‡Ôf€(%åFšŠˆAYrVUP4¨ŠÁ"jPÕâî\2c BU@C¤{·H!jFì7)Ìtñ6U¨0F¨…MExö¬”§Çæ˜ý‹mt…›ŠAÝÖuD:&o?ûÌßÓ¡©¾¬¶»Z K.÷On«PW,N¡¨Ô› eëØ6©~Ø•¸Ý<µÉ!q…ñøñ`ÁJ[J*Þ´áÝF£IÔì¨î›¿û/ªý›*üö÷%³þå´ù›óê/öBüþøKaµƒ¤êDZÂï7±z·ðä¿~z:4•Æz·É%³7Çöë§æÝïw»cÛ¶É¥Šj’ÚdB1§fÀ!{iJ†Kªôø©aÔ÷ÞÚCSZ ȶNÑŸ\˜uÿWÿL·Ášö›ßªEQU´ Aö‡w[ÄH§¨Š›‰„ÚÁ]Ó\[2ÉÁñ”™sr&«CѦͩÄm]@4mÊÇ6Ó¨K©¬˜P¨ÎÉ.¬SʪÔU‘]¿yôýUˆÔTErÓ°ÊôÿÏÞ¿-HŽ+Ù‚˜-€tˆ¼Uí>{ZG3úéAOúéëõ¦_ÐÃh¤>Ó½«*3"œL$A`Aº{ddVzW×Ίôp' À.Ël-3±_äû'l3±…=‘YCSÈ‚Ñ3ûIëÇ{?8ïœû]þ·þOOŸ>œŸ?üöÉϬNbÌŸOÌÊp]ÑÉ%hâð³ c̪fÁâN¤îÌnSŸùT¬* áE8SÖ m-¶Éü2O+1Êuq®ÑŸø©ŠýK<,Ç¡Éìx7KúzïÅnš*#X¦¤a“¹rT<¾ÚÚ0Ó‰öa’Z[À ¥7ZˆÌ_Ä„0óëIªn„»G63™³ÉT¾ËÍÌý0µ„hƒâfif"ò“øV]¿Œ”"½¬3 Ä7á´d/ɼ(«×ä8rQ‹bO¢XÍ +²¯lP•ú©T8ÔŠÅfÞ[‘ªÈ)ìO’‘½È• –ë8µÅ+æEk ¹h±â\Ú\â7««Ð2Õ0í7̤~¸”´6#ÃðÖ€=2oˆ5&…Ã*GÓÉf¤(¹ñİ|Ì+|䪺€•@)5Ÿóå ÷_Mýcu§ˆÅ½B‘Að)׉QÜRÌŽÚ‰9p"CA™PÚ+´k„å£ÇÌÛsU‘+C9‚)CÊù.ò_È,³”Í…©ç3dIô¦däy“ʵ¤ê¬¿T®‚XµD&mÙ)úlb³Ü«vµk¥Tw¶‰¿•:¾Ó ³YPå(W@öÑGèXi“H© ÞßÓÜ gV::û7Ñù+¿«}sªÞª~„UÝ< ¥‚eA¹£o\¬MÎkåc•ã†E©ñÿÔ…¬nWŒÖÒÎ_ºm¹K*%»ÊØôë÷nÑ%ÁìËÕ9ÔwjRw–…€”¹±Pªá€u§FU½öC¤.¢©XS•§ÜfoѦ„"bË:9Zþ,u‘oà:Ô.Ò\XP±!²e“Ķ-‹ˆ0ÓPÊgÀ€”ÀÏ5vž¸$)o€Ôì–äÒF-¨¡v!P½Òßn04؉Lµ0Z€)/ùøûç£óÎîñü‹Ë0Œ®#ãÈžú뙉`¬È;?åÂÎ{k`¥®7ŒnÚ¶žh1†¬5 òìALž¦ïÆ×ÜèˆFϸŒDædüã£ûãÛŸÿñÇ…ðñÓc÷ñÁ1YcöþÛë‡gÇ ¢‡ß>ŒÏïü×Ç׋ÿ69&OãeìN=?¿úç×îÓ“=[?:ã\o zcðòu°§þó??:¦Ž™‚5ã×Wî»Ó—‡óxr߯o}{þ¯o_>>Щ³§Þ<¿^¾]ºƒ{C4^_‡ÿý_ÆÓצ3í¾üŸÿ/xìÿýü2 ȇӗS÷eNO'|èËÉþ××—½õ§Ž?<ýõ¿ý/ÄÝ·K÷ééÛÿëÿùñÓÑÉvæåÕÁ€:&Ð0²!Gûæ†ç °O½=ŸŸœ£“émoŸ™Ý£ÈPßýãÿúóLçΣèÍ×ב<¼¾Ž#3þôèé«}ì=€µð—‘ÿzÆèûÞÈŸNçÿù‘<ùo¯ý—ãŸß†ábžzcÌåÿó?>öÖ“y~y1§lÿ¯¡]¾ŸþùÉx7~~ÿøÅùq þú×+:ûáÓã§ÿûÿÃ<ÿoÿ2//§S¶Ö°{8÷——¼§SoÿúϯþëåÑú§ß?\^‡¡ïÏ'ã™Üÿ÷_ô2<þûïýSÏ__ûôÐóËðòì;Æ×çWÛÛËó…gOaê'ÿË0x°…ñüÊþñ©ëÏ_‡î‰^}qŽ.£é¬yèàtêODLs¡#ö<ëŽ_¯C–Ês¢ñÝ»H/eV>l­ó_å%TüÑb– dÈS&¹K…‚x:ýafýñÛûU ý^Z(<Íp÷žˆŒµïè‰L©Hëøëõ“¿øÇ3ö¿^¿´œþ“Ù{?UƒÞ›zÞaç_¯{‡[û憆æÊ× íòYñ¥€ùÀWtì¼ù‹jJÂF)qcK7VÑÀJnž¶h ÛœM’:H(£ʉUì§‚ »D«ÊRëdstƒ~:²u"‚n¹½år)[lƒ„“Y?su|ËEê8£ÊâòBîcÚÞ|¥©Â F–Wþ;&¨£ä£ûŽ G÷»Vq™ÚpÅ–ã`Ÿ©â ä ZA2Ä÷({d™ª-²Ö¹ƒf+^蚘U¤"£r *goàOJÓíÚj±Õ¸«_[>ŠDDŸ?xï™ýxØ»ÇóùrGÀz6gÓ™ÞÞ½¾¼œÎgï§ñl­1Æ‹q<3wÖ‚7ÆöõLÌÞ0–†‡gØÎ>>^ü³óÞÀ3w~p¶3è{êl¸‘»×ìûGëÉ:Pg-õ=Nììh=`lGf¼¼þùjz<ÏžÎ/0§Ï¶³ð/ÃëËøìñøÔù‹£átz<gÌÓçÇ ðü_ßþøóõÿíƒ9÷î✇‘Ó忾ŸNn­1/_/§‡îõÏW>8{2µgóüç«çádº?ÿßÿÁÎÞÓàøéüðtqìøÐÿÛÇ&úÿõ¿l÷øå±;Ÿì7ký8~þøømÑà½7öù#f7Ž4ØWcðpúvN„SzáËàØ±ÿv!Cl{KzËn°ø:x2þåÿæÏ}zðLÝSÿx²ýõ<œ;3t¯¯7º‡Sz:ãÜŽOäFgzûÐ]<ÞƒûsgºîdÌùÁ8ƒWÀ[Ûwèl÷Ú›îSg;÷ Ã`ƒËHÞó©vþÔ™®³0˜f(ŒL€Áã™™ÇÁ1œ‰˜À zk:Û1{f2Æä={ïæÎXîŒ5–Ø“0¡)s&xb6~š)êýèxý8úѱó¿ýã¿Ákmw>õç_>.>":äk ,L­$ÁcšËS£v×"’²<³qŸå ÈOL¨à´<ñx'2®²¥ƒE‘Æ"îñpó{ÊÁz…¢·Ú1“œôÑsÜç%|}®¹1Ggºêð6MÈ‚ö¨dÌlý|¼ '_ˆ5,ËÔ× aÃbs¬-@‹’€ýÙ•ZÔãÌ’ÀK² äŒúvG9]o.›SMÙ2Å™KÌç´÷ì8Hç¬ê·¨ÄT[Lßm/õ¸åâ6’Ä6{š.Q »./ÊÞ¦#$9kIŸ²|6kR)HljçX P¹½wsp%µ–A2d~HQÇ//æ¬Ò¡Ù¸ÓT’º Ø3½¯¿Â?«fÓP·JE xŸ±Êî­(á’´uC*ŒiOw¥/oÍ$oH-ïöÒ¼Ðc#psÀ¤yuv|EI=/ûÆæ1 bkªÊEû!ù-3!¾´´j!µ/}ÿ:’‹”+·ßg:,—4á£Åø'seW@*œŽ„‹I×¥lʲ+4µ]»¢Îk¹*!'´ø„‘zßIð·‘µDƳ#ÀÚÎ0cÌ0¸é€ºÑyÏ]×]x˜`O"ãÑ£ÃëhÎýùþõmpüðпž::õ£#Ó›áâì©s— ýÇK°½¼øáuè:FÛûû£ùë¥ëí§Çóǧ×ÿüóù ^.cÿåãÓ¿=ýÛ§§apƒsçÇþüùò`_?ôüâa¾ýןÖvÞýÏ¿þþëá|Âùä xlOÝ3pzêøuè<¿zü«óƒûp¶ãÓ‰žº€óôøpº<¿þ店®Ãè»ËèÜwlMçíó·Á<ôÝÓi|ùÔ]GÔ9½ñ¸°¿íØr‡Î˜ÁÓ·7zöÆxçø›÷@s>wÝÉàáÔ™3ùatnd¦Þ¼sÄÄÞÃ3Ã'Còì½'&cà™Gç:kÉ0{öÄpÞ[ÀL죥¹ÆD伟ööT?˜ñ<ÏÞ{?ºá2ŽÃÈÎó?þÛ?m×uç¾8?}ù„IMw–'æU«WæHȰ‰vdé*ƒ¹3„ê5¾\œkð}2 sÚÉÉ-£QÊ%ÄÒ6ÒØ¼:´¤¨Žµ(¥j^Y¬HÙ»x¸2—GºòNÐ’«#…xbSAl·Ðš3­s J~_Dqñóçà@þyf2¶”‹TÞ½34j††ej¡smŒOŽ/'ºÕ›;|Õ¥èñ¡„±ž&I4A.ÐR5äz PÑ/º ÜÍŒÁÍŒ½¾îI… ­€£à2ãŒ4æÚÕÈ9úŸÉ‘C×vO:ïÖúm8ÒÛS‰šJ.žžÈ+«@ÌZ¨Î@"Úš‹¾'Lj$(=×h›çK =¡ˆãXer˜²âÕÍYׯÁå\Û¥J¼]õŸ,Gãizµj €µQ%PŸ{’ºæšËm+[·ð9ÀtM“lIud“:=«}Jè°ƒõ‘?å] íDcer«ÝHռĎ¥ PÁ•WªBss(B Ë!¿pÌtT"()ôÝžE×diTÕ)e€ÆA2ul4öJÒc$óœR[ÄÚÈ–Ã¥š’\óÔTó·×`´¤¨ýbJbò"€ß®Ü¨éϽ÷Óøºá«£¿Ñë{ﺭÇMh¬îÑ);m,UÅqë4ƒ_¯+𫆠òûœÐ»RDØÐ÷^)¬)1Ègu¢ÿøLDhïü§ŸþüëË0žŸžúÞkÉ»×&é—fNbçɳ·l@DžÑ[3Õ±À‘1fþ¶À½ Ñ{ºó‰Od&€løõâGÏðÞ{ºŒøóÉt=YÃL ê@/þé^.§Îc¾¾ŽÖ>|þ@5Ö:Ož_yrÌ#áÜw½% ² ®YCÞùçËÐ3;Žüÿz}úÇÇ¿ÿ2¸×áôØ?|ùï__Óvpñ·‹ÿôo_¾ýñ̃3#ÌÈîñŸ¿Yç^þ×ÿz|}|2ìÓÙüõüõeN½}rnàýÇŸýÉö'ûÒuÝCîÐÃüïϯ//î±7¾ëÿë볿8ÜǽúîÁPœ;CLΘGzèGæ‡ãÿ÷üíåõ¥ï>~~àÁu½]F‡ÓË^èg~8uÀày Ó­ë»ÓÉS?ا³=<½]F?xöDÎ3rnøÊÞYËL'0_^ý«£‡þÜY î Œ…·‡™ºŸQoº¾ë ={çÃD0ÆŽagfïü "ÇìÙÃÙOÔCàÉ#žpFæIüLÄì¼çe`/{ïgçÇqGÞ¢ßÿÛ?»Sz|˜ö0ù¥CÛDØÒ 9€$¼ŠÃ§s‹·A:vö\i›ÈßÀ±Ü$j¬«Ã3Ç7õMíïSÙg2…ûÚÓJ;‘ã¿Ã‘ÕùŽtuîƒ­²*™˜—@É·ºæ·‚¼Ì {¾×ïþd5…íï)?-PþE\¥T‡¶ßaaP9¸?ˆ‘¼é.Eæ©[ì˯×èN1@Þcjs{WÈÌ/Ñùw_U¬b©þ¤>™lŒëâ ÜʘwIÓYVnÚ(›%ë]û©å–æA„:3UõyQ”V(Óµ?Ì @[Z°F¢²ƒ,ÙQ¿”ü³±{ææ¬[x«…—FÒLB”Gô»ˆA+ë|Ú7ÚÿI_³Ç…X»)ÍËÛióÙ4&ë«‚S4 j.Üú²]f€ÅÔJÐŽioRæ(\¶”¨AP‚*ìÆ„8Í[“ó© og öÖp‚´ŸV#¸ê‚dŸ»‡ñ—<¤ë =C@ñ²×?0ˆÈçsG˜ˆèãó7òÃèÆñã‡üùçðüÜéôô@À0¼’1ÖšþÔ»Ñ=¿¼öµÆxçÀd@—×Ëé|²Ö2ûat§~šØj uÖ`š>ëK†Œ¡Î²'k»ñÄdæ¾YûtfyïÁðž ƒsÞ˜þñát²'2æe`oOÝ`ìÅ9àtzeâ‘NDýùl,âËóÅõ'oÍ‹÷èlo` OÝåùuýË·×§OÔáùÏWï‡Ç§GkÏ o¬¡×Ëé_þbóúÇW0»ÿü†®{ýv¡®{ürvŽý“?þ0:G<÷>=ØÎž~ÿH7>ý¹€ÿ cÎgïzûo¿zuÞ9ÐùéôçŸ/ÝÇý秇Sg<:{¶8ûñâèrqè`:c½5DŸŸˆì’§~ÆTgŸ¸–-BKNÑüó·ÑÓàùéß>u§ËËÐ=ôÆ3Yã/ãë_¯xìñåã·ÿø×ë·WýÅ}þÐ÷ÿüøÇÀçþÁø¯?û/çÓÅØÁùמÎ]ÇÎêNçgÏÝ0ŽÖÑ¥ë¾^¸»ŒƒÁH4<=²go¬!:=ñzyêì·×OÝëËpîÌÓç'xß¼Ž|î;Oô`-.ÃÛO 㘽cgé;\ü¹ï̹{õ¾ ì}gœgb èú‡îËCgÓYkÐYxY´`ñ‰ËJ²OGÊ-ëGòH@¾‘â,,Ý,È*¬GHd*YÅlTÁ‡8WmìJÉk-T¬7v&âž- 5vdA\¸™m…ÄV÷R’¸Þ±änöötO!æ‚`®E 8ÇH°¼ÛŒ=»1h*¯%?ÑzÑÓ À‚EMú)+D=2y×AâçƒÇYŠ@µ¥Hž &£¾?»T¨U‡º°*vÈø<@Ṵ̂Ðÿ¥ÎKYš•L3íç¼Öœ‡j‹ÉªãWZˆÓ^›þ+¯ÁWÊÉ5ܤÇ<Þ-s 3Ãs~ÂTWÁÚÜÃêƒÍÅñ+ÑÅòæõŽÿ΢ó{ [Ý'IÈ—õÍf˜fc°±Wª½tÍ“¹yY®{³EýNŒ®Ä2”½ßÕ•Ó„š£x»Ç¥¢iy^ŒüÆ…î{>“RæFøÅ”ýi^I±êÖ.­½2ÛC–U„ÔÿÜ~û ˜ËóÅ]fïGúøñãŸþåNƒ=õÆ€`Ü8tÖöÖ΢.ìÙñèaXçF°µ€ñ$êâ™áÝ…cLoí” zböÞ{ïÆÑ1›ÐÿÝÙSߣ'7ަëý0:Ç£ç‡Î2±'s:.¾¼zœzÓ±'âïÙvÝÙZGþÕ“õd FO޹7¸xþæ¨wl. ºÇ3,œ±ö„‡žúSgÞûîãÃ48×?ž^¿~£Wç?Úîd^ÿ|ûμ^úçsG~3ìºó 0ßÏÿýw¸l §ÏýùÌ4Éà|x0è:CÆþö:>ŸNg˜'öy˜Ï½øöõcèáDÆùÜ÷çþd»¾· ==3ùŽ=Lç_/}×™O'KL½10ÞX8ÏL†ÏóHØÎü0Ú®c‚z soÈ“±Öx¼zê³ÁË8t5Î_^éâüùÔ3ãé|6nt#ƒ½g6ŽG˜È;2õìŒ÷“Ðÿää&Ü>ì/;£ž4£—D0dÈ0³÷l`Àäœ÷ó?nBÿ½sìùó—ßA ïÂZkû®ë:{ê?}H&6ëDÝüËŒVÑYz3\=äמCk¦Yæo/ x•‡ÃÕ_~\%¶)nj€»eÆRºü€3=ô·ˆ”Úõ謹…ÐÈ”Ã9â¹Yë+Q[®ß€”¹®ª÷&-Aø{D¢uŠq “æ)ºGüôöx*º²†pã=\[ÇÍyëo’üÿ@_±‹ =vä3ïææîý¤¯Œ¼”Ð6¯{3 }‡BJ¹ûàjÔ‡={« p“1×É¡ˆ$6…†·Ôªßg+=¥ŸOtþ@´‚<åA±$P)Ùæó„n¸(÷3ºÜ,ä]7Ü:›£„vÞv‰GƲ«C†¢c ¡ý*±‡;˹q0iÿ×ΩÒU¡†û\éÛ¹Î,ÕuÉ$ÿ‘ÃlÀPl›ºïHŸ&_X}>v¬ó’]»bLåCµ-Wn¾L6Ùbc‚†ãÊ…‰}÷€t8Ú¼ÎZzG©Ëµ[*‹'h9ÏãF¾mmFÍq›pÕÜø#š3ëþŒ‰>üöÉÚoë^/ÎÞùÏ?þñ×_DD}g,Ü8°w¶ë apŽ˜»Îv#{ç±<ùqôSægŒñž kk'6€gÏžGbæŽÈvü4ê•`æ~%0¦3Àテ×Ë0:²†œ`¨ÃÈ`d3zO̧“a²à1‘gòc˜ƒ‰3œí‰aÍÙÚaº‡3ˆúSÏè¼ó >w}¥óÉXóôðàÇÑôöÁ˜Y·ä28 úðÐw†¿¾S?ÂZ˜§ýeݟϧSoNÿz~éN½ÀÑ7ϯdÎàx|½pGÄ~$× ÌÏŽ^ˆûxê@žx ë½ï:ÿò<žÏ“ÈÎCÏt2O¿ôÃøpî:÷ç‹ýxâÞÂvõ¯ÌÞÏs—É£éz&,s!xXödúŽ-"bŒŽÜxσwÆÏ ‰ÏO²|ÝàÜ™:kc½g ØEÖÇM[}tމ'ŽÈÔ 5¹{ Àž‰Áì=³g7Õüèýèœs~tÌüå÷€@0¶³¦³Æ0ÁÂvÝãçàPÌB°Ù À¦Íò<¢wô3ï 8.©p¸ZÀiKsüS?û?Ôe@<ï}è!ܽYXÝoÞS¹«…nƒe˜{ˆ ¾Æ»ã)§P3Ã7m!Ò&BЛ̬4äÖs¡#Ã'£À¶ £,Dî;ƒ¿E 7ë_*ÍÈQˆ(¦4ïL›ïµK0Q,”¨Ý=!IÁycCTU«*_ËÊr:ï´¼áW ±r¶Ö.õøÒêçèpªßØ`„›aôâÓ—'EqöÙ–F6ŒÚ ªÊ€5cJÛöïsŠ3)uÙô,R%úÇ—«J¥m¤ó̉„vñ‘¨Ze^½ÃUó‚ hišº&MV÷[E²bÁvðþ ja~ò’¥”OThïÄß:´%WË#_Þ3³Ÿ`½MþkðTæ6¾¶M=½¿§èüÞoω#)آǮ>¬<ðKDï4”…mä’=lO¸íöæBTŠÇV¿“ÝBJK3œ’€{’9&çökR©…9c:•KÒ ŽS‹(¹_)Ñq^¥Š®‚´½ÇRÍHý8­m,$€NP)CªRèg[³¸|Ðÿ‹…à𢘰Ðç+ø¿ ŸcéŠWªˆm\Ÿc¹ý¢Þ5i_><éc÷Ý1G= ”r#ÇnØ2-‚HDB.0áË«O èOs,D9w䢸¬ÍÆw݇Ka<ü9 Ij¥ìYH¢ G¡Ù14»êXNN»›žÞÒÌLBiu‹4 å·X+&€Äpl äh“S¬Ý4Ìä?xÂÇ¿þóË·çñ2zç¿|øô¯¿þ`¦®'cgöÞk ˆÙ³3k&és¿p"Í,Þ¹ë:c,LO4ºÑ³gâÎ`tlržÉÀ!‚_h¥Æ ;Ÿ1îr±äÉyò‘g2Lÿûo¿}¼8î¿|ðDnd{>Ï £±¶'þýá|!vÎ=³éÃÃÁYõýÈx5¸ 3' ²|ñ4Žè­³ÝàØ_†¾³=¸ó~\‡WÏûŽ úÎZÓ÷†ýï&É6½c"fµÄ<8ÏDÎóƒaÀxv`óp>ãÄ/¯¯Ìä<;³ø­5|2ă§‹çsozË ÏnôÞZã™.ÎÁãÔbâÑcàÙKÄÌnbxÇ~r…ðSkŒ_…Pç€ybÐ:ïÙ{xžÐÿÏŸóÎÍnÇk­é;ÛuÖÚ‡OOáøÌÒ»ÓøÞp†–Ì<üÇT "ÿÕ—#u–`Á2BâarÁÌ–NrU¶çµ¨F‰ðÚꄚ§Vxl‹H¶T¼s"eÔwG–òUòüŠè|t1“‹À_y¥:›+Û䳎@Ux­ %‘é0‡ð¨íµG=E.‘g!˜ÕÄ.¸`Zâ ®'c±¾MÈ„¯à)Y5%aô:§¾e/5&íòÃw±Œs½0o>Iâ, >¦RZ%·‡S‹¶šÜªTUÆPÇŒ®Ì[¢¬„i‘·ÿ'‡…F$^B?§² e”!³„qxÇñïÊ¿Ì5¨’”<ù¼¢“0?ÒøŸBGª„QS‰ púdÑfSPf“8Ãʇ“ÊæQ2VKEÊ‘TV’Y¹¶!)ƒ—Zã$'j˜«\Je-*¯u´+É’rmø«ËJh5Žv£È)n½ÒXYTI”TezÑwç»<•Ú(€³Íp-òG³H¨AÈwE x;ü”÷qÖÕE2WH‰ò€”ÓQ«¹APŒj7Ô}›>U!1¤:yUkÚ[ØÔfÙDçs¡U9pe”?|/F§:Ð\ªQƽ•Ò©*|W lª:,?F(I!Æ1³Aés6×1ãÊ«t?£èNÒPÎR³Wµ¼|û‹?ö< „ËÇžŽŽ³Ü•ÐÜÂÙ?´«©äØë.ŸÚ"*G„¤aæU»å¶»p-̇ :üëÝLoøøû—¯ægw¼óŸ?~úã¯?‰Ùö±†Œ%œó¯îÒwݤóî½c"t0Ìž@Æ<ážGǶ·Ö†À1LäÜhlb€,@€-Íž`òì­1ÎZ6&OÞ;g`:¢ÑË~R/þæüàùdÉ1Ðw`¦‘DÇDc,xôpÆLÀ7Ã ÌÆvd-1 —‘ˆÍpí¼'ö|ùóëÈ<ŽzÀZxǽí{¢¾£ÞzâñÛÅ|z°½}0ö2¸_ǯ—Ñy>÷ö={wöΣëä™32œûÊìûþqt~ôßþøf?<ýõ|¡‹.È{ÛçÇó7&vŽ:ÃÛõ úö<d:c— è< Ž_ ÌÔu]ç‰Éxç‰É³é ¬'O#ãÔ3ÁÛwðnôĽ1;X{Û“gÂÅyïÙ½òh ºÎç¼w0£ó–È;gŒ™6=ó„á{br‹øÔ”óLJþ˜œÓ¬ïïüçÏ¿yïÙ¹q™Éc{ÛŸúî|züüˆÈ‡l‹×¶_ÈÎÿuìÐRü6P›ôš˜?¬vQ[È߼РhcN,oö{Ñ.y7ÏK»‡ï5ËOSÃh}÷xùˆSÞ¥ [„¿5³ ñÿ.>AâøŽ%¼è]EIÝÍÚ±Ãl[¸ò&ì{·5K%ù"p“t­ŠÜ¼§:;Ñ»d$·ß2ßøŠ€%ßro‘\Ô Pžôï»Ó}m4’PÿðcÒ·bˆºæ¡åã¿YÏŽ[žB>ö àÛdÌ7c”s½–ÝÛÀh݇{G§´;ù €[¯Nü48ëbx¯–³ º4ÈÆímroö?ò†â"¡š ½#@nÆÿž¢ó{Ÿä® Gòäsº_¡YGݱ騜;u j¾Ó«;”Êr¼§k¥0Mh$L”üÁ^.yºlÑsÜ1´?IIoŒ Y ‚ÿR iç}ü©Y­¾íNåÄÑcùíc,h%ȮإüjÛÙ×ç µE²ßSÔyÒCj»f0ö_s›úçèÚ=äÉ*@É-¿eÇ€-uÒ5mb"Gr¸ÂÒ4}Ӣě÷„ç¿&æ¢ñ2xç>}øøÇ_2³íÙX3Á@7Ug=™Î0vÒœ¯“?ƒ"ƒˆÕÒþ<ýõaâòŒ'XB*n]Љ'ß„¼°éy¯AÛl=kuÕ{šhX{E¡(%$±Y¢„QOî[ ©7…í'DwJI ¾g\Ud«  kÛ-–]·í )ƒõ¾Ñª©• ¤e`jˆ¡~^Î-C2QUDô¿d„ŒúL&eÛéïYœÈš:ém¶Ê-Îd”Üv"QöÓ?oßÏ—éÐÜ‹~}â×2w”•߸RÍžÞÿ ‡ŠG– Ô…H«˜}/[77ºëÈ=Æ–ÂV=ý1S¼ªÈ ¯Vîjwõr¤ _>¿Í.% |ÓíÀ ¥¥xeüÄÑ/p«%¸õšþíD篌LŽF£\5‘iI•q¸k:<*çUÊTä1ž‚‰—Ç·l ¥ˆô"Ibú.É·&TQMØ!píâöò8êøAÏ@B“Ìeô9JvÊ×»Ü?²E…ÌŽ³]3AÛœÃ8 ñ$†²ÏX ‰%ã¹?V²µhK…°t?Å&ék ;bmLÀžÃ]Kο;3üI– -…Ð%l†\â‰âÞù\E7q¹j9I2ÞOK(tFn†iDr艮 —²F©Vc¡%^`¼‰§%ÔC ꜩGl„- a}ƒGÄúü)Vš¿3åƒVÄþãu/;'„•B€ãÉðj£oS÷Ti° s0»h•ºà|%abE…ùÃ?¾0ÀÄãep£ûøôÆ|}þjûžˆ Y2€' ÿ‘=3Œ™Â\cŒ#χÊã8zÓYKd;k`'*{g0zç<È£±Æx""xšºá=Û®/Žý¬0c%g± f·(òÍ ø ÏD£3§n]î 4 އñá—уÎ`=3wêûÎ ÎãHDÎ;gDÖZ8çÉœ;bºÎZÇìÙ½nšOrúçoƒsƒ pN'Ûóèñ<ºGïÆÑŒ%z~Ý«7n4OôðøødÉy6ÞÑéd­eŒdí·—ñDð¯¯Ö ?÷ÄÞ9†5.£™:k „ÎÀZr0žŒ'fk¬÷d˜ ˆ:k»Î:ðå2Xk-&¡göÃȰÝèœgoaNöK£óÄ~tlA½íÁ³gO´àøÌð£·ÌntìyÝ´>XÎz<{fþíËïã03í`Óuvú¿¾{úò‰@ä(`ePMÀ '1FÛó³6«­" Ê9[9Ú¡lŽHÐ=˜œ¥3x‘kÖìgyY< !èIg`7'Ø®C‡k„çU²Ù “þ5°UQ› ºGH’¢Ú¿E숳žz.@uÈÅ„ Ùê›G{ˆx)íIô88øö9*NãÕ±1ºšë6>~È£D*'9?åD1BoƒàÊ2$±Jx˜¼¨%Š_M>­e‹&Ï?ý„c%@±ß§ˆØÊ‰DI´ç^’•ÕMŸ9æ–›i Æcxdb®èy”{¯ÂüPwcIVˆå2±ÌLá%æŸSFT¥a¶póݨHÊjˆ„ViT½ÙŽvÐÖJ‰,‰ÍeT)NÝB:©«ä™l,â‘dÙ9âˆ*4 E$˜“/åØ%‹X{ ¢¼Yž#ŸFñü Èö#T²xù‹²ÆÑM¯¦KÝÕ(÷W†6ÁA’wV*ªìpÂ饬ñ.‘t ‚^ið@¨©FãJ\Ln#V¥üJ²oÏ•¯Q*³ꬤh+|ªªÞt2 ‡êÞ$iN¹},*¦`j b @ݸÜÀj}$ÚG*­3cl<Ä'ŽbÜ›”)$GõD›§m_s”²]Áq­‹ëòŒá JºjP¿˜’e+˜µ¿èüÞ•UÃòÝÛ†)™Tšey:¶ÆM÷¨a\¯*y“×1@RmP\f92V'Á¢vËÎ92ÇÏåõ§Âׯb‹ÖöøÊò«í0°q‚Bª©Æz-~›kmEäPˆ“Î ±Ì5%æí©ÚcErÒkLj¤ù'T±í7 ¹ÞE5RóÉ¢åÛϸ†š”4Pà†#ÌXŽø#)6ïn7óÛ½—º>~Õß@·§[³Dÿx ½?üöyÊöÆËÀ£cï?<<ýõü™»~šî;÷ÎýŸ¢ ?)í,Ÿí™<ù1 Àƒóã0œO'ò4Ž#¬1Ó…"7^Æ ÓèˆÎ'bÏnÿá½'wÎL€¡qäÑ{fê ,ã2º×—‹1–ÆQ<#çùÔ&vÞ{懮ÏpÖö—a¨³Ö{×u–î­œ#¦®ëœs“N‘e'"òÎýõj€îtâ‡n|¡ç‹ëûîÑ»h0< ž p]OÄŸ:ºx~yåÏ£s§Gc˜.Þký8v~„÷§ÇóåùBÎðè©·¯Ï{"Ó[ÛÙqpntÔuž¸{8u}ï›f+ž‰½1lg/ÌÄv„¹|½¼öž¬÷¶³ä¹;udìó8bzkzÓ 3Qg Á8v—Á[0‘wîÕy"æi’3û¹&äsžÝ8.*?óÄ#RÄÿ÷'À;78ç·óh_cˆŒ±æñÓLûÓ»io¬ÈŸÄn´ŸéŒXWˆ €ÊA%R©µA™5^jWðS¾¼I.9JªYëeØ%©ùëyNVq3!âÆórý}¥ªÆžÏÛÖK‘ER *ç~”µŠ=tª§7ræëÛp•ØÅ¸‘úP9µŠ”¸eÑ<†k9ªùa,.bHÏl’uãa»ÍÆkPS8˜Û¾ÖQ´‹tš1Ó ûX†þ.àVeAÛs§°^W±¢”î²áÜ@¿X€î¢J®!‹µÕKYs[1§Qo,] £¨ŒpÄ2ç_=Ñ»­åQ Ï? ŽèIsµwÐî[1òjˆb·Û2Ü`N±¬~©¼û†=jú_Oá‘”T‡*˜áqà0Þä“7ñÈ*hVÚµ-S|J@–t%[Ñùë-^Ó•vaëÛ¸'¶ëՌb·§rÝXc¬xÛ^—_3ï'Ø£ý®¹¶» åê{/FQ[ÍãMeo®í3œ}Þ‘¦¡ì¾Ô‘öaMÕ§® þAÁÛF×nxÏå6 šæÀm×Hk”ï¿…H³LŸ‹$¹WÜ#X "â¿6—;¼\Ü0xç?œŸþzùJ̦³Æ˜YŒÅÌýDÓõøqdÀXc-yïü8Ú¾÷ÞÀÞÃÚÑùÙ¦OÊþÆ‘ÈÖ Ã@3ÇÀOºñè¬!ÈŽä˜ht®ƒ5†ì蜻8×Ï#GÝ8vç“5†™|ÏÆ˜³í‰` @f$gÈØSçÇDÖàÕ{cÌÉâ≘¼ç¼sL†,³s®ë ½:Ï0Œ=b†÷þ‹y&Â8†âÇ4èÖY˽íDZ·üò2b=“'ƒ§Ç§ÎpÇlñÀÖÀwöõr<-.—±ïÍé|º¼^F¢þÜOd:ë‰<3,yÏìÝàxFçýHÔ÷³gfòfx½¸‹Ãh†q ®`{kŒa°ˆ|×™inóÈÎ1ŸÍÝÇÜÛ“÷ãRù={&·¤æý`þýŸÿS×÷ކŒ±ÄäF×9Ç "îûîüáq*‘gš\ù´å<Á³Ž¹,± *pÕºqü7+2y½µàÒÙ_ÛPÃ[µpo¼“Ýÿ®Xjéês «¬ ZF’sÞäïTG" µFŠ+1b¨hÅVöUºb9 ;Ò€ù^]BwïÐÒ¤:™Ĥ¥°ExÌ7éÕ*Â(o¥½#Oär@´Òk>ŒÅAn7Á Ú·q‚ãÜ)Œ;+ߺ齯¡oÚ .@IzDÿ~]_UÎqãc1»˜Þ¼­ó]vH›½‡rý  ÛÃî UçÈNßå«ÒPÿ÷ÉÞëßÕ;_,\ ŒÞÍõãXL¢ºé]­·º‘–ªÕßYtþVaÒ5×_¦¤äúV’P•I‰×ñZ슷˜‚Ò«SÓ"¡ÑÏqÔ ¥Ë„){DÌì=3{æE †eË6ÅmØ9ST“_ŒVné,È:~Úeç#-m ¨` ¦.X¡+cé?D,%(zS^2èŒòYö%G%:b’1ÂÚE&'g¢•‹¼®G¼U5«,´›ÿIZF°,â­RóyΑ@6IBÿa[¤Í‡i%Ùo!}_d³±rERÖ¯O,ù+fË)c 3»D%>®Žp&ÊP°_Ä!æ±¶Jé0>¯mViI!ô¨j¯ë¬º\j†¢Ý&ÞÓ!8&‚Š‹ÍŒeìé(ìÊCVóªW¼š=ÞdzaްiiX érËð=~úðøùã_ÿã_¯_iç܇‡§¿¾þe:k¬1Ö;• ¦Ægpa*«ôÖ8ÏŽæCk  — c¬afc­÷ž™­í ï­½›Þ,ŒsÎôÝô‡ÑûÞZk,ˆŒ1DžÙx8º®³npèüh=1`tž‰,¨#c¬%çŒ5Þ±sÎÌ 1¬õÃxGý\ ð“`ŒDŽâѹóó÷LžÙZX Û]Ø¿:úÀŽáÙvž=Ñxq½ŽOÎ0Üþåϯl wf r¼7Æðùód :`|y%ÛÀ‹çáùâ™Î'1£¼§Þöža<žGÏXØžvœéáiªìÑud {ÀZφ¦jÊɘ×q¼ï-Œ'çGb&ïi ?†1Î9f&Ü0²óÞùY °Ö˜ÎþÏÿüïöáôôûg`šþ ï™Î2“ïDž={çœcOä½ãžD8¦* ‰Š¶(ææÄÕeJZ¼Ý«6iôõèˆrH°,*ˆï‘Ç*¹>™qð*É\E—¨C±â¼G¢gIZR¡Óf²Bß§7Ï©b.:©zýøêÓÐEê!ÎôÀ¨F¢ÿérÝVYxG©Ái{¹›K|‡T*Élf`*¢2‡­š)ÍÄíiqý\.«¥%‹M˜H!WXëÚó2Êm“´.ÊahÛ¡ªèQL“Ÿ$Z1SDð!—µExâéT°ul§A×ü¬ǰËóH¤«—i:±—‡TÖºÄm5+ôI ¹¯/QsX“ì(n³A…›\$kä\!ˆd¾èüàU6/œãôª‚:P¢ß:½ƒ×[ÎD8½5$®ÆJ‘k‰‚cñj„Å»*û6J¦GNqÛVwÙv$Û".$¬µü-Ä(ñ±KF·ÌÑa^X ý'5E/ѳ´ÑEä¸,Gt&ã-Ä2ÎÅ‚§íH ¦A¨duI-}µíðM˘wU÷¦hj¤Ð•ÈdÓÚÞ$´<,ܸY+)å;íZhñJ˜LÎiÊT¢8JZƒðBqD…SJÛL£^QûÈ¥–z¨8£j“ƒ¢–ÿƒ÷¯p@¥å/"Ð;Ñå=4”[ÝF|³®3SÂI%´³<4NúÄ“É:ÛJe-Ð<ª/M¢JðÒÄRÑO':¯^d>mbV´ÕOSÿÌmÇØ–Å˧’¤ñI†½imøæ(ÝC>CÿÆh¦Ù{Cð>ÒlYaÛ@YÌ6 …žÛ8D˜+1\uk̦¼0.ˆd‰f¢8ÌIs_H83±ª4Ó£²Áß±YåÊÕ ·‚X„vnýÊ_ñýâ48'š\™* €Êc啾$úYg¬ ·ÎâÚ£T°[Ú ñK«: 1î¶ë»6N­Á*€ëúõç]ä†z/ÀÜÕ1\=MψcñΠ &bÿñŸ™˜¿2_ïÜÓã£1†_Ÿ¿NeXcŒ1ÖBçˆ`Œ±–ÙñèØN¬"ïÁÞË ið¬G Õ]ö]ga ]{ï=[ †ÁÆ[B7¡Ììˆ`:C¯ÖvÆâ¾³yçØÙ×ç×soû‡Óà¼5`æË00£÷ÆZCD„©ˆáœë¬5Özf¦‘ȸy™ޱf*8ïApž x}yµŒžmçAda÷ç홓óôj:~²tê{çù~ô†édìÅy^Æ'L«åÙÚӇÇÎZ&îÎÞÃ޽ãÎóä½7oÀÎ[k :Ó¹q0"gØþu잺ÎZv̆hpÞdÀ`ï'òÞ{À ò<ÕÙ™‰Éy?8^"üO¿ý[ÿp>=>|øÇXÀaêá7ÆL#_<{k ˆ¼wA÷…<38 ñ´ý‘³:?Ž+.“8Ó&i‘)áH d»Ô*.Ÿó Ü*^^,É ÛFª¨ÝQdAL`íä/XŽ…^9·W\€á¶Üz:–öVT¼¦qsC1ÎK­uÉ££ÎTÙ90‘[~‰Y ¨Ú¯às´+R@½K‘7]3o„·ªÊÍ €µ¥$’ªgÙœ#û6VaIÀ›òä˜0WŽ#ÊÝ9 a_mÔºi{ry\ÓòDŒÜÓÿCÌ0$ºŠîöâl ·%Ÿ5í×­M'ó(Dc#É{ ±ø.Êë D€µÆu“vcæ"ŸìYRg̈j4rÊRxÅ´JŽÎ*Ý/‡¨’*U+!/¡h:{Œ[-©~Ä6Æ´ÜÆßç…f¡@l{ÄÚôÞ¤ÊOJcÕª^nÉÜe³šŽ!B=Âän䘥ûKœ%%á´X;ßÑw•Ê›>K³1t¢gó³Úd´Ë.ÕgMïÚíO©€þ#`’S–´Òg9t$s%ˆ§ÝzS5HºâîKÀñßGt~×õ·W&ªKÆoæ$~8½ îš_^kS\êÃ’xàEó ¿?Ü•FäJLáïðBR øõDîóùº¦™!mwÖ#¾ ²[=¾—mi‰]nà!xrŒÐ2™¼JDoùãÇß>ôú ãe`Ïì<ƒÏSçà·—c­éŒ±˜L÷$ ä=æ°‰Ù9ê&í~ÓMÝ—$4Ò½'¢ÎšGgf@ì½YPacAl/㈥­ÓM-íeæñõâwz<_ž_º®3Þ™®ïœ<³1£ë¬óÞyß;Í âÎvã8uªûÑ9ú¾s—‹'ô0“ä¬!rž'V³'‚Îá|>=Xï}OÆ[óâÝH~GG|†yì,`£óƒq®ëûoß^<ó·¿¾kNO¶³Ó(FöðÄtGçÜør¼'O—Ëè˜-f™þqôÖX†™ Ìä½7¶ƒµ'‹yƒAwêÇË7 µÔ[Cdæ¾â‘Gï‡Ñ;OìAäãØ™‰ 0oè7œÑÓwæÔwçSw:Ùs÷á·Ïa.­uÒ PØ;ïœ÷lð@‹Ü`0«m¯ ¾bÞâ¨ã$÷4v=ˆt3ö–Áˆí:ËÚD ^^má¶Ë=Jr_Ò‘¤ðÓ:Ýýc¥¡ò »ÜÄÞQo?å,#pÄ\RqêÎ0]é§-¢RWÅ3·)4ž¸ì´Á¯Ð({‹ Xºh8«Ï¦ npæ·DášÂ¥›>ö7>gâNLBS¯­,I„kv'YêLÌù9mø Ê층Ÿ5EËXŽkpÌtÿ…»ü pÙüë²áJÐwT~ÿéEçï–ßx1}p· ¡¶q2‡fmßENõX©ÆåW2ÜVæé«yöTw›Ô¦Qƒ B¥¶™§¾qÄŠjÅd¨ìqpèvóO7…`•Â(¦”žHëê­©@Pä·J1h8JˆKñöì«2êzºRBU=«™S,¦•.~/o×O˜‰âá²B}bJÇõ$¹€(s2͘9;s\3rlôıﰊ<¢\qá,úqû‹hJ—Ûs¦"ñK¬\iŸ”Zð‡öÊïzW3N”Ц€Kª3 ˜¤ÔJ4Ÿb,»uN}¢Ç¸ô. †¤ž°zŒWozåh]¥¬A%a¥\I@Ý ¿ ô¼‰GQ@†"ÿõáË'3^?Žãà¼s“ôDýˆ¾=?O5€Y ˆÍ<@°û½÷–ØÃbس7˜:àá½· v¼ì?wŸO·é½1`ïXLíæDóèZ²çýÀ`kMgO§Þ;ן»î|"ïAd œŸä ØÈcÀlا‘¾“ÝOëÆqšNìÙ³§®³ ffkŒgæÑ{ÏÜ[CÆyf ˜ôê``É’½½{t£éÏŽðõÕ£ï .ð̶뺇ÞvÝ$ÊduñÌ3xÆÁw}ç'φÙZcºŽ<{Ï<:kÍ0x€íùäﻎÎyï= ƒ†Óã¹{un.ϯtê ˆƒñ“ˆÿ88ç=;OÞO©7S» ¬ù½èÎ'Ó÷¦ï``;kN§¿}¢µÏxr̼³­îXûMXŠëfvÓG˜Õ ¸Èd1Eÿ!ÿRK¯8ðW¤rqg0;_‡•ùžÈTW:Áz`eµ0:Y°Žm¯ÇH´Z‚Ø•³fÞ£C*º“Ô\žóH#Ôáâx&¨z¬qB°xù€œäž#3ÅɼååB—`Åjª 8Sð“kw”ŒdóEL,ˆ·Mäoɲ™ àS’ª¹.ñ¯‘£Y¥;MŽ’y9¼ 攓ÎÙ„ižª<ñFsS#r]QºOˆÊ}ú1®œË§0Š ëlzæ"¶ÑÍ<əͰ¶/:qsêV#“~Ýî/«ˆ3ä‚–ì]Mh9Ã}£ø?¶Ñ*ìs\âYUú?V7Z4\Ö, <_$јÁ*Á‘ºÉe_“ÎP*¡}pJÂÈ,$Z;lάMôùœ¤.\\â’(ÄfίPÍin„Äf˜`#6D>^Ú‚“⚥6T0´PîÏî˜C຋¤Î sáªi K™_YIãVí¯òcÏe"A·JÎuóºVÔð@IûÜÉÏ™bFv/P•ß²‡¦€e){£ ¼Ð³ŠÆS{˜ÈMYq2ß8É“–7P¬zXë‹w;èìí×­^ÝMÀÚ31k@xBrÞHWí§$oyï­µôëõëõó¿îËÀ¼mÉúاÁ´(±öLDžüFR ŽaÈZw¥_{øüažÿøê‡Á]FïÜ$àÃÞ?ÑÃ_/߸÷Æomê𪠌ndçŒéˆà¼g?ú‘¼ç©éuœçIžˆ¼sòb˜iô¾3€™±šIǘˆlgÎæ4ý'@11EÇÃ13“í¬1Ý0 ¶0 Ð0zrÎy¡Ñ±ƒ1DÆZ?:õvt@ãåryyefCæõå•=“côf´ÖÌ:8Î8ñÄÎu]7™\0νוּ†˜{Ф% kJD q­…y艈œ÷ÎÛ¾Ñ8ŒÆ1ºÃ8‚itCgý„âÓ æ0ýè à‡ÑO2K£cï'ÄÆÚß>|´}gzûôåÃ{`?-$Õ€D]ƒy. Ä-»<_—wˤfsžˆ `;ë™2†ˆÙ{oŒéºÎ{?¹öÞ]?Œ¦ï–†[¶½9=>’±#ç ùÁ3¼§Ñ9Ø®›ðqƒ`öÌžçÎÀ˜ÙEœ`K§rcºÙŠo™† ‘F&ržypƒg&ÇцGÇÞ“¾líÉXÓ÷Üuݹ;OÝùôøù!:6€ìÒòo“VYš%gÆ-­µ˜•$©‹ƒÒ„MÇgTZ­•3ÍA°GN㎦ª' g%<Á–®óÙ±ü ƒ»â~ƼÕ>kÇñèp^¯…5b²ª®&Õ8äà†e竆!7«3‚ÌÚ•6«6éâcjÊÆ¤_)5 ßÂUi̹ЕJWÌLÛrvá1oaµ¶¼=ذҤ zë·Jª­0s›e=‘ìFiJ—uà|Y7Å4õ˜!÷J\æû_“ÆèAÚš+¬xâ®,!ùDã©›f‰È­#fl4þ''§rßö•÷IÊåVE¥Þ×^ˆ>ØIAB“Z„ýžu¼@Óȧ€Æ—-Ÿž` ÅÌHØû˜‚-—°Ä^š/[òLÂlU3™ _½®Ti¶Í+‰ýÔwªj •À$ì»t+Ç#¾!WõeG"«·8yÉ&:gÇ׆¬’IY#pNä.Ž\.Hð¥W¤¡†kÐËE061óÆyª%"Ne?¨ÊŸuwõÚÂ6.ûD¹FAç@*»wJ$ß*â¤ÒX5G¬°­÷Ë6n¤Ý%C²¢Ž[µêwÇXë’ ù{’žu«ëwªž®,¢h90Y´°C€­%>¬péênºŒÅ$›Œ:ÃT·ÿZ'7üÄ¢ól‹`qbUãajÔ\‘šåç‚8µõ‡w†Õ•æ"ŠßÇucÖéŽåQXdðrÀÿWÚm d/”(nZQDiB)!¡ÿÅoP¡a$óµýG+Œ^$.Õ3¥ìêY^S Žè›uñî‰q׳©ø"ÖÂKkF–çÚ M/8ÄØ+•Sèÿ5ã‡,-~O„yX³D™.Š@ƒ_ÉuØ÷X(d#®¦¨àã7Ê«`J®˜‹x¥Eo!Š©ì$ã¬Â~‚lNÞÀi}/í‡F&õGjþ'0ÈuÑÆÍPq uº\ý_Sheer"8‡5k7Æk¬ÎNF>D„ÇÏŸ¦´åëþùúüâ.£÷žAŸ?~™>ÊO]ýÎOå–o—×eºû¤D3¢3‹]HD`¹ŒD»TQei—Ì H´§y³µóÕ˜i\O“‡­™/Ã9Êœ†¬¥‡SwêMgÉóðz7öÔYã÷“ªÛžœëA½`˜Ý8øp;ÓetÖ`f(ÌÇ`Bêœ÷AoVÑböÌìgfÿ:x‚󎘽g&8çLž@4z×°Æô½5ŸN¶ïûSgN=[<~þ`ûμJg‚B1Å,Ž5<·Uញ@ÞcÁrCö 0Ù„‡‚š&§´G\Âï·0.Â:!€%ƒXmCy›ñXëgåí²b¯%€Ø¨Ï£‘ % ªˆ0‰ª’÷q4‰$¬('½Ë¡U:÷_äõe25Ø j#ór©âËÿgƒ@ôŽ”Y;ŽÖ’j|↑p&NV{íQÊMœ< ñ/©$˜šÕd¯3¢xVSÊm¸=z¬$äõ>ÁJ^)Š‚ ²Ÿïº­]/v :¬VR¶9X+-«á)jµr g“¨];Ž™ƒSÈ O_EGÄZ•¨ðQ vÌ…“%ÂÃB ïY 0ÖÆ XÛ+34"™¨(Óº˼ 0&éNkÜ¥šMŽ—ª›-³+¸uo²ª¸’ã²ú”ˆJE­òpÓùäpÔ§ @·º\/6ìÅdê¿õ“‰Î杖œri3«Æ–«"¥¼SxîzPþp!äµÃÚB,¦»ÓUEu™Å¹ üÙÜwÿã‘dâV¯÷Aóa*(:áæ{ç×ë{¿q=Ð/~äFhÃx™¸ LeZ]^àӥ鼄·"2´qxÁøðûgX3¼^Ü0úÑ…ÎÀL/{ï==öó wd9™1³uò dÃDì™ ädoùºkŸù"+ Ia`š© 1EfcšjšÃZ&á!ï|à Ð<Á˜‰xúá,]ÀNI>u瞈,Ð{Ç0žš'–Æ9u¬;·r¡à“‘òÓCp“Ò ‹ó$ëÄÞ{ïýè½sS`Øyô<]§1øÔ=5ž™p:ºsg»¾ëû¿}œ&+Ó: —Ð-–¼¤ç˜É%]é! _€'IÿòÄŒuÂöÛŸ¨"0Ü脊L™´«ú«¸÷°¯‡HüÉ來Øýæ‹õvßHisÃ{ö’a@ÓÚ/®€‘FÈœ½ÔÞ#ÁØîky³Póròö<¬'ˆQ9ˆwÍ¥ zŠ¥½¸ÕœŒð?­#ž–Ĥ’þî¹7š«¶÷Ã(þ¡ü»ÉšßCÚ~Ã}Ž·ºHÌËUIî;Ï: tø;Æcq“ÐÁçüÎMÇ-:ÿÓÃe7‰®±òbJr¢èªRµ--X  œoçHnhƒêñïvTö'°A `æ«0Ү·PKg9¹)OGÓ‡®]Rü’¸î¿|äû6hq/â‚êmòñÕ$Uƒ¥ Ó϶2ÿ­z².@NxW”³½ä€‰iGn½±˜Ñ\uá€ÚF1åÞ®­,ÖË„ÎlSÜm¯§Ï ôüÇW7ŽbpOSjÇË€ÑOŒÍ"O©«Yû–Ö*;O£z3q4?Sšíã4m˜‚+ˆðç_Ì…°Ï®À<^@¦Y¾æ´×¢ÏŠFD¯0~±«SA!\Ë ‚±Ììܤöb/ðöSdêúwnAÿ½wnmR À ÏçGoÌùÜ£ï Ì$çÓûÇO˜ À›$*±¦QÉb|¦>´2¢óxj´|¢^n«Íh››™ ÿµÖ™¸àL°LNÎ? vJâªÎ äÖAÍDɳÒI†þ983O5KJ{Tbˆv]%¨Fbò¶*ôep4‹½U­îèVü•zn¶*êžô¶ØßÄ|ZÕ„3¦mìü#Š#eŒþðš>“ˆ¼x©A7LéKJA«&ã½ä†×v Š>‰ò©«ñ)xÉÀè&Ò•ßbPY(ß-¹Ô@$’)·ýÕ ÓØ®Û¾c×J2tU­…èèÜK¹ÅT+‰†S‘ aÅSYgÇV—YÑÓŒ‡‰Šßâµâ¾¶!`ë´j£.âÌ–^Úz¨¹IÓ©·ñêrdÜw [2_[Yþé#øVödo~åhó tR–¬k:GÇ÷V-Ÿ±:hˆì™ÊŸ_Û·ë/ÞÖÓ¡0í9ýZuÓR¬µR:SoS$SSàt/á*Ó"‰Î]£~TgWeâJ½ù[º¡Þ¢:£Ä´Fúæén˜èk@û>¶Ä·(é@Þ«½&æ¬ØŸw':߬–®üÀ°ßMd›÷‹o«î¬ýW¾<(¿.Œ@WviBoŠtD)bÐv”ÑêŠ-tÓ ƒ'ÈB¬3~ûÔRååKtÎI IÌkEø ,³ø§ ¡™=Ü ƒÙdsÓ\¾͸rO3?ÌAsÀÀ0_™©ÌkT´›5Ú°êÄ{ZÛy‰gqŒ1~I, ÀER”¼–@¸‘#¸•ý‚ŠÈ7ËÊÑ."5íçÊ]¤oƒ’ãË®žy‚BΜ$·ÊÔŽj馂êÎKÍ ƒ£‚G ®‘è5/ñf¤ÚYµY8C÷¸}ÉŠï‡Ìµc¡¨5ßÍq5ym&–DCDf}¨_øôÇÏÖ»›°zÏÌüí¿¦Â †r$#áŸÄᎠm0ˆnôa¤-¯ŒšÄgˆøÃÓGày©“ñ_/ß&i{3 ÜÇÅ€ žø¬÷oþpýPmÎåEl™=#€wfõ~z`ÆLꞺéé:ï=û¥0auì¼÷èïÙ{vscý§ó“=u¶ïlסŒúîñÓ‡u>CÒˆ‰]ÏÈê¦_•°b·³§Æ¢V ô?Õ˜#rµp5‘R‚.¹Ò™,~nU3 !êù•)CR±ˆ¦®h 1/ªe¼âó‘¢JÁËÎl‰æŸýgŠö ÿI‹7W™¹5õ¯ùLtx‚¢¦”šĬɞjwL¾ets¤Þà®j²Z÷OÒþ’ëŠ)§9f#ˆ ØOˆ‡Ø:|Š môUèâü„¤ª¢*BQbpqÔC1¼ÓaÐd?«møIK„ Ýr|æ{UH3 ³Fjçes¡ O&bÖRJ”qÐçÉ#™uÔš°ˆo–0»ŠÅ e8Tqý£=#DÉê )i⊥°³‘ÃÚKªÅz±<]Ý &±B p |W”GÕêl´NjXØ$£”&ÌWæM QÝ~õsTº°w%:_Q •Sê;\x7 TO„eµ<~ëw}É䚪’\Íßl’’ Òæbeñ¤w•ýzµ-zd&nY×ãúqMUŒœnÈøÁ‰8 µ¢$U‚ruªÑ[·õ,(>ì÷,,³6Oè{ÒÛZ Uâ Øš†E¢ªÕÚÖdw­Í08Ý•,£ÛhdÛã§œõf#/Ñ-®þd„ÀìóŸ_ýèüR=œjÎ97:vn®"?•èÃÃZþ|þ+/ì}hŽ\‹5,¿ÉÄïE»¡ õÞõÆð­_¡¬ÿW2B1 $t—™´å¸¦@c´×-âØý.¸jš‹/í¢EÞ ç¨Ï+¾>ÜODV}­S¹Í š.É"§µ`\fü¤ €ª% #Ž*•g߀Ûa»Ý ¡„Б!y3ï.£ŠÚJøÐþðB^öcÚ¡r|¿KŠqÞu^v‰ƒ—f¥Þ/«R÷ ÁkŽØõÇÿÈ|£«5'Ðÿ÷رIi ‡ïäX|õ–zM?˜è|Ûï¶0cnÅØÄ|n½óW·ãÁaý;%âI:¾*6yAÚLtk‹Aò-:iÛw¨VÖ–Ø%€x¾J=ÿÒ'¾0å˜~Yþle¤‹,q¨¨…{XÉKŽWpÿX×{,¶~ÌuãU¸n.L¥Þ#gtJ”²ñCÁ(nRˆÚ®¶ÆÞG ×èŒkͶy'à7à*jUÞ˜š”vîd„’Í;<-ˆˆ¦VwNsQzþ㫟Çá{çýè¦)ÄASåÃÓÇYÈšý׿`Ö)oi&èÿ‰;&úê.ñ9cfþøðAfRð1ÖtÖž:c­íìçkw›©?áóŠXÎ."(Ya9D`DoçJPôÚ>Æ¢FÑKïÆ¼?‹¼‚ ¹kˆ¤ì*ºü3íAj‘4àBùöpò¶Å˜N,«ÙLØø®+(½ðÈ×Úó‘t¾«R‚¦4 ÌȦ©£õ3w&Ô0Æ-GL>~—1ð^N¦DÿG2’2À=~eÓæÝñõ˜dúC,ƒ ·Yñºƒ-ª‡œ ‚Õ ¹³—ñŒ¹×®k©kÝ ÝÅšpFÃÖ½] ÅÐ ±;³îqqX*!E K¼ÁêÞºeÞ(Bb;øÚ°1Rµåí7W¶M}cK×H»èA{ð©gY€!kA›÷x+³£’no…ûTÒäç…ÛîfŽÍëŒa¹JÆä†(Ò^D¸Òèë¡à½w¬ZþÎÒŒÙÃ=)F^¹¿G;וŸ_zDõ´ñ¨–‹Ê˜øè'Ýö]s¾ò^šݦ1µ#ïJtž¶ú6›c*”Üú†c« ‘Òœ§Å‡ ³+Wá&ƒ¸6cøð¾¶2\¹ æ~bNä{™¨'úµq‡ÈºÀÕ01·ûî&3Ø©²êMÕÔ2m¼¼…kQlqõIdû”¹Ø!y­ Jø€Ë„Kpó,ÿ¯‘Ö³\E‚ D²òï‘ãUåEŠ5¢Ò§?÷ª˜ÈOoRr »ÑJ¦Ey²š¥‚}dåÆ9Ö±‘Û Ú-ÐUµ ×¼nñ¸U/Îbh©ª>n. µõ5s5,’Q«ñàÐt¼ÏÂ*¼û-±‚¼©Ó¡ªÜ´°ñÌÒ.‰l­€Ó¹ÚŒhR”Å 1XYÔ­¸þü]¹Ð<«à4‘á8ÚcȾËl ¢ðzþã«wžÙ³óãà¼sÓÞõìÉó‡…8¾'fò4MÜeÇä=Çsq-Ô§a)Ä;óYÒG*È›ùÄØiÈ1ƒè㹟ÏW² 0]×u}g:ÛõöéóG¿Ê+5DÅá¨!%pƳ$’™éº„YA‰S-)Lö‘¡xù\Ï{Z)MÈ‘gäYõ$‹‚*”I4-ßYpN@ÈU#©€H%ÚIH*hS  ¨3(ÔÓì窄ºªLÉj«lqx¼A@QœN½:QÐÖkVÿzPo”è*JxI¢6›Sžs{(ùGÛ©“.÷ ñóƒŠGàr»@Dnù+"r9œƒÂ[Ê9ÓŸ àsô'€¥9@õŒëéw©™ï} NÂ|qp|ì°j „kÑ(]^8È’8ÆŠ¡I-j b1 žÉÅ3›àtêQkëïz¯û^!=pÁ Fùø„­W®þf˜­‰Ã b¿hÕ—ƒv`Ös~;ÖÜ.»—úr"DŠ@)ªSÁ4J^THnè±¢¦¶Šrˆ§dÑ™F, "¡Â‰kJöŠ—­˜$º‰ô‡¨,'§ŒËŒ’[È3Ð$Ò¾…MSÒ«¼U޳°7ìnq† Á°£œ‘Ôš«ªo(Ýojµ’T¡PßhÙ'yÖ\.$F%yOØh!'ኀu¾ÖÙé ¡Tš,MiX‹bµdiG#2 Xj’ˆÕÊ5¡Mð´ÄAOªÜ ÛCÚ¶©ÈÖ뱂Ìv°VAú bE S)h.³Ï˜U6}ëf`¹iÁ~&ÑùJi¤´ˆ-@õ‡_zÂaHÐ :¡ ^»¾6ó–•!.[ûúënx XÌ3 ÅÑp°“¯•=ú£3ô‚z8'Z˜¸ÄÚ,î_8 Ž@%8X„;â*PíbHT)AA%ˆªôîzÌxç!T¼BuÏÅÁÇ¡¯•¾÷ÖŠ¥ÉÀ>¨˜¾Ý©ºŽGIàhŒÙÍìæÍˆ„£zic=rS@1–†æÈÎE=à‰´.XuçdˆóÔH9 ÷†‰"ç®vÓœáñóSøáËŸ_Ý蘽wÞ Ž½ó> !^„p Á0ØPžçÆ%‰ŽH*Ï "2ñ(€ë›éf™úúI(åƒ Lê¿|X%ŽW1Ðé+ÓÕ”þp^pÐÍŽêÙ–Ì #&ÃLHÌZŠ˜@dBÍÁ¬æÕ,ßÉGÊp–ýf¡ø·HP|QÁx§Ë  à³¶š»/AíµŠõwšª jo èßàÙ"¯Þí ‘¯¹» ¾L(©äˆÆ7šU2‡V“åƒP0÷¸µ¶Eùª€6€x T j2tGɯ\Ìͤ¥‚òÄQ¿öªŒqøªÕdÑJ¦0Áƙ٤w4šâ’‘E‚kµ€4åò0kcÜöðæ³4îôª^ëþ´|tظjí=‹:"ySX×y.¹¸”Yk)«ãªÕ/åkõÊýÛè¸Ò;cìªu¶)~7@YÝ]@ë{1è]ŠÎÓ~øþØUÕgíü _‡!î®Ä3eS{·lñÚE&ô $)7ØúDš25?„îÒ^T…6ã¡Uþ›„ئh³fÊæeîˆ|’¥|²Ùa™æŒXùþ†é¸á«ÂÓ¼3úk¼#ªK#ù\¡Lc_nèWZ‡‹(Û1Ì(B¢¼[<‘òº™->$Ýê6 ¹IˆÜˆûÄt ³/«o/5üñ¦¹I£Ã¤Ä”ŒÜ\GÅûá:[/ùßþ˜§,JG¼ yE\kÖîDSʉƒ(§uS{ÿ¼ Ó€I3÷/k>=©*óAV¥ë¥C§•FÏLë âµÛ]::Á`À*{Iõéîj|ÑùÀÑþØkö®ÞÊi˱`í¯2ì;äZçÑ œàÑ{',µ±Þ{L¢2jž[Œcsà±+Ý5­$²—OxôíŒïHs‹ØtÒ(ª^~ËŒ.9haLýÕ$ñeÓ£€¤*[¥ð¡É7±O,¤üއd3ãCöaï€kÐÍ“º¹’x¾Ø%þÏ7Ú™7ßð»ÖWëþ^Õ&MÁ|Ïï­ã•‚Ói¡ûÜùb”ót]z×Ìó¸÷ãÑÚuÀï9­®è“(x‡=¢7¶À<+º½cXøo(:ÿ}ž³Ø”Y|¤¥ùí›6„ LˆÒ0dõ·ò‹¡í#•K!\aQPGy;Iľätœyð©Q×¢ÖÒ \!¼ñD’'}"‡¤*t³¸=–Y$T¦*@¦gÎRÆîÊÓUüŵƒ™ì9‡ØZ¯ ŒT/d :á?ZÄ»6öqâ3——†Y僑¦Ý鯡ðð[¤µ‚Õ^X$y.×c ]…‰4…èÒÜÙI¬0†£B<˜6yN µÀv™¹wVò˜¿eì_©R1`@éùoš…ÊØ¡’XM8(“£ÂX£`½iKŒ«Ô IÓ«à$ôӉΫ“]Ž]m:o‘«¢COé¶ó¶c„TÅK¯è3c¢+¼Ú –J?ÑUÊMPe´—^ÀáýD·¯Ï­Žž+DÓq™KhZ…X…àÄ& ö$Q’Ž¿ýXå7D@eìk~¬ ÖÌÄ Ò‰Æ;ÇxuÅË êëá¯úgÞ¾»é•ØaT£ó¤­ÞªyJ¾”‰ã0k³Wå~ÇçÞ €’Õ¦­©€EqºF#uD艣Â(dˆ†(³ŸÇTÌbÉqWˆÅçÐÍ:¸Q 4Zi)¦Ñ¦€*í™'3—°€~hgÑèH9a$Œ5ŸÏ‰Í‰ëÑ‹²) ,â´\ÈŒÇ}È‹êZP ”h¼( a±ÛHºØ’Äc&ÑX—k¾Ä¹ß¤doÉЇ«;wö‡²›®YwaX6žˆNáÑÂE~Ç·Û­p‚íQ¬¥e¿ÂÞ¶UVêÎÍ¢I‘rYd®öÀÉ$†ö•Ý1è¨üüKJ¾$Ú½1×ç÷{UëIGæ&ÎWÖ,g_ÜÔÅJ׊¾ðö&¿Óì8Z €+÷ÀßlLEãòA!çöîõú…Fiœ„ÖJ% qvYì èô¿ùE7f„Ñ ‡¢ôûõ™î…¢’ªXn]5,ŽÍ:Ý Ѽkø¹úh Nt[DJÅ"ÝüÌtM»wBâZígwzXˆéí_ùعöV¶]çIÎq€jnoÀØw;eßš†pý>ùŠÎßêÛÛ!¦ÔЯ×úºÕ €ñ©‹ÿxy?I-˜®Ã|ûÂæ_Üà{€,I»gštn±öØ7.FϬä44¸ïú‘k1]+es‹ó¥JÏÝ'mÛˆŠ3 I]â¶ÚIû…–e.‰ªVeýh'é6jròæ¾¢uôW¢°ß"¾Fv§8 ßý«“S~‚­Â׬ԶK\-uoXcnþN×ègÚŸolîàt¢l!Ô+.-ƒÜ£úRæ¸)×þˆºEg„•™{âÂ՗#Í—_œ›GWéÿLi—õ-’ XJ¯’4$Þ‰Þ¤ –q¸ª—„²³™©äÜÊL°Jè–þízgL²™T¼9ª;ÿ§G¦$Ù 1—P³ðHH}‚²^/ ôë›X¼wÇ(¼Xx*•ª”å+û¾Èˆ\4¾§/¿YReYŽB%Én ÓeÀéVMØ bj9É1j<5c3âð‡Nf"µGGʸnØÙ®z*”Ò½óôÕõ·**=õAöT ,—ýœ7J .Ô¨±š4X}ÝóÙ‹L׬_O‘‚Kf¢_ÐþvKÎÍþS†©µW½~QqP>¥¹ùW@C\j#EPæO¶¼ð*ždoŠÒƈ…V‘[¼ÀV+´Œ‹¿àLvÌLx8X™÷¼@XÄá˜$‡ Ó*úd~q^kþ+]Dfe]ËÃß´Ñ/Ñ#åðÛ”h°‰áÔѯ© ÍZYXUðÕRíGð`É©2Icˆ\™}·3´•Žb «· \Œ&WTq¦9S.¸¦’Nk‡ ™‚ABV?Jø,,Fn£]¹®Ø“K匥‡“÷=5*Ñ• ú¬² êŠy´%»QŠ]s—”Ô!Té ݯ"ñ!P¿.þ_ð´Ó‚£?öòÜnQw86¥@Þ–®h–åqi6.³´µÚ…S²ˆ%ŸÁ†øpZÄsfHî˜ß‹ïjR‘ 8¯¨uF4¬ÚÈa±¤Ï!Ø¿pM:)J—–Ò1Efïfxr¤Z@$Ï#9›*‚Ñ™]¦åK•0Ö¦’Ÿ \G1ê3·v!žyô®5b¥zW*^(‘blÈGW|PÈ&¥eZ7Ñ8=H¨ÆºA8 ²€wîSíÏíá,c’¦ƒ7EÀÔ[ÙäÛ$*4#j"SÛ!GrÁópª½YŠ*öP]âÆó’÷³ÆO2@^4])(.©²É ¦{#­ªL'Ž$õ2á;ÚCÏXÍ:§ñºaa¬ÔÉp¬~Í?‘è¿+‰ï†‡6u»Mø{{Þ(ãâ÷zl!¿^íù­ÊزìæÎ<Ü÷p“ «`Ït%HÍ¥àEý—ˆ'kfþND(W[¨ÔîEÅ9“ºž³å£KJZÀíi@³²=7éGd7B'g…+Ýy~Éy%@›ïÈshèuÕúeæQ‹ÕRðÚWÊcw•Ó•k° ¦Ðªï¬ T6y¢¨KBåÂ7E̹ ¯£€£†ÙYÐÇ3Ã3A¤¹i7™!œÛ£ªÎÕ|HÃQU‰¬¥g8S¡9Ú3<Ýàº1#ú+R€ø+ìªl«¢[¥ßJ:†®\ºÔ„¢›Ð±óÙ\û˜s·‘ ;È¿BÄç)u¦(g‡•œꌾZª¨uç¨Í€Ô8úkÍßKF@t×Ç]Ýš0ÂýOV"o6OÝ:37è¦Išì‘ÊŽ%·5Ƥ‚·jãI5Š%øÎ§Qx°ÌX|¼ZêIoa=г0ÛªÏ6{e©7xÖѪÑ~¥Ò uá4:mM© ¼Q·g$FF¯¿”±:b6b2d"›Á7€ê8¥¢ «CݱnÖìR‹ÝhÊC)b,ŠèHöI HÒWS†2'f¡¨€²Þþùp¡ð|¢¸Hµ½ÕZIÎB¤KJwTÐaÈ]yÜD‰ds#­‹Ñµ‹{V˜g»b§kP-µ^ú;@çiÚ•²ÑÐþÀ«è¢šÔ©›êzŒ ¿ëœÚR9ÔirQ‰ab5Jᅳq,: T®k2§·@ÊšŸF ŠäºÊ|Sd 5þD²Ó*üààºC@À Ňi›ýÙÂÆ"e"ƒjdñk?iœ,”sØãÔ·D.9¼™+Wêú6ä³ÒHÒaKµ×ܾ뤹Ufc•ªmNÛMHo@ËâD"Æ)5Jô‹ºùÅç<ã†tʧ NAp•ó$%ôˆlV·DM ¾Ê펞Ê"%³/,ä¿%¡M°öAqKµQ1¯‚A‘̵b%}-f ÝÍÀV?Š5×û¾ðf*Ù¢ÝÄÑ#È~.zF[b"Ý‘ærŒc´6¥ã–°@ÊÈkÑùë·Šz/E¸!`EªGLÝ•s·W"ôJ*¬‰@Vé«y‘ /¡ÖLÜ¥Ž,{Kd¾¹è³Bž È6OV…;ÅÅÿÔÞ̹Q.qÜ™)éXé,É9VN©I t’Ês¶¹sô¿ŒÜeÅåž–ªD‚ãL±ˆ¢Z/ÊFÜ´¡7ž‚®‹œ‹ã§j !UüO7PüA lH¹ùú¤}2[å.9ú#{&xŸO˜h#$òβ!´ó£ÊEaÐÁL¹9BŸÏœÁ {½!¦âln+ÓVMTë“­ª9SYÏQ?ìäöq°ÏI¡W#ŸB•Ô*vC{[F6v S2‘UI³g ’ ׺ê¬rAë}§š©9\3¤ )ŸÇoˆ©6«rÅb >¶˜áÌi%êqÝ0¸]ÔòËDœd:L úSž9¨·-—ŒyDxÎÞ2ûËK™/ÕŠå3#ÑÙV7ëº'ãÇŒ`\w˜ˆBhŽxò%§5£ÍÉ4 ƒÔŠmZia’Õe$UŠF™D–¨[ª•Mb¨ÞxIT4èQ«qÔ¦œÂlT¬óme–2˜i³¶±+¿bæ©ý_M+CtÔo¿² csÑ ˜ôÖ¡pVÕ'ÒÓ°^N1”·Í9ó†  ,dM­ž½TbŒ6L¶ò4Üb(K‹§šb%*Ð$ËȼVã“ÒÎlwB‘ –¢ò ázM.?•‰°C#@MžsÜ%„¥’^Ó6kÓkRFâiÆ–9&:dM'»à¨ µÀ<öÊ@ îtT÷vm+ms[ðP&%•l§m*•ˬì1U ³XÅLVE¬3)¿âpiN@ȶväYõœÍCìw]J…EÖL @‘Î.*IwVÙEîÉ…¾¦Ž¸Þ+]m µ˜ûú’}˹Y¥°Æͨ–¿j?Œ•A@§ªNZÄ‚U¥†«­t6lW¥ùç¿3¥¬´ ꬬȂ—çÑþį͵è~ÊÛn?›'¼oùÜ+ 1~1\¿ÇŽY½ù0g±rŸ·Ì¿ñÎ;ý% Qx>Þû›Í’úõ*䌫ã^§JòBáIÚ&°;H½‡™ÚQîÛðíe´…ÓpR/vóƒ°…aÖ¯fêÉbb"/vªŸ'ïL5kï®×w/‹Ái;šÜþ뵦ûûó!ÆÈÏ»$>ùVŽ÷G]KIz0Æìò23ÆÐŽœo^ç/ãàÈ&ÑÕ:lcöüCµm@…Ú¦’&‹úatu¦±ÊL¤†ÑÇWÇÈ™-jº®¿X%•9c£f£V!Oˆ[›OŒ’ùAûí­gq„!ÄèÜÔŒûDÙ_»üâ©YuÐlPEÔôû/·&=QáxÆÇM…I†BÛåÜÓ=yk©îΑÉÊýãúh _…s¸øIð)¦ÁH:ËCsF¬¾šwš†¶A ë#ù0’d€Ä—i¿ v޵+ĬØEñG2qŠM–2e•ó5«úÄ´ù=ð`ãqnœßµË`Š~Þ°é׸êJ4d•\ŠØüÅß­Ìâ+É5äs㩌;WhòWf°¥NçJtUŽ·<‹¡å›—…µ”ÑcÚ´˜nný2Š ”j:”NE Nø«è\©üI§~T}nj.HBBÙQа‘I·¢#dÎþF$ÃÂ(%Ñ`8´ç,ÁäÂZÑ7ã=•õ!K Dùê—FØ`h³táPÚW’ÕDYyÓ7MýîÅÖävÔÚl—}SÐÎ@œrÒßâ.Úìc¢(õ9 >€¤¤¼º’q()6Êä¶màÌ#žº©*" czEᫌ·«¦ éV\e9wŽ2nl©® ;‹éu’0ÑFͦG¸rJydW¦wê¨Êº¥Ç¥‘Ehï=ÉÞ«0¦í#8_À‚ š\Gh#«‹Ç¼ñARÖ\¹J4r*nª{Ó:[þ‡¿ã® iVD/Sò wÊ´ ynëÊB{[uU!Ç]á}=y¬ û4H߯€Y;€‘Ù•hŸ38ž“è<¦ Ͳ žšX\qÁy“¹‹éBfȪúhÒp.Ï4Q$÷,×kôÉåN+Œ$UµBøžÕ-sUÂe`#£1•UDnbÁ Þ„þå%ˆ\#1&êÅx.9Bª¬y¬à| öQ€ C!г@k¡$ÑJŒƒÊŠ@¿$j£š3ï£Y]aÖÅ·³ô¨¥ É-Tp(fµtB›!õ±X*¿Þ¡æV%¹þºN\ãWk„qh™dip#6ú¼ÝÁ%K¹Ÿ‹Üï·âa”D<4UÖ,e¥Ä+©,+Îäz«¸¤C`®zÕ”CÈNf¬ÎþN@¤i^I€’âe*ÉCAhz.ÄXÈâeˆ ³g6̬È详œKk:ùqFDJüèìó ûød'Æ)ÑêU=E¨ˆÇ^ÈLÕ5] ¶buâhဓYÅ¥¦³–9@¥q‘—ˆnLH.Æ"øjf"í• ¡FßµÔ¶s]ªJ‚­ZCTPœ?lœ—§–íHnº’MÌÙ°“Før+pÐqçÐX2ãkyä ÷FsQ¢HRgKh°*b:ïH­F2GE²·Òh?ÖæTFÝ,õª´¹AÄÁÜà7÷Êž©Ë:W SãjÒ`$g4žn³–‚ç¢UÓ2rübÖX,;Æ©%*is­m^¼æ…yíú+ØDªóƒx¯-†ŽnþäŒ'P(æ÷!Ér# òOÕÒ´T­ÝÿqÎ¥µHËkilüëÞG,S”˜·#G›v¾Zèºù&|µ÷‡?mCé®ü4¤þ Ç™nB–ÿæ¤ ­Ô{T+™9×ÿ›82â{˜÷[ ¤Sª¸xnAB<¶Yªi¢LCÓ@ðÄMsI‚l¯HwŠXrYTw¯u•éö02éáÓì™ÆS³Î/Ô‘šŠ$ÎF\¤Ýc„$ŠLjèR.Ua„ü33Ÿ^ªýï‚}µÅýˆÎW=r øÞ´ BLœ4ÚVÓ¹wÅhÄÄnຒ7{mAQ‰ å½7¤× uVÉ9„­¸“+c„ëÑ¡h€š¶7cCo0êQé÷£“þÈEþ!.ïë­>à#;.ão¾I¼]´ÞÚÜâ·32; PÜ=7z\é4˜V.Ù³‡7ÓÎ>'® ö™ú( ¿×A`Ž` =ž¥4íœfÀÎë§0õ»cÑ<Ùn‰ãK“cÚÅ®‡É4¼¯ñH/T1mî”R^=fâëñùÕiê˜T½xPìq¹Û‘aN?þîâ=!UºpëäÞÏm¹XhšÜC¡óWÀ[ÂûšlæÎ4ºN"œ››snçÍß•¸TôGßó·©d|ÿ»Øp{S$önÂT¦¿¸÷»Ø~bnCеΓ{ƒ­¢’P)OÎã·]Ó[Ofº–8œw¦ßQcÿ2$Tø†”ˆšs%Cg꺒Žskžê‘öÕö2WuÂ¥ãå—?]y-O€þ«Ñ,/D·µáh¡J8I3MãI˜s¯âÜ¼ÆØDtŠî |BcöB†®iCÈéÇùü½Üp¼‘y¿fQ/Häyï)ä7³¿œVIÅ(Œ˜~8é8Óþi~{©|ˆÝ¡¬=ÙçÍp—"ÿz–î¶3ÅI¡0—tŸõ*!}M,hs%TãpR;³)¼¥~jý´öþ£XΉ‚ž=ûµÝÐÏŒ¥W¼i½ †´Ð˜;½ ö&–!BØ%Üw‹mxW€Š“wÆvÞûÉU´€b{OK §!=Lt³jäÍ»>ï‡âlÔtü6£—ö@ÞªM`P¹¼˜œ¥×±bÏbû"mŸ5°ÝU+ÌÞ¯<´ë:†Z"k8|‚‡"7Iº5à8RÞúNf°Þˆ§;_ßÊdFİ}AšÚÅ,g®fK;ÿo÷”åÜBˆ‰Ì•x²%E‘J=ŠÌ¥ôâÍý¦Åíä–»ìÌCÞvŸ¼îëJ Ëéõ,,tŸ«ätV³ EaÉ8èÃ5†-æØôHSà‹–y#s´íÎC˦$ЍÑM<8eâɧâú6[Žx?’Ôî7ew|žô´4R”¤QhŠã+Šgi[Qãß{Ï¿¡èüwCrn®à½eÃ’ˆÙTâᜱ  {C•”ŸŸèX´HÁ§Ë‘¾¡O°Ó²k%©Ï[ÚÛ4Û׳ö¿ÀDÑæH ("KXøè€z<*m\X&u9ã )7@E(¹Ú´ ) ßÌYš„†ßMçh Óá#Bm3žX "ÃBOÁ¸®c6±ÈU@‡˜â4Óø^´FÓ—LCöÄŠçE (4æ½EÁâ$>pÆH,ÕôÏ‚µD鉅Z9ez‹O •(ÿªÅ)ùÕ,4¿žÝ±ŽŸš°Šª~[N ÜüÍщüöcÅÃV¶\¦CU÷ª“XK¤­ÄiQ(dÚ¤™8lägP‹««º´ˆÀqNrDµ¨¤Rê­jPAE.]¾dOFšÜ˜ey(ñ pêÓÍŒ0v·R½ ³ èB"¥'ˤb®Éú€3Í¡ù/!dÊ¢»H„.„¹ãD‚ òØzöÓáƒW$m-ФØ0bŒ@ Fs¶²ku°°ÞÛ=ÈR7Ñ Ìk‰Q¿hÃõR2_˜låHœ²"•F¤áZe“ò˜Âqö„5»õ<³ ¼ü‘4j*O‡ÌÝ¡å®Ko3cB ƒÚ´2W.¤‚_Ä,”ÊÐ’ˆæRˆÙœJ¨›qª6mÔ•Fsï–D »2. $ŠKÁæS|%™:?…»Ehµ "ÌB0®ôÄÄx yÐsb>ïL¡+8‹æL‹5[UM«{Äñy<6ɘ¬â56˜ÌXÉ€„âVªè03L9ë²èþdëO¹æIÙŠJüâJx‘ A—T|'9€Ìþ?~5?ç2 JUk¢œÊ–Ì…£u˜ªO¤ŠÈÏOÇÍåó™ÄŠ @ÉC>Ä+a}l‘nrJJ(ÅPÑd ‰ø92Áp]T­mÞ,×Tž’çJ¼”¯+æºÍ_´Ê%!™ê1Sœ¢)65,µ:ú*·XBo7ôTäÅP/ƒ ÓÈSd* ¦¨h ²›¯D›²$ÑWbÜòPD)"öå.Ÿ $Zª¨vLõò›è?Q6·1>7ªzDÒ7ãèšíj<°y{u.þ7}ê€~)ÎÉñм¦ž'nyò™Ã¬õv³A;±öwoì¢Ø»–"ºÔy…ñ9æFÛåº[UDöV%KS¦®¼0ýb@$¬Úºôûš¯AÃ&Æ 6•À‹¶Åxën¢T˜Ý“îÕx÷6”7;o>UÝ(ìh’ÚÆfÚܹ, %ÖÙÜUÉ}mFx2P å‡úXªØEßs~ì³AR¦ã꯾¡´Ù}n·5ŽTT¨ß”pƒ»¼êòOyC€¦«VdÐMÕärµúÂóAñG¼y›\ûœ|7"ýužQPe±8P'2š¡dh{²U…·ê‡¡ÄIûéØ;q—±•1´ZØcàtæ÷ÏhŒ*Rží¹_=GñÀþÙÍàˆ/Í#Èñ£*H ýöCWí]§®l-²ÁBÉ€XÒ´Œß•â–žóßÇj9üUú!”J € t§cuà{=³ûUbÈ”¥çê°#ˆ}šù T{8&ƒÝpÛ=_ŠŽnȸùÕ¶ÄÌ[=Èô®í(Üfãcêm¯ÆnÍø%:ÿ¶Á‰ìÐ KeöÕ{¸þ{_&îXtŽèö|íè‰Û4$¿€´¡r9^°ïàð= aßg›Æ)Vñî”!‰EÈàêhlA}Ö TœhçÉ-íVr™ŠÜˆ•äÞ¢(ûsÜYkcÇ6p±ð¶ý{÷ŽÆ¨2›¬0±mR=Ù£«‘¶{ø›Í¯Ûån+ j‹ÙÂ4LU€8à}£ZwÀ²'á¹&ß@$@¼m-ÝbRÅ7¿x-4˜¶™Ñ0“¨PýÔ¬²8"å½µ¡¥¨2 ]¯r-wÌÜàPka} ±÷ðñ®Thì¸ß;m•J •lR ýí“âDèáõÞÚ´–7ìÓ9Ö…Ô˜¨×¬!fTpU ¸Ok†ÆÌD õ +Ÿ£ÌT‡¬{òû<‹ejo8ƒÅ¹½Tqïý´o À±6—`¬GŠî;¢2b·4aò&»½¤g"i$„mT¥äÛÌãîø·)ûzû„Sò5ó²OµpÛLc°ùý#ìoS¹Ÿ*Ý"-[6|®lž‹ºp‰~Dï~eóÒá•k*EÒJ¹áÍŸÉ&!r÷ЂÐß­†Ä,4ÙýëÖH¢\fn)@n;ÅÖ@› H²¤[l’Ÿ\tþHí¦÷þÉ4ß›|«G½Éú-ñÌòÚÕž¡Lõºy{{ŸWu®4¸€ +^”™¥k tqÚb‰²PÁcïwL,¬ˆú8¶Ûȃ&’»‰ gõŠÕáÕ|Oˆ¬\²Ìy2QtE¨yd3Es´ÆfºÀzÛÿÖPà’Êí"¶‘ö°f’XÑ÷Kø: &¦:ŠF¤ÍYÎc’ EÞV pJå3ÚÖJoÂ.›…D‰7ü|¡hR‰¹Æ‘Úʺªb¾a)+Vtµ–^q¨•$¶ò“<Ë­ˆ0nžèm‡Ü•ªˆ‰\»]Þ±Â7d¡ì˜/±8X¹ø#°­“Ÿ"å1)|BA¥H?Fþ-—cË™\<7³/09­"0ÑÈôHC‹N ¸h3¡ ` Ü2)j3]—Îð]B=iÔSiq6ç:ALðÏÙUѨßEá b†œ4>+Ó6!Ë‘¯È·Ì i³³^]gð^B fxÑŒÌ8áákæwPœ[¥Ûx~äÕáô’–9fEd59÷Wò£ÑfŠ•¹¸P¦‚²„,ÉÐ×Aª,²Žý/ÿ[ò´¡6)k¹q^Ï ´Á­E{•N5ŒAŠ¢#ÈÍZÉ`RFÉ?<±6‡à*UÑ€I%k_w"ð•ä°ºR¹ÉÓ+-\c[ÒLß&°2w©SY{±ÊÒË×,³˜äKÛØ9\jXh‚Ìì„Dà=DšeLc•6M:xSYž2<Õ¨*·HZŸ`ÚA –^wÑIƒl!CÉhÂ5´höHñr!OIãÑG”:^äΙ‘Ô` E·¯J~a*eÌA­ ymœ!SÉï«Î ‡º6ôܳþÞsVÈÕÀ£<_² ¢;ŠŠ:G«F)KJÖ.¬B{rüÜ©Ú&¥±a•› ‚OâL8Ó.l2c± ð€h-XDE½*…É› Wë4o¤ °’N½ªdÔ¡¹¼’/Sµ€’œBIΠ:i¦ré¹8£am6MꬓܿbK(s]g £˜ñÍ4 äÚáäj–º§:‚|Â]W˜ô%5¹g6LùLVo¥h} ý[ˆÎ§·¶èâîzÁ¹º^ÞWRùL®¢sÍÀÛW#ýÖÕ)HNAùCuʺ¿‰)U|› E •Ã&Až"à@ý­ºe¿?à&•œíEÛtÀ+ U·£­^Ê,Ž¡ Þ¢›ÀR´§¢fl¤ˆ8”Ïe{h{ª:² kýveRÞˆÁ¢ë9tUíì¼{÷_¨ÎOMÑ÷FTõì«c½•}Ùoèb‰ç)•»¡bÖÓÏSŽÞ‡À{Ÿ4ªÌ·ƒW›AçU«lš˜­ëÔnj ÃÓ`=VfôØØ/í €£'K@zUÊ1òb€>8¯:·Xdsïý[ß õ©Œ»®¼>¦¤ÿÛž_Ý0K)öhêeWé2½×îá$¿Ív`Õ›ª²þYÞž!8>œÇdhNÖá›3Pq^{7Nb9ú×5¿“Z½Ïœ¦²&Ò¸—q͆[}za©M'|”À¬NÅ)k{ªåÆhjÝÚ™ ÎÁ½vÍMŽ@soÍ*a¸7õ¨h‘ß$0†›±ª€¸†‚X½&ƒ®'k·L7nú܉°=ð®IûòÎSÁmý~#à¾He•pX$§qœÃž3Ρ²YŒ`ßœvu({ú6¢ó›Gà~O5üIêÛnÂ8ßQ ¨„#݉€¥Õ›ˆºµ{Piq¸z§¤ž¦ÌV=˜µ>½_¯¶ìômЉ`]D£¨ _‘¢”’‹;ØóæW¥‡} Lû®/¾K·9¨ç]+å&TÃ}%{î'³@W"¶Åòmê¯ð}7Ó­N¤˜rÜú¡Y$ÇÒøÈ â‘²”›Hì"zyQH0 Ö›deÚ¢0Fà5(þN«§ïE½Umoô“ΉR@/~^j¹Þ§´Sb¾]Ú°çQµ¨ÐRyðl^6ø›˜Õ?ïŒÙoä+ÞD.WWOpóú‘Ù\¦<ꋚìâÎGñfy‚”v‚ëýŒe[;ø6õÖ½s»^®MxÚŸþòn±¤Ä{NGS ð›¤peÔå¸ÁÀ‡Ã{ò@Õ]7ð.þAJC)xäMs.®ÂWIÇwìÝxc‰ö÷‘ ‹ k¼}ï‘ñIMÊÚÍ \ûLuÖ'à)mÞvkI&ÇÛl°½ý-Dçù-ÆeÖ'l÷¶/‘º*[4O[JÆ$—Ž ¬'›ç ”¤Þ¢‹Ä*»l" ÓZH5 Zû¼#Ù.­jÒTë‹JÇšCS)çC¹;Yi‘f"ÞÀb²«L“޽áEËü½zU­Ä®m>ŠÈ”HtOª,`-íbÒûÿ—¡„XRÔñ'ÛÆªÚp«`‰1©ÞN|Þ”P鋤díBuL²Ú l0/ñB…ݼÕÚÏŽXcº˜‡qWè|º=5w²çdÙ>,IP´ÎûV°% ÝÜ0:v +Rñã}7yú‘WG’Ìä&MŽ×BãÆã-«\‰òz®ýjðÉl‘­AÖ7¼Ĺ¹b¿Yë5g%Š‚ÁîÓnD/ìóƉä­Q\  òäiÖ‡1 î³èyÈQr$¹±Sö——*¦KµK©¿œ±![€ô«*€ Ê¿–zŠ2Ä”–T’jPiR¥~Z¯™¤ºý—.ñÂíܯ  ÈT6`èy¹Ù¢®¾A¥ ç Mõk€4ýÓ›{¾›¸•ÆÚvÒƒ¦ª¬ÖÝÇÍBhž`ÅŽÌ׉xÃl5@×»â})*Ôñá8ªÐ° nÛcyœVŸN¤µ\¥¸d2É3xU²«€Çº "uM ‘‡ãíMµ“ëÐa@×ÝÇõ&ÞÚÈåI^78‰H°7Š@Ãz^p`ù¸ì,ióë ×?ϯã( 6ŒjŽ>6Ò&Û,ÿ­›à‰IëÒLä€Ì]©Äž§u€x¨Jø[ªHòè*Pùªìc@÷ýŸQ-AÅ8îöXø n­T/Gù ½àz¯—#«×<ÒëSûRoÍ{ØTwo¿à> Í4> Ò(§¦½ýË{OÞ{¢©yëÞ_×ó„;&`?Þ«E?îïùB@Ôñ+›1·Ó_r‘¸mlŽcûõz7AÏ]¯¶]5ûm˜tw?Ñ?¸€ú÷2ƒßEº$tsààT¨Ô\€d¼pÃNAØ©A.Y²!1@þ~â>?€Ç¥TýŸ sÒJ“åö&&uu2ó¡pbs‚âÝ6ÆÞ9íWZŒJ~øÖf„˜é6茊ë½g»MGä(SþüDDlkªØB40)™¡×¼E(“Ç%»z[îŽÒ¤ÊÍÕ›v¹Ñ7'žëöŽD ߇Wü¹ )ÚÀ „Ö=R@Ù~ŽŒå¯ø®‘­ïê)7E ±ßbÐbÉbáúºIàNúï%:O¤¶dÝ/JádÌt!LÊì[E]h+I¿á«KsªYv S~ÝS— Òà“‹¤>3E˜0':?q…†+½Ô‘ãXâ`F’eCb¬•¢î ü@oæY—™"ùgäuuµ?º;j¬»ñt¬ òlÇà‚™Ë¥ïâ•/;-¤0“œÙ+D¤0VÎáBÃ-\PH‘¦†ÅõRÄ1¶<Ç™ùU òKêä˜%*¼¢*£þ!ÑÙP±¢¶\Š!Jóâ~#PeK­î6S€JÎ@C@ƒ­UU#¨¤P/›ç`Mþ%¦³™ççϹÄö(iäÝL% žÚ3.W¡@–:Žje+Ê úÃR[dÓUW/PŽ,+¹cáqIejn§G²E®š’ÖšÑ4•© ÅTY¡ªW<é’Õ'dW´0ãû"ªuB»‡Z°HHLIufÀ|×B0 5Ñ–E♃¤b”®rÍ,ý»˜z’WÌa£·HB›šºt`rÙŒ—[‚QEhgcÕ”å†zQã`âÄ¢ª÷Ɖ€‘´iD cݱ…Y¹á-÷»ÓÁ–±í™~;ï²NTî´ÂªAIÔqZI6Ã1ÙJª™{ i1¼÷ê3Oœþæ…-B˜y8·»YxGSaIj¸S]pIáTù„:Ý*kºVý 2a/hÙuâÁóxI½-BFt:Ã7d*@K`Š•LE[Ãè ?jËCÊä4%»ºTc¨¢ú€QŽ=&M ¾I|¯-&‡jßÀ2½šS/Íi¿êçÄ*zAOJÜÊ $QÒX„ŠÚlkJTØ®M„@É ABÞÞo–{Ï=‘:˜i;y[¸ÛH ñÂ-f%—L%ùÊ Å®;#5ÀVv²ð(Ý?©s×Ô)KyYÉ8ç¶EµöÉp{nС !±p€›D¬ö' °€6^€Ì4b µXa;Cu8cÏDbP`âå«™fžNÆ6_KsË$‰ÒµK; ž<™«™oÅðæ{¬TÐÚå‘Ë çi~)lÑ|wl÷£åEsœËÛC®Ç–IïÑb –³KO/".§YS?¹è| ©û¼ŒhÕ´Ž7Rb©b—(s) (Qƒ©¬Â½vHv÷Û¨]òøR<…@h÷WD`xÝÎ[i°kÌ#ëî ¹§êÔ)á×GÃíðdvUˆBJlF°(£TÑigdSÉ;Ó "qÒ€£q !Õ†ˆbAz$žÐY"ÿ€8­m\p×€*æJsÇL@ VNUA!ÕÄ—hÑ[åÏ–z+¨IÁaÔ£aºþÕ¨s@dF½ÎŠ®h=J«Te²ª‹tíö«#êBé1oÚXºÚ[œ¿‘ ò5ë¾V¸ýÌGI¯H´8-"‚ËD:u“"¡6šc T°9Õ†åö|Zf¨ñŸá‰1‰ýDV,œ,liZAe­d¤Î«Ù¶;mIÞ5².¯†3Ñ,bIúÔGÆ{{>=y?‚ÿfµfW,¨õ|dtŽ¢–•è)«Vì€þKN­ó*¦rl`5¶ÒN‘Ÿ½[Eeû(nnÖëͳÞô@…IE±€'WKz‹FûÏåÂCéÊs@‹¿–Î9wá—0·Me ?Mì™ÆÖ犭K¹“è³CÊ2{j‚ )JÙKòp5G³3q”5P6^Fà w_ü¶Ç¦ú´³}G>^€Z y/ *+¦•í+·ÞDI³µl„7ãö¢P¥Ÿ.Úº,ýZc•÷X2’›ë<}PcÎtl£ÒDÏX¸P¶N*%ó3ÔäGeáèÚÔGá« ¬è.oZ)º·çè›ì«fT¢Á]0ëÞ¨iÓ(†(RQ¥¹Sh{¥ÝT´hÐÆ¬8kùÄRÔt7\µEPþ'W£úÄêÒMÅÕõôø§6½)àçýÒ¶¸ÃkRªbfòžˆýw|Âþö·–{Á_¯_¯_¯_¯w+¬6“•vì6=à¤(Šª÷°{¦„<üzíhH/+”r/^ŠX^ï¶]«÷áÍÖÚ7*døëœûµÖ¿^÷Þo°˜åtPáLÀ,¯¹C%è=ú^á°Vâ1f÷O<‘!0»BÜ>Óø½Î¯×+¨X®_¯[y–Ÿ:˜Ì胮¾Cço+:ÿ¾\Y¹uæ@­÷Øi-M»£€UríÝêÓÔHÐJML,&n£)*xs8âÊOŒ˜¥&Ö†7’T5ŠÛÿÛšÙ)z1Ä|#(åg¡<4qƒ1€PŸ%‹jqË䆈3E€°™rÑhåØTˆ•K_•†xíëáØî¯½¥ÍWNŸlt…ºÕh#öÚ”y…o˜Xÿ,µOâ|Ê^UÍ G¥ûdÚ³¼˜ÛŠš5ŽJ®K*m ÷«5êZÛÖHX|O+ÏQ3)×=–B£ÔaÛñI 0ïL…”Áüƒ¬A&zä¥MÒÒîÊ¡Ñ2y²›,¤¯Tá 1%5òÙ×ÙHÛ ©K´òëZž(çu“;‚ì±´ž©"RH-žnöÌ ¹DAª'ÅJ¨,%š.‚|8 ¡‹•I‚P— •áÒí–»´_òþÄZ@Y+ŸЉ®½†Æ[UÙGly_ô˯“ʪwª`ÈV?¦r§¥cZúXõϑى5qJ´¼Èö¤»*C“ÆÎ'ì˜~ãL«Jgjš¿z¯®qôá唀Uu°Ìðb3§i[MŠYê‰s—Óð6·½¶-ÄgB#nRa›]/{显¿é»ÕjA­·4ñ8æfÖ]TÚž7KímÔµÏÊVBÁ„d ¯5’(µuÀLøx9`>â71¸4^¾ÅGÈFë@ÕeW²ØzUé­Ì9ŒN¤·®çKœÆ© QhiΣ uÃÖÛ e8&ZbóõLD#pÅ"a„°Od`\5,ùùªç#‰7“Û!Ûch<˼Õ!»3R£3WZÜÓÈFa‹€'Ÿ)~¸ÙÞ]Ò0*H¢GºÎÐ,Dq `¶V­”ÊÌiùDWª)ªíÔ€¦\4B‘‚¬Ÿ qm‹èû´àRKS¼’[áM¼Bk˜[RŸ/±‡‘Â:+È3ÑZ1n ÷[‰ø¸âƒK èŠRKå`3ÜeµUÝUg-62nG݆κŠïÏ‚i)$…(³KÌŽEwM,g‰û5.­4³"þ^‡Ï²,ÞèÞ0±®"9\YUÆàªÐSTó6¨„P¦öž<·¸ØŒHÔ¦ A*‚‰ýaÍ&vÉeýôbð±Âh)¨U•ª,œœ¯ÚPÊPE„ƒKe9áF^ÞVAÚ$™Xø r!DVÌ`µáóOÀ™; ®cþï %ðÙ9s†ìS˜ML^Bî"ýÏ\ÎR5\Ðc5žh°ök4’BÿáŠÊ**Ã|¸„Àý‡Yt‡8Áò“*€IÍEðw•oëØ±*v±9ÁE–D°<)ZÀÖMm\¡ñ˜¬Ù -+—õ!äõiÅÑha"Õ ä™žÖCˆRætó¬[qô¶tP&Aƒ¬rµ~­ê ÑdIy©O½ÛRfC¡£Úø²hI¸BlGGÚôÆ5¨¦Ó{÷@óg³ßK9g9À<­~[@é™s¶$+Ù{ÿ½¼^},ðs¡ã³…~ݯ׻I®MÕ¼g€™ÑÎ §f¬µâ4½Y8¹—¥÷7 e¯ÃŠz¨[ãg=¹I›á»‰¯îøÉxg;ó jÃÇÜÿŒâOÇ ®?}Bóó=‰¹Öõãë¿ÁSúAÙf=4=«ž3–ŽÄMžO ÿ T¸ÕútâãR’@”:·Na@3Ê+\½»6neAŽ w! sÿÒOÞ"sÌ(ÞE‰ÉqÔØ`î‘:ï,ª8Xd"*÷¶N‡Î¯.ënÀB]k\M—•eÐàŽšâï(‘*kUG’ÍÓ#µJå „µšó£¬vä%³Û]¤1]Q÷„¥TVF”EFô¹M”xŒc;¥Ý¡*a¼½–Wµßœ‚}b­)lï‰È¯¯Ü_µ‘²X‡7h…Pý[Ô~E‰|Ü"Â3MÔdN8m™Sê':ñ°^™Ñf³ÔÖɽ¡°6‚…þ¯¶Ï-¹†Øˆ±Îùˆ¢At‰_D!àâÞŸš%|¸©Ôû¢ÎIé¨Ê±©l“|{ý¢+=½Û¹"á>*oÁý¥dI _Š1fÚ?Ó2ͨè¡]iZ+J_‰/^{Ìmqºg˜Y‰ëÇ$ý_*Ma¯ÙÕúW¡UúÅía2I{o¼‘«¨³ w“üÚ7¨!øÎ.žÒ†¾MHö’'Ã+ÇÓáò†éª€§ ¼Ü3{O‹ö/víõÍ\MjáYæÓ¤ ,–ä,Ù›ÂðNõUÏÒ˜ÛÍ>káÛ5YжH¬eÛgáV»VMëòGÛˆö½¦7E%¥>y²F‚j~œÐCg&v­l~_œÐàršÆ1ßœ?ê>lØEûð2ÙU–`îa£` °UT±A-‡Mɵ«n$©qnjãh§VÒN0ã&·ýðúÊÔšî‹W^gó+÷ü^ìûøŠ«c=Ö7¨ :\²<¢Ëe-Ì,9AŠªÄýêòõwý7oèPÜ"ñ Q¥#ëbP¾Ö•¼£}½Z4À[¦Ë«J¸é›*”+µ¬^Äæ“–¯N$Ö.Áz!ÔßdÖŽ @®§Ê ˆ\³Ô‚žG8±¸ Zó FË ›ŠQàÎ"ÃEŒ5÷‘(#ÎO5½XRJ…¶eÌ~‹ô "ø©ÐFAù£ ¥ ¬ä¸d#£Ï UÜz=ó˜Ž_—,q4"Ìõª|-EUªæ+ej ¦:›F£¼Y¨$´›…ŠÒûEî¡åÑÁ‘~©¬Ð,éU½S\ “Æ”0ñ²Ö,'Þ¥hNI1Q–Pñô:ýVʈåM.¹žLca¦©—B„ºú°VIÒI 4_¿Ùâe#è'x24¶hmªuo.yúd²®Í•«m¦ö¤~åÂ凃o)%R7Wì…‚újQ9¯[jjæ¹l¥\$ŽØÆb=JLƒŠá=à0šRÅ7´@&"i¬$T­s,ƒWhžKÿ©s$’…Q5cbeÁÈ Å¼Yâ û_ÛRÙ ØÀåÄ]q^”²lKq ÐŒ4V¨d)B ƒiݧûçÜ•ô•ÈDþªHcݪ°ª$ä¹Z_"4ÁKÅÊÍ"P‰’pÙÛ׺ý+"$IRªºlÕw„ßj;B ¦p—5¨÷$úN*Ö_ò;u}¶èc§ý¶DAž !M)qççV­Èi“oPiÝÕ XGM'©!DZ®¬'³™'+cˆÙ3ÕÜ Eö¢!À,´bšòüúóçH(!¤N„•òˆ0ßÀ9.Î`à㣠ª:ãÊ(sØ2$KÂCé6æ4’IÞP1‚X)²QÛ‡NÕ„é'4ƒ´â³q"Œ}Œf­>%Àh*KH½Ž “Qq[I<À´öÑ•ê•É<&$¨¤zÌ™ëy/—¿5ðr#Ò]Ô²]).æ…±<«k£•òÄÊOJàŠfʸ!F…@ë@ò6O·œÃü&›Šabš ŰIPõˆæ ”ÅI6ÁÊzG骿ÊlŠ¿U3Džr–*FSÅÓ¶uPC¡m™OÎ?W­ÅÔ\{'J¤Õ’ú}°H¡ !jÓ%±D¼¨%±Ü YI+oø¹Eç¼]F[ûÏŠúá+ÖǪK«‰JŽR£Å¦æaW?Ö«ÛQÉi¡o^âwœ†æØ‚#€Æ`Æ}%€~¼åÇ6 P -©òi‹k®Ë #ÌxpqA–u3òصë6»ÀÇ÷·ô¹k>¡µí§ €7 œ¿ÿ×Û»½ €ë"Tú›,rnØ>ôDj6 ¯YÄd>õK8&ØPdÄ#š»V‘¡—¤7ëOQþ~ìH•jf7i]ÿîD(To€³¤‡ù³VP)  ÷C¾2Å:\ƒëŒÿvþY >XÀhô6Oº¢üpÃí÷ã஡ òÝŽg¯ÆoËa©µéhbø §cáwŒÿÎKV†|Ë` ¸Ù¾Wv4’ÿ?‘k¿ƒù†»ªÄ¸QÌ|U‡ÊÞß*·Ü¦ˆâi ?¥8J à„ß#%­ˆvcü!ûÒZ”—Ð~6ºì~Þwöæ¨K£7ùYEçïà&ø&{só!o¶u^¿L[Ÿpûé–37. 9'ç¶¶²ÑFo®=g“÷@ ò>h ÓØihÒ²<Ê{n#»¸‡)=÷?Û¸Œò_ËDS¦F¯•D+@QS Iv6‰µa=Q÷iÒ Ó y’j‡ ½ÿ;ÂÄýe«’Æ‹˜ŒíF&R[»CïŒBŒ C–c¸Ðó’¡ÌM»û¦öä2Z(L‰ \iЫ0(w=ÙVY)Ü"“â,Q:’óWv·Ö©¼ïÊ÷òRë*•7³:ë ìøvæ>ˆÛ;ÎÕ¢G^O)eÃKÜ_S4hÛ­ À^™¦µ\}PÿYJŒÊ–i ˜ø°T© 6ןê-ƒ.©NñP¤žH¼/ž…ˆ°Q”@¹mrÁþ×€. þó cÂ. ó$wýëºHŠ{W m¸%)”!åµ öQ¹›¬Ò™µ—><½ä̆ä®oãQ,E”ð¦z[åm¤ŸòY–õ”}°‚ŽÜ\•34Ε¼÷“òUÞ!ØL±<"ejâq€1ó¹ãÒGCË®Ÿå÷å ¼¶¿:q߇.µÝ®3o[äFY™D¨Ò'õÊÝ­8×"ì°…yì¨Ä6 YÊÐà ™¹Hå0F¦¸m¯Ô[ ÚuOîѽ´)ëQ"‘ìÚc™qS¦Ñ’>Øœ%œºãïPá ãò6àâ&X\‰-¯(r“š}’Oô‡‰‚|ÄþÁ¡ZŽL 3cf¬I(oƒQŠ%/oöú%:ûý>‘†¶îº®5Z ºò_Lˆ­¹UGL·Ì”®o†e9X¹ÿBÐÎËvG0ï4>fÖÒÿ²ð Xþ kDZ®Bƒ& ¸Í¸¡í9-lŽ&0Ão4iæl²µ¹n•í%ãÔ%?j„Z×/ÎfÌ*bXeþr-²J³Y P"ysD‘å…`““ÒéØ:¼Hž³Ø?¯<Âw¿qÖF~EÉäÉýZÈt”b¬‡ò"Ôñ6p^U8L-´(‹ÕÄ „ÞHú‹R)JJsÙžU $;VE _ÊÏeÁùÈSÉUo‹(l™¥ƒä6‚œº®’K~qê´pX^ÒæŒõ«KÞ—0P-|Q} Ó–üH}#)Ö@œ˜ÅÚr¬£µ‰ƒS¢¡T‡æñX`x“ZvÛdFa¢ÿ Úà¿|Ûìkâ-r›“¢CÅët™ðÛRg|ºÇð=(¢1óza‘ZKä_rcž¨ˆ7°Jñ’'1ÙÞI¬ÌÒÊ„8 cÒOF0ÓÙ!‡Š¤„Ç5‹Œå¦½ÕªTT.ÆR22¡e¼¸Ç›ÀÃ}';6–ß圚E *8céÅÙccáÒ‡ñGÉ*{bL’A4iý‹@êév?‘Û2Ù; PüÜäœ.ïóÒÕ{‚í“û”¥£ã\¨>#±E‡ªâ\rñU*§ …Yéw‰8÷:N)ž­üêwZTPªãk‰CAVà2ôŠß‘ö}ÑO¡j^ +…*­¢".ET³x†&V±u&A#M®7²Fœóês ¥\” L&h4qyÖ+Á²cÖ?Q<*š÷^R”ƒ†ÏbrÈ‹Å!ò«œ×¶öÔ¶.–ִ{ã¼-1¤|æ>ŽÎ^+€:¨\¬7’·ŠUà(ž>·m±Rî‰$6b;˺Áx3§Š|Å„ÙËiŠjéy¾/`™ƒ¨l0‡p¡¸¹8^Q)©F% FM7*¹aA-ëiˆºñr±Šçî%ýþYü‚R1EIrÕ sy›¬ž&W@ KÖÑê$‘JÜ\I %"o Îh)tW­ñÛ *¸d l†«¬ÆãBí‰ãžBHQœÌ¡eèNÁ)H(‚åŽ})‡wª‚„öXÜyêFfM4í €»¼ZvàO):§”jóDlŽvh‰Õ9­]ÑrËðѾJ 1å)kñ¸Ç•mÖ*à,¯"ÌS¤O¢ 1*TR¯Ÿè@(q¿Úd]–¸Q,îÊ…nzhib#óŸ&0E7ÝëïÇùƒ¶úïÚ ÇìòÛDŸZ“H 1«üp‹iÃÚc¹nBž9F zõ¨¥:çï-Ò°ïçhq£» Ð_J¸IàŽ­1í,æ¸/^‚>T!=Ô.ÙœÈÒ¾Åޝ<áoB¦‚ûBÀ3è/âÇCª ¾õ°ãö+Û|ù¡c n•æTï¶ù¬±PŒdÎ7ž2õ®Ô¼0ýºg6± c¦Á¥æV)e~ ¢6åª,ÒÍMëÛ”jQk…ª{U.tÉ3±éȰ«Ñü'| RÚó]œcÂçÚ£¬]ÿyâ ô¨XÇfµPàŒÆJÇ\覥cFµè«èŽ¢I„·•ö?’äá%2ÊÀ¦ÆQmÚ x,ïdÊû³ó„&™Ze´y8ª¢JZoØÜåC(Ì¥‡x¾D¶Þÿ7WÅwóÛ¹ßÒúìÕ«Øg#íá½®s·0%Ž7.¼·ú#}‡Š£k·i²6íƒäm(yL»m¹˜n ÿ)Eçw-åœÍŠ˜ŠW¸&D­Ê"U¬‚¤¾&GY·­VÒr~;^É€‚->0äÇÑØOÄ `¹dTÞäRïµJ4ys6ÜúŸœ&?ŠÑÜÃUæ^|رN±Db9ÏM«ÄÌÆ˜X°…÷Z¥DÊR~™ÓÌ0èõ.£²dy”0¶…q6m%ÏìyUŸŠB£Y¯€5Ï9-#HÆ@I?8Ð ªlJƒ-cƒ˜ÅB22kœÏÞbCË8ÎuµÜ|T;é¹<×:W3Hf`Êí#‰™aë^šRP$üµ~`Ž.´[ˆÙzÉùݤfO¬ô$m¨Èød(v˜E©wÑ(õÐRÃ/|Ú*^…4†Ò“£²Æ?Gs™Å1 VJ©ºš€¡‚CÑ_nºùÀ]’,6U­S•¡ è¥:Y2"-K+G[høQulê†_ [¸q6uý‡X)z%Ϥv~ {µ2¨CcW *›Ù5¼H’:1z)º=c"HÙ²’Ö=éÅhcBK{B-¯æ±×ª"ÈpøEKm™©~Õ;ý[¨oË—…ÀfÑÎceo7ˆääÏ(‘ /dÙ•ËÇ.w!(GŠ…"9ëUqÃH0©ùqÖB^7kjVn®\H¹äoä58 nRN Ô4ѰN&!Q¹I VSʺF\^Ö*‰ûç{ž“J’ŒCqò­"brod!–8ˆÌB©>¡žâãÍ4ÒWÅ‹}©j²3í²$ÂõµV‘%®àØEnÜEЧä… D‹&XÇ`Ñ(«.Dô$”‹¢¤&¸Áp.ʆp\§dŠuu]¸Þ«+3´ÇEÕª˜nÊ),’— ÂâãH`Zû ‚$B]dLRöªƒî„Ü*Óž”*`.1W ’ëEauu;±”í*/ozÆB'$ n”[—¯s^* 4¹5¿Y•C™xÑ Z.“‰X:š2a¶¹‘àÎ.Fi²©Jz°›YFò$o ­D™É§~&êâ¡Ú_'Ù„¥š?‹ñqëY¦-}KÇÞãVé m.té22ªÆæõá˜Ø@þÚ¬û’oB¦ “²O &Œ•¾ŸxY¥_‹ªY/“„(ˆóIÝå)*åº:è®U‹bׂ4<ýt¢óItþQM¢z4²]— ÉÏ:³ù¦MÌ*ÜDmBÐËÛêö:G @k,ÞžÙkÇ¢õDÔ-¸-BÞ›ó´¸äl}$óæpØxkBŸ6¦nß·a¼Þ´ˆ–G:5€Ð⯠¹­ ²ÆžIÁïÐë÷‚R<Ñú(VÞ ¨´ê(­ºCêGýž#ÂT¬¡‘ùžFr¹ÎûE³üvŒ.î¥É‡`n(o‘¢GÇ?¶ÅÔì#’ï Ô´MÏ»5<À+·°R«õ†L\sdn¨¬—LQôSÁQ¬B%wmtHZYý’ÅVÑX.T’2'’hcÈ”šdóg¸•¤Uº0æM 46/·OE¾}«´Â bÁbuea wvul'ï“2Æô/cf@§3YÏ5oÔí®l×BqËýpÊñR'¯®âNb’ΦÒÝmóO1Öñˆ)Û›­mÆ×»ºÚÛ,ó¯Ð»Ì¼È#¬T뢒cç^1CKÁvËpãf§6µiÏHU—“ m³1<«‚¿A>Ùt«K?¯zÅàž+­Äƒ®ãÖ²BÖ6'½|Üßxrêƒð"䮾wàwnh™:K¿^ÙþYB~¼ñã¹&tçœböÝqªjdø“‰ÎÿX!AF !ÕbŸcK«ã"C+¡[}ï;vÇäÓNÊЇ|c p!Ke+YGúâŠhè0‹D†ªÉF1 ƒ`CGq ó"{Ð2=C•˜P†Â‹ûj™OP ò4êt–à³ìäT}é@Û¸Ìu–ƒ4Ù%¹¾ÅÂÞOžW®áþ—#šIhp܃p»É7.2³˜¯|ö„ö®í½Uè)rG¡I LkŽè\JÃO‰¨‹lìwW<#²YŒU ­´RªýYÃ…Ò‡ÌRQjÝ´Ë‚ÍYmf´ŠH‹ÊßoOJ}²ÏT¶cæîYQótÃИ/UÑ”=S ÕˆHe ˆ]ì‚•*7Ñ"/#êIlú™sç)î¢Í¹xâáPKHVjŸPÃò1ª?ßÈ ÎI"ÌGô0l·d-aNt¢£7±Ûâeþ+‡í52ï ÄÂqêòs®™f(òÌÎ\/´•á©T÷TôcùOQ ýK´8[b÷Õˆ ­ÚQ»¹Ó·a•Od*nýè4-ÑÀ*2%=küL¢# \.C)³p/a“HE&Ê$)jö ¶9yu¹fˆC]šÝˆŠ|‘‘m§(È&óÀ¦4=b¯;ȹÀ¤é×0aÏÏjÉ 9©mÅ;@º“•ÒT¦‡HFH=Õ)I¨äéqJz"ÉGI!¬xç.['™wŸÕ@s– sîhRï‰ò ¡„#;B^„j¾­ŽP1x¢I ub‘7Ué1Q„«" uÉ¿ð÷òx# ÐóC˜*s†7Æ»n„<­øÿRn-“é‚î ‡µ‹uWJUÏœD{F5–ÞŸœ²’ŽÁ~x!Ïš–ÕˆyØâ×q#û¶8®^D!Í:®©f‹PÀ šPt^ù<€cþº«JƇpÅóeÞRnɰþ€$’Zšôs) ŽSX99¶’ÉW§Kc•3´Ò‰2¹*`£BÅ^ç­<Õ-vuó W}\Y19æÂ‰FóU$ž“LZ­Qܹ%@j » ç¸9 UÐü æYóÝ©bâ9`åõÉBmÜ‹º5x*@$Êþ(GÐÔƒ¼·,󎼙ídND}žj_Â5³Rëž ωE*Bî­ßRŽ¡¡yäe¸Ü šÇÛö ·äÅJTLܸ [ðÐ֚ʑ”iÿ¬‚Ò9®Dñ5À=‹•³Ð2½)-4XàeŽêŸ|+l°„^þØ¢óû63o`Å¡ûWëÙS»™óêѤ#ßBÚë ¾b’šs0? kûõÒ¦³Ô·”WV8bkþNØòcüžÚáôëus'ªaRZåa¿¹úõ„½xÓ[lœwÁÒU‘Áã2¯ÇT”¼;œMÑ::É1وѾéÝ÷My?¯È[Q#ßîiHˆãþùP¸ù3‰>•wd— Âï—¶ýõ¦Eÿ<ÇŽ~¸Mú+ÿõúîÎí¾hcsCAÂïð|£¶nü:Ö¿^?îN>>è‡:¿?“èü;|¶IMk›¾dö¥€™²ÊSBIÙÜ€¦ËuÞFœ¾OVr÷¬@*¤(îŒæÖìM{¦‰ Ô¶ºX”YÌ»YºþÒ)ÕH¨9íâðàïZf^Ø7ùÄ»XN)JÇI VÒðÜÔ¹Q¨¬Í ”~bF†ªp[–EÏTM‚ù‘Œž¨ïQ㿳P¬(ÒÒ£‘Ãâ7Vî8˜‰æy;sæÐJ„(çÏ|³ ¬¶…–I£Äñ¸,ÕV¥dX¼1æs‡EC£$³Ð–%çBÉ…Þõ"“ pEпÂÎËû7wQ…T‘ƒ›£f¬§y]»ÓûÉæ/Óå†äið»ÁŸIfzÞ;™Œ'ö‚ܺœúÙ˜%>-5­Â¡65èA1»«XYN_•v´¼ š4¯ÂÆFLÎz%Îfà_g››(ñÚ7 ²qdb¤>D$È‘<áT&B"›~^µ AE.–õY¦¤ú €Æ¡)Ñε“õ®"¤Å¦ÄùUÌïjAšþ{-Lü•“"DÇR´!ž;Aޤn¤¨OY@#-Mî*ôð«"3ê(`¹#À³ sbÆ)±W¢œ§+¥:~@»°2iH5‚Þк*‘é­ê‚‘4²‘ÄJòbáSå„Ä&lóy(Ø>OK•°¨cX‡ŠOÂÎOÉ#Ë|¯Ø½šôtÕ5jêíÿÕ´BcB²ñj´#bxÖin©ô‘b8ãšip«‘cŠíÏÄ-ôl­Ð·Ü}p|{‚æ–®Õ*#Iµ‚û† ‚Пúy­3`4A*a¨´-k‘Ÿ*ÝÞTKPÀ¹ý¤µF•´•OÅ!¶Ð;´#‰ì‘×wªÏ¡(Æ¢ÏUÄ>P½"}£¦Û¥ÌKb©ªŠ£‚MMÿ„ô²Îø®ÆÆõ¹Œþ™DçsÈ7/²fÂJ`S–ŠjIîJ!kb!·ì‰Ž±äú~¹Âv†æ«†ORQëð…tùP|%]îÔìeÕ.Àj©ˆ7ŽJE··˜D)?ä5Šõæi‘<ó¤z[ØÍ%˜ï˜bTeUù)D¤ôð¼À…}ÚtªbZd‡‚GUX¢ëU™i®E]X®"´?Z†&•GŸÜ¦9Ø‹ΊÐv—¹{þ„óò¦zmSIiÛõ€³)I_ ó•L²J©‘*­i±\#Ó~¥¶ñ©¬límm!‡ŒnD³)ð:¹Eå>ÆýÓs‡½Æä `·^. È °m¨L`³=Ùû¥ÝRqó©¯,o³¸À×”LˆrÐ' ìV˜<—JUÔ±’úúG&Òê"•ÇôMòqôZŠÒ@6f† °¯=ÀUe^âÄ&™„ÄÂÑ-QѨ®Õ¥ •Jw{{ÿÿÙ»²ÄFr ¨|ÿ·Ð$±ŒE’ÒÔTg9åXHû{pçWz ÉÊkÀÄ«#œìÔò½¶£×P%²/Ëô9›‘‘gsgÝÆZ$³¬)ô ËÏïf~Š¢@슌k ÐZpdbzœ•6†[…½¢’âÌi3m9VÏ_Ü)þ¬Ã‹µåôa…ÂVð’´eH“E°íICu“$•0Ê2¶Rzý×}’°Ä©kQ¥oþñðQLM,Ýáø—¤¨nQòIF=Ž¿™hœtm’Ii—P÷¬þ:-…uèf²ˆ¹pÓ'wÇTI9·É›¯¤“((†ÈŒ8Ö£îlö ç§Gó©sw(0LEÍi‹èÓÔ„Ö{nMë}ÆÆ*µÖ0 Ü¹OÁÆ¥Gï¸`>ur©+Tݱ’uûy/9\‡;àemµåÁµÙ£ú׳UUÉýâÔqÿ›q;jöÑí/üümÒy5ÅéŒü¯ŸGû¤)O&3-><®OYXþüL¿ñ|ù[FEï½öî"zÂ÷s4­X7lÎÄcë/x)‹½ŒØLSP˜âBuH\ͬ¬ý¸·…Í+Îmr}¦Ÿ\@EЄã'†þ N7Eo¤|T¯¿£ßGcÞðÅö/U®g!DÔ€O‚ÑúÆ0(îô´è–²“)ÁÙ#”°P*ùÙÕã…Œ’ +ñŠH¬Q–Î4ÐøÄÎ8nœ€éò³6=ž½ŸÅüë¾i½Ý¦$ÏáƒÕ©ÃÈS`Ëò¥»‹¹dVû§ÛÑ:QÁ¢.Ç0©¹@öDdã¾+ëlW;ï‡X:7u¨£K³9öŒ‰-4ˆC É´=õÖ8ÍúYx<Ôéõš A¤¤U׳hÈÒÜC¥xć٠îtòB±í0aƒq7EK÷8RŽzA¦QHŸe>Ã특XTץѯtôóBçMôöšî›¨½Kœ  þ—ÍÎ¥@ã m+N¸°÷þ£‘]ÚyÉج (¶ÑŽB\S=$Th@â¦u‰–wDÆ#Û=÷¼²É9:¼5Üìøì¼@«µçÑ'ù”1àLBõ~¯ýcqpf”¨ bwäç''6g8¿ŠEˆTŸ×\\ô÷æîY;`§ÔºÝõöw¯D~íh×%›Öo*ýÁõO&BHƒ’‰Ôæ0úuZãÝÐÄ}áÏÈÛ 3rÖÄßÔ/b2£@²ïøZ*&Ñ–ìÒ†ªqÓ\¤T¶ ïí¤w‹Þ¸y о˜ãþå$v˜OÉ^?Ëk~Tü5R£­ w!˜æœø«·©bµ_ªÎÄ"tAs6%Ø)É¥Ëù¥¨J2 ZÄ䔸)ê»ÿ—IçÏ:Š…&zë ÄðQŽëoªq`ŒAP/‚½§‚`þáÎ¥¼¥6=N` åŽGçÑUÌÉí²ñn2$4qàsãÅü¢7¯´ÝÒdyçäe9ƒ§·ÞÄÿ v—)e…’ÊHzA=:`8Ðqeu*ê´øu€óáy)½žÌŽ¡ˆ;„NÓR#ƒLÒÆ‘j  ŒñæN#ˆÄ‘Ítµ¶;Â(\…­z4dðIJv&Sœg)¹gïd`6_)W“†EÉ3fÓ9É’jÍùjt.¦Sj1–‘õ°ÔX-ŒBayϲU’Ï I¿ò "Ú䊒^û –5cà^mß]sþŠW ¶‹ä¾Éß=çõƒ¶yÕ8Ö¨­j­âÐ8dµ)1Æ*;, ²_qê !%œ°Z;¤«éþµŽÂE%Îû, þDNJGÄu™ž÷Uð9äÖQæÜ]j}òfËÃH\™ªÁ}Ⱦ»œ]å¡Í]ΤF;Èzv'àjoÔŸAI`#ÿOˆ%r*KãC±§´¬C"fÖ³ò¤é²K–Ð\÷ØuOmRéŽÂ•:•‘ìi¿Ëô5Ža„m —’Û¦†ÌYt3ìÆÙSÏã5ý§Hç½>±P8S^T÷˜ÌðÀTÎU9_¾ ¦×y“"ýi‰årõ˜o­áãd~†€ÎG `~“NUú²èõú;JÒy÷Ýú5˜Ó§ï4ØŸ¿~d~Z[hó™Ïç!Ò«ªKGÅüáìtÀ_ü¬"¤ÐÒ»øR9ùâs_öùkìQç‘gî.¶ C-Z;òT•A‡WfUøïµÚ‡fqåÈž^¾ý(6””ñùŒp F®u‹ê×X‰§ê>~Z|iŠÊSo­6DôF´øÙ[³ tÑÃLn°ß‚jºW·ø€¿å8±¥ÔHñÏSbE+ðâÐõ3VbIœ2 –lõ3ˆ.Ë€:•>VIž*ö.ß­‘ªmÔw›ÐâTƒ’ˆþˤó¦±xE ~Q©Û#-Ãö<^#æ ˜”% jaÖ òƒmÛ‰á\TY Å™ž:Ó‹ ëQä:EK6× ó[˜Hh¯2Ò‡á>®ðf×ízžê¥ ’ee'º©qv”Ý ý"ø¦QKÀq…ñhh/®¦È°tÿÁ”z:/õ0€ã‹£eø©U´Ëüõ =Ÿ¤Í„%ÜZrŠ\"–(j–aÛ±ÆÑÓÄðtb_=æ1“ìÌ/Å'òâñŸ|¤ð«,¢dê:b@åt¸ò4ÍSï¶O u¤Û¹ËaÓ¶Äu "JÏxx\(δà¾)ôXÚÂh·©-á'q¹:O:ºÙŽ;h?olxÚ£êvGo0€}Ì2FeR ¢Þ1B¨¨µêjFá·òÊd͆À)4”zëöוÍË–„{è ›À˳ V: YٓʯY0Š#3ràøóîK\œå~ê¤t§‹Ãš=ÀE yG<g‚ ë ÝWjcð±ž1'j48]K-µðµ‹™¬U…+ÈRU¡*NNá®D2ó˜@Doí…Æ”ÅR×ÇÒ+¦:÷UßæL²Õgxpç·D¶œÏëÃÓ0DT;.¤lÓ _H6q„†ˆ=Ââ(¦,é!·Œ¦äTyüŽ{'<¾ÀUßn!Á»º¶’–úÁ$†ØgÎ+ð†R5…¨¨íæc‡#üĦ¥ó(eB£Ù:¹Vc'ÂfH>ÐS8ö™Ik@ÖÐlA#ŒT+Ùº>"Ç~Zˆ«é¦ =µÄg¬@ÄŠØÝý_²ÎA–Z¡×”ñØþrGp4_L«XÌ:Є°k%Ö‡«¥é*m±! €úȇÇ]e'YO®vwMÅ.fEýS™pU7n„åg\áÞ˜QÆ”5ÜH… íÑuÜè ²<u)ö4-Èà‘g™£ µáþpŠ•NšdmÌ•]Ï^RÅEl$!å®0ѽ.áÏ,:Õ›÷‰Üê´ŠÁÛÀ‡[îüãB¥K@"€?6†\$ ±…dDHÝ”,÷…3TR`ÛD r ïäN7~ôôõ€òqL+ «°_Ž8lé¼Þ\ôȾVKDYÙ±¯Éãñ¨Ø_(²+X'p'üN=êZ­¡ðÖ¢q$íôãªöÈ—áêÆ¨&@è²`ÛðÜ㢲i2žôÅŠ9üf€'á3˜Ÿu` ku•³ ×+ùLD¬!»b)EŒîܸ$ëq‡Ö:¶YwãØ®E®÷Ü„¨a%xœÞç | `ù@‰ám2B„”œšE;±»$k·Ð’j ÌÜ]{º Ù|ý˜§‡3¦‹ˆk³£´H¼5Û ÿÖ¬€ÿª#Cp)6ü[¤­ÌK%¬Ž¡¬:eÅØÀ8 h÷—z]ëf;kÇå©O¸hðoq¯OÞO± ‰€•<›nnBÍ}S¢[Ï!Sát‰¾úËŽüAõ‘#â5™Î¢¸Û|)NbPYÏVΙ‚ (ëñ×¼5à,Lka/à­¼Zá;xßé¸ ðK?dlÝ:Eý%k7 $Ù&Dκ– M_íšCã´VH©Ã(¸ÙB¡7w~µ g¢˜P ä¨Õ™xß$«Oúï¥9®¸ø6£ÔÛì_çö{É®¿×øoÇйbȸΠ¥ú×ÔໟìÈjàÚ—tŸ#FÝs·§KGBÄÀE¯Çöõ>l“Õ—d žJ@·-.·¿/.°À[·ðë~ÂYMŸÏgeÙIÌצù=̽–ì²ñ¸ÙçÉû)DÖÞ. /°¡,¨œ"6¢üQR¸TWÔ‰¹'Ì­‘E¤Å9˜d`µ-x§&3ýèÂö4+Iœ‘"EÁûµÊ‡^¶Öò(.^Võ^¥3ãLx2„8æòÑÕ*u:ÂzUðŠÎ?O„å­ëwŸg ¬R}oŠœLëi}(Ëoûø™¯©&&àãdÅÏãa¦7¼”´ªî–G¯fébNë4ËW%¸n\ÉÝÃEk¡¶¦U’ÿ ¤ó/Š"]¶òcdÝ8@Sm)±ØhQ @ˆD»66_&§¦pCýbKn`G]pƒ}7:*ãÊiñ51šï†€'¢0xNƒ~D`$r\0²Ã¢ ¿@¬£Çm'[õÊÁG«Ù(€ÈÎWóaëVdí×,>±N/^MÛ¥ÏWw°ÿp”K¡<ŸÏÇãá¨{DiÉäs5„ßDnl¼ïˆ,vçm7DsRðA‹}P½Ï?†î‘w9P“èRY£1š¼“oð•ýÇö.åá¶÷ßo»RsxÄB¶šÎ¯õÝ[„ˆ7£_? “T¯zµd[°™ƒEœ?,™¨SŒß<©§•Þ|äøM+î•5ø]R&ûM4*ía„ËãjŒF=~ÖLoq·{? »?)óå%Y¡àÚÝåt¶Uð€½ Ÿ/›‘!"rroòx¹|\vâ:Êœ)egP€M7£Û@ãÇ/óêÂä}7€§wÒ-næ´ôÆÿ]ƘU²GwQ"Ò§¨À“ €¡OA†*GChe]м#A¿%JL\ÓŒ¿!h‹e×@1{îí9 à-n¾Í\2É×sQRÛ¾—ÛåC„1aÇd&4(ú8ö¤<º í¯EB1³Ï•àH¤â|*x(®¬àþUH`â8„ÈãQ™`áS炱®1)£ ‚ºÓ­p¥ª€þ–™·ÿÄAÄMÝx5GMu‡Ïxxµ»-É!)OT?ÚÀû£¡–Ú‚!ìI4AwÉÎGªËæä1u'Âãé¢$'KîF/¹ aûdG¸E{”Xm˜Ùy×Jø‹Ô(ñ ÊÕæxž9Ú†Ü<ä jÉ Au=¡ê²M¦Ñ—+³H g¦ÆÀŒ¬zyX7z.‘àE´™e+ÖÊI8!7FUJ·&!80’Ýr–òËލÝý&¡««kä‡lHùØžWd öÄI›[¥$ žý^NÜ$ú”$³K‡ŽÝØZmÌ»{2ÝŸˆ«™ß °UòÖ;_ññ`)ÌMäSn ov ¬ÐåÓfë àSaQYÉL©à'9am‡š5— ]êW'o2¨,;yQž:ø“¤óeJóDJÚ’¢$q AÏ´‰âñ)¹_A‰¢;@Ú/YRÔ‰Qßð@x@ÆN©^¯KáL±üè³;•Ür}‘""Nw‘rìhYʼìÁd¢ÈËZ?7ô–Û¸„hBj¢‰Ú«IOMË¥D]ñv²âÇ·7ä|1 W ‚OˆðTº3faY0#ôjÑS•ý~üü“"¼»+ŸÞ†8zšŽ3/¹:PU#äûÚß‚8A@A3?Ó3TžÖ;½‚;às9:(áB„UxGÝ‹¸›Ûñâãŧߠi^5g¬ºÐê/7;˱UUp8oyê¡€þíÅäÜQ]òÂrHêjï1‚ÑQÕ•>ƒ€:Ž!BœU{²—&D€ªÓUºD£µÑloðì_p#X™òUøfÆ"°?"ëó.óÏmH‰Ì꺿õ‹%zí¯}JZETí©§Óø U º@æž?܈€J‹Ý…æE"ŸŽxQŒ8U˜"5ÌW¬¾œÿ&éüõ?wE×"~hvÇþœ2¡çö€Ï-¹Êcki©óOYÎfoê{µ‰~íýò…)é<Ò¸à`Í™±_ìàà-¹·ˆê ¡íz 3Fw¸‡axà¶½¿;weO ~Ý‹C´ ΣËÍäù8FÑó–¨ãp|Xœì¯ÐEbÁªÀ×Y½ÅZsYùQ¸…ºõ|ÒL q¨î…wý(аשÕ7Ü,k)]ð"hùøWÔµø0þ™;Šl¼mKÿ¿x>J¥ùà ÏNeEDGÖ¯Ÿe4÷ö !½ÌªÙðÛØ ¥žvÔ®Ûå3¶²6⻈ELV¥´)oóÞãŠ3`抽 wâŠSÅ‚¸æÃ\¾ïÑÖ¯¯À?ä¼">ra Uí`”H§ÜÃó) zeë\êªü?A¹5\ÚM'g¦;ãCnq:ÇK²v3Õwø ŸO:GÀ8t|ÎpqpKzfF›Óù×bõß"Ñfn¦m%µa„Æó zÄ€Eà…]RÁGvL—§u¿¸ÎúXè8œ„8´«Úµvª&&€i<•`H+Bl@Xº_%I'É\ÞyçuIðžó˜ß#L¢©¶ónMD;’kjd«Š´SêK¡Mr‚íL¼¡lÀ †Ê’TØæÐÓ& s…±”ã‘mlðw4á—6cýxf¿K[ç 艼‘À»Š“©ØË†›ÉØL¦¡pïU@Vô¦ùO\ááñ †æ&ÒÙKO U>V.bLŒÛå­v8x¼b5Pp°¿ \5Ñ7UüfÕÜ4ãóqý7îT›µ< vÓ”ö>òÕŒÎ;ç¿…%íäyiN4¿¯ùøoRrâx_2ÅŠ2ûïëån±'”Xr–ÁÜ1v™YŒ×±ÞÝ= ä5•¤LÝd¥IçÎõ1:. ãw èé:F B*­MÓä²už]©°¤‹ÞdE _‹¼‚HeE–B¹þ­hŽƒå UK;;“pÿ g™Kï–ÄnÉ—‡Sž*d ð@îKæ8QÁŠÍ:9„tȈƊY½)ë ”k䳨³¢(`¢šÞsÿŧЕT$7’ f’ O~mö—¤NfK‰¡3‹6/Ú‰C{®–³´ÙcîÐH­2凌ŽI={ÀioW¯Vp ”ò¯^ÍR?ôÀÜ{6 –k4ðfvvèDIOÒ¾ã&]äe‡1‹S®ÄÇaÒþ*é|êçpš£ºÉX¸g(iw*h¢›fg, ]”Ju,%N‚™OŠœÜÑdP5󘛘bŽ™  |’ÑoPExÖ˜R3\S4—rÀ ÜÍûN– °I,z@Q¦Aª2U@`©“dé{Ãþ±Ç¦â|ÀŒG>H{M¢AP£‰ñX-™Ôê½ML9QÀ‘i¹d `â`Fޤ‹7SüœÌ´È‚R¡SX§Ò1¾ÿT –ƒâtìÔ)×ó@8ì:X´[±y"•…QÂÝÍáÀ¡V ’Ú¡’™9å$GöÜÒ“žøÄGÐõ–<æ¦êu|Pµ'’%t;-2À‘ºõIe^W ¯è6”Ý×P­yæfüÌ­¦á¦oq·E&KÌV Ý%à2@a‚´*$iJÿ°RPœ£ gÃa€9ÂË“'€@açµ2!§p®“•ïÇ'ªôÙ<á8¬±]fÈ=;`Ù|Ì PÕ]$F¨¬§ªêÝŒ¡Ëä7œdWh“Äñ->ÛÒ¯sùFÇÅÄz¦Ê6¨2áoÕÊ+6ùa cÙ£xÿÕÖb²"û… ›Ó-Ͷ<Àø;ÖþH_W '2®Aô%$"…ËP«=K:ç$ç`ŠˆÈ¤i\Uòr4-‰:y G†ù3²˜Uª«?H:7‰ŸŽ×¶ <¬§îÉ>ÝÍé(—>?³e&ÅKØgCø¾dèßÏ+Ñ›Œ”úÜ¿Ž¦ÿS²”W½0: 7óÿ|à²ÞEk÷˨Êäp 1ð)‡îÆÕ£…ýfågîgÔÉø÷>Tî…¼‰KðøÕðLôúN7¸XÈÏamo>î7ä7η)yD>Ÿ` §½ük¯n¿Í³Ë·»¸ï±€goŒ4½X|¹l^ë÷ŠQ ÿúº»H«yéèNd—Msü~>ÙíÖÖmwi\ïß$¿Ìy1¸¦¿ØCbâhåEø‚ê¶áQ¹˜OÎa+‡Fƒ×L Y2œí4®ù± ªÑŸ½¨${ûÀšìúÀE ê…;~ŸhP8´‡Ô È Áy ± nG€‹[wKÝ‘‡%u»Ì Q‡c–仕'c¶Ëƒï$N6*Æw轨T\%t;6iRF®®lܱaãûdmÓäŽËvi=ꘒ(²W„_MFrHýšû"¨«6d·¹ŽB^”¨âìËÞ´œŽòi@âRÁ¸ä6mÉêJFXhÐŽß?ìk*ƒ†,fì. VR½£ Þ²Lü zn±&¡+Ví¨tŠô°Ì•uL6ATeó*}g²@êœ(h$^¿L–§K 8ŠƒÈh±½ç•Ñ4íHŠÇÃÚM—¥ƒ¹*9àÖ›*]„Áy-Ž˜&¬³WL LDßãf,u+$;|ÝsoŒ«`)& ÌúêÃ"y«¡[Æ·œ’ˆt§©Ó2÷Ñ⢻D\·,Á3òv"¬½¥[¬¬jr¨#}µ~[ަ$*5þ;—eä+I¬˜¤;wUÔF1%?‰ô˜åÊÈ_|û.çíiþíÑÊV ŸÜeKüöbrSg1e3Gè³×ƒÅú‡Ç=üÀMƒ1z+ÊÇ;”¤Ærcs‚]&ù`ýY‘ÆÄN Šns{f‰•ì¨p½<„1¬¿’=ªññtƒL“Ý,b!["ó‘±ÙT´Š{v]-ÙrHÀWÛaË%÷3òd*6ŠÑܹëgÞ×x}Ý~uóEùI9S’³i½¼3Þ9¦=ì“ô=Að‹d€ˆ{@§2ªºÊÊH8È7"¾/ñޏT½¸³Š¤¿ô‰”qο&éŠÔ‡L”–*¤Pc¹FÎÄô¶V_FPŽ?³A%¤„?— ÊÃtnÑøÛ¢W3 sÉiH=·!¼=z=Ÿ˜ŠÕ‰ÄI"›ãë N:=Yì-«—rSÀÒôˆŒ3¿È&B`79¤ü9m”õ[öÃÈüa(s쎷­»GVì®ëˆs;ϹeBz¼I¬*é l5ˆây”T¼0F{"ý š¨~¶;$ÞzÜ©ùeðOÉë YMXôã5a›•ází]“`¶˜{µœ˜EUJ2—‡$ÉÉ<"‚-¤R¯X/áÄDµãÈ­Û†±R¯0ÿ,ØÉ¹O¥éøíßæµ®<ŒY¡Ži#í2+u°UéîWòSïš½ø5²dê1h•iÈOé*šø:ê³°•¾Óé¯Û˜{>*4˜sÛDÄýœáÝ:ýÊ­tÀ‹ù¦“…Ù.u\lPg4P–(æ«á& L9#uÝ …OÁ²Ù!'?±](o”Äó? žgGORÈ{íxà*j•s"ð 'å‰Î @’žÀrüé& ãÐs})gÔ“ÔØ×Sj¤$IÍ2æó/N¥6«Ž%:Èñ’]@“Ä?ß ÊÚ¤lö-±) Ð*£iÖbTÂÀç¹°U^ÍdgBB³„Îý£‘k3Öeéñ ­3èÄD†²|´`€@ïºäkTBãÐêÚ—«Ñ3©^D[LÉ^*Yà @÷®àNJ†ÐEÒ„G«ÂÓ}I5kê5˜+öIöñxø´HUö €z’7’kè 6P &æ0"ƒšÆ¥ã¥Ó‚Ç5¤ú"zÛÏG†Vš…Çݧ¬i O‰})úÙà´#0ˆ&á†@¡éœð‡1oð‘騀¼a§ º‰¨¯ã¦“Lü‘Y+ûÌì¬mùâpMï$5b âÍ}8?æE(ŸA #s}k ‰9U”}/ +¶?£$8‚:ß6Èé¹ø­%,E5_ÍW@† qL…Á¥¼$5-k.Ûkˆ‡Þ†l ` ý¦„-+8kæ… W}*!Å&Pm"CòIôsÆ=’}'ï¨zoM"9)ǽŸŸ¿®P1QI‚9+ŸîUG:—ñ‡W*žÞ1ZpÅéAž?pšênÃË2!ÞM¥´Æ„Ú‘M°ˆ"¢N¤Æoûþ ¾Vß?©Ð‹%Ab¬å??¬]s}# «ò¤ØàL]úb¥nǺù ®ä™@'à2‰8d9\×Ê­"ÿ,é!îŸÛ°{q ¹Ý™x]æÁºÄ‘ÚQ/h-àRgÏ%í yuW˜\ÆYL³Ýn×ÕW]UåÐi¨ÊN©g¡˜˜“LÖPVÄ$¸Hì#sêuÁݵô©ÙãXpúùï·lÌù]U=väF}Â…«Þ+×äQ×KÒéÂéãÐM;0HºJ†˜©=¨2˜»À’gŠ8Kq^ÉËá’È[’kxkî4©jT2ϳŸw zG’\Ǧ4C`y5õI.»ïäH5™¡§ÒËz¼ÿ¾ˆ¢v˜ÍáCŒ>ø¡üðžÑêKW:Â…ÄnÅÓ^m^ÎóŒiÀÅ{/{Ñu´[˜©‘»By‚¸ÖóZ¼˜é9ò~Ò/c0ΆÀ-:m&‹^ʇÆÅe•?G:¿5ŠO¶UZ¨+”£Û¤<àËŠ1à%?ðý¼ÄŸH9£ñìå¥O_ê@S#fÝI~óç·P¡Aÿ=Û„/<ƒ¯Ö¿WQ…ó-¯{¶õ(nƒöýÜpäÏ»TÐiÓ/½õ/€C+Àßñ4ª+jòÓÝ¢†¿ìŒ ÀÇ·¦þB_ˆ#{îÙÓCµÌ•Œ_nœ¯iþ~¾ŸTNXL~Éå¾”S·ÅeFjY-t  ICüŠW]£êé3`S­W}Ü×øŠ¿štþªèÐI6EܶÈÆ¿ƒl¨S½ô ðÖÓDÓ"¯?­>üOõ ¥ö´üÑØÿç¾{á(zgw™RE²¥ C¡4zÕi±eŸˆHG¾Ú&´|&Éq~(D| >y²^õ3£™æŒ'{/å»(: Ö¼4äyjÃÆ4hçŠPý¨#ò¨6W}ÕþúŽ/Š£y¿|“½–jJ:Mw&²1ªk&i@ÖéèÇ %ÑR@nՋ䮋ƒ•ù®^i—M¡œ5Ûzãôìò¿rkذ®ý³6bR•p·(û„¡ö‹d „‡´™íÍYðÃ’Œc½*ñ#YtdŸ96ŽÕPòª×ZuÿP;óæPÙÛ)z¦žO¶gGÆT†-r¤ð½ñPéJè-E ­C˜é FÁN(­ z–`ÑÖCAH>7.;uNÖγ±xñ_Q§ÛžôØj0V?ù¬Q§¿2ëfÎ9ºnw;`ΖÞ ë’ÆNÎ0¿""(Ø€3l:S7”ÖŒc°ÿ‚LAIK¯ª£"È,Œ|H£W|o€¼ý’€XÖŽ3ñ˜NÈIÜþp•?bˆMHjÒþ¥ZlÜññ èÍMþë*Ù‰–†%¤¡p'ƒçœ ‘Ý­ÌP²BêÐ8·3*Šê¼D+í”ËŽ(Vcÿ°¨+uPçÜ•º€õE§qÎ6™ð-`š]’ŒI;<«É:£«ð–EeT-†½¢vˆ bí³²G éÒsÖ=<2âa\EYQ¢¹}žä6%˜´p©Îê-û­OÓ­2š?‹i 6íƒ& ]‹hODt…èÅTd®Î¦Šî$.rG²öÍÕ¤Õ©ŠH9¼3è,xwL18ÒÀKòã PDÁ”SWi²¹ûº!QKoiS´Ó(átkoVE ïíÄ;cé, ŠUÑJ“ ±ú™óÙâã-ÚÈ·t—<¼DÒ8ðµ²]C·Ð×ÀF“‡i³pÐ-EÖ†FÄÖ¹yDóÒˆY!€â×6: ߕԾcÅ;Åy`Ö÷eÀg®Ä¥rŠ<~fíyY(í˰^™G‚¯0øû/Ñ­TŒcó™ØSï[Šã‚ç³”wÓÌ-w9†=¹[ÈNX‘ôY`ÙO§Ý$”;7óþ/p™µMþ<¢pÁ ™!õ2„,o÷ü›Ü½€|Éeå®±ÍPä®Z2+K+)¡²¶9)_Í)îÚä©í,ò=”ø Ñ6»ƒ«k•/ˆêoÈë ÆÏš§/ÿD4îitæâˆæyÌÐF»»6Xºï!ñ7­žn>'6äQ®%þ­m…©ÆòžÓo©YÞðà 2Æ'?›þR«²ru1í¶Y©ÒÑRÑËØ5‘Ü'°ÓÌ(Êfä6 Çh¥Ò>wJ"K?Þ7k‹¿J¹DÎÄÎKݬÏŽq‘®ä5Ë‘•Œ³‹˜t¾>Òµš=¿;åó±S( g”½ß†âJʧƒFœù,S]7Ðm±ˆg.ÎÞ¢@ùqëʾøƒr¤ÀÈF»€C‡`µi(r»¯yÛÂù[r®}ÈÎ$вù"xÓ}k”s  ÿšEûeçñ’a\n¤[ÕÌšÑʧ/?@¯çkZ•ù–ÉÌ}¬à~Þ"óAK·Ý\ÀêA»j¹°;Áoèæ½yÓ;0gFÃýönôßMªBþ>&­ î„ª·¾Áhè9Ð’öQúyzÄÊø!€%SÞâr›:{X£xshÎz˜—s@Ýn,&ÚVÿΧüî¿/ 8€ùEÙ…wíÈùÃ’äY ¾_¿O(ÑM7¯¢$öµ€àêî˽LƒÓÏ'¿^5¡F«’Ù»ÓtÀ…xÙçÇQ—êp”ÌÚ1]ZT#§IÎ\]·VÛÿ,^Ät çª=²–ý1šájüû‹(® ê0+§á“ÿ}D|<Ï糎c]Þc {1vŠþ%ÿ>ÊÝäEÅPïð½‰ ÈÆ´&½*6¬Å%í¦ð.^h¾8:…ÜUÒ½·¹¤¼­)‘“cþ+ë:Óïåg¢*šÙBmN–Zíä½ #yíwÛÉ F©Hڟϧr­ZàÁXìú£e:bÞŠÜw—…V£…†–z§ÃŠ¥kŽÞL÷ÂQ/;:ÁÃ\p阷cgˆåsÔ¯°Œ½¶Á4ƒ4Ý:ÃdˆzÑó«OalË!<Œ*#þ»½ýÌ@ö–´nNñaLÔBÛLOÒÐ ÔòÉ} 3(ÏWãWRyPãAßIššøÈ+Ž×'ósºñŒ HöÏ[\ÕËŠæíÐ(vD|>ŸÕòïøí{ryPÑ¢9oÒ(ÊÈT°ãÓŒ¡ ì®\6Út;ÅñËh&oø ):þ„µ÷¥C¦vÙo)v¤N÷:äyN‡¹¹¿s»ÜÇc¼¸‡²‰<ônt›ð²@‰©WiìÜ{~í¤":“¼*…Æ}x›¶äi®¸\. Á`3¼ê"‹òí ò«Iç¯÷g8w¨8à+5ÑoX˜„Z’ü,™Ým•¡4-ex?™aÞÁé-= Ÿ—èGí:ò²e\RÌ4„"@ÅÕir„"‘Ï~²Ò“U`RŽ¿)t ”ýÖ¢¿[ÐV•&ORY³ÿ…jªé@ð ¹ãRƒ5Íb ¤åÿi?Á¦‚G*I‘9&D:s‹e¶¹ pC¶!¡|²õ.T9ÁpMS Œ çš,vÖY/ iÃ4rê>þŸ\@¶míŒo*¿ïß›ÿt½CtòÔþ虓 %ЦQjž=)Gm:¶k‰0×RZÕ“ìý}Û™Rˆ~¸Ì7ý^aQ ò옃[Ú´L‹Õ„BæÜŠ\õånÎMœ9ÊJHÖEð@¤Ç#šƒÂ€È žmT;þÈ<[÷·´6 GæfàZr1e ΉCCÔÌizb-»„Ýî‹X",•ß  Âæ=Åjš8÷ÿ<;•ävg_b™»šÎÂ3r:í Ö)ÃM¾ŒÁµ:M²gd…ûD‹a“aСž³bpQž3ªSõyã”àÊÙñµÅòøÎL/Ïéç‹Ç¡jÑP…ãDYVÑáíúP”‰œP4Ùe‰oʺß*lžcó=Z ·ujWss¸mþHæÃ”üëÔ.«µI!Ç&7xh¶ uBª¦€XÓ¦é"”žtLBæJþ×±ÑýÚ¤Á%UÞ7Mª°dIi$óxšzJ—Ô;¾¹M†Ôê7e´i:*㯓Î_P^’×7‰ ±ÙöûÀ˜ §(/¯Y„(vûlG5Ì´îÝöNß÷ €b}ïU+’§sY¾Î1¤]Ü톩ѪùÜóø<œÑ!2ÝyFò¤(¾ GI‹¹ŸNÏîÙg/¾·FãaAºœ®„®Õ9W lEG±¢£§úeÝÀ™çä%Š[5´'¥K^í[T€AQ Ëa:ñÉäÓà«›wb7OÄ<-zàjgïš¶Dñ€ðî›î©¨ón?ÊÉË&àjÑU¬g?¢äm>®®I.Óè݋ί vJôš\ ³ ÍþG“HjõsáwS¥*ÓMµWD>G§UUOä^‘•TZX Â!Ž1^Ö[Xàã>{…ÒªÒawnÚYƒç6*‰þ3–åí€K¥…ÞþxKTk-në á"^JšypÍjÄ€À]£Þ˜ø:Å„ôúC·¤¨×åwr”¡’²" ó¶pL¨!âÊ{DàÎ_«‚˜¢ÞÓ{ߦÀ¦sPîþü~Õe;*µò‡ÏËzÒD“0ÉÜýVÖ&«î›bÃo*åž?Mœ](ІX£ô‘°ÿæÀ›uæá$Mºq”tïš|GHBu¹²‹j]±Ù¦ÏÑ-^ǶT°sE¯wÛLóIà·j;9Ž©O®%¶ò@t¸Ñczûûq´ål°c’Je²ò¥púõ~îVø„@±¿,èC‹,Ò™ˆ0Y#Ó'ûR·öÉÓϺËdhocS…QÔD°“4ö€³ªwÇɼK° ù|ïc‚‘•Njƒ@¢~3N™Là’Œp¤âê„WÝ—Ù aÅûu:FAFÒëf媞…?u/XõùOú{•Ñ÷Eû/Pߦƒ'cO:ðŽÇv§ÜëMKP¹¬i¿¥ÃDOõLœênÅÓ:mI¸Š·ÅË'¼¥5#±ÃÓ&C£ó;Âø ¾e1àívØUb¿.×±Zÿ’™œx§È ÕþE3¾zß é|ŦSÀè(ßÂÙͶ$2J‰°ûÞEc9Õ×:3°|æ©™pü+›s/åú#ó¬S[¤œ§¬…ÞóM|}íîIšöHÛÛ z©ÒKqÔ¿ vÇìÖ~G,¢5“>èdÝP!|“)d_Þí5I@N¥¥£…”XIy?VtÈ€Ovi ‰¸g/ÊæÆÊÕÒÚ $úä(Ò7ˆq¾ r¼â/*šõÖÒÒš/6ÁA% ’ÆI•²1âG²p0ãÜ«&NBÝ:£-… ÎfDSÌHކ(xâŦwqˆ…]¦#—ÕjŠNr. Q1ó±B ‰ì6z=ŒÎˆ‚d<æÀÄdz}@èRgØÙ‹ÚÕW‡ý’ÉM% <=FYƒà'Ê<›%¾ŸPèô³Á+uëbÑý øÚ¼êY JµÕÛäÓËÖ­F5µà„Ô{uΉ'"»“B\¿ Ö Dx>A"g3õKÓÏ)'Ãñö;â&ÐŽýEàJ8‰ÉCª;sUHg·ÐJ~“Ødw¤€ù";µû…Ä¿ˆ;=Îöóч¥ŽñÎo3ì ßqEðåPmK-ÁÌ…Ìý7‚—eFSÀ®™5FIÎHHçã(È¿¡ a\­ÌÁ1ï”:™.Û¡ô…üüˆ¢ìœW<ÝÀIr”þÜ0¹¤¨ö0[,õOƽ´Àö™óßSçY¡á° {j÷Ý·¿<4PÔ„…(C®'2&ÏêõûДÄ%¾—¦®[5mÕÚf)kGNµÙr?"ØUϲÑGÑ×DÔI1`9 UGXùFŸ"ÿLÑÝàÃøòâ ÖÃêä ‰è&g-Jî,¡y¦Nrß–žôî™ Ï¥$—˜ÅUYZ¥°= ÆyQfÍÍ]z´¹E£YóP£ÄtòV⩬>:Њa¦Û!îž@çÕÛ“#@DØ­­røÝt„¢“Ëb-ˆ=mƒf{é©ûš:Õ;ê¤Üòà:èì¹:¢Ã×Üm•èièõ`dÄ›#m£}'.‰œó NØÂì#)3†#ÐÃ^ÕóN‡^̈üÏ’Î#O(Q(éjheдŒ]¡Õ¡èæU55…E3 \/×äì-“W6}¶Ëbua‘©sUñ/ŸA,:ì|Íô‹‡UGYì `úÚ‚Ä?Œˆøü;0U¤•nè85YEô™™ýs3@c|z]I²^Ðàsƒø`ù‡«Ï‰SPÁ®ªÕº•9s£iB9ýÛù}þÐÂ_4‘þ6©p´Ç‰cí–¢SC¬¢¤îyPP¸nœÙ=æ S@Nóì%§F·»Ç>h¥ÂwŸ¡ÑXп¿'àÅ€‡=;èη¯!â¼RÝCp:,¿ }Ù·IR/ çkÉBy¦r‰dTWŒv‘ÆDN0WÏG¹N2Q)TÊk6 =–ÖŒ#Gàu€@“¼–_\Éó쯕™ê•DÃBrýÕr@ù/ETl‹K`ÑgxÚláôÀž3#+qÍ{\ù;½)ž¤½ p´”Uf7¾ +uÝÇy@]ˆ.qì¯J¡,“m<ØN(ÍÅdüþQ§Ú‹P³¿™t¾bÓ‰& I2|pzƒn2µp”'ó5óõ‘ÿ9yðŽìñßå@¸ü8©€©E¤ÃÁVSÿçE-úܼê/=nN‘v.ws`ÓÕ`¨SùØÓr0ÔHuFÜÝäEêVqŠÁåpÆ— ›N ]Äf{0ö^¾W˜£ r\¥Î?Ÿ‡±˜Ñ؉`xº¶Þ-i)Ûƒ¨Àµ,<ÅÔ”\¤Çg<ü é´‚›ÕÖ±@ËsrD%ù‚éwÇ5ÇîpJ2—rO«Pq>Þ|•eq©phô„¬ºÞrD{}ÌZ½,Ñ3Ñ*Ùê_ÍU<´¥^¼Ã9Üëup ‹|%½ßþ*UxSZ´ïZyëzLQ¹Åñ,ØE3Ì><ÈM¸ ³}v®ì;ä-Uò1ëLkBô)ª_Ï·¿ã ðý/5éüaoÇõ €žOð­_µ˜! âF½‰ùÃ0öœ0]ÀÉFþ_ ÄŸ^45ª}ÚU KmR%ûþ&§c²µÇ£ñMº_{èO²MõL{Bžø˜'}z ív °gö ŽBw_bbtºé(‚i ĽoŒÜ*› ›,o„‹1õyðæZ)¥öïÑi)c;à¬Nu>NÝ®¡FöfUy0ò­Í`wшgGÌçýb‘W‰(4¯Y"Ny¶C,þRœ/ÏA,Ú{./Ö]k!®ÔÜÝqYz– îª½“,¡ö¢Ÿ«õÌ+óØÈãŠBÞ#Ð_’0N¢+†áƒÃõ‘Krý ^­]ÊÙñƒƒj€K¥g„Y´k%ëèæX·ƒà…RÊià^ËÒ–ïWt©Ë“.ÀTò÷ç1÷hÝ"9ŒúO«ÔrMŠZö_H*£bä,£ì¬°¦zpv\isÕµ")‹v^ïë}H¯¢Ãéz˜{eÛ”LTë@;3$z6_Õ„dfÀjv³¿itü±“Wls€ûd“ÎiÁáÀ-çÝMÝ…Ö—M£Õ†½èU;/¥ž’¡ò4èÿëØ:æëÙ¿›G¾³á‘!F~ó»@ ÀaaÉã2€FÊ'ñ"ëÇt\Çc ×)͋˂•¹4—ÆÛŒ{cøY4¨¸%KØÑNšÎ¤©_K‰ik²Ã`¸¶5IÇ}ÂL¨µ¸½Æ»]d€œû`<äŽþ6!S…Àõç'kx‹,ß’Žˆ¦+,ÿë"c*>ÞôîŠBV8—³_œ¦V5‘ô Ó$‹EÈ`ëky$±4 ¢ Ë«µ—³†QVV/}³(€ –Q­§ÛMŸKÚNæýl±—Lƒ&ÌĶòÖè²ò¶ÄRÉ÷y?(7þÞ­ƒTwȺ˜Q2UjŠ C®í#žmP ¶0 ἦãëä‹(f/‹FÅ1ôàŽ“H36¦ñ̃ßaBB®òÙœ- $]LkJ&gÔuþ‹çËWŠt>`®¬§Â­ŸãÆ#âË$GˆABTÚ %zº|C_Ròý•ñ›Y“,1?æ=]ÌpHT"Éí©ªN׳Å‹[1´0ï 4fÍËN›­(†ªbЩç*9™ÛÅnçØëP¨ên›9Iüþáä?·×ÜÌЂœþ„ € EëÌ5</¼•Ÿ\‡”E3¶}áù|*{ F.ƒFÚjT0¡„§qIç“Sì *3/³”ˆ¼UËIG[®µòÐq °Â®+é Eõªé}BfCuÌ“M/tŒ®!Îh•B wÍQ* R¥"RÏlº+V;> ÔBG©¢%ÓsÔ“½öƼŒ8• ‘Ž´mZéigÞ¿÷;˜-(ÂÈù÷šÆ0‰-GÁéÃ{Y*÷zI‰ŠJ)Aã…¢ê»7–ÿãHÞc=Z`$N“›%Ç w\éfðNú2ä¾Åöì7Ȩ¼¦[¤f©UçoC{MÒ>–”U¢¸Â½»>‹ ¤±êâT|NDýöÒm-Í÷BPYhì8H×B¯Ùß^Õž;[(‚t˜üù•¹2 ˆ2éNn™¦%“ &"â‘r€ßÑ%£ë¹ö»"­Q>\UJbDTýÍcrWžÀ•?Å0¶\S°=U-Þ¢¢¥X7í¥RDø<"`²ÆwQ*)HÆÙHßcòp‚©Ùê'ÞÑû>•'÷hϧd²øë_ ¿$èŒzªÈ›s0‹RþÚçñxô”Z´|Ï瓞Ï'õ¿üù»+ƒÿÂögRþBòŸÈkÜjð"&küE۽팧Ó~ÅÃCB„—Ì—‹Ü^*ªEO‹›/~ç¦{œ‰Ô“žÐ¯;øqà‚€jÉkü{s)¶ñòÌQŒð3k¿kСÀì–îVIn3þ)ïè™…Ëø®¼ŽËþá¤/þ%bYÑÕ¼1SýD—"ù,sù«D­ú‘¥âWP%¼LN$ßý¿V#|?¿!<Õ¥MçdÄÿÞ9žJ½ýÿ+CŸùlÒùvÖäHò+-‘jäBÄ'âãñ8m—ÌZ!ecŠØˆ @Xò"w¥R~vc.3­Zðñüø6~Gø4„´$òèZɂՖ±¶©>G¡ÃGIô5+ë~ ~({Øèö3%Ë(åÌaÙé\þ½ ïǨ€£‰Y£?=uÊ7â 4詆ä<ùÙ4Ô@q¿f¡q­2ÆyIµ¹jö¨;†Ž!z±UNÛ*·ÿí¬Ó8Œ½Bx‘m1°åzÙM ‰Gø1²ABW›Æ,TÝ‘n­ ËÍQÐ µH.ŠI‘Y‘™—¢àä V¨ˆ¸&z˜Âæ“«BícOíœ=äi-ÎÛ3ÏFØ)µ€­£Aà^à!Q—ï’wå84g\S›jP·§L»'eªéÛ‰†Ô)Ú bUøËÅŒn#±ô'-u4ɡǣÕatfÁC¯+ÉG¼©jä\@­PE}|tgê€*ƒ>O0ã!ç³ÇS›:j|ýÇŠpÆ”ÃAèGN?ËžW[ÂÇDèþ' ±Y;ýCÐï@Ä0c’w*¶çªrrúp'˜‚[€èWì¾ËLýsFWM“íÁª¢wq䇵ÿi&ïHúïØî‹=ͬmÆÃ‘ìõ% ¤"{¼šV™÷ë>vNZ£^e<@¸\ê½¼˜&¶M4q'´ÄåK º¼!^<#«¹b§Ì¬b6nµ iNu♢«ÒŸpÕzùßàKrGŽ'ñWs‹,ã£3×Pd~øUvQm¥õ¡Í¤:+Ìmxáz8Z±N™˜»I«‚gp$ÝÒWX¿},=ÍÈÝÃ¥ì‰iYÑY¦¦9 ™ç7U[l¨*‘[qUPKYùúŽw´_b@:­‹L+ü+¥/˜mèöíFTÑõdÄ’8yó~©Ô¤É}1f0‰ºÖ¬ST4ëñ“£W½ÄÌ~lǹÆN€ÒEs— ®ð&qÉŒy, K«Çs0½Hpp© ©'š‰ ”Á&Γ*oä£ÖÕÎô„l9qÞ°cØé§7ʩŇô^êù£Á]i»¤\{”œý!«jŒRŸNàäÒ1 tÉ{'@IBÚk¦(%‡eʳÖO’°¡J2Æ‘J>9vQN‘ Èu±’JÀj9y…cý˜6ÂF5°çá8Åô Ò Lµ ’¯¶¥Âu•tÌ–Êa) I–­s‹Ï–‹\¦r˜k5%’™[FzéœlÊI?üÀî·IŸ;‰ÓÈ4ò²g†Ò¹ñ<¢âcÉùOLN=¸Óç'ëѺ²–èIŸè~˜¥eÈ 9‰ÛAè¶&Xûnl›«Ìk9ãÕíÈÒc|.é<Ë8'Ħ«T™ã Ï¢`’LÇÌÖ¯øÛÛyo#Úç¯R=~!ÌßXqz<žÏÿ}—â¨úþ;[T÷%‚æïçŠÏ6tá¿ÿþû.ű»eÿeSÃwaÞ¯gŠQ1¦¾Ñå[ÉkE ˜æ»ƒžÑ·Ø‘Çãñ.ûµšgT§àx<é 0›ypùɅ瓟Ö*ueËi$o VÍégHû÷cm>wÉþ~~þ~¾Ÿx "¹ÿùß[™ïaü~® m"ÒùÍgS€æ'_fSú„Q9äó¢§Ž_jž4íã¸ÚRì¶Ì ½ÐõT L±+<‘.ÆÉ†D.±TÑF*24¾©=šÙŠVo²Ñl°3»–ÖìM—’iF…AÅõfQ뉰·ñŽk„ÃG){DÞŽHEå(‘±. ž ¶·7:Æol?(@B©Ưˆ¢9®Ê6¶£%Ž7NÀUÀM<ÌGk,úuœl”›bØúIÐúúÊŽ.ö*GÔòõMöË,GÜ-XšñîZäÜ픥rꃩE(a>½ §¤H³¨ñÿô›i>7d‡·M%u.ùƒj`¬•¼nǃžÒ*ë¥ü ¸(ÇŒ¬é¸\xfKwľœ~©Š&áã|ù]ŸOã´yGñ`Å(„îPjÇË»€Ñàze¤•Žn´Eߨu’F¿¡Ûp(³ «hwä·:²<è¬[`–³r#…¼ÞÇåp¤Cbð*4®(I¡Ìƒ6Ê ;ªÍxÁK˜†cû÷xù9&à:;ضçEÛú\U<Vl¥J`¨™‚*(Y“ιJfv©¿O:¿ê–ý¨¸Ã•v1«¬$³f¬µíóf’W‚ÝêÊL³7…+[Â5¼PŒO‹ îŽ#d±ö»¡).p…‰;‰l£ŽG‹Ôyfád"›‡ŽüU®¨ÌòRˆ{ýoˆ)8-ƒÊã±sHm÷o*]éY̪Ïs”|r 7ºb&¶'ö â'ÕÑÄ&Þ ™‰Uðš+S^îkLD¢$[§( Ö]¥4=j€p’®°nû‹pª¡ò,eóòØ,"Ï©CÎñ§-yÕpŠeŸÒÉå\8§äkñò8“$åáÐ FewF mß}üJS–øb:ÆÐÕ úU‚´ R3(]C(6A”}ê³4Šîr^ PŒªÄxIw¬Õ*<}.•äÏÆRÒòñœzvGŸ’á XŸ'Ä$Ía °ÓlB0Ðl÷Fµ¸f:ŸPâX>¨¦÷üŠ‘R ÀM·.±¿ˆK3ìHrþùIÏ'šùX94¨)Ìë6ú„#B³Œ dÄ>ï„+$Ômˆ‰x9ÛC;û•áXAC°JÎ6 ÞYS ÿÝs—¥Bœ|.r}”ÓźÇÚ%¨Íf¢HæÄ"K—Œ/”³'·ÍÜÖpìøJ=E/»g¸E%Sjû=Š,8‹³ì],Utb¶¢ž»)P%ž_­¸3x`ÖïU÷¾Ôõ“¦–üÚE}$„>4z‚yÍØ‰UìLèÆæûÞZÀ“‰át &Ì ƒ×wâ/ØeQóC`V}¯'•ø¬õvŒZyVÚTPºo^ø‹ü÷Ô¿J'çÑñÛm§ŸÍ£9YJ#ÓéùS÷6R‰héRÞÀøHçk~¾#-æ”Þ»ó‘;*Þý¹ãV¯‹ìRöàþ¼eà]ëÏ„á À¿zuÑêß=ÿòzÿ©Ï™x…L|¶N»vBÑ»Võ¤B«EþÆ ­4–ž9ÿKmt©0ƒ›¼6ïøÏq $Ф{w¯]¤ 4Ã5ü­rlèôå:ÅC€Ë6{ù8ñð åêÃKur‚êþl%q­D9po‹(¶ÿÿ^§åûùp_êBÀ÷ÓzÙ`´·'6½4àéL)¼ËLD½’Dújé» uÒùË#Z¾ù¬¤­êyBWOÝéÕù%8oA.VÄ"€KžJãv*axÏØÛ×”ädªøºÎu¶jcûz<;×!€dEËK¨ZòD3Ìdãú&6N$ ¢Ø\Š3r&íàÊ©÷oí6u.ÍY: ΄âÅTÖfܹ³I!è;<).Ù‘¢,å ?’¡îpZÞÁ=ê©‘¹ÛÕŸXLȾn"_:«fJFEC˜ä™ñ/é.oÆú2:‚‚Õ«³Ké!çqksjŒ˜M7ºqÚË—ÉÑ€X×ÉWØÃ°Ñ|¢‡Ö/¼¬«§aù»Í|™rŠG §Óüøï“§T}}>ÄKåEEws ßuÕÔÁ,ÓF½Z¥µt4? îgÞrÝ׌s^Àh—‹«'„ð|ŠNÿU+p 5àx­½—lôê3Óˆc¦FÆ· üvp¾óÎÞ~÷i©4F"%¯«=¡œ=É@²¤4GØÉVGÌK/È.­C0u$FëÃUó™%+ìçö7\ƒ*Èïô$ñCŸI­B71Ü ~,Ñ2ÈmˆÇæ½kÛ¿ ·™ ô×Aðc~b<Ø­¹ßSú®‹ACihðiß›Ö÷ÉôÝ:ÙÔ¹šgH&"€¹ÜÊ»Ð|™äU}÷ï4yã¿B:/ág–ÎyʶÕXp‡A+ˆ¸‡çÌ?Œä|¬JGüÈdµe S‚Qª;¢‘Ó«òH •.þŠ9àĶãGçæPpf*{–â j,¢à 6\Þy×½“”Œ½ÔèÒqSý%Y–œƒ(=Ïu’M!BÎb_m Ÿ€,ð~Fq(@ÓvµcbA5–] §-À¾BB:¤ ðfk0ó'/×’v5üI 3OÚe0iïòÅDQëõÒ‚XAÂþ$˜¨M›8l(±@Ën©®Ý¸˜$)çj™Çåd«s7Ûš“$øvÜõ™»¾`³)&0HƒX4 â°6˜c’ØïvÒ”£½RXÉ®QüÁÜ*ñž€Î$é*«RæJÆuS £Ø­EŪ!Ý¥¥1BÒŸFÝ“ê;›a\ZC\’.ä¬PXH^ÛEèýMá‡ÆÏ¨ñ<'ǧ'+ :€{M“IŽº Üí»h lbãðûÛ<·h¥S69͈Ix\‡ºU‰xØ`šêù—HçUÛ)íéJÕ´1É€ òJo­(òÑ»ÎGä¬ p[±ƒH?ÐŘ#>ö³Žp+.ÕŒ‡žðå‹bzÐÕ¾fµ$O¾ù˰)¶³5ßßÃó@/XÌËÇ¿ävôðC^+¢Ÿ×¾ý‹ŸÓL™ÎòbÉòÕ®E5Ý´5D/R”àJãâM8©rM â”:óècÏ{V;Ôj ‰Lö­ÒÅ Vöo$öõഺʃ®«Tb2Å·Ž”wˆòq«`!Ý.Ááè: ë¯à’IÖ;’îªêÖ²úÖ%VŠ÷Óò¤«$Gw›¦ªiuovOëkË·û3¸I/õK¯C\¸&¿ø®8C²îE’˜¥Û,XÜE2LÜRÑøÍžç{Aà ¹òGrï8ãË.Õ«"µåûÐïäEªô¥}˜€pJ?Žtþ'«€8+0Iv"RJ< {ƒ“\æÇŠ îÓ»w€œÏ÷·)O¸ðYm|цjpÍ%‡d†½&—.°³f+^çé©ÎªRWï{mt{uy¯e>à 8[dþ9&$e«ÞVïºYú'—»/-$‡:órՕ׆I¯ß$ó÷Ý®˜,~ÙROlÐ2åê0L±íôÝ6v‡“Y³ÿ•×ËÅcí3`Š®òœÚ“¡&¤Éª”\öQÑr êó#%Pl&Póý^`ä—ò¦Œ¬Ïš´+Ë]|¯3×Ò,_/쎪âJ¡~ü% ¨j¦´yW‚ŸÒù¤g¥` vDð Å ™YR 0¿„M裵.0¨àv’bT”D_zèÜ]‰¸ØNo¸h®ßï%ó#"­°ÇÖÈ¢œ®Pç7˜V¯¯ï ýØð⻵A"öRmr -•Û·À42¿·È …òæt~©G¤£Î®EÕÏå·r»Xò‹ê©³¥p{•ÖfÕI[uŸü¤óD´ã.6—œ¤ ö þ+Oía:E»ò},“¯ÌÇaÛ7-â´ìÝÈb ðQÍemX¨íw© ¬Øþ !*⋨Døåqm€ñ¶ˆ¸o=ŽhÊ j]ÞYó|>×ù‘q“=ÏòQ÷»?ëñcž³èçÞãÓ’òÊZ¸;2噯ZÖE#OùD2Ž&WGG¾…QêÈ–±mà½!”9Zµí²ÞËùUì` |éuž=”Òâ@A7S×>J ñôÁ@«ï_ÃÍ…„8UÍ81´ãš[…4¢t(ù<1 2¥™Ç21DöF\_³$2•¶>áyÁ2YMwB1 ˜ÓèSÌË„¸1"S·©P¹*w,)Òý½cD_yE„èž}FAµû2;; uV oÕlž«ÉÜã@ˆdZ·K"¡€’ââ§H•(óèB¿×ІºmžÞžfeÄä”NR"d+&I‰W;¶QE‹@JØÃûñvA+[ˆP›?ŸŽqªx—f¡çµ=]Æ[läOÜ¥Q÷, â^CÐ]Ì(¿‰kˆ…¤ó@oÙÉ–2(ö—ÉlÐÎY%Τ}É. Øä²ž8‘{ç…ñ––‡óS î'V–Tæ"”EU!Ró:‚bÌ2=À¿ˆ}È)ï"“eÅc“wq‹o>7¥0<)oU5O¢9Óô©  &)Á3‘ø)PBŠ(T°Çè-‹¸Æã>L\'øcžU3„”ó“+Cp J…T{¤0ÿ0é¼|ø‘Ø¡ž%œõµÚ‹¯æÿ[°3‘!È=o ]²Ø…[–8©í±ÿîŸ'€_ðá¾ß -ûe®Û{Þ30su¤Al¦£<„à#Žéé2)az¡øRîp6°rhÓ¿ê>ýDS^.NÌ®‡l‡_ö0 o1;y@Œ;¼Ë7àð’M;[ÿ?¤Öe†âËꌨŽuüd+¾ZlGS$X*¨¬ ø]S›ÝùÓ€·iLëMÐy…uÆÍˆ €¤ž&N.,#Rï­±¡F“åŒäySÄœ£œ4ìá:Íg}Ï©aO½ZLõÕø:"â{àŒíZrí´’t‚{ÙòB8S$òC쯪‘Êùø€KƒÃ¬Õ=¿é=¦ŸµÈvY^, +TX÷\ÀÊèUkXx“ÐäôÐô’U©Wßàëž•:¦É8ÓÑÖ°¶ŒP«Á: ´Ù9ÀUŠŽjÂ…G¯Ÿ9uæg—%HN¦Î*ÎŒ<Þn†®äI««Ç_N:O4ÚAjzí°1ŠRߨÛ~~ào}#{ .Hý{4³ØÖ”§…ž WÏmݧð#tf u€ÿ¢‰ZÒá4-Õ¥z2;ÊœœÐñаµë¡ÏEÍ}”èzŠ'U!`#a&µÊ ¾;òþ°#jÜÁzªûïvaàÝÁw{ˆŒ ò´LóKòµ<Ù­»":µÉ ‘ µžÐ˜Ôáå¢"´þ{HÇ™Fï;ž:Êî\—×-é–ѽÕúñwëgQœC™Í¢}X!º,6ç]¾Ït}õÁTÇyf8l£”re>!´ˆsÐTpxÉ]ëÈÔg¸Ù•`ˆÒ_IÊÏ1÷”Ó)ú÷Hç·Àtï@÷ÖÞ¢Ös׸Bz2W÷Æzƒ ñUfô-áÌ`Ëy®¤™ŸˆÒ!À¤¨E€Cãݦ vcb€ðÂϤÛܼ»/ÝÄ]ŽøFñª{á2 Pmˆ*yŠ6¾m^ÎŽžèGÓbìx„Ä´vƒ?¢é¾ÒXòÈûœŽ,oëŒ2%²ÀhÛ)õP4›‹ý/>J0º·ð¤ý{Æ ƒFcRîø*ð;GK¿E:46€)0Ì=×`(€˜UÆ‚C66²È˜-’î°:§%e{¢™739ô‘å³Ó)6äávp:â!ânS ƒ“]Øf<ÛV㑲qˆ%Ù»2k1RAîA> ™’·$=\ ¾ÞýC(sïhïÒ­]”ØŠ(>$ϘØ/'âèÒäÅö%+0DI5tu²0º¬«¹2¨ÎOB<ýHœ%_QkAáEÖ;~úúšwk¨!¢Q–“O SÐWñ×fÌÄ WU×Nç zd_Ž…b_²:+á§r Lë…í†ß Æ9š˜\¿K°>z&Á,ês„¹)ýˆÛнhô h×*Z¼È<#O¸‡ #BÚäq¤/Ú Òcêw§%ŸxeÀ µÿaKWrï¢gÿ¡Àêjlµhãâ]ù·¨YCm=¦pþA†F@Ðãé¯ÊAØ8³v -AD£á“ œŸçiÕÔºªc‚ ýu½”†w”2æ+§ÉFþå™=–TåU®åuL¶¥tDŒ]‘§nKDŸjx´ši¡?uK(¸„¨Ö5Šo¬æÓó\¿—)sPª©{._ò“鉖˜2 )œ=&ôÈ,@ äN†ªxIÌ“Í:b5ŠsÐúlœ;uXŽÑêÞɽ7x£^ãÚWx?¼–`£Ÿ#¥¿‹1*âðõã3fN¹BQ,“s€„¤“~›5õ~]"j;‚ {rE¸lð€1F$˜¹§éU|¸HöŒ²|ʥ˩kxe2‰Ê½ª&QßT.X;=͹V„˜š <¶;|xÑ¿©ñˆGÙAÑ !‰ãŠ­œ"M]]ªÔ¬ ¢µ+Õs›)±^‹P éŸ'WYšQ´àÅ6Úµ^æä³Á®ÔF@‹kZ¨p™¨i©OÂsÑ`XŹ–뀗 MœŽœÇëñõ*µÄX^‰o4[9mO/¿Ó­€™LÐôg±xQâéžAX÷Ê4íŒAŒÓ%w°ÏWö_¿`wÄ(zUEtå'>ÕÊ~öÙ! òy ðHÎŽnb{ùçdÛQ=¨¸áÉñ2î `•6Ál 6Í› ¥yµ) ЦiríFÁ ð²Džã¡;.ITÀÇ[E­C õüÂùßG\ÓjfU÷YûI€ ™puvÈ-¦Á·pŒzzžÚEIŠ`¬úœ› ,göÜ:"nÅ׫„Fn`,˜‹1t_ÜNaçúõáãü›œšyÏœŒòèÈeçþn€¨Éñð_Šˆj¨RÆFÅíJZ§©žª w¯Ñˆ¿'òöËuñ>:5ÑI{¥0Ðe»ÏË¿ãìs^¥_pæØ¢sy\}ÿ Ë»ð\€0CSu&­ÌÇ ¸eÜYp›8£\Üô¬±4nø†Ç Hr÷®çS»{u¹_ÿ2éÉ;Ÿ%yø˜¬Î¡ü½*ùm…—î×úùþƒ6”ó9ç¿à…‰âXžÈyŽïDñbÿ{=· m@_Jæ;‹RÒO-ŸA½Š±xãƒþqÒÕ<´v¤TÏg|bÐgÁUÃE­¯«z…çMÇròÕ–MTtg"!âýЬX〄P@ƒáö»k]òŸÝíc;Äâ€ßD 4”¤DK½b!ŸlL ‚ƒÃàìC|gy°AÌÁëä»5‡lÅœÚsÞòÔgƘÇåÃÆ·{ðoŽQ錈‹OöÀMõòçØL™LÃÆ­òi ÜÄZI« Ös'Ýž;‹Á?ùÙlŠž±Ê®vãZÊ»•Ó+7{ŒJkÒéÆÔ¹’¦`›ÉWn°“ýÂÔ}J@u|pV%óÖö)XŸ™§MHf ]lV¥ÇßB=V3³¶ý¿7pOÇ̪Û÷ò[G1v«£1§®úØzw)–ˆ¤Èø4X[Ìœ¤E÷s¤´J}‚‹ý(¹Y©#Ê™‹]øz_⪑bæ:ø2åïIÜû6Hru’F˜GÉ»/¶§­ ñ÷!ú¬3ñ(Fp)À΂Ò îˆH¿àäñÎ)vRÁVYF¦@<¾IÎZg-dkÛØˆ¥76ö¤GGlÌG0Æh÷­ek‡ˆDØY WTV*dÙí†l³&¶~½È Lƒ‡`~üF‚Ò-`ê1…K9Rmd‡k6¾:Û1ê%}Ä„IÂlc†üÔG¸Øä\.}œé Ìµã‰¶Ï…çîÂùÄÉéáÙѳ![9ŸXÍ*›W`^×Nè’¢d©påG)zÕ“YBCÑÆNAGV{¯'çMFç pÙ¬“£Y˜…2qLz¡qæá™±>V™«ÂT¤×ÍÃNš·±îä  ÆmB¢èG“'NÈs,V=‚L$a£}¢$rO‡÷·ê ’dÙBæ]ñÊwg’å'…sm¹ E’ßI¾ ï¦a#5><ÍéËï´òÛ¡Œ5çM Š6SÒ¬bÛZt>öÊ»oŒS*”>¸§qစòƒkW®"Be†°èD™ƒÒùRF$5ØÀÌÓµknÜõŸ6ý„Ôç›ò”®§âùü‰²º]Ua%im¡l괜Ąæ4ñÜE@{Úº«ì¿ ûõËpƘ+‹[§K~æ:(uT†ý™2&Ód)É“E‰¹Òz£‰ÊoóWxÈ;Auï(·\˜C/#–ÛcË’éòÌp†IËDPöèÚ * “= ¢ºr5 æ–(ßÛ‚=ï(þÛ´à»q‡& ±r¯ÑS†12áQYÕø”euãi•å@ö[¯ÁÄiçè±€g7r‹»?*ºé—éö—ºK²Nß±O£Y}TŽH­¾)¬õ‚]Þíµšì6FÔs©‘£§W˜ŽP É7~.ýRiØï•ã»Ëõu­6Õ¡rUäÕ4"¬“P/$e]N:0ÂàÞ’ÏâH”÷¹=D}4q/°Ò•TiÀÎÙÉTûÖtÚ¯®ØfqÀïÙäj¯z !j ój! 9ºu{<àùL: ª†,|Ú@¶<Â"ÕÃZt>ßrÆÀYW‚áŽ+Ï2)ðê:G¯¯B¤X@0p=@«œ.­ôM¾ ÒäP­[•뉼?•sHiq¾º“¹ÙÒSLüêÓ+¬©†¸‹à –cÖCäá°˜S‰î\帖ÆÝÈ?©ÁÒR UÔ§)¿š’ÆooJÈ>Ížsç®/Â×j>|É9ÿ¾³¹E~üd%WíÂmügUý¯'÷›‰Fñwb£ÇWpè¶Ÿ #Ñ€iæÿþûÏMÇ\BIÏ'=z(Ù øx<º§ù‚A>‰þ¯òÿ†ºßÏÒ¤W)ŽëÙ{éÆþÝÏÇeŽ~k€¿Sœ´>‰*ç>Çì›~ÿq¹N|Œ>p3‡ª#(™bèVóçdqèÁ‚¹Êzˆ–x‹ WKòÊîwÐÉß3eÓZ Ntð…‡åz­…Ø:´hü³A[‘åv¯ã`H”¬püÃ×-P=rŽôxEnÌ È1’+j ]Ä;» Ïöò·K‚nhж¶„?ÑŸy…“<©HÌá'°£ÉñÁ ØèIæº1½çh&vÉ&wãf(^Ä]Xx´= Õ&ÖÏc%@–!y@QOv;—“ûìä’Ôáþ•†·9fó&kZìóµ¼7æ “^·ýê°2f3î ¤+xÌ!ùÈÍŠ¥Ééä‚®I-ÕgÞÚõP/®Ú–!¦*4ýð1Ux)fñÝU·šÑ¿5•ÿ“}Ÿ’)½,²ö^cÃ}'F. ¤"³#jÌ ïŠmì~«ï,ŸçH£Æ³ u®´!؆:ºÊg·vV¨W¦~Ë_•Ôüõ.N÷ËÏŠ±â ön;fäŽ97Šx®^*g8±Ðo5¬xc¢g]*L(QÀ°5»—=ØÐ¼Ö•Òy<î‹â³33––¤×Û5”ÈÜÁ åÈqb>Þ©ÎkAûFÓ%âŽÙ0’>Åœ/éõS@.hFìswÛÿ ¶äÃà`ÐÂÔ ¯*±K¦/¬:®_ GýŸU@Ã"r–'•*(´Êc»H[;4Ò ½˜Í# ð쯢Öe/fSÛÅ»¹©<7Û㋘dÊ3ÁŠÚÉè,§Y% pÊ'Î0‹óM*ˆ9m(CDa²ÈIÑñÇÆ6S=#)a{ʆ®R>ùDÍ©i×Aµöžd®?‰¯5"P~2ÖÒ÷‘S‹YÜåÞ}‰¥sÑO q¼G•í¯!G¤NNÎzåxÖ5Hy 祡€ÐK‚&Á…}¼eÐ`ïñÜÎS–ü‡?UO˜aiüœ×‰X¼ê+4=ÆæDjˆxÿ×¶E@𣲼݇§3O³=¯<ÿ¿ó8í´nyŠß¤¶Ó¢E3¾£82d¡Ö,Ù­²1¬ÿ¨hÅ=ê'Q 瘀"þо’”×7fY õo—¬ÑÁ“yŠ,¤«D€òª-åx qrOEEuYõqÇDxJ ]$ó“ý æú9‚2áDbÜëÞ|·=Yó+……á.Ñ/¨ÇsÉ‹y6u¦Æ7Šq¾5»©KÆëœw)bñT€´¼ÕŒíp y}¢£ºL‹µÔe%VÔ%V«ØsX¨9Ñ…EpOç qYlæ ¥ô!o°—ô-xÙ@¼ù bYQGÀd’úM‘ŽÆœ/»õ9¸É&@À:•¹RC°9÷G‰.òZ¹.ÉûŸj;Ê“Ô&% $0Y—b†ZÈDÌhmA=c¢N&_9GGœ’¤4õ®ÿ]Û@¬qE±¸#NDä¬ ¹Ú 4¯+F9zb£ž¬s­kü¼cLç¾Ð”P$u¿¯:eÝ_õžž@– nZSÄ+îä BzR÷¼$ÿçs(I:2•±ØÊ ì#h>P"´l=ɼúópr_eD¬“\K2’'¿ÀX§…àÛS@QšŠ½<"ŠTˆ2Ñ$ë½²?¨*N6ÖTAj\D9áÖ¬”Øs’hš¬>GÊ}¼hB쾚D¿Ù©“ÓwݱÌDªYw,-_EÇ|;kcÄÇHý’òY¡7I‡µD‘ŽÃF[Rà£38óQp»úè2Ñq~|þ¥1(~4'o4\MKéc…‚À7ÚlÄ_œÅÂÖØhÃãñà\ÁW5ËLózAr†bíÛÝ1R ß5M Ï{…TM=ãòhtbx cÚC7})Ì(´±jÍ–Û¤¶=zb©?mÀÅ&#üyÒydDP;| IfqÙÖɦÉ Kmš–OCáuÏtH[¶æ“ ´®@Pü“øŒ_Í?øyq?è}GÑÖ7ùöÙû鿟ïçûùT“ö±N‡o1 û~óçïásç}¹ ®YÁWîý†èod8•‡pŒ" ¤—ŸDø|>q´ñ¶t3,«¢ö$B"|>ðAÛD2öDë†âߢNAˆ¾Ÿñ‘çtŽŸL´9q³•ÿ€þåQù3‘ÔVÏèþ4êê´ïçJåßI6ê¥4æ¥w¾âڈ󗆭Ƶּsž€S Ðût]ùÏ<ê­´ÄêH¢¥…½k¯ÙWko`@‰Ñ{Ä^zŠ&Ç>\ÒbŒÞ6œ‹Zm+JÎÓt”¨h3ïSº[/wå eaÿ©;zràáÛåþn±]Òža·S¶rhÝ­ï•o2=•’ Å¢ùôL§`›Ê$Oü:™ÑNã ¸M8QUû§3Ó^c2=J(½àD3èn,inÿ—mpÁ¦olû¢¦ËT ²k㼞ÜN=óÊijÖ[œê6àt1ßPƒ6q¸>+"æ«zëA? úƯëµ)';p:øää9”!0?‰w2íFt;>) š]C¥‹JW“ÃÖ … û+{éÅ6Ø»ǫ̂W.>¹´àPGÍJ±î…i2¦Âw4iÍV„z h£BéøA)¨ìÊh™Á³›EDî’©³Üû÷AÒ ,ª Zâs‹ Ÿë9ƒlªÚ¥Œù‚D´ího5ì©1âíc€„ÎpõÞ—½õ[ršK8ÃO=JäD3ίâÀ¦Ú©O<Nó÷Ðkýóå¡è›ñž°€° š ¯ÈÏpÚÎn°G ˆ(©ŸÈ òÖW»,nèɨÞz¹1=Üh¿êhÃÉ™©° ¥Ã79Ñ_töWÞu¾ù&Ö|dÎLwiÈœ¤uÎ6u”jG51´MBÃH8™ûM Âຢž½7ŽÜš‚Eº–ÂÕZª¥€¾78ËúTgÞÊ_˜'«K\yuò[þÎz}–҈ؖ¦á³•Ub²—բ˷Ï8¥þ0¤ W9–J§¹ «Í»þ݈ϭv,©>_iÇ!­ÌÜÕ=Ùè ü6Òy. R ¶üâNpü©I#VKÄ\Ñ7P @7ôç[7 ç!™†Tf ø§Hæ¬@?ó€Ï)1à ^¦§Ù!ä‡Y*{t¦%sÚqOëtî8v{ão«F¤WÌÏg B÷1R!Ó'¶SlBA8Ò^ˆ )q¨«ù)Hâ~ÏwMˆV¦"Ë e‘ÓcìªhÍ„ªezä¸Òw¨…8õs¦Öæ7 «Ä%Iï$ÛÚ`gnÕ#è€ÝÄw"¼I†ŽôIG}MÆ+Þ~ÇBv#Ô3}¼ا¹6vÊ•T$½KTØ6[W?ŒÀˆÃµ±)@áQUÐe9{~ŸÜì¿«4ÐdÞUŒjË»BAíà¢v²8*¥šFb†`”Ñ”/ª"Û5ÓP9º¬›ô4My"ÄÏáöô{c¯cãHZÎVÓj]-lÁ"'í¢ðÔ•OÜïÐ2AÆV›«)}Ê\í”ÌÆ@ëÔ¶1e®-óÔ‘ ^:µÈn50<Ò #7{ÀˆVÇ@ªfËH×Ü-³µ1ÅeS<&/Qò“¬ML(qòü]=_VÉ»9Áç@¨ŠˆÙ¹©l“¹ˆ›,s—+©ø®5D4žƒÊl{/&4¸EÅ„©åÂìäÞW2,ýY*Ì6å#Ѥ+ßP’»)”[UËI¹bG’¶¨Vˆ¢¥¾Ï¢ 9¨6×Eäý¥è Ã#¤¨Ë%â:“íÊ|âÕ~x]`R¥›Š…Ó5"µfò&†.Œ»©s_=ÈV%lTõ V Óø¨{Ì(ûe(2±¼`¾òGI绾"à¤ó¦¥+IñHfI ˜íâl¶_üñøRƒ<ñÎþ£”ùÏß\âLÂùÀ«6`Á£»âqvÄX}¼J¤¸5 ×lÜ%Ø4Týõ`:lW§ø#FGÔM©¨4ø¿EîÔ«4Û àöS@ñ g ¿àC>xø0¬øâ¯#…øg›>¸œpæ™\9–÷´’ø{ÿzÙ%Zx<:q¾ŸèL‘å1¯ï£Hìú‰9z‹2¹yÚÊy¾‚L<Ú>\.[ŽË®dç8g¼x÷™Ìôêùøf |y•ñÎS]Žu;ÝàýÓµ+Ù{‡´i4€$óå—Vþ‹ûúËÞ·ªsÏ󓘆¹N[à2¹§ì¤û~>õÀž÷ê(¥wô¥5©îæ¡:µ ˆðoÛ£ é<áì=ó¡Ô—¼Ô\N^W$óc»U}ãx ?½ÍÎÍu/Üzº–,ë‡ùPõܬûlßZT¾úü;®êôŠùÄF¿sÚ|¯zÓl4_ÖK`û¶s2œ|­N— H<á–š†s4^ ÝÂxqDÛ’çÙ ›êÃϼ;­3—RQÎÙò+c¹eâèÉ’$Q¦¤@«Šµ/BB£³^ÚŠ2<(ò)‹õt@0‚è¦Rܹ¦yé;™ NârßQÎÌÝ,ò†oÛ€Vtàjaç~ÛÕþ&u‚Ü€x¼ª›ˆ¬Ÿrâó ·M«“-OëXõDGæïyy4û0ôK…ƒTû¼0äñõÝT÷õÞù÷ÐNñÍIÓÌYvÑû=ºÄ=‡Âýï@ŽÔçò¢+ýEY^öiV¾~²PÑÛ¶Pl³ÖaV ÁAD=Ÿ«*fƒðÔÛ-]Ykó2I@OjC›äHá+j¸YÉØY¡x§#R'ò@‹‚q{ã çÆŸ3‹Å€@ù0ó·êHüœNS4~E=WIÅ¥ ‚bsîµæ…<“«ûèó9àa—ì`lÙø‡û1ªW:ûèæ€"Ϫ!.V¡‚—”òÇNf(¿ UÃðªª(ç2o:Sg0Ð+~>­ÖéWüq*2¹Õ}Úˆ.É­('­Zk0‘m›Ã;Ó¥‘ûÿ/>cÒùí[nY6uúÓsé‘<Ê»+2iŽaw€öÔá)#—\:jzÈm}Ô$a‰C©˜uV0&üt%ÏFu¥ÓÒÅÿÏ‚+B“À åÉR˜‘ S˜è¯Ùƒ &M–ÒÇhKN<0,êMí7Ö+jƒ‰‰•Å œ‘÷ü?Ë^`¸8p .˜þžA¶ ²0ÆïQ@eYÑi±?U¤î#’»O'M…h_òˆøEvÔÐÅ:HëÞµfÓ=%ÉAi¤[§ ø ¨ùжÏt€1D"AšÀ!ßlÍ‹"—nb¤NW?ÁUIHùFW€É6OÐ"ÎY.ÀIêÜØ#%ž@>2T²Ã¸¹4ðÎíb¢~‰èñ@€GÂO½êÏr‚lt̉…ßÇÉ¡QÖLK2åí,DX#‘ý$'½àø D¤»õµö–ºÐÔ„í :C*bD=OB­–cü§nðnù®hæ˜w^ÂWÄ59†WÒMÅ`yŒÏ¹,bÑ8ñ‘HÌø@vo^Î]èJǤDLÜÍîÆ.ð:ZÚ·³{ô ^”eoÑÁô¦¼öÀvâÞJc—øŽþfµDö ¦t6‘ZÇÄ7^c;c¼‰+Fšˆüäp:`Êa¥¾ïy…¸.sŠqÌ ­]k¡®‡m,wê˜ûÞ˜:eÔ‹—L†³ŒŽãÕ±úfGzùCé’RØÒìÏü}¢ ¯çÁÐ$ ú‚ÉÁòS€i$J¹ñQnìdÃYÁ<‰o‰­ ¢*½2éwq¥ÑMEVê›êí¥t|qv‘ë(†kåU€PÙË”Ã‹Ñæ@¡¹ÿJ1ÃaäâŽÀ[]×(äcÙÌbº”`l/d"@ûDæ´«D’uP{kŸŒ™V‡¬Ÿ5˜L‹:V æd—c“QŒ’áa¿ôfÉi‚¡•Úƒ›R‘¾¶#æ<"ˆ¼E‘kê’*nÔd€­¢Ù&¾}¸dS¦ŠbÚÛ”G©]öº=Ÿ”Ƕ‘á`—–W˜Ì “4ZµiÄ%3p#—Яdê-×b4¬Ký­Û¨ê­9j„ ͺ(Wþéd‰Úy€ÿ„— Tá<Uþ,×ðçÎÊb2`ð%Ï‹ä$öŒËw;ç_Ü×$–ŽÆ r7ÊÄ5n»hÖ9UçÇ»Ñ᫱jARnDÀ¬wp*œÅÖÃ¥G:²A¥àŽþ_Wt¾.Üÿ­±ï vz@¾¢Ñ=šëü´“uòìßÉ>ĆËMÝë^oÔYvrE±Bœf'°M|Z¬=ÂäMÇxÐöä©Dé vëWÁI<úç/;çvÈg˜c m$4oš^±ñfHŠèãK¤:§íL•Z8HôÖÄ´×/àþ]‹w?À/MyÜô"ªT~÷r9å+ÑzIe_dâ|#>:&d™¿AôûxšÞMBi°ÜR êå]ÞÇBÀWO†M‹NŒj‡Ÿ‚cî]ÒøPD„ºkÝ_1ñÏøblžeÞ}»fms&+7×ÑýX”ビM)†¬MŽO6¸«¢‰aÛŸnTÅÃYMÀ…Ü ú°;ž¬º«è›<|LÅ1SemÊfCíþÔ(”tÚ X6R9ÝE»æ¸é3ñÿ6õš¼³Á%!Ä7ï9çÁ_Ò*QKiùz7ÚÖÞ}îtDýª/K®Y|’‡ê!½ÿêgÖëƒÊîhóG;íKR–vâÆöj¦ìléòrb‘œ²Ý; IýÌ‘kŒÇsâ mX<ó‚ +üf²þcjÛH·Q¼^ûÄv»änâès ¯–«‰äüzÒy';%@ÞˆpZ±eF B±ï‚ö÷ã¤mŠRd‡l±±Ñ‚@ü9ÛlþÂî”5K‚°c|ñ Î=˜¦î–#›&ìÖNÅq z­ìqíœ80°5zr4r&H ë¯H ¶}8ãèãã`Úà¤Ðùdâ·@ÍÔA2ÉÕÿÒ;âÕTC¸ë Ÿ·Z˜²Âp H¦u‡ƒðI“ž%Œ0ƒ”N RŠ0èŽV³ Lö"ã„xÔ ˆ”¤º™ìhq…ðV±¤z >‘âñ@z>©V™>Ø™š‚#) Lµ<Ϥ,fŽ<";õf€ñÞõ¼¬y‘ ÛIÁÜÓŽÏç³®ú³¿Y%³qv1>. "ì°åà4EœZnpû|ÒãAnùà(ÀI$2<³t¤-YúWIG1ݪ»Y•bŒ2«„ô`Àk;Õ˯©¹©˜§ilˆQa+ƒ`€ó˜F!ÜcŽ&œœè`sÙQÒŸÿ$:ƒîsmɵ£óu‚ÞUhšûˆ[ NKÝw{:ƒ¢×Ox#ö0­£œgÏ’ôŸzT$¤TŒÂH¯BîÜ}à·Áa&ÿÎc[®6K™À\ŽaD2ŽC3L»ÑêÉ!o'6Å_É}'Ž#Nr£†bÈéûCâùo=è°÷6¡t‘FÿÌêÌ¢è`º5<—;f9úˆ€Â!e@oî¼ûœc³!ž"'¿sEÙ„N&3ˆ-D£{Cf‹ì‚kJŠd/‚h…=ºsëJ؃Š€â\Üh¯](TΑ=A»m’¥1ž¢мýÛØœ¥J £¿r²#Öua!€Iî2²ÒK¬Yu[ym]¥'ÇIQÿÍ]‡ªwô”§Š¼¹&lÀг¡-ããˆAiªd²)…ˆã€Aõ€ÝÕèN€dË"KGÖÜÚ–½‰kä]çmÆQjQF±?^ô|ã‘—‰5-r*Yê)¤†YåÎøÛâ*Ø4EÀÄ ¸ñiÀ£Ý#!¿ƒ#+&Á:Bý)ϯyøV! ‰h¸Üš“õ† 3š°VTv¹b‚¨Y&›ö¾î¾Ì«Eî¤ö“ëácE¾¼¨ì¦³BG«0h¶?M:ßBÎùÝ9‚ºÿ°0íK&Ë{«%(­‰rD8Æ'¹ ;['XmJÛGÝ‚îÆaK” .«>%+ ÉRKŠûΕáÔŒpo•xb…—‹#"±²³À² Ÿ”NÏ1Úù ]DPLäR9ˆ), Š'KÁ7#¢„õ1QNYª9Iw!à|ÿñˆfa8§Äãs'divP!ÄRˆôš+!Ì+†¯ÊߊŽ â.ªH%cG£ö'Mšg· Ž ÃÐŽ+½ö)àÀ탴×ëOñ…°¡#Ô“ÂdOT„'ý`ΛKo‚XñòBâåÂ9D «a)ˆøtÎS-~R·>è…£¥aj¾·ÏGåüLl0ELû‚ŒÅ8U[ÄíG•äxêÊÝX (±½Jùa@館xB³Fó£ó1e­YfÏ¥dƒ)¼Ç=ž¡wm’¼Â…'tâ¼Rβ­üÖ2½Ç$<$&«^ø.ÿ6=Ÿ¶«˜ï;©Ï#èŒ7á^^òFÀ‹w'ïÃeá﹫oøõ"ºUÞ¦ïû €D-LÙê‹ÞïáìÁIÞÝi$ý—Hç)´×äöþ¥Ïy‹v…MÌÊ–?oÏñ½ñÃêB5 ¸ŠßLå’ RËQ ÞjX…ÿ¹“ýžïØk,M¯ÂRµpCUŽáäæÌQl õûÇsÍ%ŽEÒ¼yIÆäP`9·—/SnÉ™âýbnmjšPS€Ôp³ã=ãDA‚gy¡£v“Ÿ/Ñ]{%À ‡ ³<¨¢«L¸F_0–¨5mÇ÷ûµ!*Ÿ²a¹3,Iž¥©¶µý:6„)KzPC_ÕÙ"¶Ç'4ö¡Zó$yGqÏ£Àœb̰(¸Â¯ú¹2ÚÍ!:æðÖõөΑÉ$ 1ì.9=æŸC¤sVBU»}ާsmm~G« 9¬¦i<–q ~}ÙXA£ÈЪV2I>EÍîN¢¢Ò™”¨Eqz£ÈqzìÔ¾¦7P6ʤˆãRz½W Lí@ ÏŸ«³Á8Ö™$åA|ÜðØÙŸMµaT0;9?O¾*FPIô2Õ1¾²æÃºG®ZoWWl†Æè4àú¸òuH˜#ñcgCÐ%L‹êÓ‚ÃPf ·ëžËà«b'·ÞŠD¾ õ`à†ú}gýíLn‡Ü²mµÒ@ûU¶ì$MŒªz‘ñðçÏZúÊq‘˜¹é¯¨/®¬Õþ²æ4iÉ!=˜HÅÅ=2Ð4çèÚ 1NVíŸìþ+zË’,4átÀ±&gñ÷¬Í¹õ5É•™M!¡ÝuW|Õ°ÁÞ L,ÚaÑ! aY §) Eá©/dï…Ūkýî"¥$®:G_qq¹ʲ²Î¥†QÀN½â¸J§_Ά—„Ò)P_vK°€«^‡l“2#è²v‡ÅLÇþÒõíívï¢å—å©´—(÷õåF'SÃö¯;²¶¸Ý¨e±ç QG7Æ-¶ÆAQÔÝöíá©´*ÊHjlè¡{ø±'âYrU)¹’ˆD®ƒ™q\⃥nn9ÙÜe«üCB—Z€€‡¦&g'ï±¼ežDs‡ž)é^Açoì.ýãñ°™¢Hç/5F$»r±¬ë) ê©éý'$œpb¬¹Ö/ÿÛ¤ój80!2–R’khüÛmL*0’3/3ë­›^6›ÊwÙ¡Oz’t®7%r;S¹µ2’ /÷küìÜm5€6žñJ ËuÞÔð q0Ó̦*Êä£?Ç®@²Œ¨HŠ"L¿»ˆÛ” šL€îb>ÉÖNTêø½ W>À¤N2*/.œÁ¦¸“)(WåSg‡ Ú½ à–6Ë©mP÷R¤áÅùþ¼0m·qRî3\È”§þý™xoÅïP]‰±e„%äc€Xd8¡ä'.˜ËnY`ú"·ËžSó]x3‹%•Wr¿ ë¹ícvŠ“e-Õ™¢°pJÇiÕ¦[…@UpEGN Î…ÖH(ë^'Ð@½àRèò(퀉£ÌSá+_îØ)dLÈf‹—’, ­Y(à"2Ÿp:¼ÈÇ vž‹,–ú&–Ž’Õ‘ª›¨&EÄTe®KÍ cfê‹y, ©¿“e­„ˆgÙ¯HV˜e—Ÿ¹ÓŒUÛì‘H£,ÿØ|iÝåVj‰­* "K«ÅÅ«$+#wÈæñ¯ x¶1¨Vœ‚`c%}J^Ù­œì~…ôò°³]pøFT)ªÕPi)¥À^"Ë#¹>ÂANmWžk¥ Ž V‡œ¶Â 朙Ú5“üÃÇ­^½—L59›gZÙ¦ª;™™T3Ó͇’Þ8e9´?I:/e|2t0mP¦ðýÜòùùÇßßMrÝ’)ÁwÒõ½~Ia6ÎëLÒIz±Š˜.zqôó‹&Ýÿ%y†€ˆð• ÆUç6@ß÷óýìó1 æ¬/ÃúÎMùÀ ÚØ×œ Ÿ¦vž&lص`º‘ìê=Ϲ¼$Š´î5OëH/6ço·b}ŽSý a`ºá8|<Ý#'«£Ï{¶É4ÎüW¾®TÅ‚Dsz Šíû9áNà_{#6§„þåàåO;Qß³ÿ¹>ÞE¤ó¿ÀåKÖÜ'¨Äd OÒý…<áñT]ãâBƒœÆó‡õWêM6(Lá;L콤Å$„¹#ͳ߳@ËÁÞ1Ý*êÊ]i‹#œ9…27ož‚`¦„Žö«Q~CÆ—æÇzÁ"LŠŒÛ‘ë•CÀ£/¨2€âèXªi÷î$´½±äOBöx{i[?^ú–ÃÐ"€žàüév t* w…³R–GÁDß7‚µçÓ EØŠý”ÉǪ`%! }‹ž®r[0’>>Ådû‹§¸ïü‘’¾! >`@ß•ײ¦L/Á¹{F6oR&„s3a¸W”8ZO2§Ù¸ob/P“Yì Ð%¡$:¹Ûˆ‘·L—m.ÌÙaj+\a(5ÛÒ:e¤÷r{Ç€µœ«wÏÏWü”nýh./âÈw—«‘vŒŒÃÝÛ6MöMèûY2—Ð+Žlž‚ßís™!èßæÜ)»-62ó]+ìŒ*ÉUÙ´!¯’[ j*ݼÝ9°@d¦.¥d~RѽÅîQ—ÞÄQM”±&P8‚Ze‘C¬Î€Lº à9ÔuT-˜‘¹–OÒ‘-iÇ}UIœDt› j׳ÿŠ#=rý]߉bÄyË‚foOS³¾Lä# Ï3ZyjA”ç4·!.ÜcJGdMl®k וÆB÷F˜1rà#›=‰â²pï¢äé àêÄøì' z5b÷íž)–ÇÄææ‚áòjz¶^ŸÇ"éÇ’h3öÌÑ‚ 2c@éRxgȨœ#…¯÷ž‚¤ÎAn ¨[jƒ]utß {Zi8c‡}0)´ïÌV­s’zÚ ü¬Å¡ÓNÿü„Z_Å80».-fRÏcÐç4„ÜÈŒº ¢ŸkBô™T’·,[œ¥›õ¶Ã!é0tðÌul^±EØ\Gâšþ ÒyvĨsâÔr™¹¨Öõ˜² UHi͆F]à‘Q„óª_wq‡@úü[ùˆçAŠÜ‹…EÛSå?ãÎO=Z»p¶Ðãq€ çLd~@ÖlγƨMN.‚J(@„wšF¢¸·a/ºL™Ðü{w“Ž&~/®˜ ºþÕNÀ§"„½!É£ „$Ùÿ™…X7€V? އë˾P‹8‚Éè9ÚÍÃ|õG=é鋊%ªÀéç% Ì]7ŽÊ™gWwÖõ„¦FãÔúxº¹reE_óK¤Ò×äP”ïDÞqé¬ÞA´®8vÓ4¾8.É«rÔ&QœY[NP*·ˆh-¥x°%:œê5Tfe'ÓàÈÀn±ô¯‰Êø€c:4+{C(ó ÛN–„K¬Í4–ŽF _ìö´ÑCCótM@'iK”8ÉKW1‹nx95 i*FüYá êc®Úõ%g´H‘Í¥Â.Ç·2 Ï&Óm¤·è¾Š·£¥Íèvð½)Œ¡‹wÁø®PeZe·ÔþyuÀ£§ˆ±k'°L²@Y”äúý1Ô÷¼"ÔÄtZ’|VěÉÊŠ–ù•€+ ’T”£ÃAóÄi'5îE—‡ãíäxv(ƒ"ý~(m±pZò¯ìÏ’•źS8;ï'™ÁÕk²¸t^ Žîäš•£@½»ÅãJ‹R~v3ÿ'‚(WÖ<[¸‚fe÷ÑFèp‰júLÒyõ+xèùFý0æù.kµ7‰^OQÿüë@oøpýýö!èßϹü’ñü ŸÇãÏçó}’FuÉïçûùgÏi?)o<­/Ö =ߊøøÊÀ÷óý|?ã!b€ó|>m`óñ¾ŸkWzúçù„/ûÇ¥b ˆðGÅöùÝßïçûù~^ðÁÅñ„'ïò/'Þ¾Žv>{ä^óggÎɉ,L×Íê„ÊÁŠ‘§¯‹óÖ¶p‰Ã‡¿HXÖõzÌûHáxHq´ahëðI OOßb—ï(ã¾æ£½fû5 Ú| ãõ2Ðb.»v3ÛøßÈá¢lÐc½¿zÝLj»¯”ɧÿ^äbÛµ# AïˆÐªôXL4eãݯ!!‡0€3ÇY=³eΉ4ÔÉH/Á¾]’ò6™´ÛÁñ2æ²iëtN¾ ºÕÔHŠ]}ÚvD´â@  |rº'T.Ñþt¶©5ãÖ„Í?ã›*µ¦Ð{Ú£€x¶ÒÆNÏŽ¦Ù—†«Ç™z·­÷9Ðø¬÷´5zá€|&­.צ„¢YÁ¸1±è>ÛÙÏvog+„NK³ÞÛ#¯É»êEðÄÐŽ|Û{ú ž^ÞÆs2ŒK`þÇ!Nʧ2¢WJæðLul¢'ƒNáj+Q $ƒÀÒXä”»In?xôÌS>¥ï{.3BowW 3险îz È1rcˆqa%Ö·YJ1bàðXsÆñÎx¹­v)â2=”œ'ޤóMKç-8€äA°QºàõØp@M§Ê¤¡þ¶†Çò&ñ¯m~wPSâ‘ËŒà^¹ÈŸ­Œ= #t¨-Y©cõÔ8®\Ynà¼EÊ\7œ‰Ô/"û:×Xºdǧ/j ™ÒQz¿ùÄâmœÆàtF÷ ‰”WÀž`%:87k„34xZ“ÌñNîçœwwÅ˧3ÊÍ)/Êôâó À™ßQ2P ¢¬mo1] —Ôkuþí*ä}1åœE gà¦GþÒù=F Ô=rl9FÉ=rVvâ±àš›³`VM¬Ð½.Õ ΫÁC#ÉT#téÆÖ£"ꔤ#ùSÐxÂ8O]å¡KêdØ FA¸][N¶Ð›KŒ[”Œuóh(¿^ì‚ptFÞ,ÐFÜOÜ¡1Œ²°³y¤Vò~•àÈ0 ÎÎÇÈ‚]ƒå”g‚¹D âqš£Ç3`åÁš³-ÚòàxB7Õ~LCÒ`”+a·¶Ü¯èâiÅbB!9‘Æd °Ð»kûÍ];ëi¦#ª1ëXr0oTÖóMyáÄMi=ŸO7ÅÏ鱨Ûr£—ˆàhÕ1" s+Šf­8³a*ê›ÃÅ’ÿ]‰ „>ËËMcˆ ¢Í Ôà j¾P(ëœR;ñ[g*x&òØ8h7Uz:•Õw„" Üeǰ½.P—S›È¹ Õ ¼×ó¶»LçD )3ÁûJq$ñÿ¼åhEz³ƒÕÜsaO(7ЂôÑ&Ä­0#RéSÐYÂF6M^ª?/^‚ †N¡°æ¹®AŠô FCÖËCðjÇûê.©Ùðãá¶åGüKò}äY³$¹°½kOÿK½>® ¾R8ö€©¾Ÿ%K ÷ˆ¢ ÷óùåËz‡z|3ѓֺ6‡¶–t¹Ù»Æëz_¿{C ¤ã—h+zó‘Ácóá$¢Ÿ¬~_iÿ›Ž˜9.ÿÚ²_Âú8®o>ýÓYþ†Ÿ’–x¯®ø¥qñ'“Î?ùx˜¬q ’ŸhÔÒîÿðšÌP±î:çä܆¹ö¬ÁOUýM׎øXT#èúOh¢ø‘­dÿÌ¥á ·SRoÍP@éªûÄNùkGCÌ8aÊjNBÝkÕ³ŒïuÇä¶êC€ÇóùÜȹ̴€dß\”Óâ’©\;ås€×Fºíée—[~5ýNòv« ‹zÇPÒ $r1VmGªUçü–çÄGO€‡¡R¿k[w—6.¤v²Chp¯ñÒÏÌIï8CDÀY?’sª"ωã“ëWŽð J,ÆToP W`ðcg@¢>/:ûEñ³€ÇÞ¬›õ¿ ë¥]Ü%险¥p‡“bíB‹a}O¸³3åHTåà¢lÉ‹„ÊEvpo4›ÞI˜ø;'lEp ÅÆöI=Ÿç†b,5Ép³’È¡ü³e8ÃΈО¹¹(“ù‡Î„aé{ã"&O¢zlØÖYæaÙE!¥_•ËkŽP7á´V0èÔó*gÚ‰øðßkR ¡ ° õ~V5b—º-+Fi¤âþÌ£‚Ys^Y½­¥’¤ÇyZí4 2®¡\ó%.½u(Ošë¬\}çÙš‹€‘œç=³$nÏgÕòPƒÈ/åfbu¤{@éh„¸‰_€P'—¯#|>˜ê X2"!d&0¨Ùú‘ÆK$–K)ESâb\ò|³–óäžüì ™•Œ|øè¨–õz¸—¯O¦w1Û@}î á¨m¶ȬÆû‹vYk‹S×–Vþ_ Ÿµ¡ x+W–n$sÄ4glÌý{mâ«’’LïPûÄ÷@*³AúÝI¶ÿýÑCoEœuéq¢ÇˆQyÔT&!®|ay;ä &d$uÒÁ5‘\®¸×[Û¦ @£ hvÄcK!Hâ^£ DÖ 1XP'[ZrW='Å%‚WÐ~K? †¡®p#^™HwçÜG®#>ûhGµ‘Ôù—¸ÖF´&œH#û¸DqŸX%O=xìÀ+µLG3­õrEne®Í-›‡G7„“ûn ýFO%=n€ËÛ8Yç1sñ­M¤J…*‹$£Ü13œ`¼ö0jÏçãñ؈€ÄM'€8tëó µ”y•µwu»qÿ†nØÚ½êê îQW;a%;¦¿Òˆ ç{Äh‚°³¯$~X®s/j–­^p÷­Æ¾&GoJ&W© ¥–#À’®þ“âÓÌmæÕô€²]üì kG?!ÅʰgÏ7—eK4£d·”–®y+nØä™®p­½š Sž*yYà5‡Ù9[V`lz(¤yž$œù·¤*ûJ÷Æ¢9LŽÁmñ¤”Iª­q4 ªdÑ“ÆÄ,´l€žÃ,9~;£Ï°~Ê[Ù8–»ˆrÿf§®¢,ÏËX¡ðšN/nWúV? +s+ïàFOÑIáP³é^È·kžx,nu@æm–ɾlGþ$,zE ÃQî!pj*ì™Iéòuà]·'áÚJÜžQ¨3 N,æÏ%]êàÕ@qío‘Îë¢¯âØ‹+6`‰Þ‘ýÎ#ÁZºô—~Ê€…’ÕÏ´Œó!/ï"î¾—c<¸¢a{i}zZl­ñoÝŸ»K4k€Êu8Eç†W÷Ÿuþ®r@Ö@<¦_QKÌtõìÞûTJvì¸+æé×{€~}:.öO‡×õ•owŸ4Œ5Êd NÛxY•îÿE¤eN:­ÛF—A1¯w£ÞNcE4W5?¯Y¦â$W úmi.#X˜[Î\ ôã;ï=mÔFþ¢A$ª¿Ïß•œ,úsƒliP ,to mò|>ã¤ò\¥ç, ýx亻7’\ìëW²¨ Ó{T­'Ý]±*ÉÆÕö“3íwc}…-ȦœØp…:òÇóIA›ÑYË­~ØÛÿCäÁua=ä¸18‘­€ù¾Àv^@øÍ爦'h{Íl›#âŒ[öà‘V¹¼ºs¤v˜ì9â‹|ÙMŠc›Û2 *@<œyù‰EzqbKØÛð…FbÝœ­èd…õpsbiô-Òè¤<êæá›§ÌÑkë¼&a4%Y‘Ͼgzƒ%¥5˜5k“iŽ=6|*' ‰i’yÂe- }Eø€&=xÁÐïüÅu×ášÓKÑç*=ŽÐ:∃Ì;J2VŸ’ãX^\ù­ˆ|lá¦oÊΑ;ryÉDçüÚsE¦ŠƒHPΪ”1ŹÍaÖÖ¸uz‰9À7 0FfÎÆ*çXi™êèÿ‘é‘ð ÂCÚC¹wª²&⎄„7+ J™¸.Ð 5~ƒŠ9ç4¯&¸'c„¯ë‡¡%£ä±JYŸƒ³|¡Îh¬|•ŒˆûïM}éüÕÉJÈøÔys'刘îwh$ŠÖ(,2å”Ò8Œ9~DXlÖ"uüéì¤Ikf”'§ý·qƒskºd¤ wHZ5õ<306‡Fîàe|\q"{=Γèí@²{GÝò¾lBA•¶¿˜b~raqôè¥ãÉV!)ùÔ§ŒX€ØÃŸ¬ùÜà ƷcoÇ30ÄèFæ©êœFƒ/ü]tS‡É±—ŒF ç9· \ü¨Q=RšÚŽI¶ Zép«hÆU75üäñ$ B¾{tÕê¬0,ó,%ÁÞCˆ=¦XŠdøŠÅÙE­ <*ÕR¥ªháÄÅ[פa¶sTNP½‡2<‚'è& ¢˜À\m*„²aYÛÖÓVå<`§1Œ¥ù8bg׊8•µuCñÄ^d N1ça_•´Š”V¸­ò°£ƒÊ6,©ÊXRð;oÔ»"ÑšQ Ô¸¾æã¡'Œo±4²)qÁÞµ,(#¥-(V§:ó˜ZÝT*ÒSst6é.•í¯‡\á.NYƒ¶Õ“íÌ•TŸàÂ}3W‹vFšxFSb&9T`°$½#²KRR¯¬r0ý çÿ‘FŠL;1WÔˆ€¢Q4ÕÀûâž@'ÁI,½o(Íóc`±5˜¾oY|“ }(BV]H^íñx8g„‘Mu’ŸÝ´IÛ1ƒ-²AÈ]O/6qÎu>jTRÏÄr¸AÉÄFVå—¤ÿÊ’1u%±î <š‘$åôC’÷¦’ë[òÜ~ãx˜"¦OÈÄ8 ŸüaL÷¦•%šZs× ‘ÙwTa`æQÓ/zv(Íê xØ.ø|>£ˆ›e¬ÿiøŠ÷ÈŒßÊáhÐk;¡™bAN~#K*¦ò0$!¬ŠëŒ2‰&™Y)•¡V×¼<ÚíáÖßFBÑöÔȳ/¶Å*iû3׈\ÍÕÎ[²*Ý[Šh[C%­0[É!LŒ#<{¼rú[¢6š`%Rµ°–`´Ž§3 Ãö°ÛåÙÿ)KÏß#ç1²+uÑãY¿z˜ï’E€šÇ}»ÈSÕ*赋ÿ†Ù‚P½tÓŸ£·º&€‚®ô±%G®æ4J¶á¾nRŠãe©¤®ÒÓ7®#êÃ<[žÁo©Å+=ÑË¿-¼p´•æuŸ5€:ujDv ¢{ò9o]½•zCxZ¢E#”¾ºü ?òMÂ&81+ß.Ñòº©²kOê1‡)·ÌTê cL~æýB`Æ}¹üåNÃð>ýüäSáÉêèw‹²C‹ç èjI~¿¥‚1½PT5¦€•UÅ©WyÅñY´E­ *…¹¤Ã(0ÖK¢òiBBb 䉥S¶­ðì›. H‘àªó\ñ“Áà$¼ëîÿëîÚ2¥Éø‰L¿P¬(bºî7[Ô·ž§÷z’ÓÑ tã3O›' ®H©ù2^Ù½îƒ3?òB@ACD¯dE7¨WD_„¸Û¿[ѽ PU)QÏÄ’aM´ †ãƒò>r¢,à—~î ¿< <ŒX ñ>Æ1†%&·Ùç§rËä~•¥¼°ã@U,Ok$«›.fÂŽBïhûÝðSy-Y>Jgü4jžÒÏÒ*±ˆza®•e½+ã>½p_ ¹€9®(QÍv t¯öZÀÎ{­ýÀü=ú$uía÷€©â \!6ý¨JÞ¡71¤¾šz¢¸}~öSA·=úæ.<¼<[bˆì&ÒÈ(Ü7Ac—7êKqlþ„â© ÇcËG °‚àLjÉsêÛÍ/(Åêºb2±/|´*€Š÷Æ-L‹GœMÆt‘]ð+!Í›ù!“Q\óOˆ‘ížÂà/µ€"0ŽˆûÑ N„ [™ùÕ®ðA…O*ÊP»A^gÓPn§Hà‚3î»ö½¥ks¸í^D/(žXj†êàü{ìhŽ®r‚]ú¸ÊøÊy*–FR¢v6.Ÿ#i³z˜ X¬Gˆ?fÐXë1„b2Ôe1èìÜ¡vÙI”òüÓ#áa·îÈÜ\­Ÿ™È " ÉÂ&T$‰£˜+P¤p²é&–UÆå|M•£o8ÖK±^™qe2\• ¬yBt/ð±%¿äùnaâ\Ú&ö:Ñö`ViS,¨»uënž˜P¥#Ó3ƒµ—Þ µüÁ˜ŠóÁ²qZOÌÛ#Ÿ¤ ¾´PE§õEAFüê+'f'¦TN";xÜ’ÿl²ìº½ !r«Š-™ ÖÓ†„7:[¤U£—Z|rÚ•b—ù“uØ(¯yZ6rý’ÚCÓrT¬ŸXê]µ(Bã 2Ŷ=+°šeæÙ¦í8G«ê:=¯#HëI·‹ñd¦ @rÖ¯dé<[:.=„m£d½¹výl¥s±mÀ“ÿ¿H:qØ{º–Ï’„Ó«’Šé¦è½îèy=ôÞB97W€âìóTiOÃ$±†°¢yžÓY^áå¿=|‚¦Ä”{37\Ÿ¦: ²4Uå•€ÊÁWe'8Œ,Mw%Gø’³6ÂzÀq’jTKöÀ½eÕ4P[”ˆjä'ÛCÿ_K²G‹½Ìv¼D)ñs3 ¬¦Ž4ùöpµ~íÛFäã-Ö«Mû|& ž%t#”¥¡Ð¬Œu@uœA^^Jcêk,QË"¼Ç̯4üÒUr  «“ªì‹‰‹AçôÕ”Þ=Ì£ÆýªÏɶ÷&²Ú‘¸ œ$K¦±VU‰Ek\‚øIç¯Lh€}°ã‰—Ïý\ú?— D±›àMK÷™ÛWáÈlnÒq0ËŸâKAË’íþ³ŽQçõÇÞ6äÐò˳t^Gª¿ÎG=ÕÝOÇï즇DçXç´€?`‡>A™¿ÜØ¢¥•t c/ ³zÕþïÿ "µ¡f4±wÚ«¾“×c×TΦókìCNíâ\¿à¼ÉégûÖ¹W[e;v<þeôttªÚÄ%G‡&ÿŸš×6Áu]Os?²ÌoËÏ¿t…“vK NÈjñÏ;6KÝ€Ú"Ôɲ>ÄÎ.>À+¸ËV¿Ÿ7”ü}‰ Tï^jìÆ`mUp1‚ïÍ¥À?C:ÿ¹Ç7ž–ò?a4¾çDCg)QsçgŒxî­Ö¦›³ÈGi)8–th¥Óœ}a¢K}ï„2·÷¥¬*€jδ„D|#6Q²6vT0 l{ zì-kñä5YÉZp°Ÿ›bC¾#vûêC2{Q–'Ôl~Ív¾Ëê‡éai:ÄÆê·ì¿]ý8ÇêBbB#À`•t84 &+˜w2ê¹:©MöËr§DäÓ¬ŠÌ „sï¶>™ÄeÜŽªßâ<;· H­H+]«Hi”&”êÔ¼ÏC BKH"Žù„ 8xD{‰ª‘éÆY,Ðõt•îÆ}#¹h¦úpY’Õ.¸G¶u4À脲Œ .¡!Ì0 ‰z9Ô€3håV:¼(·bΓ˜Iª:ðà´UÏ ©uÀ–¨Mê¢ÇèÃ\ÓV±¾ªk’Ë*-Ö--I²‰V!ç;ž{nÊïRP!b'™Ú.t¢CE͆œN…¡ºÒàˆ@‹üè¢5»nDô|>®=b@.G8-íÈÛ ·Š ‰9(÷+Ì[Å7ß¹ìŠP'0ñ'Ÿ‡DUÑÃKhèÅyb|1h\ÓqWE%Ã¾Ùø›ˆ äŽ6¬)°ã'Ù½4ZÿCÄÆ&ÖWpfÍSj#¬“–h`—ì+¶•p8mHF!o¤YL’¤ÄXSø4ÂA6ÍoEƒ ,[`W¯oÏ8}$Wjž$žâÖ ÷L«$íô( #L~S芥ž’bdâê$Ñöman ŠÂÝaë÷öŸh—Ï,± Îîeó(O¼¿Ë‚¨ti9£­«O7jB,îªø®ËÛ#dÿä%(d, ¸]æk«Â@7Ù—؈ž·S“G±J_ˆ8C^l[ùÈ.O&kƒØ”°¦Ç⤠ß{——U›½ö®~vùÓ\—ÏúÆÊ Œ;'Ѥ\÷‘Û}ù ÄL ˜ÁPšÈ€’œ< ÐÙ•ÐÌ×ìådGQ¿ÆÈ}´¸…Ê´@ÖÃñ7IçaîZ¢žI¶Äñùw[,¨öÐMÙ[›•û–ÑÃb4)ùÛ*0wnäZ7ö45Æ ði\áÚËi=º̬!v}^óYïøÀ™Q„ÓŽý-Î~†ÜÉ$/@L*KÌÔ}€03È£©8ÐBóvÑÜD‰DнÕm¦lqKg»ÎÔV™Í€¸p"¢Uußn¾T §·~“éç¹$?;+=DG^ãW)Ÿf¤Á“K=ÕWS½í¦œH Ô<õƒHüH«“Ë8t"‘71‚žX0ôFÁë¢e%—wX„êpµ=-f7õ?Y…3( ÂcDc¥£m ŽîTjWAE ÎbTŽm1¨¸–õ®çCÉpñµ Êv$ú³°qR0I•wõÍ*½,ÌñxARbó×Z¨4Õq•âJÍxР½6†Éˆ˜ø-ˆpP¶ ºû~xN¨MN$†¬RøÚ¿±”}È^[@€šÂBfóŒB9vÁ~sÏû¢‰Ù6TÖkë H—®tJù¥yn ãnë[º>35¸ÔùJ³Òu2ÎGÐÕÖ^´áNßñó.4›ˆ·kâ÷›²xn¸—ç¬]€mƒ,D“+­GÚïü[¨Z~L&©&5Ùã—Ô 'ÅLd„îl¯]y2›MM ‹*Ùž>6ÈEo)V*>— ÀN¬|§¼4ÆÖŽM;ô+=ÓðGHçóc¾f÷—óräŸyïJ~øççŸéóKœ©ïoûš]Ûþðx<žÏçãñ0>"šœ‹ð_Üþ|lõ6f»ÂŸS¸ üŸS0ä†9Gç}¶çÿ€ûëa|âlÁãÁâòO¥ü~~¡¼µöláñ×@ߵΰÈ}¿l£Û?çÔîšôÆØduDøßÏ/ X8*ë_t€ï\]Æ„•Ò¬NuöïAü~ŽØ8€_àF³¦R*çæ¿Âÿa\|Î[ó²?CCÊ rž…Ü KŸ²À8ÙÀ鮋íqSµ, 'áDÓ!oIýÙõ!XëÍÚV¹Îh„1Üåbíý"°A¢M˜Iƨ¨„0!n—ÃêsRþ•^·;(ÑØØÁYœì§³ÔÅ]¦;iÊ®˜}æ%ÀÒ4B{_÷hÔ,kxåd$¯{Gý´-–û}àN†‡Cú1ç!9¦mSz ·¯0èÕe‰BÞʳõ¦Úd¶Òx2+èð…ŠøUZÜ$‚»˜¢E7檚ºBç¶ö>r†nMhC¢÷Û;Y.ï¼.ûÿ*âíä["D…!èÎ#yw÷+üT‰éYNËôÛ)·|(ÕrpBMhÙ*È)0yŽGV‹˜½…4%œto0+¢ãN:/²Ñ‚ñ°™µµÚù“œ‹®˜ƒ3Ï?vo2¾ÑÀºJåØõÊ¢‰;îMãÝ4$£¿õ27zj¢"u‰Ržd @rS2 <ïbÿ7úêX‘j%Ì´nCc''-Àv; žñäý‹ÄüŠtT¸•¯kåÐØ}O9èD­¸KÛÑ ¼að¦å=_@ h†4ÐHÊL@?âØÆŽ}åÔGÎC‚âr~˜ˆ=[½(XÐ×ì áõíß2^è 1R™›øŽð”ÐE1Ä•‰f Û(î½ëî÷¨Ã5´±ß øQ\Æì‡v¼ãSI°¸¦6ˆ;œ=¨†*§‚‰§OŠn¬NÜŠsE üB›ª2ÉžÔˆD„Îç<©HRÂXÐ5ˆ|GR ÍTj çÝ™÷¼SÇ´ns§~½¤Щ»Ÿ ¢F÷OíˆÜÔ-äŽ RÏKrŽ-á†dæ^/&=5•¸òßQ»p$¬"Qd¨ Nuà ´¾º;‡R ¹?I\3¹y=^XEjMx6Ÿ}§Z:*®*ñÈ_'/ùª9{;§™ —š¼â%†ñHÂ^sŒ ü䱊âÜIn|qsWð øÞØ35íÉ›+*cQÞ?Q…u,ÛÉç)ÎÜà»3MîÄEÚýOtäóöØ29·ÆI¬ÍÔSâß»õù̬[5Û¿ûšnÕÁ$À â³Ëµº,ÇVøÀ×êÁ¼âdçD@Ê)“%9~"Ñ1³wœ²«Oóûî4¼+| å•.þ¦J¡602AÇx;~vg¬²ïõ.úÁUP¼þ±é… 9C©—ÀIõ ·¨z;Ô¤!PHŠÉê5Õ³àÍ×´E¾ÚŒÄfޝ‡BÌ{àÀ"À³™7MýÅÜŒd> ¸?.·u¶ëÏçói®Æùs‰y§ùS:‡Èé¿ZÓóªWã%p³}Ÿæø._áu,‚&Ö«äî½ö*‚}RNˆƬÈü¾ ¤ªÙ›à2Õa]FiFnOIIÎ,aIÑm‹¨æ‚· 4lþeÕäÞ[F\C™¡B׉®“²èþÄg~ÖnÙ° §;U¡`v+®§£.ˆ“¼«d;Îz°›¬ihú«¥;fÍXò-‡¹óŒzñó@3a WÒvñ²7¢f\Ú+O~©¶ ^¤=m¯ò¿‰/Õ4ðÿ{¤óÙa]BVrüu³·?íÏMo•¿Ÿ?ùy<*Æÿý|Žœõãñ@|0?Àoc?6ÿŸË+dßÏ÷ó»?ôJr!êqòïV#G’r7®é…:þËÄ×_úÍû…øx¿Q¢^ïàá6ððùZÅøöÝyÐ÷ó&÷õùË»qŸÆBø’ø|?ï‰!mF“ì=¾Kâ{oÿý|šMêâû&ãäT–\Á“nÛ‚:^âÅÚ\ðÆ‘ Ggç6oâ…[rÜe·d8¶›b[• ¦L„Gƒò!0~b¦­¾+C˜quñm‚>â#’øýw;ÌZC¢ëƒ×Wk'+IÛ vüotl*¬sp 𕻀³.`1ÝȲÙ+GÒâ UÜÖ–`ˆ^ÔÛ[Œ`óGRMô/ÍkTjEâŽÇø,ÑèŠè1TDð[>­ÓáÜb·8¸ª6áË®ìã;§œ9¹Þ00ò^¤.õ·†OÆ‚Š@“ÁÚ‰bìàeÄ•ëæŒžO¿Â=íp¯ce °bÀÆÃô¹]&ßö ¶¯:˜÷h¶+¡wS~ΔÉôÙ佬gh,Ì-¯š^æ™ã4±¼–0ç„ï˜ïËRWÑ„–PùU4¨ŒÄì_Р­«;ÖGðXÈàæ™lœö·]Ò—Y‚N”¶£}tÛŸÅßêöØæð ˜j€ÂH7Âl'*¨»ª¦/8uÚÛX£ÝI*¨z={¡IÄF&¬à‡ìmž›ÂÎêië˜XŠC9CöH³æÖ],û J:E& ówŒ3—æq ±óµMšf.q:åX<¿U¸¸# 3?20¹|s[šœ¤'Ɩד›‚rm6aý9£ÅËÏäÑ!ˆVŸ.YääµV¾PïKô„ÙMV->1ñ¬NöµLÉ ]×€™cŽQ̬?oíGö# ÆŽ'4¼œk“dãèx‘I¸»2 VÃþ=ÒùsJœ±SŒáG·¹…00OJ,ß‚G¶#(ü:7kœ't“Û0£›¦¼Â§BÁ´±hÊ«ŸŽ“žs…»ô,0ÿ¸4î6q¹…žLîs7 :_ZJ²'rc çœÁŒ‘Žîz‰r0Þa„¾÷„€èä\"ÁŠv-yq–Éú·S±/SŽ›Z™z6žDî5€óy¨è¯–Àz±RÀ3NR={ëœ)ïYd‚i0óFèªH`Ü#¦þ*À³Ò.?ì3³•Ü’ß#a˳SÜ¢ðí)òÏòá~•7ŠNÊa>«i%l5¸&–'âdB¹f!/_ñ¾Ï-Dé,²Ëú4¦%¿™mx‰z>wº—©ÞpsÐÊo˜-;zr«ƒ &{+9ƒÍÃjn=BÎuçSJnœf*‡7]3ÒÜOYøT¥ƒ,¾OÒŠnxJH ¥gœ·?p3âu)¦mÛ43:™žýŽëÃØÞ…È=(V,äÉçÎ%ä˜ç’Ï-öz–Apɺòe)t뙺•—zäÖêKÁÀ'X—¤ŠŽ™{°•”ŠR°s/+ujûߪËŠ3ÿÑ-baíX¶Ñäá,‡´ITuÕÄN†ÒÛm²™:‡ÐÑ@,7 ì«Á£²ñà™x²5eºàᘫ.ÆeÛ‘q¤Ïázw¸˜Y⛨بݵ÷®¨ 'Üu@B™ìÕ½“¶²EM¹Œ"žï^«Óã#_ŠpVÑ:·hâ9 s•u?K… ­Ù:®ûH£%¨ÚZípe‘tøs](*èŒ%J 2_·ÿV#LÒ€1øâª®ØZgøõ¬×Ó?NSÉ[liâ»1Ñ‘ïtŒàêôÞ•ÖÄ‘Ec­úAJÙV+ùžÜà Žj™OVP'¢ÇnîoHg˜Š4h玗˜6›©HŒUÚyÎÈ›éEY½Pkl6¨ôTžÍ(v0Ϝ҂t^Ÿ@ÊNëUÔ ,ùB •'óZµÊLJèvÒN€žv1P‚ø-dª‘ž|#¦w°O¯xï]RkQE°¦âEI€5K]v»¤¾Ÿ‹ŽöáÅ,Kì–n¼g)@#¾ŸC‹˜çZËnÍ1Nê™ `”¸£Em g”òÏñúMéˆ é,Át¹=òƒ™åŸ³ÞCâÙ†þòÒ‹ßøÏ˜ÎBƒò¿b¾‹ãg>jß_búuͯ§ïðÉ]¤ŽMÐ]ëù›ŒÔïÓíùø€OÖhc|ÇÝ<í©³úü•§…ÌOañ÷éÞ=G+ºj/Üí_¢m.ô³ˆîˆ+\¯±Ë²§VQÁOØ×;”Яôÿx>Á¸:gÿ'¤žúØôÆ r¥•ø¹Pï¹IXëÝbüYÙ* *7ÇucEc«‡••ʘo£†X§ž˜0†—[%5’÷¦D€*l¬˜,Ü](ê=W}"*Y÷|>_|zWow€suFBòlfgõUUŠ*¤>eŸ(¢J£–ù(xˆ{äPxÝyedwÏâ‘ÃÆøí$ª†£ ·OŠÖ½Fê}i¬Åfê€á4b3&xÔ× †Ö`Ó$ÔÀqÏ.ɼq(Ì—[—Ø ÂCôùhD³ðôØ&h9pêð¬õdž5¡}q¼DÅ‚éÀ:·Å.tkÖžwœAotÁF ÈëZ”Y«µç¢¸×jþˆ>éOŒýê2Çß0™Äú7ÈΑ•à>d®¦øÔ¾)A²¢È(n@,€Ì%ŸÉ'rrÝzoÛVLz帪˜•÷Ÿòî¹óÉ{бºj7äPŽŸÁ‡‰Úc´ò¹ +Ç ¶÷˜æ±(4²t@±è½ßÅ2ЖN#±çìâºç<åF#«REä—LQ¢VkÄhNlì2³6ùle*ލåÔ½"su5ÃÉi7ƒ‰Ì(S-\ú‰!Ö=”Ck£7Š*µ'zwÁˆÊ¡¼xXá=ê ,³4c:úü‘;ýÚˆúK:î”ç9’TkË!'ùn-ÿÃóùt¡‡tˆÜ©è¥S3…n¶nxÈ8H;:}< õñDòº36ÐO7dˆŸŽ –‹¶pÝz7ûŸ£­IÒMx‚Ò9ÐúTÑŽ´«‘âôˆ²Q|ª«=á#N0ÞþÑâÚæ9|¬o –CÐY†C¬œŠ­ÄÞ1´Í‹ñ€[FF벨ËÚÀ†ÌG¥3N&/òæ>æu",+)«>HåÜÂËRZ-¶X»t2B®]›~¥8ÎM'†¯¡€¦îY&—×5˜»©%Æ×Ò{ÒÐÏžÆ8&ÈÃ’Ð%›.ñ”é AòxÖ×Všæ0?GÐ9Q§bjaR)š6‹Èn¡Ã½Æmgâ¦/ºý]J4ˆð À<Å D-f²Å‹nW"¥ü†/é|îÏê¢`kJµ÷ìI+â°ýõR¦·f¦²tl(lþù¡«ßÁ¶ÿçgãÐû|"àô ‚O8x¯åQXÑËl†½è÷üSŸ`a£Ix2m†•”Óë†ßs’J*O¿N8]‚àf“'äÿëxŽPÏ´OQ?`Áïæsl€§kªÜê©Kmy…ÈÝÓïÓBâÃf*çQ•Š$$Á(}"©Aàv÷ô‡}#Ë<Óµ–Þ×!õ» “qÔú¦u‹ «uÛ•·N†^Éíewèu÷Áò*Eµç3]>u{>7`og:ô¢s1ãYÏ#ãªVé*‰L}Wg°ÆQÀ%hV2¾ø‘ÉrÁ5ß`v‰²3yP¤kߺˆXôo_…<. 7{¯B,%·Ääã–}¿t„çÕ¿dfAݾx|¥¾Y©¦–ìöR:lý·PŒB¹®PÚ‹òí^ž{%Þî±9$§ŠRúÉuQ4/¤¦‚æb-ˆB˜ÉÞ ÚÁ˜KSm?ëlH¦ø— a‚¼†Ùtåc¾¸êÝΡ37„r§ê€«üo3Ö_æ°Ùêý%;õ" ¿/rp- àíL' ‘l$ŸÜǽ£oI–¨s¶lü?@O" '<àÁõ³,l#Ç;ó˜¢w8sjøßŵ?fa‘œÎHõé« )DEÑ¢Dƒõ —íG¼6<þud"×´4­ ^›‰ÈGÒYÝ'³«³žîð·ô¸øÌYSSO’·áþZŠXF¥ˆàT­+²qy¶€ô´÷bˆ~Yu!Ë·ÿoPßÍöÃí>|â½÷„­}ñ¶ +« ‹€j+/qž†2Ÿܰ"1…”ãyIŠ2;ž„ùi ºæa¤R=ëdšÁG—4\WT¶ºÝ´˜‘tÜw,ËBäâÛ]‘È0X¡½ïz~ƒÎÿ@‡„ç0»ìtUTòäÓ­ç úÅ„Õíþˆ —~½@Y±fîԸϙUPx™7¦¸þEÒùÜèÉŒ zcƒåÒg ¢…ÙŒ eôp %‡§êí¯DÀõ+6ÓW·d4aˆý €Ÿ-JEÒxºQÆ>Ÿ¦äaLûâ}üiLõ>óÄHº§Dd ±?¹½!Ñ“ÈXð·‹ì¤hKE׿t!½HlN¾ò©Dº#ÓKÀ ž[ÇÂó²6ÊD ¤zùšÛ»M²O3ì—kU›Îæ”Pð‚±?gqëùSŠ—]ÇÆ±±ë°'I;‡ ’˜_I®nª—\‡CýmRË·¾¢…:'Š ê8NÆ¥ƒ^´’ìF+„›Hp¦{©2Ý–k3.›6]Ê“&/+•%5v9gú3£hØ(eÙ‚Ó®ö>È#tÔG‰y I*9½ö€˜µrëXƒ{¡ 8Ç h („_™4h¹2lXÞ KÛ,çÆTn§K‘MmgÄ%÷HÔ 7ÌwíêLΡЙ+WDÌs""ÄA +¿ß˜6ô Áœ\’ñãå¥CËrÙA>ŒÁÕ‡Ðçƒ8èÑ5In«ÌÏ ™ÍÕš4O•tõr¦ þy«X"ÉÒóž‰às”¾C*fߤ‹’iÆNžÑûOƒ£Úh@6r6vÔ¬…ýà{!Ða×w®ö}‚d“*Bd î¼M¶Ù-{•»Ñ¤l»¼Ë÷Ò«Pƒ>…Žæ2)…Ü”{å[1%²˜)ÎíQZ{èð(žóE®Õ…̈>ŽÝßVcxæ˜ ¯#‘ônGÿAKUκ3e!W¿Ú w<‡MÒùt¤qztæÉŸtü`VGB"ø¸ì¬5y±m%)¢mS¨·$òÍ•!r2 ù>rk!ÍÒ£‚õÎ5äf‰ˆ8 ”«(Nì9wö«è:Ïr³"f7 ´?…Y§Ér¸ý6ؘHRÚ¥ŠqJ¨;-Ì´ñF E³Â"?Æ€‡Qp’ü¶M§÷X·A¦È´š·u-ö+¬7èš9æJQ¼˜?mœÙk\Í;¡‹?Ò`*ßH{{W},H”®A“;+H¦ÒÇj=ùÃëxŽŸ¹<_1õ~mÞlšÿÿ ¤óÌ3g‰õdª§SS^½ ¿å,ÃBiŒI·e4X­vßÚÃøR Àkªk?…¢Ì  }bky`HИ¨žèËfÞá+þÁ.滀qä > ¨XLŽˆ€î“7‹‘0c¨ï{I­ 1NbŒI€¥¡Ú=O3ø3éx¤}X^‹@[áÃÈU_ô픵x#›ÇáÓškžR[)@Ä6ÆÀq ¨Dì)¼Z§sí­ŸDO$zº]¢¢%ºöÕn§P—ïes¾¯qKÔï~ùšô¡c@—,8ŽHHuas¿ÿI„èâµ½h}fkRrˆó€ìÞñÏ“­·j7Yv_zÇÛGeãr:uYO:“²Ü&(7‰âÆX ÈÚ¸P€ýb>œ«"Øí4,}ý)ô7ìx¨7F1÷4„ÛhXg±‚"\qµNŸwd_„šJ„Woú¯k]!÷I‚SZH(–nðËæÁgM8¯ö¥o÷çþŽ ˺ÇòùôJÍC¯Ï‰€8Á:¡Ö'ÓØ$ÚD;¼ê| ì…c´êá¾s6à Ùûqú”æ3î§™ŸbãÑiqu¶ô3{õÞ"íwÎ×U–e'"ûO7–s’ä›.½—uE€D÷V°oæøxÎ¥G‚íç üœBG"¡ª£û^¸;·ºnu¦fÏá±jÔSì—6Õ^Á)Eî1è¨EÒÁ xD}jw^óDºƒ‘ˆ¿Ÿ¹2=Ü@Y±sǙƩ=ÒÞaôöÆCSR]ôzñ Ù±m›ŠqpþÄöh°-£F¨&ˆÕéÓË.ÁøÞÀRõ¨ t‹{×4 å•€¼³r`®+Ió¤iEKÜ>$ä)ÑŽÈvÜ®v¤Í–%!KÈ• ˜NÿKè}0ÙL,Œ !‹£}ñ‡1@Vx"˜jÌä€;z<BÜð’ê™}¥ ˆè „Oj†l­Y DÄÇõS?øç«\à‘A—û³ÍUÜLKнàRQÖÎ,Qû˜oe¢=ÜããBp’S³FŸàÖ¢›eŠò®8¢È˜’ç> êòêâ×÷¤icAŒ…«N§•×*îv™Í…¹Q õ¼3ÕÒU 55d»>l©Iš)hx슜v';<Ÿt«úåZÚy‡Èu'–ô3rUçÐù¬)î<7ùïD,¡…öŽÚãNâg†ëG‡Â›,p´\ŸÌ6»œŽWbç{¹cã5Ù|ÖöëÃÆpÒ“=dØÉ7¡Ä¼Úp©bå2,)Z6.ý’Ñø©ÜM‹Aìü\LÝýæVŬd|h Ÿ_`m†8„³K _¦s˜bM›<Éžgª¥8'Ñé2¤«*–K|&7akroÓí4’Zz8#zù;Ãc­ä>¿ ¬1s­5‰ ÛÚ®øz…™Lfz°£"àFxÆg;쌞óÈõ˜“ÍÑ£2øÖû5þu=Ħ`é! Ý8L&)w(rŸ¦@AÂY>ñVªsƒr,EË8H©/Tiêð΄>GDn¶»hš,±¸/Òô„Öì§cù”ÌZúY£[$Ý— Á*¼ “Úò^ Pº&wV B/®Õ¬Š™q˜{ô‡Iç¹vôê‘d⤼ÂÎÁª€à-!¹Y’—”.æg3Ñ »ÙöAÿÛ[]ê…6 J*][@³íÅ秤]@Ú×bøâY¶ƒÒ·ÉÇã¡\%Ë5f‰#ŽU®rópɨñ ÀNÜEƒŠp‡"ñeÝŸ'„†ê›j&ç%2SA¸°Såt•úÏN¬üò›1!3–ŒÄz|]ž !à½F#ÜÿüÅ¥­ðtŸq£Ó^X½~ žðÄV=$7Ú_ Àý¨ZõïNdz§¥žO|<ŽÿÔmòNì^{Óí·\òÐB!dy©zÙœ¤Þz•æn£¾,xµ¾Ð^ßu ‘¢µbO^¦@’¾’n/¯%b:ä©»Í^8‡¦bHÌ)y´L Aѹù©z2ÉŸ‹­Ø\§b¤žKâ³ÀHgL`@Wr  cŠ\…oú˜Eî‡ÓñÕü íE3€ºÀDÏžV….¼†žHC…³ÑäóŸÔE•Rœ4 jÔ±(Àž«ˆ1}ß»ƒÍe»pòåH:ä”òwv×itR£¬Ž¸¼Å^ÃÍx°ÅuqÄ(àyRFµÿ)íG~š$@IóJùØ™ à"ÚM5»>€$yì¥ýàT¡­6Â|*…¼jŸº¸nDàºFv.ÑMX¾_–J“-ß:ýÏ'/;dð1±í@‚©r‹ £—_!äÀ|î~ôûò1èO…4CgÎ*®,‹„rö£¥t௹µÀ?À=•+LÑ–qÈY¢w!Üê!˜<ã%'tÚ'lÒ%AZðÖŒs˜µ¿ö¾¯mÊ;ßýÅÏÙw\wõú­üwGÅÜj#!À®]dÝ¥Óæ]—ÎE¯­B–¯Ó3ø/›àïçûù¾ãkð€"½—ú­ápeˆˆÏd?5‘¯Æ[Ò¸uŸãÌö–&ÌýÄ³å‰ (ÝE“-%7‹Ýœ¬`k—ó™¸VŠ.VEœøvð/‚d ÀÖÃÞcªžøWA©ûX°åû“#øDß›Ë΄pÒ<Áç]™~Ó¬q5G´ÿ$éô®ß4ø‰ïeÞ +£)Àå³g9†KÂå(˜OžS'ŽºÝ¨£tšG½»Yɿ䄱³Ì‚{]…h“%|½?[Cgßãøa¢*I°‚Œ”¬,Áq*JÕyZÂ:Í¡|Â)„ò€@4™3b•±ŠˆLØα¨¿&™;Õ[¯àvâ“qbÛC?šÌ?Íñ)ÁO¶ZÀA¦öȰ…Åuì{’#…¦1|Ä&Á˜:í„ß7ª¸þ’ã¼$ÿ9©Ý4ÝÆÐCÙÖS‡[=ÉÍoîä,?ÛPÄÓý³¸X!M§AÌ+pÖåvËüP‘·#^¿”PþLo‡t‚€(z‹Õ‹Zb_œàN)ÄÌö —¨Šˆ:—:—•bæ>QÝv(ï1XŠ'"N ']ÜõÕCèI”Q0KÍ”v…¯ße“KFþFô Và§6Ë]@`sú 0h8«wÓ(Y»ÿȨƒvPzfq3?¦ïtSXmbmùñÁ!'*Á„ËË×b¹â£m&Ö‡D†jJPhÖqJ±ÀØé=±"³?¡Ê@{!ST™›§ëŠ`ÑôWÞ¬P¯ëG\θã©ÞΕ|°tëm#¶ J…"þsÞØ gÙ#ƒLü®i¸[åCt‘r<©¢Ü,üºHïãj‚íÕ2TÔ ÆwRC,‚#PXÿngv#UèuËMC>€O$f\(væéɆÙ1WiGîä¤1"ŸúôÖA:SØß¨’½åŠT.®åjsÿ¶CaòÌ‘ˆÈEKÛ‘e!3×ÁÕ«¹!:ù÷+f‚Òî7ÇÉF<=6Ô6Ñ“G¹<%Ä ©ºhZK°í ¥ŸÛ~]h‹Éܹ𛅠¼œ¦†lì|½òÐZOsjø @Øú~u25b&^¨ÒÓ;ÂÙ”ù½#u“y~ÇD=È:Ÿã:°4Їî3݇¹]ÿæbˆÐâñxÑÇêâ<àÏ+ðf»¾Í„;à†~8/Ð÷sèó@¤‰ÇðKNb!(xî§m-Žû=£wîñø×]²€ôäû¹Ìò!}ååû9.>Ëöèû¹8¹¡ßEþ~¾Ÿ´×»žò×ÎW>}r§Æ%¿5ø Õ/ψ¸~¾ÄðõAñvbBT0ù±×€  ūužîl‡’©…~žJâ¬×èG×…3ÛÚâ=D]z¯ôþ¶räo ¤xãÙ“ˆžO2,?¯] v’?c«°ª!êUiBò ò…oAX½ÅO&½µÿ–õ ÿ6T¤¾1«ä'¬­›æãžkTÛª¼ˆü _š©_òñ‡Ô}¤Yy*Åg¼Þ“j™9âÙ7çì%XŸ=å ÙÑ!Z"q€¿DàóÑI øãÍš(êüj@ý–^¬±¨s‹W/ž¸·Ç©Ï·A¸ËÉž¿dŒÎÿýåõªCúÜͺô bÞóïç¯m}PÈãù$ðøoꈭTòΦc~[Æá,ü§…Æÿ˜™ýgÛÛ,Ákÿ}¦ïã¥ôw‘Î/eKvÕG{›ø¯TõÔ×~µ&¬$º4*ŸŸð›dn­³*hºo” Èý£Ýß^é¡£ÊܹåVåÌTÔ¦j»Gâ͹ה‘ ³‚cP=_QÇfŸ_Õø0ã‚þ(³«¥¢ØÞuØB º2_ã)Tð£ŸÈc€3Ío·["ŽÃ þ@'BÏc…¡þeêbÒ(~M~ÝÀ_rÝâoºkBnô{ËÇÓe7· †Ë¸M™yX æz©‚ü“¾õ@Éî?·1ÓžD­IõA”ÑõôOuˆÌ\ÚI©‘‰ªLãÔ~hYéÍ~e÷(¶`eëÙå¿ç*Ã6k íÔf-Dä>`49<Ó¯âƒ_|yÍ,¤žJÍþe†‹ÎÚ¢ÓŸ¨;‚gþòèᜢ-v‘bÿ‰àÛ}xf“«A®—™¡KÁÞÒntâÄn3â‰ÑÜÆ”™¿¼£íÑ&X±„Üæßø€|2élÍÁçɼàÅ ñ¦Ölg*êÖ)UXøª´UG¯O e]Á0Âé»R¡çrpßíÿ¤D*£¯%L±ÏŹŒí¯±ÇóQ°\%E¸¨§­ y©[”€ƒ ª0o–ÜËæÓ,Vîïr‡žáØ<¼t8=9¦"p¶¥)énQhws@e>žÙ,tÌp‹0´ëëÛà˜}%à÷‘ÎgDÏk'¦{PÒÕè% "£$Z=¼©ÅÜž UB¬~t.Ux6ô‰“rÔ›30h u©'jœøÁ1¦Uç:Óx&¬å½¤³‹e:+Ê» ýZr;I”€Íã°ð†žY¬;cÎÝèh4šS$ûŰ€6Jž¸Ô ĸÈ*¨”>*ÙõÄ4NK9Méⲯ€ gën£$C"sÆ,¿på$ç¼çç©ñlìä&þä3еӉÅÑlö}}’_¢i†âìH(—m —ºüŽ DÞo릹ùôh]{€ˆýŒwÐ*WŽ\½7µL¾#èÕ*.Ã쪩p× >ñ<†4cyr?ÉÈ8| »Ðrª[k}Â}dňÃN}’[ñôƒwn a¤Hd'Y*w6æ¡ÒJÓÓÁ]?‹aB1y”Kx5•´<Ù7Uõ¯`Ê÷¯2«Ük"ü¶©oq¦¡§×½\„ }ÇP¹y²Ô°Ìi|¥Iø­åÜÇ–Trf)) $ÎlªÀ/Ð ^“Ã5qçCƒ’q2ì?»)´¯”ÒJ¸¦ªnO·í²! IQa5$(JRè]¡9íéÀæÏ76k÷iP‰y„‰¯ëBˆ\E ‹}ÉØ’]Ä‹g³æ K,£!e圬ÍñÄ”KÔSt­U*ÁOkïbfõÜ5Ÿ äã 0T +jÜ‹ ½OtĬäU:[KÏ–)Ê™riåiÉu&."(¯@y¡  ¾sÈ*˜%(ÜĦrÍö®ËÚÈŒI¬¡ú³ËFJ‘¥pˆìfÂ}1ÄÎ¥1"-(!ÛòP1vÃ|¶¥zEã2Û“¨…¼õí@Æß÷…2@ñ\n/6wK~¸ Æ<+-×ñxV$ýªjžG[§ói“”:™YÆÃ¥ºÚ˜€1¿Œ8DÅcñr&;Í’N¾Ë¤¥Ü¡ 8Å϶Œ¸¬'æ¯øü2Òyåà²B# d.a´ª$Hè·‚6‚Ô)a¾]C]‡©ùß÷¡ëêE½ð¢'WU¼q‰J/ÈM}×/¼R~Š^}Eéò½¨3Va—~Ñy ˆª?i…9áH|€NôJ€»H U‰^ºÆ¿b¯L~‚xµîº­U„ø?Äp`Nu–ìsrâ¸î)É»ïr7V£ ´A$T ãÜ ¼›‹I~èzg³º¿4Ë Ul-‘4§ÄµöÀú0~? ÷Ã'‰3Ýw»Ss½¶YØ—KWÿ3íø‘qµRáEt5¿óÛ¼YÑ9úêÜ]ñv0A¨%.mÜ4žÿ€;Šø#1ì;~)l/YöKvêÌó›DåË2wÐì}0éüŠv&oTZ¯'Pä“ÞžX¸A,ç¹ý1±˜B-<æOSÄ(ÃÈ‹éÅyÍù¥PšÔÄ`\èh€Ò ³aèlÂÊ?œÅÝäí`?ØQÅÃuçºØ©»¶IMŽ&åãHÙ#Ùî³ûÌRÞ—SMëÒníâa¡½`GóIhÿf`*ÞŠ,û&ºgG$HP3%—> rê¯agkSéE¶áð¨#‰îÈ'¥<“Z&kÓ>¸6Ðch¹ç½÷OçZ«þ妨³vIêÇíÛ‡¯8©á`IÕ&Ã&Úäd`»ÃOPòÐ\hNßìt1'ÝÁD‹º€ÜtrÓ°í]òõ¸iÆ@+»²ž”¶¦3ª.ìRS›mÆ‹ 5èW„HÈBÐéÝÛ­úôuˆ@?cØ&^¥ON泪'q%­‰“QÛ0i^N-oлOKËKÅp<&=YöìÉU\š —8ÀÞ!ÌÃ3‰ 4ùZüŸ†Æ"’õ…\BÆ@`1©òð(r <³óáâjܘ<ŽÞ Â$ëqÕ»Òÿ!¨Îð¢€p\sê?"Z+Ê[:Ù;´;‹ÆyÞfÒž—ÿ(ϳ$ƒÜ}æ{vÁEÓ‡RþA$b1ð¦øÑöLŽxz;qI'S…7LÅ]ó¥>0ûdÒù…BžGðÒÃî·6ßüšþrýsëNw]LÐr¬ÃôvZlÌx³ã ¿ómÿüÄÑ7Å-+.Fº=QmÂô˜Ž¨SÆ‚¨üμæCŒ ËŸ4àQÒ«S¥ú>¹^À5_›>\¹XéD)¦_€ ¥éö‘ÓˆoÅ=žR_€â| >= @UH kè5¢Ì¾J(ÛE°œÔnFµb-CErwέÌaOQfÿù|Úúãñ(qö!÷ýð¤ÿOΰxçó>M»°hºß«Œ] þQ"½ëÌ6®ŸÊ mšÛx/M™ì;SÚé»5;Žç{1ÛAX`ʽ`ölftrXIèÁÌÛBÎÊæ"ÙãÜ• æ ‘¥IçÝ´¯‚Ä‚‡(Œzï÷•Y9s#§FŒŠú,¢ ™zÜY×JÉ’NÄ/âº-ŽPöÅ9¿ÊºæJL)s'åÈv’Xö“˜9¿iƶýhO˜`wnd­­¿4d³LG<ËÝ7Aiµ:÷"Zš}Zl«cr¢~Vk'Ýå2¼ˆo·á­Â}• øp…i캊ðJD¨ÊççKsm°ýùù|âãœÊ@Ýieò"> ]×À-Ý¿¥`°èe S·ŽÔ~äz% „Žæï±2 Ø}`ïÈhŠóب Îx°ÔÎ2­³ºÃ±øø ÷RÔØÅW©ÿrg ¤ì±OÒý+ާèè•4¼£C« |ŒÑBxë9±,¾aûÊ¥$ªU°Ÿ «±Í6)Âa>m6mæYR?ŸfŽðÜY¸§–9ÄdpØ«ïw»Ž `O¸ÇX6!ÅWZ éÛÿ‹‹02C ÏÜ¥£zߢ hÜu¸LƉÕÚ)jä=²"i<Ô¢/©?@rªKi¯•Ò$E¾>èúÖ4¡Ì¤³Ø®O9œ]Rp®ªG¹û=M|½ 8«îp¦#ëpLÍÄ q䮉OjºìuÑÅ„UØOQÖÊâE/ ·”³ñHç‡q=ž”§x\{DwÌÏ)ÿÑÊZ´Nß‚[: §Ò6¿ï‹(€~Ågı½&q<úÂæV^æ>ä¼öÓ±ck`ÍšâvÏ€q p^§¬ ŠIœ˜[?6It “>ä|Ç®œ5U÷úµ¹wkAþl.ynÁúr_RÖúpòίòyª­ óìJ%(¡,¢‰Ü'¥ÈU}à‘Œäü4z´ÝK€30ä“;>AlA•È"aÅ©¸îÄ…ÃÀ×=ÓPÒŒ.ãÁÁÉÆY«×OÖ3¡ªGc«U³(zðÂD·ÜSxÜœa98oAžÏ§{sB³±*#³¤`/XÒÓëõ‘ƒG&1^+Á`{£Øß¾/¿Áü]‘‡te£Î¦vó\<Œåø«H–}ÑŠB°Uü.•ëB\‚¿™úökb/S×@¼EíœAœ¯â¿=È› €Ç<×#®Õf_³uÂ+YùÛ ©$ðù ¹¶©áw …ÏÏ]zñÞiJ§†–dÜèô¹Î¢e>ä úòªZ| òì'˜8!²ÐÈ ^<ÔýhÀÍÖ­r1­.o1y”d¤ËP0<œaûéÝ‹BÃÕÁ´ö|‰Æåà h.Þ¹” ôyÃf‹Û oîgåüPš„D"1OéØàp•T8¦7ŽqOG4J4×ÏIwó8¦tZò~Ì%¹¤‘®ÕÃî•ÊÃU ª½W• ïoPýâi&U'­ŒÉhÜÓ+ƒÎ8ÓõX+*D¤mùøh{)”À€uª­Ç®`HÌÁ}¢x¥0·gÇMçsçlüÏ:ý—ŽAµzWWȵý_dæö2žKÌeøœãLÌ5aº[Ò̪ëœÿùiÁ£ôß4a#Ôèïk‚‘»X‰©Ô¶0¤KËù }’•ÝëžäöœPaØ,ÂuEVÄ’ÌS€sÎÞèÈX5_QÄ©„Ë™ô^ì‚cyYêf‘î$1—# uà•–Ûh¹UÇá3ý-Òù#Ér™ ˆ¡¢‹†âêÄD).èKz¥™ÆëP£âN1~N’ü*ÄF*÷D +Æn@ ’êÿüìX‚Y€øëC%³}ŸÝÜ„iǧ‘Þ`ð>s§i9dÚŒŸÎb~lø0R4\:ßHR½/jí$¼´$f ÃeÙÒe ¦¦¬“kgÜä‡1YÔòÔE‘z ØcÁöQB-ÚÇ8µ1>ÄXìb¤ár$’£ ÉRx5ÖaºéK¶QÑ?ªm@4h®„ÿd%!¾Ô Í­,[Œ—Ç<\dŒÏ¨ÕBŸ¥Ê©yß"—ÉԭˆÄ;­ñà…hxQ$I[q=D€€ôŽAöD z˜±R g×fy0¾Kf~@LÁeV—Fög†Äü©G5Ô^S9¡Ý/WƦ²êÊ@°¤xÆ×$õI”-UGo¡™q±CŒ±-¤_¡“Ÿp[×3lµ=Sµæ5GL1sZEíPg‡‡Rÿ‘YÎ|?œÖ¢‚‚ÿÇê®)U´ jFåº1! uK@|Ì“*Càˆw™i 9c†r~¸ôºEYêÄÔÚò‰CÕŒ׸”<ø˜6¦*AÑOŠ3’Pé†v=CHãüîmt£@´Þ?§u&yx,_8»¥BÂ2Šºgö L؃‘¨ÁŒˆ1-õ^óÜŠ›Â‰e#вñšžaò`O=rÜðÀ®õé'Å0ÍMPœg§™ÄiYÖ/M70püqRƼ;K–"–HëÌ_=†Ë‰9¿¢™øÌζ—T8¨óÎ>¯ÅÙ”ÌЋ٨eÙ%{jÞÍŒ<ùÄH¼…%ˆ9KX]A¦°±^ð 1ÇœRÎwÙ ¢øÔ¢qÊ‚à[<°F2nçÏçä´‘÷(“bƒ¯G¸ LJB òâ:ÿ£G %u;¹KŽ^–sÄÍÊçÎØjv„€ö&áí¨1â'¤-LTõ`ó !]Ày•l÷*…Ñð[ˆê9UqDŒ£–« Ò–:~q¬-Þf6ˆçK‰ÍÙ#cî~ÌTO¶t¶Øà_H$rU±ä Ť‚ •Ü£¹ø¿B:¯^·#ÈooÀBÉñJä’ÓX%ƒIgs„¸5·ÙóÄìL³ïª7Ïl’þ£I€,Õ;ô»ƒ“q™VQ§Éˆ°ôÎŽî›&Jó]¥ƒ[e–mªÑõü¬-¿iþä4È\Ý Ù§¤Ý$gçìiʳ}2Åm»äÖÁt#Nm•{qăí!çEèV@1؆Ӹåj¯4k„9Ç&³‡}¶Õ½iE}‹8ÆË’¼²M’D`˜fØY½úšûžË¨^à¢ËáÏ”ü‡+“ºãû20Çù¶ ªyö×"nmuÏ]©½*ùÐm[9à9ÖÔšüÒQÀšã|-¼¼-Dú>"šÇ­]$Ψ#¯¾¶'ØÒT¦a3§’yZ[+/³bœ%|ŸˆD€©©z£Í­„·÷ ðÀS ÆÎó²}@~Þïæ PZnù>háeÆêï’Î>D÷!Ö€¿Å õ“¤6>Ù9+ vî2XññáuŸìòF­)‹p¿Ï¡ÃbsàRç… >À®‚xþµíp£¿ mço9~ËñÍ…Úì°W¬”Ïvã¥å_§4Üvx·°êñÏC¸×àW[-ÛÔ|fé4²¡¹áѨGܢ`éÉË–ýüÜw+JþtF[@݃rÉóóÔ)~î mÉ©PÕ_|ÑI¿¬Æ&ÝØ 'ÔR!oõð¯iœYðÙœDr´!0fÂ?HÓ´š_97uísœP;åÅ0A¡ã¸â –ø³Õí²ÇrÑ)FÝ- ‡ýß~˺,Ä ßñò ú3Ó#Ùƒ¡t€e]w₼¤ðw>ˆtþÕï(íoñ[“N.Ìì;Üã¥ÃGË95ÒàŠd‚ú³„–Å`ñÞ$Ñ´´C/ˆÿùGåb¢a,t\‚ÂúkÇn Y ‚ˆØÄ7æåéÈÖc#C#°’º¾%,,)J‚k¯O¡ì‹›ñ°&%TL)ý±;7þnkãÀ…X®„`ZµHä6Æýñ](2ÿ$ÚYýVæ‘t~J‚s1yù¬Ì:§}‹fn«L©¸C±e0Çö€1ÉTã Û™…w‹€ [؃$zm°WDM‡ÒD3Ö×Èêí4˜gŠŽGK´có¶F8bcßíÈA†kkµa,wr‰Ä!CýÅÑUÐ-›¤›Ý®¢Iz:Èï8QØÏ-9AMAS,ö]ÜÀB×äØ.ŽíÅ w‡ƒÇ#¤–×–Í¢CœðB#Mki¼#;9ª·µW¬:ëÕxB¬ªI•é Ð̈d¾qgÕy³˜›ÞÓ¢ï$£{ï°¹£.1·ŸÖjÏ¥XP–l“‚ó[Ž#ks·Ø<âÞ¦*ÒÿÇ.ß·R¦eâ%ù ê¶öÍXžSë °#œÁŠfíÂܵÌþçʇUÎHܶ㓌6)Ÿ‰ÂQÌfnxÄ”œt—)"´zú hŽ@l|û·hø2e@žå³±0˜ºçÑ’h‚mÃ<’Eù:™$HáU¼GBꂈû7#8~bcˆ@“¢ë ¢»–Ržj ˜âö7¸ys›¿ÈÍŸ¦Ê˜Ùæ©I.äI<¶Œ˜ËJH•‚r©?D³…$ØE/+Ü%…’ôÎâ4ð®Ûêí —$ˆ6º'x¼ê¡¬Q# a.–X^q@¸ ÚÓ‰a6ÂÅ™UFVTغ܉‘»ÈRwÞL`¦y›%Åç²0 È=ƒ(û“D;¦ƒx!©E™É#Eñ:Q9g ìÔ×[8uQ…„W%s '­Qɪ'É4{ê¶m‘ݰڨSx~%E%plš™”ö +—yÀ1ß´³H§ù§IçUÖ0Êá†}(½‡@Pv™ Jl„—¶)7>G¢¬hVƒCçYï"%µ›â¡H¸³~º+”u2.N–òA=Ÿ@$©â°å(]#2ÉK¿P™î벤,BVH~?õØA(†Ó\Ƥðñöq§Dvá0Ïõoy>šÖæë“kÕ¥Žþ¼4MЬêÚÞµpS> ®A¡©Ñ•ÙŽùŽóY0`¤üÁP”9þÂãa%ˆtm8õ¦˜…« 2u†’tqMÉP·Uäü¬öë˜;¢d·W³ 0w9¥ÐYz<äœÍn*€`@¢·£|èä½ÐËøÚK{ØšHµp¸!×uñÏÇZ¹=|µö£'›¢´˜ð/-ãòR„½:ˆ™…S7û:Še’Ht+Wv¿é@`ýF¤ˆjÖ >Q½c#DÄSÑ-Dóž)otM¢¸f0mrC ë4©ÐÛÍL&áØTc5Ù`Š‰æ‰˜Qh*žDI‡9ÙYEuÂ*îY£zóc@b©œ†–6ý’ç×€×ì1uJJ©ÒᑯP0¶#uö²^ï78äyê£Oí:êQJqöºOŠ^¤æï²tUäŒ *«K³òÚnùÓ¤& –?¾Eb*¾X²e€b´ƒy‹›‡ð–­%ÛbùŸ2Ã4%…¥®NñÀ>í¡3F×) :‘§[õßò]x=Îe­¤ê"ø0 ·ø¼Ötu^ ‚»é­Mf •¿á2þƒ¤óË)—kì:ý^ Ø­ŸŸßøÐŸ úL<—]¼*/:âëŽé¿úùx™©éßbµj4~·hŒr]¡ÒÿYŠjT?¿É4ÛÎ`Å•÷ûõão~ƒ×0°›i]ø {…ú@x‚ø°sqÏæøzæbÛúÇã¡¢¬«‡3Q,o¸c[—SQ]pLðﺂIwׯ'q“hÊ‘v}þßpû/G+ß(ð§å’I×Ã<\™:þý|¨4fRDßÍ|­ª…¯¶½=Z¬©MNiv”¡=Á„ÃæœjŹEž&æ ÀöóŸªckG L=>êÄCA°7Ø¡6Nǯ'ýã~$é±[8¶—qG¨™±Sž% 0õc¦]öXy¼¦”–Øæ»£/ {ß.Üšø0VÄU]vGÿ’"ȯénhÎí3C7'¨çF÷p(9s¹'ൕ7"™MB‡XÙ»‹îHê‡hÍc‡;QÌŽó´ZŠzo’|$I@CéÆi½g™ŽêèxâÀ‚p¶k]Ûhèì|#ý7¸ÚïÃtùÅS sô\ˆÙ¯É˜a|è'GBPŒ4ê 15"²2I•$%ùòŽ…£”3 p60Æ/‚)3“c+á¥×,Ñ×ÄB;êÁÁÖd¿è}.±+L¨™Ò‡?fÔlÌÌ•†ZÕãmõ‰B½pˆœ%Éí‚rYF\Nˆø!# ½–wCÞ©¼a !/\O%÷FODçÝ—b•Q5ÔCæó6ÎÀÎÒÅÓÿ>ŸÒYÑG ÃºœúF{Áô Òó)Èö (£v YÑÛ²Ò §ï5";@|˜·ìt.¤NÁ#brâPÛ‚ ¬ÑZŠˆdGµ•ÊÄ„„êÖ‘: Oú&?Þ{ŽóÒ˜%Õψ7@ï8{ümÑùñÝøNrŒNçX=@‡¶Ì5´ á‹gûýt<°#ÿ,ˆ"9@~S»iÌÏe[ÒÌŠ(%]½’p³¿5+8§û2—çG•“`|­øÈI:KÑ 5r”ˆwÄ.óþb|?‰ÍZe­|?¯d¹]‰ÅÓrN;ižïŸ[9n©á~¹q IcGWJbJœÜ+ª¤®òíˆüZ^^ÙDàyZDt“h‡RE´X,Z¯„’Õ:ÁÑà Å™*òà^ÙoÓ×H=3…À¢4‘è÷*€¹øêz0aO«•;YŸDP$#g:1ªf2F‡ÕË%iK€šòSCtvk:ÂIXš QÄél$ðsêÒð[Ãb“í- Åþ0Á¢Ë»Úß}r0o=¢¨T& eeßÈÏç…W›&êàhêioòO"¶J"²HF)öéV'ÆsÀ.«ÌÈZÅh ¢«ëH>/³M¢Ð#LŠz? –/ï_¥k‚²6˜c,ªgiV¾Qç³ÂçgIÙ¸pNŒØ!ÒϨ¼Ó"PìBÒ€¬ô€€Ý=“ÑŠà¿1W‹Nî«z%)ªH»=)M”½‰|½Õ ÇÑSв­µñC'˜gE.v‚éñV/o:ÓkA.[w3üè³{T9 {S ªå©,Ôvº§”P±§1”š0<Ë!Š!¿±]vŠPö4IKo‡€M!šÌÈU¶¼I!'›âQ'×*yb‘™œWñ®^±SW'ìåx­ÇÈ[äq(Õ!Ü8#ˆYú lu §ŒwÄÕ#^³ü¶‘ëT þ‹IçÓ¼…‡DÔ-?pq%)[º!uü{??Õ}£ý{n-KßÏ_ÿ|ÏÛ÷ó)ûÇ4û¯æº©šûÉïKDÿý÷߯޵_±Î¯ V{÷þ%Lö6R»ëNÞGh5ƒðx<Ú´Þß®-¿Ÿïçûù~¾n6¾kðý|?ù“„ßDÍ÷óý¨¸ ƒŸ,ÍTå)p†8†âº6Êïÿ<ðñx<ˆOð18óévÕõF(Õvì ­¬qJ¼?V"lEöÍ~Š©dáÊ'ç]Ù³V5…PbQB·Æ™kwä©ì_øîPv[Ë¿¹Éö0µ¨&­LôÙfÀˆ øÂÅwAÇx#´²jë°{Ê׳8›qEU¯¡]·è@?ÂêzÊ'ÑcЇõ­~žjÞ1ÎíXHô{:£& m™´•y3CMÅ ¹³³÷Ù‚ #ÃLŒâUýÞ(°¨¯ü*ó!Kô‚‰‡<|@¾-.šÌMß:aÃx´n÷“´`.&ˆïi÷Û›ƒÑpϣBböëJ€ÛNˆ.¹¬&‡íËmUþlµ‰2?¶kÎÔAyàvÛ»YIÐM¦)VU0ç'ͧÑ匮»8<ßÒ#tq*ác¸Ÿ‚£Yy‰dPÀ‚Ø?ö×ȠȦëâ‰swTQSã¤AWäÔã¯Éþ¾1¾!©¬”&·ÏF¨ÐÎJP^UŸ”oopö‰æJáî4$*.½¼ÓIÕ éšøcÛÄ)QÅpñÁŸÓ¦cP·v5]2¦ ¾{ÙÄ­žH+ÄÁDí`ªl¸ÆdkÄ>v–Íøha§Õ$zH7ÏámÄ=˜ËÏõÄ` ªóm×8Ngó6 rçcÖ ÿ‘‰¨˜‡„C¬+^XáfâH #À¸¬È›½¾uÄÖ+:´îÉQ=»¡ lÇÝþ‡9…¬£~mˆQ‰UW¤ƒa„žÉá/Ö‰Ý8±ï0ÈÔPàq^-:É#º²×¿»ù#ÉÅ­»y¿t^iUš ÷²{Z˳a \8b.êx~Ù«¶ {¡’#B¹¦sÐdÒ”(H$ù"Ã¥k4,-%»}ù‡§Íøñ£ç”dÎÖhÅ`c”"AÃÔ0ªÂá—÷ †'ƒi7 >ì¥<¯¾…p‚Lr„¹ÃÙÑ r¶´ vÃã‚Ó½Y‡`|K—£)ÐguƒN²-ØÎþ/Ó»bIÇí|7½@@ vì*Kæþb)þ4ì2É¢!JK"ÞÀn…ÀÉ(®^šc1/¡¹-%=’èLû¡ãiŽ%ñŸ1Á5RM Ä]$@Gµ:éf'}ã?Eb§ÀE/:¬Ä³¯=ZCõ`Jso \¸ñË'w8¸XžBøtšiM3²ŽÑ”³82šqS,QלôŸö¤TùŽjl0GF80ìØž-æ]2)Ò<ø ¡ÞÓ˜Oõp[2ÏD1oˆBæ¸uOÆtvùÑ8šA5Ë&I±mÊŸŸV¢’ÔõL:×o¼ŽYÏ¢`èh&_¥*ÙÔ@Énʤ¥Ѱ¯É Р5Î*K€NŒCœÄ)ÒZÉÐ;û¡Uw×?X`xû$ª¼ÜjñûÒJ³Âá¼m=˜{僚 Û¦‘äv ²ç„&jSÓhäJ½t†Æ™œ”[Ë5ðwÚ‡u0£Zþàge:ù–õ§Ñã< ?>óóšÝü²’÷£µ‚ò s ~$fRàoxAãûž6*o¡>ùª³véd—À´r?û\üd}ÿë5v™DòÜA·Y™Hà±§Bn~µÃo H< WÛ•É:¥<|PÁzà [}!œ^û='k•ùi0=oõßû`R5ü•bû¯É È%åmèí&ò»sæ‚m0=ÜD÷1CÞñ$¥Û~£>,NÉ£? |?ßÏ;2Àº” ¨@ïù­ë²ÿÉçÇjܽ“E¥Jû5Üå­O‰é@ÑfMQ³«©¾6¾|‡ hÇžnÿD›!¡yáx4æyüœ×T.Žê°HP–$æ†ìãDúŸ†§ñ5¿ë¼qÐÆGÎòv_ÎYó ÛgzÅDÑ`Ô:JF!È6ºKÒM ¡XËÑÌ“C¸†¹$ƒ=-Vh„²c‰q¹ì½·žáùx>&«tÒË”óG©|{%8ß§ÒÐXÕ†Ø:#-뚸!‹Žkó³9jûŒ4œ@U‘Ú>)™àäž›ë%>š‡vã‚Ï @õhrz…¥§HhËÄhXºîê%¾Â—¸ÚáÊáÃïè~Í™ÆbÄ•ŸGK;CÒC‡Ïrü‹»‚ßÀŒ ,©Ã¸(9xÿ ïË©70V¾æR-Ys·Ç¿ôöº*Fî¶J Hë"ê2«­ë§ôŒ\y‚cVx ´H1à!!Rƒuì²çèº>FrÞÿ¥x8ù¡éRgT ‚$àh·Cba^ Mܺšæ:B\R»ìª´Qäš%0ÚÆJ­ñÌ t..{c·`ß1»œã—Ø#aó¬Ô{/­òÕ§™ÌìÜ‹ÓÊ"W/!·ISrväßx‚ BîQ×ü™áB®Jk‰”ëd’Š%êµI¿­mЦ uª@r'U®5U'f¡B›Pb«É„{tÞŠdÌÖÖ"Ýõ¹+xüý¤óså˜bY@æûˆ@KnDtv\ÞZ·¹‡ÉÚÅ œ’@#Èm"§µ7HdW‡–&}«óKF‰Pü_<`D/}'.fó´’cQ™žæÓ7&#À³pê‘ u÷‘Xâ‰&®¸Ôã”å2–7Mj~€z=%)`ú:‘¶¹vn¤×,†@0Ƥ–gÄž!P6&"›#™Ðm5%áš7Ô°?õíň|¦‘G’‘UAüº“4–xI7E`Q`¿§¨|—ãÞ½HòðS×ÞÉ:¥„EÅ Wjž*iÈ{I aVÒlûº›‰éߡҵ$íd¢Àpão«‘açkDTMU§À€'!>àñD@|" 2q´¥a-,ÝÀàµ6RѶ¿é:èu~?¤ÁÞjså&K aè¡ô\Áõ`Cn©³Á5Æ#h ZKãZ;’£Ú^”*7 2ÝÕÞq~÷¬&'jÝuþ B›£æ§J†çeû-À£ÖÙÒ¸@’–psÙ žÌ…°òjÖ¨‘!›bÿÿDŠ])ó)y±zǶsßÙ¬OBá*É©â9»$Ûn8°Ô“ÐJß!“>{71KÅtzë8r^/•[ïñ‰à´C÷÷T>†t­åÊà™ÒZ]Å;âN|'à§÷Ø:onØ)¼Œ’8¼ˆb 8¹6štõ ZgÌÓ÷yøv…`Ü®QÅE!kYÊ0Gc ®¸ê/YHúÊ.(T y\Ò¬wGEw2z–©¿ƒPrŠ8¶Íi-aú=M+g˜˜]½Ú,EsDqŸ«Ãîöç']¯®™ICºÁ\#®/ÿ`S6Ó%Ë—„qŸ[%›‘álÒ/AœÕq)âs®u8Ã2è q¾øÈ«Àà<šÇÅKaŸý^^È@NW­F„È}ªz…iêTLC-AA¨»ßÞ¡¦B´¼Òk–ï70Õ#·Äô*yf‘ÆÚ¨XÏüæ­Oì“gÝÚߙҹ*©þû‰v&£/nÓŠ÷#®Ñ+œxÑ;Y@]¾M¸™¿uX¾ŠºþuÚxuÞÝ¡Èý° JW#úFV˜ ^ ‹’QDü6þŸ¿C:‰Æ‚'{„ßÇ û¢QÒ± ÁµýG4ÐÍž£0øÚh•˜?Lä»úùíä"5мÄý9ωò4æp& ·€¡Ï©UìàÎ>Õ‡[µª7‚LýïÉ9-G{yóÞNuù„Þ½ˆ‚L"׎5ϧ)–xÒV&ܤ€ÛA“»#›Ïg¡ ¹BƒºXOßî3åɶl ÎGPkwdEJ$_uˆÙ׆¼yÏ Ý§ÈûÁí®ê{¨,ñÞ,’ŸžË Î1±m•¶‹?(F®½èLÆáÒ 0,u˜‚°¯–ðå9¥—¼žzñÁ¥YÁŽ;ã5K¶72ËÛÞ!RãZbcÄÕ96™½Ôn’F´”.‹Ì"i' Àœ< ¾i'¼>Y“#þìÒ¡z@@Üxc°ñÚXž  Ç”â6-ƒ6ÜT3ãiC.†?Ø„‡É›8ÕÿgïÊÉm$ ©ÿÿc ~È$‰›`’ªZZ¯=Ó]%¥xà #…&á¥}­þD“¾í¢AØ™eÛÛ¡ŠmezÂK-2é§š(Ÿ{:¯ˆÈÐXÔÁÈÄ?½A‡ÚVãÈŒ—›[ÆlÝ­¿*¿«jwZc9æ¡g¦¦šTó $ÐXéGšSETIAà…M…¬ M‹MÐ"cJ¬@‰ÏÓrÒ4yµƒ‘Ѩ¨lõj¨:r.3 2†ÑŠÈ,l´wm]7ûÊÆS Þfá”…g+ëaÍe(G‡Ðé@1ßâñx@¨ÇBçmµz·Õ’€ó}{Ò”c¦%º/ðHâ Ã,Y FÀïóB¶ û¹—ÎyÀ€z´K³~ ç°o‡Ó 6ÊŠ­+·2>ös“­qÙ'öw¹UtŸ9þ,ÇF‡äø|>¹ 0ͨîù!÷n¸B£vÌR÷7%­÷üêuÏ+¼Ã@Žyˆ.µ\@ùDáãxnGj…ò.öÃ`9Ë-4ausFàÓq‡f)]OÆ—9¹”ñu¡%ºŽã•"~œrªŠ7Œ'9˜ÄÒ‘H€Ëô`9«”< ͪÛ… UØÈDÁçjþ-v¬%âè–B™ŒƒYœý6aaÃ1 kû??ŸO €ì.JLåBÐSôð±ð˜íiœ@V•wÝ|Mº•ІŒ˜s;á,quúX– xê‰O¹pbfàw*‡€à/u¼k7o«]^¢Øg¿Â²‰uÖ7ÝÿZJüìà<ÊrÇvù€?áãñ Kwöºñ×þ7² VR}á‹\ãfžg B†Ð3'L•' ÂÑÓÀ¨³`o½Â+*[øz£qÓ±÷V0 ¥B^±´´Ó) wCHÿJ]Ä n bÄPÕ$Ž ! š£ÞÈ@¬-aªØžü žˆîfÜiäAMz¨€[Æøé2Xáâmÿ Àa[qÜ·¾Rt~Í|²¿X’Ï3£·~>[ Þ5žç¹v…ÈÙµækpõÁ.“†o s„©•öïð3¨9À•AG¶Ï Ëyì[\Tâ«úûÜɽoù. wúBGñ&GE§¬Ó¸ñ„ÙÌ  9ðMÞâÖŸKVn´ô²A·ç‚ ðªÓzA­”®?7öþ ‡@gìÒÄiã¼Û¦ŒØ€+[C·Byù´CKÔŠè‹ÕÜ1å˜M>9à7½‚Ó$áovE¬p*tà¾L.ã*ìâVƒ¥ãêŽ8fïév D€0î *…2ËÍV‹Mlà*5¡B õÀZÍéà ›l,á…(Æ´€ú èÉñ€D* ü*AV” ‰©M:‹$ó–]»vzб“]Qwñǽ€%»wªg[ìBÙ圉³‰RÀ^qG>E‚©õMO!3w•¯ƒSî}îv>`8»Œ£7ØrPNe_B­ë†oäî¶>J‡ÿêã~‘èüY¤‹ŽžŠAP­µ¨º<õÂŽ1Æê½Ô‰9v¯p¦ÑÚ“—J:¯¸øO¸!Nc©¹)mp×ûˆxÈ@]µÛÊÞ#%0Î'竈áÆbT/JC¨ùÙ"©_HÏ'€Vð·Ÿ!8Jƒˆ†v d§ôÉA«D“hÏZ«oÀa=;™>š‡Žî‰(^àäÇr†¾;]Ù6RÚ*ƒ$6HÕÛ‰†ÛPgk¡*2þÊ6úöÇ;߃¸SGyëÊÆÝÓ\k)ûãÑ©³ãCÔ|È•h 8%h"z=dªCM™ØX ùî\™Ù“YrÌÿi7̓Øê¿·ó¨Ë¡¨mЦ9ìA”êj˜¦Ù‘uªö‡’ˆÚlÎÜíöÖC©ÿŸ^ ™ö‘\£Â5ãö qžúÎܤæ:Hžp#”€ßü•È k¬î·”[`.àŽ*°‘Ê0³Ì íšr¤’¶©e•‹.å誫›t&•À¨XNö†¼CâÊþ¨gËQfGa†]þvmµ^ºÕ‚«HÞ×ñå„2ÜO[‡vxD1f /f}½a£-Ë#4¾)î©+êlZõ9•ÈE÷×òB"ÈôÂ?É®'w¢Z~Ù©WˆDG;1†”:úêÉçD-ô*qB GWäÀa²æÅUâìþB¡žêèÅIÒ3Ú•1ÑBs†¾¬?ŒÔÁÀøš8µÔí8¥‡Æ uuŽd|+¨fÊó‹\ç*äd¯‰ÅJT«­“àÀÉ€'ùUÅ&jÊLí—:a”Pv+Î@ä·Ö¹ëxJqS$y±kxÉ€4‚0ñï ‰.‚ב(e%st`8ŸÉK‘‰H`Zï‚Y®ä¦ð7or…À¬q¯Á Z2—¾‹»i£>uË©¹DSök’=ØGRÙZ•Ï=΂=¨„X[Ü H»æ4š»âÀ¯Ã@D[‰F[øé7‚®ˆ\±07",[êÕ,±ºWõjzÁ»ºðDô|>7ÌÅÂýõØoš€¥Ê=ð2µ¿ž1“\”i8e}5mJ'œˆº›d^è§(Ų®ªÔE™n"§ Ôhl;ä$›áqÍæOÖªS±¥º`ÀIn(îc”«•¥vzûìAÒpÕuëÞ¯æ–÷^ rŒy% jÒT­}ÔwL”ro[A(L8Ì Êï#ál`Cï·""€'ÑcêOW {“tŽ1èU¾¯ŠSæ¬˲À5·á|Ö$ú?CGïé4f8òžY^¦-ÁÝ%«”Ô4ŸÐ.éU_ÄD èUÔqÁ(UäO?€ðKEçÏúwd Îb°>‚ðnfó{ýÔmÅRØÚÿ¹k€Òîc%oŒÒ§ó–ñ¤HßÂnÿ zqýÑe²ùëÝß…$Eë¢tät°"Ø ïÝS¢“_ÌÁÔ6ˆ¸äã»Èjvè„ný  hrø´\Œ[ü–{÷)¤çc¬ÑßíÈîþèùsæ^DÏú]žâޱö¬ïé¢ñT.X¬ZrŽæ/µùWþK†`/))÷…>­Ì“Áʘ‡Êüö£¼zµsõ½¦õ…»Bß¼úšþŸw,æy% ùï„‘ÞÎà’Ÿ²D7k“W ñcl懴ޙÆ6œ…N½Í$åù7oÉLâ“Ò§ÉÎTb溆Çß ýžùjàs C]Rš$£¸²½<×UýQÊ#¡1V1}¶áò‘sÂzÒEùžÂíï¼13úÃëTDb3`ZÆä&—CÌ—”À)@w£{JÊ]º§áï”Ùþ“|iÚ\P´0.Wt‘t•.ƒm)G»(ù–ZùF°“ßZ;¾’Óéi¶=õ•)Çɯ´V”b¢Pž·eÇŽ$O2ç:Ù?)õIÉ`‹«+<úÍBçë‡4¯Qž°õ‚U2÷#‚ÉãÛH?Øß™qêèhüê;f—Àé’Sÿ:àEêú‹ƽ¿Ô»&Û/²oޞР`²IAýv·*…®€¬/ƒ3 ’Ùn‹ŽÒ´ŠUÕ1'’²ŒG¢ô^‹Aº—Ý@aÅÊ&}é„ú? ”LçÏMðB@VSgšµ=Îc,ݾ/DÅ(ŸÌÑÝCè[Hï±Gý´á?˜wþÚ‰?¹üÈ4 Nš—zëÖ¢ ¼bHø–Ç=üÉ(~úxT.„ÆÐpÃÀÆv¹Ó©+w9oeì'• ×À…Sê ç(žŸ1 rÛ52#9U¥‚)[! ÜŸ ÌÈ›Ãì]6ðБŒ‡Qç¼×Cq!Ev‡ÅÒD2œ\š«²èï‚ìj5a¸^¸b=Fþ\€!ÖÅš|ÅÀ’`mŠ0€ò—YTÌTåÆe/Alƒåh~’K&4… KæÂ2.íB£”Ú´ºRAD×pÿ¡¯dÕt»ò€Áþ¹IÜ5Di8ð§õ2 Dtd*WéQ¯ÑtH%Â2kGïbªZÞ.…Žl2jSS¬10jçnJ ¼ŠFëh—I¬gâŽõ´ ˲îPêŽËÐ á!EÞ.¹Ñ•IôÏó‰ &j?®æ!˜S¿G¹Ä¤ÑÀl. ÅSÒ`D¿t]OÔ{f>Í [êVÖf­p$å"‘E誋Æq­jþ5ça}T2w÷+ŸDÆÛ.U“‘¦FÞ}ø.©Ÿ³5m­LÂ…>¡ž!€`à»Ië"HÂ*îÉÿ‘){õØ,²"Œ¨(šD¹\ ?F²Ë[t¾œÉ‘OÛg\Øï1 p9S/GXJ@ýRŒáÊm1e ÑCªèá4®“GŽ¢!‚De÷óD?îÁ¬”Ô\v¿’ì{´7ÿëCÜåÛêcˆ;9VÎ6ÇJšf:eõpS|ÕÄ?¨@œ|ó†µîUÜ«¤¥^Ñ|BW"7r:É5H¢$‚ç*®q?™T²Y•!ÉYÃé´ŸE ‡R,³Ó±µÖ®‘œû©ôyš'RXR·\k‚(]-â¹aÐY¦É­ôßëk«¥¿’E•¹4, Q,Ëι3ð¦#M3(§°Ù+Ä=£•üx1ešJA]Ãê€\¥Ñ×% !dŸ“·`fcG$ `4Að­ ÀË[X´$o½Œ0̵sƒ.!t¿Ê•¬# ŸˆøŸÿÎÜÑDç°ÎÞ“7dbȹtŒpj#-Ҟ Ój\tžëúéùM d… uØL|y‹¤vß#Ôï¤$N+ œ)‹— °ÅïhŒMc×B¤ŽÃ- 6úªÓßuÖŠ± 4>ÙF àIúH„V„ €k%˜ä`:9 ©ÏN³W9ö8B,]¥óÆóŸo Q¬©Î®gýÞæZðwý˜&²²€ ©ãd*0¯†zµŠi¤\=~/Ú ‡ùÀ©3®\‰Øš‚“¿Pò[«Á3~¢mû*ƼÀšô¢e sY'©0E‘üì¶Oòô6rÅ™7~@3Ð*ëª97žÐa´U·²ÈG<WÏÂV7Ç¡tú„€’ã4+Lî@á´8WyØN0’1í+Ž-YuUÿºè¼œ‘2xœ†¬‘ZŸг1ÖмÏx•Ê07°j~ào½>æøZ“Gå ¸í'¿`¯èIðßç>Þ÷eDïÓ-ËåÆ÷•ÞåîtúÍ_paNÁ¿òºC@æ'¼þÎÞñÎÇcSØÿnÖߊ÷^ÎüyR<ýßñûúãÞmOëpJx<º#¿‡ß+ðçœÑ÷õ}}_ß×oŒ¢eôyIHív©.1Y;ï?€ËSûÎ%wb<¸0”KJÞpïÇÿ©ÿŽúI^³ÊàcSõáÜ,ÈÅ6YõÓuáϬ”_od%^Z9ïˆýêcRš.€­Hªœ¸×Xî’K_½~J¢¡2~f-öaÁ™+«O"õ¾ž7|‰®ö·#ö¹X›{YºÉéªPŽú`#§í¤N}€¿%#ª‚ñ·?õé âîì§'ʘöÎN®{}bx r˜L˶Ç\Äõá ò÷Rô²ö¡gD'µ @|‰º•X–+A}µ1‚Šà°ö°U‘³B@^—ÁdÇõ1 ÔÎ&-l¼{¤æOÝe*©1$Íq£wKÜR }8%hv˜_rpŸ+§•‰Ä"EC_oP¬lçE¶=/×{v¦nÅýÛúXøz¬bý÷V7åó‡Å¸Ãåç=’ I¤¯F£'„Óî WÌ Ðs@ü¾:"•‚[æ¡á  àa+_GÉ%UÌøÉã=ë9ÍÕÔþ –ج×~Á;ÏŒ4È)“¤ää€fËÅ®Àvò\'²fÐ9S§òW‹¤Ø£~Öˆ]ÐÝŸ–œ»–ï·}ÍV©QÑ«®4Ô; hØá\Œ]=‡ ‡Òy±)ñÙÖÉÙ-èß®‹r†r©@4‡_ºÐ¾YñµõCîÒ °¼ÑòÓÒ¸]®½³4¿ÃÁ‹8gÓέ3#´4×wÞ[sOi¸9 íŸ‰U@.rŽ™´ÿð‡B%β8Â!Æafäc/Ày9O ½íT6eŠç§ µÔ*ÜÓ%vX`§²ES7T àpLe>ºÂÿnÑyšÀD¤2\mE¸ÊS€ôM™ã :ӬϚã®J—:…Ï®h¨i;±R®Äsr¹–…fb\©äºIâòãs‘Y¶¨«ýhÒ*½]Ã~騽;ÿóö¨ûÊã½€Ôn²ìâˆönÃK $s¼cG,•síÏá#êTpŠÅ9^Öðüýغf%>/‚ËÓŸáÑ7 #Ú²Œ9^â 1GS5RŸˆmd·R§ãk X[¯d’ ¬ŠÅ‘lfrfò16è1* ‹fçÜšBž>~ç ùµ¶·q%j"7L.ÅI<žß,g™®ßßgÝ›¼zïÚ"f=Å#~Ûûs²‡§1úŽÅå2pêg„È´kÔ­ß§‰rˆmüsÉ%?µXÿî2Jø’ˆt}?`‰öÜÀaü–ÓBwä1ß×Ëß.´¤Iý›¾à>›nªò½þ„ƒú«GÅMGþ5c$;?o»Îâï:Æñ /r6æ?åæ» Êa:Þ÷õ}}È!&Â2£?ú.a-rø®Ô÷õ·bBø»:±ß—Úî·ˆÎ_š^lvóIéç/ŘԽ边›!ÙmDn׸Å1{ýœ\8·Ekü¹›XðÀ°n€xz˜§d¶iÙ„ÀüM¿,´ú1%´2S¥ý† e)žKýxq·{qØšÚ¬Õ³d¸¹¨‹¶^•rªI¿Ð)ŠÈD-°3Á°@äå&øÅæb „¬†hwbÄ ÆÕ1B5¼j/‹‹u’îkb8h‡ Ç]·®ãßñ\d ”LâI=UûE;Ã《GcvJJžk,”b®ðÙ\fªsåºåœÐ¨OµY-t'ûÇ yŸU*4ÊQç¾Yg÷ð‰Ñ$Ã[3Nùi´’¤’ãÕÎ!O6t¥Vm͑ЧÊ}f¦;¼]]Þ\9ð“Y3ë@'—yºõ¢RIÑᨓ;!fF(2O±ÞÀ5»¼Ø©(‚ÕÄÄ'tÓ´3]øÿ{–3Þ©ä.‡îK “ŹˆE@"Á܃ެ¤~ßPK+Í;Úz¿‘¹Ñ1HBî`çiÒUH©¬Ë8š ËøgGr"j}QŠbÂA«–É‚±(·ì$Ì›zF ÉÍ“ =(-²ê&¨)ˆ(ú¬OâGÀOša-0Ï -ÅZñÔE³³Ü´CPÕà­ ˆSãsåZùÜ¢‚e8.cR°hQ£.ËéÎ ­ˆM¯äT¤÷þZ%B9ÍêKyég]‘–¼ ÿ¡8ÇúÜÕ[RåÖÇμ{<”¦…ÿ´LîK·›Üqx\RcâyRiur\0¡JP ˆTÑb*æ’µ™[t~(XQñqPlWSÔG¸ég…ÖY 4qØ+¢q#F/Ií>ìO+í>÷f´«w!’Œ®½ç‘™qì¢QÞBÚ¡ÏÊØ»ä¾{êůÑ<¼Ú”Á½¥¡")®åï>Nß¹”dá-&C³ìfC3‘2´±…G€¢ †o[†Žkµ¥±…4|92Y‚('cq­†¯ðßôe‹ÿ6@™Ç0 ”oŸÖÚßO¿ŠhQ ÔGæ>¥Ä9ø_eh q6ÇQ^Žm¬öè“Ö‰–"ßmºêTs`l€€™ J¤BIì*CçÚhŸð±©= Í[Lå;¦y‚-ÊÖC„ÐÐ8g|pW ÉôT†3êŒÌ×´‰,n ··¥…]ÅÏ(1ôýVÑ~Pµ+É“vBUK§R ¤¡^ÚKM©˜TO·1ùj?ÒB.Õ°!Ö0™êz«¼hF·Ç"nSÜ·ÍQ_Å.þ¼Ò’—\„âÜü{Ù°‡w(ê(Sîð±›ì$‹OPè–9µØ3x‹Ì5+ø"f¬†1ˆÄ•ç©”$-G×! Ø’”»˜ ÚäYÚØP°(ŵýDki6Æäá…rCi Õ¡=#—H|Dú†æ°™dM¡D!ÁSé&ΚÛ€ÓS›?³ÀeްVé´%š¤EÓÁCÉ·ç'›FÆ]'ÍÕuD,c ˆP¤èÒ5šÚ²ëæ—à OðÝž= d“0Vˆ¶Ë½øÛe_o@L7×ëM¨„NÕ§…'šµZ—¥Úe¦´Y¿Káñ4ÿæb€;øf±¹!A´™É³¥Qà±¹ƒµø™µ±O]•†rþè„a± Íôw+!(h<½&°×VDH¼zx¨P÷uclWþÈØäuÕ,ԅŲðØËzøè8÷©"¹ò<†ÿµ¢ó“õ•ºFˆÁQðÖ¤›Àx¹ÇÜŠÒ™„t>ÓÅ €‚Dçtf&kS~¶³€è@§ŠÏ¢]ÉÃ"•Wù¼ƒ‘ê×!zñ×vб_àý¿èzö ?òÜjzy]þPô¥æ­œ·»¹Žÿ–×)À{…¥“ß8+-à$3^Z!/¿jôóJwtôWq‘àl}¯GPdÌZ$ ’á~/@¾û}ã…—.¯75`‰€·ý¤e¼_é‹î|hr‡:b>ÆæS¿u ²ãù'ùhYU"%€þ1B@{ZwŸ@×Ýs ?"6ü5̹ ýƒ@¿û¼,ršnºÎÑߥ^ý±éÒ¡€ýಧ=;ת:òï•G}‰ˆöÛíôŸÿ¨¯ÌºwÆÊ¦Éýõ~»¾Èˆ2©¼®,$Ó~Æ÷Ñ¢³«?¸G>*™& n|ÏTò!ÃÕ°@&ÕÚ+ãÙ±9j”ǵq‰êàÜr¼Î‹t9 Àdz¼GŸp£ñÓGGÁ`ÞDŠRšç°ç y×ÒsõäsBÈðQ4;*°WÑÑ“o¾µ=+6™|9¦®žaóǨ@7ûƒó¸OÔ+w$óG>óZzdÃ'g/«b ªxM‚®iÿ½†_{߇Ÿ<"ªà8 o‚Áø2d]‰ÌGczB(ð%]N Õôö¿ð†…ŒVïLÕcÜëÃÛ7íüTêäêØÛ¸Zœ÷lڛ™`Õ™–[!¬µ‰ÃÒj e«ºLEù›"æ'Nê&¶xÑWÜ-¹˜^øË>㘶¾GÒÔL:2zï‚,˜ÜÙã4¢Ú’³Yt»rÌdÃ5 ¢NÅÜ'VÈsÇ®¤L‹ýLØÓNNÁʬ`tÕ5µ¾9k×z5Dz®–˜i%0¦ñX‹£?¹ ‘ÄöôSGã™å³˜©’=¹6B¸ÄÜáÝ3Twé0y»–ôÕÞ{Fêºd}®Ù&8^؉ÓçrZü¾ÅusIKçviy]Àå!Ù4äû«¢óY~L NXsŽ&ø¹ð4’Ñx²ÀèàF Á„ª-Ò+Ôæ§ö¶fièLùQ(ÃDé]åQ¢m#d ìIpv #€ÛÅå•üÚmWï?ÿªBýo‘ëÈuo]£ì}Ü;_gŠ'È3ÍÎ]>`ß÷„ôÍÏ™ú]µP¹[ùà¨Ò¥3LìVÕgIì µ^ad¢Cd’m÷ŠZ¶íˆË¬&ò§¦Ë/‹ýku‚Ýv=1Ôvà›#{õ$Ú¿ ¬•oÑuýæLÿéùÉQ¬»%rÉù™q†@èéÒ~ ¢• ß'¦%˜/@ý ¶ŒoAŸ/&Nø‘ºžE §ש¶°6·ÆˆßɉPÌM–9Ë@=àæQ”BÀi Ã9Ù¹âe€À•« ªÚ–kÊ¢N„Ët±…ÁN±s†سý€Ú˜ÞŠ(Mqô¿ŽÛî-Å¡—Gˆ{jÍ™.Df³D3 ’¥“³@h¾ŽÇƆVŸÏ§KÜQ‡3rÁdç|(  ²,{rNη ¡]ŽHƨ «6‚îÊŸð.€é"vë“hN3ÄäØÔÓ°LH©“oùnˆ¼ ó2¤Ô@I¤OˆLqºŠã&0º}¾) U­&½J‹E/Ý…î5àRŠÝ‰’ƒ:˜ò_™Ø` ßìû ÇQ,R˜7â¿CžlKÚÓ°Öv P $ÒJq"–‘šM¢0jÀ¦_Hx› Å^uµ¹…Yc-i4¬OóÕñW¼`Àôì"0ü“ÇdxYmÙ¶ÆãÕßK¦ÃµÕ ¤~å±ÅÔn®µÐü¯‰áŽ ÂÊž¬×Ç«æ €+²ÔtÊ@9-èVxÂs¦ØþÙ¯À“ÝÿMh¸ ”m͹gT0zw0Îl®ÆþÊaU@9ĬCW0î;õ¬ÈUøé@^(:îŽ QJ¶Ú;Ú®"¢¥ €»|\”×{Ï} DÒzc‡¤i©ã€ÇãñxG›÷«Béz°Étÿ]8}d«üï$µ=öéˆ%ø]Wß ýš—wÉÃG"ØTîD)µ‡˜Ý¨}tذƒäAæ†L‡Ò§9¬„›ü­›gººš9¤ˆLtqÛI”@ ù->¥ ¢˜hq¶Šƒyò¶uÿqèo&XrŸÛ§ Â^‡V^5¾Ä‹™ØŒúó¨1¶='±*€!ØwY%¹ºÙG~†û àsáµt“ ‚çXœCÖ=¬4]±MÃ-V°?fÇ1 æ=$AQhïö!T 0÷ÏHY 7_½é÷lY \8o‚›@²ßHutUa ö¢œõ(¼ Ÿ¥+äNÀì[¬­ F*ò;¹gäîãÀÌÈ_„cR·Þ §YäfWµBˆ®êr-GD@|Ødp €R3¤f+"™\±J"¥x¦\áÆ-¸Ë³˜½}™Ù &F¨xì/‹Îû@^’!A”M“+µÍíF×;ò"'´Ý|3¸•] ãÂ7}^Š`Ü««&È“dµYþBè¬jÀß_ÿÞ yúº…1es| @u±~%Fjîž4±,eU>øñê€g:!ì`¼(b©ä¢WìZaЦqK= ¼wœ°3ˈ¸´f—œ³,æŠðvy ‡`g¼æI\ íSgfÚWëÁB~hë›ø5=€“("¸xòiZùyýße«Hî¡EUâùüÒÓ*”!gø¾Î”éœl /é|tÐùSS‡­›yŠÊƒ{í˜yu{  Áäü§yà¼ã;ðÁ €—½~@w?àêÍ«›ˆIs4Ì;®Ú¸úŸ>€„û¨¹ô˺¾;ì»3Z ›áÚ¨]ÒKtïÙ¡×'Ì;ò‰B+ž™ÑŸ/}ýÀï|ÝÔFçØnd­ÛŸgÇ/gÄÔ}^ÔV?Ï5b‡òϨYZÍŸÕ¹ªjýâøVOO­‚2‚À?ËqNFžFCÃÞ›üLöÆdì’õ¾Aœéôw?aúüŽl“Î0>‡Vòœ9aÎïÓ…¿%ºN  íØõ>蛾#¯áó‰|Ìõ14¿¢æ% í?GÆ ÿº@ )i=?o® =ðkpW9GŠ^šcfãµÊðË÷½@糚WŃ(Šø %ã’—¸;ÞFõQádÛ?ðàÒýÛ‰×~õ\qKN÷½)C\U¢û¥îìHšq[˜}EÀW_¸íÍ_äˆÆ¶èüÉÝ¿\ÿÇɬˮ]#Xž.Æ ‘Qÿ±iÄH¸_Tb$)Xµóçb·¹ Aƒ»Èrâ7Àϱ=¯?3Z£X Í-•¸Ýs «·÷) ÅMó¸.Kwl'(жŒ&vÁIæ<=2S¶×W¦´¤ÖuihسÉà»üƒ\¡r-ÙûëH¯¢2á~„> !§9m­€ªäÖ·4è± mÜþ] ‹4B(wo8(¼âÛÞ Oÿ\‰•b‚5" D+K/‘tãô0°m2gÉBT%çÝu\ÂJOƒI†žäôÙ‹5‡»GÆ ¸’âõ9Qµ¸Ç®'¸Œs¾¡½¹)}G8VM pzßF¹X§ ëI m$ñL‚ý–™ãA²WqLkGpGí¬E-~³¿wÓy{»í‘±j~ö÷˜Ý¡ž½Rß6´˜–£·"º³i'É“Ów6ç†ì ï••žn…¦8”јsåã_$)«âÃdîôŽñøÄä¨ÕŒ¨é1=á†Ð0îì;—‹4¥ßåfïkvf—Û¿ˆäˆ,Ñ$t/,- ÇãAÏgôÌnßä‚ÜŽ q)ÊJq·Y˜hOòbJ·ÝUÒ|Epàyx³F¶áßì;M‰¸4£ŠÇ\eŒã€W KÅí]r§|ëÜìÈÐÙS?¥çFQˆm«tPÝNWCr¯ÐNj8„1ÀÆ%€À˜?›daœd‰ëOBÒ-‡<Ýë§.G6¸ØËøs⡦ íXæ qOÊ1žxƒ#‚çS FRWO*·ˆÙéÁÇ1«M§0§‘ÌÒ5{®#\ÔŒjÒëîò ÆºmxSŠ—*F<éHã ×8PV{ Šƒ+C)Ü/=CiVò )‰æT‚@õL8)‘Õ ½¼"xòxc|÷ Ña0òIP®Έð@Ýtäõ07æcÇ–iÇAùŒG•NÊa@¬Gô:yœa’[ñrí†ÄeDõ‰âŒ­°Ñv>å@=û¾|Í{¼(H]uÖSÀÔQžŒ>à÷É­o!seÓmƒFþíÍažÄŽÑ“•>ü†4ÃnîúFSt¾×P=pÿØy¦tʼŽ~ýék›ºÇ+?ö礅zWÊw7V5l!K’ÿ:ù«z+Zf®i`×ð\ɈscšzBºÁç+¸ð7Ç]¡‡j¨ÿdÃWËRÅ‘Áï¾8Xˆê-Ìu®ù½™cÕ&xó[Ÿ¼â¾ûŸlz¯Çƒè¿^!(8÷o44Ù‘?·@XhT ­Á)õ³7ydÜåÿsHQñ©¼ÂgjŸþ™õ¾\è·‡@÷úÒ¿­úi«¦v‚Û·eFß×÷õGüÈïÿ½K i«G‡ˆù?ÇbÞAu·qÞXq^ÄL⹞+Ô·ýǾµ¬Šap(~׋Ñð9-"T戹ÓHO|Ý÷—m ¦ó+ÒP e_ƾ1(^üµöoÄ«7ôìÜÁCsx‚Ú> ;`Xðã2‘éLu9%H&¦’V-Äžu÷2BèòòŒ8Ãè !E ÊÒ+ÕT’å:@¶¶8WsêZcÇq—ú!rz?s¥W©óûµ«¡¦Hö7A²ì¬9œ<Ÿ²Å}Ð%v…í¿ D½kB‘ávCлÌSëã}.(¬ŠûÅ­˜Ù!µš+óÃ\!‘ÒÇ/pˆ†¬î4³ýžòæiŽ€?€ÍÎmx䀣KàÕ猶ß`ñ’Òš ήþÚ›r©Ÿ[yDÔ'#—úè†|[«fË«&¦²©Q… ?”µGH¥–hH!A®øä<ZmFnŠQõa&nû{È›Q”ÞI\j=§Ü)øY¿¿}tü|>Ÿàõ™ð  fè»v À™Oê¿åƒ.MÄ‘ 0À䀔Ï!nØ¢²kåF$f0§OèV1Â>j|2"n„nÍÿf2-¡pß– *šK‡_yxÜ®/©—1%n†âk{ÜU_‰);á$Ī‘_“U 6T¦PhE¸\Qÿ%_žÇ‘ˆ!£DænJÑÏÁ>¯3PŒebWÈOÆ8Tí÷2¢ÈcR²N ¡¬|ã>rˆÉ|qÓ-œrg G2iÏ´I¬ùUR#÷K½É¾ÝG6Ș䯒{è‰1Ë8YÂÎÑÔBtĬ£ìâÊÓØ¡5'z$wjBÙ §ž÷¾’±6r]1uA(ÈdIë—²C\‘óö%¿H[t=&±‹»ƒ ÏQ•êç•S³Å±szª\ £"×Ee® ¨›ãÔK§wô³(Æó<2ªÃ½Š&‰2Ô•~šÃ®óð"ñè×Àý¬68¨È/ÊsÝÆÙ¿):ïñe¥Á 8:-,RéÚnZ¬964*@439€Þv¯j>“1ûè%TÄĬÕ'-LjøSò°òž3órUú)”‰,WºKõÿV§íY¸v Bëo8Í&o Zéo¿d´ÅŸQœeoç@̈n‚“¶Ñz&?óCK ˆ m.rà†¨6W˜ F…R…\ ‰8E d‚CùÙh2Ї>ÿÑ'ºÏÐv,*^æ¢^ƒ#ÕòØé $&Ái² f/ŒRX†þ]A’•šMÁ÷¢*ßÜDþLL̇d(ÃLâè”Y¢Ó×Äq„Ž;=hëx(Kfåd1yê|E'rë\ñ°œI¡"@Ëò[ zHZæEØ€3·âŠ…ä÷®œþí#f¶z6 žÈÉ®#ßÍu€ŸÛ´ò€Z„‘B>0{Ð}ìæu³Íâêòƒ/AË ÓDÙκ@ªßµÖòo¸‰ý; ¦Ân×ÈW­€(Rú2ÒV~”Žî åBɨíç _¥RÈÐw÷°ôäôÄ'ó|ç› Ê‰S8>Sz¡ÖÝo­’Z‰ž„çn9&‰8¹‰k)¯Ò]7ⓦ«Ôv%êÖ™w?’²ie/ØMñWpF¤WÌ…¥Jjbi+é¹uÈ¥nqq‹qu÷©µ[by×ÇC9ržÅ ”°¾ðÖW¸ã4»¶pÄþ¼Ž% /8žMô‚À&<•EA1Z5úŠÎ‘NžÝ5B³ho&0…ˆ"BõŽHOT§øÉ%¯ø¾¾¯›_CùÅØTK zæ_ß×÷õ²kù}}_p´!å3žü¬Km3h£ÄhêcdøOÊø}_횥+gìAôü®Þg¾žl;ññx|#Ò—%G_;ú}}_/¶P§"uø}}_ØåoaÙ‹Eç?Éõ¢*”l¹}bü-12ñ3O†G왎&-b‡éÅK €-á;ÀDýbªì#:;ííù¼zÌG^Ìkã¬(:¦èä ò‹°\è>”ÃÇÁåa89èåöE*L!Öþô.“ݒ棺TÖø+²"LšŸÔ1ç.°ÍÌ‚ü‡~ö‰kRPÉÔ`8p†Ž ­ßyÿÈa~AlÕ´4ž×#À6ñpæ+f 0±‚©Zzïu·Z5ØV¯Œå,wi6ci3ðŒ-Œ8Û¯,¬Éˊɘ︭Ÿ¯žŸ“"ôðzqá­uÚ>7B±Àéí íÔôëÚ.˜n9t/:ÝA³Á^D„$d¨ÀëØM‚Ë áÞ9Qo+š,Îä¥! …ù? g±LO ÿxFI ¥êž2 ªû>íÓ ¡ÝCÔÏOóTšwÿ»O¢<>—?ôνeÆUâ¦À/Æ¥®Ô¼ ÙU﹩'@ï8·†ZõË< ù3³ÿbäF¬(ÃjÑÕC>ÿÜ´Þ3K¦ÌÕ+ê—î—Bgw•Ù¼(ãk?ÂW&;†¶cÙ–5±¾`WiY{Å¡¥i PjN¢ÈdiÉX¢9ÑUj>ŠRW ·§q".ZYF*m„|s´E&a®Ì¹.i±nQB°üž¹%­„O‚ h#D(ñ;MÆý3ÅÎGæ\%¸Ã~Š,Ž4ö‚\CÅd‘&i£«!&À&ß¶ÊÆr,B2¹¹çìŽØ›%$v ¬V'£_«ÏsàÇÙ:T¯Zry/D‹g®[ýÐ _»V\qe·=®r亱x‹W9&Å9’i7=="¿Ut~,I”Ԭ;±y_âéx"Ë…€È*»ÈÉ×JÃÜÅvžFÃŒERH°.ˆòslÒò±°Š<•ââ}°ã]?ÎÎyi˜'KS¼Ulÿà‡{ĵ• ®ñkïd mãË0¥R ë\Éè&ˆ£MrªÁZþZáþ“³Z³¼qBF•¥žù÷º…1åbÍ-]#|ÁÓÞ –­Côj+¹ÌbÈ¬Ž„RÈ"³ u¤6Øtê¡&Q4Í~UçØƒ¯¼i¿È¾?Õ’Zýj(‡vD RSØs${šæN•pÿÛ½ûZ)ŒÆŸº"SH%ȃ£0mT¡>’D-B+#¨çœOäsOéÓEQ¸[q\*bµä˜S½1 eR\½æ­ZT§‚Ä £T+©–QòÐ05@4®`lx¯°sª7ËFfµTYE>´'Žh¬pÔlÂc3ü¤.ffšò¶J¹ &øŸ+ç¿@(Å1`·TQ<ŽŸF!÷|€wíîè{E´Âð¸2¡Têý—¿¢¯llÎðg×4ºA®õz(Ï]øÕòJCŽ­qZw§S7Z9¥°šhsGöiK\ž|œu¢dtxÞû5B /l°š¡ÔG<õ´¡ƒŠ”to$ÁOIy"…ÓT;&4[Ýýcª­¡å:î0Z¿«"ÿ¡ÚÒµ}‘Î{å®+2ÃÇ£TxGŽ# õ~‚Xƒ¨ÃuMÑÍùø<¬êðAÌ úI%ß­\Ñ«#Å£ˆœÑ<ª¾ÖWÆ’>TÂ,ÀÀ7Äá}p‘ñ…¼átý“¼ë&bb˜;$Z8Þü&n&r(ûŸ…ÞéWGÌL>­¤‰ÃbÖ†X©7ËǃxHõáQ`jòãšÌ +æÈöCë(„«™ì'§µ '…1F¥k_â3k}m€Ï¾PÅw€zœüO@ç‚ȉb%ïîM¨D¡a€ÎÍàï7SvP*>æ ”æGA…þßò\e˜ãr9qÜeÜ÷z«ÐïeÝÿÅ×j³Ïˆ"é£xÙ%׉TŸæ;]oX7ïY‰'Oò?ó¡gîÅWxê_}ýûòÜm¼MÎὪ”ðx*G_žŽò} !Ù·ß5@]óZó£}è·œÍ?º½Pß ¡´l'ŽôÈGè=Ï2>9°ÿ:ž¿Õ½Ö¶¿š‚ü}]wÔ£MûîæZ`÷rÑù¿û¹0ö€EÍ08 T6îgæp[‚‡$€Ä€©®´ Z4bìȲVp›4¯¼!ÛðzòY ÄZC·<ÜK(ÃFÏ£FqF››¬çT芜bi¡iñŠ3=¯ž,DDl|QÖ@+ò© `Ø[ÍÉ1z)^b­¯°¯#òa9C"Zqãyçë¶Ù9èß‚rsöƒ…£O1/ Äà{…°dßÞõÏ'Te†þÏë‰DrüTù-j{™¾¹+5b¿Ú\=ƒ“o@Žy/ØÑàI½}åÿ5«2û”ìMïM»Ëa0ø£¢hécnu¹›Ø)¸•+ÙêY×¼$å“jÂÚ›ø°‘cÄHÚÏìPIÁ-9#9—îÖ™£F5e#vó¨ÍbÉdŠgXÐó¹×ò˜Ê檲\)øœA‰à™Ã(sPħ„€"õ-'´Æc£:-óMœÌ`¶¥È)HÉuÞ¦z4õP åÝÖN^eãú‰[(Ì8Í×Ä(…×2áà¿&ªkŸÝ—‘– .­³[/BÓ yÇRwÿOó5 (+„€…Öÿjv¦ÓÃÍç?›°”LJ6HJÆÂsë7fµ£t¡¾3/:4,Äÿ*qð‡±²§ÅàzâEd<ý[´x ­d‡O@ŸrS¸àUá‡_´—™Á’*ËòÀÇO*½WæÐBR`µw&|t)ø’RnªðÄ¿-: Uér¯ç«­Â.Œˆ›™ .êžHõ 5¸û±´ÔØF›¢oç¡o5[êmWÅr©Á×ãÃå?ÿp9B‹“VœVî8OÄà³ZðE8Æ>*ïYNpF¢RzF8öŽ}Däߥt2 } h Ѭ;3‰ë>ˆz79+0)-QD€å%iÒ¹5ÿ‘ž‰¶„ÄvwÝ$1 È5¼|³*?™ú É2¿y7V]µ_;ŒFëê«SÇÃqÞšA•>ŽÙöm㸛u†M‘ X•Xv™jƒC£Q¼¯è¼Þ¥<á÷%wöÐŒbpO0ʰßˬjhæGÀD{E!`tX=‹Tãë?é€I®¡TûDdƒÚ‚ô(òR¡ä€C”°ÞÝ2ôÚúÚPûU+‘\ F©øõé@V‘Œf€_!C³r|Êë%XÛ°cÜîÓñc¸CƵw‚ËU×>ˆØf4¬ÀÌå1¿18d¢uyª³<ãƒv­6쇟È[iÔòè¨ñû‰Úòu&Ù¸æ ¡¨e£’Þ®žï6mR·ÂÚOHa42fÔ‘áš%¡…å’¦yDê:@ñÇ ÔÿȽuD’ÌcKH‘iÂðž6yM6³Ü VÞ$Ø ²cÛj[…Æõ::}<³·'#•¨Ý™RK5KÕ –š”50çÌp»"LÔáK2f“˯ÀAÜVCc]Ý÷×ÐuD>¬Þq3õxˆØ²xõüS!ç(h=pÜ“Æ!žß’Ràÿ1_•YItÞd¾ý¿½…ÇÃWÀ-!„wK½i¿W k-ý¹³Æ8‡óÝþº˜€n(¬šð&e™Ó¯â¢Mpöãg„.?ß¶_Xü Þ¸YØt X4J¿èmíÞ8ƒâå1Dt ÈÏ̯+ü×öT0%o·qÆïèô8sÌ*M ÇfH2Uz@¹ÈÖMŸ~š­u² €âñ¾³Iê’a0õ3k(A%• ~­Æ,v‰$"¾·‘ ‰£Óg‹!Á^`\¼ÂËîÕ=q)Q]!U:Ò÷\ÊKtO¢ÚGãà]¶b}¾}©wðCZÔ¶uÞ•»1ÿÛ¸ü§òo]ê ¦®ÿÙ¹;¯ê®ÞÜãÔøÔËã@kÀɤSžå!]'{|G¼f,óŸEd‚ÈK~,àsR甘âõÙ»èƒ| zÒwx%¾¢ó¿íX/©„E…¥U[ñJÛrË Ýn°ßTª]\°°½þvÅ3Û¥Ÿ$³ªšýuÚ¥i–7a•/ž<¡n@&g˜æ™$:ÀýXtë)‘NöܶÊÕìÑ„óSŠÞˆ~øÝâÉZÍϬ`õ¹n5gq;FëÚ N/öÿ)£zRÖøÏÖ8o'&{Rh†*®7g3Äž Ôp5@@Œ&3 ò,‚‹…ýÜ4Enâd8èzý\và˜álÄÖ(‚²Ãú®ðlï†ßgœ¡k½-vïû+ɯ:;r‹è\`#­#1½u&¹Ãäæ\ÝÛÍþõ²Ÿ+â'×m¤ÂOöøÿ€ÒôÓ®9¼fÒ›ÕÖÜBÃÙclïº‡ÃÆ#a»Óœs¾ì•‡>:e7y8’nÜ?Ÿ·È¢ Œ¾Y÷±-ö—Þ•OCjæÙŒ¸9ÚÞÀá:\=GYl“|âXnÍiÚÄÑLMŽ\ ¯WŽ/ø|>Ý‹µéÕ ”šq?)¸:3DyÌF\´óXšÀg‡Ž¹Zš ìùŠåS±˜;U2ÂiËŒòýýmÄÝ¥®äqµëß°v%‰ö¨hq4_»©¥p]7Î`|‡)ï M~­Øø˜CDÀ^‡@ñí2qJÛ‹³ÀÔgö¥ý»ÕK^‘!èæªD2Ò]­m8m¬ ²¬€1(à†‹K‚¢¹¶F3Ú< f6(„t•ØÝ“ )gÊ8a–·÷»×źœŽL)Ðp–b8:Ì T  GäxY÷–‚ñkˆ¬¼wJBìQb†ûßÓ¢öeYÛ„UzIr“ÚG‚4í°ìõ)ì'BÅâ)6±ƒþ1ÆéòÛ!Lûyd­Ndz%ÜSä*ŒÖ©ãz®zÈÂŽCKTa!Ð Um¦î%ºÍÔHGª/ æ,ÙRKÍC/b\ßH‹=8ŠPÇ»@åçxªƒãsQ#”{N›¼+qñ@6·C%G09âÔ}@HKÊP%1ûªAt~v¦Vq E-;Ó ]WÞ¸™Ü¯âj\Åxåë uã8zlž"@i_òÌÇÜ/«§ÝFÅieE³à#éº/[g$X©äZ@‡[ Uød‹ Ñ7¥K…a¼#‰k¶Û¤…/8Æ«¦f㯣Éቓ·JöÇtÿ¸üg¬3ª0ÎJmŒȸ1ˆED€E»A”ŒïKég2F`ÆnS†q¨KzRCÌu7.þð"Cúü¼ûìÊ=V45­ø†×1L.Àߦ—0dP£—ÊÆðÜ\KÑ’LÓ÷,ÜÍ Å…>~ÔCÝ:ÓÃ1š£›ÿî \+ â”@ÑC×Jü¦ä*së+]¯œ`‘Xf¬…14Ôà†¸ë)®že˜ÁTp«]"Eˆ:È(" Ñ¿žd´§Ðÿ3 €…¤EC¨ô™Š(U@Ô²yÆH0¥ëPkX¬‡7÷ù¾w³>ÿ?=v»#AÒ ^é¿åR¸öî/‰Î/;/&T¢¸éSÁ©¥ûúyõ†!ç<Š™Xß<ï“ð7+Xù¢çî¤u´ÓÁ÷=Ÿ *™ç#¼c_ÖA0‹ï9Eôƒá†xÄ1ÁgR*2ÁýÃ$ŽÆ¯çtâ¢ßF `½Àxry‹ùç]¡1zŸ˜…lÇàè¨õú‡Æ¦yç{,XKÁëòð¨^çˆ- >6['(á=€™ŽSnèæãÝ.² xR “åœ[Óÿ˜î¨ok.1•ç ßçc€kbƒ®Í:°Œ•†MþUEˆåt@ïD–UÀÒàÓè¾üÎhêJ\f™½nòô©“˜]À{†ùcŠý¹sêÇÑ%¦ð«&°B;7eÔÇ€×n oÇŽ³¹IE¿Kioé<  C©x›ºùà:|°V§hµo¥3 üÖ~äæWa‡k$Ú[¦v/ÂX ö`¯v,U‰Pv4_¿>×Yæ»çE]Õ®á]òTóΤϸ·÷ áœ[ÇF©ãêÊ5æqàWtþ³œÇÆœÅÓVA!Ф¬ª×Mák|bÌ]g7¡Jh­W7þôÖW«ÌX2£}‹6”{ìø:&4kõJâp¥‹4|ƒ1÷”=úôÐa2äÐâSŸn³iˆ£pû-\’‘3v|4øëéãƒJ¬KE3(')oåRB§;*FÑwÉ›ÓÈèÐ=¿8 øv‡ì„ç·ç³˜ QÁ9ÛÒ ,ƒm¾³ÞTCú»±uÜá°}B›MOuÊí©$’;–˜ÂD>2æ`´ «:ô^BèvRížT‚p5>¤]÷"~Ó5â ëÒ} µ7Fki{=å2ŠÆà.¢ZÎrn©qdEcÂóIDöZMó”=á ë½Õ›¤8{Ê×NÐÿ„ú«bÊ·–Bp9þA²™Tøövù· ÜIk€¬Íû¨Öàt° ZÑÜÐ…¥sæœ/¤½Ÿ—L£ÛhCT¹èøFÓej:!@û""2ñT±šê.Ñ1×cÕ2öÞd\§bÓ»^“xÓs’D¥™yì\„ذ۞Äãý«©1¾B‹{õ\OêëMÅÁq7GW`âÈÖõWfÊg³¿¤*cm‹/fe˜ÊߥßQ<ˆŒU·åvGQd:¹5 dÐyVKM^ͯπ¢.5†­?ŸL…Lt…‹z8c“퉇U[‹òÞ%A,’d…C¬ ,ΟtãªK‰O?‰lJóí²¢ˆCᬠDbc0…)éùó¤ey=ÐjNz*Âü!"hõV0½xIIúëÍA51«zU‰39ÃØ8 1»D-Pßìe°*î{Ô•œŽ[Ú®ú•Wƒý߃ð.ÁY•JÐe2ç;æ¦8­+¹t†©'¸( “´Võ§¢ŠQòIMÕ6ú¯w™ %‘±ü‘I/$"±3À.‡5U*Qüõ¼mÂí‰2s‚zM1.MÏä #lÑÕÔ’?Ï¡ot÷Ñ@3!%’§_g¾ êðÉÝaR8ãª*€Qžµàhn#i­u… ýƒ¢ó64]rSCW,A‰NÇfϹF6˜Æô‹O£8’ê®ùzNýì±V-}>ˆèg Ë«çùÚZXŠ$CD¦©KŮߛö³¢?3_– Õ9‰Ø.a$e€|m½=³2)ŸìmŸÄÍtÐLT$À| “z$ƒ!*L¶âtsÝné©}Ï.ÂqÙü´ÂÕ›cð¥kAÞz_̘YÒ$ër%àø[…Ç÷ÄÄ£§Æò ð° ü{c¶§}?µ!u㽘CBT8œþ-ŽlnRÇb`·pcLµÝÀÚ]Ë~kâ>î`ð¾k í^η¢'ƒEV|è0ä;pK(:W˜®Ky+冯'@³Ô°‘Ÿb\âS.ŸŽ¶^0¸Øk¬2VOdÏ+å[õ«xÙóh Eäë¬ÑEk–?e%\0£Ïñ {$(ÍuXZÉÙ÷J”2ùÎz0Uƒð 9q‘ýkð*]"HŠ£qžplØuL%9PŒwÈ\nÌ/Þ’ýÑ1DñœY^g@ÒUjý£@1ªSÞô}ëí;ç‡] ˜¿,M=Y}«ÃQÙköò”—ë>7„¼éŠ9ù†9mÁ¶ ;üÇEç¯2òŸü:‘†¿úõ31%]p!N=êæë¥ SüE'ã|š½z\wEV¦¼uµ$ w?rÅöEÃyxú‡åˆÜÑ1‹ð±Ô;³‹$àûza~EÎÐESˆV¦÷NpŠ_uÓ±'Á0«Æ¬õmÌ=¯]tTð̆Y“ú.qEËÝú£x × äÐ ^uY^ƒ¹í¥T-(è¸)ÁKÒˆ^«pâ¨ÕÁü¢ÿY9ýòuvXN¦e[#Wö³ã¯‘ ù°£û]´›ÿ¹xÇ[‚žT}O‘ã XDò‡½o úû ¿Y2ú×á¡/3^7¬—žœ]tþ³¼bHi}ñ'œ3^+ >…fóÞ¯}ý耞—;¨i¦¿)c˜Å’þ”½«Þà&l4~K„qä\xJM nE‚°Ë`ÊŒNÿטÍ@Þ´ ãkíñ9ØõiÈíÝF FØ"w=„L}¥ÌÑ®Ÿ—^$î븫Yî> €CýeWæÁÖŽ085/cÜ„Ø7™³NüÆ¡Çéloe®´V¢°ºð}ý)#I7Â;¦ÓªgO"x>é_»¹^ÿ´¿r™po±`BŒkùKÚ®ó©_YBäO عh߃ý}]Ó|Ôç©ë7(ú¾ö‹ó— õß×÷õ/]ɺ¿Htþc=2sÍ“Ô2*-f¢jéyꕘDDH¶t‹üé@PK/Ò^ArR B®pdú³æãx½‘IK ÎL/O^qê LwŽ·œô>‰hï i‹®õãŸöeÃ…NxvðOIX·ŽEÃ2H¯¡¤ì¬ÍS äßk£U}G‹ùDýþXgGò4ׄCZ<«õÐtÍŒf)÷­ð¤fT’Ç[¤(‘¦IÛ~ĉƒ˜¾…™uXà„Á mDûs§e§Ëñ¨vhdÎŽºÜnNã-ŸÈ·É.éC~å¼sÊ>LÞèdž9óc²èRüýPòØ€“º±· íG§$š5î €í½,†K&tk¡%$—Ô¡Wï>ÔÙ)¬Â1DÙO‘¹#`‡“ÅQî0i *$†¸!w§ªCµ,ùù›{±S"Ô± #&B Þ"Û…¡â‘ëyaÚÊ:O$HÌ?h šùfZãX ô&êcÕ‰F[LcdnžÌ¿¿ͽLd½IÊß±%g4¯npŒ é®[D>S¿Äö!Ê{ß,âŽZ/w.t<*–ªa›‰¨£Ç*Bà¼N]Šj»;lÂV/ÐEìJA§6¬Q[Æt'2†ö }u,o´Ó»àžÈ Øsh'ñV€¢ià:…x¢Ö.˜³8—êÏUí¬HEÕ-ÆRgñùŽ.¥?<o‰SžUîò»Üé{ZÅ/àÉ‘Œ9ù‹‹¢ÇS/xž>Û –ÓÓ¦F¹ñ¿ùo‹Îçë1dxÕ€@t¬™îk$LrŒ ÑÏ=±6Ÿ"úŸií,²è¸þç(ý:’K঻h~‘:”¨1ø¦£kq0›¾ áƒZç°LbSGŒ­ÏxæTô×ñ!¯®ø4C!?bú¦ßWÔx"(Å0¸Ž» kö"º¨ ¸„}›Ù§ìÔáÀFº qq^r“4Ò•ŒV:p¯.M£È™; wï~†rMPpµ€"í•K:1ÞL‰ £5†wÉ*óÖ|»šPÝïŽ+í2Wö´ÝAíÿ+n0ñù| Ë?Ð~" i¢R̲È7üt^ÞN.ź®ër — ‰6vœíøR†Ö½ÏE4ÉLeA:ç.Ó‘UÝ̪“w £UØ*Ä•w´ü–¿DðSI…Æ@6êò5O¨—A~õœV/?ëÃsùW'VZ Ô×$ê_À0ÄÄ?‚,5ýÑ=cͧW´'á«¡Å {•ŒFè'íÑí"ÿ(fÙÜúrmÿÉfÁÕÜBòxûK‡ÄÖè‚N?5í,²/&SÀˆpØ)ŽÌ1e (š9NìÛ‘2êy¦ºØéú=víÓjo.ãI¼(º®Ü¦Hí=É·•‰£üñ¨*ÂP’#›Ô B Ä僶tñ"/*¤ºú˜"b¿wxn»'–(ð!~­.ïá[YžÂ»GøCx|†ã/!DnÔqFGþðoÕ«ªÉ„Ò›ÀY0  34ˆº¨zS܃´–ƒJèä…†ÏÇŠÄ"?<÷X®=áƒRØ4ˆ<©Îú<ß?/:_|oXDûv"È£¾ßN˜8]úïkÑLpüد=·½{>þûƒšÑ?ó:¡n±%Oz"àWv森í_Ü‹SÞñù|ªœk-i•%½*žø¾>ÚNÒ >;qðA;I€Þݱrl·M;vðO5°ñûú¯ÇUàÿûßâiù®â÷õ¯ÇxßEø¾¾¯K’ Þ¿©zþU‹q9Îø}ýéKO"|<è8¢ðÅ…>"ÉÂhƒ‹¿U©¢áLñèª3B€~P²TÆï¥ù¿i”2@ÂRÑÿ€ÃŸÑÓ7âËìŒÖ™b©a®_¬æÖíêí¸¿Î©œÏç“Å&ž¼ãR`çw°êhs$­[ÓY%‰¢HÞ æ¤l4Dì!>j¥­Ùž@Œ€¬ðšÊýDÿ"ðÁ§ÅË~ Å>ˆ;z ØíÆÚFdÐûîꯩRó¾¯>žMÆ\йY“«á~-È¿bý@ˆæ-Ì£ "÷_÷ý|6sóxëå` Ëf3•ž®;ä^]F$…R×ÖE‹f/„©Ó A*ûr¸ÞŠçnGúÏqÁå(ú÷fTû¼í‚ûQ1B¯Û`„·£Õç¶ÇŒ gé“ ²úJ`%ö`€† $Ç¢¡Ú´4ðæIQW¥£ }¢&ÐHMSt¬Ûã±2T¥I+ƪ„ôxøD嘆hÑ ¸©¦y Åd¡†FYíu¢9$ɶOPþúw\S³™lî Ï?™qÏ“ŒjPiªöh¤HÙD§…ú†T(roºë¢…>(>ÈJ»u ]°ŠºŸÜ¬µjËÛu6ë \ŸÃJ!ƒ­èJ$V4C‘ß$Hê¾erùV6C€^ËzŽD9b8­@¨Iuú·h,WT“m̲㵞‡òcË„Ê<—Èã^K?Si¢ ×™Ëé…^©ßqÇü®zö2¦±”}pdÃ¥Š'j¸™"×âÛõ§êÚƒþ=C91¥œhXTà•0a¦ñèê0óÉçBå+‹¿ê{ÊÞ¹†áI‹Ñ=×y`½HH¢îËs;x¦íªÅùŽ•HQr9?Gkž®®Ç³Stb5òÑk*ò™<9‹ÃÄùüwDç%PÀñÔöPcô³¯©%˜çÔÚùÃ?AªoÐOåîNÇÞ÷*FÏ×Í¢•'r ä9Àœ8Q—dðIG‰«CÖ~öîç¿zÇÉ•!ö³ñ+ø­òròÍͱÚX*þ±6/Xò#1ƒ8²©ð"=ÆÒŒÙº ÿ¦-®¬üëwuJF1㽺—çð—‹FŠxKï"û#Þ£:àn;;†Ä\lë=ŽHà’æN—}•÷]ü_@µîèÿ㽋ȻÐ?>ÂÀ'L\·øtö ¾1„øòô?ývH ‡ï0×$Aà•ÞóøÄÔ·¤‡,Ù5 €wÝëà €;Ò–Àsÿ‚WµîÞ”þ|•„ÿŒ;ûçEçéó¿TyHÝ©û^›Ùõ #ð3²õ¸Ÿûx” 7§!F­‰Aùk­k»Ðþïº=·EZ¸ 3Ñ[, ƒÏ"\&¦žõB.ÍäÛ8¿rD;Ûšu»Š&'PçSý(wY½`w܇z÷ºÒŒYï?¹& ±þÌþbî„&~ÿÎÔÌTÙ¡k NÀ±­áíŸSŸ~+Ì÷á=“ÀûùÍ;Á!â^$ît« #W¹LeX”\Á®B|´ŸÞTVð¦ñò|>§Í2Éõtç¤)+õ¤,ÎúÞ~˜BÛ~ p;¤–ȤnÅÙŒ­¥’*‰ {¸ú•§Ri·‘¦VŽw¼r1‹5#Öqy5¶7€/£¬Œ) U7ÂVØÿäÈ5¡£×óÐlJ<ÓàˆìÄx?yk}Ïð‰ zæ}ÍàÜZ¸ôͧç|ªd 8Dõû ù ýl±U“…ÔSò¥ÚêµH”{»¼àÛ‹yí¹†÷ y,CK—’–§j‡{Jo §ATØà»md#É šþ>ÂyE4íÓz^£o„»›o˜^UÔîÚ¾ªp: I ……HÞK‡[M§‚|õ’”êŽ[ý‚þ˜ÃòÈÛ/>ŸÏ&òð2ѾÏ[ å…V¿—“Î_hF  IŸþ» áD¢ùºyb¦âË—âÝöÉÛþS¢óDoŒˆ&äK–À£§^šh¦%'ÆÄqš¦Š<”K¼(Åž(‚ר¾5.ÿ¸ØMXèé¦üIRxD*ý"£^C6:èÚ1.NÀžÊUåStuûW«–=Rÿ·0èãñØû¸¬Ä7©ˆh}!ˆ:@…*Y8¹±â pû=yÙT2)ܯ € ûÕ•­Î‹îÙó]!øÔ#<—P<ÆKPö“ãŒÉ¤ˆÃy¨Á¾ÙÔÖ5,È~}Ã_̱AT6ÒXÈ"\š‡QÉãt²–:£}Ë;ú¯ÅÈœ´ ½„„ PG pVä– ͌ӥHFœuÖ6f¿¨¾åŒøÉF!ÈÂx*ÎPmKñ[ijVÅahŠ»)À®kˆ€€vÆch0Â¥¢lEG/’Õ㟛’U¡ï­”Ïné~»ú ~,žOàuÙxA½/‹•Ѭ;ï‘ÄÉ Têv.Ø-T9 ãÐ<©<·ËïOìã|L‘Ÿižy¦fÄ<øÙ}‚5M ˆ˜@*/ÔŸ¹ò•õµbÐûME=LuÚ]³ €uÑ)ª¡¯¤ƒ¸DŶIj’JCä(™uùs+že¾|š¹Ð*Ú é5ý˜Ûû«…™" dÀÑ–BbWÀ¨Š0aâ:*ÖOó¨ÀóIˆO¥Ÿ m‚##ÁxûeäšRâ‹ ÿ–(GÓ^h¾¸!¥pÀ¨žù®¸=*+ ]¸7ÓÈö?= "˜ñþÜÙ´¹`Ӭܮp‚ðË^TâŽþ0HOÈ‹Ü2ó°Ú•$wÅ- “ˆ›`œ›¬cx¥¡O·=1ÈŠè‚^(ÿ Œ¹ÄÁ¯ƒþ¿°€òüyeÇ4@%ý“ܸ‰§5Õšpõ¬À…•¯Qj·›k–]<,#*¬äInJY9`¤v¡+;ë%’„ÝZý ·æ%¬D ¼žìiù[û®PmâI”p54rEœ–ðÓ:`•Ÿ¢¨âb3MŽ0æòŒ«ZI *à9±Ð%“GS¸‰åÕÞõŒjÜ>§΂?.:ŸÚê<&ÄúE›®\; €Ÿ`c…uÁƒIM>Šc¯è?©Ìú¯`QÂiÐ_2ëÊ>&£€—€TĪ>áeÑéËþ‚Ö••oåÉJÊøÀC$€Ê‹¿¸¯¡Va0ÄØÿ’…¦Ü¤ÏŠkÞ‘\¢b\uMh¥ƒ ÌÂö“Êj‘­íúñxð,¨Z7Z¿›2ܘCÌ£­1îˆJ{C1@¬U¿¸éumЙ+¼˜pàì·Oí0;E=»×0.¸ì2h¼’Àü°YÑ>(šœÖ!¿-ÑqÉ·óÉ—òHßÖMŒ²Y[ àe¤i2C&rL&}Ù?ýñ·x‡ã×fv¹&Šñoø+qžRÂ1µÈôUÇû`Æw& ù5 ŠÎxc-Ë“ž9ä#œïtÂVåwÛ°0Ç"ò Æñpû?,2~Ñë£$[_v;êyôY5”[tþ“Ï}ÒÓtx?|e~¢t$úºeåÇ44¿·|Ý0Õ \¹EÈ ¶‹ôÖ#W­-³p§^ø,½ïÂX`7Ô“½iÅ>´Þc®Äâ¼ÅÄ›”‹/Ͱ"x¬ÎÀJ±M- ÞzêÉù.r%À›ˆú|šóŠØ‹;ÞÜMoŠ®¨÷;¶X¸÷hcâòkuÒP¨v¶36“•~XÇ/ЉU,䨫Œ%áàâX³¥M?ÝJP8Rî¤ý3¯½ˆÂv¥‡0ù"˜oGÖÉÅ/[MeÀüöðn®×Oªçjã×3êJvÁ§WÞ¤Œ¼«X"ã«'>¸ V?Oœ·“å…ñÜõÊ2Rå<É®‚FÿãD-f)Xߥ+‘ú íÆjÏ£m7>l1ò˜Dî¡3Žã•¹áR÷†º«ô~±|)$kí–ﵤx£H]•Õààxã""<ÀÇùÞŽÓ&b9‡T_ÿü €¼ÿ骦çõʦ‡ÊÖœÀ]Õ\t~-‘Ìŵç͆< Æ¡(~ÐP1HqðÚEئ{Hšô „C€­ï2Ä¿I¡:â‘@ ëý 3À Ú~÷ÔFn/ÙÅÄCØ¿bݾ&±g ²P¨7êE©‚Rk¸«ä:0©Piü ™Åßч#”ã«¥fÌF`˜æ¹óˆ¥:MßÁä%É>¡©ì ! 5é%-Ñ>©iS(çMËAí#"h¡'.I‘ªtb4Jž„ø/šÖTš¥µJHEOÃêm„zÙ•‰Ùd¾ò¿ á?çšÀ dhÊ3>ŠäHn ñ&q&Å!Æ QQÏ?äÏRE°×¹žO UWxné!#¦ý[—ÇWùÖÜѶmoî¶)õÿìcøa;Þûu×lÒ€³3†‹¢C¥ÿ“Ó‡Õè—𥽇=×Ð1Ó»Ð%k¨=-Ê©?LWEŠÒè¯iŠbdï±nÞ gyþŒ´©$í®`ìªS'•ÐóÃÔÏSiÜÁ ³´.A˜Ü#º1åBhR‘²ÜÜ7"N=@br)×™Xéª<Ìt¶¹bnÑQÛW`²{-§(€qã.nŠì™ƒy¨åº@ñð¯ÂÚoñãÏ' âsï½Tzu¢Dªï8¿{Ê-ÏD‚OÅÑI†‰Ážª­$ò×GÅx*:á€U\„™FúÕNF·#B0̈‰íÑB³&dÁ©å/ß ¾H*ÀáÏÐYq<ô,`áö™¦>ñÞŽ{SéôCîVÚcKL=¨·€Wò‘‡Þ!0¶¥Å¿äØÆ<¼qÑ+|¯rÓB¦92ŽÝ·p7´½x«Å4O‹Žõ´Š:êç· â×J…»¹ÞºÒ…HDÛ»ùÝ»ž*ªÂ»Ê‡6?eÓˆcýEÝŒXÝÎñ ý‹<Ÿ{ @½¹ês–bÎŽþ¸Ä¢cþ½Ü|ËÝDrÄE2WR†oJ›šà§x^^6ÙÄ"¨É%'*pÉœddx•!Çü)ž¥x+A“§Ívn©Ì*#Y%4{Ò&÷çDçËc–EÁHh3 ×tGçÖ…^¦?z úZXxø†þìyšdªNjTpa2/‹ŠJ8cäu¡ä´Umîà KnçÚÄX(¦d¥íc¤ûˆ>Ó¢¸…ú¸Ãï¤ìr‘¾ÀõÍÞðB‹·WZïò³‰rIðL¶²´)ð‹‹ÿ¶`àIL°ƒÅ«‘!·%þ+d°w¼òs«î­àŠ:,4Ïî5®0 ‹„€T"] R4¹WZ9£cfàR9ꀃ€ '£"Yó I¦—Ùá&[\z6ù…#ýÀ‚Âï“… íæ±Ã˜¸I¾ÏÜæÅËKCÊÉÉNnPŒITLìMÁ@7Ÿf*œ'—ñÕ €éã¡ù¿ÈEÉ nè?z–V×tmöÂãÁ×wá«z”@;¦Ïéb3À?óú@MVÒ@õÔ§Ûž“c¸Âa€dLicði¯ÆþíÌ¿&=\ý[ïb½œ>9;ǘ±˜üXPXcDpùEÆÇ #s õ«a^À›Æá‰ºú[záß~ÿ]ü+¢óuïx9à˱¯±4W-P¡P —È»‰Jû9[О^ƒ­ºMA|Ên{ª¨p•-‹j"Ë2ªåÀ}ÌS$Ó¼õX¬æË¼¸H‡CDeºæÓ´ è/7CËM$Òxƒòi¡’lO‘„ ’¦ç›#fÓö®Œí · €›©UF/w½:R!lúÜSöXÈ\«Rx,Cƒ —7–ÒµNW“¨cKç6bÛé¹SƋʞ$°«NÎ>Ù@NNgo÷^jö=jMO?"c›Wa=Q£ÍL9ƒ=¸wâê4^ü>D_]cÀÈÞ±žÐ<õ›K‚ÅLÓÈ5òVs¦—3R#@“¹kŽíQS3„ò@7!›Óˆ!ÞëT˜óÌþù‰øèk%¦­ÓÖï3ÁÃ}§Ñ¢¿?ZËç±ñúC­S%¸6Rð«(  ‡Ä[ÉÙÔm07°ÿYO1ÚIvÏb»LvÖûŠÇ ñ èG’®Ø¢R0ðTU4b±? ·«'mÎÔ~®wÍ¿¦Ôð qÝÞÆ`iéþG}½ oW³×÷‰iŒx6 ìm>zm2‘8vÎͽ.çF„pú{àÈú‘ã[ª£µÑî¢^GUFÑ Ö»¼ÛîlvŒ5µìá(µ¿áfØIÑ,±ROobÄ­¿Õ´6¼†uÊv*ãE¤/U’σDµ)ýõï2gÛ‰ÆõoEƒ6Oßý3SÖÁݦM*Sò‘‹›Õs"ql¼zA&ÆÛâ"ôxu½_b¢sŸy„¼^ ! "Û³ç¡Yíú,`ËSÚª}#·©ÜítŒú••* ×$lÒ_Cܦ¿[W‰à¢| î!0¶×3éh>YÞ%‰¾"‰¶z ¦\ËI'ÝÐȤÃÎäêj†_e-^f–& —¿!:¯óÁBüÏÃ$®¨íÞ¯èry®9Öš«_„Ë–ÈF ò/ÉF|õØ}·¿õ³-ö“òß·¬rGØ2– ™+$Â/î@b·÷ß>Úh"+(ùÅ#æ5 'r %€¸[•áºXÓŠÐÏ@¯{B$Ù¬ðñÈJ[ùG»Qìôⳃ–àIðhœ$Ú&‹Ð»µ4’fm)”«ˆ‰Bž0Ì“nd}Æ›J­¬=ÎÕWĵíÐ`Mã‹ã}bù'ØóË\W0Šœ;w·Q(Ð{iÀmÌá¾DY㥯ӕ\#À^"©ú$o‰?3 dLµÒ·Dî¡ Äâ”ÞXUñ¹ÏËP÷£²¼‘–ht>qŠ–J1 @ùÍO(eëi ›1#ZPôPÀ†žŽ‡V¸žçŠæÍ‚®†¶€¨z&ë€j£\}0z¼"âXÎ÷nì6 Ððz%ò@¹ˆ³ù]²+øK)Láù|šÚ´/»ÚßàžV/‚¥Fy¼}Ë/{ïô„ãÂêìþôÇ—úϧÀëiˆ²zh/&â…»µú=^Ę̰5ÇË×(óè>“U­Ç“Á x„@ìºNÄ's¿$qê¼á ‚Ôÿ®Ë €z•/â‹Mí¢ãßËîHN÷WÀ‹z‡„àÅukåOwdŒe¼kÐtDz^’ªÛûíê|1?ü.G-ÂçÍåAÍ¿ :í·Ws³~ãù|ïë‡ žÐmKµ:²X³Ê ÊËνÉ{¨vÔ›ÄØ·ÈpßôÑ 4„è¥ 4¥Ûõ«_cd‚šIB­2‚ó _°îËê·Ä}_sø ¯q§^ë zçàäD|ÿõ€$ÄsPhiUÑgÀ¶5ûM«MIíçåao¸2«6Æ?N$Æü8}s}›ñΘç7xyˆ~àB)Àg]/@ŸþšOGþY»õ§ÍÃ$ž1Ýúà2ƾ¯ïëûZJŸ_fZÿ$7õò_øòÏŸíïës„I¶E…{ÀhÜ zà½5°ÖƒÚ) æ§ëÙŘ&–þ‚$—"ûõ.½í•ˆ¹ÉX\RÓm?û“ˆ“uŒPv&U¢Â@øDÚx8˜ž §ûWE…¯ˆô$Š -ýíým@@á2êÃ¥J¢)çùcÒ’°û ©õ»‹£Û8‡DHÃa¸ –Áø†9m›‡ JQŽögæý?Èn7‚Ö9#¬i˜Ü–­ÍNÐ=âÚZ²L ¥ïU;l»®P_©J0Þ§4 íV&c$“þø#1¢±-Õî~³DÙ/²)IJƒ¨ºñ)`k«{QÑ·BŸ^ðèö+$GÄ? XÝùi‡àVÞM”6 …O{'êjO]¥ŒäpýS%,4_£ãÚ©ßOýål¸™ËÄj9~váþV&‚ԋņÄB’°ÿŒ¥ö)#“¬…ùòpm¡$øÛPgòu5¾´ø¹.ßÑÿÏ=Õ†&/ÞŽ­éuàœF¦‚[x°Ke-×÷g·Òê!JYtQ°BÇsØvª¶ÛˆÀu ?-6¾å³"¬,¥úq‰óÈßí!»µ§ƒû¸®?À’º«ÎÃÄÚBEe±:ÁÑü“U£ÔYñYÅÒ ÿùN:QÝ0– JSEs¶ L»0`ý°5%ñ³z‘üãñˆÂ˜«ÖI–)×^%¾B\„ µ,+ÆÂ|»ÑÕ óvÐ6f/ù‘¸ÅRŒê$KRcÑ@*z©V-ùæuB9N¯Õ5ÄL®D=C>š˜­!ºÒ…nƒ”.K® ƒ,¢.Ær¸Ã=»Í.­r ‘,ÉÌ΄2A wÅ 'Û35dÝb”7ÙPb¡¾huCç ƒ$RøÐ‡ÿ]–fç*ÞRøq€d`Aª¥æª\›ã’^ÀÖÍÇ¢%»F+SggÙ3ä´_ °¯)`ªò=âN ³À_çyƺÐYI.à)2E@ùh‘5ýÑ¥z¬—ü¬0x\‰œÖO |¯’DX~  îËŸùѸù!ì[‡êjZÇ©:Øg”BKžØcz¹xAŸ²>Â÷Ú@ƒÃÆ\hR¬›*Zêd#î»å¦/ƒü2D5£¡'9N‡©Pî¥B iø;Pe@úâ¨C,pvÑ‹»¼Ó|A|â®íŠ¢r¥ß ze[IML+Ü©(P 4Š./Yõ§-°µ&e EwVôˆ7E€Eü—澚&9µ%— ×cÍ'à±&ÓÀ*?­°…BVÿãp5G—Cà` ÂÅSÜÂò’›iV¾æ 13Xìu®ŠŠ gxž]{¨_¸4ÑH3¸¾ƒ­5RF]ãÚkxÖáð«]{xòúYîÊn\ÄZìþãÁ «@ê3þ ïêÉ!Pam³’/ˆ<íÊg&­g!àËvG¼N‹ÆÞû(‡½ðEËZè'5*…¹ü"yüPßÌ to–{ö,ô_Áýë ÊWòV¾ Á»¯á±3–Ä$ç…øW ¬êtq¿2•ÎáAO]´Tùß–ýy±øåò'‹Î»zQo}vŽU>ùu‰DÈÏ+õÖcõ|f_æùì‡ð{g€ž„H£š>‡zûx<t± ¡MÿþIOzÒWæûú¾þ¥WB§xÂ6+ûù€Çw¡þüv¯ù¸÷ø3úJ‘|_Ç^[ìù±1å6`ÒññØ¢µíEôLcçï«–¿pûÿª`ÅÇúµ¯[ù¾¾¯›@ƒÍC…¦õ«”rÑ:'s°¾¯ïëûº:*\¹biò\§±~xÑsì‹]x@æÑ5V¾T³É YWöPë\‹ÆÆ÷‚¸¥\m-d"0LZÔ:óôŸžn\g°³+"ló'kJÓ5ÎÚ«PÃF;ÙþÐã)¶ ³ˆØ[[ÉY«u¹ŸÛ4×ÖÓÑD9$ÆÒV_6h‘„î凂Ïo­æ.­+f [™Ž¨£d j›CŠåÐÄ»ö0‘\ÄxNzå¶æ’Æ¡ªùœe÷œ$]ê¨ô;nÔ^.ÅÊþøîe$bv:¡§“Έ?¤ÑÖœèJi½ÒÏxcC=±‘Ðç¬nWˆŸì(`ï ǹ,£äì e°9k^r=®4Ðj+«LÖˆ†4xÄ,ŒÒº­ñþ1ÇÓ†¸‡XÄ-öqÚM9Ó!óÝ”‘‰tç2µ'!™H’ …k±k#‰’ýÚ´yΤ¡î‰Qª9κèÚ‘4ÞÖÏêÆ)Sɹ•ý>¡Óã‰é‰ÈT’9ï‹Û1n\Ú9Ŋλ5ÆfÏÂMJ7éˆ o¢Ü@üï?©‡†#Ä.õL (0&gý²Ècr‹§þyèØäá³:¼ŠÖŒ—~ñ(ôJHUœè=Ä–V-Þ"N@»Ã&FÎó0’;\aÆ÷rÅ+c¹ÔìŽ8A½7|Ôñ2N›$ ‹ƒVeŸÝ“ÞúÔòD˜ôÈŸ8üÊY¸Ö8¼°¹îÖ%¶rípö•¿Ú|-¥´cX’»ŒcGã¦Ya_UuTW΋³²ö_û¥z<⇹w,¹g–ò_¶Ë•÷TLEàK"s+'¥Ø~Ó[ÿâ’@ò-ÙÈJ$^ŒƒUèBÞ”%}¿«ÖÍÎÃÒâÿ†èüš@– TÔŽ‘ã!àÇG1˜›Ø¸¿òiäX­—P݈£Ž¸–ˆÕÃA?¥,¶¦þŸÁÖ'  Ÿ$‰IR¢tA(Ñ«D_›Tî@€ö'¸Ip/Ù‰½ðtꥋÚ>h{(`Ò¾ûê $ÍÛÂ#†CÎÄSjJª,uÚ5a=mß‚WÜ$¹›Ÿû™w,…/7¹E]äVÔÈ­Pe‘³s\) —båþ¤¸<)pQIù7ð(zƒ°è%2r^Øš™è2Hãа að1Ý{]° ±äú7î¥ç¢¥öŒ%ÆÝ9<Â*ÃpOŠ"Ù)êY™lõB”9º™‚½©³án°TWPK·:ù|ýËŠÕšÇ 8JV “šÁmN€QÄÞ)>í|Ùb¥_vŸÁjü²(ôMÿ+wÎ\´Q AZÀ%‚| ® y¦iˆìù%U4v#žz^ŒVý¤Ï+ê©}n­›ÿé¶‘öhk ‡¯$b’ˆÀÁ’ ›À‚.RO,Ì0XÞp îj»@]±H¹E%Š— Ƥ€+9™ä~FDœæí2¸Â, lÀ¼eGRžOWo:æàOÐ(Žš]Ÿ®²zÎgŽˆ5S‡…—¯#ÀÚù§¨®ÿ›¸àù¦òh¨‚ê©AÐ2û²üf…Õ,vïhQsƒiϦLæA’>¸£MFª«ALeà…EU%û¶êD4¿@FôÝÑùÜF+]ŽPC è¿“´-nÉ–}  ­@‚ú¡¶x!FïCH»mTí¦/Ñb|êÀ€7þ]®\Ñ[:n™ª^(kc £«¯• %]Õ9Š –› \ü'5°Õ¦P‰eƒY¥,üˆV)HãhédVf䟻”kÏêÙÝŒ4ËÏ6æãØŠ¸{ w^Åûn‘„im¦X=ú«¢ó¬áØ18Å=å=ÄØYЏ*!_õl\CŸgA:wÿN5}žeÀŠMÅð4›r Ž*Z„úH»»¢»Äê4•DèåO= 0ø—_ŸI\”äž;óOp £H±ÈøçμvرЭJOèo’R_:'æý»?±••¸¤=ðh o<'6_€H§ƒÆ5@ð5XnÌôh&çšÇu4kxº0ów7Á¦VÞ*0 ö=sí®Uã ³`´"% ®n{+Ó°•à+ë—Ø7yËà£0_•üº¼ŠT èt _¤™ïn úTæõhùŒ5Aóu-"þEßW탇=’Jç›Z›¯l#‘CÄãvl©%¼}œÏpo½ÿóúâeÞ¤ÌCâ)o@e5n"ðÊŠ‹±$änÙÌØ&úÞÇ·#¡ø»àa¹žYøMɇž\ý_':‰qsQkµ.4¡vºcúš«Èfá\I±8mj±'ånÄ46¤¡ÆÈñif? e Ÿ;s¨È\p”ÉÀ$äÄ!HÄÀ“÷øªfUšJªšºÊÚ© W2×>9nÈ™/ÈTØicvZÌö¨Èg7Jù’ŠO;vGkÒ[gßuö•X<€SƒØ7ˆsr“Ì}«IJÚKqyz ú&8È¥†Øn3÷2ÐF"Fa`»V¦býާ‡M‚TX¹Ö1²ƒ\…æ›ë—‹? ^ÉEÓìÏpÁq‰h$˜)ríýOͽªÞóÓ&!1Ï`nœb‚o±†ü?<ÃöÄ"çüarF¤¼Õ^0ƒ&òøÃÕÝK…Ý)‡ÛÎæ{]8…‚1 þªb“pŠ;Å'L~†ï°TÇŠeÈ•Ð\Çiàªê ”ß[£n 5ßKVX­N Õ„½5tÙV˜ìóÅä©X!¾…HŽ( Å©-ŽàK"ÇMµ‡éüIÝÜW ‘°×é,[êC(û4µvògÍ`D~¸ëÇB±‰@(|ßIЊ“sxx¢ X^¾§w‘³»D3aâôJ^5£­$*süüóùt%ÎûwwG8ðãJÈVÒl¦1UÄ”E³ŒhÅ0ų̂6÷£%·çì#õa .§Õ=P&G¬†±ðÄÃ7òÑ2|_øykùÖ˜õÖqOK bŽ 7ÇG^¿k+æ¸R¿ËòÞ‘ÛÎľ)ZÃÈŽ™É1ÑOº×*™ Ī˔Túw #§GÅv‹iZô5öŸ™•®«ò 91 Š Aó¥M²<&±PH«û="=ä6L,2! a'cÝæƒQ𠆮f®YI`Õ¹’˜1׉ç„9Î%ÚòÜM¼Ð mÃx˜Í#ñËf*‘´9¦´Ü.‡¶¤Œ­í¤Qr¸z}ˆFä3¼È‡ Í+Ä@<,x(#&³ dTI‡Õ¡J2;… ú'Dçµ &" ÌK)VL8e:Œ,DYbrêbi¤8gбˆ'êÂ!@úª`õþÄ™F;Fɨôêw“kØQ£ ~±óåÉŒÙvRÚß'D[<ð’¼~¿Źߓ½…­š‰nÑùEœœëÏ•¶+Q4ë‘Fã©aÊ/zÂD^JYaL¿8ÙóîöÒIQË—-›IŠèÂH{Émôqï\”eç÷‹Jîí¨Þu¾”ˆrÛ#bãqûüœÍÓ¸î:,F/ó¬ï¾žwY{JÀÄ‹Cµ^$aDúŠ6^·È/ÆP®zú,º¸ç±“ âz/ÞY±”ˆˤV݃þ÷ Þ•gNÇoÊöèÜzÙ]~Ÿ PÔF³üD”ÍÄzòò§vií4Ùñ1 þ8óùj†çÑäkNò/¿é~½×=3]¯¾ÙÂeÛhà¬p5q‹Öïr¹o«;—ˆ~®ùfA ÏWòÓ5â¥&•EÖ$‹%­ŒŽ9™†ÇÑñ¹7³-‡oIÍ›¼w>™ÀöéGí{ì¤â®~4r Èå–À¼Àî$$AÕ´Ë)8"¢lœÅÀ]›b?YU½WÑE݆‹D~kB[q{;©ÞÿƒivòÌùK g?øòå3'êR® î+kc…Vô¯…Ø´¢|дó.µð”GœnCGä†ÎŸÜ¨‡eJéÌ÷9‰M5ĵ& ˾ 1`1ϷߛªÇl¡à2ô‰ÓD¢Àš²1#$ûæ’ŠN~Š âÉõ%brgnûÈÇa¢÷ÕZ!~[8Ñü>ŸÏçóùx<¤yÀKÄÇÖWûZ¿Y¿˜Ø'_x­Å‹:ËÎÄr¯Ã¶KªåÎüç/>qˆÇq!ÏTVq¢Xâ.¸bSa9…ªÓbmðq‰Œ‹uŠÞáü“·¸7™Oðhú¬46üe{€U˜·t)Ð;EØèÏçóEÜÛ⌌䤢¦»Ù÷ •n§DKóCVüÖ1\2$tSàtƒ‘+p&B8“íþIÑy<®$¿u’™Tج¸ûdÚ0#dh\¡Éèô–9Úè=¿Å¡ãch»¹%°r cs 6Lý§Ž éæaštÝØ×Ƚ+ú™|ÿf”‰MßÍr×Jµ«± ¡Œ'_£sª| èüšÍŸ‘˜Jr>åÞAd“ºq(›3…^Ä1HË6ÝàÒt “¤C`‘Dž¤„é0ŒŒ#P]•Äç!qÎ P³j€´^£àoÑy¸ríŽ{è;>C EÍÅjÜ„4BÜ“œHƒº™”}ž¸õÓ­‹ 7¼v^” o\<†`f½dš%M~ s‘UÁ˜"Åy¢šs(ü¯‹ÎS«ÓD§k^B{SOÓ´>¥ŒûÓ« ¶^Ž«0W·XÏ+ÄÆ³üw€%x.Ëÿ¿RÙ&®Ò>/PE¸€°–†½ô’ߧžC g©ÏÜ4 –5qúî3ÜãX&[N ÎìŸ/ª’“‚³Y(¹›dØvõÿyµœí> ïrÙÄ“îp™î×Ô#TOÙÑrÍ¢¬²Õ.'ÚæôÛgˆ3@‡;ß¾(Ó1 +öøtj_\›öÉ‘®Mûç)öÜk3OÚ©Ò¿&úéG‘d 4ÇÀÝQ*ù¡ºzsiÅž ¡ JŠ•_¦ ÆÎ‚L¡ùxé´Åž °ŽåøPf¬­Õ´uäEq¼Ü¸“Ç ó­OƒÐ¡âUÏ6bæÂÛÏ!¬Á‹`è±Þß[ôz‡²åp«ËMÝÙtlMÖ,¦ê"ò/>tUF=Ûnzñ…=”ó'c‡©~¤‘XjÉ~G¼í~_ö¥°´’¿QÃeñÄŸê«p{Á˜¼àKï‡ Vº*™{æ $ …› À«ªÑ”JpàOŸªa"id:jØïïöû^ ‹ÚA#½ : Ê1Œ?*:Ï>:bœÕPzÃpYtMX„N¼•ý+ŒP_Y“1ûÁäËU7¡Üé±Z·ÍUl“u&àj@+<ññ` '´‘ï°©Ú €sØ„' B%þÂR#èZ­MGH;ÑM†iJL?c\Ó“¬JŽøè¼Ã̽E“ÊÝñßÖ‰vŦ”ìý Øj=-—.—Žº:'5f) ­ ÓÕP"G2 ¬ !õ –àñYÆ•{˜§Í¿òr—‰äÑb) Mheì¿ÉEî¬tI)‚Tô¨tuSÏ—Ût9­Šõ³îŸ-ñΨŽ©B•¤fÏœ}ÍX%+«$À¨‚¦` cV’Ú ¤1 ÍêF=ùÍôù\åjKVOIiçqeÀšåØ<¯Û3}ŒÖ™}²ÖHGô³Q;« ¥]{T´‘¿ª‰2u¼Ò,=‹y™á;ØÇÊ ÖB'åÿßYûŠ@²­tD"Wò#íÁP§|¸5Þ)±[’ToCá-ŒQÞÕízvoŒž¥<ï´MÊ–ßɉ#q…+WOÀ¬HñŽÄ# óÀ“çÂŒïw×mµ ¥NYîðwê<ä5ö„+õSSsÈzËÙ¾ ¿¶[ú|;Ñ”š4ýZ@1n„À-Z† $ ZúozV”kÂ0¡P낃„re˜ n®ÒC-õŽçÓhTÅñj£ÜDá×- ùì~@â¾!ÑSÊΨ|…CH…d6;jÿ›ç3 „=ðD>2•h&@6É­¼U0št”m9{Æ<€œ¥™vFǬðÀì’È3t$’}µbÍäŠÓ%ÑŒ8ð»ØC_òµ42ÞUæa†T<¬q¬äIT9ú"±»ÁÇ£{d‘-ÀFMËÔhÓÂÂ[”»Xy>ß8®Ž“Yä†.ª)Y±[%¿üðÈÉgÏÀâ¼ßœZ<ù•ÌW"‰× ï®üž§.¼fOsžKq¶€¼ƒ­‚ìówûWDç‰Oçâ£zh©phvÍ1vLlÁã%tŸLº#{•8¯YP2bѼi†»ª—2ÔíJjn* «'dþ£. ý‰Ä؇Sâ­Õ âäøà¼¤å¾ç’­W¾çI„Ïç¾æ€°Þ(Í¢$Û!ƒVóB7´Põ¾]\ ¼ò+4R\…tTÅÃk5½¹ÇÚj’ŠÂÊĺ½\r~á˺1›,ErÓØE¼[vþ®?ÛÉ xÝ`&VZñzûjÐP×zp3¼p®u|u2æ8¯„N‡®¼;Ég»\ úaž/¹C>ä8L.‹•òTú{Qidz“EžÙôoÕP¼ã© `Y²qhV¬Ù½$àü‡È6æÉ?˜òÂ} €6M‚+˜P=Äí0$²|Ëi©„%pŽP0ѽP¦u äð&x-Y·žxâ%‹üZÀ]§L¿'ÿW‹ÑibÔKB{Ý)ZŒ™¹?¹½$ºGâR^¸ÓÿÈ+¾zÈ1ÿ…Õp'wýÁƒåó¨||ðx4ð²o‘Œn Bø ÀhŽÙµqÝëÃÄ¿þº:²8šuQƒ®AïId#*­¬6}ð8¸$.Ú wˆÔ3GÖl¾Çz£˜/ÿÊÅÄò¹é?x|_¿\x¯ù×¶ôŲ®ß#ÌSâ{Ýée¨ ¼HGξÉÒì >¤÷„}ºj5µ9þÝBÜõ‡¼ú׿)ΙDx¡èüGe:Écug‹„`Y‡ÁÒÀÙQVÉây 4þwü:ëÞC¤6ž:(Þ!lbC€ùPyûµ”8Tq/m«©ÿ‹8NûN«¢JÕ"Mí’º²§”'O› ²tm @jâ4ûDJí5“Ôg!iˆ)ú°3ÐùFgå'˜`§ÛPkæAo;¨L˜R¨û§ä2Åmhp&Û!ÞxÓ[ãyÍRî­ÛnW£$äQ‘j7£Ú•¿¡";rÔ */ 5U@6Ý»dÕTЇ¼À‹¸^SQeÐWGÜæeûØ yœ…˜JõEˆÉL<ýþ­\LLÄe7[S)ÃT¶[úç÷^R‰™¢Ç¬â\i\›eª5b³š†P·€,7š!%ŽÛ-‚黑ÒWçµ9Q¹h„I©´‚~–}f¯Ó¼$PáµÇ ¢#¨n«u(Ì.P|]‰[rÄdöÖTÑÐpÌx€|o|šÒTtª£¦¢]vzÌG|&ºD’èạ̃뜡Í"‡V¥èå*1¢«\Ê`‘—äËLkíáí³•xåfÿ×g†zWŒD½’‹é©Ö(O'‡‚6·ÈŸ¢'/à@$½¿²+0D”sð.Œ¼‚¨ž¨k3r›^æF›®–xPŒ>?ÙâÚS\ÕP©™0K‹ÂmÞŠÅk±ÝÇ¥9[¼‹†¡X/íôÝÈ9¸‘£ýpÝÞ’³Öš?tTÆ$h±$.Þ`ôô|wøÊpâ#,꜕œü!åSh²¯ a×Á¨1 ¥6ê*@j ùâ+M¿pM†Ë<ɘ-TT‚´hêláŸ+Ô£Rw•aÍI€X‹âÒaủ+Õ2µ0 BM=<ÌcOÇCT¿¹=þzAã™W¶Ä¡PJ¦É`˜ªÍ—yFñŠMžf°Ø7:Ç«PÐLÛüxW¦ÒêùýËIreò™äâ(‹foÿBcö/P¢Pøà%ý†µìÜ/Ò_ñátT O›;+ÀGq@ÂtÑjßc1§Æy€ÏZÃYÝ·†CB—ÚÁÛ¿ ¯Ñé'BÔ3RA ƒÃ×â!Èj÷Ü‚qE{ϹLrò|›º/WJ (Ù9¥l¿ÃÀØ{òc*²v” zÏePÐpw{V#ÿ]Ô{DÁ¸ü}Ï8ý¥µ-4)|ˆnÚz€£CÿqÆr_²qwùÕ^ìûú¾^o£¿¯¿fhzÍw°¿»†Ç#ªÜý¥Þ~~oÒ39ŸP|šÐÊ÷õ1ÁÕ÷TÄ™¼üÃJß+³;àÃTØ€Ùg^%MCMŸ«Sùë§wßø?«×%-l¹‰/®š›ÇØv€¬@Ó½äC`]q9DR©‰{ƒ vJ[wi¼CÏÈžŽ¶¬þvk1¬2Ö ‘}ªå)û F›#¯q´Vëµë7¹LV‚?†|þ¦¯cì7b×øéÓÂIôŠ™B°Øz{C\n¼sÛe)_Ý‹ªDÑ‘ZTÝœ‚š’¯­ÕàV¬§štˆpI²Û' ô¼‘·²&˜.Q©œÌ»ÏÏ{º]LSw°wGl¿ÂeÛÔÙ¨Áë¶/’Lo7ºdàßPå¸6ÚöçÇ£?!WjJÄxØN¦2ÌŒx¨¯î€ÅØc÷ ™4LTw1á%5g©Ëª¨æn¡* Yg,|ÄÏK*+Áy°®˜ºÀ#o‰¹¦à)>ÁЉj¼öªõŽ˜°ˆµØ: ¡ïŸ W8_ñÙ© ò<ÁðD&Ñ¢:9Ü‘6HqG¬|­«£åÚ/´À¢ˆs˜š ïÝøÔ×ÞÕµs.úëðÝÃ0yë¼ëjÊ¥‹xW6^ò~Fþ™hØIbØl¨h-»ÜÑ "B¾YB±ýé°PëJªX40Y€ 52_íVµq1%À.ôˆµvWá±ý" zw}!bJ>Èùï¹NN€‘³.·«G3X¾©m©Ë Ž—#Õ|ef*x€¢]-zäï?ϳY–G¿Êе­…:mxk÷¿Øµ`†vCËŽû/∩ýûò’É7™í˜6Âx6=— ^tO1íÂæ÷‹_v75ãã)²Ã¦,¹R–Ën­k0ɺK£bÛ^›0É­‘ÈoJ{^¥)¤•è4¿)ÑÈö7%3¨å­¦ŸÅ“\‘X™¸¢~Ó®ùhp†Eú¸Ô¡c}¾«-b2ã"÷èϤ­-½>Ò=ž†÷KÃló]û¢óÜt<Ÿ½PG:Ÿö”¬³Õ;]ZÿˆË$ôXÇg_ðúºf2à~úîTN³c•k•kC[Ð3$›x¬^ë3EÎHra YÈ %èÜÈí¯˜`¬t¸NØA,o÷Ek^×ho@(ñÅ·ÿ¸¶ôþYùa'Ñ)-lÿf }D˜ˆ£-MnbT7ÄŽµ-Ý[ù_‡—ÑæœÇˆÒµ–R>Ú–ÍŽ“/?Òù(Î ¼éöÑ©¯ãÌm uP³ °BÀ\EÝÀÈÌņßwVz5ÒãÃK`q׈˜Þ=vÌíâgJN­³<¯Ä7`fÆä›XgT %•»Û™.ŸnÀ;ûtè*Ä{ض¡*¯²U¹¸å2Î-o%@ÊÁ— €(2¥´8!V,F]rÁ\0Ft*%£ Ã€C.Â5>ðnÖþù©‘WdÊEæK²hˆê”ÚŠÙCâv4Hõ(C Ò]8ö™d-cÈäsÉúTDáU¯ZŸéB¸1˜|â+5Žï~¹â®nÖú*IŸìjûÑx_)JlX[7óü[¿Ã’v¥úŽXÍ\O! Ž>1 ïƒÜbï0s‚PÏ›*Ο <1rܕ܌ּѰUÀCöÄÑù7»ër h)!ÝÆg®Ø*5YObµÚ•'RþÔUÛ8™VDMÝÌ¢ŸE´]™Ö¿Íìa©B¥­¤2ŸåöÞ'ù¹ð’÷ùi›BÜ}€Ú5)¦iñºÑl%º/õýûú¾¾¯cÑ>ZÇÍÿàù»ž~ÚÈam/±ûðR ‹"3œð}}_ßWž+è~ýå©ÖþÅŽ]˜Öóùê0|_ß×÷õþë‰ø`ÅéÕ_ßÞA”ú¾–ík`_ýÉölø+#ùiAŽ¢ªõœÂp… P´ˆÖqÊÀGÙ¢¬–ò§‹KˆÑ@³/½x;§áí–ú»ÞÓ‘1nz:´¶ 9GÞÕÕ¹>à¾õ´·6iUéõë½C(ÎÛŽI#—cádkB°ë^ÑÞc)¬ÖðǸ¢FmÜþÔåíå³È÷Ht}3CëÓ^ÀUòâW»€H’Ò©PF;½y‡ïk±‡û£¨cM"Ewzì½ÌEANÌÅf¬½íßhÊ(Œ|L jbDšÝBÓÑèfÙ§œ Ù¯%qf„ÛÇó¦wõê³¶’SáÌcÝÙ—xO43šhŠÝ@Êò¥U]jŸ 骨dBè‚;ëö¼{|r£ÜæÉ“ûK˜² ­·Š,Ǭ©ÜU_˜y¼ÎÖŒ÷…¤R£üDÅÏMèìÁÒå%s˜—gNËZÌDvQ*ÖO,™Hñ"÷IƒhtóCQ€‰†Af=·ñÀ5O¨T ”Ì•'Ýñ¦LÛ‚.š¢€;›t,<»æÄ´w06º<øK¨·´]÷³ø/V5`šñe1Iâ0š*„a~7}0×5GÑéåažl¥iD“ZBm ÜV†ô0`!ÔÃ4~<=}eˆOK[þèen˜™õ}–'…ù᪓2i¬<Ò -vkœf]ZlÖ‘ˆš\NÔë‰}æËF<{÷‚ J3³{îtú§@€ÇRåYbÛ=„geÔßòš)Nµ&»1¥º?åKÊy£:ÿõŠøðôýïok@Ä£Ÿ‚¨.JWõ¤â{Îî&À±6¸¿#:¿ÎÙŽ7Ž8˜Bj?<—2†Bçu)ÒX¤W‘AƒZX*@—8#-¾ÉÌ(6¤—‰5ÙÃŒˆÄn¨É¶ˆ?P°hü£§×¬õ|R$Å¢E»¬|ƒƒÝ{,¥(—Â… Ðên{”ðÒ(? ŒËI³oª¯Ö®à1~‘€¸E–¨1  x¬e÷rÑ-¤îEP”ùH›‰Ï !Â.eHÙ¯PlÕ&f¨-ÛYäŸ@F´::Æ<KRˆI"D:˜¾)*ê‡Ä¿¨T‰ Ìà`Ī€æÒc^â;äjcÅ\'öZ44\Íwáw‡ärû¬šµ8¹ÆÝúëàœ…Â<;™ŠŠ L¥š™v8»ŽrŽí©ßS÷&XŠÐ4}ó3˜¼¢c3E§a w°2Xf€(ÚÎàæë7>²ÆD\ÜÒ¨ñŒ`’1cÆ ã¾W‰±Íì¿kJ»€ä(Ì øU%ÈÆhšrM¼ºW±[¨Ò© ON`°^ɵlMušÌ±Å$àìî>ý¾ámBWQë‚ÁUo§B!$®ìõ{)Ì‹Ý/î.–0öCîêch'½J¡çïPgöXOͼ#g­eE heñ‚©ì«r?Îe1ý¤ìý|û’]Ü ì÷­™=ÃVaŸ9MØô‘ó<ÔnäV#D©Ýù¦G…*ÚA&1DW%—ô±BÖ¹Ši’%å jûé"ÚDÃëÍæ¢Eù\FÈ} ÜçsÜQØ«ø?ɶ,‚¹xsÔ[»Ó†¶zæQ àÜžó•ùäU›Ñ)I“.†Ñó¬Ýž:–¢6r–Kt¼ÿíØYE'â!CÃÐgÛŠöy†¬‡× îseN}÷UÚnÏl\ðAÎVy).„˜ðÌňr ¿!Ëû`ãûr‚>#|!ÞùÕA©±]ÇÂÝ¥Ìá{`«Gò@?L «nu)ˆë×NNB©QÿZý× ž¡ØÊRÑ—ïQÒ@Íê´Òü,”%³æ.1[QÅ!ïÂm^E»ÁÂîB‹¶·÷¥£*ȧ)*¸Yxí–]ê1.ÑeìÌèCiöæÝ0æK>MŠ‹}Ü•GfŠžOxà³Çf½×sʩłÑE…T䥚s·Ÿ~Çý=‘Bf]ónr”¨»¸Ã®“9ü¨·”¹'éMÉ£S±k#’xøO&CœÛE³ÿ!w”D"æaöÿãB^ÿ¦Õ$‘ïJ{ÉÁ:¤,E”Vtn”´%hN„é]’‚é“Êòl±0X }¢1J¹|J=âé*òœeÏWžàLTHÛhÉ\ºæâÀ;D‹†©@s%÷‹8•|¢IˆÆÒUúæ n¬c¦š`¶QêÃZƒ’y3Ò}ê±­`ÂNTÀwHâ¨tê\ /2È2Ã~£Ù"û‡5Hþ)B̹E-ù2p²à¤vk'Ì»l©¥Á©òÜDè ²".”8´£!¹J=Äšè]‰ /¸þjh߯ß6gûvžTˆrÍÔŒ‰ZšÇ"‡È4g°ãDù@Å(lûFiÁ롦¨Y¿aÐ("<…þƒâò bô5“<Úáx·þC ÃÓplº.ÍÜÊ„ìyG—°Ú»ÑPÉbq±IÉó’/æó($Gì§&j•]0ö3ôÑÝ’·²zg K~6³ƒ¦BF¬Ç˜ UeAùÀ¢œøÆ-€äÚ²/]µÌ½ ‰8,ÆÕµ ^™+ÝH‘B]P­±A wLÌoÐlÆb=3#5ÆØR‰›hs šÜsö„Ô ß.œd»V´tË–ýµÖ•>ÊÊ“‹IZŽ.À£!éGŒ·šÔUƒ4“õâ¶Àì´¿§\ì'Tô­ƒ›^ÿ¢ï…Û7{<žÒE·{ÖŸBI›}v ûÚèByåmoP”ÊE­6ÑMI`Ù話—¹qß6úWë1s‰÷gŽ•@ŽÕ6T0ù Öbå¦rb>Äy¨ ¾çq Ë1,0´‡S×tÌÿ":¿ù û ²Ç¦§Éس³ ZÄ0’<%r5’@ –Œ0ák¯Àï{!þÀ?ÿòã蘒ÔøvhdŸµÛ*V·=Þ¬þv‰nÆ;êߥàVsĪEÀ­ý'Ž?uõv9Ñ ‰øx =ÛtòßfTíx÷üLÍÔlŠRNr¡‹z__ÌùF]=d0¾Å xç|YO0¬ÚÖ]C)øa‰gŠÏ$ð;ü×?Ü¢¦¢¥D~UàrÎ¥Ù|óü†sÃE;òÿçãäY"/³ì˜ 3<û¹Èþ¡íxg|rmÓÜ%nîZÀRNô}ùÆÙ2Âm#Áø°|á·`:nu禘m y¿÷´] I¿¹é>.>§%ÌýÀjvÀëñø%Y#^À¸>»ýêý;¢ó櫱èÍs½5ã®]Ÿ³â.· ÙÆÞ_‡ôü)šr?mM —Ƙ—Ž6wéæ$äÐDA¤ÃWH4 P%Ä¿Jß³8è쾬é¢3ûKÙÑ[ É7Boäâ'GÙÆ­ß º:Ê0ž|к@;ÿ²í»E<ƒŒN¨ÝÕ¨v[aÉ­.ãïX³}¹çó9Ì´¶‘ëØKÁ¶Œ:pX’Pð­j¡ú>`*Èf§JîíNaßñxhië+\ÎÄæ0ìV‰4k$…þMôHý|á.I‘Âê]Iµ/bB]׃Ká(eâú* ('#R‡Øy¤Ä:Ûvy¹’>FÞ¶c‹(é4 ­n¬áñ»]ºÊí"2ôz‹þPDdÄÖÐÔ‚ÑÊti¨£K¬X§Ìôâdª¹Xœ1çD\X„ÕOìwä’•ìnä´ËÅ“‡®°djiÄM ]ú†ì%?„‹ëåJ¹‚·Ó©&©ˆé@¦´Þk‹P°Àv1ÇØ}_9ÒHŒ2ýòtÜòt]ö*|µ²,Ãj'F5J9‹nWG £‰Çü HDJʳ#€±ˆ÷D^Q¶EªŒIÎìÂŽF«§ŸŠ½ÓbáJ¸F÷Eµ3óÔÕ¹V\; ¥{TGÉH×rûi¹¨»Z.7›NÒ ; Ž3Å•I!Îf±b÷ è—G)÷hBbÂYb¤k=¡¤Ý¦.¹kv‹ˆžPhi×ÁRÅöò—|7½¥1‡ÐÍDZY†Hx§ÒŸO¨,-÷T–BQØfBu1¸‚-yˆ6¢vÕT*žÑ¦N‰‚JþþÉI‹ ?w,e”/¸rÿ šlÓíD‰‚–ÙJ~W€§Üì&7Ý´dèy5O±òØ=S`ÉÑ@¢Ñܘ’'Ì›c8Nt†Œ:³yü ³Þfë5ícgxÏþ+„¾Ž‚³ÝÔÅ-pWž­¹†õU½r¼ëUu «¹×CþÝÃ%ÁŸýÎ×}®è°>?·$HÖRwæ…žæ|Ã]µ¬ÿêÚog¼òuIáêŽ{aF ùÇ·_xºìä.$¾xqÝîg`ùƒkØR>„ÖHÌ9âãñPus¤yyì õÖnLSÑóéÿ°}A´ê`!$4° ­í6–l¢æ]v—‹öáŠiÀõçœ3pÌÆxÒUäªùų`ó%¦  °òÀM-3^ö`s×ÿÞ~¯ƒ'ÓÞhP¾7áe¬HO|n&’ÚHª"œ±êv?ƒ­«ô±Q¤àíœànàÚÔƒC''E !`,¼ç‘É<¿ùuÒ“¼Gíç®z!­°Íë¡Eíò¿ƒ¸¯¶O/ÚxoÓÍ €c?Ïe Õ¥ætx^®ý×4¯9.ù¸»W-Ý™7¼üa^r»A1²êýì»×‡‡ýÕÊžµ D ê…t=à¸Yø4Ο|3^Ÿ­4 I`­ ´c £#—*¡‡ê4 36j \3-tŠý+óa†õ•O’«¼ Ó:~÷óXNÐêáìO&=¬xþ@¤Ö’vj©¯ORáMʵ«ö¨•âÏ5MzW_y‘‹ý)«öïÐ÷tO«cöºÀ2ñöð^@cOW¢ÃÈÎË=”бÁZµ¬VÀÓ‡Œ”% üú$jÏÛŸ£{êÑ‹¬òØœ§!~Z´Öe%:'Öé‰ûãdGT„ŒAKuŽSôO†Ç¶ˆl’‘[p6gVôbÿ±ëú­ä£;R•…@— µ ÆE²`ñJeJ„ïø´ÛÓ…à9Mï¸q”0˃»3©•šwKz1Óoe‡€õn«ùã‹£ˆK î» ÷oÄ@0C‹¶š71⥷]‹,(^1Ƙ4wÿ‹¢ó’¤>)pχ¯8.ó>¶iµ`BÌ%nÇ)¬iþ¹s@1šCï2Ó®é5•­’±2áŒÇtöFE´BÈ1†u±¥tºàuÙ3ùŸÅöüÕ^ qDÇYítIäc¶™%á-‹èðp;Ÿt –ÂFNª3¿4Ú%³;kº™K ð!…s 7‘N —˜ ©žíUœË%¼C•z¹¢â";é¤!&¦‘½ó°‘¤ŠÙš<ŸZŠ"à«¡"µ¦ô%áâì½¹m5Ÿ§›p*mgI&Wžð=±_c¹¿å>È Tß;Ù’YE´²gðš3£«Tàñxp- #ìƒ]T¡9|@ô·[*¾’Y']%œêÏ‘$ºñ*À„è³S¸½wÜ$‹–lÍ'$e¸CÛÜÖ”†ÑƒÂŒŒ@6еKXöäqÀèlj'’¦“¹Ryr*÷"gåw ×;ÇÉõŠ1ɺ Ѝ£±ó ºŸûrÊÈ\¡HdCzXG0!@¨ ƒ@P ûêC3DkI¦Ì‘ÂpÏÔ„$;§¨q‰É_EÄÇã? 'í:Z;£°Ñ´;ž¦¡ÿÓU¶@Dˆè†x‹¨úÖž’û V3mf.¥Z“ï~÷}Ê[2³){¤æ5%[öÔ 9°Éà3ß;Œ|€1$Žzsp®T:E›•ÔÚU¢P(O'óu ü€±¿¥ZÐÁåoìÕ&’±b¤%‰Ø¶_„¬œ£ø¹’ñ§h±˜nW$ ªþ„+Œ­Ø¢Ë(.Kê7Ê5TŽ?Æ]¦ÁÇ]§ý¿½–"!ÆÎDD£(ÈäJÉ}«4‰KD®Zð&Är»ü¦ ½¬Õe9µõ È8‰û°Ë¥:]ù¬ÔH¨˜3N±NOÑRîì>ª{2#|¿X¨Ûm›’×SûéºÙ\Þ~¨ ºïP@c Ûˆ‹'9T ýåî;2iPÙDøÁ›ÛMü«¢ó\Í’‹Î»52‰jÆ @^kÙäˆmäƒVÂũȮZW͸NÓ·5œªZrȪX(ô˜Ø¢ü†ß㼤†@úx 𸗈ÕGùÏà'Ó" D¶¢B ’€ÐjuÞÎp~p@¾x†®µˆûûŒìW¾\£²Æ~RñV¤χÁÜ“éÞs'Á>RÒ8¶†TÏTèð‰íHdþ †A„'">ô =f_}H`üÕa6Ø|å¦RQ6Àë î¬v[éýÊ!aòæ2|[g樉÷œt-üÖ×ßgÐꎭ1NºE’k#tßmU0G¿`Æ=²˜yDu°¥·Æ£~VO¼+|_¼;zcg·? â¨hÌ€G78Ã8œ³¼öxÿ1‹û`²¼Ô@Yûá  8kÐ{[´,—“wtTꆋæ'ÿÑyæ¾ZÚZÊt8_Rª…×b˯‹Þ3"ûçEß­uчëýY 'ϸi¬{•¤zP±ðèŽ}òm¿-• Ï <ß#ðê»i±±<^w;î§Â,¯ÜÚ™@yÒ¡y½ }’¦ogÝ…|™ Ð îç×Þ|TÞ À}ˆ0`žtnðÿóùÜcQÜî—‹þ*]މm猫£í‰.·H£µÍ ü+ƒ×s–áïÜßïkÍ0bî[ž@ŽNÃÐ!&Úß×’ÇùÃY¬ãLŠW¨1CÎÕlŸõïÈo¹›¿k@GІQäüÇ{aœ¿):¿¼þÓ¼Œ(„S>àÊ¡(tž„d@jÚýH—:)ŠÅ—y(É¡"Æ·èíÿ_A?˜R§OŽäEKT$¢Îšw­q¨–ý”=¡!zæºc‡¨‘ã[`Ô¼]#yÒFÑÛ·ÐUÕžõ§lQ™}lÔ1™¤×´'`CFû¨ç­ÁÖþîæHS1%. µ©˜ £ºÒØW¡€åP¤àÙ„FoÔB…hÆ–ªF*ak¹‰Œ€A ¥¢ú‡èÀ'-ÅÙ ¾²íŸÐ¨ç­7%_Õ„7M³ëIB‘x œ­Ûåòyh‹9¿ïYÄa ~˜€SòñÁži´ð磩Ú1§~+ÔUmÙ¬—|âÀ¹ßb䓾޺®ŽÔg}t.Ëpá‘=g°jÔ§¯ÄĤÍtÉä<ò4)¸Gž¦ ÿ™ÇCò5ÙÒi’C)¬)'²ÅCJ߃}Ìý»µ^¿ŒµhÞ²ë±;p+ã‚åðr©mYxõ4SæNÚNý5= £¡Ï»˜!ំ“χ„P`ºŒÞèÑ! ß¶Óõ.R§]ƒî‹¤S2ñYÌlîR, ^çjo7qÓ¶žOz=žOz<ºP=à©ôPJxçA+à¥RtÄDô¬£‘úGRoM8‚ˆ…ÝŠ6Ô‹l£ç×a—½bÑô$)hN´ÇöÓ»7W—ŽÙ¼=°W/Ñ"ãÊr/ªÈÊ6O(3÷¡*9ßnN¢!ɤd(b }Ï•ÇäëG%ó!¬îÿ4œ¡×vŒ; •„9ªƒ†°O"×c# …ˆ·Ÿ+œàМ+ööÖÉyVµ#ŠQ»ÂvE~ñúÀwR®š+E¡]W/lj-µá.Mcoк»t®ŒÕ4â=Äð/&z)—ÇV{6¯F'c6¢ªÆ{±ìHv2 WܯiÓÉÈ›¸ËÈW¦‚ÏÜQ•Q\ᚚƂº2gêÜýsתaÒ Éã>*ãHÿ”è<>tê3¨Ÿ+6c•Á™,?!lÙn0‡šQ=Ûw„ÝsWë,͸縴ÌzmÏ‚"™sIÝç:Ý®¿:r\*ŠAª­€}©ð@Š'fßøeq©˜AòwHhÒuí®»^¦A,ÀC±áIp™Ø5”ŠPÌ’Ê“½ñÿñx<ðTþ/W ‹çöHÌŽƒ[úßF~ã~=*~ñc[©Z:ûTêfJUg_“,aê™|nÊ’I°õ¸çå¿|Øy®¾&Qﵑ„'f‚ ’ßhÅÀ@×ÕÍ u;(Í+ €c³+’-%ëä½ÿQ®Îަlƒr8:‹(ax¼z:ȳ1eùÉArét¡‚8cV¬Iq“.r-#‰åçóËÅÑ«ÀÌŠÀ84™×ͺ›#™3ÇJ@}Ctt†%˜è!‘ÜWßóÀÃÔiÝäç? ò! Ë™XúÂFÌ¥é¿ÅÜÕ£pS¸y[õ|lX ¬PÌKš´…^‡ Ì«2˜ND¥–ß•¬9ò_‰a8ˈ ÌÉñ–“ÛI²«å¾Uåy\ˆL;#òÐ¥öï~¥ü®ÐÕ­ŠÃ%ÀbÒRãØ‡ä,åf‰\˜øàòZ[´Ðys‚`k) ÂHŒJöºÒ‰3ÅÑwpg 姪:Šò #Kçõ€ÉOÝn4o5 ÙÈŠŽ‘`äY›3'7íã9¼&Ç$w¢aB/ØÁdÅ꽿V馄} .OwƒKgð˜¤OR ¿~QÀîŸç#WÁŸì‹&ôUÝÃÖNhó’Ïê‹•º¼›_÷J©Ào¤°ôº}—²{¦.>ï GHWhÅd#„/™ùóNôƒèy!Îõ}]g1_—„¿Ò±V¼Iÿÿ£›<9fÙù÷õ}}_ÝLÀóIÏ'<¹_øXѪ‚•ŒòǼ‘°°¯é5º+>‹'¬~_ß׈âûú¾>ȳ}ξ¯wÄÐ%4þš‰}âüKfzX+ärÐé“Ê®úê»B¯´*z+¢è&ÿ±oÎç¼×Ãmþm™ˆO”ã-Ê+íÉf¸™O¤Š){Ú½}°ØØeBIVAÄÙN‚ŒåmÖ2Lžì9ƒ,™’Sªˆô£×-:Ê–°WLkFÿ$¹®[/¬)¬Ü‘%0L}Á¸àòlÚ+5é»÷¼ë,p®¸½ñí¹À¦ÙÕ7[&rÁUSøz·Á:8Äå8»N_J* ŒZêû¼yB¨«q´ëŒ˜«Š1†Ñ»¿°0>]}Í&ç³öéÃ÷ù±œtÙ5Hª„u³Ë vg ZV¾oòÇ ç«7Ž*27©sÕirîÒÖú™Ï/μæ=¡û”zÁ&¡à`°ëá¬Üª±9ÝÔàØÂJ{qu#4%Ê+Ëc©ÓÐF0=êóï>í)»zJÉ¡pŒ7£“Z”ô)Iì=ý4ôÌl¼bBë°‘túŒª™ÕäÌ¿tœ+T[Žú©‰ÜoÁÕü™OñQmøÕ8MSÈ)îrSFEGaƒÉYø@¤¹6iÎÀÓóBÜÉLfm÷oC+°D|.;ÀJÝ”bgK€› ¦Xõ)]š]Ù-Ÿ#&Y8uÜ–špY˜éPx ö6êüþ¶¨Éth!?«ïÄ{ǧGF{*Itæ[(!šÒLÁu)+?ö‹×|q21i mÊ•<<;2b Öû¿§¥[ëšeøñU(¼hêÛEçMÿüu¬Hh«9hlG³þ£×ìŽïëûzÛ¡dµD"z=¦‡³Ò¿ÿk®d‡þ‰è¹è®š4rÝÓ¸ˆ¯ÌË{Ýö7„þ×lï÷uè¦ÌCÐO–úšÙïë_8`_ ¾K*êŸs¶_äepÔdLn+ö'R2s ~€zAuœwv˵Á“R\2ú„Ô¢>Þ\º€3do"Ùøéžv·0Þa3GØëñDÔ3çV¼ÑcðîMùz4-9C)f ø’Ç|rØÅ̸C}8™Sº…xìåþxúÂÏúÁòˇçêôÎUÎa7÷1Šp;ýí@²]íórÿ*qEêý‰|Êÿ¡0~ Û-÷Ûl·û4Ø¥J ¥.ŒÛEZù‚¸còvˆÉÇø%¼%? ¾‚¸ôªÙwn;åò…Ë¥ðòàçNƒ/V' ½!F´·<ð6\Ñ>¿·¦ªgçäkµQ|b JC+‰Ä§ZêWDc1¹ö0!:óþ]l(?/§cšI‡˜Oi¾òˆ­ß4‚d#¦­£e»0 *‹\ªÎï:÷k–D;š,š“h×E8XÂ;þ¯G)Êa½‘ÔŽeabóÞàRg´LoíÄóu?ðx<žÏg¡}RPùãÂú%ñ#yVOOì”Ehrz´2O—~æ] ƒkµá¢M¿5óùÝýCzdîE9­i>…ø„—Ar¬#Äíg¿ðP)¡ÂÛe¢ìT*ò?·Ò ÷Ù¿&~B˘ÀäÉ”ˆ÷U9_Q%e=ýäã[ªáË H—²<F­ž°K¾YµÉ®8ܰ•Ë]Q/XY:û3ç/æuí‰Fùp†-L•$åño`s >ö:¹ùÿ„èÔ®í]Á9óË ù´Ž(õ“°BH œ.×ÕŒêQl&Ð1Q„ã#¤BNE÷\kœ‡˜…Áq!4ÜaSx jwcêcu~lEã¢Üµ\"cЊ[½ÃvÕ»V÷И³:^ÒeºH÷ù’¬k'M`*EÒq¢É›Ü»®3•«9–ÃI¶ßÑÉj #H©‰štŒÀt°©â…)åm¢c×A…4 ‹ÄaôU,ÕÖÆ6. · ¤"ãЍÆ<¸p €–«Ì㘎1„ePãù1Ž,[CÁèf³;Ûö‘X~|t,¶ Àj×Zb:¦r[TneH-…®f‹ÖèN;§Æ<1PS¡˜:¾¹æ:X…CdZ1"$BßݳÖpYydi¤“Qúã¢ól’€ÄRµÎÈ,Ò©ãèÖéÿ"=³3·†¦}L‘oµõ¥Šå´ úU ðt‰ùë§h;Ë9Æ/ Pìµ6$Ï0©å@ȼâQ8ÌëmƯíPakæ/[è÷ìø}J8ÄgÚÄ[’O§€+%Én9 ß×5g墓üê4ûKåœäç9 …Ø'kpË7oü*.ci Ã8+ó|ª¨!zc‡ŽäïëeGÿCùþìGÂDúuªÁ¦ì®ÎGÄë¸rÙ) OÔ†—SÔû§¿ÒÓ’Úêoðö!!î¥ Lšï ¯Ò/z à½ÈíVÝFÓ¹ ·ý­Ê·`ň}¨{ý§léÀ»vä¦g+·eä§%¢V¿ñþ»Y ÝðýóÑÇ÷n€?z¿ÊKJÓ…;L­íMLÞRrsêi‰¡(ìŒò–p9Bðìh&[$Ê$–Ì9±IR¦cɹ…G^V¼ïr¸ÃQWƒõ½áËŸ,"ź³qÏsÒO=[µV–ßy-ýü%Ž“ rWq’ÞrÆHÊžÕ7ﮜK;Tª{" Õ¤&UX_óìYX³¨bÍì²+C>Ejáÿ°EÅÌŸ¨UE9QÓ6IyhìœF‡1+”¬¡Pz|¦}kYb;oÚ•iF <ãUð: u]´ÓœzÊÏÏiϘbÕd¦^ã —·À/Iõܤ Þ˜¬c¦âóI]¿l`»ý\Ñ’Òwëi×ã€%´ Qì¿€|7*@pœ¢à縒wŸÏ:1O¢cäA;™ÏÃ-tà.O3¬Û¥›òM¯% 61>ãe¨¹TK¡¼6¥'yÒ`xB '¾ªf* Ô¿"üNXzÔ(õy°,Z”o»¿ÄfmÏù×C¼úŽÇ÷… È·ÿp¼:ÝwéSŠYK÷·(3›DŸ\80l¹Þ‰ ¼nYw“" –÷Z]²„_t~§ÌÑë>Œô×eDz>-aeƒmê@Ä=Ä\)]ý~Rù€S?¼Å3ÂÇ¡³¼ž-[WWéc¢»”Â`tÐuº¥â{{¯Rƒ€RÐ?âñxX Òâ§k:jõùÉù¥ß‰Œõc• œ : ”àPޤŠô<%‰GÑãñXŠÑÑÔÙ0ÖPãÌRöGÏ/m$}š«3AÌxµß±DÛÑ— žÏq{ i úÍC*6øJˆS‹¥ u>D ²¸¢[•îL’æ}ëiÛïì”ÞqRTÑ­!å[Iômú'¯¹Õ¤ãð7t6õvä ˜²ÅέëÓÏ €ŒÌ§U¦ŒDÇC † T®6Î?ãÙeòbà†þ혒‰â;³¢çävä´_tÔ Íœ(@¯lÄË¢b°-èï¼G`r«F “^ö2À¸Eòù­Ú>ߨŠ)"ò#”Ö… ʦ¼øÑíV9A^ÍO.`p¶×u[%îº18À$Y&V1ÔÓ´1—,ªdSšÖ IÍ€R–ÞåJ\ˆÐß»9¶Õ°Àª ’õÉ’ü2›ëƒ×íÝͰá”çDþ¿½g®îÑïyÕG˜)CKÁÿC.™º=Èšø°ø×ÕKôi–²é¨.™­Ád‚1™UmìGT›O0ùØ„©7ôÌÊ- À¢Á_ÂþÚ/"t„_ÏxÍ— ,Þ´ •Ï@†$qÀIóeR©ŒqéôÎÓâщ¿*òrQLJ íJGˆDËOBÈH !µã öa„Ð'šL¹K»Ì@&ˆN—|âý×ëйy À× >²3Á¹[Ö¿ Ììñï*;Ð!ýêyíY®‰ó5±OTê¹*’*ÕhîwlÊúµTÓ «Rc\ïߣϽ6‹#zÀóÉé»[ééf3ö’éñWÇ{Ѫ­Bèßz`ÏT° kS¬Ló±É¢»¶ã·H¯l¥ö–ùž|j]Ô‘×|y„%0Eò‰^û›bø±J%wÿ<@¡çŸ|œÞËx•5¾¥^²oÖ‡˜–ÿ€·(ñ=ù˜á±þàwŠÎ#1UoVN+|üŠ;ÃhVôg„X@?>G›¿€/ þLÀ)i† ï«aöümÿ¿rSÊß³žå’JÂú–»¹-uFq³4ŒØ h{Rü)¬ãÇ_vŠr‘,b D²Nl{Оð–Àb‚/‹žlúÒŠ©þb?èî™o4~Y;*í꬯àŸÏ&mÛ¶é¯bÄŠ«èõZRú°êÍ Æ‰ ·¼˜3+?zô6º/ ¿…vŒ‘›²¹a:±NÔ®·÷ÚüAgìu8¬_ÞÖ>↻°÷.Gý÷¢ çMWê£< /‹7cuªgàÉ èí‡xÄBãf×ö`|ouäç¿à#œ`ûQÀZëà mÖŠv_›$™Í-8tÈ• ˳~d"g‚ÔÂðž " Âçó)Žèùl·øQ¬.Fç€ì?WÞ¿mÅžÏçã±Æõy TÐ¥¼’ºzþyjq†¼nì>ˆ1éxïcܲ×%îò„+x”ºz¶™ã¸F‘]Íû!âñQÊAÛôàÕ£ÞÚÿž#dÍ£¥³T ç[åf¹G4i¨ÁÕËôC/¡þ_û-߉vÐú×7Í¿ÛÜZ)l9m­^ЇT¶Á⟿ X´-ÈènZGÚAŒ#cq¾½È”QºaR´Lj‡9ßNY¶-ÖÖ"˻ڊV–9ød4È€ü&Â,0 ³kÏÙ2H©“Þ¯(õZ@IE{ÊB„Î@1Daè–xiQäÏœõöÙ#Á{òô³Ãp°ËúDpXÈŸ›¹.bb‹¦Bÿ¦‘–ˆú6$7|±çܰ$‘ƒüƒ>khdFb䢥4§VÌ ¡¨eDœ”A›ãQ-:Í–ëú¹9—<±t¯7ý¬´ óK†Ô'»Ô’ï;ŠG&[Àâ̆ÇËyÏÅl|»™›(*Á©¾ ž·žÜEõÖæVjT-º»or:Š6ˆÀç7ñ‹-¨kÛÊ}#<$≞wpêBß$[FÍWMý¼Þ Zf½ýÞ??9L˜€F ¿IsKÉdgÔ÷ŽíCÎ5?ÌÙE±‰˜aW#b)9ÊåØcg³rLH{6o•ìA©¨…yŠáÁ®6&%|AÔ•'ŠMAµ1WçRpê½ ¯]‰!÷ærŸ¼kâ]«¤š£‰ÐÔ;I:^iÿgbã`8Ób»Y³¿÷œPn+‰9Žä†QRÔˆÜ?Ï”âØhÉA»î›ŸFÝ»‘|>û$€mËÐÂažVOÙ3Œ®™¥Ä²Æ±GÆX#Û•oVSà¡í0ðUõôdXN„ŽM òM›Èå§“0LáY*d2ƒU³ÄôM-âÖ§·Œ†`Ðvwêäš„QÀi~þHÚìf‹˜ M˜ë ²Äì^Ìûð89ögÅè¹ø¸vÚÛCzÀã Ï> ·Ò“ÌfØ-Jdš*¢C®Apå§ažÓ1Wì!&åÈ­Ô*C³¦o•çv.²å|¹GBÁO”0”¡féí„DD7¹ðJ´×=;´õÄaeÂ:¬áwºLsx^¾ÙF›ïl+Ú©®6“r?-фᚄQŠg,vÆ ¯”²Š|…czÔ)þP-ÆDs,Šú`J('‰†{^8"WñVJ;òÃDßÎH÷P6¨ñÏâX¼Û+×™ªÏÅÛsÞ›˜©}Øc¿8¸öÊ,B½82«f«NTŠPanñ:ÍÅ/^©EpWŒÇVlûïç=ŸBÇÎ'Ftæ ¼[¸c8‘“QBÿ¿‡˜ÿ¼9ªpg%«ŸÎ-ÈÞ­Èë Ày€²]+G¢ua_Cibd^T²Å{ß×?ÿ²%.“ÇÚ©æ7Å\ðNÖçÁ|ïð½Å‹Ê”¶˜á[q/Kac™mò7 d]¢ªÙ½@ù÷¢‚Ò%&ƒÖóvp˜‹ÿ„užöv]bj.~Ïö?ëíÆ¾q«ÉÑ{ ïsx[[*E ¢2IrÍá»vGPQ«m®:¼9,u†sü®S!é ɰëÏ N ò²oql‹'¿%{½¨O1$ Üç⌫G MÎPwø}s¾z §¹Ÿ8ê'×äÌA-팇Ǹ˜ØçÀ¥ƒaïîLú°Tå®o9u2yâ0à3-XÙ»}Üõ>8©¨’Gx*~œ–2µARÜ¡;ÌÊ¿7ØÁ¿%:ÿa¦³•9)D-hÐT3æîäP9óYL¢^»b\]¾+¯ &V·%jŽìJ@?œs±<¹…es)üÅ œDÌ|à¹ÔSæüÄ jÕtÓä€$ú/¤_\xE¢¶m!G·Wè}•q!ð<ß8HVê׎=ÿ² &c»Ì÷ªOf·‘)Px-k}Š÷.¡ ȳ4j’®hÈ‘m*ň^À‚¶=v ýû‹!±% ñܵ'ê© ¶c¸’F‰T[emR òdÜœÍSÅ$3»Ñ§ ÆkKäŒ:IœÚœ*àSºGÈÖ™»ð!3ªQP†!Æ¢tHËÛëêÿ4'¥Œ4'¡ÑN>Bß+é1[jï(1µ¶lÌìôT'Jü`Ø®Jþœ’" D›u¦­ñM@ƒò»÷w:¡ï¶­6ùH)m^Â4à ÑÑW-N¿)LŽP¾ ª"’VÕÏË£"¨ÑXŠÏeMUpÔc}0ŒÝÞªcIÍiàÂ#!ØDMÄD¥CâZ%]Q™έYbö+F2ÿá)ºxVsä$”'üHÒ3ò$74bSVÕmdn4¶0ˆA£À$Ã⟃Îæšà‰}ß‘¬ëd_|‹ÐºZ!D ï'ÅETŽMM[‹32Z¤i°ÚkÉ9^‘}OÁÚþ tšmϤ’ŒÕ›Vjç±$ò™b/Ø89[à“QôìÖù¥«‚J6e»eÔ|—]mŒ­?qÃ;TÙW±y\EëÚ-#¥EØ=¡ÓþRÚ•­0<ݶӋ:ΗªQÌ]ÃÃMÁ9qõl²Ç®qD“P§g¦R«ÇÍRõ1C=p„:+ÓÕ¼na5On“æ´9Àí‰Ð½é"#ðnW?sCA”Ý¨š€™³lßœ@„µ凭¡ö¬³J0Í;©³¹€Qb…Üëwæ%†îV*"ò‹±~W—ì@ ÿ|>ù™y<î¡­`ÄWgœÔð,¢R 8rÖ§¤Y ÇœÉPªõSðÏ¢®5Æs™@·›¼ƒ@¡Z•Îðâ(Œ0“ ÉÛ¬§€³§}WcT|Xä™õ |5jq߇+)WÒûóux¡Èųv!eT KE+ŒA+×¥¸îˆ¯£°AûÃT0SÐw j]Ù™™¯ªÐŽÏ¼¡_×áOázaÎ`¬9b[Ð¥U€}#; ‹ gX¢ý)§¸ö3^\kN’$põÀéóQiz Ýî¤,š(´Frv˜‘ ažë4¹²ÓŒ‰W”,Ö‹­¯±b/¸5ˆÚ>ˆ‚xÅ„CúA›×KÀÔ¼äæÑÒ’Ìâ3¹½2Šå㋊-¯|í®bhCá,?yòÐÖÏ.‚,^xþÜÏ^båàå°Ëý¯5¾´DißÃÜÊØue¦ €1#„3 X‰^iPºÔÜëxÖž^:t“È£Ù}¯hÏð ?4êeóT©¬z¾|j;xž] ƒêBà—‹YÃÇ¿¢Éº‘ ïêI^ÔS…¤¨ö± €â_õ×Vàfg+,}Á †›<^2qÐâ4K›È»‡Ö:«H‡|î#¢ªï; ¿—ß±ÄðôÔÇñá6EqŽ?!:Ÿ¥GmÔÓ±O#%“~‰б×o”Ú§s¨»q€glVTI³AŽ`…ƒ6^Ê;™ ¬ÌLgn|àBç_Á’¢¨hÁ_©1ò‚`Ú ’ú¾¾¯{LÞÇœ®»ÃjwjÜ5÷ox|¦¦ÜUê|µ·¾p†J}ÂÙsÊ?¼´s>ßÃógŽ £ýÕÎ`@Ìð‡üšÛöþi_ä$ºåþßm<úo<‹=)~}­ýí®Öc}®Ðç3Ë·ˆÏÐ…ð²ùgv ˆÑO›C8{§JÒ|,Ä5ç£_¼0$ù\a5Õù€ùƒÉûñx$|£Ï\´Ã۽̈́§¿®qyf‰î=íÊ\þ„ÿŒèüç¾f ª§c0«‚ÂZÿXŒÑÌ]S_Õ8bŽÏ`æÙ¦ùŸãP7¢‘ D–sÐ!ìvgëB [Q/÷q’ÔóùdÂÙ*93¦úW•öÿ©Á­¬³úIöóÈ;¾§‘n.£tTE´f ¦Û±’»¹q%I2èˆT,õ)—][4ošs‡™1Cî€X46Û54€†š6m’Œ†_aëË÷d­ç¦šÌ»)ñ1¥oçfȪÀ6‘u.²c]ôF g«ùú\b«?ÑXÎ$âND˜—,Ls± •ÉÆ1tW ¨HêîZ?ÞE¥ú‡Ø-V•ý z¡I>W`oËê$05¨Űæ8駦.ƒúê¡x7Vk·ÝK+lªNp ]m€)ƒ ½k -]™TKäé݉~ ÙÕ”(Jé/Ûà.)÷LÜìH†Q«É Š‚¹Ž\ R]~lÂ>œŒ Wš'®“3t™ ¡þz‹Ö"c 7ÓÙj(K&&ïv8òQ‹¦6Â+ÿXÿJú§ðý­™kÐö+rIÅx€VfôU𢠄¢ª˜YhšÛÇŸÐESR [Ò—<ƒÒ©(=*0‰’øÖÿ®&ˆ µ•5˜N½^ŠŠa½QúXÈÚ4ŽšÍdÃò(Ô³ Cvþ­õªLÑ,ðÎð :c£ø×·âi{Ðйñ½š~ˆ‘8±IÑTL#Úפuì§8fÀrçóÉŽ©PóV¦j·[Éǃ ‹¨˜d*™•ÃXVâµ’k»³nìár£+¹sŪç¢|®¸J. ,}åkžy¿¤öεà*¹ö4Å(ººt¦ŠqÊÎH1¹LÝ4ƒt" ¿ó—§Hkiòë®UL$ ì)†}itªÅ3¸._…Þ®»M'ÄU^ÃÁdZMÚ‡tÞ¹_P"¥±¼?ɵ .Ì™ô PR~ÕæzŽ]2!{,pÌ"bù5Qô <]¯=I! àyÞµº:È11 ~ä¸]à ;ÈÉ2¿E+ í —ƒ|Ÿy# J†*ì°ˆý§žŠÉß´ëuáv\¢ÄÇ Àj’^çM‰‡©z¦SË€@‘³øä•ªF‘ƒÏµ¨Ðâ.,:Ó#®Õô+6?ëX²‡… B—ç·†‹<¯K@m5µ" )QHðµŒpiñ³FBÂÔm©û¾§C\òÏ 0ÜOÛ§F»`J»]£Ò¼]¸áÓ2pÑ•aS7dW9(IJáAöÀ g”b Ý{´¾Ìm…§Ûɬ¼¼qˆ¸‹ 5t:6ÔáÃw.–ôz>¡—,ƒAØ‘'5œÌÍ?(»²©ÑcC¡™Í¢ wƈ§:d,/DmöýlÿÐahrÕÌ'õÀIJ¬tqˆQ1r÷­çŠÞØJÔ¨–ÀîUÀÔë§¡@YT%íSatWUg§ú¼‹§ðHeÉ­ÄÉáÀû/°=@óS„ƒÀ­|´¯ß¢eñh5ƒ;Ú.½ÕëF£ÞOlÕ†–Xž?K.Ùž’·‰Û]¿D$ÆÚ¡Êÿ휛½ñ ÜÿÀºø ÜÉ„¢žÑéN3¶.†^Ê'JbïŠ:Êy7z¥mFŽvÌI±#Ò^+›èò'Œ–&à)ø¤S>ê°#ȉNû#Üš¿K¹µë{€«ÛaX“k²ŒBZ 0µï•!’½ÊOH2$ybYZ×<ß#jrý§Dód•°øL¢šžDÖ†¼*`¾çŽd[d úd:AŒDÝÍ© Ká Þø2²ºá—É᧸}:#AÚ¡§¼iÅ]EÏRv¶[cZ8­uÔ} ˜.;}ü¨Q¯œpÉ»ìî’×Z(¯í|ö±#oF¸üSÙ¿*m–þºZ*ëhPGîÃ~X¸€Ä´ ¥Aˬ=H®Ø x^Ò¿QèM²-ˆ ÃÁ9¶½ËÞ ¾§y«º\Š1WˆQÆ—gÈ»Z2SwK»zÞù¹Móî’hJa@Eñà3©7Uܺá¿KÃVp ³ç,ÍÈMz‘¨~ø gžÁ˜CLòqÛN(¹ø¥uÕÇwôêk¨ÈÑ(Ò K‰E‡ZÄ øAP¹(&c3£|ƒØ–2;Ùùäѳ)¿C>QÝžÝ*ÍÎ'´‰ð¯Ýf¥I½—ð"ÉyWp&Læ1J¤=è!^ó³è$Ÿ€]cªYZ¼&­É`ÆŽáùÜ”òðÒQ1«Û%ûü.(j‰8å¾2ź6 õ šùÔ-Ê[Lm×Ì?¡[0Œ›|y†Ã$ãœEqÔ™ZqŸ&Š_6.H§debe(Çëû›E牴;F/§‚™>Ä%¡)ñï¼9éb‡àä™ù/HCÊ-EúÐQLþÀHèhù‹²%køè^"R ÷hnÞý;"™ÄDå|\ÌB8 9Y/#ÊàktÈk`÷¨[j*¿)Øa3ðœÕë2wšf±ÒºÿKÌt’DU8ñ2Î<\Ã=¬ðÌ’ "Q1þ„?ZWÌWnØáÐ ûB8z”fA˜ãc\ã)zà£_ÆÈmŸš4e‡åNÚѪ롳™¢±L3G‹4G ŒMηvõxnÈ_ ‡ƒäŒ†|}à³kGµæ Ôo”Ç4E_ª LHïònVY­Lè!pÿáúr·«nœâA²,RÇ¡—^»Zz‡&U {hZ÷âm‰ ƒ›TM.âq‡ƒí¦ Kˆ¿BÃT7éwâe "Ê”NP•Öº ¼ó÷»¼PC±G!¼4€må÷i8 Vî¦y>%Ó‚qಠkev´õ­ö˜¨Ä0²–ÃÙb·žÔÀfý èø°Z¶úâèÔ\èÙS,$Dz?´ 1— â"x(ÃÛ¸ :<"—ÅlÈÈ¡qÕ~1>ßì)qE~FÛˆr¢ÕÇ$®S^€1Ft£¡ás “í–ÚˆS;Xò‹_ ÜBϧ#W„œ¢A¹z C§¤LR\.¥d ÌO ¬2ëáf’QzxWUq*ªÖ¼fÄ„骭ü^ÈÃ)ÄÉÌ6atÂoÁ2µñóHV׎ÆýAÑŒIÐdƒ*ÂMî©Z÷Çx’¿…HÖ’õ3&·CW;´×\e(@:Á8& ËãÓÁÙ¦>´çÑ£eguüE/ºWÄ Óç3¥0¨Á2¬„oZ«á‡}gZ[Ì®ª²X—&É$´ž#t¤ºY!âÆëý9@³Ù­ªmn¥Èá´¾Qa•*u¾ÄˆUÆãá{ùXGvDaR¾ú»2¼¼ÌO ÃFW§‘Áçt!3â87Ýå4E FpMÁ–^þ¼è¼W˨T*3½•ÿ³!ÍuÓÒKfÈ_õ†¶pWœ¯zåӮTŸ¾¤ÿÕ<0¸bªãÙO™öÍ… €Ó7v­_ï¢ÙPKñÁßàN&ó'ÇLÇÖséi/47êWªxˆ^`Ý{ß]ê«tñ#ñлUAÊ„*†ö……Â¥ÿô:!ó‰_a¦ìè!‚[£‚Ë$b®ZÝ ÊLŒ¾¡Ñ']þi¬¡6³M\|Añiqòµ7ô½ßå¶}Ä¥cªœ l{2ëGâîXZFDo³O«\ÛÓ {»±A6H?ÀßÒ™²èèÀ&q qw¡úF5ŽeÀS÷o™ªNÅDûººDëõ+Yõ ùšdq^† w œP–¾~ÈK)›l>sb3QF•x°/"ÏÕCQ Û¹`Ûô®“¨µ¹rÑÜB1º=Z⾓¨½7•ŀߜº>•Q/´<^®tWC5Wƒ× ¬ir&‰÷ŽÆV0š²¨%„¨8Ø’¢Ýo¾“ ÚSÁ°G’¤ªX‡D3$i˜ê¿n…•`¥Ï}öYÊé´>€S¸¦=vzR PbÜ«m*/Kò'x!&“W>‚Y˜÷‘w¡;Y·ÃJv§£5ò£í1º5®Vä¤ÜXÅ!q[€èù|B“[¾YÓ.¹¤ž“¤}¢°>EÚ»Œf—~ž›B¬Ý*$6}P¦r)Y¸3<Ø›:\™}"Všœ‰Òœ–¤·Û½é˜öëÖ~,\í£)k €4š 1ìW†`Ì>Ž‡Ñ ¼ž£BÃx°ÄÞ j#Ä+4bœ~®]Kµ.ô*B0dü*w&Ë—îx£ BŽ!;¶QºÒœŠ-8r£¦ }pŒn$Í{߉¤¯YÑœp|¡š JJ¶UXiL­ã𡥯B dS@Ý8¼Ö~ÅDTô‹›SÀQ&ªzòOˆåm… ›™+A¿„24î0€ëó˱åõÜÓ´}OHsÐÝ[íÜOƒ sþ™ t!ÔV6ácLyßÏgÆŒ7¦9‘䅵奻ŶÔÈRÙ'<ù´èu—û–ïb”‘‹Þó2\>TÛn rÕD•.Ôâæ¿ëÊ~’LŠI‡s艒ªôs­. Q²Stž?±;ãÚ•ìã÷˜³¿"6=xî^˾€&S„”B8CóÓ€T”<Œ¤óñÔd×÷븑¡†—°¢™ `7}pBÈ/—"p)±4° ^8à ¥õ°@üÜ9’b©aé´”@ Ù‚6ä_ÖÑEØiÓ`ÌçïCðà?ª¨7HuœÍ»œû—.Lÿ «ÉÂÊd¯ Yߢy¾LÂÃÅ"ìQ6îò›VqÃp«ÁŠÉ„.Ô[‹l€£çÁís [ÙV̆2nŒ%1ßn D)oÁ±ø÷*zJcJ'h—«N¸ÛeåßrKmâß,Ù¡!¦è Å5«¨$øÛ³MÔ™©ñ×É™ÎáåÎ¥$)Ž”cì(Þ¡—(”WS…Év‚¼OçAh7ež›eYç$÷B»*“[A‘@2^RÝå!i$¿ ºàÚà1P@œ[Ílå%] „sÌ>A‰N€®ÐŒ½é’´¶à¬^ä*ïGx1ç7¹XÕñ±y‹)182b3[ ×CˆGÿŠŒêÀ*F*jj ÃJñ‚b#«¬1Õ)ÀI uqE‰m‰SÁFÚè,å_P^šÈékÑuk8¡ÍÉ ˜8Ûú(5ÒYVêmšçX¡¯ác‘õ­“x ¢sñ;]`ê=™£ wóö95Þ‚,Óè|àÓ}è~…<@óžb†é>Gÿ§{TWª=’'7Iíð.èF7”˜½¾ò­3b2o±Üy+?©‰yð‰¤g4N¯'\ Cøâ¨DÁrRœNï¹$”SgR C•Òf¢²â.f×±A ½.l¯yª§Ñ¾‰É‹®‹ƒä¹ü0L3å•*‘˜Æ× yg3//;p·l£G|Ö\“Œ×yI,«‡5/³Á{Èp &íÚÆiÉ„ÿ¹íc˳Ú"V¨ÎšüuìÓw̧<ÜòŠŒ ‘¼ ÆNð@Tö[Âáå_û>ôë«AðdGRЇæáx[cðLÆ4h‹ŒMaã7F>ð7EçKx€öMÉ!ÿÊOª745Fò!«W2`Ž `:jó™P%›ÉŽý.üÜ—¿hÜMÃéÉðZ™a*:“Ü8€T <ž;þóÓW^¡h^ã’ZÅ£gÎ̃QTi¯SªJ±ðêSû/·¶ü9Ow`aóYwÛ+¥%OWoVÂ(¬&ÊY³tàرqfv¸D=V¹à Zþù–iágÕìù €…V£#¶kGÏ I_{g±´÷¿Êò^rõÏ<.À"½‘°~Íý©qóø“j €skù«Öï?-L›~²Þ±ù‘Ð¥Y×;¸èÉ+6€è_•  úå¶¢R9 ´\AÙïNwý÷î”;¤xQ‹Ü_)•„vê˽×meTâºÖú1ÎÄ!h¼Öæ›àò‚Ukèc/£[æ¿c¬‹ ªºlÏ7æõí)ÂE4!#/ë®, ÝcvþMÑù<÷wc¹_·0aY´öVûô¸Ÿ…=±ÁPÀµ¹B¨õja ‚•)xeLÊe% =¶Ëžàô‚mué²z$Ê!€C’ÆÊF˜˜Û…1iýØ‘åœU›$-À3v7¬JÀ©šR½n??⊺Ì\‘ì,+r‹ hÓð&cåÖžÇYèfôÅ[Ž›ò¤äeIÚ:9¾?\àqoa°4¶|\ÚÙÔÂÿšQ~[:eÉÒ1Nâȶc³»ƒw`y¼AœxÔ•!ÎWÒáÃ|¥³m3 î ”»ï*'–Là g¬Ý í.»Û¾¸ ΀½ck2—ùåòäç!‡¡×úº/žY«Xo-`]]ÀúUš¸qõÙ–VŠ{ Ûr˜\àþªLõ|¶ˆ×G ÊäY›LžŒ6\}EåÕ‘Ïeb,»tò³G‹Š#É‘€+…"§²øy#12Šo¥t1tJ}û€X¿{IQ9U~;ãuåÙC'Ð2G.ºæ¯¡¼T€{Ö¢)µ‹hláŽ0&Yï·­íæ¡xcyÀå«Uæ“u§}Sp…M­Ó]Fg†5F¹¼iÿ×¼7ÈLÅ¥Çó BOͧ¼MʽÇb~üÌVü}Ñù+|ÜKK˜xåûtk½K_!×K—Û±ÝÐëMßÅOD?î¹'Õ+UñCgjZøð’° Fu?„FÏu~,,ãö+_A!à o¬ÃMôbüŸ–’ÁöÀ=%&½ð„„$rfNoëlè®;³ýë6æ9 ȸ¾5ç?‘Êåvq„^éRŒN¦TABH”ÆL#nàpÿÔýÛH âBNB.¹V#·:ä›nËévf€6[zZd]­=PË!ûô{u±ªðÓÎîZe® ‰Ï^“¤\C ÈvÝtM÷”Y‰’Ô”)Æö@æ‚¶ù)Kµ}Ánta#œ$€vÖãóIưh4J °öM"B H6༎0Å:ÏŸßÒ‚eü¡wìOÜe€ŒÌ AžÚLjT¶‰àñÀp×ê¦oéô³ ¨Ÿ‰*jË¥˜÷†þž;ÙÍ‚àDÅF LÙ¤½ÏéŒN1oBHª:ø4Š(`fyw9޹mû°WmåË´«Â!°ã¯îÜ®¥ØÔù…6Ôáÿ®uEꉆãÄÙ‚Ê"^;¹U)bGåzˆ¯5°yà‘"ËVΩ+bÜœ;M3¼#p¤t/g=nk‰M^Âïÿ+óó´“ÑœÕL·¨"Äɺ ¬*O C5 ¾Ññ:5ËåÓyë}Øcaw+$Ø~±jEòodD©±z¼×°’°‰,¬òŸJÖ¡R&9†·BAÇv½:e4>áÑœì熂¨ÚôÌ«Úap%K/<B7àŠçÄi…#ŒN1¤îN2ƒxB@¸DÄD H,ÑÈ­ebFN{ŠéVŸ¤9I·“MÓD踫 oŠ”m­Þ TëJT"w#!Ø1=5yüÀR ñ]Ú?LÖŠ N2üoM ¹9² ¨Ô]vKˆ^lǃ!rÚÿuÑ÷±P4&x‡>pÆØHò%©·5¡Ó’s”¨VÄ~{îŠÝǘ‡óZ“JŽúãšûÔàÿ°„Õ£*Nä=Qšm"ïI“TIœ|<¯Q$è2‹}#xY¯k¬˜RA¤‹Ä‹¶¨§WA|úgEçÝ€ùL½M­ÿPá»§¶0¨V,ÇVtWs‰s•Ȥ9ó'Çxç#2=IDó2NìE”Üeš×ÔÔèÜT£L´xj EÜÐ…¡qoæ)bÚN >`”O4&‹Eõ«ìN–ñÏ0ŽÅL@ð·0îzÛÓ—us¬¶åÏu‚PiA.Ù<àUcdîZÌ0ë#Zðýj|4ÓÚž@—ÃLÉ艶ãùëyhªjáôÿe:ë“ÏGá†tyü-9»þ²Uƒ†{- Ð&Ç»3˜ fy¹EËšWUúv*OyòþøÆ=·ô·(¾g :¡èf?{ð¨¬vÕÅ1Ãe j?_s?`Ø §Ç~L]†ž寢W‹Ø'lòøÝíO*œ”릋¯[x.Rß“oO¤±¿#£Íúu‚NG“Ô*LèvF Ó˸ÏâNCüAÁÄé~Èå˜.ÿéôÄäCàÿ’oºÖÍUøþ¿ã…;å4aªL9‘Põyjù¥0Ü;ú5_M‘Ò¢H©´øáG¨z#ò¨9p¢^òUeÀLoúŒ-z ¨ÔRŒ»pŒÖ{ÝÒf²w¡‹:¤#6ÁÈ (x!`„°P+Ÿ¦•¨ù©@Îz¹8«¸ôÚºrÞ0€ÓßÇ[AþñD±Ú¡8ßËÕÉãÆ·[Ÿ–ŒHý‘Mjr{‰lz¡¶¹óÎÿ”è|â7Ý)PîÍE¹Å¡%Ï7W¶á‹¯•I5²‘”¼t2[Õ T6uê J$¿»j‚™ÜLvÊÊÖ‘Ž.îg=8X…RYäoιâWH=v­û8½Å!dãLp[6TK èÌÀ]8L÷½Üçy¦± ïíóÔþ)EYÁ®²Ó”)H‘ê9¡¿åžÏ'>NèÚZŒ¼YUýÃx–EœÀÙ—vTDpÈóØ-`¢,=蟟–F·è©-R“ÿ7*€NôÐún*™x;Ú-†»\WÍ-’Ȫæ1ðÐŒQˆNŽK,bÁÕw©½%ê›ãÆÇ…Ò=3œTºsÆsÚe¼†ÈÃåµv&7J¢½Hr–ç˜`ãûnn¦ñìÛI¡ÑJϾXU©\åžà; ZœƒÎØè¬š$ДIÚ6zQ æp…wâoRo„¤[‰ýahýtÓ+ó("acžÚª`U8òž##þœÂÝê$ýZ6qÉ»ùZ@Õùl>kMÆóJ ÆÎ–­­Ý  ШA”šÂ^`+ØR¯Ç×MZ7‘“â)—Ô6^¸ßGŸgDiŠõ<Òá“nÝúß*º^À¬*aŪXDìSÔøfØÑ7I«MJPËEТ1›j+]åŸ)D%A•"¶+ ÒlA8÷{„¬Ñ9QJDYº´« ó±SLv#JŽ<ŽÕVr»Ä”&Ã%Œ¹5ï Îíx³ÇcÎDãÁ“[fTÂ0©Ç `g"EÉŸ@(Id~e0ÙµPe$SUš$]&ºƒ­oP¢ÀÄÀ¯¸/IļÀËò½pÒÌJðêÀð`“ˆúp¬ÊDO8\¦÷"»ø7È‘ž#b|ôIËÔú€Ûèf±š ÞëY6F M†$9%È$)äv׋ ¼@¹4Äö—B·¼²v}¹¼>Qq9ÿ´è|\¹pf%þ ý8Ò~늒µäeˆ¤°T½Píò bgyá´b/,íÀ¥FÊ@l´xtpZ»AE#6KJÂÙáw‹¼@uk[)À?éá,{ ç“áù¤NóTé}>S‡Hzö«Jy €Šò¿ž€EÛÔ*-Ì)±¶` úéN…ÕMSûÛnÓÜÐgÝ‘1¼µ(’¼å…jx€us,o•Nãäg4 (ÐÉF{ßèD©ðÎÇ&’Mía½žTBÑÈ©"’È-Û 7sZ²›’3*+3.µ½ˆðxøø‚Ç€º㜩{^¤bæÚ¬ô#¨(œa”~bÏgƇ¦ØÛÒ†VOŸ¨ñ$âVZª#V;Ì‚VÔ\Æ]¸ó™Â/HÀl‚Ú)Çà¢KÙÈ•Ï3‘?­gJ©ÜòWN|&‹y¯ sÔ7œEIܤPtÀö^ºõgÞŒ¢7ŒTh>Ÿpfv÷%DØ“»_œð9 €J‚S© ð/+ŸèÌr¨äA9Ì!ªÝK!B6Á²ÃPág–Âåµ4g¾hÓ†£.A5_G € Ò2â¢ɲK)””d’ö¨¶Ÿ¼ZÕ®Àaðc±ÂcÙ<±¾Ð…TTèÚaO›2j7\몑kCPƒïèAm °rþ˜Çô_Ì­t¡ËvÀ`üUZä…¯Ÿcþ <‡sñÐ,yõc¡õûó;6–rUdõþœÕhX•yýÀ¥|íUwçœmó¹ðj(Õ¿Bîÿ¦Ì^kÂØøã.†åÕ Ñ-ªA×ä|Îus8(™žs¦yüØ&¢&c]¿U×^ÝÓîø³Ìøç`¥TšQ¤™f²ª³ÃiPŽ7éåÜå2? #-‹ô¡×ÁN½û«¯£S(=Ä ¿ÆíS®ÞµÚw÷m®SÿË×ü|~Ä –J‹NhïW@hбàB/¶EP_øÓß}U E7}“¶kx@w% ,lÆ•¡ÏÕ·8Š^^´¼å¼Fìyõ`£ 5U<2¯îF¨Jt~5â}ÁG»§º²)a#Ëä>g]Ý*[¡¹?¶§±¶ôc?ÕQt2¥D×·ÁÿÆ(ñص "¡ˆ ”ìak4ï:6°‹!±°¥ õ%(Ä+ÅiKê1Ñ:¤èi›O9 '¶ˆ‚QëÖ ÑÁ©¡vi5æ9t‚fO±ët¦^_k4›Àÿ‘HŽ`؈è«Ì"Oã`ݰ2Ÿ¢&Ùc¤|ã={O^b¶ÜwŽè2ª;Ò-*<ŸÏöBïN½¹bÇ\*/Pò¥6º ÿ¬FÉB&¨²ýnçLt®!*X«2 ûèþ>”ä ]“‹ï»ú-‰£â›³á Vþ•çô‘i;­«hü“@°ÞÁD¬ÃcvQ®‰Â“¼g7‡´óÅ‘†høÜ†QúÜ…ZLG#ߌÿòoVÈCÒnáɉ ÃÁ®Ì jà¶;^Âs;»4ŒC“‡€>¯Ío§f* –ˆ-x ÈjÉRtµ>Í`¯õ°£[Pz b1C’µtÊŒ©Ã;¤Á¡Ðò9ô£&IŽÑ¦ð¢ N@JV59MIƦ,†|ùˆ½O<ôžuƒ¼Àè#ÒNßö¼kw(ºÏ˜›oÜÛñ;æÓã qÝÀÓ˜Tb&#‘ŠU"}aÂ3MÝÀB=@;ôO+äÊ·@Â#Ìî,\šGœKTIÍF4vÓbu"©“|mSH£ Ì!È¢P8xUX%ˆ)ƒ¼h†gWÛÏ£Eã¡ W_‰¾ìµˆR*\¹¹ø=µkÿ¬[éÝ3E³Ý½SµÃšàÞ8·f߃ñ3㕚›œœQ‘dÙ•þú4Çñ”B5m„äÞAHœ‰6Q"º¥oÓîJwr£¬ó3~œ’pEUdÂ"î¿Ê%Þ¡“B—ò.\=Vœßv#Kõr2AÄtÛÓ@!xôÂ¥e=Cmm‹j›Ï®¼$™Kuå ›µ'±B %Ü¢„”K•*KÊÌöäiÏkHg%Š{­nä–)bI~P³5æ3¡r5‹¶_dMÉ5i°Jáš'’‡8ÁÅ}vÿÈpR†ßÜî;1s(GHç‹¶&áDžÅ/¶F›õ¡öÚË2KH<Ï¡9 _Aˆ…ñ×YtÇÄ#’3·¬¼wç+ º’1‚—ƒc]-Ø"o#ƒp]9¬êÍ=èºQåͶXÞ%RãL_T‘z )°i©n>¤^¹ðyY¢î¶âNerì…Ý导Xª¾y~?SlFDPÆ[a¡ÎY£@bô–ŽÍ±™À'Ï€ sþäø <3EùFï¡9|UšàûºÒœ‘6ÿ , ¬3æ’úwöôEC2*Ã\á…äÚ¨Ðo¡V”(ˆvÇÙñ˜p~Ä…]ÙIØÕ ¡‹’MHèÌÜ+ 5¦{¥—m…k~E-€‚9ÀÞÃSšy5e6–?3 •ÒªÜhuפèäx¤!3Á¥÷£h:ÕDц yÂ97;WÛ«à´QŠ•°†iŠ‚G…Lgoý/ˆÎ/ÍÏPÂÚ­&IßWôúù.Á÷õ}]‘ßñÃkˆQß×÷õú×'êÇãá^䯢à÷åœWI0z>Ÿã ý÷= ø=Hß×ñ×óIOD|>ŸÏçs3Sß×÷õ}}_žkº@èòGúê2_KÙ´=ÌñOƒe\ò žkÿí+ÅyiB£õ €|_çý£œ ­òŠi–$• t± —Åuoý¢c”÷c±ÖùCütyÛN­¯´Ìú_üæÈ™º×¾¯w÷ôI¶å­)|9‡(4¹ø4Á$á­ƒœÎ¤ªô­“®ÏûE—jrˆgç–—£ɧé‚lt›3%ºÀ@¤3Q?VÄ`ö“«ÚåNsm«™¾_—o¡öIH$q'HÉŽ“ŽÏž™é´cK‰KUèš?§n Õ!w1™Àךëtl R«!LŸÚAd”3Äù§RÀ@ÔRŒR‰Â1¥ŒEÒ©€’Ç?47Ì”2Èš«:\–h¬H%â1Vkû¢À¢dÙaVlE{íW]|(Ž:*ŽÒ˜ýýÐ4ÁÅʧ‰rÖ`ý2™!„bœª9"–àúâ2™†8:ùÐþPˆæ ¡C0æ>‹^h-ÌXJžuÎZîï­ˆç2+ÔªUØðûm¸êŽ~ò<ÏX¿µ[C»]“ÝÏbÁÕÃ..‚gFò˜$ÁQÖE¨±Dté€NrQ܈Bˆ y.˜ÙäR¯q(: çÄE„1—cu­¹ðvhf!ÕÌ]â©=;mµëã¸ÃMW#="•)"pó6Y{ R+dãîW¤:nàÂTu྾Ÿ–ÿ¢Š<šÉã@©Òa†žÙ]Žp(q9¿R’¾BYGàòrð*`DŒã4:Ò9첄Fß¿&:_˜êdµ­6D’Pm°Š£î@%žhõ0Ç[dÎMÇ]©^Yˆwn@¤Ù‰¬qâgy5ä {ƒ0KÕ• ýùy6hrŽ©'àCGº,Z‰F¼W\ð1Ï>ú4×dYo‡œ)™°¢Û£»f¼°22Í$õ©Ýè!Ö š wÜ•±{{`Ygþ†@yÏ^Oøßí×Ãá[â6Ig%µú²³7Ïq.‰Ã@9>á’¢gmíXÄ,*Fb›x§£Y.d[vUa<ÃFDÎfåÔØ ‰@|;Y·pü_›†Ó¿¶ ÙºmJ¶ S&aïÊØ„BÄèƒ>Å,˦ÒrKÎã³ó¢œUD;t §=¦—÷ØEˆ?ºeoÖ ‡FiYH¸Ñϼ¹ð?³nÝ—žC©}Ùfw‹Ø©w‚ ÒpGD¨ˆÚ¯]ÂPÁõF—’䓵T‚êùí¢ósPwõ˜eÑ„FÍÿÊmq2Úôjœ°ášrú§½þ$€Þó­„ð'NõúåÖ'”Þ;¼ýù¤ÇãuOy¿§ìïõo¼fÍ’è¥ÅÿËÐ\Õ«ý{½á™|¨¡k±$1埑9? øöUªz­­@ÏÞ×ð÷ºÛ|"âãñPÝ»Ïç©ôj±ÁàäLEö'è"þEkkOöÏÿ~ÒÞý†þ{÷Øgnð9wk‚·ÿž©C¬à©$€6²ûèC:Z*â½Þ¿Ò?´æöÿüØõGrŸQŠz„jd…2üá(ÇñúÒû36$ªv—ŒxeÛZÔ¾ä"tFÓ$!VÆK:üÔwµ“nM†"M|˜´Ò.©MwÚ Ñ¦É7çj<ã–ÙE{jÜ™ÕIy|@O+Q÷•"Éip[zëë ðÇèi-Tóä‚“£¸§ yçõ‹³ntn©ßã³X>lÏÝwÅÐn¿deëö“>Mj ]e$Ubæ êÍkxs äw”ÛÃ¥Ó-Ãb^O”u¹ ÒçF ]ˆ­µBTr _‘zj™ÅªÛÂ&AðCÛ !z%|W3p…p"ÕÏòhj{öù@ ‘¥Ñ©ñ¤Î–³U%3Ðõx„`BH@éL‰r3;I#×)²KÖé›Þâ¿ý»ÙòªÃ7L÷7d¯§aíR8zå(Z’"—#“œà –€´T­;ïŽãÙà àËGàϤtNM“Jl0Õô3Êp‘"g­žiÄ@5b:Ê)¦J:ÙPÀ’MLvæÐ`›—_á,-²ÿðEð`"E²´`ãþQ?K‘Ãðåtëã( _1õÆušÆ®chòÇ…៺’€É‹öÃÙ ̽ÕV(3w¦DO%)5UFŽÆfÀ›È«”jöí1Ï›‘w÷|YUN.¦UatèÐqíhW(w$·„“_(ùÂXZ”?$Ë Ÿ2ù’ZÅ]ƒ$#šr­rIyq¹5]‡FŒ¥‚^¼‚Ò.¸›'ºÂΧUìÙl{p5œþà-ðú(úÞ7$”wAÍ(íDøõ¢óµiR¬sÚ•@ÐFý ‡ŒrpŸc×Èc®cÓ(oDj$;zȤ˜=Kb<’elH}(b’¿3KËIÄœ€(-%Þ(!xú}š#'µ•e@Eé@φ¦G]zžù-lúGÐ$‹ß9ê3’ÚáÎéjyì6O…lMe‹HÍÒ²QŒãc¦bråÃ"a´ø:§B°[OÕOx Kì6œ A8—GJÝj 0Å“÷臿’=ç8A´§q •€^IFº$}b’*)Èè iFg2úmˆkyù§{šåJTÅQ/+@%DT2 IVâZ{×–îîú¾˜6*XÁ¤(·„ªnQ˜¢MøJŸ€ž#ü†C³V_ó±UY)E?Ü® ÕÁ%0 $ãÝZ¸”Ô÷Ï1ËéüãùHDAÆ(u‘Þ~~Žýoš<%‹f ËÓmiˆõhœÖ”JLé• * &³=$ö)¦³¬ÒI £DQ 6åHRA7èKe?¤h˜Ma?×ãA2{=GVX °jÁO6¨†âKmŒCo™”Ý:) › Ä¡XÒñL´˜²z4MÉòm»€Ø! ëHí÷ÍÜ/ stXÈ“º *£&A¡úRETfP$òÈSq¯Uô¾V+ɧu®¥Ï%¹ùE’…fPeöLe¹^‰±çDYß'¶¸š&¹2EÓØ /%®д«4h¡À¿~Ê©‡nVš&td¦ªèòmšVòR-wvW¤*ÃÞ\Êx`m›Ù€‡ÜåÚU7­\j’æóay%ˤ‘Š&Z€Öl®N ©yÝùžy2õ·é-¡˜ ì%¿WiÇú¾HΫ< -J»¤˜ ¬áïÙù¢™î4‹½v¿žö¹Yd݃x9—Eq ºòŸ&ƒ4bÇFíªcÓ$Ø$e Ò¾:££69ý挽Î:ŽjÎNÔêx¶z-6²ðáR{'Hnjså¶åšîCE‰nà›©Ë­¨®S©/IQ‘!6äL,ÐúЬµ½2„ÞŸ]é’ ²³Á/ñrý–‚PQ¥ZRs *’Û“ðÚØï²ÿí©H`AÔ÷:¾Ççç>4ŸIsÄ‚äÎØ|Ý[éÝâð|U ü¨ÝÊyï¥gë?-{¬ŽÞö*L ©§ò¸ûûkµô(¨ŽØªHNEº¸Ÿ?)ÀGã'úcf®ì¾|áÅ‹'rbëboÙÊŸ;záæ¥¾·YîòÆ6(‚YKoríìË'ef'~µÑ­Gç5q…# ÿ¥$Ÿ™Ç¨ÆK¾=ÄV¨t­9l~¢‹¿õ˜ç8þ> Åæ"àü…ø§*㤚Êg-¯ÒòD—*`Êæù®ÒC[¾#}3¼Ì¤ÌïÙ–¿æœ6Ázx»¤…CâýÑKj Bøí—QŸ-¢d÷õ¤çðß×dµ6¡ËÙÊÛF7¦€>ahÄU(N᜚)i5+>Ö …€(Z̼ï|#˜ÉÙ9Q@+v‡,‹2¿Â5ŒÈq _^D™wƒqY€JõÕä I)BjxÑU9š8žôór´Ií\‡QðÊ›ZÂSŒ¡tª„œÝV‰Èi 6´RGJ±Îíˆd<à‹¢‰zR½t: tZr€?wo1‘/µÔ“ÐYI’›+Y*_A‹K‰žßMÉ“ MÔí¿•É:_nºDu'ˆ]Ûj7èÇídË™°¬È‚WR‚쩘ʵ‡+‰\YßÉä{ÜCë6#ß- Gêµo!ï ’th(4“1Mg/Õ*Z‚ª% 4äkõº%Êëû*Zz[È à@¶·é~oê4ÇŽ6µi¦ÏUuV¿]"7J÷ÆÊX8»¾üAÍTŠÙí…Å îîÃÑëd÷¤¥—î&½ î²¾f–¬ÚŠ"‰¡8‰µÚ,Ÿ\ EAÅW7=da7ô5t° ©ƒ¸†Ïãt Ö&†@ ѳ}-Ìu°™N¯‰ 0mKE¹­½&#â¼…·,i”Û>åí§Ü½îDÄ)úÉâ8nغ˜` IŸbÈ{ %tý˜Æ·À… ¦ »Ñ°ùŠÎ×m¾‹ûqË~‹I<Õ}Y¢DÆçqiž.žc}ÚUm[Šk ÝþY˲»ù·ÊBjCÃ`¼Ò—š˜;Eâ’ö®¹_œžˆÖùEî“§$„lNå|i7œèPž9çYyeí°ûÉ釧7dˆ½ ½›-G¨aÄFñmÎ)å:|¹ ñ¶ƒPÒ1Ž]uʧü裵öÌ— zîš5Ù¶FQ@D¾–×~|ÐörЇí&~åžW›Ö 1ã(Òq‰4Yî ÿj¡b¦ºÐ~±?:²gí@U&£ u. X걸fVuxrO§ bÜ/MT&›È-¹%¹b“C-@j®5)ˆyú³V..däP“§ºìø±ãí„+&ÍlÁ#Áá‰ph\à£5„\ä…†íèDι g®$‚Š”nÛtñÇ%‰mÔ‰èt¦£h°g6ߣB§ë•_LÕu;í±:g[‰Ý1Ö³§¿3Ìv W­GÛh5c5‡ù Ø"“*Z‹ª±stÁ•ä>æ¡90ŽIê_nD]-֡JåE2ÒI”cm‚À½’’¹ &B6ø¼Œçó ">š³keûž½G ÕP¡ÇÕˆüF¡w·Úk2% ¬¡~7OVõ–@Œí#ö@@ µ%Îòx Òñ‰Íº4ÓÝ5€Ž(‚ø•$m'›5ŸC\’/àP~l8]Ž ïqf—×gëúùjðIšsX³¶ùQcM£w6ÿ7Uwì­¢ŒËÔ¯<¨•e¯µíTP‘ ¶o,Sy³Œì¥“{ÃR_•šÛÆl¿ðÿ7—;…¶# ÜštpÑAMÿø ‘‡Úõ¶•–8Q%H´¢êux?cÚkªÒŒ/ª²ÕßvàÖ㳫~6ÐAR®—Öîf°ÈyÒÛ‹F²dçS“Û÷ÌË´SÞ-H÷Ä­,=øîW‘àUú–YG ÉhLs€¨Ý×CŒIïÊÓG àùDDx<@E³Û7ÛæW  ø‰jX‹‰ùTXpɈ1WÓñX”Z;´cN7´©T2†W¬rÀa wC¢žîü[ÑÉ ÷¼ÈM'ÃlÞO`ð Àó´ÆNfSŠ þ ÑMwºG‚6„ȯ´‚ž[Ïÿ“±‡cýXà§ ¿_0áúF²LCÝ^0j7@·Ù.çÞ €7™*õGg@ïýÇ7š‹¨àÂyý‘~§Œ·‹ŠÒº¯¼ª÷ú³Â™@=%W÷?&bÐ’Í”ßyx¾Ù®jÈýñ†-j5©¶7*}ZQý.€1Q3tà½7N[A”|NØfà*Y¹Ž2œÇ)h*ñÖA­ yúî€òà+T ~Š×,¦§€`Ó‡y£fFK„ëÈÂï¯tßgÆ£Eu*#Ä3¢~«­èjtÉdŠZq$º£23JMš´¬C‘’‰‹D ê!§†òEœµz¡_ܪ\Ró4Rþä ðœ1—ˆÐ Iý8¹µ2`U®Íå%¶`Êæ¶Õ”X›&XZB"c‰!ÜŠ‹…d0*Ú-{+ÏÌ·C«áWùs7ôØAéðp] ©˜ÙåGˆc*'d(M0ÿÂE™3Äl’<Ë&%«÷ñÀ®¤ì$?°Šn$íp£O’^êLUÅd×LÇ´Bo«¡p ë­n«a·¥ðV\â¦+H£¶·óºxãh¢jÐ# . jÛg”N‘=¹"&ôAµ€¤»Œõô«ýþŽX‹§iƒªFü$Rß,„楩t±Nk9ùCìš Ú4?‰ðá„tZKN›Sæw¢§Œ€ÏÌíº:lëŽÒã8ÝýNŽ'/”DÖA€P›yîjûðƒ¾×\hÃÉF5š6HZ=w˜®°g¿×Do©u ÈË\¹ 2ò8zÐtNðâ9 ™ÄÃÆ" å&’wK²ëfh&¨!ÀnÀl¯*Ñ(0$ØYö£$×ðìá>þO9ÓöN=]ÉzÏÈ›ôú»+6h›­ˆß½Ð¢U•´ªDƒ!èÝÞ‹cý(ý†¨[SŠßwÒé}©Ôs1é‘ @ò難%¿~œFGXLÿTªÓ€Ëuù‰·Hë¶âù®&LÇû2Îåã5!LìMÞ[ ˆ¢‘2Bãßø.êAà PM&Ó&%–C¹`J~îŠqUô7.5cÁtS,ÛÉ=m@riYz%Uy5aSsf¢nÞÞ q°a ˜Ï‡uî¾Ê?»\˜ æPQ¬ *È #qqLcsj‹“>4lm]Äû œiOv†JªUSë2'a á‘AíKMN걺…«»•FVžéåX̤(íe²Üh@0ÖØˆ½Korý]7ï àXÖ®¬‡zWÐÐêìÝ%È0Žîe{ß2š%vCg*{Rò±SmÃÛ°!ÎrÌ”UmãkuÛ»Àæø›g5-{±J,h=Å‘ôˆkãÈ')Ü”%vn¯ðñã'‡;ÄÇ1¤IôG½Ì_,:ß²M¨È» ¸`àŽŒÖ‚‘ÞîuŸ³á ähCiy4ö¿ü$ u¬â¾›•”žËÖ Š¯>*lÉ>o0’Ü5úÕþ&£!² ?æ®TAp­Áy9þrì¯=a`û* ”ǸX’”gÕür$X̸2…½‡ ˜0®Ì¨ÆÐÉn€fȽ3I;ÃÇKà7±úCŒÛ…=ˆ`„;y‚.£;›4a®ÌQ’bÔ!œ;)€›}»Md6«ãÏrƒ“R.N-•–ÚG,pœm¤4 Y´Zfˆ¤÷('¥Ô²£k©bàiÄÙÏÑÇJô(Hà`LàÙš=a—" 7-<‚52‡ó(Ïæ\Zvá§X—2†›º/±j²³¨ñ0e"–†kÍ}0KbÕ ¼.1ÊS51) ±¬l¹Ù:b؃° )ª®—ÆŸÞ^ xsQ¥Ž›Ž÷-•BUþCÿe'~¼dMw‘6nÅŽp÷ò§?bþõ²áû%“óao [î{éî°Œ[¸ÒAX™HH‹€-øéŸ•*üÀ³¶8ˆ>F›ž¾å¨ÜïñbW>6Zý‹ºûã«g&¸ü¬|<Ôˆ¡µ‘ÃäñŽC9xuŸ»ƒ?0D&1¶÷”œ£¼¡ÿGå¥[çv žKqög)ïIå?^êíÃO@¨þÇË‹‚ééÍ K9 é§w«OsÁvߥÊad£:£×ǧÉgŨÏÿGDç£åÅà&ZßB#`#°® ‹ÞÈþG»ÓY#DªF† q«}y={U¶ñøµ/0Ì6wf…Ê.üÑði>™3’žA.L ¢NαNÒMǤØüâF—¼ ] ‰¿[ê‰ò¸[6\K´»PlEl¬fJ“A¿]m*MÇ©MoÓ’ Â’6kòÁ›)!0}çžÛë0­V›D¯×yr3ÿ™òHx„\Õ-ÒM7žsLÅíŸÀQN#MƒnF„\rÜ܇sam92ñ½aLœ2Z`sÈšÍjEy¡%Än0m×,r𪶨Q?ZV¢V ]Aƒ´OͱùAd„ƒI_t@3gǨ°ò"}‘X“Wç“öd%»,M|eY/›*ÚcpŠ$‘ DÄùÎÚð›ŽP4ìlDÃóÍÔÖíJÕq‘tÔÃË)‡}††¨MŒÇœfP§#Œ±ž$™p2ÉéIX™ö˜cÑ/¼¶É@qè¸ÚØHD…C‚ÃMj‡‹ÿ ƒN|›ª}‚c¢ÑòÊ2´¦aH`ÜÀÆz† §®MLÖg{Ú•¥;Õ¼\A†åîÛ·Šý<㨰 YÔ² "ÝzͨNò…|2ÌŒjß( u=%N iú0”$‚;Ö3ÜObȵ€â¬2I9 ÃU—ÌLVΪNqO­Å‰Q®¤ÈˆbF_°o ÌI”B‘$9—̲i«×L®¦Ãb&i îÃ!þ‹Ùx\…Q„vþsìºtL÷¿I»6·CÕ±üÃ-gÉ?›ˆX7¹ngœå[_!‘äÑEÃ%U+òvÎ{/zÐ!Ö‘šGC &–›¿*™DfЗԹ-ŠäÑ„ð©»ÎœßÀå„L Ë}ЃÖÉ€ *¦Ï¥2s%ž\ ‘Ì nƒÅ]nº 1¯lTÛWM‘"óBgdAžµ¨º”kI‹Ÿ9WÁÏl>=÷”zn€ic™òÚL§NçBAÈ!8uƒ»ØÁß\$å`\Eñ5™ìê¨àJæ5š¶üª¢<ÚסHÓˆçÔ®O!žs:¸9 @É>`ÔbtÃ](B@{vp;Ê)x誷ӘW¨þ@ÿÑùÄ’ÚïØ1ù“Ô¯óûµ£Š0|&Wôdý†Rω•ŽŽ¥œ±ÊXr£ç&•­z$ë1ã‹7*"6ä#5…›OZòñµmì¬!KŠŒi7·1ÎÉ¥ÈhEZ•ð°ùäý9¢†œ¦+`}?Û艮 ÉT‚æ‰,ÅhÖÒž¯Gk2·™Lb¥Ê(ü 8ج´«‘;LâǦÁ‡úGmg“3H‰¡A·×{©'t‰l±GÕE z í©ŽNi¶ú‰#ßI©FË ”P–'©U…Œ¦[¢¯Ÿa,'ŽL÷v=YÅ0F¢,Q£b{øÚrºÌ·VatØ™V² PÈTt¼°rvÀM µËM H[ðP©\û,O¾ ÷L(ö“<¤N À8.’ÀWšWïºcER¾§ ‹…xaªã¤Ô…GCkM³š!…}(œz©èz£n¨W 7J/7AJÁþC=Ôáre³äJõ‰5#~oJâd »™U’/ý›_ä@ M0˜,Ï™Ê:” V‘ÁÕÛ߈˜9¸¯#å²Qæœ\òtCZäc?¹”¸ž¡·WÐ"±QŠÇ©ø{9Ü THêFƒ¡ÛѯO.ìÆâ1SåS dîáOjIÿdž^4I¯ði×À:ò%7Éþ%÷ñQ.°æEÀ$ìŠàó†}œºì@5‹f±hV7²6ÌŠ¥èC ’/9ëiU`Õ&lñÒ/žÕÅL‚ÌÅßD¥Ï µ’@”£(Ís-ÀÅcîLÏpßÔYgʶEP=§½D©ç¢`Ô¢æ· $Áp©½}ëokù×g½¨Ï‘&2£ÞÌqóÜ L> Á{3˜„L%$m,ˆü1õIDdQG„ÈÎCF´ò¹ÿ²è|~ñ{¨÷4óPå÷3Õ>ýìÛì$|ÝÉá{»"|{÷ëëâõÿm“z=àAzÒ¶ e“ý#“æ¯'À—~ÿù|ŸÇ8¤¿ ¹þ½þ^‹!óã,úПi1À¡œñ|"\žÏg—lþ{Ás˜ûW–äù|fýq¿~Ô©@|4/õ¿ÿýoûlõB÷ß~xmÌøx<èq<2¢ch:p  ãÞˆ? y_ìŸ)¨Y «£ýßÿ©‡K¦ ÷ïõ¢ä ŽæBxm¿ìßëïõÙç caÆùƒtþ^/'Z ó{ŠÀOÖ¿,:ÿÒ@k)aïs:íÞ7^ç#ÌŠIIƒDÑÅÚ29©ìvÂþz0¥ñk}ÿˆ!$Ç‘UÒN5ñ9ÿþ‹fnñøHêÒ:ÛÆ"ÊÄ©©>a5@CíMC;1.`ø¹ø6àîD`ƒn±ß‘{v oq#QÆñr²m«‡…rRj>ý|c€TìÁdWàl›;€±XI®¶P0;K™á©zïâñuinQ¯Á£#õ¤Þçëù\B®vÅv¬=w7åèæäñéKV0/^!IjZM›B[É@Íà2>éÊø¾Lkõ€±~ŒXf%hÎ ŒN';i1F:QF~‡;b&õƒž¥Ö€K7õas%7eí—¹“V³Öm{„fà)&aw뢒ª6ö–éu@ÑÓÃÅ/ÌѲËAŒ$[VÕ¾qûGêۊØ“«B+E>öìÎà-ÈOÃÙ´Év0… h†bß“âsêw]ü•dF_t´ƒiXàórŒvQ´·°¯L“u·-ä&¾X/تúG¼ÐL„!ýBjQ¦þtíRaH•EäŽçrÈùY=";ÁµÞ%ªJ絨 梠\ÞçAAÕ±•«Ì QVpçl¦QV²ÙÔÔúy{¸?¾¬ŒWkzU bØ_7aê<.½éYøa›¤×_„ iÅF:¿Ë㓞ØwigG1  ¶¶M”CÄšªÏqH‰ `Õ~Sé]µyŒjzYÈRBøô©ëןoyü`É'[q‚•³£¿aÞ|ŠóÖþâÖ ŒÌ Á¢»bËfm¯£ i¿Ô°¨§£I$'Bƒ|‰ã¿K؇x1ùý½©«kÏq)æIy;¼ŒkàIÁM×lŠÐMƹFΊs † -Á5‹P°.1©[ªž\ò¨'5À“(Øÿªè|bÁ:—kC(N9óˆ§÷¸•ÔA6`ªÛ#/DÎVáêM Š–ÎQŒÜ1ÓÛ¡½<)<5¶åWâ®´œ4»Ùçó©@—†¬Ÿ®òÌbO 9>HÎtµ€¨Í¤¿,ï^ ‘l>k²Ca±«Q$^€RºBšÄÄ XÇ$ÉÕ’in ÐBQʼ³MO]CÕnžP‹È{ìî"Aôlž| ‘;’ýîw«iüÌÂóIˆOîÂ¥†ž‹ '»ÂϬæ5úÑ 2ìN-4ÚpÙ¨2‹–úÏÂQQgψ’ª{+»Ê£Ñ¾õç•Ø|Fb”(tñ¦Å€~©y¦a\ÉÛ)ÐSÏÉ@ÔúLfT‰6g¨«#ˆàX>eÒÝ8cáàƒ 8ͱ•9ulg¤Ä…[fVåfé+¶à]±Ó&ÓÉ,EO`T¨D ˆn‘°©Açž$§Ý.пQÕ ¨øa”°`lÉöi.×ãÊ¢¹2”‰O‚vï‰ë(K"SNñ‚d!HÙ¡1ÁbÏÑ« ô¦˜2å?„"ü‹IhŽÐÍ:b›™‚êš°²\ ´Gí6&fŠàLG°ÏÚ=v/ ì^· 06cÚ›â&"ñß¼^Á-P)hl˜¤M²2 ƒ-…&d"x½ŠL±†˜Ñj@½Þ”q•*Ô$ädh¦@z»‘åh*­FU»-ƒ¼º,\‰m«c"xëxXÏçÙŽ»åöáuœ;-Ãj‚[ÕÄ.«Ä˜8_«Ló‰#J¬¿Zàà ñ­€ èD?~\Í&)™ÚGPˆ‰‚`'¾ˆ.rE‡u™§aòRûÕVœk1É# ÒH*ª{–|zŠ͵òÉ ck¨¡us£hOzg‘"9¯RÝ@ý- lÿýøpy¬E-Ë_¢uˆ¦r.Šºä¶³\·6ј8léÌ9‰‡9eô`>ê#= hCFžÕÒJufÇ¿R<àö°0m\B«PP!c ozˆ4tL›#FôRœ¡·NA¦œd|KUßF ¤”茤Ì"¸Â8©¡_*:¿qüÝúÿ™ oUÃP4|*~q6Á€,j|wèõl«¯­ku„G_˜z;†..:}Çìë]]m„‘í,#,Ùö¥U¿ÐêrÿKÁ/yñ|`[mix\zÊ:` eþØë7ãíÎ6üìvjT×cýÑcoàî.ư[‡ihcÅzƒ‚ÞËÄ ÄrŸ?½‰}ëÆG+ý áŽãR»žÌúrŽ”¶úé¥c²Îà$Jѯ; ÜØÖ×ÃåAÄ>é‰O^Tˆ¦¢ýIv¯Æ—ÚŒ|£1 è5`¨Aj½¦ ôÿ÷º;ô¥ïÚ“ÿf÷wüæ¯û '@ò†{ŒºF^»øªWäÏâ~_ü<þøžÏ›§›nÅ4ôgªùZÿ´èüGm¿ÊßòJ>ÍjÄ›U#— Ù$´û‡ê‡(ÐöŽƒÖhÝ`µÐÚ²€ gó6ˆ§ºïWÖìõPÌCL”oÁ!f•+©ÓY `SéûDZP—4 «ÞÝ-Âñ¾‰t®›gòMò¨Rí¯DÏÁŸNhy4ž˜/è¥\}DX‡ïO˜€¶Í­#ù¥Æ‡ˆrOµÑÖõÉž¥ÞªZ–ÓEnDÛ<Î#!gÞv[÷^(&ü:G¥²™cPUEñß¼îZÉcÞInáCä"½`ä›r"*".L1Æà,…µÑ¼x¤º=x ^‡¢õíÊið6ÇÁ®ƒÚŽEz€¢a h-ÇM\¸ñqŠ†Ò w¯M5Dà 0†;б(ôWËÒ0¢»…ƆH®!×­#=jutªKÒ–Ü™r&õ0$$°öñ‘[Äf±â‡´ýÈh%fÏȉ&¿IÛía6{“¼€b)óGõëtÅB«¡ä„І²;–Ò€·äÈ9ÌÄçÙ¤ÙŒ'Ñã—Ý‘nùö;Z*¥%â¢þ`Û=]Á+ج\Ð"¾ú8SiØPª)˜P-ì”Í’2u²Ð¿ûoh´zhëJö•ÎtœøÀè—ß*aÒŽ™uè¹,lÈ&«ÓȦ—|ጫ C¤`®¡BR¤è­‘ˆ„|FŒi6Ä]‹@s4ºx>§ýi{®1HlŽ»Õ?¹”½0@UmiLý’GeåNÑ Ž§;ù^ƒ` ŽL{®Éñ©'ØÂ;¨nÛ¡øM' pF¼þ~­`4sà*™Su?¡˜ßIwOòx÷~óÄØþqºâ€D”¶ Þ‰VàË´†p~î‘1¡hÿ;¢óÅ#ùl¿ò­Ü•C“R#» dbeý³¬‚Žv޽™EX¼ì›$‰¡!ÔàFM_M=‹l7ÿØK.n«®˜»±¥&û‹1R氆ήãfŸ$/áΗMI; @=D¶`˜~ÒIokW~ªt‚ða…IëøD!>ìžn’Ä …j± ð/FŠSéâø*Öw™SääN[;%€ìäjš§(|ã¹ÒXl MjD±Orgê£P¶Ÿc ß±vÇ"Æ:Púpʘ}·bçƒ"ô8—¬TPŽ«c§È±äNª¨Ð–ˆ(×ê y6xÕKb/›%!¨’%—Ý5£‚êã^jPÉÕøGw×å1ŠNo©>ÁkŒ"*ºþ.”O_DGrÙu©¹˜0ö ó)[~S,—º™UÊ|WÎŒ~$qæቢàsX\œ~X‚É…J¾æŒˆ@瀩yI_¾¨)ß&g·†ÏÅÌ–v¿Ûëf»=HâJè™r [Óñá$”H%fŠ<Ö‚B^’SSsCËêv›Hmuµ7Ÿˆ"~©è¼ŒñÉMX1²g“. œ QÎ §9ÄPì€éœƒÛ'· ³ã{÷ú¨ @ýjXëè<ˆ"óú@ÁŸAƒˆ~à—äyö—‡¯»Ûk"]¥¡¯nàE†Q xéY~Ý'O1è·16ìú%O!›¿fíŸÀxwB±a*% ŽŠ%Qf eù^yŸ5@úøLWà ÿ¶èüÇ€-rëaÁ0+þðZ…›G^7EOå. 6y}%gÕ2Ž×ó¹¿}ÜóÌ•úT„@‹yÿ²2¡-TdëôÈí³ˆÓ`&ÀAŠb!,*%Ééè;> g;Jäb àýh·ûPM" ññÛ8NÖ‡†!‚éÇS(§¬'W ÿä`6¤¸3²ÒSuz}Yé‹°A2C ƒ_”Êx£"e…”ßré–Y»{¡îñ¼Àã´™_±Ø3!#;£—iå§QQ›>£'عxÙ`Ìæ‰öÉŠ“¥ˆ2“@±G·!ÓvIÜ6”íI*âD`»úV•À÷ 6ƒ„ß×ðOš Ú0-¸ú3’j½53=ªN·Í9-}žÇˆ—ë×–ëŒåÈAÛnÖ&b®lŠŽI#<¼·@VfK܃Q®¨©¾0*PÐ eÉ lC£Ÿÿ»)YÀD¦‡W¶¿±Î¹sQäüx >gÝ;ƒ/Á i󲲚R¦ìÜ?Ñ€vTV.XÂ"èŒÏLccÿ¼´…v'îÊü…ê»îÙŠ?øð«ÞRY±‚’çBë˜9Ec£.ú²¸¤¹Ç)xÒ|žs5NXô¤w£©¥ ÀÉ™šÓq–Ò œüÎ! •‰{R /ZF f+¯¶]@£ØévP§ Ý>;làWî{·,Ò¨ÕÙI§oô$‡†E1qwï¡íÐbq5TÈjuCG±z;ÕfJÿÑyXNØýïºc@+E"رQ7ŽJ)|J›uÎï ”°»;fx¤s¿z;ï¹6Á­•©è ’9ô¯hÇGŽ\‰WºÇ” Åkªs­+?ÓIs¿$á ¯T°”„F³‚Àë:‚CZš%€#u2=€]hŽØÛ?ŠØ$蚣nÉ0WóL©BÔ‘\θ tÚGêêM gÍùØ üœ8ˆÛŒ8I$dø$ú„ʼ„Òù±¸„ó•œW6sÄìq©YsE½|ƒ+Ïn¨;Fþ'F'„û@CˆG,&ž„!šiÅß$Z-Ù¢Y ;e]"[:r—?—¡¸ õ—RÏÛv4 Ñ$âK:VÕà,M ç<•ÖK:j?è«Ð%ÆQp‡(ißÈ©';s{9Hy{j¶µ‚DèòË0Ó!õ4L#" L¸¬çŠáûÑ7ÎAyÒ-'y騴¦plSRî$d¼ Ñ® Æ\,\Ñ0•’ÅÌ \†$1iTSÚŠ£±C!e2ÆM ñQ&†Ó?ŠT茊q_T´0»y>¬š÷óÏvæÜ9B‚;˜±˜ãYÍÞ \Ï0ý§L-¢@Qðïã€æ, GðÚD]BH5b"†XŽ<‚N†Ž“é#—™)ëÁX<?NÍó¾¨5I¹ACP‰tsl†…Åý"heš)ÉÊÔ¶q&6±àÖFCȇ¦7“wnH^~¹ÊûS:Q Q¸qÚ&/Í‹0Ùk§ô2@ÅŽÙ±Íy1×Î(=C¡iº‘›Öܲ±Û´ªúCX Žû™ÈÓØñ˜hc Aˆ‰£ö0¤[F¼ã,›Õèÿ„xÔ/t‹l=­ŸÓ(‹7O–`m;H(4ÒÔU.uZ2/‚˜|û¸ZµÛ+éìLÄrè &² W¬ÀI½6Iï@ÕÊŒì:Ç—á@†>nÓ&6ªÎ‘ÕÕk«âxlʇSZX¥Ü…¸jaú±Ó(`æ=¸1TÔ§ís(½È‘{Òµ€V¢6ªui»'ršsœÉ’¼(‚…]†±ˆâ ¬ì y$ßE™’ÃoŸJ UîWCüáVvÒW”Ú+],YžÔ5 9ƒ™TâŒ;2^ÙÚðuùÐ*ƒ/jÀ Ë.‰{]ǰ–­?À @œìƒQ(Þ)éÇSgLêpë Pê™Ù–P—„‹'×mëõ„Ùæ Z‘ôíÀkÉÅ [4OUr0ù~΋)&Iš  ߑȘČVÌ«Û&P[.}–´^g,OÐÓ_Xlî[™&o"ˆµö –¶âÇ`P9û&h3ÁNÁO•—ZLfƼÔöÐÖî`ñ+WQ¶¡°:gÐje7ž¬Yîç1lEK)Ó؆_vDS#ÎñºLëˆ<Ò]u nŒ= z<Ž›À†3¯ÅÇ|ôŠ—vVCpŒšvÊÖ3Mzº=a ú¦´°£U­=6g0Hþñx<¢ç=½™4“CmÓÅ–üUœîêmmaXûëéI°ºúòœ1ü|>Çö½¿ŽðíB@¸<“>ùUˆg~¶ò’,ðolzˆÝS4ÄWöÔå8Ó“]¼ßQB{ÈÔ§é¶öÄSp’­óþHX ⽕‡œ>cZš»*Wμ7Ålj‹ dšP«¥ô¿R—J¾2kké¬ÓR.T8'ñ8YÈɹˆp¤<ۛܢޫæˆS8ˆÒDoù2rº†9œו|î“ST—ÔB¡z´FE*Å2õȼ«°>òˆ‡$rpàn‡½Àþœ‘kÃð)J`Ч;Š"2 ÷¢jçcjeWè¡$e £Òêoî{- Žo¤ig†*© ßCI^~•™¡0¡½OH)o6ºh¿ˆ ä&ŒGêø!‡½ºT4A2†$Ÿý]ÆŒÔ2Jþ° Ð ø‡­NÃ5ö<3þÑÌpõŸ86² âf‚·[™CzF1ò<ŠÙÏ îXkWlXŸŽÞ«¥Ò$ªqQ4ÿÆÓßw#|U³1)sœ$±t.Ä!¥ø”ª%¸…€¦ ?×b V°,[½‚n¦ÿ]I«dëý3•SW¨«8m À³‘#ÇRŽ­é5̧}¸rŠï¤2t[8vÁ†t.þÚÒ>)§5bÐÁg$îÏû®Ãr)<Á~~íˆ2‘Bÿ²ºM2>Oâaa͘ïDWÖÿ$… Œñ &ÑqGÀ®ÚÆ!XA*gŽì˜×\?ÍÕå•&ÇÌ€KÔIºevNÉ2£%Ê—nU(·«KˆyìZ«;è€1wÙÜû‰{â»3þE¨œ‰€ ºã*.ø[AôX“7t˜†L—ÍDžíÕ™¡>Ä´>ÕÑdfœMëDr¤M Öµ¾jöM©qºÕ¶ÄZ  3ˆX}@ÇwáÈü(°Ô+CAÜsÔ£B.Ÿy1Œ{w¸`Úc?`'{"г‡¸®mÏ5¸äB\® Ƈ AAÈÆ‡‘ûñ¤o2 \˜?»ž;¶ÃKGc~J._ é¨vÅh³ÀØ‹"Zr ¦0놑Iq:Ù9Ü—é7Ä3„ªµ½Tž9ËØ¥¼FWŠ3 EÐ5ïZ(Ž…ž»Í‰µü­¢ó2Ϩ²n5ÖáH/{×Ú÷½_˜ÌläbÞZç&网o¢S™3")ï´> È;¾€O›:ìÈýÛëNqÿ¨jµYêïíÿqRJ$–ÍëïqÉRKÅ› WCP}zªÄí˜Èœ€ëו×ÿ¥û9ä7ê‹5RÊeók¤|“«%E{ÄD*f&åÇï–EdU„#€4».)Š@S€ÍÓä8HŒe AÖÏ–3Ü9y8!ýÇ(º“yâ¶#tßm9MÓüÅoÉ¿‰€¢œ#Drœè!kæIBNw„ÔÇUðåªÇNa)Û©ÍŽk\t¬~7-Y§(ppŽBÞ$">'š7‰ÐìÎoeŒ=èʹ&¹ëëá`$ͯêWÔ¶1ï‡ÂÐ7#àGÏ”ŠgÛ~ý±nË(e,õ+½¿Û7¬1X’`Œ aSVîVJQÍ¡Tþ¹  1NÖÀ¯XÒ5<,­ÉŠÌ:¶r9ö¦'„`gݸ·0&rW–YÛÝ~ Æ–ú‰®ÌxOÇèç3~$1§n¦(\FS̈®{AJZ¢ËOõñŠ‘ŸÍÀ÷Șæzz…*ÎvwW¬E·O‚®Úô,˜®,De×­ÖVï?œˆ¯~Ž0Ó"6@w‘VZaD€OQ\u°bÆk¾í7‰Îóë[o` -#óÏÛ_;@ÉÕþ”ÍÖ¢:Ç£× ÞèÜ®gsÞ÷¼fžèû\2˜;ÒdƒWvôš»ÃdûöCB7FQ%qtà[HßùQ⳸o?/,©;¹ñÎ\]b%TDÉ6¥è À;×™(Deí¸ór`zª8øÊTƒÏ€/¤ø.½.,9¿ ©1¾ÏfªF¶h{ÛºíϹÅ|ÖÖmÀ3^:¶Î4韲¥q [r£“ž¯¾Çe—zlÑyјDáZqZ8r¢Ç–á§‹iܨT¹g5‘Ñå’@%ÕzéÅWj«ó4—ÄËa‰°ô”érÚòRc4ÑÉB|Èþ!¥¨ÚF¦Ñk#½Yˆ!Üö‹Õ£Þ׎]§Õ…éþüÞróQ­ê½™þ5êŒ&ŒN ÙôjÊùrÑù3y€‚€ÂŒ6™˜.G¥ǛĊàIÏ3Ìëbw"G‡º\ÔފÓb˜\¿Ú…ÍÕ xŸ“AkÓ6ý¼.c‹zúoE«Þl`%4ÎJ£Þ¯¬íyÍÄÛ“¨+Ãè[£C^¦3ÌùÎ ]âÔ¶ {àPYÑ­Ù]ãdfjÈÂèÀéÜèNQ!?¤ · ¥‡hKLzû|«,U¢ú|2á#ë^9çɸ=ë¾X³Ê¼òÓdM'z£ä•ê r+ Ö•PÀFĦáÂßZÙ¨UsÙM·Cμa–ŒÔò“#Vâ¸&v©‡û4NÔëöFեȱ#Ä øàµÓ˜˜¯OÚÍZ“±©ç¼Ï¶ëÐ ,¡ÖßL;<°lX.qÍ?„Q{[ϧØA`ð9cølüG¶E†ª  â¿<.{ªû‰Îf&öh’±ð™äe›î¦H7ˆ¢CÇFÄÃI-ðF.¤Ôƒ¼\KÅÊ-``zÜ”Nõ!õÆ`“òæšQÍD&FBåÄ{J ðnŽíW?võ’Hôî£*Ì"Ÿx0ÅYlø`ÿö&£æ¬ “=Y8>Í>C”C’ë'õ-G‰ÝqÝ¢ ¨»ïñOO­ðLû×oNïÐ;Sb$ì™ÈYt¨ T¥f ,þ lã4‰e)Hø@¤"!>ÛÑì%»¡F…†&­SÒ}µØµ`£¬°u*ÛbmJ€‚ÌO܃3MïºlÒVv#'2v\u©úÍ&®¶¢î^ ø*+z¤Sr1A’%DÂØìz!¹)ߣIªØÒ•‘6Ó]€Ô={yfl£Q“@ëã xc̽U!ëy4pq‹r=Æ®@ˆÓÁTÓ/qèªßŸã JŠ–[zû¹ìO<,7v“äÙ=¨’ϰhby8\F 9 ¬¿Ä˜¡ÜóÆ=ãqŽÔ<ĘP@Þ=b=@£@,%ÑŒM[Vø¿™pX; Ô…ÛhÖ`‘/ãM *ŠŽ Välìa–ù¢mƒÈÉ–[õ¤öôu­!%^éQ 9^1âÍ?ª> $2i[/ÇON"Avgƒ±%ÿÍ¢óê 7ìaðäˆ*9/7ò X (ÒmyÇœºoìŠÀi]CT"ÖhÆ‹_}á-Ьñ‚àu“à²ó¾·¦%GñÑN«+Ì2W–b¦c¦|‡>e%¡'Ïü@n§Oé@ð‰Ûë%6³"U ymó¶&RNÀêPn°X8ÍÆ‘,N¼víh”Ù$CìÆ­Õf,u ßYÈ^j»T €yóïʼ%õUžÇ”û:(¾H¿xÎ#BgP¼|!‰@8ˆiWF/^¶¸q;QèHÅ~® ¿´ 14¿Àˆ¦ïÌúipë8@V:â"ë¼ kOy!.gýP.;ö*€na¼‚«Bxn•ÊûoZ;Œ\ʳ<|eKym+¦O¨ruj›ÈÓé 9¶«ú3ˆîÜöoi*›>[CÜ¿>4Ò :ÛQßÖMÄ‘Íâiç?_Ÿ@pEÉd®V„Ž©?*ÈÄþ6À?#:oEŠ–(”Nú\š¹Å:u¿—­°"ªöÖÕ×öA¶úΕèÁ¨‰oM“ï}=oÝ@®<âLt† ÿ½^¿™ÞQ®š$z·. QèÔ±”þcõ~Ên½” m—÷禯ý­ðm4{\¡¼.°U‡»µÅäk[L޾¥†¿µý"Øè›ÔˆôxÑãù½b O[C™/Yï¿×Ô˜„Iïßšÿ½CQñßë%Ù[U¿þb§¿×4ž|øp¿ªÐç®çljκ¯‚ØàÕ+ÈžWGAw$)û"5zö¬\iZs4ÏÖ‹ïÕ÷eC€½¿Jæ8&5ȧ\@AEQE¤` vNô’›i/äBœã?˜Ô“eè›¢Ž•b“øQD|Ù-|~øIm§é¦¢A’$Cò’ØPÁq˜#ÍÒ!ëiUÏSøe Å>ddû¬áv)Ön"+•ÒX2@ŒvŸÏ4MMGÛ—·3’>$ž’=œ±­o ¥DaYq±M”央SdºÕäcÄ€®¬„Î5°OŠÑÖ””ÚÿJ":˜ÏçS ë°q”ÆîobÍg2Ùù r91yÐÆzëÍ£$¿•9šÍ¼$«m’»äA TíÙQ¿JçöÞµ«ï3™;Ò÷žDP.ŠQ²ÞìAÚ§¨QÀçÓMÜ«Xˆ¹ Ê7¤7ÕärœOpÈ• £eÚý¢ãw˜:]ë©ãí¿8ô@¤$¿2Œ¯êÖõž5 µ8A_³YëbÛ5—ç›ÇmSuùË:b“3Êö<·EBÇå=pVK 4ïy<Én/V_U‡Žb$8eFw”b•Ä#káç‹:Ra›½9Ò\Úílü ×pî4JmMýϹp&ª0‘Æ"6¬“ó=ÎßUWÑ4sÎ’Ž ”’4„°›j£ÄHÅçÌöt$-ç‹Ù€Yáü3]òPò+kæq|ÝÑ8‰I´F¬Ø5ïNJ¯YÚIò"I9_—á^á0Ú%ÊDxPn¨$á–÷i •„)‡×—¥I§1'qJ´â\õ%"F‘ü4Õú 7vY0]_Ë…Ôø9êƒ~ü8AÇÛØº•ZÖYx áV)žn"©DHçöö,(ò‡Jì¤U“‘“žÑLŸ"¥•ÿ¨CÐÓ“0 ©MU:“T‡ KZ`;J4 Õ숔%q÷â뉵MEo<Ò‰ûT>+Ò˜šò½Vª¿ë£—äš#{.S˼QZâéFR6üX[Óg´H?Œ e!`­í}ÙK0¦u¯‘ˆ2%tbJÇ*,€Lt~<ʉèxfÐñ%òJ4w4¯ H´èçK–­Ô#¤ÂžA#-ããFOf¾3zîQ{ÒMÌOV¿*Tb_åu Š+R:€ABRÅûbïü—„=O{ÐSGÀä+\Ý›º†& %ëǧñSœç:‘­9ÏMj¨1«*"D#ñ„É@µ³U(Fp“¼’%¼ô´Z<²P`¾Ú¥„a—¤ÌÃkŠ®ÄÉ/q*›šN/ee'òÀÊãJà¤e½(‚Ë­,ˆE-úÓç”éÔÏ•ÄdÂO¶uQ±=8žnýiº]‰÷oåËCÄ$³Ò¾Â2pˆÌ>Ü7ŽU|Á½'²òw*F˜Q§}P§ÛãÎ:DºTØA{§ÆÒÎþïàcÚ‚ìºgO-Z×+ÈûæcVà2L¶ŠŽ©ÑW>mck™?4…Ù°‰Ç¬^°+Í_1Pb(ˆù!•¦‘ûï÷ui¹x„(‘0zØDV‡Ëx+ü™$€òÖ~à†”çhâ(ÑÑꢧÅe¶)ØhcÄ´9P>0jÖóêVÓ"lô®vû¡b_)Ql B˜ },™âD­\ÛÆÄëa°jÆ£\ËÙŠ"ho•Oüþwû"´1ô?9—ؼÇcˆf‚+NÈΑv&4¹Û¼ê0ÓÔ°˜ŽçfÁH#o/È@41G§t¢¹àÿž‰K¦Ô”ONß•;T¨ÞýéN¡œç >þÔƒ}PY]º¾†¯òDAÖAyä#º»[î×ÿpÃS3Q÷Œ,Ké£WÓbn7Vé_ÏÚ]KˆÓdÖ‚ß8I#¹›Ö0Ð%8ýÆ×¼ñulÊçÛ‹×%š>ˆzò‚ñ¿×ßë£^¯’Ê•æžÏç€Øÿ8ïŸøÂQâd´šõþ=Ü¿ >Ør}¯€Ì÷ÒØé' dý ÐÅΊFÔçñÉzfŸÏ'⻣7þÌõ_6ñ÷ú{}Ãñø™¡ÑßYÞñþ¾æßëß#þ^/ZÑOÿ±ûÏëŸim7$éAŠœ 匔P%YâZ4sÿEkÛÙÁÄ1|fk§ØH4rŒªf¹SžJvöÍ}5¦º î@|*†+ ÊÙ\D* ïœÑó}DOÿtÛâiÔëæ'QúHW¸jt5¡„Â’(ýÒNmn}p•6A´gIES|Xwô³¹°xaÃ¥ÇRF©Ze,ÛÚs`”Ø ÃAçdÁ¶Òvê ‰’Å×µcÅ‚·ÌسuÑ ¯]³%zó­š„Oµ¼/Ö¢çiKoÏåŒæµÇìldOû ÉßfÞrøÜmƒ›SoБVòÚ,KÃ9 òÊ‹ –H]ÍpâŒq’E€‘ãÙÓ%pv23íeo³õ¦f ɧF[$úèiƒ°µ2„B'þ y¤Mè¬í—¯pÐY‰uûé’—=ÐÌ ã!b:2á4v¯U6l+.`"uOèÓ¬ÕŠ4Àß~#fÂbøâ_£uÓ–†«2Vd$§B¨¸2J’Ndhâè°;±=lb4“%É›H{hж¥ # 4çV‡lÏÄ™pÃxªWt©·…Õ˜\¹ØÏ^k}õŸÏ§ú¨Ê'Ýý?,ˬc#ÑG*w¬/B:Ð S 4§ É qÛ&Þñp‚L—0W0ÓFË¡I±&ݦ–@~>Å Ñâ]!›YÂDóbY›5áN›?›#•Å0Ñ} 7o>ºàRÔÄôw†AÒ°l ÙÉoq•âdæöƶ&1¹*E³*F‰‘&e”^ù¸ÓK 9‘kU´mÛæº¼ŠÜÿ&Ïîþk–yÎTáG˜›˜Ü# ^Ú´‘—!R XçTÖðJ?†×ñù‡D“#ÈØ‡øI<4ê©Ý`•eþÁ±Ð•}ÿ™*…CüûxQ(°^§kö@óC29yüHÄØÞBJÔÎt¤HZÇÏÝ´Ý  [žãá± $m¬¦“ŠÊ¤ ˜+¥Î1ÒW‘°0Ad9ÛgîW=x¿’¾ÚÇà\å×@eC·kh»oð°îk(–uêdÇÐÁ'¦*‚䊭΢*U¢1r¦Êíesê‰ì'Œõ~‚ÔœŽO„.£—Ôlù“wîX ¥lisoâH¹bÄŽ*ëX±‰Iá÷.âÞQ —¶…\pQ%ªÞH ½Q è%÷Sw­«ë}úa]§FVŒjÌgAóR.òá¢3:z7Óc8Í,DL‘ú¡Ð‡ •'#ì+¢äêÐq¯>ýSÖ5û”lÒ¹Û‰`‹ -s…D2.›ìÒƒg5šS4ÂÚ² `‘ ÇÑ¡R’HVUÁÖ`@-Õ‰üÊT Jà䪦gux‡?ù£˜@+c‹‰ç,)$ÔªÔ÷²Õ‡~lÙ± V…Xd#»k‚”Þ)n†@«àr°DÆd’¾Ì멵r×-Y+G”Ék¤½>ÏÓ$’/ª4`„‹$®6©.‹úp« @Tu÷¨ÿͪ{82;½Uj T°g\ùÌ‘nW£aC•wÛ–«l«î'2ïù?  ŒŸ5 à[,g¢AãB™ÙöF®V×| ‰?½Kë8 Ù.½vîqzÖD‘Ý ; B8Ñ# 2/Aý›Í’™“$1ñÊ¡"ä<ƒù †•6`†'b¸\°æ:3…UÅ|ñ¸ÛP‰™äW\Ùnlº’õDÐ0ÉeRRNdºÏ¦^3ÈK]dp:óXoPƒÜÆ:umFåg5€Ÿ-:O\õW&“|çŽæQ¯ª1ffŒGŽRp%y yD¹Ö£¶s¥ß+k'z ÐWy½UÈbjÑÒð®ÞUÀU<ˆʽ~_’÷™Èý –¬$m-æôc¯¯ÐOÖøG_r9Ú8à"üåÿ› R45vô² #z‹ƒÆ¿rz~49’'ØÛ—ÙUz³a€ÎøÌ§:†T‚×VôR[òއBD‚JŠ>g±¿I§z¨ÜûÑ Ɔtëêüz£rW«c}šåßëÞ#ó^_ûãÓܾ+߬ǚ{ÃÓùÜÃ%­ñk ))Š+Þxå/ò/¿Ê¾/uVïqOm<ÚmWð Dç¿J¡Êi_ÿPR 8ùñǵ©Œk—G³½f™_o;²¸„Òû£û4zc¾qM1ã\hU9 ©Gáÿ-`ί«Þ4tôˆQ4 Ø_ÖàC 1úÐhAù"¥­eË‹K >¯ëaÖB‰¡YK™îUä.ÉR+Pm¢ÞgÏ®(УГú’»àçW©¬ó§5½wÛh•H¼f„[³'ŠZúA´û¾&B­ìð•Ëüé 2¢‰´ËhƒÅ5@îªÐ„ÝœÖ8ìß½kidÉø]f÷Sô¯µæt‘Ä[º`ªxú‰Î ÐãQÅà1Ÿ¾öˆ@šš…pç0¥í~®Ú£_°íˆ¹>ÕàîEœâ(h»Zn5…§=ê/ì«Ë—u)®l¼øv 6ê}ÍkbÐRÝUŠ{„³(šó~Þ]Ü—ÿp·Ä¼pdCΈ—û]ü"^ì‹rj¥ uÖgà ¬-)ð\wrаª¶´ëÈÞ€»ùÉ­"Y~Ò•aš;f0ÜñûM~o½ñî;üþÚ%œhI†ÓL…ñrµv«­¨BÆ÷žÝ4Ì“õhž¶%Ù®º(¤Nb¼!×-|Ké"¼5x’@¢÷™P˜1cö B”TÅÛ†ä]ŸÓþO¼ŒL¤‚q¤Æ‹pЮO0pL;D“îà90õKDç¹êœÄ&nh1Ó$E¥qÄÜžìXƒ‹.uZ\Úhÿg×W¨¦§¶BqŽ £¡$)xçÃA¤Ñ’K0´kèëÂ9UëB2ñ뙈R̰“ndE@:uºŠ©¹8üÔòOd B¼*#y!炜"MÇÿø¤KÁæÒQƒ Ýgì¥ã›ŽÏ´Bqßx1Çrœç»i0“bÄŽ}ë2Ž*bi‡Ž´’F÷Ñã¯65ÁOõ­u Ù<ÕÜ&–>%6â2k“9¤i_™Ÿ æií9蹎õ¹eëèŒå“zÛ…)Y/Á‰ÛAsGÔ¨i0 0ê¢ÔàDrÒ`àZÂå ùD”Õºjƒ€Æ§¸ –»Â[ü6=Dp‘Æ×tßÀÄ©©&ùHjãœr ˆ*õ§»¸¶d R»ÔÄGK¸0HeQá¤ìhr•64qا”Iì BD„ZÝUB·´M=» $‰Ä¦§5¿0۾랑<ìA D"SÑaë;S슋ÈKó˜)ÊîŒáÆ^=‹qT=,IJaÞ0È´Ãh]ßÃaªÐ׳5(uG&·(¦½LI (ÄNöŒToæ#Œ I¸v¹Þ²@( g¾/Â5Ä;%ôgbÆô—7¢SÆ÷-Q:§‚ÇàŒJŒ^¡Eh'R¢ŸãÛ=Á4=^Š›ÐŽ> YsÌä(F€‰#|ô€oƒ) 1º@[öÙ8¨ŠòCp÷6X;gÂk¦&€pÔäÜŸX€Âädé7&Fl é¢áËÏej7Ö§þ»<Ò“¡>6CJ¯ö‚OÕ5šÙãUƒŠwFØá7L±#Û¦ƒüÄ1U´ã1ʬÊÛZäA ŽÖ¥Ÿéƒ€Íuø(]’‘´G&JFˆÿ¨êZ„šÖCcò©ÍcHPíð6 aÀ ÜÜ©ciû¨@èÝÅHѨC ´l­=᪭e2"l&y²á×M¹Ýmôjìu¦Æ4ÈÞCÀÚ®…ñ`{Råuã]ç^$[ÅPrQÑÜvgçõã¢ä†\ Ô›"0Ž' ƒxÞl^hdI—Ðy«|…ê/ì1;‹ú2c¤á¿Jt~:NMâëdT†W-ÃhÜáÀê²5¸‡ÀtÆŒèëG}¬ÕÀà[$€®T;òN˜ók ,8;ª2e!£‹‹ñ,º>ù6g–,n;ÅÀHâëÎfé›>‹âCWÝüëÎÃ]Ÿ9a,/"n\ÒÆEêóÔ{ÕùÔ¾6=†msDLêCïâO/iŠ}û‹äúìjETžxÛHdõðSÀBº^}D )û¾G…E´ñ§Ø.Ûøí1Þ»»ïcÜa°¼ŒüQÜØ6ëËœÿ`âv²^i§SÁ€IO]½ñ˜Ø:W.öUK¢AÙ,aèü}öwn‚*Ý——r5ŠB›|Ÿ%©oŒÛ#·—^íd¯þžÅõÀ€J÷º×šýYM¬­Hf\º§•áb¶KF>xÿ¸5f“”ÝÖfðìB`YR­Ó÷þl+Td¶o3/$?Ñ«2Ò¨üó6;í¢2ÔÁÀÉ|]gØ<ö¿\l¾_H ~¶è¼ëxÞÀ(ì›EáÞÓIBu¾go‡M4m¡ðú ¼Ú½(¢f°§&Š2… ;·®í_„èµ äüL^†Ç£uÄùÒ­æ)"[ZUñŽì'¸ÈmúœG/9ªÙ,¸o²_Š Pê‡òRúxÊ|c>èž-6€¶°ð²ph`J=DÆÜ:­ÒKñ½^nn.{—¥óä @c83¸ˆ"ï+Ðr¨_,†E?(l”WH¦ÆÝÖ—v®ÓïF×WÉVÂËÛE:a>ÖÍ0v¸Å¼•§÷•|fS¯õ‰N:ÐQ<ûE{œ{…n½“Ç È g!⢓‘Þ™=m¼;¡&§+ú¬ÙÒñ)§$êgÌ´š#rº¥Z"RŒ$Q _KÏb7ÃéÖÑÛeaB…]° ƒÉŠiÍ‹*0ç¤Éº³h­gµI©…"[;j@žøžÛÖðÄÉ¥¢|€®>DQÆý«\`Wò’IMv¢¡^F\«]_Ä4’/rŸ‘Îw”}ð8øZkŽ­Š ñ³à˜2ÓVšØ fÒ[=”#p”\@ˆr3«J˜¾Š…“Vp߄֡÷É[ÜjÄ‹ ‘è¶ú‰'w€©£ñ$€¤]vÐ(#´„hÛµµ²öº!»ý‡Çæõ4GØÄ¢ö àÅk6)⥊‰PA/_ ñžjW¦ÚDϼÉLŠJYP HèB˜.ˆà <é¨O³°“ÕK÷†&L;ž:vEä½1ñ|˜Ú%Lª’[Ý?"²i®ÔÞU´>‘¯ƒ™‚&»Ö5HB'㛥G‹‘\|Ù @é†=“é¦Íq4æ`ÝúÊ‘lBvE©˜ªXÕMâx ¡|zŽÙÌÓ«Dc0êÑœ-Åh•­“¨s”ăæ"ù]RÇgö!Ë8À£@ãÂq£¤< 5’d])ž×3ÊÒ¼IÏû 3ë"naê‹ý:@y1ë.-(üGå( lÞ-\°A½I9€ß,:ï'æÄö€­ XáÓ|+JD³Ž¶ê•7aˆÊ‚“‰¸•y´ y›ËÍÔ(»y–ª ÷0,M‡˜0xJyd„“D,½Œñ¥M‹N¤"ü$ËXoíË` ŒØÓŽó<’—=%kú¬hù ¬2Öžt ÁÞ¦­:ÈOcl èTB#{K•t›cx•ÀœÃðD*žÈ},®¤‹=χ>/»õ­Q8GÅ_ÑšÚçhÔUF¼q­Yò0îdG½ž`œ{Ú]·†ð9yÀ?VÞN%W*˜ àBsÞÔðL.;µ{›D^ÍÌSìÀ†×lîE»ðF(G«è3Úbiz¨xEÙh· `Ùñ•sš6:è™p¢_=gF€u¾¨¼“£PfZ÷l£ÊQ¯Ç?W.&GÕ¿—°!¿ïÅÕç/>ÌW1D%}'a2ç÷Êô¸$ á">åõi‚ídQŒ¹3o?åèMÂàÈkl÷÷0^|Þ²D·0–ÝÓ{ùªÞÅ .oO¬­3g\[Ð[ì9^`¼!(…÷Äû±3÷'çE€—·¯Ñ'S6R €Itþm €ïqŸs#ÞŒÜéë+cWçD¹Ï—õꆥ·ðÛZmYtî'Ùj'®œžð…ŽùçÑŠ;¿S©[?Rèò6Ó@‹RYȺ/ü飊fdžâÔYloIºÜð½(%Éúw×gªð/a£ßÖôªóƒj8›6RKÕºZáºÐ[ò}l3ÈÀM_²aCvöÜ [… £bˆsc1`Cj¬v›¸P³õ\öšM >¹º„ÔÔò„cîü%½Î;g9à]`ÎûÜV& ÿò€æ3 ¯ìÀe3€!n½9p(ŒºÔÝå^k :-„bíäøñ¾c`ôµÒ¨=?ã4¼_þ"ùVº]Û÷ö8ú"âð¡I²ÆöÏŽÒ/„ÖìôÁ,Zgæ‚Fó ”v·½l£õpç¨|6„µ‰HÝ´^©nF›ê¦§ùöÌZ“ÿñ¯“Q! Y#ýÓ²oÅ@kïŒø€k*Ó*Öšì¯.ºã†¢@0ø_ÿ¨$h¤"ÈçMÛº""pVšvgä€k#â£WQ¸–ù…ÌÛkúB BP:në}j2 êÖBý8À/,¼“@¼¥YrCНá´mSH©ëï°Š‘¤£³g„\FYÐvÜòbáñÌ¢™Úbgt†ȃ±ßH’_ÑM"@n@†Mw ŒŠ ªÛÂ%ˆˆzχ°ÐjŒ õŠ২Q®Ü»ìÅ%ßpŠŒT‡ÖÈ!nMPê~ø”vðd4¢hÒ¥«·¥Ô¿£”pL EK‹e‚UÐeƒPoÝñ´™+†³m¡°ô »iàJ££w4‰bn—5ìU ~\4/Ðn&Æ3æJ ˆ£Ô±€¬ó™-êÝýíiq¥¢'<áRDF's¬XÜO]̾υZѹ[PøŸIÉ9º†PÉT¬²Îk¹L ÈŒM¾Šý %Š™Û`½¢=*Ù1{êYð‚‘ÊD¶å†„AÌlÏ"ú¨ÃÞ‹£3üµ^™FJçIs2…Œ«D¨5_l5¾ãˆªŽoÚCó:zŽ…r}£'ŸÅ5W¤•0K¡70zdwþ¤6–f²?I*(JOÑ‘x$Õvñ+ѼìÆàb(Cm-£D¢£Ïâ¢y›és÷Ä‚d´zuuK¢c8‹Ñ4ÿ冀rž®gÿ3cÇSßÛ”¨g÷ž:ÐUqšZD!â„Q2mÅÙ¼e‚«²ÑvÛÊI†-Ø×¹ŽA 9øŽ#yDš»»ÕŠÙt¸%v•4™èâ½õrWhË¿µvê€YWœy{D![Fìlø.áÀü>ñy–ÉÅ[U+‚²l‡ ç`$)¼IîŃ£q/vÉÕùqò¢Ù^5‡ŸTlH1uÜl:«Á5€ìê¥M(±Wm›iÕ®$¨3ñ¤!ò¹­ãxPÅFb¤²ÇV­o)(â”äerúDˆ#¥šˆò KÝø8ïbcü߆¸Ðâ{¢>0 ÍV æm ©r¥ ©£Š“F雀ÄlVDæ˜t?¾Ñs  QRcˆ$ffUU¢êñª"ô-#D «õEç)œE…5+¢›îCp{Ðç…1UÙŸýM¦Ÿ5™ß™S-–"ï *`”äu÷}ê8€r_â©MÉB‘"}@»2!ˆ„,çWÙWt û\û‡ÊWÏ0MßnÞš<âÿÌ9QýHÜÿB}LXgœvk{Șlno4¶«¶ÙP#yï-¼'úŒè4G—È€öÄ`–ôWK&÷mœô)µ>bç”IQK€¤û*“s³`åõ˜‘ùàB‰Yh¹fT[7%[ÅR¦³3.›\xŽZjó<«€"z>ŸÀäæe{ìdøå|då¤ÀSb”gMwÆ×>T)OœÖë'у]X'Њrņ™£½]´À]¾t8FÙäw'ùz¢ŠÅšUÌíʃãA–sÈ;úì²ìŽ÷h> çÊfEž¸•nœ…EE‘È æ¿>ê{/H‡k~„ܘÁ³o•ö÷«€i5ÃQ\d›‚äǨ!K¹m.j’O?2à†\ó#Úy¸r âêZiž«-Þ›µ ®$XÀMa¼1ʲœîÜ—+&kZçËqÿ|¡êuVÆHþÛí@!¨{UÖ€9 ›a¦±z„¿Zµ}fóÙ8 ¹HÖR‚ ¼–Ì\í8ÂXÕ‰šKGʨ  ".úJ@}Œ'­[6¬f?”Á‚·Gb/¢¿ðdžOBxƒp':½óÊY³’TÓKª‰¯ÃÈv;šþL8kéºÍI¬b®¤è…ë˜o¡˜À‚˜Ft¾Ç¿û•´½È%úÞËŠ8¶B2nHÝsåÇÞîè ad7ð†721LQŽž.b—ç³wÊfâ»9¾]Æñmj¥ ›‡™ßšvã’÷*èYÇ%XI"RŸhìcåªèâ/w¤ûù|"âãaÆ6ü‚ v)š.0^„b¼bÆ@5’¥ï¬On:`¾m¹¾}¯ßr2‘ïMb·¿cm¯:OØ|d%†¯|>ŸÀZqè¬#¤w…{79 oZ±ßg$?á¿Ýž¨Îô[ÎÅ€;6ÇS]?bw/Î…Á8øo'x¿êöÕ€Ô`ìê°}¿KYεíSföõØø’£ôøV¿Æ¥þàYúĆb§G¡—zD½¥>à ˆHûO•Ò†Ûô`VñÍ©nißjççb°Õ; ¸Ó§@È< “ª'ÄlÉ‘ÓX¬P¬Šþ}®IÀ¦ºœ ćÆé 9²®ID$<]ÎQ°¢©Çš[¡®ô±”‰qo¦gPPÿU”ôÚ—8º@ߊæ2’øáBmjùu1“Ì‹-ŽÃȈŽiEwÚè¤l½‹³¸Ð‰è±ic¨”sàÕöµÿ#5¨änÊ™€÷QÀØ/Ç5ó ?ì!%? TLd± ¼-½IÄÔ.#^é´FFYª¢Äè2zPb]K€ÿâ`ü¡’Û‰ âïëºòêQ†‚­;»7¹ûžHø ö·ØÍšÓþÏ%—š>þÊUEpöÀRN—æð)ê’Z!Pónƒ†:ï»ÇD•D´&˜ÝNp;€ó<ä¤È™æm„þ\«ìLA?Qs²Í±î`PϹ, ~BçÂØ“G£ÒW;ìÜ~ê±›V ï©!?€r[߬éi°²ç¢ÉÀÓÑŽ”·oµDŠ`Y<¤Ú]ºÁ©ÜðdÖ*i(ýMðzÏ?õ¸Ájªáp$Fe£gĘ“7Î×Ò¹òO!½.HšÌÅõÃ>ȇç3}ðKFëL§· ä¤$ΟÏ c 2/øaÿèì±Âq}eM#-7ùöv·ñ´W7þ[îäPu9$CÎdrÑÒÒ­$ÝvÐëå¡óMÇŠh¸92Å‘öàZ2ìMÅÉÐbæïrL:¡ˆ¼57§(ÞµGïp¥>zª'–žO>ƒÍNôa䂺m6ò¹¹°w@Úÿ#¿lrb!`FÔbß×kä¹ÌHµ „l )–óÖÜ„™P ² Æpdm\šWm:ƒ›v Ú•3q›q)¤J(¢âd³É1¿'Ô<¼åÓo!i4D[=í×½Â@.JfI~6EckȦä2ÏÄåò'SGáj;¸šÒÇššs†€Oc`o%ƒcæU²ª¹„rnÿsñÀf ˜à¿$:/BXã"0€Åy’.)?¶®Zi"+ÚW´å:Ò•ÈVæÝ-8ÉÆUF­õ¢•Cç¤uJz«Ã; ÌÓºˆ1’$z>€ôA]W1PÁåñ1äØôC„¡1M¢l@ZQ1°Ñ •ÐI?6Ї » €Ü÷ „ì½RM숧CŒˆ1âµ)áJ|-.mu›ðÉÐ$‚ìET‰Óh,–¯UY “°òkF@ðÄÈÏÖ¾÷®ïZ¹p§…ªÃ'Àôq»à ÅFàm DY¶D|ôrFá +ˆ5b)¯³‘wdzæEåYg:_vQ]ðmýôPÃpQ…”–‡¨G˘q“€«ýG)ƒØ$âroA•hSW‡ùv¨+KN³zðúžx.M¨îQ[&¥ã ™rÒ¡/_™œa¶.%ø5q¤qvl‹CæW§§˜KöLÝÍ>¬9ÆÌfö&Áñ4ùtémh,TŒ‰‹‘ŸE?쬂e\2 Lé &Æ\—ßzÁH ÚVVwZpqv3ëx›Ä¼n0û‰.ÞãdÂêžʇc¿1WX¾FûˆÇ&•¯¹+J‹äž)x½¸bÈüœ÷ºT)Ü­K3_g¸Ž,¶å.⣖T|+ÜPRåÀG€ãÍ>ŸcŽÍäY_²J ›ñb¸Î+¬Uæbïî:;‚(Z«Š¶UšB:Œ)íò|Hpe.Ç“¸·£%Èd·îÒ—¡Ò+5Z‘Û¤“Õ ®ÛŸÉ†çˆ4UÌYIgæí]bTÐÍ¢[vw?—²±+öé,çó&öô²Àáá QE§C¡Òœÿ<òžÕŸQ®_,:_¿>Êöòµ@8Þ&Þ>¸’ù®ç&•QmÄøîéFgÛñú‚ï=Ç?éÒÈ”CÚúDùÇüïõ÷ú{½íõ€Çúۮxð/¿èT~ ÿþûÓ©ú™Oð.¾êë_òz¾Sû1žý÷ZÜsÿšþÒo|ž@ô|>ŸOö`ÿû￟~_×ĵÿ^¯¹ë-Vûx<ÔŒ@Ÿjú÷ú{ý½ºG”ÒêÔÔ-þ–ç_x/…»¿NtþgÿÉÁçHiy‹-î`4‰ˆšÊ&™GºÐ¿ULùGÿ?xތɞUOœ¢!»þFU]Î3±dUÆØ¥]z*{b†®.XØjá“h)ω%Hß®x§›Úšæ ¢÷rea‰âmëîcq®Y­âPïçEÏA6:@©Ó–“#·˜/©€Ng8½¨$ # ,ZÝUåÉ©¡+:£\Gø ú¦îh{µU™ÜŽpÈõD§ôg=•¹ˆš`w‘uGZq ª‘ß žZùnmìxÞמŽ+âíÛ.éeê¥ tsÆ Åª×µ™pp™(q.jöDrêÑ£LÄ쾤Ròß+Ë[£‘Ë-õšÀº Ù¦ñäñC~ŸÏgØžÒÿ½£lOЧVrFùÁD=ÿÒÅ…%¹lúJõ &…Ï4µ áÐ^Åbº;›ÔX߇Ü$û0`²}øDç5Të˜$*8NÏ¡$žwÏoª¿ú†×” Š2_X–¯\­’~‚6¼ž¼ó¼îÏ^þø ~¤j<ËTÜMGû?Á§ˆl(ÙäQÒÂÿ¶ö·ìKöŠRåo!ZÊ&¼ëf/àj÷;=ú¹*@ÄFýìØãïõV{ãgÑ$ÒØ_r«{õwûÍ?säuÔé%:þôx ” xÞµt‰œßßñû°|öïµçÑùªÿi ,q¬:”Ë«'ÇËDmДrĤtš?÷é…~õ9∶UÏöoby¨÷§ï!¯¸ 6ÀLãШ¯’>Û@oáÝÁìf$€5Øaºbl ²dóó~à£r´*•Nà)èAÓf&ÂåG Œœ·²) ekáÁ»»õf÷ù‚<’ŒƒjOº˜Ýj+×êàÁÄ^Tøæ•‹É{=„j€zl¬—œVûÚÞŸÔ•ý.67šmÊlŸä„µY|p¶¼Þ 7O)ðcž3Q0èºSÆ)‚Sé;²>KåPeUÃd»HaQ*+n  iïå€ÙÁ¬› <6Çé$†¢éÜ ÈñòwF¢öp“!ÁAQðàNHUÓÈ&FÞqVfÀ¢RGqþ°Û[ZôÎDcèÌÁà ٥}Éö(M<àÉõF;úI5ȯâÑÅ™uÙÊQÒñ3Õn¼ùdH3ï¡Ö­”ŒV7ÚM9-W6 1Ñ /Í«¤ëC˜ïJk±/~O±¢É„¿nI6w¯³€„—wƒRJÜ«RÚZöîùf+†E&í£>ÍHÚRd÷œm‰»d߈½Ç°iJt’.(EÊ¿Gðe f+l…žVömlr¿.êmGœ4k¢°ÐzÚË€¸°jNfÇÊf[ºjûhûw³˜ÿ €c”º=×Kƹª_j÷Œ~fCù‘zš-)ȱ©—fÙÞ””ûiÑ—à¥f‘€aÅøØ_ÏÞåC£tÃÛ®PõïˆÎ]æî=sK:9*ØÀ@˜Ù³• ˆ]Œ{§ÁîòËœ_k@6%︌äY8U¤˜Dô%/7ö(Á4Æâ£¡.Qý+Ø¡¥.Ÿ„,ÿ×°?/aX—ˆ¼` %ˆ]yòc Nf3vŽS‡˜rɱbßW°ê1œ U:1ÍÇZÚXmÒÕ»gU‘3rÎ1É­$ŠUfš7õðÔÏ×<¶TÑnrMÌ)¦gŒW| 0[> b2³¿Ü)û] ^,ùõ!?~÷8ä)¼;–·Ç~~\$Ô …Ÿašâ?¶n‚÷Êcåêì^²óÒaì©>»ËSˆ˜tšžã¦äz• “M.”M¸n3%ï$÷£ÿ|õÄIq°Á[±³Ï •œÖ¤ >žC³ûJ;ŽˆYZˆæÄD>yG¿j'Q¹º£ì|l”±‹™Èäè¤ñÊ4†ÙÎlª)L!D‡Ð×¥/>MwÛáÒR•…ÐànÞQ•Iè<«äf¾ÈŽ­%ÉPþ®ªˆ¦yR”f A°ÿÛª#æ~ÎʱE‰âÆ]y„zL"ó4â÷2·ÎÁy@Žâx\ç|Ý9¨˜âªÃ¸ºýžìÐ#Hµ’òÅ·ª_lÐŽ`Ä3Õ2z¸X%ÆZÇ:ǽ NHª®R­ õt0"WÀßÈèUúû‚®‘¹‡íÚKÔ-¦0Ú*öOë¯Ù‹Ò–&гoJ®s2è(Jš’XµW$%í¢øiú(£²ÅŠ”Pˆ3ô1=Lï ƒá«M…éSR»@mMªÛð½_™dÌ® À´ö°ÚEëbVÞ”vSËŸŸSG–„}ŒQê€È5ì΢[ŠwêUzJVÅ\WJy'Â]Õ!ÙA À‰ Å*)il%¥mã‡ÛõiD}óäÂGÄ›$\õø¨#o!{ 4"”wð;QJ0zº÷É­°ž}açmã×5Vº €·txGÃß–è¥\ëßéŽü}ù4sÙâþ´¥¡æeS³-ðÚŸúñ¤Ò,ß¶v„[«Íü¼Eÿß›i[tU˜óïålƒ·±õáÃèù*×s àšë¿|s» ä¹!ÜYeäöí»¶îkÎ&±NüŒcøgØopÁßþ4yû }èÒ‰$4X¶¨{J'®•þ¡ëœàh€*ÑuÞÞ+végŠÎ×@ƒ}Œès©ð\Øàz~¸TN` ]ôÓr¤,ï(°º÷Žƒ¯æ}q–£zã¨OËŒwüD${4¥M îí¢)D“Ì,«,I6ðV®aw—ºrV\úNYÏ©êâ ÷ûî—‘-¬ïg¨óKòÕ__4èéÛr2ö¿Ùùí5`JËêytÑ+˜y†æçZÝB¯#D‰Jf«z¢<ÓJ2åqåæUÌu01‹¥6ÒTši¢ÑKõʧ-Ó9ê…žØ-Ôí3ƒùÛo¶ží!n¨¾…-'ý+§£´msÖrOè°y¿I((d™·Nx…ó"©=ÔO?~a•eJ/Áå.m_C³£ùËd0Ƶ¥Y.z 1\Õ‡­ÄÅ­kݓޓŸís«ôÛ‚õ©)ß‚Èv9‹¢íõbV‘Çõð,;z®5.ê±t)ͽm_WÛØSó€´Ùö®o„’:(ç;aÈ€mzY/”ꛡ®ôƘÑÛ®C2É;àµ@^ÈëRI;ÞK¼=œP[Å tK6ûq鋼F“>d¤Ü̾×.ŠÖ;bRr˜h®|©2Wžx*ð@Ä'ÿ¤Ö³G•¥r¥{6?/?<€ß,:¥KuBÏqp˜¹ÊMn¤å-¥§í¢¯)ø–¥=èdíY0/ìD“|À«–Í [<}øZ>Øz7À J£„þ<Ý@J^JXÐØ0V—=£Œh ï|ízˆÎÕjG:DHO=ƒžª·;S—ª¸À}oD“¬ Óvû•î¡nÁm&uÇ{‡hÌhQt£çÄšht HI µ1RÙ¾C«ú`Ž8å± ± ôA%QC’ÛÌ_ü`È»¢€ ê­/Q6L:à;N¢@v6܈:<8’ rq¨ 5¸¸äÌñ‘ÒžJ„Oã]¡Ù—ËHrÏÊ]sjiÐói!•p€ba”¬A+DVë¶íÂÒéæ´2¾lºôé#¬/1)æp€o•¼↑ÜYŒo¥Ö óáú§ue⪡8+;ñïg°q“±®k‹ÛÓ”˜—dDVº8Zq¦3ñ’‹ŠIÕIj«ks\ËcËù¤<Ì®Ÿ8?óÅž8£—k·o¡Þ¤EºYîIj_$¤nµÚÁCC@l"¹<k’'Z™ ¤lпþ(FCUÊß-:?1‰Ê ˜ 6ù0BeÉxÍ.p™`êFþú}õÅ>€'s{óëX½¯ËŸRq´U_Î'ë JÜ7×›g“L¤ÎÀ©|):`HlhŠ €Í-I*IþnÓ\¬„8ÛõŽ©rÊdøVDÕ‘³/bT>OdÜ&lêúÿåùäà}â6K ÂÜ >9jSx†P>šI6<Ù§l³šÉÏÓ+”6’W:‹¾Ð¯ê#•}ŠM\aWUcò-€´1Áì–1e0ÅѸÈDK“3¹ti¹ÿB˜3‚zÒú*A&“5}øÓôrèä± Ž\‚@‰¹ ¿…°¾Ã×T“À4[+~˽ €rŒóA/üç4“ $¯‹Ë\ÏèܽÐÈ@¡ó&ÀÊîÊ• _ªäñ`ñ¬¨þ^¸²Íh]Døl~"n‘e¸´M‘;† ÛÞ™ÿ16TÙ`{ŒŒ\%/Î}ïq K €‰©òü‹(ÈO¢ÕÖÜוʺ Àz `:\'ëàwˆÎï2.l5³+f *ßÚ¶†n2)º ¼#D|_Ò*k„à°î㺷æèÜ”pÀs]*Ù\ŠÚÛ§_´’ûQoqZ ÃÏ!êþÈ:¢àô¾¿¸b0tî&€©² (lB*%àôm2™‚…Àîq=y«÷ ß6½Fv¿ôÞ|I¹]«>ŸDÏ*ߊÐIQcÖ\)°}ëE²<&¡ö=‰dÕç~Ïsæ˜Íx…ªã:Ry{êr“:Gæ&£¨o•Þ¡ÊŸáæ…}‚~4¥ãb§È ¨MÂFD˜ µ¥Ò@·¥¸ÞœYa¾N×Q›l}eû­—…(ŠãY#ÿ‡Ê _ÆðKëÐ%¿pìÓ:#Öm³uÑ[n ;uöú@#wÞÂeÛø¡`¨¿[óÏ鎌ç·sÎ"-ú8ywp¥ðê;º#*O-~h{¨½}ñ~âéå°Œ{b@ ›™Ðb»Vú Fë ¶ŒÐ+ƌՇîž6Ñòž¼+Ö}çL”Û’JÂ=ÑÈUÌ4¶á£÷Õ9r—Õ¥(¢²" ޤ*®$/Ï.ZÒ^¼jôìÈ@ÎZÚÏÿšè||ð…åY•SÒpe”}2îCʈkë®§m¹±ÃW+£ŠzÅŸ‚L¸5FQÇ”˜è8@Õ²@Äg˜b-ù Fs«À¨/æTöwpä}Ú÷òÞL¶R(Ý6Î"àPeoðÑX¿<2ò‰<´Ä[yNžìæ‚®Ÿ pæ˜HºwØÙTª2Úÿ›»¢™_ŒX§¢†ã [H‹3.US6× X—·LÉx°ó Eý¦ŽÃÜ~ÍH^tÙÅ¡Z9¦»DãÏ´"vÿ’AZ{}!l²€K1éjûAéçH.¹0X¿4ÓWæ[^ëpW`W&PßZUEY8Ì+b§6k –çóépzP»%` t]ÃÁsZ4®Xq.û4ö=ŽLÀQr³œÆ¥);ï³¾%<žÁb»ìSýæ¼\†æŸÕP»}z°¾«ºØ)’‹‰‡Ú%êØ¥§±5 wÏ6Ov9¤ý:G¤Ù°¹}yýÉMD ± ñÑ lóQß|NælÃÙ©YHâËá$‡ŽA!cW~b©Ø¾Çàl53šçE§¶ %:¦ì ƒƒÊá[²KnŸû©bNèñÞ>þ—”PZ]'GÚÐÁä–ÓÅbÚ£@±cŽ‚lš4RÉPÖ²#W᪗ƒ¹A‘xÄ_„Ö »Äy©§çç SÜ?±$ÂVBR‹0i%V‚‰Rcé7õ€3t jô+üêOàňt¼ ù4× Z‡Rä+“`Gs ½Ü©˺i¡’g!5{FA¦Ýù¹× \ù‚¿f·¨œp/zX¤ò¨CjÝýÁÔÛ¯öt_m7Ž2¾h³yâŸ~ÂcEõ56@ª„‘&1ƒt`„·c µ@(ºk¿:Ūy¬÷ §*ñµ²Ì•ã¦Àï5Íh¯bEêÎ0iÚ1ÇV/)Þ»ŒÞ½ÍµTDçJ†ÂÊ°ŠØ½ÂÈý懡+J0‘-·qˆ5JXƪR ]›l˜]©bºº=ñÎÁ'Ñ86xÉ*úÔÕµGLA=?„k…ír¸'~à2y%@oCãþ׋Î/ý­Ö‡ÒÈ­¥D¶NfØ1(­£/Æ}$8tÄù#˜‰.”PÕ—Dåg~MËy+ŸV2§ÉðïUßáµå׋|GçcK»»&—ÛÍžr ³·ãMœ· {H J”pß‹ïî¿¥„™Þà 'cõ£s¥,j¶ /wÄ^¹Õ¾d‰ðÊ[ñsG‹ne§´²yIŠèÕÜù'=ቶ_1*ØÝ…ͼЕ“¨n`ôœ¾kx.Iö” „h¶ôUÀ¢ eð´ŠeâR£ük5ÿÙõº"á·í˜;¤pÉÆ”)ÛÄš0œq½/Õup.îšÜÅÀÙ®Ûv&/ˆcQzßô:W:RŸ´a9Óp‹¾Üµ±û €9nBG¤‚ÃõÐ6îƒÑ¯]äœ; @ØÕK@f¯üÎWߨÊî;ù¾¶Ø–ã˯pFo»Ík«Jo»ÔIºbß³ºd €¹´ºþIhÄ\æ!N èBë­ÓÎ+{æFúÎ`äkU?ìûpä]øòHsa)‹ÈµW»«  «£PnUžÚF¢¹m±®gia×L\3\}ˆ:/oWBèMt>?4Ó¾ŸH W{4s$üåÑàÒkR µ¼få/¡HáÇbÍ>ܘ‰ŠÅr¦®~Öïȱ8Šp_Øz·ã€O?Ÿ×ðÝôS Ey?›Ö›O¹¯)oOÞ=g²!¡Çg(S¼À9[hCªÞµ¢¼©|D(woÓ´ï¯ßéÕ}χ€@ô^ÅIg!jù¡7l^D£åÍfvÎÚKœf~i$C¯= еùÛN:øDÕdŽú7¯‹ž« S Ƹ<`ª#t©›ÓÃö’¦Ÿ":¯¿÷¦/p—ÞýˆÁ®înÅO+uû¦(Þ$Z=P#q#¿ä€!ú(÷ÚUØò4 j TÚ^ §6¨ân¸ä„l´ 0ÝÑf5N=i¸5?WlÒù¼€<˜Sâ÷{ÓR¸Š:Ó+ÐÙc'‹9Wòÿòñxžb ý÷ hq§ªM@LèXãé‘Ö_Ä¡žŸÆw0Ž@ñÞü-sÛJûJ†ïÅ\ù¬áB;;€µ¿(MXa[ËÁ…9‰¯<„ú3‘‡ˆŒ ·ìÙŸèúÈIµˆíN~ý®R1¡Ô4â>¹™-ï96¶ë= ½ÂØLò8PïÒFå/?q½š4"Q@‚+Š€§Ý úNmbCÒt˜îu9ð¢n@h†Â‰r^¾N÷rb“ñö&wMý½Fwb$7VC’8úìˆ9ͱISL½à={%êížÅ£˜6ÒG¢„–©Öǘl€®ŽÔEü4eÄ2\­g„{»wä‚`«X‰~Jz/:á8•NVt4ò…E)mÆ—SyÛ`ô· rd­•Ço‡_꿤ôÉh½vÊ3vj3‘3âârg±ï¼bËGi@‡ JÚ»ˆoó¢šjâÞ¡!‚lá¬ì‡möˆd…¡‹}ãöç=탭úçy"É"©‰Ðø$hbh${o‰Çc·aûUý‹®)+Xuôô(ÅÎÀ9ŠÇ à%Ú*æYí‹\#™w–k©å¨ÍÞœÀ b!{/¶Æ ~¨Â§dåsJ3EûUSã6ÀEê‚o€s½)wÁÕâ«;â>šÑ>à¦T²E&¼I;›útÒ|h'9¡rwz¦Cê+†À…” !×/¿‚¾#5™7!é.Ÿˆ é¼î±ÖÔY'yù±r7óô£\³)?M}BÃC¤œh‹¿¸Ê]üù‰Í¼Åä_d×J„çzr}/dc‡wÝædÀ4XUB¬óqR‹x¦wÉE¿kuYÝ›²—ñûEç#Í[6%^ ¬‘DWD¸ÊVÆ{øu>ŸOR O܇˜ ¶|T%ÀÃI ±“ë®_?ÄŠß’×Å 0Ôaø5¸Lrê©póÅM9 §Ìº£:àH|1Vö§&ýg³û²ÍÿB{*é®s¢.PœiËÖœ7”ËÃa¬ä#{çª0£óda'³K·î’YÝŠƒ·š!˾óœ-¥(˜»àóø=çYü¬²ðV±Ù\€`Ùõzâô_gv0sUu'UAÅä´”Ó,1zX½#: `cR‚E1J„'E¬„Ý’¡’N ´tûIDŽõ¼Øì@‹ ·¤[§4˼u¼^ŽWê”þÊ;ëè£Q‘®hÅeÛgáN;.óW`¬¶Qí±EÑCæâå¸Qhñ· -ÑSëkׇÀÚ0,ï®Ðqj'¡s™î”2àÅ+¦}Ù^,v+sa÷ÙkQ@€‡÷ ÑÔva,§Æ°àÈ1떲ʧ¸¿½ÇtC­5;€ÃMð£‡lñ& €>ëF®Ç¾(‡s1Í´:„¥~‘Ûl˽.d¿t:J៟ÔÛbcÜ#j Ý0!Móý?*(}ýŽÛxóùÛ/^à;q8[ø7‰â _ú{]³g×€„sú…×ÃZõzÉþ^Æm=Ÿ„(g¹þ9©Ïó,?Ù`]<Îÿʃþó’W¥Ä^è9ÒYÛ­²ÿ½þ^·fCðF-Ô¿×O =ßÛà']’ðÅ;ºiŽÒUˆ{fÉBݾ;z'aŸ?È>šÜ´I ®LŸ‡­‹·Á9œýF^žŒ‚r0gÇ bS"äó+âAÊR ú¼d-¾*Üqë–ªáÔ©‘‚” wJQÍ» v&zÂHá›\¤ÂÝ<“ž ìÂÒŒíÃé4Г17ú ìÊꈣ jEÒ­àrW’‡ãPUÜ\87m¬ñ±oöãb".+¢.c4ˆÛºÿðtš®+ËùÅy×-ñs~Ž=ÕÍž2nl>dÆMk‹ÑD ZŸ¾ÃìÑ8£#Äs§P<3<Õ68“Ûsa½ZÒY ‰’nXMl¹íïRZ1ÏM—c‰¬Mñ9·wigª¸<á6ûÌyʬ#‡½Sñô£àÕ2íÜû²“œasä›ÍŠ<èí­…œ°¸÷ÜígY®&ïôyº\॑³8Šö‘»S†_ШNƒ ÂO‹Ž<©ßã;˜èßÅ”àô+ÔI¾a¨Àœ%˜ÑðM¯Œ§#/è=/†Š ÷>a®®ŸÛ,šÓÛAÝ#tR‰¼RÊ€Ñ( /SÈí›oØýDú\=÷7\IÅúZöÀÇöøaúºapäï¼°·Ê°’˜¼GÓÀ8r+Þƒ†»ûÜ™’qólÙ_F?¬Úô°•œÑª)ò[ËS ‹|½!Rf­+½En‰B‹ZùHÀ$H|šis±ï· xª€Üj˜ÎjÞé,:î"F+ìâ™fˆË6ÍÁ†úÐß NÍÈ–^¬Ív.ùeœèD)ÑøZ]ö½{I¢Ü É¥‘…¤nБhÜ ?§Ñ” /ªP.i«‡T%ßN¹PwdùŒù‡r:{ :§CkW‰+éýBÖ5ÀÒ®ˆtAs­*e唹xDöø›Æò4~(•ø–«Ï‚ö0pªÄ9W&ü]ŒA‡ áx—Yø>*üpÒö»ØsGw®‘ÄãÜÄ£"Ï6¼lÀSjä>Çp ¹`11­È 9;Ð<À]MÀGNPŸ£à<æþ·DÀF`9ý¨‡e&x‰SuÁƒ€É[hÎ¥= ˆ_*º‚‰G¨k:#,ç§é%=ÔfaÂêÉÜ]Íǘ Z(-Ðe’eùhå̉ˆq Šý’ÐéFg‰“Å“®”*'(1ã9…\Ï-F¯¿b»â(Açôغ”äx%üøØü«ïW᛽¥Ö³2¶ôMÜræ |s“×µïö­GáClsƒÙ¤ D•Õ£oŠÝéO~%ÀEAi%D }ä·EÄ-^<‡Pq}FÈáy@bÿg~€÷þBJ ÒO®¸¯Ì""k5ª'(ÝaÙ|!”GçÍ9äÓýl4©ý= ·5š™$ñòÙQظ}û<;W‰€6L\yÁ<=Ï ŸŽå€ÇæáðƶÙܨ~ãËMë—ZÎQ¶É¥ÃêFH̯cÙ[.˜éòÍxf³–]IMlôÆÚL>N€wß©ycîÌ'?øa#U’<~7@ú6‚¶Z:·ž´§‰W®Ÿ€ Ã0B«QffY”[ ¿×Ù…¹ý_gŠG€,›PÍÚ•í¾93)5øä5Ñæ þëEçÝ 10G’ÑÝB$ã~D§'åº3-ù­Ä£/ø{}ÚKÍ ¨½è³_·´€þº×¯'‰=[³ê3÷akËF¿}W´y×Ï2Æñ €Ú?:ØÂï26v€Æßnþ{ý½þ^¯÷{®?Q‚¿W%fø{½1·ßµñ§+÷YOòïõïÌiÉŸJÕÍù$Ò‹Î[Bt`½SÞÄcÞÖy0ô“6q›Ž{üà«ÿùÀ®ÙŹ?¹ÐÃÆÄ—<´…ÙXj— E?Œ]‚c¬/†;£âä-ãª:8 %ç0lZµSÿÛ?—‰ö¤8(†Ý® C Ñö±ä=SV€F¨ È1JKÑmÔÂ<é a-FI\—‰à(‘›M´Q-Ê-‘üâ‡`@/ð7Cþ\”*9KFÅ–ÓA¢F"É¡Cµƒ¡°Ž¾õÇ&ß…L,IýÓßÌ~¯-ZhVs\§­ŒCuŒâŠ×Ϧ™1àšûǨ¿zÌws.µ¤X_È›§m8Ó)‚ ‹6°WzîÈ‚/Ëgÿ®P(nqö¨kœ}¡›dü:«¦Û_¼²s䵡»æ*m¯ ™”2-I#"flÚØUj)îWËnd¶3s¯ß\®ÿ6þ=ÚÁ#°4èó÷ÌÒù¤6ée?r†6›{ –@}RŽ+Ì=äùÙ–ªNjÐçèøKE¬»Š@µçjr$¥ül¢¢bwaäÐBbŽ’ªlÓË6Ä6æ„9»W—)!³eyEþ<3h/¬C¸âÅ0>™Æ\ 0¼I•ŽRÐRêzq¢«º.#P!Ì9Ù Ç ú`‰tF%€,Ç#3=Øbò3BF$]8mL¶3<â¸e¡áNª‘ ¦æ‹¤Ì—€+…´wI«½í;¶MöÚ8ñég‚€üÀ±ji’ÍéÁD!¬çÞžBebå˜a, måž~K2Á¾²o-Þ˜xŸYt~ýíZlHdI¦¹g*Œ–{ â#xŽúЉ2Iáh/E‰ⵓ£$~Kêÿj8è«‚æûU1Ök‡YÝUA4Îk.¦™fJˆ±;ˆü`Ä#œ“I+Ù‡„X¡‰é•„òåqLŒ]hà…wTTÑJ²Y £BUÀTU¨ìe§ÓÕ…TD%÷p¦“0b;{ŽiP²L¦É€¤ÒCxTè6ã.«³mÙa/¥ˆ´“•$W”rü±KäÓ0l"|XÙ8d¥ZûÛT@‰›HùŸÖ3ÆqðúŽ+:ê›öÐ`€§~õÀ8—GC û éúÚprSŽU˜¦µáåÞh©r‰3Z½¤T–Ø+ÜR¡Q —Õø¼x€^e=ÂîÝh€b¸™€’=h7뮄P.¸ýº§WÔ(¨H Ãäá:1£Ý*áCôÊîìtUœ®ùS:i=H壸f=»ö4@0½m•¤TÃmӸIJŸwFÁ PÏ‹ |¢éA§Åk‹YJà&ÛèeE7†§TÛU¡\P/É HxV?þWº(#©ì'SÆÕ'Ñ?àäW¯õ£bßÚ+%9¶Ÿ;¡ã ûH!Bšº{Ùhÿ$G|Z ®8ìU˜Òš¯AX Q¾œ‚,‹íáã:Ì=JWj)ÉçóUÊÓ±Çía%£Y½LgøXAÿ‹OZ=rhO‡XÞwñ¾º©P"-C¶ÕÌZ³`_4ŒÇ‹`©R¿wá=2c”¢uæx¾jËÎìˆ-ÙØŠv\ëj¥rêÕĨ۲²æ&Ž9 5›¤k@™ãR¯Uñ6½=€SS=GU°fŠz‡è3P>ÓZÉ}’ÀQmUסvÿOíï^oÖ¿!:¬¹Œá¨Ã+†hB$›äú`QàQ ?jU—ðÑl=~æwJåíÿïyáµßì $_ªŸ=JU˜±€}ø#þœ‹ñ›¿­í+ؾúzGOÊÙÍ„U—Êg|ÄÒ¡H­Ÿ‚kýÖ¡:¯C+ê×SÞ³8Q0êýðM›=ÔE^þoˆ1€Þð;¶åK]a/÷Ò‹lQ»°”ô£È÷ˆ¯ò’ÛÕô2 ð óè2j.µ8!k8Ã/yýSê׌ՓX¥ö Tææý×^ €Û`çÚ¿ï°üägï‚ïÇ’˜ÒÉ|Ôî žÅ&àz¦ÿ+’Q(^ø—Dç7öBë´Á·åZ==Z3‡-ƜçJ e·Ù×ç WbYw"G±`ûËó=æ-”HQdó%%½ûvÙ3:$ãÿ$ÉR}ÂŒ»7êt­Ÿ—/ãÒhê™:nSL2ÌäuW"’ÈqXv¬u¢È:Ò>Ã;bò)â8Y{ŽƒnŽ÷´SŒg§ÏðñÀôjQvç£åºo’Ÿe¢„ªQ¯]÷ü73"\ù„\mcVý–BTx×¶¯Kl%§µbú¦Ú;¶ñ$HºökxRÕE¯’ÌonËö‹Ö¶âΫJÛâ´Eü¡vúÈ›ö‰ó¼úF•%ûò^\þ ŹW”âºËÄJÉ?~ÅLg!NTËšðp奕ֵw¦²Z¹ uÔÛ‹iNi™~ëå@Á•ï§žb‰‹cG³§‚P€¨¸E:_Û«ˆ½¦²[aŠœ@gU§¯ENí€õ\<v1Ž|Þ\w[ ¼8–ü´ÇãÁ{Ú—úË¢T#Ì_M1ÆÞU’1Ñ=ƒ*'8µP!i¥I¤Ñj«'•¿°÷S£y¯çÁ{>"ö…p˱£Ýµ™¢-Ê¼Ëøí–{£½7ð¥ÑŽÍrI}õPŒ;#$¾Ë©ËdÓÌuË¥! ×Ô¢¥÷n¸oÓÈ5¨ˆÒ¨ýONÖÔþ1ËÂå2‘({D«¯ #VX(5…%J`\1¢Ø–î뺮¦µž,ž¸áŒé{Eå ª1ËâèÅÙö½áÉ ³ùš›çÊ=äà§Ù0 ¿èý{gz‰‡ôs@² ®d²†3C$›û !3n„7&1Ê«±”ŠŒ@ÌÔ¢8ç¡ ƒªF6nÐIJ=8I~Ú¹¹[à‚R/Gƒ-Q €|¬j,E÷¼ØÔá!>lúu:6hΫÖ¯ ш£¸ˆMüÌŠ*:r¶¸hj¡#ˆÀÊI–5"õŸÐ§ž"³ìý:Nn9‰®±#.*J»€õß"˜«€ã®Ìs➦ºy‘—É/ÕŠÀXË[‡6úås„´Þ àJÅݪ8bÀŠ"–H‘5QOîvvœ} bxiÁ|‚YTR„?äqQeél(˧¨E¡~4]@YŦ$Œ­¿Œˆ5ðn¬—fîÊT¶­Ó®X¾™Ánï‰ä¾ó?ð¼Æƒß€Ox уø`!b¨zZ”,‹Å]ûØ¼ÐæØ Ò˜;?0V šj`6LÔ‘ÌH«âtks­êÆ>ÌǨäÐÿjõÛDçcóî9ß.¤êVÂ(9P¥Ð.Œ=Aõ(Ÿö±bÊ)Q4õö;«}uþ•ÅgÕ/» 'ú–×*À³AÉßÒL½¿z•0cDðǽO­~½VûøÍSn^ð:¿I|Ÿ<„€€XšˆaÀ£¢tæ]&º@Z6Ró‰”JòµÉqÖbxXÆV¨§Äï·:ƒàò§dêÃ7 ]1¶õAL°2ñ%Û‘[mêp×R'š¿Óˆ³^Ø{©u_Ãgô<Ý»2yÉm靿¡Ìþ¿à飤º;Í~bì ?BÑÇ-Aï|ÆT¿èMÊ ¾¹¡8¢8S@^ðT ½fÁ(­'ºb^¹?/0ÞffpÁÅ3õÉ‘X‚˜ÃÈŸ+XúÎ(¨».t½Ô'E­™Ôf^þM§‹‘†Rìh;ÆÔþY°Yú´fèê ÷codT>ê.çµ'<þkEç§ €Qs ¦_çuñì‘& δ⽺9¢˜†”Eò5MÞ\ÊöÖlX_¿G¢ÑõÓ¯ÎxÀý:Up£6p•îàF #.Ø;Sî©emÝ|zêrCz0Öý„Zøx—%Äm¯€?j‰6ð;×ÍN&bøòºø¤0*ÖúÔçò9ƒˆhªámV=Ÿg€€§ÐãpŽï`K™A ¦IÇ‘QÉâifœãPü”§&4"[¼båÖ›è|Q9|ú® ¹¹¢÷ö^"£@|®$Ëu|@/Ê+wA»z'>hs‰ã~H‘³ŽRg´}tÿ Õ’ º!.§D!:o®Év£ç)çô¾“׸¸Ò‰ÜB^POœDÔ…ðQe~ñ76ˆ dO1ׂ6¹ËȰÿ…çÇ5÷]uZ¾§ŸaŽóÍÀ¨cš°ŽÓ}XR—FÐX#.è‘%,Kò,¿7ÎNWTœ@-¯ÄÿÑÝÛ6Ž ô†®Œº0#IàO ñ#TÊ4`·m?ñè!ŶYn%óèÍwÙ+Æ>>T›‡Ð›YêgíÜÆE„Ît4ã@£²7w§èµXqÌÒ~"ê""%@•ι^!ï0²"'n ·T ¸“~«7r§ÒÚpæFÛ ZŒ³÷Õ–n?iùwqŸA“ÄE8SϤiV¹ñ(3dœÏuÅCv;©€¤¾¤˜ëÞìôñ¹á'íªT_~æY¿#ºR-üun‡ÔAoÕÀäëÜ *ÂÐçA€ç”Ž›´q9H¹7©»ˆ]«"éìjS61ä¤OÊ$îfv£4þt šàŽ>£È‘yw”Jéç@Ë Œ Ÿ£Ú² ÏßyO|\˜<ìg­ØŽg÷/ëÆÂ^þâüU ZLÖw}âÿØ ù;ycJ`æW!¶¯À¨®VÈ(ÆS*eu«‡YÈ´w §º.MzÓ›o®dŸRØ[-¨¡_‘ãvOV¥‘5dxš‹Ùß|ët)±Á(}N$z h‚…Ú`Š£gp†BJ"Ô¬ˆ­B¬Á¬(=*‚‘µìþiú6±lŽV±¦YÔ4ý"×¾-µc{"0T9¤·Ô¦:f§žRËÖùûŸô{‹pÏ662eà%`2ƒbÃɤÆÐgÃÔ 'ÖDÓ0²v*E9O=f‹QÖ]õíQ¥ÍˆÞg8c*ÀÚÈÇÅ=åZ¯ÓÚ nd¹÷ÎIq+ö“À‡Yï[?Æ {7ä,ʟǬìH ãjjãnôüŠçNe€úgÇU €nE‹™Ø¨k ^ºâ„ªïa¼àáœwô*@ lkøŒ²ge9ºúMš*E’ß;Cˆ?ÀÏq ÇÊÄÓR``y˜G¥©æË°)ârRÝë,+}ä3ùüW‡Ô®ûç ÏÇó”":ªÇßrnWµÝ+ß0·~K €Wæ•7:„À­Çóù|<Ss÷ŠÎßòE!»×D=#ü Óh­ÄL¾àõµä¯db‘{»}}z€Þ¶ @öJÃ7.€ºøQ¡óÆ„.@ Œ(Dükaß• ž2]n_g:›èá¬JíÙ>Ê%‰­{Ÿ£­,©(ô2Å|1ȶp‚.f÷ — 0›½oy–rÍ’ü²ÔvêîòV 5¾eµoT´LL3’.˜úÓw„ûÐ_ F—‚0m:^“>Ý÷¹•ùlotúßp! `*UéÞ¸Ç.ÛLŠ«øtË„•ã ~ Éû…å’>åß1'< š%_Âï}ÕŸ&6ðUK4bxV?#*• í’`iÕ(¼Ì HqÆŠ~“­X³’5ŸûB7ê9…ÛY×(qoˆ…'~‘!š“Qp’oÛnjoàoIž±ÈëªäGW–KHÈÿ2Ñù׫%qS櫜 ™Ö.$‘1çÜ{ÙqQœÇ¦SÔFVÖ}%^›7EÕÖÕ‡»úŒ°–¯F 4Z¸»Í¥‘Âæ’g¶žo°Ën’À§Ä'þ)R2RHÓïÙ¥£®˜$ÿ~ùAýÓ5µ•*“f£Ñ)›çsbÔp¯ç¥Dn5§WþHû"ª©ðIWL'µÀâ ãŸëLþÂݲî¸l:Uyõ ÿ[W:,¨v¸é1ÑþC5ƒ KÅ$}uÐø²³sZ°B­êyë}MÖ‚Úþ¡§„B—ó®ZWµalr ÕQµ¨DCª8j©xîî‡Õ@²$sçrÊ«a œ­–+1´9…“EꤰG‰Ó¸Öµ]ˆ&õ(5åîDK{+¦0Ü4*‚ ¬M˜KQTçR[Ä BÈ%|º3—£J'» u|IÊH*ñ„ðÔUb0ÌD}ôW"…ú''u}˜R§ôêê?¤ÕN„ošmÝ Ç~ÙuÍÖü äyÿ”€8ÙÜË6õV8î¿1ú‰ÿ€ZlŸÝesí®ŽŸ{„‹È)³*ÜJÓÆð7r‡D§7:“PîØUtÇNDS‚¹2ÕK'gGÅ$Y“óW\ú?­‚+†àvA,´ûŠ׌flSÐîå®å9`¤Ù‡©C)Ë -öP‰©Þî´‘0IÔ‡w-+ 7 ´Ü»^ê—Š¬¥Êy£ç2ÐpiŽt(wlÇgU :Ñy¬L»r±ÆU¢áé©[èL¯™}ÕüdñŽ·c!g©’Á\nÛ.ÉóTä[³¿˜tG²Q]U8*ŸÔI™wA:ó79k=mBó£Ã…ö‚—<#«5_µ"%„ yϨ«4ÐÑH™¥%ã?xV&wQ.StC®¢¬wÞIßDJ5‘ýöÒŠ(:HyO›ŒBÛ$éVnql\„àÝœ™¦ŽøÆàÖº-t, iüæãõ•Ü*A V)/1¹ƒ—½¢9nôð¾6 ã^X`'i:i(»Z«þËkÓ“ÈY[™6¼&lÌ‹‚'<é g…že®RÄFÞ ûnr 2);'—oT”Q·w0B«ÝÿxéÖ‚9ùá"rêj€ `pe‘ßÀLÜP¿õ¨fÞw½<½Eª[HMŠßešÚ·±,WûM6ô}Dk°BV`£P+<€nZZÖËã %ͦl½§3—tEЬñY›<.Éß)T.#[Ÿe)Qëgñ¦ü’°kÆióè´-~T줌›ßF£‡áŒe*PšUòMž¸¦Ø°ÛÂ}ÚÉUÓÀ(>[{Ó5½!Zß÷Âì©Idïa*ÀÑ\»oçxÝèš³Šß‘-G¹ÞÆ]»R„j6L¼ôf¡¬Å¿±ìÓùaLÌš·<ûÕTRÿbú_<Â$ÌV–WšÏ¬6¢Æâõ%ƒö’BѬã~]oªN~ |óÉÉ-óÇs&0Ðóù<‡>¨¸w®­9‰-ý2#[×y ûßÍÇM'0áâÅ$­÷¯`À¢Âû//ÿpÓÙ¢õ꼨>òkø‹ýõå·^@t.Ju»Ï¾Mµs‘m÷;_´ò áÓ¥ˆýÑ=o;œlÐ(1Hxìô1ië'åÏ•NB‰\æóv®Ô)¾8û…_M@¿ïÏĸ!75w;—Ü 8ï§Ç"Ÿå—·†C¾}ÁTïÏÍ2”/’´d–÷›Ñ«+—½¸|”™“ïRÀ|‘¸zä—ø·¯ÅŸ¬ônÊ"#•˜¿|t•·ÄW u{VT[¦o †g暨ìô\À«C‚· çVôVÞ»»>G6p¹jÅô3¨‹|êQ~]TV ž§½ö?ËñÝq#?LtþmOíFkPþ¨3oÓÚ¡6/“ܨc›ÝžÓËl×Ñ=Æ_÷5z–Çï oÙ‘!¨[Ô§‚GDEt˜en©gjJrXPugä½WÅ­väAo"ÞàÙO|!oFëÅK)W:qkÌQ‘h–C½›uUkPÛhŒJOžò+Œ‘Ç ï1$_ìc‘:€íÒ+Í:¼L—«ÊPàé‰ Þà ¬¾g 1¶ÈO¡ O°ý8. ñÑ:^Á¿Ì×𜠢6£®Aè•·Û8ØÁØÞßí¢Wô†Ù=ê ìûR=ã)Á~Ú\ðNPÏNÓº“÷Hw(kÕÝDËåUrå `Äã£ÚícgVh+áæO$RÎaÂ!58œ™½£ÚrÚ)946ÚQÛää0’K¡Rx#@xJF°òÝPU®z.¢Ó¤"ÊC'fʵîXE ù(Œ¾‹XŠç‡”×ó26cŠ´ƒíN•'1  %Ȭ°+\Å$Þ±E{—ÛÓ#ÈûO+wÀ”˜@Îv l)Ã5i1m•§|žø_è‚ ŠyΤ–Dl?± „ÐpãâDb]üÈsŒ„gdPlÂe³ldÉ ís³`s\-qr-¥Ÿ€]RéüJ•@FÚ›ƒù’SV÷×g³%M—LU¨ò ®ú¬7èT u Ï›$Ŧ‹¦|P1›S—¨ó…ê´M÷¶Ñ¢(“µ?ýýõæÙq®AŒ{NñLtNZ6´ ®Ã¦‘4±cjXãç/ž¬ :Ÿ¾2Ø}];n¿¹µí]ÿmªº– Š¿At>¸ž[Š®Ç·æ=ÎÙLß[€Á—fÊKQ¸¾]ˆ…ˆ+Rì¼ÆIþ&ÿBb&|Và–ÂíÈÞŽH¢i{£œ)÷]¯+¡O„NFh@–c3ɶ"½&> -cå$oARyNnp÷¶ìµÄºe­èI*"‡½ˆeQžÀ÷þž©<„høZCyÃ8¦F”Fâ1ØfDxg|2´4Ûÿh‚¨¯¬‡©È? ÙN3¡Tõc…ÂÑ5p­àˆÀ(Ú@Œã~ ÿ —H¹çAV•ÑP#Ú^ °¢¹7´®¯Øœ@yG&…^½pþ ‘ŸšÀÓiWµ;QlU’»<·Ðxå»_÷¶Ó®”%½)RÏÈ| Ù,”M«…’ô³ÎÊ·¹ñ˃4òISó¡"®mf ÖR±‡T8éxÓ¨àŠºÔ¶‘QvõŠˆ“†„C×€µPm3¢‘–S§Û•ñÔ« ¶íª¹·i-öCúÞ§ûp:g%…ÿa¢óåÓº|’ó›vý¤÷u;òÊo{3àå~¯Zy<{ãžþ^ÿÚ‹—¦·z‡ÃÞ<ñ|ráÿ_½äß(u€?e›¿×¿ðR úõ|>¯¤îÿŒ“øÅÞd¦‡w¾ÆA>›Àþq1ù[ƒä(Éèµý=ÜO3ÿ×S»¿×ßëýQ o†µýƒdzD¯üŽûCÎ "Œ½ô»ÿ€‘¿×ßë§èÏ ]üœ¿üîÕOŠ[ÙÖ[Ìi1Ý+A>´réë’æÝÙ ŒäúýDõxžñ†¯éõqÜí` MoüV û!EŸWúìÖö]’æÍ¡<Ô—+é ðZMG+1veúö ÑD¿l"F>Ø Èÿ+—«qv`ôÈ„õÿ„¤c¿ö^CI†©Çú'H0[[»]Ÿìw¶÷FwÑÙ9Œžï1¢VQàõ£s«têOv¶ .PÞJr”=*k4<·`†ÌèZ@ô/Æû ukîÐ6¨q ÞýN©©N7E.rŸÚg[:»šà˜PÚÀ^b<¾MJЋ2ƒNÊ7;žkG¸ÇÐ9HtF­êÛr› Áay úgk¢ŽyHÙ×v3ÁF},è”z´„Ý1¦`I9TÞ3u v„¦hX»¬×:%•†[ßb¾vÍÉa¶è<ö4^akλ× ÜV4@³UFØ¥˜%]²­¨ÈÄôÓ Ðbj’n[w'F%²$íÿÀiœˆ|Sv§•:¶ž:@ þ‚ÚÙwÙ Z¸˜Ccfs&öÓ=öÞ§Jk1•y8'2—%A!Ï‹§ów=ùˆÏ˜Û>ïi·CÉí*Õ‡·Ý¢Êèïé2Êé}*­üâ»eº—&AqÆc;¼W9 VÞ0¿ß ¶K¡s6ùöHTäúRv•þÛºPêÒ~ˆÁe䕃ÆCfPbÛ?‘&Š|çä¼r%“¹¥êãÓ±®Ô¡dÿ÷pªùÝI£`EkîZÖÍQß´«@ë?A tÖÍúÔ¹1?aW·0lK»k ^êLübÑùrF Wü]…íWùÝT †Ô¦~(øã¸‹K¡xifÆtk…,Á—ÓêåëätALö´n/|¿Fʤl f<ßÙíRø¤¢ÃKJÙÞ_¡mkN‡tsÈñ©x…a„ÂYûÌDŸ‚TX;ƒ*³ÿ§»óüÁ¡=çí¨¥sj†xõùªíåÑ£…Ž«<8&³41æêtpfKoÀ÷?¶ ´w&­ßM¡\éyŒ «­an#0b¡‘w»'ÚVsœ;.Pr“@šth-Jg_ F’ݯîÝšãéïcâWa…:ŠAF&é*˜e~í°è£“uhµòúM¡ÿ¢£ù¢7¯µi/œtdžtÃEiìª6òc5ªAgÆtؘV™ÇèK7Ø!ìè%G?ç·¸Þغ®¹;Û€6ÔøÍ6ù„¤#Ý\® ÌlÞrYsÄÔÞ… oðÿí+yfßå*ÑÉ­?¥Ê!Ö 5à#„¡wäÎ¥o+ƒ ªéD‡h’#;¹a±f$ª#}2ø•‰ÀFÛ5"©¬<¯ZXÕ;/ÜÎkj•ÈúÆ™Š {½e6Œ¨v%v*ÅU®tÀt$²›G»Ã«íV\Êߣ]:l‹Ríξÿ€ÐoðñðÇãù|®>­¥ÒÆçj•° ·TÖš‡?un«ˆÁ›Û‹ã@‹³C•eãx”§]¡½üK¶¤¶èÇ<<2í®éŽêª¿y6}¢«E–»K¶Ö›D“oÇ’Ѫ~£è¼gÜîõ¡jNÌô'8Ï,“uùl¿å]C PL”Ûº÷áŽ2@8¾(xà‰Ÿèœª|iVµu®u¸Ðu‡9Ê6ða•kÕ£¡ÆÄÃǬy2Øqç1" N9ÆæåbÐ\4&Ø^°eÎnS`W‚s|!!C!µºȩ̈ý&åfQ#©÷#5à¡ Ñà&Cmg¢³‹:rƒ±}·°‘›áØm€].‚ÉT´ïl7Ei{rdÙ{" ø³.{ÎÛÿ §ÕR6ˆÜ_êHä°Nä"Ȫm'¶”@wý¦-J"S¸-´mv(NIb´çÁ–Ýͦ*`Ór’Ú‡.cÝ«:äØdZêj/ y”Ñ#ó¥˜`÷Ök,å!.¾IO‰xýõÐGfûd\d¬3U$ÇTÐV꜒„\çÆ½C¯†,59)ì½Vä.»X1·o؉ÆTêÔŸåI”ÑI+ ̲‰Ây1æîÅþ@ïÜ I3¦z@Ã0ô“ÁŠ M±ØfŽ&0­ 2ÎÐ ÊEéû`ˆ Ô#…òó­Å[@RÑÛÓBD1DAêP9e#“èKÄó*†Ô^¿ñᡜ:øNFA“ž+ô6{¨Êõä+KêØïÇ]ÑX(¯Ò@í¹h¶‚òIXßHÒ·95\ö³Äžñ±AÉVlîÏâbš_W(H|8ÀQ+±)TD»!Bçh¾ÍLÕÊ%íAÞ“Á ÑêË¿´ÐU‘3²R¢mí ¬ÇM®+ ŠQÊ /À-ħÈüæÛØÊ»ëXÂ8’@óJ šÅÛïzþ#™\²°Í$Jq÷'ëÂf-ÜE62©µK±ÖűѶtß „Âüðò´gq©8°07'Õ4¡d•Uµ7É|AçD_¥aéðŽ<ÜÇçç¢ `¶*‹ä+û‹3„÷÷‹ÎÿqTÜR¯AÁA£ç" „þ×#Ì+“ VC߸[8ªu)^eXD¹Û+Û=ïùãuÖ·òö;¿é…o¾€;QÁ¯{IÀ=GB k?ÌÝ»ñç÷z! ¿5-ð/[¬  ù~¨‡‚E˜¦Ô}wÜÜÐTݾåî h½y°y ¤Ü•,I;ü`ðäœô*À'/ͯ±xð²âS®ï>ÿýƒDç_Äx¿/Û+•ìŸ ç¥G§c†_S· ‹¤©»‹U^½}ozu$ÌwÓ.ÔJµó°÷EtßõÆW6J£¥ƒ½´ŒåH:«9uÀt:(—òZô¤sr±rjR±¡¦ÕOUÝ=v=MJL¶ØêjÐ/ï¼Æõc^>×âbæAŠ)ÀHîpé\ö'¼*êý:zO®n• g˜¶l)›CIïöÁ‹4gß8Y¸ŸFt›òzg¦÷ÚUÊÉ! D¯y>‹wüS5:zsMW jÞÆôè:~ýØn«{çWd :«¨’G´HDÏ}b›-Gšñ¼@5-ân•=#M0¥[b­èÛý.rÿ8³^¿õ Ä×Bä‡Q8ÚÕ__ ˜n *LQVM|—lÚQð(•(B:~Áµ:ã§l ²3IIrI/¦ÙrïÝí‚Ó\é¼ 6’jøMÌ ®P~&Ö\jA.q‰Ít ntô]´Q¿Ê¾`Ì•s';îÛÆh³ùÌ/ò|rfïÞµÁɼSd.ñ,wÝwÜtG…Çž«¥œô0ôrèØä®­þƒô¯ùKä<ºBþXÑy²ïâŠW¶jQÌŠVrؘ«7Ñ$WÞmµ>”D¡j­üáð?oª£Þ?ü‹Zk%ÊXfšJmzš8ß¼È)[ GÜ/JX~Ç׺âJH½ÈÉbâï:Iîœj‡±Þ…øXl¹I”êÊÚeV„„{œ7RÒòÜ­‚J¬ò2ÚÅ!Èóù´z&Ö¬tOF\’Ì7öp}¬ÑÛ¥ ,BX nˆuÇ–¬ÀI¤²³öÔÍç'¸& ¸Ûþë!ä¢ðd¼7#$M5¤LÖ!‘raTwÿQ|4Ïë ½q ó¹ŽDd¶&¥å˜´8ÿ dáq®$©¥Q»œUõPiS® ¼Zv#ovs³)%‹?e«vŸñÁ¹açxH,ÜSàÍÄ"ÐÌOÉüQrû³ø@là>Ÿå"bå0\NÒ1û÷¾v—ÑÚž–qÑ à ´Ûò`9ÈA‡ÁdS”å~¤Ýz¦VeêGåå[gÁ.z£»áVš Z ! cÜŠooµÖ]ý- ¬.I:ræs8x.c[kp2B%¡›VMWkm:¿¡è*1í-è< ©Dl7îÓ÷hB4çÌBÂ4>Y?/K-w§Öhzìͧgç[;O«rÐçÊäX·M å&EºCW¸VçÐôÓ© ´ã{ˆŽT(kj™÷s·+½²N k5"ÏC€»vG?×»pd6×" •çe\¹¶ˆª@ª´VØ9z{„“òC:‰DK”I¿HÅZsN/í´;2ÒRƒ¿,EÔÑû•ù]#90•Ò*#ˆÕÀ§6­0ÛIÖÈäw»ÒI‘íºº¹ã|¨;¶6^®‹£=CE‘ÏB°mOåûÁÍ+Ýè=sÜ)öIc±þ<ÊóP%H;=›áç4—,"ÌØÍíI"°ÀíšH2ÓѵK&B;ÑÛÔI‹“Õ6úë³¾‹Hý¯wO._±7÷UåÂÚb0”uŠ‚ÀáRƒûg2úM}+IDÌð®ŽÅH¥ºw`½7ðô ~ È®.ø-»E9¿ ;Ä–¨99zîݲxO$·}ÿ3ÊXÁ8Æ¡On#Ð^åÖ áyêRñµÃhXƒ:ãKyÁ$ýq܈ŸòòmÙ§“I]é"²À!ÝeG‰³Å07‹h¡šP“üA¯ P•þ ’X¨ªB†Õ§Â¼žÀÜ·Õ¼é nº¾ƒ.9Ëv‡ÈV‚³°ÖŸ¸„þoœÄ1ÀíP€¡.ñ‡$9+)à ÇwYj6ߺ¯žc'Në½¼Çî­ÒC_z³õï­³ó«Dç»_«}¾*tÜžò†®·È‰|£>Ò—'²øÝæ€ë½¸aAÞÝãÆ÷å@5q/e´‘âmÏb€±$Q7í±ªO][Š– K£:>f¦ÛJ/b¯.°ö“×`oÎ1XH¶±àÊ'–˜ûF»ƒ“´;´´€T)®þYʘ8|“Ì1‰ðDûS‚¤P äÍüû›Áˆ7Ôs~¬ÙÏþÓ+Ÿ£(¯…™>t×ýœ¤‚fB9nªÁsàô6Ũ8- ¨ä³j¥ãcf_µÍÆ>¹Þ7ä ^î¿ Àÿ>ÔœÖ\ÃRCór½¥½¯ÊõÞ½(%[]4Õ€V—ü¾AW'õ[®³t xlÓú/ŠÎ°ðF®~í$¯·[€C‘‹ãÚ®Êæ˜J…ËVX{¾Œ]ŠtJRzŸÿÅ“ÛD…ÃFö« ïEÑžè$8̾xA-UDÝrÚL€n" >XÏ+Düä †6áqœ Ž€}’ Mbj’ø ·LjŠ‹êhÁdÌ:y,Å|#­† IJÉ@ƒ"â¡pTCì•@1'Y£Í}ÎÛ욨4uJ(!y Gü*xDL†Z+R´íͳè™uÈöQ0Èv¬wÆÙÏò²±÷êKËŸ–pPnH}ÛÝö»>9fÄä°ÛÑÆHüÚ—/ áŸ.¦?|tk5kú·Ìžr’y›® ° ¨Äç;iÿ阦N&6¿Aòά^°.NA ¸@‡XXª*ÿ‰û·©-O{bö¢í´õ%€JY)=!/èÚ¼ÛÀäa%úQ®ãI¸Fk?ÉÌHÇ&»†A%™Ë]›‚kþàs­¤ü{?ã`+jË âÿwŽ7ŸR¥Ž|í5EèdÚe.<…˜Þ§H·ðƒ€ t;êɆ:m‰ƒÎHÅŽN®dï—=¦Ó‚Ø:œµ­^οŒ†ô]‡ÒRÁLÚÞñGYùâPÏó‡{Eq–ù =¸S( þ&Ž@}ïu¸VÔs°<£N°EíX¦9ž³§»(™.¥Ñ{ÌÉ–Ûµß俀ø¿¸yAèNÍ9w:ÚÍvM üUú÷Bd*Ćñêe_ÁŒ+¾€áhºÌ©q¨î汉­Òʬè-¬ölåìÍ_cÔß–CD¾âª JI㸨¢Ìiã¥h~\. Ï ãù-/‹Ð¼ÎmK!÷8·¼„õy¯ømyŽo|å¡1-Òøë WbuÂ[}[Xþ „€"•¨^ظ¯xØ—l3Am /¸"гW<ˆpT¨Z j J-VñV"ßlÙGÇò?ÓyÅ^¾°!wÏ/r;Y…,¬³wX_—éï:'9<àc2/Þ%Ù,0Ö+·YZ/w`ÍÝ5y9ÀÅU¯ô¢Øå‹oÙ °­ï%¦þÊËül€ˆE²|<ÈÏíØ›ÀŸ]Z+Ç.m‘m„ ©jÇ\Ô'½¯œ—€®ÕæmÜó³c:6Æs¿Ì¸8dõ5Q襑$gˆ|s*ÙT^ŠW;`8 ¼ÔPmÉ?…èÍéÂüÕy*ÿ¼è<²ºð+ÝÝïNÊùw^_¯ ân ·Ž”ƒt—lÇÌ—k\¥qUÖÍË}—N#d€(µJÜû–üµAçñ½—÷]5€l'¤¥¯Üá}+”£¥«z‰ŒÄ@pÌyÔ7Lƒ àãb–PnÚ:#É3´S²Â±ó䓿Ö}}êëçØlªÉ¬ý-y¯KLn"«i…Id–K?O÷Í2T‚;Â7e”jõo‰&àÍ'QÓY¯ÑXÔûR¡r²}6s“pm?Ùv}[ u1¨øÌóA±Î*  T“ gñ–hóv4ŸíÝ*@h½¢óoŠÎ¿TZ3– ÁÕ'¢÷䣧]š{²‘¼…Ú–-²Â¾N‘š•Ç’wú¸Z1n§d¸Ýú¤ ’‰ÏSŸ–ƒ'!º¿eU ‹Ã|ƒ&qiϽ‡Ð)xB“° ]ü„ÛJ²ìïñažê4Da‚Kî”§|´º]Šœcë*E&ÛlR¤%sמ^(Ó›ÊR¥Lÿ#£wHd9VÓCláI½Ñ²qÝGÃÄ0êq<¹{ÙfÄÑ!y@ëÚgCJ®0Iqd”÷ê0‚¡3ã ËlE.ªYH”WÂ#Ý5í?±3eH¤::×:Dù&2: –Ëi›…—4[£ytÈ!°­©–LS}}Ælg‡ S¨ÇJWÀ ɧè½XàN;˜áa[àìè“5 yñÇŸžØE♂¬[áB3?dó%Ë[ÜZ™ †Ô:Ät°‰pà‰_g'jp¥ÐEýLf¤ííXh‚-róeTÿåæ!‚!‘¤¥Ü{`Y³ý‡®Ú’ž‰+#æQ(ãuûéùëö°:kœ´µÂƒ qföY QP„e·5¡‰12u~ªöܤB³Ušæ Ss´‡oÚHX…A4°z9®›kòÈ‚ wˆ4m˜ÁH$Í;¥Î…X¨Ý6ó&¡Wô‹¬Sbƒ:|i—ö[¤'5<¦cãÄ‘œ¥Òíg!ŸAs{Àƒ«®àÈô"{¶@2Uã‘âÇÖ!…™1e+bV”ûwÎ ï6‹S5;·`oÌc}Ï$és\àËk3ºŠÂÆiñÓœ DMt™,•dñ1®ùBÅEàÈÒž6ÿ þÑ? gŽÒ5ø5VkgÒÔÎAÓ´M•4pÁ¬4¤ù|ÅÚt=‹kQ%2y-R~5 œ§ k¹çâ3áïÁ8Ó`dRIÌ«ÄBÉÜ)Ì %ž €}ôŽâ›?UTÇÀDRØþ±h¨Õ¤¿d@úÛd¡Õ1˜c¾Ùeûý8Í-âÞƒ‰´{òz‰T%ž´'Ðè(p(M ì-&ÄC–øà¾Q’̆e¤õÎ*¯¯Ù€b˜ÖÕp4 ºš7·Ãxúâ†SK}Ž•K;oEaFæ”T} ¨?Òåš šèI‡LwåùÖÚü]‰ƒñüúêÕ½¬Igª—¦£Q‰D,T¶°ìæPµw¨Ù“Ä5ýÝåØRB?AƒëM € |è*õ~úW2¨Rùý»n lÖ-ÊÔˆ*û2ÂLÜt ©t Þ-2†­C£žƒA¼ œž²–‰^” j½?zZ2x4dœu¿ìV19°:ÁÓÎ@´¨ kA¤i«<£š8uïfv[g`VpãÓÜ͹H_ïKRnö˜ä·\e1¢hÕ—4²½ ‹uKᤠ®Žü fr¶íp%QîPpÓ˜)|©pz“6‹aÞևѣ–W®ù†-~¦SoåT²,*Ÿrröý´1öUå²)fO#5:?¨…Œˆï¢m˜Â<>LN)õöG6PR f§ x'œãϱU™Øîtv‘›µF°L°°ï=çírØÀÙFݦt“´JÌqÏY‰gÃñ1jÿ *4BËo X’kˆŒžtñ¼Á!i#]“á-D d–´½M@C®³kmV¿éô¿ÖŽÍSìÞ¬*¨Î_• FmS¶K×?Ùj_È-â~ ÚÅg‡ˆ±àÆü ªwtÁgÆfZg†ºY9toä$?³ó¥”Z%,ÙÛ¾×bÀ…Ž¥â2ΰ×N ×õÓ6‘gßÙ^KµCÃ2Mb޶ù¡Çß9l¡ì‡’×»±¢ ±ºì¬ë¾)NÙí'Å•DÒÑG„FahaËØrˆ£x¤6ÂÔ<”¢ÈcˆòFˆ]–a=µ™¶ Ýy4³™ Z% _¢©E± ¾+ÑÞŒ¢­O˜Þ±@‡8ŽÓpÔM¨ì3r?ʺªhZ Ë €ËDvœ¥Vþå(<ŸÏHG1I$‡|ŠG>ФØÞÏù}¯™ЦÌ]“ÀÍ<ò¥¯![>ñ]½‘ÒÌv@ž®zAøAhÇ<¬CÏ@®â;õŒ#7’¦f£ë­~9çð"uë3tkµVGDšqH3ßÔE!B°0ÐR)ˆ“£6uÈ~) F!½•EJÐ’X×¹¼q¦âåŒÒéÔúDçe(¢rU¬ÈÙ}nÏWŽ¡_Pé¡„U ÛW ñ ÿó']²˜’ÇJŒ( Åaù*®Úu5Ïøg&9?©æ~±-¾Ð YAj'ë̆¿ãñújÏ †ÝHnú…jñ°R‹G€\Œ5«\!÷å›Ä›œfƒ¥’Ù‚ûE“wbjñx÷̯ó ”'°îôAè•g‹Ä¥'0ØîÂðcjÈ ðO¤K!LbN«D£ÒÂÿ‰fùÌi¨.`ºšW©•q“¹Ñ¹Ú‚äè–ÐÖat†ñ&ÛªÏfç&“žfUþ·_ˆPqîx¥Ò»XEÄÆh±0_†÷Ø[ŠunhwoTèè¤hÚö•ÕVyv«±C/*_{Jñ£SB[¹*Ž­Q_$] 2ä~O1ú<Ū¤7ÉÍ÷o_U’Œ=NQJN£Îͺ¬Éuä¨t“VVž7µØ/ÚÜøîâ&È %+7óv*8”ûw©RÀø‚tifB;“º¢¢ÈâÂĵUcò)Y…Õ^Oº·÷x!j€Ÿâ·£9¦4I>E牢̀j“žžR÷«‘Eà¢&áuDTŸï2^~d C;7¶ÀZȲ¾m8yüM&|œH\øtáK·bgá‚þ¼håÖJgší:~y¤Â1ôæ¼-o‚p†Á‹ø[“HÌšx÷¾LIѨ|-”iȨ?èÊø‡ÊO^ôªwâ)UrÂƲ竒ÔA±… hËåSÁf®¿æšqœr’V¨ß&:;È–àŠ{‹ù†óþ³ˆ=ŽÐóùܰà—RIý{ì¨çó9òØÇã//+`¯ÀóÇî|ðKÆÓðÏhLƒšÇ…ÝEZJ¯lrÿ»ú$@"x>á¿ÿ>Ü÷•|<³ˆãsþMÞùÓâËD8]’þ„w^þ0ôÓCåçóù;£ýnqظÃW«;¶£ˆû¼*:ËÏ Møïu!%‰:X-»~üŸ?1•éÕ æó³ôËö÷ú{ý½öb1x¹ç²›sÚ`lç½±û¯/7Îi™Ì€³ëؘÓJ–°ž'“=Ø%ƒÑ£åSýVî{ì`ØÙ«.øü_&í 1ÕÒdsÖNý?x³¶¿± ÄÁþýwøË¼äx…¨µMóŸÉu9•ŸÝN#QÀºlú áÙ qêÿDÝŽ$ù]è¨/aºùñŸ{’lTÓDÄN–¹ûÁE 5Ù>Z¯¿kX·S4½‹²}VwÒRv.†×Ê@x<€è Oq}£¹‹}É#J|Èzë8ÿ¥s‘™³ã&‡ÿRœbe†ÒÛ)7+ÚŸ£±±‰<Ň(·0«Š¾Þu&oÉ"Ö5û ²Gß> ðHú¢•ô9a—HÌTT£Rô›‰8¥·7Ž Rðè# õ. «J¶·Wâ°EÝV`Ép«‹J r¬+F³ãKð uZ3…'²÷³ç è†Iw.é½ÏÒZùx{Ñ’[èì‹ï¯9%Ñ‘áW;0ÃgÄä >ãWŽŒ§l}îþ,åEsÆÉä<¬¬¨(DŸýú2"Z‰™²-±RTËð¶Ýޝ Õ®žÊš«æ9Ÿñç/÷:ïo3³ó9×i *è õ‹ËÝI9(û•ýÖû lUòhÈC¾ì’¤Ã²6ñ_áø¤"B#€YÄõÊçÂj±7Û¦Ò=Ùk-»Ñ†À¢ã4åÛÈÍž‘i^1¼ñuYáÔº{5ÂYdÒåT&³I=êA @Ùæ0‘Ø“ q¤fµ ºäõB ÑVcÆ h¢e¦÷lÙ;oÃÆqýúþK”Äk’/ˆ}JW|´ÁŠÕOHþ·¶–ä†dO¥ñ«ôHñ¢­?Iík? ¤–Œl‘X:Ë&h2Yí, ý–ÀÎ ¢9ø(:é )ج?ýž¨! ü·ÚÓónñ@”D> Ѳ¡š;JÝÇdxlº@$JY–“ËÇQâ&ÌX-î¯ÅëžìmVGñ»‘;Fí-reÄa&Y6Ëë}Ù$´î#Pá·‚u]»@˜ àìNëI3á ç`åJ|KùLä ƒÃC €4‚2¼¸Uä¢À8„løÛXF ¦p•–¦J딄:­ã "Ýä.¬-Õ8Dù0P©$lÕkÛB²¹0˜ß¬·h’ŠŽå‡ì “°:úÀUÇp¨=èƒ1Ü@T[€&r½W’ºßõ´ùhÊñ8žvGw´ð_”Ñ#B4p¼ŸÀ‹Ü+cB+#ÄÖ¿Gž|¦8EV.ù+?ý£1‡½2­œ•"lyË;×&¾M'm x"*ìj—ª} û ¶PËñ„4Ñ a5¯@÷•3ÿð#PBVäMw5QµÚÛÍd`-*Īò §­{6r’Äm™ÖVP!"”éÀXF»¦)ñ&¶ o-“þŒ.tû1À7…zàhˆ7l#úŠb‡Ä%ˆ–H¤ª˜¬˜­%Jž3ÑbµfF _ù|LrË è Z°&7êÃWÑa;yÇ žM*Q ŠB¾|M’NJwZiyÞÅkd “£—C#,¥z•Mš¡Ž$Îívb냶×ê‘?Zt¾ÿ:¶€D ŸÎMD¾\w4m,¼s6Èi{nì„E¤ô&€F°ˆÞ&åö¢ßôr …aˆÑ¿ûÊ1ü7l¡èìQìôæ…KçïÛ%•gz ‹ñM›šUФwn¢{‚õ=ˆóÙ½+Nú¾³\Íå·-ŒWã¡É9ËPºvëâCnÞŸ}¶9­<ÌwŒŽ¯ìÏ÷îLjƒ'3Ì9€¡XÿšdÂò0ÌŒÐòéFVøw¶n?÷­U:H°îao|.†@K_áv‡ü‘.ZYdO1þƒîu~ñJšÎï4kD2#­âà¢Ú^ñÄ-étÿã/¼[eýújGÖ®Ë˨MLC§76¾t[þ1–î ´Ò0Ü{pÌ}Ÿß\y`èNOœ<Ë@D,®RÁœòƒ‹K¨ÚkZ?$È”uVÜÖ®ø†‘°Û‚ðψÎ_„¿ß;Ó›*`T aÉ›_°oJQp¥quR’#ÞÀ— d‰†ÁŸÔÁÈŠðö‚*(þsK¬VZ«ùó¨ÍP+ï Q¦©÷m(ñí$@“F³b0Ý*S×ÖÌ`òе¬+÷ò"ŠüYåÓŠÊ!JF³{ý¨~ÐÒ'œ'Õp¦ñâÌHËlgo6ýsýÔQ1€ŠÈ9¥pöırDò/çÊСŠp¨µ¤ÊûFvðPkZudKCˆÀDyU4VŸJìET¼øö®AO?`)ÕÖ—^Xø šåÙùÝ41€j.ø5Mgëù"9\è˜îf; $5ÖPýå„€~ívdÜÔ+:¹D©iÿ ëÉ>ßÙe\€%AÿmÚ®äÌ”Iû ÚS™ë¤„!ƒðIvʃS·êlïcO: Z($½hÏÈ’œ„Ø4^$½ºµÈµè&"àLl†¦ðŽ]€¢!j@Rqµ¹ÌF)ýˆ(uo«BÃŽÈ<¹ÙÑœÏósvSýšº`Æà!»æßjüj™.¬H"‡Ü[n*¸¡é“ðùß4¼|C{À'õ8o| £í4¶¡­QTêZmË”ÍaF#ç]‰ß¦HºKc÷ØßsãÌ¡r‡¡$!NlX 8{§Lšèf£“¾0ÇD5±×ÊPÖl3k–*aq¾c6D¶X^hFÄÁåØ(~;­þûDžûµ¼ˆ¢PyÀ€bÃÔ3F,…ÀgRHÅÒ3PRìÂ¥tšùÇäÔ£é>¢^&i1Ë ê!àH´øhãhȼgêËÜUˇé‘4[Ä3Â1:Ï47ÇH•ºÞ<5§U¾Ú¢Œ†’Œê8Q;Hctô-uÄ.ž– OP«e…ŽÄY5Â|#NM]Qm8ŒcIh»AîªÊt.'_×#L¡^Ž’,(ôdT°£›9R]ˆ$'âÕPŽS‡ð3ž‚hºÏ¿*:ÖA*7 pŽÊªŽÜN$°[þÉ-ÕM ðdâ®1Þ°.•Q])”Et¬òáI™±{Å•Yÿ©¯{ñèèó»cóYSÊÈ~‹<5™Êç’‘ÿ‡½ž¬õ+çŸìmÍ/ßê E@ >¶hTÔ‰µ&ùÊ3»±=[£PÞtaI[g…pÙyg ´žsÓ—¸0òÂ=r3¯î`ë·sÚë¤48£wMï0®4µ‘ qÀü);̶‹¶Œ6Ô2çIn3Š[«Ôü%÷ÞÄŸ2ª»¬4LZ_q~^húñ ÒhI^1 7ýs%)î<9I ðbßwyÀÕÇw«àê%Íþ]sƒ#à{ÍŠi§ßÅxQ0œ§'Q™Õ$ä]ú‡V€²Æ=Īw­”Ë€W{^÷IßÀÖ0ì7txuÈF©®ö–CAÎøHT”Dzg/óßëçDS¿_t~£fQ¥°gƒb†Ó§¾÷úJr¡+O:i±YÍr¯òbù·ƒîÈ ÀøR3½%t7¤¿rRéZ0z£‡‹:AdL9ÇY܆¦hæEõpÅ×+N+Ht‚òzç³í Ÿ™Í¤Bw%¡ !R9VÉ3­îeth.êúàF´Ý$+)aF”€Ú=Ñÿ-¹ôûòhʆ¤WhG¥øxðHµ•>î®{_¡éÑU€ÜÙ‰ê¥éq ±y÷¢ñ$d±º=ð©Á}­X0úûÃó<…wÖ¨¦r!›GPµ«Mý‰î¥ˆŽ†JDœ•à³wí·…§LCCÊíŸ,„ò¥Q,üd÷=žWc2CœÉõiTQÔ Ò¯£m–Œ°çûX¬ÊfþóÆoè‡å>b´v£Ö<Ôq¼8u¯•b„jE±°új˜ð6ñ5‚·K1`> ^îUcýئ^_¾³)Ìûîm·f¦;–‹sÇó ç-Øá«-Œ»½‹ÐÞ—h¤Õâ!áeS[M&¯¤WKÕôj¿ÊyêgÄ•‘¬¦Ÿ:ýê‹=¤Ñ^ É,ýYË7#Éh«æ$hò´qœ?ÅcžŠÆ {Ф»MZj—®Æ™H7Ñwuœó±_Ð1°ÊûøÈÌO‡îGòoÃs.ðXac,!u 0D"-¡Qæ!|e€æp埀;c"(¡äH¨¾cÜ«£À¬î¦‡êrPœ.~¤c— A4Å­p5š1ǪyWùY¦8ë¡‚ÏðQ-wƒ)…™ÜʹØtM˜Æ6¢®dÅØÜê41£Ä“¥æˆ*E·‰>ôò\ï@7¡ÌX(!óÅ™xäÑPê¨<f’Eíx<ŸÏÇãÈÀW÷j}$ÈÛ†++¸2|Ѓà)Æ•+³©¶¼êÉcÏαÀžÔ+Á¡IäxšH-Í8}Œ|_=ˆ‰Â\n…”`œÄ¨ ±ÃÌ‘dÂ>üWº^´?Î-Wwœ”1Œ ä°äÑu" RµŒñàà ôP ¶ËÔ ¹-Ä‹È*]rt)_˜°g‰=ùp9¢uÔÄÝø»ÐÑôðƒ¢®/€‰Fƒ•ÃÂ’|KðÜ…”ÄëéS;攺:w x‡+m]â#R¶Åëâl³4ƒRºòC}‡"“Ó›l÷pqRè¤ìý"AE¥·&iÜ$¹Y¤˜ N%J·sCŠ› BQÉ¥R1L—›-›N×美Ò;œ¤h Õz&yàw ;àú¹4•à‰až„#Ù”Ù•F¿ýäÈqŽq5½/ŒÄ «p§°`¤ÇYP/ºMòÇV£1¬Ü­ ªeKžâŽÉª]'Ï+Jác  {‚m»QèÒÉã‡è´Z" Ð9 ¥¡ÁÕº#œ=eÊXÔwŸÊš“˜_ÍG¬[oõaíѱ,Ë–ÙÉHöûÇçΫ} (É9ª\¬g¬E×qÅhÖWéÎ~ÓsÑm1/àëz³®£øâÉlàýÞ/u¢Ì›æø-=— ÓÂùsédXÜ{ n yÁŒ ³â>žÂçÓO€y52€„â« ~éÒs\^ßc5Ç\©:Æ´ñzf8 „â/*L¡õ¤0Å3:ü|>ñØ®ù쥽à*¿Ä»>ÍÁ•“`}™H±®^]DÞ‡0:üÁ†ˆZ€êx-Ä6% å3^2J!z¶9À¹}»×Ÿýž]í×¥y/Š©î¢Î6õëïãò·­†ÖMñN"§À»¸“ñ®3R~9À·Ýn´>Ë‚Ñ+}Ö/LÝ®j­PLÊÙý•jIʉÐÛÂ̺à`в\†*iºLT—=Âmî ïzÎK$Ý( ¿+=ùE!æÑí7¿FE[îŠ6¦ÝçI̶¶¾‘p»5ßr{?]‚é3Eçá7ÊûÔ‘ˆÉôɯ¯IlT³n·Ǧâ-˜ç«aôª$ý+ÃêLòÜCt[0i Ý2·x/~Kmß¿ÏUß!¨nKV@qWgo à ‘üMzMäÜZøÜqŠÄmÀaC§Gù”( BáQê( Ò20ªÁkÜÇãfA-”ÅsÚºÚ×ÄŠo‚NJøâ§K]\ßææ]”ñ=¿Å¥!¥äó|µîAD4ÑgÁêwlí½È³•A¤õ”<²ªý"ÛÝ/šü ª%Zãëܦ¨}9òUúoÐћȡAü†ÂÌ„Lëý ö|FAìßk7†ù)¢ó•‰¾{{ºò]—LÒ°u¡G§.ÖÚ¸æõñέSÑ}ÿ—gþõù|"ª]Ù{`ØS çÔa[j›ÝÓ–û=<(´lôÇlR—ñ{äŠÏâ²ÖuáD"Ã*Þ:|YÒ1´ÒLÞ:Hf'"Ÿj£§ÉP<Òõó®êÜKÏ'ß,s5!»¦‘Ÿ ùjÓElsqG:Öw#QÞTŽ ?ä¼Î¨G^ ‡@ç’Ép;zÎOFäû¥£m*'7Ñ ð%µüR‹‡îÁ´Z[~ yÂD0ÞÚ%H)yA|&Ê "¯DHÆM:çÈ{ÜÞÓ>=ŒB#¨vWJõ€xbŒÑâͪÅÁcÁqÆjI—ÍoÍEšŽ°.ÅR¬ÕÅž_A@ïI‘ù‰*^N¢Þݘ˜+YC8¢ÃHÙ*·²€þóSÎ)WÒEÇ¡àз#ÓÛ'ù̺~F‡#»Ì™£ChÖ/QãCYXp— ‘ŸÀ1Ø‚ dË(m,LhA:êã¾ä u Ræ1ÝêËu-ÒõΛbØw/`màu•Ah 6—Yº=¯ ¨ln|mÊ_ÁFí-›oÆ=ÓAÙ/3³HÁ7í—hz|Àž‚ÙÐ%±ÂóÝ0>¹SŽgmÝM·aÌHôxxwÝÖ5XŒV¹ÒQu àÝ}–ßĨcîS%X…ÒV>çuw™ƒü¦ À°´¿ƒpNçê*"ö4á«|¯>…t‹;Åô*z©Å2Ùœ«ÿ‘«Ø¹O1DŸ @N±W±ØË9.|*àÜgó«º,O~fý óhàt‘» ºdW—x-K[ó ¾ W.û%ŸŸ%:?ÙÆ©I ¥8û½÷Vá·ó|>ÿûï¿ßK_9€úþ…sGõ®Fç?è…M-foç.M¶‘‹éÅyL² [|½ž„æÕG©Ñø*GÆ‚E™ò‘¯HDe§ËG‹á]®ú,ìË»Ì(`‡¼$@5ÕécTã$´tILu›µÐy!-ݲdË€q'GÎbíw;¶ÛÅùÅ’×ôíb0GÕ$€alÚ6Ù'WÞ¯AKŸ–š¸i µ€x_Þ ü82Cn9–e{Ë=]+ÆaiÀͰZpÁÁòsnT)K’•Mb£Ú@ìÒ®€§wm?…?¹ýNgÜÙ¿R¤I)ËÁZƒØÚ­Þ€½¼9 b a‹îÈ!h†ÿQÉÎèü½°ûveô_…UõNž~“saº÷Ô'Âè—8…)‰`_¥–¬S=åFò´âÊÝÚuÞ( Ð%ÇÔÒ?»û^ØâIÁ¯Õw\¬iºV±ò³€å óŸ—Ÿâ'?Qtþö¥]5WÏä% ²©ªÏÛ²Ka ¢Km‹ö•\½Â‹• ª©Ùé"fY#îkõŠªýK¨1>88ŽV®†z‘`Ǧ…êdNRà ã÷Øé½Vë‘?3F_ãx_FLj¹>D•#S²Á¶A\OˆC^†ˆ·Ù.Šv9«Ìp)Å‚J¾†ÅÃçTX¥pÒÕ]Î1AÁß/<Ô¦Õ*Ú¤'^­8Æ`²ìÉ«Ù1lr=^i?1_GŸárDŽÓÈÙrZ‚@VmL³ç‰žðŸ¯Õ¶¥î =žm@+Ó*/éÐn¡|³Yå<ìCA%™ÂeÇ“+ @ú“íP8 Ç,ÏpL©²BæŸâäq€²h@\7z:ø «¬“غe¡‰¾s£„¬7_’®prò²N¹ÿáã9XÃÆ(謂[Þqt…½踟æºN¤Ã ØÒŽuê‚ÃÅ© йà¥ó…h>¾#0ÅJ2\f eµ CÚ^Y¡ŠŽʼnްëÞûïöñƳTçnf7œKVf•5Ü–• ߨA³gÐK4Žôˆæ¤3å1Ó9‰ÇRçSëú#A¦_‡}Fǰ€Ýý$å¼”W6Š#BØðÜZ§øˆÞJÄÊEøŽ‡Ùdâ0tò>T ÊNÆž¨m¶R³-.ˆ•¤ ª¦•üÓJ"xìÒZÊ·øpÑEuåî#ȤZTt—„(Ä’.ˆËŸ¥"­1ŒÌÙø(AVPàqD$äõ ƒžüáï LêQµ ©ò'ÀƒžH€|èË `K¢²Þ'ƈ #;hª‚JU(ޏyºŠçŸOz<ªMIJwø¢»õ Σ&Òã. ØÒz Ê#ªÄ¢ÑÙùSóÖ •Ð0KQ€‹?z>íiØ5Sê@uøbAL£m``k‘/Ó \ÐûB6Ǫq &8cÈyÆç»ñD¡¤«—z<Þõ>’ð͇SPürp{Ê£ŒLd‚ „nÉäÊVÝH1¢ü!gìH0mš)Ì£²Ô«ê¿¡±mIÚUg[B0' ÑèŽ*yBrüN,…Lj´‹7͆ìBø¦g;Co X‘­ìˆœ(K8Æ>䯷/ÈØ‰@æ¼`»Gü1œ9þµÎb«/e”ˆMßÒG¶‡Pà2~Ù€Yuê¨ MøhÅ;»h>VtÀËOPœo”êRì[ˆbpd£°2 èÝö 2íC‘0¨8”©ðBÈ;í¹ª÷7èíñ;3MHzŸRžpÙ=ö8²ÇcÖ8#î£“à ³Ffa} ç[fe¼Ÿ / ìñÇ}¬ü"¦ ¡WÂ)"\¦ÂŠ÷ÚmóÄoѧùºz¾È)ƒIÛò´U‚æ}x¥n×½\Žñ»((Mïçó‡&«gúãDçëåIXT…ò徕Ê;]>ŸŠú•Ÿá£Øþ­¯wŸÐé÷ýPF’jax<€èž!ì6]K?–Þr³\UŸ~Ö3zÑhËáNñ% ÷/=àyöyáã='Š8’v×)VNŽPIÂß%ÝìwŸzh»E~¼k<.ðù<ßýËP?)€üÙÜÏÛ%§v^OzÂópgù`"%­ºáÁÆI.§ð£‰ÃTí}ðJâaô¤'<ÇSÝnÕç’ ÷­ðÄÍ~üïõë_؇¢~ô1úA'þæ`ÄO·#òÅÊgªSÿx<¦ô¿óò÷º’ÿ­Ãßëþ‹öŸ/:ÿ –ܸ7gœµË°O­ÐsÌe&εÜ>2š ¾z1REÀÉ$Ð=¼445Œð0Îâˆ]¤Á¹Èêµ<[¿ö³Þ¥)Ÿ ^÷NÀúú$ol´d"oB3 FlQb 0h­¥N(“ÔtªQ‘<P´­ï‚äÈÛJ0ZÒÎÎtÁ_ÁÅt GËÛ.ØÈvi7¬é§8¿“S!ˆÍ d9Â1¯W½¯Æø@ø÷r®üÓ´¯Ž–jBv‚·ÊªBý]«ô”äÞäæÊv…iŠTq4 Yþ{ÿöÇãTR›¼½™†9–—Ý?ÖõÖ¯˜œ:[+)1á7÷Ö±,Ôʸ1SP’ ‘‡œï½ñÍH–õ&Ý1ëC¥D».¤JL€3HÈž]»³®Íè.8Зų×çį?Š%ì|^‘»âɦG:jvòF¸,)íY9’w¢q[ÔˆS.|ˆYE?±£Çâ+šÍN#+¶Ão]M™vÒì–;ÙÇã´ˆñ Ä3Oë†-¥FõP šÜ€F9)ƒ°àŽï«>t|çÀ@F Néä—GJ]A‰cèɶ%`„ ï‹ÔëEA±œ@œ¸©à'âyyÁ/VÞtò€m‡šS5† ÙDŸ‰dÆÓ˜ÖqS}ãó«QÜ7ô"¤LZSiÌ –½ 4ƒ‚@ÑÅ/ýŽs¬ "bªVùAñ¢l<‘íÖS- áÞ°¹hMâ&7‚ætiët*™%nºa¿$ è‘‚ï嵟"VÍH è¤³§¢(fè=7î‘ÏÅjˆdØ…º1Éå.žX´Û&êÀ¤ø“Ë©°àC\B(`%P÷lÙ¸rW˜8Öûò7ëmCaYԣʒyÉs†–þ.»€E/6]4C”PßùÇâÿð÷&ö|Œ„ÛÿD3óµ¡Á9Q‡Öã‘`¯[b›—îÖ+"$KâO"|>Ÿáx†¿—o!ˆDð|šÉÄ÷«_üÐ#•Ѥ÷#ž$úé1ß Jþr’{ógÊ»,G´‚¼«âOaçóû}D}Ùçïuy{ÿ Ñùj7°Ð™-•ü>ý„ß©Þ)Û áE`üWä¤W©´µ¾•BqEܽÝÝšvˆ9A®Ô0Fk@2÷ÒiiYm‹ÅŒÂ2vƒêhÑÕþ¤=A>â…dyå)óëŒz[CØÑ¡[“۵ͭ­šp+{¤ƒÆ‡H‰‚Ó”º*‹¡«)ø@öÖh=xîÂ&qÒ{²œÏ—ªôÐŽ•áܨÇéy|Çð O›ªµ¡çŸ?Ã~‰d;ôÉCCÝÑe"Üšm*ÌɶNiûƒ)ÌÒª¬ÝS €BiMìå>Yêk1- ·Û3ÚdNç΃ÁÄ£ã‚Ái¥§ä‰,aé’ÑëŶV Úõ À;ÓbHÑ87!žú²yŠ{äl3Æ|ìrY³LJ¨#wQxÓ<#P€x<ª‚'iuìÐÞsÉüdõ‰OI )¢Ù’ño•l1 42GJ÷fgÌô¨Íÿq'¡c—›âJ]ÞwUºÒ–Ô .ÆZµ’"÷tZpÌ¿4Iá¢ÇãI‡òD?s'À•º1ç™ë8ÙíØå>ÖûÇ9+訳ãÁ³p.^(«úÑžOêžo"{L¢ë$/αÄ;7"ç#Ýù-·Ò³³6ÏüO˜Êz\?2Ö UgX⊚Ӷ çó]gœp!2é¸'R¨r -Û‹ˆ££k&ˉm0ͤU#ôð¤ÇpQ`v"[V"è³wsOªŽoаLX ¹ˆ2©I‰Ñº7q •bTû¢O©èëòÅá¿4´m¹*œçé¯Î%p›ˆþÎ÷¿cI0n$Å ¼#>]Nw"àT®Ä˜)~è¢þÙNDÁÈÌʯ†{¦¾Mj†ižB#s#CÅuß“l]×Ùá’RXÝW.­$:Ò±¸¢”ÃqAØÐWãgO¹úé¢óÓ nck]g!G¬~<¹fò„uvTÜÈSêXHúùP#B%#à ¾×¯¡“Œß茷€¼j÷ĵûÒÿŽ\EÍ[¨¼p&O+šº"ÍAÉîdg xNP=@Œ¸å¦fRžû¡¡{“òï&™¶Œ(8®ËSËÓM’!;Kq¹"K"èÆ|fÑ„Ø5ié ßÖ¤rÕÈØÃˆˆ$qAš†,>ú?{W¶Ø:Ž+Oþÿ[˜‰$v‚Z''¾s»OçĶD‘X ¨E|iÜŸ.µ 6U–cPÆßÑÆ ì©ñànHñu¶Cï‡É)J’búfn±ôUÊ2ƺ:œ°v‹íX0£[!ˆðf´O«´ÿ+¯S»Å€ë·Ç¤ÔNm×г–}ASrr°]u­ÚGüD0» ìZÕõtÑÕº$¤d…úHw¸»J+úRêÖùN>•êe#>>Ž¥Ù`íãJüJ±Õ+€9  ©âÇP7B7wÈÔôæO쯔€C=X 1kNÆ<Žäž×eIxVWHÞf D#ur2*õö¹ä}‚.óD#d² V&•g³”É—õ \°ÕÇÈGw\çzÏâ§p¨Ôf„è«©ò&Wqh\w| ÷H‰ÉZ C‚Â×Vþ-ÐÿjLçË5“Ô´d±ŒÆ†Šà¸=5l¹†¸Tû4GÁ=bâi‚ÑevMUö±#…#Œ\8:îÖLÆGœ“0Ï–(òTœßõ¹Ég‰3uÛÙȨKñì—™<ìÑðI4àÜYg"?u-Óuã]Œ`G«,¾*™Ã\™µvÈŠlmmóJœä5f­DML>Æà„ìr"ˆ¦g‚\'Ÿã{Áä!╌¡Äq™*›&¦v–¨ô ÍBùL1OÖâá]ⴴ…C¶(-È' &BT^>ˆ¥£HÛJ}ŒRPËè1ñ'Çï¤‰Ý j‘ Ì|½•ÆN®91_ªæG‚H t~GeËàúc¹ßrµUœó$$èØÿõà½Ç}]Œ‚t¥oÄ´#´»gÖWäIè…ñr#ñޕ崵2ÇX9™5} ¼O'“ýBÑù•Àž‚Â~>I,pKŽßõø¸-§ÅND/º[€¥áý €o(r…‚¶àµâþΔ73øž‘)+é íÑ­ö’cûdZ“àŒÜ¶3Ño–½uëùHM:Ox¥ð&ÙœË ó„Òw åÒ'ëCùgÚìÎvûZ‘ïØÒßÞÉ f~¿W‚É4×É&qßÄ ×å¹O š [èqåüÖ-‚…¾Š5ƒp®á‹Oú¦y—ypx tö*ÏXàï:ÖöØ|àHˆvlwYÉ®ì{>?‚màç<»êd¡f5å‘€R‡³3ô>}~î•â´B¬mH vÅ ¥>ºý™ž¼K ]aÄp~(Ã)½ñ±Gozýv† ñôÓmºïòV…‹9¾ûÑ›ö±Fo‡ÞpÞÿ|âç¬ÌO¿mû9cÁÜuÓáÛWâMj¤"tðÐÆÿâ÷!BDk=¹¾à‚(èKaÚï¬õCF‡•W1âMƒ,yM¼oM0„(ƒ´ ˆVØÐN¿¶û]Ó‰(Ó€Ìû!Þµ=ê«« ~§Vo$n-è,fsƒèÒù"²­×£íHvsçê× *¦š*(úÿ}7Ááà[”d£°F`Õœ#·»H|l,ír¨üÞ%Ih2›Û*ˆq{ZzðÇöã1§‘ÿÏ®È(QʇñÊJìë[xš¸D Jæ3Ï tÎâ™Ñþ;zý¢¦sk¢4…ä"‹1XÀ3XÓáze¢ê+ˆ¨7+B(hvâz*²üò—¾: OOôŠ o»fý(‹Ÿo ÑužÒ<|åYÕ²P;\ ÆVaªä{%Y°LG}©ätùÜ»7[·šãf‹OŠ3Ç÷¤;vÕì2EyV±·<ˆ²ýœ%¶êáó›ooâd1LwiÏ#>V“3å+ÍÀ¨IœÕw`d±‹6‡fSu¯+z݇´éVqO{m¿‡vBPIï1ót$TOR†hû|¡¹Ç¹åørãĘïú‡4X ¢óƒ£"†+¸sk-~mÅ9™,$qEš#׳'kPuƒç"¤ÉãŠxèÛ2ç¤ÍDñL÷"ÚjÆèE4‡FO2Kàô°§ÁÉg7xôÓ6ÔrWH½|J+ÅÓ„AˆuOYÁ€PO*ÆÕxÏÄ*”ÏB;Ô[RÛ˜”`þøÑ—3m4hmu×\Û‹;䈫Ó;¯íÑÅ ý†Z”ì‹gØØ=ˆé¦ÔJç Ô4¼¦&ü"~‘fTL˜=²e#½ØÓºÂˆqlG¶NP°g›É”Qä$ös×Fñ“vnë …ãû6AD5]гIW• Äà»SÊÚ‘jï]xÁ¦y»Zz$JGeˆ €¤§õ»‡L¬0ÊÚv=1Ê]Ñ;ÔC—váIeÓ¶A.¥j-$®¬‡;3À…óŽ °}Z70 Å\‹­Œ`À,5ñãX£&¿`Úõ‘K¼’äóêö|nÁØ’mЉçéËâj O ™®¦^/Ùáäz°43ibµ€.d;º²AKØÁD¡¤5@}A–'ëR†ør!áýo”¨0qÉXòöáRüá¡ub,ô†;ˆ ½–ËÈÅ˶»+¼—+;G8fBbóTývòæË˜lÏœ Bfn Ρj…L€J‚b=U 'Ít¤p2uñ‘¾ç ¬]èÇLÙ Fäg-Œ$Ñîs®Ée𤏵'½þ4¡ÐÈó¹Dï2sëïÁÁtÎJ©CxIîg±)Ò(ñdpŸý+UÂ$Ò·C‚Ði„ç?àRˆ^Á!Þ•%ø¾*ÍÖÄ›m¾qÏ­‹I<wRׯêZÍÃ<ÿŸM«ÖP ‡ºaíRØßƒ´ä$¤#EÉé¨DëÒHÓoUÃô~0³ñ0G:4ØC7ïJzWÙjÄ>8X:ãªæp¼ç=Ì Ù3ÃÄk9-6B“³' OGX0ŽíÌ.R9Ì 3ábpÜ{Ý…:-ìÑn{Ðú™ú®_í×z¨7!µ{-N™¾sËÐH‹mú_á#B‡¬žÑyœÀ~JrA³¨ÅP]¡ÔHQûG8^r y·b0úà €F*ñØ(¥R ŠRI=×—fåq„ÔÊE/–•Mx›Eqª‡^!RÌtxd|½ªÖT&]By¤mä¬Í»üé9*ªõàÿ¨è|°=’®)†tÏk’Ded¢ý™ìÛ©Ößñ¥4§Ô'C"3ü.ºítÕUÜ3¿.Î& €Â]^lýyõ½YȘÄïÄtœÏD&ÿÜÌ(<ÖõÂ) »Ò”»ÑdýS8"\Ì4g´äe0I‚§–@³ɵg« €âcËy¬FfÊíÝôÈ¡m Å¥·åQN}rßl¶`djàE½äêk¹sbWŽ CÍïg'³þ@¹%–%ÒÒl^Œ™ÀŠe.ÙÛl6Ù¿·lZVÛˆBNDg³ §[t J^ŠÀžN¬=/1ÕÎ2`õ›Œ'u£s“/l+‰)ºX’±ÔP£éM«bWžºMZŠŸO§²%CFƒT ”k¡ps‚YsýΡÎxÂO}à!‰!ÌJ¾‚†Ææ¿‹N›KKwÃÇP(æa ú KÏeúO—š¶„ßSyçÆB~$1§êÁ’nz/?2c8F“¡L·Ÿb\4Pwq$}-÷ók¨}òMªäö½¥Wˆ¿Q¾ÆRµü¸¨o÷æ8`ý[*sÞeÉNæbäÙó‡®ð1Aúÿ¾×½0ÞªH˰t} Ä1Ñãçú«²pO›,Ë«Çuì£>¢N ÊîÞ„µÖ€œ§—'¶¯j­¥ºÍ´ªèn2Ÿt<]´SÓ@b˦¤‡|¡S_õOõ™ªì1SʰÍß‘Ã0¹xŽúà%}#ªhACèÕÚžÐàeòâÃÁzsþÎ[,Wªe>Aà¤ëzÈ'Ç£uÁ E‹×ÿ¨ã¸ñà ?Îh2°ÂGƒ’ÎuG{Ǜ ßOÇrÑki+V°]Q þ¼ÈÒ­ “ñ€ÏU‘o`íBðÖðQŸ´|Ãz2$áŽ^\;u}§)HÊ¿ ‰ ¿… %nnèÙ<ì¾SÙÞ…]*<4; p´ÖN\=üçÀÓbÿw´‚Þƒ‰¼ r2üŠÚ,Þ`…tÀé(ɲL%ÿÁÀàÌùñyNƒÆ»²(6Ëf¸&²¼^¯n¾Ðûm^rZò\1îäo‡FÿÎ %¼çÞmË5¿ÙÌ ƒêĺ2êçÃø²Y{¯ºâ¯—3ª Zÿ èü·ãɃ°ëã ÁDfÅvå@®ãq÷ÿBЇš 4(\~:¿ y üõEm(ì(êÇ“Ûμ“Ä2®Y|-úøxB©œ0Û˜ï×±èŠ0Ë~ÂJ…¡ÿÞ@ôð—Û÷XÊna…»¤?Ð¥E uŽôòºÉ;tµâÕ‹º€§{Œ4Y%À@kxü† v’j­×ÜÚiµÇnæüv¯ùÁÖP#˰Ñkáe²Â¨iáøùP?þj¨˜ -žöFÕ”@ý5ÙùŽÔó¿îe-]€àÊ5¬Þjéô­´ß 7wòAG ­ª3®ÜJP%A(¦ DDÛGæÐ){Ôì˜ÞÊpÕ‹gÓ_sÝOÛ­ %ÁÑG@ _¢—gšoêay]ðJèÊ)DÒIü¬D†•+uF<ï¦ÄÕ7+±t 8K|_¢¦ Ôú©º|I ~Kš3퓎}µ/æ¶m¯×ËÖ5{o‘ëÚ(ù&®Ž‡½Ã.ÎýZuÀ1ŸÞduÃ=Y,6µD±îh±|ÐçAJÿäÞ‘]вg"¸v%ÅÕR¸Ûž¼GÚ}#ÄÚJQpµ·$ªÀ1ds âøL@ˆ dq¦u71þ±º¼ÌL‰É¬yÞ™€àa Œ£‘·=m¸úõnôìUá˜ÑÓÌ#À©âŠ{ïeJg–³Xÿ¢Ç/Òœ0w6›pª<%¼¿Ut¾¸C¢]¡M¬ CÖUe?! êÎò$DÙÆÇ@YrÇp«tHTÈÂ#d"Ì7s-æûúÎ*_ àÔSÂוɺ­ØXQª=ýQcå €«©õÜ¡Q ÷ä1gæ¿]%ý‘Aõÿ5Ü?ú×å¤3lÁÂÁKåî§`+=AFXÔtBä“E[3Œú8Xm‘_´W—˜;I”O˜Áý,FíñïFGuW_¯}¿¼¼·¼dùÄ`y­ñYvkgYä²dñ£üóÀþ®mg1ÈœŸ®Ì»-°:ä7£ŽÿŸaPŠE8õõbL¡¢³Ð²äv.9ˆ¿/»TáqêØå‰Í¸…xqH2DlñHF»(BÀ§â×j^­ÚA bž*x Çï0Jùôð®$.zѶ‰%— †¶Uè3%ˆÍŽyBá¤l¦`6íý9™-ÝJ‘:sÒ‡·z#€©ËM)Óubì'e\ĉڒ¡Ä Àžý6Xsx9O1’ ®u^x™»Â¥›}ø„WY•Á(‰úd}L*=MŇÃ*ijÉÅV žy تal ZH€•S¹k{äEÙõLlsw¶ŒS“Ae™ù¬•‡z¹,äUÁrBDJµò®G¹vŒü,ùŒ I¬ÊY7]àêCÂí˜(WÑû= €§R*x99òßÈ#’cž£\«hPÓlÒfÇëËâièùH¢g1¡-Ý¥œÂÄtïx½™§þO‰ÎŸ ¦©=–¿ú–vCþÚड'–zo´À _l/|Ÿ+ïµ)Іÿ{=³?¿à^Š×fpÐo£ QLÚxÃWßå+ÏÓpöv๷ûäbÑÎ"ëñ'"‚èR.HÅ9<çvïÚ‹Iè0Sþ1’­Ä£\³~«ßuLðo•§ð ’çmzÀö7<.eJßÎÞ˜Ÿ<ëœãöƒ”3ŠÃLùý{=»ãqEä‘¡pDðæÔö¹ð„BØ;]Ä$kuîZ/¼^¯9™à×¼Îq©sËð[NÞI´"eós²ÇÈéŽQü‹æ²³ ãuÚ¡¡5Æ€søh¼gÌìz)":¡8lø:pÇ`°ºñü¼¨»½£9·H*×ø;/ÿ(ý.ÑùO *,Ê”øÎÞã,9=)|½ 5*I qeÙz·8'ÀΞ“èþ¥ Q“ü’B!ÃÃL¦]ÛrЬYÀ›A/Û4’èM’¾m€Ã‹ãƒÑUNøÐž®*À*_ØÉ0ÙìÙ’‚¤dôæj²}ÊŠ×ÕòØSäªèA¹V6C©Ú£å(% ¦.+öÄQ‡t ·ÕÕJ¾¢èÑXÇ›ÁM‚h<¾éB0A‰Ž•Ij]{!ZêM‘Pò †žöÐøÙ8N¼pèAYæïÑÜÍ轎˜l‚V<ÚE pŒXäÍ6qãµÉÆ­]‚Ü‚sgtŸ ”F§µÝhé¶tnú“!][¦Ë1î¨çˆ •:|ÿáò¡ÖUW!Ø™#ýòˆêi†ì.‡ D.j´D²™¶dNzq7¢ÊêþÛ@wCl27jöÿÏüQÔb(¦¶¢%ùùÈX¶Õ›²–càP¢þ`I#z`%¦P‹=DœÒk#MÌü;™d•ç¤\ ž“:€]ãË<:ß7¢ÜIáÔ«Z1)dV¬G¢xxŒ²~Z×`iaƒí(÷G”ë^y+ÇÔe°ˆ…gM«ªSjZlÑôCôâf Š_¼J¹4ÿåüp|ˆ‰ßÁŽHÅmvë#7,„vjOSW#”GèQt<´'oe5îÍÐf”‡ˆ “Ü1Ó÷oíÿ£Y¸‰™;“¡ø…ï³<%·V Db†Í?N–‹'U®}v£åJü_”óR&…fB[¼ …f¼Š *Û-Sßz ›£u^VÓPÍœE®X¼Aö‹ˆˆ«Ñ8.BR`úfRTh7ç½mA¨~hÂN·æåÐÑöMG_íܦÜ`ÄzÔ&¹ ‹RŒ<-µ ìE?TTÖ'±„¶bZF=úY¢Åñ~! ?„^@‹°É†Ñ®¨ˆûµµ6,…‹à$Þfè_/Ʋ†t@Ü‘]hßØÎ {A`hõÁ¤«íîØýò6ù^ÄUá´½‹}o)s}¿ËÏò¶³ž*‹ë RÃõ¹Lï`TØÑýÏúæ´¾#µÆ NBÏ‹Á% 2ò}–‘ŲJ$àÔ± €š,ri «ÇÒš£Ôþ†•±ÌÿèüMʨ¹HXÁ½!NäܪNÈP5HæfÇÂ]Щ’•¶ûp6BÕ­¥,‘pHŽÊ¿‰P‡T•µä58`„ûØC8ž@WaJwÈÅiœ‰&uJatºÆЊRÔ gظ€c©“.F¤ëE®×á2ͽz„h®;A„ƒI%Bžæ)E%–*€À€q÷‘$ÁÓ„ FA‰Ü¶{­³¹aJ×îõÂms ŸL 3‹À¶›ÔZòä&àYYtðòpg™6 ‘…Kì\5»x¼V(Qš°ø%¨Ù‘W)“MÏ(ƒu{ER›æ»ÔÔÉÐy4'F:ÈIìü‰çn¹* Ä©­X@Hºë!ÖÆiÑîhzx3pq<æ‡R1Øè e£&²„ò\iŒ5h{‰ñÝùÉp÷*Mìv˜uX…ÊÓÊ?ž^?¹ô|W Ì0Èú»vydƒ~=eÝ^X¯×Ú½”¯r+j³áÒF Ž n¥ˆvT 1½Õ†Así„ã3ØÐ+T|È<‡òèF§TV­­D!£›ÝµÿÅn̸hœmñ5n®DÉÊ«_/0¥þ½èdÏ5¹¹P•²à{CÉ”†Kïi𣺔‹sm_˰sDXöRbã˜7XéµwÓ ‹É#qEΟ1®„†ÜY^ɲ¨R¾r½94Ÿáš0 æFD:b‡ßö;¡YžN“ ¢é£2ð¥hÎO¦ÒQ…€QŸ÷Û%EÏ4¹Õ᣹ -!@Óº!ë<¢~š)îµ5\* œ®1¤‹TáÔ))aÆ As¨m™äQÀm…ãOfZÔŽLI“À¬ìhÞ4Ýý‚Øø¿,:)=Œu›+ï…x0áÚõœÚ£LH±¾&-›5âúñ;(íŸ!$^¯³þíïumÝ_/^@DÄ×…£òOrÛ®\´¡(?ü•Ä£mÛ8°¸m5n`OUÜõsvݶOÌU¯®üz½jFƒ>ÍhDÆ'B„IÊû™ŠBÛÞ¹´mû3xÈLÞ.7Ó-äõ<ê[—žžÛ0ÛˆÄôÕðO áïõ·{¨ÿˆàEP/oýŽÊqiyrX3ÖÒŽqÆýËòm£¿<èïõ÷ú{ý¼zÛ: […TîwØî?³ý÷º CøM¢ó?÷¥Pµ€BA¦k·ý¤U¢ÅtÚ•û¶Þ*õêä3—®Ç_\ÖNuŒ;í ¢ûgaºcE­b‹Í—“loËþåPxlÚS!ãžÖå·Š9‘{ÑlÎС½q´beÚHÑêx÷¶—ÄøÅn”Ü—Ø·‰à•º/X™ cÕÒùìºIJV€m;¤<ŸçÊy«)°þŠÖ7Œ@ÛNäùï?R<8¢'3J}tV½p ‘h|/5gØþ=½­Œ8u\Ú2A–tò|"`Ÿ4¨:¯e1À—’}Üab=N^…”ív ä]½>ÏnÌE{ýËÝ H®³ÕàãS…ݳ`u6]ðÅ{;rAAš@®*hÒÕ÷ݪÍÌ{aŠ” mk©ÐŽkî=0ó¹‘vާfN¸"¾Ÿ ý´6]s fN½ª\+itɵ¿ôÑÁœÖéÚÕà&1ÆgiψµÀ„å]½Õ`íÞHÝ•#ËþI*ü.ØŸ¼£f©é[Ê'„@œo£ò”+:‘Ý\º£ÅñÛäEÔ¬½o+¼‚ƒ‘›åÐê9pö´Æ¬ÕÞ)ÝZ6'7˜ëû/ˆÎ;{Ï;eð«ßq¹DE–  Űb”šÊ"9ÂV€'UŽèmW³DR$B–";_­ª{ê¡X(Œ¯®„œør¦´‹f±`"‘ ùFDWt1Œ¥@‡sÝaŠ@ÃJ¶.„J¯“‚!ëPCÌӘž9dšIFÏPnw]pd–rüÔõ.¬ú_¼¦ª{GWˈ¤°nž’-º($ÀœwϺKJ¯0fùþïûCŠþâJƒ+:ÜëõÚÑ3ÃÉNpˆåÁ®¡b2‡íîÉÔÞ³v3¡ÅÃ"k¨ŽyJ0–;Š4.£{s][åŽ-ÕHÇþC‰•#çZl%bt2»¤×σ¢‰Xs¢dŠˆ9À³¹0«cÁ0Áãbã§’FV 8”V·çvL`ž£ÈàÌ•Q`ŠÝŒ=‘JË…•¦»ºÅ‘4ù•;¦ Ï-¸½ ©š]„È¢¶   WMíÇ‚9'&ÚÉç¢EẼ‰åóN{ßL<©—Õ W•¤p;©à‰o7.|FŠárDÿ[£S ŠŸªB’¨>ÊI9Q Š€î)'ÉÊXMù*¤ »ìéb$¼\ê¥8…äHµ]| F¦¨êñLÞ ž˜CÍÍ,Æ2]È”ÆmsŠ:,È’I÷u=“0 ø4ž\¥Ò_¯DVŒ˜&qln$mÖì ®Ÿí-‰ æ[‹@5 ÀËpúF©«³FÖccD_ÜÕÛ Ô1J=‘]|œ%v²O˜ØËÏÏ +È"„¦ï SI¦U˜ü‘¤#+†8ï0@饶ʷI›ÎX±¾ ÔÆK 6ìh - #îD4iMâù¤ Rq…ý/sˆ¶¼ô.È2Ž-y×q¬­uÊÑÉiÛT0¯C'óÜæ×Àº*JÕ!LSõÞa¬ºZÁ b£e×*„Ž©†õü÷‡ŠÎO—[Orãm†µ±õ‹¹k8wÕîþ(¶×£ÝézËì=w´­¾}ÙYS3êƒßúb‘ÌwQ˜DÏt–F“À–¶µó½/á„™²å÷¥lûTÉe(õM$éÇ­]ãÑ@;ðØË‘M}Œ^/qä­7€¯{ &E/yR!Öq»ñœiuþ–àEë g¿‡ÀÕG@V³Ÿ`|WÝûEHpie<È´¬êû–h>õáôèòz4Ky=›áٖËI#gŸûÍÉiA2ÐLß¹é\>q; O¶2ZÙýÒãÊIr×Ab?‹&š|8gërÀ1 ÉI g²{oêM4rÜ.5ŽVVÃP³5Ç‚»€œÔbØ ¹ÖŽ8J2³aœ>y4´¦ãÈÜ»ž=ÙW G(ÛPn5Õ*îœOŸƒÒ­O²ISµ".d×m#ÿeŠ”>ªÇ–ÙÖÒ†ò‚Ç9!Å ˜øzl))-¿Û&Fw,1á®C‚pÍz,X³E ºVóæª3181IÆu?Æ>nuÝ*¤IXï™Èó Ùº/ó.Kâ~T«¹õXºã àÚ»TΊj"ªŠŠ7Yª†ñ ^˜[: ´à´5#N9¥3ÐR03½–ôFiÏ8}.¬ŒŽŽÊ ÓÜMsǤô7û§ÃÝcºWÑ ØÓ:Øœ£«Zü5r¥8}ïü"µ…ðÂiHu/Û /+‘†—DbV‰d–€2Þ(e(iÓÌâú–`,g¥ä­ÈÐw$\íf‹âuçrγ3÷:q—å£u*\ÜÕ¿Ot~ ™5¬®[†œ @F‚¥o¡š:ߓ݌j5rAm0~Ï-ãÐ¥D»zÔ5Ñ.´)–ù%ÓJVÀ0 i£Á¢ýŸ¹PgWJ¹Q´>7™Ò`/¬K-¸ä:F“‚o·¡‹hˆð÷ù°©t£BàÌN'·¿B‡Õ~;|'Wá¤8ÙBlW¥ýÊÎâT O0.\ñ¹c¹y߆ȇÆa×Ò‘ÒêWÓ{Ôrô*÷BZY‚º»õ›Μ>+âßÈøT·9¬jpßÕÓ u¸¨M~þÄHë˦c¬èIŒ郀$*„ã.^loáiб–Ù]Ãæ•ç¶ËÕ,6º ~ ‚Ñ^öÍÅÉ„R¡Žöj®.Ñ-ÿ×F˜%Ђڋn;y/ð'%2dЯ~#  ©Àk^`sDL%ÍNÖ‘öYÿµ5[(Ï{Õ.¿ÉÑžÜa¨†Ù/ä2ñX¹Z/ݨºûD7Œ1¡[ÏêÛ¼USHÄ,Vð#1³Q[^öWT(ü«b²ŽÉ b¤Ô±q >:0ÈZ üed”#!#|ï·±âf¡sCCÒö_ÌN0H¹3¸fƒ ˆtznñÁu¨q'"Æ ñL’øÜØw”að:ªBK’¾mTÕÉ€Íx0%j‚cÓ!޼Ïc?’šxä6¤nQØÏ¯œ7 Ù]'ùŒÏ~b‰ða1^—˜Ô ÓèFŽ¡1™v]œë޶KN k¢‡ p¯;Ìi©“)²°ÄèrR-# ;ް¼ÍTùí$ªë–f3gͤõ½ò-:Â’K÷R»?_t^iv;¸U÷ £'yš^ü>ŽQ·£r™Ix GˆæV²g\·1È ƒ)ºƒEä!°÷„WÒz²†ç|—{_¼ƒ.Oª\†>¹2$Zî´ !hó5»ã|‹ÙÔÒ† dX¡q \~ *n®v+ ~/e€£ë—0¹(ÖÙq}%'Iá&HòÉò6Ïgd¿÷Eòå8еØ.eühšü÷\|Ìþ¹›µà§CÕÞ½H¦AÊaœƒ8²‘#Æèò ýz•’¡~}žÕÛ²ò ³‘œÆ4r€WwqM+Ô\gÓ0%çFN–›Êø ¨¡¹,±ú_n{{Ø0¯ÕáÇä í¾•e§$Õ+Lw¤?Ò6ÊèW-"üI^DèÑAÓ³öí,`úy f\7üD&ò½ÇœPn`ýT `¦$!ºSvÛaÒ˵6*JâðÖÆêJÌÃ+n¥\ßL~úƒÿ¶ð~®èü•{þð 3æ°u2{ú@Hf=î3ãä:à#¹ï*´kÖ©{ýÓYÛ±4ºÝ0œ™èÈ‚ï,óhà Ù-®øÉÝ/†‰™v°Ò7ïû~ÛqCx¼¢üÿøάaGõx/DÑseS°x N5gI’d& u¸qY/èÅV¢ðji_:ªÉ†ÝÒБS’€'¢>©ç}A´?G(è)<ºõý¾ÃXÑ- O†&(º¦>Kk¯öümßRxpúQùÙÖ4 mt•š‚O¾Ñ«¤íV8]HR¡M\X¶|O–©Ö#Íþ¾w²Ê¿+`xóÀ'(%~èB+±NèN¹Â&A‡bI‡P’u÷îIÃR/¾ÀŠ tïždÑ~ŸPQ¾†þGXOÈÌÝ9jÊ­¡³"£“Œ°U)ø›°É MAƒêîôP!ý©AÖéQ²gÍÄ+Ý*)£Y¿K®]ö¡¿Ïs± !í7û±Ñ†€/â1²o©ó"y…dD¥^­ßG1kª´XémŒ®2éÈ 5û ôÞ°YXg~,K5-Á£H÷Éð¤$œÐr¼DˆBÀóµ7ìº4,UÑÍ7ƒÛ£rc8ÀMÃô5nçÕ(Ö®¥mœ‡*\z!…ü.Å#v¢µã9õ¸Ü'Häg!3–ô.àœrT3,c4 §,«4WVoT%.NÏâ*E€;ൟÇD ‡× zhm"¤²€…mSÓ…Ïzè(–˜” Vçö­Î{P›Ç$ÕŽ¢ÀNB=D@È)øGà‚Üã²è3ÄÂOYõ‘•Zbí²ÂyHÝ´‘í·W…S¬>#:)ÉâÛcÞ„§ÝNÑ$KH<}Èøàî› Œ™Èõw±Ä†BB ç1ú¶mC|í¿ÏŒSöfZQÝK!k,¡ r{iþ¤ŽØÉï²KíšÍ‘(D|ñGüz¡D+(Ç»ê xÈ#<ÕDeAóNºÀÐ~‚¢Gmû`¥”Z´é EæÛÀˆ6X¹ìzf"®ê#X^‚šÓ¸1.nù‘¼}^…BÈWä¢Ðè p:Ÿ»»b¯®˜Vw1Éi\4è G“Åì[‹g •Á‹stXíˆq“‡]]täÌ%VVÕïûÙ¡+*Q=ŽìÕ$*IF­ Š(°Ë*y Îú&È(ç ‘b÷©õ`ÑTùê>Oysýì%Ä~oZ…F¥*ƒ5ò €@ý–g[ìòFß#É ·Ÿ•RÔ¡‚‡ZÍUHµ€å³Ö·¡Ç¸]2²½§>HDÙa;*…ð¢$hŒwyŒ*4é Éþ¨o\qœ»äBEJº‘¢bhM¥‘dÔݓٓËöŠœå±÷V‡r[ñbÂÿVèH«~y{6Ì~½èüH..I!AAà×ß!™×ŽŒ´>YDNÌÀ)l-ß>$¦o,Å|9—s‘ìæG:]8ƒqHÃLA!ÄW`mÔddÖÃõ$8 }K6ÑÛ›—nq¥E¦÷u½àÖ¶\&Ø!œâ¼ró±@‚1 €É¹!ƒí8¬–°Žð.â(#$¾ßÛ98Ë a6åÓ=o“Ýé !ðV1²S±#·dõ½½ÑJœVür{ÿ£­{Ùe¼Ù±Þ´´ÊGT÷>šØK¯‚A¥©†]~ʸˊV"[hÆíøø.0P·úÄ®Ecë €ÓaëÙ†.O"ŸL‚µÍʉ!<Lj§•vK±UY›ûÌ>Ù7—¬"Ð〘 E¸ÏAxÖ^Q:q¢­…¨yjºIZèË()Yy7Á>éÄ+´Ó ½c©¡Î¸Ûû?™ÐE —1‘Úÿ¬©eà €ç¼Kбƒ3E—cèΉ|=g,Ùêó €‹{;xÚ~Ǻ¶[Š/Ýy}–Ï™0žXô`îZ7k'=¾j¯×Ë↮aŒZVÌ9€³¥xU0(f‘I^û´ÀG.è¿ë™¾™Pz Y hâç‡ÁÆ*²}%EYöf•â_ÿr«ÖáZó(ÚZ"±®Š‹¶;£Þ£âR˜¬®Eò«gShè„ :ï]*V“‹fØQ6O~R× V¨!õåÃíçëV[0r‡wÑ4<ËM“ݘÐ:tp¸{¼ëH£š}v¦#L›/îOLGx‰Þ–âú“Lj3;{¼°k2ôbɯSá#[VYMˆ.)‰€[Řcf˜Á÷ò!“¢g%k‹ ,žC6Œþ ?MX(¯6Ñö¹Å Ýƒ"â™wÝþÜŽu ­¦øØ¾­pzŒÅ*Mtká‹›JûtïíÄfUR:æÝÚ1`sòVá¤3à‹Ä‚Üì|‡Ú'§7;ë²2’]É}Ôd%H”œÖ¢’‡~nŽ\¥ كϺȟ(²=«ñøµd 6ÒÅHþ‰¹øä¡V‰a—ÔPZj„ô­ãâÊ]ü§Ëî/îG¼ÅaW šóhÙØîdâG o!ÍÛ1Ùý¨cw¹‹ÆØ+|½pl Ò0’É„èʺ " Õ¿;$aëÐŽH8¾@Z°%tu!L¥'§IÞ/Üã¾Érÿ¨·(:}ŸÜecs™_¥é·¶´uB¦T¨êñ44¨m“Øpqâ,!®÷ íb—û ’„”Ó¾¤PqE"ïF¿¢õõUó| mX¶NÉ[  YØåÕHvš(“:nÌÑUµ×cK‘À‚Ú·Ýò3A$å(›lîZ0°mgf¨FNÖpеA¹È‘z^gjH–8 ³èªí¤ÂXEh[‘Áå p\ÒbcøÞ’ÏTü¬lðvÛ{ÈÍñc‚AžjLRbµBoã¹:{»Rn´ý°Y˜:-Æ"WˆƒSŠa#ƒ“(f)sçã^šÆ¸ÿá8(Ähã8Ó4@ó}\ÜHk‰¦Ïxr™Óa‹âjDºo‰˜§‰ÁˆyG±øªÌ4NðeÏtó>€q©<¼,¶ueˆŠ¡D¯&¾m²<êê8Hý¢ {"³n•NRåì¦7›ÛÃÊRXCíiµé¬‹‰£pmB©øg3@Ò–ÅC–Úº½Ë»ÔqOcTè²ã†D½Ö!8À¯[P@WbFÀ¯ötÈãæÃ’Wˆ“[`¦bK}R†À6aŒJ4Y }sü-¬J2­†h?Û5d*ƒJ‡ 3ÿê}—"o-íƒþ®þ‰1ZzWÌ ÛR,„³JÀà>†¥B¾\×0Wsîz‹]XÏ+:ñ÷vl(ÍÐÑ­6IÎM™þDÕ ŸÅt¶…*0Ö’FÁ~jû)#å ÓW’ÅèìÌø/xpí´ºqφ˜q¥ËH¹éä[fÈWú²ò÷ÕÒ+ì&€,¡°=M+KÒŠք^ulu—êÄST! %óŒJ=£ym·g.Qþ²žzhÓ¯¹3•®kn›À­cÛ|C|e|9Óát7ÃBÿéó"¥c7mâ/[V¤dÑYz#§phÀª¾¦.ds4fQ£–4äŸ<‘(”ñÞà^–F;®jdcKóŸºDsâb>–jÆ$žQnW6<•Dv*Çî÷ÂeE\bz³`˜ŽT²É'* r*…XwRÝ´.«®$‡r'Ä^ÀˆÑJ™~Ëë׈ί<•þŒ[ÚÿÏvóDKBœƒöêªÕ¢±=³ãG¥"<Ä1ÅãšY 'ïÝÐÁ(?Brf¼¡xÛ¡bR6x# lBkêÞD'¡©¼þɘµ‹Ý‚²T¥ATSY)ß%\ X-íÆ{û>©¬€›a…¨™BS,,«?ŸÚAÝ$[s5.ƒß»ª©ŽQ+)F’Õ™©,·¨#Z³SbŒ‹à™†¬(³Ïî@¥Ÿ«Ù®·¯ê3 °&Ðü¶WÒ½Âp sÅ3-K‹Yr·D®7…¿ OTq¨ØþncŸþ\£\AÒ¡»IÄjÕJʉ€'§¥ùáÛòƒ†Ê¥.EÀ‹6oª§«Îw @\›Iæ/ÍDA(&Pfïm·ÅŒ_ÀÈ Ûòw”hÛ›E×eëèE¾:!€ª+SV´®xæ)¼»YïqGnk\LÏ$…OÅw1*èX˜•ñ‘iW¢À¸æóR0ôƵ•eÎoýš½"º9ìÕÐkvSƒ¼Þ£´}ü€T:ÊdS¶–»‹¢r œË%€V–åàÈuý{ €è‘¼—pÊÐÃn?˜ð‰)mxq?St~ å¸)syÊÿæ—?Ð'òbR_` ¬ìvtêx¸´Egûµvhý~‰Ž¹1]Å»ÍSÀ7‡ßB¯vG*:bçÙìuSH×£Õ»)­3¾.J%òY‚¤½œ4á*åÛot;O³ÍT€Þæ¼zñÏ®s²#!/LíŸþŒƒ»ðâ·Ðñø7»^z,Ø…ëhÉÔ4ƒºò”‹3–Ëùó=ê[Cëõë puè½"Ðîú9ó x¥‰;é´ßruþ@É’¨qZGû Å€®CþgË¢øAÒÆOœËx- üØE°^ù®¡ψ=àw¡GKèÿAÞ¤‡º>Á"yÚ?£Ë€ð÷…Š7ëß?£~ÖËúÈHíÇ<[P¨%ôÑO§Í¡ÿ¬§þ¡qÚ­Vœ~ÄsúPÑù;ÜJ^Õ¾QjÌ ”š@"”ýOÇ\ðÁ|t)СÃM3Fz›•¶“ ˜>9TÉÅßWž¹…Fê¢vô_ÍàÞÔöLÁ¤9N|‚hºìd¡bÛ ¸!g°¸ªÔîsk;µvÚ½Sjµ¨q,–—Óq—Oèë PŒÀKçDQÙ „}Œ†ª ½›¢J% mÄQõ3>ïÄd !Jå=0B±*ƒ@'‡ˆ„Û¹Ìf¿;¯Éž"/r,…Ëiuörµ(æµß—’ax ùíüÚq¹#Wß¿Èh@W±´Q¯œÚÁÔçH9)àÄ»ìÈ%„øý’׳cR¤Ü©ž÷C]qI~¸°ÿm‘ À–:N]¸ÈIa+ý|îcz¶˜ãŠa2`9Cµ–T ¤°Šj;Ù” "éS·ºj²ÓÒiqÀ&¬tW<ì'‚'Ro Ç 8š®hþ¤5°ÑÝ­ÑÕgò)ÄÈ´kmtn!÷†ÖG.>#i—ã"V‚Œ?Èÿ=B F°à0v£b–…Íh *¡¸2òÞ‘÷ ÞØ¯‘ëÖäOfÒð¿”:36ÔvG ;’nJC 8)ÇÓã¢+¸j–û]æ¤dµL«KìTÈR:–3ZŸäç{šÎáþIÎ2ûXm‰‘ñkL’LgÒ~EÖ-ïëv†Ó"]&mRÜWüqÇ便ä%OóRwŒñôŸc-ÑŸ3í}ÍùgAb›¸|Fý¯Ž~ªBå,ý)]ÎZ×êÈ` í¸!”Ê­åS$:¤Ð¨®Zƒ¶Î¾šCœ6j‡gDŒ>¼ÏF¬ð!€„0‰A {+&”rJ×<‰9²ZŒËj6s·à÷Ä© åk…kT©ƒ,zìÔ2²˜ÁG1x:uÁníÁ·*d’k€àœSåjÆâ7Í;”UR– qLY0v(ró¢íC§ÝoúYx€—íÇ™@zØ:‰‘™´A¹D ATiÌÙÊH#ꬊ$¤òÿ”…\Š* bûØeÕ1Œ2¯9Úd‘O±¤ß ÀNöVöá"ÄÑícCFÙ.u™¶rðñU\ÜT`QdøÈ®ÝBV•åòÁ1 o‡Ðëy‘¯ ïZ`Ba)£Ï•`Ê@œA˜ä)ó„AIÍh: £©ðïû}‹êQ4»;SF²ß[\ÞC%#&_{=@™0OL]q—|y³Ÿƒ1¿!SŒ #C•â0Öøå«»²„ÃÁõý)&JPlÖF6iGSVªÛÓ|Ý{ ”-°ÊH0x{ô3§B&C¸¼ÃQèWBÎ(æ„ç 3Ç\L6©r Ï rÄ1¾^°mGÀà_6…ÃûÁ ˆ'RÔ@?b¦‘…×oJZÉÈI þJü›×^¬ž¯K¸.BhÑLÓ¢B'[[’’ÀAáPxW«ly'» …Y¬‚À˜d±KÒÖàjÔª¥ÀQÏA.C?¿Á¯|…@|JÍÈ'ï[ùÕ®«Uá§Õm”tÐe³p¼²ÊôŸƒ&Ñ^*[ãI‚kAÛÖŠs¬h«\Ø!tÂ’œð³·7•“Ž˜XOqpo;-}4!"&;zäv‹\§òå—¦QÔLÑ €£¸çäfxPáçctЬ+å1ž°òz½¶mÛÃi=  ¤ŠªCŸºŠ-´¿ÆÖíö§—ð÷ºÃž\óˆ/ˆsý«ËZ²Œ½va@Î³Ž¦&¨¾Š[¿÷Ö5 ¸€Ÿ°Úÿ ¯Üܦ³¢yÿúëa^þ?¯{ðSÂCü“éø{=·»à€`@UOf‘¿Keéï¸ÝíÒ~ÞùP­Ñßk‘~žèü÷Åå°­VFŒb=èLÞœ l=@$E':6ÁˆZüŽú'²Ê öaφ §8INó¦ví¯/¥Ô6#Y;¶‹¤Üò•T?éÊqÞ™è‰JÊbuûßx=˜N?{¥Ùß6Å»“· è ó²?öéÜ”áÿG%s¤6-ê9«=òa³w5[QáHï~µ¼Ṵ́ó±D†à¯¸ó†Åýœr0ø•%KáNª0-­¢B>¥2ñ{ìÅy24H´ëkpÀèò6ÕÑNŽÓ*k`wšC¿òyÕJwHü².Ù‚poE“ ÜèÆPÌœtò¨ (4úÂSárd˜•¥¦YC¬Ueè”È æ}Àlëªê>±nƒà-ééO ×ÔZ7½Ñ¶ŸÕ:ýæ2Dbr"Ø€Ô\´ˆ½FÚFÔ]{@*KA^ŸF8I»ïfJ1 ­AíGiû‰,¯†ÌÎWÆ]š³°~È/‘K%ð~ªmÞžÙ‡Ž¾LQ‡Í¨> z`OCœ¹ …–Iò6¨arf–8ö? 6 ³¹·æ‹^¸BoQLœÐ_ñVµkìkó"‡:€Œà£ÚœÑ°M,¡\¼Œ‰šŒaøS³v ð@³EN¬(¼'ǪYJ‹Afð]~Ä}2oTÚÙ‡-ô@ÂÑÃI`Œ8Ò(ß,å*Þ­(R=|¥~Þw+´“»æˆ¶ORÚë˜n†Â/ÙŠ9‡Qe, F†?¡üi¡’khVH& äF䨴_8ÉÚPN`裻ašØ^SèùwìÀˆèƒ×ÅIí=éJk0‡˜j²#B=›+ž/,ª@{P;öœýçøˆƒ‘*QS%ž¹÷°’à*ãy¬0Ý,½^ D£ÜwC ¼ŒLªº)‹¦¦€1i®smXrܲöŒ[8§'AÄâ|2ûk“c«•z)çÇò—8Õ¦­ ¶}sÏ\7h]µâ=Dw †«¤“CIZõ§ˆß½ìW?]ψTÐ#çø#Eç¡éèíº`xuÿåq‚û@û:v æ¦bªB¼CÐÄÙÃé1é(Ü‘9><…¬Ú­ïø:¤¹ ¬íªL4 —(#jîZÙaåñ-Cfà«›pwVõyrÑùB 2¯êô‘ÊçG²(%õíîkVžõwbdqð–¥ú7kø5Ýõsù„›»mðTÆü„1-1Mgvðð(.\ͧZZŠ‹ѵÍiѽ @ÀߘÂ.ZeØðMDtè3 ‘%™=s8øšïÑLQÏØ—·ceh•Ù5l¢Éì©ÆVž À‡¿Èù#B+ÞEÓº]Qð–ЋD„q&bËË6Ɗͯù/¦§ÈÀ˜àAr+Jp¦’‘+Ã_µxFÌCïÉÖvµ™2>£˜¦¢³-ý»­õAC‡¨ÀjèH[ŸÿþûÏÄ• 1Ž%V—8!c˜þ‚…ûÐ!ô©ì-´ðwzdîâçVjØvL…Nƒ±°2ÿ#©X8+d¿çÏÈ•°KVÒY"°Ã×Uu’þ,”%¯˜ŠT¡ó«š5+\PŠ«ÅóN4ýÎþÇ%ÿþAQ…{¨œhEɺ2mp*D {(Ä"Z9 ;ªcÇKë®æÀ¨÷šJÀ¸i¦ •·&aÒ_tkQx¯£xžø ‘?·jÔ)To¢t¸m¼ŸîQÈc¡MïN£Fí5=“ÇÈ@ÙÌÄKº­•„e°ß´<Æ£Üî tügú³‰kˆ3YótG,u.áªKâ-OYø~¹¼‹à‹Á›·õLê(´aƒ)yëɾTv^g<k3E(t'ø .Á‰(î‡ÛqÿÓ¨ãsnqõþ)¢óøŽ¥sû6¾‘•NÚí(~üÌÁÔÿˆE)V Lµ°gµk&'g¯/øÇ^¯cºÏí³O>i$ä”<È~ÀŽ=NŽ"Ø~ã¶Þ¶¶¿Cñ÷ú±mÎxÛþöáOu(Ü ¸⿃Òüž|éýOí³ý‚·gÖÞ»ý.MˆeGŽˆÜ„~ÎFý“ú{ ã»W,E•¯ñÓÍò¯è¯sÈcá¹¾ÓNÂFôú€yfmÿ^¯¬ó‹ÎZض4›–f«Žæ· âúcclÛ¦Xb­6}‚8' ©iÕÇqö˜>ÀPŒÐ¯¯Šó—(k¡vjì½WÊT€{òá£u^ñD·ž Šk^<t\-O1-yñL¤Éêðt.Oã\’d%¥tÆ"5úÃÔM)‹›@ÔÑGµ…Noï2ÔîW»4T˜‘FQQ_Ò\õƒ“ä¶jA¦£vÃÄÊè;xóýо’‚_t%*MÚHÛ¦@ºzc—w«UE7^ ¦OYVó§Îé‘„H¼ßÇ0KÂäTÎì÷œ“cŸ"±Ñ^½7,9>n¤®3“mk×€™1C$É7lÑu²j5¼F­q(Äû”Ìòãå }ƒ¹ÿ@ˉñ¥ ð…JŠAÉDÅ›»{.ýPÍnR9ͯíÉà…ù÷ÎúpIÛùÃ?úZ¥¦¼áÇ´Á}ÆÌé9¤ò ïÉè59à‚á–eÆÙW¹1l*x ;&‘ô™~µ[@ûÃ|ÏŸ.r ŠfvñÓläÙ|ÿ$-íÑûÔöëéM}·ð§sbõH„”d%òHKŽfÊ,[„¼E.³ïéê§&赺EÀè˜*q ¥¢ô@—öƒ+Ƙ¬Ãˆ¾K ÔqÃaëõEÛR‘]†ÍDøÞSôì+Ðüâï%ïÁC,1P¼~µ¸dJ¤ˆd(LGB ‡‘†PûMÓUH1b½8q•‘½x2€›¢²èvÕ®ö-†q[9ÇÞ9Le·LÞ¯YíšÐÓ'E}MG˰¡Î±csD¡£8(E2æ˜w®»cºuøìÖ»«ÀWH?gaÀ5n ¥4u! Èƒ;ÍÙ[Güï5{Xe1SƒNˆm,%SŠ2{¼ ‘=œÍ “MûEç™<;ç›JD29qÑŒ_¾1¨¦ W@nª;‡¶M˜\sZ‰€ )H§ç¤ãR¢L×UÂ!ƒ@”eÈ ´TR ÷—{0HéA ,¨ ?[ÏÊ,(êcv=Ç»à;øyˆÍuO«ë²=C¹^ÓLÔ4µ^Åè1Ó9yŠó¼ëRµNˆgœ|¸Ì‰p•«ÑVI‡dÜH^ÈnMòó9”s…=.º3ÕYÊ·S…/—¡þÃ9ºU ïV¦]¡/S#òÅ£½P{,s«ÐÅŒÅ0ëJÓàJ.öö8Ø¡ ?…oôhF6íB ,ÿ$>¤)ôa]°ÕHB2ŠàòÝí¶‹Ô5"ZyÇnGýïÄ BÈc>7…Å$=Ù!{À`:‹,Û°JN>ürª“e×êˆKáÉ¿šÊ¿ô_K;ÝpÑË=òîÆªaÀæR 2¿Ñ^°ó%‘&)ÊÎ0׋C*ѽUª®Eò ½uHµþ3{(1ùo*èA _÷èvmó€‹öÖQÝÓŠ@:—hMžûr…g¢Š›V7hóUÍç=ö°r49’w&ÚÌ×Vå]5µ¬$ØÈbc0b² 4ôNYôŸy:ǧA­ÆQçà!ÈYÛèÔ½“d‘y# øó?„J"M×]è˜uv4]%æÈé–ù AÚ¯KïÝ’¨†„Æã ª7:ÓèÌDu…V•Iº ¿3p¨Z,ÒO§ßG?#CŸÀ›cAZÇÅãÚuŽY;*«'Ž5™`–L«“Df¶U9zbÜ+Ñ›°ß—bRÅ6:bâyIg•€!oªÍ˨!ÏõØ”¢æ§k÷• (óâÅ]‰(É(=Éòˆ’´A„»ÈˆpVY‰˜,6Äêù^€žÙ_KЄ˜Z É\'¯Ã#Ь‚LA hª·m¡ý¥ç\0¤"héVÈ—,­öŠN»‚ïàS-5¢H:§ç.C¦lÖ˜z|“DAû味ð‹Eç9ìuŒheÏb¸ÚYx>`¬Ò³_Ÿ+¶:ºéø:Ì‘£stW|õUÄS~Ë‹½¯¥wo£h<«\…•ƒEÙÀb†€O>Žˆmð÷ú§_ch}2çøÙÊÌI|«YÆC;mLQǾE»6`ü€Gïù– ŠbyÃöÉÊxv,Çk•¬ìûBoüî'Ê{?Üåä—¡ð¦Õ9Of84æZšÓ:ågŠiÜñXè_Öƒú¿•µh¹ Ú¬uðöçêÒ+Šó,à¸xôÛáßà•¸2R¢vA¦Hì?ÍCú¶s@ðy­ªm¯?0Ôü‰ɇ‹Î#à;÷ävB&€@lÜ©d-lxQ$&A¢Ã£Ôru¨TDÄ÷ÃGMÊX ^.Jž¿}¸„yÀÓåBíTcµ†b¦²ä` TÁJTO7Êɪ_ie‘ÔT¥Oq]×Ñ„FëЇ‘XÄõ[žˆrmÁƒ‡eÍRñ ²œ"²v¼™6\Øü4ËÑø_ã©5£Åj~BÝéb ÈE{üœ *'¡0ÒJÜ;ø'j¬»Ž?Ü0%qå± Æ¼Ýu— ¿«Íd§”ݼ£¼2:÷Fk?ÚÕv{xãïž\ò.zѹlÿVtèØÇ8†9fh|^.&B~ö*Ž/ o6ÉâÜPïÔ‹Ñ'°P'|(%×Þœ’åQ{>Áûª÷ä„Ë`Tr4øÜ̱%¸œGkQƒÛÁL2€G¥©³°s|ê ÇùuC-¶8užÅ}a÷ã{ü×zš™5\²nš@zýì+¨ð¦BК»Ñj؃`x0«Èy¸”$Ô|.`hÏ[×°R÷Þõ TóSŒJäQKÙûÍW©¯¹ÛØ{úhSÀŠ3H…Ï]²KPҚĹjn9*™8ÍZf×»ÑÓo! ¢ Ì4RŠ`±I8ô½(j~c‹cÝ) ö5Vâw&*…\Â$é½È¤ŸC6w#'KüËÕNWrÃ6þ;ñɱÄê º7<þ-¢ó-GBxsà9c2¶G?%?’ÄÍÓ`‡Qd ”¿|½^ y`»®‹#@×H „ÀÅ* d aŠÛøŠ#È¡7ÈÝ}g»‚A­^bd œãجú{ÿL|Š&®ïO¸ƒ6˜qˆ\Ès¼ãD”€Á¶ä¯v¡Æ«i¢›+d ¬êZB´í‰ rW#PW,{3“ÒD# 㼜ÿEòÄC9äŠäð8ÃH(µS¦’Ge—fžaÃý©ýßëX‹)•œ( yKÅŸÁF0ËÒòlçÇ–çS犹'@½KIoMwq",˜¯Å %îîó„Ø¢“OR¨“ ‘ΑÖäUDŒ˜É’ UÇåúÀûðÕ"Í~öQ°r‰Mq­À_ÈÛ  y ºç^.F…\X¡(ÂàJâ-­íöÅ¡¨q°/ß “ ³†4EaHŽÛÈkÛ £C$+J'´ÿh¨ìcÚˆÝ*}$D{å»3Ñ[t‚ˆq™ÇÙ`IÌêj!·ã™SÚbƒûí.„Á6Êìqž´#bw2êÉ&M±a„¼L†DG‡Ô÷Ÿæ“œ_ñ£çˇr`ÖÄßMV#ªx’=ò%âuÛÁ°1µ¥€L.$ð¼àÑ#ûë2UqÞ"ËnhâÎõ|ÑàbN„#uü½ÀÃjú»ÏÂj‡‚’‘ǡٯ„‹:dúuüA…§°Ë {õ¨‡3¼Oêͧ>Š^VÉôl@ M¨÷e%ƒ™À¤5^jŒÕ°ÝÃò 9}†BÅe‹ì”É©,‹ˆ^/ôêED„æ]¨º·D,ÃåÝ£lYš[õ¹“ϸLKp!VÙP ‹5 öŸÀQiÒ*‹I2ˆóÙ c¬’÷¹EÖ<¯I+_Ùô¢•23Ù Õ—©ƒþLÚŽx‰Úä1­ý¤”Š> úo» ¸^Ê®x¢B|ñTdHÚ ©ö!+µ*YwI+ÎQñ2„ÓéJ`PÔ9´ÀT£b÷PNðãa/™£ü¼LOèÔïÛƒi#½ÙÍ{¡¢Hsáàÿ8Ñyž2P·3´àÔ¬Õ«žÓÎ-ö§ÆX’,ƒ`†…g¥K/-‰Tξ—PL<~ µ Ù#~Ó9µ²xåÄRÌ럲§ìL’¶º%–‚œ¢Ô]%‘Lvãw±êØØJzÛ&îÊëÏ0àB‹Ø©7zÀORií«×.ae ÞûW0Ÿ³N×lFµ'ñ–C*24¸í/ڻǟU°˜àîõŸ³úoi…1Ê7šÏp¡Û‰¡q"½Éœå<î‹b/Jå—ÔÿÝR²dV…*OâaKˆ'<Af!:û,e/Wó¨L:ïG¦´¾ÛÌ–Wm£4Xp0à°”þ:–ïfk¶-y–R•è‰PŽ·QÕ” {gˆ…®©§FÖP4ß§DNŠ5žË]ŽqUÀÀáâ4)GuUp‹Â±šMâoWp¹ú–Ý“`Z$êMà)bÝd”æý‰.¿í\~å·•7…á—I7˜? Ú“øžõtöÞ‘pçF¿|:¥ZÕ˜úô©u³¶¿¼/È “(*¬>ëëuŽ $ñ[â`ƕЩ`n˜LKìhÃ'òÄJ;Íå‹ð b1ŸY-‹À‘•´>P{²Ñ¾Ç¡ÈÕ¢/ÉTµ!º….]µøýwž@o¶­¤ÎAH$Z^3w›¸ÃÔ·º•¿2’¥Ìé7äÞ`Zµ=b×£MÖöLÈi1+ÐÇ,ÃpÕ˜âš+ïtßIÃõ´0ø!5ƒ;šŸž²ää«?QtþzTœdKñy=hÝH0$õº®Œ'AJ€£E×ÂAï!¥n×f&Q׌yôö!kg|úÂë«?b±óï«©QÚ%7¢y1rç Tèwo+çÜ[Ö ÉxžÈa5€žä¶­î„‡†ôÁààÛ û¿GøE¬õD$؈]Œ… ²«øÈ–lˆ»š()×É‘KÚLs:­c8è¾¾Šûâ«*µótCGBØ÷··Ä]§Ê Qt_DäbãÈzµ!Ga¼=Qà¬L p iˆ‘žÍðg\îV¬‰/; Ù'؃'„ØçÖ=,ûd`úØ*û5¨y ¸€Ø>Kš)Ý Š0ã˜î¢Ý•IÉ‹\¥hy!U²«zâ{.×ñesÜÇÌ0IµÐ«‹ÎIóýÔKì)4 "”/s(þÙ¸>¨ô‘Û©3ê ²Y®:¨ `&WÜ·êQ9–=\v€HÐÑ‹¡9ŸF%n¿KVe¤%~à‹lr• iÁ ˼Ú÷ñêQE¾Iì¶SóTe<àH}3Øßd%a”¾Åd—rWëÖGóê"nûœÔ”ª’ãåúsG3Óky[<ÂÍ{UK~®l0‹£&¨w¤‘v­:öŒGÏãh$¢ül“·_°©Ú¢`^ÚTPÖÁÔJÐ u ÔZדtGO¦™ à¬À¾úN8jµMiÉq=K¨t66Þ·zUÕ Çë£>œ+éUºT-S_Úƒ&§öí±ýZ¦gûô‘/ý™záý¤ÈOÿ(¹eQU,Ð ÜÆ®Èžìy—íâb$U0ˆ)ÿP?¿Mø -wœU‡|Q¦ÝÆ)¬I,ês6DÿT fö¿×ZÈá­8IÀ˜a(~ȺJáÒúëõ?iKo+zLѪ¯›ãx˜=D&¹ØhL²²u·inY]ú8d7ú!uÙµ-öšgšHÛGýqðˆú 0 ¿‘Ì(‹!ùÈ [ŸÜ; IC²`B°™g¤TfðMê1]µà®‹ÇpúŸkÅë ¿‹ô`¢1K|Xntç<àO¢GŠwoHGAYåÀÙ'_¯4ý…‰nžŸÈ $ªIOâ†(|À÷ùŒãk ÖÊõ‘Žf<Þä…` ôº‰˜I¢‡5ñw¦]27ô±®òàDûÝCCíÞ¾?é‚Ý(îü*|ÏT8Ø'§c˜lƒrÆ·=kÝÃå&åÈ?‰1@ÅÈe€Ù¥Y`º²\ù ZmìºÝç­éÑ©®3,. 1¥ßŽ^ujáÃ[Öq®yÖl_ê¹—• +ÍõA9*Ågß)ε´ N¥|ÆüÕ y‘à‚¶±/¹³úÍ<¼„ðÎËXcµÍãç"Å9ö þdŒYcéZÌYiȼnÄîI-î`DæàsäLSE ¸‰,Ô’6*ߨ+\4ßs€)‘xE-A¸XI(²³N'V&`D;Ó²šJü]gÜj àf€VGý°©0¨¹8qºq[š6©Í¯oÈ+;[õ5ʪÆM9d9/J®{ïÅÙÈèœQM‘ÿ9çÛúï4ýnK'wô•Ϩµˆ?¹íýÀgj¥,ñÌœK²»sÒ2`Û¢IëÏ÷6-Arz GÇÊ%¨È-›»ÁÂVè÷Xб1F¸·J>}yÙYö§å˜[¢Í9ÚšI\17¹£â…Ãu{Õj´æ’,àÐ×§ýQî˜6ƒôyÓ¨{Y5»\†sSHr¢¢MlÖØä ŽÅ(`4úg–|àΉ6C(rÀõ¹²…Ä"쯺Îù5Ï…Ø Sâf­ìï{t”(☫=¹æQ®Å~©aTc_ƒDÕ]œ(RÈ3 jº/ÔôV£ Ç–Å1cIÿ?Úc¥ àô „NÜ`» Á»ªXŠM#¼ã„x×ÈÚ]ï Ñ!™J8 Vߪ ‡fm¼vu¢šŸr S‹ƒ\^ K”º±Þœ÷M¿<Ì0ÈÖ·v¨³jn‚€¡¡eiÒ2ø˜rWiëaœæsÚÿaUIø_F?&®p‘­ÒjÖcoÏ È!óÑåKM dù´1Õ@øôÔu!!Íšímûíÿz.+¸5Ì0ì¥ÇÄÒA´7Sy\@-©í‡öÔ´ÅP9•\T¸ìFüÏŸÛPÉ%+öÚwB‚®ÆÙÊhÛ†#—öî›ÒÖ^<ØþÄuÐMŽô'MÑ · áŠA9aÌ ¯d¤ÕKpI^æÔ\"GFѱ AÆNzV Ü1·BáLe‘‡|:ô5<%N" Ú´iFiP gÔW=’Ä\bV2&ÓCš "Y@±‡* ° ·€ècÅ|뜽`@b¯zJ)"PŽr15®óÓ Žt£Èœ,I-¼äÑ ›ÇKQ ­¡k6zeµ»b²:†‰ÏˆRØ/˜Ü›ËÊ“¾ÂÁº ¨ð`(jüoßÎ…pUJ¨giËÆ¼#Û½—Šù*â!ç¤B"ç¢DnYQtøöÔUþŶmØ¥qÜ9漤'E+ÆãÄ ÁϽ®˜ÜìVžò-Íû—?¤Çªõö%œ…'" ÂÛÝü}:³PGº6¦[âäŸëT£¹Åp†‰ª­L}Å=â0WNPµ¦¿¼hÝ3¸'ÇO¯dCC‘Hã-Ò ™uéZj›™àf[ƒU5¢kËUüxzÃfÆP H:˜Œ20`mO¨5Ç1„alHM€¨À1>[v$…wÉìvIç €uùGØ´dCê!cdtÚŽóô ¢`¦(tæ4s°Dm«ÎtVÏi2 a©ÐŠÀ«µë™*45Zsì¦.mT| éhŒP_,ˆ¦6^1TäzùKKuƒ‘GV¯»œC¶P ñÌḭ́’èvëÂ*«›p!êÆM'·ÌÇ‘«(çxá4^õåüjó¶³°oÏü‰!x­“ˆÿm 8<}pT Š˜o¦=Á¶áË E»`ZÚ3¥A}mcxÍ‘—@LW4§ÑÎÕÔ]NuðÙT%½_¤¦G)õ&óOgÝÉXHÀ¯èØ$±Y.ãµ ‹vE˜6«º±Ùð°sÜ{¯eÀí y|]©(Ô¿çõûDç_1Y¾ý–G·Š-¼^¯mÛv«ñº{ÏE6¤è ¿·ò#:úérç¹øÉ—#Æj°·í$>žåïõÎ×9Ô+QÅãyQŸŸ?“¼ÏÊø’©¨Ë‘À6æ¿™¨&£>…È+à•mñv 3F¬\õ oн‘óÃé‰'xþ¼ý|çðÝjŒ'–œ÷oè™i¿Õ ÷}(ñ?Ê;EÞÎûÇÅOè¶÷ ‰Þ%z~‰ÂÀÐøó³ʧÕàéP•|±ä¬=ê¸okø—^µ†â`ü',ø­Br`nÍO% ŠÅ_‰‡ð¾t‘êìJ~nZ[£šUýTÐ{¾‰þÞSg;úot.½ØôS¬à¼×æwQ  R¨ìòf2üùÄ_æ·œèü ‡†»'Í\ç¶žM T“ú ; ƒñ¹–°ö˜–Î/û—­Y’éiZ*—ÕP“Llc„Ñ¥̇½c8"þË)Ól6ZLQ.-9ƒ£D5çu:^¥~‰Oeq H¹…&þƒj#1ÞZhZ¾\‘$F¢Y“¦~Ü|2P,ʽ£€Ì:îxÎò ª’êwQ$8ÛÁŒ|r¡ÇdÞdH§#’ø¥Û^ª(Ès«â¶ß´ñ8Ò­9ªì€Lk˜È8»‡rÐ<ôW:ÈòD¬Û~Õ‰ÃtÚÃ=npL%;®U˧¹²‚ƒÃ¯=êJË{lùN<‡³¸-9I›gR¢à¶ÅÙçƒê@½ )áŒl 3=ð³…M6æÓÀÓ$eæìõ:)§Àúd½Î'ìBnÕÜŸÑìiÊ´ËoY#ƃ˜„¶¯Wctwb.Ê—–´Ï+<Ξ å y%]Œ’‘y¬g—¬`p0ïߤý?yAˆh“ ¢E¸Î!tlqZ©ëjî?c{g©UŠ7j;¾_0²1WLaJøÑžGæe®4ÐráÕÍç¾qÔ¤] ¬‘ KšÁ±¬Á(ÜÒݶk3 o¸ÇC M`^b¹ù‡Ç;4yFѬœLÍ¿Õõ1öh‚iTXYÎ Ê3Žæ hé ´-õÕð.ã?2‰ ?§Ø Í\©ž›©"nx®£R¹B•ß*o®®Ø}sa²,Ìá6Ÿm0µPk"2PRL-ÑñPì2Η§ÇÔÒZ(óùP‰µy–WC­~H×w=ņ›Ü´!hkÔ´† Px³ñŸ´çá•‹ïq®¤LYË?ª_Nò¾©šÖ¹ì€/…:2Öð*‰¡Êw]R 5J*\uâó“xÑP{‘²#GfËûã±€æg,÷{¥Ph…ŠNS<À¢ý Ákáâù z3¸]\Š“[R@“:ž”>ÜŠ8á©ý/Éh£ *A®qØ(V°ØÀqU±ì³à•¥¬ z€Ñi¬VhNT>]t>Š1”'æ§9…%f¹è ·VÀ­dEq‚§¡,Ž3€RÓv ¥bU¡A`|'Rl0ûNçØqû±¾S¯/à‰\Ì,Ñ;ë~4]9?"›G"¦BÝÚ¹)!äM&5Œ«#•â#œ˜*õq¸kf(„ø¦»u*M.2¸h¢uh¯<è®%@*ô¾¢V$„IUÂaÇãP‚ÑuÝÏ¢@Gñpœ!Q¢oĨv¥è° Ë¡.;` "_ûî«U A+J1¢³9åéä‰Q?™Šsä ®8ÙlÙŽ¸`‰~¢h&n‰ú0ÔÑ{»'‹9U©N¿¦È讀Gì÷®| D›|žˆˆ6¢W\‚h ÆFÂÑͼ_tnÄ¥ºl+ö*Jþ bvŠÀ‘œ/¯ßAß$,,VK®bdU bµI3s ê³Ö¦23Cü?Î Åñ3½®f¨(Ê¡1k{]¥ 2.¬3.šÇh§Âãž¡‡â"Ïu?{ËÞË3YCÇñ¹Måïí"$3¤WÕé£f§¥©63­3***¢Yl‘txWMœ ¢EqEÿ .ù ;` |æóÑx@Óq€n R'¿ž> ‡)<$ÉP¦:àKÚ#{µO”øÑÂØä^å… èñœVfÁÏÖç°ðèƒ)–ÜŽÊ;‚šÖhq‘¸QÕz«´Ð¨ðÕßû:-ÂŽxmÉÖÁ ö9ëyÞ´tð“Eç/ï™ú“x÷> €‡t_(ñ><Áxs__ðo¼†Úà>€!ç/ÀßO9ûå/\ù_Äo꤭Jø{=˜v.z©ÃÖ"G<Ì ™z|>µ‹*@¯ïxmÐôAÝý;߿ՀÓßÓ=ûz½^ª¯¿×?rØÿûï¿GÜî¶!¾‘~DÀdÚ ? ééÑ:¼^¯{ÑŸkûä¥7lÛŸGý{-çš?Etþc_Šª4±‰ß¼Ÿ¬qТåÂà¨iËúwT#røš7']eÇ4M=7û ~å©QŹ0FveêŽBGœÕq….fñY'ç´ç³O1HH@N¿›P?8ÇR°%e›×f=~ ÈÖòvuyï¿Ë“Ö\Ϡퟤ$ [F3… ëúI¡ßuhYçከý€lÚ9.uÇì #¦Ã, }¬‹]ؾ+Ol¿(ôlL†®Šäò€rÇŸ<®`ëŸÍíJ/ˆ¼(ÜŸ>&êŒÈC*6A¾’؃³ M›ÙTxÜ)ïåV¨qæIè­S#)Õ’Q FcŽp„LeBAT ·”é²íÿÙ H,8» Þìx®„Cu’fxŠÛHèD«¨P¹€©àÛÄÂ3RúÐ>ã[}GP0˜ÕÌà|ÌuQÂ`1 rFÊaâ®UºØø •)àÏLÓ"%†4}×ÚР¨éxéN ØHpðWwq',DÓ^¼—;•¨ÇHÒo¦X¾£|~€—@Ì'›j˜œSáÄX1ˆê‘ GµÄUoKnÁjÁum7 )XêmÛ–¶ÃÛ÷.0P¤*dcHë 8‘QiÊÑLòÂýØh#6AH§ö|“ß»V0Ïn|¬$ÍŒDÝ´¢3Q7„ÿ¬KðäfC°Š^šÊæÊú´pU‡E;Tºƒ|¶µ#<ØU.–Eš\Zc=Û3¶!7í¡ÀcWº³JJB` ÈÙW}Üs9~t6ó ;}Õ¿Yt¯ƒË xzÿ¸1LNp=œ@£€Xa‡õ'÷OŒòGÊœ³¦Ç¡ ç‘Kù7'DÜsä+±+œ5'V¤‘$e£ÁŒ ±¬Ê¶¦K±¬(¸Õ‰-šj鬸Ï`›ÆÊã-”Çý†®z`É‚î !‘ƒ˜3È BV+èÏrQø¤(@û?¹Ö¥+AîÔ}øº…e¾§WCšRã±n£}nbE“¾ÂŽ3û\> b"q²ð@JC¶ÃУiI à†Ú:˜ìÂNé˜ñ^„à¼ó´tÑØ<NdLœ“N“’ÆR˜žhõÚÐ˽G 9ÎUY@?l“´ ¶r£äf*ó¥j–Jz^[ó¼c‚ÔÌKcÑ«Ôoç˜5'9²ªƒï}z‚ý2Ýêà×)I+8®Š9ñ$­ìZy_(Ò«¸'"¯¢E†"†/:zà áZ›Ù‰Lƒl<JJn6Gãé$54Íy@&âçœî&~%;óH¦)®6X„ÇG–ÚZ`–y³‘r ˆX« b€Ë£7¾a}¢u©ø o\9( A ²‘µ«=¦ŠX·¸È•ϦÈüS¢ó‹=¥FÉ™òÀœ.2aœ†{RI|1±ð‘ñm²À% óŽ[%€èé"Ϫ|b$ÃÜ¿¹äø½¯µ‚ó¯²Ò7õ{ þ^ëkæ1Ò%^ ßÉ8W0ø7Ÿ:1©…Yß}\é½g˜þ€Î=ßî¯ø÷Dÿœòß럖ÿÑŒá/ò¹w%ß¼œCôÚ¶*Í_þù¡°ûüŒ¶Öp+<ËÅÀƒn+ë–òþ‡ u,ûË¿hçÍ6a2É÷Ûc÷GÎþßkñüXÑùŸ¹ØÐy³ÄÝhÿ"Ü‘74EµóxiköE^úK¯¯¢£é%ö“Ñ’‰'lj©Ï9÷x Øy¬¡ÞÉPÙ†c(’š¹GXK]{ËsÝ)GCè'ÎëØ{e’C£ù«Yº="}1Û`7q!´¶ÓÉsdPúF€ys¦© †¿¼“*ÈÌ¥uGJê}«í×üv”x`ážó§«DcÌ|«]Î[L¤ bÆ«éHâçVtI“"J¶Ù$}-ŸŒ}ü'Vy2±êíþç°©}Ú¶ ¾XvŒ“;”wNÆä·ŒÞ”¿l$˜­^AL8±()S€ËË1i•RÊÂÔBŸs´dúyÄ\üI>Š+qy‘ú‚ˆJ¡Æ÷‡„R¦hν3bÛúO²å[â¶zÒ“ÁÁä,Ë'´oo¬AIn§ƒÞ_:=q ã¼DÇÏtZ—oï…M£ÁËmHD`LaðÅW÷—qŸÙ¼‘Ti¤;C9mžÜ »•‹Ø bo¸Ë®™HïªxØVX€HŸ…| sLNŒtôóƒRÛ‰'/Tð˜ÄVì+Øœ#6s·LPsåœ¤í·®Ö7µ Z^Û±¹cu]{¤æt7saÁšö„§›I|ãípðëõ3R~Õ‚*†ÐÝ0Ÿ/Ðä6¡×q Er7Å^Ap“;Åw´&º2 8d²ò`n€ëÀkŠ¿)À…ø ô*hÈ,E¹d” Ç©Ê*ì ùÀÛKdž~½öч¥‡‘ *vg”%ÔFôã ¨ Š+(èÊ'Æ8€¿Dè#Óái(…±Zµ¯‡™µJµÏîç$|êZêÿXZÁ‹Qj]„»âé\Ø¥Q†_Úa>üº:òÚ"‚Nbc—L÷oh‚„_ë(°Ë¢Xª˜YNôßÿØùÔ‡™Û _ˆ„H¯]nŸ w@jë¿sÊ öçµp³Šÿ¶òP>ÈäClȧ a™µ|ñÖÞyã¿OtþG{N=J]2ø Ô©‰Uú4c¶_Œpzƒ';ökñé…=¤bºÂâcïû•r6ðÊž‹®Ìðúú{äz„R¸¦öt›j6¥ÛÏ£>W9Š;"‡X)è›:K£éÆu¿ŽìëñÈÝ>e:ǃY‚ªƒ¶ÿ.¶FÙrà6€&ýðiZÞcÓ-g¡Ÿêº83oNâ4Ì* {9q¯´5Aq^œ»'evJΡMü”ÖÒóvZþ$1ïß4£‰Åݧ¦Š 8Šç œËãL³Ù~·¯}®ï\^ijH™â âÞ£'4„*Ý…¦ê¢ß%§4–¢Ž ývnð`Ÿ«®Þpð=*Ìû¢û gÓ…TËôV“º¤-W‘` õÙ¡j9ÔBÐ 3Û{ ëÁVm_.ú˜©p‘@3¥Diù)ŽðÖV¨I(èvƒÝ8Ótqí¬Uã“%€²®—ÈšY‡x-»š ºÉ)< Í$,Lg3Á[EkhºªÅªç½¦gÛÉåRpÊB´ÇNXÔ¦ ˆøz½– ×€¹ðtñ vŒ’è£>8:¯I%vWŠd0ªkÄ f%AoÂvE5tçˆLÌi€êuÁHŸ­Ç°¿ªçdd IH¹wý’2‘iãxWÜUe¢£@út²"ì̶H™Ö1€(u7†Fñ¢Œ=åñ®ø½µ9dB.ÖÌf‘ÑRˆÀ Ý+©˜>l*èªÔp?D3,ÂH”'Ædºšw-Њ”…Û21û†ÄßèØ¥cˆI Zq ɃQlÎUÁVþFWP.³ÿ®Mi‘‡ör5 Ä‚ “Erru?¢T€ZÀÇ©àm¡›… ·¼†@éø×aZËjL |  #…à{-Úxƒ\eƒœB_Ö*GÎ\3¶íz¸:Ê–²ÔÙÜrö•©çöŽ+-ÄKe®r Ì4TWSt¥Ã»CÈ“üN´ë}ÇçÈÕWÜÏU$~’ØŠ\ÊyòÕ‹„ûóíQ‰ œ5!r ¹ý ­ž£ÕÀ¬Ôœ\ÀŨ¾'4è¸s1Ѐ,ªÞ“uD­%Æg(L[åz"ê$kÌ}­ç¤¹¯ñ>exŽM´“Šp»MGžpd.¬mPÍÃ!i@ð¸ã÷q»sJž&n ‚è·è 9¡1ö"cÁ#Îç7ã Dö’žˆI ÁoFÂ\Mb©÷´,HìÙ¹ ü”¡‚bÔ¡P±Ó¹B© ŒAŠSó¥¼DX)€ÅVò·â+Ÿÿ»EçOX3Tšù»ÞÂ\ŒežùÊÂX/5ÔF;”g‘À €‚×½Þ§æÇáµ³_"È$J—·•îó à±âtÁ,â‘è;x0„JfSZ G8–·Ó9ÒÀR;¾éK €1x£§xv+@!œñhs¼hß+ù7Å@¿&ºþ`n}%­^‹{:ÈLíJÝ÷èšñ De€ñ¯ºL÷M/0úîŠ)± ª6çÔrÐLÌ¿ÿxÞD4ˆdt["Â~ÖùÏ1ù0y–Ã6Àãà 91@[7+óœñtÎ:-1Ocä4ŠV;­¦úÚä7¼¦ ¼Ä¾êÃ{ë›Vì’AËUöë½ €¢ W_½Šë{)gLå ïÒu‰,ðÇEÓ¬‰ß¡)éÙËICîbLðµÅçu=V°m*½mÛë…ïRnÌlú Ýåv@¨útê¾|Õº§•Ê<~WÑÇ,2Äi%å?‚A ™3Ösbì¯*_yŸzt \ª«BÝ{³¼øW‹¦Ý‘¿ŸbüBÑù_òj+-í¹Ò«YåÞk“NÌðºŠdªÇhÃm7XÅ<*4ƒ‹yÀ<ºšt§Íùª2Üè.%$riçVK[“æö¥>¬Šýè¾€Šó ÙH˨$xÒ㨙K Rï`;š¯V Cé²q‹œ’9/Û9dýUý_š,’sQy« šÃ;pÝÀœ µ’;ÁêxÒïÑ¡µ¨}þ”$h´w]ŠŒ»%Áz]íÊî«·âºÏ=,$e£ÛñdÞ)8³®.–½Œ 3˜ŽIø8+]xÌØ*¸¿©G—I²6bUcŽOpàYAyL ÍxédÑâÝΆYÍ®S;k%L=9} ñ²:}ê(*Æ8H ‡³Ù êt%ÀRÁÞ”F,4ÑìuÄéø¬%3KjÄ’l-ÏV†œ‘ìÆv¢{t¶!¼¾·ïÕq° OKpQªâ±—Z©šO÷çÈ€p±¬€tÌO7Èх~ÜuÅOÕùöDZ¶‚~×lž;ƒþPw"Ø6BÜÑÿ—Zð·šbXˆŸOœiZpgÃÖåSÔrõ€Ò5‚šÐÍV" íf¦d^ÀyæüX¢À G`;^<Ê‘ér㜷ªü†—UEù]7÷SEçPÑ ÂT묌(Âë\#ÖÕ*õð‰ó‘…Eã"‚à׌̺ý‘pYxŸ€Ö èæ9uèü‹T¡eÄYäCmŽšÆê<04ÊBãßdŸTÒÀýF:;L¶:}‹$þA;À)Eù6æxÕ máûÌl0@<@B@ÔoÁˆ4!Ùh#¥·q»½®‚ü‰[¼Kÿ7©½·_¾$ƒÚ(Åɹ/-œ—ª`ß~¤Æ’´8VEí¯$iM(Iž/  ôãϽ+Ck=·=êgÂ[.ýÄ5éL6‹]@(|(‡SZjRÍž…qƒ†=Qx ½:I9.Æ®.õ› Úu¦iÊG*§ob;‡ÂÆ“ÖΩYÌq)Xp¯wÖ"Oo¼ò¸Ã­Ë(°ÞòÏMwoQîÉj"ÛÁnÞL2‘ÛžT4hjLë|Ú¯_8DNÒõÓTè\ïàú6CLÒ±ÌÁÊXÍJZào]Ñ ôu’@Ãtu¥ï™¨æ}Z• «(ÀY¸@"†aÍòœkˆCÕJËC—¹;¯›`.¢Woàκj¼CT@3ßx Öàü=-”—â”õâ|Q¶âXQ ™ULFŠÉð²Ñ€%ù\ð»0¿6R‰4E¾'²6’Ò€L´EÛèdé8¼(Š÷˜·:‡þ(š²œ@t§Ã!¹¥s{’ÃsR…Ÿ€CüÁþØ 2 p¥(ÒS,LN+™¼:ßÿ˜ÄÜé…Q¤Ô¹¤á;>3Ô'ºZTªv<ðŒÛ¹œhÍEècÏto¿Ñ£y†üçÙ%)l/s..Tç6¨#ZGaN›îÔÃ>ÅPr¹“;Râ°&5#¢Ü Ú)Ž¢=¬Š{­ÇØtÛM]ç'1VÏõéXèQ€LÛ‡2 ô"DÕ=fw)‘ëûì@èïr»ýz €høÁu€+îüØÔÓ  §fB€ö²†Î¨ÌX}Ö¦«†¢he>¯ÞHÞó4Pu‘¥&—?ò'2^/Ü6ìÁð¶m{”øz½ô¹[amYòæ•Ù$|ª3O[Áè§kÈi~lôEŸyQ·¯~ϦªA¿œ26SëžN ¤U8—yù–§0e^ÞŦå–ÇÕ@ÿÖð›+³ß|×ù:~p¸óô…ç%“íåN/'Úˆ¿QùêG8×Mâ[ŸÈoÿ¡1 J ‰„— W4 7ÃÕÏ£MÔòØô/úÔgÇf­‰q{´3˜êªÀ—!¤\Œ $ÀFú<…B”ïMá+ÁXbd¤ƒïðÓ2>CÄ>ÚªÅüm5cÿÓËŸC‹è B ‰îwPëមaí¯¨É1l¹•ê\Ÿˆ6" x‰~Âшª¾ƒhª÷>°‘(D*޵Q¼6#®r ;’ÛFwjXÁn>½vÿ³8´#0"9„eânFÚL¢ †åâ7$éÆös­ù¡”¤YçŒ8Ky›ŠÉ_b÷‹« 9x¶ ›Ñ7ü1D³àqø¶ýÔ!W\R‹”ÐK§‰SE%ÂASOc»îö:áe¤Ö¯ï`DeGGY‘ì4HT–©”ŽY¤|œÜ!  ý€«–7WF&ì̺§E ‡½XÌOo®5»ç$Y“^p ¤‡rI^*•9ï|ò q®&â3}»‰#n–%§á÷1Œù[6N6ö´yŽÒçḠ7ü"OPË'W¥Î‡RÏ×UŸãâBêŽøV1ús85‡âM‹Êüp»¥û=^„¡Ñb: µE¢‚Äã ¹ÙqdŽYá‘(4q_–ߊ¥MË„¹–?÷{!ý§=ß„8 )€èH‹Õ"7ŽŽ2ï±ZWPJ{1!0RÑÍz Äu&^e$­Á航u!/€bßÞ§¢U.¤Þzã „‚çÈ ]Q9‚H”qü¥lt%bµ£„Ú‡ª!‰P$#®œ\^‚Ã]ˆPg»ºµ¼Ú(øh¥¶.gñÀʉz±¹ÉÝÒ2®`kWÌþ~¤æFAK‚\{‡é7:&—épqN9Y¡ƒØdЗ†gºOĪ7“€âT‘wW¨(7YíŠfTÏp§[õ~ùˆ«ÝE92„©"q2GÇùØf½³Ð*¢ÊŽ­f´É“Yè®þ•ŽC½‰\!£4"ÀL ét-ê+½Jò2ß㯢HÎø¸“¾øìhõ Eï€î‡Š¾Øqœ´ž ž¬p¿Ô< ¡¼öu¢A»Ž„±€OÿÀ`W­ÆLÒÏé§Õ4íәެ^›c Ñ©eH…Þ¡š4Öað\²Ü "ôP¡{!D>‰ŸÀ)\9 P¾ûÏnoš: OM̶9üòuÑ*âa2ñz !8[ øôŒUÀP¯8¡4Ï©Î>®«¶[Iƒ«£ÂiT½=Q÷‘óßæq•c kfD|ZN±›´ééÜšTZ/¨¾§Üzô,õcÏ»ÿã €/ † übÚ™dõ²Z3jÆðö—Çâ×›M23 ™ú¯Ì¶e«Ìp¶Ù¾9®§ ]ñј;B¡NE3€\P ·p àqÃX•*4eýB­ÔŽ™š3°àÎb5°>Ñá™u¸»¾´QpéÜ,÷ÏRé‡7îC·†iC–ÞEm:Ú™ÇA:ŒŽÖ~ªœvP¡{2”¹¶ €U1iæXÄ÷síb{52kq…~ ›ÖÏNùÄ# ’åT>mEÍòÐ~¬ôMËHæ70ɨ+AÚ†ByàŠ¨Ü„ÒÂ"l›«°äëfWí¬3,íy63ÁÔFÚù(§°aÛi¬üÖÐÅöChZ}tm×uŸü ¶ ®dähÒ2VùEçO¯O2 æí´¡×d·‡/x½àaù(JÑê_%ů¿Wù„ôÆ»ÏYÄÝ!þ_H—Ÿ°áVœJc. ýt O¹~Õ0J¿ãü4/•µ²8l %¹þ wm/ü7&å>™=äÎ>ÊKžÈOßoaVg¢ü°àiÌý Aß´‘þ‚ýßûŒ?wI-)›©wæÍwûB>069Poµüy^[ˆ.ûϼ<³µ}W„ èæðOªñ#À@ä!ôQõÂÿù‚É?/KØþ—ˆÎÔ¡[²6²×eâŒc1ÙÈõg˯> åtøb¸«sˆ äO 1 98\$ÝŒ…—|mž.ƒ¤ç“ßEFD? Æ€ ’çݹŠ:Ð`4ö3[ÈõÆñ±AµÄ¯§ÓîØ‰Hˆ×–¤­ES ûÔ "qGGÕº5oE›Ñ}‰$„kè°[{û„jûÔœ;öïY§ƒj mÂT„j¼¸×]ƒB*QŒ5Y¥©0ÒbVú¢”£iÞ…ò<‰íÓ÷*õ 96yÆ2ëÌYZ6Èz¬œþò>á“Hz”‚“¸yÞÌŒ£m¢®°nësÕ¢®«Ü£¸ïŠmª°Pù_‰!.P îvŽ7¢ònd¿ùñôpÓ12óEpÓþÏmò¾«Ý”S°FOÙ”dn–ˆÜg‡½Ã} æb~‰8,çFä]%†öÓÐpA&Òד*Ú¯AØ&á,b·Ûun9cáË“”¿ø‘Éû:w?¨M/–a±ëA“ñ*Å¨áÆØVgoóÏ×Ç´S¿Glê}“£,˜†çÐÃ|«q§€£ÁÒß”ðr¨Ö5FR݆~ô°GÀÈ4Ÿ[‡ : ÆtGt#=Šð„±jÔö|‹ÒBTo›dÕVm' ˆ”­âž¡óhBiÐWBRL²¿‹Œ‘MÆ|Õ@÷–AxîS4*Ý÷\¢¢+ùz„<ê²?‡ì\Ÿ:ƒãßóσ JØ'KØa˜#}$›È SRæ/o¿ˆ8{³¨Ì~x®5dHFH·mVäÈr5'þ{´æXCèöÀFËëÆÒn@in¼g5 ê|w‹?1’ÁuËöÏv•Üx²–¼; ©˜4mÕç'ošÑ¸æéµjðËÞ·è ìä(‡³RÍé™Úsßd÷¦/F^œÐkQã¼{F.b·V",L¥Æu€uè–«é/Ef|¤­Ž(¿ËÚ\JÿÃDç—û®È»ÅÊu!sn‰—–܈üŽ`;ÒXG?ô^躙õ6ÔTG)êÔ,ºÊp¹:þ5`æ‚„ ¹æVÚÅCÐÁ¶z#™ï£$ >›……ߊ5“4܈H rÒxý|)eZRú0¢@B˜B`R XÑÀå„ÅaäAäW¦r#j"ž[pý^TcFXMÆ •õ)-ÕQâ²GÔj„òS*4UÉß¹²”Ž|®é¤e0“òRiŸh1G”2\òÞ0˜_}2 Xˆ“àBƒe© QL¶Ê`Ê\Å™h~ÔMec[²í¹@¡N¬ž~é¿AZ]Ÿ³X_1†kŽ(ÎMN0Ö/†³5Ìœ¬lÌ("Y:AH‡ÓNø%2ŸíƒŽé+bVbrïo½b-'c3dˆ¦¸¿*øÇ=öø™øƒÀŸ„Ôq|K ÛßãÙí‡(ýV¢ð¹ìvÖ›ë+FÚ8fÎ֊絆,Þê&žýØ—‡ªX–]q,ÃÀ"Ø+IT&—7.W\,X5TÑÂÒ¹Ø]¹ÇcâÒ·qÊú-Î$®£4õ5kÛlUõv‚µ’®ÜTè6€‘÷@±€ÓO! »\¬bUb(€_ˆ[Ь-5¦ãØëæè"Îuíkûz½`Û6[ùx'Yâ“ë~ó•qÍqÆr€$²ð\È»$r“ŽÓÄ/æQÎ@šd dÛUΪù¼™µÆÅžÉ×swÊ„ÿ6ÑùÛkõsî8ûåM1‡ÈqØ[_W%€þ^/€í_¹× · á°áÿþ÷¿¿çÿ÷úG^+wpL=ü3ÕÏÛ¿mÓÞúýÞ†0ÏWÿ^ï Õ/Å€ßf¹s­ÿ^¯¿×ßë§¼T3Ôƒ–ç?üêìùõò¬¿×óþì±Dô·uŸ² Ÿ!äû§¸õy6ò׈ÎÿüÓ§ÐY3KƞϾ[%\bF™œ=¹»žg(Ÿ@Lû…mCÀ¥ÙWhR^͈2"Žm}öë Àdî\oRÛ¿»u¬aµa­I’—ždÔWãAb0ýÚ?±«î¸ƒcÑ÷àêðàߪ1NˆÙ,r¶¨£}y µz3Ò0í¹µ4K{­Z+ŠŸ\‹ãÔß’Y2 ±‘¼“Dñ û—Ñ)Qd4ÁÖ2¼SçQ¼hÿ TH¡enn”×¾¦ã(ÈrÂÖ’¯†’á1sMÄãt` ,® ÍÊË£;=¢ß—5X² 6WÈo-ñFÉê$àqåòf)ð¿Q®ˆ&™³ëÏΌB¦}»‘äƒÐGð—}ßëÄÍoY©rl?åÆ1p€d9¦²u-U7z“p#‡ª‰H>"BBªKH~ý§SzvçÂ2……¬Zj¦KôßN¦{¦.ÔÍ=BA$R#õ‰Àl¸…]δjåæKXÞ lr½! ÄAù¾ê?ݸÔþm»‹séyã«$ÓUº"väa”ol½Q{C=µ9j… Æ=n 3²Û¬©¦’‡£‘Áÿ ˜ÌT» Ó²â¨9…·Â½ÎkV1ëü•M{‹:Ö9on»j‰0ׯf©Ö1TS-ÿqÑy¥jucF´ž<ðÂzf]A‡t Ü-<ðú‚ßõ*Í„Á;‹Æ,¢Ÿ7¾a>Âæ'.øº†ÀÀ7Ÿé³ÒÖÿdU.7«ÉÏÂÎ{;Kqi6Ú¿úÂw=‹Ÿz”Â|²ÕáƒËNÁùÓXì·{(žÛ|»ýô¡,ïÑw_ÞŸUû)NùÞ³v×¼Ïw‹§gkÏ è¿zv¨ø³föîšÒ[ç¶cÚЦ‘[>ÿư®ŸØçŸ,Ûb?Ûþ„e3–ìlüæÙ‡EKåd®ào‚O>=´8g7>Êà¼íbT-Ê2®ô_ :¯¶Ù·[ûõk°@€ëÆÀíûøë¾SötLÉuv°f¢OWo#WshýÎh›@ö- 5Þ N–›KkW@Pm·l‚Q!Ó?çštE£Ñx0wÑLE^7o=&gáˆê}™ I_ƒ}†çf‘ˆ—ntW0u¡~=ciëèÒ]Ùùј¦iÔ7˜ôñ! R¿>›d^`m„îAô¹ƒÝ£OŠ bnÓò'•À4ò÷¿¢ÂŠMœ@ü|É6PÛ“»°=ÂF)¿ÌOe6’üæIïåDÎu³+Ô³NyÆ›ŽR"”t.nYÍe(¸ªúò^B–’“ò*aùìdP¸½µo£¢ø‰þ;f+ôúàbò†ÞöFFnM¡Fòõ}Lóœ{ùaŒ³‡r×¼`¨¸o§o$%JŠéã3ßåS4*JAµEzá _/D@zm¸MÏ‹ÿè)³Q×# þ ¯×K…”ªÿ×ÝŸçˆ_‘™æHuúªÔ‚ØÈÔœ¸Öó\)'×¹Ë}Ž’å±´»OVý¾Š?对¶Œ\c©¾¬ø»ã.+7Eܬ0:<5 jêy3¡›<>Í}?Mtÿ,JÛ$™œžD‰SÏ)Þ#ûW¨¡Ê÷ ¿Ä†baõþMÑyk…¾9ЙÚIp«ôÆùµ»ÕÆÍGXtJD¨¯¶MôýØÓJª4øµmäAï`N~Å /ºú'Á1 AµôÆHMV0À®ÚEo’ćc^")6i$¨c•34šGƒ¡†$œÊ.y ïdú&“ÌŸ˜Ã#7îæ{'óÊz¾\òò_Õ½U‡oý.ã% Ãàê‘ ZŠÀ ª &Ò¦¯‰}ÛÌÜð¥ó´]àåãÊÌ Zw04ƒ€æ¸ÌàX·A•L_ˆÐYçíÆ¬|‰¨O{àF§q.Hx\^ N»·¸Àq^ØÕ;IÍ·Š‰ýFÀ+ÊFøu&:‘¼Çõ˘©ºŸ¥põnäžv³•{xZ¤&vU‡f* R¦YšºˆJ *Èžˆ*{Ë.(ÊÊä6o¤2Õ}«Ç¤`Êl€8sôþÑ{©TšÙµj u¼ãþDvðÄù^“@ŠWC»“¡¤‹-î÷‡b"ìÝ3Çi<1‚ãÏŒs»^l£€ì~÷7çüw” 5Í(0M„+¢KàE £‘wk!VâÑx®’üæÙt¥òg+ˆÊD×…ÒÂ;Ú•nPFàv £ÌÝäêÒ )BjsÉñ¡ r½•±ÈALÈÅ¡„C+’¼ëßß–hžìY˜ouϰˆ!1Év¨õh- •éˆ'R…ˆ` @s¯eB¹ˆèžW÷fZfÈq[¥‡±rZ%挾K©ë0ƒøVÒJtaý®UÆá†¦§Ê Í º3rí›Û¹’·°ð‡]\šßzϨE&©hk`ºOfkEM§ì§&î/ÿä> °‚?w± š\‹M)A­Ñƒþy"?üÄÆ”R¡$fEšÉ –äÜšÍ2ÔnÆÙ™•2æ‡A7m€’WäRËHŽP¸Œ´Ý§S"’‰,Ö¸‡49ì•®”鿏wþÇOè$ùÊœfƒÛ¼"†ÓuïæÀú©ß׿i@Ýc­„Úx£bÁßV·Á»?‘èá‹VÏ ÒØÅ+G¸_£6y”.ôî)Bšä¸Rû•‹tf5h6‡8DZk‚?…n›¦¿?ömóB‰ý¶ÿñ£¹½j¼QïÞlªdôújCž¸¼~#š$U*`Ùùž 0‰n‰4lq‚~ g{©ß¿8d˜Mëð¯;®óßxá¹ÃŠñ ´Ÿµ]»{;jʸwV܃ÑNímÊ8–¿k[œú«âßâ…O0 Œ9‰ærG1v¬‡z.®_|/À;ž0Ú–køaU¢ôí¢wzÛsà®,ãÊhÓè§ç†yÊF‡É´æg¢á8pšð §C§?\i CzòP¿‡À]Çæê—ˆÎž¹¾sûY/özíÜD?û ê9âÙð*ÚIº°Šº l” éÞõ;ëA2ÜÃB6õÔž,;cØÏd¢î¿‹°Ž¡–ý2ŸJÁoœ„Ž˜’ÚIÍÄ[Š ÝµÜ`ÃÉßùTM­à»ª ~òâÈØ§£e|“%Ëóú ÂvYWc/%rª×`º!mÙ¬ fâß°mËGÔ¤oð„];ázµO¤™A§£ÀL—œh¨Û¤œöÇf“ÌšˆñìJòãñý ¹7¯”!TZt“†]¢°:·T™¬ÜØš%ü¦S¬ìM€×Âú’š†W ï]{ 7$½^/DܶÍíܯ>2ùä±&°@gÄKŇôÃBOÍE+¬0"s+ÎuÓå)ôd¥ï¦±wÂhù&Ô‰ÿ'}ËeLÉ~¼8 ­³Ž$¡‚`¸Üˆ÷™³. •<žÂ UtÖŸèÓŠ§g¯æ•ß•5Trô„%ü/‹ÎÎ+’PJÉå!ÍE +ñè÷hM@„m“I†æ €Ô ŠÌJ³©€óõ?´©Ñ{H‡_D¤IAä®…S> ÷Ë{Pëtk’r åjSœ‘!‰’¨H½zDOÊ“:m–HH«/ئ¼Þ°I ã±ñx¢£ê}“ŒkEŽw©F…#¤0\#ë;!¢ë²ÁqeÆH‡À¤“Ð%˜ˆýoÿ$ë†É0¨;J´‰ E&?j3×E¹ŒL˜Š¹¾ù•"p(–M<&d°E[‡jUŸ%Áö4’÷ (ÿçl\k×ìYÎÁëc¹¸ÐW‘”ÔÝñƦ&^k•}^J$àwÝ¢Š@Aò@¼UC-1$ü¾ˆ"Éíb*ÍEvUDÑ{v–¢x †åÃNeo³mM-‹è%cJÕ(Q#WPf˹!*â³çÊìRCF¶Ëå—|áÕøÁÊ”q×àf’n4æk4›ÁM;NJ¿§ÔðiiOŠ»M}nriãD¡ƒ-r׌‘ëhšxǯÉ3‹žÏ›ó“:%ä(¾øjœ+¾L†)Šgu]í]å9䘥&#‹ƒÚÌññÕ@oéOj×nr rþDìS°¢ד+Kw£AW*StÓ xµ;äÂ`d—áLMLÐ+Wixû1Û›gÎnÔTøö;IÃIœìƽ `Ÿ ºäöp¿qÍvò®mÄPćNté¯#\Å ’òñï&ë…„ý"PÌ÷¦Aúøný€­ç +!Ð ­|Ÿ# ¿;”s$GûÕ)ÚÜ3Ì‚€ÿ~ôˆÙ¹0PÆø$&¯g>/À5ç;¿ºÚÓ‘6…5•y+†Š±]Ñ WK$ÜW Šü¾ÈûXÝ}CÈà?2Ô.C(Ÿ¬PéwåÈ‹íÏöã•$úRSÿ´ŒáF×m7c¦tc›ÜŒ0O-e‰{ÔG¥#ÒDrA7ÞØÇÃÑ\VhBa)ý!Ê,J8¯…™ m!0àR‡†dºw8NÀ´é(VÒ[·IË2—Ç#®ø$“r¬ºéúDUô"¨¨òtmFmÑÈPؿ̦·ÉÁö`Ñ_*:ŒÌØ'æ–G•‰âˆr%‰ˆÐ-¤mð´Îƒ±O÷Q $¢öWîããîUýps¯\{âˆ@. «kUÊY˜¡cP³pÈ/ÜïGÕ$àÒÆØq¸O‚ÐÅaJûø*ÖÝó_ƒ2€¼Á·ä=Ä‹ ( to% ÆB¯oXü„ݹü;·Úùe®2î½BåÔ?… ÞË¢NŸC³œý¦‡t|Õ _[9¼Ó\qÚdôðy™ !’­Ô~«÷ò×äCf©Ó½—½Üˆšç]Ó}»6òØtntå*`õÆ×âRøçì-°Èþ˜²RF.eDPNf»ÖÆà8ßÐ=·_-Ní†7{Ñõ÷F™ì™k²èßzÉ ‰àï¶Ùï ©€N^êð3¢ýVW¦¾—à‚.öíâoCÄ|[N•~ÿ³]þá ·j.ìüU]´S^ :7E&÷S95ßʸ3x¿"L„Âýn­u"¼Û¶üœ×sV⟆ ?¤§wåAßrIˆø¿ÿýO¶më €èÁÕWò®=ôÅ>0+ Ó@Ý.«ÎtE2ˆb‹õµ<šÞobF‡)ºž\Ùëç7ùíZî³icÂ3âº](¢qØ×-»ŽûSüœFgÃŽã-9Õ{D‚ç¦Õ˜Æ—ê´>‘oܵ8v pl¡Ôt„ÛŒlT½Ë¹ÃI»Ù]Kt«=\ý4|Ø“iæÍ÷ÓoJÍ‚ïH›J&š-ì_¢uõY?úµz "à°­[' ÊV9šÚMêŒEÏÎTž‡r¥ŽN|hU×̈ÛÑ™?×äR?ïôƒ´®ÍýÖu× Æ !ëŠySÂG5K›g¸Ôù~âY/]UñPˆùŦ£ÿösñPtïs?W¼Erä ùÛÊ_b –§¬xPýí‡qâHÔtéÝ'å¶ ºjÆ>«m $)úÛŒ7÷ñn+Ã%%8À¿":oZÚ{L^6t|‡iÛÂ,¬7qÁ Lë¸ãJî?‚C,>ͨf7NØ»£€1t’<)±êƒ™­`•‡è´:’}|Ôs7¿J’hú;4O½T;Ãþ¥‘Ÿ~ŽÜ=äR&Å!.k÷ëGuÝëÀšLaTUÊÁk+ŠP9 QÂzôvúî,`–ïÍ4Îd[î›Ý{‚ÝO&‹6YF!ÁóH'ka°ª*óSæ¹ÙŽeÑ,Œ»-0¢Ü*R!§W£fKoé+®9â¥d#±e¢Û ÛêÛ_tñwn¹óáæ‹ŸæÍͰ rqø±ù\Z_ŠÉ¾±KË—þ,R«ƒšó6ê\T&/¼S{ˆK8ÍàÃf޹êÊÙ½W*.ÊhԇˋÍÒ@'`ø¼Àïgí¶Ë§-ô †–\‰3yððÄeŸþÌ^z"Êr Ýi`ÑæqW8¦¤°4·,×P€âŒÊJ‹ÆÒw½ l6c†{$––Ξ;·¹>XÕR<¹c3çH9êª.RMÄ €³Ø­‘è} S7rE1dbÇp‰¢|¿ÿeÞPOð׌0>b„/žGÛL6ÍŸÎâ½è<ôa¡7Å ×?†hܺ-þêÅ–½3Fê'«2ßûúªÙºI`Ú û¾Ð–€ »—×~„Àñ™½}’Ãî–ödååÔ)Jæ’ÿ½þ^W|[Ô½¥b%úÍ#åÿ^ï+oú áü\4üÒ©Å3¢þwOÐ~ÜÂ'?|Þy"£ö> ®oÑ+bÖ?ÅVœî­î•QÒûœ~Èn|‡íI¥郂O2ÀÇP¥×ämr7ZÀ{¸oy¹<È'Œ'Ý·Â>%×^6­[ª[eO# ·{·òi?4Â{Ã\º+ŽàÄG¹RÇyà¹àäÓÔ¢ÚEá¼-£Ñ˜û‰¹uRÌ(" ¿*)Fæ'Öù§ˆÎÏdLNº³S¨ôQRrs䆄Ûôˆ>u÷ ‡\ªêùõuïq@Ì{ËÓÒ1ôX]aÛ".õUYL¤LRá»cŒfžcw‘ ¥s1†®LÐFw¥*B§#†Ô°0V2c=˜Öéžïòã"†‹äät}ûfrTA¯À}‚âƒÅL*=ÕÐÌ’pù‚Ô(ììÜ[ví¹ ÛË~yÕßF*(ð²ã‰"ãV 4ï£`€ÚÜ`Ä.[qNÉ`ú¨Ýcâ¼ûN>Rá.XBÇȾösBRÇ'¡”ð™TÊnRžd ‚–„û›é˜k‹(“B5ìÊĶ_‰‹Œ_ÆsõdYêB¨¹`¬ê`g‹j ¢\£Fmoïî\:cèþÔ2;{5z31«ñÜQ ˆ‘F2RCZ&bpâÐkqZ –ˆf¹J[‰mˆE—ÃÁÎëìÍ1ü°õ9­°,·+{Lä›Ä!þÁ;R÷”ØC·j?ZˆWIJ*%ª\!7«0-SÜ[SÕ§|ýÏ.‘dDò™ìòMgj²‹d”Œ©ô¬ ôYÞÄÝŠÕrt×[¡@Í=à50q5ßVjÛ¶%ã:ó@4ö&jâÏ2¥xGÒ|V)Žx¿Ï¡š¶ÇÞÙqâÒ0„CJ½ˆl@ êà»~ÐÒx’ÔášA‡iê¬\2ìÆG ’Åh¾Š…ýg™ SlââMt²¢”6ÊP|m"¦­‘|…K‰N„6ƒÛFJ¨ëæËÕÎ@}C&ãš)Œ¢J†»Ú‘\Õ¸dHÕƒöU#Xøê>ës³‘Ñ¡¨:Ì̆ö™}¥D!–.œÆóÙæ'!¹ƒPŠsЏ¨9BAŒK2V(Yo®X‹,úð²˜*Ú¡»]$tÖŸ [f–w •P) —œò0I .çû0w}¢±Tì¹²f„ÉA80_R¯þZÑyo²}WÄÞ¯²iŸº'Ývæ‘ù+_L’?›ÈË¡°àê­/U]¹Kv Ô…4µâòºÏç|…<kWtxö/Aƒõ{U”®ßªá¾,¸¶rPhçp MüG3Ìj˜xý›weÜ=z^ ’sQ»5·"ìCŠË+€G/ˆÿØôK6W¦ÙS±éJX¸Óµ;ÀJ0ôÚ…›ŠùS)1ô"æÀ¶G+æ{_‘J° ÷ÈÑ^'%˜ìípLñ'ö8­v‡M–--óT8^K;¡®ùvÃpR;ÌÁ.”0]áà ,ÔÙôß!•Á¬@“˜Ð3àbþh¬ŒÄ&MŸ9·Û)Bj´íD5%+?xéVr×ófà Ÿdýþ>Qa¾è uêû³7ðH×}ø"¬uÏä‚lD•çw+ §>m :KŽz4*gÝòëqBh½Œz¨ûÆ'’!aÀ¸·QMÒæàˆ¶Ä·ó%´wŸŸÊ"ÉýwÙÙ¤U!¶_OìOÜf^([~Þ €h"p)ÁrÅqª[’O´v‚ Ä ²¼'€± ¶N=/j5¶må®×ë¥mÛþŽÄ‡G]¢óõÚOÌ~Þ^/‡Ö–ë·æ—Ö?¼”h(ª‘ä &ÜŒM~Ù`ŠSd9oˆwõ]€ú—Ïž« ¥ÓÒèhÓ23Ù‰†ì‰®ž£ëöÕóî5,£í¹Iº¢TK±Sh~O<2]øµ¡À-Ó“jf¨R tÚƒØ{òz†œlóépoE͉ž Óûœë§%©$Šv™ ™Ÿ„u¡âúoãóôÁÔ¦*ŽFdÇqËV&x¬¶w«ÞrZ|*9€Ø0((q}o%Qåá»ð'CN;‹“«ùP]öÒ&D i)a{=º%g¾èH1pE›Îõ!@D«Ñng3› ´býk kÄИ²Ò4 ®ªtï .Õb¡ ÃtTlˆ°¿Õv2’·é[ÌÛfJ‡N®«0«L|„{foŒ:Æ' &Å~]B×ËímT7$„ÝPîZbä=î—³NbRÑn–ê# lùA `_Û!8ˆEDûá.5s¥’‹4®£í|Íß7bûádÏŠøÏ³ׄB‹ixU‡u*àI|÷Ì)Ë„€i²Üçþ9žbeª9‚u’xÃñ9 œaš5$‘CÂKSwšˆÂÕS•$ïË?áœüιφZb­Ðܱ¸‡­´T)À-̰DxëÀ‰5Bå¡Çt3\i‘þKå+ŦýÜêèLA0 Ö™óß׊t/…%ï9Øá uõÜìŽNÙ:»ËK‚èß//;¾á ËÓ3a‚R¬€g…ë52Þ]7@ægu>ói«_ •rßùÕ±pvviÂ$,˜°¨÷*çQn2+[I6DO¾'ÿÃ&š.§ÖhÒ;òZø¡*C ((LØEjƒ·" ™¹`¼ÔJ°’¡Ég$Sµ\lH+ ôs¾®þ`Qµ€H …À&7[*Û“˜»Rw^¾·"7—‡‚ËSqd¤·Í /"÷!89fêF­Þ ³ñ¬Sqƒ#‡öГ€uó´©Ë¯è«&éJ„ ¸9@ô]–gÍÌ#YJ¢ÇJŒF°†<ºÙÓñCõ™Ó$j×Á5 „–¤R8&ñ÷·ÂÀ¨Òjm(Æ`iÙüiä9›wŽT½„”¥/”°nQ×ÏQ/Ç ûö" —Gùït½³ì ßWøÔxÎÛË+FÌh¢Ø¥`´‚ºZ)ùn¼Iœ.1:±ºÇÃè~¡¸“ÔVidËh‘”“•xÀ÷ Ê"ye¹yÓqR°‰xú㹯Lƒ¨œWn^´Ú ÿðùÒÁƒÑSCÇl Pr•¹ÇŽŽ@í¬­©ç¹g»<Çæ&µƒ3~&v Ë€üRŠ#C<‚!Oírp[U\ Ôs:* zyÇ `(3§1¾h)x²'®Ížn…„ÚòêuPØ•D«ìç$¦×ô;Rå WU|ª½¹ª"…å¡paD¹;|ÂØÑê¹ ?ä·ô¹\hËXÓ ¤hÄÓa*öΪËÎì(@ ÑwÛ'C˜{?vT|ÑnõtîTOFÆõàsßÎj'dßNcÐi ü/‰Î ¬Õ €gö€D;;€PäÕ”oŠÔ»%Yøª'®èëÆÃÿ±D-bc8æ@k[¾í' ¹z^Ï=“dfÝ÷íÏ“ø¯?jÛßË}íTâñD¢±Z¹žÁîdÞ¿‡òÃ_"êî÷Å'Û,ئDöÿ^¥Å ¢¾€e—SÀ{ÿþ ß»Ö¤¢ýð“o鯴®•èp£ÇG9¼%µø{rL¦ø1š¡Qëßë–-´d~{¼±¼ÁÈsèÿ•2šþÇ‚lýï"­x½Ä/ü„˜£×NÞs©Ÿ'ô':ÿ3Ü1ö ÚÿO(aâà×ë@OÀ¼_Ðuq²Q‡âO¤ÙÀ˜õf„3-€£ýVõ%å’5vZÖCwU”ëíÀîê‰N"Ð}åy?ˆ›­žoóPͺ{w”Sh]¥«º&ùT%Þ—€gé-ìëË´wâ1BÀ&þ¹«Ì•¶)ó]]:5ÉÙO6yqÈ{”3iÇgÆ_>¯“¹Î%9,ÙữnÙ‹îú=) â““ì‡[.dʲÏ&ÍôÚ»IÑ  £(nŸqðÉ0£âcÎ_µÉ'k†xÝ-Îfõ:s×è²³ùO8æ¾§=u²”¨åÐ!`ë³¼(JÈæ’Ñ›dñØHúPT!"¢ë±Qö#“rõÎîuH c©À¿i‰1œoan?60‹2…+Ñ€‹VR#  öKõڅІRÒWSo£q9jK.™ØLZ?QNÍ5Ó€íBEýûņYóþH†øŠÛ–'r4;†Í3zÇ€“›ÌÍ‚/!%>Êe_küPÒ°©xdåÝÅTvÝxÿ¤Ë¦MF°.¥LD† ûQP…«È˜Ûyb§†±@g4¨Ùýe° Å”y×$>Dˆ\Š‚©}ýK‰¶ºHf‡Ãä©* ÐñýÖuœzܵvé<\©ÈoF×)ÇÂcÁÇ­eàõÅ¢K>“Óý¾jpæAEÄJÓ,OlìÕ7Zfy~~OTS‡[YXõQSÇ…ð¯KŠE{"å«bÌ૲¢,¬Ié´ÝE‚0É ÃFõ®ýãh;s¸‘S˜Ço¿^¸m.Ê|ñ©-Åo.‹åö<¢šÜÖ2‡rs»«ÿqÑù›¬J¨òìéʼnP®‡q%’eËÓº¶ÏBzµ+Ý[È €FºXKº]  ((ÊoÊþò×è†'Í…¦ʃ~°ÿ™|Àè<°ô†oÙA’úPÁõ`ÿŽ$ü¨0Øõ vÝ5_ªÈ—+ň)-D¥úÈUœe"À¸#aF2Å` Å#*¥eSB2"Ob×2¦ä#ô–5:KžR‡ÊºÞ™Ûx»K›Y$¥D×ácâ8úQq"ÈĈœ861…6nŒ6Ü ¶HN‡ø¬û˜`Q´×•p©š·º86N!$Á­ÞÇgñÝî*˜£êßµ´Õ˜ò©Ñ»òÁþž±&y+¦Pû «ÐïÃÖ䨡øß*ðÙé¹UéhŸK_Á½0vƒ=ŸYlWÐÉ'Û*gÍ®¾ÇQ\Äñ…X šg"6óìÁÉ CpÊŽ;J¢šäÌ^Ð'D¹”-o—HPœJBaYhD`ŦÄW‘ôieˆ­ûÑÎZÌûC»™‰æ¦òTõ—ꀦ åi íš‹5ydU•1N#L«|ZœÀU›ÚHìfÝ"ÈÇó,+F–P­•jo‡Å° …/V˜œ7¦qàê|cÛI3{{ÏÐ7¢—F ÁöéÍ¥ÕltÇqñ:Öe YjŸä†e©Ìã–%ÜV³Š:ŸÍU£¿[u²\B|¤Õ–{Êòß¼Ä(úŠ&r@6…g¡Yu€A˜L¡N ‹-Ükä¯>LÔ­ÏÑ´:ºV-dám¶0$ËSþ‹ÜŠÍÑ(“/”Ä=fÝËDÖ#ì…Ñ=ò]¹¤a¥V´øF¾uÿÑùúa¿TjË;Ûi:ÚÉ…¢ªÎ…íá;žCo¢õà‚¢¨#_r!–³øÐé¦Leš¾ÆLܳX• ¼…r²Ä¨l‘«WAg¤kL±xGæ)H×Ü,)ÝÙ['›BfàJkHõµªgSy%ã=ÃÖIt£RÖÉG—Í·¯Æs‚Äþ/±ÍÕ<´éÿ^åcx~;¥Ý6nî‰âuNÒŠéqyÌ+ž\ð[Ïo¼wlïgž#=½ŒÅiÌÎuáç=h&¦òä6ÒïÚ5úcSEûÝ–9!s¸ €è§n3›.¤IãØ渾\ÌP¿òÞrµWú»¾ý4m̺Ñíþ¬WÒušUv×…}ÔƒXuå9Ç}5g\\óÏV‡þˆ}¿ÿÃAo´ÞH{σäè÷ȃ´ûWÞ„’o 0ÌÌÑTtþÞ‰Ð7¥ó©Xè)µ&Ý— rm4zón<æ‰ìßûå—töe‹²ÑžŒÄ³oJÉ$Ú´ãT ûINÏÒŸßÙèD“[“U–yWW2¥±³Ú¿Ü+¼^Èûa÷¡ô½ÍçHQÁÕ»²øpbN Mô΃•YfE™äY-ô_”¡m;D¨X9X3X^»QtrFQ ±fÕO9¼§§×ês~c ·(9€¨ìLáDºÿFôœ3Ëkv “gnX+eW7W±3]dª«íú?¥EeSØê¡ë7‚É<õ–ú¬Zoöo(ð¢muúYšñ6Î*cÑÃ;wèC÷F|wÜC!l5áÍÚ#°Sõf¬/りÛå´ýhWº‚“­Þ»â È2>Ûw¢‚˜<*jê=2¡¹2]ó؃➊[©([°9É}[ÔD|6¼Y·¨Î„ùÐ⩱æäzOœØâ‹g„xÒýÓàqIæõXSúcrge²ïÇã 8“†hs÷poš½÷òl$³ÞÚÀbÿ-Ê`ûò¸4í}@úpT%ÀàÃEö?lZÛä{ð£H%æÆ X¥),…%üöµ­L¥Â2d‘fšÂO{¢y“qÊQ´o£—{WÛÿ—ÂÚ•ØÎ*ó|6–؈6FÀ–Kôe݈ÐaÕèÝTÏ&.g©x5™–úðä!J{ì¿Ë©Õ,ÿ¿!:]¿Ç*+†ÁWÑ¥~žrûSg~ i–#ÈäÁ(í‚;rpQ61•dz<÷—óËÙ¬ÈU˜é @Â~7„Cˆ;Û)M‡Án²ï #é|­‚êuÚ‡´‘z§EñbXÍW2…cÉŽÙMåLmb¶~ê ΜQj< Ž ƒb€ãž6Ž>ôP°R5—éÒܰÂ[¤/¤£ÿCAqÈ&¡˜ÔVWRý›HÿK状ÍÈ e÷OCL&iuð„†µúÄÐ/F´¥¢cK¬öi8ô±’KÐ’Üœ€(lßæ›Ã1µû­ W±/’0.žü(S6$-$= ÷Õ´!Ž,ÌiTî®çËb˜Ï«¡6Ã;žÌ¼T©ñ¸ø4²¬,@] eZ–àí6µköPèSåA¬â™œ.sDØ7~¡Sú?ÀÔ ±-;=)ëFƒÕ•ýð%Šox‚ ˜ý¼éA@×+ž8Jí±ÐÌàSŸxÄs¢Zv‰jS|Æ|»Þ–Á}s.”Âùû̼‹§Ìõ”Ú!)3^ÙW¤ÓÑÖxO´•6Ò¥lâò™Þ²ÇþàôÃT6ä®Ì1M¢áF*„ä[ÔŠ‡Øbä• “š&•-Å\¤àÑ`‹ûvQ'ä*Ÿñ?Ú¸¤ãJ(‰ e[AÉš(ˆÔTiÐXM/ e¿p~èfÆè^Ê_ù JžF2Äú(Ù˜¹§å +ˆÍÖÔd=Ö‡Ùô|ïí=W:½££FåØŽä8œXi&™l$Ê©ñ¸êíElË•‡uõQók4Cµ(—qnGøpCW̦ÚY‘Q«Z]e!oÝFØàºæ¨T_”ÞJ\¡;@b"d¬>åm|,ßoVz?ÊP†”9<‘aýAûmäÛ7.Îlµ½ÁQ|…²*$ƒapæa)%Óàù ™‡,ðÄ•°jˆ:>Ö'ý¼ï'0¦{ OsR É#Á;[e±N3zƒjâ•}Z éÖ¶šÙíÐgÔ…sO¬’mP["߃„w£ÖŸr†z–=9E¬ün¿Õt‡&ÑP!@ØÍ‚¾M®'´?2£ŒÙPJֱɀDçT…Lµ#¾…1øpèE’¯*¢‚ýÏ$H®Ïqäù}wá"Á\ÒJä`|í ÓØ¬@»ú%zéwßɯ׫#’.hˆNbaîÞ E rö‡±ÅðϽ+x©'³¸_9G"ÆFµßnî…«ŸÁT£Ìn§P6Ê“¶ˆF(ÍÈ"@©pE¬Œ‡bhéa—N=ÕzRgÐ' *ÆîíE § È9*ü}€äßU<–¾Ìcù–Ñ` …âHØ'Ò‚ùíœÀ==9!Ò"w,zzªÈg”b§>½n€‚%Ô[Σ…F=˜."ÙýS´œP©v•ëç1ŠFj¦Df"ŸœÏj©«‘ ‘úÃT1Ìu¶ÆZþ|4…xtÉpn¢¢Ðé¾Õáë¥Á&ò:œÉñdÛ2¨PÔòSÈî´ÚP ÿ’PCa<šÃÌt‡Óí]uàèä'ºëUÛ–ÂZBºƒ}N¤ˆÐ”לⲌûË.³TûIê¦Süĉãÿý¢ó~$À…fü³o4¬ÐD ÄÒTéI$ô(T?WþR™§'NˆÓM½VXŠêù{¿ŠgŒX eq´Ð_rcÃ{á(è9_QJ-ׯ/eÍaøBL”ùªY“S]4Ä=÷>^à^'Ë£‡§5jf$ áÔ¡ 3ÖJFÄJEé2 -}‚`ó ¹iÉ :º\€,Qååò—'óxÞ3êæCÞƒ¼z}¹hù˜´ëmlú;­9Á&šÌrɨžþÍi[ÞÛµÿ¿ZªPd\±„.·W\=’̓=¡w1N¸B,ýVÔ$‚'€‚: Þts©å ž ©š7bÙ°Ö@žR{„s;÷€gíF’j¶÷ˆ®øª­‡œ¦'—êÂ}°e¼Ø«Ÿ¬Þøÿ! €8t ‡9ÙöbFpS¦GA0&w0àfâÖÒæ‚$€Ÿ–Ïu±ž“ÑûÇå==³¢xs/à̉÷,^¿ª½ä–\Åyî&ºúøO=>ºH›I±;8ÍÐ2»­Ú%jÒWžmÒÝ8Ë"@êC"ê»'níÊp‹ëM«V¹ízL“Ž"üà[ê1S©Á(ðNŠ,v>±T?'ˆ!¦mÛhÿ%}T¢äá`|>%ÿŸÑ•ãç®á›”¡?÷õµlüðffbPôÓå7žlœEöo=gnU5VÉYªÑICgÞw&_¢yðí¿VÙµôO#_‰gòW”ðLúyO’‰ž,]”´wˆ3¾úÞ3ÅÊãnê?¿r(´NLúòLd,”ÐÞ6 À“ ƒ©Dܯz”o¹·§¥xo3û?L8ìdÖAaò8Í´oËf>ÊYô\s&êCŸa7WO×Y¸ëÀ~ûÅTF3gÿ€;?í–ÙõÁÆCÈR‚7œØ» /óãÑ]!¨3´ûpžø‡‹œdÍ^g2<¼9ç½ìÚ ªsaˆ ‘ˆ~Û½„åÀÊ”×ôïß«ÿsq¨Ò9ÚÊMUœ¶3æh@!ŒÂ~ïˆùQQÁ®M´QÓô¾{0°~øžÃ¿4±ä®ˆþÍ)|?Et~)_x4F¨1ë siƒ=œŒÜvy]åƒÆöè}à¢ëDðÅÅ,öKe>ħéµÏÚD%ã…²…™Ž¦Õ9kcÖGØÂ×aÚx@ujm ·–ž(È[ðî=Ën‚ŒWÆ%@Ñy*%Mˆ3¬uU]~îØrÆÞûŒŽ Ùì‰;äñt™ìÙ¦&Êɱ3‚D=3šf޾[›°oÔóÓ˜çÉçÉoä¿Ofű«UŸ1ÃÐq:£÷†Æóftæ¶Ñ-V¯„ƒAÕÖ+&¸æýbç r%Óc3 3êJf(;Ðnš_3Û7 Jë¤Æˆ¯C¥óy|`‹·Q®ë2òâ…þNDjV©c$ÐùÔüˆI±—Cا?Ç>v•Þpâ\|ÇüšÛä B~mâªOCL$€¸À×N]€Xd©¤ÌØ3”ÊŒe÷wêêÛÄf#¶@êGÇ–¤¹ïs¼^û%–à‹Ë­ïúå"rC™ ±ÞŽMŽ8’H/)Ôß…b3ó¼øB$3>ŒFÊ6rL™òð’Ò%éXŽß©¡ZiAúó€".r †SÚCÎÍÞíöà¡~l_k¨œb%ÉèáŽXN…dÑÙŒ2 %‡èž©â‘´raêÓ®¸æŠÞÑR íõô0¡d"'gâB\z@@b`íJ¦ÓÓÝÒušCËÀiq Jë¤i@µRŽ&W’Ù‡e¥ž@+u„€pðû*[Ú9Ž£‘Á_*ƒþ,¨Üѯ¯2µqq^"¿Y:Óß—ª­y0™0WU8ù¬õ-}i+âˆùtèF@_¦n.0e|!ªPS%ˆj§#—·šÛVäc|>sVßþ:j8ºbëÓ/ޤ|·cë®/¸n G±PXª0N1ù-viÀþ“é‚KŽtÍšùN@½`Q4̃ÿB嵪—Ø3ȇ\y‚‰k¬OÔ°Þ+º€bSCr´XíPç‚<¼Ð*óåk®Ó·Ø4͈ôÏèø1Ò}¯wR%’ÉÛKÏ®.(ì©ÿa…çä3qÃéVÙŠn£xi',˜‹#Ÿ(pfs ò/{2Ú†Kt“H5èJüæ‘qíÁ/þ®d†˜ªÀŽÄ†êÐëE@‰:‡²ùwÅo_"Ö©q‹©½O† ëïÝIÂD…Üðåd|²ž™ê(2c"GîFÁ£)®¬]u¢réáÂô‰Q$؃yàtØ–ã)l8JrRòs°?ŸÿpŠŒ,ra›x:€·¼\ý+öÃ}ðlgÔG :*¡ ¶U³‰^ü\Œ(TƆÅ<òÄV9É\·®lh9¼¿óø^VDýÓ®Û\œª¨´ª<4! Æ®Té&²>÷ I —‰Žxù©ï"/n! :ȶ9ß@Ÿ]£jÞoï’wj‘Üü8£¥ÐÈ õtë¾SkæCDçWÏò] €Âæ!6ôߤˆø¯¯ïúbšq«vžorÑK:ïçâÎ`C»côp©ö[i/õĬi–T¼Í3üEFÕšçNµ¹,ÞˆEzDïcô¤ÖäC¶8ûÌÖ#  5ì%L¨Üi?%îÿ¨×Rñ)r+Ö €G¶Ö)óþ…ÜŸÏm>Èî§™ÄÒè“7†?í$ÖÖEp÷~úb^±«]¨ÿdÛ¶s>ði+Er-¥E#¶“=¡úDí²j4JçC7xY›^gk«Ç?¾£Z%|îÔ‡}£H×w*-Xø¿×ßë'‡1ï–]|ÂÄô~‚ýÅ& `í’´`Æßë/ ÿ­AÚ~Ä+zQk¾tQÊUÜ1KdSÈ)nˆÑÁÿ²¡[ Ž*¢°&U£êõd Y¼7õ+ëo W¡ûzE·-þÒ> ™m”}”žàù¡’Ö1LôóÓöè•C ®õ4SàÛwá4)Ò3§¹üŽFE'o¶+걉ü¯»·nDì}‰º*|.}" ÛZé[×b8ø €„žÌ€ÇÖ¶"ã" n¸õ蛪/ÂèeÌ`ÁΚæR±|î°ìáéä\×îc¿æF3YIdø„jÉ·.”¬MW@½]¤ªC0n†A±l÷ ŠŠì³@^Ω@½QS*vI-ÃÆ¥)g-DìÞshšCH‚ô Šû„l¢ÝR+™m ΟH²øL\Š˜MÖz>5¢:8Bì¨\¾»J¹´BÐ|Êñ’ËÌ¥¬Hœ•7&?7‡kÈ5A6¾¼š›ÎàÙ“aŠã¯Ÿ5*|Ös tq`ìxô\ ãèçç FwQ†BLZJ/~Q¾69\5g]æ N3à°0\ÏE¤zZ|$vÃ}bŸ:.ƒ!ùIÇåžr _nÛLŽª(±ÿ"¢rǧìÓ€Õt€Ò‹[û" ËòéÚ¬ZÂRa’T’Çû›óB¦½‚Ü{^—6î/ t©=½ifòe¥ç›é$¹G;XÍ­™nQWŽõÞÓ \Š«,!ÆÉ#¶ À­’€x‚§IB®¹DÔl€Cd¤qk÷*{¸ÕÓßofÛÔ`ðttYÚãd‡ú+\íU}ÿôªÂ ‰%p+9ZüˆbF?JÜ?Òš-ÔcRˆÕÈ×Åø¢ED‹{’ìHͽ”þé|ë÷qSXlXs"T ÷¬ž²éßq=(ôwÛœ²•0dÉ 2&Ã`¬è‰mZpc€=©FÀdçç¸EÎŽÜv‚5ë YÎ…ð”`™š”$Ò­³wü‰.…ÿ"«Îµ²O¤î‘(*¿†¨ô’WX>|³È€·¸.½e ~i¤ª™× ®ó £ ÙÕv©Óz’/5“‡ê~C4pF– Ö7O¢îm€ÀñáF\‡~½ýq?•„ =é '?$2óEé¢e¸t#8 'Yú*JÎ÷Ô6v- :ôBxhE‰cogØh^霎%ÑÞ¾É*X)´3Torê‚—‡úH´ŒòCXœf¥e¥ŸÙxå!yè†Í¹|ü¥ÊZþeS€“ʺ]|Ölž5ÿ ™j!kÏrÖ°†ËŸÛcøFΛ¼äYL¼E)©î«ö;OüÜ{ö{íhzå.¸ñºòŒôκRÖŸÅǦœ$mSj뾫¨M1Çyhœ;Q¢âVÄ=ßôr¥Óu àK­¹ÍCÄðŒ‰B'H×ÍúDY>“³î:ô¿m[/À[GöíxIº%s¼%Õ}î-çöÝà°>Ñú7ŠÎó¢²N€¼´zIæ¨}àïÕ^_Kð÷úvSû†×NÍ'€Ñ¡æëk«¡bé'l°U`O4Ù%˜wHF…äG`¾mðº|=m‰|ÿßëijƒõŽïo1ÿ“ž+›ÿ½~±ñý3ÎÞ­wäù¥ô+‚(܉GœqõÓc©× ˆà¿_vÅE†îý³¿×ßëïõ÷úá†}¯_Zü½þ^o9GpO»<ðà;î—I9©’(g LXA~±{õ;íy›=¦CñÂö<¿oÐ{[(>°7‘›Î~݆½UÎE—¹¢$žÜY—¢óÈŘ>ñ+ü1F €ˆtâU)è§>¦Ž7îtR~$Ù_2áÌ‘êmLfv³»$þFù·¥[)²ô]Ó‡¼ìWŽç…±äåëÒ’-¶Èg8" ùy¨ÜR€ÆºÁ¨ò‘÷Ö–ønOˆÃǺHñ©¡4f˜cÅÄS'ÕÓ¼ÃHÑh8ià¼e¿k1×u¢¿$¦ã¿ìdfÎÕ¨óN”àû¥†s^s…°b8Êþït{i5Ðj!D:t¢Ôw®›Ù§íuóG¯r=Šn–Ô¹y\sþò²Spxž?޵iŸI ºwÀd < lÉzœ ÊcV¯=‰$£HO€õc‹l:¥Û¸1^Çv¦ÜÔ“ÖõäzÖÃ’ªHN¾ eÇÿúó¸ª^NôvKE¤Ï¿ìùƒ0ä9ÇVѯY»õª€.”ˢћr£Ÿ<5ræÂù­¥›K! Ø–K*±½ïvuÕØDt'Eti/_(57q…Zß¾ÒaÊ‹ˆR?G«Ï]2§OjOÁ±š’+H§·×›²¾ä·û%a¦æ£/U”ë$áïGQVEjãÛ_•nz%téÞŽý¹¦6bz¤ÂÀH`sEzpI¢SDÉì)K¿¥ì€Ýig ™p´dtm»Å>R€;`ÆõcjˆhO»Ï‰+©Ñz¦ï¦–ý~ÞܽºÊþfÑùÇÖ8‚¦ ÏšºânÄë›4þœ…šX?ý‡aw°r¹UOíŠüíD_Vö ¥êýƒìvcÑüx¬b^ŽI*'~G²†€CÏe[Š0]o"£°üg®Rì^«ökgÕzjŽXqzîŠR¹& *Q q¤žÓHÖˆäĨèc£êÕ#çodöQÀR–.äz>샯ûuX&o‰ Û2À*w.Øã_Œòí®ăøÙ xò4µØïš$ö¦«¾ŠÚƒSmŠt‡ú(… Ú±~à#Æ”CÈuÔ?ŸÝZEì8awo¤.£é ×ðÁàÔÏ6ÃÉ'ùdÝòxX•ôÈA6…‚*B#髱†£ð¬Öïʵi¡øc;¸/ }/nÉ’I>€ÄÜ %_·]™„‹ç8§ ^)F~yWÒÏ‘>í² TèAã_¸»U%¶DI{ uÜßõPdæÜ8¡ÝDqE«)ò[ضíõB‹˜Ï¤$qÁ+‘gy*} %ù²‚œ³J#YDç(¸.wÕŸT—ºçáù®¡'¶'B  ÒÀ¨ Ê©Ó{Ú'8ó!ðÚO¼‡Ýsg9Ì—ö²Úb÷ú¬¶-xX±.²¼êF.X‘‰[\½>„Y»X¥†w¯¾¨E׿"Š Í®F6z cÂh Š±\Ї~¼Õ=FÛÌAQU@brr|”H“­ªj¹ôàC@P³ç}@TÒÿ‰~dÅNðr댫_—Ÿ&’h&y¸M¥÷(ƹz®÷ØÙV¶â8œOtÞ‚æNcêø¯@ƒ<›ªbOÇw©}&óHé]CïW]xv»\ÞzÏöµÞXc[µfmLÜÇ0+r rÞõ˜©$[¯ŸiÒ/‹7Þ/"d\‰Gzw­C3„ãßmD¨r¼éš¤ 5ç™;øw¥ëN¹m’î•ëùèÇÑñXœž ¡ì|ºSÀ¼¬x,›³òO+¬Ü/ÚqZ¿Gm‹K­.ÂÆZóFúþÄ=Th-ú{}ÿfn—ˆ¯’¾!‰«ö6¶ºšüý·é¯Dßô}Ïý[ö<5´sû'OÜÇú¯qº/Šþ^½ç û¶mÿmÛÿþûoûßÿ¦pćV6þÒHê¿×ßëÅHpoÜx;T,葟Š+¢Ò” ï}YÒËŠ»É)5q26ÚNÉ¢E“  ‘ÅÙÒ'9ìf‚Áü-¨™1>»å_k'ÂÝm"bh dn”;)Q«¨ÆÛ(Äê÷ÅÇaX:•±£²TMüÒ"ÿ‹ó׉?ªš§sOU°ùRDTúðíL†Ì !Png'‹èŠük>T¦öWĤÀö‡‰4d@èÓàQ²urõÌJ­ÏªîðY4û¹ªÉ%ˆ|&@ÿ拨¢ô5½÷{¥ØźJ†˜>‰–¾A@B]g(F3[L|EæÄØáL’ƒáøŠ ƒÒ- ÂÍ=F×3ä6›ºxì+.D ÂØÞÞ?­¬J ÄŸdÝ6Û9è™Ï©c×á,e€Ö0Öö4öŸÓ‹õÄö ¦ÿqÀ¢/(‰’©ìƒ=tžƒàSÛc8`3Òfæ³Þ‚̸ÇÊtŒ:À Þäž«Oçc;ÚY#%M„2ì=tïËÚPh°‹LŠˆÙƒÛDH„VÙcŠ8Z¹?š|lj˜Ç}°+$¡AC)œ¸·åî£Û‡®À¼ÿÛI[@å˜vÁ€ÛwqÕ¦t|…ÏW[‘¡dÜWKq¹8H+.r¦VGý‰335„Hïí6S"xÑû}e6¹5²9² e–JÉQk=8P¾â¥H€’HáYœ7rE6ô¸¢¡½‚Øp4>ÍØ[ܬMA6¼Q!)GªfyR®ŒšdÝWfKP„&;M%ŒÛÆÏ qÍ.˜)­OñµsÁ¼§õØ8%£HÆÕr:±˜ê¡ô¯MYʞŠyŸfxèÐË<"íD"±-VzFn,ˆ\À©ø¤¤:hÿ¼­GÆD@¶ÕRP²`½Õ¹2^-Œç¹ Ê'Å6óÛ !@¸r·?*׎¢Ó´Mkx¿Qt¾dKû Nîâ‘[i·4•„:Š$§%-›\,3VÇ'|ÎëK@ßU•héÇ®!»¦y&yzcŬænéúƒ¨\Œd¨€§&Y¢Þ}:Ò¯C‰Ì¿ý ð¸Ù‹1@”0 ž¦;ݸ|)ât{¬Z+z¢Õ¡šÇ¾é%å\Ÿ1,S&¦éÛ:ÁX:àõº¢?“?Ð=a>=ή¯ÃÐD¾™°Ã/K~J76¦sÔW'Oº_w;àôÓ‘îèÊ®ôË)x§¸ ú;NŒR 7µBƒl3Ïí €‡–Ά—u!£ž“#b¯ôª@Ð*þ)æÖ›ŸpÁ´>)ìÄÆ7 € Ó¹B³ùåÛ¯N”9í.ƒžÚÒí³Á*ô- Æ/%•Ï^j•v~9‡þ†¬u™¢DwèˆÖQ{Ó5~óÆ(0xúÉÝöŸ¼^ð‚Zƒg½ð;^@>étÉ|èæ äü,J#‚ 5–uo° ¢Ž6) E%x>w2‹‚ȤÐÑw´R%÷F}0ª/†•É™ŒÒúÂ% ˆ’?NIMƒ/›œ€g8X+*5Û`¢jÝ {6G©^¯×~'µîEvVøÓT€‰ÚF˜ùMœ‰A'Ù—hÂå{vÉú'òM¶pZ±ž « Q0ºI·xuS«-jC‰xüÞs¯,g?úzf’HÛË!±7•9eK2ó$•áæ ÍaìÉ<‹Ø9ÂñfQïCQ5p݄̞iö1†ñάàÜñ™ÎÆù»F×¾im–œLö5D”vK¥l=u-Œ)À|ÑõUeSŒå,S/B˜Îí¬¤V$€½PdCéé>©ƒQ„l†~‹.Z Ù|x ,ïóÖ‰¿ôÉ'1è#Þ¦%ub1ÄPq«“O}@¤ u£3Ž÷ô“:™áGU¨?Ô®|öË™=€™Ó=@ŒàŒr¾¾¯iÍ^ê4ê¾Ǫ©*Q*qÅÅûL±V˜S«Ú'j*$’r?î™[·ËÀCêt©:¡%Ä­cUd‰N*æ“‘(ú­Æ âëõb¢¦LrÈ¡ð7ÂÍKu}rUô-¨úÈ@-™È­¥ãAW:×ôZE4ü¼¶2±` Éw‘su¨zðTǹÖ(Øöv1ìa›íò ÅŒ?âĹÊcèÉà©ûÂHaWÊØlð }¹¦ZÌœ–ž‹ÍðYjsÎÁ¢ ÚÓ±ºf”ÉvéÁeVý©²¦Îì Ur½TXI#Ù‡0 ®øËîP¥¨so‡¢:Š¤Ì .Ûíø`Ô7K.&ä½_¡ §8¿Ø-—0bx(‘ÞˆÇLü®E ;~Öhì%×X¾lCÀ1[×J›‹cï£wÔNl¦h‚,'ë™ù…v{Äò{õRZ(ñfBóÒStÏkðlZ)^bÁ¨ï@5ÄEƯÙö@wû•Èýe©P‘,¾ÃüI”å»jâ&êÅ¿–­uï^‹ 2ÇtóÇÖÝIRä`òPSS¤°Ë®;f¸¼ Ã&ù¬‰Ë(²)5X>Þ »<;±VTEMVL&Õ; »û€©z’`ÅJrib¢CÐlšBÕPå2àv†„àÎlyµ„xŸ®æ´ä¿.AvÝQ.ž)îºi‘ÙäcÇ"FÏÒ‡(ï5P„Ë/µ¹h‘s›bX šdÎÞ²`ݲm1Ö$zwã"+0B5íOr`\nIp¼+‰ˆ[&ºèÏÏˇê¹IÆD=a@™Ïº»ÃíÖŒG'rÌÂF§Èì³ÚËO%Ryà+rï9*‡’!?;MW–ç)A¥ mZ—”ÁìЂp}ÉŸyzò„†¬’rpÜ£•«§ à5GùËEçëÜ¥<9²—¢H_”=b:±Á*•ìŸÉè—~FY¾iÐwi ”#ŒÖ2ògBЉ¹ï+â…?Ÿ5&>‹„Õ.ü§w”¶˜ pÿ åé±´>kà,࿈-F}Äëú_4•è™I»ŽB4m%D|Òë´Ñ6ÒB¢z'ß/”­|!ò~  ‹EòXÓþr´bᥚ óŽ©PçÙÓ‰bU4`â G÷i¬ßê?N»ûÕs¿­«%´»7h‘jç‡@²ô@œù®FcÄt"*Z«jWî4&äÁÎý €é˜iÓ=Ä@¶U@év(ð§ò POpªFäïÕ›@• þÖ–„+³Ð9úÿßÿõ «7fÍãðöž-¬m-ߥ©võºÛËöÛ3«ËcËï þçÙ¬ž2 Ô´a4@jøíu熸ð·ñè”þËÕ1Nßûš°³éÎïØr8æŸ}Ïz&H ™}‚'?üÅþÉsŠp*5¹©kdjÊ ò*£QÔÄÝ(ûùŸÝ©ÂÑ».…²Þ0["á{Ò¢áR³?†¾_hçª:è €õøížk¸ê¶Ì^³\næ6­pó`‹”v+^Ùï`¸Ý tméˆþYÑùoñM­‹ÓñêRÛʧ½¾´}¨ÉЉúwäÇUsä”Me™š[WŽ€=üˆ¥×nÏKˆÒ@'ňE!Ùœ—áê˜ü{b¥aŒfs£Ø8¹³mËB–¯O>Á(¿BØzP˜ ÆcFЛ|Ô.9,ÞÉ+Zú6Ã¥Œ#lKÐñX ÀQúieUïÑǓӮc3åŠ!žÖåæg ^³r¨I % ¤Ï!%„Ä Ï=\À™¡§r´´´U– ,8AÅwÿ–¨4²¬ÅNÆó62Ea–Bä^“¢\±EMfìQÑ€¼+lãî¬Àå9jðÂ_`²oÉ´ð*&uÇnÈžÛŠÁ¼‚O '²Í?iJÀª‹].F‘º€µEò xÛÁ®å¿â¼]zÅ>¨mðFez\5öcD®sŠ=¢«üÍØt™ÇÔ …æ–ç“‹|æ…ÞÕðœ€ÿ]' ·{ÔÇPSx—ûvœÏÅpD-½pÓˆZª5 Lv;€åXl©ѱ¥ÎÆë•o+¸oÑÇçö,Õ^j’ýŠHÃÛ`ÜVtþ^£¨ä£¶¤Èl¹V‰ÂÐ`Q á!TÑáu?ÿ®¥úNw.³hÄdyú¥m´W¶_å PªÔ³Y çéíØ¤)DËöå4Dqrâÿ‹÷;·å6ò2G§® ²yÙ}”»ãA†àSçº=c¨‚BÑš¸4ê:¼Ö ërÚ…¤v»­0ÔɾžxǨúMÁãAªý/D#uzve)Ú£œ.5À~] ³`ÉÀ\Œ—àây«B»(5•ùàͬJò繑ïžx àõz)aaª¡Ï›=2bPëHŽsœƒÏé[ƒ3yeŽËûœ=÷ä-Ý&Æåu4\}4’1sBõ©$ëQÁõºÐÈÓÈAÅX+" LC"9UÓ¶‚bGÊ5r0µ{=Ÿûû¶™ˆxØ,ÓkêØvÊUM÷ hØðÑzYEñŒx9Åm•AÒ~Ðø9ìkCN1ÔN pU3ˆ“v©»føÐ g]bS¶ gŽJP"è„ÇO´uâ BÏSU+ ð4‡MQ…¡cÚÚO®S°±P¿E¼îfO‰:ÔÆ­€Ê¼"8KĘÁ¬uw€ïâ×1˜Ä”åÞÆÉF@DòÿAOð§mø168#/‹òÚ@j÷ ¦J›¹q®± #÷ª·7ƒzÇÞp.Ui0b‡“¹ <þÇŽ<Ih6Ž@x±È±’À£+ö¥ö é˜þ•1H…ûUþRŸ¹“õ¿[ÞJwE9”‚ Þ¡Î`EÞÌbør¬Pž}56V#îѶA׿égˆ«óE‚Ó€Ö•$Å Ýÿ:V´‡ŠŒ“Ý!'ÿ6^R!èîëQ.{ gyoRäÿ;>Š5왃0¨ÁýÈÄ ÷ëBïÖ<ó> žIˆÃ¸ÌÜ!C¦/Ö–°ù þpƒu.чHõ6 ¯À¢ MßGLægìI.¸N ÜOíL±]§c—1ÉŠ*G2¶§Ì6'dëß/:ï)-FIÖ–”C¼¥HzÈŠ;( ÇPæ+’’ŽÊ]襚¦§»B¿}HÃß ¥ò¥>¿›dËàä°føùöŸéùß!_Z5ó«ï7Ê1žBFždE…íXÌNÇyÀ|å(»õK €=U»¼#ŸX4ó'†Q ½…ãd¢+%"­Ly"7ŒÞ›þ^¯×D¡}g°pP2“áTQ°=I?n}¹QÝ]S•j³ ]Â(¥'à…ë@L¥ñÀÊ?Â’“< w½NCן/€¶ÃøÝ‚­Z¡7¶Æ\U™(]´Œlüí‹k+ÔŽÏ`)ôàV³Ï«ÀoŒùÅçÐT°Z”ÿý÷Ñ¡¾ÑÆk’1ƒ•–ù[Põ²û"ëži;¢U#0ÍWå¦*°]d;[¤±— !¡/ÕÍ"Ì!ë‹jXahX¨mS%ï]bܪ¶G[wŽðlTz¯§Õˆo‚Š=¡ÉÌ’èÑDz´ÁFGC’+情íj½m¾{ù¸TÿfÕ´£m£¢ lAˆ¦2ÊÕºn¥ÑïÞš#ÁïÌ‘„w1ÑÉè—~´tT³âÒ÷۲㪮‹´ù/Ä"½^M$×êQt…03ãdò`ôU:rKqÙ= ÇwÙ`–{MÜÓyÁïèj‹ øO½°àù¾n\þÒŽÁ;ûÚ˜t–vW§Ÿ×øÜûüFq(è†ñ·:ûÓ“M…“zûÉ£ÁäiÓÁÞûB0ÍÒé5zÁê¹Dv|ꋆV"¸C’¾^#™./xã$8Íæ'˜ÈÏÅ+ah!š€÷ZØED#Wxð7F-$§<á}øÿé‹ÌSÖ[R­<‚ÓÞí’åzŸv¬Æ—ÔŸÚ} ¬:sI8ÓÆžišÙ‰#Ìß¡ Ø^Û _¸ÁF[iHÉßK­¹7 L´mݼ£{ƒœ)"s ¾x©Ï—¬žK“éÎhùïuŸ£åÞ¿Ž RrQrÄ´°nUåÕÓYkyD/#xIà#Ø\k5ÊhYÕ¹5Hq-ý»÷ÐwZ6ñ|J¢%€:?Ý·4]ÝÕAõ¾Öjí?õ¬ïý­¢óEŒWn O°ÀFÌ@W"Û±‰jEôÜ“äb/‘ Ä<}ù¦Â(IÿŠgóÑkØV]ä¨W€€·c͘ï–NE DÆIÆ/EeÜDÃþ|³+— ý­Ý“™f,…J¨'z?³B¤nJo+êƒ|‡â€¸™CÊG<Ç?8hÐô1€89jf#™UÃË­.™vÛ’;ɿΙ¯«°‡N„!ãŽÇ57øµ#p¯œùh2D^_äyAK(î›uÖš2:§O­'»¬ª5tlG{K±à^a"¢Iò»iܳ.VÐ¥?Fõ3Ô<`Ù>a ÆÐE 5Ó”éÒí;ƒ % ,ýÜX+K’U±W…B[Kéû‡pq•I³^~M¸Þ§D!ûD…,dˆ £ànÈ´Q¨÷aÀ·Ÿþš»à^Y™ßév@Ç6S—›4 lä? ÖnÉɹC{HÛFÖíòpyuÖóÖ4¸<Å‚ßñˆ7Ú`{ÁkíÅßm4&W¡ ¹-qeܱيyÏ×lY!tMž\Àí´ÍwÙ9f¤0*•ïØð1)¸G+¡Vá%8ëÍÔ™]./QW`İYÄŽ\]oÑU‘ŠzrÎoèM»¬„Ýõ+mÈX´4„ÃYPG1¼>N¦pâAIOѤZL=€ˆPŽqëD€è†ñîÝs#?4{1§ÑëŽås¢É|ûYe9›E«øÚ5Gà‘€ i!v-:Ä{vF”yÂ)|¨/¹î•wbqŽN£É·{i'Ü1ÂB F’z”:Çi<…DT=hCÁé7™þŸ½„¥ÒE&#DIH¨3ŽøŽŒWèqÄ ämf¼>ƒ„“åJ. xE‹ÊZ°×­[ÖQs4Áê¦2ݦaD…}«xñÌòæù‘›‰˜ëôý…“¼ÄÎ(O·a¦ÈÚ“£±å©rõ)Њ\·”òŠÎ‡ŽìdŸcü9v­JÑ'× ìò*ñâšÑ¾ò vaRwÝ¿²üÙ(HyÙn‘ [Ubæ:…&Ò¬o?ë–•ŸZã—Sì²GðK ›¢ Q\[$[G"_yÇ8*` ÝPº Ò9ƒ·¦·íÍã»:*“ e®€z°Zr­ á¯=9›¹‘ù¨HVµ—¦ðØžh#zYqRôÄ:Û ½¼#,V‡%xœPÏc¯#l,]ëäÇ×@ä@“Üv›Í­Î’1Ý:ËÄÉ>vb6f†žxf*Ûu«¦Ðöw½Šwªýøá“½²‡rÎÓ1äHhס[p¾eLƒÁ<IJ €0O¾ï±†¹§ל‘og®lòi•¢&Uü® ª…Ú /A“3§…[· NfšãD:`ïÀÔÏ&}#}^Ö8){wcþú_I暢1ònŽ·þ3E['¦9.3M7€]¥°„)‡Àκûó tW7ß½˜Y…Ò©•r§Ï€]*¬Õ•Si•ydŠMaTæ¢ül.¸cBM+( »Ž¾¿ªÎ »Âî½°‡¤uâ Ó‹[NdÐådޝ6ºÃ¢‰Ýý¦[Ô²1$OR< kzöŸÍâ¬$‚ø)Í\Ìa1\#uç¶ ùí¹c¨µ¬–™Lüª[t§Áñ@þá*Ùôu`r;E®èhd±¥µLétœÞ€ÚtÇêf¶#"FÐï…ÚäUŒ1xN4Û(D:hò™¢ÜâiœÂâèeqû·ÄX‰¥{³¦Š¤rpyvæj»ßadj!t6Üg'×p,þ‡Dç“ÓvúqLëÖR¦[œ$8‚•ÄÙpé¹Q%*Ý‘ËY©|Ñœ­àý’Z÷¯7?sÄš(̉@ôÓy1 üÙ/6¡˜~ÃÝØ–€ˆ6 ×F=ùí°)Àòó§6ðl Dµ™–?æú·m{½^ÂóÖà¦2 ŸQ sÿSö#6gÎÒýŒG¹6 ²ÞóþЉ(¥ ŒQ_>bY”̧®\ÐN¡6;ެ©Uop«׿c 8ô”d»?áFðä†ghÌu“¿Kýï™GEõÇ$fµJö÷Æ3DU!¿ ðªÇøáÇWéò_”â9½®õßëïõyy“ä‰ñIÎ’!¢mOH³tk/"k:"mñ"š„Äm¡)Ñ*ÐÈû7!©ZˆŒ*ÊæhƵšU¹ýtl¬E]³Å,3 ¢Æ›•Ó*8†·Ë‹?<$)xlÙ¹ÀIZÐ×[¬ÈËèùŒKzízëEZ)‘Çe6Il0”'î°Sá›ê„xWçó9„Þ.͸Që QÏ[Oñ %ìLI[Ðâ¥%FIQ¹?É·«GΕ¡Ø§#’,} G½fWÛ àR;9v0Å m©$ÕvóÔ>ˆ 1°¡£‡ôÇæð ’Áœ˜Q‹Q.éì4i$kêÑcÿH¹bú »Í.—™ ït€Š›f“Ç„ö–`ð4g8ÑtèM%àsATÔ{³+u—†ÙÙ3z‚«qªµë»ÔV›CÎ{ÛÑN$³K vKj2)Œp<Ö²‹ªÙí¦ö@þX£Æ1·_ÌÝcÒ ûß¡ÂÖ®û`¿u5s¸צ0`rλZùJîÔéYÞúp»¾œØ¨ç¾Ÿšð¨ÅAmÅâéT1Ã\ù‚HRÀÍ;IÍÀ;ÉÇjñœ?Œm°ª€îß EŽ#,IºÝ) "íßu¾‘ÕÙ_±çŒ´o4-žÉäb ÌPlBÆ\6ÎÜJ|ô Ó åÖ‚®­ƒ ˆÈµ]–g¤ ”¡m®k7ý å+©wÖ ›èPYá‚rÄ ëÑ™vø%['+¿ý¨_¥Â,¨q=ü•ôŒ«eŠ“BOv~<:vÑÃ×!£ê–ŽrÞyeóÄMæ¸*l †ñª˜"VfY<¾´€>÷‚‘^¥+ 8ÈgŠxÀßÐß&P “À±¹GR\9Êmvó87ºcߢçƒÇ2±­!ŠhqoÀŠ…F¹·Ñ6Äш“Téq((³"•žºÜîï_ŸŽ©õ£ŠØÅ´û*IÀwYÎAÝ;dišHçqé/@¢m#xá %bt÷ I´¡}Ê>uœ¬sfvÚêoÐÀx¢]¢‡QØ¿%º¢Ä­ÓJ¤˜d4q7â4¡JLò+HI䨒›NÊ© Àd%Æ­ •CJ7ÞÂo1§}·} ÕE™Ù ­?…`qjQ¡ løêh»‹ìùˆ¦n²óP`ªE QhŨ”`ØÕ¤™%‡¦BS«ÿK8ƒ D ‘wqja5õM3=B¤ÙX†Q±¢%ºùÌl úC¥&©9EfWä1™­à2®¬‰›»N‚$®Š‚:aì£\.^؉ó~aççú×hð8½ÔÑ5'q³Â*7»T1r=T¼OÑç’U޹‡Es×F9Ää<§wÐ!Èéÿü|å“«<üuúÍŽl¥ÔdTH ¿hlVU5AS.×× Ý»wÅÙ]ëqË8ÁzŒj<¬1ÄÄ”Ë4 ,[Ü©2ºjn>€KóÛïSšÞLo=ƒÏÍZVšÖü˜±'ÄÑ<9Ó@óB½agãø Ë¿U-×¾EzuO2­ýŠBâP£©¾^¥„࢔ Âú²9åß+³hxæÙ®¿^m˜Ê🇄|7g“÷(½ý)ü½~Í©ú{ ‹ˆäå : ‘·™ó1>¯±1 ®\~2¥ú!ñ¢;{ƒ+”Q¼º—Žƒ56Ÿ¶k´u°’s¯”üIý½Ö¶yIh ^qW#…#üwL?"ý-â#D´m›¿õ÷*[ˆwó+6z-½+ÿõzµø_ôÅÿ½þ^/ísÁ ¶­+­ÈA]@Û†ðB Àÿ½6bFõ^CCS¥#S£](Œ }³B/ŽZ9ü}¢m£m³µ¬/<RUqŽñáe†€0sÕJ;XÍ“MnôMÚ h]¦£âÐm‰?ƒÛd7—þtÀ £0@]fÐæQ°âÄãìÜE¦} òÉPÿ!‰Öt±¾ã³Dg<²ÎÎ]a6+3º»ÃŽâ¬is¤XMÅ•’jrC„q÷:ö'aÁnRmVd§Qw´Ä|dêý(œJv‘à!ÝôÚpë¤s èµ½V#N7ádÿ.›2sŽ:âЧñhÌ'¨Ê$B*}O´ëÁ›xÍ(ŸgvëäÍnó©É-w%$q '$âä™3t€Düÿ‚ (Êé„1ï}¸RLr9´¸ÈÑWÃJ«igi;Ó=ç´6·L·+Ùˆ‚<=ë:’¢pIñ7ä´Íˆ‰Re-A!YUþX÷9zmsòð‚Ÿ_¥\Qj+Ÿ¦|‚Yý$–r­€»`sÓÇ89¹Dda÷HæÛ@=_­'… äM9žX¹£Ú‚CBT•mËŽTàÅ+êY|Žƒ6_æq+‘¹`gr¾ö¾ï‘íÄ)‚GlÐ;u1DuÃîêÞ5³Ž· E€§OSÑbG²{-ˆ\°¨킳¨¦¶r|46[ Î áÞ-;¼/†=¹’ž8ï@ç<Øä§q½Õ0>cë²óÍ”SË`ï%Œ}Ä|æùþº§©mivϸ‘+RJL&˜)è˜ôV¸’Õà‚Ͻ?Ùû`2I'ÙîkXÿNûE<5“q}Àös’ðHðdŠ€žØ)8)ÿª ƒÙ6s*)çëÜ“¼œ»ÙÈ #$>yaTˆÇ” -Šˆc›sb¯~“V°öŸò„¡xÈÇ™{B­¢VÕ–wí¤<êwNؾ3¯L#«w»«ÚL°ò€x®MåÝW!Âæ“„—f‰± ÝN¾0n˧é' ‡Å\PöùÖ[ù§Éåpí¯¥ F|`9ÑF´m°mÕƒÎÖº¯½p#€å¡/5w ˆÎ$EigÏè‰1Í]É€ðAu“ÇÙ Ú¶ÿè¿mûï?Ú6Ú¶},` Ò÷°'™Æuz^¢Ø*0ÒâñÇöy靯]ЯRÃqLB6ÂÑž/^˜°à¿pð¾†Ë´ Ý‹ƒÐ'ý"!¡þtÔᤀ@“ Öh b$áLÀo”Œú”ƒˆvôaæjÝÀÂãH]ÐöÓ7l™¨ÔL‘³}uH¾ëù“>D»fŽ_R,D¶±Wbzu¢Š}uˆujJÿäqHš\qäͰqSÓ¢PY†Û7®Öc ³¤S3Œ¥(Ú?Ú¦DîÍhŸq篧yäÖ6D>è2—–›b|‰vý³QÛõõÓ>‰k]‘ßüÚ”^dt_ùDÿ DçW•©ÿgïJ–äÈm(Àlÿœ¿eþÁßëËcG¨»’˜7ìÉZZ-ÉêƒF¡©êb%I,À{£ 1‰KáÔbq$ë. s¹ˆ1犽’S£Ö.ÊlÏ­=uî¾ÛÓ¢¤ –à{6„ÀKͦ­%Çó㉨Ä;Çíîo¾{¢ö³Ù„ì+O!\ª{¿"[ä&ºÉˆ±«îÀÿ¶L1éȱ~Í úô¤@rVÒ²V V 8× {({ë¼`\1€ñ47íÕ¼G“s„"K/ë‘·OD(jø—v…©äâÒo^¨ü $ü튆d®w#Íì·c XèŒàk üfÄõL=¤Ô÷škÉÚg"™6É]z—ë Å]Á|d»¬ rEÒ#Ë ¸ÈeK'S%=¶K;~AO«M=fú@ÁÐ0¿$ct!Z³Ái¹BÌîÆC_/)iG&ù‡p¥·“»ÕϨ"Ží§Ò9ʚФOÙ%ä!MÏ„|#\ {¶”ÈDLÞ‚‘¶“ ?®Xû K²·P’ÿ\ר¶ÆòÜÎÐô=ä”s¬} ›3®`ƒP2Ä‚—!õ„ÙŽù«ÝdÔñ‡PQRÃ;¨A'diÅê"¢t§›tóÐÆQŒÀ $LŒ I.Lí¯ ÒÑ%å{€@5 fÚÎrå 7ωøÕˆgRBNú*ÜœR:VB"RÐòUtåªã¨G±OÌåÆ9F0kiǶ‡§ãN¢á™MØZá^ßFlœð’:AÔ5ry¢œ! JtžÀ€Þ‰âuîDÀ •Ž£T,žKæzHR¢‰·$îQºh4ÕQ°b9¥jWûTW\© ý§>0lÞÛ£p ax0Õü~$Û 1_ ’0iÄ;ßð"ÙŸwgh8ûÊl‡æ×?ÊÕ£OŸ¡'oy2à9@@øtCïïŸÏ>©Dûay6ð狸²pó=@AwãÒWorÖLZÉì÷eý)Ò™ŸÀ¶ÌŸk˜ß‹~¼éÊiˆîxWvò»Dt²½Ãiª‹cljJ š z¯ÚÙI7º#ŠûÚCòÿFLgÀzzæLþ¦õÛ …ˆ Öz;]ÝÈZk—ô,DPËQéDn¶“œ˜‘ÿ½‚.yÑ‹÷íH²ÂñŽÚ‘¤¡][km,@tV^’xkü@2 ¢»N0o΢ råö,ñÎr¦Ü‚âu€ JùÑA¢–l$ܦR½™˜ HyrêÈcò¢²AIUázÓPÚ} do î‹Õ$lï Yƒˆ‡ŠIêºÂ)¢©)jkMB?ԣ±fÀ«·ßýfb…)1†áD VG¢PÞÖ?.iC !~¯Þ,òˆtˆ9}ò9]OÐ §×Mñéºïˆg×Q#ƒ+&E÷Ç;}ŽO:]ºÏÆ>;Çw—TTfs¬ybˆúZ'Ùµn„ç‚¥Ü–Û 8c{Ö¿LùxLñÉ…"O¿¿ƒ @“éÙK`ÔšÞz-úŸ_+–3¿8Ïy,†R½VYŠäžž™¦ß)ñ±y/®Ø2é‘òpH¶Ý™lC.o3Ÿãð>ڋʉƒ(0Ç€¹n.U…ãrbPÂ.ŠJR¸Ð%{ïªDä~íÞÚÕŽ7yÜ…Q›ÄE‘àSîfA*£a,'¸Wmfƒ½çó1z7 'å,ö)Èv) ·í¤%©Ø÷Ñyý8-ZÀKð%6ï»0Í0á¶jÑh>=ô•^g+(M}ÉçÜ­®<ûå óò½B}ó ÐKz¡8{D”^1æ’óÀ 6Ú˜pomft!Ãášmzy=ì2_FOG· õr‚OLÉ#ì}yœDÚcUóÙ¾ž_…˜³­÷^ »p†R°¬Õ¡RÉÇcµhŠô¶Ì$BÈGäsѬ—¸ˆÏîïgµ±z+Ûü äI~i{=cNŸÙÏ 1Vk½ÿüã_õvû•Ëûlú¬γֳž½oõ¬õã³(`º….KÄLI¼ˆ+¸Þh¶ #yWÝD¯ûšuY Èk´Ü2â@ÂpVmM6Ybü–d„˜˜e“ÂÄïœë—ÚæÊÂI«áZ‘K*?Éí,¯Ît’h„h`™7‘î¹7Ý“h|'äQ¸opûîÒzbŒ3Нk±xQl¤$úß“*¦A<L"¸tP‚„-σGŒ{ñ:m`h«q½Ü´p“Í3²©m1'<—JQö%ƒ ¯ž!: 6ç9qA)ä"Å ä|}´7THøMzñܻؠ9 '7´qØ®vN&É’œbó9³ÔƫԨZÎnqDÈ)zˆç%m…ü ïüž/æó©Ÿå¡û\óƒF]iÉ,ÇQ$“L&}:—»g¥š‰ç<ß„z¯ÆÏw¹ÝÙ+-}Ëd"ÎÎÐg(Ž»Dà>rí *$Úy˜›¤.›hf>UÕ Âк Í9‡l^{È·˜‹A}Ó,»ê@Vè¢Ë/îÚŸIkC2 9¿Âü®³3šK\Lþ‡AQªCD9ÑœØP︣‚¯Òá ž ®±ÖOÉ25€‘æÑêô'¹h<9/®éaßù<ÕgËD¾„ ¢Ž$;á¾Ã˜gÉ\/9–DŠ–ÈÖŠÓc#Î÷fAi)Œ¦÷fŨ}Nc[@¨]óq…ç÷%U<{<'WüÑzÀÿq„"z`›îɳb„nº“¶áž¡y‡Kf¸Œ ’}ʆÅ ¸ý%&¼XZ€LÔÇS |Òâ;q$Ã0fnÚÇãvð/›+ápû=åô˜œ,ÆkCkñâêÔÒ^ôƒTvÊA¡Hµw"_*wO+¿p÷ÊÁ2»;ý"S$‘ûAõ}a`ÙŽº—pÃuõ¿xbŸ—-½zÌyÀŽKó’!*^b'áu)›Ðr B.&Uˆ#gBpI“a>Ö1¯ïº*Ë?¼ÌI)¢\~ËI¢‰†˜ =˜p ,ò}A^ó ¯ Ú=ÿãIÞ‡Ìæ^c“ÈèV^N¤î1Q&»ùàN_¶5†æW= ž¡^&,ɃÝìt¼/½`ðwNYŸ!W±Î5%Zòp"ìEÉ,·úqûö×_Ma5mÉTªŒ«¤x;oßà?ÿþ³üãmTRÉkæ0KQŠáɳK¿žµ`«¼ !ÿ¢‰±HžøY†®œ>ñZn³h¶ Äàp›¡ö´ØºJ)X°`„RФƒwü©Ñ¨ Y/`ã#Ú™;™ H””ÓpîæÃŽÎ?«´ƒÑ˜¶JÕ‹´ÎCí啈„"ñøe|F¥Jµis݈,PÃùÆ¥u1>©¹=¼†Ò޼ÂÎæŒ"¬ZéÈPó3ì€)–Ó±›hWîº ¸0Š×níKAéHïЭµÖ³ží-z8ÞŽ£¥ÈËœƒ‚*u{Ôº7«à$hd ÓÚI¬Ñ¹h‰ °ø²íãÚ§UziøGƒ@ìU'‘¥ànENz NFAc´ÞM«Y “°`ØGà©Ê!ïý ^okäüsÕtFG9ú®Ž£=Ô‚å8 –YVªõ¼ÝÎó¼çykä<¥”ãx;ú *Ó§Ÿ'ó÷ò5ÌÍÚá™ ð°±rŠ’;›Ò'ný](ƒP_¦Ìê­F¾¬Ú‡),i»ÆÔ\ó¡pkaÒa2`–‚Çq”ß…×ÅÉ¢(9Ëá ðž’c1%WwÓAh· >'¦¡AïÉx_’*Õ³žïït;¿ý÷@ÔCqø•l~‡ «x£“nïT©¼ßÀW¶•ày>†¥›!†ªx¹…äB#eyÜGëöêál¾‘§=´,ïh ×oyYªÍøz8Ei®—×íײ þ(ºß+ó¦Q@,ÂUd€Ù1ô ŸK¤¾,L/ )ùÉyÞ -&ÇM$·>—³ ɆE ^+ç¬þ/C°ôxŶOɽeR]ü©oU§àÎâ €.~¶€®žDçàʃ£%öx0ˆ’#ûW°ô˜¢ ßN¾Ý\eÈÉQÿ£ßÿÕÉ.{Ýa+&p–á÷( ß;ÑŸŸÍÅc\X«Ü's`Tôø¡×b²bÐG "åè«\´Qõ¿#fâcN$¤êwª˜æÃ˜yÂé'ÿ\ó>˜Ð”)ÞyºÔz⋬ ¹‘0Ö4ƒ£<¸.0±÷¢I¦×h&¤‡ÑЪÀ´&/£ðׯ›”§´köÛ¶‹2’@²ý2üêÙ›?ߨ ²‘ù_ÕXE0Jâ^ŒÙ ÛwM¶wX¾½ªÒ=„mOï,X é«ïª×û€R Ȫs® Zù:mÖ|Ù¢ŒM“[H¾ò8Ýôº0bÞju6‰³$¯áÇZ3›LevȈ6¸“ÙêC[¬éd0uH-¼iõ¿‚¢¬d³AY–êQä®HӀЛØlgI~C|Êqð±ËÆ.XUº‡ ôБsv/ĸ@~*ü€Ï´éàø®Ñs1uQV¨n¥Á´ºÌFG8Z¡È†¢´«0 ”âð‡kuÝ-Áæ~\WjO >AY\À6 “6`p?%ÀêzfBdjJ);!Û¥#JâH 8#­·c®uì=v§¨ZÍo A J îsY0Ïló•'T"”›“ƒ1‚LpÍ~îÙ.§æ¦;-Ê>/g2¥²¸Í,jØIÓ HQí"j_ëaë§z„]«®Hµã°€Çq”ã(¥´Ž1©Ú½PZ°åˆ)”®ˆUú9”`ÏÜÒ BºÌ­ö‘RZ7dteáyT`Ùüâéi3ðwþ×kÓ6™f…Q¡Š^(у‚>m0Ba><¨çHjs5«ÏtöA)Gÿ³”‚8€Îþs;[9zJ9ú&@g5ï}Kíðñû:JžaVè*Âìïho® ›° °FËñ$ÖSD×uP{†9Æ G“­n9Swº  W]˜Ä=jzÑ…¿½û7𮾪r”¶¹~—±hG-™­ð1Òùˆ)\õ|\pbeô2­ôWË ¾fS@ô¼6TëyB¥Ûû;ÔÑ+ø "þ°ÿÿÿ„Ùà°:–Ð&IEND®B`‚opensurgsim-0.7.0/Examples/Stapling/Data/Geometry/wound_deformable.ply000066400000000000000000001356701277777236100261750ustar00rootroot00000000000000ply format ascii 1.0 comment This file is a part of the OpenSurgSim project. comment Copyright 2013, SimQuest Solutions Inc. comment comment Licensed under the Apache License, Version 2.0 (the "License"); comment you may not use this file except in compliance with the License. comment You may obtain a copy of the License at comment comment http://www.apache.org/licenses/LICENSE-2.0 comment comment Unless required by applicable law or agreed to in writing, software comment distributed under the License is distributed on an "AS IS" BASIS, comment WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. comment See the License for the specific language governing permissions and comment limitations under the License. comment comment This file provides the geometry which describes a tetrahedral volume comment mesh and triangular surface mesh of an arm wound. comment element vertex 391 property double x property double y property double z property double s property double t element face 407 property list uint uint vertex_indices element 3d_element 1476 property list uint uint vertex_indices element boundary_condition 79 property uint vertex_index element material 1 property double mass_density property double poisson_ratio property double young_modulus end_header -0.017638 0.001427 -0.012363 0.707716 0.681378 -0.018984 0.002069 -0.016867 0.736310 0.634209 -0.014913 -0.001358 -0.015090 0.680908 0.590891 -0.018090 -0.001832 -0.017359 0.707848 0.596931 0.012643 -0.002455 0.001226 0.403742 0.411127 0.009376 -0.006324 0.003409 0.0 0.0 0.015479 -0.002289 0.003265 0.375952 0.394412 0.014119 -0.002367 0.007046 0.0 0.0 -0.000236 -0.006438 -0.015323 0.0 0.0 -0.003732 -0.004010 -0.013609 0.0 0.0 0.002155 -0.000546 -0.013612 0.0 0.0 0.001262 -0.001523 -0.018049 0.0 0.0 0.019667 -0.017785 0.008674 0.0 0.0 0.029299 -0.005262 0.004546 0.0 0.0 0.046990 -0.020879 0.007375 0.0 0.0 0.037332 -0.020768 -0.005328 0.0 0.0 0.033586 -0.016523 0.018450 0.0 0.0 0.034101 -0.002031 0.016309 0.0 0.0 0.033392 -0.002474 0.009623 0.0 0.0 0.025349 -0.003774 0.014192 0.0 0.0 0.019145 0.004850 0.012264 0.307965 0.463751 0.020216 0.004879 0.011113 0.302951 0.437069 0.020968 0.001399 0.010219 0.315752 0.400181 0.018687 0.001314 0.008476 0.333716 0.411611 -0.007352 0.001018 0.005860 0.538316 0.697416 -0.007333 -0.005722 0.014291 0.0 0.0 -0.013652 -0.000173 0.002866 0.599904 0.744518 -0.007113 -0.008223 -0.002577 0.0 0.0 -0.006477 -0.004144 -0.015932 0.0 0.0 -0.010957 -0.004967 -0.018490 0.0 0.0 -0.007629 -0.006377 -0.018801 0.0 0.0 -0.009906 -0.007928 -0.014976 0.0 0.0 0.014105 -0.020914 -0.009294 0.0 0.0 0.009112 -0.006286 -0.008604 0.0 0.0 0.006268 -0.009189 -0.014543 0.0 0.0 0.002300 -0.008261 -0.009596 0.0 0.0 0.006635 0.000026 -0.006193 0.478446 0.422446 0.010115 -0.000309 -0.007852 0.0 0.0 0.005102 -0.004418 -0.008996 0.0 0.0 -0.006609 0.001420 -0.025080 0.683895 0.418703 -0.011057 -0.007486 -0.026293 0.0 0.0 -0.008811 0.000184 -0.034044 0.750872 0.396926 -0.005338 -0.005470 -0.024596 0.0 0.0 0.001259 0.002603 0.004418 0.477874 0.590676 0.000123 0.002377 -0.000362 0.508779 0.579936 0.002998 0.002713 0.001375 0.478745 0.561899 0.002769 -0.002124 0.003090 0.0 0.0 -0.020005 -0.002711 -0.020006 0.725914 0.579430 -0.021803 0.001971 -0.019803 0.769228 0.624707 -0.021059 0.001058 -0.014582 0.742789 0.686283 0.014631 0.000524 0.027783 0.0 0.0 0.022184 -0.002620 0.021520 0.0 0.0 0.018739 -0.011699 0.030717 0.0 0.0 0.015337 -0.003630 0.015467 0.0 0.0 0.016049 0.003671 -0.002811 0.385336 0.303910 0.018898 0.003898 -0.000351 0.355721 0.293064 0.014287 0.000683 -0.000350 0.398533 0.377274 0.019319 -0.000205 -0.003032 0.0 0.0 0.046990 -0.007619 0.007375 0.0 0.0 0.040075 -0.002131 -0.002012 0.275562 0.097586 0.037332 -0.007509 -0.005328 0.0 0.0 -0.011140 0.001039 -0.002776 0.605865 0.671648 -0.014033 -0.006140 -0.001762 0.0 0.0 -0.016684 0.000633 -0.005670 0.664721 0.711067 -0.011809 -0.002190 -0.009170 0.0 0.0 0.024204 0.005929 0.015670 0.261423 0.435611 0.026606 0.006410 0.017058 0.241027 0.413001 0.023576 0.006924 0.019679 0.249385 0.456824 0.024566 0.001831 0.017759 0.0 0.0 0.013743 0.004124 0.008547 0.363455 0.496876 0.011935 0.004109 0.005502 0.386672 0.485966 0.014670 0.004333 0.007344 0.356430 0.470987 0.012704 0.000753 0.008033 0.0 0.0 -0.003034 -0.009956 -0.020825 0.0 0.0 -0.006038 -0.007999 -0.012282 0.0 0.0 0.014736 0.003042 -0.006304 0.410541 0.288505 0.014286 -0.003192 -0.009813 0.0 0.0 0.014065 0.002151 -0.010793 0.441123 0.277848 0.019818 -0.002939 -0.008113 0.0 0.0 0.036755 0.006575 0.019271 0.171882 0.285622 0.036907 0.001084 0.018946 0.0 0.0 0.033263 0.001097 0.023070 0.0 0.0 0.033376 0.002597 0.017918 0.0 0.0 0.022543 0.001069 0.006601 0.319550 0.337176 0.020245 -0.001947 0.007184 0.330922 0.370668 0.019727 0.001041 0.004292 0.343634 0.348013 0.023642 -0.002413 0.005541 0.0 0.0 0.029219 0.001517 -0.003210 0.316280 0.186932 0.022506 -0.007309 -0.002980 0.0 0.0 0.013584 0.001132 0.004599 0.380549 0.438335 0.015737 0.001218 0.006218 0.360614 0.429612 0.015374 -0.005687 -0.005108 0.0 0.0 0.019027 -0.006775 -0.014839 0.0 0.0 0.030475 0.001257 0.015552 0.262159 0.346781 0.027297 -0.001544 0.019319 0.0 0.0 -0.006877 -0.002740 -0.012407 0.607383 0.519549 -0.009683 -0.005474 -0.007552 0.0 0.0 -0.008963 -0.000571 -0.011342 0.619375 0.564274 -0.009123 -0.005772 -0.011405 0.0 0.0 0.006753 0.004254 0.022359 0.380109 0.683747 0.010408 0.004267 0.016270 0.359520 0.575078 0.015903 0.005679 0.020105 0.304442 0.542677 0.017492 0.000471 0.018668 0.0 0.0 -0.018916 -0.006283 -0.013171 0.0 0.0 -0.013552 -0.004660 -0.011679 0.0 0.0 -0.015191 -0.008193 -0.008642 0.0 0.0 -0.014454 -0.008852 -0.015804 0.0 0.0 0.016241 0.004334 0.010184 0.336917 0.483939 0.017210 0.004543 0.009049 0.332410 0.456022 0.012207 0.000507 -0.002006 0.420299 0.390013 0.015357 0.000245 -0.003791 0.0 0.0 0.007154 -0.001854 0.005752 0.0 0.0 0.011373 -0.002515 0.009976 0.0 0.0 0.009600 -0.002702 0.003200 0.0 0.0 0.022251 -0.002063 0.015960 0.0 0.0 0.021468 -0.001789 0.012242 0.0 0.0 0.017030 0.000365 0.013057 0.0 0.0 0.020308 0.001792 0.013974 0.0 0.0 0.013639 -0.003166 -0.002562 0.0 0.0 0.011924 -0.003711 -0.006304 0.0 0.0 -0.014146 -0.020429 -0.047689 0.0 0.0 -0.014146 -0.007170 -0.047689 0.0 0.0 -0.024140 -0.017967 -0.040188 0.0 0.0 -0.012259 -0.006676 -0.033836 0.0 0.0 0.002537 -0.008403 -0.037874 0.0 0.0 -0.001499 -0.000057 -0.029561 0.672858 0.347281 -0.000610 -0.002936 -0.039936 0.735672 0.277619 0.031048 0.003384 0.005728 0.258962 0.227713 0.031021 0.004616 0.009841 0.239710 0.251763 0.029058 -0.002228 0.009819 0.0 0.0 -0.017817 -0.005609 -0.020805 0.0 0.0 -0.021077 -0.009144 -0.020053 0.0 0.0 -0.019782 -0.005521 -0.017072 0.0 0.0 -0.021431 -0.005952 -0.022335 0.0 0.0 0.028581 0.004545 0.037841 0.0 0.0 0.022848 0.002598 0.033651 0.0 0.0 0.026518 0.008415 0.028378 0.199337 0.482877 -0.008942 -0.024739 -0.008176 0.0 0.0 -0.020167 -0.001455 -0.000035 0.663670 0.794459 -0.019937 -0.006669 -0.033633 0.0 0.0 -0.011533 -0.022757 -0.029013 0.0 0.0 0.025681 0.001454 0.013298 0.276295 0.369130 0.021352 0.005330 0.013823 0.286985 0.451165 0.022555 0.005159 0.012575 0.281559 0.420259 -0.018697 -0.003565 -0.023866 0.0 0.0 -0.003741 -0.007976 -0.007476 0.0 0.0 -0.004960 -0.004029 -0.006795 0.0 0.0 0.035352 0.005531 0.016102 0.190755 0.270198 0.033038 0.004995 0.012719 0.216780 0.264971 0.036201 0.003833 0.011247 0.209145 0.220919 -0.014781 0.002213 -0.020373 0.719005 0.520347 -0.016880 -0.002824 -0.021921 0.0 0.0 -0.016398 0.001977 -0.024375 0.754476 0.519638 -0.013707 -0.002037 -0.021513 0.0 0.0 -0.001967 0.002359 -0.017593 0.600145 0.399436 -0.005030 0.002252 -0.019030 0.632366 0.420192 -0.000406 0.001476 -0.021158 0.610992 0.370987 -0.003015 -0.003057 -0.018944 0.0 0.0 0.005527 0.000425 -0.000868 0.462746 0.487855 0.005663 0.003045 0.003152 0.449655 0.544815 0.003921 0.003399 0.000160 0.473347 0.534593 -0.015527 -0.005152 -0.022539 0.0 0.0 -0.015560 -0.006666 -0.026900 0.0 0.0 -0.014996 -0.002896 -0.024296 0.0 0.0 -0.013917 -0.007956 -0.024021 0.0 0.0 0.004887 -0.021029 0.001820 0.0 0.0 0.002057 -0.006870 -0.003212 0.0 0.0 0.022552 -0.001675 0.009108 0.314427 0.363307 -0.024489 0.000741 -0.016918 0.777588 0.684517 -0.024391 0.001936 -0.022406 0.801319 0.612368 -0.024601 -0.004739 -0.018778 0.0 0.0 0.006850 -0.006797 -0.004277 0.0 0.0 0.004032 -0.004089 -0.000551 0.0 0.0 0.012333 0.004106 0.011509 0.361086 0.521100 0.005130 0.003275 0.012820 0.411354 0.608085 0.007317 0.003436 0.008224 0.411549 0.550627 -0.004058 0.001878 0.001264 0.531496 0.626286 -0.014203 0.001575 -0.029189 0.762778 0.468814 -0.010570 -0.002455 -0.021860 0.0 0.0 -0.012199 0.002106 -0.022621 0.713800 0.485157 -0.025827 -0.009187 -0.021112 0.0 0.0 -0.021601 -0.004637 -0.026044 0.0 0.0 -0.017290 -0.008529 -0.023047 0.0 0.0 -0.013967 -0.002130 -0.018341 0.682695 0.540233 -0.014398 -0.004396 -0.019489 0.0 0.0 -0.016250 -0.002623 -0.019238 0.704893 0.552676 0.002921 -0.006003 -0.021793 0.0 0.0 0.009600 0.002834 -0.010048 0.466575 0.318768 0.012195 0.002939 -0.008156 0.437269 0.303618 0.014492 -0.021349 -0.029300 0.0 0.0 0.026117 -0.020765 -0.017965 0.0 0.0 0.014492 -0.008090 -0.029300 0.0 0.0 0.002621 -0.007830 -0.029082 0.0 0.0 0.008423 0.000639 0.001153 0.432663 0.470788 0.030678 0.007333 0.019744 0.205235 0.378927 0.026656 0.007758 0.022058 0.221464 0.439517 0.020949 0.007122 0.023900 0.253990 0.513600 0.024451 0.002704 0.023354 0.0 0.0 -0.023157 -0.024020 -0.019768 0.0 0.0 0.029177 0.003608 0.018712 0.0 0.0 0.012003 0.005360 0.025917 0.328309 0.649173 0.004293 -0.015189 0.020860 0.0 0.0 0.002537 -0.021663 -0.037874 0.0 0.0 0.017564 -0.002515 -0.026912 0.535047 0.158602 0.011421 -0.002833 -0.031689 0.602351 0.194529 0.011215 0.000322 -0.020415 0.517135 0.253575 0.002635 0.003021 -0.012333 0.529341 0.378660 0.001235 0.002490 -0.015739 0.562597 0.374265 0.004272 0.002632 -0.013690 0.525222 0.350674 -0.002997 0.002057 -0.002458 0.541143 0.598152 -0.002614 -0.004314 -0.002919 0.0 0.0 0.003125 -0.022994 -0.021280 0.0 0.0 -0.005395 -0.000823 -0.013764 0.605695 0.495888 -0.008954 -0.001258 -0.015629 0.641873 0.519288 -0.003834 0.002652 -0.016057 0.603320 0.424604 -0.007047 -0.000971 -0.018908 0.0 0.0 0.010433 -0.002408 -0.000327 0.425311 0.423985 0.007502 -0.002301 -0.002415 0.454583 0.442237 0.009372 0.000321 -0.004108 0.449153 0.405214 0.025152 0.001195 0.009053 0.296717 0.330843 0.016960 0.000956 0.001995 0.370882 0.360310 0.019875 -0.003369 -0.000014 0.0 0.0 0.030751 0.008190 0.022981 0.192338 0.395364 0.006170 -0.006701 0.007879 0.0 0.0 0.004293 -0.001930 0.020860 0.0 0.0 -0.000653 -0.004919 0.008637 0.0 0.0 -0.014173 -0.021266 0.011121 0.0 0.0 -0.017277 -0.006019 -0.017796 0.0 0.0 0.023544 -0.000939 0.002037 0.0 0.0 -0.009768 -0.009134 -0.022027 0.0 0.0 -0.009580 -0.002948 -0.014062 0.636321 0.535441 -0.011797 -0.001691 -0.017176 0.666623 0.531485 -0.010204 0.002309 -0.009891 0.632801 0.615829 -0.011598 0.001574 -0.008061 0.635984 0.649988 -0.008708 0.001627 -0.006285 0.605513 0.633471 0.034635 0.001794 0.002947 0.257173 0.179657 0.039472 0.002062 0.008665 0.205123 0.177019 -0.015907 -0.007981 -0.018944 0.0 0.0 -0.020598 0.001813 -0.025718 0.792131 0.555168 -0.045621 -0.006163 -0.019740 0.935849 0.983660 -0.040582 -0.008149 -0.025424 0.0 0.0 -0.042936 -0.004004 -0.023210 0.932866 0.916952 -0.038274 -0.003561 -0.017712 0.876293 0.872123 -0.025030 -0.004697 -0.013625 0.0 0.0 -0.023215 -0.000003 -0.009663 0.733754 0.749496 -0.021118 -0.002997 -0.014161 0.0 0.0 -0.004112 0.000695 0.015891 0.483989 0.762601 -0.016389 -0.004557 -0.019826 0.0 0.0 -0.003547 -0.002715 -0.010257 0.571529 0.501819 -0.001840 -0.000524 -0.011726 0.569397 0.474849 -0.000903 -0.002832 -0.008443 0.541931 0.487581 -0.001161 -0.006198 -0.011121 0.0 0.0 0.026165 -0.000632 0.016453 0.0 0.0 0.025651 0.005503 0.014190 0.255812 0.397905 -0.045621 -0.011579 -0.019740 0.0 0.0 -0.040582 -0.021408 -0.025424 0.0 0.0 -0.032217 -0.008366 -0.016728 0.0 0.0 0.000124 -0.006312 0.001727 0.0 0.0 0.017517 -0.002166 0.004909 0.355779 0.383708 0.011949 -0.006639 -0.000263 0.0 0.0 0.023286 0.001530 0.011808 0.299493 0.388218 -0.013427 -0.006320 -0.020900 0.0 0.0 0.005159 0.001722 -0.017378 0.541972 0.328988 0.006008 -0.003221 -0.013176 0.0 0.0 0.044680 -0.002154 0.004195 0.212358 0.092100 -0.000907 0.002148 0.009167 0.474108 0.650299 0.018182 0.005343 0.015586 0.301651 0.485315 0.043927 0.001725 0.025605 0.0 0.0 -0.012854 0.002261 -0.012050 0.666436 0.627285 -0.014517 0.001574 -0.010230 0.670831 0.667926 -0.011668 -0.001006 -0.012914 0.648374 0.577399 -0.008316 0.002150 -0.020675 0.670180 0.448525 -0.010664 0.002390 -0.018678 0.676647 0.483901 -0.021013 -0.010291 0.007951 0.0 0.0 -0.014146 -0.001754 -0.047689 0.871625 0.380651 -0.008422 -0.002312 -0.044596 0.811809 0.335078 -0.015684 0.000035 -0.039467 0.823954 0.423325 -0.034331 -0.001228 -0.022520 0.867926 0.743772 -0.031662 -0.007124 -0.023091 0.0 0.0 -0.031224 -0.014703 0.002956 0.0 0.0 -0.022628 -0.011995 -0.002126 0.0 0.0 -0.025924 -0.004114 -0.023568 0.0 0.0 0.027872 -0.000761 0.013734 0.287809 0.354222 -0.034591 -0.000064 -0.031338 0.914569 0.689654 -0.029145 0.000494 -0.024321 0.845319 0.655410 -0.028017 -0.005001 -0.028032 0.0 0.0 0.027902 0.001681 0.011326 0.276857 0.326315 0.025087 -0.001165 0.011230 0.300071 0.358218 -0.021752 0.000419 -0.042010 0.892791 0.514352 -0.026528 0.000997 -0.038365 0.897612 0.549181 -0.024140 -0.004708 -0.040188 0.0 0.0 -0.020978 0.001288 -0.033343 0.828966 0.502825 -0.040551 -0.026143 -0.010199 0.0 0.0 -0.023197 -0.010713 -0.012877 0.0 0.0 -0.040551 -0.012883 -0.010199 0.0 0.0 0.004485 -0.000007 -0.025484 0.601465 0.304044 0.010626 0.000849 0.002651 0.410322 0.457472 -0.028255 0.000295 -0.019377 0.812070 0.694379 0.013332 0.003514 -0.005048 0.413228 0.317771 0.012798 0.000333 -0.005951 0.0 0.0 -0.015803 0.002187 -0.014369 0.700775 0.636061 -0.013341 -0.003209 -0.016395 0.673887 0.556538 0.004675 -0.002400 -0.004481 0.483440 0.456956 0.002779 0.000374 -0.003048 0.492235 0.501557 0.026117 -0.007505 -0.017965 0.0 0.0 0.028859 -0.001994 -0.015040 0.401776 0.121209 -0.018952 -0.009957 -0.016014 0.0 0.0 -0.017184 -0.003861 -0.014796 0.0 0.0 0.020301 0.003439 -0.001538 0.351704 0.269778 0.046716 -0.013576 0.023724 0.0 0.0 0.055055 -0.021059 0.018567 0.0 0.0 0.055055 -0.007800 0.018567 0.0 0.0 -0.007396 0.002390 -0.007873 0.599971 0.601408 0.001875 -0.002670 -0.006494 0.512456 0.471953 0.038019 -0.008659 0.029998 0.0 0.0 -0.008029 -0.002626 -0.003881 0.0 0.0 -0.005500 -0.000144 -0.009081 0.582441 0.547991 -0.016373 -0.003539 -0.018074 0.693376 0.563980 -0.010554 -0.001307 0.012690 0.542110 0.813150 0.049300 -0.002253 0.010554 0.156641 0.074718 0.038759 -0.002166 0.014632 0.0 0.0 0.005684 -0.003039 -0.035812 0.664057 0.231011 0.038019 0.004600 0.029998 0.0 0.0 0.038019 0.010016 0.029998 0.114875 0.333565 -0.026286 -0.002491 -0.003954 0.729150 0.852638 0.017414 0.003222 -0.004081 0.382513 0.280278 0.044485 0.002423 0.015009 0.154850 0.173882 0.040181 0.004389 0.016007 0.169553 0.218078 -0.000017 0.000235 -0.005153 0.522576 0.519037 -0.033970 -0.003806 -0.010656 0.813819 0.897478 0.009082 0.001920 -0.014465 0.496261 0.303552 0.017757 0.000902 -0.014705 0.442129 0.218874 -0.030192 -0.001153 -0.014581 0.804471 0.778885 0.025315 0.003889 0.003730 0.298239 0.254431 0.024009 0.004399 0.004815 0.299684 0.276964 -0.000443 0.002808 -0.014194 0.567019 0.401750 0.005274 0.003135 -0.010676 0.501002 0.361565 0.006826 0.002728 -0.011961 0.497165 0.333554 0.008126 0.003261 -0.008819 0.469528 0.344355 0.003879 -0.000228 -0.008173 0.508530 0.439124 0.032342 0.006310 0.016942 0.206620 0.322798 0.023610 0.001317 -0.009141 0.378376 0.199234 0.028043 0.004252 0.006706 0.268835 0.252118 0.028016 -0.000536 0.005381 0.0 0.0 0.017259 0.006519 0.029649 0.274881 0.613415 -0.032441 -0.018179 -0.033098 0.0 0.0 0.022512 0.003646 0.000819 0.327614 0.262242 0.027741 0.001325 0.014450 0.267345 0.359882 0.028451 0.005830 0.015287 0.234742 0.367594 -0.017863 -0.003577 0.009446 0.606336 0.873144 0.021215 0.004148 0.001990 0.329253 0.284285 0.025358 0.002875 -0.000357 0.319055 0.238054 -0.025580 0.001252 -0.027579 0.834418 0.591281 -0.032441 -0.004919 -0.033098 0.0 0.0 -0.038228 -0.001462 -0.027638 0.921967 0.762041 -0.019666 0.002058 -0.021535 0.760948 0.564549 0.028581 -0.008715 0.037841 0.0 0.0 0.010757 0.003389 -0.006914 0.440443 0.329599 0.019618 0.002475 -0.006065 0.380279 0.255089 -0.031224 -0.009287 0.002956 0.726653 0.983908 -0.031224 -0.027962 0.002956 0.0 0.0 0.034589 -0.002055 -0.008644 0.340553 0.106507 -0.002831 -0.000029 -0.007070 0.552248 0.532828 -0.005830 0.001763 -0.004361 0.571170 0.614866 -0.038103 -0.007971 -0.006212 0.816889 0.989345 0.031060 0.005869 0.013961 0.222658 0.302436 -0.030292 0.001057 -0.034857 0.906371 0.609867 -0.024162 -0.006173 0.006457 0.662433 0.924856 -0.042999 -0.006964 -0.014187 0.888500 0.981682 0.001834 0.002718 0.019362 0.427865 0.719550 0.049505 -0.002359 0.021843 0.0 0.0 0.011040 0.003784 0.006750 0.391457 0.513336 -0.001834 0.002801 -0.003863 0.535555 0.568767 0.001083 0.003102 -0.001764 0.503470 0.551983 0.022848 0.008014 0.033651 0.219229 0.581941 0.023375 -0.002185 -0.020891 0.468122 0.139723 0.028581 0.009961 0.037841 0.135591 0.524833 0.006652 0.003669 0.002024 0.444507 0.517603 0.009164 0.003881 0.003676 0.417615 0.501784 0.008207 0.003356 0.004901 0.421793 0.528731 0.049505 0.003057 0.021843 0.084272 0.136500 0.055055 -0.002384 0.018567 0.061146 0.038651 0.001013 -0.000353 -0.009972 0.538504 0.457627 0.029329 0.005348 0.010717 0.244768 0.281415 -0.004550 0.002514 -0.005831 0.565049 0.584900 -0.007071 0.002482 -0.017312 0.640794 0.454937 0.046366 0.005522 0.023902 0.092927 0.186502 -0.045621 -0.024839 -0.019740 0.0 0.0 0.041488 0.008760 0.027307 0.105299 0.272334 0.033206 0.010046 0.034162 0.125908 0.426442 0.026563 0.004882 0.007661 0.273634 0.279815 3 43 45 44 3 65 67 66 3 69 71 70 3 99 101 100 3 61 63 138 3 65 143 142 3 147 149 148 3 154 156 155 3 159 160 45 3 168 48 169 3 173 175 174 3 43 44 176 3 187 188 77 3 67 196 195 3 66 67 195 3 150 179 152 3 203 204 205 3 206 208 207 3 176 44 209 3 232 233 234 3 235 127 236 3 48 49 1 3 239 242 241 3 253 143 65 3 87 235 59 3 152 179 177 3 41 39 125 3 179 272 271 3 274 276 275 3 283 277 284 3 266 107 173 3 288 289 291 3 48 168 49 3 208 262 207 3 156 262 295 3 297 169 284 3 142 67 65 3 188 298 75 3 268 300 269 3 300 0 269 3 312 232 234 3 1 49 0 3 236 127 149 3 233 63 61 3 265 24 318 3 319 264 236 3 321 126 125 3 79 222 323 3 276 288 291 3 107 71 69 3 149 327 326 3 269 63 233 3 49 244 0 3 77 331 330 3 332 168 297 3 268 269 233 3 142 20 266 3 325 54 55 3 262 330 205 3 0 244 63 3 195 136 222 3 336 338 337 3 79 340 194 3 246 174 265 3 195 222 194 3 26 138 349 3 333 346 350 3 351 333 127 3 169 352 284 3 325 55 308 3 244 332 324 3 241 242 277 3 354 241 277 3 39 271 155 3 59 235 264 3 169 355 238 3 205 204 295 3 20 108 107 3 335 154 214 3 87 341 358 3 358 351 87 3 107 69 173 3 359 324 329 3 41 177 39 3 326 319 236 3 100 173 174 3 359 329 364 3 214 154 155 3 154 335 207 3 283 354 277 3 142 143 21 3 289 366 291 3 348 253 66 3 138 367 349 3 368 329 242 3 361 305 341 3 77 341 331 3 232 268 233 3 338 187 337 3 174 369 100 3 100 369 99 3 43 265 174 3 265 43 176 3 127 333 342 3 154 207 156 3 196 200 344 3 188 187 357 3 188 75 77 3 173 371 175 3 340 348 194 3 372 44 373 3 147 340 79 3 333 350 334 3 126 41 125 3 330 262 208 3 291 366 352 3 374 376 136 3 351 346 333 3 377 379 378 3 331 375 205 3 355 152 238 3 380 381 326 3 234 233 61 3 367 324 359 3 196 101 200 3 342 128 127 3 188 357 298 3 379 371 378 3 358 325 308 3 383 148 128 3 177 291 238 3 138 324 367 3 136 344 374 3 173 101 266 3 168 169 297 3 149 326 236 3 209 372 384 3 108 71 107 3 337 187 330 3 149 127 128 3 357 187 338 3 373 45 160 3 173 100 101 3 265 318 246 3 101 99 200 3 21 108 20 3 24 265 176 3 55 346 308 3 371 70 378 3 152 177 238 3 351 127 235 3 168 244 49 3 26 61 138 3 305 375 331 3 266 101 196 3 156 295 125 3 168 332 244 3 308 346 351 3 366 283 284 3 329 332 242 3 244 138 63 3 177 179 39 3 136 196 344 3 361 87 59 3 77 358 341 3 373 44 45 3 327 79 386 3 207 262 156 3 148 149 128 3 55 350 346 3 222 79 194 3 332 297 277 3 39 155 156 3 147 148 365 3 242 332 277 3 187 77 330 3 1 0 300 3 372 209 44 3 246 369 174 3 26 349 318 3 26 318 24 3 332 329 324 3 155 271 385 3 156 125 39 3 271 272 385 3 364 329 368 3 175 379 159 3 348 66 194 3 383 365 148 3 136 389 222 3 342 390 383 3 326 327 386 3 126 275 41 3 323 222 389 3 277 297 284 3 142 266 67 3 173 69 371 3 75 298 54 3 380 326 386 3 381 319 326 3 388 79 323 3 308 351 358 3 352 169 238 3 386 79 388 3 136 376 389 3 239 368 242 3 208 337 330 3 358 75 325 3 77 75 358 3 253 65 66 3 0 63 269 3 361 341 87 3 204 321 295 3 266 20 107 3 147 365 340 3 43 174 175 3 75 54 325 3 128 342 383 3 150 272 179 3 266 196 67 3 175 159 43 3 312 363 384 3 351 235 87 3 355 150 152 3 206 336 208 3 214 155 385 3 147 79 327 3 208 336 337 3 291 177 41 3 363 234 61 3 363 312 234 3 371 69 70 3 274 288 276 3 159 377 160 3 66 195 194 3 330 331 205 3 321 125 295 3 342 334 390 3 176 363 61 3 26 176 61 3 375 203 205 3 379 175 371 3 341 305 331 3 291 41 276 3 24 176 26 3 262 205 295 3 209 363 176 3 276 41 275 3 159 45 43 3 335 206 207 3 20 142 21 3 366 284 352 3 147 327 149 3 39 179 271 3 209 384 363 3 379 377 159 3 264 235 236 3 333 334 342 3 195 196 136 3 244 324 138 3 291 352 238 3 1 2 3 3 21 22 23 3 47 48 3 3 108 23 90 3 48 1 3 3 253 141 143 3 268 270 2 3 2 300 268 3 97 232 312 3 97 312 316 3 23 22 167 3 48 47 169 3 6 90 258 3 317 47 3 3 193 4 216 3 95 97 316 3 4 193 296 3 4 89 6 3 282 347 93 3 348 347 253 3 316 250 248 3 89 90 6 3 372 373 303 3 2 230 301 3 143 141 260 3 70 89 296 3 377 378 296 3 301 317 2 3 282 141 347 3 328 302 313 3 141 253 347 3 71 90 89 3 328 384 372 3 108 90 71 3 328 303 302 3 217 158 216 3 373 160 158 3 21 23 108 3 378 70 296 3 22 287 167 3 312 362 316 3 89 4 296 3 143 260 21 3 328 313 362 3 1 300 2 3 270 268 232 3 22 260 287 3 316 362 250 3 84 90 23 3 71 89 70 3 141 282 287 3 230 2 270 3 193 216 158 3 362 313 250 3 270 232 97 3 348 340 93 3 84 258 90 3 312 384 362 3 377 296 193 3 193 158 160 3 373 158 303 3 377 193 160 3 317 3 2 3 95 230 97 3 230 270 97 3 372 303 328 3 217 303 158 3 328 362 384 3 248 95 316 3 217 302 303 3 84 23 167 3 260 22 21 3 260 141 287 3 347 348 93 3 54 56 55 3 83 85 84 3 56 54 109 3 212 214 213 3 216 218 217 3 219 83 167 3 230 213 231 3 248 250 249 3 56 220 55 3 286 219 287 3 85 220 258 3 185 317 183 3 150 183 272 3 83 334 85 3 336 339 338 3 301 230 231 3 95 248 212 3 183 301 231 3 109 216 4 3 282 286 287 3 169 47 355 3 338 339 36 3 335 214 212 3 4 220 56 3 339 313 302 3 85 334 350 3 47 317 185 3 357 36 218 3 382 206 335 3 250 313 382 3 334 83 219 3 231 213 272 3 218 36 217 3 219 286 383 3 220 4 6 3 286 282 93 3 183 317 301 3 213 214 385 3 167 83 84 3 357 109 298 3 36 357 338 3 272 213 385 3 55 85 350 3 85 258 84 3 336 382 339 3 336 206 382 3 249 250 382 3 230 95 213 3 47 185 355 3 340 365 93 3 248 249 212 3 383 286 365 3 219 383 390 3 249 382 335 3 218 216 109 3 219 167 287 3 286 93 365 3 217 36 302 3 54 298 109 3 357 218 109 3 185 150 355 3 183 231 272 3 36 339 302 3 313 339 382 3 334 219 390 3 185 183 150 3 85 55 220 3 213 95 212 3 258 220 6 3 56 109 4 3 335 212 249 3 14 310 309 4 0 1 2 3 4 4 5 6 7 4 8 9 10 11 4 12 13 14 15 4 16 17 18 19 4 20 21 22 23 4 24 25 26 27 4 28 29 30 31 4 32 33 34 35 4 36 37 33 38 4 39 40 41 42 4 43 44 45 46 4 47 3 48 49 4 50 51 52 53 4 54 55 56 57 4 58 59 60 13 4 61 62 63 64 4 65 66 67 68 4 69 70 71 72 4 73 8 30 74 4 75 76 77 78 4 79 80 81 82 4 83 84 85 86 4 87 88 60 13 4 89 7 90 72 4 91 78 88 92 4 93 82 94 17 4 95 96 97 98 4 99 100 101 102 4 103 104 105 106 4 107 108 23 90 4 56 109 54 110 4 111 7 112 113 4 114 115 116 117 4 91 118 110 119 4 120 121 122 123 4 124 125 126 123 4 127 18 128 129 4 130 131 132 133 4 134 135 136 81 4 105 27 137 74 4 61 138 63 62 4 122 139 140 123 4 65 141 142 143 4 47 144 130 133 4 27 145 96 146 4 147 148 149 82 4 150 151 152 153 4 154 155 156 157 4 158 159 160 45 4 161 162 163 164 4 165 145 27 166 4 167 12 84 86 4 168 169 48 170 4 5 171 166 172 4 173 174 175 112 4 43 176 44 46 4 177 178 179 163 4 180 181 182 139 4 183 184 185 153 4 8 186 157 11 4 187 77 188 37 4 173 116 112 72 4 189 190 191 92 4 192 186 125 42 4 159 158 193 46 4 79 81 194 82 4 67 195 196 197 4 122 198 140 182 4 66 195 67 199 4 150 152 179 153 4 200 50 99 102 4 12 201 52 53 4 15 14 58 13 4 202 120 140 123 4 191 203 204 205 4 152 151 163 153 4 206 207 208 10 4 176 209 44 210 4 137 35 211 74 4 212 213 214 215 4 216 217 218 119 4 219 167 83 86 4 118 220 221 56 4 195 199 222 197 4 174 223 224 225 4 137 226 165 27 4 47 132 130 227 4 88 228 221 86 4 131 170 132 133 4 106 31 137 229 4 230 231 213 29 4 232 233 97 234 4 235 236 127 18 4 48 3 1 49 4 214 154 212 157 4 130 237 182 161 4 114 68 141 117 4 125 123 192 42 4 238 181 177 144 4 239 240 241 242 4 103 243 244 245 4 193 111 159 46 4 246 224 25 225 4 184 161 247 151 4 248 249 250 251 4 94 199 93 252 4 253 141 65 143 4 254 255 240 256 4 257 210 176 46 4 258 221 12 259 4 22 115 260 117 4 260 115 114 117 4 94 82 81 17 4 96 146 145 98 4 178 163 261 153 4 262 263 208 10 4 264 13 58 18 4 24 265 25 225 4 87 235 60 59 4 152 177 179 163 4 116 101 102 266 4 34 35 33 38 4 24 257 176 225 4 41 125 39 42 4 261 164 40 229 4 94 17 16 19 4 267 81 79 80 4 268 269 2 270 4 95 74 248 98 4 179 271 272 178 4 178 184 261 29 4 25 27 273 62 4 274 121 275 276 4 277 256 242 278 4 273 226 279 280 4 210 145 250 166 4 181 133 47 281 4 282 17 94 19 4 56 55 220 57 4 283 284 277 285 4 182 162 161 164 4 286 287 219 129 4 266 173 107 116 4 174 224 246 225 4 282 18 93 17 4 51 114 94 19 4 288 289 290 291 4 223 257 165 225 4 205 34 191 92 4 47 48 168 49 4 292 293 256 294 4 208 207 262 10 4 156 295 262 11 4 149 80 147 82 4 223 46 257 225 4 296 111 193 113 4 165 257 223 5 4 297 284 169 281 4 117 142 67 65 4 188 75 298 299 4 85 258 220 221 4 170 133 180 281 4 178 215 30 42 4 270 104 230 64 4 2 268 300 269 4 184 106 301 227 4 302 210 172 303 4 106 237 261 229 4 221 118 91 259 4 300 0 2 269 4 304 88 305 78 4 182 131 198 306 4 3 307 49 245 4 55 308 220 57 4 132 243 103 245 4 14 309 310 311 4 145 74 96 98 4 178 29 183 153 4 44 210 303 172 4 97 312 232 234 4 302 166 313 38 4 1 49 3 0 4 174 111 223 225 4 94 81 314 17 4 73 31 30 229 4 177 139 291 123 4 140 198 137 106 4 211 192 73 186 4 236 149 127 18 4 100 224 174 112 4 176 210 24 315 4 261 29 184 237 4 269 104 270 64 4 292 294 280 293 4 97 316 312 234 4 250 145 248 251 4 23 167 22 115 4 135 51 50 197 4 61 315 26 62 4 48 169 47 170 4 234 315 61 64 4 178 229 40 42 4 137 145 165 35 4 233 61 63 64 4 185 183 317 184 4 46 113 5 172 4 177 181 291 139 4 6 258 90 7 4 135 81 51 197 4 265 24 25 318 4 319 236 264 320 4 181 162 177 144 4 321 126 124 125 4 8 10 263 11 4 322 79 222 323 4 244 103 324 243 4 54 110 325 57 4 73 34 211 186 4 114 116 53 102 4 189 211 191 192 4 51 68 94 252 4 317 3 47 132 4 290 276 288 291 4 282 94 93 252 4 106 227 237 306 4 91 299 110 76 4 261 247 184 161 4 294 292 280 279 4 179 178 272 153 4 150 272 183 153 4 193 216 4 113 4 107 90 69 71 4 12 53 84 7 4 33 171 302 38 4 198 293 137 306 4 149 326 327 320 4 269 233 63 64 4 49 0 244 245 4 6 221 258 259 4 166 171 35 38 4 47 247 317 227 4 291 139 276 123 4 44 209 328 210 4 168 170 47 245 4 191 190 304 92 4 181 285 291 139 4 329 243 293 256 4 95 316 97 96 4 96 62 315 64 4 60 88 15 13 4 77 330 331 76 4 293 103 105 306 4 182 181 180 133 4 137 27 165 145 4 50 197 51 102 4 332 297 168 170 4 106 29 301 31 4 34 76 33 92 4 40 162 140 164 4 320 80 149 17 4 137 106 198 306 4 30 157 73 42 4 140 182 198 306 4 268 233 269 64 4 106 307 301 227 4 142 266 20 117 4 83 333 85 334 4 47 170 169 281 4 313 166 35 38 4 325 55 54 57 4 30 8 73 157 4 262 205 330 263 4 0 63 244 103 4 125 186 156 42 4 3 132 317 307 4 12 112 53 7 4 250 35 313 166 4 94 114 51 252 4 195 222 136 197 4 335 10 249 11 4 18 17 129 19 4 111 46 223 225 4 336 337 338 339 4 266 68 101 102 4 156 186 157 42 4 13 86 12 19 4 18 129 16 19 4 294 255 254 256 4 293 243 180 256 4 137 73 140 229 4 4 296 193 113 4 79 194 340 82 4 295 186 262 11 4 305 78 341 92 4 157 9 8 11 4 342 286 219 343 4 140 306 106 229 4 196 135 344 197 4 93 199 94 82 4 198 182 345 180 4 329 293 294 256 4 5 46 111 113 4 163 161 261 153 4 242 254 240 256 4 293 131 180 170 4 216 259 4 113 4 346 333 85 228 4 207 10 335 11 4 40 164 140 229 4 246 265 174 225 4 195 194 222 199 4 66 347 348 199 4 26 349 138 62 4 333 346 85 350 4 301 231 230 29 4 347 199 68 252 4 351 127 333 343 4 95 212 248 9 4 140 164 182 229 4 73 192 40 42 4 240 242 239 254 4 114 68 51 252 4 213 29 231 215 4 248 145 250 146 4 182 237 261 161 4 52 51 12 53 4 2 270 269 104 4 258 6 5 7 4 184 151 185 153 4 81 199 94 197 4 219 129 287 86 4 97 96 316 64 4 248 74 95 9 4 183 231 301 29 4 169 284 352 281 4 314 80 320 17 4 104 64 96 98 4 217 5 216 172 4 286 343 127 129 4 292 198 255 256 4 33 37 36 119 4 121 276 290 139 4 290 285 353 139 4 130 131 237 227 4 349 273 138 62 4 169 181 238 144 4 325 308 55 57 4 33 76 37 119 4 152 163 179 153 4 111 46 193 113 4 8 263 34 186 4 244 324 332 243 4 104 106 103 307 4 109 4 216 118 4 295 192 204 186 4 241 242 240 277 4 240 354 241 277 4 204 192 191 186 4 39 155 271 215 4 36 37 218 119 4 110 118 91 57 4 353 122 290 139 4 88 78 304 92 4 282 287 286 129 4 303 158 45 46 4 314 322 267 81 4 201 223 165 225 4 230 31 28 98 4 84 12 258 86 4 28 29 213 215 4 59 264 235 18 4 4 6 89 7 4 132 170 47 133 4 51 197 68 102 4 169 355 47 238 4 141 68 114 252 4 356 314 52 51 4 35 251 8 74 4 93 18 282 129 4 218 37 357 299 4 191 205 204 295 4 20 23 107 108 4 149 18 236 320 4 39 215 178 42 4 267 309 314 320 4 47 181 169 144 4 47 170 132 245 4 338 337 36 339 4 216 5 217 259 4 335 154 212 214 4 212 157 249 9 4 173 112 175 72 4 20 116 22 117 4 87 358 341 57 4 2 269 0 104 4 358 87 351 57 4 107 173 69 72 4 217 113 158 172 4 25 226 273 27 4 359 329 324 280 4 41 39 177 40 4 360 226 137 280 4 112 7 5 113 4 4 220 118 56 4 60 87 361 88 4 257 5 165 166 4 224 50 52 53 4 326 236 319 320 4 249 251 248 9 4 218 299 109 118 4 305 304 361 88 4 47 133 170 281 4 100 174 173 112 4 121 139 122 123 4 198 293 292 280 4 316 362 363 146 4 32 34 211 35 4 226 280 273 62 4 294 359 329 364 4 85 228 83 86 4 244 105 324 103 4 40 178 177 163 4 214 155 154 157 4 161 151 184 153 4 169 181 47 281 4 302 33 36 171 4 154 207 335 11 4 302 171 217 172 4 20 23 22 116 4 293 103 324 280 4 283 277 354 285 4 255 180 345 278 4 339 302 313 38 4 154 249 212 157 4 27 145 210 166 4 365 93 148 82 4 28 31 74 98 4 282 93 347 252 4 121 275 276 123 4 261 178 40 164 4 53 112 173 116 4 142 21 143 117 4 81 82 80 17 4 289 291 366 285 4 140 137 211 73 4 360 137 198 280 4 348 66 253 347 4 137 27 105 280 4 101 68 196 102 4 138 349 367 273 4 316 248 250 146 4 51 81 94 197 4 53 116 100 102 4 140 73 211 192 4 368 242 329 256 4 63 104 269 64 4 361 341 305 88 4 182 164 237 229 4 337 37 339 263 4 180 243 293 170 4 77 331 341 78 4 140 162 182 164 4 154 157 156 11 4 44 46 210 172 4 232 233 268 64 4 263 10 262 11 4 51 68 114 102 4 363 315 316 146 4 66 68 347 199 4 140 162 40 123 4 338 337 187 37 4 327 320 326 80 4 174 224 100 369 4 100 224 99 369 4 339 37 36 38 4 43 111 174 265 4 250 145 210 146 4 265 176 43 225 4 180 281 285 278 4 127 342 333 343 4 154 156 207 11 4 69 71 90 72 4 196 344 200 50 4 209 210 176 315 4 140 40 73 192 4 165 5 12 259 4 223 112 12 5 4 220 118 221 6 4 188 357 187 37 4 188 77 75 299 4 304 60 361 88 4 220 228 221 57 4 272 178 231 153 4 182 161 261 164 4 327 326 267 80 4 319 58 370 320 4 58 309 14 311 4 211 34 73 35 4 259 171 217 119 4 238 163 152 144 4 173 175 371 72 4 12 53 51 19 4 89 6 90 7 4 83 343 219 86 4 159 111 43 46 4 182 180 198 131 4 340 194 348 199 4 177 162 181 139 4 88 13 87 228 4 303 46 44 172 4 137 106 105 31 4 69 90 107 72 4 74 31 105 98 4 372 303 373 44 4 329 293 324 280 4 258 12 84 7 4 224 53 100 102 4 47 238 355 144 4 47 49 168 245 4 314 51 356 81 4 304 78 305 92 4 136 134 374 135 4 141 114 287 19 4 165 27 226 257 4 2 301 230 104 4 90 7 23 72 4 27 145 137 74 4 263 186 8 11 4 147 79 340 82 4 359 273 279 280 4 375 304 305 92 4 5 7 4 113 4 223 53 12 112 4 137 105 293 280 4 333 85 334 350 4 148 93 149 17 4 137 31 73 229 4 34 33 32 92 4 91 118 221 57 4 126 125 41 123 4 143 260 141 117 4 330 208 262 263 4 370 309 267 320 4 47 185 317 247 4 83 228 343 86 4 304 203 191 92 4 317 307 132 227 4 30 29 178 229 4 291 352 366 285 4 91 57 221 78 4 184 247 261 237 4 374 134 136 376 4 294 254 368 256 4 371 70 89 296 4 261 237 247 161 4 357 218 36 37 4 347 68 141 252 4 59 13 264 18 4 351 333 346 228 4 124 120 202 123 4 231 178 272 215 4 316 315 96 146 4 36 339 337 37 4 152 144 163 151 4 377 296 378 379 4 255 198 345 180 4 251 74 248 9 4 324 103 105 280 4 88 57 341 78 4 354 277 240 278 4 13 228 88 86 4 192 123 40 42 4 105 104 96 98 4 100 53 173 116 4 331 205 375 92 4 352 181 169 281 4 240 255 345 278 4 355 238 152 144 4 370 380 381 326 4 234 61 233 64 4 105 62 96 64 4 30 229 178 42 4 67 117 68 266 4 63 103 0 104 4 93 199 347 252 4 301 2 317 307 4 132 227 103 306 4 110 57 91 78 4 367 359 324 280 4 293 243 132 170 4 258 221 85 228 4 332 256 297 170 4 382 335 206 10 4 250 382 313 38 4 178 29 30 215 4 333 334 83 219 4 65 141 253 68 4 53 116 114 115 4 97 234 233 64 4 237 164 261 229 4 282 347 141 252 4 326 320 267 80 4 341 88 87 57 4 210 328 302 313 4 169 238 47 144 4 34 263 8 35 4 32 88 190 92 4 40 162 177 123 4 290 276 291 139 4 231 272 213 215 4 25 201 226 225 4 196 200 101 50 4 96 315 27 146 4 342 286 127 128 4 4 118 6 259 4 317 247 184 227 4 12 13 88 86 4 188 298 357 299 4 141 347 253 68 4 290 274 276 121 4 379 378 371 296 4 63 62 105 64 4 110 118 299 119 4 166 171 302 172 4 290 289 353 285 4 358 308 325 57 4 103 106 105 306 4 193 46 158 113 4 165 201 12 223 4 383 148 286 128 4 106 29 261 237 4 12 5 112 7 4 67 199 195 197 4 177 238 291 181 4 58 13 16 18 4 138 367 324 280 4 26 315 27 62 4 37 263 330 76 4 136 374 344 135 4 116 173 101 266 4 237 131 182 306 4 35 251 250 38 4 77 76 331 78 4 168 297 169 170 4 149 236 326 320 4 71 89 90 72 4 105 103 293 280 4 209 328 384 372 4 279 226 360 280 4 354 285 277 278 4 87 228 351 57 4 68 199 94 252 4 93 18 149 17 4 368 254 242 256 4 108 90 107 71 4 196 50 101 102 4 337 330 187 37 4 328 210 302 303 4 265 111 174 225 4 341 78 331 92 4 217 216 158 113 4 345 285 180 139 4 149 128 127 18 4 226 257 27 225 4 249 10 382 251 4 105 106 137 306 4 357 338 187 37 4 130 144 47 151 4 249 9 157 11 4 373 158 160 45 4 10 9 249 11 4 114 115 287 19 4 222 322 136 81 4 173 116 101 100 4 132 131 293 170 4 165 223 12 5 4 331 78 76 92 4 345 182 122 139 4 261 29 106 229 4 265 25 246 318 4 88 221 12 86 4 101 200 99 102 4 145 146 248 74 4 32 33 91 92 4 211 35 73 74 4 177 162 163 144 4 157 186 156 11 4 218 217 36 119 4 287 19 86 129 4 145 35 137 74 4 63 105 244 103 4 6 118 221 259 4 21 23 20 108 4 321 125 124 192 4 24 176 265 225 4 283 354 353 285 4 149 93 148 18 4 165 166 5 171 4 73 35 8 74 4 25 27 24 225 4 55 346 85 308 4 36 171 33 119 4 217 171 36 119 4 103 307 132 245 4 219 342 383 286 4 371 378 70 296 4 316 315 234 64 4 152 238 177 163 4 168 243 332 170 4 138 280 105 62 4 34 190 92 32 4 223 5 257 172 4 33 35 32 171 4 18 343 13 129 4 351 235 127 343 4 13 12 14 16 4 371 296 89 72 4 97 233 232 64 4 220 4 118 6 4 16 14 58 309 4 5 113 216 172 4 73 229 30 42 4 168 49 244 245 4 26 138 61 62 4 96 145 27 74 4 210 145 27 146 4 80 82 149 17 4 305 331 375 92 4 346 85 308 228 4 0 307 103 245 4 230 64 104 98 4 266 196 101 68 4 333 343 83 228 4 226 27 25 225 4 286 93 282 129 4 116 53 84 115 4 161 144 130 151 4 6 258 5 259 4 198 131 293 306 4 50 224 99 102 4 162 139 177 123 4 220 221 56 57 4 181 285 180 281 4 168 48 47 170 4 356 51 135 81 4 103 227 106 306 4 147 80 79 82 4 76 78 91 92 4 221 57 88 78 4 156 125 295 186 4 224 201 25 225 4 183 301 317 184 4 173 53 100 112 4 226 201 165 225 4 58 319 264 320 4 250 35 145 251 4 198 180 255 256 4 230 104 301 31 4 184 29 106 237 4 208 263 337 10 4 168 244 332 243 4 236 18 264 320 4 182 306 140 229 4 283 353 366 285 4 182 237 130 131 4 284 285 352 281 4 178 163 40 164 4 181 144 47 133 4 266 117 68 102 4 308 351 346 228 4 213 28 230 29 4 261 237 182 164 4 122 182 140 139 4 22 167 287 115 4 213 385 214 215 4 267 380 370 326 4 379 296 371 72 4 297 281 170 278 4 366 285 284 283 4 210 46 257 172 4 218 118 216 119 4 146 74 145 98 4 312 363 316 362 4 260 114 141 117 4 141 114 260 115 4 329 242 332 256 4 105 244 138 63 4 262 186 263 11 4 177 39 179 178 4 94 199 68 197 4 325 110 358 57 4 167 84 83 86 4 163 162 40 164 4 136 344 196 135 4 132 307 3 245 4 263 251 382 10 4 361 87 60 59 4 60 235 87 13 4 375 203 304 92 4 321 124 191 192 4 267 320 314 80 4 47 132 3 245 4 222 199 81 197 4 176 210 44 46 4 177 163 238 144 4 299 357 109 298 4 110 76 75 78 4 77 341 358 78 4 357 37 188 299 4 224 223 201 225 4 91 171 259 119 4 34 263 33 76 4 157 28 8 9 4 36 338 357 37 4 344 135 50 197 4 271 178 39 215 4 373 45 44 303 4 105 31 104 98 4 58 309 370 320 4 250 210 362 146 4 267 327 79 386 4 211 34 190 189 4 293 131 132 306 4 8 35 263 251 4 207 156 262 11 4 40 192 140 123 4 189 124 211 192 4 105 104 63 64 4 264 18 58 320 4 272 385 213 215 4 142 143 141 117 4 205 295 191 186 4 50 53 224 102 4 148 128 149 18 4 99 224 100 102 4 261 184 178 153 4 180 285 345 278 4 4 7 89 113 4 231 178 183 153 4 55 346 350 85 4 104 31 230 98 4 222 194 79 81 4 269 270 268 64 4 258 5 12 7 4 110 299 75 76 4 5 166 257 172 4 3 49 47 245 4 93 94 282 17 4 16 13 12 19 4 292 255 294 256 4 27 210 257 166 4 337 263 336 10 4 16 320 18 17 4 332 277 297 256 4 105 106 104 31 4 41 40 177 123 4 39 156 155 157 4 161 162 182 144 4 16 18 13 129 4 131 227 132 306 4 73 8 34 186 4 89 296 4 113 4 210 315 363 146 4 132 307 103 227 4 147 82 365 148 4 339 263 382 10 4 32 211 165 35 4 345 180 182 139 4 289 285 290 139 4 106 306 237 229 4 104 106 301 31 4 242 277 332 256 4 85 84 258 86 4 103 132 293 243 4 224 223 174 112 4 143 21 260 117 4 109 110 56 118 4 336 339 382 10 4 187 330 77 37 4 328 362 313 210 4 196 68 67 197 4 58 311 370 309 4 298 110 109 299 4 1 0 2 300 4 336 382 206 10 4 372 44 209 328 4 137 74 73 31 4 272 178 271 215 4 293 105 137 306 4 145 35 250 166 4 26 27 25 62 4 301 106 184 29 4 240 277 242 278 4 263 251 35 38 4 34 211 190 32 4 249 382 250 251 4 176 46 43 225 4 294 293 329 280 4 148 18 286 128 4 39 178 40 42 4 122 121 290 139 4 261 161 163 164 4 230 213 95 28 4 12 223 201 53 4 36 337 338 37 4 75 299 77 76 4 363 210 209 315 4 216 118 4 259 4 379 193 296 111 4 163 144 161 151 4 270 232 268 64 4 335 249 154 11 4 249 157 154 11 4 130 237 247 227 4 230 29 28 31 4 294 255 292 387 4 285 281 284 278 4 263 10 8 251 4 287 114 141 115 4 282 252 141 19 4 246 224 174 369 4 47 247 130 151 4 26 349 25 318 4 26 25 24 318 4 316 234 97 64 4 182 162 181 144 4 243 170 168 245 4 279 329 359 280 4 286 18 93 129 4 84 12 167 115 4 8 28 30 74 4 32 15 190 88 4 5 259 165 171 4 22 287 260 115 4 190 34 92 189 4 221 228 88 57 4 23 116 107 72 4 353 354 240 278 4 138 273 367 280 4 222 81 136 197 4 258 228 85 86 4 107 116 173 72 4 27 257 165 166 4 254 255 294 387 4 332 324 329 243 4 230 28 95 98 4 244 243 168 245 4 47 355 185 151 4 316 250 362 146 4 40 163 177 162 4 155 385 271 215 4 180 256 243 170 4 156 39 125 42 4 248 146 95 98 4 271 385 272 215 4 84 23 90 7 4 221 118 56 57 4 364 368 329 294 4 8 157 30 28 4 175 159 379 111 4 136 81 135 197 4 204 321 191 192 4 243 256 332 170 4 217 259 5 171 4 340 93 365 82 4 180 285 181 139 4 71 70 89 72 4 84 53 12 115 4 222 79 322 81 4 58 14 16 13 4 141 287 282 19 4 303 45 44 46 4 230 270 2 104 4 33 263 37 76 4 100 53 224 112 4 112 116 53 7 4 2 0 3 307 4 105 280 27 62 4 319 370 311 381 4 35 171 33 38 4 216 259 217 119 4 337 339 336 263 4 33 76 91 92 4 188 37 77 299 4 132 170 243 245 4 248 212 249 9 4 140 120 122 123 4 181 162 182 139 4 382 263 339 38 4 22 116 23 115 4 267 79 322 388 4 41 123 125 42 4 308 85 220 228 4 284 281 297 278 4 279 360 292 280 4 175 112 174 111 4 348 194 66 199 4 18 320 149 17 4 165 257 226 225 4 77 299 37 76 4 137 293 198 280 4 51 53 50 102 4 351 228 308 57 4 32 165 12 259 4 101 50 200 102 4 184 29 178 153 4 49 307 0 245 4 97 64 230 98 4 211 34 191 186 4 282 129 18 17 4 29 31 106 229 4 136 135 196 197 4 111 43 225 265 4 205 263 34 76 4 79 327 267 80 4 291 181 352 285 4 40 123 41 42 4 67 68 66 199 4 34 8 73 35 4 352 285 181 281 4 40 178 261 229 4 43 111 225 46 4 329 294 368 256 4 383 365 286 148 4 103 307 106 227 4 193 158 216 113 4 191 34 189 92 4 293 132 103 306 4 358 57 110 78 4 140 106 137 229 4 30 31 29 229 4 301 106 104 307 4 358 110 75 78 4 52 201 224 53 4 136 322 222 389 4 342 219 383 390 4 277 285 284 278 4 16 51 314 94 4 267 326 327 386 4 23 7 116 72 4 94 252 282 19 4 356 135 134 81 4 130 144 182 133 4 126 41 275 123 4 112 5 111 113 4 134 322 136 389 4 261 163 178 164 4 203 205 191 92 4 296 113 89 72 4 53 114 51 19 4 322 323 222 389 4 257 166 210 172 4 297 170 256 278 4 105 74 137 31 4 343 129 219 86 4 0 103 244 245 4 301 29 230 31 4 88 228 87 57 4 277 284 297 278 4 81 199 194 82 4 125 192 295 186 4 142 117 67 266 4 91 76 33 119 4 173 371 69 72 4 75 54 298 110 4 166 302 210 172 4 351 343 333 228 4 183 29 184 153 4 25 265 246 225 4 324 105 138 280 4 331 76 205 92 4 53 116 84 7 4 249 335 382 10 4 380 326 267 386 4 209 362 328 210 4 370 381 319 326 4 91 76 110 78 4 218 109 216 118 4 322 388 79 323 4 13 343 87 228 4 15 88 12 13 4 353 285 354 278 4 219 287 167 86 4 240 256 255 278 4 262 10 207 11 4 308 358 351 57 4 32 91 88 92 4 170 281 180 278 4 158 46 303 172 4 352 238 169 181 4 191 34 205 186 4 27 96 105 62 4 191 295 204 186 4 267 386 79 388 4 322 79 267 81 4 73 74 30 31 4 367 273 359 280 4 324 103 293 243 4 114 252 94 19 4 136 376 134 389 4 315 62 61 64 4 8 74 251 9 4 261 161 184 153 4 198 180 293 131 4 326 319 370 320 4 214 157 212 215 4 333 83 85 228 4 33 171 91 119 4 85 221 220 228 4 159 193 379 111 4 73 186 192 42 4 353 289 366 285 4 286 148 365 93 4 10 251 249 9 4 169 170 297 281 4 95 146 96 98 4 182 144 181 133 4 182 131 130 133 4 129 86 13 19 4 141 252 114 19 4 130 132 47 133 4 148 82 93 17 4 127 128 286 129 4 128 18 286 129 4 12 51 16 19 4 314 320 16 17 4 12 86 167 19 4 140 192 124 123 4 8 251 10 9 4 239 242 368 254 4 333 219 83 343 4 217 302 36 171 4 13 18 235 343 4 208 330 337 263 4 257 46 176 225 4 118 259 216 119 4 12 5 258 259 4 304 190 60 88 4 358 325 75 110 4 116 7 112 72 4 23 116 84 115 4 32 35 165 171 4 135 52 50 51 4 51 114 53 102 4 77 358 75 78 4 27 315 96 62 4 326 370 267 320 4 253 66 65 68 4 255 256 180 278 4 209 363 362 210 4 212 28 157 9 4 16 129 13 19 4 32 91 171 259 4 149 320 327 80 4 263 35 34 38 4 0 269 63 104 4 355 144 152 151 4 361 87 341 88 4 75 110 298 299 4 290 291 289 139 4 204 295 321 192 4 297 256 277 278 4 256 170 180 278 4 223 111 112 5 4 266 107 20 116 4 28 74 95 98 4 141 65 142 117 4 362 250 313 210 4 177 40 39 178 4 211 137 165 35 4 82 147 365 340 4 191 211 189 34 4 190 15 60 88 4 111 43 174 175 4 89 70 371 72 4 163 151 161 153 4 37 76 299 119 4 330 37 337 263 4 13 129 343 86 4 54 109 298 110 4 75 325 54 110 4 356 52 135 51 4 180 170 131 133 4 273 27 226 62 4 127 343 18 129 4 27 257 24 225 4 35 166 165 171 4 52 314 16 51 4 39 157 155 215 4 345 285 353 278 4 12 52 16 51 4 198 106 140 306 4 12 221 258 86 4 251 263 382 38 4 308 228 220 57 4 286 128 342 383 4 117 67 68 65 4 73 157 8 186 4 28 74 8 9 4 3 0 49 307 4 68 197 196 102 4 293 292 256 198 4 357 299 109 218 4 179 163 178 153 4 150 179 272 153 4 257 46 223 172 4 176 257 24 210 4 266 67 196 68 4 175 43 159 111 4 235 13 59 18 4 270 97 232 64 4 124 121 120 123 4 299 76 91 119 4 348 93 340 199 4 84 90 258 7 4 91 259 118 119 4 185 355 150 151 4 313 35 250 38 4 37 263 33 38 4 301 184 183 29 4 339 263 37 38 4 231 29 178 215 4 136 322 134 81 4 312 362 384 363 4 293 180 198 256 4 68 117 114 102 4 24 210 27 315 4 158 113 46 172 4 12 115 53 19 4 53 115 114 19 4 30 74 28 31 4 185 184 317 247 4 351 87 235 343 4 124 192 125 123 4 355 152 150 151 4 301 104 2 307 4 12 221 88 259 4 212 28 213 215 4 345 198 122 182 4 211 73 137 74 4 292 360 198 280 4 138 105 63 62 4 219 343 286 129 4 206 208 336 10 4 4 259 5 113 4 377 296 379 193 4 214 385 155 215 4 12 15 32 88 4 147 327 79 80 4 217 171 5 172 4 208 337 336 10 4 183 272 231 153 4 291 41 177 123 4 73 40 140 229 4 363 61 234 315 4 36 302 339 38 4 89 113 7 72 4 30 215 157 42 4 194 199 340 82 4 193 160 158 159 4 91 32 171 33 4 60 59 235 13 4 273 280 138 62 4 363 234 312 316 4 24 257 27 210 4 235 18 127 343 4 373 158 45 303 4 16 309 58 320 4 105 103 63 104 4 287 115 167 19 4 353 345 122 139 4 247 161 130 151 4 291 285 289 139 4 313 210 250 166 4 116 115 22 117 4 0 104 103 307 4 134 322 314 81 4 248 251 145 74 4 94 68 51 197 4 60 15 58 13 4 371 70 69 72 4 248 74 146 98 4 156 186 295 11 4 330 263 205 76 4 36 33 302 38 4 18 148 286 93 4 130 161 182 144 4 94 199 81 82 4 155 157 214 215 4 129 17 282 19 4 189 140 124 202 4 290 274 288 276 4 159 377 193 160 4 182 162 140 139 4 194 81 222 199 4 22 21 20 117 4 58 264 59 13 4 379 111 296 72 4 116 117 266 102 4 66 194 195 199 4 330 205 331 76 4 16 94 314 17 4 253 347 66 68 4 185 247 47 151 4 30 28 157 215 4 2 104 0 307 4 101 116 102 100 4 88 91 32 259 4 124 202 140 123 4 84 116 23 7 4 317 2 3 307 4 321 295 125 192 4 27 280 226 62 4 313 382 339 38 4 96 104 105 64 4 342 334 219 390 4 176 61 363 315 4 26 61 176 315 4 165 259 32 171 4 47 144 355 151 4 30 29 28 215 4 95 97 230 98 4 6 5 4 259 4 157 186 73 42 4 156 157 39 42 4 149 82 148 17 4 191 192 211 186 4 185 151 150 153 4 185 150 183 153 4 96 315 316 64 4 180 133 181 281 4 230 97 270 64 4 40 229 73 42 4 157 28 212 215 4 112 111 175 72 4 88 221 91 259 4 184 237 106 227 4 353 285 345 139 4 105 96 27 74 4 301 307 317 227 4 85 55 308 220 4 77 37 330 76 4 226 27 137 280 4 247 237 130 161 4 174 112 223 111 4 126 275 124 123 4 111 113 296 72 4 329 279 294 280 4 276 139 121 123 4 12 88 32 259 4 112 7 111 72 4 110 299 91 119 4 145 251 35 74 4 332 243 329 256 4 124 275 121 123 4 375 205 203 92 4 178 29 261 229 4 379 175 72 371 4 33 263 34 38 4 56 110 54 57 4 372 303 44 328 4 302 166 210 313 4 250 251 382 38 4 341 331 305 92 4 5 259 216 113 4 68 199 67 197 4 107 90 23 72 4 7 113 111 72 4 172 217 303 158 4 184 247 185 151 4 291 276 41 123 4 141 68 65 117 4 56 118 110 57 4 24 26 176 315 4 87 13 235 343 4 262 295 205 186 4 134 314 356 81 4 279 294 359 329 4 328 209 384 362 4 165 35 145 166 4 237 227 131 306 4 24 27 26 315 4 209 176 363 315 4 27 315 210 146 4 276 275 41 123 4 266 116 20 117 4 248 316 95 146 4 340 199 93 82 4 25 349 26 62 4 96 74 105 98 4 190 88 304 92 4 58 18 16 320 4 316 96 95 146 4 159 43 45 46 4 336 263 339 10 4 217 172 303 302 4 240 345 353 278 4 213 212 95 28 4 309 16 314 320 4 84 167 23 115 4 335 207 206 10 4 159 45 158 46 4 20 21 142 117 4 314 94 51 81 4 196 197 50 102 4 285 366 284 352 4 343 228 13 86 4 34 263 205 186 4 96 64 97 98 4 260 21 22 117 4 258 6 220 221 4 333 342 219 343 4 114 117 116 102 4 180 131 182 133 4 305 88 341 78 4 56 4 109 118 4 107 23 20 116 4 247 237 184 227 4 370 58 319 311 4 147 149 327 80 4 362 210 363 146 4 260 287 141 115 4 303 44 328 210 4 335 212 154 249 4 81 80 314 17 4 39 271 179 178 4 191 124 189 192 4 209 362 363 384 4 19 287 86 167 4 91 221 88 78 4 347 93 348 199 4 205 263 262 186 4 316 363 234 315 4 237 306 182 229 4 342 127 286 343 4 317 132 47 227 4 193 379 377 159 4 221 228 258 86 4 167 115 12 19 4 140 139 162 123 4 344 50 196 197 4 242 256 240 278 4 25 273 349 62 4 341 57 358 78 4 205 76 34 92 4 216 113 217 172 4 95 28 212 9 4 189 140 211 124 4 264 236 235 18 4 183 178 231 29 4 175 379 72 111 4 132 131 130 227 4 302 171 166 38 4 317 184 301 227 4 111 5 223 46 4 333 334 219 342 4 195 136 196 197 4 109 299 110 118 4 157 215 39 42 4 130 247 47 227 4 201 223 224 53 4 244 105 138 324 4 299 118 218 119 4 224 53 223 112 4 163 162 161 144 4 287 129 282 19 4 87 343 351 228 4 124 140 211 192 4 51 94 16 19 4 324 293 329 243 4 314 81 267 80 4 95 74 28 9 4 223 46 5 172 4 291 238 352 181 4 37 299 218 119 389 323 388 386 380 368 364 359 274 366 283 241 239 367 349 318 369 99 200 344 374 381 319 264 59 361 305 375 204 321 126 275 203 322 267 246 309 289 288 354 376 314 370 294 279 121 353 240 254 273 25 224 50 135 311 58 60 304 191 124 290 134 292 360 120 345 255 387 226 201 52 310 14 15 190 189 202 122 356 1000.0 0.45 7.5e4 opensurgsim-0.7.0/Examples/Stapling/Data/StaplingDemo.yaml000066400000000000000000000465351277777236100236130ustar00rootroot00000000000000SurgSim::Framework::Scene: SceneElements: - SurgSim::Framework::BasicSceneElement: Name: StaplingDemoView IsActive: true Components: - SurgSim::Graphics::OsgCamera: IsLocalActive: true RenderGroupReference: __OssDefault__ LocalPose: Quaternion: [0, 0, 0, 1] Translation: [0, 0, 0] GroupReferences: [] Id: 9ac2cca4-b2df-4ccb-bd6a-d09eed0b1f71 DrawAsWireFrame: false ProjectionMatrix: [[2.414213562373095, 0, 0, 0], [0, 2.414213562373095, 0, 0], [0, 0, -1.002002002002002, -0.02002002002002002], [0, 0, -1, 0]] Name: StaplingDemoView Camera AmbientColor: [0.2, 0.2, 0.2, 1] - SurgSim::Framework::PoseComponent: Id: 61e00b41-e0bf-4048-9cc9-69d828da8845 Name: Pose IsLocalActive: true Pose: Quaternion: [0, 0, 0, 1] Translation: [0, 0, 0] - SurgSim::Graphics::OsgView: IsLocalActive: true FullScreen: false Position: - 0 - 0 Dimensions: - 1024 - 768 Camera: SurgSim::Graphics::OsgCamera: Id: 9ac2cca4-b2df-4ccb-bd6a-d09eed0b1f71 Name: StaplingDemoView Camera DisplayType: 0 StereoMode: -1 WindowBorder: true TargetScreen: 0 EyeSeparation: 0.06 ScreenHeight: 0 ScreenDistance: 1 ScreenWidth: 0 CameraManipulatorEnabled: true CameraPosition: [0, 0.5, 0.5] CameraLookAt: [0, 0, 0] OsgMapUniforms: false KeyboardDeviceEnabled: true Id: 4740c5c9-a638-4eec-b9ad-b6117733ec7a MouseDeviceEnabled: false Name: StaplingDemoView View - SurgSim::Framework::BasicSceneElement: Name: arm IsActive: true Components: - SurgSim::Framework::PoseComponent: Pose: Quaternion: [0, 0, 0, 1] Translation: [0, -0.2, 0] IsLocalActive: true Id: 194f4f32-bfc6-4b22-bc42-b80ee0414edd Name: Pose - SurgSim::Graphics::OsgMeshRepresentation: DrawAsWireFrame: true Name: Collision Mesh Id: 5cd67775-3f9c-40c1-b4ae-4d516272fb9c MeshFileName: Geometry/arm_collision.ply UpdateOptions: 1 GroupReferences: - __OssDefault__ LocalPose: Quaternion: [0, 0, 0, 1] Translation: [0, 0, 0] IsLocalActive: false - SurgSim::Graphics::OsgSceneryRepresentation: Id: 201e6e8d-59f9-409c-8688-64192aedad4a DrawAsWireFrame: false Name: Forearm ModelFileName: Geometry/forearm.osgb IsLocalActive: true GroupReferences: - __OssDefault__ LocalPose: Quaternion: [0, 0, 0, 1] Translation: [0, 0, 0] - SurgSim::Physics::RigidCollisionRepresentation: IsLocalActive: true Id: 485750a6-32c7-4487-a362-050fee89f45d Name: Collision Ignore: [wound/Collision] LocalPose: Quaternion: [0, 0, 0, 1] Translation: [0, 0, 0] Shape: SurgSim::Math::MeshShape: FileName: Geometry/arm_collision.ply - SurgSim::Graphics::OsgSceneryRepresentation: IsLocalActive: true ModelFileName: Geometry/upperarm.osgb GroupReferences: - __OssDefault__ LocalPose: Quaternion: [0, 0, 0, 1] Translation: [0, 0, 0] Id: 2a8aba74-66af-4c41-879f-38c54bdc931f DrawAsWireFrame: false Name: Upperarm - SurgSim::Physics::FixedRepresentation: IsGravityEnabled: true CollisionRepresentation: SurgSim::Physics::RigidCollisionRepresentation: Id: 485750a6-32c7-4487-a362-050fee89f45d Name: Collision IsDrivingSceneElementPose: true LinearDamping: 0 AngularDamping: 0 Shape: SurgSim::Math::MeshShape: FileName: Geometry/arm_collision.ply Id: 007741f4-d2d7-4f4f-9d2c-505539aa00bf Name: Physics IsLocalActive: true NumDof: 0 Density: 0 RigidState: SurgSim::Physics::RigidState: Pose: Quaternion: [0, 0, 0, 1] Translation: [0, 0, 0] LinearVelocity: [0, 0, 0] AngularVelocity: [0, 0, 0] LocalPose: Quaternion: [0, 0, 0, 1] Translation: [0, 0, 0] - SurgSim::Framework::BasicSceneElement: Name: stapler IsActive: true Components: - SurgSim::Blocks::VisualizeContactsBehavior: VectorFieldScale: 200 Id: f7cde302-5c80-4f2b-a80b-a74f55bf15be Name: Contacts Source: SurgSim::Physics::RigidCollisionRepresentation: Name: Collision Id: ec7ac2e2-93b5-46e6-9fda-55b125555092 IsLocalActive: false - SurgSim::Physics::VirtualToolCoupler: AttachmentPoint: Value: [0, 0, 0] HasValue: true IsLocalActive: true Input: SurgSim::Input::InputComponent: Id: 94c01580-98ac-49b1-b8c7-626ace6dbbfd Name: InputComponent LinearStiffness: HasValue: false Value: Not set LinearDamping: HasValue: false Value: Not set AngularStiffness: HasValue: false Value: Not set Representation: SurgSim::Physics::RigidRepresentation: Id: 87eefb88-55d8-48c7-81c9-f8cb24aa65fd Name: Physics AngularDamping: HasValue: false Value: Not set CalculateInertialTorques: false Id: dd56fed8-aa69-4d77-99ce-60364d8cb122 Name: VTC - SurgSim::Framework::PoseComponent: IsLocalActive: true Id: f0f6bb9c-7676-450d-9cb6-e97b0fe1b56d Name: Pose Pose: Quaternion: [0, 0, 0, 1] Translation: [0, 0, 0] - SurgSim::Physics::RigidRepresentation: NumDof: 6 Density: 8050 IsLocalActive: true LocalPose: Quaternion: [0, 0, 0, 1] Translation: [0, 0, 0] IsGravityEnabled: false RigidState: SurgSim::Physics::RigidState: LinearVelocity: [0, 0, 0] AngularVelocity: [0, 0, 0] Pose: Quaternion: [0, 0, 0, 1] Translation: [0, 0, 0] CollisionRepresentation: SurgSim::Physics::RigidCollisionRepresentation: Id: ec7ac2e2-93b5-46e6-9fda-55b125555092 Name: Collision IsDrivingSceneElementPose: true LinearDamping: 0 AngularDamping: 0 Shape: SurgSim::Math::MeshShape: FileName: Geometry/stapler_collision.ply Id: 87eefb88-55d8-48c7-81c9-f8cb24aa65fd Name: Physics - SurgSim::Input::InputComponent: DeviceName: MultiAxisDevice Id: 94c01580-98ac-49b1-b8c7-626ace6dbbfd IsLocalActive: true Name: InputComponent - SurgSim::Physics::RigidCollisionRepresentation: IsLocalActive: true Shape: SurgSim::Math::MeshShape: FileName: Geometry/stapler_collision.ply Id: ec7ac2e2-93b5-46e6-9fda-55b125555092 Name: Collision LocalPose: Quaternion: [0, 0, 0, 1] Translation: [0, 0, 0] - SurgSim::Graphics::OsgMeshRepresentation: Name: Collision Mesh DrawAsWireFrame: true Id: e1d65704-5035-4db0-91b7-a722b28f6b27 UpdateOptions: 1 IsLocalActive: false MeshFileName: Geometry/stapler_collision.ply GroupReferences: - __OssDefault__ LocalPose: Quaternion: [0, 0, 0, 1] Translation: [0, 0, 0] - StaplerBehavior: StapleEnabledSceneElements: - wound InputComponent: SurgSim::Input::InputComponent: Id: 94c01580-98ac-49b1-b8c7-626ace6dbbfd Name: InputComponent IsLocalActive: true Representation: SurgSim::Physics::RigidRepresentation: Id: 87eefb88-55d8-48c7-81c9-f8cb24aa65fd Name: Physics Id: 34e5245b-9b67-4370-86d8-eddd92d7fde3 VirtualTeeth: - SurgSim::Collision::ShapeCollisionRepresentation: Id: b7f70a7d-a6ab-4719-8fcd-698912de1aa6 Name: VirtualToothCollision0 - SurgSim::Collision::ShapeCollisionRepresentation: Id: c5fae459-35d8-4ded-b478-d04ed66e8694 Name: VirtualToothCollision1 Name: Behavior - SurgSim::Graphics::OsgSceneryRepresentation: ModelFileName: Geometry/stapler_indicator.obj IsLocalActive: true GroupReferences: - __OssDefault__ LocalPose: Quaternion: [0, 0, 0, 1] Translation: [0, 0, 0] Id: 11a4f850-b8e3-43c6-a9d8-6d76bcd24998 DrawAsWireFrame: false Name: Indicator - SurgSim::Graphics::OsgSceneryRepresentation: Name: Handle DrawAsWireFrame: false IsLocalActive: true ModelFileName: Geometry/stapler_handle.obj GroupReferences: - __OssDefault__ LocalPose: Quaternion: [0, 0, 0, 1] Translation: [0, 0, 0] Id: 5709c8b8-b12b-42fa-9bd8-37e5fd55773e - SurgSim::Graphics::OsgSceneryRepresentation: IsLocalActive: true ModelFileName: Geometry/stapler_markings.obj GroupReferences: - __OssDefault__ LocalPose: Quaternion: [0, 0, 0, 1] Translation: [0, 0, 0] Id: 787b6765-694b-4682-a252-7bfbc8d0e40f DrawAsWireFrame: false Name: Markings - SurgSim::Collision::ShapeCollisionRepresentation: IsLocalActive: true Shape: SurgSim::Math::MeshShape: FileName: Geometry/virtual_staple_1.ply Id: b7f70a7d-a6ab-4719-8fcd-698912de1aa6 Name: VirtualToothCollision0 Ignore: [stapler/Collision] LocalPose: Quaternion: [0, 0, 0, 1] Translation: [0, 0, 0] - SurgSim::Graphics::OsgSceneryRepresentation: ModelFileName: Geometry/stapler_trigger.obj IsLocalActive: true GroupReferences: - __OssDefault__ LocalPose: Quaternion: [0, 0, 0, 1] Translation: [0, 0, 0] Id: b2aa7537-2c8c-460f-8ec9-3e9f71cc7b5f DrawAsWireFrame: false Name: Trigger - SurgSim::Collision::ShapeCollisionRepresentation: IsLocalActive: true Shape: SurgSim::Math::MeshShape: FileName: Geometry/virtual_staple_2.ply Id: c5fae459-35d8-4ded-b478-d04ed66e8694 Name: VirtualToothCollision1 Ignore: [stapler/Collision] LocalPose: Quaternion: [0, 0, 0, 1] Translation: [0, 0, 0] - SurgSim::Framework::BasicSceneElement: Name: wound IsActive: true Components: - SurgSim::Framework::PoseComponent: IsLocalActive: true Id: e14c0e56-22c1-42af-8fb8-1f5caf32903e Name: Pose Pose: Quaternion: [0, 0, 0, 1] Translation: [0, -0.2, 0] - SurgSim::Graphics::OsgMeshRepresentation: IsLocalActive: false MeshFileName: Geometry/wound_deformable.ply GroupReferences: - __OssDefault__ LocalPose: Quaternion: [0, 0, 0, 1] Translation: [0, 0, 0] DrawAsWireFrame: true Id: 68c8db9d-4b71-4b94-b878-aa7bb594cc10 UpdateOptions: 1 Name: Wire Frame - SurgSim::Blocks::TransferPhysicsToGraphicsMeshBehavior: Target: SurgSim::Graphics::OsgMeshRepresentation: Id: 21058a78-ddc4-421f-b44f-f35fc918a7da Name: Graphics Id: fd091469-54b7-4dd3-a395-ebd43daa1ad7 Name: PhysicsToGraphicalFem Source: SurgSim::Physics::Fem3DRepresentation: Id: 7d447c80-d8c0-4213-a46f-164a800f6d1c Name: Physics IsLocalActive: true - SurgSim::Physics::Fem3DRepresentation: IsLocalActive: true NumDof: 1173 IsGravityEnabled: true LocalPose: Quaternion: [0, 0, 0, 1] Translation: [0, 0, 0] IsDrivingSceneElementPose: true CollisionRepresentation: SurgSim::Physics::DeformableCollisionRepresentation: Id: 2cb010a8-8ac3-4735-9551-1a1c17388e27 Name: Collision FemFileName: Geometry/wound_deformable.ply Id: 7d447c80-d8c0-4213-a46f-164a800f6d1c Name: Physics IntegrationScheme: SurgSim::Math::IntegrationScheme: INTEGRATIONSCHEME_LINEAR_EULER_IMPLICIT - SurgSim::Graphics::OsgMeshRepresentation: IsLocalActive: true MeshFileName: Geometry/wound_deformable.ply GroupReferences: - __OssDefault__ DrawAsWireFrame: false Id: 21058a78-ddc4-421f-b44f-f35fc918a7da UpdateOptions: 1 Name: Graphics LocalPose: Quaternion: [0, 0, 0, 1] Translation: [0, 0, 0] - SurgSim::Physics::DeformableCollisionRepresentation: LocalPose: Quaternion: [0, 0, 0, 1] Translation: [0, 0, 0] IsLocalActive: true Shape: SurgSim::Math::MeshShape: FileName: Geometry/wound_deformable.ply Id: 2cb010a8-8ac3-4735-9551-1a1c17388e27 Name: Collision - SurgSim::Blocks::TransferPhysicsToGraphicsMeshBehavior: Source: SurgSim::Physics::Fem3DRepresentation: Id: 7d447c80-d8c0-4213-a46f-164a800f6d1c Name: Physics IsLocalActive: true Target: SurgSim::Graphics::OsgMeshRepresentation: Id: 68c8db9d-4b71-4b94-b878-aa7bb594cc10 Name: Wire Frame Id: 4acc648a-e162-4b90-9072-8ccd4b96ce09 Name: PhysicsToWireFrameFem - SurgSim::Framework::BasicSceneElement: Name: SceneElement IsActive: true Components: - SurgSim::Blocks::KeyboardTogglesComponentBehavior: IsLocalActive: true InputComponent: SurgSim::Input::InputComponent: Id: 5a9f89eb-868b-4842-bb97-590497b7a3dd Name: KeyboardInputComponent Id: 485bffe9-36e8-42b3-96fe-ab95069cd3cc Name: KeyboardBehavior KeyboardRegistry: 98: - SurgSim::Blocks::VisualizeContactsBehavior: Id: f7cde302-5c80-4f2b-a80b-a74f55bf15be Name: Contacts 99: - SurgSim::Graphics::OsgMeshRepresentation: Id: e1d65704-5035-4db0-91b7-a722b28f6b27 Name: Collision Mesh 97: - SurgSim::Graphics::OsgSceneryRepresentation: Name: Handle Id: 5709c8b8-b12b-42fa-9bd8-37e5fd55773e - SurgSim::Graphics::OsgSceneryRepresentation: Id: 11a4f850-b8e3-43c6-a9d8-6d76bcd24998 Name: Indicator - SurgSim::Graphics::OsgSceneryRepresentation: Id: b2aa7537-2c8c-460f-8ec9-3e9f71cc7b5f Name: Trigger - SurgSim::Graphics::OsgSceneryRepresentation: Id: 787b6765-694b-4682-a252-7bfbc8d0e40f Name: Markings 101: - SurgSim::Graphics::OsgMeshRepresentation: Id: 5cd67775-3f9c-40c1-b4ae-4d516272fb9c Name: Collision Mesh 100: - SurgSim::Graphics::OsgSceneryRepresentation: Id: 201e6e8d-59f9-409c-8688-64192aedad4a Name: Forearm - SurgSim::Graphics::OsgSceneryRepresentation: Id: 2a8aba74-66af-4c41-879f-38c54bdc931f Name: Upperarm 102: - SurgSim::Graphics::OsgMeshRepresentation: Id: 21058a78-ddc4-421f-b44f-f35fc918a7da Name: Graphics 103: - SurgSim::Graphics::OsgMeshRepresentation: Id: 68c8db9d-4b71-4b94-b878-aa7bb594cc10 Name: Wire Frame - SurgSim::Framework::PoseComponent: IsLocalActive: true Id: f26ccf32-aeb8-4790-a612-01a2865bfef9 Name: Pose Pose: Quaternion: [0, 0, 0, 1] Translation: [0, 0, 0] - SurgSim::Input::InputComponent: DeviceName: Keyboard Id: 5a9f89eb-868b-4842-bb97-590497b7a3dd IsLocalActive: true Name: KeyboardInputComponent opensurgsim-0.7.0/Examples/Stapling/SerializedStapling.cpp000066400000000000000000000066651277777236100237710ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "Examples/Stapling/StaplerBehavior.h" #include "SurgSim/Blocks/Blocks.h" #include "SurgSim/Devices/IdentityPoseDevice/IdentityPoseDevice.h" #include "SurgSim/Devices/MultiAxis/MultiAxisDevice.h" #include "SurgSim/Framework/Framework.h" #include "SurgSim/Graphics/Graphics.h" #include "SurgSim/Input/Input.h" #include "SurgSim/Math/Math.h" #include "SurgSim/Physics/Physics.h" using SurgSim::Devices::IdentityPoseDevice; using SurgSim::Devices::MultiAxisDevice; using SurgSim::Framework::BehaviorManager; using SurgSim::Framework::Runtime; using SurgSim::Framework::SceneElement; using SurgSim::Graphics::OsgManager; using SurgSim::Graphics::OsgView; using SurgSim::Graphics::OsgViewElement; using SurgSim::Input::InputManager; using SurgSim::Math::Vector3d; using SurgSim::Input::DeviceInterface; using SurgSim::Physics::PhysicsManager; template std::shared_ptr getComponentChecked(std::shared_ptr sceneElement, const std::string& name) { std::shared_ptr component = sceneElement->getComponent(name); SURGSIM_ASSERT(component != nullptr) << "Failed to get Component named '" << name << "'."; std::shared_ptr result = std::dynamic_pointer_cast(component); SURGSIM_ASSERT(result != nullptr) << "Failed to convert Component to requested type."; return result; } int main(int argc, char* argv[]) { const std::string deviceName = "MultiAxisDevice"; std::shared_ptr behaviorManager = std::make_shared(); std::shared_ptr graphicsManager = std::make_shared(); std::shared_ptr inputManager = std::make_shared(); std::shared_ptr physicsManager = std::make_shared(); std::shared_ptr runtime = std::make_shared("config.txt"); runtime->addManager(behaviorManager); runtime->addManager(graphicsManager); runtime->addManager(inputManager); runtime->addManager(physicsManager); std::shared_ptr device; device = std::make_shared(deviceName); if (!device->initialize()) { SURGSIM_LOG_WARNING(SurgSim::Framework::Logger::getDefaultLogger()) << "Could not initialize device " << device->getName() << " for the tool."; device = std::make_shared(deviceName); } inputManager->addDevice(device); runtime->loadScene("StaplingDemo.yaml"); std::shared_ptr view = runtime->getScene()->getSceneElement("StaplingDemoView"); auto osgView = std::dynamic_pointer_cast(view->getComponent("StaplingDemoView View")); SURGSIM_ASSERT(nullptr != osgView) << "No OsgView held by SceneElement StaplingDemoView."; inputManager->addDevice(osgView->getKeyboardDevice()); runtime->execute(); return 0; } opensurgsim-0.7.0/Examples/Stapling/StapleElement.cpp000066400000000000000000000047021277777236100227240ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "Examples/Stapling/StapleElement.h" #include "SurgSim/Framework/ApplicationData.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Graphics/Model.h" #include "SurgSim/Graphics/OsgSceneryRepresentation.h" #include "SurgSim/Math/MeshShape.h" #include "SurgSim/Physics/RigidCollisionRepresentation.h" #include "SurgSim/Physics/RigidRepresentation.h" using SurgSim::Graphics::SceneryRepresentation; using SurgSim::Graphics::OsgSceneryRepresentation; using SurgSim::Math::MeshShape; using SurgSim::Physics::RigidCollisionRepresentation; using SurgSim::Physics::RigidRepresentation; StapleElement::StapleElement(const std::string& name) : SurgSim::Framework::BasicSceneElement(name), m_hasCollisionRepresentation(true) { } void StapleElement::setHasCollisionRepresentation(bool flag) { m_hasCollisionRepresentation = flag; } bool StapleElement::doInitialize() { auto meshShape = std::make_shared(); const std::string file = "/Geometry/staple_collision.ply"; meshShape->load(file); auto physicsRepresentation = std::make_shared("Physics"); physicsRepresentation->setDensity(8050); // Stainless steel (in Kg.m-3) physicsRepresentation->setShape(meshShape); physicsRepresentation->setLinearDamping(1e-2); physicsRepresentation->setAngularDamping(1e-4); std::shared_ptr graphicsRepresentation = std::make_shared("Graphics"); graphicsRepresentation->loadModel("Geometry/staple.obj"); addComponent(physicsRepresentation); addComponent(graphicsRepresentation); if (m_hasCollisionRepresentation) { auto collisionRepresentation = std::make_shared("Collision"); physicsRepresentation->setCollisionRepresentation(collisionRepresentation); addComponent(collisionRepresentation); } return true; } opensurgsim-0.7.0/Examples/Stapling/StapleElement.h000066400000000000000000000027641277777236100223770ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef EXAMPLES_STAPLING_STAPLEELEMENT_H #define EXAMPLES_STAPLING_STAPLEELEMENT_H #include #include "SurgSim/Framework/BasicSceneElement.h" class StapleElement : public SurgSim::Framework::BasicSceneElement { public: /// Constructor /// \param name Name of the staple element. explicit StapleElement(const std::string& name); /// Specify whether the staple was created with a collision representation. /// \param flag Flag to specify whether the staple was created with a collision representation. void setHasCollisionRepresentation(bool flag); protected: /// Initialize this scene element /// \return True on success, otherwise false. bool doInitialize() override; private: /// Flag to specify if the stapleElement was created with a collision representation. bool m_hasCollisionRepresentation; }; #endif //EXAMPLES_STAPLING_STAPLEELEMENT_H opensurgsim-0.7.0/Examples/Stapling/StaplerBehavior.cpp000066400000000000000000000300701277777236100232510ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "Examples/Stapling/StaplerBehavior.h" #include #include "Examples/Stapling/StapleElement.h" #include "SurgSim/Collision/CollisionPair.h" #include "SurgSim/Collision/Representation.h" #include "SurgSim/DataStructures/DataStructuresConvert.h" #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Framework/Scene.h" #include "SurgSim/Framework/SceneElement.h" #include "SurgSim/Graphics/SceneryRepresentation.h" #include "SurgSim/Graphics/Model.h" #include "SurgSim/Math/MlcpConstraintType.h" #include "SurgSim/Input/InputComponent.h" #include "SurgSim/Physics/Constraint.h" #include "SurgSim/Physics/ConstraintComponent.h" #include "SurgSim/Physics/ConstraintImplementation.h" #include "SurgSim/Physics/DeformableCollisionRepresentation.h" #include "SurgSim/Physics/DeformableRepresentation.h" #include "SurgSim/Physics/Localization.h" #include "SurgSim/Physics/RigidCollisionRepresentation.h" #include "SurgSim/Physics/RigidConstraintFixedPoint.h" #include "SurgSim/Physics/RigidRepresentation.h" using SurgSim::Collision::ContactMapType; using SurgSim::Physics::ConstraintImplementation; using SurgSim::Physics::Localization; using SurgSim::Physics::RigidConstraintFixedPoint; using SurgSim::Framework::checkAndConvert; SURGSIM_REGISTER(SurgSim::Framework::Component, StaplerBehavior, StaplerBehavior); StaplerBehavior::StaplerBehavior(const std::string& name): SurgSim::Framework::Behavior(name), m_numElements(0), m_button1Index(-1), m_button1IndexCached(false), m_buttonPreviouslyPressed(false) { typedef std::array, 2> VirtualTeethArray; SURGSIM_ADD_SERIALIZABLE_PROPERTY(StaplerBehavior, std::shared_ptr, InputComponent, getInputComponent, setInputComponent); SURGSIM_ADD_SERIALIZABLE_PROPERTY(StaplerBehavior, std::shared_ptr, Representation, getRepresentation, setRepresentation); SURGSIM_ADD_SERIALIZABLE_PROPERTY(StaplerBehavior, VirtualTeethArray, VirtualTeeth, getVirtualTeeth, setVirtualTeeth); SURGSIM_ADD_SERIALIZABLE_PROPERTY(StaplerBehavior, std::list, StapleEnabledSceneElements, getStapleEnabledSceneElements, setStapleEnabledSceneElements); } void StaplerBehavior::setInputComponent(std::shared_ptr inputComponent) { SURGSIM_ASSERT(nullptr != inputComponent) << "'inputComponent' cannot be set to 'nullptr'"; m_from = checkAndConvert(inputComponent, "SurgSim::Input::InputComponent"); } std::shared_ptr StaplerBehavior::getInputComponent() { return m_from; } void StaplerBehavior::setRepresentation(std::shared_ptr staplerRepresentation) { SURGSIM_ASSERT(nullptr != staplerRepresentation) << "'staplerRepresentation' cannot be set to 'nullptr'"; m_representation = checkAndConvert( staplerRepresentation, "SurgSim::Framework::Representation"); } std::shared_ptr StaplerBehavior::getRepresentation() { return m_representation; } void StaplerBehavior::setVirtualTeeth( const std::array, 2>& virtualTeeth) { m_virtualTeeth = virtualTeeth; } const std::array, 2>& StaplerBehavior::getVirtualTeeth() { return m_virtualTeeth; } void StaplerBehavior::enableStaplingForSceneElement(const std::string& sceneElementName) { m_stapleEnabledSceneElements.push_back(sceneElementName); } void StaplerBehavior::setStapleEnabledSceneElements(const std::list& stapleEnabledSceneElements) { m_stapleEnabledSceneElements = stapleEnabledSceneElements; } const std::list& StaplerBehavior::getStapleEnabledSceneElements() { return m_stapleEnabledSceneElements; } void StaplerBehavior::filterCollisionMapForStapleEnabledRepresentations(ContactMapType* collisionsMap) { for (auto it = collisionsMap->begin(); it != collisionsMap->end();) { if (std::find(m_stapleEnabledSceneElements.begin(), m_stapleEnabledSceneElements.end(), (*it).first->getSceneElement()->getName()) == m_stapleEnabledSceneElements.end()) { // Representation's scene element is not in the m_stapleEnabledSceneElements. it = collisionsMap->erase(it); } else { ++it; } } } std::shared_ptr StaplerBehavior::findCorrespondingPhysicsRepresentation( std::shared_ptr collisionRepresentation) { std::shared_ptr physicsRepresentation = nullptr; // Check if the collisionRepresenation is for a Rigid body. std::shared_ptr rigidCollisionRepresentation = std::dynamic_pointer_cast(collisionRepresentation); if (rigidCollisionRepresentation != nullptr) { physicsRepresentation = rigidCollisionRepresentation->getRigidRepresentation(); } else { // Check if the collisionRepresenation is for a deformable body. std::shared_ptr deformableCollisionRepresentation = std::dynamic_pointer_cast(collisionRepresentation); if (deformableCollisionRepresentation != nullptr) { physicsRepresentation = deformableCollisionRepresentation->getDeformableRepresentation(); } } return physicsRepresentation; } void StaplerBehavior::filterCollisionMapForSupportedRepresentationTypes(ContactMapType* collisionsMap) { for (auto it = collisionsMap->begin(); it != collisionsMap->end();) { if (findCorrespondingPhysicsRepresentation((*it).first) == nullptr) { // Representation type is not supported to be stapled. it = collisionsMap->erase(it); } else { ++it; } } } void StaplerBehavior::createStaple() { // Create the staple (not added to the scene right now). auto staple = std::make_shared("staple_" + boost::to_string(m_numElements++)); staple->setPose(m_representation->getPose()); int toothId = 0; bool stapleAdded = false; for (auto virtualTooth = m_virtualTeeth.cbegin(); virtualTooth != m_virtualTeeth.cend(); ++virtualTooth) { // The virtual tooth could be in contact with any number of objects in the scene. // Get its collisionMap. ContactMapType collisionsMap = *((*virtualTooth)->getCollisions().safeGet()); // If the virtualTooth has no collision, continue to next loop iteration. if (collisionsMap.empty()) { continue; } // Remove representations from the collision map that are not enabled to be stapled. filterCollisionMapForStapleEnabledRepresentations(&collisionsMap); // If the collision map is emptied after filtering, continue to next loop iteration. if (collisionsMap.empty()) { continue; } // Filter the map based on supported Physics::Represention types. filterCollisionMapForSupportedRepresentationTypes(&collisionsMap); // If the collision map is emptied after filtering, continue to next loop iteration. if (collisionsMap.empty()) { continue; } // Find the row (representation, list of contacts) in the map that the virtualTooth has most // collision pairs with. ContactMapType::value_type targetRepresentationContacts = *std::max_element(collisionsMap.begin(), collisionsMap.end(), [](const ContactMapType::value_type & lhs, const ContactMapType::value_type & rhs) { return lhs.second.size() < rhs.second.size(); }); // Iterate through the list of collision pairs to find a contact with the deepest penetration. std::shared_ptr targetContact = *std::max_element(targetRepresentationContacts.second.begin(), targetRepresentationContacts.second.end(), [](const std::shared_ptr& lhs, const std::shared_ptr& rhs) { return lhs->depth < rhs->depth; }); // Create the staple, before creating the constraint with the staple. // The staple is created with no collision representation, because it is going to be constrained. if (!stapleAdded) { staple->setHasCollisionRepresentation(false); getScene()->addSceneElement(staple); // The gravity of the staple is disabled to prevent it from rotating about the line // connecting the two points of constraints on the staple. staple->getComponents()[0]->setIsGravityEnabled(false); stapleAdded = true; } // Find the corresponding Phsyics::Representation for the target Collision::Representation. // Note that the targetPhysicsRepresentation will NOT be a nullptr, because the // collisionsMap was filtered earlier to remove Representations that returned nullptr // when the function findCorrespondingPhysicsRepresentation was called. // (see filterCollisionMapForStapleEnabledRepresentations above). std::shared_ptr targetPhysicsRepresentation = findCorrespondingPhysicsRepresentation(targetRepresentationContacts.first); // The constraint is created at the contact point in targetContact->penetrationPoints.second. // Convert this location to stapleRepresentation. auto stapleRepresentation = staple->getComponents()[0]; SurgSim::DataStructures::Location stapleConstraintLocation(SurgSim::Math::Vector3d( stapleRepresentation->getPose().inverse() * targetPhysicsRepresentation->getPose() * targetContact->penetrationPoints.second.rigidLocalPosition.getValue())); // Create a bilateral constraint between the targetPhysicsRepresentation and the staple. auto constraint = std::make_shared(SurgSim::Physics::FIXED_3DPOINT, std::make_shared(), stapleRepresentation, stapleConstraintLocation, targetPhysicsRepresentation, targetContact->penetrationPoints.second); // Create a component to store this constraint. std::shared_ptr constraintComponent = std::make_shared( "FixedPointConstraint" + boost::to_string(toothId++)); constraintComponent->setConstraint(constraint); staple->addComponent(constraintComponent); } if (!stapleAdded) { // Create the staple element. staple->setHasCollisionRepresentation(true); getScene()->addSceneElement(staple); } } void StaplerBehavior::update(double dt) { SurgSim::DataStructures::DataGroup dataGroup; m_from->getData(&dataGroup); // Get the button1 index. if (!m_button1IndexCached) { m_button1Index = dataGroup.booleans().getIndex("button1"); m_button1IndexCached = true; } // Check if the stapler is being pressed. bool button1 = false; dataGroup.booleans().get(m_button1Index, &button1); if (button1 && !m_buttonPreviouslyPressed) { createStaple(); } m_buttonPreviouslyPressed = button1; } int StaplerBehavior::getTargetManagerType() const { return SurgSim::Framework::MANAGER_TYPE_PHYSICS; } bool StaplerBehavior::doInitialize() { SURGSIM_ASSERT(m_from) << "StaplerBehavior: no InputComponent held."; SURGSIM_ASSERT((m_virtualTeeth[0] != nullptr) && (m_virtualTeeth[1] != nullptr)) << "StaplerBehavior: setVirtualStaple was not called, " << "or it was passed nullptr for a Collision Representation."; return true; } bool StaplerBehavior::doWakeUp() { return true; } opensurgsim-0.7.0/Examples/Stapling/StaplerBehavior.h000066400000000000000000000140271277777236100227220ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef EXAMPLES_STAPLING_STAPLERBEHAVIOR_H #define EXAMPLES_STAPLING_STAPLERBEHAVIOR_H #include #include #include #include #include "SurgSim/Framework/Behavior.h" #include "SurgSim/Framework/ObjectFactory.h" #include "SurgSim/Collision/Representation.h" namespace SurgSim { namespace DataStructures { struct Location; } namespace Framework { class Representation; } namespace Graphics { class SceneryRepresentation; } namespace Input { class InputComponent; } namespace Physics { class Constraint; } } SURGSIM_STATIC_REGISTRATION(StaplerBehavior); /// This behavior is used to add staples. /// The stapler is controlled by an input device and when /// the user pushes a button on the device, a stapler will be deployed from the stapler. class StaplerBehavior: public SurgSim::Framework::Behavior { public: /// Constructor /// \param name Name of the behavior explicit StaplerBehavior(const std::string& name); SURGSIM_CLASSNAME(StaplerBehavior); /// Set the input component from which to get the pose /// \param inputComponent The input component which sends the pose. void setInputComponent(std::shared_ptr inputComponent); /// \return The input component which sends the pose. std::shared_ptr getInputComponent(); /// Set the representation of the stapler /// \param staplerRepresentation The representation of a stapler void setRepresentation(std::shared_ptr staplerRepresentation); /// \return The representation of a stapler std::shared_ptr getRepresentation(); /// Update the behavior /// \param dt The length of time (seconds) between update calls. void update(double dt) override; /// Return the type of manager that should be responsible for this behavior /// \return An integer indicating which manger should be responsible for this behavior. int getTargetManagerType() const override; /// Sets the virtual teeth for the virtual staple /// \param virtualTeeth Array of collision representations for the virtual stapler teeth. void setVirtualTeeth(const std::array, 2>& virtualTeeth); /// \return Array of collision representations for the virtual stapler teeth. const std::array, 2>& getVirtualTeeth(); /// Add a scene element (name) for which stapling is enabled within this behaviour. /// \param sceneElementName The name of the scene element that this behaviour can staple. void enableStaplingForSceneElement(const std::string& sceneElementName); /// Sets the list of scene element names that this behaviour can staple /// \param stapleEnabledSceneElements List of scene element names that this behaviour can staple. void setStapleEnabledSceneElements(const std::list& stapleEnabledSceneElements); /// \return List of scene element names that this behaviour can staple. const std::list& getStapleEnabledSceneElements(); protected: /// Initialize this behavior /// \return True on success, otherwise false. /// \note: In current implementation, this method always returns "true". bool doInitialize() override; /// Wakeup this behavior /// \return True on success, otherwise false. /// \note: In current implementation, this method always returns "true". bool doWakeUp() override; private: /// Given a collision map, remove entries whose representations are not part of /// enabled scene element lists. /// \param [in,out] collisionsMap The collision map to be filtered. void filterCollisionMapForStapleEnabledRepresentations(SurgSim::Collision::ContactMapType *collisionsMap); /// Given a Collision::Representation, get the corresponding Physics::Representation. /// \param collisionRepresentation shared_ptr to the collision representation. /// \return The shared_ptr of the Physics::Representation. Can be nullptr. std::shared_ptr findCorrespondingPhysicsRepresentation( std::shared_ptr collisionRepresentation); /// Given a collision map, remove entries whose representations are not supported to be stapled to. /// \param [in,out] collisionsMap The collision map to be filtered. void filterCollisionMapForSupportedRepresentationTypes(SurgSim::Collision::ContactMapType* collisionsMap); /// Function to create the staple element. /// \note This function also checks for collision with stapling enabled objects in the scene to create /// bilateral constraint between the staple element and the object. void createStaple(); /// Input component from which to get the pose. std::shared_ptr m_from; /// The representation of the stapler. std::shared_ptr m_representation; /// The number of staples added int m_numElements; /// The NamedData index for the button1. int m_button1Index; /// Flag for caching the the NamedData button1Index. bool m_button1IndexCached; /// Used to record if a button was previously pressed bool m_buttonPreviouslyPressed; /// Contains the teeth for detecting collisions std::array, 2> m_virtualTeeth; /// The list of scene element names that this behavior can staple. std::list m_stapleEnabledSceneElements; }; #endif // EXAMPLES_STAPLING_STAPLERBEHAVIOR_H opensurgsim-0.7.0/Examples/Stapling/Stapling.cpp000066400000000000000000000457621277777236100217560ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include "Examples/Stapling/StaplerBehavior.h" #include "SurgSim/Blocks/Blocks.h" #include "SurgSim/Collision/Collision.h" #include "SurgSim/DataStructures/DataStructures.h" #include "SurgSim/Devices/IdentityPoseDevice/IdentityPoseDevice.h" #include "SurgSim/Devices/Keyboard/KeyCode.h" #include "SurgSim/Devices/MultiAxis/MultiAxisDevice.h" #include "SurgSim/Framework/Framework.h" #include "SurgSim/Graphics/Graphics.h" #include "SurgSim/Input/Input.h" #include "SurgSim/Math/Math.h" #include "SurgSim/Physics/Physics.h" using SurgSim::Blocks::KeyboardTogglesComponentBehavior; using SurgSim::Blocks::TransferPhysicsToGraphicsMeshBehavior; using SurgSim::Blocks::VisualizeContactsBehavior; using SurgSim::Collision::ShapeCollisionRepresentation; using SurgSim::Devices::IdentityPoseDevice; using SurgSim::Devices::MultiAxisDevice; using SurgSim::Framework::BasicSceneElement; using SurgSim::Framework::BehaviorManager; using SurgSim::Framework::Runtime; using SurgSim::Framework::Scene; using SurgSim::Framework::SceneElement; using SurgSim::Graphics::MeshRepresentation; using SurgSim::Graphics::SceneryRepresentation; using SurgSim::Graphics::OsgManager; using SurgSim::Graphics::OsgMeshRepresentation; using SurgSim::Graphics::OsgViewElement; using SurgSim::Graphics::OsgSceneryRepresentation; using SurgSim::Math::MeshShape; using SurgSim::Math::makeRigidTransform; using SurgSim::Math::makeRotationMatrix; using SurgSim::Math::Quaterniond; using SurgSim::Math::RigidTransform3d; using SurgSim::Math::Vector3d; using SurgSim::Math::Vector4d; using SurgSim::Math::Vector4f; using SurgSim::Input::DeviceInterface; using SurgSim::Input::InputComponent; using SurgSim::Input::InputManager; using SurgSim::Physics::DeformableCollisionRepresentation; using SurgSim::Physics::Fem3DRepresentation; using SurgSim::Physics::FixedRepresentation; using SurgSim::Physics::PhysicsManager; using SurgSim::Physics::RigidCollisionRepresentation; using SurgSim::Physics::RigidRepresentation; using SurgSim::Physics::VirtualToolCoupler; static std::shared_ptr createFemSceneElement( const std::string& name, const std::string& filename, SurgSim::Math::IntegrationScheme integrationScheme, SurgSim::Math::LinearSolver linearSolver, std::shared_ptr material) { // Create a SceneElement that bundles the pieces associated with the finite element model std::shared_ptr sceneElement = std::make_shared(name); // Load the tetrahedral mesh. std::shared_ptr physicsRepresentation = std::make_shared("Physics"); physicsRepresentation->loadFem(filename); physicsRepresentation->setIntegrationScheme(integrationScheme); physicsRepresentation->setLinearSolver(linearSolver); sceneElement->addComponent(physicsRepresentation); // Load the surface triangle mesh of the finite element model auto meshShape = std::make_shared(); meshShape->load(filename); // Create a triangle mesh for visualizing the surface of the finite element model auto graphicalFem = std::make_shared("Graphics"); graphicalFem->loadMesh(filename); sceneElement->addComponent(graphicalFem); // Create material to transport the Textures graphicalFem->setMaterial(material); sceneElement->addComponent(material); // Create the collision mesh for the surface of the finite element model auto collisionRepresentation = std::make_shared("Collision"); collisionRepresentation->setShape(meshShape); physicsRepresentation->setCollisionRepresentation(collisionRepresentation); sceneElement->addComponent(collisionRepresentation); // Create a behavior which transfers the position of the vertices in the FEM to locations in the triangle mesh auto physicsToGraphicalFem = std::make_shared("PhysicsToGraphicalFem"); physicsToGraphicalFem->setSource(physicsRepresentation); physicsToGraphicalFem->setTarget(graphicalFem); sceneElement->addComponent(physicsToGraphicalFem); // WireFrame of the finite element model std::shared_ptr wireFrameFem = std::make_shared("Wire Frame"); wireFrameFem->setShape(meshShape); wireFrameFem->setDrawAsWireFrame(true); wireFrameFem->setLocalActive(false); sceneElement->addComponent(wireFrameFem); // Behavior transfers the position of the physics representation to wire frame representation of the fem. auto physicsToWireFrameFem = std::make_shared("PhysicsToWireFrameFem"); physicsToWireFrameFem->setSource(physicsRepresentation); physicsToWireFrameFem->setTarget(wireFrameFem); sceneElement->addComponent(physicsToWireFrameFem); return sceneElement; } /// Load scenery object from file /// \param name Name of this scenery representation. /// \param fileName Name of the file from which the scenery representation will be loaded. /// \return A scenery representation. std::shared_ptr createSceneryObject(const std::string& name, const std::string& fileName) { std::shared_ptr sceneryRepresentation = std::make_shared(name); sceneryRepresentation->loadModel(fileName); return sceneryRepresentation; } std::shared_ptr createStaplerSceneElement(const std::string& staplerName, const std::string& deviceName) { const std::string filename = std::string("Geometry/stapler_collision.ply"); // Stapler collision mesh auto meshShapeForCollision = std::make_shared(); meshShapeForCollision->load(filename); std::shared_ptr meshShapeVisualization = std::make_shared("Collision Mesh"); meshShapeVisualization->setShape(meshShapeForCollision); meshShapeVisualization->setDrawAsWireFrame(true); meshShapeVisualization->setLocalActive(false); std::shared_ptr physicsRepresentation = std::make_shared("Physics"); physicsRepresentation->setIsGravityEnabled(false); physicsRepresentation->setDensity(8050); // Stainless steel (in Kg.m-3) physicsRepresentation->setShape(meshShapeForCollision); std::shared_ptr collisionRepresentation = std::make_shared("Collision"); physicsRepresentation->setCollisionRepresentation(collisionRepresentation); std::shared_ptr inputComponent = std::make_shared("InputComponent"); inputComponent->setDeviceName(deviceName); std::shared_ptr inputVTC = std::make_shared("VTC"); inputVTC->setInput(inputComponent); inputVTC->setRepresentation(physicsRepresentation); inputVTC->overrideAttachmentPoint(Vector3d::Zero()); inputVTC->setCalculateInertialTorques(false); // A stapler behavior controls the release of stale when a button is pushed on the device. // Also, it is aware of collisions of the stapler. std::shared_ptr staplerBehavior = std::make_shared("Behavior"); staplerBehavior->setInputComponent(inputComponent); staplerBehavior->setRepresentation(physicsRepresentation); staplerBehavior->enableStaplingForSceneElement("wound"); std::shared_ptr visualizeContactsBehavior = std::make_shared("Contacts"); visualizeContactsBehavior->setSource(collisionRepresentation); // Note: Since usually the penetration depth of a collision is so small (at the magnitude of mm), // if we use the depth as the length of vector, the vector field will be too small to be seen on the screen. // Thus, we enlarge the vector field by 200 times. visualizeContactsBehavior->setVectorFieldScale(200); visualizeContactsBehavior->setLocalActive(false); std::shared_ptr sceneElement = std::make_shared(staplerName); sceneElement->addComponent(physicsRepresentation); sceneElement->addComponent(collisionRepresentation); sceneElement->addComponent(meshShapeVisualization); sceneElement->addComponent(inputComponent); sceneElement->addComponent(inputVTC); sceneElement->addComponent(staplerBehavior); sceneElement->addComponent(visualizeContactsBehavior); // Load the graphical parts of a stapler. sceneElement->addComponent(createSceneryObject("Handle", "Geometry/stapler_handle.obj")); sceneElement->addComponent(createSceneryObject("Indicator", "Geometry/stapler_indicator.obj")); sceneElement->addComponent(createSceneryObject("Markings", "Geometry/stapler_markings.obj")); sceneElement->addComponent(createSceneryObject("Trigger", "Geometry/stapler_trigger.obj")); auto meshShapeForVirtualStaple1 = std::make_shared(); auto meshShapeForVirtualStaple2 = std::make_shared(); meshShapeForVirtualStaple1->load("Geometry/virtual_staple_1.ply"); meshShapeForVirtualStaple2->load("Geometry/virtual_staple_2.ply"); std::vector> virtualTeethShapes; virtualTeethShapes.push_back(meshShapeForVirtualStaple1); virtualTeethShapes.push_back(meshShapeForVirtualStaple2); int i = 0; std::array, 2> virtualTeeth; for (auto it = std::begin(virtualTeethShapes); it != std::end(virtualTeethShapes); ++it, ++i) { std::shared_ptr virtualToothCollision = std::make_shared("VirtualToothCollision" + std::to_string(i)); virtualToothCollision->setShape(*it); virtualToothCollision->setLocalPose(RigidTransform3d::Identity()); virtualToothCollision->ignore(collisionRepresentation); virtualTeeth[i] = virtualToothCollision; sceneElement->addComponent(virtualToothCollision); } staplerBehavior->setVirtualTeeth(virtualTeeth); return sceneElement; } std::shared_ptr createArmSceneElement( const std::string& armName, std::shared_ptr material) { const std::string filename = std::string("Geometry/arm_collision.ply"); // Graphic representation for arm std::shared_ptr forearmSceneryRepresentation = createSceneryObject("Forearm", "Geometry/forearm.osgb"); forearmSceneryRepresentation->setMaterial(material); std::shared_ptr upperarmSceneryRepresentation = createSceneryObject("Upperarm", "Geometry/upperarm.osgb"); upperarmSceneryRepresentation->setMaterial(material); // Arm collision mesh std::shared_ptr meshShape = std::make_shared(); meshShape->load(filename); // Visualization of arm collision mesh std::shared_ptr meshShapeVisualization = std::make_shared("Collision Mesh"); meshShapeVisualization->setShape(meshShape); meshShapeVisualization->setDrawAsWireFrame(true); meshShapeVisualization->setLocalActive(false); std::shared_ptr physicsRepresentation = std::make_shared("Physics"); physicsRepresentation->setShape(meshShape); std::shared_ptr collisionRepresentation = std::make_shared("Collision"); collisionRepresentation->ignore("wound/Collision"); physicsRepresentation->setCollisionRepresentation(collisionRepresentation); std::shared_ptr armSceneElement = std::make_shared(armName); armSceneElement->addComponent(forearmSceneryRepresentation); armSceneElement->addComponent(meshShapeVisualization); armSceneElement->addComponent(upperarmSceneryRepresentation); armSceneElement->addComponent(collisionRepresentation); armSceneElement->addComponent(physicsRepresentation); armSceneElement->addComponent(material); return armSceneElement; } std::shared_ptr createViewElement() { auto result = std::make_shared("StaplingDemoView"); result->enableManipulator(true); result->setManipulatorParameters(Vector3d(0.0, 0.5, 0.5), Vector3d::Zero()); result->enableKeyboardDevice(true); auto light = std::make_shared("Light"); light->setDiffuseColor(Vector4d(1.0, 1.0, 1.0, 1.0)); light->setSpecularColor(Vector4d(1.0, 1.0, 1.0, 1.0)); result->addComponent(light); result->getCamera()->setAmbientColor(Vector4d(0.2, 0.2, 0.2, 1.0)); return result; } std::shared_ptr createShinyMaterial( const SurgSim::Framework::ApplicationData& data, std::shared_ptr program, std::string defaultTextureName = "Textures/checkered.png") { // Default Material with shader // using scopes to keep from having to introduce new variables with different types auto material = std::make_shared("shiny"); material->setProgram(program); { auto uniform = std::make_shared>("diffuseColor"); material->addUniform(uniform); material->setValue("diffuseColor", SurgSim::Math::Vector4f(1.0, 1.0, 1.0, 1.0)); } { auto uniform = std::make_shared>("specularColor"); material->addUniform(uniform); material->setValue("specularColor", SurgSim::Math::Vector4f(0.01, 0.01, 0.01, 1.0)); } { auto uniform = std::make_shared>("shininess"); material->addUniform(uniform); material->setValue("shininess", 32.0f); } std::string blackTexture; SURGSIM_ASSERT(data.tryFindFile("Textures/black.png", &blackTexture)); std::string defaultTexture; SURGSIM_ASSERT(data.tryFindFile(defaultTextureName, &defaultTexture)); { // As a default color for the texture map use white auto texture = std::make_shared(); texture->loadImage(defaultTexture); auto uniform = std::make_shared>("diffuseMap"); uniform->set(texture); material->addUniform(uniform); } { // The neutral color for the shadow map is black auto texture = std::make_shared(); texture->loadImage(blackTexture); auto uniform = std::make_shared>("shadowMap"); uniform->set(texture); uniform->setMinimumTextureUnit(8); material->addUniform(uniform); } return material; } int main(int argc, char* argv[]) { const std::string deviceName = "MultiAxisDevice"; std::shared_ptr behaviorManager = std::make_shared(); std::shared_ptr graphicsManager = std::make_shared(); std::shared_ptr inputManager = std::make_shared(); std::shared_ptr physicsManager = std::make_shared(); physicsManager->setRate(100.0); std::shared_ptr runtime = std::make_shared("config.txt"); runtime->addManager(behaviorManager); runtime->addManager(graphicsManager); runtime->addManager(inputManager); runtime->addManager(physicsManager); std::shared_ptr device; device = std::make_shared(deviceName); if (!device->initialize()) { SURGSIM_LOG_WARNING(SurgSim::Framework::Logger::getDefaultLogger()) << "Could not initialize device " << device->getName() << " for the tool."; device = std::make_shared(deviceName); } inputManager->addDevice(device); std::shared_ptr view = createViewElement(); inputManager->addDevice(view->getKeyboardDevice()); // Shader should be shared between all materials using the same shader auto shader = SurgSim::Graphics::loadProgram(*runtime->getApplicationData(), "Shaders/ds_mapping_material"); SURGSIM_ASSERT(shader != nullptr) << "Shader could not be loaded."; RigidTransform3d armPose = makeRigidTransform(Quaterniond::Identity(), Vector3d(0.0, -0.2, 0.0)); auto material = createShinyMaterial(*runtime->getApplicationData(), shader); std::shared_ptr arm = createArmSceneElement("arm", material); arm->setPose(armPose); std::shared_ptr stapler = createStaplerSceneElement("stapler", deviceName); stapler->setPose(RigidTransform3d::Identity()); std::string woundFilename = std::string("Geometry/wound_deformable.ply"); // Mechanical properties are based on Liang and Boppart, "Biomechanical Properties of In Vivo Human Skin From // Dynamic Optical Coherence Elastography", IEEE Transactions on Biomedical Engineering, Vol 57, No 4. // Material for the wound material = createShinyMaterial(*runtime->getApplicationData(), shader, "Geometry/wound.png"); std::shared_ptr wound = createFemSceneElement("wound", woundFilename, SurgSim::Math::INTEGRATIONSCHEME_LINEAR_EULER_IMPLICIT, SurgSim::Math::LINEARSOLVER_LU, material); wound->setPose(armPose); std::shared_ptr keyboardComponent = std::make_shared("KeyboardInputComponent"); keyboardComponent->setDeviceName("Keyboard"); // Name of device is case sensitive. std::shared_ptr keyboardBehavior = std::make_shared("KeyboardBehavior"); keyboardBehavior->setInputComponent(keyboardComponent); using SurgSim::Devices::KeyCode; keyboardBehavior->registerKey(KeyCode::KEY_A, stapler->getComponent("Handle")); keyboardBehavior->registerKey(KeyCode::KEY_A, stapler->getComponent("Indicator")); keyboardBehavior->registerKey(KeyCode::KEY_A, stapler->getComponent("Markings")); keyboardBehavior->registerKey(KeyCode::KEY_A, stapler->getComponent("Trigger")); keyboardBehavior->registerKey(KeyCode::KEY_B, stapler->getComponent("Contacts")); keyboardBehavior->registerKey(KeyCode::KEY_C, stapler->getComponent("Collision Mesh")); keyboardBehavior->registerKey(KeyCode::KEY_D, arm->getComponent("Forearm")); keyboardBehavior->registerKey(KeyCode::KEY_D, arm->getComponent("Upperarm")); keyboardBehavior->registerKey(KeyCode::KEY_E, arm->getComponent("Collision Mesh")); keyboardBehavior->registerKey(KeyCode::KEY_F, wound->getComponent("Graphics")); keyboardBehavior->registerKey(KeyCode::KEY_G, wound->getComponent("Wire Frame")); std::shared_ptr keyboard = std::make_shared("SceneElement"); keyboard->addComponent(keyboardComponent); keyboard->addComponent(keyboardBehavior); std::shared_ptr scene = runtime->getScene(); scene->addSceneElement(view); scene->addSceneElement(arm); scene->addSceneElement(stapler); scene->addSceneElement(wound); scene->addSceneElement(keyboard); runtime->execute(); return 0; } opensurgsim-0.7.0/Examples/Stapling/config.txt.in000066400000000000000000000000761277777236100220710ustar00rootroot00000000000000${CMAKE_CURRENT_BINARY_DIR}/Data/ ${SURGSIM_SOURCE_DIR}/Data/opensurgsim-0.7.0/LICENSE000066400000000000000000000261361277777236100151310ustar00rootroot00000000000000 Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. opensurgsim-0.7.0/Modules/000077500000000000000000000000001277777236100155245ustar00rootroot00000000000000opensurgsim-0.7.0/Modules/CMakeLists.txt000066400000000000000000000021531277777236100202650ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2012-2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. include_directories(${CMAKE_CURRENT_SOURCE_DIR}) file(GLOB MODULES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/*) foreach(MODULE ${MODULES}) if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${MODULE}/CMakeLists.txt) string(TOUPPER ${MODULE} MODULE_UPPER_CASE) option(BUILD_MODULE_${MODULE_UPPER_CASE} "Build ${MODULE} module." OFF) if(BUILD_MODULE_${MODULE_UPPER_CASE}) add_subdirectory(${MODULE}) endif(BUILD_MODULE_${MODULE_UPPER_CASE}) endif() endforeach() opensurgsim-0.7.0/Modules/README000066400000000000000000000004231277777236100164030ustar00rootroot00000000000000Modules Directory The Modules directory is a place to put extensions to OpenSurgSim. For all subdirectories that contain a CMakeLists.txt file, a BUILD_MODULE_ cmake option will be added. If this option is turned on, the module will be added to OpenSurgSim. opensurgsim-0.7.0/NOTICE000066400000000000000000000111431277777236100150200ustar00rootroot00000000000000OpenSurgSim simulation framework Copyright 2012-2016, SimQuest Solutions Inc. This product includes software developed by SimQuest Solutions Inc. (http://www.simquest.com/). The calculations of various physical properties from an arbitrary surface mesh, implemented in the MeshShape class, are based on research and a public-domain implementation by Brian Mirtich. (http://www.cs.berkeley.edu/~jfc/mirtich/massProps.html) This product uses software developed by The MathJax Consortium and licensed under the Apache License, Version 2.0. The OpenSurgSim documentation displays equations using MathJax (http://www.mathjax.org/), which is an open-source JavaScript display engine for LaTeX, MathML, and AsciiMath notation. ------------------------------------------------------------ Contains code based on Boost Threads Copyright (C) 2002-2003 David Moore, William E. Kempf Copyright (C) 2007-8 Anthony Williams which is subject to the following license: Boost Software License - Version 1.0 - August 17th, 2003 Permission is hereby granted, free of charge, to any person or organization obtaining a copy of the software and accompanying documentation covered by this license (the "Software") to use, reproduce, display, distribute, execute, and transmit the Software, and to prepare derivative works of the Software, and to permit third-parties to whom the Software is furnished to do so, all subject to the following: The copyright notices in the Software and this entire statement, including the above license grant, this restriction and the following disclaimer, must be included in all copies of the Software, in whole or in part, and all derivative works of the Software, unless such copies or derivative works are solely in the form of machine-executable object code generated by a source language processor. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ------------------------------------------------------------ Copyright Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license (“Fontsâ€) and associated documentation files (the “Font Softwareâ€), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words “Bitstream†or the word “Veraâ€. This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the “Bitstream Vera†names. The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. Except as contained in this notice, the names of Gnome, the Gnome Foundation, and Bitstream Inc., shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from the Gnome Foundation or Bitstream Inc., respectively. For further information, contact: fonts at gnome dot org. opensurgsim-0.7.0/README.md000066400000000000000000000121211277777236100153700ustar00rootroot00000000000000Welcome to the OpenSurgSim Project OpenSurgSim is an open-source project dedicated to real-time surgical simulation. It offers an open framework that includes the necessary building blocks for surgical simulations, such as native device support, haptic feedback, graphics, discrete collision detection and physics simulation. OpenSurgSim is flexible. Developers can refactor the physics engine, swap models, ODE solvers, or linear system solvers. For current information and documentation about the project, please visit our website: http://www.opensurgsim.org/ Support can also be found on our public mailing list at opensurgsim@simquest.com. An archive of the mailing list is at: http://groups.google.com/a/simquest.com/group/opensurgsim/ To help get started using OpenSurgSim, use the following quick start guide: 1. Getting OpenSurgSim 2. Compiling on GNU/Linux 3. Compiling on Microsoft Windows Appendix: Dependencies 1. Getting OpenSurgSim ====================== OpenSurgSim uses Git for source control, and this is the easiest way to obtain the most up to date version. Resources for installing and using Git can be found on Git's website (See Appendix). To obtain OpenSurgSim, run the following command: git clone git://git.assembla.com/OpenSurgSim.git This will download the source code for OpenSurgSim and place it in the OpenSurgSim directory. 2. Compiling on GNU/Linux ========================= OpenSurgSim has been tested extensively on Debian Unstable (Sid). If you are using another GNU/Linux distribution, please check your package management system for the dependencies (see Appendix). For Debian/Ubuntu based systems, the dependencies are easily installed through apt-get: sudo apt-get install libboost-all-dev cmake doxygen libeigen3-dev sudo apt-get install google-mock libjs-mathjax libopenscenegraph-dev sudo apt-get install libyaml-cpp-dev To build OpenSurgSim, issue the following commands from the same directory used to obtain OpenSurgSim (see Section 1) mkdir OpenSurgSim/Build cd OpenSurgSim/Build cmake ../ make That's it! 3. Compiling on Microsoft Windows ================================= OpenSurgSim has been developed and tested on Microsoft Windows 7, however, other versions of Windows are likely to work. At least Microsoft Visual Studio 2012 is required to build OpenSurgSim. First obtain the source code (Section 1), and install the required dependencies (Appendix). In addition, the following environment variables will help CMake automatically find the dependencies, especially if they are not installed to the default locations. BOOST_ROOT EIGEN_DIR OSG_ROOT Also, add %OSG_ROOT%/bin to your PATH environment variable. Generating the Visual Studio solution file is done with the CMake graphical user interface. Open CMake, and enter the OpenSurgSim folder (from Section 1) into the "Where is the source code" field. Then enter a new directory into the "Where to build the binaries" field. This folder is referred to as BUILD folder for the purpose of the following steps. Next, click on the 'Configure' button. This will allow you to select the compiler (Visual Studio 11 for Visual Studio 2012). If CMake reports “library not foundâ€, it is likely that your system variables BOOST_ROOT, EIGEN_DIR or OSG_ROOT are incorrect. Once the configuration is complete without error, click on the 'Generate' button. Finally, go to the BUILD folder, open the OpenSurgSim solution file, and build the ALL_BUILD project. Appendix: Dependencies ====================== To compile OpenSurgSim, you will need the following dependencies. Many GNU/Linux distributions already provide this software in their software repositories. If not, or using Microsoft Windows, please refer to the installation instructions found on each dependency's homepage. When we know of reliable pre-built Windows packages we will refer to them. Required Dependencies --------------------- **Boost**
Homepage: http://www.boost.org/
Modules: chrono, date_time, filesystem, program_options, system, thread
Minimum Version: 1.54
Windows Binaries: http://sourceforge.net/projects/boost/files/boost-binaries/ **CMake**
Homepage: http://www.cmake.org/
Minimum Version: 2.8 **Eigen**
Homepage: http://eigen.tuxfamily.org/
Minimum Version: 3.2.1 (GNU/Linux)
Minimum Version: 3.2.3 (Windows) **Git**
Homepage: http://www.git-scm.com/
Minimum Version: 1.7.9 **OpenSceneGraph**
Homepage: http://www.openscenegraph.org/
Modules: osg, osgViewer, osgText, osgUtil, osgDB, osgGA, osgAnimation
Minimum Version: 3.2.0 **yaml-cpp**
Homepage: https://github.com/jbeder/yaml-cpp
Minimum Version: 0.5.2 Optional Dependencies --------------------- **Doxygen**
Homepage: http://doxygen.org/
Minimum Version: 1.8 **FreeGlut**
Homepage: http://freeglut.sourceforge.net/
Minimum Version: 2.6.0 **Google Mock**
Homepage: https://code.google.com/p/googlemock/
Minimum Version: 1.7.0 **MathJax**
Homepage: http://www.mathjax.org/
Minimum Version: 2.4 opensurgsim-0.7.0/SurgSim/000077500000000000000000000000001277777236100155055ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Blocks/000077500000000000000000000000001277777236100167225ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Blocks/CMakeLists.txt000066400000000000000000000047311277777236100214670ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2012-2016, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. include_directories( ${OPENTHREADS_INCLUDE_DIR} ) set(SURGSIM_BLOCKS_SOURCES CompoundShapeToGraphics.cpp DebugDumpBehavior.cpp DriveElementFromInputBehavior.cpp FunctionBehavior.cpp GraphicsUtilities.cpp ImplicitSurface.cpp KeyBehavior.cpp KeyboardCallbackBehavior.cpp KeyboardTogglesComponentBehavior.cpp MassSpring1DRepresentation.cpp MassSpring2DRepresentation.cpp MassSpring3DRepresentation.cpp MassSpringNDRepresentationUtils.cpp PoseInterpolator.cpp ShadowMapping.cpp SingleKeyBehavior.cpp SphereElement.cpp TransferParticlesToPointCloudBehavior.cpp TransferPhysicsToGraphicsMeshBehavior.cpp TransferPhysicsToPointCloudBehavior.cpp TransferPhysicsToVerticesBehavior.cpp VisualizeConstraints.cpp VisualizeContactsBehavior.cpp ) set(SURGSIM_BLOCKS_HEADERS CompoundShapeToGraphics.h DebugDumpBehavior.h DriveElementFromInputBehavior.h FunctionBehavior.h GraphicsUtilities.h ImplicitSurface.h KeyBehavior.h KeyboardCallbackBehavior.h KeyboardTogglesComponentBehavior.h MassSpring1DRepresentation.h MassSpring2DRepresentation.h MassSpring3DRepresentation.h MassSpringNDRepresentationUtils.h PoseInterpolator.h ShadowMapping.h SingleKeyBehavior.h SphereElement.h TransferParticlesToPointCloudBehavior.h TransferPhysicsToGraphicsMeshBehavior.h TransferPhysicsToPointCloudBehavior.h TransferPhysicsToVerticesBehavior.h VisualizeConstraints.h VisualizeContactsBehavior.h ) surgsim_create_library_header(Blocks.h "${SURGSIM_BLOCKS_HEADERS}") surgsim_add_library( SurgSimBlocks "${SURGSIM_BLOCKS_SOURCES}" "${SURGSIM_BLOCKS_HEADERS}" ) SET(LIBS SurgSimFramework SurgSimParticles SurgSimPhysics ${Boost_LIBRARIES} ) target_link_libraries(SurgSimBlocks ${LIBS} ) if(BUILD_TESTING) add_subdirectory(UnitTests) endif() # Put SurgSimBlocks into folder "Blocks" set_target_properties(SurgSimBlocks PROPERTIES FOLDER "Blocks") opensurgsim-0.7.0/SurgSim/Blocks/CompoundShapeToGraphics.cpp000066400000000000000000000113631277777236100241630ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015dd, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Blocks/CompoundShapeToGraphics.h" #include "SurgSim/Collision/Representation.h" #include "SurgSim/Framework/Component.h" #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Graphics/Representation.h" #include "SurgSim/Math/CompoundShape.h" #include "SurgSim/Math/MathConvert.h" #include "SurgSim/Physics/Representation.h" namespace SurgSim { namespace Blocks { SURGSIM_REGISTER(SurgSim::Framework::Component, SurgSim::Blocks::CompoundShapeToGraphics, CompoundShapeToGraphics); CompoundShapeToGraphics::CompoundShapeToGraphics(const std::string& name) : Framework::Behavior(name) { { typedef std::vector> ParamType; SURGSIM_ADD_SERIALIZABLE_PROPERTY(CompoundShapeToGraphics, ParamType, Targets, getTargets, setTargets); } SURGSIM_ADD_SERIALIZABLE_PROPERTY(CompoundShapeToGraphics, std::shared_ptr, Source, getSource, setSource); SURGSIM_ADD_SERIALIZABLE_PROPERTY(CompoundShapeToGraphics, std::shared_ptr, Shape, getShape, setShape); } CompoundShapeToGraphics::~CompoundShapeToGraphics() { } void CompoundShapeToGraphics::update(double dt) { size_t i = 0; SURGSIM_ASSERT(m_shape->getNumShapes() >= m_representations.size()) << "Not enough shapes for the representations."; for (const auto& representation : m_representations) { representation->setLocalPose(m_shape->getPose(i++)); } } int CompoundShapeToGraphics::getTargetManagerType() const { return Framework::MANAGER_TYPE_GRAPHICS; } bool CompoundShapeToGraphics::doInitialize() { return true; } bool CompoundShapeToGraphics::doWakeUp() { if (m_source != nullptr) { std::shared_ptr shape; m_source->getValue>("Shape", &shape); SURGSIM_ASSERT(shape != nullptr) << "Source " << m_source->getFullName() << " does not contain a shape."; SURGSIM_ASSERT(shape->getType() == Math::SHAPE_TYPE_COMPOUNDSHAPE) << "Source : " << m_source->getFullName() << "Does not contain a compound shape."; m_shape = std::dynamic_pointer_cast(shape); } return true; } void CompoundShapeToGraphics::setShape(const std::shared_ptr& shape) { SURGSIM_ASSERT(m_source == nullptr) << "Can't assign the shape and the source at the same time."; SURGSIM_ASSERT(shape != nullptr) << "Shape should not be nullptr."; auto compoundShape = std::dynamic_pointer_cast(shape); SURGSIM_ASSERT(compoundShape != nullptr) << "'shape' is not a SurgSim::Math::CompoundShape."; m_shape = compoundShape; m_source = nullptr; } void CompoundShapeToGraphics::setSource(const std::shared_ptr& component) { SURGSIM_ASSERT(m_shape == nullptr) << "Can't assign the shape and the source at the same time."; SURGSIM_ASSERT(component != nullptr) << "Source should not be nullptr."; SURGSIM_ASSERT(component->isReadable("Shape")) << "Source: " << component->getFullName() << "Does not contain a shape."; m_source = component; } void CompoundShapeToGraphics::setTargets(const std::vector> components) { m_representations.clear(); for (const auto& c : components) { addTarget(c); } } void CompoundShapeToGraphics::addTarget(const std::shared_ptr& component) { auto graphics = Framework::checkAndConvert(component, "SurgSim::Graphics::Representation"); SURGSIM_ASSERT(graphics != nullptr) << "Component " << component->getFullName() << " not a graphics representation, could not add."; m_representations.push_back(std::move(graphics)); } std::vector> CompoundShapeToGraphics::getTargets() const { std::vector> result; std::copy(m_representations.cbegin(), m_representations.cend(), std::back_inserter(result)); return result; } std::shared_ptr CompoundShapeToGraphics::getShape() const { return m_shape; } std::shared_ptr CompoundShapeToGraphics::getSource() const { return m_source; } } }opensurgsim-0.7.0/SurgSim/Blocks/CompoundShapeToGraphics.h000066400000000000000000000072721277777236100236340ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_BLOCKS_COMPOUNDSHAPETOGRAPHICS_H #define SURGSIM_BLOCKS_COMPOUNDSHAPETOGRAPHICS_H #include #include #include #include "SurgSim/Framework/Behavior.h" namespace SurgSim { namespace Graphics { class Representation; } namespace Framework { class Component; class Representation; } namespace Math { class CompoundShape; class Shape; } namespace Blocks { SURGSIM_STATIC_REGISTRATION(CompoundShapeToGraphics); /// Keep a set of Graphics representations in sync with a CompoundShape, the shape can either be set directly or /// pulled from a Physics or Collision Representation. The graphics pieces will be set to coincide with the appropriate /// pieces of the compound shape in order. class CompoundShapeToGraphics : public Framework::Behavior { public: /// Constructor explicit CompoundShapeToGraphics(const std::string& name); SURGSIM_CLASSNAME(SurgSim::Blocks::CompoundShapeToGraphics); /// Destructor ~CompoundShapeToGraphics(); void update(double dt) override; int getTargetManagerType() const override; bool doInitialize() override; bool doWakeUp() override; /// Sets the shape to be used for synchronization /// \param shape The shape to be used void setShape(const std::shared_ptr& shape); /// Sets the source component, the components needs to provide a shape and that shape needs to be a compound shape /// \param component The component to be used as a shape source /// \throws SurgSim::AssertionFailure if the component does not meet the requirements void setSource(const std::shared_ptr& component); /// Sets the graphics targets to be used, each target will be update with the pose of the corresponding sub shape /// in the compound shape. The components need to be graphics representations /// \param components The list of graphics representations to be used as targets /// \throws SurgSim::AssertionFailure if one of the components is not a graphics representation void setTargets(const std::vector> components); /// Adds a single target to the list of targets, the target needs to be a graphics representation /// \param component Graphics Representation to be added at the end of the list /// \throws SurgSim::AssertionFailure if the component is not a graphics representation void addTarget(const std::shared_ptr& component); /// \return the registered graphics targets std::vector> getTargets() const; /// \return the shape that is being used, if set, nullptr otherwise std::shared_ptr getShape() const; /// \return the component that is the source, if set, nullptr otherwise std::shared_ptr getSource() const; private: /// Source shape used for updating std::shared_ptr m_shape; /// Source representation if known std::shared_ptr m_source; /// List of graphics targets for updating std::vector> m_representations; }; } } #endif opensurgsim-0.7.0/SurgSim/Blocks/DebugDumpBehavior.cpp000066400000000000000000000104701277777236100227640ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Blocks/DebugDumpBehavior.h" #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/Devices/Keyboard/KeyCode.h" #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Framework/Scene.h" #include "SurgSim/Framework/SceneElement.h" #include "SurgSim/Graphics/OsgManager.h" #include "SurgSim/Graphics/Representation.h" #include "SurgSim/Input/InputComponent.h" namespace SurgSim { namespace Blocks { SURGSIM_REGISTER(SurgSim::Framework::Component, SurgSim::Blocks::DebugDumpBehavior, DebugDumpBehavior); DebugDumpBehavior::DebugDumpBehavior(const std::string& name) : Framework::Behavior(name), m_keyPressedLastUpdate(false) { SURGSIM_ADD_SERIALIZABLE_PROPERTY(DebugDumpBehavior, std::shared_ptr, InputComponent, getInputComponent, setInputComponent); } DebugDumpBehavior::~DebugDumpBehavior() { } void DebugDumpBehavior::setInputComponent(std::shared_ptr inputComponent) { SURGSIM_ASSERT(nullptr != inputComponent) << "'inputComponent' cannot be 'nullptr'"; m_inputComponent = SurgSim::Framework::checkAndConvert( inputComponent, "SurgSim::Input::InputComponent"); } std::shared_ptr DebugDumpBehavior::getInputComponent() const { return m_inputComponent; } void DebugDumpBehavior::update(double dt) { SurgSim::DataStructures::DataGroup dataGroup; if (m_inputComponent == nullptr) { return; } m_inputComponent->getData(&dataGroup); using SurgSim::Devices::KeyCode; int key = KeyCode::NONE; if (dataGroup.integers().get("key", &key)) { if (!m_keyPressedLastUpdate) { switch (key) { case KeyCode::KEY_F1: { auto manager = m_manager.lock(); if (manager != nullptr) { manager->dumpDebugInfo(); } } break; case KeyCode::KEY_F2: { auto scene = getScene(); for (const auto& element : scene->getSceneElements()) { std::cout << element->getName() << ": " << (element->isActive() ? "active" : "inactive") << std::endl; for (const auto& component : element->getComponents()) { std::cout << " " << component->getName() << ": " << (component->isLocalActive() ? "active" : "inactive") << std::endl; } } } break; case KeyCode::KEY_F3: { auto scene = getScene(); for (const auto& element : scene->getSceneElements()) { std::cout << element->getName() << std::endl; for (const auto& component : element->getComponents()) { std::cout << " " << component->getName() << ": " << (component->isGeneratingTangents() ? "Tangents" : "NoTangents") << std::endl; } } } break; default: break; } } m_keyPressedLastUpdate = (KeyCode::NONE != key); } } bool DebugDumpBehavior::doInitialize() { auto managers = getRuntime()->getManagers(); for (const auto& manager : managers) { auto shared = manager.lock(); auto graphics = std::dynamic_pointer_cast(shared); if (graphics != nullptr) { m_manager = graphics; break; } } SURGSIM_LOG_IF(m_manager.expired(), Framework::Logger::getDefaultLogger(), WARNING); return true; } bool DebugDumpBehavior::doWakeUp() { bool result = true; if (nullptr == m_inputComponent) { SURGSIM_ASSERT(m_inputComponent != nullptr) << __FUNCTION__ << getFullName() << " does not have an Input Component."; result = false; } return result; } } }opensurgsim-0.7.0/SurgSim/Blocks/DebugDumpBehavior.h000066400000000000000000000043271277777236100224350ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_BLOCKS_DEBUGDUMPBEHAVIOR_H #define SURGSIM_BLOCKS_DEBUGDUMPBEHAVIOR_H #include #include "SurgSim/Framework/Behavior.h" namespace SurgSim { namespace Input { class InputComponent; } namespace Graphics { class OsgManager; } namespace Blocks { SURGSIM_STATIC_REGISTRATION(DebugDumpBehavior) /// Provides keyboard access to debugging functionality /// F1 - call the graphics manager dumpDebugInfo, this will write the current scenegraph to a file in the working /// directory. /// F2 - Display the whole scene and activity status for sceneelements and components /// F3 - Display tangent generation status for graphics objects class DebugDumpBehavior : public Framework::Behavior { public: /// Constructor /// \param name explicit DebugDumpBehavior(const std::string& name); virtual ~DebugDumpBehavior(); SURGSIM_CLASSNAME(SurgSim::Blocks::DebugDumpBehavior); /// Sets the InputComponent, needs to provide keystrokes /// \param inputComponent the input component void setInputComponent(std::shared_ptr inputComponent); /// \return the input component that is being used std::shared_ptr getInputComponent() const; private: void update(double dt) override; bool doInitialize() override; bool doWakeUp() override; std::weak_ptr m_manager; ///< Reference to the graphics manager std::shared_ptr m_inputComponent; ///< The input component for reading bool m_keyPressedLastUpdate; ///< prevent a repeated keystroke }; } } #endif opensurgsim-0.7.0/SurgSim/Blocks/DriveElementFromInputBehavior.cpp000066400000000000000000000060201277777236100253330ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Blocks/DriveElementFromInputBehavior.h" #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/Input/InputComponent.h" #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Framework/PoseComponent.h" #include "SurgSim/Math/RigidTransform.h" using SurgSim::Math::RigidTransform3d; using SurgSim::Framework::checkAndConvert; namespace SurgSim { namespace Blocks { SURGSIM_REGISTER(SurgSim::Framework::Component, SurgSim::Blocks::DriveElementFromInputBehavior, DriveElementFromInputBehavior); DriveElementFromInputBehavior::DriveElementFromInputBehavior(const std::string& name) : SurgSim::Framework::Behavior(name), m_poseName("pose") { SURGSIM_ADD_SERIALIZABLE_PROPERTY(DriveElementFromInputBehavior, std::shared_ptr, Source, getSource, setSource); SURGSIM_ADD_SERIALIZABLE_PROPERTY(DriveElementFromInputBehavior, std::string, PoseName, getPoseName, setPoseName); } void DriveElementFromInputBehavior::setSource(std::shared_ptr source) { m_source = checkAndConvert(source, "SurgSim::Input::InputComponent"); } std::shared_ptr DriveElementFromInputBehavior::getSource() { return m_source; } void DriveElementFromInputBehavior::setPoseName(const std::string& poseName) { m_poseName = poseName; } std::string DriveElementFromInputBehavior::getPoseName() { return m_poseName; } void DriveElementFromInputBehavior::update(double dt) { SurgSim::DataStructures::DataGroup dataGroup; m_source->getData(&dataGroup); RigidTransform3d pose; if (dataGroup.poses().get(m_poseName, &pose)) { getPoseComponent()->setPose(m_source->getLocalPose() * pose); } } bool DriveElementFromInputBehavior::doInitialize() { return true; } bool DriveElementFromInputBehavior::doWakeUp() { bool result = true; if (m_source == nullptr) { SURGSIM_LOG_SEVERE(SurgSim::Framework::Logger::getDefaultLogger()) << getClassName() << " named '" + getName() + "' must have a source to do anything."; result = false; } if (getPoseComponent() == nullptr) { SURGSIM_LOG_SEVERE(SurgSim::Framework::Logger::getDefaultLogger()) << getClassName() << " named '" + getName() + "' must belong to a SceneElement with a PoseComponent."; result = false; } return result; } }; //namespace Blocks }; //namespace SurgSim opensurgsim-0.7.0/SurgSim/Blocks/DriveElementFromInputBehavior.h000066400000000000000000000047551277777236100250150ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_BLOCKS_DRIVEELEMENTFROMINPUTBEHAVIOR_H #define SURGSIM_BLOCKS_DRIVEELEMENTFROMINPUTBEHAVIOR_H #include "SurgSim/Framework/Behavior.h" #include "SurgSim/Framework/ObjectFactory.h" namespace SurgSim { namespace Input { class InputComponent; } namespace Blocks { SURGSIM_STATIC_REGISTRATION(DriveElementFromInputBehavior); /// Behavior to copy a pose from an input component to a SceneElement /// By adding this behavior to a SceneElement, that SceneElement will be moved /// in correspondance to the input. class DriveElementFromInputBehavior : public SurgSim::Framework::Behavior { public: /// Constructor /// \param name Name of the behavior explicit DriveElementFromInputBehavior(const std::string& name); SURGSIM_CLASSNAME(SurgSim::Blocks::DriveElementFromInputBehavior); /// Set the InputComponent that provides the pose /// \param source A SurgSim::Input::InputComponent void setSource(std::shared_ptr source); /// Get the InputComponent which is being used by this behavior /// \return A SurgSim::Component::InputComponent std::shared_ptr getSource(); /// Set name of the pose. /// \param poseName The name of the pose. void setPoseName(const std::string& poseName); /// Get name of the pose. /// \return The name of the pose. std::string getPoseName(); /// Update the behavior /// \param dt The length of time (seconds) between update calls. virtual void update(double dt); protected: /// Initialize the behavior virtual bool doInitialize(); /// Wakeup the behavior, which copies the initial pose virtual bool doWakeUp(); private: /// InputComponent to get the pose std::shared_ptr m_source; std::string m_poseName; }; }; // namespace Blocks }; // namespace SurgSim #endif // SURGSIM_BLOCKS_DRIVEELEMENTFROMINPUTBEHAVIOR_H opensurgsim-0.7.0/SurgSim/Blocks/FunctionBehavior.cpp000066400000000000000000000036541277777236100227030ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Blocks/FunctionBehavior.h" #include "SurgSim/Framework/Log.h" namespace SurgSim { namespace Blocks { SURGSIM_REGISTER(SurgSim::Framework::Component, SurgSim::Blocks::FunctionBehavior, FunctionBehavior); FunctionBehavior::FunctionBehavior(const std::string& name) : Framework::Behavior(name), m_targetManager(Framework::MANAGER_TYPE_BEHAVIOR), m_function(nullptr) { } void FunctionBehavior::update(double dt) { m_function(dt); } void FunctionBehavior::setTargetManagerType(int type) { SURGSIM_ASSERT(type >= 0 && type < Framework::MANAGER_TYPE_COUNT) << "Invalid manager type."; SURGSIM_ASSERT(!isInitialized()) << "Cannot change the manager type after initialization."; m_targetManager = type; } int FunctionBehavior::getTargetManagerType() const { return m_targetManager; } void FunctionBehavior::setFunction(std::function function) { SURGSIM_ASSERT(!isInitialized()) << "Cannot change the function after initialization."; m_function = function; } bool FunctionBehavior::doInitialize() { if (m_function == nullptr) { SURGSIM_LOG_SEVERE(Framework::Logger::getDefaultLogger()) << "FunctionBehavior named " << getFullName() << " missing behavior function."; return false; } return true; } bool FunctionBehavior::doWakeUp() { return true; } }; }; opensurgsim-0.7.0/SurgSim/Blocks/FunctionBehavior.h000066400000000000000000000064671277777236100223550ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_BLOCKS_FUNCTIONBEHAVIOR_H #define SURGSIM_BLOCKS_FUNCTIONBEHAVIOR_H #include #include #include "SurgSim/Framework/Behavior.h" namespace SurgSim { namespace Blocks { SURGSIM_STATIC_REGISTRATION(FunctionBehavior); /// A Behavior that can run any callable target in its update function /// /// This behavior has a customizable update function, that can run any callable /// target, ie functions, lambda expressions, bind expressions, as well as /// pointers to member functions. /// /// Example Usage: /// \code{.cpp} /// /// void f1(double dt) { std::cout << dt; } /// /// void f2(double dt, double a) { std::cout << dt + a; } /// /// int main() /// { /// // A FunctionBehavior that runs a function /// auto behavior1 = std::make_shared("Behavior 1"); /// behavior1->setTargetManagerType(SurgSim::Framework::MANAGER_TYPE_BEHAVIOR); /// behavior1->setFunction(f1); /// /// // A FunctionBehavior that runs a std::bind function /// auto behavior2 = std::make_shared("Behavior 2"); /// behavior2->setTargetManagerType(SurgSim::Framework::MANAGER_TYPE_GRAPHICS); /// behavior2->setFunction(std::bind(f2, std::placeholders::_1, 2.0)); /// /// // A FunctionBehavior that runs a lambda function /// auto behavior3 = std::make_shared("Behavior 3"); /// behavior3->setTargetManagerType(SurgSim::Framework::MANAGER_TYPE_PHYSICS); /// behavior3->setFunction([](double dt) { std::cout << dt; }); /// /// auto element = std::make_shared("Element"); /// element->addComponent(behavior1); /// element->addComponent(behavior2); /// element->addComponent(behavior3); /// /// return 0; /// } /// \endcode /// \note The FunctionBehavior is incompatible with serialization class FunctionBehavior : public SurgSim::Framework::Behavior { public: /// Constructor /// \param name Name of the behavior explicit FunctionBehavior(const std::string& name); SURGSIM_CLASSNAME(SurgSim::Blocks::FunctionBehavior); /// Set the function to run in this behavior's update /// \param function The function void setFunction(std::function function); /// Set which manager will handle this behavior /// \param type Type of manager for this behavior void setTargetManagerType(int type); int getTargetManagerType() const override; void update(double dt) override; private: bool doInitialize() override; bool doWakeUp() override; /// The manager type that will handle this behavior int m_targetManager; /// The function to run in update std::function m_function; }; }; }; #endif // SURGSIM_BLOCKS_FUNCTIONBEHAVIOR_H opensurgsim-0.7.0/SurgSim/Blocks/GraphicsUtilities.cpp000066400000000000000000000210151277777236100230610ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Blocks/GraphicsUtilities.h" #include "SurgSim/Framework/ApplicationData.h" #include "SurgSim/Framework/BasicSceneElement.h" #include "SurgSim/Framework/PoseComponent.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Framework/Scene.h" #include "SurgSim/Framework/SceneElement.h" #include "SurgSim/Framework/TransferPropertiesBehavior.h" #include "SurgSim/Graphics/OsgRepresentation.h" #include "SurgSim/Graphics/OsgMaterial.h" #include "SurgSim/Graphics/OsgRenderTarget.h" #include "SurgSim/Graphics/OsgScreenSpaceQuadRepresentation.h" #include "SurgSim/Graphics/OsgTexture2d.h" #include "SurgSim/Graphics/OsgUniform.h" #include "SurgSim/Graphics/OsgCamera.h" #include "SurgSim/Graphics/OsgTextureUniform.h" #include "SurgSim/Graphics/OsgProgram.h" #include "SurgSim/Graphics/OsgUniformFactory.h" #include "SurgSim/Graphics/RenderPass.h" #include "osg/PolygonMode" namespace SurgSim { namespace Blocks { void enable2DTexture( std::shared_ptr material, const std::string& uniform, int unit, const std::string& filename, bool repeat) { if (!filename.empty()) { std::string path; SURGSIM_ASSERT(Framework::Runtime::getApplicationData()->tryFindFile(filename, &path)) << "Could not find texture file " << filename; auto texture = std::make_shared(); texture->loadImage(path); auto textureUniform = std::make_shared>(uniform); if (repeat) { auto osgTexture = texture->getOsgTexture(); osgTexture->setWrap(osg::Texture::WRAP_R, osg::Texture::REPEAT); osgTexture->setWrap(osg::Texture::WRAP_S, osg::Texture::REPEAT); osgTexture->setWrap(osg::Texture::WRAP_T, osg::Texture::REPEAT); } textureUniform->set(texture); textureUniform->setMinimumTextureUnit(unit); material->addUniform(textureUniform); } else { // If there is no texture provided, just set the texture unit on the material material->addUniform("int", uniform); material->setValue(uniform, unit); } } std::shared_ptr createPlainMaterial( const std::string& name, SurgSim::Math::Vector4f diffuseColor, SurgSim::Math::Vector4f specularColor, float shininess) { auto material = std::make_shared(name); auto program = Graphics::loadProgram(*Framework::Runtime::getApplicationData(), "Shaders/s_mapping_material"); SURGSIM_ASSERT(program != nullptr) << "Could not load program" << "Shaders/s_mapping_material"; material->setProgram(program); material->addUniform("vec4", "specularColor"); material->setValue("specularColor", specularColor); material->addUniform("vec4", "diffuseColor"); material->setValue("diffuseColor", diffuseColor); material->addUniform("float", "shininess"); material->setValue("shininess", shininess); return material; } std::shared_ptr createTexturedMaterial( const std::string& name, SurgSim::Math::Vector4f diffuseColor, SurgSim::Math::Vector4f specularColor, float shininess, const std::string& diffuseMap) { auto material = std::make_shared(name); auto program = Graphics::loadProgram(*Framework::Runtime::getApplicationData(), "Shaders/ds_mapping_material"); SURGSIM_ASSERT(program != nullptr) << "Could not load program" << "Shaders/ds_mapping_material"; material->setProgram(program); material->addUniform("vec4", "specularColor"); material->setValue("specularColor", specularColor); material->addUniform("vec4", "diffuseColor"); material->setValue("diffuseColor", diffuseColor); material->addUniform("float", "shininess"); material->setValue("shininess", shininess); enable2DTexture(material, "diffuseMap", Graphics::DIFFUSE_TEXTURE_UNIT, diffuseMap, false); return material; } std::shared_ptr createNormalMappedMaterial( const std::string& name, SurgSim::Math::Vector4f diffuseColor, SurgSim::Math::Vector4f specularColor, float shininess, const std::string& diffuseMap, const std::string& normalMap) { auto material = std::make_shared(name); auto program = Graphics::loadProgram(*Framework::Runtime::getApplicationData(), "Shaders/dns_mapping_material"); SURGSIM_ASSERT(program != nullptr) << "Could not load program" << "Shaders/dns_mapping_material"; // Prepare vertex attributes auto osgProgram = program->getOsgProgram(); osgProgram->addBindAttribLocation("tangent", Graphics::TANGENT_VERTEX_ATTRIBUTE_ID); osgProgram->addBindAttribLocation("bitangent", Graphics::BITANGENT_VERTEX_ATTRIBUTE_ID); material->setProgram(program); material->addUniform("vec4", "specularColor"); material->setValue("specularColor", specularColor); material->addUniform("vec4", "diffuseColor"); material->setValue("diffuseColor", diffuseColor); material->addUniform("float", "shininess"); material->setValue("shininess", shininess); enable2DTexture(material, "diffuseMap", Graphics::DIFFUSE_TEXTURE_UNIT, diffuseMap, false); enable2DTexture(material, "normalMap", Graphics::NORMAL_TEXTURE_UNIT, normalMap, false); return material; } void applyMaterials(std::shared_ptr scene, std::string materialFilename, const Materials& materials) { static SurgSim::Graphics::OsgUniformFactory uniformFactory; YAML::Node nodes; if (Framework::tryLoadNode(materialFilename, &nodes)) { for (auto node = nodes.begin(); node != nodes.end(); ++node) { auto name = node->begin()->first.as(); auto materialName = node->begin()->second["Material"].as(); auto found = name.find("/"); auto elementName = name.substr(0, found); auto componentName = name.substr(found + 1); auto component = std::dynamic_pointer_cast (scene->getComponent(elementName, componentName)); if (component != nullptr) { auto materialIt = materials.find(materialName); SURGSIM_ASSERT(materialIt != materials.end()) << "Could not find material " << materialName << " in the prebuilt materials."; auto material = materialIt->second; component->setMaterial(material); auto propertyNodes = node->begin()->second["Properties"]; for (auto nodeIt = propertyNodes.begin(); nodeIt != propertyNodes.end(); ++nodeIt) { auto rawUniform = uniformFactory.create( (*nodeIt)[0].as(), (*nodeIt)[1].as() ); SURGSIM_ASSERT(rawUniform != nullptr) << "Could not create uniform " << (*nodeIt)[1].as() << " of type " << (*nodeIt)[0].as() << "."; auto uniform = std::dynamic_pointer_cast(rawUniform); uniform->set((*nodeIt)[2]); component->addUniform(uniform); } } } } else { SURGSIM_LOG_SEVERE(SurgSim::Framework::Logger::getLogger("GraphicsUtilities")) << "Could not find material definitions, visuals are going to be compromised."; } } std::shared_ptr makeDebugQuad( const std::string& name, std::shared_ptr texture, double x, double y, double width, double height) { auto result = std::make_shared(name); result->setTexture(texture); result->setSize(width, height); result->setLocation(x, y); return result; } std::shared_ptr createPass( std::unordered_map> materials, const std::string& passName, const std::string& materialName) { auto pass = std::make_shared(passName); auto renderTarget = std::make_shared(1024, 1024, 1.0, 1, false); pass->setRenderTarget(renderTarget); pass->setRenderOrder(SurgSim::Graphics::Camera::RENDER_ORDER_PRE_RENDER, 0); SURGSIM_ASSERT(materials[materialName] != nullptr); materials[materialName]->getProgram()->setGlobalScope(true); pass->setMaterial(materials[materialName]); return pass; } } } opensurgsim-0.7.0/SurgSim/Blocks/GraphicsUtilities.h000066400000000000000000000125541277777236100225360ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_BLOCKS_GRAPHICSUTILITIES_H #define SURGSIM_BLOCKS_GRAPHICSUTILITIES_H #include #include #include #include "SurgSim/Math/Vector.h" /// \file GraphicsUtilities.h /// The code in here is supposed to help create materials correctly, a lot of it is boilerplate that is repeated over /// for each material. It will have to be changed if the shaders being used change. namespace SurgSim { namespace Graphics { class OsgMaterial; } namespace Framework { class Scene; } namespace Blocks { typedef std::unordered_map> Materials; /// Provide a consistent interface to add texture uniforms on materials, adds the actual texture with a given minimum /// unit, or provides a placeholder uniform for the unit /// \param material The material for adding the texture /// \param uniform The name of the uniform to use /// \param unit The texture unit to use /// \param filename The file to use for the texture, /// \param repeat whether to create the texture as repeating /// \note if the texture filename is empty a placeholder uniform will be created using the unit as a value /// this for using objects with textures built in without having to assign the texture to the material on creation void enable2DTexture(std::shared_ptr material, const std::string& uniform, int unit, const std::string& filename = "", bool repeat = false); /// Create a basic material /// \param name name of the material /// \param diffuseColor Base diffuse color to use /// \param specularColor Base specular color to use /// \param shininess Phong shininess exponent std::shared_ptr createPlainMaterial( const std::string& name, SurgSim::Math::Vector4f diffuseColor, SurgSim::Math::Vector4f specularColor, float shininess); /// Create a basic textured material /// \param name name of the material /// \param diffuseColor Base diffuse color to use /// \param specularColor Base specular color to use /// \param shininess Phong shininess exponent /// \param diffuseMap Diffuse texture map name to use, if the texture is embedded in the object /// pass an empty string here, it has to occupy the correct texture unit though. std::shared_ptr createTexturedMaterial( const std::string& name, SurgSim::Math::Vector4f diffuseColor, SurgSim::Math::Vector4f specularColor, float shininess, const std::string& diffuseMap = ""); /// Create a basic textured material /// \param name name of the material /// \param diffuseColor Base diffuse color to use /// \param specularColor Base specular color to use /// \param shininess Phong shininess exponent /// \param diffuseMap Diffuse texture map name to use, if the texture is embedded in the object /// pass an empty string here, it has to occupy the correct texture unit as defined by \sa DIFFUSE_TEXTURE_UNIT. /// \param normalMap Normal texture map to use, if the texture is embedded in the object pass an empty string here, /// it has to occupy the correct texture unit as defined by \sa NORMAL_TEXTURE_UNIT. std::shared_ptr createNormalMappedMaterial( const std::string& name, SurgSim::Math::Vector4f diffuseColor, SurgSim::Math::Vector4f specularColor, float shininess, const std::string& diffuseMap = "", const std::string& normalMap = ""); /// Reads a material file, iterates over the components listed up in the material file and applies the materials and /// the appropriate material properties (if present) to the component, if the component is not found it will be ignored /// The material file is a yaml file with the following format /// /// - SceneElementName/ComponentName> /// Material: MaterialName /// Properties: /// - [GLSLUniformType, UniformName, YamlEncodedValue] /// - [GLSLUniformType, UniformName, YamlEncodedValue] /// - SceneElementName/ComponentName /// Material: ... /// /// The name of the SceneElement and the Component addressed need to be be separated by a '/' character. /// For each of the properties a uniform is created with the given GLSL type, name, and the YAML node will be passed /// to the uniform setter for conversion. If the type does not match what the appropriate GLSL type is, there will /// be an error. /// GLSLUniformType is e.g. vec3, vec4, float, mat4 ... /// \param scene The scene to traverse for component lookup /// \param materialFilename the YAML file that contains the descriptions /// \param materials lookup table for all the materials that are available void applyMaterials(std::shared_ptr scene, std::string materialFilename, const Materials& materials); } } #endif opensurgsim-0.7.0/SurgSim/Blocks/ImplicitSurface.cpp000066400000000000000000000330141277777236100225120ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "ImplicitSurface.h" #include "SurgSim/Blocks/GraphicsUtilities.h" #include "SurgSim/Framework/ApplicationData.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Framework/TransferPropertiesBehavior.h" #include "SurgSim/Graphics/OsgCamera.h" #include "SurgSim/Graphics/OsgLight.h" #include "SurgSim/Graphics/OsgMaterial.h" #include "SurgSim/Graphics/OsgProgram.h" #include "SurgSim/Graphics/OsgRenderTarget.h" #include "SurgSim/Graphics/OsgScreenSpaceQuadRepresentation.h" #include "SurgSim/Graphics/OsgTexture2d.h" #include "SurgSim/Graphics/OsgTextureUniform.h" #include "SurgSim/Graphics/RenderPass.h" #include "SurgSim/Graphics/View.h" namespace SurgSim { namespace Blocks { std::shared_ptr createBlurPass( std::shared_ptr depthPass, int textureWidth, int textureHeight, double blurRadius, std::vector>* elements, bool debug) { float floatRadius = static_cast(blurRadius); std::shared_ptr previousCamera = depthPass->getCamera(); // Horizontal Pass { auto renderPass = std::make_shared("ImplicitSurfaceHorizontalBlurPass"); renderPass->getCamera()->setOrthogonalProjection(0, textureWidth, 0, textureHeight, -1.0, 1.0); auto renderTarget = std::make_shared(textureWidth, textureHeight, 1.0, 0, true); renderPass->setRenderTarget(renderTarget); renderPass->getCamera()->setRenderOrder(Graphics::Camera::RENDER_ORDER_PRE_RENDER, 1); auto material = Graphics::buildMaterial("Shaders/gauss_blur_horizontal.vert", "Shaders/bilateral_blur.frag"); material->addUniform("sampler2D", "texture"); material->setValue("texture", previousCamera->getRenderTarget()->getDepthTarget()); material->addUniform("float", "width"); material->setValue("width", static_cast(textureWidth)); material->addUniform("float", "blurRadius"); material->setValue("blurRadius", floatRadius); renderPass->setMaterial(material); // Quad auto graphics = std::make_shared("Quad"); graphics->setSize(textureWidth, textureHeight); graphics->setLocation(0, 0); graphics->setGroupReference("ImplicitSurfaceHorizontalBlurPass"); renderPass->addComponent(graphics); if (debug) { renderPass->showDepthTarget(0, 256, 256, 256); } previousCamera = renderPass->getCamera(); elements->push_back(renderPass); } // Vertical Pass { auto renderPass = std::make_shared("ImplicitSurfaceVerticalBlurPass"); renderPass->getCamera()->setOrthogonalProjection(0, textureWidth, 0, textureHeight, -1.0, 1.0); auto renderTarget = std::make_shared(textureWidth, textureHeight, 1.0, 0, true); renderPass->setRenderTarget(renderTarget); renderPass->getCamera()->setRenderOrder(Graphics::Camera::RENDER_ORDER_PRE_RENDER, 2); auto material = Graphics::buildMaterial("Shaders/gauss_blur_vertical.vert", "Shaders/bilateral_blur.frag"); material->addUniform("sampler2D", "texture"); material->setValue("texture", previousCamera->getRenderTarget()->getDepthTarget()); material->addUniform("float", "height"); material->setValue("height", static_cast(textureWidth)); material->addUniform("float", "blurRadius"); material->setValue("blurRadius", floatRadius); renderPass->setMaterial(material); // Quad auto graphics = std::make_shared("Quad"); graphics->setSize(textureWidth, textureHeight); graphics->setLocation(0, 0); graphics->setGroupReference("ImplicitSurfaceVerticalBlurPass"); renderPass->addComponent(graphics); if (debug) { renderPass->showDepthTarget(256, 256, 256, 256); } previousCamera = renderPass->getCamera(); elements->push_back(renderPass); } return previousCamera; } std::shared_ptr createDepthPass( float sphereRadius, float sphereScale, int textureWidth, int textureHeight, bool debug) { auto renderPass = std::make_shared("ImplicitSurfaceDepthPass"); renderPass->getCamera()->setRenderGroupReference(GROUP_IMPLICIT_SURFACE); auto renderTarget = std::make_shared(textureWidth, textureHeight, 1.0, 0, true); renderPass->setRenderTarget(renderTarget); renderPass->getCamera()->setRenderOrder(Graphics::Camera::RENDER_ORDER_PRE_RENDER, 0); auto material = Graphics::buildMaterial("Shaders/implicit_surface/depth.vert", "Shaders/implicit_surface/depth.frag"); auto texture = std::make_shared(); texture->setIsPointSprite(true); auto pointSpriteUniform = std::make_shared>("PointSpriteDepth"); pointSpriteUniform->set(texture); material->addUniform(pointSpriteUniform); material->addUniform("float", "sphereRadius"); material->setValue("sphereRadius", sphereRadius); material->addUniform("float", "sphereScale"); material->setValue("sphereScale", sphereScale); renderPass->setMaterial(material); if (debug) { renderPass->showDepthTarget(0, 0, 256, 256); } return renderPass; } std::shared_ptr createNormalPass( std::shared_ptr camera, std::shared_ptr depthMap, int textureWidth, int textureHeight, bool debug) { auto renderPass = std::make_shared("ImplicitSurfaceNormalPass"); renderPass->getCamera()->setOrthogonalProjection(0, textureWidth, 0, textureHeight, -1.0, 1.0); auto renderTarget = std::make_shared(textureWidth, textureHeight, 1.0, 1, false); renderPass->setRenderTarget(renderTarget); renderPass->getCamera()->setRenderOrder(Graphics::Camera::RENDER_ORDER_PRE_RENDER, 3); auto material = Graphics::buildMaterial("Shaders/implicit_surface/normal.vert", "Shaders/implicit_surface/normal.frag"); material->addUniform("sampler2D", "depthMap"); material->setValue("depthMap", depthMap); material->getUniform("depthMap")->setValue("MinimumTextureUnit", static_cast(8)); material->addUniform("float", "texelSize"); material->setValue("texelSize", static_cast(1.0 / textureWidth)); renderPass->setMaterial(material); // Quad auto graphics = std::make_shared("Quad"); graphics->setSize(textureWidth, textureHeight); graphics->setLocation(0, 0); graphics->setGroupReference("ImplicitSurfaceNormalPass"); renderPass->addComponent(graphics); if (debug) { renderPass->showColorTarget(256, 0, 256, 256); } return renderPass; } std::shared_ptr createShadingPass( std::shared_ptr view, std::shared_ptr camera, std::shared_ptr light, std::shared_ptr lightMapPass, std::shared_ptr depthMap, std::shared_ptr normalMap, const Math::Vector4f& diffuseColor, const Math::Vector4f& specularColor, const std::string diffuseEnvMap, float diffusePct, const std::string specularEnvMap, float specularPct, float shininess, float shadowBias, float shadowIntensity) { std::array dimensions = view->getDimensions(); auto copier = std::make_shared("Copier"); copier->setTargetManagerType(SurgSim::Framework::MANAGER_TYPE_GRAPHICS); auto renderPass = std::make_shared("ImplicitSurfaceShadingPass"); renderPass->addComponent(copier); auto renderCamera = std::dynamic_pointer_cast(renderPass->getCamera()); renderCamera->setAmbientColor(camera->getAmbientColor()); renderCamera->getOsgCamera()->setProjectionMatrixAsOrtho2D(0, dimensions[0], 0, dimensions[1]); renderCamera->getOsgCamera()->setReferenceFrame(osg::Transform::ABSOLUTE_RF); renderCamera->getOsgCamera()->setClearMask(GL_NONE); renderCamera->setRenderOrder(Graphics::Camera::RENDER_ORDER_POST_RENDER, 0); auto material = Graphics::buildMaterial("Shaders/implicit_surface/shading.vert", "Shaders/implicit_surface/shading.frag"); if (lightMapPass != nullptr) { material->addUniform("sampler2D", "lightMap"); material->setValue("lightMap", lightMapPass->getRenderTarget()->getDepthTarget()); material->addUniform("mat4", "lightViewMatrix"); copier->connect(lightMapPass->getCamera(), "FloatViewMatrix", material, "lightViewMatrix"); material->addUniform("mat4", "lightProjectionMatrix"); copier->connect(lightMapPass->getCamera(), "FloatProjectionMatrix", material, "lightProjectionMatrix"); } material->addUniform("sampler2D", "depthMap"); material->setValue("depthMap", depthMap); material->addUniform("sampler2D", "normalMap"); material->setValue("normalMap", normalMap); material->addUniform("vec3", "light"); material->setValue("light", light->getPose().translation().cast().eval()); material->addUniform("vec4", "diffuseColor"); material->setValue("diffuseColor", diffuseColor); material->addUniform("vec4", "specularColor"); material->setValue("specularColor", specularColor); material->addUniform("float", "shininess"); material->setValue("shininess", shininess); material->addUniform("float", "bias"); material->setValue("bias", shadowBias); material->addUniform("float", "intensity"); material->setValue("intensity", shadowIntensity); std::string filename; { // The Diffuse environment map SURGSIM_ASSERT(Framework::Runtime::getApplicationData()->tryFindFile(diffuseEnvMap, &filename)) << "Could not load diffuse environment map " << diffuseEnvMap; auto texture = std::make_shared(); texture->loadImage(filename); material->addUniform("samplerCube", "diffuseEnvMap"); material->setValue("diffuseEnvMap", texture); material->addUniform("float", "diffusePercent"); material->setValue("diffusePercent", diffusePct); } { // The Specular environment map SURGSIM_ASSERT(Framework::Runtime::getApplicationData()->tryFindFile(specularEnvMap, &filename)) << "Could not load specular environment map " << specularEnvMap; auto texture = std::make_shared(); texture->loadImage(filename); material->addUniform("samplerCube", "specularEnvMap"); material->setValue("specularEnvMap", texture); material->addUniform("float", "specularPercent"); material->setValue("specularPercent", specularPct); } renderPass->setMaterial(material); auto graphics = std::make_shared("Graphics"); graphics->setSize(dimensions[0], dimensions[1]); graphics->setLocation(0, 0); graphics->setGroupReference("ImplicitSurfaceShadingPass"); renderPass->addComponent(graphics); return renderPass; } std::vector> createImplicitSurfaceEffect( std::shared_ptr view, std::shared_ptr light, std::shared_ptr lightMapPass, float sphereRadius, float sphereScale, float blurRadius, const Math::Vector4f& diffuseColor, const Math::Vector4f& specularColor, const std::string diffuseEnvMap, float diffusePct, const std::string specularEnvMap, float specularPct, float shininess, float shadowBias, float shadowIntensity, bool showDebug) { SURGSIM_ASSERT(view != nullptr) << "View can't be nullptr."; SURGSIM_ASSERT(light != nullptr) << "Light can't be nullptr."; auto graphicsView = Framework::checkAndConvert(view, "SurgSim::Graphics::View"); auto osgCamera = Framework::checkAndConvert(graphicsView->getCamera(), "SurgSim::Graphics::OsgCamera"); auto osgLight = Framework::checkAndConvert(light, "SurgSim::Graphics::OsgLight"); auto lightPass = std::dynamic_pointer_cast(lightMapPass); std::vector> result; auto dimensions = graphicsView->getDimensions(); switch (graphicsView->getStereoMode()) { case Graphics::View::STEREO_MODE_VERTICAL_SPLIT: dimensions[0] /= 2; break; case Graphics::View::STEREO_MODE_HORIZONTAL_SPLIT: dimensions[1] /= 2; break; default: break; } auto depthPass = createDepthPass(sphereRadius, sphereScale, dimensions[0], dimensions[1], showDebug); auto blurPass = createBlurPass(depthPass, dimensions[0], dimensions[1], blurRadius, &result, showDebug); auto normalPass = createNormalPass(osgCamera, blurPass->getRenderTarget()->getDepthTarget(), dimensions[0], dimensions[1], showDebug); auto shadingPass = createShadingPass(graphicsView, osgCamera, osgLight, lightPass, blurPass->getRenderTarget()->getDepthTarget(), normalPass->getRenderTarget()->getColorTarget(0), diffuseColor, specularColor, diffuseEnvMap, diffusePct, specularEnvMap, specularPct, shininess, shadowBias, shadowIntensity); result.push_back(depthPass); result.push_back(normalPass); result.push_back(shadingPass); return result; } } // Blocks } // SurgSim opensurgsim-0.7.0/SurgSim/Blocks/ImplicitSurface.h000066400000000000000000000064501277777236100221630ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_BLOCKS_IMPLICITSURFACE_H #define SURGSIM_BLOCKS_IMPLICITSURFACE_H #include "SurgSim/Framework/Component.h" #include "SurgSim/Framework/SceneElement.h" #include "SurgSim/Graphics/Uniform.h" #include "SurgSim/Math/Vector.h" namespace SurgSim { namespace Blocks { static const std::string GROUP_IMPLICIT_SURFACE = "ImplicitSurface"; /// Builds a series of SceneElements enabling the rendering of a screen-space surface, all graphics objects that /// should be rendered as a surface need to be in the render group GROUP_IMPLICIT_SURFACE. /// The rest is done by the graphics system. /// All of the elements added are \sa RenderPass elements /// \param view the view to pull screen space dimensions from /// \param light the scene light to be used to shade the surface /// \param lightMapPass scene element containing the render pass for shadow casters /// \param sphereRadius the radius in meters that each point sprite sphere should have /// \param sphereScale the scaling factor for the point sprite sphere based on distance from the camera /// \param blurRadius sampling radius for the blur pass /// \param diffuseColor the color to use for the final surface shading /// \param specularColor the color to use for the specular highlight on the surface /// \param diffuseEnvMap the cube map to use for the diffuse environmental mapping /// \param diffusePct the amount to blend the environment map with the rest of diffuse lighting /// \param specularEnvMap the cube map to use for the specular environmental mapping /// \param specularPct the amount to blend the environment map with the rest of specular lighting /// \param shininess the shininess factor for the specular highlight /// \param shadowBias the bias to be used when determining something is in shadow or not, increasing this can help /// remove sharp edges at glancing angles /// \param shadowIntensity the general intensity of the shadow, 1 means everything in shadow will be black, 0 means /// there won't be any shadows at all /// \param showDebug whether to show debug information std::vector> createImplicitSurfaceEffect( std::shared_ptr view, std::shared_ptr light, std::shared_ptr lightMapPass, float sphereRadius, float sphereScale, float blurRadius, const Math::Vector4f& diffuseColor, const Math::Vector4f& specularColor, const std::string diffuseEnvMap, float diffusePct, const std::string specularEnvMap, float specularPct, float shininess, float shadowBias, float shadowIntensity, bool showDebug); } // Blocks } // SurgSim #endif // SURGSIM_BLOCKS_IMPLICITSURFACE_H opensurgsim-0.7.0/SurgSim/Blocks/KeyBehavior.cpp000066400000000000000000000070751277777236100216470ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Blocks/KeyBehavior.h" #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/Devices/Keyboard/KeyCode.h" #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Framework/SceneElement.h" #include "SurgSim/Input/InputComponent.h" namespace SurgSim { namespace Blocks { KeyBehavior::KeyBehavior(const std::string& name) : Framework::Behavior(name), m_lastKey(SurgSim::Devices::KeyCode::NONE) { SURGSIM_ADD_SERIALIZABLE_PROPERTY(KeyBehavior, std::shared_ptr, InputComponent, getInputComponent, setInputComponent); } KeyBehavior::~KeyBehavior() { } void KeyBehavior::setInputComponent(std::shared_ptr inputComponent) { m_inputComponent = SurgSim::Framework::checkAndConvert(inputComponent, "SurgSim::Input::InputComponent"); } std::shared_ptr KeyBehavior::getInputComponent() const { return m_inputComponent; } bool KeyBehavior::doInitialize() { return true; } bool KeyBehavior::doWakeUp() { SURGSIM_LOG_IF(m_inputComponent == nullptr, SurgSim::Framework::Logger::getDefaultLogger(), WARNING) << "Input component not present in " << getFullName(); return m_inputComponent != nullptr; } void KeyBehavior::update(double dt) { DataStructures::DataGroup dataGroup; m_inputComponent->getData(&dataGroup); int key; if (dataGroup.integers().get("key", &key)) { if (key != m_lastKey) { if (m_lastKey != Devices::KeyCode::NONE) { onKeyUp(m_lastKey); } if (key != Devices::KeyCode::NONE) { onKeyDown(key); } } m_lastKey = key; } } std::unordered_map KeyBehavior::m_keyMap; boost::mutex KeyBehavior::m_keyMapMutex; bool KeyBehavior::registerKey(int keycode, const std::string& description) { if (keycode == Devices::KeyCode::NONE) { return false; } bool result = false; boost::unique_lock lock(m_keyMapMutex); if (m_keyMap.find(keycode) == m_keyMap.end()) { m_keyMap[keycode] = description; result = true; } else { SURGSIM_LOG_WARNING(SurgSim::Framework::Logger::getLogger("Blocks/KeyBehavior")) << "Key '" << static_cast(keycode) << "' [" << description << "] already registered for function " << m_keyMap[keycode]; } return result; } bool KeyBehavior::unregisterKey(int keycode) { bool result = false; boost::unique_lock lock(m_keyMapMutex); if (m_keyMap.find(keycode) != m_keyMap.end()) { m_keyMap.erase(keycode); result = true; } return result; } void KeyBehavior::logMap() { std::string message; auto logger = SurgSim::Framework::Logger::getLogger("Blocks/KeyBehavior"); boost::unique_lock lock(m_keyMapMutex); for (const auto& item : m_keyMap) { SURGSIM_LOG_INFO(logger) << "'" << static_cast(item.first) << "' : " << item.second; } } }; // namespace Blocks }; // namespace SurgSimopensurgsim-0.7.0/SurgSim/Blocks/KeyBehavior.h000066400000000000000000000056221277777236100213100ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_BLOCKS_KEYBEHAVIOR_H #define SURGSIM_BLOCKS_KEYBEHAVIOR_H #include #include #include "SurgSim/Framework/Behavior.h" namespace SurgSim { namespace Input { class InputComponent; } namespace Blocks { /// Behavior to abstract the functionality of keyboard driven behaviors, can be programmed to react to a /// single keystroke class KeyBehavior : public Framework::Behavior { public: /// Constructor explicit KeyBehavior(const std::string& name); /// Destructor ~KeyBehavior(); void update(double dt) override; bool doInitialize() override; bool doWakeUp() override; /// Set the input component from which pressed key comes. /// \param inputComponent The input component which contains the pressed key(s). void setInputComponent(std::shared_ptr inputComponent); /// Get the input component of this behavior, from which the pressed key comes. /// \return The input component which sends key press to this behavior. std::shared_ptr getInputComponent() const; /// Register the key, this let's the system keep track of keys used in the application /// \param keycode the key that is being used /// \param description description of functionality that the key triggers /// \return true if the key is available, false if another key has already been register static bool registerKey(int keycode, const std::string& description); /// Remove a key from the registry /// \param keycode the key to be removed /// \return true if the key was actually removed static bool unregisterKey(int keycode); /// Write the keymap out to the logger static void logMap(); protected: /// Implement to execute functionality on key press /// \param key the value of the key hit virtual void onKeyDown(int key) = 0; /// Implement to execute functionality on key release /// \param key the value of the key hit virtual void onKeyUp(int key) = 0; /// Input component needs to provide key std::shared_ptr m_inputComponent; /// Keep track if the key was pressed the last time around int m_lastKey; ///@{ /// Handle the key map static boost::mutex m_keyMapMutex; static std::unordered_map m_keyMap; ///@} }; }; // namespace Blocks }; // namespace SurgSim #endif opensurgsim-0.7.0/SurgSim/Blocks/KeyboardCallbackBehavior.cpp000066400000000000000000000055021277777236100242650ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Blocks/KeyboardCallbackBehavior.h" #include "SurgSim/DataStructures/DataStructuresConvert.h" #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Input/InputComponent.h" namespace SurgSim { namespace Blocks { SURGSIM_REGISTER(SurgSim::Framework::Component, SurgSim::Blocks::KeyboardCallbackBehavior, KeyboardCallbackBehavior); KeyboardCallbackBehavior::KeyboardCallbackBehavior(const std::string& name) : Framework::Behavior(name), m_keyPressedLastUpdate(false), m_actionKey(Devices::NONE) { SURGSIM_ADD_SERIALIZABLE_PROPERTY(KeyboardCallbackBehavior, std::shared_ptr, InputComponent, getInputComponent, setInputComponent); SURGSIM_ADD_SERIALIZABLE_PROPERTY(KeyboardCallbackBehavior, int, ActionKey, getKey, registerKey); } void KeyboardCallbackBehavior::setInputComponent(std::shared_ptr inputComponent) { m_inputComponent = Framework::checkAndConvert(inputComponent, "SurgSim::Input::InputComponent"); } std::shared_ptr KeyboardCallbackBehavior::getInputComponent() const { return m_inputComponent; } void KeyboardCallbackBehavior::registerKey(int key) { m_actionKey = key; } void KeyboardCallbackBehavior::update(double dt) { DataStructures::DataGroup dataGroup; m_inputComponent->getData(&dataGroup); int key; if (dataGroup.integers().get("key", &key)) { if (m_actionKey == key && !m_keyPressedLastUpdate) { m_callback(); } m_keyPressedLastUpdate = (Devices::KeyCode::NONE != key); } } bool KeyboardCallbackBehavior::doInitialize() { return true; } bool KeyboardCallbackBehavior::doWakeUp() { bool result = true; if (nullptr == m_inputComponent) { SURGSIM_LOG_SEVERE(Framework::Logger::getDefaultLogger()) << "KeyboardCallbackBehavior '" << getFullName() << "' does not have an Input Component."; result = false; } return result; } int KeyboardCallbackBehavior::getKey() const { return m_actionKey; } void KeyboardCallbackBehavior::registerCallback(CallbackType func) { m_callback = func; } }; // namespace Blocks }; // namespace SurgSimopensurgsim-0.7.0/SurgSim/Blocks/KeyboardCallbackBehavior.h000066400000000000000000000055161277777236100237370ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_BLOCKS_KEYBOARDCALLBACKBEHAVIOR_H #define SURGSIM_BLOCKS_KEYBOARDCALLBACKBEHAVIOR_H #include #include "SurgSim/Devices/Keyboard/KeyCode.h" #include "SurgSim/Framework/Behavior.h" namespace SurgSim { namespace Input { class InputComponent; } namespace Blocks { SURGSIM_STATIC_REGISTRATION(KeyboardCallbackBehavior); /// This behavior will call the registered callback function when the registered key is pressed. class KeyboardCallbackBehavior : public Framework::Behavior { public: typedef std::function CallbackType; /// Constructor /// \param name Name of the behavior explicit KeyboardCallbackBehavior(const std::string& name); SURGSIM_CLASSNAME(SurgSim::Blocks::KeyboardCallbackBehavior); /// Set the input component from which pressed key comes. /// \param inputComponent The input component which contains the pressed key(s). void setInputComponent(std::shared_ptr inputComponent); /// Get the input component of this behavior, from which the pressed key comes. /// \return The input component which sends key press to this behavior. std::shared_ptr getInputComponent() const; /// Register a key, so that when such key is pressed, this behavior will call the callback. /// \param key The controlling key. void registerKey(int key); /// Register a callback function. /// This function will be called when the registered key is pressed. /// \param func The callback function. void registerCallback(CallbackType func); void update(double dt) override; protected: /// \return The key which will make this behavior to call the callback. /// \note This is used for serialization only. int getKey() const; bool doInitialize() override; bool doWakeUp() override; private: /// Record if any key is pressed in last update() call. bool m_keyPressedLastUpdate; /// The registered key, when pressed, the registered callback will be called. int m_actionKey; /// Callback function. CallbackType m_callback; /// Input component from which pressed key comes. std::shared_ptr m_inputComponent; }; }; // namespace Blocks }; // namespace SurgSim #endif //SURGSIM_BLOCKS_KEYBOARDCALLBACKBEHAVIOR_H opensurgsim-0.7.0/SurgSim/Blocks/KeyboardTogglesComponentBehavior.cpp000066400000000000000000000070211277777236100260560ustar00rootroot00000000000000// Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Blocks/KeyboardTogglesComponentBehavior.h" #include "SurgSim/DataStructures/DataStructuresConvert.h" #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Framework/ObjectFactory.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Input/InputComponent.h" using SurgSim::Framework::checkAndConvert; namespace SurgSim { namespace Blocks { SURGSIM_REGISTER(SurgSim::Framework::Component, SurgSim::Blocks::KeyboardTogglesComponentBehavior, KeyboardTogglesComponentBehavior); KeyboardTogglesComponentBehavior::KeyboardTogglesComponentBehavior(const std::string& name) : SurgSim::Framework::Behavior(name), m_keyPressedLastUpdate(false) { SURGSIM_ADD_SERIALIZABLE_PROPERTY(KeyboardTogglesComponentBehavior, std::shared_ptr, InputComponent, getInputComponent, setInputComponent); SURGSIM_ADD_SERIALIZABLE_PROPERTY(KeyboardTogglesComponentBehavior, KeyboardRegistryType, KeyboardRegistry, getKeyboardRegistry, setKeyboardRegistry); } void KeyboardTogglesComponentBehavior::setInputComponent(std::shared_ptr inputComponent) { SURGSIM_ASSERT(nullptr != inputComponent) << "'inputComponent' cannot be 'nullptr'"; m_inputComponent = checkAndConvert( inputComponent, "SurgSim::Input::InputComponent"); } std::shared_ptr KeyboardTogglesComponentBehavior::getInputComponent() const { return m_inputComponent; } void KeyboardTogglesComponentBehavior::registerKey(SurgSim::Devices::KeyCode key, std::shared_ptr component) { m_registry[static_cast(key)].insert(component); } void KeyboardTogglesComponentBehavior::update(double dt) { SurgSim::DataStructures::DataGroup dataGroup; m_inputComponent->getData(&dataGroup); int key; if (dataGroup.integers().get("key", &key)) { auto match = m_registry.find(key); if (match != m_registry.end() && !m_keyPressedLastUpdate) { for (auto it = std::begin(match->second); it != std::end(match->second); ++it) { (*it)->setLocalActive(!(*it)->isLocalActive()); }; } m_keyPressedLastUpdate = (SurgSim::Devices::KeyCode::NONE != key); } } bool KeyboardTogglesComponentBehavior::doInitialize() { return true; } bool KeyboardTogglesComponentBehavior::doWakeUp() { bool result = true; if (nullptr == m_inputComponent) { SURGSIM_LOG_SEVERE(SurgSim::Framework::Logger::getDefaultLogger()) << __FUNCTION__ << "KeyboardTogglesComponentBehavior " << getName() << " does not have an Input Component."; result = false; } return result; } void KeyboardTogglesComponentBehavior::setKeyboardRegistry(const KeyboardRegistryType& map) { m_registry = map; } const KeyboardTogglesComponentBehavior::KeyboardRegistryType& KeyboardTogglesComponentBehavior::getKeyboardRegistry() const { return m_registry; } }; // namespace Blocks }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Blocks/KeyboardTogglesComponentBehavior.h000066400000000000000000000070371277777236100255320ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_BLOCKS_KEYBOARDTOGGLESCOMPONENTBEHAVIOR_H #define SURGSIM_BLOCKS_KEYBOARDTOGGLESCOMPONENTBEHAVIOR_H #include #include #include "SurgSim/Devices/Keyboard/KeyCode.h" #include "SurgSim/Framework/Behavior.h" #include "SurgSim/Framework/Macros.h" namespace SurgSim { namespace Framework { class Component; } namespace Input { class InputComponent; } namespace Blocks { SURGSIM_STATIC_REGISTRATION(KeyboardTogglesComponentBehavior); /// This behavior is used to control the activity of registered components. class KeyboardTogglesComponentBehavior : public SurgSim::Framework::Behavior { public: typedef std::unordered_map>> KeyboardRegistryType; /// Constructor /// \param name Name of the behavior explicit KeyboardTogglesComponentBehavior(const std::string& name); SURGSIM_CLASSNAME(SurgSim::Blocks::KeyboardTogglesComponentBehavior); /// Set the input component from which pressed keys come. /// \param inputComponent The input component which contains the pressed key(s). void setInputComponent(std::shared_ptr inputComponent); /// Get the input component of this behavior /// \return The input component which sends signals to this behavior. std::shared_ptr getInputComponent() const; /// Register a key with a component in this behavior. /// \param key A key used to control the component. /// \param component The component being controlled by the key. /// \note A key can be registered several times, so can a component. void registerKey(SurgSim::Devices::KeyCode key, std::shared_ptr component); /// Set the register map of this behavior /// \param map The register map. void setKeyboardRegistry(const KeyboardRegistryType& map); /// Get the register map of this behavior /// \return The register map of this behavior const KeyboardRegistryType& getKeyboardRegistry() const; /// Update the behavior /// \param dt The length of time (seconds) between update calls. void update(double dt) override; protected: /// Initialize this behavior /// \return True on success, otherwise false. /// \note In current implementation, this method always returns "true". bool doInitialize() override; /// Wakeup this behavior /// \return True on success, otherwise false. /// \note In current implementation, this method always returns "true". bool doWakeUp() override; private: /// Record if any key is pressed in last update() call. bool m_keyPressedLastUpdate; /// Input component from which pressed keys come. std::shared_ptr m_inputComponent; /// A mapping between key and the graphical representation(s) it controls. KeyboardRegistryType m_registry; }; }; // namespace Blocks }; // namespace SurgSim #endif //SURGSIM_BLOCKS_KEYBOARDTOGGLESCOMPONENTBEHAVIOR_H opensurgsim-0.7.0/SurgSim/Blocks/MassSpring1DRepresentation.cpp000066400000000000000000000053021277777236100246240ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Blocks/MassSpring1DRepresentation.h" #include "SurgSim/Blocks/MassSpringNDRepresentationUtils.h" #include "SurgSim/Math/LinearSolveAndInverse.h" #include "SurgSim/Math/OdeState.h" #include "SurgSim/Physics/LinearSpring.h" using SurgSim::Math::Vector3d; using SurgSim::Physics::Mass; namespace SurgSim { namespace Blocks { void MassSpring1DRepresentation::init1D( const std::vector nodes, std::vector nodeBoundaryConditions, double totalMass, double stiffnessStretching, double dampingStretching, double stiffnessBending, double dampingBending) { std::shared_ptr state; state = std::make_shared(); state->setNumDof(getNumDofPerNode(), nodes.size()); SURGSIM_ASSERT(nodes.size() > 0) << "Number of nodes incorrect: " << nodes.size(); // Initialize the nodes position, velocity and mass // Note: no need to apply the initialPose here, initialize will take care of it ! for (size_t massId = 0; massId < nodes.size(); massId++) { addMass(std::make_shared(totalMass / static_cast(nodes.size()))); SurgSim::Math::setSubVector(nodes[massId], massId, 3, &state->getPositions()); } // Initialize the stretching springs if (stiffnessStretching || dampingStretching) { for (size_t massId = 0; massId < nodes.size() - 1; massId++) { addSpring(createLinearSpring(state, massId, massId + 1, stiffnessStretching, dampingStretching)); } } // Initialize the bending springs if (stiffnessBending || dampingBending) { for (size_t massId = 0; massId < nodes.size() - 2; massId++) { addSpring(createLinearSpring(state, massId, massId + 2, stiffnessBending, dampingBending)); } } // Sets the boundary conditions for (auto boundaryCondition = std::begin(nodeBoundaryConditions); boundaryCondition != std::end(nodeBoundaryConditions); boundaryCondition++) { state->addBoundaryCondition(*boundaryCondition); } // setInitialState: Initialize all the states + apply initialPose if any setInitialState(state); } }; // namespace Blocks }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Blocks/MassSpring1DRepresentation.h000066400000000000000000000043021277777236100242700ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_BLOCKS_MASSSPRING1DREPRESENTATION_H #define SURGSIM_BLOCKS_MASSSPRING1DREPRESENTATION_H #include #include #include "SurgSim/Physics/MassSpringRepresentation.h" namespace SurgSim { namespace Blocks { // This class defines a simple MassSpring 1D structures class MassSpring1DRepresentation : public SurgSim::Physics::MassSpringRepresentation { public: /// Constructor /// \param name The model name explicit MassSpring1DRepresentation(const std::string& name) : SurgSim::Physics::MassSpringRepresentation(name) { } /// Initializes a 1D model from a given list of nodes /// \param nodes List of nodes to define the 1D model with /// \param nodeBoundaryConditions The list of all nodeId being boundary conditions (fixed node) /// \param totalMass The total mass of the mass spring (evenly spread out on the masses) /// \param stiffnessStretching, dampingStretching The spring param for all stretching springs (edges) /// \param stiffnessBending, dampingBending The spring param for all bending springs (edges) /// \note Stretching springs are connecting neighbors, bending springs are connecting 1 node /// \note to its 2nd degree neighbors, creating a bending force around the middle node. void init1D(const std::vector nodes, std::vector nodeBoundaryConditions, double totalMass, double stiffnessStretching, double dampingStretching, double stiffnessBending, double dampingBending); }; }; // namespace Blocks }; // namespace SurgSim #endif // SURGSIM_BLOCKS_MASSSPRING1DREPRESENTATION_H opensurgsim-0.7.0/SurgSim/Blocks/MassSpring2DRepresentation.cpp000066400000000000000000000140221277777236100246240ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Blocks/MassSpring2DRepresentation.h" #include "SurgSim/Blocks/MassSpringNDRepresentationUtils.h" #include "SurgSim/Math/OdeState.h" #include "SurgSim/Physics/LinearSpring.h" using SurgSim::Math::Vector3d; using SurgSim::Physics::Mass; namespace SurgSim { namespace Blocks { void MassSpring2DRepresentation::init2DStretchingSprings(const std::shared_ptr state, size_t numNodesPerDim[2], double stiffness, double damping) { const size_t rowOffset = numNodesPerDim[0]; const size_t colOffset = 1; // Initialize the stretching springs if (stiffness || damping) { // ...along X for (size_t row = 0; row < numNodesPerDim[1]; row++) { for (size_t col = 0; col < numNodesPerDim[0] - 1; col++) { size_t nodeId = row * rowOffset + col * colOffset; addSpring(createLinearSpring(state, nodeId, nodeId + colOffset, stiffness, damping)); } } // ...along Y for (size_t col = 0; col < numNodesPerDim[0]; col++) { for (size_t row = 0; row < numNodesPerDim[1] - 1; row++) { size_t nodeId = row * rowOffset + col * colOffset; addSpring(createLinearSpring(state, nodeId, nodeId + rowOffset, stiffness, damping)); } } } } void MassSpring2DRepresentation::init2DBendingSprings(const std::shared_ptr state, size_t numNodesPerDim[2], double stiffness, double damping) { const size_t rowOffset = numNodesPerDim[0]; const size_t colOffset = 1; // Initialize the bending springs if (stiffness || damping) { // ... along X for (size_t row = 0; row < numNodesPerDim[1]; row++) { for (size_t col = 0; col < numNodesPerDim[0] - 2; col++) { size_t nodeId = row * rowOffset + col * colOffset; addSpring(createLinearSpring(state, nodeId, nodeId + 2 * colOffset, stiffness, damping)); } } // ... along Y for (size_t col = 0; col < numNodesPerDim[0]; col++) { for (size_t row = 0; row < numNodesPerDim[1] - 2; row++) { size_t nodeId = row * rowOffset + col * colOffset; addSpring(createLinearSpring(state, nodeId, nodeId + 2 * rowOffset, stiffness, damping)); } } } } void MassSpring2DRepresentation::init2DFaceDiagonalSprings(const std::shared_ptr state, size_t numNodesPerDim[2], double stiffness, double damping) { const size_t rowOffset = numNodesPerDim[0]; const size_t colOffset = 1; // Initialize the face diagonal springs if (stiffness || damping) { for (size_t row = 0; row < numNodesPerDim[1] - 1; row++) { for (size_t col = 0; col < numNodesPerDim[0] - 1; col++) { size_t nodeId = row * rowOffset + col * colOffset; addSpring(createLinearSpring(state, nodeId, nodeId + rowOffset + colOffset, stiffness, damping)); addSpring(createLinearSpring(state, nodeId + colOffset, nodeId + rowOffset, stiffness, damping)); } } } } void MassSpring2DRepresentation::init2D( const std::array, 2> extremities, size_t numNodesPerDim[2], std::vector nodeBoundaryConditions, double totalMass, double stiffnessStretching, double dampingStretching, double stiffnessBending, double dampingBending, double stiffnessFaceDiagonal, double dampingFaceDiagonal) { std::shared_ptr state; state = std::make_shared(); state->setNumDof(getNumDofPerNode(), numNodesPerDim[0] * numNodesPerDim[1]); SURGSIM_ASSERT(numNodesPerDim[0] > 0) << "Number of nodes for dimension 1 is incorrect: " << numNodesPerDim[0]; SURGSIM_ASSERT(numNodesPerDim[1] > 0) << "Number of nodes for dimension 2 is incorrect: " << numNodesPerDim[1]; // Initialize the nodes position, velocity and mass // Note: no need to apply the initialPose here, initialize will take care of it ! Vector3d rowExtremititiesDelta[2] = { (extremities[0][1] - extremities[0][0]) / static_cast(numNodesPerDim[1] - 1) , (extremities[1][1] - extremities[1][0]) / static_cast(numNodesPerDim[1] - 1) }; size_t nodeId = 0; for (size_t row = 0; row < numNodesPerDim[1]; row++) { Vector3d rowExtremities[2]; rowExtremities[0] = extremities[0][0] + rowExtremititiesDelta[0] * static_cast(row); rowExtremities[1] = extremities[1][0] + rowExtremititiesDelta[1] * static_cast(row); Vector3d delta = (rowExtremities[1] - rowExtremities[0]) / static_cast(numNodesPerDim[0] - 1); for (size_t col = 0; col < numNodesPerDim[0]; col++) { addMass(std::make_shared(totalMass / static_cast(numNodesPerDim[0] * numNodesPerDim[1]))); SurgSim::Math::Vector3d position(rowExtremities[0] + static_cast(col) * delta); SurgSim::Math::setSubVector(position, nodeId, 3, &state->getPositions()); nodeId++; } } // Initialize all the stretching springs init2DStretchingSprings(state, numNodesPerDim, stiffnessStretching, dampingStretching); // Initialize all the bending springs init2DBendingSprings(state, numNodesPerDim, stiffnessBending, dampingBending); // Initialize all the face diagonal springs init2DFaceDiagonalSprings(state, numNodesPerDim, stiffnessFaceDiagonal, dampingFaceDiagonal); // Sets the boundary conditions for (auto boundaryCondition = std::begin(nodeBoundaryConditions); boundaryCondition != std::end(nodeBoundaryConditions); boundaryCondition++) { state->addBoundaryCondition(*boundaryCondition); } // setInitialState: Initialize all the states + apply initialPose if any setInitialState(state); } }; // namespace Blocks }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Blocks/MassSpring2DRepresentation.h000066400000000000000000000100001277777236100242610ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_BLOCKS_MASSSPRING2DREPRESENTATION_H #define SURGSIM_BLOCKS_MASSSPRING2DREPRESENTATION_H #include #include #include "SurgSim/Physics/MassSpringRepresentation.h" namespace SurgSim { namespace Blocks { // This class defines a simple MassSpring 2D structures class MassSpring2DRepresentation : public SurgSim::Physics::MassSpringRepresentation { public: /// Constructor /// \param name The name to assign to the model explicit MassSpring2DRepresentation(const std::string& name) : SurgSim::Physics::MassSpringRepresentation(name) { } /// Initializes a 2D MassSpring /// \param extremities 4 positions forming the extremities of the 2D regular model (4 corners) /// \param numNodesPerDim The number of nodes to be created for each dimension (here 2) /// \param nodeBoundaryConditions The list of all nodeId being boundary conditions (fixed node) /// \param totalMass The total mass of the mass spring (evenly spread out on the masses) /// \param stiffnessStretching, dampingStretching The spring param for all stretching springs (edges) /// \param stiffnessBending, dampingBending The spring param for all bending springs (edges) /// \param stiffnessFaceDiagonal, dampingFaceDiagonal The spring param for all face diagonal springs (faces) /// \note Stretching springs are connecting neighbors, bending springs are connecting 1 node /// \note to its 2nd degree neighbors, creating a bending force around the middle node. /// \note Face diagonal springs aim at maintaining the area of a square /// \note extremities are organized as follow: /// \note [0][1] *---* [1][1] /// \note | | /// \note [0][0] *---* [1][0] void init2D(const std::array, 2> extremities, size_t numNodesPerDim[2], std::vector nodeBoundaryConditions, double totalMass, double stiffnessStretching, double dampingStretching, double stiffnessBending, double dampingBending, double stiffnessFaceDiagonal, double dampingFaceDiagonal); private: /// Helper method to initialize/add all stretching springs on a 2D structure /// \param state The state to initialize the springs with (rest lengths calculation) /// \param numNodesPerDim The number of nodes on the 2 dimensions /// \param stiffness, damping The spring parameters void init2DStretchingSprings(const std::shared_ptr state, size_t numNodesPerDim[2], double stiffness, double damping); /// Helper method to initialize/add all bending springs on a 2D structure /// \param state The state to initialize the springs with (rest lengths calculation) /// \param numNodesPerDim The number of nodes on the 2 dimensions /// \param stiffness, damping The spring parameters void init2DBendingSprings(const std::shared_ptr state, size_t numNodesPerDim[2], double stiffness, double damping); /// Helper method to initialize/add all face diagonal springs on a 2D structure /// \param state The state to initialize the springs with (rest lengths calculation) /// \param numNodesPerDim The number of nodes on the 2 dimensions /// \param stiffness, damping The spring parameters void init2DFaceDiagonalSprings(const std::shared_ptr state, size_t numNodesPerDim[2], double stiffness, double damping); }; }; // namespace Blocks }; // namespace SurgSim #endif // SURGSIM_BLOCKS_MASSSPRING2DREPRESENTATION_H opensurgsim-0.7.0/SurgSim/Blocks/MassSpring3DRepresentation.cpp000066400000000000000000000266301277777236100246350ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Blocks/MassSpring3DRepresentation.h" #include "SurgSim/Blocks/MassSpringNDRepresentationUtils.h" #include "SurgSim/Math/OdeState.h" #include "SurgSim/Physics/LinearSpring.h" using SurgSim::Physics::Mass; using SurgSim::Math::Vector3d; namespace SurgSim { namespace Blocks { void MassSpring3DRepresentation::init3DStretchingSprings(const std::shared_ptr state, size_t numNodesPerDim[3], double stiffness, double damping) { const size_t depthOffset = numNodesPerDim[0] * numNodesPerDim[1]; const size_t rowOffset = numNodesPerDim[0]; const size_t colOffset = 1; // Initialize the stretching springs if (stiffness|| damping) { // ... along X for (size_t depth = 0; depth < numNodesPerDim[2]; depth++) { for (size_t row = 0; row < numNodesPerDim[1]; row++) { for (size_t col = 0; col < numNodesPerDim[0] - 1; col++) { size_t nodeId = depth * depthOffset + row * rowOffset + col * colOffset; addSpring(createLinearSpring(state, nodeId, nodeId + colOffset, stiffness, damping)); } } } // ... along Y for (size_t depth = 0; depth < numNodesPerDim[2]; depth++) { for (size_t col = 0; col < numNodesPerDim[0]; col++) { for (size_t row = 0; row < numNodesPerDim[1] - 1; row++) { size_t nodeId = depth * depthOffset + row * rowOffset + col * colOffset; addSpring(createLinearSpring(state, nodeId, nodeId + rowOffset, stiffness, damping)); } } } // ... along Z for (size_t row = 0; row < numNodesPerDim[1]; row++) { for (size_t col = 0; col < numNodesPerDim[0]; col++) { for (size_t depth = 0; depth < numNodesPerDim[2] - 1; depth++) { size_t nodeId = depth * depthOffset + row * rowOffset + col * colOffset; addSpring(createLinearSpring(state, nodeId, nodeId + depthOffset, stiffness, damping)); } } } } } void MassSpring3DRepresentation::init3DBendingSprings(const std::shared_ptr state, size_t numNodesPerDim[3], double stiffness, double damping) { const size_t depthOffset = numNodesPerDim[0] * numNodesPerDim[1]; const size_t rowOffset = numNodesPerDim[0]; const size_t colOffset = 1; // Initialize the bending springs if (stiffness || damping) { // ... along X for (size_t depth = 0; depth < numNodesPerDim[2]; depth++) { for (size_t row = 0; row < numNodesPerDim[1]; row++) { for (size_t col = 0; col < numNodesPerDim[0] - 2; col++) { size_t nodeId = depth * depthOffset + row * rowOffset + col * colOffset; addSpring(createLinearSpring(state, nodeId, nodeId + 2 * colOffset, stiffness, damping)); } } } // ... along Y for (size_t depth = 0; depth < numNodesPerDim[2]; depth++) { for (size_t col = 0; col < numNodesPerDim[0]; col++) { for (size_t row = 0; row < numNodesPerDim[1] - 2; row++) { size_t nodeId = depth * depthOffset + row * rowOffset + col * colOffset; addSpring(createLinearSpring(state, nodeId, nodeId + 2 * rowOffset, stiffness, damping)); } } } // ... along Z for (size_t row = 0; row < numNodesPerDim[1]; row++) { for (size_t col = 0; col < numNodesPerDim[0]; col++) { for (size_t depth = 0; depth < numNodesPerDim[2] - 2; depth++) { size_t nodeId = depth * depthOffset + row * rowOffset + col * colOffset; addSpring(createLinearSpring(state, nodeId, nodeId + 2 * depthOffset, stiffness, damping)); } } } } } void MassSpring3DRepresentation::init3DFaceDiagonalSprings(const std::shared_ptr state, size_t numNodesPerDim[3], double stiffness, double damping) { const size_t depthOffset = numNodesPerDim[0] * numNodesPerDim[1]; const size_t rowOffset = numNodesPerDim[0]; const size_t colOffset = 1; // Initialize the face diagonal springs if (stiffness || damping) { // ... faces orthogonal to Z for (size_t depth = 0; depth < numNodesPerDim[2]; depth++) { for (size_t row = 0; row < numNodesPerDim[1] - 1; row++) { for (size_t col = 0; col < numNodesPerDim[0] - 1; col++) { size_t nodeId = depth * depthOffset + row * rowOffset + col * colOffset; addSpring(createLinearSpring(state, nodeId, nodeId + rowOffset + colOffset, stiffness, damping)); addSpring(createLinearSpring(state, nodeId + colOffset, nodeId + rowOffset, stiffness, damping)); } } } // ... faces orthogonal to Y for (size_t row = 0; row < numNodesPerDim[1]; row++) { for (size_t depth = 0; depth < numNodesPerDim[2] - 1; depth++) { for (size_t col = 0; col < numNodesPerDim[0] - 1; col++) { size_t nodeId = depth * depthOffset + row * rowOffset + col * colOffset; addSpring(createLinearSpring(state, nodeId, nodeId + depthOffset + colOffset, stiffness, damping)); addSpring(createLinearSpring(state, nodeId + colOffset, nodeId + depthOffset, stiffness, damping)); } } } // ... faces orthogonal to X for (size_t col = 0; col < numNodesPerDim[0]; col++) { for (size_t row = 0; row < numNodesPerDim[1] - 1; row++) { for (size_t depth = 0; depth < numNodesPerDim[2] - 1; depth++) { size_t nodeId = depth * depthOffset + row * rowOffset + col * colOffset; addSpring(createLinearSpring(state, nodeId, nodeId + depthOffset + rowOffset, stiffness, damping)); addSpring(createLinearSpring(state, nodeId + rowOffset, nodeId + depthOffset, stiffness, damping)); } } } } } void MassSpring3DRepresentation::init3DVolumeDiagonalSprings(const std::shared_ptr state, size_t numNodesPerDim[3], double stiffness, double damping) { const size_t depthOffset = numNodesPerDim[0] * numNodesPerDim[1]; const size_t rowOffset = numNodesPerDim[0]; const size_t colOffset = 1; // For convenience double &s = stiffness; double &d = damping; // Initialize the volume diagonal springs if (stiffness || damping) { for (size_t col = 0; col < numNodesPerDim[0] - 1; col++) { for (size_t row = 0; row < numNodesPerDim[1] - 1; row++) { for (size_t depth = 0; depth < numNodesPerDim[2] - 1; depth++) { size_t nodeId = depth * depthOffset + row * rowOffset + col * colOffset; addSpring(createLinearSpring(state, nodeId, nodeId + depthOffset + rowOffset + colOffset, s, d)); addSpring(createLinearSpring(state, nodeId + colOffset, nodeId + depthOffset + rowOffset, s, d)); addSpring(createLinearSpring(state, nodeId + rowOffset, nodeId + depthOffset + colOffset, s, d)); addSpring(createLinearSpring(state, nodeId + rowOffset + colOffset, nodeId + depthOffset, s, d)); } } } } } void MassSpring3DRepresentation::init3D( const std::array, 2>, 2> extremities, size_t numNodesPerDim[3], std::vector nodeBoundaryConditions, double totalMass, double stiffnessStretching, double dampingStretching, double stiffnessBending, double dampingBending, double stiffnessFaceDiagonal, double dampingFaceDiagonal, double stiffnessVolumeDiagonal, double dampingVolumeDiagonal) { std::shared_ptr state; state = std::make_shared(); state->setNumDof(getNumDofPerNode(), numNodesPerDim[0] * numNodesPerDim[1] * numNodesPerDim[2]); // Nodes distribution is done by column 1st, row 2nd, depth 3rd // Example: given a nodeId // Its neighbor on the next column (colOffset) is nodeId + 1 // Its neighbor on the next row (rowOffset) is nodeId + numNodesPerDim[0] // Its neighbor on the next depth (depthOffset) is nodeId + numNodesPerDim[0] * numNodesPerDim[1] SURGSIM_ASSERT(numNodesPerDim[0] > 0) << "Number of nodes for dimension 1 is incorrect: " << numNodesPerDim[0]; SURGSIM_ASSERT(numNodesPerDim[1] > 0) << "Number of nodes for dimension 2 is incorrect: " << numNodesPerDim[1]; SURGSIM_ASSERT(numNodesPerDim[2] > 0) << "Number of nodes for dimension 3 is incorrect: " << numNodesPerDim[2]; const size_t numNodes = numNodesPerDim[0] * numNodesPerDim[1] * numNodesPerDim[2]; // Initialize the nodes position, velocity and mass // Note: no need to apply the initialPose here, initialize will take care of it ! Vector3d depthExtremitiesDelta[2][2] = {{(extremities[0][0][1] - extremities[0][0][0]) / static_cast(numNodesPerDim[2] - 1) , (extremities[1][0][1] - extremities[1][0][0]) / static_cast(numNodesPerDim[2] - 1)} , {(extremities[0][1][1] - extremities[0][1][0]) / static_cast(numNodesPerDim[2] - 1) , (extremities[1][1][1] - extremities[1][1][0]) / static_cast(numNodesPerDim[2] - 1)}}; size_t nodeId = 0; for (size_t depth = 0; depth < numNodesPerDim[2]; depth++) { Vector3d depthExtremities[2][2]; depthExtremities[0][0] = extremities[0][0][0] + depthExtremitiesDelta[0][0] * static_cast(depth); depthExtremities[1][0] = extremities[1][0][0] + depthExtremitiesDelta[0][1] * static_cast(depth); depthExtremities[0][1] = extremities[0][1][0] + depthExtremitiesDelta[1][0] * static_cast(depth); depthExtremities[1][1] = extremities[1][1][0] + depthExtremitiesDelta[1][1] * static_cast(depth); Vector3d rowExtremitiesDelta[2] = {(depthExtremities[0][1] - depthExtremities[0][0]) / static_cast(numNodesPerDim[1] - 1) , (depthExtremities[1][1] - depthExtremities[1][0]) / static_cast(numNodesPerDim[1] - 1)}; for (size_t row = 0; row < numNodesPerDim[1]; row++) { Vector3d rowExtremities[2]; rowExtremities[0] = depthExtremities[0][0] + rowExtremitiesDelta[0] * static_cast(row); rowExtremities[1] = depthExtremities[1][0] + rowExtremitiesDelta[1] * static_cast(row); Vector3d delta = (rowExtremities[1] - rowExtremities[0]) / static_cast(numNodesPerDim[0] - 1); for (size_t col = 0; col < numNodesPerDim[0]; col++) { addMass(std::make_shared(totalMass / static_cast(numNodes))); Vector3d position(rowExtremities[0] + static_cast(col) * delta); SurgSim::Math::setSubVector(position, nodeId, 3, &state->getPositions()); nodeId++; } } } // Initialize all the stretching springs init3DStretchingSprings(state, numNodesPerDim, stiffnessStretching, dampingStretching); // Initialize all the bending springs init3DBendingSprings(state, numNodesPerDim, stiffnessBending, dampingBending); // Initialize all the face diagonal springs init3DFaceDiagonalSprings(state, numNodesPerDim, stiffnessFaceDiagonal, dampingFaceDiagonal); // Initialize all the volume diagonal springs init3DVolumeDiagonalSprings(state, numNodesPerDim, stiffnessVolumeDiagonal, dampingVolumeDiagonal); // Sets the boundary conditions for (auto boundaryCondition = std::begin(nodeBoundaryConditions); boundaryCondition != std::end(nodeBoundaryConditions); boundaryCondition++) { state->addBoundaryCondition(*boundaryCondition); } // setInitialState: Initialize all the states + apply initialPose if any setInitialState(state); } }; // namespace Blocks }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Blocks/MassSpring3DRepresentation.h000066400000000000000000000114271277777236100243000ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_BLOCKS_MASSSPRING3DREPRESENTATION_H #define SURGSIM_BLOCKS_MASSSPRING3DREPRESENTATION_H #include #include #include "SurgSim/Physics/MassSpringRepresentation.h" namespace SurgSim { namespace Blocks { // This class defines a simple MassSpring 3D structures class MassSpring3DRepresentation : public SurgSim::Physics::MassSpringRepresentation { public: /// Constructor /// \param name The model name explicit MassSpring3DRepresentation(const std::string& name) : SurgSim::Physics::MassSpringRepresentation(name) { } /// Initializes a 3D model /// \param extremities 8 positions forming the extremities of the 3D regular model (8 corners) /// \param numNodesPerDim The number of nodes to be created for each dimension (here 3) /// \param nodeBoundaryConditions The list of all nodeId being boundary conditions (fixed node) /// \param totalMass The total mass of the mass spring (evenly spread out on the masses) /// \param stiffnessStretching, dampingStretching The spring param for all stretching springs (edges) /// \param stiffnessBending, dampingBending The spring param for all bending springs (edges) /// \param stiffnessFaceDiagonal, dampingFaceDiagonal The spring param for all face diagonal springs (faces) /// \param stiffnessVolumeDiagonal, dampingVolumeDiagonal The spring param for all volume diagonal springs (volume) /// \note Stretching springs are connecting neighbors, bending springs are connecting 1 node /// \note to its 2nd degree neighbors, creating a bending force around the middle node. /// \note Face diagonal springs aim at maintaining the area of a square /// \note Volume diagonal springs aim at maintaining the volume of a cube /// \note extremities are organized as follow: /// \note [0][1][0] *---* [1][1][0] /// \note [0][1][1] *---* [1][1][1] /// \note [0][0][0] <- | | * -> [1][0][0] /// \note [0][0][1] *---* [1][0][1] void init3D( const std::array, 2>, 2> extremities, size_t numNodesPerDim[3], std::vector nodeBoundaryConditions, double totalMass, double stiffnessStretching, double dampingStretching, double stiffnessBending, double dampingBending, double stiffnessFaceDiagonal, double dampingFaceDiagonal, double stiffnessVolumeDiagonal, double dampingVolumeDiagonal); private: /// Helper method to initialize/add all stretching springs on a 3D structure /// \param state The state to initialize the springs with (rest lengths calculation) /// \param numNodesPerDim The number of nodes on the 3 dimensions /// \param stiffness, damping The spring parameters void init3DStretchingSprings(const std::shared_ptr state, size_t numNodesPerDim[3], double stiffness, double damping); /// Helper method to initialize/add all bending springs on a 3D structure /// \param state The state to initialize the springs with (rest lengths calculation) /// \param numNodesPerDim The number of nodes on the 3 dimensions /// \param stiffness, damping The spring parameters void init3DBendingSprings(const std::shared_ptr state, size_t numNodesPerDim[3], double stiffness, double damping); /// Helper method to initialize/add all face diagonal springs on a 3D structure /// \param state The state to initialize the springs with (rest lengths calculation) /// \param numNodesPerDim The number of nodes on the 3 dimensions /// \param stiffness, damping The spring parameters void init3DFaceDiagonalSprings(const std::shared_ptr state, size_t numNodesPerDim[3], double stiffness, double damping); /// Helper method to initialize/add all volume diagonal springs on a 3D structure /// \param state The state to initialize the springs with (rest lengths calculation) /// \param numNodesPerDim The number of nodes on the 3 dimensions /// \param stiffness, damping The spring parameters void init3DVolumeDiagonalSprings(const std::shared_ptr state, size_t numNodesPerDim[3], double stiffness, double damping); }; }; // namespace Blocks }; // namespace SurgSim #endif // SURGSIM_BLOCKS_MASSSPRING3DREPRESENTATION_H opensurgsim-0.7.0/SurgSim/Blocks/MassSpringNDRepresentationUtils.cpp000066400000000000000000000027761277777236100257160ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Blocks/MassSpringNDRepresentationUtils.h" #include "SurgSim/Math/OdeState.h" #include "SurgSim/Physics/LinearSpring.h" namespace SurgSim { namespace Blocks { std::shared_ptr createLinearSpring( const std::shared_ptr state, size_t nodeId0, size_t nodeId1, double stiffness, double damping) { using SurgSim::Math::Vector3d; std::shared_ptr spring; spring = std::make_shared(nodeId0, nodeId1); const Vector3d& A = SurgSim::Math::getSubVector(state->getPositions(), nodeId0, 3); const Vector3d& B = SurgSim::Math::getSubVector(state->getPositions(), nodeId1, 3); spring->setStiffness(stiffness); spring->setDamping(damping); spring->setRestLength((B-A).norm()); return spring; } }; // namespace Blocks }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Blocks/MassSpringNDRepresentationUtils.h000066400000000000000000000027201277777236100253500ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_BLOCKS_MASSSPRINGNDREPRESENTATIONUTILS_H #define SURGSIM_BLOCKS_MASSSPRINGNDREPRESENTATIONUTILS_H #include namespace SurgSim { namespace Math { class OdeState; } namespace Physics { class LinearSpring; } namespace Blocks { /// Helper method to create a LinearSpring /// \param state The state to initialize the spring with (rest length calculation) /// \param nodeId0, nodeId1 Node ids of the 2 connected masses /// \param stiffness, damping The spring parameters /// \return The newly create spring std::shared_ptr createLinearSpring( const std::shared_ptr state, size_t nodeId0, size_t nodeId1, double stiffness, double damping); }; // namespace Blocks }; // namespace SurgSim #endif // SURGSIM_BLOCKS_MASSSPRINGNDREPRESENTATIONUTILS_H opensurgsim-0.7.0/SurgSim/Blocks/PoseInterpolator.cpp000066400000000000000000000057311277777236100227450ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Blocks/PoseInterpolator.h" #include "SurgSim/Framework/SceneElement.h" #include using SurgSim::Math::RigidTransform3d; namespace SurgSim { namespace Blocks { PoseInterpolator::PoseInterpolator(const std::string& name) : Behavior(name), m_startingPose(RigidTransform3d::Identity()), m_endingPose(RigidTransform3d::Identity()), m_duration(1.0), m_currentTime(0.0) { } void PoseInterpolator::setStartingPose(const SurgSim::Math::RigidTransform3d& transform) { if (!isInitialized()) { m_optionalStartPose.setValue(transform); } } void PoseInterpolator::setEndingPose(const SurgSim::Math::RigidTransform3d& transform) { if (!isInitialized()) { m_endingPose = transform; } } void PoseInterpolator::setTarget(std::shared_ptr target) { if (!isInitialized()) { m_target = target; } } void PoseInterpolator::setDuration(double t) { if (!isInitialized()) { m_duration = t; } } double PoseInterpolator::getDuration() const { return m_duration; } bool PoseInterpolator::doInitialize() { return true; } void PoseInterpolator::doRetire() { m_target = nullptr; } bool PoseInterpolator::doWakeUp() { bool result = false; if (m_target == nullptr) { m_target = getSceneElement(); } if (m_target != nullptr) { m_startingPose = (m_optionalStartPose.hasValue()) ? m_optionalStartPose.getValue() : m_target->getPose(); result = true; } return result; } void PoseInterpolator::update(double dt) { m_currentTime += dt; if (m_currentTime >= m_duration) { if (isLoop()) { m_currentTime = m_currentTime - m_duration; } else if (isPingPong()) { m_currentTime = m_currentTime - m_duration; std::swap(m_endingPose, m_startingPose); } else { m_currentTime = m_duration; auto element = getSceneElement(); if (element != nullptr) { element->removeComponent(getName()); } } } m_target->setPose(Math::interpolate(m_startingPose, m_endingPose, m_currentTime / m_duration)); } void PoseInterpolator::setLoop(bool val) { m_loop = val; if (m_loop) { m_pingpong = false; } } bool PoseInterpolator::isLoop() const { return m_loop; } void PoseInterpolator::setPingPong(bool val) { m_pingpong = val; if (m_pingpong) { m_loop = false; } } bool PoseInterpolator::isPingPong() const { return m_pingpong; } }; // Blocks }; // Surgsim opensurgsim-0.7.0/SurgSim/Blocks/PoseInterpolator.h000066400000000000000000000067661277777236100224230ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_BLOCKS_POSEINTERPOLATOR_H #define SURGSIM_BLOCKS_POSEINTERPOLATOR_H #include #include #include "SurgSim/DataStructures/OptionalValue.h" #include "SurgSim/Framework/Behavior.h" #include "SurgSim/Math/RigidTransform.h" namespace SurgSim { namespace Framework { class SceneElement; } } namespace SurgSim { namespace Blocks { /// Perform linear interpolation on two poses class PoseInterpolator : public SurgSim::Framework::Behavior { public: /// Constructor explicit PoseInterpolator(const std::string& name); /// Set the starting pose. This is optional, if not set the target's pose /// will be used as the starting pose. /// \param transform The starting pose. void setStartingPose(const SurgSim::Math::RigidTransform3d& transform); /// Set the end pose. /// \param transform The end pose. void setEndingPose(const SurgSim::Math::RigidTransform3d& transform); /// Set the target of the interpolation, this is where the interpolated transform /// will be applied to. If this value is not set, the Scene Element that contains /// this PoseInterpolator will be used. If no starting pose is set, the pose of /// this scene element will be used as the starting pose /// \param target The target that will use the interpolated pose. void setTarget(std::shared_ptr target); /// Set the duration of the interpolation. /// \param t The duration in seconds. void setDuration(double t); /// Get the duration. /// \return The duration in seconds. double getDuration() const; /// Sets the interpolation to looping, pingpong and loop cannot be used together. /// \param val If true the interpolation will loop. void setLoop(bool val); /// \return true If the interpolation is looping. bool isLoop() const; /// Sets the interpolation to ping pong back and forth between the starting and ending poses. /// pingpong and loop cannot be used together. /// \param val If true the interpolation will ping pong. void setPingPong(bool val); /// \return true If the interpolation is doing ping pong. bool isPingPong() const; void update(double dt) override; private: /// Optional value to take the from rigid transform SurgSim::DataStructures::OptionalValue m_optionalStartPose; /// Target of the interpolation SurgSim::Math::RigidTransform3d m_startingPose; /// Start of the interpolation SurgSim::Math::RigidTransform3d m_endingPose; /// Target for the interpolated RigidTransform std::shared_ptr m_target; /// Duration of the interpolation double m_duration; /// How far through the interpolation we are double m_currentTime; /// Whether to pingpong bool m_pingpong; /// Whether to loop bool m_loop; bool doWakeUp() override; bool doInitialize() override; void doRetire() override; }; }; // Blocks }; // Surgsim #endif opensurgsim-0.7.0/SurgSim/Blocks/ShadowMapping.cpp000066400000000000000000000245241277777236100221760ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Blocks/ShadowMapping.h" #include "SurgSim/Graphics/OsgCamera.h" #include "SurgSim/Graphics/OsgScreenSpaceQuadRepresentation.h" #include "SurgSim/Graphics/OsgMaterial.h" #include "SurgSim/Graphics/OsgRenderTarget.h" #include "SurgSim/Graphics/Program.h" #include "SurgSim/Graphics/RenderPass.h" #include "SurgSim/Graphics/OsgScreenSpacePass.h" #include "SurgSim/Framework/Scene.h" #include "SurgSim/Framework/BasicSceneElement.h" #include "SurgSim/Framework/TransferPropertiesBehavior.h" #include "SurgSim/Framework/PoseComponent.h" #include "SurgSim/Blocks/GraphicsUtilities.h" #include "SurgSim/Graphics/OsgLight.h" #include namespace SurgSim { namespace Blocks { std::shared_ptr setupBlurPasses( std::shared_ptr shadowMapPass, int textureSize, double blurRadius, bool debug, std::vector>* elements) { std::vector> result; float shadowMapSize = static_cast(textureSize); float floatRadius = static_cast(blurRadius); std::shared_ptr perviousCamera = shadowMapPass->getCamera(); // Horizontal Pass { auto pass = std::make_shared("HorizontalBlurPass"); pass->getCamera()->setOrthogonalProjection(0, textureSize, 0, textureSize, -1.0, 1.0); auto renderTarget = std::make_shared(textureSize, textureSize, 1.0, 1, false); pass->setRenderTarget(renderTarget); pass->setRenderOrder(Graphics::Camera::RENDER_ORDER_PRE_RENDER, 2); // Material auto material = Graphics::buildMaterial("Shaders/gauss_blur_horizontal.vert", "Shaders/gauss_blur.frag"); material->getProgram()->setGlobalScope(true); material->addUniform("float", "width"); material->setValue("width", shadowMapSize); material->addUniform("float", "blurRadius"); material->setValue("blurRadius", floatRadius); pass->setMaterial(material); // Quad auto graphics = std::make_shared("Quad"); graphics->setSize(textureSize, textureSize); graphics->setLocation(0, 0); graphics->setTexture(perviousCamera->getRenderTarget()->getColorTarget(0)); graphics->setGroupReference("HorizontalBlurPass"); pass->addComponent(graphics); if (debug) { pass->showColorTarget(512, 0, 256, 256); } perviousCamera = pass->getCamera(); elements->push_back(pass); } // Vertical Pass { auto pass = std::make_shared("VerticalBlurPass"); pass->getCamera()->setOrthogonalProjection(0, textureSize, 0, textureSize, -1.0, 1.0); auto renderTarget = std::make_shared(textureSize, textureSize, 1.0, 1, false); pass->setRenderTarget(renderTarget); pass->setRenderOrder(Graphics::Camera::RENDER_ORDER_PRE_RENDER, 3); // Material auto material = Graphics::buildMaterial("Shaders/gauss_blur_vertical.vert", "Shaders/gauss_blur.frag"); material->getProgram()->setGlobalScope(true); material->addUniform("float", "height"); material->setValue("height", shadowMapSize); material->addUniform("float", "blurRadius"); material->setValue("blurRadius", floatRadius); pass->setMaterial(material); // Quad auto graphics = std::make_shared("Quad"); graphics->setSize(textureSize, textureSize); graphics->setLocation(0, 0); graphics->setTexture(perviousCamera->getRenderTarget()->getColorTarget(0)); graphics->setGroupReference("VerticalBlurPass"); pass->addComponent(graphics); if (debug) { pass->showColorTarget(756, 0, 256, 256); } perviousCamera = pass->getCamera(); elements->push_back(pass); } return perviousCamera; } /// Create the pass that renders the scene from the view of the light source /// the identifier GROUP_SHADOW_CASTER is used in all graphic objects to mark them as used /// in this pass std::shared_ptr createLightMapPass(int textureSize, bool debug) { auto pass = std::make_shared(GROUP_SHADOW_CASTER); auto renderTarget = std::make_shared(textureSize, textureSize, 1.0, 0, true); pass->setRenderTarget(renderTarget); pass->setRenderOrder(Graphics::Camera::RENDER_ORDER_PRE_RENDER, 0); std::dynamic_pointer_cast(pass->getCamera())->getOsgCamera()->setReferenceFrame( osg::Transform::ABSOLUTE_RF); auto material = Graphics::buildMaterial("Shaders/depth_map.vert", "Shaders/depth_map.frag"); material->getProgram()->setGlobalScope(true); pass->setMaterial(material); if (debug) { pass->showDepthTarget(0, 0, 256, 256); } return pass; } /// Create the pass that renders shadowed pixels into the scene, /// the identifier GROUPD_SHADOW_RECEIVER is used in all graphics objects to mark them /// as used in this pass std::shared_ptr createShadowMapPass(int textureSize, double bias, double intensity, bool debug) { auto pass = std::make_shared(GROUP_SHADOW_RECEIVER); auto renderTarget = std::make_shared(textureSize, textureSize, 1.0, 1, false); pass->setRenderTarget(renderTarget); pass->setRenderOrder(Graphics::Camera::RENDER_ORDER_PRE_RENDER, 1); std::dynamic_pointer_cast(pass->getCamera())->getOsgCamera()->setReferenceFrame( osg::Transform::ABSOLUTE_RF); auto material = Graphics::buildMaterial("Shaders/shadow_map.vert", "Shaders/shadow_map.frag"); material->getProgram()->setGlobalScope(true); pass->setMaterial(material); material->addUniform("float", "bias"); material->setValue("bias", static_cast(bias)); material->addUniform("float", "intensity"); material->setValue("intensity", static_cast(intensity)); if (debug) { pass->showColorTarget(256, 0, 256, 256); } return pass; } std::vector> createShadowMapping( std::shared_ptr camera, std::shared_ptr light, int depthTextureSize, int shadowTextureSize, std::array lightCameraProjection, double bias, double intensity, bool useBlur, double blurRadius, bool showDebug) { SURGSIM_ASSERT(camera != nullptr) << "Camera can't be nullptr."; SURGSIM_ASSERT(light != nullptr) << "Light can't be nullptr."; std::vector> result; auto osgCamera = Framework::checkAndConvert(camera, "SurgSim::Graphics::OsgCamera"); auto osgLight = Framework::checkAndConvert(light, "SurgSim::Graphics::OsgLight"); auto lightMapPass = createLightMapPass(depthTextureSize, showDebug); result.push_back(lightMapPass); lightMapPass->getCamera()->setValue("OrthogonalProjection", lightCameraProjection); auto cameraNode = std::dynamic_pointer_cast(lightMapPass->getCamera())->getOsgCamera(); cameraNode->getOrCreateStateSet()->setAttributeAndModes( new osg::PolygonMode(osg::PolygonMode::BACK, osg::PolygonMode::FILL), osg::StateAttribute::ON); auto copier = std::make_shared("Copier"); copier->setTargetManagerType(Framework::MANAGER_TYPE_GRAPHICS); // connect the light pose and the light map camera pose, so when the light moves, // this camera will move as well // Stapling has the light and the camera on the same element, the view, take the view element and connect the pose // to the light map pass copier->connect(osgLight, "Pose", lightMapPass->getPoseComponent(), "Pose"); auto shadowMapPass = createShadowMapPass(shadowTextureSize, bias, intensity, showDebug); result.push_back(shadowMapPass); shadowMapPass->getMaterial()->addUniform("mat4", "lightViewMatrix"); copier->connect(lightMapPass->getCamera(), "FloatViewMatrix", shadowMapPass->getMaterial(), "lightViewMatrix"); auto shadowMaterial = shadowMapPass->getMaterial(); // The projection matrix of the camera used to render the light map shadowMaterial->addUniform("mat4", "lightProjectionMatrix"); copier->connect(lightMapPass->getCamera(), "FloatProjectionMatrix", shadowMaterial, "lightProjectionMatrix"); // Get the result of the lightMapPass and pass it on to the shadowMapPass, because it is used // in a pass we ask the system to use a higher than normal texture unit (in this case 8) for // this texture, this prevents the texture from being overwritten by other textures shadowMaterial->addUniform("sampler2D", "depthMap"); shadowMaterial->setValue("depthMap", lightMapPass->getRenderTarget()->getDepthTarget()); shadowMaterial->getUniform("depthMap")->setValue("MinimumTextureUnit", static_cast(8)); // Make the camera in the shadowMapPass follow the main camera that is being used to render the // whole scene auto shadowCamera = shadowMapPass->getCamera(); copier->connect(osgCamera, "ProjectionMatrix", shadowCamera , "ProjectionMatrix"); copier->connect(osgCamera, "Pose", shadowCamera, "LocalPose"); // Put the result of the last pass into the main camera to make it accessible auto material = std::make_shared("camera material"); material->addUniform("sampler2D", "shadowMap"); std::shared_ptr texture; if (useBlur) { auto blurrPass = setupBlurPasses( shadowMapPass, shadowTextureSize, static_cast(blurRadius), showDebug, &result); texture = blurrPass->getRenderTarget()->getColorTarget(0); } else { texture = shadowCamera->getRenderTarget()->getColorTarget(0); } material->setValue("shadowMap", texture); material->getUniform("shadowMap")->setValue("MinimumTextureUnit", static_cast(8)); osgCamera->getSceneElement()->addComponent(material); osgCamera->setMaterial(material); lightMapPass->addComponent(copier); return result; } } } opensurgsim-0.7.0/SurgSim/Blocks/ShadowMapping.h000066400000000000000000000056501277777236100216420ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_BLOCKS_SHADOWMAPPING_H #define SURGSIM_BLOCKS_SHADOWMAPPING_H #include #include #include #include namespace SurgSim { namespace Graphics { class OsgMaterial; } namespace Framework { class SceneElement; class Component; } namespace Blocks { ///@{ /// Names to use as RenderGroupReferences static const std::string GROUP_SHADOW_CASTER = "Shadowing"; static const std::string GROUP_SHADOW_RECEIVER = "Shadowed"; ///@} /// Builds a series of SceneElements enabling the rendering of shadows, all graphics object that should cast shadows /// need to be in the render group GROUP_SHADOW_CASTER, all objects that should receive shadows should be in the /// render group GROUP_SHADOW_RECEIVER. The rest is done by the graphics system. /// All of the elements added are \sa RenderPass elements /// \param camera the view camera that is used for this pass /// \param light the light that should be used for the shadows /// \param depthTextureSize the size of the texture for the depth map, main determinant for the quality of the shadows /// \param shadowTextureSize the size of shadowTexture pass and the blur textures /// \param lightCameraProjection parameters for an orthogonal projection that will be used to render the scene from /// the lights point of view, needs to be set so it encompasses all the shadow casters and receivers /// \param bias the bias to be used when determining something is in shadow or not, increasing this can help remove /// sharp edges at glancing angles /// \param intensity the general intensity of the shadow, 1 means everything in shadow will be black, 0 means there /// won't be any shadows at all /// \param useBlur whether to blur the output of the light map pass, this will remove some of the blockiness of the /// shadows /// \param blurRadius sampling radius for the blur pass /// \param showDebug whether to show debug information std::vector> createShadowMapping( std::shared_ptr camera, std::shared_ptr light, int depthTextureSize, int shadowTextureSize, std::array lightCameraProjection, double bias, double intensity, bool useBlur, double blurRadius, bool showDebug); } } #endif opensurgsim-0.7.0/SurgSim/Blocks/SingleKeyBehavior.cpp000066400000000000000000000041711277777236100230030ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SingleKeyBehavior.h" #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/Devices/Keyboard/KeyCode.h" #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Framework/SceneElement.h" #include "SurgSim/Input/InputComponent.h" namespace SurgSim { namespace Blocks { SingleKeyBehavior::SingleKeyBehavior(const std::string& name) : KeyBehavior(name), m_actionKey(SurgSim::Devices::KeyCode::NONE) { SURGSIM_ADD_SERIALIZABLE_PROPERTY(SingleKeyBehavior, int, ActionKey, getKey, setKey); } SingleKeyBehavior::~SingleKeyBehavior() { } bool SingleKeyBehavior::doWakeUp() { SURGSIM_LOG_IF(m_actionKey == Devices::KeyCode::NONE, SurgSim::Framework::Logger::getDefaultLogger(), WARNING) << "No key set in " << getFullName(); return KeyBehavior::doWakeUp() && m_actionKey != Devices::KeyCode::NONE; } int SingleKeyBehavior::getKey() const { return m_actionKey; } void SingleKeyBehavior::setDescription(const std::string& description) { m_description = description; } void SingleKeyBehavior::onKeyDown(int actualKey) { if (actualKey == m_actionKey) { onKey(); } } void SingleKeyBehavior::onKeyUp(int val) { return; } void SingleKeyBehavior::setKey(int val) { KeyBehavior::unregisterKey(m_actionKey); m_actionKey = val; std::string description = m_description; if (description == "") { description = getClassName(); } KeyBehavior::registerKey(val, description); } }; // namespace Blocks }; // namespace SurgSimopensurgsim-0.7.0/SurgSim/Blocks/SingleKeyBehavior.h000066400000000000000000000035131277777236100224470ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_BLOCKS_SINGLEKEYBEHAVIOR_H #define SURGSIM_BLOCKS_SINGLEKEYBEHAVIOR_H #include #include #include "SurgSim/Blocks/KeyBehavior.h" namespace SurgSim { namespace Input { class InputComponent; } namespace Blocks { /// Behavior to abstract the functionality of keyboard driven behaviors, can be programmed to react to a /// single keystroke class SingleKeyBehavior : public KeyBehavior { public: /// Constructor explicit SingleKeyBehavior(const std::string& name); /// Destructor ~SingleKeyBehavior(); bool doWakeUp() override; /// Sets the current key value used to trigger this behavior /// \param val the key code to use to trigger this behavior void setKey(int val); /// \return the key code that triggers this behavior int getKey() const; protected: void setDescription(const std::string& description); virtual void onKey() = 0; void onKeyDown(int actualKey) override; void onKeyUp(int actualKey) override; std::shared_ptr m_inputComponent; /// Registered key to trigger action int m_actionKey; std::string m_description; }; }; // namespace Blocks }; // namespace SurgSim #endif // SURGSIM_BLOCKS_SINGLEKEYBEHAVIOR_H opensurgsim-0.7.0/SurgSim/Blocks/SphereElement.cpp000066400000000000000000000054441277777236100221750ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Blocks/SphereElement.h" #include "SurgSim/Graphics/OsgMaterial.h" #include "SurgSim/Graphics/OsgProgram.h" #include "SurgSim/Graphics/OsgSphereRepresentation.h" #include "SurgSim/Math/SphereShape.h" #include "SurgSim/Physics/RigidRepresentation.h" #include "SurgSim/Physics/RigidCollisionRepresentation.h" using SurgSim::Graphics::OsgMaterial; using SurgSim::Graphics::OsgProgram; using SurgSim::Graphics::OsgSphereRepresentation; using SurgSim::Math::SphereShape; using SurgSim::Physics::RigidCollisionRepresentation; using SurgSim::Physics::RigidRepresentation; namespace SurgSim { namespace Blocks { SphereElement::SphereElement(const std::string& name) : SurgSim::Framework::SceneElement(name) { } bool SphereElement::doInitialize() { std::shared_ptr physicsRepresentation = std::make_shared(getName() + " Physics"); physicsRepresentation->setDensity(700.0); // Wood physicsRepresentation->setLinearDamping(0.1); std::shared_ptr shape = std::make_shared(0.1); // 1cm Sphere physicsRepresentation->setShape(shape); std::shared_ptr graphicsRepresentation = std::make_shared(getName() + " Graphics"); graphicsRepresentation->setRadius(shape->getRadius()); std::shared_ptr material = std::make_shared("material"); std::shared_ptr program = std::make_shared(); program->setVertexShaderSource( "varying vec4 color;\n" "void main(void)\n" "{\n" " gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n" " color.rgb = gl_Normal;\n" " color.a = 1.0;\n" "}"); program->setFragmentShaderSource( "varying vec4 color;\n" "void main(void)\n" "{\n" " gl_FragColor = color;\n" "}"); material->setProgram(program); graphicsRepresentation->setMaterial(material); addComponent(physicsRepresentation); addComponent(graphicsRepresentation); auto rigidCollision = std::make_shared("Sphere Collision Representation"); physicsRepresentation->setCollisionRepresentation(rigidCollision); addComponent(rigidCollision); return true; } }; }; opensurgsim-0.7.0/SurgSim/Blocks/SphereElement.h000066400000000000000000000021341277777236100216330ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_BLOCKS_SPHEREELEMENT_H #define SURGSIM_BLOCKS_SPHEREELEMENT_H #include #include "SurgSim/Framework/SceneElement.h" #include "SurgSim/Math/RigidTransform.h" namespace SurgSim { namespace Blocks { class SphereElement : public SurgSim::Framework::SceneElement { public: /// Constructor /// \param name Name of the sphere explicit SphereElement(const std::string& name); protected: bool doInitialize() override; }; }; }; #endif opensurgsim-0.7.0/SurgSim/Blocks/TransferParticlesToPointCloudBehavior.cpp000066400000000000000000000065341277777236100270550ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Blocks/TransferParticlesToPointCloudBehavior.h" #include "SurgSim/Framework/Component.h" #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Framework/ObjectFactory.h" #include "SurgSim/DataStructures/Vertex.h" #include "SurgSim/DataStructures/Vertices.h" #include "SurgSim/Graphics/OsgPointCloudRepresentation.h" #include "SurgSim/Particles/Representation.h" using SurgSim::Framework::checkAndConvert; namespace SurgSim { namespace Blocks { SURGSIM_REGISTER(SurgSim::Framework::Component, SurgSim::Blocks::TransferParticlesToPointCloudBehavior, TransferParticlesToPointCloudBehavior); TransferParticlesToPointCloudBehavior::TransferParticlesToPointCloudBehavior(const std::string& name) : SurgSim::Framework::Behavior(name) { SURGSIM_ADD_SERIALIZABLE_PROPERTY(TransferParticlesToPointCloudBehavior, std::shared_ptr, Source, getSource, setSource); SURGSIM_ADD_SERIALIZABLE_PROPERTY(TransferParticlesToPointCloudBehavior, std::shared_ptr, Target, getTarget, setTarget); } void TransferParticlesToPointCloudBehavior::setSource(const std::shared_ptr& source) { SURGSIM_ASSERT(nullptr != source) << "'source' can not be nullptr."; m_source = checkAndConvert( source, "SurgSim::Particles::Representation"); } void TransferParticlesToPointCloudBehavior::setTarget(const std::shared_ptr& target) { SURGSIM_ASSERT(nullptr != target) << "'target' can not be nullptr."; m_target = checkAndConvert( target, "SurgSim::Graphics::PointCloudRepresentation"); } std::shared_ptr TransferParticlesToPointCloudBehavior::getSource() const { return m_source; } std::shared_ptr TransferParticlesToPointCloudBehavior::getTarget() const { return m_target; } void TransferParticlesToPointCloudBehavior::update(double dt) { *m_target->getVertices() = *m_source->getParticles().safeGet(); } bool TransferParticlesToPointCloudBehavior::doInitialize() { return true; } bool TransferParticlesToPointCloudBehavior::doWakeUp() { if (m_source == nullptr) { SURGSIM_LOG_SEVERE(SurgSim::Framework::Logger::getDefaultLogger()) << getClassName() << " named '" + getName() + "' must have a source."; return false; } if (m_target == nullptr) { SURGSIM_LOG_SEVERE(SurgSim::Framework::Logger::getDefaultLogger()) << getClassName() << " named '" + getName() + "' must have a target."; return false; } return true; } }; //namespace Blocks }; //namespace SurgSim opensurgsim-0.7.0/SurgSim/Blocks/TransferParticlesToPointCloudBehavior.h000066400000000000000000000054241277777236100265170ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_BLOCKS_TRANSFERPARTICLESTOPOINTCLOUDBEHAVIOR_H #define SURGSIM_BLOCKS_TRANSFERPARTICLESTOPOINTCLOUDBEHAVIOR_H #include "SurgSim/Framework/Behavior.h" #include "SurgSim/Framework/Macros.h" namespace SurgSim { namespace Framework { class Component; } namespace Graphics { class PointCloudRepresentation; } namespace Particles { class Representation; } namespace Blocks { SURGSIM_STATIC_REGISTRATION(TransferParticlesToPointCloudBehavior); /// Behavior to copy positions of a Particles::Representation to a PointCloud. class TransferParticlesToPointCloudBehavior : public SurgSim::Framework::Behavior { public: /// Constructor /// \param name Name of the behavior explicit TransferParticlesToPointCloudBehavior(const std::string& name); SURGSIM_CLASSNAME(SurgSim::Blocks::TransferParticlesToPointCloudBehavior); /// Set the representation from which the positions are from /// \param source The particles representation void setSource(const std::shared_ptr& source); /// Set the point cloud representation which will receive the positions /// \param target The Graphics PointCloud representation void setTarget(const std::shared_ptr& target); /// Get the particles representation which sends the positions /// \return The Physics representation which produces positions. std::shared_ptr getSource() const; /// Get the point cloud representation which receives the positions /// \return The Graphics PointCloud representation which receives positions. std::shared_ptr getTarget() const; void update(double dt) override; private: bool doInitialize() override; bool doWakeUp() override; /// The Particles::Representation from which the positions come. std::shared_ptr m_source; /// The Graphics PointCloud Representation to which the vertices's positions are set. std::shared_ptr m_target; }; }; // namespace Blocks }; // namespace SurgSim #endif // SURGSIM_BLOCKS_TRANSFERPARTICLESTOPOINTCLOUDBEHAVIOR_H opensurgsim-0.7.0/SurgSim/Blocks/TransferPhysicsToGraphicsMeshBehavior.cpp000066400000000000000000000217111277777236100270400ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Blocks/TransferPhysicsToGraphicsMeshBehavior.h" #include "SurgSim/DataStructures/DataStructuresConvert.h" #include "SurgSim/DataStructures/Grid.h" #include "SurgSim/DataStructures/TriangleMesh.h" #include "SurgSim/Framework/Component.h" #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Framework/ObjectFactory.h" #include "SurgSim/Graphics/Mesh.h" #include "SurgSim/Graphics/OsgMeshRepresentation.h" #include "SurgSim/Math/Aabb.h" #include "SurgSim/Math/OdeState.h" #include "SurgSim/Physics/DeformableRepresentation.h" using SurgSim::Framework::checkAndConvert; namespace SurgSim { namespace Blocks { SURGSIM_REGISTER(SurgSim::Framework::Component, SurgSim::Blocks::TransferPhysicsToGraphicsMeshBehavior, TransferPhysicsToGraphicsMeshBehavior); TransferPhysicsToGraphicsMeshBehavior::TransferPhysicsToGraphicsMeshBehavior(const std::string& name) : Framework::Behavior(name) { SURGSIM_ADD_SERIALIZABLE_PROPERTY(TransferPhysicsToGraphicsMeshBehavior, std::shared_ptr, Source, getSource, setSource); SURGSIM_ADD_SERIALIZABLE_PROPERTY(TransferPhysicsToGraphicsMeshBehavior, std::shared_ptr, Target, getTarget, setTarget); // Enable full serialization on the index map type, but need to deal with overloaded functions { typedef std::vector> ParamType; typedef TransferPhysicsToGraphicsMeshBehavior ClassType; // Deal with the overloaded function, by casting to explicit function type auto getter = (ParamType(ClassType::*)(void) const)&ClassType::getIndexMap; auto setter = (void(ClassType::*)(const ParamType&))&ClassType::setIndexMap; setAccessors("IndexMap", std::bind(getter, this), std::bind(setter, this, std::bind(Framework::convert, std::placeholders::_1))); setSerializable("IndexMap", std::bind(&YAML::convert::encode, std::bind(getter, this)), std::bind(setter, this, std::bind(&YAML::Node::as, std::placeholders::_1))); } // Enable a setter to take the names of two mesh files to create the index map { typedef std::pair ParamType; typedef TransferPhysicsToGraphicsMeshBehavior ClassType; auto setter = (void(ClassType::*)(const ParamType&))&ClassType::setIndexMap; setSetter("IndexMapMeshNames", std::bind(setter, this, std::bind(Framework::convert, std::placeholders::_1))); setDecoder("IndexMapMeshNames", std::bind(setter, this, std::bind(&YAML::Node::as, std::placeholders::_1))); } // Enable a setter to take two meshes to create the index map { typedef std::pair, std::shared_ptr> ParamType; typedef TransferPhysicsToGraphicsMeshBehavior ClassType; auto setter = (void(ClassType::*)(const ParamType&))&ClassType::setIndexMap; setSetter("IndexMapMeshes", std::bind(setter, this, std::bind(Framework::convert, std::placeholders::_1))); setDecoder("IndexMapMeshes", std::bind(setter, this, std::bind(&YAML::Node::as, std::placeholders::_1))); } } void TransferPhysicsToGraphicsMeshBehavior::setSource(const std::shared_ptr& source) { SURGSIM_ASSERT(nullptr != source) << " 'source' can not be nullptr."; m_source = checkAndConvert( source, "Physics::DeformableRepresentation"); } void TransferPhysicsToGraphicsMeshBehavior::setTarget(const std::shared_ptr& target) { SURGSIM_ASSERT(nullptr != target) << " 'target' can not be nullptr."; m_target = checkAndConvert( target, "Graphics::MeshRepresentation"); } std::shared_ptr TransferPhysicsToGraphicsMeshBehavior::getSource() const { return m_source; } std::shared_ptr TransferPhysicsToGraphicsMeshBehavior::getTarget() const { return m_target; } void TransferPhysicsToGraphicsMeshBehavior::update(double dt) { auto state = m_source->getFinalState(); if (m_indexMap.empty()) { auto mesh = m_target->getMesh(); for (size_t nodeId = 0; nodeId < state->getNumNodes(); ++nodeId) { mesh->setVertexPosition(nodeId, state->getPosition(nodeId)); } } else { auto mesh = m_target->getMesh(); for (const auto& mapping : m_indexMap) { mesh->setVertexPosition(mapping.second, state->getPosition(mapping.first)); } } m_target->getMesh()->dirty(); } bool TransferPhysicsToGraphicsMeshBehavior::doInitialize() { return true; } bool TransferPhysicsToGraphicsMeshBehavior::doWakeUp() { auto state = m_source->getFinalState(); auto target = m_target->getMesh(); if (target->getNumVertices() == 0) { for (size_t nodeId = 0; nodeId < state->getNumNodes(); ++nodeId) { Graphics::Mesh::VertexType vertex(state->getPosition(nodeId)); target->addVertex(vertex); } } return true; } void TransferPhysicsToGraphicsMeshBehavior::setIndexMap( const std::shared_ptr& source, const std::shared_ptr& target) { setIndexMap(generateIndexMap(source, target)); } void TransferPhysicsToGraphicsMeshBehavior::setIndexMap(const std::string& sourceName , const std::string& targetName) { auto source = std::make_shared(); source->load(sourceName); auto target = std::make_shared(); target->load(targetName); setIndexMap(source, target); } void TransferPhysicsToGraphicsMeshBehavior::setIndexMap(const std::pair& fileName) { setIndexMap(fileName.first, fileName.second); } void TransferPhysicsToGraphicsMeshBehavior::setIndexMap( const std::pair, std::shared_ptr>& meshes) { auto first = std::dynamic_pointer_cast(meshes.first); auto second = std::dynamic_pointer_cast(meshes.second); SURGSIM_ASSERT(first != nullptr) << "Incoming first asset not TriangleMeshPlain"; SURGSIM_ASSERT(second != nullptr) << "Incoming second asset not TriangleMeshPlain"; setIndexMap(first, second); } void TransferPhysicsToGraphicsMeshBehavior::setIndexMap(const std::vector>& indexMap) { m_indexMap = indexMap; } const std::vector> TransferPhysicsToGraphicsMeshBehavior::getIndexMap() const { return m_indexMap; } std::vector> generateIndexMap( const std::shared_ptr& source, const std::shared_ptr& target) { auto logger = Framework::Logger::getLogger("Blocks/TransferPhysicsToGraphicsMeshBehavior"); SURGSIM_LOG_INFO(logger) << "Building map"; SURGSIM_ASSERT(source->getNumVertices() > 0 && target->getNumVertices() > 0) << "Can't build correspondence map, meshes are missing vertices"; // Caclulate AABB for Mesh const auto& vertices = target->getVertices(); Math::Aabbd bounds; for (const auto& vertex : vertices) { bounds.extend(vertex.position); } bounds.extend(bounds.max() + Math::Vector3d(0.1, 0.1, 0.1)); bounds.extend(bounds.min() - Math::Vector3d(0.1, 0.1, 0.1)); // Add All vertices to grid // 100 Seems like a reasonable value ... Math::Vector3d cellSize(bounds.diagonal() / 100.0); DataStructures::Grid grid(cellSize, bounds); size_t index = 0; for (const auto& vertex : vertices) { grid.addElement(index++, vertex.position); } std::vector> indexMap; // For each state node query grid for neighbors indexMap.reserve(target->getNumVertices()); for (size_t nodeId = 0; nodeId < source->getNumVertices(); ++nodeId) { bool hasNeighbors = false; const auto& position = source->getVertexPosition(nodeId); // make a copy const std::vector& neighbors = grid.getNeighbors(position); // For each neighbor check if same, if yes add to map for (auto neighborIndex : neighbors) { if (position.isApprox(vertices[neighborIndex].position)) { indexMap.push_back(std::make_pair(nodeId, neighborIndex)); hasNeighbors = true; } } if (!hasNeighbors) { SURGSIM_LOG_WARNING(logger) << "No coincident point found for node with index " << index; } } return indexMap; } }; //namespace Blocks }; //namespace SurgSimopensurgsim-0.7.0/SurgSim/Blocks/TransferPhysicsToGraphicsMeshBehavior.h000066400000000000000000000120251277777236100265030ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_BLOCKS_TRANSFERPHYSICSTOGRAPHICSMESHBEHAVIOR_H #define SURGSIM_BLOCKS_TRANSFERPHYSICSTOGRAPHICSMESHBEHAVIOR_H #include "SurgSim/DataStructures/TriangleMesh.h" #include "SurgSim/Framework/Behavior.h" #include "SurgSim/Framework/Macros.h" namespace SurgSim { namespace Framework { class Component; class Asset; } namespace Graphics { class MeshRepresentation; } namespace Physics { class DeformableRepresentation; } namespace Blocks { SURGSIM_STATIC_REGISTRATION(TransferPhysicsToGraphicsMeshBehavior); /// Behavior to copy positions of a PhysicsRepresentation to a GraphicsMesh. /// By default the behavior will take each node and copy the position of that node to the vertex with the corresponding /// index. If an index map is available, for each pair in the index map it will take the nodeId from the first /// member of the pair and copy it to the vertex with the id of the second member of the pair. /// The index map can be computed from meshes given to this behavior or precomputed via other means. class TransferPhysicsToGraphicsMeshBehavior : public Framework::Behavior { public: /// Constructor /// \param name Name of the behavior explicit TransferPhysicsToGraphicsMeshBehavior(const std::string& name); SURGSIM_CLASSNAME(SurgSim::Blocks::TransferPhysicsToGraphicsMeshBehavior); /// Set the representation from which the positions are from /// \param source The physics representation void setSource(const std::shared_ptr& source); /// Set the representation which will receive the positions /// \param target The Graphics Mesh representation void setTarget(const std::shared_ptr& target); /// Get the Physics representation which sends the positions /// \return The Physics representation which produces positions. std::shared_ptr getSource() const; /// Get the Graphics representation which receives the positions /// \return The Graphics Mesh representation which receives positions. std::shared_ptr getTarget() const; /// Generate a mapping, for each point in source find the points target that coincide /// \param source Source of search /// \param target Target of search /// \note source and target need to be triangle meshes void setIndexMap( const std::shared_ptr& source, const std::shared_ptr& target); /// Generate a mapping, for each point in source find the points target that coincide /// \param sourceFile filename for source mesh /// \param targetFile filename for target mesh /// \note sourceFile and targetFile need to be valid ply files void setIndexMap(const std::string& sourceFile, const std::string& targetFile); /// Set the mapping to be used if not empty. first index is the node, second index is the vertex. /// for all pairs copy node position to given vertex index. /// \param indexMap mapping to be used for this mesh void setIndexMap(const std::vector>& indexMap); /// \return the current mapping const std::vector> getIndexMap() const; void update(double dt) override; private: bool doInitialize() override; bool doWakeUp() override; void setIndexMap(const std::pair& fileName); void setIndexMap(const std::pair, std::shared_ptr>& meshes); /// The DeformableRepresentation from which the Ode state comes. std::shared_ptr m_source; /// The Graphics Mesh Representation to which the vertices' positions are set. std::shared_ptr m_target; /// The mapping to be used if not empty. std::vector> m_indexMap; }; /// Generate a mapping, for each point in source find the points target that coincide /// \param source Source of search /// \param target Target of search /// \note source and target need to be triangle meshes /// \return the map of matching points, pair.first are all points from source, pair.second will be points in target std::vector> generateIndexMap( const std::shared_ptr& source, const std::shared_ptr& target); }; // namespace Blocks }; // namespace SurgSim #endif // SURGSIM_BLOCKS_TRANSFERPHYSICSTOGRAPHICSMESHBEHAVIOR_Hopensurgsim-0.7.0/SurgSim/Blocks/TransferPhysicsToPointCloudBehavior.cpp000066400000000000000000000067141277777236100265510ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Blocks/TransferPhysicsToPointCloudBehavior.h" #include "SurgSim/Framework/Component.h" #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Framework/ObjectFactory.h" #include "SurgSim/DataStructures/Vertex.h" #include "SurgSim/DataStructures/Vertices.h" #include "SurgSim/Graphics/OsgPointCloudRepresentation.h" #include "SurgSim/Math/OdeState.h" #include "SurgSim/Physics/DeformableRepresentation.h" using SurgSim::Framework::checkAndConvert; namespace SurgSim { namespace Blocks { SURGSIM_REGISTER(SurgSim::Framework::Component, SurgSim::Blocks::TransferPhysicsToPointCloudBehavior, TransferPhysicsToPointCloudBehavior); TransferPhysicsToPointCloudBehavior::TransferPhysicsToPointCloudBehavior(const std::string& name) : SurgSim::Framework::Behavior(name) { SURGSIM_ADD_SERIALIZABLE_PROPERTY(TransferPhysicsToPointCloudBehavior, std::shared_ptr, Source, getSource, setSource); SURGSIM_ADD_SERIALIZABLE_PROPERTY(TransferPhysicsToPointCloudBehavior, std::shared_ptr, Target, getTarget, setTarget); } void TransferPhysicsToPointCloudBehavior::setSource(const std::shared_ptr& source) { SURGSIM_ASSERT(nullptr != source) << "'source' can not be nullptr."; m_source = checkAndConvert( source, "SurgSim::Physics::DeformableRepresentation"); } void TransferPhysicsToPointCloudBehavior::setTarget(const std::shared_ptr& target) { SURGSIM_ASSERT(nullptr != target) << "'target' can not be nullptr."; m_target = checkAndConvert( target, "SurgSim::Graphics::PointCloudRepresentation"); } std::shared_ptr TransferPhysicsToPointCloudBehavior::getSource() const { return m_source; } std::shared_ptr TransferPhysicsToPointCloudBehavior::getTarget() const { return m_target; } void TransferPhysicsToPointCloudBehavior::update(double dt) { auto state = m_source->getFinalState(); auto target = m_target->getVertices(); for (size_t nodeId = 0; nodeId < state->getNumNodes(); ++nodeId) { target->setVertexPosition(nodeId, state->getPosition(nodeId)); } } bool TransferPhysicsToPointCloudBehavior::doInitialize() { return true; } bool TransferPhysicsToPointCloudBehavior::doWakeUp() { auto state = m_source->getFinalState(); auto target = m_target->getVertices(); if (target->getNumVertices() == 0) { for (size_t nodeId = 0; nodeId < state->getNumNodes(); ++nodeId) { SurgSim::Graphics::PointCloud::VertexType vertex(state->getPosition(nodeId)); target->addVertex(vertex); } } return true; } }; //namespace Blocks }; //namespace SurgSim opensurgsim-0.7.0/SurgSim/Blocks/TransferPhysicsToPointCloudBehavior.h000066400000000000000000000054241277777236100262130ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_BLOCKS_TRANSFERPHYSICSTOPOINTCLOUDBEHAVIOR_H #define SURGSIM_BLOCKS_TRANSFERPHYSICSTOPOINTCLOUDBEHAVIOR_H #include "SurgSim/Framework/Behavior.h" #include "SurgSim/Framework/Macros.h" namespace SurgSim { namespace Framework { class Component; } namespace Graphics { class PointCloudRepresentation; } namespace Physics { class DeformableRepresentation; } namespace Blocks { SURGSIM_STATIC_REGISTRATION(TransferPhysicsToPointCloudBehavior); /// Behavior to copy positions of a PhysicsRepresentation to a PointCloud. class TransferPhysicsToPointCloudBehavior : public SurgSim::Framework::Behavior { public: /// Constructor /// \param name Name of the behavior explicit TransferPhysicsToPointCloudBehavior(const std::string& name); SURGSIM_CLASSNAME(SurgSim::Blocks::TransferPhysicsToPointCloudBehavior); /// Set the representation from which the positions are from /// \param source The physics representation void setSource(const std::shared_ptr& source); /// Set the point cloud representation which will receive the positions /// \param target The Graphics PointCloud representation void setTarget(const std::shared_ptr& target); /// Get the Physics representation which sends the positions /// \return The Physics representation which produces positions. std::shared_ptr getSource() const; /// Get the point cloud representation which receives the positions /// \return The Graphics PointCloud representation which receives positions. std::shared_ptr getTarget() const; void update(double dt) override; private: bool doInitialize() override; bool doWakeUp() override; /// The DeformableRepresentation from which the Ode state comes. std::shared_ptr m_source; /// The Graphics PointCloud Representation to which the vertices' positions are set. std::shared_ptr m_target; }; }; // namespace Blocks }; // namespace SurgSim #endif // SURGSIM_BLOCKS_TRANSFERPHYSICSTOPOINTCLOUDBEHAVIOR_Hopensurgsim-0.7.0/SurgSim/Blocks/TransferPhysicsToVerticesBehavior.cpp000066400000000000000000000050741277777236100262530ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Blocks/TransferPhysicsToVerticesBehavior.h" #include "SurgSim/Framework/Component.h" #include "SurgSim/Math/OdeState.h" #include "SurgSim/Physics/DeformableRepresentation.h" namespace SurgSim { namespace Blocks { TransferPhysicsToVerticesBehavior::TransferPhysicsToVerticesBehavior(const std::string& name) : Framework::Behavior(name) { } void TransferPhysicsToVerticesBehavior::setSource(const std::shared_ptr& source) { SURGSIM_ASSERT(nullptr != source) << "'source' can not be nullptr."; m_source = Framework::checkAndConvert( source, "SurgSim::Physics::DeformableRepresentation"); } void TransferPhysicsToVerticesBehavior::setTarget(const std::shared_ptr& target) { SURGSIM_ASSERT(nullptr != target) << "'target' can not be nullptr."; SURGSIM_ASSERT(target->isWriteable("Vertices")) << "'target'" << target->getFullName() << "needs to accept 'Vertices'"; m_target = target; } std::shared_ptr TransferPhysicsToVerticesBehavior::getSource() const { return m_source; } std::shared_ptr TransferPhysicsToVerticesBehavior::getTarget() const { return m_target; } void TransferPhysicsToVerticesBehavior::update(double dt) { auto state = m_source->getFinalState(); for (size_t nodeId = 0; nodeId < state->getNumNodes(); ++nodeId) { m_vertices.setVertexPosition(nodeId, state->getPosition(nodeId)); } m_target->setValue("Vertices", m_vertices); } bool TransferPhysicsToVerticesBehavior::doInitialize() { return true; } bool TransferPhysicsToVerticesBehavior::doWakeUp() { if (m_vertices.getNumVertices() == 0) { auto state = m_source->getFinalState(); for (size_t nodeId = 0; nodeId < state->getNumNodes(); ++nodeId) { DataStructures::VerticesPlain::VertexType vertex(state->getPosition(nodeId)); m_vertices.addVertex(std::move(vertex)); } } return true; } } } opensurgsim-0.7.0/SurgSim/Blocks/TransferPhysicsToVerticesBehavior.h000066400000000000000000000054141277777236100257160ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_BLOCKS_TRANSFERPHYSICSTOVERTICESBEHAVIOR_H #define SURGSIM_BLOCKS_TRANSFERPHYSICSTOVERTICESBEHAVIOR_H #include "SurgSim/DataStructures/EmptyData.h" #include "SurgSim/DataStructures/Vertices.h" #include "SurgSim/Framework/Behavior.h" namespace SurgSim { namespace Physics { class DeformableRepresentation; } namespace Graphics { class CurveRepresentation; } namespace Blocks { /// Transfer Physics State to any representation that has a Vertices property, the "Vertices" property on the targets /// side needs to accept DataStructures::VerticesPlain for the type. class TransferPhysicsToVerticesBehavior : public Framework::Behavior { public: /// Constructor /// \param name Name of the behavior explicit TransferPhysicsToVerticesBehavior(const std::string& name); /// \return the source representation of this behavior std::shared_ptr getSource() const; /// Sets the source for this behavior, all the positions from the state of the source /// will be copied into a Vertices object and set in the target, using setValue("Vertices") /// \param source the component that is the source void setSource(const std::shared_ptr& source); /// \return the target representation of this behavior std::shared_ptr getTarget() const; /// Sets the target for this behavior, it needs to have a "Vertices" property that takes /// DataStructures::VerticesPlain as a parameter /// \throws if target does not have a "Vertices" property /// \param target the representation to be used as a target void setTarget(const std::shared_ptr& target); /// override update /// \throws if the type of the "Vertices" property on the target is not DataStructures::VerticesPlain void update(double dt) override; bool doInitialize() override; bool doWakeUp() override; private: std::shared_ptr m_source; ///@< Source representation std::shared_ptr m_target; ///@< Target representation /// vertices structure that is used for the update DataStructures::VerticesPlain m_vertices; }; } } #endif opensurgsim-0.7.0/SurgSim/Blocks/UnitTests/000077500000000000000000000000001277777236100206645ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Blocks/UnitTests/CMakeLists.txt000066400000000000000000000034261277777236100234310ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2012-2016, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. include_directories ( ${gtest_SOURCE_DIR}/include ${gmock_SOURCE_DIR}/include ) set(UNIT_TEST_SOURCES CompoundShapeToGraphicsTests.cpp DriveElementFromInputBehaviorTests.cpp FunctionBehaviorTests.cpp KeyBehaviorTests.cpp KeyboardCallbackBehaviorTests.cpp KeyboardTogglesComponentBehaviorTests.cpp MassSpring1DRepresentationTests.cpp MassSpring2DRepresentationTests.cpp MassSpring3DRepresentationTests.cpp MassSpringNDRepresentationUtilsTests.cpp PoseInterpolatorTests.cpp SingleKeyBehaviorTests.cpp SpringTestUtils.cpp TransferParticlesToPointCloudBehaviorTests.cpp TransferPhysicsToGraphicsMeshBehaviorTests.cpp TransferPhysicsToPointCloudBehaviorTests.cpp VisualizeConstraintsTest.cpp VisualizeContactsBehaviorTests.cpp ) set(UNIT_TEST_HEADERS SpringTestUtils.h ) # Configure the path for the data files configure_file( "${CMAKE_CURRENT_SOURCE_DIR}/config.txt.in" "${CMAKE_CURRENT_BINARY_DIR}/config.txt" ) set(LIBS IdentityPoseDevice SurgSimBlocks SurgSimGraphics ) file(COPY Data DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) surgsim_add_unit_tests(SurgSimBlocksTest) set_target_properties(SurgSimBlocksTest PROPERTIES FOLDER "Blocks") opensurgsim-0.7.0/SurgSim/Blocks/UnitTests/CompoundShapeToGraphicsTests.cpp000066400000000000000000000162461277777236100271550ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Blocks/CompoundShapeToGraphics.h" #include "SurgSim/Collision/ShapeCollisionRepresentation.h" #include "SurgSim/Framework/BasicSceneElement.h" #include "SurgSim/Framework/Component.h" #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Framework/Scene.h" #include "SurgSim/Graphics/OsgSceneryRepresentation.h" #include "SurgSim/Math/CompoundShape.h" #include "SurgSim/Math/BoxShape.h" #include "SurgSim/Math/MathConvert.h" #include "SurgSim/Physics/FixedRepresentation.h" #include namespace SurgSim { namespace Blocks { TEST(CompoundShapeToGraphicsTests, Init) { EXPECT_NO_THROW(std::make_shared("Copier")); } TEST(CompoundShapeToGraphicsTests, SetShape) { auto shape = std::make_shared(); auto behavior = std::make_shared("Copier"); EXPECT_EQ(nullptr, behavior->getShape()); EXPECT_NO_THROW(behavior->setShape(shape)); EXPECT_EQ(shape, behavior->getShape()); // With shape set, setting Source will fail. auto physics = std::make_shared("Physics"); EXPECT_ANY_THROW(behavior->setSource(physics)); } TEST(CompoundShapeToGraphicsTests, SetSource) { auto behavior = std::make_shared("Copier"); auto physics = std::make_shared("Physics"); auto collisions = std::make_shared("Physics"); auto graphics = std::make_shared("Graphics"); EXPECT_NO_THROW(behavior->setSource(physics)); EXPECT_EQ(physics, behavior->getSource()); EXPECT_NO_THROW(behavior->setSource(collisions)); EXPECT_EQ(collisions, behavior->getSource()); EXPECT_ANY_THROW(behavior->setSource(graphics)); // With Source being set, setting Shape will fail. auto shape = std::make_shared(); EXPECT_ANY_THROW(behavior->setShape(shape)); } TEST(CompoundShapeToGraphicsTests, Serialization) { std::shared_ptr behavior; EXPECT_NO_THROW( behavior = SurgSim::Framework::Component::getFactory().create("SurgSim::Blocks::CompoundShapeToGraphics", "newCopier")); auto behavior2 = std::make_shared("Copier"); auto graphics = std::make_shared("Graphics"); std::shared_ptr compoundShape = std::make_shared(); std::shared_ptr physics = std::make_shared("Physics"); std::vector> targets; targets.push_back(graphics); targets.push_back(graphics); targets.push_back(graphics); EXPECT_NO_THROW(behavior->setValue("Targets", targets)); EXPECT_NO_THROW(behavior->setValue("Source", physics)); EXPECT_NO_THROW(behavior2->setValue("Targets", targets)); EXPECT_NO_THROW(behavior2->setValue("Shape", compoundShape)); EXPECT_EQ(3u, behavior->getValue>>("Targets").size()); EXPECT_EQ(physics, behavior->getValue>("Source")); EXPECT_EQ(compoundShape, behavior2->getValue>("Shape")); YAML::Node node; // Shape is not set on 'behavior', serialization should fail. EXPECT_ANY_THROW(node = YAML::convert::encode(*behavior)); EXPECT_NO_THROW(node = YAML::convert::encode(*behavior2)); EXPECT_EQ(6u, node[behavior2->getClassName()].size()); std::shared_ptr newBehavior; EXPECT_NO_THROW(newBehavior = std::dynamic_pointer_cast( node.as>())); EXPECT_EQ(3u, newBehavior->getValue>>("Targets").size()); EXPECT_NE(nullptr, newBehavior->getValue>("Shape")); } TEST(CompoundShapeToGraphicsTests, SetGraphics) { auto behavior = std::make_shared("Copier"); EXPECT_EQ(0u, behavior->getTargets().size()); auto graphics = std::make_shared("One"); auto physics = std::make_shared("Invalid"); EXPECT_NO_THROW(behavior->addTarget(graphics)); EXPECT_EQ(1u, behavior->getTargets().size()); EXPECT_ANY_THROW(behavior->addTarget(physics)); EXPECT_EQ(1u, behavior->getTargets().size()); std::vector> targets; targets.push_back(graphics); targets.push_back(graphics); targets.push_back(graphics); EXPECT_NO_THROW(behavior->setTargets(targets)); EXPECT_EQ(3u, behavior->getTargets().size()); } TEST(CompoundShapeToGraphicsTests, SetSourceWithValidShape) { auto runtime = std::make_shared(); auto element = std::make_shared("Element"); auto behavior = std::make_shared("Copier"); auto physics = std::make_shared("Physics"); auto shape = std::make_shared(); physics->setShape(shape); behavior->setSource(physics); element->addComponent(physics); element->addComponent(behavior); runtime->getScene()->addSceneElement(element); EXPECT_NO_THROW(behavior->wakeUp()); EXPECT_EQ(shape, behavior->getShape()); } TEST(CompoundShapeToGraphicsTests, SetSourceWithInvalidShape) { auto runtime = std::make_shared(); auto element = std::make_shared("Element"); auto behavior = std::make_shared("Copier"); auto collision = std::make_shared("Collisions"); auto shape = std::make_shared(); EXPECT_ANY_THROW(behavior->setShape(shape)); collision->setShape(shape); behavior->setSource(collision); element->addComponent(collision); element->addComponent(behavior); runtime->getScene()->addSceneElement(element); EXPECT_ANY_THROW(behavior->wakeUp()); } TEST(CompoundShapeToGraphicsTests, SetSourceWithoutShape) { auto runtime = std::make_shared(); auto element = std::make_shared("Element"); auto behavior = std::make_shared("Copier"); auto collision = std::make_shared("Collisions"); behavior->setSource(collision); element->addComponent(collision); element->addComponent(behavior); runtime->getScene()->addSceneElement(element); EXPECT_ANY_THROW(behavior->wakeUp()); } } }opensurgsim-0.7.0/SurgSim/Blocks/UnitTests/Data/000077500000000000000000000000001277777236100215355ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Blocks/UnitTests/Data/TransferPhysicsToGraphicsMeshBehavior/000077500000000000000000000000001277777236100311455ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Blocks/UnitTests/Data/TransferPhysicsToGraphicsMeshBehavior/data.ply000066400000000000000000000004441277777236100326060ustar00rootroot00000000000000ply format ascii 1.0 comment Created by hand element vertex 4 property float x property float y property float z element face 0 property list uchar uint vertex_indices end_header -0.050000 -0.050000 0.050000 -0.050000 0.050000 0.050000 -0.050000 0.050000 -0.050000 0.050000 0.050000 0.050000 opensurgsim-0.7.0/SurgSim/Blocks/UnitTests/Data/TransferPhysicsToGraphicsMeshBehavior/data_more.ply000066400000000000000000000011071277777236100336250ustar00rootroot00000000000000ply # contains the following points from data.ply # 0: 0 # 1: 2 # 2: 3 # 3: 4 # and one extra point that will not be connected format ascii 1.0 comment Created by hand element vertex 10 property float x property float y property float z element face 0 property list uchar uint vertex_indices end_header 2.000000 2.000000 2.000000 -0.050000 0.050000 0.050000 -0.050000 0.050000 -0.050000 0.050000 0.050000 0.050000 -0.050000 0.050000 0.050000 -0.050000 0.050000 -0.050000 -0.050000 0.050000 -0.050000 0.050000 0.050000 0.050000 0.050000 0.050000 0.050000 0.050000 0.050000 0.050000 opensurgsim-0.7.0/SurgSim/Blocks/UnitTests/DriveElementFromInputBehaviorTests.cpp000066400000000000000000000115231277777236100303240ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the DriveElementFromInputBehavior class. #include #include #include "SurgSim/Blocks/DriveElementFromInputBehavior.h" #include "SurgSim/Devices/IdentityPoseDevice/IdentityPoseDevice.h" #include "SurgSim/Framework/Assert.h" #include "SurgSim/Framework/BasicSceneElement.h" #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Framework/Scene.h" #include "SurgSim/Input/InputComponent.h" #include "SurgSim/Input/OutputComponent.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Vector.h" using SurgSim::Devices::IdentityPoseDevice; using SurgSim::Input::InputComponent; using SurgSim::Input::OutputComponent; using SurgSim::Framework::BasicSceneElement; using SurgSim::Math::makeRigidTranslation; using SurgSim::Math::RigidTransform3d; using SurgSim::Math::Vector3d; namespace SurgSim { namespace Blocks { TEST(DriveElementFromInputBehaviorTest, Constructor) { EXPECT_NO_THROW(DriveElementFromInputBehavior behavior("DriveElementFromInputBehavior")); } TEST(DriveElementFromInputBehaviorTest, SetGetSource) { auto behavior = std::make_shared("DriveElementFromInputBehavior"); EXPECT_EQ(nullptr, behavior->getSource()); auto invalidInputComponent = std::make_shared("InvalidInputComponent"); EXPECT_THROW(behavior->setSource(invalidInputComponent), SurgSim::Framework::AssertionFailure); auto inputComponent = std::make_shared("InputComponent"); EXPECT_NO_THROW(behavior->setSource(inputComponent)); EXPECT_EQ(inputComponent, behavior->getSource()); } TEST(DriveElementFromInputBehaviorTest, SetGetName) { auto behavior = std::make_shared("DriveElementFromInputBehavior"); EXPECT_EQ("pose", behavior->getPoseName()); behavior->setPoseName("new_name"); EXPECT_EQ("new_name", behavior->getPoseName()); } TEST(DriveElementFromInputBehaviorTest, Update) { auto runtime = std::make_shared(); auto scene = runtime->getScene(); auto behavior = std::make_shared("DriveElementFromInputBehavior"); auto element = std::make_shared("SceneElement"); auto device = std::make_shared("IdentityPoseDevice"); auto inputComponent = std::make_shared("InputComponent"); device->addInputConsumer(inputComponent); behavior->setSource(inputComponent); element->addComponent(behavior); element->addComponent(inputComponent); scene->addSceneElement(element); behavior->wakeUp(); inputComponent->wakeUp(); element->setPose(makeRigidTranslation(Vector3d(-1.0, -2.0, -3.0))); behavior->update(0.1); EXPECT_TRUE(element->getPose().isApprox(RigidTransform3d::Identity())); RigidTransform3d inputOffset = makeRigidTranslation(Vector3d(10.0, 20.0, 30.0)); inputComponent->setLocalPose(inputOffset); behavior->update(0.1); EXPECT_TRUE(element->getPose().isApprox(inputOffset)); } TEST(DriveElementFromInputBehaviorTest, Serialization) { auto behavior = std::make_shared("DriveElementFromInputBehavior"); EXPECT_EQ("SurgSim::Blocks::DriveElementFromInputBehavior", behavior->getClassName()); auto inputComponent = std::make_shared("InputComponent"); EXPECT_NO_THROW(behavior->setValue("Source", std::static_pointer_cast(inputComponent))); EXPECT_NO_THROW(behavior->setValue("PoseName", std::string("Test"))); YAML::Node node; EXPECT_NO_THROW(node = YAML::convert::encode(*behavior)); EXPECT_TRUE(node.IsMap()); EXPECT_EQ(5, node[behavior->getClassName()].size()); std::shared_ptr decodedBehavior; EXPECT_NO_THROW(decodedBehavior = std::dynamic_pointer_cast( node.as>())); EXPECT_EQ("InputComponent", SurgSim::Framework::convert>( decodedBehavior->getValue("Source"))->getName()); EXPECT_EQ("Test", SurgSim::Framework::convert(decodedBehavior->getValue("PoseName"))); } }; //namespace Blocks }; //namespace SurgSim opensurgsim-0.7.0/SurgSim/Blocks/UnitTests/FunctionBehaviorTests.cpp000066400000000000000000000070361277777236100256660ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include "SurgSim/Blocks/FunctionBehavior.h" #include "SurgSim/Framework/BasicSceneElement.h" #include "SurgSim/Framework/Runtime.h" namespace { void f1(double dt) { std::cout << dt; } void f2(double dt, double a) { std::cout << dt + a; } }; namespace SurgSim { namespace Blocks { TEST(FunctionBehaviorTest, Constructor) { EXPECT_NO_THROW(FunctionBehavior behavior("Behavior")); } TEST(FunctionBehaviorTest, GetSetTargetManagerType) { auto behavior = std::make_shared("Behavior"); EXPECT_EQ(Framework::MANAGER_TYPE_BEHAVIOR, behavior->getTargetManagerType()); EXPECT_THROW(behavior->setTargetManagerType(-1), Framework::AssertionFailure); EXPECT_NO_THROW(behavior->setTargetManagerType(Framework::MANAGER_TYPE_PHYSICS)); EXPECT_EQ(Framework::MANAGER_TYPE_PHYSICS, behavior->getTargetManagerType()); auto runtime = std::make_shared(); behavior->setFunction([](double dt) { std::cout << dt; }); behavior->initialize(runtime); EXPECT_THROW(behavior->setTargetManagerType(Framework::MANAGER_TYPE_GRAPHICS), Framework::AssertionFailure); } TEST(FunctionBehaviorTest, SetFunction) { auto runtime = std::make_shared(); { auto behavior = std::make_shared("Behavior"); EXPECT_FALSE(behavior->initialize(runtime)); } { auto behavior = std::make_shared("Behavior"); behavior->setFunction([](double dt) { std::cout << dt; }); EXPECT_TRUE(behavior->initialize(runtime)); } } TEST(FunctionBehaviorTest, Update) { size_t numUpdates = 0; auto behavior = std::make_shared("Behavior"); behavior->setFunction([&numUpdates](double dt) { numUpdates++; }); auto runtime = std::make_shared(); behavior->initialize(runtime); behavior->wakeUp(); behavior->update(1.0); behavior->update(1.0); EXPECT_EQ(2, numUpdates); } TEST(FunctionBehaviorTest, ExampleUsage) { auto behavior1 = std::make_shared("Behavior 1"); EXPECT_NO_THROW(behavior1->setTargetManagerType(SurgSim::Framework::MANAGER_TYPE_BEHAVIOR)); EXPECT_NO_THROW(behavior1->setFunction(f1)); auto behavior2 = std::make_shared("Behavior 2"); EXPECT_NO_THROW(behavior2->setTargetManagerType(SurgSim::Framework::MANAGER_TYPE_GRAPHICS)); EXPECT_NO_THROW(behavior2->setFunction(std::bind(f2, std::placeholders::_1, 2.0))); auto behavior3 = std::make_shared("Behavior 3"); EXPECT_NO_THROW(behavior3->setTargetManagerType(SurgSim::Framework::MANAGER_TYPE_PHYSICS)); EXPECT_NO_THROW(behavior3->setFunction([](double dt) { std::cout << dt; })); auto element = std::make_shared("Element"); EXPECT_NO_THROW(element->addComponent(behavior1)); EXPECT_NO_THROW(element->addComponent(behavior2)); EXPECT_NO_THROW(element->addComponent(behavior3)); } }; }; opensurgsim-0.7.0/SurgSim/Blocks/UnitTests/KeyBehaviorTests.cpp000066400000000000000000000117001277777236100246220ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013 - 2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include "SurgSim/Blocks/KeyBehavior.h" #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/DataStructures/DataGroupBuilder.h" #include "SurgSim/DataStructures/NamedData.h" #include "SurgSim/Devices/Keyboard/KeyCode.h" #include "SurgSim/Framework/BasicSceneElement.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Framework/Scene.h" #include "SurgSim/Testing/MockInputComponent.h" namespace SurgSim { namespace Blocks { class MockKeyBehavior : public KeyBehavior { public: explicit MockKeyBehavior(const std::string& name) : KeyBehavior(name) {} MOCK_METHOD1(onKeyDown, void(int)); MOCK_METHOD1(onKeyUp, void(int)); }; class KeyBehaviorTest: public testing::Test { public: void SetUp() { builder.addInteger(DataStructures::Names::KEY); data = builder.createData(); inputComponent = std::make_shared("Input"); inputComponent->setData(data); runtime = std::make_shared(); element = std::make_shared("Element"); runtime->getScene()->addSceneElement(element); element->addComponent(inputComponent); } DataStructures::DataGroupBuilder builder; DataStructures::DataGroup data; std::shared_ptr inputComponent; std::shared_ptr runtime; std::shared_ptr element; }; TEST_F(KeyBehaviorTest, Init) { std::shared_ptr behavior; std::shared_ptr component = inputComponent; ASSERT_NO_THROW(behavior = std::make_shared("Behavior")); EXPECT_NO_THROW(behavior->setValue("InputComponent", component)); auto input = behavior->getValue>("InputComponent"); EXPECT_EQ(inputComponent.get(), input.get()); } TEST_F(KeyBehaviorTest, SetAndGetInputComponent) { auto behavior = std::make_shared("MockSingleKeyBehavior"); auto input = std::make_shared("input"); EXPECT_NO_THROW(behavior->setInputComponent(input)); std::shared_ptr retrievedInputComponent; EXPECT_NO_THROW(retrievedInputComponent = behavior->getInputComponent()); EXPECT_EQ(input, retrievedInputComponent); } TEST_F(KeyBehaviorTest, SimpleTrigger) { auto behavior = std::make_shared("Behavior"); EXPECT_CALL(*behavior, onKeyDown(Devices::KEY_A)); EXPECT_CALL(*behavior, onKeyUp(Devices::KEY_A)); behavior->setInputComponent(inputComponent); element->addComponent(behavior); data.integers().set(DataStructures::Names::KEY, Devices::KeyCode::KEY_A); inputComponent->setData(data); behavior->update(0.0); // Shouldn't trigger another KeyDown .. data.integers().set(DataStructures::Names::KEY, Devices::KeyCode::KEY_A); inputComponent->setData(data); behavior->update(0.0); data.integers().set(DataStructures::Names::KEY, Devices::KeyCode::NONE); inputComponent->setData(data); behavior->update(0.0); // Shouldn't trigger another KeyUp .. behavior->update(0.0); } TEST_F(KeyBehaviorTest, FromOneKeyToAnother) { auto behavior = std::make_shared("Behavior"); EXPECT_CALL(*behavior, onKeyDown(Devices::KEY_A)); EXPECT_CALL(*behavior, onKeyDown(Devices::KEY_B)); EXPECT_CALL(*behavior, onKeyUp(Devices::KEY_A)); EXPECT_CALL(*behavior, onKeyUp(Devices::KEY_B)); behavior->setInputComponent(inputComponent); element->addComponent(behavior); data.integers().set(DataStructures::Names::KEY, Devices::KeyCode::KEY_A); inputComponent->setData(data); behavior->update(0.0); data.integers().set(DataStructures::Names::KEY, Devices::KeyCode::KEY_B); inputComponent->setData(data); behavior->update(0.0); data.integers().set(DataStructures::Names::KEY, Devices::KeyCode::NONE); inputComponent->setData(data); behavior->update(0.0); // Shouldn't trigger another KeyUp .. behavior->update(0.0); } TEST_F(KeyBehaviorTest, Registry) { EXPECT_TRUE(KeyBehavior::registerKey(Devices::KeyCode::KEY_A, "TestFunctionality")); EXPECT_TRUE(KeyBehavior::registerKey(Devices::KeyCode::KEY_B, "OtherFunctionality")); EXPECT_FALSE(KeyBehavior::registerKey(Devices::KeyCode::KEY_A, "TestFunctionality")); KeyBehavior::unregisterKey(Devices::KeyCode::KEY_A); EXPECT_TRUE(KeyBehavior::registerKey(Devices::KeyCode::KEY_A, "TestFunctionality")); KeyBehavior::logMap(); } } } opensurgsim-0.7.0/SurgSim/Blocks/UnitTests/KeyboardCallbackBehaviorTests.cpp000066400000000000000000000060441277777236100272540ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the KeyboardCallbackBehavior class. #include #include #include "SurgSim/Blocks/KeyboardCallbackBehavior.h" #include "SurgSim/DataStructures/DataStructuresConvert.h" #include "SurgSim/Framework/Component.h" #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Input/InputComponent.h" #include "SurgSim/Input/OutputComponent.h" using SurgSim::Blocks::KeyboardCallbackBehavior; using SurgSim::Devices::KeyCode; using SurgSim::Framework::Component; using SurgSim::Input::InputComponent; using SurgSim::Input::OutputComponent; TEST(KeyboardCallbackBehavior, Constructor) { EXPECT_NO_THROW(KeyboardCallbackBehavior behavior("KeyboardCallbackBehavior")); } TEST(KeyboardCallbackBehavior, InputComponentTests) { auto keyboardCallbackBehavior = std::make_shared("KeyboardCallbackBehavior"); { auto invalidInputComponent = std::make_shared("InvalidInputComponent"); EXPECT_ANY_THROW(keyboardCallbackBehavior->setInputComponent(invalidInputComponent)); } { auto inputComponent = std::make_shared("InputComponent"); EXPECT_NO_THROW(keyboardCallbackBehavior->setInputComponent(inputComponent)); EXPECT_EQ(inputComponent, keyboardCallbackBehavior->getInputComponent()); } } TEST(KeyboardCallbackBehavior, Serialization) { auto keyboardCallbackBehavior = std::make_shared("KeyboardCallbackBehavior"); std::shared_ptr inputComponent = std::make_shared("InputComponent"); int keyValue = static_cast(KeyCode::KEY_A); keyboardCallbackBehavior->setValue("ActionKey", keyValue); keyboardCallbackBehavior->setValue("InputComponent", inputComponent); YAML::Node node; EXPECT_NO_THROW(node = YAML::convert::encode(*keyboardCallbackBehavior)); EXPECT_TRUE(node.IsMap()); EXPECT_EQ(5, node[keyboardCallbackBehavior->getClassName()].size()); std::shared_ptr newKeyboardCallbackBehavior; EXPECT_NO_THROW(newKeyboardCallbackBehavior = std::dynamic_pointer_cast( node.as>())); ASSERT_NE(nullptr, newKeyboardCallbackBehavior); EXPECT_NE(nullptr, newKeyboardCallbackBehavior->getValue>("InputComponent")); int newKeyValue = newKeyboardCallbackBehavior->getValue("ActionKey"); EXPECT_EQ(newKeyValue, keyValue); } opensurgsim-0.7.0/SurgSim/Blocks/UnitTests/KeyboardTogglesComponentBehaviorTests.cpp000066400000000000000000000163551277777236100310550ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the KeyboardTogglesComponentBehavior class. #include #include #include #include "SurgSim/Blocks/KeyboardTogglesComponentBehavior.h" #include "SurgSim/DataStructures/DataStructuresConvert.h" #include "SurgSim/Framework/Component.h" #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Graphics/OsgBoxRepresentation.h" #include "SurgSim/Input/InputComponent.h" #include "SurgSim/Input/OutputComponent.h" using SurgSim::Blocks::KeyboardTogglesComponentBehavior; using SurgSim::Devices::KeyCode; using SurgSim::Framework::Component; using SurgSim::Graphics::OsgBoxRepresentation; using SurgSim::Graphics::Representation; using SurgSim::Input::InputComponent; using SurgSim::Input::OutputComponent; TEST(KeyboardTogglesComponentBehavior, Constructor) { EXPECT_NO_THROW(KeyboardTogglesComponentBehavior behavior("KeyboardTogglesComponentBehavior")); } TEST(KeyboardTogglesComponentBehavior, InputComponentTests) { auto keyboardTogglesComponentBehavior = std::make_shared("KeyboardTogglesComponentBehavior"); { auto invalidInputComponent = std::make_shared("InvalidInputComponent"); EXPECT_ANY_THROW(keyboardTogglesComponentBehavior->setInputComponent(invalidInputComponent)); } { auto inputComponent = std::make_shared("InputComponent"); EXPECT_NO_THROW(keyboardTogglesComponentBehavior->setInputComponent(inputComponent)); EXPECT_EQ(inputComponent, keyboardTogglesComponentBehavior->getInputComponent()); } } TEST(KeyboardTogglesComponentBehavior, RegistrationTests) { auto keyboardTogglesComponentBehavior = std::make_shared("KeyboardTogglesComponentBehavior"); { auto graphics = std::make_shared("Graphics"); auto graphics2 = std::make_shared("Graphics2"); auto graphics3 = std::make_shared("Graphics3"); keyboardTogglesComponentBehavior->registerKey(KeyCode::KEY_A, graphics); keyboardTogglesComponentBehavior->registerKey(KeyCode::KEY_A, graphics2); keyboardTogglesComponentBehavior->registerKey(KeyCode::KEY_B, graphics3); auto keyMap = keyboardTogglesComponentBehavior->getKeyboardRegistry(); auto keyAPair = keyMap.find(KeyCode::KEY_A); auto keyBPair = keyMap.find(KeyCode::KEY_B); EXPECT_EQ(2u, keyAPair->second.size()); EXPECT_EQ(1u, keyBPair->second.size()); EXPECT_NE(std::end(keyAPair->second), keyAPair->second.find(graphics)); EXPECT_NE(std::end(keyAPair->second), keyAPair->second.find(graphics2)); EXPECT_NE(std::end(keyBPair->second), keyBPair->second.find(graphics3)); } } TEST(KeyboardTogglesComponentBehavior, SetAndGetKeyboardRegisterTypeTest) { auto keyboardTogglesComponentBehavior = std::make_shared("KeyboardTogglesComponentBehavior"); std::shared_ptr graphics1 = std::make_shared("graphics1"); std::shared_ptr graphics2 = std::make_shared("graphics2"); std::shared_ptr graphics3 = std::make_shared("graphics3"); std::unordered_set> set1; std::unordered_set> set2; set1.insert(graphics1); set2.insert(graphics2); set2.insert(graphics3); KeyboardTogglesComponentBehavior::KeyboardRegistryType keyMap; keyMap[KeyCode::KEY_A] = set1; keyMap[KeyCode::KEY_B] = set2; EXPECT_NO_THROW(keyboardTogglesComponentBehavior->setKeyboardRegistry(keyMap)); auto retrievedKeyMap = keyboardTogglesComponentBehavior->getKeyboardRegistry(); EXPECT_EQ(keyMap.size(), retrievedKeyMap.size()); for (auto it = std::begin(keyMap); it != std::end(keyMap); ++it) { auto componentSet = retrievedKeyMap.find(it->first)->second; EXPECT_EQ(it->second.size(), componentSet.size()); for (auto item = std::begin(it->second); item != std::end(it->second); ++item) { auto match = std::find_if(std::begin(componentSet), std::end(componentSet), [&item](const std::shared_ptr rep) { return rep->getName() == (*item)->getName(); }); EXPECT_NE(std::end(componentSet), match); } } } TEST(KeyboardTogglesComponentBehavior, Serialization) { auto keyboardTogglesComponentBehavior = std::make_shared("KeyboardTogglesComponentBehavior"); std::shared_ptr inputComponent = std::make_shared("InputComponent"); std::shared_ptr graphics1 = std::make_shared("graphics1"); std::shared_ptr graphics2 = std::make_shared("graphics2"); std::unordered_set> set1; std::unordered_set> set2; set1.insert(graphics1); set2.insert(graphics2); KeyboardTogglesComponentBehavior::KeyboardRegistryType keyMap; keyMap[KeyCode::KEY_A] = set1; keyMap[KeyCode::KEY_B] = set2; keyboardTogglesComponentBehavior->setValue("KeyboardRegistry", keyMap); keyboardTogglesComponentBehavior->setValue("InputComponent", inputComponent); YAML::Node node; EXPECT_NO_THROW(node = YAML::convert::encode(*keyboardTogglesComponentBehavior)); EXPECT_TRUE(node.IsMap()); EXPECT_EQ(5, node[keyboardTogglesComponentBehavior->getClassName()].size()); std::shared_ptr newKeyboardTogglesComponentBehavior; EXPECT_NO_THROW(newKeyboardTogglesComponentBehavior = std::dynamic_pointer_cast( node.as>())); ASSERT_NE(nullptr, newKeyboardTogglesComponentBehavior); EXPECT_NE(nullptr, newKeyboardTogglesComponentBehavior->getValue< std::shared_ptr>("InputComponent")); // Make sure every registered representation in the original 'keyMap' is present in the de-serialized keyMap. auto retrievedKeyMap = newKeyboardTogglesComponentBehavior->getValue< KeyboardTogglesComponentBehavior::KeyboardRegistryType>("KeyboardRegistry"); EXPECT_EQ(keyMap.size(), retrievedKeyMap.size()); for (auto it = std::begin(keyMap); it != std::end(keyMap); ++it) { auto componentSet = retrievedKeyMap.find(it->first)->second; EXPECT_EQ(it->second.size(), componentSet.size()); for (auto item = std::begin(it->second); item != std::end(it->second); ++item) { auto match = std::find_if(std::begin(componentSet), std::end(componentSet), [&item](const std::shared_ptr rep) { return rep->getName() == (*item)->getName(); }); EXPECT_NE(std::end(componentSet), match); } } } opensurgsim-0.7.0/SurgSim/Blocks/UnitTests/MassSpring1DRepresentationTests.cpp000066400000000000000000000101241277777236100276070ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the MassSpring1DRepresentation class. #include #include "SurgSim/Blocks/MassSpring1DRepresentation.h" #include "SurgSim/Blocks/UnitTests/SpringTestUtils.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Math/OdeState.h" #include "SurgSim/Physics/LinearSpring.h" using SurgSim::Math::Vector3d; using SurgSim::Physics::LinearSpring; using SurgSim::Blocks::MassSpring1DRepresentation; using SurgSim::Blocks::springTest; TEST(MassSpring1DRepresentationTests, init1DTest) { MassSpring1DRepresentation m("MassSpring1D"); std::array extremities = {{ Vector3d(1.1, 1.2, 1.3), Vector3d(2.2, 2.3, 2.4) }}; size_t numNodesPerDim[1] = {10}; std::vector nodes; for (size_t nodeId = 0; nodeId < numNodesPerDim[0]; ++nodeId) { double abscissa = static_cast(nodeId) / static_cast(numNodesPerDim[0] - 1); nodes.push_back(extremities[0] + abscissa * (extremities[1] - extremities[0])); } std::vector boundaryConditions; double totalMass = 1.1; double stiffnessStretching = 2.2; double dampingStretching = 3.3; double stiffnessBending = 4.4; double dampingBending = 5.5; boundaryConditions.push_back(0); boundaryConditions.push_back(numNodesPerDim[0] - 1); m.init1D(nodes, boundaryConditions, totalMass, stiffnessStretching, dampingStretching, stiffnessBending, dampingBending); m.initialize(std::make_shared()); m.wakeUp(); EXPECT_EQ(numNodesPerDim[0] * 3, m.getNumDof()); EXPECT_EQ(numNodesPerDim[0], m.getNumMasses()); EXPECT_EQ(numNodesPerDim[0] - 1 + numNodesPerDim[0] - 2, m.getNumSprings()); for (size_t massId = 0; massId < m.getNumMasses(); massId++) { EXPECT_DOUBLE_EQ(totalMass/numNodesPerDim[0], m.getMass(massId)->getMass()); } // The 1st springs are the stretching springs size_t springId = 0; for (size_t nodeId = 0; nodeId < m.getNumMasses() - 1; nodeId++) { springTest(std::dynamic_pointer_cast(m.getSpring(springId)), m.getFinalState(), nodeId, nodeId + 1, stiffnessStretching, dampingStretching); springId++; } // Followed by bending springs for (size_t nodeId = 0; nodeId < m.getNumMasses() - 2; nodeId++) { springTest(std::dynamic_pointer_cast(m.getSpring(springId)), m.getFinalState(), nodeId, nodeId + 2, stiffnessBending, dampingBending); springId++; } // States all equals EXPECT_EQ(*m.getPreviousState(), *m.getFinalState()); EXPECT_EQ(*m.getCurrentState(), *m.getFinalState()); EXPECT_EQ(*m.getInitialState(), *m.getFinalState()); // States should contains expected values Vector3d delta = (extremities[1] - extremities[0]) / static_cast(numNodesPerDim[0] - 1); EXPECT_TRUE(m.getFinalState()->getVelocities().isZero()); EXPECT_FALSE(m.getFinalState()->getPositions().isZero()); for (size_t nodeId = 0; nodeId < numNodesPerDim[0]; nodeId++) { Vector3d piExpected = extremities[0] + delta * static_cast(nodeId); SurgSim::Math::Vector& x = m.getFinalState()->getPositions(); Eigen::VectorBlock pi = SurgSim::Math::getSubVector(x, nodeId, 3); EXPECT_TRUE(pi.isApprox(piExpected)); } std::vector dofBoundaryConditions; for (auto it = boundaryConditions.begin(); it != boundaryConditions.end(); ++it) { dofBoundaryConditions.push_back((*it) * 3); dofBoundaryConditions.push_back((*it) * 3 + 1); dofBoundaryConditions.push_back((*it) * 3 + 2); } EXPECT_EQ(dofBoundaryConditions, m.getFinalState()->getBoundaryConditions()); } opensurgsim-0.7.0/SurgSim/Blocks/UnitTests/MassSpring2DRepresentationTests.cpp000066400000000000000000000155051277777236100276200ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the MassSpring2DRepresentation class. #include #include "SurgSim/Blocks/MassSpring2DRepresentation.h" #include "SurgSim/Blocks/UnitTests/SpringTestUtils.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Math/OdeState.h" #include "SurgSim/Physics/LinearSpring.h" using SurgSim::Math::Vector3d; using SurgSim::Physics::LinearSpring; using SurgSim::Blocks::MassSpring2DRepresentation; using SurgSim::Blocks::springTest; TEST(MassSpring2DRepresentationTests, init2DTest) { MassSpring2DRepresentation m("MassSpring2D"); std::array, 2> extremities = {{ {{Vector3d(0.1, 0.2, 0.3), Vector3d(1.1, 1.2, 1.3)}}, {{Vector3d(10.1, 10.2, 10.4), Vector3d(9.5, 9.6, 9.3)}} }}; size_t numNodesPerDim[2] = {10, 5}; std::vector boundaryConditions; double totalMass = 1.1; double stiffnessStretching = 2.2; double dampingStretching = 3.3; double stiffnessBending = 4.4; double dampingBending = 5.5; double stiffnessFaceDiagonal = 6.6; double dampingFaceDiagonal = 7.7; boundaryConditions.push_back(0); boundaryConditions.push_back(numNodesPerDim[0] * numNodesPerDim[1] - 1); m.init2D(extremities, numNodesPerDim, boundaryConditions, totalMass, stiffnessStretching, dampingStretching, stiffnessBending, dampingBending, stiffnessFaceDiagonal, dampingFaceDiagonal); m.initialize(std::make_shared()); m.wakeUp(); const size_t numNodes = numNodesPerDim[0] * numNodesPerDim[1]; EXPECT_EQ(numNodes * 3, m.getNumDof()); EXPECT_EQ(numNodes, m.getNumMasses()); size_t numSpringsExpected = 0; numSpringsExpected += numNodesPerDim[1] * (numNodesPerDim[0] - 1); // Stretching along Y numSpringsExpected += numNodesPerDim[0] * (numNodesPerDim[1] - 1); // Stretching along X numSpringsExpected += numNodesPerDim[1] * (numNodesPerDim[0] - 2); // Bending along Y numSpringsExpected += numNodesPerDim[0] * (numNodesPerDim[1] - 2); // Bending along X numSpringsExpected += (numNodesPerDim[0] - 1) * (numNodesPerDim[1] - 1) * 2; // Face diagonal EXPECT_EQ(numSpringsExpected, m.getNumSprings()); for (size_t massId = 0; massId < m.getNumMasses(); massId++) { EXPECT_DOUBLE_EQ(totalMass/numNodes, m.getMass(massId)->getMass()); } const size_t rowOffset = numNodesPerDim[0]; const size_t colOffset = 1; size_t springId = 0; // The 1st springs are the stretching springs along X for (size_t row = 0; row < numNodesPerDim[1]; row++) { for (size_t col = 0; col < numNodesPerDim[0] - 1; col++) { size_t nodeId = row * rowOffset + col * colOffset; springTest( std::dynamic_pointer_cast(m.getSpring(springId)), m.getFinalState(), nodeId, nodeId + colOffset, stiffnessStretching, dampingStretching); springId++; } } // Followed by stretching springs along Y for (size_t col = 0; col < numNodesPerDim[0]; col++) { for (size_t row = 0; row < numNodesPerDim[1] - 1; row++) { size_t nodeId = row * rowOffset + col * colOffset; springTest( std::dynamic_pointer_cast(m.getSpring(springId)), m.getFinalState(), nodeId, nodeId + rowOffset, stiffnessStretching, dampingStretching); springId++; } } // Followed by bending springs along X for (size_t row = 0; row < numNodesPerDim[1]; row++) { for (size_t col = 0; col < numNodesPerDim[0] - 2; col++) { size_t nodeId = row * rowOffset + col * colOffset; springTest( std::dynamic_pointer_cast(m.getSpring(springId)), m.getFinalState(), nodeId, nodeId + 2 * colOffset, stiffnessBending, dampingBending); springId++; } } // Followed by bending springs along Y for (size_t col = 0; col < numNodesPerDim[0]; col++) { for (size_t row = 0; row < numNodesPerDim[1] - 2; row++) { size_t nodeId = row * rowOffset + col * colOffset; springTest( std::dynamic_pointer_cast(m.getSpring(springId)), m.getFinalState(), nodeId, nodeId + 2 * rowOffset, stiffnessBending, dampingBending); springId++; } } // Followed by face diagonal springs for (size_t row = 0; row < numNodesPerDim[1] - 1; row++) { for (size_t col = 0; col < numNodesPerDim[0] - 1; col++) { size_t nodeId = row * rowOffset + col * colOffset; springTest( std::dynamic_pointer_cast(m.getSpring(springId)), m.getFinalState(), nodeId, nodeId + rowOffset + colOffset, stiffnessFaceDiagonal, dampingFaceDiagonal); springId++; springTest( std::dynamic_pointer_cast(m.getSpring(springId)), m.getFinalState(), nodeId + colOffset, nodeId + rowOffset, stiffnessFaceDiagonal, dampingFaceDiagonal); springId++; } } // States all equals EXPECT_EQ(*m.getPreviousState(), *m.getFinalState()); EXPECT_EQ(*m.getCurrentState(), *m.getFinalState()); EXPECT_EQ(*m.getInitialState(), *m.getFinalState()); // States should contains expected values EXPECT_TRUE(m.getFinalState()->getVelocities().isZero()); EXPECT_FALSE(m.getFinalState()->getPositions().isZero()); Vector3d rowExtremititiesDelta[2] = { (extremities[0][1] - extremities[0][0]) / static_cast(numNodesPerDim[1] - 1) , (extremities[1][1] - extremities[1][0]) / static_cast(numNodesPerDim[1] - 1) }; size_t nodeId = 0; for (size_t row = 0; row < numNodesPerDim[1]; row++) { Vector3d rowExtremities[2]; rowExtremities[0] = extremities[0][0] + rowExtremititiesDelta[0] * static_cast(row); rowExtremities[1] = extremities[1][0] + rowExtremititiesDelta[1] * static_cast(row); Vector3d delta = (rowExtremities[1] - rowExtremities[0]) / static_cast(numNodesPerDim[0] - 1); for (size_t col = 0; col < numNodesPerDim[0]; col++) { SurgSim::Math::Vector3d piExpected(rowExtremities[0] + static_cast(col) * delta); SurgSim::Math::Vector& x = m.getFinalState()->getPositions(); Eigen::VectorBlock pi = SurgSim::Math::getSubVector(x, nodeId, 3); EXPECT_TRUE(pi.isApprox(piExpected)); nodeId++; } } std::vector dofBoundaryConditions; for (auto it = boundaryConditions.begin(); it != boundaryConditions.end(); ++it) { dofBoundaryConditions.push_back((*it) * 3); dofBoundaryConditions.push_back((*it) * 3 + 1); dofBoundaryConditions.push_back((*it) * 3 + 2); } EXPECT_EQ(dofBoundaryConditions, m.getFinalState()->getBoundaryConditions()); } opensurgsim-0.7.0/SurgSim/Blocks/UnitTests/MassSpring3DRepresentationTests.cpp000066400000000000000000000317771277777236100276320ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the MassSpring3DRepresentation class. #include #include "SurgSim/Blocks/MassSpring3DRepresentation.h" #include "SurgSim/Blocks/UnitTests/SpringTestUtils.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Math/OdeState.h" #include "SurgSim/Physics/LinearSpring.h" using SurgSim::Math::Vector3d; using SurgSim::Physics::LinearSpring; using SurgSim::Blocks::MassSpring3DRepresentation; using SurgSim::Blocks::springTest; TEST(MassSpring3DRepresentationTests, init3DTest) { MassSpring3DRepresentation m("MassSpring3D"); std::array, 2>, 2> extremities = {{ {{ {{Vector3d(-0.5, -0.4, -0.3), Vector3d( 0.4, -0.5, -0.3)}}, {{Vector3d(-0.4, 0.3, -0.5), Vector3d( 0.5, 0.3, -0.4)}} }}, {{ {{Vector3d(-0.3, -0.5, 0.4), Vector3d( 0.5, -0.3, 0.4)}}, {{Vector3d(-0.4, 0.3, 0.5), Vector3d( 0.4, 0.3, 0.5)}} }} }}; size_t numNodesPerDim[3] = {10, 5, 3}; std::vector boundaryConditions; double totalMass = 1.1; double stiffnessStretching = 2.2; double dampingStretching = 3.3; double stiffnessBending = 4.4; double dampingBending = 5.5; double stiffnessFaceDiagonal = 6.6; double dampingFaceDiagonal = 7.7; double stiffnessVolumeDiagonal = 8.8; double dampingVolumeDiagonal = 9.9; boundaryConditions.push_back(0); boundaryConditions.push_back(numNodesPerDim[0] * numNodesPerDim[1] * numNodesPerDim[2] - 1); m.init3D(extremities, numNodesPerDim, boundaryConditions, totalMass, stiffnessStretching, dampingStretching, stiffnessBending, dampingBending, stiffnessFaceDiagonal, dampingFaceDiagonal, stiffnessVolumeDiagonal, dampingVolumeDiagonal); m.initialize(std::make_shared()); m.wakeUp(); const size_t numNodes = numNodesPerDim[0] * numNodesPerDim[1] * numNodesPerDim[2]; EXPECT_EQ(numNodes * 3, m.getNumDof()); EXPECT_EQ(numNodes, m.getNumMasses()); size_t numSpringsExpected = 0; // Stretching springs numSpringsExpected += numNodesPerDim[0] * numNodesPerDim[2] * (numNodesPerDim[1] - 1); // along X numSpringsExpected += numNodesPerDim[1] * numNodesPerDim[2] * (numNodesPerDim[0] - 1); // along Y numSpringsExpected += numNodesPerDim[0] * numNodesPerDim[1] * (numNodesPerDim[2] - 1); // along Z // Bending springs numSpringsExpected += numNodesPerDim[0] * numNodesPerDim[2] * (numNodesPerDim[1] - 2); // along X numSpringsExpected += numNodesPerDim[1] * numNodesPerDim[2] * (numNodesPerDim[0] - 2); // along Y numSpringsExpected += numNodesPerDim[0] * numNodesPerDim[1] * (numNodesPerDim[2] - 2); // along Z // Face diagonal springs numSpringsExpected += numNodesPerDim[1] * (numNodesPerDim[2] - 1) * (numNodesPerDim[0] - 1) * 2; // facing X numSpringsExpected += numNodesPerDim[0] * (numNodesPerDim[2] - 1) * (numNodesPerDim[1] - 1) * 2; // facing Y numSpringsExpected += numNodesPerDim[2] * (numNodesPerDim[1] - 1) * (numNodesPerDim[0] - 1) * 2; // facing Z // Volume diagonal springs numSpringsExpected += (numNodesPerDim[0] - 1) * (numNodesPerDim[1] - 1) * (numNodesPerDim[2] - 1) * 4; EXPECT_EQ(numSpringsExpected, m.getNumSprings()); for (size_t massId = 0; massId < m.getNumMasses(); massId++) { EXPECT_DOUBLE_EQ(totalMass/numNodes, m.getMass(massId)->getMass()); } const size_t depthOffset = numNodesPerDim[0] * numNodesPerDim[1]; const size_t rowOffset = numNodesPerDim[0]; const size_t colOffset = 1; size_t springId = 0; // The 1st springs are the stretching springs along X for (size_t depth = 0; depth < numNodesPerDim[2]; depth++) { for (size_t row = 0; row < numNodesPerDim[1]; row++) { for (size_t col = 0; col < numNodesPerDim[0] - 1; col++) { size_t nodeId = depth * depthOffset + row * rowOffset + col * colOffset; springTest( std::dynamic_pointer_cast(m.getSpring(springId)), m.getFinalState(), nodeId, nodeId + colOffset, stiffnessStretching, dampingStretching); springId++; } } } // Followed by stretching springs along Y for (size_t depth = 0; depth < numNodesPerDim[2]; depth++) { for (size_t col = 0; col < numNodesPerDim[0]; col++) { for (size_t row = 0; row < numNodesPerDim[1] - 1; row++) { size_t nodeId = depth * depthOffset + row * rowOffset + col * colOffset; springTest( std::dynamic_pointer_cast(m.getSpring(springId)), m.getFinalState(), nodeId, nodeId + rowOffset, stiffnessStretching, dampingStretching); springId++; } } } // Followed by stretching springs along Z for (size_t row = 0; row < numNodesPerDim[1]; row++) { for (size_t col = 0; col < numNodesPerDim[0]; col++) { for (size_t depth = 0; depth < numNodesPerDim[2] - 1; depth++) { size_t nodeId = depth * depthOffset + row * rowOffset + col * colOffset; springTest( std::dynamic_pointer_cast(m.getSpring(springId)), m.getFinalState(), nodeId, nodeId + depthOffset, stiffnessStretching, dampingStretching); springId++; } } } // Followed by bending springs along X for (size_t depth = 0; depth < numNodesPerDim[2]; depth++) { for (size_t row = 0; row < numNodesPerDim[1]; row++) { for (size_t col = 0; col < numNodesPerDim[0] - 2; col++) { size_t nodeId = depth * depthOffset + row * rowOffset + col * colOffset; springTest( std::dynamic_pointer_cast(m.getSpring(springId)), m.getFinalState(), nodeId, nodeId + 2 * colOffset, stiffnessBending, dampingBending); springId++; } } } // Followed by bending springs along Y for (size_t depth = 0; depth < numNodesPerDim[2]; depth++) { for (size_t col = 0; col < numNodesPerDim[0]; col++) { for (size_t row = 0; row < numNodesPerDim[1] - 2; row++) { size_t nodeId = depth * depthOffset + row * rowOffset + col * colOffset; springTest( std::dynamic_pointer_cast(m.getSpring(springId)), m.getFinalState(), nodeId, nodeId + 2 * rowOffset, stiffnessBending, dampingBending); springId++; } } } // Followed by bending springs along Z for (size_t row = 0; row < numNodesPerDim[1]; row++) { for (size_t col = 0; col < numNodesPerDim[0]; col++) { for (size_t depth = 0; depth < numNodesPerDim[2] - 2; depth++) { size_t nodeId = depth * depthOffset + row * rowOffset + col * colOffset; springTest( std::dynamic_pointer_cast(m.getSpring(springId)), m.getFinalState(), nodeId, nodeId + 2 * depthOffset, stiffnessBending, dampingBending); springId++; } } } // Followed by face diagonal springs orthogonal to Z for (size_t depth = 0; depth < numNodesPerDim[2]; depth++) { for (size_t row = 0; row < numNodesPerDim[1] - 1; row++) { for (size_t col = 0; col < numNodesPerDim[0] - 1; col++) { size_t nodeId = depth * depthOffset + row * rowOffset + col * colOffset; springTest( std::dynamic_pointer_cast(m.getSpring(springId)), m.getFinalState(), nodeId, nodeId + rowOffset + colOffset, stiffnessFaceDiagonal, dampingFaceDiagonal); springId++; springTest( std::dynamic_pointer_cast(m.getSpring(springId)), m.getFinalState(), nodeId + colOffset, nodeId + rowOffset, stiffnessFaceDiagonal, dampingFaceDiagonal); springId++; } } } // Followed by face diagonal springs orthogonal to Y for (size_t row = 0; row < numNodesPerDim[1]; row++) { for (size_t depth = 0; depth < numNodesPerDim[2] - 1; depth++) { for (size_t col = 0; col < numNodesPerDim[0] - 1; col++) { size_t nodeId = depth * depthOffset + row * rowOffset + col * colOffset; springTest( std::dynamic_pointer_cast(m.getSpring(springId)), m.getFinalState(), nodeId, nodeId + depthOffset + colOffset, stiffnessFaceDiagonal, dampingFaceDiagonal); springId++; springTest( std::dynamic_pointer_cast(m.getSpring(springId)), m.getFinalState(), nodeId + colOffset, nodeId + depthOffset, stiffnessFaceDiagonal, dampingFaceDiagonal); springId++; } } } // Followed by face diagonal springs orthogonal to X for (size_t col = 0; col < numNodesPerDim[0]; col++) { for (size_t row = 0; row < numNodesPerDim[1] - 1; row++) { for (size_t depth = 0; depth < numNodesPerDim[2] - 1; depth++) { size_t nodeId = depth * depthOffset + row * rowOffset + col * colOffset; springTest( std::dynamic_pointer_cast(m.getSpring(springId)), m.getFinalState(), nodeId, nodeId + depthOffset + rowOffset, stiffnessFaceDiagonal, dampingFaceDiagonal); springId++; springTest( std::dynamic_pointer_cast(m.getSpring(springId)), m.getFinalState(), nodeId + rowOffset, nodeId + depthOffset, stiffnessFaceDiagonal, dampingFaceDiagonal); springId++; } } } // Followed by volume diagonal springs for (size_t col = 0; col < numNodesPerDim[0] - 1; col++) { for (size_t row = 0; row < numNodesPerDim[1] - 1; row++) { for (size_t depth = 0; depth < numNodesPerDim[2] - 1; depth++) { size_t nodeId = depth * depthOffset + row * rowOffset + col * colOffset; springTest( std::dynamic_pointer_cast(m.getSpring(springId)), m.getFinalState(), nodeId, nodeId + depthOffset + rowOffset + colOffset, stiffnessVolumeDiagonal, dampingVolumeDiagonal); springId++; springTest( std::dynamic_pointer_cast(m.getSpring(springId)), m.getFinalState(), nodeId + colOffset, nodeId + depthOffset + rowOffset, stiffnessVolumeDiagonal, dampingVolumeDiagonal); springId++; springTest( std::dynamic_pointer_cast(m.getSpring(springId)), m.getFinalState(), nodeId + rowOffset, nodeId + depthOffset + colOffset, stiffnessVolumeDiagonal, dampingVolumeDiagonal); springId++; springTest( std::dynamic_pointer_cast(m.getSpring(springId)), m.getFinalState(), nodeId + rowOffset + colOffset, nodeId + depthOffset, stiffnessVolumeDiagonal, dampingVolumeDiagonal); springId++; } } } // States all equals EXPECT_EQ(*m.getPreviousState(), *m.getFinalState()); EXPECT_EQ(*m.getCurrentState(), *m.getFinalState()); EXPECT_EQ(*m.getInitialState(), *m.getFinalState()); // States should contains expected values EXPECT_TRUE(m.getFinalState()->getVelocities().isZero()); EXPECT_FALSE(m.getFinalState()->getPositions().isZero()); Vector3d depthExtremitiesDelta[2][2] = {{(extremities[0][0][1] - extremities[0][0][0]) / static_cast(numNodesPerDim[2] - 1) , (extremities[1][0][1] - extremities[1][0][0]) / static_cast(numNodesPerDim[2] - 1)} , {(extremities[0][1][1] - extremities[0][1][0]) / static_cast(numNodesPerDim[2] - 1) , (extremities[1][1][1] - extremities[1][1][0]) / static_cast(numNodesPerDim[2] - 1)}}; size_t nodeId = 0; for (size_t depth = 0; depth < numNodesPerDim[2]; depth++) { Vector3d depthExtremities[2][2]; depthExtremities[0][0] = extremities[0][0][0] + depthExtremitiesDelta[0][0] * static_cast(depth); depthExtremities[1][0] = extremities[1][0][0] + depthExtremitiesDelta[0][1] * static_cast(depth); depthExtremities[0][1] = extremities[0][1][0] + depthExtremitiesDelta[1][0] * static_cast(depth); depthExtremities[1][1] = extremities[1][1][0] + depthExtremitiesDelta[1][1] * static_cast(depth); Vector3d rowExtremitiesDelta[2] = {(depthExtremities[0][1] - depthExtremities[0][0]) / static_cast(numNodesPerDim[1] - 1) , (depthExtremities[1][1] - depthExtremities[1][0]) / static_cast(numNodesPerDim[1] - 1)}; for (size_t row = 0; row < numNodesPerDim[1]; row++) { Vector3d rowExtremities[2]; rowExtremities[0] = depthExtremities[0][0] + rowExtremitiesDelta[0] * static_cast(row); rowExtremities[1] = depthExtremities[1][0] + rowExtremitiesDelta[1] * static_cast(row); Vector3d delta = (rowExtremities[1] - rowExtremities[0]) / static_cast(numNodesPerDim[0] - 1); for (size_t col = 0; col < numNodesPerDim[0]; col++) { Vector3d xiExpected(rowExtremities[0] + static_cast(col) * delta); SurgSim::Math::Vector& x = m.getFinalState()->getPositions(); Eigen::VectorBlock xi = SurgSim::Math::getSubVector(x, nodeId, 3); EXPECT_TRUE(xi.isApprox(xiExpected)); nodeId++; } } } std::vector dofBoundaryConditions; for (auto it = boundaryConditions.begin(); it != boundaryConditions.end(); ++it) { dofBoundaryConditions.push_back((*it) * 3); dofBoundaryConditions.push_back((*it) * 3 + 1); dofBoundaryConditions.push_back((*it) * 3 + 2); } EXPECT_EQ(dofBoundaryConditions, m.getFinalState()->getBoundaryConditions()); } opensurgsim-0.7.0/SurgSim/Blocks/UnitTests/MassSpringNDRepresentationUtilsTests.cpp000066400000000000000000000060201277777236100306650ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the MassSpring1DRepresentation class. #include #include #include "SurgSim/Blocks/MassSpringNDRepresentationUtils.h" #include "SurgSim/Math/OdeState.h" #include "SurgSim/Physics/LinearSpring.h" using SurgSim::Physics::LinearSpring; TEST(MassSpringNDRepresentationUtilsTests, CreateLinearSpring) { const int numDofPerNode = 3; const int numNodes = 10; double stiffness = 14.54; double damping = 4.398; { SCOPED_TRACE("Create linear spring with 0 rest-length"); std::shared_ptr state; state = std::make_shared(); state->setNumDof(numDofPerNode, numNodes); std::shared_ptr linearSpring; linearSpring = SurgSim::Blocks::createLinearSpring(state, 3, 7, stiffness, damping); EXPECT_DOUBLE_EQ(damping, linearSpring->getDamping()); EXPECT_DOUBLE_EQ(stiffness, linearSpring->getStiffness()); EXPECT_DOUBLE_EQ(0.0, linearSpring->getRestLength()); EXPECT_EQ(2u, linearSpring->getNumNodes()); EXPECT_EQ(3u, linearSpring->getNodeId(0)); EXPECT_EQ(7u, linearSpring->getNodeId(1)); EXPECT_EQ(2, linearSpring->getNodeIds().size()); EXPECT_EQ(3u, linearSpring->getNodeIds()[0]); EXPECT_EQ(7u, linearSpring->getNodeIds()[1]); } { SCOPED_TRACE("Create linear spring with non 0 rest-length"); std::shared_ptr state; state = std::make_shared(); state->setNumDof(numDofPerNode, numNodes); for (int nodeId = 0; nodeId < numNodes; nodeId++) { SurgSim::Math::Vector& x = state->getPositions(); SurgSim::Math::getSubVector(x, nodeId, numDofPerNode)[0] = static_cast(nodeId) + 0.45009; SurgSim::Math::getSubVector(x, nodeId, numDofPerNode)[1] = -4.5343; SurgSim::Math::getSubVector(x, nodeId, numDofPerNode)[2] = 0.2325445; } std::shared_ptr linearSpring; linearSpring = SurgSim::Blocks::createLinearSpring(state, 3, 7, stiffness, damping); EXPECT_DOUBLE_EQ(damping, linearSpring->getDamping()); EXPECT_DOUBLE_EQ(stiffness, linearSpring->getStiffness()); EXPECT_DOUBLE_EQ(4.0, linearSpring->getRestLength()); EXPECT_EQ(2u, linearSpring->getNumNodes()); EXPECT_EQ(3u, linearSpring->getNodeId(0)); EXPECT_EQ(7u, linearSpring->getNodeId(1)); EXPECT_EQ(2, linearSpring->getNodeIds().size()); EXPECT_EQ(3u, linearSpring->getNodeIds()[0]); EXPECT_EQ(7u, linearSpring->getNodeIds()[1]); } } opensurgsim-0.7.0/SurgSim/Blocks/UnitTests/PoseInterpolatorTests.cpp000066400000000000000000000132741277777236100257330ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Blocks/PoseInterpolator.h" #include "SurgSim/Framework/BasicSceneElement.h" #include "SurgSim/Framework/Representation.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Framework/Scene.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Vector.h" using SurgSim::Math::RigidTransform3d; using SurgSim::Math::Quaterniond; using SurgSim::Math::Vector3d; using SurgSim::Math::makeRigidTransform; using SurgSim::Math::interpolate; namespace { RigidTransform3d startPose = makeRigidTransform(Quaterniond::Identity(), Vector3d(1.0, 2.0, 3.0)); RigidTransform3d endPose = makeRigidTransform(Quaterniond::Identity(), Vector3d(3.0, 2.0, 1.0)); } namespace SurgSim { namespace Blocks { class PoseInterpolatorTests : public ::testing::Test { public: void SetUp() { runtime = std::make_shared(""); scene = runtime->getScene(); element = std::make_shared("element"); representation = std::make_shared("representation"); interpolator = std::make_shared("interpolator"); } void TearDown() { representation->retire(); interpolator->retire(); } std::shared_ptr runtime; std::shared_ptr scene; std::shared_ptr element; std::shared_ptr representation; std::shared_ptr interpolator; }; TEST_F(PoseInterpolatorTests, InitTest) { ASSERT_NO_THROW({auto interpolator = std::make_shared("test");}); } TEST_F(PoseInterpolatorTests, StartAndEndPose) { interpolator->setStartingPose(startPose); interpolator->setEndingPose(endPose); element->addComponent(representation); element->addComponent(interpolator); scene->addSceneElement(element); interpolator->wakeUp(); representation->wakeUp(); interpolator->update(0.0); EXPECT_TRUE(startPose.isApprox(representation->getPose())); interpolator->update(0.5); RigidTransform3d pose = interpolate(startPose, endPose, 0.5); EXPECT_TRUE(pose.matrix().isApprox(representation->getPose().matrix())) << pose.matrix() << std::endl << representation->getPose().matrix(); } TEST_F(PoseInterpolatorTests, UseOptionalStartPose) { interpolator->setStartingPose(startPose); interpolator->setEndingPose(endPose); interpolator->setTarget(element); element->addComponent(representation); element->addComponent(interpolator); scene->addSceneElement(element); interpolator->wakeUp(); representation->wakeUp(); interpolator->update(0.0); EXPECT_TRUE(startPose.isApprox(representation->getPose())); interpolator->update(0.5); RigidTransform3d pose = interpolate(startPose, endPose, 0.5); EXPECT_TRUE(pose.matrix().isApprox(representation->getPose().matrix())) << pose.matrix() << std::endl << representation->getPose().matrix(); } TEST_F(PoseInterpolatorTests, UseLoop) { interpolator->setStartingPose(startPose); interpolator->setEndingPose(endPose); element->addComponent(representation); element->addComponent(interpolator); scene->addSceneElement(element); interpolator->setPingPong(true); interpolator->setLoop(true); // Enabling loop should disable pingpong EXPECT_TRUE(interpolator->isLoop()); EXPECT_FALSE(interpolator->isPingPong()); interpolator->wakeUp(); representation->wakeUp(); interpolator->update(0.0); EXPECT_TRUE(startPose.isApprox(representation->getPose())); interpolator->update(0.25); RigidTransform3d pose = interpolate(startPose, endPose, 0.25); EXPECT_TRUE(pose.matrix().isApprox(representation->getPose().matrix())) << pose.matrix() << std::endl << representation->getPose().matrix(); // We advance by 1.0, this should wrap around to 0.25 again and the poses should be the same interpolator->update(1.0); EXPECT_TRUE(pose.matrix().isApprox(representation->getPose().matrix())) << pose.matrix() << std::endl << representation->getPose().matrix(); } TEST_F(PoseInterpolatorTests, UsePingPong) { interpolator->setStartingPose(startPose); interpolator->setEndingPose(endPose); element->addComponent(representation); element->addComponent(interpolator); scene->addSceneElement(element); interpolator->setLoop(true); interpolator->setPingPong(true); // Enabling PingPong should disable Loop EXPECT_FALSE(interpolator->isLoop()); EXPECT_TRUE(interpolator->isPingPong()); interpolator->wakeUp(); representation->wakeUp(); interpolator->update(0.0); EXPECT_TRUE(startPose.isApprox(representation->getPose())); interpolator->update(0.25); RigidTransform3d pose = interpolate(startPose, endPose, 0.25); EXPECT_TRUE(pose.matrix().isApprox(representation->getPose().matrix())) << pose.matrix() << std::endl << representation->getPose().matrix(); // We advance by 1.0, this should wrap around to 0.25 and the poses should be flipped pose = interpolate(endPose, startPose, 0.25); interpolator->update(1.0); EXPECT_TRUE(pose.matrix().isApprox(representation->getPose().matrix())) << pose.matrix() << std::endl << representation->getPose().matrix(); } }; }; opensurgsim-0.7.0/SurgSim/Blocks/UnitTests/SingleKeyBehaviorTests.cpp000066400000000000000000000065441277777236100257760ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013 - 2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the SingleKeyBehavior class. #include #include #include "SurgSim/Blocks/SingleKeyBehavior.h" #include "SurgSim/Devices/Keyboard/KeyCode.h" #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Input/InputComponent.h" class MockSingleKeyBehavior : public SurgSim::Blocks::SingleKeyBehavior { public: explicit MockSingleKeyBehavior(const std::string& name) : SingleKeyBehavior(name) { } protected: void onKey() override { } }; TEST(SingleKeyBehaviorTest, Constructor) { std::shared_ptr singleKeyBehavior; ASSERT_NO_THROW(singleKeyBehavior = std::make_shared("SingleKeyBehavior")); EXPECT_EQ(nullptr, singleKeyBehavior->getInputComponent()); EXPECT_EQ(SurgSim::Devices::KeyCode::NONE, singleKeyBehavior->getKey()); } TEST(SingleKeyBehaviorTest, SetAndGetKey) { auto behavior = std::make_shared("MockSingleKeyBehavior"); int key = SurgSim::Devices::KeyCode::KEY_0; EXPECT_NO_THROW(behavior->setKey(key)); int retrievedKey; EXPECT_NO_THROW(retrievedKey = behavior->getKey()); EXPECT_EQ(key, retrievedKey); } TEST(SingleKeyBehaviorTest, WakeUp) { auto input = std::make_shared("input"); int key = SurgSim::Devices::KeyCode::KEY_1; { auto behavior = std::make_shared("MockSingleKeyBehavior"); EXPECT_FALSE(behavior->doWakeUp()); } { auto behavior = std::make_shared("MockSingleKeyBehavior"); behavior->setInputComponent(input); EXPECT_FALSE(behavior->doWakeUp()); } { auto behavior = std::make_shared("MockSingleKeyBehavior"); behavior->setKey(key); EXPECT_FALSE(behavior->doWakeUp()); } { auto behavior = std::make_shared("MockSingleKeyBehavior"); behavior->setKey(key); behavior->setInputComponent(input); EXPECT_TRUE(behavior->doWakeUp()); } } TEST(SingleKeyBehaviorTest, AccessibleValues) { auto behavior = std::make_shared("MockSingleKeyBehavior"); std::shared_ptr input = std::make_shared("input"); int key = SurgSim::Devices::KeyCode::KEY_0; EXPECT_NO_THROW(behavior->setValue("ActionKey", key)); EXPECT_NO_THROW(behavior->setValue("InputComponent", input)); int retrievedKey; std::shared_ptr retrievedInputComponent; EXPECT_NO_THROW(retrievedKey = behavior->getValue("ActionKey")); EXPECT_NO_THROW(retrievedInputComponent = behavior->getValue>("InputComponent")); EXPECT_EQ(key, retrievedKey); EXPECT_EQ(input, retrievedInputComponent); } opensurgsim-0.7.0/SurgSim/Blocks/UnitTests/SpringTestUtils.cpp000066400000000000000000000033241277777236100245150ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Utility function to test a LinearSpring #include #include "SurgSim/Blocks/UnitTests/SpringTestUtils.h" #include "SurgSim/Math/OdeState.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/LinearSpring.h" namespace SurgSim { namespace Blocks { void springTest(std::shared_ptr spring, std::shared_ptr state, size_t expectedNodeId0, size_t expectedNodeId1, double expectedStiffness, double expectedDamping) { EXPECT_DOUBLE_EQ(expectedStiffness, spring->getStiffness()); EXPECT_DOUBLE_EQ(expectedDamping, spring->getDamping()); EXPECT_EQ(expectedNodeId0, spring->getNodeId(0)); EXPECT_EQ(expectedNodeId1, spring->getNodeId(1)); SurgSim::Math::Vector& x =state->getPositions(); Eigen::VectorBlock x0 = SurgSim::Math::getSubVector(x, expectedNodeId0, 3); Eigen::VectorBlock x1 = SurgSim::Math::getSubVector(x, expectedNodeId1, 3); EXPECT_DOUBLE_EQ((x1 - x0).norm(), spring->getRestLength()); } }; // namespace Blocks }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Blocks/UnitTests/SpringTestUtils.h000066400000000000000000000023751277777236100241670ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Utility function to test a LinearSpring #ifndef SURGSIM_BLOCKS_UNITTESTS_SPRINGTESTUTILS_H #define SURGSIM_BLOCKS_UNITTESTS_SPRINGTESTUTILS_H #include namespace SurgSim { namespace Math { class OdeState; }; namespace Physics { class LinearSpring; }; namespace Blocks { void springTest(std::shared_ptr spring, std::shared_ptr state, size_t expectedNodeId0, size_t expectedNodeId1, double expectedStiffness, double expectedDamping); }; // namespace Blocks }; // namespace SurgSim #endif // SURGSIM_BLOCKS_UNITTESTS_SPRINGTESTUTILS_H opensurgsim-0.7.0/SurgSim/Blocks/UnitTests/TransferParticlesToPointCloudBehaviorTests.cpp000066400000000000000000000165751277777236100320500ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the TransferParticlesToGraphicsBehavior class. #include #include "SurgSim/Blocks/TransferParticlesToPointCloudBehavior.h" #include "SurgSim/Framework/BasicSceneElement.h" #include "SurgSim/Framework/BehaviorManager.h" #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Framework/Scene.h" #include "SurgSim/Graphics/OsgBoxRepresentation.h" #include "SurgSim/Graphics/OsgPointCloudRepresentation.h" #include "SurgSim/Particles/SphRepresentation.h" #include "SurgSim/Physics/PhysicsManager.h" #include "SurgSim/Physics/RigidRepresentation.h" using SurgSim::Math::Vector3d; namespace SurgSim { namespace Blocks { TEST(TransferParticlesToPointCloudBehaviorTests, ConstructorTest) { ASSERT_NO_THROW(TransferParticlesToPointCloudBehavior("TestBehavior")); } TEST(TransferParticlesToPointCloudBehaviorTests, SetGetSourceTest) { auto particles = std::make_shared("Particles"); auto rigid = std::make_shared("Rigid"); auto behavior = std::make_shared("Behavior"); EXPECT_THROW(behavior->setSource(nullptr), Framework::AssertionFailure); EXPECT_THROW(behavior->setSource(rigid), Framework::AssertionFailure); EXPECT_NO_THROW(behavior->setSource(particles)); EXPECT_EQ(particles, behavior->getSource()); } TEST(TransferParticlesToPointCloudBehaviorTests, SetGetTargetTest) { auto pointCloud = std::make_shared("OsgMesh"); auto graphicsBox = std::make_shared("OsgBox"); auto behavior = std::make_shared("Behavior"); EXPECT_THROW(behavior->setTarget(nullptr), Framework::AssertionFailure); EXPECT_THROW(behavior->setTarget(graphicsBox), Framework::AssertionFailure); EXPECT_NO_THROW(behavior->setTarget(pointCloud)); EXPECT_EQ(pointCloud, behavior->getTarget()); } TEST(TransferParticlesToPointCloudBehaviorTests, WakeUpTest) { auto runtime = std::make_shared("config.txt"); auto particles = std::make_shared("Particles"); particles->setMassPerParticle(1.0); particles->setDensity(1.0); particles->setGasStiffness(1.0); particles->setKernelSupport(1.0); auto pointCloud = std::make_shared("Graphics"); { auto behavior = std::make_shared("Behavior"); EXPECT_TRUE(behavior->initialize(runtime)); EXPECT_FALSE(behavior->wakeUp()); } { auto behavior = std::make_shared("Behavior"); behavior->setTarget(pointCloud); EXPECT_TRUE(behavior->initialize(runtime)); EXPECT_FALSE(behavior->wakeUp()); } { auto behavior = std::make_shared("Behavior"); behavior->setSource(particles); EXPECT_TRUE(behavior->initialize(runtime)); EXPECT_FALSE(behavior->wakeUp()); } { auto behavior = std::make_shared("Behavior"); behavior->setSource(particles); behavior->setTarget(pointCloud); EXPECT_TRUE(behavior->initialize(runtime)); EXPECT_TRUE(behavior->wakeUp()); } } TEST(TransferParticlesToPointCloudBehaviorTests, UpdateTest) { auto runtime = std::make_shared(); runtime->addManager(std::make_shared()); runtime->addManager(std::make_shared()); auto sceneElement = std::make_shared("Element"); auto particles = std::make_shared("Particles"); particles->setMaxParticles(10); particles->setMassPerParticle(1.0); particles->setDensity(1.0); particles->setGasStiffness(1.0); particles->setKernelSupport(1.0); for (size_t particleId = 0; particleId < 10; particleId++) { particles->addParticle(Vector3d(static_cast(particleId), 0.0, 0.0), Vector3d::Zero(), 100000); } sceneElement->addComponent(particles); auto pointCloud = std::make_shared("Graphics"); sceneElement->addComponent(pointCloud); auto behavior = std::make_shared("Behavior"); behavior->setSource(particles); behavior->setTarget(pointCloud); sceneElement->addComponent(behavior); auto scene = runtime->getScene(); scene->addSceneElement(sceneElement); particles->update(0.1); behavior->update(0.1); auto sourceVertices = particles->getParticles().safeGet()->getVertices(); auto targetVertices = pointCloud->getVertices()->getVertices(); ASSERT_EQ(sourceVertices.size(), targetVertices.size()); auto sourceVertex = sourceVertices.begin(); auto targetVertex = targetVertices.begin(); for (; sourceVertex != sourceVertices.end(); ++sourceVertex, ++targetVertex) { EXPECT_TRUE(sourceVertex->position.isApprox(targetVertex->position)); } particles->removeParticle(0); particles->removeParticle(1); particles->update(0.1); behavior->update(0.1); sourceVertices = particles->getParticles().safeGet()->getVertices(); targetVertices = pointCloud->getVertices()->getVertices(); ASSERT_EQ(sourceVertices.size(), targetVertices.size()); sourceVertex = sourceVertices.begin(); targetVertex = targetVertices.begin(); for (; sourceVertex != sourceVertices.end(); ++sourceVertex, ++targetVertex) { EXPECT_TRUE(sourceVertex->position.isApprox(targetVertex->position)); } } TEST(TransferParticlesToPointCloudBehaviorTests, SerializationTest) { std::shared_ptr particles = std::make_shared("Particles"); std::shared_ptr pointCloud = std::make_shared("Graphics"); auto behavior = std::make_shared("Behavior"); EXPECT_NO_THROW(behavior->setValue("Source", particles)); EXPECT_NO_THROW(behavior->setValue("Target", pointCloud)); YAML::Node node; ASSERT_NO_THROW(node = YAML::convert::encode(*behavior)); EXPECT_EQ(1u, node.size()); YAML::Node data = node["SurgSim::Blocks::TransferParticlesToPointCloudBehavior"]; EXPECT_EQ(5u, data.size()); std::shared_ptr newBehavior; std::shared_ptr nodeAsComponent = node.as>(); ASSERT_NO_THROW(newBehavior = std::dynamic_pointer_cast(nodeAsComponent)); EXPECT_EQ("SurgSim::Blocks::TransferParticlesToPointCloudBehavior", newBehavior->getClassName()); EXPECT_NE(nullptr, newBehavior->getValue>("Source")); EXPECT_NE(nullptr, newBehavior->getValue>("Target")); } }; // namespace Blocks }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Blocks/UnitTests/TransferPhysicsToGraphicsMeshBehaviorTests.cpp000066400000000000000000000217101277777236100320240ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the TransferPhysicsToGraphicsBehavior class. #include #include "SurgSim/Blocks/TransferPhysicsToGraphicsMeshBehavior.h" #include "SurgSim/DataStructures/TriangleMesh.h" #include "SurgSim/Framework/ApplicationData.h" #include "SurgSim/Framework/BasicSceneElement.h" #include "SurgSim/Framework/BehaviorManager.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Framework/Scene.h" #include "SurgSim/Graphics/Mesh.h" #include "SurgSim/Graphics/OsgBoxRepresentation.h" #include "SurgSim/Graphics/OsgMeshRepresentation.h" #include "SurgSim/Math/OdeState.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/Fem3DElementTetrahedron.h" #include "SurgSim/Physics/Fem3DRepresentation.h" #include "SurgSim/Physics/RigidRepresentation.h" using SurgSim::Blocks::TransferPhysicsToGraphicsMeshBehavior; using SurgSim::Framework::BasicSceneElement; using SurgSim::Framework::BehaviorManager; using SurgSim::Framework::Runtime; using SurgSim::Graphics::OsgBoxRepresentation; using SurgSim::Graphics::OsgMeshRepresentation; using SurgSim::Math::Vector3d; using SurgSim::Physics::Fem3DRepresentation; using SurgSim::Physics::RigidRepresentation; namespace SurgSim { namespace Blocks { TEST(TransferPhysicsToGraphicsMeshBehaviorTests, Constructor) { ASSERT_NO_THROW(TransferPhysicsToGraphicsMeshBehavior("TestBehavior")); } TEST(TransferPhysicsToGraphicsMeshBehaviorTests, SetGetSource) { auto physics = std::make_shared("PhysicsDeformable"); auto rigid = std::make_shared("PhysicsRigid"); auto behavior = std::make_shared("Behavior"); EXPECT_THROW(behavior->setSource(nullptr), SurgSim::Framework::AssertionFailure); EXPECT_THROW(behavior->setSource(rigid), SurgSim::Framework::AssertionFailure); EXPECT_NO_THROW(behavior->setSource(physics)); EXPECT_EQ(physics, behavior->getSource()); } TEST(TransferPhysicsToGraphicsMeshBehaviorTests, SetGetTarget) { auto graphics = std::make_shared("OsgMesh"); auto graphicsBox = std::make_shared("OsgBox"); auto behavior = std::make_shared("Behavior"); EXPECT_THROW(behavior->setTarget(nullptr), SurgSim::Framework::AssertionFailure); EXPECT_THROW(behavior->setTarget(graphicsBox), SurgSim::Framework::AssertionFailure); EXPECT_NO_THROW(behavior->setTarget(graphics)); EXPECT_EQ(graphics, behavior->getTarget()); } TEST(TransferPhysicsToGraphicsMeshBehaviorTests, Update) { auto runtime = std::make_shared("config.txt"); auto behaviorManager = std::make_shared(); runtime->addManager(behaviorManager); auto scene = runtime->getScene(); auto sceneElement = std::make_shared("scene element"); auto physics = std::make_shared("Fem3D"); physics->loadFem("Geometry/wound_deformable.ply"); auto graphics = std::make_shared("GraphicsMesh"); auto behavior = std::make_shared("Behavior"); behavior->setSource(physics); behavior->setTarget(graphics); sceneElement->addComponent(behavior); sceneElement->addComponent(physics); sceneElement->addComponent(graphics); scene->addSceneElement(sceneElement); // Test doInitialize(), doWakeUP() EXPECT_NO_THROW(runtime->start()); boost::this_thread::sleep(boost::posix_time::milliseconds(100)); auto finalState = physics->getFinalState(); auto numNodes = finalState->getNumNodes(); auto target = graphics->getMesh(); ASSERT_NE(0u, target->getNumVertices()); ASSERT_NE(0u, numNodes); ASSERT_EQ(numNodes, target->getNumVertices()); for (size_t nodeId = 0; nodeId < numNodes; ++nodeId) { EXPECT_TRUE(finalState->getPosition(nodeId).isApprox(target->getVertex(nodeId).position)); } // Test TransferPhysicsToGraphicsBehavior::update() finalState->reset(); behavior->update(1.0); for (size_t nodeId = 0; nodeId < numNodes; ++nodeId) { EXPECT_TRUE(target->getVertex(nodeId).position.isApprox(Vector3d::Zero())); } runtime->stop(); } TEST(TransferPhysicsToGraphicsMeshBehaviorTests, Serialization) { std::string filename = std::string("Geometry/wound_deformable_with_texture.ply"); std::shared_ptr physics = std::make_shared("Fem3D"); auto fem3d = std::dynamic_pointer_cast(physics); auto runtime = std::make_shared("config.txt"); fem3d->loadFem(filename); std::shared_ptr graphics = std::make_shared("GraphicsMesh"); auto behavior = std::make_shared("Behavior"); EXPECT_NO_THROW(behavior->setValue("Source", physics)); EXPECT_NO_THROW(behavior->setValue("Target", graphics)); YAML::Node node; ASSERT_NO_THROW(node = YAML::convert::encode(*behavior)); EXPECT_EQ(1u, node.size()); YAML::Node data = node["SurgSim::Blocks::TransferPhysicsToGraphicsMeshBehavior"]; std::shared_ptr newBehavior; ASSERT_NO_THROW(newBehavior = std::dynamic_pointer_cast( node.as>())); EXPECT_EQ("SurgSim::Blocks::TransferPhysicsToGraphicsMeshBehavior", newBehavior->getClassName()); EXPECT_NE(nullptr, newBehavior->getValue>("Source")); EXPECT_NE(nullptr, newBehavior->getValue>("Target")); } TEST(TransferPhysicsToGraphicsMeshBehaviorTests, MappingAccessors) { auto runtime = std::make_shared("config.txt"); auto behavior = std::make_shared("Behavior"); auto names = std::make_pair(std::string("TransferPhysicsToGraphicsMeshBehavior/data.ply"), std::string("TransferPhysicsToGraphicsMeshBehavior/data.ply")); // Plain Setter auto indices = behavior->getIndexMap(); std::vector> empty; EXPECT_TRUE(indices.empty()); indices.push_back(std::make_pair(0, 0)); behavior->setValue("IndexMap", indices); EXPECT_EQ(1u, behavior->getIndexMap().size()); // SetValue with pair ASSERT_NO_THROW(behavior->setValue("IndexMapMeshNames", names)); indices = behavior->getValue>>("IndexMap"); EXPECT_EQ(4, indices.size()); // SetValue with pair of meshes std::shared_ptr mesh1 = std::make_shared(); mesh1->load("TransferPhysicsToGraphicsMeshBehavior/data.ply"); std::shared_ptr mesh2 = std::make_shared(); mesh2->load("TransferPhysicsToGraphicsMeshBehavior/data_more.ply"); auto meshes = std::make_pair(mesh1, mesh2); ASSERT_NO_THROW(behavior->setValue("IndexMapMeshes", meshes)); EXPECT_EQ(9u, behavior->getIndexMap().size()); YAML::Node node; ASSERT_NO_THROW(node = YAML::convert::encode(*behavior)); EXPECT_EQ(1u, node.size()); YAML::Node data = node["SurgSim::Blocks::TransferPhysicsToGraphicsMeshBehavior"]; std::shared_ptr newBehavior; ASSERT_NO_THROW(newBehavior = std::dynamic_pointer_cast( node.as>())); EXPECT_EQ(9u, newBehavior->getIndexMap().size()); } TEST(TransferPhysicsToGraphicsMeshBehaviorTests, Mapping) { Framework::ApplicationData data("config.txt"); auto mesh1 = std::make_shared(); mesh1->load("TransferPhysicsToGraphicsMeshBehavior/data.ply", data); auto indices = generateIndexMap(mesh1, mesh1); EXPECT_EQ(mesh1->getNumVertices(), indices.size()); for (const auto& pair : indices) { EXPECT_EQ(pair.first, pair.second); } auto mesh2 = std::make_shared(); mesh2->load("TransferPhysicsToGraphicsMeshBehavior/data_more.ply", data); indices = generateIndexMap(mesh1, mesh2); EXPECT_EQ(9u, indices.size()); std::array counts = {0, 0, 0, 0}; for (const auto& pair : indices) { ++counts[pair.first]; // Nothing should refer to the first vertex EXPECT_NE(0, pair.second); } EXPECT_EQ(0u, counts[0]); EXPECT_EQ(2u, counts[1]); EXPECT_EQ(3u, counts[2]); EXPECT_EQ(4u, counts[3]); } } } opensurgsim-0.7.0/SurgSim/Blocks/UnitTests/TransferPhysicsToPointCloudBehaviorTests.cpp000066400000000000000000000140651277777236100315340ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the TransferPhysicsToGraphicsBehavior class. #include #include "SurgSim/Blocks/TransferPhysicsToPointCloudBehavior.h" #include "SurgSim/Framework/BasicSceneElement.h" #include "SurgSim/Framework/BehaviorManager.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Framework/Scene.h" #include "SurgSim/Graphics/OsgBoxRepresentation.h" #include "SurgSim/Graphics/OsgPointCloudRepresentation.h" #include "SurgSim/Math/OdeState.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/Fem3DElementTetrahedron.h" #include "SurgSim/Physics/Fem3DRepresentation.h" #include "SurgSim/Physics/RigidRepresentation.h" using SurgSim::Blocks::TransferPhysicsToPointCloudBehavior; using SurgSim::Framework::BasicSceneElement; using SurgSim::Framework::BehaviorManager; using SurgSim::Framework::Runtime; using SurgSim::Graphics::OsgBoxRepresentation; using SurgSim::Graphics::OsgPointCloudRepresentation; using SurgSim::Math::Vector3d; using SurgSim::Physics::Fem3DRepresentation; using SurgSim::Physics::RigidRepresentation; TEST(TransferPhysicsToPointCloudBehaviorTests, ConstructorTest) { ASSERT_NO_THROW(TransferPhysicsToPointCloudBehavior("TestBehavior")); } TEST(TransferPhysicsToPointCloudBehaviorTests, SetGetSourceTest) { auto physics = std::make_shared("PhysicsDeformable"); auto rigid = std::make_shared("PhysicsRigid"); auto behavior = std::make_shared("Behavior"); EXPECT_THROW(behavior->setSource(nullptr), SurgSim::Framework::AssertionFailure); EXPECT_THROW(behavior->setSource(rigid), SurgSim::Framework::AssertionFailure); EXPECT_NO_THROW(behavior->setSource(physics)); EXPECT_EQ(physics, behavior->getSource()); } TEST(TransferPhysicsToPointCloudBehaviorTests, SetGetTargetTest) { auto pointCloud = std::make_shared("OsgMesh"); auto graphicsBox = std::make_shared("OsgBox"); auto behavior = std::make_shared("Behavior"); EXPECT_THROW(behavior->setTarget(nullptr), SurgSim::Framework::AssertionFailure); EXPECT_THROW(behavior->setTarget(graphicsBox), SurgSim::Framework::AssertionFailure); EXPECT_NO_THROW(behavior->setTarget(pointCloud)); EXPECT_EQ(pointCloud, behavior->getTarget()); } TEST(TransferPhysicsToPointCloudBehaviorTests, UpdateTest) { auto runtime = std::make_shared("config.txt"); auto behaviorManager = std::make_shared(); runtime->addManager(behaviorManager); auto scene = runtime->getScene(); auto sceneElement = std::make_shared("scene element"); auto physics = std::make_shared("Fem3D"); physics->loadFem("Geometry/wound_deformable.ply"); auto pointCloud = std::make_shared("GraphicsMesh"); auto behavior = std::make_shared("Behavior"); behavior->setSource(physics); behavior->setTarget(pointCloud); sceneElement->addComponent(behavior); sceneElement->addComponent(physics); sceneElement->addComponent(pointCloud); scene->addSceneElement(sceneElement); // Test doInitialize(), doWakeUP() EXPECT_NO_THROW(runtime->start()); boost::this_thread::sleep(boost::posix_time::milliseconds(100)); auto finalState = physics->getFinalState(); auto numNodes = finalState->getNumNodes(); auto target = pointCloud->getVertices(); ASSERT_NE(0, target->getNumVertices()); ASSERT_NE(0, numNodes); ASSERT_EQ(numNodes, target->getNumVertices()); for (size_t nodeId = 0; nodeId < numNodes; ++nodeId) { EXPECT_TRUE(finalState->getPosition(nodeId).isApprox(target->getVertex(nodeId).position)); } // Test TransferPhysicsToGraphicsBehavior::update() finalState->reset(); behavior->update(1.0); for (size_t nodeId = 0; nodeId < numNodes; ++nodeId) { EXPECT_TRUE(target->getVertex(nodeId).position.isApprox(Vector3d::Zero())); } runtime->stop(); } TEST(TransferPhysicsToPointCloudBehaviorTests, SerializationTest) { std::string filename = std::string("Geometry/wound_deformable_with_texture.ply"); std::shared_ptr physics = std::make_shared("Fem3D"); auto fem3d = std::dynamic_pointer_cast(physics); auto runtime = std::make_shared("config.txt"); fem3d->loadFem(filename); std::shared_ptr pointCloud = std::make_shared("GraphicsMesh"); auto behavior = std::make_shared("Behavior"); EXPECT_NO_THROW(behavior->setValue("Source", physics)); EXPECT_NO_THROW(behavior->setValue("Target", pointCloud)); YAML::Node node; ASSERT_NO_THROW(node = YAML::convert::encode(*behavior)); EXPECT_EQ(1u, node.size()); YAML::Node data = node["SurgSim::Blocks::TransferPhysicsToPointCloudBehavior"]; EXPECT_EQ(5u, data.size()); std::shared_ptr newBehavior; ASSERT_NO_THROW(newBehavior = std::dynamic_pointer_cast( node.as>())); EXPECT_EQ("SurgSim::Blocks::TransferPhysicsToPointCloudBehavior", newBehavior->getClassName()); EXPECT_NE(nullptr, newBehavior->getValue>("Source")); EXPECT_NE(nullptr, newBehavior->getValue>("Target")); } opensurgsim-0.7.0/SurgSim/Blocks/UnitTests/VisualizeConstraintsTest.cpp000066400000000000000000000054471277777236100264450ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Blocks/VisualizeConstraints.h" #include "SurgSim/Graphics/OsgVectorFieldRepresentation.h" #include "SurgSim/Physics/PhysicsManagerState.h" #include "SurgSim/Framework/FrameworkConvert.h" #include namespace SurgSim { namespace Blocks { TEST(VisualizeConstraintsTest, Init) { EXPECT_NO_THROW({ auto element = std::make_shared(); }); EXPECT_NO_THROW({ auto component = std::make_shared("Behavior"); }); } TEST(VisualizeConstraintsTest, SingleSetter) { auto visualizer = std::make_shared("Behavior"); std::shared_ptr field = std::make_shared("VectorField"); EXPECT_NO_THROW(visualizer->setVectorField(Physics::CONSTRAINT_GROUP_TYPE_CONTACT, field)); EXPECT_ANY_THROW(visualizer->setVectorField(Physics::CONSTRAINT_GROUP_TYPE_COUNT, field)); EXPECT_ANY_THROW(visualizer->setVectorField(Physics::CONSTRAINT_GROUP_TYPE_CONTACT, nullptr)); } TEST(VisualizeConstraintsTest, Serialization) { auto behavior = std::make_shared("VisualizeConstraints"); std::shared_ptr field = std::make_shared("VectorField"); VisualizeConstraintsBehavior::FieldsType fields; fields.push_back(std::make_pair(Physics::CONSTRAINT_GROUP_TYPE_CONTACT, field)); EXPECT_NO_THROW(behavior->setValue("VectorFields", fields)); EXPECT_EQ("SurgSim::Blocks::VisualizeConstraintsBehavior", behavior->getClassName()); // Encode YAML::Node node; EXPECT_NO_THROW(node = YAML::convert::encode(*behavior)); EXPECT_TRUE(node.IsMap()); // Decode std::shared_ptr newBehavior; EXPECT_NO_THROW(newBehavior = std::dynamic_pointer_cast( node.as>())); EXPECT_NE(nullptr, newBehavior); // Verify auto newFields = newBehavior->getValue("VectorFields"); EXPECT_EQ(1u, newFields.size()); EXPECT_EQ("VectorField", newFields[0].second->getName()); } } }opensurgsim-0.7.0/SurgSim/Blocks/UnitTests/VisualizeContactsBehaviorTests.cpp000066400000000000000000000113731277777236100275520ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the VisualizeContactsBehavior class. #include #include #include "SurgSim/Blocks/VisualizeContactsBehavior.h" #include "SurgSim/Framework/BasicSceneElement.h" #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Framework/Scene.h" #include "SurgSim/Graphics/OsgManager.h" #include "SurgSim/Physics/RigidCollisionRepresentation.h" using SurgSim::Blocks::VisualizeContactsBehavior; using SurgSim::Physics::RigidCollisionRepresentation; using YAML::Node; TEST(VisualizeContactsBehaviorTests, Constructor) { EXPECT_NO_THROW(std::make_shared("VisualizeContactsBehavior")); EXPECT_NO_THROW({ VisualizeContactsBehavior visualizeContactsBehavior("VisualizeContactsBehavior"); }); } TEST(VisualizeContactsBehaviorTests, SettersGetters) { auto visualizeContactsBehavior = std::make_shared("VisualizeContactsBehavior"); // Test collision representation. std::string name = "CollisionRepresentation"; auto collisionRepresentaiton = std::make_shared(name); EXPECT_NO_THROW(visualizeContactsBehavior->setSource(collisionRepresentaiton)); EXPECT_EQ(name, visualizeContactsBehavior->getSource()->getName()); // Test vector field scale. EXPECT_ANY_THROW(visualizeContactsBehavior->setVectorFieldScale(-1.023)); double scale = 1.234; EXPECT_NO_THROW(visualizeContactsBehavior->setVectorFieldScale(scale)); EXPECT_EQ(scale, visualizeContactsBehavior->getVectorFieldScale()); } TEST(VisualizeContactsBehaviorTests, Serialization) { auto visualizeContactsBehavior = std::make_shared("VisualizeContactsBehavior"); std::string name = "CollisionRepresentation"; auto collisionRepresentation = std::make_shared(name); EXPECT_NO_THROW(visualizeContactsBehavior->setValue("Source", std::static_pointer_cast(collisionRepresentation));); double scale = 1.234; EXPECT_NO_THROW(visualizeContactsBehavior->setValue("VectorFieldScale", scale)); EXPECT_EQ("SurgSim::Blocks::VisualizeContactsBehavior", visualizeContactsBehavior->getClassName()); // Encode Node node; EXPECT_NO_THROW(node = YAML::convert::encode(*visualizeContactsBehavior)); EXPECT_TRUE(node.IsMap()); EXPECT_EQ(5, node[visualizeContactsBehavior->getClassName()].size()); // Decode std::shared_ptr newVisualizeContactsBehavior; EXPECT_NO_THROW(newVisualizeContactsBehavior = std::dynamic_pointer_cast( node.as>())); // Verify EXPECT_EQ(name, SurgSim::Framework::convert>( newVisualizeContactsBehavior->getValue("Source"))->getName()); EXPECT_EQ(scale, SurgSim::Framework::convert(newVisualizeContactsBehavior->getValue("VectorFieldScale"))); } TEST(VisualizeContactsBehaviorTests, MultipleInstances) { auto runtime = std::make_shared(); auto manager = std::make_shared(); runtime->addManager(manager); auto visualizeContactsBehavior1 = std::make_shared("VisualizeContactsBehavior1"); auto visualizeContactsBehavior2 = std::make_shared("VisualizeContactsBehavior2"); auto sceneElement = std::make_shared("SceneElement"); sceneElement->addComponent(visualizeContactsBehavior1); sceneElement->addComponent(visualizeContactsBehavior2); auto collisionRepresentation = std::make_shared("CollisionRepresentation"); EXPECT_NO_THROW(visualizeContactsBehavior1->setSource(collisionRepresentation)); EXPECT_NO_THROW(visualizeContactsBehavior2->setSource(collisionRepresentation)); runtime->getScene()->addSceneElement(sceneElement); EXPECT_TRUE(visualizeContactsBehavior1->isInitialized()); EXPECT_TRUE(visualizeContactsBehavior2->isInitialized()); EXPECT_TRUE(visualizeContactsBehavior1->wakeUp()); EXPECT_TRUE(visualizeContactsBehavior2->wakeUp()); } opensurgsim-0.7.0/SurgSim/Blocks/UnitTests/config.txt.in000066400000000000000000000001521277777236100232750ustar00rootroot00000000000000${PROJECT_BINARY_DIR}/Data/ ${CMAKE_CURRENT_BINARY_DIR}/Data/ ${PROJECT_BINARY_DIR}/SurgSim/Testing/Data/ opensurgsim-0.7.0/SurgSim/Blocks/VisualizeConstraints.cpp000066400000000000000000000147121277777236100236360ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Blocks/VisualizeConstraints.h" #include "SurgSim/Framework/Component.h" #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Graphics/OsgVectorFieldRepresentation.h" #include "SurgSim/Physics/ContactConstraintData.h" #include "SurgSim/Physics/PhysicsManager.h" #include "SurgSim/Physics/SlidingConstraintData.h" namespace SurgSim { namespace Blocks { SURGSIM_REGISTER(SurgSim::Framework::Component, SurgSim::Blocks::VisualizeConstraintsBehavior, VisualizeConstraintsBehavior); VisualizeConstraintsBehavior::VisualizeConstraintsBehavior(const std::string& name) : Behavior(name), m_logger(SurgSim::Framework::Logger::getLogger("Block/VisualizeConstraintsBehavior")) { SURGSIM_ADD_SERIALIZABLE_PROPERTY(VisualizeConstraintsBehavior, FieldsType, VectorFields, getVectorFields, setVectorFields); } void VisualizeConstraintsBehavior::setVectorField(Physics::ConstraintGroupType constraintType, const std::shared_ptr& vectorField) { SURGSIM_ASSERT(constraintType < Physics::CONSTRAINT_GROUP_TYPE_COUNT) << "Invalid constraint type"; auto converted = Framework::checkAndConvert( vectorField, "SurgSim::Graphics::VectorFieldRepresentation"); boost::lock_guard lock(m_graphicsMutex); m_graphics[constraintType] = converted; } void VisualizeConstraintsBehavior::update(double dt) { using DataStructures::Vertices; using Graphics::VectorFieldData; using Physics::ConstraintGroupType; using Physics::ContactConstraintData; Physics::PhysicsManagerState state; auto manager = m_manager.lock(); if (manager == nullptr) { return; } manager->getFinalState(&state); if (state.getMlcpProblem().getSize() == 0) { return; } Math::MlcpSolution::Vector& x = state.getMlcpSolution().x; if (state.getMlcpProblem().getSize() != static_cast(x.size())) { SURGSIM_LOG_WARNING(m_logger) << "mlcp solution size = " << x.size() << " while mlcp problem size = " << state.getMlcpProblem().getSize() << std::endl; return; } if (x.size() < 1) { return; } // For each constraint type... size_t constraintTypeEnd = static_cast(Physics::CONSTRAINT_GROUP_TYPE_COUNT); std::map vectorFields; for (size_t constraintType = 0; constraintType < constraintTypeEnd; constraintType++) { ConstraintGroupType constraintGroupType = static_cast(constraintType); const std::vector>& constraints = state.getConstraintGroup(constraintType); // For each constraint of that type... for (auto it = constraints.begin(); it != constraints.end(); it++) { // Let's gather the application point and the force vector... Math::Vector3d force = Math::Vector3d::Zero(); Math::Vector3d point = (*it)->getLocalizations().first->calculatePosition(); int mlcpConstraintIndex = state.getConstraintsMapping().getValue((*it).get()); Math::Vector4d color = Math::Vector4d::Zero(); switch ((*it)->getType()) { case SurgSim::Physics::FIXED_3DPOINT: { force = x.segment(mlcpConstraintIndex, 3); color = SurgSim::Math::Vector4d(0.9, 0.9, 0.9, 1); } break; case SurgSim::Physics::FIXED_3DROTATION_VECTOR: { force = x.segment(mlcpConstraintIndex, 3); color = SurgSim::Math::Vector4d(0.0, 0.0, 0.9, 1); } break; case SurgSim::Physics::FRICTIONLESS_3DCONTACT: { const SurgSim::Math::Vector3d& forceNormal = std::static_pointer_cast((*it)->getData())->getNormal(); double forceNormalIntensity = x[mlcpConstraintIndex]; force = forceNormal * forceNormalIntensity; color = SurgSim::Math::Vector4d(0.9, 0.0, 0.0, 1); } break; case SurgSim::Physics::FRICTIONLESS_SLIDING: { auto data = std::static_pointer_cast((*it)->getData()); auto normals = data->getNormals(); force = normals[0].cross(normals[1]) * 0.1; color = SurgSim::Math::Vector4d(0.0, 0.9, 0.0, 1); } break; default: break; } // Build the data VectorFieldData data; data.direction = force; data.color.setValue(color); Vertices::VertexType vertex(point, data); vectorFields[constraintGroupType].addVertex(vertex); } } boost::lock_guard lock(m_graphicsMutex); for (const auto& graphics : m_graphics) { graphics.second->updateVectorField(vectorFields[graphics.first]); } } int VisualizeConstraintsBehavior::getTargetManagerType() const { return Framework::MANAGER_TYPE_GRAPHICS; } bool VisualizeConstraintsBehavior::doInitialize() { m_manager = getRuntime()->getManager(); return !m_manager.expired(); } bool VisualizeConstraintsBehavior::doWakeUp() { return true; } void VisualizeConstraintsBehavior::setVectorFields(const FieldsType& fields) { for (const auto& field : fields) { setVectorField(static_cast(field.first), field.second); } } SurgSim::Blocks::VisualizeConstraintsBehavior::FieldsType VisualizeConstraintsBehavior::getVectorFields() const { FieldsType result; for (const auto& field : m_graphics) { result.push_back(field); } return result; } VisualizeConstraints::VisualizeConstraints(const std::string& name) : BasicSceneElement(name) { auto visualizer = std::make_shared("Visualizer"); addComponent(visualizer); { auto vectors = std::make_shared("Contact"); visualizer->setVectorField(Physics::CONSTRAINT_GROUP_TYPE_CONTACT, vectors); addComponent(vectors); } { auto vectors = std::make_shared("Scene"); visualizer->setVectorField(Physics::CONSTRAINT_GROUP_TYPE_SCENE, vectors); addComponent(vectors); } } } } opensurgsim-0.7.0/SurgSim/Blocks/VisualizeConstraints.h000066400000000000000000000064011277777236100232770ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_BLOCKS_VISUALIZECONSTRAINTS_H #define SURGSIM_BLOCKS_VISUALIZECONSTRAINTS_H #include "SurgSim/Framework/BasicSceneElement.h" #include "SurgSim/Framework/Behavior.h" #include "SurgSim/Physics/PhysicsManagerState.h" namespace SurgSim { namespace Physics { class PhysicsManager; } namespace Framework { class Logger; } namespace Graphics { class VectorFieldRepresentation; } namespace Blocks { SURGSIM_STATIC_REGISTRATION(VisualizeConstraintsBehavior); /// Behavior to visualize information about the constraints as they are in the physics manager /// this will show the constraint location and the force from the last iteration of the physics manager /// \note currently only two types of constraint are being visualized MLCP_BILATERAL_3D_CONSTRAINT and /// MLCP_UNILATERAL_3D_FRICTIONLESS_CONSTRAINT class VisualizeConstraintsBehavior : public SurgSim::Framework::Behavior { public: explicit VisualizeConstraintsBehavior(const std::string& name); SURGSIM_CLASSNAME(SurgSim::Blocks::VisualizeConstraintsBehavior); /// Set the graphics Vectorfield to be used to display the constraint of the given physics manager group /// \param constraintType internal group type e.g. CONSTRAINT_GROUP_TYPE_CONTACT /// \param vectorField vectorField to be used for visualization of this constraint group void setVectorField(Physics::ConstraintGroupType constraintType, const std::shared_ptr& vectorField); typedef std::vector>> FieldsType; /// Sets all of the fields in one swoop /// \param fields list of all the fields and their constraint group void setVectorFields(const FieldsType& fields); /// \return all the vector fields used in this behavior FieldsType getVectorFields() const; void update(double dt) override; int getTargetManagerType() const override; private: bool doInitialize() override; bool doWakeUp() override; /// Need reference to physics manager for introspection into the state std::weak_ptr m_manager; std::map> m_graphics; boost::mutex m_graphicsMutex; std::shared_ptr m_logger; }; /// SceneElement that generates the VisualizeConstraintBehavior and the appropriate graphics Vectorfield class VisualizeConstraints : public SurgSim::Framework::BasicSceneElement { public: explicit VisualizeConstraints(const std::string& name = "ConstraintVisualization"); }; }; // namespace Blocks }; // namespace SurgSim #endif // SURGSIM_BLOCKS_VISUALIZECONSTRAINTS_H opensurgsim-0.7.0/SurgSim/Blocks/VisualizeContactsBehavior.cpp000066400000000000000000000126501277777236100245640ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Blocks/VisualizeContactsBehavior.h" #include "SurgSim/Collision/CollisionPair.h" #include "SurgSim/Collision/Representation.h" #include "SurgSim/DataStructures/BufferedValue.h" #include "SurgSim/DataStructures/Vertex.h" #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Framework/SceneElement.h" #include "SurgSim/Graphics/OsgVectorFieldRepresentation.h" #include "SurgSim/Graphics/VectorField.h" #include "SurgSim/Math/RigidTransform.h" using SurgSim::Collision::Contact; using SurgSim::Collision::Representation; using SurgSim::DataStructures::Vertex; using SurgSim::Framework::checkAndConvert; using SurgSim::Graphics::OsgVectorFieldRepresentation; using SurgSim::Graphics::VectorField; using SurgSim::Graphics::VectorFieldData; namespace SurgSim { namespace Blocks { SURGSIM_REGISTER(SurgSim::Framework::Component, SurgSim::Blocks::VisualizeContactsBehavior, VisualizeContactsBehavior); VisualizeContactsBehavior::VisualizeContactsBehavior(const std::string& name): SurgSim::Framework::Behavior(name), m_vectorField(std::make_shared(name + std::string("_VectorField"))) { SURGSIM_ADD_SERIALIZABLE_PROPERTY(VisualizeContactsBehavior, std::shared_ptr, Source, getSource, setSource); SURGSIM_ADD_SERIALIZABLE_PROPERTY(VisualizeContactsBehavior, double, VectorFieldScale, getVectorFieldScale, setVectorFieldScale); } std::shared_ptr VisualizeContactsBehavior::getSource() { return m_source; } void VisualizeContactsBehavior::setSource(std::shared_ptr source) { m_source = checkAndConvert(source, "SurgSim::Collision::Representation"); } void VisualizeContactsBehavior::update(double dt) { std::shared_ptr collisions = m_source->getCollisions().safeGet(); if (!collisions->empty()) { size_t totalContacts = 0; for (auto collision = collisions->cbegin(); collision != collisions->cend(); ++collision) { totalContacts += collision->second.size(); } std::shared_ptr vectorField = m_vectorField->getVectorField(); vectorField->clear(); vectorField->getVertices().reserve(2 * totalContacts); Math::RigidTransform3d inverseElementPose; auto element = getSceneElement(); if (element != nullptr) { inverseElementPose = element->getPose().inverse(); } else { inverseElementPose = Math::RigidTransform3d::Identity(); SURGSIM_LOG_ONCE(Framework::Logger::getDefaultLogger(), WARNING) << getClassName() << " named '" << getFullName() << "' must be in a SceneElement."; } auto representationPoseFirst = m_source->getPose(); for (auto it = collisions->cbegin(); it != collisions->cend(); ++it) { auto representationPoseSecond = (*it).first->getPose(); for (auto iter = (*it).second.cbegin(); iter != (*it).second.cend(); ++iter) { VectorFieldData vectorData1; VectorFieldData vectorData2; vectorData1.direction = -(*iter)->normal * (*iter)->depth; vectorData2.direction = (*iter)->normal * (*iter)->depth; Vertex vertex1 = Vertex( (*iter)->penetrationPoints.first.rigidLocalPosition.getValue(), vectorData1); Vertex vertex2 = Vertex( (*iter)->penetrationPoints.second.rigidLocalPosition.getValue(), vectorData2); vertex1.position = inverseElementPose * representationPoseFirst * vertex1.position; vertex2.position = inverseElementPose * representationPoseSecond * vertex2.position; vectorField->addVertex(vertex1); vectorField->addVertex(vertex2); } } m_vectorField->setLocalActive(true); } else { m_vectorField->setLocalActive(false); } } int VisualizeContactsBehavior::getTargetManagerType() const { return SurgSim::Framework::MANAGER_TYPE_GRAPHICS; } bool VisualizeContactsBehavior::doInitialize() { return true; } bool VisualizeContactsBehavior::doWakeUp() { if (m_source == nullptr) { SURGSIM_LOG_SEVERE(SurgSim::Framework::Logger::getDefaultLogger()) << getClassName() << " named '" << getName() << "' must have a source."; return false; } auto element = getSceneElement(); if (element == nullptr) { SURGSIM_LOG_SEVERE(SurgSim::Framework::Logger::getDefaultLogger()) << getClassName() << " named '" << getFullName() << "' must be in a SceneElement."; return false; } return element->addComponent(m_vectorField); } double VisualizeContactsBehavior::getVectorFieldScale() { return m_vectorField->getScale(); } void VisualizeContactsBehavior::setVectorFieldScale(double scale) { SURGSIM_ASSERT(scale > 0.0) << "Scale of vector field must be positive."; m_vectorField->setScale(scale); } } // namespace Blocks } // namespace SurgSim opensurgsim-0.7.0/SurgSim/Blocks/VisualizeContactsBehavior.h000066400000000000000000000050331277777236100242260ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_BLOCKS_VISUALIZECONTACTSBEHAVIOR_H #define SURGSIM_BLOCKS_VISUALIZECONTACTSBEHAVIOR_H #include #include #include "SurgSim/Framework/Behavior.h" #include "SurgSim/Framework/ObjectFactory.h" namespace SurgSim { namespace Graphics { class VectorFieldRepresentation; } namespace Collision { class Representation; } namespace Blocks { SURGSIM_STATIC_REGISTRATION(VisualizeContactsBehavior); /// This behavior is used to visualize the contacts /// on collision representation through vector field class VisualizeContactsBehavior: public SurgSim::Framework::Behavior { public: /// Constructor /// \param name Name of the behavior explicit VisualizeContactsBehavior(const std::string& name); SURGSIM_CLASSNAME(SurgSim::Blocks::VisualizeContactsBehavior); /// Get the source of the contacts /// \return The collision representation whose contacts will be visualized. std::shared_ptr getSource(); /// Set the source of the contacts /// \param source The collision representation whose contacts will be visualized. void setSource(std::shared_ptr source); void update(double dt) override; int getTargetManagerType() const override; /// \return The scale of the vector field. double getVectorFieldScale(); /// Set the scale of vector field, default 1.0. // \param scale The scale of the vector field. void setVectorFieldScale(double scale); protected: bool doInitialize() override; bool doWakeUp() override; private: /// The collision representation to get contacts for visualizing. std::shared_ptr m_source; /// The osg vector field for visualizing contacts on collision representation std::shared_ptr m_vectorField; }; } // namespace Blocks } // namespace SurgSim #endif // SURGSIM_BLOCKS_VISUALIZECONTACTSBEHAVIOR_H opensurgsim-0.7.0/SurgSim/CMakeLists.txt000066400000000000000000000020361277777236100202460ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2012-2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. link_directories(${Boost_LIBRARY_DIRS}) add_subdirectory(Blocks) add_subdirectory(Collision) add_subdirectory(DataStructures) add_subdirectory(Devices) add_subdirectory(Framework) add_subdirectory(Graphics) add_subdirectory(Input) add_subdirectory(Math) add_subdirectory(Particles) add_subdirectory(Physics) add_subdirectory(Testing) set(SURGSIM_DEVICES_LIBRARIES ${SURGSIM_DEVICES_LIBRARIES} PARENT_SCOPE) opensurgsim-0.7.0/SurgSim/Collision/000077500000000000000000000000001277777236100174405ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Collision/BoxCapsuleContact.cpp000066400000000000000000000156511277777236100235350ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Collision/BoxCapsuleContact.h" #include "SurgSim/Collision/CollisionPair.h" #include "SurgSim/Collision/Representation.h" #include "SurgSim/Math/Geometry.h" #include "SurgSim/Math/Vector.h" using SurgSim::DataStructures::Location; using SurgSim::Math::BoxShape; using SurgSim::Math::CapsuleShape; using SurgSim::Math::RigidTransform3d; using SurgSim::Math::Vector3d; using SurgSim::Math::doesIntersectBoxCapsule; using SurgSim::Math::distancePointSegment; using SurgSim::Math::intersectionsSegmentBox; using SurgSim::Math::Geometry::DistanceEpsilon; namespace { typedef Eigen::AlignedBox::CornerType CornerType; const std::array, 12> edges = { std::make_pair(CornerType::BottomLeftFloor, CornerType::TopLeftFloor), std::make_pair(CornerType::BottomRightFloor, CornerType::TopRightFloor), std::make_pair(CornerType::BottomLeftCeil, CornerType::TopLeftCeil), std::make_pair(CornerType::BottomRightCeil, CornerType::TopRightCeil), std::make_pair(CornerType::BottomLeftFloor, CornerType::BottomRightFloor), std::make_pair(CornerType::BottomLeftCeil, CornerType::BottomRightCeil), std::make_pair(CornerType::TopLeftFloor, CornerType::TopRightFloor), std::make_pair(CornerType::TopLeftCeil, CornerType::TopRightCeil), std::make_pair(CornerType::BottomLeftFloor, CornerType::BottomLeftCeil), std::make_pair(CornerType::BottomRightFloor, CornerType::BottomRightCeil), std::make_pair(CornerType::TopLeftFloor, CornerType::TopLeftCeil), std::make_pair(CornerType::TopRightFloor, CornerType::TopRightCeil) }; }; namespace SurgSim { namespace Collision { std::pair BoxCapsuleContact::getShapeTypes() { return std::pair(SurgSim::Math::SHAPE_TYPE_BOX, SurgSim::Math::SHAPE_TYPE_CAPSULE); } std::list> BoxCapsuleContact::calculateDcdContact( const SurgSim::Math::BoxShape& boxShape, const SurgSim::Math::RigidTransform3d& boxPose, const SurgSim::Math::CapsuleShape& capsuleShape, const SurgSim::Math::RigidTransform3d& capsulePose) const { std::list> contacts; RigidTransform3d capsuleToBoxTransform = boxPose.inverse() * capsulePose; Vector3d capsuleBottom = capsuleToBoxTransform * capsuleShape.bottomCenter(); Vector3d capsuleTop = capsuleToBoxTransform * capsuleShape.topCenter(); double capsuleRadius = capsuleShape.getRadius(); Vector3d boxRadii = boxShape.getSize() / 2.0; Eigen::AlignedBox box(-boxRadii, boxRadii); if (doesIntersectBoxCapsule(capsuleBottom, capsuleTop, capsuleRadius, box)) { Vector3d normal, segmentPoint, deepestBoxPoint, deepestCapsulePoint; distancePointSegment(Vector3d::Zero().eval(), capsuleBottom, capsuleTop, &segmentPoint); if (!segmentPoint.isZero(DistanceEpsilon)) { // The capsule's segment does not pass through the box center. if (box.contains(segmentPoint)) { // The capsule's segment passes through the box. Vector3d::Index closestFace; (boxRadii - segmentPoint.cwiseAbs()).minCoeff(&closestFace); normal.setZero(); normal[closestFace] = -segmentPoint[closestFace]; normal.normalize(); deepestBoxPoint = boxRadii.array() * (1 - 2 * (segmentPoint.array() < 0).cast()); deepestCapsulePoint = segmentPoint - capsuleRadius * segmentPoint.normalized(); } else { // The closest point on the capsule's segment to the center of the box is outside the box. deepestBoxPoint = segmentPoint.array().min(box.max().array()).max(box.min().array()); normal = deepestBoxPoint - segmentPoint; if (normal.norm() > capsuleRadius) { // The closest point to the box center is too far away. // Find the closest point to all 12 box edges. double minDistance = 2.0 * capsuleRadius; for (auto edge : edges) { Vector3d tempSegmentPoint; Vector3d tempBoxPoint; double tempDistance = SurgSim::Math::distanceSegmentSegment(capsuleBottom, capsuleTop, box.corner(edge.first), box.corner(edge.second), &tempSegmentPoint, &tempBoxPoint); if (tempDistance < minDistance) { minDistance = tempDistance; segmentPoint = tempSegmentPoint; deepestBoxPoint = tempBoxPoint; } } normal = deepestBoxPoint - segmentPoint; if (normal.norm() > capsuleRadius) { // The closest point to any edge is too far away. // Check the endpoints. segmentPoint = capsuleTop; deepestBoxPoint = segmentPoint.array().min(box.max().array()).max(box.min().array()); normal = deepestBoxPoint - segmentPoint; if (normal.norm() > capsuleRadius) { segmentPoint = capsuleBottom; deepestBoxPoint = segmentPoint.array().min(box.max().array()).max(box.min().array()); normal = deepestBoxPoint - segmentPoint; } } } normal.normalize(); deepestCapsulePoint = segmentPoint + capsuleRadius * normal; } } else { // The capsule's segment passes through the box center. if (capsuleTop.isZero(DistanceEpsilon) && capsuleBottom.isZero(DistanceEpsilon)) { // The capsule's segment has no length and is located at the box center. Vector3d::Index closestFace; boxRadii.minCoeff(&closestFace); normal.setZero(); normal[closestFace] = -boxRadii[closestFace]; normal.normalize(); } else { // The capsule's segment has a length, pick the closest endpoint to the box center. if (capsuleTop.squaredNorm() < capsuleBottom.squaredNorm()) { segmentPoint = capsuleTop; normal = -capsuleBottom.normalized(); } else { segmentPoint = capsuleBottom; normal = -capsuleTop.normalized(); } } deepestBoxPoint = boxRadii.array() * (1 - 2 * (normal.array() > 0).cast()); deepestCapsulePoint = segmentPoint + capsuleRadius * normal; } double distance = (deepestCapsulePoint - deepestBoxPoint).dot(normal); normal = boxPose.linear() * normal; std::pair penetrationPoints = std::make_pair(Location(deepestBoxPoint), Location(capsulePose.inverse() * boxPose * deepestCapsulePoint)); contacts.emplace_back(std::make_shared(COLLISION_DETECTION_TYPE_DISCRETE, distance, 1.0, Vector3d::Zero(), normal, penetrationPoints)); } return contacts; } }; // namespace Collision }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Collision/BoxCapsuleContact.h000066400000000000000000000031341277777236100231730ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_COLLISION_BOXCAPSULECONTACT_H #define SURGSIM_COLLISION_BOXCAPSULECONTACT_H #include #include "SurgSim/Collision/ShapeShapeContactCalculation.h" #include "SurgSim/Math/BoxShape.h" #include "SurgSim/Math/CapsuleShape.h" #include "SurgSim/Math/RigidTransform.h" namespace SurgSim { namespace Collision { /// Class to calculate intersections between Boxes and Capsules class BoxCapsuleContact : public ShapeShapeContactCalculation { public: using ContactCalculation::calculateDcdContact; std::list> calculateDcdContact( const SurgSim::Math::BoxShape& boxShape, const SurgSim::Math::RigidTransform3d& boxPose, const SurgSim::Math::CapsuleShape& capsuleShape, const SurgSim::Math::RigidTransform3d& capsulePose) const override; std::pair getShapeTypes() override; }; }; // namespace Collision }; // namespace SurgSim #endif opensurgsim-0.7.0/SurgSim/Collision/BoxDoubleSidedPlaneContact.cpp000066400000000000000000000123721277777236100253010ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Collision/BoxDoubleSidedPlaneContact.h" #include "SurgSim/Collision/CollisionPair.h" #include "SurgSim/Collision/Representation.h" #include "SurgSim/Math/Geometry.h" #include "SurgSim/Math/Vector.h" using SurgSim::DataStructures::Location; using SurgSim::Math::BoxShape; using SurgSim::Math::DoubleSidedPlaneShape; using SurgSim::Math::Geometry::DistanceEpsilon; using SurgSim::Math::Vector3d; namespace SurgSim { namespace Collision { std::pair BoxDoubleSidedPlaneContact::getShapeTypes() { return std::pair(SurgSim::Math::SHAPE_TYPE_BOX, SurgSim::Math::SHAPE_TYPE_DOUBLESIDEDPLANE); } std::list> BoxDoubleSidedPlaneContact::calculateDcdContact( const SurgSim::Math::BoxShape& boxShape, const SurgSim::Math::RigidTransform3d& boxPose, const SurgSim::Math::DoubleSidedPlaneShape& planeShape, const SurgSim::Math::RigidTransform3d& planePose) const { std::list> contacts; // Transform the plane normal to box co-ordinate system. SurgSim::Math::RigidTransform3d planeLocalToBoxLocal = boxPose.inverse() * planePose; Vector3d planeNormal = planeLocalToBoxLocal.linear() * planeShape.getNormal(); Vector3d planeNormalScaled = planeShape.getNormal() * -planeShape.getD(); Vector3d planePoint = planeLocalToBoxLocal * planeNormalScaled; double planeD = -planeNormal.dot(planePoint); // Loop through the box vertices (boxVertex) and calculate "d = (planeNormal.dot(boxVertex) + planeD)". // Keep track of max and min of 'd'. // Collision check overview: // - If 'd' values contain both positive and negative values, there is an intersection. // ---- Lower of the abs(maxD) and abs(minD) is the deepest penetration point. // ---- collisionNormal is sign(d) * planeNormal. // - If not, at least one of the 'd' values is zero. // ---- collisionNormal is sign(max(abs(maxD), abs(minD))) * planeNormal. double d[8] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; double maxD = -std::numeric_limits::max(); double minD = std::numeric_limits::max(); Vector3d boxVertices[8]; for (int i = 0; i < 8; ++i) { boxVertices[i] = boxShape.getVertex(i); d[i] = planeNormal.dot(boxVertices[i]) + planeD; maxD = std::max(d[i], maxD); minD = std::min(d[i], minD); } if (!(maxD > DistanceEpsilon && minD > DistanceEpsilon) && !(maxD < -DistanceEpsilon && minD < -DistanceEpsilon)) { // There is an intersection. // Two cases: // - Vertex touching plane. // - Vertex through plane. Vector3d normal; enum BoxPlaneIntersectionType { BoxPlaneIntersectionTypeEqualsZero, BoxPlaneIntersectionTypeLessThanZero, BoxPlaneIntersectionTypeGreaterThanZero } boxPlaneIntersectionType; if (std::abs(maxD) < DistanceEpsilon) { // Box is touching the "back side" of plane. normal = -(planePose.linear() * planeShape.getNormal()); boxPlaneIntersectionType = BoxPlaneIntersectionTypeEqualsZero; } else if (std::abs(minD) < DistanceEpsilon) { // Box is touching the "front side" of plane. normal = planePose.linear() * planeShape.getNormal(); boxPlaneIntersectionType = BoxPlaneIntersectionTypeEqualsZero; } else { if (std::abs(maxD) >= std::abs(minD)) { // Box is penetrating through the "front side" of plane. normal = planePose.linear() * planeShape.getNormal(); boxPlaneIntersectionType = BoxPlaneIntersectionTypeLessThanZero; } else { // Box is penetrating through the "back side" of plane. normal = -(planePose.linear() * planeShape.getNormal()); boxPlaneIntersectionType = BoxPlaneIntersectionTypeGreaterThanZero; } } // Loop through vertices and check if a contact point needs to be generated. bool generateContact = false; for (int i = 0; i < 8; ++i) { switch (boxPlaneIntersectionType) { case BoxPlaneIntersectionTypeEqualsZero: generateContact = std::abs(d[i]) < DistanceEpsilon; break; case BoxPlaneIntersectionTypeLessThanZero: generateContact = d[i] < -DistanceEpsilon; break; case BoxPlaneIntersectionTypeGreaterThanZero: generateContact = d[i] > DistanceEpsilon; break; } if (generateContact) { std::pair penetrationPoints = std::make_pair(Location(boxVertices[i]), Location(planePose.inverse() * (boxPose * boxVertices[i] + normal * std::abs(d[i])))); contacts.emplace_back(std::make_shared( COLLISION_DETECTION_TYPE_DISCRETE, std::abs(d[i]), 1.0, Vector3d::Zero(), normal, penetrationPoints)); generateContact = false; } } } return contacts; } }; // namespace Collision }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Collision/BoxDoubleSidedPlaneContact.h000066400000000000000000000032421277777236100247420ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_COLLISION_BOXDOUBLESIDEDPLANECONTACT_H #define SURGSIM_COLLISION_BOXDOUBLESIDEDPLANECONTACT_H #include #include "SurgSim/Collision/ShapeShapeContactCalculation.h" #include "SurgSim/Math/BoxShape.h" #include "SurgSim/Math/DoubleSidedPlaneShape.h" #include "SurgSim/Math/RigidTransform.h" namespace SurgSim { namespace Collision { class CollisionPair; /// Class to calculate intersections between Boxes and Planes class BoxDoubleSidedPlaneContact : public ShapeShapeContactCalculation { public: using ContactCalculation::calculateDcdContact; std::list> calculateDcdContact( const SurgSim::Math::BoxShape& boxShape, const SurgSim::Math::RigidTransform3d& boxPose, const SurgSim::Math::DoubleSidedPlaneShape& planeShape, const SurgSim::Math::RigidTransform3d& planePose) const override; std::pair getShapeTypes() override; }; }; // namespace Collision }; // namespace SurgSim #endif opensurgsim-0.7.0/SurgSim/Collision/BoxPlaneContact.cpp000066400000000000000000000053711277777236100231760ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Collision/BoxPlaneContact.h" #include "SurgSim/Collision/CollisionPair.h" #include "SurgSim/Collision/Representation.h" #include "SurgSim/Math/Geometry.h" #include "SurgSim/Math/Vector.h" using SurgSim::DataStructures::Location; using SurgSim::Math::BoxShape; using SurgSim::Math::Geometry::DistanceEpsilon; using SurgSim::Math::PlaneShape; using SurgSim::Math::Vector3d; namespace SurgSim { namespace Collision { std::pair BoxPlaneContact::getShapeTypes() { return std::pair(SurgSim::Math::SHAPE_TYPE_BOX, SurgSim::Math::SHAPE_TYPE_PLANE); } std::list> BoxPlaneContact::calculateDcdContact( const SurgSim::Math::BoxShape& boxShape, const SurgSim::Math::RigidTransform3d& boxPose, const SurgSim::Math::PlaneShape& planeShape, const SurgSim::Math::RigidTransform3d& planePose) const { std::list> contacts; // Transform the plane normal to box co-ordinate system. SurgSim::Math::RigidTransform3d planeLocalToBoxLocal = boxPose.inverse() * planePose; SurgSim::Math::RigidTransform3d boxLocalToPlaneLocal = planeLocalToBoxLocal.inverse(); Vector3d planeNormal = planeLocalToBoxLocal.linear() * planeShape.getNormal(); Vector3d planeNormalScaled = planeShape.getNormal() * -planeShape.getD(); Vector3d planePoint = planeLocalToBoxLocal * planeNormalScaled; double planeD = -planeNormal.dot(planePoint); // Loop through the box vertices (boxVertex) and check it it is below plane. double d = 0.0; Vector3d boxVertex; for (int i = 0; i < 8; ++i) { boxVertex = boxShape.getVertex(i); d = planeNormal.dot(boxVertex) + planeD; if (d < DistanceEpsilon) { std::pair penetrationPoints = std::make_pair(Location(boxVertex), Location(boxLocalToPlaneLocal * (boxVertex - planeNormal * d))); contacts.emplace_back(std::make_shared( COLLISION_DETECTION_TYPE_DISCRETE, -d, 1.0, Vector3d::Zero(), planePose.linear() * planeShape.getNormal(), penetrationPoints)); } } return contacts; } }; // namespace Collision }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Collision/BoxPlaneContact.h000066400000000000000000000031411277777236100226340ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_COLLISION_BOXPLANECONTACT_H #define SURGSIM_COLLISION_BOXPLANECONTACT_H #include #include "SurgSim/Collision/ShapeShapeContactCalculation.h" #include "SurgSim/Math/BoxShape.h" #include "SurgSim/Math/PlaneShape.h" #include "SurgSim/Math/RigidTransform.h" namespace SurgSim { namespace Collision { class CollisionPair; /// Class to calculate intersections between Boxes and Planes class BoxPlaneContact : public ShapeShapeContactCalculation { public: using ContactCalculation::calculateDcdContact; std::list> calculateDcdContact( const SurgSim::Math::BoxShape& boxShape, const SurgSim::Math::RigidTransform3d& boxPose, const SurgSim::Math::PlaneShape& planeShape, const SurgSim::Math::RigidTransform3d& planePose) const override; std::pair getShapeTypes() override; }; }; // namespace Collision }; // namespace SurgSim #endif opensurgsim-0.7.0/SurgSim/Collision/BoxSphereContact.cpp000066400000000000000000000116221277777236100233610ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Collision/BoxSphereContact.h" #include "SurgSim/Collision/CollisionPair.h" #include "SurgSim/Collision/Representation.h" #include "SurgSim/Math/Geometry.h" #include "SurgSim/Math/Vector.h" using SurgSim::DataStructures::Location; using SurgSim::Math::BoxShape; using SurgSim::Math::Geometry::DistanceEpsilon; using SurgSim::Math::Geometry::SquaredDistanceEpsilon; using SurgSim::Math::SphereShape; using SurgSim::Math::Vector3d; namespace SurgSim { namespace Collision { std::pair BoxSphereContact::getShapeTypes() { return std::pair(SurgSim::Math::SHAPE_TYPE_BOX, SurgSim::Math::SHAPE_TYPE_SPHERE); } std::list> BoxSphereContact::calculateDcdContact( const SurgSim::Math::BoxShape& boxShape, const SurgSim::Math::RigidTransform3d& boxPose, const SurgSim::Math::SphereShape& sphereShape, const SurgSim::Math::RigidTransform3d& spherePose) const { std::list> contacts; // Sphere center... Vector3d sphereCenter = spherePose.translation(); // ... in Box coordinate system. Vector3d boxLocalSphereCenter = boxPose.inverse() * sphereCenter; // Box half size. Vector3d boxSize = boxShape.getSize() * 0.5; // Determine the closest point to the sphere center in the box Vector3d closestPoint = boxLocalSphereCenter; closestPoint.x() = std::min(boxSize.x(), closestPoint.x()); closestPoint.x() = std::max(-boxSize.x(), closestPoint.x()); closestPoint.y() = std::min(boxSize.y(), closestPoint.y()); closestPoint.y() = std::max(-boxSize.y(), closestPoint.y()); closestPoint.z() = std::min(boxSize.z(), closestPoint.z()); closestPoint.z() = std::max(-boxSize.z(), closestPoint.z()); // Distance between the closestPoint and boxLocalSphereCenter. Normal points into first representation, the box. Vector3d normal = closestPoint - boxLocalSphereCenter; double distanceSquared = normal.squaredNorm(); if (distanceSquared - (sphereShape.getRadius() * sphereShape.getRadius()) > SquaredDistanceEpsilon) { // There is no collision. return contacts; } double distance = 0.0; // If sphere center is inside box, it is handled differently. if (distanceSquared <= SquaredDistanceEpsilon) { // Sphere center is inside the box. // In this case closestPoint is equal to boxLocalSphereCenter. // Find which face of the box is closest to the closestPoint. // abs(boxSize.x - closestPoint.x) and abs(-boxSize.x - closestPoint.x) are the distances between the // closestPoint and the two faces (along x-axis) of the box. // But since the abs(closestPoint.x) will always <= boxSize.x (because the point is inside box), // (boxSize.x() - abs(closestPoint.x())) gives the distance from the closestPoint to whichever x-axis face is // closest. This value is calculated for all the axes. The axis with the minimum value contains the // colliding face. Vector3d distancesFromFaces = boxSize - closestPoint.cwiseAbs(); int minimumDistanceId; distancesFromFaces.minCoeff(&minimumDistanceId); // The mininumDistanceId is the index of the non-zero component of the normal of the closest face. // The normal points toward the first representation, the box. So the sign (or direction) of that entry is +1 // if the closestPoint component is negative and vice versa. double direction = closestPoint[minimumDistanceId] > -DistanceEpsilon ? -1.0 : 1.0; normal.setZero(); normal[minimumDistanceId] = direction; // The closestPoint should be on the closest box face, so the negative of the normal direction. closestPoint[minimumDistanceId] = boxSize[minimumDistanceId] * (-direction); distance = -std::abs(distancesFromFaces[minimumDistanceId]); } else { // Sphere center is outside box. distance = normal.norm(); normal /= distance; } double depth = std::abs(distance - sphereShape.getRadius()); normal = boxPose.linear() * normal; std::pair penetrationPoints = std::make_pair(Location(closestPoint), Location(spherePose.inverse() * (sphereCenter + (normal * sphereShape.getRadius())))); // Create the contact. contacts.emplace_back(std::make_shared( COLLISION_DETECTION_TYPE_DISCRETE, depth, 1.0, Vector3d::Zero(), normal, penetrationPoints)); return contacts; } }; // namespace Collision }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Collision/BoxSphereContact.h000066400000000000000000000031101277777236100230170ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_COLLISION_BOXSPHERECONTACT_H #define SURGSIM_COLLISION_BOXSPHERECONTACT_H #include #include "SurgSim/Collision/ShapeShapeContactCalculation.h" #include "SurgSim/Math/BoxShape.h" #include "SurgSim/Math/SphereShape.h" #include "SurgSim/Math/RigidTransform.h" namespace SurgSim { namespace Collision { class CollisionPair; /// Class to calculate intersections between a box and a sphere class BoxSphereContact : public ShapeShapeContactCalculation { public: using ContactCalculation::calculateDcdContact; std::list> calculateDcdContact( const Math::BoxShape& boxShape, const Math::RigidTransform3d& boxPose, const Math::SphereShape& sphereShape, const Math::RigidTransform3d& spherePose) const override; std::pair getShapeTypes() override; }; }; // namespace Collision }; // namespace SurgSim #endif opensurgsim-0.7.0/SurgSim/Collision/CMakeLists.txt000066400000000000000000000055571277777236100222140ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2012-2015, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. set(SURGSIM_COLLISION_SOURCES BoxCapsuleContact.cpp BoxDoubleSidedPlaneContact.cpp BoxPlaneContact.cpp BoxSphereContact.cpp CapsuleSphereContact.cpp CollisionPair.cpp CompoundShapeContact.cpp ContactCalculation.cpp ContactFilter.cpp DefaultContactCalculation.cpp ElementContactFilter.cpp OctreeCapsuleContact.cpp OctreeContact.cpp OctreeDoubleSidedPlaneContact.cpp OctreePlaneContact.cpp OctreeSphereContact.cpp Representation.cpp SegmentMeshTriangleMeshContact.cpp SegmentSegmentCcdIntervalCheck.cpp SegmentSegmentCcdMovingContact.cpp SegmentSegmentCcdStaticContact.cpp SegmentSelfContact.cpp ShapeCollisionRepresentation.cpp SphereDoubleSidedPlaneContact.cpp SpherePlaneContact.cpp SphereSphereContact.cpp TriangleMeshParticlesContact.cpp TriangleMeshPlaneContact.cpp TriangleMeshSurfaceMeshContact.cpp TriangleMeshTriangleMeshContact.cpp ) set(SURGSIM_COLLISION_HEADERS BoxCapsuleContact.h BoxDoubleSidedPlaneContact.h BoxPlaneContact.h BoxSphereContact.h CapsuleSphereContact.h CcdDcdCollision.h CollisionPair.h CompoundShapeContact.h ContactCalculation.h ContactFilter.h DefaultContactCalculation.h ElementContactFilter.h OctreeCapsuleContact.h OctreeContact.h OctreeDoubleSidedPlaneContact.h OctreePlaneContact.h OctreeSphereContact.h Representation.h SegmentMeshTriangleMeshContact.h SegmentSegmentCcdIntervalCheck.h SegmentSegmentCcdMovingContact.h SegmentSegmentCcdStaticContact.h SegmentSelfContact.h ShapeCollisionRepresentation.h ShapeShapeContactCalculation.h SphereDoubleSidedPlaneContact.h SpherePlaneContact.h SphereSphereContact.h TriangleMeshParticlesContact.h TriangleMeshPlaneContact.h TriangleMeshSurfaceMeshContact.h TriangleMeshTriangleMeshContact.h ) surgsim_create_library_header(Collision.h "${SURGSIM_COLLISION_HEADERS}") surgsim_add_library( SurgSimCollision "${SURGSIM_COLLISION_SOURCES}" "${SURGSIM_COLLISION_HEADERS}" ) SET(LIBS SurgSimFramework SurgSimMath ${Boost_LIBRARIES} ) target_link_libraries(SurgSimCollision ${LIBS} ) if(BUILD_TESTING) add_subdirectory(UnitTests) if(BUILD_PERFORMANCE_TESTING) add_subdirectory(PerformanceTests) endif() endif() # Put SurgSimCollision into folder "Collision" set_target_properties(SurgSimCollision PROPERTIES FOLDER "Collision") opensurgsim-0.7.0/SurgSim/Collision/CapsuleSphereContact.cpp000066400000000000000000000051461277777236100242310ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Collision/CapsuleSphereContact.h" #include "SurgSim/Collision/CollisionPair.h" #include "SurgSim/Collision/Representation.h" #include "SurgSim/Math/CapsuleShape.h" #include "SurgSim/Math/Geometry.h" #include "SurgSim/Math/SphereShape.h" using SurgSim::DataStructures::Location; using SurgSim::Math::CapsuleShape; using SurgSim::Math::SphereShape; using SurgSim::Math::Vector3d; namespace SurgSim { namespace Collision { std::pair CapsuleSphereContact::getShapeTypes() { return std::pair(SurgSim::Math::SHAPE_TYPE_CAPSULE, SurgSim::Math::SHAPE_TYPE_SPHERE); } std::list> CapsuleSphereContact::calculateDcdContact( const Math::CapsuleShape& capsule, const Math::RigidTransform3d& capsulePose, const Math::SphereShape& sphere, const Math::RigidTransform3d& spherePose) const { std::list> contacts; Vector3d sphereCenter(spherePose.translation()); Vector3d globalTop(capsulePose * capsule.topCenter()); Vector3d globalBottom(capsulePose * capsule.bottomCenter()); Vector3d result; double dist = SurgSim::Math::distancePointSegment(sphereCenter, globalTop, globalBottom, &result); double distThreshold = capsule.getRadius() + sphere.getRadius(); if (dist < distThreshold) { double depth = distThreshold - dist; // Calculate the normal going from the sphere to the capsule Vector3d normal = (result - sphereCenter).normalized(); std::pair penetrationPoints; penetrationPoints.first.rigidLocalPosition.setValue( capsulePose.inverse() * (result - normal * capsule.getRadius())); penetrationPoints.second.rigidLocalPosition.setValue( spherePose.inverse() * (sphereCenter + normal * sphere.getRadius())); contacts.emplace_back(std::make_shared( COLLISION_DETECTION_TYPE_DISCRETE, depth, 1.0, Vector3d::Zero(), normal, penetrationPoints)); } return contacts; } }; // namespace Collision }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Collision/CapsuleSphereContact.h000066400000000000000000000030671277777236100236760ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_COLLISION_CAPSULESPHERECONTACT_H #define SURGSIM_COLLISION_CAPSULESPHERECONTACT_H #include #include "SurgSim/Math/CapsuleShape.h" #include "SurgSim/Math/SphereShape.h" #include "SurgSim/Collision/ShapeShapeContactCalculation.h" namespace SurgSim { namespace Collision { class CollisionPair; /// Class to calculate intersections between a capsule and a sphere class CapsuleSphereContact : public ShapeShapeContactCalculation { public: using ContactCalculation::calculateDcdContact; std::list> calculateDcdContact( const Math::CapsuleShape& capsule, const Math::RigidTransform3d& capsulePose, const Math::SphereShape& sphere, const Math::RigidTransform3d& spherePose) const override; std::pair getShapeTypes() override; }; }; // namespace Collision }; // namespace SurgSim #endif opensurgsim-0.7.0/SurgSim/Collision/CcdDcdCollision.h000066400000000000000000000036201277777236100225720ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_COLLISION_CCDDCDCOLLISION_H #define SURGSIM_COLLISION_CCDDCDCOLLISION_H #include "SurgSim/Collision/BoxCapsuleContact.h" #include "SurgSim/Collision/BoxDoubleSidedPlaneContact.h" #include "SurgSim/Collision/BoxPlaneContact.h" #include "SurgSim/Collision/BoxSphereContact.h" #include "SurgSim/Collision/CapsuleSphereContact.h" #include "SurgSim/Collision/CompoundShapeContact.h" #include "SurgSim/Collision/ContactCalculation.h" #include "SurgSim/Collision/DefaultContactCalculation.h" #include "SurgSim/Collision/OctreeCapsuleContact.h" #include "SurgSim/Collision/OctreeDoubleSidedPlaneContact.h" #include "SurgSim/Collision/OctreePlaneContact.h" #include "SurgSim/Collision/OctreeSphereContact.h" #include "SurgSim/Collision/SegmentMeshTriangleMeshContact.h" #include "SurgSim/Collision/SegmentSelfContact.h" #include "SurgSim/Collision/SphereDoubleSidedPlaneContact.h" #include "SurgSim/Collision/SpherePlaneContact.h" #include "SurgSim/Collision/SphereSphereContact.h" #include "SurgSim/Collision/TriangleMeshParticlesContact.h" #include "SurgSim/Collision/TriangleMeshPlaneContact.h" #include "SurgSim/Collision/TriangleMeshSurfaceMeshContact.h" #include "SurgSim/Collision/TriangleMeshTriangleMeshContact.h" #endif // SURGSIM_COLLISION_CCDDCDCOLLISION_H opensurgsim-0.7.0/SurgSim/Collision/CollisionPair.cpp000066400000000000000000000115031277777236100227130ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Collision/CollisionPair.h" #include "SurgSim/Framework/Assert.h" using SurgSim::DataStructures::Location; namespace SurgSim { namespace Collision { CollisionPair::CollisionPair() { } CollisionPair::CollisionPair(const std::shared_ptr& first, const std::shared_ptr& second) { setRepresentations(first, second); } CollisionPair::~CollisionPair() { } void CollisionPair::setRepresentations(const std::shared_ptr& first, const std::shared_ptr& second) { SURGSIM_ASSERT(first != nullptr && second != nullptr) << "Collision Representation cannot be null"; // Invalidate the current contacts clearContacts(); m_representations.first = first; m_representations.second = second; m_isSwapped = false; if (m_representations.first == m_representations.second) { m_type = m_representations.first->getSelfCollisionDetectionType(); } else if (m_representations.first->getCollisionDetectionType() == COLLISION_DETECTION_TYPE_NONE || m_representations.second->getCollisionDetectionType() == COLLISION_DETECTION_TYPE_NONE) { m_type = COLLISION_DETECTION_TYPE_NONE; } else if (m_representations.first->getCollisionDetectionType() == COLLISION_DETECTION_TYPE_CONTINUOUS && m_representations.second->getCollisionDetectionType() == COLLISION_DETECTION_TYPE_CONTINUOUS) { m_type = COLLISION_DETECTION_TYPE_CONTINUOUS; } else { m_type = COLLISION_DETECTION_TYPE_DISCRETE; } } const std::pair, std::shared_ptr>& CollisionPair::getRepresentations() const { return m_representations; } CollisionDetectionType CollisionPair::getType() const { return m_type; } std::shared_ptr CollisionPair::getFirst() const { return m_representations.first; } std::shared_ptr CollisionPair::getSecond() const { return m_representations.second; } bool CollisionPair::hasContacts() const { return !m_contacts.empty(); } void CollisionPair::addCcdContact(const double& depth, const double& time, const SurgSim::Math::Vector3d& contactPoint, const SurgSim::Math::Vector3d& normal, const std::pair& penetrationPoints) { SURGSIM_ASSERT(getType() == COLLISION_DETECTION_TYPE_CONTINUOUS) << "Can only add CCD contacts to a CollisionPair that is COLLISION_DETECTION_TYPE_CONTINUOUS"; addContact(std::make_shared(COLLISION_DETECTION_TYPE_CONTINUOUS, depth, time, contactPoint, normal, penetrationPoints)); } void CollisionPair::addDcdContact(const double& depth, const SurgSim::Math::Vector3d& normal, const std::pair& penetrationPoints) { SURGSIM_ASSERT(getType() == COLLISION_DETECTION_TYPE_DISCRETE) << "Can only add DCD contacts to a CollisionPair that is COLLISION_DETECTION_TYPE_DISCRETE"; addContact(std::make_shared(COLLISION_DETECTION_TYPE_DISCRETE, depth, 1.0, Math::Vector3d::Zero(), normal, penetrationPoints)); } void CollisionPair::addContact(const std::shared_ptr& contact) { SURGSIM_ASSERT(contact->type == getType()) << "Only contacts with the same CollisionDetectionType can be added to this CollisionPair."; m_contacts.push_back(contact); } void CollisionPair::updateRepresentations() { for (auto& contact : m_contacts) { m_representations.first->addContact(m_representations.second, contact); m_representations.second->addContact(m_representations.first, contact->makeComplimentary()); } } std::list>& CollisionPair::getContacts() { return m_contacts; } void CollisionPair::clearContacts() { m_contacts.clear(); } void CollisionPair::swapRepresentations() { SURGSIM_ASSERT(!hasContacts()) << "Can't swap representations after contacts have already been calculated"; m_isSwapped = !m_isSwapped; std::swap(m_representations.first, m_representations.second); } bool CollisionPair::isSwapped() const { return m_isSwapped; } bool CollisionPair::mayIntersect() const { const auto& one = m_representations.first->getBoundingBox(); const auto& two = m_representations.second->getBoundingBox(); return (one.isEmpty() || two.isEmpty() || SurgSim::Math::doAabbIntersect(one, two)); } }; // namespace Collision }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Collision/CollisionPair.h000066400000000000000000000167411277777236100223710ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_COLLISION_COLLISIONPAIR_H #define SURGSIM_COLLISION_COLLISIONPAIR_H #include #include #include "SurgSim/Collision/Representation.h" #include "SurgSim/DataStructures/Location.h" #include "SurgSim/Math/Vector.h" namespace SurgSim { namespace Collision { /// Contact data structure used when two representations touch each other /// The convention is that if body 1 is moved along the normal vector by /// a distance depth (or equivalently if body 2 is moved the same distance /// in the opposite direction) then the penetration depth will be reduced to /// zero. This means that the normal vector points "in" to body 1 struct Contact { Contact(const CollisionDetectionType& newType, const double& newDepth, const double& newTime, const SurgSim::Math::Vector3d& newContact, const SurgSim::Math::Vector3d& newNormal, const std::pair& newPenetrationPoints) : type(newType), depth(newDepth), time(newTime), contact(newContact), normal(newNormal), penetrationPoints(newPenetrationPoints), force(SurgSim::Math::Vector3d::Zero()) { } std::shared_ptr makeComplimentary() { auto complimentary = std::make_shared(type, depth, time, contact, -normal, std::make_pair(penetrationPoints.second, penetrationPoints.first)); complimentary->force = -force; return complimentary; } bool operator==(const Contact& contact) const { return type == contact.type && std::abs(time - contact.time) < 1e-8 && penetrationPoints.first.isApprox(contact.penetrationPoints.first) && penetrationPoints.second.isApprox(contact.penetrationPoints.second) && normal.isApprox(contact.normal); } CollisionDetectionType type; ///< What collision algorithm class was used to get the contact double depth; ///< What is the penetration depth for the representation double time; ///< What is the time of the collision, CCD only SurgSim::Math::Vector3d contact; ///< The actual contact point, only used for CCD SurgSim::Math::Vector3d normal; ///< The normal on the contact point (normalized) std::pair penetrationPoints; ///< The deepest point inside the opposing object SurgSim::Math::Vector3d force; ///< The reaction force to correct this contact. }; /// Collision Pair class, it signifies a pair of items that should be checked with the /// collision algorithm, this structure will be used for input as well as output, as contacts /// get appended to the contacts list when found. class CollisionPair { public: /// Default Constructor CollisionPair(); /// Normal constructor CollisionPair(const std::shared_ptr& first, const std::shared_ptr& second); /// Destructor ~CollisionPair(); /// Sets the representations in this pair, representations cannot be the same instance and neither can be nullptr. /// \param first The first Collision Representation. /// \param second The second Collision Representation. void setRepresentations(const std::shared_ptr& first, const std::shared_ptr& second); /// Function that returns the pair of representations of the objects that are colliding. /// \return The pair of representations that are colliding. const std::pair, std::shared_ptr>& getRepresentations() const; /// Get the collision detection type for this pair /// \return The collision detection type CollisionDetectionType getType() const; /// \return The representation considered to be the first std::shared_ptr getFirst() const; /// \return The representation considered to be the second std::shared_ptr getSecond() const; /// \return true if there are any contacts assigned to the pair, false otherwise bool hasContacts() const; /// Adds a CCD contact to the collision pair. /// \param depth The depth of the intersection. /// \param time The actual time of contact as determined by the CCD algorithm. /// \param contactPoint The contact point, between the two bodies at time "time" /// \param normal The normal of the contact pointing into the first representation. /// \param penetrationPoints The points furthest into the opposing object void addCcdContact(const double& depth, const double& time, const SurgSim::Math::Vector3d& contactPoint, const SurgSim::Math::Vector3d& normal, const std::pair& penetrationPoints); /// Adds a DCD contact to the collision pair. /// \param depth The depth of the intersection. /// \param normal The normal of the contact pointing into the first representation. /// \param penetrationPoints The points furthest into the opposing object void addDcdContact(const double& depth, const SurgSim::Math::Vector3d& normal, const std::pair& penetrationPoints); /// Adds a contact. /// \param contact The contact between the first and the second representation. void addContact(const std::shared_ptr& contact); /// Update the representations by adding the contacts to them. void updateRepresentations(); /// \return All the contacts. std::list>& getContacts(); /// Reset clear the list of contacts, invalidating all the contacts void clearContacts(); /// Swap the representation pair so that first becomes second and second becomes first void swapRepresentations(); /// Query if this the pair has been swapped from when it was constructed. /// \return true if swapped, false if not. bool isSwapped() const; /// \return whether the two represenations might have an intersection /// \note The bounding boxes are taken, if the bounding box is empty it is always considered for collision bool mayIntersect() const; private: /// Pair of objects that are colliding std::pair, std::shared_ptr> m_representations; /// Collision detection type for this pair CollisionDetectionType m_type; /// List of current contacts std::list> m_contacts; bool m_isSwapped; }; }; // namespace Collision }; // namespace SurgSim template std::basic_ostream& operator << (std::basic_ostream& out, const SurgSim::Collision::Contact& contact) { out << "Normal: " << contact.normal.transpose() << std::endl; out << "Depth: " << contact.depth << std::endl; out << "Time: " << contact.time << std::endl; out << "Penetration Point 1 :" << contact.penetrationPoints.first << std::endl; out << "Penetration Point 2 :" << contact.penetrationPoints.second << std::endl; return out; } #endif opensurgsim-0.7.0/SurgSim/Collision/CompoundShapeContact.cpp000066400000000000000000000115761277777236100242370ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Collision/CollisionPair.h" #include "SurgSim/Collision/CompoundShapeContact.h" #include "SurgSim/Math/CompoundShape.h" namespace SurgSim { namespace Collision { CompoundShapeContact::CompoundShapeContact(const std::pair& types) : m_types(types) { } std::pair CompoundShapeContact::getShapeTypes() { return m_types; } std::list> CompoundShapeContact::doCalculateDcdContact( const Math::PosedShape>& posedShape1, const Math::PosedShape>& posedShape2) { typedef Math::PosedShape> PosedShape; std::list> contacts; const auto& calculations = ContactCalculation::getDcdContactTable(); // Shape1 is compound shape const auto& compoundShape = std::static_pointer_cast(posedShape1.getShape()); SURGSIM_ASSERT(compoundShape->getType() == posedShape1.getShape()->getType()) << "Invalid static cast to compound shape"; Math::RigidTransform3d inversePose = posedShape1.getPose().inverse(); size_t index = 0; for (const Math::CompoundShape::SubShape& subShape : compoundShape->getShapes()) { const auto& calculation = calculations[subShape.first->getType()][posedShape2.getShape()->getType()]; auto relativePose = inversePose * subShape.second; std::list> localContacts = calculation->calculateDcdContact( PosedShape(subShape.first, subShape.second), posedShape2); for (auto& contact : localContacts) { auto& locations = contact->penetrationPoints.first; locations.index = index; if (locations.rigidLocalPosition.hasValue()) { locations.rigidLocalPosition.setValue(relativePose * locations.rigidLocalPosition.getValue()); } } contacts.splice(contacts.end(), localContacts); index++; } return contacts; } std::list> CompoundShapeContact::doCalculateCcdContact( const Math::PosedShapeMotion>& shape1, const Math::PosedShapeMotion>& shape2) { typedef Math::PosedShape> PosedShape; typedef Math::PosedShapeMotion> Motionshape; std::list> contacts; const auto& calculations = ContactCalculation::getCcdContactTable(); // Shape1 is compound shape const auto& startShape = std::static_pointer_cast(shape1.first.getShape()); const auto& endShape = std::static_pointer_cast(shape1.second.getShape()); // Get Motion Shapes from left hand side // For each Motion Shape run that shape and the opposing side through the CCD contact calc SURGSIM_ASSERT(startShape->getType() == shape1.first.getShape()->getType()) << "Invalid static cast to compound shape"; SURGSIM_ASSERT(endShape->getType() == shape1.second.getShape()->getType()) << "Invalid static cast to compound shape"; size_t numShapes = startShape->getNumShapes(); for (size_t index = 0; index < numShapes; ++index) { auto posedSubshape1 = PosedShape(startShape->getShape(index), startShape->getPose(index)); auto type = posedSubshape1.getShape()->getType(); auto posedSubshape2 = PosedShape(endShape->getShape(index), endShape->getPose(index)); auto motionSubShape = Motionshape(posedSubshape1, posedSubshape2); const auto& calculation = calculations[type][shape2.second.getShape()->getType()]; std::list> localContacts = calculation->calculateCcdContact( motionSubShape, shape2); for (auto& contact : localContacts) { auto t = contact->time; Math::RigidTransform3d inverseGlobal = Math::interpolate(shape1.first.getPose(), shape1.second.getPose(), t).inverse(); Math::RigidTransform3d relativePose = inverseGlobal * Math::interpolate(motionSubShape.first.getPose(), motionSubShape.second.getPose(), t); auto& locations = contact->penetrationPoints.first; locations.index = index; if (locations.rigidLocalPosition.hasValue()) { locations.rigidLocalPosition.setValue(relativePose * locations.rigidLocalPosition.getValue()); } } contacts.splice(contacts.end(), localContacts); } return contacts; } } }opensurgsim-0.7.0/SurgSim/Collision/CompoundShapeContact.h000066400000000000000000000031701277777236100236730ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_COLLISION_COMPOUNDSHAPECONTACT_H #define SURGSIM_COLLISION_COMPOUNDSHAPECONTACT_H #include "SurgSim/Collision/ContactCalculation.h" namespace SurgSim { namespace Collision { class CompoundShapeContact : public ContactCalculation { public: /// Constructor explicit CompoundShapeContact(const std::pair& types); protected: std::pair getShapeTypes() override; std::list> doCalculateDcdContact( const Math::PosedShape>& posedShape1, const Math::PosedShape>& posedShape2) override; std::list> doCalculateCcdContact( const Math::PosedShapeMotion>& shape1, const Math::PosedShapeMotion>& shape2) override; /// Local shape types for this instance, these can be set to match the expected shapes std::pair m_types; }; } } #endif opensurgsim-0.7.0/SurgSim/Collision/ContactCalculation.cpp000066400000000000000000000257141277777236100237270ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Collision/CcdDcdCollision.h" #include "SurgSim/Collision/ContactCalculation.h" #include "SurgSim/Collision/DefaultContactCalculation.h" #include "SurgSim/Collision/Representation.h" #include "SurgSim/Framework/Log.h" namespace SurgSim { namespace Collision { ContactCalculation::TableType ContactCalculation::m_contactDcdCalculations; ContactCalculation::TableType ContactCalculation::m_contactCcdCalculations; std::once_flag ContactCalculation::m_initializationFlag; ContactCalculation::ContactCalculation() { } ContactCalculation::~ContactCalculation() { } void ContactCalculation::registerDcdContactCalculation(const std::shared_ptr& calculation) { std::call_once(m_initializationFlag, ContactCalculation::initializeTables); privateDcdRegister(calculation, calculation->getShapeTypes()); } void ContactCalculation::registerCcdContactCalculation(const std::shared_ptr& calculation) { std::call_once(m_initializationFlag, ContactCalculation::initializeTables); privateCcdRegister(calculation, calculation->getShapeTypes()); } const ContactCalculation::TableType& ContactCalculation::getDcdContactTable() { std::call_once(m_initializationFlag, ContactCalculation::initializeTables); return m_contactDcdCalculations; } const ContactCalculation::TableType& ContactCalculation::getCcdContactTable() { std::call_once(m_initializationFlag, ContactCalculation::initializeTables); return m_contactCcdCalculations; } void ContactCalculation::calculateContact(std::shared_ptr pair) { doCalculateContact(pair); } std::list> ContactCalculation::calculateDcdContact( const Math::PosedShape> posedShape1, const Math::PosedShape> posedShape2) { auto types = getShapeTypes(); auto incoming = std::make_pair(posedShape1.getShape()->getType(), posedShape2.getShape()->getType()); if (incoming == types) { return doCalculateDcdContact(posedShape1, posedShape2); } if (incoming.first == types.second && incoming.second == types.first) { auto contacts = doCalculateDcdContact(posedShape2, posedShape1); for (const auto& contact : contacts) { contact->normal = -contact->normal; contact->force = -contact->force; std::swap(contact->penetrationPoints.first, contact->penetrationPoints.second); } return contacts; } if (types.first != Math::SHAPE_TYPE_NONE && types.second != Math::SHAPE_TYPE_NONE) { SURGSIM_FAILURE() << "Incorrect shape type for this calculation expected " << types.first << ", " << types.second << " received " << incoming.first << ", " << incoming.second << "."; } return std::list>(); } std::list> ContactCalculation::calculateCcdContact( const Math::PosedShapeMotion> posedShapeMotion1, const Math::PosedShapeMotion> posedShapeMotion2) { auto types = getShapeTypes(); auto incoming = std::make_pair(posedShapeMotion1.first.getShape()->getType(), posedShapeMotion2.first.getShape()->getType()); if (incoming == types) { return doCalculateCcdContact(posedShapeMotion1, posedShapeMotion2); } if (incoming.first == types.second && incoming.second == types.first) { auto contacts = doCalculateCcdContact(posedShapeMotion2, posedShapeMotion1); for (const auto& contact : contacts) { contact->normal = -contact->normal; contact->force = -contact->force; std::swap(contact->penetrationPoints.first, contact->penetrationPoints.second); } return contacts; } if (types.first != Math::SHAPE_TYPE_NONE && types.second != Math::SHAPE_TYPE_NONE) { SURGSIM_FAILURE() << "Incorrect shape type for this calculation expected " << types.first << ", " << types.second << " received " << incoming.first << ", " << incoming.second << "."; } return std::list>(); } void ContactCalculation::doCalculateContact(std::shared_ptr pair) { std::pair shapeTypes = getShapeTypes(); int firstShapeType = pair->getFirst()->getShapeType(); int secondShapeType = pair->getSecond()->getShapeType(); if (firstShapeType != secondShapeType && firstShapeType == shapeTypes.second && secondShapeType == shapeTypes.first) { pair->swapRepresentations(); std::swap(firstShapeType, secondShapeType); } if (shapeTypes.first != SurgSim::Math::SHAPE_TYPE_NONE) { SURGSIM_ASSERT(firstShapeType == shapeTypes.first) << "First Object, wrong type of object" << firstShapeType; } if (shapeTypes.second != SurgSim::Math::SHAPE_TYPE_NONE) { SURGSIM_ASSERT(secondShapeType == shapeTypes.second) << "Second Object, wrong type of object" << secondShapeType; } std::shared_ptr shape1 = pair->getFirst()->getPosedShape(); std::shared_ptr shape2 = pair->getSecond()->getPosedShape(); std::list> contacts; if (pair->getType() == Collision::CollisionDetectionType::COLLISION_DETECTION_TYPE_DISCRETE) { Math::PosedShape> posedShape1(shape1, pair->getFirst()->getPose()); Math::PosedShape> posedShape2(shape2, pair->getSecond()->getPose()); contacts = doCalculateDcdContact(posedShape1, posedShape2); } else if (pair->getType() == Collision::CollisionDetectionType::COLLISION_DETECTION_TYPE_CONTINUOUS) { contacts = doCalculateCcdContact( pair->getFirst()->getPosedShapeMotion(), pair->getSecond()->getPosedShapeMotion()); } else { SURGSIM_FAILURE() << "Invalid collision detection type, neither discrete nor continuous"; } for (auto& contact : contacts) { pair->addContact(contact); } } std::list> ContactCalculation::doCalculateDcdContact( const Math::PosedShape>& posedShape1, const Math::PosedShape>& posedShape2) { SURGSIM_FAILURE() << "Not implemented"; return std::list>(); } std::list> ContactCalculation::doCalculateCcdContact( const Math::PosedShapeMotion>& posedShapeMotion1, const Math::PosedShapeMotion>& posedShapeMotion2) { SURGSIM_FAILURE() << "Not implemented"; return std::list>(); } void ContactCalculation::initializeTables() { // Fill up both tables with default empty contact calculation for (int i = 0; i < SurgSim::Math::SHAPE_TYPE_COUNT; ++i) { for (int j = 0; j < SurgSim::Math::SHAPE_TYPE_COUNT; ++j) { m_contactDcdCalculations[i][j].reset(new Collision::DefaultContactCalculation(false)); m_contactCcdCalculations[i][j].reset(new Collision::DefaultContactCalculation(false)); } } // Fill up the Dcd contact calculation table ContactCalculation::privateDcdRegister(std::make_shared()); ContactCalculation::privateDcdRegister(std::make_shared()); ContactCalculation::privateDcdRegister(std::make_shared()); ContactCalculation::privateDcdRegister(std::make_shared()); ContactCalculation::privateDcdRegister(std::make_shared()); ContactCalculation::privateDcdRegister(std::make_shared()); ContactCalculation::privateDcdRegister(std::make_shared()); ContactCalculation::privateDcdRegister(std::make_shared()); ContactCalculation::privateDcdRegister(std::make_shared()); ContactCalculation::privateDcdRegister(std::make_shared()); ContactCalculation::privateDcdRegister(std::make_shared()); ContactCalculation::privateDcdRegister(std::make_shared()); ContactCalculation::privateDcdRegister(std::make_shared()); ContactCalculation::privateDcdRegister(std::make_shared()); ContactCalculation::privateDcdRegister(std::make_shared()); ContactCalculation::privateDcdRegister(std::make_shared()); ContactCalculation::privateDcdRegister(std::make_shared()); const std::array allshapes = { Math::SHAPE_TYPE_BOX, Math::SHAPE_TYPE_CAPSULE, Math::SHAPE_TYPE_CYLINDER, Math::SHAPE_TYPE_DOUBLESIDEDPLANE, Math::SHAPE_TYPE_MESH, Math::SHAPE_TYPE_OCTREE, Math::SHAPE_TYPE_PARTICLES, Math::SHAPE_TYPE_PLANE, Math::SHAPE_TYPE_SPHERE, Math::SHAPE_TYPE_SURFACEMESH, Math::SHAPE_TYPE_SEGMENTMESH, Math::SHAPE_TYPE_COMPOUNDSHAPE }; for (auto type : allshapes) { ContactCalculation::privateDcdRegister(std::make_shared( std::make_pair(Math::SHAPE_TYPE_COMPOUNDSHAPE, type))); } ContactCalculation::privateCcdRegister(std::make_shared()); ContactCalculation::privateCcdRegister(std::make_shared()); ContactCalculation::privateCcdRegister(std::make_shared( std::make_pair(Math::SHAPE_TYPE_COMPOUNDSHAPE, Math::SHAPE_TYPE_SEGMENTMESH))); } void ContactCalculation::privateDcdRegister( const std::shared_ptr& calculation) { privateDcdRegister(calculation, calculation->getShapeTypes()); } void ContactCalculation::privateDcdRegister( const std::shared_ptr& calculation, const std::pair& types) { m_contactDcdCalculations[types.first][types.second] = calculation; m_contactDcdCalculations[types.second][types.first] = calculation; } void ContactCalculation::privateCcdRegister( const std::shared_ptr& calculation) { privateCcdRegister(calculation, calculation->getShapeTypes()); } void ContactCalculation::privateCcdRegister( const std::shared_ptr& calculation, const std::pair& types) { m_contactCcdCalculations[types.first][types.second] = calculation; m_contactCcdCalculations[types.second][types.first] = calculation; } }; // namespace Collision }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Collision/ContactCalculation.h000066400000000000000000000136041277777236100233670ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_COLLISION_CONTACTCALCULATION_H #define SURGSIM_COLLISION_CONTACTCALCULATION_H #include #include #include "SurgSim/Collision/CollisionPair.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Shape.h" namespace SurgSim { namespace Math { class Shape; } namespace Collision { /// Base class responsible for calculating contact data between two objects. /// It is used for determining whether two objects intersect. If there is /// contact, new Contacts are calculated. /// \sa Contact class ContactCalculation { public: /// Constructor ContactCalculation(); /// Destructor virtual ~ContactCalculation(); /// Calculate the contacts for a given pair /// \param pair A CollisionPair that is under consideration, new contacts will be added to this pair void calculateContact(std::shared_ptr pair); /// Calculate the dcd contacts between two posed/transformed shapes /// \param posedShape1, posedShape2 The two posed shape to consider for this dcd contact calculation /// \return a list of contacts between the two given posed shapes std::list> calculateDcdContact( const Math::PosedShape> posedShape1, const Math::PosedShape> posedShape2); /// Calculate the ccd contacts between two posed/transformed shapes /// \param posedShapeMotion1, posedShapeMotion2 The two posed shape motion to calculate ccd contact for /// \return a list of ccd contacts between the two given shapes /// \note The contact information is related to the end of the time range, so solving these contact will /// \note solve the collision at the end of the time range. std::list> calculateCcdContact( const Math::PosedShapeMotion> posedShapeMotion1, const Math::PosedShapeMotion> posedShapeMotion2); /// Virtual function that returns the shapes that this ContactCalculation class handles. /// \return Return the shape types this class handles. virtual std::pair getShapeTypes() = 0; /// Register an instance of a contact calculation in the table /// \param calculation The calculation to be registered static void registerDcdContactCalculation(const std::shared_ptr& calculation); /// Register an instance of a contact calculation in the table /// \param calculation The calculation to be registered static void registerCcdContactCalculation(const std::shared_ptr& calculation); typedef std::array, Math::SHAPE_TYPE_COUNT>, Math::SHAPE_TYPE_COUNT> TableType; static const TableType& getDcdContactTable(); static const TableType& getCcdContactTable(); private: /// Calculate the actual contact between two shapes of the given CollisionPair. /// \param pair The symmetric pair that is under consideration. virtual void doCalculateContact(std::shared_ptr pair); /// Virtual function receives the call from the public interface, usually will type the /// shapes statically to their known types and then execute a specific contact calculation /// between the two shapes /// \param posedShape1, posedShape2 The two posed shapes to calculate dcd contact for /// \return a list of dcd contacts between the two given posed shapes virtual std::list> doCalculateDcdContact( const Math::PosedShape>& posedShape1, const Math::PosedShape>& posedShape2); /// Virtual function receives the call from the public interface, usually will type the /// shapes statically to their known types and then execute a specific contact calculation /// between the two shapes /// \param posedShapeMotion1, posedShapeMotion2 The two posed shapes motion to calculate ccd contact for /// \return a list of ccd contacts between the two given posed shapes motion virtual std::list> doCalculateCcdContact( const Math::PosedShapeMotion>& posedShapeMotion1, const Math::PosedShapeMotion>& posedShapeMotion2); /// Statically initialize the tables, used via call once static void initializeTables(); ///@{ /// registration to call at static scope (does not protect the initialization via call_once) /// Mirroring the public functions static void privateDcdRegister( const std::shared_ptr& calculation, const std::pair& types); static void privateDcdRegister(const std::shared_ptr& calculation); ///@} ///@{ /// registration to call at static scope (does not protect the initialization via call_once) /// Mirroring the public functions static void privateCcdRegister( const std::shared_ptr& calculation, const std::pair& types); static void privateCcdRegister(const std::shared_ptr& calculation); ///@} static TableType m_contactDcdCalculations; ///< Static table of Dcd contact calculations static TableType m_contactCcdCalculations; ///< Static table of Ccd contact calculations static std::once_flag m_initializationFlag; ///< Flag used for initialization. }; }; // namespace Collision }; // namespace SurgSim #endif opensurgsim-0.7.0/SurgSim/Collision/ContactFilter.cpp000066400000000000000000000020761277777236100227120ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Collision/ContactFilter.h" namespace SurgSim { namespace Collision { ContactFilter::ContactFilter(const std::string& name) : Framework::Component(name) { } void ContactFilter::filterContacts(const std::shared_ptr& state, const std::shared_ptr& pair) { doFilterContacts(state, pair); } void ContactFilter::update(double dt) { doUpdate(dt); } } } opensurgsim-0.7.0/SurgSim/Collision/ContactFilter.h000066400000000000000000000044361277777236100223610ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_COLLISION_CONTACTFILTER_H #define SURGSIM_COLLISION_CONTACTFILTER_H #include "SurgSim/Framework/Component.h" #include namespace SurgSim { namespace Physics { class PhysicsManagerState; } namespace Collision { class CollisionPair; /// Base class to implement a contact filter, the job of this class is to be executed by the ContactFiltering stage /// in the PhysicsManager. /// Filters are being executed in parallel over all CollisionPair objects that have contacts, be careful with thread /// safety of the doFilterContacts function and all other writes to class members in your subclass class ContactFilter : public Framework::Component { public: /// Constructor explicit ContactFilter(const std::string& name); /// Base function to filter the contacts on a collision pair this will modify the 'contacts' in the collision pair /// \param state the physics state /// \param pair the collision pair void filterContacts( const std::shared_ptr& state, const std::shared_ptr& pair); /// Base function to update the internal data structures with regard to the filtering operation, this should only /// be called once per iteration /// \param dt the time passed since the last call to update void update(double dt); protected: /// Override this with the implementation of the filter, this has to be threadsafe, it will be called in parallel /// with different collision pairs. virtual void doFilterContacts(const std::shared_ptr& state, const std::shared_ptr& pair) = 0; virtual void doUpdate(double dt) = 0; }; } } #endif opensurgsim-0.7.0/SurgSim/Collision/DefaultContactCalculation.cpp000066400000000000000000000063101277777236100252230ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Collision/DefaultContactCalculation.h" #include "SurgSim/Collision/CollisionPair.h" #include "SurgSim/Collision/Representation.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Math/Shape.h" namespace SurgSim { namespace Collision { DefaultContactCalculation::DefaultContactCalculation(bool doAssert) : m_doAssert(doAssert) { } DefaultContactCalculation::~DefaultContactCalculation() { } std::pair DefaultContactCalculation::getShapeTypes() { return std::pair(SurgSim::Math::SHAPE_TYPE_NONE, SurgSim::Math::SHAPE_TYPE_NONE); } void DefaultContactCalculation::doCalculateContact(std::shared_ptr pair) { SURGSIM_ASSERT(!m_doAssert) << "Contact calculation not implemented for pairs with types (" << pair->getFirst()->getShapeType() << ", " << pair->getSecond()->getShapeType() << ")."; SURGSIM_LOG_ONCE(SurgSim::Framework::Logger::getDefaultLogger(), WARNING) << "Contact calculation not implemented for pairs with types (" << pair->getFirst()->getShapeType() << ", " << pair->getSecond()->getShapeType() << ")."; } std::list> DefaultContactCalculation::doCalculateDcdContact( const Math::PosedShape>& posedShape1, const Math::PosedShape>& posedShape2) { SURGSIM_ASSERT(!m_doAssert) << "Contact calculation not implemented for shapes with types (" << posedShape1.getShape()->getType() << ", " << posedShape2.getShape()->getType() << ")."; SURGSIM_LOG_ONCE(SurgSim::Framework::Logger::getDefaultLogger(), WARNING) << "Contact calculation not implemented for pairs with types (" << posedShape1.getShape()->getType() << ", " << posedShape2.getShape()->getType() << ")."; return std::list>(); } std::list> DefaultContactCalculation::doCalculateCcdContact( const Math::PosedShapeMotion>& posedShapeMotion1, const Math::PosedShapeMotion>& posedShapeMotion2) { SURGSIM_ASSERT(!m_doAssert) << "Contact calculation not implemented for pairs with types (" << posedShapeMotion1.first.getShape()->getType() << ", " << posedShapeMotion2.first.getShape()->getType() << ")."; SURGSIM_LOG_ONCE(SurgSim::Framework::Logger::getDefaultLogger(), WARNING) << "Contact calculation not implemented for pairs with types (" << posedShapeMotion1.first.getShape()->getType() << ", " << posedShapeMotion2.first.getShape()->getType() << ")."; return std::list>(); } }; // namespace Collision }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Collision/DefaultContactCalculation.h000066400000000000000000000040061277777236100246700ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_COLLISION_DEFAULTCONTACTCALCULATION_H #define SURGSIM_COLLISION_DEFAULTCONTACTCALCULATION_H #include #include "SurgSim/Collision/ContactCalculation.h" namespace SurgSim { namespace Collision { class CollisionPair; /// A default calculation, it does nothing and can be used as a placeholder class DefaultContactCalculation : public ContactCalculation { public: /// Constructor /// \param doAssert If set the calculation will throw an exception if it is executed, this /// can be used to detect cases where a contact calculation is being called /// on a pair that should be implemented explicit DefaultContactCalculation(bool doAssert = false); /// Destructor virtual ~DefaultContactCalculation(); std::pair getShapeTypes() override; private: bool m_doAssert; void doCalculateContact(std::shared_ptr pair) override; std::list> doCalculateDcdContact( const Math::PosedShape>& posedShape1, const Math::PosedShape>& posedShape2) override; std::list> doCalculateCcdContact( const Math::PosedShapeMotion>& posedShapeMotion1, const Math::PosedShapeMotion>& posedShapeMotion2) override; }; }; // namespace Collision }; // namespace SurgSim #endif opensurgsim-0.7.0/SurgSim/Collision/ElementContactFilter.cpp000066400000000000000000000133061277777236100242220ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Collision/ElementContactFilter.h" #include "SurgSim/Collision/Representation.h" #include "SurgSim/Collision/CollisionPair.h" #include "SurgSim/Framework/FrameworkConvert.h" namespace SurgSim { namespace Collision { SURGSIM_REGISTER(SurgSim::Framework::Component, ElementContactFilter, ElementContactFilter); ElementContactFilter::ElementContactFilter(const std::string& name) : ContactFilter(name), m_logger(SurgSim::Framework::Logger::getLogger("Collision/ElementContactFilter")) { SURGSIM_ADD_SERIALIZABLE_PROPERTY(ElementContactFilter, std::shared_ptr, Representation, getRepresentation, setRepresentation); SURGSIM_ADD_SERIALIZABLE_PROPERTY(ElementContactFilter, FilterMapType, FilterElements, getFilterElements, setFilterElements); } bool ElementContactFilter::doInitialize() { return true; } bool ElementContactFilter::doWakeUp() { bool valid = false; SURGSIM_LOG_IF(m_representation == nullptr, m_logger, WARNING) << "No representation for filtering on " << getFullName(); if (m_representation != nullptr) { auto type = m_representation->getShapeType(); if (type == SurgSim::Math::SHAPE_TYPE_MESH || type == SurgSim::Math::SHAPE_TYPE_SEGMENTMESH || type == SurgSim::Math::SHAPE_TYPE_SURFACEMESH) { valid = true; } else { SURGSIM_LOG_WARNING(m_logger) << "ElementContactFilter " << getFullName() << "invalid mesh structure for collision shape, current shape is " << type << std::endl << "Should be one of " << SurgSim::Math::SHAPE_TYPE_MESH << ", " << SurgSim::Math::SHAPE_TYPE_SURFACEMESH << ", or " << SurgSim::Math::SHAPE_TYPE_SEGMENTMESH; } } return valid; } void ElementContactFilter::setFilter(const std::shared_ptr& other, const std::vector& indices) { SURGSIM_ASSERT(std::dynamic_pointer_cast(other) != nullptr) << "Need a collision representation as a filter object."; boost::lock_guard guard(m_writeMutex); m_writeBuffer[other.get()] = indices; } const std::vector& ElementContactFilter::getFilter(const std::shared_ptr& other) const { static const std::vector empty; auto it = m_filters.find(other.get()); if (it != m_filters.end()) { return it->second; } return empty; } void ElementContactFilter::setFilterElements(const FilterMapType& filterElements) { boost::lock_guard guard(m_writeMutex); m_writeBuffer.clear(); for (const auto& item : filterElements) { auto converted = std::dynamic_pointer_cast(item.first); if (converted != nullptr) { m_writeBuffer[converted.get()] = item.second; } } } ElementContactFilter::FilterMapType ElementContactFilter::getFilterElements() { FilterMapType result; boost::lock_guard guard(m_writeMutex); for (const auto& item : m_writeBuffer) { result.emplace_back(item.first->getSharedPtr(), item.second); } return result; } void ElementContactFilter::setRepresentation(const std::shared_ptr& val) { SURGSIM_ASSERT(!isAwake()) << "Can't set representation after waking up on " << getFullName(); m_representation = Framework::checkAndConvert( val, "SurgSim::Collision::Representation"); } std::shared_ptr ElementContactFilter::getRepresentation() const { return m_representation; } void ElementContactFilter::doFilterContacts(const std::shared_ptr&, const std::shared_ptr& pair) { for (const auto& filter : m_filters) { if (filter.second.empty()) { continue; } for (size_t i = 0, j = 1; i < 2; ++i, --j) { if (pairAt(pair->getRepresentations(), i).get() == getRepresentation().get() && pairAt(pair->getRepresentations(), j).get() == filter.first) { executeFilter(pair, i, filter.second); } } } } void ElementContactFilter::doUpdate(double dt) { boost::lock_guard guard(m_writeMutex); m_filters = m_writeBuffer; } void ElementContactFilter::executeFilter( const std::shared_ptr& pair, size_t pairIndex, const std::vector& filter) { auto shapeType = pairAt(pair->getRepresentations(), pairIndex)->getShapeType(); DataStructures::Location::Type locationType; if (shapeType == Math::SHAPE_TYPE_MESH || shapeType == Math::SHAPE_TYPE_SURFACEMESH) { locationType = DataStructures::Location::TRIANGLE; } else if (shapeType == Math::SHAPE_TYPE_SEGMENTMESH) { locationType = DataStructures::Location::ELEMENT; } else { return; } pair->getContacts().erase( (std::remove_if(pair->getContacts().begin(), pair->getContacts().end(), [pairIndex, locationType, &filter](const std::shared_ptr& contact) { return pairAt(contact->penetrationPoints, pairIndex).get(locationType).hasValue() && std::find(filter.begin(), filter.end(), pairAt(contact->penetrationPoints, pairIndex).get(locationType).getValue().index) != filter.end(); })), pair->getContacts().end()); } } } opensurgsim-0.7.0/SurgSim/Collision/ElementContactFilter.h000066400000000000000000000107731277777236100236740ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_COLLISION_ELEMENTCONTACTFILTER_H #define SURGSIM_COLLISION_ELEMENTCONTACTFILTER_H #include "SurgSim/Collision/ContactFilter.h" #include "SurgSim/DataStructures/Location.h" #include "SurgSim/Framework/LockedContainer.h" namespace SurgSim { namespace Physics { class PhysicsManagerState; } namespace Collision { class CollisionPair; class Representation; struct Contact; SURGSIM_STATIC_REGISTRATION(ElementContactFilter); /// Given a DeformableCollisionRepresentation this filter can remove contacts on specific elements of that /// representation. The contacts will be flatly removed. class ElementContactFilter : public ContactFilter { public: explicit ElementContactFilter(const std::string& name); SURGSIM_CLASSNAME(SurgSim::Collision::ElementContactFilter); bool doInitialize() override; bool doWakeUp() override; /// Set the filter for one representation, this means any contects on the given indices for that representation /// will be removed /// \param other The other side of the collisionpair /// \param indices The indices to filter from the list of contacts void setFilter(const std::shared_ptr& other, const std::vector& indices); /// Query the filters for one specific representation /// \param other the representation /// \return the currently ignored indices for a specific element const std::vector& getFilter(const std::shared_ptr& other) const; /// Sets the representation used for filtering, can only be used before initialization /// \param val the collision representation to be used for filtering void setRepresentation(const std::shared_ptr& val); /// \return the collision representation used for filtering std::shared_ptr getRepresentation() const; protected: typedef std::vector, std::vector>> FilterMapType; void setFilterElements(const FilterMapType& filterElements); FilterMapType getFilterElements(); void doFilterContacts( const std::shared_ptr& state, const std::shared_ptr& pair) override; void doUpdate(double dt) override; private: std::shared_ptr m_logger; /// Representation whose contacts need to be filtered std::shared_ptr m_representation; mutable boost::mutex m_writeMutex; std::unordered_map> m_writeBuffer; std::unordered_map> m_filters; /// Run the filter over the side of the collision pair indicated by pairIndex /// \param pair the collision pair that is being filtered /// \param pairIndex 0/1 representing first, and second values of the pair data structure /// \param filter indices to filter void executeFilter( const std::shared_ptr& pair, size_t pairIndex, const std::vector& filter); }; /// Get member of pair data via indexed access, the members of the pair have to have the same type /// const version /// \tparam T the member type /// \param p the pair /// \param i the index to access /// \return p.first if index == 0 and p.second if index == 1 template const T& pairAt(const std::pair& p, size_t i) { SURGSIM_ASSERT(i == 0 || i == 1) << "Index for pair must be 0 or 1."; return (i == 0) ? p.first : p.second; }; /// Get member of pair data via indexed access, the members of the pair have to have the same type /// non-const version /// \tparam T the member type /// \param p the pair /// \param i the index to access /// \return p.first if index == 0 and p.second if index == 1 template T& pairAt(std::pair& p, size_t i) // NOLINT { SURGSIM_ASSERT(i == 0 || i == 1) << "Index for pair must be 0 or 1."; return (i == 0) ? p.first : p.second; }; } } #endif opensurgsim-0.7.0/SurgSim/Collision/OctreeCapsuleContact.cpp000066400000000000000000000024731277777236100242240ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Collision/OctreeCapsuleContact.h" using SurgSim::Math::CapsuleShape; namespace SurgSim { namespace Collision { std::pair OctreeCapsuleContact::getShapeTypes() { return std::pair(SurgSim::Math::SHAPE_TYPE_OCTREE, SurgSim::Math::SHAPE_TYPE_CAPSULE); } std::list> OctreeCapsuleContact::boxContactCalculation( const SurgSim::Math::BoxShape& boxShape, const SurgSim::Math::RigidTransform3d& boxPose, const SurgSim::Math::Shape& otherShape, const SurgSim::Math::RigidTransform3d& otherPose) { return m_calculator.calculateDcdContact(boxShape, boxPose, static_cast(otherShape), otherPose); } }; }; opensurgsim-0.7.0/SurgSim/Collision/OctreeCapsuleContact.h000066400000000000000000000025341277777236100236670ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_COLLISION_OCTREECAPSULECONTACT_H #define SURGSIM_COLLISION_OCTREECAPSULECONTACT_H #include "SurgSim/Collision/BoxCapsuleContact.h" #include "SurgSim/Collision/OctreeContact.h" namespace SurgSim { namespace Collision { class OctreeCapsuleContact : public OctreeContact { public: std::pair getShapeTypes() override; protected: std::list> boxContactCalculation(const SurgSim::Math::BoxShape& boxShape, const SurgSim::Math::RigidTransform3d& boxPose, const SurgSim::Math::Shape& otherShape, const SurgSim::Math::RigidTransform3d& otherPose) override; private: BoxCapsuleContact m_calculator; }; }; }; #endif //SURGSIM_COLLISION_OCTREECAPSULECONTACT_H opensurgsim-0.7.0/SurgSim/Collision/OctreeContact.cpp000066400000000000000000000067121277777236100227070ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Collision/OctreeContact.h" #include #include "SurgSim/Collision/CollisionPair.h" #include "SurgSim/Collision/Representation.h" #include "SurgSim/Collision/ShapeCollisionRepresentation.h" #include "SurgSim/Math/BoxShape.h" #include "SurgSim/Math/Shape.h" #include "SurgSim/Math/Vector.h" namespace SurgSim { namespace Collision { size_t OctreeContact::Vector3dHash::operator()(const SurgSim::Math::Vector3d& id) const { return boost::hash_range(id.data(), id.data() + 3); } std::list> OctreeContact::doCalculateDcdContact( const Math::PosedShape>& posedShape1, const Math::PosedShape>& posedShape2) { SURGSIM_ASSERT(posedShape1.getShape()->getType() == Math::SHAPE_TYPE_OCTREE) << "Octree Contact needs an OctreeShape."; SurgSim::DataStructures::OctreePath nodePath; std::list> result; std::shared_ptr shape = std::static_pointer_cast(posedShape1.getShape()); calculateContactWithNode(shape->getOctree(), posedShape1.getPose(), posedShape2.getShape(), posedShape2.getPose(), &nodePath, &result); return result; } void OctreeContact::calculateContactWithNode( std::shared_ptr node, Math::RigidTransform3d octreePose, const std::shared_ptr& shape, const Math::RigidTransform3d& shapePose, SurgSim::DataStructures::OctreePath* nodePath, std::list>* result) { if (! node->isActive()) { return; } Math::Vector3d nodeSize = node->getBoundingBox().sizes(); std::shared_ptr nodeShape; if (m_shapes.count(nodeSize) > 0) { nodeShape = m_shapes[nodeSize]; } else { nodeShape = std::make_shared(nodeSize.x(), nodeSize.y(), nodeSize.z()); m_shapes[nodeSize] = nodeShape; } Math::Vector3d nodeCenter = node->getBoundingBox().center(); Math::RigidTransform3d nodePose = octreePose; nodePose.translation() += nodePose.linear() * nodeCenter; auto contacts = boxContactCalculation(*nodeShape, nodePose, *shape, shapePose); if (!contacts.empty()) { if (node->hasChildren()) { for (size_t i = 0; i < node->getChildren().size(); i++) { nodePath->push_back(i); calculateContactWithNode(node->getChild(i), octreePose, shape, shapePose, nodePath, result); nodePath->pop_back(); } } else { Math::Vector3d contactPosition; for (auto& contact : contacts) { contact->penetrationPoints.first.octreeNodePath.setValue(*nodePath); contactPosition = contact->penetrationPoints.first.rigidLocalPosition.getValue(); contactPosition += nodeCenter; contact->penetrationPoints.first.rigidLocalPosition.setValue(contactPosition); } result->splice(result->end(), contacts); } } } }; }; opensurgsim-0.7.0/SurgSim/Collision/OctreeContact.h000066400000000000000000000066461277777236100223620ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_COLLISION_OCTREECONTACT_H #define SURGSIM_COLLISION_OCTREECONTACT_H #include #include "SurgSim/Collision/ContactCalculation.h" #include "SurgSim/Math/BoxShape.h" #include "SurgSim/Math/OctreeShape.h" #include "SurgSim/Math/RigidTransform.h" namespace SurgSim { namespace Collision { class CollisionPair; class ShapeCollisionRepresentation; /// Abstract base class to calculate intersections between an Octree and other shapes /// /// Derived classes handle the calculation for specific shape types (ie /// OctreeSphereContact). class OctreeContact : public ContactCalculation { protected: /// Do the calculation between an octree node (BoxShape) and the other shape /// \param boxShape the box shape /// \param boxPose the pose of the box /// \param otherShape the other shape /// \param otherPose the pose of the other shape /// \return a list of contacts between the shapes, if any virtual std::list> boxContactCalculation( const SurgSim::Math::BoxShape& boxShape, const SurgSim::Math::RigidTransform3d& boxPose, const SurgSim::Math::Shape& otherShape, const SurgSim::Math::RigidTransform3d& otherPose) = 0; private: std::list> doCalculateDcdContact( const Math::PosedShape>& posedShape1, const Math::PosedShape>& posedShape2) override; /// Calculate the collision between a specific octree node and a shape /// This function will check for contact between the node and shape. If /// contact is found, this function will be called on each of the /// node's children. Once a leaf node is reached, contacts are added to the /// CollisionPair. /// \param node the octree node to collide with /// \param octreePose the pose of the octree shape /// \param shape the shape that the octree is colliding with /// \param shapePose the pose of the shape /// \param nodePath the NodePath of the current octree node /// \param result [in,out] all generated contacts are agreggated here /// \param nodePath [in,out] the path of the current node void calculateContactWithNode( std::shared_ptr node, Math::RigidTransform3d octreePose, const std::shared_ptr& shape, const Math::RigidTransform3d& shapePose, SurgSim::DataStructures::OctreePath* nodePath, std::list>* result); /// Enable a Vector3d to be used as a key in an unordered map. class Vector3dHash { public: size_t operator()(const SurgSim::Math::Vector3d& id) const; }; /// The shapes used for the contact calculations are cached for performance. std::unordered_map, Vector3dHash> m_shapes; }; }; }; #endif // SURGSIM_COLLISION_OCTREECONTACT_H opensurgsim-0.7.0/SurgSim/Collision/OctreeDoubleSidedPlaneContact.cpp000066400000000000000000000025641277777236100257740ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Collision/OctreeDoubleSidedPlaneContact.h" using SurgSim::Math::DoubleSidedPlaneShape; namespace SurgSim { namespace Collision { std::pair OctreeDoubleSidedPlaneContact::getShapeTypes() { return std::pair(SurgSim::Math::SHAPE_TYPE_OCTREE, SurgSim::Math::SHAPE_TYPE_DOUBLESIDEDPLANE); } std::list> OctreeDoubleSidedPlaneContact::boxContactCalculation( const SurgSim::Math::BoxShape& boxShape, const SurgSim::Math::RigidTransform3d& boxPose, const SurgSim::Math::Shape& otherShape, const SurgSim::Math::RigidTransform3d& otherPose) { return m_calculator.calculateDcdContact(boxShape, boxPose, static_cast(otherShape), otherPose); } }; }; opensurgsim-0.7.0/SurgSim/Collision/OctreeDoubleSidedPlaneContact.h000066400000000000000000000026221277777236100254340ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_COLLISION_OCTREEDOUBLESIDEDPLANECONTACT_H #define SURGSIM_COLLISION_OCTREEDOUBLESIDEDPLANECONTACT_H #include "SurgSim/Collision/BoxDoubleSidedPlaneContact.h" #include "SurgSim/Collision/OctreeContact.h" namespace SurgSim { namespace Collision { class OctreeDoubleSidedPlaneContact : public OctreeContact { public: std::pair getShapeTypes() override; protected: std::list> boxContactCalculation(const SurgSim::Math::BoxShape& boxShape, const SurgSim::Math::RigidTransform3d& boxPose, const SurgSim::Math::Shape& otherShape, const SurgSim::Math::RigidTransform3d& otherPose) override; private: BoxDoubleSidedPlaneContact m_calculator; }; }; }; #endif //SURGSIM_COLLISION_OCTREEDOUBLESIDEDPLANECONTACT_H opensurgsim-0.7.0/SurgSim/Collision/OctreePlaneContact.cpp000066400000000000000000000024571277777236100236710ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Collision/OctreePlaneContact.h" using SurgSim::Math::PlaneShape; namespace SurgSim { namespace Collision { std::pair OctreePlaneContact::getShapeTypes() { return std::pair(SurgSim::Math::SHAPE_TYPE_OCTREE, SurgSim::Math::SHAPE_TYPE_PLANE); } std::list> OctreePlaneContact::boxContactCalculation( const SurgSim::Math::BoxShape& boxShape, const SurgSim::Math::RigidTransform3d& boxPose, const SurgSim::Math::Shape& otherShape, const SurgSim::Math::RigidTransform3d& otherPose) { return m_calculator.calculateDcdContact(boxShape, boxPose, static_cast(otherShape), otherPose); } }; }; opensurgsim-0.7.0/SurgSim/Collision/OctreePlaneContact.h000066400000000000000000000025201277777236100233250ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_COLLISION_OCTREEPLANECONTACT_H #define SURGSIM_COLLISION_OCTREEPLANECONTACT_H #include "SurgSim/Collision/BoxPlaneContact.h" #include "SurgSim/Collision/OctreeContact.h" namespace SurgSim { namespace Collision { class OctreePlaneContact : public OctreeContact { public: std::pair getShapeTypes() override; protected: std::list> boxContactCalculation(const SurgSim::Math::BoxShape& boxShape, const SurgSim::Math::RigidTransform3d& boxPose, const SurgSim::Math::Shape& otherShape, const SurgSim::Math::RigidTransform3d& otherPose) override; private: BoxPlaneContact m_calculator; }; }; }; #endif //SURGSIM_COLLISION_OCTREEPLANECONTACT_H opensurgsim-0.7.0/SurgSim/Collision/OctreeSphereContact.cpp000066400000000000000000000024651277777236100240570ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Collision/OctreeSphereContact.h" using SurgSim::Math::SphereShape; namespace SurgSim { namespace Collision { std::pair OctreeSphereContact::getShapeTypes() { return std::pair(SurgSim::Math::SHAPE_TYPE_OCTREE, SurgSim::Math::SHAPE_TYPE_SPHERE); } std::list> OctreeSphereContact::boxContactCalculation( const SurgSim::Math::BoxShape& boxShape, const SurgSim::Math::RigidTransform3d& boxPose, const SurgSim::Math::Shape& otherShape, const SurgSim::Math::RigidTransform3d& otherPose) { return m_calculator.calculateDcdContact(boxShape, boxPose, static_cast(otherShape), otherPose); } }; }; opensurgsim-0.7.0/SurgSim/Collision/OctreeSphereContact.h000066400000000000000000000025261277777236100235220ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_COLLISION_OCTREESPHERECONTACT_H #define SURGSIM_COLLISION_OCTREESPHERECONTACT_H #include "SurgSim/Collision/BoxSphereContact.h" #include "SurgSim/Collision/OctreeContact.h" namespace SurgSim { namespace Collision { class OctreeSphereContact : public OctreeContact { public: std::pair getShapeTypes() override; protected: std::list> boxContactCalculation(const SurgSim::Math::BoxShape& boxShape, const SurgSim::Math::RigidTransform3d& boxPose, const SurgSim::Math::Shape& otherShape, const SurgSim::Math::RigidTransform3d& otherPose) override; private: BoxSphereContact m_calculator; }; }; }; #endif //SURGSIM_COLLISION_OCTREESPHERECONTACT_H opensurgsim-0.7.0/SurgSim/Collision/PerformanceTests/000077500000000000000000000000001277777236100227245ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Collision/PerformanceTests/CMakeLists.txt000066400000000000000000000022571277777236100254720ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2012-2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. include_directories ( ${gtest_SOURCE_DIR}/include ${gmock_SOURCE_DIR}/include ) set(UNIT_TEST_SOURCES TriangleMeshTriangleMeshContactCalculationPerformanceTest.cpp ) set(UNIT_TEST_HEADERS ) set(LIBS SurgSimCollision SurgSimDataStructures SurgSimFramework ) # Configure the path for the data files configure_file( "${CMAKE_CURRENT_SOURCE_DIR}/config.txt.in" "${CMAKE_CURRENT_BINARY_DIR}/config.txt" ) surgsim_add_unit_tests(SurgSimCollisionPerformanceTest) set_target_properties(SurgSimCollisionPerformanceTest PROPERTIES FOLDER "Collision") TriangleMeshTriangleMeshContactCalculationPerformanceTest.cpp000066400000000000000000000050761277777236100367630ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Collision/PerformanceTests// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Collision/TriangleMeshTriangleMeshContact.h" #include "SurgSim/Collision/UnitTests/ContactCalculationTestsCommon.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Framework/Timer.h" using SurgSim::Math::MeshShape; using SurgSim::Math::RigidTransform3d; using SurgSim::Math::Vector3d; namespace SurgSim { namespace Collision { TEST(TriangleMeshTriangleMeshContactCalculationPerformanceTests, IntersectionTest) { auto runtime = std::make_shared("config.txt"); auto meshA = std::make_shared(); meshA->load("Geometry/stapler_collision.ply"); auto meshB = std::make_shared(); meshB->load("Geometry/wound_deformable_with_texture.ply"); std::shared_ptr meshARep = std::make_shared("Collision Mesh 0"); meshARep->setShape(meshA); std::shared_ptr meshBRep = std::make_shared("Collision Mesh 1"); meshBRep->setShape(meshB); TriangleMeshTriangleMeshContact calcContact; std::shared_ptr pair = std::make_shared(meshARep, meshBRep); Framework::Timer timer; int loops = 100; size_t contacts = 0; for (int i = 0 ; i < loops; ++i) { pair->clearContacts(); meshARep->getCollisions().unsafeGet().clear(); meshBRep->getCollisions().unsafeGet().clear(); RigidTransform3d pose = Math::makeRigidTransform(Math::makeRotationQuaternion(2.0 * M_PI * i / loops, Vector3d::UnitX().eval()), Vector3d(i, -1.5 * i, 0.0)); meshARep->setLocalPose(pose); meshBRep->setLocalPose(pose); timer.beginFrame(); calcContact.calculateContact(pair); timer.endFrame(); contacts += pair->getContacts().size(); } RecordProperty("FrameRate", boost::to_string(loops / timer.getCumulativeTime())); RecordProperty("Duration", boost::to_string(timer.getCumulativeTime())); RecordProperty("Loops", boost::to_string(loops)); } } } opensurgsim-0.7.0/SurgSim/Collision/PerformanceTests/config.txt.in000066400000000000000000000000541277777236100253360ustar00rootroot00000000000000${PROJECT_BINARY_DIR}/SurgSim/Testing/Data/ opensurgsim-0.7.0/SurgSim/Collision/Representation.cpp000066400000000000000000000207111277777236100231470ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Collision/Representation.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Shape.h" #include "SurgSim/Physics/Representation.h" namespace SurgSim { namespace Collision { Representation::Representation(const std::string& name) : SurgSim::Framework::Representation(name), m_logger(Framework::Logger::getLogger("Collision/Representation")), m_collisionDetectionType(COLLISION_DETECTION_TYPE_DISCRETE), m_selfCollisionDetectionType(COLLISION_DETECTION_TYPE_NONE) { SURGSIM_ADD_SERIALIZABLE_PROPERTY(Representation, std::vector, Ignore, getIgnoring, setIgnoring); SURGSIM_ADD_SERIALIZABLE_PROPERTY(Representation, std::vector, Allow, getAllowing, setAllowing); SURGSIM_ADD_SERIALIZABLE_PROPERTY(Representation, CollisionDetectionType, CollisionDetectionType, getCollisionDetectionType, setCollisionDetectionType); SURGSIM_ADD_SERIALIZABLE_PROPERTY(Representation, CollisionDetectionType, SelfCollisionDetectionType, getSelfCollisionDetectionType, setSelfCollisionDetectionType); } Representation::~Representation() { } void Representation::setCollisionDetectionType(CollisionDetectionType type) { m_collisionDetectionType = type; } CollisionDetectionType Representation::getCollisionDetectionType() const { return m_collisionDetectionType; } void Representation::setSelfCollisionDetectionType(CollisionDetectionType type) { m_selfCollisionDetectionType = type; } CollisionDetectionType Representation::getSelfCollisionDetectionType() const { return m_selfCollisionDetectionType; } const Math::PosedShapeMotion>& Representation::getPosedShapeMotion() const { boost::shared_lock lock(m_posedShapeMotionMutex); return m_posedShapeMotion; } void Representation::setPosedShapeMotion(const Math::PosedShapeMotion>& posedShapeMotion) { boost::unique_lock lock(m_posedShapeMotionMutex); m_posedShapeMotion = posedShapeMotion; } std::shared_ptr Representation::getPosedShape() { if (getShape()->isTransformable()) { // HS-3-mar-2016 This is still being used by all representations it will be superceded by // local update functionality after ryans merge request goes in // #todo get rid of this in favor of transforming the mesh shape boost::unique_lock lock(m_posedShapeMotionMutex); Math::RigidTransform3d identity = Math::RigidTransform3d::Identity(); Math::RigidTransform3d pose = getPose(); if (pose.isApprox(identity)) { Math::PosedShape> newPosedShape(getShape(), identity); m_posedShapeMotion.second = newPosedShape; } else if (m_posedShapeMotion.second.getShape() == nullptr || !pose.isApprox(m_posedShapeMotion.second.getPose())) { Math::PosedShape> newPosedShape(getShape()->getTransformed(pose), pose); m_posedShapeMotion.second = newPosedShape; } return m_posedShapeMotion.second.getShape(); } else { return getShape(); } } void Representation::invalidatePosedShapeMotion() { boost::unique_lock lock(m_posedShapeMotionMutex); m_posedShapeMotion.invalidate(); } SurgSim::DataStructures::BufferedValue& Representation::getCollisions() { return m_collisions; } void Representation::addContact(const std::shared_ptr& other, const std::shared_ptr& contact) { boost::lock_guard lock(m_collisionsMutex); m_collisions.unsafeGet()[other].push_back(contact); } bool Representation::collidedWith(const std::shared_ptr& other) { auto collisions = m_collisions.safeGet(); return (collisions->find(other) != collisions->end()); } void Representation::update(const double& dt) { // HS-2-Mar-2016 // #todo if we decide to keep this it should be used to make a threadsafe copy of the data and enable outside // access to it, this can then be used by a behavior to access the correct shape // currently this is unused } bool Representation::ignore(const std::string& fullName) { bool result = false; if (m_allowing.empty()) { result = m_ignoring.insert(fullName).second; } else { auto found = m_allowing.find(fullName); if (found != m_allowing.end()) { m_allowing.erase(found); result = true; } else { SURGSIM_LOG_WARNING(m_logger) << getFullName() << " Trying to un-allow" << fullName << " but it wasn't found."; } } return result; } bool Representation::ignore(const std::shared_ptr& representation) { if (representation->getSceneElement() == nullptr) { SURGSIM_LOG_WARNING(m_logger) << getFullName() << " cannot ignore " << representation->getName() << ", which is not in a scene element."; return false; } return ignore(representation->getFullName()); } bool Representation::allow(const std::string& fullName) { bool result = false; if (m_ignoring.empty()) { result = m_allowing.insert(fullName).second; } else { auto found = m_ignoring.find(fullName); if (found != m_ignoring.end()) { m_ignoring.erase(found); result = true; } else { SURGSIM_LOG_WARNING(m_logger) << getFullName() << " Trying un-ignore" << fullName << " but it wasn't found."; } } return result; } bool Representation::allow(const std::shared_ptr& representation) { if (representation->getSceneElement() == nullptr) { SURGSIM_LOG_WARNING(m_logger) << getFullName() << " cannot allow " << representation->getName() << ", which is not in a scene element."; return false; } return allow(representation->getFullName()); } void Representation::setIgnoring(const std::vector& fullNames) { if (m_allowing.empty()) { m_ignoring.clear(); std::copy(fullNames.cbegin(), fullNames.cend(), std::inserter(m_ignoring, m_ignoring.begin())); } else { SURGSIM_LOG_SEVERE(m_logger) << getFullName() << " cannot use setIgnoring. " << "You can only set what representations to ignore or allow, not both."; } } std::vector Representation::getIgnoring() const { return std::vector(std::begin(m_ignoring), std::end(m_ignoring)); } bool Representation::isIgnoring(const std::string& fullName) const { if (m_allowing.empty()) { return m_ignoring.find(fullName) != m_ignoring.end(); } return m_allowing.find(fullName) == m_allowing.end(); } bool Representation::isIgnoring(const std::shared_ptr& representation) const { return isIgnoring(representation->getFullName()); } bool Representation::isAllowing(const std::string& fullName) const { return !isIgnoring(fullName); } bool Representation::isAllowing(const std::shared_ptr& representation) const { return isAllowing(representation->getFullName()); } void Representation::setAllowing(const std::vector& fullNames) { if (m_ignoring.empty()) { m_allowing.clear(); std::copy(fullNames.cbegin(), fullNames.cend(), std::inserter(m_allowing, m_allowing.begin())); } else { SURGSIM_LOG_SEVERE(m_logger) << getFullName() << " cannot use setAllowing. " << "You can only set what representations to ignore or allow, not both."; } } std::vector Representation::getAllowing() const { return std::vector(std::begin(m_allowing), std::end(m_allowing)); } void Representation::doRetire() { m_collisions.unsafeGet().clear(); m_collisions.publish(); Framework::Representation::doRetire(); } Math::Aabbd Representation::getBoundingBox() const { SURGSIM_ASSERT(getShape() != nullptr); return Math::transformAabb(getPose(), getShape()->getBoundingBox()); } void Representation::updateDcdData() { } void Representation::updateCcdData(double timeOfImpact) { } void Representation::updateShapeData() { getPosedShape(); } }; // namespace Collision }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Collision/Representation.h000066400000000000000000000260711277777236100226210ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_COLLISION_REPRESENTATION_H #define SURGSIM_COLLISION_REPRESENTATION_H #include #include #include #include #include #include "SurgSim/DataStructures/BufferedValue.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Framework/Representation.h" #include "SurgSim/Math/Aabb.h" #include "SurgSim/Math/Shape.h" namespace SurgSim { namespace Math { class Shape; }; namespace Physics { class Representation; }; namespace Collision { struct Contact; class Representation; typedef std::unordered_map, std::list>> ContactMapType; /// The type of collision detection enum CollisionDetectionType : SURGSIM_ENUM_TYPE; /// Wrapper class to use for the collision operation, handles its enclosed shaped /// and a possible local to global coordinate system transform, if the physics representation /// is a nullptr or a has gone out of scope ASSERT's will be triggered. /// Collision with other representations will be updated by CollisionPair::addContact() and /// be cleared every time DcdCollision::updatePair() makes a new CollisionPair. class Representation : public SurgSim::Framework::Representation { public: /// Constructor /// \param name Name of this collision representation explicit Representation(const std::string& name); /// Destructor virtual ~Representation(); /// Get the shape type id /// \return The unique type of the shape, used to determine which calculation to use. virtual int getShapeType() const = 0; /// Set the type of collision detection to use between this representation and other representations /// \param type The collision detection type void setCollisionDetectionType(CollisionDetectionType type); /// Get the type of collision detection used between this representation and other representations /// \return The collision detection type CollisionDetectionType getCollisionDetectionType() const; /// Set the type of collision detection to use between this representation and itself /// \param type The collision detection type void setSelfCollisionDetectionType(CollisionDetectionType type); /// Get the type of collision detection used between this representation and itself /// \return The collision detection type CollisionDetectionType getSelfCollisionDetectionType() const; /// Get the shape /// \return The actual shape used for collision. virtual const std::shared_ptr getShape() const = 0; /// Get the shape, posed /// \return The shape transformed by the pose of this representation virtual std::shared_ptr getPosedShape(); /// \return the posed shape motion const Math::PosedShapeMotion>& getPosedShapeMotion() const; /// A map between collision representations and contacts. /// For each collision representation, it gives the list of contacts registered against this instance. /// \return A map with collision representations as keys and lists of contacts as the associated value. SurgSim::DataStructures::BufferedValue& getCollisions(); /// Add a contact with another representation /// \param other The other collision representation /// \param contact The contact to be added /// \note This method is thread-safe void addContact(const std::shared_ptr& other, const std::shared_ptr& contact); /// Check whether this collision representation collided with another during the last update /// \param other other collision representation to check against /// \return true if there were contacts recorded, false otherwise bool collidedWith(const std::shared_ptr& other); /// Update the representation. /// \param dt the time passed from the last update. virtual void update(const double& dt); /// Update the basic Shape's state from the physics state, so that the bounding box can correctly be determined virtual void updateShapeData(); /// Update the data (the shape) in preparation for a DCD contact calculation virtual void updateDcdData(); /// Update the data (the motionShape) in preparation for a CCD contact calcul ation /// \param timeOfImpact the last time of impact, the representation is responsible for managing /// the time correctly virtual void updateCcdData(double timeOfImpact); /// Set a collision representation to ignore /// Collisions with this collision representation will not be detected /// This acts as the opposite of allow if the representation that is passed here was previously added via allow() /// \param fullName The full name of the collision representation to ignore bool ignore(const std::string& fullName); /// Set a collision representation to ignore /// Collisions with this collision representation will not be detected /// This acts as the opposite of allow if the representation that is passed here was previously added via allow() /// \param representation The collision representation to ignore bool ignore(const std::shared_ptr& representation); /// Set the collision representations to ignore /// Collisions with these collision representation will not be detected /// \note This method conflicts with setAllowing. You can only set what /// representations to ignore or allow collisions with, not both. /// \param fullNames The collision representations (given by full name) to ignore void setIgnoring(const std::vector& fullNames); /// Is the collision representation being ignored /// \param fullName The full name of the collision representation to check /// return True if the collision representation is being ignored bool isIgnoring(const std::string& fullName) const; /// Is the collision representation being ignored /// \param representation The collision representation to check /// return True if the collision representation is being ignored bool isIgnoring(const std::shared_ptr& representation) const; /// Set a collision representation to allow /// Only collisions with "allowed" collision representation will be detected /// If the the representation is currently being "ignored" then it will be removed from that state and /// collisions will be allowed again. /// \note When both the allow and ignore lists are empty calling allow may cause a change of behavior that /// might not be wanted (i.e. the representation will go from colliding with all others to just colliding with /// one other representation). This might be caused by trying to revert an "ignore" that has already been reversed. /// \param fullName The full name of the collision representation to allow bool allow(const std::string& fullName); /// Set a collision representation to allow /// Only collisions with "allowed" collision representation will be detected /// If the the representation is currently being "ignored" then it will be removed from that state and /// collisions will be allowed again. /// \note When both the allow and ignore lists are empty calling allow may cause a change of behavior that /// might not be wanted (i.e. the representation will go from colliding with all others to just colliding with /// one other representation). This might be caused by trying to revert an "ignore" that has already been reversed. /// \param representation The collision representation to allow bool allow(const std::shared_ptr& representation); /// Set the only collision representations to allow collisions with /// Only Collisions with these collision representation will be detected /// \note This method conflicts with ignore and setIgnoring. You can only set what /// representations to ignore or allow collisions with, not both. /// \param fullNames The collision representations (given by full name) to allow void setAllowing(const std::vector& fullNames); /// Is the collision representation being allowed /// \param fullName The full name of the collision representation to check /// return True if the collision representation is being allowed bool isAllowing(const std::string& fullName) const; /// Is the collision representation being allowed /// \param representation The collision representation to check /// return True if the collision representation is being allowed bool isAllowing(const std::shared_ptr& representation) const; /// \return the Bounding box for this object Math::Aabbd getBoundingBox() const; protected: /// Invalidate the cached posed shape motion void invalidatePosedShapeMotion(); /// Get the ignored collision representations /// \return The full names of all the ignored collision representations std::vector getIgnoring() const; /// Get the only collision representations that this representation is allowed to collide with /// \return The full names of all the collision representations to allow std::vector getAllowing() const; void doRetire() override; /// \param posedShape the posed shape motion to be set void setPosedShapeMotion(const Math::PosedShapeMotion>& posedShape); std::shared_ptr m_logger; private: /// The type of collision detection CollisionDetectionType m_collisionDetectionType; /// The type of self collision detection CollisionDetectionType m_selfCollisionDetectionType; /// A map which associates a list of contacts with each collision representation. /// Every contact added to this map follows the convention of pointing the contact normal toward this /// representation. And the first penetration point is on this representation. SurgSim::DataStructures::BufferedValue m_collisions; /// Mutex to lock write access to m_collisions boost::mutex m_collisionsMutex; /// The shape transformed in space and defined through time, i.e. with 2 differents configurations Math::PosedShapeMotion> m_posedShapeMotion; /// Mutex to lock write access to m_posedShapeMotion mutable boost::shared_mutex m_posedShapeMotionMutex; /// Ignored collision representations std::unordered_set m_ignoring; /// Allowed collision representations std::unordered_set m_allowing; }; }; // namespace Collision }; // namespace SurgSim SURGSIM_SERIALIZABLE_ENUM(SurgSim::Collision::CollisionDetectionType, (COLLISION_DETECTION_TYPE_NONE) (COLLISION_DETECTION_TYPE_DISCRETE) (COLLISION_DETECTION_TYPE_CONTINUOUS) (MAX_COLLISION_DETECTION_TYPES)) #endif opensurgsim-0.7.0/SurgSim/Collision/SegmentMeshTriangleMeshContact.cpp000066400000000000000000000376551277777236100262220ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Collision/SegmentMeshTriangleMeshContact.h" #include "SurgSim/Collision/CollisionPair.h" #include "SurgSim/Collision/Representation.h" #include "SurgSim/DataStructures/AabbTree.h" #include "SurgSim/DataStructures/AabbTreeNode.h" #include "SurgSim/DataStructures/IndexedLocalCoordinate.h" #include "SurgSim/DataStructures/TriangleMesh.h" #include "SurgSim/Math/Geometry.h" #include "SurgSim/Math/MeshShape.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/SegmentMeshShape.h" using SurgSim::DataStructures::Location; using SurgSim::DataStructures::TriangleMesh; using SurgSim::Math::MeshShape; using SurgSim::Math::RigidTransform3d; using SurgSim::Math::SegmentMeshShape; using SurgSim::Math::Vector3d; namespace SegmentMeshTriangleMesh { bool isThisContactADuplicate( const std::shared_ptr& newContact, const std::list>& contacts) { for (const auto& contact : contacts) { if (*newContact == *contact) { return true; } } return false; } } namespace SurgSim { namespace Collision { std::pair SegmentMeshTriangleMeshContact::getShapeTypes() { return std::pair(SurgSim::Math::SHAPE_TYPE_SEGMENTMESH, SurgSim::Math::SHAPE_TYPE_MESH); } std::list> SegmentMeshTriangleMeshContact::calculateDcdContact( const Math::SegmentMeshShape& segmentMeshShape, const Math::RigidTransform3d& segmentMeshPose, const Math::MeshShape& triangleMeshShape, const Math::RigidTransform3d& triangleMeshPose) const { std::list> contacts; std::list intersectionList = segmentMeshShape.getAabbTree()->spatialJoin(*triangleMeshShape.getAabbTree()); double radius = segmentMeshShape.getRadius(); double depth = 0.0; Vector3d normal; Vector3d penetrationPointCapsule, penetrationPointTriangle, penetrationPointCapsuleAxis; for (const auto& intersection : intersectionList) { std::shared_ptr nodeSegment = intersection.first; std::shared_ptr nodeTriangle = intersection.second; std::list edgeList; std::list triangleList; nodeSegment->getIntersections(nodeTriangle->getAabb(), &edgeList); nodeTriangle->getIntersections(nodeSegment->getAabb(), &triangleList); for (auto i = triangleList.begin(); i != triangleList.end(); ++i) { const Vector3d& normalTriangle = triangleMeshShape.getNormal(*i); if (normalTriangle.isZero()) { continue; } const auto& verticesTriangle = triangleMeshShape.getTrianglePositions(*i); for (auto j = edgeList.begin(); j != edgeList.end(); ++j) { const auto& verticesSegment = segmentMeshShape.getEdgePositions(*j); // Check if the triangle and capsule intersect. if (SurgSim::Math::calculateContactTriangleCapsule( verticesTriangle[0], verticesTriangle[1], verticesTriangle[2], normalTriangle, verticesSegment[0], verticesSegment[1], radius, &depth, &penetrationPointTriangle, &penetrationPointCapsule, &normal, &penetrationPointCapsuleAxis)) { // Create the contact. std::pair penetrationPoints; SurgSim::Math::Vector2d barycentricCoordinate2; SurgSim::Math::barycentricCoordinates(penetrationPointCapsuleAxis, verticesSegment[0], verticesSegment[1], &barycentricCoordinate2); penetrationPoints.first.elementMeshLocalCoordinate.setValue( SurgSim::DataStructures::IndexedLocalCoordinate(*j, barycentricCoordinate2)); penetrationPoints.first.rigidLocalPosition.setValue( segmentMeshPose.inverse() * penetrationPointCapsuleAxis); Vector3d barycentricCoordinate; SurgSim::Math::barycentricCoordinates(penetrationPointTriangle, verticesTriangle[0], verticesTriangle[1], verticesTriangle[2], normalTriangle, &barycentricCoordinate); penetrationPoints.second.triangleMeshLocalCoordinate.setValue( SurgSim::DataStructures::IndexedLocalCoordinate(*i, barycentricCoordinate)); penetrationPoints.second.rigidLocalPosition.setValue( triangleMeshPose.inverse() * penetrationPointTriangle); // Create the contact. contacts.push_back(std::make_shared(COLLISION_DETECTION_TYPE_DISCRETE, std::abs(depth) + (penetrationPointCapsule - penetrationPointCapsuleAxis).dot(normal), 1.0, Vector3d::Zero(), -normal, penetrationPoints)); } } } } return contacts; } std::list>SegmentMeshTriangleMeshContact::calculateCcdContact( const Math::SegmentMeshShape& shape1AtTime0, const Math::RigidTransform3d& pose1AtTime0, const Math::SegmentMeshShape& shape1AtTime1, const Math::RigidTransform3d& pose1AtTime1, const Math::MeshShape& shape2AtTime0, const Math::RigidTransform3d& pose2AtTime0, const Math::MeshShape& shape2AtTime1, const Math::RigidTransform3d& pose2AtTime1) const { using SegmentMeshTriangleMesh::isThisContactADuplicate; using Math::calculateCcdContactSegmentSegment; using Math::calculateCcdContactPointTriangle; double epsilon = Math::Geometry::DistanceEpsilon; std::list> contacts; // This code is not tested for SegmentMeshes on Rigids, warn the user ! SURGSIM_LOG_ONCE_IF(! pose1AtTime0.isApprox(Math::RigidTransform3d::Identity()) && ! pose1AtTime1.isApprox(Math::RigidTransform3d::Identity()), SurgSim::Framework::Logger::getLogger("Collision"), SEVERE) << "It looks like you're using the SegmentMesh with a rigid object under CCD, the " << "SegmentMeshTriangleMeshContact is not tested for this case."; SURGSIM_ASSERT(shape1AtTime0.getNumEdges() > 0); SURGSIM_ASSERT(shape1AtTime0.getNumEdges() == shape1AtTime1.getNumEdges()); SURGSIM_ASSERT(shape2AtTime0.getNumTriangles() > 0); SURGSIM_ASSERT(shape2AtTime0.getNumTriangles() == shape2AtTime1.getNumTriangles()); for (size_t edgeId = 0; edgeId < shape1AtTime0.getNumEdges(); edgeId++) { auto edgeT0 = shape1AtTime0.getEdge(edgeId); auto edgeT1 = shape1AtTime1.getEdge(edgeId); SURGSIM_ASSERT(edgeT0.verticesId == edgeT1.verticesId) << "Edges are different:\n" << "(" << edgeT0.verticesId[0] << "," << edgeT0.verticesId[1] << ")\n" << "(" << edgeT1.verticesId[0] << "," << edgeT1.verticesId[1] << ")\n" << "edgeT0.valid = " << edgeT0.isValid << "\nedgeT1.valid = " << edgeT1.isValid; std::pair sv0 = std::make_pair( shape1AtTime0.getVertexPosition(edgeT0.verticesId[0]), shape1AtTime1.getVertexPosition(edgeT1.verticesId[0])); std::pair sv1 = std::make_pair( shape1AtTime0.getVertexPosition(edgeT0.verticesId[1]), shape1AtTime1.getVertexPosition(edgeT1.verticesId[1])); Math::Aabbd segmentAabb; segmentAabb.extend(sv0.first); segmentAabb.extend(sv0.second); segmentAabb.extend(sv1.first); segmentAabb.extend(sv1.second); for (size_t triangleId = 0; triangleId < shape2AtTime0.getNumTriangles(); triangleId++) { auto triangleT0 = shape2AtTime0.getTriangle(triangleId); auto triangleT1 = shape2AtTime1.getTriangle(triangleId); SURGSIM_ASSERT(triangleT0.verticesId == triangleT1.verticesId) << "Triangles are different:\n" << "(" << triangleT0.verticesId[0] << "," << triangleT0.verticesId[1] << "," << triangleT0.verticesId[2] << ")\n" << "(" << triangleT1.verticesId[0] << "," << triangleT1.verticesId[1] << "," << triangleT1.verticesId[2] << ")\n" << "triangleT0.valid = " << triangleT0.isValid << "\ntriangleT1.valid = " << triangleT1.isValid; std::pair tv0 = std::make_pair( shape2AtTime0.getVertexPosition(triangleT0.verticesId[0]), shape2AtTime1.getVertexPosition(triangleT1.verticesId[0])); std::pair tv1 = std::make_pair( shape2AtTime0.getVertexPosition(triangleT0.verticesId[1]), shape2AtTime1.getVertexPosition(triangleT1.verticesId[1])); std::pair tv2 = std::make_pair( shape2AtTime0.getVertexPosition(triangleT0.verticesId[2]), shape2AtTime1.getVertexPosition(triangleT1.verticesId[2])); Math::Aabbd triangleAabb; triangleAabb.extend(tv0.first); triangleAabb.extend(tv0.second); triangleAabb.extend(tv1.first); triangleAabb.extend(tv1.second); triangleAabb.extend(tv2.first); triangleAabb.extend(tv2.second); if (!SurgSim::Math::doAabbIntersect(segmentAabb, triangleAabb)) { continue; } double earliestTimeOfImpact = std::numeric_limits::max(); double segmentAlpha = -1.0; //!< Barycentric coordinates of P in the segment sv0sv1 //!< P = sv0 + segmentAlpha.sv0sv1 double triangleAlpha = -1.0; //!< Barycentric coordinates of P in triangle tv0tv1tv2 double triangleBeta = -1.0; //!< P = tv0 + triangleAlpha.tv0tv1 + triangleBeta.tv0tv2 // Check collision at time t = 0 Math::Vector3d pt; Math::Vector3d tn = ((tv1.first - tv0.first).cross(tv2.first - tv0.first)); if (tn.norm() < Math::Geometry::DistanceEpsilon) { SURGSIM_LOG_WARNING(Framework::Logger::getLogger("SegmentMeshTriangleMeshContact")) << "The triangle mesh contains a degenerate triangle (null normal)"; } tn.normalize(); bool segmentSegmentCcdFound = false; if (Math::doesCollideSegmentTriangle( sv0.first, sv1.first, tv0.first, tv1.first, tv2.first, tn, &pt)) { Math::Vector2d baryCoordSegment; Math::Vector3d baryCoordTriangle; if (!Math::barycentricCoordinates(pt, sv0.first, sv1.first, &baryCoordSegment)) { SURGSIM_LOG_WARNING(Framework::Logger::getLogger("SegmentMeshTriangleMeshContact")) << "[t=0] Could not deduce the barycentric coordinate of (" << pt.transpose() << ") in the segment (" << sv0.first.transpose() << ") (" << sv1.first.transpose() << ")"; } if (!Math::barycentricCoordinates(pt, tv0.first, tv1.first, tv2.first, &baryCoordTriangle)) { SURGSIM_LOG_WARNING(Framework::Logger::getLogger("SegmentMeshTriangleMeshContact")) << "[t=0] Could not deduce the barycentric coordinate of (" << pt.transpose() << ") in the triangle (" << tv0.first.transpose() << ") (" << tv1.first.transpose() << ") (" << tv2.first.transpose() << ")"; } segmentSegmentCcdFound = false; earliestTimeOfImpact = 0.0; segmentAlpha = baryCoordSegment[1]; triangleAlpha = baryCoordTriangle[1]; triangleBeta = baryCoordTriangle[2]; } else { // No collision at time t = 0, let's look for collision in the interval ]0..1] // Calculate Segment/Segment ccd double timeOfImpact; double sFactor, tFactor; if (calculateCcdContactSegmentSegment(sv0, sv1, tv0, tv1, &timeOfImpact, &sFactor, &tFactor)) { if (timeOfImpact < earliestTimeOfImpact) { segmentSegmentCcdFound = true; earliestTimeOfImpact = timeOfImpact; segmentAlpha = sFactor; triangleAlpha = tFactor; triangleBeta = 0.0; } } if (calculateCcdContactSegmentSegment(sv0, sv1, tv1, tv2, &timeOfImpact, &sFactor, &tFactor)) { if (timeOfImpact < earliestTimeOfImpact) { segmentSegmentCcdFound = true; earliestTimeOfImpact = timeOfImpact; segmentAlpha = sFactor; triangleAlpha = 1.0 - tFactor; // P = P0 + P0P1.(1 - tFactor) + P0P2.tFactor triangleBeta = tFactor; } } if (calculateCcdContactSegmentSegment(sv0, sv1, tv2, tv0, &timeOfImpact, &sFactor, &tFactor)) { if (timeOfImpact < earliestTimeOfImpact) { segmentSegmentCcdFound = true; earliestTimeOfImpact = timeOfImpact; segmentAlpha = sFactor; triangleAlpha = 0.0; // P = P0 + P0P2.(1 - tFactor) triangleBeta = 1.0 - tFactor; } } // Calculate Point/Triangle ccd double u, v; if (calculateCcdContactPointTriangle(sv0, tv0, tv1, tv2, &timeOfImpact, &u, &v)) { if (timeOfImpact < earliestTimeOfImpact) { segmentSegmentCcdFound = false; earliestTimeOfImpact = timeOfImpact; segmentAlpha = 0.0; triangleAlpha = u; triangleBeta = v; } } if (calculateCcdContactPointTriangle(sv1, tv0, tv1, tv2, &timeOfImpact, &u, &v)) { if (timeOfImpact < earliestTimeOfImpact) { segmentSegmentCcdFound = false; earliestTimeOfImpact = timeOfImpact; segmentAlpha = 1.0; triangleAlpha = u; triangleBeta = v; } } } // False positive from the AABB, no collision found if (earliestTimeOfImpact == std::numeric_limits::max()) { continue; } SURGSIM_ASSERT(segmentAlpha >= -epsilon && segmentAlpha <= (1.0 + epsilon)) << "earliestTimeOfImpact = " << earliestTimeOfImpact << "; segmentAlpha = " << segmentAlpha; SURGSIM_ASSERT(triangleAlpha >= -epsilon && triangleBeta >= -epsilon && triangleAlpha + triangleBeta <= (1.0 + epsilon + epsilon)) << "earliestTimeOfImpact = " << earliestTimeOfImpact << "; triangleAlpha = " << triangleAlpha << "; triangleBeta = " << triangleBeta << "; triangleAlpha + triangleBeta = " << triangleAlpha + triangleBeta; Math::Vector3d T, Tn; double penentrationDepthAtT1; Math::Vector3d S = Math::interpolate(sv0.second, sv1.second, segmentAlpha); { Math::Vector3d T0T1 = tv1.second - tv0.second; Math::Vector3d T0T2 = tv2.second - tv0.second; T = tv0.second + triangleAlpha * T0T1 + triangleBeta * T0T2; Tn = (segmentSegmentCcdFound) ? (T - S).normalized() : T0T1.cross(T0T2).normalized(); penentrationDepthAtT1 = (S - T).dot(Tn); } Math::Vector segmentBaryCoord(2); segmentBaryCoord << 1.0 - segmentAlpha, segmentAlpha; DataStructures::IndexedLocalCoordinate localCoordinateSegment(edgeId, segmentBaryCoord); DataStructures::Location locationSegment(localCoordinateSegment, Location::ELEMENT); locationSegment.rigidLocalPosition = S; Math::Vector triangleBaryCoord(3); triangleBaryCoord << 1.0 - triangleAlpha - triangleBeta, triangleAlpha, triangleBeta; DataStructures::IndexedLocalCoordinate localCoordinateTriangle(triangleId, triangleBaryCoord); // The location related to the TriangleMesh can carry a TRIANGLE information // e.g. part of a Mass-Spring with deformable triangulation for collision DataStructures::Location locationTriangle(localCoordinateTriangle, Location::TRIANGLE); // The location related to the TriangleMesh can carry an ELEMENT information // e.g. part of an Fem2D for example locationTriangle.elementMeshLocalCoordinate = locationTriangle.triangleMeshLocalCoordinate; // The location related to the TriangleMesh can carry a RIGID LOCAL POSITION information // e.g. part of a rigid body locationTriangle.rigidLocalPosition = pose2AtTime1.inverse() * T; auto contact = std::make_shared( COLLISION_DETECTION_TYPE_CONTINUOUS, penentrationDepthAtT1, earliestTimeOfImpact, T, Tn, std::make_pair(locationSegment, locationTriangle)); if (!isThisContactADuplicate(contact, contacts)) { contacts.push_back(std::move(contact)); } } } return contacts; } }; // namespace Collision }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Collision/SegmentMeshTriangleMeshContact.h000066400000000000000000000041371277777236100256540ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_COLLISION_SEGMENTMESHTRIANGLEMESHCONTACT_H #define SURGSIM_COLLISION_SEGMENTMESHTRIANGLEMESHCONTACT_H #include #include "SurgSim/Collision/ShapeShapeContactCalculation.h" #include "SurgSim/Math/MeshShape.h" #include "SurgSim/Math/SegmentMeshShape.h" namespace SurgSim { namespace Collision { class CollisionPair; /// Class to calculate intersections between a segment mesh and a triangle mesh class SegmentMeshTriangleMeshContact : public ShapeShapeContactCalculation { public: using ContactCalculation::calculateDcdContact; std::pair getShapeTypes() override; std::list> calculateDcdContact( const Math::SegmentMeshShape& segmentMeshShape, const Math::RigidTransform3d& segmentMeshPose, const Math::MeshShape& triangleMeshShape, const Math::RigidTransform3d& triangleMeshPose) const override; std::list> calculateCcdContact( const Math::SegmentMeshShape& shape1AtTime0, const Math::RigidTransform3d& pose1AtTime0, const Math::SegmentMeshShape& shape1AtTime1, const Math::RigidTransform3d& pose1AtTime1, const Math::MeshShape& shape2AtTime0, const Math::RigidTransform3d& pose2AtTime0, const Math::MeshShape& shape2AtTime1, const Math::RigidTransform3d& pose2AtTime1) const override; }; }; // namespace Collision }; // namespace SurgSim #endif // SURGSIM_COLLISION_SEGMENTMESHTRIANGLEMESHCONTACT_H opensurgsim-0.7.0/SurgSim/Collision/SegmentSegmentCcdIntervalCheck.cpp000066400000000000000000000305351277777236100261540ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Collision/SegmentSegmentCcdIntervalCheck.h" namespace SurgSim { namespace Collision { // The order of initialization MUST match the necessary initialization order -- // if member B is calculated from member A, then B must of course be initialized after A in // the constructor, and B must be declared after A in here the class definition. SegmentSegmentCcdIntervalCheck::SegmentSegmentCcdIntervalCheck( const std::array& pT0, const std::array& pT1, const std::array& qT0, const std::array& qT1, double thicknessP, double thicknessQ, double timePrecisionEpsilon, double distanceEpsilon) : m_motionP1(pT0[0], pT1[0]), m_motionP2(pT0[1], pT1[1]), m_motionQ1(qT0[0], qT1[0]), m_motionQ2(qT0[1], qT1[1]), m_relativeP1Q1(m_motionQ1 - m_motionP1), m_relativeQ1Q2(m_motionQ2 - m_motionQ1), m_relativeP1P2(m_motionP2 - m_motionP1), m_P1Q1_P1P2_Q1Q2(Math::analyticTripleProduct(m_relativeP1Q1, m_relativeP1P2, m_relativeQ1Q2)), m_P1P2_P1Q1(Math::analyticDotProduct(m_relativeP1P2, m_relativeP1Q1)), m_Q1Q2_P1Q1(Math::analyticDotProduct(m_relativeQ1Q2, m_relativeP1Q1)), m_P1P2_Q1Q2(Math::analyticDotProduct(m_relativeP1P2, m_relativeQ1Q2)), m_P1P2_sq(Math::analyticMagnitudeSquared(m_relativeP1P2)), m_Q1Q2_sq(Math::analyticMagnitudeSquared(m_relativeQ1Q2)), m_P1P2xQ1Q2_x(Math::analyticCrossProductXAxis(m_relativeP1P2, m_relativeQ1Q2)), m_P1P2xQ1Q2_y(Math::analyticCrossProductYAxis(m_relativeP1P2, m_relativeQ1Q2)), m_P1P2xQ1Q2_z(Math::analyticCrossProductZAxis(m_relativeP1P2, m_relativeQ1Q2)), m_thicknessP(thicknessP), m_thicknessQ(thicknessQ), m_timePrecisionEpsilon(timePrecisionEpsilon), m_distanceEpsilon(distanceEpsilon), m_volumeEpsilonTimes6(0), m_muNuEpsilon(0) { } // Accessors const Math::LinearMotionND& SegmentSegmentCcdIntervalCheck::motionP1() const { return m_motionP1; } const Math::LinearMotionND& SegmentSegmentCcdIntervalCheck::motionP2() const { return m_motionP2; } const Math::LinearMotionND& SegmentSegmentCcdIntervalCheck::motionQ1() const { return m_motionQ1; } const Math::LinearMotionND& SegmentSegmentCcdIntervalCheck::motionQ2() const { return m_motionQ2; } Math::Vector3d SegmentSegmentCcdIntervalCheck::p1T0() const { return m_motionP1.getStart(); } Math::Vector3d SegmentSegmentCcdIntervalCheck::p1T1() const { return m_motionP1.getEnd(); } Math::Vector3d SegmentSegmentCcdIntervalCheck::p2T0() const { return m_motionP2.getStart(); } Math::Vector3d SegmentSegmentCcdIntervalCheck::p2T1() const { return m_motionP2.getEnd(); } Math::Vector3d SegmentSegmentCcdIntervalCheck::q1T0() const { return m_motionQ1.getStart(); } Math::Vector3d SegmentSegmentCcdIntervalCheck::q1T1() const { return m_motionQ1.getEnd(); } Math::Vector3d SegmentSegmentCcdIntervalCheck::q2T0() const { return m_motionQ2.getStart(); } Math::Vector3d SegmentSegmentCcdIntervalCheck::q2T1() const { return m_motionQ2.getEnd(); } const Math::PolynomialValues& SegmentSegmentCcdIntervalCheck::P1Q1_P1P2_Q1Q2() const { return m_P1Q1_P1P2_Q1Q2; } const Math::PolynomialValues& SegmentSegmentCcdIntervalCheck::P1P2_P1Q1() const { return m_P1P2_P1Q1; } const Math::PolynomialValues& SegmentSegmentCcdIntervalCheck::Q1Q2_P1Q1() const { return m_Q1Q2_P1Q1; } const Math::PolynomialValues& SegmentSegmentCcdIntervalCheck::P1P2_Q1Q2() const { return m_P1P2_Q1Q2; } const Math::PolynomialValues& SegmentSegmentCcdIntervalCheck::P1P2_sq() const { return m_P1P2_sq; } const Math::PolynomialValues& SegmentSegmentCcdIntervalCheck::Q1Q2_sq() const { return m_Q1Q2_sq; } Math::Interval SegmentSegmentCcdIntervalCheck::crossValueOnInterval( const Math::Interval& range) const { return ( m_P1P2xQ1Q2_x.valuesOverInterval(range).square() + m_P1P2xQ1Q2_y.valuesOverInterval(range).square() + m_P1P2xQ1Q2_z.valuesOverInterval(range).square() ); } double SegmentSegmentCcdIntervalCheck::thicknessP() const { return m_thicknessP; } double SegmentSegmentCcdIntervalCheck::thicknessQ() const { return m_thicknessQ; } void SegmentSegmentCcdIntervalCheck::setTimePrecisionEpsilon(double epsilon) { m_timePrecisionEpsilon = epsilon; } void SegmentSegmentCcdIntervalCheck::setDistanceEpsilon(double epsilon) { m_distanceEpsilon = epsilon; } void SegmentSegmentCcdIntervalCheck::setTripleProductEpsilon(double epsilon) { m_volumeEpsilonTimes6 = epsilon; } void SegmentSegmentCcdIntervalCheck::setMuNuEpsilon(double epsilon) { m_muNuEpsilon = epsilon; } double SegmentSegmentCcdIntervalCheck::timePrecisionEpsilon() const { return m_timePrecisionEpsilon; } double SegmentSegmentCcdIntervalCheck::distanceEpsilon() const { return m_distanceEpsilon; } double SegmentSegmentCcdIntervalCheck::tripleProductEpsilon() const { return m_volumeEpsilonTimes6; } double SegmentSegmentCcdIntervalCheck::muNuEpsilon() const { return m_muNuEpsilon; } SegmentSegmentCcdIntervalCheck::IntervalCheckResults SegmentSegmentCcdIntervalCheck::possibleCollisionTestNoThickness( const Math::Interval& range) const { Math::Interval P1Q1_P1P2_Q1Q2_values = P1Q1_P1P2_Q1Q2().valuesOverInterval(range); Math::Interval P1P2_P1Q1_values = P1P2_P1Q1().valuesOverInterval(range); Math::Interval Q1Q2_P1Q1_values = Q1Q2_P1Q1().valuesOverInterval(range); Math::Interval P1P2_Q1Q2_values = P1P2_Q1Q2().valuesOverInterval(range); Math::Interval P1P2_sq_values = P1P2_sq().valuesOverInterval(range); Math::Interval Q1Q2_sq_values = Q1Q2_sq().valuesOverInterval(range); Math::Interval crossProductSquared_values = crossValueOnInterval(range); P1Q1_P1P2_Q1Q2_values.addThickness(m_volumeEpsilonTimes6); bool lineDistanceIsZero = P1Q1_P1P2_Q1Q2_values.containsZero(); if (!lineDistanceIsZero) { return IntervalCheckNoCollisionVolume; } // The following eqns and their derivation are written up in // the document Segment-segmentCCDlocationcheck.pdf in the Assembla OSS Files page. See link: // https://www.assembla.com/spaces/OpenSurgSim/documents/dce2Euy6Cr5znOdmr6CpXy/download/dce2Euy6Cr5znOdmr6CpXy // 0 = \mu (P1P2 x Q1Q2)^2 - (P1P2 * P1Q1) Q1Q2^2 + (Q1Q2 * P1Q1) (P1P2 * Q1Q2) // 0 = \nu (P1P2 x Q1Q2)^2 - (Q1Q2 * P1Q1) P1P2^2 + (P1P2 * P1Q1) (P1P2 * Q1Q2) // Calculate the values of the \mu and \nu terms in the equations above; note that valid \mu and \nu are in [0,1]. // We make use of the fact that I*0 = [0,0] and I*1 = I, so I*[0,1] can be found by simply extending I to include 0. Math::Interval muNuTerm_values = crossProductSquared_values; muNuTerm_values.extendToInclude(0); // Add an epsilon to the result, to handle possible numerical noise. muNuTerm_values.addThickness(m_muNuEpsilon); Math::Interval muExpression = muNuTerm_values - P1P2_P1Q1_values * Q1Q2_sq_values + Q1Q2_P1Q1_values * P1P2_Q1Q2_values; Math::Interval nuExpression = muNuTerm_values + Q1Q2_P1Q1_values * P1P2_sq_values - P1P2_P1Q1_values * P1P2_Q1Q2_values; bool segmentLocationsMakeCollisionPossible = muExpression.containsZero() && nuExpression.containsZero(); if (!segmentLocationsMakeCollisionPossible) { return IntervalCheckNoCollisionEndpoints; } return IntervalCheckPossibleCollision; } SegmentSegmentCcdIntervalCheck::IntervalCheckResults SegmentSegmentCcdIntervalCheck::possibleCollisionTestWithThickness( const Math::Interval& range) const { Math::Interval P1Q1_P1P2_Q1Q2_values = P1Q1_P1P2_Q1Q2().valuesOverInterval(range); Math::Interval P1P2_P1Q1_values = P1P2_P1Q1().valuesOverInterval(range); Math::Interval Q1Q2_P1Q1_values = Q1Q2_P1Q1().valuesOverInterval(range); Math::Interval P1P2_Q1Q2_values = P1P2_Q1Q2().valuesOverInterval(range); Math::Interval P1P2_sq_values = P1P2_sq().valuesOverInterval(range); Math::Interval Q1Q2_sq_values = Q1Q2_sq().valuesOverInterval(range); Math::Interval P1P2xQ1Q2_sq_values = crossValueOnInterval(range); // Now we need to account for thickness. // The following eqns and their derivation are written up in // the document Line-lineCCDwiththickness.pdf in the Assembla OSS Files page. See link: // https://www.assembla.com/spaces/OpenSurgSim/documents/c_CS4My6Cr5APjacwqjQXA/download/c_CS4My6Cr5APjacwqjQXA double maxLengthP = std::sqrt(P1P2_sq_values.getMax()); double maxLengthQ = std::sqrt(Q1Q2_sq_values.getMax()); // Figure out some upper bounds on the value of | P1P2 x Q1Q2 |. // TO DO: figure out if both of the bounds are effective, i.e. if it makes sense to keep them both. // (My guess would be that the first is more effective for perpendicular segments, second for near-parallel.) double crossProductUpperBound1 = maxLengthP * maxLengthQ; // ignores the sine of the angle double crossProductUpperBound2 = std::sqrt(P1P2xQ1Q2_sq_values.getMax()); // NOT necessarily tight double crossProductUpperBound = std::min(crossProductUpperBound1, crossProductUpperBound2); // pick the LOWEST of the upper bounds... // Compute the upper bound on the volume that the tetrahedron P1P2Q1Q2 would have if the segments were // just coming into contact. (What we actually calculate is the bound on the triple product, which is // six times the tetrahedron volume.) double touchingVolumeUpperBound = crossProductUpperBound * (thicknessP() + thicknessQ()); // Just to be clear here: The triple product P1Q1_P1P2_Q1Q2_values is the 6*volume of the // tetrahedron defined by [p1, p2, q1, q2] over the interval. The value touchingVolumeUpperBound // is an upper bound of 6*volume for the tetrahedron if the the two segments just reach contact. // If the interval contains 0, then somewhere in the interval, the two volumes meet and we have // contact at that point. P1Q1_P1P2_Q1Q2_values.addThickness(touchingVolumeUpperBound); bool lineDistanceIsSmallEnough = P1Q1_P1P2_Q1Q2_values.containsZero(); if (!lineDistanceIsSmallEnough) { return IntervalCheckNoCollisionVolume; } // If we detected that a collision is possible based on segment orientation, then we will make one more // check to verify that the actual points of closest approach live on the segments. double minLengthP = std::sqrt(P1P2_sq_values.getMin()); double minLengthQ = std::sqrt(Q1Q2_sq_values.getMin()); Math::Interval weightCoefficient = P1P2xQ1Q2_sq_values; // So, if we consider the endpoints, then the lambda and \mu overshoots extend the physical dimension // to include the end caps of the capsules. The division of the radii by minLengthX scales the implicit // overshoot proportionately to the length of the vector. E.g. so if the radii of the segments combine // to be 10% of the length of segment P, then the lambda interval will be extended by 10% = 0.1 at // the beginning and end, i.e. [-0.1, 1.1] double lambdaOvershoot = (thicknessP() + thicknessQ()) / minLengthP; Math::Interval lambdaInterval = Math::Interval(-lambdaOvershoot, 1. + lambdaOvershoot); Math::Interval lambdaExpression = lambdaInterval * weightCoefficient - P1P2_P1Q1_values * Q1Q2_sq_values + Q1Q2_P1Q1_values * P1P2_Q1Q2_values; double muOvershoot = (thicknessP() + thicknessQ()) / minLengthQ; Math::Interval muInterval = Math::Interval(-muOvershoot, 1. + muOvershoot); Math::Interval muExpression = muInterval * weightCoefficient + Q1Q2_P1Q1_values * P1P2_sq_values - P1P2_P1Q1_values * P1P2_Q1Q2_values; bool segmentLocationsMakeCollisionPossible = lambdaExpression.containsZero() && muExpression.containsZero(); if (!segmentLocationsMakeCollisionPossible) { return IntervalCheckNoCollisionEndpoints; } return IntervalCheckPossibleCollision; } }; // namespace Collision }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Collision/SegmentSegmentCcdIntervalCheck.h000066400000000000000000000227751277777236100256300ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_COLLISION_SEGMENTSEGMENTCCDINTERVALCHECK_H #define SURGSIM_COLLISION_SEGMENTSEGMENTCCDINTERVALCHECK_H #include "SurgSim/Math/LinearMotionArithmetic.h" #include "SurgSim/Math/PolynomialValues.h" namespace SurgSim { namespace Collision { /// /// SegmentSegmentCcdIntervalCheck uses the Interval classes including the LinearMotion /// and Polynomial families to quickly determine if there is a possible collision between /// two moving segments over a specified time interval. The time interval /// under consideration is defined as a subset of the parametric time interval [0, 1]. /// /// Details of the actual time of collision and the implementation of the recursion /// strategy are at a higher level. /// /// \sa Interval, IntervalND, LinearMotion, and Polynomial /// class SegmentSegmentCcdIntervalCheck { public: /// Enum /// Possible interval check return values. IntervalCheckPossibleCollision indicates /// the given interval may have a collision between the segments, while /// IntervalCheckNoCollisionVolume indicates no collision based on a gross volume /// calculation and IntervalCheckNoCollisionEndpoints indicates that the endpoint /// check indicates that the segments do not overlap at closest approach. enum IntervalCheckResults { IntervalCheckPossibleCollision, IntervalCheckNoCollisionVolume, IntervalCheckNoCollisionEndpoints }; /// Constructor /// \param pT0 Starting and ending vertices for segment p at time 0 /// \param pT1 Starting and ending vertices for segment p at time 1 /// \param qT0 Starting and ending vertices for segment q at time 0 /// \param qT1 Starting and ending vertices for segment q at time 1 /// \param thicknessP Radius of segment P /// \param thicknessQ Radius of segment Q /// \param timePrecisionEpsilon Desired time accuracy /// \param distanceEpsilon Desired distance accuracy SegmentSegmentCcdIntervalCheck(const std::array& pT0, const std::array& pT1, const std::array& qT0, const std::array& qT1, double thicknessP, double thicknessQ, double timePrecisionEpsilon, double distanceEpsilon); /// @{ /// Motion accessors /// \return the motion vector (value(t1) - value(t0)) for the segment endpoints p1, p2, q1, and q2, respectively. const Math::LinearMotionND& motionP1() const; const Math::LinearMotionND& motionP2() const; const Math::LinearMotionND& motionQ1() const; const Math::LinearMotionND& motionQ2() const; /// @} /// @{ /// Endpoint accessors /// \return the motion vector [value(t0), value(t0)] for the segment endpoints p1, p2, q1, and q2, respectively. Math::Vector3d p1T0() const; Math::Vector3d p1T1() const; Math::Vector3d p2T0() const; Math::Vector3d p2T1() const; Math::Vector3d q1T0() const; Math::Vector3d q1T1() const; Math::Vector3d q2T0() const; Math::Vector3d q2T1() const; /// @} /// Triple product value /// \return the triple product of (Q1(t) - P1(t)) X (P2(t) - P1(t)) X (Q2(t) - Q1(t)) as a 3rd degree polynomial /// where P1, P2,Q1 and Q2 are time dependent positions for the segment endpoints. /// \note the triple product is equivalent to 6 x the volume of tetrahedron P1P2Q1Q2. The polynomial /// captures the variation in volume over the time interval. const Math::PolynomialValues& P1Q1_P1P2_Q1Q2() const; /// @{ /// Dot product accessors for time dependent vertex positions P1(t), P2(t), Q1(t) and Q2(t) /// \return the dot product of the difference operators for the named endpoints const Math::PolynomialValues& P1P2_P1Q1() const; const Math::PolynomialValues& Q1Q2_P1Q1() const; const Math::PolynomialValues& P1P2_Q1Q2() const; /// @} /// @{ /// Magnitude squared product accessors /// \return the squared magnitude of the difference operators for time dependent /// vertex positions P1(t), P2(t), Q1(t) and Q2(t). const Math::PolynomialValues& P1P2_sq() const; const Math::PolynomialValues& Q1Q2_sq() const; /// @} /// \param range the interval over which the cross product values are to be bounded. /// \return the minimum and maximum of (P2 - P1) X (Q2 - Q1) restricted to the interval range. Math::Interval crossValueOnInterval(const Math::Interval& range) const; /// @{ /// Thickness accessors /// \return the thickness parameters for P and Q, respectively. double thicknessP() const; double thicknessQ() const; /// @} /// @{ /// Algorithm epsilons. Set the epsilon values for the various member variables. /// \param epsilon the algorithm epsilon parameters for "close enough" decisions. void setTimePrecisionEpsilon(double epsilon); void setDistanceEpsilon(double epsilon); void setTripleProductEpsilon(double epsilon); void setMuNuEpsilon(double epsilon); /// @} /// @{ /// Algorithm epsilons /// \return the algorithm epsilon parameters for "close enough" decisions. double timePrecisionEpsilon() const; double distanceEpsilon() const; double tripleProductEpsilon() const; double muNuEpsilon() const; /// @} /// Check if a collision is possible within a specified time interval assuming ideal (0 thickness) segments /// \param range the parametric [0, 1] time interval over which the collision is to be detected. /// \return IntervalCheckPossibleCollision, IntervalCheckNoCollisionVolume, or IntervalCheckNoCollisionEndpoints /// indicating if a collision is possible (returns IntervalCheckPossibleCollision); if tetrahedron /// (P1, P2, Q1, Q2) has too great a volume for a collision (returns IntervalCheckNoCollisionVolume); /// or if the possibly valid collision is not contained /// within segments (P1, P2) and (Q1, Q2) (returns IntervalCheckNoCollisionEndpoints). IntervalCheckResults possibleCollisionTestNoThickness(const Math::Interval& range) const; /// Check if a collision is possible within a specified time interval assuming segments with fixed radius /// \param range the parametric [0, 1] time interval over which the collision is to be detected. /// \return IntervalCheckPossibleCollision, IntervalCheckNoCollisionVolume, or IntervalCheckNoCollisionEndpoints /// indicating if a collision is possible (returns IntervalCheckPossibleCollision); if tetrahedron /// (P1, P2, Q1, Q2) has too great a volume for a collision (returns IntervalCheckNoCollisionVolume); /// or if the possibly valid collision is not contained /// within segments (P1, P2) and (Q1, Q2) (returns IntervalCheckNoCollisionEndpoints). IntervalCheckResults possibleCollisionTestWithThickness(const Math::Interval& range) const; private: /// @{ /// Private constructor and assignment operators to prevent copying. SegmentSegmentCcdIntervalCheck(const SegmentSegmentCcdIntervalCheck&); SegmentSegmentCcdIntervalCheck& operator=(const SegmentSegmentCcdIntervalCheck&); /// @} /// @{ /// Linear motion intervals for each of the segment endpoints from t(0) to t(1). Math::LinearMotionND m_motionP1; Math::LinearMotionND m_motionP2; Math::LinearMotionND m_motionQ1; Math::LinearMotionND m_motionQ2; /// @} /// @{ /// Linear motion intervals for relative endpoint differences (i.e. P1Q1 indicates that the /// interval encodes Q1 - P1). Math::LinearMotionND m_relativeP1Q1; Math::LinearMotionND m_relativeQ1Q2; Math::LinearMotionND m_relativeP1P2; /// @} /// The triple product of (Q1(t) - P1(t)) X (P2(t) - P1(t)) X (Q2(t) - Q1(t)) as a 3rd degree polynomial /// where P1, P2,Q1 and Q2 are time dependent positions for the segment endpoints. /// \note the triple product is equivalent to 6 x the volume of tetrahedron P1P2Q1Q2. Math::PolynomialValues m_P1Q1_P1P2_Q1Q2; /// @{ /// Dot product accessors /// The dot product for time dependent vertex positions P1(t), P2(t), Q1(t) and Q2(t) Math::PolynomialValues m_P1P2_P1Q1; Math::PolynomialValues m_Q1Q2_P1Q1; Math::PolynomialValues m_P1P2_Q1Q2; /// @} /// @{ /// The squared magnitude of the difference operators for time dependent /// vertex positions P1(t), P2(t), Q1(t) and Q2(t). Math::PolynomialValues m_P1P2_sq; Math::PolynomialValues m_Q1Q2_sq; /// @} /// @{ /// The x, y and z components of (P2 - P1) X (Q2 - Q1). Math::PolynomialValues m_P1P2xQ1Q2_x; Math::PolynomialValues m_P1P2xQ1Q2_y; Math::PolynomialValues m_P1P2xQ1Q2_z; /// @} /// @{ /// The thickness parameters for P and Q, respectively. double m_thicknessP; double m_thicknessQ; /// @} /// @{ /// The algorithm epsilon parameters for "close enough" decisions. double m_timePrecisionEpsilon; double m_distanceEpsilon; double m_volumeEpsilonTimes6; double m_muNuEpsilon; /// @} }; }; // namespace Collision }; // namespace SurgSim #endif // SURGSIM_COLLISION_SEGMENTSEGMENTCCDINTERVALCHECK_Hopensurgsim-0.7.0/SurgSim/Collision/SegmentSegmentCcdMovingContact.cpp000066400000000000000000000450641277777236100262100ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Collision/SegmentSegmentCcdMovingContact.h" #include #include "SurgSim/Collision/SegmentSegmentCcdIntervalCheck.h" #include "SurgSim/Collision/SegmentSegmentCcdStaticContact.h" #include "SurgSim/Framework/LogMacros.h" #include "SurgSim/Math/Geometry.h" #include "SurgSim/Math/Vector.h" using SurgSim::Math::Vector3d; namespace SurgSim { namespace Collision { SegmentSegmentCcdMovingContact::SegmentSegmentCcdMovingContact() : m_distanceEpsilon(1.0e-09), m_logger(Framework::Logger::getLogger("CCDMovingContactLog")) { } bool SegmentSegmentCcdMovingContact::collideMovingSegmentSegment( const std::array& pt0Positions, const std::array& pt1Positions, const std::array& qt0Positions, const std::array& qt1Positions, double thicknessEpsilon, double timePrecisionEpsilon, double* t, double* r, double* s, Math::Vector3d* pToQDir) { return collideMovingSegmentSegment(pt0Positions, pt1Positions, qt0Positions, qt1Positions, thicknessEpsilon / 2.0, thicknessEpsilon / 2.0, timePrecisionEpsilon, t, r, s, pToQDir); } bool SegmentSegmentCcdMovingContact::collideMovingSegmentSegment( const std::array& pt0Positions, const std::array& pt1Positions, const std::array& qt0Positions, const std::array& qt1Positions, double thicknessP, double thicknessQ, double timePrecisionEpsilon, double* t, double* r, double* s, Math::Vector3d* pToQDir) { bool ans = collideSegmentSegmentBaseCase( pt0Positions, pt1Positions, qt0Positions, qt1Positions, thicknessP, thicknessQ, timePrecisionEpsilon, t, r, s); if (ans) { // Calculate the contact points at t. Math::Vector3d contactPointP = Math::interpolate( Math::interpolate(pt0Positions[0], pt0Positions[1], *r), Math::interpolate(pt1Positions[0], pt1Positions[1], *r), *t); Math::Vector3d contactPointQ = Math::interpolate( Math::interpolate(qt0Positions[0], qt0Positions[1], *s), Math::interpolate(qt1Positions[0], qt1Positions[1], *s), *t); *pToQDir = contactPointQ - contactPointP; } return ans; } bool SegmentSegmentCcdMovingContact::collideSegmentSegmentBaseCase( const std::array& pT0, const std::array& pT1, const std::array& qT0, const std::array& qT1, double thicknessP, double thicknessQ, double timePrecisionEpsilon, double* t, double* r, double* s) { bool collisionFound = false; const double parallelEpsilon = 1e-9; const double degenerateEpsilon = 1e-10; const double coplanarEpsilon = 1e-18; const double parallelEpsilon2 = parallelEpsilon * parallelEpsilon; Math::Vector3d p0t0p1t0 = pT0[1] - pT0[0]; Math::Vector3d q0t0q1t0 = qT0[1] - qT0[0]; Math::Vector3d p0t1p1t1 = pT1[1] - pT1[0]; Math::Vector3d q0t1q1t1 = qT1[1] - qT1[0]; //################################################################# // 1st) Case of parallel segment through time step (at t=0 and t=1) // // Check if the cross product is near zero at both t0 and t1. Math::Vector3d p0t0p1t0_vec_q0t0q1t0 = p0t0p1t0.cross(q0t0q1t0); Math::Vector3d p0t1p1t1_vec_q0t1q1t1 = p0t1p1t1.cross(q0t1q1t1); double p0t0p1t0_vec_q0t0q1t0_SQ = p0t0p1t0_vec_q0t0q1t0.squaredNorm(); double p0t1p1t1_vec_q0t1q1t1_SQ = p0t1p1t1_vec_q0t1q1t1.squaredNorm(); if (p0t0p1t0_vec_q0t0q1t0_SQ < parallelEpsilon2 && p0t1p1t1_vec_q0t1q1t1_SQ < parallelEpsilon2) { SURGSIM_LOG_WARNING(m_logger) << "Segments are parallel at start and end of time step. " << "Handling with parallel method rather than general method."; // Either it collides at t=0 or we do a dichotomy to find intersection in [0..1] if (m_staticTest.collideStaticSegmentSegment(pT0, qT0, thicknessP, thicknessQ, r, s)) { *t = 0.0; collisionFound = true; } else { collisionFound = collideSegmentSegmentParallelCase( pT0, // Segment 1 at t=0 pT1, // Segment 1 at t=1 qT0, // Segment 2 at t=0 qT1, // Segment 2 at t=1 0.0, 1.0, thicknessP, thicknessQ, timePrecisionEpsilon, t, r, s); } } else { //################################################################# // 2nd) Case of coplanar segment through time step (at t=0 and t=1) // Calculate the normal of p X q for at least one of the end points of // q. Do this at both t=0 and t=1. Math::Vector3d pt0Xqt0 = Math::robustCrossProduct(pT0, qT0, degenerateEpsilon); Math::Vector3d pt1Xqt1 = Math::robustCrossProduct(pT1, qT1, degenerateEpsilon); // TODO(wturner): Currently set to (10^-9), but has been as high as (10^-7) in previous versions. // verify that this value works as intended. If not, we will need to add and set another // member variable for the additional threshold. normalizeSegmentsConsistently(&q0t0q1t0, &q0t1q1t1, m_distanceEpsilon); // Do the segments remain coplanar all the time ? if (std::fabs(pt0Xqt0.dot(q0t0q1t0)) < coplanarEpsilon && std::fabs(pt1Xqt1.dot(q0t1q1t1)) < coplanarEpsilon) { SURGSIM_LOG_WARNING(m_logger) << "Segments are coplanar at start and end of " << "the time step. Handling with coplanar method."; if (m_staticTest.collideStaticSegmentSegment(pT0, qT0, thicknessP, thicknessQ, r, s)) { *t = 0.0; collisionFound = true; } else { // At this point, {r,s} are computed for t=0 ! collisionFound = collideSegmentSegmentCoplanarCase( pT0, // Segment 1 at t=0 pT1, // Segment 1 at t=1 qT0, // Segment 2 at t=0 qT1, // Segment 2 at t=1 0.0, 1.0, // Interval boundaries timePrecisionEpsilon, thicknessP, thicknessQ, t, r, s); } } else { //################################################################# // 3rd) General case SegmentSegmentCcdIntervalCheck state(pT0, pT1, qT0, qT1, thicknessP, thicknessQ, timePrecisionEpsilon, -1); collisionFound = collideSegmentSegmentGeneralCase( state, 0.0, 1.0, // Look inside the interval t [0..1] t, r, s); } } return collisionFound; } bool SegmentSegmentCcdMovingContact::collideSegmentSegmentParallelCase( const std::array& pT0, const std::array& pT1, const std::array& qT0, const std::array& qT1, double a, double b, double thicknessP, double thicknessQ, double timePrecisionEpsilon, double* t, double* r, double* s, int depth /*= 0*/) { // Geometry at time t=b Math::Vector3d p0Tb = Math::interpolate(pT0[0], pT1[0], b); // p[0] interpolated at time b Math::Vector3d p1Tb = Math::interpolate(pT0[1], pT1[1], b); // p[1] interpolated at time b Math::Vector3d q0Tb = Math::interpolate(qT0[0], qT1[0], b); // q[0] interpolated at time b Math::Vector3d q1Tb = Math::interpolate(qT0[1], qT1[1], b); // q[1] interpolated at time b std::array pb = {p0Tb, p1Tb}; std::array qb = {q0Tb, q1Tb}; if (b - a < timePrecisionEpsilon) { // We know that no collision happened at t=a, that is why we recursed to this level, but // we believe that there is a collision in the interval. If our time precision is good enough, // the segments should be colliding at t=b. Otherwise, we are either moving too fast to detect // this collision, or something went wrong. Report true and make a best guess at the middle of // the current interval. if (m_staticTest.collideStaticSegmentSegment(pb, qb, thicknessP, thicknessQ, r, s)) { *t = b; } else { *t = ((b + a) / 2.0); } return true; } // Geometry at time t=a Math::Vector3d p0Ta = Math::interpolate(pT0[0], pT1[0], a); // p[0] interpolated at time a Math::Vector3d q0Ta = Math::interpolate(qT0[0], qT1[0], a); // q[0] interpolated at time a Math::Vector3d q1Ta = Math::interpolate(qT0[1], qT1[1], a); // q[1] interpolated at time a // Compute intermediate geometry..and work on subdivisions based on 1/nbSubPoint (instead of 1/2) // // During this next phase, we potentially take two passes through the system. In the first pass, we // do a quick check to see if we can find a collision at the end of any subdivision using our static // segment code. If we do, we can immediately recurse only on that subdivision to further refine // our time estimate. // // Otherwise, failing to find an easy detection, there is the possibility that we are moving // towards an intersection at the start of an interval and away at the end. Any possible // contact would be within the bracketed time frame, so if we detect it, we also recurse on the // candidate interval. // double t_i[SUB_POINTS_PARALLEL_CASE + 1]; Math::Vector3d p0p0Proj[SUB_POINTS_PARALLEL_CASE + 1]; Math::Vector3d p0Proj = Math::nearestPointOnLine(p0Ta, q0Ta, q1Ta); p0p0Proj[0] = p0Proj - p0Ta; t_i[0] = a; double deltaT = 1.0 / SUB_POINTS_PARALLEL_CASE; for (int i = 1 ; i <= SUB_POINTS_PARALLEL_CASE ; i++) { t_i[i] = a + (b - a) * (i * deltaT); double r_i; double s_i; // p and q at time i std::array p_i = {Math::interpolate(pT0[0], pT1[0], t_i[i]), Math::interpolate(pT0[1], pT1[1], t_i[i]) }; std::array q_i = {Math::interpolate(qT0[0], qT1[0], t_i[i]), Math::interpolate(qT0[1], qT1[1], t_i[i]) }; if (m_staticTest.collideStaticSegmentSegment(p_i, q_i, thicknessP, thicknessQ, &r_i, &s_i)) { // Collision happens between [t[i-1]..t[i]] return collideSegmentSegmentParallelCase( pT0, pT1, qT0, qT1, t_i[i - 1], t_i[i], thicknessP, thicknessQ, timePrecisionEpsilon, t, r, s, depth + 1); } p0Proj = Math::nearestPointOnLine(p_i[0], q_i[0], q_i[1]); p0p0Proj[i] = p0Proj - p_i[0]; } // No collision found at the discretization // Let analyze the variation of p1q1...if it switches direction, we more // likely passed a parallel intersection case in between ! for (int i = 0; i < SUB_POINTS_PARALLEL_CASE; i++) { if (p0p0Proj[i].dot(p0p0Proj[i + 1]) < 0.0) { bool found = collideSegmentSegmentParallelCase( pT0, pT1, qT0, qT1, t_i[i], t_i[i + 1], thicknessP, thicknessQ, timePrecisionEpsilon, t, r, s, depth + 1); if (found) { return true; } } } return false; } bool SegmentSegmentCcdMovingContact::collideSegmentSegmentCoplanarCase( const std::array& pT0, /* Segment 1 at t=0 */ const std::array& pT1, /* Segment 1 at t=1 */ const std::array& qT0, /* Segment 2 at t=0 */ const std::array& qT1, /* Segment 2 at t=1 */ double a, double b, /* Interval boundaries */ double timePrecisionEpsilon, double thickness_p, double thickness_q, double* t, double* r, double* s, int depth /*= 0*/) { // Geometry at time t=b Math::Vector3d p0Tb = Math::interpolate(pT0[0], pT1[0], b); // p[0] interpolated at time b Math::Vector3d p1Tb = Math::interpolate(pT0[1], pT1[1], b); // p[1] interpolated at time b Math::Vector3d q0Tb = Math::interpolate(qT0[0], qT1[0], b); // q[0] interpolated at time b Math::Vector3d q1Tb = Math::interpolate(qT0[1], qT1[1], b); // q[1] interpolated at time b if (b - a < timePrecisionEpsilon) { std::array pTb = {p0Tb, p1Tb}; std::array qTb = {q0Tb, q1Tb}; // We do know that no collision happen at t=a. // We do know that a collision happen in between, but not sure exactly when... // and more likely the 2 segments are colliding at t=b if (m_staticTest.collideStaticSegmentSegment(pTb, qTb, thickness_p, thickness_q, r, s)) { *t = b; } else { *t = ((b + a) / 2.0); } return true; } // Geometry at time t=a Math::Vector3d p0Ta = Math::interpolate(pT0[0], pT1[0], a); // p[0] interpolated at time a Math::Vector3d p1Ta = Math::interpolate(pT0[1], pT1[1], a); // p[1] interpolated at time a Math::Vector3d q0Ta = Math::interpolate(qT0[0], qT1[0], a); // q[0] interpolated at time a Math::Vector3d q1Ta = Math::interpolate(qT0[1], qT1[1], a); // q[1] interpolated at time a // Compute intermediate geometry..and work on dichotomy based on 1/nbSubPoint (instead of 1/2) double t_i[SUB_POINTS_COPLANAR_CASE + 1]; Math::Vector3d normal[SUB_POINTS_COPLANAR_CASE + 1]; double deltaT = 1.0 / SUB_POINTS_COPLANAR_CASE; double r_i[SUB_POINTS_COPLANAR_CASE + 1], s_i[SUB_POINTS_COPLANAR_CASE + 1]; t_i[0] = a; r_i[0] = *r; s_i[0] = *s; normal[0] = (p1Ta - p0Ta).cross(q1Ta - q0Ta).normalized(); for (int i = 1 ; i <= SUB_POINTS_COPLANAR_CASE ; i++) { t_i[i] = a + (b - a) * (i * deltaT); // p and q at time i std::array p_i = {Math::interpolate(pT0[0], pT1[0], t_i[i]), Math::interpolate(pT0[1], pT1[1], t_i[i]) }; std::array q_i = {Math::interpolate(qT0[0], qT1[0], t_i[i]), Math::interpolate(qT0[1], qT1[1], t_i[i]) }; if (m_staticTest.collideStaticSegmentSegment(p_i, q_i, thickness_p, thickness_q, &r_i[i], &s_i[i])) { *r = r_i[i - 1]; *s = s_i[i - 1]; return collideSegmentSegmentCoplanarCase( pT0, // Segment 1 at t=0 pT1, // Segment 1 at t=1 qT0, // Segment 2 at t=0 qT1, // Segment 2 at t=1 t_i[i - 1], t_i[i], // Interval boundaries timePrecisionEpsilon, thickness_p, thickness_q, t, r, s, depth + 1); } normal[i] = (p_i[1] - p_i[0]).cross(q_i[1] - q_i[0]).normalized(); } // Check for a flip or a change in normal. If one is detected, then a collision might occur within the // current interval. Recurse and check. for (int i = 1; i <= SUB_POINTS_COPLANAR_CASE; i++) { if (checkForCoplanarContactWithinInterval(r_i[i - 1], r_i[i], s_i[i - 1], s_i[i], normal[i - 1], normal[i])) { double old_r = *r; double old_s = *s; *r = r_i[i - 1]; *s = s_i[i - 1]; bool found = collideSegmentSegmentCoplanarCase( pT0, // Segment 1 at t=0 pT1, // Segment 1 at t=1 qT0, // Segment 2 at t=0 qT1, // Segment 2 at t=1 t_i[i - 1], t_i[i], // Interval boundaries timePrecisionEpsilon, thickness_p, thickness_q, t, r, s, depth + 1); if (found) { return true; } *r = old_r; *s = old_s; } } return false; } bool SegmentSegmentCcdMovingContact::collideSegmentSegmentGeneralCase( const SegmentSegmentCcdIntervalCheck& state, double a, double b, // Interval boundaries double* t, double* r, double* s, int depth) { Math::Interval range(a, b); if (state.possibleCollisionTestWithThickness(range) != SegmentSegmentCcdIntervalCheck::IntervalCheckPossibleCollision) { return false; } // Recursion bottoms out at time precision. if (b - a < state.timePrecisionEpsilon()) { std::array pTb = {state.motionP1().atTime(b), state.motionP2().atTime(b)}; std::array qTb = {state.motionQ1().atTime(b), state.motionQ2().atTime(b)}; *t = b; // The recursion has bottomed out, and we should have already detected if we are colliding at t=0. // Make one final check at the other end of the interval and end the recursion. return m_staticTest.collideStaticSegmentSegment(pTb, qTb, state.thicknessP(), state.thicknessQ(), r, s); } // Otherwise, recursion has not yet bottomed out, go down one more level. double midpoint = (a + b) * 0.5; // Test 1st semi-interval [a, (a + b) / 2] if (collideSegmentSegmentGeneralCase( state, a, midpoint, t, r, s, depth + 1)) { return true; } // Test 2nd semi-interval [(a + b) / 2, b] if (collideSegmentSegmentGeneralCase( state, midpoint, b, t, r, s, depth + 1)) { return true; } return false; } void SegmentSegmentCcdMovingContact::normalizeSegmentsConsistently(Math::Vector3d* t0, Math::Vector3d* t1, double epsilon) const { // safely normalize t0 and t1. We will need to calculate // dot products against them to test orthogonality with p X q at // the two time points. double norm_t0 = t0->norm(); double norm_t1 = t1->norm(); if (norm_t0 >= epsilon) { *t0 *= 1.0 / norm_t0; if (norm_t1 >= epsilon) { // t0 and t1 both good *t1 *= 1.0 / norm_t1; } else { // t0 good, t1 bad *t1 = *t0; // t1 <- t0 SURGSIM_LOG_WARNING(m_logger) << "Segment is degenerate at time 1. Using time 0 " << "value for both coplanarity tests."; } } else if (norm_t1 >= epsilon) { // t1 good, t0 bad *t1 *= 1.0 / norm_t1; *t0 = *t1; // t0 <- t1 SURGSIM_LOG_WARNING(m_logger) << "Segment is degenerate at time 0. Using time 1 value for " << "both coplanarity tests."; } else { SURGSIM_LOG_WARNING(m_logger) << "Segment is degenerate at time 0 and time 1. Unable to " << "normalize for coplanarity tests."; } } bool SegmentSegmentCcdMovingContact::checkForCoplanarContactWithinInterval( double rCurrent, double rNext, double sCurrent, double sNext, const Math::Vector3d& nCurrent, const Math::Vector3d& nNext) const { // TODO(wturner): Given the original code, this test IS ALWAYS TRUE as r and s are clamped to [0, 1] // and numberSubpoints > 1. I do not think this was operational and that may explain the extraordinarily // small epsilon (1.0e-18) being used a the gatekeeper to this function: // // return (((rCurrent >= 0 && rCurrent < 1) || (rCurrent < 0 && rNext >= 0) || (rCurrent > 1 && rNext <= 1)) && // ((sCurrent >= 0 && sCurrent < 1) || (sCurrent < 0 && sNext >= 0) || (sCurrent > 1 && sNext <= 1)) && // rCurrent * rNext > -(double)numberSubpoints * 0.5 // && sCurrent * sNext > -(double)numberSubpoints * 0.5) || // (nCurrent.dot(nNext) < 0.0); return (((rCurrent > 0.0 && rCurrent < 1.0) || (rCurrent == 0.0 && rNext > 0) || (std::abs(rCurrent - 1.0) < m_distanceEpsilon && rNext < 1.0)) && ((sCurrent > 0.0 && sCurrent < 1.0) || (sCurrent == 0.0 && sNext > 0) || (std::abs(sCurrent - 1.0) < m_distanceEpsilon && sNext < 1.0))) || (nCurrent.dot(nNext) < 0.0); } }; // namespace Collision }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Collision/SegmentSegmentCcdMovingContact.h000066400000000000000000000314711277777236100256520ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_COLLISION_SEGMENTSEGMENTCCDMOVINGCONTACT_H #define SURGSIM_COLLISION_SEGMENTSEGMENTCCDMOVINGCONTACT_H #include #include "SurgSim/Collision/SegmentSegmentCcdIntervalCheck.h" #include "SurgSim/Collision/SegmentSegmentCcdStaticContact.h" #include "SurgSim/Framework/Logger.h" namespace SurgSim { namespace Math { class SegmentMeshShape; }; namespace Collision { class CollisionPair; /// SegmentSegmentCcdMovingContact computes the self collisions among a SegmentMesh under motion at two /// time points parametrized over the time interval [0,1]. An initial phase uses the AABB tree to /// select a set of potentially colliding segments from the SegmentMesh. For each of these /// candidate segment pairs, the goal is to determine the point of earliest contact should any exist. /// /// At the highest level the actual collision detection of candidate segment pairs is a two phase /// algorithm. First determine if there is contact at the start of an interval and report the contact if /// found. If no contact is found at the start, subdivide the interval, determine which of the resulting /// candidate subintervals may have collisions, and then recursively check those promising subintervals. /// Note that a simple algorithm based on interval arithmetic (including the Interval, LinearMotion and /// Polynomial interval classes) allows for a quick determination of promising subintervals allowing many /// of the subintervals to be pruned during the subdivision step without forcing the recursion to bottom out. /// /// \sa Interval, LinearMotion, Polynomial, SegmentSegmentCcdIntervalCheck /// class SegmentSegmentCcdMovingContact { public: static const int SUB_POINTS_PARALLEL_CASE = 5; static const int SUB_POINTS_COPLANAR_CASE = 10; /// Constructor. SegmentSegmentCcdMovingContact(); /// Calculate if, where, and when the segments p and q collide in the interval from t = 0 to t = 1 /// for "zero" thickness segments. /// \param pt0Positions are the segment endpoints for the first segment at time t=0. /// \param pt1Positions are the segment endpoints for the first segment at time t=1. /// \param qt0Positions are the segment endpoints for the second segment at time t=0. /// \param qt1Positions are the segment endpoints for the second segment at time t=1. /// \param thicknessEpsilon spatial nearness criteria for declaring a contact. /// \param timePrecisionEpsilon time nearness criteria for declaring a contact. /// \param t [out] parametric location of the collision along the time axes in the interval [0, 1] /// \param r [out] parametric location of the collision along p in the interval [0, 1] /// \param s [out] parametric location of the collision along q in the interval [0, 1] /// \param pToQDir [out] direction from the contact point on p to the contact point on q /// \return true if p and q collide in interval [0, 1] bool collideMovingSegmentSegment( const std::array& pt0Positions, const std::array& pt1Positions, const std::array& qt0Positions, const std::array& qt1Positions, double thicknessEpsilon, double timePrecisionEpsilon, double* t, double* r, double* s, Math::Vector3d* pToQDir); /// Calculate if, where, and when the segments p and q collide in the interval from t = 0 to t = 1 /// for thick segments. /// \param pt0Positions are the segment endpoints for the first segment at time t=0. /// \param pt1Positions are the segment endpoints for the first segment at time t=1. /// \param qt0Positions are the segment endpoints for the second segment at time t=0. /// \param qt1Positions are the segment endpoints for the second segment at time t=1. /// \param thicknessP radius of segment p. /// \param thicknessQ radius of segment q. /// \param timePrecisionEpsilon time nearness criteria for declaring a contact. /// \param t [out] parametric location of the collision along the time axes in the interval [0, 1] /// \param r [out] parametric location of the collision along p in the interval [0, 1] /// \param s [out] parametric location of the collision along q in the interval [0, 1] /// \param pToQDir [out] direction from the contact point on p to the contact point on q at time t /// \return true if p and q collide in interval [0, 1] bool collideMovingSegmentSegment( const std::array& pt0Positions, const std::array& pt1Positions, const std::array& qt0Positions, const std::array& qt1Positions, double thicknessP, double thicknessQ, double timePrecisionEpsilon, double* t, double* r, double* s, Math::Vector3d* pToQDir); protected: /// Manage the collision of moving segments as a series of cases based on the segment /// relationships over the moving interval. /// \param pT0 are the segment endpoints for the first segment at time t=0. /// \param pT1 are the segment endpoints for the first segment at time t=1. /// \param qT0 are the segment endpoints for the second segment at time t=0. /// \param qT1 are the segment endpoints for the second segment at time t=1. /// \param thicknessP radius of segment p. /// \param thicknessQ radius of segment q. /// \param timePrecisionEpsilon time nearness criteria for declaring a contact. /// \param t [out] parametric location of the collision along the time axes in the interval [0, 1] /// \param r [out] parametric location of the collision along p in the interval [0, 1] /// \param s [out] parametric location of the collision along q in the interval [0, 1] /// \return true if p and q collide in interval [0, 1] bool collideSegmentSegmentBaseCase( const std::array& pT0, const std::array& pT1, const std::array& qT0, const std::array& qT1, double thicknessP, double thicknessQ, double timePrecisionEpsilon, double* t, double* r, double* s); /// Manage the specific case of detecting collisions between segments p and q which are parallel throughout /// the parametric time interval of interest [a, b]. /// \param pT0 are the segment endpoints for the first segment at time t=0. /// \param pT1 are the segment endpoints for the first segment at time t=1. /// \param qT0 are the segment endpoints for the second segment at time t=0. /// \param qT1 are the segment endpoints for the second segment at time t=1. /// \param a parametric starting point of the interval of interest. /// \param b parametric ending point of the interval of interest. /// \param thicknessP radius of segment p. /// \param thicknessQ radius of segment q. /// \param timePrecisionEpsilon time nearness criteria for declaring a contact. /// \param t [out] parametric location of the collision along the time axes in the interval [0, 1] /// \param r [in/out] parametric location of the collision along p in the interval [0, 1] /// \param s [in/out] parametric location of the collision along q in the interval [0, 1] /// \param depth recursion depth. /// \return true if p and q collide in interval [a, b] bool collideSegmentSegmentParallelCase( const std::array& pT0, const std::array& pT1, const std::array& qT0, const std::array& qT1, double a, double b, double thicknessP, double thicknessQ, double timePrecisionEpsilon, double* t, double* r, double* s, int depth = 0); /// Manage the specific case of detecting collisions between segments p and q which are coplanar throughout /// the parametric time interval of interest [a, b]. /// \param pT0 are the segment endpoints for the first segment at time t=0. /// \param pT1 are the segment endpoints for the first segment at time t=1. /// \param qT0 are the segment endpoints for the second segment at time t=0. /// \param qT1 are the segment endpoints for the second segment at time t=1. /// \param a parametric starting point of the interval of interest. /// \param b parametric ending point of the interval of interest. /// \param thicknessP radius of segment p. /// \param thicknessQ radius of segment q. /// \param timePrecisionEpsilon time nearness criteria for declaring a contact. /// \param t [out] parametric location of the collision along the time axes in the interval [0, 1] /// \param r [in/out] parametric location of the collision along p in the interval [0, 1] /// \param s [in/out] parametric location of the collision along q in the interval [0, 1] /// \param depth recursion depth. /// \return true if p and q collide in interval [a, b] bool collideSegmentSegmentCoplanarCase( const std::array& pT0, /* Segment 1 at t=0 */ const std::array& pT1, /* Segment 1 at t=1 */ const std::array& qT0, /* Segment 2 at t=0 */ const std::array& qT1, /* Segment 2 at t=1 */ double a, double b, /* Interval boundaries */ double timePrecisionEpsilon, double thicknessP, double thicknessQ, double* t, double* r, double* s, int depth = 0); /// Manage the general case of detecting collisions between segments p and q over the parametric time /// interval [a, b] when no special spatial relationships can be observed that improve performance. /// \param state an encapsulation of the segment locations, movements, and detection parameters. /// \param a parametric starting point of the interval of interest. /// \param b parametric ending point of the interval of interest. /// \param t [out] parametric location of the collision along the time axes in the interval [0, 1] /// \param r [out] parametric location of the collision along p in the interval [0, 1] /// \param s [out] parametric location of the collision along q in the interval [0, 1] /// \param depth recursion depth. /// \return true if p and q collide in interval [a, b] bool collideSegmentSegmentGeneralCase( const SegmentSegmentCcdIntervalCheck& state, double a, double b, // Interval boundaries double* t, double* r, double* s, int depth = 0); /// Safely normalize segments t0 and t1 consistently with each other. Under the assumption that they /// both represent the same segment at two different time points. Ensure that for cases where the segment /// is too small at one or both time points (i.e. they essentially degenerate to a point) that we make /// an intelligent choice. /// \param t0 segment at time 0 /// \param t1 segment at time 1 /// \param epsilon threshold for valid normalization value. void normalizeSegmentsConsistently(Math::Vector3d* t0, Math::Vector3d* t1, double epsilon) const; private: /// Utility routine to perform a series of checks to determine if a collision is likely within an interval. The /// checks seek to determine if two coplanar segments could have been out of contact at the start of an interval, /// and then moved through a contact and back away. Among the values checked are the normals because a change in /// normal direction of p X q indicates that p is now on the other side of q. Other checks are made for flipping /// segments, etc. /// \param rCurrent is the parametric location on segment p at the start of the current time interval /// \param rNext is the parametric location on segment p at the end of the current time interval /// \param sCurrent is the parametric location on segment q at the start of the current time interval /// \param sNext is the parametric location on segment q at the end of the current time interval /// \param nCurrent is the normal of p x q at the start of the current time interval /// \param nNext is the normal of p x q at the current time point /// \return true if the check indicates a collision may be possible for coplanar segments p and /// q at the current time interval. bool checkForCoplanarContactWithinInterval(double rCurrent, double rNext, double sCurrent, double sNext, const Math::Vector3d& nCurrent, const Math::Vector3d& nNext) const; /// Minimum distance precision epsilon used in continuous collision detection. const double m_distanceEpsilon; /// Utility class for testing interval boundary collisions. Collision::SegmentSegmentCcdStaticContact m_staticTest; /// Logger std::shared_ptr m_logger; }; }; // namespace Collision }; // namespace SurgSim #endif // SURGSIM_COLLISION_SEGMENTSEGMENTCCDMOVINGCONTACT_H opensurgsim-0.7.0/SurgSim/Collision/SegmentSegmentCcdStaticContact.cpp000066400000000000000000000230711277777236100261720ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Collision/SegmentSegmentCcdStaticContact.h" #include "SurgSim/Math/Scalar.h" using SurgSim::Math::Vector3d; namespace SurgSim { namespace Collision { SegmentSegmentCcdStaticContact::SegmentSegmentCcdStaticContact(): m_degenerateEpsilon(1.0e-15) { } bool SegmentSegmentCcdStaticContact::collideStaticSegmentSegment( const std::array& p, const std::array& q, double distanceEpsilon, double* r, double* s) { return collideStaticSegmentSegment(p, q, distanceEpsilon / 2.0, distanceEpsilon / 2.0, r, s); } bool SegmentSegmentCcdStaticContact::collideStaticSegmentSegment( const std::array& p, const std::array& q, double radiusP, double radiusQ, double* r, double* s) { const double totalThickness = radiusP + radiusQ; const double totalThickness2 = totalThickness * totalThickness; // Based on the outline of: // https://www.assembla.com/spaces/OpenSurgSim/documents/cRWomWC2er5ykpacwqjQYw/download/cRWomWC2er5ykpacwqjQYw. // We are minimizing the squared distance R(sp,sq) = (a.sp)^2 + 2b.sp.sq + (c.sq)^2 + 2d.sq + 2e.sp + f // for P(s) = (1-s).P0 + s.P1 and Q(t) = (1-t).Q0 + t.Q1, and as defined in the paper: // a = (P1 - P0)(P1 - P0) // b = -(P1 - P0)(Q1 - Q0) // c = (Q1 - Q0)(Q1 - Q0) // d = (P1 - P0)(P0 - Q0) // e = -(Q1 - Q0)(P0 - Q0) // f = (P0 - Q0)(P0 - Q0) // First determine if either of our segments are really points. If so this is easier. Take advantage. auto p0p1 = p[1] - p[0]; double a = p0p1.dot(p0p1); if (a <= m_degenerateEpsilon) // Degenerate segment P { *r = 0.0; return collideStaticPointSegment(p[0], q, radiusP, radiusQ, s); } auto q0q1 = q[1] - q[0]; double c = q0q1.dot(q0q1); if (c <= m_degenerateEpsilon) // Degenerate segment Q { *s = 0; return collideStaticPointSegment(q[0], p, radiusQ, radiusP, r); } double b = -p0p1.dot(q0q1); auto q0p0 = p[0] - q[0]; double d = p0p1.dot(q0p0); double e = -q0q1.dot(q0p0); double ratio = a * c - b * b; // Characterize the angle between p and q. If it is big enough // then handle it with the generic code. Otherwise, use an // algorithm specific to parallel segments. if (ratio >= m_degenerateEpsilon) { // This section of the code carries out the steps of the cited paper. // 1. Determine the points of closest approach for the infinite lines containing p and q // 2. Determine where these values fall with respect to the segment end points and which edges (if any) // must be clamped to the parametric range [0.0, 1.0] // 3. Calculate the parametrics for the closest approach of the segments using the edge information. double infiniteLineR = b * e - c * d; double infiniteLineS = b * d - a * e; *r = infiniteLineR; *s = infiniteLineS; SegmentCcdEdgeType edge = computeCollisionEdge(a, b, d, infiniteLineR, infiniteLineS, ratio); computeCollisionParametrics(edge, a, b, c, d, e, ratio, r, s); } else // Parallel case { computeParallelSegmentParametrics(a, b, d, r, s); } SURGSIM_ASSERT(*r >= 0.0 && *r <= 1.0) << "Segment collision s should be in [0,1]!"; SURGSIM_ASSERT(*s >= 0.0 && *s <= 1.0) << "Segment collision s should be in [0,1]!"; Vector3d pBar = Math::interpolate(p[0], p[1], *r); Vector3d qBar = Math::interpolate(q[0], q[1], *s); Vector3d pq = qBar - pBar; return pq.squaredNorm() <= totalThickness2; } bool SegmentSegmentCcdStaticContact::collideStaticPointSegment( const Math::Vector3d& point, const std::array& p, double thicknessPoint, double thicknessSegment, double* r) { Math::Vector3d b = p[0]; Math::Vector3d c = p[1]; auto ba = point - b; auto ca = point - c; auto bc = c - b; double baNormSQ = ba.squaredNorm(); double caNormSQ = ca.squaredNorm(); double bcNormSQ = bc.squaredNorm(); double totalThicknessSQ = (thicknessPoint + thicknessSegment) * (thicknessPoint + thicknessSegment); // p is essentially a point if (bcNormSQ < m_degenerateEpsilon) { if (baNormSQ <= totalThicknessSQ) { *r = 0.0; return true; } if (caNormSQ <= totalThicknessSQ) { *r = 1.0; return true; } else { return false; } } // b!=c => compute the projection abscissa *r = bc.dot(ba) / bcNormSQ; // Clamp abscissa *r = Math::clamp(*r, 0.0, 1.0, 0.0); // Compute the closest point of a on [bc] Math::Vector3d closestPtOnBC = Math::interpolate(b, c, *r); return (closestPtOnBC - point).squaredNorm() <= totalThicknessSQ; } SegmentSegmentCcdStaticContact::SegmentCcdEdgeType SegmentSegmentCcdStaticContact::computeCollisionEdge( double a, double b, double d, double r, double s, double ratio) const { // Region mappings from reference: // // r=0 r=1 // ^ // | | // 4 | 3 | 2 // ----|-------|------- s=1 // | | // 5 | 0 | 1 // | | // ----|-------|-------> s=0 // | | // 6 | 7 | 8 // | | // SegmentSegmentCcdStaticContact::SegmentCcdEdgeType edge = SegmentCcdEdgeTypeEdgeInvalid; if (r >= 0) { if (r <= ratio) { if (s >= 0) { if (s <= ratio) { // region = 0; (0 <= r,s <= 1) edge = SegmentCcdEdgeTypeEdgeSkip; } else { // region = 3; (0 <= r <= 1; 1 <= s) edge = SegmentCcdEdgeTypeS1; } } else { // region = 7; (0 <= r <= 1; s <= 0) edge = SegmentCcdEdgeTypeS0; } } else { if (s >= 0) { if (s <= ratio) { // region = 1; (1 <= r; 0 <= s <= 1) edge = SegmentCcdEdgeTypeR1; } else { // region = 2; (1 <= r,s) if (a + b + d > 0) { edge = SegmentCcdEdgeTypeS1; } else { edge = SegmentCcdEdgeTypeR1; } } } else { // region = 8; (1 <= r; s <= 0) if (a + d > 0) { edge = SegmentCcdEdgeTypeS0; } else { edge = SegmentCcdEdgeTypeR1; } } } } else { if (s >= 0) { if (s <= ratio) { // region = 5;(r <= 0; 0 <= s <= 1) edge = SegmentCcdEdgeTypeR0; } else { // region = 4; (r <= 0; 1 <= s) if (b + d > 0) { edge = SegmentCcdEdgeTypeR0; } else { edge = SegmentCcdEdgeTypeS1; } } } else { // region = 6; (r <= 0; s <= 0) if (d > 0) { edge = SegmentCcdEdgeTypeR0; } else { edge = SegmentCcdEdgeTypeS0; } } } return edge; } void SegmentSegmentCcdStaticContact::computeCollisionParametrics(SegmentCcdEdgeType edge, double a, double b, double c, double d, double e, double ratio, double* r, double* s) const { // On entry r and s are parametrically calculated based on infinite lines, i.e., r and s may not lie in [0, 1] // *r = b * e - c * d // *s = b * d - a * e double tmp; switch (edge) { case SegmentCcdEdgeTypeR0: // F(s) = Q(0,s), F?(s) = 2*(e+c*s) // F?(T) = 0 when T = -e/c, then clamp between 0 and 1 (c always >= 0) *r = 0.0; tmp = -e; if (tmp < 0) { *s = 0; } else if (tmp > c) { *s = 1.0; } else { *s = tmp / c; } break; case SegmentCcdEdgeTypeR1: // F(s) = Q(1,s), F?(s) = 2*((b+e)+c*s) // F?(T) = 0 when T = -(b+e)/c, then clamp between 0 and 1 (c always >= 0) *r = 1.0; tmp = -b - e; if (tmp < 0) { *s = 0.0; } else if (tmp > c) { *s = 1.0; } else { *s = tmp / c; } break; case SegmentCcdEdgeTypeS0: // F(r) = Q(r,0), F?(r) = 2*(d+a*r) => // F?(S) = 0 when S = -d/a, then clamp between 0 and 1 (a always >= 0) *s = 0.0; tmp = -d; if (tmp < 0) { *r = 0.0; } else if (tmp > a) { *r = 1.0; } else { *r = tmp / a; } break; case SegmentCcdEdgeTypeS1: // F(r) = Q(r,1), F?(r) = 2*(b+d+a*r) => // F?(S) = 0 when S = -(b+d)/a, then clamp between 0 and 1 (a always >= 0) *s = 1.0; tmp = -b - d; if (tmp < 0.0) { *r = 0.0; } else if (tmp > a) { *r = 1.0; } else { *r = tmp / a; } break; case SegmentCcdEdgeTypeEdgeSkip: tmp = 1.0 / ratio; *r *= tmp; *s *= tmp; break; default: break; } } void SegmentSegmentCcdStaticContact::computeParallelSegmentParametrics(double a, double b, double d, double* r, double* s) const { if (b > 0.0) { // Segments have different directions if (d >= 0.0) { // 0-0 end points since r-segment 0 less than s-segment 0 *r = 0.0; *s = 0.0; } else if (-d <= a) { // s-segment 0 end-point in the middle of the r 0-1 segment, get distance *r = -d / a; *s = 0.0; } else { // r-segment 1 is definitely closer *r = 1.0; double tmp = a + d; if (-tmp >= b) { *s = 1.0; } else { *s = -tmp / b; } } } else { // Both segments have the same dir if (-d >= a) { // 1-0 *r = 1.0; *s = 0.0; } else if (d <= 0.0) { // mid-0 *r = -d / a; *s = 0.0; } else { *r = 0.0; // 1-mid if (d >= -b) { *s = 1.0; } else { *s = -d / b; } } } } }; // namespace Collision }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Collision/SegmentSegmentCcdStaticContact.h000066400000000000000000000162461277777236100256450ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_COLLISION_SEGMENTSEGMENTCCDSTATICCONTACT_H #define SURGSIM_COLLISION_SEGMENTSEGMENTCCDSTATICCONTACT_H #include #include "SurgSim/Math/Vector.h" namespace SurgSim { namespace Collision { /// SegmentSegmentCcdStaticContact computes if there is contact between two segments at a specific point in time /// in support of the CCD calculations for moving intervals. Algorithm optimizations improve performance for /// specific orientations and positions of segments such as parallel segments, or segments where the closest /// approach is at one or both of the segment endpoints. /// /// \sa SegmentSegmentCcdIntervalCheck /// class SegmentSegmentCcdStaticContact { public: enum SegmentCcdEdgeType { SegmentCcdEdgeTypeR0, // Closest approach occurs at parametric value r = 0 SegmentCcdEdgeTypeR1, // Closest approach occurs at parametric value r = 1 SegmentCcdEdgeTypeS0, // Closest approach occurs at parametric value s = 0 SegmentCcdEdgeTypeS1, // Closest approach occurs at parametric value s = 1 SegmentCcdEdgeTypeEdgeSkip, // Closest approach is not at segment boundary (0.0 <= r,s, <= 1.0) SegmentCcdEdgeTypeEdgeInvalid // Invalid value }; /// Constructor. SegmentSegmentCcdStaticContact(); /// Determine whether two "zero radius" segments collide. For moving segments, this represents contact at a /// specific point in time. /// \param p segment 1 endpoints. /// \param q segment 2 endpoints. /// \param distanceEpsilon closeness parameter for the zero thickness collision. /// \param r [out] parametric location of the collision point (if any) on segment 1. /// \param s [out] parametric location of the collision point (if any) on segment 2. /// \return false if no collision is occurring, or true otherwise. bool collideStaticSegmentSegment( const std::array& p, const std::array& q, double distanceEpsilon, double* r, double* s); /// Determine whether two thick segments collide. For moving segments, this represents contact at a /// specific point in time. /// \param p segment 1 endpoints. /// \param q segment 2 endpoints. /// \param radiusP thickness of segment 1. /// \param radiusQ thickness of segment 2. /// \param r [out] parametric location of the collision point (if any) on segment 1. /// \param s [out] parametric location of the collision point (if any) on segment 2. /// \return false if no collision is occurring, or true otherwise. bool collideStaticSegmentSegment( const std::array& p, const std::array& q, double radiusP, double radiusQ, double* r, double* s); protected: /// Determine whether a single point and a segment collide. /// \param point point position. /// \param p segment endpoints. /// \param thicknessPoint radius of the point. /// \param thicknessSegment radius of the segment. /// \param r [out] parametric location of the collision point (if any) on segment p. /// \return false if no collision is occurring, or true otherwise. bool collideStaticPointSegment( const Math::Vector3d& point, const std::array& p, double thicknessPoint, double thicknessSegment, double* r ); /// Find the edge to be clamped for the closest point solution using the outline of: /// https://www.assembla.com/spaces/OpenSurgSim/documents/cRWomWC2er5ykpacwqjQYw/download/cRWomWC2er5ykpacwqjQYw /// /// Calculates the parametric value that must be clamped in determining the segment - /// segment distance where: /// SegmentCcdEdgeTypeR0 clamp parametric value r to 0 /// SegmentCcdEdgeTypeR1 clamp parametric value r to 1 /// SegmentCcdEdgeTypeS0 clamp parametric value s to 0 /// SegmentCcdEdgeTypeS1 clamp parametric value s to 1 /// SegmentCcdEdgeSkip both values are with [0, 1] /// a = (P1 - P0)(P1 - P0) /// b = -(P1 - P0)(Q1 - Q0) /// c = (Q1 - Q0)(Q1 - Q0) /// d = (P1 - P0)(P0 - Q0) /// e = -(Q1 - Q0)(P0 - Q0) /// f = (P0 - Q0)(P0 - Q0) /// \param a value of p dot p /// \param b value of -(p dot q) /// \param d value of p dot (q[0] - p[0]) /// \param r unnormalized parametric location of the intersection point on line p /// \param s unnormalized parametric location of the intersection point on line q /// \param ratio normalization value defined as (p dot p) . (q dot q) - (p dot q)^2. /// \return an indicator of the edge (r and s) which must be clamped and its clamp value. SegmentCcdEdgeType computeCollisionEdge(double a, double b, double d, double r, double s, double ratio) const; /// Given an edge indicator, clamp the indicated parametric edge and calculate the minimum parametric /// value for the other segment using the outline of: /// https://www.assembla.com/spaces/OpenSurgSim/documents/cRWomWC2er5ykpacwqjQYw/download/cRWomWC2er5ykpacwqjQYw /// Definitions of the values are: /// a = (P1 - P0)(P1 - P0) /// b = -(P1 - P0)(Q1 - Q0) /// c = (Q1 - Q0)(Q1 - Q0) /// d = (P1 - P0)(P0 - Q0) /// e = -(Q1 - Q0)(P0 - Q0) /// f = (P0 - Q0)(P0 - Q0) /// \param edge indicator of previously calculated edge constraint /// \param a value of p dot p /// \param b value of -(p dot q) /// \param c value of q dot q /// \param d value of p dot (p[0] - q[0]) /// \param e value of -(q dot (p[0] - q[0])) /// \param ratio normalization value defined as (p dot p) . (q dot q) - (p dot q)^2. /// \param r [out] parametric location of the intersection point on segment p /// \param s [out] parametric location of the intersection point on segment q void computeCollisionParametrics(SegmentCcdEdgeType edge, double a, double b, double c, double d, double e, double ratio, double* r, double* s) const; /// Calculate the parametric values that give the minimum distance for two parallel segments /// value for the other edge. Definitions of the values are: /// a = (P1 - P0)(P1 - P0) /// b = -(P1 - P0)(Q1 - Q0) /// c = (Q1 - Q0)(Q1 - Q0) /// d = (P1 - P0)(P0 - Q0) /// e = -(Q1 - Q0)(P0 - Q0) /// f = (P0 - Q0)(P0 - Q0) /// \param a value of p dot p /// \param b value of -(p dot q) /// \param d value of p dot (p[0] - q[0]) /// \param r [out] parametric location of the intersection point on segment p /// \param s [out] parametric location of the intersection point on segment q void computeParallelSegmentParametrics(double a, double b, double d, double* r, double* s) const; private: /// During collision, points closer than this value are considered a single point const double m_degenerateEpsilon; }; }; // namespace Collision }; // namespace SurgSim #endif // SURGSIM_COLLISION_SEGMENTSEGMENTCCDSTATICCONTACT_H opensurgsim-0.7.0/SurgSim/Collision/SegmentSelfContact.cpp000066400000000000000000000554231277777236100237050ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Collision/SegmentSelfContact.h" #include "SurgSim/Collision/Representation.h" #include "SurgSim/Collision/SegmentSegmentCcdMovingContact.h" #include "SurgSim/Collision/SegmentSegmentCcdStaticContact.h" #include "SurgSim/DataStructures/AabbTreeNode.h" #include "SurgSim/DataStructures/Location.h" #include "SurgSim/Math/MeshShape.h" #include "SurgSim/Math/Scalar.h" #include "SurgSim/Math/SegmentMeshShape.h" using SurgSim::DataStructures::Location; using SurgSim::Math::MeshShape; namespace SurgSim { namespace Collision { SegmentSelfContact::SegmentSelfContact(): m_distanceEpsilon(1.0e-04), m_timeMinPrecisionEpsilon(1.0e-06), m_timeMaxPrecisionEpsilon(1.0), m_maxMovementThreshold(0.1), m_useSegmentThickness(true), m_logger(Framework::Logger::getLogger("Collision/SegmentSelfContact")) { } std::pair SegmentSelfContact::getShapeTypes() { return std::pair(Math::SHAPE_TYPE_SEGMENTMESH, Math::SHAPE_TYPE_SEGMENTMESH); } void SegmentSelfContact::setTimeMinPrecisionEpsilon(double precision) { SURGSIM_ASSERT(precision > 0.0) << "Cannot set a negative min/max time precision."; m_timeMinPrecisionEpsilon = precision; } double SegmentSelfContact::getTimeMinPrecisionEpsilon() { return m_timeMinPrecisionEpsilon; } void SegmentSelfContact::setTimeMaxPrecisionEpsilon(double precision) { SURGSIM_ASSERT(precision > 0.0) << "Cannot set a negative min/max time precision."; m_timeMaxPrecisionEpsilon = precision; } double SegmentSelfContact::getTimeMaxPrecisionEpsilon() { return m_timeMaxPrecisionEpsilon; } void SegmentSelfContact::setDistanceEpsilon(double precision) { m_distanceEpsilon = precision; } double SegmentSelfContact::distanceEpsilon() { return m_distanceEpsilon; } std::list> SegmentSelfContact::calculateCcdContact( const Math::SegmentMeshShape& segmentShape1AtTime0, const Math::RigidTransform3d& segmentPose1AtTime0, const Math::SegmentMeshShape& segmentShape1AtTime1, const Math::RigidTransform3d& segmentPose1AtTime1, const Math::SegmentMeshShape& segmentShape2AtTime0, const Math::RigidTransform3d& segmentPose2AtTime0, const Math::SegmentMeshShape& segmentShape2AtTime1, const Math::RigidTransform3d& segmentPose2AtTime1) const { const Math::SegmentMeshShape& segmentShape1 = segmentShape1AtTime0; const Math::RigidTransform3d& segmentPose1 = segmentPose1AtTime0; const Math::SegmentMeshShape& segmentShape2 = segmentShape1AtTime1; const Math::RigidTransform3d& segmentPose2 = segmentPose1AtTime1; SURGSIM_ASSERT(segmentShape1.getNumEdges() == segmentShape2.getNumEdges()) << "Segment CCD self collision detects that " << "the segment at time t and time t + 1 have different numbers of edges."; std::list> contacts; // Intersect the AABB trees of the Segment Mesh at time 0 and time 1 to get a list of // potential intersecting segments. std::set> segmentIds; // Use a local aabb tree for the movement volume to calculate the first set of possible intersections. auto const& edges1 = segmentShape1.getEdges(); auto const& edges2 = segmentShape2.getEdges(); const Math::Vector3d halfExtent = Math::Vector3d(segmentShape1.getRadius(), segmentShape1.getRadius(), segmentShape1.getRadius()); std::list items; for (size_t id = 0; id < edges1.size(); ++id) { if (edges1[id].isValid && edges2[id].isValid) { const auto& vertices1 = segmentShape1.getEdgePositions(id); Math::Aabbd aabb((vertices1[0] - halfExtent).eval()); aabb.extend((vertices1[0] + halfExtent).eval()); aabb.extend((vertices1[1] - halfExtent).eval()); aabb.extend((vertices1[1] + halfExtent).eval()); const auto& vertices2 = segmentShape2.getEdgePositions(id); aabb.extend((vertices2[0] - halfExtent).eval()); aabb.extend((vertices2[0] + halfExtent).eval()); aabb.extend((vertices2[1] - halfExtent).eval()); aabb.extend((vertices2[1] + halfExtent).eval()); items.emplace_back(aabb, id); } } DataStructures::AabbTree tree; tree.set(std::move(items)); std::list intersectionList = tree.spatialJoin(tree); getUniqueCandidates(intersectionList, &segmentIds); size_t evaluations = 0; for (const auto& idPair : segmentIds) { size_t id1 = idPair.first; size_t id2 = idPair.second; SURGSIM_ASSERT(id1 >= 0 && id1 < segmentShape1.getNumEdges()) << "Invalid segment detected in " << "Segment CCD self collision. Colliding segment at time point 0 does not exist."; SURGSIM_ASSERT(id2 >= 0 && id2 < segmentShape2.getNumEdges()) << "Invalid segment detected in " << "Segment CCD self collision. Colliding segment at time point 1 does not exist."; // Do a little filtering. We do not allow a segment to collide with itself or // with an immediate neighbor; and pragmatically, it seems reasonable to disregard any segments that show // too much movement between times. At best this means that we should be taking smaller time steps, // but it is probably more likely to reflect some other error such as an unstable solution. if (removeInvalidCollisions(segmentShape1, segmentShape2, id1, id2)) { continue; } evaluations++; const auto& pt0Positions = segmentShape1.getEdgePositions(id1); const auto& pt1Positions = segmentShape2.getEdgePositions(id1); const auto& qt0Positions = segmentShape1.getEdgePositions(id2); const auto& qt1Positions = segmentShape2.getEdgePositions(id2); double segmentRadius1 = 0.0; double segmentRadius2 = 0.0; double effectiveThickness = m_distanceEpsilon; if (m_useSegmentThickness) { // TODO(wdturner-11/2015): We need to get thickness as a property. Until then use // the radius ... // // segmentRadius1 = segmentA->getEdge(id1).data.thickness; // segmentRadius2 = segmentB->getEdge(id2).data.thickness; segmentRadius1 = segmentShape1.getRadius(); segmentRadius2 = segmentShape2.getRadius(); effectiveThickness = segmentRadius1 + segmentRadius2; } // // Based on movement speed, calculate the maximum time interval that will maintain detection accuracy. // double timePrecision = maxTimePrecision(pt0Positions, pt1Positions, qt0Positions, qt1Positions, effectiveThickness); double pLen = (pt0Positions[1] - pt0Positions[0]).squaredNorm(); double rParametricPrecision = m_distanceEpsilon; if (pLen > 0.0) { rParametricPrecision = std::min(0.5, m_distanceEpsilon / std::sqrt(pLen)); } double qLen = (pt1Positions[1] - pt1Positions[0]).squaredNorm(); double sParametricPrecision = m_distanceEpsilon; if (qLen > 0.0) { sParametricPrecision = std::min(0.5, m_distanceEpsilon / std::sqrt(qLen)); } // Perform the actual collision detection and create the contact. double r; // Parametric location of collision on segment p double s; // Parametric location of collision on segment q double t; // Time of collision (if any) Math::Vector3d pToQDir; Math::Vector3d segmentPContact; Math::Vector3d segmentQContact; if (detectCollision(pt0Positions, pt1Positions, qt0Positions, qt1Positions, segmentRadius1, segmentRadius2, timePrecision, &r, &s, &t, &pToQDir, &segmentPContact, &segmentQContact)) { // The segments collide within tolerance, but if the collision is really close to an endpoint // then move it to the start of the segment to aid in removing duplicates. r = Math::clamp(r, 0.0, 1.0, rParametricPrecision); s = Math::clamp(s, 0.0, 1.0, sParametricPrecision); // When a segment extremity collides, its collision can be detected twice, // as this point is shared between 2 segments! Here, we choose *one* of them to add! // Be sure to check both directions. if (!findSegSegContact(segmentShape1, contacts, t, COLLISION_DETECTION_TYPE_CONTINUOUS, id1, r, id2, s, timePrecision) && !findSegSegContact(segmentShape1, contacts, t, COLLISION_DETECTION_TYPE_CONTINUOUS, id2, s, id1, r, timePrecision)) { // Encode the segment specific intersection points for later recall. Here we encode each // side of the contact point specific to each segment. std::pair penetrationPoints; Math::Vector2d parametricCoordinateP(1.0 - r, r); penetrationPoints.first.elementMeshLocalCoordinate.setValue( DataStructures::IndexedLocalCoordinate(id1, parametricCoordinateP)); Math::Vector2d parametricCoordinateQ(1.0 - s, s); penetrationPoints.second.elementMeshLocalCoordinate.setValue( DataStructures::IndexedLocalCoordinate(id2, parametricCoordinateQ)); penetrationPoints.first.rigidLocalPosition.setValue( segmentPose1.inverse() * segmentPContact); penetrationPoints.second.rigidLocalPosition.setValue( segmentPose2.inverse() * segmentQContact); // Calculate the normal and the contact point. The contact point is a point along the normal // connecting the segments. If we are using the segment thickness, the point should be located // a segment radius distance from each individual contact point. Otherwise, it should be within // m_distanceEpsilon/2. For accuracy, it is calculated from both starting points and then averaged. double effectiveRadiusP = m_useSegmentThickness ? segmentRadius1 : m_distanceEpsilon / 2.0; double effectiveRadiusQ = m_useSegmentThickness ? segmentRadius2 : m_distanceEpsilon / 2.0; auto normal = pToQDir.normalized(); Math::Vector3d contactP = segmentPContact + (effectiveRadiusP * normal); Math::Vector3d contactQ = segmentQContact - (effectiveRadiusQ * normal); auto contactPoint = 0.5 * (contactP + contactQ); auto depth = ((contactP - contactQ).dot(normal) > 0.0) ? (contactP - contactQ).norm() : -(contactP - contactQ).norm(); SURGSIM_LOG_DEBUG(m_logger) << "Contact detected: time:\t" << t << "\tsegment 1 id:\t" << id1 << "\tsegment 2 id:\t" << id2 << "\tbarymetric coordinate r:\t" << r << "\tbarymetric coordinate s:\t" << s << "\tMagnitude:\t" << pToQDir.norm() << "\tDepth:\t" << depth; contacts.emplace_back(std::make_shared( CollisionDetectionType::COLLISION_DETECTION_TYPE_CONTINUOUS, depth, t, contactPoint, -normal, penetrationPoints)); } } else { SURGSIM_LOG_DEBUG(m_logger) << "AABB tree detected false positive between segments " << id1 << " and " << id2; } } SURGSIM_LOG_DEBUG(m_logger) << "Segment intersections detected: " << segmentIds.size() << "\tActual intersections evaluated: " << evaluations; return contacts; } bool SegmentSelfContact::detectCollision( const std::array& pt0Positions, const std::array& pt1Positions, const std::array& qt0Positions, const std::array& qt1Positions, double segmentRadius1, double segmentRadius2, double timePrecision, double* r, double* s, double* t, Math::Vector3d* pToQDir, Math::Vector3d* contactPtP, Math::Vector3d* contactPtQ) const { // // First check for intersection at the start of the interval. If this is true, we can just report on the // contact at t=0 and return. Note that the original code compared totalThickness == 0.0. This is slightly // different in that it assumes that totalThickness cannot be less than m_distanceEpsilon since // m_distanceEpsilon represents the 0 segment thickness case. // // Important safety note. These calls to compute the static segment collision originally had two flavors: one // for segments with thickness and one for segments with no thickness (which used an attributed thickness of // m_distanceEpsilon). I dug into this and the only difference in the two was in the handling of potential // intersections beyond the segment end point. For segments with thickness, the intersection point was // clamped to the end of the segment but was deemed real if the modified endpoint was within an acceptable // distance of the true intersection point as determined by the segment radius. For the zero radius case, // this margin at the segment ends was not observed. While this implementation maintains the two different // APIs, it does not maintain the algorithmic differences. The duplicate collision removal as implemented // should resolve any places within a string of segments where extra collisions are detected and the only // observable change should be at unattached segment boundaries where it is arguable as to which method is // more correct. Certainly, it will be easier to selectively impose this condition should it prove desirable, // than it is to maintain two nearly identical methods as was done previously. // double totalThickness = segmentRadius1 + segmentRadius2; bool collidingAtT0; static SegmentSegmentCcdStaticContact staticContact; if (totalThickness <= m_distanceEpsilon) { collidingAtT0 = staticContact.collideStaticSegmentSegment(pt0Positions, qt0Positions, m_distanceEpsilon, r, s); } else { collidingAtT0 = staticContact.collideStaticSegmentSegment(pt0Positions, qt0Positions, segmentRadius1, segmentRadius2, r, s); } if (collidingAtT0) { *t = 0; *contactPtP = Math::interpolate(pt0Positions[0], pt0Positions[1], *r); *contactPtQ = Math::interpolate(qt0Positions[0], qt0Positions[1], *s); *pToQDir = *contactPtQ - *contactPtP; return true; } // // Finally, detect if the segments collide throughout the period of movement. // bool collisionDetected; static SegmentSegmentCcdMovingContact movingContact; if (totalThickness < m_distanceEpsilon) { collisionDetected = movingContact.collideMovingSegmentSegment(pt0Positions, pt1Positions, qt0Positions, qt1Positions, m_distanceEpsilon, timePrecision, t, r, s, pToQDir); } else { collisionDetected = movingContact.collideMovingSegmentSegment(pt0Positions, pt1Positions, qt0Positions, qt1Positions, segmentRadius1, segmentRadius2, timePrecision, t, r, s, pToQDir); } // // If a collision is detected, use interpolation to determine the point in time and space. // if (collisionDetected) { Math::Vector3d p0Contact = Math::interpolate(pt0Positions[0], pt0Positions[1], *r); Math::Vector3d p1Contact = Math::interpolate(pt1Positions[0], pt1Positions[1], *r); Math::Vector3d q0Contact = Math::interpolate(qt0Positions[0], qt0Positions[1], *s); Math::Vector3d q1Contact = Math::interpolate(qt1Positions[0], qt1Positions[1], *s); *contactPtP = Math::interpolate(p0Contact, p1Contact, *t); *contactPtQ = Math::interpolate(q0Contact, q1Contact, *t); *pToQDir = *contactPtQ - *contactPtP; } return collisionDetected; } void SegmentSelfContact::getUniqueCandidates( const std::list& intersectionList, std::set>* segmentIds) const { for (const auto& intersection : intersectionList) { std::shared_ptr nodeA = intersection.first; std::shared_ptr nodeB = intersection.second; std::list localIdListA; std::list localIdListB; nodeA->getIntersections(nodeB->getAabb(), &localIdListA); nodeB->getIntersections(nodeA->getAabb(), &localIdListB); for (const auto& idA : localIdListA) { for (const auto& idB : localIdListB) { // Segments are the same if (idA == idB) { continue; } // Segment pair has already been added auto testValue = (idA < idB) ? std::pair(idA, idB) : std::pair(idB, idA); segmentIds->insert(testValue); } } } } bool SegmentSelfContact::removeInvalidCollisions( const Math::SegmentMeshShape& segmentT0, const Math::SegmentMeshShape& segmentT1, size_t id1, size_t id2) const { auto& verticesA = segmentT0.getEdge(id1).verticesId; auto& verticesB = segmentT1.getEdge(id2).verticesId; if ((verticesA[0] == verticesB[0]) || (verticesA[0] == verticesB[1]) || (verticesA[1] == verticesB[0]) || (verticesA[1] == verticesB[1])) { SURGSIM_LOG_DEBUG(m_logger) << "Locality: Edge " << id1 << " and " << id2 << " share a common vertex."; return true; } const auto& pt0Positions = segmentT0.getEdgePositions(id1); const auto& pt1Positions = segmentT1.getEdgePositions(id1); const auto& qt0Positions = segmentT0.getEdgePositions(id2); const auto& qt1Positions = segmentT1.getEdgePositions(id2); auto p1t0 = pt0Positions[0]; auto p2t0 = pt0Positions[1]; auto p1t1 = pt1Positions[0]; auto p2t1 = pt1Positions[1]; auto q1t0 = qt0Positions[0]; auto q2t0 = qt0Positions[1]; auto q1t1 = qt1Positions[0]; auto q2t1 = qt1Positions[1]; if (detectExcessMovement(p1t0, p1t1, m_maxMovementThreshold) || detectExcessMovement(p2t0, p2t1, m_maxMovementThreshold) || detectExcessMovement(q1t0, q1t1, m_maxMovementThreshold) || detectExcessMovement(q2t0, q2t1, m_maxMovementThreshold)) { SURGSIM_LOG_WARNING(m_logger) << "Excessive movement detected during contact evaluation"; return true; } return false; } bool SegmentSelfContact::detectExcessMovement(const Math::Vector3d& pt0, const Math::Vector3d& pt1, double threshold) const { return (std::abs(pt0[0] - pt1[0]) > threshold) || (std::abs(pt0[1] - pt1[1]) > threshold) || (std::abs(pt0[2] - pt1[2]) > threshold); } bool SegmentSelfContact::findSegSegContact(const Math::SegmentMeshShape& segmentShape, const std::list>& contacts, double t, Collision::CollisionDetectionType collisionType, size_t segId1, double s1, size_t segId2, double s2, double timeEpsilon) const { for (const auto& contact : contacts) { auto existingSegId1 = contact->penetrationPoints.first.elementMeshLocalCoordinate.getValue().index; auto existingSegId2 = contact->penetrationPoints.second.elementMeshLocalCoordinate.getValue().index; auto existingS1 = contact->penetrationPoints.first.elementMeshLocalCoordinate.getValue().coordinate[1]; auto existingS2 = contact->penetrationPoints.second.elementMeshLocalCoordinate.getValue().coordinate[1]; // Check for same object type and same time. The test for same objectID was // removed as it did not appear to be used (all find segment calls set that // variable to -1) and because it is not available here. if (contact->type == collisionType && std::abs(contact->time - t) < timeEpsilon) { // Check that it is the same contact point on both segments if (isSameSegContactPoint(segmentShape, segId1, s1, existingSegId1, existingS1)) { // Colliding against the same segment (no need to check the abscissa) // Then check for end point cases, which can have different segIDs if ((existingSegId2 == segId2) || isSameSegContactPoint(segmentShape, segId2, s2, existingSegId2, existingS2)) { return true; } } } } return false; } bool SegmentSelfContact::isSameSegContactPoint(const Math::SegmentMeshShape& segmentShape, size_t segId1, double s1, size_t segId2, double s2) const { auto& verticesA = segmentShape.getEdge(segId1).verticesId; auto& verticesB = segmentShape.getEdge(segId2).verticesId; if (segId1 == segId2 && // Same segment? std::fabs(s1 - s2) < m_distanceEpsilon) // Same abscissa? { return true; } // Check for segment extremities, which may be shared with another segment. Unlike the previous version, // which used ordering of the segments to determine "sharedness" this version cannot rely on ordering. Instead, // we need to determine the vertex ids and compare them. Assuming a vertex may exhibit either a branching or // a linear structure, this gives us 4 cases (1a, 1b, 2a, 2b). 1 and 2 represent vertices where the segId // is at the beginning of the segment (s==0), or at the end of the segment (s==1); while a and b represent // the equivalent position on the test vertex. // Test for segId at the start of the segment (1a and 1b) if (s1 < m_distanceEpsilon) { return ((s2 < m_distanceEpsilon) && verticesA[0] == verticesB[0]) || ((s2 > (1.0 - m_distanceEpsilon) && verticesA[0] == verticesB[1])); } // Test for segId at the end of the segment (2a and 2b) if (s1 > (1.0 - m_distanceEpsilon)) { return ((s2 < m_distanceEpsilon) && verticesA[1] == verticesB[0]) || ((s2 > (1.0 - m_distanceEpsilon) && verticesA[1] == verticesB[1])); } return false; } double SegmentSelfContact::maxTimePrecision( const std::array& pt0Positions, const std::array& pt1Positions, const std::array& qt0Positions, const std::array& qt1Positions, double effectiveThickness) const { SURGSIM_ASSERT(effectiveThickness > 0.0) << "Attempting CCD with segment thickness <= 0."; // Find the displacement of the endpoints during the time period auto p0Displacement = pt1Positions[0] - pt0Positions[0]; auto p1Displacement = pt1Positions[1] - pt0Positions[1]; auto q1Displacement = qt1Positions[0] - qt0Positions[0]; auto q2Displacement = qt1Positions[1] - qt0Positions[1]; // Get the relative displacement between the segments, so we know the relative movement double p1q1RelativeDisplacementNorm2 = (p0Displacement - q1Displacement).squaredNorm(); double p1q2RelativeDisplacementNorm2 = (p0Displacement - q2Displacement).squaredNorm(); double p2q1RelativeDisplacementNorm2 = (p1Displacement - q1Displacement).squaredNorm(); double p2q2RelativeDisplacementNorm2 = (p1Displacement - q2Displacement).squaredNorm(); // Now calculate the maximum relative displacement double maxP1RelativeDisplacementNorm2 = std::max(p1q1RelativeDisplacementNorm2, p1q2RelativeDisplacementNorm2); double maxP2RelativeDisplacementNorm2 = std::max(p2q1RelativeDisplacementNorm2, p2q2RelativeDisplacementNorm2); double maxRelativeDisplacement = std::sqrt(std::max(maxP1RelativeDisplacementNorm2, maxP2RelativeDisplacementNorm2)); // The time precision should be set low enough so that we don't miss any segment collision. double timePrecision = effectiveThickness / maxRelativeDisplacement; if (timePrecision < m_timeMinPrecisionEpsilon) { SURGSIM_LOG_WARNING(m_logger) << "Minimum time precision(" << m_timeMinPrecisionEpsilon << ") needs to be smaller(" << timePrecision << ") to guarantee no missed self - collisions!"; timePrecision = m_timeMinPrecisionEpsilon; } timePrecision = std::min(timePrecision, m_timeMaxPrecisionEpsilon); return timePrecision; } }; // namespace Collision }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Collision/SegmentSelfContact.h000066400000000000000000000260401277777236100233430ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_COLLISION_SEGMENTSELFCONTACT_H #define SURGSIM_COLLISION_SEGMENTSELFCONTACT_H #include "SurgSim/Collision/ShapeShapeContactCalculation.h" #include "SurgSim/DataStructures/AabbTree.h" #include "SurgSim/Framework/Logger.h" #include "SurgSim/Math/SegmentMeshShape.h" namespace SurgSim { namespace Collision { class CollisionPair; /// SegmentSelfContact computes the self collisions among a SegmentMesh under motion at two /// time points parametrized over the time interval [0,1]. An initial phase uses the AABB tree to /// select a set of potentially colliding segments from the SegmentMesh. For each of these /// candidate segment pairs, the goal is to determine the point of earliest contact should any exist. /// /// At the highest level the actual collision detection of candidate segment pairs is a two phase /// algorithm. First determine if there is contact at the start of an interval and report the contact if /// found. If no contact is found at the start, subdivide the interval, determine which of the resulting /// candidate subintervals may have collisions, and then recursively check those promising subintervals. /// Note that a simple algorithm based on interval arithmetic (including the Interval, LinearMotion and /// Polynomial interval classes) allows for a quick determination of promising subintervals allowing many /// of the subintervals to be pruned during the subdivision step without forcing the recursion to bottom out. /// /// \sa Interval, LinearMotion, Polynomial, SegmentSegmentCcdIntervalCheck /// class SegmentSelfContact : public ShapeShapeContactCalculation { public: /// Constructor. SegmentSelfContact(); std::list> calculateCcdContact( const Math::SegmentMeshShape& segmentShape1AtTime0, const Math::RigidTransform3d& segmentPose1AtTime0, const Math::SegmentMeshShape& segmentShape1AtTime1, const Math::RigidTransform3d& segmentPose1AtTime1, const Math::SegmentMeshShape& segmentShape2AtTime0, const Math::RigidTransform3d& segmentPose2AtTime0, const Math::SegmentMeshShape& segmentShape2AtTime1, const Math::RigidTransform3d& segmentPose2AtTime1) const override; /// Set the minimum time precision allowed when deciding on the depth of recursion. /// \param precision the desired minimum time precision void setTimeMinPrecisionEpsilon(double precision); /// \return the minimum time precision allowed when deciding on the depth of recursion. double getTimeMinPrecisionEpsilon(); /// Set the maximum time precision allowed when deciding on the depth of recursion. /// \param precision the desired maximum time precision void setTimeMaxPrecisionEpsilon(double precision); /// \return the maximum time precision allowed when deciding on the depth of recursion. double getTimeMaxPrecisionEpsilon(); /// Set the maximum separation for which two points are considered the same. /// \param precision the desired maximum separation for which two points are considered the same. void setDistanceEpsilon(double precision); /// \return the maximum separation for which two points are considered the same. double distanceEpsilon(); /// Function that returns the shapes between which this class performs collision detection. /// \return int std::pair containing the shape types. std::pair getShapeTypes() override; protected: /// Detect if two segments actually collide either at time t=0 (Fixed case) or within a movement phase. /// \param pt0Positions are the segment endpoints for the first segment at time t=0. /// \param pt1Positions are the segment endpoints for the first segment at time t=1. /// \param qt0Positions are the segment endpoints for the second segment at time t=0. /// \param qt1Positions are the segment endpoints for the second segment at time t=1. /// \param segmentRadius1 is the radius of the first segment. /// \param segmentRadius2 is the radius of the second segment. /// \param timePrecision is the minimum time delta. Recursion terminates at or below the timePrecision. /// \param r [out] parametric location of the collision point (if any) on segment 1. /// \param s [out] parametric location of the collision point (if any) on segment 2. /// \param t [out] parametric location of the time of any collision in the interval [0, 1]. /// \param pToQDir [out] direction from p(s) to q(r) /// \param contactPtP [out] location of the contact point along segment 1. /// \param contactPtQ [out] location of the contact point along segment 2. /// \return true if a collision is detected between segment 1 and segment 2; false otherwise. bool detectCollision( const std::array& pt0Positions, const std::array& pt1Positions, const std::array& qt0Positions, const std::array& qt1Positions, double segmentRadius1, double segmentRadius2, double timePrecision, double* r, double* s, double* t, SurgSim::Math::Vector3d* pToQDir, SurgSim::Math::Vector3d* contactPtP, SurgSim::Math::Vector3d* contactPtQ) const; /// Given a list of potentially intersecting AABB nodes, cull the list of any duplicates /// and return the uniques candidates as synchronized pairs. /// \param intersectionList list of potentially intersecting AABB node. /// \param segmentIds [out] paired unique matches void getUniqueCandidates( const std::list& intersectionList, std::set>* segmentIds) const; /// From the initial AABB tree collisions, there are some very simple filtering operations that we can /// do to eliminate a number of false positives. Most notably, we do not want to collide a single segment /// against itself, or against one of the segments with which it shares a vertex. These are trivial collisions /// and will always be present. Less obvious, we want to filter out segments with wild movement vectors. /// These segments cannot be appropriately processed and are likely to represent errors. /// \param segmentA the segment mesh at time t=0. /// \param segmentB the segment mesh at time t=1. /// \param segment1SegID the specific identifier of the candidate segment at time t=0. /// \param segment2SegID the specific identifier of the candidate segment at time t=1. /// \return true if this collision should be discarded, false if it should be processed further. bool removeInvalidCollisions( const Math::SegmentMeshShape& segmentA, const Math::SegmentMeshShape& segmentB, size_t segment1SegID, size_t segment2SegID) const; /// Verify the a given point at times t0 and t1 have remained within a reasonable neighborhood. Large /// movements make it impossible to accurately determine collisions. /// \param pt0 vertex coordinates at time t0 /// \param pt1 vertex coordinates at time t1 /// \param threshold distance threshold /// \return true if any point has exceeded the movement threshold bool detectExcessMovement(const SurgSim::Math::Vector3d& pt0, const SurgSim::Math::Vector3d& pt1, double threshold) const; /// Search the list of contacts for a match to the current contact. /// \param segmentShape shape to be interrogated to see if the contacts match /// \param contacts the current list of detected contacts /// \param t time of the contact under consideration. /// \param collisionType type of contact under consideration. /// \param segId1 segment 1 identifier. /// \param s1 parametric location of the contact point along segment 1. /// \param segId2 segment 2 identifier. /// \param s2 parametric location of the contact point along segment 2. /// \param timeEpsilon maximum allowed epsilon for time matches. /// \return true if the contacts match, return false otherwise. bool findSegSegContact(const Math::SegmentMeshShape& segmentShape, const std::list>& contacts, double t, Collision::CollisionDetectionType collisionType, size_t segId1, double s1, size_t segId2, double s2, double timeEpsilon) const; /// Check for the same location among two parametric location specifications. /// \param segmentShape shape to be interrogated to see if the contacts match /// \param segId1 segment 1 identifier. /// \param s1 parametric location of the contact point along segment 1. /// \param segId2 segment 2 identifier. /// \param s2 parametric location of the contact point along segment 2. /// \return true if the contacts match, return false otherwise. bool isSameSegContactPoint(const Math::SegmentMeshShape& segmentShape, size_t segId1, double s1, size_t segId2, double s2) const; /// Calculate the maximum time interval that guarantees that all collisions can be detected given the /// derived motions of the segment end points. /// \param pt0Positions are the segment endpoints for the first segment at time t=0. /// \param pt1Positions are the segment endpoints for the first segment at time t=1. /// \param qt0Positions are the segment endpoints for the second segment at time t=0. /// \param qt1Positions are the segment endpoints for the second segment at time t=1. /// \param effectiveThickness nearness criteria for declaring a contact. /// \return the maximum time interval that will still allow for the detection of all /// contacts within effectveThickness. This value is bounded from below by the value of /// the member variable m_timeMinPrecisionEpsilon and from above by m_timeMaxPrecisionEpsilon. double maxTimePrecision( const std::array& pt0Positions, const std::array& pt1Positions, const std::array& qt0Positions, const std::array& qt1Positions, double effectiveThickness) const; private: /// Minimum distance precision epsilon used in continuous collision detection. double m_distanceEpsilon; /// Minimum time precision epsilon used in continuous collision detection. double m_timeMinPrecisionEpsilon; /// Maximum time precision epsilon used in continuous collision detection. double m_timeMaxPrecisionEpsilon; /// Maximum time precision epsilon used in continuous collision detection. const double m_maxMovementThreshold; /// Flag to determine if segment thickness is to be used in contact calculations const bool m_useSegmentThickness; /// Logger std::shared_ptr m_logger; }; }; // namespace Collision }; // namespace SurgSim #endif // SURGSIM_COLLISION_SEGMENTSELFCONTACT_H opensurgsim-0.7.0/SurgSim/Collision/ShapeCollisionRepresentation.cpp000066400000000000000000000042661277777236100260130ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Collision/ShapeCollisionRepresentation.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Framework/SceneElement.h" #include "SurgSim/Math/MathConvert.h" #include "SurgSim/Math/MeshShape.h" #include "SurgSim/Physics/Representation.h" namespace SurgSim { namespace Collision { SURGSIM_REGISTER(SurgSim::Framework::Component, SurgSim::Collision::ShapeCollisionRepresentation, ShapeCollisionRepresentation); ShapeCollisionRepresentation::ShapeCollisionRepresentation(const std::string& name) : Representation(name) { SURGSIM_ADD_SERIALIZABLE_PROPERTY(ShapeCollisionRepresentation, std::shared_ptr, Shape, getShape, setShape); } ShapeCollisionRepresentation::~ShapeCollisionRepresentation() { } int ShapeCollisionRepresentation::getShapeType() const { return m_shape->getType(); } void ShapeCollisionRepresentation::setLocalPose(const SurgSim::Math::RigidTransform3d& pose) { Representation::setLocalPose(pose); update(0.0); } void ShapeCollisionRepresentation::setShape(const std::shared_ptr& shape) { SURGSIM_ASSERT(nullptr != shape) << "Can not set a empty shape."; m_shape = shape; update(0.0); } const std::shared_ptr ShapeCollisionRepresentation::getShape() const { return m_shape; } bool ShapeCollisionRepresentation::doInitialize() { if (nullptr != m_shape) { SURGSIM_ASSERT(m_shape->isValid()) << "An invalid MeshShape is used in this ShapeCollisionRepresentation."; } return true; } }; // namespace Collision }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Collision/ShapeCollisionRepresentation.h000066400000000000000000000040131277777236100254460ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_COLLISION_SHAPECOLLISIONREPRESENTATION_H #define SURGSIM_COLLISION_SHAPECOLLISIONREPRESENTATION_H #include "SurgSim/Collision/Representation.h" #include "SurgSim/Framework/Macros.h" #include "SurgSim/Framework/ObjectFactory.h" namespace SurgSim { namespace Math { class Shape; } namespace Collision { SURGSIM_STATIC_REGISTRATION(ShapeCollisionRepresentation); /// Use a Shape as a Collision Representation, any SurgSim::Physics::Representation can /// be used as a backing representation class ShapeCollisionRepresentation : public Representation { public: /// Constructor explicit ShapeCollisionRepresentation(const std::string& name); /// Destructor virtual ~ShapeCollisionRepresentation(); SURGSIM_CLASSNAME(SurgSim::Collision::ShapeCollisionRepresentation); int getShapeType() const override; void setLocalPose(const SurgSim::Math::RigidTransform3d& pose) override; // Set the shape to be used in this representation // \param shape Shape to be used in this representation. void setShape(const std::shared_ptr& shape); const std::shared_ptr getShape() const override; protected: bool doInitialize() override; private: // Shape used by this representation std::shared_ptr m_shape; }; }; // namespace Collision }; // namespace SurgSim #endif // SURGSIM_COLLISION_SHAPECOLLISIONREPRESENTATION_H opensurgsim-0.7.0/SurgSim/Collision/ShapeShapeContactCalculation.h000066400000000000000000000105311277777236100253250ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_COLLISION_SHAPESHAPECONTACTCALCULATION_H #define SURGSIM_COLLISION_SHAPESHAPECONTACTCALCULATION_H #include "SurgSim/Collision/ContactCalculation.h" #include "SurgSim/Math/Shape.h" namespace SurgSim { namespace Collision { /// Class that can automate the type conversion and provides a consistent interface to the typed call /// Takes the shapes to convert as template parameters template class ShapeShapeContactCalculation : public ContactCalculation { /// Virtual function to be overridden, this provides the typed contact calculation between two shapes /// it takes two shapes and their respective poses, and will return the contacts between those two shapes /// for shapes that return true for isTransformable(), the calculation may ignore the pose passed in the /// function. virtual std::list> calculateDcdContact( const Shape1& shape1, const Math::RigidTransform3d& pose1, const Shape2& shape2, const Math::RigidTransform3d& pose2) const { SURGSIM_FAILURE() << "Not implemented"; return std::list>(); } virtual std::list> calculateCcdContact( const Shape1& shape1AtTime0, const Math::RigidTransform3d& pose1AtTime0, const Shape1& shape1AtTime1, const Math::RigidTransform3d& pose1AtTime1, const Shape2& shape2AtTime0, const Math::RigidTransform3d& pose2AtTime0, const Shape2& shape2AtTime1, const Math::RigidTransform3d& pose2AtTime1) const { SURGSIM_FAILURE() << "Not implemented"; return std::list>(); } /// Overrides the dcd contact calculation to go from untyped shapes to the typed shapes std::list> doCalculateDcdContact( const Math::PosedShape>& posedShape1, const Math::PosedShape>& posedShape2) override { auto one = std::static_pointer_cast(posedShape1.getShape()); auto two = std::static_pointer_cast(posedShape2.getShape()); SURGSIM_ASSERT(one->getType() == posedShape1.getShape()->getType()) << "Invalid Shape 1"; SURGSIM_ASSERT(two->getType() == posedShape2.getShape()->getType()) << "Invalid Shape 2"; return calculateDcdContact(*one, posedShape1.getPose(), *two, posedShape2.getPose()); } /// Overrides the ccd contact calculation to go from untyped shapes to the typed shapes std::list> doCalculateCcdContact( const Math::PosedShapeMotion>& posedShapeMotion1, const Math::PosedShapeMotion>& posedShapeMotion2) override { auto oneAtTime0 = std::static_pointer_cast(posedShapeMotion1.first.getShape()); auto oneAtTime1 = std::static_pointer_cast(posedShapeMotion1.second.getShape()); auto twoAtTime0 = std::static_pointer_cast(posedShapeMotion2.first.getShape()); auto twoAtTime1 = std::static_pointer_cast(posedShapeMotion2.second.getShape()); SURGSIM_ASSERT(oneAtTime0->getType() == posedShapeMotion1.first.getShape()->getType()) << "Invalid Shape 1 detected at time 0"; SURGSIM_ASSERT(oneAtTime1->getType() == posedShapeMotion1.second.getShape()->getType()) << "Invalid Shape 1 detected at time 1"; SURGSIM_ASSERT(twoAtTime0->getType() == posedShapeMotion2.first.getShape()->getType()) << "Invalid Shape 2 detected at time 0"; SURGSIM_ASSERT(twoAtTime1->getType() == posedShapeMotion2.second.getShape()->getType()) << "Invalid Shape 2 detected at time 1"; return calculateCcdContact( *oneAtTime0, posedShapeMotion1.first.getPose(), *oneAtTime1, posedShapeMotion1.second.getPose(), *twoAtTime0, posedShapeMotion2.first.getPose(), *twoAtTime1, posedShapeMotion2.second.getPose()); } }; } } #endif opensurgsim-0.7.0/SurgSim/Collision/SphereDoubleSidedPlaneContact.cpp000066400000000000000000000055501277777236100257770ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Collision/SphereDoubleSidedPlaneContact.h" #include "SurgSim/Collision/CollisionPair.h" #include "SurgSim/Collision/Representation.h" #include "SurgSim/Math/DoubleSidedPlaneShape.h" #include "SurgSim/Math/Geometry.h" #include "SurgSim/Math/SphereShape.h" #include "SurgSim/Math/Vector.h" using SurgSim::DataStructures::Location; using SurgSim::Math::DoubleSidedPlaneShape; using SurgSim::Math::SphereShape; using SurgSim::Math::Vector3d; namespace SurgSim { namespace Collision { std::list> SphereDoubleSidedPlaneContact::calculateDcdContact( const Math::SphereShape& sphere, const Math::RigidTransform3d& spherePose, const Math::DoubleSidedPlaneShape& plane, const Math::RigidTransform3d& planePose) const { std::list> contacts; Vector3d sphereCenter = spherePose.translation(); // Move into Plane coordinate system Vector3d planeLocalSphereCenter = planePose.inverse() * sphereCenter; Vector3d result; double dist = Math::distancePointPlane(planeLocalSphereCenter, plane.getNormal(), plane.getD(), &result); double distAbsolute = std::abs(dist); if (distAbsolute < sphere.getRadius()) { double depth = sphere.getRadius() - distAbsolute; // Calculate the normal going from the plane to the sphere, it is the plane normal transformed by the // plane pose, flipped if the sphere is behind the plane and normalize it Vector3d normal = (planePose.linear() * plane.getNormal()) * ((dist < 0.0) ? -1.0 : 1.0); std::pair penetrationPoints; penetrationPoints.first.rigidLocalPosition.setValue( spherePose.inverse() * (sphereCenter - normal * sphere.getRadius())); penetrationPoints.second.rigidLocalPosition.setValue( planePose.inverse() * (sphereCenter - normal * distAbsolute)); contacts.emplace_back(std::make_shared( COLLISION_DETECTION_TYPE_DISCRETE, depth, 1.0, Vector3d::Zero(), normal, penetrationPoints)); } return contacts; } std::pair SphereDoubleSidedPlaneContact::getShapeTypes() { return std::pair(SurgSim::Math::SHAPE_TYPE_SPHERE, SurgSim::Math::SHAPE_TYPE_DOUBLESIDEDPLANE); } }; // namespace Collision }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Collision/SphereDoubleSidedPlaneContact.h000066400000000000000000000031611277777236100254400ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_COLLISION_SPHEREDOUBLESIDEDPLANECONTACT_H #define SURGSIM_COLLISION_SPHEREDOUBLESIDEDPLANECONTACT_H #include #include "SurgSim/Collision/ShapeShapeContactCalculation.h" #include "SurgSim/Math/SphereShape.h" #include "SurgSim/Math/DoubleSidedPlaneShape.h" namespace SurgSim { namespace Collision { class CollisionPair; /// Class to calculate intersections between Spheres and DoubleSidedPlanes class SphereDoubleSidedPlaneContact : public ShapeShapeContactCalculation { public: using ContactCalculation::calculateDcdContact; std::list> calculateDcdContact( const Math::SphereShape& sphere, const Math::RigidTransform3d& spherePose, const Math::DoubleSidedPlaneShape& plane, const Math::RigidTransform3d& planePose) const override; std::pair getShapeTypes() override; }; }; // namespace Collision }; // namespace SurgSim #endif opensurgsim-0.7.0/SurgSim/Collision/SpherePlaneContact.cpp000066400000000000000000000052721277777236100236740ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Collision/SpherePlaneContact.h" #include "SurgSim/Collision/CollisionPair.h" #include "SurgSim/Collision/Representation.h" #include "SurgSim/Math/Geometry.h" #include "SurgSim/Math/PlaneShape.h" #include "SurgSim/Math/SphereShape.h" #include "SurgSim/Math/Vector.h" using SurgSim::DataStructures::Location; using SurgSim::Math::PlaneShape; using SurgSim::Math::SphereShape; using SurgSim::Math::Vector3d; namespace SurgSim { namespace Collision { std::list> SpherePlaneContact::calculateDcdContact( const Math::SphereShape& sphere, const Math::RigidTransform3d& spherePose, const Math::PlaneShape& plane, const Math::RigidTransform3d& planePose) const { std::list> contacts; Vector3d sphereCenter = spherePose.translation(); // Move into Plane coordinate system Vector3d planeLocalSphereCenter = planePose.inverse() * sphereCenter; Vector3d result; double dist = Math::distancePointPlane(planeLocalSphereCenter, plane.getNormal(), plane.getD(), &result); if (dist < sphere.getRadius()) { double depth = sphere.getRadius() - dist; // Calculate the normal going from the plane to the sphere, it is the plane normal transformed by the // plane pose, flipped if the sphere is behind the plane and normalize it Vector3d normal = planePose.linear() * plane.getNormal(); std::pair penetrationPoints; penetrationPoints.first.rigidLocalPosition.setValue( spherePose.inverse() * (sphereCenter - normal * sphere.getRadius())); penetrationPoints.second.rigidLocalPosition.setValue( planePose.inverse() * (sphereCenter - normal * dist)); contacts.emplace_back(std::make_shared( COLLISION_DETECTION_TYPE_DISCRETE, depth, 1.0, Vector3d::Zero(), normal, penetrationPoints)); } return contacts; } std::pair SpherePlaneContact::getShapeTypes() { return std::pair(SurgSim::Math::SHAPE_TYPE_SPHERE, SurgSim::Math::SHAPE_TYPE_PLANE); } }; // namespace Collision }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Collision/SpherePlaneContact.h000066400000000000000000000030431277777236100233330ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_COLLISION_SPHEREPLANECONTACT_H #define SURGSIM_COLLISION_SPHEREPLANECONTACT_H #include #include "SurgSim/Collision/ShapeShapeContactCalculation.h" #include "SurgSim/Math/SphereShape.h" #include "SurgSim/Math/PlaneShape.h" namespace SurgSim { namespace Collision { class CollisionPair; /// Class to calculate intersections between Spheres and Planes class SpherePlaneContact : public ShapeShapeContactCalculation { public: using ContactCalculation::calculateDcdContact; std::list> calculateDcdContact( const Math::SphereShape& sphere, const Math::RigidTransform3d& spherePose, const Math::PlaneShape& plane, const Math::RigidTransform3d& planePose) const override; std::pair getShapeTypes() override; }; }; // namespace Collision }; // namespace SurgSim #endif opensurgsim-0.7.0/SurgSim/Collision/SphereSphereContact.cpp000066400000000000000000000044341277777236100240620ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Collision/SphereSphereContact.h" #include "SurgSim/Collision/CollisionPair.h" #include "SurgSim/Collision/Representation.h" #include "SurgSim/Math/SphereShape.h" #include "SurgSim/Math/Vector.h" using SurgSim::DataStructures::Location; using SurgSim::Math::SphereShape; using SurgSim::Math::Vector3d; namespace SurgSim { namespace Collision { std::list> SphereSphereContact::calculateDcdContact( const Math::SphereShape& sphere1, const Math::RigidTransform3d& sphere1Pose, const Math::SphereShape& sphere2, const Math::RigidTransform3d& sphere2Pose) const { std::list> contacts; Vector3d center1 = sphere1Pose.translation(); Vector3d center2 = sphere2Pose.translation(); Vector3d normal = center1 - center2; double dist = normal.norm(); double maxDist = sphere1.getRadius() + sphere2.getRadius(); if (dist < maxDist) { std::pair penetrationPoints; normal.normalize(); penetrationPoints.first.rigidLocalPosition.setValue( (sphere1Pose.linear().inverse() * -normal) * sphere1.getRadius()); penetrationPoints.second.rigidLocalPosition.setValue( (sphere2Pose.linear().inverse() * normal) * sphere2.getRadius()); contacts.emplace_back(std::make_shared( COLLISION_DETECTION_TYPE_DISCRETE, maxDist - dist, 1.0, Vector3d::Zero(), normal, penetrationPoints)); } return contacts; } std::pair SphereSphereContact::getShapeTypes() { return std::pair(SurgSim::Math::SHAPE_TYPE_SPHERE, SurgSim::Math::SHAPE_TYPE_SPHERE); } }; // namespace Collision }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Collision/SphereSphereContact.h000066400000000000000000000027771277777236100235370ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_COLLISION_SPHERESPHERECONTACT_H #define SURGSIM_COLLISION_SPHERESPHERECONTACT_H #include #include "SurgSim/Collision/ShapeShapeContactCalculation.h" #include "SurgSim/Math/SphereShape.h" namespace SurgSim { namespace Collision { class CollisionPair; /// Class to calculate intersections between spheres class SphereSphereContact : public ShapeShapeContactCalculation { public: using ContactCalculation::calculateDcdContact; std::list> calculateDcdContact( const Math::SphereShape& sphere1, const Math::RigidTransform3d& sphere1Pose, const Math::SphereShape& sphere2, const Math::RigidTransform3d& sphere2Pose) const override; std::pair getShapeTypes() override; }; }; // namespace Collision }; // namespace SurgSim #endif opensurgsim-0.7.0/SurgSim/Collision/TriangleMeshParticlesContact.cpp000066400000000000000000000065021277777236100257140ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Collision/TriangleMeshParticlesContact.h" #include "SurgSim/Collision/Representation.h" #include "SurgSim/DataStructures/AabbTree.h" #include "SurgSim/DataStructures/AabbTreeNode.h" #include "SurgSim/DataStructures/IndexedLocalCoordinate.h" #include "SurgSim/DataStructures/Location.h" #include "SurgSim/Math/Geometry.h" #include "SurgSim/Math/Vector.h" using SurgSim::DataStructures::IndexedLocalCoordinate; using SurgSim::DataStructures::Location; using SurgSim::Math::barycentricCoordinates; using SurgSim::Math::distancePointTriangle; using SurgSim::Math::Vector; using SurgSim::Math::Vector3d; namespace SurgSim { namespace Collision { std::pair TriangleMeshParticlesContact::getShapeTypes() { return std::pair(Math::SHAPE_TYPE_MESH, Math::SHAPE_TYPE_PARTICLES); } std::list> TriangleMeshParticlesContact::calculateDcdContact( const Math::MeshShape& mesh, const Math::RigidTransform3d&, const Math::ParticlesShape& particles, const Math::RigidTransform3d&) const { std::list> contacts; Vector3d closestPoint; Vector3d coordinates; const double particleRadius = particles.getRadius(); auto intersections = mesh.getAabbTree()->spatialJoin(*particles.getAabbTree()); for (auto& intersection : intersections) { std::list candidateTriangles; std::list candidateParticles; intersection.first->getIntersections(intersection.second->getAabb(), &candidateTriangles); intersection.second->getIntersections(intersection.first->getAabb(), &candidateParticles); for (auto& triangle : candidateTriangles) { const Vector3d& normal = mesh.getNormal(triangle); if (normal.isZero()) { continue; } for (auto& particle : candidateParticles) { const Vector3d& particlePosition = particles.getVertexPosition(particle); auto vertices = mesh.getTrianglePositions(triangle); double distance = distancePointTriangle(particlePosition, vertices[0], vertices[1], vertices[2], &closestPoint); if (distance < particleRadius) { double depth = particleRadius - normal.dot(particlePosition - closestPoint); barycentricCoordinates(closestPoint, vertices[0], vertices[1], vertices[2], normal, &coordinates); auto penetrationPoints = std::make_pair( Location(IndexedLocalCoordinate(triangle, coordinates), DataStructures::Location::TRIANGLE), Location(particle)); contacts.push_back(std::make_shared( COLLISION_DETECTION_TYPE_DISCRETE, depth, 1.0, Vector3d::Zero(), -normal, penetrationPoints)); } } } } return contacts; } }; }; opensurgsim-0.7.0/SurgSim/Collision/TriangleMeshParticlesContact.h000066400000000000000000000032471277777236100253640ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_COLLISION_TRIANGLEMESHPARTICLESCONTACT_H #define SURGSIM_COLLISION_TRIANGLEMESHPARTICLESCONTACT_H #include #include "SurgSim/Collision/ShapeShapeContactCalculation.h" #include "SurgSim/Math/MeshShape.h" #include "SurgSim/Math/ParticlesShape.h" namespace SurgSim { namespace Collision { class CollisionPair; /// Class to calculate intersections between a triangle mesh and particles class TriangleMeshParticlesContact : public ShapeShapeContactCalculation { public: using ContactCalculation::calculateDcdContact; /// \note poses are ignored for this calculation std::list> calculateDcdContact( const Math::MeshShape& mesh, const Math::RigidTransform3d&, const Math::ParticlesShape& particles, const Math::RigidTransform3d&) const override; std::pair getShapeTypes() override; }; }; // namespace Collision }; // namespace SurgSim #endif // SURGSIM_COLLISION_TRIANGLEMESHPARTICLESCONTACT_H opensurgsim-0.7.0/SurgSim/Collision/TriangleMeshPlaneContact.cpp000066400000000000000000000051131277777236100250220ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Collision/TriangleMeshPlaneContact.h" #include "SurgSim/Collision/Representation.h" #include "SurgSim/Math/Geometry.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/PlaneShape.h" #include "SurgSim/Math/MeshShape.h" using SurgSim::DataStructures::Location; using SurgSim::Math::MeshShape; using SurgSim::Math::PlaneShape; using SurgSim::Math::RigidTransform3d; using SurgSim::Math::Vector3d; namespace SurgSim { namespace Collision { std::pair TriangleMeshPlaneContact::getShapeTypes() { return std::pair (SurgSim::Math::SHAPE_TYPE_MESH, SurgSim::Math::SHAPE_TYPE_PLANE); } std::list> TriangleMeshPlaneContact::calculateDcdContact( const Math::MeshShape& mesh, const Math::RigidTransform3d& meshPose, const Math::PlaneShape& plane, const Math::RigidTransform3d& planePose) const { std::list> contacts; // Transform the plane normal to Mesh co-ordinate system. Vector3d planeNormal = planePose.linear() * plane.getNormal(); Vector3d planeNormalScaled = plane.getNormal() * -plane.getD(); Vector3d planePoint = planePose * planeNormalScaled; double planeD = -planeNormal.dot(planePoint); double d; Vector3d normal; for (auto& vertex : mesh.getVertices()) { d = planeNormal.dot(vertex.position) + planeD; if (d < SurgSim::Math::Geometry::DistanceEpsilon) { // Create the contact normal = planePose.linear() * plane.getNormal(); std::pair penetrationPoints; penetrationPoints.first.rigidLocalPosition.setValue( meshPose.inverse() * vertex.position); penetrationPoints.second.rigidLocalPosition.setValue( planePose.inverse() * (vertex.position - normal * d)); contacts.emplace_back(std::make_shared( COLLISION_DETECTION_TYPE_DISCRETE, -d, 1.0, Vector3d::Zero(), normal, penetrationPoints)); } } return contacts; } }; // Physics }; // SurgSim opensurgsim-0.7.0/SurgSim/Collision/TriangleMeshPlaneContact.h000066400000000000000000000027621277777236100244760ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_COLLISION_TRIANGLEMESHPLANECONTACT_H #define SURGSIM_COLLISION_TRIANGLEMESHPLANECONTACT_H #include #include "SurgSim/Collision/ShapeShapeContactCalculation.h" #include "SurgSim/Math/MeshShape.h" #include "SurgSim/Math/PlaneShape.h" namespace SurgSim { namespace Collision { /// Class to calculate intersections between a triangle mesh and a plane class TriangleMeshPlaneContact : public ShapeShapeContactCalculation { public: using ContactCalculation::calculateDcdContact; std::list> calculateDcdContact( const Math::MeshShape& mesh, const Math::RigidTransform3d& meshPose, const Math::PlaneShape& plane, const Math::RigidTransform3d& planePose) const override; std::pair getShapeTypes() override; }; }; }; #endif opensurgsim-0.7.0/SurgSim/Collision/TriangleMeshSurfaceMeshContact.cpp000066400000000000000000000117301277777236100261720ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Collision/TriangleMeshSurfaceMeshContact.h" #include "SurgSim/Collision/CollisionPair.h" #include "SurgSim/Collision/Representation.h" #include "SurgSim/DataStructures/AabbTree.h" #include "SurgSim/DataStructures/AabbTreeNode.h" #include "SurgSim/DataStructures/IndexedLocalCoordinate.h" #include "SurgSim/DataStructures/TriangleMesh.h" #include "SurgSim/Math/Geometry.h" #include "SurgSim/Math/MeshShape.h" #include "SurgSim/Math/RigidTransform.h" using SurgSim::DataStructures::Location; using SurgSim::DataStructures::TriangleMesh; using SurgSim::Math::MeshShape; using SurgSim::Math::RigidTransform3d; using SurgSim::Math::Vector3d; namespace SurgSim { namespace Collision { std::pair TriangleMeshSurfaceMeshContact::getShapeTypes() { return std::pair(SurgSim::Math::SHAPE_TYPE_MESH, SurgSim::Math::SHAPE_TYPE_SURFACEMESH); } std::list> TriangleMeshSurfaceMeshContact::calculateDcdContact( const Math::MeshShape& meshA, const Math::RigidTransform3d& meshAPose, const Math::SurfaceMeshShape& meshB, const Math::RigidTransform3d& meshBPose) const { std::list> contacts; std::list intersectionList = meshA.getAabbTree()->spatialJoin(*(meshB.getAabbTree())); double depth = 0.0; Vector3d normal; Vector3d penetrationPointA, penetrationPointB; for (auto intersection = intersectionList.begin(); intersection != intersectionList.end(); ++intersection) { std::shared_ptr nodeA = intersection->first; std::shared_ptr nodeB = intersection->second; std::list triangleListA; std::list triangleListB; nodeA->getIntersections(nodeB->getAabb(), &triangleListA); nodeB->getIntersections(nodeA->getAabb(), &triangleListB); for (auto i = triangleListA.begin(); i != triangleListA.end(); ++i) { const Vector3d& normalA = meshA.getNormal(*i); if (normalA.isZero()) { continue; } auto verticesA = meshA.getTrianglePositions(*i); for (auto j = triangleListB.begin(); j != triangleListB.end(); ++j) { const Vector3d& normalB = meshB.getNormal(*j); if (normalB.isZero()) { continue; } auto verticesB = meshB.getTrianglePositions(*j); bool trianglesInContact = false; // Check if the triangle A is on the bottom side of triangle B if ((((verticesA[0] + verticesA[1] + verticesA[2]) / 3.0) - verticesB[0]).dot(normalB) < 0.0) { // The centroid of triangle A is below the plane of triangle B. // Reverse the normal of the triangle B trianglesInContact = Math::calculateContactTriangleTriangle(verticesA[0], verticesA[1], verticesA[2], verticesB[0], verticesB[2], verticesB[1], normalA, (-normalB).eval(), &depth, &penetrationPointA, &penetrationPointB, &normal); } else { trianglesInContact = Math::calculateContactTriangleTriangle(verticesA[0], verticesA[1], verticesA[2], verticesB[0], verticesB[1], verticesB[2], normalA, normalB, &depth, &penetrationPointA, &penetrationPointB, &normal); } // Check if the triangles intersect. if (trianglesInContact) { // Create the contact. std::pair penetrationPoints; Vector3d barycentricCoordinate; Math::barycentricCoordinates(penetrationPointA, verticesA[0], verticesA[1], verticesA[2], normalA, &barycentricCoordinate); penetrationPoints.first.triangleMeshLocalCoordinate.setValue( DataStructures::IndexedLocalCoordinate(*i, barycentricCoordinate)); Math::barycentricCoordinates(penetrationPointB, verticesB[0], verticesB[1], verticesB[2], normalB, &barycentricCoordinate); penetrationPoints.second.triangleMeshLocalCoordinate.setValue( DataStructures::IndexedLocalCoordinate(*j, barycentricCoordinate)); penetrationPoints.first.rigidLocalPosition.setValue(meshAPose.inverse() * penetrationPointA); penetrationPoints.second.rigidLocalPosition.setValue(meshBPose.inverse() * penetrationPointB); contacts.emplace_back(std::make_shared( COLLISION_DETECTION_TYPE_DISCRETE, std::abs(depth), 1.0, Vector3d::Zero(), normal, penetrationPoints)); } } } } return contacts; } }; // namespace Collision }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Collision/TriangleMeshSurfaceMeshContact.h000066400000000000000000000033011277777236100256320ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_COLLISION_TRIANGLEMESHSURFACEMESHCONTACT_H #define SURGSIM_COLLISION_TRIANGLEMESHSURFACEMESHCONTACT_H #include #include "SurgSim/Collision/ShapeShapeContactCalculation.h" #include "SurgSim/Math/MeshShape.h" #include "SurgSim/Math/SurfaceMeshShape.h" namespace SurgSim { namespace Collision { class CollisionPair; /// Class to calculate intersections between a surface mesh and a triangle/surface mesh class TriangleMeshSurfaceMeshContact : public ShapeShapeContactCalculation { public: using ContactCalculation::calculateDcdContact; /// \note this expects the posed version of the shape to be passed std::list> calculateDcdContact( const Math::MeshShape& mesh1, const Math::RigidTransform3d& mesh1Pose, const Math::SurfaceMeshShape& mesh2, const Math::RigidTransform3d& mesh2Pose) const override; std::pair getShapeTypes() override; }; }; // namespace Collision }; // namespace SurgSim #endif // SURGSIM_COLLISION_TRIANGLEMESHSURFACEMESHCONTACT_H opensurgsim-0.7.0/SurgSim/Collision/TriangleMeshTriangleMeshContact.cpp000066400000000000000000000216571277777236100263600ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Collision/TriangleMeshTriangleMeshContact.h" #include "SurgSim/Collision/CollisionPair.h" #include "SurgSim/Collision/Representation.h" #include "SurgSim/DataStructures/AabbTree.h" #include "SurgSim/DataStructures/AabbTreeNode.h" #include "SurgSim/DataStructures/IndexedLocalCoordinate.h" #include "SurgSim/DataStructures/TriangleMesh.h" #include "SurgSim/Math/Geometry.h" #include "SurgSim/Math/MeshShape.h" #include "SurgSim/Math/RigidTransform.h" using SurgSim::DataStructures::Location; using SurgSim::DataStructures::TriangleMesh; using SurgSim::Math::MeshShape; using SurgSim::Math::RigidTransform3d; using SurgSim::Math::Vector3d; namespace SurgSim { namespace Collision { std::pair TriangleMeshTriangleMeshContact::getShapeTypes() { return std::pair(SurgSim::Math::SHAPE_TYPE_MESH, SurgSim::Math::SHAPE_TYPE_MESH); } #ifdef SURGSIM_DEBUG_TRIANGLETRIANGLECONTACT namespace { /// Asserts the points are coplanar, and prints debug output on the failing condition. /// \param triangle0, triangle1, triangle2 the vertices of the triangle /// \param point the point to compare against /// \throws If the points are not coplanar void assertIsCoplanar(const Vector3d& triangle0, const Vector3d& triangle1, const Vector3d& triangle2, const Vector3d& point) { SURGSIM_ASSERT(SurgSim::Math::isCoplanar(triangle0, triangle1, triangle2, point)) << "Coplanar assertion failed with: " "t0 [" << triangle0.transpose() << "], " "t1 [" << triangle1.transpose() << "], " "t2 [" << triangle2.transpose() << "], " "pt [" << point.transpose() << "]"; } /// Asserts the point is inside the triangle, and prints debug output on the failing condition. /// \param point the point to compare against /// \param triangle0, triangle1, triangle2 the vertices of the triangle /// \param normal the unit normal of the triangle /// \throws If the point is not inside the triangle void assertIsPointInsideTriangle(const Vector3d& point, const Vector3d& triangle0, const Vector3d& triangle1, const Vector3d& triangle2, const Vector3d& normal) { SURGSIM_ASSERT(SurgSim::Math::isPointInsideTriangle(point, triangle0, triangle1, triangle2, normal)) << "Point inside triangle assertion failed with: " "t0 [" << triangle0.transpose() << "], " "t1 [" << triangle1.transpose() << "], " "t2 [" << triangle2.transpose() << "], " "n [" << normal.transpose() << "], " "pt [" << point.transpose() << "]"; } /// Asserts the provided normal and depth minimally resolve the interpenetration of the two triangles, and prints debug /// output on the failing condition. /// \param normal the unit normal in the direction to resolve the penetration /// \param penetrationDepth the depth of penetration to check /// \param triangleA0, triangleA1, triangleA2 the vertices of the first triangle /// \param triangleB0, triangleB1, triangleB2 the vertices of the second triangle /// \throws If the normal and depth do not minimally resolve the interpenetration of the two triangles void assertIsCorrectNormalAndDepth(const Vector3d& normal, double penetrationDepth, const Vector3d& triangleA0, const Vector3d& triangleA1, const Vector3d& triangleA2, const Vector3d& triangleB0, const Vector3d& triangleB1, const Vector3d& triangleB2) { Vector3d correction = normal * (penetrationDepth - SurgSim::Math::Geometry::DistanceEpsilon); SURGSIM_ASSERT(SurgSim::Math::doesIntersectTriangleTriangle( (Vector3d)(triangleA0 + correction), (Vector3d)(triangleA1 + correction), (Vector3d)(triangleA2 + correction), triangleB0, triangleB1, triangleB2)) << "Correct normal and depth assertion failed with: " "n [" << normal.transpose() << "], " "d [" << penetrationDepth << "], " "a0 [" << triangleA0.transpose() << "], " "a1 [" << triangleA1.transpose() << "], " "a2 [" << triangleA2.transpose() << "], " "b0 [" << triangleB0.transpose() << "], " "b1 [" << triangleB1.transpose() << "], " "b2 [" << triangleB2.transpose() << "]"; correction = normal * (penetrationDepth + 2.0 * SurgSim::Math::Geometry::DistanceEpsilon); SURGSIM_ASSERT(!SurgSim::Math::doesIntersectTriangleTriangle( (Vector3d)(triangleA0 + correction), (Vector3d)(triangleA1 + correction), (Vector3d)(triangleA2 + correction), triangleB0, triangleB1, triangleB2)) << "Correct normal and depth assertion failed with: " "n [" << normal.transpose() << "], " "d [" << penetrationDepth << "], " "a0 [" << triangleA0.transpose() << "], " "a1 [" << triangleA1.transpose() << "], " "a2 [" << triangleA2.transpose() << "], " "b0 [" << triangleB0.transpose() << "], " "b1 [" << triangleB1.transpose() << "], " "b2 [" << triangleB2.transpose() << "]"; } } // namespace #endif //SURGSIM_DEBUG_TRIANGLETRIANGLECONTACT std::list> TriangleMeshTriangleMeshContact::calculateDcdContact( const Math::MeshShape& meshA, const Math::RigidTransform3d& meshAPose, const Math::MeshShape& meshB, const Math::RigidTransform3d& meshBPose) const { std::list> contacts; std::list intersectionList = meshA.getAabbTree()->spatialJoin(*(meshB.getAabbTree())); double depth = 0.0; Vector3d normal; Vector3d penetrationPointA, penetrationPointB; for (auto intersection = intersectionList.begin(); intersection != intersectionList.end(); ++intersection) { std::shared_ptr nodeA = intersection->first; std::shared_ptr nodeB = intersection->second; std::list triangleListA; std::list triangleListB; nodeA->getIntersections(nodeB->getAabb(), &triangleListA); nodeB->getIntersections(nodeA->getAabb(), &triangleListB); for (auto i = triangleListA.begin(); i != triangleListA.end(); ++i) { const Vector3d& normalA = meshA.getNormal(*i); if (normalA.isZero()) { continue; } auto verticesA = meshA.getTrianglePositions(*i); for (auto j = triangleListB.begin(); j != triangleListB.end(); ++j) { const Vector3d& normalB = meshB.getNormal(*j); if (normalB.isZero()) { continue; } auto verticesB = meshB.getTrianglePositions(*j); // Check if the triangles intersect. if (Math::calculateContactTriangleTriangle(verticesA[0], verticesA[1], verticesA[2], verticesB[0], verticesB[1], verticesB[2], normalA, normalB, &depth, &penetrationPointA, &penetrationPointB, &normal)) { #ifdef SURGSIM_DEBUG_TRIANGLETRIANGLECONTACT assertIsCoplanar(verticesA[0], verticesA[1], verticesA[2], penetrationPointA); assertIsCoplanar(verticesB[0], verticesB[1], verticesB[2], penetrationPointB); assertIsPointInsideTriangle( penetrationPointA, verticesA[0], verticesA[1], verticesA[2], normalA); assertIsPointInsideTriangle(penetrationPointB, verticesB[0], verticesB[1], verticesB[2], normalB); assertIsCorrectNormalAndDepth(normal, depth, verticesA[0], verticesA[1], verticesA[2], verticesB[0], verticesB[1], verticesB[2]); #endif // Create the contact. std::pair penetrationPoints; Vector3d barycentricCoordinate; Math::barycentricCoordinates(penetrationPointA, verticesA[0], verticesA[1], verticesA[2], normalA, &barycentricCoordinate); penetrationPoints.first.triangleMeshLocalCoordinate.setValue( DataStructures::IndexedLocalCoordinate(*i, barycentricCoordinate)); Math::barycentricCoordinates(penetrationPointB, verticesB[0], verticesB[1], verticesB[2], normalB, &barycentricCoordinate); penetrationPoints.second.triangleMeshLocalCoordinate.setValue( DataStructures::IndexedLocalCoordinate(*j, barycentricCoordinate)); penetrationPoints.first.rigidLocalPosition.setValue(meshAPose.inverse() * penetrationPointA); penetrationPoints.second.rigidLocalPosition.setValue(meshBPose.inverse() * penetrationPointB); contacts.emplace_back(std::make_shared( COLLISION_DETECTION_TYPE_DISCRETE, std::abs(depth), 1.0, Vector3d::Zero(), normal, penetrationPoints)); } } } } return contacts; } }; // namespace Collision }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Collision/TriangleMeshTriangleMeshContact.h000066400000000000000000000032511277777236100260130ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_COLLISION_TRIANGLEMESHTRIANGLEMESHCONTACT_H #define SURGSIM_COLLISION_TRIANGLEMESHTRIANGLEMESHCONTACT_H #include #include "SurgSim/Collision/ShapeShapeContactCalculation.h" #include "SurgSim/Math/MeshShape.h" namespace SurgSim { namespace Collision { class CollisionPair; /// Class to calculate intersections between a triangle mesh and a triangle mesh class TriangleMeshTriangleMeshContact : public ShapeShapeContactCalculation { public: using ContactCalculation::calculateDcdContact; /// \note this expects the posed version of the shape to be passed std::list> calculateDcdContact( const Math::MeshShape& mesh1, const Math::RigidTransform3d& mesh1Pose, const Math::MeshShape& mesh2, const Math::RigidTransform3d& mesh2Pose) const override; std::pair getShapeTypes() override; }; }; // namespace Collision }; // namespace SurgSim #endif // SURGSIM_COLLISION_TRIANGLEMESHTRIANGLEMESHCONTACT_H opensurgsim-0.7.0/SurgSim/Collision/UnitTests/000077500000000000000000000000001277777236100214025ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Collision/UnitTests/BoxCapsuleContactCalculationTests.cpp000066400000000000000000000304001277777236100306660ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include "SurgSim/Collision/BoxCapsuleContact.h" #include "SurgSim/Collision/Representation.h" #include "SurgSim/Collision/ShapeCollisionRepresentation.h" #include "SurgSim/Math/BoxShape.h" #include "SurgSim/Math/CapsuleShape.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/RigidTransform.h" using SurgSim::Math::BoxShape; using SurgSim::Math::CapsuleShape; using SurgSim::Math::makeRigidTransform; using SurgSim::Math::makeRotationQuaternion; using SurgSim::Math::Quaterniond; using SurgSim::Math::Vector3d; namespace SurgSim { namespace Collision { void doBoxCapsuleTest(std::shared_ptr box, const Quaterniond& boxQuat, const Vector3d& boxTrans, std::shared_ptr capsule, const Quaterniond& capsuleQuat, const Vector3d& capsuleTrans, const bool expectedInContact) { std::shared_ptr boxRep = std::make_shared("Collision Box 0"); boxRep->setShape(box); boxRep->setLocalPose(makeRigidTransform(boxQuat, boxTrans)); std::shared_ptr capsuleRep = std::make_shared("Collision Capsule 0"); capsuleRep->setShape(capsule); capsuleRep->setLocalPose(makeRigidTransform(capsuleQuat, capsuleTrans)); // Perform collision detection. BoxCapsuleContact calcContact; std::shared_ptr pair = std::make_shared(boxRep, capsuleRep); calcContact.calculateContact(pair); EXPECT_EQ(expectedInContact, pair->hasContacts()); if (expectedInContact) { Vector3d capsuleToBox = boxTrans - capsuleTrans; double depthMax = box->getSize().norm(); depthMax += capsule->getLength() / 2.0 + capsule->getRadius(); auto contacts = pair->getContacts(); for (auto contact=contacts.cbegin(); contact!=contacts.cend(); ++contact) { if (! capsuleToBox.isZero()) { // Check that each normal is pointing into the box EXPECT_LT(0.0, (*contact)->normal.dot(capsuleToBox)); } // Check that the depth is sane EXPECT_LT(0.0, (*contact)->depth); EXPECT_GT(depthMax, (*contact)->depth); // Check that the locations are sane Vector3d boxPenetrationPoint = boxQuat * (*contact)->penetrationPoints.first.rigidLocalPosition.getValue() + boxTrans; Vector3d capsulePenetrationPoint = capsuleQuat * (*contact)->penetrationPoints.second.rigidLocalPosition.getValue() + capsuleTrans; EXPECT_GT(0.0, (*contact)->normal.dot(boxPenetrationPoint - boxTrans)); EXPECT_LT(0.0, (*contact)->normal.dot(capsulePenetrationPoint - capsuleTrans)); } } } TEST(BoxCapsuleContactCalculationTests, UnitTests) { std::shared_ptr box = std::make_shared(1.0, 1.0, 1.0); std::shared_ptr capsule = std::make_shared(4.0, 1.0); Quaterniond boxQuat; Vector3d boxTrans; Quaterniond capsuleQuat; Vector3d capsuleTrans; { SCOPED_TRACE("No intersection, box in front of capsule"); boxQuat = Quaterniond::Identity(); boxTrans = Vector3d(10.6, 0.0, 0.0); capsuleQuat = Quaterniond::Identity(); capsuleTrans = Vector3d::Zero(); bool expectedInContact = false; doBoxCapsuleTest(box, boxQuat, boxTrans, capsule, capsuleQuat, capsuleTrans, expectedInContact); } { SCOPED_TRACE("No intersection, capsule beyond corner of box"); boxQuat = Quaterniond::Identity(); boxTrans = Vector3d::Zero(); capsuleQuat = Quaterniond::Identity(); bool expectedInContact = false; capsuleTrans = Vector3d(1.5, 0.0, 1.5); doBoxCapsuleTest(box, boxQuat, boxTrans, capsule, capsuleQuat, capsuleTrans, expectedInContact); capsuleTrans = Vector3d(1.5, 0.0, -1.5); doBoxCapsuleTest(box, boxQuat, boxTrans, capsule, capsuleQuat, capsuleTrans, expectedInContact); capsuleTrans = Vector3d(-1.5, 0.0, 1.5); doBoxCapsuleTest(box, boxQuat, boxTrans, capsule, capsuleQuat, capsuleTrans, expectedInContact); capsuleTrans = Vector3d(-1.5, 0.0, -1.5); doBoxCapsuleTest(box, boxQuat, boxTrans, capsule, capsuleQuat, capsuleTrans, expectedInContact); } { SCOPED_TRACE("No intersection, box below capsule"); boxQuat = Quaterniond::Identity(); boxTrans = Vector3d(0.0, -3.6, 0.0); capsuleQuat = Quaterniond::Identity(); capsuleTrans = Vector3d::Zero(); bool expectedInContact = false; doBoxCapsuleTest(box, boxQuat, boxTrans, capsule, capsuleQuat, capsuleTrans, expectedInContact); } { SCOPED_TRACE("Intersection, box intersection with capsule side"); boxQuat = Quaterniond::Identity(); boxTrans = Vector3d(1.0 , 0.0, 0.0); capsuleQuat = Quaterniond::Identity(); capsuleTrans = Vector3d::Zero(); bool expectedInContact = true; doBoxCapsuleTest(box, boxQuat, boxTrans, capsule, capsuleQuat, capsuleTrans, expectedInContact); } { SCOPED_TRACE("Intersection, box intersection with upside down capsule"); boxQuat = Quaterniond::Identity(); boxTrans = Vector3d(1.0 , 0.0, 0.0); capsuleQuat = makeRotationQuaternion(M_PI, Vector3d(0.0, 0.0, 1.0)); capsuleTrans = Vector3d::Zero(); bool expectedInContact = true; doBoxCapsuleTest(box, boxQuat, boxTrans, capsule, capsuleQuat, capsuleTrans, expectedInContact); } { SCOPED_TRACE("Intersection, box intersection with z-axis capsule"); boxQuat = Quaterniond::Identity(); boxTrans = Vector3d(1.0 , 0.0, 0.0); capsuleQuat = makeRotationQuaternion(M_PI_2, Vector3d(1.0, 0.0, 0.0)); capsuleTrans = Vector3d::Zero(); bool expectedInContact = true; doBoxCapsuleTest(box, boxQuat, boxTrans, capsule, capsuleQuat, capsuleTrans, expectedInContact); } { SCOPED_TRACE("Intersection, box intersection with x-axis capsule"); boxQuat = makeRotationQuaternion(M_PI, Vector3d(0.0, 0.0, 1.0)); boxTrans = Vector3d(1.0 , 0.0, 0.0); capsuleQuat = makeRotationQuaternion(M_PI_2, Vector3d(1.0, 0.0, 0.0)); capsuleTrans = Vector3d::Zero(); bool expectedInContact = true; doBoxCapsuleTest(box, boxQuat, boxTrans, capsule, capsuleQuat, capsuleTrans, expectedInContact); } { SCOPED_TRACE("Intersection, box intersection with capsule cap"); boxQuat = makeRotationQuaternion(M_PI_2, Vector3d(0.0, 0.0, 1.0)); boxTrans = Vector3d(0.1 , 0.0, 0.1); capsuleQuat = Quaterniond::Identity(); capsuleTrans = Vector3d(0.0 , 2.6, 0.0); bool expectedInContact = true; doBoxCapsuleTest(box, boxQuat, boxTrans, capsule, capsuleQuat, capsuleTrans, expectedInContact); } { SCOPED_TRACE("No intersection, capsule near box corner, but not intersecting"); boxQuat = Quaterniond::Identity(); boxTrans = Vector3d(0.0 , 0.0, 0.0); capsuleQuat = Quaterniond::Identity(); capsuleTrans = Vector3d(1.3 , 0.0, 1.3); bool expectedInContact = false; doBoxCapsuleTest(box, boxQuat, boxTrans, capsule, capsuleQuat, capsuleTrans, expectedInContact); } { SCOPED_TRACE("Intersection, capsule intersecting with box corner"); boxQuat = Quaterniond::Identity(); boxTrans = Vector3d(0.0 , 0.0, 0.0); capsuleQuat = Quaterniond::Identity(); capsuleTrans = Vector3d(1.2 , 0.0, 1.2); bool expectedInContact = true; doBoxCapsuleTest(box, boxQuat, boxTrans, capsule, capsuleQuat, capsuleTrans, expectedInContact); } { SCOPED_TRACE("Intersection, box inside capsule"); boxQuat = Quaterniond::Identity(); boxTrans = Vector3d::Zero(); capsuleQuat = Quaterniond::Identity(); capsuleTrans = Vector3d::Zero(); bool expectedInContact = true; doBoxCapsuleTest(box, boxQuat, boxTrans, capsule, capsuleQuat, capsuleTrans, expectedInContact); } { SCOPED_TRACE("Intersection, capsule inside box"); std::shared_ptr bigBox = std::make_shared(10.0, 10.0, 10.0); boxQuat = makeRotationQuaternion(-M_PI_4, Vector3d(0.0, 1.0, 0.0)); boxTrans = Vector3d::Zero(); capsuleQuat = makeRotationQuaternion(M_PI, Vector3d(1.0, 0.0, 0.0)); capsuleTrans = Vector3d(0.0, 0.0, 0.0); bool expectedInContact = true; doBoxCapsuleTest(bigBox, boxQuat, boxTrans, capsule, capsuleQuat, capsuleTrans, expectedInContact); } { SCOPED_TRACE("Intersection, capsule bottom at box center"); boxQuat = Quaterniond::Identity(); boxTrans = Vector3d::Zero(); capsuleQuat = Quaterniond::Identity(); capsuleTrans = Vector3d(0.0, -2.0, 0.0); bool expectedInContact = true; doBoxCapsuleTest(box, boxQuat, boxTrans, capsule, capsuleQuat, capsuleTrans, expectedInContact); } { SCOPED_TRACE("Intersection, capsule top at box center"); boxQuat = Quaterniond::Identity(); boxTrans = Vector3d::Zero(); capsuleQuat = Quaterniond::Identity(); capsuleTrans = Vector3d(0.0, 2.0, 0.0); bool expectedInContact = true; doBoxCapsuleTest(box, boxQuat, boxTrans, capsule, capsuleQuat, capsuleTrans, expectedInContact); } { SCOPED_TRACE("Intersection with box edge, box's point on edge"); boxQuat = Quaterniond::Identity(); boxTrans = Vector3d::Zero(); capsuleQuat = makeRotationQuaternion(0.1, Vector3d::UnitZ().eval()); capsuleTrans = Vector3d(1.52, 0.0, 0.0); bool expectedInContact = true; doBoxCapsuleTest(box, boxQuat, boxTrans, capsule, capsuleQuat, capsuleTrans, expectedInContact); } { SCOPED_TRACE("Intersection with box edge, box's point on edge, capsule point along vector towards box point"); std::shared_ptr box = std::make_shared(0.0256, 0.0256, 0.0256); std::shared_ptr capsule = std::make_shared(0.01, 0.0063); boxQuat = Quaterniond::Identity(); boxTrans = Vector3d(0.0254, 0.0524, 0.5128); capsuleQuat = Quaterniond::Identity(); capsuleTrans = Vector3d(0.0081837091898594016, 0.074665473951012307, 0.50404931721342927); bool expectedInContact = true; doBoxCapsuleTest(box, boxQuat, boxTrans, capsule, capsuleQuat, capsuleTrans, expectedInContact); } { SCOPED_TRACE("Intersection with box corner"); std::shared_ptr box = std::make_shared(0.0032, 0.0032, 0.0032); std::shared_ptr capsule = std::make_shared(0.01, 0.0063); boxQuat = Quaterniond::Identity(); boxTrans = Vector3d(0.011, 0.038, 0.5496); capsuleQuat = Quaterniond(0.99814646292568798, 0.0035271245394549833, -0.023780789153701510, 0.055907709742473284); capsuleTrans = Vector3d(0.0059124370262071749, 0.031538130383304983, 0.54312746745813301); bool expectedInContact = true; doBoxCapsuleTest(box, boxQuat, boxTrans, capsule, capsuleQuat, capsuleTrans, expectedInContact); } { SCOPED_TRACE("Another intersection with box corner"); std::shared_ptr box = std::make_shared(0.0008, 0.0008, 0.0008); std::shared_ptr capsule = std::make_shared(0.01, 0.0063); boxQuat = Quaterniond::Identity(); boxTrans = Vector3d(0.005, 0.052, 0.5308); capsuleQuat = Quaterniond(0.71851427633922127, 0.00027205941221747750, 0.0021375922639339773, 0.69550887225089708); capsuleTrans = Vector3d(0.010224217835903153, 0.058515488684803690, 0.53177563225691493); bool expectedInContact = true; doBoxCapsuleTest(box, boxQuat, boxTrans, capsule, capsuleQuat, capsuleTrans, expectedInContact); } { SCOPED_TRACE("Intersection with box face, but closest point to box center is outside dilated box"); std::shared_ptr box = std::make_shared(0.012800000000000004, 0.012799999999999999, 0.012800000000000034); std::shared_ptr capsule = std::make_shared(0.01, 0.0063); boxQuat = Quaterniond::Identity(); boxTrans = Vector3d(0.019000000000000003, 0.045999999999999999, 0.51920000000000011); capsuleQuat = Quaterniond(0.71552146749248391, -0.00014598153123885886, 0.0013667288118696403, 0.69858939320544333); capsuleTrans = Vector3d(0.017905427782122299, 0.058803866737869748, 0.51747490113489192); bool expectedInContact = true; doBoxCapsuleTest(box, boxQuat, boxTrans, capsule, capsuleQuat, capsuleTrans, expectedInContact); } } }; // namespace Collision }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Collision/UnitTests/BoxDoubleSidedPlaneContactCalculationTests.cpp000066400000000000000000000265431277777236100324520ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Collision/UnitTests/ContactCalculationTestsCommon.h" #include "SurgSim/Collision/BoxDoubleSidedPlaneContact.h" using SurgSim::Math::BoxShape; using SurgSim::Math::DoubleSidedPlaneShape; namespace SurgSim { namespace Collision { void doBoxDoubleSidedPlaneTest(std::shared_ptr box, const Quaterniond& boxQuat, const Vector3d& boxTrans, std::shared_ptr plane, const Quaterniond& planeQuat, const Vector3d& planeTrans, const int expectedNumberOfContacts, const int* expectedBoxIndicesInContacts, const bool collisionNormalIsPlaneNormal) { std::shared_ptr boxRep = std::make_shared("Collision Box 0"); boxRep->setShape(box); boxRep->setLocalPose(SurgSim::Math::makeRigidTransform(boxQuat, boxTrans)); std::shared_ptr planeRep = std::make_shared("Collision Plane 0"); planeRep->setShape(plane); planeRep->setLocalPose(SurgSim::Math::makeRigidTransform(planeQuat, planeTrans)); // First calculate the expected contact info. std::list> expectedContacts; if (expectedNumberOfContacts > 0) { generateBoxDoubleSidedPlaneContact(&expectedContacts, expectedNumberOfContacts, expectedBoxIndicesInContacts, box, boxTrans, boxQuat, plane, planeTrans, planeQuat, collisionNormalIsPlaneNormal); } // Perform collision detection. BoxDoubleSidedPlaneContact calcContact; std::shared_ptr pair = std::make_shared(boxRep, planeRep); calcContact.calculateContact(pair); // Compare the contact info. contactsInfoEqualityTest(expectedContacts, pair->getContacts()); } TEST(BoxDoubleSidedPlaneContactCalculationTests, UnitTests) { std::shared_ptr box = std::make_shared(1.0, 1.0, 1.0); std::shared_ptr plane = std::make_shared(); SurgSim::Math::Quaterniond boxQuat; SurgSim::Math::Vector3d boxTrans; SurgSim::Math::Quaterniond planeQuat; SurgSim::Math::Vector3d planeTrans; SurgSim::Math::Quaterniond globalQuat; { SCOPED_TRACE("No intersection, box in front of rotated plane"); boxQuat = SurgSim::Math::makeRotationQuaternion(0.5674, Vector3d(0.4332,0.927, 0.13557).normalized()); boxTrans = Vector3d(2.5,10.0,350.0); planeQuat = SurgSim::Math::makeRotationQuaternion(-M_PI_2, Vector3d(0.0,0.0,1.0)); planeTrans = Vector3d::Zero(); int expectedNumberOfContacts = 0; int expectedBoxIndicesInContacts[] = {0}; bool collisionNormalIsPlaneNormal = true; doBoxDoubleSidedPlaneTest(box, boxQuat, boxTrans, plane, planeQuat, planeTrans, expectedNumberOfContacts, expectedBoxIndicesInContacts, collisionNormalIsPlaneNormal); } { SCOPED_TRACE("Intersection in front of plane, four contacts, rotated plane"); boxQuat = SurgSim::Math::makeRotationQuaternion(1.233469, Vector3d(0.91834,0.39687,0.8271).normalized()); boxTrans = Vector3d(0.5,10.0,350.0); planeQuat = boxQuat * SurgSim::Math::makeRotationQuaternion(-M_PI_2, Vector3d(0.0,0.0,1.0)); planeTrans = boxTrans + boxQuat * Vector3d(-0.5,0.0,0.0); int expectedNumberOfContacts = 4; int expectedBoxIndicesInContacts[] = {0, 1, 2, 3}; bool collisionNormalIsPlaneNormal = true; doBoxDoubleSidedPlaneTest(box, boxQuat, boxTrans, plane, planeQuat, planeTrans, expectedNumberOfContacts, expectedBoxIndicesInContacts, collisionNormalIsPlaneNormal); } { SCOPED_TRACE("Intersection inside of plane, four contacts, rotated plane"); boxQuat = SurgSim::Math::makeRotationQuaternion(1.233469, Vector3d(0.91834,0.39687,0.8271).normalized()); boxTrans = Vector3d(0.5,10.0,350.0); planeQuat = boxQuat * SurgSim::Math::makeRotationQuaternion(-M_PI_2, Vector3d(0.0,0.0,1.0)); planeTrans = boxTrans + boxQuat * Vector3d(-0.4,0.0,0.0); int expectedNumberOfContacts = 4; int expectedBoxIndicesInContacts[] = {0, 1, 2, 3}; bool collisionNormalIsPlaneNormal = true; doBoxDoubleSidedPlaneTest(box, boxQuat, boxTrans, plane, planeQuat, planeTrans, expectedNumberOfContacts, expectedBoxIndicesInContacts, collisionNormalIsPlaneNormal); } { SCOPED_TRACE("Intersection in front of plane, two contacts, rotated plane"); globalQuat = SurgSim::Math::makeRotationQuaternion(0.8753, Vector3d(0.235345,0.6754,0.4567).normalized()); boxQuat = globalQuat * SurgSim::Math::makeRotationQuaternion(-M_PI_4, Vector3d(0.0,0.0,1.0)); boxTrans = Vector3d(std::sqrt(0.5),230.0,540.0); planeQuat = globalQuat * SurgSim::Math::makeRotationQuaternion(-M_PI_2, Vector3d(0.0,0.0,1.0)); planeTrans = boxTrans + globalQuat * Vector3d(-std::sqrt(0.5),0.0,0.0); int expectedNumberOfContacts = 2; int expectedBoxIndicesInContacts[] = {0, 1}; bool collisionNormalIsPlaneNormal = true; doBoxDoubleSidedPlaneTest(box, boxQuat, boxTrans, plane, planeQuat, planeTrans, expectedNumberOfContacts, expectedBoxIndicesInContacts, collisionNormalIsPlaneNormal); } { SCOPED_TRACE("Intersection inside of plane, two contacts, rotated plane"); globalQuat = SurgSim::Math::makeRotationQuaternion(0.8753, Vector3d(0.235345,0.6754,0.4567).normalized()); boxQuat = globalQuat * SurgSim::Math::makeRotationQuaternion(-M_PI_4, Vector3d(0.0,0.0,1.0)); boxTrans = Vector3d(std::sqrt(0.5),230.0,540.0); planeQuat = globalQuat * SurgSim::Math::makeRotationQuaternion(-M_PI_2, Vector3d(0.0,0.0,1.0)); planeTrans = boxTrans + globalQuat * Vector3d(-std::sqrt(0.45),0.0,0.0); int expectedNumberOfContacts = 2; int expectedBoxIndicesInContacts[] = {0, 1}; bool collisionNormalIsPlaneNormal = true; doBoxDoubleSidedPlaneTest(box, boxQuat, boxTrans, plane, planeQuat, planeTrans, expectedNumberOfContacts, expectedBoxIndicesInContacts, collisionNormalIsPlaneNormal); } { SCOPED_TRACE("Intersection in front of plane, one contact, rotated plane"); globalQuat = SurgSim::Math::makeRotationQuaternion(-0.3257, Vector3d(-0.4575,-0.8563,0.63457).normalized()); double angle = -35.264389682754654315377000330019*(M_PI/180.0); boxQuat = globalQuat * (SurgSim::Math::makeRotationQuaternion(angle, Vector3d(0.0,1.0,0.0)) * SurgSim::Math::makeRotationQuaternion(-M_PI_4, Vector3d(0.0,0.0,1.0))); boxTrans = Vector3d(std::sqrt(0.75),0.0,0.0); planeQuat = globalQuat * SurgSim::Math::makeRotationQuaternion(-M_PI_2, Vector3d(0.0,0.0,1.0)); planeTrans = boxTrans + globalQuat * Vector3d(-std::sqrt(0.75),0.0,0.0); int expectedNumberOfContacts = 1; int expectedBoxIndicesInContacts[] = {1}; bool collisionNormalIsPlaneNormal = true; doBoxDoubleSidedPlaneTest(box, boxQuat, boxTrans, plane, planeQuat, planeTrans, expectedNumberOfContacts, expectedBoxIndicesInContacts, collisionNormalIsPlaneNormal); } { SCOPED_TRACE("Intersection inside of plane, one contact, rotated plane"); globalQuat = SurgSim::Math::makeRotationQuaternion(-0.3257, Vector3d(-0.4575,-0.8563,0.63457).normalized()); double angle = -35.264389682754654315377000330019*(M_PI/180.0); boxQuat = globalQuat * Quaterniond(SurgSim::Math::makeRotationQuaternion(angle, Vector3d(0.0,1.0,0.0)) * SurgSim::Math::makeRotationQuaternion(-M_PI_4, Vector3d(0.0,0.0,1.0))); boxTrans = Vector3d(std::sqrt(0.75),0.0,0.0); planeQuat = globalQuat * SurgSim::Math::makeRotationQuaternion(-M_PI_2, Vector3d(0.0,0.0,1.0)); planeTrans = boxTrans + globalQuat * Vector3d(-std::sqrt(0.74),0.0,0.0); int expectedNumberOfContacts = 1; int expectedBoxIndicesInContacts[] = {1}; bool collisionNormalIsPlaneNormal = true; doBoxDoubleSidedPlaneTest(box, boxQuat, boxTrans, plane, planeQuat, planeTrans, expectedNumberOfContacts, expectedBoxIndicesInContacts, collisionNormalIsPlaneNormal); } { SCOPED_TRACE("No intersection, box behind rotated plane"); boxQuat = SurgSim::Math::makeRotationQuaternion(0.3252, Vector3d(0.5434,0.634,0.13435).normalized()); boxTrans = Vector3d(-45.5,10.0,350.0); planeQuat = SurgSim::Math::makeRotationQuaternion(-M_PI_2, Vector3d(0.0,0.0,1.0)); planeTrans = Vector3d::Zero(); int expectedNumberOfContacts = 0; int expectedBoxIndicesInContacts[] = {0}; bool collisionNormalIsPlaneNormal = false; doBoxDoubleSidedPlaneTest(box, boxQuat, boxTrans, plane, planeQuat, planeTrans, expectedNumberOfContacts, expectedBoxIndicesInContacts, collisionNormalIsPlaneNormal); } { SCOPED_TRACE("Intersection behind plane, four contacts, rotated plane"); boxQuat = SurgSim::Math::makeRotationQuaternion(0.1436, Vector3d(0.8441,0.3579,0.2168).normalized()); boxTrans = Vector3d(-0.5,0.0,0.0); planeQuat = boxQuat * SurgSim::Math::makeRotationQuaternion(-M_PI_2, Vector3d(0.0,0.0,1.0)); planeTrans = boxTrans + boxQuat * Vector3d(0.5,0.0,0.0); int expectedNumberOfContacts = 4; int expectedBoxIndicesInContacts[] = {4, 5, 6, 7}; bool collisionNormalIsPlaneNormal = false; doBoxDoubleSidedPlaneTest(box, boxQuat, boxTrans, plane, planeQuat, planeTrans, expectedNumberOfContacts, expectedBoxIndicesInContacts, collisionNormalIsPlaneNormal); } { SCOPED_TRACE("Intersection behind plane, two contacts, rotated plane"); globalQuat = SurgSim::Math::makeRotationQuaternion(-0.2356, Vector3d(0.4542,-0.2356,0.1187).normalized()); boxQuat = globalQuat * SurgSim::Math::makeRotationQuaternion(-M_PI_4, Vector3d(0.0,0.0,1.0)); boxTrans = Vector3d(-std::sqrt(0.5),0.0,0.0); planeQuat = globalQuat * SurgSim::Math::makeRotationQuaternion(-M_PI_2, Vector3d(0.0,0.0,1.0)); planeTrans = boxTrans + globalQuat * Vector3d(std::sqrt(0.5),0.0,0.0); int expectedNumberOfContacts = 2; int expectedBoxIndicesInContacts[] = {6, 7}; bool collisionNormalIsPlaneNormal = false; doBoxDoubleSidedPlaneTest(box, boxQuat, boxTrans, plane, planeQuat, planeTrans, expectedNumberOfContacts, expectedBoxIndicesInContacts, collisionNormalIsPlaneNormal); } { SCOPED_TRACE("Intersection behind plane, one contact, rotated plane"); globalQuat = SurgSim::Math::makeRotationQuaternion(1.4576, Vector3d(23.45,-98.24,42.46).normalized()); double angle = -35.264389682754654315377000330019*(M_PI/180.0); boxQuat = globalQuat * SurgSim::Math::makeRotationQuaternion(angle, Vector3d(0.0,0.0,1.0)) * SurgSim::Math::makeRotationQuaternion(-M_PI_4, Vector3d(0.0,1.0,0.0)); boxTrans = Vector3d(-std::sqrt(0.75),0.0,0.0); planeQuat = globalQuat * SurgSim::Math::makeRotationQuaternion(-M_PI_2, Vector3d(0.0,0.0,1.0)); planeTrans = boxTrans + globalQuat * Vector3d(std::sqrt(0.75),0.0,0.0); int expectedNumberOfContacts = 1; int expectedBoxIndicesInContacts[] = {7}; bool collisionNormalIsPlaneNormal = false; doBoxDoubleSidedPlaneTest(box, boxQuat, boxTrans, plane, planeQuat, planeTrans, expectedNumberOfContacts, expectedBoxIndicesInContacts, collisionNormalIsPlaneNormal); } } }; // namespace Collision }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Collision/UnitTests/BoxPlaneContactCalculationTests.cpp000066400000000000000000000236431277777236100303440ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Collision/UnitTests/ContactCalculationTestsCommon.h" #include "SurgSim/Collision/BoxPlaneContact.h" #include "SurgSim/Math/Geometry.h" using SurgSim::Math::BoxShape; using SurgSim::Math::PlaneShape; using SurgSim::Math::Geometry::DistanceEpsilon; namespace SurgSim { namespace Collision { void doBoxPlaneTest(std::shared_ptr box, const Quaterniond& boxQuat, const Vector3d& boxTrans, std::shared_ptr plane, const Quaterniond& planeQuat, const Vector3d& planeTrans, const int expectedNumberOfContacts, const int* expectedBoxIndicesInContacts) { std::shared_ptr boxRep = std::make_shared("Collision Box 0"); boxRep->setShape(box); boxRep->setLocalPose(SurgSim::Math::makeRigidTransform(boxQuat, boxTrans)); std::shared_ptr planeRep = std::make_shared("Collision Plane 0"); planeRep->setShape(plane); planeRep->setLocalPose(SurgSim::Math::makeRigidTransform(planeQuat, planeTrans)); // First calculate the expected contact info. std::list> expectedContacts; if (expectedNumberOfContacts > 0) { generateBoxPlaneContact(&expectedContacts, expectedNumberOfContacts, expectedBoxIndicesInContacts, box, boxTrans, boxQuat, plane, planeTrans, planeQuat); } // Perform collision detection. BoxPlaneContact calcContact; std::shared_ptr pair = std::make_shared(boxRep, planeRep); calcContact.calculateContact(pair); const Vector3d globalPlaneNormal = planeRep->getPose().linear() * plane->getNormal(); const Vector3d planeToBox = boxTrans - planeTrans; Vector3d nearestPointOnPlane; const double distanceBoxPlane = SurgSim::Math::distancePointPlane(planeToBox, globalPlaneNormal, plane->getD(), &nearestPointOnPlane); const Vector3d boxRadii = box->getSize() / 2.0; const double minDepth = -distanceBoxPlane - boxRadii.norm(); const double maxDepth = -distanceBoxPlane + boxRadii.norm(); for (auto contact : pair->getContacts()) { EXPECT_LT(-DistanceEpsilon, contact->depth); EXPECT_LT(minDepth - DistanceEpsilon, contact->depth); EXPECT_GT(maxDepth + DistanceEpsilon, contact->depth); EXPECT_TRUE(eigenEqual(globalPlaneNormal, contact->normal)); } // Compare the contact info. contactsInfoEqualityTest(expectedContacts, pair->getContacts()); } TEST(BoxPlaneContactCalculationTests, UnitTests) { std::shared_ptr box = std::make_shared(1.0, 1.0, 1.0); std::shared_ptr plane = std::make_shared(); SurgSim::Math::Quaterniond boxQuat; SurgSim::Math::Vector3d boxTrans; SurgSim::Math::Quaterniond planeQuat; SurgSim::Math::Vector3d planeTrans; SurgSim::Math::Quaterniond globalQuat; { SCOPED_TRACE("No intersection, box in front of rotated plane"); boxQuat = SurgSim::Math::makeRotationQuaternion(0.5674, Vector3d(0.4332,0.927, 0.13557).normalized()); boxTrans = Vector3d(3.4535,10.0,350.0); planeQuat = SurgSim::Math::makeRotationQuaternion(-M_PI_2, Vector3d(0.0,0.0,1.0)); planeTrans = Vector3d::Zero(); int expectedNumberOfContacts = 0; int expectedBoxIndicesInContacts[] = {0}; doBoxPlaneTest(box, boxQuat, boxTrans, plane, planeQuat, planeTrans, expectedNumberOfContacts, expectedBoxIndicesInContacts); } { SCOPED_TRACE("Intersection in front of plane, four contacts, rotated plane"); boxQuat = SurgSim::Math::makeRotationQuaternion(1.233469, Vector3d(0.91834,0.39687,0.8271).normalized()); boxTrans = Vector3d(0.5,10.0,350.0); planeQuat = boxQuat * SurgSim::Math::makeRotationQuaternion(-M_PI_2, Vector3d(0.0,0.0,1.0)); planeTrans = boxTrans + boxQuat * Vector3d(-0.5,0.0,0.0); int expectedNumberOfContacts = 4; int expectedBoxIndicesInContacts[] = {0, 1, 2, 3}; doBoxPlaneTest(box, boxQuat, boxTrans, plane, planeQuat, planeTrans, expectedNumberOfContacts, expectedBoxIndicesInContacts); } { SCOPED_TRACE("Intersection in front of plane, two contacts, rotated plane"); globalQuat = SurgSim::Math::makeRotationQuaternion(0.8753, Vector3d(0.235345,0.6754,0.4567).normalized()); boxQuat = globalQuat * SurgSim::Math::makeRotationQuaternion(-M_PI_4, Vector3d(0.0,0.0,1.0)); boxTrans = Vector3d(std::sqrt(0.5),230.0,540.0); planeQuat = globalQuat * SurgSim::Math::makeRotationQuaternion(-M_PI_2, Vector3d(0.0,0.0,1.0)); planeTrans = boxTrans + globalQuat * Vector3d(-std::sqrt(0.5),0.0,0.0); int expectedNumberOfContacts = 2; int expectedBoxIndicesInContacts[] = {0, 1}; doBoxPlaneTest(box, boxQuat, boxTrans, plane, planeQuat, planeTrans, expectedNumberOfContacts, expectedBoxIndicesInContacts); } { SCOPED_TRACE("Intersection in front of plane, one contact, rotated plane"); globalQuat = SurgSim::Math::makeRotationQuaternion(-0.3257, Vector3d(-0.4575,-0.8563,0.63457).normalized()); double angle = -35.264389682754654315377000330019*(M_PI/180.0); boxQuat = globalQuat * (SurgSim::Math::makeRotationQuaternion(angle, Vector3d(0.0,1.0,0.0)) * SurgSim::Math::makeRotationQuaternion(-M_PI_4, Vector3d(0.0,0.0,1.0))); boxTrans = Vector3d(std::sqrt(0.75),0.0,0.0); planeQuat = globalQuat * SurgSim::Math::makeRotationQuaternion(-M_PI_2, Vector3d(0.0,0.0,1.0)); planeTrans = boxTrans + globalQuat * Vector3d(-std::sqrt(0.75),0.0,0.0); int expectedNumberOfContacts = 1; int expectedBoxIndicesInContacts[] = {1}; doBoxPlaneTest(box, boxQuat, boxTrans, plane, planeQuat, planeTrans, expectedNumberOfContacts, expectedBoxIndicesInContacts); } { SCOPED_TRACE("Intersection inside of plane, one contact, rotated plane"); globalQuat = SurgSim::Math::makeRotationQuaternion(0.3465, Vector3d(54.4575,76.8563,43.63457).normalized()); double angle = -35.264389682754654315377000330019*(M_PI/180.0); boxQuat = globalQuat * (SurgSim::Math::makeRotationQuaternion(angle, Vector3d(0.0,1.0,0.0)) * SurgSim::Math::makeRotationQuaternion(-M_PI_4, Vector3d(0.0,0.0,1.0))); boxTrans = Vector3d(std::sqrt(0.73),0.0,0.0); planeQuat = globalQuat * SurgSim::Math::makeRotationQuaternion(-M_PI_2, Vector3d(0.0,0.0,1.0)); planeTrans = boxTrans + globalQuat * Vector3d(-std::sqrt(0.75),0.0,0.0); int expectedNumberOfContacts = 1; int expectedBoxIndicesInContacts[] = {1}; doBoxPlaneTest(box, boxQuat, boxTrans, plane, planeQuat, planeTrans, expectedNumberOfContacts, expectedBoxIndicesInContacts); } { SCOPED_TRACE("Intersection in front of plane, two contacts, rotated plane"); globalQuat = SurgSim::Math::makeRotationQuaternion(-0.8753, Vector3d(-1.235345,1.6754,1.4567).normalized()); boxQuat = globalQuat * SurgSim::Math::makeRotationQuaternion(-M_PI_4, Vector3d(0.0,0.0,1.0)); boxTrans = Vector3d(std::sqrt(0.45),230.0,540.0); planeQuat = globalQuat * SurgSim::Math::makeRotationQuaternion(-M_PI_2, Vector3d(0.0,0.0,1.0)); planeTrans = boxTrans + globalQuat * Vector3d(-std::sqrt(0.5),0.0,0.0); int expectedNumberOfContacts = 2; int expectedBoxIndicesInContacts[] = {0, 1}; doBoxPlaneTest(box, boxQuat, boxTrans, plane, planeQuat, planeTrans, expectedNumberOfContacts, expectedBoxIndicesInContacts); } { SCOPED_TRACE("Intersection inside of plane, four contacts, rotated plane"); boxQuat = SurgSim::Math::makeRotationQuaternion(.99763, Vector3d(0.19834,0.93687,0.2871).normalized()); boxTrans = Vector3d(0.23,10.0,350.0); planeQuat = boxQuat * SurgSim::Math::makeRotationQuaternion(-M_PI_2, Vector3d(0.0,0.0,1.0)); planeTrans = boxTrans + boxQuat * Vector3d(-0.5,0.0,0.0); int expectedNumberOfContacts = 4; int expectedBoxIndicesInContacts[] = {0, 1, 2, 3}; doBoxPlaneTest(box, boxQuat, boxTrans, plane, planeQuat, planeTrans, expectedNumberOfContacts, expectedBoxIndicesInContacts); } { SCOPED_TRACE("Intersection inside of plane - case 1, eight contacts, rotated plane"); globalQuat = SurgSim::Math::makeRotationQuaternion(-0.8753, Vector3d(-1.235345,1.6754,1.4567).normalized()); boxQuat = globalQuat * SurgSim::Math::makeRotationQuaternion(-M_PI_4, Vector3d(0.0,0.0,1.0)); boxTrans = Vector3d(0.435,230.0,540.0); planeQuat = globalQuat * SurgSim::Math::makeRotationQuaternion(-M_PI_2, Vector3d(0.0,0.0,1.0)); planeTrans = boxTrans + globalQuat * Vector3d(9.43523,0.0,0.0); int expectedNumberOfContacts = 8; int expectedBoxIndicesInContacts[] = {0, 1, 2, 3, 4, 5, 6, 7, 8}; doBoxPlaneTest(box, boxQuat, boxTrans, plane, planeQuat, planeTrans, expectedNumberOfContacts, expectedBoxIndicesInContacts); } { SCOPED_TRACE("Intersection inside of plane - case 2, eight contacts, rotated plane"); globalQuat = SurgSim::Math::makeRotationQuaternion(1.4576, Vector3d(23.45,-98.24,42.46).normalized()); double angle = -35.264389682754654315377000330019*(M_PI/180.0); boxQuat = globalQuat * SurgSim::Math::makeRotationQuaternion(angle, Vector3d(0.0,0.0,1.0)) * SurgSim::Math::makeRotationQuaternion(-M_PI_4, Vector3d(0.0,1.0,0.0)); boxTrans = Vector3d(0.34,0.0,0.0); planeQuat = globalQuat * SurgSim::Math::makeRotationQuaternion(-M_PI_2, Vector3d(0.0,0.0,1.0)); planeTrans = boxTrans + globalQuat * Vector3d(5.345,0.0,0.0); int expectedNumberOfContacts = 8; int expectedBoxIndicesInContacts[] = {0, 1, 2, 3, 4, 5, 6, 7}; doBoxPlaneTest(box, boxQuat, boxTrans, plane, planeQuat, planeTrans, expectedNumberOfContacts, expectedBoxIndicesInContacts); } } }; // namespace Collision }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Collision/UnitTests/BoxSphereContactCalculationTests.cpp000066400000000000000000000333621277777236100305320ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Collision/UnitTests/ContactCalculationTestsCommon.h" #include "SurgSim/Collision/BoxSphereContact.h" #include "SurgSim/Math/BoxShape.h" #include "SurgSim/Math/SphereShape.h" using SurgSim::Math::BoxShape; using SurgSim::Math::SphereShape; namespace SurgSim { namespace Collision { void doBoxSphereTest(std::shared_ptr box, const Quaterniond& boxQuat, const Vector3d& boxTrans, std::shared_ptr sphere, const Quaterniond& sphereQuat, const Vector3d& sphereTrans, bool hasContacts = false, double expectedDepth = 0.0, Vector3d expectedNormal = Vector3d::UnitX(), Vector3d expectedPenetrationPoint0 = Vector3d::Zero(), Vector3d expectedPenetrationPoint1 = Vector3d::Zero()) { using SurgSim::Math::Geometry::DistanceEpsilon; using SurgSim::Math::Geometry::ScalarEpsilon; std::shared_ptr boxRep = std::make_shared("Collision Box 0"); boxRep->setShape(box); boxRep->setLocalPose(SurgSim::Math::makeRigidTransform(boxQuat, boxTrans)); std::shared_ptr sphereRep = std::make_shared("Collision Sphere 0"); sphereRep->setShape(sphere); sphereRep->setLocalPose(SurgSim::Math::makeRigidTransform(sphereQuat, sphereTrans)); // Perform collision detection. BoxSphereContact calcContact; std::shared_ptr pair = std::make_shared(boxRep, sphereRep); calcContact.calculateContact(pair); // Compare contact info. EXPECT_EQ(hasContacts, pair->hasContacts()); if (pair->hasContacts()) { std::shared_ptr contact = pair->getContacts().front(); EXPECT_TRUE(eigenEqual(expectedNormal, contact->normal)); EXPECT_NEAR(expectedDepth, contact->depth, DistanceEpsilon); EXPECT_TRUE(contact->penetrationPoints.first.rigidLocalPosition.hasValue()); EXPECT_TRUE(contact->penetrationPoints.second.rigidLocalPosition.hasValue()); EXPECT_TRUE(eigenEqual(expectedPenetrationPoint0, contact->penetrationPoints.first.rigidLocalPosition.getValue())); EXPECT_TRUE(eigenEqual(expectedPenetrationPoint1, contact->penetrationPoints.second.rigidLocalPosition.getValue())); } } TEST(BoxSphereContactCalculationTests, UnitTests) { std::shared_ptr box = std::make_shared(1.0, 1.0, 1.0); std::shared_ptr sphere = std::make_shared(1.0); SurgSim::Math::Quaterniond boxQuat; SurgSim::Math::Vector3d boxTrans; SurgSim::Math::Quaterniond sphereQuat; SurgSim::Math::Vector3d sphereTrans; SurgSim::Math::Quaterniond globalQuat; SurgSim::Math::Vector3d globalTrans; { SCOPED_TRACE("No Intersection"); boxQuat.setIdentity(); boxTrans = Vector3d(100.0,0.0,0.0); sphereQuat.setIdentity(); sphereTrans = Vector3d(0.0,0.0,0.0); doBoxSphereTest(box, boxQuat, boxTrans, sphere, sphereQuat, sphereTrans, false); } { SCOPED_TRACE("Intersection on top face"); boxQuat.setIdentity(); boxTrans = Vector3d(0.0,0.0,0.0); sphereQuat.setIdentity(); sphereTrans = Vector3d(0.0,1.0,0.0); globalQuat = SurgSim::Math::makeRotationQuaternion(0.35465, Vector3d(0.3454, 0.78567, 0.234346).normalized()); globalTrans = Vector3d(24.6,-32.67,87.53); boxQuat = globalQuat * boxQuat; boxTrans = globalQuat * boxTrans + globalTrans; sphereQuat = globalQuat * sphereQuat; sphereTrans = globalQuat * sphereTrans + globalTrans; doBoxSphereTest(box, boxQuat, boxTrans, sphere, sphereQuat, sphereTrans, true, 0.5, // depth boxQuat * Vector3d(0.0,-1.0,0.0), // normal points into first representation of CollisionPair Vector3d(0.0,0.5,0.0), // box penetration point Vector3d(0.0,-1.0,0.0)); // sphere penetration point } { SCOPED_TRACE("Sphere center inside box, intersection on top face"); boxQuat.setIdentity(); boxTrans = Vector3d(0.0,0.0,0.0); sphereQuat.setIdentity(); sphereTrans = Vector3d(0.0,0.05,0.0); globalQuat = SurgSim::Math::makeRotationQuaternion(0.35465, Vector3d(0.3454, 0.78567, 0.234346).normalized()); globalTrans = Vector3d(24.6,-32.67,87.53); boxQuat = globalQuat * boxQuat; boxTrans = globalQuat * boxTrans + globalTrans; sphereQuat = globalQuat * sphereQuat; sphereTrans = globalQuat * sphereTrans + globalTrans; doBoxSphereTest(box, boxQuat, boxTrans, sphere, sphereQuat, sphereTrans, true, 1.45, // depth boxQuat * Vector3d(0.0,-1.0,0.0), // normal points into first representation of CollisionPair Vector3d(0.0,0.5,0.0), // box penetration point Vector3d(0.0,-1.0,0.0)); // sphere penetration point } { SCOPED_TRACE("Intersection on bottom face"); boxQuat.setIdentity(); boxTrans = Vector3d(0.0,0.0,0.0); sphereQuat.setIdentity(); sphereTrans = Vector3d(0.3345,-1.2,0.1234); globalQuat = SurgSim::Math::makeRotationQuaternion(-0.35465, Vector3d(18.3454, -27.78567, 23.234346).normalized()); globalTrans = Vector3d(234.6,326.67,987.53); boxQuat = globalQuat * boxQuat; boxTrans = globalQuat * boxTrans + globalTrans; sphereQuat = globalQuat * sphereQuat; sphereTrans = globalQuat * sphereTrans + globalTrans; doBoxSphereTest(box, boxQuat, boxTrans, sphere, sphereQuat, sphereTrans, true, 0.3, // depth boxQuat * Vector3d(0.0,1.0,0.0), // normal points into first representation of CollisionPair Vector3d(0.3345,-0.5,0.1234), // box penetration point Vector3d(0.0,1.0,0.0)); // sphere penetration point } { SCOPED_TRACE("Sphere center inside box, intersection on bottom face"); boxQuat.setIdentity(); boxTrans = Vector3d(0.0,0.0,0.0); sphereQuat.setIdentity(); sphereTrans = Vector3d(0.3345,-0.4,0.1234); globalQuat = SurgSim::Math::makeRotationQuaternion(-0.35465, Vector3d(18.3454, -27.78567, 23.234346).normalized()); globalTrans = Vector3d(234.6,326.67,987.53); boxQuat = globalQuat * boxQuat; boxTrans = globalQuat * boxTrans + globalTrans; sphereQuat = globalQuat * sphereQuat; sphereTrans = globalQuat * sphereTrans + globalTrans; doBoxSphereTest(box, boxQuat, boxTrans, sphere, sphereQuat, sphereTrans, true, 1.1, // depth boxQuat * Vector3d(0.0,1.0,0.0), // normal points into first representation of CollisionPair Vector3d(0.3345,-0.5,0.1234), // box penetration point Vector3d(0.0,1.0,0.0)); // sphere penetration point } { SCOPED_TRACE("Intersection on right face"); boxQuat.setIdentity(); boxTrans = Vector3d(23.545,3.4321,5.3421); sphereQuat.setIdentity(); sphereTrans = boxTrans + Vector3d(1.2324,-0.2354,0.412); globalQuat = SurgSim::Math::makeRotationQuaternion(1.285, Vector3d(23.446, 13.786, 32.254).normalized()); globalTrans = Vector3d(-249.6,532.67,977.53); boxQuat = globalQuat * boxQuat; boxTrans = globalQuat * boxTrans + globalTrans; sphereQuat = globalQuat * sphereQuat; sphereTrans = globalQuat * sphereTrans + globalTrans; doBoxSphereTest(box, boxQuat, boxTrans, sphere, sphereQuat, sphereTrans, true, 0.2676, // depth boxQuat * Vector3d(-1.0,0.0,0.0), // normal points into first representation of CollisionPair Vector3d(0.5,-0.2354,0.412), // box penetration point Vector3d(-1.0,0.0,0.0)); // sphere penetration point } { SCOPED_TRACE("Sphere center inside box, intersection on right face"); boxQuat.setIdentity(); boxTrans = Vector3d(23.545,3.4321,5.3421); sphereQuat.setIdentity(); sphereTrans = boxTrans + Vector3d(0.45,-0.2354,0.412); globalQuat = SurgSim::Math::makeRotationQuaternion(1.285, Vector3d(23.446, 13.786, 32.254).normalized()); globalTrans = Vector3d(-249.6,532.67,977.53); boxQuat = globalQuat * boxQuat; boxTrans = globalQuat * boxTrans + globalTrans; sphereQuat = globalQuat * sphereQuat; sphereTrans = globalQuat * sphereTrans + globalTrans; doBoxSphereTest(box, boxQuat, boxTrans, sphere, sphereQuat, sphereTrans, true, 1.05, // depth boxQuat * Vector3d(-1.0,0.0,0.0), // normal points into first representation of CollisionPair Vector3d(0.5,-0.2354,0.412), // box penetration point Vector3d(-1.0,0.0,0.0)); // sphere penetration point } { SCOPED_TRACE("Intersection on left face"); boxQuat.setIdentity(); boxTrans = Vector3d(876.324,6754.23,7343.76); sphereQuat.setIdentity(); sphereTrans = boxTrans + Vector3d(-1.1223,0.2354,-0.412); globalQuat = SurgSim::Math::makeRotationQuaternion(0.276, Vector3d(0.945, 1.532, 0.896).normalized()); globalTrans = Vector3d(-24.6,32.67,97.53); boxQuat = globalQuat * boxQuat; boxTrans = globalQuat * boxTrans + globalTrans; sphereQuat = globalQuat * sphereQuat; sphereTrans = globalQuat * sphereTrans + globalTrans; doBoxSphereTest(box, boxQuat, boxTrans, sphere, sphereQuat, sphereTrans, true, 0.3777, // depth boxQuat * Vector3d(1.0,0.0,0.0), // normal points into first representation of CollisionPair Vector3d(-0.5,0.2354,-0.412), // box penetration point Vector3d(1.0,0.0,0.0)); // sphere penetration point } { SCOPED_TRACE("Sphere center inside box, intersection on left face"); boxQuat.setIdentity(); boxTrans = Vector3d(876.324,6754.23,7343.76); sphereQuat.setIdentity(); sphereTrans = boxTrans + Vector3d(-0.3,0.2354,-0.012); globalQuat = SurgSim::Math::makeRotationQuaternion(0.276, Vector3d(0.945, 1.532, 0.896).normalized()); globalTrans = Vector3d(-24.6,32.67,97.53); boxQuat = globalQuat * boxQuat; boxTrans = globalQuat * boxTrans + globalTrans; sphereQuat = globalQuat * sphereQuat; sphereTrans = globalQuat * sphereTrans + globalTrans; doBoxSphereTest(box, boxQuat, boxTrans, sphere, sphereQuat, sphereTrans, true, 1.2, // depth boxQuat * Vector3d(1.0,0.0,0.0), // normal points into first representation of CollisionPair Vector3d(-0.5,0.2354,-0.012), // box penetration point Vector3d(1.0,0.0,0.0)); // sphere penetration point } { SCOPED_TRACE("Intersection on front face"); boxQuat.setIdentity(); boxTrans = Vector3d(0.3252,-0.64564,0.12345); sphereQuat.setIdentity(); sphereTrans = boxTrans + Vector3d(0.1564,-0.2987,-0.8986); globalQuat = SurgSim::Math::makeRotationQuaternion(-1.32, Vector3d(235.67, 215.567, 146.345).normalized()); globalTrans = Vector3d(224.6,132.67,27.53); boxQuat = globalQuat * boxQuat; boxTrans = globalQuat * boxTrans + globalTrans; sphereQuat = globalQuat * sphereQuat; sphereTrans = globalQuat * sphereTrans + globalTrans; doBoxSphereTest(box, boxQuat, boxTrans, sphere, sphereQuat, sphereTrans, true, 0.6014, // depth boxQuat * Vector3d(0.0,0.0,1.0), // normal points into first representation of CollisionPair Vector3d(0.1564,-0.2987,-0.5), // box penetration point Vector3d(0.0,0.0,1.0)); // sphere penetration point } { SCOPED_TRACE("Sphere center inside box, intersection on front face"); boxQuat.setIdentity(); boxTrans = Vector3d(0.3252,-0.64564,0.12345); sphereQuat.setIdentity(); sphereTrans = boxTrans + Vector3d(0.1564,-0.2987,-0.3986); globalQuat = SurgSim::Math::makeRotationQuaternion(-1.32, Vector3d(235.67, 215.567, 146.345).normalized()); globalTrans = Vector3d(224.6,132.67,27.53); boxQuat = globalQuat * boxQuat; boxTrans = globalQuat * boxTrans + globalTrans; sphereQuat = globalQuat * sphereQuat; sphereTrans = globalQuat * sphereTrans + globalTrans; doBoxSphereTest(box, boxQuat, boxTrans, sphere, sphereQuat, sphereTrans, true, 1.1014, // depth boxQuat * Vector3d(0.0,0.0,1.0), // normal points into first representation of CollisionPair Vector3d(0.1564,-0.2987,-0.5), // box penetration point Vector3d(0.0,0.0,1.0)); // sphere penetration point } { SCOPED_TRACE("Intersection on back face"); boxQuat.setIdentity(); boxTrans = Vector3d(24.345,-865.325,46.345); sphereQuat.setIdentity(); sphereTrans = boxTrans + Vector3d(-0.2564,-0.4987,0.7986); globalQuat = SurgSim::Math::makeRotationQuaternion(1.2, Vector3d(25.67, -25.567, 16.345).normalized()); globalTrans = Vector3d(24.6,3243.67,9762.53); boxQuat = globalQuat * boxQuat; boxTrans = globalQuat * boxTrans + globalTrans; sphereQuat = globalQuat * sphereQuat; sphereTrans = globalQuat * sphereTrans + globalTrans; doBoxSphereTest(box, boxQuat, boxTrans, sphere, sphereQuat, sphereTrans, true, 0.7014, // depth boxQuat * Vector3d(0.0,0.0,-1.0), // normal points into first representation of CollisionPair Vector3d(-0.2564,-0.4987,0.5), // box penetration point Vector3d(0.0,0.0,-1.0)); // sphere penetration point } { SCOPED_TRACE("Sphere center inside box, intersection on back face"); boxQuat.setIdentity(); boxTrans = Vector3d(24.345,-865.325,46.345); sphereQuat.setIdentity(); sphereTrans = boxTrans + Vector3d(-0.2564,-0.3987,0.48); globalQuat = SurgSim::Math::makeRotationQuaternion(1.2, Vector3d(25.67, -25.567, 16.345).normalized()); globalTrans = Vector3d(24.6,3243.67,9762.53); boxQuat = globalQuat * boxQuat; boxTrans = globalQuat * boxTrans + globalTrans; sphereQuat = globalQuat * sphereQuat; sphereTrans = globalQuat * sphereTrans + globalTrans; doBoxSphereTest(box, boxQuat, boxTrans, sphere, sphereQuat, sphereTrans, true, 1.02, // depth boxQuat * Vector3d(0.0,0.0,-1.0), // normal points into first representation of CollisionPair Vector3d(-0.2564,-0.3987,0.5), // box penetration point Vector3d(0.0,0.0,-1.0)); // sphere penetration point } } }; // namespace Collision }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Collision/UnitTests/CMakeLists.txt000066400000000000000000000043301277777236100241420ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2012-2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. include_directories ( ${gtest_SOURCE_DIR}/include ${gmock_SOURCE_DIR}/include ) set(UNIT_TEST_SOURCES BoxCapsuleContactCalculationTests.cpp BoxDoubleSidedPlaneContactCalculationTests.cpp BoxPlaneContactCalculationTests.cpp BoxSphereContactCalculationTests.cpp CapsuleSphereContactCalculationTests.cpp CollisionPairTests.cpp CompoundShapeContactCalculationTests.cpp ContactCalculationTests.cpp ContactCalculationTestsCommon.cpp DefaultContactCalculationTests.cpp ElementContactFilterTests.cpp OctreeContactCalculationTests.cpp RepresentationTest.cpp RepresentationUtilities.cpp SegmentMeshTriangleMeshContactCalculationTests.cpp SegmentSegmentCcdIntervalCheckTests.cpp SegmentSegmentCcdMovingContactTests.cpp SegmentSegmentCcdStaticContactTests.cpp SegmentSelfContactTests.cpp ShapeCollisionRepresentationTest.cpp SphereDoubleSidedPlaneContactCalculationTests.cpp SpherePlaneContactCalculationTests.cpp SphereSphereContactCalculationTests.cpp TriangleMeshParticlesContactCalculationTests.cpp TriangleMeshPlaneContactCalculationTests.cpp TriangleMeshSurfaceMeshContactCalculationTests.cpp TriangleMeshTriangleMeshContactCalculationTests.cpp ) set(UNIT_TEST_HEADERS ContactCalculationTestsCommon.h RepresentationUtilities.h ) set(LIBS SurgSimCollision SurgSimDataStructures SurgSimMath SurgSimPhysics SurgSimInput ) # Configure the path for the data files configure_file( "${CMAKE_CURRENT_SOURCE_DIR}/config.txt.in" "${CMAKE_CURRENT_BINARY_DIR}/config.txt" ) surgsim_add_unit_tests(SurgSimCollisionTest) set_target_properties(SurgSimCollisionTest PROPERTIES FOLDER "Collision") opensurgsim-0.7.0/SurgSim/Collision/UnitTests/CapsuleSphereContactCalculationTests.cpp000066400000000000000000000077561277777236100314060ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Collision/UnitTests/ContactCalculationTestsCommon.h" #include "SurgSim/Collision/CapsuleSphereContact.h" #include "SurgSim/Math/CapsuleShape.h" #include "SurgSim/Math/SphereShape.h" using SurgSim::Math::CapsuleShape; using SurgSim::Math::SphereShape; namespace SurgSim { namespace Collision { void doCapsuleSphereTest(double capsuleHeight, double capsuleRadius, const Vector3d& capsulePosition, const Quaterniond& capsuleQuat, double sphereRadius, const Vector3d& spherePosition, const Quaterniond& sphereQuat, bool hasContacts, double depth, const Vector3d& sphereProjection = Vector3d::Zero(), const Vector3d& expectedNorm = Vector3d::Zero()) { std::shared_ptr pair = std::make_shared( makeCapsuleRepresentation(capsuleHeight, capsuleRadius, capsuleQuat, capsulePosition), makeSphereRepresentation(sphereRadius, sphereQuat, spherePosition)); CapsuleSphereContact calc; calc.calculateContact(pair); EXPECT_EQ(hasContacts, pair->hasContacts()); if (pair->hasContacts()) { std::shared_ptr contact(pair->getContacts().front()); EXPECT_TRUE(eigenEqual(expectedNorm, contact->normal)); EXPECT_NEAR(depth, contact->depth, SurgSim::Math::Geometry::DistanceEpsilon); EXPECT_TRUE(contact->penetrationPoints.first.rigidLocalPosition.hasValue()); EXPECT_TRUE(contact->penetrationPoints.second.rigidLocalPosition.hasValue()); Vector3d capsuleLocalNormal = capsuleQuat.inverse() * expectedNorm; Vector3d penetrationPoint0(sphereProjection - capsuleLocalNormal * capsuleRadius); Vector3d sphereLocalNormal = sphereQuat.inverse() * expectedNorm; Vector3d penetrationPoint1(sphereLocalNormal * sphereRadius); EXPECT_TRUE(eigenEqual(penetrationPoint0, contact->penetrationPoints.first.rigidLocalPosition.getValue())); EXPECT_TRUE(eigenEqual(penetrationPoint1, contact->penetrationPoints.second.rigidLocalPosition.getValue())); } } TEST(CapsuleSphereContactCalculationTests, UnitTests) { { SCOPED_TRACE("No Intersection"); doCapsuleSphereTest(0.2, 0.1, Vector3d::Zero(), Quaterniond::Identity(), 0.1, Vector3d(1.0, 1.0, 1.0), Quaterniond::Identity(), false, 0.0); } { SCOPED_TRACE("Capsule along Y-axis, intersection with cylindrical part of the capsule"); doCapsuleSphereTest(0.8, 0.5, Vector3d::Zero(), Quaterniond::Identity(), 0.3, Vector3d(0.7, 0, 0), Quaterniond::Identity(), true, 0.1, Vector3d::Zero(), Vector3d(-1.0, 0.0, 0.0)); } { SCOPED_TRACE("Capsule along X-axis, intersection with hemispherical part of the capsule"); doCapsuleSphereTest(0.1, 0.2, Vector3d::Zero(), SurgSim::Math::makeRotationQuaternion(M_PI_2, Vector3d(0.0, 0.0, 1.0)), 0.1, Vector3d(-0.2, 0.0, 0.0), Quaterniond::Identity(), true, 0.15, Vector3d(0.0, 0.05, 0.0), Vector3d(1.0, 0.0, 0.0)); } { SCOPED_TRACE("Intersection, capsule roated along Z-axis clockwise 45 degrees"); Vector3d sphereCenter(2.0, 0.0, 0.0); Vector3d sphereProjection(1.0, 1.0, 0.0); Vector3d expectedNormal = (sphereProjection - sphereCenter).normalized(); doCapsuleSphereTest(2 * M_SQRT2, M_SQRT2, Vector3d::Zero(), SurgSim::Math::makeRotationQuaternion(-M_PI_4, Vector3d(0.0, 0.0, 1.0)), 1.0, sphereCenter, Quaterniond::Identity(), true, 1, Vector3d(0.0, M_SQRT2, 0.0), expectedNormal); } } }; // namespace Collision }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Collision/UnitTests/CollisionPairTests.cpp000066400000000000000000000210471277777236100257040ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Collision/ShapeCollisionRepresentation.h" #include "SurgSim/Collision/Representation.h" #include "SurgSim/Collision/ContactCalculation.h" #include "SurgSim/Collision/CollisionPair.h" #include "SurgSim/Collision/UnitTests/RepresentationUtilities.h" #include "SurgSim/DataStructures/BufferedValue.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Physics/RigidState.h" using SurgSim::Collision::ContactMapType; using SurgSim::DataStructures::Location; using SurgSim::Math::Quaterniond; using SurgSim::Math::RigidTransform3d; using SurgSim::Math::Vector3d; namespace SurgSim { namespace Collision { TEST(CollisionPairTests, InitTest) { // Default Constructor, needs to work for ReuseFrepresentationy EXPECT_NO_THROW({CollisionPair pair;}); std::shared_ptr rep0 = makeSphereRepresentation(1.0); std::shared_ptr rep1 = makeSphereRepresentation(2.0); EXPECT_NO_THROW({CollisionPair pair(rep0, rep0);}); EXPECT_ANY_THROW({CollisionPair pair(nullptr, rep0);}); EXPECT_ANY_THROW({CollisionPair pair(nullptr, nullptr);}); EXPECT_ANY_THROW({CollisionPair pair(rep0, nullptr);}); ASSERT_NO_THROW({CollisionPair pair(rep0, rep1);}); CollisionPair pair(rep0, rep1); EXPECT_EQ(rep0, pair.getFirst()); EXPECT_EQ(rep1, pair.getSecond()); EXPECT_FALSE(pair.hasContacts()); EXPECT_FALSE(pair.isSwapped()); std::pair penetrationPoints; penetrationPoints.first.rigidLocalPosition.setValue(Vector3d(0.1, 0.2, 0.3)); penetrationPoints.second.rigidLocalPosition.setValue(Vector3d(0.4, 0.5, 0.6)); pair.addDcdContact(1.0, Vector3d(1.0, 0.0, 0.0), penetrationPoints); EXPECT_TRUE(pair.hasContacts()); } TEST(CollisionPairTests, SwapTest) { std::shared_ptr rep0 = makeSphereRepresentation(1.0); std::shared_ptr rep1 = makeSphereRepresentation(2.0); CollisionPair pair(rep0, rep1); EXPECT_FALSE(pair.isSwapped()); EXPECT_EQ(rep0.get(), pair.getRepresentations().first.get()); EXPECT_EQ(rep1.get(), pair.getRepresentations().second.get()); pair.swapRepresentations(); EXPECT_TRUE(pair.isSwapped()); pair.swapRepresentations(); EXPECT_FALSE(pair.isSwapped()); std::pair penetrationPoints; penetrationPoints.first.rigidLocalPosition.setValue(Vector3d(0.1, 0.2, 0.3)); penetrationPoints.second.rigidLocalPosition.setValue(Vector3d(0.4, 0.5, 0.6)); pair.addDcdContact(1.0, Vector3d(1.0, 0.0, 0.0), penetrationPoints); EXPECT_TRUE(pair.hasContacts()); EXPECT_ANY_THROW(pair.swapRepresentations()); } TEST(CollisionPairTests, setRepresentationsTest) { std::shared_ptr rep0 = makeSphereRepresentation(1.0); std::shared_ptr rep1 = makeSphereRepresentation(2.0); std::shared_ptr repA = makeSphereRepresentation(99.0); std::shared_ptr repB = makeSphereRepresentation(100.0); CollisionPair pair(repA, repB); EXPECT_FALSE(pair.isSwapped()); pair.swapRepresentations(); pair.setRepresentations(rep0, rep1); EXPECT_EQ(rep0.get(), pair.getRepresentations().first.get()); EXPECT_EQ(rep1.get(), pair.getRepresentations().second.get()); EXPECT_FALSE(pair.isSwapped()); } TEST(CollisionPairTests, CollisionDetectionTypeTest) { std::shared_ptr repCCD1 = makeSphereRepresentation(1.0); repCCD1->setCollisionDetectionType(COLLISION_DETECTION_TYPE_CONTINUOUS); std::shared_ptr repCCD2 = makeSphereRepresentation(2.0); repCCD2->setCollisionDetectionType(COLLISION_DETECTION_TYPE_CONTINUOUS); std::shared_ptr repDCD1 = makeSphereRepresentation(99.0); repDCD1->setCollisionDetectionType(COLLISION_DETECTION_TYPE_DISCRETE); std::shared_ptr repDCD2 = makeSphereRepresentation(100.0); repDCD2->setCollisionDetectionType(COLLISION_DETECTION_TYPE_DISCRETE); std::shared_ptr repNone = makeSphereRepresentation(300.0); repNone->setCollisionDetectionType(COLLISION_DETECTION_TYPE_NONE); { CollisionPair pair(repCCD1, repCCD2); EXPECT_EQ(COLLISION_DETECTION_TYPE_CONTINUOUS, pair.getType()); } { CollisionPair pair(repDCD1, repDCD2); EXPECT_EQ(COLLISION_DETECTION_TYPE_DISCRETE, pair.getType()); } { CollisionPair pair(repCCD1, repDCD1); EXPECT_EQ(COLLISION_DETECTION_TYPE_DISCRETE, pair.getType()); } { CollisionPair pair(repDCD2, repCCD2); EXPECT_EQ(COLLISION_DETECTION_TYPE_DISCRETE, pair.getType()); } { CollisionPair pair(repNone, repDCD1); EXPECT_EQ(COLLISION_DETECTION_TYPE_NONE, pair.getType()); } { CollisionPair pair(repCCD1, repNone); EXPECT_EQ(COLLISION_DETECTION_TYPE_NONE, pair.getType()); } } TEST(CollisionPairTests, SelfCollisionDetectionTypeTest) { std::shared_ptr repCCD = makeSphereRepresentation(1.0); repCCD->setSelfCollisionDetectionType(COLLISION_DETECTION_TYPE_CONTINUOUS); std::shared_ptr repDCD = makeSphereRepresentation(99.0); repDCD->setSelfCollisionDetectionType(COLLISION_DETECTION_TYPE_DISCRETE); std::shared_ptr repNone = makeSphereRepresentation(300.0); repNone->setSelfCollisionDetectionType(COLLISION_DETECTION_TYPE_NONE); { CollisionPair pair(repCCD, repCCD); EXPECT_EQ(COLLISION_DETECTION_TYPE_CONTINUOUS, pair.getType()); } { CollisionPair pair(repDCD, repDCD); EXPECT_EQ(COLLISION_DETECTION_TYPE_DISCRETE, pair.getType()); } { CollisionPair pair(repNone, repNone); EXPECT_EQ(COLLISION_DETECTION_TYPE_NONE, pair.getType()); } } TEST(CollisionPairTests, addContactTest) { auto rep0 = makeSphereRepresentation(1.0); auto rep1 = makeSphereRepresentation(2.0); auto other = makeSphereRepresentation(3.0); auto rep0Collisions = rep0->getCollisions().safeGet(); auto rep1Collisions = rep1->getCollisions().safeGet(); EXPECT_TRUE(rep0Collisions->empty()); EXPECT_TRUE(rep1Collisions->empty()); std::pair penetrationPoints; penetrationPoints.first.rigidLocalPosition.setValue(Vector3d(0.1, 0.2, 0.3)); penetrationPoints.second.rigidLocalPosition.setValue(Vector3d(0.4, 0.5, 0.6)); CollisionPair pair(rep0, rep1); pair.addDcdContact(1.0, Vector3d::UnitY(), penetrationPoints); pair.updateRepresentations(); rep0->update(0.0); rep0->getCollisions().publish(); rep1->update(0.0); rep1->getCollisions().publish(); rep0Collisions = rep0->getCollisions().safeGet(); rep1Collisions = rep1->getCollisions().safeGet(); EXPECT_EQ(1u, rep0Collisions->size()); auto rep0CollisionContacts = rep0Collisions->find(rep1); EXPECT_NE(rep0Collisions->end(), rep0CollisionContacts); EXPECT_EQ(rep1, rep0CollisionContacts->first); std::shared_ptr rep0FirstContact = rep0CollisionContacts->second.front(); EXPECT_EQ(rep0FirstContact->depth, 1.0); EXPECT_TRUE(rep0FirstContact->normal.isApprox(Vector3d::UnitY())); EXPECT_TRUE(rep0FirstContact->penetrationPoints.first.rigidLocalPosition.getValue().isApprox( Vector3d(0.1, 0.2, 0.3))); EXPECT_TRUE(rep0FirstContact->penetrationPoints.second.rigidLocalPosition.getValue().isApprox( Vector3d(0.4, 0.5, 0.6))); EXPECT_TRUE(rep0->collidedWith(rep1)); EXPECT_FALSE(rep0->collidedWith(other)); EXPECT_EQ(1u, rep1Collisions->size()); auto rep1CollisionContacts = rep1Collisions->find(rep0); EXPECT_NE(rep1Collisions->end(), rep1CollisionContacts); EXPECT_EQ(rep0, rep1CollisionContacts->first); std::shared_ptr rep1FirstContact = rep1CollisionContacts->second.front(); EXPECT_EQ(rep1FirstContact->depth, 1.0); EXPECT_TRUE(rep1FirstContact->normal.isApprox(-Vector3d::UnitY())); EXPECT_TRUE(rep1FirstContact->penetrationPoints.first.rigidLocalPosition.getValue().isApprox( Vector3d(0.4, 0.5, 0.6))); EXPECT_TRUE(rep1FirstContact->penetrationPoints.second.rigidLocalPosition.getValue().isApprox( Vector3d(0.1, 0.2, 0.3))); EXPECT_TRUE(rep1->collidedWith(rep0)); EXPECT_FALSE(rep0->collidedWith(other)); rep0->retire(); rep1->retire(); } }; // namespace Collision }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Collision/UnitTests/CompoundShapeContactCalculationTests.cpp000066400000000000000000000113411277777236100313710ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Collision/BoxPlaneContact.h" #include "SurgSim/Collision/BoxSphereContact.h" #include "SurgSim/Collision/CompoundShapeContact.h" #include "SurgSim/Collision/ContactCalculation.h" #include "SurgSim/Collision/ShapeCollisionRepresentation.h" #include "SurgSim/Collision/UnitTests/ContactCalculationTestsCommon.h" #include "SurgSim/Math/Shapes.h" namespace SurgSim { typedef Math::PosedShape> PosedShape; namespace Collision { class CompoundShapeDcdContactTest : public ::testing::Test { void SetUp() override { ContactCalculation::registerDcdContactCalculation(std::make_shared()); ContactCalculation::registerDcdContactCalculation(std::make_shared()); ContactCalculation::registerDcdContactCalculation(std::make_shared( std::make_pair(Math::SHAPE_TYPE_COMPOUNDSHAPE, Math::SHAPE_TYPE_SPHERE))); ContactCalculation::registerDcdContactCalculation(std::make_shared( std::make_pair(Math::SHAPE_TYPE_COMPOUNDSHAPE, Math::SHAPE_TYPE_PLANE))); } void TearDown() override { } }; // The basic principle here is that colliding a set of shapes with each other should give the same // results as colliding a compound representation TEST_F(CompoundShapeDcdContactTest, SingleCube) { auto box = std::make_shared(1.0, 1.0, 1.0); auto sphere = std::make_shared(1.0); auto compoundShape = std::make_shared(); Math::RigidTransform3d identity = Math::RigidTransform3d::Identity(); Math::RigidTransform3d transform = Math::makeRigidTranslation(Math::Vector3d(0.25, 0.25, 0.25)); compoundShape->addShape(box); auto calc1 = ContactCalculation::getDcdContactTable()[Math::SHAPE_TYPE_BOX][Math::SHAPE_TYPE_SPHERE]; auto calc2 = ContactCalculation::getDcdContactTable()[Math::SHAPE_TYPE_COMPOUNDSHAPE][Math::SHAPE_TYPE_SPHERE]; auto expected = calc1->calculateDcdContact(PosedShape(box, identity), PosedShape(sphere, transform)); auto result = calc2->calculateDcdContact(PosedShape(compoundShape, identity), PosedShape(sphere, transform)); ASSERT_EQ(1, expected.size()); contactsInfoEqualityTest(expected, result); } TEST_F(CompoundShapeDcdContactTest, MultipleShapes) { auto box = std::make_shared(1.0, 1.0, 1.0); auto plane = std::make_shared(); auto planePose = Math::makeRigidTransform(Math::makeRotationQuaternion(0.01, Vector3d::UnitX().eval()), Vector3d::Zero()); auto basePose = Math::makeRigidTranslation(Math::Vector3d(0.0, 0.01, 0.0)); auto box1Pose = Math::makeRigidTransform( Math::makeRotationQuaternion(0.01, Vector3d(0.01, 0.01, 0.01)), Vector3d(0.1, 0.1, 0.1)); auto box2Pose = Math::makeRigidTransform( Math::makeRotationQuaternion(-0.01, Vector3d(0.01, 0.01, 0.01)), Vector3d(0.0, -1.0, 0.0)); auto compoundShape = std::make_shared(); compoundShape->addShape(box, box1Pose); compoundShape->addShape(box, box2Pose); auto calc1 = ContactCalculation::getDcdContactTable()[Math::SHAPE_TYPE_BOX][Math::SHAPE_TYPE_PLANE]; auto calc2 = ContactCalculation::getDcdContactTable()[Math::SHAPE_TYPE_COMPOUNDSHAPE][Math::SHAPE_TYPE_PLANE]; auto result = calc2->calculateDcdContact(PosedShape(compoundShape->getTransformed(basePose), basePose), PosedShape(plane, planePose)); std::list> expected = calc1->calculateDcdContact(PosedShape(box, basePose * box1Pose), PosedShape(plane, planePose)); for (auto& contact : expected) { contact->penetrationPoints.first.rigidLocalPosition.setValue(box1Pose * contact->penetrationPoints.first.rigidLocalPosition.getValue()); } auto box2Expected = calc1->calculateDcdContact(PosedShape(box, basePose * box2Pose), PosedShape(plane, planePose)); for (auto& contact : box2Expected) { contact->penetrationPoints.first.rigidLocalPosition.setValue(box2Pose * contact->penetrationPoints.first.rigidLocalPosition.getValue()); } expected.splice(expected.end(), box2Expected); ASSERT_EQ(12, expected.size()); contactsInfoEqualityTest(expected, result); } } }opensurgsim-0.7.0/SurgSim/Collision/UnitTests/ContactCalculationTests.cpp000066400000000000000000000102051277777236100267010ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Collision/ContactCalculation.h" #include "SurgSim/Collision/ShapeCollisionRepresentation.h" #include "SurgSim/Collision/SpherePlaneContact.h" #include "SurgSim/Math/SphereShape.h" #include "SurgSim/Math/PlaneShape.h" #include "SurgSim/Collision/UnitTests/ContactCalculationTestsCommon.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/RigidTransform.h" using SurgSim::Math::Vector3d; using SurgSim::Math::Quaterniond; using SurgSim::Math::RigidTransform3d; using SurgSim::Math::PlaneShape; using SurgSim::Math::SphereShape; namespace SurgSim { typedef Math::PosedShape> PosedShape; namespace Collision { // This uses a concrete contact calculation as a placeholder, the current algorithm // has the check for the pair in the superclass, therefore a test on one class should // be sufficient TEST(ContactCalculationTests, SwappedPairTest) { std::shared_ptr plane = std::make_shared(); std::shared_ptr sphere = std::make_shared(1.0); Vector3d trans(0.0, 0.0, 0.0); Quaterniond quat = Quaterniond::Identity(); std::shared_ptr planeRep = std::make_shared("Plane Shape"); planeRep->setShape(plane); planeRep->setLocalPose(SurgSim::Math::makeRigidTransform(quat, trans)); std::shared_ptr sphereRep = std::make_shared("Sphere Shape"); sphereRep->setShape(sphere); sphereRep->setLocalPose(SurgSim::Math::makeRigidTransform(quat, trans)); std::shared_ptr pair1 = std::make_shared(sphereRep, planeRep); std::shared_ptr pair2 = std::make_shared(planeRep, sphereRep); std::shared_ptr calc = std::make_shared(); EXPECT_NO_THROW(calc->calculateContact(pair1)); EXPECT_NO_THROW(calc->calculateContact(pair2)); } TEST(ContactCalculationTests, SwappedShapeTest) { std::shared_ptr plane = std::make_shared(); std::shared_ptr sphere = std::make_shared(1.0); std::shared_ptr calc = std::make_shared(); auto transform = Math::RigidTransform3d::Identity(); ASSERT_NO_THROW(calc->calculateDcdContact(PosedShape(sphere, transform), PosedShape(plane, transform))); ASSERT_NO_THROW(calc->calculateDcdContact(PosedShape(plane, transform), PosedShape(sphere, transform))); auto planeRep = std::make_shared("Plane Shape"); planeRep->setShape(plane); planeRep->setLocalPose(transform); auto sphereRep = std::make_shared("Sphere Shape"); sphereRep->setShape(sphere); sphereRep->setLocalPose(transform); std::shared_ptr pair1 = std::make_shared(sphereRep, planeRep); calc->calculateContact(pair1); auto contacts1 = calc->calculateDcdContact(PosedShape(sphere, transform), PosedShape(plane, transform)); auto contacts2 = calc->calculateDcdContact(PosedShape(plane, transform), PosedShape(sphere, transform)); contactsInfoEqualityTest(pair1->getContacts(), contacts1); // Contacts2 should be flipped from contacts1 for (auto& contact : contacts2) { contact->normal = -contact->normal; std::swap(contact->penetrationPoints.first, contact->penetrationPoints.second); } contactsInfoEqualityTest(contacts1 , contacts2); } }; // namespace Collision }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Collision/UnitTests/ContactCalculationTestsCommon.cpp000066400000000000000000000225621277777236100300630ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Collision/UnitTests/ContactCalculationTestsCommon.h" using SurgSim::DataStructures::IndexedLocalCoordinate; namespace SurgSim { namespace Collision { ::testing::AssertionResult eigenEqual(const Vector3d& left, const Vector3d& right) { if (std::abs((left - right).norm()) < SurgSim::Math::Geometry::DistanceEpsilon) { return ::testing::AssertionSuccess(); } else { return ::testing::AssertionFailure() << std::endl << "Vectors not close, expected: " << left.transpose() << std::endl << " result: " << right.transpose() << std::endl; } } void checkContactInfo(std::shared_ptr contact, CollisionDetectionType expectedType, double expectedDepth, double expectedTime, const Vector3d& expectedNormal, const Vector3d& expectedPenetrationPointFirst, const Vector3d& expectedPenetrationPointSecond) { EXPECT_EQ(expectedType, contact->type); EXPECT_NEAR(expectedDepth, contact->depth, SurgSim::Math::Geometry::DistanceEpsilon); EXPECT_NEAR(expectedTime, contact->time, SurgSim::Math::Geometry::DistanceEpsilon); EXPECT_TRUE(eigenEqual(expectedNormal, contact->normal)); EXPECT_TRUE(contact->penetrationPoints.first.rigidLocalPosition.hasValue()); EXPECT_TRUE(contact->penetrationPoints.second.rigidLocalPosition.hasValue()); EXPECT_TRUE(eigenEqual(expectedPenetrationPointFirst, contact->penetrationPoints.first.rigidLocalPosition.getValue())); EXPECT_TRUE(eigenEqual(expectedPenetrationPointSecond, contact->penetrationPoints.second.rigidLocalPosition.getValue())); } bool checkMeshLocalCoordinate( const SurgSim::DataStructures::OptionalValue& actualLocalCoordinate, const std::array& vertices, const SurgSim::DataStructures::OptionalValue& expectedLocalCoordinate, const SurgSim::Math::Vector3d& expectedLocalPosition) { bool isEqual = true; EXPECT_EQ(expectedLocalCoordinate.hasValue(), actualLocalCoordinate.hasValue()); if (expectedLocalCoordinate.hasValue() && actualLocalCoordinate.hasValue()) { isEqual &= expectedLocalCoordinate.getValue().index == actualLocalCoordinate.getValue().index; Vector3d barycentricCoordinates = actualLocalCoordinate.getValue().coordinate; isEqual &= eigenEqual(expectedLocalPosition, barycentricCoordinates[0] * vertices[0] + barycentricCoordinates[1] * vertices[1] + barycentricCoordinates[2] * vertices[2]); } return isEqual; } ::testing::AssertionResult isContactPresentInList(std::shared_ptr expected, const std::list>& contactsList, bool expectedHasTriangleContactObject) { using SurgSim::Math::Geometry::ScalarEpsilon; bool contactPresent = false; for (auto it = contactsList.begin(); it != contactsList.end() && !contactPresent; ++it) { // Compare the normals. contactPresent = eigenEqual(expected->normal, it->get()->normal); // Compare the global position of first object. contactPresent &= eigenEqual(expected->penetrationPoints.first.rigidLocalPosition.getValue(), it->get()->penetrationPoints.first.rigidLocalPosition.getValue()); // Compare the global position of second object. contactPresent &= eigenEqual(expected->penetrationPoints.second.rigidLocalPosition.getValue(), it->get()->penetrationPoints.second.rigidLocalPosition.getValue()); // Compare the depth. contactPresent &= std::abs(expected->depth - it->get()->depth) <= ScalarEpsilon; // Compare the time. contactPresent &= std::abs(expected->time - it->get()->time) <= ScalarEpsilon; // Compare the contact types. contactPresent &= (expected->type == it->get()->type); // Check if the optional 'meshLocalCoordinate' are the same. std::shared_ptr triangleContact; std::shared_ptr contact; if (expectedHasTriangleContactObject) { triangleContact = std::static_pointer_cast(expected); contact = *it; } else { triangleContact = std::static_pointer_cast(*it); contact = expected; } contactPresent &= checkMeshLocalCoordinate( contact->penetrationPoints.first.triangleMeshLocalCoordinate, triangleContact->firstVertices, triangleContact->penetrationPoints.first.triangleMeshLocalCoordinate, expected->penetrationPoints.first.rigidLocalPosition.getValue()); contactPresent &= checkMeshLocalCoordinate( contact->penetrationPoints.second.triangleMeshLocalCoordinate, triangleContact->secondVertices, triangleContact->penetrationPoints.second.triangleMeshLocalCoordinate, expected->penetrationPoints.second.rigidLocalPosition.getValue()); } if (contactPresent) { return ::testing::AssertionSuccess(); } else { return ::testing::AssertionFailure() << "Expected contact not found in calculated contacts list:\n" << "Normal: " << expected->normal << "\n" << "First objects' contact point: " << expected->penetrationPoints.first.rigidLocalPosition.getValue() << "\n" << "Second objects' contact point: " << expected->penetrationPoints.second.rigidLocalPosition.getValue() << "\n" << "Depth of penetration: " << expected->depth << "\n"; } } void contactsInfoEqualityTest(const std::list>& expectedContacts, const std::list>& calculatedContacts, bool expectedHasTriangleContactObject) { SCOPED_TRACE("Comparing the contact info."); EXPECT_EQ(expectedContacts.size(), calculatedContacts.size()); for (auto it = expectedContacts.begin(); it != expectedContacts.end(); ++it) { EXPECT_TRUE(isContactPresentInList(*it, calculatedContacts, expectedHasTriangleContactObject)); } } void generateBoxPlaneContact(std::list>* expectedContacts, const int expectedNumberOfContacts, const int* expectedBoxIndicesInContacts, const std::shared_ptr box, const Vector3d& boxTrans, const Quaterniond& boxQuat, const std::shared_ptr plane, const Vector3d& planeTrans, const Quaterniond& planeQuat) { Vector3d vertex; Vector3d boxLocalVertex, planeLocalVertex; Vector3d planeNormalGlobal = planeQuat * plane->getNormal(); Vector3d pointOnPlane = planeTrans + (planeNormalGlobal * plane->getD()); double depth = 0.0; Vector3d collisionNormal = planeNormalGlobal; RigidTransform3d boxTransform = SurgSim::Math::makeRigidTransform(boxQuat, boxTrans); for (int i = 0; i < expectedNumberOfContacts; ++i) { boxLocalVertex = box->getVertex(expectedBoxIndicesInContacts[i]); vertex = boxTransform * boxLocalVertex; depth = -planeNormalGlobal.dot(vertex - pointOnPlane); planeLocalVertex = planeQuat.inverse() * (vertex + planeNormalGlobal * depth - planeTrans); std::pair penetrationPoint; penetrationPoint.first.rigidLocalPosition.setValue(boxLocalVertex); penetrationPoint.second.rigidLocalPosition.setValue(planeLocalVertex); expectedContacts->push_back(std::make_shared( COLLISION_DETECTION_TYPE_DISCRETE, depth, 1.0, Vector3d::Zero(), collisionNormal, penetrationPoint)); } } void generateBoxDoubleSidedPlaneContact(std::list>* expectedContacts, const int expectedNumberOfContacts, const int* expectedBoxIndicesInContacts, const std::shared_ptr box, const Vector3d& boxTrans, const Quaterniond& boxQuat, const std::shared_ptr plane, const Vector3d& planeTrans, const Quaterniond& planeQuat, const bool collisionNormalIsPlaneNormal) { Vector3d vertex; Vector3d boxLocalVertex, planeLocalVertex; Vector3d planeNormalGlobal = planeQuat * plane->getNormal(); Vector3d pointOnPlane = planeTrans + (planeNormalGlobal * plane->getD()); double depth = 0.0; Vector3d collisionNormal = planeNormalGlobal * (collisionNormalIsPlaneNormal ? 1.0 : -1.0); RigidTransform3d boxTransform = SurgSim::Math::makeRigidTransform(boxQuat, boxTrans); for (int i = 0; i < expectedNumberOfContacts; ++i) { boxLocalVertex = box->getVertex(expectedBoxIndicesInContacts[i]); vertex = boxTransform * boxLocalVertex; depth = planeNormalGlobal.dot(vertex - pointOnPlane); planeLocalVertex = planeQuat.inverse() * (vertex - planeNormalGlobal * depth - planeTrans); std::pair penetrationPoint; penetrationPoint.first.rigidLocalPosition.setValue(boxLocalVertex); penetrationPoint.second.rigidLocalPosition.setValue(planeLocalVertex); expectedContacts->push_back(std::make_shared( COLLISION_DETECTION_TYPE_DISCRETE, std::abs(depth), 1.0, Vector3d::Zero(), collisionNormal, penetrationPoint)); } } }; // namespace Collision }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Collision/UnitTests/ContactCalculationTestsCommon.h000066400000000000000000000162361277777236100275310ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_COLLISION_UNITTESTS_CONTACTCALCULATIONTESTSCOMMON_H #define SURGSIM_COLLISION_UNITTESTS_CONTACTCALCULATIONTESTSCOMMON_H #include #include #include "SurgSim/Collision/UnitTests/RepresentationUtilities.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Shape.h" #include "SurgSim/Math/BoxShape.h" #include "SurgSim/Math/PlaneShape.h" #include "SurgSim/Math/DoubleSidedPlaneShape.h" #include "SurgSim/Math/MeshShape.h" #include "SurgSim/Math/SegmentMeshShape.h" #include "SurgSim/Collision/Representation.h" #include "SurgSim/Collision/ContactCalculation.h" #include "SurgSim/Collision/CollisionPair.h" #include "SurgSim/Collision/ShapeCollisionRepresentation.h" #include "SurgSim/Math/Geometry.h" using SurgSim::DataStructures::Location; using SurgSim::Math::Vector3d; using SurgSim::Math::Quaterniond; using SurgSim::Math::RigidTransform3d; using SurgSim::Math::BoxShape; using SurgSim::Math::PlaneShape; using SurgSim::Math::DoubleSidedPlaneShape; using SurgSim::Math::MeshShape; using SurgSim::Math::SegmentMeshShape; namespace SurgSim { namespace Collision { /// Struct to store the triangle vertices along with the Contact struct. struct TriangleContact : public Contact { TriangleContact(const CollisionDetectionType newCollisionDetectionType, const double& newDepth, const double& newTime, const SurgSim::Math::Vector3d& newContact, const SurgSim::Math::Vector3d& newNormal, const std::pair& newPenetrationPoints) : Contact(newCollisionDetectionType, newDepth, newTime, newContact, newNormal, newPenetrationPoints) { } std::array firstVertices; std::array secondVertices; }; /// Function that compares two 3d vectors and asserts that they are equal. /// The tolerance for the numerical values is SurgSim::Math::Geometry::DistanceEpsilon. /// \param left First vector. /// \param right Second vector. ::testing::AssertionResult eigenEqual(const Vector3d& left, const Vector3d& right); /// Function that checks if a given contact contains the given normal, depth and /// penetration points. /// \param contact The contact object that is being checked. /// \param expectedDepth The expected depth. /// \param expectedNormal The expected normal. /// \param expectedPenetrationPointFirst The expected first penetration point. /// \param expectedPenetrationPointSecond The expected second penetration point. void checkContactInfo(std::shared_ptr contact, CollisionDetectionType expectedType, double expectedDepth, double expectedTime, const Vector3d& expectedNormal, const Vector3d& expectedPenetrationPointFirst, const Vector3d& expectedPenetrationPointSecond); /// Function that checks if a given contact is present in the list of given contacts. /// \param expected The expected contact. /// \param contactsList The list of contacts. /// \param expectedHasTriangleContactObject True, if the expected pointer points to a TriangleContact object. /// False, if contactsList points to TriangleContact objects. ::testing::AssertionResult isContactPresentInList(std::shared_ptr expected, const std::list>& contactsList, bool expectedHasTriangleContactObject = false); /// Function that checks if two given list of contacts are the same. /// \param expectedContacts The expected contact lists. /// \param calculatedContacts The list of given contact list. /// \param expectedHasTriangleContactObject True, if the expectedContacts points to TriangleContact objects. /// False, if calculatedContacts points to TriangleContact objects. void contactsInfoEqualityTest(const std::list>& expectedContacts, const std::list>& calculatedContacts, bool expectedHasTriangleContactObject = false); /// Function that generates (no collision detection performed) the contact information between a box and a plane, /// given the box vertex indices that are known to be in contact. /// \param expectedContacts The list where the generated contacts are added. /// \param expectedNumberOfContacts The number of contacts to be generated. /// \param expectedBoxIndicesInContacts The vertex indices of the box which are in collision with the plane. /// \param box The box shape. /// \param boxTrans The box translation in global co-ordinate system. /// \param boxQuat The box orientation in global co-ordinate system. /// \param plane The plane shape. /// \param planeTrans The plane translation in global co-ordinate system. /// \param planeQuat The plane orientation in global co-ordinate system. void generateBoxPlaneContact(std::list>* expectedContacts, const int expectedNumberOfContacts, const int* expectedBoxIndicesInContacts, const std::shared_ptr box, const Vector3d& boxTrans, const Quaterniond& boxQuat, const std::shared_ptr plane, const Vector3d& planeTrans, const Quaterniond& planeQuat); /// Function that generates (no collision detection performed) the contact information between a box and /// a double-sided plane, given the box vertex indices that are known to be in contact. /// \param expectedContacts The list where the generated contacts are added. /// \param expectedNumberOfContacts The number of contacts to be generated. /// \param expectedBoxIndicesInContacts The vertex indices of the box which are in collision /// with the double-sided plane. /// \param box The box shape. /// \param boxTrans The box translation in global co-ordinate system. /// \param boxQuat The box orientation in global co-ordinate system. /// \param plane The double-sided plane shape. /// \param planeTrans The double-sided plane translation in global co-ordinate system. /// \param planeQuat The double-sided plane orientation in global co-ordinate system. /// \param collisionNormalIsPlaneNormal Flag to represent if the box is in collision void generateBoxDoubleSidedPlaneContact(std::list>* expectedContacts, const int expectedNumberOfContacts, const int* expectedBoxIndicesInContacts, const std::shared_ptr box, const Vector3d& boxTrans, const Quaterniond& boxQuat, const std::shared_ptr plane, const Vector3d& planeTrans, const Quaterniond& planeQuat, const bool collisionNormalIsPlaneNormal); }; // namespace Collision }; // namespace SurgSim #endif opensurgsim-0.7.0/SurgSim/Collision/UnitTests/DefaultContactCalculationTests.cpp000066400000000000000000000036471277777236100302220ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Collision/UnitTests/ContactCalculationTestsCommon.h" #include "SurgSim/Collision/DefaultContactCalculation.h" #include "SurgSim/Math/SphereShape.h" namespace SurgSim { namespace Collision { TEST(DefaultContactCalculationTests, UnitTests) { std::shared_ptr sphereShape = std::make_shared(1.0); std::shared_ptr rep0 = std::make_shared("TestSphere 1"); rep0->setShape(sphereShape); rep0->setLocalPose(SurgSim::Math::makeRigidTransform(Quaterniond::Identity(), Vector3d(3.0,0.0,0.0))); std::shared_ptr rep1 = std::make_shared("TestSphere 2"); rep1->setShape(sphereShape); rep1->setLocalPose(SurgSim::Math::makeRigidTransform(Quaterniond::Identity(), Vector3d(0.5,0.0,0.0))); std::shared_ptr pair01 = std::make_shared(rep0, rep1); DefaultContactCalculation calcShouldLog(false); EXPECT_NO_THROW(calcShouldLog.calculateContact(pair01)); EXPECT_FALSE(pair01->hasContacts()); DefaultContactCalculation calcShouldThrow(true); EXPECT_ANY_THROW(calcShouldThrow.calculateContact(pair01)); EXPECT_FALSE(pair01->hasContacts()); } }; // namespace Collision }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Collision/UnitTests/ElementContactFilterTests.cpp000066400000000000000000000213611277777236100272070ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include "SurgSim/Collision/ElementContactFilter.h" #include "SurgSim/Collision/ShapeCollisionRepresentation.h" #include "SurgSim/Collision/CollisionPair.h" #include "SurgSim/Physics/RigidCollisionRepresentation.h" #include "SurgSim/DataStructures/Location.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Math/MeshShape.h" #include "SurgSim/Math/SegmentMeshShape.h" namespace { std::shared_ptr makePair() { auto rep1 = std::make_shared("rep1"); rep1->setShape(std::make_shared()); auto rep2 = std::make_shared("rep2"); rep2->setShape(std::make_shared()); return std::make_shared (rep1, rep2); } std::shared_ptr makeContact( size_t triMesh1, size_t elementMesh1, size_t triMesh2, size_t elementMesh2) { std::pair penetrationPoints; penetrationPoints.first.triangleMeshLocalCoordinate = SurgSim::DataStructures::IndexedLocalCoordinate(triMesh1, SurgSim::Math::Vector3d::Zero()); penetrationPoints.first.elementMeshLocalCoordinate = SurgSim::DataStructures::IndexedLocalCoordinate(elementMesh1, SurgSim::Math::Vector3d::Zero()); penetrationPoints.second.triangleMeshLocalCoordinate = SurgSim::DataStructures::IndexedLocalCoordinate(triMesh2, SurgSim::Math::Vector3d::Zero()); penetrationPoints.second.elementMeshLocalCoordinate = SurgSim::DataStructures::IndexedLocalCoordinate(elementMesh2, SurgSim::Math::Vector3d::Zero()); return std::make_shared( SurgSim::Collision::COLLISION_DETECTION_TYPE_DISCRETE, 0.0, 1.0, SurgSim::Math::Vector3d::Zero(), SurgSim::Math::Vector3d::Zero(), penetrationPoints); } } namespace SurgSim { namespace Collision { class ElementContactFilterTest : public testing::Test { public: void SetUp() { filter = std::make_shared("filter"); pair = makePair(); } std::shared_ptr state; std::shared_ptr filter; std::shared_ptr pair; }; TEST_F(ElementContactFilterTest, Accessors) { { std::shared_ptr rep = std::make_shared("rep"); filter->setValue("Representation", rep); auto result = filter->getValue >("Representation"); EXPECT_EQ(rep.get(), result.get()); } { typedef std::vector, std::vector>> FilterMapType; FilterMapType empty; EXPECT_NO_THROW(filter->setValue("FilterElements", empty)); filter->update(0.0); auto result = filter->getValue("FilterElements"); EXPECT_EQ(0u, result.size()); FilterMapType filters; filters.emplace_back(pair->getRepresentations().first, std::vector(3, 1)); filters.emplace_back(pair->getRepresentations().second, std::vector(5, 1)); filter->setValue("FilterElements", filters); filter->update(0.0); result = filter->getValue("FilterElements"); EXPECT_EQ(2u, result.size()); for (const auto& item : result) { if (item.first.get() == pair->getRepresentations().first.get()) { EXPECT_EQ(3u, item.second.size()); } else if (item.first.get() == pair->getRepresentations().second.get()) { EXPECT_EQ(5u, item.second.size()); } else { ADD_FAILURE() << "Found invalid representation in filters."; } } } } TEST_F(ElementContactFilterTest, SetGetFilter) { auto result = filter->getFilter(nullptr); EXPECT_EQ(0u, result.size()); auto rep = std::make_shared("representation"); rep->setShape(std::make_shared()); result = filter->getFilter(rep); EXPECT_EQ(0u, result.size()); std::vector ignores(2, 1); filter->setFilter(rep, ignores); filter->update(0.0); result = filter->getFilter(rep); EXPECT_EQ(2u, result.size()); std::vector empty; filter->setFilter(rep, empty); filter->update(0.0); result = filter->getFilter(rep); EXPECT_EQ(0u, result.size()); filter->setFilter(pair->getRepresentations().second, ignores); filter->update(0.0); result = filter->getFilter(rep); EXPECT_EQ(0u, result.size()); result = filter->getFilter(pair->getRepresentations().second); EXPECT_EQ(2u, result.size()); } TEST_F(ElementContactFilterTest, Noop) { EXPECT_NO_THROW(filter->filterContacts(state, pair)); std::vector ignores(1, 1); filter->setRepresentation(pair->getRepresentations().first); filter->setFilter(pair->getRepresentations().second, ignores); filter->update(0.0); EXPECT_NO_THROW(filter->filterContacts(state, pair)); pair->addContact(makeContact(0, 0, 0, 0)); EXPECT_NO_THROW(filter->filterContacts(state, pair)); } TEST_F(ElementContactFilterTest, OnlyRemoveMatches) { auto rep3 = std::make_shared("rep3"); rep3->setShape(std::make_shared()); std::vector ignores; ignores.push_back(0); ignores.push_back(2); filter->setRepresentation(pair->getRepresentations().first); filter->setFilter(rep3, ignores); pair->addContact(makeContact(2, 10, 10, 10)); pair->addContact(makeContact(0, 10, 10, 10)); pair->addContact(makeContact(1, 10, 10, 10)); pair->addContact(makeContact(1, 10, 10, 10)); pair->addContact(makeContact(2, 10, 10, 10)); pair->addContact(makeContact(2, 10, 10, 10)); EXPECT_EQ(6u, pair->getContacts().size()); EXPECT_NO_THROW(filter->filterContacts(state, pair)); EXPECT_EQ(6u, pair->getContacts().size()); filter->update(0.0); EXPECT_NO_THROW(filter->filterContacts(state, pair)); EXPECT_EQ(6u, pair->getContacts().size()); } TEST_F(ElementContactFilterTest, RemoveOnTriangleMesh) { std::vector ignores; ignores.push_back(0); ignores.push_back(2); filter->setRepresentation(pair->getRepresentations().first); filter->setFilter(pair->getRepresentations().second, ignores); pair->addContact(makeContact(2, 10, 10, 10)); pair->addContact(makeContact(0, 10, 10, 10)); pair->addContact(makeContact(1, 10, 10, 10)); pair->addContact(makeContact(1, 10, 10, 10)); pair->addContact(makeContact(2, 10, 10, 10)); pair->addContact(makeContact(2, 10, 10, 10)); EXPECT_EQ(6u, pair->getContacts().size()); EXPECT_NO_THROW(filter->filterContacts(state, pair)); EXPECT_EQ(6u, pair->getContacts().size()); filter->update(0.0); EXPECT_NO_THROW(filter->filterContacts(state, pair)); EXPECT_EQ(2u, pair->getContacts().size()); } TEST_F(ElementContactFilterTest, RemoveOnTriangleMeshSwapped) { std::vector ignores; ignores.push_back(0); ignores.push_back(2); filter->setRepresentation(pair->getRepresentations().first); filter->setFilter(pair->getRepresentations().second, ignores); filter->update(0.0); pair->swapRepresentations(); pair->addContact(makeContact(10, 10, 2, 10)); pair->addContact(makeContact(10, 10, 0, 10)); pair->addContact(makeContact(10, 10, 1, 10)); pair->addContact(makeContact(10, 10, 1, 10)); pair->addContact(makeContact(10, 10, 2, 10)); pair->addContact(makeContact(10, 10, 2, 10)); EXPECT_EQ(6u, pair->getContacts().size()); EXPECT_NO_THROW(filter->filterContacts(state, pair)); EXPECT_EQ(2u, pair->getContacts().size()); } TEST_F(ElementContactFilterTest, RemoveOnSegmentMesh) { std::vector ignores; ignores.push_back(0); ignores.push_back(2); filter->setRepresentation(pair->getRepresentations().second); filter->setFilter(pair->getRepresentations().first, ignores); filter->update(0.0); pair->addContact(makeContact(10, 10, 10, 0)); pair->addContact(makeContact(10, 10, 10, 1)); pair->addContact(makeContact(10, 10, 10, 1)); pair->addContact(makeContact(10, 10, 10, 2)); pair->addContact(makeContact(10, 10, 10, 2)); pair->addContact(makeContact(10, 10, 10, 2)); EXPECT_EQ(6u, pair->getContacts().size()); filter->filterContacts(state, pair); EXPECT_EQ(2u, pair->getContacts().size()); } } } opensurgsim-0.7.0/SurgSim/Collision/UnitTests/OctreeContactCalculationTests.cpp000066400000000000000000000372141277777236100300540ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include "SurgSim/Collision/CcdDcdCollision.h" #include "SurgSim/Collision/OctreeCapsuleContact.h" #include "SurgSim/Collision/OctreeDoubleSidedPlaneContact.h" #include "SurgSim/Collision/OctreePlaneContact.h" #include "SurgSim/Collision/OctreeSphereContact.h" #include "SurgSim/Collision/ShapeCollisionRepresentation.h" #include "SurgSim/DataStructures/Location.h" #include "SurgSim/DataStructures/OctreeNode.h" #include "SurgSim/Math/Geometry.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Shape.h" #include "SurgSim/Math/Shapes.h" #include "SurgSim/Math/Vector.h" using SurgSim::Collision::ShapeCollisionRepresentation; using SurgSim::DataStructures::Location; using SurgSim::DataStructures::OctreeNode; using SurgSim::DataStructures::OctreePath; using SurgSim::Math::CapsuleShape; using SurgSim::Math::DoubleSidedPlaneShape; using SurgSim::Math::Geometry::DistanceEpsilon; using SurgSim::Math::makeRigidTransform; using SurgSim::Math::makeRotationQuaternion; using SurgSim::Math::OctreeShape; using SurgSim::Math::PlaneShape; using SurgSim::Math::Quaterniond; using SurgSim::Math::Shape; using SurgSim::Math::SphereShape; using SurgSim::Math::Vector3d; struct OctreeData { std::string name; }; template<> std::string SurgSim::DataStructures::OctreeNode::m_className = "OctreeNode"; namespace SurgSim { namespace Collision { std::list> doCollision(std::shared_ptr octree, const Quaterniond& octreeQuat, const Vector3d& octreeTrans, std::shared_ptr shape, const Quaterniond& shapeQuat, const Vector3d& shapeTrans, ContactCalculation* calculator) { std::shared_ptr octreeRep = std::make_shared("Collision Octree 0"); octreeRep->setShape(octree); octreeRep->setLocalPose(makeRigidTransform(octreeQuat, octreeTrans)); std::shared_ptr shapeRep = std::make_shared("Collision Capsule 0"); shapeRep->setShape(shape); shapeRep->setLocalPose(makeRigidTransform(shapeQuat, shapeTrans)); // Perform collision detection. std::shared_ptr pair = std::make_shared(octreeRep, shapeRep); calculator->calculateContact(pair); return pair->getContacts(); } void checkContacts(const std::list>& contacts, std::shared_ptr> octree) { for (auto contact = contacts.cbegin(); contact != contacts.cend(); ++contact) { Location& location = (*contact)->penetrationPoints.first; ASSERT_TRUE(location.octreeNodePath.hasValue()); ASSERT_TRUE(location.rigidLocalPosition.hasValue()); auto nodeBoundingBox = octree->getNode(location.octreeNodePath.getValue())->getBoundingBox(); double distanceFromBox = nodeBoundingBox.squaredExteriorDistance(location.rigidLocalPosition.getValue()); EXPECT_GT(DistanceEpsilon, distanceFromBox) << "Location of contact is not inside the node"; } } bool nodeInContacts(const std::string& name, const std::list>& contacts, std::shared_ptr> octree) { for (auto contact = contacts.cbegin(); contact != contacts.cend(); ++contact) { OctreePath path = (*contact)->penetrationPoints.first.octreeNodePath.getValue(); std::shared_ptr> node = octree->getNode(path); if (node->data.name == name) { return true; } } return false; } std::shared_ptr> buildTestOctree() { // To keep things simple, create an 4 level octree with leaf nodes of size 1x1x1. // As a result, the root bounding box is 2^4 x 2^4 x 2^4, or 16x16x16 Eigen::AlignedBox boundingBox; const int numLevels = 4; boundingBox.min() = Vector3d::Zero(); boundingBox.max() = Vector3d::Ones() * pow(2.0, numLevels); std::shared_ptr> rootNode = std::make_shared>(boundingBox); OctreeData data; data.name = "center"; rootNode->addData(Vector3d(8.5, 8.5, 8.5), numLevels, data); data.name = "corner0"; rootNode->addData(Vector3d(0.5, 0.5, 0.5), numLevels, data); data.name = "corner1"; rootNode->addData(Vector3d(15.5, 0.5, 0.5), numLevels, data); data.name = "corner2"; rootNode->addData(Vector3d(0.5, 15.5, 0.5), numLevels, data); data.name = "corner3"; rootNode->addData(Vector3d(15.5, 15.5, 0.5), numLevels, data); data.name = "corner4"; rootNode->addData(Vector3d(0.5, 0.5, 15.5), numLevels, data); data.name = "corner5"; rootNode->addData(Vector3d(15.5, 0.5, 15.5), numLevels, data); data.name = "corner6"; rootNode->addData(Vector3d(0.5, 15.5, 15.5), numLevels, data); data.name = "corner7"; rootNode->addData(Vector3d(15.5, 15.5, 15.5), numLevels, data); return rootNode; } TEST(OctreeContactCalculationTests, Capsule) { std::shared_ptr> octree = buildTestOctree(); std::shared_ptr octreeShape = std::make_shared(*octree); std::shared_ptr capsuleShape = std::make_shared(16.0, 1.0); OctreeCapsuleContact calculator; std::list> contacts; { SCOPED_TRACE("No intersection, capsule outside octree"); contacts = doCollision( octreeShape, makeRotationQuaternion(0.0, Vector3d(0.0, 0.0, 1.0)), Vector3d(5.0, 0.0, 0.0), capsuleShape, makeRotationQuaternion(0.0, Vector3d(0.0, 0.0, 1.0)), Vector3d(0.0, 0.0, 0.0), &calculator); EXPECT_EQ(0, contacts.size()); } { SCOPED_TRACE("No intersection, capsule inside octree, but not contacting active nodes"); contacts = doCollision( octreeShape, makeRotationQuaternion(0.0, Vector3d(0.0, 0.0, 1.0)), Vector3d(0.0, 0.0, 0.0), capsuleShape, makeRotationQuaternion(0.0, Vector3d(0.0, 0.0, 1.0)), Vector3d(5.0, 3.0, 0.0), &calculator); EXPECT_EQ(0, contacts.size()); } { SCOPED_TRACE("Intersection, capsule is in the center of the octree"); contacts = doCollision( octreeShape, makeRotationQuaternion(0.0, Vector3d(0.0, 0.0, 1.0)), Vector3d(0.0, 0.0, 0.0), capsuleShape, makeRotationQuaternion(0.0, Vector3d(0.0, 0.0, 1.0)), Vector3d(8.0, 8.0, 8.0), &calculator); checkContacts(contacts, octree); EXPECT_TRUE(nodeInContacts("center", contacts, octree)); } { SCOPED_TRACE("Intersection, capsule intersection 2 nodes"); contacts = doCollision( octreeShape, makeRotationQuaternion(0.0, Vector3d(0.0, 0.0, 1.0)), Vector3d(0.0, 0.0, 0.0), capsuleShape, makeRotationQuaternion(M_PI_2, Vector3d(0.0, 0.0, 1.0)), Vector3d(8.0, 0.0, 0.0), &calculator); checkContacts(contacts, octree); EXPECT_TRUE(nodeInContacts("corner0", contacts, octree)); EXPECT_TRUE(nodeInContacts("corner1", contacts, octree)); } { SCOPED_TRACE("Intersection, octree rotated"); contacts = doCollision( octreeShape, makeRotationQuaternion(M_PI_4, Vector3d(0.0, 0.0, 1.0)), Vector3d(0.0, 0.0, 0.0), capsuleShape, makeRotationQuaternion(0.0, Vector3d(0.0, 0.0, 1.0)), Vector3d(0.0, 12.0, 0.0), &calculator); checkContacts(contacts, octree); EXPECT_TRUE(nodeInContacts("corner3", contacts, octree)); } } TEST(OctreeContactCalculationTests, Plane) { std::shared_ptr> octree = buildTestOctree(); std::shared_ptr octreeShape = std::make_shared(*octree); std::shared_ptr planeShape = std::make_shared(); OctreePlaneContact calculator; std::list> contacts; { SCOPED_TRACE("No intersection, plane outside octree"); contacts = doCollision( octreeShape, makeRotationQuaternion(0.0, Vector3d(0.0, 0.0, 1.0)), Vector3d(0.0, 5.0, 0.0), planeShape, makeRotationQuaternion(0.0, Vector3d(0.0, 0.0, 1.0)), Vector3d(0.0, 0.0, 0.0), &calculator); EXPECT_EQ(0, contacts.size()); } { SCOPED_TRACE("Intersection, plane inside octree"); contacts = doCollision( octreeShape, makeRotationQuaternion(0.0, Vector3d(0.0, 0.0, 1.0)), Vector3d(0.0, 0.0, 0.0), planeShape, makeRotationQuaternion(0.0, Vector3d(0.0, 0.0, 1.0)), Vector3d(0.0, 2.0, 0.0), &calculator); checkContacts(contacts, octree); EXPECT_TRUE(nodeInContacts("corner0", contacts, octree)); EXPECT_TRUE(nodeInContacts("corner1", contacts, octree)); EXPECT_TRUE(nodeInContacts("corner4", contacts, octree)); EXPECT_TRUE(nodeInContacts("corner5", contacts, octree)); } { SCOPED_TRACE("Intersection, rotated octree"); contacts = doCollision( octreeShape, makeRotationQuaternion(M_PI_4, Vector3d(0.0, 0.0, 1.0)), Vector3d(0.0, 0.0, 0.0), planeShape, makeRotationQuaternion(0.0, Vector3d(0.0, 0.0, 1.0)), Vector3d(0.0, 2.0, 0.0), &calculator); checkContacts(contacts, octree); EXPECT_TRUE(nodeInContacts("corner0", contacts, octree)); EXPECT_TRUE(nodeInContacts("corner4", contacts, octree)); } { SCOPED_TRACE("Intersection, rotated plane"); contacts = doCollision( octreeShape, makeRotationQuaternion(0.0, Vector3d(0.0, 0.0, 1.0)), Vector3d(0.0, 0.0, 0.0), planeShape, makeRotationQuaternion(M_PI_4, Vector3d(0.0, 0.0, 1.0)), Vector3d(0.0, 8.0, 0.0), &calculator); checkContacts(contacts, octree); EXPECT_TRUE(nodeInContacts("corner0", contacts, octree)); EXPECT_TRUE(nodeInContacts("corner1", contacts, octree)); EXPECT_TRUE(nodeInContacts("corner3", contacts, octree)); EXPECT_TRUE(nodeInContacts("corner4", contacts, octree)); EXPECT_TRUE(nodeInContacts("corner5", contacts, octree)); } } TEST(OctreeContactCalculationTests, DoubleSidedPlane) { std::shared_ptr> octree = buildTestOctree(); std::shared_ptr octreeShape = std::make_shared(*octree); std::shared_ptr planeShape = std::make_shared(); OctreeDoubleSidedPlaneContact calculator; std::list> contacts; { SCOPED_TRACE("No intersection, plane outside octree"); contacts = doCollision( octreeShape, makeRotationQuaternion(0.0, Vector3d(0.0, 0.0, 1.0)), Vector3d(0.0, 5.0, 0.0), planeShape, makeRotationQuaternion(0.0, Vector3d(0.0, 0.0, 1.0)), Vector3d(0.0, 0.0, 0.0), &calculator); EXPECT_EQ(0, contacts.size()); } { SCOPED_TRACE("Intersection, plane along bottom face"); contacts = doCollision( octreeShape, makeRotationQuaternion(0.0, Vector3d(0.0, 0.0, 1.0)), Vector3d(0.0, 0.0, 0.0), planeShape, makeRotationQuaternion(0.0, Vector3d(0.0, 0.0, 1.0)), Vector3d(0.0, 0.0, 0.0), &calculator); checkContacts(contacts, octree); EXPECT_TRUE(nodeInContacts("corner0", contacts, octree)); EXPECT_TRUE(nodeInContacts("corner1", contacts, octree)); EXPECT_TRUE(nodeInContacts("corner4", contacts, octree)); EXPECT_TRUE(nodeInContacts("corner5", contacts, octree)); } { SCOPED_TRACE("Intersection, plane along diagnol"); contacts = doCollision( octreeShape, makeRotationQuaternion(0.0, Vector3d(0.0, 0.0, 1.0)), Vector3d(0.0, 0.0, 0.0), planeShape, makeRotationQuaternion(M_PI_4, Vector3d(0.0, 0.0, 1.0)), Vector3d(0.0, 0.0, 0.0), &calculator); checkContacts(contacts, octree); EXPECT_TRUE(nodeInContacts("center", contacts, octree)); EXPECT_TRUE(nodeInContacts("corner0", contacts, octree)); EXPECT_TRUE(nodeInContacts("corner3", contacts, octree)); EXPECT_TRUE(nodeInContacts("corner4", contacts, octree)); EXPECT_TRUE(nodeInContacts("corner7", contacts, octree)); } } TEST(OctreeContactCalculationTests, Sphere) { std::shared_ptr> octree = buildTestOctree(); std::shared_ptr octreeShape = std::make_shared(*octree); std::shared_ptr sphereShape = std::make_shared(9); OctreeSphereContact calculator; std::list> contacts; { SCOPED_TRACE("No intersection, sphere outside octree"); contacts = doCollision( octreeShape, makeRotationQuaternion(0.0, Vector3d(0.0, 0.0, 1.0)), Vector3d(0.0, 10.0, 0.0), sphereShape, makeRotationQuaternion(0.0, Vector3d(0.0, 0.0, 1.0)), Vector3d(0.0, 0.0, 0.0), &calculator); EXPECT_EQ(0, contacts.size()); } { SCOPED_TRACE("Intersection, sphere at center of octree"); contacts = doCollision( octreeShape, makeRotationQuaternion(0.0, Vector3d(0.0, 0.0, 1.0)), Vector3d(0.0, 0.0, 0.0), sphereShape, makeRotationQuaternion(0.0, Vector3d(0.0, 0.0, 1.0)), Vector3d(8.0, 8.0, 8.0), &calculator); checkContacts(contacts, octree); EXPECT_TRUE(nodeInContacts("center", contacts, octree)); } { SCOPED_TRACE("Intersection, sphere center on box face"); contacts = doCollision( octreeShape, makeRotationQuaternion(0.0, Vector3d(0.0, 0.0, 1.0)), Vector3d(0.0, 0.0, 0.0), sphereShape, makeRotationQuaternion(0.0, Vector3d(0.0, 0.0, 1.0)), Vector3d(8.0, 8.0, 0.0), &calculator); checkContacts(contacts, octree); EXPECT_TRUE(nodeInContacts("corner0", contacts, octree)); EXPECT_TRUE(nodeInContacts("corner1", contacts, octree)); EXPECT_TRUE(nodeInContacts("corner2", contacts, octree)); EXPECT_TRUE(nodeInContacts("corner3", contacts, octree)); } { SCOPED_TRACE("No intersection, sphere inside octree, but not contacting active nodes"); contacts = doCollision( octreeShape, makeRotationQuaternion(0.0, Vector3d(0.0, 0.0, 1.0)), Vector3d(0.0, 0.0, 4.0), sphereShape, makeRotationQuaternion(M_PI_4, Vector3d(0.0, 0.0, 1.0)), Vector3d(8.0, 8.0, 0.0), &calculator); EXPECT_EQ(0, contacts.size()); } } TEST(OctreeContactCalculationTests, CheckNumberOfContacts) { std::shared_ptr> octree = buildTestOctree(); std::shared_ptr octreeShape = std::make_shared(*octree); std::shared_ptr sphereShape = std::make_shared(9); OctreeSphereContact calculator; std::shared_ptr octreeRep = std::make_shared("Collision Octree 0"); octreeRep->setShape(octreeShape); std::shared_ptr shapeRep = std::make_shared("Collision sphere 0"); shapeRep->setShape(sphereShape); shapeRep->setLocalPose(SurgSim::Math::makeRigidTranslation(Vector3d(8.0, 8.0, 8.0))); std::shared_ptr pair = std::make_shared(octreeRep, shapeRep); calculator.calculateContact(pair); pair->updateRepresentations(); EXPECT_EQ(1, shapeRep->getCollisions().unsafeGet().size()); EXPECT_EQ(1, shapeRep->getCollisions().unsafeGet().count(octreeRep)); octreeRep->retire(); shapeRep->retire(); } }; // namespace Collision }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Collision/UnitTests/RepresentationTest.cpp000066400000000000000000000262251277777236100257570ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include "SurgSim/Collision/CollisionPair.h" #include "SurgSim/Collision/ShapeCollisionRepresentation.h" #include "SurgSim/DataStructures/BufferedValue.h" #include "SurgSim/Framework/BasicSceneElement.h" #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Framework/Scene.h" #include "SurgSim/Framework/ThreadPool.h" #include "SurgSim/Math/PlaneShape.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/SphereShape.h" #include "SurgSim/Math/Vector.h" using SurgSim::Collision::Contact; using SurgSim::Collision::ContactMapType; using SurgSim::Collision::ShapeCollisionRepresentation; using SurgSim::DataStructures::Location; using SurgSim::Framework::BasicSceneElement; using SurgSim::Math::makeRigidTransform; using SurgSim::Math::PlaneShape; using SurgSim::Math::Quaterniond; using SurgSim::Math::RigidTransform3d; using SurgSim::Math::SphereShape; using SurgSim::Math::Vector3d; namespace { const double epsilon = 1e-10; }; namespace SurgSim { namespace Collision { struct RepresentationTest : public ::testing::Test { virtual void SetUp() { runtime = std::make_shared(); scene = runtime->getScene(); element = std::make_shared("Element"); plane = std::make_shared(); sphere = std::make_shared(1.0); planeRep = std::make_shared("PlaneShape"); sphereRep = std::make_shared("SphereShape"); planeRep->setShape(plane); planeRep->setLocalPose(RigidTransform3d::Identity()); sphereRep->setShape(sphere); sphereRep->setLocalPose(RigidTransform3d::Identity()); element->addComponent(planeRep); element->addComponent(sphereRep); scene->addSceneElement(element); planeRep->wakeUp(); sphereRep->wakeUp(); } virtual void TearDown() { } std::shared_ptr runtime; std::shared_ptr scene; std::shared_ptr element; std::shared_ptr plane; std::shared_ptr sphere; std::shared_ptr planeRep; std::shared_ptr sphereRep; }; TEST_F(RepresentationTest, InitTest) { EXPECT_NO_THROW(ShapeCollisionRepresentation("Plane")); } TEST_F(RepresentationTest, CollisionDetectionType) { EXPECT_EQ(COLLISION_DETECTION_TYPE_NONE, sphereRep->getSelfCollisionDetectionType()); EXPECT_EQ(COLLISION_DETECTION_TYPE_DISCRETE, sphereRep->getCollisionDetectionType()); sphereRep->setCollisionDetectionType(COLLISION_DETECTION_TYPE_NONE); EXPECT_EQ(COLLISION_DETECTION_TYPE_NONE, sphereRep->getCollisionDetectionType()); sphereRep->setSelfCollisionDetectionType(COLLISION_DETECTION_TYPE_CONTINUOUS); EXPECT_EQ(COLLISION_DETECTION_TYPE_CONTINUOUS, sphereRep->getSelfCollisionDetectionType()); } TEST_F(RepresentationTest, PoseTest) { RigidTransform3d initialPose = makeRigidTransform(Quaterniond::Identity(), Vector3d(1.0, 2.0, 3.0)); planeRep->setLocalPose(initialPose); EXPECT_TRUE(initialPose.isApprox(planeRep->getPose(), epsilon)); RigidTransform3d pose = makeRigidTransform(Quaterniond::Identity(), Vector3d(0.0, 2.0, 0.0)); element->setPose(pose); EXPECT_TRUE(pose.isApprox(sphereRep->getPose(), epsilon)); sphereRep->setLocalPose(initialPose); EXPECT_TRUE((pose * initialPose).isApprox(sphereRep->getPose(), epsilon)); } TEST_F(RepresentationTest, ShapeTest) { EXPECT_EQ(SurgSim::Math::SHAPE_TYPE_PLANE, planeRep->getShapeType()); EXPECT_EQ(SurgSim::Math::SHAPE_TYPE_SPHERE, sphereRep->getShapeType()); EXPECT_EQ(plane, planeRep->getShape()); EXPECT_EQ(sphere, sphereRep->getShape()); } TEST_F(RepresentationTest, EmptyCollisionTest) { EXPECT_TRUE(planeRep->getCollisions().unsafeGet().empty()); EXPECT_TRUE(sphereRep->getCollisions().unsafeGet().empty()); } TEST_F(RepresentationTest, CollisionTest) { ContactMapType& unsafePlaneCollisions = planeRep->getCollisions().unsafeGet(); ContactMapType& unsafeSphereCollisions = sphereRep->getCollisions().unsafeGet(); std::shared_ptr safePlaneCollisions = planeRep->getCollisions().safeGet(); EXPECT_TRUE(unsafePlaneCollisions.empty()); EXPECT_TRUE(unsafeSphereCollisions.empty()); EXPECT_TRUE(safePlaneCollisions->empty()); std::shared_ptr dummyContact = std::make_shared(COLLISION_DETECTION_TYPE_DISCRETE, 0.0, 1.0, Vector3d::Zero(), Vector3d::Zero(), std::make_pair(Location(), Location())); unsafeSphereCollisions[planeRep].push_back(dummyContact); auto spherePlanePair = unsafeSphereCollisions.find(planeRep); EXPECT_NE(unsafeSphereCollisions.end(), spherePlanePair); std::list> spherePlaneContacts = spherePlanePair->second; EXPECT_EQ(dummyContact, spherePlaneContacts.front()); // Collision is only added to 'sphereRep', thus the plane should have no collisions. EXPECT_TRUE(unsafePlaneCollisions.empty()); // The thread-safe collision map is buffered, so it should still be empty before the publish. EXPECT_TRUE(planeRep->getCollisions().safeGet()->empty()); // After the publish the thread-safe collision map should be up-to-date. planeRep->getCollisions().publish(); EXPECT_EQ(unsafePlaneCollisions, *planeRep->getCollisions().safeGet()); } // addContact method thread-safety test case. // WARNING: Due to the nature of multi-threaded environment, a successful test does not imply thread-safety // also note the lack of reproducibility. TEST_F(RepresentationTest, AddContactsInParallelTest) { auto rep = std::make_shared("collisionRepReference"); auto contact = std::make_shared( COLLISION_DETECTION_TYPE_DISCRETE, 0.1, 1.0, Math::Vector3d::Zero(), Math::Vector3d::Zero(), std::make_pair(DataStructures::Location(), DataStructures::Location())); auto threadPool = Framework::Runtime::getThreadPool(); std::vector> tasks; const size_t numContacts = 500; for (size_t i = 0; i < numContacts; i++) { tasks.push_back(threadPool->enqueue([&rep, &contact]() { rep->addContact(rep, contact); })); } std::for_each(tasks.begin(), tasks.end(), [](std::future& p) { p.get(); }); ASSERT_EQ(numContacts, rep->getCollisions().unsafeGet()[rep].size()); rep->retire(); } TEST_F(RepresentationTest, Ignoring) { EXPECT_TRUE(planeRep->ignore("Test")); EXPECT_FALSE(planeRep->ignore("Test")); EXPECT_TRUE(planeRep->ignore(sphereRep)); EXPECT_TRUE(planeRep->isIgnoring("Test")); EXPECT_TRUE(planeRep->isIgnoring("Element/SphereShape")); EXPECT_FALSE(planeRep->isIgnoring("Invalid")); EXPECT_FALSE(planeRep->isAllowing("Test")); EXPECT_FALSE(planeRep->isAllowing("Element/SphereShape")); EXPECT_TRUE(planeRep->isAllowing("Invalid")); // Remove and add Test back from the ignoring list EXPECT_TRUE(planeRep->allow("Test")); EXPECT_FALSE(planeRep->isIgnoring("Test")); EXPECT_FALSE(planeRep->allow("Test")); EXPECT_TRUE(planeRep->ignore("Test")); EXPECT_TRUE(planeRep->isIgnoring("Test")); std::vector newExclusions; newExclusions.push_back("Test"); newExclusions.push_back("Element/PlaneShape"); sphereRep->setIgnoring(newExclusions); EXPECT_TRUE(sphereRep->isIgnoring("Test")); EXPECT_TRUE(sphereRep->isIgnoring("Element/PlaneShape")); EXPECT_FALSE(sphereRep->isIgnoring("Invalid")); EXPECT_FALSE(sphereRep->isAllowing("Test")); EXPECT_FALSE(sphereRep->isAllowing("Element/PlaneShape")); EXPECT_TRUE(sphereRep->isAllowing("Invalid")); std::vector allowing; allowing.push_back("Invalid"); sphereRep->setAllowing(allowing); EXPECT_FALSE(sphereRep->allow("Invalid")); EXPECT_TRUE(sphereRep->isIgnoring("Test")); EXPECT_TRUE(sphereRep->isIgnoring("Element/PlaneShape")); EXPECT_FALSE(sphereRep->isIgnoring("Invalid")); EXPECT_FALSE(sphereRep->isAllowing("Test")); EXPECT_FALSE(sphereRep->isAllowing("Element/PlaneShape")); EXPECT_TRUE(sphereRep->isAllowing("Invalid")); } TEST_F(RepresentationTest, Allowing) { EXPECT_FALSE(sphereRep->isIgnoring("Other")); EXPECT_FALSE(sphereRep->isIgnoring("CollideWith1")); EXPECT_FALSE(sphereRep->isIgnoring("CollideWith2")); EXPECT_TRUE(sphereRep->isAllowing("Other")); EXPECT_TRUE(sphereRep->isAllowing("CollideWith1")); EXPECT_TRUE(sphereRep->isAllowing("CollideWith2")); std::vector allowing; allowing.push_back("CollideWith1"); allowing.push_back("CollideWith2"); sphereRep->setAllowing(allowing); sphereRep->allow("CollideWith3"); EXPECT_TRUE(sphereRep->isIgnoring("Other")); EXPECT_FALSE(sphereRep->isIgnoring("CollideWith1")); EXPECT_FALSE(sphereRep->isIgnoring("CollideWith2")); EXPECT_FALSE(sphereRep->isIgnoring("CollideWith3")); EXPECT_FALSE(sphereRep->isAllowing("Other")); EXPECT_TRUE(sphereRep->isAllowing("CollideWith1")); EXPECT_TRUE(sphereRep->isAllowing("CollideWith2")); EXPECT_TRUE(sphereRep->isAllowing("CollideWith3")); /// CollideWith1 is will be removed from the 'allowing' EXPECT_TRUE(sphereRep->ignore("CollideWith1")); EXPECT_TRUE(sphereRep->isIgnoring("CollideWith1")); EXPECT_FALSE(sphereRep->isAllowing("CollideWith1")); EXPECT_TRUE(sphereRep->allow("CollideWith1")); EXPECT_TRUE(sphereRep->isAllowing("CollideWith1")); } TEST_F(RepresentationTest, SerializationTest) { std::vector ignoring; ignoring.push_back("Test"); ignoring.push_back("Element/PlaneShape"); EXPECT_NO_THROW(sphereRep->setValue("Ignore", ignoring)); EXPECT_NO_THROW(sphereRep->setValue("CollisionDetectionType", COLLISION_DETECTION_TYPE_CONTINUOUS)); EXPECT_NO_THROW(sphereRep->setValue("SelfCollisionDetectionType", COLLISION_DETECTION_TYPE_DISCRETE)); YAML::Node node; EXPECT_NO_THROW(node = YAML::convert::encode(*sphereRep)); EXPECT_TRUE(node.IsMap()); std::shared_ptr decodedSphereRep; ASSERT_NO_THROW(decodedSphereRep = std::dynamic_pointer_cast( node.as>())); ASSERT_NE(nullptr, decodedSphereRep); EXPECT_TRUE(decodedSphereRep->isIgnoring("Test")); EXPECT_TRUE(decodedSphereRep->isIgnoring("Element/PlaneShape")); EXPECT_EQ(COLLISION_DETECTION_TYPE_CONTINUOUS, sphereRep->getValue("CollisionDetectionType")); EXPECT_EQ(COLLISION_DETECTION_TYPE_CONTINUOUS, sphereRep->getCollisionDetectionType()); EXPECT_EQ(COLLISION_DETECTION_TYPE_DISCRETE, sphereRep->getValue("SelfCollisionDetectionType")); EXPECT_EQ(COLLISION_DETECTION_TYPE_DISCRETE, sphereRep->getSelfCollisionDetectionType()); } }; // namespace Collision }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Collision/UnitTests/RepresentationUtilities.cpp000066400000000000000000000057001277777236100270060ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Collision/UnitTests/RepresentationUtilities.h" #include "SurgSim/Collision/ShapeCollisionRepresentation.h" #include "SurgSim/Collision/Representation.h" #include "SurgSim/Physics/RigidRepresentation.h" #include "SurgSim/Math/Shapes.h" #include "SurgSim/Math/RigidTransform.h" using SurgSim::Math::Quaterniond; using SurgSim::Math::Vector3d; namespace SurgSim { namespace Collision { std::shared_ptr makeSphereRepresentation( const double& radius, const Quaterniond& rotation, const Vector3d& position) { std::shared_ptr sphere = std::make_shared(radius); auto result = std::make_shared("TestSphereShapeCollisionRep"); result->setShape(sphere); result->setLocalPose(SurgSim::Math::makeRigidTransform(rotation, position)); return result; } std::shared_ptr makeDoubleSidedPlaneRepresentation( const Quaterniond& rotation, const Vector3d& position) { std::shared_ptr plane = std::make_shared(); auto result = std::make_shared("TestDoubleSidedPlaneCollisionRep"); result->setShape(plane); result->setLocalPose(SurgSim::Math::makeRigidTransform(rotation, position)); return result; } std::shared_ptr makePlaneRepresentation( const Quaterniond& rotation, const Vector3d& position) { std::shared_ptr plane = std::make_shared(); auto result = std::make_shared("TestPlaneRepresentation"); result->setShape(plane); result->setLocalPose(SurgSim::Math::makeRigidTransform(rotation, position)); return result; } std::shared_ptr makeCapsuleRepresentation( const double& length, const double& radius, const Quaterniond& rotation, const Vector3d& position) { std::shared_ptr capsule = std::make_shared(length, radius); auto result = std::make_shared("TestCapsuleShapeCollisionRep"); result->setShape(capsule); result->setLocalPose(SurgSim::Math::makeRigidTransform(rotation, position)); return result; } }; // Collision }; // SurgSim opensurgsim-0.7.0/SurgSim/Collision/UnitTests/RepresentationUtilities.h000066400000000000000000000040701277777236100264520ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_COLLISION_UNITTESTS_REPRESENTATIONUTILITIES_H #define SURGSIM_COLLISION_UNITTESTS_REPRESENTATIONUTILITIES_H #include #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Collision/Representation.h" namespace SurgSim { namespace Collision { class Representation; std::shared_ptr makeSphereRepresentation( const double& radius = 1.0, const SurgSim::Math::Quaterniond& rotation = SurgSim::Math::Quaterniond::Identity(), const SurgSim::Math::Vector3d& position = SurgSim::Math::Vector3d::Zero()); std::shared_ptr makeDoubleSidedPlaneRepresentation( const SurgSim::Math::Quaterniond& rotation = SurgSim::Math::Quaterniond::Identity(), const SurgSim::Math::Vector3d& position = SurgSim::Math::Vector3d::Zero()); std::shared_ptr makePlaneRepresentation( const SurgSim::Math::Quaterniond& rotation = SurgSim::Math::Quaterniond::Identity(), const SurgSim::Math::Vector3d& position = SurgSim::Math::Vector3d::Zero()); std::shared_ptr makeCapsuleRepresentation( const double& length = 1.0, const double& radius = 1.0, const SurgSim::Math::Quaterniond& rotation = SurgSim::Math::Quaterniond::Identity(), const SurgSim::Math::Vector3d& position = SurgSim::Math::Vector3d::Zero()); }; // namespace Collision }; // namespace SurgSim #endif opensurgsim-0.7.0/SurgSim/Collision/UnitTests/SegmentMeshTriangleMeshContactCalculationTests.cpp000066400000000000000000001037321277777236100333540ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Collision/SegmentMeshTriangleMeshContact.h" #include "SurgSim/Collision/UnitTests/ContactCalculationTestsCommon.h" #include "SurgSim/DataStructures/EmptyData.h" #include "SurgSim/DataStructures/IndexedLocalCoordinate.h" #include "SurgSim/DataStructures/SegmentMesh.h" #include "SurgSim/DataStructures/TriangleMesh.h" #include "SurgSim/Math/Vector.h" using SurgSim::DataStructures::SegmentMeshPlain; using SurgSim::DataStructures::TriangleMeshPlain; using SurgSim::Math::RigidTransform3d; using SurgSim::Math::Vector3d; namespace SurgSim { namespace Collision { class SegmentMeshTriangleMeshContactCalculationTests : public ::testing::Test { protected: RigidTransform3d buildRigidTransform(double angle, double axisX, double axisY, double axisZ, double translationX, double translationY, double translationZ) { using SurgSim::Math::makeRigidTransform; using SurgSim::Math::makeRotationQuaternion; return makeRigidTransform(makeRotationQuaternion(angle, Vector3d(axisX, axisY, axisZ).normalized()), Vector3d(translationX, translationY, translationZ)); } void SetUp() override { m_cubeSize = 1.0; m_segmentRadius = 0.1; m_transforms.push_back(std::pair( RigidTransform3d::Identity(), "Identity")); m_transforms.push_back(std::pair( buildRigidTransform(1.234, 17.04, 2.047, 3.052, 23.34, 42.45, 83.68), "Transform 1")); m_transforms.push_back(std::pair( buildRigidTransform(-5.34, 41.03, -2.52, -3.84, -3.45, 66.47, 29.34), "Transform 2")); m_transforms.push_back(std::pair( buildRigidTransform(0.246, -9.42, -4.86, 2.469, 37.68, -34.6, -17.1), "Transform 3")); m_transforms.push_back(std::pair( buildRigidTransform(-0.85, 3.344, 8.329, -97.4, 9.465, 0.275, -95.9), "Transform 4")); } /// \return The SegmentMeshShape with a line mesh. std::shared_ptr createSegmentMeshShape() { static const int segmentNumPoints = 3; static const double segmentPoints[3][3] = { {0.0, -0.5, 0.0}, {0.0, 0.0, 0.0}, {0.0, 0.5, 0.0} }; static const int segmentNumEdges = 2; static const int segmentEdges[2][2] = { {0, 1}, {1, 2} }; auto mesh = std::make_shared(); for (int i = 0; i < segmentNumPoints; ++i) { Vector3d p; p[0] = segmentPoints[i][0]; p[1] = segmentPoints[i][1]; p[2] = segmentPoints[i][2]; SegmentMeshPlain::VertexType v(p); mesh->addVertex(v); } for (int i = 0; i < segmentNumEdges; ++i) { std::array edgePoints; for (int j = 0; j < 2; j++) { edgePoints[j] = segmentEdges[i][j]; } SegmentMeshPlain::EdgeType e(edgePoints); mesh->addEdge(e); } return std::make_shared(*mesh, m_segmentRadius); } /// \return The MeshShape with a cube mesh. std::shared_ptr createCubeMeshShape() { // Create a Mesh Cube static const int cubeNumPoints = 8; static const double cubePoints[8][3] = { {-0.5, -0.5, -0.5}, {0.5, -0.5, -0.5}, {0.5, 0.5, -0.5}, {-0.5, 0.5, -0.5}, {-0.5, -0.5, 0.5}, {0.5, -0.5, 0.5}, {0.5, 0.5, 0.5}, {-0.5, 0.5, 0.5} }; static const int cubeNumEdges = 12; static const int cubeEdges[12][2] = { {0, 1}, {3, 2}, {4, 5}, {7, 6}, // +X {0, 3}, {1, 2}, {4, 7}, {5, 6}, // +Y {0, 4}, {1, 5}, {2, 6}, {3, 7} // +Z }; static const int cubeNumTriangles = 12; static const int cubeTrianglesCCW[12][3] = { {6, 2, 3}, {6, 3, 7}, // Top ( 0 1 0) [6237] {0, 1, 5}, {0, 5, 4}, // Bottom ( 0 -1 0) [0154] {4, 5, 6}, {4, 6, 7}, // Front ( 0 0 1) [4567] {0, 3, 2}, {0, 2, 1}, // Back ( 0 0 -1) [0321] {1, 2, 6}, {1, 6, 5}, // Right ( 1 0 0) [1265] {0, 4, 7}, {0, 7, 3} // Left (-1 0 0) [0473] }; auto mesh = std::make_shared(); for (int i = 0; i < cubeNumPoints; ++i) { Vector3d p; p[0] = cubePoints[i][0]; p[1] = cubePoints[i][1]; p[2] = cubePoints[i][2]; TriangleMeshPlain::VertexType v(p); mesh->addVertex(v); } for (int i = 0; i < cubeNumEdges; ++i) { std::array edgePoints; for (int j = 0; j < 2; j++) { edgePoints[j] = cubeEdges[i][j]; } TriangleMeshPlain::EdgeType e(edgePoints); mesh->addEdge(e); } for (int i = 0; i < cubeNumTriangles; ++i) { std::array trianglePoints; for (int j = 0; j < 3; j++) { trianglePoints[j] = cubeTrianglesCCW[i][j]; } TriangleMeshPlain::TriangleType t(trianglePoints); mesh->addTriangle(t); } return std::make_shared(*mesh); } void testSegmentMeshTriangleMeshDCD(std::string scenario, std::shared_ptr segmentMeshShape, RigidTransform3d segmentMeshShapeTransform, std::shared_ptr meshShape, RigidTransform3d meshShapeTransform, int expectedNumContacts = 0) { for (const auto& transform : m_transforms) { SCOPED_TRACE("Scenario: " + scenario + ", for transform: " + transform.second); std::shared_ptr segmentMeshRep = std::make_shared("Collision Mesh - Segment"); segmentMeshRep->setShape(segmentMeshShape); segmentMeshRep->setLocalPose(transform.first * segmentMeshShapeTransform); std::shared_ptr triangleMeshRep = std::make_shared("Collision Mesh - Triangle"); triangleMeshRep->setShape(meshShape); triangleMeshRep->setLocalPose(transform.first * meshShapeTransform); // Perform collision detection. SegmentMeshTriangleMeshContact calcContact; std::shared_ptr pair = std::make_shared(segmentMeshRep, triangleMeshRep); calcContact.calculateContact(pair); // Verify for correct contact generation. auto contacts = pair->getContacts(); // Check if the number of generated contacts was the expected number. EXPECT_EQ(expectedNumContacts, contacts.size()); if (contacts.size() > 0) { // Find correction that need to be applied to remove all intersections. Vector3d correction = Vector3d::Zero(); for (auto &contact : contacts) { Vector3d intersection = contact->normal * contact->depth; // Project intersection on correction and subtract that component from intersection. if (!correction.isZero()) { Vector3d correctionNormalized = correction.normalized(); intersection -= intersection.dot(correctionNormalized) * correctionNormalized; } // Add the unique component of intersection to overall correction. correction += intersection; } // Change this correction to a RigidTransform3d RigidTransform3d correctionTransform = Math::makeRigidTranslation(correction); // Applying this correction to the two shapes should remove all intersections. segmentMeshRep->setLocalPose(correctionTransform * transform.first * segmentMeshShapeTransform); // Perform collision detection. std::shared_ptr pair2 = std::make_shared(segmentMeshRep, triangleMeshRep); calcContact.calculateContact(pair2); // There should be no intersections. EXPECT_EQ(0, pair2->getContacts().size()); } } } // Cube size double m_cubeSize; // Segment radius double m_segmentRadius; private: // List of random transformations and a string to identify it. std::vector> m_transforms; }; TEST_F(SegmentMeshTriangleMeshContactCalculationTests, NonintersectionTest) { using SurgSim::Math::makeRigidTransform; using SurgSim::Math::makeRigidTranslation; using SurgSim::Math::makeRotationQuaternion; double epsilonTrans = 0.001; auto segmentMeshShape = createSegmentMeshShape(); auto meshShape = createCubeMeshShape(); RigidTransform3d segmentMeshShapeTransform; RigidTransform3d meshShapeTransform; // No rotations { segmentMeshShapeTransform = makeRigidTranslation(Vector3d(0.0, m_cubeSize + m_segmentRadius + epsilonTrans, 0.0)); meshShapeTransform.setIdentity(); testSegmentMeshTriangleMeshDCD("No intersection (segment mesh above box)", segmentMeshShape, segmentMeshShapeTransform, meshShape, meshShapeTransform); } { segmentMeshShapeTransform = makeRigidTranslation(Vector3d(0.0, -m_cubeSize - m_segmentRadius - epsilonTrans, 0.0)); meshShapeTransform.setIdentity(); testSegmentMeshTriangleMeshDCD("No intersection (segment mesh below box)", segmentMeshShape, segmentMeshShapeTransform, meshShape, meshShapeTransform); } { segmentMeshShapeTransform = makeRigidTranslation(Vector3d(-m_cubeSize * 0.5 - m_segmentRadius - epsilonTrans, 0.0, 0.0)); meshShapeTransform.setIdentity(); testSegmentMeshTriangleMeshDCD("No intersection (segment mesh left of box)", segmentMeshShape, segmentMeshShapeTransform, meshShape, meshShapeTransform); } { segmentMeshShapeTransform = makeRigidTranslation(Vector3d(m_cubeSize * 0.5 + m_segmentRadius + epsilonTrans, 0.0, 0.0)); meshShapeTransform.setIdentity(); testSegmentMeshTriangleMeshDCD("No intersection (segment mesh right of box)", segmentMeshShape, segmentMeshShapeTransform, meshShape, meshShapeTransform); } { segmentMeshShapeTransform = makeRigidTranslation(Vector3d(0.0, 0.0, -m_cubeSize * 0.5 - m_segmentRadius - epsilonTrans)); meshShapeTransform.setIdentity(); testSegmentMeshTriangleMeshDCD("No intersection (segment mesh behind box)", segmentMeshShape, segmentMeshShapeTransform, meshShape, meshShapeTransform); } { segmentMeshShapeTransform = makeRigidTranslation(Vector3d(0.0, 0.0, m_cubeSize * 0.5 + m_segmentRadius + epsilonTrans)); meshShapeTransform.setIdentity(); testSegmentMeshTriangleMeshDCD("No intersection (segment mesh in front of box)", segmentMeshShape, segmentMeshShapeTransform, meshShape, meshShapeTransform); } // Rotation about X { double offset = (1.0 + std::sin(M_PI_4)) * m_cubeSize * 0.5; segmentMeshShapeTransform = buildRigidTransform(M_PI_4, 1.0, 0.0, 0.0, 0.0, offset + m_segmentRadius + epsilonTrans, 0.0); meshShapeTransform.setIdentity(); testSegmentMeshTriangleMeshDCD("No intersection (rotated (about x-axis) segment mesh above box)", createSegmentMeshShape(), segmentMeshShapeTransform, createCubeMeshShape(), meshShapeTransform); } { double offset = (1.0 + std::sin(M_PI_4)) * m_cubeSize * 0.5; segmentMeshShapeTransform = buildRigidTransform(M_PI_4, 1.0, 0.0, 0.0, 0.0, -offset - m_segmentRadius - epsilonTrans, 0.0); meshShapeTransform.setIdentity(); testSegmentMeshTriangleMeshDCD("No intersection (rotated (about x-axis) segment mesh below box)", segmentMeshShape, segmentMeshShapeTransform, meshShape, meshShapeTransform); } { segmentMeshShapeTransform = buildRigidTransform(M_PI_4, 1.0, 0.0, 0.0, m_cubeSize * 0.5 + m_segmentRadius + epsilonTrans, 0.0, 0.0); meshShapeTransform.setIdentity(); testSegmentMeshTriangleMeshDCD("No intersection (rotated (about x-axis) segment mesh right of box)", segmentMeshShape, segmentMeshShapeTransform, meshShape, meshShapeTransform); } { segmentMeshShapeTransform = buildRigidTransform(M_PI_4, 1.0, 0.0, 0.0, -m_cubeSize * 0.5 - m_segmentRadius - epsilonTrans, 0.0, 0.0); meshShapeTransform.setIdentity(); testSegmentMeshTriangleMeshDCD("No intersection (rotated (about x-axis) segment mesh left of box)", segmentMeshShape, segmentMeshShapeTransform, meshShape, meshShapeTransform); } { double offset = (1.0 + std::sin(M_PI_4)) * m_cubeSize * 0.5; segmentMeshShapeTransform = buildRigidTransform(M_PI_4, 1.0, 0.0, 0.0,0.0, 0.0, offset + m_segmentRadius + epsilonTrans); meshShapeTransform.setIdentity(); testSegmentMeshTriangleMeshDCD("No intersection (rotated (about x-axis) segment mesh in front of box)", segmentMeshShape, segmentMeshShapeTransform, meshShape, meshShapeTransform); } { double offset = (1.0 + std::sin(M_PI_4)) * m_cubeSize * 0.5; segmentMeshShapeTransform = buildRigidTransform(M_PI_4, 1.0, 0.0, 0.0,0.0, 0.0, -offset - m_segmentRadius - epsilonTrans); meshShapeTransform.setIdentity(); testSegmentMeshTriangleMeshDCD("No intersection (rotated (about x-axis) segment mesh behind box)", segmentMeshShape, segmentMeshShapeTransform, meshShape, meshShapeTransform); } // Rotation about Y { segmentMeshShapeTransform = buildRigidTransform(M_PI_4, 0.0, 1.0, 0.0, 0.0, m_cubeSize + m_segmentRadius + epsilonTrans, 0.0); meshShapeTransform.setIdentity(); testSegmentMeshTriangleMeshDCD("No intersection (rotated (about y-axis) segment mesh above box)", segmentMeshShape, segmentMeshShapeTransform, meshShape, meshShapeTransform); } { segmentMeshShapeTransform = buildRigidTransform(M_PI_4, 0.0, 1.0, 0.0, 0.0, -m_cubeSize - m_segmentRadius - epsilonTrans, 0.0); meshShapeTransform.setIdentity(); testSegmentMeshTriangleMeshDCD("No intersection (rotated (about y-axis) segment mesh below box)", segmentMeshShape, segmentMeshShapeTransform, meshShape, meshShapeTransform); } { segmentMeshShapeTransform = buildRigidTransform(M_PI_4, 0.0, 1.0, 0.0, m_cubeSize * 0.5 + m_segmentRadius + epsilonTrans, 0.0, 0.0); meshShapeTransform.setIdentity(); testSegmentMeshTriangleMeshDCD("No intersection (rotated (about y-axis) segment mesh right of box)", segmentMeshShape, segmentMeshShapeTransform, meshShape, meshShapeTransform); } { segmentMeshShapeTransform = buildRigidTransform(M_PI_4, 0.0, 1.0, 0.0, -m_cubeSize * 0.5 - m_segmentRadius - epsilonTrans, 0.0, 0.0); meshShapeTransform.setIdentity(); testSegmentMeshTriangleMeshDCD("No intersection (rotated (about y-axis) segment mesh left of box)", segmentMeshShape, segmentMeshShapeTransform, meshShape, meshShapeTransform); } { segmentMeshShapeTransform = buildRigidTransform(M_PI_4, 0.0, 1.0, 0.0, 0.0, 0.0, m_cubeSize * 0.5 + m_segmentRadius + epsilonTrans); meshShapeTransform.setIdentity(); testSegmentMeshTriangleMeshDCD("No intersection (rotated (about y-axis) segment mesh in front of box)", segmentMeshShape, segmentMeshShapeTransform, meshShape, meshShapeTransform); } { segmentMeshShapeTransform = buildRigidTransform(M_PI_4, 0.0, 1.0, 0.0, 0.0, 0.0, -m_cubeSize * 0.5 - m_segmentRadius - epsilonTrans); meshShapeTransform.setIdentity(); testSegmentMeshTriangleMeshDCD("No intersection (rotated (about y-axis) segment mesh behind box)", segmentMeshShape, segmentMeshShapeTransform, meshShape, meshShapeTransform); } // Rotation about Z { double offset = (1.0 + std::sin(M_PI_4)) * m_cubeSize * 0.5; segmentMeshShapeTransform = buildRigidTransform(M_PI_4, 0.0, 0.0, 1.0, 0.0, offset + m_segmentRadius + epsilonTrans, 0.0); meshShapeTransform.setIdentity(); testSegmentMeshTriangleMeshDCD("No intersection (rotated (about z-axis) segment mesh above box)", segmentMeshShape, segmentMeshShapeTransform, meshShape, meshShapeTransform); } { double offset = (1.0 + std::sin(M_PI_4)) * m_cubeSize * 0.5; segmentMeshShapeTransform = buildRigidTransform(M_PI_4, 0.0, 0.0, 1.0, 0.0, -offset - m_segmentRadius - epsilonTrans, 0.0); meshShapeTransform.setIdentity(); testSegmentMeshTriangleMeshDCD("No intersection (rotated (about z-axis) segment mesh below box)", segmentMeshShape, segmentMeshShapeTransform, meshShape, meshShapeTransform); } { double offset = (1.0 + std::sin(M_PI_4)) * m_cubeSize * 0.5; segmentMeshShapeTransform = buildRigidTransform(M_PI_4, 0.0, 0.0, 1.0, offset + m_segmentRadius + epsilonTrans, 0.0, 0.0); meshShapeTransform.setIdentity(); testSegmentMeshTriangleMeshDCD("No intersection (rotated (about z-axis) segment mesh right of box)", segmentMeshShape, segmentMeshShapeTransform, meshShape, meshShapeTransform); } { double offset = (1.0 + std::sin(M_PI_4)) * m_cubeSize * 0.5; segmentMeshShapeTransform = buildRigidTransform(M_PI_4, 0.0, 0.0, 1.0, -offset - m_segmentRadius - epsilonTrans, 0.0, 0.0); meshShapeTransform.setIdentity(); testSegmentMeshTriangleMeshDCD("No intersection (rotated (about z-axis) segment mesh left of box)", segmentMeshShape, segmentMeshShapeTransform, meshShape, meshShapeTransform); } { segmentMeshShapeTransform = buildRigidTransform(M_PI_4, 0.0, 0.0, 1.0, 0.0, 0.0, m_cubeSize * 0.5 + m_segmentRadius + epsilonTrans); meshShapeTransform.setIdentity(); testSegmentMeshTriangleMeshDCD("No intersection (rotated (about z-axis) segment mesh in front of box)", segmentMeshShape, segmentMeshShapeTransform, meshShape, meshShapeTransform); } { segmentMeshShapeTransform = buildRigidTransform(M_PI_4, 0.0, 0.0, 1.0, 0.0, 0.0, -m_cubeSize * 0.5 - m_segmentRadius - epsilonTrans); meshShapeTransform.setIdentity(); testSegmentMeshTriangleMeshDCD("No intersection (rotated (about z-axis) segment mesh behind box)", segmentMeshShape, segmentMeshShapeTransform, meshShape, meshShapeTransform); } } TEST_F(SegmentMeshTriangleMeshContactCalculationTests, IntersectionTest) { using SurgSim::Math::makeRigidTransform; using SurgSim::Math::makeRigidTranslation; using SurgSim::Math::makeRotationQuaternion; double epsilonTrans = -0.001; auto segmentMeshShape = createSegmentMeshShape(); auto meshShape = createCubeMeshShape(); RigidTransform3d segmentMeshShapeTransform; RigidTransform3d meshShapeTransform; // No rotations { segmentMeshShapeTransform = makeRigidTranslation(Vector3d(0.0, m_cubeSize + m_segmentRadius + epsilonTrans, 0.0)); meshShapeTransform.setIdentity(); testSegmentMeshTriangleMeshDCD("Intersection (segment mesh above box)", segmentMeshShape, segmentMeshShapeTransform, meshShape, meshShapeTransform, 2); // bottom segment intersects top two triangles } { segmentMeshShapeTransform = makeRigidTranslation(Vector3d(0.0, -m_cubeSize - m_segmentRadius - epsilonTrans, 0.0)); meshShapeTransform.setIdentity(); testSegmentMeshTriangleMeshDCD("Intersection (segment mesh below box)", segmentMeshShape, segmentMeshShapeTransform, meshShape, meshShapeTransform, 2); // top segment intersects bottom two triangles } { segmentMeshShapeTransform = makeRigidTranslation(Vector3d(-m_cubeSize * 0.5 - m_segmentRadius - epsilonTrans, 0.0, 0.0)); meshShapeTransform.setIdentity(); testSegmentMeshTriangleMeshDCD("Intersection (segment mesh left of box)", segmentMeshShape, segmentMeshShapeTransform, meshShape, meshShapeTransform, 6); // both segments intersect left two, one top and one bottom triangles } { segmentMeshShapeTransform = makeRigidTranslation(Vector3d(m_cubeSize * 0.5 + m_segmentRadius + epsilonTrans, 0.0, 0.0)); meshShapeTransform.setIdentity(); testSegmentMeshTriangleMeshDCD("Intersection (segment mesh right of box)", segmentMeshShape, segmentMeshShapeTransform, meshShape, meshShapeTransform, 6); // both segments intersect right two, one top and one bottom triangles } { segmentMeshShapeTransform = makeRigidTranslation(Vector3d(0.0, 0.0, -m_cubeSize * 0.5 - m_segmentRadius - epsilonTrans)); meshShapeTransform.setIdentity(); testSegmentMeshTriangleMeshDCD("Intersection (segment mesh behind box)", segmentMeshShape, segmentMeshShapeTransform, meshShape, meshShapeTransform, 6); // both segments intersect farthest two, one top and one bottom triangles } { segmentMeshShapeTransform = makeRigidTranslation(Vector3d(0.0, 0.0, m_cubeSize * 0.5 + m_segmentRadius + epsilonTrans)); meshShapeTransform.setIdentity(); testSegmentMeshTriangleMeshDCD("Intersection (segment mesh in front of box)", segmentMeshShape, segmentMeshShapeTransform, meshShape, meshShapeTransform, 6); // both segments intersect nearest two, one top and one bottom triangles } // Rotation about X { double offset = (1.0 + std::sin(M_PI_4)) * m_cubeSize * 0.5; segmentMeshShapeTransform = buildRigidTransform(M_PI_4, 1.0, 0.0, 0.0, 0.0, offset + m_segmentRadius + epsilonTrans, 0.0); meshShapeTransform.setIdentity(); testSegmentMeshTriangleMeshDCD("Intersection (rotated (about x-axis) segment mesh above box)", createSegmentMeshShape(), segmentMeshShapeTransform, createCubeMeshShape(), meshShapeTransform, 1); // bottom segment intersect one top triangle } { double offset = (1.0 + std::sin(M_PI_4)) * m_cubeSize * 0.5; segmentMeshShapeTransform = buildRigidTransform(M_PI_4, 1.0, 0.0, 0.0, 0.0, -offset - m_segmentRadius - epsilonTrans, 0.0); meshShapeTransform.setIdentity(); testSegmentMeshTriangleMeshDCD("Intersection (rotated (about x-axis) segment mesh below box)", segmentMeshShape, segmentMeshShapeTransform, meshShape, meshShapeTransform, 1); // top segment intersect one bottom triangle } { segmentMeshShapeTransform = buildRigidTransform(M_PI_4, 1.0, 0.0, 0.0, m_cubeSize * 0.5 + m_segmentRadius + epsilonTrans, 0.0, 0.0); meshShapeTransform.setIdentity(); testSegmentMeshTriangleMeshDCD("Intersection (rotated (about x-axis) segment mesh right of box)", segmentMeshShape, segmentMeshShapeTransform, meshShape, meshShapeTransform, 4); // both segments intersect two right side triangles } { segmentMeshShapeTransform = buildRigidTransform(M_PI_4, 1.0, 0.0, 0.0, -m_cubeSize * 0.5 - m_segmentRadius - epsilonTrans, 0.0, 0.0); meshShapeTransform.setIdentity(); testSegmentMeshTriangleMeshDCD("Intersection (rotated (about x-axis) segment mesh left of box)", segmentMeshShape, segmentMeshShapeTransform, meshShape, meshShapeTransform, 4); // both segments intersect two left side triangles } { double offset = (1.0 + std::sin(M_PI_4)) * m_cubeSize * 0.5; segmentMeshShapeTransform = buildRigidTransform(M_PI_4, 1.0, 0.0, 0.0,0.0, 0.0, offset + m_segmentRadius + epsilonTrans); meshShapeTransform.setIdentity(); testSegmentMeshTriangleMeshDCD("Intersection (rotated (about x-axis) segment mesh in front of box)", segmentMeshShape, segmentMeshShapeTransform, meshShape, meshShapeTransform, 1); // top segment intersects one of the nearer triangle } { double offset = (1.0 + std::sin(M_PI_4)) * m_cubeSize * 0.5; segmentMeshShapeTransform = buildRigidTransform(M_PI_4, 1.0, 0.0, 0.0,0.0, 0.0, -offset - m_segmentRadius - epsilonTrans); meshShapeTransform.setIdentity(); testSegmentMeshTriangleMeshDCD("Intersection (rotated (about x-axis) segment mesh behind box)", segmentMeshShape, segmentMeshShapeTransform, meshShape, meshShapeTransform, 1); // bottom segment intersects one of the farther triangle } // Rotation about Y { segmentMeshShapeTransform = buildRigidTransform(M_PI_4, 0.0, 1.0, 0.0, 0.0, m_cubeSize + m_segmentRadius + epsilonTrans, 0.0); meshShapeTransform.setIdentity(); testSegmentMeshTriangleMeshDCD("Intersection (rotated (about y-axis) segment mesh above box)", segmentMeshShape, segmentMeshShapeTransform, meshShape, meshShapeTransform, 2); // bottom segment intersects top two triangles } { segmentMeshShapeTransform = buildRigidTransform(M_PI_4, 0.0, 1.0, 0.0, 0.0, -m_cubeSize - m_segmentRadius - epsilonTrans, 0.0); meshShapeTransform.setIdentity(); testSegmentMeshTriangleMeshDCD("Intersection (rotated (about y-axis) segment mesh below box)", segmentMeshShape, segmentMeshShapeTransform, meshShape, meshShapeTransform, 2); // top segment intersects bottom two triangles } { segmentMeshShapeTransform = buildRigidTransform(M_PI_4, 0.0, 1.0, 0.0, m_cubeSize * 0.5 + m_segmentRadius + epsilonTrans, 0.0, 0.0); meshShapeTransform.setIdentity(); testSegmentMeshTriangleMeshDCD("Intersection (rotated (about y-axis) segment mesh right of box)", segmentMeshShape, segmentMeshShapeTransform, meshShape, meshShapeTransform, 6); // both segments intersect left two, one top and one bottom triangles } { segmentMeshShapeTransform = buildRigidTransform(M_PI_4, 0.0, 1.0, 0.0, -m_cubeSize * 0.5 - m_segmentRadius - epsilonTrans, 0.0, 0.0); meshShapeTransform.setIdentity(); testSegmentMeshTriangleMeshDCD("Intersection (rotated (about y-axis) segment mesh left of box)", segmentMeshShape, segmentMeshShapeTransform, meshShape, meshShapeTransform, 6); // both segments intersect right two, one top and one bottom triangles } { segmentMeshShapeTransform = buildRigidTransform(M_PI_4, 0.0, 1.0, 0.0, 0.0, 0.0, m_cubeSize * 0.5 + m_segmentRadius + epsilonTrans); meshShapeTransform.setIdentity(); testSegmentMeshTriangleMeshDCD("Intersection (rotated (about y-axis) segment mesh in front of box)", segmentMeshShape, segmentMeshShapeTransform, meshShape, meshShapeTransform, 6); // both segments intersect nearest two, one top and one bottom triangles } { segmentMeshShapeTransform = buildRigidTransform(M_PI_4, 0.0, 1.0, 0.0, 0.0, 0.0, -m_cubeSize * 0.5 - m_segmentRadius - epsilonTrans); meshShapeTransform.setIdentity(); testSegmentMeshTriangleMeshDCD("Intersection (rotated (about y-axis) segment mesh behind box)", segmentMeshShape, segmentMeshShapeTransform, meshShape, meshShapeTransform, 6); // both segments intersect farthest two, one top and one bottom triangles } // Rotation about Z { double offset = (1.0 + std::sin(M_PI_4)) * m_cubeSize * 0.5; segmentMeshShapeTransform = buildRigidTransform(M_PI_4, 0.0, 0.0, 1.0, 0.0, offset + m_segmentRadius + epsilonTrans, 0.0); meshShapeTransform.setIdentity(); testSegmentMeshTriangleMeshDCD("Intersection (rotated (about z-axis) segment mesh above box)", segmentMeshShape, segmentMeshShapeTransform, meshShape, meshShapeTransform, 1); // bottom segment intersect one of the top triangles } { double offset = (1.0 + std::sin(M_PI_4)) * m_cubeSize * 0.5; segmentMeshShapeTransform = buildRigidTransform(M_PI_4, 0.0, 0.0, 1.0, 0.0, -offset - m_segmentRadius - epsilonTrans, 0.0); meshShapeTransform.setIdentity(); testSegmentMeshTriangleMeshDCD("Intersection (rotated (about z-axis) segment mesh below box)", segmentMeshShape, segmentMeshShapeTransform, meshShape, meshShapeTransform, 1); // top segment intersects one of the bottom triangles } { double offset = (1.0 + std::sin(M_PI_4)) * m_cubeSize * 0.5; segmentMeshShapeTransform = buildRigidTransform(M_PI_4, 0.0, 0.0, 1.0, offset + m_segmentRadius + epsilonTrans, 0.0, 0.0); meshShapeTransform.setIdentity(); testSegmentMeshTriangleMeshDCD("Intersection (rotated (about z-axis) segment mesh right of box)", segmentMeshShape, segmentMeshShapeTransform, meshShape, meshShapeTransform, 1); // bottom segment intersects one of the right side triangles } { double offset = (1.0 + std::sin(M_PI_4)) * m_cubeSize * 0.5; segmentMeshShapeTransform = buildRigidTransform(M_PI_4, 0.0, 0.0, 1.0, -offset - m_segmentRadius - epsilonTrans, 0.0, 0.0); meshShapeTransform.setIdentity(); testSegmentMeshTriangleMeshDCD("Intersection (rotated (about z-axis) segment mesh left of box)", segmentMeshShape, segmentMeshShapeTransform, meshShape, meshShapeTransform, 1); // top segment intersects one of the left side triangles } { segmentMeshShapeTransform = buildRigidTransform(M_PI_4, 0.0, 0.0, 1.0, 0.0, 0.0, m_cubeSize * 0.5 + m_segmentRadius + epsilonTrans); meshShapeTransform.setIdentity(); testSegmentMeshTriangleMeshDCD("Intersection (rotated (about z-axis) segment mesh in front of box)", segmentMeshShape, segmentMeshShapeTransform, meshShape, meshShapeTransform, 4); // both segments intersect the two nearest triangles } { segmentMeshShapeTransform = buildRigidTransform(M_PI_4, 0.0, 0.0, 1.0, 0.0, 0.0, -m_cubeSize * 0.5 - m_segmentRadius - epsilonTrans); meshShapeTransform.setIdentity(); testSegmentMeshTriangleMeshDCD("Intersection (rotated (about z-axis) segment mesh behind box)", segmentMeshShape, segmentMeshShapeTransform, meshShape, meshShapeTransform, 4); // both segments intersect the two farthest triangles } } TEST_F(SegmentMeshTriangleMeshContactCalculationTests, IntersectionWithSegmentAxisTest) { using SurgSim::Math::makeRigidTransform; using SurgSim::Math::makeRigidTranslation; using SurgSim::Math::makeRotationQuaternion; double epsilonTrans = -0.001; auto segmentMeshShape = createSegmentMeshShape(); auto meshShape = createCubeMeshShape(); RigidTransform3d segmentMeshShapeTransform; RigidTransform3d meshShapeTransform; // No rotations { double offset = m_segmentRadius + 0.001; segmentMeshShapeTransform = makeRigidTranslation(Vector3d(offset, m_cubeSize + epsilonTrans, -offset)); meshShapeTransform.setIdentity(); testSegmentMeshTriangleMeshDCD("Intersection with axis (segment mesh above box)", segmentMeshShape, segmentMeshShapeTransform, meshShape, meshShapeTransform, 1); // bottom segment intersects one of the top two triangles } { double offset = m_segmentRadius + 0.001; segmentMeshShapeTransform = makeRigidTranslation(Vector3d(offset, -m_cubeSize - epsilonTrans, -offset)); meshShapeTransform.setIdentity(); testSegmentMeshTriangleMeshDCD("Intersection with axis (segment mesh below box)", segmentMeshShape, segmentMeshShapeTransform, meshShape, meshShapeTransform, 1); // top segment intersects one of the bottom two triangles } // Rotation about X { double offset = (1.0 + std::sin(M_PI_4)) * m_cubeSize * 0.5; segmentMeshShapeTransform = buildRigidTransform(M_PI_4, 1.0, 0.0, 0.0, 0.0, offset + epsilonTrans, 0.0); meshShapeTransform.setIdentity(); testSegmentMeshTriangleMeshDCD("Intersection with axis (rotated (about x-axis) segment mesh above box)", createSegmentMeshShape(), segmentMeshShapeTransform, createCubeMeshShape(), meshShapeTransform, 1); // bottom segment intersects one of the top triangles } { double offset = (1.0 + std::sin(M_PI_4)) * m_cubeSize * 0.5; segmentMeshShapeTransform = buildRigidTransform(M_PI_4, 1.0, 0.0, 0.0, 0.0, -offset - epsilonTrans, 0.0); meshShapeTransform.setIdentity(); testSegmentMeshTriangleMeshDCD("Intersection with axis (rotated (about x-axis) segment mesh below box)", segmentMeshShape, segmentMeshShapeTransform, meshShape, meshShapeTransform, 1); // top segment intersect one bottom triangle } { double offset = (1.0 + std::sin(M_PI_4)) * m_cubeSize * 0.5; segmentMeshShapeTransform = buildRigidTransform(M_PI_4, 1.0, 0.0, 0.0,0.0, 0.0, offset + epsilonTrans); meshShapeTransform.setIdentity(); testSegmentMeshTriangleMeshDCD("Intersection with axis (rotated (about x-axis) segment mesh in front of box)", segmentMeshShape, segmentMeshShapeTransform, meshShape, meshShapeTransform, 1); // top segment intersects one of the nearer triangle } { double offset = (1.0 + std::sin(M_PI_4)) * m_cubeSize * 0.5; segmentMeshShapeTransform = buildRigidTransform(M_PI_4, 1.0, 0.0, 0.0,0.0, 0.0, -offset - epsilonTrans); meshShapeTransform.setIdentity(); testSegmentMeshTriangleMeshDCD("Intersection with axis (rotated (about x-axis) segment mesh behind box)", segmentMeshShape, segmentMeshShapeTransform, meshShape, meshShapeTransform, 1); // bottom segment intersects one of the farther triangle } // Rotation about Y { double offset = m_segmentRadius + 0.001; segmentMeshShapeTransform = buildRigidTransform(M_PI_4, 0.0, 1.0, 0.0, offset, m_cubeSize + epsilonTrans, -offset); meshShapeTransform.setIdentity(); testSegmentMeshTriangleMeshDCD("Intersection with axis (rotated (about y-axis) segment mesh above box)", segmentMeshShape, segmentMeshShapeTransform, meshShape, meshShapeTransform, 1); // bottom segment intersects one of the top two triangles } { double offset = m_segmentRadius + 0.001; segmentMeshShapeTransform = buildRigidTransform(M_PI_4, 0.0, 1.0, 0.0, offset, -m_cubeSize - epsilonTrans, -offset); meshShapeTransform.setIdentity(); testSegmentMeshTriangleMeshDCD("Intersection with axis (rotated (about y-axis) segment mesh below box)", segmentMeshShape, segmentMeshShapeTransform, meshShape, meshShapeTransform, 1); // top segment intersects one of the bottom two triangles } // Rotation about Z { double offset = (1.0 + std::sin(M_PI_4)) * m_cubeSize * 0.5; segmentMeshShapeTransform = buildRigidTransform(M_PI_4, 0.0, 0.0, 1.0, 0.0, offset + epsilonTrans, 0.0); meshShapeTransform.setIdentity(); testSegmentMeshTriangleMeshDCD("Intersection with axis (rotated (about z-axis) segment mesh above box)", segmentMeshShape, segmentMeshShapeTransform, meshShape, meshShapeTransform, 1); // bottom segment intersect one of the top triangles } { double offset = (1.0 + std::sin(M_PI_4)) * m_cubeSize * 0.5; segmentMeshShapeTransform = buildRigidTransform(M_PI_4, 0.0, 0.0, 1.0, 0.0, -offset - epsilonTrans, 0.0); meshShapeTransform.setIdentity(); testSegmentMeshTriangleMeshDCD("Intersection with axis (rotated (about z-axis) segment mesh below box)", segmentMeshShape, segmentMeshShapeTransform, meshShape, meshShapeTransform, 1); // top segment intersects one of the bottom triangles } { double offset = (1.0 + std::sin(M_PI_4)) * m_cubeSize * 0.5; segmentMeshShapeTransform = buildRigidTransform(M_PI_4, 0.0, 0.0, 1.0, offset + epsilonTrans, 0.0, 0.0); meshShapeTransform.setIdentity(); testSegmentMeshTriangleMeshDCD("Intersection with axis (rotated (about z-axis) segment mesh right of box)", segmentMeshShape, segmentMeshShapeTransform, meshShape, meshShapeTransform, 1); // bottom segment intersects one of the right side triangles } { double offset = (1.0 + std::sin(M_PI_4)) * m_cubeSize * 0.5; segmentMeshShapeTransform = buildRigidTransform(M_PI_4, 0.0, 0.0, 1.0, -offset - epsilonTrans, 0.0, 0.0); meshShapeTransform.setIdentity(); testSegmentMeshTriangleMeshDCD("Intersection with axis (rotated (about z-axis) segment mesh left of box)", segmentMeshShape, segmentMeshShapeTransform, meshShape, meshShapeTransform, 1); // top segment intersects one of the left side triangles } } }; // namespace Collision }; // namespace Surgsim opensurgsim-0.7.0/SurgSim/Collision/UnitTests/SegmentSegmentCcdIntervalCheckTests.cpp000066400000000000000000000655321277777236100311460ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the SegmentSegmentCcdCheck functions. #include #include #include "SurgSim/Collision/SegmentSegmentCcdIntervalCheck.h" #include "SurgSim/Math/LinearMotionArithmetic.h" namespace SurgSim { namespace Collision { namespace { double epsilon = 1.0e-10; } template class SegmentSegmentCcdIntervalCheckTests : public ::testing::Test { }; TEST(SegmentSegmentCcdIntervalCheckTests, Initialization) { // Set up some arbitrary locations to check the class initialization. std::array pStart = {Math::Vector3d(-1.0, 1.0, 0.0), Math::Vector3d(-0.5, 1.5, 1.5)}; std::array pEnd = {Math::Vector3d(-1.0, 1.0, 1.5), Math::Vector3d(-0.5, 1.5, 3.0)}; std::array qStart = {Math::Vector3d(2.0, 1.0, 4.0), Math::Vector3d(1.0, 3.5, 2.5)}; std::array qEnd = {Math::Vector3d(0.0, 1.0, 2.0), Math::Vector3d(-2.0, 1.5, 3.5)}; ASSERT_NO_THROW(SegmentSegmentCcdIntervalCheck status(pStart, pEnd, qStart, qEnd, 1.0e-06, 2.0e-06, 3.0e-06, 4.0e-06)); SegmentSegmentCcdIntervalCheck status(pStart, pEnd, qStart, qEnd, 1.0e-06, 2.0e-06, 3.0e-06, 4.0e-06); Math::Vector3d p11 = status.p1T0(); Math::Vector3d p12 = status.p1T1(); Math::Vector3d p21 = status.p2T0(); Math::Vector3d p22 = status.p2T1(); Math::Vector3d q11 = status.q1T0(); Math::Vector3d q12 = status.q1T1(); Math::Vector3d q21 = status.q2T0(); Math::Vector3d q22 = status.q2T1(); EXPECT_TRUE(p11.isApprox(Math::Vector3d(-1.0, 1.0, 0.0), epsilon)); EXPECT_TRUE(p12.isApprox(Math::Vector3d(-1.0, 1.0, 1.5), epsilon)); EXPECT_TRUE(p21.isApprox(Math::Vector3d(-0.5, 1.5, 1.5), epsilon)); EXPECT_TRUE(p22.isApprox(Math::Vector3d(-0.5, 1.5, 3.0), epsilon)); EXPECT_TRUE(q11.isApprox(Math::Vector3d(2.0, 1.0, 4.0), epsilon)); EXPECT_TRUE(q12.isApprox(Math::Vector3d(0.0, 1.0, 2.0), epsilon)); EXPECT_TRUE(q21.isApprox(Math::Vector3d(1.0, 3.5, 2.5), epsilon)); EXPECT_TRUE(q22.isApprox(Math::Vector3d(-2.0, 1.5, 3.5), epsilon)); EXPECT_TRUE((Math::LinearMotionND(p11, p12)).isApprox(status.motionP1(), epsilon)); EXPECT_TRUE((Math::LinearMotionND(p21, p22)).isApprox(status.motionP2(), epsilon)); EXPECT_TRUE((Math::LinearMotionND(q11, q12)).isApprox(status.motionQ1(), epsilon)); EXPECT_TRUE((Math::LinearMotionND(q21, q22)).isApprox(status.motionQ2(), epsilon)); EXPECT_DOUBLE_EQ(1.0e-06, status.thicknessP()); EXPECT_DOUBLE_EQ(2.0e-06, status.thicknessQ()); EXPECT_DOUBLE_EQ(3.0e-06, status.timePrecisionEpsilon()); EXPECT_DOUBLE_EQ(4.0e-06, status.distanceEpsilon()); EXPECT_DOUBLE_EQ(0.0, status.tripleProductEpsilon()); EXPECT_DOUBLE_EQ(0.0, status.muNuEpsilon()); auto p1q1 = status.motionQ1() - status.motionP1(); auto p1p2 = status.motionP2() - status.motionP1(); auto q1q2 = status.motionQ2() - status.motionQ1(); EXPECT_TRUE(analyticTripleProduct(p1q1, p1p2, q1q2).isApprox(status.P1Q1_P1P2_Q1Q2().getPolynomial(), epsilon)); EXPECT_TRUE(analyticDotProduct(p1p2, p1q1).isApprox(status.P1P2_P1Q1().getPolynomial(), epsilon)); EXPECT_TRUE(analyticDotProduct(q1q2, p1q1).isApprox(status.Q1Q2_P1Q1().getPolynomial(), epsilon)); EXPECT_TRUE(analyticDotProduct(p1p2, q1q2).isApprox(status.P1P2_Q1Q2().getPolynomial(), epsilon)); EXPECT_TRUE(analyticMagnitudeSquared(p1p2).isApprox(status.P1P2_sq().getPolynomial(), epsilon)); EXPECT_TRUE(analyticMagnitudeSquared(q1q2).isApprox(status.Q1Q2_sq().getPolynomial(), epsilon)); Math::Interval range(0.5, 0.75); Math::Polynomial axisX; Math::Polynomial axisY; Math::Polynomial axisZ; Math::analyticCrossProduct(p1p2, q1q2, &axisX, &axisY, &axisZ); Math::PolynomialValues valueX(axisX); Math::PolynomialValues valueY(axisY); Math::PolynomialValues valueZ(axisZ); Math::Interval cross = valueX.valuesOverInterval(range).square() + valueY.valuesOverInterval(range).square() + valueZ.valuesOverInterval(range).square(); EXPECT_TRUE(cross.isApprox(status.crossValueOnInterval(range), epsilon)); }; TEST(SegmentSegmentCcdIntervalCheckTests, SetGetTests) { // Set up some arbitrary locations to check the class initialization. std::array pStart = {Math::Vector3d(-1.0, 1.0, 0.0), Math::Vector3d(-0.5, 1.5, 1.5)}; std::array pEnd = {Math::Vector3d(-1.0, 1.0, 1.5), Math::Vector3d(-0.5, 1.5, 3.0)}; std::array qStart = {Math::Vector3d(2.0, 1.0, 4.0), Math::Vector3d(1.0, 3.5, 2.5)}; std::array qEnd = {Math::Vector3d(0.0, 1.0, 2.0), Math::Vector3d(-2.0, 1.5, 3.5)}; SegmentSegmentCcdIntervalCheck status(pStart, pEnd, qStart, qEnd, 1.0e-06, 2.0e-06, 3.0e-06, 4.0e-06); status.setTimePrecisionEpsilon(5.0e-06); status.setDistanceEpsilon(6.0e-06); status.setTripleProductEpsilon(7.0e-06); status.setMuNuEpsilon(8.0e-06); EXPECT_DOUBLE_EQ(5.0e-06, status.timePrecisionEpsilon()); EXPECT_DOUBLE_EQ(6.0e-06, status.distanceEpsilon()); EXPECT_DOUBLE_EQ(7.0e-06, status.tripleProductEpsilon()); EXPECT_DOUBLE_EQ(8.0e-06, status.muNuEpsilon()); }; TEST(SegmentSegmentCcdIntervalCheckTests, CollisionChecksWithThickness) { { // Two crossed segments intersecting at X = Y = 0 when the distance between is <= 0.75. This // should occur when t >= 0.75 SCOPED_TRACE("Testing simple crossed segments moving towards each other."); std::array pStart = {Math::Vector3d(-1.0, -1.0, -2.0), Math::Vector3d(1.0, 1.0, -2.0)}; std::array pEnd = {Math::Vector3d(-1.0, -1.0, 0.0), Math::Vector3d(1.0, 1.0, 0.0)}; std::array qStart = {Math::Vector3d(1.0, -1.0, 1.0), Math::Vector3d(-1.0, 1.0, 1.0)}; std::array qEnd = {Math::Vector3d(1.0, -1.0, 0.0), Math::Vector3d(-1.0, 1.0, 0.0)}; SegmentSegmentCcdIntervalCheck status(pStart, pEnd, qStart, qEnd, 0.5, 0.25, 3.0e-06, 4.0e-06); EXPECT_EQ(SegmentSegmentCcdIntervalCheck::IntervalCheckPossibleCollision, status.possibleCollisionTestWithThickness(Math::Interval (0.0, 1.0))); EXPECT_EQ(SegmentSegmentCcdIntervalCheck::IntervalCheckPossibleCollision, status.possibleCollisionTestWithThickness(Math::Interval (0.0, 0.7500000001))); EXPECT_EQ(SegmentSegmentCcdIntervalCheck::IntervalCheckNoCollisionVolume, status.possibleCollisionTestWithThickness(Math::Interval (0.0, 0.7499999999))); EXPECT_EQ(SegmentSegmentCcdIntervalCheck::IntervalCheckNoCollisionVolume, status.possibleCollisionTestWithThickness(Math::Interval (0.0, 0.5))); EXPECT_EQ(SegmentSegmentCcdIntervalCheck::IntervalCheckNoCollisionVolume, status.possibleCollisionTestWithThickness(Math::Interval (0.5, 0.7499999999))); EXPECT_EQ(SegmentSegmentCcdIntervalCheck::IntervalCheckPossibleCollision, status.possibleCollisionTestWithThickness(Math::Interval (0.5, 0.7500000001))); EXPECT_EQ(SegmentSegmentCcdIntervalCheck::IntervalCheckPossibleCollision, status.possibleCollisionTestWithThickness(Math::Interval (0.7499999999, 1.0))); EXPECT_EQ(SegmentSegmentCcdIntervalCheck::IntervalCheckPossibleCollision, status.possibleCollisionTestWithThickness(Math::Interval (0.7500000001, 1.0))); EXPECT_EQ(SegmentSegmentCcdIntervalCheck::IntervalCheckPossibleCollision, status.possibleCollisionTestWithThickness(Math::Interval (0.9, 0.95))); } { // Two crossed segments intersecting at X = Y = 0 when the distance between is <= 0.75. This // should occur when t <= 0.25 SCOPED_TRACE("Testing simple crossed segments moving away from each other."); std::array pStart = {Math::Vector3d(-1.0, -1.0, 0.0), Math::Vector3d(1.0, 1.0, 0.0)}; std::array pEnd = {Math::Vector3d(-1.0, -1.0, -2.0), Math::Vector3d(1.0, 1.0, -2.0)}; std::array qStart = {Math::Vector3d(1.0, -1.0, 0.0), Math::Vector3d(-1.0, 1.0, 0.0)}; std::array qEnd = {Math::Vector3d(1.0, -1.0, 1.0), Math::Vector3d(-1.0, 1.0, 1.0)}; SegmentSegmentCcdIntervalCheck status(pStart, pEnd, qStart, qEnd, 0.5, 0.25, 3.0e-06, 4.0e-06); EXPECT_EQ(SegmentSegmentCcdIntervalCheck::IntervalCheckPossibleCollision, status.possibleCollisionTestWithThickness(Math::Interval (0.0, 1.0))); EXPECT_EQ(SegmentSegmentCcdIntervalCheck::IntervalCheckPossibleCollision, status.possibleCollisionTestWithThickness(Math::Interval (0.2499999999, 1.0))); EXPECT_EQ(SegmentSegmentCcdIntervalCheck::IntervalCheckPossibleCollision, status.possibleCollisionTestWithThickness(Math::Interval (0.2499999999, 0.2500000001))); EXPECT_EQ(SegmentSegmentCcdIntervalCheck::IntervalCheckNoCollisionVolume, status.possibleCollisionTestWithThickness(Math::Interval (0.2500000001, 1.0))); EXPECT_EQ(SegmentSegmentCcdIntervalCheck::IntervalCheckNoCollisionVolume, status.possibleCollisionTestWithThickness(Math::Interval (0.5, 1.0))); EXPECT_EQ(SegmentSegmentCcdIntervalCheck::IntervalCheckNoCollisionVolume, status.possibleCollisionTestWithThickness(Math::Interval (0.5, 0.7499999999))); } { SCOPED_TRACE("Slanted T formation around Q1. Segments never get close enough."); std::array pStart = {Math::Vector3d(-1.0, -1.0, -2.0), Math::Vector3d(1.0, 1.0, -2.0)}; std::array pEnd = {Math::Vector3d(-1.0, -1.0, 0.0), Math::Vector3d(1.0, 1.0, 0.0)}; std::array qStart = { Math::Vector3d(0.0, 0.7500000001, 1.0), Math::Vector3d(0.0, 1.7500000001, 1.0) }; std::array qEnd = { Math::Vector3d(0.0, 0.7500000001, 0.0), Math::Vector3d(0.0, 1.7500000001, 0.0) }; SegmentSegmentCcdIntervalCheck status(pStart, pEnd, qStart, qEnd, 0.5, 0.25, 3.0e-06, 4.0e-06); EXPECT_EQ(SegmentSegmentCcdIntervalCheck::IntervalCheckNoCollisionEndpoints, status.possibleCollisionTestWithThickness(Math::Interval (0.0, 1.0))); } { SCOPED_TRACE("Slanted T formation around Q1. Segments get close enough right around time = 1.0."); std::array pStart = {Math::Vector3d(-1.0, -1.0, -2.0), Math::Vector3d(1.0, 1.0, -2.0)}; std::array pEnd = {Math::Vector3d(-1.0, -1.0, 0.0), Math::Vector3d(1.0, 1.0, 0.0)}; std::array qStart = { Math::Vector3d(0.0, 0.7499999999, 1.0), Math::Vector3d(0.0, 1.7499999999, 1.0) }; std::array qEnd = { Math::Vector3d(0.0, 0.7499999999, 0.0), Math::Vector3d(0.0, 1.7499999999, 0.0) }; SegmentSegmentCcdIntervalCheck status(pStart, pEnd, qStart, qEnd, 0.5, 0.25, 3.0e-06, 4.0e-06); EXPECT_EQ(SegmentSegmentCcdIntervalCheck::IntervalCheckPossibleCollision, status.possibleCollisionTestWithThickness(Math::Interval (0.0, 1.0))); } { SCOPED_TRACE("Slanted T formation around Q2. Segments never get close enough."); std::array pStart = {Math::Vector3d(-1.0, -1.0, -2.0), Math::Vector3d(1.0, 1.0, -2.0)}; std::array pEnd = {Math::Vector3d(-1.0, -1.0, 0.0), Math::Vector3d(1.0, 1.0, 0.0)}; std::array qStart = { Math::Vector3d(0.0, -1.7500000001, 1.0), Math::Vector3d(0.0, -0.7500000001, 1.0) }; std::array qEnd = { Math::Vector3d(0.0, -1.7500000001, 0.0), Math::Vector3d(0.0, -0.7500000001, 0.0) }; SegmentSegmentCcdIntervalCheck status(pStart, pEnd, qStart, qEnd, 0.5, 0.25, 3.0e-06, 4.0e-06); EXPECT_EQ(SegmentSegmentCcdIntervalCheck::IntervalCheckNoCollisionEndpoints, status.possibleCollisionTestWithThickness(Math::Interval (0.0, 1.0))); } { SCOPED_TRACE("Slanted T formation around Q2. Segments get close enough right around time = 1.0."); std::array pStart = {Math::Vector3d(-1.0, -1.0, -2.0), Math::Vector3d(1.0, 1.0, -2.0)}; std::array pEnd = {Math::Vector3d(-1.0, -1.0, 0.0), Math::Vector3d(1.0, 1.0, 0.0)}; std::array qStart = { Math::Vector3d(0.0, -1.7499999999, 1.0), Math::Vector3d(0.0, -0.7499999999, 1.0) }; std::array qEnd = { Math::Vector3d(0.0, -1.7499999999, 0.0), Math::Vector3d(0.0, -0.7499999999, 0.0) }; SegmentSegmentCcdIntervalCheck status(pStart, pEnd, qStart, qEnd, 0.5, 0.25, 3.0e-06, 4.0e-06); EXPECT_EQ(SegmentSegmentCcdIntervalCheck::IntervalCheckPossibleCollision, status.possibleCollisionTestWithThickness(Math::Interval (0.0, 1.0))); } { SCOPED_TRACE("Slanted T formation around P1. Segments never get close enough."); std::array pStart = { Math::Vector3d(0.0, 0.7500000001, 1.0), Math::Vector3d(0.0, 1.7500000001, 1.0) }; std::array pEnd = { Math::Vector3d(0.0, 0.7500000001, 0.0), Math::Vector3d(0.0, 1.7500000001, 0.0) }; std::array qStart = {Math::Vector3d(-1.0, -1.0, -2.0), Math::Vector3d(1.0, 1.0, -2.0)}; std::array qEnd = {Math::Vector3d(-1.0, -1.0, 0.0), Math::Vector3d(1.0, 1.0, 0.0)}; SegmentSegmentCcdIntervalCheck status(pStart, pEnd, qStart, qEnd, 0.5, 0.25, 3.0e-06, 4.0e-06); EXPECT_EQ(SegmentSegmentCcdIntervalCheck::IntervalCheckNoCollisionEndpoints, status.possibleCollisionTestWithThickness(Math::Interval (0.0, 1.0))); } { SCOPED_TRACE("Slanted T formation around P1. Segments get close enough right around time = 1.0."); std::array pStart = { Math::Vector3d(0.0, 0.7499999999, 1.0), Math::Vector3d(0.0, 1.7499999999, 1.0) }; std::array pEnd = { Math::Vector3d(0.0, 0.7499999999, 0.0), Math::Vector3d(0.0, 1.7499999999, 0.0) }; std::array qStart = {Math::Vector3d(-1.0, -1.0, -2.0), Math::Vector3d(1.0, 1.0, -2.0)}; std::array qEnd = {Math::Vector3d(-1.0, -1.0, 0.0), Math::Vector3d(1.0, 1.0, 0.0)}; SegmentSegmentCcdIntervalCheck status(pStart, pEnd, qStart, qEnd, 0.5, 0.25, 3.0e-06, 4.0e-06); EXPECT_EQ(SegmentSegmentCcdIntervalCheck::IntervalCheckPossibleCollision, status.possibleCollisionTestWithThickness(Math::Interval (0.0, 1.0))); } { SCOPED_TRACE("Slanted T formation around P2. Segments never get close enough."); std::array pStart = { Math::Vector3d(0.0, -1.7500000001, 1.0), Math::Vector3d(0.0, -0.7500000001, 1.0) }; std::array pEnd = { Math::Vector3d(0.0, -1.7500000001, 0.0), Math::Vector3d(0.0, -0.7500000001, 0.0) }; std::array qStart = {Math::Vector3d(-1.0, -1.0, -2.0), Math::Vector3d(1.0, 1.0, -2.0)}; std::array qEnd = {Math::Vector3d(-1.0, -1.0, 0.0), Math::Vector3d(1.0, 1.0, 0.0)}; SegmentSegmentCcdIntervalCheck status(pStart, pEnd, qStart, qEnd, 0.5, 0.25, 3.0e-06, 4.0e-06); EXPECT_EQ(SegmentSegmentCcdIntervalCheck::IntervalCheckNoCollisionEndpoints, status.possibleCollisionTestWithThickness(Math::Interval (0.0, 1.0))); } { SCOPED_TRACE("Slanted T formation around P2. Segments get close enough right around time = 1.0."); std::array pStart = { Math::Vector3d(0.0, -1.7499999999, 1.0), Math::Vector3d(0.0, -0.7499999999, 1.0) }; std::array pEnd = { Math::Vector3d(0.0, -1.7499999999, 0.0), Math::Vector3d(0.0, -0.7499999999, 0.0) }; std::array qStart = {Math::Vector3d(-1.0, -1.0, -2.0), Math::Vector3d(1.0, 1.0, -2.0)}; std::array qEnd = {Math::Vector3d(-1.0, -1.0, 0.0), Math::Vector3d(1.0, 1.0, 0.0)}; SegmentSegmentCcdIntervalCheck status(pStart, pEnd, qStart, qEnd, 0.5, 0.25, 3.0e-06, 4.0e-06); EXPECT_EQ(SegmentSegmentCcdIntervalCheck::IntervalCheckPossibleCollision, status.possibleCollisionTestWithThickness(Math::Interval (0.0, 1.0))); } }; TEST(SegmentSegmentCcdIntervalCheckTests, CollisionChecksWithoutThickness) { { // Two crossed segments intersecting at X = Y = 0 when the distance between is = 0.0. This // should occur when t >= 0.5 SCOPED_TRACE("Testing simple crossed segments moving towards each other."); std::array pStart = {Math::Vector3d(-1.0, -1.0, -2.0), Math::Vector3d(1.0, 1.0, -2.0)}; std::array pEnd = {Math::Vector3d(-1.0, -1.0, 2.0), Math::Vector3d(1.0, 1.0, 2.0)}; std::array qStart = {Math::Vector3d(1.0, -1.0, 1.0), Math::Vector3d(-1.0, 1.0, 1.0)}; std::array qEnd = {Math::Vector3d(1.0, -1.0, -1.0), Math::Vector3d(-1.0, 1.0, -1.0)}; SegmentSegmentCcdIntervalCheck status(pStart, pEnd, qStart, qEnd, 0.5, 0.25, 3.0e-06, 4.0e-06); EXPECT_EQ(SegmentSegmentCcdIntervalCheck::IntervalCheckPossibleCollision, status.possibleCollisionTestNoThickness(Math::Interval (0.0, 1.0))); EXPECT_EQ(SegmentSegmentCcdIntervalCheck::IntervalCheckPossibleCollision, status.possibleCollisionTestNoThickness(Math::Interval (0.0, 0.5000000001))); EXPECT_EQ(SegmentSegmentCcdIntervalCheck::IntervalCheckNoCollisionVolume, status.possibleCollisionTestNoThickness(Math::Interval (0.0, 0.4999999999))); EXPECT_EQ(SegmentSegmentCcdIntervalCheck::IntervalCheckNoCollisionVolume, status.possibleCollisionTestNoThickness(Math::Interval (0.0, 0.25))); EXPECT_EQ(SegmentSegmentCcdIntervalCheck::IntervalCheckNoCollisionVolume, status.possibleCollisionTestNoThickness(Math::Interval (0.25, 0.4999999999))); EXPECT_EQ(SegmentSegmentCcdIntervalCheck::IntervalCheckPossibleCollision, status.possibleCollisionTestNoThickness(Math::Interval (0.4999999999, 0.5000000001))); EXPECT_EQ(SegmentSegmentCcdIntervalCheck::IntervalCheckPossibleCollision, status.possibleCollisionTestNoThickness(Math::Interval (0.4999999999, 1.0))); EXPECT_EQ(SegmentSegmentCcdIntervalCheck::IntervalCheckNoCollisionVolume, status.possibleCollisionTestNoThickness(Math::Interval (0.5000000001, 1.0))); EXPECT_EQ(SegmentSegmentCcdIntervalCheck::IntervalCheckNoCollisionVolume, status.possibleCollisionTestNoThickness(Math::Interval (0.9, 0.95))); } { // Two crossed segments intersecting at X = Y = 0 when the distance between is = 0.0. This // should occur at t = 0.0 SCOPED_TRACE("Testing simple crossed segments moving away from each other."); std::array pStart = { Math::Vector3d(-1.0, -1.0, 0.0000000001), Math::Vector3d(1.0, 1.0, 0.0000000001) }; std::array pEnd = {Math::Vector3d(-1.0, -1.0, -2.0), Math::Vector3d(1.0, 1.0, -2.0)}; std::array qStart = { Math::Vector3d(1.0, -1.0, -0.0000000001), Math::Vector3d(-1.0, 1.0, -0.0000000001) }; std::array qEnd = {Math::Vector3d(1.0, -1.0, 1.0), Math::Vector3d(-1.0, 1.0, 1.0)}; SegmentSegmentCcdIntervalCheck status(pStart, pEnd, qStart, qEnd, 0.5, 0.25, 3.0e-06, 4.0e-06); EXPECT_EQ(SegmentSegmentCcdIntervalCheck::IntervalCheckPossibleCollision, status.possibleCollisionTestNoThickness(Math::Interval (0.0, 1.0))); EXPECT_EQ(SegmentSegmentCcdIntervalCheck::IntervalCheckNoCollisionVolume, status.possibleCollisionTestNoThickness(Math::Interval (0.25, 1.0))); EXPECT_EQ(SegmentSegmentCcdIntervalCheck::IntervalCheckPossibleCollision, status.possibleCollisionTestNoThickness(Math::Interval (0.0, 0.1))); EXPECT_EQ(SegmentSegmentCcdIntervalCheck::IntervalCheckNoCollisionVolume, status.possibleCollisionTestNoThickness(Math::Interval (0.000001, 1.0))); EXPECT_EQ(SegmentSegmentCcdIntervalCheck::IntervalCheckNoCollisionVolume, status.possibleCollisionTestNoThickness(Math::Interval (0.5, 1.0))); EXPECT_EQ(SegmentSegmentCcdIntervalCheck::IntervalCheckNoCollisionVolume, status.possibleCollisionTestNoThickness(Math::Interval (0.5, 0.7499999999))); } { SCOPED_TRACE("Slanted T formation around Q1. Segments never get close enough."); std::array pStart = {Math::Vector3d(-1.0, -1.0, -2.0), Math::Vector3d(1.0, 1.0, -2.0)}; std::array pEnd = {Math::Vector3d(-1.0, -1.0, 0.0), Math::Vector3d(1.0, 1.0, 0.0)}; std::array qStart = { Math::Vector3d(0.0, 0.0000000001, 1.0), Math::Vector3d(0.0, 1.0000000001, 1.0) }; std::array qEnd = { Math::Vector3d(0.0, 0.0000000001, 0.0), Math::Vector3d(0.0, 1.0000000001, 0.0) }; SegmentSegmentCcdIntervalCheck status(pStart, pEnd, qStart, qEnd, 0.5, 0.25, 3.0e-06, 4.0e-06); EXPECT_EQ(SegmentSegmentCcdIntervalCheck::IntervalCheckNoCollisionEndpoints, status.possibleCollisionTestNoThickness(Math::Interval (0.0, 1.0))); } { SCOPED_TRACE("Slanted T formation around Q1. Segments get close enough right around time = 1.0."); std::array pStart = {Math::Vector3d(-1.0, -1.0, -2.0), Math::Vector3d(1.0, 1.0, -2.0)}; std::array pEnd = {Math::Vector3d(-1.0, -1.0, 0.0), Math::Vector3d(1.0, 1.0, 0.0)}; std::array qStart = { Math::Vector3d(0.0, -0.0000000001, 1.0), Math::Vector3d(0.0, 1.0000000001, 1.0) }; std::array qEnd = { Math::Vector3d(0.0, -0.0000000001, 0.0), Math::Vector3d(0.0, 1.0000000001, 0.0) }; SegmentSegmentCcdIntervalCheck status(pStart, pEnd, qStart, qEnd, 0.5, 0.25, 3.0e-06, 4.0e-06); EXPECT_EQ(SegmentSegmentCcdIntervalCheck::IntervalCheckPossibleCollision, status.possibleCollisionTestNoThickness(Math::Interval (0.0, 1.0))); } { SCOPED_TRACE("Slanted T formation around Q2. Segments never get close enough."); std::array pStart = {Math::Vector3d(-1.0, -1.0, -2.0), Math::Vector3d(1.0, 1.0, -2.0)}; std::array pEnd = {Math::Vector3d(-1.0, -1.0, 0.0), Math::Vector3d(1.0, 1.0, 0.0)}; std::array qStart = { Math::Vector3d(0.0, -1.0000000001, 1.0), Math::Vector3d(0.0, -0.0000000001, 1.0) }; std::array qEnd = { Math::Vector3d(0.0, -1.0000000001, 0.0), Math::Vector3d(0.0, -0.0000000001, 0.0) }; SegmentSegmentCcdIntervalCheck status(pStart, pEnd, qStart, qEnd, 0.5, 0.25, 3.0e-06, 4.0e-06); EXPECT_EQ(SegmentSegmentCcdIntervalCheck::IntervalCheckNoCollisionEndpoints, status.possibleCollisionTestNoThickness(Math::Interval (0.0, 1.0))); } { SCOPED_TRACE("Slanted T formation around Q2. Segments get close enough right around time = 1.0."); std::array pStart = {Math::Vector3d(-1.0, -1.0, -2.0), Math::Vector3d(1.0, 1.0, -2.0)}; std::array pEnd = {Math::Vector3d(-1.0, -1.0, 0.0), Math::Vector3d(1.0, 1.0, 0.0)}; std::array qStart = { Math::Vector3d(0.0, -1.0000000001, 1.0), Math::Vector3d(0.0, 0.0000000001, 1.0) }; std::array qEnd = { Math::Vector3d(0.0, -1.0000000001, 0.0), Math::Vector3d(0.0, 0.0000000001, 0.0) }; SegmentSegmentCcdIntervalCheck status(pStart, pEnd, qStart, qEnd, 0.5, 0.25, 3.0e-06, 4.0e-06); EXPECT_EQ(SegmentSegmentCcdIntervalCheck::IntervalCheckPossibleCollision, status.possibleCollisionTestNoThickness(Math::Interval (0.0, 1.0))); } { SCOPED_TRACE("Slanted T formation around P1. Segments never get close enough."); std::array pStart = { Math::Vector3d(0.0, 0.0000000001, 1.0), Math::Vector3d(0.0, 1.0000000001, 1.0) }; std::array pEnd = { Math::Vector3d(0.0, 0.0000000001, 0.0), Math::Vector3d(0.0, 1.0000000001, 0.0) }; std::array qStart = {Math::Vector3d(-1.0, -1.0, -2.0), Math::Vector3d(1.0, 1.0, -2.0)}; std::array qEnd = {Math::Vector3d(-1.0, -1.0, 0.0), Math::Vector3d(1.0, 1.0, 0.0)}; SegmentSegmentCcdIntervalCheck status(pStart, pEnd, qStart, qEnd, 0.5, 0.25, 3.0e-06, 4.0e-06); EXPECT_EQ(SegmentSegmentCcdIntervalCheck::IntervalCheckNoCollisionEndpoints, status.possibleCollisionTestNoThickness(Math::Interval (0.0, 1.0))); } { SCOPED_TRACE("Slanted T formation around P1. Segments get close enough right around time = 1.0."); std::array pStart = { Math::Vector3d(0.0, -0.0000000001, 1.0), Math::Vector3d(0.0, 1.0000000001, 1.0) }; std::array pEnd = { Math::Vector3d(0.0, -0.0000000001, 0.0), Math::Vector3d(0.0, 1.0000000001, 0.0) }; std::array qStart = {Math::Vector3d(-1.0, -1.0, -2.0), Math::Vector3d(1.0, 1.0, -2.0)}; std::array qEnd = {Math::Vector3d(-1.0, -1.0, 0.0), Math::Vector3d(1.0, 1.0, 0.0)}; SegmentSegmentCcdIntervalCheck status(pStart, pEnd, qStart, qEnd, 0.5, 0.25, 3.0e-06, 4.0e-06); EXPECT_EQ(SegmentSegmentCcdIntervalCheck::IntervalCheckPossibleCollision, status.possibleCollisionTestNoThickness(Math::Interval (0.0, 1.0))); } { SCOPED_TRACE("Slanted T formation around P2. Segments never get close enough."); std::array pStart = { Math::Vector3d(0.0, -1.0000000001, 1.0), Math::Vector3d(0.0, -0.0000000001, 1.0) }; std::array pEnd = { Math::Vector3d(0.0, -1.0000000001, 0.0), Math::Vector3d(0.0, -0.0000000001, 0.0) }; std::array qStart = {Math::Vector3d(-1.0, -1.0, -2.0), Math::Vector3d(1.0, 1.0, -2.0)}; std::array qEnd = {Math::Vector3d(-1.0, -1.0, 0.0), Math::Vector3d(1.0, 1.0, 0.0)}; SegmentSegmentCcdIntervalCheck status(pStart, pEnd, qStart, qEnd, 0.5, 0.25, 3.0e-06, 4.0e-06); EXPECT_EQ(SegmentSegmentCcdIntervalCheck::IntervalCheckNoCollisionEndpoints, status.possibleCollisionTestNoThickness(Math::Interval (0.0, 1.0))); } { SCOPED_TRACE("Slanted T formation around P2. Segments get close enough right around time = 1.0."); std::array pStart = { Math::Vector3d(0.0, -1.0000000001, 1.0), Math::Vector3d(0.0, 0.0000000001, 1.0) }; std::array pEnd = { Math::Vector3d(0.0, -1.0000000001, 0.0), Math::Vector3d(0.0, 0.0000000001, 0.0) }; std::array qStart = {Math::Vector3d(-1.0, -1.0, -2.0), Math::Vector3d(1.0, 1.0, -2.0)}; std::array qEnd = {Math::Vector3d(-1.0, -1.0, 0.0), Math::Vector3d(1.0, 1.0, 0.0)}; SegmentSegmentCcdIntervalCheck status(pStart, pEnd, qStart, qEnd, 0.5, 0.25, 3.0e-06, 4.0e-06); EXPECT_EQ(SegmentSegmentCcdIntervalCheck::IntervalCheckPossibleCollision, status.possibleCollisionTestNoThickness(Math::Interval (0.0, 1.0))); } }; }; // namespace Collision }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Collision/UnitTests/SegmentSegmentCcdMovingContactTests.cpp000066400000000000000000000511001277777236100311610ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the SegmentSegmentCcdMovingContact functions. #include #include #include "SurgSim/Collision/SegmentSegmentCcdMovingContact.h" namespace SurgSim { namespace Collision { namespace { double epsilon = 1.0e-05; } template class SegmentSegmentCcdMovingContactTests : public ::testing::Test { }; class MockSegmentSegmentCcdMovingContact : public SurgSim::Collision::SegmentSegmentCcdMovingContact { public: void normalizeSegmentsConsistently(Math::Vector3d* t0, Math::Vector3d* t1, double epsilon) const { SegmentSegmentCcdMovingContact::normalizeSegmentsConsistently(t0, t1, epsilon); } bool collideSegmentSegmentBaseCase( const std::array& pT0, const std::array& pT1, const std::array& qT0, const std::array& qT1, double thicknessP, double thicknessQ, double timePrecisionEpsilon, double* t, double* r, double* s) { return SegmentSegmentCcdMovingContact::collideSegmentSegmentBaseCase(pT0, pT1, qT0, qT1, thicknessP, thicknessQ, timePrecisionEpsilon, t, r, s); } bool collideSegmentSegmentGeneralCase( const SegmentSegmentCcdIntervalCheck& state, double a, double b, // Interval boundaries double* t, double* r, double* s, int depth = 0) { return SegmentSegmentCcdMovingContact::collideSegmentSegmentGeneralCase(state, a, b, t, r, s, depth); } bool collideSegmentSegmentCoplanarCase( const std::array& pT0, /* Segment 1 at t=0 */ const std::array& pT1, /* Segment 1 at t=1 */ const std::array& qT0, /* Segment 2 at t=0 */ const std::array& qT1, /* Segment 2 at t=1 */ double a, double b, /* Interval boundaries */ double timePrecisionEpsilon, double thicknessP, double thicknessQ, double* t, double* r, double* s, int depth = 0) { m_staticTest.collideStaticSegmentSegment(pT0, qT0, thicknessP, thicknessQ, r, s); return SegmentSegmentCcdMovingContact::collideSegmentSegmentCoplanarCase( pT0, pT1, qT0, qT1, a, b, timePrecisionEpsilon, thicknessP, thicknessQ, t, r, s, depth); } bool collideSegmentSegmentParallelCase( const std::array& pT0, const std::array& pT1, const std::array& qT0, const std::array& qT1, double a, double b, double thicknessP, double thicknessQ, double timePrecisionEpsilon, double* t, double* r, double* s, int depth = 0) { m_staticTest.collideStaticSegmentSegment(pT0, qT0, thicknessP, thicknessQ, r, s); return SegmentSegmentCcdMovingContact::collideSegmentSegmentParallelCase( pT0, pT1, qT0, qT1, a, b, thicknessP, thicknessQ, timePrecisionEpsilon, t, r, s, depth); } Collision::SegmentSegmentCcdStaticContact m_staticTest; }; TEST(SegmentSegmentCcdMovingContactTests, Initialization) { ASSERT_NO_THROW(SegmentSegmentCcdMovingContact movingTest); SegmentSegmentCcdMovingContact movingTest; }; TEST(SegmentSegmentCcdMovingContactTests, TestSafeNormalization) { MockSegmentSegmentCcdMovingContact movingTest; { SCOPED_TRACE("Normalizing 2 good vectors."); Math::Vector3d vector1(0.0, 0.1, 0.2); Math::Vector3d vector2(0.2, 0.1, 0.0); movingTest.normalizeSegmentsConsistently(&vector1, &vector2, epsilon); EXPECT_TRUE(vector1.isApprox(Math::Vector3d(0.0, 1.0 / std::sqrt(5.0), 2 / std::sqrt(5.0)), epsilon)); EXPECT_TRUE(vector2.isApprox(Math::Vector3d(2 / std::sqrt(5.0), 1.0 / std::sqrt(5.0), 0.0), epsilon)); } { SCOPED_TRACE("Vector 1 is good. Vector 2 is bad."); Math::Vector3d vector1(0.0, 0.1, 0.2); Math::Vector3d vector2(2.0e-11, 1.0e-11, 0.0); movingTest.normalizeSegmentsConsistently(&vector1, &vector2, epsilon); EXPECT_TRUE(vector1.isApprox(Math::Vector3d(0.0, 1.0 / std::sqrt(5.0), 2 / std::sqrt(5.0)), epsilon)); EXPECT_TRUE(vector2.isApprox(Math::Vector3d(0.0, 1.0 / std::sqrt(5.0), 2 / std::sqrt(5.0)), epsilon)); } { SCOPED_TRACE("Vector 1 is bad. Vector 2 is good."); Math::Vector3d vector1(0.0, 1.0e-11, 2.0e-11); Math::Vector3d vector2(0.2, 0.1, 0.0); movingTest.normalizeSegmentsConsistently(&vector1, &vector2, epsilon); EXPECT_TRUE(vector1.isApprox(Math::Vector3d(2 / std::sqrt(5.0), 1.0 / std::sqrt(5.0), 0.0), epsilon)); EXPECT_TRUE(vector2.isApprox(Math::Vector3d(2 / std::sqrt(5.0), 1.0 / std::sqrt(5.0), 0.0), epsilon)); } { SCOPED_TRACE("Normalizing 2 bad vectors."); Math::Vector3d vector1(0.0, 1.0e-11, 2.0e-11); Math::Vector3d vector2(2.0e-11, 1.0e-11, 0.0); movingTest.normalizeSegmentsConsistently(&vector1, &vector2, epsilon); EXPECT_TRUE(vector1.isApprox(Math::Vector3d(0.0, 1.0e-11, 2.0e-11), epsilon)); EXPECT_TRUE(vector2.isApprox(Math::Vector3d(2.0e-11, 1.0e-11, 0.0), epsilon)); } }; TEST(SegmentSegmentCcdMovingContactTests, TestSegmentSegmentGeneralCase) { MockSegmentSegmentCcdMovingContact movingTest; std::array pStart = {Math::Vector3d(-1.0, -1.0, -2.0), Math::Vector3d(1.0, 1.0, -2.0)}; std::array pEnd = {Math::Vector3d(-1.0, -1.0, 0.0), Math::Vector3d(1.0, 1.0, 0.0)}; std::array qStart = {Math::Vector3d(1.0, -1.0, 1.0), Math::Vector3d(-1.0, 1.0, 1.0)}; std::array qEnd = {Math::Vector3d(1.0, -1.0, 0.0), Math::Vector3d(-1.0, 1.0, 0.0)}; double t; double r; double s; { SCOPED_TRACE("Collision not possible within time interval."); SegmentSegmentCcdIntervalCheck status(pStart, pEnd, qStart, qEnd, 0.5, 0.25, 3.0e-06, 4.0e-06); EXPECT_FALSE(movingTest.collideSegmentSegmentGeneralCase(status, 0.0, 0.5, &t, &r, &s, 0)); } { // Test where collision occurs at the end of the (small) time interval SCOPED_TRACE("Recursion bottomed out, test collision and no collision at time precision."); SegmentSegmentCcdIntervalCheck statusTrue(pStart, pEnd, qStart, qEnd, 0.5, 0.25, 3.0e-06, 4.0e-06); EXPECT_TRUE(movingTest.collideSegmentSegmentGeneralCase(statusTrue, 0.75 - 1.4e-07, 0.75 + 1.5e-07, &t, &r, &s, 0)); EXPECT_DOUBLE_EQ(0.75 + 1.5e-07, t); EXPECT_DOUBLE_EQ(0.50, r); EXPECT_DOUBLE_EQ(0.50, s); // Increase the interval and time precision so that no collision occurs SegmentSegmentCcdIntervalCheck statusFalse(pStart, pEnd, qStart, qEnd, 1.0e-06, 1.0e-06, 0.5, 4.0e-06); EXPECT_FALSE(movingTest.collideSegmentSegmentGeneralCase(statusFalse, 0.76 - 2.5, 0.75 + 2.4999, &t, &r, &s, 0)); } { // Test complete recursion SCOPED_TRACE("Full recursion test, test collision and no collision at time precision."); SegmentSegmentCcdIntervalCheck statusTrue(pStart, pEnd, qStart, qEnd, 0.5, 0.25, 3.0e-06, 4.0e-06); EXPECT_TRUE(movingTest.collideSegmentSegmentGeneralCase(statusTrue, 0.0, 1.0, &t, &r, &s, 0)); EXPECT_GT(epsilon, std::abs(0.75 - t)); EXPECT_DOUBLE_EQ(0.50, r); EXPECT_DOUBLE_EQ(0.50, s); // Increase the interval and time precision so that no collision occurs SegmentSegmentCcdIntervalCheck statusFalse(pStart, pEnd, qStart, qEnd, 1.0e-06, 1.0e-06, 0.5, 4.0e-06); EXPECT_FALSE(movingTest.collideSegmentSegmentGeneralCase(statusFalse, 0.0, 0.75 + 1.0, &t, &r, &s, 0)); } }; TEST(SegmentSegmentCcdMovingContactTests, TestSegmentSegmentCoplanarCase) { MockSegmentSegmentCcdMovingContact movingTest; std::array pStart = {Math::Vector3d(-1.0, 1.75, 0.0), Math::Vector3d(1.0, 1.75, 0.0)}; std::array pEnd = {Math::Vector3d(1.0, -0.25, 0.0), Math::Vector3d(3.0, -0.25, 0.0)}; std::array qStart = {Math::Vector3d(-1.0, 0.0, 0.0), Math::Vector3d(-1.0, -1.0, 0.0)}; std::array qEnd = {Math::Vector3d(1.0, 0.0, 0.0), Math::Vector3d(1.0, -1.0, 0.0)}; double t; double r; double s; { // Test where collision occurs at the end of the (small) time interval SCOPED_TRACE("Recursion bottomed out, test collision and no collision at time precision."); EXPECT_TRUE(movingTest.collideSegmentSegmentCoplanarCase( pStart, pEnd, qStart, qEnd, 0.5 - 1.4e-07, 0.5 + 1.5e-07, 3.0e-06, 0.5, 0.25, &t, &r, &s, 0)); EXPECT_GE(3.0e-06, std::abs(0.5 - t)); EXPECT_DOUBLE_EQ(0.0, r); EXPECT_DOUBLE_EQ(0.0, s); // Increase the interval and time precision so that no collision occurs EXPECT_TRUE(movingTest.collideSegmentSegmentCoplanarCase( pEnd, pStart, qStart, qEnd, 0.5 - .24, 0.5 + .25, .50, 0.5, 0.25, &t, &r, &s, 0)); EXPECT_GE(1.0e-02, std::abs(0.5 - t)); } { // Test complete recursion SCOPED_TRACE("Full recursion test, test start, middle, and end of interval."); EXPECT_TRUE(movingTest.collideSegmentSegmentCoplanarCase( pStart, pEnd, qStart, qEnd, 0.5 - 1.5e-06, 1.0, 3.0e-06, 0.5, 0.25, &t, &r, &s, 0)); EXPECT_GE(3.0e-06, std::abs(0.5 - t)); EXPECT_DOUBLE_EQ(0.0, r); EXPECT_DOUBLE_EQ(0.0, s); EXPECT_TRUE(movingTest.collideSegmentSegmentCoplanarCase( pStart, pEnd, qStart, qEnd, 0.0, 1.0, 3.0e-06, 0.5, 0.25, &t, &r, &s, 0)); EXPECT_GE(3.0e-06, std::abs(0.5 - t)); EXPECT_DOUBLE_EQ(0.0, r); EXPECT_DOUBLE_EQ(0.0, s); EXPECT_TRUE(movingTest.collideSegmentSegmentCoplanarCase( pStart, pEnd, qStart, qEnd, 0.0, 0.5 + 1.5e-06, 3.0e-06, 0.5, 0.25, &t, &r, &s, 0)); EXPECT_GE(3.0e-06, std::abs(0.5 - t)); EXPECT_DOUBLE_EQ(0.0, r); EXPECT_DOUBLE_EQ(0.0, s); } { SCOPED_TRACE("Test normal flip at start, middle, and end of interval."); std::array pFlipStart = {Math::Vector3d(0.0625, 1.0, 0.0), Math::Vector3d(-3.5 + 0.0625, -1.0e-03, 0.0) }; std::array pFlipEnd = {Math::Vector3d(0.0625, 1.0, 0.0), Math::Vector3d(3.5, -1.0e-03, 0.0) }; std::array qFlip = {Math::Vector3d(0.0625, -1.0, 0.0), Math::Vector3d(0.0625, 0.0, 0.0) }; EXPECT_TRUE(movingTest.collideSegmentSegmentCoplanarCase( pFlipStart, pFlipEnd, qFlip, qFlip, 0.503, 1.0, 1.0e-10, 1.0e-09, 1.0e-09, &t, &r, &s, 0)); EXPECT_GE(2.0e-06, std::abs(0.504504 - t)); EXPECT_GT(2.0e-03, 1.0 - r); EXPECT_GT(2.0e-03, 1.0 - s); EXPECT_TRUE(movingTest.collideSegmentSegmentCoplanarCase( pFlipStart, pFlipEnd, qFlip, qFlip, 0.0, 1.0, 1.0e-10, 1.0e-09, 1.0e-09, &t, &r, &s, 0)); EXPECT_GE(2.0e-06, std::abs(0.504504 - t)); EXPECT_GT(2.0e-03, 1.0 - r); EXPECT_GT(2.0e-03, 1.0 - s); EXPECT_TRUE(movingTest.collideSegmentSegmentCoplanarCase( pFlipStart, pFlipEnd, qFlip, qFlip, 0.0, 0.505, 1.0e-10, 1.0e-09, 1.0e-09, &t, &r, &s, 0)); EXPECT_GE(2.0e-06, std::abs(0.504504 - t)); EXPECT_GT(2.0e-03, 1.0 - r); EXPECT_GT(2.0e-03, 1.0 - s); } { SCOPED_TRACE("Test the no flip combinations."); std::array pSpinStart = {Math::Vector3d(-0.5 + 1.0e-03, -1.0e-09, 0.0), Math::Vector3d(0.0 + 1.0e-03, 0.5, 0.0) }; std::array pSpinEnd = {Math::Vector3d(0.5 + 1.0e-03, -1.0e-09, 0.0), Math::Vector3d(1.0 + 1.0e-03, -0.5, 0.0) }; std::array qSpin = {Math::Vector3d(0.0, -1.0, 0.0), Math::Vector3d(0.0, 0.0, 0.0) }; // We don't need to test the endpoints of the region. We verified that // we hit those with the flip tests. Instead, test all possible combinations // of crossing ... EXPECT_TRUE(movingTest.collideSegmentSegmentCoplanarCase( pSpinStart, pSpinEnd, qSpin, qSpin, 0.0, 1.0, 1.0e-10, 1.0e-09, 1.0e-09, &t, &r, &s, 0)); EXPECT_GE(3.0e-06, std::abs(0.5 - t - 1.0e-03)); EXPECT_GT(1.0e-08, std::abs(3.0e-06 - r)); EXPECT_GT(1.0e-08, std::abs(1.0 - s)); EXPECT_TRUE(movingTest.collideSegmentSegmentCoplanarCase( pSpinEnd, pSpinStart, qSpin, qSpin, 0.0, 1.0, 1.0e-10, 1.0e-09, 1.0e-09, &t, &r, &s, 0)); EXPECT_GE(3.0e-06, std::abs(0.5 - t + 1.0e-03)); EXPECT_GT(1.0e-08, std::abs(r)); EXPECT_GT(1.0e-08, std::abs(1.0 - s)); EXPECT_TRUE(movingTest.collideSegmentSegmentCoplanarCase( qSpin, qSpin, pSpinStart, pSpinEnd, 0.0, 1.0, 1.0e-10, 1.0e-09, 1.0e-09, &t, &r, &s, 0)); EXPECT_GE(3.0e-06, std::abs(0.5 - t - 1.0e-03)); EXPECT_GT(1.0e-08, std::abs(1.0 - r)); EXPECT_GT(1.0e-08, std::abs(3.0e-06 - s)); EXPECT_TRUE(movingTest.collideSegmentSegmentCoplanarCase( qSpin, qSpin, pSpinEnd, pSpinStart, 0.0, 1.0, 1.0e-10, 1.0e-09, 1.0e-09, &t, &r, &s, 0)); EXPECT_GE(3.0e-06, std::abs(0.5 - t + 1.0e-03)); EXPECT_GT(1.0e-08, std::abs(1.0 - r)); EXPECT_GT(1.0e-08, s); } }; TEST(SegmentSegmentCcdMovingContactTests, TestSegmentSegmentParallelCase) { MockSegmentSegmentCcdMovingContact movingTest; std::array pStart = {Math::Vector3d(-5.0, -1.0e-09, 0.0), Math::Vector3d(-5.0, 1.0, 0.0) }; std::array pEnd = {Math::Vector3d(5.0, -1.0e-09, 0.0), Math::Vector3d(5.0, 1.0, 0.0) }; std::array qStart = {Math::Vector3d(0.0, -1.0, 0.0), Math::Vector3d(0.0, 0.0, 0.0) }; std::array qEnd = {Math::Vector3d(0.0, -1.0, 0.0), Math::Vector3d(0.0, 0.0, 0.0) }; double t; double r; double s; { // Test where collision occurs in one of the intervals SCOPED_TRACE("Test success and failure at end of recursion."); EXPECT_TRUE(movingTest.collideSegmentSegmentParallelCase( pStart, pEnd, qStart, qEnd, 0.425 - 1.4e-07, 0.425 + 1.4e-07, 0.5, 0.25, 3.0e-06, &t, &r, &s, 0)); EXPECT_GE(3.0e-06, std::abs(0.425 - t)); EXPECT_GE(1.0e-09, std::abs(5.0e-10 - r)); EXPECT_GE(1.0e-09, std::abs(1.0 - 5.0e-10 - s)); EXPECT_TRUE(movingTest.collideSegmentSegmentParallelCase( pStart, pEnd, qStart, qEnd, 0.4 - 1.4e-07, 0.4 + 1.4e-07, 0.5, 0.25, 3.0e-06, &t, &r, &s, 0)); EXPECT_GE(5.0e-02, std::abs(0.425 - t)); } { // Test where collision occurs in one of the intervals SCOPED_TRACE("Test collision at end of one of the intervals, first, middle, and last."); EXPECT_TRUE(movingTest.collideSegmentSegmentParallelCase( pStart, pEnd, qStart, qEnd, 0.4, 1.0, 0.5, 0.25, 3.0e-06, &t, &r, &s, 0)); EXPECT_GE(3.0e-06, std::abs(0.425 - t)); EXPECT_GE(1.0e-09, std::abs(5.0e-10 - r)); EXPECT_GE(1.0e-09, std::abs(1.0 - 5.0e-10 - s)); EXPECT_TRUE(movingTest.collideSegmentSegmentParallelCase( pStart, pEnd, qStart, qEnd, 0.1, 1.0, 0.5, 0.25, 3.0e-06, &t, &r, &s, 0)); EXPECT_GE(3.0e-06, std::abs(0.425 - t)); EXPECT_GE(1.0e-09, std::abs(5.0e-10 - r)); EXPECT_GE(1.0e-09, std::abs(1.0 - 5.0e-10 - s)); EXPECT_TRUE(movingTest.collideSegmentSegmentParallelCase( pStart, pEnd, qStart, qEnd, 0.1, 0.43, 0.5, 0.25, 3.0e-06, &t, &r, &s, 0)); EXPECT_GE(3.0e-06, std::abs(0.425 - t)); EXPECT_GE(1.0e-09, std::abs(5.0e-10 - r)); EXPECT_GE(1.0e-09, std::abs(1.0 - 5.0e-10 - s)); } { // Test where collision occurs in one of the intervals SCOPED_TRACE("Test within one of the intervals, first, middle, and last."); EXPECT_TRUE(movingTest.collideSegmentSegmentParallelCase( pStart, pEnd, qStart, qEnd, 0.42, 1.0, 1.0e-03, 1.0e-03, 1.0e-06, &t, &r, &s, 0)); EXPECT_GE(2.0e-06, std::abs(0.5 - 2.0e-04 - t)); EXPECT_GE(1.0e-09, std::abs(5.0e-10 - r)); EXPECT_GE(1.0e-09, std::abs(1.0 - 5.0e-10 - s)); EXPECT_TRUE(movingTest.collideSegmentSegmentParallelCase( pStart, pEnd, qStart, qEnd, 0.0, 1.0, 1.0e-03, 1.0e-03, 1.0e-06, &t, &r, &s, 0)); EXPECT_GE(2.0e-06, std::abs(0.5 - 2.0e-04 - t)); EXPECT_GE(1.0e-09, std::abs(5.0e-10 - r)); EXPECT_GE(1.0e-09, std::abs(1.0 - 5.0e-10 - s)); EXPECT_TRUE(movingTest.collideSegmentSegmentParallelCase( pStart, pEnd, qStart, qEnd, 0.0, 0.51, 1.0e-03, 1.0e-03, 1.0e-06, &t, &r, &s, 0)); EXPECT_GE(2.0e-06, std::abs(0.5 - 2.0e-04 - t)); EXPECT_GE(1.0e-09, std::abs(5.0e-10 - r)); EXPECT_GE(1.0e-09, std::abs(1.0 - 5.0e-10 - s)); } }; TEST(SegmentSegmentCcdMovingContactTests, TestRouting) { // Test the base case for handling traffic to each of the 3 specific cases. MockSegmentSegmentCcdMovingContact movingTest; double r; double s; double t; { SCOPED_TRACE("Test the routing of the Parallel case."); std::array pStart = {Math::Vector3d(-5.0, -1.0e-09, 0.0), Math::Vector3d(-5.0, 1.0, 0.0) }; std::array pEnd = {Math::Vector3d(5.0, -1.0e-09, 0.0), Math::Vector3d(5.0, 1.0, 0.0) }; std::array qStart = {Math::Vector3d(0.0, -1.0, 0.0), Math::Vector3d(0.0, 0.0, 0.0) }; std::array qEnd = {Math::Vector3d(0.0, -1.0, 0.0), Math::Vector3d(0.0, 0.0, 0.0) }; EXPECT_TRUE(movingTest.collideSegmentSegmentBaseCase( pStart, pEnd, qStart, qEnd, 0.5, 0.25, 3.0e-06, &t, &r, &s)); EXPECT_GE(3.0e-06, std::abs(0.425 - t)); EXPECT_GE(1.0e-09, std::abs(5.0e-10 - r)); EXPECT_GE(1.0e-09, std::abs(1.0 - 5.0e-10 - s)); } { SCOPED_TRACE("Test the routing of the Coplanar case."); std::array pStart = {Math::Vector3d(-0.5 + 1.0e-03, -1.0e-09, 0.0), Math::Vector3d(0.0 + 1.0e-03, 0.5, 0.0) }; std::array pEnd = {Math::Vector3d(0.5 + 1.0e-03, -1.0e-09, 0.0), Math::Vector3d(1.0 + 1.0e-03, -0.5, 0.0) }; std::array q = {Math::Vector3d(0.0, -1.0, 0.0), Math::Vector3d(0.0, 0.0, 0.0) }; EXPECT_TRUE(movingTest.collideSegmentSegmentBaseCase(pStart, pEnd, q, q, 1.0e-09, 1.0e-09, 1.0e-10, &t, &r, &s)); EXPECT_GE(3.0e-06, std::abs(0.5 - t - 1.0e-03)); EXPECT_GT(1.0e-08, std::abs(3.0e-06 - r)); EXPECT_GT(1.0e-08, std::abs(1.0 - s)); } { SCOPED_TRACE("Test the routing of the General case."); std::array pStart = {Math::Vector3d(-1.0, -1.0, -2.0), Math::Vector3d(1.0, 1.0, -2.0)}; std::array pEnd = {Math::Vector3d(-1.0, -1.0, 0.0), Math::Vector3d(1.0, 1.0, 0.0)}; std::array qStart = {Math::Vector3d(1.0, -1.0, 1.0), Math::Vector3d(-1.0, 1.0, 1.0)}; std::array qEnd = {Math::Vector3d(1.0, -1.0, 0.0), Math::Vector3d(-1.0, 1.0, 0.0)}; EXPECT_TRUE(movingTest.collideSegmentSegmentBaseCase(pStart, pEnd, qStart, qEnd, 0.5, 0.25, 3.0e-06, &t, &r, &s)); EXPECT_GT(epsilon, std::abs(0.75 - t)); EXPECT_DOUBLE_EQ(0.50, r); EXPECT_DOUBLE_EQ(0.50, s); } }; TEST(SegmentSegmentCcdMovingContactTests, PublicAPI) { // Test the base case for handling traffic to each of the 3 specific cases. MockSegmentSegmentCcdMovingContact movingTest; std::array pStart = {Math::Vector3d(-5.0, -1.0e-09, 0.0), Math::Vector3d(-5.0, 1.0, 0.0) }; std::array pEnd = {Math::Vector3d(5.0, -1.0e-09, 0.0), Math::Vector3d(5.0, 1.0, 0.0) }; std::array qStart = {Math::Vector3d(0.0, -1.0, 0.0), Math::Vector3d(0.0, 0.0, 0.0) }; std::array qEnd = {Math::Vector3d(0.0, -1.0, 0.0), Math::Vector3d(0.0, 0.0, 0.0) }; Math::Vector3d dir; double r; double s; double t; { SCOPED_TRACE("Test thick segments."); EXPECT_TRUE(movingTest.collideMovingSegmentSegment( pStart, pEnd, qStart, qEnd, 0.5, 0.25, 3.0e-06, &t, &r, &s, &dir)); EXPECT_GE(3.0e-06, std::abs(0.425 - t)); EXPECT_GE(1.0e-09, std::abs(5.0e-10 - r)); EXPECT_GE(1.0e-09, std::abs(1.0 - 5.0e-10 - s)); EXPECT_TRUE(dir.normalized().isApprox(Math::Vector3d(1.0, 0.0, 0.0), 1.0e-09)); } { SCOPED_TRACE("Test zero thickness segments."); EXPECT_TRUE(movingTest.collideMovingSegmentSegment( pStart, pEnd, qStart, qEnd, 2.0e-03, 1.0e-06, &t, &r, &s, &dir)); EXPECT_GE(2.0e-06, std::abs(0.5 - 2.0e-04 - t)); EXPECT_GE(1.0e-09, std::abs(5.0e-10 - r)); EXPECT_GE(1.0e-09, std::abs(1.0 - 5.0e-10 - s)); EXPECT_TRUE(dir.normalized().isApprox(Math::Vector3d(1.0, 0.0, 0.0), 1.0e-09)); } }; }; // namespace Collision }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Collision/UnitTests/SegmentSegmentCcdStaticContactTests.cpp000066400000000000000000000651741277777236100311710ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the SegmentSegmentCcdCheck functions. #include #include #include "SurgSim/Collision/SegmentSegmentCcdStaticContact.h" namespace SurgSim { namespace Collision { namespace { double epsilon = 1.0e-05; } template class SegmentSegmentCcdStaticContactTests : public ::testing::Test { }; class MockSegmentSegmentCcdStaticContact : public SurgSim::Collision::SegmentSegmentCcdStaticContact { public: bool collideStaticPointSegment( const Math::Vector3d& point, const std::array& p, double thicknessPoint, double thicknessSegment, double* r) { return SegmentSegmentCcdStaticContact::collideStaticPointSegment(point, p, thicknessPoint, thicknessSegment, r); } SegmentCcdEdgeType computeCollisionEdge(double a, double b, double d, double r, double s, double ratio) const { return SegmentSegmentCcdStaticContact::computeCollisionEdge(a, b, d, r, s, ratio); } void computeCollisionParametrics(SegmentCcdEdgeType edge, double a, double b, double c, double d, double e, double ratio, double* r, double* s) const { SegmentSegmentCcdStaticContact::computeCollisionParametrics(edge, a, b, c, d, e, ratio, r, s); } void computeParallelSegmentParametrics(double a, double b, double d, double* r, double* s) { SegmentSegmentCcdStaticContact::computeParallelSegmentParametrics(a, b, d, r, s); } }; TEST(SegmentSegmentCcdStaticContactTests, Initialization) { ASSERT_NO_THROW(SegmentSegmentCcdStaticContact staticTest); SegmentSegmentCcdStaticContact staticTest; }; TEST(SegmentSegmentCcdStaticContactTests, RegionAndEdgeGenerator) { MockSegmentSegmentCcdStaticContact staticTest; const double ratio = 0.5; double a = 1.0; double b = 1.0; double d = 3.0; for (double r = -1.0; r <= 0.0; r += 0.1) { for (double s = -1.0; s < 0.0; s += 0.1) { // Region 6 EXPECT_EQ(SegmentSegmentCcdStaticContact::SegmentCcdEdgeTypeR0, staticTest.computeCollisionEdge(a, b, d, r, s, ratio)); EXPECT_EQ(SegmentSegmentCcdStaticContact::SegmentCcdEdgeTypeS0, staticTest.computeCollisionEdge(a, b, -d, r, s, ratio)); } for (double s = 0.0; s <= ratio; s += 0.1) { // Region 5 EXPECT_EQ(SegmentSegmentCcdStaticContact::SegmentCcdEdgeTypeR0, staticTest.computeCollisionEdge(a, b, d, r, s, ratio)); EXPECT_EQ(SegmentSegmentCcdStaticContact::SegmentCcdEdgeTypeR0, staticTest.computeCollisionEdge(a, b, -d, r, s, ratio)); } for (double s = ratio + 0.1; s <= 2 * ratio; s += 0.1) { // Region 4 EXPECT_EQ(SegmentSegmentCcdStaticContact::SegmentCcdEdgeTypeR0, staticTest.computeCollisionEdge(a, b, d, r, s, ratio)); EXPECT_EQ(SegmentSegmentCcdStaticContact::SegmentCcdEdgeTypeS1, staticTest.computeCollisionEdge(a, b, -d, r, s, ratio)); } } for (double r = 0.0; r <= ratio; r += 0.1) { for (double s = -1.0; s < 0.0; s += 0.1) { // Region 7 EXPECT_EQ(SegmentSegmentCcdStaticContact::SegmentCcdEdgeTypeS0, staticTest.computeCollisionEdge(a, b, d, r, s, ratio)); EXPECT_EQ(SegmentSegmentCcdStaticContact::SegmentCcdEdgeTypeS0, staticTest.computeCollisionEdge(a, b, -d, r, s, ratio)); } for (double s = 0.0; s <= ratio; s += 0.1) { // Region 0 EXPECT_EQ(SegmentSegmentCcdStaticContact::SegmentCcdEdgeTypeEdgeSkip, staticTest.computeCollisionEdge(a, b, d, r, s, ratio)); EXPECT_EQ(SegmentSegmentCcdStaticContact::SegmentCcdEdgeTypeEdgeSkip, staticTest.computeCollisionEdge(a, b, -d, r, s, ratio)); } for (double s = ratio + 0.1; s <= 2 * ratio; s += 0.1) { // Region 3 EXPECT_EQ(SegmentSegmentCcdStaticContact::SegmentCcdEdgeTypeS1, staticTest.computeCollisionEdge(a, b, d, r, s, ratio)); EXPECT_EQ(SegmentSegmentCcdStaticContact::SegmentCcdEdgeTypeS1, staticTest.computeCollisionEdge(a, b, -d, r, s, ratio)); } } for (double r = ratio + 0.1; r <= 2 * ratio; r += 0.1) { for (double s = -1.0; s < 0.0; s += 0.1) { // Region 8 EXPECT_EQ(SegmentSegmentCcdStaticContact::SegmentCcdEdgeTypeS0, staticTest.computeCollisionEdge(a, b, d, r, s, ratio)); EXPECT_EQ(SegmentSegmentCcdStaticContact::SegmentCcdEdgeTypeR1, staticTest.computeCollisionEdge(a, b, -d, r, s, ratio)); } for (double s = 0.0; s <= ratio; s += 0.1) { // Region 1 EXPECT_EQ(SegmentSegmentCcdStaticContact::SegmentCcdEdgeTypeR1, staticTest.computeCollisionEdge(a, b, d, r, s, ratio)); EXPECT_EQ(SegmentSegmentCcdStaticContact::SegmentCcdEdgeTypeR1, staticTest.computeCollisionEdge(a, b, -d, r, s, ratio)); } for (double s = ratio + 0.1; s <= 2 * ratio; s += 0.1) { // Region 2 EXPECT_EQ(SegmentSegmentCcdStaticContact::SegmentCcdEdgeTypeS1, staticTest.computeCollisionEdge(a, b, d, r, s, ratio)); EXPECT_EQ(SegmentSegmentCcdStaticContact::SegmentCcdEdgeTypeR1, staticTest.computeCollisionEdge(a, b, -d, r, s, ratio)); } } }; TEST(SegmentSegmentCcdStaticContactTests, CalculateParametrics) { MockSegmentSegmentCcdStaticContact staticTest; double a = 3.3; double b = 3.2; double c = 3.0; double d = 3.2; double e = -4.2; double ratio = 5.0; double r = 4.5; double s = 4.0; { SCOPED_TRACE("Testing region 0. Nearest point is on both segments."); staticTest.computeCollisionParametrics(SegmentSegmentCcdStaticContact::SegmentCcdEdgeTypeEdgeSkip, a, b, c, d, e, ratio, &r, &s); EXPECT_DOUBLE_EQ(0.9, r); EXPECT_DOUBLE_EQ(0.8, s); } { SCOPED_TRACE("Testing when r = 0. s depends on e and c."); e = 5.0; c = 7.0; staticTest.computeCollisionParametrics(SegmentSegmentCcdStaticContact::SegmentCcdEdgeTypeR0, a, b, c, d, e, ratio, &r, &s); EXPECT_DOUBLE_EQ(0.0, r); EXPECT_DOUBLE_EQ(0.0, s); e = -5.0; c = 7.0; staticTest.computeCollisionParametrics(SegmentSegmentCcdStaticContact::SegmentCcdEdgeTypeR0, a, b, c, d, e, ratio, &r, &s); EXPECT_DOUBLE_EQ(0.0, r); EXPECT_DOUBLE_EQ(5.0 / 7.0, s); e = -5.0; c = 4.0; staticTest.computeCollisionParametrics(SegmentSegmentCcdStaticContact::SegmentCcdEdgeTypeR0, a, b, c, d, e, ratio, &r, &s); EXPECT_DOUBLE_EQ(0.0, r); EXPECT_DOUBLE_EQ(1.0, s); } { SCOPED_TRACE("Testing when r = 1. s depends on e, b, and c."); e = 5.0; b = -4.0; c = 4.0; staticTest.computeCollisionParametrics(SegmentSegmentCcdStaticContact::SegmentCcdEdgeTypeR1, a, b, c, d, e, ratio, &r, &s); EXPECT_DOUBLE_EQ(1.0, r); EXPECT_DOUBLE_EQ(0.0, s); e = -5.0; b = 4.0; c = 4.0; staticTest.computeCollisionParametrics(SegmentSegmentCcdStaticContact::SegmentCcdEdgeTypeR1, a, b, c, d, e, ratio, &r, &s); EXPECT_DOUBLE_EQ(1.0, r); EXPECT_DOUBLE_EQ(0.25, s); e = -5.0; b = -4.0; c = 4.0; staticTest.computeCollisionParametrics(SegmentSegmentCcdStaticContact::SegmentCcdEdgeTypeR1, a, b, c, d, e, ratio, &r, &s); EXPECT_DOUBLE_EQ(1.0, r); EXPECT_DOUBLE_EQ(1.0, s); } { SCOPED_TRACE("Testing when s = 0. r depends on d and a."); d = 7.0; a = 8.0; staticTest.computeCollisionParametrics(SegmentSegmentCcdStaticContact::SegmentCcdEdgeTypeS0, a, b, c, d, e, ratio, &r, &s); EXPECT_DOUBLE_EQ(0.0, r); EXPECT_DOUBLE_EQ(0.0, s); d = -7.0; a = 8.0; staticTest.computeCollisionParametrics(SegmentSegmentCcdStaticContact::SegmentCcdEdgeTypeS0, a, b, c, d, e, ratio, &r, &s); EXPECT_DOUBLE_EQ(0.875, r); EXPECT_DOUBLE_EQ(0.0, s); d = -9.0; a = 8.0; staticTest.computeCollisionParametrics(SegmentSegmentCcdStaticContact::SegmentCcdEdgeTypeS0, a, b, c, d, e, ratio, &r, &s); EXPECT_DOUBLE_EQ(1.0, r); EXPECT_DOUBLE_EQ(0.0, s); SCOPED_TRACE("Testing when s = 1. r depends on d, b, and a."); d = 6.0; b = -1.0; a = 8.0; staticTest.computeCollisionParametrics(SegmentSegmentCcdStaticContact::SegmentCcdEdgeTypeS1, a, b, c, d, e, ratio, &r, &s); EXPECT_DOUBLE_EQ(0.0, r); EXPECT_DOUBLE_EQ(1.0, s); d = -6.0; b = -1.0; a = 8.0; staticTest.computeCollisionParametrics(SegmentSegmentCcdStaticContact::SegmentCcdEdgeTypeS1, a, b, c, d, e, ratio, &r, &s); EXPECT_DOUBLE_EQ(0.875, r); EXPECT_DOUBLE_EQ(1.0, s); d = -6.0; b = -6.0; a = 8.0; staticTest.computeCollisionParametrics(SegmentSegmentCcdStaticContact::SegmentCcdEdgeTypeS1, a, b, c, d, e, ratio, &r, &s); EXPECT_DOUBLE_EQ(1.0, r); EXPECT_DOUBLE_EQ(1.0, s); } }; TEST(SegmentSegmentCcdStaticContactTests, CalculateParallelParametrics) { MockSegmentSegmentCcdStaticContact staticTest; double a; double b; double d; double r = 4.5; double s = 4.0; { SCOPED_TRACE("Segments in opposite directions. End point r = s = 0."); a = 4.0; b = 3.2; d = 3.2; staticTest.computeParallelSegmentParametrics(a, b, d, &r, &s); EXPECT_DOUBLE_EQ(0.0, r); EXPECT_DOUBLE_EQ(0.0, s); } { SCOPED_TRACE("Segments in opposite directions. End point s0 in r."); a = 4.0; b = 4.0; d = -3.2; staticTest.computeParallelSegmentParametrics(a, b, d, &r, &s); EXPECT_DOUBLE_EQ(0.8, r); EXPECT_DOUBLE_EQ(0.0, s); } { SCOPED_TRACE("Segments in opposite directions. End point r = s = 1."); a = 4.0; b = 3.2; d = -9.2; staticTest.computeParallelSegmentParametrics(a, b, d, &r, &s); EXPECT_DOUBLE_EQ(1.0, r); EXPECT_DOUBLE_EQ(1.0, s); } { SCOPED_TRACE("Segments in opposite directions. End point r = 1 is closest to s."); a = 4.0; b = 3.2; d = -5.6; staticTest.computeParallelSegmentParametrics(a, b, d, &r, &s); EXPECT_DOUBLE_EQ(1.0, r); EXPECT_DOUBLE_EQ(0.5, s); } { SCOPED_TRACE("Segments in same directions, but don't overlap. End point r = 1, s = 0."); a = 4.0; b = -3.2; d = -4.2; staticTest.computeParallelSegmentParametrics(a, b, d, &r, &s); EXPECT_DOUBLE_EQ(1.0, r); EXPECT_DOUBLE_EQ(0.0, s); } { SCOPED_TRACE("Segments in same directions, r overlaps s0."); a = 4.0; b = -3.2; d = -3.0; staticTest.computeParallelSegmentParametrics(a, b, d, &r, &s); EXPECT_DOUBLE_EQ(0.75, r); EXPECT_DOUBLE_EQ(0.0, s); } { SCOPED_TRACE("Segments in same directions, end points r0 and s1 closest."); a = 4.0; b = -3.2; d = 6.0; staticTest.computeParallelSegmentParametrics(a, b, d, &r, &s); EXPECT_DOUBLE_EQ(0.0, r); EXPECT_DOUBLE_EQ(1.0, s); } { SCOPED_TRACE("Segments in same directions, and r0 overlaps s."); a = 4.0; b = -3.2; d = 2.4; staticTest.computeParallelSegmentParametrics(a, b, d, &r, &s); EXPECT_DOUBLE_EQ(0.0, r); EXPECT_DOUBLE_EQ(0.75, s); } }; TEST(SegmentSegmentCcdStaticContactTests, PointSegmentCollisions) { MockSegmentSegmentCcdStaticContact staticTest; Math::Vector3d point; Math::Vector3d p0; Math::Vector3d p1; std::array p; double thicknessA = 0.25; double thicknessP = 0.75; double r; { SCOPED_TRACE("Segment degenerate, end 0 is close enough."); point = Math::Vector3d(0.0, 0.0, 0.0); p0 = Math::Vector3d(0.0, 0.0, 1.0 - 1.0e-09 / 4.0); p1 = Math::Vector3d(0.0, 0.0, 1.0 + 1.0e-09 / 4.0); p[0] = p0; p[1] = p1; EXPECT_TRUE(staticTest.collideStaticPointSegment(point, p, thicknessA, thicknessP, &r)); EXPECT_DOUBLE_EQ(0.0, r); } { SCOPED_TRACE("Segment degenerate, end 1 is close enough."); point = Math::Vector3d(0.0, 0.0, 0.0); p0 = Math::Vector3d(0.0, 0.0, 1.0 - 1.0e-09 / 4.0); p1 = Math::Vector3d(0.0, 0.0, 1.0 + 1.0e-09 / 4.0); p[0] = p1; p[1] = p0; EXPECT_TRUE(staticTest.collideStaticPointSegment(point, p, thicknessA, thicknessP, &r)); EXPECT_DOUBLE_EQ(1.0, r); } { SCOPED_TRACE("Segment degenerate, neither point close enough."); point = Math::Vector3d(0.0, 0.0, 0.0); p0 = Math::Vector3d(0.0, 0.0, 1.0 - 1.0e-09 / 4.0); p1 = Math::Vector3d(1.0, 0.0, 1.0 + 1.0e-09 / 4.0); p[0] = p1; p[1] = p1; EXPECT_FALSE(staticTest.collideStaticPointSegment(point, p, thicknessA, thicknessP, &r)); } { SCOPED_TRACE("Segment clamped to 0, close enough"); point = Math::Vector3d(0.0, 0.5, 0.0); p0 = Math::Vector3d(0.5, 0.0, 0.25); p1 = Math::Vector3d(1.5, 0.0, 0.25); p[0] = p0; p[1] = p1; EXPECT_TRUE(staticTest.collideStaticPointSegment(point, p, thicknessA, thicknessP, &r)); EXPECT_DOUBLE_EQ(0.0, r); } { SCOPED_TRACE("Segment clamped to 0, not close enough"); point = Math::Vector3d(0.0, 1.0, 0.0); p0 = Math::Vector3d(0.5, 0.0, 0.25); p1 = Math::Vector3d(1.5, 0.0, 0.25); p[0] = p0; p[1] = p1; EXPECT_FALSE(staticTest.collideStaticPointSegment(point, p, thicknessA, thicknessP, &r)); } { SCOPED_TRACE("Segment clamped to 1, close enough"); point = Math::Vector3d(0.0, 0.5, 0.0); p0 = Math::Vector3d(0.5, 0.0, 0.25); p1 = Math::Vector3d(1.5, 0.0, 0.25); p[0] = p1; p[1] = p0; EXPECT_TRUE(staticTest.collideStaticPointSegment(point, p, thicknessA, thicknessP, &r)); EXPECT_DOUBLE_EQ(1.0, r); } { SCOPED_TRACE("Segment clamped to 1, not close enough"); point = Math::Vector3d(0.0, 1.0, 0.0); p0 = Math::Vector3d(0.5, 0.0, 0.25); p1 = Math::Vector3d(1.5, 0.0, 0.25); p[0] = p1; p[1] = p0; EXPECT_FALSE(staticTest.collideStaticPointSegment(point, p, thicknessA, thicknessP, &r)); } { SCOPED_TRACE("Segment not clamped, close enough"); point = Math::Vector3d(0.0, 0.5, 0.0); p0 = Math::Vector3d(-1.5, 0.0, 0.25); p1 = Math::Vector3d(1.5, 0.0, 0.25); p[0] = p0; p[1] = p1; EXPECT_TRUE(staticTest.collideStaticPointSegment(point, p, thicknessA, thicknessP, &r)); EXPECT_DOUBLE_EQ(0.5, r); } { SCOPED_TRACE("Segment not clamped, not close enough"); point = Math::Vector3d(0.0, 1.0, 0.0); p0 = Math::Vector3d(0.5, 0.0, 0.25); p1 = Math::Vector3d(1.5, 0.0, 0.25); p[0] = p0; p[1] = p1; EXPECT_FALSE(staticTest.collideStaticPointSegment(point, p, thicknessA, thicknessP, &r)); } }; TEST(SegmentSegmentCcdStaticContactTests, SegmentSegmentCollisions) { MockSegmentSegmentCcdStaticContact staticTest; Math::Vector3d p0; Math::Vector3d p1; std::array p; Math::Vector3d q0; Math::Vector3d q1; std::array q; double radiusP = 0.25; double radiusQ = 0.75; double distanceEpsilon = radiusP + radiusQ; double r; double s; Math::Vector3d increment(0.1, 0, 0); { SCOPED_TRACE("Test degenerate segment cases - 2 points"); p0 = Math::Vector3d(-1.0e-09 / 4.0, 0.0, 1.0); p1 = Math::Vector3d(1.0e-09 / 4.0, 0.0, 1.0); q0 = Math::Vector3d(-1.0 - 1.0e-09 / 4.0, 0.0, 0.5); q1 = Math::Vector3d(-1.0 + 1.0e-09 / 4.0, 0.0, 0.5); for (size_t ctr = 0; ctr < 2; ++ctr) { p[0] = p0; p[1] = p1; q[0] = q0; q[1] = q1; EXPECT_FALSE(staticTest.collideStaticSegmentSegment(p, q, distanceEpsilon, &r, &s)); EXPECT_FALSE(staticTest.collideStaticSegmentSegment(p, q, radiusP, radiusQ, &r, &s)); q0 += increment; q1 += increment; } for (size_t ctr = 0; ctr < 17; ++ctr) { p[0] = p0; p[1] = p1; q[0] = q0; q[1] = q1; EXPECT_TRUE(staticTest.collideStaticSegmentSegment(p, q, distanceEpsilon, &r, &s)); EXPECT_DOUBLE_EQ(0.0, s); EXPECT_DOUBLE_EQ(0.0, r); EXPECT_TRUE(staticTest.collideStaticSegmentSegment(p, q, radiusP, radiusQ, &r, &s)); EXPECT_DOUBLE_EQ(0.0, s); EXPECT_DOUBLE_EQ(0.0, r); q0 += increment; q1 += increment; } for (size_t ctr = 0; ctr < 2; ++ctr) { p[0] = p0; p[1] = p1; q[0] = q0; q[1] = q1; EXPECT_FALSE(staticTest.collideStaticSegmentSegment(p, q, distanceEpsilon, &r, &s)); EXPECT_FALSE(staticTest.collideStaticSegmentSegment(p, q, radiusP, radiusQ, &r, &s)); q0 += increment; q1 += increment; } } { SCOPED_TRACE("Test degenerate segment cases - one segment is point"); p0 = Math::Vector3d(0.0, 0.0, 1.0); p1 = Math::Vector3d(1.0e-09 / 2.0, 0.0, 1.0); q0 = Math::Vector3d(-1.0, 0.0, 0.5); q1 = Math::Vector3d(-2.0, 0.0, 0.5); for (size_t ctr = 0; ctr < 2; ++ctr) { p[0] = p0; p[1] = p1; q[0] = q0; q[1] = q1; EXPECT_FALSE(staticTest.collideStaticSegmentSegment(p, q, distanceEpsilon, &r, &s)); EXPECT_FALSE(staticTest.collideStaticSegmentSegment(p, q, radiusP, radiusQ, &r, &s)); EXPECT_FALSE(staticTest.collideStaticSegmentSegment(q, p, distanceEpsilon, &r, &s)); EXPECT_FALSE(staticTest.collideStaticSegmentSegment(q, p, radiusP, radiusQ, &r, &s)); q0 += increment; q1 += increment; } for (size_t ctr = 0; ctr < 8; ++ctr) { p[0] = p0; p[1] = p1; q[0] = q0; q[1] = q1; EXPECT_TRUE(staticTest.collideStaticSegmentSegment(p, q, distanceEpsilon, &r, &s)); EXPECT_DOUBLE_EQ(0.0, s); EXPECT_DOUBLE_EQ(0.0, r); EXPECT_TRUE(staticTest.collideStaticSegmentSegment(p, q, radiusP, radiusQ, &r, &s)); EXPECT_DOUBLE_EQ(0.0, s); EXPECT_DOUBLE_EQ(0.0, r); EXPECT_TRUE(staticTest.collideStaticSegmentSegment(q, p, distanceEpsilon, &r, &s)); EXPECT_DOUBLE_EQ(0.0, s); EXPECT_DOUBLE_EQ(0.0, r); EXPECT_TRUE(staticTest.collideStaticSegmentSegment(q, p, radiusP, radiusQ, &r, &s)); EXPECT_DOUBLE_EQ(0.0, s); EXPECT_DOUBLE_EQ(0.0, r); q0 += increment; q1 += increment; } for (size_t ctr = 0; ctr < 10; ++ctr) { p[0] = p0; p[1] = p1; q[0] = q0; q[1] = q1; EXPECT_TRUE(staticTest.collideStaticSegmentSegment(p, q, distanceEpsilon, &r, &s)); EXPECT_NEAR(ctr / 10.0, s, epsilon); EXPECT_DOUBLE_EQ(0.0, r); EXPECT_TRUE(staticTest.collideStaticSegmentSegment(p, q, radiusP, radiusQ, &r, &s)); EXPECT_NEAR(ctr / 10.0, s, epsilon); EXPECT_DOUBLE_EQ(0.0, r); EXPECT_TRUE(staticTest.collideStaticSegmentSegment(q, p, distanceEpsilon, &r, &s)); EXPECT_NEAR(ctr / 10.0, r, epsilon); EXPECT_DOUBLE_EQ(0.0, s); EXPECT_TRUE(staticTest.collideStaticSegmentSegment(q, p, radiusP, radiusQ, &r, &s)); EXPECT_NEAR(ctr / 10.0, r, epsilon); EXPECT_DOUBLE_EQ(0.0, s); q0 += increment; q1 += increment; } for (size_t ctr = 0; ctr < 9; ++ctr) { p[0] = p0; p[1] = p1; q[0] = q0; q[1] = q1; EXPECT_TRUE(staticTest.collideStaticSegmentSegment(p, q, distanceEpsilon, &r, &s)); EXPECT_DOUBLE_EQ(1.0, s); EXPECT_DOUBLE_EQ(0.0, r); EXPECT_TRUE(staticTest.collideStaticSegmentSegment(p, q, radiusP, radiusQ, &r, &s)); EXPECT_DOUBLE_EQ(1.0, s); EXPECT_DOUBLE_EQ(0.0, r); EXPECT_TRUE(staticTest.collideStaticSegmentSegment(q, p, distanceEpsilon, &r, &s)); EXPECT_DOUBLE_EQ(1.0, r); EXPECT_DOUBLE_EQ(0.0, s); EXPECT_TRUE(staticTest.collideStaticSegmentSegment(q, p, radiusP, radiusQ, &r, &s)); EXPECT_DOUBLE_EQ(1.0, r); EXPECT_DOUBLE_EQ(0.0, s); q0 += increment; q1 += increment; } for (size_t ctr = 0; ctr < 2; ++ctr) { p[0] = p0; p[1] = p1; q[0] = q0; q[1] = q1; EXPECT_FALSE(staticTest.collideStaticSegmentSegment(p, q, distanceEpsilon, &r, &s)); EXPECT_FALSE(staticTest.collideStaticSegmentSegment(p, q, radiusP, radiusQ, &r, &s)); EXPECT_FALSE(staticTest.collideStaticSegmentSegment(q, p, distanceEpsilon, &r, &s)); EXPECT_FALSE(staticTest.collideStaticSegmentSegment(q, p, radiusP, radiusQ, &r, &s)); q0 += increment; q1 += increment; } } { SCOPED_TRACE("Test degenerate segment cases - Parallel segments"); Math::Vector3d newP; Math::Vector3d newQ; p0 = Math::Vector3d(0.0, 0.0, 1.0); p1 = Math::Vector3d(1.0, 0.0, 1.0); q0 = Math::Vector3d(-1.0, 0.0, 0.5); q1 = Math::Vector3d(-2.0, 0.0, 0.5); for (size_t ctr = 0; ctr < 2; ++ctr) { p[0] = p0; p[1] = p1; q[0] = q0; q[1] = q1; EXPECT_FALSE(staticTest.collideStaticSegmentSegment(p, q, distanceEpsilon, &r, &s)); EXPECT_FALSE(staticTest.collideStaticSegmentSegment(p, q, radiusP, radiusQ, &r, &s)); EXPECT_FALSE(staticTest.collideStaticSegmentSegment(q, p, distanceEpsilon, &r, &s)); EXPECT_FALSE(staticTest.collideStaticSegmentSegment(q, p, radiusP, radiusQ, &r, &s)); q0 += increment; q1 += increment; } for (size_t ctr = 0; ctr < 8; ++ctr) { p[0] = p0; p[1] = p1; q[0] = q0; q[1] = q1; EXPECT_TRUE(staticTest.collideStaticSegmentSegment(p, q, distanceEpsilon, &r, &s)); EXPECT_DOUBLE_EQ(0.0, s); EXPECT_DOUBLE_EQ(0.0, r); EXPECT_TRUE(staticTest.collideStaticSegmentSegment(p, q, radiusP, radiusQ, &r, &s)); EXPECT_DOUBLE_EQ(0.0, s); EXPECT_DOUBLE_EQ(0.0, r); EXPECT_TRUE(staticTest.collideStaticSegmentSegment(q, p, distanceEpsilon, &r, &s)); EXPECT_DOUBLE_EQ(0.0, s); EXPECT_DOUBLE_EQ(0.0, r); EXPECT_TRUE(staticTest.collideStaticSegmentSegment(q, p, radiusP, radiusQ, &r, &s)); EXPECT_DOUBLE_EQ(0.0, s); EXPECT_DOUBLE_EQ(0.0, r); q0 += increment; q1 += increment; } for (size_t ctr = 0; ctr < 20; ++ctr) { p[0] = p0; p[1] = p1; q[0] = q0; q[1] = q1; EXPECT_TRUE(staticTest.collideStaticSegmentSegment(p, q, distanceEpsilon, &r, &s)); newP = Math::interpolate(p0, p1, r); newQ = Math::interpolate(q0, q1, s); EXPECT_NEAR(0.5, (newP - newQ).norm(), epsilon); EXPECT_TRUE(staticTest.collideStaticSegmentSegment(p, q, radiusP, radiusQ, &r, &s)); newP = Math::interpolate(p0, p1, r); newQ = Math::interpolate(q0, q1, s); EXPECT_NEAR(0.5, (newP - newQ).norm(), epsilon); EXPECT_TRUE(staticTest.collideStaticSegmentSegment(q, p, distanceEpsilon, &r, &s)); newP = Math::interpolate(p0, p1, s); newQ = Math::interpolate(q0, q1, r); EXPECT_NEAR(0.5, (newP - newQ).norm(), epsilon); EXPECT_TRUE(staticTest.collideStaticSegmentSegment(q, p, radiusP, radiusQ, &r, &s)); newP = Math::interpolate(p0, p1, s); newQ = Math::interpolate(q0, q1, r); EXPECT_NEAR(0.5, (newP - newQ).norm(), epsilon); q0 += increment; q1 += increment; } for (size_t ctr = 0; ctr < 9; ++ctr) { p[0] = p0; p[1] = p1; q[0] = q0; q[1] = q1; EXPECT_TRUE(staticTest.collideStaticSegmentSegment(p, q, distanceEpsilon, &r, &s)); EXPECT_DOUBLE_EQ(1.0, s); EXPECT_DOUBLE_EQ(1.0, r); EXPECT_TRUE(staticTest.collideStaticSegmentSegment(p, q, radiusP, radiusQ, &r, &s)); EXPECT_DOUBLE_EQ(1.0, s); EXPECT_DOUBLE_EQ(1.0, r); EXPECT_TRUE(staticTest.collideStaticSegmentSegment(q, p, distanceEpsilon, &r, &s)); EXPECT_DOUBLE_EQ(1.0, r); EXPECT_DOUBLE_EQ(1.0, s); EXPECT_TRUE(staticTest.collideStaticSegmentSegment(q, p, radiusP, radiusQ, &r, &s)); EXPECT_DOUBLE_EQ(1.0, r); EXPECT_DOUBLE_EQ(1.0, s); q0 += increment; q1 += increment; } for (size_t ctr = 0; ctr < 2; ++ctr) { p[0] = p0; p[1] = p1; q[0] = q0; q[1] = q1; EXPECT_FALSE(staticTest.collideStaticSegmentSegment(p, q, distanceEpsilon, &r, &s)); EXPECT_FALSE(staticTest.collideStaticSegmentSegment(p, q, radiusP, radiusQ, &r, &s)); EXPECT_FALSE(staticTest.collideStaticSegmentSegment(q, p, distanceEpsilon, &r, &s)); EXPECT_FALSE(staticTest.collideStaticSegmentSegment(q, p, radiusP, radiusQ, &r, &s)); q0 += increment; q1 += increment; } } { SCOPED_TRACE("Test intersecting segments"); Math::Vector3d newP; Math::Vector3d newQ; p0 = Math::Vector3d(0.0, -1.0, 1.0); p1 = Math::Vector3d(0.0, 1.0, 1.0); q0 = Math::Vector3d(-1.0, 0.0, 0.5); q1 = Math::Vector3d(-3.0, 0.0, 0.5); for (size_t ctr = 0; ctr < 2; ++ctr) { p[0] = p0; p[1] = p1; q[0] = q0; q[1] = q1; EXPECT_FALSE(staticTest.collideStaticSegmentSegment(p, q, distanceEpsilon, &r, &s)); EXPECT_FALSE(staticTest.collideStaticSegmentSegment(p, q, radiusP, radiusQ, &r, &s)); EXPECT_FALSE(staticTest.collideStaticSegmentSegment(q, p, distanceEpsilon, &r, &s)); EXPECT_FALSE(staticTest.collideStaticSegmentSegment(q, p, radiusP, radiusQ, &r, &s)); q0 += increment; q1 += increment; } for (size_t ctr = 0; ctr < 8; ++ctr) { p[0] = p0; p[1] = p1; q[0] = q0; q[1] = q1; EXPECT_TRUE(staticTest.collideStaticSegmentSegment(p, q, distanceEpsilon, &r, &s)); EXPECT_DOUBLE_EQ(0.0, s); EXPECT_DOUBLE_EQ(0.5, r); EXPECT_TRUE(staticTest.collideStaticSegmentSegment(p, q, radiusP, radiusQ, &r, &s)); EXPECT_DOUBLE_EQ(0.0, s); EXPECT_DOUBLE_EQ(0.5, r); EXPECT_TRUE(staticTest.collideStaticSegmentSegment(q, p, distanceEpsilon, &r, &s)); EXPECT_DOUBLE_EQ(0.5, s); EXPECT_DOUBLE_EQ(0.0, r); EXPECT_TRUE(staticTest.collideStaticSegmentSegment(q, p, radiusP, radiusQ, &r, &s)); EXPECT_DOUBLE_EQ(0.5, s); EXPECT_DOUBLE_EQ(0.0, r); q0 += increment; q1 += increment; } for (size_t ctr = 0; ctr < 20; ++ctr) { p[0] = p0; p[1] = p1; q[0] = q0; q[1] = q1; EXPECT_TRUE(staticTest.collideStaticSegmentSegment(p, q, distanceEpsilon, &r, &s)); newP = Math::interpolate(p0, p1, r); newQ = Math::interpolate(q0, q1, s); EXPECT_NEAR(0.5, (newP - newQ).norm(), epsilon); EXPECT_TRUE(staticTest.collideStaticSegmentSegment(p, q, radiusP, radiusQ, &r, &s)); newP = Math::interpolate(p0, p1, r); newQ = Math::interpolate(q0, q1, s); EXPECT_NEAR(0.5, (newP - newQ).norm(), epsilon); EXPECT_TRUE(staticTest.collideStaticSegmentSegment(q, p, distanceEpsilon, &r, &s)); newP = Math::interpolate(p0, p1, s); newQ = Math::interpolate(q0, q1, r); EXPECT_NEAR(0.5, (newP - newQ).norm(), epsilon); EXPECT_TRUE(staticTest.collideStaticSegmentSegment(q, p, radiusP, radiusQ, &r, &s)); newP = Math::interpolate(p0, p1, s); newQ = Math::interpolate(q0, q1, r); EXPECT_NEAR(0.5, (newP - newQ).norm(), epsilon); q0 += increment; q1 += increment; } for (size_t ctr = 0; ctr < 9; ++ctr) { p[0] = p0; p[1] = p1; q[0] = q0; q[1] = q1; EXPECT_TRUE(staticTest.collideStaticSegmentSegment(p, q, distanceEpsilon, &r, &s)); EXPECT_DOUBLE_EQ(1.0, s); EXPECT_DOUBLE_EQ(0.5, r); EXPECT_TRUE(staticTest.collideStaticSegmentSegment(p, q, radiusP, radiusQ, &r, &s)); EXPECT_DOUBLE_EQ(1.0, s); EXPECT_DOUBLE_EQ(0.5, r); EXPECT_TRUE(staticTest.collideStaticSegmentSegment(q, p, distanceEpsilon, &r, &s)); EXPECT_DOUBLE_EQ(1.0, r); EXPECT_DOUBLE_EQ(0.5, s); EXPECT_TRUE(staticTest.collideStaticSegmentSegment(q, p, radiusP, radiusQ, &r, &s)); EXPECT_DOUBLE_EQ(1.0, r); EXPECT_DOUBLE_EQ(0.5, s); q0 += increment; q1 += increment; } for (size_t ctr = 0; ctr < 2; ++ctr) { p[0] = p0; p[1] = p1; q[0] = q0; q[1] = q1; EXPECT_FALSE(staticTest.collideStaticSegmentSegment(p, q, distanceEpsilon, &r, &s)); EXPECT_FALSE(staticTest.collideStaticSegmentSegment(p, q, radiusP, radiusQ, &r, &s)); EXPECT_FALSE(staticTest.collideStaticSegmentSegment(q, p, distanceEpsilon, &r, &s)); EXPECT_FALSE(staticTest.collideStaticSegmentSegment(q, p, radiusP, radiusQ, &r, &s)); q0 += increment; q1 += increment; } } }; }; // namespace Collision }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Collision/UnitTests/SegmentSelfContactTests.cpp000066400000000000000000000606071277777236100266720ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the SegmentSegmentCheck functions. #include #include #include "SurgSim/Collision/CollisionPair.h" #include "SurgSim/Collision/SegmentSelfContact.h" #include "SurgSim/DataStructures/AabbTree.h" #include "SurgSim/DataStructures/Location.h" #include "SurgSim/Math/SegmentMeshShape.h" using SurgSim::DataStructures::Location; using SurgSim::DataStructures::SegmentMeshPlain; using SurgSim::Math::SegmentMeshShape; using SurgSim::Math::Vector3d; namespace SurgSim { namespace Collision { class MockSegmentCcdSelfContact : public SurgSim::Collision::SegmentSelfContact { public: double maxTimePrecision( const std::array& pt0Positions, const std::array& pt1Positions, const std::array& qt0Positions, const std::array& qt1Positions, double effectiveThickness) const { return SegmentSelfContact::maxTimePrecision(pt0Positions, pt1Positions, qt0Positions, qt1Positions, effectiveThickness); } bool isSameSegContactPoint(const Math::SegmentMeshShape& segmentShape, size_t segId1, double s1, size_t segId2, double s2) const { return SegmentSelfContact::isSameSegContactPoint(segmentShape, segId1, s1, segId2, s2); } bool findSegSegContact(const Math::SegmentMeshShape& segmentShape, const std::list>& contacts, double toi, Collision::CollisionDetectionType collisionType, size_t segId1, double s1, size_t segId2, double s2, double timeEpsilon) const { return SegmentSelfContact::findSegSegContact( segmentShape, contacts, toi, collisionType, segId1, s1, segId2, s2, timeEpsilon); } bool detectExcessMovement(const SurgSim::Math::Vector3d& pt0, const SurgSim::Math::Vector3d& pt1, double threshold) const { return SegmentSelfContact::detectExcessMovement(pt0, pt1, threshold); } bool removeInvalidCollisions( const Math::SegmentMeshShape& segmentA, const Math::SegmentMeshShape& segmentB, size_t id1, size_t id2) const { return SegmentSelfContact::removeInvalidCollisions(segmentA, segmentB, id1, id2); } void getUniqueCandidates( const std::list& intersectionList, std::set>* segmentIdList) const { SegmentSelfContact::getUniqueCandidates(intersectionList, segmentIdList); } bool detectCollision( const std::array& pt0Positions, const std::array& pt1Positions, const std::array& qt0Positions, const std::array& qt1Positions, double segmentRadius1, double segmentRadius2, double timePrecision, double* r, double* s, double* t, SurgSim::Math::Vector3d* pToQDir, SurgSim::Math::Vector3d* contactPtP, SurgSim::Math::Vector3d* contactPtQ) const { return SegmentSelfContact::detectCollision(pt0Positions, pt1Positions, qt0Positions, qt1Positions, segmentRadius1, segmentRadius2, timePrecision, r, s, t, pToQDir, contactPtP, contactPtQ); } }; class SegmentCcdSelfContactTests : public ::testing::Test { public: void SetUp() { MockSegmentCcdSelfContact m_selfContact; } std::shared_ptr createContact(CollisionDetectionType type, double r, double s, size_t seg1, size_t seg2, double toi) { std::pair penetrationPoints; Math::Vector2d parametricCoordinateP(1.0 - r, r); penetrationPoints.first.elementMeshLocalCoordinate.setValue( SurgSim::DataStructures::IndexedLocalCoordinate(seg1, parametricCoordinateP)); Math::Vector2d parametricCoordinateQ(1.0 - s, s); penetrationPoints.second.elementMeshLocalCoordinate.setValue( SurgSim::DataStructures::IndexedLocalCoordinate(seg2, parametricCoordinateQ)); // Dummy up some values unless we need them Vector3d normal(1.0, 0.0, 0.0); Vector3d contactPoint(0.0, 0.0, 0.0); return std::make_shared(type, 0.0, toi, contactPoint, normal, penetrationPoints); } std::shared_ptr build(const Vector3d& start, const Vector3d& direction, double radius, size_t numVertices = 10) const { auto mesh = std::make_shared(); // Add the vertices for (size_t i = 0; i < numVertices; ++i) { mesh->addVertex(SegmentMeshPlain::VertexType(start + direction * static_cast(i))); } // Define the edges for (size_t i = 0; i < numVertices - 1; ++i) { std::array indices = {{i, i + 1}}; mesh->addEdge(SegmentMeshPlain::EdgeType(indices)); } return std::make_shared(*mesh, radius); } std::shared_ptr buildLoop(double zInit, double radius) const { auto mesh = std::make_shared(); double zDelta = 2 * zInit / 10; double z = zInit; mesh->addVertex(SegmentMeshPlain::VertexType(Vector3d(1.0, 1.0, z))); z -= zDelta; mesh->addVertex(SegmentMeshPlain::VertexType(Vector3d(0.0, 0.0, z))); z -= zDelta; mesh->addVertex(SegmentMeshPlain::VertexType(Vector3d(-0.25, -0.25, z))); z -= zDelta; mesh->addVertex(SegmentMeshPlain::VertexType(Vector3d(-0.5, -0.5, z))); z -= zDelta; mesh->addVertex(SegmentMeshPlain::VertexType(Vector3d(-0.25, -0.75, z))); z -= zDelta; mesh->addVertex(SegmentMeshPlain::VertexType(Vector3d(0.0, -1.0, z))); z -= zDelta; mesh->addVertex(SegmentMeshPlain::VertexType(Vector3d(0.25, -0.75, z))); z -= zDelta; mesh->addVertex(SegmentMeshPlain::VertexType(Vector3d(0.5, -0.5, z))); z -= zDelta; mesh->addVertex(SegmentMeshPlain::VertexType(Vector3d(0.25, -0.25, z))); z -= zDelta; mesh->addVertex(SegmentMeshPlain::VertexType(Vector3d(0.0, 0.0, z))); z -= zDelta; mesh->addVertex(SegmentMeshPlain::VertexType(Vector3d(-1.0, 1.0, z))); // Define the edges for (size_t i = 0; i < 10; ++i) { std::array indices = {{i, i + 1}}; mesh->addEdge(SegmentMeshPlain::EdgeType(indices)); } return std::make_shared(*mesh, radius); } MockSegmentCcdSelfContact m_selfContact; }; TEST_F(SegmentCcdSelfContactTests, Initialization) { ASSERT_NO_THROW(SegmentSelfContact selfContact); SegmentSelfContact selfContact; auto shapeTypes = selfContact.getShapeTypes(); EXPECT_EQ(SurgSim::Math::SHAPE_TYPE_SEGMENTMESH, shapeTypes.first); EXPECT_EQ(SurgSim::Math::SHAPE_TYPE_SEGMENTMESH, shapeTypes.second); EXPECT_DOUBLE_EQ(1e-06, selfContact.getTimeMinPrecisionEpsilon()); EXPECT_DOUBLE_EQ(1.0, selfContact.getTimeMaxPrecisionEpsilon()); EXPECT_DOUBLE_EQ(1e-04, selfContact.distanceEpsilon()); EXPECT_ANY_THROW(selfContact.setTimeMinPrecisionEpsilon(0.0)); EXPECT_ANY_THROW(selfContact.setTimeMinPrecisionEpsilon(-2.0e-06)); EXPECT_ANY_THROW(selfContact.setTimeMaxPrecisionEpsilon(0.0)); EXPECT_ANY_THROW(selfContact.setTimeMaxPrecisionEpsilon(-1.0e-05)); selfContact.setTimeMinPrecisionEpsilon(2.0e-06); selfContact.setTimeMaxPrecisionEpsilon(1.0e-05); selfContact.setDistanceEpsilon(1.0e-06); EXPECT_DOUBLE_EQ(2e-06, selfContact.getTimeMinPrecisionEpsilon()); EXPECT_DOUBLE_EQ(1.0e-05, selfContact.getTimeMaxPrecisionEpsilon()); EXPECT_DOUBLE_EQ(1.0e-06, selfContact.distanceEpsilon()); }; TEST_F(SegmentCcdSelfContactTests, MaxTimePrecision) { Math::Vector3d zeroPosition(0.0, 0.0, 0.0); Math::Vector3d changePos(1.0, 2.0, 3.0); Math::Vector3d changeNeg(-1.0, -2.0, -3.0); std::array noChange = {zeroPosition, zeroPosition}; std::array change = {changePos, changeNeg}; m_selfContact.setTimeMaxPrecisionEpsilon(1.0e-05); ASSERT_ANY_THROW(m_selfContact.maxTimePrecision(change, noChange, noChange, noChange, -0.5)); EXPECT_DOUBLE_EQ(1.0e-05, m_selfContact.maxTimePrecision(change, noChange, noChange, noChange, 0.5)); EXPECT_DOUBLE_EQ(1.0e-05, m_selfContact.maxTimePrecision(noChange, change, noChange, noChange, 0.5)); EXPECT_DOUBLE_EQ(1.0e-05, m_selfContact.maxTimePrecision(noChange, noChange, change, noChange, 0.5)); EXPECT_DOUBLE_EQ(1.0e-05, m_selfContact.maxTimePrecision(noChange, noChange, noChange, change, 0.5)); EXPECT_DOUBLE_EQ(3.0e-05 / std::sqrt(14), m_selfContact.maxTimePrecision(change, noChange, noChange, noChange, 3.0e-05)); EXPECT_DOUBLE_EQ(3.0e-05 / std::sqrt(14), m_selfContact.maxTimePrecision(noChange, change, noChange, noChange, 3.0e-05)); EXPECT_DOUBLE_EQ(3.0e-05 / std::sqrt(14), m_selfContact.maxTimePrecision(noChange, noChange, change, noChange, 3.0e-05)); EXPECT_DOUBLE_EQ(3.0e-05 / std::sqrt(14), m_selfContact.maxTimePrecision(noChange, noChange, noChange, change, 3.0e-05)); EXPECT_DOUBLE_EQ(1.0e-06, m_selfContact.maxTimePrecision(change, noChange, noChange, noChange, 3.0e-07)); EXPECT_DOUBLE_EQ(1.0e-06, m_selfContact.maxTimePrecision(noChange, change, noChange, noChange, 3.0e-07)); EXPECT_DOUBLE_EQ(1.0e-06, m_selfContact.maxTimePrecision(noChange, noChange, change, noChange, 3.0e-07)); EXPECT_DOUBLE_EQ(1.0e-06, m_selfContact.maxTimePrecision(noChange, noChange, noChange, change, 3.0e-07)); }; TEST_F(SegmentCcdSelfContactTests, IsSameSegContactPoint) { std::shared_ptr shape = build(Vector3d(-10.0, -10.0, -10.0), Vector3d(10.0, 10.0, 10.0), 0.5, 10); m_selfContact.setTimeMaxPrecisionEpsilon(1.0e-06); m_selfContact.setTimeMinPrecisionEpsilon(1.0e-06); m_selfContact.setDistanceEpsilon(1.0e-09); // Different segments, no shared endpoints EXPECT_FALSE(m_selfContact.isSameSegContactPoint(*shape, 1, 0.9, 7, 0.8)); // Same segment, discrete contact points EXPECT_FALSE(m_selfContact.isSameSegContactPoint(*shape, 1, 0.9 - 1.0e-09, 1, 0.9 + 1.0e-09)); // Same segment, same contact point EXPECT_TRUE(m_selfContact.isSameSegContactPoint(*shape, 1, 0.9 - 5.0e-10, 1, 0.9 + 4.9e-10)); // Different segment, failure on distance from endpoint EXPECT_FALSE(m_selfContact.isSameSegContactPoint(*shape, 1, 2.0e-09, 0, 1.0)); EXPECT_FALSE(m_selfContact.isSameSegContactPoint(*shape, 1, 1.0 - 2.0e-09, 2, 0.0)); EXPECT_FALSE(m_selfContact.isSameSegContactPoint(*shape, 1, 0.0, 0, 1.0 - 2.0e-09)); EXPECT_FALSE(m_selfContact.isSameSegContactPoint(*shape, 1, 1.0, 2, 2.0e-09)); // Different segment, failure on adjacency EXPECT_FALSE(m_selfContact.isSameSegContactPoint(*shape, 1, 4.9e-10, 2, 1.0 - 5.0e-10)); EXPECT_FALSE(m_selfContact.isSameSegContactPoint(*shape, 1, 1.0 - 5.0e-10, 0, 4.9e-10)); EXPECT_FALSE(m_selfContact.isSameSegContactPoint(*shape, 1, 4.9e-10, 2, 1.0 - 5.0e-10)); EXPECT_FALSE(m_selfContact.isSameSegContactPoint(*shape, 1, 1.0 - 5.0e-10, 0, 4.9e-10)); // Different segment, same contact point EXPECT_TRUE(m_selfContact.isSameSegContactPoint(*shape, 1, 4.9e-10, 0, 1.0 - 5.0e-10)); EXPECT_TRUE(m_selfContact.isSameSegContactPoint(*shape, 1, 1.0 - 5.0e-10, 2, 4.9e-10)); EXPECT_TRUE(m_selfContact.isSameSegContactPoint(*shape, 1, 4.9e-10, 0, 1.0 - 5.0e-10)); EXPECT_TRUE(m_selfContact.isSameSegContactPoint(*shape, 1, 1.0 - 5.0e-10, 2, 4.9e-10)); }; TEST_F(SegmentCcdSelfContactTests, FindSegSegContact) { std::shared_ptr shape = build(Vector3d(-10.0, -10.0, -10.0), Vector3d(10.0, 10.0, 10.0), 0.5, 10); { SCOPED_TRACE("Wrong collision type"); std::list> contacts; contacts.emplace_back(createContact( CollisionDetectionType::COLLISION_DETECTION_TYPE_DISCRETE, 0.8, 0.4, 1, 3, 0.25)); EXPECT_FALSE(m_selfContact.findSegSegContact(*shape, contacts, 0.25, CollisionDetectionType::COLLISION_DETECTION_TYPE_CONTINUOUS, 1, 0.8, 3, 0.4, 1.0e-06)); } { SCOPED_TRACE("Wrong time"); std::list> contacts; contacts.emplace_back(createContact( CollisionDetectionType::COLLISION_DETECTION_TYPE_CONTINUOUS, 0.8, 0.4, 1, 3, 0.25)); EXPECT_FALSE(m_selfContact.findSegSegContact(*shape, contacts, 0.25 - 2.0e-06, CollisionDetectionType::COLLISION_DETECTION_TYPE_CONTINUOUS, 1, 0.8, 3, 0.4, 1.0e-06)); EXPECT_FALSE(m_selfContact.findSegSegContact(*shape, contacts, 0.25 + 2.0e-06, CollisionDetectionType::COLLISION_DETECTION_TYPE_CONTINUOUS, 1, 0.8, 3, 0.4, 1.0e-06)); } { SCOPED_TRACE("Wrong segment ID"); std::list> contacts; contacts.emplace_back(createContact( CollisionDetectionType::COLLISION_DETECTION_TYPE_CONTINUOUS, 0.8, 0.4, 1, 3, 0.25)); EXPECT_FALSE(m_selfContact.findSegSegContact(*shape, contacts, 0.25, CollisionDetectionType::COLLISION_DETECTION_TYPE_CONTINUOUS, 2, 0.8, 3, 0.4, 1.0e-06)); EXPECT_FALSE(m_selfContact.findSegSegContact(*shape, contacts, 0.25, CollisionDetectionType::COLLISION_DETECTION_TYPE_CONTINUOUS, 1, 0.4, 4, 0.4, 1.0e-06)); } { SCOPED_TRACE("Wrong parametric value"); std::list> contacts; contacts.emplace_back(createContact( CollisionDetectionType::COLLISION_DETECTION_TYPE_CONTINUOUS, 0.8, 0.4, 1, 3, 0.25)); EXPECT_FALSE(m_selfContact.findSegSegContact(*shape, contacts, 0.25, CollisionDetectionType::COLLISION_DETECTION_TYPE_CONTINUOUS, 1, 0.8 - 1.0e-03, 3, 0.4, 1.0e-06)); } { SCOPED_TRACE("Same point, middle of segment"); std::list> contacts; contacts.emplace_back(createContact( CollisionDetectionType::COLLISION_DETECTION_TYPE_CONTINUOUS, 0.8, 0.4, 1, 3, 0.25)); EXPECT_TRUE(m_selfContact.findSegSegContact(*shape, contacts, 0.25, CollisionDetectionType::COLLISION_DETECTION_TYPE_CONTINUOUS, 1, 0.8, 3, 0.4, 1.0e-06)); } { SCOPED_TRACE("Same point, segment endpoints"); std::list> contacts; contacts.emplace_back(createContact( CollisionDetectionType::COLLISION_DETECTION_TYPE_CONTINUOUS, 1.0, 0.0, 1, 4, 0.25)); EXPECT_TRUE(m_selfContact.findSegSegContact(*shape, contacts, 0.25, CollisionDetectionType::COLLISION_DETECTION_TYPE_CONTINUOUS, 2, 0.0, 3, 1.0, 1.0e-06)); } }; TEST_F(SegmentCcdSelfContactTests, DetectExcessMovement) { Vector3d point1(1.0e-03 / 2.0, 1.0e-03 / 2.0, 1.0e-03 / 2.0); Vector3d point2(0.0, 0.0, 0.0); EXPECT_FALSE(m_selfContact.detectExcessMovement(point1, point2, 1.0e-03)); EXPECT_FALSE(m_selfContact.detectExcessMovement(point2, point1, 1.0e-03)); point2 = Vector3d(-1.0e-03, 0.0, 0.0); EXPECT_TRUE(m_selfContact.detectExcessMovement(point1, point2, 1.0e-03)); EXPECT_TRUE(m_selfContact.detectExcessMovement(point2, point1, 1.0e-03)); point2 = Vector3d(0.0, -1.0e-03, 0.0); EXPECT_TRUE(m_selfContact.detectExcessMovement(point1, point2, 1.0e-03)); EXPECT_TRUE(m_selfContact.detectExcessMovement(point2, point1, 1.0e-03)); point2 = Vector3d(0.0, 0.0, -1.0e-03); EXPECT_TRUE(m_selfContact.detectExcessMovement(point1, point2, 1.0e-03)); EXPECT_TRUE(m_selfContact.detectExcessMovement(point2, point1, 1.0e-03)); }; TEST_F(SegmentCcdSelfContactTests, RemoveInvalidCollisions) { std::shared_ptr shapeT0 = buildLoop(1.0e-03, 1.0e-04); std::shared_ptr shapeT1 = buildLoop(-1.0e-03, 1.0e-04); EXPECT_FALSE(m_selfContact.removeInvalidCollisions(*shapeT0, *shapeT1, 0, 9)); EXPECT_FALSE(m_selfContact.removeInvalidCollisions(*shapeT0, *shapeT1, 1, 9)); EXPECT_FALSE(m_selfContact.removeInvalidCollisions(*shapeT0, *shapeT1, 0, 8)); EXPECT_FALSE(m_selfContact.removeInvalidCollisions(*shapeT0, *shapeT1, 1, 8)); EXPECT_TRUE(m_selfContact.removeInvalidCollisions(*shapeT0, *shapeT1, 1, 1)); EXPECT_TRUE(m_selfContact.removeInvalidCollisions(*shapeT0, *shapeT1, 0, 1)); EXPECT_TRUE(m_selfContact.removeInvalidCollisions(*shapeT0, *shapeT1, 1, 2)); EXPECT_TRUE(m_selfContact.removeInvalidCollisions(*shapeT0, *shapeT1, 1, 0)); shapeT0->getVertex(0).position += Vector3d(10, 0, 0); EXPECT_TRUE(m_selfContact.removeInvalidCollisions(*shapeT0, *shapeT1, 0, 9)); shapeT0->getVertex(0).position -= Vector3d(10, 0, 0); shapeT0->getVertex(1).position += Vector3d(10, 0, 0); EXPECT_TRUE(m_selfContact.removeInvalidCollisions(*shapeT0, *shapeT1, 0, 9)); shapeT0->getVertex(1).position -= Vector3d(10, 0, 0); shapeT1->getVertex(0).position += Vector3d(10, 0, 0); EXPECT_TRUE(m_selfContact.removeInvalidCollisions(*shapeT0, *shapeT1, 0, 9)); shapeT1->getVertex(0).position -= Vector3d(10, 0, 0); shapeT1->getVertex(1).position += Vector3d(10, 0, 0); EXPECT_TRUE(m_selfContact.removeInvalidCollisions(*shapeT0, *shapeT1, 0, 9)); shapeT1->getVertex(1).position -= Vector3d(10, 0, 0); shapeT0->getVertex(9).position += Vector3d(10, 0, 0); EXPECT_TRUE(m_selfContact.removeInvalidCollisions(*shapeT0, *shapeT1, 0, 9)); shapeT0->getVertex(9).position -= Vector3d(10, 0, 0); shapeT0->getVertex(10).position += Vector3d(10, 0, 0); EXPECT_TRUE(m_selfContact.removeInvalidCollisions(*shapeT0, *shapeT1, 0, 9)); shapeT0->getVertex(10).position -= Vector3d(10, 0, 0); shapeT1->getVertex(9).position += Vector3d(10, 0, 0); EXPECT_TRUE(m_selfContact.removeInvalidCollisions(*shapeT0, *shapeT1, 0, 9)); shapeT1->getVertex(9).position -= Vector3d(10, 0, 0); shapeT1->getVertex(10).position += Vector3d(10, 0, 0); EXPECT_TRUE(m_selfContact.removeInvalidCollisions(*shapeT0, *shapeT1, 0, 9)); shapeT1->getVertex(10).position -= Vector3d(10, 0, 0); }; TEST_F(SegmentCcdSelfContactTests, GetUniqueCandidates) { std::shared_ptr shapeT0 = buildLoop(1.0e-03, 1.0e-04); std::shared_ptr shapeT1 = buildLoop(-1.0e-03, 1.0e-04); std::set> segmentIdList; std::list intersectionList = shapeT0->getAabbTree()->spatialJoin(*(shapeT1->getAabbTree())); m_selfContact.getUniqueCandidates(intersectionList, &segmentIdList); EXPECT_EQ(6, segmentIdList.size()); EXPECT_TRUE(std::find(segmentIdList.begin(), segmentIdList.end(), std::pair(0, 9)) != segmentIdList.end()); EXPECT_TRUE(std::find(segmentIdList.begin(), segmentIdList.end(), std::pair(0, 8)) != segmentIdList.end()); EXPECT_TRUE(std::find(segmentIdList.begin(), segmentIdList.end(), std::pair(1, 9)) != segmentIdList.end()); EXPECT_TRUE(std::find(segmentIdList.begin(), segmentIdList.end(), std::pair(1, 8)) != segmentIdList.end()); EXPECT_TRUE(std::find(segmentIdList.begin(), segmentIdList.end(), std::pair(4, 5)) != segmentIdList.end()); EXPECT_TRUE(std::find(segmentIdList.begin(), segmentIdList.end(), std::pair(5, 6)) != segmentIdList.end()); EXPECT_FALSE(std::find(segmentIdList.begin(), segmentIdList.end(), std::pair(1, 7)) != segmentIdList.end()); }; TEST_F(SegmentCcdSelfContactTests, DetectCollision) { std::shared_ptr shapeT0 = buildLoop(1.0e-03, 1.0e-04); std::shared_ptr shapeT1 = buildLoop(-1.0e-03, 1.0e-04); double r; double s; double t; Vector3d pToQDir; Vector3d contactPtP; Vector3d contactPtQ; { SCOPED_TRACE("Successful detection"); std::array pt0Positions = shapeT0->getEdgePositions(0); std::array pt1Positions = shapeT1->getEdgePositions(0); std::array qt0Positions = shapeT0->getEdgePositions(9); std::array qt1Positions = shapeT1->getEdgePositions(9); m_selfContact.setTimeMaxPrecisionEpsilon(1.0e-06); m_selfContact.setTimeMinPrecisionEpsilon(1.0e-06); m_selfContact.setDistanceEpsilon(1.0e-09); EXPECT_TRUE(m_selfContact.detectCollision(pt0Positions, pt1Positions, qt0Positions, qt1Positions, 1.0e-04, 1.0e-04, 1.0e-09, &r, &s, &t, &pToQDir, &contactPtP, &contactPtQ)); EXPECT_GT(1.0e-09, std::abs(r - 1.0)); EXPECT_GT(1.0e-09, std::abs(s)); EXPECT_GT(2.0e-09, std::abs(t - 0.4375)); EXPECT_TRUE(pToQDir.normalized().isApprox(Vector3d(0.0, 0.0, -1.0), 1.0e-05)); EXPECT_TRUE(contactPtP.isApprox(Vector3d(0.0, 0.0, 1.0e-04), 1.0e-05)); EXPECT_TRUE(contactPtQ.isApprox(Vector3d(0.0, 0.0, -1.0e-04), 1.0e-05)); EXPECT_TRUE(m_selfContact.detectCollision(pt0Positions, pt1Positions, qt0Positions, qt1Positions, 0.0, 0.0, 1.0e-09, &r, &s, &t, &pToQDir, &contactPtP, &contactPtQ)); EXPECT_GT(1.0e-09, std::abs(r - 1.0)); EXPECT_GT(1.0e-09, std::abs(s)); EXPECT_GT(2.0e-03, std::abs(t - 0.5)); EXPECT_GT(1.0e-09, pToQDir.norm()); EXPECT_GT(1.0e-09, (contactPtP - Vector3d(0.0, 0.0, 5.0e-10)).norm()); EXPECT_GT(1.0e-09, (contactPtQ - Vector3d(0.0, 0.0, 5.0e-10)).norm()); } { SCOPED_TRACE("Detection at T=0 (before movement)"); std::array pt0Positions = shapeT0->getEdgePositions(4); std::array pt1Positions = shapeT1->getEdgePositions(4); std::array qt0Positions = shapeT0->getEdgePositions(5); std::array qt1Positions = shapeT1->getEdgePositions(5); EXPECT_TRUE(m_selfContact.detectCollision(pt0Positions, pt1Positions, qt0Positions, qt1Positions, 1.0e-04, 1.0e-04, 1.0e-03, &r, &s, &t, &pToQDir, &contactPtP, &contactPtQ)); EXPECT_GT(1.0e-09, std::abs(r - 1.0)); EXPECT_GT(1.0e-09, std::abs(s)); EXPECT_GT(1.0e-09, std::abs(t)); EXPECT_GT(1.0e-09, pToQDir.norm()); EXPECT_TRUE(contactPtP.isApprox(Vector3d(0.0, -1.0, 0.0), 1.0e-05)); EXPECT_TRUE(contactPtQ.isApprox(Vector3d(0.0, -1.0, 0.0), 1.0e-05)); EXPECT_TRUE(m_selfContact.detectCollision(pt0Positions, pt1Positions, qt0Positions, qt1Positions, 0.0, 0.0, 1.0e-03, &r, &s, &t, &pToQDir, &contactPtP, &contactPtQ)); EXPECT_GT(1.0e-09, std::abs(r - 1.0)); EXPECT_GT(1.0e-09, std::abs(s)); EXPECT_GT(1.0e-09, std::abs(t)); EXPECT_GT(1.0e-09, pToQDir.norm()); EXPECT_TRUE(contactPtP.isApprox(Vector3d(0.0, -1.0, 0.0), 1.0e-05)); EXPECT_TRUE(contactPtQ.isApprox(Vector3d(0.0, -1.0, 0.0), 1.0e-05)); } { SCOPED_TRACE("No detection"); std::array pt0Positions = shapeT0->getEdgePositions(1); std::array pt1Positions = shapeT1->getEdgePositions(1); std::array qt0Positions = shapeT0->getEdgePositions(7); std::array qt1Positions = shapeT1->getEdgePositions(7); EXPECT_FALSE(m_selfContact.detectCollision(pt0Positions, pt1Positions, qt0Positions, qt1Positions, 1.0e-04, 1.0e-04, 1.0e-03, &r, &s, &t, &pToQDir, &contactPtP, &contactPtQ)); EXPECT_FALSE(m_selfContact.detectCollision(pt0Positions, pt1Positions, qt0Positions, qt1Positions, 0.0, 0.0, 1.0e-03, &r, &s, &t, &pToQDir, &contactPtP, &contactPtQ)); } }; TEST_F(SegmentCcdSelfContactTests, CalculateContact) { { SCOPED_TRACE("Successful detection"); std::shared_ptr shapeT0 = buildLoop(1.0e-03, 1.0e-04); std::shared_ptr shapeT1 = buildLoop(-1.0e-03, 1.0e-04); m_selfContact.setDistanceEpsilon(1.0e-06); auto transformP = Math::RigidTransform3d::Identity(); transformP.translate(Vector3d(1.0, 2.0, 3.0)); auto transformQ = Math::RigidTransform3d::Identity(); transformQ.translate(Vector3d(3.0, 4.0, 5.0)); auto collisionList = m_selfContact.calculateCcdContact( *shapeT0, transformP, *shapeT1, transformQ, *shapeT0, transformP, // unused for self-collision *shapeT1, transformQ); // unused for self-collision EXPECT_EQ(1, collisionList.size()); std::shared_ptr contacted = *(collisionList.begin()); EXPECT_EQ(CollisionDetectionType::COLLISION_DETECTION_TYPE_CONTINUOUS, contacted->type); EXPECT_GT(2.0 * m_selfContact.getTimeMinPrecisionEpsilon(), std::abs(contacted->time - 0.4375)); EXPECT_GT(1.0e-08, contacted->contact.norm()); EXPECT_GT(1.0e-04, (contacted->normal.normalized() - Vector3d(0.0, 0.0, 1.0)).norm()); auto contactP = contacted->penetrationPoints.first.rigidLocalPosition.getValue(); EXPECT_TRUE((contactP.isApprox(transformP.inverse() * (contacted->contact + Vector3d(0.0, 0.0, 0.0001)), 1.0e-06))); auto contactQ = contacted->penetrationPoints.second.rigidLocalPosition.getValue(); EXPECT_TRUE((contactQ.isApprox(transformQ.inverse() * (contacted->contact + Vector3d(0.0, 0.0, -0.0001)), 1.0e-06))); EXPECT_GT(1.0e-10, contacted->depth); } }; }; // namespace Collision }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Collision/UnitTests/ShapeCollisionRepresentationTest.cpp000066400000000000000000000105561277777236100306140ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Collision/ShapeCollisionRepresentation.h" #include "SurgSim/Framework/ApplicationData.h" #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Math/MeshShape.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Vector.h" using SurgSim::Math::RigidTransform3d; using SurgSim::Math::Vector3d; namespace { static const double dt = 0.001; } namespace SurgSim { namespace Collision { TEST(ShapeCollisionRepresentationTest, MeshUpdateTest) { auto runtime = std::make_shared("config.txt"); const std::string fileName = "Geometry/staple_collision.ply"; auto mesh = std::make_shared(); ASSERT_NO_THROW(mesh->load(fileName)); auto originalMesh = std::make_shared(*mesh); auto expectedMesh = std::make_shared(*mesh); auto collisionRepresentation = std::make_shared("Collision"); collisionRepresentation->setShape(originalMesh); collisionRepresentation->setLocalPose(SurgSim::Math::RigidTransform3d::Identity()); collisionRepresentation->update(dt); EXPECT_EQ(collisionRepresentation->getShapeType(), originalMesh->getType()); auto actualMesh = std::static_pointer_cast(collisionRepresentation->getPosedShape()); EXPECT_EQ(expectedMesh->getVertices(), actualMesh->getVertices()); EXPECT_EQ(expectedMesh->getTriangles(), actualMesh->getTriangles()); RigidTransform3d transform = SurgSim::Math::makeRigidTransform(Vector3d(4.3, 2.1, 6.5), Vector3d(-1.5, 7.5, -2.5), Vector3d(8.7, -4.7, -3.1)); collisionRepresentation->setLocalPose(transform); collisionRepresentation->update(dt); actualMesh = std::static_pointer_cast(collisionRepresentation->getPosedShape()); expectedMesh->transform(transform); EXPECT_TRUE(expectedMesh->update()); EXPECT_EQ(expectedMesh->getVertices(), actualMesh->getVertices()); EXPECT_EQ(expectedMesh->getTriangles(), actualMesh->getTriangles()); } TEST(ShapeCollisionRepresentationTest, SerializationTest) { SurgSim::Framework::Runtime runtime("config.txt"); const std::string fileName = "Geometry/staple_collision.ply"; std::shared_ptr shape = std::make_shared(); auto meshShape = std::dynamic_pointer_cast(shape); EXPECT_NO_THROW(meshShape->load(fileName)); auto collisionRepresentation = std::make_shared("Collision"); collisionRepresentation->setValue("Shape", shape); RigidTransform3d pose = SurgSim::Math::makeRigidTransform(Vector3d(4.3, 2.1, 6.5), Vector3d(-1.5, 7.5, -2.5), Vector3d(8.7, -4.7, -3.1)); collisionRepresentation->setLocalPose(pose); YAML::Node node; ASSERT_NO_THROW(node = YAML::convert::encode(*collisionRepresentation)); EXPECT_EQ(1u, node.size()); std::shared_ptr newShapeCollisionRepresentation; ASSERT_NO_THROW(newShapeCollisionRepresentation = std::dynamic_pointer_cast (node.as>())); EXPECT_TRUE(pose.isApprox(newShapeCollisionRepresentation->getPose())); auto mesh = std::dynamic_pointer_cast( newShapeCollisionRepresentation->getValue>("Shape")); ASSERT_TRUE(nullptr != mesh); EXPECT_EQ(meshShape->getNumEdges(), mesh->getNumEdges()); EXPECT_EQ(meshShape->getNumTriangles(), mesh->getNumTriangles()); EXPECT_EQ(meshShape->getNumVertices(), mesh->getNumVertices()); } } // namespace Collision } // namespace SurgSim opensurgsim-0.7.0/SurgSim/Collision/UnitTests/SphereDoubleSidedPlaneContactCalculationTests.cpp000066400000000000000000000157121277777236100331440ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Collision/UnitTests/ContactCalculationTestsCommon.h" #include "SurgSim/Collision/SphereDoubleSidedPlaneContact.h" #include "SurgSim/Math/PlaneShape.h" #include "SurgSim/Math/SphereShape.h" using SurgSim::Math::Shape; using SurgSim::Math::SphereShape; using SurgSim::Math::DoubleSidedPlaneShape; namespace SurgSim { namespace Collision { void doSphereDoubleSidedPlaneTest(std::shared_ptr sphere, const Quaterniond& sphereQuat, const Vector3d& sphereTrans, std::shared_ptr plane, const Quaterniond& planeQuat, const Vector3d& planeTrans, bool expectedIntersect, const double& expectedDepth = 0 , const Vector3d& expectedNorm = Vector3d::Zero()) { using SurgSim::Math::Geometry::ScalarEpsilon; using SurgSim::Math::Geometry::DistanceEpsilon; std::shared_ptr planeRep = std::make_shared("Collision Plane"); planeRep->setShape(plane); planeRep->setLocalPose(SurgSim::Math::makeRigidTransform(planeQuat, planeTrans)); std::shared_ptr sphereRep = std::make_shared("Collision Sphere"); sphereRep->setShape(sphere); sphereRep->setLocalPose(SurgSim::Math::makeRigidTransform(sphereQuat, sphereTrans)); SphereDoubleSidedPlaneContact calcNormal; std::shared_ptr pair = std::make_shared(sphereRep, planeRep); // Again this replicates the way this is calculated in the contact calculation just with different // starting values Vector3d sphereLocalNormal = sphereQuat.inverse() * expectedNorm; Vector3d spherePenetration = -sphereLocalNormal * sphere->getRadius(); Vector3d planePenetration = -sphereLocalNormal * (sphere->getRadius() - expectedDepth); planePenetration = (sphereQuat * planePenetration) + sphereTrans; planePenetration = planeQuat.inverse() * (planePenetration - planeTrans); calcNormal.calculateContact(pair); if (expectedIntersect) { ASSERT_TRUE(pair->hasContacts()); std::shared_ptr contact = pair->getContacts().front(); EXPECT_NEAR(expectedDepth, contact->depth, 1e-10); EXPECT_TRUE(eigenEqual(expectedNorm, contact->normal)); EXPECT_TRUE(contact->penetrationPoints.first.rigidLocalPosition.hasValue()); EXPECT_TRUE(contact->penetrationPoints.second.rigidLocalPosition.hasValue()); EXPECT_TRUE(eigenEqual(spherePenetration, contact->penetrationPoints.first.rigidLocalPosition.getValue())); EXPECT_TRUE(eigenEqual(planePenetration, contact->penetrationPoints.second.rigidLocalPosition.getValue())); } else { EXPECT_FALSE(pair->hasContacts()); } } TEST(SphereDoubleSidedPlaneContactCalculationTests, UnitTests) { std::shared_ptr plane = std::make_shared(); std::shared_ptr sphere = std::make_shared(1.0); { SCOPED_TRACE("No Intersection, no transformation"); doSphereDoubleSidedPlaneTest(sphere, Quaterniond::Identity(), Vector3d(0.0,2.0,0.0), plane, Quaterniond::Identity(), Vector3d(0.0,0.5,0.0), false); } { SCOPED_TRACE("Intersection front, no transformation"); doSphereDoubleSidedPlaneTest(sphere, Quaterniond::Identity(), Vector3d(0.0,1.0,0.0), plane,Quaterniond::Identity(), Vector3d(0.0,0.5,0.0), true, 0.5, Vector3d(0.0,1.0,0.0)); } { SCOPED_TRACE("Intersection back, no transformation"); doSphereDoubleSidedPlaneTest(sphere, Quaterniond::Identity(), Vector3d(0.0,0.0,0.0), plane, Quaterniond::Identity(), Vector3d(0.0,0.5,0.0), true, 0.5, Vector3d(0.0,-1.0,0.0)); } { SCOPED_TRACE("Intersection front, sphere center on the plane, rotated plane"); doSphereDoubleSidedPlaneTest(sphere, Quaterniond::Identity(), Vector3d(0.0,0,0.0), plane, SurgSim::Math::makeRotationQuaternion(M_PI_2, Vector3d(1.0,0.0,0.0)), Vector3d(0.0,0.0,0.0), true, 1.0, Vector3d(0.0,0.0,1.0)); } { SCOPED_TRACE("Intersection front, rotated Plane"); doSphereDoubleSidedPlaneTest(sphere, Quaterniond::Identity(), Vector3d(0.0,0.0,0.5), plane, SurgSim::Math::makeRotationQuaternion(M_PI_2, Vector3d(1.0,0.0,0.0)), Vector3d(0.0,0.0,0.0), true, 0.5, Vector3d(0.0,0.0,1.0)); } { Vector3d planeTrans(365.321,-342.324,325.324); Quaterniond planeQuat = SurgSim::Math::makeRotationQuaternion(1.23456, Vector3d(0.234,-0.986,0.646).normalized()); SCOPED_TRACE("Intersection front, rotated plane 2"); doSphereDoubleSidedPlaneTest(sphere, Quaterniond::Identity(), planeQuat * (Vector3d(0.0,0.5,0.0)) + planeTrans, plane, planeQuat, planeTrans, true, 0.5, planeQuat * Vector3d(0.0, 1.0, 0.0)); } } TEST(SphereDoubleSidedPlaneContactCalculationTests, ShouldFail) { std::shared_ptr sphereShape = std::make_shared(1.0); std::shared_ptr doubleSidedPlaneShape = std::make_shared(); std::shared_ptr reps0 = std::make_shared("Collision Sphere 0"); reps0->setShape(sphereShape); reps0->setLocalPose(SurgSim::Math::makeRigidTransform(Quaterniond::Identity(), Vector3d(1.0,0.0,0.0))); std::shared_ptr repp0 = std::make_shared("Collision Plane 0"); repp0->setShape(doubleSidedPlaneShape); repp0->setLocalPose(SurgSim::Math::makeRigidTransform(Quaterniond::Identity(), Vector3d(0.5,0.0,0.0))); std::shared_ptr reps1 = std::make_shared("Collision Sphere 1"); reps1->setShape(sphereShape); reps1->setLocalPose(SurgSim::Math::makeRigidTransform(Quaterniond::Identity(), Vector3d(1.0,0.0,0.0))); std::shared_ptr repp1 = std::make_shared("Collision Plane 1"); repp1->setShape(doubleSidedPlaneShape); repp1->setLocalPose(SurgSim::Math::makeRigidTransform(Quaterniond::Identity(), Vector3d(0.5,0.0,0.0))); std::shared_ptr pairpp = std::make_shared(repp0, repp1); std::shared_ptr pairss = std::make_shared(reps0, reps1); SphereDoubleSidedPlaneContact contact; EXPECT_ANY_THROW(contact.calculateContact(pairpp)); EXPECT_ANY_THROW(contact.calculateContact(pairss)); } }; // namespace Collision }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Collision/UnitTests/SpherePlaneContactCalculationTests.cpp000066400000000000000000000112211277777236100310270ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Collision/UnitTests/ContactCalculationTestsCommon.h" #include "SurgSim/Collision/SpherePlaneContact.h" #include "SurgSim/Math/PlaneShape.h" #include "SurgSim/Math/SphereShape.h" using SurgSim::Math::SphereShape; using SurgSim::Math::PlaneShape; namespace SurgSim { namespace Collision { void doSpherePlaneTest(std::shared_ptr sphere, const Quaterniond& sphereQuat, const Vector3d& sphereTrans, std::shared_ptr plane, const Quaterniond& planeQuat, const Vector3d& planeTrans, bool expectedIntersect, const double& expectedDepth = 0, const Vector3d& expectedNorm = Vector3d::Zero()) { std::shared_ptr planeRep = std::make_shared("Plane Shape"); planeRep->setShape(plane); planeRep->setLocalPose(SurgSim::Math::makeRigidTransform(planeQuat,planeTrans)); std::shared_ptr sphereRep = std::make_shared("Sphere Shape"); sphereRep->setShape(sphere); sphereRep->setLocalPose(SurgSim::Math::makeRigidTransform(sphereQuat, sphereTrans)); SpherePlaneContact calcNormal; std::shared_ptr pair = std::make_shared(sphereRep, planeRep); // Again this replicates the way this is calculated in the contact calculation just with different // starting values Vector3d sphereLocalNormal = sphereQuat.inverse() * expectedNorm; Vector3d spherePenetration = -sphereLocalNormal * sphere->getRadius(); Vector3d planePenetration = -sphereLocalNormal * (sphere->getRadius() - expectedDepth); planePenetration = (sphereQuat * planePenetration) + sphereTrans; planePenetration = planeQuat.inverse() * (planePenetration - planeTrans); calcNormal.calculateContact(pair); if (expectedIntersect) { ASSERT_TRUE(pair->hasContacts()); std::shared_ptr contact = pair->getContacts().front(); EXPECT_NEAR(expectedDepth, contact->depth, SurgSim::Math::Geometry::DistanceEpsilon); EXPECT_TRUE(eigenEqual(expectedNorm, contact->normal)); EXPECT_TRUE(contact->penetrationPoints.first.rigidLocalPosition.hasValue()); EXPECT_TRUE(contact->penetrationPoints.second.rigidLocalPosition.hasValue()); EXPECT_TRUE(eigenEqual(spherePenetration, contact->penetrationPoints.first.rigidLocalPosition.getValue())); EXPECT_TRUE(eigenEqual(planePenetration, contact->penetrationPoints.second.rigidLocalPosition.getValue())); } else { EXPECT_FALSE(pair->hasContacts()); } } TEST(SpherePlaneContactCalculationTests, UnitTests) { std::shared_ptr plane = std::make_shared(); std::shared_ptr sphere = std::make_shared(1.0); { SCOPED_TRACE("No Intersection, no transformation"); doSpherePlaneTest(sphere, Quaterniond::Identity(), Vector3d(0.0,2.0,0.0), plane, Quaterniond::Identity(), Vector3d(0.0,0.5,0.0), false); } { SCOPED_TRACE("Intersection front, no transformation"); doSpherePlaneTest(sphere, Quaterniond::Identity(), Vector3d(0.0,1.0,0.0), plane,Quaterniond::Identity(), Vector3d(0.0,0.5,0.0), true, 0.5, Vector3d(0.0,1.0,0.0)); } { SCOPED_TRACE("Intersection back, no transformation"); doSpherePlaneTest(sphere, Quaterniond::Identity(), Vector3d(0.0,0.0,0.0), plane, Quaterniond::Identity(), Vector3d(0.0,0.5,0.0), true, 1.5, Vector3d(0.0,1.0,0.0)); } { SCOPED_TRACE("Intersection front, sphere center on the plane, rotated plane"); doSpherePlaneTest(sphere, Quaterniond::Identity(), Vector3d(0.0,0,0.0), plane, SurgSim::Math::makeRotationQuaternion(M_PI_2, Vector3d(1.0,0.0,0.0)), Vector3d(0.0,0.0,0.0), true, 1.0, Vector3d(0.0,0.0,1.0)); } { SCOPED_TRACE("Intersection front, rotated Plane"); doSpherePlaneTest(sphere, Quaterniond::Identity(), Vector3d(0.0,0.0,0.5), plane, SurgSim::Math::makeRotationQuaternion(M_PI_2, Vector3d(1.0,0.0,0.0)), Vector3d(0.0,0.0,0.0), true, 0.5, Vector3d(0.0,0.0,1.0)); } } }; // namespace Collision }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Collision/UnitTests/SphereSphereContactCalculationTests.cpp000066400000000000000000000075001277777236100312230ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Collision/UnitTests/ContactCalculationTestsCommon.h" #include "SurgSim/Collision/SphereSphereContact.h" #include "SurgSim/Math/Geometry.h" #include "SurgSim/Math/SphereShape.h" using SurgSim::Math::Geometry::DistanceEpsilon; namespace SurgSim { namespace Collision { void doSphereSphereTest(double r0, Vector3d p0, double r1, Vector3d p1, bool hasContacts, double expectedDepth = 0.0, Vector3d expectedNormal = Vector3d::UnitX(), Vector3d expectedPenetrationPoint0 = Vector3d::Zero(), Vector3d expectedPenetrationPoint1 = Vector3d::Zero()) { SphereSphereContact calc; auto sphere1 = std::make_shared(r0); auto sphereRep1 = std::make_shared("TestSphereShapeCollisionRep1"); sphereRep1->setShape(sphere1); sphereRep1->setLocalPose(SurgSim::Math::makeRigidTransform(Quaterniond::Identity(), p0)); auto sphere2 = std::make_shared(r1); auto sphereRep2 = std::make_shared("TestSphereShapeCollisionRep2"); sphereRep2->setShape(sphere2); sphereRep2->setLocalPose(SurgSim::Math::makeRigidTransform(Quaterniond::Identity(), p1)); std::shared_ptr pair = std::make_shared(sphereRep1, sphereRep2); calc.calculateContact(pair); EXPECT_EQ(hasContacts, pair->hasContacts()); if (pair->hasContacts()) { std::shared_ptr contact = pair->getContacts().front(); EXPECT_LT(-DistanceEpsilon, contact->depth); const double maxDepth = std::max(sphere1->getRadius(), sphere2->getRadius()); EXPECT_GT(maxDepth + DistanceEpsilon, contact->depth); const Vector3d sphere2ToSphere1 = sphereRep1->getPose().translation() - sphereRep2->getPose().translation(); if (!sphere2ToSphere1.isZero()) { EXPECT_TRUE(eigenEqual(sphere2ToSphere1.normalized(), contact->normal)); } EXPECT_TRUE(eigenEqual(expectedNormal, contact->normal)); EXPECT_NEAR(expectedDepth, contact->depth, SurgSim::Math::Geometry::DistanceEpsilon); EXPECT_TRUE(contact->penetrationPoints.first.rigidLocalPosition.hasValue()); EXPECT_TRUE(contact->penetrationPoints.second.rigidLocalPosition.hasValue()); EXPECT_TRUE(eigenEqual(expectedPenetrationPoint0, contact->penetrationPoints.first.rigidLocalPosition.getValue())); EXPECT_TRUE(eigenEqual(expectedPenetrationPoint1, contact->penetrationPoints.second.rigidLocalPosition.getValue())); } } TEST(SphereSphereContactCalculationTests, UnitTests) { using SurgSim::Math::Geometry::DistanceEpsilon; { SCOPED_TRACE("No Intersection"); doSphereSphereTest(0.1, Vector3d(0.0,0.0,0.0), 0.1, Vector3d(1.0,1.0,1.0), false); } { SCOPED_TRACE("Sphere-Sphere intersection at origin"); doSphereSphereTest(0.5, Vector3d(-0.5+DistanceEpsilon/2.0,0.0,0.0), 0.5, Vector3d(0.5-DistanceEpsilon/2.0,0.0,0.0), true, DistanceEpsilon, Vector3d(-1.0,0.0,0.0), Vector3d(0.5,0.0,0.0), Vector3d(-0.5,0.0,0.0)); } { SCOPED_TRACE("Sphere-Sphere intersection"); doSphereSphereTest(0.5, Vector3d(0.0,0.0,0.0), 0.5, Vector3d(0.5,0.0,0.0), true, 0.5, Vector3d(-1.0,0.0,0.0), Vector3d(0.5,0.0,0.0), Vector3d(-0.5,0.0,0.0)); } } }; // namespace Collision }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Collision/UnitTests/TriangleMeshParticlesContactCalculationTests.cpp000066400000000000000000000132561277777236100330640ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include "SurgSim/Collision/ShapeCollisionRepresentation.h" #include "SurgSim/Collision/TriangleMeshParticlesContact.h" #include "SurgSim/DataStructures/TriangleMesh.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Math/Geometry.h" #include "SurgSim/Math/MeshShape.h" #include "SurgSim/Math/ParticlesShape.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/RigidTransform.h" using SurgSim::Math::Geometry::DistanceEpsilon; using SurgSim::Math::makeRigidTransform; using SurgSim::Math::MeshShape; using SurgSim::Math::ParticlesShape; using SurgSim::Math::RigidTransform3d; using SurgSim::Math::Vector3d; namespace SurgSim { namespace Collision { void doCollisionTest(std::shared_ptr particles, std::shared_ptr mesh, const RigidTransform3d& meshPose, const size_t numContactingParticles) { auto meshRep = std::make_shared("Mesh"); meshRep->setShape(mesh); meshRep->setLocalPose(meshPose); auto particlesRep = std::make_shared("Particles"); particlesRep->setShape(particles); TriangleMeshParticlesContact calcContact; auto pair = std::make_shared(meshRep, particlesRep); calcContact.calculateContact(pair); std::unordered_set contactingParticles; for (auto& contact : pair->getContacts()) { size_t particleIndex = contact->penetrationPoints.second.index.getValue(); ASSERT_LE(0u, particleIndex); ASSERT_GT(particles->getVertices().size(), particleIndex); contactingParticles.insert(particleIndex); Vector3d particlesToMesh = meshPose * mesh->getCenter() - particles->getVertex(particleIndex).position; if (!particlesToMesh.isZero()) { // Check that each normal is pointing into the mesh EXPECT_LT(0.0, contact->normal.dot(particlesToMesh)); } // Check that the depth is sane EXPECT_LT(0.0, contact->depth); EXPECT_GE(particles->getRadius() + DistanceEpsilon, contact->depth); } EXPECT_EQ(numContactingParticles, contactingParticles.size()); } TEST(TriangleMeshParticlesContactCalculationTests, CanConstruct) { EXPECT_NO_THROW({ TriangleMeshParticlesContact calculation;}); } TEST(TriangleMeshParticlesContactCalculationTests, CollisionTests) { auto runtime = std::make_shared("config.txt"); auto cube = std::make_shared(); cube->load("Geometry/Cube.ply"); { SCOPED_TRACE("No intersection, no particles"); auto mesh = std::make_shared(*cube); auto meshPose = RigidTransform3d::Identity(); auto particles = std::make_shared(0.5); doCollisionTest(particles, mesh, meshPose, 0); } { SCOPED_TRACE("No Intersection with particles"); auto mesh = std::make_shared(*cube); auto meshPose = RigidTransform3d::Identity(); auto particles = std::make_shared(0.5); particles->addVertex(ParticlesShape::VertexType(Vector3d::Constant(100.0))); particles->addVertex(ParticlesShape::VertexType(Vector3d::UnitX() * 2.0)); particles->addVertex(ParticlesShape::VertexType(Vector3d::UnitY() * -3.0)); particles->addVertex(ParticlesShape::VertexType(Vector3d::UnitZ() * 4.0)); particles->update(); doCollisionTest(particles, mesh, meshPose, 0); } { SCOPED_TRACE("Intersection with one particle"); auto mesh = std::make_shared(*cube); auto meshPose = RigidTransform3d::Identity(); auto particles = std::make_shared(0.5); particles->addVertex(ParticlesShape::VertexType(Vector3d::UnitX())); particles->addVertex(ParticlesShape::VertexType(Vector3d::Constant(100.0))); particles->addVertex(ParticlesShape::VertexType(Vector3d::UnitX() * 2.0)); particles->addVertex(ParticlesShape::VertexType(Vector3d::UnitY() * -3.0)); particles->addVertex(ParticlesShape::VertexType(Vector3d::UnitZ() * 4.0)); particles->update(); doCollisionTest(particles, mesh, meshPose, 1); } { SCOPED_TRACE("No intersection with posed mesh"); auto mesh = std::make_shared(*cube); auto meshPose = makeRigidTransform(Eigen::AngleAxisd(M_PI_4, Vector3d::UnitZ()).matrix(), Vector3d::Zero()); auto particles = std::make_shared(0.5); particles->addVertex(ParticlesShape::VertexType(Vector3d::Ones() * 2.0)); particles->addVertex(ParticlesShape::VertexType(Vector3d::Ones() * -2.0)); particles->addVertex(ParticlesShape::VertexType(Vector3d(1.15, 1.15, 0.0))); particles->update(); doCollisionTest(particles, mesh, meshPose, 0); } { SCOPED_TRACE("Intersection with posed mesh"); auto mesh = std::make_shared(*cube); auto meshPose = makeRigidTransform(Eigen::AngleAxisd(M_PI_4, Vector3d::UnitZ()).matrix(), Vector3d::UnitX() * 10.0); auto particles = std::make_shared(0.5); particles->addVertex(ParticlesShape::VertexType(Vector3d::UnitX() * 11.6)); particles->addVertex(ParticlesShape::VertexType(Vector3d(10.0, 1.9, 0.0))); particles->addVertex(ParticlesShape::VertexType(Vector3d::Zero())); particles->update(); doCollisionTest(particles, mesh, meshPose, 2); } } }; }; opensurgsim-0.7.0/SurgSim/Collision/UnitTests/TriangleMeshPlaneContactCalculationTests.cpp000066400000000000000000000374311277777236100321760ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Collision/TriangleMeshPlaneContact.h" #include "SurgSim/Collision/UnitTests/ContactCalculationTestsCommon.h" #include "SurgSim/DataStructures/AabbTree.h" #include "SurgSim/DataStructures/TriangleMesh.h" #include "SurgSim/Math/Geometry.h" #include "SurgSim/Math/Matrix.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/Vector.h" using SurgSim::DataStructures::TriangleMeshPlain; using SurgSim::Math::Geometry::DistanceEpsilon; using SurgSim::Math::Matrix33d; using SurgSim::Math::Quaterniond; using SurgSim::Math::Vector3d; namespace SurgSim { namespace Collision { namespace { // CUBE // 3*----------*2 // / /| // 7*----------* | // | 6| | // | *0 | *1 // | |/ // 4*----------*5 static const int cubeNumPoints = 8; static const SurgSim::Math::Vector3d cubePoints[8] = { Vector3d(-1.0 / 2.0, -1.0 / 2.0, -1.0 / 2.0), Vector3d(1.0 / 2.0, -1.0 / 2.0, -1.0 / 2.0), Vector3d(1.0 / 2.0, 1.0 / 2.0, -1.0 / 2.0), Vector3d(-1.0 / 2.0, 1.0 / 2.0, -1.0 / 2.0), Vector3d(-1.0 / 2.0, -1.0 / 2.0, 1.0 / 2.0), Vector3d(1.0 / 2.0, -1.0 / 2.0, 1.0 / 2.0), Vector3d(1.0 / 2.0, 1.0 / 2.0, 1.0 / 2.0), Vector3d(-1.0 / 2.0, 1.0 / 2.0, 1.0 / 2.0) }; static const int cubeNumEdges = 12; static const int cubeEdges[12][2] = { {0, 1}, {3, 2}, {4, 5}, {7, 6}, // +X {0, 3}, {1, 2}, {4, 7}, {5 , 6}, // +Y {0, 4}, {1, 5}, {2, 6}, {3, 7} // +Z }; static const int cubeNumTriangles = 12; static const int cubeTrianglesCCW[12][3] = { {6, 2, 3}, {6, 3, 7}, // Top ( 0 1 0) [6237] {0, 1, 5}, {0, 5, 4}, // Bottom ( 0 -1 0) [0154] {4, 5, 6}, {4, 6, 7}, // Front ( 0 0 1) [4567] {0, 3, 2}, {0, 2, 1}, // Back ( 0 0 -1) [0321] {1, 2, 6}, {1, 6, 5}, // Right ( 1 0 0) [1265] {0, 4, 7}, {0, 7, 3} // Left (-1 0 0) [0473] }; Vector3d calculateTriangleMeshVertex(const int i, const Quaterniond& quat, const Vector3d& trans) { return (quat * Vector3d(cubePoints[i][0], cubePoints[i][1], cubePoints[i][2])) + trans; } void generateTriangleMeshPlaneContact(std::list>* expectedContacts, const int expectedNumberOfContacts, const int* expectedMeshIndicesInContacts, const Vector3d& meshTrans, const Quaterniond& meshQuat, const Vector3d& planeNormal, const double planeD, const Vector3d& planeTrans, const Quaterniond& planeQuat) { Vector3d vertex; Vector3d boxLocalVertex, planeLocalVertex; Vector3d planeNormalGlobal = planeQuat * planeNormal; Vector3d pointOnPlane = planeTrans + (planeNormalGlobal * planeD); double depth = 0.0; Vector3d collisionNormal = planeNormalGlobal; for (int i = 0; i < expectedNumberOfContacts; ++i) { vertex = calculateTriangleMeshVertex(expectedMeshIndicesInContacts[i], meshQuat, meshTrans); depth = -planeNormalGlobal.dot(vertex - pointOnPlane); boxLocalVertex = calculateTriangleMeshVertex(expectedMeshIndicesInContacts[i], Quaterniond::Identity(), Vector3d::Zero()); planeLocalVertex = vertex + planeNormalGlobal * depth; planeLocalVertex = planeQuat.inverse() * (planeLocalVertex - planeTrans); std::pair penetrationPoint; penetrationPoint.first.rigidLocalPosition.setValue(boxLocalVertex); penetrationPoint.second.rigidLocalPosition.setValue(planeLocalVertex); expectedContacts->push_back(std::make_shared( COLLISION_DETECTION_TYPE_DISCRETE, depth, 1.0, Vector3d::Zero(), collisionNormal, penetrationPoint)); } } void doTriangleMeshPlaneTest(std::shared_ptr mesh, const Quaterniond& meshQuat, const Vector3d& meshTrans, std::shared_ptr plane, const Quaterniond& planeQuat, const Vector3d& planeTrans, const int expectedNumberOfContacts, const int* expectedMeshIndicesInContacts) { std::shared_ptr meshRep = std::make_shared("Collision Mesh 0"); meshRep->setShape(mesh); meshRep->setLocalPose(SurgSim::Math::makeRigidTransform(meshQuat, meshTrans)); std::shared_ptr planeRep = std::make_shared("Collision Plane 0"); planeRep->setShape(plane); planeRep->setLocalPose(SurgSim::Math::makeRigidTransform(planeQuat, planeTrans)); // First calculate the expected contact info. std::list> expectedContacts; if (expectedNumberOfContacts > 0) { generateTriangleMeshPlaneContact(&expectedContacts, expectedNumberOfContacts, expectedMeshIndicesInContacts, meshTrans, meshQuat, plane->getNormal(), plane->getD(), planeTrans, planeQuat); } // Perform collision detection. TriangleMeshPlaneContact calcContact; std::shared_ptr pair = std::make_shared(meshRep, planeRep); calcContact.calculateContact(pair); const Vector3d globalPlaneNormal = planeRep->getPose().linear() * plane->getNormal(); // update the AABB tree mesh->update(); const double maxRadius = mesh->getAabbTree()->getAabb().diagonal().norm() / 2.0; const Vector3d planeToMesh = mesh->getCenter() - planeTrans; Vector3d nearestPointOnPlane; const double distanceMeshPlane = SurgSim::Math::distancePointPlane(planeToMesh, globalPlaneNormal, plane->getD(), &nearestPointOnPlane); const double minDepth = -distanceMeshPlane - maxRadius; const double maxDepth = -distanceMeshPlane + maxRadius; for (auto contact : pair->getContacts()) { EXPECT_LT(-DistanceEpsilon, contact->depth); EXPECT_LT(minDepth - DistanceEpsilon, contact->depth); EXPECT_GT(maxDepth + DistanceEpsilon, contact->depth); EXPECT_TRUE(eigenEqual(globalPlaneNormal, contact->normal)); } // Compare the contact info. contactsInfoEqualityTest(expectedContacts, pair->getContacts()); } TEST(TriangleMeshPlaneContactCalculationTests, UnitTests) { // Create a Mesh Cube std::shared_ptr mesh = std::make_shared(); for (int i = 0; i < cubeNumPoints; ++i) { Vector3d p; p[0] = cubePoints[i][0]; p[1] = cubePoints[i][1]; p[2] = cubePoints[i][2]; TriangleMeshPlain::VertexType v(p); mesh->addVertex(v); } for (int i = 0; i < cubeNumEdges; ++i) { std::array edgePoints; for (int j = 0; j < 2; ++j) { edgePoints[j] = cubeEdges[i][j]; } TriangleMeshPlain::EdgeType e(edgePoints); mesh->addEdge(e); } for (int i = 0; i < cubeNumTriangles; ++i) { std::array trianglePoints; for (int j = 0; j < 3; ++j) { trianglePoints[j] = cubeTrianglesCCW[i][j]; } TriangleMeshPlain::TriangleType t(trianglePoints); mesh->addTriangle(t); } std::shared_ptr cubeMesh = std::make_shared(*mesh); std::shared_ptr plane = std::make_shared(); Quaterniond meshQuat; Vector3d meshTrans; Quaterniond planeQuat; Vector3d planeTrans; Quaterniond globalQuat; Vector3d planNormal; Matrix33d mRotation; const double epsilonTrans = 0.1; const double cubeSize = 1.0; { SCOPED_TRACE("No intersection, box in front of plane, no rotation"); meshQuat = Quaterniond::Identity(); meshTrans = Vector3d::Zero(); planeQuat = Quaterniond::Identity(); planeTrans = Vector3d(0.0, -(cubeSize / 2.0 + epsilonTrans), 0.0); int expectedNumberOfContacts = 0; int expectedBoxIndicesInContacts[] = {0}; doTriangleMeshPlaneTest(cubeMesh, meshQuat, meshTrans, plane, planeQuat, planeTrans, expectedNumberOfContacts, expectedBoxIndicesInContacts); } { SCOPED_TRACE("Intersection, 04 contacts, no rotation"); meshQuat = Quaterniond::Identity(); meshTrans = Vector3d::Zero(); planeQuat = Quaterniond::Identity(); planeTrans = Vector3d::Zero(); int expectedNumberOfContacts = 4; int expectedBoxIndicesInContacts[] = {0, 1, 4, 5}; doTriangleMeshPlaneTest(cubeMesh, meshQuat, meshTrans, plane, planeQuat, planeTrans, expectedNumberOfContacts, expectedBoxIndicesInContacts); } { SCOPED_TRACE("intersection, 08 contacts, no rotation"); meshQuat = Quaterniond::Identity(); meshTrans = Vector3d::Zero(); planeQuat = Quaterniond::Identity(); planeTrans = Vector3d(0.0, (cubeSize / 2.0 + epsilonTrans), 0.0); int expectedNumberOfContacts = 8; int expectedBoxIndicesInContacts[] = {0, 1, 2, 3, 4, 5, 6, 7}; doTriangleMeshPlaneTest(cubeMesh, meshQuat, meshTrans, plane, planeQuat, planeTrans, expectedNumberOfContacts, expectedBoxIndicesInContacts); } { SCOPED_TRACE("intersection, 02 contacts, plane rotate(Z, -45)"); meshQuat = Quaterniond::Identity(); meshTrans = Vector3d::Zero(); mRotation = Eigen::AngleAxisd(-M_PI_4, Vector3d::UnitZ()); planeQuat = Quaterniond(mRotation); planeTrans = Vector3d(-1.0, -1.0, 0.0) * (cubeSize / 2.0 - epsilonTrans); int expectedNumberOfContacts = 2; int expectedBoxIndicesInContacts[] = {0, 4}; doTriangleMeshPlaneTest(cubeMesh, meshQuat, meshTrans, plane, planeQuat, planeTrans, expectedNumberOfContacts, expectedBoxIndicesInContacts); } { SCOPED_TRACE("intersection, 06 contacts, plane rotate(Z, 45)"); meshQuat = Quaterniond::Identity(); meshTrans = Vector3d::Zero(); mRotation = Eigen::AngleAxisd(-M_PI_4, Vector3d::UnitZ()); planeQuat = Quaterniond(mRotation); planNormal = mRotation * Vector3d::UnitY(); planeTrans = planNormal * (cubeSize / 2 - epsilonTrans); int expectedNumberOfContacts = 6; int expectedBoxIndicesInContacts[] = {0, 4, 1, 3, 7, 5}; doTriangleMeshPlaneTest(cubeMesh, meshQuat, meshTrans, plane, planeQuat, planeTrans, expectedNumberOfContacts, expectedBoxIndicesInContacts); } // Test cases to cover all collisions between each corner of the cube with the plane { SCOPED_TRACE("intersection, 01 contact, plane rotate(XZ, -45)"); meshQuat = Quaterniond::Identity(); meshTrans = Vector3d::Zero(); mRotation = Eigen::AngleAxisd(-M_PI_4, Vector3d(1.0, 0.0, 1.0).normalized()); planeQuat = Quaterniond(mRotation); planNormal = Vector3d::UnitY(); planeTrans = -1.0 * planNormal * (sqrt(3.0) * cubeSize / 2.0 - epsilonTrans); int expectedNumberOfContacts = 1; int expectedBoxIndicesInContacts[] = {4}; doTriangleMeshPlaneTest(cubeMesh, meshQuat, meshTrans, plane, planeQuat, planeTrans, expectedNumberOfContacts, expectedBoxIndicesInContacts); } { SCOPED_TRACE("intersection, 01 contacts, plane rotate(+XZ,-M_PI/2-45)"); meshQuat = Quaterniond::Identity(); meshTrans = Vector3d::Zero(); mRotation = Eigen::AngleAxisd(-M_PI_2 - M_PI_4, Vector3d(1.0, 0.0, 1.0).normalized()); planeQuat = Quaterniond(mRotation); planNormal = mRotation * Vector3d::UnitY(); planeTrans = -1.0 * planNormal * (sqrt(3.0) * cubeSize / 2.0 - epsilonTrans); int expectedNumberOfContacts = 1; int expectedBoxIndicesInContacts[] = {7}; doTriangleMeshPlaneTest(cubeMesh, meshQuat, meshTrans, plane, planeQuat, planeTrans, expectedNumberOfContacts, expectedBoxIndicesInContacts); } { SCOPED_TRACE("intersection, 01 contacts, plane rotate(+X-Z, +45)"); meshQuat = Quaterniond::Identity(); meshTrans = Vector3d::Zero(); mRotation = Eigen::AngleAxisd(M_PI_4, Vector3d(1.0, 0.0, -1.0).normalized()); planeQuat = Quaterniond(mRotation); planNormal = mRotation * Vector3d::UnitY(); planeTrans = -1.0 * planNormal * (sqrt(3.0) * cubeSize / 2.0 - epsilonTrans); int expectedNumberOfContacts = 1; int expectedBoxIndicesInContacts[] = {0}; doTriangleMeshPlaneTest(cubeMesh, meshQuat, meshTrans, plane, planeQuat, planeTrans, expectedNumberOfContacts, expectedBoxIndicesInContacts); } { SCOPED_TRACE("intersection, 01 contacts, plane rotate(+X-Z, M_PI/2+45)"); meshQuat = Quaterniond::Identity(); meshTrans = Vector3d::Zero(); mRotation = Eigen::AngleAxisd(0.75 * M_PI, Vector3d(1.0, 0.0, -1.0).normalized()); planeQuat = Quaterniond(mRotation); planNormal = mRotation * Vector3d::UnitY(); planeTrans = -1.0 * planNormal * (sqrt(3.0) * cubeSize / 2.0 - epsilonTrans); int expectedNumberOfContacts = 1; int expectedBoxIndicesInContacts[] = {3}; doTriangleMeshPlaneTest(cubeMesh, meshQuat, meshTrans, plane, planeQuat, planeTrans, expectedNumberOfContacts, expectedBoxIndicesInContacts); } { SCOPED_TRACE("intersection, 01 contacts, plane rotate(+X-Z, -45)"); meshQuat = Quaterniond::Identity(); meshTrans = Vector3d::Zero(); mRotation = Eigen::AngleAxisd(-M_PI_4, Vector3d(1.0, 0.0, -1.0).normalized()); planeQuat = Quaterniond(mRotation); planNormal = mRotation * Vector3d::UnitY(); planeTrans = -1.0 * planNormal * (sqrt(3.0) * cubeSize / 2.0 - epsilonTrans); int expectedNumberOfContacts = 1; int expectedBoxIndicesInContacts[] = {5}; doTriangleMeshPlaneTest(cubeMesh, meshQuat, meshTrans, plane, planeQuat, planeTrans, expectedNumberOfContacts, expectedBoxIndicesInContacts); } { SCOPED_TRACE("intersection, 01 contacts, plane rotate(+X-Z,-M_PI/2-45)"); meshQuat = Quaterniond::Identity(); meshTrans = Vector3d::Zero(); mRotation = Eigen::AngleAxisd(-M_PI_2 - M_PI_4, Vector3d(1.0, 0.0, -1.0).normalized()); planeQuat = Quaterniond(mRotation); planNormal = mRotation * Vector3d::UnitY(); planeTrans = -1.0 * planNormal * (sqrt(3.0) * cubeSize / 2.0 - epsilonTrans); int expectedNumberOfContacts = 1; int expectedBoxIndicesInContacts[] = {6}; doTriangleMeshPlaneTest(cubeMesh, meshQuat, meshTrans, plane, planeQuat, planeTrans, expectedNumberOfContacts, expectedBoxIndicesInContacts); } { SCOPED_TRACE("intersection, 01 contacts, plane rotate(+X+Z, +45)"); meshQuat = Quaterniond::Identity(); meshTrans = Vector3d::Zero(); mRotation = Eigen::AngleAxisd(M_PI_4, Vector3d(1.0, 0.0, 1.0).normalized()); planeQuat = Quaterniond(mRotation); planNormal = mRotation * Vector3d::UnitY(); planeTrans = -1.0 * planNormal * (sqrt(3.0) * cubeSize / 2.0 - epsilonTrans); int expectedNumberOfContacts = 1; int expectedBoxIndicesInContacts[] = {1}; doTriangleMeshPlaneTest(cubeMesh, meshQuat, meshTrans, plane, planeQuat, planeTrans, expectedNumberOfContacts, expectedBoxIndicesInContacts); } { SCOPED_TRACE("intersection, 01 contacts, plane rotate(+X+Z, M_PI/2+45)"); meshQuat = Quaterniond::Identity(); meshTrans = Vector3d::Zero(); mRotation = Eigen::AngleAxisd(M_PI_2 + M_PI_4, Vector3d(1.0, 0.0, 1.0).normalized()); planeQuat = Quaterniond(mRotation); planNormal = mRotation * Vector3d::UnitY(); planeTrans = -1.0 * planNormal * (sqrt(3.0) * cubeSize / 2.0 - epsilonTrans); int expectedNumberOfContacts = 1; int expectedBoxIndicesInContacts[] = {2}; doTriangleMeshPlaneTest(cubeMesh, meshQuat, meshTrans, plane, planeQuat, planeTrans, expectedNumberOfContacts, expectedBoxIndicesInContacts); } { SCOPED_TRACE("intersection, 01 contacts, plane & cube -0.8*M_PI*rotate(Z, -M_PI/4)"); globalQuat = SurgSim::Math::makeRotationQuaternion(-1.318, Vector3d::UnitZ()); meshQuat = globalQuat * Quaterniond::Identity(); meshTrans = Vector3d::Zero(); planeQuat = globalQuat * Quaterniond(Eigen::AngleAxisd(-M_PI_4, Vector3d::UnitZ())); planeTrans = Vector3d(-1.0, -1.0, 0.0) * (cubeSize / 2.0 - epsilonTrans); int expectedNumberOfContacts = 2; int expectedBoxIndicesInContacts[] = {0, 4}; doTriangleMeshPlaneTest(cubeMesh, meshQuat, meshTrans, plane, planeQuat, planeTrans, expectedNumberOfContacts, expectedBoxIndicesInContacts); } } } }; // Physics }; // Surgsim opensurgsim-0.7.0/SurgSim/Collision/UnitTests/TriangleMeshSurfaceMeshContactCalculationTests.cpp000066400000000000000000000327131277777236100333420ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Collision/TriangleMeshSurfaceMeshContact.h" #include "SurgSim/Collision/UnitTests/ContactCalculationTestsCommon.h" #include "SurgSim/DataStructures/EmptyData.h" #include "SurgSim/DataStructures/IndexedLocalCoordinate.h" #include "SurgSim/DataStructures/TriangleMesh.h" #include "SurgSim/Math/Vector.h" using SurgSim::DataStructures::TriangleMeshPlain; using SurgSim::Math::Vector3d; namespace SurgSim { namespace Collision { /* CUBE 3*----------*2 / /| 7*----------* | | 6| | | *0 | *1 | |/ 4*----------*5 */ static const int cubeNumPoints = 8; static const Vector3d cubePoints[8] = { Vector3d(-1.0 / 2.0, -1.0 / 2.0, -1.0 / 2.0), Vector3d(1.0 / 2.0, -1.0 / 2.0, -1.0 / 2.0), Vector3d(1.0 / 2.0, 1.0 / 2.0, -1.0 / 2.0), Vector3d(-1.0 / 2.0, 1.0 / 2.0, -1.0 / 2.0), Vector3d(-1.0 / 2.0, -1.0 / 2.0, 1.0 / 2.0), Vector3d(1.0 / 2.0, -1.0 / 2.0, 1.0 / 2.0), Vector3d(1.0 / 2.0, 1.0 / 2.0, 1.0 / 2.0), Vector3d(-1.0 / 2.0, 1.0 / 2.0, 1.0 / 2.0) }; static const int cubeNumEdges = 12; static const int cubeEdges[12][2] = { {0, 1}, {3, 2}, {4, 5}, {7, 6}, // +X {0, 3}, {1, 2}, {4, 7}, {5 , 6}, // +Y {0, 4}, {1, 5}, {2, 6}, {3, 7} // +Z }; static const int cubeNumTriangles = 12; static const int cubeTrianglesCCW[12][3] = { {6, 2, 3}, {6, 3, 7}, // Top ( 0 1 0) [6237] {0, 1, 5}, {0, 5, 4}, // Bottom ( 0 -1 0) [0154] {4, 5, 6}, {4, 6, 7}, // Front ( 0 0 1) [4567] {0, 3, 2}, {0, 2, 1}, // Back ( 0 0 -1) [0321] {1, 2, 6}, {1, 6, 5}, // Right ( 1 0 0) [1265] {0, 4, 7}, {0, 7, 3} // Left (-1 0 0) [0473] }; void doTriangleMeshSurfaceMeshTest(std::shared_ptr meshA, const RigidTransform3d& meshATransform, std::shared_ptr meshB, const RigidTransform3d& meshBTransform, const std::list> expectedContacts) { std::shared_ptr meshARep = std::make_shared("Collision Mesh 0"); meshARep->setShape(meshA); meshARep->setLocalPose(meshATransform); std::shared_ptr meshBRep = std::make_shared("Collision Mesh 1"); meshBRep->setShape(meshB); meshBRep->setLocalPose(meshBTransform); // Perform collision detection. TriangleMeshSurfaceMeshContact calcContact; std::shared_ptr pair = std::make_shared(meshARep, meshBRep); calcContact.calculateContact(pair); contactsInfoEqualityTest(expectedContacts, pair->getContacts(), true); } TEST(TriangleMeshSurfaceMeshContactCalculationTests, NonintersectionTest) { using SurgSim::Math::makeRigidTransform; using SurgSim::Math::makeRotationQuaternion; // Create a Mesh Cube std::shared_ptr meshA = std::make_shared(); std::shared_ptr meshB = std::make_shared(); for (int i = 0; i < cubeNumPoints; ++i) { Vector3d p; p[0] = cubePoints[i][0]; p[1] = cubePoints[i][1]; p[2] = cubePoints[i][2]; TriangleMeshPlain::VertexType v(p); meshA->addVertex(v); meshB->addVertex(v); } for (int i = 0; i < cubeNumEdges; ++i) { std::array edgePoints; for (int j = 0; j < 2; j++) { edgePoints[j] = cubeEdges[i][j]; } TriangleMeshPlain::EdgeType e(edgePoints); meshA->addEdge(e); meshB->addEdge(e); } for (int i = 0; i < cubeNumTriangles; ++i) { std::array trianglePoints; for (int j = 0; j < 3; j++) { trianglePoints[j] = cubeTrianglesCCW[i][j]; } TriangleMeshPlain::TriangleType t(trianglePoints); meshA->addTriangle(t); if (i < cubeNumTriangles - 2) { meshB->addTriangle(t); } } std::shared_ptr cubeMeshA = std::make_shared(*meshA); std::shared_ptr cubeMeshB = std::make_shared(*meshB); SurgSim::Math::RigidTransform3d cubeMeshATransform; SurgSim::Math::RigidTransform3d cubeMeshBTransform; SurgSim::Math::RigidTransform3d globalTransform; const std::list> emptyContacts; double cubeSize = 1.0; double epsilonTrans = 0.001; { SCOPED_TRACE("No intersection, boxB above boxA"); cubeMeshATransform.setIdentity(); cubeMeshBTransform = Eigen::Translation(0.0, cubeSize + epsilonTrans, 0.0); globalTransform = makeRigidTransform(makeRotationQuaternion(1.234, Vector3d(1.2, 3.4, 5.6).normalized()), Vector3d(34.4, 567.6, 234.5)); cubeMeshATransform = globalTransform * cubeMeshATransform; cubeMeshBTransform = globalTransform * cubeMeshBTransform; doTriangleMeshSurfaceMeshTest(cubeMeshA, cubeMeshATransform, cubeMeshB, cubeMeshBTransform, emptyContacts); } { SCOPED_TRACE("No intersection, boxB below boxA"); cubeMeshATransform.setIdentity(); cubeMeshBTransform = Eigen::Translation(0.0, -(cubeSize + epsilonTrans), 0.0); globalTransform = makeRigidTransform(makeRotationQuaternion(1.4, Vector3d(10.2, 34.4, 15.6).normalized()), Vector3d(3.4, 6.6, 2.5)); cubeMeshATransform = globalTransform * cubeMeshATransform; cubeMeshBTransform = globalTransform * cubeMeshBTransform; doTriangleMeshSurfaceMeshTest(cubeMeshA, cubeMeshATransform, cubeMeshB, cubeMeshBTransform, emptyContacts); } { SCOPED_TRACE("No intersection, boxB to the left of boxA"); cubeMeshATransform.setIdentity(); cubeMeshBTransform = Eigen::Translation(-(cubeSize + epsilonTrans), 0.0, 0.0); globalTransform = makeRigidTransform(makeRotationQuaternion(1.4, Vector3d(1.2, 3.4, 5.6).normalized()), Vector3d(340.4, 567.6, 234.5)); cubeMeshATransform = globalTransform * cubeMeshATransform; cubeMeshBTransform = globalTransform * cubeMeshBTransform; doTriangleMeshSurfaceMeshTest(cubeMeshA, cubeMeshATransform, cubeMeshB, cubeMeshBTransform, emptyContacts); } { SCOPED_TRACE("No intersection, boxB to the right of boxA"); cubeMeshATransform.setIdentity(); cubeMeshBTransform = Eigen::Translation((cubeSize + epsilonTrans), 0.0, 0.0); globalTransform = makeRigidTransform(makeRotationQuaternion(1.2, Vector3d(11.2, 13.4, 15.6).normalized()), Vector3d(3.4, 5.6, 2.5)); cubeMeshATransform = globalTransform * cubeMeshATransform; cubeMeshBTransform = globalTransform * cubeMeshBTransform; doTriangleMeshSurfaceMeshTest(cubeMeshA, cubeMeshATransform, cubeMeshB, cubeMeshBTransform, emptyContacts); } { SCOPED_TRACE("No intersection, boxB in front of boxA"); cubeMeshATransform.setIdentity(); cubeMeshBTransform = Eigen::Translation(0.0, 0.0, (cubeSize + epsilonTrans)); globalTransform = makeRigidTransform(makeRotationQuaternion(2.234, Vector3d(10.2, 30.4, 50.6).normalized()), Vector3d(84.4, 56.6, 24.5)); cubeMeshATransform = globalTransform * cubeMeshATransform; cubeMeshBTransform = globalTransform * cubeMeshBTransform; doTriangleMeshSurfaceMeshTest(cubeMeshA, cubeMeshATransform, cubeMeshB, cubeMeshBTransform, emptyContacts); } { SCOPED_TRACE("No intersection, boxB behind boxA"); cubeMeshATransform.setIdentity(); cubeMeshBTransform = Eigen::Translation(0.0, 0.0, -(cubeSize + epsilonTrans)); globalTransform = makeRigidTransform(makeRotationQuaternion(1.24, Vector3d(9.2, 7.4, 5.6).normalized()), Vector3d(39.4, 67.6, 34.5)); cubeMeshATransform = globalTransform * cubeMeshATransform; cubeMeshBTransform = globalTransform * cubeMeshBTransform; doTriangleMeshSurfaceMeshTest(cubeMeshA, cubeMeshATransform, cubeMeshB, cubeMeshBTransform, emptyContacts); } } namespace { void addNewTriangle(std::shared_ptr mesh, SurgSim::Math::Vector3d point0, SurgSim::Math::Vector3d point1, SurgSim::Math::Vector3d point2) { // Add vertices TriangleMeshPlain::VertexType vertexMesh(Vector3d::Zero()); vertexMesh = TriangleMeshPlain::VertexType(point0); size_t index0 = mesh->addVertex(vertexMesh); vertexMesh = TriangleMeshPlain::VertexType(point1); size_t index1 = mesh->addVertex(vertexMesh); vertexMesh = TriangleMeshPlain::VertexType(point2); size_t index2 = mesh->addVertex(vertexMesh); // Add edges std::array edge; TriangleMeshPlain::EdgeType meshEdge(edge); edge[0] = index0; edge[1] = index1; meshEdge = TriangleMeshPlain::EdgeType(edge); mesh->addEdge(meshEdge); edge[0] = index1; edge[1] = index2; meshEdge = TriangleMeshPlain::EdgeType(edge); mesh->addEdge(meshEdge); edge[0] = index2; edge[1] = index0; meshEdge = TriangleMeshPlain::EdgeType(edge); mesh->addEdge(meshEdge); // Add triangle std::array triangle = {index0, index1, index2}; TriangleMeshPlain::TriangleType meshTriangle(triangle); mesh->addTriangle(meshTriangle); } } TEST(TriangleMeshSurfaceMeshContactCalculationTests, IntersectionTest) { using SurgSim::Math::MeshShape; using SurgSim::Math::Vector3d; using SurgSim::Math::RigidTransform3d; RigidTransform3d pose; pose = SurgSim::Math::makeRigidTransform( SurgSim::Math::makeRotationQuaternion(0.3468, Vector3d(0.2577, 0.8245, 1.0532).normalized()), Vector3d(120.34, 567.23, -832.84)); { // The first mesh. auto intersectingTriangle = std::make_shared(); addNewTriangle(intersectingTriangle, Vector3d(0.0, 0.0, 0.0), Vector3d(0.0, 0.0, 1.0), Vector3d(1.0, 0.0, 0.5)); auto triangleMesh = std::make_shared(*intersectingTriangle); // The first mesh. auto baseTriangles = std::make_shared(); static const int numTriangles = 100; std::list> expectedContacts; double expectedDepth; double zIncrement = 1.0 / (numTriangles + 1); double zValue; std::pair expectedPenetrationPoints; Vector3d expectedPoint0, expectedPoint1; Vector3d expectedNormal, expectedContact(0, 0, 0); for (int i = 0; i < numTriangles; i++) { zValue = static_cast(i + 1) * zIncrement; addNewTriangle(baseTriangles, Vector3d(50, 50, zValue), Vector3d(-50, 50, zValue), Vector3d(0, -50, zValue)); expectedDepth = zValue; if (expectedDepth >= 0.5) { expectedDepth = 1.0 - expectedDepth; expectedNormal = pose.linear() * Vector3d(0, 0, -1); expectedPoint0 = Vector3d(0, 0, 1.0); expectedPoint1 = Vector3d(0, 0, zValue); } else { expectedNormal = pose.linear() * Vector3d(0, 0, 1); expectedPoint0 = Vector3d(0, 0, 0.0); expectedPoint1 = Vector3d(0, 0, zValue); } if (expectedDepth > 0.0) { expectedPenetrationPoints.first.rigidLocalPosition.setValue(expectedPoint0); expectedPenetrationPoints.second.rigidLocalPosition.setValue(expectedPoint1); SurgSim::DataStructures::IndexedLocalCoordinate triangleLocalPosition; triangleLocalPosition.index = 0; expectedPenetrationPoints.first.triangleMeshLocalCoordinate.setValue(triangleLocalPosition); triangleLocalPosition.index = i; expectedPenetrationPoints.second.triangleMeshLocalCoordinate.setValue(triangleLocalPosition); auto contact = std::make_shared( COLLISION_DETECTION_TYPE_DISCRETE, expectedDepth, 1.0, expectedContact, expectedNormal, expectedPenetrationPoints); contact->firstVertices = intersectingTriangle->getTrianglePositions(0); contact->secondVertices = baseTriangles->getTrianglePositions(baseTriangles->getNumTriangles() - 1); expectedContacts.push_back(contact); } } auto baseMesh = std::make_shared(*baseTriangles); // Looking in -y, triangle A points in +y, +z is left, +x is down // |-------| => k // * * * * * * * * * * * * * ----- // * * * | // * * * | => 2*k on right, 2*(1-k) on left // * * * | // * * ----- // * * // * // // Looking in -z, triangle B points in +z, +y is up, +x is right // (1) When triangle A sticks sufficiently out of triangle B // i.e. k >= 1/8 && k <= 7/8 // // * ----- // * * | => 1/2 // * * | // * * * * * ----- // * * | => 1/2 // * * | // * * * * * * * * * * * * * ----- // |-----| => 1/4 // // (2) When triangle A only partially sticks out of triangle B // i.e. k > 7/8 || k < 1/8 // * ----- // * * | => 1/2 // * * | // * * * ----- // * * | => 1/2 // * * | // * * * * * * * * * * * * * ----- // |--| => 2k // doTriangleMeshSurfaceMeshTest(triangleMesh, pose, baseMesh, pose, expectedContacts); } } }; // namespace Collision }; // namespace Surgsim opensurgsim-0.7.0/SurgSim/Collision/UnitTests/TriangleMeshTriangleMeshContactCalculationTests.cpp000066400000000000000000000443711277777236100335220ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Collision/TriangleMeshTriangleMeshContact.h" #include "SurgSim/Collision/UnitTests/ContactCalculationTestsCommon.h" #include "SurgSim/DataStructures/EmptyData.h" #include "SurgSim/DataStructures/IndexedLocalCoordinate.h" #include "SurgSim/DataStructures/TriangleMesh.h" #include "SurgSim/Math/Vector.h" using SurgSim::DataStructures::TriangleMeshPlain; using SurgSim::Math::Vector3d; namespace SurgSim { namespace Collision { /* CUBE 3*----------*2 / /| 7*----------* | | 6| | | *0 | *1 | |/ 4*----------*5 */ static const int cubeNumPoints = 8; static const Vector3d cubePoints[8] = { Vector3d(-1.0 / 2.0, -1.0 / 2.0, -1.0 / 2.0), Vector3d(1.0 / 2.0, -1.0 / 2.0, -1.0 / 2.0), Vector3d(1.0 / 2.0, 1.0 / 2.0, -1.0 / 2.0), Vector3d(-1.0 / 2.0, 1.0 / 2.0, -1.0 / 2.0), Vector3d(-1.0 / 2.0, -1.0 / 2.0, 1.0 / 2.0), Vector3d(1.0 / 2.0, -1.0 / 2.0, 1.0 / 2.0), Vector3d(1.0 / 2.0, 1.0 / 2.0, 1.0 / 2.0), Vector3d(-1.0 / 2.0, 1.0 / 2.0, 1.0 / 2.0) }; static const int cubeNumEdges = 12; static const int cubeEdges[12][2] = { {0, 1}, {3, 2}, {4, 5}, {7, 6}, // +X {0, 3}, {1, 2}, {4, 7}, {5 , 6}, // +Y {0, 4}, {1, 5}, {2, 6}, {3, 7} // +Z }; static const int cubeNumTriangles = 12; static const int cubeTrianglesCCW[12][3] = { {6, 2, 3}, {6, 3, 7}, // Top ( 0 1 0) [6237] {0, 1, 5}, {0, 5, 4}, // Bottom ( 0 -1 0) [0154] {4, 5, 6}, {4, 6, 7}, // Front ( 0 0 1) [4567] {0, 3, 2}, {0, 2, 1}, // Back ( 0 0 -1) [0321] {1, 2, 6}, {1, 6, 5}, // Right ( 1 0 0) [1265] {0, 4, 7}, {0, 7, 3} // Left (-1 0 0) [0473] }; void doTriangleMeshTriangleMeshTest(std::shared_ptr meshA, const RigidTransform3d& meshATransform, std::shared_ptr meshB, const RigidTransform3d& meshBTransform, const std::list> expectedContacts) { std::shared_ptr meshARep = std::make_shared("Collision Mesh 0"); meshARep->setShape(meshA); meshARep->setLocalPose(meshATransform); std::shared_ptr meshBRep = std::make_shared("Collision Mesh 1"); meshBRep->setShape(meshB); meshBRep->setLocalPose(meshBTransform); // Perform collision detection. TriangleMeshTriangleMeshContact calcContact; std::shared_ptr pair = std::make_shared(meshARep, meshBRep); calcContact.calculateContact(pair); contactsInfoEqualityTest(expectedContacts, pair->getContacts(), true); } TEST(TriangleMeshTriangleMeshContactCalculationTests, NonintersectionTest) { using SurgSim::Math::makeRigidTransform; using SurgSim::Math::makeRotationQuaternion; // Create a Mesh Cube std::shared_ptr mesh = std::make_shared(); for (int i = 0; i < cubeNumPoints; ++i) { Vector3d p; p[0] = cubePoints[i][0]; p[1] = cubePoints[i][1]; p[2] = cubePoints[i][2]; TriangleMeshPlain::VertexType v(p); mesh->addVertex(v); } for (int i = 0; i < cubeNumEdges; ++i) { std::array edgePoints; for (int j = 0; j < 2; j++) { edgePoints[j] = cubeEdges[i][j]; } TriangleMeshPlain::EdgeType e(edgePoints); mesh->addEdge(e); } for (int i = 0; i < cubeNumTriangles; ++i) { std::array trianglePoints; for (int j = 0; j < 3; j++) { trianglePoints[j] = cubeTrianglesCCW[i][j]; } TriangleMeshPlain::TriangleType t(trianglePoints); mesh->addTriangle(t); } std::shared_ptr cubeMeshA = std::make_shared(*mesh); std::shared_ptr cubeMeshB = std::make_shared(*mesh); SurgSim::Math::RigidTransform3d cubeMeshATransform; SurgSim::Math::RigidTransform3d cubeMeshBTransform; SurgSim::Math::RigidTransform3d globalTransform; const std::list> emptyContacts; double cubeSize = 1.0; double epsilonTrans = 0.001; { SCOPED_TRACE("No intersection, boxB above boxA"); cubeMeshATransform.setIdentity(); cubeMeshBTransform = Eigen::Translation(0.0, cubeSize + epsilonTrans, 0.0); globalTransform = makeRigidTransform(makeRotationQuaternion(1.234, Vector3d(1.2, 3.4, 5.6).normalized()), Vector3d(34.4, 567.6, 234.5)); cubeMeshATransform = globalTransform * cubeMeshATransform; cubeMeshBTransform = globalTransform * cubeMeshBTransform; doTriangleMeshTriangleMeshTest(cubeMeshA, cubeMeshATransform, cubeMeshB, cubeMeshBTransform, emptyContacts); } { SCOPED_TRACE("No intersection, boxB below boxA"); cubeMeshATransform.setIdentity(); cubeMeshBTransform = Eigen::Translation(0.0, -(cubeSize + epsilonTrans), 0.0); globalTransform = makeRigidTransform(makeRotationQuaternion(1.4, Vector3d(10.2, 34.4, 15.6).normalized()), Vector3d(3.4, 6.6, 2.5)); cubeMeshATransform = globalTransform * cubeMeshATransform; cubeMeshBTransform = globalTransform * cubeMeshBTransform; doTriangleMeshTriangleMeshTest(cubeMeshA, cubeMeshATransform, cubeMeshB, cubeMeshBTransform, emptyContacts); } { SCOPED_TRACE("No intersection, boxB to the left of boxA"); cubeMeshATransform.setIdentity(); cubeMeshBTransform = Eigen::Translation(-(cubeSize + epsilonTrans), 0.0, 0.0); globalTransform = makeRigidTransform(makeRotationQuaternion(1.4, Vector3d(1.2, 3.4, 5.6).normalized()), Vector3d(340.4, 567.6, 234.5)); cubeMeshATransform = globalTransform * cubeMeshATransform; cubeMeshBTransform = globalTransform * cubeMeshBTransform; doTriangleMeshTriangleMeshTest(cubeMeshA, cubeMeshATransform, cubeMeshB, cubeMeshBTransform, emptyContacts); } { SCOPED_TRACE("No intersection, boxB to the right of boxA"); cubeMeshATransform.setIdentity(); cubeMeshBTransform = Eigen::Translation((cubeSize + epsilonTrans), 0.0, 0.0); globalTransform = makeRigidTransform(makeRotationQuaternion(1.2, Vector3d(11.2, 13.4, 15.6).normalized()), Vector3d(3.4, 5.6, 2.5)); cubeMeshATransform = globalTransform * cubeMeshATransform; cubeMeshBTransform = globalTransform * cubeMeshBTransform; doTriangleMeshTriangleMeshTest(cubeMeshA, cubeMeshATransform, cubeMeshB, cubeMeshBTransform, emptyContacts); } { SCOPED_TRACE("No intersection, boxB in front of boxA"); cubeMeshATransform.setIdentity(); cubeMeshBTransform = Eigen::Translation(0.0, 0.0, (cubeSize + epsilonTrans)); globalTransform = makeRigidTransform(makeRotationQuaternion(2.234, Vector3d(10.2, 30.4, 50.6).normalized()), Vector3d(84.4, 56.6, 24.5)); cubeMeshATransform = globalTransform * cubeMeshATransform; cubeMeshBTransform = globalTransform * cubeMeshBTransform; doTriangleMeshTriangleMeshTest(cubeMeshA, cubeMeshATransform, cubeMeshB, cubeMeshBTransform, emptyContacts); } { SCOPED_TRACE("No intersection, boxB behind boxA"); cubeMeshATransform.setIdentity(); cubeMeshBTransform = Eigen::Translation(0.0, 0.0, -(cubeSize + epsilonTrans)); globalTransform = makeRigidTransform(makeRotationQuaternion(1.24, Vector3d(9.2, 7.4, 5.6).normalized()), Vector3d(39.4, 67.6, 34.5)); cubeMeshATransform = globalTransform * cubeMeshATransform; cubeMeshBTransform = globalTransform * cubeMeshBTransform; doTriangleMeshTriangleMeshTest(cubeMeshA, cubeMeshATransform, cubeMeshB, cubeMeshBTransform, emptyContacts); } } namespace { void addNewTriangle(std::shared_ptr mesh, SurgSim::Math::Vector3d point0, SurgSim::Math::Vector3d point1, SurgSim::Math::Vector3d point2) { // Add vertices TriangleMeshPlain::VertexType vertexMesh(Vector3d::Zero()); vertexMesh = TriangleMeshPlain::VertexType(point0); size_t index0 = mesh->addVertex(vertexMesh); vertexMesh = TriangleMeshPlain::VertexType(point1); size_t index1 = mesh->addVertex(vertexMesh); vertexMesh = TriangleMeshPlain::VertexType(point2); size_t index2 = mesh->addVertex(vertexMesh); // Add edges std::array edge; TriangleMeshPlain::EdgeType meshEdge(edge); edge[0] = index0; edge[1] = index1; meshEdge = TriangleMeshPlain::EdgeType(edge); mesh->addEdge(meshEdge); edge[0] = index1; edge[1] = index2; meshEdge = TriangleMeshPlain::EdgeType(edge); mesh->addEdge(meshEdge); edge[0] = index2; edge[1] = index0; meshEdge = TriangleMeshPlain::EdgeType(edge); mesh->addEdge(meshEdge); // Add triangle std::array triangle = {index0, index1, index2}; TriangleMeshPlain::TriangleType meshTriangle(triangle); mesh->addTriangle(meshTriangle); } } TEST(TriangleMeshTriangleMeshContactCalculationTests, IntersectionTest) { using SurgSim::Math::MeshShape; using SurgSim::Math::Vector3d; using SurgSim::Math::RigidTransform3d; RigidTransform3d pose; pose = SurgSim::Math::makeRigidTransform( SurgSim::Math::makeRotationQuaternion(0.3468, Vector3d(0.2577, 0.8245, 1.0532).normalized()), Vector3d(120.34, 567.23, -832.84)); { // The second mesh. auto intersectingTriangle = std::make_shared(); addNewTriangle(intersectingTriangle, Vector3d(0.0, 0.0, 0.0), Vector3d(0.0, 0.0, 1.0), Vector3d(1.0, 0.0, 0.5)); auto triangleMesh = std::make_shared(*intersectingTriangle); // The first mesh. auto baseTriangles = std::make_shared(); static const int numTriangles = 100; std::list> expectedContacts; double expectedDepth; double zOffset = 0.5 / numTriangles; double zValue; std::pair expectedPenetrationPoints; Vector3d expectedPoint0, expectedPoint1; Vector3d expectedNormal, expectedContact(0, 0, 0); for (int i = 0; i < numTriangles - 1; i++) { zValue = static_cast(i) / numTriangles + zOffset; addNewTriangle(baseTriangles, Vector3d(0.5, 0.5, zValue), Vector3d(-0.5, 0.5, zValue), Vector3d(0.0, -0.5, zValue)); expectedDepth = zValue; if (expectedDepth >= 0.5) { expectedDepth = 0.5; expectedNormal = pose.linear() * Vector3d(0, 1, 0); expectedPoint0 = Vector3d(0, -0.5, zValue); expectedPoint1 = Vector3d(0, 0, zValue); } else { expectedNormal = pose.linear() * Vector3d(0, 0, -1); expectedPoint0 = Vector3d(0, 0, zValue); expectedPoint1 = Vector3d(0, 0, 0); } if (expectedDepth > 0.0) { expectedPenetrationPoints.first.rigidLocalPosition.setValue(expectedPoint0); expectedPenetrationPoints.second.rigidLocalPosition.setValue(expectedPoint1); SurgSim::DataStructures::IndexedLocalCoordinate triangleLocalPosition; triangleLocalPosition.index = i; expectedPenetrationPoints.first.triangleMeshLocalCoordinate.setValue(triangleLocalPosition); triangleLocalPosition.index = 0; expectedPenetrationPoints.second.triangleMeshLocalCoordinate.setValue(triangleLocalPosition); auto contact = std::make_shared( COLLISION_DETECTION_TYPE_DISCRETE, expectedDepth, 1.0, expectedContact, expectedNormal, expectedPenetrationPoints); contact->firstVertices = baseTriangles->getTrianglePositions(baseTriangles->getNumTriangles() - 1); contact->secondVertices = intersectingTriangle->getTrianglePositions(0); for (size_t i = 0; i < 3; ++i) { contact->firstVertices[i] = contact->firstVertices[i]; contact->secondVertices[i] = contact->secondVertices[i]; } expectedContacts.push_back(contact); } } auto baseMesh = std::make_shared(*baseTriangles); // Looking in -y, triangle A points in +y, +z is left, +x is down // |-------| => k // * * * * * * * * * * * * * ----- // * * * | // * * * | => 2*k on right, 2*(1-k) on left // * * * | // * * ----- // * * // * // // Looking in -z, triangle B points in +z, +y is up, +x is right // (1) When triangle A sticks sufficiently out of triangle B // i.e. k >= 1/8 && k <= 7/8 // // * ----- // * * | => 1/2 // * * | // * * * * * ----- // * * | => 1/2 // * * | // * * * * * * * * * * * * * ----- // |-----| => 1/4 // // (2) When triangle A only partially sticks out of triangle B // i.e. k > 7/8 || k < 1/8 // * ----- // * * | => 1/2 // * * | // * * * ----- // * * | => 1/2 // * * | // * * * * * * * * * * * * * ----- // |--| => 2k // doTriangleMeshTriangleMeshTest(baseMesh, pose, triangleMesh, pose, expectedContacts); } } TEST(TriangleMeshTriangleMeshContactCalculationTests, IntersectionTestAtIdenticalDepth) { using SurgSim::Math::MeshShape; using SurgSim::Math::Vector3d; using SurgSim::Math::RigidTransform3d; RigidTransform3d pose; pose = SurgSim::Math::makeRigidTransform( SurgSim::Math::makeRotationQuaternion(0.4638, Vector3d(0.5727, 0.2485, 1.532).normalized()), Vector3d(210.34, 675.23, -283.84)); pose = SurgSim::Math::makeRigidTransform( SurgSim::Math::makeRotationQuaternion(0.0, Vector3d(0.5727, 0.2485, 1.532).normalized()), Vector3d(0, 0, 0)); { // The second mesh. const double e = 8e-11; auto intersectingTriangle = std::make_shared(); addNewTriangle(intersectingTriangle, Vector3d(e, 0.0, 0.0), Vector3d(-0.5, 0.0, 1.0), Vector3d(e, 0.0, 1.0)); auto triangleMesh = std::make_shared(*intersectingTriangle); // The first mesh. auto baseTriangles = std::make_shared(); static const size_t numTriangles = 100; SurgSim::DataStructures::IndexedLocalCoordinate triangleLocalPosition; std::list> expectedContacts; double expectedDepth; double expectedTime; double interval = 1.0 / static_cast(numTriangles + 1); double coordinate; std::pair expectedPenetrationPoints; Vector3d expectedPoint0, expectedPoint1; Vector3d expectedNormal, expectedContact(0, 0, 0); for (size_t i = 0; i < numTriangles; i++) { coordinate = interval * static_cast(i + 1); addNewTriangle(baseTriangles, Vector3d(-e, -coordinate, coordinate), Vector3d(0.5, 1.0 - coordinate, coordinate), Vector3d(-e, 1.0 - coordinate, coordinate)); expectedDepth = coordinate; expectedTime = 1.0; { expectedPenetrationPoints.first.rigidLocalPosition.setValue(Vector3d(0, 0, coordinate)); expectedPenetrationPoints.second.rigidLocalPosition.setValue(Vector3d(0, 0, 0)); triangleLocalPosition.index = i; expectedPenetrationPoints.first.triangleMeshLocalCoordinate.setValue(triangleLocalPosition); triangleLocalPosition.index = 0; expectedPenetrationPoints.second.triangleMeshLocalCoordinate.setValue(triangleLocalPosition); auto contact = std::make_shared( COLLISION_DETECTION_TYPE_DISCRETE, expectedDepth, expectedTime, expectedContact, pose.linear() * Vector3d(0, 0, -1), expectedPenetrationPoints); contact->firstVertices = baseTriangles->getTrianglePositions(baseTriangles->getNumTriangles() - 1); contact->secondVertices = intersectingTriangle->getTrianglePositions(0); for (size_t i = 0; i < 3; ++i) { contact->firstVertices[i] = contact->firstVertices[i]; contact->secondVertices[i] = contact->secondVertices[i]; } expectedContacts.push_back(contact); } { expectedPenetrationPoints.first.rigidLocalPosition.setValue(Vector3d(0, -coordinate, coordinate)); expectedPenetrationPoints.second.rigidLocalPosition.setValue(Vector3d(0, 0, coordinate)); triangleLocalPosition.index = i; expectedPenetrationPoints.first.triangleMeshLocalCoordinate.setValue(triangleLocalPosition); triangleLocalPosition.index = 0; expectedPenetrationPoints.second.triangleMeshLocalCoordinate.setValue(triangleLocalPosition); auto contact = std::make_shared( COLLISION_DETECTION_TYPE_DISCRETE, expectedDepth, expectedTime, expectedContact, pose.linear() * Vector3d(0, 1, 0), expectedPenetrationPoints); contact->firstVertices = baseTriangles->getTrianglePositions(baseTriangles->getNumTriangles() - 1); contact->secondVertices = intersectingTriangle->getTrianglePositions(0); for (size_t i = 0; i < 3; ++i) { contact->firstVertices[i] = contact->firstVertices[i]; contact->secondVertices[i] = contact->secondVertices[i]; } expectedContacts.push_back(contact); } } auto baseMesh = std::make_shared(*baseTriangles); std::shared_ptr meshARep = std::make_shared("Collision Mesh 0"); meshARep->setShape(baseMesh); meshARep->setLocalPose(pose); std::shared_ptr meshBRep = std::make_shared("Collision Mesh 1"); meshBRep->setShape(triangleMesh); meshBRep->setLocalPose(pose); // Perform collision detection. TriangleMeshTriangleMeshContact calcContact; std::shared_ptr pair = std::make_shared(meshARep, meshBRep); calcContact.calculateContact(pair); auto& calculatedContacts = pair->getContacts(); EXPECT_EQ(numTriangles, calculatedContacts.size()); for (auto it = calculatedContacts.begin(); it != calculatedContacts.end(); ++it) { EXPECT_TRUE(isContactPresentInList(*it, expectedContacts, false)); } } } }; // namespace Collision }; // namespace Surgsim opensurgsim-0.7.0/SurgSim/Collision/UnitTests/config.txt.in000066400000000000000000000000541277777236100240140ustar00rootroot00000000000000${PROJECT_BINARY_DIR}/SurgSim/Testing/Data/ opensurgsim-0.7.0/SurgSim/DataStructures/000077500000000000000000000000001277777236100204625ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/DataStructures/AabbTree.cpp000066400000000000000000000064171277777236100226430ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/DataStructures/AabbTree.h" #include "SurgSim/DataStructures/AabbTreeNode.h" #include namespace SurgSim { namespace DataStructures { AabbTree::AabbTree() : m_maxObjectsPerNode(3) { m_typedRoot = std::make_shared(); setRoot(m_typedRoot); } AabbTree::AabbTree(size_t maxObjectsPerNode) : m_maxObjectsPerNode(maxObjectsPerNode) { m_typedRoot = std::make_shared(); setRoot(m_typedRoot); } AabbTree::~AabbTree() { } void AabbTree::add(const SurgSim::Math::Aabbd& aabb, size_t objectId) { m_typedRoot->addData(aabb, objectId, m_maxObjectsPerNode); } void AabbTree::set(const std::list& items) { m_typedRoot = std::make_shared(); setRoot(m_typedRoot); m_typedRoot->setData(items, m_maxObjectsPerNode); } void AabbTree::set(std::list&& items) { m_typedRoot = std::make_shared(); setRoot(m_typedRoot); m_typedRoot->setData(std::move(items), m_maxObjectsPerNode); } size_t AabbTree::getMaxObjectsPerNode() const { return m_maxObjectsPerNode; } const SurgSim::Math::Aabbd& AabbTree::getAabb() const { return m_typedRoot->getAabb(); } std::list AabbTree::spatialJoin(const AabbTree& otherTree) const { std::list result; spatialJoin(std::static_pointer_cast(getRoot()), std::static_pointer_cast(otherTree.getRoot()), &result); return result; } void AabbTree::spatialJoin(std::shared_ptr lhsParent, std::shared_ptr rhsParent, std::list* result) const { if (!SurgSim::Math::doAabbIntersect(lhsParent->getAabb(), rhsParent->getAabb())) { return; } if ((lhsParent->getNumChildren() == 0) && (rhsParent->getNumChildren() == 0)) { result->emplace_back(lhsParent, rhsParent); } else if (lhsParent->getNumChildren() == 0) { for (size_t j = 0; j < rhsParent->getNumChildren(); j++) { auto rhs = std::static_pointer_cast(rhsParent->getChild(j)); spatialJoin(lhsParent, rhs, result); } } else if (rhsParent->getNumChildren() == 0) { for (size_t i = 0; i < lhsParent->getNumChildren(); i++) { auto lhs = std::static_pointer_cast(lhsParent->getChild(i)); spatialJoin(lhs, rhsParent, result); } } else { for (size_t i = 0; i < lhsParent->getNumChildren(); i++) { auto lhs = std::static_pointer_cast(lhsParent->getChild(i)); for (size_t j = 0; j < rhsParent->getNumChildren(); j++) { auto rhs = std::static_pointer_cast(rhsParent->getChild(j)); spatialJoin(lhs, rhs, result); } } } } } } opensurgsim-0.7.0/SurgSim/DataStructures/AabbTree.h000066400000000000000000000066441277777236100223120ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DATASTRUCTURES_AABBTREE_H #define SURGSIM_DATASTRUCTURES_AABBTREE_H #include #include "SurgSim/DataStructures/Tree.h" #include "SurgSim/DataStructures/AabbTreeData.h" #include "SurgSim/Math/Aabb.h" namespace SurgSim { namespace DataStructures { class AabbTreeNode; /// AabbTree is a tree that is organized by the bounding boxes of the referenced objects, the bounding box used is /// the Axis Aligned Bounding Box (AABB), with the extents of an AABB describing the min and max of each coordinate /// for the given object. class AabbTree : public Tree { public: /// Constructor AabbTree(); /// Constructor /// \param maxObjectsPerNode if the number of objects exceeds this a split of the node will be triggered explicit AabbTree(size_t maxObjectsPerNode); /// Destructor virtual ~AabbTree(); /// \return the number of objects per node that will trigger a split for this tree size_t getMaxObjectsPerNode() const; /// Add a give object identified by objectId to the tree, this id should be unqiue on the users side, but no /// checks are made in the inside of the tree /// \param aabb AABB of this object. /// \param objectId Id for the object to be identified with this bounding box void add(const SurgSim::Math::Aabbd& aabb, size_t objectId); /// Create the tree from a list of tree items, all the tree information will be deleted /// \param items list of items to insert into the tree void set(const std::list& items); /// Create the tree from a list of tree items, all the tree information will be deleted /// \param items rvalue reference to list of items to insert into the tree void set(std::list&& items); /// \return the AABB for the tree const SurgSim::Math::Aabbd& getAabb() const; /// Type indicating a relationship between two AabbTreeNodes typedef std::pair, std::shared_ptr> TreeNodePairType; /// Query to find all pairs of intersecting nodes between two aabb r-trees. /// \param otherTree The other tree to compare against /// \return The list of all pairs of intersecting nodes std::list spatialJoin(const AabbTree& otherTree) const; /// Query to find all pairs of intersecting nodes between two aabb r-trees. /// \param lhsParent root node of the first tree /// \param rhsParent root node of the second tree /// \param result the list of all pairs of intersecting nodes void spatialJoin(std::shared_ptr lhsParent, std::shared_ptr rhsParent, std::list* result) const; private: /// Number of objects in a node that will trigger a split size_t m_maxObjectsPerNode; /// A typed version of the root for access without typecasting std::shared_ptr m_typedRoot; }; } } #endif opensurgsim-0.7.0/SurgSim/DataStructures/AabbTreeData.cpp000066400000000000000000000071201277777236100234250ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/DataStructures/AabbTreeData.h" #include "SurgSim/Framework/Assert.h" #include namespace SurgSim { namespace DataStructures { AabbTreeData::AabbTreeData() { } AabbTreeData::AabbTreeData(const std::list& data) : m_data(data) { recalculateAabb(); } AabbTreeData::AabbTreeData(std::list&& data) : m_data(std::move(data)) { recalculateAabb(); } AabbTreeData::~AabbTreeData() { } bool AabbTreeData::isEqual(const TreeData* data) const { // The type safety of this is guaranteed by the == operator in TreeData const AabbTreeData* treeData = static_cast(data); bool result = false; if (getSize() == treeData->getSize() && getAabb().isApprox(treeData->getAabb())) { result = true; auto it = m_data.cbegin(); auto endIt = m_data.cend(); auto otherEnd = treeData->m_data.cend(); auto functor = [it](const Item & other) { return ((*it).second == other.second && (*it).first.isApprox(other.first)); }; for (; it != endIt; ++it) { if (std::find_if(treeData->m_data.cbegin(), treeData->m_data.cend(), functor) == otherEnd) { result = false; break; } } } return result; } void AabbTreeData::add(const SurgSim::Math::Aabbd aabb, size_t id) { m_aabb.extend(aabb); m_data.emplace_back(aabb, id); } const SurgSim::Math::Aabbd& AabbTreeData::getAabb() const { return m_aabb; } bool AabbTreeData::isEmpty() const { return m_data.empty(); } size_t AabbTreeData::getSize() const { return m_data.size(); } std::shared_ptr AabbTreeData::takeLargerElements() { std::shared_ptr result(std::make_shared()); int axis; m_aabb.sizes().maxCoeff(&axis); double centerValue = m_aabb.center()(axis); // HS-2015-03-20 // The new left and right aabb extents can probably be calculated here // Only the separating axis extents would change the other two axis are unaffected // #performance auto functor = [centerValue, axis](const Item & item) { return item.first.center()(axis) < centerValue; }; auto split = std::partition(m_data.begin(), m_data.end(), functor); // In some cases all pieces may end up on one or the other side of the split, make this a noop if (split != m_data.begin() && split != m_data.end()) { result->m_data.splice(result->m_data.end(), m_data, split, m_data.end()); recalculateAabb(); result->recalculateAabb(); } return result; } void AabbTreeData::recalculateAabb() { m_aabb.setNull(); std::for_each(m_data.begin(), m_data.end(), [&](const Item & item) { m_aabb.extend(item.first); }); } void AabbTreeData::getIntersections(const SurgSim::Math::Aabbd& aabb, std::list* result) const { std::for_each(m_data.begin(), m_data.end(), [&](const Item & item) { if (SurgSim::Math::doAabbIntersect(item.first, aabb)) { result->push_back(item.second); } }); } bool AabbTreeData::hasIntersections(const SurgSim::Math::Aabbd& aabb) const { return SurgSim::Math::doAabbIntersect(m_aabb, aabb); } } } opensurgsim-0.7.0/SurgSim/DataStructures/AabbTreeData.h000066400000000000000000000066361277777236100231050ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DATASTRUCTURES_AABBTREEDATA_H #define SURGSIM_DATASTRUCTURES_AABBTREEDATA_H #include "SurgSim/DataStructures/TreeData.h" #include "SurgSim/Math/Aabb.h" #include #include #include namespace SurgSim { namespace DataStructures { /// Internal class to hold a list of AABBs and their respective object ids, it can calculate the elements /// that intersect with a given aabb each node in the AABB tree holds one of these. class AabbTreeData : public TreeData { public: typedef std::pair Item; /// Constructor AabbTreeData(); /// Copy Constructor AabbTreeData(const AabbTreeData& data); /// Constructor with list of items explicit AabbTreeData(const std::list& data); /// Constructor with moveable list of items explicit AabbTreeData(std::list&& data); /// Destructor ~AabbTreeData(); /// Add an item to the data /// \param aabb the AABB of the item /// \param id an object identifier assigned by the user of this class void add(const SurgSim::Math::Aabbd aabb, size_t id); /// \return the combined AABB of all the contained items const SurgSim::Math::Aabbd& getAabb() const; /// \return true when there are no items, false otherwise bool isEmpty() const; /// \return the number of items size_t getSize() const; /// Split the current items into two geometric halves, keep the first half and return a pointer to the second half. /// The split is done along the longest axis of the enclosing aabb, the center of this axis is the point where /// the split occurs. This object will keep items that have a smaller coordinate than the center, the result will /// receive all items that have a larger coordinate on the determined axis. /// \return AabbTreeData with the items to the right of the center of the longest axis. std::shared_ptr takeLargerElements(); /// Check whether there could be any intersections with a given bounding box. /// \param aabb bounding box to use for the intersection check. /// \return true if the given AABB intersects with the AABB of all contained items. bool hasIntersections(const SurgSim::Math::Aabbd& aabb) const; /// Check all items bounding boxes against the one passed as a parameter and append items that overlap /// to the list given as a parameter /// \param aabb the bounding box being queried /// \param [out] result list to be used for intersecting items void getIntersections(const SurgSim::Math::Aabbd& aabb, std::list* result) const; private: /// Recalculate the aabb of this class, in case items where updated void recalculateAabb(); bool isEqual(const TreeData* data) const override; /// AABB containg all items SurgSim::Math::Aabbd m_aabb; /// The items that were added to this list std::list m_data; }; } } #endif opensurgsim-0.7.0/SurgSim/DataStructures/AabbTreeIntersectionVisitor.cpp000066400000000000000000000041761277777236100266120ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/DataStructures/AabbTreeIntersectionVisitor.h" #include "SurgSim/Framework/Assert.h" #include "SurgSim/DataStructures/AabbTreeNode.h" #include "SurgSim/Math/Aabb.h" namespace SurgSim { namespace DataStructures { AabbTreeIntersectionVisitor::AabbTreeIntersectionVisitor() { } AabbTreeIntersectionVisitor::AabbTreeIntersectionVisitor(const SurgSim::Math::Aabbd& aabb) : m_aabb(aabb) { } AabbTreeIntersectionVisitor::~AabbTreeIntersectionVisitor() { } bool AabbTreeIntersectionVisitor::handle(TreeNode* node) { SURGSIM_FAILURE() << "Can only handle AabbTreeNodes, this is of a different type."; return false; } bool AabbTreeIntersectionVisitor::handle(AabbTreeNode* node) { bool result = false; if (node->getNumChildren() == 0) { // On a leaf node, perform the intersections node->getIntersections(m_aabb, &m_intersections); } else { // On non leaf nodes check if we have an intersection with the common aabb result = SurgSim::Math::doAabbIntersect(m_aabb, node->getAabb()); } return result; } void AabbTreeIntersectionVisitor::reset() { m_intersections.clear(); } SurgSim::Math::Aabbd AabbTreeIntersectionVisitor::getAabb() const { return m_aabb; } void AabbTreeIntersectionVisitor::setAabb(const SurgSim::Math::Aabbd& aabb) { m_aabb = aabb; reset(); } const std::list& AabbTreeIntersectionVisitor::getIntersections() const { return m_intersections; } bool AabbTreeIntersectionVisitor::hasIntersections() const { return !m_intersections.empty(); } } } opensurgsim-0.7.0/SurgSim/DataStructures/AabbTreeIntersectionVisitor.h000066400000000000000000000040111277777236100262430ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DATASTRUCTURES_AABBTREEINTERSECTIONVISITOR_H #define SURGSIM_DATASTRUCTURES_AABBTREEINTERSECTIONVISITOR_H #include "SurgSim/DataStructures/TreeVisitor.h" #include "SurgSim/Math/Aabb.h" #include namespace SurgSim { namespace DataStructures { /// Visitor class to collect the items that intersect with a given bounding box class AabbTreeIntersectionVisitor : public TreeVisitor { public: /// Constructor AabbTreeIntersectionVisitor(); /// Constructor /// \param aabb the bounding box to be used. explicit AabbTreeIntersectionVisitor(const SurgSim::Math::Aabbd& aabb); /// Destructor virtual ~AabbTreeIntersectionVisitor(); bool handle(TreeNode* node) override; bool handle(AabbTreeNode* node) override; /// \return true if the visitor has found intersections bool hasIntersections() const; /// Resets the data in the tree void reset(); /// \return the bounding box to be used for the test. SurgSim::Math::Aabbd getAabb() const; /// Sets a new bounding box, will also call reset() /// \param aabb The new bounding box. void setAabb(const SurgSim::Math::Aabbd& aabb); /// \return a reference to the found intersections. const std::list& getIntersections() const; private: /// List of ids found for intersections std::list m_intersections; /// Bounding box used for intersection test SurgSim::Math::Aabbd m_aabb; }; } } #endif opensurgsim-0.7.0/SurgSim/DataStructures/AabbTreeNode.cpp000066400000000000000000000111641277777236100234440ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/DataStructures/AabbTreeNode.h" #include "SurgSim/DataStructures/AabbTreeData.h" #include "SurgSim/Framework/Log.h" namespace SurgSim { namespace DataStructures { AabbTreeNode::AabbTreeNode() { } AabbTreeNode::~AabbTreeNode() { } void AabbTreeNode::splitNode(size_t maxNodeData) { auto leftData = std::static_pointer_cast(getData()); if (leftData->getSize() > maxNodeData) { std::shared_ptr rightData = leftData->takeLargerElements(); std::shared_ptr leftChild; std::shared_ptr rightChild; // Early exit, takeLargerElements() may not be able to split the list, in this // case we abort the splitNode. if (leftData->getSize() == 0 || rightData->getSize() == 0) { auto count = std::max(leftData->getSize(), rightData->getSize()); if (maxNodeData > 0 && count > 3 * maxNodeData) { SURGSIM_LOG_ONCE(Framework::Logger::getLogger("DataStructures/AabbTreeNode"), WARNING) << "The aabb tree build process encountered some items that could not be split anymore " << "this may cause suboptimal behavior when querying the aabb tree."; } return; } if (getNumChildren() != 2) { leftChild = std::make_shared(); addChild(leftChild); rightChild = std::make_shared(); addChild(rightChild); } else { leftChild = std::static_pointer_cast(getChild(0)); rightChild = std::static_pointer_cast(getChild(1)); } // Update the local aabb // The axis won't change after it has been split m_aabb = leftData->getAabb(); m_aabb.extend(rightData->getAabb()); m_aabb.sizes().maxCoeff(&m_axis); setData(nullptr); size_t leftCount = leftData->getSize(); size_t rightCount = rightData->getSize(); leftChild->setData(std::move(leftData)); if (maxNodeData > 0 && leftCount > maxNodeData) { leftChild->splitNode(maxNodeData); } rightChild->setData(std::move(rightData)); if (maxNodeData > 0 && rightCount > maxNodeData) { rightChild->splitNode(maxNodeData); } } } const SurgSim::Math::Aabbd& AabbTreeNode::getAabb() const { auto data = std::static_pointer_cast(getData()); if (data == nullptr) { return m_aabb; } else { return data->getAabb(); } } void AabbTreeNode::addData(const SurgSim::Math::Aabbd& aabb, size_t id, size_t maxNodeData) { if (getNumChildren() > 0) { size_t childIndex = (aabb.center()(m_axis) < m_aabb.center()(m_axis)) ? 0 : 1; auto childNode = std::static_pointer_cast(getChild(childIndex)); childNode->addData(aabb, id, maxNodeData); m_aabb.extend(aabb); } else { auto data = std::static_pointer_cast(getData()); if (data == nullptr) { data = std::make_shared(); setData(data); } data->add(aabb, id); if (maxNodeData > 0 && data->getSize() > maxNodeData) { splitNode(); } } } void AabbTreeNode::setData(const std::list& items, size_t maxNodeData) { SURGSIM_ASSERT(getNumChildren() == 0) << "Can't call setData on a node that already has nodes"; SURGSIM_ASSERT(getData() == nullptr) << "Can't call setData on a node that already has data."; auto data = std::make_shared(items); setData(data); splitNode(maxNodeData); } void AabbTreeNode::setData(std::list&& items, size_t maxNodeData) { SURGSIM_ASSERT(getNumChildren() == 0) << "Can't call setData on a node that already has nodes"; SURGSIM_ASSERT(getData() == nullptr) << "Can't call setData on a node that already has data."; auto data = std::make_shared(std::move(items)); setData(data); splitNode(maxNodeData); } bool AabbTreeNode::doAccept(TreeVisitor* visitor) { return visitor->handle(this); } void AabbTreeNode::getIntersections(const SurgSim::Math::Aabbd& aabb, std::list* result) { auto data = std::static_pointer_cast(getData()); SURGSIM_ASSERT(data != nullptr) << "AabbTreeNode data is nullptr."; data->getIntersections(aabb, result); } } } opensurgsim-0.7.0/SurgSim/DataStructures/AabbTreeNode.h000066400000000000000000000106441277777236100231130ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DATASTRUCTURES_AABBTREENODE_H #define SURGSIM_DATASTRUCTURES_AABBTREENODE_H #include "SurgSim/DataStructures/TreeNode.h" #include "SurgSim/DataStructures/AabbTreeData.h" #include "SurgSim/Math/Aabb.h" namespace SurgSim { namespace DataStructures { /// Node class for the AabbTree, this handles groups of items and subdivision if the number of items gets too big class AabbTreeNode : public TreeNode { public: using TreeNode::setData; /// Constructor AabbTreeNode(); /// Destructor virtual ~AabbTreeNode(); /// Splits the data into two parts, creates two children and puts the split data into the children /// the aabb of this node does not change, the data of this node will be empty after this. /// \param maxNodeData number of maximum items of data in this node, if more, the node will split, /// if 0 the node will not be split until it is no longer possible, the structure will /// approach a binary tree. /// \note Sometimes the current mechanism to split the list of AABBs along the longest axis will fail to actually /// split the list, if the size of the list is greater than 3 * maxNodeData a warning will be generated void splitNode(size_t maxNodeData = 0); /// Get the aabb of this node, it is the union of the aabb of all the items in the data when the node /// has data, or all the union of the aabb trees of all the sub-nodes. /// \return The aabb box of this node. const SurgSim::Math::Aabbd& getAabb() const; /// Add data to this node, if maxNodeData is >0 the node will split if the number of data items exceeds maxNodeData /// \param aabb The aabb for the item to be added. /// \param id The id for the item that is being added, handled by the user of this class. /// \param maxNodeData number of maximum items of data in this node, if more, the node will split, /// if 0 the node will not be split until it is no longer possible, the structure will /// approach a binary tree. void addData(const SurgSim::Math::Aabbd& aabb, size_t id, size_t maxNodeData = 0); /// Set the data on this node, the node needs to be empty and not have any children for this to work. /// Nodes will be split until there are only maxNodeData elements in one node /// \param items list of AabbTreeData::Item elements that should populate the tree /// \param maxNodeData number of maximum items of data in this node, if more, the node will split, /// if 0 the node will not be split until it is no longer possible, the structure will /// approach a binary tree. void setData(const std::list& items, size_t maxNodeData = 0); /// Set the data on this node, rvalue reference version, /// the node needs to be empty and not have any children for this to work. /// Nodes will be split until there are only maxNodeData elements in one node /// \param items list of AabbTreeData::Item elements that should populate the tree /// \param maxNodeData number of maximum items of data in this node, if more, the node will split, /// if 0 the node will not be split until it is no longer possible, the structure will /// approach a binary tree. void setData(std::list&& items, size_t maxNodeData); /// Fetch a list of items that have AABBs intersecting with the given AABB. /// \param aabb The bounding box for the query. /// \param [out] result location to receive the results of the call. void getIntersections(const SurgSim::Math::Aabbd& aabb, std::list* result); protected: bool doAccept(TreeVisitor* visitor) override; private: /// The internal bounding box for this node, it is used when the node does not have any data SurgSim::Math::Aabbd m_aabb; /// Cache for the index of the longest axis on this node size_t m_axis; }; } } #endif opensurgsim-0.7.0/SurgSim/DataStructures/BufferedValue-inl.h000066400000000000000000000030041277777236100241270ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DATASTRUCTURES_BUFFEREDVALUE_INL_H #define SURGSIM_DATASTRUCTURES_BUFFEREDVALUE_INL_H namespace SurgSim { namespace DataStructures { template BufferedValue::BufferedValue() { m_safeValue = std::make_shared(); } template BufferedValue::BufferedValue(const T& value) : m_value(value) { m_safeValue = std::make_shared(m_value); } template BufferedValue::~BufferedValue() { } template void BufferedValue::publish() { auto newSafeValue = std::make_shared(m_value); { UniqueLock lock(m_mutex); std::swap(newSafeValue, m_safeValue); } } template T& BufferedValue::unsafeGet() { return m_value; } template std::shared_ptr BufferedValue::safeGet() const { SharedLock lock(m_mutex); return m_safeValue; } } // DataStructures } // SurgSim #endif opensurgsim-0.7.0/SurgSim/DataStructures/BufferedValue.h000066400000000000000000000040711277777236100233540ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DATASTRUCTURES_BUFFEREDVALUE_H #define SURGSIM_DATASTRUCTURES_BUFFEREDVALUE_H #include #include #include #include "SurgSim/Framework/Assert.h" namespace SurgSim { namespace DataStructures { /// BufferedValue is a class to enable a representation of two values for one variable, where both values need to be /// accessible at the same time, one in a thread safe, single threaded context, the other in a thread unsafe context. /// \tparam T Type that is used for the value. template class BufferedValue { public: // Default Constructor BufferedValue(); // Constructor /// \param value Default value. explicit BufferedValue(const T& value); /// Destructor ~BufferedValue(); /// Make the current value the one returned by calls to safeGet. void publish(); /// Get the value /// \return A reference to the value. T& unsafeGet(); /// Get the buffered value /// \return The value at the last call to publish. std::shared_ptr safeGet() const; private: typedef boost::shared_lock SharedLock; typedef boost::unique_lock UniqueLock; /// The raw value T m_value; /// The buffered value std::shared_ptr m_safeValue; /// The mutex used to lock for reading and writing mutable boost::shared_mutex m_mutex; }; } // DataStructures } // SurgSim #include "SurgSim/DataStructures/BufferedValue-inl.h" #endif opensurgsim-0.7.0/SurgSim/DataStructures/CMakeLists.txt000066400000000000000000000050021277777236100232170ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2012-2016, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. set(SURGSIM_DATA_STRUCTURES_SOURCES AabbTree.cpp AabbTreeData.cpp AabbTreeIntersectionVisitor.cpp AabbTreeNode.cpp DataGroup.cpp DataGroupBuilder.cpp DataGroupCopier.cpp IndexDirectory.cpp IndexedLocalCoordinate.cpp OctreeNode.cpp OctreeNodePlyReaderDelegate.cpp ply.c PlyReader.cpp SegmentMesh.cpp Tree.cpp TreeData.cpp TreeNode.cpp TriangleMesh.cpp ) set(SURGSIM_DATA_STRUCTURES_HEADERS AabbTree.h AabbTreeData.h AabbTreeIntersectionVisitor.h AabbTreeNode.h BufferedValue.h BufferedValue-inl.h DataGroup.h DataGroupBuilder.h DataGroupCopier.h DataStructuresConvert.h DataStructuresConvert-inl.h EmptyData.h Grid.h Grid-inl.h Groups.h Groups-inl.h Image.h Image-inl.h ImageBase.h ImageBase-inl.h ImageMap.h ImageMap-inl.h IndexDirectory.h IndexedLocalCoordinate.h Location.h MeshElement.h NamedData.h NamedData-inl.h NamedDataBuilder.h NamedVariantData.h NamedVariantData-inl.h NormalData.h OctreeNode.h OctreeNode-inl.h OctreeNodePlyReaderDelegate.h OctreeNodePlyReaderDelegate-inl.h OptionalValue.h ply.h PlyReader.h PlyReaderDelegate.h SegmentEmptyData.h SegmentMesh.h SegmentMesh-inl.h TetrahedronMesh.h TetrahedronMesh-inl.h Tree.h TreeData.h TreeNode.h TreeVisitor.h TriangleMesh.h TriangleMesh-inl.h TriangleMeshPlyReaderDelegate.h TriangleMeshPlyReaderDelegate-inl.h Vertex.h Vertices.h Vertices-inl.h ) surgsim_create_library_header(DataStructures.h "${SURGSIM_DATA_STRUCTURES_HEADERS}") surgsim_add_library( SurgSimDataStructures "${SURGSIM_DATA_STRUCTURES_SOURCES}" "${SURGSIM_DATA_STRUCTURES_HEADERS}" ) set(LIBS SurgSimFramework ${Boost_LIBRARIES} ) target_link_libraries(SurgSimDataStructures ${LIBS} ) if(BUILD_TESTING) add_subdirectory(UnitTests) if(BUILD_PERFORMANCE_TESTING) add_subdirectory(PerformanceTests) endif() endif() set_target_properties(SurgSimDataStructures PROPERTIES FOLDER "DataStructures") opensurgsim-0.7.0/SurgSim/DataStructures/DataGroup.cpp000066400000000000000000000100211277777236100230460ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/DataStructures/DataGroup.h" namespace SurgSim { namespace DataStructures { DataGroup::DataGroup() { } DataGroup::DataGroup(const DataGroup& dataGroup) : m_poses(dataGroup.m_poses), m_vectors(dataGroup.m_vectors), m_matrices(dataGroup.m_matrices), m_scalars(dataGroup.m_scalars), m_integers(dataGroup.m_integers), m_booleans(dataGroup.m_booleans), m_strings(dataGroup.m_strings), m_images(dataGroup.m_images), m_customData(dataGroup.m_customData) { } DataGroup& DataGroup::operator=(const DataGroup& dataGroup) { m_poses = dataGroup.m_poses; m_vectors = dataGroup.m_vectors; m_matrices = dataGroup.m_matrices; m_scalars = dataGroup.m_scalars; m_integers = dataGroup.m_integers; m_booleans = dataGroup.m_booleans; m_strings = dataGroup.m_strings; m_images = dataGroup.m_images; m_customData = dataGroup.m_customData; return *this; } DataGroup& DataGroup::operator=(DataGroup&& dataGroup) { m_poses = std::move(dataGroup.m_poses); m_vectors = std::move(dataGroup.m_vectors); m_matrices = std::move(dataGroup.m_matrices); m_scalars = std::move(dataGroup.m_scalars); m_integers = std::move(dataGroup.m_integers); m_booleans = std::move(dataGroup.m_booleans); m_strings = std::move(dataGroup.m_strings); m_images = std::move(dataGroup.m_images); m_customData = std::move(dataGroup.m_customData); return *this; } NamedData& DataGroup::poses() { return m_poses; } const NamedData& DataGroup::poses() const { return m_poses; } NamedData& DataGroup::vectors() { return m_vectors; } const NamedData& DataGroup::vectors() const { return m_vectors; } NamedData& DataGroup::matrices() { return m_matrices; } const NamedData& DataGroup::matrices() const { return m_matrices; } NamedData& DataGroup::scalars() { return m_scalars; } const NamedData& DataGroup::scalars() const { return m_scalars; } NamedData& DataGroup::integers() { return m_integers; } const NamedData& DataGroup::integers() const { return m_integers; } NamedData& DataGroup::booleans() { return m_booleans; } const NamedData& DataGroup::booleans() const { return m_booleans; } NamedData& DataGroup::strings() { return m_strings; } const NamedData& DataGroup::strings() const { return m_strings; } NamedData& DataGroup::images() { return m_images; } const NamedData& DataGroup::images() const { return m_images; } NamedVariantData& DataGroup::customData() { return m_customData; } const NamedVariantData& DataGroup::customData() const { return m_customData; } void DataGroup::resetAll() { m_poses.resetAll(); m_vectors.resetAll(); m_matrices.resetAll(); m_scalars.resetAll(); m_integers.resetAll(); m_booleans.resetAll(); m_strings.resetAll(); m_images.resetAll(); m_customData.resetAll(); } bool DataGroup::isEmpty() const { return !(m_poses.isValid() || m_vectors.isValid() || m_matrices.isValid() || m_scalars.isValid() || m_integers.isValid() || m_booleans.isValid() || m_strings.isValid() || m_images.isValid() || m_customData.isValid()); } }; // namespace DataStructures }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/DataStructures/DataGroup.h000066400000000000000000000221401277777236100225200ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DATASTRUCTURES_DATAGROUP_H #define SURGSIM_DATASTRUCTURES_DATAGROUP_H #include #include "SurgSim/DataStructures/Image.h" #include "SurgSim/DataStructures/NamedData.h" #include "SurgSim/DataStructures/NamedVariantData.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Vector.h" namespace SurgSim { namespace DataStructures { /// A collection of \ref NamedData objects. /// /// A DataGroup object contains a NamedData for each of several predefined types: /// \li \em Booleans contain a Boolean logic value (true or false). /// \li \em Images contain float images. /// \li \em Integers contain an integer value. /// \li \em Poses contain the position and orientation of an object in space, represented as a 3D rigid-body /// (isometric) transformation. /// \li \em Matrices contain a matrix. /// \li \em Scalars contain a scalar value (i.e. anything that can be represented as a double). /// \li \em Strings contain a text value. /// \li \em Vectors contain a vector quantity that does not change when the coordinate system is translated, /// such as a force or an oriented distance. /// \li \em CustomData contain a custom data structure, \ref NamedVariantData. /// /// The entries (names and indices) are unique within each NamedData member, but not necessarily across different types /// (i.e. there could be a scalar and a vector both named "friction", or a pose and a boolean both at index 1). /// It is recommended that you keep names separate between different types to avoid confusion. /// /// A DataGroup object constructed by the default constructor starts out empty, meaning all its NamedData member /// objects are "invalid". An empty DataGroup object can be made non-empty by: /// \li using the \ref DataGroupBuilder class, /// \li copy construction, /// \li assigning from a non-empty DataGroup object, or /// \li assigning a "valid" NamedData object (of the correct template type) to one or more NamedData members. /// /// Assignment to a non-empty DataGroup object is only possible if either of the two objects in the assignment was made /// non-empty based on the other object (see the above list items about copy construction and assignment from a /// non-empty DataGroup object). /// /// Once a DataGroup is non-empty, the "entries" (i.e., the strings and indices that are used to access the data) /// cannot be changed, added to, removed from, or made empty. These properties ensure that a stable data layout is /// available to the code using this class. For example, the calling code can cache the entries' indices and from then /// on use the faster index-based lookup instead of the slower string-based lookup. /// /// \sa SurgSim::DataStructures::NamedData, SurgSim::DataStructers::DataGroupBuilder class DataGroup { public: /// The type used for poses. typedef SurgSim::Math::RigidTransform3d PoseType; /// The type used for vectors. typedef SurgSim::Math::Vector3d VectorType; /// The type used for matrices. typedef Eigen::Matrix DynamicMatrixType; /// The type used for scalars. typedef double ScalarType; /// The type used for integers. typedef int IntegerType; /// The type used for booleans. typedef bool BooleanType; /// The type used for strings. typedef std::string StringType; /// The type used for images. typedef Image ImageType; /// Construct an empty object, with no associated names and indices yet. DataGroup(); /// Construct an object as a copy of the data from another object. /// \param dataGroup The object to copy from. DataGroup(const DataGroup& dataGroup); /// Copy the data from another object. /// /// The object being assigned into must either be empty (not yet associated with a set of names and indices), or /// the two objects must share the same data layout, resulting from earlier copy construction or assignment. /// ~~~~~ /// DataGroup initial; /// // ...initialize "initial" to some non-empty value... /// DataGroup copyConstructed(initial); // Layout is shared with initial /// copyConstructed = initial // OK, using the same layout /// DataGroup another; // Object is empty (no layout) /// another = initial; // OK, layout is now shared with initial /// another = initial // OK, using the same layout /// ~~~~~ /// /// Note that the data layout must be the same, i.e. related to one another by object assignment or copy /// construction. Objects that merely contain entries with the same names and indices are not acceptable! /// (Otherwise, we'd need to inefficiently compare layout contents each time we assign.) /// ~~~~~ /// DataGroupBuilder builder; /// // ...initialize the entries in the builder... /// NamedData first = builder.createData(); // Layout of entries created from builder /// NamedData second = builder.createData(); // Another layout of entries created; names and indices match /// second = first; // ERROR at run-time, layouts were created separately! /// ~~~~~ /// /// \param dataGroup The object to copy from. /// \return The object that was assigned into. DataGroup& operator=(const DataGroup& dataGroup); /// Move the data from another object. /// /// The same restrictions on object compatibility apply as in the case of the copy assignment /// operator=(const DataGroup&). /// /// \param [in,out] dataGroup The object to copy from, which will be left in an unusable state. /// \return The object that was assigned into. DataGroup& operator=(DataGroup&& dataGroup); /// Return the pose data structure. /// \return the mutable pose data. NamedData& poses(); /// Return the pose data structure. /// \return the read-only pose data. const NamedData& poses() const; /// Return the vector data structure. /// \return the mutable vector data. NamedData& vectors(); /// Return the vector data structure. /// \return the read-only vector data. const NamedData& vectors() const; /// Return the matrix data structure. /// \return the mutable matrix data. NamedData& matrices(); /// Return the matrix data structure. /// \return the read-only matrix data. const NamedData& matrices() const; /// Return the scalar data structure. /// \return the mutable scalar data. NamedData& scalars(); /// Return the scalar data structure. /// \return the read-only scalar data. const NamedData& scalars() const; /// Return the integer data structure. /// \return the mutable integer data. NamedData& integers(); /// Return the integer data structure. /// \return the read-only integer data. const NamedData& integers() const; /// Return the boolean data structure. /// \return the mutable Boolean data. NamedData& booleans(); /// Return the boolean data structure. /// \return the read-only Boolean data. const NamedData& booleans() const; /// Return the string data structure. /// \return the mutable string data. NamedData& strings(); /// Return the string data structure. /// \return the read-only string data. const NamedData& strings() const; /// Return the image data structure. /// \return the mutable iamge data. NamedData& images(); /// Return the image data structure. /// \return the read-only images data. const NamedData& images() const; /// Return the custom data structure. /// \return the mutable data. NamedVariantData& customData(); /// Return the custom data structure. /// \return the read-only data. const NamedVariantData& customData() const; /// Mark all data as not current. void resetAll(); /// An empty DataGroup can be assigned to by any DataGroup with only valid NamedData. /// return true if all the NamedData are invalid. bool isEmpty() const; private: /// The pose values. NamedData m_poses; /// The vector values. NamedData m_vectors; /// The matrix values. NamedData m_matrices; /// The scalar values. NamedData m_scalars; /// The integer values. NamedData m_integers; /// The boolean values. NamedData m_booleans; /// The string values. NamedData m_strings; /// The string values. NamedData m_images; /// The custom data values. NamedVariantData m_customData; }; }; // namespace DataStructures }; // namespace SurgSim #endif // SURGSIM_DATASTRUCTURES_DATAGROUP_H opensurgsim-0.7.0/SurgSim/DataStructures/DataGroupBuilder.cpp000066400000000000000000000117521277777236100243710ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/DataStructures/DataGroupBuilder.h" namespace SurgSim { namespace DataStructures { DataGroupBuilder::DataGroupBuilder() { } DataGroup DataGroupBuilder::createData() const { DataGroup data; data.poses() = poses().createData(); data.vectors() = vectors().createData(); data.matrices() = matrices().createData(); data.scalars() = scalars().createData(); data.integers() = integers().createData(); data.booleans() = booleans().createData(); data.strings() = strings().createData(); data.images() = images().createData(); data.customData() = customData().createData(); return data; } std::shared_ptr DataGroupBuilder::createSharedData() const { return std::make_shared(createData()); } NamedDataBuilder& DataGroupBuilder::poses() { return m_poses; } const NamedDataBuilder& DataGroupBuilder::poses() const { return m_poses; } NamedDataBuilder& DataGroupBuilder::vectors() { return m_vectors; } const NamedDataBuilder& DataGroupBuilder::vectors() const { return m_vectors; } NamedDataBuilder& DataGroupBuilder::matrices() { return m_matrices; } const NamedDataBuilder& DataGroupBuilder::matrices() const { return m_matrices; } NamedDataBuilder& DataGroupBuilder::scalars() { return m_scalars; } const NamedDataBuilder& DataGroupBuilder::scalars() const { return m_scalars; } NamedDataBuilder& DataGroupBuilder::integers() { return m_integers; } const NamedDataBuilder& DataGroupBuilder::integers() const { return m_integers; } NamedDataBuilder& DataGroupBuilder::booleans() { return m_booleans; } const NamedDataBuilder& DataGroupBuilder::booleans() const { return m_booleans; } NamedDataBuilder& DataGroupBuilder::strings() { return m_strings; } const NamedDataBuilder& DataGroupBuilder::strings() const { return m_strings; } NamedDataBuilder& DataGroupBuilder::images() { return m_images; } const NamedDataBuilder& DataGroupBuilder::images() const { return m_images; } NamedVariantDataBuilder& DataGroupBuilder::customData() { return m_customData; } const NamedVariantDataBuilder& DataGroupBuilder::customData() const { return m_customData; } void DataGroupBuilder::addPose(const std::string& name) { poses().addEntry(name); } void DataGroupBuilder::addVector(const std::string& name) { vectors().addEntry(name); } void DataGroupBuilder::addMatrix(const std::string& name) { matrices().addEntry(name); } void DataGroupBuilder::addScalar(const std::string& name) { scalars().addEntry(name); } void DataGroupBuilder::addInteger(const std::string& name) { integers().addEntry(name); } void DataGroupBuilder::addBoolean(const std::string& name) { booleans().addEntry(name); } void DataGroupBuilder::addString(const std::string& name) { strings().addEntry(name); } void DataGroupBuilder::addImage(const std::string& name) { images().addEntry(name); } void DataGroupBuilder::addCustom(const std::string& name) { customData().addEntry(name); } void DataGroupBuilder::addEntriesFrom(const DataGroupBuilder& builder) { poses().addEntriesFrom(builder.poses()); vectors().addEntriesFrom(builder.vectors()); matrices().addEntriesFrom(builder.matrices()); scalars().addEntriesFrom(builder.scalars()); integers().addEntriesFrom(builder.integers()); booleans().addEntriesFrom(builder.booleans()); strings().addEntriesFrom(builder.strings()); images().addEntriesFrom(builder.images()); customData().addEntriesFrom(builder.customData()); } void DataGroupBuilder::addEntriesFrom(const DataGroup& data) { poses().addEntriesFrom(data.poses()); vectors().addEntriesFrom(data.vectors()); matrices().addEntriesFrom(data.matrices()); scalars().addEntriesFrom(data.scalars()); integers().addEntriesFrom(data.integers()); booleans().addEntriesFrom(data.booleans()); strings().addEntriesFrom(data.strings()); images().addEntriesFrom(data.images()); customData().addEntriesFrom(data.customData()); } }; // namespace Input }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/DataStructures/DataGroupBuilder.h000066400000000000000000000213001277777236100240240ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DATASTRUCTURES_DATAGROUPBUILDER_H #define SURGSIM_DATASTRUCTURES_DATAGROUPBUILDER_H #include "SurgSim/DataStructures/NamedDataBuilder.h" #include "SurgSim/DataStructures/NamedVariantData.h" #include "SurgSim/DataStructures/DataGroup.h" #include namespace SurgSim { namespace DataStructures { /// A class that allows you to build a \ref DataGroup structure. /// /// Since the data layout of a \ref DataGroup object cannot be modified, this class is helpful in initially setting /// up the names and their corresponding indices. You can add entries to the builder using the \ref addPose, /// \ref addVector, \ref addScalar, \ref addInteger, \ref addBoolean, \ref addString, and \ref addEntriesFrom /// calls, or using similar calls on one of the type-specific element groups; and then create the DataGroup /// instance with createData() or createSharedData(). /// /// \sa DataGroup class DataGroupBuilder { public: /// The type used for poses. typedef DataGroup::PoseType PoseType; /// The type used for vectors. typedef DataGroup::VectorType VectorType; /// The type used for matrices. typedef DataGroup::DynamicMatrixType DynamicMatrixType; /// The type used for scalars. typedef DataGroup::ScalarType ScalarType; /// The type used for integers. typedef DataGroup::IntegerType IntegerType; /// The type used for booleans. typedef DataGroup::BooleanType BooleanType; /// The type used for strings. typedef DataGroup::StringType StringType; /// The type used for images. typedef Image ImageType; /// Constructs an empty builder object. DataGroupBuilder(); /// Produces a \ref DataGroup object with an immutable set of names and indices. /// None of the values will contain any current data. /// \return the DataGroup object *by value*. DataGroup createData() const; /// Produce a shared pointer to an empty \ref DataGroup object with an immutable set of names and indices. /// None of the values will contain any current data. /// \return a shared pointer to the DataGroup object. std::shared_ptr createSharedData() const; /// Provides access to the pose value entries. /// \return a writable reference to the sub-object that contains pose value entries. NamedDataBuilder& poses(); /// Provides access to the pose value entries. /// \return a read-only reference to the sub-object that contains pose value entries. const NamedDataBuilder& poses() const; /// Provides access to the vector value entries. /// \return a writable reference to the sub-object that contains vector value entries. NamedDataBuilder& vectors(); /// Provides access to the vector value entries. /// \return a read-only reference to the sub-object that contains vector value entries. const NamedDataBuilder& vectors() const; /// Provides access to the matrix value entries. /// \return a writable reference to the sub-object that contains matrix value entries. NamedDataBuilder& matrices(); /// Provides access to the matrix value entries. /// \return a read-only reference to the sub-object that contains matrix value entries. const NamedDataBuilder& matrices() const; /// Provides access to the scalar value entries. /// \return a writable reference to the sub-object that contains scalar value entries. NamedDataBuilder& scalars(); /// Provides access to the scalar value entries. /// \return a read-only reference to the sub-object that contains scalar value entries. const NamedDataBuilder& scalars() const; /// Provides access to the integer value entries. /// \return a writable reference to the sub-object that contains integer value entries. NamedDataBuilder& integers(); /// Provides access to the integer value entries. /// \return a read-only reference to the sub-object that contains integer value entries. const NamedDataBuilder& integers() const; /// Provides access to the Boolean value entries. /// \return a writable reference to the sub-object that contains Boolean value entries. NamedDataBuilder& booleans(); /// Provides access to the Boolean value entries. /// \return a read-only reference to the sub-object that contains Boolean value entries. const NamedDataBuilder& booleans() const; /// Provides access to the string value entries. /// \return a writable reference to the sub-object that contains string value entries. NamedDataBuilder& strings(); /// Provides access to the string value entries. /// \return a read-only reference to the sub-object that contains string value entries. const NamedDataBuilder& strings() const; /// Provides access to the image value entries. /// \return a writable reference to the sub-object that contains image value entries. NamedDataBuilder& images(); /// Provides access to the image value entries. /// \return a read-only reference to the sub-object that contains image value entries. const NamedDataBuilder& images() const; /// Provides access to the custom data entries. /// \return a writable reference to the sub-object that contains custom data entries. NamedVariantDataBuilder& customData(); /// Provides access to the custom data entries. /// \return a read-only reference to the sub-object that contains custom data entries. const NamedVariantDataBuilder& customData() const; /// A shortcut for adding a named pose entry. /// Identical to %poses().addEntry(name). void addPose(const std::string& name); /// A shortcut for adding a named vector entry. /// Identical to %vectors().addEntry(name). void addVector(const std::string& name); /// A shortcut for adding a named matrix entry. /// Identical to %matrices().addEntry(name). void addMatrix(const std::string& name); /// A shortcut for adding a named scalar entry. /// Identical to %scalars().addEntry(name). void addScalar(const std::string& name); /// A shortcut for adding a named integer entry. /// Identical to %integers().addEntry(name). void addInteger(const std::string& name); /// A shortcut for adding a named boolean entry. /// Identical to %booleans().addEntry(name). void addBoolean(const std::string& name); /// A shortcut for adding a named string entry. /// Identical to %strings().addEntry(name). void addString(const std::string& name); /// A shortcut for adding a named image entry. /// Identical to %images().addEntry(name). void addImage(const std::string& name); /// A shortcut for adding a named custom data entry. /// Identical to %customData().addEntry(name). void addCustom(const std::string& name); /// Create new entries from another DataGroupBuilder. /// \param builder The other builder. void addEntriesFrom(const DataGroupBuilder& builder); /// Create new entries from an already initialized DataGroup. /// \param data The data object. void addEntriesFrom(const DataGroup& data); private: // Prevent copy construction and copy assignment. DataGroupBuilder(const DataGroupBuilder&); DataGroupBuilder& operator=(const DataGroupBuilder&); /// The subsidiary builder used for pose values. NamedDataBuilder m_poses; /// The subsidiary builder used for vector values. NamedDataBuilder m_vectors; /// The subsidiary builder used for matrix values. NamedDataBuilder m_matrices; /// The subsidiary builder used for scalar values. NamedDataBuilder m_scalars; /// The subsidiary builder used for integer values. NamedDataBuilder m_integers; /// The subsidiary builder used for boolean values. NamedDataBuilder m_booleans; /// The subsidiary builder used for string values. NamedDataBuilder m_strings; /// The subsidiary builder used for image values. NamedDataBuilder m_images; /// The subsidiary builder used for custom data. NamedVariantDataBuilder m_customData; }; }; // namespace Input }; // namespace SurgSim #endif // SURGSIM_DATASTRUCTURES_DATAGROUPBUILDER_H opensurgsim-0.7.0/SurgSim/DataStructures/DataGroupCopier.cpp000066400000000000000000000056561277777236100242320ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/DataStructures/DataGroupCopier.h" #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/DataStructures/IndexDirectory.h" using SurgSim::DataStructures::IndexDirectory; namespace SurgSim { namespace DataStructures { DataGroupCopier::DataGroupCopier(const DataGroup& source, DataGroup* target) { SURGSIM_ASSERT(target != nullptr) << "Target is a nullptr"; m_map[0] = findMap(source.poses().getDirectory(), target->poses().getDirectory()); m_map[1] = findMap(source.vectors().getDirectory(), target->vectors().getDirectory()); m_map[2] = findMap(source.matrices().getDirectory(), target->matrices().getDirectory()); m_map[3] = findMap(source.scalars().getDirectory(), target->scalars().getDirectory()); m_map[4] = findMap(source.integers().getDirectory(), target->integers().getDirectory()); m_map[5] = findMap(source.booleans().getDirectory(), target->booleans().getDirectory()); m_map[6] = findMap(source.strings().getDirectory(), target->strings().getDirectory()); m_map[7] = findMap(source.images().getDirectory(), target->images().getDirectory()); m_map[8] = findMap(source.customData().getDirectory(), target->customData().getDirectory()); } void DataGroupCopier::copy(const DataGroup& source, DataGroup* target) { SURGSIM_ASSERT(target != nullptr) << "Target is a nullptr"; target->poses().copy(source.poses(), m_map[0]); target->vectors().copy(source.vectors(), m_map[1]); target->matrices().copy(source.matrices(), m_map[2]); target->scalars().copy(source.scalars(), m_map[3]); target->integers().copy(source.integers(), m_map[4]); target->booleans().copy(source.booleans(), m_map[5]); target->strings().copy(source.strings(), m_map[6]); target->images().copy(source.images(), m_map[7]); target->customData().copy(source.customData(), m_map[8]); } NamedDataCopyMap DataGroupCopier::findMap(std::shared_ptr source, std::shared_ptr target) const { NamedDataCopyMap map; const std::vector& sourceNames = source->getAllNames(); for (auto it = sourceNames.cbegin(); it != sourceNames.cend(); ++it) { const int targetIndex = target->getIndex(*it); if (targetIndex > -1) { map[source->getIndex(*it)] = targetIndex; } } return map; } }; // namespace DataStructures }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/DataStructures/DataGroupCopier.h000066400000000000000000000045341277777236100236710ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DATASTRUCTURES_DATAGROUPCOPIER_H #define SURGSIM_DATASTRUCTURES_DATAGROUPCOPIER_H #include #include #include #include "SurgSim/DataStructures/NamedData.h" namespace SurgSim { namespace DataStructures { class DataGroup; class IndexDirectory; /// The type used for copying values between two DataGroups that cannot assign to each other. typedef std::array DataGroupCopyMap; /// A class that assists in copying from one DataGroup to another, when assignment is not possible. /// \sa SurgSim::DataStructures::DataGroup class DataGroupCopier { public: /// Construct a copier. /// \param source The source DataGroup. /// \param target The target DataGroup. DataGroupCopier(const DataGroup& source, DataGroup* target); /// Copies the NamedData entries with the same names. Resets entries in the target that are reset in the source. /// The source and target IndexDirectories are assumed to be the same as the source and target /// used in the constructor. /// \param source The source DataGroup. /// \param target The target DataGroup. void copy(const DataGroup& source, DataGroup* target); private: /// Find the entries (by name) from the source to target IndexDirectories, and return the matching entries. /// \param source The source IndexDirectory. /// \param target The target IndexDirectory. /// \return The map from source to target indices. NamedDataCopyMap findMap(std::shared_ptr source, std::shared_ptr target) const; /// The map from source to target. DataGroupCopyMap m_map; }; }; // namespace DataStructures }; // namespace SurgSim #endif // SURGSIM_DATASTRUCTURES_DATAGROUPCOPIER_H opensurgsim-0.7.0/SurgSim/DataStructures/DataStructuresConvert-inl.h000066400000000000000000000117541277777236100257410ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DATASTRUCTURES_DATASTRUCTURESCONVERT_INL_H #define SURGSIM_DATASTRUCTURES_DATASTRUCTURESCONVERT_INL_H #include #include "SurgSim/Framework/Log.h" namespace SurgSim { namespace DataStructures { namespace Convert { const std::string serializeLogger = "Serialization"; const std::string hasValueName = "HasValue"; const std::string valueName = "Value"; }; }; }; template YAML::Node YAML::convert>::encode( const SurgSim::DataStructures::OptionalValue& rhs) { Node node; node[SurgSim::DataStructures::Convert::hasValueName] = rhs.hasValue(); if (rhs.hasValue()) { node[SurgSim::DataStructures::Convert::valueName] = rhs.getValue(); } else { node[SurgSim::DataStructures::Convert::valueName] = "Not set"; } return node; } template bool YAML::convert>::decode( const Node& node, SurgSim::DataStructures::OptionalValue& rhs) //NOLINT { bool result = true; if (node.IsMap()) { if (node[SurgSim::DataStructures::Convert::hasValueName].as()) { try { rhs.setValue(node[SurgSim::DataStructures::Convert::valueName].as()); } catch (YAML::RepresentationException) { result = false; auto logger = SurgSim::Framework::Logger::getLogger(SurgSim::DataStructures::Convert::serializeLogger); SURGSIM_LOG(logger, WARNING) << "Bad conversion"; } } else { rhs.invalidate(); } } else if (node.IsScalar()) { try { rhs.setValue(node.as()); } catch (YAML::RepresentationException) { result = false; auto logger = SurgSim::Framework::Logger::getLogger(SurgSim::DataStructures::Convert::serializeLogger); SURGSIM_LOG(logger, WARNING) << "Bad conversion"; } } return result; } template YAML::Node YAML::convert>::encode(const std::array& rhs) { Node node(NodeType::Sequence); for (auto it = rhs.cbegin(); it != rhs.cend(); ++it) { node.push_back(*it); } return node; } template bool YAML::convert>::decode(const Node& node, std::array& rhs) //NOLINT { if (!node.IsSequence() || node.size() != N) { return false; } bool result = true; auto rhsit = rhs.begin(); for (YAML::const_iterator it = node.begin(); it != node.end(); ++it, ++rhsit) { try { (*rhsit) = it->as(); } catch (YAML::RepresentationException) { result = false; auto logger = SurgSim::Framework::Logger::getLogger(SurgSim::DataStructures::Convert::serializeLogger); SURGSIM_LOG(logger, WARNING) << __FUNCTION__ << ": Bad conversion"; } } return result; } template YAML::Node YAML::convert>::encode(const std::unordered_map& rhs) { Node node(NodeType::Map); for (auto it = std::begin(rhs); it != std::end(rhs); ++it) { node[it->first] = it->second; } return node; } template bool YAML::convert>::decode(const Node& node, std::unordered_map& rhs) //NOLINT { if (!node.IsMap()) { return false; } bool result = true; for (auto it = node.begin(); it != node.end(); ++it) { try { rhs[it->first.as()] = it->second.as(); } catch (YAML::RepresentationException) { result = false; auto logger = SurgSim::Framework::Logger::getLogger(SurgSim::DataStructures::Convert::serializeLogger); SURGSIM_LOG(logger, WARNING) << __FUNCTION__ << ": Bad conversion"; } } return result; } template YAML::Node YAML::convert>::encode(const std::unordered_set& rhs) { Node node(NodeType::Sequence); for (auto it = std::begin(rhs); it != std::end(rhs); ++it) { node.push_back(*it); } return node; } template bool YAML::convert>::decode(const Node& node, std::unordered_set& rhs) //NOLINT { if (!node.IsSequence()) { return false; } bool result = true; for (auto it = node.begin(); it != node.end(); ++it) { try { rhs.insert(it->as()); } catch (YAML::RepresentationException) { result = false; auto logger = SurgSim::Framework::Logger::getLogger(SurgSim::DataStructures::Convert::serializeLogger); SURGSIM_LOG(logger, WARNING) << __FUNCTION__ << ": Bad conversion"; } } return result; } #endif // SURGSIM_DATASTRUCTURES_DATASTRUCTURESCONVERT_INL_H opensurgsim-0.7.0/SurgSim/DataStructures/DataStructuresConvert.h000066400000000000000000000044351277777236100251570ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DATASTRUCTURES_DATASTRUCTURESCONVERT_H #define SURGSIM_DATASTRUCTURES_DATASTRUCTURESCONVERT_H #include #include #include #include #include #include "SurgSim/DataStructures/OptionalValue.h" #include "SurgSim/Framework/Macros.h" namespace YAML { /// YAML::convert specialization for OptionalValue. SURGSIM_DOUBLE_SPECIALIZATION template struct convert> { static Node encode(const SurgSim::DataStructures::OptionalValue& rhs); static bool decode(const Node& node, SurgSim::DataStructures::OptionalValue& rhs); //NOLINT }; /// YAML::convert specialization for std::array. SURGSIM_DOUBLE_SPECIALIZATION template struct convert> { static Node encode(const std::array& rhs); static bool decode(const Node& node, std::array& rhs); //NOLINT }; /// YAML::convert specialization for std::unordered_map. SURGSIM_DOUBLE_SPECIALIZATION template struct convert> { static Node encode(const std::unordered_map& rhs); static bool decode(const Node& node, std::unordered_map& rhs); //NOLINT }; /// YAML::convert specialization for std::unordered_set. SURGSIM_DOUBLE_SPECIALIZATION template struct convert> { static Node encode(const std::unordered_set& rhs); static bool decode(const Node& node, std::unordered_set& rhs); //NOLINT }; } // namespace YAML #include "SurgSim/DataStructures/DataStructuresConvert-inl.h" #endif // SURGSIM_DATASTRUCTURES_DATASTRUCTURESCONVERT_H opensurgsim-0.7.0/SurgSim/DataStructures/EmptyData.h000066400000000000000000000020441277777236100225230ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DATASTRUCTURES_EMPTYDATA_H #define SURGSIM_DATASTRUCTURES_EMPTYDATA_H namespace SurgSim { namespace DataStructures { /// EmptyData class class EmptyData { public: /// Comparison operator /// \param data The data to compare it to. /// \return true for all cases. bool operator==(const EmptyData& data) const { return true; } }; } } #endif //SURGSIM_DATASTRUCTURES_EMPTYDATA_H opensurgsim-0.7.0/SurgSim/DataStructures/Grid-inl.h000066400000000000000000000204661277777236100223100ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DATASTRUCTURES_GRID_INL_H #define SURGSIM_DATASTRUCTURES_GRID_INL_H #include namespace SurgSim { namespace DataStructures { namespace { /// Class handling number in a given base with a given number of digits /// Example numbers in base 3 with 3 digits are defined in order: /// 000, 001, 002, 010, 011, 012, 020, 021, 022, /// 100, 101, 102, 110, 111, 112, 120, 121, 122 /// 200, 201, 202, 210, 211, 212, 220, 221, 222 /// Note that the storage is done in Eigen column-major vector (ith entry corresponds to the ith degree of the base) /// Expected usage looking for all neighbors in a 3d array: /// Number neighborOffset; /// Eigen::Matrix currentElement = ...; // Location of an element in a 3d grid; /// do{ /// Eigen::Matrix neighborElement = currentElement + neighborOffset; /// // do something with the neighbor element /// ...} while (neighborOffset.next()); /// \tparam T The type storing the number (must be an integral type) /// \tparam B The base in which the number is expressed (must be within [2..9]) /// \tparam N The number of digits for this number template class Number : public Eigen::Matrix { public: static_assert(B > 1 && B < 10, "B (the base) needs to be within [2..9]"); /// Constructor Number() { this->setZero(); } /// \return the number expressed in base 10 size_t toDecimal() const { size_t value = 0; size_t BexponentDigit = 1; for (size_t digit = 0; digit < N; ++digit) { value += (*this)[digit] * BexponentDigit; BexponentDigit *= B; } return value; } /// Increment the number /// \return False if there is no next number on N digits, True otherwise. bool next() { size_t digit = 0; do { (*this)[digit]++; if ((*this)[digit] == B) { (*this)[digit] = 0; } else { return true; } digit++; } while (digit < N); return false; } }; }; // namespace template size_t Grid::NDIdHash::operator()(const NDId& nd) const { return boost::hash_range(nd.data(), nd.data() + N); } template Grid::Grid(const Eigen::Matrix& cellSize, const Eigen::AlignedBox& bounds) : m_size(cellSize), m_aabb(bounds), m_neighborsDirtyFlag(false) { static_assert(N >= 1, "A grid must have a positive non null dimension"); } template Grid::~Grid() { } template void Grid::reset() { // Clear the mapping element -> cellId m_cellIds.clear(); // Clear the active cells m_activeCells.clear(); // Nothing in the grid (no elements, no neighbors)...so it is up to date m_neighborsDirtyFlag = false; } template template void Grid::addElement(const T element, const Eigen::MatrixBase& position) { // Only add element that are located in the grid if (!m_aabb.contains(position)) { return; } // Find the dimension-N cell id from the location // Example in 3D: cell (i, j, k) has 3D min/max coordinates // min[axis] = (size[axis] * (-numCellPerDim[axis] / 2 + i) // max[axis] = (size[axis] * (-numCellPerDim[axis] / 2 + i + 1) NDId cellId = ((position - m_aabb.min()).cwiseQuotient(m_size)).template cast(); // Register the element into its corresponding cell if it exists, or creates it. m_activeCells[cellId].elements.push_back(element); // Add this element in the map [element -> cellID] m_cellIds[element] = cellId; /// Flag that the neighbors list will need to be recomputed on the next access m_neighborsDirtyFlag = true; } template void Grid::update() { std::array::value> cellsIds; // Start by clearing up all the neighbor's list for (typename std::unordered_map::CellContent, NDIdHash>::reference cell : m_activeCells) { cell.second.neighbors.clear(); } // Compute each cell's neighbors list for (typename std::unordered_map::CellContent, NDIdHash>::reference cell : m_activeCells) { getNeighborsCellIds(cell.first, &cellsIds); for (size_t index = 0; index < powerOf3::value; ++index) { // Use symmetry between pair of cells to only treat neighbors with a larger or equal id. if (isNdGreaterOrEqual(cellsIds[index], cell.first)) { auto neighborCell = m_activeCells.find(cellsIds[index]); if (neighborCell != m_activeCells.end()) { cell.second.neighbors.insert(cell.second.neighbors.end(), neighborCell->second.elements.cbegin(), neighborCell->second.elements.cend()); // Treat symmetry if the cells are different if (cellsIds[index] != cell.first) { neighborCell->second.neighbors.insert(neighborCell->second.neighbors.end(), cell.second.elements.cbegin(), cell.second.elements.cend()); } } } } } m_neighborsDirtyFlag = false; } template const std::vector& Grid::getNeighbors(const T& element) { static std::vector empty; if (m_neighborsDirtyFlag) { update(); } auto const foundCell = m_cellIds.find(element); if (foundCell != m_cellIds.cend()) { return m_activeCells[foundCell->second].neighbors; } return empty; } template template const std::vector& Grid::getNeighbors(const Eigen::MatrixBase& position) { static const std::vector empty; // If outside the bounding box, can't find any neighbors if (m_aabb.contains(position)) { if (m_neighborsDirtyFlag) { update(); } NDId cellId = ((position - m_aabb.min()).cwiseQuotient(m_size)).template cast(); auto foundCell = m_activeCells.find(cellId); if (foundCell == m_activeCells.end()) { // If the cell doesn't exist, collect all the neighbors std::array::value> cellsIds; getNeighborsCellIds(cellId, &cellsIds); std::vector neighbors; for (const auto& neighborId : cellsIds) { auto neighborCell = m_activeCells.find(neighborId); if (neighborCell != m_activeCells.end()) { neighbors.insert(neighbors.end(), neighborCell->second.elements.cbegin(), neighborCell->second.elements.cend()); } } m_activeCells[cellId].neighbors = std::move(neighbors); } return m_activeCells[cellId].neighbors; } return empty; } template void Grid::getNeighborsCellIds(NDId cellId, std::array::value>* cellsIds) { // Now build up all the 3^N neighbors cell around this n-d cell // It corresponds to all possible permutation in dimension-N of the indices // {(cellIdnD[0] - 1, cellIdnD[0], cellIdnD[0] + 1) x ... x // (cellIdnD[N - 1] - 1, cellIdnD[N - 1], cellIdnD[N - 1] + 1)} // It is (cellIdnD[0] - 1, ... , cellIdnD[N - 1] - 1) + all possible number in base 3 with N digit // For example in 2D, the NumberInBase3<2> are in order: 00 01 02 10 11 12 20 21 22 // For example in 3D, the NumberInBase3<3> are in order: // 000 001 002 010 011 012 020 021 022 // 100 101 102 110 111 112 120 121 122 // 200 201 202 210 211 212 220 221 222 cellId -= NDId::Ones(); Number currentNumberNDigitBase3; for (size_t i = 0; i < powerOf3::value; ++i) { (*cellsIds)[i] = cellId + currentNumberNDigitBase3; currentNumberNDigitBase3.next(); } } template bool Grid::isNdGreaterOrEqual(const NDId& a, const NDId& b) { for (size_t i = 0; i < N; ++i) { if (a[i] > b[i]) { return true; } if (a[i] < b[i]) { return false; } } return true; } }; // namespace DataStructures }; // namespace SurgSim #endif // SURGSIM_DATASTRUCTURES_GRID_INL_H opensurgsim-0.7.0/SurgSim/DataStructures/Grid.h000066400000000000000000000102141277777236100215160ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DATASTRUCTURES_GRID_H #define SURGSIM_DATASTRUCTURES_GRID_H #include #include #include "SurgSim/Math/Vector.h" namespace SurgSim { namespace DataStructures { /// Templated function to compute a power of 3 at compile time (useful for template parameter) template struct powerOf3 { enum { value = 3 * powerOf3::value }; }; template <> struct powerOf3<0> { enum { value = 1 }; }; /// n-dimensional grid structure with uniform non-cubic cells /// This data structure is useful to search for neighbors in a given range (the size of each cell) /// \tparam T Element type to be stored /// \tparam N The dimension of the grid (i.e. 2 => 2D, 3 => 3D) template class Grid { public: /// Constructor /// \param cellSize The size of each cell in dimension N (i.e. cells are not necessarily cubic). /// \param bounds The dimension-N boundaries of the space covered by the grid. Grid(const Eigen::Matrix& cellSize, const Eigen::AlignedBox& bounds); /// Destructor virtual ~Grid(); /// Reset the grid content and the neighbors' mapping void reset(); /// Add an element in the grid /// \param element to be added at this position /// \param position of the element in the n-D space /// \note If the position is outside of the grid, the element is simply not added to the grid template void addElement(const T element, const Eigen::MatrixBase& position); /// Retrieve an elements' neighbors /// \param element The element for which the neighbors are requested /// \return The element's neighbors list (including the element itself) const std::vector& getNeighbors(const T& element); /// Retrieve the neighbors of a location /// \param position The position for which the neighbors are requested /// \return The neighbors for this position, i.e. all the elements in the positions cell and all surrounding cells template const std::vector& getNeighbors(const Eigen::MatrixBase& position); protected: /// Data structure for a cell's content (the list of elements and the list of all the neighbors) typedef struct { std::vector elements; std::vector neighbors; } CellContent; /// The type of the n-dimensional cell Id. typedef Eigen::Matrix NDId; /// Enable the NDId to be used as a key in an unordered map. class NDIdHash { public: size_t operator()(const NDId& nd) const; }; /// Active cells (referenced by their ids (spatial hashing)) with their content std::unordered_map m_activeCells; /// Mapping from element to cell id containing the element std::unordered_map m_cellIds; /// Size of each cell (same on all dimension) Eigen::Matrix m_size; /// Grid min and max Eigen::AlignedBox m_aabb; /// Does the neighbors needs to be recomputed ? bool m_neighborsDirtyFlag; private: /// Update the neighbors lists void update(); /// Retrieve the neighboring cells id (including this cell) /// \param cellId for which the neighbors cells are requested /// \param cellsIds [out] Neighbors cells ids void getNeighborsCellIds(NDId cellId, std::array::value>* cellsIds); /// \param a The first cell ID. /// \param b The second cell ID. /// \return true if a is > b. bool isNdGreaterOrEqual(const NDId& a, const NDId& b); }; }; // namespace DataStructures }; // namespace SurgSim #include "SurgSim/DataStructures/Grid-inl.h" #endif // SURGSIM_DATASTRUCTURES_GRID_H opensurgsim-0.7.0/SurgSim/DataStructures/Groups-inl.h000066400000000000000000000072611277777236100227000ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DATASTRUCTURES_GROUPS_INL_H #define SURGSIM_DATASTRUCTURES_GROUPS_INL_H namespace SurgSim { namespace DataStructures { template bool Groups::add(const Key& group, const T& element) { UniqueLock lock(m_mutex); auto result = m_groups[group].insert(element); if (result.second == true) { m_membership[element].insert(group); } return result.second; } template bool Groups::add(const std::vector& groups, const T& element) { bool result = false; for (auto& group : groups) { result = add(group, element) || result; } return result; } template bool Groups::add(const Groups& other) { bool result = false; for (auto& members : other.m_membership) { result = add(std::vector(members.second.begin(), members.second.end()), members.first) || result; } return result; } template bool Groups::remove(const Key& group, const T& element) { bool result = false; UniqueLock lock(m_mutex); auto found = m_groups.find(group); if (found != m_groups.end()) { auto count = found->second.erase(element); if (count > 0) { if (found->second.empty()) { m_groups.erase(group); } m_membership[element].erase(group); if (m_membership[element].empty()) { m_membership.erase(element); } result = true; } } return result; } template std::vector Groups::getMembers(const Key& group) const { std::vector result; SharedLock lock(m_mutex); auto found = m_groups.find(group); if (found != m_groups.end()) { result.assign(found->second.cbegin(), found->second.cend()); } return result; } template std::vector Groups::getGroups(const T& element) const { std::vector result; SharedLock lock(m_mutex); auto found = m_membership.find(element); if (found != m_membership.end()) { result.assign(found->second.cbegin(), found->second.cend()); } return result; } template std::vector Groups::getGroups() const { std::vector result; { SharedLock lock(m_mutex); std::for_each(m_groups.cbegin(), m_groups.cend(), [&result](const std::pair>& value) { result.emplace(result.end(), value.first); }); } return result; } template bool Groups::remove(const T& element) { bool result = false; UniqueLock lock(m_mutex); if (m_membership.find(element) != m_membership.end()) { for (auto& group : m_membership[element]) { m_groups[group].erase(element); } m_membership.erase(element); result = true; } return result; } template std::vector Groups::operator[](const Key& group) const { // Get member does the locking, not needed here return getMembers(group); } template void Groups::clear() { UniqueLock lock(m_mutex); m_groups.clear(); m_membership.clear(); } } } #endifopensurgsim-0.7.0/SurgSim/DataStructures/Groups.h000066400000000000000000000100351277777236100221110ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DATASTRUCTURES_GROUPS_H #define SURGSIM_DATASTRUCTURES_GROUPS_H #include #include #include #include namespace SurgSim { namespace DataStructures { /// Class to wrap grouping operations, gives access to the members of a group and the groups of members. /// Groups is threadsafe with regard to add and remove operations, and observations /// \tparam Key the label to be used for the groups /// \tparam T the type of the group members template class Groups { public: typedef Key IdentifierType; typedef T MemberType; /// Add an element to the given group, if the group doesn't exist it will be created, if the element /// is already a member of the group, nothing happens /// \param group the group to use /// \param element the element to add /// \return true if the element was actually added to the group bool add(const Key& group, const T& element); /// Add a member to the given groups, if any of the groups don't exist they will be created, if the element /// is already a member of a group, it won't be added to that specific group /// \param groups the groups to use /// \param element the element to add /// \return true if the element was added to at least one group bool add(const std::vector& groups, const T& element); /// Add all the members from the other group to this group, essentially forming a union of the two /// \param other object to add groups from /// \return true if at least one new element was added bool add(const Groups& other); /// Remove an element from a given group, if the group does not exist or the element is not a member of that /// group, nothing will happen. /// \param group the group to use /// \param element the element to remove /// \return true if the element was member of that group bool remove(const Key& group, const T& element); /// Remove an element from all known groups, if the element is not a member of any group, nothing happens /// \param element the element to remove /// \return true if there was an actual removal that was executed bool remove(const T& element); /// Return all the members of the given group /// \param group the group to query /// \return members of the given group, empty if the group has no members, or doesn't exist std::vector getMembers(const Key& group) const; /// Return all the groups that the given member is a member of /// \param element the element to query /// \return groups which contain the given element, empty if the element is not member of any group std::vector getGroups(const T& element) const; /// \return all the known groups that have members std::vector getGroups() const; /// Return all the members of the given group /// \param group group to query /// \return members of the given group, empty if the group has no members std::vector operator[](const Key& group) const; /// Erases all entries void clear(); private: typedef boost::shared_lock SharedLock; typedef boost::unique_lock UniqueLock; /// The mutex used to lock for reading and writing mutable boost::shared_mutex m_mutex; /// Map groups to members std::unordered_map> m_groups; /// Map members to groups std::unordered_map> m_membership; }; } } #include "SurgSim/DataStructures/Groups-inl.h" #endif opensurgsim-0.7.0/SurgSim/DataStructures/Image-inl.h000066400000000000000000000064111277777236100224370ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DATASTRUCTURES_IMAGE_INL_H #define SURGSIM_DATASTRUCTURES_IMAGE_INL_H namespace SurgSim { namespace DataStructures { template Image::Image() { ImageBase::setSize(0, 0, 0); } template Image::Image(size_t width, size_t height, size_t channels) : m_data(new T[width * height * channels]) { ImageBase::setSize(width, height, channels); } template Image::Image(size_t width, size_t height, size_t channels, const T* const data) : m_data(new T[width * height * channels]) { ImageBase::setSize(width, height, channels); std::copy(data, data + width * height * channels, m_data.get()); } template template Image::Image(size_t width, size_t height, size_t channels, const D* const data) : m_data(new T[width * height * channels]) { ImageBase::setSize(width, height, channels); Eigen::Map> theirData(data, width * height * channels); Eigen::Map::VectorType, Eigen::Unaligned> myData(m_data.get(), width * height * channels); myData = theirData.template cast(); } template Image::Image(const Image& other) { ImageBase::setSize(other.getWidth(), other.getHeight(), other.getNumChannels()); size_t size = other.getWidth() * other.getHeight() * other.getNumChannels(); m_data = std::unique_ptr(new T[size]); std::copy(other.m_data.get(), other.m_data.get() + size, m_data.get()); } template Image::Image(Image&& other) { // Can use the move assignment operator to construct *this = std::move(other); } template Image& Image::operator=(const Image& other) { if (this != &other) { size_t newDataSize = other.getWidth() * other.getHeight() * other.getNumChannels(); size_t oldDataSize = ImageBase::getWidth() * ImageBase::getHeight() * ImageBase::getNumChannels(); if (newDataSize != oldDataSize) { m_data.reset(new T[newDataSize]); } ImageBase::setSize(other.getWidth(), other.getHeight(), other.getNumChannels()); std::copy(other.m_data.get(), other.m_data.get() + newDataSize, m_data.get()); } return *this; } template Image& Image::operator=(Image&& other) { if (this != &other) { m_data = std::move(other.m_data); ImageBase::setSize(other.getWidth(), other.getHeight(), other.getNumChannels()); other.setSize(0, 0, 0); } return *this; } template Image::~Image() { } template T* const Image::getData() { return m_data.get(); } template const T* const Image::getData() const { return m_data.get(); } }; }; #endif //SURGSIM_DATASTRUCTURES_IMAGE_INL_H opensurgsim-0.7.0/SurgSim/DataStructures/Image.h000066400000000000000000000051361277777236100216620ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DATASTRUCTURES_IMAGE_H #define SURGSIM_DATASTRUCTURES_IMAGE_H #include #include "SurgSim/DataStructures/ImageBase.h" namespace SurgSim { namespace DataStructures { /// A templated Image class /// /// \tparam T the data type of the image data template class Image : public ImageBase { public: /// Default Constructor Image(); /// Constructor /// \param width the image width /// \param height the image height /// \param channels the number of channels in the image Image(size_t width, size_t height, size_t channels); /// Copy constructor from a data pointer /// \param width the image width /// \param height the image height /// \param channels the number of channels in the image /// \param data pointer to the data to copy from Image(size_t width, size_t height, size_t channels, const T* const data); /// Copy constructor from a data pointer of a different type /// \tparam D type of data stored in the pointer /// \param width the image width /// \param height the image height /// \param channels the number of channels in the image /// \param data pointer to the data to copy from template Image(size_t width, size_t height, size_t channels, const D* const data); /// Copy constructor /// \param other Image to copy from Image(const Image& other); /// Move constructor /// \param other Image to move data from Image(Image&& other); /// Destructor virtual ~Image(); /// Assignment Operator /// \param other The Image to copy from /// \return The Image that was assigned into Image& operator=(const Image& other); /// Move Assignment Operator /// \param other The Image to move data from /// \return The Image that was assigned into Image& operator=(Image&& other); T* const getData() override; const T* const getData() const override; private: std::unique_ptr m_data; }; } } #include "SurgSim/DataStructures/Image-inl.h" #endif //SURGSIM_DATASTRUCTURES_IMAGE_H opensurgsim-0.7.0/SurgSim/DataStructures/ImageBase-inl.h000066400000000000000000000107121277777236100232310ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DATASTRUCTURES_IMAGEBASE_INL_H #define SURGSIM_DATASTRUCTURES_IMAGEBASE_INL_H #include "SurgSim/Framework/Assert.h" namespace SurgSim { namespace DataStructures { template ImageBase::~ImageBase() { } template Eigen::Map> ImageBase::operator()(size_t x, size_t y) { SURGSIM_ASSERT(x < m_width) << "x is larger than the image width (" << x << " >= " << m_width << ")"; SURGSIM_ASSERT(y < m_height) << "y is larger than the image height (" << y << " >= " << m_height << ")"; return Eigen::Map> (getData() + m_channels * (x + y * m_width), m_channels); } template Eigen::Map> ImageBase::operator()(size_t x, size_t y) const { SURGSIM_ASSERT(x < m_width) << "x is larger than the image width (" << x << " >= " << m_width << ")"; SURGSIM_ASSERT(y < m_height) << "y is larger than the image height (" << y << " >= " << m_height << ")"; return Eigen::Map> (getData() + m_channels * (x + y * m_width), m_channels); } template Eigen::Map::ChannelType, Eigen::Unaligned, Eigen::Stride<-1, -1>> ImageBase::getChannel(size_t index) { SURGSIM_ASSERT(index < m_channels) << "Channel number is larger than the number of channels"; Eigen::Stride stride(m_width*m_channels, m_channels); return Eigen::Map> (getData() + index, m_width, m_height, stride); } template Eigen::Map::ChannelType, Eigen::Unaligned, Eigen::Stride<-1, -1>> ImageBase::getChannel(size_t index) const { SURGSIM_ASSERT(index < m_channels) << "Channel number is larger than the number of channels"; Eigen::Stride stride(m_width*m_channels, m_channels); return Eigen::Map> (getData() + index, m_width, m_height, stride); } template void ImageBase::setChannel(size_t index, const Eigen::Ref& data) { auto myChannel = getChannel(index); SURGSIM_ASSERT(myChannel.rows() == data.rows() && myChannel.cols() == data.cols()) << "Channel data must be of size " << myChannel.rows() << "x" << myChannel.cols() << ". " << data.rows() << "x" << data.cols() << " data was provided."; myChannel = data; } template Eigen::Map::VectorType, Eigen::Unaligned> ImageBase::getAsVector() { return Eigen::Map(getData(), m_width * m_height * m_channels); } template Eigen::Map::VectorType, Eigen::Unaligned> ImageBase::getAsVector() const { return Eigen::Map(getData(), m_width * m_height * m_channels); } template void ImageBase::setAsVector(const Eigen::Ref& data) { auto myVector = getAsVector(); SURGSIM_ASSERT(myVector.rows() == data.rows() && myVector.cols() == data.cols()) << "Vector must be of size " << myVector.rows() << "x" << myVector.cols() << ". " << "A " << data.rows() << "x" << data.cols() << " vector was provided."; myVector = data; } template size_t ImageBase::getWidth() const { return m_width; } template size_t ImageBase::getHeight() const { return m_height; } template std::array ImageBase::getSize() const { std::array size = {m_width, m_height, m_channels}; return size; } template size_t ImageBase::getNumChannels() const { return m_channels; } template void ImageBase::setSize(size_t width, size_t height, size_t channels) { m_width = width; m_height = height; m_channels = channels; } }; }; #endif //SURGSIM_DATASTRUCTURES_IMAGEBASE_INL_H opensurgsim-0.7.0/SurgSim/DataStructures/ImageBase.h000066400000000000000000000077051277777236100224610ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DATASTRUCTURES_IMAGEBASE_H #define SURGSIM_DATASTRUCTURES_IMAGEBASE_H #include #include namespace SurgSim { namespace DataStructures { /// Base class for Image-like classes /// /// \tparam T the data type of the image data template class ImageBase { public: /// Destructor virtual ~ImageBase(); /// Get the Image width /// \return the width size_t getWidth() const; /// Get the Image height /// \return the height size_t getHeight() const; /// Get the Image size /// \return the image size as (width, height, channels) std::array getSize() const; /// Get the number of channels in this Image /// \return the number of channels size_t getNumChannels() const; /// Get the pixel value at (x, y) /// \param x The horizontal image position /// \param y The vertical image position /// \return mutable pixel value as Eigen::Map of size (channels x 1) Eigen::Map> operator()(size_t x, size_t y); /// Get the pixel value at (x, y), constant version /// \param x The horizontal position in the image /// \param y The vertical position in the image /// \return constant pixel value as Eigen::Map of size (channels x 1) Eigen::Map> operator()(size_t x, size_t y) const; /// 2D Channel Type; typedef Eigen::Matrix ChannelType; /// Get the 2D image channel data /// \param index the channel number /// \return mutable channel data as an Eigen::Map (can be used as an Eigen::Matrix) Eigen::Map> getChannel(size_t index); /// Get the 2D image channel data, constant version /// \param index the channel number /// \return constant channel data as an Eigen::Map (can be used as an Eigen::Matrix) Eigen::Map> getChannel(size_t index) const; /// Set the image data in the channel /// \param index the channel number /// \param data the channel data as a compatible Eigen type void setChannel(size_t index, const Eigen::Ref& data); /// 1D Vector Type; typedef Eigen::Matrix VectorType; /// Get the data as a 1D Vector /// \return mutable 1D data as an Eigen::Map (can be used as an Eigen::Matrix) Eigen::Map getAsVector(); /// Get the data as a 1D Vector, constant version /// \return constant 1D data as an Eigen::Map (can be used as an Eigen::Matrix) Eigen::Map getAsVector() const; /// Set the image data as a 1D Vector /// \param data the data as a compatible Eigen vector type void setAsVector(const Eigen::Ref& data); /// Get the pointer to the data /// \return the data virtual T* const getData() = 0; /// Get the pointer to the data, constant version /// \return the data virtual const T* const getData() const = 0; protected: /// Set the Image size /// \param width the image width /// \param height the image height /// \param channels the number of channels in the image void setSize(size_t width, size_t height, size_t channels); private: size_t m_width; size_t m_height; size_t m_channels; }; }; }; #include "SurgSim/DataStructures/ImageBase-inl.h" #endif //SURGSIM_DATASTRUCTURES_IMAGEBASE_H opensurgsim-0.7.0/SurgSim/DataStructures/ImageMap-inl.h000066400000000000000000000022201277777236100230670ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DATASTRUCTURES_IMAGEMAP_INL_H #define SURGSIM_DATASTRUCTURES_IMAGEMAP_INL_H namespace SurgSim { namespace DataStructures { template ImageMap::ImageMap(size_t width, size_t height, size_t channels, T* data) : m_data(data) { ImageBase::setSize(width, height, channels); } template T* const ImageMap::getData() { return m_data; } template const T* const ImageMap::getData() const { return m_data; } }; }; #endif //SURGSIM_DATASTRUCTURES_IMAGEMAP_INL_H opensurgsim-0.7.0/SurgSim/DataStructures/ImageMap.h000066400000000000000000000027061277777236100223200ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DATASTRUCTURES_IMAGEMAP_H #define SURGSIM_DATASTRUCTURES_IMAGEMAP_H #include "SurgSim/DataStructures/ImageBase.h" namespace SurgSim { namespace DataStructures { /// A class that behaves like an Image but maps an existing array of data /// /// \tparam T the data type of the image data template class ImageMap : public ImageBase { public: /// Constructor /// \param width the image width /// \param height the image height /// \param channels the number of channels in the image /// \param data pointer to the array to map ImageMap(size_t width, size_t height, size_t channels, T* data); T* const getData() override; const T* const getData() const override; private: T* m_data; }; }; }; #include "SurgSim/DataStructures/ImageMap-inl.h" #endif //SURGSIM_DATASTRUCTURES_IMAGEMAP_H opensurgsim-0.7.0/SurgSim/DataStructures/IndexDirectory.cpp000066400000000000000000000031261277777236100241240ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/DataStructures/IndexDirectory.h" namespace SurgSim { namespace DataStructures { IndexDirectory::IndexDirectory() { } IndexDirectory::IndexDirectory(const std::vector& names) { for (auto it = names.cbegin(); it != names.cend(); ++it) { addEntry(*it); } } const std::vector& IndexDirectory::getAllNames() const { return m_names; } IndexDirectory::IndexDirectory(const IndexDirectory& directory) : m_names(directory.m_names), m_indices(directory.m_indices) { } IndexDirectory& IndexDirectory::operator =(const IndexDirectory& directory) { m_names = directory.m_names; m_indices = directory.m_indices; return *this; } int IndexDirectory::addEntry(const std::string& name) { if ((name.length() == 0) || hasEntry(name)) { return -1; } int index = static_cast(m_names.size()); m_names.push_back(name); m_indices[name] = index; return index; } }; // namespace Input }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/DataStructures/IndexDirectory.h000066400000000000000000000077521277777236100236020ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DATASTRUCTURES_INDEXDIRECTORY_H #define SURGSIM_DATASTRUCTURES_INDEXDIRECTORY_H #include #include #include namespace SurgSim { namespace DataStructures { /// A simple bidirectional mapping between names (strings) and distinct consecutive non-negative indices. /// /// Access to this class is thread-safe if all of the threads are only performing const operations, i.e. reading /// the names and indices. class IndexDirectory { public: /// Create an empty directory object. IndexDirectory(); /// Create a directory object initialized to a list of names. /// \param names The names. explicit IndexDirectory(const std::vector& names); /// Given a name, return the corresponding index (or -1). /// \param name The name. /// \return the index for that name if one exists; -1 otherwise. int getIndex(const std::string& name) const { if (name.length() == 0) { return -1; } auto entry = m_indices.find(name); if (entry == m_indices.cend()) { return -1; } else { return entry->second; } } /// Given an index, return the corresponding name (or ""). /// \param index The index. /// \return the name for that index if one exists; an empty string otherwise. std::string getName(int index) const { if ((index < 0) || (index >= static_cast(m_names.size()))) { return ""; } else { return m_names[index]; } } /// Get a list of all the names available from the index directory. /// \return all the names, in index order. const std::vector& getAllNames() const; /// Check whether the specified name exists in the directory. /// /// \param name The name. /// \return true if the entry exists. bool hasEntry(const std::string& name) const { return ((name.length() > 0) && (m_indices.count(name) > 0)); } /// Check the number of existing entries in the directory. /// \return the size of the directory. /// \sa getNumEntries() size_t size() const { return m_names.size(); } /// Check the number of existing entries in the directory. /// \return the size of the directory. /// \sa size() int getNumEntries() const { return static_cast(m_names.size()); } protected: template friend class NamedDataBuilder; friend class DataGroupBuilder; /// Copy constructor. /// Not generally accessible by external code, but is used by friend classes. /// \sa NamedDataBuilder, DataGroupBuilder IndexDirectory(const IndexDirectory& directory); /// Assignment operator. /// Not generally accessible by external code, but is used by friend classes. /// \sa NamedDataBuilder, DataGroupBuilder IndexDirectory& operator =(const IndexDirectory& directory); /// Create a new entry for the specified name. /// Not generally accessible by external code, but is used by friend classes. /// \sa NamedDataBuilder, DataGroupBuilder /// /// \param name The name, which should be non-empty and should not already exist in the directory. /// \return the index of the created entry, or -1 if the entry could not be added. int addEntry(const std::string& name); private: /// The array of entry names, in index order. std::vector m_names; /// A mapping of entry names to indices. std::unordered_map m_indices; }; }; // namespace Input }; // namespace SurgSim #endif // SURGSIM_DATASTRUCTURES_INDEXDIRECTORY_H opensurgsim-0.7.0/SurgSim/DataStructures/IndexedLocalCoordinate.cpp000066400000000000000000000024171277777236100255350ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/DataStructures/IndexedLocalCoordinate.h" namespace SurgSim { namespace DataStructures { IndexedLocalCoordinate::IndexedLocalCoordinate() : index(0) { } IndexedLocalCoordinate::IndexedLocalCoordinate(size_t index, const SurgSim::Math::Vector& coordinate) : index(index), coordinate(coordinate) { } bool IndexedLocalCoordinate::isApprox(const IndexedLocalCoordinate& other, double precision) const { return (index == other.index) && ((coordinate.isZero(precision) && other.coordinate.isZero(precision)) || coordinate.isApprox(other.coordinate, precision)); } } // namespace DataStructures } // namespace SurgSim opensurgsim-0.7.0/SurgSim/DataStructures/IndexedLocalCoordinate.h000066400000000000000000000042011277777236100251730ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DATASTRUCTURES_INDEXEDLOCALCOORDINATE_H #define SURGSIM_DATASTRUCTURES_INDEXEDLOCALCOORDINATE_H #include "SurgSim/Math/Vector.h" namespace SurgSim { namespace DataStructures { /// A generic (size_t index, Vector coordinate) pair. The coordinate is a dynamic size vector. /// E.g. This can be used to represent a barycentric coordinate within a simplex (identified by the index). struct IndexedLocalCoordinate { /// Default constructor with no initialization. IndexedLocalCoordinate(); /// Constructor with initialization. /// \param index Numeric index. /// \param coordinate Coordinates with respect to the entity identified by the index. /// \note Constructor does not throw when given malformed parameters. IndexedLocalCoordinate(size_t index, const SurgSim::Math::Vector& coordinate); /// Numeric index to indicate the entity w.r.t which the barycentricCoordinate is defined. size_t index; /// Coordinates with respect to the entity identified by the index. SurgSim::Math::Vector coordinate; /// Comparison method 'isApprox' /// \param other The other IndexedLocalCoordinate to compare it to /// \param precision The precision with which to compare /// \return True if the two IndexedLocalCoordinate are equal within precision, False otherwise bool isApprox(const IndexedLocalCoordinate& other, double precision = std::numeric_limits::epsilon()) const; }; } // namespace DataStructures } // namespace SurgSim #endif // SURGSIM_DATASTRUCTURES_INDEXEDLOCALCOORDINATE_H opensurgsim-0.7.0/SurgSim/DataStructures/Location.h000066400000000000000000000157041277777236100224120ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DATASTRUCTURES_LOCATION_H #define SURGSIM_DATASTRUCTURES_LOCATION_H #include #include "SurgSim/DataStructures/OptionalValue.h" #include "SurgSim/DataStructures/IndexedLocalCoordinate.h" #include "SurgSim/DataStructures/OctreeNode.h" #include "SurgSim/Math/Vector.h" namespace SurgSim { namespace DataStructures { /// A Location defines a local position w.r.t. any shape. Depending on the type of shape, /// different data is needed to specify a location on it. This structure supports: /// - Any rigid shape (location identified by a local position) /// - Octree (location identified by an octree path) /// - Index (location indentified by an index) /// - A triangle mesh (location identified by the triangle id, and the barycentric coordinate of a point in it) /// - A node in a mesh (location identified by the node id) /// - An element in a mesh (location identified by the element id, and the barycentric coordinate of a point in it) struct Location { public: enum Type {TRIANGLE, ELEMENT}; /// Default constructor Location() { } /// Copy constructor /// \param other The location to be copied while constructing. Location(const Location& other) : rigidLocalPosition(other.rigidLocalPosition), octreeNodePath(other.octreeNodePath), index(other.index), triangleMeshLocalCoordinate(other.triangleMeshLocalCoordinate), elementMeshLocalCoordinate(other.elementMeshLocalCoordinate) {} /// Constructor for rigid local position /// \param localPosition The 3D local position to set this location to explicit Location(const SurgSim::Math::Vector3d& localPosition) { rigidLocalPosition.setValue(localPosition); } /// Constructor for octree node path /// \param nodePath The octree node path to set this location to explicit Location(const SurgSim::DataStructures::OctreePath& nodePath) { octreeNodePath.setValue(nodePath); } /// Constructor for an index /// \param val The index to set this location to explicit Location(const size_t val) { index.setValue(val); } /// Constructor for mesh-based location /// \param localCoordinate index-based local coordinate /// \param meshType the type of location (a node, a triangle or an element) Location(const SurgSim::DataStructures::IndexedLocalCoordinate& localCoordinate, Type meshType) { switch (meshType) { case TRIANGLE: triangleMeshLocalCoordinate.setValue(localCoordinate); break; case ELEMENT: elementMeshLocalCoordinate.setValue(localCoordinate); break; default: SURGSIM_FAILURE() << "Unknown location"; break; } } /// Gives access to the coordinates via enum rather than '.' public member access, this can reduce complexity /// in the calling code /// \param meshType (TRIANGLE or ELEMENT) /// \return the appropriate coordinate for the type of mesh const SurgSim::DataStructures::OptionalValue& get(Type meshType) { static SurgSim::DataStructures::OptionalValue null; switch (meshType) { case TRIANGLE: return triangleMeshLocalCoordinate; break; case ELEMENT: return elementMeshLocalCoordinate; break; default: SURGSIM_FAILURE() << "Unknown location"; break; } return null; } bool isApprox(const Location& other, double precision = std::numeric_limits::epsilon()) const { bool result = false; if (rigidLocalPosition.hasValue() && other.rigidLocalPosition.hasValue()) { auto const& vector1 = rigidLocalPosition.getValue(); auto const& vector2 = other.rigidLocalPosition.getValue(); result = (vector1.isZero(precision) && vector2.isZero(precision)) || vector1.isApprox(vector2, precision); } else if (octreeNodePath.hasValue() && other.octreeNodePath.hasValue()) { result = (octreeNodePath.getValue() == other.octreeNodePath.getValue()); } else if (index.hasValue() && other.index.hasValue()) { result = (index.getValue() == other.index.getValue()); } else if (triangleMeshLocalCoordinate.hasValue() && other.triangleMeshLocalCoordinate.hasValue()) { result = triangleMeshLocalCoordinate.getValue().isApprox(other.triangleMeshLocalCoordinate.getValue()); } else if (elementMeshLocalCoordinate.hasValue() && other.elementMeshLocalCoordinate.hasValue()) { result = elementMeshLocalCoordinate.getValue().isApprox(other.elementMeshLocalCoordinate.getValue()); } else { SURGSIM_FAILURE() << "Invalid location type"; } return result; } SurgSim::DataStructures::OptionalValue rigidLocalPosition; SurgSim::DataStructures::OptionalValue octreeNodePath; SurgSim::DataStructures::OptionalValue index; SurgSim::DataStructures::OptionalValue triangleMeshLocalCoordinate; SurgSim::DataStructures::OptionalValue elementMeshLocalCoordinate; }; template std::basic_ostream& operator << (std::basic_ostream& out, const SurgSim::DataStructures::OptionalValue& val) { if (val.hasValue()) { out << val.getValue(); } else { out << ""; } return out; } template std::basic_ostream& operator << (std::basic_ostream& out, const SurgSim::DataStructures::OptionalValue& val) { if (val.hasValue()) { out << val.getValue().transpose(); } else { out << ""; } return out; } template std::basic_ostream& operator << (std::basic_ostream& out, const SurgSim::DataStructures::IndexedLocalCoordinate& val) { out << "[ " << val.index << " : " << val.coordinate.transpose() << " ]"; return out; } template std::basic_ostream& operator << (std::basic_ostream& out, const Location& loc) { out << "ElementMesh: " << loc.elementMeshLocalCoordinate << std::endl; out << "Index: " << loc.index << std::endl; out << "RigidLocal: " << loc.rigidLocalPosition << std::endl; out << "TriangleMeshLocal: " << loc.triangleMeshLocalCoordinate << std::endl; return out; } }; // namespace DataStructures }; // namespace SurgSim #endif // SURGSIM_DATASTRUCTURES_LOCATION_H opensurgsim-0.7.0/SurgSim/DataStructures/MeshElement.h000066400000000000000000000067551277777236100230560ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DATASTRUCTURES_MESHELEMENT_H #define SURGSIM_DATASTRUCTURES_MESHELEMENT_H #include #include namespace SurgSim { namespace DataStructures { /// Element structure for meshes. MeshElement combines Vertices to form the structure of a mesh and can store extra /// per-element data. /// /// MeshElement is to be used purely as a data structure and not provide implementation of algorithms. /// For example, a physics FEM's elements are not subclasses of MeshElement if they provide code that is part of the FEM /// algorithm, but they may used with a Mesh to store the structure of the FEM. /// /// The extra Data is left up to the particular use of Mesh to specify. For example, for use collision detection, /// a vertex may need a normal and adjacent triangle information, which could be stored in a struct. /// /// If no extra Data is needed, a specialization exists for void, in which case the constructor takes no data. /// /// \tparam N Number of vertices in the element /// \tparam Data Type of extra data stored in the element (void for no data) /// \sa Vertices template struct MeshElement { /// Constructor /// \param verticesId IDs of the N element vertices /// \param data Extra data to be stored with the element MeshElement(const std::array& verticesId, const Data& data) : verticesId(verticesId), data(data), isValid(true) { } /// Constructor where the Data is constructed by its default constructor. /// \param verticesId IDs of the N element vertices explicit MeshElement(const std::array& verticesId) : verticesId(verticesId), isValid(true) { } /// Copy constructor when the template data is a different type /// In this case, no data will be copied /// \tparam T type of data stored in the other MeshElement /// \param other the MeshElement to copy from template explicit MeshElement(const MeshElement& other) : verticesId(other.verticesId), isValid(other.isValid) { } typedef std::array IdType; /// Element vertices. IdType verticesId; /// Extra element data. Data data; /// Is this a valid element bool isValid; /// Compare the element with another one (equality) /// \param element The MeshElement to compare it to /// \return True if the two MeshElements are equals, False otherwise bool operator==(const MeshElement& element) const { return isValid == element.isValid && verticesId == element.verticesId && data == element.data; } /// Compare the element with another one (inequality) /// \param element The MeshElement to compare it to /// \return False if the two MeshElements are equals, True otherwise bool operator!=(const MeshElement& element) const { return !((*this) == element); } }; }; // namespace DataStructures }; // namespace SurgSim #endif // SURGSIM_DATASTRUCTURES_MESHELEMENT_H opensurgsim-0.7.0/SurgSim/DataStructures/NamedData-inl.h000066400000000000000000000171621277777236100232400ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DATASTRUCTURES_NAMEDDATA_INL_H #define SURGSIM_DATASTRUCTURES_NAMEDDATA_INL_H #include #include "SurgSim/DataStructures/NamedData.h" #include "SurgSim/Framework/Assert.h" namespace SurgSim { namespace DataStructures { template inline NamedData::NamedData() { } template inline NamedData::NamedData(std::shared_ptr directory) : m_directory(directory) { SURGSIM_ASSERT(isValid()); m_data.resize(m_directory->getNumEntries()); m_isDataValid.resize(m_directory->getNumEntries(), false); } template inline NamedData::NamedData(const std::vector& names) : m_directory(std::make_shared(names)) { SURGSIM_ASSERT(isValid()); m_data.resize(m_directory->getNumEntries()); m_isDataValid.resize(m_directory->getNumEntries(), false); } template inline NamedData::NamedData(const NamedData& namedData) : m_directory(namedData.m_directory), m_data(namedData.m_data), m_isDataValid(namedData.m_isDataValid) { SURGSIM_ASSERT(isValid()); } template inline NamedData& NamedData::operator=(const NamedData& namedData) { SURGSIM_ASSERT(namedData.isValid()) << "Cannot use an invalid (empty) NamedData on the right-hand side of an assignment!"; if (!isValid()) { m_directory = namedData.m_directory; } else { SURGSIM_ASSERT(m_directory == namedData.m_directory) << "Incompatible NamedData contents in assignment!"; } m_data = namedData.m_data; m_isDataValid = namedData.m_isDataValid; SURGSIM_ASSERT(isValid()) << "NamedData is not valid after assignment!"; SURGSIM_ASSERT(m_data.size() == m_directory->size() && m_isDataValid.size() == m_directory->size()) << "NamedData is not correctly sized after assignment!"; return *this; } template inline NamedData::NamedData(NamedData&& namedData) : m_directory(std::move(namedData.m_directory)), m_data(std::move(namedData.m_data)), m_isDataValid(std::move(namedData.m_isDataValid)) { SURGSIM_ASSERT(isValid()); } template inline NamedData& NamedData::operator=(NamedData&& namedData) { SURGSIM_ASSERT(namedData.isValid()) << "Cannot use an invalid (empty) NamedData on the right-hand side of an assignment!"; if (!isValid()) { m_directory = std::move(namedData.m_directory); } else { SURGSIM_ASSERT(m_directory == namedData.m_directory) << "Incompatible NamedData contents in assignment!"; } m_data = std::move(namedData.m_data); m_isDataValid = std::move(namedData.m_isDataValid); SURGSIM_ASSERT(isValid()) << "NamedData is not valid after assignment!"; SURGSIM_ASSERT(m_data.size() == m_directory->size() && m_isDataValid.size() == m_directory->size()) << "NamedData is not correctly sized after assignment!"; return *this; } template inline bool NamedData::isValid() const { return static_cast(m_directory); } template inline std::shared_ptr NamedData::getDirectory() const { return m_directory; } template inline int NamedData::getIndex(const std::string& name) const { if (! isValid()) { return -1; } return m_directory->getIndex(name); } template inline std::string NamedData::getName(int index) const { if (! isValid()) { return ""; } return m_directory->getName(index); } template inline bool NamedData::hasEntry(int index) const { return ((index >= 0) && (index < static_cast(m_data.size()))); } template inline bool NamedData::hasEntry(const std::string& name) const { if (! isValid()) { return false; } return m_directory->hasEntry(name); } template inline bool NamedData::hasData(int index) const { return hasEntry(index) && m_isDataValid[index]; } template inline bool NamedData::hasData(const std::string& name) const { int index = getIndex(name); if (index < 0) { return false; } else { SURGSIM_ASSERT(hasEntry(index)); return m_isDataValid[index]; } } template inline bool NamedData::get(int index, T* value) const { if (! hasData(index)) { return false; } else { *value = m_data[index]; return true; } } template inline bool NamedData::get(const std::string& name, T* value) const { int index = getIndex(name); if ((index < 0) || ! m_isDataValid[index]) { return false; } else { SURGSIM_ASSERT(hasEntry(index)); *value = m_data[index]; return true; } } template inline bool NamedData::set(int index, const T& value) { if (! hasEntry(index)) { return false; } else { m_data[index] = value; m_isDataValid[index] = true; return true; } } template inline bool NamedData::set(int index, T&& value) { if (! hasEntry(index)) { return false; } else { m_data[index] = std::move(value); m_isDataValid[index] = true; return true; } } template inline bool NamedData::set(const std::string& name, const T& value) { int index = getIndex(name); if (index < 0) { return false; } else { SURGSIM_ASSERT(set(index, value) == true) << "The directory returned an index larger than the number of entries in the stored data."; return true; } } template inline bool NamedData::set(const std::string& name, T&& value) { int index = getIndex(name); if (index < 0) { return false; } else { SURGSIM_ASSERT(set(index, std::move(value)) == true) << "The directory returned an index larger than the number of entries in the stored data."; return true; } } template inline bool NamedData::reset(int index) { if (! hasEntry(index)) { return false; } else { m_isDataValid[index] = false; return true; } } template inline bool NamedData::reset(const std::string& name) { int index = getIndex(name); if (index < 0) { return false; } else { SURGSIM_ASSERT(reset(index) == true) << "The directory returned an index larger than the number of entries in the stored data."; return true; } } template inline void NamedData::resetAll() { m_isDataValid.assign(m_data.size(), false); } template inline size_t NamedData::size() const { return m_data.size(); } template inline int NamedData::getNumEntries() const { return static_cast(m_data.size()); } template template inline void NamedData::copy(const NamedData& source, const NamedDataCopyMap& map) { static_assert(std::is_same::value, "NamedData::copy can only copy from another NamedData."); for (auto it = map.cbegin(); it != map.cend(); ++it) { T value; if (source.get(it->first, &value)) { set(it->second, value); } else { reset(it->second); } } } template void SurgSim::DataStructures::NamedData::cacheIndex(const std::string& name, int* index) const { if (*index < 0) { *index = getIndex(name); } } }; // namespace Input }; // namespace SurgSim #endif // SURGSIM_DATASTRUCTURES_NAMEDDATA_INL_H opensurgsim-0.7.0/SurgSim/DataStructures/NamedData.h000066400000000000000000000344641277777236100224640ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DATASTRUCTURES_NAMEDDATA_H #define SURGSIM_DATASTRUCTURES_NAMEDDATA_H #include #include #include #include "SurgSim/Framework/Assert.h" #include "SurgSim/DataStructures/IndexDirectory.h" namespace SurgSim { namespace DataStructures { /// The type used for copying values between two NamedData objects that cannot assign to each other. The keys are /// the source indices. The values are the target indices. typedef std::unordered_map NamedDataCopyMap; /// Common strings for NamedData. namespace Names { static const char* const BUTTON_0 = "button0"; static const char* const BUTTON_1 = "button1"; static const char* const BUTTON_2 = "button2"; static const char* const BUTTON_3 = "button3"; static const char* const BUTTON_4 = "button4"; static const char* const TOOLDOF = "toolDof"; static const char* const POSE = "pose"; static const char* const INPUT_POSE = "inputPose"; static const char* const ANGULAR_VELOCITY = "angularVelocity"; static const char* const LINEAR_VELOCITY = "linearVelocity"; static const char* const INPUT_ANGULAR_VELOCITY = "inputAngularVelocity"; static const char* const INPUT_LINEAR_VELOCITY = "inputLinearVelocity"; static const char* const FORCE = "force"; static const char* const TORQUE = "torque"; static const char* const DAMPER_JACOBIAN = "damperJacobian"; static const char* const SPRING_JACOBIAN = "springJacobian"; static const char* const IS_HOMED = "isHomed"; static const char* const IS_ORIENTATION_HOMED = "isOrientationHomed"; static const char* const IS_POSITION_HOMED = "isPositionHomed"; static const char* const DIGITAL_INPUT_PREFIX = "digitalInput"; static const char* const DIGITAL_OUTPUT_PREFIX = "digitalOutput"; static const char* const TIMER_INPUT_PREFIX = "timerInput"; static const char* const TIMER_OUTPUT_PREFIX = "timerOutput"; static const char* const ANALOG_INPUT_PREFIX = "analogInput"; static const char* const ANALOG_OUTPUT_PREFIX = "analogOutput"; static const char* const PROJECTION_MATRIX = "projectionMatix"; static const char* const LEFT_PROJECTION_MATRIX = "leftProjectionMatix"; static const char* const RIGHT_PROJECTION_MATRIX = "rightProjectionMatix"; static const char* const KEY = "key"; }; /// A templated dictionary in which data can be accessed by name or index, with immutable names & indices. /// /// A NamedData object consists of a collection of entries of type \a T. The data value for each entry can be accessed /// by either the entry's unique name (a std::string) or the entry's unique index (a non-negative integer). Access by /// name is more convenient, but less efficient. /// /// A NamedData object constructed by the default constructor has no entries, meaning it has not been associated with a /// set of names and indices, and is called invalid or empty. /// /// An non-empty object contains an immutable collection of entries. For a non-empty object: entries cannot be /// added or removed, and the entries' names and indices cannot be changed. Further, a non-empty object cannot /// become empty. These properties ensure that a stable data layout is available to the code using this class so /// that it can, for example, record entry indices and use them to retrieve the same entries later on. /// /// The data associated with an entry (e.g., the true or false associated with a particular name and index in a /// NamedData) can be changed, and each entry can be reset to a "missing" state. A reset entry remains in the /// collection, but has no associated data. /// /// The entries (i.e., names & indices) in a NamedData object can be set by passing a vector of names to the /// constructor, or by using the \ref NamedDataBuilder class. Given one non-empty object, other objects with the same /// entries can be created via copy construction or assignment of the non-empty object to an empty /// (default-constructed) object. /// /// \tparam T the data type used for values contained in this collection. template class NamedData { public: /// Create an empty object, with no associated names and indices yet. inline NamedData(); /// Create an object containing items from an index directory. /// You should probably use \ref NamedDataBuilder or copy construction/assignment instead. /// /// \param directory The IndexDirectory object describing the names and indices to be used. inline explicit NamedData(std::shared_ptr directory); /// Construct an object, using the names from a vector of strings. /// The indices corresponding to each name's entry will be the same as that name's index in the vector. /// /// \param names The names, which should be unique. inline explicit NamedData(const std::vector& names); /// Construct an object as a copy of the data from another object. /// This is used in the NamedVariantData copy constructor. /// \param namedData The object to copy from. inline NamedData(const NamedData& namedData); /// Copy the data from another object. /// /// The object being assigned into must either be empty (not yet associated with a set of names and indices), or /// the two objects must share the same data layout, resulting from earlier copy construction or assignment. /// ~~~~~ /// DataGroup initial; /// // ...initialize "initial" to some non-empty value... /// NamedData copyConstructed(initial); // Layout is shared with initial /// copyConstructed = initial // OK, using the same layout /// NamedData another; // Object is empty (no layout) /// another = initial; // OK, layout is now shared with initial /// another = initial // OK, using the same layout /// ~~~~~ /// /// Note that the data layout must be the same, i.e. related to one another by object assignment or copy /// construction. Objects that merely contain entries with the same names and indices are not acceptable! /// (Otherwise, we'd need to inefficiently compare layout contents each time we assign.) /// ~~~~~ /// std::vector names // = ...initialized to some value...; /// NamedData first(names); // Layout of entries created from names /// NamedData second(names); // Another layout of entries created from names; names and indices match /// second = first; // ERROR at run-time, layouts were created separately! /// ~~~~~ /// /// \param namedData The object to copy from. /// \return The object that was assigned into. inline NamedData& operator=(const NamedData& namedData); /// Create an object and move the data from another object. /// /// \param [in,out] namedData The object to copy from, which will be left in an unusable state. inline NamedData(NamedData&& namedData); /// Move the data from another object. /// /// The same restrictions on object compatibility apply as in the case of the copy assignment /// operator=(const NamedData&). /// /// \param [in,out] namedData The object to copy from, which will be left in an unusable state. /// \return The object that was assigned into. inline NamedData& operator=(NamedData&& namedData); /// Check if the object has been initialized, which means it has a set of entries (i.e., names, indices, and the /// map between them). If the object has not been initialized, it can become initialized on assignment from an /// initialized object. /// /// \return true if initialized. inline bool isValid() const; /// Return the object's layout directory, which is its collection of names and indices. /// In most cases, you should use direct assignment instead of doing things via the directory. /// \return The IndexDirectory object containing the names and indices of entries. inline std::shared_ptr getDirectory() const; /// Given a name, return the corresponding index (or -1). /// \param name The name. /// \return the index for that name if one exists; -1 otherwise. inline int getIndex(const std::string& name) const; /// Given an index, return the corresponding name (or ""). /// \param index The index. /// \return the name for that index if one exists; an empty string otherwise. inline std::string getName(int index) const; /// Check whether the object contains an entry with the specified index. /// Logically equivalent to getName(index) != "". /// /// \param index The index corresponding to the entry. /// \return true if that entry exists, false if not. inline bool hasEntry(int index) const; /// Check whether the object contains an entry with the specified name. /// Logically equivalent to getIndex(name) != -1. /// /// \param name The name corresponding to the entry. /// \return true if that entry exists, false if not. inline bool hasEntry(const std::string& name) const; /// Check whether the entry with the specified index contains valid data. /// The check verifies that the entry's data was %set using set(int, const T&) or /// set(const std::string&, const T&), without being subsequently invalidated by reset(int) /// or reset(const std::string&). /// /// \param index The index of the entry. /// \return true if that entry exists and contains valid data. inline bool hasData(int index) const; /// Check whether the entry with the specified name contains valid data. /// The check verifies that the entry's data was %set using set(int, const T&) or /// set(const std::string&, const T&), without being subsequently invalidated by reset(int) /// or reset(const std::string&). /// /// \param name The name of the entry. /// \return true if that entry exists and contains valid data. inline bool hasData(const std::string& name) const; /// Given an index, get the corresponding value. /// It's only possible to get the value if the data was %set using set(int, const T&) or /// set(const std::string&, const T&), without being subsequently invalidated by reset(int) /// or reset(const std::string&). In other words, get returns the same value as hasData would return. /// /// \param index The index of the entry. /// \param [out] value The location for the retrieved value. Must not be null. /// \return true if a valid value is available and was written to \a value. inline bool get(int index, T* value) const; /// Given a name, get the corresponding value. /// It's only possible to get the value if the data was %set using set(int, const T&) or /// set(const std::string&, const T&), without being subsequently invalidated by reset(int) /// or reset(const std::string&). In other words, get returns the same value as hasData would return. /// /// \param name The name of the entry. /// \param [out] value The location for the retrieved value. Must not be null. /// \return true if a valid value is available and was written to \a value. inline bool get(const std::string& name, T* value) const; /// Record the data for an entry specified by an index. /// The entry will also be marked as containing valid data. /// /// \param index The index of the entry. /// \param value The value to be set. /// \return true if successful. inline bool set(int index, const T& value); /// Record the data for an entry specified by an index. /// This version accepts rvalues, and the data will be moved /// The entry will also be marked as containing valid data. /// /// \param index The index of the entry. /// \param value The value to be set. /// \return true if successful. inline bool set(int index, T&& value); /// Record the data for an entry specified by a name. /// The entry will also be marked as containing valid data. /// /// \param name The name of the entry. /// \param value The value to be set. /// \return true if successful. inline bool set(const std::string& name, const T& value); /// Record the data for an entry specified by a name. /// This version accepts rvalues, and the data will be moved /// The entry will also be marked as containing valid data. /// /// \param name The name of the entry. /// \param value The value to be set. /// \return true if successful. inline bool set(const std::string& name, T&& value); /// Invalidate an entry— mark it as not containing any valid data. /// /// \param index The index of the entry. /// \return true if successful. inline bool reset(int index); /// Invalidate an entry— mark it as not containing any valid data. /// /// \param name The name of the entry. /// \return true if successful. inline bool reset(const std::string& name); /// Invalidate all entries— mark everything as not containing any valid data. inline void resetAll(); /// Check the number of existing entries. /// \return the size of the data collection. /// \sa getNumEntries() inline size_t size() const; /// Check the number of existing entries. /// \return the size of the data collection. /// \sa size() inline int getNumEntries() const; /// Copy the data from another NamedData, based on a map of indices. Resets entries that are reset in the other. /// \param source The source NamedData. /// \param map The map of indices. /// \exception Asserts if the objects do not have the same template type. template void copy(const NamedData& source, const NamedDataCopyMap& map); /// Caches an entry's index if it is not already cached. An index is considered already cached if it is >= 0. /// \param name The name of the entry. /// \param [in,out] index The cached index. void cacheIndex(const std::string& name, int* index) const; private: /// The mapping between names and indices. std::shared_ptr m_directory; /// The array of values. std::vector m_data; /// The array storing whether the data is currently valid. std::vector m_isDataValid; }; }; // namespace DataStructures }; // namespace SurgSim #include "SurgSim/DataStructures/NamedData-inl.h" #endif // SURGSIM_DATASTRUCTURES_NAMEDDATA_H opensurgsim-0.7.0/SurgSim/DataStructures/NamedDataBuilder.h000066400000000000000000000116371277777236100237700ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DATASTRUCTURES_NAMEDDATABUILDER_H #define SURGSIM_DATASTRUCTURES_NAMEDDATABUILDER_H #include #include "SurgSim/DataStructures/NamedData.h" namespace SurgSim { namespace DataStructures { /// A class that allows you to build a \ref NamedData structure. /// /// Since the data layout of a \ref NamedData object cannot be modified, this class can be helpful in initially /// setting up the names and their corresponding indices. You can add entries to the builder using \ref addEntry /// and \ref addEntriesFrom calls, then create the NamedData instance with createData() or createSharedData(). /// /// \sa NamedData template class NamedDataBuilder { public: /// Constructs an empty builder object. NamedDataBuilder() { } /// Produces a \ref NamedData object with an immutable set of names and indices. /// None of the values will contain any current data. /// \return the NamedData object *by value*. NamedData createData() const { // NB: can't use copy construction in the std::make_shared call, because access is protected. std::shared_ptr dir = std::make_shared(); *dir = m_directory; return NamedData(dir); } /// Produces a shared pointer to an empty \ref NamedData object with an immutable set of names and indices. /// None of the values will contain any current data. /// \return a shared pointer to the NamedData object. std::shared_ptr> createSharedData() const { return std::make_shared>(createData()); } /// Creates a new entry for the specified name. /// /// \param name The name, which should be non-empty and should not already exist in the data. /// \return the index of the created entry, or -1 if the entry could not be added. int addEntry(const std::string& name) { return m_directory.addEntry(name); } /// Create new entries from a vector of names. /// \param names The names. void addEntriesFrom(const std::vector& names) { for (auto it = names.cbegin(); it != names.cend(); ++it) { addEntry(*it); } } /// Create new entries from another NamedDataBuilder. /// \tparam typename U The data type of the other NamedDataBuilder. /// \param builder The other builder. template void addEntriesFrom(const NamedDataBuilder& builder) { addEntriesFrom(builder.getAllNames()); } /// Create new entries from an already initialized NamedData. /// \tparam typename U The data type of the NamedData. /// \param data The data object. template void addEntriesFrom(const NamedData& data) { addEntriesFrom(data.getDirectory()->getAllNames()); } /// Create new entries from an IndexDirectory. /// \param directory The index directory object. void addEntriesFrom(const IndexDirectory& directory) { addEntriesFrom(directory.getAllNames()); } /// Given a name, return the corresponding index (or -1). /// \param name The name. /// \return the index for that name if one exists; -1 otherwise. int getIndex(const std::string& name) const { return m_directory.getIndex(name); } /// Given an index, return the corresponding name (or ""). /// \param index The index. /// \return the name for that index if one exists; an empty string otherwise. std::string getName(int index) const { return m_directory.getName(index); } /// Get a list of all the names available in the builder. /// \return all the names. const std::vector& getAllNames() const { return m_directory.getAllNames(); } /// Check whether the specified name exists in the builder. /// /// \param name The name. /// \return true if the entry exists. bool hasEntry(const std::string& name) const { return m_directory.hasEntry(name); } /// Check the number of existing entries in the builder. /// \return the number of entries. /// \sa getNumEntries() size_t size() const { return m_directory.size(); } /// Check the number of existing entries in the builder. /// \return the number of entries. /// \sa size() int getNumEntries() const { return m_directory.getNumEntries(); } private: /// The mapping between names and indices that will be used to create the NamedData instance. IndexDirectory m_directory; }; }; // namespace Input }; // namespace SurgSim #endif // SURGSIM_DATASTRUCTURES_NAMEDDATABUILDER_H opensurgsim-0.7.0/SurgSim/DataStructures/NamedVariantData-inl.h000066400000000000000000000041001277777236100245510ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DATASTRUCTURES_NAMEDVARIANTDATA_INL_H #define SURGSIM_DATASTRUCTURES_NAMEDVARIANTDATA_INL_H #include "SurgSim/Framework/Assert.h" namespace SurgSim { namespace DataStructures { inline NamedVariantData::NamedVariantData() { } inline NamedVariantData::NamedVariantData(const NamedData& namedData) : NamedData(namedData) { } template inline bool NamedVariantData::hasTypedData(int index) const { if (! hasData(index)) { return false; } boost::any a; if (! NamedData::get(index, &a)) { return false; } if (a.empty()) { return false; } return (a.type() == typeid(T)); } template inline bool NamedVariantData::hasTypedData(const std::string& name) const { if (! hasData(name)) { return false; } int index = getIndex(name); return hasTypedData(index); } template inline bool NamedVariantData::get(int index, T* value) const { boost::any a; if (!NamedData::get(index, &a)) return false; try { *value = boost::any_cast(a); } catch(const boost::bad_any_cast &) { SURGSIM_FAILURE() << "Cannot cast the named value to the specified type."; } return true; } template inline bool NamedVariantData::get(const std::string& name, T* value) const { int index = getIndex(name); return get(index, value); } }; // namespace DataStructures }; // namespace SurgSim #endif // SURGSIM_DATASTRUCTURES_NAMEDVARIANTDATA_INL_H opensurgsim-0.7.0/SurgSim/DataStructures/NamedVariantData.h000066400000000000000000000105221277777236100237760ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DATASTRUCTURES_NAMEDVARIANTDATA_H #define SURGSIM_DATASTRUCTURES_NAMEDVARIANTDATA_H #include #include "SurgSim/DataStructures/NamedData.h" #include "SurgSim/DataStructures/NamedDataBuilder.h" namespace SurgSim { namespace DataStructures { typedef NamedDataBuilder NamedVariantDataBuilder; /// A NamedData collection of variant data type. /// /// A NamedVariantData collection is a collection variant datatypes. Each entry in the collection can be /// accessed by using either its unique name (a std::string) or its unique index (a non-negative integer). /// Access by name is more convenient, but also less efficient. /// /// This sub-class of NameData encapsulates the boost::any variant type, and adds two get functions that /// provide typed access to the contained data. class NamedVariantData : public NamedData { public: NamedVariantData(); /// Implicit conversion for NamedVariantData constructor is used on purpose. NamedVariantData(const NamedData& namedData); //NOLINT /// Check whether the entry with the specified index contains valid data. /// The check verifies that the entry's data is of type T, was %set using /// set(int, const T&) or set(const std::string&, const T&), without being /// subsequently invalidated by reset(int) or reset(const std::string&). /// /// \tparam T the data type to check for at the given index. /// \param index The index of the entry. /// \return true if that entry exists, is of type T, and contains valid data. template inline bool hasTypedData(int index) const; /// Check whether the entry with the specified name contains valid data. /// The check verifies that the entry's data is of type T, was %set using /// set(int, const T&) or set(const std::string&, const T&), without being /// subsequently invalidated by reset(int) or reset(const std::string&). /// /// \tparam T the data type to check for at the given index. /// \param name The name of the entry. /// \return true if that entry exists, is of type T, and contains valid data. template inline bool hasTypedData(const std::string& name) const; /// Given an index, get the corresponding value. /// It's only possible to get the value if the data was %set using set(int, const T&) or /// set(const std::string&, const T&), without being subsequently invalidated by reset(int) /// or reset(const std::string&). In other words, get returns the same value as hasData would return. /// /// \tparam T the data type used for the value at the given index. /// \param index The index of the entry. /// \param [out] value The location for the retrieved value. Must not be null. /// \return true if a valid value is available, was written to \a value, and value is the correct type. template inline bool get(int index, T* value) const; /// Given a name, get the corresponding value. /// It's only possible to get the value if the data was %set using set(int, const T&) or /// set(const std::string&, const T&), without being subsequently invalidated by reset(int) /// or reset(const std::string&). In other words, get returns the same value as hasData would return. /// /// \tparam T the data type used for the value with the given name. /// \param name The name of the entry. /// \param [out] value The location for the retrieved value. Must not be null. /// \return true if a valid value is available, was written to \a value, and value is the correct type. template inline bool get(const std::string& name, T* value) const; }; }; // namespace DataStructures }; // namespace SurgSim #include "SurgSim/DataStructures/NamedVariantData-inl.h" #endif // SURGSIM_DATASTRUCTURES_NAMEDVARIANTDATA_H opensurgsim-0.7.0/SurgSim/DataStructures/NormalData.h000066400000000000000000000026331277777236100226610ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DATASTRUCTURES_NORMALDATA_H #define SURGSIM_DATASTRUCTURES_NORMALDATA_H #include "SurgSim/Math/Vector.h" namespace SurgSim { namespace DataStructures { /// Store normal for each triangle in a triangle mesh. struct NormalData { SurgSim::Math::Vector3d normal; /// Equality operator. /// \param rhs The right hand side NormalData. /// \return true if the parameters are considered equivalent. bool operator==(const NormalData& rhs) const { return normal == rhs.normal; } /// Inequality operator. /// \param rhs The right hand side NormalData. /// \return true if the parameters are not considered equivalent. bool operator!=(const NormalData& rhs) const { return !((*this) == rhs); } }; }; }; #endif // SURGSIM_DATASTRUCTURES_NORMALDATA_H opensurgsim-0.7.0/SurgSim/DataStructures/OctreeNode-inl.h000066400000000000000000000142761277777236100234540ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DATASTRUCTURES_OCTREENODE_INL_H #define SURGSIM_DATASTRUCTURES_OCTREENODE_INL_H #include #include #include #include "SurgSim/DataStructures/OctreeNodePlyReaderDelegate.h" #include "SurgSim/DataStructures/PlyReader.h" #include "SurgSim/Framework/Assert.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Framework/Timer.h" namespace SurgSim { namespace DataStructures { template OctreeNode::OctreeNode() : m_isActive(false), m_hasChildren(false) { } template OctreeNode::OctreeNode(const SurgSim::Math::Aabbd& boundingBox) : m_boundingBox(boundingBox), m_isActive(false), m_hasChildren(false) { } template SurgSim::DataStructures::OctreeNode::OctreeNode(const OctreeNode& other) { m_boundingBox = other.m_boundingBox; m_hasChildren = other.m_hasChildren; m_isActive = other.m_isActive; // Also copy the data since they are the same type data = other.data; for (size_t i = 0; i < other.m_children.size(); i++) { if (other.getChild(i) == nullptr) { m_children[i] = nullptr; } else { m_children[i] = std::make_shared>(*other.m_children[i]); } } } template template SurgSim::DataStructures::OctreeNode::OctreeNode(const OctreeNode& other) { m_boundingBox = other.getBoundingBox(); m_hasChildren = other.hasChildren(); m_isActive = other.isActive(); for (size_t i = 0; i < m_children.size(); i++) { auto child = other.getChild(i); if (child == nullptr) { m_children[i] = nullptr; } else { m_children[i] = std::make_shared>(*child); } } } template OctreeNode::~OctreeNode() { } template std::string OctreeNode::getClassName() const { return m_className; } template const SurgSim::Math::Aabbd& OctreeNode::getBoundingBox() const { return m_boundingBox; } template bool OctreeNode::isActive() const { return m_isActive; } template void OctreeNode::setIsActive(bool isActive) { m_isActive = isActive; } template bool OctreeNode::hasChildren() const { return m_hasChildren; } template void OctreeNode::subdivide() { using SurgSim::Math::Vector3d; if (! m_hasChildren) { Vector3d childsSize = (m_boundingBox.max() - m_boundingBox.min()) / 2.0; AxisAlignedBoundingBox childsBoundingBox; for (int i = 0; i < 8; i++) { // Use the index to pick one of the eight regions Vector3d regionIndex = Vector3d(((i & 1) == 0) ? 0 : 1, ((i & 2) == 0) ? 0 : 1, ((i & 4) == 0) ? 0 : 1); childsBoundingBox.min() = m_boundingBox.min().array() + regionIndex.array() * childsSize.array(); childsBoundingBox.max() = childsBoundingBox.min() + childsSize; m_children[i] = std::make_shared>(childsBoundingBox); } m_hasChildren = true; } } template bool OctreeNode::addData(const SurgSim::Math::Vector3d& position, const int level, const Data& nodeData) { return doAddData(position, nodeData, level, 1); } template bool OctreeNode::doAddData(const SurgSim::Math::Vector3d& position, const Data& nodeData, const int level, const int currentLevel) { if (! m_boundingBox.contains(position)) { return false; } if (currentLevel == level) { data = nodeData; m_isActive = true; return true; } if (! m_hasChildren) { subdivide(); } for (auto child = m_children.begin(); child != m_children.end(); ++child) { if ((*child)->doAddData(position, nodeData, level, currentLevel + 1)) { m_isActive = true; return true; } } return false; } template std::array>, 8>& OctreeNode::getChildren() { return m_children; } template const std::array>, 8>& OctreeNode::getChildren() const { return m_children; } template std::shared_ptr> OctreeNode::getChild(size_t index) { return m_children[index]; } template const std::shared_ptr> OctreeNode::getChild(size_t index) const { return m_children[index]; } template std::shared_ptr> OctreeNode::getNode(const OctreePath& path, bool returnLastValid) { std::shared_ptr> node = this->shared_from_this(); std::shared_ptr> previous; for (auto index = path.cbegin(); index != path.cend(); ++index) { previous = std::move(node); node = previous->getChild(*index); if (node == nullptr) { if (returnLastValid) { node = std::move(previous); break; } else { SURGSIM_FAILURE() << "Octree path is invalid. Path is longer than octree is deep in this given branch."; } } } return node; } template bool SurgSim::DataStructures::OctreeNode::doLoad(const std::string& fileName) { SurgSim::Framework::Timer timer; auto delegate = std::make_shared>(this->shared_from_this()); PlyReader reader(fileName); SURGSIM_ASSERT(reader.isValid()) << "'" << fileName << "' is an invalid .ply file."; SURGSIM_ASSERT(reader.parseWithDelegate(delegate)) << "The input file " << fileName << " does not have the property required by the octree."; timer.endFrame(); SURGSIM_LOG_INFO(SurgSim::Framework::Logger::getDefaultLogger()) << "Loading " << fileName << " took " << timer.getCumulativeTime() << "s. "; return true; } }; // namespace DataStructures }; // namespace SurgSim #endif // SURGSIM_DATASTRUCTURES_OCTREENODE_INL_H opensurgsim-0.7.0/SurgSim/DataStructures/OctreeNode.cpp000066400000000000000000000153471277777236100232270ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/DataStructures/OctreeNode.h" #include "SurgSim/Framework/Assert.h" #include #include #include #include namespace { using SurgSim::DataStructures::SYMBOL_HALT; using SurgSim::DataStructures::SYMBOL_LEFT; using SurgSim::DataStructures::SYMBOL_RIGHT; using SurgSim::DataStructures::SYMBOL_FRONT; using SurgSim::DataStructures::SYMBOL_BACK; using SurgSim::DataStructures::SYMBOL_UP; using SurgSim::DataStructures::SYMBOL_DOWN; using SurgSim::DataStructures::Symbol; struct TransitionCode { size_t nodeId; Symbol symbol; }; /// State machine codes, paired by new Value, new Directions value static TransitionCode transitionTable[6][8] = { // Transition codes for 'Down' { {2u, SYMBOL_DOWN}, {3u, SYMBOL_DOWN}, {0u, SYMBOL_HALT}, {1u, SYMBOL_HALT}, {6u, SYMBOL_DOWN}, {7u, SYMBOL_DOWN}, {4u, SYMBOL_HALT}, {5u, SYMBOL_HALT} }, // Transition Codes for 'Up' { {2u, SYMBOL_HALT}, {3u, SYMBOL_HALT}, {0u, SYMBOL_UP}, {1u, SYMBOL_UP}, {6u, SYMBOL_HALT}, {7u, SYMBOL_HALT}, {4u, SYMBOL_UP}, {5u, SYMBOL_UP} }, // Transition Codes for 'Right' { {1u, SYMBOL_HALT}, {0u, SYMBOL_RIGHT}, {3u, SYMBOL_HALT}, {2u, SYMBOL_RIGHT}, {5u, SYMBOL_HALT}, {4u, SYMBOL_RIGHT}, {7u, SYMBOL_HALT}, {6u, SYMBOL_RIGHT} }, // Transition Codes for 'Left' { {1u, SYMBOL_LEFT}, {0u, SYMBOL_HALT}, {3u, SYMBOL_LEFT}, {2u, SYMBOL_HALT}, {5u, SYMBOL_LEFT}, {4u, SYMBOL_HALT}, {7u, SYMBOL_LEFT}, {6u, SYMBOL_HALT} }, // Transition Codes for 'Back' { {4u, SYMBOL_BACK}, {5u, SYMBOL_BACK}, {6u, SYMBOL_BACK}, {7u, SYMBOL_BACK}, {0u, SYMBOL_HALT}, {1u, SYMBOL_HALT}, {2u, SYMBOL_HALT}, {3u, SYMBOL_HALT} }, // Transition Codes for 'Front' { {4u, SYMBOL_HALT}, {5u, SYMBOL_HALT}, {6u, SYMBOL_HALT}, {7u, SYMBOL_HALT}, {0u, SYMBOL_FRONT}, {1u, SYMBOL_FRONT}, {2u, SYMBOL_FRONT}, {3u, SYMBOL_FRONT} } }; static const std::array, 6> FaceNeighbors = { SYMBOL_DOWN, SYMBOL_HALT, SYMBOL_HALT, SYMBOL_UP, SYMBOL_HALT, SYMBOL_HALT, SYMBOL_RIGHT, SYMBOL_HALT, SYMBOL_HALT, SYMBOL_LEFT, SYMBOL_HALT, SYMBOL_HALT, SYMBOL_BACK, SYMBOL_HALT, SYMBOL_HALT, SYMBOL_FRONT, SYMBOL_HALT, SYMBOL_HALT, }; static const std::array, 12> EdgeNeighbors = { SYMBOL_DOWN, SYMBOL_RIGHT, SYMBOL_HALT, SYMBOL_DOWN, SYMBOL_LEFT, SYMBOL_HALT, SYMBOL_DOWN, SYMBOL_FRONT, SYMBOL_HALT, SYMBOL_DOWN, SYMBOL_BACK, SYMBOL_HALT, SYMBOL_UP, SYMBOL_RIGHT, SYMBOL_HALT, SYMBOL_UP, SYMBOL_LEFT, SYMBOL_HALT, SYMBOL_UP, SYMBOL_FRONT, SYMBOL_HALT, SYMBOL_UP, SYMBOL_BACK, SYMBOL_HALT, SYMBOL_BACK, SYMBOL_RIGHT, SYMBOL_HALT, SYMBOL_BACK, SYMBOL_LEFT, SYMBOL_HALT, SYMBOL_FRONT, SYMBOL_RIGHT, SYMBOL_HALT, SYMBOL_FRONT, SYMBOL_LEFT, SYMBOL_HALT, }; static const std::array, 8> VertexNeighbors = { SYMBOL_DOWN, SYMBOL_RIGHT, SYMBOL_FRONT, SYMBOL_DOWN, SYMBOL_RIGHT, SYMBOL_BACK, SYMBOL_DOWN, SYMBOL_LEFT, SYMBOL_FRONT, SYMBOL_DOWN, SYMBOL_LEFT, SYMBOL_BACK, SYMBOL_UP, SYMBOL_RIGHT, SYMBOL_FRONT, SYMBOL_UP, SYMBOL_RIGHT, SYMBOL_BACK, SYMBOL_UP, SYMBOL_LEFT, SYMBOL_FRONT, SYMBOL_UP, SYMBOL_LEFT, SYMBOL_BACK, }; } namespace SurgSim { namespace DataStructures { SURGSIM_REGISTER(SurgSim::Framework::Asset, SurgSim::DataStructures::OctreeNode, OctreeNodeEmptyData); // Predefine classname of OctreeNode of EmptyData template<> std::string OctreeNode::m_className = "SurgSim::DataStructures::OctreeNode"; SurgSim::DataStructures::OctreePath getNeighbor(const OctreePath& origin, const std::array& direction) { // Early Exit if (origin.size() == 0 || direction[0] == SYMBOL_HALT) { return OctreePath(); } boost::container::static_vector currentDirection; boost::container::static_vector newDirection; for (size_t i = 0; i < direction.size() && direction[i] != SYMBOL_HALT; ++i) { currentDirection.push_back(direction[i]); } OctreePath result(origin); bool didHalt = false; // For each level iterate over all directions and remember the new node value, and any directions // if there were any new directions (transitionCode.second != SYMBOL_HALT) then do the same for the // preceding level. If there are no new directions then we are done and the superior level are unchanged // If after the topmost level was dealt with there are still directions to work with, the neighbor is outside // of the octree, an empty array is returned in that case. for (ptrdiff_t pathIndex = origin.size() - 1; pathIndex >= 0; --pathIndex) { newDirection.clear(); size_t currentNodeId = origin[pathIndex]; for (size_t directionIndex = 0; directionIndex < currentDirection.size(); ++directionIndex) { TransitionCode code = transitionTable[currentDirection[directionIndex]][currentNodeId]; currentNodeId = code.nodeId; if (code.symbol != SYMBOL_HALT) { newDirection.push_back(code.symbol); } } currentDirection = newDirection; result[pathIndex] = currentNodeId; // If now other new direction was found then we are done and can break of the algorithm if (currentDirection.empty()) { didHalt = true; break; } } // If the last symbol was not a Halt, then the node is outside of the tree if (!didHalt) { result.clear(); } return result; } std::vector getNeighbors(const OctreePath& origin, int type) { std::vector result; auto f = [&origin, &result](const std::array& direction) { auto n = getNeighbor(origin, direction); if (! n.empty()) { result.push_back(std::move(n)); } }; size_t size = (((NEIGHBORHOOD_FACE & type) == 0) ? 0 : 6) + (((NEIGHBORHOOD_EDGE & type) == 0) ? 0 : 12) + (((NEIGHBORHOOD_VERTEX & type) == 0) ? 0 : 8); result.reserve(size); if ((NEIGHBORHOOD_FACE & type) != 0) { std::for_each(FaceNeighbors.begin(), FaceNeighbors.end(), f); } if ((NEIGHBORHOOD_EDGE & type) != 0) { std::for_each(EdgeNeighbors.begin(), EdgeNeighbors.end(), f); } if ((NEIGHBORHOOD_VERTEX & type) != 0) { std::for_each(VertexNeighbors.begin(), VertexNeighbors.end(), f); } return result; } }; // namespace DataStructures }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/DataStructures/OctreeNode.h000066400000000000000000000220371277777236100226660ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DATASTRUCTURES_OCTREENODE_H #define SURGSIM_DATASTRUCTURES_OCTREENODE_H #include #include #include #include "SurgSim/DataStructures/EmptyData.h" #include "SurgSim/Framework/Asset.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Math/Aabb.h" namespace SurgSim { namespace Math { class OctreeShape; } namespace DataStructures { /// Typedef of octree path /// The path is a vector of children indexes (each within 0 to 7) that lead to /// the specific node the front of the vector holds the index of the root's children. typedef std::vector OctreePath; /// Enable the OctreePath to be used as a key in an unordered map, if the int range is exceeded this will just /// push the least significant numbers (root addresses) out of scope, it loses a little bit of address space as /// octree ids only go from 0-7 class OctreePathHash { public: size_t operator()(const OctreePath& path) const { size_t result = 0; for (auto i : path) { result = (result << 3) | i; } return m_hasher(result); } private: std::hash m_hasher; }; /// Indicates what neighbors to grab enum Neighborhood { NEIGHBORHOOD_NONE = 0x0, NEIGHBORHOOD_FACE = 0x1, NEIGHBORHOOD_EDGE = 0x2, NEIGHBORHOOD_VERTEX = 0x4, NEIGHBORHOOD_ALL = 0x1 | 0x2 | 0x4 }; /// Direction code for the neighborhood search enum Symbol { SYMBOL_HALT = -1, SYMBOL_DOWN = 0, SYMBOL_UP = 1, SYMBOL_RIGHT = 2, SYMBOL_LEFT = 3, SYMBOL_BACK = 4, SYMBOL_FRONT = 5 }; /// Calculate the neighbor of an node in the octree by traversing a state machine, see /// http://ww1.ucmss.com/books/LFS/CSREA2006/MSV4517.pdf for detailed description. /// The information about the location of a nodes neighbor is encoded in a state machine, this machine is traversed /// until a 'Halt' instruction is found. If the neighbor is across a boundary on the octree, a new search direction /// is determined by the algorithm. /// \note The numbering in the paper and our numbering is slightly different, this means the following transformations /// took place. /// a) The colums where reordered to match our numbering /// b) All the numbers where replaced to match out numbering /// The number changes where as following: 0 => 6, 1 => 7, 2 => 4, 3 => 5, 4 => 2, 5 => 3, 6 => 0, 7 => 1 /// \param origin the node whose neighbor is needed /// \param direction a set of directions, for face neighbors use 1, for edge neighbors use 2 and for vertex neighbors /// use 3 direction, fill the other spots with SYMBOL_HALT. E.g. to find the left neighbor use /// {SYMBOL_LEFT, SYMBOL_HALT, SYMBOL_HALT}, for the vertex neighber on the upper left front corner use /// {SYMBOL_LEFT, SYMBOLD_FRONT, SYMBOL_UP} /// \return a OctreePath to the correct neighbor, empty if the neighbor is outside of the tree OctreePath getNeighbor(const OctreePath& origin, const std::array& direction); /// Fetch a list of neighbors, indicated by the type, Face, Edge and Vertex are possible types and can be combined /// via OR /// \param origin the node whose neighbor is needed /// \param type the kind of neighborhood that is needed, \sa Neighborhood /// \return list of paths with neighbors of the node at origin std::vector getNeighbors(const OctreePath& origin, int type); template class OctreeNodePlyReaderDelegate; /// Octree data structure /// /// The octree node consists of an axis aligned bounding box, that can be /// subdivided into 8 equally sized subregions. Each subregion is an octree /// node and can be further subdivided. /// with x-right and y-up on a right handed coordinate system this is the ordering of the nodes of the tree, looking /// down the z-axis /// Back Face /// 2 3 /// 0 1 /// Front Face /// 6 7 /// 4 5 /// /// \tparam Data Type of extra data stored in each node template class OctreeNode : public SurgSim::Framework::Asset, public std::enable_shared_from_this> { friend class SurgSim::Math::OctreeShape; friend class SurgSim::DataStructures::OctreeNodePlyReaderDelegate; public: /// Bounding box type for convenience typedef Eigen::AlignedBox AxisAlignedBoundingBox; /// Constructor OctreeNode(); /// Copy constructor when the template data is the same type /// \param other the octree to copy from OctreeNode(const OctreeNode& other); /// Copy constructor when the template data is a different type /// In this case, no data will be copied /// \tparam T type of data stored in the other node /// \param other the octree to copy from template OctreeNode(const OctreeNode& other); std::string getClassName() const override; /// Constructor /// \param boundingBox The region contained by this octree node explicit OctreeNode(const SurgSim::Math::Aabbd& boundingBox); /// Destructor virtual ~OctreeNode(); /// Get the bounding box for this octree node /// \return the bounding box const SurgSim::Math::Aabbd& getBoundingBox() const; /// Is this node active /// \return true if the octree node is active bool isActive() const; /// Set active flag for this octree node /// \param isActive True if the octree node is being activated, False otherwise void setIsActive(bool isActive); /// Does this node have children /// \return true if this node has children bool hasChildren() const; /// Subdivide the node into 8 equal regions. Each subregion will be stored /// as this nodes children. /// \note The data stored in the current node will not be automatically subdivided. void subdivide(); /// Add data to a node in this octree /// The octree will build the octree as necessary to add the /// node at the specified level /// \param position The position to add the data at /// \param nodeData The data to store in the node /// \param level The number of levels down the octree to store the data /// \return true if data is added bool addData(const SurgSim::Math::Vector3d& position, const int level, const Data& nodeData = Data()); /// Get the children of this node (non const version) /// \return vector of all eight children std::array>, 8>& getChildren(); /// Get the children of this node /// \return vector of all eight children const std::array>, 8>& getChildren() const; /// Get a child of this node (non const version) /// \throws SurgSim::Framework::AssertionFailure if the index >= 8 /// \param index the child index /// \return the requested octree node std::shared_ptr> getChild(size_t index); /// Get a child of this node /// \throws SurgSim::Framework::AssertionFailure if the index >= 8 /// \param index the child index /// \return the requested octree node const std::shared_ptr> getChild(size_t index) const; /// Get the node at the supplied path /// \throws SurgSim::Framework::AssertionFailure if returnLastValid is false and the node does not exist. /// \param path the path to the specific node /// \param returnLastValid if true and the path is longer than the tree deep, the function will return // the last node on a given path, otherwise it will throw. /// \return the requested octree node virtual std::shared_ptr> getNode(const OctreePath& path, bool returnLastValid = false); /// Extra node data Data data; protected: /// Recursive function that does the adding of the data to the octree /// \param position The position to add the data at /// \param nodeData The data to store in the node /// \param level The number of levels down the octree to store the data /// \param currentLevel Used to keep track of the current level during recursive calls /// \return true if data is added bool doAddData(const SurgSim::Math::Vector3d& position, const Data& nodeData, const int level, const int currentLevel); bool doLoad(const std::string& filePath) override; /// The bounding box of the current OctreeNode SurgSim::Math::Aabbd m_boundingBox; /// True if there is any data inside this node, including data held by children, children's children, etc. bool m_isActive; /// True if the node has children bool m_hasChildren; /// The children of this node std::array>, 8> m_children; private: static std::string m_className; }; }; // namespace DataStructures }; // namespace SurgSim #include "SurgSim/DataStructures/OctreeNode-inl.h" #endif // SURGSIM_DATASTRUCTURES_OCTREENODE_H opensurgsim-0.7.0/SurgSim/DataStructures/OctreeNodePlyReaderDelegate-inl.h000066400000000000000000000040501277777236100267040ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DATASTRUCTURES_OCTREENODEPLYREADERDELEGATE_INL_H #define SURGSIM_DATASTRUCTURES_OCTREENODEPLYREADERDELEGATE_INL_H namespace SurgSim { namespace DataStructures { template OctreeNodePlyReaderDelegate::OctreeNodePlyReaderDelegate() : m_octree(std::make_shared>()) { static_assert(std::is_default_constructible::value, "OctreeNode Data needs default constructor."); } template OctreeNodePlyReaderDelegate::OctreeNodePlyReaderDelegate(std::shared_ptr> octree) : m_octree(octree) { static_assert(std::is_default_constructible::value, "OctreeNode Data needs default constructor"); SURGSIM_ASSERT(!m_octree->hasChildren()) << "Can't process an octree that already has children in it."; } template OctreeNodePlyReaderDelegate::~OctreeNodePlyReaderDelegate() { } template std::shared_ptr> OctreeNodePlyReaderDelegate::getOctree() { return m_octree; } template void OctreeNodePlyReaderDelegate::processVoxel(const std::string& elementName) { SurgSim::Math::Vector3d position; position[0] = m_voxel.x; position[1] = m_voxel.y; position[2] = m_voxel.z; m_octree->addData(position, m_numLevels); } template void OctreeNodePlyReaderDelegate::initializeOctree() { m_octree->m_boundingBox = m_boundingBox; } } } #endif opensurgsim-0.7.0/SurgSim/DataStructures/OctreeNodePlyReaderDelegate.cpp000066400000000000000000000136431277777236100264670ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/DataStructures/OctreeNodePlyReaderDelegate.h" #include "SurgSim/DataStructures/PlyReader.h" #include "SurgSim/Framework/Log.h" namespace SurgSim { namespace DataStructures { OctreeNodePlyReaderDelegateBase::OctreeNodePlyReaderDelegateBase() : m_haveSpacing(false), m_haveDimensions(false), m_haveBounds(false) { } OctreeNodePlyReaderDelegateBase::~OctreeNodePlyReaderDelegateBase() { } bool OctreeNodePlyReaderDelegateBase::registerDelegate(PlyReader* reader) { // Vertex processing reader->requestElement("bounds", std::bind(&OctreeNodePlyReaderDelegateBase::beginBounds, this, std::placeholders::_1, std::placeholders::_2), nullptr, nullptr); reader->requestScalarProperty("bounds", "xMin", PlyReader::TYPE_DOUBLE, offsetof(BoundsData, xMin)); reader->requestScalarProperty("bounds", "yMin", PlyReader::TYPE_DOUBLE, offsetof(BoundsData, yMin)); reader->requestScalarProperty("bounds", "zMin", PlyReader::TYPE_DOUBLE, offsetof(BoundsData, zMin)); reader->requestScalarProperty("bounds", "xMax", PlyReader::TYPE_DOUBLE, offsetof(BoundsData, xMax)); reader->requestScalarProperty("bounds", "yMax", PlyReader::TYPE_DOUBLE, offsetof(BoundsData, yMax)); reader->requestScalarProperty("bounds", "zMax", PlyReader::TYPE_DOUBLE, offsetof(BoundsData, zMax)); reader->requestElement("dimension", std::bind(&OctreeNodePlyReaderDelegateBase::beginDimension, this, std::placeholders::_1, std::placeholders::_2), nullptr, nullptr); reader->requestScalarProperty("dimension", "x", PlyReader::TYPE_UNSIGNED_INT, offsetof(DimensionData, x)); reader->requestScalarProperty("dimension", "y", PlyReader::TYPE_UNSIGNED_INT, offsetof(DimensionData, y)); reader->requestScalarProperty("dimension", "z", PlyReader::TYPE_UNSIGNED_INT, offsetof(DimensionData, z)); reader->requestElement("spacing", std::bind(&OctreeNodePlyReaderDelegateBase::beginSpacing, this, std::placeholders::_1, std::placeholders::_2), nullptr, nullptr); reader->requestScalarProperty("spacing", "x", PlyReader::TYPE_DOUBLE, offsetof(SpacingData, x)); reader->requestScalarProperty("spacing", "y", PlyReader::TYPE_DOUBLE, offsetof(SpacingData, y)); reader->requestScalarProperty("spacing", "z", PlyReader::TYPE_DOUBLE, offsetof(SpacingData, z)); reader->requestElement("voxel", std::bind(&OctreeNodePlyReaderDelegateBase::beginVoxel, this, std::placeholders::_1, std::placeholders::_2), std::bind(&OctreeNodePlyReaderDelegateBase::processVoxel, this, std::placeholders::_1), nullptr); reader->requestScalarProperty("voxel", "x", PlyReader::TYPE_DOUBLE, offsetof(VoxelData, x)); reader->requestScalarProperty("voxel", "y", PlyReader::TYPE_DOUBLE, offsetof(VoxelData, y)); reader->requestScalarProperty("voxel", "z", PlyReader::TYPE_DOUBLE, offsetof(VoxelData, z)); return true; } bool OctreeNodePlyReaderDelegateBase::fileIsAcceptable(const PlyReader& reader) { bool result = true; // Shortcut test if one fails ... result = result && reader.hasProperty("bounds", "xMin") && reader.hasProperty("bounds", "yMin") && reader.hasProperty("bounds", "zMin") && reader.hasProperty("bounds", "xMax") && reader.hasProperty("bounds", "yMax") && reader.hasProperty("bounds", "zMax"); result = result && reader.hasProperty("dimension", "x") && reader.hasProperty("dimension", "y") && reader.hasProperty("dimension", "z"); result = result && reader.hasProperty("spacing", "x") && reader.hasProperty("spacing", "y") && reader.hasProperty("spacing", "z"); result = result && reader.hasProperty("voxel", "x") && reader.hasProperty("voxel", "y") && reader.hasProperty("voxel", "z"); return result; } void* OctreeNodePlyReaderDelegateBase::beginBounds(const std::string& elementName, size_t count) { SURGSIM_ASSERT(count == 1) << "Bounds should only have exactly one entry."; m_haveBounds = true; return &m_bounds; } void* OctreeNodePlyReaderDelegateBase::beginDimension(const std::string& elementName, size_t count) { SURGSIM_ASSERT(count == 1) << "Dimension should only have exactly one entry."; m_haveDimensions = true; return &m_dimension; } void* OctreeNodePlyReaderDelegateBase::beginSpacing(const std::string& elementName, size_t count) { SURGSIM_ASSERT(count == 1) << "Spacing should only have exactly one entry."; m_haveSpacing = true; return &m_spacing; } void* OctreeNodePlyReaderDelegateBase::beginVoxel(const std::string& elementName, size_t count) { SURGSIM_ASSERT(m_haveSpacing) << "Need spacing data for complete octree."; SURGSIM_ASSERT(m_haveBounds) << "Need bounds data for complete octree."; SURGSIM_ASSERT(m_haveDimensions) << "Need dimension data for complete octree."; auto maxDimension = std::max(m_dimension.x, std::max(m_dimension.y, m_dimension.z)); m_numLevels = 1 + static_cast(std::ceil(std::log(maxDimension) / std::log(2.0))); SurgSim::Math::Vector3d octreeDimensions = SurgSim::Math::Vector3d::Ones() * std::pow(2.0, m_numLevels - 1); Math::Vector3d spacing(m_spacing.x, m_spacing.y, m_spacing.z); m_boundingBox.min() = Math::Vector3d(m_bounds.xMin, m_bounds.yMin, m_bounds.zMin); m_boundingBox.max() = Math::Vector3d(m_bounds.xMin, m_bounds.yMin, m_bounds.zMin).array() + octreeDimensions.array() * spacing.array(); initializeOctree(); return &m_voxel; } } } opensurgsim-0.7.0/SurgSim/DataStructures/OctreeNodePlyReaderDelegate.h000066400000000000000000000120221277777236100261220ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DATASTRUCTURES_OCTREENODEPLYREADERDELEGATE_H #define SURGSIM_DATASTRUCTURES_OCTREENODEPLYREADERDELEGATE_H #include "SurgSim/DataStructures/PlyReaderDelegate.h" #include "SurgSim/DataStructures/OctreeNode.h" #include "SurgSim/DataStructures/EmptyData.h" namespace SurgSim { namespace DataStructures { /// Delegate to read Octrees from ply files, this is the abstract base class, to let us modify /// loading by datatype class OctreeNodePlyReaderDelegateBase : public PlyReaderDelegate { public: /// Constructor OctreeNodePlyReaderDelegateBase(); /// Destructor virtual ~OctreeNodePlyReaderDelegateBase(); bool registerDelegate(PlyReader* reader) override; bool fileIsAcceptable(const PlyReader& reader) override; /// Callback function, begin the processing of the bounds. /// \param elementName Name of the element. /// \param count Number of entries. /// \throws SurgSim::Framework::AssertionFailure if count != 1, only one bounds entry is expected /// \return memory for bounds data to the reader. void* beginBounds(const std::string& elementName, size_t count); /// Callback function, begin the processing of the dimension. /// \param elementName Name of the element. /// \param count Number of entries. /// \throws SurgSim::Framework::AssertionFailure if count != 1, only one dimesion entry is expected /// \return memory for dimension data to the reader. void* beginDimension(const std::string& elementName, size_t count); /// Callback function, begin the processing of the bounds. /// \param elementName Name of the element. /// \param count Number of entries. /// \throws SurgSim::Framework::AssertionFailure if count != 1, only one spacing entry is expected /// \return memory for spacing data to the reader. void* beginSpacing(const std::string& elementName, size_t count); /// Callback function, begin the processing of the voxels. /// \param elementName Name of the element. /// \param count Number of bounds entry. /// \return memory for voxel data to the reader. virtual void* beginVoxel(const std::string& elementName, size_t count); /// Callback function to process one voxel. This is left up to the subclasses, they might have to deal with /// data specific processing /// \param elementName Name of the element. virtual void processVoxel(const std::string& elementName) = 0; protected: /// Set up the octree, this is left up to the derived classes virtual void initializeOctree() = 0; /// Data Structure to receive the bounds information struct BoundsData { double xMin; double yMin; double zMin; double xMax; double yMax; double zMax; } m_bounds; /// Bounding box, will be initialized from the file Eigen::AlignedBox m_boundingBox; /// Data structure to receive the spacing information from the file struct SpacingData { double x; double y; double z; } m_spacing; /// Data structure to receive the dimension information from the file struct DimensionData { unsigned int x; unsigned int y; unsigned int z; } m_dimension; /// Data structure to receive the specific voxel information from the file struct VoxelData { double x; double y; double z; } m_voxel; /// Calculated number of levels for the octree int m_numLevels; ///@{ /// Check wether we actually received the appropriate information, if not we can't initialize the octree bool m_haveSpacing; bool m_haveDimensions; bool m_haveBounds; ///@} }; /// Subclass the OctreeNodePLyReaderDelegateBase class to enable processing of the templated data, this should be /// specialized to enable specific processing of various extended node types /// \tparam Data The data the should be inside the Octree, needs to be default constructable template class OctreeNodePlyReaderDelegate : public OctreeNodePlyReaderDelegateBase { public: /// Constructor OctreeNodePlyReaderDelegate(); /// Constructor /// \param octree read the data into this octree explicit OctreeNodePlyReaderDelegate(std::shared_ptr> octree); /// Destructor virtual ~OctreeNodePlyReaderDelegate(); /// \return the octree std::shared_ptr> getOctree(); void processVoxel(const std::string& elementName) override; void initializeOctree() override; private: /// The octree that will be filled with the data from the file std::shared_ptr> m_octree; }; } } #include "SurgSim/DataStructures/OctreeNodePlyReaderDelegate-inl.h" #endif opensurgsim-0.7.0/SurgSim/DataStructures/OptionalValue.h000066400000000000000000000102331277777236100234140ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DATASTRUCTURES_OPTIONALVALUE_H #define SURGSIM_DATASTRUCTURES_OPTIONALVALUE_H #include "SurgSim/Framework/Assert.h" namespace SurgSim { namespace DataStructures { template /// Container class that can indicate whether the object has been assigned a value. /// \tparam Class of the value that this object contains class OptionalValue { public: /// Default Constructor, no value. OptionalValue() : m_hasValue(false) { } /// Constructor that assigns a value. /// \param value The value that should be used. explicit OptionalValue(const T& value) : m_hasValue(true), m_value(value) { } /// Copy constructor /// \param other The value used for copying. OptionalValue(const OptionalValue& other) : m_hasValue(other.m_hasValue) { if (m_hasValue) { m_value = other.m_value; } } /// Query if this object has been assigned a value. /// \return true if yes, false if not. bool hasValue() const { return m_hasValue; } /// Mark this object as invalid void invalidate() { m_hasValue = false; } /// Set the value of this object, and mark it as valid /// \param val The value of the object void setValue(const T& val) { m_hasValue = true; m_value = val; } /// Gets the value. /// \throws SurgSim::Framework::AssertionFailure if the value was not set /// \return The assigned value if set. const T& getValue() const { SURGSIM_ASSERT(m_hasValue) << "Tried to fetch a value from an invalid OptionalValue"; return m_value; } /// Gets the value /// \note do not implement T& operator*(), because *optionalValue = X; would not be able to set /// the hasValue() property properly. /// \throws SurgSim::Framework::AssertionFailure if the value was not set /// \return the contained value. const T& operator*() const { SURGSIM_ASSERT(m_hasValue) << "Tried to fetch a value from an invalid OptionalValue"; return m_value; } /// Equality operator. /// \param rhs The right hand side. /// \return true if the parameters are considered equivalent. bool operator==(const OptionalValue& rhs) const { if (m_hasValue == true && rhs.m_hasValue == true) { return m_value == rhs.m_value; } else { return m_hasValue == rhs.m_hasValue; } } /// Equality operator. /// \param rhs The right hand side with the specific template type. /// \return true if the parameters are considered equivalent. bool operator==(const T& rhs) const { if (m_hasValue) { return m_value == rhs; } else { return false; } } /// Inequality operator /// \param rhs the right hand side. /// \return true if the parameters are not considered equivalent bool operator!=(const OptionalValue& rhs) const { return !(*this == rhs); } /// Inequality operator /// \param rhs the right hand side. /// \return true if the parameters are not considered equivalent bool operator!=(const T& rhs) const { return !(*this == rhs); } /// Assignment operator. /// \param rhs The right hand side of the operator. /// \return reference to this. OptionalValue& operator=(const OptionalValue& rhs) { m_hasValue = rhs.m_hasValue; if (m_hasValue) { m_value = rhs.m_value; } return *this; } /// Assignment operator from template type, after this hasValue() is true even if the /// right hand side was not initialized /// \param rhs the value to be assigned to this optional value /// \return reference to this. OptionalValue& operator=(const T& rhs) { setValue(rhs); return *this; } private: bool m_hasValue; T m_value; }; }; // Datastructures }; // SurgSim #endif opensurgsim-0.7.0/SurgSim/DataStructures/PerformanceTests/000077500000000000000000000000001277777236100237465ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/DataStructures/PerformanceTests/CMakeLists.txt000066400000000000000000000017431277777236100265130ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2012-2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. include_directories( ${gtest_SOURCE_DIR}/include ) set(UNIT_TEST_SOURCES GridPerformanceTest.cpp NamedDataPerformanceTest.cpp ) set(UNIT_TEST_HEADERS ) set(LIBS SurgSimDataStructures ) surgsim_add_unit_tests(SurgSimDataStructuresPerformanceTest) set_target_properties(SurgSimDataStructuresPerformanceTest PROPERTIES FOLDER "DataStructures") opensurgsim-0.7.0/SurgSim/DataStructures/PerformanceTests/GridPerformanceTest.cpp000066400000000000000000000100231277777236100303550ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include #include "SurgSim/Framework/Timer.h" #include "SurgSim/DataStructures/Grid.h" namespace SurgSim { namespace DataStructures { /// This class test the grid timings for a given concentration of elements per cell and a given number of element per /// dimension. These two information are embedded in GTest WithParamInterface which takes a /// tuple class Grid3DPerformanceTests : public ::testing::Test, public ::testing::WithParamInterface> { public: typedef Eigen::Matrix Vector3ui; virtual void SetUp() { m_h = 0.1; m_bounds.min().setConstant(-pow(2, 10) / 2.0); m_bounds.max().setConstant(pow(2, 10) / 2.0); m_grid = std::make_shared>(Eigen::Matrix::Constant(m_h), m_bounds); } void addElementsUniformDistribution(const Vector3ui& numElementsPerAxis, double concentrationPerAxis) { double coef = m_h / static_cast(concentrationPerAxis); size_t elementId = 0; for (size_t x = 0; x < numElementsPerAxis[0]; x++) { for (size_t y = 0; y < numElementsPerAxis[1]; y++) { for (size_t z = 0; z < numElementsPerAxis[2]; z++) { SurgSim::Math::Vector3d point(x * coef, y * coef, z * coef); m_grid->addElement(elementId, point); elementId++; } } } } double performTimingTest(double concentrationPerCell, size_t numElementPerDimension) { SurgSim::Framework::Timer timer; Vector3ui numElementsPerAxis = Vector3ui::Constant(numElementPerDimension); double concentrationPerAxis = pow(concentrationPerCell, 1.0 / 3.0); timer.start(); // Clear the grid from all previously added elements and clear the neighbor's list m_grid->reset(); // Add all elements in the grid, triggering a dirty flag for the neighbor's list addElementsUniformDistribution(numElementsPerAxis, concentrationPerAxis); // Request any neighbor's list to force all neighbor's lists recalculation m_grid->getNeighbors(0); timer.endFrame(); return timer.getCumulativeTime(); } protected: /// Grid size (cells are cubic in this test) double m_h; /// Grid boundary Eigen::AlignedBox m_bounds; /// Grid std::shared_ptr> m_grid; }; TEST_P(Grid3DPerformanceTests, Grid3DTest) { double concentrationPerCell; size_t numElementsPerDimension; std::tie(concentrationPerCell, numElementsPerDimension) = GetParam(); size_t numElements = numElementsPerDimension * numElementsPerDimension * numElementsPerDimension; RecordProperty("ElementsPerCell", boost::to_string(concentrationPerCell)); RecordProperty("NumberOfElements", boost::to_string(numElements)); RecordProperty("Duration", boost::to_string(performTimingTest(concentrationPerCell, numElementsPerDimension))); } INSTANTIATE_TEST_CASE_P( Grid3D, Grid3DPerformanceTests, ::testing::Combine( // Concentration per cell is fine between 1 and 3^3, then coarser ::testing::Values(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 19.0, 20.0, 21.0, 22.0, 23.0, 24.0, 25.0, 26.0, 27.0, 4 * 4 * 4, 5 * 5 * 5, 6 * 6 * 6, 7 * 7 * 7, 8 * 8 * 8, 9 * 9 * 9, 10 * 10 * 10), // Number of elements per dimension ::testing::Values(50, 60, 60, 70, 80, 90, 100, 110, 120))); } // namespace DataStructures } // namespace SurgSim opensurgsim-0.7.0/SurgSim/DataStructures/PerformanceTests/NamedDataPerformanceTest.cpp000066400000000000000000000052131277777236100313130ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include #include #include #include "SurgSim/DataStructures/NamedData.h" #include "SurgSim/DataStructures/NamedDataBuilder.h" #include "SurgSim/Framework/Timer.h" namespace SurgSim { namespace DataStructures { class NamedDataTest : public ::testing::Test { public: virtual void SetUp() { numberOfLoops = 100000; const std::string array[] = {"uzgfk1f41V", "PbpZficBR2", "M3OYjZgHXX", "WVIEjG3QaX", "2o6nN2nuaW", "3rWXCXR2gi", "XO2dATxWFq", "M2xpjE6PAL", "cT1Bmj3Z1U", "65UtrrfXn7", "tNltVIcurd", "jFVkKzn17i", "0QlA0FAPc3", "jCXGBopngK", "GTwY4YyVnC", "0uVPK4S9Le", "iNdq3p6ZQb", "LfREPeFczN", "9RKdlFnm1I", "N2acPVhGY2"}; names = std::vector(std::begin(array), std::end(array)); NamedDataBuilder builder; for (std::string name : names) { builder.addEntry(name); } data = builder.createData(); for (int i = 0; i < static_cast(names.size()); ++i) { ASSERT_TRUE(data.set(i, i)); indices.push_back(i); } } virtual void TearDown() { } NamedData data; std::vector indices; std::vector names; int numberOfLoops; }; TEST_F(NamedDataTest, GetByName) { int value; const size_t numberOfEntries = names.size(); SurgSim::Framework::Timer timer; for (int i = 0; i < numberOfLoops; ++i) { for (size_t j = 0; j < numberOfEntries; ++j) { ASSERT_TRUE(data.get(names[j], &value)); } } timer.endFrame(); RecordProperty("Duration", boost::to_string(timer.getCumulativeTime())); } TEST_F(NamedDataTest, GetByIndex) { int value; const size_t numberOfEntries = indices.size(); SurgSim::Framework::Timer timer; for (int i = 0; i < numberOfLoops; ++i) { for (size_t j = 0; j < numberOfEntries; ++j) { ASSERT_TRUE(data.get(indices[j], &value)); } } timer.endFrame(); RecordProperty("Duration", boost::to_string(timer.getCumulativeTime())); } } // namespace DataStructures } // namespace SurgSim opensurgsim-0.7.0/SurgSim/DataStructures/PlyReader.cpp000066400000000000000000000257551277777236100230730ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/DataStructures/PlyReader.h" #include "SurgSim/DataStructures/PlyReaderDelegate.h" #include "SurgSim/DataStructures/ply.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Math/Vector.h" using SurgSim::Math::Vector3d; namespace SurgSim { namespace DataStructures { // Pimpl data, keep ply.h out of the SurgSim include chain struct PlyReader::Data { Data() : plyFile(nullptr), elementNames(nullptr) { types[TYPE_INVALID] = PLY_START_TYPE; types[TYPE_CHAR] = PLY_CHAR; types[TYPE_SHORT] = PLY_SHORT; types[TYPE_INT] = PLY_INT; types[TYPE_UNSIGNED_CHAR] = PLY_UCHAR; types[TYPE_UNSIGNED_SHORT] = PLY_USHORT; types[TYPE_UNSIGNED_INT] = PLY_UINT; types[TYPE_FLOAT] = PLY_FLOAT; types[TYPE_DOUBLE] = PLY_DOUBLE; } PlyFile* plyFile; int file_type; float version; int elementCount; char** elementNames; std::unordered_map types; }; PlyReader::PlyReader(const std::string& filename) : m_filename(filename), m_data(new Data()) { m_data->plyFile = ply_open_for_reading( filename.data(), &m_data->elementCount, &m_data->elementNames, &m_data->file_type, &m_data->version); SURGSIM_LOG_IF(!isValid(), SurgSim::Framework::Logger::getLogger("InputOutput"), WARNING) << "'" << m_filename << "' is an invalid .ply file"; } PlyReader::~PlyReader() { if (isValid()) { for (int i=0; i < m_data->elementCount; ++i) { free(m_data->elementNames[i]); } free(m_data->elementNames); ply_close(m_data->plyFile); m_data->plyFile = nullptr; } } bool PlyReader::isValid() const { return m_data->plyFile != nullptr; } bool PlyReader::requestElement(const std::string& elementName, std::function startElementCallback, std::function processElementCallback, std::function endElementCallback) { SURGSIM_ASSERT(isValid()) << "'" << m_filename << "' is an invalid .ply file"; bool result = false; if (hasElement(elementName) && m_requestedElements.find(elementName) == m_requestedElements.end()) { ElementInfo info; info.name = elementName; info.startElementCallback = startElementCallback; info.endElementCallback = endElementCallback; info.processElementCallback = processElementCallback; m_requestedElements[elementName] = info; result = true; } return result; } bool PlyReader::requestScalarProperty(const std::string& elementName, const std::string& propertyName, int dataType, int dataOffset) { return requestProperty(elementName, propertyName, dataType, dataOffset, 0, 0); } bool PlyReader::requestListProperty(const std::string& elementName, const std::string& propertyName, int dataType, int dataOffset, int countType, int countOffset) { return requestProperty(elementName, propertyName, dataType, dataOffset, countType, countOffset); } void PlyReader::setStartParseFileCallback(std::function startParseFileCallback) { m_startParseFileCallback = startParseFileCallback; } void PlyReader::setEndParseFileCallback(std::function endParseFileCallback) { m_endParseFileCallback = endParseFileCallback; } bool PlyReader::requestProperty(const std::string& elementName, const std::string& propertyName, int dataType, int dataOffset, int countType, int countOffset) { SURGSIM_ASSERT(isValid()) << "'" << m_filename << "' is an invalid .ply file"; SURGSIM_ASSERT(hasElement(elementName)) << "The element <" << elementName << "> has not been requested yet, you cannot access properties for it"; SURGSIM_ASSERT(hasProperty(elementName, propertyName)) << "The requested property <" << propertyName << "> cannot be found in element <" << elementName << ">."; bool result = false; bool scalar = isScalar(elementName, propertyName); bool wantScalar = (countType == 0); if (wantScalar && !scalar) { SURGSIM_FAILURE() << "Trying to access a list property as a scalar." << "for element <" << elementName << "> and property <" << propertyName << ">."; } else if (!wantScalar && scalar) { SURGSIM_FAILURE() << "Trying to access a scalar property as a list." << "for element <" << elementName << "> and property <" << propertyName << ">."; } if (hasProperty(elementName, propertyName) && (scalar == wantScalar)) { auto itBegin = std::begin(m_requestedElements[elementName].requestedProperties); auto itEnd = std::end(m_requestedElements[elementName].requestedProperties); bool doAdd = std::find_if(itBegin, itEnd, [propertyName](PropertyInfo p){return p.propertyName == propertyName;}) == itEnd; if (doAdd) { PropertyInfo info; info.propertyName = propertyName; info.dataType = m_data->types[dataType]; info.dataOffset = dataOffset; info.countType = m_data->types[countType]; info.countOffset = countOffset; m_requestedElements[elementName].requestedProperties.push_back(info); result = true; } } return result; } bool PlyReader::setDelegate(std::shared_ptr delegate) { SURGSIM_ASSERT(isValid()) << "'" << m_filename << "' is an invalid .ply file"; bool result = false; if (delegate != nullptr) { if (delegate->fileIsAcceptable(*this)) { result = delegate->registerDelegate(this); } } return result; } void PlyReader::parseFile() { SURGSIM_ASSERT(isValid()) << "'" << m_filename << "' is an invalid .ply file"; if (m_startParseFileCallback != nullptr) { m_startParseFileCallback(); } char* currentElementName; for (int elementIndex = 0; elementIndex < m_data->elementCount; ++elementIndex) { currentElementName = m_data->elementNames[elementIndex]; int numberOfElements; int propertyCount; // Free this after we are done with it PlyProperty** properties = ply_get_element_description(m_data->plyFile, currentElementName, &numberOfElements, &propertyCount); std::vector listOffsets; // Check if the user wanted this element, if yes process if (m_requestedElements.find(currentElementName) != m_requestedElements.end()) { ElementInfo& elementInfo = m_requestedElements[currentElementName]; // Build the propertyinfo structure for (size_t propertyIndex = 0; propertyIndex < elementInfo.requestedProperties.size(); ++propertyIndex) { PropertyInfo& propertyInfo = elementInfo.requestedProperties[propertyIndex]; PlyProperty requestedProperty = {nullptr, 0, 0, 0, 0, 0, 0, 0}; // Create temp char* std::vector writable(propertyInfo.propertyName.size() + 1); std::copy(propertyInfo.propertyName.begin(), propertyInfo.propertyName.end(), writable.begin()); requestedProperty.name = &writable[0]; requestedProperty.internal_type = propertyInfo.dataType; requestedProperty.offset = propertyInfo.dataOffset; requestedProperty.count_internal = propertyInfo.countType; requestedProperty.count_offset = propertyInfo.countOffset; requestedProperty.is_list = (propertyInfo.countType != 0) ? PLY_LIST : PLY_SCALAR; if (requestedProperty.is_list == PLY_LIST) { listOffsets.push_back(propertyInfo.dataOffset); } // Tell ply that we want this property to be read and put into the readbuffer ply_get_property(m_data->plyFile, currentElementName, &requestedProperty); } void* readBuffer = elementInfo.startElementCallback(currentElementName, numberOfElements); for (int element = 0; element < numberOfElements; ++element) { ply_get_element(m_data->plyFile, readBuffer); if (elementInfo.processElementCallback != nullptr) { try { elementInfo.processElementCallback(currentElementName); } catch (const std::exception&) { for (size_t i = 0; iname); free(properties[i]); } free(properties); throw; } } // Free the lists that where allocated by plyreader // This gains access to the buffer, where ply.c put the address of // the memory that was allocated to carry the information for the list property // it does that for all properties that where marked as lists for (size_t i = 0; iplyFile, currentElementName, numberOfElements); } // Free the data allocated in the ply_get_element_description call for (int i = 0; i < propertyCount; ++i) { free(properties[i]->name); free(properties[i]); } free(properties); } if (m_endParseFileCallback != nullptr) { m_endParseFileCallback(); } } bool PlyReader::parseWithDelegate(std::shared_ptr delegate) { bool result = setDelegate(delegate); if (result) { parseFile(); } return result; } bool PlyReader::hasElement(const std::string& elementName) const { SURGSIM_ASSERT(isValid()) << "'" << m_filename << "' is an invalid .ply file"; return find_element(m_data->plyFile, elementName.c_str()) != nullptr; } bool PlyReader::hasProperty(const std::string& elementName, const std::string& propertyName) const { SURGSIM_ASSERT(isValid()) << "'" << m_filename << "' is an invalid .ply file"; bool result = false; PlyElement* element = find_element(m_data->plyFile, elementName.c_str()); if (element != nullptr) { int index; result = find_property(element, propertyName.c_str(), &index) != nullptr; } return result; } bool PlyReader::isScalar(const std::string& elementName, const std::string& propertyName) const { SURGSIM_ASSERT(isValid()) << "'" << m_filename << "' is an invalid .ply file"; bool result = false; PlyElement* element = find_element(m_data->plyFile, elementName.c_str()); if (element != nullptr) { int index; PlyProperty* property = find_property(element, propertyName.c_str(), &index); if (property != nullptr) { result = (property->is_list == PLY_SCALAR); } } return result; } } // namespace DataStructures } // namespace SurgSim opensurgsim-0.7.0/SurgSim/DataStructures/PlyReader.h000066400000000000000000000305301277777236100225230ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DATASTRUCTURES_PLYREADER_H #define SURGSIM_DATASTRUCTURES_PLYREADER_H #include #include #include #include #include namespace SurgSim { namespace DataStructures { class PlyReaderDelegate; /// Wrapper for the C .ply file parser /// This class wraps the main functionality for the original C .ply file parser at /// http://paulbourke.net/dataformats/ply/ /// it enables customization of the parsing process either through a delegate class or through executing /// the requestElement and requestProperty functions. /// The file needs to be a valid .ply file, either ascii or binary, for the reader to be a valid reader. /// ## General Information /// A ply file consists of a header description followed by the data, a header might look like this /// ply /// format ascii 1.0 { ascii/binary, format version number } /// comment made by Greg Turk { comments keyword specified, like all lines } /// comment this file is a cube /// element vertex 8 { define "vertex" element, 8 of them in file } /// property float x { vertex contains float "x" coordinate } /// property float y { y coordinate is also a vertex property } /// property float z { z coordinate, too } /// element face 6 { there are 6 "face" elements in the file } /// property list uchar int vertex_indices { "vertex_indices" is a list of ints } /// end_header { delimits the end of the header } /// /// As you can see there are elements with properties, there can be multiple elements and multiple /// properties per element. An element can have scalar and/or list properties. /// To work correctly users will have to preallocate the memory that will be used by the parser /// to deposit the information from the file, and set offsets to the correct value to match /// the expected locations in the preallocated receiving memory. /// /// ## Initialisation /// The constructor for the PlyReader accepts the file name of the file, it will make sure /// the the file exists and is actually a .ply file, after the constructor has executed /// isValid() should be true. At this time all the information in the header is available and /// users of the reader can tell the reader which elements and which properties are of interest /// using the requestElement() and requestProperty() functions. /// /// ## The three types of callback functions /// Parsing is accomplished via a set of callback functions. There are three kinds of callback /// function each with a different responsibility. /// - The BeginElement callback is called whenever the section for an element is encountered in /// the file, it will pass the name of the element and the number of elements that will be read /// it should return a pointer to the preallocated memory that will be used for reading. /// /// - The ProcessElement callback is called whenever a new element has been read from the file, /// the read values can be copied from the preallocated memory that was sent to the parser in the /// previous callback. If list data was requested, the memory for the list data needs to be freed /// at this time. /// /// - The EndElement callback is called whenever processing of the element is concluded, this /// gives users a chance to finalize processing on their side. /// /// ## The delegate /// The PlyReaderDelegate interface should be used to create classes that encapsulate the needed /// callbacks and their processing. class PlyReader { public: /// Values that represent the data type/size of requested data. enum Type { TYPE_INVALID = 0, TYPE_CHAR, TYPE_SHORT, TYPE_INT, TYPE_UNSIGNED_CHAR, TYPE_UNSIGNED_SHORT, TYPE_UNSIGNED_INT, TYPE_FLOAT, TYPE_DOUBLE, TYPE_COUNT }; /// The callback that is being used to indicate the start of an element, the parameters that are passed /// into the callback are the name of the element that is being processed and the number of elements /// that will be processed. The callback needs to return allocated memory that is used by the reader /// to deposit the read information typedef std::function StartElementCallbackType; /// The callback that is used for the processing and the end of processing, the parameter passed is /// the name of the element that is being processed. typedef std::function StandardCallbackType; /// Constructor. /// \param filename Filename of the .ply file. explicit PlyReader(const std::string& filename); /// Destructor. virtual ~PlyReader(); /// Query if this object is valid. /// \return true if the file was successfully opened, false if not. bool isValid() const; /// Request element to be processed during parsing. /// /// \param elementName Name of the element that is needed. /// \param startElementCallback The callback to be used when the element is first encountered. /// \param processElementCallback The callback to be used when one element of this type is read. /// \param endElementCallback The callback to be used when all of the elements of this type have been read. /// /// \return true if there is a element elementName in the .ply file and it has not been requested yet. bool requestElement(const std::string& elementName, std::function startElementCallback, std::function processElementCallback, std::function endElementCallback); /// Request a scalar property for parsing. /// Use this for when you want the information from a scalar property from the .ply file. With this call /// you register the type that you want for storing the data and the offset in the data structure where the /// information should be stored. The data actually comes from the startElementCallback that was supplied /// in the previous call /// \warning If the offset is wrong or the data type provided and the actual data type in your structure /// does not match there could be a buffer overrun, use this with caution /// \param elementName Name of the element that contains this property. /// \param propertyName Name of the property that you want stored. /// \param dataType The type of the data that should be stored. /// \param dataOffset The offset of the data in your data structure where the data should be stored. /// \return true if the property exists and has not been registered yet and is a scalar property, /// otherwise false. bool requestScalarProperty(const std::string& elementName, const std::string& propertyName, int dataType, int dataOffset); /// Request a list property for parsing. /// Use this for when you want the information from a list property from the .ply file. The item in your /// data structure should be a pointer of the type of data that you want, the reader will allocate the needed /// space and deposit all the items in the list in this space. /// \warning If the offset is wrong or the data type provided and the actual data type in your structure /// does not match there could be a buffer overrun, use this with caution. /// \param elementName Name of the element that contains this property. /// \param propertyName Name of the property that you want stored. /// \param dataType The type of the data that should be stored. /// \param dataOffset The offset of the data in your data structure where the data should be stored. /// \param countType The type of the number of element that should be stored. /// \param countOffset The offset for storing the count. /// /// \return true if it succeeds, false if it fails. bool requestListProperty(const std::string& elementName, const std::string& propertyName, int dataType, int dataOffset, int countType, int countOffset); /// Query if this elementName is in the .ply file /// \param elementName Name of the element. /// \return true if yes, false otherwise. bool hasElement(const std::string& elementName) const; /// Query if 'elementName' has the given property. /// \param elementName Name of the element. /// \param propertyName Name of the property. /// \return true if the element exists and has the property, false otherwise. bool hasProperty(const std::string& elementName, const std::string& propertyName) const; /// Query if the property of the give element is scalar. /// \param elementName Name of the element. /// \param propertyName Name of the property. /// \return true if the element exists and has the property and it is a scalar value. bool isScalar(const std::string& elementName, const std::string& propertyName) const; /// Sets a delegate for parsing and then parse the file. /// \param delegate The delegate. /// \return true if set and parse are successful; otherwise false. bool parseWithDelegate(std::shared_ptr delegate); /// Register callback to be called at the begining of parseFile. void setStartParseFileCallback(std::function startParseFileCallback); /// Register callback to be called at the end of parseFile. void setEndParseFileCallback(std::function endParseFileCallback); /// Sets a delegate for parsing. /// \param delegate The delegate. /// \return true if it succeeds and the properties in the ply file satisfy the delegates fileIsAcceptable(). bool setDelegate(std::shared_ptr delegate); /// Parse the file. void parseFile(); private: friend class PlyReaderTests; /// Generic Internal function to handle list and scalar properties, see requestScalarProperty() and /// requestListProperty() for full documentation. /// \param elementName Name of the element that contains this property. /// \param propertyName Name of the property that you want stored. /// \param dataType The type of the data that should be stored. /// \param dataOffset The offset of the data in your data structure where the data should be stored. /// \param countType The type of the number of element that should be stored. /// \param countOffset The offset for storing the count. /// /// \return true if it succeeds, false if it fails. bool requestProperty(const std::string& elementName, const std::string& propertyName, int dataType, int dataOffset, int countType, int countOffset); /// The name of the .ply file std::string m_filename; /// Information about the property on the .ply file. struct PropertyInfo { std::string propertyName; ///< Name of the property. int dataType; ///< Type of the receiving data. int dataOffset; ///< Location for the receiving data. int countType; ///< For lists, type of the receiving data for the count of listelements. int countOffset; ///< For lists, location of the receiving data for the count. }; /// Information about the element in the .ply file. struct ElementInfo { std::string name; ///< Name of the element StartElementCallbackType startElementCallback; ///< Callback to be used when the element is first encountered. StandardCallbackType processElementCallback; ///< Callback to be used for each processed element. StandardCallbackType endElementCallback; ///< Callback to be used after all the elements have been processed. std::vector requestedProperties; ///< All the properties that are wanted }; std::unordered_map m_requestedElements; ///@{ /// Pimpl Data to wrap ply reader local information struct Data; std::unique_ptr m_data; ///@} /// The delegate. std::shared_ptr m_delegate; /// Callback to be executed at the start of 'parseFile'. std::function m_startParseFileCallback; /// Callback to be executed at the end of 'parseFile'. std::function m_endParseFileCallback; }; } // DataStructures } // SurgSim #endif // SURGSIM_DATASTRUCTURES_PLYREADER_Hopensurgsim-0.7.0/SurgSim/DataStructures/PlyReaderDelegate.h000066400000000000000000000032131277777236100241540ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DATASTRUCTURES_PLYREADERDELEGATE_H #define SURGSIM_DATASTRUCTURES_PLYREADERDELEGATE_H namespace SurgSim { namespace DataStructures { class PlyReader; /// PlyReaderDelegate abstract class. /// The purpose of this class is to customize the parsing and contain the callback functions that /// are being used in the parsing process. class PlyReaderDelegate { public: /// Virtual destructor. virtual ~PlyReaderDelegate() { } /// Registers the delegate with the reader. /// \param [out] reader The reader that should be used by the delegate. /// \return true usually if the reader is valid and fileIsAcceptable() is true. virtual bool registerDelegate(PlyReader* reader) = 0; /// Check whether the file in the reader can be used with this delegate, /// this gives the delegate a chance to make sure that all the elements and /// properties that are required are available in the file encapsulated by /// the reader virtual bool fileIsAcceptable(const PlyReader& reader) = 0; }; } } #endif opensurgsim-0.7.0/SurgSim/DataStructures/SegmentEmptyData.h000066400000000000000000000023611277777236100240500ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DATASTRUCTURES_SEGMENTEMPTYDATA_H #define SURGSIM_DATASTRUCTURES_SEGMENTEMPTYDATA_H namespace SurgSim { namespace DataStructures { /// SegmentEmptyData class /// This class is to ensure that the static TriangleMesh::m_className in SegmentMesh does not clash with /// static TriangleMesh. class SegmentEmptyData { public: /// Comparison operator /// \param data The data to compare it to. /// \return true for all cases. bool operator==(const SegmentEmptyData& data) const { return true; } }; } } #endif //SURGSIM_DATASTRUCTURES_SEGMENTEMPTYDATA_H opensurgsim-0.7.0/SurgSim/DataStructures/SegmentMesh-inl.h000066400000000000000000000156461277777236100236460ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DATASTRUCTURES_SEGMENTMESH_INL_H #define SURGSIM_DATASTRUCTURES_SEGMENTMESH_INL_H #include "SurgSim/Framework/Log.h" namespace SurgSim { namespace DataStructures { template SegmentMesh::SegmentMesh() { } template SegmentMesh::SegmentMesh( const SegmentMesh& other) : TriangleMeshType(other) { } template template SegmentMesh::SegmentMesh(const SegmentMesh& other) : TriangleMeshType(other) { } template SegmentMesh::~SegmentMesh() { } template SegmentMesh::SegmentMesh(SegmentMesh&& other) : TriangleMeshType(std::move(other)) { } template SegmentMesh& SegmentMesh::operator=( const SegmentMesh& other) { return TriangleMeshType::operator=(other); } template SegmentMesh& SegmentMesh::operator=( SegmentMesh&& other) { return TriangleMeshType::operator=(std::move(other)); } template size_t SegmentMesh::addTriangle(const TriangleType& triangle) { SURGSIM_FAILURE() << "Cannot insert triangle into segment mesh."; return static_cast(0); } template size_t SegmentMesh::getNumTriangles() const { SURGSIM_FAILURE() << "No triangles present in segment mesh."; return static_cast(0); } template const std::vector::TriangleType>& SegmentMesh::getTriangles() const { SURGSIM_FAILURE() << "No triangles present in segment mesh."; return TriangleMeshType::getTriangles(); } template std::vector::TriangleType>& SegmentMesh::getTriangles() { SURGSIM_FAILURE() << "No triangles present in segment mesh."; return TriangleMeshType::getTriangles(); } template const typename SegmentMesh::TriangleType& SegmentMesh::getTriangle(size_t id) const { SURGSIM_FAILURE() << "No triangles present in segment mesh."; return TriangleMeshType::getTriangle(id); } template typename SegmentMesh::TriangleType& SegmentMesh::getTriangle(size_t id) { SURGSIM_FAILURE() << "No triangles present in segment mesh."; return TriangleMeshType::getTriangle(id); } template void SegmentMesh::removeTriangle(size_t id) { SURGSIM_FAILURE() << "No triangles present in segment mesh."; } template std::array SegmentMesh::getTrianglePositions(size_t id) const { using SurgSim::Math::Vector3d; SURGSIM_FAILURE() << "No triangles present in segment mesh."; std::array result = { { Vector3d::Zero(), Vector3d::Zero(), Vector3d::Zero() } }; return result; } template void SegmentMesh::doClearTriangles() { SURGSIM_FAILURE() << "No triangles present in segment mesh."; } template void SegmentMesh::doClear() { TriangleMeshType::doClearEdges(); TriangleMeshType::doClearVertices(); } template void SurgSim::DataStructures::SegmentMesh::createDefaultEdges() { doClearEdges(); for (size_t i = 0; i < getNumVertices() - 1; ++i) { std::array vertices = { i, i + 1 }; EdgeType edge(vertices); addEdge(edge); } } template bool SegmentMesh::save(const std::string& fileName, bool asPhysics, double radius, double massDensity, double poissonRatio, double youngsModulus) { std::fstream out(fileName, std::ios::out); if (out.is_open()) { out << "ply" << std::endl; out << "format ascii 1.0" << std::endl; out << "comment Created by OpenSurgSim, www.opensurgsim.org" << std::endl; out << "element vertex " << getNumVertices() << std::endl; out << "property float x\nproperty float y\nproperty float z" << std::endl; if (asPhysics) { out << "element 1d_element " << getNumEdges() << std::endl; out << "property list uint uint vertex_indices" << std::endl; out << "element radius 1" << std::endl; out << "property double value" << std::endl; out << "element material 1" << std::endl; out << "property double mass_density" << std::endl; out << "property double poisson_ratio" << std::endl; out << "property double young_modulus" << std::endl; out << "element boundary_condition 0" << std::endl; out << "property uint vertex_index" << std::endl; } else { out << "element edge " << getNumEdges() << std::endl; out << "property uint vertex1" << std::endl; out << "property uint vertex2" << std::endl; } out << "end_header" << std::endl; for (const auto& vertex : getVertices()) { out << vertex.position[0] << " " << vertex.position[1] << " " << vertex.position[2] << std::endl; } for (const auto& edge : getEdges()) { if (asPhysics) { out << "2 "; } out << edge.verticesId[0] << " " << edge.verticesId[1] << std::endl; } if (asPhysics) { out << radius << std::endl; out << massDensity << " " << poissonRatio << " " << youngsModulus << std::endl; } if (out.bad()) { SURGSIM_LOG_WARNING(SurgSim::Framework::Logger::getDefaultLogger()) << __FUNCTION__ << "There was a problem writing " << fileName; } out.close(); } else { SURGSIM_LOG_WARNING(SurgSim::Framework::Logger::getDefaultLogger()) << __FUNCTION__ << "Could not open " << fileName << " for writing."; return false; } return true; } } // namespace DataStructures } // namespace SurgSim #endif // SURGSIM_DATASTRUCTURES_SEGMENTMESH_INL_H opensurgsim-0.7.0/SurgSim/DataStructures/SegmentMesh.cpp000066400000000000000000000016601277777236100234100ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/DataStructures/SegmentMesh.h" namespace SurgSim { namespace DataStructures { template <> std::string SegmentMesh::TriangleMeshType::m_className = "SurgSim::DataStructures::SegmentMeshPlain"; } // namespace DataStructures } // namespace SurgSim opensurgsim-0.7.0/SurgSim/DataStructures/SegmentMesh.h000066400000000000000000000116631277777236100230610ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DATASTRUCTURES_SEGMENTMESH_H #define SURGSIM_DATASTRUCTURES_SEGMENTMESH_H #include "SurgSim/DataStructures/SegmentEmptyData.h" #include "SurgSim/DataStructures/TriangleMesh.h" namespace SurgSim { namespace DataStructures { /// Class to hold the type of a SegmentMesh. /// /// \tparam VertexData Type of extra data stored in each vertex /// \tparam EdgeData Type of extra data stored in each edge /// \sa TriangleMesh template class SegmentMesh : public TriangleMesh { public: /// TriangleMesh type for convenience typedef TriangleMesh TriangleMeshType; /// Edge type for convenience (Ids of the 2 vertices) typedef typename TriangleMeshType::EdgeType EdgeType; /// Triangle type for convenience (Ids of the 3 vertices) typedef typename TriangleMeshType::TriangleType TriangleType; /// Constructor. The mesh is initially empty (no vertices, no edges). SegmentMesh(); /// Copy constructor when the template data is the same type /// \param other the mesh to copy from SegmentMesh(const SegmentMesh& other); /// Copy constructor when the template data is a different type /// \tparam V Type of extra data stored in each vertex /// \tparam E Type of extra data stored in each edge /// \param other The mesh to be copied from. Vertex and edge data will not be copied /// \note: Data of the input mesh, i.e. VertexDataSource, EdgeDataSource will not be copied. template explicit SegmentMesh(const SegmentMesh& other); /// Destructor virtual ~SegmentMesh(); /// Move Constructor /// \param other Constructor source SegmentMesh(SegmentMesh&& other); /// Copy Assignment /// \param other Assignment source SegmentMesh& operator=( const SegmentMesh& other); /// Move Assignment /// \param other Assignment source SegmentMesh& operator=( SegmentMesh&& other); /// Creates edges for all vertices in the mesh connecting all the points consecutively /// \note This will clear all the current edges void createDefaultEdges(); /// Save the current structure to a ply file /// \param fileName Name of the file for writing /// \param asPhysics Format the file to be used as a physics file, otherwise the file will be ply format /// with 'edge' as the edge element /// \param radius if asPhysics is true, this will be used as the radius for the ply file /// \param massDensity if asPhysics is true, this will be used as the massDensity for the ply file /// \param poissonRatio if asPhysics is true, this will be used as the poissonRatio for the ply file /// \param youngsModulus if asPhysics is true, this will be used as the youngsModulus for the ply file /// \return true if the file was written successfully bool save(const std::string& fileName, bool asPhysics = true, double radius = 0.0001, double massDensity = 900, double poissonRatio = 0.45, double youngsModulus = 1.75e9); using TriangleMesh::addEdge; using TriangleMesh::doClearEdges; using TriangleMesh::getNumEdges; using TriangleMesh::getNumVertices; using TriangleMesh::getEdges; using TriangleMesh::getVertices; ///@{ /// Functions that need to assert, because they deal with triangles. size_t addTriangle(const TriangleType& triangle); size_t getNumTriangles() const; const std::vector& getTriangles() const; std::vector& getTriangles(); const TriangleType& getTriangle(size_t id) const; TriangleType& getTriangle(size_t id); void removeTriangle(size_t id); std::array getTrianglePositions(size_t id) const; void doClearTriangles() override; ///@} private: /// Clear mesh to return to an empty state (no vertices, no edges). void doClear() override; }; typedef SegmentMesh SegmentMeshPlain; } // namespace DataStructures } // namespace SurgSim #include "SurgSim/DataStructures/SegmentMesh-inl.h" #endif // SURGSIM_DATASTRUCTURES_SEGMENTMESH_H opensurgsim-0.7.0/SurgSim/DataStructures/TetrahedronMesh-inl.h000066400000000000000000000223171277777236100245140ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DATASTRUCTURES_TETRAHEDRONMESH_INL_H #define SURGSIM_DATASTRUCTURES_TETRAHEDRONMESH_INL_H namespace SurgSim { namespace DataStructures { template TetrahedronMesh:: TetrahedronMesh() { } template TetrahedronMesh:: ~TetrahedronMesh() { } template size_t TetrahedronMesh:: addEdge(const EdgeType& edge) { m_edges.push_back(edge); return m_edges.size() - 1; } template size_t TetrahedronMesh:: addTriangle(const TriangleType& triangle) { m_triangles.push_back(triangle); return m_triangles.size() - 1; } template size_t TetrahedronMesh:: addTetrahedron(const TetrahedronType& tetrahedron) { m_tetrahedrons.push_back(tetrahedron); return m_tetrahedrons.size() - 1; } template size_t TetrahedronMesh:: getNumEdges() const { return m_edges.size(); } template size_t TetrahedronMesh:: getNumTriangles() const { return m_triangles.size(); } template size_t TetrahedronMesh:: getNumTetrahedrons() const { return m_tetrahedrons.size(); } template const std::vector::EdgeType>& TetrahedronMesh:: getEdges() const { return m_edges; } template std::vector::EdgeType>& TetrahedronMesh:: getEdges() { return m_edges; } template const std::vector::TriangleType>& TetrahedronMesh:: getTriangles() const { return m_triangles; } template std::vector::TriangleType>& TetrahedronMesh:: getTriangles() { return m_triangles; } template const std::vector::TetrahedronType>& TetrahedronMesh:: getTetrahedrons() const { return m_tetrahedrons; } template std::vector::TetrahedronType>& TetrahedronMesh:: getTetrahedrons() { return m_tetrahedrons; } template const typename TetrahedronMesh::EdgeType& TetrahedronMesh:: getEdge(size_t id) const { return m_edges[id]; } template typename TetrahedronMesh::EdgeType& TetrahedronMesh:: getEdge(size_t id) { return m_edges[id]; } template const typename TetrahedronMesh::TriangleType& TetrahedronMesh:: getTriangle(size_t id) const { return m_triangles[id]; } template typename TetrahedronMesh::TriangleType& TetrahedronMesh:: getTriangle(size_t id) { return m_triangles[id]; } template const typename TetrahedronMesh::TetrahedronType& TetrahedronMesh:: getTetrahedron(size_t id) const { return m_tetrahedrons[id]; } template typename TetrahedronMesh::TetrahedronType& TetrahedronMesh:: getTetrahedron(size_t id) { return m_tetrahedrons[id]; } template bool TetrahedronMesh:: isValid() const { typedef typename TetrahedronMesh::EdgeType EdgeType; typedef typename TetrahedronMesh::TriangleType TriangleType; typedef typename TetrahedronMesh::TetrahedronType TetrahedronType; size_t numVertices = Vertices::getNumVertices(); // Test edges validity for (typename std::vector::const_iterator it = m_edges.begin(); it != m_edges.end(); it++) { for (size_t vertexId = 0; vertexId < 2; vertexId++) { if (it->verticesId[vertexId] >= numVertices) { return false; } } } // Test triangles validity for (typename std::vector::const_iterator it = m_triangles.begin(); it != m_triangles.end(); it++) { for (size_t vertexId = 0; vertexId < 3; vertexId++) { if (it->verticesId[vertexId] >= numVertices) { return false; } } } // Test tetrahedrons validity for (typename std::vector::const_iterator it = m_tetrahedrons.begin(); it != m_tetrahedrons.end(); it++) { for (size_t vertexId = 0; vertexId < 4; vertexId++) { if (it->verticesId[vertexId] >= numVertices) { return false; } } } return true; } template void TetrahedronMesh:: doClearEdges() { m_edges.clear(); } template void TetrahedronMesh:: doClearTriangles() { m_triangles.clear(); } template void TetrahedronMesh:: doClearTetrahedrons() { m_tetrahedrons.clear(); } template bool TetrahedronMesh:: isEqual(const Vertices& mesh) const { const TetrahedronMesh& tetrahedronMesh = static_cast(mesh); return Vertices::isEqual(mesh) && m_edges == tetrahedronMesh.getEdges() && m_triangles == tetrahedronMesh.getTriangles() && m_tetrahedrons == tetrahedronMesh.getTetrahedrons(); } template void TetrahedronMesh:: doClear() { doClearTetrahedrons(); doClearTriangles(); doClearEdges(); Vertices::doClearVertices(); } }; // namespace DataStructures }; // namespace SurgSim #endif // SURGSIM_DATASTRUCTURES_TETRAHEDRONMESH_INL_H opensurgsim-0.7.0/SurgSim/DataStructures/TetrahedronMesh.h000066400000000000000000000210531277777236100237300ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DATASTRUCTURES_TETRAHEDRONMESH_H #define SURGSIM_DATASTRUCTURES_TETRAHEDRONMESH_H #include #include "SurgSim/DataStructures/MeshElement.h" #include "SurgSim/DataStructures/Vertices.h" namespace SurgSim { namespace DataStructures { /// Basic class for storing Tetrahedron Meshes, handling basic vertex, edge, triangle and tetrahedron functionality. /// /// TetrahedronMesh is to be used purely as a data structure and not provide implementation of algorithms. /// For example, a physics 3D FEM is not a subclass of TetrahedronMesh, but may use a TetrahedronMesh for storing the /// structure of the FEM. /// /// It is recommended that subclasses with a specific purpose (such as for use in collision detection) provide /// convenience methods for creation of vertices, edges, triangles, tetrahedrons and the data each contains. /// Methods such as createVertex(position, other data...), createEdge(vertices, other data...), /// createTriangle(vertices, other data...) and createTetrahedron(vertices, other data...) simplify the creation of /// vertices and elements and the data required. /// These methods would use the addVertex(), addEdge(), addTriangle() and addTetrahedron() methods to add the created /// vertices and elements to the TetrahedronMesh. /// /// Overriding isEqual(const Mesh&) is necessary to do more than just basic list comparison of the /// vertices, edges, triangles and tetrahedrons which is dependent on order in the list. /// /// Override doUpdate() to provide update functionality when vertices are changed, such as recalculating surface /// normals. /// /// A subclass that is designed for a specific use (such as collision detection) may also specify the VertexData, /// EdgeData, TriangleData and TetrahedronData to what is required. /// /// \tparam VertexData Type of extra data stored in each vertex /// \tparam EdgeData Type of extra data stored in each edge /// \tparam TriangleData Type of extra data stored in each triangle /// \tparam TetrahedronData Type of extra data stored in each tetrahedron /// \sa Vertices /// \sa MeshElement template class TetrahedronMesh : public Vertices { public: /// Edge type for convenience (Ids of the 2 vertices) typedef MeshElement<2, EdgeData> EdgeType; /// Triangle type for convenience (Ids of the 3 vertices) typedef MeshElement<3, TriangleData> TriangleType; /// Tetrahedron type for convenience (Ids of the 4 vertices) typedef MeshElement<4, TetrahedronData> TetrahedronType; /// Constructor. The mesh is initially empty (no vertices, no edges, no triangles, no tetrahedrons). TetrahedronMesh(); /// Destructor virtual ~TetrahedronMesh(); /// Adds an edge to the mesh. /// No checking on the edge's vertices is performed. /// Recommend that subclasses with a specific purpose (such as for use in collision detection) have a /// createEdge(vertices, other data...) method which performs any checking desired and sets up the edge data based /// on the vertices and other parameters. /// \param edge Edge to add to the mesh /// \return Unique ID of the new edge. size_t addEdge(const EdgeType& edge); /// Adds a triangle to the mesh. /// \param triangle Triangle to add to the mesh /// Recommend that subclasses with a specific purpose (such as for use in collision detection) have a /// createTriangle(vertices, other data...) method which performs any checking desired and sets up the triangle data /// based on the vertices and other parameters. /// \return Unique ID of the new triangle. size_t addTriangle(const TriangleType& triangle); /// Adds a tetrahedron to the mesh. /// \param tetrahedron Tetrahedron to add to the mesh /// Recommend that subclasses with a specific purpose (such as for use in collision detection) have a /// createTetrahedron(vertices, other data...) method which performs any checking desired and sets up the /// tetrahedron data based on the vertices and other parameters. /// \return Unique ID of the new tetrahedron. size_t addTetrahedron(const TetrahedronType& tetrahedron); /// Returns the number of edges in this mesh. /// \return The number of edges size_t getNumEdges() const; /// Returns the number of triangles in this mesh. /// \return The number of triangles size_t getNumTriangles() const; /// Returns the number of tetrahedrons in this mesh. /// \return The number of tetrahedrons size_t getNumTetrahedrons() const; /// Returns a vector containing the position of each edge. /// \return The vector containing all edges const std::vector& getEdges() const; /// Returns a vector containing the position of each edge (non const version). /// \return The vector containing all edges std::vector& getEdges(); /// Returns a vector containing the position of each triangle. /// \return The vector containing all triangles const std::vector& getTriangles() const; /// Returns a vector containing the position of each triangle (non const version). /// \return The vector containing all triangles std::vector& getTriangles(); /// Returns a vector containing the position of each tetrahedron. /// \return The vector containing all tetrahedrons const std::vector& getTetrahedrons() const; /// Returns a vector containing the position of each tetrahedron (non const version). /// \return The vector containing all tetrahedrons std::vector& getTetrahedrons(); /// Returns the specified edge. /// \param id The edge's id /// \return The edge id /// \note No check is performed on the id const EdgeType& getEdge(size_t id) const; /// Returns the specified edge (non const version). /// \param id The edge's id /// \return The edge id /// \note No check is performed on the id EdgeType& getEdge(size_t id); /// Returns the specified triangle. /// \param id The triangle's id /// \return The triangle id /// \note No check is performed on the id const TriangleType& getTriangle(size_t id) const; /// Returns the specified triangle (non const version). /// \param id The triangle's id /// \return The triangle id /// \note No check is performed on the id TriangleType& getTriangle(size_t id); /// Returns the specified tetrahedron. /// \param id The tetrahedron's id /// \return The tetrahedron id /// \note No check is performed on the id const TetrahedronType& getTetrahedron(size_t id) const; /// Returns the specified tetrahedron (non const version). /// \param id The tetrahedron's id /// \return The tetrahedron id /// \note No check is performed on the id TetrahedronType& getTetrahedron(size_t id); /// Test if the TetrahedronMesh is valid (valid vertex Ids used in all MeshElements) /// \return True if the TetrahedronMesh is valid, False otherwise (the topology is then broken) bool isValid() const; protected: /// Remove all edges from the mesh. virtual void doClearEdges(); /// Remove all triangles from the mesh. virtual void doClearTriangles(); /// Remove all tetrahedrons from the mesh. virtual void doClearTetrahedrons(); /// Internal comparison of meshes of the same type: returns true if equal, false if not equal. /// Override this method to provide custom comparison. Basic TriangleMesh implementation compares vertices, /// edges and triangles: the order of vertices, edges, and triangles must also match to be considered equal. /// \param mesh Mesh must be of the same type as that which it is compared against virtual bool isEqual(const Vertices& mesh) const; private: /// Clear mesh to return to an empty state (no vertices, no edges, no triangles, no m_tetrahedrons). virtual void doClear(); /// Edges std::vector m_edges; /// Triangles std::vector m_triangles; /// Tetrahedrons std::vector m_tetrahedrons; }; }; // namespace DataStructures }; // namespace SurgSim #include "SurgSim/DataStructures/TetrahedronMesh-inl.h" #endif // SURGSIM_DATASTRUCTURES_TETRAHEDRONMESH_H opensurgsim-0.7.0/SurgSim/DataStructures/Tree.cpp000066400000000000000000000025301277777236100220650ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/DataStructures/Tree.h" #include "SurgSim/DataStructures/TreeNode.h" #include using SurgSim::DataStructures::Tree; using SurgSim::DataStructures::TreeNode; Tree::Tree() { } Tree::~Tree() { } bool Tree::operator==(const Tree& tree) const { return (typeid(*this) == typeid(tree)) && isEqual(tree); } bool Tree::operator!=(const Tree& tree) const { return (typeid(*this) != typeid(tree)) || ! isEqual(tree); } bool Tree::isEqual(const Tree& tree) const { return *m_root == *tree.m_root; } void SurgSim::DataStructures::Tree::setRoot(std::shared_ptr root) { m_root = root; } std::shared_ptr SurgSim::DataStructures::Tree::getRoot() const { return m_root; } opensurgsim-0.7.0/SurgSim/DataStructures/Tree.h000066400000000000000000000044311277777236100215340ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DATASTRUCTURES_TREE_H #define SURGSIM_DATASTRUCTURES_TREE_H #include namespace SurgSim { namespace DataStructures { class TreeNode; /// Basic tree structure. /// The tree is composed of TreeNodes, which are all accessible from the root. /// \sa TreeNode TreeData class Tree { public: /// Constructor. After construction, the root is null. Tree(); /// Destructor virtual ~Tree(); /// Sets the root of the tree. /// \param root The new root of the tree. void setRoot(std::shared_ptr root); /// \return The root of the tree. std::shared_ptr getRoot() const; /// If the trees are not of the same type, returns false; /// otherwise, compares with the implementation of isEqual(const Tree&). /// \param tree Other tree for comparison. /// \return true if the trees are equal; otherwise, returns false. bool operator==(const Tree& tree) const; /// If the trees are not of the same type, returns false; /// otherwise, compares with the implementation of isEqual(const Tree&). /// \param tree Other tree for comparison. /// \return true if the trees are not equal; otherwise, returns false. bool operator!=(const Tree& tree) const; protected: /// Recurses through the tree, starting at the root. /// Override this method in derived classes to implement different comparisons. /// \param tree Other tree for comparison. /// \return true if the trees are equal; otherwise, returns false. virtual bool isEqual(const Tree& tree) const; private: /// Root of the tree. std::shared_ptr m_root; }; }; // namespace DataStructures }; // namespace SurgSim #endif // SURGSIM_DATASTRUCTURES_TREE_H opensurgsim-0.7.0/SurgSim/DataStructures/TreeData.cpp000066400000000000000000000020331277777236100226550ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/DataStructures/TreeData.h" #include using SurgSim::DataStructures::TreeData; TreeData::TreeData() { } TreeData::~TreeData() { } bool TreeData::operator==(const TreeData& data) const { return (typeid(*this) == typeid(data)) && isEqual(&data); } bool TreeData::operator!=(const TreeData& data) const { return (typeid(*this) != typeid(data)) || ! isEqual(&data); } opensurgsim-0.7.0/SurgSim/DataStructures/TreeData.h000066400000000000000000000041061277777236100223250ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DATASTRUCTURES_TREEDATA_H #define SURGSIM_DATASTRUCTURES_TREEDATA_H #include namespace SurgSim { namespace DataStructures { /// Abstract base class for data stored in a Tree. Each TreeNode has a pointer to a TreeData object. /// \sa TreeNode Tree class TreeData { public: /// Constructor TreeData(); /// Destructor virtual ~TreeData(); /// If the data are not of the same type, returns false; /// otherwise, compares with the implementation of isEqual(const TreeData&). /// \param data Other TreeData for comparison. /// \return true if the data are equal; otherwise, returns false. bool operator==(const TreeData& data) const; /// Returns true if the data are not equal; otherwise, returns false. /// If the data are not of the same type, returns false; /// otherwise, compares with the implementation of isEqual(const TreeData&). /// \param data Other TreeData for comparison. /// \return true if the data are equal; otherwise, returns false. bool operator!=(const TreeData& data) const; private: /// Returns true if the trees are equal; otherwise, returns false. /// Implement this method in derived classes to do the comparison. /// \param data Other TreeData for comparison. /// \return true if the data are equal; otherwise, returns false. virtual bool isEqual(const TreeData* data) const = 0; }; }; // namespace DataStructures }; // namespace SurgSim #endif // SURGSIM_DATASTRUCTURES_TREEDATA_H opensurgsim-0.7.0/SurgSim/DataStructures/TreeNode.cpp000066400000000000000000000047151277777236100227020ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/DataStructures/TreeNode.h" #include "SurgSim/DataStructures/TreeData.h" #include "SurgSim/Framework/Assert.h" #include namespace SurgSim { namespace DataStructures { TreeNode::TreeNode() : m_data(nullptr) { } TreeNode::~TreeNode() { } bool TreeNode::operator==(const TreeNode& node) const { return (typeid(*this) == typeid(node)) && isEqual(node); } bool TreeNode::operator!=(const TreeNode& node) const { return (typeid(*this) != typeid(node)) || ! isEqual(node); } bool TreeNode::isEqual(const TreeNode& node) const { if ((m_data != nullptr && node.m_data == nullptr) || (m_data == nullptr && node.m_data != nullptr)) { return false; } if (m_data != nullptr && node.m_data != nullptr) { return *m_data == *node.m_data; } return true; } void TreeNode::setData(std::shared_ptr data) { m_data = data; } std::shared_ptr TreeNode::getData() const { return m_data; } void TreeNode::setNumChildren(size_t numChildren) { m_children.resize(numChildren); } size_t TreeNode::getNumChildren() const { return m_children.size(); } void TreeNode::addChild(const std::shared_ptr& node) { m_children.emplace_back(node); } void TreeNode::addChild(const std::shared_ptr&& node) { m_children.emplace_back(node); } void TreeNode::setChild(size_t index, const std::shared_ptr& node) { SURGSIM_ASSERT(index < m_children.size()) << "setChild() with invalid index for child."; m_children[index] = node; } std::shared_ptr TreeNode::getChild(size_t index) const { SURGSIM_ASSERT(index < m_children.size()) << "getChild() with invalid index for child."; return m_children[index]; } void TreeNode::accept(TreeVisitor* visitor) { if (doAccept(visitor)) { for (size_t i = 0; i < getNumChildren(); ++i) { getChild(i)->accept(visitor); } } } } } opensurgsim-0.7.0/SurgSim/DataStructures/TreeNode.h000066400000000000000000000101001277777236100223300ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DATASTRUCTURES_TREENODE_H #define SURGSIM_DATASTRUCTURES_TREENODE_H #include #include #include "SurgSim/DataStructures/TreeVisitor.h" namespace SurgSim { namespace DataStructures { class TreeData; /// Basic tree node structure. /// The nodes build up the structure of a Tree. /// \sa Tree TreeData class TreeNode { public: /// Constructor. After construction, the node has no children, and the data is null. TreeNode(); /// Destructor virtual ~TreeNode(); /// Sets the data of this node. /// \param data The data for this node. void setData(std::shared_ptr data); /// \return The data of this node. std::shared_ptr getData() const; /// \return The number of children of this node. size_t getNumChildren() const; /// Returns the specified child of this node. /// \param index Index of the child /// \return Child at the specified index std::shared_ptr getChild(size_t index) const; /// Public entry point for visitor, currently this performs pre-order traversal of the tree /// \param visitor The visitor that wants to traverse the tree void accept(TreeVisitor* visitor); /// Returns true if the nodes are equal; otherwise, returns false. /// If the nodes are not of the same type, returns false; /// otherwise, compares with the implementation of isEqual(const TreeNode&). /// \param node The node for comparison. /// \return true is this node and the one from the parameter are equal. bool operator==(const TreeNode& node) const; /// Returns true if the nodes are not equal; otherwise, returns false. /// If the nodes are not of the same type, returns false; /// otherwise, compares with the implementation of isEqual(const TreeNode&). /// \param node The node for comparison. /// \return true if this node and the parameter are not equal bool operator!=(const TreeNode& node) const; protected: /// Returns true if the nodes are equal; otherwise, returns false. /// Recurses on children. /// Override this method in derived classes to implement different comparisons. /// \param node The node for comparison. /// \return true if this node is equal to the node in the parameter. virtual bool isEqual(const TreeNode& node) const; /// Private function for use with the visitor pattern, this needs to be implemented /// to make the correct double dispatch call to the dynamic type of this class. /// \param visitor The visitor that is trying to traverse the tree. /// \return true to indicate proceeding with the visitor, false indicates to abort the traversal. virtual bool doAccept(TreeVisitor* visitor) = 0; /// Sets the number of children of this node. /// Any added children will be null. /// \param numChildren The new number of children. void setNumChildren(size_t numChildren); /// Add a child to this node. /// \param node The new child node. void addChild(const std::shared_ptr& node); /// Add a child to this node. /// \param node The new child node. void addChild(const std::shared_ptr&& node); /// Set a specific child of this node. /// \param index Index of the child /// \param node Node to become a child void setChild(size_t index, const std::shared_ptr& node); private: /// Children of this node. std::vector> m_children; /// Data of this node. std::shared_ptr m_data; }; }; // namespace DataStructures }; // namespace SurgSim #endif // SURGSIM_DATASTRUCTURES_TREENODE_H opensurgsim-0.7.0/SurgSim/DataStructures/TreeVisitor.h000066400000000000000000000030251277777236100231120ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DATASTRUCTURES_TREEVISITOR_H #define SURGSIM_DATASTRUCTURES_TREEVISITOR_H namespace SurgSim { namespace DataStructures { class TreeNode; class AabbTreeNode; /// Abstract Class for visitors, this needs to be extended for other tree nodes when necessary /// return false from handle() to abort traversal. class TreeVisitor { public: /// Destructor virtual ~TreeVisitor() { } /// Handle TreeNode basic type. /// \param node Node to process. /// \return true To indicates that the visitor wishes to continue traversal, false if the visitor wants /// to abort traversal. virtual bool handle(TreeNode* node) = 0; /// Handle AabbTreeNode basic type, default body, override for specific work. /// \param node Node to process. /// \return true to continue traversal, false to abort. virtual bool handle(AabbTreeNode* node) { return false; }; }; } } #endif opensurgsim-0.7.0/SurgSim/DataStructures/TriangleMesh-inl.h000066400000000000000000000275101277777236100240020ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DATASTRUCTURES_TRIANGLEMESH_INL_H #define SURGSIM_DATASTRUCTURES_TRIANGLEMESH_INL_H #include "SurgSim/Framework/Log.h" namespace SurgSim { namespace DataStructures { template TriangleMesh::TriangleMesh() { } template TriangleMesh::TriangleMesh( const TriangleMesh& other) : Vertices::Vertices(other), SurgSim::Framework::Asset(), m_edges(other.getEdges()), m_triangles(other.getTriangles()), m_freeTriangles(other.m_freeTriangles) { } template template TriangleMesh::TriangleMesh(const TriangleMesh& other) : Vertices::Vertices(other), SurgSim::Framework::Asset() { m_edges.reserve(other.getEdges().size()); for (auto& edge : other.getEdges()) { addEdge(EdgeType(edge)); } size_t index = 0; m_triangles.reserve(other.getTriangles().size()); for (auto& triangle : other.getTriangles()) { addTriangle(TriangleType(triangle)); if (!triangle.isValid) { m_freeTriangles.push_back(index); } ++index; } } template TriangleMesh::~TriangleMesh() { } template std::string TriangleMesh::getClassName() const { return m_className; } template size_t TriangleMesh::addEdge(const EdgeType& edge) { m_edges.push_back(edge); return m_edges.size() - 1; } template size_t TriangleMesh::addTriangle(const TriangleType& triangle) { size_t result; SURGSIM_ASSERT(triangle.isValid) << "Cannot insert invalid triangle into mesh."; if (m_freeTriangles.empty()) { m_triangles.push_back(triangle); result = m_triangles.size() - 1; } else { result = m_freeTriangles.back(); m_freeTriangles.pop_back(); m_triangles[result] = triangle; } return result; } template size_t TriangleMesh::getNumEdges() const { return m_edges.size(); } template size_t TriangleMesh::getNumTriangles() const { return m_triangles.size() - m_freeTriangles.size(); } template const std::vector::EdgeType>& TriangleMesh::getEdges() const { return m_edges; } template std::vector::EdgeType>& TriangleMesh::getEdges() { return m_edges; } template const std::vector::TriangleType>& TriangleMesh::getTriangles() const { return m_triangles; } template std::vector::TriangleType>& TriangleMesh::getTriangles() { return m_triangles; } template const typename TriangleMesh::EdgeType& TriangleMesh::getEdge(size_t id) const { return m_edges[id]; } template typename TriangleMesh::EdgeType& TriangleMesh::getEdge(size_t id) { return m_edges[id]; } template std::array TriangleMesh::getEdgePositions(size_t id) const { auto& ids = getEdge(id).verticesId; std::array result = {{ Vertices::getVertex(ids[0]).position, Vertices::getVertex(ids[1]).position }}; return result; } template const typename TriangleMesh::TriangleType& TriangleMesh::getTriangle(size_t id) const { auto const& triangle = m_triangles[id]; SURGSIM_ASSERT(triangle.isValid) << "Attempted to access invalid or deleted triangle " << id << " have " << getNumTriangles(); return triangle; } template typename TriangleMesh::TriangleType& TriangleMesh::getTriangle(size_t id) { auto& triangle = m_triangles[id]; SURGSIM_ASSERT(triangle.isValid) << "Attempted to access invalid or deleted triangle."; return triangle; } template void TriangleMesh::removeTriangle(size_t id) { auto& triangle = m_triangles[id]; if (triangle.isValid) { triangle.isValid = false; m_freeTriangles.push_back(id); } } template std::array TriangleMesh::getTrianglePositions(size_t id) const { auto& ids = getTriangle(id).verticesId; std::array result = {{ Vertices::getVertex(ids[0]).position, Vertices::getVertex(ids[1]).position, Vertices::getVertex(ids[2]).position }}; return result; } template bool TriangleMesh::isValid() const { typedef typename TriangleMesh::EdgeType EdgeType; typedef typename TriangleMesh::TriangleType TriangleType; size_t numVertices = Vertices::getNumVertices(); // Test edges validity for (typename std::vector::const_iterator it = m_edges.begin(); it != m_edges.end(); ++it) { for (int vertexId = 0; vertexId < 2; vertexId++) { if (it->verticesId[vertexId] >= numVertices) { return false; } } } // Test triangles validity for (typename std::vector::const_iterator it = m_triangles.begin(); it != m_triangles.end(); ++it) { for (int vertexId = 0; vertexId < 3; vertexId++) { if (it->verticesId[vertexId] >= numVertices) { return false; } } } return true; } template void TriangleMesh::doClearEdges() { m_edges.clear(); } template void TriangleMesh::doClearTriangles() { m_triangles.clear(); m_freeTriangles.clear(); } template bool TriangleMesh::isEqual(const Vertices& mesh) const { const TriangleMesh& triangleMesh = static_cast(mesh); return Vertices::isEqual(triangleMesh) && m_edges == triangleMesh.getEdges() && m_triangles == triangleMesh.getTriangles(); } template bool TriangleMesh::doLoad(const std::string& fileName) { PlyReader reader(fileName); if (! reader.isValid()) { SURGSIM_LOG_SEVERE(SurgSim::Framework::Logger::getDefaultLogger()) << "'" << fileName << "' is an invalid .ply file."; return false; } typedef TriangleMesh MeshType; auto delegate = std::make_shared>(this->shared_from_this()); if (! reader.parseWithDelegate(delegate)) { SURGSIM_LOG_SEVERE(SurgSim::Framework::Logger::getDefaultLogger()) << "The input file '" << fileName << "' does not have the property required by triangle mesh."; return false; } return true; } template void TriangleMesh::doClear() { doClearTriangles(); doClearEdges(); doClearVertices(); } template TriangleMesh::TriangleMesh(TriangleMesh&& other) : Vertices::Vertices(std::move(other)) { doClearTriangles(); doClearEdges(); std::swap(m_triangles, other.m_triangles); std::swap(m_edges, other.m_edges); std::swap(m_freeTriangles, other.m_freeTriangles); } template TriangleMesh& TriangleMesh::operator=(const TriangleMesh& other) { Vertices::operator=(other); m_triangles = other.m_triangles; m_edges = other.m_edges; m_freeTriangles = other.m_freeTriangles; return *this; } template TriangleMesh& TriangleMesh::operator= (TriangleMesh&& other) { Vertices::operator=(std::move(other)); doClearTriangles(); doClearEdges(); std::swap(m_triangles, other.m_triangles); std::swap(m_edges, other.m_edges); std::swap(m_freeTriangles, other.m_freeTriangles); return *this; } template void SurgSim::DataStructures::TriangleMesh::save(const std::string& fileName) { std::fstream out(fileName, std::ios::out); if (out.is_open()) { out << "ply" << std::endl; out << "format ascii 1.0" << std::endl; out << "comment Created by OpenSurgSim, www.opensurgsim.org" << std::endl; out << "element vertex " << getNumVertices() << std::endl; out << "property float x\nproperty float y\nproperty float z" << std::endl; out << "element face " << getNumTriangles() << std::endl; out << "property list uchar uint vertex_indices" << std::endl; out << "end_header" << std::endl; for (const auto& vertex : getVertices()) { out << vertex.position[0] << " " << vertex.position[1] << " " << vertex.position[2] << std::endl; } for (const auto& tri : getTriangles()) { out << "3 " << tri.verticesId[0] << " " << tri.verticesId[1] << " " << tri.verticesId[2] << std::endl; } if (out.bad()) { SURGSIM_LOG_WARNING(SurgSim::Framework::Logger::getDefaultLogger()) << __FUNCTION__ << "There was a problem writing " << fileName; } out.close(); } else { SURGSIM_LOG_WARNING(SurgSim::Framework::Logger::getDefaultLogger()) << __FUNCTION__ << "Could not open " << fileName << " for writing."; } } }; // namespace DataStructures }; // namespace SurgSim #endif // SURGSIM_DATASTRUCTURES_TRIANGLEMESH_INL_H opensurgsim-0.7.0/SurgSim/DataStructures/TriangleMesh.cpp000066400000000000000000000016211277777236100235500ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/DataStructures/TriangleMesh.h" namespace SurgSim { namespace DataStructures { template<> std::string TriangleMeshPlain::m_className = "SurgSim::DataStructures::TriangleMeshPlain"; }; // namespace DataStructures }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/DataStructures/TriangleMesh.h000066400000000000000000000256011277777236100232210ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DATASTRUCTURES_TRIANGLEMESH_H #define SURGSIM_DATASTRUCTURES_TRIANGLEMESH_H #include #include #include "SurgSim/DataStructures/EmptyData.h" #include "SurgSim/DataStructures/MeshElement.h" #include "SurgSim/DataStructures/NormalData.h" #include "SurgSim/DataStructures/TriangleMeshPlyReaderDelegate.h" #include "SurgSim/DataStructures/Vertices.h" #include "SurgSim/Framework/Asset.h" namespace SurgSim { namespace DataStructures { /// Basic class for storing Triangle Meshes, handling basic vertex, edge, and triangle functionality. /// /// TriangleMesh is to be used purely as a data structure and not provide implementation of algorithms. /// For example, a physics 2D FEM is not a subclass of TriangleMesh, but may use a TriangleMesh for storing the /// structure of the FEM. /// /// It is recommended that subclasses with a specific purpose (such as for use in collision detection) provide /// convenience methods for creation of vertices, edges, and triangles and the data each contains. Methods such as /// createVertex(position, other data...), createEdge(vertices, other data...), /// and createTriangle(vertices, other data...) simplify the creation of vertices and elements and the data required. /// These methods would use the addVertex(), addEdge(), and addTriangle() methods to add the created vertices and /// elements to the TriangleMesh. /// /// Overriding isEqual(const Mesh&) is necessary to do more than just basic list comparison of the /// vertices, edges, and triangles, which is dependent on order in the list. /// /// Override doUpdate() to provide update functionality when vertices are changes, such as recalculating surface /// normals. /// /// A subclass that is designed for a specific use (such as collision detection) may also specify the VertexData, /// EdgeData, and TriangleData to what is required. /// /// \tparam VertexData Type of extra data stored in each vertex /// \tparam EdgeData Type of extra data stored in each edge /// \tparam TriangleData Type of extra data stored in each triangle /// \sa Vertex /// \sa MeshElement template class TriangleMesh : public Vertices, public SurgSim::Framework::Asset, public std::enable_shared_from_this> { public: /// Edge type for convenience (Ids of the 2 vertices) typedef MeshElement<2, EdgeData> EdgeType; /// Triangle type for convenience (Ids of the 3 vertices) typedef MeshElement<3, TriangleData> TriangleType; /// Constructor. The mesh is initially empty (no vertices, no edges, no triangles). TriangleMesh(); /// Copy constructor when the template data is the same type /// \param other the mesh to copy from TriangleMesh(const TriangleMesh& other); /// Copy constructor when the template data is a different type /// \tparam V Type of extra data stored in each vertex /// \tparam E Type of extra data stored in each edge /// \tparam T Type of extra data stored in each triangle /// \param other The mesh to be copied from. Vertex, edge and triangle data will not be copied /// \note: Data of the input mesh, i.e. VertexDataSource, EdgeDataSource and TrianleDataSource will not be copied. template explicit TriangleMesh(const TriangleMesh& other); /// Destructor virtual ~TriangleMesh(); /// Move Constructor /// \param other Constructor source TriangleMesh(TriangleMesh&& other); /// Copy Assignment /// \param other Assignment source TriangleMesh& operator=( const TriangleMesh& other); /// Move Assignment /// \param other Assignment source TriangleMesh& operator=( TriangleMesh&& other); std::string getClassName() const override; /// Adds an edge to the mesh. /// No checking on the edge's vertices is performed. /// Recommend that subclasses with a specific purpose (such as for use in collision detection) have a /// createEdge(vertices, other data...) method which performs any checking desired and sets up the edge data based /// on the vertices and other parameters. /// \param edge Edge to add to the mesh /// \return Unique ID of the new edge. size_t addEdge(const EdgeType& edge); /// Adds a triangle to the mesh. /// \param triangle Triangle to add to the mesh /// Recommend that subclasses with a specific purpose (such as for use in collision detection) have a /// createTriangle(vertices, other data...) method which performs any checking desired and sets up the triangle data /// based on the vertices and other parameters. /// \note The ids of deleted triangles will be reused in no particular order /// \return id of the new triangle. size_t addTriangle(const TriangleType& triangle); /// Get the number of edges /// \return the number of edges in this mesh. size_t getNumEdges() const; /// Get the number of triangles /// \note The number of triangles might not match the size of the array returned by getTriangles(), after deletion /// has occurred it cannot be used to access all triangles. /// \return the number of triangles in this mesh. size_t getNumTriangles() const; /// Retrieve all edges /// \return a vector containing the position of each edge. const std::vector& getEdges() const; /// Retrieve all edges (non const version) /// \return a vector containing the position of each edge. std::vector& getEdges(); /// Retrieve all triangles /// \note The number of triangles might not match the size of the array returned by getTriangles(), after deletion /// has occurred it cannot be used to access all triangles. When processing this array, /// check \sa TriangleType::isValid to see wether to do something with this triangle /// \return a vector containing the position of each triangle. Some of these triangles might be deleted, they need /// to be checked via \sa isValid before further processing const std::vector& getTriangles() const; /// Retrieve all triangles (non const version) /// \note The number of triangles might not match the size of the array returned by getTriangles(), after deletion /// has occurred it cannot be used to access all triangles. When processing this array, /// check \sa TriangleType::isValid to see wether to do something with this triangle /// \return a vector containing the position of each triangle. Some of these triangles might be deleted, they need /// to be checked via \sa isValid before further processing std::vector& getTriangles(); /// Retrieve a specific edge /// \param id the edge to be retrieved. /// \return the specified edge. const EdgeType& getEdge(size_t id) const; /// Retrieve a specific edge (non const version) /// \param id the edge to be retrieved. /// \return the specified edge. EdgeType& getEdge(size_t id); /// Returns an array of the edge's vertices' positions /// \param id the id of the edge /// \return an array of the edge's vertices' positions std::array getEdgePositions(size_t id) const; /// Retrieve a specific triangle /// \throws SurgSim::Framework::AssertionFailure if the given triangle was deleted /// \param id The id of the triangle to retrieve /// \return the specified triangle const TriangleType& getTriangle(size_t id) const; /// Retrieve a specific triangle (non const version) /// \throws SurgSim::Framework::AssertionFailure if the give triangle was deleted /// \param id The id of the triangle to retrieve /// \return the specified triangle TriangleType& getTriangle(size_t id); /// Marks a triangle as invalid, the triangle cannot be accessed via getTriangle anymore /// \note users of getTriangles() will have to check for deleted triangles if this feature is used /// the size of the vector returned by getTriangles does not reflect the number of triangles anymore /// use getNumTriangles() to figure out the correct number. /// \param id triangle to delete void removeTriangle(size_t id); /// Returns an array of the triangle's vertices' positions /// \param id the id of the triangle /// \return an array of the triangle's vertices' positions std::array getTrianglePositions(size_t id) const; /// Test if the TriangleMesh is valid (valid vertex Ids used in all MeshElements) /// \return True if the TriangleMesh is valid, False otherwise (the topology is then broken) bool isValid() const; /// Save the triangle mesh in the ply format /// \param fileName the filename where to save void save(const std::string& fileName); protected: /// Remove all edges from the mesh. virtual void doClearEdges(); /// Remove all triangles from the mesh. virtual void doClearTriangles(); /// Internal comparison of meshes of the same type: returns true if equal, false if not equal. /// Override this method to provide custom comparison. Basic TriangleMesh implementation compares vertices, /// edges and triangles: the order of vertices, edges, and triangles must also match to be considered equal. /// \param mesh Mesh must be of the same type as that which it is compared against /// \return True if the vertices are equals, False otherwise virtual bool isEqual(const Vertices& mesh) const; bool doLoad(const std::string& fileName) override; using Vertices::doClearVertices; static std::string m_className; private: /// Clear mesh to return to an empty state (no vertices, no edges, no triangles). virtual void doClear(); /// Edges std::vector m_edges; /// Triangles std::vector m_triangles; /// List of indices of deleted triangles, to be reused when another triangle is added std::vector m_freeTriangles; public: // Dependent name resolution for inherited functions and typenames from templates using typename Vertices::VertexType; using Vertices::addVertex; using Vertices::getNumVertices; using Vertices::getVertices; }; typedef TriangleMesh TriangleMeshPlain; }; // namespace DataStructures }; // namespace SurgSim #include "SurgSim/DataStructures/TriangleMesh-inl.h" #endif // SURGSIM_DATASTRUCTURES_TRIANGLEMESH_H opensurgsim-0.7.0/SurgSim/DataStructures/TriangleMeshPlyReaderDelegate-inl.h000066400000000000000000000163611277777236100272470ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DATASTRUCTURES_TRIANGLEMESHPLYREADERDELEGATE_INL_H #define SURGSIM_DATASTRUCTURES_TRIANGLEMESHPLYREADERDELEGATE_INL_H #include #include "SurgSim/Math/Vector.h" template SurgSim::DataStructures::TriangleMeshPlyReaderDelegate::TriangleMeshPlyReaderDelegate() : m_mesh(std::make_shared()), m_hasTextureCoordinates(false), m_hasFaces(false), m_hasEdges(false) { } template SurgSim::DataStructures::TriangleMeshPlyReaderDelegate::TriangleMeshPlyReaderDelegate(std::shared_ptr mesh) : m_mesh(mesh), m_hasTextureCoordinates(false), m_hasFaces(false), m_hasEdges(false) { SURGSIM_ASSERT(mesh != nullptr) << "The mesh cannot be null."; mesh->clear(); } template std::shared_ptr SurgSim::DataStructures::TriangleMeshPlyReaderDelegate::getMesh() { return m_mesh; } template bool SurgSim::DataStructures::TriangleMeshPlyReaderDelegate::registerDelegate(PlyReader* reader) { // Vertex processing reader->requestElement("vertex", std::bind(&TriangleMeshPlyReaderDelegate::beginVertices, this, std::placeholders::_1, std::placeholders::_2), std::bind(&TriangleMeshPlyReaderDelegate::processVertex, this, std::placeholders::_1), std::bind(&TriangleMeshPlyReaderDelegate::endVertices, this, std::placeholders::_1)); reader->requestScalarProperty("vertex", "x", PlyReader::TYPE_DOUBLE, offsetof(VertexData, x)); reader->requestScalarProperty("vertex", "y", PlyReader::TYPE_DOUBLE, offsetof(VertexData, y)); reader->requestScalarProperty("vertex", "z", PlyReader::TYPE_DOUBLE, offsetof(VertexData, z)); // Normal processing m_hasTextureCoordinates = reader->hasProperty("vertex", "s") && reader->hasProperty("vertex", "t"); if (m_hasTextureCoordinates) { reader->requestScalarProperty("vertex", "s", PlyReader::TYPE_DOUBLE, offsetof(VertexData, s)); reader->requestScalarProperty("vertex", "t", PlyReader::TYPE_DOUBLE, offsetof(VertexData, t)); } if (m_hasFaces) { // Face Processing reader->requestElement("face", std::bind(&TriangleMeshPlyReaderDelegate::beginFaces, this, std::placeholders::_1, std::placeholders::_2), std::bind(&TriangleMeshPlyReaderDelegate::processFace, this, std::placeholders::_1), std::bind(&TriangleMeshPlyReaderDelegate::endFaces, this, std::placeholders::_1)); reader->requestListProperty("face", "vertex_indices", PlyReader::TYPE_UNSIGNED_INT, offsetof(ListData, indices), PlyReader::TYPE_UNSIGNED_INT, offsetof(ListData, count)); } if (m_hasEdges) { // Edge Processing reader->requestElement("1d_element", std::bind(&TriangleMeshPlyReaderDelegate::beginEdges, this, std::placeholders::_1, std::placeholders::_2), std::bind(&TriangleMeshPlyReaderDelegate::processEdge, this, std::placeholders::_1), std::bind(&TriangleMeshPlyReaderDelegate::endEdges, this, std::placeholders::_1)); reader->requestListProperty("1d_element", "vertex_indices", PlyReader::TYPE_UNSIGNED_INT, offsetof(ListData, indices), PlyReader::TYPE_UNSIGNED_INT, offsetof(ListData, count)); } reader->setEndParseFileCallback(std::bind(&TriangleMeshPlyReaderDelegate::endFile, this)); return true; } template bool SurgSim::DataStructures::TriangleMeshPlyReaderDelegate::fileIsAcceptable(const PlyReader& reader) { bool result = true; m_hasFaces = reader.hasProperty("face", "vertex_indices") && !reader.isScalar("face", "vertex_indices"); m_hasEdges = reader.hasProperty("1d_element", "vertex_indices") && !reader.isScalar("1d_element", "vertex_indices"); // Shortcut test if one fails ... result = result && reader.hasProperty("vertex", "x"); result = result && reader.hasProperty("vertex", "y"); result = result && reader.hasProperty("vertex", "z"); result = result && (m_hasFaces || m_hasEdges); return result; } template void* SurgSim::DataStructures::TriangleMeshPlyReaderDelegate::beginVertices( const std::string& elementName, size_t vertexCount) { m_vertexData.overrun1 = 0l; m_vertexData.overrun2 = 0l; return &m_vertexData; } template void SurgSim::DataStructures::TriangleMeshPlyReaderDelegate::processVertex(const std::string& elementName) { typename M::VertexType vertex(SurgSim::Math::Vector3d(m_vertexData.x, m_vertexData.y, m_vertexData.z)); m_mesh->addVertex(vertex); } template void SurgSim::DataStructures::TriangleMeshPlyReaderDelegate::endVertices(const std::string& elementName) { SURGSIM_ASSERT(m_vertexData.overrun1 == 0l && m_vertexData.overrun2 == 0l) << "There was an overrun while reading the vertex structures, it is likely that data " << "has become corrupted."; } template void* SurgSim::DataStructures::TriangleMeshPlyReaderDelegate::beginFaces( const std::string& elementName, size_t faceCount) { m_listData.overrun = 0l; return &m_listData; } template void SurgSim::DataStructures::TriangleMeshPlyReaderDelegate::processFace(const std::string& elementName) { SURGSIM_ASSERT(m_listData.count == 3) << "Can only process triangle meshes."; std::copy(m_listData.indices, m_listData.indices + 3, m_face.begin()); typename M::TriangleType triangle(m_face); m_mesh->addTriangle(triangle); } template void SurgSim::DataStructures::TriangleMeshPlyReaderDelegate::endFaces(const std::string& elementName) { SURGSIM_ASSERT(m_listData.overrun == 0l) << "There was an overrun while reading the face structures, it is likely that data " << "has become corrupted."; } template void SurgSim::DataStructures::TriangleMeshPlyReaderDelegate::endFile() { m_mesh->update(); } template bool SurgSim::DataStructures::TriangleMeshPlyReaderDelegate::hasTextureCoordinates() { return m_hasTextureCoordinates; } template void* SurgSim::DataStructures::TriangleMeshPlyReaderDelegate::beginEdges(const std::string& elementName, size_t edgeCount) { m_listData.overrun = 0l; return &m_listData; } template void SurgSim::DataStructures::TriangleMeshPlyReaderDelegate::processEdge(const std::string& elementName) { SURGSIM_ASSERT(m_listData.count == 2) << "Edges have to have 2 points."; std::copy(m_listData.indices, m_listData.indices + 2, m_edge.begin()); typename M::EdgeType edge(m_edge); m_mesh->addEdge(edge); } template void SurgSim::DataStructures::TriangleMeshPlyReaderDelegate::endEdges(const std::string& elementName) { SURGSIM_ASSERT(m_listData.overrun == 0l) << "There was an overrun while reading the face structures, it is likely that data " << "has become corrupted."; } #endif opensurgsim-0.7.0/SurgSim/DataStructures/TriangleMeshPlyReaderDelegate.h000066400000000000000000000110041277777236100264540ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DATASTRUCTURES_TRIANGLEMESHPLYREADERDELEGATE_H #define SURGSIM_DATASTRUCTURES_TRIANGLEMESHPLYREADERDELEGATE_H #include #include #include "SurgSim/DataStructures/EmptyData.h" #include "SurgSim/DataStructures/PlyReader.h" #include "SurgSim/DataStructures/PlyReaderDelegate.h" namespace SurgSim { namespace DataStructures { /// Implementation of PlyReaderDelegate for simple triangle meshes template class TriangleMeshPlyReaderDelegate : public PlyReaderDelegate { public: typedef M MeshType; /// Default constructor. TriangleMeshPlyReaderDelegate(); /// Constructor. /// \param mesh The mesh to be used, it will be cleared by the constructor. explicit TriangleMeshPlyReaderDelegate(std::shared_ptr mesh); /// Gets the mesh. /// \return The mesh. std::shared_ptr getMesh(); /// Registers the delegate with the reader, overridden from \sa PlyReaderDelegate. /// \param reader The reader that should be used. /// \return true if it succeeds, false otherwise. bool registerDelegate(PlyReader* reader) override; /// Check whether this file is acceptable to the delegate, overridden from \sa PlyReaderDelegate. /// \param reader The reader that should be used. /// \return true if it succeeds, false otherwise. bool fileIsAcceptable(const PlyReader& reader) override; /// Callback function, begin the processing of vertices. /// \param elementName Name of the element. /// \param vertexCount Number of vertices. /// \return memory for vertex data to the reader. void* beginVertices(const std::string& elementName, size_t vertexCount); /// Callback function to process one vertex. /// \param elementName Name of the element. virtual void processVertex(const std::string& elementName); /// Callback function to finalize processing of vertices. /// \param elementName Name of the element. void endVertices(const std::string& elementName); /// Callback function, begin the processing of faces. /// \param elementName Name of the element. /// \param faceCount Number of faces. /// \return memory for face data to the reader. void* beginFaces(const std::string& elementName, size_t faceCount); /// Callback function to process one face. /// \param elementName Name of the element. void processFace(const std::string& elementName); /// Callback function to finalize processing of faces. /// \param elementName Name of the element. void endFaces(const std::string& elementName); void* beginEdges(const std::string& elementName, size_t edgeCount); void processEdge(const std::string& elementName); void endEdges(const std::string& elementName); /// Callback function to finalize processing of the mesh void endFile(); protected: /// \return true if s/t coordinates where found in the ply file on registration. bool hasTextureCoordinates(); /// Internal structure, the receiver for data from the "vertex" element /// Provide space for standard ply vertex data, x/y/z and s/t struct VertexData { double x; double y; double z; int64_t overrun1; ///< Used to check for buffer overruns double s; double t; int64_t overrun2; ///< Used to check for buffer overruns } m_vertexData; /// Internal structure, the received for data from the "face" element struct ListData { unsigned int count; unsigned int* indices; int64_t overrun; ///< Used to check for buffer overruns } m_listData; /// The mesh that will be created std::shared_ptr m_mesh; // Statically allocated index array to receive data for the faces std::array m_face; std::array m_edge; private: /// Set to true if s/t coordinates are found in the .ply file bool m_hasTextureCoordinates; /// Set to true if faces are found in the .ply file bool m_hasFaces; /// Set to true if edges are found in the .ply file bool m_hasEdges; }; }; }; #include "SurgSim/DataStructures/TriangleMeshPlyReaderDelegate-inl.h" #endif opensurgsim-0.7.0/SurgSim/DataStructures/UnitTests/000077500000000000000000000000001277777236100224245ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/DataStructures/UnitTests/AabbTreeDataTests.cpp000066400000000000000000000122541277777236100264160ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/DataStructures/AabbTreeData.h" #include "SurgSim/Math/Aabb.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Testing/MathUtilities.h" using SurgSim::Math::Aabbd; using SurgSim::Math::Vector3d; namespace SurgSim { namespace DataStructures { TEST(AabbTreeDataTests, InitTest) { ASSERT_NO_THROW(AabbTreeData data;); AabbTreeData data; EXPECT_TRUE(data.isEmpty()); EXPECT_EQ(0u, data.getSize()); } TEST(AabbTreeDataTests, EqualityTests) { Aabbd a(Vector3d(-1.0, -1.0, -1.0), Vector3d(1.0, 1.0, 1.0)); Aabbd b(Vector3d(-2.0, -2.0, -2.0), Vector3d(0.0, 0.0, 0.0)); AabbTreeData empty; AabbTreeData containsA; AabbTreeData containsAnotherA; AabbTreeData containsB; AabbTreeData containsAB; AabbTreeData containsBA; containsA.add(a, 0); containsAnotherA.add(a, 0); containsB.add(b, 0); containsAB.add(a, 0); containsAB.add(b, 0); containsBA.add(b, 0); containsBA.add(a, 0); EXPECT_EQ(empty, empty); EXPECT_NE(empty, containsA); EXPECT_NE(empty, containsAB); EXPECT_NE(containsA, empty); EXPECT_NE(containsBA, empty); EXPECT_EQ(containsA, containsA); EXPECT_EQ(containsA, containsAnotherA); EXPECT_NE(containsA, containsB); EXPECT_NE(containsA, containsAB); EXPECT_EQ(containsAB, containsAB); EXPECT_EQ(containsAB, containsBA); EXPECT_EQ(containsBA, containsAB); } TEST(AabbTreeDataTests, AddTest) { Aabbd a(Vector3d(-1.0, -1.0, -1.0), Vector3d(1.0, 1.0, 1.0)); Aabbd b(Vector3d(-2.0, -2.0, -2.0), Vector3d(0.0, 0.0, 0.0)); Aabbd c = a.merged(b); AabbTreeData data; EXPECT_NO_THROW(data.add(a, 0)); EXPECT_TRUE(a.isApprox(data.getAabb())); EXPECT_EQ(1u, data.getSize()); data.add(b, 1); EXPECT_EQ(2u, data.getSize()); EXPECT_TRUE(c.isApprox(data.getAabb())); } TEST(AabbTreeDataTests, SimpleSplitTest) { AabbTreeData data; // add 11 elements for (int i = 0; i <= 10; ++i) { data.add(Aabbd(Vector3d(i, -1.0, -1.0), Vector3d(i + 2, 1.0, 1.0)), i); } // The original box, encompasses all the members Aabbd original(Vector3d(0.0, -1.0, -1.0), Vector3d(12.0, 1.0, 1.0)); // The left hand side box, this is what is left in the original data item // all the items with center.x < (12.0 - 0.0) / 2.0, 5 items Aabbd expectedLeft(Vector3d(0.0, -1.0, -1.0), Vector3d(6.0, 1.0, 1.0)); // The left hand side box, this is what moved to the new data item // all the items with center.x >= (12.0 - 0.0) / 2.0, 6 items Aabbd expectedRight(Vector3d(5.0, -1.0, -1.0), Vector3d(12.0, 1.0, 1.0)); EXPECT_TRUE(original.isApprox(data.getAabb())) << original << ", " << data.getAabb(); std::shared_ptr ptr = data.takeLargerElements(); EXPECT_EQ(5u, data.getSize()); EXPECT_TRUE(expectedLeft.isApprox(data.getAabb())) << expectedLeft << ", " << data.getAabb(); EXPECT_EQ(6u, ptr->getSize()); EXPECT_TRUE(expectedRight.isApprox(ptr->getAabb())) << expectedRight << ", " << ptr->getAabb(); } TEST(AabbTreeDataTests, IntersectionTest) { Aabbd a(Vector3d(-1.0, -1.0, -1.0), Vector3d(1.0, 1.0, 1.0)); Aabbd b(Vector3d(-2.0, -2.0, -2.0), Vector3d(0.0, 0.0, 0.0)); AabbTreeData data; data.add(Aabbd(Vector3d(-1.0, 0.0, 0.0), Vector3d(-1.0, 0.0, 0.0)), 0); data.add(Aabbd(Vector3d(-2.0, 0.0, 0.0), Vector3d(-2.0, 0.0, 0.0)), 1); data.add(Aabbd(Vector3d(0.0, 0.0, 0.0), Vector3d(0.0, 0.0, 0.0)), 2); data.add(Aabbd(Vector3d(1.0, 0.0, 0.0), Vector3d(1.0, 0.0, 0.0)), 3); Aabbd noIntersections(Vector3d(-0.5, -2.0, -2.0), Vector3d(0.5, -1.0, -1.0)); Aabbd oneIntersection(Vector3d(-0.5, 0.0, 0.0), Vector3d(0.5, 0.0, 0.0)); Aabbd twoIntersections(Vector3d(-0.5, 0.0, 0.0), Vector3d(1.5, 0.0, 0.0)); Aabbd threeIntersections(Vector3d(-1.5, 0.0, 0.0), Vector3d(1.5, 0.0, 0.0)); Aabbd fourIntersections(Vector3d(-2.5, 0.0, 0.0), Vector3d(2.5, 0.0, 0.0)); std::list results; EXPECT_FALSE(data.hasIntersections(noIntersections)); data.getIntersections(noIntersections, &results); EXPECT_EQ(0u, results.size()); results.size(); results.clear(); EXPECT_TRUE(data.hasIntersections(oneIntersection)); data.getIntersections(oneIntersection, &results); EXPECT_EQ(1u, results.size()); EXPECT_EQ(2u, results.front()); results.clear(); EXPECT_TRUE(data.hasIntersections(twoIntersections)); data.getIntersections(twoIntersections, &results); EXPECT_EQ(2u, results.size()); results.clear(); EXPECT_TRUE(data.hasIntersections(threeIntersections)); data.getIntersections(threeIntersections, &results); EXPECT_EQ(3u, results.size()); results.clear(); EXPECT_TRUE(data.hasIntersections(fourIntersections)); data.getIntersections(fourIntersections, &results); EXPECT_EQ(4u, results.size()); } } } opensurgsim-0.7.0/SurgSim/DataStructures/UnitTests/AabbTreeNodeTests.cpp000066400000000000000000000050671277777236100264360ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Math/Aabb.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/DataStructures/TreeVisitor.h" #include "SurgSim/DataStructures/AabbTreeNode.h" using SurgSim::Math::Aabbd; using SurgSim::Math::Vector3d; namespace SurgSim { namespace DataStructures { TEST(AabbTreeNodeTests, InitTest) { EXPECT_NO_THROW(AabbTreeNode node); auto node = std::make_shared(); EXPECT_EQ(0u, node->getNumChildren()); EXPECT_TRUE(node->getAabb().isEmpty()); } TEST(AabbTreeNodeTests, AddTest) { auto node = std::make_shared(); Aabbd one(Vector3d(-1.0, -1.0, -1.0), Vector3d(0.0, 0.0, 0.0)); Aabbd two(Vector3d(0.0, 0.0, 0.0), Vector3d(1.0, 1.0, 1.0)); Aabbd combined(Vector3d(-1.0, -1.0, -1.0), Vector3d(1.0, 1.0, 1.0)); EXPECT_NO_THROW(node->addData(one, 0)); EXPECT_EQ(0u, node->getNumChildren()); EXPECT_TRUE(one.isApprox(node->getAabb())); node->addData(one, 1, 3); node->addData(two, 2, 3); node->addData(two, 3, 3); ASSERT_EQ(2u, node->getNumChildren()); EXPECT_TRUE(combined.isApprox(node->getAabb())); ASSERT_NE(nullptr, node->getChild(0)); ASSERT_NE(nullptr, node->getChild(1)); auto child = std::dynamic_pointer_cast(node->getChild(0)); ASSERT_NE(nullptr, child); ASSERT_EQ(0u, child->getNumChildren()); EXPECT_TRUE(one.isApprox(child->getAabb())); child = std::dynamic_pointer_cast(node->getChild(1)); ASSERT_NE(nullptr, child); ASSERT_EQ(0u, child->getNumChildren()); EXPECT_TRUE(two.isApprox(child->getAabb())); } class TestVisitor : public TreeVisitor { public: virtual ~TestVisitor() {} bool handle(TreeNode* node) override { throw std::logic_error("The method or operation is not implemented."); return false; } bool handle(AabbTreeNode* node) override { return true; } }; TEST(AabbTreeNodeTests, VisitorTest) { TestVisitor visitor; auto node = std::make_shared(); node->accept(&visitor); } } } opensurgsim-0.7.0/SurgSim/DataStructures/UnitTests/AabbTreeTests.cpp000066400000000000000000000223661277777236100256310ustar00rootroot00000000000000#include "../PlyReader.h" #include "../TriangleMeshPlyReaderDelegate.h" // This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/DataStructures/AabbTree.h" #include "SurgSim/DataStructures/AabbTreeIntersectionVisitor.h" #include "SurgSim/DataStructures/AabbTreeNode.h" #include "SurgSim/DataStructures/TriangleMesh.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Framework/Timer.h" #include "SurgSim/Math/Aabb.h" #include "SurgSim/Math/MeshShape.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Testing/MathUtilities.h" using SurgSim::Math::Aabbd; using SurgSim::Math::RigidTransform3d; using SurgSim::Math::Vector3d; namespace SurgSim { namespace DataStructures { TEST(AabbTreeTests, InitTest) { ASSERT_NO_THROW({AabbTree tree(3);}); auto tree = std::make_shared(3); EXPECT_EQ(3u, tree->getMaxObjectsPerNode()); EXPECT_NE(nullptr, tree->getRoot()); } TEST(AabbTreeTests, AddTest) { auto tree = std::make_shared(3); Aabbd one(Vector3d(-1.0, -1.0, -1.0), Vector3d(0.0, 0.0, 0.0)); Aabbd two(Vector3d(0.0, 0.0, 0.0), Vector3d(1.0, 1.0, 1.0)); EXPECT_NO_THROW(tree->add(one, 0)); EXPECT_NO_THROW(tree->add(one, 1)); EXPECT_NO_THROW(tree->add(two, 2)); EXPECT_NO_THROW(tree->add(two, 3)); EXPECT_EQ(2u, tree->getRoot()->getNumChildren()); } TEST(AabbTreeTests, BuildTest) { auto runtime = std::make_shared("config.txt"); auto tree = std::make_shared(3); auto mesh = std::make_shared(); mesh->load("Geometry/arm_collision.ply"); for (size_t i = 0; i < mesh->getNumTriangles(); ++i) { auto triangle = mesh->getTriangle(i); Aabbd aabb(SurgSim::Math::makeAabb( mesh->getVertex(triangle.verticesId[0]).position, mesh->getVertex(triangle.verticesId[1]).position, mesh->getVertex(triangle.verticesId[2]).position)); tree->add(std::move(aabb), i); } } TEST(AabbTreeTests, BatchBuildTest) { auto runtime = std::make_shared("config.txt"); auto tree = std::make_shared(3); auto mesh = std::make_shared(); mesh->load("Geometry/arm_collision.ply"); std::list items; for (size_t i = 0; i < mesh->getNumTriangles(); ++i) { auto triangle = mesh->getTriangle(i); Aabbd aabb(SurgSim::Math::makeAabb( mesh->getVertex(triangle.verticesId[0]).position, mesh->getVertex(triangle.verticesId[1]).position, mesh->getVertex(triangle.verticesId[2]).position)); items.emplace_back(std::make_pair(std::move(aabb), i)); } tree->set(std::move(items)); } TEST(AabbTreeTests, EasyIntersectionTest) { auto tree = std::make_shared(3); Aabbd bigBox; for (int i = 0; i <= 6; ++i) { Aabbd aabb(Vector3d(static_cast(i) - 0.01, -0.01, -0.01), Vector3d(static_cast(i) + 0.01, 0.01, 0.01)); bigBox.extend(aabb); tree->add(aabb, i); } EXPECT_TRUE(bigBox.isApprox(tree->getAabb())) << bigBox << ", " << tree->getAabb(); AabbTreeIntersectionVisitor visitor(bigBox); tree->getRoot()->accept(&visitor); EXPECT_EQ(7u, visitor.getIntersections().size()); Aabbd leftBox(Vector3d(0.0, -0.02, -0.02), Vector3d(3.4, 0.02, 0.02)); visitor.setAabb(leftBox); tree->getRoot()->accept(&visitor); EXPECT_EQ(4u, visitor.getIntersections().size()) << "Left Box Incorrect"; Aabbd middleBox(Vector3d(1.8, -0.02, -0.02), Vector3d(4.4, 0.02, 0.02)); visitor.setAabb(middleBox); tree->getRoot()->accept(&visitor); EXPECT_EQ(3u, visitor.getIntersections().size()) << "Middle Box Incorrect"; Aabbd rightBox(Vector3d(2.8, -0.02, -0.02), Vector3d(6.4, 0.02, 0.02)); visitor.setAabb(rightBox); tree->getRoot()->accept(&visitor); EXPECT_EQ(4u, visitor.getIntersections().size()) << "Right Box Incorrect"; } TEST(AabbTreeTests, MeshIntersectionTest) { auto runtime = std::make_shared("config.txt"); auto tree = std::make_shared(3); auto mesh = std::make_shared(); mesh->load("Geometry/arm_collision.ply"); Aabbd expectedBigBox; for (size_t i = 0; i < mesh->getNumTriangles(); ++i) { auto triangle = mesh->getTriangle(i); std::array vertices = { mesh->getVertex(triangle.verticesId[0]).position, mesh->getVertex(triangle.verticesId[1]).position, mesh->getVertex(triangle.verticesId[2]).position }; Aabbd aabb(SurgSim::Math::makeAabb(vertices[0], vertices[1], vertices[2])); expectedBigBox.extend(aabb); tree->add(std::move(aabb), i); } Aabbd bigBox = tree->getAabb(); EXPECT_TRUE(expectedBigBox.isApprox(bigBox)); AabbTreeIntersectionVisitor intersector(bigBox); SurgSim::Framework::Timer timer; timer.start(); tree->getRoot()->accept(&intersector); timer.endFrame(); EXPECT_EQ(mesh->getNumTriangles(), intersector.getIntersections().size()); } template class TreeLeavesVisitor : public TreeVisitor { public: bool handle(TreeNode* node) override { SURGSIM_FAILURE() << "Function " << __FUNCTION__ << " not implemented"; return false; } bool handle(NodeType* node) override { if (node->getNumChildren() == 0) { leaves.push_back(node); } return true; } std::vector leaves; }; template static typename std::list::const_iterator getEquivalentPair(const std::list& list, const PairTypeRhs& item) { return std::find_if(list.cbegin(), list.cend(), [&item](const PairTypeLhs & pair) { return (pair.first->getAabb().isApprox(item.first->getAabb()) && pair.second->getAabb().isApprox(item.second->getAabb())) || (pair.first->getAabb().isApprox(item.second->getAabb()) && pair.second->getAabb().isApprox(item.first->getAabb())); } ); } TEST(AabbTreeTests, SpatialJoinTest) { auto runtime = std::make_shared("config.txt"); const std::string fileName = "Geometry/staple_collision.ply"; auto meshA = std::make_shared(); ASSERT_NO_THROW(meshA->load(fileName)); auto meshB = std::make_shared(); ASSERT_NO_THROW(meshB->load(fileName)); RigidTransform3d rhsPose = SurgSim::Math::makeRigidTranslation(Vector3d(0.005, 0.0, 0.0)); meshB->transform(rhsPose); // update the AABB trees meshA->update(); meshB->update(); auto aabbA = meshA->getAabbTree(); auto aabbB = meshB->getAabbTree(); auto actualIntersection = aabbA->spatialJoin(*aabbB); TreeLeavesVisitor leavesVisitorA; std::static_pointer_cast(aabbA->getRoot())->accept(&leavesVisitorA); auto& leavesA = leavesVisitorA.leaves; TreeLeavesVisitor leavesVisitorB; std::static_pointer_cast(aabbB->getRoot())->accept(&leavesVisitorB); auto& leavesB = leavesVisitorB.leaves; std::list> expectedIntersection; for (auto leafA = leavesA.begin(); leafA != leavesA.end(); ++leafA) { for (auto leafB = leavesB.begin(); leafB != leavesB.end(); ++leafB) { if (SurgSim::Math::doAabbIntersect((*leafA)->getAabb(), (*leafB)->getAabb())) { expectedIntersection.emplace_back(*leafA, *leafB); } } } { SCOPED_TRACE("Equivalent sets"); ASSERT_GT(expectedIntersection.size(), 0u); ASSERT_EQ(expectedIntersection.size(), actualIntersection.size()); // Sets A and B are equal if and only if A is a subset of B and B is a subset of A. for (auto it = actualIntersection.begin(); it != actualIntersection.end(); ++it) { EXPECT_FALSE(getEquivalentPair(expectedIntersection, *it) == expectedIntersection.cend()); } for (auto it = expectedIntersection.begin(); it != expectedIntersection.end(); ++it) { EXPECT_FALSE(getEquivalentPair(actualIntersection, *it) == actualIntersection.cend()); } } { SCOPED_TRACE("Inequivalent sets."); auto newNode = std::make_shared(); newNode->addData( SurgSim::Math::makeAabb(Vector3d(-0.1, 0.3, 5.3), Vector3d(5.4, -5.8, 1.1), Vector3d(0, 0.5, 11)), 4543); expectedIntersection.emplace_back(newNode.get(), expectedIntersection.front().second); actualIntersection.emplace_back(newNode, actualIntersection.back().first); ASSERT_GT(expectedIntersection.size(), 0u); ASSERT_EQ(expectedIntersection.size(), actualIntersection.size()); EXPECT_TRUE(getEquivalentPair(expectedIntersection, actualIntersection.back()) == expectedIntersection.cend()); EXPECT_TRUE(getEquivalentPair(actualIntersection, expectedIntersection.back()) == actualIntersection.cend()); } } } // namespace DataStructure } // namespace SurgSim opensurgsim-0.7.0/SurgSim/DataStructures/UnitTests/BufferedValueTests.cpp000066400000000000000000000031461277777236100266760ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/DataStructures/BufferedValue.h" #include #include namespace SurgSim { namespace DataStructures { TEST(BufferedValueTests, InitTest) { EXPECT_NO_THROW({BufferedValue value(3);}); EXPECT_NO_THROW({BufferedValue value;}); } TEST(BufferedValueTests, SafeAndUnsafeGettersTest) { auto buffer = std::make_shared>(10); int& value = buffer->unsafeGet(); std::shared_ptr initialBufferedValue = buffer->safeGet(); EXPECT_EQ(10, value); EXPECT_EQ(10, *initialBufferedValue); value = 20; EXPECT_EQ(20, value); EXPECT_EQ(10, *initialBufferedValue); std::shared_ptr postAssignBufferedValue = buffer->safeGet(); EXPECT_EQ(initialBufferedValue, postAssignBufferedValue); buffer->publish(); EXPECT_EQ(10, *initialBufferedValue); std::shared_ptr postPublishBufferedValue = buffer->safeGet(); EXPECT_EQ(20, *postPublishBufferedValue); } } } opensurgsim-0.7.0/SurgSim/DataStructures/UnitTests/CMakeLists.txt000066400000000000000000000032321277777236100251640ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2012-2016, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. include_directories ( ${gtest_SOURCE_DIR}/include ) set(UNIT_TEST_SOURCES AabbTreeDataTests.cpp AabbTreeNodeTests.cpp AabbTreeTests.cpp BufferedValueTests.cpp DataGroupTests.cpp DataStructuresConvertTests.cpp Grid1DTests.cpp Grid2DTests.cpp Grid3DTests.cpp GridTests.cpp GroupsTests.cpp ImageMapTest.cpp ImageTest.cpp IndexDirectoryTests.cpp IndexedLocalCoordinateTest.cpp LocationTests.cpp MeshElementTest.cpp MeshTest.cpp MeshVertexTest.cpp NamedDataTests.cpp NamedVariantDataTests.cpp OctreeNodeTests.cpp OptionalValueTests.cpp PlyReaderTests.cpp SegmentMeshTest.cpp TetrahedronMeshTest.cpp TriangleMeshTest.cpp ) set(UNIT_TEST_HEADERS GridTests.h MockObjects.h ) set(LIBS SurgSimDataStructures SurgSimMath ) file(COPY Data DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) configure_file( "${CMAKE_CURRENT_SOURCE_DIR}/config.txt.in" "${CMAKE_CURRENT_BINARY_DIR}/config.txt" ) surgsim_add_unit_tests(SurgSimDataStructuresTest) set_target_properties(SurgSimDataStructuresTest PROPERTIES FOLDER "DataStructures") opensurgsim-0.7.0/SurgSim/DataStructures/UnitTests/Data/000077500000000000000000000000001277777236100232755ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/DataStructures/UnitTests/Data/PlyReaderTests/000077500000000000000000000000001277777236100262075ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/DataStructures/UnitTests/Data/PlyReaderTests/Cube_with_physics.ply000066400000000000000000000036371277777236100324210ustar00rootroot00000000000000ply format ascii 1.0 comment Created by Blender 2.69 (sub 0) - www.blender.org, source file: '' element vertex 26 property float x property float y property float z property float nx property float ny property float nz element face 12 property uint nature property list uchar uint vertex_indices end_header 1.000000 1.000000 -1.000000 0.000000 0.000000 -1.000000 1.000000 -1.000000 -1.000000 0.000000 0.000000 -1.000000 -1.000000 -1.000000 -1.000000 0.000000 0.000000 -1.000000 1.000000 0.999999 1.000000 -0.000000 -0.000000 1.000000 -1.000000 1.000000 1.000000 -0.000000 -0.000000 1.000000 0.999999 -1.000001 1.000000 -0.000000 -0.000000 1.000000 1.000000 1.000000 -1.000000 1.000000 0.000000 -0.000000 1.000000 0.999999 1.000000 1.000000 0.000000 -0.000000 1.000000 -1.000000 -1.000000 1.000000 0.000000 -0.000000 1.000000 -1.000000 -1.000000 -0.000000 -1.000000 -0.000000 0.999999 -1.000001 1.000000 -0.000000 -1.000000 -0.000000 -1.000000 -1.000000 -1.000000 -0.000000 -1.000000 -0.000000 -1.000000 -1.000000 -1.000000 -1.000000 0.000000 -0.000000 -1.000000 -1.000000 1.000000 -1.000000 0.000000 -0.000000 -1.000000 1.000000 1.000000 -1.000000 0.000000 -0.000000 1.000000 0.999999 1.000000 0.000000 1.000000 0.000000 1.000000 1.000000 -1.000000 0.000000 1.000000 0.000000 -1.000000 1.000000 1.000000 0.000000 1.000000 0.000000 -1.000000 1.000000 -1.000000 0.000000 0.000000 -1.000000 1.000000 0.999999 1.000000 1.000000 -0.000001 0.000000 0.999999 -1.000001 1.000000 1.000000 -0.000001 0.000000 1.000000 -1.000000 -1.000000 1.000000 -0.000001 0.000000 -1.000000 1.000000 -1.000000 0.000000 1.000000 0.000000 -1.000000 -1.000000 1.000000 0.000000 -0.000000 1.000000 -1.000000 1.000000 -1.000000 -1.000000 0.000000 -0.000000 -1.000000 -1.000000 1.000000 -0.000000 -1.000000 0.000000 011 3 0 1 2 012 3 3 4 5 020 3 6 7 8 022 3 9 10 11 023 3 12 13 14 031 3 15 16 17 032 3 18 0 2 033 3 19 20 21 000 3 16 22 17 099 3 4 23 5 010 3 24 12 14 001 3 10 25 11 opensurgsim-0.7.0/SurgSim/DataStructures/UnitTests/Data/PlyReaderTests/Testdata.ply000066400000000000000000000010211277777236100305000ustar00rootroot00000000000000ply format ascii 1.0 comment TestData not really a mesh element vertex 4 property float x property float y property float z property float nx property float ny property float nz element face 4 property list uchar uint vertex_indices property int extra end_header 1.000000 2.000000 3.000000 0.000000 0.000000 -1.000000 -2.000000 -3.000000 -4.000000 0.000000 0.000000 -1.000000 3.000000 4.000000 5.000000 0.000000 0.000000 -1.000000 -4.000000 -5.000000 -6.000000 0.000000 0.000000 -1.000000 1 0 0 2 1 2 -1 3 3 4 5 -2 4 6 7 8 9 -3 opensurgsim-0.7.0/SurgSim/DataStructures/UnitTests/Data/SegmentMeshTest/000077500000000000000000000000001277777236100263545ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/DataStructures/UnitTests/Data/SegmentMeshTest/segmentmesh.ply000066400000000000000000000003511277777236100314200ustar00rootroot00000000000000ply format ascii 1.0 comment Created by hand element vertex 4 property double x property double y property double z element 1d_element 3 property list uint uint vertex_indices end_header 1 2 3 4 5 6 7 8 9 11 11 12 2 0 1 2 1 2 2 2 3 opensurgsim-0.7.0/SurgSim/DataStructures/UnitTests/DataGroupTests.cpp000066400000000000000000000410551277777236100260460ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the DataGroup class. #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/DataStructures/DataGroupBuilder.h" #include "SurgSim/DataStructures/DataGroupCopier.h" #include "SurgSim/DataStructures/NamedData.h" #include "SurgSim/Framework/LockedContainer.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/Vector.h" #include "gtest/gtest.h" #include "SurgSim/DataStructures/UnitTests/MockObjects.h" using SurgSim::DataStructures::DataGroup; using SurgSim::DataStructures::DataGroupBuilder; using SurgSim::DataStructures::DataGroupCopier; using SurgSim::Math::RigidTransform3d; using SurgSim::Math::Vector3d; namespace { const double EPSILON = 1e-9; }; /// Creating a named data object. TEST(DataGroupTests, CanConstruct) { DataGroupBuilder builder; builder.addPose("test"); builder.addVector("test"); builder.addMatrix("test"); builder.addScalar("test"); builder.addInteger("test"); builder.addBoolean("test"); builder.addString("test"); builder.addImage("test"); builder.addCustom("test"); DataGroup data = builder.createData(); EXPECT_TRUE(data.poses().hasEntry("test")); EXPECT_FALSE(data.poses().hasData("test")); EXPECT_FALSE(data.strings().hasEntry("missing")); EXPECT_FALSE(data.strings().hasData("missing")); DataGroupBuilder builder2; builder2.addInteger("test"); DataGroup data2 = builder2.createData(); EXPECT_TRUE(data2.integers().hasEntry("test")); EXPECT_FALSE(data2.integers().hasData("test")); EXPECT_FALSE(data2.strings().hasEntry("missing")); EXPECT_FALSE(data2.strings().hasData("missing")); DataGroupBuilder builder3; DataGroup data3, data4 = builder3.createData(); EXPECT_NO_THROW(data3 = data4); // A DataGroup created by an empty DataGroupBuilder is valid (aka non-empty). } /// Creating a shared_ref to a named data object. TEST(DataGroupTests, CanCreateShared) { DataGroupBuilder builder; builder.addPose("test"); builder.addVector("test"); builder.addMatrix("test"); builder.addScalar("test"); builder.addInteger("test"); builder.addBoolean("test"); builder.addString("test"); builder.addImage("test"); builder.addCustom("test"); std::shared_ptr data = builder.createSharedData(); EXPECT_TRUE(data->poses().hasEntry("test")); EXPECT_FALSE(data->poses().hasData("test")); EXPECT_FALSE(data->strings().hasEntry("missing")); EXPECT_FALSE(data->strings().hasData("missing")); } /// Creating an invalid (aka empty) data object. TEST(DataGroupTests, Uninitialized) { DataGroup data, data2; EXPECT_THROW(data = data2, SurgSim::Framework::AssertionFailure); } /// Putting data into the container. TEST(DataGroupTests, PutName) { DataGroupBuilder builder; builder.addPose("pose"); builder.addVector("vector"); builder.addMatrix("matrix"); builder.addScalar("scalar"); builder.addInteger("integer"); builder.addBoolean("boolean"); builder.addString("string"); builder.addImage("image"); builder.addCustom("mock_data"); DataGroup data = builder.createData(); const SurgSim::Math::Vector3d vector(1.23, 4.56, 7.89); const SurgSim::Math::Quaterniond quat = SurgSim::Math::makeRotationQuaternion(M_PI_2, SurgSim::Math::Vector3d(1, 0, 0)); const SurgSim::Math::RigidTransform3d pose = SurgSim::Math::makeRigidTransform(quat, vector); DataGroup::DynamicMatrixType matrix(2,3); matrix.fill(3.0); Mock3DData mockData(10,10,10); mockData.set(5, 5, 5, 1.2345); DataGroup::ImageType mockImage(3,3,1); data.poses().set("pose", pose); data.vectors().set("vector", vector); data.matrices().set("matrix", matrix); data.scalars().set("scalar", 1.23f); data.integers().set("integer", 123); data.booleans().set("boolean", true); data.strings().set("string", "string"); data.images().set("image", mockImage); data.customData().set("mock_data", mockData); EXPECT_TRUE(data.poses().hasEntry("pose")); EXPECT_TRUE(data.poses().hasData("pose")); EXPECT_TRUE(data.vectors().hasEntry("vector")); EXPECT_TRUE(data.vectors().hasData("vector")); EXPECT_TRUE(data.matrices().hasEntry("matrix")); EXPECT_TRUE(data.matrices().hasData("matrix")); EXPECT_TRUE(data.scalars().hasEntry("scalar")); EXPECT_TRUE(data.scalars().hasData("scalar")); EXPECT_TRUE(data.integers().hasEntry("integer")); EXPECT_TRUE(data.integers().hasData("integer")); EXPECT_TRUE(data.booleans().hasEntry("boolean")); EXPECT_TRUE(data.booleans().hasData("boolean")); EXPECT_TRUE(data.strings().hasEntry("string")); EXPECT_TRUE(data.strings().hasData("string")); EXPECT_TRUE(data.images().hasEntry("image")); EXPECT_TRUE(data.images().hasData("image")); EXPECT_TRUE(data.customData().hasEntry("mock_data")); EXPECT_TRUE(data.customData().hasData("mock_data")); } /// Getting data from the container. TEST(DataGroupTests, GetName) { DataGroupBuilder builder; builder.addPose("pose"); builder.addVector("vector"); builder.addMatrix("matrix"); builder.addScalar("scalar"); builder.addInteger("integer"); builder.addBoolean("boolean"); builder.addString("string"); builder.addImage("image"); builder.addCustom("mock_data"); DataGroup data = builder.createData(); const SurgSim::Math::Vector3d vector(1.23, 4.56, 7.89); const SurgSim::Math::Quaterniond quat = SurgSim::Math::makeRotationQuaternion(M_PI_2, SurgSim::Math::Vector3d(1, 0, 0)); const SurgSim::Math::RigidTransform3d pose = SurgSim::Math::makeRigidTransform(quat, vector); DataGroup::DynamicMatrixType matrix(2,3); matrix.fill(3.0); Mock3DData mockData(10,10,10); mockData.set(5, 5, 5, 1.23); mockData.set(1, 2, 3, 4.56); DataGroup::ImageType mockImage(3,3,1); mockImage.getChannel(0) << 0, 3, 6, 1, 4, 7, 2, 5, 8; data.poses().set("pose", pose); data.vectors().set("vector", vector); data.matrices().set("matrix", matrix); data.scalars().set("scalar", 1.23); data.integers().set("integer", 123); data.booleans().set("boolean", true); data.strings().set("string", "string"); data.images().set("image", mockImage); data.customData().set("mock_data", mockData); { SurgSim::Math::RigidTransform3d value = SurgSim::Math::RigidTransform3d::Identity(); EXPECT_TRUE(data.poses().get("pose", &value)); EXPECT_NEAR(0, (value.linear() - quat.matrix()).norm(), EPSILON); EXPECT_NEAR(0, (value.translation() - vector).norm(), EPSILON); } { SurgSim::Math::Vector3d value(0, 0, 0); EXPECT_TRUE(data.vectors().get("vector", &value)); EXPECT_NEAR(0, (value - vector).norm(), EPSILON); } { DataGroup::DynamicMatrixType value; EXPECT_TRUE(data.matrices().get("matrix", &value)); EXPECT_EQ(matrix.cols(), value.cols()); EXPECT_EQ(matrix.rows(), value.rows()); EXPECT_NEAR(0, (value - matrix).norm(), EPSILON); } { double value = 0; EXPECT_TRUE(data.scalars().get("scalar", &value)); EXPECT_NEAR(1.23, value, EPSILON); } { int value = 0; EXPECT_TRUE(data.integers().get("integer", &value)); EXPECT_EQ(123, value); } { bool value = 0; EXPECT_TRUE(data.booleans().get("boolean", &value)); EXPECT_EQ(true, value); } { std::string value = ""; EXPECT_TRUE(data.strings().get("string", &value)); EXPECT_EQ("string", value); } { DataGroup::ImageType value; EXPECT_TRUE(data.images().get("image", &value)); EXPECT_NEAR(0.0f, value.getData()[0], EPSILON); EXPECT_NEAR(1.0f, value.getData()[1], EPSILON); EXPECT_NEAR(2.0f, value.getData()[2], EPSILON); EXPECT_NEAR(3.0f, value.getData()[3], EPSILON); EXPECT_NEAR(4.0f, value.getData()[4], EPSILON); EXPECT_NEAR(5.0f, value.getData()[5], EPSILON); EXPECT_NEAR(6.0f, value.getData()[6], EPSILON); EXPECT_NEAR(7.0f, value.getData()[7], EPSILON); EXPECT_NEAR(8.0f, value.getData()[8], EPSILON); } { Mock3DData value; EXPECT_TRUE(data.customData().get("mock_data", &value)); EXPECT_NEAR(1.23, value.get(5, 5, 5), EPSILON); EXPECT_NEAR(4.56, value.get(1, 2, 3), EPSILON); } } /// Resetting the data in the container. TEST(DataGroupTests, ResetAll) { DataGroupBuilder builder; builder.addPose("first"); builder.addScalar("second"); builder.addString("third"); builder.addCustom("fourth"); builder.addImage("fifth"); DataGroup data = builder.createData(); data.scalars().set("second", 1.23); data.strings().set("third", "hello"); data.customData().set("fourth", Mock3DData(10, 10, 10)); data.images().set("fifth", DataGroup::ImageType(10,10,2)); data.resetAll(); EXPECT_TRUE(data.poses().hasEntry("first")); EXPECT_FALSE(data.poses().hasData("first")); EXPECT_TRUE(data.scalars().hasEntry("second")); EXPECT_FALSE(data.scalars().hasData("second")); EXPECT_TRUE(data.strings().hasEntry("third")); EXPECT_FALSE(data.strings().hasData("third")); EXPECT_TRUE(data.customData().hasEntry("fourth")); EXPECT_FALSE(data.customData().hasData("fourth")); EXPECT_TRUE(data.images().hasEntry("fifth")); EXPECT_FALSE(data.images().hasData("fifth")); } /// Resetting one data entry at a time. TEST(DataGroupTests, ResetOne) { DataGroupBuilder builder; builder.addPose("first"); builder.addScalar("second"); builder.addString("third"); builder.addCustom("fourth"); DataGroup data = builder.createData(); data.scalars().set("second", 1.23); data.strings().set("third", "hello"); data.customData().set("fourth", Mock3DData(10, 10, 10)); data.strings().reset("third"); EXPECT_TRUE(data.poses().hasEntry("first")); EXPECT_FALSE(data.poses().hasData("first")); EXPECT_TRUE(data.scalars().hasEntry("second")); EXPECT_TRUE(data.scalars().hasData("second")); EXPECT_TRUE(data.strings().hasEntry("third")); EXPECT_FALSE(data.strings().hasData("third")); EXPECT_TRUE(data.customData().hasEntry("fourth")); EXPECT_TRUE(data.customData().hasData("fourth")); data.scalars().reset("second"); EXPECT_TRUE(data.scalars().hasEntry("second")); EXPECT_FALSE(data.scalars().hasData("second")); } /// Copy Constructing DataGroups TEST(DataGroupTests, CopyConstruction) { DataGroupBuilder builder; builder.addPose("test"); builder.addBoolean("test"); builder.addBoolean("test2"); DataGroup data = builder.createData(); const bool trueBool = true; data.booleans().set("test2", trueBool); DataGroup copied_data = data; EXPECT_TRUE(copied_data.poses().hasEntry("test")); EXPECT_FALSE(copied_data.poses().hasData("test")); EXPECT_TRUE(copied_data.booleans().hasEntry("test")); EXPECT_FALSE(copied_data.booleans().hasData("test")); EXPECT_TRUE(copied_data.booleans().hasEntry("test2")); EXPECT_TRUE(copied_data.booleans().hasData("test2")); bool outBool, outCopiedBool; data.booleans().get("test2", &outBool); copied_data.booleans().get("test2", &outCopiedBool); EXPECT_EQ(outBool, outCopiedBool); EXPECT_EQ(trueBool, outCopiedBool); EXPECT_FALSE(copied_data.strings().hasEntry("missing")); EXPECT_FALSE(copied_data.strings().hasData("missing")); } /// Assigning DataGroups, testing DataGroup::operator= TEST(DataGroupTests, Assignment) { DataGroupBuilder builder; builder.addPose("test"); builder.addBoolean("test"); builder.addBoolean("test2"); DataGroup data = builder.createData(); const bool trueBool = true; data.booleans().set("test2", trueBool); DataGroup copied_data; copied_data = data; EXPECT_TRUE(copied_data.poses().hasEntry("test")); EXPECT_FALSE(copied_data.poses().hasData("test")); EXPECT_TRUE(copied_data.booleans().hasEntry("test")); EXPECT_FALSE(copied_data.booleans().hasData("test")); EXPECT_TRUE(copied_data.booleans().hasEntry("test2")); EXPECT_TRUE(copied_data.booleans().hasData("test2")); bool outBool, outCopiedBool; data.booleans().get("test2", &outBool); copied_data.booleans().get("test2", &outCopiedBool); EXPECT_EQ(outBool, outCopiedBool); EXPECT_EQ(trueBool, outCopiedBool); EXPECT_FALSE(copied_data.strings().hasEntry("missing")); EXPECT_FALSE(copied_data.strings().hasData("missing")); DataGroup data2; EXPECT_THROW(data = data2, SurgSim::Framework::AssertionFailure); // the right-hand DataGroup is not valid DataGroup data3 = builder.createData(); // Having the same entries is not sufficient for DataGroup assignment. // There are three situations in which assignment will not assert: // 1) the DataGroup being assigned to is "empty" (i.e., was default-constructed and has not yet been assigned to or // otherwise altered), // 2) one of the DataGroups was default-constructed and then the other DataGroup was assigned to it, or // 3) one of the DataGroups was copy-constructed from the other. EXPECT_THROW(data = data3, SurgSim::Framework::AssertionFailure); DataGroup data4(data); data4.booleans().set("test2", !trueBool); EXPECT_NO_THROW(data = data4); // data4 can assign to data because data4 was copy-constructed from data EXPECT_NO_THROW(data4 = data); } /// Non-assignment copying DataGroups with DataGroupCopier. TEST(DataGroupTests, DataGroupCopier) { DataGroupBuilder sourceBuilder; sourceBuilder.addPose("test"); sourceBuilder.addBoolean("test"); sourceBuilder.addBoolean("test2"); DataGroup sourceData = sourceBuilder.createData(); DataGroupBuilder targetBuilder; targetBuilder.addPose("test2"); //different pose name targetBuilder.addBoolean("test2"); // same boolean name targetBuilder.addEntriesFrom(sourceData); DataGroup targetData = targetBuilder.createData(); ASSERT_TRUE(targetData.poses().hasEntry("test")); ASSERT_TRUE(targetData.poses().hasEntry("test2")); ASSERT_TRUE(targetData.booleans().hasEntry("test")); ASSERT_TRUE(targetData.booleans().hasEntry("test2")); ASSERT_THROW(targetData = sourceData, SurgSim::Framework::AssertionFailure); ASSERT_THROW(DataGroupCopier badCopier(sourceData, nullptr), SurgSim::Framework::AssertionFailure); DataGroupCopier copier(sourceData, &targetData); const RigidTransform3d testPose = SurgSim::Math::makeRigidTransform(Vector3d(1.0, 2.0, 3.0), Vector3d(1.0, 0.0, 0.0), Vector3d(0.0, 1.0, 0.0)); ASSERT_TRUE(sourceData.poses().set("test", testPose)); const bool testBoolean = true; ASSERT_TRUE(sourceData.booleans().set("test", testBoolean)); const bool testBoolean2 = false; ASSERT_TRUE(sourceData.booleans().set("test2", testBoolean2)); // Setting the initial value for the targetData's test2 boolean to the opposite value. ASSERT_TRUE(targetData.booleans().set("test2", !testBoolean2)); // Copy the data. ASSERT_THROW(copier.copy(sourceData, nullptr), SurgSim::Framework::AssertionFailure); ASSERT_NO_THROW(copier.copy(sourceData, &targetData)); RigidTransform3d outTestPose; ASSERT_TRUE(targetData.poses().get("test", &outTestPose)); EXPECT_TRUE(outTestPose.isApprox(testPose, EPSILON)); EXPECT_FALSE(targetData.poses().hasData("test2")); bool outTestBoolean; ASSERT_TRUE(targetData.booleans().get("test", &outTestBoolean)); EXPECT_EQ(testBoolean, outTestBoolean); bool outTestBoolean2; ASSERT_TRUE(targetData.booleans().get("test2", &outTestBoolean2)); EXPECT_EQ(testBoolean2, outTestBoolean2); } TEST(DataGroupTests, DataGroupInLockedContainer) { DataGroupBuilder builder; builder.addBoolean("test"); DataGroup data = builder.createData(); const bool trueBool = true; data.booleans().set("test", trueBool); SurgSim::Framework::LockedContainer lockedDataGroup; DataGroup copied_data; // the DataGroup in the LockedContainer was default-constructed and so is invalid (aka empty) // you cannot "get" an invalid DataGroup out of the LockedContainer. "set" must be called before "get". EXPECT_THROW(lockedDataGroup.get(&copied_data), SurgSim::Framework::AssertionFailure); lockedDataGroup.set(data); lockedDataGroup.get(&copied_data); EXPECT_TRUE(copied_data.booleans().hasEntry("test")); EXPECT_TRUE(copied_data.booleans().hasData("test")); bool outBool, outCopiedBool; data.booleans().get("test", &outBool); copied_data.booleans().get("test", &outCopiedBool); EXPECT_EQ(outBool, outCopiedBool); EXPECT_EQ(trueBool, outCopiedBool); } TEST(DataGroupTests, IsEmpty) { DataGroupBuilder builder; builder.addBoolean("test"); DataGroup data; EXPECT_TRUE(data.isEmpty()); data = builder.createData(); EXPECT_FALSE(data.isEmpty()); DataGroup data2; std::vector names; names.push_back("test string"); data2.scalars() = SurgSim::DataStructures::NamedData(names); EXPECT_FALSE(data2.isEmpty()); } opensurgsim-0.7.0/SurgSim/DataStructures/UnitTests/DataStructuresConvertTests.cpp000066400000000000000000000166161277777236100305030ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include #include "SurgSim/DataStructures/DataStructuresConvert.h" #include "SurgSim/Framework/Component.h" #include "SurgSim/Framework/FrameworkConvert.h" namespace { class EmptyComponent : public SurgSim::Framework::Component { public: explicit EmptyComponent(const std::string& name) : SurgSim::Framework::Component(name) { } SURGSIM_CLASSNAME(EmptyComponent); bool doInitialize() override { return true; } bool doWakeUp() override { return true; } }; SURGSIM_REGISTER(SurgSim::Framework::Component, EmptyComponent, EmptyComponent); } namespace SurgSim { namespace DataStructures { template void testStdArraySerialization(const std::array& value) { { SCOPED_TRACE("Normal test"); // Encode YAML::Node node; EXPECT_NO_THROW(node = value;); // Decode std::array newValue; newValue = node.as>(); // Verify for (size_t i = 0; i < Size; ++i) { EXPECT_EQ(value[i], newValue[i]); } } { SCOPED_TRACE("Decode into smaller array"); typedef std::array < Type, Size - 1 > SmallerArray; // Encode YAML::Node node; EXPECT_NO_THROW(node = value;); // Try decoding into a smaller array. SmallerArray smallerNewValue; EXPECT_ANY_THROW(smallerNewValue = node.as()); } { SCOPED_TRACE("Decode into larger array"); typedef std::array < Type, Size + 1 > LargerArray; // Encode YAML::Node node; EXPECT_NO_THROW(node = value;); // Try decoding into a larger array. LargerArray largerNewValue; EXPECT_ANY_THROW(largerNewValue = node.as()); } } TEST(DataStructuresConvertTests, StdArray) { { SCOPED_TRACE("Serialization of std::array of size 3"); std::array doubleArray; doubleArray[0] = 534.34; doubleArray[1] = 0.8435e56; doubleArray[2] = -56754.3; testStdArraySerialization(doubleArray); } { SCOPED_TRACE("Serialization of std::array of size 0"); typedef std::array ZeroSizeArray; ZeroSizeArray doubleEmptyArray; // Encode YAML::Node node; EXPECT_NO_THROW(node = doubleEmptyArray;); // Decode ZeroSizeArray newValue; EXPECT_NO_THROW(newValue = node.as();); } } TEST(DataStructuresConvertTests, StdUnorderedMapTests) { { SCOPED_TRACE("Serialization of std::unordered_map with double as key and integer as values"); typedef std::unordered_map TestMapType; TestMapType originalMap; originalMap.insert(TestMapType::value_type(1.0, 2)); originalMap.insert(TestMapType::value_type(3.0, 4)); YAML::Node node; EXPECT_NO_THROW(node = originalMap); EXPECT_EQ(2u, node.size()); TestMapType newMap; EXPECT_NO_THROW(newMap = node.as()); EXPECT_EQ(originalMap, newMap); } { SCOPED_TRACE("Serialization of std::unordered_map with integer as key and std::shared_ptr<> as values"); typedef std::unordered_map> TestMapType; TestMapType originalMap; auto mockComponent = std::make_shared("Component1"); auto mockComponent2 = std::make_shared("Component2"); originalMap.insert(TestMapType::value_type(1, mockComponent)); originalMap.insert(TestMapType::value_type(2, mockComponent2)); YAML::Node node; EXPECT_NO_THROW(node = originalMap); EXPECT_EQ(2u, node.size()); TestMapType newMap; EXPECT_NO_THROW(newMap = node.as()); EXPECT_EQ(originalMap.size(), newMap.size()); for (auto it = std::begin(originalMap); it != std::end(originalMap); ++it) { auto result = std::find_if(std::begin(newMap), std::end(newMap), [&it](const std::pair>& pair) { return it->second->getName() == pair.second->getName(); }); EXPECT_NE(std::end(newMap), result); } } { SCOPED_TRACE("Serialization of std::unordered_map with integer as key and std::unordered_set<> as values"); typedef std::unordered_map>> TestMapType2; TestMapType2 originalMap; std::unordered_set> set1; std::unordered_set> set2; auto mockComponent = std::make_shared("Component1"); auto mockComponent2 = std::make_shared("Component2"); auto mockComponent3 = std::make_shared("Component3"); set1.insert(mockComponent); set2.insert(mockComponent2); set2.insert(mockComponent3); originalMap.insert(TestMapType2::value_type(1, set1)); originalMap.insert(TestMapType2::value_type(2, set2)); YAML::Node node; EXPECT_NO_THROW(node = originalMap); EXPECT_EQ(2u, node.size()); TestMapType2 newMap; EXPECT_NO_THROW(newMap = node.as()); EXPECT_EQ(originalMap.size(), newMap.size()); for (auto it = std::begin(originalMap); it != std::end(originalMap); ++it) { auto representationSet = newMap.find(it->first)->second; EXPECT_EQ(it->second.size(), representationSet.size()); for (auto item = std::begin(it->second); item != std::end(it->second); ++item) { auto match = std::find_if(std::begin(representationSet), std::end(representationSet), [&item](const std::shared_ptr rep) { return rep->getName() == (*item)->getName(); }); EXPECT_NE(std::end(representationSet), match); } } } } TEST(DataStructuresConvertTests, StdUnorderedSetTests) { { SCOPED_TRACE("Serialization of std::unordered_set<> of integers"); typedef std::unordered_set TestSetType; TestSetType originalSet; originalSet.insert(1); originalSet.insert(2); YAML::Node node; EXPECT_NO_THROW(node = originalSet); EXPECT_EQ(2u, node.size()); TestSetType newSet; EXPECT_NO_THROW(newSet = node.as()); EXPECT_EQ(originalSet, newSet); } { SCOPED_TRACE("Serialization of std::unordered_set<> of std::shared_ptr<>"); typedef std::unordered_set> TestSetType; TestSetType originalSet; auto mockComponent = std::make_shared("Component1"); auto mockComponent2 = std::make_shared("Component2"); originalSet.insert(mockComponent); originalSet.insert(mockComponent2); YAML::Node node; EXPECT_NO_THROW(node = originalSet); EXPECT_EQ(2u, node.size()); TestSetType newSet; EXPECT_NO_THROW(newSet = node.as()); EXPECT_EQ(originalSet.size(), newSet.size()); for (auto it = std::begin(originalSet); it != std::end(originalSet); ++it) { auto result = std::find_if(std::begin(newSet), std::end(newSet), [&it](const std::shared_ptr& item) { return (*it)->getName() == item->getName(); }); EXPECT_NE(std::end(newSet), result); } } } }; // namespace DataStructures }; // namespace SurgSimopensurgsim-0.7.0/SurgSim/DataStructures/UnitTests/Grid1DTests.cpp000066400000000000000000000250611277777236100252310ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Math/Vector.h" #include "SurgSim/DataStructures/Grid.h" #include "SurgSim/DataStructures/UnitTests/GridTests.h" namespace SurgSim { namespace DataStructures { template class Grid1DTestBase : public GridTestBase { public: static const size_t dimension = 1u; typedef T TypeElement; }; typedef ::testing::Types MyTypes; TYPED_TEST_CASE(Grid1DTestBase, MyTypes); TYPED_TEST(Grid1DTestBase, ConstructorTest) { typedef typename TestFixture::GridType GridType; ASSERT_NO_THROW({GridType grid(this->m_size, this->m_aabb1Cell);}); ASSERT_NO_THROW({GridType grid(this->m_size, this->m_aabb);}); GridType grid(this->m_size, this->m_aabb); ASSERT_EQ(0u, grid.getActiveCells().size()); ASSERT_EQ(0u, grid.getCellIds().size()); ASSERT_TRUE(grid.getSize().isApprox(this->m_size)); ASSERT_TRUE(grid.getAABB().isApprox(this->m_aabb)); } TYPED_TEST(Grid1DTestBase, addElementTest) { typedef typename TestFixture::GridType GridType; typedef typename TestFixture::TypeElement TypeElement; GridType grid(this->m_size, this->m_aabb); // Add an element outside of the grid auto positionMin = this->m_aabb.max() - this->m_aabb.sizes() * 1.001; grid.addElement(TypeElement(), positionMin); ASSERT_EQ(0u, grid.getActiveCells().size()); ASSERT_EQ(0u, grid.getCellIds().size()); // Add an element outside of the grid auto positionMax = this->m_aabb.min() + this->m_aabb.sizes() * 1.001; grid.addElement(TypeElement(), positionMax); ASSERT_EQ(0u, grid.getActiveCells().size()); ASSERT_EQ(0u, grid.getCellIds().size()); // Add an element inside of the grid TypeElement e0(0), e1(1); grid.addElement(e0, Eigen::Matrix::Zero()); ASSERT_EQ(1u, grid.getActiveCells().size()); ASSERT_EQ(1u, grid.getCellIds().size()); ASSERT_NO_THROW(grid.getCellIds().at(e0)); ASSERT_ANY_THROW(grid.getCellIds().at(e1)); // Add an element inside of the grid, in the same cell grid.addElement(e1, Eigen::Matrix::Zero()); ASSERT_EQ(1u, grid.getActiveCells().size()); ASSERT_EQ(2u, grid.getCellIds().size()); ASSERT_NO_THROW(grid.getCellIds().at(e0)); ASSERT_NO_THROW(grid.getCellIds().at(e1)); ASSERT_EQ(grid.getCellIds()[e0], grid.getCellIds()[e1]); // Add an element inside of the grid, in a different cell TypeElement e2(2); grid.addElement(e2, this->m_size * 1.5); ASSERT_EQ(2u, grid.getActiveCells().size()); ASSERT_EQ(3u, grid.getCellIds().size()); ASSERT_NO_THROW(grid.getCellIds().at(e0)); ASSERT_NO_THROW(grid.getCellIds().at(e1)); ASSERT_NO_THROW(grid.getCellIds().at(e2)); ASSERT_EQ(grid.getCellIds()[e0], grid.getCellIds()[e1]); ASSERT_NE(grid.getCellIds()[e0], grid.getCellIds()[e2]); ASSERT_NE(grid.getCellIds()[e1], grid.getCellIds()[e2]); } TYPED_TEST(Grid1DTestBase, NeighborsTest) { typedef typename TestFixture::GridType GridType; typedef typename TestFixture::TypeElement TypeElement; GridType grid(this->m_size, this->m_aabb); // Build the following grid: // Cell(e0, e1) <- neighbor -> Cell(e2) <- neighbor -> Cell(e3) <- ..not neighbor.. -> Cell(e4) Eigen::Matrix position = Eigen::Matrix::Zero(); // Add an element inside of the grid TypeElement e0(0), e1(1); grid.addElement(e0, position); ASSERT_EQ(1u, grid.getActiveCells().size()); ASSERT_EQ(1u, grid.getCellIds().size()); ASSERT_NO_THROW(grid.getCellIds().at(e0)); ASSERT_ANY_THROW(grid.getCellIds().at(e1)); // Add an element inside of the grid, in the same cell grid.addElement(e1, position); ASSERT_EQ(1u, grid.getActiveCells().size()); ASSERT_EQ(2u, grid.getCellIds().size()); ASSERT_NO_THROW(grid.getCellIds().at(e0)); ASSERT_NO_THROW(grid.getCellIds().at(e1)); ASSERT_EQ(grid.getCellIds()[e0], grid.getCellIds()[e1]); // Add an element inside of the grid, in a different cell position[0] += this->m_size[0] * 1.1; // Next cell on the 1st dimension TypeElement e2(2); grid.addElement(e2, position); ASSERT_EQ(2u, grid.getActiveCells().size()); ASSERT_EQ(3u, grid.getCellIds().size()); ASSERT_NO_THROW(grid.getCellIds().at(e0)); ASSERT_NO_THROW(grid.getCellIds().at(e1)); ASSERT_NO_THROW(grid.getCellIds().at(e2)); ASSERT_EQ(grid.getCellIds()[e0], grid.getCellIds()[e1]); ASSERT_NE(grid.getCellIds()[e0], grid.getCellIds()[e2]); ASSERT_NE(grid.getCellIds()[e1], grid.getCellIds()[e2]); // Add an element inside of the grid, in a different cell position[0] += this->m_size[0] * 1.1; // Next cell on the 1st dimension TypeElement e3(3); grid.addElement(e3, position); ASSERT_EQ(3u, grid.getActiveCells().size()); ASSERT_EQ(4u, grid.getCellIds().size()); ASSERT_NO_THROW(grid.getCellIds().at(e0)); ASSERT_NO_THROW(grid.getCellIds().at(e1)); ASSERT_NO_THROW(grid.getCellIds().at(e2)); ASSERT_NO_THROW(grid.getCellIds().at(e3)); ASSERT_EQ(grid.getCellIds()[e0], grid.getCellIds()[e1]); ASSERT_NE(grid.getCellIds()[e0], grid.getCellIds()[e2]); ASSERT_NE(grid.getCellIds()[e0], grid.getCellIds()[e3]); ASSERT_NE(grid.getCellIds()[e2], grid.getCellIds()[e3]); // Add an element inside of the grid, far away from all other elements position[0] += this->m_size[0] * 2.1; // Few cells further on the 1st dimension TypeElement e4(4); grid.addElement(e4, position); ASSERT_EQ(4u, grid.getActiveCells().size()); ASSERT_EQ(5u, grid.getCellIds().size()); ASSERT_NO_THROW(grid.getCellIds().at(e0)); ASSERT_NO_THROW(grid.getCellIds().at(e1)); ASSERT_NO_THROW(grid.getCellIds().at(e2)); ASSERT_NO_THROW(grid.getCellIds().at(e3)); ASSERT_NO_THROW(grid.getCellIds().at(e4)); ASSERT_EQ(grid.getCellIds()[e0], grid.getCellIds()[e1]); ASSERT_NE(grid.getCellIds()[e0], grid.getCellIds()[e2]); ASSERT_NE(grid.getCellIds()[e0], grid.getCellIds()[e3]); ASSERT_NE(grid.getCellIds()[e2], grid.getCellIds()[e3]); ASSERT_NE(grid.getCellIds()[e0], grid.getCellIds()[e4]); ASSERT_NE(grid.getCellIds()[e1], grid.getCellIds()[e4]); ASSERT_NE(grid.getCellIds()[e2], grid.getCellIds()[e4]); ASSERT_NE(grid.getCellIds()[e3], grid.getCellIds()[e4]); ASSERT_NO_THROW(grid.getNeighbors(e0)); ASSERT_NO_THROW(grid.getNeighbors(e1)); ASSERT_NO_THROW(grid.getNeighbors(e2)); ASSERT_NO_THROW(grid.getNeighbors(e3)); ASSERT_NO_THROW(grid.getNeighbors(e4)); // e0's neighbors = {e0, e1, e2} auto& e0Neighbors = grid.getNonConstNeighbors(e0); ASSERT_EQ(3u, e0Neighbors.size()); ASSERT_TRUE(std::find(e0Neighbors.begin(), e0Neighbors.end(), e0) != e0Neighbors.end()); ASSERT_TRUE(std::find(e0Neighbors.begin(), e0Neighbors.end(), e1) != e0Neighbors.end()); ASSERT_TRUE(std::find(e0Neighbors.begin(), e0Neighbors.end(), e2) != e0Neighbors.end()); ASSERT_FALSE(std::find(e0Neighbors.begin(), e0Neighbors.end(), e3) != e0Neighbors.end()); ASSERT_FALSE(std::find(e0Neighbors.begin(), e0Neighbors.end(), e4) != e0Neighbors.end()); // e1's neighbors = {e0, e1, e2} auto& e1Neighbors = grid.getNonConstNeighbors(e1); ASSERT_EQ(3u, e1Neighbors.size()); ASSERT_TRUE(std::find(e1Neighbors.begin(), e1Neighbors.end(), e0) != e1Neighbors.end()); ASSERT_TRUE(std::find(e1Neighbors.begin(), e1Neighbors.end(), e1) != e1Neighbors.end()); ASSERT_TRUE(std::find(e1Neighbors.begin(), e1Neighbors.end(), e2) != e1Neighbors.end()); ASSERT_FALSE(std::find(e1Neighbors.begin(), e1Neighbors.end(), e3) != e1Neighbors.end()); ASSERT_FALSE(std::find(e1Neighbors.begin(), e1Neighbors.end(), e4) != e1Neighbors.end()); // e2's neighbors = {e0, e1, e2, e3} auto& e2Neighbors = grid.getNonConstNeighbors(e2); ASSERT_EQ(4u, e2Neighbors.size()); ASSERT_TRUE(std::find(e2Neighbors.begin(), e2Neighbors.end(), e0) != e2Neighbors.end()); ASSERT_TRUE(std::find(e2Neighbors.begin(), e2Neighbors.end(), e1) != e2Neighbors.end()); ASSERT_TRUE(std::find(e2Neighbors.begin(), e2Neighbors.end(), e2) != e2Neighbors.end()); ASSERT_TRUE(std::find(e2Neighbors.begin(), e2Neighbors.end(), e3) != e2Neighbors.end()); ASSERT_FALSE(std::find(e2Neighbors.begin(), e2Neighbors.end(), e4) != e2Neighbors.end()); // e3's neighbors = {e2, e3} auto& e3Neighbors = grid.getNonConstNeighbors(e3); ASSERT_EQ(2u, e3Neighbors.size()); ASSERT_FALSE(std::find(e3Neighbors.begin(), e3Neighbors.end(), e0) != e3Neighbors.end()); ASSERT_FALSE(std::find(e3Neighbors.begin(), e3Neighbors.end(), e1) != e3Neighbors.end()); ASSERT_TRUE(std::find(e3Neighbors.begin(), e3Neighbors.end(), e2) != e3Neighbors.end()); ASSERT_TRUE(std::find(e3Neighbors.begin(), e3Neighbors.end(), e3) != e3Neighbors.end()); ASSERT_FALSE(std::find(e3Neighbors.begin(), e3Neighbors.end(), e4) != e3Neighbors.end()); // e4's neighbors = {e4} auto& e4Neighbors = grid.getNonConstNeighbors(e4); ASSERT_EQ(1u, e4Neighbors.size()); ASSERT_FALSE(std::find(e4Neighbors.begin(), e4Neighbors.end(), e0) != e4Neighbors.end()); ASSERT_FALSE(std::find(e4Neighbors.begin(), e4Neighbors.end(), e1) != e4Neighbors.end()); ASSERT_FALSE(std::find(e4Neighbors.begin(), e4Neighbors.end(), e2) != e4Neighbors.end()); ASSERT_FALSE(std::find(e4Neighbors.begin(), e4Neighbors.end(), e3) != e4Neighbors.end()); ASSERT_TRUE(std::find(e4Neighbors.begin(), e4Neighbors.end(), e4) != e4Neighbors.end()); // Test element not in the grid has no neighbors TypeElement e5(5); ASSERT_EQ(0u, grid.getNeighbors(e5).size()); } TYPED_TEST(Grid1DTestBase, ResetTest) { typedef typename TestFixture::GridType GridType; typedef typename TestFixture::TypeElement TypeElement; GridType grid(this->m_size, this->m_aabb); TypeElement e0(0), e1(1); grid.addElement(e0, Eigen::Matrix::Zero()); grid.addElement(e1, Eigen::Matrix::Zero()); ASSERT_NE(0u, grid.getActiveCells().size()); ASSERT_NE(0u, grid.getCellIds().size()); ASSERT_NE(0u, grid.getNeighbors(e0).size()); ASSERT_NE(0u, grid.getNeighbors(e1).size()); ASSERT_NO_THROW(grid.reset()); ASSERT_EQ(0u, grid.getActiveCells().size()); ASSERT_EQ(0u, grid.getCellIds().size()); ASSERT_EQ(0u, grid.getNeighbors(e0).size()); ASSERT_EQ(0u, grid.getNeighbors(e1).size()); } }; // namespace DataStructures }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/DataStructures/UnitTests/Grid2DTests.cpp000066400000000000000000000252151277777236100252330ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Math/Vector.h" #include "SurgSim/DataStructures/Grid.h" #include "SurgSim/DataStructures/UnitTests/GridTests.h" namespace SurgSim { namespace DataStructures { template class Grid2DTestBase : public GridTestBase { public: /// The test parameters typedef T TypeElement; static const size_t dimension = 2u; }; typedef ::testing::Types MyTypes; TYPED_TEST_CASE(Grid2DTestBase, MyTypes); TYPED_TEST(Grid2DTestBase, ConstructorTest) { typedef typename TestFixture::GridType GridType; ASSERT_NO_THROW({GridType grid(this->m_size, this->m_aabb1Cell);}); ASSERT_NO_THROW({GridType grid(this->m_size, this->m_aabb);}); ASSERT_NO_THROW({GridType grid(this->m_size, this->m_aabbBig);}); GridType grid(this->m_size, this->m_aabb); ASSERT_EQ(0u, grid.getActiveCells().size()); ASSERT_EQ(0u, grid.getCellIds().size()); ASSERT_TRUE(grid.getSize().isApprox(this->m_size)); ASSERT_TRUE(grid.getAABB().isApprox(this->m_aabb)); } TYPED_TEST(Grid2DTestBase, addElementTest) { typedef typename TestFixture::GridType GridType; typedef typename TestFixture::TypeElement TypeElement; GridType grid(this->m_size, this->m_aabb); // Add an element outside of the grid auto positionMin = this->m_aabb.max() - this->m_aabb.sizes() * 1.001; grid.addElement(TypeElement(), positionMin); ASSERT_EQ(0u, grid.getActiveCells().size()); ASSERT_EQ(0u, grid.getCellIds().size()); // Add an element outside of the grid auto positionMax = this->m_aabb.min() + this->m_aabb.sizes() * 1.001; grid.addElement(TypeElement(), positionMax); ASSERT_EQ(0u, grid.getActiveCells().size()); ASSERT_EQ(0u, grid.getCellIds().size()); // Add an element inside of the grid TypeElement e0(0), e1(1); grid.addElement(e0, Eigen::Matrix::Zero()); ASSERT_EQ(1u, grid.getActiveCells().size()); ASSERT_EQ(1u, grid.getCellIds().size()); ASSERT_NO_THROW(grid.getCellIds().at(e0)); ASSERT_ANY_THROW(grid.getCellIds().at(e1)); // Add an element inside of the grid, in the same cell grid.addElement(e1, Eigen::Matrix::Zero()); ASSERT_EQ(1u, grid.getActiveCells().size()); ASSERT_EQ(2u, grid.getCellIds().size()); ASSERT_NO_THROW(grid.getCellIds().at(e0)); ASSERT_NO_THROW(grid.getCellIds().at(e1)); ASSERT_EQ(grid.getCellIds()[e0], grid.getCellIds()[e1]); // Add an element inside of the grid, in a different cell TypeElement e2(2); grid.addElement(e2, this->m_size * 1.5); ASSERT_EQ(2u, grid.getActiveCells().size()); ASSERT_EQ(3u, grid.getCellIds().size()); ASSERT_NO_THROW(grid.getCellIds().at(e0)); ASSERT_NO_THROW(grid.getCellIds().at(e1)); ASSERT_NO_THROW(grid.getCellIds().at(e2)); ASSERT_EQ(grid.getCellIds()[e0], grid.getCellIds()[e1]); ASSERT_NE(grid.getCellIds()[e0], grid.getCellIds()[e2]); ASSERT_NE(grid.getCellIds()[e1], grid.getCellIds()[e2]); } TYPED_TEST(Grid2DTestBase, NeighborsTest) { typedef typename TestFixture::GridType GridType; typedef typename TestFixture::TypeElement TypeElement; GridType grid(this->m_size, this->m_aabb); // Build the following grid: // Cell(e0, e1) <- neighbor -> Cell(e2) <- neighbor -> Cell(e3) <- ..not neighbor.. -> Cell(e4) Eigen::Matrix position = Eigen::Matrix::Zero(); // Add an element inside of the grid TypeElement e0(0), e1(1); grid.addElement(e0, position); ASSERT_EQ(1u, grid.getActiveCells().size()); ASSERT_EQ(1u, grid.getCellIds().size()); ASSERT_NO_THROW(grid.getCellIds().at(e0)); ASSERT_ANY_THROW(grid.getCellIds().at(e1)); // Add an element inside of the grid, in the same cell grid.addElement(e1, position); ASSERT_EQ(1u, grid.getActiveCells().size()); ASSERT_EQ(2u, grid.getCellIds().size()); ASSERT_NO_THROW(grid.getCellIds().at(e0)); ASSERT_NO_THROW(grid.getCellIds().at(e1)); ASSERT_EQ(grid.getCellIds()[e0], grid.getCellIds()[e1]); // Add an element inside of the grid, in a different cell position[0] += this->m_size[0] * 1.1; // Next cell on the 1st dimension TypeElement e2(2); grid.addElement(e2, position); ASSERT_EQ(2u, grid.getActiveCells().size()); ASSERT_EQ(3u, grid.getCellIds().size()); ASSERT_NO_THROW(grid.getCellIds().at(e0)); ASSERT_NO_THROW(grid.getCellIds().at(e1)); ASSERT_NO_THROW(grid.getCellIds().at(e2)); ASSERT_EQ(grid.getCellIds()[e0], grid.getCellIds()[e1]); ASSERT_NE(grid.getCellIds()[e0], grid.getCellIds()[e2]); ASSERT_NE(grid.getCellIds()[e1], grid.getCellIds()[e2]); // Add an element inside of the grid, in a different cell position[0] += this->m_size[0] * 1.1; // Next cell on the 1st dimension TypeElement e3(3); grid.addElement(e3, position); ASSERT_EQ(3u, grid.getActiveCells().size()); ASSERT_EQ(4u, grid.getCellIds().size()); ASSERT_NO_THROW(grid.getCellIds().at(e0)); ASSERT_NO_THROW(grid.getCellIds().at(e1)); ASSERT_NO_THROW(grid.getCellIds().at(e2)); ASSERT_NO_THROW(grid.getCellIds().at(e3)); ASSERT_EQ(grid.getCellIds()[e0], grid.getCellIds()[e1]); ASSERT_NE(grid.getCellIds()[e0], grid.getCellIds()[e2]); ASSERT_NE(grid.getCellIds()[e0], grid.getCellIds()[e3]); ASSERT_NE(grid.getCellIds()[e2], grid.getCellIds()[e3]); // Add an element inside of the grid, far away from all other elements position[0] += this->m_size[0] * 2.1; // Few cells further on the 1st dimension TypeElement e4(4); grid.addElement(e4, position); ASSERT_EQ(4u, grid.getActiveCells().size()); ASSERT_EQ(5u, grid.getCellIds().size()); ASSERT_NO_THROW(grid.getCellIds().at(e0)); ASSERT_NO_THROW(grid.getCellIds().at(e1)); ASSERT_NO_THROW(grid.getCellIds().at(e2)); ASSERT_NO_THROW(grid.getCellIds().at(e3)); ASSERT_NO_THROW(grid.getCellIds().at(e4)); ASSERT_EQ(grid.getCellIds()[e0], grid.getCellIds()[e1]); ASSERT_NE(grid.getCellIds()[e0], grid.getCellIds()[e2]); ASSERT_NE(grid.getCellIds()[e0], grid.getCellIds()[e3]); ASSERT_NE(grid.getCellIds()[e2], grid.getCellIds()[e3]); ASSERT_NE(grid.getCellIds()[e0], grid.getCellIds()[e4]); ASSERT_NE(grid.getCellIds()[e1], grid.getCellIds()[e4]); ASSERT_NE(grid.getCellIds()[e2], grid.getCellIds()[e4]); ASSERT_NE(grid.getCellIds()[e3], grid.getCellIds()[e4]); ASSERT_NO_THROW(grid.getNeighbors(e0)); ASSERT_NO_THROW(grid.getNeighbors(e1)); ASSERT_NO_THROW(grid.getNeighbors(e2)); ASSERT_NO_THROW(grid.getNeighbors(e3)); ASSERT_NO_THROW(grid.getNeighbors(e4)); // e0's neighbors = {e0, e1, e2} auto& e0Neighbors = grid.getNonConstNeighbors(e0); ASSERT_EQ(3u, e0Neighbors.size()); ASSERT_TRUE(std::find(e0Neighbors.begin(), e0Neighbors.end(), e0) != e0Neighbors.end()); ASSERT_TRUE(std::find(e0Neighbors.begin(), e0Neighbors.end(), e1) != e0Neighbors.end()); ASSERT_TRUE(std::find(e0Neighbors.begin(), e0Neighbors.end(), e2) != e0Neighbors.end()); ASSERT_FALSE(std::find(e0Neighbors.begin(), e0Neighbors.end(), e3) != e0Neighbors.end()); ASSERT_FALSE(std::find(e0Neighbors.begin(), e0Neighbors.end(), e4) != e0Neighbors.end()); // e1's neighbors = {e0, e1, e2} auto& e1Neighbors = grid.getNonConstNeighbors(e1); ASSERT_EQ(3u, e1Neighbors.size()); ASSERT_TRUE(std::find(e1Neighbors.begin(), e1Neighbors.end(), e0) != e1Neighbors.end()); ASSERT_TRUE(std::find(e1Neighbors.begin(), e1Neighbors.end(), e1) != e1Neighbors.end()); ASSERT_TRUE(std::find(e1Neighbors.begin(), e1Neighbors.end(), e2) != e1Neighbors.end()); ASSERT_FALSE(std::find(e1Neighbors.begin(), e1Neighbors.end(), e3) != e1Neighbors.end()); ASSERT_FALSE(std::find(e1Neighbors.begin(), e1Neighbors.end(), e4) != e1Neighbors.end()); // e2's neighbors = {e0, e1, e2, e3} auto& e2Neighbors = grid.getNonConstNeighbors(e2); ASSERT_EQ(4u, e2Neighbors.size()); ASSERT_TRUE(std::find(e2Neighbors.begin(), e2Neighbors.end(), e0) != e2Neighbors.end()); ASSERT_TRUE(std::find(e2Neighbors.begin(), e2Neighbors.end(), e1) != e2Neighbors.end()); ASSERT_TRUE(std::find(e2Neighbors.begin(), e2Neighbors.end(), e2) != e2Neighbors.end()); ASSERT_TRUE(std::find(e2Neighbors.begin(), e2Neighbors.end(), e3) != e2Neighbors.end()); ASSERT_FALSE(std::find(e2Neighbors.begin(), e2Neighbors.end(), e4) != e2Neighbors.end()); // e3's neighbors = {e2, e3} auto& e3Neighbors = grid.getNonConstNeighbors(e3); ASSERT_EQ(2u, e3Neighbors.size()); ASSERT_FALSE(std::find(e3Neighbors.begin(), e3Neighbors.end(), e0) != e3Neighbors.end()); ASSERT_FALSE(std::find(e3Neighbors.begin(), e3Neighbors.end(), e1) != e3Neighbors.end()); ASSERT_TRUE(std::find(e3Neighbors.begin(), e3Neighbors.end(), e2) != e3Neighbors.end()); ASSERT_TRUE(std::find(e3Neighbors.begin(), e3Neighbors.end(), e3) != e3Neighbors.end()); ASSERT_FALSE(std::find(e3Neighbors.begin(), e3Neighbors.end(), e4) != e3Neighbors.end()); // e4's neighbors = {e4} auto& e4Neighbors = grid.getNonConstNeighbors(e4); ASSERT_EQ(1u, e4Neighbors.size()); ASSERT_FALSE(std::find(e4Neighbors.begin(), e4Neighbors.end(), e0) != e4Neighbors.end()); ASSERT_FALSE(std::find(e4Neighbors.begin(), e4Neighbors.end(), e1) != e4Neighbors.end()); ASSERT_FALSE(std::find(e4Neighbors.begin(), e4Neighbors.end(), e2) != e4Neighbors.end()); ASSERT_FALSE(std::find(e4Neighbors.begin(), e4Neighbors.end(), e3) != e4Neighbors.end()); ASSERT_TRUE(std::find(e4Neighbors.begin(), e4Neighbors.end(), e4) != e4Neighbors.end()); // Test element not in the grid has no neighbors TypeElement e5(5); ASSERT_EQ(0u, grid.getNeighbors(e5).size()); } TYPED_TEST(Grid2DTestBase, ResetTest) { typedef typename TestFixture::GridType GridType; typedef typename TestFixture::TypeElement TypeElement; GridType grid(this->m_size, this->m_aabb); TypeElement e0(0), e1(1); grid.addElement(e0, Eigen::Matrix::Zero()); grid.addElement(e1, Eigen::Matrix::Zero()); ASSERT_NE(0u, grid.getActiveCells().size()); ASSERT_NE(0u, grid.getCellIds().size()); ASSERT_NE(0u, grid.getNeighbors(e0).size()); ASSERT_NE(0u, grid.getNeighbors(e1).size()); ASSERT_NO_THROW(grid.reset()); ASSERT_EQ(0u, grid.getActiveCells().size()); ASSERT_EQ(0u, grid.getCellIds().size()); ASSERT_EQ(0u, grid.getNeighbors(e0).size()); ASSERT_EQ(0u, grid.getNeighbors(e1).size()); } }; // namespace DataStructures }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/DataStructures/UnitTests/Grid3DTests.cpp000066400000000000000000000405531277777236100252360ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Math/Vector.h" #include "SurgSim/DataStructures/Grid.h" #include "SurgSim/DataStructures/UnitTests/GridTests.h" namespace SurgSim { namespace DataStructures { template class Grid3DTestBase : public GridTestBase { public: /// The test parameters typedef T TypeElement; static const size_t dimension = 3u; }; typedef ::testing::Types MyTypes; TYPED_TEST_CASE(Grid3DTestBase, MyTypes); TYPED_TEST(Grid3DTestBase, ConstructorTest) { typedef typename TestFixture::GridType GridType; ASSERT_NO_THROW({GridType grid(this->m_size, this->m_aabb1Cell);}); ASSERT_NO_THROW({GridType grid(this->m_size, this->m_aabb);}); ASSERT_NO_THROW({GridType grid(this->m_size, this->m_aabbBig);}); GridType grid(this->m_size, this->m_aabb); ASSERT_EQ(0u, grid.getActiveCells().size()); ASSERT_EQ(0u, grid.getCellIds().size()); ASSERT_TRUE(grid.getSize().isApprox(this->m_size)); ASSERT_TRUE(grid.getAABB().isApprox(this->m_aabb)); } TYPED_TEST(Grid3DTestBase, addElementTest) { typedef typename TestFixture::GridType GridType; typedef typename TestFixture::TypeElement TypeElement; GridType grid(this->m_size, this->m_aabb); // Add an element outside of the grid auto positionMin = this->m_aabb.max() - this->m_aabb.sizes() * 1.001; grid.addElement(TypeElement(), positionMin); ASSERT_EQ(0u, grid.getActiveCells().size()); ASSERT_EQ(0u, grid.getCellIds().size()); // Add an element outside of the grid auto positionMax = this->m_aabb.min() + this->m_aabb.sizes() * 1.001; grid.addElement(TypeElement(), positionMax); ASSERT_EQ(0u, grid.getActiveCells().size()); ASSERT_EQ(0u, grid.getCellIds().size()); // Add an element inside of the grid TypeElement e0(0), e1(1); grid.addElement(e0, Eigen::Matrix::Zero()); ASSERT_EQ(1u, grid.getActiveCells().size()); ASSERT_EQ(1u, grid.getCellIds().size()); ASSERT_NO_THROW(grid.getCellIds().at(e0)); ASSERT_ANY_THROW(grid.getCellIds().at(e1)); // Add an element inside of the grid, in the same cell grid.addElement(e1, Eigen::Matrix::Zero()); ASSERT_EQ(1u, grid.getActiveCells().size()); ASSERT_EQ(2u, grid.getCellIds().size()); ASSERT_NO_THROW(grid.getCellIds().at(e0)); ASSERT_NO_THROW(grid.getCellIds().at(e1)); ASSERT_EQ(grid.getCellIds()[e0], grid.getCellIds()[e1]); // Add an element inside of the grid, in a different cell TypeElement e2(2); grid.addElement(e2, this->m_size * 1.5); ASSERT_EQ(2u, grid.getActiveCells().size()); ASSERT_EQ(3u, grid.getCellIds().size()); ASSERT_NO_THROW(grid.getCellIds().at(e0)); ASSERT_NO_THROW(grid.getCellIds().at(e1)); ASSERT_NO_THROW(grid.getCellIds().at(e2)); ASSERT_EQ(grid.getCellIds()[e0], grid.getCellIds()[e1]); ASSERT_NE(grid.getCellIds()[e0], grid.getCellIds()[e2]); ASSERT_NE(grid.getCellIds()[e1], grid.getCellIds()[e2]); } TYPED_TEST(Grid3DTestBase, NeighborsTest) { typedef typename TestFixture::GridType GridType; typedef typename TestFixture::TypeElement TypeElement; GridType grid(this->m_size, this->m_aabb); // Build the following grid: // Cell(e0, e1) <- neighbor -> Cell(e2) <- neighbor -> Cell(e3) <- ..not neighbor.. -> Cell(e4) Eigen::Matrix position = Eigen::Matrix::Zero(); // Add an element inside of the grid TypeElement e0(0), e1(1); grid.addElement(e0, position); ASSERT_EQ(1u, grid.getActiveCells().size()); ASSERT_EQ(1u, grid.getCellIds().size()); ASSERT_NO_THROW(grid.getCellIds().at(e0)); ASSERT_ANY_THROW(grid.getCellIds().at(e1)); // Add an element inside of the grid, in the same cell grid.addElement(e1, position); ASSERT_EQ(1u, grid.getActiveCells().size()); ASSERT_EQ(2u, grid.getCellIds().size()); ASSERT_NO_THROW(grid.getCellIds().at(e0)); ASSERT_NO_THROW(grid.getCellIds().at(e1)); ASSERT_EQ(grid.getCellIds()[e0], grid.getCellIds()[e1]); // Add an element inside of the grid, in a different cell position[0] += this->m_size[0] * 1.1; // Next cell on the 1st dimension TypeElement e2(2); grid.addElement(e2, position); ASSERT_EQ(2u, grid.getActiveCells().size()); ASSERT_EQ(3u, grid.getCellIds().size()); ASSERT_NO_THROW(grid.getCellIds().at(e0)); ASSERT_NO_THROW(grid.getCellIds().at(e1)); ASSERT_NO_THROW(grid.getCellIds().at(e2)); ASSERT_EQ(grid.getCellIds()[e0], grid.getCellIds()[e1]); ASSERT_NE(grid.getCellIds()[e0], grid.getCellIds()[e2]); ASSERT_NE(grid.getCellIds()[e1], grid.getCellIds()[e2]); // Add an element inside of the grid, in a different cell position[0] += this->m_size[0] * 1.1; // Next cell on the 1st dimension TypeElement e3(3); grid.addElement(e3, position); ASSERT_EQ(3u, grid.getActiveCells().size()); ASSERT_EQ(4u, grid.getCellIds().size()); ASSERT_NO_THROW(grid.getCellIds().at(e0)); ASSERT_NO_THROW(grid.getCellIds().at(e1)); ASSERT_NO_THROW(grid.getCellIds().at(e2)); ASSERT_NO_THROW(grid.getCellIds().at(e3)); ASSERT_EQ(grid.getCellIds()[e0], grid.getCellIds()[e1]); ASSERT_NE(grid.getCellIds()[e0], grid.getCellIds()[e2]); ASSERT_NE(grid.getCellIds()[e0], grid.getCellIds()[e3]); ASSERT_NE(grid.getCellIds()[e2], grid.getCellIds()[e3]); // Add an element inside of the grid, far away from all other elements position[0] += this->m_size[0] * 2.1; // Few cells further on the 1st dimension TypeElement e4(4); grid.addElement(e4, position); ASSERT_EQ(4u, grid.getActiveCells().size()); ASSERT_EQ(5u, grid.getCellIds().size()); ASSERT_NO_THROW(grid.getCellIds().at(e0)); ASSERT_NO_THROW(grid.getCellIds().at(e1)); ASSERT_NO_THROW(grid.getCellIds().at(e2)); ASSERT_NO_THROW(grid.getCellIds().at(e3)); ASSERT_NO_THROW(grid.getCellIds().at(e4)); ASSERT_EQ(grid.getCellIds()[e0], grid.getCellIds()[e1]); ASSERT_NE(grid.getCellIds()[e0], grid.getCellIds()[e2]); ASSERT_NE(grid.getCellIds()[e0], grid.getCellIds()[e3]); ASSERT_NE(grid.getCellIds()[e2], grid.getCellIds()[e3]); ASSERT_NE(grid.getCellIds()[e0], grid.getCellIds()[e4]); ASSERT_NE(grid.getCellIds()[e1], grid.getCellIds()[e4]); ASSERT_NE(grid.getCellIds()[e2], grid.getCellIds()[e4]); ASSERT_NE(grid.getCellIds()[e3], grid.getCellIds()[e4]); ASSERT_NO_THROW(grid.getNeighbors(e0)); ASSERT_NO_THROW(grid.getNeighbors(e1)); ASSERT_NO_THROW(grid.getNeighbors(e2)); ASSERT_NO_THROW(grid.getNeighbors(e3)); ASSERT_NO_THROW(grid.getNeighbors(e4)); // e0's neighbors = {e0, e1, e2} auto& e0Neighbors = grid.getNonConstNeighbors(e0); ASSERT_EQ(3u, e0Neighbors.size()); ASSERT_TRUE(std::find(e0Neighbors.begin(), e0Neighbors.end(), e0) != e0Neighbors.end()); ASSERT_TRUE(std::find(e0Neighbors.begin(), e0Neighbors.end(), e1) != e0Neighbors.end()); ASSERT_TRUE(std::find(e0Neighbors.begin(), e0Neighbors.end(), e2) != e0Neighbors.end()); ASSERT_FALSE(std::find(e0Neighbors.begin(), e0Neighbors.end(), e3) != e0Neighbors.end()); ASSERT_FALSE(std::find(e0Neighbors.begin(), e0Neighbors.end(), e4) != e0Neighbors.end()); // e1's neighbors = {e0, e1, e2} auto& e1Neighbors = grid.getNonConstNeighbors(e1); ASSERT_EQ(3u, e1Neighbors.size()); ASSERT_TRUE(std::find(e1Neighbors.begin(), e1Neighbors.end(), e0) != e1Neighbors.end()); ASSERT_TRUE(std::find(e1Neighbors.begin(), e1Neighbors.end(), e1) != e1Neighbors.end()); ASSERT_TRUE(std::find(e1Neighbors.begin(), e1Neighbors.end(), e2) != e1Neighbors.end()); ASSERT_FALSE(std::find(e1Neighbors.begin(), e1Neighbors.end(), e3) != e1Neighbors.end()); ASSERT_FALSE(std::find(e1Neighbors.begin(), e1Neighbors.end(), e4) != e1Neighbors.end()); // e2's neighbors = {e0, e1, e2, e3} auto& e2Neighbors = grid.getNonConstNeighbors(e2); ASSERT_EQ(4u, e2Neighbors.size()); ASSERT_TRUE(std::find(e2Neighbors.begin(), e2Neighbors.end(), e0) != e2Neighbors.end()); ASSERT_TRUE(std::find(e2Neighbors.begin(), e2Neighbors.end(), e1) != e2Neighbors.end()); ASSERT_TRUE(std::find(e2Neighbors.begin(), e2Neighbors.end(), e2) != e2Neighbors.end()); ASSERT_TRUE(std::find(e2Neighbors.begin(), e2Neighbors.end(), e3) != e2Neighbors.end()); ASSERT_FALSE(std::find(e2Neighbors.begin(), e2Neighbors.end(), e4) != e2Neighbors.end()); // e3's neighbors = {e2, e3} auto& e3Neighbors = grid.getNonConstNeighbors(e3); ASSERT_EQ(2u, e3Neighbors.size()); ASSERT_FALSE(std::find(e3Neighbors.begin(), e3Neighbors.end(), e0) != e3Neighbors.end()); ASSERT_FALSE(std::find(e3Neighbors.begin(), e3Neighbors.end(), e1) != e3Neighbors.end()); ASSERT_TRUE(std::find(e3Neighbors.begin(), e3Neighbors.end(), e2) != e3Neighbors.end()); ASSERT_TRUE(std::find(e3Neighbors.begin(), e3Neighbors.end(), e3) != e3Neighbors.end()); ASSERT_FALSE(std::find(e3Neighbors.begin(), e3Neighbors.end(), e4) != e3Neighbors.end()); // e4's neighbors = {e4} auto& e4Neighbors = grid.getNonConstNeighbors(e4); ASSERT_EQ(1u, e4Neighbors.size()); ASSERT_FALSE(std::find(e4Neighbors.begin(), e4Neighbors.end(), e0) != e4Neighbors.end()); ASSERT_FALSE(std::find(e4Neighbors.begin(), e4Neighbors.end(), e1) != e4Neighbors.end()); ASSERT_FALSE(std::find(e4Neighbors.begin(), e4Neighbors.end(), e2) != e4Neighbors.end()); ASSERT_FALSE(std::find(e4Neighbors.begin(), e4Neighbors.end(), e3) != e4Neighbors.end()); ASSERT_TRUE(std::find(e4Neighbors.begin(), e4Neighbors.end(), e4) != e4Neighbors.end()); // Test element not in the grid has no neighbors TypeElement e5(5); ASSERT_EQ(0u, grid.getNeighbors(e5).size()); } TYPED_TEST(Grid3DTestBase, NeighborsPosition) { typedef typename TestFixture::GridType GridType; typedef typename TestFixture::TypeElement TypeElement; GridType grid(this->m_size, this->m_aabb); // Build the following grid: // Cell(e0, e1) <- neighbor -> Cell(e2) <- neighbor -> Cell(e3) <- ..not neighbor.. -> Cell(e4) Eigen::Matrix position = Eigen::Matrix::Zero(); // Add an element inside of the grid TypeElement e0(0), e1(1); grid.addElement(e0, position); auto positione0 = position; // Add an element inside of the grid, in the same cell grid.addElement(e1, position); // Add an element inside of the grid, in a different cell position[0] += this->m_size[0] * 1.1; // Next cell on the 1st dimension TypeElement e2(2); grid.addElement(e2, position); // Add an element inside of the grid, in a different cell position[0] += this->m_size[0] * 1.1; // Next cell on the 1st dimension TypeElement e3(3); grid.addElement(e3, position); position[0] += this->m_size[0] * 1.1; // Next cell on the 1st dimension auto positionEmpty = position; // Add an element inside of the grid, far away from all other elements position[0] += this->m_size[0] * 1.1; // Few cells further on the 1st dimension TypeElement e4(4); grid.addElement(e4, position); { // e0's neighbors = {e0, e1, e2} // e0's position has a grid cell in it, should return neighbors of e0 auto& neighbors = grid.getNeighbors(positione0); EXPECT_EQ(3u, neighbors.size()); EXPECT_TRUE(std::find(neighbors.begin(), neighbors.end(), e0) != neighbors.end()); EXPECT_TRUE(std::find(neighbors.begin(), neighbors.end(), e1) != neighbors.end()); EXPECT_TRUE(std::find(neighbors.begin(), neighbors.end(), e2) != neighbors.end()); } { // Move the position just a little bit away from e0, should still result in the e0 cell auto positionNote0 = positione0 * 1.01; auto& neighbors = grid.getNeighbors(positionNote0); EXPECT_EQ(3u, neighbors.size()); EXPECT_TRUE(std::find(neighbors.begin(), neighbors.end(), e0) != neighbors.end()); EXPECT_TRUE(std::find(neighbors.begin(), neighbors.end(), e1) != neighbors.end()); EXPECT_TRUE(std::find(neighbors.begin(), neighbors.end(), e2) != neighbors.end()); } { // This cell does not exist but should return e3 and e4 as neighbors, it's not cached auto& neighbors = grid.getNeighbors(positionEmpty); EXPECT_EQ(2u, neighbors.size()); EXPECT_TRUE(std::find(neighbors.begin(), neighbors.end(), e3) != neighbors.end()); EXPECT_TRUE(std::find(neighbors.begin(), neighbors.end(), e4) != neighbors.end()); } { // This cell does not exist but should return e3 and e4 as neighbors, this is from // the cache now auto& neighbors = grid.getNeighbors(positionEmpty); EXPECT_EQ(2u, neighbors.size()); EXPECT_TRUE(std::find(neighbors.begin(), neighbors.end(), e3) != neighbors.end()); EXPECT_TRUE(std::find(neighbors.begin(), neighbors.end(), e4) != neighbors.end()); } { // This is outside of the AABB position = this->m_size * 3; auto& neighbors = grid.getNeighbors(position); EXPECT_EQ(0u, neighbors.size()); } } TYPED_TEST(Grid3DTestBase, Neighbors3DTest) { typedef typename TestFixture::GridType GridType; typedef typename TestFixture::TypeElement TypeElement; GridType grid(this->m_size, this->m_aabb); // Build a grid where we have 1 element per cell and 1 cell has all its neighbors populated // The grid content would be for dimension x=0 (similar on dimension x=1 and x=2): // Cell(e000) Cell(e001) Cell(e002) // Cell(e010) Cell(e011) Cell(e012) // Cell(e020) Cell(e021) Cell(e022) // Add the 27 elements inside the grid on 27 different cells forming a cube Eigen::Matrix position = Eigen::Matrix::Zero(); Number number; // 3 digits in base 3 => covers 27 different numbers const TypeElement element[27] = { TypeElement(0), TypeElement(1), TypeElement(2), TypeElement(3), TypeElement(4), TypeElement(5), TypeElement(6), TypeElement(7), TypeElement(8), TypeElement(9), TypeElement(10), TypeElement(11), TypeElement(12), TypeElement(13), TypeElement(14), TypeElement(15), TypeElement(16), TypeElement(17), TypeElement(18), TypeElement(19), TypeElement(20), TypeElement(21), TypeElement(22), TypeElement(23), TypeElement(24), TypeElement(25), TypeElement(26)}; for(size_t X = 0; X < 3; ++X) { for(size_t Y = 0; Y < 3; ++Y) { for(size_t Z = 0; Z < 3; ++Z) { SurgSim::Math::Vector3d offset(this->m_size[0] * X, this->m_size[1] * Y, this->m_size[2] * Z); grid.addElement(element[number.toDecimal()], position + offset); number.next(); } } } ASSERT_EQ(27u, grid.getActiveCells().size()); ///< 27 cells ASSERT_EQ(27u, grid.getCellIds().size()); ///< 27 elements for (size_t elementId = 0; elementId < 27; elementId++) { ASSERT_NO_THROW(grid.getCellIds().at(element[elementId])); for (size_t otherElementId = 0; otherElementId < 27; otherElementId++) { if (elementId == otherElementId) { continue; } /// Each cell contains only 1 unique element and each element is associated to a unique cell ASSERT_NE(grid.getCellIds()[element[elementId]], grid.getCellIds()[element[otherElementId]]); } } for (size_t elementId = 0; elementId < 27; elementId++) { ASSERT_NO_THROW(grid.getNeighbors(element[elementId])); ASSERT_GT(grid.getNeighbors(element[elementId]).size(), 0u); } // The central element should have all the elements for neighbors (including itself) auto& e111Neighbors = grid.getNonConstNeighbors(element[13]); ASSERT_EQ(27u, e111Neighbors.size()); for (size_t elementId = 0; elementId < 27; elementId++) { auto found = std::find(e111Neighbors.begin(), e111Neighbors.end(), element[elementId]); ASSERT_NE(e111Neighbors.end(), found); } } TYPED_TEST(Grid3DTestBase, ResetTest) { typedef typename TestFixture::GridType GridType; typedef typename TestFixture::TypeElement TypeElement; GridType grid(this->m_size, this->m_aabb); TypeElement e0(0), e1(1); grid.addElement(e0, Eigen::Matrix::Zero()); grid.addElement(e1, Eigen::Matrix::Zero()); ASSERT_NE(0u, grid.getActiveCells().size()); ASSERT_NE(0u, grid.getCellIds().size()); ASSERT_NE(0u, grid.getNeighbors(e0).size()); ASSERT_NE(0u, grid.getNeighbors(e1).size()); ASSERT_NO_THROW(grid.reset()); ASSERT_EQ(0u, grid.getActiveCells().size()); ASSERT_EQ(0u, grid.getCellIds().size()); ASSERT_EQ(0u, grid.getNeighbors(e0).size()); ASSERT_EQ(0u, grid.getNeighbors(e1).size()); } }; // namespace DataStructures }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/DataStructures/UnitTests/GridTests.cpp000066400000000000000000000020671277777236100250450ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/DataStructures/Grid.h" TEST(Grid, PowerOf3StaticAssertionTest) { static_assert(SurgSim::DataStructures::powerOf3<0>::value == 1, "3^0 != 1"); static_assert(SurgSim::DataStructures::powerOf3<1>::value == 3, "3^1 != 3"); static_assert(SurgSim::DataStructures::powerOf3<2>::value == 9, "3^2 != 9"); static_assert(SurgSim::DataStructures::powerOf3<3>::value == 27, "3^3 != 27"); } opensurgsim-0.7.0/SurgSim/DataStructures/UnitTests/GridTests.h000066400000000000000000000043021277777236100245040ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DATASTRUCTURES_UNITTESTS_GRIDTESTS_H #define SURGSIM_DATASTRUCTURES_UNITTESTS_GRIDTESTS_H #include #include "SurgSim/Math/Vector.h" #include "SurgSim/DataStructures/Grid.h" #include "SurgSim/DataStructures/UnitTests/MockObjects.h" namespace SurgSim { namespace DataStructures { template class GridTestBase : public testing::Test { public: /// The test parameters typedef T TypeElement; static const size_t dimension = N; /// The grid type for this test typedef MockGrid GridType; /// Useful vector type of various vectors typedef Eigen::Matrix VectorND; /// Useful variables VectorND m_size; /// Grid min and max n-d vectors Eigen::AlignedBox m_aabb; Eigen::AlignedBox m_aabb1Cell; Eigen::AlignedBox m_aabbBig; void SetUp() override { m_size = VectorND::LinSpaced(0.6, 1.67); VectorND numCells = VectorND::LinSpaced(16.45, 257.43); m_aabb.min() = -(numCells.cwiseProduct(m_size) * 0.5); m_aabb.max() = numCells.cwiseProduct(m_size) * 0.5; m_aabb1Cell.min() = -(m_size * 0.5); m_aabb1Cell.max() = m_size * 0.5; size_t architectureSize = sizeof(size_t) * 8; m_aabbBig.min() = -static_cast(static_cast(1u) << (architectureSize - 2)) * m_size * 0.5; m_aabbBig.max() = static_cast(static_cast(1u) << (architectureSize - 2)) * m_size * 0.5; } }; }; // namespace DataStructures }; // namespace SurgSim #endif // SURGSIM_DATASTRUCTURES_UNITTESTS_GRIDTESTS_H opensurgsim-0.7.0/SurgSim/DataStructures/UnitTests/GroupsTests.cpp000066400000000000000000000177221277777236100254430ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/DataStructures/Groups.h" #include "SurgSim/Framework/BasicSceneElement.h" #include "SurgSim/Testing/Utilities.h" namespace SurgSim { namespace DataStructures { TEST(GroupsTests, InitTest) { // The comma in the template is throwing off the macro, predefine the types for testing typedef Groups TypeA; EXPECT_NO_THROW(TypeA groups;); typedef Groups TypeB; EXPECT_NO_THROW({TypeB groups;}); typedef Groups > TypeC; EXPECT_NO_THROW({TypeC groups;}); } TEST(GroupsTest, DefaultInitialization) { Groups groups; EXPECT_TRUE(groups.getGroups().empty()); EXPECT_TRUE(groups.getGroups(1).empty()); EXPECT_TRUE(groups.getMembers("None").empty()); } TEST(GroupsTest, Clear) { Groups> groups; auto element1 = std::make_shared("One"); EXPECT_TRUE(groups.add("One", element1)); EXPECT_TRUE(groups.add("Two", element1)); groups.clear(); EXPECT_EQ(0L, groups.getGroups().size()); EXPECT_EQ(0L, groups.getGroups(element1).size()); EXPECT_EQ(0L, groups.getMembers("One").size()); EXPECT_EQ(0L, groups.getMembers("Two").size()); } TEST(GroupsTests, AddElement) { Groups> groups; auto element1 = std::make_shared("One"); auto element2 = std::make_shared("Two"); EXPECT_TRUE(groups.add("One", element1)); EXPECT_EQ(1L, groups.getGroups().size()); EXPECT_EQ(1L, groups.getGroups(element1).size()); EXPECT_EQ(1L, groups.getMembers("One").size()); EXPECT_FALSE(groups.add("One", element1)); EXPECT_EQ(1L, groups.getGroups().size()); EXPECT_EQ(1L, groups.getGroups(element1).size()); EXPECT_EQ(1L, groups.getMembers("One").size()); groups.add("Two", element1); EXPECT_EQ(2L, groups.getGroups().size()); EXPECT_EQ(2L, groups.getGroups(element1).size()); EXPECT_EQ(1L, groups.getMembers("One").size()); groups.add("Two", element2); EXPECT_EQ(2L, groups.getGroups().size()); EXPECT_EQ(2L, groups.getGroups(element1).size()); EXPECT_EQ(1L, groups.getGroups(element2).size()); EXPECT_EQ(1L, groups.getMembers("One").size()); EXPECT_EQ(2L, groups.getMembers("Two").size()); auto members = groups.getMembers("Two"); auto names = groups.getGroups(); EXPECT_TRUE(SurgSim::Testing::doesContain(members, element1)); EXPECT_TRUE(SurgSim::Testing::doesContain(members, element2)); EXPECT_TRUE(SurgSim::Testing::doesContain(names, "One")); EXPECT_TRUE(SurgSim::Testing::doesContain(names, "Two")); } TEST(GroupsTests, MultiAddTest) { Groups> groups; auto element1 = std::make_shared("One"); auto element2 = std::make_shared("Two"); std::vector names; names.push_back("One"); names.push_back("Two"); groups.add(names, element1); EXPECT_EQ(2L, groups.getGroups().size()); EXPECT_EQ(2L, groups.getGroups(element1).size()); } TEST(GroupsTests, AddGroups) { Groups groups; Groups sourceGroups; groups.add("One", 1); groups.add("Two", 1); sourceGroups.add("One", 2); sourceGroups.add("Two", 1); sourceGroups.add("Three", 1); EXPECT_FALSE(groups.add(groups)); EXPECT_EQ(2L, groups.getGroups().size()); EXPECT_EQ(2L, groups.getGroups(1).size()); EXPECT_TRUE(groups.add(sourceGroups)); EXPECT_EQ(3L, groups.getGroups().size()); EXPECT_EQ(3L, groups.getGroups(1).size()); EXPECT_EQ(1L, groups.getGroups(2).size()); EXPECT_EQ(2L, groups.getMembers("One").size()); EXPECT_EQ(1L, groups.getMembers("Two").size()); EXPECT_EQ(1L, groups.getMembers("Three").size()); } TEST(GroupsTests, BracketOperator) { Groups> groups; auto element1 = std::make_shared("One"); auto element2 = std::make_shared("Two"); EXPECT_EQ(0L, groups["One"].size()); groups.add("One", element1); groups.add("One", element2); EXPECT_EQ(2L, groups["One"].size()); } TEST(GroupsTests, ValidRemoves) { Groups> groups; auto element1 = std::make_shared("One"); auto element2 = std::make_shared("Two"); auto element3 = std::make_shared("Three"); groups.add("One", element1); groups.add("Two", element1); groups.add("Three", element1); groups.add("One", element2); groups.add("Two", element2); // Just check for the expected state ... (is tested above) EXPECT_EQ(3L, groups.getGroups().size()); EXPECT_EQ(3L, groups.getGroups(element1).size()); EXPECT_EQ(2L, groups.getGroups(element2).size()); EXPECT_EQ(2L, groups.getMembers("One").size()); EXPECT_EQ(2L, groups.getMembers("Two").size()); EXPECT_EQ(1L, groups.getMembers("Three").size()); EXPECT_TRUE(groups.remove("Three", element1)); EXPECT_EQ(2L, groups.getGroups().size()); EXPECT_EQ(2L, groups.getGroups(element1).size()); EXPECT_EQ(2L, groups.getGroups(element2).size()); EXPECT_EQ(2L, groups.getMembers("One").size()); EXPECT_EQ(2L, groups.getMembers("Two").size()); EXPECT_EQ(0L, groups.getMembers("Three").size()); EXPECT_TRUE(groups.remove("One", element2)); EXPECT_EQ(2L, groups.getGroups().size()); EXPECT_EQ(2L, groups.getGroups(element1).size()); EXPECT_EQ(1L, groups.getGroups(element2).size()); EXPECT_EQ(1L, groups.getMembers("One").size()); EXPECT_EQ(2L, groups.getMembers("Two").size()); EXPECT_EQ(0L, groups.getMembers("Three").size()); groups.remove("One", element1); groups.remove("Two", element1); groups.remove("Two", element2); EXPECT_EQ(0L, groups.getGroups().size()); EXPECT_EQ(0L, groups.getGroups(element1).size()); EXPECT_EQ(0L, groups.getGroups(element2).size()); EXPECT_EQ(0L, groups.getMembers("One").size()); EXPECT_EQ(0L, groups.getMembers("Two").size()); EXPECT_EQ(0L, groups.getMembers("Three").size()); } TEST(GroupsTests, InvalidRemoves) { Groups> groups; auto element1 = std::make_shared("One"); auto element2 = std::make_shared("Two"); auto element3 = std::make_shared("Three"); groups.add("One", element1); groups.add("Two", element1); groups.add("Three", element1); groups.add("One", element2); groups.add("Two", element2); // Remove non existing element from group should not do anything EXPECT_FALSE(groups.remove("One", element3)); EXPECT_EQ(2L, groups.getMembers("One").size()); EXPECT_EQ(0L, groups.getGroups(element3).size()); // Removing from a non existing group should not do anything EXPECT_FALSE(groups.remove("None", element1)); EXPECT_EQ(3L, groups.getGroups().size()); EXPECT_EQ(3L, groups.getGroups(element1).size()); // Removing a non exisiting member from a nonexisting group should not do anything EXPECT_FALSE(groups.remove("None", element3)); EXPECT_EQ(3L, groups.getGroups().size()); EXPECT_EQ(0L, groups.getGroups(element3).size()); // Removing a non exisitng member categorically should not do anything EXPECT_FALSE(groups.remove(element3)); EXPECT_EQ(3L, groups.getGroups().size()); EXPECT_EQ(0L, groups.getGroups(element3).size()); } } }opensurgsim-0.7.0/SurgSim/DataStructures/UnitTests/ImageMapTest.cpp000066400000000000000000000115051277777236100254520ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the ImageMap class. #include "gtest/gtest.h" #include "SurgSim/DataStructures/ImageMap.h" namespace { double epsilon = 1e-10; } namespace SurgSim { namespace DataStructures { template class ImageMapTests : public testing::Test { public: typedef T Scalar; }; typedef ::testing::Types ImageMapTestTypes; TYPED_TEST_CASE(ImageMapTests, ImageMapTestTypes); TYPED_TEST(ImageMapTests, Construct) { typedef typename TestFixture::Scalar T; T array[] = {0, 1, 2, 3, 4, 5, 6, 7, 8}; ASSERT_NO_THROW({ImageMap image(3, 3, 1, array);}); } TYPED_TEST(ImageMapTests, Copy) { typedef typename TestFixture::Scalar T; T array[] = {0, 1, 2, 3, 4, 5, 6, 7, 8}; ImageMap image(3, 3, 1, array); ImageMap newImage(image); EXPECT_EQ(image.getSize(), newImage.getSize()); EXPECT_EQ(image.getData(), newImage.getData()); } TYPED_TEST(ImageMapTests, Assign) { typedef typename TestFixture::Scalar T; T array[] = {0, 1, 2, 3, 4, 5, 6, 7, 8}; ImageMap image(3, 3, 1, array); T newArray[] = {0, 1, 2, 3}; ImageMap newImage(2, 2, 1, newArray); EXPECT_NE(image.getSize(), newImage.getSize()); EXPECT_NE(image.getData(), newImage.getData()); newImage = image; EXPECT_EQ(image.getSize(), newImage.getSize()); EXPECT_EQ(image.getData(), newImage.getData()); } TYPED_TEST(ImageMapTests, Accessors) { typedef typename TestFixture::Scalar T; T array[] = {0, 1, 2, 3, 4, 5, 6, 7, 8}; ImageMap image(3, 3, 1, array); EXPECT_EQ(3, image.getWidth()); EXPECT_EQ(3, image.getHeight()); EXPECT_EQ(1, image.getNumChannels()); std::array size = {3, 3, 1}; EXPECT_EQ(size, image.getSize()); for (int i = 0; i < 9; i++) { EXPECT_NEAR(array[i], image.getData()[i], epsilon); } } TYPED_TEST(ImageMapTests, Move) { typedef typename TestFixture::Scalar T; { T array[] = {0, 1, 2, 3, 4, 5, 6, 7, 8}; ImageMap oldImage(3, 3, 1, array); T* const dataPtr = oldImage.getData(); ImageMap newImage = std::move(oldImage); EXPECT_EQ(dataPtr, newImage.getData()); EXPECT_EQ(3, newImage.getWidth()); EXPECT_EQ(3, newImage.getHeight()); EXPECT_EQ(1, newImage.getNumChannels()); } { T array[] = {0, 1, 2, 3, 4, 5, 6, 7, 8}; ImageMap oldImage(3, 1, 3, array); T* const dataPtr = oldImage.getData(); ImageMap newImage(std::move(oldImage)); EXPECT_EQ(dataPtr, newImage.getData()); EXPECT_EQ(3, newImage.getWidth()); EXPECT_EQ(1, newImage.getHeight()); EXPECT_EQ(3, newImage.getNumChannels()); } } TYPED_TEST(ImageMapTests, ArrayMapping) { typedef typename TestFixture::Scalar T; { SCOPED_TRACE("Modifying the array should modify the data in the ImageMap"); T array[] = {0, 1, 2, 3, 4, 5, 6, 7}; ImageMap image(2, 2, 2, array); array[2] = 20; EXPECT_NEAR(20, image.getData()[2], epsilon); } { SCOPED_TRACE("Modifying the ImageMap with getData should modify the array"); T array[] = {0, 1, 2, 3, 4, 5, 6, 7}; ImageMap image(2, 2, 2, array); image.getData()[3] = 30; EXPECT_NEAR(30, array[3], epsilon); } { SCOPED_TRACE("Modifying the ImageMap with operator() should modify the array"); T array[] = {0, 1, 2, 3, 4, 5, 6, 7}; ImageMap image(2, 2, 2, array); image(1, 1) << 100, 101; EXPECT_NEAR(100, array[6], epsilon); EXPECT_NEAR(101, array[7], epsilon); } { SCOPED_TRACE("Modifying the ImageMap with getChannel() should modify the array"); T array[] = {0, 1, 2, 3, 4, 5, 6, 7}; ImageMap image(2, 2, 2, array); image.getChannel(1) << 100, 101, 110, 111; EXPECT_NEAR(100, array[1], epsilon); EXPECT_NEAR(110, array[3], epsilon); EXPECT_NEAR(101, array[5], epsilon); EXPECT_NEAR(111, array[7], epsilon); } { SCOPED_TRACE("Modifying the ImageMap with getAsVector() should modify the array"); T array[] = {0, 1, 2, 3, 4, 5, 6, 7}; ImageMap image(2, 2, 2, array); image.getAsVector() << 100, 101, 102, 103, 104, 105, 106, 107; EXPECT_NEAR(100, array[0], epsilon); EXPECT_NEAR(101, array[1], epsilon); EXPECT_NEAR(102, array[2], epsilon); EXPECT_NEAR(103, array[3], epsilon); EXPECT_NEAR(104, array[4], epsilon); EXPECT_NEAR(105, array[5], epsilon); EXPECT_NEAR(106, array[6], epsilon); EXPECT_NEAR(107, array[7], epsilon); } } }; }; opensurgsim-0.7.0/SurgSim/DataStructures/UnitTests/ImageTest.cpp000066400000000000000000000233001277777236100250100ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the Image class. #include "gtest/gtest.h" #include "SurgSim/DataStructures/Image.h" #include "SurgSim/Math/Matrix.h" namespace { double epsilon = 1e-10; } namespace SurgSim { namespace DataStructures { template class ImageTests : public testing::Test { public: typedef T Scalar; }; typedef ::testing::Types ImageTestTypes; TYPED_TEST_CASE(ImageTests, ImageTestTypes); TYPED_TEST(ImageTests, Construct) { typedef typename TestFixture::Scalar T; ASSERT_NO_THROW({Image image;}); ASSERT_NO_THROW({Image image(10, 10, 1);}); ASSERT_NO_THROW({Image image(100, 10, 3);}); ASSERT_NO_THROW({Image image(512, 1024, 4);}); T array[] = {0, 1, 2, 3, 4, 5, 6, 7, 8}; ASSERT_NO_THROW({Image image(3, 3, 1, array);}); } TYPED_TEST(ImageTests, ConstructFromOtherType) { typedef typename TestFixture::Scalar T; double array[] = {0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0}; Image image(3, 3, 1, array); for (int i = 0; i < 9; i++) { EXPECT_NEAR(static_cast(array[i]), image.getData()[i], epsilon); } } TYPED_TEST(ImageTests, Copy) { typedef typename TestFixture::Scalar T; Image image(10, 10, 1); Image newImage(image); EXPECT_EQ(image.getSize(), newImage.getSize()); EXPECT_NE(image.getData(), newImage.getData()); } TYPED_TEST(ImageTests, Assign) { typedef typename TestFixture::Scalar T; Image image(10, 10, 1); Image newImage; newImage = image; EXPECT_EQ(image.getSize(), newImage.getSize()); EXPECT_NE(image.getData(), newImage.getData()); } TYPED_TEST(ImageTests, Accessors) { typedef typename TestFixture::Scalar T; { Image image; EXPECT_EQ(0, image.getWidth()); EXPECT_EQ(0, image.getHeight()); EXPECT_EQ(0, image.getNumChannels()); EXPECT_EQ(nullptr, image.getData()); std::array size = {0, 0, 0}; EXPECT_EQ(size, image.getSize()); } { Image image(10, 20, 30); EXPECT_EQ(10, image.getWidth()); EXPECT_EQ(20, image.getHeight()); EXPECT_EQ(30, image.getNumChannels()); std::array size = {10, 20, 30}; EXPECT_EQ(size, image.getSize()); } { T array[] = {0, 1, 2, 3, 4, 5, 6, 7, 8}; Image image(3, 3, 1, array); EXPECT_EQ(3, image.getWidth()); EXPECT_EQ(3, image.getHeight()); EXPECT_EQ(1, image.getNumChannels()); std::array size = {3, 3, 1}; EXPECT_EQ(size, image.getSize()); for (int i = 0; i < 9; i++) { EXPECT_NEAR(array[i], image.getData()[i], epsilon); } } } TYPED_TEST(ImageTests, Move) { typedef typename TestFixture::Scalar T; { Image oldImage(3, 3, 1); T* const dataPtr = oldImage.getData(); Image newImage = std::move(oldImage); EXPECT_EQ(nullptr, oldImage.getData()); EXPECT_NE(dataPtr, oldImage.getData()); EXPECT_EQ(0, oldImage.getWidth()); EXPECT_EQ(0, oldImage.getHeight()); EXPECT_EQ(0, oldImage.getNumChannels()); EXPECT_EQ(dataPtr, newImage.getData()); EXPECT_EQ(3, newImage.getWidth()); EXPECT_EQ(3, newImage.getHeight()); EXPECT_EQ(1, newImage.getNumChannels()); } { Image oldImage(15, 25, 4); T* const dataPtr = oldImage.getData(); Image newImage(std::move(oldImage)); EXPECT_EQ(nullptr, oldImage.getData()); EXPECT_EQ(0, oldImage.getWidth()); EXPECT_EQ(0, oldImage.getHeight()); EXPECT_EQ(0, oldImage.getNumChannels()); EXPECT_EQ(dataPtr, newImage.getData()); EXPECT_EQ(15, newImage.getWidth()); EXPECT_EQ(25, newImage.getHeight()); EXPECT_EQ(4, newImage.getNumChannels()); } } TYPED_TEST(ImageTests, PointerAccess) { typedef typename TestFixture::Scalar T; Image image(3, 3, 1); T array[] = {0, 1, 2, 3, 4, 5, 6, 7, 8}; std::copy(array, array+9, image.getData()); for (int i = 0; i < 9; i++) { EXPECT_NEAR(array[i], image.getData()[i], epsilon); } } TYPED_TEST(ImageTests, PixelAccess) { typedef typename TestFixture::Scalar T; typedef Eigen::Matrix Matrix; { Image image(20, 30, 3); EXPECT_THROW(image(20, 10), SurgSim::Framework::AssertionFailure); EXPECT_THROW(image(10, 40), SurgSim::Framework::AssertionFailure); EXPECT_NO_THROW(image(1, 20)); EXPECT_NO_THROW(image(10, 29)); } { Image image(300, 300, 3); image.setChannel(0, Matrix::Constant(300, 300, T(0))); image.setChannel(1, Matrix::Constant(300, 300, T(1))); image.setChannel(2, Matrix::Constant(300, 300, T(2))); Eigen::Matrix pixelValue(T(0), T(1), T(2)); EXPECT_TRUE(pixelValue.isApprox(image(1, 2))); EXPECT_TRUE(pixelValue.isApprox(image(100, 50))); EXPECT_TRUE(pixelValue.isApprox(image(50, 200))); } { T array[] = {0, 1, 2, 3, 4, 5, 6, 7}; Image image(2, 2, 2, array); typedef Eigen::Matrix PixelType; EXPECT_TRUE(PixelType(T(0), T(1)).isApprox(image(0, 0))); EXPECT_TRUE(PixelType(T(2), T(3)).isApprox(image(1, 0))); EXPECT_TRUE(PixelType(T(4), T(5)).isApprox(image(0, 1))); EXPECT_TRUE(PixelType(T(6), T(7)).isApprox(image(1, 1))); } { Image image(10, 10, 2); image.getAsVector().setConstant(T(0)); Eigen::Matrix pixelValue(T(10), T(20)); image(5, 5) = pixelValue; EXPECT_TRUE(pixelValue.isApprox(image(5, 5))); } } TYPED_TEST(ImageTests, ChannelAccess) { typedef typename TestFixture::Scalar T; typedef Eigen::Matrix Matrix; { Image image(50, 1000, 2); EXPECT_NO_THROW(image.getChannel(0)); EXPECT_NO_THROW(image.getChannel(1)); EXPECT_THROW(image.getChannel(2), SurgSim::Framework::AssertionFailure); EXPECT_THROW(image.getChannel(100), SurgSim::Framework::AssertionFailure); } { Image image(10, 20, 3); EXPECT_THROW(image.setChannel(100, Matrix::Constant(10, 20, T(0))), SurgSim::Framework::AssertionFailure); EXPECT_THROW(image.setChannel(0, Matrix::Constant(20, 10, T(0))), SurgSim::Framework::AssertionFailure); EXPECT_THROW(image.setChannel(2, Matrix::Constant(20, 20, T(0))), SurgSim::Framework::AssertionFailure); EXPECT_NO_THROW(image.setChannel(2, Matrix::Constant(10, 20, T(0)))); } { Image image(300, 300, 3); image.setChannel(0, Matrix::Constant(300, 300, T(0))); image.setChannel(1, Matrix::Constant(300, 300, T(1))); image.setChannel(2, Matrix::Constant(300, 300, T(2))); for (int i = 0; i < 300*300; i++) { EXPECT_NEAR(i % 3, image.getData()[i], epsilon); } Matrix total = image.getChannel(0) + image.getChannel(1) + image.getChannel(2); EXPECT_TRUE(total.isApprox(Matrix::Constant(300, 300, T(3)))); } { Image image(6, 6, 1); image.getChannel(0) << 0, 1, 2, 3, 4, 5, 10, 11, 12, 13, 14, 15, 20, 21, 22, 23, 24, 25, 30, 31, 32, 33, 34, 35, 30, 41, 42, 43, 44, 45, 50, 51, 52, 53, 54, 55; Matrix matrix = image.getChannel(0); EXPECT_NEAR(24, matrix(2, 4), epsilon); EXPECT_NEAR(15, matrix(1, 5), epsilon); EXPECT_NEAR(30, matrix(3, 0), epsilon); EXPECT_NEAR(54, matrix(5, 4), epsilon); } { Image image(10, 30, 1); image.setChannel(0, Matrix::Constant(10, 30, T(1))); image.setChannel(0, image.getChannel(0) * T(2)); EXPECT_TRUE(image.getChannel(0).isApprox(Matrix::Constant(10, 30, T(2)))); image.setChannel(0, image.getChannel(0).array() + T(3)); EXPECT_TRUE(image.getChannel(0).isApprox(Matrix::Constant(10, 30, T(5)))); } { Image image(10, 30, 1); image.getChannel(0) = Matrix::Constant(10, 30, T(1)); image.getChannel(0) *= 2; EXPECT_TRUE(image.getChannel(0).isApprox(Matrix::Constant(10, 30, T(2)))); image.getChannel(0) = image.getChannel(0).array() + T(3); EXPECT_TRUE(image.getChannel(0).isApprox(Matrix::Constant(10, 30, T(5)))); } } TYPED_TEST(ImageTests, VectorAccess) { typedef typename TestFixture::Scalar T; typedef Eigen::Matrix Matrix; T array[] = {0, 1, 2, 3, 4, 5, 6, 7, 8}; { Image image(3, 3, 1, array); for (int i = 0; i < 9; i++) { auto vector = image.getAsVector(); EXPECT_NEAR(array[i], vector[i], epsilon); } } { Image image(3, 1, 3, array); for (int i = 0; i < 9; i++) { auto vector = image.getAsVector(); EXPECT_NEAR(array[i], vector[i], epsilon); } } { Image image(1, 3, 3, array); for (int i = 0; i < 9; i++) { auto vector = image.getAsVector(); EXPECT_NEAR(array[i], vector[i], epsilon); } } { Image image(10, 20, 3); EXPECT_THROW(image.setAsVector(Matrix::Constant(2, 1, T(0))), SurgSim::Framework::AssertionFailure); EXPECT_THROW(image.setAsVector(Matrix::Constant(10*20, 1, T(0))), SurgSim::Framework::AssertionFailure); EXPECT_NO_THROW(image.setAsVector(Matrix::Constant(10*20*3, 1, T(0)))); } { Image image(3,3,1); image.setAsVector(Matrix::Constant(9, 1, T(7))); EXPECT_TRUE(image.getAsVector().isApprox(Matrix::Constant(9, 1, T(7)))); EXPECT_TRUE(image.getChannel(0).isApprox(Matrix::Constant(3, 3, T(7)))); image.setAsVector(image.getAsVector() * T(2)); EXPECT_TRUE(image.getAsVector().isApprox(Matrix::Constant(9, 1, T(14)))); EXPECT_TRUE(image.getChannel(0).isApprox(Matrix::Constant(3, 3, T(14)))); image.getAsVector() *= T(2); EXPECT_TRUE(image.getAsVector().isApprox(Matrix::Constant(9, 1, T(28)))); EXPECT_TRUE(image.getChannel(0).isApprox(Matrix::Constant(3, 3, T(28)))); } } }; }; opensurgsim-0.7.0/SurgSim/DataStructures/UnitTests/IndexDirectoryTests.cpp000066400000000000000000000063051277777236100271130ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the IndexDirectory class. #include "SurgSim/DataStructures/NamedDataBuilder.h" #include "SurgSim/DataStructures/IndexDirectory.h" #include "gtest/gtest.h" using SurgSim::DataStructures::NamedDataBuilder; using SurgSim::DataStructures::IndexDirectory; /// Run a few tests against an empty index directory. TEST(IndexDirectoryTests, EmptyTests) { { IndexDirectory dir; EXPECT_EQ(0, dir.getNumEntries()); EXPECT_EQ("", dir.getName(0)); EXPECT_EQ(-1, dir.getIndex("missing")); EXPECT_FALSE(dir.hasEntry("missing")); } { NamedDataBuilder builder; EXPECT_EQ(0, builder.getNumEntries()); EXPECT_EQ("", builder.getName(0)); EXPECT_EQ(-1, builder.getIndex("missing")); EXPECT_FALSE(builder.hasEntry("missing")); std::shared_ptr dir = builder.createData().getDirectory(); EXPECT_EQ(0, dir->getNumEntries()); EXPECT_EQ("", dir->getName(0)); EXPECT_EQ(-1, dir->getIndex("missing")); EXPECT_FALSE(dir->hasEntry("missing")); } } /// Populate an index directory and run a few tests against that. TEST(IndexDirectoryTests, SmallDirectoryTests) { NamedDataBuilder builder; builder.addEntry("first"); builder.addEntry("second"); std::shared_ptr dir = builder.createData().getDirectory(); EXPECT_EQ(2, dir->getNumEntries()); EXPECT_EQ(2u, dir->size()); EXPECT_EQ("first", dir->getName(0)); EXPECT_EQ(0, dir->getIndex("first")); EXPECT_TRUE(dir->hasEntry("first")); EXPECT_EQ("second", dir->getName(1)); EXPECT_EQ(1, dir->getIndex("second")); EXPECT_TRUE(dir->hasEntry("second")); EXPECT_EQ(-1, dir->getIndex("missing")); EXPECT_FALSE(dir->hasEntry("missing")); } /// Check return values from populating an index directory. TEST(IndexDirectoryTests, ReturnValueFromAdd) { NamedDataBuilder builder; EXPECT_EQ(-1, builder.addEntry("")); EXPECT_EQ(0, builder.addEntry("entry")); EXPECT_EQ(-1, builder.addEntry("entry")); // Also check that the failed calls did not increase the number of entries: EXPECT_EQ(1, builder.getNumEntries()); EXPECT_EQ(1, builder.createData().getDirectory()->getNumEntries()); } /// Try passing bad key/index values. TEST(IndexDirectoryTests, BadKeyOrIndex) { NamedDataBuilder builder; EXPECT_EQ(0, builder.addEntry("first")); EXPECT_EQ(1, builder.addEntry("second")); EXPECT_EQ(-1, builder.addEntry("")); std::shared_ptr dir = builder.createData().getDirectory(); EXPECT_EQ("", dir->getName(-1)); EXPECT_EQ("", dir->getName(-12345)); EXPECT_EQ("", dir->getName(+56789)); EXPECT_EQ("", dir->getName(2)); }opensurgsim-0.7.0/SurgSim/DataStructures/UnitTests/IndexedLocalCoordinateTest.cpp000066400000000000000000000055271277777236100303440ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/DataStructures/IndexedLocalCoordinate.h" #include "SurgSim/Math/Vector.h" namespace SurgSim { namespace DataStructures { TEST(IndexedLocalCoordinateTest, IndexedLocalCoordinate) { using SurgSim::Math::Vector4d; EXPECT_NO_THROW({ IndexedLocalCoordinate coord; }); EXPECT_NO_THROW({ IndexedLocalCoordinate coord(6u, Vector4d(0.25, 0.55, 0.73, 0.11)); }); { IndexedLocalCoordinate coord(6u, Vector4d(0.25, 0.55, 0.73, 0.11)); EXPECT_EQ(6u, coord.index); EXPECT_TRUE(Vector4d(0.25, 0.55, 0.73, 0.11).isApprox(coord.coordinate)); } { IndexedLocalCoordinate coord; coord.index = 12u; coord.coordinate = Vector4d(0.33, 0.1, 0.05, 0.99); EXPECT_EQ(12u, coord.index); EXPECT_TRUE(Vector4d(0.33, 0.1, 0.05, 0.99).isApprox(coord.coordinate)); } { IndexedLocalCoordinate coord0; coord0.index = 0u; SurgSim::Math::Vector cubeNodes(8); cubeNodes << 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0; coord0.coordinate = cubeNodes; EXPECT_EQ(0u, coord0.index); EXPECT_TRUE(cubeNodes.isApprox(coord0.coordinate)); } } TEST(IndexedLocalCoordinateTest, IsApprox) { using SurgSim::Math::Vector3d; double epsilon = 1e-12; IndexedLocalCoordinate null6(6u, Vector3d::Zero()); IndexedLocalCoordinate almostNull6(6u, Vector3d(0.0, 0.0, epsilon / 2.0)); IndexedLocalCoordinate null5(5u, Vector3d::Zero()); IndexedLocalCoordinate almostNull5(5u, Vector3d(0.0, 0.0, epsilon / 2.0)); EXPECT_TRUE(null6.isApprox(null6, epsilon)); EXPECT_TRUE(null6.isApprox(almostNull6, epsilon)); EXPECT_FALSE(null6.isApprox(null5, epsilon)); EXPECT_FALSE(null6.isApprox(almostNull5, epsilon)); IndexedLocalCoordinate one6(6u, Vector3d::Ones()); IndexedLocalCoordinate almostOne6(6u, Vector3d::Ones() + Vector3d(0.0, 0.0, epsilon / 2.0)); IndexedLocalCoordinate one5(5u, Vector3d::Ones()); IndexedLocalCoordinate two6(6u, Vector3d::Constant(2.0)); IndexedLocalCoordinate three7(7u, Vector3d::Constant(3.0)); EXPECT_TRUE(one6.isApprox(one6, epsilon)); EXPECT_TRUE(one6.isApprox(almostOne6, epsilon)); EXPECT_FALSE(one6.isApprox(one5, epsilon)); EXPECT_FALSE(one6.isApprox(two6, epsilon)); EXPECT_FALSE(one6.isApprox(three7, epsilon)); } } // namespace Collision } // namespace SurgSimopensurgsim-0.7.0/SurgSim/DataStructures/UnitTests/LocationTests.cpp000066400000000000000000000244271277777236100257340ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/DataStructures/Location.h" namespace SurgSim { namespace DataStructures { TEST(LocationTests, Constructor) { Math::Vector3d rigidLocalPosition = Math::Vector3d::Ones(); OctreePath octreeNodePath; octreeNodePath.push_back(1); octreeNodePath.push_back(2); octreeNodePath.push_back(3); size_t index(3); IndexedLocalCoordinate triangleMeshLocalCoordinate(1, Math::Vector2d(4.0, 5.0)); IndexedLocalCoordinate elementMeshLocalCoordinate(1, Math::Vector4d::Ones()); EXPECT_NO_THROW({Location location(rigidLocalPosition);}); EXPECT_NO_THROW({Location location(octreeNodePath);}); EXPECT_NO_THROW({Location location(index);}); EXPECT_NO_THROW({Location location(triangleMeshLocalCoordinate, Location::TRIANGLE);}); EXPECT_NO_THROW({Location location(elementMeshLocalCoordinate, Location::ELEMENT);}); EXPECT_THROW({Location location(elementMeshLocalCoordinate, \ static_cast(Location::ELEMENT + 10));}, Framework::AssertionFailure); { SCOPED_TRACE("Using rigid local position"); Location location(rigidLocalPosition); EXPECT_TRUE(location.rigidLocalPosition.hasValue()); EXPECT_FALSE(location.octreeNodePath.hasValue()); EXPECT_FALSE(location.index.hasValue()); EXPECT_FALSE(location.triangleMeshLocalCoordinate.hasValue()); EXPECT_FALSE(location.elementMeshLocalCoordinate.hasValue()); EXPECT_TRUE(location.rigidLocalPosition.getValue().isApprox(rigidLocalPosition)); Location location1(location); EXPECT_TRUE(location1.rigidLocalPosition.hasValue()); EXPECT_FALSE(location1.octreeNodePath.hasValue()); EXPECT_FALSE(location1.index.hasValue()); EXPECT_FALSE(location1.triangleMeshLocalCoordinate.hasValue()); EXPECT_FALSE(location1.elementMeshLocalCoordinate.hasValue()); EXPECT_TRUE(location1.rigidLocalPosition.getValue().isApprox(rigidLocalPosition)); } { SCOPED_TRACE("Using octree node path"); Location location(octreeNodePath); EXPECT_EQ(octreeNodePath, location.octreeNodePath.getValue()); EXPECT_FALSE(location.rigidLocalPosition.hasValue()); EXPECT_TRUE(location.octreeNodePath.hasValue()); EXPECT_FALSE(location.index.hasValue()); EXPECT_FALSE(location.triangleMeshLocalCoordinate.hasValue()); EXPECT_FALSE(location.elementMeshLocalCoordinate.hasValue()); Location location1(location); EXPECT_FALSE(location1.rigidLocalPosition.hasValue()); EXPECT_TRUE(location1.octreeNodePath.hasValue()); EXPECT_FALSE(location1.index.hasValue()); EXPECT_FALSE(location1.triangleMeshLocalCoordinate.hasValue()); EXPECT_FALSE(location1.elementMeshLocalCoordinate.hasValue()); EXPECT_EQ(octreeNodePath, location1.octreeNodePath.getValue()); } { SCOPED_TRACE("Using index"); Location location(index); EXPECT_EQ(index, location.index.getValue()); EXPECT_FALSE(location.rigidLocalPosition.hasValue()); EXPECT_FALSE(location.octreeNodePath.hasValue()); EXPECT_TRUE(location.index.hasValue()); EXPECT_FALSE(location.triangleMeshLocalCoordinate.hasValue()); EXPECT_FALSE(location.elementMeshLocalCoordinate.hasValue()); Location location1(location); EXPECT_FALSE(location1.rigidLocalPosition.hasValue()); EXPECT_FALSE(location1.octreeNodePath.hasValue()); EXPECT_TRUE(location1.index.hasValue()); EXPECT_FALSE(location1.triangleMeshLocalCoordinate.hasValue()); EXPECT_FALSE(location1.elementMeshLocalCoordinate.hasValue()); EXPECT_EQ(index, location1.index.getValue()); } { SCOPED_TRACE("Using triangle mesh local coordinate"); Location location(triangleMeshLocalCoordinate, Location::TRIANGLE); EXPECT_FALSE(location.rigidLocalPosition.hasValue()); EXPECT_FALSE(location.octreeNodePath.hasValue()); EXPECT_FALSE(location.index.hasValue()); EXPECT_TRUE(location.triangleMeshLocalCoordinate.hasValue()); EXPECT_FALSE(location.elementMeshLocalCoordinate.hasValue()); EXPECT_EQ(triangleMeshLocalCoordinate.index, location.triangleMeshLocalCoordinate.getValue().index); EXPECT_TRUE(location.triangleMeshLocalCoordinate.getValue().coordinate.isApprox(\ triangleMeshLocalCoordinate.coordinate)); Location location1(location); EXPECT_FALSE(location1.rigidLocalPosition.hasValue()); EXPECT_FALSE(location1.octreeNodePath.hasValue()); EXPECT_FALSE(location1.index.hasValue()); EXPECT_TRUE(location1.triangleMeshLocalCoordinate.hasValue()); EXPECT_FALSE(location1.elementMeshLocalCoordinate.hasValue()); EXPECT_EQ(triangleMeshLocalCoordinate.index, location1.triangleMeshLocalCoordinate.getValue().index); EXPECT_TRUE(location1.triangleMeshLocalCoordinate.getValue().coordinate.isApprox(\ triangleMeshLocalCoordinate.coordinate)); } { SCOPED_TRACE("Using element mesh local coordinate"); Location location(elementMeshLocalCoordinate, Location::ELEMENT); EXPECT_FALSE(location.rigidLocalPosition.hasValue()); EXPECT_FALSE(location.octreeNodePath.hasValue()); EXPECT_FALSE(location.index.hasValue()); EXPECT_FALSE(location.triangleMeshLocalCoordinate.hasValue()); EXPECT_TRUE(location.elementMeshLocalCoordinate.hasValue()); EXPECT_EQ(elementMeshLocalCoordinate.index, location.elementMeshLocalCoordinate.getValue().index); EXPECT_TRUE(location.elementMeshLocalCoordinate.getValue().coordinate.isApprox(\ elementMeshLocalCoordinate.coordinate)); Location location1(location); EXPECT_FALSE(location1.rigidLocalPosition.hasValue()); EXPECT_FALSE(location1.octreeNodePath.hasValue()); EXPECT_FALSE(location1.index.hasValue()); EXPECT_FALSE(location1.triangleMeshLocalCoordinate.hasValue()); EXPECT_TRUE(location1.elementMeshLocalCoordinate.hasValue()); EXPECT_EQ(elementMeshLocalCoordinate.index, location1.elementMeshLocalCoordinate.getValue().index); EXPECT_TRUE(location1.elementMeshLocalCoordinate.getValue().coordinate.isApprox(\ elementMeshLocalCoordinate.coordinate)); } } TEST(LocationTests, IsApprox) { double epsilon = 1e-15; { SCOPED_TRACE("Rigid location"); Location rigidLocationOnes(Math::Vector3d::Ones()); Location rigidLocationZero(Math::Vector3d::Zero()); Location rigidLocationAlmostOnes(Math::Vector3d(1.0, 1.0, 1 + epsilon * 0.5)); Location rigidLocationAlmostZero(Math::Vector3d(0.0, 0.0, epsilon * 0.5)); EXPECT_FALSE(rigidLocationOnes.isApprox(rigidLocationZero, epsilon)); EXPECT_TRUE(rigidLocationOnes.isApprox(rigidLocationOnes, epsilon)); EXPECT_TRUE(rigidLocationOnes.isApprox(rigidLocationAlmostOnes, epsilon)); EXPECT_FALSE(rigidLocationOnes.isApprox(rigidLocationAlmostZero, epsilon)); EXPECT_TRUE(rigidLocationZero.isApprox(rigidLocationZero, epsilon)); EXPECT_FALSE(rigidLocationZero.isApprox(rigidLocationOnes, epsilon)); EXPECT_FALSE(rigidLocationZero.isApprox(rigidLocationAlmostOnes, epsilon)); EXPECT_TRUE(rigidLocationZero.isApprox(rigidLocationAlmostZero, epsilon)); } { SCOPED_TRACE("Octree location"); std::array path1 = {{0, 1, 2}}; std::array path2 = {{2, 1, 0}}; Location octreeLocation1(OctreePath(path1.begin(), path1.end())); Location octreeLocation2(OctreePath(path2.begin(), path2.end())); EXPECT_TRUE(octreeLocation1.isApprox(octreeLocation1)); EXPECT_TRUE(octreeLocation2.isApprox(octreeLocation2)); EXPECT_FALSE(octreeLocation1.isApprox(octreeLocation2)); } { SCOPED_TRACE("Index location"); Location indexLocationOne(1); Location indexLocationZero(0); EXPECT_TRUE(indexLocationOne.isApprox(indexLocationOne)); EXPECT_TRUE(indexLocationZero.isApprox(indexLocationZero)); EXPECT_FALSE(indexLocationZero.isApprox(indexLocationOne)); } { SCOPED_TRACE("TriangleMesh location"); auto vector001 = Math::Vector(3); vector001 << 0, 0, 1; auto vector100 = Math::Vector(3); vector100 << 1, 0, 0; auto vector010 = Math::Vector(3); vector010 << 0, 1, 1; IndexedLocalCoordinate triangleBarycentricCoord11(9, vector001); IndexedLocalCoordinate triangleBarycentricCoord12(9, vector100); IndexedLocalCoordinate triangleBarycentricCoord2(0, vector010); Location triangleMeshLocation11(triangleBarycentricCoord11, Location::TRIANGLE); Location triangleMeshLocation12(triangleBarycentricCoord12, Location::TRIANGLE); Location triangleMeshLocation2(triangleBarycentricCoord2, Location::TRIANGLE); EXPECT_TRUE(triangleMeshLocation11.isApprox(triangleMeshLocation11)); EXPECT_FALSE(triangleMeshLocation11.isApprox(triangleMeshLocation12)); EXPECT_FALSE(triangleMeshLocation11.isApprox(triangleMeshLocation2)); } { SCOPED_TRACE("Element location"); auto vector01 = Math::Vector(2); vector01 << 0, 1; auto vector10 = Math::Vector(2); vector10 << 1, 0; IndexedLocalCoordinate triangleBarycentricCoord11(9, vector01); IndexedLocalCoordinate triangleBarycentricCoord12(9, vector10); IndexedLocalCoordinate triangleBarycentricCoord2(0, vector10); Location triangleMeshLocation11(triangleBarycentricCoord11, Location::ELEMENT); Location triangleMeshLocation12(triangleBarycentricCoord12, Location::ELEMENT); Location triangleMeshLocation2(triangleBarycentricCoord2, Location::ELEMENT); EXPECT_TRUE(triangleMeshLocation11.isApprox(triangleMeshLocation11)); EXPECT_FALSE(triangleMeshLocation11.isApprox(triangleMeshLocation12)); EXPECT_FALSE(triangleMeshLocation11.isApprox(triangleMeshLocation2)); } } TEST(LocationTests, get) { Location loc1; EXPECT_FALSE(loc1.get(Location::TRIANGLE).hasValue()); EXPECT_FALSE(loc1.get(Location::ELEMENT).hasValue()); loc1.triangleMeshLocalCoordinate = IndexedLocalCoordinate(0, Math::Vector3d::Zero()); EXPECT_TRUE(loc1.get(Location::TRIANGLE).hasValue()); EXPECT_FALSE(loc1.get(Location::ELEMENT).hasValue()); Location loc2; loc2.elementMeshLocalCoordinate = IndexedLocalCoordinate(0, Math::Vector3d::Zero()); EXPECT_FALSE(loc2.get(Location::TRIANGLE).hasValue()); EXPECT_TRUE(loc2.get(Location::ELEMENT).hasValue()); } }; // namespace DataStructures }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/DataStructures/UnitTests/MeshElementTest.cpp000066400000000000000000000120161277777236100261760ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the MeshElement class. /// Edges and Triangles are used as example elements for testing. #include "gtest/gtest.h" #include "SurgSim/DataStructures/EmptyData.h" #include "SurgSim/DataStructures/MeshElement.h" #include "SurgSim/DataStructures/UnitTests/MockObjects.h" #include "SurgSim/Math/Vector.h" using SurgSim::DataStructures::EmptyData; using SurgSim::Math::Vector3d; /// Edge element with ID data. typedef SurgSim::DataStructures::MeshElement<2, MockEdgeData> MockEdge; /// Triangle element with ID and edge ID data. typedef SurgSim::DataStructures::MeshElement<3, MockTriangleData> MockTriangle; /// Tetrahedron element with no data typedef SurgSim::DataStructures::MeshElement<4, EmptyData> MockTetrahedron; TEST(MeshElementTest, InitTest) { std::array edgeVertices = {{0, 1}}; MockEdgeData edgeData(0); ASSERT_NO_THROW({MockEdge edge(edgeVertices, edgeData);}); std::array triangleVertices = {{0, 1, 2}}; std::array triangleEdges = {{0, 1, 2}}; MockTriangleData triangleData(0, triangleEdges); ASSERT_NO_THROW({MockTriangle triangle(triangleVertices, triangleData);}); std::array tetrahedronVertices = {{0, 1, 2, 3}}; ASSERT_NO_THROW({MockTetrahedron triangle(tetrahedronVertices);}); } TEST(MeshElementTest, EdgeTest) { std::array edgeVertices = {{2, 10}}; MockEdgeData edgeData(5); MockEdge edge(edgeVertices, edgeData); EXPECT_EQ(edgeVertices, edge.verticesId); EXPECT_EQ(edgeData, edge.data); { const MockEdgeData& data = edge.data; EXPECT_EQ(5u, data.getId()); } /// Check comparisons MockEdge sameEdge(edgeVertices, edgeData); EXPECT_TRUE(edge == sameEdge); EXPECT_FALSE(edge != sameEdge); std::array differentEdgeVertices = {{10, 5}}; MockEdgeData differentEdgeData(7); MockEdge edgeWithDifferentVertices(differentEdgeVertices, edgeData); EXPECT_FALSE(edge == edgeWithDifferentVertices); EXPECT_TRUE(edge != edgeWithDifferentVertices); MockEdge edgeWithDifferentData(edgeVertices, differentEdgeData); EXPECT_FALSE(edge == edgeWithDifferentData); EXPECT_TRUE(edge != edgeWithDifferentData); MockEdge edgeWithDifferentVerticesAndData(differentEdgeVertices, differentEdgeData); EXPECT_FALSE(edge == edgeWithDifferentVerticesAndData); EXPECT_TRUE(edge != edgeWithDifferentVerticesAndData); } TEST(MeshElementTest, TriangleTest) { std::array triangleVertices = {{5, 2, 10}}; std::array triangleEdges = {{0, 1, 2}}; MockTriangleData triangleData(4, triangleEdges); MockTriangle triangle(triangleVertices, triangleData); EXPECT_EQ(triangleVertices, triangle.verticesId); EXPECT_EQ(triangleData, triangle.data); { const MockTriangleData& data = triangle.data; EXPECT_EQ(4u, data.getId()); EXPECT_EQ(triangleEdges, data.getEdges()); } /// Check comparisons MockTriangle sameTriangle(triangleVertices, triangleData); EXPECT_TRUE(triangle == sameTriangle); EXPECT_FALSE(triangle != sameTriangle); std::array differentTriangleVertices = {{10, 5, 7}}; std::array differentTriangleEdges = {{2, 1, 3}}; MockTriangleData differentTriangleData(4, differentTriangleEdges); MockTriangle triangleWithDifferentVertices(differentTriangleVertices, triangleData); EXPECT_FALSE(triangle == triangleWithDifferentVertices); EXPECT_TRUE(triangle != triangleWithDifferentVertices); MockTriangle triangleWithDifferentData(triangleVertices, differentTriangleData); EXPECT_FALSE(triangle == triangleWithDifferentData); EXPECT_TRUE(triangle != triangleWithDifferentData); MockTriangle triangleWithDifferentVerticesAndData(differentTriangleVertices, differentTriangleData); EXPECT_FALSE(triangle == triangleWithDifferentVerticesAndData); EXPECT_TRUE(triangle != triangleWithDifferentVerticesAndData); } TEST(MeshElementTest, TetrahedronTest) { std::array tetrahedronVertices = {{5, 2, 10, 6}}; MockTetrahedron tetrahedron(tetrahedronVertices); EXPECT_EQ(tetrahedronVertices, tetrahedron.verticesId); /// Check comparisons MockTetrahedron sameTetrahedron(tetrahedronVertices); EXPECT_TRUE(tetrahedron == sameTetrahedron); EXPECT_FALSE(tetrahedron != sameTetrahedron); std::array differentTetrahedronVertices = {{10, 5, 7, 3}}; MockTetrahedron tetrahedronWithDifferentVertices(differentTetrahedronVertices); EXPECT_FALSE(tetrahedron == tetrahedronWithDifferentVertices); EXPECT_TRUE(tetrahedron != tetrahedronWithDifferentVertices); }opensurgsim-0.7.0/SurgSim/DataStructures/UnitTests/MeshTest.cpp000066400000000000000000000156671277777236100247030ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the Mesh class. #include "gtest/gtest.h" #include "SurgSim/DataStructures/MeshElement.h" #include "SurgSim/DataStructures/PlyReader.h" #include "SurgSim/DataStructures/UnitTests/MockObjects.h" #include "SurgSim/DataStructures/Vertex.h" #include using SurgSim::DataStructures::Vertices; using SurgSim::DataStructures::Vertex; using SurgSim::Math::Vector3d; class MeshTests : public ::testing::Test { public: void SetUp() { // Set to true to print the test positions. bool printPositions = false; // Set to true to print the test normals. bool printNormals = false; // Set the number of test vertices size_t numVertices = 10; std::default_random_engine generator; std::uniform_real_distribution positionDistribution(-10.0, 10.0); std::uniform_real_distribution normalDistribution(-1.0, 1.0); if (printPositions) { std::cout << "Test Positions:\n"; } /// Generate random positions for each vertex for (size_t i = 0; i < numVertices; ++i) { Vector3d position(positionDistribution(generator), positionDistribution(generator), positionDistribution(generator)); testPositions.push_back(position); if (printPositions) { std::cout << "\t" << i << ": (" << position.x() << ", " << position.y() << ", " << position.z() << ")\n"; } } if (printNormals) { std::cout << "Test Normals:\n"; } /// Generate random normals for each vertex for (size_t i = 0; i < numVertices; ++i) { Vector3d normal(normalDistribution(generator), normalDistribution(generator), normalDistribution(generator)); normal.normalize(); testNormals.push_back(normal); if (printNormals) { std::cout << "\t" << i << ": (" << normal.x() << ", " << normal.y() << ", " << normal.z() << ")\n"; } } } void TearDown() { } /// Positions of test vertices std::vector testPositions; /// Normals of test vertices std::vector testNormals; }; TEST_F(MeshTests, InitTest) { ASSERT_NO_THROW({MockMesh mesh;}); /// Check that we can also create a mesh with no data ASSERT_NO_THROW({Vertices mesh;}); } TEST_F(MeshTests, CreateVerticesTest) { MockMesh mesh; EXPECT_EQ(0u, mesh.getNumVertices()); EXPECT_EQ(0u, mesh.getVertices().size()); /// Create the test vertices for (size_t i = 0; i < testPositions.size(); ++i) { EXPECT_EQ(i, mesh.createVertex(testPositions[i], testNormals[i])); EXPECT_EQ(i + 1, mesh.getNumVertices()); const std::vector& vertices = mesh.getVertices(); EXPECT_EQ(i + 1, vertices.size()); /// Make sure each vertex is set properly for (size_t j = 0; j < mesh.getNumVertices(); ++j) { EXPECT_EQ(testPositions[j], vertices[j].position); const MockVertexData& data = vertices[j].data; EXPECT_EQ(j, data.getId()); EXPECT_EQ(testNormals[j], data.getNormal()); } } } TEST_F(MeshTests, SetVertexPositionsTest) { MockMesh mesh; /// Create vertices with test normals, but all positions at (0,0,0) for (size_t i = 0; i < testPositions.size(); ++i) { EXPECT_EQ(i, mesh.createVertex(Vector3d(0.0, 0.0, 0.0), testNormals[i])); EXPECT_EQ(i + 1, mesh.getNumVertices()); } mesh.setVertexPositions(testPositions); EXPECT_EQ(1, mesh.getNumUpdates()); EXPECT_EQ(testPositions.size(), mesh.getNumVertices()); const std::vector& vertices = mesh.getVertices(); EXPECT_EQ(testPositions.size(), vertices.size()); /// Make sure each vertex is set properly for (size_t i = 0; i < mesh.getNumVertices(); ++i) { EXPECT_EQ(testPositions[i], vertices[i].position); const MockVertexData& data = vertices[i].data; EXPECT_EQ(testNormals[i], data.getNormal()); } mesh.setVertexPositions(testPositions, false); EXPECT_EQ(1, mesh.getNumUpdates()); EXPECT_EQ(testPositions.size(), mesh.getNumVertices()); EXPECT_EQ(testPositions.size(), mesh.getVertices().size()); mesh.setVertexPositions(testPositions, true); EXPECT_EQ(2, mesh.getNumUpdates()); EXPECT_EQ(testPositions.size(), mesh.getNumVertices()); EXPECT_EQ(testPositions.size(), mesh.getVertices().size()); /// Test the individual set/get methods mesh.setVertexPosition(5, Vector3d(0.0, 0.0, 0.0)); /// Make sure each vertex is set properly for (size_t i = 0; i < mesh.getNumVertices(); ++i) { if (i == 5) { EXPECT_EQ(Vector3d(0.0, 0.0, 0.0), mesh.getVertexPosition(i)); EXPECT_EQ(testNormals[i], mesh.getVertexNormal(i)); } else { EXPECT_EQ(testPositions[i], mesh.getVertexPosition(i)); EXPECT_EQ(testNormals[i], mesh.getVertexNormal(i)); } } /// Try setting with wrong number of vertices mesh.createVertex(Vector3d(0.0, 0.0, 0.0), Vector3d(0.0, 0.0, 0.0)); // create one more vertex EXPECT_ANY_THROW(mesh.setVertexPositions(testPositions)); } TEST_F(MeshTests, ClearTest) { MockMesh mesh; EXPECT_EQ(0, mesh.getNumUpdates()); EXPECT_EQ(0u, mesh.getNumVertices()); EXPECT_EQ(0u, mesh.getVertices().size()); /// Create vertices for (size_t i = 0; i < testPositions.size(); ++i) { EXPECT_EQ(i, mesh.createVertex(Vector3d(0.0, 0.0, 0.0), Vector3d(0.0, 0.0, 0.0))); EXPECT_EQ(i + 1, mesh.getNumVertices()); } EXPECT_EQ(testPositions.size(), mesh.getNumVertices()); EXPECT_EQ(testPositions.size(), mesh.getVertices().size()); /// Clear mesh mesh.clear(); EXPECT_EQ(0u, mesh.getNumVertices()); EXPECT_EQ(0u, mesh.getVertices().size()); } TEST_F(MeshTests, UpdateTest) { MockMesh mesh; EXPECT_EQ(0, mesh.getNumUpdates()); for (int i = 0; i < 10; ++i) { mesh.update(); EXPECT_EQ(i + 1, mesh.getNumUpdates()); } } TEST_F(MeshTests, ComparisonTest) { MockMesh mesh; /// Create vertices using test positions and normals for (size_t i = 0; i < testPositions.size(); ++i) { EXPECT_EQ(i, mesh.createVertex(testPositions[i], testNormals[i])); } MockMesh sameMesh; /// Create same mesh again for (size_t i = 0; i < testPositions.size(); ++i) { EXPECT_EQ(i, sameMesh.createVertex(testPositions[i], testNormals[i])); } MockMesh differentMesh; /// Create vertices, each with position and normal of (0,0,0) for (size_t i = 0; i < testPositions.size(); ++i) { EXPECT_EQ(i, differentMesh.createVertex(Vector3d(0.0, 0.0, 0.0), Vector3d(0.0, 0.0, 0.0))); } /// Test comparisons EXPECT_TRUE(mesh == sameMesh); EXPECT_FALSE(mesh != sameMesh); EXPECT_FALSE(mesh == differentMesh); EXPECT_TRUE(mesh != differentMesh); } opensurgsim-0.7.0/SurgSim/DataStructures/UnitTests/MeshVertexTest.cpp000066400000000000000000000036171277777236100260710ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the Mesh class. #include "gtest/gtest.h" #include "SurgSim/DataStructures/Vertex.h" #include "SurgSim/DataStructures/UnitTests/MockObjects.h" #include "SurgSim/Math/Vector.h" using SurgSim::DataStructures::Vertex; using SurgSim::Math::Vector3d; /// Vertex with ID and normal data typedef SurgSim::DataStructures::Vertex MockVertex; /// Vertex with no data typedef SurgSim::DataStructures::Vertex MockVertexNoData; TEST(MeshVertexTest, InitTest) { Vector3d position(0.0, 0.0, 0.0); MockVertexData data(0, Vector3d(1.0, 0.0, 0.0)); ASSERT_NO_THROW({MockVertex vertex(position, data);}); /// Check that we can also create a vertex with no data ASSERT_NO_THROW({MockVertexNoData vertex(position);}); } TEST(MeshVertexTest, VertexTest) { Vector3d position(1.0, 2.0, 3.0); MockVertexData data(2, Vector3d(1.0, 0.0, 0.0)); MockVertex vertex(position, data); EXPECT_EQ(position, vertex.position); EXPECT_EQ(data, vertex.data); { const MockVertexData& data = vertex.data; EXPECT_EQ(2u, data.getId()); EXPECT_EQ(Vector3d(1.0, 0.0, 0.0), data.getNormal()); } } TEST(MeshVertexTest, VertexNoDataTest) { Vector3d position(1.0, 2.0, 3.0); MockVertexNoData vertex(position); EXPECT_EQ(position, vertex.position); }opensurgsim-0.7.0/SurgSim/DataStructures/UnitTests/MockObjects.h000066400000000000000000000327031277777236100250050ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DATASTRUCTURES_UNITTESTS_MOCKOBJECTS_H #define SURGSIM_DATASTRUCTURES_UNITTESTS_MOCKOBJECTS_H #include #include #include "SurgSim/DataStructures/Grid.h" #include "SurgSim/DataStructures/TetrahedronMesh.h" #include "SurgSim/DataStructures/TriangleMesh.h" #include "SurgSim/DataStructures/Vertices.h" #include "SurgSim/Math/Vector.h" class ElementTest { public: int m_number; std::string m_string; ElementTest() : m_number(-1), m_string("Empty"){} explicit ElementTest(int i) : m_number(i) { std::stringstream s; s << i; m_string = s.str(); } ElementTest(const ElementTest& e) : m_number(e.m_number), m_string(e.m_string){} bool operator ==(const ElementTest& e) const { return m_number == e.m_number && m_string.compare(e.m_string) == 0; } }; // Add a hash function for this class namespace std { template <> struct hash { std::size_t operator()(const ElementTest& k) const { using std::size_t; using std::hash; using std::string; // Compute individual hash values for first, // second and third and combine them using XOR // and bit shifting: return (hash()(k.m_string) ^ (hash()(k.m_number) << 1)); } }; }; // namespace std template class Mock3DData { public: Mock3DData() : m_height(0), m_width(0), m_depth(0), m_buffer(0) { } Mock3DData(int height, int width, int depth) : m_height(height), m_width(width), m_depth(depth), m_buffer(height*depth*width) { } T get(int i, int j, int k) { return m_buffer[getIndex(i,j,k)]; } void set(int i, int j, int k, T value) { m_buffer[getIndex(i,j,k)] = value; } private: int getIndex(int i, int j, int k) { return i + j*m_width + k*m_width*m_height; } int m_height; int m_width; int m_depth; std::vector m_buffer; }; /// Vertex data for testing, storing ID and surface normal class MockVertexData { public: /// Constructor /// \param id Unique ID of the vertex in its mesh /// \param normal Surface normal of the vertex MockVertexData(size_t id, const SurgSim::Math::Vector3d& normal) : m_id(id), m_normal(normal) { } /// Constructor MockVertexData() { } /// Destructor virtual ~MockVertexData() { } /// Gets the vertex's unique ID in its mesh. size_t getId() const { return m_id; } /// Gets the vertex surface normal const SurgSim::Math::Vector3d& getNormal() const { return m_normal; } /// Compare the vertex data to another one (equality) /// \param data The MockVertexData to compare it to /// \return True if the two vertex data are equal, False otherwise bool operator==(const MockVertexData& data) const { return m_id == data.m_id && (m_normal - data.m_normal).norm() < 1.0e-10; } private: /// Vertex's unique ID in its mesh size_t m_id; /// Vertex surface normal SurgSim::Math::Vector3d m_normal; }; /// Edge data for testing, storing ID class MockEdgeData { public: /// Constructor /// \param id Unique ID of the edge in its mesh explicit MockEdgeData(size_t id) : m_id(id) { } /// Constructor MockEdgeData() { } /// Destructor virtual ~MockEdgeData() { } /// Gets the edge's unique ID in its mesh. size_t getId() const { return m_id; } /// Compare the edge data to another one (equality) /// \param data The MockEdgeData to compare it to /// \return True if the two edge data are equal, False otherwise bool operator==(const MockEdgeData& data) const { return m_id == data.m_id; } private: /// Edge's unique ID in its mesh size_t m_id; }; /// Triangle data for testing, storing ID and edge IDs class MockTriangleData { public: /// Constructor /// \param id Unique ID of the triangle in its mesh /// \param edges IDs of the triangle's edges in its mesh MockTriangleData(size_t id, const std::array& edges) : m_id(id), m_edges(edges) { } /// Constructor MockTriangleData() { } /// Destructor virtual ~MockTriangleData() { } /// Gets the triangle's unique ID in its mesh. size_t getId() const { return m_id; } /// Gets the IDs of the triangle's edges in its mesh. const std::array& getEdges() const { return m_edges; } /// Compare the triangle data to another one (equality) /// \param data The MockTriangleData to compare it to /// \return True if the two triangle data are equal, False otherwise bool operator==(const MockTriangleData& data) const { return m_id == data.m_id && m_edges == data.m_edges; } private: /// Triangle's unique ID in its mesh size_t m_id; /// The IDs of the triangle's edges in its mesh, in order: {vertex0->vertex1, vertex1->vertex2, vertex2->vertex3} std::array m_edges; }; /// Tetrahedron data for testing, storing ID and edge IDs, triangle IDs class MockTetrahedronData { public: /// Constructor /// \param id Unique ID of the tetrahedron in its mesh /// \param edges IDs of the tetrahedron's edges in its mesh (6 edges) /// \param triangles IDs of the tetrahedron's triangles in its mesh (4 triangles) MockTetrahedronData(size_t id, const std::array& edges, const std::array& triangles) : m_id(id), m_edges(edges), m_triangles(triangles) { } /// Destructor virtual ~MockTetrahedronData() { } /// Gets the tetrahedron's unique ID in its mesh. size_t getId() const { return m_id; } /// Gets the IDs of the tetrahedron's edges in its mesh. const std::array& getEdges() const { return m_edges; } /// Gets the IDs of the tetrahedron's triangles in its mesh. const std::array& getTriangles() const { return m_triangles; } /// Compare the tetrahedron data (equality) /// \param data The MockTetrahedronData to compare it to /// \return True if the two tetrahedron data are equals, False otherwise bool operator==(const MockTetrahedronData& data) const { return m_id == data.m_id && m_edges == data.m_edges && m_triangles == data.m_triangles; } private: /// Tetrahedron's unique ID in its mesh size_t m_id; /// The IDs of the tetrahedron's edges in its mesh, in order: /// {vertex0->vertex1, vertex0->vertex2, vertex0->vertex3, vertex1->vertex2, vertex1->vertex3, vertex2->vertex3} std::array m_edges; /// The IDs of the tetrahedron's triangles in its mesh, in order: {vertex012, vertex123, vertex230, vertex301} std::array m_triangles; }; /// Mesh for testing using MockVertexData class MockMesh : public SurgSim::DataStructures::Vertices { public: /// Vertex type for convenience typedef Vertices::VertexType VertexType; /// Constructor. Start out with no vertices and 0 updates MockMesh() : SurgSim::DataStructures::Vertices(), m_numUpdates(0) { } /// Destructor virtual ~MockMesh() { } /// Create a new vertex in the mesh /// \param position Position of the vertex /// \param normal Normal of the vertex /// \return Unique ID of vertex in the mesh size_t createVertex(const SurgSim::Math::Vector3d& position, const SurgSim::Math::Vector3d& normal) { VertexType vertex(position, MockVertexData(getNumVertices(), normal)); return addVertex(vertex); } /// Returns the normal of a vertex const SurgSim::Math::Vector3d& getVertexNormal(size_t id) const { return getVertex(id).data.getNormal(); } /// Returns the number of updates performed on the mesh int getNumUpdates() const { return m_numUpdates; } private: /// Provides update functionality, which just increments the number of updates bool doUpdate() override { ++m_numUpdates; return true; } /// Number of updates performed on the mesh int m_numUpdates; }; /// Tetrahedron Mesh for testing using MockVertexData, MockEdgeData, MockTriangleData and MockTetrahedronData class MockTetrahedronMesh : public SurgSim::DataStructures::TetrahedronMesh { public: /// Vertex type for convenience typedef TetrahedronMesh::VertexType VertexType; /// Edge type for convenience typedef TetrahedronMesh::EdgeType EdgeType; /// Triangle type for convenience typedef TetrahedronMesh::TriangleType TriangleType; /// Tetrahedron type for convenience typedef TetrahedronMesh::TetrahedronType TetrahedronType; /// Constructor. Start out with no vertices and 0 updates MockTetrahedronMesh() : SurgSim::DataStructures::TetrahedronMesh(), m_numUpdates(0) { } /// Destructor virtual ~MockTetrahedronMesh() { } /// Create a new vertex in the mesh /// \param position Position of the vertex /// \param normal Normal of the vertex /// \return Unique ID of vertex in the mesh size_t createVertex(const SurgSim::Math::Vector3d& position, const SurgSim::Math::Vector3d& normal) { VertexType vertex(position, MockVertexData(getNumVertices(), normal)); return addVertex(vertex); } /// Create a new edge in the mesh /// \param vertices Edge vertices (x2) /// \return Unique ID of vertex in the mesh size_t createEdge(const std::array& vertices) { EdgeType edge(vertices, MockEdgeData(getNumEdges())); return addEdge(edge); } /// Create a new triangle in the mesh /// \param vertices (x3) /// \param edges (x3) /// \return Unique ID of vertex in the mesh size_t createTriangle(const std::array& vertices, const std::array& edges) { TriangleType triangle(vertices, MockTriangleData(getNumTriangles(), edges)); return addTriangle(triangle); } /// Create a new tetrahedron in the mesh /// \param vertices connectivity (x4) /// \param edges connectivity (x6) /// \param triangles connectivity (x4) /// \return Unique ID of vertex in the mesh size_t createTetrahedron(const std::array& vertices, const std::array& edges, const std::array& triangles) { TetrahedronType tetrahedron(vertices, MockTetrahedronData(getNumTetrahedrons(), edges, triangles)); return addTetrahedron(tetrahedron); } /// Returns the normal of a vertex const SurgSim::Math::Vector3d& getVertexNormal(size_t id) const { return getVertex(id).data.getNormal(); } /// Returns the number of updates performed on the mesh int getNumUpdates() const { return m_numUpdates; } private: /// Provides update functionality, which just increments the number of updates bool doUpdate() override { ++m_numUpdates; return true; } /// Number of updates performed on the mesh int m_numUpdates; }; template class MockGrid : public SurgSim::DataStructures::Grid { public: typedef typename SurgSim::DataStructures::Grid::CellContent CellContent; typedef typename SurgSim::DataStructures::Grid::NDId NDId; typedef typename SurgSim::DataStructures::Grid::NDIdHash NDIdHash; MockGrid(const Eigen::Matrix& cellSize, const Eigen::AlignedBox& bounds) : SurgSim::DataStructures::Grid(cellSize, bounds) {} std::unordered_map& getActiveCells() { return this->m_activeCells; } std::unordered_map& getCellIds() { return this->m_cellIds; } std::vector& getNonConstNeighbors(const T& element) { return const_cast&>(this->getNeighbors(element)); } Eigen::Matrix getSize() const { return this->m_size; } Eigen::AlignedBox getAABB() const { return this->m_aabb; } }; namespace wrappers { template class formatIterator { public: formatIterator(IteratorType begin, IteratorType end, const std::string& separator) : m_begin(begin), m_end(end), m_separator(separator) { } friend std::ostream& operator<<(std::ostream& stream, const formatIterator& formatIterator) { if (formatIterator.m_begin == formatIterator.m_end) { return stream; } IteratorType start = formatIterator.m_begin; IteratorType penultimate = formatIterator.m_end - 1; while (start != penultimate) { stream << *start++ << formatIterator.m_separator; } stream << *start; return stream; } private: IteratorType m_begin; IteratorType m_end; const std::string& m_separator; }; } template wrappers::formatIterator formatIterator(const IterableType& iterable, const std::string& separator) { return wrappers::formatIterator( iterable.cbegin(), iterable.cend(), separator); } template wrappers::formatIterator formatIterator(IteratorType begin, IteratorType end, const std::string& separator) { return wrappers::formatIterator(begin, end, separator); } #endif // SURGSIM_DATASTRUCTURES_UNITTESTS_MOCKOBJECTS_H opensurgsim-0.7.0/SurgSim/DataStructures/UnitTests/NamedDataTests.cpp000066400000000000000000000265211277777236100257770ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the NamedData class. #include #include "SurgSim/DataStructures/IndexDirectory.h" #include "SurgSim/DataStructures/NamedData.h" #include "SurgSim/DataStructures/NamedDataBuilder.h" #include "gtest/gtest.h" using SurgSim::DataStructures::NamedData; using SurgSim::DataStructures::NamedDataBuilder; namespace { const double EPSILON = 1e-9; }; /// Creating a named data object. TEST(NamedDataTests, CanConstruct) { NamedDataBuilder builder; builder.addEntry("test"); NamedData data = builder.createData(); EXPECT_EQ(1, data.getNumEntries()); EXPECT_EQ(1u, data.size()); EXPECT_TRUE(data.isValid()); EXPECT_TRUE(data.hasEntry(0)); EXPECT_TRUE(data.hasEntry("test")); EXPECT_FALSE(data.hasData(0)); EXPECT_FALSE(data.hasData("test")); EXPECT_EQ(0, data.getIndex("test")); EXPECT_EQ("test", data.getName(0)); EXPECT_FALSE(data.hasEntry(1)); EXPECT_FALSE(data.hasEntry("missing")); EXPECT_FALSE(data.hasData(1)); EXPECT_FALSE(data.hasData("missing")); EXPECT_EQ(-1, data.getIndex("missing")); EXPECT_EQ("", data.getName(1)); } /// Creating a named data object by copy construction. TEST(NamedDataTests, CanCopyConstruct) { NamedDataBuilder builder; builder.addEntry("test"); NamedData preData = builder.createData(); NamedData data = preData; EXPECT_EQ(1, data.getNumEntries()); EXPECT_EQ(1u, data.size()); EXPECT_TRUE(data.isValid()); EXPECT_TRUE(data.hasEntry(0)); EXPECT_TRUE(data.hasEntry("test")); EXPECT_FALSE(data.hasData(0)); EXPECT_FALSE(data.hasData("test")); EXPECT_EQ(0, data.getIndex("test")); EXPECT_EQ("test", data.getName(0)); EXPECT_FALSE(data.hasEntry(1)); EXPECT_FALSE(data.hasEntry("missing")); EXPECT_FALSE(data.hasData(1)); EXPECT_FALSE(data.hasData("missing")); EXPECT_EQ(-1, data.getIndex("missing")); EXPECT_EQ("", data.getName(1)); } /// Creating a shared_ptr to a named data object. TEST(NamedDataTests, CanCreateShared) { NamedDataBuilder builder; builder.addEntry("test"); std::shared_ptr> data = builder.createSharedData(); EXPECT_EQ(1, data->getNumEntries()); EXPECT_EQ(1u, data->size()); EXPECT_TRUE(data->isValid()); EXPECT_TRUE(data->hasEntry(0)); EXPECT_TRUE(data->hasEntry("test")); EXPECT_FALSE(data->hasData(0)); EXPECT_FALSE(data->hasData("test")); EXPECT_EQ(0, data->getIndex("test")); EXPECT_EQ("test", data->getName(0)); EXPECT_FALSE(data->hasEntry(1)); EXPECT_FALSE(data->hasEntry("missing")); EXPECT_FALSE(data->hasData(1)); EXPECT_FALSE(data->hasData("missing")); EXPECT_EQ(-1, data->getIndex("missing")); EXPECT_EQ("", data->getName(1)); } /// Creating a named data object using a vector of names, without a builder. TEST(NamedDataTests, CanConstructFromNames) { std::vector names; names.push_back("test"); NamedData data(names); EXPECT_EQ(1, data.getNumEntries()); EXPECT_EQ(1u, data.size()); EXPECT_TRUE(data.isValid()); EXPECT_TRUE(data.hasEntry(0)); EXPECT_TRUE(data.hasEntry("test")); EXPECT_FALSE(data.hasData(0)); EXPECT_FALSE(data.hasData("test")); EXPECT_EQ(0, data.getIndex("test")); EXPECT_EQ("test", data.getName(0)); EXPECT_FALSE(data.hasEntry(1)); EXPECT_FALSE(data.hasEntry("missing")); EXPECT_FALSE(data.hasData(1)); EXPECT_FALSE(data.hasData("missing")); EXPECT_EQ(-1, data.getIndex("missing")); EXPECT_EQ("", data.getName(1)); } /// Creating a named data object using an IndexDirectory, not from a builder. TEST(NamedDataTests, CanConstructFromIndexDirectory) { NamedDataBuilder builder; builder.addEntry("test"); std::shared_ptr dir = builder.createData().getDirectory(); NamedData data(dir); EXPECT_EQ(1, data.getNumEntries()); EXPECT_EQ(1u, data.size()); EXPECT_TRUE(data.isValid()); EXPECT_TRUE(data.hasEntry(0)); EXPECT_TRUE(data.hasEntry("test")); EXPECT_FALSE(data.hasData(0)); EXPECT_FALSE(data.hasData("test")); EXPECT_EQ(0, data.getIndex("test")); EXPECT_EQ("test", data.getName(0)); EXPECT_FALSE(data.hasEntry(1)); EXPECT_FALSE(data.hasEntry("missing")); EXPECT_FALSE(data.hasData(1)); EXPECT_FALSE(data.hasData("missing")); EXPECT_EQ(-1, data.getIndex("missing")); EXPECT_EQ("", data.getName(1)); } /// Run a few tests against an empty NamedData structure. TEST(NamedDataTests, Empty) { NamedDataBuilder builder; EXPECT_EQ(0, builder.getNumEntries()); EXPECT_EQ("", builder.getName(0)); EXPECT_EQ(-1, builder.getIndex("missing")); EXPECT_FALSE(builder.hasEntry("missing")); NamedData data = builder.createData(); EXPECT_EQ(0, data.getNumEntries()); EXPECT_EQ("", data.getName(0)); EXPECT_EQ(-1, data.getIndex("missing")); EXPECT_FALSE(data.hasEntry("missing")); } /// Creating an uninitialized data object. TEST(NamedDataTests, Uninitialized) { NamedData data; EXPECT_FALSE(data.isValid()); EXPECT_EQ(0, data.getNumEntries()); EXPECT_EQ("", data.getName(0)); EXPECT_EQ(-1, data.getIndex("missing")); EXPECT_FALSE(data.hasEntry("missing")); EXPECT_FALSE(data.hasData("missing")); float value = 9.87f; EXPECT_FALSE(data.get("missing", &value)); EXPECT_NEAR(9.87f, value, 1e-9); // i.e. unchanged EXPECT_FALSE(data.reset("missing")); EXPECT_FALSE(data.set("missing", value)); } /// Putting data into the container. TEST(NamedDataTests, Put) { NamedDataBuilder builder; builder.addEntry("first"); builder.addEntry("second"); builder.addEntry("third"); NamedData data = builder.createData(); data.set("first", 1.23f); data.set(1, 4.56f); EXPECT_TRUE(data.hasEntry(0)); EXPECT_TRUE(data.hasEntry("first")); EXPECT_TRUE(data.hasData(0)); EXPECT_TRUE(data.hasData("first")); EXPECT_EQ(0, data.getIndex("first")); EXPECT_EQ("first", data.getName(0)); EXPECT_TRUE(data.hasEntry(1)); EXPECT_TRUE(data.hasEntry("second")); EXPECT_TRUE(data.hasData(1)); EXPECT_TRUE(data.hasData("second")); EXPECT_EQ(1, data.getIndex("second")); EXPECT_EQ("second", data.getName(1)); EXPECT_TRUE(data.hasEntry(2)); EXPECT_TRUE(data.hasEntry("third")); EXPECT_FALSE(data.hasData(2)); EXPECT_FALSE(data.hasData("third")); EXPECT_EQ(2, data.getIndex("third")); EXPECT_EQ("third", data.getName(2)); } /// Copying data between NamedData, when they cannot assign to each other. TEST(NamedDataTests, Copy) { NamedDataBuilder sourceBuilder; sourceBuilder.addEntry("first"); sourceBuilder.addEntry("second"); NamedData sourceData = sourceBuilder.createData(); NamedDataBuilder targetBuilder; targetBuilder.addEntry("second"); targetBuilder.addEntry("third"); NamedData targetData = targetBuilder.createData(); const float secondFloat = 1.23f; sourceData.set("second", secondFloat); SurgSim::DataStructures::NamedDataCopyMap map; map[sourceData.getIndex("second")] = targetData.getIndex("second"); targetData.copy(sourceData, map); EXPECT_FALSE(targetData.hasEntry("first")); float outSecondFloat; ASSERT_TRUE(targetData.get("second", &outSecondFloat)); EXPECT_NEAR(secondFloat, outSecondFloat, EPSILON); EXPECT_FALSE(targetData.hasData("third")); } /// Getting data into the container. TEST(NamedDataTests, Get) { NamedDataBuilder builder; builder.addEntry("first"); builder.addEntry("second"); builder.addEntry("third"); NamedData data = builder.createData(); data.set("first", 1.23f); data.set(1, 4.56f); { float value = 9.87f; EXPECT_TRUE(data.get(0, &value)); EXPECT_NEAR(1.23f, value, 1e-9); } { float value = 9.87f; EXPECT_TRUE(data.get("first", &value)); EXPECT_NEAR(1.23f, value, 1e-9); } { float value = 9.87f; EXPECT_TRUE(data.get(1, &value)); EXPECT_NEAR(4.56f, value, 1e-9); } { float value = 9.87f; EXPECT_TRUE(data.get("second", &value)); EXPECT_NEAR(4.56f, value, 1e-9); } { float value = 9.87f; EXPECT_FALSE(data.get(2, &value)); EXPECT_NEAR(9.87f, value, 1e-9); // i.e. unchanged } { float value = 9.87f; EXPECT_FALSE(data.get("third", &value)); EXPECT_NEAR(9.87f, value, 1e-9); // i.e. unchanged } } /// Resetting the data in the container. TEST(NamedDataTests, ResetAll) { NamedDataBuilder builder; builder.addEntry("first"); builder.addEntry("second"); builder.addEntry("third"); NamedData data = builder.createData(); data.set("first", 1.23f); data.set(1, 4.56f); data.resetAll(); EXPECT_TRUE(data.hasEntry(0)); EXPECT_TRUE(data.hasEntry("first")); EXPECT_FALSE(data.hasData(0)); EXPECT_FALSE(data.hasData("first")); EXPECT_TRUE(data.hasEntry(1)); EXPECT_TRUE(data.hasEntry("second")); EXPECT_FALSE(data.hasData(1)); EXPECT_FALSE(data.hasData("second")); EXPECT_TRUE(data.hasEntry(2)); EXPECT_TRUE(data.hasEntry("third")); EXPECT_FALSE(data.hasData(2)); EXPECT_FALSE(data.hasData("third")); } /// Resetting one data entry at a time. TEST(NamedDataTests, ResetOne) { NamedDataBuilder builder; builder.addEntry("first"); builder.addEntry("second"); builder.addEntry("third"); NamedData data = builder.createData(); data.set("first", 1.23f); data.set(1, 4.56f); data.reset(0); EXPECT_TRUE(data.hasEntry(0)); EXPECT_TRUE(data.hasEntry("first")); EXPECT_FALSE(data.hasData(0)); EXPECT_FALSE(data.hasData("first")); EXPECT_TRUE(data.hasEntry(1)); EXPECT_TRUE(data.hasEntry("second")); EXPECT_TRUE(data.hasData(1)); EXPECT_TRUE(data.hasData("second")); EXPECT_TRUE(data.hasEntry(2)); EXPECT_TRUE(data.hasEntry("third")); EXPECT_FALSE(data.hasData(2)); EXPECT_FALSE(data.hasData("third")); data.reset("second"); EXPECT_TRUE(data.hasEntry(1)); EXPECT_TRUE(data.hasEntry("second")); EXPECT_FALSE(data.hasData(1)); EXPECT_FALSE(data.hasData("second")); } TEST(NamedDataTests, CacheIndex) { std::string name = "test"; NamedData data; int index = -1; // invalid NamedData data.cacheIndex(name, &index); EXPECT_EQ(-1, index); NamedDataBuilder builder; builder.addEntry(name); data = builder.createData(); // valid NamedData, finds the string data.cacheIndex(name, &index); EXPECT_EQ(0, index); // index is >= 0, so nothing happens data.cacheIndex(name + "2", &index); EXPECT_EQ(0, index); int index2 = -1; // valid NamedData, string not there data.cacheIndex(name + "2", &index2); EXPECT_EQ(-1, index2); } TEST(NamedDataTests, SetRValue) { NamedDataBuilder builder; builder.addEntry("test"); { NamedData data; data = builder.createData(); std::string setValue = "value"; std::string getValue; data.set("test", std::move(setValue)); EXPECT_EQ("", setValue); data.get("test", &getValue); EXPECT_EQ("value", getValue); } { NamedData data; data = builder.createData(); std::string setValue = "value"; std::string getValue; int index = data.getIndex("test"); data.set(index, std::move(setValue)); EXPECT_EQ("", setValue); data.get(index, &getValue); EXPECT_EQ("value", getValue); } } opensurgsim-0.7.0/SurgSim/DataStructures/UnitTests/NamedVariantDataTests.cpp000066400000000000000000000123361277777236100273230ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the NamedVariantData class. #include "SurgSim/Framework/Assert.h" #include "SurgSim/DataStructures/NamedVariantData.h" #include "SurgSim/DataStructures/UnitTests/MockObjects.h" #include "gtest/gtest.h" using SurgSim::DataStructures::NamedVariantData; using SurgSim::DataStructures::NamedVariantDataBuilder; /// Creating a named variant data object. TEST(NamedVariantDataTests, CanConstruct) { SurgSim::DataStructures::NamedVariantDataBuilder builder; builder.addEntry("test"); SurgSim::DataStructures::NamedVariantData data = builder.createData(); EXPECT_EQ(1, data.getNumEntries()); EXPECT_EQ(1u, data.size()); EXPECT_TRUE(data.isValid()); EXPECT_TRUE(data.hasEntry(0)); EXPECT_TRUE(data.hasEntry("test")); EXPECT_FALSE(data.hasData(0)); EXPECT_FALSE(data.hasData("test")); EXPECT_EQ(0, data.getIndex("test")); EXPECT_EQ("test", data.getName(0)); EXPECT_FALSE(data.hasEntry(1)); EXPECT_FALSE(data.hasEntry("missing")); EXPECT_FALSE(data.hasData(1)); EXPECT_FALSE(data.hasData("missing")); EXPECT_EQ(-1, data.getIndex("missing")); EXPECT_EQ("", data.getName(1)); } /// Creating a named variant data object by copy construction. TEST(NamedVariantDataTests, CanCopyConstruct) { SurgSim::DataStructures::NamedVariantDataBuilder builder; builder.addEntry("test"); SurgSim::DataStructures::NamedVariantData preData = builder.createData(); SurgSim::DataStructures::NamedVariantData data = preData; EXPECT_EQ(1, data.getNumEntries()); EXPECT_EQ(1u, data.size()); EXPECT_TRUE(data.isValid()); EXPECT_TRUE(data.hasEntry(0)); EXPECT_TRUE(data.hasEntry("test")); EXPECT_FALSE(data.hasData(0)); EXPECT_FALSE(data.hasData("test")); EXPECT_EQ(0, data.getIndex("test")); EXPECT_EQ("test", data.getName(0)); EXPECT_FALSE(data.hasEntry(1)); EXPECT_FALSE(data.hasEntry("missing")); EXPECT_FALSE(data.hasData(1)); EXPECT_FALSE(data.hasData("missing")); EXPECT_EQ(-1, data.getIndex("missing")); EXPECT_EQ("", data.getName(1)); } TEST(NamedVariantDataTests, Set) { SurgSim::DataStructures::NamedVariantDataBuilder builder; builder.addEntry("test"); SurgSim::DataStructures::NamedVariantData data = builder.createData(); Mock3DData mockData(5, 5, 5); mockData.set(1, 1, 1, 1.23f); mockData.set(4, 3, 2, 4.56f); data.set("test", mockData); EXPECT_TRUE(data.hasEntry(0)); EXPECT_TRUE(data.hasEntry("test")); EXPECT_TRUE(data.hasData(0)); EXPECT_TRUE(data.hasData("test")); } TEST(NamedVariantDataTests, HasTypedData) { SurgSim::DataStructures::NamedVariantDataBuilder builder; builder.addEntry("test"); SurgSim::DataStructures::NamedVariantData data = builder.createData(); EXPECT_FALSE(data.hasTypedData(0)); EXPECT_FALSE(data.hasTypedData("test")); Mock3DData mockData(5, 5, 5); mockData.set(1, 1, 1, 1.23); mockData.set(4, 3, 2, 4.56); data.set("test", mockData); EXPECT_TRUE(data.hasTypedData >(0)); EXPECT_TRUE(data.hasTypedData >("test")); EXPECT_FALSE(data.hasTypedData(0)); EXPECT_FALSE(data.hasTypedData("test")); EXPECT_FALSE(data.hasTypedData(5)); EXPECT_FALSE(data.hasTypedData("missing")); } TEST(NamedVariantDataTests, Get) { SurgSim::DataStructures::NamedVariantDataBuilder builder; builder.addEntry("test"); SurgSim::DataStructures::NamedVariantData data = builder.createData(); Mock3DData mockData(5, 5, 5); mockData.set(1, 1, 1, 1.23f); mockData.set(4, 3, 2, 4.56f); data.set("test", mockData); { Mock3DData value; EXPECT_TRUE(data.get("test", &value)); EXPECT_EQ(1.23f, value.get(1, 1, 1)); EXPECT_EQ(4.56f, value.get(4, 3, 2)); } { Mock3DData value; EXPECT_TRUE(data.get(0, &value)); EXPECT_EQ(1.23f, value.get(1, 1, 1)); EXPECT_EQ(4.56f, value.get(4, 3, 2)); } { Mock3DData value; EXPECT_FALSE(data.get(5, &value)); EXPECT_FALSE(data.get("missing", &value)); } { Mock3DData wrongType; EXPECT_THROW(data.get("test", &wrongType), SurgSim::Framework::AssertionFailure); } } TEST(NamedVariantDataTests, Reset) { SurgSim::DataStructures::NamedVariantDataBuilder builder; builder.addEntry("test"); SurgSim::DataStructures::NamedVariantData data = builder.createData(); Mock3DData mockData(5, 5, 5); mockData.set(1, 1, 1, 1.23f); mockData.set(4, 3, 2, 4.56f); data.set("test", mockData); EXPECT_TRUE(data.hasEntry(0)); EXPECT_TRUE(data.hasEntry("test")); EXPECT_TRUE(data.hasData(0)); EXPECT_TRUE(data.hasData("test")); data.resetAll(); EXPECT_TRUE(data.hasEntry(0)); EXPECT_TRUE(data.hasEntry("test")); EXPECT_FALSE(data.hasData(0)); EXPECT_FALSE(data.hasData("test")); } opensurgsim-0.7.0/SurgSim/DataStructures/UnitTests/OctreeNodeTests.cpp000066400000000000000000000402371277777236100262100ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the OctreeNode class. #include "gtest/gtest.h" #include #include #include #include "SurgSim/DataStructures/EmptyData.h" #include "SurgSim/DataStructures/OctreeNode.h" #include "SurgSim/Framework/ApplicationData.h" #include "SurgSim/Math/Vector.h" using SurgSim::DataStructures::EmptyData; using SurgSim::DataStructures::OctreeNode; using SurgSim::Math::Vector3d; struct MockData { int mockInt; double mockDouble; std::string mockString; }; typedef OctreeNode OctreeNodeType; template<> std::string OctreeNodeType::m_className = "OctreeNode"; namespace { const double epsilon = 1e-14; } namespace SurgSim { namespace DataStructures { TEST(OctreeNodeTests, CanConstruct) { SurgSim::Math::Aabbd boundingBox(Vector3d::Zero(), Vector3d::Ones()); EXPECT_NO_THROW({OctreeNodeType octree(boundingBox);}); EXPECT_NO_THROW(std::make_shared(boundingBox)); } TEST(OctreeNodeTests, InitialValues) { SurgSim::Math::Aabbd expectedBoundingBox(Vector3d::Zero(), Vector3d::Ones()); OctreeNodeType octree(expectedBoundingBox); EXPECT_FALSE(octree.isActive()); EXPECT_FALSE(octree.hasChildren()); EXPECT_TRUE(expectedBoundingBox.isApprox(octree.getBoundingBox())); auto children = octree.getChildren(); for (auto child = children.cbegin(); child != children.cend(); ++child) { EXPECT_EQ(nullptr, *child); } } TEST(OctreeNodeTests, SetIsActive) { SurgSim::Math::Aabbd expectedBoundingBox(Vector3d::Zero(), Vector3d::Ones()); OctreeNodeType octree(expectedBoundingBox); octree.setIsActive(true); EXPECT_TRUE(octree.isActive()); octree.setIsActive(false); EXPECT_FALSE(octree.isActive()); } TEST(OctreeNodeTests, Subdivide) { SurgSim::Math::Aabbd boundingBox(Vector3d::Zero(), Vector3d::Ones() * 16.0); OctreeNodeType octree(boundingBox); EXPECT_FALSE(octree.hasChildren()); EXPECT_FALSE(octree.isActive()); octree.subdivide(); EXPECT_TRUE(octree.hasChildren()); EXPECT_FALSE(octree.isActive()); auto children = octree.getChildren(); for (auto child = children.cbegin(); child != children.cend(); ++child) { ASSERT_NE(nullptr, *child); EXPECT_FALSE((*child)->isActive()); EXPECT_FALSE((*child)->hasChildren()); } std::array expectedBoxes = {{ SurgSim::Math::Aabbd(Vector3d(0.0, 0.0, 0.0), Vector3d(8.0, 8.0, 8.0)), SurgSim::Math::Aabbd(Vector3d(0.0, 0.0, 8.0), Vector3d(8.0, 8.0, 16.0)), SurgSim::Math::Aabbd(Vector3d(0.0, 8.0, 0.0), Vector3d(8.0, 16.0, 8.0)), SurgSim::Math::Aabbd(Vector3d(0.0, 8.0, 8.0), Vector3d(8.0, 16.0, 16.0)), SurgSim::Math::Aabbd(Vector3d(8.0, 0.0, 0.0), Vector3d(16.0, 8.0, 8.0)), SurgSim::Math::Aabbd(Vector3d(8.0, 0.0, 8.0), Vector3d(16.0, 8.0, 16.0)), SurgSim::Math::Aabbd(Vector3d(8.0, 8.0, 0.0), Vector3d(16.0, 16.0, 8.0)), SurgSim::Math::Aabbd(Vector3d(8.0, 8.0, 8.0), Vector3d(16.0, 16.0, 16.0)) } }; for (auto expectedBox = expectedBoxes.cbegin(); expectedBox != expectedBoxes.cend(); ++expectedBox) { bool boxFound = false; for (auto child = children.cbegin(); child != children.cend(); ++child) { if (expectedBox->isApprox((*child)->getBoundingBox())) { boxFound = true; break; } } EXPECT_TRUE(boxFound); } } int countOctreeLevels(std::shared_ptr node) { if (node->hasChildren()) { auto children = node->getChildren(); int maxLevels = 0; for (auto child = children.cbegin(); child != children.cend(); ++child) { if ((*child)->isActive()) { int levels = countOctreeLevels(*child); if (levels > maxLevels) { maxLevels = levels; } } } return maxLevels + 1; } return 1; } TEST(OctreeNodeTests, AddNodes) { SurgSim::Math::Aabbd boundingBox(Vector3d::Ones() * (-8.0), Vector3d::Ones() * 8.0); std::shared_ptr octree = std::make_shared(boundingBox); const int levels = 5; MockData data = {1, 3.14, "string"}; EXPECT_FALSE(octree->hasChildren()); EXPECT_FALSE(octree->isActive()); EXPECT_TRUE(octree->addData(Vector3d(1.0, 1.0, 1.0), levels, data)); EXPECT_TRUE(octree->addData(Vector3d(-4.0, 5.0, -7.0), levels, data)); EXPECT_TRUE(octree->hasChildren()); EXPECT_TRUE(octree->isActive()); EXPECT_EQ(5, countOctreeLevels(octree)); int numActive = 0; auto children = octree->getChildren(); for (auto child = children.cbegin(); child != children.cend(); ++child) { if ((*child)->isActive()) { numActive++; } } EXPECT_EQ(2, numActive); } TEST(OctreeNodeTests, Data) { SurgSim::Math::Aabbd boundingBox(Vector3d::Ones() * (-8.0), Vector3d::Ones() * 8.0); OctreeNodeType octree(boundingBox); const int levels = 1; MockData expectedData = {1, 3.14, "string"}; EXPECT_FALSE(octree.hasChildren()); EXPECT_FALSE(octree.isActive()); EXPECT_TRUE(octree.addData(Vector3d(1.0, 1.0, 1.0), levels, expectedData)); EXPECT_FALSE(octree.hasChildren()); EXPECT_TRUE(octree.isActive()); EXPECT_EQ(expectedData.mockInt, octree.data.mockInt); EXPECT_NEAR(expectedData.mockDouble, octree.data.mockDouble, epsilon); EXPECT_EQ(expectedData.mockString, octree.data.mockString); } TEST(OctreeNodeTests, OctreePath) { SurgSim::Math::Aabbd boundingBox(Vector3d::Ones() * (-8.0), Vector3d::Ones() * 8.0); std::shared_ptr octree = std::make_shared(boundingBox); SurgSim::DataStructures::OctreePath path; EXPECT_NO_THROW(octree->getNode(path)); EXPECT_EQ(octree, octree->getNode(path)); octree->subdivide(); path.push_back(3); EXPECT_NO_THROW(octree->getNode(path)); EXPECT_NE(nullptr, octree->getNode(path)); auto previous = octree->getNode(path); path.push_back(1); EXPECT_THROW(octree->getNode(path), SurgSim::Framework::AssertionFailure); // Should return the last valid node on the path EXPECT_NO_THROW(octree->getNode(path, true)); EXPECT_EQ(previous, octree->getNode(path, true)); } struct Data1 { std::string name; }; template <> std::string OctreeNode::m_className = "OctreeNode"; struct Data2 { double value; }; template <> std::string OctreeNode::m_className = "OctreeNode"; TEST(OctreeNodeTests, CopyConstructor) { SurgSim::Math::Aabbd boundingBox(Vector3d::Zero(), 2 * Vector3d::Ones()); std::shared_ptr> octree1 = std::make_shared>(boundingBox); Data1 dataRoot = {"root"}; octree1->addData(Vector3d(1.0, 1.0, 1.0), 1, dataRoot); Data1 dataChild = {"child"}; octree1->addData(Vector3d(0.5, 0.5, 0.5), 2, dataChild); { SCOPED_TRACE("Copying with different Data Type"); std::shared_ptr> octree2 = std::make_shared>(*octree1); ASSERT_NE(nullptr, octree2); EXPECT_TRUE(octree1->getBoundingBox().isApprox(octree2->getBoundingBox())); EXPECT_EQ(octree1->hasChildren(), octree2->hasChildren()); EXPECT_EQ(octree1->isActive(), octree2->isActive()); for (size_t i = 0; i < 8; i++) { if (octree1->getChild(i) == nullptr) { EXPECT_EQ(nullptr, octree2->getChild(i)); } else { ASSERT_NE(nullptr, octree2->getChild(i)); EXPECT_TRUE(octree1->getChild(i)->getBoundingBox().isApprox(octree2->getChild(i)->getBoundingBox())); EXPECT_EQ(octree1->getChild(i)->hasChildren(), octree2->getChild(i)->hasChildren()); EXPECT_EQ(octree1->getChild(i)->isActive(), octree2->getChild(i)->isActive()); } } } { SCOPED_TRACE("Copying with same Data Type"); std::shared_ptr> octree2 = std::make_shared>(*octree1); ASSERT_NE(nullptr, octree2); EXPECT_TRUE(octree1->getBoundingBox().isApprox(octree2->getBoundingBox())); EXPECT_EQ(octree1->hasChildren(), octree2->hasChildren()); EXPECT_EQ(octree1->isActive(), octree2->isActive()); EXPECT_EQ(octree1->data.name, octree2->data.name); for (size_t i = 0; i < 8; i++) { if (octree1->getChild(i) == nullptr) { EXPECT_EQ(nullptr, octree2->getChild(i)); } else { ASSERT_NE(nullptr, octree2->getChild(i)); EXPECT_TRUE(octree1->getChild(i)->getBoundingBox().isApprox(octree2->getChild(i)->getBoundingBox())); EXPECT_EQ(octree1->getChild(i)->hasChildren(), octree2->getChild(i)->hasChildren()); EXPECT_EQ(octree1->getChild(i)->isActive(), octree2->getChild(i)->isActive()); EXPECT_EQ(octree1->getChild(i)->data.name, octree2->getChild(i)->data.name); } } } } TEST(OctreeNodeTests, EmptyData) { SurgSim::Math::Aabbd boundingBox(Vector3d::Zero(), Vector3d::Ones()); EXPECT_NO_THROW({OctreeNode octree(boundingBox);}); EXPECT_NO_THROW(std::make_shared>(boundingBox)); } TEST(OctreeNodeTests, DoLoadOctree) { SurgSim::Framework::ApplicationData appData("config.txt"); auto octree = std::make_shared>(); ASSERT_NO_THROW(octree->load("Geometry/staple.ply", appData)); ASSERT_TRUE(nullptr != octree); auto boundingBox = octree->getBoundingBox(); SurgSim::Math::Vector3d boundingMin(-0.00207699998282, -0.00532899983227, -0.000403999991249); SurgSim::Math::Vector3d boundingMax(0.01392300001718, 0.01067100016773, 0.015596000008751); EXPECT_TRUE(boundingMin.isApprox(boundingBox.min())); EXPECT_TRUE(boundingMax.isApprox(boundingBox.max())); EXPECT_TRUE(octree->isActive()); EXPECT_TRUE(octree->hasChildren()); EXPECT_TRUE(octree->getChild(0)->isActive()); EXPECT_TRUE(octree->getChild(0)->hasChildren()); EXPECT_TRUE(octree->getChild(0)->getChild(2)->isActive()); EXPECT_TRUE(octree->getChild(0)->getChild(2)->hasChildren()); EXPECT_TRUE(octree->getChild(0)->getChild(2)->getChild(2)->isActive()); Vector3d leafSize = octree->getChild(0)->getChild(0)->getChild(0)->getChild(0)->getBoundingBox().sizes(); EXPECT_TRUE(leafSize.isApprox(Vector3d(0.001, 0.001, 0.001))); } TEST(OctreeNodeTests, NeighborhoodTestSimple) { OctreePath path; { SCOPED_TRACE("No direction should not fail"); std::array direction = { SYMBOL_HALT, SYMBOL_HALT, SYMBOL_HALT}; EXPECT_NO_THROW(getNeighbor(path, direction)); } path.push_back(0); { SCOPED_TRACE("Right of 0 should be 1"); std::array direction = { SYMBOL_RIGHT, SYMBOL_HALT, SYMBOL_HALT}; EXPECT_NO_THROW(getNeighbor(path, direction)); auto result = getNeighbor(path, direction); ASSERT_EQ(1u, result.size()); EXPECT_EQ(1, result[0]); } { SCOPED_TRACE("Left of 0 with not levels is nothing"); std::array direction = { SYMBOL_LEFT, SYMBOL_HALT, SYMBOL_HALT}; EXPECT_NO_THROW(getNeighbor(path, direction)); auto result = getNeighbor(path, direction); ASSERT_EQ(0u, result.size()); } } // This verifies the basic non-boundary crossing neighborhoods TEST(OctreeNodeTests, NeigborhoodPlainFaces) { int testValues[24][3] = { 0, SYMBOL_RIGHT, 1, 0, SYMBOL_UP, 2, 0, SYMBOL_FRONT, 4, 1, SYMBOL_LEFT, 0, 1, SYMBOL_UP, 3, 1, SYMBOL_FRONT, 5, 2, SYMBOL_RIGHT, 3, 2, SYMBOL_DOWN, 0, 2, SYMBOL_FRONT, 6, 3, SYMBOL_LEFT, 2, 3, SYMBOL_DOWN, 1, 3, SYMBOL_FRONT, 7, 4, SYMBOL_RIGHT, 5, 4, SYMBOL_UP, 6, 4, SYMBOL_BACK, 0, 5, SYMBOL_LEFT, 4, 5, SYMBOL_UP, 7, 5, SYMBOL_BACK, 1, 6, SYMBOL_RIGHT, 7, 6, SYMBOL_DOWN, 4, 6, SYMBOL_BACK, 2, 7, SYMBOL_LEFT, 6, 7, SYMBOL_DOWN, 5, 7, SYMBOL_BACK, 3 }; for (size_t i = 0; i < 24; ++i) { OctreePath path(1); path[0] = testValues[i][0]; std::array direction = { static_cast(testValues[i][1]), SYMBOL_HALT, SYMBOL_HALT}; auto result = getNeighbor(path, direction); ASSERT_EQ(1u, result.size()) << "For row " << i; EXPECT_EQ(testValues[i][2], result[0]) << "For row " << i; } } /// Verifies face neighbors for one set of second level nodes, this should exercise all of the state table, /// the expected data was calculated manually TEST(OctreeNodeTests, AllFaceNeighbors) { size_t expected[8][7][2] = { // Node Down Up Right Left Back Front 7, 0, 5, 2, 7, 2, 7, 1, 6, 1, 3, 4, 7, 4, 6, 1, 4, 3, 6, 3, 7, 0, 6, 0, 2, 5, 6, 5, 5, 2, 5, 0, 7, 0, 5, 3, 4, 3, 1, 6, 5, 6, 4, 3, 6, 1, 4, 1, 5, 2, 4, 2, 0, 7, 4, 7, 3, 4, 1, 6, 3, 6, 2, 5, 3, 5, 3, 0, 7, 0, 2, 5, 0, 7, 2, 7, 3, 4, 2, 4, 2, 1, 6, 1, 1, 6, 1, 4, 3, 4, 1, 7, 0, 7, 1, 2, 5, 2, 0, 7, 0, 5, 2, 5, 1, 6, 0, 6, 0, 3, 4, 3 }; size_t checkSum = 0; for (int i = 0; i < 8; ++i) { OctreePath node; node.push_back(expected[i][0][0]); node.push_back(expected[i][0][1]); auto neighbors = getNeighbors(node, NEIGHBORHOOD_FACE); checkSum += neighbors.size(); for (int j = 0; j < 6; ++j) { OctreePath neighbor; neighbor.push_back(expected[i][1 + j][0]); neighbor.push_back(expected[i][1 + j][1]); EXPECT_TRUE(std::find(neighbors.begin(), neighbors.end(), neighbor) != neighbors.end()) << "Node # " << i << "Neighbor #" << j << " not found"; } } EXPECT_EQ(48u, checkSum); } // This verifies edge neighbours for one node TEST(OctreeNodeTests, EdgeNeighbors) { OctreePath path; path.push_back(1); path.push_back(6); auto neighbors = getNeighbors(path, NEIGHBORHOOD_EDGE); const size_t expectedCount = 12; EXPECT_EQ(expectedCount, neighbors.size()); // Expected coordinates of face neighbors for the node 1/6 size_t expected[expectedCount][2] = { // Upper Ring 3, 5, // Up Right 2, 5, // Up Left 3, 0, // Up Back 7, 0, // Up Front // Lower Ring 1, 5, // Down Right 0, 5, // Down Left 1, 0, // Down Back 5, 0, // Down Front // Horizontals 1, 3, // Back Right 0, 3, // Back Left 5, 3, // Front Right 4, 3, // Front Left }; for (size_t i = 0; i < expectedCount; ++i) { OctreePath path; path.push_back(expected[i][0]); path.push_back(expected[i][1]); EXPECT_TRUE(std::find(neighbors.begin(), neighbors.end(), path) != neighbors.end()) << "Item #" << i << " not found"; } } // This verifies corner neighbours for one node TEST(OctreeNodeTests, VertexNeighbors) { OctreePath path; path.push_back(1); path.push_back(6); auto neighbors = getNeighbors(path, NEIGHBORHOOD_VERTEX); const size_t expectedCount = 8; EXPECT_EQ(expectedCount, neighbors.size()); // Expected coordinates of face neighbors for the node 1/6 size_t expected[expectedCount][2] = { // Lower Ring 5, 1, // Down Right Front 1, 1, // Down Right Back 4, 1, // Down Left Front 0, 1, // Down Left Back // Upper Ring 7, 1, // Up Right Front 3, 1, // Up Right Back 6, 1, // Up Left Front 2, 1, // Up Left Back }; for (size_t i = 0; i < expectedCount; ++i) { OctreePath path; path.push_back(expected[i][0]); path.push_back(expected[i][1]); EXPECT_TRUE(std::find(neighbors.begin(), neighbors.end(), path) != neighbors.end()) << "Item #" << i << " not found"; } } TEST(OctreeNodeTests, AllNeighbors) { // All of these nodes are interior, they should return 26 neighbors size_t nodes[8][2] = { 7, 0, 6, 1, 5, 2, 4, 3, 3, 4, 2, 5, 1, 6, 0, 7 }; for (int i = 0; i < 8; ++i) { OctreePath path; path.push_back(nodes[i][0]); path.push_back(nodes[i][1]); auto neighbors = getNeighbors(path, NEIGHBORHOOD_FACE | NEIGHBORHOOD_EDGE | NEIGHBORHOOD_VERTEX); EXPECT_EQ(26u, neighbors.size()); } } TEST(OctreeNodeTests, IncompleteNeighbors) { static const size_t numNodes = 16; size_t nodes[numNodes][3] = { //Node, Expected Vertex Neighbors 0, 0, 1, // These are the cube corner pieces 1, 1, 1, 2, 2, 1, 3, 3, 1, 4, 4, 1, 5, 5, 1, 6, 6, 1, 7, 7, 1, 5, 4, 2, // These are on the outside cube edge 3, 2, 2, 1, 5, 2, 0, 4, 2, 3, 6, 4, // These are on an outside surface 1, 4, 4, 4, 2, 4, 7, 2, 4 }; for (size_t i = 0; i < numNodes; ++i) { OctreePath path; path.push_back(nodes[i][0]); path.push_back(nodes[i][1]); auto neighbors = getNeighbors(path, NEIGHBORHOOD_VERTEX); EXPECT_EQ(nodes[i][2], neighbors.size()) << "Incorrect Neighbor Count for Node #" << i << " [" << path[0] << ", " << path[1] << "]."; } } } } opensurgsim-0.7.0/SurgSim/DataStructures/UnitTests/OptionalValueTests.cpp000066400000000000000000000106661277777236100267460ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include #include "SurgSim/DataStructures/OptionalValue.h" #include "SurgSim/DataStructures/DataStructuresConvert.h" namespace SurgSim { namespace DataStructures { TEST(OptionalValueTests, InitTest) { EXPECT_NO_THROW({OptionalValue a;}); EXPECT_NO_THROW({OptionalValue b(10.0);}); OptionalValue a; EXPECT_FALSE(a.hasValue()); } TEST(OptionalValueTests, AssertTest) { OptionalValue> a; EXPECT_ANY_THROW({ auto i = a.getValue();}); } TEST(OptionalValueTests, SetValueTest) { OptionalValue a; EXPECT_FALSE(a.hasValue()); a.setValue(10.0); EXPECT_TRUE(a.hasValue()); EXPECT_EQ(10.0, a.getValue()); a.invalidate(); EXPECT_FALSE(a.hasValue()); } TEST(OptionalValueTests, ComparatorTest) { OptionalValue a; OptionalValue b; EXPECT_TRUE(a == b); EXPECT_FALSE(a != b); a.setValue(10); EXPECT_FALSE(a == b); EXPECT_TRUE(a != b); b.setValue(10); EXPECT_TRUE(a == b); EXPECT_FALSE(a != b); b.setValue(20); EXPECT_FALSE(a == b); EXPECT_TRUE(a != b); a.invalidate(); EXPECT_FALSE(a == b); EXPECT_TRUE(a != b); EXPECT_FALSE(a == 1); // NOLINT a = 2; EXPECT_FALSE(a == 1); // NOLINT EXPECT_TRUE(a != 1); // NOLINT EXPECT_TRUE(a == 2); // NOLINT } TEST(OptionalValueTests, CopyConstructorTest) { OptionalValue one; OptionalValue copyOfOne(one); EXPECT_EQ(one, copyOfOne); OptionalValue two(10); OptionalValue copyOfTwo(two); EXPECT_EQ(two, copyOfTwo); } TEST(OptionalValueTests, AssignmentOperatorTest) { OptionalValue one; OptionalValue two(10); OptionalValue target(100); EXPECT_NE(one, target); EXPECT_NE(two, target); target = one; EXPECT_EQ(one, target); EXPECT_NE(two, target); target = two; EXPECT_NE(one, target); EXPECT_EQ(two, target); one = 1; EXPECT_TRUE(one.hasValue()); EXPECT_EQ(1, one.getValue()); } template void testOptionalValueSerialization(Type value) { { OptionalValue optionalValue; optionalValue.setValue(value); // Encode YAML::Node node; EXPECT_NO_THROW(node = optionalValue;); // Decode OptionalValue newOptionalValue; EXPECT_NO_THROW(newOptionalValue = node.as>()); // Verify EXPECT_TRUE(newOptionalValue.hasValue()); EXPECT_NO_THROW(newOptionalValue.getValue()); EXPECT_EQ(optionalValue.getValue(), newOptionalValue.getValue()); } // Test for an empty node { OptionalValue optionalValue; // Encode YAML::Node node; EXPECT_NO_THROW(node = optionalValue;); // Decode OptionalValue newOptionalValue; newOptionalValue.setValue(value); EXPECT_NO_THROW(newOptionalValue = node.as>()); // Verify EXPECT_FALSE(newOptionalValue.hasValue()); } // Test for scalar assignment, assigning an optional value from a node that contains // only the value of the correct type should succeed and not throw { OptionalValue optionalValue; YAML::Node node; node = value; EXPECT_NO_THROW(optionalValue = node.as>()); // Verify EXPECT_TRUE(optionalValue.hasValue()); EXPECT_EQ(value, *optionalValue); } } TEST(OptionalValueTests, Serialization) { testOptionalValueSerialization(true); testOptionalValueSerialization(false); testOptionalValueSerialization(144); testOptionalValueSerialization(37451); testOptionalValueSerialization(921.457f); testOptionalValueSerialization(3.1415); testOptionalValueSerialization('f'); testOptionalValueSerialization("TestString"); } TEST(OptionalValueTests, DereferenceAccess) { OptionalValue one; OptionalValue two(10); EXPECT_ANY_THROW(*one); EXPECT_NO_THROW(*two); EXPECT_EQ(10, *two); } }; // namespace DataStructures }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/DataStructures/UnitTests/PlyReaderTests.cpp000066400000000000000000000221011277777236100260360ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/DataStructures/PlyReader.h" #include "SurgSim/DataStructures/TriangleMesh.h" #include "SurgSim/DataStructures/TriangleMeshPlyReaderDelegate.h" #include "SurgSim/Framework/ApplicationData.h" #include "SurgSim/Math/Vector.h" using SurgSim::Math::Vector3d; namespace { std::string findFile(const std::string& filename) { std::vector paths; paths.push_back("Data/"); SurgSim::Framework::ApplicationData data(paths); return data.findFile(filename); } typedef SurgSim::DataStructures::TriangleMeshPlain MeshType; } namespace SurgSim { namespace DataStructures { class PlyReaderTests : public ::testing::Test { }; TEST_F(PlyReaderTests, InitTest) { ASSERT_NO_THROW(PlyReader("xxx")); ASSERT_NO_THROW(PlyReader(findFile("PlyReaderTests/Cube_with_physics.ply"))); PlyReader reader(findFile("PlyReaderTests/Cube_with_physics.ply")); EXPECT_TRUE(reader.isValid()); PlyReader reader2(findFile("xxx")); EXPECT_FALSE(reader2.isValid()); } TEST_F(PlyReaderTests, FindElementsAndProperties) { PlyReader reader(findFile("PlyReaderTests/Cube_with_physics.ply")); EXPECT_TRUE(reader.hasElement("vertex")); EXPECT_TRUE(reader.hasElement("face")); EXPECT_FALSE(reader.hasElement("xxx")); EXPECT_TRUE(reader.hasProperty("vertex", "x")); EXPECT_TRUE(reader.hasProperty("vertex", "y")); EXPECT_TRUE(reader.hasProperty("face", "nature")); EXPECT_TRUE(reader.hasProperty("face", "vertex_indices")); EXPECT_FALSE(reader.hasProperty("xxx", "vertex_indices")); EXPECT_FALSE(reader.hasProperty("vertex", "vertex_indices")); } TEST_F(PlyReaderTests, IsScalar) { PlyReader reader(findFile("PlyReaderTests/Testdata.ply")); EXPECT_TRUE(reader.isScalar("vertex", "x")); EXPECT_FALSE(reader.isScalar("face", "vertex_indices")); EXPECT_TRUE(reader.isScalar("face", "extra")); EXPECT_FALSE(reader.isScalar("xxx", "xxx")); EXPECT_FALSE(reader.isScalar("vertex", "xxx")); EXPECT_FALSE(reader.isScalar("face", "xxx")); } class TestData { public: void* beginVertices(const std::string& elementName, size_t vertices) { vertexData.overrun = 0; vertexInitCount = vertices; vertexRunningCount = 0; endVerticesCalled = false; return &vertexData; } void newVertex(const std::string& elementName) { ++vertexRunningCount; vertices.push_back(Vector3d(vertexData.x, vertexData.y, vertexData.z)); } void endVertices(const std::string& elementName) { endVerticesCalled = true; } void* beginFaces(const std::string& elementName, size_t faces) { faceInitCount = faces; faceRunningCount = 0; faceData.overrun = 0; faceData.faceCount = 0; faceData.faces = nullptr; return &faceData; } void newFace(const std::string& elementName) { ++faceRunningCount; std::vector face; for (unsigned int i = 0; i < faceData.faceCount; ++i) { face.push_back(faceData.faces[i]); } faces.push_back(face); extras.push_back(faceData.extra); natures.push_back(faceData.nature); } struct VertexData { double x; double y; double z; int64_t overrun; }; struct FaceData { unsigned int faceCount; unsigned int* faces; int extra; unsigned int nature; int64_t overrun; }; VertexData vertexData; size_t vertexInitCount; int vertexRunningCount; bool endVerticesCalled; FaceData faceData; size_t faceInitCount; int faceRunningCount; std::vector vertices; std::vector> faces; std::vector extras; std::vector natures; }; TEST_F(PlyReaderTests, ElementTwoPropertyTest) { TestData testData; PlyReader reader(findFile("PlyReaderTests/Cube_with_physics.ply")); EXPECT_TRUE(reader.requestElement("face", std::bind(&TestData::beginFaces, &testData, std::placeholders::_1, std::placeholders::_2), std::bind(&TestData::newFace, &testData, std::placeholders::_1), nullptr)); EXPECT_TRUE(reader.requestScalarProperty("face", "nature", PlyReader::TYPE_UNSIGNED_INT, offsetof(TestData::FaceData, nature))); EXPECT_TRUE(reader.requestListProperty("face", "vertex_indices", PlyReader::TYPE_UNSIGNED_INT, offsetof(TestData::FaceData, faces), PlyReader::TYPE_UNSIGNED_INT, offsetof(TestData::FaceData, faceCount))); ASSERT_NO_THROW(reader.parseFile()); EXPECT_EQ(11, testData.natures[0]); EXPECT_EQ(0, testData.natures[8]); } TEST_F(PlyReaderTests, ScalarReadTest) { TestData testData; PlyReader reader(findFile("PlyReaderTests/Testdata.ply")); EXPECT_TRUE(reader.requestElement("vertex", std::bind(&TestData::beginVertices, &testData, std::placeholders::_1, std::placeholders::_2), std::bind(&TestData::newVertex, &testData, std::placeholders::_1), std::bind(&TestData::endVertices, &testData, std::placeholders::_1))); /// Should not be able to register the element twice EXPECT_FALSE(reader.requestElement("vertex", std::bind(&TestData::beginVertices, &testData, std::placeholders::_1, std::placeholders::_2), std::bind(&TestData::newVertex, &testData, std::placeholders::_1), std::bind(&TestData::endVertices, &testData, std::placeholders::_1))); EXPECT_TRUE(reader.requestScalarProperty( "vertex", "x", PlyReader::TYPE_DOUBLE, offsetof(TestData::VertexData, x))); EXPECT_FALSE(reader.requestScalarProperty( "vertex", "x", PlyReader::TYPE_DOUBLE, offsetof(TestData::VertexData, x))); EXPECT_TRUE(reader.requestScalarProperty( "vertex", "y", PlyReader::TYPE_DOUBLE, offsetof(TestData::VertexData, y))); EXPECT_TRUE(reader.requestScalarProperty( "vertex", "z", PlyReader::TYPE_DOUBLE, offsetof(TestData::VertexData, z))); ASSERT_NO_THROW(reader.parseFile()); EXPECT_EQ(0L, testData.vertexData.overrun); EXPECT_EQ(4, testData.vertexInitCount); EXPECT_EQ(4, testData.vertexRunningCount); EXPECT_EQ(4u, testData.vertices.size()); for (size_t i = 0; i < testData.vertices.size(); ++i) { double sign = (i % 2 == 0) ? 1 : -1; Vector3d expected(static_cast(sign * (i + 1)), static_cast(sign * (i + 2)), static_cast(sign * (i + 3))); EXPECT_TRUE(expected.isApprox(testData.vertices[i])) << expected << testData.vertices[i]; } } TEST_F(PlyReaderTests, ListReadTest) { TestData testData; PlyReader reader(findFile("PlyReaderTests/Testdata.ply")); EXPECT_TRUE(reader.requestElement("face", std::bind(&TestData::beginFaces, &testData, std::placeholders::_1, std::placeholders::_2), std::bind(&TestData::newFace, &testData, std::placeholders::_1), nullptr)); EXPECT_TRUE(reader.requestListProperty("face", "vertex_indices", PlyReader::TYPE_UNSIGNED_INT, offsetof(TestData::FaceData, faces), PlyReader::TYPE_UNSIGNED_INT, offsetof(TestData::FaceData, faceCount))); EXPECT_TRUE(reader.requestScalarProperty( "face", "extra", PlyReader::TYPE_INT, offsetof(TestData::FaceData, extra))); ASSERT_NO_THROW(reader.parseFile()); EXPECT_EQ(0L, testData.faceData.overrun); EXPECT_EQ(4, testData.faceInitCount); EXPECT_EQ(4, testData.faceRunningCount); EXPECT_EQ(4u, testData.faces.size()); EXPECT_EQ(4u, testData.extras.size()); unsigned int expected = 0; for (size_t i = 0; i < testData.faces.size(); ++i) { std::vector face = testData.faces[i]; EXPECT_EQ(i + 1, face.size()); EXPECT_EQ(-static_cast(i), testData.extras[i]); for (size_t j = 0; j < face.size(); ++j) { EXPECT_EQ(expected, face[j]); ++expected; } } } TEST_F(PlyReaderTests, TriangleMeshDelegateTest) { PlyReader reader(findFile("PlyReaderTests/Cube_with_physics.ply")); auto delegate = std::make_shared>(); // parseWithDeletegate() will first call setDelegate(), then parseFile() if previous step successed. EXPECT_NO_THROW(EXPECT_TRUE(reader.parseWithDelegate(delegate))); auto mesh = delegate->getMesh(); EXPECT_EQ(26u, mesh->getNumVertices()); EXPECT_EQ(12u, mesh->getNumTriangles()); // The first and last vertices from the file Vector3d vertex0(1.0, 1.0, -1.0); Vector3d vertex25(-1.0, -1.0, 1.0); EXPECT_TRUE(vertex0.isApprox(mesh->getVertex(0).position)); EXPECT_TRUE(vertex25.isApprox(mesh->getVertex(25).position)); std::array triangle0 = {0, 1, 2}; std::array triangle11 = {10, 25, 11}; EXPECT_EQ(triangle0, mesh->getTriangle(0).verticesId); EXPECT_EQ(triangle11, mesh->getTriangle(11).verticesId); } } // DataStructures } // SurgSim opensurgsim-0.7.0/SurgSim/DataStructures/UnitTests/SegmentMeshTest.cpp000066400000000000000000000413421277777236100262130ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the Mesh class. #include #include #include #include "SurgSim/DataStructures/EmptyData.h" #include "SurgSim/DataStructures/MeshElement.h" #include "SurgSim/DataStructures/SegmentMesh.h" #include "SurgSim/DataStructures/UnitTests/MockObjects.h" #include "SurgSim/DataStructures/Vertex.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Framework/ApplicationData.h" using SurgSim::DataStructures::EmptyData; using SurgSim::DataStructures::SegmentMesh; using SurgSim::DataStructures::SegmentMeshPlain; using SurgSim::Math::Vector3d; /// Triangle Mesh for testing using MockVertexData, MockEdgeData, and MockTriangleData class MockSegmentMesh : public SurgSim::DataStructures::SegmentMesh { public: /// Vertex type for convenience typedef SegmentMesh::VertexType VertexType; /// Edge type for convenience typedef SegmentMesh::EdgeType EdgeType; /// Triangle type for convenience typedef SegmentMesh::TriangleType TriangleType; /// Constructor. Start out with no vertices and 0 updates MockSegmentMesh() : SurgSim::DataStructures::SegmentMesh(), m_numUpdates(0) { } SURGSIM_CLASSNAME(MockSegmentMesh); /// Destructor virtual ~MockSegmentMesh() { } /// Create a new vertex in the mesh /// \param position Position of the vertex /// \param normal Normal of the vertex /// \return Unique ID of vertex in the mesh size_t createVertex(const SurgSim::Math::Vector3d& position, const SurgSim::Math::Vector3d& normal) { VertexType vertex(position, MockVertexData(getNumVertices(), normal)); return addVertex(vertex); } /// Create a new edge in the mesh /// \param vertices Edge vertices /// \return Unique ID of vertex in the mesh size_t createEdge(const std::array& vertices) { EdgeType edge(vertices, MockEdgeData(getNumEdges())); return addEdge(edge); } /// Returns the normal of a vertex const SurgSim::Math::Vector3d& getVertexNormal(size_t id) const { return getVertex(id).data.getNormal(); } /// Returns the number of updates performed on the mesh int getNumUpdates() const { return m_numUpdates; } private: /// Provides update functionality, which just increments the number of updates bool doUpdate() override { ++m_numUpdates; return true; } /// Number of updates performed on the mesh int m_numUpdates; }; template<> std::string SurgSim::DataStructures::SegmentMesh ::TriangleMesh::m_className = "MockSegmentMesh"; class SegmentMeshTest : public ::testing::Test { public: void SetUp() { // Set to true to print the test positions. bool printPositions = false; // Set to true to print the test normals. bool printNormals = false; // Set to true to print the test edges. bool printEdges = false; // Set the number of test vertices size_t numVertices = 10; std::default_random_engine generator; std::uniform_real_distribution positionDistribution(-10.0, 10.0); std::uniform_real_distribution normalDistribution(-1.0, 1.0); std::uniform_int_distribution vertexIdDistribution(0, numVertices - 1); if (printPositions) { std::cout << "Test Vertex Positions:\n"; } /// Generate random positions for each vertex for (size_t i = 0; i < numVertices; ++i) { Vector3d position(positionDistribution(generator), positionDistribution(generator), positionDistribution(generator)); testPositions.push_back(position); if (printPositions) { std::cout << "\t" << i << ": (" << position.x() << ", " << position.y() << ", " << position.z() << ")\n"; } } if (printNormals) { std::cout << "Test Vertex Normals:\n"; } /// Generate random normals for each vertex for (size_t i = 0; i < numVertices; ++i) { Vector3d normal(normalDistribution(generator), normalDistribution(generator), normalDistribution(generator)); normal.normalize(); testNormals.push_back(normal); if (printNormals) { std::cout << "\t" << i << ": (" << normal.x() << ", " << normal.y() << ", " << normal.z() << ")\n"; } } if (printEdges) { std::cout << "Test Edges:\n"; } for (size_t i = 0; i < numVertices - 1; ++i) { std::array edgeVertices = {{ i, i + 1 }}; testEdgeVertices.push_back(edgeVertices); if (printEdges) { std::cout << "\t" << i << ": (" << formatIterator(edgeVertices, ", ") << ")\n"; } } } void TearDown() { boost::filesystem::remove("export.ply"); } /// Positions of test vertices std::vector testPositions; /// Normals of test vertices std::vector testNormals; /// Vertices of test edges std::vector> testEdgeVertices; }; TEST_F(SegmentMeshTest, InitTest) { ASSERT_NO_THROW({MockSegmentMesh mesh;}); ASSERT_NO_THROW({SegmentMeshPlain mesh;}); } TEST_F(SegmentMeshTest, ClassNameTest) { MockSegmentMesh mesh; EXPECT_EQ("MockSegmentMesh", mesh.getClassName()); SegmentMeshPlain meshPlain; EXPECT_EQ("SurgSim::DataStructures::SegmentMeshPlain", meshPlain.getClassName()); } TEST_F(SegmentMeshTest, CreateVerticesTest) { MockSegmentMesh mesh; EXPECT_EQ(0u, mesh.getNumVertices()); EXPECT_EQ(0u, mesh.getVertices().size()); /// Create the test vertices for (size_t i = 0; i < testPositions.size(); ++i) { EXPECT_EQ(i, mesh.createVertex(testPositions[i], testNormals[i])); EXPECT_EQ(i + 1, mesh.getNumVertices()); const std::vector& vertices = mesh.getVertices(); EXPECT_EQ(i + 1, vertices.size()); /// Make sure each vertex is set properly for (size_t j = 0; j < mesh.getNumVertices(); ++j) { EXPECT_EQ(testPositions[j], vertices[j].position); const MockVertexData& data = vertices[j].data; EXPECT_EQ(j, data.getId()); EXPECT_EQ(testNormals[j], data.getNormal()); } } /// Create the test edges for (size_t i = 0; i < testEdgeVertices.size(); ++i) { EXPECT_EQ(i, mesh.createEdge(testEdgeVertices[i])); EXPECT_EQ(i + 1, mesh.getNumEdges()); const std::vector& edges = mesh.getEdges(); EXPECT_EQ(i + 1, edges.size()); /// Make sure each vertex is set properly for (size_t j = 0; j < mesh.getNumEdges(); ++j) { EXPECT_EQ(testEdgeVertices[j], edges[j].verticesId); const MockEdgeData& data = edges[j].data; EXPECT_EQ(j, data.getId()); } } } TEST_F(SegmentMeshTest, isValidTest) { MockSegmentMesh mesh; EXPECT_TRUE(mesh.isValid()); /// Create the edges (no vertices yet => the mesh is NOT valid) for (size_t i = 0; i < testEdgeVertices.size(); ++i) { mesh.createEdge(testEdgeVertices[i]); } EXPECT_FALSE(mesh.isValid()); /// Create the vertices for (size_t i = 0; i < testPositions.size(); ++i) { mesh.createVertex(testPositions[i], testNormals[i]); } EXPECT_TRUE(mesh.isValid()); } TEST_F(SegmentMeshTest, SetVertexPositionsTest) { MockSegmentMesh mesh; /// Create vertices with test normals, but all positions at (0,0,0) for (size_t i = 0; i < testPositions.size(); ++i) { EXPECT_EQ(i, mesh.createVertex(Vector3d(0.0, 0.0, 0.0), testNormals[i])); EXPECT_EQ(i + 1, mesh.getNumVertices()); } mesh.setVertexPositions(testPositions); EXPECT_EQ(1, mesh.getNumUpdates()); EXPECT_EQ(testPositions.size(), mesh.getNumVertices()); const std::vector& vertices = mesh.getVertices(); EXPECT_EQ(testPositions.size(), vertices.size()); /// Make sure each vertex is set properly for (size_t i = 0; i < mesh.getNumVertices(); ++i) { EXPECT_EQ(testPositions[i], vertices[i].position); const MockVertexData& data = vertices[i].data; EXPECT_EQ(testNormals[i], data.getNormal()); } mesh.setVertexPositions(testPositions, false); EXPECT_EQ(1, mesh.getNumUpdates()); EXPECT_EQ(testPositions.size(), mesh.getNumVertices()); EXPECT_EQ(testPositions.size(), mesh.getVertices().size()); mesh.setVertexPositions(testPositions, true); EXPECT_EQ(2, mesh.getNumUpdates()); EXPECT_EQ(testPositions.size(), mesh.getNumVertices()); EXPECT_EQ(testPositions.size(), mesh.getVertices().size()); /// Test the individual set/get methods mesh.setVertexPosition(5, Vector3d(0.0, 0.0, 0.0)); /// Make sure each vertex is set properly for (size_t i = 0; i < mesh.getNumVertices(); ++i) { if (i == 5) { EXPECT_EQ(Vector3d(0.0, 0.0, 0.0), mesh.getVertexPosition(i)); EXPECT_EQ(testNormals[i], mesh.getVertexNormal(i)); } else { EXPECT_EQ(testPositions[i], mesh.getVertexPosition(i)); EXPECT_EQ(testNormals[i], mesh.getVertexNormal(i)); } } /// Try setting with wrong number of vertices mesh.createVertex(Vector3d(0.0, 0.0, 0.0), Vector3d(0.0, 0.0, 0.0)); // create one more vertex EXPECT_THROW(mesh.setVertexPositions(testPositions), SurgSim::Framework::AssertionFailure); } TEST_F(SegmentMeshTest, ClearTest) { MockSegmentMesh mesh; EXPECT_EQ(0, mesh.getNumUpdates()); EXPECT_EQ(0u, mesh.getNumVertices()); EXPECT_EQ(0u, mesh.getVertices().size()); EXPECT_EQ(0u, mesh.getNumEdges()); EXPECT_EQ(0u, mesh.getEdges().size()); /// Create mesh using test data for (size_t i = 0; i < testPositions.size(); ++i) { EXPECT_EQ(i, mesh.createVertex(Vector3d(0.0, 0.0, 0.0), Vector3d(0.0, 0.0, 0.0))); EXPECT_EQ(i + 1, mesh.getNumVertices()); } for (size_t i = 0; i < testEdgeVertices.size(); ++i) { EXPECT_EQ(i, mesh.createEdge(testEdgeVertices[i])); EXPECT_EQ(i + 1, mesh.getNumEdges()); } EXPECT_EQ(testPositions.size(), mesh.getNumVertices()); EXPECT_EQ(testPositions.size(), mesh.getVertices().size()); EXPECT_EQ(testEdgeVertices.size(), mesh.getNumEdges()); EXPECT_EQ(testEdgeVertices.size(), mesh.getEdges().size()); /// Clear mesh mesh.clear(); EXPECT_EQ(0u, mesh.getNumVertices()); EXPECT_EQ(0u, mesh.getVertices().size()); EXPECT_EQ(0u, mesh.getNumEdges()); EXPECT_EQ(0u, mesh.getEdges().size()); } TEST_F(SegmentMeshTest, UpdateTest) { MockSegmentMesh mesh; EXPECT_EQ(0, mesh.getNumUpdates()); for (int i = 0; i < 10; ++i) { mesh.update(); EXPECT_EQ(i + 1, mesh.getNumUpdates()); } } TEST_F(SegmentMeshTest, ComparisonTest) { /// Create mesh using test data MockSegmentMesh mesh; for (size_t i = 0; i < testPositions.size(); ++i) { EXPECT_EQ(i, mesh.createVertex(testPositions[i], testNormals[i])); } for (size_t i = 0; i < testEdgeVertices.size(); ++i) { EXPECT_EQ(i, mesh.createEdge(testEdgeVertices[i])); } /// Create same mesh again MockSegmentMesh sameMesh; for (size_t i = 0; i < testPositions.size(); ++i) { EXPECT_EQ(i, sameMesh.createVertex(testPositions[i], testNormals[i])); } for (size_t i = 0; i < testEdgeVertices.size(); ++i) { EXPECT_EQ(i, sameMesh.createEdge(testEdgeVertices[i])); } /// Create mesh with test data, but each vertex has position and normal of (0,0,0) to make them different MockSegmentMesh meshWithDifferentVertices; for (size_t i = 0; i < testPositions.size(); ++i) { EXPECT_EQ(i, meshWithDifferentVertices.createVertex(Vector3d(0.0, 0.0, 0.0), Vector3d(0.0, 0.0, 0.0))); } for (size_t i = 0; i < testEdgeVertices.size(); ++i) { EXPECT_EQ(i, meshWithDifferentVertices.createEdge(testEdgeVertices[i])); } /// Create mesh with test data, but reverse each edge's vertex order to make them different MockSegmentMesh meshWithDifferentEdges; for (size_t i = 0; i < testPositions.size(); ++i) { EXPECT_EQ(i, meshWithDifferentEdges.createVertex(testPositions[i], testNormals[i])); } for (size_t i = 0; i < testEdgeVertices.size(); ++i) { std::array edge = {{ testEdgeVertices[i][1], testEdgeVertices[i][0] }}; EXPECT_EQ(i, meshWithDifferentEdges.createEdge(edge)); } /// Test comparisons EXPECT_TRUE(mesh == sameMesh); EXPECT_FALSE(mesh != sameMesh); EXPECT_FALSE(mesh == meshWithDifferentVertices); EXPECT_TRUE(mesh != meshWithDifferentVertices); EXPECT_FALSE(mesh == meshWithDifferentEdges); EXPECT_TRUE(mesh != meshWithDifferentEdges); } TEST_F(SegmentMeshTest, CopyConstructorTest) { MockSegmentMesh mesh; /// Create mesh using test data for (size_t i = 0; i < testPositions.size(); ++i) { EXPECT_EQ(i, mesh.createVertex(Vector3d(0.0, 0.0, 0.0), Vector3d(0.0, 0.0, 0.0))); EXPECT_EQ(i + 1, mesh.getNumVertices()); } for (size_t i = 0; i < testEdgeVertices.size(); ++i) { EXPECT_EQ(i, mesh.createEdge(testEdgeVertices[i])); EXPECT_EQ(i + 1, mesh.getNumEdges()); } SurgSim::DataStructures::SegmentMeshPlain mesh2(mesh); for (size_t i = 0; i < mesh.getNumVertices(); ++i) { EXPECT_EQ(mesh.getVertexPosition(i), mesh2.getVertexPosition(i)); } for (size_t i = 0; i < mesh.getNumEdges(); ++i) { EXPECT_EQ(mesh.getEdge(i).verticesId, mesh2.getEdge(i).verticesId); } } TEST_F(SegmentMeshTest, GetEdgePositions) { MockSegmentMesh mesh; // Initialization auto normal = testNormals.begin(); for (auto position = testPositions.begin(); position != testPositions.end(); ++position) { mesh.createVertex(*position, *normal++); } for (auto vertices = testEdgeVertices.begin(); vertices != testEdgeVertices.end(); ++vertices) { mesh.createEdge(*vertices); } // Testing for (size_t id = 0; id < mesh.getEdges().size(); ++id) { auto verticesPositions = mesh.getEdgePositions(id); auto& vertexIds = mesh.getEdge(id).verticesId; EXPECT_TRUE(mesh.getVertex(vertexIds[0]).position.isApprox(verticesPositions[0])); EXPECT_TRUE(mesh.getVertex(vertexIds[1]).position.isApprox(verticesPositions[1])); } } TEST_F(SegmentMeshTest, AssertingFunctions) { MockSegmentMesh mesh; // Initialization auto normal = testNormals.begin(); for (auto position = testPositions.begin(); position != testPositions.end(); ++position) { mesh.createVertex(*position, *normal++); } for (auto vertices = testEdgeVertices.begin(); vertices != testEdgeVertices.end(); ++vertices) { mesh.createEdge(*vertices); } // Testing std::array triangleIds = {{0, 1, 2}}; MockSegmentMesh::TriangleType triangle(triangleIds); EXPECT_THROW(mesh.addTriangle(triangle), SurgSim::Framework::AssertionFailure); EXPECT_THROW(mesh.getNumTriangles(), SurgSim::Framework::AssertionFailure); EXPECT_THROW(mesh.getTriangles(), SurgSim::Framework::AssertionFailure); EXPECT_THROW(mesh.getTriangle(0), SurgSim::Framework::AssertionFailure); EXPECT_THROW(mesh.removeTriangle(0), SurgSim::Framework::AssertionFailure); EXPECT_THROW(mesh.getTrianglePositions(0), SurgSim::Framework::AssertionFailure); EXPECT_THROW(mesh.doClearTriangles(), SurgSim::Framework::AssertionFailure); } TEST_F(SegmentMeshTest, CreateDefaultedges) { MockSegmentMesh mesh; for (size_t i = 0; i < 10; ++i) { mesh.createVertex(Vector3d(0.0, 0.0, 0.0), Vector3d(0.0, 0.0, 0.0)); } mesh.createDefaultEdges(); EXPECT_EQ(9, mesh.getNumEdges()); for (size_t i = 0; i < mesh.getNumEdges(); ++i) { EXPECT_EQ(i, mesh.getEdge(i).verticesId[0]); EXPECT_EQ(i + 1, mesh.getEdge(i).verticesId[1]); } } TEST_F(SegmentMeshTest, LoadMesh) { auto mesh = std::make_shared(); SurgSim::Framework::ApplicationData data("config.txt"); mesh->load("SegmentMeshTest/segmentmesh.ply", data); ASSERT_EQ(4u, mesh->getNumVertices()); ASSERT_EQ(3u, mesh->getNumEdges()); auto edge = mesh->getEdge(0); ASSERT_EQ(0u, edge.verticesId[0]); ASSERT_EQ(1u, edge.verticesId[1]); edge = mesh->getEdge(1); ASSERT_EQ(1u, edge.verticesId[0]); ASSERT_EQ(2u, edge.verticesId[1]); edge = mesh->getEdge(2); ASSERT_EQ(2u, edge.verticesId[0]); ASSERT_EQ(3u, edge.verticesId[1]); } TEST_F(SegmentMeshTest, WriteMesh) { auto mesh = std::make_shared(); SurgSim::Framework::ApplicationData data("config.txt"); mesh->load("SegmentMeshTest/segmentmesh.ply", data); EXPECT_NO_THROW(mesh->save("export.ply")); std::vector paths(1, "."); SurgSim::Framework::ApplicationData localPath(paths); auto loaded = std::make_shared(); EXPECT_NO_THROW(loaded->load("export.ply", localPath)); ASSERT_EQ(4u, mesh->getNumVertices()); ASSERT_EQ(3u, mesh->getNumEdges()); auto edge = mesh->getEdge(0); ASSERT_EQ(0u, edge.verticesId[0]); ASSERT_EQ(1u, edge.verticesId[1]); edge = mesh->getEdge(1); ASSERT_EQ(1u, edge.verticesId[0]); ASSERT_EQ(2u, edge.verticesId[1]); edge = mesh->getEdge(2); ASSERT_EQ(2u, edge.verticesId[0]); ASSERT_EQ(3u, edge.verticesId[1]); } opensurgsim-0.7.0/SurgSim/DataStructures/UnitTests/TetrahedronMeshTest.cpp000066400000000000000000000536551277777236100271020ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the Tetrahedron class. #include "gtest/gtest.h" #include "SurgSim/DataStructures/EmptyData.h" #include "SurgSim/DataStructures/Vertex.h" #include "SurgSim/DataStructures/MeshElement.h" #include "SurgSim/DataStructures/UnitTests/MockObjects.h" #include using SurgSim::DataStructures::EmptyData; using SurgSim::DataStructures::TetrahedronMesh; using SurgSim::Math::Vector3d; class TetrahedronMeshTest : public ::testing::Test { public: void SetUp() { // Set to true to print the test positions. bool printPositions = false; // Set to true to print the test normals. bool printNormals = false; // Set to true to print the test edges. bool printEdges = false; // Set to true to print the test triangles. bool printTriangles = false; // Set to true to print the test tetrahedrons. bool printTetrahedrons = false; // Set the number of test vertices size_t numVertices = 10; // Set the number of test tetrahedrons size_t numTetrahedrons = 15; std::default_random_engine generator; std::uniform_real_distribution positionDistribution(-10.0, 10.0); std::uniform_real_distribution normalDistribution(-1.0, 1.0); std::uniform_int_distribution vertexIdDistribution(0, numVertices-1); if (printPositions) { std::cout << "Test Vertex Positions:\n"; } /// Generate random positions for each vertex for (size_t i = 0; i < numVertices; ++i) { Vector3d position(positionDistribution(generator), positionDistribution(generator), positionDistribution(generator)); testPositions.push_back(position); if (printPositions) { std::cout << "\t" << i << ": (" << position.x() << ", " << position.y() << ", " << position.z() << ")\n"; } } if (printNormals) { std::cout << "Test Vertex Normals:\n"; } /// Generate random normals for each vertex for (size_t i = 0; i < numVertices; ++i) { Vector3d normal(normalDistribution(generator), normalDistribution(generator), normalDistribution(generator)); normal.normalize(); testNormals.push_back(normal); if (printNormals) { std::cout << "\t" << i << ": (" << normal.x() << ", " << normal.y() << ", " << normal.z() << ")\n"; } } if (printTetrahedrons) { std::cout << "Test Tetrahedrons:\n"; } /// Generate random vertex IDs within [0, numVertices) in quadruplets for mesh tetrahedrons for (size_t i = 0; i < numTetrahedrons; ++i) { std::array tetrahedronVertices = {{ vertexIdDistribution(generator), vertexIdDistribution(generator), vertexIdDistribution(generator), vertexIdDistribution(generator) }}; testTetrahedronsVerticesId.push_back(tetrahedronVertices); /// Create 6 vertex ID pairs for each tetrahedron edge (not worrying about duplicates for these tests) std::array tetrahedronEdges; int edgeIDs[6][2] = { {0, 1}, {0, 2}, {0, 3}, {1, 2}, {1, 3}, {2, 3} }; for (int j = 0; j < 6; ++j) { std::array edgeVertices = { { tetrahedronVertices[edgeIDs[j][0]], tetrahedronVertices[edgeIDs[j][1]] } }; testEdgesVerticesId.push_back(edgeVertices); tetrahedronEdges[j] = testEdgesVerticesId.size() - 1; } testTetrahedronsEdgesId.push_back(tetrahedronEdges); /// Create 4 vertex ID pairs for each tetrahedron triangle (not worrying about duplicates for these tests) int vertexIDs[4][3] = { {0, 1, 2}, {0, 1, 3}, {0, 2, 3}, {1, 2, 3} }; int tetTriangleEdgeIds[4][3] = { {0, 1, 3}, {0, 2, 4}, {1, 2, 5}, {3, 4, 5} }; std::array tetrahedronTriangles; for (int j = 0; j < 4; ++j) { std::array triangleVertices = { { tetrahedronVertices[vertexIDs[j][0]], tetrahedronVertices[vertexIDs[j][1]], tetrahedronVertices[vertexIDs[j][2]] } }; testTrianglesVerticesId.push_back(triangleVertices); tetrahedronTriangles[j] = testTrianglesVerticesId.size() - 1; std::array triangleEdges; for (int k = 0; k < 3; k++) { triangleEdges[k] = tetrahedronEdges[tetTriangleEdgeIds[j][k]]; } testTrianglesEdgesId.push_back(triangleEdges); } testTetrahedronsTrianglesId.push_back(tetrahedronTriangles); if (printTetrahedrons) { std::cout << "\t" << i << ": Vertices (" << formatIterator(tetrahedronVertices, ", ") << "), Edges (" << formatIterator(tetrahedronEdges, ", ") << "), Triangles (" << formatIterator(tetrahedronTriangles, ", ") << ")\n"; } } if (printTriangles) { std::cout << "Test Triangles:\n"; for (size_t i = 0; i < testTrianglesVerticesId.size(); ++i) { const std::array& triangleVertices = testTrianglesVerticesId[i]; const std::array& triangleEdges = testTrianglesEdgesId[i]; std::cout << "\t" << i << ": Vertices (" << formatIterator(triangleVertices, ", ") << ") - Edges (" << formatIterator(triangleEdges, ", ") << ")\n"; } } if (printEdges) { std::cout << "Test Edges:\n"; for (size_t i = 0; i < testEdgesVerticesId.size(); ++i) { const std::array& edgeVertices = testEdgesVerticesId[i]; std::cout << "\t" << i << ": (" << formatIterator(edgeVertices, ", ") << ")\n"; } } } void TearDown() { } /// Positions of test vertices std::vector testPositions; /// Normals of test vertices std::vector testNormals; /// Vertices Id for all edges std::vector> testEdgesVerticesId; /// Vertices Id for all triangles std::vector> testTrianglesVerticesId; /// Edges Id for all triangles std::vector> testTrianglesEdgesId; /// Vertices Id for all tetrahedrons std::vector> testTetrahedronsVerticesId; /// Edges Id for all tetrahedrons std::vector> testTetrahedronsEdgesId; /// Triangles Id for all tetrahedrons std::vector> testTetrahedronsTrianglesId; }; TEST_F(TetrahedronMeshTest, InitTest) { ASSERT_NO_THROW({MockTetrahedronMesh mesh;}); /// Make sure we can create triangle meshes with each possible combination of void data. /// One void entry typedef TetrahedronMesh TetrahedronMeshNoVertexData; typedef TetrahedronMesh TetrahedronMeshNoEdgeData; typedef TetrahedronMesh TetrahedronMeshNoTriangleData; typedef TetrahedronMesh TetrahedronMeshNoTetrahedronData; ASSERT_NO_THROW({TetrahedronMeshNoVertexData mesh;}); ASSERT_NO_THROW({TetrahedronMeshNoEdgeData mesh;}); ASSERT_NO_THROW({TetrahedronMeshNoTriangleData mesh;}); ASSERT_NO_THROW({TetrahedronMeshNoTetrahedronData mesh;}); /// Two void entries typedef TetrahedronMesh TetrahedronMeshNoVertexOrEdgeData; typedef TetrahedronMesh TetrahedronMeshNoVertexOrTriangleData; typedef TetrahedronMesh TetrahedronMeshNoVertexOrTetrahedronData; typedef TetrahedronMesh TetrahedronMeshNoEdgeOrTriangleData; typedef TetrahedronMesh TetrahedronMeshNoEdgeOrTetrahedronData; typedef TetrahedronMesh TetrahedronMeshNoTriangleOrTetrahedronData; ASSERT_NO_THROW({TetrahedronMeshNoVertexOrEdgeData mesh;}); ASSERT_NO_THROW({TetrahedronMeshNoVertexOrTriangleData mesh;}); ASSERT_NO_THROW({TetrahedronMeshNoVertexOrTetrahedronData mesh;}); ASSERT_NO_THROW({TetrahedronMeshNoEdgeOrTriangleData mesh;}); ASSERT_NO_THROW({TetrahedronMeshNoEdgeOrTetrahedronData mesh;}); ASSERT_NO_THROW({TetrahedronMeshNoTriangleOrTetrahedronData mesh;}); /// Three void entries typedef TetrahedronMesh TetrahedronMeshOnlyTetrahedronData; typedef TetrahedronMesh TetrahedronMeshOnlyTriangleData; typedef TetrahedronMesh TetrahedronMeshOnlyEdgeData; typedef TetrahedronMesh TetrahedronMeshOnlyVertexData; ASSERT_NO_THROW({TetrahedronMeshOnlyTetrahedronData mesh;}); ASSERT_NO_THROW({TetrahedronMeshOnlyTriangleData mesh;}); ASSERT_NO_THROW({TetrahedronMeshOnlyEdgeData mesh;}); ASSERT_NO_THROW({TetrahedronMeshOnlyVertexData mesh;}); /// Four void entries typedef TetrahedronMesh TetrahedronMeshNoData; ASSERT_NO_THROW({TetrahedronMeshNoData mesh;}); } TEST_F(TetrahedronMeshTest, CreateVerticesTest) { MockTetrahedronMesh mesh; EXPECT_EQ(0u, mesh.getNumVertices()); EXPECT_EQ(0u, mesh.getVertices().size()); EXPECT_EQ(0u, mesh.getNumEdges()); EXPECT_EQ(0u, mesh.getEdges().size()); EXPECT_EQ(0u, mesh.getNumTriangles()); EXPECT_EQ(0u, mesh.getTriangles().size()); EXPECT_EQ(0u, mesh.getNumTetrahedrons()); EXPECT_EQ(0u, mesh.getTetrahedrons().size()); EXPECT_EQ(0, mesh.getNumUpdates()); /// Create the test vertices for (size_t i = 0; i < testPositions.size(); ++i) { EXPECT_EQ(i, mesh.createVertex(testPositions[i], testNormals[i])); EXPECT_EQ(i + 1, mesh.getNumVertices()); const std::vector& vertices = mesh.getVertices(); EXPECT_EQ(i + 1, vertices.size()); /// Make sure each vertex is set properly for (size_t j = 0; j < mesh.getNumVertices(); ++j) { EXPECT_EQ(testPositions[j], vertices[j].position); const MockVertexData& data = vertices[j].data; EXPECT_EQ(j, data.getId()); EXPECT_EQ(testNormals[j], data.getNormal()); } } /// Create the test edges for (size_t i = 0; i < testEdgesVerticesId.size(); ++i) { EXPECT_EQ(i, mesh.createEdge(testEdgesVerticesId[i])); EXPECT_EQ(i + 1, mesh.getNumEdges()); const std::vector& edges = mesh.getEdges(); EXPECT_EQ(i + 1, edges.size()); /// Make sure each vertex is set properly for (size_t j = 0; j < mesh.getNumEdges(); ++j) { EXPECT_EQ(testEdgesVerticesId[j], edges[j].verticesId); const MockEdgeData& data = edges[j].data; EXPECT_EQ(j, data.getId()); } } /// Create the test triangles for (size_t i = 0; i < testTrianglesVerticesId.size(); ++i) { EXPECT_EQ(i, mesh.createTriangle(testTrianglesVerticesId[i], testTrianglesEdgesId[i])); EXPECT_EQ(i + 1, mesh.getNumTriangles()); const std::vector& triangles = mesh.getTriangles(); EXPECT_EQ(i + 1, triangles.size()); /// Make sure each vertex is set properly for (size_t j = 0; j < mesh.getNumTriangles(); ++j) { EXPECT_EQ(testTrianglesVerticesId[j], triangles[j].verticesId); const MockTriangleData& data = triangles[j].data; EXPECT_EQ(j, data.getId()); EXPECT_EQ(testTrianglesEdgesId[j], data.getEdges()); } } /// Create the test tetrahedrons for (size_t i = 0; i < testTetrahedronsVerticesId.size(); ++i) { EXPECT_EQ(i, mesh.createTetrahedron(testTetrahedronsVerticesId[i], \ testTetrahedronsEdgesId[i], testTetrahedronsTrianglesId[i])); EXPECT_EQ(i + 1, mesh.getNumTetrahedrons()); const std::vector& tetrahedrons = mesh.getTetrahedrons(); EXPECT_EQ(i + 1, tetrahedrons.size()); /// Make sure each tetrahedron is set properly for (size_t j = 0; j < mesh.getNumTetrahedrons(); ++j) { EXPECT_EQ(testTetrahedronsVerticesId[j], tetrahedrons[j].verticesId); const MockTetrahedronData& data = tetrahedrons[j].data; EXPECT_EQ(j, data.getId()); EXPECT_EQ(testTetrahedronsEdgesId[j], data.getEdges()); EXPECT_EQ(testTetrahedronsTrianglesId[j], data.getTriangles()); } } } TEST_F(TetrahedronMeshTest, isValidTest) { MockTetrahedronMesh mesh; EXPECT_TRUE(mesh.isValid()); /// Create the edges (no vertices yet => the mesh is NOT valid) for (size_t i = 0; i < testEdgesVerticesId.size(); ++i) { mesh.createEdge(testEdgesVerticesId[i]); } EXPECT_FALSE(mesh.isValid()); /// Create the triangles (no vertices yet => the mesh is NOT valid) for (size_t i = 0; i < testTrianglesVerticesId.size(); ++i) { mesh.createTriangle(testTrianglesVerticesId[i], testTrianglesEdgesId[i]); } EXPECT_FALSE(mesh.isValid()); /// Create the tetrahedrons (no vertices yet => the mesh is NOT valid) for (size_t i = 0; i < testTetrahedronsVerticesId.size(); ++i) { mesh.createTetrahedron(testTetrahedronsVerticesId[i], testTetrahedronsEdgesId[i], \ testTetrahedronsTrianglesId[i]); } EXPECT_FALSE(mesh.isValid()); /// Create the vertices for (size_t i = 0; i < testPositions.size(); ++i) { mesh.createVertex(testPositions[i], testNormals[i]); } EXPECT_TRUE(mesh.isValid()); } TEST_F(TetrahedronMeshTest, SetVertexPositionsTest) { MockTetrahedronMesh mesh; /// Create vertices with test normals, but all positions at (0,0,0) for (size_t i = 0; i < testPositions.size(); ++i) { EXPECT_EQ(i, mesh.createVertex(Vector3d(0.0, 0.0, 0.0), testNormals[i])); EXPECT_EQ(i + 1, mesh.getNumVertices()); } mesh.setVertexPositions(testPositions); EXPECT_EQ(1, mesh.getNumUpdates()); EXPECT_EQ(testPositions.size(), mesh.getNumVertices()); const std::vector& vertices = mesh.getVertices(); EXPECT_EQ(testPositions.size(), vertices.size()); /// Make sure each vertex is set properly for (size_t i = 0; i < mesh.getNumVertices(); ++i) { EXPECT_EQ(testPositions[i], vertices[i].position); const MockVertexData& data = vertices[i].data; EXPECT_EQ(testNormals[i], data.getNormal()); } mesh.setVertexPositions(testPositions, false); EXPECT_EQ(1, mesh.getNumUpdates()); EXPECT_EQ(testPositions.size(), mesh.getNumVertices()); EXPECT_EQ(testPositions.size(), mesh.getVertices().size()); mesh.setVertexPositions(testPositions, true); EXPECT_EQ(2, mesh.getNumUpdates()); EXPECT_EQ(testPositions.size(), mesh.getNumVertices()); EXPECT_EQ(testPositions.size(), mesh.getVertices().size()); /// Test the individual set/get methods mesh.setVertexPosition(5, Vector3d(0.0, 0.0, 0.0)); /// Make sure each vertex is set properly for (size_t i = 0; i < mesh.getNumVertices(); ++i) { if (i == 5) { EXPECT_EQ(Vector3d(0.0, 0.0, 0.0), mesh.getVertexPosition(i)); EXPECT_EQ(testNormals[i], mesh.getVertexNormal(i)); } else { EXPECT_EQ(testPositions[i], mesh.getVertexPosition(i)); EXPECT_EQ(testNormals[i], mesh.getVertexNormal(i)); } } /// Try setting with wrong number of vertices mesh.createVertex(Vector3d(0.0, 0.0, 0.0), Vector3d(0.0, 0.0, 0.0)); // create one more vertex EXPECT_ANY_THROW(mesh.setVertexPositions(testPositions)); } TEST_F(TetrahedronMeshTest, ClearTest) { MockTetrahedronMesh mesh; EXPECT_EQ(0, mesh.getNumUpdates()); EXPECT_EQ(0u, mesh.getNumVertices()); EXPECT_EQ(0u, mesh.getVertices().size()); EXPECT_EQ(0u, mesh.getNumEdges()); EXPECT_EQ(0u, mesh.getEdges().size()); EXPECT_EQ(0u, mesh.getNumTriangles()); EXPECT_EQ(0u, mesh.getTriangles().size()); EXPECT_EQ(0u, mesh.getNumTetrahedrons()); EXPECT_EQ(0u, mesh.getTetrahedrons().size()); /// Create mesh using test data for (size_t i = 0; i < testPositions.size(); ++i) { EXPECT_EQ(i, mesh.createVertex(Vector3d(0.0, 0.0, 0.0), Vector3d(0.0, 0.0, 0.0))); EXPECT_EQ(i + 1, mesh.getNumVertices()); } for (size_t i = 0; i < testEdgesVerticesId.size(); ++i) { EXPECT_EQ(i, mesh.createEdge(testEdgesVerticesId[i])); EXPECT_EQ(i + 1, mesh.getNumEdges()); } for (size_t i = 0; i < testTrianglesVerticesId.size(); ++i) { EXPECT_EQ(i, mesh.createTriangle(testTrianglesVerticesId[i], testTrianglesEdgesId[i])); EXPECT_EQ(i + 1, mesh.getNumTriangles()); } for (size_t i = 0; i < testTetrahedronsVerticesId.size(); ++i) { EXPECT_EQ(i, mesh.createTetrahedron(testTetrahedronsVerticesId[i], \ testTetrahedronsEdgesId[i], testTetrahedronsTrianglesId[i])); EXPECT_EQ(i + 1, mesh.getNumTetrahedrons()); } EXPECT_EQ(testPositions.size(), mesh.getNumVertices()); EXPECT_EQ(testPositions.size(), mesh.getVertices().size()); EXPECT_EQ(testEdgesVerticesId.size(), mesh.getNumEdges()); EXPECT_EQ(testEdgesVerticesId.size(), mesh.getEdges().size()); EXPECT_EQ(testTrianglesVerticesId.size(), mesh.getNumTriangles()); EXPECT_EQ(testTrianglesVerticesId.size(), mesh.getTriangles().size()); EXPECT_EQ(testTetrahedronsVerticesId.size(), mesh.getNumTetrahedrons()); EXPECT_EQ(testTetrahedronsVerticesId.size(), mesh.getTetrahedrons().size()); /// Clear mesh mesh.clear(); EXPECT_EQ(0u, mesh.getNumVertices()); EXPECT_EQ(0u, mesh.getVertices().size()); EXPECT_EQ(0u, mesh.getNumEdges()); EXPECT_EQ(0u, mesh.getEdges().size()); EXPECT_EQ(0u, mesh.getNumTriangles()); EXPECT_EQ(0u, mesh.getTriangles().size()); EXPECT_EQ(0u, mesh.getNumTetrahedrons()); EXPECT_EQ(0u, mesh.getTetrahedrons().size()); } TEST_F(TetrahedronMeshTest, UpdateTest) { MockTetrahedronMesh mesh; EXPECT_EQ(0, mesh.getNumUpdates()); for (int i = 0; i < 10; ++i) { mesh.update(); EXPECT_EQ(i + 1, mesh.getNumUpdates()); } } TEST_F(TetrahedronMeshTest, ComparisonTest) { /// Create mesh using test data MockTetrahedronMesh mesh; for (size_t i = 0; i < testPositions.size(); ++i) { EXPECT_EQ(i, mesh.createVertex(testPositions[i], testNormals[i])); } for (size_t i = 0; i < testEdgesVerticesId.size(); ++i) { EXPECT_EQ(i, mesh.createEdge(testEdgesVerticesId[i])); } for (size_t i = 0; i < testTrianglesVerticesId.size(); ++i) { EXPECT_EQ(i, mesh.createTriangle(testTrianglesVerticesId[i], testTrianglesEdgesId[i])); } for (size_t i = 0; i < testTetrahedronsVerticesId.size(); ++i) { EXPECT_EQ(i, mesh.createTetrahedron(testTetrahedronsVerticesId[i], \ testTetrahedronsEdgesId[i], testTetrahedronsTrianglesId[i])); } /// Create same mesh again MockTetrahedronMesh sameMesh; for (size_t i = 0; i < testPositions.size(); ++i) { EXPECT_EQ(i, sameMesh.createVertex(testPositions[i], testNormals[i])); } for (size_t i = 0; i < testEdgesVerticesId.size(); ++i) { EXPECT_EQ(i, sameMesh.createEdge(testEdgesVerticesId[i])); } for (size_t i = 0; i < testTrianglesVerticesId.size(); ++i) { EXPECT_EQ(i, sameMesh.createTriangle(testTrianglesVerticesId[i], testTrianglesEdgesId[i])); } for (size_t i = 0; i < testTetrahedronsVerticesId.size(); ++i) { EXPECT_EQ(i, sameMesh.createTetrahedron(testTetrahedronsVerticesId[i], \ testTetrahedronsEdgesId[i], testTetrahedronsTrianglesId[i])); } /// Create mesh with test data, but each vertex has position and normal of (0,0,0) to make them different MockTetrahedronMesh meshWithDifferentVertices; for (size_t i = 0; i < testPositions.size(); ++i) { EXPECT_EQ(i, meshWithDifferentVertices.createVertex(Vector3d(0.0, 0.0, 0.0), Vector3d(0.0, 0.0, 0.0))); } for (size_t i = 0; i < testEdgesVerticesId.size(); ++i) { EXPECT_EQ(i, meshWithDifferentVertices.createEdge(testEdgesVerticesId[i])); } for (size_t i = 0; i < testTrianglesVerticesId.size(); ++i) { EXPECT_EQ(i, meshWithDifferentVertices.createTriangle(testTrianglesVerticesId[i], testTrianglesEdgesId[i])); } for (size_t i = 0; i < testTetrahedronsVerticesId.size(); ++i) { EXPECT_EQ(i, meshWithDifferentVertices.createTetrahedron(testTetrahedronsVerticesId[i], \ testTetrahedronsEdgesId[i], testTetrahedronsTrianglesId[i])); } /// Create mesh with test data, but reverse each edge's vertex order to make them different MockTetrahedronMesh meshWithDifferentEdges; for (size_t i = 0; i < testPositions.size(); ++i) { EXPECT_EQ(i, meshWithDifferentEdges.createVertex(testPositions[i], testNormals[i])); } for (size_t i = 0; i < testEdgesVerticesId.size(); ++i) { std::array edge = {{ testEdgesVerticesId[i][1], testEdgesVerticesId[i][0] }}; EXPECT_EQ(i, meshWithDifferentEdges.createEdge(edge)); } for (size_t i = 0; i < testTrianglesVerticesId.size(); ++i) { EXPECT_EQ(i, meshWithDifferentEdges.createTriangle(testTrianglesVerticesId[i], testTrianglesEdgesId[i])); } for (size_t i = 0; i < testTetrahedronsVerticesId.size(); ++i) { EXPECT_EQ(i, meshWithDifferentEdges.createTetrahedron(testTetrahedronsVerticesId[i], \ testTetrahedronsEdgesId[i], testTetrahedronsTrianglesId[i])); } /// Create mesh with test data, but only create half of the triangles to make the list different. MockTetrahedronMesh meshWithDifferentTriangles; for (size_t i = 0; i < testPositions.size(); ++i) { EXPECT_EQ(i, meshWithDifferentTriangles.createVertex(testPositions[i], testNormals[i])); } for (size_t i = 0; i < testEdgesVerticesId.size(); ++i) { EXPECT_EQ(i, meshWithDifferentTriangles.createEdge(testEdgesVerticesId[i])); } for (size_t i = 0; i < testTrianglesVerticesId.size() / 2; ++i) { EXPECT_EQ(i, meshWithDifferentTriangles.createTriangle(testTrianglesVerticesId[i], testTrianglesEdgesId[i])); } for (size_t i = 0; i < testTetrahedronsVerticesId.size(); ++i) { EXPECT_EQ(i, meshWithDifferentTriangles.createTetrahedron(testTetrahedronsVerticesId[i], \ testTetrahedronsEdgesId[i], testTetrahedronsTrianglesId[i])); } /// Test comparisons EXPECT_TRUE(mesh == sameMesh); EXPECT_FALSE(mesh != sameMesh); EXPECT_FALSE(mesh == meshWithDifferentVertices); EXPECT_TRUE(mesh != meshWithDifferentVertices); EXPECT_FALSE(mesh == meshWithDifferentEdges); EXPECT_TRUE(mesh != meshWithDifferentEdges); EXPECT_FALSE(mesh == meshWithDifferentTriangles); EXPECT_TRUE(mesh != meshWithDifferentTriangles); } opensurgsim-0.7.0/SurgSim/DataStructures/UnitTests/TriangleMeshTest.cpp000066400000000000000000000566231277777236100263660ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the Mesh class. #include #include #include "SurgSim/DataStructures/EmptyData.h" #include "SurgSim/DataStructures/MeshElement.h" #include "SurgSim/DataStructures/TriangleMesh.h" #include "SurgSim/DataStructures/UnitTests/MockObjects.h" #include "SurgSim/DataStructures/Vertex.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Framework/ApplicationData.h" using SurgSim::DataStructures::EmptyData; using SurgSim::DataStructures::TriangleMesh; using SurgSim::DataStructures::TriangleMeshPlain; using SurgSim::Math::Vector3d; /// Triangle Mesh for testing using MockVertexData, MockEdgeData, and MockTriangleData class MockTriangleMesh : public SurgSim::DataStructures::TriangleMesh { public: /// Vertex type for convenience typedef TriangleMesh::VertexType VertexType; /// Edge type for convenience typedef TriangleMesh::EdgeType EdgeType; /// Triangle type for convenience typedef TriangleMesh::TriangleType TriangleType; /// Constructor. Start out with no vertices and 0 updates MockTriangleMesh() : SurgSim::DataStructures::TriangleMesh(), m_numUpdates(0) { } SURGSIM_CLASSNAME(MockTriangleMesh); /// Destructor virtual ~MockTriangleMesh() { } /// Create a new vertex in the mesh /// \param position Position of the vertex /// \param normal Normal of the vertex /// \return Unique ID of vertex in the mesh size_t createVertex(const SurgSim::Math::Vector3d& position, const SurgSim::Math::Vector3d& normal) { VertexType vertex(position, MockVertexData(getNumVertices(), normal)); return addVertex(vertex); } /// Create a new edge in the mesh /// \param vertices Edge vertices /// \return Unique ID of vertex in the mesh size_t createEdge(const std::array& vertices) { EdgeType edge(vertices, MockEdgeData(getNumEdges())); return addEdge(edge); } /// Create a new triangle in the mesh /// \param vertices The triangle vertices /// \param edges The triangle edges /// \return Unique ID of vertex in the mesh size_t createTriangle(const std::array& vertices, const std::array& edges) { TriangleType triangle(vertices, MockTriangleData(getNumTriangles(), edges)); return addTriangle(triangle); } /// Returns the normal of a vertex const SurgSim::Math::Vector3d& getVertexNormal(size_t id) const { return getVertex(id).data.getNormal(); } /// Returns the number of updates performed on the mesh int getNumUpdates() const { return m_numUpdates; } private: /// Provides update functionality, which just increments the number of updates bool doUpdate() override { ++m_numUpdates; return true; } /// Number of updates performed on the mesh int m_numUpdates; }; template<> std::string SurgSim::DataStructures::TriangleMesh ::m_className = "MockTriangleMesh"; class TriangleMeshTest : public ::testing::Test { public: void SetUp() { // Set to true to print the test positions. bool printPositions = false; // Set to true to print the test normals. bool printNormals = false; // Set to true to print the test triangles. bool printTriangles = false; // Set to true to print the test edges. bool printEdges = false; // Set the number of test vertices size_t numVertices = 10; // Set the number of test triangles size_t numTriangles = 20; std::default_random_engine generator; std::uniform_real_distribution positionDistribution(-10.0, 10.0); std::uniform_real_distribution normalDistribution(-1.0, 1.0); std::uniform_int_distribution vertexIdDistribution(0, numVertices - 1); if (printPositions) { std::cout << "Test Vertex Positions:\n"; } /// Generate random positions for each vertex for (size_t i = 0; i < numVertices; ++i) { Vector3d position(positionDistribution(generator), positionDistribution(generator), positionDistribution(generator)); testPositions.push_back(position); if (printPositions) { std::cout << "\t" << i << ": (" << position.x() << ", " << position.y() << ", " << position.z() << ")\n"; } } if (printNormals) { std::cout << "Test Vertex Normals:\n"; } /// Generate random normals for each vertex for (size_t i = 0; i < numVertices; ++i) { Vector3d normal(normalDistribution(generator), normalDistribution(generator), normalDistribution(generator)); normal.normalize(); testNormals.push_back(normal); if (printNormals) { std::cout << "\t" << i << ": (" << normal.x() << ", " << normal.y() << ", " << normal.z() << ")\n"; } } if (printTriangles) { std::cout << "Test Triangles:\n"; } /// Generate random vertex IDs within [0, numVertices) in triplets for mesh triangles for (size_t i = 0; i < numTriangles; ++i) { std::array triangleVertices = {{ vertexIdDistribution(generator), vertexIdDistribution(generator), vertexIdDistribution(generator) } }; testTriangleVertices.push_back(triangleVertices); /// Create 3 vertex ID pairs for each triangle edge (not worrying about duplicates for these tests) std::array triangleEdges; for (int j = 0; j < 3; ++j) { std::array edgeVertices = {{ triangleVertices[0], triangleVertices[1] }}; testEdgeVertices.push_back(edgeVertices); triangleEdges[j] = testEdgeVertices.size() - 1; } testTriangleEdges.push_back(triangleEdges); if (printTriangles) { std::cout << "\t" << i << ": Vertices (" << formatIterator(triangleVertices, ", ") << "), Edges (" << formatIterator(triangleEdges, ", ") << ")\n"; } } if (printEdges) { std::cout << "Test Edges:\n"; for (size_t i = 0; i < testEdgeVertices.size(); ++i) { const std::array& edgeVertices = testEdgeVertices[i]; std::cout << "\t" << i << ": (" << formatIterator(edgeVertices, ", ") << ")\n"; } } } void TearDown() { } /// Positions of test vertices std::vector testPositions; /// Normals of test vertices std::vector testNormals; /// Vertices of test edges std::vector> testEdgeVertices; /// Vertices of test triangles std::vector> testTriangleVertices; /// Edges of test triangles std::vector> testTriangleEdges; }; TEST_F(TriangleMeshTest, InitTest) { ASSERT_NO_THROW({MockTriangleMesh mesh;}); ASSERT_NO_THROW({TriangleMeshPlain mesh;}); } TEST_F(TriangleMeshTest, CreateVerticesTest) { MockTriangleMesh mesh; EXPECT_EQ(0u, mesh.getNumVertices()); EXPECT_EQ(0u, mesh.getVertices().size()); /// Create the test vertices for (size_t i = 0; i < testPositions.size(); ++i) { EXPECT_EQ(i, mesh.createVertex(testPositions[i], testNormals[i])); EXPECT_EQ(i + 1, mesh.getNumVertices()); const std::vector& vertices = mesh.getVertices(); EXPECT_EQ(i + 1, vertices.size()); /// Make sure each vertex is set properly for (size_t j = 0; j < mesh.getNumVertices(); ++j) { EXPECT_EQ(testPositions[j], vertices[j].position); const MockVertexData& data = vertices[j].data; EXPECT_EQ(j, data.getId()); EXPECT_EQ(testNormals[j], data.getNormal()); } } /// Create the test edges for (size_t i = 0; i < testEdgeVertices.size(); ++i) { EXPECT_EQ(i, mesh.createEdge(testEdgeVertices[i])); EXPECT_EQ(i + 1, mesh.getNumEdges()); const std::vector& edges = mesh.getEdges(); EXPECT_EQ(i + 1, edges.size()); /// Make sure each vertex is set properly for (size_t j = 0; j < mesh.getNumEdges(); ++j) { EXPECT_EQ(testEdgeVertices[j], edges[j].verticesId); const MockEdgeData& data = edges[j].data; EXPECT_EQ(j, data.getId()); } } /// Create the test triangles for (size_t i = 0; i < testTriangleVertices.size(); ++i) { EXPECT_EQ(i, mesh.createTriangle(testTriangleVertices[i], testTriangleEdges[i])); EXPECT_EQ(i + 1, mesh.getNumTriangles()); const std::vector& triangles = mesh.getTriangles(); EXPECT_EQ(i + 1, triangles.size()); /// Make sure each vertex is set properly for (size_t j = 0; j < mesh.getNumTriangles(); ++j) { EXPECT_EQ(testTriangleVertices[j], triangles[j].verticesId); const MockTriangleData& data = triangles[j].data; EXPECT_EQ(j, data.getId()); EXPECT_EQ(testTriangleEdges[j], data.getEdges()); } } } TEST_F(TriangleMeshTest, isValidTest) { MockTriangleMesh mesh; EXPECT_TRUE(mesh.isValid()); /// Create the edges (no vertices yet => the mesh is NOT valid) for (size_t i = 0; i < testEdgeVertices.size(); ++i) { mesh.createEdge(testEdgeVertices[i]); } EXPECT_FALSE(mesh.isValid()); /// Create the triangles (no vertices yet => the mesh is NOT valid) for (size_t i = 0; i < testTriangleVertices.size(); ++i) { mesh.createTriangle(testTriangleVertices[i], testTriangleEdges[i]); } EXPECT_FALSE(mesh.isValid()); /// Create the vertices for (size_t i = 0; i < testPositions.size(); ++i) { mesh.createVertex(testPositions[i], testNormals[i]); } EXPECT_TRUE(mesh.isValid()); } TEST_F(TriangleMeshTest, SetVertexPositionsTest) { MockTriangleMesh mesh; /// Create vertices with test normals, but all positions at (0,0,0) for (size_t i = 0; i < testPositions.size(); ++i) { EXPECT_EQ(i, mesh.createVertex(Vector3d(0.0, 0.0, 0.0), testNormals[i])); EXPECT_EQ(i + 1, mesh.getNumVertices()); } mesh.setVertexPositions(testPositions); EXPECT_EQ(1, mesh.getNumUpdates()); EXPECT_EQ(testPositions.size(), mesh.getNumVertices()); const std::vector& vertices = mesh.getVertices(); EXPECT_EQ(testPositions.size(), vertices.size()); /// Make sure each vertex is set properly for (size_t i = 0; i < mesh.getNumVertices(); ++i) { EXPECT_EQ(testPositions[i], vertices[i].position); const MockVertexData& data = vertices[i].data; EXPECT_EQ(testNormals[i], data.getNormal()); } mesh.setVertexPositions(testPositions, false); EXPECT_EQ(1, mesh.getNumUpdates()); EXPECT_EQ(testPositions.size(), mesh.getNumVertices()); EXPECT_EQ(testPositions.size(), mesh.getVertices().size()); mesh.setVertexPositions(testPositions, true); EXPECT_EQ(2, mesh.getNumUpdates()); EXPECT_EQ(testPositions.size(), mesh.getNumVertices()); EXPECT_EQ(testPositions.size(), mesh.getVertices().size()); /// Test the individual set/get methods mesh.setVertexPosition(5, Vector3d(0.0, 0.0, 0.0)); /// Make sure each vertex is set properly for (size_t i = 0; i < mesh.getNumVertices(); ++i) { if (i == 5) { EXPECT_EQ(Vector3d(0.0, 0.0, 0.0), mesh.getVertexPosition(i)); EXPECT_EQ(testNormals[i], mesh.getVertexNormal(i)); } else { EXPECT_EQ(testPositions[i], mesh.getVertexPosition(i)); EXPECT_EQ(testNormals[i], mesh.getVertexNormal(i)); } } /// Try setting with wrong number of vertices mesh.createVertex(Vector3d(0.0, 0.0, 0.0), Vector3d(0.0, 0.0, 0.0)); // create one more vertex EXPECT_THROW(mesh.setVertexPositions(testPositions), SurgSim::Framework::AssertionFailure); } TEST_F(TriangleMeshTest, ClearTest) { MockTriangleMesh mesh; EXPECT_EQ(0, mesh.getNumUpdates()); EXPECT_EQ(0u, mesh.getNumVertices()); EXPECT_EQ(0u, mesh.getVertices().size()); EXPECT_EQ(0u, mesh.getNumEdges()); EXPECT_EQ(0u, mesh.getEdges().size()); EXPECT_EQ(0u, mesh.getNumTriangles()); EXPECT_EQ(0u, mesh.getTriangles().size()); /// Create mesh using test data for (size_t i = 0; i < testPositions.size(); ++i) { EXPECT_EQ(i, mesh.createVertex(Vector3d(0.0, 0.0, 0.0), Vector3d(0.0, 0.0, 0.0))); EXPECT_EQ(i + 1, mesh.getNumVertices()); } for (size_t i = 0; i < testEdgeVertices.size(); ++i) { EXPECT_EQ(i, mesh.createEdge(testEdgeVertices[i])); EXPECT_EQ(i + 1, mesh.getNumEdges()); } for (size_t i = 0; i < testTriangleVertices.size(); ++i) { EXPECT_EQ(i, mesh.createTriangle(testTriangleVertices[i], testTriangleEdges[i])); EXPECT_EQ(i + 1, mesh.getNumTriangles()); } EXPECT_EQ(testPositions.size(), mesh.getNumVertices()); EXPECT_EQ(testPositions.size(), mesh.getVertices().size()); EXPECT_EQ(testEdgeVertices.size(), mesh.getNumEdges()); EXPECT_EQ(testEdgeVertices.size(), mesh.getEdges().size()); EXPECT_EQ(testTriangleVertices.size(), mesh.getNumTriangles()); EXPECT_EQ(testTriangleVertices.size(), mesh.getTriangles().size()); /// Clear mesh mesh.clear(); EXPECT_EQ(0u, mesh.getNumVertices()); EXPECT_EQ(0u, mesh.getVertices().size()); EXPECT_EQ(0u, mesh.getNumEdges()); EXPECT_EQ(0u, mesh.getEdges().size()); EXPECT_EQ(0u, mesh.getNumTriangles()); EXPECT_EQ(0u, mesh.getTriangles().size()); } TEST_F(TriangleMeshTest, UpdateTest) { MockTriangleMesh mesh; EXPECT_EQ(0, mesh.getNumUpdates()); for (int i = 0; i < 10; ++i) { mesh.update(); EXPECT_EQ(i + 1, mesh.getNumUpdates()); } } TEST_F(TriangleMeshTest, ComparisonTest) { /// Create mesh using test data MockTriangleMesh mesh; for (size_t i = 0; i < testPositions.size(); ++i) { EXPECT_EQ(i, mesh.createVertex(testPositions[i], testNormals[i])); } for (size_t i = 0; i < testEdgeVertices.size(); ++i) { EXPECT_EQ(i, mesh.createEdge(testEdgeVertices[i])); } for (size_t i = 0; i < testTriangleVertices.size(); ++i) { EXPECT_EQ(i, mesh.createTriangle(testTriangleVertices[i], testTriangleEdges[i])); } /// Create same mesh again MockTriangleMesh sameMesh; for (size_t i = 0; i < testPositions.size(); ++i) { EXPECT_EQ(i, sameMesh.createVertex(testPositions[i], testNormals[i])); } for (size_t i = 0; i < testEdgeVertices.size(); ++i) { EXPECT_EQ(i, sameMesh.createEdge(testEdgeVertices[i])); } for (size_t i = 0; i < testTriangleVertices.size(); ++i) { EXPECT_EQ(i, sameMesh.createTriangle(testTriangleVertices[i], testTriangleEdges[i])); } /// Create mesh with test data, but each vertex has position and normal of (0,0,0) to make them different MockTriangleMesh meshWithDifferentVertices; for (size_t i = 0; i < testPositions.size(); ++i) { EXPECT_EQ(i, meshWithDifferentVertices.createVertex(Vector3d(0.0, 0.0, 0.0), Vector3d(0.0, 0.0, 0.0))); } for (size_t i = 0; i < testEdgeVertices.size(); ++i) { EXPECT_EQ(i, meshWithDifferentVertices.createEdge(testEdgeVertices[i])); } for (size_t i = 0; i < testTriangleVertices.size(); ++i) { EXPECT_EQ(i, meshWithDifferentVertices.createTriangle(testTriangleVertices[i], testTriangleEdges[i])); } /// Create mesh with test data, but reverse each edge's vertex order to make them different MockTriangleMesh meshWithDifferentEdges; for (size_t i = 0; i < testPositions.size(); ++i) { EXPECT_EQ(i, meshWithDifferentEdges.createVertex(testPositions[i], testNormals[i])); } for (size_t i = 0; i < testEdgeVertices.size(); ++i) { std::array edge = {{ testEdgeVertices[i][1], testEdgeVertices[i][0] }}; EXPECT_EQ(i, meshWithDifferentEdges.createEdge(edge)); } for (size_t i = 0; i < testTriangleVertices.size(); ++i) { EXPECT_EQ(i, meshWithDifferentEdges.createTriangle(testTriangleVertices[i], testTriangleEdges[i])); } /// Create mesh with test data, but only create half of the triangles to make the list different. MockTriangleMesh meshWithDifferentTriangles; for (size_t i = 0; i < testPositions.size(); ++i) { EXPECT_EQ(i, meshWithDifferentTriangles.createVertex(testPositions[i], testNormals[i])); } for (size_t i = 0; i < testEdgeVertices.size(); ++i) { EXPECT_EQ(i, meshWithDifferentTriangles.createEdge(testEdgeVertices[i])); } for (size_t i = 0; i < testTriangleVertices.size() / 2; ++i) { EXPECT_EQ(i, meshWithDifferentTriangles.createTriangle(testTriangleVertices[i], testTriangleEdges[i])); } /// Test comparisons EXPECT_TRUE(mesh == sameMesh); EXPECT_FALSE(mesh != sameMesh); EXPECT_FALSE(mesh == meshWithDifferentVertices); EXPECT_TRUE(mesh != meshWithDifferentVertices); EXPECT_FALSE(mesh == meshWithDifferentEdges); EXPECT_TRUE(mesh != meshWithDifferentEdges); EXPECT_FALSE(mesh == meshWithDifferentTriangles); EXPECT_TRUE(mesh != meshWithDifferentTriangles); } TEST_F(TriangleMeshTest, CopyConstructorTest) { MockTriangleMesh mesh; /// Create mesh using test data for (size_t i = 0; i < testPositions.size(); ++i) { EXPECT_EQ(i, mesh.createVertex(Vector3d(0.0, 0.0, 0.0), Vector3d(0.0, 0.0, 0.0))); EXPECT_EQ(i + 1, mesh.getNumVertices()); } for (size_t i = 0; i < testEdgeVertices.size(); ++i) { EXPECT_EQ(i, mesh.createEdge(testEdgeVertices[i])); EXPECT_EQ(i + 1, mesh.getNumEdges()); } for (size_t i = 0; i < testTriangleVertices.size(); ++i) { EXPECT_EQ(i, mesh.createTriangle(testTriangleVertices[i], testTriangleEdges[i])); EXPECT_EQ(i + 1, mesh.getNumTriangles()); } SurgSim::DataStructures::TriangleMeshPlain mesh2(mesh); for (size_t i = 0; i < mesh.getNumVertices(); ++i) { EXPECT_EQ(mesh.getVertexPosition(i), mesh2.getVertexPosition(i)); } for (size_t i = 0; i < mesh.getNumEdges(); ++i) { EXPECT_EQ(mesh.getEdge(i).verticesId, mesh2.getEdge(i).verticesId); } for (size_t i = 0; i < mesh.getNumTriangles(); ++i) { EXPECT_EQ(mesh.getTriangle(i).verticesId, mesh2.getTriangle(i).verticesId); } } TEST_F(TriangleMeshTest, LoadTest) { auto runtime = std::make_shared("config.txt"); { SCOPED_TRACE("Load nonexistent file should throw"); auto mesh = std::make_shared(); EXPECT_THROW(mesh->load("Nonexistent file"), SurgSim::Framework::AssertionFailure); } { SCOPED_TRACE("Load existent file which contains invalid mesh should throw"); auto mesh = std::make_shared(); EXPECT_THROW(mesh->load("Geometry/InvalidMesh.ply"), SurgSim::Framework::AssertionFailure); } { SCOPED_TRACE("Load existent file which contains valid mesh should not throw"); auto mesh = std::make_shared(); EXPECT_NO_THROW(mesh->load("Geometry/staple_collision.ply")); } { SCOPED_TRACE("Load Cube.ply and check mesh"); auto mesh = std::make_shared(); mesh->load("Geometry/Cube.ply"); ASSERT_NO_THROW(mesh->load("Geometry/Cube.ply")); EXPECT_EQ(26u, mesh->getNumVertices()); EXPECT_EQ(12u, mesh->getNumTriangles()); // The first and last vertices from the file Vector3d vertex0(1.0, 1.0, -1.0); Vector3d vertex25(-1.0, -1.0, 1.0); EXPECT_TRUE(vertex0.isApprox(mesh->getVertex(0).position)); EXPECT_TRUE(vertex25.isApprox(mesh->getVertex(25).position)); std::array triangle0 = {0, 1, 2}; std::array triangle11 = {10, 25, 11}; EXPECT_EQ(triangle0, mesh->getTriangle(0).verticesId); EXPECT_EQ(triangle11, mesh->getTriangle(11).verticesId); } } TEST_F(TriangleMeshTest, GetTrianglePositions) { MockTriangleMesh mesh; // Initialization auto normal = testNormals.begin(); for (auto position = testPositions.begin(); position != testPositions.end(); ++position) { mesh.createVertex(*position, *normal++); } auto edges = testTriangleEdges.begin(); for (auto vertices = testTriangleVertices.begin(); vertices != testTriangleVertices.end(); ++vertices) { mesh.createTriangle(*vertices, *edges++); } // Testing for (size_t id = 0; id < mesh.getTriangles().size(); ++id) { auto verticesPositions = mesh.getTrianglePositions(id); auto& vertexIds = mesh.getTriangle(id).verticesId; EXPECT_TRUE(mesh.getVertex(vertexIds[0]).position.isApprox(verticesPositions[0])); EXPECT_TRUE(mesh.getVertex(vertexIds[1]).position.isApprox(verticesPositions[1])); EXPECT_TRUE(mesh.getVertex(vertexIds[2]).position.isApprox(verticesPositions[2])); } } TEST_F(TriangleMeshTest, GetEdgePositions) { MockTriangleMesh mesh; // Initialization auto normal = testNormals.begin(); for (auto position = testPositions.begin(); position != testPositions.end(); ++position) { mesh.createVertex(*position, *normal++); } for (auto vertices = testEdgeVertices.begin(); vertices != testEdgeVertices.end(); ++vertices) { mesh.createEdge(*vertices); } // Testing for (size_t id = 0; id < mesh.getEdges().size(); ++id) { auto verticesPositions = mesh.getEdgePositions(id); auto& vertexIds = mesh.getEdge(id).verticesId; EXPECT_TRUE(mesh.getVertex(vertexIds[0]).position.isApprox(verticesPositions[0])); EXPECT_TRUE(mesh.getVertex(vertexIds[1]).position.isApprox(verticesPositions[1])); } } TEST_F(TriangleMeshTest, TriangleDeletionTest) { typedef TriangleMeshPlain::VertexType VertexType; typedef TriangleMeshPlain::TriangleType TriangleType; TriangleMeshPlain mesh; mesh.addVertex(VertexType(testPositions[0])); mesh.addVertex(VertexType(testPositions[0])); mesh.addVertex(VertexType(testPositions[0])); TriangleType::IdType ids = {0, 1, 2}; mesh.addTriangle(TriangleType(ids)); mesh.addTriangle(TriangleType(ids)); mesh.addTriangle(TriangleType(ids)); EXPECT_TRUE(mesh.isValid()); EXPECT_NO_THROW(mesh.removeTriangle(1)); EXPECT_TRUE(mesh.isValid()); // Basic checks EXPECT_EQ(2u, mesh.getNumTriangles()); EXPECT_THROW(mesh.getTriangle(1), SurgSim::Framework::AssertionFailure); EXPECT_EQ(3u, mesh.getTriangles().size()); // Should be able to remove the same triangle twice EXPECT_NO_THROW(mesh.removeTriangle(1)); // Remove all other triangles to check boundary conditions mesh.removeTriangle(0); EXPECT_EQ(1u, mesh.getNumTriangles()); mesh.removeTriangle(2); EXPECT_EQ(0u, mesh.getNumTriangles()); EXPECT_EQ(3u, mesh.getTriangles().size()); // Adding a new triangle we should get an id from the old ids EXPECT_GT(3u, mesh.addTriangle(TriangleType(ids))); EXPECT_EQ(1u, mesh.getNumTriangles()); // The array size should not have been change EXPECT_EQ(3u, mesh.getTriangles().size()); EXPECT_GT(3u, mesh.addTriangle(TriangleType(ids))); EXPECT_GT(3u, mesh.addTriangle(TriangleType(ids))); // That is a new triangle EXPECT_EQ(3u, mesh.addTriangle(TriangleType(ids))); EXPECT_EQ(4u, mesh.getNumTriangles()); EXPECT_EQ(4u, mesh.getTriangles().size()); // Test clear with deleted triangles mesh.removeTriangle(3); EXPECT_NO_THROW(mesh.clear()); EXPECT_EQ(0u, mesh.getNumTriangles()); EXPECT_EQ(0u, mesh.addTriangle(TriangleType(ids))); EXPECT_EQ(1u, mesh.addTriangle(TriangleType(ids))); } TEST_F(TriangleMeshTest, Save) { std::vector paths; paths.push_back("."); SurgSim::Framework::ApplicationData data(paths); /// Create mesh using test data TriangleMeshPlain mesh; for (size_t i = 0; i < testPositions.size(); ++i) { mesh.addVertex(TriangleMeshPlain::VertexType(testPositions[i])); } for (size_t i = 0; i < testTriangleVertices.size(); ++i) { mesh.addTriangle(TriangleMeshPlain::TriangleType(testTriangleVertices[i])); } ASSERT_NO_THROW(mesh.save("test.ply")); auto loadedMesh = std::make_shared(); ASSERT_NO_THROW(loadedMesh->load("test.ply", data)); EXPECT_EQ(testPositions.size(), loadedMesh->getNumVertices()); EXPECT_EQ(testTriangleVertices.size(), loadedMesh->getNumTriangles()); } opensurgsim-0.7.0/SurgSim/DataStructures/UnitTests/config.txt.in000066400000000000000000000001201277777236100250300ustar00rootroot00000000000000${CMAKE_CURRENT_BINARY_DIR}/Data/ ${PROJECT_BINARY_DIR}/SurgSim/Testing/Data/ opensurgsim-0.7.0/SurgSim/DataStructures/Vertex.h000066400000000000000000000102711277777236100221110ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DATASTRUCTURES_VERTEX_H #define SURGSIM_DATASTRUCTURES_VERTEX_H #include "SurgSim/Math/Vector.h" #include namespace SurgSim { namespace DataStructures { /// Vertex structure for meshes. Vertices are the lowest level of structure in a Mesh, providing a position and can /// store extra per-vertex data. MeshElements combine MeshVertices to form the structure of the mesh. /// /// Vertex is to be used purely as a data structure and not provide implementation of algorithms. /// For example, a physics FEM's nodes are not subclasses of Vertex if they provide code that is part of the FEM /// algorithm, but they may used with a Mesh to store the structure of the FEM. /// /// The extra Data is left up to the particular use of Mesh to specify. For example, for use collision detection, /// a vertex may need a normal and adjacent triangle information, which could be stored in a struct. /// /// If no extra Data is needed, a specialization exists for void, in which case the constructor takes no data. /// /// \tparam Data Type of extra data stored in the vertex (void for no data) /// \sa Vertices template struct Vertex { /// Constructor Vertex() { } /// Constructor /// \param position Position of the vertex /// \param data Extra data to be stored in the vertex explicit Vertex(const SurgSim::Math::Vector3d& position, const Data& data = Data()) : position(position), data(data) { } /// Copy constructor when the template data is a different type /// In this case, no data will be copied /// \tparam T type of data stored in the other Vertex /// \param other the Vertex to copy from template explicit Vertex(const Vertex& other) : position(other.position) { } /// Assignment when the template data is a different type /// In this case, no data will be copied /// \tparam T type of data stored in the other Vertex /// \param other the Vertex to copy from template Vertex& operator=(const Vertex& other) { position = other.position; return *this; } /// Position of the vertex. SurgSim::Math::Vector3d position; /// Extra vertex data. Data data; /// Compare the vertex to another one (equality) /// \param vertex The Vertex to compare it to /// \return True if the two vertices are equal, false otherwise. bool operator==(const Vertex& vertex) const { return data == vertex.data && position == vertex.position; } /// Compare the vertex to another one (inequality) /// \param vertex The Vertex to compare it to /// \return False if the two vertices are equal, true otherwise. bool operator!=(const Vertex& vertex) const { return ! ((*this) == vertex); } }; /// Specialization of Vertex with no data. /// \sa Vertex template <> struct Vertex { /// Constructor /// \param position Position of the vertex explicit Vertex(const SurgSim::Math::Vector3d& position) : position(position) { } /// Position of the vertex. SurgSim::Math::Vector3d position; /// Compare the vertex to another one (equality) /// \param vertex The Vertex to compare it to /// \return True if the two vertices are equal, false otherwise. bool operator==(const Vertex& vertex) const { return position == vertex.position; } /// Compare the vertex to another one (inequality) /// \param vertex The Vertex to compare it to /// \return False if the two vertices are equal, true otherwise. bool operator!=(const Vertex& vertex) const { return ! ((*this) == vertex); } }; }; // namespace DataStructures }; // namespace SurgSim #endif // SURGSIM_DATASTRUCTURES_VERTEX_H opensurgsim-0.7.0/SurgSim/DataStructures/Vertices-inl.h000066400000000000000000000107441277777236100232050ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DATASTRUCTURES_VERTICES_INL_H #define SURGSIM_DATASTRUCTURES_VERTICES_INL_H #include #include "SurgSim/Framework/Assert.h" namespace SurgSim { namespace DataStructures { template Vertices::Vertices() { } template template Vertices::Vertices(const Vertices& other) { m_vertices.reserve(other.getVertices().size()); for (auto& otherVertex : other.getVertices()) { addVertex(VertexType(otherVertex)); } } template template Vertices& Vertices::operator=(const Vertices& other) { auto& otherVertices = other.getVertices(); if (otherVertices.size() < m_vertices.size()) { m_vertices.resize(otherVertices.size()); } else { m_vertices.reserve(otherVertices.size()); } auto vertex = m_vertices.begin(); auto otherVertex = otherVertices.begin(); for (; vertex != m_vertices.end(); ++vertex, ++otherVertex) { *vertex = *otherVertex; } for (; otherVertex != otherVertices.end(); ++otherVertex) { addVertex(VertexType(*otherVertex)); } return *this; } template Vertices::~Vertices() { } template void Vertices::clear() { doClear(); } template bool Vertices::update() { return doUpdate(); } template size_t Vertices::addVertex(const VertexType& vertex) { m_vertices.push_back(vertex); return m_vertices.size() - 1; } template size_t Vertices::getNumVertices() const { return m_vertices.size(); } template const typename Vertices::VertexType& Vertices::getVertex(size_t id) const { return m_vertices[id]; } template typename Vertices::VertexType& Vertices::getVertex(size_t id) { return m_vertices[id]; } template const std::vector::VertexType>& Vertices::getVertices() const { return m_vertices; } template std::vector::VertexType>& Vertices::getVertices() { return m_vertices; } template void Vertices::setVertexPosition(size_t id, const SurgSim::Math::Vector3d& position) { m_vertices[id].position = position; } template const SurgSim::Math::Vector3d& Vertices::getVertexPosition(size_t id) const { return m_vertices[id].position; } template void Vertices::setVertexPositions(const std::vector& positions, bool doUpdate) { SURGSIM_ASSERT(m_vertices.size() == positions.size()) << "Number of positions must match number of vertices."; for (size_t i = 0; i < m_vertices.size(); ++i) { m_vertices[i].position = positions[i]; } if (doUpdate) { update(); } } template void Vertices::transform(const Math::RigidTransform3d& pose) { for (auto& vertex : m_vertices) { vertex.position = pose * vertex.position; } } template bool Vertices::operator==(const Vertices& mesh) const { return (typeid(*this) == typeid(mesh)) && isEqual(mesh); } template bool Vertices::operator!=(const Vertices& mesh) const { return (typeid(*this) != typeid(mesh)) || ! isEqual(mesh); } template void Vertices::doClearVertices() { m_vertices.clear(); } template bool Vertices::isEqual(const Vertices& mesh) const { return m_vertices == mesh.m_vertices; } template void Vertices::doClear() { doClearVertices(); } template bool Vertices::doUpdate() { return true; } }; }; #endif //SURGSIM_DATASTRUCTURES_VERTICES_INL_H opensurgsim-0.7.0/SurgSim/DataStructures/Vertices.h000066400000000000000000000142701277777236100224230ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DATASTRUCTURES_VERTICES_H #define SURGSIM_DATASTRUCTURES_VERTICES_H #include #include "SurgSim/DataStructures/EmptyData.h" #include "SurgSim/DataStructures/Vertex.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Vector.h" namespace SurgSim { namespace DataStructures { /// Base class for mesh structures, handling basic vertex functionality. /// /// Vertices is to be used purely as a data structure and not provide implementation of algorithms. /// For example, a physics FEM is not a subclass of Vertices, but may use a Mesh for storing the structure of the FEM. /// /// Subclasses of this class should handle the elements required for a specific type of mesh (as simple as just a /// generic triangle mesh or as specific as a triangle mesh for collision detection, which might also specify the data /// types for the vertex and elements). /// /// It is recommended that subclasses of this class also provide convenience methods for creation of vertices and /// elements, and the data each contains. A method such as createVertex(position, other data...) simplifies the creation /// of vertices and the data required. This method would use the addVertex() method to add the created vertices to the /// Mesh. /// /// \tparam VertexData Type of extra data stored in each vertex (void for no data) /// \sa Vertex /// \sa MeshElement template class Vertices { public: /// Vertex type for convenience typedef Vertex VertexType; /// Constructor Vertices(); /// Copy constructor when the template data is a different type /// In this case, no data will be copied /// \tparam V type of data stored in the other Vertices /// \param other the Vertices to copy from template explicit Vertices(const Vertices& other); /// Assignment when the template data is a different type /// In this case, no data will be copied /// \tparam V type of data stored in the other Vertices /// \param other the Vertices to copy from template Vertices& operator=(const Vertices& other); /// Destructor virtual ~Vertices(); /// Clear mesh to return to an empty state (no vertices). void clear(); /// Performs any updates that are required when the vertices are modified. /// Calls doUpdate() to perform the updates. /// \return true on success. bool update(); /// Adds a vertex to the mesh. /// Recommend that subclasses with a specific purpose (such as for use in collision detection), have a /// createVertex(position, other data...) method which performs any checking desired and sets up the vertex data /// based on the other parameters. /// \param vertex Vertex to add to the mesh /// \return Unique ID of the new vertex. size_t addVertex(const VertexType& vertex); /// Returns the number of vertices in this mesh. size_t getNumVertices() const; /// Returns the specified vertex. const VertexType& getVertex(size_t id) const; /// Returns the specified vertex (non const version). VertexType& getVertex(size_t id); /// Returns a vector containing the position of each vertex. const std::vector& getVertices() const; /// Returns a vector containing the position of each vertex (non const version). std::vector& getVertices(); /// Sets the position of a vertex. /// \param id Unique ID of the vertex /// \param position Position of the vertex void setVertexPosition(size_t id, const SurgSim::Math::Vector3d& position); /// Returns the position of a vertex. /// \param id Unique ID of the vertex /// \return Position of the vertex const SurgSim::Math::Vector3d& getVertexPosition(size_t id) const; /// Sets the position of each vertex. /// \param positions Vector containing new position for each vertex /// \param doUpdate True to perform an update after setting the vertices, false to skip update; default is true. void setVertexPositions(const std::vector& positions, bool doUpdate = true); /// Apply a rigid transform to each vertex /// \param pose the rigid transform to apply void transform(const Math::RigidTransform3d& pose); /// Compares the mesh with another one (equality) /// \param mesh The Vertices to compare it to /// \return True if the two vertices are equals, False otherwise bool operator==(const Vertices& mesh) const; /// Compares the mesh with another one (inequality) /// \param mesh The Vertices to compare it to /// \return False if the two vertices are equals, True otherwise bool operator!=(const Vertices& mesh) const; protected: /// Remove all vertices from the mesh. virtual void doClearVertices(); /// Internal comparison of meshes of the same type: returns true if equal, false if not equal. /// Override this method to provide custom comparison. Base Mesh implementation compares vertices: /// the order of vertices must also match to be considered equal. /// \param mesh Mesh must be of the same type as that which it is compared against virtual bool isEqual(const Vertices& mesh) const; private: /// Clear mesh to return to an empty state (no vertices). virtual void doClear(); /// Performs any updates that are required when the vertices are modified. /// Override this method to implement update functionality. /// For example, this could be overridden to calculate normals for each Vertex. /// \return true on success. virtual bool doUpdate(); /// Vertices std::vector m_vertices; }; typedef Vertices VerticesPlain; }; // namespace DataStructures }; // namespace SurgSim #include "SurgSim/DataStructures/Vertices-inl.h" #endif // SURGSIM_DATASTRUCTURES_VERTICES_H opensurgsim-0.7.0/SurgSim/DataStructures/ply.c000066400000000000000000002133511277777236100214370ustar00rootroot00000000000000/* The interface routines for reading and writing PLY polygon files. Greg Turk, February 1994 --------------------------------------------------------------- A PLY file contains a single polygonal _object_. An object is composed of lists of _elements_. Typical elements are vertices, faces, edges and materials. Each type of element for a given object has one or more _properties_ associated with the element type. For instance, a vertex element may have as properties the floating-point values x,y,z and the three unsigned chars representing red, green and blue. --------------------------------------------------------------- Copyright (c) 1994 The Board of Trustees of The Leland Stanford Junior University. All rights reserved. Permission to use, copy, modify and distribute this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice and this permission notice appear in all copies of this software and that you do not sell the software. THE SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. */ #include #include #include #include #include "SurgSim/DataStructures/ply.h" // HS-2014-apr-03 There are a few warnings from gcc regarding these // in the spirit of changing this file as little as possible we decided // to ignore these. The variables concerned are: // line 1621 'item' // line 1736 'item_size' // line 2378 'item' // line 1717 'other_data' // JL-2014-may-23 Upgrade get_words() to handle Windows line ending properly. // Minimal changes as been made from lines 1843 to 1846 and comment updated on line 1830. #if defined(_MSC_VER) #pragma warning(push) #pragma warning(disable:4996) #elif defined(__GNUC__) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wmaybe-uninitialized" #endif char *type_names[] = { "invalid", "char", "short", "int", "uchar", "ushort", "uint", "float", "double" }; int ply_type_size[] = { 0, sizeof(char), sizeof(short), sizeof(int), sizeof(unsigned char), sizeof(unsigned short), sizeof(unsigned int), sizeof(float), sizeof(double) }; #define NO_OTHER_PROPS -1 #define DONT_STORE_PROP 0 #define STORE_PROP 1 #define OTHER_PROP 0 #define NAMED_PROP 1 /* returns 1 if strings are equal, 0 if not */ int equal_strings(const char *,const char *); /* find an element in a plyfile's list */ PlyElement *find_element(PlyFile *,const char *); /* find a property in an element's list */ PlyProperty *find_property(PlyElement *,const char *, int *); /* write to a file the word describing a PLY file data type */ void write_scalar_type (FILE *, int); /* read a line from a file and break it up into separate words */ char **get_words(FILE *, int *, char **); char **old_get_words(FILE *, int *); /* write an item to a file */ void write_binary_item(FILE *, int, unsigned int, double, int); void write_ascii_item(FILE *, int, unsigned int, double, int); double old_write_ascii_item(FILE *, char *, int); /* add information to a PLY file descriptor */ void add_element(PlyFile *, char **, int); void add_property(PlyFile *, char **, int); void add_comment(PlyFile *, char *); void add_obj_info(PlyFile *, char *); /* copy a property */ void copy_property(PlyProperty *, PlyProperty *); /* store a value into where a pointer and a type specify */ void store_item(char *, int, int, unsigned int, double); /* return the value of a stored item */ void get_stored_item( void *, int, int *, unsigned int *, double *); /* return the value stored in an item, given ptr to it and its type */ double get_item_value(char *, int); /* get binary or ascii item and store it according to ptr and type */ void get_ascii_item(char *, int, int *, unsigned int *, double *); void get_binary_item(FILE *, int, int *, unsigned int *, double *); /* get a bunch of elements from a file */ void ascii_get_element(PlyFile *, char *); void binary_get_element(PlyFile *, char *); // /* memory allocation */ // static char *my_alloc(int, int, char *); /*************/ /* Writing */ /*************/ /****************************************************************************** Given a file pointer, get ready to write PLY data to the file. Entry: fp - the given file pointer nelems - number of elements in object elem_names - list of element names file_type - file type, either ascii or binary Exit: returns a pointer to a PlyFile, used to refer to this file, or NULL if error ******************************************************************************/ PlyFile *ply_write( FILE *fp, int nelems, char **elem_names, int file_type ) { int i; PlyFile *plyfile; PlyElement *elem; /* check for NULL file pointer */ if (fp == NULL) return (NULL); /* create a record for this object */ plyfile = (PlyFile *) myalloc (sizeof (PlyFile)); plyfile->file_type = file_type; plyfile->num_comments = 0; plyfile->num_obj_info = 0; plyfile->nelems = nelems; plyfile->version = 1.0; plyfile->fp = fp; plyfile->other_elems = NULL; /* tuck aside the names of the elements */ plyfile->elems = (PlyElement **) myalloc (sizeof (PlyElement *) * nelems); for (i = 0; i < nelems; i++) { elem = (PlyElement *) myalloc (sizeof (PlyElement)); plyfile->elems[i] = elem; elem->name = strdup (elem_names[i]); elem->num = 0; elem->nprops = 0; } /* return pointer to the file descriptor */ return (plyfile); } /****************************************************************************** Open a polygon file for writing. Entry: filename - name of file to read from nelems - number of elements in object elem_names - list of element names file_type - file type, either ascii or binary Exit: version - version number of PLY file returns a file identifier, used to refer to this file, or NULL if error ******************************************************************************/ PlyFile *ply_open_for_writing( const char *filename, int nelems, char **elem_names, int file_type, float *version ) { PlyFile *plyfile; char *name; FILE *fp; /* tack on the extension .ply, if necessary */ name = (char *) myalloc (sizeof (char) * (strlen (filename) + 5)); strcpy (name, filename); if (strlen (name) < 4 || strcmp (name + strlen (name) - 4, ".ply") != 0) strcat (name, ".ply"); /* open the file for writing */ fp = fopen (name, "w"); if (fp == NULL) { return (NULL); } /* create the actual PlyFile structure */ plyfile = ply_write (fp, nelems, elem_names, file_type); if (plyfile == NULL) return (NULL); /* say what PLY file version number we're writing */ *version = plyfile->version; /* return pointer to the file descriptor */ return (plyfile); } /****************************************************************************** Describe an element, including its properties and how many will be written to the file. Entry: plyfile - file identifier elem_name - name of element that information is being specified about nelems - number of elements of this type to be written nprops - number of properties contained in the element prop_list - list of properties ******************************************************************************/ void ply_describe_element( PlyFile *plyfile, char *elem_name, int nelems, int nprops, PlyProperty *prop_list ) { int i; PlyElement *elem; PlyProperty *prop; /* look for appropriate element */ elem = find_element (plyfile, elem_name); if (elem == NULL) { fprintf(stderr,"ply_describe_element: can't find element '%s'\n",elem_name); exit (-1); } elem->num = nelems; /* copy the list of properties */ elem->nprops = nprops; elem->props = (PlyProperty **) myalloc (sizeof (PlyProperty *) * nprops); elem->store_prop = (char *) myalloc (sizeof (char) * nprops); for (i = 0; i < nprops; i++) { prop = (PlyProperty *) myalloc (sizeof (PlyProperty)); elem->props[i] = prop; elem->store_prop[i] = NAMED_PROP; copy_property (prop, &prop_list[i]); } } /****************************************************************************** Describe a property of an element. Entry: plyfile - file identifier elem_name - name of element that information is being specified about prop - the new property ******************************************************************************/ void ply_describe_property( PlyFile *plyfile, char *elem_name, PlyProperty *prop ) { PlyElement *elem; PlyProperty *elem_prop; /* look for appropriate element */ elem = find_element (plyfile, elem_name); if (elem == NULL) { fprintf(stderr, "ply_describe_property: can't find element '%s'\n", elem_name); return; } /* create room for new property */ if (elem->nprops == 0) { elem->props = (PlyProperty **) myalloc (sizeof (PlyProperty *)); elem->store_prop = (char *) myalloc (sizeof (char)); elem->nprops = 1; } else { elem->nprops++; elem->props = (PlyProperty **) realloc (elem->props, sizeof (PlyProperty *) * elem->nprops); elem->store_prop = (char *) realloc (elem->store_prop, sizeof (char) * elem->nprops); } /* copy the new property */ elem_prop = (PlyProperty *) myalloc (sizeof (PlyProperty)); elem->props[elem->nprops - 1] = elem_prop; elem->store_prop[elem->nprops - 1] = NAMED_PROP; copy_property (elem_prop, prop); } /****************************************************************************** Describe what the "other" properties are that are to be stored, and where they are in an element. ******************************************************************************/ void ply_describe_other_properties( PlyFile *plyfile, PlyOtherProp *other, int offset ) { int i; PlyElement *elem; PlyProperty *prop; /* look for appropriate element */ elem = find_element (plyfile, other->name); if (elem == NULL) { fprintf(stderr, "ply_describe_other_properties: can't find element '%s'\n", other->name); return; } /* create room for other properties */ if (elem->nprops == 0) { elem->props = (PlyProperty **) myalloc (sizeof (PlyProperty *) * other->nprops); elem->store_prop = (char *) myalloc (sizeof (char) * other->nprops); elem->nprops = 0; } else { int newsize; newsize = elem->nprops + other->nprops; elem->props = (PlyProperty **) realloc (elem->props, sizeof (PlyProperty *) * newsize); elem->store_prop = (char *) realloc (elem->store_prop, sizeof (char) * newsize); } /* copy the other properties */ for (i = 0; i < other->nprops; i++) { prop = (PlyProperty *) myalloc (sizeof (PlyProperty)); copy_property (prop, other->props[i]); elem->props[elem->nprops] = prop; elem->store_prop[elem->nprops] = OTHER_PROP; elem->nprops++; } /* save other info about other properties */ elem->other_size = other->size; elem->other_offset = offset; } /****************************************************************************** State how many of a given element will be written. Entry: plyfile - file identifier elem_name - name of element that information is being specified about nelems - number of elements of this type to be written ******************************************************************************/ void ply_element_count( PlyFile *plyfile, char *elem_name, int nelems ) { PlyElement *elem; /* look for appropriate element */ elem = find_element (plyfile, elem_name); if (elem == NULL) { fprintf(stderr,"ply_element_count: can't find element '%s'\n",elem_name); exit (-1); } elem->num = nelems; } /****************************************************************************** Signal that we've described everything a PLY file's header and that the header should be written to the file. Entry: plyfile - file identifier ******************************************************************************/ void ply_header_complete(PlyFile *plyfile) { int i,j; FILE *fp = plyfile->fp; PlyElement *elem; PlyProperty *prop; fprintf (fp, "ply\n"); switch (plyfile->file_type) { case PLY_ASCII: fprintf (fp, "format ascii 1.0\n"); break; case PLY_BINARY_BE: fprintf (fp, "format binary_big_endian 1.0\n"); break; case PLY_BINARY_LE: fprintf (fp, "format binary_little_endian 1.0\n"); break; default: fprintf (stderr, "ply_header_complete: bad file type = %d\n", plyfile->file_type); exit (-1); } /* write out the comments */ for (i = 0; i < plyfile->num_comments; i++) fprintf (fp, "comment %s\n", plyfile->comments[i]); /* write out object information */ for (i = 0; i < plyfile->num_obj_info; i++) fprintf (fp, "obj_info %s\n", plyfile->obj_info[i]); /* write out information about each element */ for (i = 0; i < plyfile->nelems; i++) { elem = plyfile->elems[i]; fprintf (fp, "element %s %d\n", elem->name, elem->num); /* write out each property */ for (j = 0; j < elem->nprops; j++) { prop = elem->props[j]; if (prop->is_list) { fprintf (fp, "property list "); write_scalar_type (fp, prop->count_external); fprintf (fp, " "); write_scalar_type (fp, prop->external_type); fprintf (fp, " %s\n", prop->name); } else { fprintf (fp, "property "); write_scalar_type (fp, prop->external_type); fprintf (fp, " %s\n", prop->name); } } } fprintf (fp, "end_header\n"); } /****************************************************************************** Specify which elements are going to be written. This should be called before a call to the routine ply_put_element(). Entry: plyfile - file identifier elem_name - name of element we're talking about ******************************************************************************/ void ply_put_element_setup(PlyFile *plyfile, char *elem_name) { PlyElement *elem; elem = find_element (plyfile, elem_name); if (elem == NULL) { fprintf(stderr, "ply_elements_setup: can't find element '%s'\n", elem_name); exit (-1); } plyfile->which_elem = elem; } /****************************************************************************** Write an element to the file. This routine assumes that we're writing the type of element specified in the last call to the routine ply_put_element_setup(). Entry: plyfile - file identifier elem_ptr - pointer to the element ******************************************************************************/ void ply_put_element(PlyFile *plyfile, void *elem_ptr) { int j,k; FILE *fp = plyfile->fp; PlyElement *elem; PlyProperty *prop; char *elem_data,*item; char **item_ptr; int list_count; int item_size; int int_val; unsigned int uint_val; double double_val; char **other_ptr; elem = plyfile->which_elem; elem_data = elem_ptr; other_ptr = (char **) (((char *) elem_ptr) + elem->other_offset); /* write out either to an ascii or binary file */ if (plyfile->file_type == PLY_ASCII) { /* write an ascii file */ /* write out each property of the element */ for (j = 0; j < elem->nprops; j++) { prop = elem->props[j]; if (elem->store_prop[j] == OTHER_PROP) elem_data = *other_ptr; else elem_data = elem_ptr; if (prop->is_list) { item = elem_data + prop->count_offset; get_stored_item ((void *) item, prop->count_internal, &int_val, &uint_val, &double_val); write_ascii_item (fp, int_val, uint_val, double_val, prop->count_external); list_count = uint_val; item_ptr = (char **) (elem_data + prop->offset); item = item_ptr[0]; item_size = ply_type_size[prop->internal_type]; for (k = 0; k < list_count; k++) { get_stored_item ((void *) item, prop->internal_type, &int_val, &uint_val, &double_val); write_ascii_item (fp, int_val, uint_val, double_val, prop->external_type); item += item_size; } } else { item = elem_data + prop->offset; get_stored_item ((void *) item, prop->internal_type, &int_val, &uint_val, &double_val); write_ascii_item (fp, int_val, uint_val, double_val, prop->external_type); } } fprintf (fp, "\n"); } else { /* write a binary file */ /* write out each property of the element */ for (j = 0; j < elem->nprops; j++) { prop = elem->props[j]; if (elem->store_prop[j] == OTHER_PROP) elem_data = *other_ptr; else elem_data = elem_ptr; if (prop->is_list) { item = elem_data + prop->count_offset; item_size = ply_type_size[prop->count_internal]; get_stored_item ((void *) item, prop->count_internal, &int_val, &uint_val, &double_val); write_binary_item (fp, int_val, uint_val, double_val, prop->count_external); list_count = uint_val; item_ptr = (char **) (elem_data + prop->offset); item = item_ptr[0]; item_size = ply_type_size[prop->internal_type]; for (k = 0; k < list_count; k++) { get_stored_item ((void *) item, prop->internal_type, &int_val, &uint_val, &double_val); write_binary_item (fp, int_val, uint_val, double_val, prop->external_type); item += item_size; } } else { item = elem_data + prop->offset; item_size = ply_type_size[prop->internal_type]; get_stored_item ((void *) item, prop->internal_type, &int_val, &uint_val, &double_val); write_binary_item (fp, int_val, uint_val, double_val, prop->external_type); } } } } /****************************************************************************** Specify a comment that will be written in the header. Entry: plyfile - file identifier comment - the comment to be written ******************************************************************************/ void ply_put_comment(PlyFile *plyfile, char *comment) { /* (re)allocate space for new comment */ if (plyfile->num_comments == 0) plyfile->comments = (char **) myalloc (sizeof (char *)); else plyfile->comments = (char **) realloc (plyfile->comments, sizeof (char *) * (plyfile->num_comments + 1)); /* add comment to list */ plyfile->comments[plyfile->num_comments] = strdup (comment); plyfile->num_comments++; } /****************************************************************************** Specify a piece of object information (arbitrary text) that will be written in the header. Entry: plyfile - file identifier obj_info - the text information to be written ******************************************************************************/ void ply_put_obj_info(PlyFile *plyfile, char *obj_info) { /* (re)allocate space for new info */ if (plyfile->num_obj_info == 0) plyfile->obj_info = (char **) myalloc (sizeof (char *)); else plyfile->obj_info = (char **) realloc (plyfile->obj_info, sizeof (char *) * (plyfile->num_obj_info + 1)); /* add info to list */ plyfile->obj_info[plyfile->num_obj_info] = strdup (obj_info); plyfile->num_obj_info++; } /*************/ /* Reading */ /*************/ /****************************************************************************** Given a file pointer, get ready to read PLY data from the file. Entry: fp - the given file pointer Exit: nelems - number of elements in object elem_names - list of element names returns a pointer to a PlyFile, used to refer to this file, or NULL if error ******************************************************************************/ PlyFile *ply_read(FILE *fp, int *nelems, char ***elem_names) { int i,j; PlyFile *plyfile; int nwords; char **words; char **elist; PlyElement *elem; char *orig_line; /* check for NULL file pointer */ if (fp == NULL) return (NULL); /* create record for this object */ plyfile = (PlyFile *) myalloc (sizeof (PlyFile)); plyfile->nelems = 0; plyfile->comments = NULL; plyfile->num_comments = 0; plyfile->obj_info = NULL; plyfile->num_obj_info = 0; plyfile->fp = fp; plyfile->other_elems = NULL; /* read and parse the file's header */ words = get_words (plyfile->fp, &nwords, &orig_line); if (!words || !equal_strings (words[0], "ply")) { if (words) free(words); if (plyfile) free(plyfile); return (NULL); } while (words) { /* parse words */ if (equal_strings (words[0], "format")) { if (nwords != 3) { if (words) free(words); if (plyfile) free(plyfile); return (NULL); } if (equal_strings (words[1], "ascii")) plyfile->file_type = PLY_ASCII; else if (equal_strings (words[1], "binary_big_endian")) plyfile->file_type = PLY_BINARY_BE; else if (equal_strings (words[1], "binary_little_endian")) plyfile->file_type = PLY_BINARY_LE; else { if (words) free(words); if (plyfile) free(plyfile); return (NULL); } plyfile->version = (float)atof (words[2]); } else if (equal_strings (words[0], "element")) add_element (plyfile, words, nwords); else if (equal_strings (words[0], "property")) add_property (plyfile, words, nwords); else if (equal_strings (words[0], "comment")) add_comment (plyfile, orig_line); else if (equal_strings (words[0], "obj_info")) add_obj_info (plyfile, orig_line); else if (equal_strings (words[0], "end_header")) { free(words); break; } /* free up words space */ free (words); words = get_words (plyfile->fp, &nwords, &orig_line); } /* create tags for each property of each element, to be used */ /* later to say whether or not to store each property for the user */ for (i = 0; i < plyfile->nelems; i++) { elem = plyfile->elems[i]; elem->store_prop = (char *) myalloc (sizeof (char) * elem->nprops); for (j = 0; j < elem->nprops; j++) elem->store_prop[j] = DONT_STORE_PROP; elem->other_offset = NO_OTHER_PROPS; /* no "other" props by default */ } /* set return values about the elements */ elist = (char **) myalloc (sizeof (char *) * plyfile->nelems); for (i = 0; i < plyfile->nelems; i++) elist[i] = strdup (plyfile->elems[i]->name); *elem_names = elist; *nelems = plyfile->nelems; /* return a pointer to the file's information */ return (plyfile); } /****************************************************************************** Open a polygon file for reading. Entry: filename - name of file to read from Exit: nelems - number of elements in object elem_names - list of element names file_type - file type, either ascii or binary version - version number of PLY file returns a file identifier, used to refer to this file, or NULL if error ******************************************************************************/ PlyFile *ply_open_for_reading( const char *filename, int *nelems, char ***elem_names, int *file_type, float *version ) { FILE *fp; PlyFile *plyfile; /* open the file for reading */ fp = fopen (filename, "r"); if (fp == NULL) return (NULL); /* create the PlyFile data structure */ plyfile = ply_read (fp, nelems, elem_names); /* determine the file type and version */ if (plyfile != NULL) { *file_type = plyfile->file_type; *version = plyfile->version; } /* return a pointer to the file's information */ return (plyfile); } /****************************************************************************** Get information about a particular element. Entry: plyfile - file identifier elem_name - name of element to get information about Exit: nelems - number of elements of this type in the file nprops - number of properties returns a list of properties, or NULL if the file doesn't contain that elem ******************************************************************************/ PlyProperty **ply_get_element_description( PlyFile *plyfile, char *elem_name, int *nelems, int *nprops ) { int i; PlyElement *elem; PlyProperty *prop; PlyProperty **prop_list; /* find information about the element */ elem = find_element (plyfile, elem_name); if (elem == NULL) return (NULL); *nelems = elem->num; *nprops = elem->nprops; /* make a copy of the element's property list */ prop_list = (PlyProperty **) myalloc (sizeof (PlyProperty *) * elem->nprops); for (i = 0; i < elem->nprops; i++) { prop = (PlyProperty *) myalloc (sizeof (PlyProperty)); copy_property (prop, elem->props[i]); prop_list[i] = prop; } /* return this duplicate property list */ return (prop_list); } /****************************************************************************** Specify which properties of an element are to be returned. This should be called before a call to the routine ply_get_element(). Entry: plyfile - file identifier elem_name - which element we're talking about nprops - number of properties prop_list - list of properties ******************************************************************************/ void ply_get_element_setup( PlyFile *plyfile, char *elem_name, int nprops, PlyProperty *prop_list ) { int i; PlyElement *elem; PlyProperty *prop; int index; /* find information about the element */ elem = find_element (plyfile, elem_name); plyfile->which_elem = elem; /* deposit the property information into the element's description */ for (i = 0; i < nprops; i++) { /* look for actual property */ prop = find_property (elem, prop_list[i].name, &index); if (prop == NULL) { fprintf (stderr, "Warning: Can't find property '%s' in element '%s'\n", prop_list[i].name, elem_name); continue; } /* store its description */ prop->internal_type = prop_list[i].internal_type; prop->offset = prop_list[i].offset; prop->count_internal = prop_list[i].count_internal; prop->count_offset = prop_list[i].count_offset; /* specify that the user wants this property */ elem->store_prop[index] = STORE_PROP; } } /****************************************************************************** Specify a property of an element that is to be returned. This should be called (usually multiple times) before a call to the routine ply_get_element(). This routine should be used in preference to the less flexible old routine called ply_get_element_setup(). Entry: plyfile - file identifier elem_name - which element we're talking about prop - property to add to those that will be returned ******************************************************************************/ void ply_get_property( PlyFile *plyfile, char *elem_name, PlyProperty *prop ) { PlyElement *elem; PlyProperty *prop_ptr; int index; /* find information about the element */ elem = find_element (plyfile, elem_name); plyfile->which_elem = elem; /* deposit the property information into the element's description */ prop_ptr = find_property (elem, prop->name, &index); if (prop_ptr == NULL) { fprintf (stderr, "Warning: Can't find property '%s' in element '%s'\n", prop->name, elem_name); return; } prop_ptr->internal_type = prop->internal_type; prop_ptr->offset = prop->offset; prop_ptr->count_internal = prop->count_internal; prop_ptr->count_offset = prop->count_offset; /* specify that the user wants this property */ elem->store_prop[index] = STORE_PROP; } /****************************************************************************** Read one element from the file. This routine assumes that we're reading the type of element specified in the last call to the routine ply_get_element_setup(). Entry: plyfile - file identifier elem_ptr - pointer to location where the element information should be put ******************************************************************************/ void ply_get_element(PlyFile *plyfile, void *elem_ptr) { if (plyfile->file_type == PLY_ASCII) ascii_get_element (plyfile, (char *) elem_ptr); else binary_get_element (plyfile, (char *) elem_ptr); } /****************************************************************************** Extract the comments from the header information of a PLY file. Entry: plyfile - file identifier Exit: num_comments - number of comments returned returns a pointer to a list of comments ******************************************************************************/ char **ply_get_comments(PlyFile *plyfile, int *num_comments) { *num_comments = plyfile->num_comments; return (plyfile->comments); } /****************************************************************************** Extract the object information (arbitrary text) from the header information of a PLY file. Entry: plyfile - file identifier Exit: num_obj_info - number of lines of text information returned returns a pointer to a list of object info lines ******************************************************************************/ char **ply_get_obj_info(PlyFile *plyfile, int *num_obj_info) { *num_obj_info = plyfile->num_obj_info; return (plyfile->obj_info); } /****************************************************************************** Make ready for "other" properties of an element-- those properties that the user has not explicitly asked for, but that are to be stashed away in a special structure to be carried along with the element's other information. Entry: plyfile - file identifier elem - element for which we want to save away other properties ******************************************************************************/ void setup_other_props(PlyFile *plyfile, PlyElement *elem) { int i; PlyProperty *prop; int size = 0; int type_size; /* Examine each property in decreasing order of size. */ /* We do this so that all data types will be aligned by */ /* word, half-word, or whatever within the structure. */ for (type_size = 8; type_size > 0; type_size /= 2) { /* add up the space taken by each property, and save this information */ /* away in the property descriptor */ for (i = 0; i < elem->nprops; i++) { /* don't bother with properties we've been asked to store explicitly */ if (elem->store_prop[i]) continue; prop = elem->props[i]; /* internal types will be same as external */ prop->internal_type = prop->external_type; prop->count_internal = prop->count_external; /* check list case */ if (prop->is_list) { /* pointer to list */ if (type_size == sizeof (void *)) { prop->offset = size; size += sizeof (void *); /* always use size of a pointer here */ } /* count of number of list elements */ if (type_size == ply_type_size[prop->count_external]) { prop->count_offset = size; size += ply_type_size[prop->count_external]; } } /* not list */ else if (type_size == ply_type_size[prop->external_type]) { prop->offset = size; size += ply_type_size[prop->external_type]; } } } /* save the size for the other_props structure */ elem->other_size = size; } /****************************************************************************** Specify that we want the "other" properties of an element to be tucked away within the user's structure. The user needn't be concerned for how these properties are stored. Entry: plyfile - file identifier elem_name - name of element that we want to store other_props in offset - offset to where other_props will be stored inside user's structure Exit: returns pointer to structure containing description of other_props ******************************************************************************/ PlyOtherProp *ply_get_other_properties( PlyFile *plyfile, char *elem_name, int offset ) { int i; PlyElement *elem; PlyOtherProp *other; PlyProperty *prop; int nprops; /* find information about the element */ elem = find_element (plyfile, elem_name); if (elem == NULL) { fprintf (stderr, "ply_get_other_properties: Can't find element '%s'\n", elem_name); return (NULL); } /* remember that this is the "current" element */ plyfile->which_elem = elem; /* save the offset to where to store the other_props */ elem->other_offset = offset; /* place the appropriate pointers, etc. in the element's property list */ setup_other_props (plyfile, elem); /* create structure for describing other_props */ other = (PlyOtherProp *) myalloc (sizeof (PlyOtherProp)); other->name = strdup (elem_name); #if 0 if (elem->other_offset == NO_OTHER_PROPS) { other->size = 0; other->props = NULL; other->nprops = 0; return (other); } #endif other->size = elem->other_size; other->props = (PlyProperty **) myalloc (sizeof(PlyProperty) * elem->nprops); /* save descriptions of each "other" property */ nprops = 0; for (i = 0; i < elem->nprops; i++) { if (elem->store_prop[i]) continue; prop = (PlyProperty *) myalloc (sizeof (PlyProperty)); copy_property (prop, elem->props[i]); other->props[nprops] = prop; nprops++; } other->nprops = nprops; #if 1 /* set other_offset pointer appropriately if there are NO other properties */ if (other->nprops == 0) { elem->other_offset = NO_OTHER_PROPS; } #endif /* return structure */ return (other); } /*************************/ /* Other Element Stuff */ /*************************/ /****************************************************************************** Grab all the data for an element that a user does not want to explicitly read in. Entry: plyfile - pointer to file elem_name - name of element whose data is to be read in elem_count - number of instances of this element stored in the file Exit: returns pointer to ALL the "other" element data for this PLY file ******************************************************************************/ PlyOtherElems *ply_get_other_element ( PlyFile *plyfile, char *elem_name, int elem_count ) { int i; PlyElement *elem; PlyOtherElems *other_elems; OtherElem *other; /* look for appropriate element */ elem = find_element (plyfile, elem_name); if (elem == NULL) { fprintf (stderr, "ply_get_other_element: can't find element '%s'\n", elem_name); exit (-1); } /* create room for the new "other" element, initializing the */ /* other data structure if necessary */ if (plyfile->other_elems == NULL) { plyfile->other_elems = (PlyOtherElems *) myalloc (sizeof (PlyOtherElems)); other_elems = plyfile->other_elems; other_elems->other_list = (OtherElem *) myalloc (sizeof (OtherElem)); other = &(other_elems->other_list[0]); other_elems->num_elems = 1; } else { other_elems = plyfile->other_elems; other_elems->other_list = (OtherElem *) realloc (other_elems->other_list, sizeof (OtherElem) * (other_elems->num_elems + 1)); other = &(other_elems->other_list[other_elems->num_elems]); other_elems->num_elems++; } /* count of element instances in file */ other->elem_count = elem_count; /* save name of element */ other->elem_name = strdup (elem_name); /* create a list to hold all the current elements */ other->other_data = (OtherData **) malloc (sizeof (OtherData *) * other->elem_count); /* set up for getting elements */ other->other_props = ply_get_other_properties (plyfile, elem_name, offsetof(OtherData,other_props)); /* grab all these elements */ for (i = 0; i < other->elem_count; i++) { /* grab and element from the file */ other->other_data[i] = (OtherData *) malloc (sizeof (OtherData)); ply_get_element (plyfile, (void *) other->other_data[i]); } /* return pointer to the other elements data */ return (other_elems); } /****************************************************************************** Pass along a pointer to "other" elements that we want to save in a given PLY file. These other elements were presumably read from another PLY file. Entry: plyfile - file pointer in which to store this other element info other_elems - info about other elements that we want to store ******************************************************************************/ void ply_describe_other_elements ( PlyFile *plyfile, PlyOtherElems *other_elems ) { int i; OtherElem *other; /* ignore this call if there is no other element */ if (other_elems == NULL) return; /* save pointer to this information */ plyfile->other_elems = other_elems; /* describe the other properties of this element */ for (i = 0; i < other_elems->num_elems; i++) { other = &(other_elems->other_list[i]); ply_element_count (plyfile, other->elem_name, other->elem_count); ply_describe_other_properties (plyfile, other->other_props, offsetof(OtherData,other_props)); } } /****************************************************************************** Write out the "other" elements specified for this PLY file. Entry: plyfile - pointer to PLY file to write out other elements for ******************************************************************************/ void ply_put_other_elements (PlyFile *plyfile) { int i,j; OtherElem *other; /* make sure we have other elements to write */ if (plyfile->other_elems == NULL) return; /* write out the data for each "other" element */ for (i = 0; i < plyfile->other_elems->num_elems; i++) { other = &(plyfile->other_elems->other_list[i]); ply_put_element_setup (plyfile, other->elem_name); /* write out each instance of the current element */ for (j = 0; j < other->elem_count; j++) ply_put_element (plyfile, (void *) other->other_data[j]); } } /****************************************************************************** Free up storage used by an "other" elements data structure. Entry: other_elems - data structure to free up ******************************************************************************/ void ply_free_other_elements (PlyOtherElems *other_elems) { } /*******************/ /* Miscellaneous */ /*******************/ /****************************************************************************** Close a PLY file. Entry: plyfile - identifier of file to close ******************************************************************************/ void ply_close(PlyFile *plyfile) { int i; int j; PlyElement* elem; fclose (plyfile->fp); for (i=0; inelems; i++) { elem = plyfile->elems[i]; free(elem->name); for (j=0; jnprops; j++) { free((elem->props[j]->name)); free (elem->props[j]); } free (elem->props); free (elem->store_prop); free (elem); } free(plyfile->elems); for (i=0; inum_comments; i++) { free (plyfile->comments[i]); } free (plyfile->comments); for (i=0; inum_obj_info; i++) { free (plyfile->obj_info[i]); } free (plyfile->obj_info); if (plyfile->other_elems != NULL) { for (i=0; iother_elems->num_elems; ++i) { OtherElem* other = &(plyfile->other_elems->other_list[i]); free(other->elem_name); for (j=0; jelem_count; ++j) { free(other->other_data[j]); } free(other->other_data); free(other->other_props->name); for (j=0; jother_props->nprops; ++j) { free(other->other_props->props[j]->name); free(other->other_props->props[j]); } free(other->other_props->props); free(other->other_props); } free(plyfile->other_elems->other_list); free(plyfile->other_elems); } free (plyfile); } /****************************************************************************** Get version number and file type of a PlyFile. Entry: ply - pointer to PLY file Exit: version - version of the file file_type - PLY_ASCII, PLY_BINARY_BE, or PLY_BINARY_LE ******************************************************************************/ void ply_get_info(PlyFile *ply, float *version, int *file_type) { if (ply == NULL) return; *version = ply->version; *file_type = ply->file_type; } /****************************************************************************** Compare two strings. Returns 1 if they are the same, 0 if not. ******************************************************************************/ int equal_strings(const char *s1,const char *s2) { while (*s1 && *s2) if (*s1++ != *s2++) return (0); if (*s1 != *s2) return (0); else return (1); } /****************************************************************************** Find an element from the element list of a given PLY object. Entry: plyfile - file id for PLY file element - name of element we're looking for Exit: returns the element, or NULL if not found ******************************************************************************/ PlyElement *find_element(PlyFile *plyfile,const char *element) { int i; for (i = 0; i < plyfile->nelems; i++) if (equal_strings (element, plyfile->elems[i]->name)) return (plyfile->elems[i]); return (NULL); } /****************************************************************************** Find a property in the list of properties of a given element. Entry: elem - pointer to element in which we want to find the property prop_name - name of property to find Exit: index - index to position in list returns a pointer to the property, or NULL if not found ******************************************************************************/ PlyProperty *find_property(PlyElement *elem, const char *prop_name, int *index) { int i; for (i = 0; i < elem->nprops; i++) if (equal_strings (prop_name, elem->props[i]->name)) { *index = i; return (elem->props[i]); } *index = -1; return (NULL); } /****************************************************************************** Read an element from an ascii file. Entry: plyfile - file identifier elem_ptr - pointer to element ******************************************************************************/ void ascii_get_element(PlyFile *plyfile, char *elem_ptr) { int j,k; PlyElement *elem; PlyProperty *prop; char **words; int nwords; int which_word; FILE *fp = plyfile->fp; char *elem_data,*item; char *item_ptr; int item_size; int int_val; unsigned int uint_val; double double_val; int list_count; int store_it; char **store_array; char *orig_line; char *other_data = NULL; int other_flag; /* the kind of element we're reading currently */ elem = plyfile->which_elem; /* do we need to setup for other_props? */ // NOTE HS-2014-02-12 This leaks, it is easier to disable the 'other' functionality than to // fix the leak, vtk solves this by allocating on an internal heap rather than the global heap // if (elem->other_offset != NO_OTHER_PROPS) { // char **ptr; // other_flag = 1; // /* make room for other_props */ // other_data = (char *) myalloc (elem->other_size); // /* store pointer in user's structure to the other_props */ // ptr = (char **) (elem_ptr + elem->other_offset); // *ptr = other_data; // } // else other_flag = 0; /* read in the element */ words = get_words (fp, &nwords, &orig_line); if (words == NULL) { fprintf (stderr, "ply_get_element: unexpected end of file\n"); exit (-1); } which_word = 0; for (j = 0; j < elem->nprops; j++) { prop = elem->props[j]; store_it = (elem->store_prop[j] | other_flag); /* store either in the user's structure or in other_props */ if (elem->store_prop[j]) elem_data = elem_ptr; else elem_data = other_data; if (prop->is_list) { /* a list */ /* get and store the number of items in the list */ get_ascii_item (words[which_word++], prop->count_external, &int_val, &uint_val, &double_val); if (store_it) { item = elem_data + prop->count_offset; store_item(item, prop->count_internal, int_val, uint_val, double_val); } /* allocate space for an array of items and store a ptr to the array */ list_count = int_val; item_size = ply_type_size[prop->internal_type]; store_array = (char **) (elem_data + prop->offset); if (list_count == 0) { if (store_it) *store_array = NULL; } else { if (store_it) { item_ptr = (char *) myalloc (sizeof (char) * item_size * list_count); item = item_ptr; *store_array = item_ptr; } /* read items and store them into the array */ for (k = 0; k < list_count; k++) { get_ascii_item (words[which_word++], prop->external_type, &int_val, &uint_val, &double_val); if (store_it) { store_item (item, prop->internal_type, int_val, uint_val, double_val); item += item_size; } } } } else { /* not a list */ get_ascii_item (words[which_word++], prop->external_type, &int_val, &uint_val, &double_val); if (store_it) { item = elem_data + prop->offset; store_item (item, prop->internal_type, int_val, uint_val, double_val); } } } free (words); } /****************************************************************************** Read an element from a binary file. Entry: plyfile - file identifier elem_ptr - pointer to an element ******************************************************************************/ void binary_get_element(PlyFile *plyfile, char *elem_ptr) { int j,k; PlyElement *elem; PlyProperty *prop; FILE *fp = plyfile->fp; char *elem_data,*item; char *item_ptr; int item_size; int int_val; unsigned int uint_val; double double_val; int list_count; int store_it; char **store_array; char *other_data; int other_flag; /* the kind of element we're reading currently */ elem = plyfile->which_elem; /* do we need to setup for other_props? */ if (elem->other_offset != NO_OTHER_PROPS) { char **ptr; other_flag = 1; /* make room for other_props */ other_data = (char *) myalloc (elem->other_size); /* store pointer in user's structure to the other_props */ ptr = (char **) (elem_ptr + elem->other_offset); *ptr = other_data; } else other_flag = 0; /* read in a number of elements */ for (j = 0; j < elem->nprops; j++) { prop = elem->props[j]; store_it = (elem->store_prop[j] | other_flag); /* store either in the user's structure or in other_props */ if (elem->store_prop[j]) elem_data = elem_ptr; else elem_data = other_data; if (prop->is_list) { /* a list */ /* get and store the number of items in the list */ get_binary_item (fp, prop->count_external, &int_val, &uint_val, &double_val); if (store_it) { item = elem_data + prop->count_offset; store_item(item, prop->count_internal, int_val, uint_val, double_val); } /* allocate space for an array of items and store a ptr to the array */ list_count = int_val; /* The "if" was added by Afra Zomorodian 8/22/95 * so that zipper won't crash reading plies that have additional * properties. */ if (store_it) { item_size = ply_type_size[prop->internal_type]; } store_array = (char **) (elem_data + prop->offset); if (list_count == 0) { if (store_it) *store_array = NULL; } else { if (store_it) { item_ptr = (char *) myalloc (sizeof (char) * item_size * list_count); item = item_ptr; *store_array = item_ptr; } /* read items and store them into the array */ for (k = 0; k < list_count; k++) { get_binary_item (fp, prop->external_type, &int_val, &uint_val, &double_val); if (store_it) { store_item (item, prop->internal_type, int_val, uint_val, double_val); item += item_size; } } } } else { /* not a list */ get_binary_item (fp, prop->external_type, &int_val, &uint_val, &double_val); if (store_it) { item = elem_data + prop->offset; store_item (item, prop->internal_type, int_val, uint_val, double_val); } } } } /****************************************************************************** Write to a file the word that represents a PLY data type. Entry: fp - file pointer code - code for type ******************************************************************************/ void write_scalar_type (FILE *fp, int code) { /* make sure this is a valid code */ if (code <= PLY_START_TYPE || code >= PLY_END_TYPE) { fprintf (stderr, "write_scalar_type: bad data code = %d\n", code); exit (-1); } /* write the code to a file */ fprintf (fp, "%s", type_names[code]); } /****************************************************************************** Get a text line from a file and break it up into words. IMPORTANT: The calling routine call "free" on the returned pointer once finished with it. Entry: fp - file to read from Exit: nwords - number of words returned orig_line - the original line of characters returns a list of words from the line, or NULL if end-of-file ******************************************************************************/ char **get_words(FILE *fp, int *nwords, char **orig_line) { #define BIG_STRING 4096 static char str[BIG_STRING]; static char str_copy[BIG_STRING]; char **words; int max_words = 10; int num_words = 0; char *ptr,*ptr2; char *result; /* read in a line */ result = fgets (str, BIG_STRING, fp); if (result == NULL) { *nwords = 0; *orig_line = NULL; return (NULL); } words = (char **) myalloc (sizeof (char *) * max_words); /* convert carriage-return, line-feed and tabs into spaces */ /* (this guarentees that there will be a space before the */ /* null character at the end of the string) */ str[BIG_STRING-2] = ' '; str[BIG_STRING-1] = '\0'; for (ptr = str, ptr2 = str_copy; *ptr != '\0'; ptr++, ptr2++) { *ptr2 = *ptr; if (*ptr == '\t') { *ptr = ' '; *ptr2 = ' '; } else if (*ptr == '\r' || *ptr == '\n') { // In Linux line ending, the line would end by "\n\0", which originally was changed into " \0". // In Windows line ending, the line would end by "\r\n\0", which needs to change into " \0" as well. *ptr++ = ' '; *ptr = '\0'; *ptr2 = '\0'; break; } } /* find the words in the line */ ptr = str; while (*ptr != '\0') { /* jump over leading spaces */ while (*ptr == ' ') ptr++; /* break if we reach the end */ if (*ptr == '\0') break; /* save pointer to beginning of word */ if (num_words >= max_words) { max_words += 10; words = (char **) realloc (words, sizeof (char *) * max_words); } words[num_words++] = ptr; /* jump over non-spaces */ while (*ptr != ' ') ptr++; /* place a null character here to mark the end of the word */ *ptr++ = '\0'; } /* return the list of words */ *nwords = num_words; *orig_line = str_copy; return (words); } /****************************************************************************** Return the value of an item, given a pointer to it and its type. Entry: item - pointer to item type - data type that "item" points to Exit: returns a double-precision float that contains the value of the item ******************************************************************************/ double get_item_value(char *item, int type) { unsigned char *puchar; char *pchar; short int *pshort; unsigned short int *pushort; int *pint; unsigned int *puint; float *pfloat; double *pdouble; int int_value; unsigned int uint_value; double double_value; switch (type) { case PLY_CHAR: pchar = (char *) item; int_value = *pchar; return ((double) int_value); case PLY_UCHAR: puchar = (unsigned char *) item; int_value = *puchar; return ((double) int_value); case PLY_SHORT: pshort = (short int *) item; int_value = *pshort; return ((double) int_value); case PLY_USHORT: pushort = (unsigned short int *) item; int_value = *pushort; return ((double) int_value); case PLY_INT: pint = (int *) item; int_value = *pint; return ((double) int_value); case PLY_UINT: puint = (unsigned int *) item; uint_value = *puint; return ((double) uint_value); case PLY_FLOAT: pfloat = (float *) item; double_value = *pfloat; return (double_value); case PLY_DOUBLE: pdouble = (double *) item; double_value = *pdouble; return (double_value); default: fprintf (stderr, "get_item_value: bad type = %d\n", type); exit (-1); } } /****************************************************************************** Write out an item to a file as raw binary bytes. Entry: fp - file to write to int_val - integer version of item uint_val - unsigned integer version of item double_val - double-precision float version of item type - data type to write out ******************************************************************************/ void write_binary_item( FILE *fp, int int_val, unsigned int uint_val, double double_val, int type ) { unsigned char uchar_val; char char_val; unsigned short ushort_val; short short_val; float float_val; switch (type) { case PLY_CHAR: char_val = int_val; fwrite (&char_val, 1, 1, fp); break; case PLY_SHORT: short_val = int_val; fwrite (&short_val, 2, 1, fp); break; case PLY_INT: fwrite (&int_val, 4, 1, fp); break; case PLY_UCHAR: uchar_val = uint_val; fwrite (&uchar_val, 1, 1, fp); break; case PLY_USHORT: ushort_val = uint_val; fwrite (&ushort_val, 2, 1, fp); break; case PLY_UINT: fwrite (&uint_val, 4, 1, fp); break; case PLY_FLOAT: float_val = (float)double_val; fwrite (&float_val, 4, 1, fp); break; case PLY_DOUBLE: fwrite (&double_val, 8, 1, fp); break; default: fprintf (stderr, "write_binary_item: bad type = %d\n", type); exit (-1); } } /****************************************************************************** Write out an item to a file as ascii characters. Entry: fp - file to write to int_val - integer version of item uint_val - unsigned integer version of item double_val - double-precision float version of item type - data type to write out ******************************************************************************/ void write_ascii_item( FILE *fp, int int_val, unsigned int uint_val, double double_val, int type ) { switch (type) { case PLY_CHAR: case PLY_SHORT: case PLY_INT: fprintf (fp, "%d ", int_val); break; case PLY_UCHAR: case PLY_USHORT: case PLY_UINT: fprintf (fp, "%u ", uint_val); break; case PLY_FLOAT: case PLY_DOUBLE: fprintf (fp, "%g ", double_val); break; default: fprintf (stderr, "write_ascii_item: bad type = %d\n", type); exit (-1); } } /****************************************************************************** Write out an item to a file as ascii characters. Entry: fp - file to write to item - pointer to item to write type - data type that "item" points to Exit: returns a double-precision float that contains the value of the written item ******************************************************************************/ double old_write_ascii_item(FILE *fp, char *item, int type) { unsigned char *puchar; char *pchar; short int *pshort; unsigned short int *pushort; int *pint; unsigned int *puint; float *pfloat; double *pdouble; int int_value; unsigned int uint_value; double double_value; switch (type) { case PLY_CHAR: pchar = (char *) item; int_value = *pchar; fprintf (fp, "%d ", int_value); return ((double) int_value); case PLY_UCHAR: puchar = (unsigned char *) item; int_value = *puchar; fprintf (fp, "%d ", int_value); return ((double) int_value); case PLY_SHORT: pshort = (short int *) item; int_value = *pshort; fprintf (fp, "%d ", int_value); return ((double) int_value); case PLY_USHORT: pushort = (unsigned short int *) item; int_value = *pushort; fprintf (fp, "%d ", int_value); return ((double) int_value); case PLY_INT: pint = (int *) item; int_value = *pint; fprintf (fp, "%d ", int_value); return ((double) int_value); case PLY_UINT: puint = (unsigned int *) item; uint_value = *puint; fprintf (fp, "%u ", uint_value); return ((double) uint_value); case PLY_FLOAT: pfloat = (float *) item; double_value = *pfloat; fprintf (fp, "%g ", double_value); return (double_value); case PLY_DOUBLE: pdouble = (double *) item; double_value = *pdouble; fprintf (fp, "%g ", double_value); return (double_value); default: fprintf (stderr, "old_write_ascii_item: bad type = %d\n", type); exit (-1); } } /****************************************************************************** Get the value of an item that is in memory, and place the result into an integer, an unsigned integer and a double. Entry: ptr - pointer to the item type - data type supposedly in the item Exit: int_val - integer value uint_val - unsigned integer value double_val - double-precision floating point value ******************************************************************************/ void get_stored_item( void *ptr, int type, int *int_val, unsigned int *uint_val, double *double_val ) { switch (type) { case PLY_CHAR: *int_val = *((char *) ptr); *uint_val = *int_val; *double_val = *int_val; break; case PLY_UCHAR: *uint_val = *((unsigned char *) ptr); *int_val = *uint_val; *double_val = *uint_val; break; case PLY_SHORT: *int_val = *((short int *) ptr); *uint_val = *int_val; *double_val = *int_val; break; case PLY_USHORT: *uint_val = *((unsigned short int *) ptr); *int_val = *uint_val; *double_val = *uint_val; break; case PLY_INT: *int_val = *((int *) ptr); *uint_val = *int_val; *double_val = *int_val; break; case PLY_UINT: *uint_val = *((unsigned int *) ptr); *int_val = *uint_val; *double_val = *uint_val; break; case PLY_FLOAT: *double_val = *((float *) ptr); *int_val = (int)(*double_val); *uint_val = (unsigned int)*double_val; break; case PLY_DOUBLE: *double_val = *((double *) ptr); *int_val = (int)(*double_val); *uint_val = (unsigned int)(*double_val); break; default: fprintf (stderr, "get_stored_item: bad type = %d\n", type); exit (-1); } } /****************************************************************************** Get the value of an item from a binary file, and place the result into an integer, an unsigned integer and a double. Entry: fp - file to get item from type - data type supposedly in the word Exit: int_val - integer value uint_val - unsigned integer value double_val - double-precision floating point value ******************************************************************************/ void get_binary_item( FILE *fp, int type, int *int_val, unsigned int *uint_val, double *double_val ) { char c[8]; void *ptr; ptr = (void *) c; switch (type) { case PLY_CHAR: if (fread (ptr, 1, 1, fp) != 1) { fprintf (stderr, "get_binary_item: read error\n"); exit (-1); } *int_val = *((char *) ptr); *uint_val = *int_val; *double_val = *int_val; break; case PLY_UCHAR: if (fread (ptr, 1, 1, fp) != 1) { fprintf (stderr, "get_binary_item: read error\n"); exit (-1); } *uint_val = *((unsigned char *) ptr); *int_val = *uint_val; *double_val = *uint_val; break; case PLY_SHORT: if (fread (ptr, 2, 1, fp) != 1) { fprintf (stderr, "get_binary_item: read error\n"); exit (-1); } *int_val = *((short int *) ptr); *uint_val = *int_val; *double_val = *int_val; break; case PLY_USHORT: if (fread (ptr, 2, 1, fp) != 1) { fprintf (stderr, "get_binary_item: read error\n"); exit (-1); } *uint_val = *((unsigned short int *) ptr); *int_val = *uint_val; *double_val = *uint_val; break; case PLY_INT: if (fread (ptr, 4, 1, fp) != 1) { fprintf (stderr, "get_binary_item: read error\n"); exit (-1); } *int_val = *((int *) ptr); *uint_val = *int_val; *double_val = *int_val; break; case PLY_UINT: if (fread (ptr, 4, 1, fp) != 1) { fprintf (stderr, "get_binary_item: read error\n"); exit (-1); } *uint_val = *((unsigned int *) ptr); *int_val = *uint_val; *double_val = *uint_val; break; case PLY_FLOAT: if (fread (ptr, 4, 1, fp) != 1) { fprintf (stderr, "get_binary_item: read error\n"); exit (-1); } *double_val = *((float *) ptr); *int_val = (int)(*double_val); *uint_val = (unsigned int)(*double_val); break; case PLY_DOUBLE: if (fread (ptr, 8, 1, fp) != 1) { fprintf (stderr, "get_binary_item: read error\n"); exit (-1); } *double_val = *((double *) ptr); *int_val = (int)(*double_val); *uint_val = (unsigned int)(*double_val); break; default: fprintf (stderr, "get_binary_item: bad type = %d\n", type); exit (-1); } } /****************************************************************************** Extract the value of an item from an ascii word, and place the result into an integer, an unsigned integer and a double. Entry: word - word to extract value from type - data type supposedly in the word Exit: int_val - integer value uint_val - unsigned integer value double_val - double-precision floating point value ******************************************************************************/ void get_ascii_item( char *word, int type, int *int_val, unsigned int *uint_val, double *double_val ) { switch (type) { case PLY_CHAR: case PLY_UCHAR: case PLY_SHORT: case PLY_USHORT: case PLY_INT: *int_val = atoi (word); *uint_val = *int_val; *double_val = *int_val; break; case PLY_UINT: *uint_val = strtoul (word, (char **) NULL, 10); *int_val = *uint_val; *double_val = *uint_val; break; case PLY_FLOAT: case PLY_DOUBLE: *double_val = atof (word); *int_val = (int) *double_val; *uint_val = (unsigned int) *double_val; break; default: fprintf (stderr, "get_ascii_item: bad type = %d\n", type); exit (-1); } } /****************************************************************************** Store a value into a place being pointed to, guided by a data type. Entry: item - place to store value type - data type int_val - integer version of value uint_val - unsigned integer version of value double_val - double version of value Exit: item - pointer to stored value ******************************************************************************/ void store_item ( char *item, int type, int int_val, unsigned int uint_val, double double_val ) { unsigned char *puchar; short int *pshort; unsigned short int *pushort; int *pint; unsigned int *puint; float *pfloat; double *pdouble; switch (type) { case PLY_CHAR: *item = int_val; break; case PLY_UCHAR: puchar = (unsigned char *) item; *puchar = uint_val; break; case PLY_SHORT: pshort = (short *) item; *pshort = int_val; break; case PLY_USHORT: pushort = (unsigned short *) item; *pushort = uint_val; break; case PLY_INT: pint = (int *) item; *pint = int_val; break; case PLY_UINT: puint = (unsigned int *) item; *puint = uint_val; break; case PLY_FLOAT: pfloat = (float *) item; *pfloat = (float)double_val; break; case PLY_DOUBLE: pdouble = (double *) item; *pdouble = double_val; break; default: fprintf (stderr, "store_item: bad type = %d\n", type); exit (-1); } } /****************************************************************************** Add an element to a PLY file descriptor. Entry: plyfile - PLY file descriptor words - list of words describing the element nwords - number of words in the list ******************************************************************************/ void add_element (PlyFile *plyfile, char **words, int nwords) { PlyElement *elem; /* create the new element */ elem = (PlyElement *) myalloc (sizeof (PlyElement)); elem->name = strdup (words[1]); elem->num = atoi (words[2]); elem->nprops = 0; /* make room for new element in the object's list of elements */ if (plyfile->nelems == 0) plyfile->elems = (PlyElement **) myalloc (sizeof (PlyElement *)); else plyfile->elems = (PlyElement **) realloc (plyfile->elems, sizeof (PlyElement *) * (plyfile->nelems + 1)); /* add the new element to the object's list */ plyfile->elems[plyfile->nelems] = elem; plyfile->nelems++; } /****************************************************************************** Return the type of a property, given the name of the property. Entry: name - name of property type Exit: returns integer code for property, or 0 if not found ******************************************************************************/ int get_prop_type(char *type_name) { int i; for (i = PLY_START_TYPE + 1; i < PLY_END_TYPE; i++) if (equal_strings (type_name, type_names[i])) return (i); /* if we get here, we didn't find the type */ return (0); } /****************************************************************************** Add a property to a PLY file descriptor. Entry: plyfile - PLY file descriptor words - list of words describing the property nwords - number of words in the list ******************************************************************************/ void add_property (PlyFile *plyfile, char **words, int nwords) { PlyProperty *prop; PlyElement *elem; /* create the new property */ prop = (PlyProperty *) myalloc (sizeof (PlyProperty)); if (equal_strings (words[1], "list")) { /* is a list */ prop->count_external = get_prop_type (words[2]); prop->external_type = get_prop_type (words[3]); prop->name = strdup (words[4]); prop->is_list = 1; } else { /* not a list */ prop->external_type = get_prop_type (words[1]); prop->name = strdup (words[2]); prop->is_list = 0; } /* add this property to the list of properties of the current element */ elem = plyfile->elems[plyfile->nelems - 1]; if (elem->nprops == 0) elem->props = (PlyProperty **) myalloc (sizeof (PlyProperty *)); else elem->props = (PlyProperty **) realloc (elem->props, sizeof (PlyProperty *) * (elem->nprops + 1)); elem->props[elem->nprops] = prop; elem->nprops++; } /****************************************************************************** Add a comment to a PLY file descriptor. Entry: plyfile - PLY file descriptor line - line containing comment ******************************************************************************/ void add_comment (PlyFile *plyfile, char *line) { int i; /* skip over "comment" and leading spaces and tabs */ i = 7; while (line[i] == ' ' || line[i] == '\t') i++; ply_put_comment (plyfile, &line[i]); } /****************************************************************************** Add a some object information to a PLY file descriptor. Entry: plyfile - PLY file descriptor line - line containing text info ******************************************************************************/ void add_obj_info (PlyFile *plyfile, char *line) { int i; /* skip over "obj_info" and leading spaces and tabs */ i = 8; while (line[i] == ' ' || line[i] == '\t') i++; ply_put_obj_info (plyfile, &line[i]); } /****************************************************************************** Copy a property. ******************************************************************************/ void copy_property(PlyProperty *dest, PlyProperty *src) { dest->name = strdup (src->name); dest->external_type = src->external_type; dest->internal_type = src->internal_type; dest->offset = src->offset; dest->is_list = src->is_list; dest->count_external = src->count_external; dest->count_internal = src->count_internal; dest->count_offset = src->count_offset; } /****************************************************************************** Allocate some memory. Entry: size - amount of memory requested (in bytes) lnum - line number from which memory was requested fname - file name from which memory was requested ******************************************************************************/ char *my_alloc(int size, int lnum, char *fname) { char *ptr; ptr = (char *) malloc (size); if (ptr == 0) { fprintf(stderr, "Memory allocation bombed on line %d in %s\n", lnum, fname); } return (ptr); } #if defined(_MSC_VER) #pragma warning(pop) #endif opensurgsim-0.7.0/SurgSim/DataStructures/ply.h000066400000000000000000000160011277777236100214350ustar00rootroot00000000000000/* Copyright (c) 1994 The Board of Trustees of The Leland Stanford Junior University. All rights reserved. Header for PLY polygon files. - Greg Turk, March 1994 A PLY file contains a single polygonal _object_. An object is composed of lists of _elements_. Typical elements are vertices, faces, edges and materials. Each type of element for a given object has one or more _properties_ associated with the element type. For instance, a vertex element may have as properties three floating-point values x,y,z and three unsigned chars for red, green and blue. --------------------------------------------------------------- Copyright (c) 1994 The Board of Trustees of The Leland Stanford Junior University. All rights reserved. Permission to use, copy, modify and distribute this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice and this permission notice appear in all copies of this software and that you do not sell the software. THE SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef SURGSIM_DATASTRUCTURES_PLY_H #define SURGSIM_DATASTRUCTURES_PLY_H #ifdef __cplusplus #include namespace SurgSim { namespace DataStructures { extern "C" { #endif #include #include #define PLY_ASCII 1 /* ascii PLY file */ #define PLY_BINARY_BE 2 /* binary PLY file, big endian */ #define PLY_BINARY_LE 3 /* binary PLY file, little endian */ #define PLY_OKAY 0 /* ply routine worked okay */ #define PLY_ERROR -1 /* error in ply routine */ /* scalar data types supported by PLY format */ #define PLY_START_TYPE 0 #define PLY_CHAR 1 #define PLY_SHORT 2 #define PLY_INT 3 #define PLY_UCHAR 4 #define PLY_USHORT 5 #define PLY_UINT 6 #define PLY_FLOAT 7 #define PLY_DOUBLE 8 #define PLY_END_TYPE 9 #define PLY_SCALAR 0 #define PLY_LIST 1 typedef struct PlyProperty { /* description of a property */ char *name; /* property name */ int external_type; /* file's data type */ int internal_type; /* program's data type */ int offset; /* offset bytes of prop in a struct */ int is_list; /* 1 = list, 0 = scalar */ int count_external; /* file's count type */ int count_internal; /* program's count type */ int count_offset; /* offset byte for list count */ } PlyProperty; typedef struct PlyElement { /* description of an element */ char *name; /* element name */ int num; /* number of elements in this object */ int size; /* size of element (bytes) or -1 if variable */ int nprops; /* number of properties for this element */ PlyProperty **props; /* list of properties in the file */ char *store_prop; /* flags: property wanted by user? */ int other_offset; /* offset to un-asked-for props, or -1 if none*/ int other_size; /* size of other_props structure */ } PlyElement; typedef struct PlyOtherProp { /* describes other properties in an element */ char *name; /* element name */ int size; /* size of other_props */ int nprops; /* number of properties in other_props */ PlyProperty **props; /* list of properties in other_props */ } PlyOtherProp; typedef struct OtherData { /* for storing other_props for an other element */ void *other_props; } OtherData; typedef struct OtherElem { /* data for one "other" element */ char *elem_name; /* names of other elements */ int elem_count; /* count of instances of each element */ OtherData **other_data; /* actual property data for the elements */ PlyOtherProp *other_props; /* description of the property data */ } OtherElem; typedef struct PlyOtherElems { /* "other" elements, not interpreted by user */ int num_elems; /* number of other elements */ OtherElem *other_list; /* list of data for other elements */ } PlyOtherElems; typedef struct PlyFile { /* description of PLY file */ FILE *fp; /* file pointer */ int file_type; /* ascii or binary */ float version; /* version number of file */ int nelems; /* number of elements of object */ PlyElement **elems; /* list of elements */ int num_comments; /* number of comments */ char **comments; /* list of comments */ int num_obj_info; /* number of items of object information */ char **obj_info; /* list of object info items */ PlyElement *which_elem; /* which element we're currently writing */ PlyOtherElems *other_elems; /* "other" elements from a PLY file */ } PlyFile; /* memory allocation */ extern char *my_alloc(); #define myalloc(mem_size) my_alloc((mem_size), __LINE__, __FILE__) /*** delcaration of routines ***/ extern PlyFile *ply_write(FILE *, int, char **, int); extern PlyFile *ply_open_for_writing(const char *, int, char **, int, float *); extern void ply_describe_element(PlyFile *, char *, int, int, PlyProperty *); extern void ply_describe_property(PlyFile *, char *, PlyProperty *); extern void ply_element_count(PlyFile *, char *, int); extern void ply_header_complete(PlyFile * plyfile); extern void ply_put_element_setup(PlyFile *, char *); extern void ply_put_element(PlyFile *, void *); extern void ply_put_comment(PlyFile *, char *); extern void ply_put_obj_info(PlyFile *, char *); extern PlyFile *ply_read(FILE *, int *, char ***); extern PlyFile *ply_open_for_reading(const char *, int *, char ***, int *, float *); extern PlyProperty **ply_get_element_description(PlyFile *, char *, int*, int*); extern void ply_get_element_setup( PlyFile *, char *, int, PlyProperty *); extern void ply_get_property(PlyFile *, char *, PlyProperty *); extern PlyOtherProp *ply_get_other_properties(PlyFile *, char *, int); extern void ply_get_element(PlyFile *, void *); extern char **ply_get_comments(PlyFile *, int *); extern char **ply_get_obj_info(PlyFile *, int *); extern void ply_close(PlyFile * plyfile); extern void ply_get_info(PlyFile *, float *, int *); extern PlyOtherElems *ply_get_other_element (PlyFile *, char *, int); extern void ply_describe_other_elements ( PlyFile *, PlyOtherElems *); extern void ply_put_other_elements (PlyFile *plyfile); extern void ply_free_other_elements (PlyOtherElems *elements); extern int equal_strings(const char *,const char *); /* find an element in a plyfile's list */ PlyElement *find_element(PlyFile *, const char *); /* find a property in an element's list */ PlyProperty *find_property(PlyElement *, const char *, int *); #ifdef __cplusplus } } } #endif #endif opensurgsim-0.7.0/SurgSim/Devices/000077500000000000000000000000001277777236100170675ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Devices/CMakeLists.txt000066400000000000000000000041121277777236100216250ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2015, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. add_subdirectory(DeviceFilters) add_subdirectory(IdentityPoseDevice) add_subdirectory(Keyboard) add_subdirectory(Mouse) add_subdirectory(ReplayPoseDevice) set(OPTIONAL_DEVICES LabJack Leap MultiAxis Nimble Novint Oculus OpenNI Phantom Sixense TrackIR ) set(DEVICE_LIBRARIES "SurgSimDeviceFilters;IdentityPoseDevice;KeyboardDevice;MouseDevice;ReplayPoseDevice;") set(DEVICE_DOCUMENTATION devices.dox) foreach(DEVICE ${OPTIONAL_DEVICES}) string(TOUPPER ${DEVICE} DEVICE_UPPER_CASE) option(BUILD_DEVICE_${DEVICE_UPPER_CASE} "Build ${DEVICE} device." OFF) if(BUILD_DEVICE_${DEVICE_UPPER_CASE}) add_subdirectory(${DEVICE}) list(APPEND DEVICE_DOCUMENTATION ${DEVICE}/${DEVICE}.dox) set(DEVICE_LIBRARIES "${DEVICE_LIBRARIES};${DEVICE}Device") endif(BUILD_DEVICE_${DEVICE_UPPER_CASE}) endforeach(DEVICE) set(SURGSIM_DEVICES_SOURCES DeviceUtilities.cpp ) set(SURGSIM_DEVICES_HEADERS DeviceUtilities.h ) surgsim_add_library( SurgSimDevices "${SURGSIM_DEVICES_SOURCES}" "${SURGSIM_DEVICES_HEADERS}" ) target_link_libraries(SurgSimDevices SurgSimFramework SurgSimInput ${DEVICE_LIBRARIES} ) set_target_properties(SurgSimDevices PROPERTIES FOLDER "Devices") surgsim_create_library_header(Devices.h "${SURGSIM_DEVICES_HEADERS};${DEVICE_HEADERS}") add_custom_target(SurgSimDevicesDocumentation SOURCES ${DEVICE_DOCUMENTATION}) set_target_properties(SurgSimDevicesDocumentation PROPERTIES FOLDER "Devices") if(BUILD_TESTING) add_subdirectory(UnitTests) endif() opensurgsim-0.7.0/SurgSim/Devices/DeviceFilters/000077500000000000000000000000001277777236100216175ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Devices/DeviceFilters/BoolToScalar.cpp000066400000000000000000000116301277777236100246500ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Devices/DeviceFilters/BoolToScalar.h" #include "SurgSim/DataStructures/DataGroupBuilder.h" #include "SurgSim/DataStructures/DataGroupCopier.h" #include "SurgSim/Math/Scalar.h" namespace SurgSim { namespace Devices { SURGSIM_REGISTER(SurgSim::Input::DeviceInterface, SurgSim::Devices::BoolToScalar, BoolToScalar); BoolToScalar::BoolToScalar(const std::string& name) : DeviceFilter(name), m_isClamping(true), m_value(0.0), m_scale(1.0), m_range(0.0, 1.0), m_increaseField(DataStructures::Names::BUTTON_2), m_decreaseField(DataStructures::Names::BUTTON_1), m_targetField(DataStructures::Names::TOOLDOF) { SURGSIM_ADD_SERIALIZABLE_PROPERTY(BoolToScalar, double, Scale, getScale, setScale); SURGSIM_ADD_SERIALIZABLE_PROPERTY(BoolToScalar, double, Scalar, getScalar, setScalar); SURGSIM_ADD_SERIALIZABLE_PROPERTY(BoolToScalar, bool, Clamping, isClamping, setClamping); { typedef std::pair ParamType; SURGSIM_ADD_SERIALIZABLE_PROPERTY(BoolToScalar, ParamType, Range, getRange, setRange); } SURGSIM_ADD_SERIALIZABLE_PROPERTY(BoolToScalar, std::string, IncreaseField, getIncreaseField, setIncreaseField); SURGSIM_ADD_SERIALIZABLE_PROPERTY(BoolToScalar, std::string, DecreaseField, getDecreaseField, setDecreaseField); SURGSIM_ADD_SERIALIZABLE_PROPERTY(BoolToScalar, std::string, TargetField, getTargetField, setTargetField); } BoolToScalar::~BoolToScalar() { } void BoolToScalar::initializeInput(const std::string& device, const DataStructures::DataGroup& inputData) { SURGSIM_ASSERT(inputData.booleans().getIndex(m_decreaseField) != -1) << "Can't find decrease field " << m_decreaseField << " in booleans of datagroup."; SURGSIM_ASSERT(inputData.booleans().getIndex(m_increaseField) != -1) << "Can't find increase field " << m_increaseField << " in booleans of datagroup."; if (getInputData().isEmpty()) { if (!inputData.scalars().hasEntry(m_targetField)) { DataStructures::DataGroupBuilder builder; builder.addEntriesFrom(inputData); builder.addScalar(m_targetField); getInputData() = builder.createData(); m_copier = std::make_shared(inputData, &getInputData()); } } if (m_copier == nullptr) { getInputData() = inputData; } else { m_copier->copy(inputData, &getInputData()); } m_timer.start(); } void BoolToScalar::filterInput(const std::string& device, const DataStructures::DataGroup& dataToFilter, DataStructures::DataGroup* result) { m_timer.markFrame(); double dt = m_timer.getLastFramePeriod(); if (m_copier == nullptr) { *result = dataToFilter; } else { m_copier->copy(dataToFilter, result); } bool increase = false; dataToFilter.booleans().get(m_increaseField, &increase); bool decrease = false; dataToFilter.booleans().get(m_decreaseField, &decrease); if (increase != decrease) { m_value += (increase) ? dt * m_scale : -1.0 * dt * m_scale; if (m_isClamping) { m_value = Math::clamp(m_value, m_range.first, m_range.second, 0.0); } } result->scalars().set(m_targetField, m_value); } double BoolToScalar::getScale() const { return m_scale; } void BoolToScalar::setRange(const std::pair& val) { m_range = val; if (val.first > val.second) { std::swap(m_range.first, m_range.second); } } std::pair BoolToScalar::getRange() const { return m_range; } void BoolToScalar::setClamping(bool val) { m_isClamping = val; } bool BoolToScalar::isClamping() { return m_isClamping; } void BoolToScalar::setScale(double val) { m_scale = val; } std::string BoolToScalar::getIncreaseField() const { return m_increaseField; } void BoolToScalar::setIncreaseField(const std::string& val) { m_increaseField = val; } std::string BoolToScalar::getDecreaseField() const { return m_decreaseField; } void BoolToScalar::setDecreaseField(const std::string& val) { m_decreaseField = val; } double BoolToScalar::getScalar() const { return m_value; } void BoolToScalar::setScalar(double val) { m_value = val; if (m_isClamping) { m_value = Math::clamp(m_value, m_range.first, m_range.second, 0.0); } } std::string BoolToScalar::getTargetField() const { return m_targetField; } void BoolToScalar::setTargetField(const std::string& val) { m_targetField = val; } }; // namespace Devices }; // namepsace SurgSimopensurgsim-0.7.0/SurgSim/Devices/DeviceFilters/BoolToScalar.h000066400000000000000000000075201277777236100243200ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DEVICES_DEVICEFILTERS_BOOLTOSCALAR_H #define SURGSIM_DEVICES_DEVICEFILTERS_BOOLTOSCALAR_H #include "SurgSim/Devices/DeviceFilters/DeviceFilter.h" #include "SurgSim/Framework/Timer.h" namespace SurgSim { namespace DataStructures { class DataGroupCopier; } namespace Devices { SURGSIM_STATIC_REGISTRATION(BoolToScalar); /// Maps the on and off state of two boolean values to the increase and decrease of a scalar field, /// this for example enables the driving on a scalar value through two buttons on a device, no change occurs /// when both booleans are true at the same time class BoolToScalar : public DeviceFilter { public: /// Constructor explicit BoolToScalar(const std::string& name); /// Destructor ~BoolToScalar(); SURGSIM_CLASSNAME(SurgSim::Devices::BoolToScalar); void initializeInput(const std::string& device, const DataStructures::DataGroup& inputData) override; void filterInput(const std::string& device, const DataStructures::DataGroup& dataToFilter, DataStructures::DataGroup* result) override; /// Sets the value that gets used, the actual value to be added is scale * dt per call to filterInput /// \param val scale to be used void setScale(double val); /// \return the scale for addition double getScale() const; /// Set the range of values that should be produced by this /// \param val (min and max for the range) void setRange(const std::pair& val); /// \return the range of values used std::pair getRange() const; /// Enables or disables clamping on the output value (default true) /// \param val whether to enable or disable clamping void setClamping(bool val); /// \return whether the output value is being clamped bool isClamping(); /// Set the field that is read to increase the scalar value, needs to be a bool /// \param val name of the field to read for an increase void setIncreaseField(const std::string& val); /// \return the name of the field used for increasing the value std::string getIncreaseField() const; /// Set the field this is read to decrease the scalar value, needs to be a bool /// \param val name of the field to be read for decrease void setDecreaseField(const std::string& val); /// \return the name of the field used for decreasing the value std::string getDecreaseField() const; /// Set the value of the mapped field, can also be used to set a starting value for the field /// \param val new Value to be used for the scalar field void setScalar(double val); /// \return the actual value of the mapped field double getScalar() const; /// Set the name of the target field that carries the scalar value, will be created in the datagroup if it doesn't /// exist /// \param val name of the target field void setTargetField(const std::string& val); /// \return the name of the target field for the scalar information std::string getTargetField() const; private: bool m_isClamping; double m_value; double m_scale; std::pair m_range; std::string m_increaseField; std::string m_decreaseField; std::string m_targetField; Framework::Timer m_timer; std::shared_ptr m_copier; }; }; // namespace Devices }; // namespace SurgSim #endif opensurgsim-0.7.0/SurgSim/Devices/DeviceFilters/CMakeLists.txt000066400000000000000000000032601277777236100243600ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2013-2016, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. set(LIBS ${Boost_LIBRARIES} SurgSimDataStructures SurgSimFramework SurgSimInput SurgSimMath ) set(DEVICE_FILTERS_SOURCES BoolToScalar.cpp DeviceFilter.cpp FilteredDevice.cpp ForceScale.cpp PoseIntegrator.cpp PoseTransform.cpp RecordPose.cpp ) set(DEVICE_FILTERS_HEADERS BoolToScalar.h DeviceFilter.h FilteredDevice.h ForceScale.h PoseIntegrator.h PoseTransform.h RecordPose.h ) set(DEVICE_HEADERS ${DEVICE_HEADERS} DeviceFilters/BoolToScalar.h #NOLINT DeviceFilters/DeviceFilter.h #NOLINT DeviceFilters/FilteredDevice.h #NOLINT DeviceFilters/ForceScale.h #NOLINT DeviceFilters/PoseIntegrator.h #NOLINT DeviceFilters/PoseTransform.h #NOLINT DeviceFilters/RecordPose.h #NOLINT PARENT_SCOPE) surgsim_add_library( SurgSimDeviceFilters "${DEVICE_FILTERS_SOURCES}" "${DEVICE_FILTERS_HEADERS}" ) target_link_libraries(SurgSimDeviceFilters ${LIBS}) if(BUILD_TESTING) # The unit tests will be built whenever the library is built. add_subdirectory(UnitTests) endif() set_target_properties(SurgSimDeviceFilters PROPERTIES FOLDER "Devices") opensurgsim-0.7.0/SurgSim/Devices/DeviceFilters/DeviceFilter.cpp000066400000000000000000000041471277777236100246760ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Devices/DeviceFilters/DeviceFilter.h" #include "SurgSim/DataStructures/DataGroup.h" using SurgSim::DataStructures::DataGroup; namespace SurgSim { namespace Devices { DeviceFilter::DeviceFilter(const std::string& name) : CommonDevice(name), m_initialized(false) { } bool DeviceFilter::initialize() { SURGSIM_ASSERT(!isInitialized()) << getName() << " already initialized."; m_initialized = true; return true; } bool DeviceFilter::finalize() { SURGSIM_ASSERT(isInitialized()) << getName() << " is not initialized, cannot finalize."; m_initialized = false; return true; } bool DeviceFilter::isInitialized() const { return m_initialized; } void DeviceFilter::initializeInput(const std::string& device, const DataGroup& inputData) { filterInput(device, inputData, &getInputData()); } void DeviceFilter::handleInput(const std::string& device, const DataGroup& inputData) { filterInput(device, inputData, &getInputData()); pushInput(); } bool DeviceFilter::requestOutput(const std::string& device, DataGroup* outputData) { bool state = pullOutput(); if (state) { filterOutput(device, getOutputData(), outputData); } return state; } void DeviceFilter::filterInput(const std::string& device, const DataGroup& dataToFilter, DataGroup* result) { *result = dataToFilter; } void DeviceFilter::filterOutput(const std::string& device, const DataGroup& dataToFilter, DataGroup* result) { *result = dataToFilter; } }; // namespace Devices }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Devices/DeviceFilters/DeviceFilter.h000066400000000000000000000057201277777236100243410ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DEVICES_DEVICEFILTERS_DEVICEFILTER_H #define SURGSIM_DEVICES_DEVICEFILTERS_DEVICEFILTER_H #include #include "SurgSim/Input/CommonDevice.h" #include "SurgSim/Input/InputConsumerInterface.h" #include "SurgSim/Input/OutputProducerInterface.h" namespace SurgSim { namespace DataStructures { class DataGroup; } namespace Devices { /// A device filter can be connected between a device and the InputConsumerInterface (e.g., InputComponent) and/or /// the OutputProducerInterface (e.g., OutputComponent), and can alter the data being passed from/to the device. class DeviceFilter : public Input::CommonDevice, public Input::InputConsumerInterface, public Input::OutputProducerInterface { public: /// Constructor. /// \param name Name of this device filter. explicit DeviceFilter(const std::string& name); SURGSIM_CLASSNAME(SurgSim::Devices::DeviceFilter); bool initialize() override; bool isInitialized() const override; void initializeInput(const std::string& device, const DataStructures::DataGroup& inputData) override; void handleInput(const std::string& device, const DataStructures::DataGroup& inputData) override; bool requestOutput(const std::string& device, DataStructures::DataGroup* outputData) override; protected: /// Filter the input data. /// \param device The name of the device pushing the input data. /// \param dataToFilter The data that will be filtered. /// \param [in,out] result A pointer to a DataGroup object that must be assignable to by the dataToFilter object. /// Will contain the filtered data. virtual void filterInput(const std::string& device, const DataStructures::DataGroup& dataToFilter, DataStructures::DataGroup* result); /// Filter the output data. /// \param device The name of the device pulling the output data. /// \param dataToFilter The data that will be filtered. /// \param [in,out] result A pointer to a DataGroup object that must be assignable to by the dataToFilter object. /// Will contain the filtered data. virtual void filterOutput(const std::string& device, const DataStructures::DataGroup& dataToFilter, DataStructures::DataGroup* result); protected: bool finalize() override; /// true if initialized and not finalized. bool m_initialized; }; }; // namespace Devices }; // namespace SurgSim #endif // SURGSIM_DEVICES_DEVICEFILTERS_DEVICEFILTER_H opensurgsim-0.7.0/SurgSim/Devices/DeviceFilters/FilteredDevice.cpp000066400000000000000000000173501277777236100252070ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Devices/DeviceFilters/FilteredDevice.h" #include "SurgSim/Devices/DeviceFilters/DeviceFilter.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Input/InputConsumerInterface.h" #include "SurgSim/Input/OutputProducerInterface.h" using SurgSim::Input::InputConsumerInterface; using SurgSim::Input::OutputProducerInterface; namespace SurgSim { namespace Devices { SURGSIM_REGISTER(SurgSim::Input::DeviceInterface, SurgSim::Devices::FilteredDevice, FilteredDevice); FilteredDevice::FilteredDevice(const std::string& name) : m_name(name), m_initialized(false), m_logger(Framework::Logger::getLogger("Devices/FilteredDevice")) { m_devices.push_back(nullptr); } FilteredDevice::~FilteredDevice() { if (isInitialized()) { finalize(); } } std::string FilteredDevice::getName() const { return m_name; } bool FilteredDevice::initialize() { SURGSIM_ASSERT(!isInitialized()) << "Already initialized."; boost::unique_lock(m_deviceMutex); SURGSIM_ASSERT(m_devices.size() > 0) << "There must be at least one device."; bool result = true; if (m_devices[0] == nullptr) { SURGSIM_LOG_WARNING(m_logger) << "A raw/base device is required for " << getName(); result = false; } if (result) { for (size_t i = 0; i < m_devices.size() - 1; ++i) { auto deviceFilter = std::dynamic_pointer_cast(m_devices[i + 1]); SURGSIM_ASSERT(deviceFilter != nullptr) << "Expected a device filter."; result = result && m_devices[i]->addInputConsumer(deviceFilter) && m_devices[i]->setOutputProducer(deviceFilter); } for (auto& device : m_devices) { if (!device->isInitialized()) { result = result && device->initialize(); } } if (!result) { doFinalize(); } } m_initialized = result; SURGSIM_LOG_IF(!result, m_logger, WARNING) << "Failed to initialize " << getName(); return result; } bool FilteredDevice::isInitialized() const { return m_initialized; } bool FilteredDevice::finalize() { SURGSIM_ASSERT(isInitialized()) << getName() << " is not initialized, cannot finalize."; m_initialized = false; boost::shared_lock(m_deviceMutex); doFinalize(); return true; } void FilteredDevice::doFinalize() { for (size_t i = 0; i < m_devices.size() - 1; ++i) { auto deviceFilter = std::dynamic_pointer_cast(m_devices[i + 1]); SURGSIM_ASSERT(deviceFilter != nullptr) << "Expected a device filter."; m_devices[i]->removeInputConsumer(deviceFilter); m_devices[i]->removeOutputProducer(deviceFilter); } } bool FilteredDevice::addInputConsumer(std::shared_ptr inputConsumer) { boost::shared_lock(m_deviceMutex); SURGSIM_ASSERT(m_devices.size() > 0) << "There must be at least one device."; bool result = false; if (m_devices.back() == nullptr) { SURGSIM_LOG_WARNING(m_logger) << "Cannot addInputConsumer on " << getName() << " before setting the device and/or adding a filter."; } else { result = m_devices.back()->addInputConsumer(inputConsumer); } return result; } bool FilteredDevice::removeInputConsumer(std::shared_ptr inputConsumer) { boost::shared_lock(m_deviceMutex); SURGSIM_ASSERT(m_devices.size() > 0) << "There must be at least one device."; bool result = false; if (m_devices.back() == nullptr) { SURGSIM_LOG_WARNING(m_logger) << getName() << " does not have a device or filter from which to removeInputConsumer."; } else { result = m_devices.back()->removeInputConsumer(inputConsumer); } return result; } void FilteredDevice::clearInputConsumers() { boost::shared_lock(m_deviceMutex); SURGSIM_ASSERT(m_devices.size() > 0) << "There must be at least one device."; if (m_devices.back() != nullptr) { m_devices.back()->clearInputConsumers(); } } bool FilteredDevice::setOutputProducer(std::shared_ptr outputProducer) { boost::shared_lock(m_deviceMutex); SURGSIM_ASSERT(m_devices.size() > 0) << "There must be at least one device."; bool result = false; if (m_devices.back() == nullptr) { SURGSIM_LOG_WARNING(m_logger) << "Cannot setOutputProducer on " << getName() << " before setting the device and/or adding a filter."; } else { result = m_devices.back()->setOutputProducer(outputProducer); } return result; } bool FilteredDevice::removeOutputProducer(std::shared_ptr outputProducer) { boost::shared_lock(m_deviceMutex); SURGSIM_ASSERT(m_devices.size() > 0) << "There must be at least one device."; bool result = false; if (m_devices.back() == nullptr) { SURGSIM_LOG_WARNING(m_logger) << getName() << " does not have a device or filter from which to removeOutputProducer."; } else { result = m_devices.back()->removeOutputProducer(outputProducer); } return result; } bool FilteredDevice::hasOutputProducer() { boost::shared_lock(m_deviceMutex); SURGSIM_ASSERT(m_devices.size() > 0) << "There must be at least one device."; return ((m_devices.back() != nullptr) && m_devices.back()->hasOutputProducer()); } void FilteredDevice::clearOutputProducer() { boost::shared_lock(m_deviceMutex); SURGSIM_ASSERT(m_devices.size() > 0) << "There must be at least one device."; if (m_devices.back() != nullptr) { m_devices.back()->clearOutputProducer(); } } void FilteredDevice::setDevice(std::shared_ptr device) { SURGSIM_ASSERT(!isInitialized()) << "Cannot set device after initialization"; SURGSIM_ASSERT(device != nullptr) << "Cannot set a nullptr device."; boost::unique_lock(m_deviceMutex); m_devices[0] = device; } void FilteredDevice::addFilter(std::shared_ptr filter) { SURGSIM_ASSERT(!isInitialized()) << "Cannot add filter after initialization"; SURGSIM_ASSERT(filter != nullptr) << "Cannot add a nullptr filter."; boost::unique_lock(m_deviceMutex); m_devices.push_back(filter); } const std::vector>& FilteredDevice::getDevices() const { boost::shared_lock(m_deviceMutex); return m_devices; } bool FilteredDevice::setDevices(const std::vector>& devices) { SURGSIM_ASSERT(!isInitialized()) << "Cannot set devices after initialization"; bool result = true; boost::unique_lock(m_deviceMutex); if (devices.size() > 0) { for (const auto& device : devices) { if (device == nullptr) { SURGSIM_LOG_WARNING(m_logger) << "Cannot set a nullptr device on " << getName(); result = false; } else { if ((device != devices[0]) && (std::dynamic_pointer_cast(device) == nullptr)) { SURGSIM_LOG_WARNING(m_logger) << getName() << " setDevices got a " << device->getClassName() << " named " << device->getName() << " where a DeviceFilter is required."; result = false; } } } } else { SURGSIM_LOG_WARNING(m_logger) << "Cannot set 0 devices on " << getName(); result = false; } if (result) { m_devices = devices; } return result; } }; // namespace Devices }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Devices/DeviceFilters/FilteredDevice.h000066400000000000000000000070431277777236100246520ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DEVICES_DEVICEFILTERS_FILTEREDDEVICE_H #define SURGSIM_DEVICES_DEVICEFILTERS_FILTEREDDEVICE_H #include #include #include #include #include "SurgSim/Input/DeviceInterface.h" namespace SurgSim { namespace Input { class InputConsumerInterface; class OutputProducerInterface; } namespace Devices { class DeviceFilter; /// A DeviceInterface connected in series with one or more DeviceFilters. Useful for serialization. class FilteredDevice : public Input::DeviceInterface { public: /// Constructor. /// \param name Name of this device. explicit FilteredDevice(const std::string& name); SURGSIM_CLASSNAME(SurgSim::Devices::FilteredDevice); /// Destructor. virtual ~FilteredDevice(); std::string getName() const override; bool initialize() override; bool isInitialized() const override; bool addInputConsumer(std::shared_ptr inputConsumer) override; bool removeInputConsumer(std::shared_ptr inputConsumer) override; void clearInputConsumers() override; bool setOutputProducer(std::shared_ptr outputProducer) override; bool removeOutputProducer(std::shared_ptr outputProducer) override; bool hasOutputProducer() override; void clearOutputProducer() override; /// Sets the raw/base device. /// \param device The device connected to the filter(s). void setDevice(std::shared_ptr device); /// Adds a DeviceFilter. The first filter that is added will be connected to the raw/base device. /// The last filter that is added will interface with InputConsumers and/or an OutputProducer. /// Any filters added in-between will be connected in order. /// \param filter A DeviceFilter. void addFilter(std::shared_ptr filter); /// \return All devices. const std::vector>& getDevices() const; /// Sets the devices. /// \param devices All the devices. /// \return true on success bool setDevices(const std::vector>& devices); private: bool finalize() override; /// Implements the finalize functionality. void doFinalize(); /// The name of this device. std::string m_name; /// true if initialized and not finalized. bool m_initialized; /// The devices. m_devices.back() will be connected to any InputComponent or OutputComponent. /// m_devices.front() is the raw/base device to be filtered. If this contains more than one element, all but /// the front element are DeviceFilters. std::vector> m_devices; /// The mutex to protect access to the devices. boost::shared_mutex m_deviceMutex; /// The logger. std::shared_ptr m_logger; }; }; // namespace Devices }; // namespace SurgSim #endif // SURGSIM_DEVICES_DEVICEFILTERS_FILTEREDDEVICE_H opensurgsim-0.7.0/SurgSim/Devices/DeviceFilters/ForceScale.cpp000066400000000000000000000054721277777236100243410ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Devices/DeviceFilters/ForceScale.h" #include "SurgSim/Math/Vector.h" using SurgSim::DataStructures::DataGroup; using SurgSim::Math::Vector3d; namespace SurgSim { namespace Devices { SURGSIM_REGISTER(SurgSim::Input::DeviceInterface, SurgSim::Devices::ForceScale, ForceScale); ForceScale::ForceScale(const std::string& name) : DeviceFilter(name), m_forceScale(1.0), m_torqueScale(1.0) { } void ForceScale::filterOutput(const std::string& device, const DataGroup& dataToFilter, DataGroup* result) { boost::lock_guard lock(m_mutex); *result = dataToFilter; Vector3d force; if (dataToFilter.vectors().get(DataStructures::Names::FORCE, &force)) { force *= m_forceScale; result->vectors().set(DataStructures::Names::FORCE, force); } Vector3d torque; if (dataToFilter.vectors().get(DataStructures::Names::TORQUE, &torque)) { torque *= m_torqueScale; result->vectors().set(DataStructures::Names::TORQUE, torque); } // Scale the spring's contribution to the force and torque. First three rows calculate force, last three for torque. DataGroup::DynamicMatrixType springJacobian; if (dataToFilter.matrices().get(DataStructures::Names::SPRING_JACOBIAN, &springJacobian)) { springJacobian.block<3,6>(0, 0) *= m_forceScale; springJacobian.block<3,6>(3, 0) *= m_torqueScale; result->matrices().set(DataStructures::Names::SPRING_JACOBIAN, springJacobian); } // Scale the damper's contribution to the force and torque. First three rows calculate force, last three for torque. DataGroup::DynamicMatrixType damperJacobian; if (dataToFilter.matrices().get(DataStructures::Names::DAMPER_JACOBIAN, &damperJacobian)) { damperJacobian.block<3,6>(0, 0) *= m_forceScale; damperJacobian.block<3,6>(3, 0) *= m_torqueScale; result->matrices().set(DataStructures::Names::DAMPER_JACOBIAN, damperJacobian); } } void ForceScale::setForceScale(double forceScale) { boost::lock_guard lock(m_mutex); m_forceScale = forceScale; } void ForceScale::setTorqueScale(double torqueScale) { boost::lock_guard lock(m_mutex); m_torqueScale = torqueScale; } }; // namespace Devices }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Devices/DeviceFilters/ForceScale.h000066400000000000000000000046741277777236100240110ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DEVICES_DEVICEFILTERS_FORCESCALE_H #define SURGSIM_DEVICES_DEVICEFILTERS_FORCESCALE_H #include #include #include "SurgSim/Devices/DeviceFilters/DeviceFilter.h" namespace SurgSim { namespace Devices { SURGSIM_STATIC_REGISTRATION(ForceScale); /// An output device filter that scales forces and/or torques. Any other entries in the DataGroup are passed through. /// For convenience, it is also an InputConsumerInterface that does no filtering of the input data. Thus it can be /// added as an input consumer to the raw device, and set as the output producer for the raw device, after which other /// device filters, input components, and output components only need access to the ForceScale instance, not the raw /// device. class ForceScale : public DeviceFilter { public: /// Constructor. /// \param name Name of this device filter. explicit ForceScale(const std::string& name); SURGSIM_CLASSNAME(SurgSim::Devices::ForceScale); /// Set the force scale factor so that each direction has the same scale. /// \param forceScale The scalar scaling factor. void setForceScale(double forceScale); /// Set the torque scale factor so that each direction has the same scale. /// \param torqueScale The scalar scaling factor. void setTorqueScale(double torqueScale); private: void filterOutput(const std::string& device, const DataStructures::DataGroup& dataToFilter, DataStructures::DataGroup* result) override; /// The mutex that protects the scaling factors. boost::mutex m_mutex; /// The scaling factor applied to each direction of the force. double m_forceScale; /// The scaling factor applied to each direction of the torque. double m_torqueScale; }; }; // namespace Devices }; // namespace SurgSim #endif // SURGSIM_DEVICES_DEVICEFILTERS_FORCESCALE_H opensurgsim-0.7.0/SurgSim/Devices/DeviceFilters/PoseIntegrator.cpp000066400000000000000000000102201277777236100252630ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Devices/DeviceFilters/PoseIntegrator.h" #include #include "SurgSim/DataStructures/DataGroupBuilder.h" #include "SurgSim/DataStructures/DataGroupCopier.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Math/Matrix.h" #include "SurgSim/Math/Vector.h" using SurgSim::Math::Vector3d; namespace SurgSim { namespace Devices { SURGSIM_REGISTER(SurgSim::Input::DeviceInterface, SurgSim::Devices::PoseIntegrator, PoseIntegrator); PoseIntegrator::PoseIntegrator(const std::string& name) : DeviceFilter(name), m_poseResult(PoseType::Identity()) { } const PoseIntegrator::PoseType& PoseIntegrator::integrate(const PoseType& pose) { // Note: we apply translation and rotation separately. This is NOT the same as (m_poseResult * pose)! m_poseResult.pretranslate(pose.translation()); m_poseResult.rotate(pose.rotation()); return m_poseResult; } void PoseIntegrator::initializeInput(const std::string& device, const DataStructures::DataGroup& inputData) { if (getInputData().isEmpty()) { if (!inputData.vectors().hasEntry(DataStructures::Names::LINEAR_VELOCITY) || !inputData.vectors().hasEntry(DataStructures::Names::ANGULAR_VELOCITY)) { DataStructures::DataGroupBuilder builder; builder.addEntriesFrom(inputData); builder.addVector(DataStructures::Names::LINEAR_VELOCITY); builder.addVector(DataStructures::Names::ANGULAR_VELOCITY); getInputData() = builder.createData(); m_copier = std::make_shared(inputData, &getInputData()); } } if (m_copier == nullptr) { getInputData() = inputData; } else { m_copier->copy(inputData, &getInputData()); } PoseType pose; if (inputData.poses().get(DataStructures::Names::POSE, &pose)) { m_poseResult = pose; } } void PoseIntegrator::handleInput(const std::string& device, const DataStructures::DataGroup& inputData) { if (m_copier == nullptr) { getInputData() = inputData; } else { m_copier->copy(inputData, &getInputData()); } PoseType pose; if (inputData.poses().get(DataStructures::Names::POSE, &pose)) { m_timer.markFrame(); double rate = m_timer.getAverageFrameRate(); if (m_timer.getNumberOfClockFails() > 0) { m_timer.start(); rate = 0.0; SURGSIM_LOG_DEBUG(Framework::Logger::getLogger("Devices/Filters/PoseIntegrator")) << "The Timer used by " << getName() << " had a clock fail. The calculated velocities will be zero this update."; } if (!boost::math::isnormal(rate)) { rate = 0.0; } bool reset = false; inputData.booleans().get(m_resetName, &reset); if (reset) { pose.translation() = -m_poseResult.translation(); pose.linear() = m_poseResult.linear().transpose(); } // Before updating the current pose, use it to calculate the angular velocity. Vector3d rotationAxis; double angle; Math::computeAngleAndAxis(pose.rotation(), &angle, &rotationAxis); rotationAxis = m_poseResult.rotation() * rotationAxis; // rotate the axis into global space getInputData().vectors().set(DataStructures::Names::ANGULAR_VELOCITY, rotationAxis * angle * rate); getInputData().poses().set(DataStructures::Names::POSE, integrate(pose)); getInputData().vectors().set(DataStructures::Names::LINEAR_VELOCITY, pose.translation() * rate); } pushInput(); } void PoseIntegrator::setReset(const std::string& name) { SURGSIM_ASSERT(getInputData().isEmpty()) << "PoseIntegrator::setReset cannot be called after the first call to initializeInput."; m_resetName = name; } }; // namespace Devices }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Devices/DeviceFilters/PoseIntegrator.h000066400000000000000000000067531277777236100247500ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DEVICES_DEVICEFILTERS_POSEINTEGRATOR_H #define SURGSIM_DEVICES_DEVICEFILTERS_POSEINTEGRATOR_H #include #include #include "SurgSim/DataStructures/OptionalValue.h" #include "SurgSim/Devices/DeviceFilters/DeviceFilter.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Framework/Timer.h" namespace SurgSim { namespace DataStructures { class DataGroupCopier; }; namespace Devices { SURGSIM_STATIC_REGISTRATION(PoseIntegrator); /// A device filter that integrates the pose, turning a relative device into an absolute one. /// Also provides the instantaneous linear and angular velocities. /// \sa SurgSim::Input::CommonDevice /// \sa SurgSim::Input::InputConsumerInterface /// \sa SurgSim::Input::OutputProducerInterface class PoseIntegrator : public DeviceFilter { public: /// The type used for poses. typedef Math::RigidTransform3d PoseType; /// Constructor. /// \param name Name of this device filter. explicit PoseIntegrator(const std::string& name); SURGSIM_CLASSNAME(SurgSim::Devices::PoseIntegrator); /// Integrates the pose. /// \param pose The latest differential pose. /// \return The integrated pose. const PoseType& integrate(const PoseType& pose); void initializeInput(const std::string& device, const DataStructures::DataGroup& inputData) override; /// Notifies the consumer that the application input coming from the device has been updated. /// Treats the pose coming from the input device as a delta pose and integrates it to get the output pose. /// \param device The name of the device that is producing the input. This should only be used to identify /// the device (e.g. if the consumer is listening to several devices at once). /// \param inputData The application input state coming from the device. void handleInput(const std::string& device, const DataStructures::DataGroup& inputData) override; /// Sets the string name of the boolean entry that will reset the pose to its initial value. Such a reset can be /// useful if the integrated pose is used to position an object and the integration takes the object out of view. /// \param name The name of the NamedData entry. /// \warning A pose reset may generate high velocities, and if the pose is the input to a VirtualToolCoupler then /// large forces will likely be generated. /// \exception Asserts if called after initialize. void setReset(const std::string& name); private: /// The result of integrating the input poses. PoseType m_poseResult; /// A timer for the update rate needed for calculating velocity. Framework::Timer m_timer; /// A copier into the input DataGroup, if needed. std::shared_ptr m_copier; /// The name of the reset boolean (if any). std::string m_resetName; }; }; // namespace Devices }; // namespace SurgSim #endif // SURGSIM_DEVICES_DEVICEFILTERS_POSEINTEGRATOR_H opensurgsim-0.7.0/SurgSim/Devices/DeviceFilters/PoseTransform.cpp000066400000000000000000000212611277777236100251270ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Devices/DeviceFilters/PoseTransform.h" #include "SurgSim/Math/MathConvert.h" #include "SurgSim/Math/Matrix.h" using SurgSim::DataStructures::DataGroup; using SurgSim::Math::RigidTransform3d; using SurgSim::Math::Vector3d; namespace SurgSim { namespace Devices { SURGSIM_REGISTER(SurgSim::Input::DeviceInterface, SurgSim::Devices::PoseTransform, PoseTransform); PoseTransform::PoseTransform(const std::string& name) : DeviceFilter(name), m_transform(RigidTransform3d::Identity()), m_transformInverse(RigidTransform3d::Identity()), m_translationScale(1.0) { SURGSIM_ADD_SERIALIZABLE_PROPERTY(PoseTransform, double, TranslationScale, getTranslationScale, setTranslationScale); SURGSIM_ADD_SERIALIZABLE_PROPERTY(PoseTransform, RigidTransform3d, Transform, getTransform, setTransform); } void PoseTransform::filterInput(const std::string& device, const DataGroup& dataToFilter, DataGroup* result) { boost::lock_guard lock(m_mutex); // Prevent the transform or scaling from being set simultaneously. *result = dataToFilter; // Pass on all the data entries. RigidTransform3d pose; // If there is a pose, scale the translation, then transform the result. if (dataToFilter.poses().get(DataStructures::Names::POSE, &pose)) { pose.translation() *= m_translationScale; pose = m_transform * pose; result->poses().set(DataStructures::Names::POSE, pose); } // If there is a linear velocity, scale then rotate it. The linear velocity is scaled because it is the change // in translation over time, and the translation is being scaled. Vector3d linearVelocity; if (dataToFilter.vectors().get(DataStructures::Names::LINEAR_VELOCITY, &linearVelocity)) { linearVelocity *= m_translationScale; linearVelocity = m_transform.linear() * linearVelocity; result->vectors().set(DataStructures::Names::LINEAR_VELOCITY, linearVelocity); } Vector3d angularVelocity; // If there is an angular velocity, rotate it. if (dataToFilter.vectors().get(DataStructures::Names::ANGULAR_VELOCITY, &angularVelocity)) { angularVelocity = m_transform.linear() * angularVelocity; result->vectors().set(DataStructures::Names::ANGULAR_VELOCITY, angularVelocity); } } void PoseTransform::filterOutput(const std::string& device, const DataGroup& dataToFilter, DataGroup* result) { boost::lock_guard lock(m_mutex); // Prevent the transform or scaling from being set simultaneously. *result = dataToFilter; // Pass on all the data entries. // Since the haptic devices will compare the data in the output DataGroup to a raw input pose, the filter must // perform the reverse transform and scaling to data used by the haptic devices. // The force and torque must be transformed into device space. In order to reliably display the desired // forces as calculated by the simulation, the nominal forces and torques are not scaled by the translation scaling. // The benefit is that increasing the translation scaling does not result in larger penetrations for the // same force, but the downside is that as the translation scaling increases it becomes more likely that the haptic // feedback loop at a surface will become "active" (smaller motions penetrating another object are sufficient to // create forces ejecting the device's collision representation). Therefore, a device that is having its // translation scaled may required a force scaling filter to reduce the forces. Vector3d force; if (dataToFilter.vectors().get(DataStructures::Names::FORCE, &force)) { force = m_transformInverse.linear() * force; result->vectors().set(DataStructures::Names::FORCE, force); } Vector3d torque; if (dataToFilter.vectors().get(DataStructures::Names::TORQUE, &torque)) { torque = m_transformInverse.linear() * torque; result->vectors().set(DataStructures::Names::TORQUE, torque); } // The Jacobians must be transformed into device space. The Jacobians are scaled based on the translation scaling, // so that the forces and torques displayed by the device will be correct for the scene-space motions, not for the // device-space motions. Let R be the linear rotation portion of our transform, s be the translation scaling // factor, and J be the 3x3 upper-left corner of the spring Jacobian. Then: // delta-translation-in-scene = s * R * delta-translation-in-device // delta-force-in-scene = J * delta-translation-in-scene // So to transform J into the device space, we left-multiply by R^-1, and right-multiply by R. // Then, because we want the forces to be scaled as in scene-space, we scale J by s. The bottom-left 3x3 block // in springJacobian (or damperJacobian) also transforms from delta-translation and is treated the same, while the // two 3x3 blocks on the right half (of springJacobian or damperJacobian) will be multiplied by the delta-rotation // (not delta-translation) and so should not be scaled. DataGroup::DynamicMatrixType springJacobian; if (dataToFilter.matrices().get(DataStructures::Names::SPRING_JACOBIAN, &springJacobian)) { springJacobian.block<3,3>(0, 0).applyOnTheLeft(m_transformInverse.linear()); springJacobian.block<3,3>(0, 0).applyOnTheRight(m_transform.linear()); springJacobian.block<3,3>(3, 0).applyOnTheLeft(m_transformInverse.linear()); springJacobian.block<3,3>(3, 0).applyOnTheRight(m_transform.linear()); springJacobian.block<3,3>(0, 3).applyOnTheLeft(m_transformInverse.linear()); springJacobian.block<3,3>(0, 3).applyOnTheRight(m_transform.linear()); springJacobian.block<3,3>(3, 3).applyOnTheLeft(m_transformInverse.linear()); springJacobian.block<3,3>(3, 3).applyOnTheRight(m_transform.linear()); springJacobian.block<6,3>(0, 0) *= m_translationScale; result->matrices().set(DataStructures::Names::SPRING_JACOBIAN, springJacobian); } RigidTransform3d inputPose; if (dataToFilter.poses().get(DataStructures::Names::INPUT_POSE, &inputPose)) { inputPose = m_transformInverse * inputPose; inputPose.translation() /= m_translationScale; result->poses().set(DataStructures::Names::INPUT_POSE, inputPose); } DataGroup::DynamicMatrixType damperJacobian; if (dataToFilter.matrices().get(DataStructures::Names::DAMPER_JACOBIAN, &damperJacobian)) { damperJacobian.block<3,3>(0, 0).applyOnTheLeft(m_transformInverse.linear()); damperJacobian.block<3,3>(0, 0).applyOnTheRight(m_transform.linear()); damperJacobian.block<3,3>(3, 0).applyOnTheLeft(m_transformInverse.linear()); damperJacobian.block<3,3>(3, 0).applyOnTheRight(m_transform.linear()); damperJacobian.block<3,3>(0, 3).applyOnTheLeft(m_transformInverse.linear()); damperJacobian.block<3,3>(0, 3).applyOnTheRight(m_transform.linear()); damperJacobian.block<3,3>(3, 3).applyOnTheLeft(m_transformInverse.linear()); damperJacobian.block<3,3>(3, 3).applyOnTheRight(m_transform.linear()); damperJacobian.block<6,3>(0, 0) *= m_translationScale; result->matrices().set(DataStructures::Names::DAMPER_JACOBIAN, damperJacobian); } Vector3d inputLinearVelocity; if (dataToFilter.vectors().get(DataStructures::Names::INPUT_LINEAR_VELOCITY, &inputLinearVelocity)) { inputLinearVelocity = m_transformInverse.linear() * inputLinearVelocity; inputLinearVelocity /= m_translationScale; result->vectors().set(DataStructures::Names::INPUT_LINEAR_VELOCITY, inputLinearVelocity); } Vector3d inputAngularVelocity; if (dataToFilter.vectors().get(DataStructures::Names::INPUT_ANGULAR_VELOCITY, &inputAngularVelocity)) { inputAngularVelocity = m_transformInverse.linear() * inputAngularVelocity; result->vectors().set(DataStructures::Names::INPUT_ANGULAR_VELOCITY, inputAngularVelocity); } } double PoseTransform::getTranslationScale() const { return m_translationScale; } void PoseTransform::setTranslationScale(double translationScale) { boost::lock_guard lock(m_mutex); m_translationScale = translationScale; } const RigidTransform3d& PoseTransform::getTransform() const { return m_transform; } void PoseTransform::setTransform(const RigidTransform3d& transform) { boost::lock_guard lock(m_mutex); m_transform = transform; m_transformInverse = m_transform.inverse(); } }; // namespace Devices }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Devices/DeviceFilters/PoseTransform.h000066400000000000000000000113751277777236100246010ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DEVICES_DEVICEFILTERS_POSETRANSFORM_H #define SURGSIM_DEVICES_DEVICEFILTERS_POSETRANSFORM_H #include #include #include #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/Devices/DeviceFilters/DeviceFilter.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Vector.h" namespace SurgSim { namespace Devices { SURGSIM_STATIC_REGISTRATION(PoseTransform); /// A device filter that transforms the input pose. It can scale the translation, and/or apply a constant transform. /// Any other data in the DataGroup is passed through. For an input/output device (e.g., a haptic device), the filter /// should be added as one of the device's input consumers and set as the device's output producer. For a purely input /// device, the filter can just be added as an input consumer. If it is used for both input and output, the input data /// is filtered using the offset(s) and scaling, and the output data is un-filtered so the device does not need to know /// about the filtering. /// For haptic devices, so that changing the translation scaling does not alter the relationship between displayed /// forces and collision penetrations, the output filter does not scale the nominal forces and torques, and it does /// scale the Jacobians. Thereby the displayed forces and torques are appropriate for the scene (not the device-space /// motions). In other words, a 1 m motion by the device's scene representation generates forces according to that 1 m /// motion, instead of the original device motion before scaling. This means the device displays forces and torques /// that are "true" to the scene, with the consequence that increasing the translation scaling can negatively impact the /// haptic stability. As the scaling increases, the same motion would cause larger forces, until at great enough /// scaling the system becomes unstable (either when colliding with another scene element, or just due to over-damping). /// Consider chaining this device filter with a force scaling device filter to improve system stability. /// \sa SurgSim::Input::CommonDevice /// \sa SurgSim::Input::InputConsumerInterface /// \sa SurgSim::Input::OutputProducerInterface class PoseTransform : public DeviceFilter { public: /// Constructor. /// \param name Name of this device filter. explicit PoseTransform(const std::string& name); SURGSIM_CLASSNAME(SurgSim::Devices::PoseTransform); /// \return Get the translation scale factor. double getTranslationScale() const; /// Set the translation scale factor so that each direction has the same scale. /// \param translationScale The scalar scaling factor. /// \warning This setter is thread-safe, but after calling this function the output filter will use the new /// transform even if the following output data is based off input data that used the old transform. void setTranslationScale(double translationScale); /// \return The current transform. const Math::RigidTransform3d& getTransform() const; /// Set the constant transform. The transform is pre-applied to the input pose. /// \param transform The transform, which must be invertible. /// \warning This setter is thread-safe, but after calling this function the output filter will use the new /// transform even if the following output data is based off input data that used the old transform. void setTransform(const Math::RigidTransform3d& transform); private: void filterInput(const std::string& device, const DataStructures::DataGroup& dataToFilter, DataStructures::DataGroup* result) override; void filterOutput(const std::string& device, const DataStructures::DataGroup& dataToFilter, DataStructures::DataGroup* result) override; /// The mutex that protects the transform and scaling factor. boost::mutex m_mutex; /// The constant pre-transform. Math::RigidTransform3d m_transform; /// The inverse of the pre-transform. Math::RigidTransform3d m_transformInverse; /// The scaling factor applied to each direction of the translation. double m_translationScale; }; }; // namespace Devices }; // namespace SurgSim #endif // SURGSIM_DEVICES_DEVICEFILTERS_POSETRANSFORM_H opensurgsim-0.7.0/SurgSim/Devices/DeviceFilters/RecordPose.cpp000066400000000000000000000050531277777236100243730ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Devices/DeviceFilters/RecordPose.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Math/RigidTransform.h" using SurgSim::DataStructures::DataGroup; using SurgSim::Math::RigidTransform3d; namespace SurgSim { namespace Devices { SURGSIM_REGISTER(SurgSim::Input::DeviceInterface, SurgSim::Devices::RecordPose, RecordPose); RecordPose::RecordPose(const std::string& name) : DeviceFilter(name), m_cumulativeTime(0), m_fileName("ReplayPoseDevice.txt") { SURGSIM_ADD_SERIALIZABLE_PROPERTY(RecordPose, std::string, FileName, getFileName, setFileName); m_timer.setMaxNumberOfFrames(1); m_timer.start(); } RecordPose::~RecordPose() { if (m_outputFile.is_open()) { m_outputFile.close(); } } void RecordPose::setFileName(const std::string& fileName) { m_fileName = fileName; } const std::string& RecordPose::getFileName() const { return m_fileName; } void RecordPose::initializeInput(const std::string& device, const DataStructures::DataGroup& inputData) { if (!m_outputFile.is_open()) { m_outputFile.open(m_fileName, std::ios::out | std::ios::trunc); if (!m_outputFile.is_open()) { SURGSIM_LOG_IF(!m_outputFile.is_open(), Framework::Logger::getLogger("Devices/RecordPose"), WARNING) << "File " << m_fileName << " could not be open to record device pose"; } } } void RecordPose::filterInput(const std::string& device, const DataGroup& dataToFilter, DataGroup* result) { *result = dataToFilter; if (m_outputFile.is_open()) { RigidTransform3d pose; if (dataToFilter.poses().get(DataStructures::Names::POSE, &pose)) { m_timer.markFrame(); m_cumulativeTime += m_timer.getLastFramePeriod(); // We back up the time along with the pose to make sure we can replay the motion real-time, no matter // which rate it is recorded and replayed. m_outputFile << m_cumulativeTime << std::endl << pose.matrix() << std::endl; } } } }; // namespace Devices }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Devices/DeviceFilters/RecordPose.h000066400000000000000000000046111277777236100240370ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DEVICES_DEVICEFILTERS_RECORDPOSE_H #define SURGSIM_DEVICES_DEVICEFILTERS_RECORDPOSE_H #include #include "SurgSim/Devices/DeviceFilters/DeviceFilter.h" #include "SurgSim/Framework/Timer.h" namespace SurgSim { namespace Devices { SURGSIM_STATIC_REGISTRATION(RecordPose); /// An input device filter that record the input pose along with the relative time. All entries in the DataGroup are /// passed through. For convenience, it is also an OutputProducerInterface that does no filtering of the ouput data. class RecordPose : public DeviceFilter { public: /// Constructor. /// \param name Name of this device filter. explicit RecordPose(const std::string& name); /// Desctructor ~RecordPose(); /// \param fileName The filename to record the pose/time to (default is empty string) void setFileName(const std::string& fileName); /// \return The filename where the pose/time are recorded (default is empty string) const std::string& getFileName() const; void initializeInput(const std::string& device, const DataStructures::DataGroup& inputData) override; SURGSIM_CLASSNAME(SurgSim::Devices::RecordPose); private: void filterInput(const std::string& device, const DataStructures::DataGroup& dataToFilter, DataStructures::DataGroup* result) override; /// Timer to keep the recording real-time Framework::Timer m_timer; /// Cumulative time elapsed since the timer started (on creation of the instance, in ctor) double m_cumulativeTime; /// Filename where the poses will be recorded std::string m_fileName; /// Output stream to the file 'm_fileName', the entire content is replaced at each run std::ofstream m_outputFile; }; }; // namespace Devices }; // namespace SurgSim #endif // SURGSIM_DEVICES_DEVICEFILTERS_RECORDPOSE_H opensurgsim-0.7.0/SurgSim/Devices/DeviceFilters/UnitTests/000077500000000000000000000000001277777236100235615ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Devices/DeviceFilters/UnitTests/BoolToScalarTest.cpp000066400000000000000000000161531277777236100274570ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include #include #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/DataStructures/DataGroupBuilder.h" #include "SurgSim/Devices/DeviceFilters/BoolToScalar.h" #include "SurgSim/Input/CommonDevice.h" #include "SurgSim/Math/Matrix.h" #include "SurgSim/Testing/MockInputOutput.h" namespace SurgSim { namespace Devices { using DataStructures::Names::BUTTON_0; using DataStructures::Names::BUTTON_1; using DataStructures::Names::BUTTON_2; using DataStructures::Names::TOOLDOF; class BoolToScalarFilterTest : public testing::Test { public: void SetUp() { // values for default buttons builder.addBoolean(BUTTON_1); builder.addBoolean(BUTTON_2); builder.addScalar(TOOLDOF); defaultData = builder.createData(); } DataStructures::DataGroupBuilder builder; DataStructures::DataGroup defaultData; }; TEST_F(BoolToScalarFilterTest, GeneralSetters) { auto filter = std::make_shared("Filter"); filter->setValue("Scalar", 0.5); EXPECT_DOUBLE_EQ(0.5, filter->getValue("Scalar")); filter->setValue("Scale", 4.0); EXPECT_DOUBLE_EQ(4.0, filter->getValue("Scale")); filter->setValue("Clamping", false); EXPECT_EQ(false, filter->getValue("Clamping")); filter->setValue("IncreaseField", std::string("IncreaseField")); EXPECT_EQ("IncreaseField", filter->getValue("IncreaseField")); filter->setValue("DecreaseField", "DecreaseField"); EXPECT_EQ("DecreaseField", filter->getValue("DecreaseField")); filter->setValue("TargetField", "TargetField"); EXPECT_EQ("TargetField", filter->getValue("TargetField")); } TEST_F(BoolToScalarFilterTest, SetRange) { auto filter = std::make_shared("Filter"); auto expectedRange = std::make_pair(5.0, 6.0); filter->setValue("Range", expectedRange); auto resultRange = filter->getValue>("Range"); EXPECT_DOUBLE_EQ(expectedRange.first, resultRange.first); EXPECT_DOUBLE_EQ(expectedRange.second, resultRange.second); // Reverse the range if it's [max, min] auto inputRange = std::make_pair(10.0, 1.0); expectedRange = std::make_pair(1.0, 10.0); filter->setRange(inputRange); resultRange = filter->getRange(); EXPECT_DOUBLE_EQ(expectedRange.first, resultRange.first); EXPECT_DOUBLE_EQ(expectedRange.second, resultRange.second); } TEST_F(BoolToScalarFilterTest, DataGroupHandling) { { SCOPED_TRACE("Valid Data"); auto filter = std::make_shared("Filter"); EXPECT_NO_THROW(filter->initializeInput("device", defaultData)); } { SCOPED_TRACE("Invalid IncreaseField"); auto filter = std::make_shared("Filter"); filter->setIncreaseField("wrongIncrease"); EXPECT_ANY_THROW(filter->initializeInput("device", defaultData)); } { SCOPED_TRACE("Invalid DecreaseField"); auto filter = std::make_shared("Filter"); filter->setDecreaseField("wrongDecrease"); EXPECT_ANY_THROW(filter->initializeInput("device", defaultData)); } { SCOPED_TRACE("Append Target"); DataStructures::DataGroupBuilder builder; builder.addBoolean(BUTTON_1); builder.addBoolean(BUTTON_2); auto data = builder.createData(); auto filter = std::make_shared("Filter"); EXPECT_NO_THROW(filter->initializeInput("device", data)); } } TEST_F(BoolToScalarFilterTest, UpdateTest) { const double epsilon = 0.05; auto filter = std::make_shared("Filter"); filter->setScale(2.0); auto resultData = defaultData; defaultData.booleans().set(BUTTON_1, false); defaultData.booleans().set(BUTTON_2, true); double value; filter->initializeInput("device", defaultData); // Running .25 of a second we expect the value to go up .. by at least 0.25 * 2 (scale) boost::this_thread::sleep(boost::posix_time::milliseconds(250)); filter->filterInput("device", defaultData, &resultData); resultData.scalars().get(TOOLDOF, &value); EXPECT_LT(0.5 - epsilon, value); // Switiching the buttons, running for .125 of a second so the value should go down by at least 0.125 * 2 (scale) defaultData.booleans().set(BUTTON_1, true); defaultData.booleans().set(BUTTON_2, false); // prevent accumulated error in the test filter->setScalar(0.5); boost::this_thread::sleep(boost::posix_time::milliseconds(125)); filter->filterInput("device", defaultData, &resultData); resultData.scalars().get(TOOLDOF, &value); EXPECT_GT(0.25 + epsilon, value); } TEST_F(BoolToScalarFilterTest, ClampTest) { auto filter = std::make_shared("Filter"); filter->setScale(10.0); auto resultData = defaultData; defaultData.booleans().set(BUTTON_1, false); defaultData.booleans().set(BUTTON_2, true); double value; filter->initializeInput("device", defaultData); // Running .25 of a second we expect the value to go up .. by 0.25 * 10 (scale) // but it's clamped to [0,1] boost::this_thread::sleep(boost::posix_time::milliseconds(250)); filter->filterInput("device", defaultData, &resultData); resultData.scalars().get(TOOLDOF, &value); EXPECT_DOUBLE_EQ(1.0, value); // Switiching the buttons, running for .25 of a second so the value should go down by 0.25 * 10 (scale) // but it's clamped to [0,1] defaultData.booleans().set(BUTTON_1, true); defaultData.booleans().set(BUTTON_2, false); boost::this_thread::sleep(boost::posix_time::milliseconds(250)); filter->filterInput("device", defaultData, &resultData); resultData.scalars().get(TOOLDOF, &value); EXPECT_DOUBLE_EQ(0.0, value); } TEST_F(BoolToScalarFilterTest, UnClampedTest) { auto filter = std::make_shared("Filter"); filter->setScale(10.0); filter->setClamping(false); auto resultData = defaultData; defaultData.booleans().set(BUTTON_1, false); defaultData.booleans().set(BUTTON_2, true); double value; filter->initializeInput("device", defaultData); // Running .25 of a second we expect the value to go up .. by 0.25 * 10 (scale) // but it's not clamped boost::this_thread::sleep(boost::posix_time::milliseconds(250)); filter->filterInput("device", defaultData, &resultData); resultData.scalars().get(TOOLDOF, &value); EXPECT_TRUE(value > 2.0); // Switiching the buttons, running for .25 of a second so the value should go down by 0.25 * 10 (scale) // but it's clamped to [0,]1 filter->setScalar(0.5); defaultData.booleans().set(BUTTON_1, true); defaultData.booleans().set(BUTTON_2, false); boost::this_thread::sleep(boost::posix_time::milliseconds(250)); filter->filterInput("device", defaultData, &resultData); resultData.scalars().get(TOOLDOF, &value); EXPECT_TRUE(value < 0.0); } } } opensurgsim-0.7.0/SurgSim/Devices/DeviceFilters/UnitTests/CMakeLists.txt000066400000000000000000000024261277777236100263250ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2012-2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. include_directories( ${gtest_SOURCE_DIR}/include ) set(UNIT_TEST_SOURCES BoolToScalarTest.cpp DeviceFilterTest.cpp FilteredDeviceTest.cpp ForceScaleTest.cpp PoseIntegratorTest.cpp PoseTransformTest.cpp ) set(LIBS SurgSimDataStructures SurgSimDevices SurgSimFramework SurgSimInput SurgSimMath ${Boost_LIBRARIES} ) surgsim_add_unit_tests(SurgSimDeviceFiltersTest) set_target_properties(SurgSimDeviceFiltersTest PROPERTIES FOLDER "Devices") file(COPY Data DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) # Configure the path for the data files configure_file( "${CMAKE_CURRENT_SOURCE_DIR}/config.txt.in" "${CMAKE_CURRENT_BINARY_DIR}/config.txt" ) opensurgsim-0.7.0/SurgSim/Devices/DeviceFilters/UnitTests/Data/000077500000000000000000000000001277777236100244325ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Devices/DeviceFilters/UnitTests/Data/FilteredDevice.yaml000066400000000000000000000005701277777236100301760ustar00rootroot00000000000000- SurgSim::Devices::FilteredDevice: Name: ConstantPose Devices: - SurgSim::Devices::IdentityPoseDevice: Name: Identity - SurgSim::Devices::PoseTransform: Name: Transform TranslationScale: 3.4 Transform: Quaternion: {Angle: 12.3, Axis: [0.5, 0.5, 0.0]} Translation: [7.8, 8.9, 9.0] opensurgsim-0.7.0/SurgSim/Devices/DeviceFilters/UnitTests/Data/PoseTransform.yaml000066400000000000000000000003001277777236100301110ustar00rootroot00000000000000- SurgSim::Devices::PoseTransform: Name: Transform TranslationScale: 3.4 Transform: Quaternion: {Angle: 12.3, Axis: [0.5, 0.5, 0.0]} Translation: [7.8, 8.9, 9.0] opensurgsim-0.7.0/SurgSim/Devices/DeviceFilters/UnitTests/DeviceFilterTest.cpp000066400000000000000000000061011277777236100274700ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the DeviceFilter class. #include #include #include #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/DataStructures/DataGroupBuilder.h" #include "SurgSim/Devices/DeviceFilters/DeviceFilter.h" #include "SurgSim/Testing/MockInputOutput.h" using SurgSim::DataStructures::DataGroup; using SurgSim::DataStructures::DataGroupBuilder; using SurgSim::Devices::DeviceFilter; using SurgSim::Testing::MockInputOutput; /// Exposes protected members of CommonDevice. class MockDeviceFilter : public DeviceFilter { public: explicit MockDeviceFilter(const std::string& name) : DeviceFilter(name) { } SurgSim::DataStructures::DataGroup& doGetInputData() { return getInputData(); } }; TEST(DeviceFilterTest, InputDataFilter) { auto filter = std::make_shared("filter"); ASSERT_TRUE(filter->initialize()); DataGroupBuilder builder; std::string scalarName = "scalar"; builder.addScalar(scalarName); DataGroup data = builder.createData(); const double initialScalar = 17.3; data.scalars().set(scalarName, initialScalar); // Normally the input device's initial input data would be set by the constructor or scaffold, then // initializeInput would be called in addInputConsumer. filter->initializeInput("device", data); DataGroup actualInputData = filter->doGetInputData(); double actualScalar; ASSERT_TRUE(actualInputData.scalars().get(scalarName, &actualScalar)); EXPECT_EQ(initialScalar, actualScalar); } TEST(DeviceFilterTest, OutputDataFilter) { auto filter = std::make_shared("filter"); ASSERT_TRUE(filter->initialize()); DataGroupBuilder builder; std::string scalarName = "scalar"; builder.addScalar(scalarName); DataGroup data = builder.createData(); const double initialScalar = 17.3; data.scalars().set(scalarName, initialScalar); // Normally the data would be set by a behavior, then the output device scaffold would call requestOutput on the // filter, which would call requestOutput on the OutputComponent. auto producer = std::make_shared(); producer->m_output.setValue(data); // The OutputProducer sends data out to the filter, which sends data out to the device. filter->setOutputProducer(producer); DataGroup actualData; ASSERT_TRUE(filter->requestOutput("device", &actualData)); double actualScalar; ASSERT_TRUE(actualData.scalars().get(scalarName, &actualScalar)); EXPECT_EQ(initialScalar, actualScalar); } opensurgsim-0.7.0/SurgSim/Devices/DeviceFilters/UnitTests/FilteredDeviceTest.cpp000066400000000000000000000123661277777236100300130ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the FilteredDevice class. #include #include #include #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/DataStructures/DataGroupBuilder.h" #include "SurgSim/Devices/Devices.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Testing/MockInputOutput.h" using SurgSim::DataStructures::DataGroup; using SurgSim::DataStructures::DataGroupBuilder; using SurgSim::Devices::FilteredDevice; using SurgSim::Testing::MockInputOutput; TEST(FilteredDeviceTest, WithFilters) { std::string name = "device"; auto filteredDevice = std::make_shared(name); EXPECT_EQ(name, filteredDevice->getName()); ASSERT_FALSE(filteredDevice->initialize()); auto inputOutput = std::make_shared(); EXPECT_FALSE(filteredDevice->addInputConsumer(inputOutput)); EXPECT_FALSE(filteredDevice->removeInputConsumer(inputOutput)); EXPECT_FALSE(filteredDevice->setOutputProducer(inputOutput)); EXPECT_FALSE(filteredDevice->removeOutputProducer(inputOutput)); ASSERT_ANY_THROW(filteredDevice->setDevice(nullptr)); std::string subDeviceName = "identity"; ASSERT_NO_THROW(filteredDevice->setDevice(std::make_shared(subDeviceName))); ASSERT_ANY_THROW(filteredDevice->addFilter(nullptr)); filteredDevice->addFilter(std::make_shared("filter1")); filteredDevice->addFilter(std::make_shared("filter2")); EXPECT_TRUE(filteredDevice->initialize()); EXPECT_ANY_THROW(filteredDevice->initialize()); EXPECT_ANY_THROW(filteredDevice->setDevice(std::make_shared("identity2"))); EXPECT_ANY_THROW(filteredDevice->addFilter(std::make_shared("filter3"))); EXPECT_TRUE(filteredDevice->addInputConsumer(inputOutput)); EXPECT_TRUE(filteredDevice->removeInputConsumer(inputOutput)); EXPECT_TRUE(filteredDevice->setOutputProducer(inputOutput)); EXPECT_TRUE(filteredDevice->hasOutputProducer()); EXPECT_TRUE(filteredDevice->removeOutputProducer(inputOutput)); EXPECT_FALSE(filteredDevice->hasOutputProducer()); } TEST(FilteredDeviceTest, GetSetDevices) { std::vector> devices; std::string subDeviceName = "identity"; devices.push_back(std::make_shared(subDeviceName)); devices.push_back(std::make_shared("filter1")); devices.push_back(std::make_shared("filter2")); auto filteredDevice = std::make_shared("device"); ASSERT_NO_THROW(filteredDevice->setDevices(devices)); EXPECT_TRUE(filteredDevice->initialize()); ASSERT_ANY_THROW(filteredDevice->setDevices(devices)); auto actualDevices = filteredDevice->getDevices(); EXPECT_EQ(3, devices.size()); EXPECT_EQ(subDeviceName, devices[0]->getName()); EXPECT_EQ("SurgSim::Devices::IdentityPoseDevice", devices[0]->getClassName()); } TEST(FilteredDeviceTest, NoFilters) { auto filteredDevice = std::make_shared("device"); ASSERT_NO_THROW(filteredDevice->setDevice(std::make_shared("identity"))); auto inputOutput = std::make_shared(); EXPECT_TRUE(filteredDevice->addInputConsumer(inputOutput)); EXPECT_TRUE(filteredDevice->setOutputProducer(inputOutput)); EXPECT_TRUE(filteredDevice->initialize()); EXPECT_TRUE(filteredDevice->hasOutputProducer()); EXPECT_TRUE(filteredDevice->removeInputConsumer(inputOutput)); EXPECT_TRUE(filteredDevice->removeOutputProducer(inputOutput)); EXPECT_FALSE(filteredDevice->hasOutputProducer()); } TEST(FilteredDeviceTest, Serialization) { auto runtime = std::make_shared("config.txt"); std::shared_ptr device; ASSERT_NO_THROW(device = SurgSim::Devices::loadDevice("FilteredDevice.yaml")); ASSERT_NE(nullptr, device); auto typedDevice = std::dynamic_pointer_cast(device); ASSERT_NE(nullptr, typedDevice); auto input = std::make_shared(); ASSERT_TRUE(device->addInputConsumer(input)); SurgSim::Math::RigidTransform3d pose; ASSERT_TRUE(input->m_lastReceivedInput.poses().get(SurgSim::DataStructures::Names::POSE, &pose)); Eigen::AngleAxisd angleAxis; angleAxis.angle() = 12.3; angleAxis.axis() = SurgSim::Math::Vector3d(0.5, 0.5, 0.0); SurgSim::Math::Vector3d translation = SurgSim::Math::Vector3d(7.8, 8.9, 9.0); SurgSim::Math::RigidTransform3d expectedTransform = SurgSim::Math::makeRigidTransform(SurgSim::Math::Quaterniond(angleAxis), translation); EXPECT_TRUE(pose.isApprox(expectedTransform)); }opensurgsim-0.7.0/SurgSim/Devices/DeviceFilters/UnitTests/ForceScaleTest.cpp000066400000000000000000000226451277777236100271440ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the forceScale class. #include #include #include #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/DataStructures/DataGroupBuilder.h" #include "SurgSim/Devices/DeviceFilters/ForceScale.h" #include "SurgSim/Input/CommonDevice.h" #include "SurgSim/Math/Matrix.h" #include "SurgSim/Testing/MockInputOutput.h" using SurgSim::DataStructures::DataGroup; using SurgSim::DataStructures::DataGroupBuilder; using SurgSim::Devices::ForceScale; using SurgSim::Input::CommonDevice; using SurgSim::Math::Matrix66d; using SurgSim::Math::Vector3d; using SurgSim::Testing::MockInputOutput; namespace { const double ERROR_EPSILON = 1e-7; } /// Exposes protected members of CommonDevice. class MockForceScale : public ForceScale { public: explicit MockForceScale(const std::string& name) : ForceScale(name) { } SurgSim::DataStructures::DataGroup& doGetInputData() { return getInputData(); } }; TEST(ForceScaleDeviceFilterTest, InputDataFilter) { auto forceScaler = std::make_shared("ForceScaleFilter"); ASSERT_TRUE(forceScaler->initialize()); DataGroupBuilder builder; builder.addVector(SurgSim::DataStructures::Names::LINEAR_VELOCITY); DataGroup data = builder.createData(); data.vectors().set(SurgSim::DataStructures::Names::LINEAR_VELOCITY, Vector3d(5.0, 6.0, 7.0)); // Normally the input device's initial input data would be set by the constructor or scaffold, then // initializeInput would be called in addInputConsumer. forceScaler->initializeInput("device", data); // The ForceScale device filter should pass through the input data unchanged. DataGroup actualInputData = forceScaler->doGetInputData(); Vector3d actualLinearVelocity; ASSERT_TRUE(actualInputData.vectors().get(SurgSim::DataStructures::Names::LINEAR_VELOCITY, &actualLinearVelocity)); EXPECT_TRUE(actualLinearVelocity.isApprox(Vector3d(5.0, 6.0, 7.0), ERROR_EPSILON)); } TEST(ForceScaleDeviceFilterTest, OutputDataFilterDefaultScaling) { auto forceScaler = std::make_shared("ForceScaleFilter"); ASSERT_TRUE(forceScaler->initialize()); DataGroupBuilder builder; builder.addVector(SurgSim::DataStructures::Names::FORCE); builder.addVector(SurgSim::DataStructures::Names::TORQUE); builder.addMatrix(SurgSim::DataStructures::Names::SPRING_JACOBIAN); builder.addMatrix(SurgSim::DataStructures::Names::DAMPER_JACOBIAN); builder.addBoolean("extraData"); DataGroup data = builder.createData(); const Vector3d initialForce(1.0, 2.5, -13.8); data.vectors().set(SurgSim::DataStructures::Names::FORCE, initialForce); const Vector3d initialTorque(-7.0, 5.0, -1.2); data.vectors().set(SurgSim::DataStructures::Names::TORQUE, initialTorque); Matrix66d initialSpringJacobian; initialSpringJacobian << 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8; data.matrices().set(SurgSim::DataStructures::Names::SPRING_JACOBIAN, initialSpringJacobian); Matrix66d initialDamperJacobian; initialDamperJacobian << 0.91, 0.82, 0.73, 0.64, 0.55, 0.46, 0.37, 0.28, 0.19, 11.0, 21.1, 31.2, 41.3, 51.4, 61.5, 71.6, 81.7, 91.8, 0.91, 0.82, 0.73, 0.64, 0.55, 0.46, 0.37, 0.28, 0.19, 11.0, 21.1, 31.2, 41.3, 51.4, 61.5, 71.6, 81.7, 91.8; data.matrices().set(SurgSim::DataStructures::Names::DAMPER_JACOBIAN, initialDamperJacobian); const bool initialBoolean = true; data.booleans().set("extraData", initialBoolean); // Normally the data would be set by a behavior, then the output device scaffold would call requestOutput on the // filter, which would call requestOutput on the OutputComponent. auto producer = std::make_shared(); producer->m_output.setValue(data); // The OutputProducer sends data out to the filter, which sends data out to the device. forceScaler->setOutputProducer(producer); DataGroup actualData; ASSERT_TRUE(forceScaler->requestOutput("device", &actualData)); // Check the default scaling. Should be identity. Vector3d actualForce; ASSERT_TRUE(actualData.vectors().get(SurgSim::DataStructures::Names::FORCE, &actualForce)); EXPECT_TRUE(actualForce.isApprox(initialForce, ERROR_EPSILON)); Vector3d actualTorque; ASSERT_TRUE(actualData.vectors().get(SurgSim::DataStructures::Names::TORQUE, &actualTorque)); EXPECT_TRUE(actualTorque.isApprox(initialTorque, ERROR_EPSILON)); SurgSim::DataStructures::DataGroup::DynamicMatrixType actualSpringJacobian; ASSERT_TRUE(actualData.matrices().get(SurgSim::DataStructures::Names::SPRING_JACOBIAN, &actualSpringJacobian)); EXPECT_TRUE(actualSpringJacobian.isApprox(initialSpringJacobian, ERROR_EPSILON)); SurgSim::DataStructures::DataGroup::DynamicMatrixType actualDamperJacobian; ASSERT_TRUE(actualData.matrices().get(SurgSim::DataStructures::Names::DAMPER_JACOBIAN, &actualDamperJacobian)); EXPECT_TRUE(actualDamperJacobian.isApprox(initialDamperJacobian, ERROR_EPSILON)); // Other data should pass through. bool actualBoolean; ASSERT_TRUE(actualData.booleans().get("extraData", &actualBoolean)); EXPECT_EQ(actualBoolean, initialBoolean); } TEST(ForceScaleDeviceFilterTest, OutputDataFilter) { auto forceScaler = std::make_shared("ForceScaleFilter"); ASSERT_TRUE(forceScaler->initialize()); DataGroupBuilder builder; builder.addVector(SurgSim::DataStructures::Names::FORCE); builder.addVector(SurgSim::DataStructures::Names::TORQUE); builder.addMatrix(SurgSim::DataStructures::Names::SPRING_JACOBIAN); builder.addMatrix(SurgSim::DataStructures::Names::DAMPER_JACOBIAN); builder.addBoolean("extraData"); DataGroup data = builder.createData(); data.vectors().set(SurgSim::DataStructures::Names::FORCE, Vector3d(1.0, 2.5, -13.8)); data.vectors().set(SurgSim::DataStructures::Names::TORQUE, Vector3d(-7.0, 5.0, -1.2)); Matrix66d springJacobian; springJacobian << 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8; data.matrices().set(SurgSim::DataStructures::Names::SPRING_JACOBIAN, springJacobian); Matrix66d damperJacobian; damperJacobian << 0.91, 0.82, 0.73, 0.64, 0.55, 0.46, 0.37, 0.28, 0.19, 11.0, 21.1, 31.2, 41.3, 51.4, 61.5, 71.6, 81.7, 91.8, 0.91, 0.82, 0.73, 0.64, 0.55, 0.46, 0.37, 0.28, 0.19, 11.0, 21.1, 31.2, 41.3, 51.4, 61.5, 71.6, 81.7, 91.8; data.matrices().set(SurgSim::DataStructures::Names::DAMPER_JACOBIAN, damperJacobian); data.booleans().set("extraData", true); // Normally the data would be set by a behavior, then the output device scaffold would call requestOutput on the // filter, which would call requestOutput on the OutputComponent. auto producer = std::make_shared(); producer->m_output.setValue(data); // The OutputProducer sends data out to the filter, which sends data out to the device. forceScaler->setForceScale(10.0); forceScaler->setTorqueScale(0.1); forceScaler->setOutputProducer(producer); DataGroup actualData; ASSERT_TRUE(forceScaler->requestOutput("device", &actualData)); // Check the scaling. Vector3d actualForce; ASSERT_TRUE(actualData.vectors().get(SurgSim::DataStructures::Names::FORCE, &actualForce)); Vector3d expectedForce; expectedForce << 10.0, 25.0, -138.0; EXPECT_TRUE(actualForce.isApprox(expectedForce, ERROR_EPSILON)); Vector3d actualTorque; ASSERT_TRUE(actualData.vectors().get(SurgSim::DataStructures::Names::TORQUE, &actualTorque)); Vector3d expectedTorque; expectedTorque << -0.7, 0.5, -0.12; EXPECT_TRUE(actualTorque.isApprox(expectedTorque, ERROR_EPSILON)); SurgSim::DataStructures::DataGroup::DynamicMatrixType actualSpringJacobian; ASSERT_TRUE(actualData.matrices().get(SurgSim::DataStructures::Names::SPRING_JACOBIAN, &actualSpringJacobian)); Matrix66d expectedSpringJacobian; expectedSpringJacobian << 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.1, 0.11, 0.12, 0.13, 0.14, 0.15, 0.16, 0.17, 0.18; EXPECT_TRUE(actualSpringJacobian.isApprox(expectedSpringJacobian, ERROR_EPSILON)); SurgSim::DataStructures::DataGroup::DynamicMatrixType actualDamperJacobian; ASSERT_TRUE(actualData.matrices().get(SurgSim::DataStructures::Names::DAMPER_JACOBIAN, &actualDamperJacobian)); Matrix66d expectedDamperJacobian; expectedDamperJacobian << 9.1, 8.2, 7.3, 6.4, 5.5, 4.6, 3.7, 2.8, 1.9, 110.0, 211.0, 312.0, 413.0, 514.0, 615.0, 716.0, 817.0, 918.0, 0.091, 0.082, 0.073, 0.064, 0.055, 0.046, 0.037, 0.028, 0.019, 1.10, 2.11, 3.12, 4.13, 5.14, 6.15, 7.16, 8.17, 9.18; EXPECT_TRUE(actualDamperJacobian.isApprox(expectedDamperJacobian, ERROR_EPSILON)); // Other data should pass through. bool actualBoolean; ASSERT_TRUE(actualData.booleans().get("extraData", &actualBoolean)); EXPECT_EQ(actualBoolean, true); } opensurgsim-0.7.0/SurgSim/Devices/DeviceFilters/UnitTests/PoseIntegratorTest.cpp000066400000000000000000000277641277777236100301120ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the PoseIntegrator class. #include #include #include #include #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/DataStructures/DataGroupBuilder.h" #include "SurgSim/Devices/DeviceFilters/PoseIntegrator.h" #include "SurgSim/Input/CommonDevice.h" #include "SurgSim/Math/Matrix.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Testing/MockInputOutput.h" using SurgSim::DataStructures::DataGroup; using SurgSim::DataStructures::DataGroupBuilder; using SurgSim::Devices::PoseIntegrator; using SurgSim::Input::CommonDevice; using SurgSim::Math::makeRigidTransform; using SurgSim::Math::makeRotationQuaternion; using SurgSim::Math::RigidTransform3d; using SurgSim::Math::Vector3d; using SurgSim::Testing::MockInputOutput; namespace { const double ERROR_EPSILON = 1e-7; /// Exposes protected members of CommonDevice. class MockPoseIntegrator : public PoseIntegrator { public: explicit MockPoseIntegrator(const std::string& name) : PoseIntegrator(name) { } SurgSim::DataStructures::DataGroup& doGetInputData() { return getInputData(); } }; void TestInputDataGroup(const DataGroup& actualData, const DataGroup& expectedData) { RigidTransform3d actualPose; ASSERT_TRUE(actualData.poses().get(SurgSim::DataStructures::Names::POSE, &actualPose)); RigidTransform3d expectedPose; ASSERT_TRUE(expectedData.poses().get(SurgSim::DataStructures::Names::POSE, &expectedPose)); EXPECT_TRUE(actualPose.isApprox(expectedPose, ERROR_EPSILON)); Vector3d actualLinearVelocity; ASSERT_TRUE(actualData.vectors().get(SurgSim::DataStructures::Names::LINEAR_VELOCITY, &actualLinearVelocity)); Vector3d expectedLinearVelocity; ASSERT_TRUE(expectedData.vectors().get(SurgSim::DataStructures::Names::LINEAR_VELOCITY, &expectedLinearVelocity)); EXPECT_TRUE(actualLinearVelocity.isApprox(expectedLinearVelocity, ERROR_EPSILON)); Vector3d actualAngularVelocity; ASSERT_TRUE(actualData.vectors().get(SurgSim::DataStructures::Names::ANGULAR_VELOCITY, &actualAngularVelocity)); Vector3d expectedAngularVelocity; ASSERT_TRUE(expectedData.vectors().get(SurgSim::DataStructures::Names::ANGULAR_VELOCITY, &expectedAngularVelocity)); EXPECT_TRUE(actualAngularVelocity.isApprox(expectedAngularVelocity, ERROR_EPSILON)); bool actualBoolean; ASSERT_TRUE(actualData.booleans().get("extraData", &actualBoolean)); bool expectedBoolean; ASSERT_TRUE(expectedData.booleans().get("extraData", &expectedBoolean)); EXPECT_EQ(expectedBoolean, actualBoolean); } }; // If the Device being filtered does not provide the linear and/or angular velocity vectors in its DataGroup, the // PoseIntegrator adds them. TEST(PoseIntegratorDeviceFilterTest, AddVelocityDataEntries) { auto integrator = std::make_shared("PoseIntegratorFilter"); ASSERT_TRUE(integrator->initialize()); DataGroupBuilder builder; builder.addPose(SurgSim::DataStructures::Names::POSE); builder.addVector("someVector"); builder.addBoolean("extraData"); DataGroup data = builder.createData(); const double rotationAngle = 0.1; const Vector3d rotationAxis = Vector3d::UnitX(); const Vector3d translation(2.0, 3.0, 4.0); const RigidTransform3d pose = makeRigidTransform(makeRotationQuaternion(rotationAngle, rotationAxis), translation); data.poses().set(SurgSim::DataStructures::Names::POSE, pose); const Vector3d expectedVector(24.0, -3.2, 0.0); data.vectors().set("someVector", expectedVector); const bool expectedBoolean = true; data.booleans().set("extraData", expectedBoolean); { // Test the code-path in initializeInput when the filter has to add entries. // Normally the input device's initial input data would be set by the constructor or scaffold, then // initializeInput would be called in addInputConsumer. integrator->initializeInput("device", data); const DataGroup actualInputData = integrator->doGetInputData(); // Test that the velocity entries were added EXPECT_TRUE(actualInputData.vectors().hasEntry(SurgSim::DataStructures::Names::LINEAR_VELOCITY)); EXPECT_TRUE(actualInputData.vectors().hasEntry(SurgSim::DataStructures::Names::ANGULAR_VELOCITY)); RigidTransform3d actualPose; ASSERT_TRUE(actualInputData.poses().get(SurgSim::DataStructures::Names::POSE, &actualPose)); EXPECT_TRUE(actualPose.isApprox(pose, ERROR_EPSILON)); Vector3d actualVector; ASSERT_TRUE(actualInputData.vectors().get("someVector", &actualVector)); EXPECT_TRUE(actualVector.isApprox(expectedVector, ERROR_EPSILON)); bool actualBoolean; ASSERT_TRUE(actualInputData.booleans().get("extraData", &actualBoolean)); EXPECT_EQ(expectedBoolean, actualBoolean); } const RigidTransform3d newPose = pose.inverse(); data.poses().set(SurgSim::DataStructures::Names::POSE, newPose); const Vector3d newVector = Vector3d(-0.77, 3.9, 99.0); data.vectors().set("someVector", newVector); const bool newBoolean = !expectedBoolean; data.booleans().set("extraData", newBoolean); { // Test that the code-path through handleInput if the filter had to add entries...did it correctly pass data. // The InputDataFilter test checks for correctness of the pose and velocity entries. integrator->handleInput("device", data); const DataGroup actualInputData = integrator->doGetInputData(); Vector3d actualVector; ASSERT_TRUE(actualInputData.vectors().get("someVector", &actualVector)); EXPECT_TRUE(actualVector.isApprox(newVector, ERROR_EPSILON)); bool actualBoolean; ASSERT_TRUE(actualInputData.booleans().get("extraData", &actualBoolean)); EXPECT_EQ(newBoolean, actualBoolean); } }; TEST(PoseIntegratorDeviceFilterTest, InputDataFilter) { auto integrator = std::make_shared("PoseIntegratorFilter"); EXPECT_NO_THROW(integrator->setReset(SurgSim::DataStructures::Names::BUTTON_1)); ASSERT_TRUE(integrator->initialize()); DataGroupBuilder builder; builder.addPose(SurgSim::DataStructures::Names::POSE); builder.addVector(SurgSim::DataStructures::Names::LINEAR_VELOCITY); builder.addVector(SurgSim::DataStructures::Names::ANGULAR_VELOCITY); builder.addBoolean("extraData"); builder.addBoolean(SurgSim::DataStructures::Names::BUTTON_1); DataGroup data = builder.createData(); const double rotationAngle = 0.1; const Vector3d rotationAxis = Vector3d::UnitX(); const Vector3d translation(2.0, 3.0, 4.0); const RigidTransform3d pose = makeRigidTransform(makeRotationQuaternion(rotationAngle, rotationAxis), translation); data.poses().set(SurgSim::DataStructures::Names::POSE, pose); data.vectors().set(SurgSim::DataStructures::Names::LINEAR_VELOCITY, Vector3d(5.0, 6.0, 7.0)); data.vectors().set(SurgSim::DataStructures::Names::ANGULAR_VELOCITY, Vector3d(8.0, 9.0, 10.0)); data.booleans().set("extraData", true); // Normally the input device's initial input data would be set by the constructor or scaffold, then // initializeInput would be called in addInputConsumer. integrator->initializeInput("device", data); EXPECT_ANY_THROW(integrator->setReset(SurgSim::DataStructures::Names::BUTTON_2)); // After initialization, before the first handleInput, the initial and current input data should be the same. // There is no DataGroup::operator==, so we just test both DataGroups. { SCOPED_TRACE("Testing Initial Input Data."); // Normally the InputComponent (or another device filter) would have its handleInput called with the // PoseIntegrator's input data. DataGroup actualInputData = integrator->doGetInputData(); TestInputDataGroup(actualInputData, data); } { SCOPED_TRACE("Testing Input Data, before first HandleInput."); DataGroup actualInputData = integrator->doGetInputData(); TestInputDataGroup(actualInputData, data); } // Now test integration and velocity calculation. // Normally the input device would PushInput, which would call the filter's handleInput. boost::this_thread::sleep(boost::posix_time::millisec(100)); integrator->handleInput("device", data); DataGroup expectedData = builder.createData(); // The "pose" data should have incremented its angle of rotation and its translation. RigidTransform3d expectedPose = makeRigidTransform(makeRotationQuaternion(2.0 * rotationAngle, rotationAxis), 2.0 * translation); expectedData.poses().set(SurgSim::DataStructures::Names::POSE, expectedPose); // The linearVelocity should be the translation (as a delta) times the rate. We don't know the rate, so we'll // back-calculate it from the linear velocity...then we'll make sure the same rate was used for both linear and // angular velocities. const DataGroup actualTransformedInputData = integrator->doGetInputData(); Vector3d actualLinearVelocity; ASSERT_TRUE(actualTransformedInputData.vectors().get(SurgSim::DataStructures::Names::LINEAR_VELOCITY, &actualLinearVelocity)); const double rate = actualLinearVelocity.norm() / translation.norm(); Vector3d actualAngularVelocity; ASSERT_TRUE(actualTransformedInputData.vectors().get(SurgSim::DataStructures::Names::ANGULAR_VELOCITY, &actualAngularVelocity)); ASSERT_NEAR(rate, actualAngularVelocity.norm() / rotationAngle, ERROR_EPSILON); Vector3d expectedLinearVelocity = translation * rate; expectedData.vectors().set(SurgSim::DataStructures::Names::LINEAR_VELOCITY, expectedLinearVelocity); // The angularVelocity should be the angleAxis (as a delta) times the rate. Vector3d expectedAngularVelocity = rotationAxis * rotationAngle * rate; expectedData.vectors().set(SurgSim::DataStructures::Names::ANGULAR_VELOCITY, expectedAngularVelocity); expectedData.booleans().set("extraData", true); { SCOPED_TRACE("Testing Input Data, after HandleInput."); TestInputDataGroup(actualTransformedInputData, expectedData); } // Reset the pose data.booleans().set(SurgSim::DataStructures::Names::BUTTON_1, true); integrator->handleInput("device", data); const DataGroup resetInputData = integrator->doGetInputData(); RigidTransform3d actualPose; ASSERT_TRUE(resetInputData.poses().get(SurgSim::DataStructures::Names::POSE, &actualPose)); EXPECT_TRUE(actualPose.isApprox(RigidTransform3d::Identity(), ERROR_EPSILON)); } TEST(PoseIntegratorDeviceFilterTest, OutputDataFilter) { auto integrator = std::make_shared("PoseIntegratorFilter"); ASSERT_TRUE(integrator->initialize()); DataGroupBuilder builder; builder.addPose(SurgSim::DataStructures::Names::POSE); builder.addBoolean("extraData"); DataGroup data = builder.createData(); const double rotationAngle = 0.1; const Vector3d rotationAxis = Vector3d::UnitX(); const Vector3d translation(2.0, 3.0, 4.0); const RigidTransform3d pose = makeRigidTransform(makeRotationQuaternion(rotationAngle, rotationAxis), translation); data.poses().set(SurgSim::DataStructures::Names::POSE, pose); data.booleans().set("extraData", true); // Normally the data would be set by a behavior, then the output device scaffold would call requestOutput on the // filter, which would call requestOutput on the OutputComponent. auto producer = std::make_shared(); producer->m_output.setValue(data); integrator->setOutputProducer(producer); DataGroup actualData; integrator->requestOutput("device", &actualData); // The PoseIntegrator should not alter output data. RigidTransform3d actualPose; ASSERT_TRUE(actualData.poses().get(SurgSim::DataStructures::Names::POSE, &actualPose)); EXPECT_TRUE(actualPose.isApprox(pose, ERROR_EPSILON)); bool actualBoolean; ASSERT_TRUE(actualData.booleans().get("extraData", &actualBoolean)); const bool expectedBoolean = true; EXPECT_EQ(expectedBoolean, actualBoolean); } opensurgsim-0.7.0/SurgSim/Devices/DeviceFilters/UnitTests/PoseTransformTest.cpp000066400000000000000000000333241277777236100277340ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the PoseTransform class. #include #include #include #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/DataStructures/DataGroupBuilder.h" #include "SurgSim/Devices/Devices.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Input/CommonDevice.h" #include "SurgSim/Input/DeviceInterface.h" #include "SurgSim/Math/Matrix.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Testing/MockInputOutput.h" using SurgSim::DataStructures::DataGroup; using SurgSim::DataStructures::DataGroupBuilder; using SurgSim::Devices::PoseTransform; using SurgSim::Input::CommonDevice; using SurgSim::Math::makeRigidTransform; using SurgSim::Math::makeRotationQuaternion; using SurgSim::Math::Matrix66d; using SurgSim::Math::RigidTransform3d; using SurgSim::Math::Vector3d; using SurgSim::Testing::MockInputOutput; namespace { const double ERROR_EPSILON = 1e-7; } /// Exposes protected members of CommonDevice. class MockPoseTransform : public PoseTransform { public: explicit MockPoseTransform(const std::string& name) : PoseTransform(name) { } SurgSim::DataStructures::DataGroup& doGetInputData() { return getInputData(); } }; void TestInputDataGroup(const DataGroup& actualData, const DataGroup& expectedData) { RigidTransform3d actualPose; ASSERT_TRUE(actualData.poses().get(SurgSim::DataStructures::Names::POSE, &actualPose)); RigidTransform3d expectedPose; ASSERT_TRUE(expectedData.poses().get(SurgSim::DataStructures::Names::POSE, &expectedPose)); EXPECT_TRUE(actualPose.isApprox(expectedPose, ERROR_EPSILON)); Vector3d actualLinearVelocity; ASSERT_TRUE(actualData.vectors().get(SurgSim::DataStructures::Names::LINEAR_VELOCITY, &actualLinearVelocity)); Vector3d expectedLinearVelocity; ASSERT_TRUE(expectedData.vectors().get(SurgSim::DataStructures::Names::LINEAR_VELOCITY, &expectedLinearVelocity)); EXPECT_TRUE(actualLinearVelocity.isApprox(expectedLinearVelocity, ERROR_EPSILON)); Vector3d actualAngularVelocity; ASSERT_TRUE(actualData.vectors().get(SurgSim::DataStructures::Names::ANGULAR_VELOCITY, &actualAngularVelocity)); Vector3d expectedAngularVelocity; ASSERT_TRUE(expectedData.vectors().get(SurgSim::DataStructures::Names::ANGULAR_VELOCITY, &expectedAngularVelocity)); EXPECT_TRUE(actualAngularVelocity.isApprox(expectedAngularVelocity, ERROR_EPSILON)); bool actualBoolean; ASSERT_TRUE(actualData.booleans().get("extraData", &actualBoolean)); bool expectedBoolean; ASSERT_TRUE(expectedData.booleans().get("extraData", &expectedBoolean)); EXPECT_EQ(expectedBoolean, actualBoolean); } TEST(PoseTransformDeviceFilterTest, InputDataFilter) { auto poseTransformer = std::make_shared("PoseTransformFilter"); ASSERT_TRUE(poseTransformer->initialize()); DataGroupBuilder builder; builder.addPose(SurgSim::DataStructures::Names::POSE); builder.addVector(SurgSim::DataStructures::Names::LINEAR_VELOCITY); builder.addVector(SurgSim::DataStructures::Names::ANGULAR_VELOCITY); builder.addBoolean("extraData"); DataGroup data = builder.createData(); RigidTransform3d pose = makeRigidTransform(makeRotationQuaternion(1.5, Vector3d(1.2, 5.6, 0.7).normalized()), Vector3d(2.0, 3.0, 4.0)); data.poses().set(SurgSim::DataStructures::Names::POSE, pose); data.vectors().set(SurgSim::DataStructures::Names::LINEAR_VELOCITY, Vector3d(5.0, 6.0, 7.0)); data.vectors().set(SurgSim::DataStructures::Names::ANGULAR_VELOCITY, Vector3d(8.0, 9.0, 10.0)); data.booleans().set("extraData", true); // Normally the input device's initial input data would be set by the constructor or scaffold, then // initializeInput would be called in addInputConsumer. poseTransformer->initializeInput("device", data); // After initialization, before the first handleInput, the input data should be unchanged. { SCOPED_TRACE("Testing Input Data, no transform or scaling."); // Normally the InputComponent (or another device filter) would have its handleInput called with the // PoseTransform's input data. DataGroup actualInputData = poseTransformer->doGetInputData(); TestInputDataGroup(actualInputData, data); } // Now test setting transform and scaling. RigidTransform3d transform = makeRigidTransform(makeRotationQuaternion(0.9, Vector3d(10.8, -7.6, 5.4)).normalized(), Vector3d(18.3, -12.6, 1.0)); poseTransformer->setTransform(transform); poseTransformer->setTranslationScale(3.7); // Normally the input device would PushInput, which would call the filter's handleInput. poseTransformer->handleInput("device", data); DataGroup expectedData = builder.createData(); // The "pose" data should have its translation scaled and be pre-transformed. RigidTransform3d expectedPose = makeRigidTransform(makeRotationQuaternion(2.4972022984476547, Vector3d(0.29211414245268102, -0.31582037986877071, 0.90273297017372756)), Vector3d(15.6146599514, -31.1502325138, -5.75927677405)); expectedData.poses().set(SurgSim::DataStructures::Names::POSE, expectedPose); // The linearVelocity should be scaled and rotated. Vector3d expectedLinearVelocity(-6.28155746782, -37.3676130859, -8.37278496308); expectedData.vectors().set(SurgSim::DataStructures::Names::LINEAR_VELOCITY, expectedLinearVelocity); // The angularVelocity should be rotated. Vector3d expectedAngularVelocity(-2.66966888839, -15.1851334211, -2.69899814922); expectedData.vectors().set(SurgSim::DataStructures::Names::ANGULAR_VELOCITY, expectedAngularVelocity); expectedData.booleans().set("extraData", true); { SCOPED_TRACE("Testing Input Data, with transform or scaling."); DataGroup actualTransformedInputData = poseTransformer->doGetInputData(); TestInputDataGroup(actualTransformedInputData, expectedData); } // A new initializeInput should run the new input data through the filter with the new parameters. poseTransformer->initializeInput("device", data); { SCOPED_TRACE("Testing Input Data after initializeInput, with transform or scaling."); DataGroup actualInputData = poseTransformer->doGetInputData(); TestInputDataGroup(actualInputData, expectedData); } } TEST(PoseTransformDeviceFilterTest, OutputDataFilter) { auto poseTransformer = std::make_shared("PoseTransformFilter"); ASSERT_TRUE(poseTransformer->initialize()); DataGroupBuilder builder; builder.addVector(SurgSim::DataStructures::Names::FORCE); builder.addVector(SurgSim::DataStructures::Names::TORQUE); builder.addMatrix(SurgSim::DataStructures::Names::SPRING_JACOBIAN); builder.addPose(SurgSim::DataStructures::Names::INPUT_POSE); builder.addMatrix(SurgSim::DataStructures::Names::DAMPER_JACOBIAN); builder.addVector(SurgSim::DataStructures::Names::INPUT_LINEAR_VELOCITY); builder.addVector(SurgSim::DataStructures::Names::INPUT_ANGULAR_VELOCITY); builder.addBoolean("extraData"); DataGroup data = builder.createData(); data.vectors().set(SurgSim::DataStructures::Names::FORCE, Vector3d(-6.0, 8.0, -10.0)); data.vectors().set(SurgSim::DataStructures::Names::TORQUE, Vector3d(8.0, -4.0, 2.0)); Matrix66d springJacobian; springJacobian << 2.0, 4.0, 6.0, 8.0, 10.0, 12.0, 14.0, 16.0, 18.0, 20.0, 22.0, 24.0, 26.0, 28.0, 30.0, 32.0, 34.0, 36.0, -2.0, -4.0, -6.0, -8.0, -10.0, -12.0, -14.0, -16.0, -18.0, -20.0, -22.0, -24.0, -26.0, -28.0, -30.0, -32.0, -34.0, -36.0; data.matrices().set(SurgSim::DataStructures::Names::SPRING_JACOBIAN, springJacobian); RigidTransform3d inputPose = makeRigidTransform(makeRotationQuaternion(M_PI_2, Vector3d::UnitX().eval()), Vector3d(3., 5., 7.)); data.poses().set(SurgSim::DataStructures::Names::INPUT_POSE, inputPose); Matrix66d damperJacobian; damperJacobian << 6.0, 10.0, 14.0, 18.0, 22.0, 26.0, 30.0, 34.0, 38.0, 42.0, 46.0, 50.0, 54.0, 58.0, 62.0, 66.0, 70.0, 74.0, -6.0, -10.0, -14.0, -18.0, -22.0, -26.0, -30.0, -34.0, -38.0, -42.0, -46.0, -50.0, -54.0, -58.0, -62.0, -66.0, -70.0, -74.0; data.matrices().set(SurgSim::DataStructures::Names::DAMPER_JACOBIAN, damperJacobian); data.vectors().set(SurgSim::DataStructures::Names::INPUT_LINEAR_VELOCITY, Vector3d(10.0, 6.0, 14.0)); data.vectors().set(SurgSim::DataStructures::Names::INPUT_ANGULAR_VELOCITY, Vector3d(8.0, 9.0, 10.0)); data.booleans().set("extraData", true); // Normally the data would be set by a behavior, then the output device scaffold would call requestOutput on the // filter, which would call requestOutput on the OutputComponent. auto producer = std::make_shared(); producer->m_output.setValue(data); poseTransformer->setOutputProducer(producer); RigidTransform3d transform = makeRigidTransform(makeRotationQuaternion(M_PI_2, Vector3d::UnitY().eval()), Vector3d(11.0, 12.0, 13.0)); poseTransformer->setTransform(transform); poseTransformer->setTranslationScale(2.0); DataGroup actualData; poseTransformer->requestOutput("device", &actualData); // The force should be anti-rotated. Vector3d actualForce; ASSERT_TRUE(actualData.vectors().get(SurgSim::DataStructures::Names::FORCE, &actualForce)); Vector3d expectedForce(10.0, 8.0, -6.0); EXPECT_TRUE(actualForce.isApprox(expectedForce, ERROR_EPSILON)); // The torque should be anti-rotated. Vector3d actualtorque; ASSERT_TRUE(actualData.vectors().get(SurgSim::DataStructures::Names::TORQUE, &actualtorque)); Vector3d expectedtorque(-2.0, -4.0, 8.0); EXPECT_TRUE(actualtorque.isApprox(expectedtorque, ERROR_EPSILON)); // The springJacobian should be transformed into device space, so each 3x3 block should be left-multiplied by // the rotation, and right-multiplied by the anti-rotation, then the first three columns of the 6x6 should // be scaled by the translation scaling factor so that the forces & torques are the right magnitude for // the scene. SurgSim::DataStructures::DataGroup::DynamicMatrixType actualSpringJacobian; ASSERT_TRUE(actualData.matrices().get(SurgSim::DataStructures::Names::SPRING_JACOBIAN, &actualSpringJacobian)); Matrix66d expectedSpringJacobian; expectedSpringJacobian << 60.0, -56.0, -52.0, 36.0, -34.0, -32.0, -36.0, 32.0, 28.0, -24.0, 22.0, 20.0, -12.0, 8.0, 4.0, -12.0, 10.0, 8.0, -60.0, 56.0, 52.0, -36.0, 34.0, 32.0, 36.0, -32.0, -28.0, 24.0, -22.0, -20.0, 12.0, -8.0, -4.0, 12.0, -10.0, -8.0; EXPECT_TRUE(actualSpringJacobian.isApprox(expectedSpringJacobian, ERROR_EPSILON)); // The inputPose should be anti-transformed, and have its translation un-scaled. RigidTransform3d actualInputPose; ASSERT_TRUE(actualData.poses().get(SurgSim::DataStructures::Names::INPUT_POSE, &actualInputPose)); RigidTransform3d expectedInputPose = makeRigidTransform(makeRotationQuaternion(-M_PI_2, Vector3d::UnitY().eval()) * makeRotationQuaternion(M_PI_2, Vector3d::UnitX().eval()), Vector3d(3.0, -3.5, -4.0)); EXPECT_TRUE(actualInputPose.isApprox(expectedInputPose, ERROR_EPSILON)); // The damperJacobian should be transformed the same as the springJacobian. SurgSim::DataStructures::DataGroup::DynamicMatrixType actualDamperJacobian; ASSERT_TRUE(actualData.matrices().get(SurgSim::DataStructures::Names::DAMPER_JACOBIAN, &actualDamperJacobian)); Matrix66d expectedDamperJacobian; expectedDamperJacobian << 124.0, -116.0, -108.0, 74.0, -70.0, -66.0, -76.0, 68.0, 60.0, -50.0, 46.0, 42.0, -28.0, 20.0, 12.0, -26.0, 22.0, 18.0, -124.0, 116.0, 108.0, -74.0, 70.0, 66.0, 76.0, -68.0, -60.0, 50.0, -46.0, -42.0, 28.0, -20.0, -12.0, 26.0, -22.0, -18.0; EXPECT_TRUE(actualDamperJacobian.isApprox(expectedDamperJacobian, ERROR_EPSILON)); // The inputLinearVelocity should be anti-rotated and un-scaled. Vector3d actualInputLinearVelocity; ASSERT_TRUE(actualData.vectors().get(SurgSim::DataStructures::Names::INPUT_LINEAR_VELOCITY, &actualInputLinearVelocity)); Vector3d expectedInputLinearVelocity(-7.0, 3.0, 5.0); EXPECT_TRUE(actualInputLinearVelocity.isApprox(expectedInputLinearVelocity, ERROR_EPSILON)); // The inputAngularVelocity should be anti-rotated. Vector3d actualInputAngularVelocity; ASSERT_TRUE(actualData.vectors().get(SurgSim::DataStructures::Names::INPUT_ANGULAR_VELOCITY, &actualInputAngularVelocity)); Vector3d expectedInputAngularVelocity(-10.0, 9.0, 8.0); EXPECT_TRUE(actualInputAngularVelocity.isApprox(expectedInputAngularVelocity, ERROR_EPSILON)); // Other data should pass through unchanged. bool actualBoolean; ASSERT_TRUE(actualData.booleans().get("extraData", &actualBoolean)); bool expectedBoolean = true; EXPECT_EQ(expectedBoolean, actualBoolean); } TEST(PoseTransformDeviceFilterTest, Serialization) { auto runtime = std::make_shared("config.txt"); std::string fileName = "PoseTransform.yaml"; std::shared_ptr device; ASSERT_NO_THROW(device = SurgSim::Devices::loadDevice(fileName)); ASSERT_NE(nullptr, device); auto typedDevice = std::dynamic_pointer_cast(device); ASSERT_NE(nullptr, typedDevice); EXPECT_NEAR(3.4, typedDevice->getTranslationScale(), 1e-10); Eigen::AngleAxisd angleAxis; angleAxis.angle() = 12.3; angleAxis.axis() = SurgSim::Math::Vector3d(0.5, 0.5, 0.0); SurgSim::Math::Vector3d translation = SurgSim::Math::Vector3d(7.8, 8.9, 9.0); SurgSim::Math::RigidTransform3d expectedTransform = SurgSim::Math::makeRigidTransform(SurgSim::Math::Quaterniond(angleAxis), translation); EXPECT_TRUE(typedDevice->getTransform().isApprox(expectedTransform)); }opensurgsim-0.7.0/SurgSim/Devices/DeviceFilters/UnitTests/config.txt.in000066400000000000000000000000411277777236100261670ustar00rootroot00000000000000${CMAKE_CURRENT_BINARY_DIR}/Data/opensurgsim-0.7.0/SurgSim/Devices/DeviceUtilities.cpp000066400000000000000000000131361277777236100226720ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Devices/DeviceUtilities.h" #include #include "SurgSim/Devices/DeviceFilters/DeviceFilter.h" #include "SurgSim/Devices/DeviceFilters/FilteredDevice.h" #include "SurgSim/Input/DeviceInterface.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Framework/Runtime.h" using SurgSim::Input::DeviceInterface; namespace { const std::string NamePropertyName = "Name"; /// Convert node to device /// \param possibleDevice The node to be converted /// \param fileName The original filename for error reporting /// \return The device if it was created and initialized, otherwise nullptr std::shared_ptr tryConvertDevice(const YAML::Node& possibleDevice, const std::string& fileName) { auto logger = SurgSim::Framework::Logger::getLogger("Devices"); std::shared_ptr device; if (possibleDevice.IsMap()) { std::string className = possibleDevice.begin()->first.as(); if (DeviceInterface::getFactory().isRegistered(className)) { const YAML::Node& data = possibleDevice.begin()->second; if (data.IsMap() && data[NamePropertyName].IsDefined()) { SURGSIM_LOG_DEBUG(logger) << "Loading: " << std::endl << possibleDevice; std::string name = data[NamePropertyName].as(); device = DeviceInterface::getFactory().create(className, name); auto filteredDevice = std::dynamic_pointer_cast(device); if (filteredDevice == nullptr) { std::vector ignoredProperties; ignoredProperties.push_back(NamePropertyName); device->decode(data, ignoredProperties); } else { if (data["Devices"].IsDefined() && data["Devices"].IsSequence()) { std::vector> subDevices; for (const YAML::Node& deviceNode : data["Devices"]) { subDevices.push_back(tryConvertDevice(deviceNode, fileName)); } SURGSIM_LOG_IF(!filteredDevice->setDevices(subDevices), logger, WARNING) << "File " << fileName << " failed to setDevices on a FilteredDevice : " << std::endl << data["Devices"]; } std::vector ignoredProperties; ignoredProperties.push_back(NamePropertyName); ignoredProperties.push_back("Devices"); device->decode(data, ignoredProperties); } if (device->initialize()) { SURGSIM_LOG_INFO(logger) << "Successfully loaded " << className << " named " << name; } else { device = nullptr; SURGSIM_LOG_INFO(logger) << "Failed to initialize " << className << " named " << name; } } else { SURGSIM_LOG_WARNING(logger) << "File " << fileName << " contains an entry for class " << className << " that is not a map or does not have a Name property:" << std::endl << possibleDevice; } } else { SURGSIM_LOG_INFO(logger) << "Class " << className << " is not registered in the factory."; } } else { SURGSIM_LOG_WARNING(logger) << "File " << fileName << " contains a non-map where a map is expected:" << std::endl << possibleDevice; } return device; } } namespace SurgSim { namespace Devices { std::shared_ptr createDevice(const std::vector& classNames, const std::string& name) { std::shared_ptr device; auto& factory = DeviceInterface::getFactory(); for (const auto& className : classNames) { if (factory.isRegistered(className)) { SURGSIM_LOG_INFO(Framework::Logger::getLogger("Devices")) << "Trying to create a " << className; device = factory.create(className, name); if (device->initialize()) { SURGSIM_LOG_INFO(Framework::Logger::getLogger("Devices")) << "Successfully created a " << className; break; } else { device = nullptr; SURGSIM_LOG_INFO(Framework::Logger::getLogger("Devices")) << "Failed to initialize a " << className; } } else { SURGSIM_LOG_INFO(Framework::Logger::getLogger("Devices")) << className << " is not registered in the Devices factory."; } } return device; } std::shared_ptr createDevice(const std::string& className, const std::string& name) { std::vector names; names.push_back(className); return createDevice(names, name); } std::shared_ptr loadDevice(const std::string& fileName) { SURGSIM_LOG_INFO(Framework::Logger::getLogger("Devices")) << "Adding a device from " << fileName; YAML::Node node; SURGSIM_ASSERT(Framework::tryLoadNode(fileName, &node)) << "Could not load a device from the YAML file: " << fileName; std::shared_ptr device; if (node.IsSequence()) { for (const auto& possibleDevice : node) { device = tryConvertDevice(possibleDevice, fileName); if (device != nullptr) { break; } } } else { SURGSIM_LOG_SEVERE(Framework::Logger::getLogger("Devices")) << "File " << fileName << " not a YAML sequence; cannot load device:" << std::endl << node; } return device; } }; // namespace Devices }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Devices/DeviceUtilities.h000066400000000000000000000045031277777236100223350ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DEVICES_DEVICEUTILITIES_H #define SURGSIM_DEVICES_DEVICEUTILITIES_H #include #include #include namespace SurgSim { namespace Input { class DeviceInterface; } namespace Devices { /// Attempts to create and initialize a device from a list of devices to try /// \param classNames The fully-qualified device class names to try. The elements will be tried in order, front to back. /// \param name The name to be given to the created device /// \return An initialized device or nullptr if no device was available. std::shared_ptr createDevice(const std::vector& classNames, const std::string& name); /// Attempts to create and initialize a device /// \param className The fully-qualified device class name to try. /// \param name The name to be given to the created device /// \return An initialized device or nullptr if no device was available. std::shared_ptr createDevice(const std::string& className, const std::string& name); /// Loads a single device from the file, the first device that successfully initializes. /// The file format should be just a list of DeviceInterfaces /// \code /// - SurgSim::Devices::MultiAxisDevice: /// Name: element1 /// - SurgSim::Devices::IdentityPoseDevice: /// Name: element1 /// \endcode /// \param fileName the filename of the devices to be loaded, needs to be found /// \return an initialized device, or nullptr if no device could be created and initialized /// \throws If the file cannot be found or is an invalid file std::shared_ptr loadDevice(const std::string& fileName); }; }; #endif // SURGSIM_DEVICES_DEVICEUTILITIES_H opensurgsim-0.7.0/SurgSim/Devices/IdentityPoseDevice/000077500000000000000000000000001277777236100226275ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Devices/IdentityPoseDevice/CMakeLists.txt000066400000000000000000000024361277777236100253740ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. link_directories(${Boost_LIBRARY_DIRS}) include_directories("${CMAKE_CURRENT_SOURCE_DIR}") set(IDENTITY_POSE_DEVICE_SOURCES IdentityPoseDevice.cpp ) set(IDENTITY_POSE_DEVICE_HEADERS IdentityPoseDevice.h ) set(DEVICE_HEADERS ${DEVICE_HEADERS} IdentityPoseDevice/IdentityPoseDevice.h PARENT_SCOPE) surgsim_add_library( IdentityPoseDevice "${IDENTITY_POSE_DEVICE_SOURCES}" "${IDENTITY_POSE_DEVICE_HEADERS}" ) set(LIBS SurgSimInput ) target_link_libraries(IdentityPoseDevice ${LIBS} ) if(BUILD_TESTING) add_subdirectory(UnitTests) endif() # Put IdentityPoseDevice into folder "Devices" set_target_properties(IdentityPoseDevice PROPERTIES FOLDER "Devices") opensurgsim-0.7.0/SurgSim/Devices/IdentityPoseDevice/IdentityPoseDevice.cpp000066400000000000000000000052571277777236100271040ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Devices/IdentityPoseDevice/IdentityPoseDevice.h" #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/DataStructures/DataGroupBuilder.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Math/RigidTransform.h" using SurgSim::DataStructures::DataGroup; using SurgSim::DataStructures::DataGroupBuilder; using SurgSim::Math::RigidTransform3d; namespace SurgSim { namespace Devices { SURGSIM_REGISTER(SurgSim::Input::DeviceInterface, SurgSim::Devices::IdentityPoseDevice, IdentityPoseDevice); IdentityPoseDevice::IdentityPoseDevice(const std::string& uniqueName) : Input::CommonDevice(uniqueName, buildInputData()), m_initialized(false) { } bool IdentityPoseDevice::initialize() { SURGSIM_ASSERT(!isInitialized()) << getName() << " already initialized."; SURGSIM_LOG_INFO(Framework::Logger::getLogger("Devices/IdentityPose")) << "Device " << getName() << " initialized."; m_initialized = true; return true; } bool IdentityPoseDevice::isInitialized() const { return m_initialized; } bool IdentityPoseDevice::finalize() { SURGSIM_ASSERT(isInitialized()) << getName() << " is not initialized, cannot finalize."; SURGSIM_LOG_INFO(Framework::Logger::getLogger("Devices/IdentityPose")) << "Device " << getName() << " finalized."; m_initialized = false; return true; } DataGroup IdentityPoseDevice::buildInputData() { DataGroupBuilder builder; builder.addPose(DataStructures::Names::POSE); return builder.createData(); } bool IdentityPoseDevice::addInputConsumer(std::shared_ptr inputConsumer) { if (!CommonDevice::addInputConsumer(std::move(inputConsumer))) { return false; } // The IdentityPoseDevice doesn't have any input events; it just sits there. // So we push the output to all the consumers, including the new one, right away after we add a consumer. // This ensures that all consumers always see the identity pose. getInputData().poses().set(DataStructures::Names::POSE, RigidTransform3d::Identity()); pushInput(); return true; } }; // namespace Devices }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Devices/IdentityPoseDevice/IdentityPoseDevice.h000066400000000000000000000044041277777236100265420ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DEVICES_IDENTITYPOSEDEVICE_IDENTITYPOSEDEVICE_H #define SURGSIM_DEVICES_IDENTITYPOSEDEVICE_IDENTITYPOSEDEVICE_H #include #include #include "SurgSim/Input/CommonDevice.h" namespace SurgSim { namespace Devices { SURGSIM_STATIC_REGISTRATION(IdentityPoseDevice); /// A class implementing the identity pose device, which is a pretend device that doesn't move. /// /// The identity pose device produces a pose that's always the identity transform (no translation from the origin /// and no rotation from the model orientation). /// This can be useful not only for writing tests, but also as a way to replace real hardware devices in situations /// where the simulator needs to be run but the hardware is not currently available. /// /// \sa SurgSim::Input::DeviceInterface class IdentityPoseDevice : public SurgSim::Input::CommonDevice { public: /// Constructor. /// \param uniqueName A unique name for the device that will be used by the application. explicit IdentityPoseDevice(const std::string& uniqueName); SURGSIM_CLASSNAME(SurgSim::Devices::IdentityPoseDevice); bool addInputConsumer(std::shared_ptr inputConsumer) override; bool initialize() override; bool isInitialized() const override; protected: /// Builds the data layout for the application input (i.e. device output). static SurgSim::DataStructures::DataGroup buildInputData(); private: bool finalize() override; /// true if initialized and not finalized. bool m_initialized; }; }; // namespace Devices }; // namespace SurgSim #endif // SURGSIM_DEVICES_IDENTITYPOSEDEVICE_IDENTITYPOSEDEVICE_H opensurgsim-0.7.0/SurgSim/Devices/IdentityPoseDevice/UnitTests/000077500000000000000000000000001277777236100245715ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Devices/IdentityPoseDevice/UnitTests/CMakeLists.txt000066400000000000000000000016111277777236100273300ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2012-2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. include_directories( ${gtest_SOURCE_DIR}/include ) set(UNIT_TEST_SOURCES IdentityPoseDeviceTest.cpp ) set(LIBS IdentityPoseDevice ) surgsim_add_unit_tests(IdentityPoseDeviceTest) set_target_properties(IdentityPoseDeviceTest PROPERTIES FOLDER "Devices") opensurgsim-0.7.0/SurgSim/Devices/IdentityPoseDevice/UnitTests/IdentityPoseDeviceTest.cpp000066400000000000000000000117611277777236100317030ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the IdentityPoseDevice class. #include #include #include #include "SurgSim/Devices/IdentityPoseDevice/IdentityPoseDevice.h" #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Matrix.h" #include "SurgSim/Testing/MockInputOutput.h" using SurgSim::Devices::IdentityPoseDevice; using SurgSim::DataStructures::DataGroup; using SurgSim::Math::RigidTransform3d; using SurgSim::Math::Matrix44d; using SurgSim::Testing::MockInputOutput; TEST(IdentityPoseDeviceTest, CanConstruct) { EXPECT_NO_THROW({IdentityPoseDevice device("MyIdentityPoseDevice");}); } TEST(IdentityPoseDeviceTest, Name) { IdentityPoseDevice device("MyIdentityPoseDevice"); EXPECT_EQ("MyIdentityPoseDevice", device.getName()); } TEST(IdentityPoseDeviceTest, Factory) { std::shared_ptr device; ASSERT_NO_THROW(device = SurgSim::Input::DeviceInterface::getFactory().create( "SurgSim::Devices::IdentityPoseDevice", "Device")); EXPECT_NE(nullptr, device); } TEST(IdentityPoseDeviceTest, AddInputConsumer) { IdentityPoseDevice device("MyIdentityPoseDevice"); std::shared_ptr consumer = std::make_shared(); EXPECT_EQ(0, consumer->m_numTimesReceivedInput); EXPECT_TRUE(device.addInputConsumer(consumer)); // IdentityPoseDevice is supposed to shove an identity pose at every consumer when it's added. EXPECT_EQ(1, consumer->m_numTimesReceivedInput); EXPECT_TRUE(consumer->m_lastReceivedInput.poses().hasData(SurgSim::DataStructures::Names::POSE)); // Check the data. RigidTransform3d pose = SurgSim::Math::makeRigidTransform(SurgSim::Math::Vector3d(1.3, 32.0, 68.0), SurgSim::Math::Vector3d(13.2, 2.8, 8.0), SurgSim::Math::Vector3d(273.0, -32.0, -6.0)); ASSERT_TRUE(consumer->m_lastReceivedInput.poses().get(SurgSim::DataStructures::Names::POSE, &pose)); EXPECT_NEAR(0, (pose.matrix() - Matrix44d::Identity()).norm(), 1e-6); // Adding the same input consumer again should fail. EXPECT_FALSE(device.addInputConsumer(consumer)); EXPECT_EQ(1, consumer->m_numTimesReceivedInput); // Adding a different device should push to it. std::shared_ptr consumer2 = std::make_shared(); EXPECT_EQ(0, consumer2->m_numTimesReceivedInput); EXPECT_TRUE(device.addInputConsumer(consumer2)); EXPECT_EQ(1, consumer2->m_numTimesReceivedInput); // We don't care if the first consumer was updated again or not. EXPECT_TRUE((consumer->m_numTimesReceivedInput >= 1) && (consumer->m_numTimesReceivedInput <= 2)) << "consumer->m_numTimesReceivedInput = " << consumer->m_numTimesReceivedInput << std::endl; } TEST(IdentityPoseDeviceTest, RemoveInputConsumer) { IdentityPoseDevice device("MyIdentityPoseDevice"); std::shared_ptr consumer = std::make_shared(); EXPECT_EQ(0, consumer->m_numTimesReceivedInput); EXPECT_FALSE(device.removeInputConsumer(consumer)); EXPECT_EQ(0, consumer->m_numTimesReceivedInput); EXPECT_TRUE(device.addInputConsumer(consumer)); // IdentityPoseDevice is supposed to shove an identity pose at every consumer when it's added. EXPECT_EQ(1, consumer->m_numTimesReceivedInput); EXPECT_TRUE(device.removeInputConsumer(consumer)); EXPECT_EQ(1, consumer->m_numTimesReceivedInput); EXPECT_FALSE(device.removeInputConsumer(consumer)); EXPECT_EQ(1, consumer->m_numTimesReceivedInput); } TEST(IdentityPoseDeviceTest, SetOutputProducer) { IdentityPoseDevice device("MyIdentityPoseDevice"); std::shared_ptr producer = std::make_shared(); EXPECT_EQ(0, producer->m_numTimesRequestedOutput); EXPECT_TRUE(device.setOutputProducer(producer)); EXPECT_EQ(0, producer->m_numTimesRequestedOutput); } TEST(IdentityPoseDeviceTest, RemoveOutputProducer) { IdentityPoseDevice device("MyIdentityPoseDevice"); std::shared_ptr producer = std::make_shared(); EXPECT_EQ(0, producer->m_numTimesRequestedOutput); EXPECT_FALSE(device.removeOutputProducer(producer)); EXPECT_EQ(0, producer->m_numTimesReceivedInput); EXPECT_TRUE(device.setOutputProducer(producer)); EXPECT_EQ(0, producer->m_numTimesReceivedInput); EXPECT_TRUE(device.removeOutputProducer(producer)); EXPECT_EQ(0, producer->m_numTimesReceivedInput); EXPECT_FALSE(device.removeOutputProducer(producer)); EXPECT_EQ(0, producer->m_numTimesReceivedInput); } opensurgsim-0.7.0/SurgSim/Devices/Keyboard/000077500000000000000000000000001277777236100206275ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Devices/Keyboard/CMakeLists.txt000066400000000000000000000027641277777236100234000ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. include_directories( "${CMAKE_CURRENT_SOURCE_DIR}" "${OPENSCENEGRAPH_INCLUDE_DIR}" ) set(KEYBOARD_DEVICE_SOURCES KeyboardDevice.cpp KeyboardScaffold.cpp OsgKeyboardHandler.cpp ) set(KEYBOARD_DEVICE_HEADERS KeyboardDevice.h KeyboardScaffold.h KeyCode.h OsgKeyboardHandler.h ) set(DEVICE_HEADERS ${DEVICE_HEADERS} Keyboard/KeyboardDevice.h #NOLINT Keyboard/KeyCode.h #NOLINT PARENT_SCOPE) surgsim_add_library( KeyboardDevice "${KEYBOARD_DEVICE_SOURCES}" "${KEYBOARD_DEVICE_HEADERS}" ) set(LIBS SurgSimInput ${Boost_LIBRARIES} ${OPENSCENEGRAPH_LIBRARIES} ) target_link_libraries(KeyboardDevice ${LIBS} ) if(BUILD_TESTING) # The unit tests will be built whenever the library is built. add_subdirectory(UnitTests) add_subdirectory(VisualTests) endif() # Put KeyboardDevice into folder "Devices" set_target_properties(KeyboardDevice PROPERTIES FOLDER "Devices") opensurgsim-0.7.0/SurgSim/Devices/Keyboard/KeyCode.h000066400000000000000000000220641277777236100223270ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DEVICES_KEYBOARD_KEYCODE_H #define SURGSIM_DEVICES_KEYBOARD_KEYCODE_H namespace SurgSim { namespace Devices { // KeyCode pulled out from osgGA/GUIEventAdapter enum KeyCode { NONE = -1, KEY_SPACE = 0x20, KEY_0 = '0', KEY_1 = '1', KEY_2 = '2', KEY_3 = '3', KEY_4 = '4', KEY_5 = '5', KEY_6 = '6', KEY_7 = '7', KEY_8 = '8', KEY_9 = '9', KEY_A = 'a', KEY_B = 'b', KEY_C = 'c', KEY_D = 'd', KEY_E = 'e', KEY_F = 'f', KEY_G = 'g', KEY_H = 'h', KEY_I = 'i', KEY_J = 'j', KEY_K = 'k', KEY_L = 'l', KEY_M = 'm', KEY_N = 'n', KEY_O = 'o', KEY_P = 'p', KEY_Q = 'q', KEY_R = 'r', KEY_S = 's', KEY_T = 't', KEY_U = 'u', KEY_V = 'v', KEY_W = 'w', KEY_X = 'x', KEY_Y = 'y', KEY_Z = 'z', KEY_EXCLAIM = 0x21, KEY_QUOTEDBL = 0x22, KEY_HASH = 0x23, KEY_DOLLAR = 0x24, KEY_AMPERSAND = 0x26, KEY_QUOTE = 0x27, KEY_LEFTPAREN = 0x28, KEY_RIGHTPAREN = 0x29, KEY_ASTERISK = 0x2A, KEY_PLUS = 0x2B, KEY_COMMA = 0x2C, KEY_MINUS = 0x2D, KEY_PERIOD = 0x2E, KEY_SLASH = 0x2F, KEY_COLON = 0x3A, KEY_SEMICOLON = 0x3B, KEY_LESS = 0x3C, KEY_EQUALS = 0x3D, KEY_GREATER = 0x3E, KEY_QUESTION = 0x3F, KEY_AT = 0x40, KEY_LEFTBRACKET = 0x5B, KEY_BACKSLASH = 0x5C, KEY_RIGHTBRACKET = 0x5D, KEY_CARET = 0x5E, KEY_UNDERSCORE = 0x5F, KEY_BACKQUOTE = 0x60, KEY_BACKSPACE = 0xFF08, /* back space, back char */ KEY_TAB = 0xFF09, KEY_LINEFEED = 0xFF0A, /* Linefeed, LF */ KEY_CLEAR = 0xFF0B, KEY_RETURN = 0xFF0D, /* Return, enter */ KEY_PAUSE = 0xFF13, /* Pause, hold */ KEY_SCROLL_LOCK = 0xFF14, KEY_SYS_REQ = 0xFF15, KEY_ESCAPE = 0xFF1B, KEY_DELETE = 0xFFFF, /* Delete, rubout */ KEY_HOME = 0xFF50, KEY_LEFT = 0xFF51, /* Move left, left arrow */ KEY_UP = 0xFF52, /* Move up, up arrow */ KEY_RIGHT = 0xFF53, /* Move right, right arrow */ KEY_DOWN = 0xFF54, /* Move down, down arrow */ KEY_PRIOR = 0xFF55, /* Prior, previous */ KEY_PAGE_UP = 0xFF55, KEY_NEXT = 0xFF56, /* Next */ KEY_PAGE_DOWN = 0xFF56, KEY_END = 0xFF57, /* EOL */ KEY_BEGIN = 0xFF58, /* BOL */ KEY_SELECT = 0xFF60, /* Select, mark */ KEY_PRINT = 0xFF61, KEY_EXECUTE = 0xFF62, /* Execute, run, do */ KEY_INSERT = 0xFF63, /* Insert, insert here */ KEY_UNDO = 0xFF65, /* Undo, oops */ KEY_REDO = 0xFF66, /* redo, again */ KEY_MENU = 0xFF67, /* On Windows, this is VK_APPS, the context-menu key */ KEY_FIND = 0xFF68, /* Find, search */ KEY_CANCEL = 0xFF69, /* Cancel, stop, abort, exit */ KEY_HELP = 0xFF6A, /* Help */ KEY_BREAK = 0xFF6B, KEY_MODE_SWITCH = 0xFF7E, /* Character set switch */ KEY_SCRIPT_SWITCH = 0xFF7E, /* Alias for mode_switch */ KEY_NUM_LOCK = 0xFF7F, KEY_KP_SPACE = 0xFF80, /* space */ KEY_KP_TAB = 0xFF89, KEY_KP_ENTER = 0xFF8D, /* enter */ KEY_KP_F1 = 0xFF91, /* PF1, KP_A, ... */ KEY_KP_F2 = 0xFF92, KEY_KP_F3 = 0xFF93, KEY_KP_F4 = 0xFF94, KEY_KP_HOME = 0xFF95, KEY_KP_LEFT = 0xFF96, KEY_KP_UP = 0xFF97, KEY_KP_RIGHT = 0xFF98, KEY_KP_DOWN = 0xFF99, KEY_KP_PRIOR = 0xFF9A, KEY_KP_PAGE_UP = 0xFF9A, KEY_KP_NEXT = 0xFF9B, KEY_KP_PAGE_DOWN = 0xFF9B, KEY_KP_END = 0xFF9C, KEY_KP_BEGIN = 0xFF9D, KEY_KP_INSERT = 0xFF9E, KEY_KP_DELETE = 0xFF9F, KEY_KP_EQUAL = 0xFFBD, /* equals */ KEY_KP_MULTIPLY = 0xFFAA, KEY_KP_ADD = 0xFFAB, KEY_KP_SEPARATOR = 0xFFAC, /* separator, often comma */ KEY_KP_SUBTRACT = 0xFFAD, KEY_KP_DECIMAL = 0xFFAE, KEY_KP_DIVIDE = 0xFFAF, KEY_KP_0 = 0xFFB0, KEY_KP_1 = 0xFFB1, KEY_KP_2 = 0xFFB2, KEY_KP_3 = 0xFFB3, KEY_KP_4 = 0xFFB4, KEY_KP_5 = 0xFFB5, KEY_KP_6 = 0xFFB6, KEY_KP_7 = 0xFFB7, KEY_KP_8 = 0xFFB8, KEY_KP_9 = 0xFFB9, KEY_F1 = 0xFFBE, KEY_F2 = 0xFFBF, KEY_F3 = 0xFFC0, KEY_F4 = 0xFFC1, KEY_F5 = 0xFFC2, KEY_F6 = 0xFFC3, KEY_F7 = 0xFFC4, KEY_F8 = 0xFFC5, KEY_F9 = 0xFFC6, KEY_F10 = 0xFFC7, KEY_F11 = 0xFFC8, KEY_F12 = 0xFFC9, KEY_F13 = 0xFFCA, KEY_F14 = 0xFFCB, KEY_F15 = 0xFFCC, KEY_F16 = 0xFFCD, KEY_F17 = 0xFFCE, KEY_F18 = 0xFFCF, KEY_F19 = 0xFFD0, KEY_F20 = 0xFFD1, KEY_F21 = 0xFFD2, KEY_F22 = 0xFFD3, KEY_F23 = 0xFFD4, KEY_F24 = 0xFFD5, KEY_F25 = 0xFFD6, KEY_F26 = 0xFFD7, KEY_F27 = 0xFFD8, KEY_F28 = 0xFFD9, KEY_F29 = 0xFFDA, KEY_F30 = 0xFFDB, KEY_F31 = 0xFFDC, KEY_F32 = 0xFFDD, KEY_F33 = 0xFFDE, KEY_F34 = 0xFFDF, KEY_F35 = 0xFFE0, /* Modifiers */ KEY_SHIFT_L = 0xFFE1, /* Left shift */ KEY_SHIFT_R = 0xFFE2, /* Right shift */ KEY_CONTROL_L = 0xFFE3, /* Left control */ KEY_CONTROL_R = 0xFFE4, /* Right control */ KEY_CAPS_LOCK = 0xFFE5, /* Caps lock */ KEY_SHIFT_LOCK = 0xFFE6, /* Shift lock */ KEY_META_L = 0xFFE7, /* Left meta */ KEY_META_R = 0xFFE8, /* Right meta */ KEY_ALT_L = 0xFFE9, /* Left alt */ KEY_ALT_R = 0xFFEA, /* Right alt */ KEY_SUPER_L = 0xFFEB, /* Left super */ KEY_SUPER_R = 0xFFEC, /* Right super */ KEY_HYPER_L = 0xFFED, /* Left hyper */ KEY_HYPER_R = 0xFFEE /* Right hyper */ }; // Masks pulled out from osgGA/GUIEventAdapter enum ModKeyMask { MODKEY_NONE = 0, MODKEY_LEFT_SHIFT = 0x0001, MODKEY_RIGHT_SHIFT = 0x0002, MODKEY_LEFT_CTRL = 0x0004, MODKEY_RIGHT_CTRL = 0x0008, MODKEY_LEFT_ALT = 0x0010, MODKEY_RIGHT_ALT = 0x0020, MODKEY_LEFT_META = 0x0040, MODKEY_RIGHT_META = 0x0080, MODKEY_LEFT_SUPER = 0x0100, MODKEY_RIGHT_SUPER = 0x0200, MODKEY_LEFT_HYPER = 0x0400, MODKEY_RIGHT_HYPER = 0x0800, MODKEY_NUM_LOCK = 0x1000, MODKEY_CAPS_LOCK = 0x2000, MODKEY_CTRL = (MODKEY_LEFT_CTRL|MODKEY_RIGHT_CTRL), MODKEY_SHIFT = (MODKEY_LEFT_SHIFT|MODKEY_RIGHT_SHIFT), MODKEY_ALT = (MODKEY_LEFT_ALT|MODKEY_RIGHT_ALT), MODKEY_META = (MODKEY_LEFT_META|MODKEY_RIGHT_META), MODKEY_SUPER = (MODKEY_LEFT_SUPER|MODKEY_RIGHT_SUPER), MODKEY_HYPER = (MODKEY_LEFT_HYPER|MODKEY_RIGHT_HYPER), MODKEY_CAPS_SHIFT_L = (MODKEY_CAPS_LOCK|MODKEY_LEFT_SHIFT), MODKEY_CAPS_SHIFT_R = (MODKEY_CAPS_LOCK|MODKEY_RIGHT_SHIFT), MODKEY_CAPS_CONTROL_L = (MODKEY_CAPS_LOCK|MODKEY_LEFT_CTRL), MODKEY_CAPS_CONTROL_R = (MODKEY_CAPS_LOCK|MODKEY_RIGHT_CTRL), MODKEY_CAPS_ALT_L = (MODKEY_CAPS_LOCK|MODKEY_LEFT_ALT), MODKEY_CAPS_ALT_R = (MODKEY_CAPS_LOCK|MODKEY_RIGHT_ALT) }; }; // namespace Devices }; // namespace SurgSim #endif // SURGSIM_DEVICES_KEYBOARD_KEYCODE_Hopensurgsim-0.7.0/SurgSim/Devices/Keyboard/KeyboardDevice.cpp000066400000000000000000000040021277777236100242070ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Devices/Keyboard/KeyboardDevice.h" #include "SurgSim/Devices/Keyboard/KeyboardScaffold.h" #include "SurgSim/Devices/Keyboard/OsgKeyboardHandler.h" #include "SurgSim/Framework/Log.h" namespace SurgSim { namespace Devices { SURGSIM_REGISTER(SurgSim::Input::DeviceInterface, SurgSim::Devices::KeyboardDevice, KeyboardDevice); KeyboardDevice::KeyboardDevice(const std::string& deviceName) : Input::CommonDevice(deviceName, KeyboardScaffold::buildDeviceInputData()) { } KeyboardDevice::~KeyboardDevice() { if (isInitialized()) { finalize(); } } bool KeyboardDevice::initialize() { SURGSIM_ASSERT(!isInitialized()) << getName() << " already initialized."; auto scaffold = KeyboardScaffold::getOrCreateSharedInstance(); SURGSIM_ASSERT(scaffold != nullptr); bool registered = false; if (scaffold->registerDevice(this)) { m_scaffold = std::move(scaffold); registered = true; } return registered; } bool KeyboardDevice::finalize() { SURGSIM_ASSERT(isInitialized()) << getName() << " is not initialized, cannot finalize."; bool unregistered = m_scaffold->unregisterDevice(); m_scaffold.reset(); return unregistered; } bool KeyboardDevice::isInitialized() const { return (m_scaffold != nullptr); } OsgKeyboardHandler* KeyboardDevice::getKeyboardHandler() const { return m_scaffold->getKeyboardHandler(); } }; // namespace Devices }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Devices/Keyboard/KeyboardDevice.h000066400000000000000000000045721277777236100236700ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DEVICES_KEYBOARD_KEYBOARDDEVICE_H #define SURGSIM_DEVICES_KEYBOARD_KEYBOARDDEVICE_H #include #include #include "SurgSim/Input/CommonDevice.h" namespace SurgSim { namespace Devices { class KeyboardScaffold; class OsgKeyboardHandler; SURGSIM_STATIC_REGISTRATION(KeyboardDevice); /// A class implementing the communication with a keyboard /// /// \par Application input provided from the device: /// | type | name | | /// | ---- | ---- | --- | /// | int | "key" | %Key code for the pressed key, if any. Default: -1 | /// | int | "modifierMask" | %Mask for the pressed modifier, if any. Default: 0 | /// /// \par Application output used by the device: /// NONE /// /// \note Key 'Fn' is not currently captured (No key code is assigned to it). /// \sa SurgSim::Input::CommonDevice, SurgSim::Input::DeviceInterface class KeyboardDevice : public SurgSim::Input::CommonDevice { friend class KeyboardScaffold; friend class KeyboardDeviceTest; public: /// Constructor /// \param deviceName Name for keyboard device explicit KeyboardDevice(const std::string& deviceName); SURGSIM_CLASSNAME(SurgSim::Devices::KeyboardDevice); /// Destructor virtual ~KeyboardDevice(); bool initialize() override; bool isInitialized() const override; /// Get keyboard handler /// \return The keyboard handler associated with this device OsgKeyboardHandler* getKeyboardHandler() const; private: bool finalize() override; /// Communication with hardware is handled by scaffold. std::shared_ptr m_scaffold; }; }; // namespace Devices }; // namespace SurgSim #endif //SURGSIM_DEVICES_KEYBOARD_KEYBOARDDEVICE_Hopensurgsim-0.7.0/SurgSim/Devices/Keyboard/KeyboardScaffold.cpp000066400000000000000000000072321277777236100245410ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Devices/Keyboard/KeyboardScaffold.h" #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/DataStructures/DataGroupBuilder.h" #include "SurgSim/Devices/Keyboard/KeyboardDevice.h" #include "SurgSim/Devices/Keyboard/OsgKeyboardHandler.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Framework/SharedInstance.h" namespace SurgSim { namespace Devices { /// Struct to hold a KeyboardDevice object, a KeyboardHandler object, and a mutex for data passing. struct KeyboardScaffold::DeviceData { /// Constructor /// \param device Device to be managed by this scaffold explicit DeviceData(KeyboardDevice* device) : deviceObject(device) { keyboardHandler = new OsgKeyboardHandler(); } /// Device object managed by this scaffold. KeyboardDevice* const deviceObject; /// Keyboard Handler to communicate with underneath API. osg::ref_ptr keyboardHandler; /// The mutex that protects the externally modifiable parameters. boost::mutex mutex; private: // Prevent copy construction and copy assignment. (VS2012 does not support "= delete" yet.) DeviceData(const DeviceData&) /*= delete*/; DeviceData& operator=(const DeviceData&) /*= delete*/; }; KeyboardScaffold::KeyboardScaffold() : m_logger(Framework::Logger::getLogger("Devices/Keyboard")) { SURGSIM_LOG_DEBUG(m_logger) << "Shared scaffold created."; } KeyboardScaffold::~KeyboardScaffold() { if (m_device != nullptr) { unregisterDevice(); } SURGSIM_LOG_DEBUG(m_logger) << "Shared scaffold destroyed."; } bool KeyboardScaffold::registerDevice(KeyboardDevice* device) { SURGSIM_ASSERT(m_device == nullptr) << "Can't register two Keyboard devices."; m_device.reset(new DeviceData(device)); if (m_device == nullptr) { SURGSIM_LOG_CRITICAL(m_logger) << "Failed to create a DeviceData"; return false; } SURGSIM_LOG_DEBUG(m_logger) << "Registered device " << device->getName(); return true; } bool KeyboardScaffold::unregisterDevice() { m_device.reset(); if (m_device == nullptr) { SURGSIM_LOG_DEBUG(m_logger) << "Unregistered device"; return true; } SURGSIM_LOG_DEBUG(m_logger) << "There is no device to unregister."; return false; } bool KeyboardScaffold::updateDevice(int key, int modifierMask) { boost::lock_guard lock(m_device->mutex); DataStructures::DataGroup& inputData = m_device->deviceObject->getInputData(); inputData.integers().set("key", key); inputData.integers().set("modifierMask", modifierMask); m_device->deviceObject->pushInput(); return true; } OsgKeyboardHandler* KeyboardScaffold::getKeyboardHandler() const { return m_device->keyboardHandler.get(); } DataStructures::DataGroup KeyboardScaffold::buildDeviceInputData() { DataStructures::DataGroupBuilder builder; builder.addInteger("key"); builder.addInteger("modifierMask"); return builder.createData(); } std::shared_ptr KeyboardScaffold::getOrCreateSharedInstance() { static Framework::SharedInstance sharedInstance; return sharedInstance.get(); } }; // namespace Devices }; // namespace SurgSimopensurgsim-0.7.0/SurgSim/Devices/Keyboard/KeyboardScaffold.h000066400000000000000000000056311277777236100242070ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DEVICES_KEYBOARD_KEYBOARDSCAFFOLD_H #define SURGSIM_DEVICES_KEYBOARD_KEYBOARDSCAFFOLD_H #include #include "SurgSim/Framework/Logger.h" namespace SurgSim { namespace DataStructures { class DataGroup; } namespace Devices { class KeyboardDevice; class OsgKeyboardHandler; /// A class that implements the behavior of KeyboardDevice objects. /// \sa SurgSim::Devices::KeyboardDevice class KeyboardScaffold { friend class KeyboardDevice; friend class KeyboardDeviceTest; friend class OsgKeyboardHandler; public: /// Constructor. KeyboardScaffold(); /// Destructor ~KeyboardScaffold(); /// Gets or creates the scaffold shared by all KeyboardDevice instances. /// The scaffold is managed using a SharedInstance object, so it will be destroyed when all devices are released. /// \return the scaffold object. static std::shared_ptr getOrCreateSharedInstance(); private: /// Internal per-device information. struct DeviceData; /// Registers the specified device object. /// If successful, the device object will become connected to an hardware device. /// \param device The device object to be used, which should have a unique name. /// \return True if the initialization succeeds, false if it fails. bool registerDevice(KeyboardDevice* device); /// Unregisters the specified device object. /// The corresponding controller will become unused, and can be re-registered later. /// \return True on success, false on failure. bool unregisterDevice(); /// Updates the device information for a single device. /// \param key Unmodified OSG key code. /// \param modifierMask Modifier mask. /// \return True on success. bool updateDevice(int key, int modifierMask); /// Get keyboard handler /// \return The keyboard handler associated with this device OsgKeyboardHandler* getKeyboardHandler() const; /// Builds the data layout for the application input (i.e. device output). static SurgSim::DataStructures::DataGroup buildDeviceInputData(); /// Logger used by the scaffold and all devices. std::shared_ptr m_logger; /// The keyboard device managed by this scaffold std::unique_ptr m_device; }; }; // namespace Devices }; // namespace SurgSim #endif // SURGSIM_DEVICES_KEYBOARD_KEYBOARDSCAFFOLD_H opensurgsim-0.7.0/SurgSim/Devices/Keyboard/OsgKeyboardHandler.cpp000066400000000000000000000037621277777236100250520ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Devices/Keyboard/KeyCode.h" #include "SurgSim/Devices/Keyboard/KeyboardScaffold.h" #include "SurgSim/Devices/Keyboard/OsgKeyboardHandler.h" #include #include namespace SurgSim { namespace Devices { OsgKeyboardHandler::OsgKeyboardHandler() : m_keyboardScaffold(KeyboardScaffold::getOrCreateSharedInstance()) { } bool OsgKeyboardHandler::handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter&) { bool result = false; switch (ea.getEventType()) { case (osgGA::GUIEventAdapter::KEYDOWN) : { // Note that we are setting the modifier mask here instead of the modifier itself m_keyboardScaffold.lock()->updateDevice(ea.getUnmodifiedKey(), ea.getModKeyMask()); result = true; break; } case (osgGA::GUIEventAdapter::KEYUP) : { m_keyboardScaffold.lock()->updateDevice(KeyCode::NONE, ModKeyMask::MODKEY_NONE); result = true; break; } default: result = false; break; } // We wan to to support some of the osg viewer keys, pass these through, we will still receive the event, but osg // will also react here int key = ea.getUnmodifiedKey(); if (key == 's' || key == 't' || key == 'v' || key == 'w') { // s: Stats Display // t: texturing // v: vsync // w: wireframe result = false; } return result; } }; // namespace Devices }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Devices/Keyboard/OsgKeyboardHandler.h000066400000000000000000000030011277777236100245010ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DEVICES_KEYBOARD_OSGKEYBOARDHANDLER_H #define SURGSIM_DEVICES_KEYBOARD_OSGKEYBOARDHANDLER_H #include #include namespace SurgSim { namespace Devices { class KeyboardScaffold; class OsgKeyboardHandler : public osgGA::GUIEventHandler { public: /// Constructor OsgKeyboardHandler(); /// Method to handle GUI event /// \param ea A osgGA::GUIEventAdapter /// \param aa A osgGA::GUIActionAdapter (required by this virtual method) /// \return True if the event has been handled by this method; Otherwise, false. bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa) override; private: /// A back pointer to the scaffold which owns this handle std::weak_ptr m_keyboardScaffold; }; }; // namespace Devices }; // namespace SurgSim #endif // SURGSIM_DEVICES_KEYBOARD_OSGKEYBOARDHANDLER_Hopensurgsim-0.7.0/SurgSim/Devices/Keyboard/UnitTests/000077500000000000000000000000001277777236100225715ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Devices/Keyboard/UnitTests/CMakeLists.txt000066400000000000000000000017721277777236100253400ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2012-2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. include_directories( ${gtest_SOURCE_DIR}/include ) set(UNIT_TEST_SOURCES KeyboardDeviceTest.cpp KeyboardScaffoldTest.cpp ) set(LIBS KeyboardDevice SurgSimDataStructures SurgSimFramework SurgSimInput ${Boost_LIBRARIES} ${OPENSCENEGRAPH_LIBRARIES} ) surgsim_add_unit_tests(KeyboardDeviceTest) set_target_properties(KeyboardDeviceTest PROPERTIES FOLDER "Devices") opensurgsim-0.7.0/SurgSim/Devices/Keyboard/UnitTests/KeyboardDeviceTest.cpp000066400000000000000000000047731277777236100270300ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the KeyboardDevice class. #include #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/Devices/Keyboard/KeyboardDevice.h" #include "SurgSim/Devices/Keyboard/KeyboardScaffold.h" #include "SurgSim/Input/InputConsumerInterface.h" #include "SurgSim/Testing/MockInputOutput.h" namespace SurgSim { namespace Devices { using SurgSim::Devices::KeyboardDevice; using SurgSim::DataStructures::DataGroup; using SurgSim::Testing::MockInputOutput; class KeyboardDeviceTest : public ::testing::Test { public: static void update(std::shared_ptr device) { device->m_scaffold->updateDevice(0, 0); } }; TEST_F(KeyboardDeviceTest, InitializeDevice) { std::shared_ptr device = std::make_shared("TestKeyboard"); ASSERT_TRUE(device != nullptr) << "Device creation failed."; EXPECT_FALSE(device->isInitialized()); ASSERT_TRUE(device->initialize()) << "Initialization failed. Is a Keyboard device plugged in?"; EXPECT_TRUE(device->isInitialized()); } TEST_F(KeyboardDeviceTest, InputConsumer) { std::shared_ptr device = std::make_shared("TestKeyboard"); device->initialize(); std::shared_ptr consumer = std::make_shared(); EXPECT_TRUE(device->addInputConsumer(consumer)); KeyboardDeviceTest::update(device); EXPECT_TRUE(consumer->m_lastReceivedInput.integers().hasData("key")); EXPECT_TRUE(consumer->m_lastReceivedInput.integers().hasData("modifierMask")); } TEST_F(KeyboardDeviceTest, NoTwoKeyboards) { std::shared_ptr device1 = std::make_shared("TestKeyboard1"); std::shared_ptr device2 = std::make_shared("TestKeyboard2"); EXPECT_NO_THROW(device1->initialize()); EXPECT_ANY_THROW(device2->initialize()); } }; // namespace Devices }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Devices/Keyboard/UnitTests/KeyboardScaffoldTest.cpp000066400000000000000000000043601277777236100273420ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the OsgKeyboardScaffold class and its device interactions. #include #include "SurgSim/Devices/Keyboard/KeyboardScaffold.h" using SurgSim::Devices::KeyboardScaffold; TEST(KeyboardScaffoldTest, CreateAndDestroyScaffold) { std::shared_ptr scaffold = KeyboardScaffold::getOrCreateSharedInstance(); ASSERT_TRUE(nullptr != scaffold) << "The scaffold was not created!"; std::weak_ptr scaffold1 = scaffold; { std::shared_ptr stillHaveScaffold = scaffold1.lock(); EXPECT_NE(nullptr, stillHaveScaffold) << "Unable to get scaffold from weak ref (while strong ref exists)"; EXPECT_EQ(scaffold, stillHaveScaffold) << "Scaffold mismatch!"; } { std::shared_ptr sameScaffold = KeyboardScaffold::getOrCreateSharedInstance(); EXPECT_NE(nullptr, sameScaffold) << "Unable to get scaffold from class"; EXPECT_EQ(scaffold, sameScaffold) << "Scaffold mismatch!"; } scaffold.reset(); { std::shared_ptr dontHaveScaffold = scaffold1.lock(); EXPECT_TRUE(nullptr == dontHaveScaffold) << "Able to get scaffold from weak ref (with no strong ref)"; } scaffold = KeyboardScaffold::getOrCreateSharedInstance(); ASSERT_TRUE(nullptr != scaffold) << "The scaffold was not created the 2nd time!"; std::weak_ptr scaffold2 = scaffold; { std::shared_ptr stillHaveScaffold = scaffold2.lock(); ASSERT_NE(nullptr, stillHaveScaffold) << "Unable to get scaffold from weak ref (while strong ref exists)"; ASSERT_EQ(scaffold, stillHaveScaffold) << "Scaffold mismatch!"; } }opensurgsim-0.7.0/SurgSim/Devices/Keyboard/VisualTests/000077500000000000000000000000001277777236100231155ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Devices/Keyboard/VisualTests/CMakeLists.txt000066400000000000000000000020671277777236100256620ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2012-2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. set(UNIT_TEST_SOURCES KeyboardVisualTests.cpp ) set(UNIT_TEST_HEADERS ) surgsim_add_executable(KeyboardVisualTest "${UNIT_TEST_SOURCES}" "${UNIT_TEST_HEADERS}") set(LIBS KeyboardDevice SurgSimDataStructures SurgSimInput ${OPENSCENEGRAPH_LIBRARIES} ) target_link_libraries(KeyboardVisualTest ${LIBS}) # Put KeyboardVisualTest into folder "Devices" set_target_properties(KeyboardVisualTest PROPERTIES FOLDER "Devices") opensurgsim-0.7.0/SurgSim/Devices/Keyboard/VisualTests/KeyboardVisualTests.cpp000066400000000000000000000313351277777236100275750ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include #include #include #include #include #include #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/Devices/Keyboard/KeyboardDevice.h" #include "SurgSim/Devices/Keyboard/OsgKeyboardHandler.h" #include "SurgSim/Devices/Keyboard/KeyCode.h" #include "SurgSim/Input/InputConsumerInterface.h" using SurgSim::DataStructures::DataGroup; struct TestListener : public SurgSim::Input::InputConsumerInterface { TestListener() { creatKeyMap(); createModifierMap(); } void initializeInput(const std::string& device, const DataGroup& inputData) override {} void handleInput(const std::string& device, const DataGroup& inputData) override { int key, modifierMask; inputData.integers().get("key", &key); inputData.integers().get("modifierMask", &modifierMask); if (key != SurgSim::Devices::KeyCode::NONE) { std::cerr << "Key pressed :" << keyMap[key] << std::endl; if (modifierMask != SurgSim::Devices::ModKeyMask::MODKEY_NONE) { if (modifierMap[modifierMask] != "") { std::cerr << "Modifier:" << modifierMap[modifierMask] << std::endl; } else { std::cerr << "Modifier: UNDEFINED" << std::endl; } } } } // keyMap is used to output the corresponding key name for a given key code. std::map keyMap; // modifierMap is used to output the corresponding modifier name for a given modifier mask. std::map modifierMap; void creatKeyMap() { using SurgSim::Devices::KeyCode; keyMap[KeyCode::KEY_SPACE] = "KEY_SPACE"; keyMap[KeyCode::KEY_0] = "0"; keyMap[KeyCode::KEY_1] = "1"; keyMap[KeyCode::KEY_2] = "2"; keyMap[KeyCode::KEY_3] = "3"; keyMap[KeyCode::KEY_4] = "4"; keyMap[KeyCode::KEY_5] = "5"; keyMap[KeyCode::KEY_6] = "6"; keyMap[KeyCode::KEY_7] = "7"; keyMap[KeyCode::KEY_8] = "8"; keyMap[KeyCode::KEY_9] = "9"; keyMap[KeyCode::KEY_A] = "a"; keyMap[KeyCode::KEY_B] = "b"; keyMap[KeyCode::KEY_C] = "c"; keyMap[KeyCode::KEY_D] = "d"; keyMap[KeyCode::KEY_E] = "e"; keyMap[KeyCode::KEY_F] = "f"; keyMap[KeyCode::KEY_G] = "g"; keyMap[KeyCode::KEY_H] = "h"; keyMap[KeyCode::KEY_I] = "i"; keyMap[KeyCode::KEY_J] = "j"; keyMap[KeyCode::KEY_K] = "k"; keyMap[KeyCode::KEY_L] = "l"; keyMap[KeyCode::KEY_M] = "m"; keyMap[KeyCode::KEY_N] = "n"; keyMap[KeyCode::KEY_O] = "o"; keyMap[KeyCode::KEY_P] = "p"; keyMap[KeyCode::KEY_Q] = "q"; keyMap[KeyCode::KEY_R] = "r"; keyMap[KeyCode::KEY_S] = "s"; keyMap[KeyCode::KEY_T] = "t"; keyMap[KeyCode::KEY_U] = "u"; keyMap[KeyCode::KEY_V] = "v"; keyMap[KeyCode::KEY_W] = "w"; keyMap[KeyCode::KEY_X] = "x"; keyMap[KeyCode::KEY_Y] = "y"; keyMap[KeyCode::KEY_Z] = "z"; keyMap[KeyCode::KEY_EXCLAIM] = "KEY_EXCLAIM"; keyMap[KeyCode::KEY_QUOTEDBL] = "KEY_QUOTEDBL"; keyMap[KeyCode::KEY_HASH] = "KEY_HASH"; keyMap[KeyCode::KEY_DOLLAR] = "KEY_DOLLAR"; keyMap[KeyCode::KEY_AMPERSAND] = "KEY_AMPERSAND"; keyMap[KeyCode::KEY_QUOTE] = "KEY_QUOTE"; keyMap[KeyCode::KEY_LEFTPAREN] = "KEY_LEFTPAREN"; keyMap[KeyCode::KEY_RIGHTPAREN]= "KEY_RIGHTPAREN"; keyMap[KeyCode::KEY_ASTERISK] = "KEY_ASTERISK"; keyMap[KeyCode::KEY_PLUS] = "KEY_PLUS"; keyMap[KeyCode::KEY_COMMA] = "KEY_COMMA"; keyMap[KeyCode::KEY_MINUS] = "KEY_MINUS"; keyMap[KeyCode::KEY_PERIOD] = "KEY_PERIOD"; keyMap[KeyCode::KEY_SLASH] = "KEY_SLASH"; keyMap[KeyCode::KEY_COLON] = "KEY_COLON"; keyMap[KeyCode::KEY_SEMICOLON] = "KEY_SEMICOLON"; keyMap[KeyCode::KEY_LESS] = "KEY_LESS"; keyMap[KeyCode::KEY_EQUALS] = "KEY_EQUALS"; keyMap[KeyCode::KEY_GREATER] = "KEY_GREATER"; keyMap[KeyCode::KEY_QUESTION] = "KEY_QUESTION"; keyMap[KeyCode::KEY_AT] = "KEY_AT"; keyMap[KeyCode::KEY_LEFTBRACKET] = "KEY_LEFTBRACKET"; keyMap[KeyCode::KEY_BACKSLASH] = "KEY_BACKSLASH"; keyMap[KeyCode::KEY_RIGHTBRACKET]= "KEY_RIGHTBRACKET"; keyMap[KeyCode::KEY_CARET] = "KEY_CARET"; keyMap[KeyCode::KEY_UNDERSCORE] = "KEY_UNDERSCORE"; keyMap[KeyCode::KEY_BACKQUOTE] = "KEY_BACKQUOTE"; keyMap[KeyCode::KEY_BACKSPACE] = "KEY_BACKSPACE"; keyMap[KeyCode::KEY_TAB] = "KEY_TAB"; keyMap[KeyCode::KEY_LINEFEED] = "KEY_LINEFEED"; keyMap[KeyCode::KEY_CLEAR] = "KEY_CLEAR"; keyMap[KeyCode::KEY_RETURN] = "KEY_RETURN"; keyMap[KeyCode::KEY_PAUSE] = "KEY_PAUSE"; keyMap[KeyCode::KEY_SCROLL_LOCK] = "KEY_SCROLL_LOCK"; keyMap[KeyCode::KEY_SYS_REQ] = "KEY_SYS_REQ"; keyMap[KeyCode::KEY_ESCAPE] = "KEY_ESCAPE"; keyMap[KeyCode::KEY_DELETE] = "KEY_DELETE"; keyMap[KeyCode::KEY_HOME] = "KEY_HOME"; keyMap[KeyCode::KEY_LEFT] = "KEY_LEFT"; keyMap[KeyCode::KEY_UP] = "KEY_UP"; keyMap[KeyCode::KEY_RIGHT] = "KEY_RIGHT"; keyMap[KeyCode::KEY_DOWN] = "KEY_DOWN"; keyMap[KeyCode::KEY_PRIOR] = "KEY_PRIOR"; keyMap[KeyCode::KEY_PAGE_UP] = "KEY_PAGE_UP"; keyMap[KeyCode::KEY_NEXT] = "KEY_NEXT"; keyMap[KeyCode::KEY_PAGE_DOWN] = "KEY_PAGE_DOWN"; keyMap[KeyCode::KEY_END] = "KEY_END"; keyMap[KeyCode::KEY_BEGIN] = "KEY_BEGIN"; keyMap[KeyCode::KEY_SELECT] = "KEY_SELECT"; keyMap[KeyCode::KEY_PRINT] = "KEY_PRINT"; keyMap[KeyCode::KEY_EXECUTE] = "KEY_EXECUTE"; keyMap[KeyCode::KEY_INSERT] = "KEY_INSERT"; keyMap[KeyCode::KEY_UNDO] = "KEY_UNDO"; keyMap[KeyCode::KEY_REDO] = "KEY_REDO"; keyMap[KeyCode::KEY_MENU] = "KEY_MENU"; keyMap[KeyCode::KEY_FIND] = "KEY_FIND"; keyMap[KeyCode::KEY_CANCEL] = "KEY_CANCEL"; keyMap[KeyCode::KEY_HELP] = "KEY_HELP"; keyMap[KeyCode::KEY_BREAK] = "KEY_BREAK"; keyMap[KeyCode::KEY_MODE_SWITCH] = "KEY_MODE_SWITCH"; keyMap[KeyCode::KEY_SCRIPT_SWITCH] = "KEY_SCRIPT_SWITCH"; keyMap[KeyCode::KEY_NUM_LOCK] = "KEY_NUM_LOCK"; keyMap[KeyCode::KEY_KP_SPACE] = "KEY_KP_SPACE"; keyMap[KeyCode::KEY_KP_TAB] = "KEY_KP_TAB"; keyMap[KeyCode::KEY_KP_ENTER] = "KEY_KP_ENTER"; keyMap[KeyCode::KEY_KP_F1] = "KEY_KP_F1"; keyMap[KeyCode::KEY_KP_F2] = "KEY_KP_F2"; keyMap[KeyCode::KEY_KP_F3] = "KEY_KP_F3"; keyMap[KeyCode::KEY_KP_F4] = "KEY_KP_F4"; keyMap[KeyCode::KEY_KP_HOME] = "KEY_KP_HOME"; keyMap[KeyCode::KEY_KP_LEFT] = "KEY_KP_LEFT"; keyMap[KeyCode::KEY_KP_UP] = "KEY_KP_UP"; keyMap[KeyCode::KEY_KP_RIGHT] = "KEY_KP_RIGHT"; keyMap[KeyCode::KEY_KP_DOWN] = "KEY_KP_DOWN"; keyMap[KeyCode::KEY_KP_PRIOR] = "KEY_KP_PRIOR"; keyMap[KeyCode::KEY_KP_PAGE_UP] = "KEY_KP_PAGE_UP"; keyMap[KeyCode::KEY_KP_NEXT] = "KEY_KP_NEXT"; keyMap[KeyCode::KEY_KP_PAGE_DOWN] = "KEY_KP_PAGE_DOWN"; keyMap[KeyCode::KEY_KP_END] = "KEY_KP_END"; keyMap[KeyCode::KEY_KP_BEGIN] = "KEY_KP_BEGIN"; keyMap[KeyCode::KEY_KP_INSERT] = "KEY_KP_INSERT"; keyMap[KeyCode::KEY_KP_DELETE] = "KEY_KP_DELETE"; keyMap[KeyCode::KEY_KP_EQUAL] = "KEY_KP_EQUAL"; keyMap[KeyCode::KEY_KP_MULTIPLY] = "KEY_KP_MULTIPLY"; keyMap[KeyCode::KEY_KP_ADD] = "KEY_KP_ADD"; keyMap[KeyCode::KEY_KP_SEPARATOR]= "KEY_KP_SEPARATOR"; keyMap[KeyCode::KEY_KP_SUBTRACT] = "KEY_KP_SUBTRACT"; keyMap[KeyCode::KEY_KP_DECIMAL] = "KEY_KP_DECIMAL"; keyMap[KeyCode::KEY_KP_DIVIDE] = "KEY_KP_DIVIDE"; keyMap[KeyCode::KEY_KP_0] = "KEY_KP_0"; keyMap[KeyCode::KEY_KP_1] = "KEY_KP_1"; keyMap[KeyCode::KEY_KP_2] = "KEY_KP_2"; keyMap[KeyCode::KEY_KP_3] = "KEY_KP_3"; keyMap[KeyCode::KEY_KP_4] = "KEY_KP_4"; keyMap[KeyCode::KEY_KP_5] = "KEY_KP_5"; keyMap[KeyCode::KEY_KP_6] = "KEY_KP_6"; keyMap[KeyCode::KEY_KP_7] = "KEY_KP_7"; keyMap[KeyCode::KEY_KP_8] = "KEY_KP_8"; keyMap[KeyCode::KEY_KP_9] = "KEY_KP_9"; keyMap[KeyCode::KEY_F1] = "KEY_F1"; keyMap[KeyCode::KEY_F2] = "KEY_F2"; keyMap[KeyCode::KEY_F3] = "KEY_F3"; keyMap[KeyCode::KEY_F4] = "KEY_F4"; keyMap[KeyCode::KEY_F5] = "KEY_F5"; keyMap[KeyCode::KEY_F6] = "KEY_F6"; keyMap[KeyCode::KEY_F7] = "KEY_F7"; keyMap[KeyCode::KEY_F8] = "KEY_F8"; keyMap[KeyCode::KEY_F9] = "KEY_F9"; keyMap[KeyCode::KEY_F10] = "KEY_F10"; keyMap[KeyCode::KEY_F11] = "KEY_F11"; keyMap[KeyCode::KEY_F12] = "KEY_F12"; keyMap[KeyCode::KEY_F13] = "KEY_F13"; keyMap[KeyCode::KEY_F14] = "KEY_F14"; keyMap[KeyCode::KEY_F15] = "KEY_F15"; keyMap[KeyCode::KEY_F16] = "KEY_F16"; keyMap[KeyCode::KEY_F17] = "KEY_F17"; keyMap[KeyCode::KEY_F18] = "KEY_F18"; keyMap[KeyCode::KEY_F19] = "KEY_F19"; keyMap[KeyCode::KEY_F20] = "KEY_F20"; keyMap[KeyCode::KEY_F21] = "KEY_F21"; keyMap[KeyCode::KEY_F22] = "KEY_F22"; keyMap[KeyCode::KEY_F23] = "KEY_F23"; keyMap[KeyCode::KEY_F24] = "KEY_F24"; keyMap[KeyCode::KEY_F25] = "KEY_F25"; keyMap[KeyCode::KEY_F26] = "KEY_F26"; keyMap[KeyCode::KEY_F27] = "KEY_F27"; keyMap[KeyCode::KEY_F28] = "KEY_F28"; keyMap[KeyCode::KEY_F29] = "KEY_F29"; keyMap[KeyCode::KEY_F30] = "KEY_F30"; keyMap[KeyCode::KEY_F31] = "KEY_F31"; keyMap[KeyCode::KEY_F32] = "KEY_F32"; keyMap[KeyCode::KEY_F33] = "KEY_F33"; keyMap[KeyCode::KEY_F34] = "KEY_F34"; keyMap[KeyCode::KEY_F35] = "KEY_F35"; keyMap[KeyCode::KEY_SHIFT_L] = "KEY_SHIFT_L"; keyMap[KeyCode::KEY_SHIFT_R] = "KEY_SHIFT_R"; keyMap[KeyCode::KEY_CONTROL_L] = "KEY_CONTROL_L"; keyMap[KeyCode::KEY_CONTROL_R] = "KEY_CONTROL_R"; keyMap[KeyCode::KEY_CAPS_LOCK] = "KEY_CAPS_LOCK"; keyMap[KeyCode::KEY_SHIFT_LOCK] = "KEY_SHIFT_LOCK"; keyMap[KeyCode::KEY_META_L] = "KEY_META_L"; keyMap[KeyCode::KEY_META_R] = "KEY_META_R"; keyMap[KeyCode::KEY_ALT_L] = "KEY_ALT_L"; keyMap[KeyCode::KEY_ALT_R] = "KEY_ALT_R"; keyMap[KeyCode::KEY_SUPER_L] = "KEY_SUPER_L"; keyMap[KeyCode::KEY_SUPER_R] = "KEY_SUPER_R"; keyMap[KeyCode::KEY_HYPER_L] = "KEY_HYPER_L"; keyMap[KeyCode::KEY_HYPER_R] = "KEY_HYPER_R"; }; void createModifierMap() { using SurgSim::Devices::ModKeyMask; modifierMap[ModKeyMask::MODKEY_LEFT_SHIFT] = "KEY_SHIFT_L"; modifierMap[ModKeyMask::MODKEY_RIGHT_SHIFT] = "KEY_SHIFT_R"; modifierMap[ModKeyMask::MODKEY_LEFT_CTRL] = "KEY_CONTROL_L"; modifierMap[ModKeyMask::MODKEY_RIGHT_CTRL] = "KEY_CONTROL_R"; modifierMap[ModKeyMask::MODKEY_LEFT_ALT] = "KEY_ALT_L"; modifierMap[ModKeyMask::MODKEY_RIGHT_ALT] = "KEY_ALT_R"; modifierMap[ModKeyMask::MODKEY_LEFT_META] = "KEY_META_L"; modifierMap[ModKeyMask::MODKEY_RIGHT_META] = "KEY_META_R"; modifierMap[ModKeyMask::MODKEY_LEFT_SUPER] = "KEY_SUPER_L"; modifierMap[ModKeyMask::MODKEY_RIGHT_SUPER] = "KEY_SUPER_R"; modifierMap[ModKeyMask::MODKEY_LEFT_HYPER] = "KEY_HYPER_L"; modifierMap[ModKeyMask::MODKEY_RIGHT_HYPER] = "KEY_HYPER_R"; modifierMap[ModKeyMask::MODKEY_NUM_LOCK] = "KEY_NUM_LOCK"; modifierMap[ModKeyMask::MODKEY_CAPS_LOCK] = "KEY_CAPS_LOCK"; modifierMap[ModKeyMask::MODKEY_CTRL] = "KEY_CTRL"; modifierMap[ModKeyMask::MODKEY_SHIFT] = "KEY_SHIFT"; modifierMap[ModKeyMask::MODKEY_ALT] = "KEY_ALT"; modifierMap[ModKeyMask::MODKEY_META] = "KEY_META"; modifierMap[ModKeyMask::MODKEY_SUPER] = "KEY_SUPER"; modifierMap[ModKeyMask::MODKEY_HYPER] = "KEY_HYPER"; modifierMap[ModKeyMask::MODKEY_CAPS_SHIFT_L] = "KEY_CAPS_SHIFT_L"; modifierMap[ModKeyMask::MODKEY_CAPS_SHIFT_R] = "KEY_CAPS_SHIFT_R"; modifierMap[ModKeyMask::MODKEY_CAPS_CONTROL_L] = "KEY_CAPS_CONTROL_L"; modifierMap[ModKeyMask::MODKEY_CAPS_CONTROL_R] = "KEY_CAPS_CONTROL_R"; modifierMap[ModKeyMask::MODKEY_CAPS_ALT_L] = "KEY_CAPS_ALT_L"; modifierMap[ModKeyMask::MODKEY_CAPS_ALT_R] = "KEY_CAPS_ALT_R"; } }; int main(int argc, char* argv[]) { auto toolDevice = std::make_shared("Keyboard"); toolDevice->initialize(); osg::ref_ptr keyboardHandler = toolDevice->getKeyboardHandler(); auto consumer = std::make_shared(); toolDevice->addInputConsumer(consumer); osg::ref_ptr text = new osgText::Text; text->setText("Press any key in this window \n\nto verify keyboard driver \n\nworks correctly."); text->setPosition(osg::Vec3(0.0f, 300.0f, 0.0f)); osg::ref_ptr geode = new osg::Geode; geode->addDrawable(text); osg::ref_ptr camera = new osg::Camera; camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF); camera->setProjectionMatrixAsOrtho2D(0, 600 ,0, 400); camera->getOrCreateStateSet()->setMode(GL_LIGHTING,osg::StateAttribute::OFF); camera->addChild(geode); osg::ref_ptr group = new osg::Group; group->addChild(camera); osg::ref_ptr viewer = new osgViewer::Viewer; viewer->setUpViewInWindow(400, 400, 640, 480); viewer->addEventHandler(keyboardHandler); viewer->setSceneData(group); viewer->run(); return 0; } opensurgsim-0.7.0/SurgSim/Devices/LabJack/000077500000000000000000000000001277777236100203565ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Devices/LabJack/CMakeLists.txt000066400000000000000000000041261277777236100231210ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. find_package(LabJack REQUIRED) link_directories(${Boost_LIBRARY_DIRS}) set(LIBS ${Boost_LIBRARIES} SurgSimFramework SurgSimInput ${LABJACK_LIBRARY} ) include_directories( ${CMAKE_CURRENT_SOURCE_DIR} ${LABJACK_INCLUDE_DIR} ) set(LABJACK_DEVICE_SOURCES LabJackDevice.cpp LabJackThread.cpp ) set(LABJACK_DEVICE_HEADERS LabJackDevice.h LabJackScaffold.h LabJackThread.h ) set(DEVICE_HEADERS ${DEVICE_HEADERS} LabJack/LabJackDevice.h PARENT_SCOPE) set(LABJACK_DEVICE_LINUX_SOURCES linux/LabJackChecksums.cpp linux/LabJackScaffold.cpp linux/LabJackTypeConverters.cpp ) set(LABJACK_DEVICE_LINUX_HEADERS linux/LabJackChecksums.h linux/LabJackConstants.h linux/LabJackTypeConverters.h ) set(LABJACK_DEVICE_WIN_SOURCES win32/LabJackScaffold.cpp ) if(${CMAKE_SYSTEM_NAME} STREQUAL "Windows") list(APPEND LABJACK_DEVICE_SOURCES ${LABJACK_DEVICE_WIN_SOURCES}) else() list(APPEND LABJACK_DEVICE_HEADERS ${LABJACK_DEVICE_LINUX_HEADERS}) list(APPEND LABJACK_DEVICE_SOURCES ${LABJACK_DEVICE_LINUX_SOURCES}) endif() # TODO(advornik): the installation should NOT copy all the headers... surgsim_add_library( LabJackDevice "${LABJACK_DEVICE_SOURCES}" "${LABJACK_DEVICE_HEADERS}" ) target_link_libraries(LabJackDevice ${LIBS}) if(BUILD_TESTING) # The unit tests will be built whenever the library is built. add_subdirectory(UnitTests) if(GLUT_FOUND) add_subdirectory(VisualTest) endif(GLUT_FOUND) endif() set_target_properties(LabJackDevice PROPERTIES FOLDER "Devices") opensurgsim-0.7.0/SurgSim/Devices/LabJack/LabJack.dox000066400000000000000000000023321277777236100223610ustar00rootroot00000000000000/*! \page LabJack LabJack: A Measurement and Automation Device LabJack Corporation produces measurement and automation devices (e.g., DAQs). Currently OpenSurgSim supports only some devices (dependent on operating system, see below), and only some functionality on any device. Supported functionality: digital input, digital output, and timers (e.g., PWM, frequency output, and quadrature input). Supported models: - Linux (and Mac OS X): The LabJack U3 and U6 (including Pro version) are supported with limited functionality. - Windows: The LabJack U3, U6 (including Pro version), and UE9 are supported with limited functionality. Dependencies: - Linux (and Mac OS X): The exodriver (aka labjackusb) driver must be installed https://github.com/labjack/exodriver - Follow the instructions in the INSTALL file; installation of libusb-1.0 library and development files is required. - (Probably optional) An environment variable named LABJACK_SDK may be set to the directory containing (include/)LabJackUD.h - Windows: The LabJackUD driver must be installed from the company's website http://labjack.com/ - An environment variable named LABJACK_SDK must be set to the directory containing (include\\)LabJackUD.h */opensurgsim-0.7.0/SurgSim/Devices/LabJack/LabJackDevice.cpp000066400000000000000000000226611277777236100235000ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Devices/LabJack/LabJackDevice.h" #include "SurgSim/Devices/LabJack/LabJackScaffold.h" #include "SurgSim/Framework/Log.h" namespace SurgSim { namespace Devices { SURGSIM_REGISTER(SurgSim::Input::DeviceInterface, SurgSim::Devices::LabJackDevice, LabJackDevice); LabJackDevice::LabJackDevice(const std::string& uniqueName) : SurgSim::Input::CommonDevice(uniqueName, LabJackScaffold::buildDeviceInputData()), m_model(LabJack::MODEL_SEARCH), m_connection(LabJack::CONNECTION_SEARCH), m_address(""), m_reset(false), m_timerBase(LabJack::TIMERBASE_DEFAULT), m_timerClockDivisor(1), m_timerCounterPinOffset(0), m_threadRate(1000.0), m_analogInputResolution(0), m_analogInputSettling(0) { } LabJackDevice::~LabJackDevice() { if (isInitialized()) { finalize(); } } bool LabJackDevice::initialize() { SURGSIM_ASSERT(!isInitialized()) << "LabJackDevice already initialized."; std::shared_ptr scaffold = LabJackScaffold::getOrCreateSharedInstance(); SURGSIM_ASSERT(scaffold != nullptr) << "LabJackDevice failed to get a LabJackScaffold."; auto logger = Framework::Logger::getLogger("Devices/LabJack"); SURGSIM_LOG_IF((getDigitalOutputs().size() > 0) && !hasOutputProducer(), logger, WARNING) << "LabJackDevice named " << getName() << " has digital output channels but no output producer to provide the output data. Call setOutputProducer."; SURGSIM_LOG_IF((getAnalogOutputs().size() > 0) && !hasOutputProducer(), logger, WARNING) << "LabJackDevice named " << getName() << " has analog output channels but no output producer to provide the output data. Call setOutputProducer."; bool registered = false; // registerDevice will set this object's type and/or connection, if they are currently set to SEARCH. if (scaffold->registerDevice(this)) { m_scaffold = std::move(scaffold); registered = true; } return registered; } bool LabJackDevice::finalize() { SURGSIM_ASSERT(isInitialized()) << "LabJackDevice has not been initialized before finalize."; const bool ok = m_scaffold->unregisterDevice(this); m_scaffold.reset(); return ok; } bool LabJackDevice::isInitialized() const { return (m_scaffold != nullptr); } void LabJackDevice::setModel(LabJack::Model model) { SURGSIM_ASSERT(!isInitialized()) << "LabJackDevice's model cannot be set after it is initialized."; m_model = model; } LabJack::Model LabJackDevice::getModel() const { return m_model; } void LabJackDevice::setConnection(LabJack::Connection connection) { SURGSIM_ASSERT(!isInitialized()) << "LabJackDevice's connection cannot be set after it is initialized."; m_connection = connection; } LabJack::Connection LabJackDevice::getConnection() const { return m_connection; } void LabJackDevice::setAddress(std::string address) { SURGSIM_ASSERT(!isInitialized()) << "LabJackDevice's address cannot be set after it is initialized."; m_address = address; } const std::string& LabJackDevice::getAddress() const { return m_address; } void LabJackDevice::setResetOnDestruct(bool reset) { m_reset = reset; } bool LabJackDevice::getResetOnDestruct() const { return m_reset; } void LabJackDevice::enableDigitalInput(int channel) { SURGSIM_ASSERT(!isInitialized()) << "Digital input cannot be enabled for a LabJackDevice after it is initialized."; m_digitalInputChannels.insert(channel); } void LabJackDevice::setDigitalInputs(const std::unordered_set& digitalInputChannels) { SURGSIM_ASSERT(!isInitialized()) << "Digital inputs cannot be enabled for a LabJackDevice after it is initialized."; m_digitalInputChannels = digitalInputChannels; } const std::unordered_set& LabJackDevice::getDigitalInputs() const { return m_digitalInputChannels; } void LabJackDevice::enableDigitalOutput(int channel) { SURGSIM_ASSERT(!isInitialized()) << "Digital output cannot be enabled for a LabJackDevice after it is initialized."; m_digitalOutputChannels.insert(channel); } void LabJackDevice::setDigitalOutputs(const std::unordered_set& digitalOutputChannels) { SURGSIM_ASSERT(!isInitialized()) << "Digital outputs cannot be enabled for a LabJackDevice after it is initialized."; m_digitalOutputChannels = digitalOutputChannels; } const std::unordered_set& LabJackDevice::getDigitalOutputs() const { return m_digitalOutputChannels; } void LabJackDevice::setTimerBase(LabJack::TimerBase base) { SURGSIM_ASSERT(!isInitialized()) << "LabJackDevice's timer base cannot be set after it is initialized."; m_timerBase = base; } LabJack::TimerBase LabJackDevice::getTimerBase() const { return m_timerBase; } void LabJackDevice::setTimerClockDivisor(int divisor) { SURGSIM_ASSERT(!isInitialized()) << "LabJackDevice's timer clock divisor cannot be set after it is initialized."; m_timerClockDivisor = divisor; } int LabJackDevice::getTimerClockDivisor() const { return m_timerClockDivisor; } void LabJackDevice::setTimerCounterPinOffset(int offset) { SURGSIM_ASSERT(!isInitialized()) << "LabJackDevice's timer/counter pin offset cannot be set after it is initialized."; m_timerCounterPinOffset = offset; } int LabJackDevice::getTimerCounterPinOffset() const { return m_timerCounterPinOffset; } void LabJackDevice::enableTimer(int index, LabJack::TimerMode mode) { SURGSIM_ASSERT(!isInitialized()) << "Timers cannot be enabled for a LabJackDevice after it is initialized."; LabJack::TimerSettings timerModeAndOptionalInitialValue = {mode, DataStructures::OptionalValue()}; m_timers[index] = std::move(timerModeAndOptionalInitialValue); } void LabJackDevice::enableTimer(int index, LabJack::TimerMode mode, int initialValue) { SURGSIM_ASSERT(!isInitialized()) << "Timers cannot be enabled for a LabJackDevice after it is initialized."; LabJack::TimerSettings timerModeAndOptionalInitialValue = {mode, DataStructures::OptionalValue(initialValue)}; m_timers[index] = std::move(timerModeAndOptionalInitialValue); } void LabJackDevice::setTimers(const std::unordered_map& timers) { SURGSIM_ASSERT(!isInitialized()) << "Timers cannot be enabled for a LabJackDevice after it is initialized."; m_timers = timers; } const std::unordered_map& LabJackDevice::getTimers() const { return m_timers; } void LabJackDevice::setMaximumUpdateRate(double rate) { SURGSIM_ASSERT(!isInitialized()) << "LabJackDevice's maximum update rate cannot be set after it is initialized."; m_threadRate = rate; } double LabJackDevice::getMaximumUpdateRate() const { return m_threadRate; } void LabJackDevice::enableAnalogInput(int positiveChannel, LabJack::Range range, int negativeChannel) { SURGSIM_ASSERT(!isInitialized()) << "Analog inputs cannot be enabled for a LabJackDevice after it is initialized."; LabJack::AnalogInputSettings rangeAndOptionalNegativeChannel = {range, DataStructures::OptionalValue(negativeChannel)}; m_analogInputs[positiveChannel] = std::move(rangeAndOptionalNegativeChannel); } void LabJackDevice::enableAnalogInput(int channel, LabJack::Range range) { SURGSIM_ASSERT(!isInitialized()) << "Analog inputs cannot be enabled for a LabJackDevice after it is initialized."; LabJack::AnalogInputSettings rangeAndOptionalNegativeChannel = {range, DataStructures::OptionalValue()}; m_analogInputs[channel] = std::move(rangeAndOptionalNegativeChannel); } void LabJackDevice::setAnalogInputs(const std::unordered_map& analogInputs) { SURGSIM_ASSERT(!isInitialized()) << "Analog inputs cannot be enabled for a LabJackDevice after it is initialized."; m_analogInputs = analogInputs; } const std::unordered_map& LabJackDevice::getAnalogInputs() const { return m_analogInputs; } void LabJackDevice::enableAnalogOutput(int channel) { SURGSIM_ASSERT(!isInitialized()) << "Analog outputs cannot be enabled for a LabJackDevice after it is initialized."; m_analogOutputChannels.insert(channel); } void LabJackDevice::setAnalogOutputs(const std::unordered_set& analogOutputChannels) { SURGSIM_ASSERT(!isInitialized()) << "Analog outputs cannot be enabled for a LabJackDevice after it is initialized."; m_analogOutputChannels = analogOutputChannels; } const std::unordered_set& LabJackDevice::getAnalogOutputs() const { return m_analogOutputChannels; } void LabJackDevice::setAnalogInputResolution(int resolution) { SURGSIM_ASSERT(!isInitialized()) << "Analog input resolution cannot be set for a LabJackDevice after it is initialized."; m_analogInputResolution = resolution; } int LabJackDevice::getAnalogInputResolution() const { return m_analogInputResolution; } void LabJackDevice::setAnalogInputSettling(int settling) { SURGSIM_ASSERT(!isInitialized()) << "Analog input settling time cannot be set for a LabJackDevice after it is initialized."; m_analogInputSettling = settling; } int LabJackDevice::getAnalogInputSettling() const { return m_analogInputSettling; } }; // namespace Devices }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Devices/LabJack/LabJackDevice.h000066400000000000000000000512171277777236100231440ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DEVICES_LABJACK_LABJACKDEVICE_H #define SURGSIM_DEVICES_LABJACK_LABJACKDEVICE_H #include #include #include #include #include "SurgSim/DataStructures/OptionalValue.h" #include "SurgSim/Input/CommonDevice.h" namespace SurgSim { namespace Devices { class LabJackScaffold; SURGSIM_STATIC_REGISTRATION(LabJackDevice); namespace LabJack { ///@{ /// The timer or channel number that corresponds with the descriptive name used by the LabJack. /// Use these for the arguments to the enable* functions. enum TIMER { TIMER0, TIMER1, TIMER2, TIMER3, TIMER4, TIMER5 }; enum FIO_LINE { FIO0, FIO1, FIO2, FIO3, FIO4, FIO5, FIO6, FIO7 }; enum EIO_LINE { EIO0 = 8, EIO1, EIO2, EIO3, EIO4, EIO5, EIO6, EIO7 }; enum CIO_LINE { CIO0 = 16, CIO1, CIO2, CIO3 }; enum MIO_LINE { MIO0 = 20, MIO1, MIO2 }; enum AIN { AIN0, AIN1, AIN2, AIN3, AIN4, AIN5, AIN6, AIN7, AIN8, AIN9, AIN10, AIN11, AIN12, AIN13, AIN14, AIN15 }; enum DAC { DAC0, DAC1 }; ///@} /// The models of LabJack devices. Numbers come from LabJackUD.h. enum Model { MODEL_SEARCH = -1, MODEL_UE9 = 9, MODEL_U3 = 3, MODEL_U6 = 6 }; /// The connection (i.e., communication media) for LabJacks. Numbers come from LabJackUD.h. enum Connection { CONNECTION_SEARCH = -1, CONNECTION_USB = 1, CONNECTION_ETHERNET = 2, CONNECTION_ETHERNET_MB = 3, CONNECTION_ETHERNET_DATA_ONLY = 4 }; /// The timer base frequencies for LabJacks. A given value can correspond to different clock frequencies for different /// LabJack models. The same clock frequency corresponds to different values depending on whether the /// high- or low-level driver is used. See section 2.10 - Timers/Counters in the respective model's User's Guide. enum TimerBase { TIMERBASE_DEFAULT = -1, TIMERBASE_0 = 0, TIMERBASE_1 = 1, TIMERBASE_2 = 2, TIMERBASE_3 = 3, TIMERBASE_4 = 4, TIMERBASE_5 = 5, TIMERBASE_6 = 6, TIMERBASE_20 = 20, TIMERBASE_21 = 21, TIMERBASE_22 = 22, TIMERBASE_23 = 23, TIMERBASE_24 = 24, TIMERBASE_25 = 25, TIMERBASE_26 = 26 }; /// The timer modes. Numbers come from LabJackUD.h. Note that edge-counting modes require processing time: see the /// LabJack manual for restrictions on number of edges counted per second over all timers /// (e.g., 30,000/second for U3 or U6). enum TimerMode { TIMERMODE_PWM_16BIT = 0, // 16 bit PWM TIMERMODE_PWM_8BIT = 1, // 8 bit PWM TIMERMODE_RISING_EDGES_32BIT = 2, // 32-bit rising to rising edge measurement TIMERMODE_FALLING_EDGES_32BIT = 3, // 32-bit falling to falling edge measurement TIMERMODE_DUTY_CYCLE = 4, // duty cycle measurement TIMERMODE_FIRMWARE_COUNTER = 5, // firmware based rising edge counter TIMERMODE_FIRMWARE_COUNTER_DEBOUNCED = 6, // firmware counter with debounce TIMERMODE_FREQUENCY_OUTPUT = 7, // frequency output TIMERMODE_QUADRATURE = 8, // Quadrature TIMERMODE_TIMER_STOP = 9, // stops another timer after n pulses TIMERMODE_SYSTEM_TIMER_LOWER_32BITS = 10, // read lower 32-bits of system timer TIMERMODE_SYSTEM_TIMER_UPPR_32BITS = 11, // read upper 32-bits of system timer TIMERMODE_RISING_EDGES_16BIT = 12, // 16-bit rising to rising edge measurement TIMERMODE_FALLING_EDGES_16BIT = 13, // 16-bit falling to falling edge measurement TIMERMODE_LINE_TO_LINE = 14 // Line to Line measurement }; /// A struct holding the data to be associated with a Timer. struct TimerSettings { /// Equality comparison. /// \param other The object with which to compare. /// \return true if equivalent. bool operator==(const TimerSettings& other) const { return (mode == other.mode) && (initialValue == other.initialValue); } /// The mode. TimerMode mode; /// The initial value. SurgSim::DataStructures::OptionalValue initialValue; }; /// The analog input ranges. Equivalent to gain. Ignored for Linux scaffold, which auto-ranges. enum Range { RANGE_20 = 1, // -20V to +20V, LJ_rgBIP20V RANGE_10 = 2, // -10V to +10V, LJ_rgBIP10V RANGE_5 = 3, // -5V to +5V, LJ_rgBIP5V RANGE_4 = 4, // -4V to +4V, LJ_rgBIP4V RANGE_2_POINT_5 = 5, // -2.5V to +2.5V, LJ_rgBIP2P5V RANGE_2 = 6, // -2V to +2V, LJ_rgBIP2V RANGE_1_POINT_25 = 7, // -1.25V to +1.25V, LJ_rgBIP1P25V RANGE_1 = 8, // -1V to +1V, LJ_rgBIP1V RANGE_0_POINT_625 = 9, // -0.625V to +0.625V, LJ_rgBIPP625V RANGE_0_POINT_1 = 10, // -0.1V to +0.1V, LJ_rgBIPP1V RANGE_0_POINT_01 = 11 // -0.01V to +0.01V, LJ_rgBIPP01V }; /// A struct holding the data to be associated with the positive channel for an analog input. struct AnalogInputSettings { /// Equality comparison. /// \param other The object with which to compare. /// \return true if equivalent. bool operator==(const AnalogInputSettings& other) const { return (negativeChannel == other.negativeChannel) && (range == other.range); } /// The range. Range range; /// The negative channel. SurgSim::DataStructures::OptionalValue negativeChannel; }; }; /// A class implementing the communication with a LabJack data acquisition (DAQ) device. Should work for the U3, U6, /// and U9 models on Windows and the U3 and U6 on Linux. See the manual(s) for your LabJack device(s) to understand /// the input and output data, the configuration parameters, timing limitations, etc. The various parameters and /// inputs are almost always passed through unchanged to the device driver. Timers, digital input/output, and /// analog input/output are supported. Currently not supported are counters, using the same channel as /// the positive channel for multiple analog inputs, and reconfiguring the device after initialization. /// \warning The LabJack device is configurable to such a degree that neither this class nor LabJackScaffold are able /// to do significant error-checking. If the output DataGroup and the calls (e.g., addTimer) to this class /// are not in agreement, the requests to the LabJack device driver will not be correct. /// /// \par Application input provided by the device: /// | type | name | | /// | ---- | ---- | --- | /// | scalar | "analogInput0" | %Analog input with AIN0 as the positive channel | /// | scalar | "analogInput" | %Analog input with AIN1 as the positive channel | /// | ... | ... | ... | /// | scalar | "analogInput16" | %Analog input with AIN16 as the positive channel | /// | boolean| "digitalInput0" | %Digital input, line #0, true for high input, false for low | /// | boolean| "digitalInput1" | %Digital input, line #1, true for high input, false for low | /// | ... | ... | ... | /// | boolean| "digitalInput23" | %Digital input, line #23, true for high input, false for low | /// | scalar | "timerInput0" | %The input from timer #0 if that timer provides input values | /// | scalar | "timerInput1" | %The input from timer #1 if that timer provides input values | /// | ... | ... | ... | /// | scalar | "timerInput6" | %The input from timer #6 if that timer provides input values | /// /// /// \par Application output used by the device: /// | type | name | | /// | ---- | ---- | --- | /// | scalar | "analogOutput0" | %Analog output, DAC0 | /// | scalar | "analogOutput1" | %Analog output, DAC1 | /// | boolean| "digitalOutput0" | %Digital output, line #0, true for high output, false for low | /// | boolean| "digitalOutput1" | %Digital output, line #1, true for high output, false for low | /// | ... | ... | ... | /// | boolean| "digitalOutput23" | %Digital output, line #23, true for high output, false for low | /// | scalar | "timerOutput0" | %The output for timer #0 if that timer accepts output values | /// | scalar | "timerOutput1" | %The output for timer #1 if that timer accepts output values | /// | ... | ... | ... | /// | scalar | "timerOutput6" | %The output for timer #6 if that timer accepts output values | /// /// \sa SurgSim::Input::CommonDevice, SurgSim::Input::DeviceInterface, LabJackScaffold class LabJackDevice : public SurgSim::Input::CommonDevice { public: /// Constructor. /// \param uniqueName A unique name for the device that will be used by the application. explicit LabJackDevice(const std::string& uniqueName); SURGSIM_CLASSNAME(SurgSim::Devices::LabJackDevice); /// Destructor. virtual ~LabJackDevice(); bool initialize() override; bool isInitialized() const override; /// Set the model, e.g., U6. /// \param model The model. /// \exception Asserts if already initialized. void setModel(LabJack::Model model); /// \return The model, e.g., U6. LabJack::Model getModel() const; /// Set the connection type of the LabJack, e.g., USB. /// \param connection The communication medium. /// \exception Asserts if already initialized. void setConnection(LabJack::Connection connection); /// \return The connection type of the LabJack, e.g., USB. LabJack::Connection getConnection() const; /// Set the address of the LabJack, e.g., "1" or "192.168.7.23". If the address is zero-length, attempt to open the /// first-found device of the specified type on the specified connection. /// \param address The address for the device, or a zero-length string. /// \exception Asserts if already initialized. void setAddress(std::string address); /// \return The address of the LabJack, e.g., "1" or "192.168.7.23". const std::string& getAddress() const; /// Reset LabJack during destruct. /// \param reset true if the hardware should reset & re-enumerate when this object destructs. /// \note The LabJack hardware has the feature that it continues operation and remembers all settings even after /// the associated LabJackDevice object destructs and communication ends. /// This function causes the hardware to reset when the LabJackDevice object destructs, thereby returning to its /// default (boot-up) settings and forcing USB re-enumeration. /// \note After a reset, it will take a few seconds before the hardware can communicate. /// \warning If the LabJackDevice object does not cleanly destruct (e.g., the executable halts due to an exception), /// then the hardware will not reset. void setResetOnDestruct(bool reset); /// Get whether or not the hardware should reset when the LabJackDevice object destructs. /// \return true if should reset on destruct. bool getResetOnDestruct() const; /// Enable digital input line. /// \param channel The channel number. /// \exception Asserts if already initialized. void enableDigitalInput(int channel); /// Set which digital input lines are enabled. /// \param digitalInputChannels The line numbers for the digital inputs. /// \exception Asserts if already initialized. void setDigitalInputs(const std::unordered_set& digitalInputChannels); /// \return The enabled digital input lines. const std::unordered_set& getDigitalInputs() const; /// Enable digital output line. /// \param channel The channel number. /// \exception Asserts if already initialized. void enableDigitalOutput(int channel); /// Set which digital output lines are enabled. /// \param digitalOutputChannels The line numbers for the digital outputs. /// \exception Asserts if already initialized. void setDigitalOutputs(const std::unordered_set& digitalOutputChannels); /// \return The enabled digital output lines. const std::unordered_set& getDigitalOutputs() const; /// Set the timer base rate. Timer base rates that end in "_DIV" are divided by the divisor to get the actual timer /// frequency. See section 2.10 - Timers/Counters in the respective LabJack model's User's Guide. /// \param base The timer base rate. /// \exception Asserts if already initialized. void setTimerBase(LabJack::TimerBase base); /// \return The timer base rate. LabJack::TimerBase getTimerBase() const; /// If the Timer type ends in "_DIV", then the actual timer frequency is divided by the divisor. /// \param divisor The amount by which to divide the frequency. Values from 1-255 are used directly, while 0 means /// divide by 256. Values above 255 are not supported and cause an error. /// \exception Asserts if already initialized. void setTimerClockDivisor(int divisor); /// \return The timer clock divisor. int getTimerClockDivisor() const; /// The timers and counters are always on consecutive pins, but the start pin can be varied within limits. /// \param offset The channel number of the first timer/counter. /// \exception Asserts if already initialized. void setTimerCounterPinOffset(int offset); /// \return The channel number of the first timer/counter. int getTimerCounterPinOffset() const; /// Enable timer. /// Since quadrature requires two lines, to measure a single quadrature encoder this function /// must be called twice on consecutive timerNumbers. All output timers use the same clock (see setTimerBase and /// setTimerClockDivisor). /// \param index The index of the timer (not the line number, see setTimerCounterPinOffset). /// \param mode The type of timer. /// \exception Asserts if already initialized. void enableTimer(int index, LabJack::TimerMode mode); /// Enable timer with an initial value. /// Since quadrature requires two lines, to measure a single quadrature encoder this function /// must be called twice on consecutive timerNumbers. For example, to enable z-phase support for a quadrature /// timer, with the Z (aka index) signal on digital channel FIO4 (channel 4), set initialValue for both timer /// channels to ((1 << 15) | 4). All output timers use the same clock (see setTimerBase and setTimerClockDivisor). /// \param index The index of the timer (not the line number, see setTimerCounterPinOffset). /// \param mode The type of timer. /// \param initialValue The initial value. /// \exception Asserts if already initialized. void enableTimer(int index, LabJack::TimerMode mode, int initialValue); /// Set which timers are enabled. /// \sa enableTimer /// \param timers The map from timer index (not line number) to mode and optional initial value. /// \exception Asserts if already initialized. void setTimers(const std::unordered_map& timers); /// \return The enabled timers. const std::unordered_map& getTimers() const; /// Set the maximum update rate for the LabJackThread. Since the device driver blocks thread execution /// while acquiring new data, update rates have a definite upper-bound that is dependent on the requested /// inputs (at least). See the LabJack User's Guide for details. void setMaximumUpdateRate(double rate); /// \return The maximum update rate for the LabJackThread. double getMaximumUpdateRate() const; /// Enable differential analog input. /// \param positiveChannel The positive channel. /// \param range The voltage range. /// \param negativeChannel The negative channel. /// \exception Asserts if already initialized. /// \note On Linux, does not correctly handle negative channels 31 or 32 for U3 model. void enableAnalogInput(int positiveChannel, LabJack::Range range, int negativeChannel); /// Enable single-ended analog input. /// \param channel The channel. /// \param range The voltage range. /// \exception Asserts if already initialized. void enableAnalogInput(int channel, LabJack::Range range); /// Set which analog inputs are enabled. /// \sa enableAnalogInput /// \param analogInputs The map from the line number of the positive channel to the range and /// (for differential readings only) the line number of the negative channel. /// \exception Asserts if already initialized. void setAnalogInputs(const std::unordered_map& analogInputs); /// \return The enabled analog inputs. const std::unordered_map& getAnalogInputs() const; /// Enable analog output. /// \param channel The channel. /// \exception Asserts if already initialized. void enableAnalogOutput(int channel); /// Set which analog outputs are enabled. /// \sa enableAnalogOutput /// \param analogOutputChannels The line numbers for the analog outputs. /// \exception Asserts if already initialized. void setAnalogOutputs(const std::unordered_set& analogOutputChannels); /// \return The enabled analog output channels. const std::unordered_set& getAnalogOutputs() const; /// Set the resolution for all the analog inputs. The resolution parameter is a model-dependent code. Refer to the /// User's Guide for the specific model to determine behavior for different codes. For example, for the U6 see /// http://labjack.com/support/u6/users-guide/4.3.3 and http://labjack.com/support/u6/users-guide/appendix-b /// \param resolution The resolution code. /// \exception Asserts if already initialized. void setAnalogInputResolution(int resolution); /// \return The resolution code for all the analog inputs. int getAnalogInputResolution() const; /// Set the settling time for all the analog inputs. The settling parameter is a model-dependent code. Refer to the /// User's Guide for the specific model to determine behavior for different codes. For example, for the U6 see /// http://labjack.com/support/u6/users-guide/2.6 /// \param settling The settling time code. /// \exception Asserts if already initialized. void setAnalogInputSettling(int settling); /// \return The settling time code for all the analog inputs. int getAnalogInputSettling() const; private: friend class LabJackScaffold; bool finalize() override; /// The single scaffold object that handles communications with all instances of LabJackDevice. std::shared_ptr m_scaffold; /// The model, e.g., U6. LabJack::Model m_model; /// The type of communication connection, e.g., USB. LabJack::Connection m_connection; /// The address, or a zero-length string to indicate the first-found device of this type on this connection. std::string m_address; /// Whether or not the hardware should reset when this object destructs. bool m_reset; /// The line numbers for the digital inputs. std::unordered_set m_digitalInputChannels; /// The analog inputs. The key is the positive channel. std::unordered_map m_analogInputs; /// The line numbers for the digital outputs. std::unordered_set m_digitalOutputChannels; /// The line numbers for the analog outputs. std::unordered_set m_analogOutputChannels; /// The timer base, which is the frequency of all the output timers unless it ends in "_DIV", /// in which case the frequency is the base divided by the divisor. See section 2.10 - Timers/Counters in the /// respective LabJack model's User's Guide. LabJack::TimerBase m_timerBase; /// The timer clock's divisor, see m_timerBase. int m_timerClockDivisor; /// The number of the lowest FIO pin that is a timer or counter. int m_timerCounterPinOffset; /// A map from the timers' line numbers to their mode and optional initial value. std::unordered_map m_timers; /// The maximum update rate for the LabJackThread. double m_threadRate; /// The resolution for all the analog inputs. int m_analogInputResolution; /// The settling time for all the analog inputs. int m_analogInputSettling; }; }; // namespace Devices }; // namespace SurgSim #endif // SURGSIM_DEVICES_LABJACK_LABJACKDEVICE_H opensurgsim-0.7.0/SurgSim/Devices/LabJack/LabJackScaffold.h000066400000000000000000000113101277777236100234540ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DEVICES_LABJACK_LABJACKSCAFFOLD_H #define SURGSIM_DEVICES_LABJACK_LABJACKSCAFFOLD_H #include namespace SurgSim { namespace DataStructures { class DataGroup; }; namespace Framework { class Logger; } namespace Devices { class LabJackDevice; class LabJackThread; /// A class that implements the behavior of LabJackDevice objects. /// \sa SurgSim::Devices::LabJackDevice class LabJackScaffold { public: /// Internal per-device information. This is public because it is passed to the LabJackThread and back. struct DeviceData; /// Constructor. LabJackScaffold(); /// Destructor. ~LabJackScaffold(); /// Gets or creates the scaffold shared by all LabJackDevice instances. /// The scaffold is managed using a SharedInstance object, so it will be destroyed when all devices are released. /// \return the scaffold object. static std::shared_ptr getOrCreateSharedInstance(); /// Does one-time configuration of the LabJack for timers, counters, and analog inputs. /// Must be called by the LabJackThread because the LabJack separates all commands by the calling thread. /// \param device The internal device data. void configureDevice(DeviceData* device); private: /// Internal shared state data type. struct StateData; /// Wrapper for the LabJack device handle. class Handle; friend class LabJackDevice; friend class LabJackThread; friend struct StateData; /// Registers the specified device object. /// If successful, the device object will become connected to an unused hardware device. /// \param device The device object to be used, which should have a unique name. /// \return True if the initialization succeeds, false if it fails. bool registerDevice(LabJackDevice* device); /// Unregisters the specified device object. /// The corresponding hardware device will become unused, and can be re-registered later. /// \param device The device object. /// \return true on success, false on failure. bool unregisterDevice(const LabJackDevice* device); /// Executes the operations for a single input frame for a single device. /// Should only be called from the context of the input loop thread. /// \param info The internal device data. /// \return True to keep the LabJackThread running. bool runInputFrame(DeviceData* info); /// Updates the device information for a single device. /// \param info The internal device data. /// \return true on success. bool updateDevice(DeviceData* info); /// Destroys the input loop thread. /// \param data The internal device data. /// \return true on success. bool destroyPerDeviceThread(DeviceData* data); /// One-time configuration of the clock and timers. /// \param deviceData The internal device data. /// \return False if any errors. bool configureClockAndTimers(DeviceData* deviceData); /// One-time configuration of the number of timers. /// \param deviceData The internal device data. /// \return False if any errors. bool configureNumberOfTimers(DeviceData* deviceData); /// One-time configuration of the clock. /// \param deviceData The internal device data. /// \return False if any errors. bool configureClock(DeviceData* deviceData); /// One-time configuration of the timers. /// \param deviceData The internal device data. /// \return False if any errors. bool configureTimers(DeviceData* deviceData); /// One-time configuration of the digital inputs and outputs. /// \param deviceData The internal device data. /// \return False if any errors. bool configureDigital(DeviceData* deviceData); /// One-time configuration of the analog inputs. /// \param deviceData The internal device data. /// \return False if any errors. bool configureAnalog(DeviceData* deviceData); /// Builds the data layout for the application input (i.e. device output). static DataStructures::DataGroup buildDeviceInputData(); /// Logger used by the scaffold and all devices. std::shared_ptr m_logger; /// Internal scaffold state. std::unique_ptr m_state; }; }; // namespace Devices }; // namespace SurgSim #endif // SURGSIM_DEVICES_LABJACK_LABJACKSCAFFOLD_H opensurgsim-0.7.0/SurgSim/Devices/LabJack/LabJackThread.cpp000066400000000000000000000023541277777236100235050ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Devices/LabJack/LabJackThread.h" namespace SurgSim { namespace Devices { LabJackThread::LabJackThread(LabJackScaffold* scaffold, LabJackScaffold::DeviceData* deviceData) : BasicThread("LabJack thread"), m_scaffold(scaffold), m_deviceData(deviceData) { m_scaffold->configureDevice(m_deviceData); } LabJackThread::~LabJackThread() { } bool LabJackThread::doInitialize() { return true; } bool LabJackThread::doStartUp() { return true; } bool LabJackThread::doUpdate(double dt) { return m_scaffold->runInputFrame(m_deviceData); } }; // namespace Devices }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Devices/LabJack/LabJackThread.h000066400000000000000000000027621277777236100231550ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DEVICES_LABJACK_LABJACKTHREAD_H #define SURGSIM_DEVICES_LABJACK_LABJACKTHREAD_H #include #include "SurgSim/Framework/BasicThread.h" #include "SurgSim/Devices/LabJack/LabJackScaffold.h" namespace SurgSim { namespace Devices { /// A class implementing the thread context for communicating with LabJack devices. /// \sa SurgSim::Devices::LabJackScaffold class LabJackThread : public SurgSim::Framework::BasicThread { public: explicit LabJackThread(LabJackScaffold* scaffold, LabJackScaffold::DeviceData* deviceData); virtual ~LabJackThread(); protected: bool doInitialize() override; bool doStartUp() override; bool doUpdate(double dt) override; private: LabJackScaffold* m_scaffold; LabJackScaffold::DeviceData* m_deviceData; }; }; // namespace Devices }; // namespace SurgSim #endif // SURGSIM_DEVICES_LABJACK_LABJACKTHREAD_H opensurgsim-0.7.0/SurgSim/Devices/LabJack/UnitTests/000077500000000000000000000000001277777236100223205ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Devices/LabJack/UnitTests/CMakeLists.txt000066400000000000000000000022451277777236100250630ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2012-2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. include_directories( ${gtest_SOURCE_DIR}/include ) set(UNIT_TEST_SOURCES LabJackDeviceTest.cpp LabJackScaffoldTest.cpp ) set(UNIT_TEST_LINUX_SOURCES LabJackChecksumsTest.cpp LabJackTypeConvertersTest.cpp ) if(NOT ${CMAKE_SYSTEM_NAME} STREQUAL "Windows") list(APPEND UNIT_TEST_SOURCES ${UNIT_TEST_LINUX_SOURCES}) endif() set(LIBS LabJackDevice SurgSimInput SurgSimFramework SurgSimDataStructures ${Boost_LIBRARIES} ) surgsim_add_unit_tests(LabJackDeviceTest) set_target_properties(LabJackDeviceTest PROPERTIES FOLDER "Devices") opensurgsim-0.7.0/SurgSim/Devices/LabJack/UnitTests/LabJackChecksumsTest.cpp000066400000000000000000000072731277777236100270320ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the LabJack specific checksum functions. #include #include "SurgSim/Devices/LabJack/linux/LabJackConstants.h" #include "SurgSim/Devices/LabJack/linux/LabJackChecksums.h" using SurgSim::Devices::LabJack::extendedChecksum; using SurgSim::Devices::LabJack::extendedChecksum8; using SurgSim::Devices::LabJack::extendedChecksum16; using SurgSim::Devices::LabJack::normalChecksum; using SurgSim::Devices::LabJack::normalChecksum8; TEST(LabJackChecksumsTest, NormalChecksum) { // Sum less than 256 std::array bytes; unsigned char fillValue = 2; bytes.fill(fillValue); int count = 10; int expectedValue = fillValue * (count - 1); EXPECT_EQ(expectedValue, normalChecksum8(bytes, count)); normalChecksum(&bytes, count); EXPECT_EQ(expectedValue, bytes[0]); // Sum greater than 256, quotient + remainder < 256 fillValue = 100; bytes.fill(fillValue); count = 4; int sum = fillValue * (count - 1); // 300 int quotient = sum / 256; // 1 int remainder = sum % 256; // 44 expectedValue = quotient + remainder; EXPECT_EQ(expectedValue, normalChecksum8(bytes, count)); normalChecksum(&bytes, count); EXPECT_EQ(expectedValue, bytes[0]); // Sum greater than 256, quotient + remainder > 256 fillValue = 255; bytes.fill(fillValue); bytes[4] = 2; count = 5; // sum = 767, quotient = 2, remainder = 255, quotient + remainder = 257 // second_quotient = 1, second_remainder = 1, second_quotient + second_remainder = 2 expectedValue = 2; EXPECT_EQ(expectedValue, normalChecksum8(bytes, count)); normalChecksum(&bytes, count); EXPECT_EQ(expectedValue, bytes[0]); } TEST(LabJackChecksumsTest, ExtendedChecksum) { // Sums less than 256 std::array bytes; unsigned char fillValue = 2; bytes.fill(fillValue); int count = 10; int expectedValue16 = (count - 6) * fillValue; // 4 * 2 = 8 EXPECT_EQ(expectedValue16, extendedChecksum16(bytes, count)); int expectedValue8 = (6 - 1) * fillValue; // 5 * 2 = 10 EXPECT_EQ(expectedValue8, extendedChecksum8(bytes)); extendedChecksum(&bytes, count); EXPECT_EQ(expectedValue16, bytes[4]); EXPECT_EQ(0, bytes[5]); // extendedChecksum alters the buffer before setting bytes[0] to the return value of extendedChecksum8. EXPECT_EQ(expectedValue8 - 2 * fillValue + expectedValue16, bytes[0]); // Sum greater than 256, quotient + remainder < 256 fillValue = 100; bytes.fill(fillValue); count = 20; expectedValue16 = (count - 6) * fillValue; // 14 * 100 = 1400 EXPECT_EQ(expectedValue16, extendedChecksum16(bytes, count)); expectedValue8 = 245; // sum = 5 * 100 = 500, quotient = 1, remainder = 244, quotient + remainder = 245 EXPECT_EQ(expectedValue8, extendedChecksum8(bytes)); extendedChecksum(&bytes, count); EXPECT_EQ(120, bytes[4]); EXPECT_EQ(5, bytes[5]); // extendedChecksum alters the buffer before setting bytes[0] to the return value of extendedChecksum8. // sum = 100 + 100 + 100 + 120 + 5 = 425, quotient = 1, remainder = 169, quotient + remainder = 170 EXPECT_EQ(170, bytes[0]); } opensurgsim-0.7.0/SurgSim/Devices/LabJack/UnitTests/LabJackDeviceTest.cpp000066400000000000000000000375741277777236100263130ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the LabJackDevice class. #include #include #include #include #include #include "SurgSim/Devices/LabJack/LabJackDevice.h" #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Matrix.h" #include "SurgSim/Testing/MockInputOutput.h" using SurgSim::Devices::LabJackDevice; using SurgSim::Devices::LabJackScaffold; using SurgSim::DataStructures::DataGroup; using SurgSim::Input::InputConsumerInterface; using SurgSim::Input::OutputProducerInterface; using SurgSim::Testing::MockInputOutput; namespace { void testCreateDeviceSeveralTimes(bool doSleep) { for (int i = 0; i < 6; ++i) { std::shared_ptr device = std::make_shared("TestLabJack"); ASSERT_TRUE(device != nullptr) << "Device creation failed."; ASSERT_TRUE(device->initialize()) << "Initialization failed. Is a LabJack device plugged in?"; if (doSleep) { boost::this_thread::sleep_until(boost::chrono::steady_clock::now() + boost::chrono::milliseconds(100)); } // the device will be destroyed here } } }; TEST(LabJackDeviceTest, CreateUninitializedDevice) { //LabJackScaffold::setDefaultLogLevel(SurgSim::Framework::LOG_LEVEL_DEBUG); std::shared_ptr device = std::make_shared("TestLabJack"); ASSERT_TRUE(device != nullptr) << "Device creation failed."; } TEST(LabJackDeviceTest, CreateAndInitializeDevice) { //LabJackScaffold::setDefaultLogLevel(SurgSim::Framework::LOG_LEVEL_DEBUG); std::shared_ptr device = std::make_shared("TestLabJack"); ASSERT_TRUE(device != nullptr) << "Device creation failed."; EXPECT_FALSE(device->isInitialized()); ASSERT_TRUE(device->initialize()) << "Initialization failed. Is a LabJack device plugged in?"; EXPECT_TRUE(device->isInitialized()); } TEST(LabJackDeviceTest, Name) { //LabJackScaffold::setDefaultLogLevel(SurgSim::Framework::LOG_LEVEL_DEBUG); std::shared_ptr device = std::make_shared("TestLabJack"); ASSERT_TRUE(device != nullptr) << "Device creation failed."; EXPECT_EQ("TestLabJack", device->getName()); EXPECT_TRUE(device->initialize()) << "Initialization failed. Is a LabJack device plugged in?"; EXPECT_EQ("TestLabJack", device->getName()); } TEST(LabJackDeviceTest, CreateDeviceSeveralTimes) { //LabJackScaffold::setDefaultLogLevel(SurgSim::Framework::LOG_LEVEL_DEBUG); testCreateDeviceSeveralTimes(true); } TEST(LabJackDeviceTest, CreateSeveralDevices) { //LabJackScaffold::setDefaultLogLevel(SurgSim::Framework::LOG_LEVEL_DEBUG); std::shared_ptr device1 = std::make_shared("LabJack1"); ASSERT_TRUE(device1 != nullptr) << "Device creation failed."; ASSERT_TRUE(device1->initialize()) << "Initialization failed. Is a LabJack device plugged in?"; // We can't check what happens with the scaffolds, since those are no longer a part of the device's API... std::shared_ptr device2 = std::make_shared("LabJack2"); ASSERT_TRUE(device2 != nullptr) << "Device creation failed."; if (!device2->initialize()) { std::cerr << "[Warning: second LabJack controller did not come up; is it plugged in?]" << std::endl; } } TEST(LabJackDeviceTest, CreateDevicesWithSameName) { //LabJackScaffold::setDefaultLogLevel(SurgSim::Framework::LOG_LEVEL_DEBUG); std::shared_ptr device1 = std::make_shared("LabJack"); ASSERT_TRUE(device1 != nullptr) << "Device creation failed."; ASSERT_TRUE(device1->initialize()) << "Initialization failed. Is a LabJack device plugged in?"; std::shared_ptr device2 = std::make_shared("LabJack"); ASSERT_TRUE(device2 != nullptr) << "Device creation failed."; ASSERT_FALSE(device2->initialize()) << "Initialization succeeded despite duplicate name."; } TEST(LabJackDeviceTest, InputConsumer) { std::shared_ptr device = std::make_shared("TestLabJack"); ASSERT_TRUE(device != nullptr) << "Device creation failed."; ASSERT_TRUE(device->initialize()) << "Initialization failed. Is a LabJack device plugged in?"; std::shared_ptr consumer = std::make_shared(); EXPECT_EQ(0, consumer->m_numTimesInitializedInput); EXPECT_EQ(0, consumer->m_numTimesReceivedInput); EXPECT_FALSE(device->removeInputConsumer(consumer)); EXPECT_EQ(0, consumer->m_numTimesInitializedInput); EXPECT_EQ(0, consumer->m_numTimesReceivedInput); EXPECT_TRUE(device->addInputConsumer(consumer)); EXPECT_TRUE(device->setOutputProducer(consumer)); // Adding the same input consumer again should fail. EXPECT_FALSE(device->addInputConsumer(consumer)); // Sleep to see how many times the consumer is invoked. boost::this_thread::sleep_until(boost::chrono::steady_clock::now() + boost::chrono::milliseconds(1000)); EXPECT_TRUE(device->removeInputConsumer(consumer)); // Removing the same input consumer again should fail. EXPECT_FALSE(device->removeInputConsumer(consumer)); // Check the number of invocations. EXPECT_EQ(1, consumer->m_numTimesInitializedInput); // The update rate is not compared against a larger lower bound because the LabJack's response time is highly // dependent on the model, the connection (e.g., whether a high-speed USB2 hub is between the device and the // USB host), the number of USB frames required, and the calculations necessary for inputs/outputs. // See section 3.1 - Command/Response in the LabJack User's Guide. EXPECT_GE(consumer->m_numTimesReceivedInput, 1); EXPECT_LE(consumer->m_numTimesReceivedInput, 1.1 * device->getMaximumUpdateRate()); EXPECT_TRUE(consumer->m_lastReceivedInput.booleans().hasEntry(SurgSim::DataStructures::Names::DIGITAL_INPUT_PREFIX + std::to_string(0))); // The LabJackDevice provides entries for digital input lines 0 - 23. EXPECT_TRUE(consumer->m_lastReceivedInput.scalars().hasEntry(SurgSim::DataStructures::Names::TIMER_INPUT_PREFIX + std::to_string(0))); // The LabJackDevice provides entries for timer input lines 0 - 6. } TEST(LabJackDeviceTest, OutputProducer) { //LabJackScaffold::setDefaultLogLevel(SurgSim::Framework::LOG_LEVEL_DEBUG); std::shared_ptr device = std::make_shared("TestLabJack"); ASSERT_TRUE(device != nullptr) << "Device creation failed."; ASSERT_TRUE(device->initialize()) << "Initialization failed. Is a LabJack device plugged in?"; std::shared_ptr producer = std::make_shared(); EXPECT_EQ(0, producer->m_numTimesRequestedOutput); EXPECT_FALSE(device->removeOutputProducer(producer)); EXPECT_EQ(0, producer->m_numTimesRequestedOutput); EXPECT_TRUE(device->setOutputProducer(producer)); // Sleep to see how many times the producer is invoked. boost::this_thread::sleep_until(boost::chrono::steady_clock::now() + boost::chrono::milliseconds(1000)); EXPECT_TRUE(device->removeOutputProducer(producer)); // Removing the same input producer again should fail. EXPECT_FALSE(device->removeOutputProducer(producer)); // Check the number of invocations. // The update rate is not compared against a larger lower bound because the LabJack's response time is highly // dependent on the model, the connection (e.g., whether a high-speed USB2 hub is between the device and the // USB host), the number of USB frames required, and the calculations necessary for inputs/outputs. // See section 3.1 - Command/Response in the LabJack User's Guide. EXPECT_GE(producer->m_numTimesRequestedOutput, 1); EXPECT_LE(producer->m_numTimesRequestedOutput, 1.1 * device->getMaximumUpdateRate()); } TEST(LabJackDeviceTest, GettersAndSetters) { std::shared_ptr device = std::make_shared("TestLabJack"); ASSERT_TRUE(device != nullptr) << "Device creation failed."; const SurgSim::Devices::LabJack::Model model = SurgSim::Devices::LabJack::MODEL_U6; EXPECT_NO_THROW(device->setModel(model)); EXPECT_EQ(model, device->getModel()); const SurgSim::Devices::LabJack::Connection connection = SurgSim::Devices::LabJack::CONNECTION_USB; EXPECT_NO_THROW(device->setConnection(connection)); EXPECT_EQ(connection, device->getConnection()); const std::string address = "14"; EXPECT_NO_THROW(device->setAddress(address)); EXPECT_EQ(address, device->getAddress()); bool reset = true; device->setResetOnDestruct(reset); EXPECT_EQ(reset, device->getResetOnDestruct()); reset = false; device->setResetOnDestruct(reset); EXPECT_EQ(reset, device->getResetOnDestruct()); std::unordered_set digitalInputChannels; digitalInputChannels.insert(2); digitalInputChannels.insert(11); EXPECT_NO_THROW(device->enableDigitalInput(SurgSim::Devices::LabJack::FIO2)); EXPECT_NO_THROW(device->enableDigitalInput(SurgSim::Devices::LabJack::EIO3)); EXPECT_EQ(digitalInputChannels, device->getDigitalInputs()); digitalInputChannels.insert(14); EXPECT_NO_THROW(device->setDigitalInputs(digitalInputChannels)); EXPECT_EQ(digitalInputChannels, device->getDigitalInputs()); std::unordered_set digitalOutputChannels; digitalOutputChannels.insert(3); digitalOutputChannels.insert(17); EXPECT_NO_THROW(device->enableDigitalOutput(SurgSim::Devices::LabJack::FIO3)); EXPECT_NO_THROW(device->enableDigitalOutput(SurgSim::Devices::LabJack::CIO1)); EXPECT_EQ(digitalOutputChannels, device->getDigitalOutputs()); digitalOutputChannels.insert(5); EXPECT_NO_THROW(device->setDigitalOutputs(digitalOutputChannels)); EXPECT_EQ(digitalOutputChannels, device->getDigitalOutputs()); const SurgSim::Devices::LabJack::TimerBase timerBase = SurgSim::Devices::LabJack::TIMERBASE_DEFAULT; EXPECT_NO_THROW(device->setTimerBase(timerBase)); EXPECT_EQ(timerBase, device->getTimerBase()); const int timerDivisor = 7; EXPECT_NO_THROW(device->setTimerClockDivisor(timerDivisor)); EXPECT_EQ(timerDivisor, device->getTimerClockDivisor()); const int pinOffset = 3; EXPECT_NO_THROW(device->setTimerCounterPinOffset(pinOffset)); EXPECT_EQ(pinOffset, device->getTimerCounterPinOffset()); std::unordered_map timers; SurgSim::Devices::LabJack::TimerSettings quadrature = {SurgSim::Devices::LabJack::TIMERMODE_QUADRATURE, SurgSim::DataStructures::OptionalValue()}; timers[0] = quadrature; SurgSim::Devices::LabJack::TimerSettings frequencyOutput = {SurgSim::Devices::LabJack::TIMERMODE_FREQUENCY_OUTPUT, SurgSim::DataStructures::OptionalValue(234)}; timers[3] = frequencyOutput; EXPECT_NO_THROW(device->enableTimer(SurgSim::Devices::LabJack::TIMER0, SurgSim::Devices::LabJack::TIMERMODE_QUADRATURE)); EXPECT_NO_THROW(device->enableTimer(SurgSim::Devices::LabJack::TIMER3, SurgSim::Devices::LabJack::TIMERMODE_FREQUENCY_OUTPUT, 234)); EXPECT_EQ(timers, device->getTimers()); SurgSim::Devices::LabJack::TimerSettings dutyCycle = {SurgSim::Devices::LabJack::TIMERMODE_DUTY_CYCLE, SurgSim::DataStructures::OptionalValue()}; timers[4] = dutyCycle; EXPECT_NO_THROW(device->setTimers(timers)); EXPECT_EQ(timers, device->getTimers()); const double rate = 300.0; EXPECT_NO_THROW(device->setMaximumUpdateRate(rate)); EXPECT_NEAR(rate, device->getMaximumUpdateRate(), 1e-9); std::unordered_map analogInputs; const SurgSim::Devices::LabJack::AnalogInputSettings differentialRangeAndChannel = {SurgSim::Devices::LabJack::Range::RANGE_10, SurgSim::DataStructures::OptionalValue(1)}; analogInputs[2] = differentialRangeAndChannel; const SurgSim::Devices::LabJack::AnalogInputSettings singleEndedRange = {SurgSim::Devices::LabJack::Range::RANGE_0_POINT_1, SurgSim::DataStructures::OptionalValue()}; analogInputs[5] = singleEndedRange; EXPECT_NO_THROW(device->enableAnalogInput(SurgSim::Devices::LabJack::AIN2, SurgSim::Devices::LabJack::Range::RANGE_10, 1)); EXPECT_NO_THROW(device->enableAnalogInput(SurgSim::Devices::LabJack::AIN5, SurgSim::Devices::LabJack::Range::RANGE_0_POINT_1)); EXPECT_EQ(analogInputs, device->getAnalogInputs()); const SurgSim::Devices::LabJack::AnalogInputSettings anotherRange = {SurgSim::Devices::LabJack::Range::RANGE_0_POINT_01, SurgSim::DataStructures::OptionalValue()}; analogInputs[6] = anotherRange; EXPECT_NO_THROW(device->setAnalogInputs(analogInputs)); EXPECT_EQ(analogInputs, device->getAnalogInputs()); const int resolution = 3; EXPECT_NO_THROW(device->setAnalogInputResolution(resolution)); EXPECT_EQ(resolution, device->getAnalogInputResolution()); const int settling = 2; EXPECT_NO_THROW(device->setAnalogInputSettling(settling)); EXPECT_EQ(settling, device->getAnalogInputSettling()); std::unordered_set analogOutputChannels; analogOutputChannels.insert(1); EXPECT_NO_THROW(device->enableAnalogOutput(SurgSim::Devices::LabJack::DAC1)); EXPECT_EQ(analogOutputChannels, device->getAnalogOutputs()); analogOutputChannels.insert(0); EXPECT_NO_THROW(device->setAnalogOutputs(analogOutputChannels)); EXPECT_EQ(analogOutputChannels, device->getAnalogOutputs()); } TEST(LabJackDeviceTest, NoSettingAfterInitialization) { std::shared_ptr device = std::make_shared("TestLabJack"); ASSERT_TRUE(device != nullptr) << "Device creation failed."; ASSERT_TRUE(device->initialize()) << "Initialization failed. Is a LabJack device plugged in?"; EXPECT_THROW(device->setModel(SurgSim::Devices::LabJack::MODEL_U6), SurgSim::Framework::AssertionFailure); EXPECT_THROW(device->setConnection(SurgSim::Devices::LabJack::CONNECTION_USB), SurgSim::Framework::AssertionFailure); EXPECT_THROW(device->setAddress("14"), SurgSim::Framework::AssertionFailure); EXPECT_THROW(device->enableDigitalInput(SurgSim::Devices::LabJack::FIO2), SurgSim::Framework::AssertionFailure); EXPECT_THROW(device->setDigitalInputs(std::unordered_set()), SurgSim::Framework::AssertionFailure); EXPECT_THROW(device->enableDigitalOutput(SurgSim::Devices::LabJack::FIO3), SurgSim::Framework::AssertionFailure); EXPECT_THROW(device->setDigitalOutputs(std::unordered_set()), SurgSim::Framework::AssertionFailure); EXPECT_THROW(device->setTimerBase(SurgSim::Devices::LabJack::TIMERBASE_DEFAULT), SurgSim::Framework::AssertionFailure); EXPECT_THROW(device->setTimerClockDivisor(7), SurgSim::Framework::AssertionFailure); EXPECT_THROW(device->setTimerCounterPinOffset(3), SurgSim::Framework::AssertionFailure); EXPECT_THROW(device->enableTimer(SurgSim::Devices::LabJack::TIMER0, SurgSim::Devices::LabJack::TIMERMODE_QUADRATURE), SurgSim::Framework::AssertionFailure); EXPECT_THROW(device->setTimers(std::unordered_map()), SurgSim::Framework::AssertionFailure); EXPECT_THROW(device->setMaximumUpdateRate(300.0), SurgSim::Framework::AssertionFailure); EXPECT_THROW(device->enableAnalogInput(SurgSim::Devices::LabJack::AIN2, SurgSim::Devices::LabJack::Range::RANGE_10, 1), SurgSim::Framework::AssertionFailure); EXPECT_THROW(device->setAnalogInputs(std::unordered_map()), SurgSim::Framework::AssertionFailure); EXPECT_THROW(device->setAnalogInputResolution(3), SurgSim::Framework::AssertionFailure); EXPECT_THROW(device->setAnalogInputSettling(2), SurgSim::Framework::AssertionFailure); EXPECT_THROW(device->enableAnalogOutput(SurgSim::Devices::LabJack::DAC0), SurgSim::Framework::AssertionFailure); EXPECT_THROW(device->setAnalogOutputs(std::unordered_set()), SurgSim::Framework::AssertionFailure); }opensurgsim-0.7.0/SurgSim/Devices/LabJack/UnitTests/LabJackScaffoldTest.cpp000066400000000000000000000164371277777236100266300ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the LabJackScaffold class and its device interactions. #include #include #include #include #include #include "SurgSim/Devices/LabJack/LabJackDevice.h" #include "SurgSim/Devices/LabJack/LabJackScaffold.h" #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/Input/InputConsumerInterface.h" #include "SurgSim/Input/OutputProducerInterface.h" using SurgSim::Devices::LabJackDevice; using SurgSim::Devices::LabJackScaffold; TEST(LabJackScaffoldTest, CreateAndDestroyScaffold) { //LabJackScaffold::setDefaultLogLevel(SurgSim::Framework::LOG_LEVEL_DEBUG); std::shared_ptr scaffold = LabJackScaffold::getOrCreateSharedInstance(); ASSERT_NE(nullptr, scaffold) << "The scaffold was not created!"; std::weak_ptr scaffold1 = scaffold; { std::shared_ptr stillHaveScaffold = scaffold1.lock(); EXPECT_NE(nullptr, stillHaveScaffold) << "Unable to get scaffold from weak ref (while strong ref exists)"; EXPECT_EQ(scaffold, stillHaveScaffold) << "Scaffold mismatch!"; } { std::shared_ptr sameScaffold = LabJackScaffold::getOrCreateSharedInstance(); EXPECT_NE(nullptr, sameScaffold) << "Unable to get scaffold from class"; EXPECT_EQ(scaffold, sameScaffold) << "Scaffold mismatch!"; } scaffold.reset(); { std::shared_ptr dontHaveScaffold = scaffold1.lock(); EXPECT_EQ(nullptr, dontHaveScaffold) << "Able to get scaffold from weak ref (with no strong ref)"; } scaffold = LabJackScaffold::getOrCreateSharedInstance(); ASSERT_NE(nullptr, scaffold) << "The scaffold was not created the 2nd time!"; std::weak_ptr scaffold2 = scaffold; { std::shared_ptr stillHaveScaffold = scaffold2.lock(); ASSERT_NE(nullptr, stillHaveScaffold) << "Unable to get scaffold from weak ref (while strong ref exists)"; ASSERT_EQ(scaffold, stillHaveScaffold) << "Scaffold mismatch!"; } } TEST(LabJackScaffoldTest, ScaffoldLifeCycle) { //LabJackScaffold::setDefaultLogLevel(SurgSim::Framework::LOG_LEVEL_DEBUG); std::weak_ptr lastScaffold; { std::shared_ptr scaffold = LabJackScaffold::getOrCreateSharedInstance(); ASSERT_NE(nullptr, scaffold) << "The scaffold was not created!"; lastScaffold = scaffold; } { std::shared_ptr dontHaveScaffold = lastScaffold.lock(); EXPECT_EQ(nullptr, dontHaveScaffold) << "Able to get scaffold from weak ref (with no strong ref)"; lastScaffold.reset(); } { std::shared_ptr device = std::make_shared("TestLabJack"); ASSERT_NE(nullptr, device) << "Creation failed. Is a LabJack device plugged in?"; // note: the device is NOT initialized! { std::shared_ptr scaffold = LabJackScaffold::getOrCreateSharedInstance(); EXPECT_NE(nullptr, scaffold) << "The scaffold was not retrieved!"; lastScaffold = scaffold; // save the scaffold for later std::shared_ptr sameScaffold = lastScaffold.lock(); EXPECT_NE(nullptr, sameScaffold); EXPECT_EQ(scaffold, sameScaffold); } // The device has not been initialized, so it should NOT be hanging on to the device! { std::shared_ptr deadScaffold = lastScaffold.lock(); EXPECT_EQ(nullptr, deadScaffold); } // the ("empty") device is about to get destroyed } { std::shared_ptr device = std::make_shared("TestLabJack"); ASSERT_NE(nullptr, device) << "Device creation failed."; ASSERT_TRUE(device->initialize()) << "Initialization failed. Is a LabJack device plugged in?"; { std::shared_ptr scaffold = LabJackScaffold::getOrCreateSharedInstance(); EXPECT_NE(nullptr, scaffold) << "The scaffold was not retrieved!"; lastScaffold = scaffold; // save the scaffold for later std::shared_ptr sameScaffold = lastScaffold.lock(); EXPECT_NE(nullptr, sameScaffold); EXPECT_EQ(scaffold, sameScaffold); } // The same scaffold is supposed to still be around because of the device { std::shared_ptr sameScaffold = lastScaffold.lock(); EXPECT_NE(nullptr, sameScaffold); std::shared_ptr scaffold = LabJackScaffold::getOrCreateSharedInstance(); EXPECT_NE(nullptr, scaffold) << "The scaffold was not retrieved!"; EXPECT_EQ(sameScaffold, scaffold); } // the device and the scaffold are about to get destroyed } { std::shared_ptr deadScaffold = lastScaffold.lock(); EXPECT_EQ(nullptr, deadScaffold); } { std::shared_ptr device = std::make_shared("TestLabJack"); ASSERT_NE(nullptr, device) << "Device creation failed."; ASSERT_TRUE(device->initialize()) << "Initialization failed. Didn't this work a moment ago?"; std::shared_ptr scaffold = LabJackScaffold::getOrCreateSharedInstance(); EXPECT_NE(nullptr, scaffold) << "The scaffold was not retrieved!"; std::shared_ptr deadScaffold = lastScaffold.lock(); EXPECT_EQ(nullptr, deadScaffold); } } TEST(LabJackScaffoldTest, CreateDeviceSeveralTimes) { //LabJackScaffold::setDefaultLogLevel(SurgSim::Framework::LOG_LEVEL_DEBUG); std::weak_ptr lastScaffold; for (int i = 0; i < 6; ++i) { SCOPED_TRACE(i); EXPECT_EQ(nullptr, lastScaffold.lock()); std::shared_ptr device = std::make_shared("TestLabJack"); ASSERT_NE(nullptr, device) << "Device creation failed."; ASSERT_TRUE(device->initialize()) << "Initialization failed. Is a LabJack device plugged in?"; std::shared_ptr scaffold = LabJackScaffold::getOrCreateSharedInstance(); ASSERT_NE(nullptr, scaffold) << "The scaffold was not retrieved!"; lastScaffold = scaffold; // the device and the scaffold will be destroyed here } } TEST(LabJackScaffoldTest, CreateDeviceSeveralTimesWithScaffoldRef) { //LabJackScaffold::setDefaultLogLevel(SurgSim::Framework::LOG_LEVEL_DEBUG); std::shared_ptr lastScaffold; for (int i = 0; i < 6; ++i) { SCOPED_TRACE(i); std::shared_ptr device = std::make_shared("TestLabJack"); ASSERT_NE(nullptr, device) << "Device creation failed."; ASSERT_TRUE(device->initialize()) << "Initialization failed. Is a LabJack device plugged in?"; std::shared_ptr scaffold = LabJackScaffold::getOrCreateSharedInstance(); ASSERT_NE(nullptr, scaffold) << "The scaffold was not retrieved!"; if (! lastScaffold) { lastScaffold = scaffold; } EXPECT_EQ(lastScaffold, scaffold); // the device will be destroyed here, but the scaffold stays around because we have a shared_ptr to it. } } opensurgsim-0.7.0/SurgSim/Devices/LabJack/UnitTests/LabJackTypeConvertersTest.cpp000066400000000000000000000050171277777236100300730ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the LabJack specific type converters. #include #include "SurgSim/Devices/LabJack/linux/LabJackConstants.h" #include "SurgSim/Devices/LabJack/linux/LabJackTypeConverters.h" namespace { const double EPSILON = 1e-9; } TEST(LabJackTypeConvertersTest, DoubleFromChars) { std::array bytes; for (int i = 0; i < 24; ++i) { bytes[i] = 0; } EXPECT_NEAR(0.0, SurgSim::Devices::LabJack::doubleFromChars(bytes, 0), EPSILON); bytes[12] = 2; EXPECT_NEAR(2.0, SurgSim::Devices::LabJack::doubleFromChars(bytes, 8), EPSILON); bytes[20] = 255; bytes[21] = 255; bytes[22] = 255; bytes[23] = 255; EXPECT_NEAR(-1.0, SurgSim::Devices::LabJack::doubleFromChars(bytes, 16), EPSILON); } TEST(LabJackTypeConvertersTest, Uint32FromChars) { std::array bytes; for (int i = 0; i < 8; ++i) { bytes[i] = 0; } bytes[4] = 1; EXPECT_ANY_THROW(SurgSim::Devices::LabJack::uint32FromChars(bytes, 0, 5)); EXPECT_EQ(0, SurgSim::Devices::LabJack::uint32FromChars(bytes, 0, 4)); EXPECT_EQ(1 << 24, SurgSim::Devices::LabJack::uint32FromChars(bytes, 1, 4)); EXPECT_EQ(1 << 16, SurgSim::Devices::LabJack::uint32FromChars(bytes, 2, 3)); EXPECT_EQ(1, SurgSim::Devices::LabJack::uint32FromChars(bytes, 4, 4)); } TEST(LabJackTypeConvertersTest, Uint16FromChars) { std::array bytes; for (int i = 0; i < 4; ++i) { bytes[i] = 0; } bytes[2] = 1; EXPECT_ANY_THROW(SurgSim::Devices::LabJack::uint16FromChars(bytes, 0, 3)); EXPECT_EQ(0, SurgSim::Devices::LabJack::uint16FromChars(bytes, 0, 2)); EXPECT_EQ(1 << 8, SurgSim::Devices::LabJack::uint16FromChars(bytes, 1, 2)); EXPECT_EQ(1, SurgSim::Devices::LabJack::uint16FromChars(bytes, 2, 1)); EXPECT_EQ(1, SurgSim::Devices::LabJack::uint16FromChars(bytes, 2, 2)); } opensurgsim-0.7.0/SurgSim/Devices/LabJack/VisualTest/000077500000000000000000000000001277777236100224615ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Devices/LabJack/VisualTest/CMakeLists.txt000066400000000000000000000020161277777236100252200ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. set(EXAMPLE_SOURCES main.cpp ) set(EXAMPLE_HEADERS ) surgsim_add_executable(LabJackVisualTest "${EXAMPLE_SOURCES}" "${EXAMPLE_HEADERS}") set(LIBS IdentityPoseDevice LabJackDevice SurgSimDataStructures SurgSimDeviceFilters SurgSimInput SurgSimMath VisualTestCommon ) target_link_libraries(LabJackVisualTest ${LIBS}) set_target_properties(LabJackVisualTest PROPERTIES FOLDER "Devices") opensurgsim-0.7.0/SurgSim/Devices/LabJack/VisualTest/main.cpp000066400000000000000000000262761277777236100241260ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/DataStructures/DataGroupBuilder.h" #include "SurgSim/Devices/DeviceFilters/DeviceFilter.h" #include "SurgSim/Devices/IdentityPoseDevice/IdentityPoseDevice.h" #include "SurgSim/Devices/LabJack/LabJackDevice.h" #include "SurgSim/Input/CommonDevice.h" #include "SurgSim/Input/DeviceInterface.h" #include "SurgSim/Input/InputConsumerInterface.h" #include "SurgSim/Input/OutputProducerInterface.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Testing/VisualTestCommon/ToolSquareTest.h" using SurgSim::DataStructures::DataGroup; using SurgSim::DataStructures::DataGroupBuilder; using SurgSim::Devices::IdentityPoseDevice; using SurgSim::Devices::LabJackDevice; using SurgSim::Input::DeviceInterface; using SurgSim::Math::RigidTransform3d; using SurgSim::Math::Vector3d; class LabJackToPoseFilter : public SurgSim::Devices::DeviceFilter { public: LabJackToPoseFilter(const std::string& name, int firstTimerForQuadrature, int resetQuadrature, int plusX, int minusX, double translationPerUpdate, int positiveAnalogDifferential, int analogSingleEnded, int xOut, int loopbackOut) : SurgSim::Devices::DeviceFilter(name), m_pose(RigidTransform3d::Identity()), m_translationPerUpdate(translationPerUpdate), m_lineForPlusX(plusX), m_lineForMinusX(minusX), m_firstTimerForQuadrature(firstTimerForQuadrature), m_lineForResetQuadrature(resetQuadrature), m_analogInputDifferentialPositive(positiveAnalogDifferential), m_analogInputSingleEnded(analogSingleEnded), m_cachedOutputIndices(false), m_digitalInputPlusXIndex(-1), m_digitalInputMinusXIndex(-1), m_timerInputIndex(-1), m_analogInputDifferentialIndex(-1), m_analogInputSingleEndedIndex(-1), m_analogOutputIndex(-1), m_digitalOutputIndex(-1) { DataGroupBuilder inputBuilder; inputBuilder.addPose(SurgSim::DataStructures::Names::POSE); getInputData() = inputBuilder.createData(); m_poseIndex = getInputData().poses().getIndex(SurgSim::DataStructures::Names::POSE); DataGroupBuilder outputBuilder; const std::string outputName = SurgSim::DataStructures::Names::ANALOG_OUTPUT_PREFIX + std::to_string(xOut); outputBuilder.addScalar(outputName); const std::string digitalOutputName = SurgSim::DataStructures::Names::DIGITAL_OUTPUT_PREFIX + std::to_string(loopbackOut); outputBuilder.addBoolean(digitalOutputName); outputBuilder.addScalar(SurgSim::DataStructures::Names::TIMER_OUTPUT_PREFIX + std::to_string(m_firstTimerForQuadrature)); m_outputData = outputBuilder.createData(); m_analogOutputIndex = m_outputData.scalars().getIndex(outputName); m_digitalOutputIndex = m_outputData.booleans().getIndex(digitalOutputName); } void initializeInput(const std::string& device, const DataGroup& inputData) override { m_digitalInputPlusXIndex = inputData.booleans().getIndex(SurgSim::DataStructures::Names::DIGITAL_INPUT_PREFIX + std::to_string(m_lineForPlusX)); m_digitalInputMinusXIndex = inputData.booleans().getIndex(SurgSim::DataStructures::Names::DIGITAL_INPUT_PREFIX + std::to_string(m_lineForMinusX)); m_timerInputIndex = inputData.scalars().getIndex(SurgSim::DataStructures::Names::TIMER_INPUT_PREFIX + std::to_string(m_firstTimerForQuadrature)); m_analogInputDifferentialIndex = inputData.scalars().getIndex(SurgSim::DataStructures::Names::ANALOG_INPUT_PREFIX + std::to_string(m_analogInputDifferentialPositive)); m_analogInputSingleEndedIndex = inputData.scalars().getIndex(SurgSim::DataStructures::Names::ANALOG_INPUT_PREFIX + std::to_string(m_analogInputSingleEnded)); filterInput(device, inputData, &getInputData()); } void filterInput(const std::string& device, const DataGroup& dataToFilter, DataGroup* result) override { m_lastInputData = dataToFilter; // Turn LabJack inputs into a pose so it can control the sphere. if (m_digitalInputPlusXIndex >= 0) { bool value; if (dataToFilter.booleans().get(m_digitalInputPlusXIndex, &value)) { // If the device passed us this line's input, and the input is high... if (value) { m_pose.translation() += Vector3d::UnitX() * m_translationPerUpdate; } } } if (m_digitalInputMinusXIndex >= 0) { bool value; if (dataToFilter.booleans().get(m_digitalInputMinusXIndex, &value)) { // If the device passed us this line's input, and the input is high... if (value) { m_pose.translation() -= Vector3d::UnitX() * m_translationPerUpdate; } } } if (m_timerInputIndex >= 0) { double value; // For quadrature inputs, we only need the input value of the first of the timers. if (dataToFilter.scalars().get(m_timerInputIndex, &value)) { m_pose.translation()[1] = value * m_translationPerUpdate; } } const double rotationScaling = 0.0001 * 180.0 / M_PI; if (m_analogInputDifferentialIndex >= 0) { double value; if (dataToFilter.scalars().get(m_analogInputDifferentialIndex, &value)) { m_pose.rotate(SurgSim::Math::makeRotationQuaternion(value * rotationScaling, Vector3d::UnitX().eval())); } } if (m_analogInputSingleEndedIndex >= 0) { double value; if (dataToFilter.scalars().get(m_analogInputSingleEndedIndex, &value)) { m_pose.rotate(SurgSim::Math::makeRotationQuaternion(value * rotationScaling, Vector3d::UnitY().eval())); } } result->poses().set(m_poseIndex, m_pose); } void filterOutput(const std::string& device, const DataGroup& dataToFilter, DataGroup* result) override { *result = m_outputData; const double xScaling = 100.0; const double x = std::min(5.0, std::abs(m_pose.translation().x() * xScaling)); result->scalars().set(m_analogOutputIndex, x); bool value; if (m_lastInputData.booleans().get(m_digitalInputMinusXIndex, &value)) { result->booleans().set(m_digitalOutputIndex, value); } else { result->booleans().reset(m_digitalOutputIndex); } bool resetQuadrature = false; if ((m_lastInputData.booleans().get(SurgSim::DataStructures::Names::DIGITAL_INPUT_PREFIX + std::to_string(m_lineForResetQuadrature), &resetQuadrature)) && resetQuadrature) { result->scalars().set(SurgSim::DataStructures::Names::TIMER_OUTPUT_PREFIX + std::to_string(m_firstTimerForQuadrature), 0.0); } else { result->scalars().reset(SurgSim::DataStructures::Names::TIMER_OUTPUT_PREFIX + std::to_string(m_firstTimerForQuadrature)); } } private: DataGroup m_outputData; DataGroup m_lastInputData; RigidTransform3d m_pose; double m_translationPerUpdate; int m_lineForPlusX; int m_lineForMinusX; int m_firstTimerForQuadrature; int m_lineForResetQuadrature; int m_analogInputDifferentialPositive; int m_analogInputDifferentialNegative; int m_analogInputSingleEnded; bool m_cachedOutputIndices; int m_poseIndex; int m_digitalInputPlusXIndex; int m_digitalInputMinusXIndex; int m_timerInputIndex; int m_analogInputDifferentialIndex; int m_analogInputSingleEndedIndex; int m_analogOutputIndex; int m_digitalOutputIndex; }; int main(int argc, char** argv) { std::shared_ptr toolDevice = std::make_shared("LabJackDevice"); toolDevice->setAddress(""); // Get the first-found of the specified type and connection. const int plusX = SurgSim::Devices::LabJack::FIO0; toolDevice->enableDigitalInput(plusX); const int minusX = SurgSim::Devices::LabJack::FIO1; toolDevice->enableDigitalInput(minusX); const int loopbackOut = SurgSim::Devices::LabJack::FIO2; toolDevice->enableDigitalOutput(loopbackOut); const int offset = 4; toolDevice->setTimerCounterPinOffset(offset); // the U3 requires the offset to be 4+. const int firstTimerForQuadrature = SurgSim::Devices::LabJack::TIMER0; toolDevice->enableTimer(firstTimerForQuadrature, SurgSim::Devices::LabJack::TIMERMODE_QUADRATURE); toolDevice->enableTimer(firstTimerForQuadrature + 1, SurgSim::Devices::LabJack::TIMERMODE_QUADRATURE); const int resetQuadrature = SurgSim::Devices::LabJack::FIO3; toolDevice->enableDigitalInput(resetQuadrature); const int singleEndedAnalog = SurgSim::Devices::LabJack::AIN1; toolDevice->enableAnalogInput(singleEndedAnalog, SurgSim::Devices::LabJack::Range::RANGE_10); const int positiveAnalogDifferential = SurgSim::Devices::LabJack::AIN2; const int negativeAnalogDifferential = SurgSim::Devices::LabJack::AIN3; toolDevice->enableAnalogInput(positiveAnalogDifferential, SurgSim::Devices::LabJack::Range::RANGE_10, negativeAnalogDifferential); const int xOut = SurgSim::Devices::LabJack::DAC1; toolDevice->enableAnalogOutput(xOut); const double translationPerUpdate = 0.001; // Millimeter per update. auto filter = std::make_shared("LabJack to Pose filter", firstTimerForQuadrature, resetQuadrature, plusX, minusX, translationPerUpdate, positiveAnalogDifferential, singleEndedAnalog, xOut, loopbackOut); toolDevice->setOutputProducer(filter); toolDevice->addInputConsumer(filter); if (toolDevice->initialize()) { // The square is controlled by a second device. For a simple test, we're using an IdentityPoseDevice-- // a pretend device that doesn't actually move. std::shared_ptr squareDevice = std::make_shared("IdentityPoseDevice"); std::string text = "Set FIO" + std::to_string(plusX); text += " low to move the sphere tool in positive x-direction. "; text += "Set FIO" + std::to_string(minusX); text += " low to move in negative x, and that input will be output to FIO"; text += std::to_string(loopbackOut) + " (a loopback). "; text += "DAC" + std::to_string(xOut); text += " will provide a voltage proportional to the absolute value of the x-position, up to 5v. "; text += "Spin a quadrature encoder attached to FIO" + std::to_string(firstTimerForQuadrature + offset); text += " and FIO" + std::to_string(firstTimerForQuadrature + offset + 1); text += " to move the sphere +/- y-direction. Set FIO" + std::to_string(resetQuadrature); text += " high to reset the quadrature reading. "; text += "Provide a differential analog input to AIN" + std::to_string(positiveAnalogDifferential); text += " and AIN" + std::to_string(negativeAnalogDifferential) + " to spin about the red axis. "; text += "Provide a single-ended analog input to AIN" + std::to_string(singleEndedAnalog); text += " to spin about the green axis."; runToolSquareTest(filter, squareDevice, //2345678901234567890123456789012345678901234567890123456789012345678901234567890 text.c_str()); } else { std::cout << std::endl << "Error initializing tool." << std::endl; } std::cout << std::endl << "Exiting." << std::endl; // Cleanup and shutdown will happen automatically as objects go out of scope. return 0; } opensurgsim-0.7.0/SurgSim/Devices/LabJack/linux/000077500000000000000000000000001277777236100215155ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Devices/LabJack/linux/LabJackChecksums.cpp000066400000000000000000000044121277777236100253570ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Devices/LabJack/linux/LabJackChecksums.h" namespace SurgSim { namespace Devices { namespace LabJack { unsigned char normalChecksum8(const std::array& bytes, int count) { uint16_t accumulator = 0; //Sums bytes 1 to n-1 unsigned to a 2 byte value. Sums quotient and //remainder of 256 division. Again, sums quotient and remainder of //256 division. for (int i = 1; i < count; ++i) { accumulator += static_cast(bytes.at(i)); } uint16_t quotient = accumulator / 256; accumulator = (accumulator - 256 * quotient) + quotient; quotient = accumulator / 256; return static_cast((accumulator - 256 * quotient) + quotient); } uint16_t extendedChecksum16(const std::array& bytes, int count) { uint16_t accumulator = 0; //Sums bytes 6 to n-1 to an unsigned 2 byte value for (int i = 6; i < count; ++i) { accumulator += static_cast(bytes.at(i)); } return accumulator; } unsigned char extendedChecksum8(const std::array& bytes) { return normalChecksum8(bytes, 6); } void normalChecksum(std::array* bytes, int count) { (*bytes)[0] = normalChecksum8(*bytes, count); } void extendedChecksum(std::array* bytes, int count) { uint16_t accumulator = extendedChecksum16(*bytes, count); (*bytes)[4] = static_cast(accumulator & 0xff); (*bytes)[5] = static_cast((accumulator / 256) & 0xff); (*bytes)[0] = extendedChecksum8(*bytes); } }; // namespace LabJack }; // namespace Devices }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Devices/LabJack/linux/LabJackChecksums.h000066400000000000000000000062371277777236100250330ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DEVICES_LABJACK_LINUX_LABJACKCHECKSUMS_H #define SURGSIM_DEVICES_LABJACK_LINUX_LABJACKCHECKSUMS_H #include #include "SurgSim/Devices/LabJack/linux/LabJackConstants.h" namespace SurgSim { namespace Devices { /// A collection of checksum functions specifically tailored for the labjackusb driver. These functions are based off /// the description in the LabJack User's Guide, and the examples provided with labjackusb. namespace LabJack { /// Calculates an 8-bit 1's complement unsigned checksum specifically for normal command communication with the /// low-level LabJack driver. /// \param bytes The buffer of bytes. /// \param count The number of bytes to check. /// \return The checksum byte. unsigned char normalChecksum8(const std::array& bytes, int count); /// Calculates a 16-bit 1's complement unsigned checksum specifically for extended command communication with the /// low-level LabJack driver. /// \param bytes The buffer of bytes. /// \param count The number of bytes to check. /// \return The checksum byte. uint16_t extendedChecksum16(const std::array& bytes, int count); /// Calculates an 8-bit 1's complement unsigned checksum specifically for extended command communication with the /// low-level LabJack driver. /// \param bytes The buffer of bytes. /// \return The checksum byte. unsigned char extendedChecksum8(const std::array& bytes); /// Performs the 8-bit 1's complement unsigned checksum required for normal command communication with the /// low-level LabJack driver, and stores the result in the buffer. This function is called prior to writing data /// to the device for a "normal" command, so that the device can do a checksum. /// \param [in,out] bytes The buffer of bytes. /// \param count The number of bytes to check. void normalChecksum(std::array* bytes, int count); /// Performs the 1's complement unsigned checksums required for extended command communication with the /// low-level LabJack driver, and stores the results in the buffer. This function is called prior to writing data /// to the device for an "extended" command, so that the device can do a checksum. /// \param [in,out] bytes The buffer of bytes. /// \param count The number of bytes to check. void extendedChecksum(std::array* bytes, int count); }; // namespace LabJack }; // namespace Devices }; // namespace SurgSim #endif // SURGSIM_DEVICES_LABJACK_LINUX_LABJACKCHECKSUMS_H opensurgsim-0.7.0/SurgSim/Devices/LabJack/linux/LabJackConstants.h000066400000000000000000000021041277777236100250470ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DEVICES_LABJACK_LINUX_LABJACKCONSTANTS_H #define SURGSIM_DEVICES_LABJACK_LINUX_LABJACKCONSTANTS_H #include namespace SurgSim { namespace Devices { namespace LabJack { /// The maximum size of a read or write buffer for labjackusb driver. static const int MAXIMUM_BUFFER = 64; }; // namespace LabJack }; // namespace Devices }; // namespace SurgSim #endif // SURGSIM_DEVICES_LABJACK_LINUX_LABJACKCONSTANTS_H opensurgsim-0.7.0/SurgSim/Devices/LabJack/linux/LabJackScaffold.cpp000066400000000000000000001617371277777236100251710ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Devices/LabJack/LabJackScaffold.h" #include #include #include #include #include #include // the low-level LabJack library (aka exodriver) #include #include #include // fixed-width integer types are used for low-level data communication #include #include #include #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/DataStructures/DataGroupBuilder.h" #include "SurgSim/Devices/LabJack/LabJackDevice.h" #include "SurgSim/Devices/LabJack/LabJackThread.h" #include "SurgSim/Devices/LabJack/linux/LabJackChecksums.h" #include "SurgSim/Devices/LabJack/linux/LabJackConstants.h" #include "SurgSim/Devices/LabJack/linux/LabJackTypeConverters.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Framework/SharedInstance.h" namespace SurgSim { namespace Devices { namespace { /// Distinguish the name of the hardware library's handle from our wrapper with a prefix. typedef HANDLE LJ_HANDLE; /// The low-level LabJack library returns a NULL handle when failing to open a new device. static const LJ_HANDLE LABJACK_INVALID_HANDLE = NULL; /// A struct containing the default settings that depend on the model of LabJack. struct LabJackDefaults { LabJackDefaults() { timerBase[LabJack::MODEL_U3] = LabJack::TIMERBASE_2; timerBase[LabJack::MODEL_U6] = LabJack::TIMERBASE_2; timerBase[LabJack::MODEL_UE9] = LabJack::TIMERBASE_1; } /// The default timer base rate. std::unordered_map> timerBase; }; /// A struct containing various parameters that depend on the model of LabJack. struct LabJackParameters { LabJackParameters() { configBlocks[LabJack::MODEL_U3] = 16; // hardware version 1.30 & 1.21 configBlocks[LabJack::MODEL_U6] = 10; configBlocks[LabJack::MODEL_UE9] = 4; calibrationCommand[LabJack::MODEL_U3] = 0x2D; calibrationCommand[LabJack::MODEL_U6] = 0x2D; calibrationCommand[LabJack::MODEL_UE9] = 0x2A; calibrationThirdByte[LabJack::MODEL_U3] = 0x11; calibrationThirdByte[LabJack::MODEL_U6] = 0x11; calibrationThirdByte[LabJack::MODEL_UE9] = 0x41; calibrationReadBytes[LabJack::MODEL_U3] = 40; calibrationReadBytes[LabJack::MODEL_U6] = 40; calibrationReadBytes[LabJack::MODEL_UE9] = 136; } /// The number of config memory blocks. std::unordered_map> configBlocks; /// The extended command for reading the calibration data. std::unordered_map> calibrationCommand; /// The expected read third byte for the read calibration command. std::unordered_map> calibrationThirdByte; /// The number of bytes read per calibration read. std::unordered_map> calibrationReadBytes; }; /// Convert the LabJack::Range to the gain code expected by the low level driver. /// \param range The LabJack::Range code. /// \return The gain code. int getGain(LabJack::Range range) { int gain; switch (range) { case LabJack::RANGE_10: gain = 0; break; case LabJack::RANGE_1: gain = 1; break; case LabJack::RANGE_0_POINT_1: gain = 2; break; case LabJack::RANGE_0_POINT_01: gain = 3; break; default: gain = 15; } return gain; } /// Read from the LabJack and do most of the checksum tests. This function does not test readBytes[2] because its /// expected value varies. /// \param rawHandle The handle. /// \param readBytes The array of bytes. /// \param readBytesSize The number of bytes that should be read. /// \param name The name of the device being read. /// \param sendBytes The bytes that were sent. /// \param text The text explaining what the read is for, used in error log messages. /// \param logger The logger for error messages. /// \return true if no errors. bool readAndCheck(const LJ_HANDLE rawHandle, std::array* readBytes, int readBytesSize, const std::string& name, const std::array& sendBytes, const std::string& text, std::shared_ptr logger) { bool result = true; const int read = LJUSB_Read(rawHandle, &((*readBytes)[0]), readBytesSize); const uint16_t checksumTotal = LabJack::extendedChecksum16(*readBytes, readBytesSize); if (read < readBytesSize) { SURGSIM_LOG_SEVERE(logger) << "Failed to read response of " << text << " a device named '" << name << "'. " << readBytesSize << " bytes were expected, but only " << read << " were received." << std::endl << " labjackusb error code: " << errno << "." << std::endl; result = false; } else if ((((checksumTotal / 256 ) & 0xff) != (*readBytes)[5]) || ((checksumTotal & 0xff) != (*readBytes)[4]) || (LabJack::extendedChecksum8(*readBytes) != (*readBytes)[0])) { SURGSIM_LOG_SEVERE(logger) << "Failed to read response of " << text << " a device named '" << name << "'. The checksums are bad." << std::endl << " labjackusb error code: " << errno << "." << std::endl; result = false; } else if (((*readBytes)[1] != sendBytes[1]) || ((*readBytes)[3] != sendBytes[3])) { SURGSIM_LOG_SEVERE(logger) << "Failed to read response of " << text << " a device named '" << name << "'. The command bytes are wrong. Expected bytes 1 & 3: " << static_cast(sendBytes[1]) << "," << static_cast(sendBytes[3]) << ". Received bytes 1 & 3: " << static_cast((*readBytes)[1]) << ", " << static_cast((*readBytes)[3]) << "." << std::endl << " labjackusb error code: " << errno << "." << std::endl; result = false; } else if ((*readBytes)[6] != 0) { SURGSIM_LOG_SEVERE(logger) << "Failed to read response of " << text << " a device named '" << name << "'. The device library returned an error code: " << static_cast((*readBytes)[6]) << ", for frame: " << static_cast((*readBytes)[7]) << std::endl << " labjackusb error code: " << errno << "." << std::endl; result = false; } return result; } }; class LabJackScaffold::Handle { public: /// Constructor that attempts to open a device. /// \param model The model of LabJack device to open (see strings in LabJackUD.h). /// \param connection How to connect to the device (e.g., USB) (see strings in LabJackUD.h). /// \param address Either the ID or serial number (if USB), or the IP address. Handle(SurgSim::Devices::LabJack::Model model, SurgSim::Devices::LabJack::Connection connection, const std::string& address) : m_deviceHandle(LABJACK_INVALID_HANDLE), m_address(address), m_model(model), m_connection(connection), m_logger(Framework::Logger::getLogger("Devices/LabJack")) { bool result = true; if (m_model == LabJack::MODEL_UE9) { SURGSIM_LOG_SEVERE(m_logger) << "Failed to open a device. " << "The UE9 model LabJack is not supported for the low-level driver used on Linux & Mac. " << "The commands for the UE9 have a different structure, which is not currently implemented." << std::endl << " Model: '" << m_model << "'. Connection: '" << m_connection << "'. Address: '" << m_address << "'." << std::endl; result = false; } if (m_connection != LabJack::CONNECTION_USB) { SURGSIM_LOG_SEVERE(m_logger) << "Failed to open a device. " << "The LabJackDevice connection must be set to USB for the low-level driver used on Linux & Mac." << std::endl << " Model: '" << m_model << "'. Connection: '" << m_connection << "'. Address: '" << m_address << "'." << std::endl; result = false; } unsigned int deviceNumber = 1; // If no address is specified, grab the first device found of this model. if (m_address.length() > 0) { try { deviceNumber = std::stoi(m_address); } catch (int e) { SURGSIM_LOG_SEVERE(m_logger) << "Failed to open a device. " << "The LabJackDevice address should be a string representation of an unsigned integer " << "corresponding to the device number (or the empty string to get the first device), " << "but the conversion from string to integer failed." << std::endl << " Model: '" << m_model << "'. Connection: '" << m_connection << "'. Address: '" << m_address << "'." << std::endl; result = false; } } if (result) { const unsigned int dwReserved = 0; // Not used, set to 0. int tries = 3; m_deviceHandle = LABJACK_INVALID_HANDLE; while ((m_deviceHandle == LABJACK_INVALID_HANDLE) && (--tries >= 0)) { m_deviceHandle = LJUSB_OpenDevice(deviceNumber, dwReserved, m_model); if ((m_deviceHandle == LABJACK_INVALID_HANDLE) && (tries >= 0)) { boost::this_thread::sleep_for(boost::chrono::milliseconds(1000)); } } if (m_deviceHandle == LABJACK_INVALID_HANDLE) { SURGSIM_LOG_SEVERE(m_logger) << "Failed to open a device." << std::endl << " Model: '" << m_model << "'. Connection: '" << m_connection << "'. Address: '" << m_address << "'." << std::endl << " labjackusb error code: " << errno << "." << std::endl; result = false; } } } /// Destructor. ~Handle() { destroy(); } /// \return Whether or not the wrapped handle is valid. bool isValid() const { return (m_deviceHandle != LABJACK_INVALID_HANDLE); } /// Close communication with the hardware. /// \param reset true to cause a hardware reset & USB re-enumeration. Otherwise the hardware's settings will be /// unchanged (i.e., it will continue timing, counting, and outputting). void destroy(bool reset = false) { if (isValid()) { if (reset) { std::array sendBytes; sendBytes[1] = 0x99; //Command byte, Reset sendBytes[2] = 2; // Bit 1: Hard Reset. Bit 0: Soft Reset. sendBytes[3] = 0x00; int sendBytesSize = 4; int readBytesSize = 4; sendBytes[0] = LabJack::normalChecksum8(sendBytes, sendBytesSize); const int sent = LJUSB_Write(m_deviceHandle, &(sendBytes[0]), sendBytesSize); bool sendResult = true; if (sent < sendBytesSize) { SURGSIM_LOG_SEVERE(m_logger) << "Failed to write reset command to a device." << " Model: '" << m_model << "'. Connection: '" << m_connection << "'. Address: '" << m_address << "'." << std::endl << sendBytesSize << " bytes should have been sent, but only " << sent << " were actually sent." << std::endl << " labjackusb error code: " << errno << "." << std::endl; sendResult = false; } if (sendResult) { std::array readBytes; const int read = LJUSB_Read(m_deviceHandle, &(readBytes[0]), readBytesSize); if (read < readBytesSize) { SURGSIM_LOG_SEVERE(m_logger) << "Failed to read response of reset command." << " Model: '" << m_model << "'. Connection: '" << m_connection << "'. Address: '" << m_address << "'." << std::endl << readBytesSize << " bytes were expected, but only " << read << " were received." << std::endl << " labjackusb error code: " << errno << "." << std::endl; } else if (LabJack::normalChecksum8(readBytes, readBytesSize) != readBytes[0]) { SURGSIM_LOG_SEVERE(m_logger) << "Failed to read response of reset command." << " Model: '" << m_model << "'. Connection: '" << m_connection << "'. Address: '" << m_address << "'." << std::endl << "The checksums are bad." << std::endl << " labjackusb error code: " << errno << "." << std::endl; } else if (readBytes[3] != 0) { SURGSIM_LOG_SEVERE(m_logger) << "Failed to read response of reset command." << " Model: '" << m_model << "'. Connection: '" << m_connection << "'. Address: '" << m_address << "'." << std::endl << "The device library returned an error code: " << static_cast(readBytes[3]) << "." << std::endl << " labjackusb error code: " << errno << "." << std::endl; } } } LJUSB_CloseDevice(m_deviceHandle); m_deviceHandle = LABJACK_INVALID_HANDLE; } } /// \return The LabJack SDK's handle wrapped by this Handle. LJ_HANDLE get() const { return m_deviceHandle; } private: // Prevent copy construction and copy assignment. (VS2012 does not support "= delete" yet.) Handle(const Handle&) /*= delete*/; Handle& operator=(const Handle&) /*= delete*/; /// The exodriver device handle (or LABJACK_INVALID_HANDLE if not valid). LJ_HANDLE m_deviceHandle; /// The address used to open the device. Can be the empty string if the first-found device was opened. std::string m_address; /// The model of the device. SurgSim::Devices::LabJack::Model m_model; /// The connection to the device. SurgSim::Devices::LabJack::Connection m_connection; /// The logger. std::shared_ptr m_logger; }; /// The per-device data. struct LabJackScaffold::DeviceData { public: /// Initialize the data, creating a thread. DeviceData(LabJackDevice* device, std::unique_ptr&& handle) : deviceObject(device), thread(), deviceHandle(std::move(handle)), digitalInputChannels(device->getDigitalInputs()), digitalOutputChannels(device->getDigitalOutputs()), timerInputChannels(getTimerInputChannels(device->getTimers())), timerOutputChannels(getTimerOutputChannels(device->getTimers())), analogInputs(device->getAnalogInputs()), analogOutputChannels(device->getAnalogOutputs()), cachedOutputIndices(false), configured(false) { } ~DeviceData() { if (thread != nullptr) { thread->stop(); thread = nullptr; } deviceHandle->destroy(deviceObject->getResetOnDestruct()); } /// The corresponding device object. LabJackDevice* const deviceObject; /// Processing thread. std::unique_ptr thread; /// Device handle to read from. std::unique_ptr deviceHandle; /// The channels read for digital inputs. const std::unordered_set digitalInputChannels; /// The channels set for digital outputs. const std::unordered_set digitalOutputChannels; /// The timer channels that provide inputs. const std::unordered_set timerInputChannels; /// The timer channels set for timer outputs (e.g., PWM outputs). const std::unordered_set timerOutputChannels; /// The analog inputs. const std::unordered_map analogInputs; /// The channels set for analog outputs. const std::unordered_set analogOutputChannels; /// The DataGroup indices for the digital outputs. std::unordered_map digitalOutputIndices; /// The DataGroup indices for the digital inputs. std::unordered_map digitalInputIndices; /// The DataGroup indices for the timer outputs. std::unordered_map timerOutputIndices; /// The DataGroup indices for the timer inputs. std::unordered_map timerInputIndices; /// The DataGroup indices for the analog outputs. std::unordered_map analogOutputIndices; /// The DataGroup indices for the analog inputs. std::unordered_map analogInputIndices; /// True if the output indices have been cached. bool cachedOutputIndices; /// Calibration constants. The meaning of each entry is specific to the model (i.e., LabJack::Model). double calibration[40]; /// True if the device has been successfully configured. bool configured; private: /// Given all the timers, return just the ones that provide inputs. /// \param timers The timers. /// \return The timers that provide inputs. const std::unordered_set getTimerInputChannels(const std::unordered_map& timers) const { std::unordered_set timersWithInputs; for (auto timer = timers.cbegin(); timer != timers.cend(); ++timer) { if ((timer->second.mode != LabJack::TIMERMODE_PWM_16BIT) && (timer->second.mode != LabJack::TIMERMODE_PWM_8BIT) && (timer->second.mode != LabJack::TIMERMODE_FREQUENCY_OUTPUT)) { timersWithInputs.insert(timer->first); } } return timersWithInputs; } /// Given all the timers, return just the ones that take outputs. /// \param timers The timers. /// \return The timers that take outputs. const std::unordered_set getTimerOutputChannels(const std::unordered_map& timers) const { std::unordered_set timersWithOutputs; for (auto timer = timers.cbegin(); timer != timers.cend(); ++timer) { if ((timer->second.mode == LabJack::TIMERMODE_PWM_16BIT) || (timer->second.mode == LabJack::TIMERMODE_PWM_8BIT) || (timer->second.mode == LabJack::TIMERMODE_RISING_EDGES_32BIT) || (timer->second.mode == LabJack::TIMERMODE_FALLING_EDGES_32BIT) || (timer->second.mode == LabJack::TIMERMODE_DUTY_CYCLE) || (timer->second.mode == LabJack::TIMERMODE_FIRMWARE_COUNTER) || (timer->second.mode == LabJack::TIMERMODE_FIRMWARE_COUNTER_DEBOUNCED) || (timer->second.mode == LabJack::TIMERMODE_FREQUENCY_OUTPUT) || (timer->second.mode == LabJack::TIMERMODE_QUADRATURE) || (timer->second.mode == LabJack::TIMERMODE_RISING_EDGES_16BIT) || (timer->second.mode == LabJack::TIMERMODE_FALLING_EDGES_16BIT) || (timer->second.mode == LabJack::TIMERMODE_LINE_TO_LINE)) { timersWithOutputs.insert(timer->first); } } return timersWithOutputs; } // Prevent copy construction and copy assignment. (VS2012 does not support "= delete" yet.) DeviceData(const DeviceData&) /*= delete*/; DeviceData& operator=(const DeviceData&) /*= delete*/; }; /// The per-scaffold data (in comparison to DeviceData the per-device data). /// Note that there is only a single instance of LabJackScaffold and so only a single instance of this struct. struct LabJackScaffold::StateData { public: /// Initialize the state. StateData() { } /// The list of known devices. std::list> activeDeviceList; /// The mutex that protects the list of known devices. boost::mutex mutex; private: // Prevent copy construction and copy assignment. (VS2012 does not support "= delete" yet.) StateData(const StateData&) /*= delete*/; StateData& operator=(const StateData&) /*= delete*/; }; LabJackScaffold::LabJackScaffold() : m_logger(Framework::Logger::getLogger("Devices/LabJack")), m_state(new StateData) { SURGSIM_LOG_DEBUG(m_logger) << "Shared scaffold created. labjackusb driver version: " << LJUSB_GetLibraryVersion() << "."; } LabJackScaffold::~LabJackScaffold() { boost::lock_guard lock(m_state->mutex); if (!m_state->activeDeviceList.empty()) { SURGSIM_LOG_SEVERE(m_logger) << "Destroying scaffold while devices are active!?!"; m_state->activeDeviceList.clear(); } SURGSIM_LOG_DEBUG(m_logger) << "Shared scaffold destroyed."; } bool LabJackScaffold::registerDevice(LabJackDevice* device) { boost::lock_guard lock(m_state->mutex); bool result = true; // Make sure the object is unique. auto sameObject = std::find_if(m_state->activeDeviceList.cbegin(), m_state->activeDeviceList.cend(), [device](const std::unique_ptr& info) { return info->deviceObject == device; }); SURGSIM_ASSERT(sameObject == m_state->activeDeviceList.end()) << "LabJack: Tried to register a device named '" << device->getName() << "', which is already present!"; // Make sure the name is unique. const std::string& deviceName = device->getName(); auto const sameName = std::find_if(m_state->activeDeviceList.cbegin(), m_state->activeDeviceList.cend(), [&deviceName](const std::unique_ptr& info) { return info->deviceObject->getName() == deviceName; }); if (sameName != m_state->activeDeviceList.end()) { SURGSIM_LOG_SEVERE(m_logger) << "Tried to register a device when the same name, '" << device->getName() << "', is already present!"; result = false; } // Make sure the combination of connection and address is unique, unless the address is zero-length, in which // case the first-found device of this model on this connection will be opened. const std::string& address = device->getAddress(); if (result && (address.length() > 0)) { const SurgSim::Devices::LabJack::Model model = device->getModel(); const SurgSim::Devices::LabJack::Connection connection = device->getConnection(); auto const sameInitialization = std::find_if(m_state->activeDeviceList.cbegin(), m_state->activeDeviceList.cend(), [&address, connection, model](const std::unique_ptr& info) { return (info->deviceObject->getAddress() == address) && (info->deviceObject->getConnection() == connection) && (info->deviceObject->getModel() == model); }); if (sameInitialization != m_state->activeDeviceList.cend()) { SURGSIM_LOG_SEVERE(m_logger) << "Tried to register a device named '" << device->getName() << "', but a device with the same model (" << model << "), connection (" << connection << "), and address ('" << address << "') is already present!"; result = false; } } if (result) { // Create a handle, opening communications. // If the device's model is SEARCH, iterate over the options. std::vector modelsToSearch; if (device->getModel() == LabJack::MODEL_SEARCH) { SURGSIM_LOG_INFO(m_logger) << "Device " << device->getName() << ": searching for models U3 and U6."; modelsToSearch.push_back(LabJack::MODEL_U6); modelsToSearch.push_back(LabJack::MODEL_U3); } else { modelsToSearch.push_back(device->getModel()); } // If the device's connection is search, set it to USB since that is all we currently support for the // low-level driver. if (device->getConnection() == LabJack::CONNECTION_SEARCH) { SURGSIM_LOG_INFO(m_logger) << "Device " << device->getName() << ": searching for connection. " << "The low-level driver currently only supports USB as the medium."; device->setConnection(LabJack::CONNECTION_USB); } std::unique_ptr handle; for (auto model = modelsToSearch.cbegin(); model != modelsToSearch.cend(); ++model) { device->setModel(*model); handle = std::unique_ptr(new Handle(*model, device->getConnection(), address)); result = handle->isValid(); if (result) { auto const sameHandle = std::find_if(m_state->activeDeviceList.cbegin(), m_state->activeDeviceList.cend(), [&handle](const std::unique_ptr& info) { return (info->deviceHandle->get() == handle->get()); }); if (sameHandle != m_state->activeDeviceList.cend()) { SURGSIM_LOG_INFO(m_logger) << "Tried to register a device named '" << device->getName() << "', but a device with the same handle (" << handle->get() << ") is already present! " << "This can happen if multiple LabJack devices are used without setting their addresses."; result = false; } else { break; } } } if (result) { std::unique_ptr info(new DeviceData(device, std::move(handle))); // Cache the NamedData indices for the input DataGroup. const SurgSim::DataStructures::DataGroup& inputData = device->getInputData(); for (auto input = info->digitalInputChannels.cbegin(); input != info->digitalInputChannels.cend(); ++input) { info->digitalInputIndices[*input] = inputData.booleans().getIndex(SurgSim::DataStructures::Names::DIGITAL_INPUT_PREFIX + std::to_string(*input)); SURGSIM_ASSERT(info->digitalInputIndices[*input] >= 0) << "LabJackScaffold::DeviceData " << "failed to get a valid NamedData index for the digital input for line " << *input << ". Make sure that is a valid line number."; } for (auto timer = info->timerInputChannels.cbegin(); timer != info->timerInputChannels.cend(); ++timer) { info->timerInputIndices[*timer] = inputData.scalars().getIndex(SurgSim::DataStructures::Names::TIMER_INPUT_PREFIX + std::to_string(*timer)); SURGSIM_ASSERT(info->timerInputIndices[*timer] >= 0) << "LabJackScaffold::DeviceData " << "failed to get a valid NamedData index for the timer for channel " << *timer << ". Make sure that is a valid timer number."; } for (auto input = info->analogInputs.cbegin(); input != info->analogInputs.cend(); ++input) { std::string name = SurgSim::DataStructures::Names::ANALOG_INPUT_PREFIX + std::to_string(input->first); info->analogInputIndices[input->first] = inputData.scalars().getIndex(name); SURGSIM_ASSERT(info->analogInputIndices[input->first] >= 0) << "LabJackScaffold::DeviceData failed to get a valid NamedData index for the " << "analog input for channel " << input->first << ". Make sure that is a valid line number. " << "Expected an entry named " << name << "."; } std::unique_ptr thread(new LabJackThread(this, info.get())); result = info->configured; if (result) { thread->setRate(device->getMaximumUpdateRate()); thread->start(); info.get()->thread = std::move(thread); m_state->activeDeviceList.emplace_back(std::move(info)); } } } SURGSIM_LOG_IF(result, m_logger, INFO) << "Device " << device->getName() << " registered."; return result; } bool LabJackScaffold::unregisterDevice(const LabJackDevice* const device) { bool found = false; { boost::lock_guard lock(m_state->mutex); auto matching = std::find_if(m_state->activeDeviceList.begin(), m_state->activeDeviceList.end(), [device](const std::unique_ptr& info) { return info->deviceObject == device; }); if (matching != m_state->activeDeviceList.end()) { m_state->activeDeviceList.erase(matching); // the iterator is now invalid but that's OK found = true; SURGSIM_LOG_INFO(m_logger) << "Device " << device->getName() << " unregistered."; } } SURGSIM_LOG_IF(!found, m_logger, CRITICAL) << "Attempted to release a non-registered device named '" << device->getName() << "."; return found; } bool LabJackScaffold::runInputFrame(LabJackScaffold::DeviceData* info) { if (info->deviceObject->pullOutput() && !info->cachedOutputIndices) { const SurgSim::DataStructures::DataGroup& initialOutputData = info->deviceObject->getOutputData(); const std::unordered_set& digitalOutputChannels = info->digitalOutputChannels; for (auto output = digitalOutputChannels.cbegin(); output != digitalOutputChannels.cend(); ++output) { info->digitalOutputIndices[*output] = initialOutputData.booleans().getIndex(SurgSim::DataStructures::Names::DIGITAL_OUTPUT_PREFIX + std::to_string(*output)); } const std::unordered_set& timerOutputChannels = info->timerOutputChannels; for (auto timer = timerOutputChannels.cbegin(); timer != timerOutputChannels.cend(); ++timer) { info->timerOutputIndices[*timer] = initialOutputData.scalars().getIndex(SurgSim::DataStructures::Names::TIMER_OUTPUT_PREFIX + std::to_string(*timer)); } const std::unordered_set& analogOutputChannels = info->analogOutputChannels; for (auto output = analogOutputChannels.cbegin(); output != analogOutputChannels.cend(); ++output) { info->analogOutputIndices[*output] = initialOutputData.scalars().getIndex(SurgSim::DataStructures::Names::ANALOG_OUTPUT_PREFIX + std::to_string(*output)); } info->cachedOutputIndices = true; } if (!updateDevice(info)) { return false; } info->deviceObject->pushInput(); return true; } bool LabJackScaffold::updateDevice(LabJackScaffold::DeviceData* info) { const LJ_HANDLE rawHandle = info->deviceHandle->get(); const SurgSim::DataStructures::DataGroup& outputData = info->deviceObject->getOutputData(); const LabJackDevice* device = info->deviceObject; bool result = true; // Use one Feedback command for all the inputs and outputs. // According to the Users Guide, the Feedback command has a max size of 64 bytes. Currently only a single command is // used, and we try to add all the input/output information. To be safe the std::array::at function is used for any // access to a non-constant index, and will throw an out_of_range exception if the index is too large. std::array sendBytes; sendBytes[1] = 0xF8; //Command byte, Feedback sendBytes[3] = 0x00; //Extended command number sendBytes[6] = 0; //Echo int sendBytesSize = 7; // the first IOType goes here int readBytesSize = 9; // Reading after a Feedback command provides 9+ bytes. // Read digital inputs const std::unordered_set& digitalInputChannels = info->digitalInputChannels; for (auto input = digitalInputChannels.cbegin(); input != digitalInputChannels.cend(); ++input) { sendBytes.at(sendBytesSize++) = 10; //IOType, BitStateRead sendBytes.at(sendBytesSize++) = *input; //Bits 0-4: IO Number ++readBytesSize; } // Write digital outputs const std::unordered_set& digitalOutputChannels = info->digitalOutputChannels; for (auto output = digitalOutputChannels.cbegin(); output != digitalOutputChannels.cend(); ++output) { if (info->digitalOutputIndices.count(*output) > 0) { const int index = info->digitalOutputIndices[*output]; SURGSIM_ASSERT(index >= 0) << "LabJackScaffold: A LabJackDevice was configured with line " << *output << " set to digital output, but the scaffold does not know the correct index into the NamedData. " << " Make sure there is an entry in the booleans with the correct string key."; bool value; if (outputData.booleans().get(index, &value)) { const BYTE valueAsByte = (value ? 1 : 0); sendBytes.at(sendBytesSize++) = 11; //IOType, BitStateWrite sendBytes.at(sendBytesSize++) = (*output) | ((valueAsByte & 0xF) << 7); //Bits 0-4: IO Number, //Bit 7: State } } } // Write to timers (e.g., resetting firmware counters). const std::unordered_set& timerOutputChannels = info->timerOutputChannels; for (auto timer = timerOutputChannels.cbegin(); timer != timerOutputChannels.cend(); ++timer) { if (info->timerOutputIndices.count(*timer) > 0) { const int index = info->timerOutputIndices[*timer]; // We do not ensure that all the timers can be output to, because the user might not need to reset them. if (index >= 0) { double value; if (outputData.scalars().get(index, &value)) { const int valueAsInt = value + 0.5; // value is non-negative. The conversion will truncate. sendBytes.at(sendBytesSize++) = 42 + 2 * (*timer); //IOType, Timer# sendBytes.at(sendBytesSize++) = 1; //Bit 0: UpdateReset sendBytes.at(sendBytesSize++) = valueAsInt & 255; //LSB sendBytes.at(sendBytesSize++) = (valueAsInt & 65280) / 256; //MSB readBytesSize += 4; } } } } // Read from timers. const std::unordered_set& timerInputChannels = info->timerInputChannels; for (auto timer = timerInputChannels.cbegin(); timer != timerInputChannels.cend(); ++timer) { // If we write to a timer, the response to that write will have the timer value so we don't need to request it. if (timerOutputChannels.count(*timer) == 0) { sendBytes.at(sendBytesSize++) = 42 + 2 * (*timer); //IOType, Timer# sendBytes.at(sendBytesSize++) = 0; //Bit 0: UpdateReset sendBytes.at(sendBytesSize++) = 0; //LSB sendBytes.at(sendBytesSize++) = 0; //MSB readBytesSize += 4; } } // Request the values of analog inputs. auto const& analogInputs = info->analogInputs; for (auto input = analogInputs.cbegin(); input != analogInputs.cend(); ++input) { if (device->getModel() == LabJack::MODEL_U3) { const BYTE longSettling = (device->getAnalogInputSettling() > 0 ? (1 << 6) : 0); const BYTE quickSample = (device->getAnalogInputResolution() > 0 ? (1 << 7) : 0); // Third byte is the negative channel for differential input, or 31 for single-ended input. const BYTE negativeChannel = input->second.negativeChannel.hasValue() ? input->second.negativeChannel.getValue() : 31; sendBytes.at(sendBytesSize++) = 1; sendBytes.at(sendBytesSize++) = input->first | longSettling | quickSample; sendBytes.at(sendBytesSize++) = negativeChannel; readBytesSize += 2; } else { // The U6 can only do consecutive channels for a differential read, so the actual channel is not sent. const BYTE differential = input->second.negativeChannel.hasValue() ? 1 << 7 : 0; sendBytes.at(sendBytesSize++) = 3; sendBytes.at(sendBytesSize++) = input->first; sendBytes.at(sendBytesSize++) = device->getAnalogInputResolution() | (getGain(input->second.range) << 4); sendBytes.at(sendBytesSize++) = device->getAnalogInputSettling() | differential; readBytesSize += 5; } } // Set analog outputs. const std::unordered_set& analogOutputs = info->analogOutputChannels; for (auto output = analogOutputs.cbegin(); output != analogOutputs.cend(); ++output) { if (info->analogOutputIndices.count(*output) > 0) { const int index = info->analogOutputIndices[*output]; if (index >= 0) { double value; if (outputData.scalars().get(index, &value)) { const BYTE dacConfigCode = *output + 38; sendBytes.at(sendBytesSize++) = dacConfigCode; int bytes; if (device->getModel() == LabJack::MODEL_U3) { const int calibrationIndex = *output * 2 + 4; bytes = value * info->calibration[calibrationIndex] * 256 + info->calibration[calibrationIndex + 1] * 256; } else { const int calibrationIndex = *output * 2 + 16; bytes = value * info->calibration[calibrationIndex] + info->calibration[calibrationIndex + 1]; } bytes = std::min(bytes, 65535); bytes = std::max(bytes, 0); sendBytes.at(sendBytesSize++) = bytes & 255; sendBytes.at(sendBytesSize++) = bytes / 256; } } } } // Write the Feedback command. // Must send an even number of bytes. if (sendBytesSize % 2 == 1) { sendBytes.at(sendBytesSize++) = 0; } // Must read an even number of bytes if (readBytesSize % 2 == 1) { ++readBytesSize; } // According to the Users Guide, the Feedback command has a max Response/Read size of 64 bytes. // Most IOTypes Read no more bytes than they Write, including the digital input/output and timers currently // supported, but some IOTypes do Read more than they Write. Thus, this assertion should never be triggered, and // to make sure the access indices into the buffer are being correctly calculated, the std::array::at function is // used for any access to a non-constant index, and will throw an out_of_range exception if the index is too large. if (readBytesSize > LabJack::MAXIMUM_BUFFER) { SURGSIM_LOG_SEVERE(m_logger) << "Failed to update device named '" << device->getName() << "'. The low-level LabJack communication function 'Feedback' has a max Response size of " << std::to_string(LabJack::MAXIMUM_BUFFER) << " bytes. " << "The current configuration and output DataGroup would cause a size of " << readBytesSize << " bytes." << std::endl; result = false; } if (result) { const BYTE sendCommandBytes = 6; const BYTE dataWords = (sendBytesSize - sendCommandBytes) / 2; sendBytes[2] = dataWords; LabJack::extendedChecksum(&sendBytes, sendBytesSize); const int sent = LJUSB_Write(rawHandle, &(sendBytes[0]), sendBytesSize); if (sent < sendBytesSize) { SURGSIM_LOG_SEVERE(m_logger) << "Failed to write feedback command to update a device named '" << device->getName() << "'. " << sendBytesSize << " bytes should have been sent, but only " << sent << " were actually sent." << std::endl << " labjackusb error code: " << errno << "." << std::endl; result = false; } } const BYTE readCommandBytes = 6; std::array readBytes; // Feedback commands respond with a max of 64 bytes // Read the response for the feedback command. if (result) { const std::string errorText = "feedback command to update"; result = readAndCheck(rawHandle, &readBytes, readBytesSize, device->getName(), sendBytes, errorText, m_logger); const BYTE dataWords = (readBytesSize - readCommandBytes) / 2; if (readBytes[2] != dataWords) { SURGSIM_LOG_SEVERE(m_logger) << "Failed to read response of " << errorText << " a device named '" << device->getName() << "'. The number of words in the response is wrong. Expected: " << static_cast(dataWords) << ". Received: " << static_cast(readBytes[2]) << "." << std::endl << " labjackusb error code: " << errno << "." << std::endl; result = false; } } SurgSim::DataStructures::DataGroup& inputData = info->deviceObject->getInputData(); if (result) { const int errorBytes = 2; const int echoBytes = 1; int currentByte = readCommandBytes + errorBytes + echoBytes; // Digital inputs. for (auto input = digitalInputChannels.cbegin(); input != digitalInputChannels.cend(); ++input) { const bool value = (readBytes.at(currentByte++) > 0 ? true : false); inputData.booleans().set(info->digitalInputIndices[*input], value); } // Read from the timers in the same order as above. for (auto timer = timerOutputChannels.cbegin(); timer != timerOutputChannels.cend(); ++timer) { const int count = 4; const uint32_t value = LabJack::uint32FromChars(readBytes, currentByte, count); inputData.scalars().set(info->timerInputIndices[*timer], value); currentByte += 4; } for (auto timer = timerInputChannels.cbegin(); timer != timerInputChannels.cend(); ++timer) { if (timerOutputChannels.count(*timer) == 0) { const int count = 4; const uint32_t value = LabJack::uint32FromChars(readBytes, currentByte, count); currentByte += 4; // Interpret the value as signed. inputData.scalars().set(info->timerInputIndices[*timer], value); } } for (auto input = analogInputs.cbegin(); input != analogInputs.cend(); ++input) { if (device->getModel() == LabJack::MODEL_U3) { const int count = 2; const uint16_t value = LabJack::uint16FromChars(readBytes, currentByte, count); currentByte += 2; const double volts = info->calibration[2] * static_cast(value) + info->calibration[3]; inputData.scalars().set(info->analogInputIndices[input->first], volts); } else { const int count = 3; const uint32_t value = LabJack::uint32FromChars(readBytes, currentByte, count); double bits = value; bits /= 256.0; const int gain = readBytes.at(currentByte + 3) / 16; int index = gain * 2 + 8; const int resolution = readBytes.at(currentByte + 3) & 15; if (resolution > 8) { index += 24; } currentByte += 5; double volts; const double center = info->calibration[index + 1]; if (bits < center) { volts = (center - bits) * info->calibration[index]; } else { volts = (bits - center) * info->calibration[index - 8]; } inputData.scalars().set(info->analogInputIndices[input->first], volts); } } } else { // Failure communicating with the LabJack inputData.resetAll(); } return true; // Returning false ends the thread. } SurgSim::DataStructures::DataGroup LabJackScaffold::buildDeviceInputData() { SurgSim::DataStructures::DataGroupBuilder builder; // We don't know which input lines we need until after the configuration, but LabJackDevice must be constructed with // a valid DataGroup, so we add every possible line. const int maxDigitalInputs = 23; // The UE9 can have 23 digital inputs. for (int i = 0; i < maxDigitalInputs; ++i) { builder.addBoolean(SurgSim::DataStructures::Names::DIGITAL_INPUT_PREFIX + std::to_string(i)); } const int maxTimerInputs = 6; // The UE9 can have 6 timers. for (int i = 0; i < maxTimerInputs; ++i) { builder.addScalar(SurgSim::DataStructures::Names::TIMER_INPUT_PREFIX + std::to_string(i)); } const int maxAnalogInputs = 16; // The U3 can have 16 analog inputs. for (int i = 0; i < maxAnalogInputs; ++i) { builder.addScalar(SurgSim::DataStructures::Names::ANALOG_INPUT_PREFIX + std::to_string(i)); } return builder.createData(); } std::shared_ptr LabJackScaffold::getOrCreateSharedInstance() { static SurgSim::Framework::SharedInstance sharedInstance; return sharedInstance.get(); } void LabJackScaffold::configureDevice(DeviceData* deviceData) { deviceData->configured = configureClockAndTimers(deviceData) && configureDigital(deviceData) && configureAnalog(deviceData); } bool LabJackScaffold::configureClockAndTimers(DeviceData* deviceData) { bool result = configureNumberOfTimers(deviceData); if (result && (deviceData->deviceObject->getTimers().size() > 0)) { result = configureClock(deviceData) && configureTimers(deviceData); } return result; } bool LabJackScaffold::configureNumberOfTimers(DeviceData* deviceData) { LabJackDevice* device = deviceData->deviceObject; LJ_HANDLE rawHandle = deviceData->deviceHandle->get(); // One-time configuration of counters and timers. const std::unordered_map& timers = device->getTimers(); for (auto timer : timers) { SURGSIM_LOG_IF(timer.first >= static_cast(timers.size()), m_logger, SEVERE) << "Error configuring enabled timers for a device named '" << device->getName() << "', with number of timers: " << timers.size() << "." << std::endl << " Timers must be enabled consecutively, starting with #0." << std::endl << " With the currently enabled number of timers, the highest allowable timer is #" << timers.size() - 1 << ", but one of the enabled timers is #" << timer.first << "." << std::endl; } const BYTE numberOfTimers = timers.size(); const BYTE counterEnable = 0; // Counters are not currently supported. const BYTE pinOffset = device->getTimerCounterPinOffset(); // First, configure the number of timers and counters std::array sendBytes; sendBytes[1] = 0xF8; //Command byte, ConfigIO sendBytes[2] = 0x05; //Number of data words sendBytes[3] = 0x0B; //Extended command number sendBytes[6] = 1; //Writemask : Setting writemask for timerCounterConfig (bit 0) sendBytes[7] = numberOfTimers; //NumberTimersEnabled sendBytes[8] = counterEnable; //CounterEnable: Bit 0 is Counter 0, Bit 1 is Counter 1 sendBytes[9] = pinOffset; //TimerCounterPinOffset int sendBytesSize = 16; //ConfigIO command sends 16 bytes for (int i = 10; i < sendBytesSize; ++i) { sendBytes[i] = 0; //Reserved } LabJack::extendedChecksum(&sendBytes, 16); int sent = LJUSB_Write(rawHandle, &(sendBytes[0]), sendBytesSize); bool result = true; if (sent < sendBytesSize) { SURGSIM_LOG_SEVERE(m_logger) << "Failed to write timer/counter configuration information for a device named '" << device->getName() << "'. " << sendBytesSize << " bytes should have been sent, but only " << sent << " were actually sent." << std::endl << " labjackusb error code: " << errno << "." << std::endl; result = false; } if (result) { const int readBytesSize = 16; // timerCounterConfig replies with 16 bytes. std::array readBytes; const std::string errorText = "timer/counter configuration for"; result = readAndCheck(rawHandle, &readBytes, readBytesSize, device->getName(), sendBytes, errorText, m_logger); if (readBytes[2] != sendBytes[2]) { SURGSIM_LOG_SEVERE(m_logger) << "Failed to read response of " << errorText << " a device named '" << device->getName() << "'. The command bytes are wrong. Expected: " << static_cast(sendBytes[1]) << ", " << static_cast(sendBytes[2]) << ", " << static_cast(sendBytes[3]) << ". Received: " << static_cast(readBytes[1]) << ", " << static_cast(readBytes[2]) << ", " << static_cast(readBytes[3]) << "." << std::endl << " labjackusb error code: " << errno << "." << std::endl; result = false; } } return result; } bool LabJackScaffold::configureClock(DeviceData* deviceData) { LabJackDevice* device = deviceData->deviceObject; LJ_HANDLE rawHandle = deviceData->deviceHandle->get(); LabJack::TimerBase base = device->getTimerBase(); if (base == LabJack::TimerBase::TIMERBASE_DEFAULT) { LabJackDefaults defaults; base = defaults.timerBase[device->getModel()]; } // Second, set the clock base and divisor // The low-level settings for the timer base are 20 less than the high-level values for the U3 and U6. // The low- and high-level settings are the same for the UE9. const int timerBaseOffset = 20; BYTE timerBase = device->getTimerBase(); // If the TimerBase is above 20, it was set for a high-level value, convert to the equivalent value for // the low-level driver. if (timerBase > timerBaseOffset) { timerBase -= timerBaseOffset; } const BYTE divisor = device->getTimerClockDivisor(); // Write the clock configuration. std::array sendBytes; sendBytes[1] = 0xF8; //Command byte, ConfigTimerClock sendBytes[2] = 0x02; //Number of data words sendBytes[3] = 0x0A; //Extended command number sendBytes[6] = 0; //Reserved sendBytes[7] = 0; //Reserved //TimerClockConfig : Configuring the clock (bit 7) and setting the TimerClockBase (bits 0-2) const BYTE configureClockCode = 1 << 7; sendBytes[8] = timerBase | configureClockCode; sendBytes[9] = divisor; //TimerClockDivisor int sendBytesSize = 10; // ConfigTimerClock sends 10 bytes LabJack::extendedChecksum(&sendBytes, sendBytesSize); int sent = LJUSB_Write(rawHandle, &(sendBytes[0]), sendBytesSize); bool result = true; if (sent < sendBytesSize) { SURGSIM_LOG_SEVERE(m_logger) << "Failed to write clock configuration information for a device named '" << device->getName() << "'. " << sendBytesSize << " bytes should have been sent, but only " << sent << " were actually sent." << std::endl << " labjackusb error code: " << errno << "." << std::endl; result = false; } if (result) { // Read the response for the clock configuration. const int readBytesSize = 10; // ConfigTimerClock replies with 10 bytes. std::array readBytes; const std::string errorText = "clock configuration for"; result = readAndCheck(rawHandle, &readBytes, readBytesSize, device->getName(), sendBytes, errorText, m_logger); if (readBytes[2] != sendBytes[2]) { SURGSIM_LOG_SEVERE(m_logger) << "Failed to read response of " << errorText << " a device named '" << device->getName() << "'. The command bytes are wrong. Expected: " << static_cast(sendBytes[1]) << ", " << static_cast(sendBytes[2]) << ", " << static_cast(sendBytes[3]) << ". Received: " << static_cast(readBytes[1]) << ", " << static_cast(readBytes[2]) << ", " << static_cast(readBytes[3]) << "." << std::endl << " labjackusb error code: " << errno << "." << std::endl; result = false; } } return result; } bool LabJackScaffold::configureTimers(DeviceData* deviceData) { LabJackDevice* device = deviceData->deviceObject; LJ_HANDLE rawHandle = deviceData->deviceHandle->get(); bool result = true; // Configure each timer's mode via a Feedback command. std::array sendBytes; sendBytes[1] = 0xF8; //Command byte, Feedback sendBytes[3] = 0x00; //Extended command number sendBytes[6] = 0; //Echo int sendBytesSize = 7; // the first IOType goes here int readBytesSize = 9; // Reading after a Feedback command provides 9+ bytes. const std::unordered_map timers = device->getTimers(); for (auto timer = timers.cbegin(); timer != timers.cend(); ++timer) { const int minimumTimer = 0; const int maximumTimer = 3; if ((timer->first < minimumTimer) || (timer->first > maximumTimer)) { SURGSIM_LOG_SEVERE(m_logger) << "Failed to configure a timer for a device named '" << device->getName() << "'. Timer number (the key in the argument to LabJackDevice::setTimers) " << timer->first << " is outside of the valid range " << minimumTimer << "-" << maximumTimer << "." << std::endl; result = false; } if (result) { const BYTE timerConfigCode = timer->first * 2 + 43; // The timer configs are 43, 45, 47, and 49. sendBytes.at(sendBytesSize++) = timerConfigCode; //IOType, Timer#Config (e.g., Timer0Config) sendBytes.at(sendBytesSize++) = timer->second.mode; //TimerMode const int initialValue = timer->second.initialValue.hasValue() ? timer->second.initialValue.getValue() : 0; sendBytes.at(sendBytesSize++) = static_cast(initialValue & 0xFF); //Value LSB sendBytes.at(sendBytesSize++) = static_cast((initialValue >> 8) & 0xFF); //Value MSB } } if (result) { // Write the timer Feedback command. // Must send an even number of bytes. if (sendBytesSize % 2 == 1) { sendBytes.at(sendBytesSize++) = 0; } const BYTE sendCommandBytes = 6; const BYTE dataWords = (sendBytesSize - sendCommandBytes) / 2; sendBytes[2] = dataWords; LabJack::extendedChecksum(&sendBytes, sendBytesSize); int sent = LJUSB_Write(rawHandle, &(sendBytes[0]), sendBytesSize); if (sent < sendBytesSize) { SURGSIM_LOG_SEVERE(m_logger) << "Failed to write timer mode feedback command for a device named '" << device->getName() << "'. " << sendBytesSize << " bytes should have been sent, but only " << sent << " were actually sent." << std::endl << " labjackusb error code: " << errno << "." << std::endl; result = false; } } if (result) { // Read the response for the timer feedback command. // Must read an even number of bytes if (readBytesSize % 2 == 1) { ++readBytesSize; } std::array readBytes; const std::string errorText = "timer mode feedback command for"; result = readAndCheck(rawHandle, &readBytes, readBytesSize, device->getName(), sendBytes, errorText, m_logger); const BYTE readCommandBytes = 6; const BYTE dataWords = (readBytesSize - readCommandBytes) / 2; if (readBytes[2] != dataWords) { SURGSIM_LOG_SEVERE(m_logger) << "Failed to read response of " << errorText << " a device named '" << device->getName() << "'. The number of words in the response is wrong. Expected: " << static_cast(dataWords) << ". Received: " << static_cast(readBytes[2]) << "." << std::endl << " labjackusb error code: " << errno << "." << std::endl; result = false; } } return result; } bool LabJackScaffold::configureAnalog(DeviceData* deviceData) { LabJackDevice* device = deviceData->deviceObject; LJ_HANDLE rawHandle = deviceData->deviceHandle->get(); bool result = true; const std::unordered_set& analogOutputs = deviceData->analogOutputChannels; for (auto output = analogOutputs.cbegin(); output != analogOutputs.cend(); ++output) { const int minimumDac = 0; const int maximumDac = 1; if ((*output < minimumDac) || (*output > maximumDac)) { SURGSIM_LOG_SEVERE(m_logger) << "Failed to configure an analog output (DAC) for a device named '" << device->getName() << "'. DAC number " << *output << " is outside of the valid range " << minimumDac << "-" << maximumDac << "." << std::endl; result = false; } } if (device->getModel() == LabJack::MODEL_U6) { auto const& analogInputs = deviceData->analogInputs; for (auto input = analogInputs.cbegin(); input != analogInputs.cend(); ++input) { if ((input->second.negativeChannel.hasValue()) && (input->second.negativeChannel.getValue() != input->first + 1)) { SURGSIM_LOG_SEVERE(m_logger) << "Failed to configure a differential analog input for a device named '" << device->getName() << "'. For a model U6(-PRO), with the low-level driver, "<< "the negative channel number must be one greater than the positive channel number, " << "but positive channel " << input->first << " is paired with negative channel " << input->second.negativeChannel.getValue() << "."; result = false; } } } LabJackParameters parameters; const int blocks = parameters.configBlocks[device->getModel()]; std::array sendBytes; sendBytes[1] = 0xF8; //command byte sendBytes[2] = 0x01; //number of data words sendBytes[3] = parameters.calibrationCommand[device->getModel()]; sendBytes[6] = 0; const int sendBytesSize = 8; const int readBytesSize = parameters.calibrationReadBytes[device->getModel()]; for (int i = 0; i < blocks; ++i) { if (result) { sendBytes[7] = i; LabJack::extendedChecksum(&sendBytes, sendBytesSize); const int sent = LJUSB_Write(rawHandle, &(sendBytes[0]), sendBytesSize); if (sent < sendBytesSize) { SURGSIM_LOG_SEVERE(m_logger) << "Failed to write a feedback command to read the calibration data for a device named '" << device->getName() << "'. " << sendBytesSize << " bytes should have been sent, but only " << sent << " were actually sent." << std::endl << " labjackusb error code: " << errno << "." << std::endl; result = false; } } if (result) { std::array readBytes; const std::string errorText = "feedback command to read the calibration data for"; result = readAndCheck(rawHandle, &readBytes, readBytesSize, device->getName(), sendBytes, errorText, m_logger); if (readBytes[2] != parameters.calibrationThirdByte[device->getModel()]) { SURGSIM_LOG_SEVERE(m_logger) << "Failed to read response of " << errorText << " a device named '" << device->getName() << "'. The command bytes are wrong. Expected byte 2: " << static_cast(parameters.calibrationThirdByte[device->getModel()]) << ". Received: " << static_cast(readBytes[2]) << "." << std::endl << " labjackusb error code: " << errno << "." << std::endl; result = false; } if (result) { const int offset = i * 4; deviceData->calibration[offset] = LabJack::doubleFromChars(readBytes, 8); deviceData->calibration[offset + 1] = LabJack::doubleFromChars(readBytes, 16); deviceData->calibration[offset + 2] = LabJack::doubleFromChars(readBytes, 24); deviceData->calibration[offset + 3] = LabJack::doubleFromChars(readBytes, 32); } } } return result; } bool LabJackScaffold::configureDigital(DeviceData* deviceData) { LabJackDevice* device = deviceData->deviceObject; LJ_HANDLE rawHandle = deviceData->deviceHandle->get(); bool result = true; const std::unordered_set& digitalInputChannels = deviceData->digitalInputChannels; const std::unordered_set& digitalOutputChannels = deviceData->digitalOutputChannels; if ((digitalInputChannels.size() > 0) || (digitalOutputChannels.size() > 0)) { // Configure each digital line's direction via a Feedback command. The output lines will automatically be // forced high when we write their states in updateDevice, but we must explicitly set the direction on // input lines so we just do both here. std::array sendBytes; sendBytes[1] = 0xF8; //Command byte, Feedback sendBytes[3] = 0x00; //Extended command number sendBytes[6] = 0; //Echo int sendBytesSize = 7; // the first IOType goes here int readBytesSize = 9; // Reading after a Feedback command provides 9+ bytes. for (auto input = digitalInputChannels.cbegin(); input != digitalInputChannels.cend(); ++input) { sendBytes.at(sendBytesSize++) = 13; //IOType, BitDirWrite sendBytes.at(sendBytesSize++) = *input; //Bits 0-4: IO Number, Bit 7: Direction (1=output, 0=input) } for (auto output = digitalOutputChannels.cbegin(); output != digitalOutputChannels.cend(); ++output) { const BYTE direction = 1 << 7; sendBytes.at(sendBytesSize++) = 13; //IOType, BitDirWrite sendBytes.at(sendBytesSize++) = *output | direction; //Bits 0-4: IO Number, // Bit 7: Direction (1=output, 0=input) } // Write the digital input/output Feedback command. // Must send an even number of bytes. if (sendBytesSize % 2 == 1) { sendBytes.at(sendBytesSize++) = 0; } const BYTE sendCommandBytes = 6; const BYTE dataWords = (sendBytesSize - sendCommandBytes) / 2; sendBytes[2] = dataWords; LabJack::extendedChecksum(&sendBytes, sendBytesSize); int sent = LJUSB_Write(rawHandle, &(sendBytes[0]), sendBytesSize); if (sent < sendBytesSize) { SURGSIM_LOG_SEVERE(m_logger) << "Failed to write digital line direction feedback command for a device named '" << device->getName() << "'. " << sendBytesSize << " bytes should have been sent, but only " << sent << " were actually sent." << std::endl << " labjackusb error code: " << errno << "." << std::endl; result = false; } if (result) { // Read the response for the digital input/output feedback command. // Must read an even number of bytes if (readBytesSize % 2 == 1) { ++readBytesSize; } std::array readBytes; const std::string errorText = "digital line direction configuration for"; result = readAndCheck(rawHandle, &readBytes, readBytesSize, device->getName(), sendBytes, errorText, m_logger); const BYTE readCommandBytes = 6; const BYTE dataWords = (readBytesSize - readCommandBytes) / 2; if (readBytes[2] != dataWords) { SURGSIM_LOG_SEVERE(m_logger) << "Failed to read response of " << errorText << " a device named '" << device->getName() << "'. The number of words in the response is wrong. Expected: " << static_cast(dataWords) << ". Received: " << static_cast(readBytes[2]) << "." << std::endl << " labjackusb error code: " << errno << "." << std::endl; result = false; } } } return result; } }; // namespace Devices }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Devices/LabJack/linux/LabJackTypeConverters.cpp000066400000000000000000000044541277777236100264340ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Devices/LabJack/linux/LabJackTypeConverters.h" #include "SurgSim/Framework/Assert.h" namespace SurgSim { namespace Devices { namespace LabJack { double doubleFromChars(const std::array& bytes, int startIndex) { uint32_t decimal = static_cast(bytes.at(startIndex)) | (static_cast(bytes.at(startIndex + 1)) << 8) | (static_cast(bytes.at(startIndex + 2)) << 16) | (static_cast(bytes.at(startIndex + 3)) << 24); uint32_t whole = static_cast(bytes[startIndex + 4]) | (static_cast(bytes.at(startIndex + 5)) << 8) | (static_cast(bytes.at(startIndex + 6)) << 16) | (static_cast(bytes.at(startIndex + 7)) << 24); return static_cast(static_cast(whole)) + static_cast(decimal)/4294967296.0; } uint32_t uint32FromChars(const std::array &bytes, int startIndex, int count) { SURGSIM_ASSERT(count <= 4) << __FUNCTION__ << " got a count of " << count << "; that is too large."; uint32_t value = 0; for (int i = count - 1; i > 0; --i) { value += bytes.at(startIndex + i); value = value << 8; } value += bytes.at(startIndex); return value; } uint16_t uint16FromChars(const std::array &bytes, int startIndex, int count) { SURGSIM_ASSERT(count <= 2) << __FUNCTION__ << " got a count of " << count << "; that is too large."; uint16_t value = 0; if (count > 1) { value += bytes.at(startIndex + 1); value = value << 8; } value += bytes.at(startIndex); return value; } }; // namespace LabJack }; // namespace Devices }; // namespace SurgSimopensurgsim-0.7.0/SurgSim/Devices/LabJack/linux/LabJackTypeConverters.h000066400000000000000000000053101277777236100260710ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DEVICES_LABJACK_LINUX_LABJACKTYPECONVERTERS_H #define SURGSIM_DEVICES_LABJACK_LINUX_LABJACKTYPECONVERTERS_H #include #include "SurgSim/Devices/LabJack/linux/LabJackConstants.h" namespace SurgSim { namespace Devices { namespace LabJack { /// Converts an eight byte array to a floating point double value. This function is necessary for /// communication with the low-level driver for the LabJack, which passes all data via unsigned char. The expected /// format is: the first four bytes store the truncated absolute value of the decimal portion times 4294967296, /// the last four bytes store the signed whole-number portion, and the bytes are stored in little endian order. /// \param bytes The array. /// \param startIndex The index of the first element. /// \return The double. double doubleFromChars(const std::array& bytes, int startIndex); /// Converts an array of bytes to a uint32_t, with the least significant byte at startIndex, and the most significant /// byte at startIndex + byteCount - 1. /// \param bytes The array. /// \param startIndex The index in the array of the first byte to use. /// \param count The number of bytes to convert. /// \return A uint32_t. /// \exception Asserts if byteCount is greater than 4, or it attempts to access beyond the end of the byte array. uint32_t uint32FromChars(const std::array &bytes, int startIndex, int count); /// Converts an array of bytes to a uint16_t, with the least significant byte at startIndex. /// \param bytes The array. /// \param startIndex The index in the array of the first byte to use. /// \param count The number of bytes to convert. /// \return A uint16_t. /// \exception Asserts if byteCount is greater than 2, or it attempts to access beyond the end of the byte array. uint16_t uint16FromChars(const std::array &bytes, int startIndex, int count); }; // namespace LabJack }; // namespace Devices }; // namespace SurgSim #endif // SURGSIM_DEVICES_LABJACK_LINUX_LABJACKTYPECONVERTERS_H opensurgsim-0.7.0/SurgSim/Devices/LabJack/win32/000077500000000000000000000000001277777236100213205ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Devices/LabJack/win32/LabJackScaffold.cpp000066400000000000000000001134211277777236100247570ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Devices/LabJack/LabJackScaffold.h" #include #include #include #include #include // the high-level LabJack library. #include #include #include #include #include #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/DataStructures/DataGroupBuilder.h" #include "SurgSim/Devices/LabJack/LabJackDevice.h" #include "SurgSim/Devices/LabJack/LabJackThread.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Framework/SharedInstance.h" namespace SurgSim { namespace Devices { namespace { /// The LabJackUD returns a handle of 0 when failing to open a new device. static const LJ_HANDLE LABJACK_INVALID_HANDLE = 0; /// Returns true if there are no LabJackUD errors. /// \param code The error code. /// \return True if no LabJackUD errors. bool isOk(LJ_ERROR code) { return (code == LJE_NOERROR); } /// Outputs a string containing the LabJackUD error code and text equivalent. /// \param errorCode The error code used by LabJackUD. /// \return A string containing the message. std::string formatErrorMessage(LJ_ERROR code) { char error[256]; // According to LabJackUD.h, the buffer must store at least 256 elements. ErrorToString(code, error); return std::string("LabJackUD returned error code: ") + std::to_string(code) + ", and string: " + error; } /// A struct containing the default settings that depend on the model of LabJack. struct LabJackDefaults { LabJackDefaults() { timerBase[LabJack::MODEL_U3] = LabJack::TIMERBASE_22; timerBase[LabJack::MODEL_U6] = LabJack::TIMERBASE_22; timerBase[LabJack::MODEL_UE9] = LabJack::TIMERBASE_1; } /// The default timer base rate. std::unordered_map timerBase; }; }; class LabJackScaffold::Handle { public: /// Constructor that attempts to open a device. /// \param model The model of LabJack device to open (see strings in LabJackUD.h). /// \param connection How to connect to the device (e.g., USB) (see strings in LabJackUD.h). /// \param address Either the ID or serial number (if USB), or the IP address. Handle(LabJack::Model model, LabJack::Connection connection, const std::string& address) : m_address(address), m_model(model), m_connection(connection), m_deviceHandle(LABJACK_INVALID_HANDLE), m_logger(Framework::Logger::getLogger("Devices/LabJack")) { int firstFound = 0; if (m_address.length() == 0) { firstFound = 1; // If no address is specified, grab the first device found of this model and connection. } int tries = 3; LJ_ERROR error = LJE_MIN_USER_ERROR; while (!isOk(error) && (--tries >= 0)) { error = OpenLabJack(m_model, m_connection, m_address.c_str(), firstFound, &m_deviceHandle); if (!isOk(error) && (tries >= 0)) { boost::this_thread::sleep_for(boost::chrono::milliseconds(1000)); } } SURGSIM_LOG_IF(!isOk(error), m_logger, SEVERE) << "Failed to initialize a device. Model: " << m_model << ". Connection: " << m_connection << ". Address: '" << m_address << "'." << std::endl << formatErrorMessage(error); } /// Destructor. ~Handle() { destroy(); } /// \return Whether or not the wrapped handle is valid. bool isValid() const { return (m_deviceHandle != LABJACK_INVALID_HANDLE); } /// Close communication with the hardware. /// \param reset true to cause a hardware reset & USB re-enumeration. Otherwise the hardware's settings will be /// unchanged (i.e., it will continue timing, counting, and outputting). void destroy(bool reset = false) { if (isValid()) { if (reset) { const LJ_ERROR error = ResetLabJack(m_deviceHandle); SURGSIM_LOG_IF(!isOk(error), m_logger, SEVERE) << "Failed to reset the LabJack device. Model: " << m_model << ". Connection: " << m_connection << ". Address: '" << m_address << "'." << std::endl << formatErrorMessage(error); } m_deviceHandle = LABJACK_INVALID_HANDLE; } } /// \return The LabJackUD's handle wrapped by this Handle. LJ_HANDLE get() const { return m_deviceHandle; } private: // Prevent copy construction and copy assignment. (VS2012 does not support "= delete" yet.) Handle(const Handle&) /*= delete*/; Handle& operator=(const Handle&) /*= delete*/; /// The HDAL device handle (or LABJACK_INVALID_HANDLE if not valid). LJ_HANDLE m_deviceHandle; /// The address used to open the device. Can be the empty string if the first-found device was opened. std::string m_address; /// The device model. LabJack::Model m_model; /// The connection to the device. LabJack::Connection m_connection; /// The logger. std::shared_ptr m_logger; }; /// The per-device data. struct LabJackScaffold::DeviceData { public: /// Initialize the data, creating a thread. DeviceData(LabJackDevice* device, std::unique_ptr&& handle) : deviceObject(device), thread(), deviceHandle(std::move(handle)), digitalInputChannels(device->getDigitalInputs()), digitalOutputChannels(device->getDigitalOutputs()), timerInputChannels(getTimerInputChannels(device->getTimers())), timerOutputChannels(getTimerOutputChannels(device->getTimers())), analogInputs(device->getAnalogInputs()), analogOutputChannels(device->getAnalogOutputs()), cachedOutputIndices(false), configured(false) { } ~DeviceData() { if (thread != nullptr) { thread->stop(); thread = nullptr; } deviceHandle->destroy(deviceObject->getResetOnDestruct()); } /// The corresponding device object. LabJackDevice* const deviceObject; /// Processing thread. std::unique_ptr thread; /// Device handle to read from. std::unique_ptr deviceHandle; /// The channels read for digital inputs. const std::unordered_set digitalInputChannels; /// The channels set for digital outputs. const std::unordered_set digitalOutputChannels; /// The timer channels that provide inputs. const std::unordered_set timerInputChannels; /// The timer channels set for timer outputs (e.g., PWM outputs). const std::unordered_set timerOutputChannels; /// The analog inputs. const std::unordered_map analogInputs; /// The channels set for analog outputs. const std::unordered_set analogOutputChannels; /// The DataGroup indices for the digital outputs. std::unordered_map digitalOutputIndices; /// The DataGroup indices for the digital inputs. std::unordered_map digitalInputIndices; /// The DataGroup indices for the timer outputs. std::unordered_map timerOutputIndices; /// The DataGroup indices for the timer inputs. std::unordered_map timerInputIndices; /// The DataGroup indices for the analog outputs. std::unordered_map analogOutputIndices; /// The DataGroup indices for the analog inputs. std::unordered_map analogInputIndices; /// True if the output indices have been cached. bool cachedOutputIndices; /// True if the device has been successfully configured. bool configured; private: /// Given all the timers, return just the ones that provide inputs. /// \param timers The timers. /// \return The timers that provide inputs. const std::unordered_set getTimerInputChannels(const std::unordered_map& timers) const { std::unordered_set timersWithInputs; for (auto timer = timers.cbegin(); timer != timers.cend(); ++timer) { if ((timer->second.mode != LabJack::TIMERMODE_PWM_16BIT) && (timer->second.mode != LabJack::TIMERMODE_PWM_8BIT) && (timer->second.mode != LabJack::TIMERMODE_FREQUENCY_OUTPUT)) { timersWithInputs.insert(timer->first); } } return timersWithInputs; } /// Given all the timers, return just the ones that take outputs. /// \param timers The timers. /// \return The timers that take outputs. const std::unordered_set getTimerOutputChannels(const std::unordered_map& timers) const { std::unordered_set timersWithOutputs; for (auto timer = timers.cbegin(); timer != timers.cend(); ++timer) { if ((timer->second.mode == LabJack::TIMERMODE_PWM_16BIT) || (timer->second.mode == LabJack::TIMERMODE_PWM_8BIT) || (timer->second.mode == LabJack::TIMERMODE_RISING_EDGES_32BIT) || (timer->second.mode == LabJack::TIMERMODE_FALLING_EDGES_32BIT) || (timer->second.mode == LabJack::TIMERMODE_DUTY_CYCLE) || (timer->second.mode == LabJack::TIMERMODE_FIRMWARE_COUNTER) || (timer->second.mode == LabJack::TIMERMODE_FIRMWARE_COUNTER_DEBOUNCED) || (timer->second.mode == LabJack::TIMERMODE_FREQUENCY_OUTPUT) || (timer->second.mode == LabJack::TIMERMODE_QUADRATURE) || (timer->second.mode == LabJack::TIMERMODE_RISING_EDGES_16BIT) || (timer->second.mode == LabJack::TIMERMODE_FALLING_EDGES_16BIT) || (timer->second.mode == LabJack::TIMERMODE_LINE_TO_LINE)) { timersWithOutputs.insert(timer->first); } } return timersWithOutputs; } // Prevent copy construction and copy assignment. (VS2012 does not support "= delete" yet.) DeviceData(const DeviceData&) /*= delete*/; DeviceData& operator=(const DeviceData&) /*= delete*/; }; /// The per-scaffold data (in comparison to DeviceData the per-device data). /// Note that there is only a single instance of LabJackScaffold and so only a single instance of this struct. struct LabJackScaffold::StateData { public: /// Initialize the state. StateData() { } /// The list of known devices. std::list> activeDeviceList; /// The mutex that protects the list of known devices. boost::mutex mutex; private: // Prevent copy construction and copy assignment. (VS2012 does not support "= delete" yet.) StateData(const StateData&) /*= delete*/; StateData& operator=(const StateData&) /*= delete*/; }; LabJackScaffold::LabJackScaffold() : m_logger(Framework::Logger::getLogger("Devices/LabJack")), m_state(new StateData) { SURGSIM_LOG_DEBUG(m_logger) << "Shared scaffold created. LabJackUD driver version: " << GetDriverVersion(); } LabJackScaffold::~LabJackScaffold() { boost::lock_guard lock(m_state->mutex); if (!m_state->activeDeviceList.empty()) { SURGSIM_LOG_SEVERE(m_logger) << "Destroying scaffold while devices are active!?!"; m_state->activeDeviceList.clear(); } SURGSIM_LOG_DEBUG(m_logger) << "Shared scaffold destroyed."; } bool LabJackScaffold::registerDevice(LabJackDevice* device) { boost::lock_guard lock(m_state->mutex); bool result = true; // Make sure the object is unique. auto sameObject = std::find_if(m_state->activeDeviceList.cbegin(), m_state->activeDeviceList.cend(), [device](const std::unique_ptr& info) { return info->deviceObject == device; }); SURGSIM_ASSERT(sameObject == m_state->activeDeviceList.end()) << "LabJack: Tried to register a device named '" << device->getName() << "', which is already present!"; // Make sure the name is unique. const std::string& deviceName = device->getName(); auto const sameName = std::find_if(m_state->activeDeviceList.cbegin(), m_state->activeDeviceList.cend(), [&deviceName](const std::unique_ptr& info) { return info->deviceObject->getName() == deviceName; }); if (sameName != m_state->activeDeviceList.end()) { SURGSIM_LOG_SEVERE(m_logger) << "Tried to register a device when the same name, '" << device->getName() << "', is already present!"; result = false; } // Make sure the combination of connection and address is unique, unless the address is zero-length, in which // case the first-found device of this model on this connection will be opened. const std::string& address = device->getAddress(); if (result && (address.length() > 0)) { const LabJack::Model model = device->getModel(); const LabJack::Connection connection = device->getConnection(); auto const sameInitialization = std::find_if(m_state->activeDeviceList.cbegin(), m_state->activeDeviceList.cend(), [&address, connection, model](const std::unique_ptr& info) { return (info->deviceObject->getAddress() == address) && (info->deviceObject->getConnection() == connection) && (info->deviceObject->getModel() == model); }); if (sameInitialization != m_state->activeDeviceList.cend()) { SURGSIM_LOG_SEVERE(m_logger) << "Tried to register a device named '" << device->getName() << "', but a device with the same model (" << model << "), connection (" << connection << "), and address ('" << address << "') is already present!"; result = false; } } if (result) { // Create a handle, opening communications. // If the device's model or connection are SEARCH, iterate over the options. std::vector modelsToSearch; if (device->getModel() == LabJack::MODEL_SEARCH) { SURGSIM_LOG_INFO(m_logger) << "Device " << device->getName() << ": searching for models U3, U6, and UE9."; modelsToSearch.push_back(LabJack::MODEL_U6); modelsToSearch.push_back(LabJack::MODEL_U3); modelsToSearch.push_back(LabJack::MODEL_UE9); } else { modelsToSearch.push_back(device->getModel()); } std::vector connectionsToSearch; if (device->getConnection() == LabJack::CONNECTION_SEARCH) { SURGSIM_LOG_INFO(m_logger) << "Device " << device->getName() << ": searching for connections USB and Ethernet."; connectionsToSearch.push_back(LabJack::CONNECTION_USB); connectionsToSearch.push_back(LabJack::CONNECTION_ETHERNET); } else { connectionsToSearch.push_back(device->getConnection()); } std::unique_ptr handle; for (auto model = modelsToSearch.cbegin(); model != modelsToSearch.cend(); ++model) { for (auto connection = connectionsToSearch.cbegin(); connection != connectionsToSearch.cend(); ++connection) { device->setModel(*model); device->setConnection(*connection); handle = std::unique_ptr(new Handle(*model, *connection, address)); result = handle->isValid(); if (result) { auto const sameHandle = std::find_if(m_state->activeDeviceList.cbegin(), m_state->activeDeviceList.cend(), [&handle](const std::unique_ptr& info) { return (info->deviceHandle->get() == handle->get()); }); if (sameHandle != m_state->activeDeviceList.cend()) { SURGSIM_LOG_INFO(m_logger) << "Tried to register a device named '" << device->getName() << "', but a device with the same handle (" << handle->get() << ") is already present! " << "This can happen if multiple LabJack devices are used without setting their addresses."; result = false; } else { break; } } } if (result) { break; } } if (result) { std::unique_ptr info(new DeviceData(device, std::move(handle))); // Cache the NamedData indices for the input DataGroup. const SurgSim::DataStructures::DataGroup& inputData = device->getInputData(); for (auto input = info->digitalInputChannels.cbegin(); input != info->digitalInputChannels.cend(); ++input) { const std::string name = SurgSim::DataStructures::Names::DIGITAL_INPUT_PREFIX + std::to_string(*input); info->digitalInputIndices[*input] = inputData.booleans().getIndex(name); SURGSIM_ASSERT(info->digitalInputIndices[*input] >= 0) << "LabJackScaffold::DeviceData " << "failed to get a valid NamedData index for the digital input for line " << *input << ". Make sure that is a valid line number. Expected an entry named " << name << "."; } for (auto timer = info->timerInputChannels.cbegin(); timer != info->timerInputChannels.cend(); ++timer) { const std::string name = SurgSim::DataStructures::Names::TIMER_INPUT_PREFIX + std::to_string(*timer); info->timerInputIndices[*timer] = inputData.scalars().getIndex(name); SURGSIM_ASSERT(info->timerInputIndices[*timer] >= 0) << "LabJackScaffold::DeviceData " << "failed to get a valid NamedData index for the timer for channel " << *timer << ". Make sure that is a valid timer number. Expected an entry named " << name << "."; } for (auto input = info->analogInputs.cbegin(); input != info->analogInputs.cend(); ++input) { std::string name = SurgSim::DataStructures::Names::ANALOG_INPUT_PREFIX + std::to_string(input->first); info->analogInputIndices[input->first] = inputData.scalars().getIndex(name); SURGSIM_ASSERT(info->analogInputIndices[input->first] >= 0) << "LabJackScaffold::DeviceData failed to get a valid NamedData index for the " << "analog input for channel " << input->first << ". Make sure that is a valid line number. " << "Expected an entry named " << name << "."; } std::unique_ptr thread(new LabJackThread(this, info.get())); result = info->configured; if (result) { thread->setRate(device->getMaximumUpdateRate()); thread->start(); info.get()->thread = std::move(thread); m_state->activeDeviceList.emplace_back(std::move(info)); } } } SURGSIM_LOG_IF(result, m_logger, INFO) << "Device " << device->getName() << " registered."; return result; } bool LabJackScaffold::unregisterDevice(const LabJackDevice* const device) { bool found = false; { boost::lock_guard lock(m_state->mutex); auto matching = std::find_if(m_state->activeDeviceList.begin(), m_state->activeDeviceList.end(), [device](const std::unique_ptr& info) { return info->deviceObject == device; }); if (matching != m_state->activeDeviceList.end()) { m_state->activeDeviceList.erase(matching); // the iterator is now invalid but that's OK found = true; SURGSIM_LOG_INFO(m_logger) << "Device " << device->getName() << " unregistered."; } } SURGSIM_LOG_IF(!found, m_logger, CRITICAL) << "Attempted to release a non-registered device named '" << device->getName() << "."; return found; } bool LabJackScaffold::runInputFrame(LabJackScaffold::DeviceData* info) { if (info->deviceObject->pullOutput() && !info->cachedOutputIndices) { const SurgSim::DataStructures::DataGroup& initialOutputData = info->deviceObject->getOutputData(); const std::unordered_set& digitalOutputChannels = info->digitalOutputChannels; for (auto output = digitalOutputChannels.cbegin(); output != digitalOutputChannels.cend(); ++output) { info->digitalOutputIndices[*output] = initialOutputData.booleans().getIndex(SurgSim::DataStructures::Names::DIGITAL_OUTPUT_PREFIX + std::to_string(*output)); } const std::unordered_set& timerOutputChannels = info->timerOutputChannels; for (auto timer = timerOutputChannels.cbegin(); timer != timerOutputChannels.cend(); ++timer) { info->timerOutputIndices[*timer] = initialOutputData.scalars().getIndex(SurgSim::DataStructures::Names::TIMER_OUTPUT_PREFIX + std::to_string(*timer)); } const std::unordered_set& analogOutputChannels = info->analogOutputChannels; for (auto output = analogOutputChannels.cbegin(); output != analogOutputChannels.cend(); ++output) { info->analogOutputIndices[*output] = initialOutputData.scalars().getIndex(SurgSim::DataStructures::Names::ANALOG_OUTPUT_PREFIX + std::to_string(*output)); } info->cachedOutputIndices = true; } if (!updateDevice(info)) { return false; } info->deviceObject->pushInput(); return true; } bool LabJackScaffold::updateDevice(LabJackScaffold::DeviceData* info) { const LJ_HANDLE rawHandle = info->deviceHandle->get(); // First we AddRequests. This clears the old data. const SurgSim::DataStructures::DataGroup& outputData = info->deviceObject->getOutputData(); // Request the values of digital inputs. const std::unordered_set& digitalInputChannels = info->digitalInputChannels; for (auto input = digitalInputChannels.cbegin(); input != digitalInputChannels.cend(); ++input) { const LJ_ERROR error = AddRequest(rawHandle, LJ_ioGET_DIGITAL_BIT, *input, 0, 0, 0); SURGSIM_LOG_IF(!isOk(error), m_logger, WARNING) << "Failed to request digital input for a device named '" << info->deviceObject->getName() << "', line number " << *input << "." << std::endl << formatErrorMessage(error); } // Request to set digital outputs. const std::unordered_set& digitalOutputChannels = info->digitalOutputChannels; for (auto output = digitalOutputChannels.cbegin(); output != digitalOutputChannels.cend(); ++output) { if (info->digitalOutputIndices.count(*output) > 0) { const int index = info->digitalOutputIndices[*output]; SURGSIM_ASSERT(index >= 0) << "LabJackScaffold: A LabJackDevice was configured with line " << *output << " set to digital output, but the scaffold does not know the correct index into the NamedData. " << " Make sure there is an entry in the booleans with the correct string key."; bool value; if (outputData.booleans().get(index, &value)) { const double valueToSend = (value ? 1.0 : 0.0); const LJ_ERROR error = AddRequest(rawHandle, LJ_ioPUT_DIGITAL_BIT, *output, valueToSend, 0, 0); SURGSIM_LOG_IF(!isOk(error), m_logger, WARNING) << "Failed to set digital output for a device named '" << info->deviceObject->getName() << "', line number " << *output << ", value " << valueToSend << "." << std::endl << formatErrorMessage(error); } } } // Request to set to timers (e.g., resetting firmware counters). const std::unordered_set& timerOutputChannels = info->timerOutputChannels; for (auto timer = timerOutputChannels.cbegin(); timer != timerOutputChannels.cend(); ++timer) { if (info->timerOutputIndices.count(*timer) > 0) { const int index = info->timerOutputIndices[*timer]; // We do not ensure that all the timers can be output to, because the user might not need to reset them. if (index >= 0) { double value; if (outputData.scalars().get(index, &value)) { const LJ_ERROR error = AddRequest(rawHandle, LJ_ioPUT_TIMER_VALUE, *timer, value, 0, 0); SURGSIM_LOG_IF(!isOk(error), m_logger, WARNING) << "Failed to set timer value for a device named '" << info->deviceObject->getName() << "', channel number " << *timer << ", value " << value << "." << std::endl << formatErrorMessage(error); } } } } // Request inputs from timers. const std::unordered_set& timerInputChannels = info->timerInputChannels; for (auto timer = timerInputChannels.cbegin(); timer != timerInputChannels.cend(); ++timer) { const LJ_ERROR error = AddRequest(rawHandle, LJ_ioGET_TIMER, *timer, 0, 0, 0); SURGSIM_LOG_IF(!isOk(error), m_logger, WARNING) << "Failed to request timer input for a device named '" << info->deviceObject->getName() << "', channel number " << *timer << "." << std::endl << formatErrorMessage(error); } // Request the values of analog inputs. auto const& analogInputs = info->analogInputs; for (auto input = analogInputs.cbegin(); input != analogInputs.cend(); ++input) { if (input->second.negativeChannel.hasValue()) { const LJ_ERROR error = AddRequest(rawHandle, LJ_ioGET_AIN_DIFF, input->first, 0, input->second.negativeChannel.getValue(), 0); SURGSIM_LOG_IF(!isOk(error), m_logger, WARNING) << "Failed to request differential analog input for a device named '" << info->deviceObject->getName() << "', positive channel " << input->first << ", negative channel " << input->second.negativeChannel.getValue() << "." << std::endl << formatErrorMessage(error); } else { const LJ_ERROR error = AddRequest(rawHandle, LJ_ioGET_AIN, input->first, 0, 0, 0); SURGSIM_LOG_IF(!isOk(error), m_logger, WARNING) << "Failed to request single-ended analog input for a device named '" << info->deviceObject->getName() << "', channel " << input->first << "." << std::endl << formatErrorMessage(error); } } // Request to set analog outputs. const std::unordered_set& analogOutputChannels = info->analogOutputChannels; for (auto output = analogOutputChannels.cbegin(); output != analogOutputChannels.cend(); ++output) { if (info->analogOutputIndices.count(*output) > 0) { const int index = info->analogOutputIndices[*output]; SURGSIM_ASSERT(index >= 0) << "LabJackScaffold: A LabJackDevice was configured with line " << *output << " set to analog output, but the scaffold does not know the correct index into the NamedData. " << " Make sure there is an entry in the scalars with the correct string key."; double value; if (outputData.scalars().get(index, &value)) { const LJ_ERROR error = AddRequest(rawHandle, LJ_ioPUT_DAC, *output, value, 0, 0); SURGSIM_LOG_IF(!isOk(error), m_logger, WARNING) << "Failed to set analog output for a device named '" << info->deviceObject->getName() << "', line number " << *output << ", value " << value << "." << std::endl << formatErrorMessage(error); } } } // GoOne, telling this specific LabJack to perform the requests. const LJ_ERROR error = GoOne(rawHandle); // Finally we get the results. SurgSim::DataStructures::DataGroup& inputData = info->deviceObject->getInputData(); if (isOk(error)) { // Digital inputs. for (auto input = digitalInputChannels.cbegin(); input != digitalInputChannels.cend(); ++input) { double value; const LJ_ERROR error = GetResult(rawHandle, LJ_ioGET_DIGITAL_BIT, *input, &value); if (isOk(error)) { const bool valueToSet = value > 0.5 ? true : false; inputData.booleans().set(info->digitalInputIndices[*input], valueToSet); } else { SURGSIM_LOG_WARNING(m_logger) << "Failed to get digital input for a device named '" << info->deviceObject->getName() << "', line number " << *input << "." << std::endl << formatErrorMessage(error); inputData.booleans().reset(info->digitalInputIndices[*input]); } } // Timer inputs. for (auto timer = timerInputChannels.cbegin(); timer != timerInputChannels.cend(); ++timer) { double value; const LJ_ERROR error = GetResult(rawHandle, LJ_ioGET_TIMER, *timer, &value); if (isOk(error)) { inputData.scalars().set(info->timerInputIndices[*timer], value); } else { SURGSIM_LOG_WARNING(m_logger) << "Failed to get timer input for a device named '" << info->deviceObject->getName() << "', channel number " << *timer << "." << std::endl << formatErrorMessage(error); inputData.scalars().reset(info->timerInputIndices[*timer]); } } // Analog inputs. for (auto input = analogInputs.cbegin(); input != analogInputs.cend(); ++input) { double value; if (input->second.negativeChannel.hasValue()) { const LJ_ERROR error = GetResult(rawHandle, LJ_ioGET_AIN_DIFF, input->first, &value); if (isOk(error)) { inputData.scalars().set(info->analogInputIndices[input->first], value); } else { SURGSIM_LOG_WARNING(m_logger) << "Failed to get differential analog input for a device named '" << info->deviceObject->getName() << "', positive channel " << input->first << ", negative channel " << input->second.negativeChannel.getValue() << "." << std::endl << formatErrorMessage(error); inputData.scalars().reset(info->analogInputIndices[input->first]); } } else { const LJ_ERROR error = GetResult(rawHandle, LJ_ioGET_AIN, input->first, &value); if (isOk(error)) { inputData.scalars().set(info->analogInputIndices[input->first], value); } else { SURGSIM_LOG_WARNING(m_logger) << "Failed to get single-ended analog input for a device named '" << info->deviceObject->getName() << "', channel " << input->first << "." << std::endl << formatErrorMessage(error); inputData.scalars().reset(info->analogInputIndices[input->first]); } } } } else { SURGSIM_LOG_WARNING(m_logger) << "Failed to submit requests for a device named '" << info->deviceObject->getName() << "." << std::endl << formatErrorMessage(error); inputData.resetAll(); } return true; } SurgSim::DataStructures::DataGroup LabJackScaffold::buildDeviceInputData() { SurgSim::DataStructures::DataGroupBuilder builder; // We don't know which input lines we need until after the configuration, but LabJackDevice must be constructed with // a valid DataGroup, so we add every possible line. const int maxDigitalInputs = 23; // The UE9 can have 23 digital inputs. for (int i = 0; i < maxDigitalInputs; ++i) { builder.addBoolean(SurgSim::DataStructures::Names::DIGITAL_INPUT_PREFIX + std::to_string(i)); } const int maxTimerInputs = 6; // The UE9 can have 6 timers. for (int i = 0; i < maxTimerInputs; ++i) { builder.addScalar(SurgSim::DataStructures::Names::TIMER_INPUT_PREFIX + std::to_string(i)); } const int maxAnalogInputs = 16; // The U3 can have 16 analog inputs. for (int i = 0; i < maxAnalogInputs; ++i) { builder.addScalar(SurgSim::DataStructures::Names::ANALOG_INPUT_PREFIX + std::to_string(i)); } return builder.createData(); } std::shared_ptr LabJackScaffold::getOrCreateSharedInstance() { static SurgSim::Framework::SharedInstance sharedInstance; return sharedInstance.get(); } void LabJackScaffold::configureDevice(DeviceData* deviceData) { LJ_HANDLE rawHandle = deviceData->deviceHandle->get(); // Reset the configuration. LJ_ERROR error = ePut(rawHandle, LJ_ioPIN_CONFIGURATION_RESET, 0, 0, 0); bool result = isOk(error); SURGSIM_LOG_IF(!result, m_logger, SEVERE) << "Failed to reset configuration for a device named '" << deviceData->deviceObject->getName() << "." << std::endl << formatErrorMessage(error); deviceData->configured = result && configureClockAndTimers(deviceData) && configureDigital(deviceData) && configureAnalog(deviceData); } bool LabJackScaffold::configureClockAndTimers(DeviceData* deviceData) { bool result = configureNumberOfTimers(deviceData); if (result && (deviceData->deviceObject->getTimers().size() > 0)) { result = configureClock(deviceData) && configureTimers(deviceData); } return result; } bool LabJackScaffold::configureNumberOfTimers(DeviceData* deviceData) { LabJackDevice* device = deviceData->deviceObject; LJ_HANDLE rawHandle = deviceData->deviceHandle->get(); const std::unordered_map& timers = device->getTimers(); for (auto timer : timers) { SURGSIM_LOG_IF(timer.first >= static_cast(timers.size()), m_logger, SEVERE) << "Error configuring enabled timers for a device named '" << device->getName() << "', with number of timers: " << timers.size() << "." << std::endl << " Timers must be enabled consecutively, starting with #0." << std::endl << " With the currently enabled number of timers, the highest allowable timer is #" << timers.size() - 1 << ", but one of the enabled timers is #" << timer.first << "." << std::endl; } LJ_ERROR error = ePut(rawHandle, LJ_ioPUT_CONFIG, LJ_chNUMBER_TIMERS_ENABLED, static_cast(timers.size()), 0); bool result = isOk(error); SURGSIM_LOG_IF(!isOk(error), m_logger, SEVERE) << "Failed to configure number of enabled timers for a device named '" << device->getName() << "', with number of timers " << timers.size() << "." << std::endl << formatErrorMessage(error); // Counters are not yet supported so they are explicitly disabled. const int numberOfChannels = 2; // The LabJack U3, U6, and UE9 models each have two counters. for (int channel = 0; channel < numberOfChannels; ++channel) { const int enable = 0; // Disable both counters. const LJ_ERROR error = ePut(rawHandle, LJ_ioPUT_COUNTER_ENABLE, channel, enable, 0); result = result && isOk(error); SURGSIM_LOG_IF(!isOk(error), m_logger, SEVERE) << "Failed to enable/disable counter for a device named '" << device->getName() << "." << std::endl << formatErrorMessage(error); } error = ePut(rawHandle, LJ_ioPUT_CONFIG, LJ_chTIMER_COUNTER_PIN_OFFSET, device->getTimerCounterPinOffset(), 0); result = result && isOk(error); SURGSIM_LOG_IF(!isOk(error), m_logger, SEVERE) << "Failed to configure timer/counter pin offset for a device named '" << device->getName() << "', with offset " << device->getTimerCounterPinOffset() << "." << std::endl << formatErrorMessage(error); return result; } bool LabJackScaffold::configureClock(DeviceData* deviceData) { LabJackDevice* device = deviceData->deviceObject; LJ_HANDLE rawHandle = deviceData->deviceHandle->get(); LabJack::TimerBase base = device->getTimerBase(); if (base == LabJack::TIMERBASE_DEFAULT) { LabJackDefaults defaults; base = defaults.timerBase[device->getModel()]; } LJ_ERROR error = ePut(rawHandle, LJ_ioPUT_CONFIG, LJ_chTIMER_CLOCK_BASE, base, 0); bool result = isOk(error); SURGSIM_LOG_IF(!isOk(error), m_logger, SEVERE) << "Failed to configure the timer base rate for a device named '" << device->getName() << "', with timer base " << device->getTimerBase() << "." << std::endl << formatErrorMessage(error); error = ePut(rawHandle, LJ_ioPUT_CONFIG, LJ_chTIMER_CLOCK_DIVISOR, device->getTimerClockDivisor(), 0); result = result && isOk(error); SURGSIM_LOG_IF(!isOk(error), m_logger, SEVERE) << "Failed to configure the timer/clock divisor for a device named '" << device->getName() << "', with divisor " << device->getTimerClockDivisor() << "." << std::endl << formatErrorMessage(error); return result; } bool LabJackScaffold::configureTimers(DeviceData* deviceData) { LabJackDevice* device = deviceData->deviceObject; LJ_HANDLE rawHandle = deviceData->deviceHandle->get(); bool result = true; const std::unordered_map& timers = device->getTimers(); for (auto timer = timers.cbegin(); timer != timers.cend(); ++timer) { LJ_ERROR error = AddRequest(rawHandle, LJ_ioPUT_TIMER_MODE, timer->first, timer->second.mode, 0, 0); result = result && isOk(error); SURGSIM_LOG_IF(!isOk(error), m_logger, SEVERE) << "Failed to configure a timer for a device named '" << device->getName() << "', timer number " << timer->first << ", with mode code " << timer->second.mode << "." << std::endl << formatErrorMessage(error); if (result && (timer->second.initialValue.hasValue())) { error = AddRequest(rawHandle, LJ_ioPUT_TIMER_VALUE, timer->first, timer->second.initialValue.getValue(), 0, 0); result = result && isOk(error); SURGSIM_LOG_IF(!result, m_logger, SEVERE) << "Failed to set the initial value for a timer for a device named '" << device->getName() << "', timer number " << timer->first << ", with mode code " << timer->second.mode << ", and value " << timer->second.initialValue.getValue() << "." << std::endl << formatErrorMessage(error); } if (result) { error = GoOne(rawHandle); result = result && isOk(error); double value; error = GetResult(rawHandle, LJ_ioPUT_TIMER_MODE, timer->first, &value); result = result && isOk(error); if (result && timer->second.initialValue.hasValue()) { error = GetResult(rawHandle, LJ_ioPUT_TIMER_VALUE, timer->first, &value); result = result && isOk(error); } SURGSIM_LOG_IF(!result, m_logger, SEVERE) << "Failed to configure timer for a device named '" << device->getName() << "', timer number " << timer->first << ", with mode code " << timer->second.mode << "." << std::endl << formatErrorMessage(error); } } return result; } bool LabJackScaffold::configureAnalog(DeviceData* deviceData) { LabJackDevice* device = deviceData->deviceObject; LJ_HANDLE rawHandle = deviceData->deviceHandle->get(); bool result = true; const std::unordered_set& analogOutputs = deviceData->analogOutputChannels; for (auto output = analogOutputs.cbegin(); output != analogOutputs.cend(); ++output) { LJ_ERROR error = ePut(rawHandle, LJ_ioPUT_DAC_ENABLE, *output, 1, 0); result = result && isOk(error); SURGSIM_LOG_IF(!isOk(error), m_logger, SEVERE) << "Failed to enable analog output for a device named '" << device->getName() << "', channel " << *output << "." << std::endl << formatErrorMessage(error); } auto const& analogInputs = deviceData->analogInputs; if (analogInputs.size() > 0) { LJ_ERROR error = ePut(rawHandle, LJ_ioPUT_CONFIG, LJ_chAIN_RESOLUTION, device->getAnalogInputResolution(), 0); result = result && isOk(error); SURGSIM_LOG_IF(!isOk(error), m_logger, SEVERE) << "Failed to configure analog input resolution for a device named '" << device->getName() << "', with resolution code " << device->getAnalogInputResolution() << "." << std::endl << formatErrorMessage(error); error = ePut(rawHandle, LJ_ioPUT_CONFIG, LJ_chAIN_SETTLING_TIME, device->getAnalogInputSettling(), 0); result = result && isOk(error); SURGSIM_LOG_IF(!isOk(error), m_logger, SEVERE) << "Failed to configure analog input settling time for a device named '" << device->getName() << "', with settling time code " << device->getAnalogInputSettling() << "." << std::endl << formatErrorMessage(error); for (auto input = analogInputs.cbegin(); input != analogInputs.cend(); ++input) { error = ePut(rawHandle, LJ_ioPUT_ANALOG_ENABLE_BIT, input->first, 1, 0); result = result && isOk(error); SURGSIM_LOG_IF(!isOk(error), m_logger, SEVERE) << "Failed to enable analog input for a device named '" << device->getName() << "', channel " << input->first << "." << std::endl << formatErrorMessage(error); error = ePut(rawHandle, LJ_ioPUT_AIN_RANGE, input->first, input->second.range, 0); result = result && isOk(error); SURGSIM_LOG_IF(!isOk(error), m_logger, SEVERE) << "Failed to set the range for an analog input for a device named '" << device->getName() << "', channel " << input->first << ", with range code " << input->second.range << "." << std::endl << formatErrorMessage(error); } } return result; } bool LabJackScaffold::configureDigital(DeviceData* deviceData) { return true; } }; // namespace Devices }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Devices/Leap/000077500000000000000000000000001277777236100177505ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Devices/Leap/CMakeLists.txt000066400000000000000000000025561277777236100225200ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2013-2015, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. find_package(LeapSdk REQUIRED) include_directories(SYSTEM ${LEAPSDK_INCLUDE_DIR} ) set(LIBS SurgSimDataStructures SurgSimFramework SurgSimInput ${LEAPSDK_LIBRARY} ) set(LEAP_DEVICE_SOURCES LeapDevice.cpp LeapScaffold.cpp LeapUtilities.cpp ) set(LEAP_DEVICE_HEADERS LeapDevice.h LeapScaffold.h LeapUtilities.h ) set(DEVICE_HEADERS ${DEVICE_HEADERS} Leap/LeapDevice.h Leap/LeapUtilities.h PARENT_SCOPE) surgsim_add_library( LeapDevice "${LEAP_DEVICE_SOURCES}" "${LEAP_DEVICE_HEADERS}" ) target_link_libraries(LeapDevice ${LIBS}) if(BUILD_TESTING) add_subdirectory(UnitTests) if(GLUT_FOUND) add_subdirectory(VisualTest) endif(GLUT_FOUND) endif() set_target_properties(LeapDevice PROPERTIES FOLDER "Devices") opensurgsim-0.7.0/SurgSim/Devices/Leap/Leap.dox000066400000000000000000000011101277777236100213360ustar00rootroot00000000000000/*! \page Leap Leap: Leap Motion Hand Tracking Cameras This adds support for
Leap Motion hand tracking cameras. Dependencies ------------ Leap Motion SDK: The SDK is available for Windows and GNU/Linux on Leap Motion's Developer website. To build OpenSurgSim with Leap Motion support, create a LEAPSDK_DIR environment variable that points to the location of the LeapSDK directory. This directory should include the 'include' and 'lib' directories. Also, in CMake enable BUILD_DEVICE_LEAP. */ opensurgsim-0.7.0/SurgSim/Devices/Leap/LeapDevice.cpp000066400000000000000000000063471277777236100224670ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Devices/Leap/LeapDevice.h" #include #include "SurgSim/Devices/Leap/LeapScaffold.h" #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Framework/Log.h" namespace SurgSim { namespace Devices { SURGSIM_REGISTER(SurgSim::Input::DeviceInterface, SurgSim::Devices::LeapDevice, LeapDevice); LeapDevice::LeapDevice(const std::string& name) : Input::CommonDevice(name, LeapScaffold::buildDeviceInputData()), m_handType(HANDTYPE_RIGHT), m_isProvidingImages(false) { SURGSIM_ADD_SERIALIZABLE_PROPERTY(LeapDevice, bool, UseHmdTrackingMode, isUsingHmdTrackingMode, setUseHmdTrackingMode); SURGSIM_ADD_SERIALIZABLE_PROPERTY(LeapDevice, bool, ProvideImages, isProvidingImages, setProvideImages); SURGSIM_ADD_SERIALIZABLE_PROPERTY(LeapDevice, SurgSim::Devices::HandType, HandType, getHandType, setHandType); } LeapDevice::~LeapDevice() { if (isInitialized()) { finalize(); } } void LeapDevice::setHandType(HandType type) { m_handType = type; } HandType LeapDevice::getHandType() const { return m_handType; } void LeapDevice::setUseHmdTrackingMode(bool useHmdTrackingMode) { if (isInitialized()) { m_scaffold->setUseHmdTrackingMode(useHmdTrackingMode); } m_requestedHmdTrackingMode = useHmdTrackingMode; } bool LeapDevice::isUsingHmdTrackingMode() const { if (isInitialized()) { return m_scaffold->isUsingHmdTrackingMode(); } else { return m_requestedHmdTrackingMode.getValue(); } } void LeapDevice::setProvideImages(bool produceImages) { SURGSIM_ASSERT(!isInitialized()) << "Cannot call setProvideImages after LeapDevice is initialized"; m_isProvidingImages = produceImages; } bool LeapDevice::isProvidingImages() const { return m_isProvidingImages; } bool LeapDevice::initialize() { SURGSIM_ASSERT(!isInitialized()) << getName() << "is already initialized, cannot initialize again."; auto scaffold = LeapScaffold::getOrCreateSharedInstance(); SURGSIM_ASSERT(scaffold != nullptr) << getName() << " initialization failed, cannot get scaffold."; bool registered = false; if (scaffold->registerDevice(this)) { if (m_requestedHmdTrackingMode.hasValue()) { scaffold->setUseHmdTrackingMode(m_requestedHmdTrackingMode.getValue()); } m_scaffold = std::move(scaffold); registered = true; } return registered; } bool LeapDevice::finalize() { SURGSIM_ASSERT(isInitialized()) << getName() << " is not initialized, cannot finalize."; bool success = m_scaffold->unregisterDevice(this); m_scaffold.reset(); return success; } bool LeapDevice::isInitialized() const { return (m_scaffold != nullptr); } }; // namespace Devices }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Devices/Leap/LeapDevice.h000066400000000000000000000120521277777236100221220ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DEVICES_LEAP_LEAPDEVICE_H #define SURGSIM_DEVICES_LEAP_LEAPDEVICE_H #include #include "SurgSim/DataStructures/OptionalValue.h" #include "SurgSim/Input/CommonDevice.h" namespace SurgSim { namespace Devices { class LeapScaffold; SURGSIM_STATIC_REGISTRATION(LeapDevice); enum HandType : SURGSIM_ENUM_TYPE; /// A class implementing the communication with one hand tracked by Leap Motion camera /// /// \par Application input provided by the device: /// | type | name | | /// | ---- | ---- | --- | /// | image | "left" | Left infrared image, each pixel value is between 0 and 1. | /// | image | "right" | Right infrared image, each pixel value is between 0 and 1. | /// | image | "left_distortion" | Left distortion calibration map | /// | image | "right_distortion" | Right distortion calibration map | /// | pose | "pose" | %Hand pose | /// | pose | "ThumbProximal" | %Pose of thumb proximal joint | /// | pose | "ThumbIntermediate" | %Pose of thumb intermediate joint | /// | pose | "ThumbDistal" | %Pose of thumb distal joint | /// | pose | "IndexFingerProximal" | %Pose of index finger proximal joint | /// | pose | "IndexFingerIntermediate" | %Pose of index finger intermediate joint | /// | pose | "IndexFingerDistal" | %Pose of index finger distal joint | /// | pose | "MiddleFingerProximal" | %Pose of middle finger proximal joint | /// | pose | "MiddleFingerIntermediate" | %Pose of middle finger intermediate joint | /// | pose | "MiddleFingerDistal" | %Pose of middle finger distal joint | /// | pose | "RingFingerProximal" | %Pose of ring finger proximal joint | /// | pose | "RingFingerIntermediate" | %Pose of ring finger intermediate joint | /// | pose | "RingFingerDistal" | %Pose of ring finger distal joint | /// | pose | "SmallFingerProximal" | %Pose of small finger proximal joint | /// | pose | "SmallFingerIntermediate" | %Pose of small finger intermediate joint | /// | pose | "SmallFingerDistal" | %Pose of small finger distal joint | /// /// \par Application output used by the device: none. /// /// \sa SurgSim::Devices::LeapScaffold class LeapDevice : public SurgSim::Input::CommonDevice { public: /// Constructor. /// \param name A unique name for the device that will be used by the application. explicit LeapDevice(const std::string& name); SURGSIM_CLASSNAME(SurgSim::Devices::LeapDevice); /// Destructor. virtual ~LeapDevice(); /// Set the type of hand /// \param type The hand type, either HANDTYPE_LEFT or HANDTYPE_RIGHT void setHandType(HandType type); /// Get the type of hand /// \return The hand type, either HANDTYPE_LEFT or HANDTYPE_RIGHT HandType getHandType() const; /// Set the hand tracking mode to HMD /// This is a global setting that optimizes hand tracking based on the Leap camera /// placement. The default is desktop mode, where the camera is placed /// face up on a desktop. Use Hmd mode when the camera is attached to /// the front of a head mounted display. /// \param useHmdTrackingMode True if Hmd tracking mode is to be used void setUseHmdTrackingMode(bool useHmdTrackingMode); /// Is Using HMD Tracking Mode /// \return True is HMD Tracking Mode is on bool isUsingHmdTrackingMode() const; /// Set if the device should provide the stereo infrared images /// \param provideImages True if providing images void setProvideImages(bool provideImages); /// Get if the device should provide the stereo infrared images /// \return True if providing images bool isProvidingImages() const; bool initialize() override; bool isInitialized() const override; private: friend class LeapScaffold; bool finalize() override; std::shared_ptr m_scaffold; HandType m_handType; /// Tracking mode DataStructures::OptionalValue m_requestedHmdTrackingMode; /// Request Camera Images mode bool m_isProvidingImages; }; }; }; SURGSIM_SERIALIZABLE_ENUM(SurgSim::Devices::HandType, (HANDTYPE_LEFT)(HANDTYPE_RIGHT)); #endif //SURGSIM_DEVICES_LEAP_LEAPDEVICE_H opensurgsim-0.7.0/SurgSim/Devices/Leap/LeapScaffold.cpp000066400000000000000000000322311277777236100230000ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Devices/Leap/LeapScaffold.h" #include #include #include #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/DataStructures/DataGroupBuilder.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Framework/SharedInstance.h" #include "SurgSim/Math/Matrix.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Vector.h" using SurgSim::Math::RigidTransform3d; namespace { RigidTransform3d makeRigidTransform(const Leap::Matrix& rotation, const Leap::Vector& translation, bool isRightHanded = true) { Leap::Matrix matrix = rotation; if (!isRightHanded) { matrix.zBasis *= -1.0; } // Convert milimeters to meters matrix.origin = translation * 0.001f; SurgSim::Math::Matrix44d transform; matrix.toArray4x4(transform.data()); return RigidTransform3d(transform.transpose()); } void updateDataGroup(const Leap::Hand& hand, SurgSim::DataStructures::DataGroup* inputData) { static const std::array fingerNames = {"Thumb", "IndexFinger", "MiddleFinger", "RingFinger", "SmallFinger"}; static const std::array boneNames = {"Metacarpal", "Proximal", "Intermediate", "Distal"}; inputData->poses().set("pose", makeRigidTransform(hand.basis(), hand.palmPosition(), hand.isRight())); std::string name; const Leap::FingerList fingers = hand.fingers(); for (const Leap::Finger& finger : fingers) { for (int boneType = Leap::Bone::TYPE_PROXIMAL; boneType <= Leap::Bone::TYPE_DISTAL; ++boneType) { Leap::Bone bone = finger.bone(static_cast(boneType)); name = fingerNames[finger.type()] + boneNames[boneType]; inputData->poses().set(name, makeRigidTransform(bone.basis(), bone.prevJoint(), hand.isRight())); inputData->scalars().set(name + "Length", bone.length() / 1000.0); inputData->scalars().set(name + "Width", bone.width() / 1000.0); } } } }; namespace SurgSim { namespace Devices { class LeapScaffold::Listener : public Leap::Listener { public: Listener() : m_scaffold(LeapScaffold::getOrCreateSharedInstance()), m_logger(Framework::Logger::getLogger("Devices/Leap")) { } void onConnect(const Leap::Controller&) override { SURGSIM_LOG_INFO(m_logger) << "Connected to Leap Motion camera"; auto scaffold = m_scaffold.lock(); if (scaffold != nullptr) { scaffold->handleConnect(); } } void onDisconnect(const Leap::Controller&) override { SURGSIM_LOG_INFO(m_logger) << "Diconnected from Leap Motion camera"; } void onFrame(const Leap::Controller&) override { auto scaffold = m_scaffold.lock(); if (scaffold != nullptr) { scaffold->handleFrame(); } } private: std::weak_ptr m_scaffold; std::shared_ptr m_logger; }; struct LeapScaffold::DeviceData { explicit DeviceData(LeapDevice* device) : deviceObject(device), handId(std::numeric_limits::quiet_NaN()) { } /// The corresponding device object. LeapDevice* const deviceObject; /// A unique id for the hand, assigned by the Leap SDK int32_t handId; }; struct LeapScaffold::StateData { // The SDK's interface to a single Leap Motion Camera Leap::Controller controller; /// A listener that receives updates from the Leap SDK std::unique_ptr listener; /// The list of known devices. std::list> activeDevices; /// The mutex that protects the list of known devices. boost::mutex mutex; }; LeapScaffold::LeapScaffold() : m_state(new StateData), m_logger(Framework::Logger::getLogger("Devices/Leap")) { } LeapScaffold::~LeapScaffold() { if (m_state->listener != nullptr) { m_state->controller.removeListener(*m_state->listener); } } bool LeapScaffold::registerDevice(LeapDevice* device) { bool success = true; boost::lock_guard lock(m_state->mutex); const std::string deviceName = device->getName(); auto sameName = [&deviceName](const std::unique_ptr& info) { return info->deviceObject->getName() == deviceName; }; auto found = std::find_if(m_state->activeDevices.cbegin(), m_state->activeDevices.cend(), sameName); if (found == m_state->activeDevices.end()) { std::unique_ptr info(new DeviceData(device)); success = doRegisterDevice(info.get()); if (success) { SURGSIM_LOG_INFO(m_logger) << "Device " << device->getName() << ": Registered"; m_state->activeDevices.emplace_back(std::move(info)); } else { SURGSIM_LOG_SEVERE(m_logger) << "Device " << device->getName() << ": Not registered"; } } else { SURGSIM_LOG_SEVERE(m_logger) << "Tried to register a device when the same name, '" << device->getName() << "', is already present!"; success = false; } return success; } bool LeapScaffold::doRegisterDevice(DeviceData* info) { if (m_state->listener == nullptr) { m_state->listener = std::unique_ptr(new Listener); m_state->controller.addListener(*m_state->listener); } if (info->deviceObject->isProvidingImages()) { m_state->controller.setPolicy(Leap::Controller::PolicyFlag::POLICY_IMAGES); } return true; } bool LeapScaffold::unregisterDevice(const LeapDevice* device) { bool success = true; boost::lock_guard lock(m_state->mutex); auto& devices = m_state->activeDevices; if (device->isProvidingImages()) { auto providingImages = [](const std::unique_ptr& info) { return info->deviceObject->isProvidingImages(); }; if (std::find_if(devices.begin(), devices.end(), providingImages) == devices.end()) { m_state->controller.clearPolicy(Leap::Controller::PolicyFlag::POLICY_IMAGES); } } auto sameDevice = [device](const std::unique_ptr& info) { return info->deviceObject == device; }; auto info = std::find_if(devices.begin(), devices.end(), sameDevice); if (info != devices.end()) { devices.erase(info); SURGSIM_LOG_INFO(m_logger) << "Device " << device->getName() << ": Unregistered"; } else { SURGSIM_LOG_SEVERE(m_logger) << "Attempted to release a non-registered device named '" << device->getName() << "."; success = false; } return success; } void LeapScaffold::handleConnect() { m_state->controller.setPolicy(Leap::Controller::PolicyFlag::POLICY_BACKGROUND_FRAMES); for (auto& device : m_state->activeDevices) { if (device->deviceObject->isProvidingImages()) { m_state->controller.setPolicy(Leap::Controller::PolicyFlag::POLICY_IMAGES); break; } } } void LeapScaffold::handleFrame() { updateHandData(); updateImageData(); for (auto& device : m_state->activeDevices) { device->deviceObject->pushInput(); } } void LeapScaffold::updateHandData() { std::list unassignedDevices; for (auto& device : m_state->activeDevices) { unassignedDevices.push_back(device.get()); } std::list newHands; Leap::HandList hands = m_state->controller.frame().hands(); for (auto hand = hands.begin(); hand != hands.end(); ++hand) { auto sameHandId = [hand](const std::unique_ptr& info) { return info->handId == (*hand).id(); }; auto assignedDevice = std::find_if(m_state->activeDevices.begin(), m_state->activeDevices.end(), sameHandId); if (assignedDevice != m_state->activeDevices.end()) { updateDataGroup(*hand, &(*assignedDevice)->deviceObject->getInputData()); unassignedDevices.remove(assignedDevice->get()); } else { newHands.push_back(hand); } } static auto higherConfidence = [](const Leap::HandList::const_iterator &a, const Leap::HandList::const_iterator &b) { return (*a).confidence() > (*b).confidence(); }; newHands.sort(higherConfidence); for (auto& newHand : newHands) { auto sameHandType = [newHand](DeviceData* info) { return (info->deviceObject->getHandType() == HANDTYPE_LEFT) == (*newHand).isLeft(); }; auto unassignedDevice = std::find_if(unassignedDevices.begin(), unassignedDevices.end(), sameHandType); if (unassignedDevice != unassignedDevices.end()) { (*unassignedDevice)->handId = (*newHand).id(); updateDataGroup(*newHand, &(*unassignedDevice)->deviceObject->getInputData()); unassignedDevices.remove(*unassignedDevice); } } for(auto& unassignedDevice : unassignedDevices) { unassignedDevice->deviceObject->getInputData().poses().resetAll(); } } void LeapScaffold::updateImageData() { Leap::ImageList images = m_state->controller.frame().images(); if (!images.isEmpty()) { typedef DataStructures::DataGroup::ImageType ImageType; ImageType leftImage(images[0].width(), images[0].height(), 1, images[0].data()); ImageType rightImage(images[1].width(), images[1].height(), 1, images[1].data()); ImageType leftDistortion(images[0].distortionWidth() / 2, images[0].distortionHeight(), 2, images[0].distortion()); ImageType rightDistortion(images[1].distortionWidth() / 2, images[1].distortionHeight(), 2, images[1].distortion()); // scale values to 0..1 leftImage.getAsVector() *= (1.0f / 255.0f); rightImage.getAsVector() *= (1.0f / 255.0f); for (auto& device : m_state->activeDevices) { if (device->deviceObject->isProvidingImages()) { device->deviceObject->getInputData().images().set("left", leftImage); device->deviceObject->getInputData().images().set("right", rightImage); device->deviceObject->getInputData().images().set("left_distortion", leftDistortion); device->deviceObject->getInputData().images().set("right_distortion", rightDistortion); } else { device->deviceObject->getInputData().images().resetAll(); } } } else { for (auto& device : m_state->activeDevices) { device->deviceObject->getInputData().images().resetAll(); } } } std::shared_ptr LeapScaffold::getOrCreateSharedInstance() { static auto creator = []() { return std::shared_ptr(new LeapScaffold); }; static Framework::SharedInstance sharedInstance(creator); return sharedInstance.get(); } DataStructures::DataGroup LeapScaffold::buildDeviceInputData() { DataStructures::DataGroupBuilder builder; builder.addImage("left"); builder.addImage("right"); builder.addImage("left_distortion"); builder.addImage("right_distortion"); builder.addPose("pose"); builder.addPose("ThumbProximal"); builder.addPose("ThumbIntermediate"); builder.addPose("ThumbDistal"); builder.addPose("IndexFingerProximal"); builder.addPose("IndexFingerIntermediate"); builder.addPose("IndexFingerDistal"); builder.addPose("MiddleFingerProximal"); builder.addPose("MiddleFingerIntermediate"); builder.addPose("MiddleFingerDistal"); builder.addPose("RingFingerProximal"); builder.addPose("RingFingerIntermediate"); builder.addPose("RingFingerDistal"); builder.addPose("SmallFingerProximal"); builder.addPose("SmallFingerIntermediate"); builder.addPose("SmallFingerDistal"); builder.addScalar("ThumbProximalWidth"); builder.addScalar("ThumbIntermediateWidth"); builder.addScalar("ThumbDistalWidth"); builder.addScalar("IndexFingerProximalWidth"); builder.addScalar("IndexFingerIntermediateWidth"); builder.addScalar("IndexFingerDistalWidth"); builder.addScalar("MiddleFingerProximalWidth"); builder.addScalar("MiddleFingerIntermediateWidth"); builder.addScalar("MiddleFingerDistalWidth"); builder.addScalar("RingFingerProximalWidth"); builder.addScalar("RingFingerIntermediateWidth"); builder.addScalar("RingFingerDistalWidth"); builder.addScalar("SmallFingerProximalWidth"); builder.addScalar("SmallFingerIntermediateWidth"); builder.addScalar("SmallFingerDistalWidth"); builder.addScalar("ThumbProximalLength"); builder.addScalar("ThumbIntermediateLength"); builder.addScalar("ThumbDistalLength"); builder.addScalar("IndexFingerProximalLength"); builder.addScalar("IndexFingerIntermediateLength"); builder.addScalar("IndexFingerDistalLength"); builder.addScalar("MiddleFingerProximalLength"); builder.addScalar("MiddleFingerIntermediateLength"); builder.addScalar("MiddleFingerDistalLength"); builder.addScalar("RingFingerProximalLength"); builder.addScalar("RingFingerIntermediateLength"); builder.addScalar("RingFingerDistalLength"); builder.addScalar("SmallFingerProximalLength"); builder.addScalar("SmallFingerIntermediateLength"); builder.addScalar("SmallFingerDistalLength"); return builder.createData(); } void LeapScaffold::setUseHmdTrackingMode(bool useHmdTrackingMode) { if (useHmdTrackingMode) { m_state->controller.setPolicy(Leap::Controller::PolicyFlag::POLICY_OPTIMIZE_HMD); } else { m_state->controller.clearPolicy(Leap::Controller::PolicyFlag::POLICY_OPTIMIZE_HMD); } } bool LeapScaffold::isUsingHmdTrackingMode() const { return m_state->controller.isPolicySet(Leap::Controller::PolicyFlag::POLICY_OPTIMIZE_HMD); } }; // namespace Devices }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Devices/Leap/LeapScaffold.h000066400000000000000000000060021277777236100224420ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DEVICES_LEAP_LEAPSCAFFOLD_H #define SURGSIM_DEVICES_LEAP_LEAPSCAFFOLD_H #include #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/Devices/Leap/LeapDevice.h" namespace SurgSim { namespace Framework { class Logger; }; namespace Devices { class LeapDevice; /// A class that manages Leap devices /// /// \sa SurgSim::Devices::LeapDevice class LeapScaffold { public: /// Destructor. virtual ~LeapScaffold(); private: /// Internal shared state data type. struct StateData; /// Internal per-device information. struct DeviceData; /// Class for receiving data from the Leap SDK class Listener; friend class LeapDevice; /// Constructor. LeapScaffold(); /// Gets or creates the scaffold shared by all LeapDevice instances. /// The scaffold is managed using a SharedInstance object, so it will be destroyed when all devices are released. /// \return the scaffold object. static std::shared_ptr getOrCreateSharedInstance(); /// Registers the specified device object. /// \param device The device object to be used /// \return True if the initialization succeeds, false if it fails. bool registerDevice(LeapDevice* device); /// Unregisters the specified device object. /// \param device The device object. /// \return true on success, false on failure. bool unregisterDevice(const LeapDevice* device); /// Do the Leap specific registration /// \param info The device data /// \return true on success, false on failure. bool doRegisterDevice(DeviceData* info); /// Handle a new frame of data void handleFrame(); /// Handle initial connection to SDK void handleConnect(); /// Update the hand data void updateHandData(); /// Update the image data void updateImageData(); /// Builds the data layout for the application input (i.e. device output). static DataStructures::DataGroup buildDeviceInputData(); /// Internal scaffold state. std::unique_ptr m_state; /// Set using HMD Tracking Mode /// \param useHmdTrackingMode True if using HMD Tracking Mode void setUseHmdTrackingMode(bool useHmdTrackingMode); /// Is Using HMD Tracking Mode /// \return True if using HMD Tracking Mode bool isUsingHmdTrackingMode() const; /// Logger used by the scaffold std::shared_ptr m_logger; }; }; // namespace Devices }; // namespace SurgSim #endif // SURGSIM_DEVICES_LEAP_LEAPSCAFFOLD_H opensurgsim-0.7.0/SurgSim/Devices/Leap/LeapUtilities.cpp000066400000000000000000000045141277777236100232350ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Devices/Leap/LeapUtilities.h" namespace SurgSim { namespace Devices { DataStructures::DataGroup::ImageType undistortLeapImage(const DataStructures::DataGroup::ImageType& image, const DataStructures::DataGroup::ImageType& distortion) { DataStructures::DataGroup::ImageType result(image.getWidth(), image.getHeight(), image.getNumChannels()); Eigen::Array2f distortionPosition; Eigen::Array2f weights; Eigen::Array2f size(result.getWidth(), result.getHeight()); Eigen::Array2i corner; Eigen::RowVector2f preMultiply; Eigen::Vector2f postMultiply; Eigen::Array2f position; // Undistort the images using the Leap distortion map. // See Image::distortion() documentation for reference implementation: // https://developer.leapmotion.com/documentation/cpp/api/Leap.Image.html for (size_t i = 0; i < result.getWidth(); i++) { for (size_t j = 0; j < result.getHeight(); j++) { distortionPosition << 63 * i / size[0], 62 * (1 - j / size[1]); corner = distortionPosition.template cast(); // Bilinear interpolation weights = distortionPosition - distortionPosition.unaryExpr(std::ptr_fun(std::floor)); preMultiply << 1 - weights[0], weights[0]; postMultiply << 1 - weights[1], weights[1]; position << preMultiply * distortion.getChannel(0).block<2, 2>(corner[0], corner[1]) * postMultiply, preMultiply * distortion.getChannel(1).block<2, 2>(corner[0], corner[1]) * postMultiply; if ((position >= 0).all() && (position <= 1.0).all()) { position *= size; result(i, j) = image(static_cast(position[0]), static_cast(position[1])); } else { result(i, j).setConstant(0); } } } return result; } }; }; opensurgsim-0.7.0/SurgSim/Devices/Leap/LeapUtilities.h000066400000000000000000000024041277777236100226760ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DEVICES_LEAP_LEAPUTILITIES_H #define SURGSIM_DEVICES_LEAP_LEAPUTILITIES_H #include "SurgSim/DataStructures/DataGroup.h" namespace SurgSim { namespace Devices { /// Correct an infrared image from the LeapDevice, given its distortion callibration map /// \param image The distorted infrared image /// \param distortion The distortion callibration map /// \return The corrected infrared image DataStructures::DataGroup::ImageType undistortLeapImage(const DataStructures::DataGroup::ImageType& image, const DataStructures::DataGroup::ImageType& distortion); }; }; #endif //SURGSIM_DEVICES_LEAP_LEAPUTILITIES_H opensurgsim-0.7.0/SurgSim/Devices/Leap/UnitTests/000077500000000000000000000000001277777236100217125ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Devices/Leap/UnitTests/CMakeLists.txt000066400000000000000000000016111277777236100244510ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. include_directories( ${gtest_SOURCE_DIR}/include ) set(UNIT_TEST_SOURCES LeapDeviceTest.cpp ) set(LIBS LeapDevice SurgSimDataStructures SurgSimInput ) surgsim_add_unit_tests(LeapDeviceTest) set_target_properties(LeapDeviceTest PROPERTIES FOLDER "Devices") opensurgsim-0.7.0/SurgSim/Devices/Leap/UnitTests/LeapDeviceTest.cpp000066400000000000000000000225041277777236100252620ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the LeapDevice class. #include #include #include #include #include #include "SurgSim/Devices/Leap/LeapDevice.h" #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/Testing/MockInputOutput.h" using SurgSim::Devices::LeapDevice; using SurgSim::DataStructures::DataGroup; using SurgSim::Testing::MockInputOutput; namespace SurgSim { namespace Devices { TEST(LeapDeviceTest, CreateUninitializedDevice) { std::shared_ptr device; ASSERT_NO_THROW({ device = std::make_shared("TestLeap"); }); ASSERT_TRUE(device != nullptr) << "Device creation failed."; } TEST(LeapDeviceTest, CreateAndInitializeDevice) { std::shared_ptr device = std::make_shared("TestLeap"); ASSERT_TRUE(device != nullptr) << "Device creation failed."; EXPECT_FALSE(device->isInitialized()); ASSERT_TRUE(device->initialize()) << "Initialization failed. Is a Leap device plugged in?"; EXPECT_TRUE(device->isInitialized()); } TEST(LeapDeviceTest, Name) { std::shared_ptr device = std::make_shared("TestLeap"); ASSERT_TRUE(device != nullptr) << "Device creation failed."; EXPECT_EQ("TestLeap", device->getName()); EXPECT_TRUE(device->initialize()) << "Initialization failed. Is a Leap device plugged in?"; EXPECT_EQ("TestLeap", device->getName()); } TEST(LeapDeviceTest, HandType) { std::shared_ptr device = std::make_shared("TestLeap"); ASSERT_TRUE(device != nullptr) << "Device creation failed."; EXPECT_EQ(HANDTYPE_RIGHT, device->getHandType()); device->setHandType(HANDTYPE_LEFT); EXPECT_EQ(HANDTYPE_LEFT, device->getHandType()); device->setHandType(HANDTYPE_RIGHT); EXPECT_EQ(HANDTYPE_RIGHT, device->getHandType()); } TEST(LeapDeviceTest, TrackingMode) { { std::shared_ptr device = std::make_shared("TestLeap"); EXPECT_THROW(device->isUsingHmdTrackingMode(), Framework::AssertionFailure) << "TrackingMode not previously set, nor device initialized, should not be able to determine tracking mode"; } { std::shared_ptr device = std::make_shared("TestLeap"); ASSERT_TRUE(device->initialize()) << "Initialization failed. Is a Leap device plugged in?"; EXPECT_FALSE(device->isUsingHmdTrackingMode()) << "HMD Tracking should be off by default."; } { std::shared_ptr device = std::make_shared("TestLeap"); device->setUseHmdTrackingMode(true); EXPECT_TRUE(device->isUsingHmdTrackingMode()); ASSERT_TRUE(device->initialize()) << "Initialization failed. Is a Leap device plugged in?"; boost::this_thread::sleep_until(boost::chrono::steady_clock::now() + boost::chrono::milliseconds(100)); EXPECT_TRUE(device->isUsingHmdTrackingMode()) << "HMD Tracking Mode not set. This could be do to user settings in the LeapControlPanel." << std::endl << "Disable 'Auto-orient Tracking' in Settings>>Tracking."; } } TEST(LeapDeviceTest, ProvidingImages) { std::shared_ptr device = std::make_shared("TestLeap"); ASSERT_TRUE(device != nullptr) << "Device creation failed."; EXPECT_FALSE(device->isProvidingImages()); device->setProvideImages(true); EXPECT_TRUE(device->isProvidingImages()); EXPECT_FALSE(device->isInitialized()); ASSERT_TRUE(device->initialize()) << "Initialization failed. Is a Leap device plugged in?"; EXPECT_TRUE(device->isInitialized()); EXPECT_THROW(device->setProvideImages(true), Framework::AssertionFailure); } TEST(LeapDeviceTest, CreateDevicesWithSameName) { std::shared_ptr device1 = std::make_shared("TestLeap"); ASSERT_TRUE(device1 != nullptr) << "Device creation failed."; ASSERT_TRUE(device1->initialize()) << "Initialization failed. Is a Leap device plugged in?"; std::shared_ptr device2 = std::make_shared("TestLeap"); ASSERT_TRUE(device2 != nullptr) << "Device creation failed."; ASSERT_FALSE(device2->initialize()) << "Initialization succeeded despite duplicate name."; } TEST(LeapDeviceTest, InputConsumer) { std::shared_ptr device = std::make_shared("TestLeap"); ASSERT_TRUE(device != nullptr) << "Device creation failed."; ASSERT_TRUE(device->initialize()) << "Initialization failed. Is a Leap device plugged in?"; std::shared_ptr consumer = std::make_shared(); EXPECT_EQ(0, consumer->m_numTimesInitializedInput); EXPECT_EQ(0, consumer->m_numTimesReceivedInput); EXPECT_FALSE(device->removeInputConsumer(consumer)); EXPECT_EQ(0, consumer->m_numTimesInitializedInput); EXPECT_EQ(0, consumer->m_numTimesReceivedInput); EXPECT_TRUE(device->addInputConsumer(consumer)); // Adding the same input consumer again should fail. EXPECT_FALSE(device->addInputConsumer(consumer)); // Sleep for a second, to see how many times the consumer is invoked. boost::this_thread::sleep_until(boost::chrono::steady_clock::now() + boost::chrono::milliseconds(1000)); EXPECT_TRUE(device->removeInputConsumer(consumer)); // Removing the same input consumer again should fail. EXPECT_FALSE(device->removeInputConsumer(consumer)); // Check the number of invocations. EXPECT_EQ(1, consumer->m_numTimesInitializedInput); EXPECT_GE(consumer->m_numTimesReceivedInput, 5); EXPECT_LE(consumer->m_numTimesReceivedInput, 120); EXPECT_TRUE(consumer->m_lastReceivedInput.images().hasEntry("left")); EXPECT_TRUE(consumer->m_lastReceivedInput.images().hasEntry("left_distortion")); EXPECT_TRUE(consumer->m_lastReceivedInput.images().hasEntry("right")); EXPECT_TRUE(consumer->m_lastReceivedInput.images().hasEntry("right_distortion")); EXPECT_TRUE(consumer->m_lastReceivedInput.poses().hasEntry("pose")); EXPECT_TRUE(consumer->m_lastReceivedInput.poses().hasEntry("ThumbProximal")); EXPECT_TRUE(consumer->m_lastReceivedInput.poses().hasEntry("ThumbIntermediate")); EXPECT_TRUE(consumer->m_lastReceivedInput.poses().hasEntry("ThumbDistal")); EXPECT_TRUE(consumer->m_lastReceivedInput.poses().hasEntry("IndexFingerProximal")); EXPECT_TRUE(consumer->m_lastReceivedInput.poses().hasEntry("IndexFingerIntermediate")); EXPECT_TRUE(consumer->m_lastReceivedInput.poses().hasEntry("IndexFingerDistal")); EXPECT_TRUE(consumer->m_lastReceivedInput.poses().hasEntry("MiddleFingerProximal")); EXPECT_TRUE(consumer->m_lastReceivedInput.poses().hasEntry("MiddleFingerIntermediate")); EXPECT_TRUE(consumer->m_lastReceivedInput.poses().hasEntry("MiddleFingerDistal")); EXPECT_TRUE(consumer->m_lastReceivedInput.poses().hasEntry("RingFingerProximal")); EXPECT_TRUE(consumer->m_lastReceivedInput.poses().hasEntry("RingFingerIntermediate")); EXPECT_TRUE(consumer->m_lastReceivedInput.poses().hasEntry("RingFingerDistal")); EXPECT_TRUE(consumer->m_lastReceivedInput.poses().hasEntry("SmallFingerProximal")); EXPECT_TRUE(consumer->m_lastReceivedInput.poses().hasEntry("SmallFingerIntermediate")); EXPECT_TRUE(consumer->m_lastReceivedInput.poses().hasEntry("SmallFingerDistal")); } TEST(LeapDeviceTest, OutputProducer) { std::shared_ptr device = std::make_shared("TestLeap"); ASSERT_TRUE(device != nullptr) << "Device creation failed."; ASSERT_TRUE(device->initialize()) << "Initialization failed. Is a Leap device plugged in?"; std::shared_ptr producer = std::make_shared(); EXPECT_EQ(0, producer->m_numTimesRequestedOutput); EXPECT_FALSE(device->removeOutputProducer(producer)); EXPECT_EQ(0, producer->m_numTimesRequestedOutput); EXPECT_TRUE(device->setOutputProducer(producer)); // Sleep for a second, to see how many times the producer is invoked. boost::this_thread::sleep_until(boost::chrono::steady_clock::now() + boost::chrono::milliseconds(1000)); EXPECT_TRUE(device->removeOutputProducer(producer)); // Removing the same input producer again should fail. EXPECT_FALSE(device->removeOutputProducer(producer)); // Check the number of invocations. EXPECT_EQ(0, producer->m_numTimesRequestedOutput); } TEST(LeapDeviceTest, FactoryCreation) { std::shared_ptr device; ASSERT_NO_THROW(device = Input::DeviceInterface::getFactory().create("SurgSim::Devices::LeapDevice", "TestLeap")); EXPECT_EQ("SurgSim::Devices::LeapDevice", device->getClassName()); } TEST(LeapDeviceTest, AccessibleTest) { std::shared_ptr device = std::make_shared("TestLeap"); EXPECT_EQ(HANDTYPE_RIGHT, device->getValue("HandType")); device->setValue("HandType", HANDTYPE_LEFT); EXPECT_EQ(HANDTYPE_LEFT, device->getValue("HandType")); EXPECT_EQ(HANDTYPE_LEFT, device->getHandType()); EXPECT_NO_THROW(device->setValue("HandType", HANDTYPE_RIGHT)); EXPECT_EQ(HANDTYPE_RIGHT, device->getValue("HandType")); EXPECT_EQ(HANDTYPE_RIGHT, device->getHandType()); } }; }; opensurgsim-0.7.0/SurgSim/Devices/Leap/VisualTest/000077500000000000000000000000001277777236100220535ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Devices/Leap/VisualTest/CMakeLists.txt000066400000000000000000000017651277777236100246240ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. include_directories( "${GLUT_INCLUDE_DIR}" ) set(EXAMPLE_SOURCES main.cpp ) set(EXAMPLE_HEADERS ) surgsim_add_executable(LeapVisualTest "${EXAMPLE_SOURCES}" "${EXAMPLE_HEADERS}") set(LIBS LeapDevice SurgSimInput VisualTestCommon ${GLUT_LIBRARIES} ) target_link_libraries(LeapVisualTest ${LIBS}) set_target_properties(LeapVisualTest PROPERTIES FOLDER "Devices") opensurgsim-0.7.0/SurgSim/Devices/Leap/VisualTest/main.cpp000066400000000000000000000106471277777236100235130ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/Devices/Leap/LeapDevice.h" #include "SurgSim/Devices/Leap/LeapUtilities.h" #include "SurgSim/Input/DeviceInterface.h" #include "SurgSim/Input/InputConsumerInterface.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Testing/VisualTestCommon/GlutRenderer.h" using SurgSim::Input::DeviceInterface; using SurgSim::Devices::LeapDevice; using SurgSim::Math::Vector2d; using SurgSim::Math::Vector3d; class GlutWindow : public SurgSim::Input::InputConsumerInterface { public: GlutWindow() : m_numHands(0) { m_camera = std::make_shared(Vector3d(0.0, -1.0, 0.0), Vector3d(0.0, 0.0, 0.0), Vector3d(0.0, 0.0, -1.0), 45.0, 0.001, 2.0); GlutRenderer::setCamera(m_camera); m_leftView = std::make_shared( Eigen::AlignedBox(Vector2d(-0.7, -0.9), Vector2d(-0.3, -0.5))); m_rightView = std::make_shared( Eigen::AlignedBox(Vector2d(0.3, -0.9), Vector2d(0.7, -0.5))); GlutRenderer::addObject(m_leftView); GlutRenderer::addObject(m_rightView); m_renderThread = boost::thread(boost::ref(GlutRenderer::run)); } ~GlutWindow() { if (m_renderThread.joinable()) { m_renderThread.join(); } } void initializeInput(const std::string& device, const SurgSim::DataStructures::DataGroup& inputData) override { m_numHands++; for (size_t i = 0; i < inputData.poses().size(); i++) { auto sphere = std::make_shared(0.010, Vector3d::Unit(m_numHands % 3)); GlutRenderer::addObject(sphere); m_spheres.insert(std::make_pair(device + inputData.poses().getName(i), sphere)); } } void handleInput(const std::string& device, const SurgSim::DataStructures::DataGroup& inputData) override { SurgSim::Math::RigidTransform3d pose; for (size_t i = 0; i < inputData.poses().size(); i++) { inputData.poses().get(i, &pose); m_spheres[device + inputData.poses().getName(i)]->pose = pose; } SurgSim::DataStructures::DataGroup::ImageType image; SurgSim::DataStructures::DataGroup::ImageType distortion; if (inputData.images().get("left", &image) && inputData.images().get("left_distortion", &distortion)) { image = SurgSim::Devices::undistortLeapImage(image, distortion); m_leftView->image.set(std::move(image)); } if (inputData.images().get("right", &image) && inputData.images().get("right_distortion", &distortion)) { image = SurgSim::Devices::undistortLeapImage(image, distortion); m_rightView->image.set(std::move(image)); } } private: boost::thread m_renderThread; std::shared_ptr m_camera; size_t m_numHands; std::unordered_map> m_spheres; std::shared_ptr m_leftView; std::shared_ptr m_rightView; }; int main(int argc, char** argv) { auto leftHand = std::make_shared("Left Hand"); leftHand->setHandType(SurgSim::Devices::HANDTYPE_LEFT); leftHand->setProvideImages(true); leftHand->initialize(); auto rightHand = std::make_shared("Right Hand"); rightHand->setHandType(SurgSim::Devices::HANDTYPE_RIGHT); rightHand->initialize(); std::shared_ptr window = std::make_shared(); leftHand->addInputConsumer(window); rightHand->addInputConsumer(window); std::cout << std::endl << "**********************************************************************" << std::endl << "Leap Visual Test" << std::endl << std::endl << "When done, press Enter to quit the application." << std::endl << "**********************************************************************" << std::endl; getc(stdin); std::cout << "Exiting..." << std::endl; leftHand->removeInputConsumer(window); rightHand->removeInputConsumer(window); exit(0); } opensurgsim-0.7.0/SurgSim/Devices/Mouse/000077500000000000000000000000001277777236100201575ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Devices/Mouse/CMakeLists.txt000066400000000000000000000025771277777236100227320ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. include_directories( "${CMAKE_CURRENT_SOURCE_DIR}" "${OPENSCENEGRAPH_INCLUDE_DIR}" ) set(MOUSE_DEVICE_SOURCES MouseDevice.cpp MouseScaffold.cpp OsgMouseHandler.cpp ) set(MOUSE_DEVICE_HEADERS MouseDevice.h MouseScaffold.h OsgMouseHandler.h ) set(DEVICE_HEADERS ${DEVICE_HEADERS} Mouse/MouseDevice.h PARENT_SCOPE) surgsim_add_library( MouseDevice "${MOUSE_DEVICE_SOURCES}" "${MOUSE_DEVICE_HEADERS}" ) set(LIBS SurgSimInput ${OPENSCENEGRAPH_LIBRARIES} ) target_link_libraries(MouseDevice ${LIBS} ) if(BUILD_TESTING) # The unit tests will be built whenever the library is built. add_subdirectory(UnitTests) add_subdirectory(VisualTests) endif() # Put MouseDevice into folder "Devices" set_target_properties(MouseDevice PROPERTIES FOLDER "Devices") opensurgsim-0.7.0/SurgSim/Devices/Mouse/MouseDevice.cpp000066400000000000000000000037131277777236100230770ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Devices/Mouse/MouseDevice.h" #include "SurgSim/Devices/Mouse/MouseScaffold.h" #include "SurgSim/Devices/Mouse/OsgMouseHandler.h" #include "SurgSim/Framework/Log.h" namespace SurgSim { namespace Devices { SURGSIM_REGISTER(SurgSim::Input::DeviceInterface, SurgSim::Devices::MouseDevice, MouseDevice); MouseDevice::MouseDevice(const std::string& deviceName) : SurgSim::Input::CommonDevice(deviceName, MouseScaffold::buildDeviceInputData()) { } MouseDevice::~MouseDevice() { if (isInitialized()) { finalize(); } } bool MouseDevice::initialize() { SURGSIM_ASSERT(!isInitialized()) << getName() << " already initialized."; auto scaffold = MouseScaffold::getOrCreateSharedInstance(); SURGSIM_ASSERT(scaffold != nullptr); bool registered = false; if (scaffold->registerDevice(this)) { m_scaffold = std::move(scaffold); registered = true; } return registered; } bool MouseDevice::finalize() { SURGSIM_ASSERT(isInitialized()) << getName() << " is not initialized, cannot finalize."; bool unregistered = m_scaffold->unregisterDevice(); m_scaffold.reset(); return unregistered; } bool MouseDevice::isInitialized() const { return (m_scaffold != nullptr); } OsgMouseHandler* MouseDevice::getMouseHandler() const { return m_scaffold->getMouseHandler(); } }; // namespace Devices }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Devices/Mouse/MouseDevice.h000066400000000000000000000054301277777236100225420ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DEVICES_MOUSE_MOUSEDEVICE_H #define SURGSIM_DEVICES_MOUSE_MOUSEDEVICE_H #include "SurgSim/Input/CommonDevice.h" #include #include namespace SurgSim { namespace Devices { class MouseScaffold; class OsgMouseHandler; SURGSIM_STATIC_REGISTRATION(MouseDevice); /// A class implementing the communication with a mouse /// /// \par Application input provided from the device: /// | type | name | | /// | ---- | ---- | --- | /// | bool | "button1" | %State of mouse left button | /// | bool | "button2" | %State of mouse middle button | /// | bool | "button3" | %State of mouse right button | /// | scalar | "x" | %X-coordinate of mouse | /// | scalar | "y" | %Y-coordinate of mouse | /// | int | "scrollDeltaX" | %Indicates vertical movement direction of mouse wheel | /// | int | "scrollDeltaY" | %Indicates horizontal movement direction of mouse wheel | /// /// \par Application output used by the device: /// NONE /// /// \note Mouse wheel movement will be indicated by +1/-1 (scroll up/down, right/left) followed by a 0. /// /// \sa SurgSim::Input::CommonDevice, SurgSim::Input::DeviceInterface class MouseDevice : public SurgSim::Input::CommonDevice { friend class MouseScaffold; friend class MouseDeviceTest; public: /// Constructor /// \param deviceName Name for mouse device explicit MouseDevice(const std::string& deviceName); SURGSIM_CLASSNAME(SurgSim::Devices::MouseDevice); /// Destructor virtual ~MouseDevice(); bool initialize() override; bool isInitialized() const override; /// Get mouse handler /// \return The mouse handler associated with this device OsgMouseHandler* getMouseHandler() const; private: bool finalize() override; /// Communication with hardware is handled by scaffold. std::shared_ptr m_scaffold; }; }; // namespace Devices }; // namespace SurgSim #endif //SURGSIM_DEVICES_MOUSE_MOUSEDEVICE_Hopensurgsim-0.7.0/SurgSim/Devices/Mouse/MouseScaffold.cpp000066400000000000000000000114561277777236100234240ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Devices/Mouse/MouseScaffold.h" #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/DataStructures/DataGroupBuilder.h" #include "SurgSim/Devices/Mouse/MouseDevice.h" #include "SurgSim/Devices/Mouse/OsgMouseHandler.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Framework/SharedInstance.h" namespace SurgSim { namespace Devices { using SurgSim::DataStructures::DataGroup; using SurgSim::DataStructures::DataGroupBuilder; /// Struct to hold a MouseDevice object, a OsgMouseHandler, and a mutex for data passing. struct MouseScaffold::DeviceData { /// Constructor /// \param device Device to be managed by this scaffold explicit DeviceData(MouseDevice* device) : deviceObject(device) { mouseHandler = new OsgMouseHandler(); } /// Device object managed by this scaffold. MouseDevice* const deviceObject; /// Mouse Handler to communicate with underneath API. osg::ref_ptr mouseHandler; /// The mutex that protects the externally modifiable parameters. boost::mutex mutex; private: // Prevent copy construction and copy assignment. (VS2012 does not support "= delete" yet.) DeviceData(const DeviceData&) /*= delete*/; DeviceData& operator=(const DeviceData&) /*= delete*/; }; MouseScaffold::MouseScaffold() : m_logger(Framework::Logger::getLogger("Devices/Mouse")) { SURGSIM_LOG_DEBUG(m_logger) << "Shared scaffold created."; } MouseScaffold::~MouseScaffold() { if (m_device != nullptr) { unregisterDevice(); } SURGSIM_LOG_DEBUG(m_logger) << "Shared scaffold destroyed."; } bool MouseScaffold::registerDevice(MouseDevice* device) { SURGSIM_ASSERT(m_device == nullptr) << "Can't register two Mouse devices."; m_device.reset(new DeviceData(device)); if (nullptr == m_device) { SURGSIM_LOG_CRITICAL(m_logger) << "Failed to create a DeviceData for " << device->getName(); return false; } SURGSIM_LOG_INFO(m_logger) << "Device " << device->getName() << " registered."; return true; } bool MouseScaffold::unregisterDevice() { m_device.reset(); SURGSIM_LOG_DEBUG(m_logger) << "Unregistered device."; return true; } bool MouseScaffold::updateDevice(int buttonMask, float x, float y, int scrollDeltaX, int scrollDeltaY) { boost::lock_guard lock(m_device->mutex); SurgSim::DataStructures::DataGroup& inputData = m_device->deviceObject->getInputData(); inputData.booleans().set(SurgSim::DataStructures::Names::BUTTON_1, (buttonMask & osgGA::GUIEventAdapter::LEFT_MOUSE_BUTTON) != 0); inputData.booleans().set(SurgSim::DataStructures::Names::BUTTON_2, (buttonMask & osgGA::GUIEventAdapter::MIDDLE_MOUSE_BUTTON) != 0); inputData.booleans().set(SurgSim::DataStructures::Names::BUTTON_3, (buttonMask & osgGA::GUIEventAdapter::RIGHT_MOUSE_BUTTON) != 0); inputData.scalars().set("x", static_cast(x)); inputData.scalars().set("y", static_cast(y)); inputData.integers().set("scrollDeltaX", scrollDeltaX); inputData.integers().set("scrollDeltaY", scrollDeltaY); m_device->deviceObject->pushInput(); return true; } OsgMouseHandler* MouseScaffold::getMouseHandler() const { return m_device->mouseHandler.get(); } /// Builds the data layout for the application input (i.e. device output). SurgSim::DataStructures::DataGroup MouseScaffold::buildDeviceInputData() { DataGroupBuilder builder; builder.addBoolean(SurgSim::DataStructures::Names::BUTTON_1); // Indicates mouse left button builder.addBoolean(SurgSim::DataStructures::Names::BUTTON_2); // Indicates mouse middle button (i.e. wheel) builder.addBoolean(SurgSim::DataStructures::Names::BUTTON_3); // Indicates mouse right button builder.addScalar("x"); // Indicates mouse's X-coordinate in the current window, left bottom = (0, 0) builder.addScalar("y"); // Indicates mouse's Y-coordinate in the current window, left bottom = (0, 0) builder.addInteger("scrollDeltaX"); // Indicates mouse wheel vertical movement builder.addInteger("scrollDeltaY"); // Indicates mouse wheel horizontal movement return builder.createData(); } std::shared_ptr MouseScaffold::getOrCreateSharedInstance() { static SurgSim::Framework::SharedInstance sharedInstance; return sharedInstance.get(); } }; // namespace Devices }; // namespace SurgSimopensurgsim-0.7.0/SurgSim/Devices/Mouse/MouseScaffold.h000066400000000000000000000060461277777236100230700ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DEVICES_MOUSE_MOUSESCAFFOLD_H #define SURGSIM_DEVICES_MOUSE_MOUSESCAFFOLD_H #include #include "SurgSim/Framework/Logger.h" namespace SurgSim { namespace DataStructures { class DataGroup; } namespace Devices { class MouseDevice; class OsgMouseHandler; /// A class that implements the behavior of MouseDevice objects. /// \sa SurgSim::Devices::MouseDevice class MouseScaffold { friend class MouseDevice; friend class MouseDeviceTest; friend class OsgMouseHandler; public: /// Constructor. MouseScaffold(); /// Destructor ~MouseScaffold(); /// Gets or creates the scaffold shared by all MouseDevice instances. /// The scaffold is managed using a SharedInstance object, so it will be destroyed when all devices are released. /// \return the scaffold object. static std::shared_ptr getOrCreateSharedInstance(); private: /// Internal per-device information. struct DeviceData; /// Registers the specified device object. /// If successful, the device object will become connected to an hardware device. /// \param device The device object to be used, which should have a unique name. /// \return True if the initialization succeeds, false if it fails. bool registerDevice(MouseDevice* device); /// Unregisters the specified device object. /// The corresponding controller will become unused, and can be re-registered later. /// \return True on success, false on failure. bool unregisterDevice(); /// Updates the device information for a single device. /// \param buttons Buttons being pressed. /// \param x X-Coordinate for the device. /// \param y Y-Coordinate for the device. /// \param scrollDeltaX Horizontal indicator for mouse wheel. /// \param scrollDeltaY Vertical indicator for mouse wheel. /// \return True on success. bool updateDevice(int buttons, float x, float y, int scrollDeltaX, int scrollDeltaY); /// Get mouse handler /// \return The mouse handler associated with this device OsgMouseHandler* getMouseHandler() const; /// Builds the data layout for the application input (i.e. device output). static SurgSim::DataStructures::DataGroup buildDeviceInputData(); /// Logger used by the scaffold and all devices. std::shared_ptr m_logger; /// The mouse device managed by this scaffold std::unique_ptr m_device; }; }; // namespace Devices }; // namespace SurgSim #endif // SURGSIM_DEVICES_MOUSE_MOUSESCAFFOLD_H opensurgsim-0.7.0/SurgSim/Devices/Mouse/OsgMouseHandler.cpp000066400000000000000000000042131277777236100237220ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Devices/Mouse/OsgMouseHandler.h" #include "SurgSim/Devices/Mouse/MouseScaffold.h" namespace SurgSim { namespace Devices { OsgMouseHandler::OsgMouseHandler() : m_mouseScaffold(MouseScaffold::getOrCreateSharedInstance()), m_lastX(0.0), m_lastY(0.0), m_lastButtonMask(0), m_lastScrollX(0), m_lastScrollY(0) { } bool OsgMouseHandler::handle(const osgGA::GUIEventAdapter& eventHandler, osgGA::GUIActionAdapter&) { int scrollX = 0, scrollY = 0; if (eventHandler.getEventType() == osgGA::GUIEventAdapter::EventType::SCROLL) { switch(eventHandler.getScrollingMotion()) { case(osgGA::GUIEventAdapter::SCROLL_UP) : { scrollY = 1; break; } case(osgGA::GUIEventAdapter::SCROLL_DOWN) : { scrollY = -1; break; } case(osgGA::GUIEventAdapter::SCROLL_LEFT) : { scrollX = -1; break; } case(osgGA::GUIEventAdapter::SCROLL_RIGHT) : { scrollX = 1; break; } default: break; } } // Any mouse state change will cause an update if( eventHandler.getX() != m_lastX || eventHandler.getY() != m_lastY || eventHandler.getButtonMask() != m_lastButtonMask || m_lastScrollX != scrollX || m_lastScrollY != scrollY) { m_lastX = eventHandler.getX(); m_lastY = eventHandler.getY(); m_lastButtonMask = eventHandler.getButtonMask(); m_lastScrollX = scrollX; m_lastScrollY = scrollY; m_mouseScaffold.lock()->updateDevice(m_lastButtonMask, m_lastX, m_lastY, m_lastScrollX, m_lastScrollY); } return true; } }; // namespace Devices }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Devices/Mouse/OsgMouseHandler.h000066400000000000000000000034641277777236100233760ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DEVICES_MOUSE_OSGMOUSEHANDLER_H #define SURGSIM_DEVICES_MOUSE_OSGMOUSEHANDLER_H #include #include namespace SurgSim { namespace Devices { class MouseScaffold; class OsgMouseHandler : public osgGA::GUIEventHandler { public: /// Constructor OsgMouseHandler(); /// Method to handle GUI event /// \param eventHandler A osgGA::GUIEventAdapter /// \param actionAdapter A osgGA::GUIActionAdapter (required by this virtual method) /// \return True if the event has been handled by this method; Otherwise, false. bool handle(const osgGA::GUIEventAdapter& eventHandler, osgGA::GUIActionAdapter& actionAdapter) override; private: /// A back pointer to the scaffold which owns this handle std::weak_ptr m_mouseScaffold; /// lastX is the X-coordinate of mouse's last location /// lastY is the Y-coordinate of mouse's last location float m_lastX, m_lastY; /// Last button mask int m_lastButtonMask; /// Last direction of mouse wheel's horizontal (X) and vertical (Y) movement. int m_lastScrollX, m_lastScrollY; }; }; // namespace Devices }; // namespace SurgSim #endif // SURGSIM_DEVICES_MOUSE_OSGMOUSEHANDLER_Hopensurgsim-0.7.0/SurgSim/Devices/Mouse/UnitTests/000077500000000000000000000000001277777236100221215ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Devices/Mouse/UnitTests/CMakeLists.txt000066400000000000000000000017421277777236100246650ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2012-2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. include_directories( ${gtest_SOURCE_DIR}/include ) set(UNIT_TEST_SOURCES MouseDeviceTest.cpp MouseScaffoldTest.cpp ) set(LIBS MouseDevice SurgSimDataStructures SurgSimFramework SurgSimInput ${OPENSCENEGRAPH_LIBRARIES} ) surgsim_add_unit_tests(MouseDeviceTest) set_target_properties(MouseDeviceTest PROPERTIES FOLDER "Devices") opensurgsim-0.7.0/SurgSim/Devices/Mouse/UnitTests/MouseDeviceTest.cpp000066400000000000000000000056041277777236100257020ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the MouseDevice class. #include #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/Devices/Mouse/MouseDevice.h" #include "SurgSim/Devices/Mouse/MouseScaffold.h" #include "SurgSim/Input/InputConsumerInterface.h" #include "SurgSim/Testing/MockInputOutput.h" namespace SurgSim { namespace Devices { using SurgSim::Devices::MouseDevice; using SurgSim::DataStructures::DataGroup; using SurgSim::Testing::MockInputOutput; class MouseDeviceTest : public ::testing::Test { public: static void update(std::shared_ptr device) { device->m_scaffold->updateDevice(0, 0, 0, 0, 0); } }; TEST_F(MouseDeviceTest, InitializeDevice) { std::shared_ptr device = std::make_shared("TestMouse"); ASSERT_TRUE(device != nullptr) << "Device creation failed."; EXPECT_FALSE(device->isInitialized()); ASSERT_TRUE(device->initialize()) << "Initialization failed. Is a Mouse device plugged in?"; EXPECT_TRUE(device->isInitialized()); } TEST_F(MouseDeviceTest, InputConsumer) { std::shared_ptr device = std::make_shared("TestMouse"); device->initialize(); std::shared_ptr consumer = std::make_shared(); EXPECT_TRUE(device->addInputConsumer(consumer)); MouseDeviceTest::update(device); EXPECT_TRUE(consumer->m_lastReceivedInput.booleans().hasData(SurgSim::DataStructures::Names::BUTTON_1)); EXPECT_TRUE(consumer->m_lastReceivedInput.booleans().hasData(SurgSim::DataStructures::Names::BUTTON_2)); EXPECT_TRUE(consumer->m_lastReceivedInput.booleans().hasData(SurgSim::DataStructures::Names::BUTTON_3)); EXPECT_TRUE(consumer->m_lastReceivedInput.scalars().hasData("x")); EXPECT_TRUE(consumer->m_lastReceivedInput.scalars().hasData("y")); EXPECT_TRUE(consumer->m_lastReceivedInput.integers().hasData("scrollDeltaX")); EXPECT_TRUE(consumer->m_lastReceivedInput.integers().hasData("scrollDeltaY")); } TEST_F(MouseDeviceTest, NoTwoMice) { std::shared_ptr device1 = std::make_shared("TestMouse1"); std::shared_ptr device2 = std::make_shared("TestMouse2"); EXPECT_NO_THROW(device1->initialize()); EXPECT_ANY_THROW(device2->initialize()); } }; // namespace Devices }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Devices/Mouse/UnitTests/MouseScaffoldTest.cpp000066400000000000000000000043001277777236100262140ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the MouseScaffold class and its device interactions. #include #include "SurgSim/Devices/Mouse/MouseScaffold.h" using SurgSim::Devices::MouseScaffold; TEST(MouseScaffoldTest, CreateAndDestroyScaffold) { std::shared_ptr scaffold = MouseScaffold::getOrCreateSharedInstance(); ASSERT_TRUE(nullptr != scaffold) << "The scaffold was not created!"; std::weak_ptr scaffold1 = scaffold; { std::shared_ptr stillHaveScaffold = scaffold1.lock(); EXPECT_NE(nullptr, stillHaveScaffold) << "Unable to get scaffold from weak ref (while strong ref exists)"; EXPECT_EQ(scaffold, stillHaveScaffold) << "Scaffold mismatch!"; } { std::shared_ptr sameScaffold = MouseScaffold::getOrCreateSharedInstance(); EXPECT_NE(nullptr, sameScaffold) << "Unable to get scaffold from class"; EXPECT_EQ(scaffold, sameScaffold) << "Scaffold mismatch!"; } scaffold.reset(); { std::shared_ptr dontHaveScaffold = scaffold1.lock(); EXPECT_TRUE(nullptr == dontHaveScaffold) << "Able to get scaffold from weak ref (with no strong ref)"; } scaffold = MouseScaffold::getOrCreateSharedInstance(); ASSERT_TRUE(nullptr != scaffold) << "The scaffold was not created the 2nd time!"; std::weak_ptr scaffold2 = scaffold; { std::shared_ptr stillHaveScaffold = scaffold2.lock(); ASSERT_NE(nullptr, stillHaveScaffold) << "Unable to get scaffold from weak ref (while strong ref exists)"; ASSERT_EQ(scaffold, stillHaveScaffold) << "Scaffold mismatch!"; } }opensurgsim-0.7.0/SurgSim/Devices/Mouse/VisualTests/000077500000000000000000000000001277777236100224455ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Devices/Mouse/VisualTests/CMakeLists.txt000066400000000000000000000020451277777236100252060ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2012-2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. set(UNIT_TEST_SOURCES MouseVisualTests.cpp ) set(UNIT_TEST_HEADERS ) surgsim_add_executable(MouseVisualTest "${UNIT_TEST_SOURCES}" "${UNIT_TEST_HEADERS}") set(LIBS MouseDevice SurgSimDataStructures SurgSimInput ${OPENSCENEGRAPH_LIBRARIES} ) target_link_libraries(MouseVisualTest ${LIBS}) # Put MouseVisualTest into folder "Devices" set_target_properties(MouseVisualTest PROPERTIES FOLDER "Devices") opensurgsim-0.7.0/SurgSim/Devices/Mouse/VisualTests/MouseVisualTests.cpp000066400000000000000000000066361277777236100264630ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include #include #include #include #include #include #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/Devices/Mouse/MouseDevice.h" #include "SurgSim/Devices/Mouse/OsgMouseHandler.h" #include "SurgSim/Input/InputConsumerInterface.h" using SurgSim::DataStructures::DataGroup; struct TestListener : public SurgSim::Input::InputConsumerInterface { void initializeInput(const std::string& device, const DataGroup& inputData) override { } void handleInput(const std::string& device, const DataGroup& inputData) override { bool button1, button2, button3; double x, y; int scrollDeltaX, scrollDeltaY; if (inputData.booleans().get(SurgSim::DataStructures::Names::BUTTON_1, &button1)) { std::cerr << "button1 = " << button1 << std::endl; } if (inputData.booleans().get(SurgSim::DataStructures::Names::BUTTON_2, &button2)) { std::cerr << "button2 = " << button2 << std::endl; } if (inputData.booleans().get(SurgSim::DataStructures::Names::BUTTON_3, &button3)) { std::cerr << "button3 = " << button3 << std::endl; } if (inputData.scalars().get("x", &x)) { std::cerr << "x = " << x << std::endl; } if (inputData.scalars().get("y", &y)) { std::cerr << "y = " << y << std::endl; } if (inputData.integers().get("scrollDeltaX", &scrollDeltaX)) { std::cerr << "scrollDeltaX = " << scrollDeltaX << std::endl; } if (inputData.integers().get("scrollDeltaY", &scrollDeltaY)) { std::cerr << "scrollDeltaY = " << scrollDeltaY << std::endl; } std::cerr << std::endl; } }; int main(int argc, char* argv[]) { auto toolDevice = std::make_shared("Mouse"); toolDevice->initialize(); osg::ref_ptr mouseHandler = toolDevice->getMouseHandler(); auto consumer = std::make_shared(); toolDevice->addInputConsumer(consumer); osg::ref_ptr text = new osgText::Text; text->setText("Move/click/drag mouse in\n\nthis window to verify that\n\nmouse driver works correctly."); text->setPosition(osg::Vec3(0.0f, 300.0f, 0.0f)); osg::ref_ptr geode = new osg::Geode; geode->addDrawable(text); osg::ref_ptr camera = new osg::Camera; camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF); camera->setProjectionMatrixAsOrtho2D(0, 600, 0, 400); camera->getOrCreateStateSet()->setMode(GL_LIGHTING,osg::StateAttribute::OFF); camera->addChild(geode); osg::ref_ptr group = new osg::Group; group->addChild(camera); osg::ref_ptr viewer = new osgViewer::Viewer; viewer->setUpViewInWindow(400, 400, 640, 480); viewer->addEventHandler(mouseHandler); viewer->setSceneData(group); viewer->run(); return 0; } opensurgsim-0.7.0/SurgSim/Devices/MultiAxis/000077500000000000000000000000001277777236100210065ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Devices/MultiAxis/BitSetBuffer.h000066400000000000000000000063711277777236100235120ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DEVICES_MULTIAXIS_BITSETBUFFER_H #define SURGSIM_DEVICES_MULTIAXIS_BITSETBUFFER_H #include #include "SurgSim/Framework/Assert.h" namespace SurgSim { namespace Devices { /// A bit set corresponding to a contiguous memory buffer. /// /// A std::bitset {\em almost} does everything we need, but we need to also access the storage as bytes. /// /// The method names are generally stolen straight from std::bitset. /// /// \tparam N The number of bits in the bit set. template class BitSetBuffer { public: /// Create a bit buffer with all bits set to zero. BitSetBuffer() { reset(); } /// Create a bit buffer by copying another buffer. BitSetBuffer(const BitSetBuffer& other) : m_bytes(other.m_bytes) { } /// Copy bit buffer contents from another buffer. BitSetBuffer& operator=(const BitSetBuffer& other) { m_bytes = other.m_bytes; return *this; } /// Set all bits in the buffer to on. void set() { m_bytes.fill(~static_cast(0)); } /// Set the specified bit in the buffer to on. /// \param pos The index of the bit to turn on. void set(size_t pos) { SURGSIM_ASSERT(pos < NUM_BITS); m_bytes[pos / ELEMENT_BITS] |= (1U << (pos % ELEMENT_BITS)); } /// Reset all bits in the buffer to off. void reset() { m_bytes.fill(0); } /// Reset the specified bit in the buffer to off. /// \param pos The index of the bit to turn off. void reset(size_t pos) { SURGSIM_ASSERT(pos < NUM_BITS); m_bytes[pos / ELEMENT_BITS] &= ~(1U << (pos % ELEMENT_BITS)); } /// Get the specified bit in the buffer. /// \param pos The index of the bit to test. bool test(size_t pos) const { SURGSIM_ASSERT(pos < NUM_BITS); return ((m_bytes[pos / ELEMENT_BITS] & (1U << (pos % ELEMENT_BITS))) != 0); } /// Get a pointer to the buffer's storage. void* getPointer() { return &(m_bytes[0]); } /// Get a pointer to the buffer's storage. const void* getPointer() const { return &(m_bytes[0]); } /// Get the number of bits in the bit set. static size_t size() { return NUM_BITS; } /// Get the number of bytes in the bit set. static size_t sizeBytes() { return NUM_BYTES; } private: typedef unsigned char value_type; static const size_t ELEMENT_BYTES = sizeof(value_type); static const size_t ELEMENT_BITS = ELEMENT_BYTES * 8; static_assert(ELEMENT_BITS == 8, "An unsigned char is not 8 bits?!"); static const size_t NUM_BITS = N; static const size_t NUM_BYTES = (NUM_BITS + ELEMENT_BITS - 1) / ELEMENT_BITS; std::array m_bytes; }; }; // namespace Devices }; // namespace SurgSim #endif // SURGSIM_DEVICES_MULTIAXIS_BITSETBUFFER_H opensurgsim-0.7.0/SurgSim/Devices/MultiAxis/CMakeLists.txt000066400000000000000000000072131277777236100235510ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux") else(${CMAKE_SYSTEM_NAME} STREQUAL "Linux") find_package(WDK REQUIRED) endif(${CMAKE_SYSTEM_NAME} STREQUAL "Linux") include_directories("${CMAKE_CURRENT_SOURCE_DIR}") if(WDK_FOUND) if(WDK_CAN_BUILD_DIRECTLY) #message(STATUS "WDK does not need additional include paths; see the try_compile in FindWDK.cmake") else(WDK_CAN_BUILD_DIRECTLY) #message(STATUS "WDK was found, and needs the include directory '${WDK_INCLUDE_DIR}'.") include_directories( # This is a hack needed to get the Visual Studio includes into the # include path ahead of the WDK ones, which is needed for the WDK # 7.1.0 not to interfere with includes provided by Visual Studio. # CMake will prefix this entry by the current path, but Visual # Studio will split the path at the semicolon; the net effect is to # add $(IncludePath) to the Visual Studio include directories. # In cmake 2.8.11+, this hack generates a Policy CMP0021 warning due to relative path. ".;$(IncludePath)" # Now it's safe to add ${WDK_INCLUDE_DIR}. "${WDK_INCLUDE_DIR}" ) endif(WDK_CAN_BUILD_DIRECTLY) endif(WDK_FOUND) set(MULTIAXIS_DEVICE_SOURCES MultiAxisDevice.cpp RawMultiAxisDevice.cpp RawMultiAxisScaffold.cpp RawMultiAxisThread.cpp SystemInputDeviceHandle.cpp ) set(MULTIAXIS_DEVICE_HEADERS CreateInputDeviceHandle.h GetSystemError.h MultiAxisDevice.h RawMultiAxisDevice.h RawMultiAxisScaffold.h RawMultiAxisThread.h SystemInputDeviceHandle.h ) set(DEVICE_HEADERS ${DEVICE_HEADERS} MultiAxis/MultiAxisDevice.h #NOLINT MultiAxis/RawMultiAxisDevice.h #NOLINT PARENT_SCOPE) set(MULTIAXIS_DEVICE_LINUX_SOURCES linux/CreateInputDeviceHandle.cpp linux/FileDescriptor.cpp linux/GetSystemError.cpp linux/InputDeviceHandle.cpp ) set(MULTIAXIS_DEVICE_LINUX_HEADERS BitSetBuffer.h linux/FileDescriptor.h linux/InputDeviceHandle.h ) set(MULTIAXIS_DEVICE_WDK_HID_SOURCES win32/CreateInputDeviceHandle.cpp win32/FileHandle.cpp win32/GetSystemError.cpp win32/WdkHidDeviceHandle.cpp ) set(MULTIAXIS_DEVICE_WDK_HID_HEADERS win32/FileHandle.h win32/WdkHidDeviceHandle.h ) if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux") list(APPEND MULTIAXIS_DEVICE_SOURCES ${MULTIAXIS_DEVICE_LINUX_SOURCES}) list(APPEND MULTIAXIS_DEVICE_HEADERS ${MULTIAXIS_DEVICE_LINUX_HEADERS}) elseif(WDK_FOUND) list(APPEND MULTIAXIS_DEVICE_SOURCES ${MULTIAXIS_DEVICE_WDK_HID_SOURCES}) list(APPEND MULTIAXIS_DEVICE_HEADERS ${MULTIAXIS_DEVICE_WDK_HID_HEADERS}) endif() # TODO(advornik): the installation should NOT copy all the headers... surgsim_add_library( MultiAxisDevice "${MULTIAXIS_DEVICE_SOURCES}" "${MULTIAXIS_DEVICE_HEADERS}" ) set(LIBS SurgSimDeviceFilters SurgSimInput SurgSimFramework ) if(WDK_FOUND) list(APPEND LIBS ${WDK_LIBRARIES}) endif() target_link_libraries(MultiAxisDevice ${LIBS} ) if(BUILD_TESTING) add_subdirectory(UnitTests) if(GLUT_FOUND) add_subdirectory(VisualTest) endif(GLUT_FOUND) endif() # Put MultiAxisDevice into folder "Devices" set_target_properties(MultiAxisDevice PROPERTIES FOLDER "Devices") opensurgsim-0.7.0/SurgSim/Devices/MultiAxis/CreateInputDeviceHandle.h000066400000000000000000000032301277777236100256340ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DEVICES_MULTIAXIS_CREATEINPUTDEVICEHANDLE_H #define SURGSIM_DEVICES_MULTIAXIS_CREATEINPUTDEVICEHANDLE_H #include #include #include namespace SurgSim { namespace Framework { class Logger; }; // namespace Framework namespace Devices { class SystemInputDeviceHandle; /// Opens the given path and creates an access wrapper for the device. /// \param path Full pathname for the device. /// \param logger The logger to be used by the device. /// \return The created device object, or an empty unique_ptr on failure. std::unique_ptr createInputDeviceHandle(const std::string& path, std::shared_ptr logger); /// Enumerates input devices. /// \param logger The logger to be used during enumeration. /// \return A list of device paths. std::vector enumerateInputDevicePaths(SurgSim::Framework::Logger* logger); }; // namespace Devices }; // namespace SurgSim #endif // SURGSIM_DEVICES_MULTIAXIS_CREATEINPUTDEVICEHANDLE_H opensurgsim-0.7.0/SurgSim/Devices/MultiAxis/GetSystemError.h000066400000000000000000000031451277777236100241200ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DEVICES_MULTIAXIS_GETSYSTEMERROR_H #define SURGSIM_DEVICES_MULTIAXIS_GETSYSTEMERROR_H #include #include namespace SurgSim { namespace Devices { namespace Internal { /// Gets the most recent error code from the operating system. /// The error code will correspond to the status of the most recent failed (or, in some cases, successful) call /// to the operating system APIs from this thread. /// \return The OS-dependent system error code. int64_t getSystemErrorCode(); /// Gets the system error text corresponding to the specified error code, or the most recent error text. /// \param errorCode (Optional) The error code. If omitted, the most recent OS error code will be used. /// \return The error text corresponding to the error code. std::string getSystemErrorText(int64_t errorCode = getSystemErrorCode()); }; // namespace Internal }; // namespace Devices }; // namespace SurgSim #endif // SURGSIM_DEVICES_MULTIAXIS_GETSYSTEMERROR_H opensurgsim-0.7.0/SurgSim/Devices/MultiAxis/MultiAxis.dox000066400000000000000000000032011277777236100234350ustar00rootroot00000000000000/*! \page MultiAxis MultiAxis: 3D Mouse Device (e.g, 3Dconnexion SpaceNavigator) 3D mice (aka 3D motion controllers, 3D navigation devices, or 6 DOF devices) are input devices similar to typical computer mice, but enabling control of position and orientation. They are commonly used to operate CAD, 3D modeling, and animation applications. Supported devices: - 3Dconnexion - The SpaceNavigator is tested, other models are expected to work. Dependencies: - Linux: No requirements. - If experiencing difficulties: -# check the udev rules - By default, regular users on most Linux systems DO NOT have the permissions necessary to access the multi-axis controller devices on their system. Fortunately, the permissions that are set on those devices are usually relatively easy to configure using udev rules. - To allow all users direct access to various 3DConnexion devices, you can simply copy the rules file from the udev-rules directory into the system directory /etc/udev/rules.d. (You will need administrative privileges to do so.) For example, on many systems you can run: sudo cp SurgSim/Devices/MultiAxis/udev-rules/90-3dconnexion.rules /etc/udev/rules.d - For other devices, or to set up the privileges differently, you will need to set up your own rules file. -# try the drivers provided by 3Dconnexion http://www.3dconnexion.com/service/drivers.html - Windows: Drivers from 3Dconnexion http://www.3dconnexion.com/service/drivers.html - Visual Studio 2012+: No further requirements. - Other build tools: May require Windows Driver Kit (WDK), available from http://www.microsoft.com/en-us/default.aspx */opensurgsim-0.7.0/SurgSim/Devices/MultiAxis/MultiAxisDevice.cpp000066400000000000000000000056111277777236100245540ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Devices/MultiAxis/MultiAxisDevice.h" #include "SurgSim/Devices/MultiAxis/RawMultiAxisDevice.h" #include "SurgSim/Devices/DeviceFilters/PoseIntegrator.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Framework/Assert.h" namespace SurgSim { namespace Devices { SURGSIM_REGISTER(SurgSim::Input::DeviceInterface, SurgSim::Devices::MultiAxisDevice, MultiAxisDevice); MultiAxisDevice::MultiAxisDevice(const std::string& uniqueName) : FilteredDevice(uniqueName), m_rawDevice(std::make_shared(uniqueName + "_RawBase")), m_filter(std::make_shared(uniqueName + "_Integrator")) { m_rawDevice->setPositionScale(defaultPositionScale()); m_rawDevice->setOrientationScale(defaultOrientationScale()); m_rawDevice->setAxisDominance(true); setDevice(m_rawDevice); m_filter->setNameForCallback(uniqueName); // the filter should make callbacks as the entire device addFilter(m_filter); SURGSIM_ADD_SERIALIZABLE_PROPERTY(MultiAxisDevice, double, PositionScale, getPositionScale, setPositionScale); SURGSIM_ADD_SERIALIZABLE_PROPERTY(MultiAxisDevice, double, OrientationScale, getOrientationScale, setOrientationScale); SURGSIM_ADD_SERIALIZABLE_PROPERTY(MultiAxisDevice, bool, AxisDominance, isUsingAxisDominance, setAxisDominance); } void MultiAxisDevice::setPositionScale(double scale) { m_rawDevice->setPositionScale(scale); } double MultiAxisDevice::getPositionScale() const { return m_rawDevice->getPositionScale(); } void MultiAxisDevice::setOrientationScale(double scale) { m_rawDevice->setOrientationScale(scale); } double MultiAxisDevice::getOrientationScale() const { return m_rawDevice->getOrientationScale(); } void MultiAxisDevice::setAxisDominance(bool onOff) { m_rawDevice->setAxisDominance(onOff); } bool MultiAxisDevice::isUsingAxisDominance() const { return m_rawDevice->isUsingAxisDominance(); } double MultiAxisDevice::defaultPositionScale() { return 0.00001; // The default position scale, in meters per tick. } double MultiAxisDevice::defaultOrientationScale() { return 0.0001; // The default rotation scale, in radians per tick. } void MultiAxisDevice::setReset(const std::string& name) { m_filter->setReset(name); } }; // namespace Devices }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Devices/MultiAxis/MultiAxisDevice.h000066400000000000000000000122561277777236100242240ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DEVICES_MULTIAXIS_MULTIAXISDEVICE_H #define SURGSIM_DEVICES_MULTIAXIS_MULTIAXISDEVICE_H #include #include #include "SurgSim/Devices/DeviceFilters/FilteredDevice.h" #include "SurgSim/Input/CommonDevice.h" namespace SurgSim { namespace Devices { class RawMultiAxisDevice; class PoseIntegrator; SURGSIM_STATIC_REGISTRATION(MultiAxisDevice); /// A class implementing the communication with a multi-axis controller input device, for example a 3DConnexion /// SpaceNavigator. /// /// This object will integrate the output of the physical device, treating it as a differential device. In other /// words, holding the controller moves the pose and releasing the controller lets the pose hold steady in its /// new state. /// /// \par Application input provided by the device: /// | type | name | | /// | ---- | ---- | --- | /// | pose | "pose" | %Absolute device pose (units are ill-defined, but nominally meters). | /// | bool | "button1" | True if button 1 exists and is pressed. | /// | bool | "button2" | True if button 2 exists and is pressed. | /// | bool | "button3" | True if button 3 exists and is pressed. | /// | bool | "button4" | True if button 4 exists and is pressed. | /// /// \par Application output used by the device: /// | type | name | | /// | ---- | ---- | --- | /// | bool | "led1" | If the device has at least one LED light, controls the first one. | /// /// \sa RawMultiAxisDevice class MultiAxisDevice : public FilteredDevice { public: /// Constructor. /// \param uniqueName A unique name for the device that will be used by the application. explicit MultiAxisDevice(const std::string& uniqueName); SURGSIM_CLASSNAME(SurgSim::Devices::MultiAxisDevice); /// Sets the position scale for this device. /// The position scale controls how much the pose changes for a given device translation. /// The default value for a raw device tries to correspond to the actual physical motion of the device. void setPositionScale(double scale); /// Gets the position scale for this device. /// \return The position scale. double getPositionScale() const; /// Sets the orientation scale for this device. /// The orientation scale controls how much the pose changes for a given device rotation. /// \param scale The new scale. /// \note The default value for a raw device tries to correspond to the actual physical motion of the device. void setOrientationScale(double scale); /// Gets the orientation scale for this device. /// \return The orientation scale. double getOrientationScale() const; /// Turns on or off the axis dominance setting for this device. /// When axis dominance is on, only one (the largest) of the 6 pure axis directions is allowed to be active. /// In other words, the device will be translating in X, or in Y, or in Z, or rotating around X, or around Y, /// or around Z; but only one of those at a time. /// \param onOff Whether or not to use only the dominant axis. void setAxisDominance(bool onOff); /// Gets the axis dominance setting for this device. /// \return True if using axis dominance. bool isUsingAxisDominance() const; /// Sets the string name of the boolean entry that will reset the pose to its initial value. /// \param name The name of the NamedData entry, e.g., SurgSim::DataStructures::Names::BUTTON_1. /// \sa PoseIntegrator::setReset void setReset(const std::string& name); private: /// Get the default position scale from device ticks to meters. /// \return The default position scale, in meters per tick. static double defaultPositionScale(); /// Get the default rotation from device ticks to radians. /// \return The default rotation scale, in radians per tick. static double defaultOrientationScale(); /// The raw underlying device. std::shared_ptr m_rawDevice; /// The pose integration filter. std::shared_ptr m_filter; }; }; // namespace Devices }; // namespace SurgSim #endif // SURGSIM_DEVICES_MULTIAXIS_MULTIAXISDEVICE_H opensurgsim-0.7.0/SurgSim/Devices/MultiAxis/README.linux000066400000000000000000000013011277777236100230170ustar00rootroot00000000000000By default, regular users on most Linux systems DO NOT have the permissions necessary to access the multi-axis controller devices on their system. Fortunately, the permissions that are set on those devices are usually relatively easy to configure using udev rules. To allow all users direct access to various 3DConnexion devices, you can simply copy the rules file from the udev-rules directory into the system directory /etc/udev/rules.d. (You will need administrative privileges to do so.) For example, on many systems you can run: sudo cp udev-rules/90-3dconnexion.rules /etc/udev/rules.d For other devices, or to set up the privileges differently, you will need to set up your own rules file. opensurgsim-0.7.0/SurgSim/Devices/MultiAxis/RawMultiAxisDevice.cpp000066400000000000000000000064451277777236100252340ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Devices/MultiAxis/RawMultiAxisDevice.h" #include "SurgSim/Devices/MultiAxis/RawMultiAxisScaffold.h" #include "SurgSim/Framework/Log.h" namespace SurgSim { namespace Devices { SURGSIM_REGISTER(SurgSim::Input::DeviceInterface, SurgSim::Devices::RawMultiAxisDevice, RawMultiAxisDevice); RawMultiAxisDevice::RawMultiAxisDevice(const std::string& uniqueName) : Input::CommonDevice(uniqueName, RawMultiAxisScaffold::buildDeviceInputData()), m_positionScale(defaultPositionScale()), m_orientationScale(defaultOrientationScale()), m_useAxisDominance(false) { SURGSIM_ADD_SERIALIZABLE_PROPERTY(RawMultiAxisDevice, double, PositionScale, getPositionScale, setPositionScale); SURGSIM_ADD_SERIALIZABLE_PROPERTY(RawMultiAxisDevice, double, OrientationScale, getOrientationScale, setOrientationScale); SURGSIM_ADD_SERIALIZABLE_PROPERTY(RawMultiAxisDevice, bool, AxisDominance, isUsingAxisDominance, setAxisDominance); } RawMultiAxisDevice::~RawMultiAxisDevice() { if (isInitialized()) { finalize(); } } bool RawMultiAxisDevice::initialize() { SURGSIM_ASSERT(!isInitialized()) << getName() << " already initialized."; std::shared_ptr scaffold = RawMultiAxisScaffold::getOrCreateSharedInstance(); SURGSIM_ASSERT(scaffold); if (!scaffold->registerDevice(this)) { return false; } m_scaffold = std::move(scaffold); m_scaffold->setPositionScale(this, m_positionScale); m_scaffold->setOrientationScale(this, m_orientationScale); m_scaffold->setAxisDominance(this, m_useAxisDominance); return true; } bool RawMultiAxisDevice::finalize() { SURGSIM_ASSERT(isInitialized()) << getName() << " is not initialized, cannot finalize."; bool ok = m_scaffold->unregisterDevice(this); m_scaffold.reset(); return ok; } bool RawMultiAxisDevice::isInitialized() const { return (m_scaffold != nullptr); } void RawMultiAxisDevice::setPositionScale(double scale) { m_positionScale = scale; if (m_scaffold) { m_scaffold->setPositionScale(this, m_positionScale); } } double RawMultiAxisDevice::getPositionScale() const { return m_positionScale; } void RawMultiAxisDevice::setOrientationScale(double scale) { m_orientationScale = scale; if (m_scaffold) { m_scaffold->setOrientationScale(this, m_orientationScale); } } double RawMultiAxisDevice::getOrientationScale() const { return m_orientationScale; } void RawMultiAxisDevice::setAxisDominance(bool onOff) { m_useAxisDominance = onOff; if (m_scaffold) { m_scaffold->setAxisDominance(this, m_useAxisDominance); } } bool RawMultiAxisDevice::isUsingAxisDominance() const { return m_useAxisDominance; } }; // namespace Devices }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Devices/MultiAxis/RawMultiAxisDevice.h000066400000000000000000000130541277777236100246730ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DEVICES_MULTIAXIS_RAWMULTIAXISDEVICE_H #define SURGSIM_DEVICES_MULTIAXIS_RAWMULTIAXISDEVICE_H #include #include #include "SurgSim/Input/CommonDevice.h" #include "SurgSim/Devices/MultiAxis/MultiAxisDevice.h" namespace SurgSim { namespace Devices { class RawMultiAxisScaffold; SURGSIM_STATIC_REGISTRATION(RawMultiAxisDevice); /// A class implementing the communication with a multi-axis controller input device, for example a 3DConnexion /// SpaceNavigator. /// /// This object will only generate raw output reported by the controller, which indicates the /// movement of the controller from its rest state. Normally, that result will need to be integrated to allow the /// controller to be treated as a differential device, where holding the controller moves the pose and releasing /// the controller lets the pose hold steady in its new state. The MultiAxisDevice class provides that. /// /// \par Application input provided by the device: /// | type | name | | /// | ---- | ---- | --- | /// | pose | "pose" | %Absolute device pose (units are ill-defined, but nominally meters). | /// | bool | "button1" | True if button 1 exists and is pressed. | /// | bool | "button2" | True if button 2 exists and is pressed. | /// | bool | "button3" | True if button 3 exists and is pressed. | /// | bool | "button4" | True if button 4 exists and is pressed. | /// /// \par Application output used by the device: /// | type | name | | /// | ---- | ---- | --- | /// | bool | "led1" | If the device has at least one LED light, controls the first one. | /// /// \sa MultiAxisDevice, SurgSim::Input::CommonDevice, SurgSim::Input::DeviceInterface class RawMultiAxisDevice : public SurgSim::Input::CommonDevice { public: /// Constructor. /// /// \param uniqueName A unique name for the device that will be used by the application. explicit RawMultiAxisDevice(const std::string& uniqueName); SURGSIM_CLASSNAME(SurgSim::Devices::RawMultiAxisDevice); /// Destructor. virtual ~RawMultiAxisDevice(); bool initialize() override; bool isInitialized() const override; /// Sets the position scale for this device. /// The position scale controls how much the pose changes for a given device translation. /// The default value for a raw device tries to correspond to the actual physical motion of the device. void setPositionScale(double scale); /// Gets the position scale for this device. double getPositionScale() const; /// Sets the orientation scale for this device. /// The orientation scale controls how much the pose changes for a given device rotation. /// The default value for a raw device tries to correspond to the actual physical motion of the device. void setOrientationScale(double scale); /// Gets the orientation scale for this device. double getOrientationScale() const; /// Turns on or off the axis dominance setting for this device. /// When axis dominance is on, only one (the largest) of the 6 pure axis directions is allowed to be active. /// In other words, the device will be translating in X, or in Y, or in Z, or rotating around X, or around Y, /// or around Z; but only one of those at a time. void setAxisDominance(bool onOff); /// Gets the axis dominance setting for this device. bool isUsingAxisDominance() const; private: bool finalize() override; // Returns the default position scale, in meters per tick. static double defaultPositionScale() { // the position scale from Paul N's measurements of the SpaceNavigator; 1/16"/350 ticks return 0.0000045; } // Returns the default rotation scale, in radians per tick. static double defaultOrientationScale() { // the rotation scale from Paul N's measurements of the SpaceNavigator return 0.0003; } friend SurgSim::Devices::MultiAxisDevice::MultiAxisDevice(const std::string& uniqueName); friend class RawMultiAxisScaffold; std::shared_ptr m_scaffold; /// Scale factor for the position axes; stored locally before the device is initialized. double m_positionScale; /// Scale factor for the orientation axes; stored locally before the device is initialized. double m_orientationScale; /// Controls whether dominance will be enabled; stored locally before the device is initialized. bool m_useAxisDominance; }; }; // namespace Devices }; // namespace SurgSim #endif // SURGSIM_DEVICES_MULTIAXIS_RAWMULTIAXISDEVICE_H opensurgsim-0.7.0/SurgSim/Devices/MultiAxis/RawMultiAxisScaffold.cpp000066400000000000000000000440561277777236100255560ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Devices/MultiAxis/RawMultiAxisScaffold.h" #include #include #include #include #include #include #include #include "SurgSim/Devices/MultiAxis/RawMultiAxisDevice.h" #include "SurgSim/Devices/MultiAxis/RawMultiAxisThread.h" #include "SurgSim/Devices/MultiAxis/GetSystemError.h" #include "SurgSim/Devices/MultiAxis/SystemInputDeviceHandle.h" #include "SurgSim/Devices/MultiAxis/CreateInputDeviceHandle.h" #include "SurgSim/Devices/MultiAxis/BitSetBuffer.h" #include "SurgSim/Framework/Assert.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Framework/SharedInstance.h" #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/DataStructures/DataGroupBuilder.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Math/Matrix.h" #include "SurgSim/Math/RigidTransform.h" using SurgSim::Math::Vector3d; using SurgSim::Math::Vector3f; using SurgSim::Math::Matrix44d; using SurgSim::Math::Matrix33d; using SurgSim::Math::RigidTransform3d; using SurgSim::Devices::Internal::getSystemErrorCode; using SurgSim::Devices::Internal::getSystemErrorText; namespace SurgSim { namespace Devices { struct RawMultiAxisScaffold::DeviceData { public: /// Initialize the data. DeviceData(const std::string& path, RawMultiAxisDevice* device, std::unique_ptr&& handle) : devicePath(path), deviceObject(device), thread(), deviceHandle(std::move(handle)), axisStates(initialAxisStates()), buttonStates(initialButtonStates()), coordinateSystemRotation(defaultCoordinateSystemRotation()), positionScale(device->getPositionScale()), orientationScale(device->getOrientationScale()), useAxisDominance(device->isUsingAxisDominance()) { } // Initialize by moving the data from another object. // Needed because Visual Studio 2010 doesn't support multi-argument emplace_back() for STL containers. DeviceData(DeviceData&& other) : devicePath(std::move(other.devicePath)), deviceObject(std::move(other.deviceObject)), thread(std::move(other.thread)), deviceHandle(std::move(other.deviceHandle)), axisStates(std::move(other.axisStates)), buttonStates(std::move(other.buttonStates)), coordinateSystemRotation(std::move(other.coordinateSystemRotation)), positionScale(std::move(other.positionScale)), orientationScale(std::move(other.orientationScale)), useAxisDominance(std::move(other.useAxisDominance)) { } ~DeviceData() { } // Returns the default coordinate system rotation matrix. static SurgSim::Math::Matrix33d defaultCoordinateSystemRotation() { SurgSim::Math::Matrix33d coordinateSystemRotation; // Make +Y point up (3DConnexion devices use +Z up) coordinateSystemRotation << 1, 0, 0, 0, 0, -1, 0, 1, 0; return coordinateSystemRotation; } static SystemInputDeviceHandle::AxisStates initialAxisStates() { SystemInputDeviceHandle::AxisStates states; states.fill(0); return states; } static SystemInputDeviceHandle::ButtonStates initialButtonStates() { SystemInputDeviceHandle::ButtonStates states; states.fill(false); return states; } /// The system device path corresponding to this device. const std::string devicePath; /// The corresponding device object. RawMultiAxisDevice* const deviceObject; /// Processing thread. std::unique_ptr thread; /// Device handle to read from. std::unique_ptr deviceHandle; /// Persistent axis states. SystemInputDeviceHandle::AxisStates axisStates; /// Persistent button states. SystemInputDeviceHandle::ButtonStates buttonStates; /// The rotation of the coordinate system (used to reorient, e.g. point +Y up) SurgSim::Math::Matrix33d coordinateSystemRotation; /// Scale factor for the position axes. double positionScale; /// Scale factor for the orientation axes. double orientationScale; /// Controls whether dominance will be enabled. bool useAxisDominance; /// The mutex that protects the externally modifiable parameters. boost::mutex parametersMutex; private: // Prevent copy construction and copy assignment. (VS2012 does not support "= delete" yet.) DeviceData(const DeviceData&) /*= delete*/; DeviceData& operator=(const DeviceData&) /*= delete*/; }; struct RawMultiAxisScaffold::StateData { public: /// Initialize the state. StateData() { } /// The list of known devices. std::list> activeDeviceList; /// The mutex that protects the list of known devices. boost::mutex mutex; private: // Prevent copy construction and copy assignment. (VS2012 does not support "= delete" yet.) StateData(const StateData&) /*= delete*/; StateData& operator=(const StateData&) /*= delete*/; }; RawMultiAxisScaffold::RawMultiAxisScaffold() : m_logger(Framework::Logger::getLogger("Devices/RawMultiAxis")), m_state(new StateData) { SURGSIM_LOG_DEBUG(m_logger) << "Shared scaffold created."; } RawMultiAxisScaffold::~RawMultiAxisScaffold() { // The following block controls the duration of the mutex being locked. { boost::lock_guard lock(m_state->mutex); if (! m_state->activeDeviceList.empty()) { SURGSIM_LOG_SEVERE(m_logger) << "RawMultiAxis: Destroying scaffold while devices are active!?!"; for (auto it = m_state->activeDeviceList.begin(); it != m_state->activeDeviceList.end(); ++it) { if ((*it)->thread) { destroyPerDeviceThread(it->get()); } } m_state->activeDeviceList.clear(); } } SURGSIM_LOG_DEBUG(m_logger) << "RawMultiAxis: Shared scaffold destroyed."; } bool RawMultiAxisScaffold::registerDevice(RawMultiAxisDevice* device) { int numUsedDevicesSeen = 0; if (!findUnusedDeviceAndRegister(device, &numUsedDevicesSeen)) { if (numUsedDevicesSeen > 0) { SURGSIM_LOG_SEVERE(m_logger) << "RawMultiAxis: Failed to find any unused multi-axis controllers," << " out of " << numUsedDevicesSeen << " present!"; } else { SURGSIM_LOG_SEVERE(m_logger) << "RawMultiAxis: Failed to find any multi-axis controllers." << " Is one plugged in? Are the permissions correct?"; } return false; } SURGSIM_LOG_INFO(m_logger) << "Device " << device->getName() << "registered."; return true; } bool RawMultiAxisScaffold::unregisterDevice(const RawMultiAxisDevice* const device) { bool found = false; { boost::lock_guard lock(m_state->mutex); auto matching = std::find_if(m_state->activeDeviceList.begin(), m_state->activeDeviceList.end(), [device](const std::unique_ptr& info) { return info->deviceObject == device; }); if (matching != m_state->activeDeviceList.end()) { if ((*matching)->thread) { destroyPerDeviceThread(matching->get()); } m_state->activeDeviceList.erase(matching); // the iterator is now invalid but that's OK found = true; SURGSIM_LOG_INFO(m_logger) << "Device " << device->getName() << " unregistered."; } } SURGSIM_LOG_IF(!found, m_logger, WARNING) << "Attempted to release a non-registered device " << device->getName(); return found; } void RawMultiAxisScaffold::setPositionScale(const RawMultiAxisDevice* device, double scale) { boost::lock_guard lock(m_state->mutex); auto matching = std::find_if(m_state->activeDeviceList.begin(), m_state->activeDeviceList.end(), [device](const std::unique_ptr& info) { return info->deviceObject == device; }); if (matching != m_state->activeDeviceList.end()) { boost::lock_guard lock((*matching)->parametersMutex); (*matching)->positionScale = scale; } } void RawMultiAxisScaffold::setOrientationScale(const RawMultiAxisDevice* device, double scale) { boost::lock_guard lock(m_state->mutex); auto matching = std::find_if(m_state->activeDeviceList.begin(), m_state->activeDeviceList.end(), [device](const std::unique_ptr& info) { return info->deviceObject == device; }); if (matching != m_state->activeDeviceList.end()) { boost::lock_guard lock((*matching)->parametersMutex); (*matching)->orientationScale = scale; } } void RawMultiAxisScaffold::setAxisDominance(const RawMultiAxisDevice* device, bool onOff) { boost::lock_guard lock(m_state->mutex); auto matching = std::find_if(m_state->activeDeviceList.begin(), m_state->activeDeviceList.end(), [device](const std::unique_ptr& info) { return info->deviceObject == device; }); if (matching != m_state->activeDeviceList.end()) { boost::lock_guard lock((*matching)->parametersMutex); (*matching)->useAxisDominance = onOff; } } bool RawMultiAxisScaffold::runInputFrame(RawMultiAxisScaffold::DeviceData* info) { info->deviceObject->pullOutput(); if (!updateDevice(info)) { return false; } info->deviceObject->pushInput(); return true; } bool RawMultiAxisScaffold::runAfterLastFrame(RawMultiAxisScaffold::DeviceData* info) { info->deviceHandle->prepareForShutdown(); return true; } static int findDominantAxis(const std::array& axes) { int biggestAxis = 0; int biggestValue = abs(axes[biggestAxis]); for (int i = 1; i < 6; ++i) { int value = abs(axes[i]); if (value > biggestValue) { biggestValue = value; biggestAxis = i; } } // Note that if a tie occurs, the 1st entry with the biggest absolute value wins ! return biggestAxis; } bool RawMultiAxisScaffold::updateDevice(RawMultiAxisScaffold::DeviceData* info) { const SurgSim::DataStructures::DataGroup& outputData = info->deviceObject->getOutputData(); boost::lock_guard lock(info->parametersMutex); bool ledState = false; if (outputData.booleans().get("led1", &ledState)) { static bool firstTimeWarning = true; if (firstTimeWarning) { firstTimeWarning = false; SURGSIM_LOG_CRITICAL(m_logger) << "RawMultiAxis: controlling LEDs is not supported yet!"; // TODO(advornik): We should implement LED control. But that probably doesn't mix well with blocking // reads here, and would either need to be done in another thread, or we'd need to poll here. } } bool didUpdate = false; if (!info->deviceHandle->updateStates(&(info->axisStates), &(info->buttonStates), &didUpdate)) { // If updateStates returns false, the device is no longer usable, so we exit and stop its update loop. return false; } if (didUpdate) { SURGSIM_LOG_DEBUG(m_logger) << "RawMultiAxis: STATE " << std::setw(3) << info->axisStates[0] << " " << std::setw(3) << info->axisStates[1] << " " << std::setw(3) << info->axisStates[2] << " / " << std::setw(3) << info->axisStates[3] << " " << std::setw(3) << info->axisStates[4] << " " << std::setw(3) << info->axisStates[5] << " :" << (info->buttonStates[0] ? " X" : " _") << (info->buttonStates[1] ? " X" : " _") << (info->buttonStates[2] ? " X" : " _") << (info->buttonStates[3] ? " X" : " _"); } // Deal with dominance and scaling. // It would be neat to put dominance into a filter, outside of the raw multi-axis device... but it has to // happen before filtering, and putting dominance AND filtering (and integrator) into components is too much. Vector3d position; Vector3d rotation; if (!info->useAxisDominance) { position = Vector3d(info->axisStates[0], info->axisStates[1], info->axisStates[2]) * info->positionScale; rotation = Vector3d(info->axisStates[3], info->axisStates[4], info->axisStates[5]) * info->orientationScale; } else { position.setZero(); rotation.setZero(); int index = findDominantAxis(info->axisStates); if (index >= 0 && index < 3) { position[index] = info->axisStates[index] * info->positionScale; } else if (index >= 3 && index < 6) { rotation[index-3] = info->axisStates[index] * info->orientationScale; } } // Fix up the coordinate system (3DConnexion devices use +Z up coordinates, we want +Y up). position = info->coordinateSystemRotation * position; rotation = info->coordinateSystemRotation * rotation; // Convert to a pose. Matrix33d orientation; double angle = rotation.norm(); if (angle < 1e-9) { orientation.setIdentity(); } else { orientation = SurgSim::Math::makeRotationMatrix(angle, Vector3d(rotation / angle)); } RigidTransform3d pose; pose.makeAffine(); pose.linear() = orientation; pose.translation() = position; // TODO(bert): this code should cache the access indices. SurgSim::DataStructures::DataGroup& inputData = info->deviceObject->getInputData(); inputData.poses().set(SurgSim::DataStructures::Names::POSE, pose); inputData.booleans().set(SurgSim::DataStructures::Names::BUTTON_1, info->buttonStates[0]); inputData.booleans().set(SurgSim::DataStructures::Names::BUTTON_2, info->buttonStates[1]); inputData.booleans().set(SurgSim::DataStructures::Names::BUTTON_3, info->buttonStates[2]); inputData.booleans().set(SurgSim::DataStructures::Names::BUTTON_4, info->buttonStates[3]); return true; } std::unique_ptr RawMultiAxisScaffold::openDevice(const std::string& path) { std::unique_ptr handle = createInputDeviceHandle(path, m_logger); if (!handle) { int64_t error = getSystemErrorCode(); SURGSIM_LOG_INFO(m_logger) << "Could not open device " << path << ": error " << error << ", " << getSystemErrorText(error); } return std::move(handle); } bool RawMultiAxisScaffold::findUnusedDeviceAndRegister(RawMultiAxisDevice* device, int* numUsedDevicesSeen) { *numUsedDevicesSeen = 0; boost::lock_guard lock(m_state->mutex); // Make sure the object is unique. auto sameObject = std::find_if(m_state->activeDeviceList.cbegin(), m_state->activeDeviceList.cend(), [device](const std::unique_ptr& info) { return info->deviceObject == device; }); SURGSIM_ASSERT(sameObject == m_state->activeDeviceList.end()) << "Tried to register a device" << " which is already present!"; // Make sure the name is unique. const std::string deviceName = device->getName(); auto sameName = std::find_if(m_state->activeDeviceList.cbegin(), m_state->activeDeviceList.cend(), [&deviceName](const std::unique_ptr& info) { return info->deviceObject->getName() == deviceName; }); if (sameName != m_state->activeDeviceList.end()) { SURGSIM_LOG_CRITICAL(m_logger) << "Tried to register a device when the same name is" << " already present!"; return false; } const std::vector devicePaths = enumerateInputDevicePaths(m_logger.get()); for (auto it = devicePaths.cbegin(); it != devicePaths.cend(); ++it) { const std::string& devicePath = *it; // Check if this is the device we wanted. std::unique_ptr handle = openDevice(devicePath); if (!handle) { // message was already printed continue; } const std::string reportedName = handle->getDeviceName(); int vendorId, productId; if (handle->getDeviceIds(&vendorId, &productId)) { SURGSIM_LOG_DEBUG(m_logger) << "RawMultiAxis: Examining device " << devicePath << " (" << std::hex << std::setfill('0') << std::setw(4) << vendorId << ":" << std::setw(4) << productId << " " << reportedName << ")"; } else { SURGSIM_LOG_DEBUG(m_logger) << "RawMultiAxis: Examining device " << devicePath << " (????:???? " << reportedName << ")"; } if (!handle->hasTranslationAndRotationAxes()) { continue; } handle.reset(); if (registerIfUnused(devicePath, device, numUsedDevicesSeen)) { return true; } } return false; } bool RawMultiAxisScaffold::registerIfUnused(const std::string& path, RawMultiAxisDevice* device, int* numUsedDevicesSeen) { // Check existing devices. auto sameIndices = std::find_if(m_state->activeDeviceList.cbegin(), m_state->activeDeviceList.cend(), [path](const std::unique_ptr& info) { return (info->devicePath == path); }); if (sameIndices != m_state->activeDeviceList.end()) { // We found an existing device for this controller. ++(*numUsedDevicesSeen); return false; } // The controller is not yet in use. std::unique_ptr handle = openDevice(path); if (!handle) { return false; } // Construct the object, start its thread, then move it to the list. // The thread needs a device entry pointer, but the unique_ptr indirection means we have one to provide even // before we've put an entry in the active device array. std::unique_ptr info(new DeviceData(path, device, std::move(handle))); createPerDeviceThread(info.get()); SURGSIM_ASSERT(info->thread); m_state->activeDeviceList.emplace_back(std::move(info)); return true; } bool RawMultiAxisScaffold::createPerDeviceThread(DeviceData* data) { SURGSIM_ASSERT(!data->thread); std::unique_ptr thread(new RawMultiAxisThread(this, data)); thread->start(); data->thread = std::move(thread); return true; } bool RawMultiAxisScaffold::destroyPerDeviceThread(DeviceData* data) { SURGSIM_ASSERT(data->thread); std::unique_ptr thread = std::move(data->thread); thread->stop(); thread.reset(); return true; } SurgSim::DataStructures::DataGroup RawMultiAxisScaffold::buildDeviceInputData() { SurgSim::DataStructures::DataGroupBuilder builder; builder.addPose(SurgSim::DataStructures::Names::POSE); builder.addBoolean(SurgSim::DataStructures::Names::BUTTON_1); builder.addBoolean(SurgSim::DataStructures::Names::BUTTON_2); builder.addBoolean(SurgSim::DataStructures::Names::BUTTON_3); builder.addBoolean(SurgSim::DataStructures::Names::BUTTON_4); return builder.createData(); } std::shared_ptr RawMultiAxisScaffold::getOrCreateSharedInstance() { static SurgSim::Framework::SharedInstance sharedInstance; return sharedInstance.get(); } }; // namespace Devices }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Devices/MultiAxis/RawMultiAxisScaffold.h000066400000000000000000000124251277777236100252160ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DEVICES_MULTIAXIS_RAWMULTIAXISSCAFFOLD_H #define SURGSIM_DEVICES_MULTIAXIS_RAWMULTIAXISSCAFFOLD_H #include #include #include "SurgSim/Framework/Logger.h" #include "SurgSim/DataStructures/DataGroup.h" namespace SurgSim { namespace Devices { class RawMultiAxisDevice; class RawMultiAxisThread; class SystemInputDeviceHandle; /// A class that implements the behavior of RawMultiAxisDevice objects. /// /// \sa SurgSim::Devices::RawMultiAxisDevice class RawMultiAxisScaffold { public: /// Constructor. RawMultiAxisScaffold(); /// Destructor. ~RawMultiAxisScaffold(); /// Gets or creates the scaffold shared by all RawMultiAxisDevice instances. /// The scaffold is managed using a SharedInstance object, so it will be destroyed when all devices are released. /// \return the scaffold object. static std::shared_ptr getOrCreateSharedInstance(); private: /// Internal shared state data type. struct StateData; /// Interal per-device information. struct DeviceData; friend class RawMultiAxisDevice; friend class RawMultiAxisThread; friend struct StateData; /// Registers the specified device object. /// If successful, the device object will become connected to an unused hardware device. /// /// \param device The device object to be used, which should have a unique name. /// \return True if the initialization succeeds, false if it fails. bool registerDevice(RawMultiAxisDevice* device); /// Unregisters the specified device object. /// The corresponding hardware device will become unused, and can be re-registered later. /// /// \param device The device object. /// \return true on success, false on failure. bool unregisterDevice(const RawMultiAxisDevice* device); /// Sets the position scale for this device. void setPositionScale(const RawMultiAxisDevice* device, double scale); /// Sets the orientation scale for this device. void setOrientationScale(const RawMultiAxisDevice* device, double scale); /// Turns on or off the axis dominance setting for this device. void setAxisDominance(const RawMultiAxisDevice* device, bool onOff); /// Executes the operations for a single input frame for a single device. /// Should only be called from the context of the input loop thread. /// \param info The internal device data. /// \return true on success. bool runInputFrame(DeviceData* info); /// Executes the operations after the last input frame, as the device input loop thread is shutting down. /// Should only be called from the context of the input loop thread. /// \param info The internal device data. /// \return true on success. bool runAfterLastFrame(DeviceData* info); /// Updates the device information for a single device. /// \return true on success. bool updateDevice(DeviceData* info); /// Scans hardware that is present in the system, and if an unused device is found, register an object for it. /// /// \param device The device object to register if an unused device is found. /// \param [out] numUsedDevicesSeen The number of devices that were found during the scan but were already /// in use. Can be used if the scan fails to determine the error message that should be displayed. /// \return true on success. bool findUnusedDeviceAndRegister(RawMultiAxisDevice* device, int* numUsedDevicesSeen); /// Register a device object given a device path, if the same path is not already in use. /// /// \param path A unique system path that can be used to communicate with the device. /// \param device The device object to register if the index pair is in fact unused. /// \param [in,out] numUsedDevicesSeen The number of devices that were found during the scan but were /// already in use; incremented when an unused device is seen. /// \return true on success. bool registerIfUnused(const std::string& path, RawMultiAxisDevice* device, int* numUsedDevicesSeen); /// Creates the input loop thread. /// \return true on success. bool createPerDeviceThread(DeviceData* data); /// Destroys the input loop thread. /// \return true on success. bool destroyPerDeviceThread(DeviceData* data); /// Opens the specified device. /// \return The system-specific wrapper for the device. std::unique_ptr openDevice(const std::string& path); /// Builds the data layout for the application input (i.e. device output). static SurgSim::DataStructures::DataGroup buildDeviceInputData(); /// Logger used by the scaffold and all devices. std::shared_ptr m_logger; /// Internal scaffold state. std::unique_ptr m_state; }; }; // namespace Devices }; // namespace SurgSim #endif // SURGSIM_DEVICES_MULTIAXIS_RAWMULTIAXISSCAFFOLD_H opensurgsim-0.7.0/SurgSim/Devices/MultiAxis/RawMultiAxisThread.cpp000066400000000000000000000025461277777236100252420ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Devices/MultiAxis/RawMultiAxisThread.h" namespace SurgSim { namespace Devices { RawMultiAxisThread::RawMultiAxisThread(RawMultiAxisScaffold* scaffold, RawMultiAxisScaffold::DeviceData* deviceData) : BasicThread("RawMultiAxis thread"), m_scaffold(scaffold), m_deviceData(deviceData) { setRate(100.0); } RawMultiAxisThread::~RawMultiAxisThread() { } bool RawMultiAxisThread::doInitialize() { return true; } bool RawMultiAxisThread::doStartUp() { return true; } bool RawMultiAxisThread::doUpdate(double dt) { return m_scaffold->runInputFrame(m_deviceData); } void RawMultiAxisThread::doBeforeStop() { m_scaffold->runAfterLastFrame(m_deviceData); } }; // namespace Devices }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Devices/MultiAxis/RawMultiAxisThread.h000066400000000000000000000031431277777236100247010ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DEVICES_MULTIAXIS_RAWMULTIAXISTHREAD_H #define SURGSIM_DEVICES_MULTIAXIS_RAWMULTIAXISTHREAD_H #include #include #include "SurgSim/Framework/BasicThread.h" #include "SurgSim/Devices/MultiAxis/RawMultiAxisScaffold.h" namespace SurgSim { namespace Devices { /// A class implementing the thread context for sampling RawMultiAxis devices. /// \sa SurgSim::Devices::RawMultiAxisScaffold class RawMultiAxisThread : public SurgSim::Framework::BasicThread { public: explicit RawMultiAxisThread(RawMultiAxisScaffold* scaffold, RawMultiAxisScaffold::DeviceData* deviceData); virtual ~RawMultiAxisThread(); protected: bool doInitialize() override; bool doStartUp() override; bool doUpdate(double dt) override; void doBeforeStop() override; private: RawMultiAxisScaffold* m_scaffold; RawMultiAxisScaffold::DeviceData* m_deviceData; }; }; // namespace Devices }; // namespace SurgSim #endif // SURGSIM_DEVICES_MULTIAXIS_RAWMULTIAXISTHREAD_H opensurgsim-0.7.0/SurgSim/Devices/MultiAxis/SystemInputDeviceHandle.cpp000066400000000000000000000017231277777236100262550ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Devices/MultiAxis/SystemInputDeviceHandle.h" namespace SurgSim { namespace Devices { SystemInputDeviceHandle::SystemInputDeviceHandle() { } SystemInputDeviceHandle::~SystemInputDeviceHandle() { } void SystemInputDeviceHandle::prepareForShutdown() { } }; // namespace Devices }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Devices/MultiAxis/SystemInputDeviceHandle.h000066400000000000000000000066141277777236100257260ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DEVICES_MULTIAXIS_SYSTEMINPUTDEVICEHANDLE_H #define SURGSIM_DEVICES_MULTIAXIS_SYSTEMINPUTDEVICEHANDLE_H #include #include #include #include namespace SurgSim { namespace Devices { /// A wrapper for system-dependent access to an input/HID device. class SystemInputDeviceHandle { public: /// The maximum number of axes supported by any device object. static const size_t MAX_NUM_AXES = 6; /// The maximum number of buttons supported by any device object. static const size_t MAX_NUM_BUTTONS = 4; /// Type used to store axis states. typedef std::array AxisStates; /// Type used to store button states. typedef std::array ButtonStates; /// Destructor. virtual ~SystemInputDeviceHandle(); /// Gets the name returned by the operating system for this device. /// \return The reported name, or "???" if no name information could be found. virtual std::string getDeviceName() const = 0; /// Gets the device identifiers. /// \param [out] vendorId The USB or PCI vendor identifier. /// \param [out] productId The USB or PCI product identifier. /// \return true if it succeeds. virtual bool getDeviceIds(int* vendorId, int* productId) const = 0; /// Queries if this device has 3 translation and 3 rotation axes. /// \return true if the desired axes are present. virtual bool hasTranslationAndRotationAxes() const = 0; /// Updates the axis and states from the device input, if any. /// \param [in,out] axisStates The states for each axis of the device. /// \param [in,out] buttonStates The states for each device button. /// \param [out] updated True if any states were actually updated. (Note that even if this value is true, the /// states may not have changed value; one or more states could have been updated to the same value.) /// \return true if the operation was successful; false if the device is no longer in a usable state. virtual bool updateStates(AxisStates* axisStates, ButtonStates* buttonStates, bool* updated) = 0; /// Prepares the handle for sampling thread shutdown. /// Should be called from the same thread that was calling updateStates, after the calls to updateStates /// have been stopped, but before object destruction. virtual void prepareForShutdown(); protected: /// Default constructor. /// Cannot be called directly; see open and enumerate. SystemInputDeviceHandle(); private: // Prevent copy construction and copy assignment. (VS2012 does not support "= delete" yet.) SystemInputDeviceHandle(const SystemInputDeviceHandle& other) /*= delete*/; SystemInputDeviceHandle& operator=(const SystemInputDeviceHandle& other) /*= delete*/; }; }; // namespace Devices }; // namespace SurgSim #endif // SURGSIM_DEVICES_MULTIAXIS_SYSTEMINPUTDEVICEHANDLE_H opensurgsim-0.7.0/SurgSim/Devices/MultiAxis/UnitTests/000077500000000000000000000000001277777236100227505ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Devices/MultiAxis/UnitTests/CMakeLists.txt000066400000000000000000000017561277777236100255210ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. include_directories( ${gtest_SOURCE_DIR}/include ) set(UNIT_TEST_SOURCES MultiAxisDeviceTest.cpp RawMultiAxisDeviceTest.cpp RawMultiAxisScaffoldTest.cpp ) set(LIBS MultiAxisDevice ) if(WDK_FOUND) list(APPEND LIBS ${WDK_LIBRARIES}) endif() surgsim_add_unit_tests(MultiAxisDeviceTest) set_target_properties(MultiAxisDeviceTest PROPERTIES FOLDER "Devices") opensurgsim-0.7.0/SurgSim/Devices/MultiAxis/UnitTests/MultiAxisDeviceTest.cpp000066400000000000000000000202721277777236100273560ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the MultiAxisDevice class. #include #include #include #include #include #include "SurgSim/Devices/MultiAxis/MultiAxisDevice.h" #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Matrix.h" #include "SurgSim/Testing/MockInputOutput.h" using SurgSim::Devices::MultiAxisDevice; using SurgSim::DataStructures::DataGroup; using SurgSim::Math::RigidTransform3d; using SurgSim::Math::Matrix44d; using SurgSim::Testing::MockInputOutput; TEST(MultiAxisDeviceTest, CreateUninitializedDevice) { std::shared_ptr device = std::make_shared("TestMultiAxis"); ASSERT_TRUE(device != nullptr) << "Device creation failed."; } TEST(MultiAxisDeviceTest, CreateAndInitializeDevice) { std::shared_ptr device = std::make_shared("TestMultiAxis"); ASSERT_TRUE(device != nullptr) << "Device creation failed."; EXPECT_FALSE(device->isInitialized()); ASSERT_TRUE(device->initialize()) << "Initialization failed. Is a MultiAxis device plugged in?"; EXPECT_TRUE(device->isInitialized()); } TEST(MultiAxisDeviceTest, Name) { std::shared_ptr device = std::make_shared("TestMultiAxis"); ASSERT_TRUE(device != nullptr) << "Device creation failed."; EXPECT_EQ("TestMultiAxis", device->getName()); EXPECT_TRUE(device->initialize()) << "Initialization failed. Is a MultiAxis device plugged in?"; EXPECT_EQ("TestMultiAxis", device->getName()); } TEST(MultiAxisDeviceTest, Factory) { std::shared_ptr device; ASSERT_NO_THROW(device = SurgSim::Input::DeviceInterface::getFactory().create( "SurgSim::Devices::MultiAxisDevice", "Device")); EXPECT_NE(nullptr, device); } static void testCreateDeviceSeveralTimes(bool doSleep) { for (int i = 0; i < 6; ++i) { std::shared_ptr device = std::make_shared("TestMultiAxis"); ASSERT_TRUE(device != nullptr) << "Device creation failed."; ASSERT_TRUE(device->initialize()) << "Initialization failed. Is a MultiAxis device plugged in?"; if (doSleep) { boost::this_thread::sleep_until(boost::chrono::steady_clock::now() + boost::chrono::milliseconds(100)); } // the device will be destroyed here } } TEST(MultiAxisDeviceTest, CreateDeviceSeveralTimes) { testCreateDeviceSeveralTimes(true); } TEST(MultiAxisDeviceTest, CreateSeveralDevices) { std::shared_ptr device1 = std::make_shared("MultiAxis1"); ASSERT_TRUE(device1 != nullptr) << "Device creation failed."; ASSERT_TRUE(device1->initialize()) << "Initialization failed. Is a MultiAxis device plugged in?"; // We can't check what happens with the scaffolds, since those are no longer a part of the device's API... std::shared_ptr device2 = std::make_shared("MultiAxis2"); ASSERT_TRUE(device2 != nullptr) << "Device creation failed."; if (! device2->initialize()) { std::cerr << "[Warning: second MultiAxis controller did not come up; is it plugged in?]" << std::endl; } } TEST(MultiAxisDeviceTest, CreateDevicesWithSameName) { std::shared_ptr device1 = std::make_shared("MultiAxis"); ASSERT_TRUE(device1 != nullptr) << "Device creation failed."; ASSERT_TRUE(device1->initialize()) << "Initialization failed. Is a MultiAxis device plugged in?"; std::shared_ptr device2 = std::make_shared("MultiAxis"); ASSERT_TRUE(device2 != nullptr) << "Device creation failed."; ASSERT_FALSE(device2->initialize()) << "Initialization succeeded despite duplicate name."; } // Create a string representation from an int. // C++11 adds std::to_string() to do this for various types, but VS2010 only half-supports that. template inline std::string makeString(T value) { std::ostringstream out; out << value; return out.str(); } TEST(MultiAxisDeviceTest, CreateAllDevices) { std::vector> devices; for (int i = 1; ; ++i) { std::string name = "MultiAxis" + makeString(i); std::shared_ptr device = std::make_shared(name); ASSERT_TRUE(device != nullptr) << "Device creation failed."; if (! device->initialize()) { break; } devices.emplace_back(std::move(device)); } std::cout << devices.size() << " devices initialized." << std::endl; ASSERT_GT(devices.size(), 0U) << "Initialization failed. Is a MultiAxis device plugged in?"; } TEST(MultiAxisDeviceTest, InputConsumer) { std::shared_ptr device = std::make_shared("TestMultiAxis"); ASSERT_TRUE(device != nullptr) << "Device creation failed."; ASSERT_TRUE(device->initialize()) << "Initialization failed. Is a MultiAxis device plugged in?"; std::shared_ptr consumer = std::make_shared(); EXPECT_EQ(0, consumer->m_numTimesInitializedInput); EXPECT_EQ(0, consumer->m_numTimesReceivedInput); EXPECT_FALSE(device->removeInputConsumer(consumer)); EXPECT_EQ(0, consumer->m_numTimesInitializedInput); EXPECT_EQ(0, consumer->m_numTimesReceivedInput); EXPECT_TRUE(device->addInputConsumer(consumer)); // Adding the same input consumer again should fail. EXPECT_FALSE(device->addInputConsumer(consumer)); // Sleep for a second, to see how many times the consumer is invoked. // (A MultiAxis device updates internally at 60Hz, but our code currently runs at 100Hz to reduce latency.) boost::this_thread::sleep_until(boost::chrono::steady_clock::now() + boost::chrono::milliseconds(1000)); EXPECT_TRUE(device->removeInputConsumer(consumer)); // Removing the same input consumer again should fail. EXPECT_FALSE(device->removeInputConsumer(consumer)); // Check the number of invocations. EXPECT_EQ(1, consumer->m_numTimesInitializedInput); EXPECT_GE(consumer->m_numTimesReceivedInput, 90); EXPECT_LE(consumer->m_numTimesReceivedInput, 110); EXPECT_TRUE(consumer->m_lastReceivedInput.poses().hasData(SurgSim::DataStructures::Names::POSE)); EXPECT_TRUE(consumer->m_lastReceivedInput.booleans().hasData(SurgSim::DataStructures::Names::BUTTON_1)); EXPECT_TRUE(consumer->m_lastReceivedInput.booleans().hasData(SurgSim::DataStructures::Names::BUTTON_2)); EXPECT_TRUE(consumer->m_lastReceivedInput.booleans().hasData(SurgSim::DataStructures::Names::BUTTON_3)); EXPECT_TRUE(consumer->m_lastReceivedInput.booleans().hasData(SurgSim::DataStructures::Names::BUTTON_4)); } TEST(MultiAxisDeviceTest, OutputProducer) { std::shared_ptr device = std::make_shared("TestMultiAxis"); ASSERT_TRUE(device != nullptr) << "Device creation failed."; ASSERT_TRUE(device->initialize()) << "Initialization failed. Is a MultiAxis device plugged in?"; std::shared_ptr producer = std::make_shared(); EXPECT_EQ(0, producer->m_numTimesRequestedOutput); EXPECT_FALSE(device->removeOutputProducer(producer)); EXPECT_EQ(0, producer->m_numTimesRequestedOutput); EXPECT_TRUE(device->setOutputProducer(producer)); // Sleep for a second, to see how many times the producer is invoked. // (A MultiAxis device is does not request any output.) boost::this_thread::sleep_until(boost::chrono::steady_clock::now() + boost::chrono::milliseconds(1000)); EXPECT_TRUE(device->removeOutputProducer(producer)); // Removing the same input producer again should fail. EXPECT_FALSE(device->removeOutputProducer(producer)); // Check the number of invocations. EXPECT_GE(producer->m_numTimesRequestedOutput, 90); EXPECT_LE(producer->m_numTimesRequestedOutput, 110); } opensurgsim-0.7.0/SurgSim/Devices/MultiAxis/UnitTests/RawMultiAxisDeviceTest.cpp000066400000000000000000000206361277777236100300340ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the RawMultiAxisDevice class. #include #include #include #include #include #include "SurgSim/Devices/MultiAxis/RawMultiAxisDevice.h" #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Matrix.h" #include "SurgSim/Testing/MockInputOutput.h" using SurgSim::Devices::RawMultiAxisDevice; using SurgSim::Devices::RawMultiAxisScaffold; using SurgSim::DataStructures::DataGroup; using SurgSim::Math::RigidTransform3d; using SurgSim::Math::Matrix44d; using SurgSim::Testing::MockInputOutput; TEST(RawMultiAxisDeviceTest, CreateUninitializedDevice) { std::shared_ptr device = std::make_shared("TestRawMultiAxis"); ASSERT_TRUE(device != nullptr) << "Device creation failed."; } TEST(RawMultiAxisDeviceTest, CreateAndInitializeDevice) { std::shared_ptr device = std::make_shared("TestRawMultiAxis"); ASSERT_TRUE(device != nullptr) << "Device creation failed."; EXPECT_FALSE(device->isInitialized()); ASSERT_TRUE(device->initialize()) << "Initialization failed. Is a RawMultiAxis device plugged in?"; EXPECT_TRUE(device->isInitialized()); } TEST(RawMultiAxisDeviceTest, Name) { std::shared_ptr device = std::make_shared("TestRawMultiAxis"); ASSERT_TRUE(device != nullptr) << "Device creation failed."; EXPECT_EQ("TestRawMultiAxis", device->getName()); EXPECT_TRUE(device->initialize()) << "Initialization failed. Is a RawMultiAxis device plugged in?"; EXPECT_EQ("TestRawMultiAxis", device->getName()); } TEST(RawMultiAxisDeviceTest, Factory) { std::shared_ptr device; ASSERT_NO_THROW(device = SurgSim::Input::DeviceInterface::getFactory().create( "SurgSim::Devices::RawMultiAxisDevice", "Device")); EXPECT_NE(nullptr, device); } static void testCreateDeviceSeveralTimes(bool doSleep) { for (int i = 0; i < 6; ++i) { std::shared_ptr device = std::make_shared("TestRawMultiAxis"); ASSERT_TRUE(device != nullptr) << "Device creation failed."; ASSERT_TRUE(device->initialize()) << "Initialization failed. Is a RawMultiAxis device plugged in?"; if (doSleep) { boost::this_thread::sleep_until(boost::chrono::steady_clock::now() + boost::chrono::milliseconds(100)); } // the device will be destroyed here } } TEST(RawMultiAxisDeviceTest, CreateDeviceSeveralTimes) { testCreateDeviceSeveralTimes(true); } TEST(RawMultiAxisDeviceTest, CreateSeveralDevices) { std::shared_ptr device1 = std::make_shared("RawMultiAxis1"); ASSERT_TRUE(device1 != nullptr) << "Device creation failed."; ASSERT_TRUE(device1->initialize()) << "Initialization failed. Is a RawMultiAxis device plugged in?"; // We can't check what happens with the scaffolds, since those are no longer a part of the device's API... std::shared_ptr device2 = std::make_shared("RawMultiAxis2"); ASSERT_TRUE(device2 != nullptr) << "Device creation failed."; if (! device2->initialize()) { std::cerr << "[Warning: second RawMultiAxis controller did not come up; is it plugged in?]" << std::endl; } } TEST(RawMultiAxisDeviceTest, CreateDevicesWithSameName) { std::shared_ptr device1 = std::make_shared("RawMultiAxis"); ASSERT_TRUE(device1 != nullptr) << "Device creation failed."; ASSERT_TRUE(device1->initialize()) << "Initialization failed. Is a RawMultiAxis device plugged in?"; std::shared_ptr device2 = std::make_shared("RawMultiAxis"); ASSERT_TRUE(device2 != nullptr) << "Device creation failed."; ASSERT_FALSE(device2->initialize()) << "Initialization succeeded despite duplicate name."; } // Create a string representation from an int. // C++11 adds std::to_string() to do this for various types, but VS2010 only half-supports that. template inline std::string makeString(T value) { std::ostringstream out; out << value; return out.str(); } TEST(RawMultiAxisDeviceTest, CreateAllDevices) { std::vector> devices; for (int i = 1; ; ++i) { std::string name = "RawMultiAxis" + makeString(i); std::shared_ptr device = std::make_shared(name); ASSERT_TRUE(device != nullptr) << "Device creation failed."; if (! device->initialize()) { break; } devices.emplace_back(std::move(device)); } std::cout << devices.size() << " devices initialized." << std::endl; ASSERT_GT(devices.size(), 0U) << "Initialization failed. Is a RawMultiAxis device plugged in?"; } TEST(RawMultiAxisDeviceTest, InputConsumer) { std::shared_ptr device = std::make_shared("TestRawMultiAxis"); ASSERT_TRUE(device != nullptr) << "Device creation failed."; ASSERT_TRUE(device->initialize()) << "Initialization failed. Is a RawMultiAxis device plugged in?"; std::shared_ptr consumer = std::make_shared(); EXPECT_EQ(0, consumer->m_numTimesInitializedInput); EXPECT_EQ(0, consumer->m_numTimesReceivedInput); EXPECT_FALSE(device->removeInputConsumer(consumer)); EXPECT_EQ(0, consumer->m_numTimesInitializedInput); EXPECT_EQ(0, consumer->m_numTimesReceivedInput); EXPECT_TRUE(device->addInputConsumer(consumer)); // Adding the same input consumer again should fail. EXPECT_FALSE(device->addInputConsumer(consumer)); // Sleep for a second, to see how many times the consumer is invoked. // (A RawMultiAxis device updates internally at 60Hz, but our code currently runs at 100Hz to reduce latency.) boost::this_thread::sleep_until(boost::chrono::steady_clock::now() + boost::chrono::milliseconds(1000)); EXPECT_TRUE(device->removeInputConsumer(consumer)); // Removing the same input consumer again should fail. EXPECT_FALSE(device->removeInputConsumer(consumer)); // Check the number of invocations. EXPECT_EQ(1, consumer->m_numTimesInitializedInput); EXPECT_GE(consumer->m_numTimesReceivedInput, 90); EXPECT_LE(consumer->m_numTimesReceivedInput, 110); EXPECT_TRUE(consumer->m_lastReceivedInput.poses().hasData(SurgSim::DataStructures::Names::POSE)); EXPECT_TRUE(consumer->m_lastReceivedInput.booleans().hasData(SurgSim::DataStructures::Names::BUTTON_1)); EXPECT_TRUE(consumer->m_lastReceivedInput.booleans().hasData(SurgSim::DataStructures::Names::BUTTON_2)); EXPECT_TRUE(consumer->m_lastReceivedInput.booleans().hasData(SurgSim::DataStructures::Names::BUTTON_3)); EXPECT_TRUE(consumer->m_lastReceivedInput.booleans().hasData(SurgSim::DataStructures::Names::BUTTON_4)); } TEST(RawMultiAxisDeviceTest, OutputProducer) { std::shared_ptr device = std::make_shared("TestRawMultiAxis"); ASSERT_TRUE(device != nullptr) << "Device creation failed."; ASSERT_TRUE(device->initialize()) << "Initialization failed. Is a RawMultiAxis device plugged in?"; std::shared_ptr producer = std::make_shared(); EXPECT_EQ(0, producer->m_numTimesRequestedOutput); EXPECT_FALSE(device->removeOutputProducer(producer)); EXPECT_EQ(0, producer->m_numTimesRequestedOutput); EXPECT_TRUE(device->setOutputProducer(producer)); // Sleep for a second, to see how many times the producer is invoked. // (A RawMultiAxis device is does not request any output.) boost::this_thread::sleep_until(boost::chrono::steady_clock::now() + boost::chrono::milliseconds(1000)); EXPECT_TRUE(device->removeOutputProducer(producer)); // Removing the same input producer again should fail. EXPECT_FALSE(device->removeOutputProducer(producer)); // Check the number of invocations. EXPECT_GE(producer->m_numTimesRequestedOutput, 90); EXPECT_LE(producer->m_numTimesRequestedOutput, 110); } opensurgsim-0.7.0/SurgSim/Devices/MultiAxis/UnitTests/RawMultiAxisScaffoldTest.cpp000066400000000000000000000164121277777236100303530ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the RawMultiAxisScaffold class and its device interactions. #include #include #include #include #include #include "SurgSim/Devices/MultiAxis/RawMultiAxisDevice.h" #include "SurgSim/Devices/MultiAxis/RawMultiAxisScaffold.h" #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Matrix.h" using SurgSim::Devices::RawMultiAxisDevice; using SurgSim::Devices::RawMultiAxisScaffold; TEST(RawMultiAxisScaffoldTest, CreateAndDestroyScaffold) { std::shared_ptr scaffold = RawMultiAxisScaffold::getOrCreateSharedInstance(); ASSERT_NE(nullptr, scaffold) << "The scaffold was not created!"; std::weak_ptr scaffold1 = scaffold; { std::shared_ptr stillHaveScaffold = scaffold1.lock(); EXPECT_NE(nullptr, stillHaveScaffold) << "Unable to get scaffold from weak ref (while strong ref exists)"; EXPECT_EQ(scaffold, stillHaveScaffold) << "Scaffold mismatch!"; } { std::shared_ptr sameScaffold = RawMultiAxisScaffold::getOrCreateSharedInstance(); EXPECT_NE(nullptr, sameScaffold) << "Unable to get scaffold from class"; EXPECT_EQ(scaffold, sameScaffold) << "Scaffold mismatch!"; } scaffold.reset(); { std::shared_ptr dontHaveScaffold = scaffold1.lock(); EXPECT_EQ(nullptr, dontHaveScaffold) << "Able to get scaffold from weak ref (with no strong ref)"; } scaffold = RawMultiAxisScaffold::getOrCreateSharedInstance(); ASSERT_NE(nullptr, scaffold) << "The scaffold was not created the 2nd time!"; std::weak_ptr scaffold2 = scaffold; { std::shared_ptr stillHaveScaffold = scaffold2.lock(); ASSERT_NE(nullptr, stillHaveScaffold) << "Unable to get scaffold from weak ref (while strong ref exists)"; ASSERT_EQ(scaffold, stillHaveScaffold) << "Scaffold mismatch!"; } } TEST(RawMultiAxisScaffoldTest, ScaffoldLifeCycle) { std::weak_ptr lastScaffold; { std::shared_ptr scaffold = RawMultiAxisScaffold::getOrCreateSharedInstance(); ASSERT_NE(nullptr, scaffold) << "The scaffold was not created!"; lastScaffold = scaffold; } { std::shared_ptr dontHaveScaffold = lastScaffold.lock(); EXPECT_EQ(nullptr, dontHaveScaffold) << "Able to get scaffold from weak ref (with no strong ref)"; lastScaffold.reset(); } { std::shared_ptr device = std::make_shared("TestRawMultiAxis"); ASSERT_NE(nullptr, device) << "Creation failed. Is a RawMultiAxis device plugged in?"; // note: the device is NOT initialized! { std::shared_ptr scaffold = RawMultiAxisScaffold::getOrCreateSharedInstance(); EXPECT_NE(nullptr, scaffold) << "The scaffold was not retrieved!"; lastScaffold = scaffold; // save the scaffold for later std::shared_ptr sameScaffold = lastScaffold.lock(); EXPECT_NE(nullptr, sameScaffold); EXPECT_EQ(scaffold, sameScaffold); } // The device has not been initialized, so it should NOT be hanging on to the device! { std::shared_ptr deadScaffold = lastScaffold.lock(); EXPECT_EQ(nullptr, deadScaffold); } // the ("empty") device is about to get destroyed } { std::shared_ptr device = std::make_shared("TestRawMultiAxis"); ASSERT_NE(nullptr, device) << "Device creation failed."; ASSERT_TRUE(device->initialize()) << "Initialization failed. Is a RawMultiAxis device plugged in?"; { std::shared_ptr scaffold = RawMultiAxisScaffold::getOrCreateSharedInstance(); EXPECT_NE(nullptr, scaffold) << "The scaffold was not retrieved!"; lastScaffold = scaffold; // save the scaffold for later std::shared_ptr sameScaffold = lastScaffold.lock(); EXPECT_NE(nullptr, sameScaffold); EXPECT_EQ(scaffold, sameScaffold); } // The same scaffold is supposed to still be around because of the device { std::shared_ptr sameScaffold = lastScaffold.lock(); EXPECT_NE(nullptr, sameScaffold); std::shared_ptr scaffold = RawMultiAxisScaffold::getOrCreateSharedInstance(); EXPECT_NE(nullptr, scaffold) << "The scaffold was not retrieved!"; EXPECT_EQ(sameScaffold, scaffold); } // the device and the scaffold are about to get destroyed } { std::shared_ptr deadScaffold = lastScaffold.lock(); EXPECT_EQ(nullptr, deadScaffold); } { std::shared_ptr device = std::make_shared("TestRawMultiAxis"); ASSERT_NE(nullptr, device) << "Device creation failed."; ASSERT_TRUE(device->initialize()) << "Initialization failed. Didn't this work a moment ago?"; std::shared_ptr scaffold = RawMultiAxisScaffold::getOrCreateSharedInstance(); EXPECT_NE(nullptr, scaffold) << "The scaffold was not retrieved!"; std::shared_ptr deadScaffold = lastScaffold.lock(); EXPECT_EQ(nullptr, deadScaffold); } } TEST(RawMultiAxisScaffoldTest, CreateDeviceSeveralTimes) { std::weak_ptr lastScaffold; for (int i = 0; i < 6; ++i) { SCOPED_TRACE(i); EXPECT_EQ(nullptr, lastScaffold.lock()); std::shared_ptr device = std::make_shared("TestRawMultiAxis"); ASSERT_NE(nullptr, device) << "Device creation failed."; ASSERT_TRUE(device->initialize()) << "Initialization failed. Is a RawMultiAxis device plugged in?"; std::shared_ptr scaffold = RawMultiAxisScaffold::getOrCreateSharedInstance(); ASSERT_NE(nullptr, scaffold) << "The scaffold was not retrieved!"; lastScaffold = scaffold; // the device and the scaffold will be destroyed here } } TEST(RawMultiAxisScaffoldTest, CreateDeviceSeveralTimesWithScaffoldRef) { std::shared_ptr lastScaffold; for (int i = 0; i < 6; ++i) { SCOPED_TRACE(i); std::shared_ptr device = std::make_shared("TestRawMultiAxis"); ASSERT_NE(nullptr, device) << "Device creation failed."; ASSERT_TRUE(device->initialize()) << "Initialization failed. Is a RawMultiAxis device plugged in?"; std::shared_ptr scaffold = RawMultiAxisScaffold::getOrCreateSharedInstance(); ASSERT_NE(nullptr, scaffold) << "The scaffold was not retrieved!"; if (! lastScaffold) { lastScaffold = scaffold; } EXPECT_EQ(lastScaffold, scaffold); // the device will be destroyed here, but the scaffold stays around because we have a shared_ptr to it. } } opensurgsim-0.7.0/SurgSim/Devices/MultiAxis/VisualTest/000077500000000000000000000000001277777236100231115ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Devices/MultiAxis/VisualTest/CMakeLists.txt000066400000000000000000000024601277777236100256530ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. set(EXAMPLE_SOURCES main.cpp ) set(EXAMPLE_HEADERS ) set(RAW_EXAMPLE_SOURCES raw_test_main.cpp ) set(RAW_EXAMPLE_HEADERS ) set(LIBS IdentityPoseDevice MultiAxisDevice SurgSimInput VisualTestCommon ) surgsim_add_executable(MultiAxisVisualTest "${EXAMPLE_SOURCES}" "${EXAMPLE_HEADERS}") target_link_libraries(MultiAxisVisualTest ${LIBS}) surgsim_add_executable(RawMultiAxisVisualTest "${RAW_EXAMPLE_SOURCES}" "${RAW_EXAMPLE_HEADERS}") target_link_libraries(RawMultiAxisVisualTest ${LIBS}) # Put all projects into folder "Devices" set_target_properties(RawMultiAxisVisualTest PROPERTIES FOLDER "Devices") set_target_properties(MultiAxisVisualTest PROPERTIES FOLDER "Devices") opensurgsim-0.7.0/SurgSim/Devices/MultiAxis/VisualTest/main.cpp000066400000000000000000000035701277777236100245460ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Input/DeviceInterface.h" #include "SurgSim/Devices/MultiAxis/MultiAxisDevice.h" #include "SurgSim/Devices/IdentityPoseDevice/IdentityPoseDevice.h" #include "SurgSim/Testing/VisualTestCommon/ToolSquareTest.h" using SurgSim::Input::DeviceInterface; using SurgSim::Devices::MultiAxisDevice; using SurgSim::Devices::IdentityPoseDevice; int main(int argc, char** argv) { std::shared_ptr toolDevice = std::make_shared("MultiAxisDevice"); //toolDevice->setPositionScale(0.0002); //toolDevice->setOrientationScale(0.005); //toolDevice->setAxisDominance(false); // The square is controlled by a second device. For a simple test, we're using an IdentityPoseDevice-- // a pretend device that doesn't actually move. std::shared_ptr squareDevice = std::make_shared("IdentityPoseDevice"); runToolSquareTest(toolDevice, squareDevice, //2345678901234567890123456789012345678901234567890123456789012345678901234567890 "Move the multi-axis device (e.g. 3DConnexion) to move the sphere tool."); std::cout << std::endl << "Exiting." << std::endl; // Cleanup and shutdown will happen automatically as objects go out of scope. return 0; } opensurgsim-0.7.0/SurgSim/Devices/MultiAxis/VisualTest/raw_test_main.cpp000066400000000000000000000036011277777236100264510ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Input/DeviceInterface.h" #include "SurgSim/Devices/MultiAxis/RawMultiAxisDevice.h" #include "SurgSim/Devices/IdentityPoseDevice/IdentityPoseDevice.h" #include "SurgSim/Testing/VisualTestCommon/ToolSquareTest.h" using SurgSim::Input::DeviceInterface; using SurgSim::Devices::RawMultiAxisDevice; using SurgSim::Devices::IdentityPoseDevice; int main(int argc, char** argv) { std::shared_ptr toolDevice = std::make_shared("RawMultiAxisDevice"); toolDevice->setPositionScale(0.0002); toolDevice->setOrientationScale(0.005); toolDevice->setAxisDominance(false); // The square is controlled by a second device. For a simple test, we're using an IdentityPoseDevice-- // a pretend device that doesn't actually move. std::shared_ptr squareDevice = std::make_shared("IdentityPoseDevice"); runToolSquareTest(toolDevice, squareDevice, //2345678901234567890123456789012345678901234567890123456789012345678901234567890 "Move the multi-axis device (e.g. 3DConnexion) to move the sphere tool."); std::cout << std::endl << "Exiting." << std::endl; // Cleanup and shutdown will happen automatically as objects go out of scope. return 0; } opensurgsim-0.7.0/SurgSim/Devices/MultiAxis/linux/000077500000000000000000000000001277777236100221455ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Devices/MultiAxis/linux/CreateInputDeviceHandle.cpp000066400000000000000000000022761277777236100273370ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Devices/MultiAxis/CreateInputDeviceHandle.h" #include "SurgSim/Devices/MultiAxis/linux/InputDeviceHandle.h" namespace SurgSim { namespace Devices { std::unique_ptr createInputDeviceHandle(const std::string& path, std::shared_ptr logger) { return InputDeviceHandle::open(path, logger); } std::vector enumerateInputDevicePaths(SurgSim::Framework::Logger* logger) { return InputDeviceHandle::enumeratePaths(logger); } }; // namespace Devices }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Devices/MultiAxis/linux/FileDescriptor.cpp000066400000000000000000000065601277777236100255760ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Devices/MultiAxis/linux/FileDescriptor.h" #include #include #include #include #include #include #include "SurgSim/Framework/Assert.h" namespace SurgSim { namespace Devices { FileDescriptor::FileDescriptor() : m_descriptor(INVALID_VALUE), m_canRead(false), m_canWrite(false) { } FileDescriptor::FileDescriptor(FileDescriptor&& other) : m_descriptor(other.m_descriptor), m_canRead(other.m_canRead), m_canWrite(other.m_canWrite) { other.m_descriptor = INVALID_VALUE; // take ownership } FileDescriptor& FileDescriptor::operator=(FileDescriptor&& other) { m_descriptor = other.m_descriptor; m_canRead = other.m_canRead; m_canWrite = other.m_canWrite; other.m_descriptor = INVALID_VALUE; // take ownership return *this; } FileDescriptor::~FileDescriptor() { reset(); } bool FileDescriptor::isValid() const { return (m_descriptor != INVALID_VALUE); } bool FileDescriptor::canRead() const { return isValid() && m_canRead; } bool FileDescriptor::canWrite() const { return isValid() && m_canWrite; } int FileDescriptor::get() const { SURGSIM_ASSERT(m_descriptor != INVALID_VALUE); return m_descriptor; } bool FileDescriptor::openForReadingAndWriting(const std::string& path) { reset(); m_descriptor = open(path.c_str(), O_RDWR); m_canRead = true; m_canWrite = true; return isValid(); } bool FileDescriptor::openForReading(const std::string& path) { reset(); m_descriptor = open(path.c_str(), O_RDONLY); m_canRead = true; m_canWrite = false; return isValid(); } bool FileDescriptor::openForWriting(const std::string& path) { reset(); m_descriptor = open(path.c_str(), O_WRONLY); m_canRead = false; m_canWrite = true; return isValid(); } bool FileDescriptor::openForReadingAndMaybeWriting(const std::string& path) { if (! openForReadingAndWriting(path)) { if (! openForReading(path)) { return false; } } return true; } void FileDescriptor::reset() { if (m_descriptor != INVALID_VALUE) { close(m_descriptor); m_descriptor = INVALID_VALUE; } } bool FileDescriptor::hasDataToRead() const { if (! canRead()) { return false; } struct pollfd pollData[1]; pollData[0].fd = m_descriptor; pollData[0].events = POLLIN; //const int timeoutMsec = 10; const int nonBlockingOnly = 0; int status = poll(pollData, 1, nonBlockingOnly); return (status > 0); } bool FileDescriptor::readBytes(void* dataBuffer, size_t bytesToRead, size_t* bytesActuallyRead) { SURGSIM_ASSERT(canRead()); ssize_t numBytesRead = read(m_descriptor, dataBuffer, bytesToRead); if (numBytesRead < 0) { *bytesActuallyRead = 0; return false; } else { *bytesActuallyRead = numBytesRead; return true; } } }; // namespace Devices }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Devices/MultiAxis/linux/FileDescriptor.h000066400000000000000000000076521277777236100252460ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DEVICES_MULTIAXIS_LINUX_FILEDESCRIPTOR_H #define SURGSIM_DEVICES_MULTIAXIS_LINUX_FILEDESCRIPTOR_H #include namespace SurgSim { namespace Devices { /// A wrapper for an UNIX-style integer file descriptor. /// Allows callers to implement RAII-style resource management. class FileDescriptor { public: /// Default constructor. /// Initializes the file descriptor to an invalid state. FileDescriptor(); /// Move constructor. /// \param [in,out] other The object to move. The original object will be invalidated. FileDescriptor(FileDescriptor&& other); /// Move assignment operator. /// \param [in,out] other The object to move. The original object will be invalidated. /// \return A reference to this object. FileDescriptor& operator=(FileDescriptor&& other); /// Destructor. ~FileDescriptor(); /// Checks if the file descriptor is valid, i.e. has been opened. /// \return true if valid, false if not. bool isValid() const; /// Determines if the file descriptor can be read from. /// \return true if the descriptor has been open for reading. bool canRead() const; /// Determines if the file descriptor can be written to. /// \return true if the descriptor has been open for writing. bool canWrite() const; /// Checks whether this object has data available to be read. /// \return true if there is data currently available. bool hasDataToRead() const; /// Reads bytes from the file descriptor. /// \param [out] dataBuffer Buffer to read into. Must have room for at least bytesToRead bytes of data. /// \param bytesToRead The number of bytes to try reading. Actual number of bytes received may be smaller. /// \param [out] bytesActuallyRead The number of bytes that were actually read into the buffer. /// \return true if it succeeds, false if it fails. bool readBytes(void* dataBuffer, size_t bytesToRead, size_t* bytesActuallyRead); /// Gets the raw underlying OS file descriptor. /// \return The raw file descriptor. int get() const; /// Attempts to open the file descriptor for reading and writing. /// \param path Full pathname of the file. /// \return true if it succeeds, false if it fails. bool openForReadingAndWriting(const std::string& path); /// Attempts to open the file descriptor for reading only. /// \param path Full pathname of the file. /// \return true if it succeeds, false if it fails. bool openForReading(const std::string& path); /// Attempts to open the file descriptor for writing only. /// \param path Full pathname of the file. /// \return true if it succeeds, false if it fails. bool openForWriting(const std::string& path); /// Attempts to open the file descriptor for reading and (if permissions allow it) writing. /// \param path Full pathname of the file. /// \return true if it succeeds, false if it fails. bool openForReadingAndMaybeWriting(const std::string& path); /// Resets the file descriptor back to an invalid state. /// If the descriptor was open, it will be closed. void reset(); private: FileDescriptor(const FileDescriptor& other) = delete; FileDescriptor& operator=(const FileDescriptor& other) = delete; static const int INVALID_VALUE = -1; int m_descriptor; bool m_canRead; bool m_canWrite; }; }; // namespace Devices }; // namespace SurgSim #endif // SURGSIM_DEVICES_MULTIAXIS_LINUX_FILEDESCRIPTOR_H opensurgsim-0.7.0/SurgSim/Devices/MultiAxis/linux/GetSystemError.cpp000066400000000000000000000037531277777236100256170ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Devices/MultiAxis/GetSystemError.h" #include #include namespace SurgSim { namespace Devices { namespace Internal { int64_t getSystemErrorCode() { return errno; } // Helps retrieve the output location for the XSI version of strerror_r. static inline const char* systemErrorTextHelper(const char* buffer, int returnValue) { if (returnValue != 0) { return nullptr; } return buffer; } // Helps retrieve the output location for the GNU version of strerror_r. static inline const char* systemErrorTextHelper(const char* buffer, const char* returnValue) { return returnValue; } std::string getSystemErrorText(int64_t errorCode) { const size_t BUFFER_SIZE = 1024; char errorBuffer[BUFFER_SIZE]; errorBuffer[0] = '\0'; // Unfortunately, on Linux you can't really know if you will get the XSI version or the GNU version of // strerror_r. Fortunately, the arguments are the same (only return type differs), so we can cheat. const char* message = systemErrorTextHelper(errorBuffer, strerror_r(errorCode, errorBuffer, sizeof(errorBuffer))); if (message == nullptr || message[0] == '\0') { snprintf(errorBuffer, sizeof(errorBuffer), "", static_cast(errorCode)); message = errorBuffer; } return std::string(message); } }; // namespace Internal }; // namespace Devices }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Devices/MultiAxis/linux/InputDeviceHandle.cpp000066400000000000000000000225031277777236100262060ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Devices/MultiAxis/linux/InputDeviceHandle.h" #include #include #include #include "SurgSim/Devices/MultiAxis/GetSystemError.h" #include "SurgSim/Devices/MultiAxis/BitSetBuffer.h" #include "SurgSim/Devices/MultiAxis/linux/FileDescriptor.h" #include "SurgSim/Framework/Log.h" using SurgSim::Devices::Internal::getSystemErrorCode; using SurgSim::Devices::Internal::getSystemErrorText; namespace SurgSim { namespace Devices { struct InputDeviceHandle::State { public: explicit State(std::shared_ptr&& logger_) : logger(std::move(logger_)), handle() { buttonCodes.fill(-1); } /// The logger to use. std::shared_ptr logger; /// The underlying device file descriptor. FileDescriptor handle; /// Event library button code corresponding to each index. std::array buttonCodes; private: // Prevent copy construction and copy assignment. State(const State& other) = delete; State& operator=(const State& other) = delete; }; InputDeviceHandle::InputDeviceHandle(std::shared_ptr&& logger) : m_state(new InputDeviceHandle::State(std::move(logger))) { } InputDeviceHandle::~InputDeviceHandle() { } std::vector InputDeviceHandle::enumeratePaths(SurgSim::Framework::Logger* logger) { std::vector results; for (int i = 0; i < 100; ++i) { char devicePath[128]; snprintf(devicePath, sizeof(devicePath), "/dev/input/event%d", i); FileDescriptor handle; if (! handle.openForReadingAndMaybeWriting(devicePath)) { int error = errno; if (error != ENOENT) { SURGSIM_LOG_INFO(logger) << "InputDeviceHandle::enumeratePaths: Could not open device " << devicePath << ": error " << error << ", " << getSystemErrorText(error); } continue; } results.push_back(devicePath); } return results; } std::unique_ptr InputDeviceHandle::open( const std::string& path, std::shared_ptr logger) { std::unique_ptr object(new InputDeviceHandle(std::move(logger))); if (! object->m_state->handle.openForReadingAndMaybeWriting(path)) { object.reset(); // could not open the device handle; destroy the object again } else { const std::vector buttonCodeList = object->getDeviceButtonsAndKeys(); for (size_t i = 0; (i < object->m_state->buttonCodes.size()) && (i < buttonCodeList.size()); ++i) { object->m_state->buttonCodes[i] = buttonCodeList[i]; } for (size_t i = buttonCodeList.size(); i < object->m_state->buttonCodes.size(); ++i) { object->m_state->buttonCodes[i] = -1; } } return object; } std::string InputDeviceHandle::getDeviceName() const { char reportedName[1024]; if (ioctl(m_state->handle.get(), EVIOCGNAME(sizeof(reportedName)), reportedName) < 0) { int error = errno; SURGSIM_LOG_DEBUG(m_state->logger) << "InputDeviceHandle: ioctl(EVIOCGNAME): error " << error << ", " << getSystemErrorText(error); snprintf(reportedName, sizeof(reportedName), "???"); } else { reportedName[sizeof(reportedName)-1] = '\0'; } return std::string(reportedName); } bool InputDeviceHandle::getDeviceIds(int* vendorId, int* productId) const { struct input_id reportedId; if (ioctl(m_state->handle.get(), EVIOCGID, &reportedId) < 0) { int error = errno; SURGSIM_LOG_DEBUG(m_state->logger) << "InputDeviceHandle: ioctl(EVIOCGID): error " << error << ", " << getSystemErrorText(error); *vendorId = *productId = -1; return false; } *vendorId = reportedId.vendor; *productId = reportedId.product; return true; } bool InputDeviceHandle::hasAbsoluteTranslationAndRotationAxes() const { BitSetBuffer buffer; if (ioctl(m_state->handle.get(), EVIOCGBIT(EV_ABS, buffer.sizeBytes()), buffer.getPointer()) == -1) { int error = errno; SURGSIM_LOG_DEBUG(m_state->logger) << "InputDeviceHandle: ioctl(EVIOCGBIT(EV_ABS)): error " << error << ", " << getSystemErrorText(error); return false; } if (! buffer.test(ABS_X) || ! buffer.test(ABS_Y) || ! buffer.test(ABS_Z) || ! buffer.test(ABS_RX) || ! buffer.test(ABS_RY) || ! buffer.test(ABS_RZ)) { SURGSIM_LOG_DEBUG(m_state->logger) << "InputDeviceHandle: does not have the 6 absolute axes."; return false; } int numIgnoredAxes = 0; for (size_t i = 0; i < ABS_CNT; ++i) { if (buffer.test(i)) { if ((i != ABS_X) && (i != ABS_Y) && (i != ABS_Z) && (i != ABS_RX) && (i != ABS_RY) && (i != ABS_RZ)) { ++numIgnoredAxes; } } } if (numIgnoredAxes) { SURGSIM_LOG_INFO(m_state->logger) << "InputDeviceHandle: has absolute translation and rotation axes;" << " ignoring " << numIgnoredAxes << " additional axes."; } return true; } bool InputDeviceHandle::hasRelativeTranslationAndRotationAxes() const { BitSetBuffer buffer; if (ioctl(m_state->handle.get(), EVIOCGBIT(EV_REL, buffer.sizeBytes()), buffer.getPointer()) == -1) { int error = errno; SURGSIM_LOG_DEBUG(m_state->logger) << "InputDeviceHandle: ioctl(EVIOCGBIT(EV_REL)): error " << error << ", " << getSystemErrorText(error); return false; } if (! buffer.test(REL_X) || ! buffer.test(REL_Y) || ! buffer.test(REL_Z) || ! buffer.test(REL_RX) || ! buffer.test(REL_RY) || ! buffer.test(REL_RZ)) { SURGSIM_LOG_DEBUG(m_state->logger) << "InputDeviceHandle: does not have the 6 relative axes."; return false; } int numIgnoredAxes = 0; for (size_t i = 0; i < REL_CNT; ++i) { if (buffer.test(i)) { if ((i != REL_X) && (i != REL_Y) && (i != REL_Z) && (i != REL_RX) && (i != REL_RY) && (i != REL_RZ)) { ++numIgnoredAxes; } } } if (numIgnoredAxes) { SURGSIM_LOG_INFO(m_state->logger) << "InputDeviceHandle: has relative translation and rotation axes;" << " ignoring " << numIgnoredAxes << " additional axes."; } return true; } bool InputDeviceHandle::hasTranslationAndRotationAxes() const { return hasAbsoluteTranslationAndRotationAxes() || hasRelativeTranslationAndRotationAxes(); } bool InputDeviceHandle::updateStates(AxisStates* axisStates, ButtonStates* buttonStates, bool* updated) { *updated = false; while (m_state->handle.hasDataToRead()) { struct input_event event; size_t numRead; if (! m_state->handle.readBytes(&event, sizeof(event), &numRead)) { int64_t error = getSystemErrorCode(); if (error == ENODEV) { SURGSIM_LOG_SEVERE(m_state->logger) << "InputDeviceHandle: read failed; device has been disconnected! (stopping)"; return false; // stop updating this device! } else { SURGSIM_LOG_WARNING(m_state->logger) << "InputDeviceHandle: read failed with error " << error << ", " << getSystemErrorText(error); } } else if (numRead != sizeof(event)) { SURGSIM_LOG_WARNING(m_state->logger) << "InputDeviceHandle: reading produced " << numRead << " bytes (expected " << sizeof(event) << ")"; } else { if (event.type == EV_REL) { if (event.code >= REL_X && event.code < (REL_X+3)) // Assume that X, Y, Z are consecutive { (*axisStates)[0 + (event.code - REL_X)] = event.value; *updated = true; } else if (event.code >= REL_RX && event.code < (REL_RX+3)) // Assume that RX, RY, RZ are consecutive { (*axisStates)[3 + (event.code - REL_RX)] = event.value; *updated = true; } } else if (event.type == EV_ABS) { if (event.code >= ABS_X && event.code < (ABS_X+3)) // Assume that X, Y, Z are consecutive { (*axisStates)[0 + (event.code - ABS_X)] = event.value; *updated = true; } else if (event.code >= ABS_RX && event.code < (ABS_RX+3)) // Assume that RX, RY, RZ are consecutive { (*axisStates)[3 + (event.code - ABS_RX)] = event.value; *updated = true; } } else if (event.type == EV_KEY) { for (size_t i = 0; i < m_state->buttonCodes.size(); ++i) { if (event.code == m_state->buttonCodes[i]) { (*buttonStates)[i] = (event.value != 0); *updated = true; break; } } } } } return true; } std::vector InputDeviceHandle::getDeviceButtonsAndKeys() { std::vector result; BitSetBuffer buffer; if (ioctl(m_state->handle.get(), EVIOCGBIT(EV_KEY, buffer.sizeBytes()), buffer.getPointer()) == -1) { int error = errno; SURGSIM_LOG_DEBUG(m_state->logger) << "InputDeviceHandle: ioctl(EVIOCGBIT(EV_KEY)): error " << error << ", " << getSystemErrorText(error); return result; } // Start listing buttons/keys from BTN_0; then go back and cover the earlier ones. for (int i = BTN_0; i < KEY_CNT; ++i) { if (buffer.test(i)) { result.push_back(i); } } for (int i = 0; i < BTN_0; ++i) { if (buffer.test(i)) { result.push_back(i); } } return result; } }; // namespace Devices }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Devices/MultiAxis/linux/InputDeviceHandle.h000066400000000000000000000060231277777236100256520ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DEVICES_MULTIAXIS_LINUX_INPUTDEVICEHANDLE_H #define SURGSIM_DEVICES_MULTIAXIS_LINUX_INPUTDEVICEHANDLE_H #include #include #include #include #include "SurgSim/Devices/MultiAxis/SystemInputDeviceHandle.h" namespace SurgSim { namespace Framework { class Logger; }; // namespace Framework namespace Devices { /// Access to an input/HID device using the Input API in Linux. /// \sa SystemInputDeviceHandle class InputDeviceHandle : public SystemInputDeviceHandle { public: /// Destructor. ~InputDeviceHandle(); /// Enumerates input devices. /// \param logger The logger to be used during enumeration. /// \return A list of device paths. static std::vector enumeratePaths(SurgSim::Framework::Logger* logger); /// Opens the given path and creates an access wrapper for the device. /// \param path Full pathname for the device. /// \param logger The logger to be used by the device. /// \return The created device object, or an empty unique_ptr on failure. static std::unique_ptr open(const std::string& path, std::shared_ptr logger); std::string getDeviceName() const override; bool getDeviceIds(int* vendorId, int* productId) const override; bool hasTranslationAndRotationAxes() const override; bool updateStates(AxisStates* axisStates, ButtonStates* buttonStates, bool* updated) override; private: /// Constructor. /// Cannot be called directly. /// \sa open explicit InputDeviceHandle(std::shared_ptr&& logger); // Prevent copy construction and copy assignment. InputDeviceHandle(const InputDeviceHandle& other) = delete; InputDeviceHandle& operator=(const InputDeviceHandle& other) = delete; /// Gets the indices of the available device buttons. /// \return a vector of indices. std::vector getDeviceButtonsAndKeys(); /// Query if this device has 3 translation and 3 rotation {\em absolute} axes. /// \return true if the desired axes are present. bool hasAbsoluteTranslationAndRotationAxes() const; /// Query if this device has 3 translation and 3 rotation {\em relative} axes. /// \return true if the desired axes are present. bool hasRelativeTranslationAndRotationAxes() const; struct State; std::unique_ptr m_state; }; }; // namespace Devices }; // namespace SurgSim #endif // SURGSIM_DEVICES_MULTIAXIS_LINUX_INPUTDEVICEHANDLE_H opensurgsim-0.7.0/SurgSim/Devices/MultiAxis/udev-rules/000077500000000000000000000000001277777236100231015ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Devices/MultiAxis/udev-rules/90-3dconnexion.rules000066400000000000000000000040121277777236100266270ustar00rootroot00000000000000# Rules for the Logitech 3DConnexion SpaceNavigator and related devices. # By default, any user can read from and write to the devices. # The ID mappings taken from # http://www.3dconnexion.com/index.php?id=200&faq_red=faq/27 # KERNEL=="event[0-9]*", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c603", MODE="0666", GROUP="plugdev", SYMLINK+="input/spacemouse_plus", SYMLINK+="input/3dconnexion" KERNEL=="event[0-9]*", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c605", MODE="0666", GROUP="plugdev", SYMLINK+="input/cadman", SYMLINK+="input/3dconnexion" KERNEL=="event[0-9]*", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c606", MODE="0666", GROUP="plugdev", SYMLINK+="input/spacemouse_classic", SYMLINK+="input/3dconnexion" # KERNEL=="event[0-9]*", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c621", MODE="0666", GROUP="plugdev", SYMLINK+="input/spaceball5000", SYMLINK+="input/3dconnexion" KERNEL=="event[0-9]*", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c623", MODE="0666", GROUP="plugdev", SYMLINK+="input/spacetraveler", SYMLINK+="input/3dconnexion" KERNEL=="event[0-9]*", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c625", MODE="0666", GROUP="plugdev", SYMLINK+="input/spacepilot", SYMLINK+="input/3dconnexion" KERNEL=="event[0-9]*", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c626", MODE="0666", GROUP="plugdev", SYMLINK+="input/spacenavigator", SYMLINK+="input/3dconnexion" KERNEL=="event[0-9]*", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c627", MODE="0666", GROUP="plugdev", SYMLINK+="input/spaceexplorer", SYMLINK+="input/3dconnexion" KERNEL=="event[0-9]*", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c628", MODE="0666", GROUP="plugdev", SYMLINK+="input/spacenavigator_notebooks", SYMLINK+="input/3dconnexion" KERNEL=="event[0-9]*", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c629", MODE="0666", GROUP="plugdev", SYMLINK+="input/spacepilot_pro", SYMLINK+="input/3dconnexion" KERNEL=="event[0-9]*", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c62b", MODE="0666", GROUP="plugdev", SYMLINK+="input/spacemouse_pro", SYMLINK+="input/3dconnexion" opensurgsim-0.7.0/SurgSim/Devices/MultiAxis/win32/000077500000000000000000000000001277777236100217505ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Devices/MultiAxis/win32/CreateInputDeviceHandle.cpp000066400000000000000000000023011277777236100271270ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Devices/MultiAxis/CreateInputDeviceHandle.h" #include "SurgSim/Devices/MultiAxis/win32/WdkHidDeviceHandle.h" namespace SurgSim { namespace Devices { std::unique_ptr createInputDeviceHandle(const std::string& path, std::shared_ptr logger) { return WdkHidDeviceHandle::open(path, logger); } std::vector enumerateInputDevicePaths(SurgSim::Framework::Logger* logger) { return WdkHidDeviceHandle::enumeratePaths(logger); } }; // namespace Devices }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Devices/MultiAxis/win32/FileHandle.cpp000066400000000000000000000104551277777236100244540ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Devices/MultiAxis/win32/FileHandle.h" #undef _WIN32_WINNT #define _WIN32_WINNT 0x0501 // request Windows XP-compatible SDK APIs #undef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN // do not automatically include WinSock 1 and some other header files #include #include #include "SurgSim/Framework/Assert.h" namespace SurgSim { namespace Devices { // TODO(advornik): This would be a perfect use for "constexpr", but VS 2012 doesn't support it... static const FileHandle::RawHandleType INVALID_VALUE = INVALID_HANDLE_VALUE; FileHandle::FileHandle() : m_handle(INVALID_VALUE), m_canRead(false), m_canWrite(false), m_openFlags(0) { } FileHandle::FileHandle(FileHandle&& other) : m_handle(other.m_handle), m_canRead(other.m_canRead), m_canWrite(other.m_canWrite), m_openFlags(other.m_openFlags) { other.m_handle = INVALID_VALUE; // take ownership } FileHandle& FileHandle::operator=(FileHandle&& other) { m_handle = other.m_handle; m_canRead = other.m_canRead; m_canWrite = other.m_canWrite; m_openFlags = other.m_openFlags; other.m_handle = INVALID_VALUE; // take ownership return *this; } FileHandle::~FileHandle() { reset(); } bool FileHandle::isValid() const { return (m_handle && (m_handle != INVALID_VALUE)); } bool FileHandle::canRead() const { return isValid() && m_canRead; } bool FileHandle::canWrite() const { return isValid() && m_canWrite; } FileHandle::RawHandleType FileHandle::get() const { SURGSIM_ASSERT(isValid()); return m_handle; } bool FileHandle::openForReadingAndWriting(const std::string& path) { reset(); m_handle = CreateFile(path.c_str(), GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | static_cast(m_openFlags), NULL); m_canRead = true; m_canWrite = true; return isValid(); } bool FileHandle::openForReading(const std::string& path) { reset(); m_handle = CreateFile(path.c_str(), GENERIC_READ | SYNCHRONIZE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | static_cast(m_openFlags), NULL); m_canRead = true; m_canWrite = false; return isValid(); } bool FileHandle::openForWriting(const std::string& path) { reset(); m_handle = CreateFile(path.c_str(), GENERIC_WRITE | SYNCHRONIZE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | static_cast(m_openFlags), NULL); m_canRead = false; m_canWrite = true; return isValid(); } bool FileHandle::openForReadingAndMaybeWriting(const std::string& path) { if (! openForReadingAndWriting(path)) { if (! openForReading(path)) { return false; } } return true; } void FileHandle::reset() { if (m_handle != INVALID_VALUE) { CloseHandle(m_handle); m_handle = INVALID_VALUE; } } void FileHandle::setFileOpenFlags(uint64_t flags) { SURGSIM_ASSERT(! isValid()) << "Flags need to be set before the file is opened!"; m_openFlags = flags; } uint64_t FileHandle::getFileOpenFlags() const { return m_openFlags; } bool FileHandle::hasDataToRead() const { if (! canRead()) { return false; } //const DWORD timeoutMsec = 10; const DWORD nonBlockingOnly = 0; DWORD status = WaitForSingleObject(m_handle, nonBlockingOnly); return (status == WAIT_OBJECT_0); } bool FileHandle::readBytes(void* dataBuffer, unsigned int bytesToRead, unsigned int* bytesActuallyRead) { SURGSIM_ASSERT(canRead()); DWORD numBytesRead = 0; if (ReadFile(m_handle, dataBuffer, bytesToRead, &numBytesRead, NULL) != TRUE) { *bytesActuallyRead = 0; return false; } else { *bytesActuallyRead = numBytesRead; return true; } } }; // namespace Devices }; // namespace SurgSimopensurgsim-0.7.0/SurgSim/Devices/MultiAxis/win32/FileHandle.h000066400000000000000000000110061277777236100241120ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DEVICES_MULTIAXIS_WIN32_FILEHANDLE_H #define SURGSIM_DEVICES_MULTIAXIS_WIN32_FILEHANDLE_H #include #include namespace SurgSim { namespace Devices { /// A wrapper for an Windows-style HANDLE file descriptor. /// Allows callers to implement RAII-style resource management. class FileHandle { public: /// Type of the raw handle used by the operating system. /// Defined this way to avoid including just for the sake of defining HANDLE. typedef void* RawHandleType; /// Default constructor. /// Initializes the file handle to an invalid state. FileHandle(); /// Move constructor. /// \param [in,out] other The object to move. The original object will be invalidated. FileHandle(FileHandle&& other); /// Move assignment operator. /// \param [in,out] other The object to move. The original object will be invalidated. /// \return A reference to this object. FileHandle& operator=(FileHandle&& other); /// Destructor. ~FileHandle(); /// Checks if the file handle is valid, i.e. has been opened. /// \return true if valid, false if not. bool isValid() const; /// Determines if the file handle can be read from. /// \return true if the handle has been open for reading. bool canRead() const; /// Determines if the file handle can be written to. /// \return true if the handle has been open for writing. bool canWrite() const; /// Checks whether this object has data available to be read. /// \return true if there is data currently available. bool hasDataToRead() const; /// Reads bytes from the file handle. /// \param [out] dataBuffer Buffer to read into. Must have room for at least bytesToRead bytes of data. /// \param bytesToRead The number of bytes to try reading. Actual number of bytes received may be smaller. /// \param [out] bytesActuallyRead The number of bytes that were actually read into the buffer. /// \return true if it succeeds, false if it fails. bool readBytes(void* dataBuffer, unsigned int bytesToRead, unsigned int* bytesActuallyRead); /// Gets the raw underlying OS file handle. /// \return The raw file handle. RawHandleType get() const; /// Attempts to open the file handle for reading and writing. /// \param path Full pathname of the file. /// \return true if it succeeds, false if it fails. bool openForReadingAndWriting(const std::string& path); /// Attempts to open the file handle for reading only. /// \param path Full pathname of the file. /// \return true if it succeeds, false if it fails. bool openForReading(const std::string& path); /// Attempts to open the file handle for writing only. /// \param path Full pathname of the file. /// \return true if it succeeds, false if it fails. bool openForWriting(const std::string& path); /// Attempts to open the file handle for reading and (if permissions allow it) writing. /// \param path Full pathname of the file. /// \return true if it succeeds, false if it fails. bool openForReadingAndMaybeWriting(const std::string& path); /// Sets the flags that will be passed to CreateFile when opening the file. /// \param flags The flags, a combination of zero or more Windows FILE_FLAG_* flags. void setFileOpenFlags(uint64_t flags); /// Gets the flags that will be passed to CreateFile when opening the file. /// \return The value passed to setFileOpenFlags (or if never set, a default value). uint64_t getFileOpenFlags() const; /// Resets the file handle back to an invalid state. /// If the handle was open, it will be closed. void reset(); private: // Prevent copy construction and copy assignment. (VS2012 does not support "= delete" yet.) FileHandle(const FileHandle& other) /*= delete*/; FileHandle& operator=(const FileHandle& other) /*= delete*/; RawHandleType m_handle; bool m_canRead; bool m_canWrite; uint64_t m_openFlags; }; }; // namespace Devices }; // namespace SurgSim #endif // SURGSIM_DEVICES_MULTIAXIS_WIN32_FILEHANDLE_H opensurgsim-0.7.0/SurgSim/Devices/MultiAxis/win32/GetSystemError.cpp000066400000000000000000000037661277777236100254260ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Devices/MultiAxis/GetSystemError.h" #undef _WIN32_WINNT #define _WIN32_WINNT 0x0501 // request Windows XP-compatible SDK APIs #undef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN // do not automatically include WinSock 1 and some other header files #include namespace SurgSim { namespace Devices { namespace Internal { int64_t getSystemErrorCode() { return GetLastError(); } std::string getSystemErrorText(int64_t errorCode) { const size_t BUFFER_SIZE = 1024; char errorBuffer[BUFFER_SIZE]; if (FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, 0, static_cast(errorCode), 0, errorBuffer, BUFFER_SIZE-1, nullptr) <= 0) { _snprintf(errorBuffer, BUFFER_SIZE, "", static_cast(errorCode)); } errorBuffer[BUFFER_SIZE-1] = '\0'; // Strip terminal whitespace, if any. // Note that this approach only works for fixed-width characters, which is why we use the ASCII API above. const size_t end = strnlen(errorBuffer, BUFFER_SIZE-1); if ((end > 0) && isspace(errorBuffer[end-1])) { size_t lastWhitespace = end - 1; while ((lastWhitespace > 0) && isspace(errorBuffer[lastWhitespace-1])) { --lastWhitespace; } errorBuffer[lastWhitespace] = '\0'; } return std::string(errorBuffer); } }; // namespace Internal }; // namespace Devices }; // namespace SurgSimopensurgsim-0.7.0/SurgSim/Devices/MultiAxis/win32/WdkHidDeviceHandle.cpp000066400000000000000000000433061277777236100260700ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Devices/MultiAxis/win32/WdkHidDeviceHandle.h" #undef _WIN32_WINNT #define _WIN32_WINNT 0x0501 // request Windows XP-compatible SDK APIs #undef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN // do not automatically include WinSock 1 and some other header files #include #include extern "C" { // sigh... #include } #include #include "SurgSim/Devices/MultiAxis/GetSystemError.h" #include "SurgSim/Devices/MultiAxis/win32/FileHandle.h" #include "SurgSim/Framework/Log.h" using SurgSim::Devices::Internal::getSystemErrorCode; using SurgSim::Devices::Internal::getSystemErrorText; namespace SurgSim { namespace Devices { // Usage page and usage IDs for interface devices; see e.g. http://www.usb.org/developers/devclass_docs/Hut1_12v2.pdf enum UsagePageConstants { DEV_USAGE_PAGE_GENERIC_DESKTOP = 0x01 // Generic Desktop usage page }; enum UsageConstants { // Usages for the DEV_USAGE_PAGE_GENERIC_DESKTOP usage page: DEV_USAGE_ID_MOUSE = 0x02, // Mouse usage ID DEV_USAGE_ID_JOYSTICK = 0x04, // Joystick usage ID DEV_USAGE_ID_GAME_PAD = 0x05, // Game Pad usage ID DEV_USAGE_ID_KEYBOARD = 0x06, // Keyboard usage ID DEV_USAGE_ID_KEYPAD = 0x07, // Keypad usage ID DEV_USAGE_ID_MULTI_AXIS_CONTROLLER = 0x08 // Multi-axis Controller usage ID }; struct WdkHidDeviceHandle::State { public: explicit State(std::shared_ptr&& logger_) : logger(std::move(logger_)), handle(), isOverlappedReadPending(false), isDeviceDead(false) { } /// The logger to use. std::shared_ptr logger; /// The underlying device file handle. FileHandle handle; /// The OVERLAPPED state structure for overlapped (i.e. asynchronous) reads. OVERLAPPED overlappedReadState; /// The buffer used to store the output of overlapped (i.e. asynchronous) reads. unsigned char overlappedReadBuffer[7*128]; /// True if we are waiting for the result of an overlapped (i.e. asynchronous) read. bool isOverlappedReadPending; /// True if the communication with this device has failed without possibility of recovery. bool isDeviceDead; private: // Prevent copy construction and copy assignment. (VS2012 does not support "= delete" yet.) State(const State& other) /*= delete*/; State& operator=(const State& other) /*= delete*/; }; WdkHidDeviceHandle::WdkHidDeviceHandle(std::shared_ptr&& logger) : m_state(new WdkHidDeviceHandle::State(std::move(logger))) { } WdkHidDeviceHandle::~WdkHidDeviceHandle() { } std::vector WdkHidDeviceHandle::enumeratePaths(SurgSim::Framework::Logger* logger) { std::vector results; // Prepare to iterate over the attached HID devices GUID hidGuid; HidD_GetHidGuid(&hidGuid); HDEVINFO hidDeviceInfo = SetupDiGetClassDevs(&hidGuid, NULL, NULL, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT | DIGCF_PROFILE); if (hidDeviceInfo == INVALID_HANDLE_VALUE) { DWORD error = GetLastError(); SURGSIM_LOG_CRITICAL(logger) << "WdkHidDeviceHandle::enumerate: Failed to query HID devices;" << " SetupDiGetClassDevs() failed with error " << error << ", " << getSystemErrorText(error); return results; } // Loop through the device list, looking for the devices we want for (int hidEnumerationIndex = 0; true; ++hidEnumerationIndex) { // Get the next interface in the list. SP_DEVICE_INTERFACE_DATA deviceInterfaceData; deviceInterfaceData.cbSize = sizeof(deviceInterfaceData); if (! SetupDiEnumDeviceInterfaces(hidDeviceInfo, NULL, &hidGuid, hidEnumerationIndex, &deviceInterfaceData)) { DWORD error = GetLastError(); if (error == ERROR_NO_MORE_ITEMS) { break; } else { SURGSIM_LOG_CRITICAL(logger) << "WdkHidDeviceHandle::enumerate: Failed to query HID devices;" << " SetupDiEnumDeviceInterfaces() failed with error " << error << ", " << getSystemErrorText(error); return results; } } // Find out the required size. DWORD deviceInterfaceDetailSize = 0; if (! SetupDiGetDeviceInterfaceDetail(hidDeviceInfo, &deviceInterfaceData, NULL, 0, &deviceInterfaceDetailSize, NULL)) { DWORD error = GetLastError(); if (error != ERROR_INSUFFICIENT_BUFFER) { SURGSIM_LOG_INFO(logger) << "WdkHidDeviceHandle::enumerate: Failed to get the device detail size," << " device will be ignored; error " << error << ", " << getSystemErrorText(error); continue; } } // Get the device detail (which actually just means the path). SP_DEVICE_INTERFACE_DETAIL_DATA* deviceInterfaceDetail = static_cast(malloc(deviceInterfaceDetailSize)); deviceInterfaceDetail->cbSize = sizeof(*deviceInterfaceDetail); if (! SetupDiGetDeviceInterfaceDetail(hidDeviceInfo, &deviceInterfaceData, deviceInterfaceDetail, deviceInterfaceDetailSize, NULL, NULL)) { DWORD error = GetLastError(); SURGSIM_LOG_INFO(logger) << "WdkHidDeviceHandle::enumerate: Failed to get the HID device detail," << " device will be ignored; error " << error << ", " << getSystemErrorText(error); free(deviceInterfaceDetail); continue; } std::string devicePath(deviceInterfaceDetail->DevicePath); free(deviceInterfaceDetail); FileHandle handle; if (! handle.openForReadingAndMaybeWriting(devicePath)) { DWORD error = GetLastError(); SURGSIM_LOG_INFO(logger) << "WdkHidDeviceHandle::enumerate: Could not open device " << devicePath << ": error " << error << ", " << getSystemErrorText(error); continue; } results.push_back(devicePath); } return results; } std::unique_ptr WdkHidDeviceHandle::open( const std::string& path, std::shared_ptr logger) { std::unique_ptr object(new WdkHidDeviceHandle(std::move(logger))); object->m_state->handle.setFileOpenFlags(FILE_FLAG_OVERLAPPED); // set up the handle for asynchronous I/O if (! object->m_state->handle.openForReadingAndMaybeWriting(path)) { object.reset(); // could not open the device handle; destroy the object again } else { object->m_state->isOverlappedReadPending = false; object->m_state->isDeviceDead = false; } return object; } static std::string convertWideString(const wchar_t* wideString) { char buffer[4096]; int status = WideCharToMultiByte(CP_UTF8, 0, wideString, -1, buffer, sizeof(buffer), nullptr, nullptr); if (! (status > 0 && status < sizeof(buffer))) { _snprintf(buffer, sizeof(buffer), "???"); } return std::string(buffer); } std::string WdkHidDeviceHandle::getDeviceName() const { wchar_t manufacturer[1024]; if (HidD_GetManufacturerString(m_state->handle.get(), manufacturer, sizeof(manufacturer)) != TRUE) { manufacturer[0] = '\0'; } wchar_t product[1024]; if (HidD_GetProductString(m_state->handle.get(), product, sizeof(product)) != TRUE) { product[0] = '\0'; } std::string result(""); if (manufacturer[0]) { result = convertWideString(manufacturer) + " "; } if (product[0]) { result += convertWideString(product); } else { result += "???"; } return result; } bool WdkHidDeviceHandle::getDeviceIds(int* vendorId, int* productId) const { HIDD_ATTRIBUTES attributes; attributes.Size = sizeof(attributes); if (HidD_GetAttributes(m_state->handle.get(), &attributes) != TRUE) { DWORD error = GetLastError(); SURGSIM_LOG_INFO(m_state->logger) << "WdkHidDeviceHandle: Could not get attributes/IDs: error " << error << ", " << getSystemErrorText(error); *vendorId = *productId = -1; return false; } *vendorId = attributes.VendorID; *productId = attributes.ProductID; return true; } bool WdkHidDeviceHandle::getCapabilities(HIDP_CAPS* capabilities) const { PHIDP_PREPARSED_DATA preParsedData = 0; if (HidD_GetPreparsedData(m_state->handle.get(), &preParsedData) != TRUE) { DWORD error = GetLastError(); SURGSIM_LOG_INFO(m_state->logger) << "WdkHidDeviceHandle: Could not get preparsed data: error " << error << ", " << getSystemErrorText(error); return false; } if (HidP_GetCaps(preParsedData, capabilities) != HIDP_STATUS_SUCCESS) { DWORD error = GetLastError(); SURGSIM_LOG_INFO(m_state->logger) << "WdkHidDeviceHandle: Could not get capabilities: error " << error << ", " << getSystemErrorText(error); HidD_FreePreparsedData(preParsedData); return false; } HidD_FreePreparsedData(preParsedData); // don't need the pre-parsed data any more return true; } bool WdkHidDeviceHandle::hasTranslationAndRotationAxes() const { HIDP_CAPS capabilities; if (! getCapabilities(&capabilities)) { // message already shown return false; } if ((capabilities.UsagePage != DEV_USAGE_PAGE_GENERIC_DESKTOP) || (capabilities.Usage != DEV_USAGE_ID_MULTI_AXIS_CONTROLLER)) { SURGSIM_LOG_DEBUG(m_state->logger) << "WdkHidDeviceHandle: device is not a multi-axis controller."; return false; } int numExtraAxes = static_cast(capabilities.NumberInputValueCaps) - 6; if (numExtraAxes < 0) { SURGSIM_LOG_DEBUG(m_state->logger) << "WdkHidDeviceHandle: device does not have 6 input axes."; return false; } else if (numExtraAxes > 0) { SURGSIM_LOG_INFO(m_state->logger) << "WdkHidDeviceHandle: device has more than 6 axes;" << " ignoring " << numExtraAxes << " additional axes."; } return true; } bool WdkHidDeviceHandle::startAsynchronousRead() { SURGSIM_ASSERT(! m_state->isOverlappedReadPending) << "Previous asynchronous read has not been handled!"; memset(&(m_state->overlappedReadState), 0, sizeof(m_state->overlappedReadState)); if (ReadFile(m_state->handle.get(), m_state->overlappedReadBuffer, sizeof(m_state->overlappedReadBuffer), NULL, &(m_state->overlappedReadState)) != TRUE) { DWORD error = GetLastError(); if (error == ERROR_IO_PENDING) { m_state->isOverlappedReadPending = true; } else if (error == ERROR_DEVICE_NOT_CONNECTED) { SURGSIM_LOG_SEVERE(m_state->logger) << "WdkHidDeviceHandle: read failed; device has been disconnected! (stopping)"; m_state->isDeviceDead = true; } else { SURGSIM_LOG_WARNING(m_state->logger) << "WdkHidDeviceHandle: read failed with error " << error << ", " << getSystemErrorText(error); } } else { // Read succeeded synchronously. That means that the read has actually completed, but we still need to // retrieve the returned data using GetOverlappedResult, just like for a pending result. m_state->isOverlappedReadPending = true; } return m_state->isOverlappedReadPending; } bool WdkHidDeviceHandle::finishAsynchronousRead(size_t* numBytesRead) { SURGSIM_ASSERT(m_state->isOverlappedReadPending) << "Asynchronous read has not been started!"; DWORD numRead = 0; if (GetOverlappedResult(m_state->handle.get(), &(m_state->overlappedReadState), &numRead, FALSE) == FALSE) { DWORD error = GetLastError(); if (error == ERROR_IO_INCOMPLETE) { // keep checking for asynchronous I/O completion } else if (error == ERROR_DEVICE_NOT_CONNECTED) { SURGSIM_LOG_SEVERE(m_state->logger) << "WdkHidDeviceHandle: read failed; device has been disconnected! (stopping)"; m_state->isDeviceDead = true; m_state->isOverlappedReadPending = false; } else { SURGSIM_LOG_WARNING(m_state->logger) << "WdkHidDeviceHandle: GetOverlappedResult failed with error " << error << ", " << getSystemErrorText(error); // keep checking for asynchronous I/O completion, I guess } *numBytesRead = 0; return false; } // The read has been completed. m_state->isOverlappedReadPending = false; *numBytesRead = numRead; return true; } void WdkHidDeviceHandle::cancelAsynchronousRead() { if (CancelIo(m_state->handle.get()) == FALSE) { DWORD error = GetLastError(); if (error == ERROR_NOT_FOUND) { // No requests were pending. SURGSIM_LOG_WARNING(m_state->logger) << "WdkHidDeviceHandle: No asynchronous I/O requests were pending when attempting to cancel."; m_state->isOverlappedReadPending = false; } else { SURGSIM_LOG_WARNING(m_state->logger) << "WdkHidDeviceHandle: Could not cancel pending asynchronous I/O; error " << error << ", " << getSystemErrorText(error); } } else { DWORD numRead = 0; if (GetOverlappedResult(m_state->handle.get(), &(m_state->overlappedReadState), &numRead, TRUE) == FALSE) { DWORD error = GetLastError(); if (error == ERROR_OPERATION_ABORTED) { // It worked. m_state->isOverlappedReadPending = false; } else { SURGSIM_LOG_WARNING(m_state->logger) << "WdkHidDeviceHandle: Final GetOverlappedResult failed with error " << error << ", " << getSystemErrorText(error); } } else { m_state->isOverlappedReadPending = false; } } } bool WdkHidDeviceHandle::updateStates(AxisStates* axisStates, ButtonStates* buttonStates, bool* updated) { *updated = false; // Both WaitForSingleObject() and WaitForMultipleObjects() always claim data is available for 3DConnexion device // file handles. So we can't check for data availability that way. Instead, we use overlapped (asynchronous) I/O. int numInitialFinished = 0; int numStarted = 0; int numFinished = 0; if (m_state->isOverlappedReadPending) { size_t numRead = 0; if (! finishAsynchronousRead(&numRead)) { if (m_state->isDeviceDead) { return false; // stop updating this device! } } else { decodeStateUpdates(m_state->overlappedReadBuffer, numRead, axisStates, buttonStates, updated); ++numInitialFinished; } } while (! m_state->isOverlappedReadPending) { if (! startAsynchronousRead()) { if (m_state->isDeviceDead) { return false; // stop updating this device! } else { break; } } ++numStarted; size_t numRead = 0; if (! finishAsynchronousRead(&numRead)) { if (m_state->isDeviceDead) { return false; // stop updating this device! } } else { decodeStateUpdates(m_state->overlappedReadBuffer, numRead, axisStates, buttonStates, updated); ++numFinished; } } if (numInitialFinished > 0 || numStarted > 0 || numFinished > 0) { SURGSIM_LOG_DEBUG(m_state->logger) << "WdkHidDeviceHandle: started " << numStarted << " reads, finished " << numInitialFinished << "+" << numFinished << ", delta = " << (numStarted - numInitialFinished - numFinished); } return true; } void WdkHidDeviceHandle::prepareForShutdown() { // When this code is running, the thread that calls updateStates() should no longer be running. // So we make the assumption that no synchronization is needed. // Cancel any pending asynchronous I/O, so it doesn't try reading into memory that is about to be freed. if (m_state->isOverlappedReadPending) { cancelAsynchronousRead(); } } static inline int16_t signedShortData(unsigned char byte0, unsigned char byte1) { return static_cast(static_cast(byte0) | (static_cast(byte1) << 8)); } void WdkHidDeviceHandle::decodeStateUpdates(const unsigned char* rawData, size_t rawDataSize, AxisStates* axisStates, ButtonStates* buttonStates, bool* updated) { if ((rawDataSize >= 7) && (rawData[0] == 0x01)) // Translation { // We could parse this via HidP_GetData(), but that won't work for buttons (see below) (*axisStates)[0] = signedShortData(rawData[1], rawData[2]); (*axisStates)[1] = signedShortData(rawData[3], rawData[4]); (*axisStates)[2] = signedShortData(rawData[5], rawData[6]); *updated = true; if ((rawDataSize >= 14) && (rawData[7] == 0x02)) // translation data may have rotation appended to it { (*axisStates)[3] = signedShortData(rawData[8], rawData[9]); (*axisStates)[4] = signedShortData(rawData[10], rawData[11]); (*axisStates)[5] = signedShortData(rawData[12], rawData[13]); } } else if ((rawDataSize >= 7) && (rawData[0] == 0x02)) // Rotation { // We could parse this via HidP_GetData(), but that won't work for buttons (see below) (*axisStates)[3] = signedShortData(rawData[1], rawData[2]); (*axisStates)[4] = signedShortData(rawData[3], rawData[4]); (*axisStates)[5] = signedShortData(rawData[5], rawData[6]); *updated = true; if ((rawDataSize >= 14) && (rawData[7] == 0x01)) // rotation data may have translation appended to it { (*axisStates)[0] = signedShortData(rawData[8], rawData[9]); (*axisStates)[1] = signedShortData(rawData[10], rawData[11]); (*axisStates)[2] = signedShortData(rawData[12], rawData[13]); } } else if ((rawDataSize >= 2) && (rawData[0] == 0x03)) // Buttons { // We CAN'T parse buttons via HidP_GetData(), because 3DConnexion devices produce button state in a // different report from the axes, so when the last button is released you simply get no data. We could // interpret "empty data list" as "the last button has been released", but that seems dangerous. So we // roll our own parsing for now, even though it may not work for other devices. --advornik 2012-08-01 size_t currentByte = 1; // Byte 0 specifies the packet type; data starts at byte 1 unsigned char currentBit = 0x01; for (size_t i = 0; i < (*buttonStates).size(); ++i) { (*buttonStates)[i] = ((rawData[currentByte] & currentBit) != 0); if (currentBit < 0x80) { currentBit = currentBit << 1; } else { currentBit = 0x01; ++currentByte; if (currentByte >= rawDataSize) // out of data? { break; } } } *updated = true; } } }; // namespace Devices }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Devices/MultiAxis/win32/WdkHidDeviceHandle.h000066400000000000000000000107261277777236100255350ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DEVICES_MULTIAXIS_WIN32_WDKHIDDEVICEHANDLE_H #define SURGSIM_DEVICES_MULTIAXIS_WIN32_WDKHIDDEVICEHANDLE_H #include #include #include #include #include "SurgSim/Devices/MultiAxis/SystemInputDeviceHandle.h" // The following structure is defined by the Windows HID API, but we don't want to include the whole thing here. struct _HIDP_CAPS; namespace SurgSim { namespace Framework { class Logger; }; // namespace Framework namespace Devices { /// Access to an input/HID device using the HID API from the Windows Driver Kit. /// \sa SystemInputDeviceHandle class WdkHidDeviceHandle : public SystemInputDeviceHandle { public: /// Destructor. ~WdkHidDeviceHandle(); /// Enumerates input devices. /// \param logger The logger to be used during enumeration. /// \return A list of device paths. static std::vector enumeratePaths(SurgSim::Framework::Logger* logger); /// Opens the given path and creates an access wrapper for the device. /// \param path Full pathname for the device. /// \param logger The logger to be used by the device. /// \return The created device object, or an empty unique_ptr on failure. static std::unique_ptr open(const std::string& path, std::shared_ptr logger); std::string getDeviceName() const override; bool getDeviceIds(int* vendorId, int* productId) const override; bool hasTranslationAndRotationAxes() const override; bool updateStates(AxisStates* axisStates, ButtonStates* buttonStates, bool* updated) override; void prepareForShutdown() override; private: /// Constructor. /// Cannot be called directly. /// \sa open explicit WdkHidDeviceHandle(std::shared_ptr&& logger); // Prevent copy construction and copy assignment. (VS2012 does not support "= delete" yet.) WdkHidDeviceHandle(const WdkHidDeviceHandle& other) /*= delete*/; WdkHidDeviceHandle& operator=(const WdkHidDeviceHandle& other) /*= delete*/; /// Gets the device capabilities. /// \param [out] capabilities The capabilities data for the device. /// \return true if it succeeds. bool getCapabilities(struct _HIDP_CAPS* capabilities) const; /// Starts an asynchronous read from the device. /// Updates the internal flags to indicate the state of the device I/O. /// \return true if an asynchronous read has been started, or the read has already completed synchronously. bool startAsynchronousRead(); /// Checks if an asynchronous read from the device has completed. /// Updates the internal flags to indicate the state of the device I/O. /// \param [out] numBytesRead If the function returns true, the number of bytes read from the device. /// \return true if data has been received; false if the asynchronous read is still pending or an error has /// occurred. bool finishAsynchronousRead(size_t* numBytesRead); /// Cancels an asynchronous read from the device. /// Should be executed in the context of the thread that called startAsynchronousRead. void cancelAsynchronousRead(); /// Decode the raw state update data received from the device. /// \param rawData Raw state update data. /// \param rawDataSize Size of the raw state update data. /// \param [in,out] axisStates The states for each axis of the device. /// \param [in,out] buttonStates The states for each device button. /// \param [out] updated True if any states were actually updated. (Note that even if this value is true, the /// states may not have changed value; one or more states could have been updated to the same value.) void decodeStateUpdates(const unsigned char* rawData, size_t rawDataSize, AxisStates* axisStates, ButtonStates* buttonStates, bool* updated); struct State; std::unique_ptr m_state; }; }; // namespace Devices }; // namespace SurgSim #endif // SURGSIM_DEVICES_MULTIAXIS_WIN32_WDKHIDDEVICEHANDLE_H opensurgsim-0.7.0/SurgSim/Devices/Nimble/000077500000000000000000000000001277777236100202755ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Devices/Nimble/CMakeLists.txt000066400000000000000000000030151277777236100230340ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Choose not to link boost::regex as we dont use read_until() or async_read_until() set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DBOOST_REGEX_NO_LIB") link_directories(${Boost_LIBRARY_DIRS}) set(LIBS ${Boost_LIBRARIES} SurgSimInput ) include_directories( "${CMAKE_CURRENT_SOURCE_DIR}" "${EIGEN3_INCLUDE_DIR}" "${Boost_INCLUDE_DIR}" ) set(NIMBLE_DEVICE_SOURCES NimbleDevice.cpp NimbleScaffold.cpp ) set(NIMBLE_DEVICE_HEADERS NimbleDevice.h NimbleScaffold.h ) set(DEVICE_HEADERS ${DEVICE_HEADERS} Nimble/NimbleDevice.h PARENT_SCOPE) surgsim_add_library( NimbleDevice "${NIMBLE_DEVICE_SOURCES}" "${NIMBLE_DEVICE_HEADERS}" ) target_link_libraries(NimbleDevice ${LIBS}) if(BUILD_TESTING) add_subdirectory(UnitTests) if(GLUT_FOUND) add_subdirectory(VisualTest) endif(GLUT_FOUND) endif() # Put NimbleDevice into folder "Nimble" set_target_properties(NimbleDevice PROPERTIES FOLDER "Devices") opensurgsim-0.7.0/SurgSim/Devices/Nimble/Nimble.dox000066400000000000000000000012311277777236100222140ustar00rootroot00000000000000/*! \page Nimble Nimble: Hand tracking using the NimbleSDK and OpenNI. NimbleSDK (http://www.threegear.com/download.html), by Three Gear Systems, is a hand tracking software which can communicate (using OpenNI) with a range of special depth cameras, and use the data to calculate the pose of the (two) hands in view. The software for NimbleSDK consists of the driver for the camera (OpenNI installer is packaged with the SDK) and the hand tracking server, which needs to be started and be running for the NimbleDevice to receive data. The steps to start the server are described here (http://www.threegear.com/latest/doc/index.html) for Windows and Mac OSX. */ opensurgsim-0.7.0/SurgSim/Devices/Nimble/NimbleDevice.cpp000066400000000000000000000040651277777236100233340ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Devices/Nimble/NimbleDevice.h" #include "SurgSim/Devices/Nimble/NimbleScaffold.h" #include "SurgSim/Framework/Log.h" namespace SurgSim { namespace Devices { SURGSIM_REGISTER(SurgSim::Input::DeviceInterface, SurgSim::Devices::NimbleDevice, NimbleDevice); NimbleDevice::NimbleDevice(const std::string& uniqueName) : SurgSim::Input::CommonDevice(uniqueName, NimbleScaffold::buildDeviceInputData()), m_trackedHandDataIndex(0) { } NimbleDevice::~NimbleDevice() { if (isInitialized()) { finalize(); } } void NimbleDevice::setupToTrackLeftHand() { m_trackedHandDataIndex = 0; } void NimbleDevice::setupToTrackRightHand() { m_trackedHandDataIndex = 1; } bool NimbleDevice::initialize() { SURGSIM_ASSERT(!isInitialized()) << "Nimble: Attempt to initialize already initialized device."; auto scaffold = NimbleScaffold::getOrCreateSharedInstance(); SURGSIM_ASSERT(scaffold != nullptr) << "Unable to acquire a NimbleScaffold instance"; bool initialize = false; if (scaffold->registerDevice(this)) { m_scaffold = std::move(scaffold); initialize = true; } return initialize; } bool NimbleDevice::finalize() { SURGSIM_ASSERT(isInitialized()) << "Nimble: Attempt to finalize an uninitialized device."; bool ok = m_scaffold->unregisterDevice(this); m_scaffold.reset(); return ok; } bool NimbleDevice::isInitialized() const { return (m_scaffold != nullptr); } }; // namespace Devices }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Devices/Nimble/NimbleDevice.h000066400000000000000000000073411277777236100230010ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DEVICES_NIMBLE_NIMBLEDEVICE_H #define SURGSIM_DEVICES_NIMBLE_NIMBLEDEVICE_H #include #include #include "SurgSim/Input/CommonDevice.h" namespace SurgSim { namespace Devices { class NimbleScaffold; SURGSIM_STATIC_REGISTRATION(NimbleDevice); /// A class implementing the communication with the Nimble server. /// /// \par Application input provided by the device: /// | type | name | | /// | ---- | ---- | --- | /// | pose | "pose" | %Hand pose w.r.t. JointFrameIndex.ROOT_JOINT (units are meters). | /// | pose | "ThumbProximal" | %Pose w.r.t. thumb proximal joint | /// | pose | "ThumbIntermediate" | %Pose w.r.t. thumb intermediate joint | /// | pose | "ThumbDistal" | %Pose w.r.t. thumb distal joint | /// | pose | "IndexFingerProximal" | %Pose w.r.t. index finger proximal joint | /// | pose | "IndexFingerIntermediate" | %Pose w.r.t. index finger intermediate joint | /// | pose | "IndexFingerDistal" | %Pose w.r.t. index finger distal joint | /// | pose | "MiddleFingerProximal" | %Pose w.r.t. middle finger proximal joint | /// | pose | "MiddleFingerIntermediate" | %Pose w.r.t. middle finger intermediate joint | /// | pose | "MiddleFingerDistal" | %Pose w.r.t. middle finger distal joint | /// | pose | "RingFingerProximal" | %Pose w.r.t. ring finger proximal joint | /// | pose | "RingFingerIntermediate" | %Pose w.r.t. ring finger intermediate joint | /// | pose | "RingFingerDistal" | %Pose w.r.t. ring finger distal joint | /// | pose | "SmallFingerProximal" | %Pose w.r.t. small finger proximal joint | /// | pose | "SmallFingerIntermediate" | %Pose w.r.t. small finger intermediate joint | /// | pose | "SmallFingerDistal" | %Pose w.r.t. small finger distal joint | /// /// \par Application output used by the device: none. /// /// \sa SurgSim::Input::CommonDevice, SurgSim::Input::DeviceInterface class NimbleDevice : public SurgSim::Input::CommonDevice { public: /// Constructor. /// /// \param uniqueName A unique name for the device that will be used by the application. explicit NimbleDevice(const std::string& uniqueName); SURGSIM_CLASSNAME(SurgSim::Devices::NimbleDevice); /// Destructor. virtual ~NimbleDevice(); /// Set the left hand to be tracked. void setupToTrackLeftHand(); /// Set the right hand to be tracked. void setupToTrackRightHand(); bool initialize() override; bool isInitialized() const override; private: friend class NimbleScaffold; bool finalize() override; /// The shared pointer to the NimbleScaffold. std::shared_ptr m_scaffold; /// Indicate whether the hand tracked is left (0) or right (1). size_t m_trackedHandDataIndex; }; }; // namespace Devices }; // namespace SurgSim #endif // SURGSIM_DEVICES_NIMBLE_NIMBLEDEVICE_H opensurgsim-0.7.0/SurgSim/Devices/Nimble/NimbleScaffold.cpp000066400000000000000000000406071277777236100236600ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #if defined(_MSC_VER) #pragma warning(push) #pragma warning(disable:4250) #endif #include "SurgSim/Devices/Nimble/NimbleScaffold.h" #include #include #include #include #include #include #include #include #include "SurgSim/Devices/Nimble/NimbleDevice.h" #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/DataStructures/DataGroupBuilder.h" #include "SurgSim/Framework/Assert.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Framework/SharedInstance.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Math/Matrix.h" #include "SurgSim/Math/RigidTransform.h" using SurgSim::Math::Vector3d; using SurgSim::Math::RigidTransform3d; using SurgSim::Math::Quaterniond; namespace { /// Data structure to hold the data from the Nimble hand tracking SDK, for a single hand. struct HandTrackingData { /// Number of hands tracked (left, right). static const size_t NUM_HANDS = 2; /// Number of fingers tracked in one hand. static const size_t NUM_FINGERS = 5; /// Number of predefined poses for each hand. static const size_t NUM_POSES = 7; // Joint frames used for skinning. // // These are the frames stored in HandTrackingData.jointQuaternions/HandTrackingData.jointPositions. // They are used to locate points in 3D space or define 3D frames. If you want to recognize gestures of the form // "finger X is bending" it is recommended to use the FingerDOF instead. The most stable frame is the one defined // by the metacarpals (WRIST_JOINT). enum JointFrameIndex { ROOT_JOINT = 0, // The frame of the user's forearm (this is where the hand model is rooted). WRIST_JOINT = 1, // The frame of the back of the hand (anatomically, this is the frame of the carpals). THUMB_PROXIMAL = 2, // Thumb proximal frame, refers to the thumb metacarpal bone. THUMB_INTERMEDIATE = 3, // Thumb intermediate frame, refers to the thumb proximal phalange. THUMB_DISTAL = 4, // Thumb distal frame, refers to the thumb distal phalange. INDEX_PROXIMAL = 5, // Index finger proximal frame, refers to the proximal phalange. INDEX_INTERMEDIATE = 6, // Index finger intermediate frame, refers to the intermediate phalange. INDEX_DISTAL = 7, // Index finger distal frame, refers to the distal phalange. MIDDLE_PROXIMAL = 8, // Middle finger proximal frame, refers to the proximal phalange. MIDDLE_INTERMEDIATE = 9, // Middle finger intermediate frame, refers to the intermediate phalange. MIDDLE_DISTAL = 10, // Middle finger distal frame, refers to the distal phalange. RING_PROXIMAL = 11, // Ring finger proximal frame, refers to the proximal phalange. RING_INTERMEDIATE = 12, // Ring finger intermediate frame, refers to the intermediate phalange. RING_DISTAL = 13, // Ring finger distal frame, refers to the distal phalange. SMALL_PROXIMAL = 14, // Small finger proximal frame, refers to the proximal phalange. SMALL_INTERMEDIATE = 15, // Small finger intermediate frame, refers to the intermediate phalange. SMALL_DISTAL = 16, // Small finger distal frame, refers to the distal phalange. NUM_JOINTS }; // Degrees of freedom of the hand model. // // Stored in HandTrackingData.fingerDofs. Each of these is a rotation in radians that measures how far the // corresponding finger is bent from its rest pose. For flexion/extension joints, positive angles indicate // flexion while negative angles indicate extension. // // Recommended for detecting gestures of the form "finger X is bending." To know the global position/orientation // of the hand, use HandTrackingData.jointPositions/HandTrackingData.jointQuaternions instead. enum FingerDOF { THUMB_CMC_AA = 0, ///< Thumb carpal-metacarpal joint, adduction/abduction THUMB_CMC_FE = 1, ///< Thumb carpal-metacarpal joint, flexion/extension THUMB_MCP = 2, ///< Thumb metacarpal-phalangeal joint, flexion/extension THUMB_IP = 3, ///< Thumb interphalangeal joint, flexion/extension INDEX_MCP_AA = 4, ///< Index finger metacarpal-phalangeal joint, adduction/abduction INDEX_MCP_FE = 5, ///< Index finger metacarpal-phalangeal joint, flexion/extension INDEX_PIP = 6, ///< Index finger proximal interphalangeal joint, flexion/extension MIDDLE_MCP_AA = 7, ///< Middle finger metacarpal-phalangeal joint, adduction/abduction MIDDLE_MCP_FE = 8, ///< Middle finger metacarpal-phalangeal joint, flexion/extension MIDDLE_PIP = 9, ///< Middle finger proximal interphalangeal joint, flexion/extension RING_MCP_AA = 10, ///< Ring finger metacarpal-phalangeal joint, adduction/abduction RING_MCP_FE = 11, ///< Ring finger metacarpal-phalangeal joint, flexion/extension RING_PIP = 12, ///< Ring finger proximal interphalangeal joint, flexion/extension SMALL_MCP_AA = 13, ///< Small finger metacarpal-phalangeal joint, adduction/abduction SMALL_MCP_FE = 14, ///< Small finger metacarpal-phalangeal joint, flexion/extension SMALL_PIP = 15, ///< Small finger proximal interphalangeal joint, flexion/extension NUM_FINGER_DOFS_PER_HAND }; struct HandData { /// Transform of the hand (w.r.t JointFrameIndex.ROOT_JOINT). RigidTransform3d pose; /// Number of times the hand was clicked. 0, 1 or 2. int clickCount; /// Value between 0 and 1 to specify the confidence of the poses. Currently, either 0 or 1. double confidenceEstimate; /// Transform of each of the joints. std::array jointPoses; /// Position of each of the finger tips. std::array fingerTips; /// Value between 0 and 1 to specify the confidence of the hand being in one of the N_POSES poses. Sums to 1. std::array handPoseConfidences; /// The angle of each of the finger joints. std::array fingerDofs; }; std::array hands; }; /// Parse the values in the stream into a Vector3d. /// \param in The stream from where data is parsed. /// \param [out] vector The object to which the parsed values are written to. /// \return The stream that was sent in. std::istream& operator>> (std::istream& in, Vector3d& vector) { std::istream::sentry sentry(in); if (sentry) { in >> vector.x(); in >> vector.y(); in >> vector.z(); } return in; } /// Parse the values in the stream into a Quaterniond. /// \param in The stream from where data is parsed. /// \param [out] quaternion The object to which the parsed values are written to. /// \return The stream that was sent in. std::istream& operator>> (std::istream& in, Quaterniond& quaternion) { std::istream::sentry sentry(in); if (sentry) { in >> quaternion.x(); in >> quaternion.y(); in >> quaternion.z(); in >> quaternion.w(); } return in; } /// Parse the values in the stream into the HandTracking Data structure. /// \param in The stream from where data is parsed. /// \param [out] handData The object to which the parsed values are written to. /// \return The stream that was sent in. std::istream& operator>> (std::istream& in, HandTrackingData& handData) { Vector3d position; Quaterniond quaternion; for (auto hand = handData.hands.begin(); in.good() && hand != handData.hands.end(); ++hand) { in >> position; hand->pose.translation() = position; in >> quaternion; hand->pose.linear() = quaternion.matrix(); in >> hand->clickCount; } for (auto hand = handData.hands.begin(); in.good() && hand != handData.hands.end(); ++hand) { in >> hand->confidenceEstimate; for (auto jointPose = hand->jointPoses.begin(); in.good() && jointPose != hand->jointPoses.end(); ++jointPose) { in >> quaternion; jointPose->linear() = quaternion.matrix(); in >> position; jointPose->translation() = position; } for (auto fingerTip = hand->fingerTips.begin(); in.good() && fingerTip != hand->fingerTips.end(); ++fingerTip) { in >> *fingerTip; } } for (auto hand = handData.hands.begin(); in.good() && hand != handData.hands.end(); ++hand) { for (auto handPoseConfidence = hand->handPoseConfidences.begin(); in.good() && handPoseConfidence != hand->handPoseConfidences.end(); ++handPoseConfidence) { in >> *handPoseConfidence; } } for (auto hand = handData.hands.begin(); in.good() && hand != handData.hands.end(); ++hand) { for (auto fingerDof = hand->fingerDofs.begin(); in.good() && fingerDof != hand->fingerDofs.end(); ++fingerDof) { in >> *fingerDof; } } return in; } } namespace SurgSim { namespace Devices { std::array, 15> NimbleScaffold::m_jointPoseNames = { std::make_pair("ThumbProximal", HandTrackingData::THUMB_PROXIMAL), std::make_pair("ThumbIntermediate", HandTrackingData::THUMB_INTERMEDIATE), std::make_pair("ThumbDistal", HandTrackingData::THUMB_DISTAL), std::make_pair("IndexFingerProximal", HandTrackingData::INDEX_PROXIMAL), std::make_pair("IndexFingerIntermediate", HandTrackingData::INDEX_INTERMEDIATE), std::make_pair("IndexFingerDistal", HandTrackingData::INDEX_DISTAL), std::make_pair("MiddleFingerProximal", HandTrackingData::MIDDLE_PROXIMAL), std::make_pair("MiddleFingerIntermediate", HandTrackingData::MIDDLE_INTERMEDIATE), std::make_pair("MiddleFingerDistal", HandTrackingData::MIDDLE_DISTAL), std::make_pair("RingFingerProximal", HandTrackingData::RING_PROXIMAL), std::make_pair("RingFingerIntermediate", HandTrackingData::RING_INTERMEDIATE), std::make_pair("RingFingerDistal", HandTrackingData::RING_DISTAL), std::make_pair("SmallFingerProximal", HandTrackingData::SMALL_PROXIMAL), std::make_pair("SmallFingerIntermediate", HandTrackingData::SMALL_INTERMEDIATE), std::make_pair("SmallFingerDistal", HandTrackingData::SMALL_DISTAL) }; struct NimbleScaffold::StateData { public: /// Initialize the state. StateData() { } /// The socket used for connecting to the Nimble server. boost::asio::ip::tcp::iostream socketStream; /// The hand tracking data. HandTrackingData handData; /// The list of active devices. std::vector activeDevices; /// The mutex that protects the active device. boost::mutex mutex; private: // Prohibit copy construction and assignment StateData(const StateData&); StateData& operator=(const StateData&); }; NimbleScaffold::NimbleScaffold() : SurgSim::Framework::BasicThread("Nimble Scaffold"), m_logger(Framework::Logger::getLogger("Devices/Nimble")), m_state(new StateData()), m_serverIpAddress("127.0.0.1"), m_serverPort("1988"), m_serverSocketOpen(false) { setRate(1000.0); SURGSIM_LOG_DEBUG(m_logger) << "Shared scaffold created."; } NimbleScaffold::~NimbleScaffold() { { boost::lock_guard lock(m_state->mutex); if (m_state->activeDevices.size() > 0) { SURGSIM_LOG_SEVERE(m_logger) << "Nimble: Destroying scaffold while devices are active!?!"; } } SURGSIM_LOG_DEBUG(m_logger) << "Nimble: Shared scaffold destroyed."; } bool NimbleScaffold::registerDevice(NimbleDevice* device) { bool success = true; { boost::lock_guard lock(m_state->mutex); auto found = std::find_if(m_state->activeDevices.begin(), m_state->activeDevices.end(), [device](const NimbleDevice* it) { return it->getName() == device->getName(); }); if (found == m_state->activeDevices.end()) { m_state->activeDevices.push_back(device); SURGSIM_LOG_INFO(m_logger) << "Device " << device->getName() << " registered in Scaffold."; } else { SURGSIM_LOG_SEVERE(m_logger) << "Attempted to register device " << device->getName() << " with the same name again."; success = false; } } if (success && !isRunning()) { std::shared_ptr barrier = std::make_shared(2); start(barrier); barrier->wait(true); // Wait for initialize barrier->wait(true); // Wait for startup success = isInitialized(); } return success; } bool NimbleScaffold::unregisterDevice(const NimbleDevice* device) { bool success = true; { boost::lock_guard lock(m_state->mutex); auto found = std::find(m_state->activeDevices.begin(), m_state->activeDevices.end(), device); if (found != m_state->activeDevices.end()) { m_state->activeDevices.erase(found); SURGSIM_LOG_INFO(m_logger) << "Device " << device->getName() << " unregistered from Scaffold."; } else { SURGSIM_LOG_WARNING(m_logger) << "Attempted to unregister a device " << device->getName() << " from Scaffold which is not registered."; success = false; } } if (success && isRunning() && m_state->activeDevices.size() == 0) { stop(); } return success; } bool NimbleScaffold::doInitialize() { // Connect to the Nimble hand tracking server. m_serverSocketOpen = true; m_state->socketStream.connect(m_serverIpAddress, m_serverPort); if (!m_state->socketStream) { SURGSIM_LOG_SEVERE(m_logger) << "Nimble: Error while opening a iostream to the server: " << m_state->socketStream.error().message() << ")"; m_serverSocketOpen = false; } return m_serverSocketOpen; } bool NimbleScaffold::doStartUp() { return true; } bool NimbleScaffold::doUpdate(double dt) { bool success = true; if (!m_state->socketStream) { SURGSIM_LOG_SEVERE(m_logger) << "Nimble: Socket stream no longer good: " << m_state->socketStream.error().message() << ")"; success = false; } else { std::string messageType; m_state->socketStream >> messageType; if (messageType == "POSE") { m_state->socketStream >> m_state->handData; if (!m_state->socketStream.fail()) { updateDeviceData(); } else { SURGSIM_LOG_WARNING(m_logger) << "Nimble: Hand data not parsed correctly."; resetDeviceData(); } } else { m_state->socketStream.ignore(std::numeric_limits::max(), '\n'); } } return success; } void NimbleScaffold::doBeforeStop() { // This would be killed soon, so the socket is closed here. if (m_serverSocketOpen) { m_state->socketStream.close(); if (m_state->socketStream.fail()) { SURGSIM_LOG_SEVERE(m_logger) << "Nimble: Error when shutting down socket: " << m_state->socketStream.error().message() << ")"; } m_serverSocketOpen = false; } } void NimbleScaffold::updateDeviceData() { boost::lock_guard lock(m_state->mutex); for (auto it = m_state->activeDevices.begin(); it != m_state->activeDevices.end(); ++it) { size_t index = (*it)->m_trackedHandDataIndex; SurgSim::DataStructures::DataGroup& inputData = (*it)->getInputData(); inputData.poses().set(SurgSim::DataStructures::Names::POSE, m_state->handData.hands[index].pose); for (auto name = m_jointPoseNames.begin(); name != m_jointPoseNames.end(); ++name) { inputData.poses().set(name->first, m_state->handData.hands[index].jointPoses[name->second]); } (*it)->pushInput(); } } void NimbleScaffold::resetDeviceData() { boost::lock_guard lock(m_state->mutex); for (auto it = m_state->activeDevices.begin(); it != m_state->activeDevices.end(); ++it) { SurgSim::DataStructures::DataGroup& inputData = (*it)->getInputData(); inputData.resetAll(); } } SurgSim::DataStructures::DataGroup NimbleScaffold::buildDeviceInputData() { SurgSim::DataStructures::DataGroupBuilder builder; builder.addPose(SurgSim::DataStructures::Names::POSE); for (auto name = m_jointPoseNames.begin(); name != m_jointPoseNames.end(); ++name) { builder.addPose(name->first); } return builder.createData(); } std::shared_ptr NimbleScaffold::getOrCreateSharedInstance() { // Using an explicit creation function gets around problems with accessing the private constructor. static auto creator = []() { return std::shared_ptr(new NimbleScaffold()); }; // NOLINT(readability/braces) static SurgSim::Framework::SharedInstance sharedInstance(creator); return sharedInstance.get(); } } // namespace Devices } // namespace SurgSim #if defined(_MSC_VER) #pragma warning(pop) #endif opensurgsim-0.7.0/SurgSim/Devices/Nimble/NimbleScaffold.h000066400000000000000000000061221277777236100233170ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DEVICES_NIMBLE_NIMBLESCAFFOLD_H #define SURGSIM_DEVICES_NIMBLE_NIMBLESCAFFOLD_H #include #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/Framework/BasicThread.h" #include "SurgSim/Framework/Logger.h" namespace SurgSim { namespace Devices { class NimbleDevice; class NimbleThread; /// A class that manages Nimble devices. /// /// \sa SurgSim::Devices::NimbleDevice class NimbleScaffold : public SurgSim::Framework::BasicThread { public: /// Destructor. ~NimbleScaffold(); /// Gets or creates the scaffold shared by all NimbleDevice instances. /// The scaffold is managed using a SingleInstance object. /// \return the scaffold object. static std::shared_ptr getOrCreateSharedInstance(); protected: bool doInitialize() override; bool doStartUp() override; bool doUpdate(double dt) override; void doBeforeStop() override; private: /// Internal shared state data type. struct StateData; friend class NimbleDevice; friend class NimbleThread; /// Constructor. NimbleScaffold(); /// Registers the specified device object. /// \param device The device object to be used. /// \return True if the initialization succeeds, false if it fails. /// \note There can be only one NimbleDevice at a time. bool registerDevice(NimbleDevice* device); /// Unregisters the specified device object. /// \param device The device object. /// \return true on success, false on failure. bool unregisterDevice(const NimbleDevice* device); /// Update the devices based on the data read from the Nimble server. void updateDeviceData(); /// Reset the device data. void resetDeviceData(); /// Builds the data layout for the application input (i.e. device output). static SurgSim::DataStructures::DataGroup buildDeviceInputData(); /// Logger used by the scaffold and all devices. std::shared_ptr m_logger; /// Internal scaffold state. std::unique_ptr m_state; /// The IP address of the Nimble hand tracking server. std::string m_serverIpAddress; /// The port where the server is communicating. std::string m_serverPort; /// Flag to indicate that the socket is opened successfully. bool m_serverSocketOpen; /// The data group name for the joint poses, and the corresponding indices within the state data. static std::array, 15> m_jointPoseNames; }; }; // namespace Devices }; // namespace SurgSim #endif // SURGSIM_DEVICES_NIMBLE_NIMBLESCAFFOLD_Hopensurgsim-0.7.0/SurgSim/Devices/Nimble/UnitTests/000077500000000000000000000000001277777236100222375ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Devices/Nimble/UnitTests/CMakeLists.txt000066400000000000000000000016051277777236100250010ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. include_directories( ${gtest_SOURCE_DIR}/include ) set(UNIT_TEST_SOURCES NimbleDeviceTest.cpp NimbleScaffoldTest.cpp ) set(LIBS NimbleDevice ) surgsim_add_unit_tests(NimbleDeviceTest) set_target_properties(NimbleDeviceTest PROPERTIES FOLDER "Devices") opensurgsim-0.7.0/SurgSim/Devices/Nimble/UnitTests/NimbleDeviceTest.cpp000066400000000000000000000161461277777236100261410ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the NimbleDevice class. #include #include #include #include #include #include "SurgSim/Devices/Nimble/NimbleDevice.h" #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Matrix.h" #include "SurgSim/Testing/MockInputOutput.h" using SurgSim::Devices::NimbleDevice; using SurgSim::Devices::NimbleScaffold; using SurgSim::DataStructures::DataGroup; using SurgSim::Math::RigidTransform3d; using SurgSim::Math::Matrix44d; using SurgSim::Testing::MockInputOutput; TEST(NimbleDeviceTest, CreateUninitializedDevice) { std::shared_ptr device = std::make_shared("TestNimble"); ASSERT_TRUE(device != nullptr) << "Device creation failed."; } TEST(NimbleDeviceTest, CreateAndInitializeDevice) { std::shared_ptr device = std::make_shared("TestNimble"); ASSERT_TRUE(device != nullptr) << "Device creation failed."; EXPECT_FALSE(device->isInitialized()); ASSERT_TRUE(device->initialize()) << "Initialization failed."; EXPECT_TRUE(device->isInitialized()); boost::this_thread::sleep_until(boost::chrono::steady_clock::now() + boost::chrono::milliseconds(100)); } TEST(NimbleDeviceTest, Name) { std::shared_ptr device = std::make_shared("TestNimble"); ASSERT_TRUE(device != nullptr) << "Device creation failed."; EXPECT_EQ("TestNimble", device->getName()); EXPECT_TRUE(device->initialize()) << "Initialization failed."; EXPECT_EQ("TestNimble", device->getName()); } TEST(NimbleDeviceTest, CreateDeviceSeveralTimes) { for (int i = 0; i < 6; ++i) { std::shared_ptr device = std::make_shared("TestNimble"); ASSERT_TRUE(device != nullptr) << "Device creation failed."; ASSERT_TRUE(device->initialize()) << "Initialization failed."; // Rapidly initializing and destructing causes the thread destructor to be called before it has been // stopped (by calling stop()), this sleep prevents the problem. boost::this_thread::sleep_until(boost::chrono::steady_clock::now() + boost::chrono::milliseconds(100)); } } TEST(NimbleDeviceTest, CreateSeveralDevices) { std::shared_ptr device1 = std::make_shared("Nimble1"); ASSERT_TRUE(device1 != nullptr) << "Device creation failed."; ASSERT_TRUE(device1->initialize()) << "Initialization failed."; std::shared_ptr device2 = std::make_shared("Nimble2"); ASSERT_TRUE(device2 != nullptr) << "Device creation failed."; ASSERT_TRUE(device2->initialize()) << "Initialization failed."; } TEST(NimbleDeviceTest, InputConsumer) { std::shared_ptr device = std::make_shared("TestNimbleLeft"); ASSERT_TRUE(device != nullptr) << "Device creation failed."; ASSERT_TRUE(device->initialize()) << "Initialization failed."; std::shared_ptr consumer = std::make_shared(); EXPECT_EQ(0, consumer->m_numTimesInitializedInput); EXPECT_EQ(0, consumer->m_numTimesReceivedInput); EXPECT_FALSE(device->removeInputConsumer(consumer)); EXPECT_EQ(0, consumer->m_numTimesInitializedInput); EXPECT_EQ(0, consumer->m_numTimesReceivedInput); EXPECT_TRUE(device->addInputConsumer(consumer)); // Adding the same input consumer again should fail. EXPECT_FALSE(device->addInputConsumer(consumer)); // Sleep for a second, to see how many times the consumer is invoked. // (The Nimble server updates internally at 30Hz, but our code currently runs at 1kHz.) boost::this_thread::sleep_until(boost::chrono::steady_clock::now() + boost::chrono::milliseconds(1000)); EXPECT_TRUE(device->removeInputConsumer(consumer)); // Removing the same input consumer again should fail. EXPECT_FALSE(device->removeInputConsumer(consumer)); // Check the number of invocations. // The input is only pushed if a valid pose was detected. So, the minimum m_numTimesReceivedInput is 1. EXPECT_EQ(1, consumer->m_numTimesInitializedInput); EXPECT_GE(consumer->m_numTimesReceivedInput, 1); EXPECT_LE(consumer->m_numTimesReceivedInput, 30); EXPECT_TRUE(consumer->m_lastReceivedInput.poses().hasData(SurgSim::DataStructures::Names::POSE)); EXPECT_TRUE(consumer->m_lastReceivedInput.poses().hasData("ThumbProximal")); EXPECT_TRUE(consumer->m_lastReceivedInput.poses().hasData("ThumbIntermediate")); EXPECT_TRUE(consumer->m_lastReceivedInput.poses().hasData("ThumbDistal")); EXPECT_TRUE(consumer->m_lastReceivedInput.poses().hasData("IndexFingerProximal")); EXPECT_TRUE(consumer->m_lastReceivedInput.poses().hasData("IndexFingerIntermediate")); EXPECT_TRUE(consumer->m_lastReceivedInput.poses().hasData("IndexFingerDistal")); EXPECT_TRUE(consumer->m_lastReceivedInput.poses().hasData("MiddleFingerProximal")); EXPECT_TRUE(consumer->m_lastReceivedInput.poses().hasData("MiddleFingerIntermediate")); EXPECT_TRUE(consumer->m_lastReceivedInput.poses().hasData("MiddleFingerDistal")); EXPECT_TRUE(consumer->m_lastReceivedInput.poses().hasData("RingFingerProximal")); EXPECT_TRUE(consumer->m_lastReceivedInput.poses().hasData("RingFingerIntermediate")); EXPECT_TRUE(consumer->m_lastReceivedInput.poses().hasData("RingFingerDistal")); EXPECT_TRUE(consumer->m_lastReceivedInput.poses().hasData("SmallFingerProximal")); EXPECT_TRUE(consumer->m_lastReceivedInput.poses().hasData("SmallFingerIntermediate")); EXPECT_TRUE(consumer->m_lastReceivedInput.poses().hasData("SmallFingerDistal")); } TEST(NimbleDeviceTest, OutputProducer) { //NimbleScaffold::setDefaultLogLevel(SurgSim::Framework::LOG_LEVEL_DEBUG); std::shared_ptr device = std::make_shared("TestNimble"); ASSERT_TRUE(device != nullptr) << "Device creation failed."; ASSERT_TRUE(device->initialize()) << "Initialization failed."; std::shared_ptr producer = std::make_shared(); EXPECT_EQ(0, producer->m_numTimesRequestedOutput); EXPECT_FALSE(device->removeOutputProducer(producer)); EXPECT_EQ(0, producer->m_numTimesRequestedOutput); EXPECT_TRUE(device->setOutputProducer(producer)); // Sleep for a second, to see how many times the producer is invoked. // (A Nimble device is does not request any output.) boost::this_thread::sleep_until(boost::chrono::steady_clock::now() + boost::chrono::milliseconds(1000)); EXPECT_TRUE(device->removeOutputProducer(producer)); // Removing the same input producer again should fail. EXPECT_FALSE(device->removeOutputProducer(producer)); // Check the number of invocations. EXPECT_EQ(0, producer->m_numTimesRequestedOutput); } opensurgsim-0.7.0/SurgSim/Devices/Nimble/UnitTests/NimbleScaffoldTest.cpp000066400000000000000000000154411277777236100264600ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the NimbleScaffold class and its device interactions. #include #include #include #include #include #include "SurgSim/Devices/Nimble/NimbleDevice.h" #include "SurgSim/Devices/Nimble/NimbleScaffold.h" #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Matrix.h" using SurgSim::Devices::NimbleDevice; using SurgSim::Devices::NimbleScaffold; TEST(NimbleScaffoldTest, CreateAndDestroyScaffold) { std::shared_ptr scaffold = NimbleScaffold::getOrCreateSharedInstance(); ASSERT_NE(nullptr, scaffold) << "The scaffold was not created!"; std::weak_ptr scaffold1 = scaffold; { std::shared_ptr stillHaveScaffold = scaffold1.lock(); EXPECT_NE(nullptr, stillHaveScaffold) << "Unable to get scaffold from weak ref (while strong ref exists)"; EXPECT_EQ(scaffold, stillHaveScaffold) << "Scaffold mismatch!"; } { std::shared_ptr sameScaffold = NimbleScaffold::getOrCreateSharedInstance(); EXPECT_NE(nullptr, sameScaffold) << "Unable to get scaffold from class"; EXPECT_EQ(scaffold, sameScaffold) << "Scaffold mismatch!"; } scaffold.reset(); { std::shared_ptr dontHaveScaffold = scaffold1.lock(); EXPECT_EQ(nullptr, dontHaveScaffold) << "Able to get scaffold from weak ref (with no strong ref)"; } scaffold = NimbleScaffold::getOrCreateSharedInstance(); ASSERT_NE(nullptr, scaffold) << "The scaffold was not created the 2nd time!"; std::weak_ptr scaffold2 = scaffold; { std::shared_ptr stillHaveScaffold = scaffold2.lock(); ASSERT_NE(nullptr, stillHaveScaffold) << "Unable to get scaffold from weak ref (while strong ref exists)"; ASSERT_EQ(scaffold, stillHaveScaffold) << "Scaffold mismatch!"; } } TEST(NimbleScaffoldTest, ScaffoldLifeCycle) { std::weak_ptr lastScaffold; { std::shared_ptr scaffold = NimbleScaffold::getOrCreateSharedInstance(); ASSERT_NE(nullptr, scaffold) << "The scaffold was not created!"; lastScaffold = scaffold; } { std::shared_ptr dontHaveScaffold = lastScaffold.lock(); EXPECT_EQ(nullptr, dontHaveScaffold) << "Able to get scaffold from weak ref (with no strong ref)"; lastScaffold.reset(); } { std::shared_ptr device = std::make_shared("TestNimble"); ASSERT_NE(nullptr, device) << "Creation failed."; // note: the device is NOT initialized! { std::shared_ptr scaffold = NimbleScaffold::getOrCreateSharedInstance(); EXPECT_NE(nullptr, scaffold) << "The scaffold was not retrieved!"; lastScaffold = scaffold; // save the scaffold for later std::shared_ptr sameScaffold = lastScaffold.lock(); EXPECT_NE(nullptr, sameScaffold); EXPECT_EQ(scaffold, sameScaffold); } // The device has not been initialized, so it should NOT be hanging on to the device! { std::shared_ptr deadScaffold = lastScaffold.lock(); EXPECT_EQ(nullptr, deadScaffold); } // the ("empty") device is about to get destroyed } { std::shared_ptr device = std::make_shared("TestNimble"); ASSERT_NE(nullptr, device) << "Device creation failed."; ASSERT_TRUE(device->initialize()) << "Initialization failed."; { std::shared_ptr scaffold = NimbleScaffold::getOrCreateSharedInstance(); EXPECT_NE(nullptr, scaffold) << "The scaffold was not retrieved!"; lastScaffold = scaffold; // save the scaffold for later std::shared_ptr sameScaffold = lastScaffold.lock(); EXPECT_NE(nullptr, sameScaffold); EXPECT_EQ(scaffold, sameScaffold); } // The same scaffold is supposed to still be around because of the device { std::shared_ptr sameScaffold = lastScaffold.lock(); EXPECT_NE(nullptr, sameScaffold); std::shared_ptr scaffold = NimbleScaffold::getOrCreateSharedInstance(); EXPECT_NE(nullptr, scaffold) << "The scaffold was not retrieved!"; EXPECT_EQ(sameScaffold, scaffold); } // the device and the scaffold are about to get destroyed } { std::shared_ptr deadScaffold = lastScaffold.lock(); EXPECT_EQ(nullptr, deadScaffold); } { std::shared_ptr device = std::make_shared("TestNimble"); ASSERT_NE(nullptr, device) << "Device creation failed."; ASSERT_TRUE(device->initialize()) << "Initialization failed."; std::shared_ptr scaffold = NimbleScaffold::getOrCreateSharedInstance(); EXPECT_NE(nullptr, scaffold) << "The scaffold was not retrieved!"; std::shared_ptr deadScaffold = lastScaffold.lock(); EXPECT_EQ(nullptr, deadScaffold); } } TEST(NimbleScaffoldTest, CreateDeviceSeveralTimes) { std::weak_ptr lastScaffold; for (int i = 0; i < 6; ++i) { SCOPED_TRACE(i); EXPECT_EQ(nullptr, lastScaffold.lock()); std::shared_ptr device = std::make_shared("TestNimble"); ASSERT_NE(nullptr, device) << "Device creation failed."; ASSERT_TRUE(device->initialize()) << "Initialization failed."; std::shared_ptr scaffold = NimbleScaffold::getOrCreateSharedInstance(); ASSERT_NE(nullptr, scaffold) << "The scaffold was not retrieved!"; lastScaffold = scaffold; // the device and the scaffold will be destroyed here } } TEST(NimbleScaffoldTest, CreateDeviceSeveralTimesWithScaffoldRef) { std::shared_ptr lastScaffold; for (int i = 0; i < 6; ++i) { SCOPED_TRACE(i); std::shared_ptr device = std::make_shared("TestNimble"); ASSERT_NE(nullptr, device) << "Attempt " << i + 1 << ": Device creation failed."; ASSERT_TRUE(device->initialize()) << "Attempt " << i + 1 << ": Initialization failed."; std::shared_ptr scaffold = NimbleScaffold::getOrCreateSharedInstance(); ASSERT_NE(nullptr, scaffold) << "The scaffold was not retrieved!"; if (!lastScaffold) { lastScaffold = scaffold; } EXPECT_EQ(lastScaffold, scaffold); // the device will be destroyed here, but the scaffold stays around because we have a shared_ptr to it. } } opensurgsim-0.7.0/SurgSim/Devices/Nimble/VisualTest/000077500000000000000000000000001277777236100224005ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Devices/Nimble/VisualTest/CMakeLists.txt000066400000000000000000000017221277777236100251420ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. set(EXAMPLE_SOURCES main.cpp ) set(EXAMPLE_HEADERS ) surgsim_add_executable(NimbleVisualTest "${EXAMPLE_SOURCES}" "${EXAMPLE_HEADERS}") set(LIBS NimbleDevice SurgSimDeviceFilters SurgSimInput VisualTestCommon ) target_link_libraries(NimbleVisualTest ${LIBS}) set_target_properties(NimbleVisualTest PROPERTIES FOLDER "Devices") opensurgsim-0.7.0/SurgSim/Devices/Nimble/VisualTest/main.cpp000066400000000000000000000037271277777236100240410ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Input/DeviceInterface.h" #include "SurgSim/Devices/DeviceFilters/PoseTransform.h" #include "SurgSim/Devices/Nimble/NimbleDevice.h" #include "SurgSim/Testing/VisualTestCommon/ToolSquareTest.h" using SurgSim::Input::DeviceInterface; using SurgSim::Devices::PoseTransform; using SurgSim::Devices::NimbleDevice; int main(int argc, char** argv) { auto leftDevice = std::make_shared("NimbleDeviceLeft"); auto leftDeviceFilter = std::make_shared("NimbleDeviceLeftDeviceFilter"); leftDeviceFilter->setTranslationScale(0.0001); leftDevice->addInputConsumer(leftDeviceFilter); leftDevice->setOutputProducer(leftDeviceFilter); leftDevice->initialize(); auto rightDevice = std::make_shared("NimbleDeviceRight"); rightDevice->setupToTrackRightHand(); auto rightDeviceFilter = std::make_shared("NimbleDeviceRightDeviceFilter"); rightDeviceFilter->setTranslationScale(0.0001); rightDevice->addInputConsumer(rightDeviceFilter); rightDevice->setOutputProducer(rightDeviceFilter); rightDevice->initialize(); runToolSquareTest(leftDeviceFilter, rightDeviceFilter, "Move the hands to control the sphere/square."); std::cout << std::endl << "Exiting." << std::endl; // Cleanup and shutdown will happen automatically as objects go out of scope. return 0; } opensurgsim-0.7.0/SurgSim/Devices/Novint/000077500000000000000000000000001277777236100203445ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Devices/Novint/CMakeLists.txt000066400000000000000000000032071277777236100231060ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. find_package(NovintHdalSdk REQUIRED) link_directories(${Boost_LIBRARY_DIRS}) set(LIBS SurgSimDataStructures SurgSimFramework SurgSimInput SurgSimMath ${Boost_LIBRARIES} ${NOVINTHDALSDK_LIBRARIES} ${YAML_CPP_LIBRARIES} ) include_directories( "${CMAKE_CURRENT_SOURCE_DIR}" "${NOVINTHDALSDK_INCLUDE_DIR}" ) set(NOVINT_DEVICE_SOURCES NovintDevice.cpp NovintScaffold.cpp ) set(NOVINT_DEVICE_HEADERS NovintDevice.h NovintScaffold.h ) set(DEVICE_HEADERS ${DEVICE_HEADERS} Novint/NovintDevice.h #NOLINT PARENT_SCOPE) # TODO(advornik): the installation should NOT copy all the headers... surgsim_add_library( NovintDevice "${NOVINT_DEVICE_SOURCES}" "${NOVINT_DEVICE_HEADERS}" ) target_link_libraries(NovintDevice ${LIBS}) if(BUILD_TESTING) # The unit tests will be built whenever the library is built. add_subdirectory(UnitTests) if(GLUT_FOUND) add_subdirectory(VisualTest) endif(GLUT_FOUND) endif() # Put NovintDevice into folder "Devices" set_target_properties(NovintDevice PROPERTIES FOLDER "Devices") opensurgsim-0.7.0/SurgSim/Devices/Novint/Novint.dox000066400000000000000000000015321277777236100223360ustar00rootroot00000000000000/*! \page Novint Novint: Haptic Device The Novint Falcon (by Novint Technologies, Inc.) is a 3D force-feedback haptic device. The user holds a grip that measures the hand's position, and can exert forces on the hand. Novint Technologies, Inc., only provides Novint Falcon driver support for Windows. Dependencies: - Windows: - Requires a more recent HDAL SDK than is publicly available (currently 2.1.3 is publicly available) http://home.novint.com/index.php/support/downloads -# Install the Falcon drivers. -# Install the SDK. -# Run NDSSetter as administrator (executable provided with the HDAL SDK) to set an environment variable named NOVINT_DEVICE_SUPPORT to the directory where the SDK was installed. -# Add the directory containing hd.dll to the environment path (e.g., C:\\Program Files (x86)\\novint\\HDAL_SDK_X.X.XX.XX\\bin). */opensurgsim-0.7.0/SurgSim/Devices/Novint/NovintDevice.cpp000066400000000000000000000137571277777236100234620ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Devices/Novint/NovintDevice.h" #include "SurgSim/DataStructures/DataStructuresConvert.h" #include "SurgSim/Devices/Novint/NovintScaffold.h" #include "SurgSim/Math/MathConvert.h" using SurgSim::DataStructures::OptionalValue; namespace SurgSim { namespace Devices { SURGSIM_REGISTER(SurgSim::Input::DeviceInterface, SurgSim::Devices::NovintDevice, NovintDevice); NovintDevice::NovintDevice(const std::string& uniqueName) : Input::CommonDevice(uniqueName, NovintScaffold::buildDeviceInputData()), m_positionScale(1.0), m_orientationScale(1.0), m_7DofDevice(false), m_maxForce(8.9), m_antigrav(Math::Vector3d::Zero()) { SURGSIM_ADD_SERIALIZABLE_PROPERTY(NovintDevice, OptionalValue, InitializationName, getOptionalInitializationName, setOptionalInitializationName); SURGSIM_ADD_SERIALIZABLE_PROPERTY(NovintDevice, OptionalValue, SerialNumber, getOptionalSerialNumber, setOptionalSerialNumber); SURGSIM_ADD_SERIALIZABLE_PROPERTY(NovintDevice, bool, 7DofDevice, is7DofDevice, set7DofDevice); SURGSIM_ADD_SERIALIZABLE_PROPERTY(NovintDevice, double, PositionScale, getPositionScale, setPositionScale); SURGSIM_ADD_SERIALIZABLE_PROPERTY(NovintDevice, double, OrientationScale, getOrientationScale, setOrientationScale); SURGSIM_ADD_SERIALIZABLE_PROPERTY(NovintDevice, double, MaxForce, getMaxForce, setMaxForce); SURGSIM_ADD_SERIALIZABLE_PROPERTY(NovintDevice, Math::Vector3d, Antigrav, getAntigrav, setAntigrav); } NovintDevice::~NovintDevice() { if (isInitialized()) { finalize(); } } void NovintDevice::setSerialNumber(const std::string& serialNumber) { SURGSIM_ASSERT(!m_initializationName.hasValue()) << "Cannot set serialNumber for a NovintDevice named " << getName() << ", which already has an initializationName."; SURGSIM_ASSERT(!isInitialized()) << "Cannot setSerialNumber after the device named " << getName() << " has been initialized."; m_serialNumber.setValue(serialNumber); } bool NovintDevice::getSerialNumber(std::string* serialNumber) const { const bool hasValue = m_serialNumber.hasValue(); if (hasValue) { *serialNumber = m_serialNumber.getValue(); } return hasValue; } void NovintDevice::setInitializationName(const std::string& initializationName) { SURGSIM_ASSERT(!m_serialNumber.hasValue()) << "Cannot set initializationName for a NovintDevice named " << getName() << ", which already has a serialNumber."; SURGSIM_ASSERT(!isInitialized()) << "Cannot setInitializationName after the device named " << getName() << " has been initialized."; m_initializationName.setValue(initializationName); } bool NovintDevice::getInitializationName(std::string* initializationName) const { const bool hasValue = m_initializationName.hasValue(); if (hasValue) { *initializationName = m_initializationName.getValue(); } return hasValue; } bool NovintDevice::initialize() { SURGSIM_ASSERT(!isInitialized()) << getName() << " already initialized."; auto scaffold = NovintScaffold::getOrCreateSharedInstance(); SURGSIM_ASSERT(scaffold != nullptr); bool initialize = false; if (scaffold->registerDevice(this)) { m_scaffold = std::move(scaffold); initialize = true; } return initialize; } bool NovintDevice::finalize() { SURGSIM_ASSERT(isInitialized()) << getName() << " is not initialized, cannot finalize."; bool result = m_scaffold->unregisterDevice(this); m_scaffold.reset(); return result; } bool NovintDevice::isInitialized() const { return (m_scaffold != nullptr); } void NovintDevice::setPositionScale(double scale) { m_positionScale = scale; if (m_scaffold) { m_scaffold->setPositionScale(this, m_positionScale); } } double NovintDevice::getPositionScale() const { return m_positionScale; } void NovintDevice::setOrientationScale(double scale) { m_orientationScale = scale; if (m_scaffold) { m_scaffold->setOrientationScale(this, m_orientationScale); } } double NovintDevice::getOrientationScale() const { return m_orientationScale; } void NovintDevice::set7DofDevice(bool val) { SURGSIM_ASSERT(!isInitialized()) << "Cannot set 7Dof status after initialization."; m_7DofDevice = val; } bool NovintDevice::is7DofDevice() const { return m_7DofDevice; } void NovintDevice::setMaxForce(double force) { SURGSIM_ASSERT(!isInitialized()) << "Cannot setMaxForce after the device named " << getName() << " has been initialized."; SURGSIM_ASSERT(force >= 0.0) << "Cannot set a negative maximum force magnitude on device named " << getName(); m_maxForce = force; } double NovintDevice::getMaxForce() const { return m_maxForce; } void NovintDevice::setAntigrav(Math::Vector3d antigrav) { SURGSIM_ASSERT(!isInitialized()) << "Cannot setAntigrav after the device named " << getName() << " has been initialized."; m_antigrav = antigrav; } Math::Vector3d NovintDevice::getAntigrav() const { return m_antigrav; } const OptionalValue& NovintDevice::getOptionalInitializationName() const { return m_initializationName; } void NovintDevice::setOptionalInitializationName(const OptionalValue& name) { m_initializationName = name; } const OptionalValue& NovintDevice::getOptionalSerialNumber() const { return m_serialNumber; } void NovintDevice::setOptionalSerialNumber(const OptionalValue& serial) { m_serialNumber = serial; } }; // namespace Devices }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Devices/Novint/NovintDevice.h000066400000000000000000000226601277777236100231200ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DEVICES_NOVINT_NOVINTDEVICE_H #define SURGSIM_DEVICES_NOVINT_NOVINTDEVICE_H #include #include "SurgSim/DataStructures/OptionalValue.h" #include "SurgSim/Input/CommonDevice.h" namespace SurgSim { namespace Devices { class NovintScaffold; SURGSIM_STATIC_REGISTRATION(NovintDevice); /// A class implementing the communication with a Novint Falcon device. /// /// This should provide basic support for any device that can communicate using the Novint HDAL SDK toolkit, such as /// the off-the-shelf Novint Falcon haptic gaming controller. Note that certain devices may require device-specific /// support in the code to enable particular hardware features. In particular, the Novint Falcon with the Open Surgery /// Grip will not be able to produce torques unless it is accessed using the NovintOsgDevice class. /// /// \par Application input provided by the device: /// | type | name | | /// | ---- | ---- | --- | /// | pose | "pose" | %Device pose (units are meters)*. | /// | scalar | "toolDof" | %7th Dof (e.g., handle open/close angle) | /// | bool | "button1" | %State of the first device button if present.** | /// | bool | "button2" | %State of the second device button if present.** | /// | bool | "button3" | %State of the third device button if present.** | /// | bool | "button4" | %State of the third device button if present.** | /// | bool | "isHomed" | %Device homing status. | /// | bool | "isPositionHomed" | %Device homing status, position only. | /// | bool | "isOrientationHomed" | %Device homing status, orientation only. | /// * The workspace of an off-the-shelf Novint Falcon is +z points out from the face of the Falcon, +y points up, and /// +x points to your right if you are looking at the face of the Falcon (a right-hand frame). The workspace of /// both 7dof OSG Falcons in a pair is +x towards the right Falcon, +y up, and +z towards the user /// (a right-hand frame). Thus, if the 7dof OSG Falcons are setup in a typical configuration such that the /// left Falcon is to the user's left and the right Falcon is to the user's right, then the workspace will be the /// same as an off-the-shelf Falcon placed directly facing the user. The identity orientation for an OSG Falcon /// is with the handle of the tool parallel to the floor (pitch), and pointed towards the user (yaw)...therefore /// in the home pose, the "business end" of the tool points away from the user along the -z axis. /// **\c button1 through \c 4 correspond to the buttons 0 through 3 provided by the HDAL SDK, but a custom /// Novint device might have fewer than 4 buttons. /// /// \par Application output used by the device: /// | type | name | | /// | ---- | ---- | --- | /// | vector | "force" | %Device output force (units are newtons). | /// | vector | "torque" | %Device output torque (in newton-meters, 7Dof only). | /// | bool | "gravityCompensation" | Enable or disable hardware gravity compensation. | /// class NovintDevice : public SurgSim::Input::CommonDevice { public: /// Constructor. /// \param name A unique name for the device that will be used by the application. explicit NovintDevice(const std::string& name); SURGSIM_CLASSNAME(SurgSim::Devices::NovintDevice); /// Destructor. virtual ~NovintDevice(); /// Sets the serial number used to register this device with the hardware library. /// An empty string indicates the first available device. /// \param serialNumber The serial number. /// \sa setInitializationName void setSerialNumber(const std::string& serialNumber); /// Gets the serial number used to register this device with the hardware library. /// \param [out] serialNumber The serial number, if set. /// \return true if the serialNumber has been set. bool getSerialNumber(std::string* serialNumber) const; /// Sets the name used to register this device with the hardware library. /// To use an initialization name, the 'devices.yaml' file must be in the working directory, /// (see example at Data/devices.yaml) with an entry of the form "initializationName: serialNumber". /// An empty string indicates the first available device. /// \param initializationName The initialization name. /// \sa setSerialNumber void setInitializationName(const std::string& initializationName); /// Gets the name used to register this device with the hardware library. /// \param [out] initializationName The initialization name, if set. /// \return true if the initializationName has been set bool getInitializationName(std::string* initializationName) const; bool initialize() override; bool isInitialized() const override; /// Sets the position scale for this device. /// The position scale controls how much the pose changes for a given device translation. /// The default value for a raw device tries to correspond to the actual physical motion of the device. /// \param scale The multiplicative factor to apply to the position. void setPositionScale(double scale); /// Gets the position scale for this device. double getPositionScale() const; /// Sets the orientation scale for this device. /// The orientation scale controls how much the pose changes for a given device rotation. /// The default value for a raw device tries to correspond to the actual physical motion of the device. /// \param scale The multiplicative factor to apply to the rotation angles. void setOrientationScale(double scale); /// Gets the orientation scale for this device. double getOrientationScale() const; /// Sets whether or not this is supposed to be a 7Dof device. /// If the hardware is not actually 7Dof, the resulting device will never home. /// If the hardware is 7Dof, and this is not called, the resulting device will act like a typical 3Dof. /// \param val true for a 7Dof device. void set7DofDevice(bool val); /// Query if this object represents a 7 degree of freedom hardware device. /// \return true if 7 degree of freedom device, false if not. virtual bool is7DofDevice() const; /// Set the maximum force that can be sent to the device. Higher force values will be scaled to this magnitude. /// Generally Falcons are robust enough that commanding excessive forces will not cause a problem, /// but in-development systems may overheat if over-driven. /// \param force The maximum force magnitude (in Newtons) that will be sent to the hardware. void setMaxForce(double force); /// \return The maximum force (in Newtons) that can be sent to the device. double getMaxForce() const; /// Set a constant force that gets added to all forces sent to the hardware. /// \param antigrav The anti-gravity force in Newtons. void setAntigrav(Math::Vector3d antigrav); /// \return The constant force that gets added to all forces sent to the hardware (in Newtons). Math::Vector3d getAntigrav() const; protected: /// True if the device is 7Dof, false if the device is 3Dof. bool m_7DofDevice; /// The maximum force magnitude (in Newtons) that should be sent to the hardware. double m_maxForce; /// The anti-gravity force in Newtons. Math::Vector3d m_antigrav; private: friend class NovintScaffold; bool finalize() override; ///@{ /// Used for serializing optional properties const DataStructures::OptionalValue& getOptionalInitializationName() const; void setOptionalInitializationName(const DataStructures::OptionalValue& name); const DataStructures::OptionalValue& getOptionalSerialNumber() const; void setOptionalSerialNumber(const DataStructures::OptionalValue& serial); ///@} /// The scaffold handles all the communication with the SDK. std::shared_ptr m_scaffold; /// The name passed to the SDK to specify which hardware device should be used. SurgSim::DataStructures::OptionalValue m_initializationName; /// The serial number passed to the SDK to specify which hardware device should be used. SurgSim::DataStructures::OptionalValue m_serialNumber; /// Scale factor for the position axes; stored locally before the device is initialized. double m_positionScale; /// Scale factor for the orientation axes; stored locally before the device is initialized. double m_orientationScale; }; }; // namespace Devices }; // namespace SurgSim #endif // SURGSIM_DEVICES_NOVINT_NOVINTDEVICE_H opensurgsim-0.7.0/SurgSim/Devices/Novint/NovintScaffold.cpp000066400000000000000000001375201277777236100237770ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Devices/Novint/NovintScaffold.h" #include #include #include #include #include #include #include #include #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/DataStructures/DataGroupBuilder.h" #include "SurgSim/Devices/Novint/NovintDevice.h" #include "SurgSim/Framework/ApplicationData.h" #include "SurgSim/Framework/Clock.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Framework/SharedInstance.h" #include "SurgSim/Framework/Timer.h" #include "SurgSim/Math/Matrix.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Vector.h" using SurgSim::DataStructures::DataGroup; using SurgSim::Math::makeRotationMatrix; using SurgSim::Math::Matrix33d; using SurgSim::Math::RigidTransform3d; using SurgSim::Math::Vector3d; using SurgSim::Math::Vector4d; namespace { /// Convert a HDLError to text. /// Error code and descriptions are from Novint's hdlErrors.h file. std::string convertErrorCodeToString(HDLError errorCode) { switch (errorCode) { case HDL_ERROR_STACK_OVERFLOW: return "Overflow of error stack"; case HDL_ERROR_INTERNAL: return "HDAL internal error"; case HDL_ERROR_INIT_FAILED: return "Device initialization error"; case HDL_INIT_INI_NOT_FOUND: return "Could not find configuration file"; case HDL_INIT_INI_DLL_STRING_NOT_FOUND: return "No DLL name in configuration file"; case HDL_INIT_INI_MANUFACTURER_NAME_STRING_NOT_FOUND: return "No MANUFACTURER_NAME value in configuration file"; case HDL_INIT_DLL_LOAD_ERROR: return "Could not load driver DLL"; case HDL_INIT_DEVICE_FAILURE: return "Failed to initialize device"; case HDL_INIT_DEVICE_ALREADY_INITED: return "Device already initialized"; case HDL_INIT_DEVICE_NOT_CONNECTED: return "Requested device not connected"; case HDL_SERVO_START_ERROR: return "Could not start servo thread"; default: return ""; } } /// Check for HDAL errors, display them, and signal fatal errors. /// \param message An additional descriptive message. /// \return true if there was a fatal error; false if everything is OK. bool isFatalError(const std::string& message) { HDLError errorCode = hdlGetError(); if (errorCode == HDL_NO_ERROR) { return false; } // The HDAL maintains an error stack, so in theory there could be more than one error pending. // We do head recursion to get them all in the correct order, and hope we don't overrun the stack... bool isFatal = isFatalError(message); SURGSIM_LOG_SEVERE(SurgSim::Framework::Logger::getLogger("Devices/Novint")) << message << std::endl << " Error text from HDAL: '" << convertErrorCodeToString(errorCode) << "'" << std::endl << " Error code: 0x" << std::hex << std::setw(4) << std::setfill('0') << errorCode << std::endl; return (isFatal || (errorCode != HDL_ERROR_STACK_OVERFLOW)); } }; namespace SurgSim { namespace Devices { class NovintScaffold::Handle { public: explicit Handle(const std::string& info, bool initBySerialNumber = true) : m_deviceHandle(HDL_INVALID_HANDLE) { if (initBySerialNumber) { m_deviceHandle = hdlInitDeviceBySerialNumber(info.c_str()); } else { m_deviceHandle = hdlInitNamedDevice(info.c_str()); } if (isFatalError("Failed to initialize")) { SURGSIM_LOG_INFO(Framework::Logger::getLogger("Devices/Novint")) << (initBySerialNumber ? "HDAL serial number: '" : "device name: '") << info << "'"; } else if (!isValid()) { if (initBySerialNumber) { SURGSIM_LOG_SEVERE(Framework::Logger::getLogger("Devices/Novint")) << "No error during initializing device with serial number: '" << info << "', but an invalid handle returned. Is that Novint device plugged in?"; } else { SURGSIM_LOG_SEVERE(Framework::Logger::getLogger("Devices/Novint")) << "No error during initializing device named: '" << info << "', but an invalid handle returned. Is that Novint device plugged in? " << "Did the HDAL find hdal.ini? Is the initialization name in the hdal.ini?"; } } else { SURGSIM_LOG_DEBUG(Framework::Logger::getLogger("Devices/Novint")) << "Handle " << m_deviceHandle << " created for device: '" << info << "'."; } } ~Handle() { if (isValid()) { isFatalError("Error prior to calling hdlUninitDevice"); SURGSIM_LOG_DEBUG(Framework::Logger::getLogger("Devices/Novint")) << "Handle " << m_deviceHandle << " destructing, calling hdlUninitDevice."; hdlUninitDevice(m_deviceHandle); m_deviceHandle = HDL_INVALID_HANDLE; isFatalError("Error calling hdlUninitDevice"); SURGSIM_LOG_DEBUG(Framework::Logger::getLogger("Devices/Novint")) << "Handle " << m_deviceHandle << " destructed, hdlUninitDevice called."; } } bool isValid() const { return (m_deviceHandle != HDL_INVALID_HANDLE); } HDLDeviceHandle get() const { SURGSIM_ASSERT(isValid()) << "HDL device handle is not valid."; return m_deviceHandle; } private: // Prevent copy construction and copy assignment. (VS2012 does not support "= delete" yet.) Handle(const Handle&) /*= delete*/; Handle& operator=(const Handle&) /*= delete*/; /// The HDAL device handle (or HDL_INVALID_HANDLE if not valid). HDLDeviceHandle m_deviceHandle; }; class NovintScaffold::Callback { public: explicit Callback(NovintScaffold* scaffold) : m_callbackHandle(HDL_INVALID_HANDLE) { SURGSIM_ASSERT(scaffold != nullptr) << "Callback::create needs non-nullptr scaffold."; m_callbackHandle = hdlCreateServoOp(run, scaffold, false); if (!isFatalError("Failed to create servoOp callback")) { if (!isValid()) { SURGSIM_LOG_SEVERE(Framework::Logger::getLogger("Devices/Novint")) << "Servo operation created, but invalid servo operation entry handle returned." << std::endl << " Error details: unknown (HDAL returned an invalid servo operation entry handle)"; } else { SURGSIM_LOG_DEBUG(Framework::Logger::getLogger("Devices/Novint")) << "Callback created, hdlCreateServoOp called."; } } } ~Callback() { if (isValid()) { isFatalError("Error prior to stopping haptic callback"); SURGSIM_LOG_DEBUG(Framework::Logger::getLogger("Devices/Novint")) << "Callback destructing, calling hdlDestroyServoOp..."; hdlDestroyServoOp(m_callbackHandle); SURGSIM_LOG_IF(!isFatalError("Error stopping haptic callback"), Framework::Logger::getLogger("Devices/Novint"), DEBUG) << "Callback destructing, hdlDestroyServoOp called."; m_callbackHandle = HDL_INVALID_HANDLE; } } bool isValid() const { return (m_callbackHandle != HDL_INVALID_HANDLE); } private: // Prevent copy construction and copy assignment. (VS2012 does not support "= delete" yet.) Callback(const Callback&) /*= delete*/; Callback& operator=(const Callback&) /*= delete*/; /// The callback wrapper passed to HDAL. /// \param [in,out] data The user data (in our case, the scaffold pointer). /// \return HD_CALLBACK_CONTINUE to wait for the next frame, or HD_CALLBACK_DONE to terminate further calls. static HDLServoOpExitCode run(void* data); /// The haptic loop callback handle (or HDL_INVALID_HANDLE if not valid). HDLOpHandle m_callbackHandle; }; HDLServoOpExitCode NovintScaffold::Callback::run(void* data) { static_cast(data)->runHapticFrame(); return HDL_SERVOOP_CONTINUE; } struct NovintScaffold::DeviceData { /// Initialize the state. explicit DeviceData(NovintDevice* device) : initializationName(""), serialNumber(""), deviceObject(device), isPositionHomed(false), isOrientationHomed(false), isDeviceHomed(false), isDeviceHeld(false), isDevice7Dof(device->is7DofDevice()), maxForce(device->getMaxForce()), antigrav(device->getAntigrav()), isDeviceRollAxisReversed(false), eulerAngleOffsetRoll(0.0), eulerAngleOffsetYaw(0.0), eulerAngleOffsetPitch(0.0), toolDof(0.0), forwardPointingPoseThreshold(0.9), torqueScale(Vector3d::Constant(1.0)), positionScale(device->getPositionScale()), orientationScale(device->getOrientationScale()), jointAngles(Vector3d::Zero()), force(Vector3d::Zero()), torque(Vector4d::Zero()), scaledPose(RigidTransform3d::Identity()) { buttonStates.fill(false); } /// The maximum number of buttons supported by any device object. static const size_t MAX_NUM_BUTTONS = 4; /// Type used to store button states. typedef std::array ButtonStates; /// The HDAL device name. std::string initializationName; /// The HDAL device serial number. std::string serialNumber; /// The corresponding device object. NovintDevice* const deviceObject; /// The device handle wrapper. std::shared_ptr deviceHandle; /// The joint angles for the device orientation. Vector3d jointAngles; /// The button state read from the device. ButtonStates buttonStates; /// The homing state read from the device. bool isPositionHomed; /// The homing state read from the device. bool isOrientationHomed; /// The homing state read from the device. bool isDeviceHomed; /// The proximity state read from the device. bool isDeviceHeld; /// True if this is a 7DoF device. bool isDevice7Dof; /// The maximum force magnitude (in Newtons) to send to the device. double maxForce; /// The constant force added to all forces sent to the device (in Newtons). Vector3d antigrav; /// True if the roll axis of a 7DoF device has reverse polarity because the device is left-handed. bool isDeviceRollAxisReversed; /// The offset added to the roll Euler angle. double eulerAngleOffsetRoll; /// The offset added to the yaw Euler angle. double eulerAngleOffsetYaw; /// The offset added to the pitch Euler angle. double eulerAngleOffsetPitch; /// The tool's degree-of-freedom, e.g., the handle's open/close angle. double toolDof; /// The threshold to determine if the device is pointing forwards before unlocking orientation. double forwardPointingPoseThreshold; /// The scaling factors for the torque axes. Vector3d torqueScale; /// The pose value from the device, after scaling. RigidTransform3d scaledPose; /// The force value to be written to the device. Vector3d force; /// The torque value to be written to the device. Vector4d torque; /// Scale factor for the position axes. double positionScale; /// Scale factor for the orientation axes. double orientationScale; /// The mutex that protects the externally modifiable parameters. boost::mutex parametersMutex; private: // Prevent copy construction and copy assignment. (VS2012 does not support "= delete" yet.) DeviceData(const DeviceData&) /*= delete*/; DeviceData& operator=(const DeviceData&) /*= delete*/; }; struct NovintScaffold::StateData { public: /// Initialize the state. StateData() : isApiInitialized(false), logger(Framework::Logger::getLogger("Devices/Novint")) { } /// True if the API has been initialized (and not finalized). bool isApiInitialized; /// Wrapper for the haptic loop callback handle. std::unique_ptr callback; /// The registered devices. std::list> registeredDevices; /// The map from serial number to Handle for all devices that were available when the SDK was initialized. std::unordered_map> serialToHandle; /// List of devices that have been unregistered and should have their forces, torques, and gravity compensation /// zeroed in the next update. std::list> unregisteredHandles; /// The map from name to serial number for all devices. std::map nameToSerial; /// The mutex that protects the list of registered devices. boost::mutex mutex; /// Time of the initialization of the latest handle. Framework::Clock::time_point initializationTime; /// Timer to measure update rate. Framework::Timer timer; /// Logger used by the scaffold and all devices. std::shared_ptr logger; private: // Prevent copy construction and copy assignment. (VS2012 does not support "= delete" yet.) StateData(const StateData&) /*= delete*/; StateData& operator=(const StateData&) /*= delete*/; }; template static inline T clampToRange(T value, T rangeMin, T rangeMax) { if (value < rangeMin) return rangeMin; if (value > rangeMax) return rangeMax; return value; } NovintScaffold::NovintScaffold() : m_state(new StateData) { { // Drain the HDAL error stack while (hdlGetError() != HDL_NO_ERROR) { } } m_state->timer.setMaxNumberOfFrames(5000); // The canonical HDAL approach (Programmer's Guide, section 4.7 Multiple devices) is: // 1) hdlInitXXXX on all devices that will be used by this application, // 2) hdlStart (must be after all hdlInitX and before hdlCreateServoOp), then // 3) hdlCreateServoOp (starts the callback). // Note: 1. If no device is initialized (i.e. hdlInitXXX returned an invalid handle), // don't call hdlStart() or it will crash. // 2. In order to use Novint 7Dof device, device MUST BE initialized by name (NOT by serial number). // Novint 3Dof device could be used/initialized either by name or serial number. // 3. If a Novint device is in 'cut-out' state (happened with E3 binary/serial number), // HDAL library will crash. // Load the list of Novint devices (devices.yaml) user wants to use. m_state->nameToSerial = getNameMap(); if (createAllHandles()) { hdlStart(); if (!isFatalError("Couldn't start HDAL scheduler")) { SURGSIM_LOG_DEBUG(m_state->logger) << "Scheduler started, hdlStart called."; std::unique_ptr callback(new Callback(this)); if (callback->isValid()) { m_state->callback = std::move(callback); m_state->isApiInitialized = true; SURGSIM_LOG_DEBUG(m_state->logger) << "Callback scheduled; Scaffold created successfully."; } else { SURGSIM_LOG_SEVERE(m_state->logger) << "Failed to create a callback."; hdlStop(); isFatalError("Couldn't stop HDAL scheduler"); } } } } NovintScaffold::~NovintScaffold() { if (m_state->isApiInitialized) { // The HDAL seems to do bad things (and the CRT complains) if we uninitialize the device too soon. const int MINIMUM_LIFETIME_MILLISECONDS = 500; Framework::Clock::time_point earliestEndTime = m_state->initializationTime + boost::chrono::milliseconds(MINIMUM_LIFETIME_MILLISECONDS); boost::this_thread::sleep_until(earliestEndTime); m_state->callback = nullptr; SURGSIM_LOG_DEBUG(m_state->logger) << "Callback reset.\nStopping HDAL scheduler..."; hdlStop(); SURGSIM_LOG_IF(!isFatalError("Couldn't stop HDAL scheduler"), m_state->logger, DEBUG) << "HDAL scheduler stopped, hdlStop called."; boost::this_thread::sleep_for(boost::chrono::milliseconds(10)); if (!m_state->registeredDevices.empty()) { SURGSIM_LOG_SEVERE(m_state->logger) << "Destroying scaffold while there are still registered devices!?!"; m_state->registeredDevices.clear(); } destroyAllHandles(); SURGSIM_LOG_DEBUG(m_state->logger) << "Scaffold destroyed."; } } bool NovintScaffold::registerDevice(NovintDevice* device) { boost::lock_guard lock(m_state->mutex); // Make sure the serial number is unique. std::string serialNumber; if ((device->getSerialNumber(&serialNumber)) && (!serialNumber.empty())) { auto& sameSerialNumber = std::find_if(m_state->registeredDevices.cbegin(), m_state->registeredDevices.cend(), [&serialNumber](const std::unique_ptr& info) { return info->serialNumber == serialNumber; }); if (sameSerialNumber != m_state->registeredDevices.end()) { SURGSIM_LOG_CRITICAL(m_state->logger) << "Tried to register a device when the same serial number " << serialNumber <<" is already present!"; return false; } } // Make sure the initialization name is unique. std::string initializationName; if ((device->getInitializationName(&initializationName)) && (!initializationName.empty())) { auto& sameInitializationName = std::find_if(m_state->registeredDevices.cbegin(), m_state->registeredDevices.cend(), [&initializationName](const std::unique_ptr& info) { return info->initializationName == initializationName; }); if (sameInitializationName != m_state->registeredDevices.end()) { SURGSIM_LOG_CRITICAL(m_state->logger) << "Tried to register a device when the same initialization (HDAL) name " << initializationName << " is already present!"; return false; } } // Construct the object, start its thread, then move it to the list. // Note that since Visual Studio 2010 doesn't support multi-argument emplace_back() for STL containers, storing a // list of unique_ptr results in nicer code than storing a list of DeviceData values directly. std::unique_ptr info(new DeviceData(device)); info->serialNumber = serialNumber; info->initializationName = initializationName; if (!initializeDeviceState(info.get())) { return false; // message already printed } m_state->registeredDevices.emplace_back(std::move(info)); SURGSIM_LOG_INFO(m_state->logger) << "Device " << device->getName() << " initialized. Maximum force is " << m_state->registeredDevices.back()->maxForce << " Newtons. Antigrav is (" << m_state->registeredDevices.back()->antigrav.transpose() << ") Newtons"; return true; } bool NovintScaffold::unregisterDevice(const NovintDevice* const device) { bool result = false; std::unique_ptr savedInfo; { boost::lock_guard lock(m_state->mutex); auto& matching = std::find_if(m_state->registeredDevices.begin(), m_state->registeredDevices.end(), [&device](const std::unique_ptr& info) { return info->deviceObject == device; }); if (matching != m_state->registeredDevices.end()) { savedInfo = std::move(*matching); m_state->registeredDevices.erase(matching); m_state->unregisteredHandles.push_back(savedInfo->deviceHandle); SURGSIM_LOG_INFO(m_state->logger) << "Device " << device->getName() << " finalized."; result = true; // the iterator is now invalid but that's OK } } SURGSIM_LOG_IF(!result, m_state->logger, SEVERE) << "Attempted to release a non-registered device."; return result; } std::shared_ptr NovintScaffold::findHandleByInitializationName(const std::string& initializationName) { std::shared_ptr handle; if (initializationName.empty()) { // get the first available for (auto& it : m_state->serialToHandle) { auto& possibleHandle = it.second; auto& matching = std::find_if(m_state->registeredDevices.begin(), m_state->registeredDevices.end(), [&possibleHandle](const std::unique_ptr& info) { return info->deviceHandle == possibleHandle; }); if (matching == m_state->registeredDevices.end()) { handle = possibleHandle; break; } } if (handle == nullptr) { SURGSIM_ASSERT(m_state->serialToHandle.size() == m_state->registeredDevices.size()) << "Failed to find an un-registered device when the number of registered devices is not equal to" << " the number of devices found at startup."; SURGSIM_LOG_SEVERE(m_state->logger) << "Attempted to register a default device, but no more devices are available." << " There were " << m_state->serialToHandle.size() << " devices available at program start."; } } else { if (m_state->nameToSerial.count(initializationName) > 0) { const std::string& serial = m_state->nameToSerial[initializationName]; if (m_state->serialToHandle.count(serial) > 0) { handle = m_state->serialToHandle[serial]; } else { SURGSIM_LOG_SEVERE(m_state->logger) << "Attempted to register a device named '" << initializationName << "', which should map to serial number " << serial << ", but no device with that serial number is available. " << "Is it plugged in? Is the correct hdal.ini found and does it have an entry for this name?"; } } else { SURGSIM_LOG_SEVERE(m_state->logger) << "Attempted to register a device named '" << initializationName << "', but that name does not map to a serial number. The configuration file (devices.yaml) was " << (m_state->nameToSerial.empty() ? "not found, did not contain a YAML node (the map from name to serial number), or the map was empty." : "found, but the device name is not a key in the contained map from name to serial number."); } } return handle; } bool NovintScaffold::initializeDeviceState(DeviceData* info) { SURGSIM_ASSERT(info->deviceHandle == nullptr) << "The raw handle should be nullptr before initialization."; if (info->serialNumber.empty()) { info->deviceHandle = findHandleByInitializationName(info->initializationName); } else { if (m_state->serialToHandle.count(info->serialNumber) > 0) { info->deviceHandle = m_state->serialToHandle[info->serialNumber]; } else { SURGSIM_LOG_SEVERE(m_state->logger) << "Attempted to register a device by serial number for serial number " << info->serialNumber << ", but no device with that serial number is available."; } } m_state->unregisteredHandles.remove(info->deviceHandle); return info->deviceHandle != nullptr; } bool NovintScaffold::updateDeviceOutput(DeviceData* info, bool pulledOutput) { hdlMakeCurrent(info->deviceHandle->get()); // This device is now "current", and all hdlXxx calls apply to it. bool fatalError = isFatalError("hdlMakeCurrent()"); info->force.setZero(); info->torque.setZero(); if (info->isDeviceHomed && pulledOutput) { bool desiredGravityCompensation = false; if (info->deviceObject->getOutputData().booleans().get("gravityCompensation", &desiredGravityCompensation)) { setGravityCompensation(info, desiredGravityCompensation); } calculateForceAndTorque(info); } // Set the force command (in newtons). const double norm = info->force.norm(); if (norm > info->maxForce) { info->force = info->force.normalized() * info->maxForce; } hdlGripSetAttributev(HDL_GRIP_FORCE, 0, info->force.data()); // 2nd arg is index; output force is always "vector #0" fatalError = fatalError || isFatalError("hdlGripSetAttributev(HDL_GRIP_FORCE)"); if (info->isDevice7Dof) { // Set the torque vector. Also set the jaw squeeze torque (as 4th element of the array)-- though this is not // used anywhere at the moment. // The 2nd arg to this call is the count; we're setting 4 doubles. hdlGripSetAttributesd(HDL_GRIP_TORQUE, 4, info->torque.data()); fatalError = fatalError || isFatalError("hdlGripSetAttributesd(HDL_GRIP_TORQUE)"); } return !fatalError; } bool NovintScaffold::updateDeviceInput(DeviceData* info) { boost::lock_guard lock(info->parametersMutex); hdlMakeCurrent(info->deviceHandle->get()); // This device is now "current", and all hdlXxx calls apply to it. bool fatalError = isFatalError("hdlMakeCurrent()"); info->buttonStates.fill(false); hdlGripGetAttributesb(HDL_GRIP_BUTTON, static_cast(info->buttonStates.size()), info->buttonStates.data()); fatalError = fatalError || isFatalError("hdlGripGetAttributesb(HDL_GRIP_BUTTON)"); checkDeviceHoming(info); if (info->isPositionHomed) { hdlGripGetAttributev(HDL_GRIP_POSITION, 0, info->scaledPose.translation().data()); fatalError = fatalError || isFatalError("hdlGripGetAttributev(HDL_GRIP_POSITION)"); info->scaledPose.translation() *= info->positionScale; } // Get the additional 7DoF data if available. if (info->isDevice7Dof) { if (info->isPositionHomed) { // The 7dofs should have +x towards the right Falcon (i.e., to the user's right), // +y up, and +z towards the user (i.e., right-hand frame based on x & y), so we transform from // the per-device HDAL workspace. static const Matrix33d leftTranslationTransform = makeRotationMatrix(M_PI_2, Vector3d::UnitY().eval()); static const Matrix33d rightTranslationTransform = makeRotationMatrix(-M_PI_2, Vector3d::UnitY().eval()); if (info->isDeviceRollAxisReversed) { info->scaledPose.translation() = leftTranslationTransform * info->scaledPose.translation(); } else { info->scaledPose.translation() = rightTranslationTransform * info->scaledPose.translation(); } } int gripStatus[2] = { 0, 0 }; // OSG2 grips report their "handedness" in the LSB of the second raw status byte // We re-check this state each update because sometimes the first few callbacks have incorrect states. hdlGripGetAttributes(HDL_GRIP_STATUS, 2, gripStatus); if (isFatalError("Cannot get grip status")) { // HDL reported an error. An error message was already logged. return false; } info->eulerAngleOffsetRoll = 0.0; bool leftHanded = (gripStatus[1] & 0x01) != 0; if (leftHanded) { info->isDeviceRollAxisReversed = true; info->eulerAngleOffsetYaw = -0.5; info->eulerAngleOffsetPitch = -0.9; } else { info->isDeviceRollAxisReversed = false; info->eulerAngleOffsetYaw = 0.3; info->eulerAngleOffsetPitch = -0.7; } if (info->isOrientationHomed) { // We compute the device orientation from the joint angles, for two reasons. The first that it lets us // compensate for recurrent bugs in the HDAL grip code. The second is that we'll need the joint angles in // order to correctly generate joint torques. double angles[4]; hdlGripGetAttributesd(HDL_GRIP_ANGLE, 4, angles); fatalError = fatalError || isFatalError("hdlGripGetAttributesd(HDL_GRIP_ANGLE)"); // The zero values are NOT the home orientation, and we are flipping some axes to map to our desired // device workspace (from the underlying per-device HDAL workspace). if (info->isDeviceRollAxisReversed) { info->jointAngles[0] = -angles[0] + info->eulerAngleOffsetRoll; info->jointAngles[1] = angles[1] + info->eulerAngleOffsetYaw; info->jointAngles[2] = angles[2] + info->eulerAngleOffsetPitch; } else { info->jointAngles[0] = angles[0] + info->eulerAngleOffsetRoll; info->jointAngles[1] = angles[1] + info->eulerAngleOffsetYaw; info->jointAngles[2] = -angles[2] + info->eulerAngleOffsetPitch; } /* HW-Nov-12-2015 Testing on Nov 10, 2015 shows that hdlGripGetAttributesd(HDL_GRIP_ANGLE, 3, &info->toolDof); gives the correct reading for the 7th Dof value. However, it didn't give correct value in follow up tests. 'angles[3]' has the value for the 7th Dof now (but it didn't on Nov 10's test). hdlGripGetAttributesd(HDL_GRIP_ANGLE, 3, &info->toolDof); should be kept in mind. */ info->toolDof = angles[3]; // Get the reading for 7th Dof, the open/close angle of the tool. // For the Falcon 7DoF grip, the axes are perpendicular and the joint angles are Euler angles. // The home position (identity orientation) is with the tool parallel to the ground with the handle pointed // at the user (and some roll angle). Matrix33d rotationX = makeRotationMatrix(info->jointAngles[2] * info->orientationScale, Vector3d(Vector3d::UnitX())); Matrix33d rotationY = makeRotationMatrix(info->jointAngles[1] * info->orientationScale, Vector3d(Vector3d::UnitY())); Matrix33d rotationZ = makeRotationMatrix(info->jointAngles[0] * info->orientationScale, Vector3d(Vector3d::UnitZ())); info->scaledPose.linear() = rotationY * rotationX * rotationZ; } } setInputData(info); return !fatalError; } void NovintScaffold::checkDeviceHoming(DeviceData* info) { unsigned int deviceStateBitmask = hdlGetState(); info->isPositionHomed = ((deviceStateBitmask & HDAL_NOT_CALIBRATED) == 0); if (info->isDevice7Dof) { // The homing state is communicated using the button information. info->isOrientationHomed = info->buttonStates[0] && info->buttonStates[1]; // So is the state of whether the device is currently held (proximity sensor). info->isDeviceHeld = info->buttonStates[2]; // There are no ACTUAL buttons on the 7DoF Falcons, so we clear the button buffer. info->buttonStates.fill(false); } else { // The 3-DoF device doesn't need the orientation homing shenanigans... info->isOrientationHomed = true; info->isDeviceHomed = info->isPositionHomed; info->isDeviceHeld = true; // ...I guess } if (info->isPositionHomed && info->isOrientationHomed && !info->isDeviceHomed) { // Wait until the tool is pointed forwards (i.e. perpendicular to the Falcon centerline) before proclaiming the // whole device homed. static const Vector3d forwardDirection = Vector3d::UnitZ(); double forwardMetric = forwardDirection.dot(info->scaledPose.linear() * forwardDirection); SURGSIM_LOG_DEBUG(m_state->logger) << "NovintDevice " << info->deviceObject->getName() << " is position- and orientation-homed, but needs to be near the home orientation. forwardMetric " << forwardMetric << " vs. threshold " << info->forwardPointingPoseThreshold; if (forwardMetric >= info->forwardPointingPoseThreshold) { // It looks like everything is ready! info->isDeviceHomed = true; } } } void NovintScaffold::calculateForceAndTorque(DeviceData* info) { const DataGroup& outputData = info->deviceObject->getOutputData(); outputData.vectors().get(DataStructures::Names::FORCE, &(info->force)); info->force += info->antigrav; // If the springJacobian was provided, multiply with the change in position since the output data was set, // to get a delta force. This way a linearized output force is calculated at haptic update rates. Math::Vector6d deltaPosition; DataGroup::DynamicMatrixType springJacobian; bool havespringJacobian = outputData.matrices().get(DataStructures::Names::SPRING_JACOBIAN, &springJacobian); if (havespringJacobian) { RigidTransform3d poseForNominal = info->scaledPose; outputData.poses().get(DataStructures::Names::INPUT_POSE, &poseForNominal); Vector3d rotationVector = Vector3d::Zero(); // Unfortunately, the current version of the OSG Falcon does not provide the roll angle via // hdlGripGetAttributesd(HDL_GRIP_ANGLE, ...) so here we do not know the actual orientation of a 7Dof robot // (and a 3Dof robot will not change orientation). // Math::computeRotationVector(info->scaledPose, poseForNominal, &rotationVector); Math::setSubVector(info->scaledPose.translation() - poseForNominal.translation(), 0, 3, &deltaPosition); Math::setSubVector(rotationVector, 1, 3, &deltaPosition); info->force += springJacobian.block<3,6>(0, 0) * deltaPosition; } /* Since the HDAL does not provide a velocity, NovintScaffold cannot use the damper Jacobian. // TODO(ryanbeasley): consider adding a velocity filter setting to NovintDevice/DeviceData. // If the damperJacobian was provided, calculate a delta force based on the change in velocity. Math::Vector6d deltaVelocity; DataGroup::DynamicMatrixType damperJacobian; bool havedamperJacobian = outputData.matrices().get(DataStructures::Names::DAMPER_JACOBIAN, &damperJacobian); if (havedamperJacobian) { Vector3d linearVelocity = Vector3d::Zero(); Vector3d angularVelocity = Vector3d::Zero(); Vector3d linearVelocityForNominal = linearVelocity; outputData.vectors().get(DataStructures::Names::INPUT_LINEAR_VELOCITY, &linearVelocityForNominal); Vector3d angularVelocityForNominal = angularVelocity; outputData.vectors().get(DataStructures::Names::INPUT_ANGULAR_VELOCITY, &angularVelocityForNominal); Math::setSubVector(linearVelocity - linearVelocityForNominal, 0, 3, &deltaVelocity); Math::setSubVector(angularVelocity - angularVelocityForNominal, 1, 3, &deltaVelocity); info->force += damperJacobian.block<3,6>(0, 0) * deltaVelocity; } */ // Calculate the torque command if applicable (and convert newton-meters to command counts). if (info->isDevice7Dof) { // Transform the forces from our device-space into the individual Falcon spaces // (+z out of Falcon front, +y up, +x to right of Falcon when looking at it from the front). static const Matrix33d leftForceTransform = makeRotationMatrix(-M_PI_2, Vector3d::UnitY().eval()); static const Matrix33d rightForceTransform = makeRotationMatrix(M_PI_2, Vector3d::UnitY().eval()); if (info->isDeviceRollAxisReversed) { info->force = leftForceTransform * info->force; } else { info->force = rightForceTransform * info->force; } Vector3d torque = Vector3d::Zero(); outputData.vectors().get(DataStructures::Names::TORQUE, &torque); if (havespringJacobian) { torque += springJacobian.block<3,6>(3, 0) * deltaPosition; } // Since the HDAL does not provide a velocity, we cannot use the damper Jacobian. // TODO(ryanbeasley): consider adding a velocity filter setting to NovintDevice/DeviceData. //if (havedamperJacobian) //{ // torque += damperJacobian.block<3,6>(3, 0) * deltaVelocity; //} static const Matrix33d rightTorqueTransform = makeRotationMatrix(M_PI, Vector3d::UnitY().eval()); if (!info->isDeviceRollAxisReversed) { torque.head<3>() = rightTorqueTransform * torque.head<3>(); } // We have the torque vector in newton-meters. Sadly, what we need is the torque command counts FOR EACH MOTOR // AXIS, not for each Cartesian axis. Which means we need to go back to calculations with joint angles. // For the Falcon 7DoF grip, the axes are perpendicular and the joint angles are Euler angles: Matrix33d rotationX = makeRotationMatrix(info->jointAngles[2], Vector3d(Vector3d::UnitX())); Matrix33d rotationY = makeRotationMatrix(info->jointAngles[1], Vector3d(Vector3d::UnitY())); Matrix33d rotationZ = makeRotationMatrix(info->jointAngles[0], Vector3d(Vector3d::UnitZ())); // NB: the order of rotations is (rotY * rotX * rotZ), not XYZ! // Construct the joint axes for the CURRENT pose of the device. Vector3d jointAxisY = Vector3d::UnitY(); Vector3d jointAxisX = rotationY * Vector3d::UnitX(); Vector3d jointAxisZ = rotationY * (rotationX * Vector3d::UnitZ()); // To convert from Cartesian space to motor-axis space, we assemble the axes into a basis matrix and invert it. Matrix33d basisMatrix; basisMatrix.col(0) = jointAxisX; basisMatrix.col(1) = jointAxisY; basisMatrix.col(2) = jointAxisZ; double basisDeterminant = fabs(basisMatrix.determinant()); // Also construct a "fake" X axis orthogonal with the other two, to be used when the pose is degenerate. // Note that the Y and X axes are always perpendicular for the Falcon 7DoF, so the normalize() can't fail and // is basically unnecessary, but... Vector3d fakeAxisZ = jointAxisY.cross(jointAxisX).normalized(); Matrix33d fakeBasisMatrix; fakeBasisMatrix.col(0) = jointAxisX; fakeBasisMatrix.col(1) = jointAxisY; fakeBasisMatrix.col(2) = fakeAxisZ; const double mediumBasisDeterminantThreshold = 0.6; const double smallBasisDeterminantThreshold = 0.4; Matrix33d decompositionMatrix; if (basisDeterminant >= mediumBasisDeterminantThreshold) { // All is well! decompositionMatrix = basisMatrix.inverse(); } else if (basisDeterminant >= smallBasisDeterminantThreshold) { // If the determinant is "medium" but not "small", the device is in a near-degenerate configuration. // Which axes are going to be commanded may be hugely dependent on small changes in the pose. // We want to gradually decrease the amount of roll torque produced near the degenerate point. double ratio = ((basisDeterminant - smallBasisDeterminantThreshold) / (mediumBasisDeterminantThreshold - smallBasisDeterminantThreshold)); // The computed ratio has to be 0 <= ratio < 1. We just use linear drop-off. // The "fake" basis matrix replaces the X axis with a fake (so it's always invertible), but the output X // torque is then meaningless. Matrix33d fakeDecompositionMatrix = fakeBasisMatrix.inverse(); fakeDecompositionMatrix.row(0) = Vector3d::Zero(); decompositionMatrix = basisMatrix.inverse() * ratio + fakeDecompositionMatrix * (1.0 - ratio); } else { // If the determinant is small, the matrix may not be invertible. // The "fake" basis matrix replaces the Z axis with a fake (so it's always invertible), but the output Z // torque is then meaningless. decompositionMatrix = fakeBasisMatrix.inverse(); decompositionMatrix.row(2) = Vector3d::Zero(); // Moreover, near the degenerate position the Z axis free-spins but is aligned with Y, // so we want to reduce Y torques as well. //double ratio = (basisDeterminant / smallBasisDeterminantThreshold); double ratio = 0; // The computed ratio has to be 0 <= ratio < 1. We just use linear drop-off. decompositionMatrix.row(1) *= ratio; } Vector3d axisTorqueVector = decompositionMatrix * torque; // Unit conversion factors for the Falcon 7DoF. THIS SHOULD BE PARAMETRIZED! const double axisTorqueMin = -2000; const double axisTorqueMax = +2000; // roll axis: torque = 41.97 mNm when command = 2000 (but flipped in left grip!) const double rollTorqueScale = axisTorqueMax / 41.97e-3; // yaw axis: torque = 95.92 mNm when command = 2000 const double yawTorqueScale = axisTorqueMax / 95.92e-3; // pitch axis: torque = 95.92 mNm when command = 2000 const double pitchTorqueScale = axisTorqueMax / 95.92e-3; info->torque[0] = 0; // Roll torque currently disabled because the roll sensor is too jittery. info->torque[1] = clampToRange(yawTorqueScale * info->torqueScale.y() * axisTorqueVector.y(), axisTorqueMin, axisTorqueMax); info->torque[2] = clampToRange(pitchTorqueScale * info->torqueScale.x() * axisTorqueVector.x(), axisTorqueMin, axisTorqueMax); info->torque[3] = 0; if (info->isDeviceRollAxisReversed) { info->torque[0] = -info->torque[0]; } } } void NovintScaffold::setInputData(DeviceData* info) { DataGroup& inputData = info->deviceObject->getInputData(); inputData.poses().set(DataStructures::Names::POSE, info->scaledPose); inputData.scalars().set(DataStructures::Names::TOOLDOF, info->toolDof); inputData.booleans().set(DataStructures::Names::BUTTON_1, info->buttonStates[0]); inputData.booleans().set(DataStructures::Names::BUTTON_2, info->buttonStates[1]); inputData.booleans().set(DataStructures::Names::BUTTON_3, info->buttonStates[2]); inputData.booleans().set(DataStructures::Names::BUTTON_4, info->buttonStates[3]); inputData.booleans().set(DataStructures::Names::IS_HOMED, info->isDeviceHomed); inputData.booleans().set(DataStructures::Names::IS_POSITION_HOMED, info->isPositionHomed); inputData.booleans().set(DataStructures::Names::IS_ORIENTATION_HOMED, info->isOrientationHomed); } bool NovintScaffold::createAllHandles() { // The Scaffold does not know which devices will be initialized, so we will try to initialize all the // devices (by name) listed in device.yaml first. // Then use hdlCatalogDevices to get the serial numbers for other connected devices not listed in device.yaml, // and initialize them (by serial number). // When registerDevice is called the name can be matched to a Handle created from a serial number. // Note: initializaiton name is case insensitive. for (const auto& item : m_state->nameToSerial) { std::string deviceName = item.first; std::transform(deviceName.begin(), deviceName.end(), deviceName.begin(), tolower); if (deviceName == "default") { SURGSIM_LOG_INFO(m_state->logger) << "'" << item.first << "' is system reserved. No Novint device should be named 'Default' (case insensitive)."; continue; } // initialize by name auto handle = std::make_shared(item.first, false); SURGSIM_LOG_IF(!storeHandleIfValid(handle, item.second), m_state->logger, WARNING) << "Failed to initialize Novint device: " << item.first << " (Serial #: " << item.second << ")"; } char serials[HDL_MAX_DEVICES * HDL_SERNUM_BUFFSIZE]; const int numDevices = hdlCatalogDevices(HDL_NOT_OPEN_BY_ANY_APP, &(serials[0]), NULL); isFatalError("Failed to get catalog of devices."); for (int i = 0; i < numDevices; ++i) { const std::string serial(&(serials[i * HDL_SERNUM_BUFFSIZE]), HDL_SERNUM_BUFFSIZE - 1); SURGSIM_LOG_DEBUG(m_state->logger) << "Found serial number " << serial << "."; // Device with serial number 'serial' already initialized. if (m_state->serialToHandle.find(serial) != m_state->serialToHandle.end()) { SURGSIM_LOG_DEBUG(m_state->logger) << "Device with serial number " << serial << " already created."; continue; } auto handle = std::make_shared(serial); SURGSIM_LOG_IF(!storeHandleIfValid(handle, serial), m_state->logger, WARNING) << "Failed to initialize Falcon with serial " << serial << "."; } m_state->initializationTime = Framework::Clock::now(); SURGSIM_LOG_DEBUG(m_state->logger) << "All device handles created."; return !m_state->serialToHandle.empty(); } void NovintScaffold::destroyAllHandles() { SURGSIM_LOG_DEBUG(m_state->logger) << "Destroying all Handles..."; m_state->registeredDevices.clear(); m_state->unregisteredHandles.clear(); m_state->serialToHandle.clear(); SURGSIM_LOG_DEBUG(m_state->logger) << "Handles destroyed."; } bool NovintScaffold::storeHandleIfValid(const std::shared_ptr& handle, const std::string& serial) { bool result = false; if (handle->isValid()) { m_state->serialToHandle[serial] = handle; hdlMakeCurrent(handle->get()); isFatalError("Failed to make device current."); result = true; } return result; } std::map NovintScaffold::getNameMap() { std::map map; std::vector paths; paths.push_back("."); Framework::ApplicationData applicationData(paths); std::string filePath; if (applicationData.tryFindFile("devices.yaml", &filePath)) { SURGSIM_LOG_DEBUG(m_state->logger) << "Found devices.yaml at '" << filePath << "'."; YAML::Node node = YAML::LoadFile(filePath); map = node["Novint"].as>(); } else { SURGSIM_LOG_INFO(m_state->logger) << "Failed to find devices.yaml, cannot map names to serial numbers."; } return map; } void NovintScaffold::runHapticFrame() { m_state->timer.markFrame(); if (m_state->timer.getCurrentNumberOfFrames() == m_state->timer.getMaxNumberOfFrames()) { SURGSIM_LOG_INFO(m_state->logger) << std::setprecision(4) << "Rate: " << m_state->timer.getAverageFrameRate() << "Hz " << "(min individual frame " << 1.0 / m_state->timer.getMaxFramePeriod() << "Hz)."; m_state->timer.setMaxNumberOfFrames(static_cast(m_state->timer.getAverageFrameRate() * 5.0)); m_state->timer.start(); } boost::lock_guard lock(m_state->mutex); for (auto& it = m_state->registeredDevices.begin(); it != m_state->registeredDevices.end(); ++it) { if (updateDeviceInput((*it).get())) { (*it)->deviceObject->pushInput(); } } for (auto& it = m_state->registeredDevices.begin(); it != m_state->registeredDevices.end(); ++it) { updateDeviceOutput(it->get(), (*it)->deviceObject->pullOutput()); } bool desiredGravityCompensation = false; Vector3d force = Vector3d::Zero(); Vector4d torque = Vector4d::Zero(); for (auto& handle : m_state->unregisteredHandles) { if (handle->isValid()) { hdlMakeCurrent(handle->get()); hdlGripSetAttributeb(HDL_GRIP_GRAVITY_COMP, 1, &desiredGravityCompensation); isFatalError("Cannot set gravity compensation state on recently unregistered device."); hdlGripSetAttributev(HDL_GRIP_FORCE, 0, force.data()); isFatalError("hdlGripSetAttributev(HDL_GRIP_FORCE)"); hdlGripSetAttributesd(HDL_GRIP_TORQUE, 4, torque.data()); isFatalError("hdlGripSetAttributesd(HDL_GRIP_TORQUE)"); } } m_state->unregisteredHandles.clear(); } bool NovintScaffold::getGravityCompensation(const NovintScaffold::DeviceData* info, bool* gravityCompensationState) { bool state1 = true; hdlGripGetAttributeb(HDL_GRIP_GRAVITY_COMP, 1, &state1); if (isFatalError("Cannot get gravity compensation (#1)")) { return false; } bool state2 = false; hdlGripGetAttributeb(HDL_GRIP_GRAVITY_COMP, 1, &state2); if (isFatalError("Cannot get gravity compensation (#2)")) { return false; } if (state1 == true && state2 == false) { SURGSIM_LOG_WARNING(m_state->logger) << "getting gravity compensation state for '" << info->deviceObject->getName() << "' does nothing!"; return false; } else if (state1 != state2) { SURGSIM_LOG_WARNING(m_state->logger) << "getting gravity compensation state for '" << info->deviceObject->getName() << "' keeps changing?!?"; return false; } *gravityCompensationState = state1; return true; } bool NovintScaffold::enforceGravityCompensation(const NovintScaffold::DeviceData* info, bool gravityCompensationState) { bool initialState; bool isInitialStateValid = getGravityCompensation(info, &initialState); const int maxAttempts = 20; for (int i = 0; i < maxAttempts; ++i) { bool state = gravityCompensationState; hdlGripSetAttributeb(HDL_GRIP_GRAVITY_COMP, 1, &state); if (isFatalError("Cannot set gravity compensation state")) { return false; } if (!getGravityCompensation(info, &state)) { return false; } else if (state == gravityCompensationState) { // If the state has been changed, log a message. if (isInitialStateValid && (initialState != gravityCompensationState)) { SURGSIM_LOG_INFO(m_state->logger) << "gravity compensation for '" << info->deviceObject->getName() << "' changed to " << (gravityCompensationState? "enabled." : "disabled." ); } return true; } } SURGSIM_LOG_WARNING(m_state->logger) << "failed to set gravity compensation for '" << info->deviceObject->getName() << "' to " << (gravityCompensationState ? "enabled" : "disabled") << " after " << maxAttempts << " attempts"; return false; } bool NovintScaffold::setGravityCompensation(const NovintScaffold::DeviceData* info, bool gravityCompensationState) { bool initialState; bool isInitialStateValid = getGravityCompensation(info, &initialState); if (isInitialStateValid && (initialState == gravityCompensationState)) { return true; // no need to do anything } return enforceGravityCompensation(info, gravityCompensationState); } DataGroup NovintScaffold::buildDeviceInputData() { DataStructures::DataGroupBuilder builder; builder.addPose(DataStructures::Names::POSE); builder.addScalar(DataStructures::Names::TOOLDOF); builder.addBoolean(DataStructures::Names::BUTTON_1); builder.addBoolean(DataStructures::Names::BUTTON_2); builder.addBoolean(DataStructures::Names::BUTTON_3); builder.addBoolean(DataStructures::Names::BUTTON_4); builder.addBoolean(DataStructures::Names::IS_HOMED); builder.addBoolean(DataStructures::Names::IS_POSITION_HOMED); builder.addBoolean(DataStructures::Names::IS_ORIENTATION_HOMED); return builder.createData(); } void NovintScaffold::setPositionScale(const NovintDevice* device, double scale) { boost::lock_guard lock(m_state->mutex); auto& matching = std::find_if(m_state->registeredDevices.begin(), m_state->registeredDevices.end(), [&device](const std::unique_ptr& info) { return info->deviceObject == device; }); if (matching != m_state->registeredDevices.end()) { boost::lock_guard lock((*matching)->parametersMutex); (*matching)->positionScale = scale; } } void NovintScaffold::setOrientationScale(const NovintDevice* device, double scale) { boost::lock_guard lock(m_state->mutex); auto& matching = std::find_if(m_state->registeredDevices.begin(), m_state->registeredDevices.end(), [&device](const std::unique_ptr& info) { return info->deviceObject == device; }); if (matching != m_state->registeredDevices.end()) { boost::lock_guard lock((*matching)->parametersMutex); (*matching)->orientationScale = scale; } } std::shared_ptr NovintScaffold::getOrCreateSharedInstance() { static Framework::SharedInstance sharedInstance; return sharedInstance.get(); } }; // namespace Devices }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Devices/Novint/NovintScaffold.h000066400000000000000000000176141277777236100234450ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DEVICES_NOVINT_NOVINTSCAFFOLD_H #define SURGSIM_DEVICES_NOVINT_NOVINTSCAFFOLD_H #include #include #include "SurgSim/DataStructures/DataGroup.h" namespace SurgSim { namespace Devices { class NovintDevice; /// A class that manages Novint Falcon devices. /// /// This should support any device that can communicate using the Novint HDAL SDK toolkit, such as the /// off-the-shelf Novint Falcon gaming controller and the Novint Falcon with the Open Surgery Grip. /// /// \sa SurgSim::Devices::NovintDevice class NovintScaffold { public: /// Constructor. NovintScaffold(); /// Destructor. ~NovintScaffold(); /// Gets or creates the scaffold shared by all NovintDevice and Novint7DofDevice instances. /// The scaffold is managed using a SharedInstance object, so it will be destroyed when all devices are released. /// \return the scaffold object. static std::shared_ptr getOrCreateSharedInstance(); private: NovintScaffold(const NovintScaffold&) /*= delete*/; NovintScaffold& operator=(const NovintScaffold&) /*= delete*/; /// Internal shared state data type. struct StateData; /// Internal per-device information. struct DeviceData; /// Wrapper for the haptic loop callback. class Callback; /// Wrapper for the HDAL device handle. class Handle; friend class NovintDevice; /// Registers the specified device object, and starts the servo loop if necessary. /// If successful, the device object will become connected to an unused controller. /// /// \param device The device object to be used, which should have a unique name. /// \return True if the initialization succeeds, false if it fails. bool registerDevice(NovintDevice* device); /// Unregisters the specified device object. /// The corresponding controller will become unused, and can be re-registered later. /// /// \param device The device object. /// \return true on success, false on failure. bool unregisterDevice(const NovintDevice* device); /// Initializes a single device, creating the necessary HDAL resources. /// \param [in,out] info The device data. /// \return true on success. bool initializeDeviceState(DeviceData* info); /// Get the Handle associated with an initialization name, if any. /// \param initializationName The initialization name (from the configuration file). /// \return Shared pointer to Handle, or nullptr if not found. std::shared_ptr findHandleByInitializationName(const std::string& initializationName); /// Updates the device information for a single device's input. /// \param info The device data. /// \return true on success. bool updateDeviceInput(DeviceData* info); /// Updates the device information for a single device's output. If pullOutput failed, zeros forces & torques. /// \param info The device data. /// \param pulledOutput true if the most recent pullOutput succeeded. /// \return true on success. bool updateDeviceOutput(DeviceData* info, bool pulledOutput); /// Checks whether a device has been homed. If the position and/or orientation have not been homed, zeros the /// respective Values. Call this before setting the data to send to the Input Component. The DeviceData's /// parameter mutex should be locked before this function is called. /// \param info The device data. void checkDeviceHoming(DeviceData* info); /// Calculates forces, and torques if the device is a 7Dof, and sends them to the HDAL. The force to output is /// composed of a vector named "force" in the output data, plus contributions from two optional Jacobians. /// If the matrix "springJacobian" is provided in the output data, a spring force & torque are generated from /// its product with the difference between the current pose and the pose in the output data named "inputPose". /// A damping force & torque are generated similarly. The intention is for a Behavior to calculate a nominal /// force & torque as well as the desired linearized changes to the force & torque based on changes to the input's /// pose & velocities. Then the linearized deltas to the output force & torque can be calculated at the haptic /// update rates, thereby smoothing the output response to motion. /// \param info The device data. /// \note The DeviceData's parameter mutex should be locked before this function is called. void calculateForceAndTorque(DeviceData* info); /// Sets the input DataGroup, which will be pushed to the InputComponent /// \param info The device data void setInputData(DeviceData* info); /// Gets the map from name to serial number. /// \return The map. std::map getNameMap(); /// Creates a NovintScaffold::Handle for each device connected when the first registerDevice is called. /// \return True if there are device handles created; false otherwise. bool createAllHandles(); /// Destroys all the initialized handles. void destroyAllHandles(); /// Store the handle if it is valid. /// \return true If handle is valid and stored; false, otherwise. bool storeHandleIfValid(const std::shared_ptr& handle, const std::string& serial); /// Executes the operations for a single haptic frame. /// Should only be called from the context of a HDAL callback. void runHapticFrame(); /// Gets the gravity compensation flag for the current device. /// \param info The device data. /// \param [out] gravityCompensationState State of the gravity compensation flag. /// \return true if it succeeds, false if it fails. bool getGravityCompensation(const DeviceData* info, bool* gravityCompensationState); /// Attempts to force the gravity compensation flag for the current device to the specified value. /// /// Sets the flag repeatedly, until it reports the desired value, in order to work around the problem where /// attempts to set the gravity compensation do not always change the actual gravity compensation flag in the /// device. /// /// Logs a message if the state is known to have been changed. /// /// \param info The device data. /// \param gravityCompensationState Desired state of the gravity compensation flag. /// \return true if it succeeds, false if it fails. bool enforceGravityCompensation(const DeviceData* info, bool gravityCompensationState); /// Sets the gravity compensation flag for the current device, unless it's already set as desired. /// \param info The device data. /// \param gravityCompensationState Desired state of the gravity compensation flag. /// \return true if it succeeds, false if it fails. bool setGravityCompensation(const DeviceData* info, bool gravityCompensationState); /// Builds the data layout for the application input (i.e. device output). static SurgSim::DataStructures::DataGroup buildDeviceInputData(); /// Sets the position scale for this device. /// \param device A pointer to the device. /// \param scale The multiplicative factor to apply to the position. void setPositionScale(const NovintDevice* device, double scale); /// Sets the orientation scale for this device. /// \param device A pointer to the device. /// \param scale The multiplicative factor to apply to the rotation angles. void setOrientationScale(const NovintDevice* device, double scale); /// Internal scaffold state. std::unique_ptr m_state; }; }; // namespace Devices }; // namespace SurgSim #endif // SURGSIM_DEVICES_NOVINT_NOVINTSCAFFOLD_H opensurgsim-0.7.0/SurgSim/Devices/Novint/UnitTests/000077500000000000000000000000001277777236100223065ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Devices/Novint/UnitTests/CMakeLists.txt000066400000000000000000000017601277777236100250520ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2012-2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. include_directories( ${gtest_SOURCE_DIR}/include ) set(UNIT_TEST_SOURCES NovintDeviceTest.cpp NovintScaffoldTest.cpp ) set(LIBS NovintDevice SurgSimInput SurgSimFramework SurgSimDataStructures ${Boost_LIBRARIES} ${NOVINTHDALSDK_LIBRARIES} ) surgsim_add_unit_tests(NovintDeviceTest) set_target_properties(NovintDeviceTest PROPERTIES FOLDER "Devices") opensurgsim-0.7.0/SurgSim/Devices/Novint/UnitTests/NovintDeviceTest.cpp000066400000000000000000000302111277777236100262440ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the NovintDevice class. #include #include #include #include #include #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/DataStructures/OptionalValue.h" #include "SurgSim/Devices/Novint/NovintDevice.h" #include "SurgSim/Framework/Clock.h" #include "SurgSim/Math/Matrix.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Testing/MockInputOutput.h" using SurgSim::Devices::NovintDevice; using SurgSim::DataStructures::DataGroup; using SurgSim::Framework::Clock; using SurgSim::Math::Matrix44d; using SurgSim::Math::RigidTransform3d; using SurgSim::Testing::MockInputOutput; // Define common device names used in the Novint device tests. // These initialization names should be set to two of the names used in devices.yaml (or be empty strings to just get // the first device). The serial number should be a serial number for one of the attached Falcons (or be an empty // string to just get the first device.) const std::string NOVINT_TEST_DEVICE_NAME = "FALCON_1"; const std::string NOVINT_TEST_DEVICE_NAME_2 = "FALCON_2"; const std::string NOVINT_TEST_DEVICE_SERIAL_NUMBER = "14QAVEFF"; TEST(NovintDeviceTest, CreateAndInitializeDeviceByName) { std::shared_ptr device = std::make_shared("TestFalcon"); ASSERT_TRUE(device != nullptr) << "Device creation failed."; std::string initializationName = ""; EXPECT_FALSE(device->getInitializationName(&initializationName)); EXPECT_NO_THROW(device->setInitializationName(NOVINT_TEST_DEVICE_NAME)); ASSERT_TRUE(device->getInitializationName(&initializationName)); EXPECT_EQ(NOVINT_TEST_DEVICE_NAME, initializationName); std::string serialNumber; EXPECT_FALSE(device->getSerialNumber(&serialNumber)); EXPECT_ANY_THROW(device->setSerialNumber("")); EXPECT_FALSE(device->isInitialized()); EXPECT_EQ("TestFalcon", device->getName()); EXPECT_NEAR(8.9, device->getMaxForce(), 1e-9); EXPECT_NO_THROW(device->setMaxForce(20.0)); EXPECT_NEAR(20.0, device->getMaxForce(), 1e-9); ASSERT_TRUE(device->initialize()) << "Initialization failed. Is a Novint device plugged in?"; ASSERT_TRUE(device->isInitialized()); ASSERT_ANY_THROW(device->initialize()) << "Initialized the same device twice."; ASSERT_ANY_THROW(device->setInitializationName("OtherName")); ASSERT_ANY_THROW(device->setMaxForce(20.0)) << "Set maximum force after initialization."; EXPECT_EQ("TestFalcon", device->getName()); const double positionScale = 2.0; device->setPositionScale(positionScale); EXPECT_EQ(positionScale, device->getPositionScale()); const double orientationScale = 2.0; device->setOrientationScale(orientationScale); EXPECT_EQ(orientationScale, device->getOrientationScale()); } TEST(NovintDeviceTest, CreateAndInitializeDeviceBySerialNumber) { std::shared_ptr device = std::make_shared("TestFalcon"); ASSERT_TRUE(device != nullptr) << "Device creation failed."; std::string serialNumber = ""; EXPECT_FALSE(device->getSerialNumber(&serialNumber)); device->setSerialNumber(NOVINT_TEST_DEVICE_SERIAL_NUMBER); ASSERT_TRUE(device->getSerialNumber(&serialNumber)); EXPECT_EQ(NOVINT_TEST_DEVICE_SERIAL_NUMBER, serialNumber); std::string initializationName; EXPECT_FALSE(device->getInitializationName(&initializationName)); EXPECT_ANY_THROW(device->setInitializationName("")); EXPECT_FALSE(device->isInitialized()); EXPECT_EQ("TestFalcon", device->getName()); ASSERT_TRUE(device->initialize()) << "Initialization failed. Is a Novint device plugged in?"; EXPECT_TRUE(device->isInitialized()); EXPECT_EQ("TestFalcon", device->getName()); const double positionScale = 2.0; device->setPositionScale(positionScale); EXPECT_EQ(positionScale, device->getPositionScale()); const double orientationScale = 2.0; device->setOrientationScale(orientationScale); EXPECT_EQ(orientationScale, device->getOrientationScale()); } TEST(NovintDeviceTest, CreateAndInitializeDefaultDevices) { std::shared_ptr device = std::make_shared("TestFalcon"); ASSERT_TRUE(device != nullptr) << "Device creation failed."; EXPECT_FALSE(device->isInitialized()); ASSERT_TRUE(device->initialize()) << "Initialization failed. Is a Novint device plugged in?"; EXPECT_TRUE(device->isInitialized()); std::string initializationName; EXPECT_FALSE(device->getInitializationName(&initializationName)); std::string serialNumber; EXPECT_FALSE(device->getSerialNumber(&serialNumber)); std::shared_ptr device2 = std::make_shared("TestFalcon2"); ASSERT_TRUE(device2 != nullptr) << "Device creation failed."; EXPECT_FALSE(device2->isInitialized()); if (!device2->initialize()) { std::cerr << "[Warning: second Novint did not come up; is it plugged in?]" << std::endl; } } static void testCreateDeviceSeveralTimes(bool doSleep) { for (int i = 0; i < 6; ++i) { std::shared_ptr device = std::make_shared("TestFalcon"); ASSERT_TRUE(device != nullptr) << "Device creation failed."; ASSERT_TRUE(device->initialize()) << "Initialization failed. Is a Novint device plugged in?"; if (doSleep) { boost::this_thread::sleep_until(Clock::now() + boost::chrono::milliseconds(100)); } // the device will be destroyed here } } TEST(NovintDeviceTest, CreateDeviceSeveralTimes) { testCreateDeviceSeveralTimes(true); } TEST(NovintDeviceTest, CreateTwoDevices) { std::shared_ptr device1 = std::make_shared("Novint1"); ASSERT_TRUE(device1 != nullptr) << "Device creation failed."; device1->setInitializationName(NOVINT_TEST_DEVICE_NAME); ASSERT_TRUE(device1->initialize()) << "Initialization failed. Is a Novint device plugged in?"; std::shared_ptr device2 = std::make_shared("Novint2"); ASSERT_TRUE(device2 != nullptr) << "Device creation failed."; device2->setInitializationName(NOVINT_TEST_DEVICE_NAME_2); if (!device2->initialize()) { std::cerr << "[Warning: second Novint did not come up; is it plugged in?]" << std::endl; } } TEST(NovintDeviceTest, CreateDevicesWithSameInitializationName) { if (NOVINT_TEST_DEVICE_NAME != "") { std::shared_ptr device1 = std::make_shared("Novint1"); ASSERT_TRUE(device1 != nullptr) << "Device creation failed."; device1->setInitializationName(NOVINT_TEST_DEVICE_NAME); ASSERT_TRUE(device1->initialize()) << "Initialization failed. Is a Novint device plugged in?"; std::shared_ptr device2 = std::make_shared("Novint2"); ASSERT_TRUE(device2 != nullptr) << "Device creation failed."; device2->setInitializationName(NOVINT_TEST_DEVICE_NAME); ASSERT_FALSE(device2->initialize()) << "Initialization succeeded despite duplicate initialization name."; } } TEST(NovintDeviceTest, CreateDevicesWithSameSerialNumber) { if (NOVINT_TEST_DEVICE_SERIAL_NUMBER != "") { std::shared_ptr device1 = std::make_shared("Novint1"); ASSERT_TRUE(device1 != nullptr) << "Device creation failed."; device1->setSerialNumber(NOVINT_TEST_DEVICE_SERIAL_NUMBER); ASSERT_TRUE(device1->initialize()) << "Initialization failed. Is a Novint device plugged in?"; std::shared_ptr device2 = std::make_shared("Novint2"); ASSERT_TRUE(device2 != nullptr) << "Device creation failed."; device2->setSerialNumber(NOVINT_TEST_DEVICE_SERIAL_NUMBER); ASSERT_FALSE(device2->initialize()) << "Initialization succeeded despite duplicate serial number."; } } TEST(NovintDeviceTest, InputConsumer) { std::shared_ptr device = std::make_shared("TestFalcon"); ASSERT_TRUE(device != nullptr) << "Device creation failed."; device->setInitializationName(NOVINT_TEST_DEVICE_NAME); ASSERT_TRUE(device->initialize()) << "Initialization failed. Is a Novint device plugged in?"; /// Wait a while for the HDL to initialize and start running the callback. boost::this_thread::sleep_for(boost::chrono::milliseconds(1000)); std::shared_ptr consumer = std::make_shared(); EXPECT_EQ(0, consumer->m_numTimesReceivedInput); EXPECT_FALSE(device->removeInputConsumer(consumer)); EXPECT_EQ(0, consumer->m_numTimesReceivedInput); EXPECT_TRUE(device->addInputConsumer(consumer)); // Adding the same input consumer again should fail. EXPECT_FALSE(device->addInputConsumer(consumer)); // Sleep for a second, to see how many times the consumer is invoked. // (A Novint device is supposed to run at 1KHz.) boost::this_thread::sleep_for(boost::chrono::milliseconds(1000)); EXPECT_TRUE(device->removeInputConsumer(consumer)); // Removing the same input consumer again should fail. EXPECT_FALSE(device->removeInputConsumer(consumer)); // Check the number of invocations. EXPECT_GE(consumer->m_numTimesReceivedInput, 700); EXPECT_LE(consumer->m_numTimesReceivedInput, 1300); EXPECT_TRUE(consumer->m_lastReceivedInput.poses().hasData(SurgSim::DataStructures::Names::POSE)); EXPECT_TRUE(consumer->m_lastReceivedInput.booleans().hasData(SurgSim::DataStructures::Names::BUTTON_1)); } TEST(NovintDeviceTest, OutputProducer) { std::shared_ptr device = std::make_shared("TestFalcon"); ASSERT_TRUE(device != nullptr) << "Device creation failed."; device->setInitializationName(NOVINT_TEST_DEVICE_NAME); ASSERT_TRUE(device->initialize()) << "Initialization failed. Is a Novint device plugged in?"; /// Wait a while for the HDL to initialize and start running the callback. boost::this_thread::sleep_for(boost::chrono::milliseconds(1000)); std::shared_ptr producer = std::make_shared(); EXPECT_EQ(0, producer->m_numTimesRequestedOutput); EXPECT_FALSE(device->removeOutputProducer(producer)); EXPECT_EQ(0, producer->m_numTimesRequestedOutput); EXPECT_TRUE(device->setOutputProducer(producer)); // Sleep for a second, to see how many times the producer is invoked. // (A Novint Falcon device is supposed to run at 1KHz.) boost::this_thread::sleep_for(boost::chrono::milliseconds(1000)); EXPECT_TRUE(device->removeOutputProducer(producer)); // Removing the same input producer again should fail. EXPECT_FALSE(device->removeOutputProducer(producer)); // Check the number of invocations. EXPECT_GE(producer->m_numTimesRequestedOutput, 700); EXPECT_LE(producer->m_numTimesRequestedOutput, 1300); } TEST(NovintDeviceTest, FactoryCreation) { std::shared_ptr device; ASSERT_NO_THROW(device = SurgSim::Input::DeviceInterface::getFactory().create("SurgSim::Devices::NovintDevice", "TestFalcon")); EXPECT_EQ("SurgSim::Devices::NovintDevice", device->getClassName()); } TEST(NovintDeviceTest, AccessibleTest) { std::shared_ptr device = std::make_shared("TestFalcon"); std::string name = "initName"; SurgSim::DataStructures::OptionalValue optionalName(name); EXPECT_NO_THROW(device->setValue("InitializationName", optionalName)); std::string actualName; ASSERT_TRUE(device->getInitializationName(&actualName)); EXPECT_EQ(name, actualName); std::string number = "serialNumber"; SurgSim::DataStructures::OptionalValue optionalNumber(number); EXPECT_NO_THROW(device->setValue("SerialNumber", optionalNumber)); std::string actualNumber; ASSERT_TRUE(device->getSerialNumber(&actualNumber)); EXPECT_EQ(number, actualNumber); ASSERT_FALSE(device->is7DofDevice()); EXPECT_NO_THROW(device->setValue("7DofDevice", true)); EXPECT_TRUE(device->is7DofDevice()); EXPECT_NEAR(8.9, device->getMaxForce(), 1e-9); EXPECT_NO_THROW(device->setValue("MaxForce", 20.0)); EXPECT_NEAR(20.0, device->getMaxForce(), 1e-9); } opensurgsim-0.7.0/SurgSim/Devices/Novint/UnitTests/NovintScaffoldTest.cpp000066400000000000000000000154311277777236100265750ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the NovintScaffold class and its device interactions. #include #include #include #include #include #include "SurgSim/Devices/Novint/NovintDevice.h" #include "SurgSim/Devices/Novint/NovintScaffold.h" using SurgSim::Devices::NovintDevice; using SurgSim::Devices::NovintScaffold; TEST(NovintScaffoldTest, CreateAndDestroyScaffold) { std::shared_ptr scaffold = NovintScaffold::getOrCreateSharedInstance(); ASSERT_NE(nullptr, scaffold) << "The scaffold was not created!"; std::weak_ptr scaffold1 = scaffold; { std::shared_ptr stillHaveScaffold = scaffold1.lock(); EXPECT_NE(nullptr, stillHaveScaffold) << "Unable to get scaffold from weak ref (while strong ref exists)"; EXPECT_EQ(scaffold, stillHaveScaffold) << "Scaffold mismatch!"; } { std::shared_ptr sameScaffold = NovintScaffold::getOrCreateSharedInstance(); EXPECT_NE(nullptr, sameScaffold) << "Unable to get scaffold from class"; EXPECT_EQ(scaffold, sameScaffold) << "Scaffold mismatch!"; } scaffold.reset(); { std::shared_ptr dontHaveScaffold = scaffold1.lock(); EXPECT_EQ(nullptr, dontHaveScaffold) << "Able to get scaffold from weak ref (with no strong ref)"; } scaffold = NovintScaffold::getOrCreateSharedInstance(); ASSERT_NE(nullptr, scaffold) << "The scaffold was not created the 2nd time!"; std::weak_ptr scaffold2 = scaffold; { std::shared_ptr stillHaveScaffold = scaffold2.lock(); ASSERT_NE(nullptr, stillHaveScaffold) << "Unable to get scaffold from weak ref (while strong ref exists)"; ASSERT_EQ(scaffold, stillHaveScaffold) << "Scaffold mismatch!"; } } TEST(NovintScaffoldTest, ScaffoldLifeCycle) { std::weak_ptr lastScaffold; { std::shared_ptr scaffold = NovintScaffold::getOrCreateSharedInstance(); ASSERT_NE(nullptr, scaffold) << "The scaffold was not created!"; lastScaffold = scaffold; } { std::shared_ptr dontHaveScaffold = lastScaffold.lock(); EXPECT_EQ(nullptr, dontHaveScaffold) << "Able to get scaffold from weak ref (with no strong ref)"; lastScaffold.reset(); } { std::shared_ptr device = std::make_shared("TestFalcon"); ASSERT_NE(nullptr, device) << "Creation failed. Is a Novint device plugged in?"; // note: the device is NOT initialized! { std::shared_ptr scaffold = NovintScaffold::getOrCreateSharedInstance(); EXPECT_NE(nullptr, scaffold) << "The scaffold was not retrieved!"; lastScaffold = scaffold; // save the scaffold for later std::shared_ptr sameScaffold = lastScaffold.lock(); EXPECT_NE(nullptr, sameScaffold); EXPECT_EQ(scaffold, sameScaffold); } // The device has not been initialized, so it should NOT be hanging on to the device! { std::shared_ptr deadScaffold = lastScaffold.lock(); EXPECT_EQ(nullptr, deadScaffold); } // the ("empty") device is about to get destroyed } { std::shared_ptr device = std::make_shared("TestFalcon"); ASSERT_NE(nullptr, device) << "Device creation failed."; ASSERT_TRUE(device->initialize()) << "Initialization failed. Is a Novint device plugged in?"; { std::shared_ptr scaffold = NovintScaffold::getOrCreateSharedInstance(); EXPECT_NE(nullptr, scaffold) << "The scaffold was not retrieved!"; lastScaffold = scaffold; // save the scaffold for later std::shared_ptr sameScaffold = lastScaffold.lock(); EXPECT_NE(nullptr, sameScaffold); EXPECT_EQ(scaffold, sameScaffold); } // The same scaffold is supposed to still be around because of the device { std::shared_ptr sameScaffold = lastScaffold.lock(); EXPECT_NE(nullptr, sameScaffold); std::shared_ptr scaffold = NovintScaffold::getOrCreateSharedInstance(); EXPECT_NE(nullptr, scaffold) << "The scaffold was not retrieved!"; EXPECT_EQ(sameScaffold, scaffold); } // the device and the scaffold are about to get destroyed } { std::shared_ptr deadScaffold = lastScaffold.lock(); EXPECT_EQ(nullptr, deadScaffold); } { std::shared_ptr device = std::make_shared("TestFalcon"); ASSERT_NE(nullptr, device) << "Device creation failed."; ASSERT_TRUE(device->initialize()) << "Initialization failed. Didn't this work a moment ago?"; std::shared_ptr scaffold = NovintScaffold::getOrCreateSharedInstance(); EXPECT_NE(nullptr, scaffold) << "The scaffold was not retrieved!"; std::shared_ptr deadScaffold = lastScaffold.lock(); EXPECT_EQ(nullptr, deadScaffold); } } TEST(NovintScaffoldTest, CreateDeviceSeveralTimes) { std::weak_ptr lastScaffold; for (int i = 0; i < 6; ++i) { SCOPED_TRACE(i); EXPECT_EQ(nullptr, lastScaffold.lock()); std::shared_ptr device = std::make_shared("TestFalcon"); ASSERT_NE(nullptr, device) << "Device creation failed."; ASSERT_TRUE(device->initialize()) << "Initialization failed. Is a Novint device plugged in?"; std::shared_ptr scaffold = NovintScaffold::getOrCreateSharedInstance(); ASSERT_NE(nullptr, scaffold) << "The scaffold was not retrieved!"; lastScaffold = scaffold; // the device and the scaffold will be destroyed here } } TEST(NovintScaffoldTest, CreateDeviceSeveralTimesWithScaffoldRef) { std::shared_ptr lastScaffold; for (int i = 0; i < 6; ++i) { SCOPED_TRACE(i); std::shared_ptr device = std::make_shared("TestFalcon"); ASSERT_NE(nullptr, device) << "Device creation failed."; ASSERT_TRUE(device->initialize()) << "Initialization failed. Is a Novint device plugged in?"; std::shared_ptr scaffold = NovintScaffold::getOrCreateSharedInstance(); ASSERT_NE(nullptr, scaffold) << "The scaffold was not retrieved!"; if (! lastScaffold) { lastScaffold = scaffold; } EXPECT_EQ(lastScaffold, scaffold); // the device will be destroyed here, but the scaffold stays around because we have a shared_ptr to it. } } opensurgsim-0.7.0/SurgSim/Devices/Novint/VisualTest/000077500000000000000000000000001277777236100224475ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Devices/Novint/VisualTest/CMakeLists.txt000066400000000000000000000017161277777236100252140ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. set(EXAMPLE_SOURCES main.cpp ) set(EXAMPLE_HEADERS ) set(LIBS IdentityPoseDevice NovintDevice SurgSimInput VisualTestCommon ) surgsim_add_executable(NovintVisualTest "${EXAMPLE_SOURCES}" "${EXAMPLE_HEADERS}") target_link_libraries(NovintVisualTest ${LIBS}) set_target_properties(NovintVisualTest PROPERTIES FOLDER "Devices") opensurgsim-0.7.0/SurgSim/Devices/Novint/VisualTest/main.cpp000066400000000000000000000032241277777236100241000ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Devices/IdentityPoseDevice/IdentityPoseDevice.h" #include "SurgSim/Devices/Novint/NovintDevice.h" #include "SurgSim/Testing/VisualTestCommon/ToolSquareTest.h" // The initialization name of the NovintDevice. An empty string will use the first available Falcon. static const char* const NOVINT_DEVICE_NAME = ""; // true if the Novint should be 7Dof, false if the Novint should be 3Dof. static const bool NOVINT_7_DOF = false; int main(int argc, char** argv) { auto toolDevice = std::make_shared("NovintDevice"); toolDevice->setInitializationName(NOVINT_DEVICE_NAME); toolDevice->set7DofDevice(NOVINT_7_DOF); auto squareDevice = std::make_shared("IdentityPoseDevice"); runToolSquareTest(toolDevice, squareDevice, "Move the Novint Falcon device to move the sphere tool."); std::cout << std::endl << "Exiting." << std::endl; // Cleanup and shutdown will happen automatically as objects go out of scope. return 0; } opensurgsim-0.7.0/SurgSim/Devices/Oculus/000077500000000000000000000000001277777236100203415ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Devices/Oculus/CMakeLists.txt000066400000000000000000000031571277777236100231070ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2015, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. find_package(OculusSdk) include_directories( "${CMAKE_CURRENT_SOURCE_DIR}" "${OCULUSSDK_INCLUDE_DIR}" ) set(OCULUS_DEVICE_SOURCES OculusDevice.cpp OculusDisplaySettings.cpp OculusScaffold.cpp OculusView.cpp ) set(OCULUS_DEVICE_HEADERS OculusDevice.h OculusDisplaySettings.h OculusScaffold.h OculusView.h ) set(DEVICE_HEADERS ${DEVICE_HEADERS} Oculus/OculusDevice.h Oculus/OculusView.h PARENT_SCOPE) surgsim_add_library( OculusDevice "${OCULUS_DEVICE_SOURCES}" "${OCULUS_DEVICE_HEADERS}" ) set(LIBS SurgSimDataStructures SurgSimFramework SurgSimGraphics SurgSimInput ${OCULUSSDK_LIBRARY} ${OPENSCENEGRAPH_LIBRARIES} ) target_link_libraries(OculusDevice ${LIBS}) if(BUILD_TESTING) # The unit tests will be built whenever the library is built. add_subdirectory(UnitTests) add_subdirectory(SceneTest) if(GLUT_FOUND) add_subdirectory(VisualTest) endif(GLUT_FOUND) endif() # Put OculusDevice into folder "Devices" set_target_properties(OculusDevice PROPERTIES FOLDER "Devices") opensurgsim-0.7.0/SurgSim/Devices/Oculus/Oculus.dox000066400000000000000000000017261277777236100223350ustar00rootroot00000000000000/*! \page Oculus Oculus: Oculus Rift DK2 This adds support for Oculus Rift DK2 virtual reality display. Supported Version ----------------- Version 0.5.0.1 beta is the ONLY SDK tested and supported for Windows and GNU/Linux. Dependencies ------------ Oculus Rift SDK: SDK is available for Windows and GNU/Linux on Oculus Rift Developer website. For Windows, you must first install the Oculus Runtime package and download the Oculus SDK. Then set an environment variable OCULUSSDK_DIR to the directory containing LibOVR (but do not include 'LibOVR' in the variable). For GNU/Linux, download the SDK package, extract it, run its configuration script FIRST, build the library, then install it. If the SDK is in a custom location, you must set an environment variable OCULUSSDK_DIR pointing to the install path. The default installed one will be picked if both exist. Then, in CMake, enable BUILD_DEVICE_OCULUS. */ opensurgsim-0.7.0/SurgSim/Devices/Oculus/OculusDevice.cpp000066400000000000000000000052331277777236100234420ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Devices/Oculus/OculusDevice.h" #include "SurgSim/Devices/Oculus/OculusScaffold.h" #include "SurgSim/Framework/Log.h" namespace SurgSim { namespace Devices { SURGSIM_REGISTER(SurgSim::Input::DeviceInterface, SurgSim::Devices::OculusDevice, OculusDevice); OculusDevice::OculusDevice(const std::string& name) : SurgSim::Input::CommonDevice(name, OculusScaffold::buildDeviceInputData()), m_nearPlane(0.1f), m_farPlane(10.0f) { } OculusDevice::~OculusDevice() { if (isInitialized()) { finalize(); } } bool OculusDevice::initialize() { SURGSIM_ASSERT(!isInitialized()) << getName() << " already initialized."; auto scaffold = OculusScaffold::getOrCreateSharedInstance(); SURGSIM_ASSERT(scaffold != nullptr); bool initialize = false; if (scaffold->registerDevice(this)) { m_scaffold = std::move(scaffold); initialize = true; } return initialize; } bool OculusDevice::finalize() { SURGSIM_ASSERT(isInitialized()) << getName() << " is not initialized, cannot finalize."; bool result = m_scaffold->unregisterDevice(this); m_scaffold.reset(); return result; } bool OculusDevice::isInitialized() const { return (m_scaffold != nullptr); } void OculusDevice::setNearPlane(float nearPlane) { SURGSIM_ASSERT(nearPlane > 0.0f) << "Can not use a negative near plane."; SURGSIM_LOG_IF(nearPlane > m_farPlane, SurgSim::Framework::Logger::getLogger("Device/OculusDevice"), WARNING) << __FUNCTION__ << "Trying to set a near plane that is greater than the far plane."; m_nearPlane = nearPlane; } float OculusDevice::getNearPlane() const { return m_nearPlane; } void OculusDevice::setFarPlane(float farPlane) { SURGSIM_ASSERT(farPlane > 0.0f) << "Can not use a negative far plane."; SURGSIM_LOG_IF(farPlane < m_nearPlane, SurgSim::Framework::Logger::getLogger("Device/OculusDevice"), WARNING) << __FUNCTION__ << "Trying to set a far plane that is smaller than the near plane."; m_farPlane = farPlane; } float OculusDevice::getFarPlane() const { return m_farPlane; } }; // namespace Devices }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Devices/Oculus/OculusDevice.h000066400000000000000000000057151277777236100231140ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DEVICES_OCULUS_OCULUSDEVICE_H #define SURGSIM_DEVICES_OCULUS_OCULUSDEVICE_H #include #include #include "SurgSim/Input/CommonDevice.h" namespace SurgSim { namespace Devices { class OculusScaffold; SURGSIM_STATIC_REGISTRATION(OculusDevice); /// A class implementing the communication with Oculus Rift DK2. /// /// \par Application input provided by the device: /// | type | name | | /// | ---- | ---- | --- | /// | pose | "pose" | %Device pose (units are meters). | /// | matrix | "leftProjectionMatix" | %Projection matrix for left eye | /// | matrix | "rghtProjectionMatix" | %Projection matrix for right eye | /// /// \par Application output used by the device: none. /// \note The axes of the pose of the HMD are a right-handed system: X & Z are in the plane of the floor, /// with X pointing to the camera's left (i.e. to the HMD's right) and Z pointing towards the camera, /// while Y points up from the floor. /// By default the tracking origin is located one meter away from the positional tracking camera in the direction /// of the optical axis but with the same height as the camera. /// \sa SurgSim::Input::CommonDevice, SurgSim::Input::DeviceInterface class OculusDevice : public SurgSim::Input::CommonDevice { public: /// Constructor. /// \param name A unique name for the device. explicit OculusDevice(const std::string& name); SURGSIM_CLASSNAME(SurgSim::Devices::OculusDevice); /// Destructor. virtual ~OculusDevice(); bool initialize() override; bool isInitialized() const override; /// Set the near plane /// \param nearPlane The near plane void setNearPlane(float nearPlane); /// \return The near plane float getNearPlane() const; /// Set the far plane /// \param farPlane The far plane void setFarPlane(float farPlane); /// \return The far plane float getFarPlane() const; private: friend class OculusScaffold; bool finalize() override; /// Near Plane float m_nearPlane; /// Far Plane float m_farPlane; /// Communication with hardware is handled by scaffold. std::shared_ptr m_scaffold; }; }; // namespace Devices }; // namespace SurgSim #endif // SURGSIM_DEVICES_OCULUS_OCULUSDEVICE_H opensurgsim-0.7.0/SurgSim/Devices/Oculus/OculusDisplaySettings.cpp000066400000000000000000000041451277777236100253720ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Devices/Oculus/OculusDisplaySettings.h" #include "SurgSim/Graphics/OsgMatrixConversions.h" namespace SurgSim { namespace Devices { OculusDisplaySettings::OculusDisplaySettings() : m_leftEyeProjectionMatrix(osg::Matrixd()), m_rightEyeProjectionMatrix(osg::Matrixd()) { } OculusDisplaySettings::OculusDisplaySettings(const osg::DisplaySettings* displaySettings) : osg::DisplaySettings(*displaySettings), m_leftEyeProjectionMatrix(osg::Matrixd()), m_rightEyeProjectionMatrix(osg::Matrixd()) { } void OculusDisplaySettings::setLeftEyeProjectionMatrix(const SurgSim::Math::Matrix44d& matrix) { m_leftEyeProjectionMatrix = SurgSim::Graphics::toOsg(matrix); } SurgSim::Math::Matrix44d OculusDisplaySettings::getLeftEyeProjectionMatrix() const { return SurgSim::Graphics::fromOsg(m_leftEyeProjectionMatrix); } void OculusDisplaySettings::setRightEyeProjectionMatrix(const SurgSim::Math::Matrix44d& matrix) { m_rightEyeProjectionMatrix = SurgSim::Graphics::toOsg(matrix); } SurgSim::Math::Matrix44d OculusDisplaySettings::getRightEyeProjectionMatrix() const { return SurgSim::Graphics::fromOsg(m_rightEyeProjectionMatrix); } osg::Matrixd OculusDisplaySettings::computeLeftEyeProjectionImplementation(const osg::Matrixd&) const { return m_leftEyeProjectionMatrix; } osg::Matrixd OculusDisplaySettings::computeRightEyeProjectionImplementation(const osg::Matrixd&) const { return m_rightEyeProjectionMatrix; } }; // namespace Devices }; // namespace SurgSimopensurgsim-0.7.0/SurgSim/Devices/Oculus/OculusDisplaySettings.h000066400000000000000000000054151277777236100250400ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DEVICES_OCULUS_OCULUSDISPLAYSETTINGS_H #define SURGSIM_DEVICES_OCULUS_OCULUSDISPLAYSETTINGS_H #include #include "SurgSim/Math/Matrix.h" namespace SurgSim { namespace Devices { /// A customized osg::DisplaySettings, to be used with Oculus device. /// It passes customized projection matrices to OSG for rendering. class OculusDisplaySettings : public osg::DisplaySettings { public: /// Constructor OculusDisplaySettings(); /// Constructor /// \param displaySettings An instance of osg::DisplaySettings explicit OculusDisplaySettings(const osg::DisplaySettings* displaySettings); /// Set the projection matrix of the left eye /// \param matrix Projection matrix for left eye void setLeftEyeProjectionMatrix(const SurgSim::Math::Matrix44d& matrix); /// Get the projection matrix of the left eye /// \return Projection matrix for left eye SurgSim::Math::Matrix44d getLeftEyeProjectionMatrix() const; /// Set the projection matrix of the right eye /// \param matrix Projection matrix for right eye void setRightEyeProjectionMatrix(const SurgSim::Math::Matrix44d& matrix); /// Get the projection matrix of the right eye /// \return Projection matrix for right eye SurgSim::Math::Matrix44d getRightEyeProjectionMatrix() const; /// This method returns the projection matrix set by setLeftEyeProjectionMatrix() method. /// OSG calls this overriding function to get the left eye projection matrix to use. /// The parameter passed in is NOT used. osg::Matrixd computeLeftEyeProjectionImplementation(const osg::Matrixd&) const override; /// This method returns the projection matrix set by setRighttEyeProjectionMatrix() method. /// OSG calls this overiding function to get the right eye projection matrix to use. /// The parameter passed in is NOT used. osg::Matrixd computeRightEyeProjectionImplementation(const osg::Matrixd&) const override; private: /// Left eye projection matrix osg::Matrixd m_leftEyeProjectionMatrix; /// Right eye projection matrix osg::Matrixd m_rightEyeProjectionMatrix; }; }; // namespace Devices }; // namespace SurgSim #endif // SURGSIM_DEVICES_OCULUS_OCULUSDISPLAYSETTINGS_Hopensurgsim-0.7.0/SurgSim/Devices/Oculus/OculusScaffold.cpp000066400000000000000000000224051277777236100237640ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2015-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Devices/Oculus/OculusScaffold.h" #include #include #include #include #include #if 6 == OVR_MAJOR_VERSION #include #elif 5 == OVR_MAJOR_VERSION #include #endif #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/DataStructures/DataGroupBuilder.h" #include "SurgSim/Devices/Oculus/OculusDevice.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Framework/SharedInstance.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/RigidTransform.h" using SurgSim::DataStructures::DataGroup; using SurgSim::DataStructures::DataGroupBuilder; using SurgSim::Framework::Logger; using SurgSim::Math::makeRigidTransform; using SurgSim::Math::Quaterniond; using SurgSim::Math::RigidTransform3d; using SurgSim::Math::Vector3d; namespace SurgSim { namespace Devices { struct OculusScaffold::DeviceData { /// Constructor /// \param device Device to be wrapped explicit DeviceData(OculusDevice* device) : deviceObject(device), handle(nullptr) { #if 6 == OVR_MAJOR_VERSION ovrHmd_Create(0, &handle); #elif 5 == OVR_MAJOR_VERSION handle = ovrHmd_Create(0); #endif } ~DeviceData() { if (handle != nullptr) { ovrHmd_Destroy(handle); } } /// The device object wrapped in this class. OculusDevice* const deviceObject; /// Device handle ovrHmd handle; }; struct OculusScaffold::StateData { /// List of registered devices. std::list> registeredDevices; /// The mutex that protects the list of registered devices. boost::mutex mutex; }; OculusScaffold::OculusScaffold() : Framework::BasicThread("OculusScaffold"), m_logger(Logger::getLogger("Devices/Oculus")), m_state(new StateData) { SURGSIM_LOG_DEBUG(m_logger) << "Oculus: Shared scaffold created."; // Oculus DK2 tracks Gyroscope, Accelerometer, Magnetometer at 1000Hz and // positional tracking is done at 60Hz. setRate(1000.0); } OculusScaffold::~OculusScaffold() { ovr_Shutdown(); } bool OculusScaffold::registerDevice(OculusDevice* device) { bool success = true; if (!isRunning()) { std::shared_ptr barrier = std::make_shared(2); start(barrier); barrier->wait(true); // Wait for initialize barrier->wait(true); // Wait for startup success = isInitialized(); } if (success) { boost::lock_guard lock(m_state->mutex); const std::string deviceName = device->getName(); auto sameName = [&deviceName](const std::unique_ptr& info) { return info->deviceObject->getName() == deviceName; }; auto found = std::find_if(m_state->registeredDevices.cbegin(), m_state->registeredDevices.cend(), sameName); if (found == m_state->registeredDevices.end()) { std::unique_ptr info(new DeviceData(device)); success = doRegisterDevice(info.get()); if (success) { SURGSIM_LOG_INFO(m_logger) << "Device " << device->getName() << ": Registered"; m_state->registeredDevices.emplace_back(std::move(info)); } } else { SURGSIM_LOG_SEVERE(m_logger) << "Tried to register a device when the same name, '" << device->getName() << "', is already present!"; success = false; } } if (isRunning() && m_state->registeredDevices.size() == 0) { stop(); } return success; } bool OculusScaffold::doRegisterDevice(DeviceData* info) { if (ovrHmd_Detect() < 1) { SURGSIM_LOG_SEVERE(m_logger) << "No available Oculus device detected."; return false; } if (m_state->registeredDevices.size() > 0) { SURGSIM_LOG_SEVERE(m_logger) << "There is one registered Oculus device already. OculusScaffold only supports one device right now"; return false; } if (info->handle == nullptr) { SURGSIM_LOG_SEVERE(m_logger) << "Failed to obtain a handle to Oculus Device. Is an Oculus device plugged in?"; return false; } #if 6 == OVR_MAJOR_VERSION if (ovrSuccess != ovrHmd_ConfigureTracking(info->handle, ovrTrackingCap_Orientation | ovrTrackingCap_MagYawCorrection | ovrTrackingCap_Position, 0)) #elif 5 == OVR_MAJOR_VERSION if (ovrTrue != ovrHmd_ConfigureTracking(info->handle, ovrTrackingCap_Orientation | ovrTrackingCap_MagYawCorrection | ovrTrackingCap_Position, 0)) #endif { SURGSIM_LOG_SEVERE(m_logger) << "Failed to configure an Oculus Device. Registration failed"; return false; } // Query the HMD for the left and right projection matrices. ovrFovPort defaultLeftFov = info->handle->DefaultEyeFov[ovrEyeType::ovrEye_Left]; ovrFovPort defaultRightFov = info->handle->DefaultEyeFov[ovrEyeType::ovrEye_Right]; float nearPlane = info->deviceObject->getNearPlane(); float farPlane = info->deviceObject->getFarPlane(); ovrMatrix4f leftProjection = ovrMatrix4f_Projection(defaultLeftFov, nearPlane, farPlane, ovrProjectionModifier::ovrProjection_RightHanded); ovrMatrix4f rightProjection = ovrMatrix4f_Projection(defaultRightFov, nearPlane, farPlane, ovrProjectionModifier::ovrProjection_RightHanded); DataGroup& inputData = info->deviceObject->getInputData(); inputData.matrices().set(DataStructures::Names::LEFT_PROJECTION_MATRIX, Eigen::Map> (&leftProjection.M[0][0]).cast()); inputData.matrices().set(DataStructures::Names::RIGHT_PROJECTION_MATRIX, Eigen::Map> (&rightProjection.M[0][0]).cast()); info->deviceObject->pushInput(); return true; } bool OculusScaffold::unregisterDevice(const OculusDevice* const device) { bool result = false; { boost::lock_guard lock(m_state->mutex); auto match = std::find_if(m_state->registeredDevices.begin(), m_state->registeredDevices.end(), [&device](const std::unique_ptr& info) { return info->deviceObject == device; }); if (match != m_state->registeredDevices.end()) { m_state->registeredDevices.erase(match); // the iterator is now invalid but that's OK SURGSIM_LOG_INFO(m_logger) << "Device " << getName() << ": unregistered."; result = true; } } // #threadsafety After unregistering, another thread could be in the process of registering. if (isRunning() && m_state->registeredDevices.size() == 0) { stop(); } SURGSIM_LOG_IF(!result, m_logger, SEVERE) << "Attempted to release a non-registered device."; return result; } bool OculusScaffold::doInitialize() { #if 6 == OVR_MAJOR_VERSION if (ovrSuccess != ovr_Initialize(nullptr)) #elif 5 == OVR_MAJOR_VERSION if (ovrTrue != ovr_Initialize(nullptr)) #endif { SURGSIM_LOG_SEVERE(m_logger) << "Oculus SDK initialization failed."; } return true; } bool OculusScaffold::doStartUp() { return true; } bool OculusScaffold::doUpdate(double dt) { boost::lock_guard lock(m_state->mutex); for (auto& device : m_state->registeredDevices) { DataGroup& inputData = device->deviceObject->getInputData(); // Query the HMD for the current tracking state. // If time in 2nd parameter is now or earlier, no pose prediction is made. // Pose is reported in a right handed coordinate system, X->RIGHT, Y->UP, Z->OUT. // Positive rotation is counterclockwise. // The XZ plane is ALWAYS aligned with the ground regardless of camera orientation. // Default tracking origin is one meter away from the camera. ovrTrackingState ts = ovrHmd_GetTrackingState(device->handle, ovr_GetTimeInSeconds()); if (ts.StatusFlags & (ovrStatus_OrientationTracked | ovrStatus_PositionTracked)) { ovrPosef ovrPose = ts.HeadPose.ThePose; Vector3d position(ovrPose.Position.x, ovrPose.Position.y, ovrPose.Position.z); Quaterniond orientation(ovrPose.Orientation.w, ovrPose.Orientation.x, ovrPose.Orientation.y, ovrPose.Orientation.z); RigidTransform3d pose = makeRigidTransform(orientation, position); inputData.poses().set(DataStructures::Names::POSE, pose); } else { inputData.poses().reset(DataStructures::Names::POSE); } device->deviceObject->pushInput(); } return true; } SurgSim::DataStructures::DataGroup OculusScaffold::buildDeviceInputData() { DataGroupBuilder builder; builder.addPose(DataStructures::Names::POSE); builder.addMatrix(DataStructures::Names::LEFT_PROJECTION_MATRIX); builder.addMatrix(DataStructures::Names::RIGHT_PROJECTION_MATRIX); return builder.createData(); } std::shared_ptr OculusScaffold::getOrCreateSharedInstance() { static auto creator = []() { return std::shared_ptr(new OculusScaffold); }; static Framework::SharedInstance sharedInstance(creator); return sharedInstance.get(); } }; // namespace Devices }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Devices/Oculus/OculusScaffold.h000066400000000000000000000056701277777236100234360ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DEVICES_OCULUS_OCULUSSCAFFOLD_H #define SURGSIM_DEVICES_OCULUS_OCULUSSCAFFOLD_H #include #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/Framework/BasicThread.h" namespace SurgSim { namespace Framework { class Logger; } }; namespace SurgSim { namespace Devices { class OculusDevice; /// A class that manages Oculus Rift DK2 devices. /// /// \sa SurgSim::Devices::OculusDevice class OculusScaffold : SurgSim::Framework::BasicThread { public: /// Destructor. ~OculusScaffold(); protected: bool doInitialize() override; bool doStartUp() override; bool doUpdate(double dt) override; private: /// Internal shared state data type. struct StateData; /// Internal per-device information. struct DeviceData; friend class OculusDevice; /// Constructor. OculusScaffold(); /// Gets or creates the scaffold shared by all OculusDevice instances. /// The scaffold is managed using a SharedInstance object, so it will be destroyed when all devices are released. /// \return the scaffold object. static std::shared_ptr getOrCreateSharedInstance(); /// Registers the specified device object. /// \param device The device object to be used, which should have a unique name. /// \return True if the initialization succeeds, false if it fails. bool registerDevice(OculusDevice* device); /// Do the Oculus SDK specific registration /// \param info The device data /// \return true on success, false on failure. bool doRegisterDevice(DeviceData* info); /// Unregisters the specified device object. /// \param device The device object. /// \return true on success, false on failure. bool unregisterDevice(const OculusDevice* device); /// Initializes Oculus SDK. /// \return true on success; false otherwise. bool initializeSdk(); /// Finalizes (de-initializes) Oculus SDK. /// \return true on success; false otherwise. bool finalizeSdk(); /// Builds the data layout for the application input (i.e. device output). static SurgSim::DataStructures::DataGroup buildDeviceInputData(); /// Logger used by the scaffold and all devices. std::shared_ptr m_logger; /// Internal scaffold state. std::unique_ptr m_state; }; }; // namespace Devices }; // namespace SurgSim #endif // SURGSIM_DEVICES_OCULUS_OCULUSSCAFFOLD_H opensurgsim-0.7.0/SurgSim/Devices/Oculus/OculusView.cpp000066400000000000000000000063101277777236100231520ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Devices/Oculus/OculusView.h" #include #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/Devices/Oculus/OculusDisplaySettings.h" #include "SurgSim/Framework/Component.h" #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Input/InputComponent.h" namespace SurgSim { namespace Devices { SURGSIM_REGISTER(SurgSim::Framework::Component, SurgSim::Devices::OculusView, OculusView); OculusView::OculusView(const std::string& name) : OsgView(name) { SURGSIM_ADD_SERIALIZABLE_PROPERTY(OculusView, std::shared_ptr, InputComponent, getInputComponent, setInputComponent); // Default Settings of Oculus DK2 setFullScreen(true); setDisplayType(View::DISPLAY_TYPE_HMD); setStereoMode(View::STEREO_MODE_HORIZONTAL_SPLIT); setScreenWidth(0.0631); setScreenHeight(0.071); setEyeSeparation(0.06); setScreenDistance(0.10); setTargetScreen(1); // Assume Oculus HMD has ID '1'. std::array dimensions = {1920, 1080}; setDimensions(dimensions); } OculusView::~OculusView() { } void OculusView::setInputComponent(std::shared_ptr input) { m_inputComponent = Framework::checkAndConvert(input, "SurgSim::Input::InputComponent"); } std::shared_ptr OculusView::getInputComponent() const { return m_inputComponent; } osg::ref_ptr OculusView::createDisplaySettings() const { SURGSIM_ASSERT(m_inputComponent != nullptr) << "No InputComponent is connected to this view."; osg::ref_ptr displaySettings = new SurgSim::Devices::OculusDisplaySettings(OsgView::createDisplaySettings()); SurgSim::DataStructures::DataGroup dataGroup; m_inputComponent->getData(&dataGroup); SurgSim::DataStructures::DataGroup::DynamicMatrixType leftProjectionMatrix; SurgSim::DataStructures::DataGroup::DynamicMatrixType rightProjectionMatrix; if (dataGroup.matrices().get(SurgSim::DataStructures::Names::LEFT_PROJECTION_MATRIX, &leftProjectionMatrix) && dataGroup.matrices().get(SurgSim::DataStructures::Names::RIGHT_PROJECTION_MATRIX, &rightProjectionMatrix)) { displaySettings->setLeftEyeProjectionMatrix(leftProjectionMatrix.block<4,4>(0, 0)); displaySettings->setRightEyeProjectionMatrix(rightProjectionMatrix.block<4,4>(0, 0)); } else { SURGSIM_LOG_SEVERE(SurgSim::Framework::Logger::getLogger("OculusView")) << "No projection matrices for left/right eye."; } return displaySettings; } }; // namespace Devices }; // namespace SurgSimopensurgsim-0.7.0/SurgSim/Devices/Oculus/OculusView.h000066400000000000000000000040651277777236100226240ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DEVICES_OCULUS_OCULUSVIEW_H #define SURGSIM_DEVICES_OCULUS_OCULUSVIEW_H #include #include #include #include "SurgSim/Graphics/OsgView.h" namespace osg { class DisplaySettings; } namespace SurgSim { namespace Framework { class Component; } namespace Input { class InputComponent; } namespace Devices { SURGSIM_STATIC_REGISTRATION(OculusView); /// OculusView is a customization of SurgSim::Graphics::OsgView with projection matrices pulled from the Oculus device. class OculusView : public SurgSim::Graphics::OsgView { public: /// Constructor /// \param name Name of the view explicit OculusView(const std::string& name); /// Destructor ~OculusView(); SURGSIM_CLASSNAME(SurgSim::Devices::OculusView); /// Set the InputComponent this view connects to. /// Projection matrices of the Oculus device are passed via the DataGroup the InputComponent carries. /// \param input The InputComponent void setInputComponent(std::shared_ptr input); /// \return The InputComponnet this view connects std::shared_ptr getInputComponent() const; protected: osg::ref_ptr createDisplaySettings() const override; private: /// The InputComponent this view connects. std::shared_ptr m_inputComponent; }; }; // namespace Graphics }; // namespace SurgSim #endif // SURGSIM_DEVICES_OCULUS_OCULUSVIEW_H opensurgsim-0.7.0/SurgSim/Devices/Oculus/SceneTest/000077500000000000000000000000001277777236100222365ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Devices/Oculus/SceneTest/CMakeLists.txt000066400000000000000000000025411277777236100250000ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. find_package(Boost 1.54 COMPONENTS program_options) link_directories( ${Boost_LIBRARY_DIRS} ) include_directories( "${CMAKE_CURRENT_SOURCE_DIR}" "${OPENTHREADS_INCLUDE_DIR}" ) set(SOURCES OculusSceneTest.cpp ) set(HEADERS ) # Configure the path for the data files configure_file( "${CMAKE_CURRENT_SOURCE_DIR}/config.txt.in" "${CMAKE_CURRENT_BINARY_DIR}/config.txt" ) surgsim_add_executable(OculusSceneTest "${SOURCES}" "${HEADERS}") SET(LIBS SurgSimFramework SurgSimBlocks SurgSimGraphics SurgSimDataStructures SurgSimInput OculusDevice IdentityPoseDevice ${Boost_LIBRARIES} ${YAML_CPP_LIBRARIES} ) target_link_libraries(OculusSceneTest ${LIBS}) set_target_properties(OculusSceneTest PROPERTIES FOLDER "Devices") opensurgsim-0.7.0/SurgSim/Devices/Oculus/SceneTest/Data/000077500000000000000000000000001277777236100231075ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Devices/Oculus/SceneTest/Data/CameraText.yaml000066400000000000000000000014501277777236100260300ustar00rootroot00000000000000- SurgSim::Framework::BasicSceneElement: Name: CameraText Components: - SurgSim::Blocks::DriveElementFromInputBehavior: Name: Driver Source: SurgSim::Input::InputComponent: Name: Input Id: 9b77c4e2-e9ea-484f-bfca-72121189dcb6 - SurgSim::Graphics::OsgTextRepresentation: Name: Text Text: This is the text for this text I would hope it gets wrapped MaximumWidth: 0.4 FontSize: 0.02 UseScreenSpace: false LocalPose: Quaternion: [0, 0, 0, 1] Translation: [-0.2, 0, -1.5] Color: [0.81, 0.81, 0.0, 1.0] DrawBackground: true BackgroundColor: [0.05, 0.05, 0.6, 1.0] BackgroundMargin: 0.005 opensurgsim-0.7.0/SurgSim/Devices/Oculus/SceneTest/Data/Cube.yaml000066400000000000000000000003761277777236100246570ustar00rootroot00000000000000- SurgSim::Framework::BasicSceneElement: Name: Graphics Components: - SurgSim::Graphics::OsgBoxRepresentation: Name: Box Size: [0.1, 0.1, 0.1] - SurgSim::Graphics::OsgAxesRepresentation: Name: Axesopensurgsim-0.7.0/SurgSim/Devices/Oculus/SceneTest/Data/MonoView.yaml000066400000000000000000000013101277777236100255310ustar00rootroot00000000000000- SurgSim::Framework::BasicSceneElement: Name: View Components: - SurgSim::Graphics::OsgView: Name: View Camera: SurgSim::Graphics::OsgCamera: Id: 9018dd38-c1ae-4e80-a27a-dc24e4b75d35 Name: Camera CameraPosition: [0, 0.5, 1] CameraLookAt: [0, 0, 0] CameraManipulatorEnabled: true - SurgSim::Graphics::OsgCamera: Id: 9018dd38-c1ae-4e80-a27a-dc24e4b75d35 Name: Camera ProjectionMatrix: [[2.414213562373095, 0, 0, 0], [0, 2.414213562373095, 0, 0], [0, 0, -1.002002002002002, -0.02002002002002002], [0, 0, -1, 0]] RenderGroupReference: __OssDefault__opensurgsim-0.7.0/SurgSim/Devices/Oculus/SceneTest/Data/OculusView.yaml000066400000000000000000000025461277777236100261070ustar00rootroot00000000000000- SurgSim::Framework::BasicSceneElement: Name: View Components: - SurgSim::Blocks::DriveElementFromInputBehavior: Name: Driver Source: SurgSim::Input::InputComponent: Name: Input Id: 9b77c4e2-e9ea-484f-bfca-72121189dcb6 - SurgSim::Input::InputComponent: Name: Input Id: 9b77c4e2-e9ea-484f-bfca-72121189dcb6 DeviceName: Tracker LocalPose: Quaternion: [0, 0, 0, 1] Translation: [0, 0.5, 2.0] - SurgSim::Devices::OculusView: Name: View TargetScreen: 2 Camera: SurgSim::Graphics::OsgCamera: Id: 9018dd38-c1ae-4e80-a27a-dc24e4b75d35 Name: Camera EyeSeparation: 0.06 ScreenHeight: 0.071 ScreenDistance: 0.10 ScreenWidth: 0.0631 InputComponent: SurgSim::Input::InputComponent: Name: Input Id: 9b77c4e2-e9ea-484f-bfca-72121189dcb6 - SurgSim::Graphics::OsgCamera: Id: 9018dd38-c1ae-4e80-a27a-dc24e4b75d35 Name: Camera ProjectionMatrix: [[0.8390996311772799, 0, 0, 0], [0, 0.8390996311772799, 0, 0], [0, 0, -1.002002002002002, -0.02002002002002002], [0, 0, -1, 0]] RenderGroupReference: __OssDefault__opensurgsim-0.7.0/SurgSim/Devices/Oculus/SceneTest/Data/OsgView.yaml000066400000000000000000000025271277777236100253640ustar00rootroot00000000000000- SurgSim::Framework::BasicSceneElement: Name: View Components: - SurgSim::Blocks::DriveElementFromInputBehavior: Name: Driver Source: SurgSim::Input::InputComponent: Name: Input Id: 9b77c4e2-e9ea-484f-bfca-72121189dcb6 - SurgSim::Input::InputComponent: Name: Input Id: 9b77c4e2-e9ea-484f-bfca-72121189dcb6 DeviceName: Tracker LocalPose: Quaternion: [0, 0, 0, 1] Translation: [0, 0.5, 2.0] - SurgSim::Graphics::OsgView: Name: View FullScreen: true Dimensions: - 1920 - 1080 TargetScreen: 2 Camera: SurgSim::Graphics::OsgCamera: Id: 9018dd38-c1ae-4e80-a27a-dc24e4b75d35 Name: Camera DisplayType: 1 StereoMode: 2 EyeSeparation: 0.06 ScreenHeight: 0.071 ScreenDistance: 0.10 ScreenWidth: 0.0631 - SurgSim::Graphics::OsgCamera: Id: 9018dd38-c1ae-4e80-a27a-dc24e4b75d35 Name: Camera ProjectionMatrix: [[0.8390996311772799, 0, 0, 0], [0, 0.8390996311772799, 0, 0], [0, 0, -1.002002002002002, -0.02002002002002002], [0, 0, -1, 0]] RenderGroupReference: __OssDefault__opensurgsim-0.7.0/SurgSim/Devices/Oculus/SceneTest/OculusSceneTest.cpp000066400000000000000000000102241277777236100260310ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include #include #include #include #include "SurgSim/Blocks/Blocks.h" #include "SurgSim/Framework/Framework.h" #include "SurgSim/Graphics/Graphics.h" #include "SurgSim/Input/Input.h" #include "SurgSim/Math/Math.h" // Include this for linking only #include "SurgSim/Devices/IdentityPoseDevice/IdentityPoseDevice.h" #include "SurgSim/Devices/Oculus/OculusDevice.h" #include "SurgSim/Devices/Oculus/OculusView.h" using SurgSim::Framework::Logger; using SurgSim::Framework::Runtime; using SurgSim::Math::Vector3d; namespace po = boost::program_options; int main(int argc, char* argv[]) { // Parse command-line parameters std::string sceneFileName; po::options_description visible("Allowed options"); visible.add_options()("help", "produce help message") ("config-file", po::value(), "The config file to use"); po::options_description hidden("Hidden options"); hidden.add_options()("input-file", po::value>(), "input file"); po::options_description all("All options"); all.add(visible).add(hidden); po::positional_options_description positional; positional.add("input-file", -1); po::variables_map variables; po::store(po::command_line_parser(argc, argv).options(all).positional(positional).run(), variables); if (variables.count("help")) { std::cout << visible << "\n"; return 1; } if (variables.count("input-file") == 0) { std::cout << "You need to supply one or more input files.\n"; return 1; } std::shared_ptr runtime; if (variables.count("config-file") == 1) { runtime = std::make_shared(variables["config-file"].as()); } else { runtime = std::make_shared(); } auto data = runtime->getApplicationData(); runtime->addManager(std::make_shared()); runtime->addManager(std::make_shared()); std::string sceneFile; if (variables.count("scene") == 1) { runtime->loadScene(variables["config-file"].as()); } std::array devices = { "SurgSim::Devices::OculusDevice", "SurgSim::Devices::IdentityPoseDevice" }; std::shared_ptr device; for (auto deviceName : devices) { try { device = SurgSim::Input::DeviceInterface::getFactory().create(deviceName, "Tracker"); } catch (std::exception e) { continue; } if (device->initialize()) { break; } else { device = nullptr; } } SURGSIM_ASSERT(device != nullptr) << "Could not initialize any kind of tracking device."; auto inputManager = std::make_shared(); runtime->addManager(inputManager); inputManager->addDevice(device); auto scene = runtime->getScene(); auto files = variables["input-file"].as>(); for (auto file : files) { auto appData = runtime->getApplicationData(); std::string path; #ifdef WIN32 // Fix windows backslashes coming in from the command-line, these may be absolute paths std::replace_if(file.begin(), file.end(), [](const char& c) { return c == '\\'; }, '/'); #endif // In this case we circumvent the assertion that will stop execution if the file can't be found and // try to show as many scenery objects as possible if (appData->tryFindFile(file, &path)) { runtime->addSceneElements(file); } else { SURGSIM_LOG_WARNING(Logger::getDefaultLogger()) << "Can't find " << file; } } runtime->execute(); return 0; } opensurgsim-0.7.0/SurgSim/Devices/Oculus/SceneTest/config.txt.in000066400000000000000000000000761277777236100246540ustar00rootroot00000000000000${SURGSIM_SOURCE_DIR}/Data/ ${CMAKE_CURRENT_SOURCE_DIR}/Data/opensurgsim-0.7.0/SurgSim/Devices/Oculus/UnitTests/000077500000000000000000000000001277777236100223035ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Devices/Oculus/UnitTests/CMakeLists.txt000066400000000000000000000021141277777236100250410ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2015, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. include_directories( ${gtest_SOURCE_DIR}/include ) set(UNIT_TEST_SOURCES OculusDeviceTest.cpp OculusDisplaySettingsTests.cpp OculusViewTests.cpp ) set(UNIT_TEST_HEADERS ) set(LIBS SurgSimDataStructures SurgSimInput SurgSimTesting OculusDevice ) surgsim_add_unit_tests(OculusDeviceTest) target_link_libraries(OculusDeviceTest ${LIBS}) # Put OculusDeviceTest into folder "Devices" set_target_properties(OculusDeviceTest PROPERTIES FOLDER "Devices") opensurgsim-0.7.0/SurgSim/Devices/Oculus/UnitTests/OculusDeviceTest.cpp000066400000000000000000000106251277777236100262450ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include #include #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/Devices/Oculus/OculusDevice.h" #include "SurgSim/Testing/MockInputOutput.h" using SurgSim::Devices::OculusDevice; using SurgSim::DataStructures::DataGroup; using SurgSim::Input::InputConsumerInterface; using SurgSim::Testing::MockInputOutput; TEST(OculusDeviceTest, CreateAndInitializeDevice) { auto device = std::make_shared("Oculus"); ASSERT_TRUE(nullptr != device) << "Device creation failed."; EXPECT_FALSE(device->isInitialized()); EXPECT_EQ("Oculus", device->getName()); ASSERT_TRUE(device->initialize()) << "Initialization failed. Is an Oculus device plugged in?"; EXPECT_TRUE(device->isInitialized()); EXPECT_EQ("Oculus", device->getName()); EXPECT_FLOAT_EQ(0.1f, device->getNearPlane()); EXPECT_FLOAT_EQ(10.0f, device->getFarPlane()); } TEST(OculusDeviceTest, SetAndGetNearAndFarPlanes) { auto device = std::make_shared("Oculus"); EXPECT_FLOAT_EQ(0.1f, device->getNearPlane()); EXPECT_FLOAT_EQ(10.0f, device->getFarPlane()); EXPECT_THROW(device->setNearPlane(-0.1f), SurgSim::Framework::AssertionFailure); EXPECT_THROW(device->setFarPlane(-10.0f), SurgSim::Framework::AssertionFailure); EXPECT_NO_THROW(device->setNearPlane(0.2f)); EXPECT_NO_THROW(device->setFarPlane(20.0f)); EXPECT_FLOAT_EQ(0.2f, device->getNearPlane()); EXPECT_FLOAT_EQ(20.0f, device->getFarPlane()); } TEST(OculusDeviceTest, Factory) { std::shared_ptr device; ASSERT_NO_THROW(device = SurgSim::Input::DeviceInterface::getFactory().create( "SurgSim::Devices::OculusDevice", "Device")); EXPECT_NE(nullptr, device); } TEST(OculusDeviceTest, RegisterMoreThanOneDevice) { auto device1 = std::make_shared("Oculus"); ASSERT_TRUE(nullptr != device1) << "Device creation failed."; ASSERT_TRUE(device1->initialize()) << "Initialization failed. Is an Oculus device plugged in?"; auto device2 = std::make_shared("Oculus2"); ASSERT_TRUE(nullptr != device2) << "Device creation failed."; ASSERT_FALSE(device2->initialize()) << "Initialization should not have succeceded, only one device allowed."; } TEST(OculusDeviceTest, InputConsumer) { auto device = std::make_shared("Oculus"); ASSERT_TRUE(nullptr != device) << "Device creation failed."; EXPECT_TRUE(device->initialize()) << "Initialization failed. Is an Oculus device plugged in?"; auto consumer = std::make_shared(); EXPECT_EQ(0, consumer->m_numTimesInitializedInput); EXPECT_EQ(0, consumer->m_numTimesReceivedInput); EXPECT_FALSE(device->removeInputConsumer(consumer)); EXPECT_EQ(0, consumer->m_numTimesInitializedInput); EXPECT_EQ(0, consumer->m_numTimesReceivedInput); EXPECT_TRUE(device->addInputConsumer(consumer)); // Adding the same input consumer again should fail. EXPECT_FALSE(device->addInputConsumer(consumer)); // Sleep for a second, to see how many times the consumer is invoked. boost::this_thread::sleep_for(boost::chrono::milliseconds(1000)); EXPECT_TRUE(device->removeInputConsumer(consumer)); // Removing the same input consumer again should fail. EXPECT_FALSE(device->removeInputConsumer(consumer)); // Check the number of invocations. EXPECT_EQ(1, consumer->m_numTimesInitializedInput); EXPECT_GE(consumer->m_numTimesReceivedInput, 800); EXPECT_LE(consumer->m_numTimesReceivedInput, 1200); EXPECT_TRUE(consumer->m_lastReceivedInput.poses().hasData(SurgSim::DataStructures::Names::POSE)); EXPECT_TRUE(consumer->m_lastReceivedInput.matrices(). hasData(SurgSim::DataStructures::Names::LEFT_PROJECTION_MATRIX)); EXPECT_TRUE(consumer->m_lastReceivedInput.matrices(). hasData(SurgSim::DataStructures::Names::RIGHT_PROJECTION_MATRIX)); } opensurgsim-0.7.0/SurgSim/Devices/Oculus/UnitTests/OculusDisplaySettingsTests.cpp000066400000000000000000000037321277777236100303600ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include "SurgSim/Devices/Oculus/OculusDisplaySettings.h" #include "SurgSim/Math/Matrix.h" namespace { const double epsilon = 1e-10; } using SurgSim::Devices::OculusDisplaySettings; TEST(OculusDisplaySettingsTest, Constructor) { EXPECT_NO_THROW(OculusDisplaySettings displaySettings); osg::ref_ptr osgDisplaySettings = new osg::DisplaySettings; EXPECT_NO_THROW(OculusDisplaySettings displaySettings(osgDisplaySettings)); } TEST(OculusDisplaySettingsTest, SetAndGetProjectionMatrix) { OculusDisplaySettings displaySettings; SurgSim::Math::Matrix44d leftProjectionMatrix = SurgSim::Math::Matrix44d::Identity() * 2.0; SurgSim::Math::Matrix44d rightProjectionMatrix = SurgSim::Math::Matrix44d::Identity() * 3.0; EXPECT_NO_THROW(displaySettings.setLeftEyeProjectionMatrix(leftProjectionMatrix)); EXPECT_NO_THROW(displaySettings.setRightEyeProjectionMatrix(rightProjectionMatrix)); SurgSim::Math::Matrix44d leftRetrieved; EXPECT_NO_THROW(leftRetrieved = displaySettings.getLeftEyeProjectionMatrix()); EXPECT_TRUE(leftProjectionMatrix.isApprox(leftRetrieved, epsilon)); SurgSim::Math::Matrix44d rightRetrieved; EXPECT_NO_THROW(rightRetrieved = displaySettings.getRightEyeProjectionMatrix()); EXPECT_TRUE(rightProjectionMatrix.isApprox(rightRetrieved, epsilon)); } opensurgsim-0.7.0/SurgSim/Devices/Oculus/UnitTests/OculusViewTests.cpp000066400000000000000000000040721277777236100261420ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the OculusView class. #include #include "SurgSim/Devices/Oculus/OculusView.h" #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Input/InputComponent.h" using SurgSim::Devices::OculusView; TEST(OculusViewTests, InitTest) { EXPECT_NO_THROW(SurgSim::Devices::OculusView("OculusView")); } TEST(OculusViewTests, SetAndGetInputComponent) { auto view = std::make_shared("OculusView"); auto inputComponent = std::make_shared("InputComponent"); EXPECT_NO_THROW(view->setInputComponent(inputComponent)); EXPECT_EQ(inputComponent, view->getInputComponent()); } TEST(OculusViewTests, Serialization) { auto view = std::make_shared("test name"); std::shared_ptr inputComponent = std::make_shared("InputComponent"); view->setValue("InputComponent", inputComponent); /// Serialize YAML::Node node; EXPECT_NO_THROW(node = YAML::convert::encode(*view);); /// Deserialize std::shared_ptr newView; EXPECT_NO_THROW(newView = std::dynamic_pointer_cast( node.as>())); EXPECT_NE(nullptr, newView); EXPECT_NE(nullptr, newView->getInputComponent()); EXPECT_EQ(inputComponent->getName(), newView->getInputComponent()->getName()); } opensurgsim-0.7.0/SurgSim/Devices/Oculus/VisualTest/000077500000000000000000000000001277777236100224445ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Devices/Oculus/VisualTest/CMakeLists.txt000066400000000000000000000017601277777236100252100ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. set(EXAMPLE_SOURCES main.cpp ) set(EXAMPLE_HEADERS ) surgsim_add_executable(OculusVisualTest "${EXAMPLE_SOURCES}" "${EXAMPLE_HEADERS}") set(LIBS IdentityPoseDevice OculusDevice VisualTestCommon ) target_link_libraries(OculusVisualTest ${LIBS}) # Put OculusVisualTest into folder "Devices" set_target_properties(OculusVisualTest PROPERTIES FOLDER "Devices") opensurgsim-0.7.0/SurgSim/Devices/Oculus/VisualTest/main.cpp000066400000000000000000000031301277777236100240710ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Devices/IdentityPoseDevice/IdentityPoseDevice.h" #include "SurgSim/Devices/Oculus/OculusDevice.h" #include "SurgSim/Input/DeviceInterface.h" #include "SurgSim/Testing/VisualTestCommon/ToolSquareTest.h" using SurgSim::Devices::IdentityPoseDevice; using SurgSim::Devices::OculusDevice; using SurgSim::Input::DeviceInterface; int main(int argc, char** argv) { auto toolDevice = std::make_shared("OculusDevice"); // The square is controlled by a second device. For a simple test, we're using an IdentityPoseDevice-- // a pretend device that doesn't actually move. std::shared_ptr squareDevice = std::make_shared("IdentityPoseDevice"); runToolSquareTest(toolDevice, squareDevice, "Move the Oculus device to move the sphere tool."); std::cout << std::endl << "Exiting." << std::endl; // Cleanup and shutdown will happen automatically as objects go out of scope. return 0; } opensurgsim-0.7.0/SurgSim/Devices/OpenNI/000077500000000000000000000000001277777236100202175ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Devices/OpenNI/CMakeLists.txt000066400000000000000000000024301277777236100227560ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. find_package(OpenNI2 REQUIRED) include_directories(SYSTEM ${OPENNI2_INCLUDE_DIRS} ) set(LIBS SurgSimInput ${OPENNI2_LIBRARIES} ) set(OPENNI_DEVICE_SOURCES OpenNIDevice.cpp OpenNIScaffold.cpp ) set(OPENNI_DEVICE_HEADERS OpenNIDevice.h OpenNIScaffold.h ) set(DEVICE_HEADERS ${DEVICE_HEADERS} OpenNI/OpenNIDevice.h PARENT_SCOPE) surgsim_add_library( OpenNIDevice "${OPENNI_DEVICE_SOURCES}" "${OPENNI_DEVICE_HEADERS}" ) target_link_libraries(OpenNIDevice ${LIBS}) if(BUILD_TESTING) add_subdirectory(UnitTests) if(GLUT_FOUND) add_subdirectory(VisualTest) endif(GLUT_FOUND) endif() set_target_properties(OpenNIDevice PROPERTIES FOLDER "Devices") opensurgsim-0.7.0/SurgSim/Devices/OpenNI/OpenNI.dox000066400000000000000000000007771277777236100220760ustar00rootroot00000000000000/*! \page OpenNI OpenNI: Depth Sensing Cameras This adds support for OpenNI 2 compatible depth sensing cameras, such as the Asus Xtion Pro. Dependencies ------------ OpenNI 2 SDK: Prebuilt binaries are availble for Windows, and GNU/Linux on Structure.io's website. For Windows, add the 'OpenNI2/Redist/' folder to your PATH environment variable. If you used the default installation location, this will be: \code C:/ProgramFiles (x86)/OpenNI2/Redist/ \endcode */ opensurgsim-0.7.0/SurgSim/Devices/OpenNI/OpenNIDevice.cpp000066400000000000000000000034241277777236100231760ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Devices/OpenNI/OpenNIDevice.h" #include "SurgSim/Devices/OpenNI/OpenNIScaffold.h" namespace SurgSim { namespace Devices { SURGSIM_REGISTER(SurgSim::Input::DeviceInterface, SurgSim::Devices::OpenNIDevice, OpenNIDevice); OpenNIDevice::OpenNIDevice(const std::string& name) : SurgSim::Input::CommonDevice(name, OpenNIScaffold::buildDeviceInputData()) { } OpenNIDevice::~OpenNIDevice() { if (isInitialized()) { finalize(); } } bool OpenNIDevice::initialize() { SURGSIM_ASSERT(!isInitialized()) << getName() << " already initialized."; auto scaffold = OpenNIScaffold::getOrCreateSharedInstance(); SURGSIM_ASSERT(scaffold != nullptr); bool initialize = false; if (scaffold->registerDevice(this)) { m_scaffold = std::move(scaffold); initialize = true; } return initialize; } bool OpenNIDevice::finalize() { SURGSIM_ASSERT(isInitialized()) << getName() << " is not initialized, cannot finalize."; bool success = m_scaffold->unregisterDevice(this); m_scaffold.reset(); return success; } bool OpenNIDevice::isInitialized() const { return (m_scaffold != nullptr); } }; // namespace Devices }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Devices/OpenNI/OpenNIDevice.h000066400000000000000000000043511277777236100226430ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DEVICES_OPENNI_OPENNIDEVICE_H #define SURGSIM_DEVICES_OPENNI_OPENNIDEVICE_H #include "SurgSim/Input/CommonDevice.h" namespace SurgSim { namespace Devices { class OpenNIScaffold; SURGSIM_STATIC_REGISTRATION(OpenNIDevice); /// A class implementing the communication with one OpenNI compatible depth camera /// /// \par Application input provided by the device: /// | type | name | | /// | ---- | ---- | --- | /// | image | "color" | Color image (RGB) of floats, each pixel value is between 0 and 1. | /// | image | "depth" | Depth image of floats, each pixel value is depth from the camera in meters.| /// | image | "depth_xyz" | Position of each pixel (x, y, z) in meters with respect to the camera. | /// /// \par Application output used by the device: none. /// /// \sa SurgSim::Devices::OpenNIScaffold class OpenNIDevice : public SurgSim::Input::CommonDevice { public: /// Constructor. /// \param name A unique name for the device that will be used by the application. explicit OpenNIDevice(const std::string& name); SURGSIM_CLASSNAME(SurgSim::Devices::OpenNIDevice); /// Destructor. virtual ~OpenNIDevice(); bool initialize() override; bool isInitialized() const override; private: friend class OpenNIScaffold; bool finalize() override; std::shared_ptr m_scaffold; }; }; }; #endif //SURGSIM_DEVICES_OPENNI_OPENNIDEVICE_H opensurgsim-0.7.0/SurgSim/Devices/OpenNI/OpenNIScaffold.cpp000066400000000000000000000204471277777236100235240ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Devices/OpenNI/OpenNIScaffold.h" #include #include #include #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/DataStructures/DataGroupBuilder.h" #include "SurgSim/Devices/OpenNI/OpenNIDevice.h" #include "SurgSim/Framework/Barrier.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Framework/SharedInstance.h" namespace SurgSim { namespace Devices { struct OpenNIScaffold::DeviceData { explicit DeviceData(OpenNIDevice* device) : deviceObject(device) { } /// OpenNI device openni::Device camera; /// OpenNI Depth Video Stream openni::VideoStream depthStream; /// OpenNI RGB Image Video Stream openni::VideoStream colorStream; /// The corresponding device object. OpenNIDevice* const deviceObject; }; struct OpenNIScaffold::StateData { /// The list of known devices. std::list> activeDevices; /// The mutex that protects the list of known devices. boost::mutex mutex; }; OpenNIScaffold::OpenNIScaffold() : SurgSim::Framework::BasicThread("OpenNI Scaffold"), m_state(new StateData), m_logger(SurgSim::Framework::Logger::getLogger("OpenNI")) { setRate(100); } OpenNIScaffold::~OpenNIScaffold() { openni::OpenNI::shutdown(); } bool OpenNIScaffold::registerDevice(OpenNIDevice* device) { bool success = true; if (!isRunning()) { std::shared_ptr barrier = std::make_shared(2); start(barrier); barrier->wait(true); // Wait for initialize barrier->wait(true); // Wait for startup success = isInitialized(); } if (success) { boost::lock_guard lock(m_state->mutex); const std::string deviceName = device->getName(); auto sameName = [&deviceName](const std::unique_ptr& info) { return info->deviceObject->getName() == deviceName; }; auto found = std::find_if(m_state->activeDevices.cbegin(), m_state->activeDevices.cend(), sameName); if (found == m_state->activeDevices.end()) { std::unique_ptr info(new DeviceData(device)); success = doRegisterDevice(info.get()); if (success) { SURGSIM_LOG_INFO(m_logger) << "Device " << device->getName() << ": Registered"; m_state->activeDevices.emplace_back(std::move(info)); } } else { SURGSIM_LOG_SEVERE(m_logger) << "Tried to register a device when the same name, '" << device->getName() << "', is already present!"; success = false; } } return success; } bool OpenNIScaffold::doRegisterDevice(DeviceData* info) { openni::Status status; status = info->camera.open(openni::ANY_DEVICE); if (status != openni::STATUS_OK) { SURGSIM_LOG_SEVERE(m_logger) << "Could not connect to a camera: " << openni::OpenNI::getExtendedError(); return false; } status = info->depthStream.create(info->camera, openni::SENSOR_DEPTH); if (status != openni::STATUS_OK) { SURGSIM_LOG_SEVERE(m_logger) << "Could not find depth stream: " << openni::OpenNI::getExtendedError(); return false; } status = info->colorStream.create(info->camera, openni::SENSOR_COLOR); if (status != openni::STATUS_OK) { SURGSIM_LOG_SEVERE(m_logger) << "Could find color image stream: " << openni::OpenNI::getExtendedError(); return false; } status = info->depthStream.start(); if (status != openni::STATUS_OK || !info->depthStream.isValid()) { SURGSIM_LOG_SEVERE(m_logger) << "Unable to start depth stream: " << openni::OpenNI::getExtendedError(); return false; } status = info->colorStream.start(); if (status != openni::STATUS_OK || !info->colorStream.isValid()) { SURGSIM_LOG_SEVERE(m_logger) << "Unable to start color image stream: " << openni::OpenNI::getExtendedError(); return false; } return true; } bool OpenNIScaffold::unregisterDevice(const OpenNIDevice* device) { bool success = true; { boost::lock_guard lock(m_state->mutex); auto sameDevice = [device](const std::unique_ptr& info) { return info->deviceObject == device; }; auto info = std::find_if(m_state->activeDevices.begin(), m_state->activeDevices.end(), sameDevice); if (info != m_state->activeDevices.end()) { success = doUnregisterDevice((*info).get()); if (success) { SURGSIM_LOG_INFO(m_logger) << "Device " << device->getName() << ": Unregistered"; m_state->activeDevices.erase(info); } } else { SURGSIM_LOG_SEVERE(m_logger) << "Attempted to release a non-registered device named '" << device->getName() << "."; success = false; } } if (success && isRunning() && m_state->activeDevices.size() == 0) { stop(); } return success; } bool OpenNIScaffold::doUnregisterDevice(DeviceData* info) { info->depthStream.destroy(); info->colorStream.destroy(); info->camera.close(); return true; } bool OpenNIScaffold::doInitialize() { openni::Status status = openni::OpenNI::initialize(); bool success = (status == openni::STATUS_OK); SURGSIM_LOG_IF(!success, m_logger, SEVERE) << "Initialize failed: " << openni::OpenNI::getExtendedError(); return success; } bool OpenNIScaffold::doStartUp() { return true; } bool OpenNIScaffold::doUpdate(double dt) { boost::lock_guard lock(m_state->mutex); openni::VideoFrameRef depthFrame; openni::VideoFrameRef colorFrame; typedef SurgSim::DataStructures::DataGroup::ImageType ImageType; for (auto info = m_state->activeDevices.begin(); info != m_state->activeDevices.end(); ++info) { SurgSim::DataStructures::DataGroup& inputData = (*info)->deviceObject->getInputData(); if ((*info)->depthStream.readFrame(&depthFrame) == openni::STATUS_OK) { size_t width = depthFrame.getWidth(); size_t height = depthFrame.getHeight(); typedef Eigen::Map> DepthDataType; DepthDataType depthData(reinterpret_cast(depthFrame.getData()), width, height); ImageType depth(width, height, 1); depth.getAsVector() = depthData.cast() * (1.0f / 1000.0f); // convert milimeters to meters inputData.images().set("depth", std::move(depth)); ImageType depth_xyz(width, height, 3); auto x = depth_xyz.getChannel(0); auto y = depth_xyz.getChannel(1); auto z = depth_xyz.getChannel(2); for (size_t i = 0; i < width; i++) { for (size_t j = 0; j < height; j++) { openni::CoordinateConverter::convertDepthToWorld((*info)->depthStream, i, j, depthData(i, j), &x(i, j), &y(i, j), &z(i, j)); } } depth_xyz.getAsVector() *= (1.0f / 1000.0f); // convert milimeters to meters inputData.images().set("depth_xyz", std::move(depth_xyz)); } else { inputData.images().reset("depth"); inputData.images().reset("depth_xyz"); } if ((*info)->colorStream.readFrame(&colorFrame) == openni::STATUS_OK) { ImageType image(colorFrame.getWidth(), colorFrame.getHeight(), 3, reinterpret_cast(colorFrame.getData())); image.getAsVector() *= (1.0f / 255.0f); // OpenNI returns colors between 0 and 255, scale values to 0..1 inputData.images().set("color", std::move(image)); } else { inputData.images().reset("color"); } (*info)->deviceObject->pushInput(); } return true; } std::shared_ptr OpenNIScaffold::getOrCreateSharedInstance() { static auto creator = []() { return std::shared_ptr(new OpenNIScaffold); }; static SurgSim::Framework::SharedInstance sharedInstance(creator); return sharedInstance.get(); } SurgSim::DataStructures::DataGroup OpenNIScaffold::buildDeviceInputData() { SurgSim::DataStructures::DataGroupBuilder builder; builder.addImage("color"); builder.addImage("depth"); builder.addImage("depth_xyz"); return builder.createData(); } }; // namespace Devices }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Devices/OpenNI/OpenNIScaffold.h000066400000000000000000000055051277777236100231670ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DEVICES_OPENNI_OPENNISCAFFOLD_H #define SURGSIM_DEVICES_OPENNI_OPENNISCAFFOLD_H #include #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/Framework/BasicThread.h" namespace SurgSim { namespace Framework { class Logger; }; namespace Devices { class OpenNIDevice; /// A class that manages OpenNI devices /// /// \sa SurgSim::Devices::OpenNIDevice class OpenNIScaffold : public SurgSim::Framework::BasicThread { public: /// Destructor. virtual ~OpenNIScaffold(); protected: bool doInitialize() override; bool doStartUp() override; bool doUpdate(double dt) override; private: /// Internal shared state data type. struct StateData; /// Interal per-device information. struct DeviceData; friend class OpenNIDevice; /// Constructor. OpenNIScaffold(); /// Gets or creates the scaffold shared by all OpenNIDevice instances. /// The scaffold is managed using a SharedInstance object, so it will be destroyed when all devices are released. /// \return the scaffold object. static std::shared_ptr getOrCreateSharedInstance(); /// Registers the specified device object. /// \param device The device object to be used /// \return True if the initialization succeeds, false if it fails. bool registerDevice(OpenNIDevice* device); /// Unregisters the specified device object. /// \param device The device object. /// \return true on success, false on failure. bool unregisterDevice(const OpenNIDevice* device); /// Do the OpenNI specific registration /// \param info The device data /// \return true on success, false on failure. bool doRegisterDevice(DeviceData* info); /// Do the OpenNI specific unregistration /// \param info The device data /// \return true on success, false on failure. bool doUnregisterDevice(DeviceData* info); /// Builds the data layout for the application input (i.e. device output). static SurgSim::DataStructures::DataGroup buildDeviceInputData(); /// Internal scaffold state. std::unique_ptr m_state; /// Logger used by the scaffold std::shared_ptr m_logger; }; }; // namespace Devices }; // namespace SurgSim #endif // SURGSIM_DEVICES_OPENNI_OPENNISCAFFOLD_H opensurgsim-0.7.0/SurgSim/Devices/OpenNI/UnitTests/000077500000000000000000000000001277777236100221615ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Devices/OpenNI/UnitTests/CMakeLists.txt000066400000000000000000000015541277777236100247260ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. include_directories( ${gtest_SOURCE_DIR}/include ) set(UNIT_TEST_SOURCES OpenNIDeviceTest.cpp ) set(LIBS OpenNIDevice ) surgsim_add_unit_tests(OpenNIDeviceTest) set_target_properties(OpenNIDeviceTest PROPERTIES FOLDER "Devices") opensurgsim-0.7.0/SurgSim/Devices/OpenNI/UnitTests/OpenNIDeviceTest.cpp000066400000000000000000000123011277777236100257720ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the OpenNIDevice class. #include #include #include #include #include #include "SurgSim/Devices/OpenNI/OpenNIDevice.h" #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Matrix.h" #include "SurgSim/Testing/MockInputOutput.h" using SurgSim::Devices::OpenNIDevice; using SurgSim::Devices::OpenNIScaffold; using SurgSim::DataStructures::DataGroup; using SurgSim::Math::RigidTransform3d; using SurgSim::Math::Matrix44d; using SurgSim::Testing::MockInputOutput; TEST(OpenNIDeviceTest, CreateUninitializedDevice) { std::shared_ptr device = std::make_shared("TestOpenNI"); ASSERT_TRUE(device != nullptr) << "Device creation failed."; } TEST(OpenNIDeviceTest, CreateAndInitializeDevice) { std::shared_ptr device = std::make_shared("TestOpenNI"); ASSERT_TRUE(device != nullptr) << "Device creation failed."; EXPECT_FALSE(device->isInitialized()); ASSERT_TRUE(device->initialize()) << "Initialization failed. Is a OpenNI device plugged in?"; EXPECT_TRUE(device->isInitialized()); } TEST(OpenNIDeviceTest, Name) { std::shared_ptr device = std::make_shared("TestOpenNI"); ASSERT_TRUE(device != nullptr) << "Device creation failed."; EXPECT_EQ("TestOpenNI", device->getName()); EXPECT_TRUE(device->initialize()) << "Initialization failed. Is a OpenNI device plugged in?"; EXPECT_EQ("TestOpenNI", device->getName()); } TEST(OpenNIDeviceTest, CreateDevicesWithSameName) { std::shared_ptr device1 = std::make_shared("OpenNI"); ASSERT_TRUE(device1 != nullptr) << "Device creation failed."; ASSERT_TRUE(device1->initialize()) << "Initialization failed. Is a OpenNI device plugged in?"; std::shared_ptr device2 = std::make_shared("OpenNI"); ASSERT_TRUE(device2 != nullptr) << "Device creation failed."; ASSERT_FALSE(device2->initialize()) << "Initialization succeeded despite duplicate name."; } TEST(OpenNIDeviceTest, InputConsumer) { std::shared_ptr device = std::make_shared("TestOpenNI"); ASSERT_TRUE(device != nullptr) << "Device creation failed."; ASSERT_TRUE(device->initialize()) << "Initialization failed. Is a OpenNI device plugged in?"; std::shared_ptr consumer = std::make_shared(); EXPECT_EQ(0, consumer->m_numTimesInitializedInput); EXPECT_EQ(0, consumer->m_numTimesReceivedInput); EXPECT_FALSE(device->removeInputConsumer(consumer)); EXPECT_EQ(0, consumer->m_numTimesInitializedInput); EXPECT_EQ(0, consumer->m_numTimesReceivedInput); EXPECT_TRUE(device->addInputConsumer(consumer)); // Adding the same input consumer again should fail. EXPECT_FALSE(device->addInputConsumer(consumer)); // Sleep for a second, to see how many times the consumer is invoked. boost::this_thread::sleep_until(boost::chrono::steady_clock::now() + boost::chrono::milliseconds(1000)); EXPECT_TRUE(device->removeInputConsumer(consumer)); // Removing the same input consumer again should fail. EXPECT_FALSE(device->removeInputConsumer(consumer)); // Check the number of invocations. EXPECT_EQ(1, consumer->m_numTimesInitializedInput); EXPECT_GE(consumer->m_numTimesReceivedInput, 10); EXPECT_LE(consumer->m_numTimesReceivedInput, 120); EXPECT_TRUE(consumer->m_lastReceivedInput.images().hasData("color")); EXPECT_TRUE(consumer->m_lastReceivedInput.images().hasData("depth")); EXPECT_TRUE(consumer->m_lastReceivedInput.images().hasData("depth_xyz")); } TEST(OpenNIDeviceTest, OutputProducer) { std::shared_ptr device = std::make_shared("TestOpenNI"); ASSERT_TRUE(device != nullptr) << "Device creation failed."; ASSERT_TRUE(device->initialize()) << "Initialization failed. Is a OpenNI device plugged in?"; std::shared_ptr producer = std::make_shared(); EXPECT_EQ(0, producer->m_numTimesRequestedOutput); EXPECT_FALSE(device->removeOutputProducer(producer)); EXPECT_EQ(0, producer->m_numTimesRequestedOutput); EXPECT_TRUE(device->setOutputProducer(producer)); // Sleep for a second, to see how many times the producer is invoked. boost::this_thread::sleep_until(boost::chrono::steady_clock::now() + boost::chrono::milliseconds(1000)); EXPECT_TRUE(device->removeOutputProducer(producer)); // Removing the same input producer again should fail. EXPECT_FALSE(device->removeOutputProducer(producer)); // Check the number of invocations. EXPECT_EQ(0, producer->m_numTimesRequestedOutput); } opensurgsim-0.7.0/SurgSim/Devices/OpenNI/VisualTest/000077500000000000000000000000001277777236100223225ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Devices/OpenNI/VisualTest/CMakeLists.txt000066400000000000000000000021371277777236100250650ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. include_directories( "${GLUT_INCLUDE_DIR}" ) set(EXAMPLE_SOURCES main.cpp ) set(EXAMPLE_HEADERS ) surgsim_add_executable(OpenNIVisualTest "${EXAMPLE_SOURCES}" "${EXAMPLE_HEADERS}" ) set(LIBS OpenNIDevice SurgSimDataStructures SurgSimFramework SurgSimInput SurgSimMath VisualTestCommon ${Boost_LIBRARIES} ${GLUT_LIBRARIES} ${OPENGL_LIBRARIES} ) target_link_libraries(OpenNIVisualTest ${LIBS}) set_target_properties(OpenNIVisualTest PROPERTIES FOLDER "Devices") opensurgsim-0.7.0/SurgSim/Devices/OpenNI/VisualTest/main.cpp000066400000000000000000000071521277777236100237570ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include #include #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/DataStructures/Image.h" #include "SurgSim/Devices/OpenNI/OpenNIDevice.h" #include "SurgSim/Framework/LockedContainer.h" #include "SurgSim/Input/DeviceInterface.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Testing/VisualTestCommon/GlutRenderer.h" using SurgSim::Devices::OpenNIDevice; using SurgSim::Input::DeviceInterface; using SurgSim::Math::Vector3d; class ImageGlutWindow : public SurgSim::Input::InputConsumerInterface { public: explicit ImageGlutWindow(const std::vector& imageNames) { const size_t numImages = imageNames.size(); const SurgSim::Math::Vector2d yRange(-1.0, 1.0); SurgSim::Math::Vector2d xRange; for (size_t i = 0; i < numImages; i++) { xRange = SurgSim::Math::Vector2d(i - numImages, i - numImages + 1) / numImages; auto view = std::make_shared(Eigen::AlignedBox(xRange, yRange)); GlutRenderer::addObject(view); m_views.insert(std::make_pair(imageNames[i], view)); } m_renderThread = boost::thread(boost::ref(GlutRenderer::run)); } ~ImageGlutWindow() { if (m_renderThread.joinable()) { m_renderThread.join(); } } void initializeInput(const std::string& device, const SurgSim::DataStructures::DataGroup& inputData) override { for (auto view : m_views) { SURGSIM_ASSERT(inputData.images().hasEntry(view.first)) << "No image named '" << view.first << "' provided by the device: " << device; } } void handleInput(const std::string& device, const SurgSim::DataStructures::DataGroup& inputData) override { SurgSim::DataStructures::DataGroup::ImageType data; for (auto view : m_views) { if(inputData.images().get(view.first, &data)) { view.second->image.set(std::move(data)); } } } private: boost::thread m_renderThread; std::unordered_map> m_views; }; int main(int argc, char** argv) { std::shared_ptr device = std::make_shared("OpenNIDevice"); if (!device->initialize()) { std::cout << std::endl << "Could not initialize device: " << device->getName() << std::endl << "--- Press Enter to quit the application! ---" << std::endl; getc(stdin); return 1; } std::vector imagesToDraw; imagesToDraw.push_back("color"); imagesToDraw.push_back("depth"); std::shared_ptr imageWindow = std::make_shared(imagesToDraw); device->addInputConsumer(imageWindow); std::cout << std::endl << "**********************************************************************" << std::endl << "OpenNI Visual Test" << std::endl << std::endl << "When done, press Enter to quit the application." << std::endl << "**********************************************************************" << std::endl; getc(stdin); std::cout << "Exiting..." << std::endl; device->removeInputConsumer(imageWindow); device.reset(); exit(0); } opensurgsim-0.7.0/SurgSim/Devices/Phantom/000077500000000000000000000000001277777236100204755ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Devices/Phantom/CMakeLists.txt000066400000000000000000000031121277777236100232320ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. find_package(OpenHaptics REQUIRED) link_directories(${Boost_LIBRARY_DIRS}) set(LIBS ${Boost_LIBRARIES} ${OPENHAPTICS_LIBRARIES} SurgSimFramework SurgSimInput ) include_directories( "${CMAKE_CURRENT_SOURCE_DIR}" "${OPENHAPTICS_INCLUDE_DIR}" ) set(PHANTOM_DEVICE_SOURCES PhantomDevice.cpp PhantomScaffold.cpp ) set(PHANTOM_DEVICE_HEADERS PhantomDevice.h PhantomScaffold.h ) set(DEVICE_HEADERS ${DEVICE_HEADERS} Phantom/PhantomDevice.h PARENT_SCOPE) # TODO(advornik): the installation should NOT copy all the headers... surgsim_add_library( PhantomDevice "${PHANTOM_DEVICE_SOURCES}" "${PHANTOM_DEVICE_HEADERS}" ) target_link_libraries(PhantomDevice ${LIBS}) if(BUILD_TESTING) # The unit tests will be built whenever the library is built. add_subdirectory(UnitTests) if(GLUT_FOUND) add_subdirectory(VisualTest) endif(GLUT_FOUND) endif() # Put PhantomDevice into folder "Devices" set_target_properties(PhantomDevice PROPERTIES FOLDER "Devices") opensurgsim-0.7.0/SurgSim/Devices/Phantom/Phantom.dox000066400000000000000000000014351277777236100226220ustar00rootroot00000000000000/*! \page Phantom Phantom: Haptic Devices The Geomagic haptic devices measure 6DOF positions and orientations, and can exert forces on the user's hand (some models exert 3DOF forces, others 6DOF). Supported models: Geomagic Touch is tested. Any model/configuration allowed by the OpenHaptics library (for Linux http://www.geomagic.com/en/products/open-haptics/specifications-2/specifications-2-21/ ) is expected to work. Dependencies: - Device drivers - OpenHaptics http://www.geomagic.com/en/products/open-haptics/overview/ - An environment variable named 3DTOUCH_BASE or OH_SDK_BASE must be set to the directory containing (include\\)HD\hd.h - The location of the hd.lib file must be added to your path, e.g., C:\\Program Files (x86)\\SensAble\\3DTouch\\lib\\win32 */opensurgsim-0.7.0/SurgSim/Devices/Phantom/PhantomDevice.cpp000066400000000000000000000041721277777236100237330ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Devices/Phantom/PhantomDevice.h" #include "SurgSim/Devices/Phantom/PhantomScaffold.h" #include "SurgSim/Framework/Log.h" namespace SurgSim { namespace Devices { SURGSIM_REGISTER(SurgSim::Input::DeviceInterface, SurgSim::Devices::PhantomDevice, PhantomDevice); PhantomDevice::PhantomDevice(const std::string& uniqueName) : SurgSim::Input::CommonDevice(uniqueName, PhantomScaffold::buildDeviceInputData()) { SURGSIM_ADD_SERIALIZABLE_PROPERTY(PhantomDevice, std::string, InitializationName, getInitializationName, setInitializationName); } PhantomDevice::~PhantomDevice() { if (isInitialized()) { finalize(); } } void PhantomDevice::setInitializationName(const std::string& initializationName) { m_initializationName = initializationName; } std::string PhantomDevice::getInitializationName() const { return m_initializationName; } bool PhantomDevice::initialize() { SURGSIM_ASSERT(! isInitialized()); auto scaffold = PhantomScaffold::getOrCreateSharedInstance(); SURGSIM_ASSERT(scaffold); bool initialize = false; if (scaffold->registerDevice(this)) { m_scaffold = std::move(scaffold); initialize = true; } return initialize; } bool PhantomDevice::finalize() { SURGSIM_ASSERT(isInitialized()) << getName() << " is not initialized, cannot finalize."; bool ok = m_scaffold->unregisterDevice(this); m_scaffold.reset(); return ok; } bool PhantomDevice::isInitialized() const { return (m_scaffold != nullptr); } }; // namespace Devices }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Devices/Phantom/PhantomDevice.h000066400000000000000000000102731277777236100233770ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DEVICES_PHANTOM_PHANTOMDEVICE_H #define SURGSIM_DEVICES_PHANTOM_PHANTOMDEVICE_H #include #include #include "SurgSim/Input/CommonDevice.h" namespace SurgSim { namespace Devices { class PhantomScaffold; SURGSIM_STATIC_REGISTRATION(PhantomDevice); /// A class implementing the communication with a SensAble/Geomagic PHANTOM device. /// /// This should support any device that can communicate using the OpenHaptics 3.x toolkit, such as the /// PHANTOM Omni (a.k.a. Geomagic Touch), PHANTOM Desktop (a.k.a. Geomagic Touch X), and the PHANTOM Premium /// series devices. /// /// \par Application input provided by the device: /// | type | name | | /// | ---- | ---- | --- | /// | pose | "pose" | %Device pose (units are meters). | /// | bool | "button1" | %State of the first device button. | /// | bool | "button2" | %State of the second device button if present. | /// | bool | "button3" | %State of the third device button (probably doesn't exist). | /// | bool | "button4" | %State of the third device button (probably doesn't exist). | /// Note that \c button1 through \c 4 correspond to the \c HD_DEVICE_BUTTON_1 through \c 4 provided by the /// OpenHaptics API, but your PHANTOM device likely has fewer than 4 buttons. On one-button PHANTOM devices, /// the button state can be accessed through \c button1. On a PHANTOM Omni or a Geomagic Touch, \c button1 /// corresponds to the front (blue) stylus button, and \c button2 to the rear (white/gray) stylus button. /// /// \par Application output used by the device: /// | type | name | | /// | ---- | ---- | --- | /// | vector | "force" | %Device output force (units are newtons). | /// | vector | "torque" | %Device output torque (units are Nm). | /// /// \sa SurgSim::Input::CommonDevice, SurgSim::Input::DeviceInterface class PhantomDevice : public SurgSim::Input::CommonDevice { public: /// Constructor. /// /// \param uniqueName A unique name for the device that will be used by the application. explicit PhantomDevice(const std::string& uniqueName); SURGSIM_CLASSNAME(SurgSim::Devices::PhantomDevice); /// Destructor. virtual ~PhantomDevice(); /// Sets the name used to register this device with the hardware library. /// \param initializationName The name passed to HDAPI when initializing the device. This should match a /// configured PHANTOM device; alternately, an empty string indicates the default device. void setInitializationName(const std::string& initializationName); /// Gets the name used by the Phantom device configuration to refer to this device. /// Note that this may or may not be the same as the device name retrieved by getName(). /// An empty string indicates the default device. /// \return The initialization name. std::string getInitializationName() const; bool initialize() override; bool isInitialized() const override; private: friend class PhantomScaffold; bool finalize() override; std::shared_ptr m_scaffold; std::string m_initializationName; }; }; // namespace Devices }; // namespace SurgSim #endif // SURGSIM_DEVICES_PHANTOM_PHANTOMDEVICE_H opensurgsim-0.7.0/SurgSim/Devices/Phantom/PhantomScaffold.cpp000066400000000000000000000516331277777236100242610ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Devices/Phantom/PhantomScaffold.h" #include #include #include #include #include #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/DataStructures/DataGroupBuilder.h" #include "SurgSim/Devices/Phantom/PhantomDevice.h" #include "SurgSim/Framework/Assert.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Framework/SharedInstance.h" #include "SurgSim/Math/Matrix.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Vector.h" using SurgSim::DataStructures::DataGroup; using SurgSim::DataStructures::DataGroupBuilder; using SurgSim::Math::Matrix33d; using SurgSim::Math::Matrix44d; using SurgSim::Math::RigidTransform3d; using SurgSim::Math::Vector3d; namespace { /// Check for OpenHaptics HDAPI errors, display them, and signal fatal errors. /// \param message An additional descriptive message. /// \return true if there was a fatal error; false if everything is OK. bool checkForFatalError(const char* message) { HDErrorInfo error = hdGetError(); if (error.errorCode == HD_SUCCESS) { return false; } // The HD API maintains an error stack, so in theory there could be more than one error pending. // We do head recursion to get them all in the correct order, and hope we don't overrun the stack... bool anotherFatalError = checkForFatalError(message); bool isFatal = ((error.errorCode != HD_WARM_MOTORS) && (error.errorCode != HD_EXCEEDED_MAX_FORCE) && (error.errorCode != HD_EXCEEDED_MAX_FORCE_IMPULSE) && (error.errorCode != HD_EXCEEDED_MAX_VELOCITY) && (error.errorCode != HD_FORCE_ERROR)); SURGSIM_LOG_SEVERE(SurgSim::Framework::Logger::getLogger("Devices/Phantom")) << "Phantom: " << message << std::endl << " Error text: '" << hdGetErrorString(error.errorCode) << "'" << std::endl << " Error code: 0x" << std::hex << std::setw(4) << std::setfill('0') << error.errorCode << " (internal: " << std::dec << error.internalErrorCode << ")" << std::endl; return (isFatal || anotherFatalError); } } namespace SurgSim { namespace Devices { class PhantomScaffold::Handle { public: Handle() : m_deviceHandle(HD_INVALID_HANDLE), m_logger(Framework::Logger::getLogger("Devices/Phantom")) { } Handle(const std::string& deviceName, const std::string& initializationName) : m_deviceHandle(HD_INVALID_HANDLE), m_logger(Framework::Logger::getLogger("Devices/Phantom")) { create(deviceName, initializationName); } ~Handle() { SURGSIM_ASSERT(!isValid()) << "Expected destroy() to be called before Handle object destruction."; } bool isValid() const { return (m_deviceHandle != HD_INVALID_HANDLE); } bool create(const std::string& deviceName, const std::string& initializationName) { SURGSIM_ASSERT(!isValid()); HHD deviceHandle = HD_INVALID_HANDLE; if (initializationName.length() > 0) { deviceHandle = hdInitDevice(initializationName.c_str()); } else { deviceHandle = hdInitDevice(HD_DEFAULT_DEVICE); } if (checkForFatalError("Failed to initialize")) { // HDAPI error message already logged SURGSIM_LOG_INFO(m_logger) << std::endl << " Device name: '" << deviceName << "'" << std::endl << " OpenHaptics device name: '" << initializationName << "'" << std::endl; return false; } else if (deviceHandle == HD_INVALID_HANDLE) { SURGSIM_LOG_SEVERE(m_logger) << "Failed to initialize '" << deviceName << "'" << std::endl << " Error details: unknown (HDAPI returned an invalid handle)" << std::endl << " OpenHaptics device name: '" << initializationName << "'" << std::endl; return false; } m_deviceHandle = deviceHandle; return true; } bool destroy() { SURGSIM_ASSERT(isValid()); HHD deviceHandle = m_deviceHandle; if (deviceHandle == HD_INVALID_HANDLE) { return false; } m_deviceHandle = HD_INVALID_HANDLE; hdDisableDevice(deviceHandle); checkForFatalError("Couldn't disable device"); return true; } HHD get() const { SURGSIM_ASSERT(isValid()); return m_deviceHandle; } private: // Prevent copy construction and copy assignment. (VS2012 does not support "= delete" yet.) Handle(const Handle&) /*= delete*/; Handle& operator=(const Handle&) /*= delete*/; /// The OpenHaptics device handle (or HD_INVALID_HANDLE if not valid). HHD m_deviceHandle; /// The logger. std::shared_ptr m_logger; }; class PhantomScaffold::Callback { public: Callback() : m_callbackHandle(0), m_haveCallback(false), m_scaffold(PhantomScaffold::getOrCreateSharedInstance()) { create(); } ~Callback() { if (m_haveCallback) { destroy(); } } bool isValid() const { return m_haveCallback; } bool create() { SURGSIM_ASSERT(! m_haveCallback); m_callbackHandle = hdScheduleAsynchronous(run, m_scaffold.get(), HD_DEFAULT_SCHEDULER_PRIORITY); if (checkForFatalError("Couldn't run haptic callback")) { return false; } m_haveCallback = true; return true; } bool destroy() { SURGSIM_ASSERT(m_haveCallback); hdUnschedule(m_callbackHandle); if (checkForFatalError("Couldn't stop haptic callback")) { return false; } m_haveCallback = false; return true; } private: // Prevent copy construction and copy assignment. (VS2012 does not support "= delete" yet.) Callback(const Callback&) /*= delete*/; Callback& operator=(const Callback&) /*= delete*/; /// The callback wrapper passed to OpenHaptics. /// \param [in,out] data The user data (in our case, the scaffold pointer). /// \return HD_CALLBACK_CONTINUE to wait for the next frame, or HD_CALLBACK_DONE to terminate further calls. static HDCallbackCode HDCALLBACK run(void* data); /// The haptic loop callback handle. HDSchedulerHandle m_callbackHandle; /// True if the callback has been created (and not destroyed). bool m_haveCallback; /// The scaffold. std::shared_ptr m_scaffold; }; struct PhantomScaffold::DeviceData { /// Initialize the state. DeviceData(const std::string& apiName, PhantomDevice* device) : initializationName(apiName), deviceObject(device), position(Vector3d::Zero()), linearVelocity(Vector3d::Zero()), scaledPose(RigidTransform3d::Identity()), force(Vector3d::Zero()), torque(Vector3d::Zero()), buttonsBuffer(0) { } /// The OpenHaptics device name. const std::string initializationName; /// The corresponding device object. PhantomDevice* const deviceObject; /// The device handle wrapper. PhantomScaffold::Handle deviceHandle; /// The raw button state read from the device. int buttonsBuffer; /// The position value from the device. Vector3d position; /// The linear velocity value from the device. Vector3d linearVelocity; /// The pose value from the device, after scaling. RigidTransform3d scaledPose; /// The force value to be written to the device, in Newtons. Vector3d force; /// The torque value to be written to the device, in milliNewton-meters. Vector3d torque; private: // Prevent copy construction and copy assignment. (VS2012 does not support "= delete" yet.) DeviceData(const DeviceData&) /*= delete*/; DeviceData& operator=(const DeviceData&) /*= delete*/; }; struct PhantomScaffold::StateData { public: /// Initialize the state. StateData() { } /// Wrapper for the haptic loop callback handle. std::unique_ptr callback; /// The list of known devices. std::list> activeDeviceList; /// The mutex that protects the list of known devices. boost::mutex mutex; private: // Prevent copy construction and copy assignment. (VS2012 does not support "= delete" yet.) StateData(const StateData&) /*= delete*/; StateData& operator=(const StateData&) /*= delete*/; }; HDCallbackCode HDCALLBACK PhantomScaffold::Callback::run(void* data) { PhantomScaffold* scaffold = static_cast(data); if (! scaffold->runHapticFrame()) { //...do something?... } // Should return HD_CALLBACK_CONTINUE to wait for the next frame, or HD_CALLBACK_DONE to terminate the calls. return HD_CALLBACK_CONTINUE; } PhantomScaffold::PhantomScaffold() : m_logger(Framework::Logger::getLogger("Devices/Phantom")), m_state(new StateData) { { // Drain the HDAPI error stack HDErrorInfo error = hdGetError(); while (error.errorCode != HD_SUCCESS) { error = hdGetError(); } } SURGSIM_LOG_DEBUG(m_logger) << "Shared scaffold created."; } PhantomScaffold::~PhantomScaffold() { if (m_state->callback) { destroyHapticLoop(); } // The following block controls the duration of the mutex being locked. { boost::lock_guard lock(m_state->mutex); if (! m_state->activeDeviceList.empty()) { SURGSIM_LOG_SEVERE(m_logger) << "Phantom: Destroying scaffold while devices are active!?!"; // do anything special with each device? m_state->activeDeviceList.clear(); } } SURGSIM_LOG_DEBUG(m_logger) << "Shared scaffold destroyed."; } bool PhantomScaffold::registerDevice(PhantomDevice* device) { boost::lock_guard lock(m_state->mutex); // Make sure the object is unique. auto sameObject = std::find_if(m_state->activeDeviceList.cbegin(), m_state->activeDeviceList.cend(), [device](const std::unique_ptr& info) { return info->deviceObject == device; }); SURGSIM_ASSERT(sameObject == m_state->activeDeviceList.end()) << "Phantom: Tried to register a device" << " which is already present!"; // Make sure the name is unique. const std::string deviceName = device->getName(); auto sameName = std::find_if(m_state->activeDeviceList.cbegin(), m_state->activeDeviceList.cend(), [&deviceName](const std::unique_ptr& info) { return info->deviceObject->getName() == deviceName; }); if (sameName != m_state->activeDeviceList.end()) { SURGSIM_LOG_CRITICAL(m_logger) << "Phantom: Tried to register a device when the same name is" << " already present!"; return false; } // Make sure the initialization name is unique. const std::string initializationName = device->getInitializationName(); auto sameInitializationName = std::find_if(m_state->activeDeviceList.cbegin(), m_state->activeDeviceList.cend(), [&deviceName](const std::unique_ptr& info) { return info->deviceObject->getInitializationName() == deviceName; }); if (sameInitializationName != m_state->activeDeviceList.end()) { SURGSIM_LOG_CRITICAL(m_logger) << "Phantom: Tried to register a device when the same initialization" << " (OpenHaptics) name is already present!"; return false; } // Construct the object, start its thread, then move it to the list. // Note that since Visual Studio 2010 doesn't support multi-argument emplace_back() for STL containers, storing a // list of unique_ptr results in nicer code than storing a list of DeviceData values directly. std::unique_ptr info(new DeviceData(initializationName, device)); if (! initializeDeviceState(info.get())) { return false; // message already printed } m_state->activeDeviceList.emplace_back(std::move(info)); SURGSIM_LOG_INFO(m_logger) << "Device " << device->getName() << " initialized."; if (m_state->activeDeviceList.size() == 1) { // If this is the first device, create the haptic loop as well. // The haptic loop should be created AFTER initializing the device, or OpenHaptics will complain. createHapticLoop(); } return true; } bool PhantomScaffold::unregisterDevice(const PhantomDevice* const device) { std::unique_ptr savedInfo; bool haveOtherDevices = false; { boost::lock_guard lock(m_state->mutex); auto matching = std::find_if(m_state->activeDeviceList.begin(), m_state->activeDeviceList.end(), [device](const std::unique_ptr& info) { return info->deviceObject == device; }); if (matching != m_state->activeDeviceList.end()) { savedInfo = std::move(*matching); m_state->activeDeviceList.erase(matching); // the iterator is now invalid but that's OK SURGSIM_LOG_INFO(m_logger) << "Device " << device->getName() << " unregistered."; } haveOtherDevices = (m_state->activeDeviceList.size() > 0); } bool status = true; if (! savedInfo) { SURGSIM_LOG_WARNING(m_logger) << "Attempted to release a non-registered device " << device->getName(); status = false; } else { // If you attempt to destroy the device while the haptic callback is active, you see lots of nasty errors // under OpenHaptics 3.0. The solution seems to be to disable the haptic callback when destroying the device. destroyHapticLoop(); finalizeDeviceState(savedInfo.get()); savedInfo.reset(nullptr); if (haveOtherDevices) { // If there are other devices left, we need to recreate the haptic callback. // If there aren't, we don't need the callback... and moreover, trying to create it will fail. createHapticLoop(); } } return status; } bool PhantomScaffold::initializeDeviceState(DeviceData* info) { SURGSIM_ASSERT(! info->deviceHandle.isValid()); if (! info->deviceHandle.create(info->deviceObject->getName(), info->deviceObject->getInitializationName())) { return false; // message was already printed } // Enable forces. hdMakeCurrentDevice(info->deviceHandle.get()); hdEnable(HD_FORCE_OUTPUT); checkForFatalError("Couldn't enable forces"); return true; } bool PhantomScaffold::finalizeDeviceState(DeviceData* info) { bool status = false; if (info->deviceHandle.isValid()) { status = info->deviceHandle.destroy(); } return status; } bool PhantomScaffold::updateDevice(PhantomScaffold::DeviceData* info) { //boost::lock_guard lock(info->parametersMutex); hdBeginFrame(info->deviceHandle.get()); // Receive the current device position (in millimeters!), pose transform, and button state bitmap. hdGetDoublev(HD_CURRENT_POSITION, info->position.data()); info->scaledPose.translation() = info->position * 0.001; // convert from millimeters to meters! hdGetDoublev(HD_CURRENT_VELOCITY, info->linearVelocity.data()); info->linearVelocity *= 0.001; //TODO(ryanbeasley): convert HD_CURRENT_ANGULAR_VELOCITY to a rotation vector and store in info->angularVelocity. Eigen::Matrix transform; hdGetDoublev(HD_CURRENT_TRANSFORM, transform.data()); info->scaledPose.linear() = transform.block<3,3>(0, 0); // store orientation in a RigidTransform3d hdGetIntegerv(HD_CURRENT_BUTTONS, &(info->buttonsBuffer)); calculateForceAndTorque(info); // Set the force command (in newtons). hdSetDoublev(HD_CURRENT_FORCE, info->force.data()); // Set the torque command. hdSetDoublev(HD_CURRENT_GIMBAL_TORQUE, info->torque.data()); hdEndFrame(info->deviceHandle.get()); setInputData(info); bool fatalError = checkForFatalError("Error in device update"); return !fatalError; } void PhantomScaffold::calculateForceAndTorque(PhantomScaffold::DeviceData* info) { typedef Eigen::Matrix Vector6d; const SurgSim::DataStructures::DataGroup& outputData = info->deviceObject->getOutputData(); // Get the nominal force and torque, if provided. Vector3d nominalForce = Vector3d::Zero(); outputData.vectors().get(SurgSim::DataStructures::Names::FORCE, &nominalForce); Vector3d nominalTorque = Vector3d::Zero(); Vector6d nominalForceAndTorque = Vector6d::Zero(); SurgSim::Math::setSubVector(nominalForce, 0, 3, &nominalForceAndTorque); // If the springJacobian was provided, multiply with the change in position since the output data was set, // to get a delta force & torque. This way a linearized output force & torque is calculated at haptic update rates. Vector6d forceAndTorqueFromDeltaPosition = Vector6d::Zero(); SurgSim::DataStructures::DataGroup::DynamicMatrixType springJacobian; if (outputData.matrices().get(SurgSim::DataStructures::Names::SPRING_JACOBIAN, &springJacobian)) { RigidTransform3d poseForNominal = info->scaledPose; outputData.poses().get(SurgSim::DataStructures::Names::INPUT_POSE, &poseForNominal); Vector3d rotationVector = Vector3d::Zero(); SurgSim::Math::computeRotationVector(info->scaledPose, poseForNominal, &rotationVector); Vector6d deltaPosition; SurgSim::Math::setSubVector(info->scaledPose.translation() - poseForNominal.translation(), 0, 3, &deltaPosition); SurgSim::Math::setSubVector(rotationVector, 1, 3, &deltaPosition); forceAndTorqueFromDeltaPosition = springJacobian * deltaPosition; } // If the damperJacobian was provided, calculate a delta force & torque based on the change in velocity. Vector6d forceAndTorqueFromDeltaVelocity = Vector6d::Zero(); SurgSim::DataStructures::DataGroup::DynamicMatrixType damperJacobian; if (outputData.matrices().get(SurgSim::DataStructures::Names::DAMPER_JACOBIAN, &damperJacobian)) { Vector3d angularVelocity = Vector3d::Zero(); Vector3d linearVelocityForNominal = info->linearVelocity; outputData.vectors().get(SurgSim::DataStructures::Names::INPUT_LINEAR_VELOCITY, &linearVelocityForNominal); Vector3d angularVelocityForNominal = angularVelocity; outputData.vectors().get(SurgSim::DataStructures::Names::INPUT_ANGULAR_VELOCITY, &angularVelocityForNominal); Vector6d deltaVelocity; SurgSim::Math::setSubVector(info->linearVelocity - linearVelocityForNominal, 0, 3, &deltaVelocity); SurgSim::Math::setSubVector(angularVelocity - angularVelocityForNominal, 1, 3, &deltaVelocity); forceAndTorqueFromDeltaVelocity = damperJacobian * deltaVelocity; } Vector6d forceAndTorque = nominalForceAndTorque + forceAndTorqueFromDeltaPosition + forceAndTorqueFromDeltaVelocity; info->force = SurgSim::Math::getSubVector(forceAndTorque, 0, 3); // convert the torque from Newton-meters to milliNewton-meters as expected by the hardware library. info->torque = SurgSim::Math::getSubVector(forceAndTorque, 1, 3) * 1000.0; } void PhantomScaffold::setInputData(DeviceData* info) { // TODO(bert): this code should cache the access indices. SurgSim::DataStructures::DataGroup& inputData = info->deviceObject->getInputData(); inputData.poses().set(SurgSim::DataStructures::Names::POSE, info->scaledPose); inputData.vectors().set(SurgSim::DataStructures::Names::LINEAR_VELOCITY, info->linearVelocity); inputData.booleans().set(SurgSim::DataStructures::Names::BUTTON_1, (info->buttonsBuffer & HD_DEVICE_BUTTON_1) != 0); inputData.booleans().set(SurgSim::DataStructures::Names::BUTTON_2, (info->buttonsBuffer & HD_DEVICE_BUTTON_2) != 0); inputData.booleans().set(SurgSim::DataStructures::Names::BUTTON_3, (info->buttonsBuffer & HD_DEVICE_BUTTON_3) != 0); inputData.booleans().set(SurgSim::DataStructures::Names::BUTTON_4, (info->buttonsBuffer & HD_DEVICE_BUTTON_4) != 0); } bool PhantomScaffold::runHapticFrame() { boost::lock_guard lock(m_state->mutex); for (auto it = m_state->activeDeviceList.begin(); it != m_state->activeDeviceList.end(); ++it) { (*it)->deviceObject->pullOutput(); if (updateDevice((*it).get())) { (*it)->deviceObject->pushInput(); } } return true; } bool PhantomScaffold::createHapticLoop() { SURGSIM_ASSERT(! m_state->callback); if (! startScheduler()) { return false; } std::unique_ptr callback(new Callback); if (! callback->isValid()) { stopScheduler(); return false; } m_state->callback = std::move(callback); return true; } bool PhantomScaffold::destroyHapticLoop() { SURGSIM_ASSERT(m_state->callback); checkForFatalError("Error prior to stopping haptic callback"); // NOT considered an error for return code! bool didDestroy = m_state->callback->destroy(); m_state->callback.reset(nullptr); bool didStop = stopScheduler(); return didDestroy && didStop; } bool PhantomScaffold::startScheduler() { hdStartScheduler(); if (checkForFatalError("Couldn't start the scheduler")) { return false; } return true; } bool PhantomScaffold::stopScheduler() { hdStopScheduler(); if (checkForFatalError("Couldn't stop the scheduler")) { return false; } return true; } SurgSim::DataStructures::DataGroup PhantomScaffold::buildDeviceInputData() { DataGroupBuilder builder; builder.addPose(SurgSim::DataStructures::Names::POSE); builder.addVector(SurgSim::DataStructures::Names::LINEAR_VELOCITY); builder.addBoolean(SurgSim::DataStructures::Names::BUTTON_1); builder.addBoolean(SurgSim::DataStructures::Names::BUTTON_2); builder.addBoolean(SurgSim::DataStructures::Names::BUTTON_3); builder.addBoolean(SurgSim::DataStructures::Names::BUTTON_4); return builder.createData(); } std::shared_ptr PhantomScaffold::getOrCreateSharedInstance() { static SurgSim::Framework::SharedInstance sharedInstance; return sharedInstance.get(); } }; // namespace Devices }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Devices/Phantom/PhantomScaffold.h000066400000000000000000000122331277777236100237170ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DEVICES_PHANTOM_PHANTOMSCAFFOLD_H #define SURGSIM_DEVICES_PHANTOM_PHANTOMSCAFFOLD_H #include #include "SurgSim/Framework/Logger.h" #include "SurgSim/DataStructures/DataGroup.h" namespace SurgSim { namespace Devices { class PhantomDevice; /// A class that manages Sensable PHANTOM devices. /// /// This should support any PHANTOM device that can communicate using OpenHaptics 3.0 toolkit, such as PHANTOM /// Omni, PHANTOM Desktop, and the PHANTOM Premium series devices. The implementation is currently limited to /// 3DoF haptic output (forces only, no torques). /// /// \sa SurgSim::Devices::PhantomDevice class PhantomScaffold { public: /// Constructor. PhantomScaffold(); /// Destructor. ~PhantomScaffold(); /// Gets or creates the scaffold shared by all PhantomDevice instances. /// The scaffold is managed using a SharedInstance object, so it will be destroyed when all devices are released. /// \return the scaffold object. static std::shared_ptr getOrCreateSharedInstance(); private: /// Internal shared state data type. struct StateData; /// Interal per-device information. struct DeviceData; /// Wrapper for the haptic loop callback. class Callback; /// Wrapper for the OpenHaptics device handle. class Handle; friend class PhantomDevice; /// Registers the specified device object. /// If successful, the device object will become connected to an unused controller. /// /// \param device The device object to be used, which should have a unique name. /// \return True if the initialization succeeds, false if it fails. bool registerDevice(PhantomDevice* device); /// Unregisters the specified device object. /// The corresponding controller will become unused, and can be re-registered later. /// /// \param device The device object. /// \return true on success, false on failure. bool unregisterDevice(const PhantomDevice* device); /// Initializes a single device, creating the necessary HDAPI resources. /// \param [in,out] info The device data. /// \return true on success. bool initializeDeviceState(DeviceData* info); /// Finalizes a single device, destroying the necessary HDAPI resources. /// \param [in,out] info The device data. /// \return true on success. bool finalizeDeviceState(DeviceData* info); /// Updates the device information for a single device. /// \param info The device data. /// \return true on success. bool updateDevice(DeviceData* info); /// Calculates forces and torques and sends them to the device library. The force to output is /// composed of a vector named "force" in the output data, plus contributions from two optional Jacobians. /// If the matrix "springJacobian" is provided in the output data, a spring force & torque are generated from /// its product with the difference between the current pose and the pose in the output data named "inputPose". /// A damping force & torque are generated similarly. The intention is for a Behavior to calculate a nominal /// force & torque as well as the desired linearized changes to the force & torque based on changes to the input's /// pose & velocities. Then the linearized deltas to the output force & torque can be calculated at the haptic /// update rates, thereby smoothing the output response to motion. /// \param info The device data. void calculateForceAndTorque(DeviceData* info); /// Sets the input DataGroup, which will be pushed to the InputComponent /// \param info The device data void setInputData(DeviceData* info); /// Executes the operations for a single haptic frame. /// Should only be called from the context of an OpenHaptics callback. /// \return true on success. bool runHapticFrame(); /// Creates the haptic loop callback. /// \return true on success. bool createHapticLoop(); /// Destroys the haptic loop callback. /// Should be called while NOT holding the internal device list mutex, to prevent deadlock. /// \return true on success. bool destroyHapticLoop(); /// Starts the OpenHaptics scheduler. /// \return true on success. bool startScheduler(); /// Stops the OpenHaptics scheduler. /// \return true on success. bool stopScheduler(); /// Builds the data layout for the application input (i.e. device output). static SurgSim::DataStructures::DataGroup buildDeviceInputData(); /// Logger used by the scaffold and all devices. std::shared_ptr m_logger; /// Internal scaffold state. std::unique_ptr m_state; }; }; // namespace Devices }; // namespace SurgSim #endif // SURGSIM_DEVICES_PHANTOM_PHANTOMSCAFFOLD_H opensurgsim-0.7.0/SurgSim/Devices/Phantom/UnitTests/000077500000000000000000000000001277777236100224375ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Devices/Phantom/UnitTests/CMakeLists.txt000066400000000000000000000017631277777236100252060ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2012-2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. include_directories( ${gtest_SOURCE_DIR}/include ) set(UNIT_TEST_SOURCES PhantomDeviceTest.cpp PhantomScaffoldTest.cpp ) set(LIBS PhantomDevice SurgSimInput SurgSimFramework SurgSimDataStructures ${Boost_LIBRARIES} ${OPENHAPTICS_LIBRARIES} ) surgsim_add_unit_tests(PhantomDeviceTest) set_target_properties(PhantomDeviceTest PROPERTIES FOLDER "Devices") opensurgsim-0.7.0/SurgSim/Devices/Phantom/UnitTests/PhantomDeviceTest.cpp000066400000000000000000000226371277777236100265430ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the PhantomDevice class. #include #include #include #include #include #include "SurgSim/Devices/Phantom/PhantomDevice.h" #include "SurgSim/Devices/Phantom/PhantomScaffold.h" // only needed if calling setDefaultLogLevel() #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Matrix.h" #include "SurgSim/Testing/MockInputOutput.h" using SurgSim::Devices::PhantomDevice; using SurgSim::Devices::PhantomScaffold; using SurgSim::DataStructures::DataGroup; using SurgSim::Math::RigidTransform3d; using SurgSim::Math::Matrix44d; using SurgSim::Testing::MockInputOutput; TEST(PhantomDeviceTest, CreateUninitializedDevice) { //PhantomScaffold::setDefaultLogLevel(SurgSim::Framework::LOG_LEVEL_DEBUG); std::shared_ptr device = std::make_shared("TestPhantom"); ASSERT_TRUE(device != nullptr) << "Device creation failed."; } TEST(PhantomDeviceTest, CreateAndInitializeDevice) { //PhantomScaffold::setDefaultLogLevel(SurgSim::Framework::LOG_LEVEL_DEBUG); std::shared_ptr device = std::make_shared("TestPhantom"); device->setInitializationName("Default PHANToM"); ASSERT_TRUE(device != nullptr) << "Device creation failed."; EXPECT_FALSE(device->isInitialized()); ASSERT_TRUE(device->initialize()) << "Initialization failed. Is a Phantom device plugged in?"; EXPECT_TRUE(device->isInitialized()); } TEST(PhantomDeviceTest, CreateAndInitializeDefaultDevice) { //PhantomScaffold::setDefaultLogLevel(SurgSim::Framework::LOG_LEVEL_DEBUG); std::shared_ptr device = std::make_shared("TestPhantom"); ASSERT_TRUE(device != nullptr) << "Device creation failed."; EXPECT_FALSE(device->isInitialized()); ASSERT_TRUE(device->initialize()) << "Initialization failed. Is a Phantom device plugged in?"; EXPECT_TRUE(device->isInitialized()); } TEST(PhantomDeviceTest, Name) { //PhantomScaffold::setDefaultLogLevel(SurgSim::Framework::LOG_LEVEL_DEBUG); std::shared_ptr device = std::make_shared("TestPhantom"); device->setInitializationName("Default PHANToM"); ASSERT_TRUE(device != nullptr) << "Device creation failed."; EXPECT_EQ("TestPhantom", device->getName()); EXPECT_TRUE(device->initialize()) << "Initialization failed. Is a Phantom device plugged in?"; EXPECT_EQ("TestPhantom", device->getName()); } static void testCreateDeviceSeveralTimes(bool doSleep) { for (int i = 0; i < 6; ++i) { std::shared_ptr device = std::make_shared("TestPhantom"); device->setInitializationName("Default PHANToM"); ASSERT_TRUE(device != nullptr) << "Device creation failed."; ASSERT_TRUE(device->initialize()) << "Initialization failed. Is a Phantom device plugged in?"; if (doSleep) { boost::this_thread::sleep_until(boost::chrono::steady_clock::now() + boost::chrono::milliseconds(100)); } // the device will be destroyed here } } TEST(PhantomDeviceTest, CreateDeviceSeveralTimes) { //PhantomScaffold::setDefaultLogLevel(SurgSim::Framework::LOG_LEVEL_DEBUG); testCreateDeviceSeveralTimes(true); } TEST(PhantomDeviceTest, CreateSeveralDevices) { //PhantomScaffold::setDefaultLogLevel(SurgSim::Framework::LOG_LEVEL_DEBUG); std::shared_ptr device1 = std::make_shared("Phantom1"); device1->setInitializationName("Default PHANToM"); ASSERT_TRUE(device1 != nullptr) << "Device creation failed."; ASSERT_TRUE(device1->initialize()) << "Initialization failed. Is a Phantom device plugged in?"; // We can't check what happens with the scaffolds, since those are no longer a part of the device's API... std::shared_ptr device2 = std::make_shared("Phantom2"); device2->setInitializationName("Second PHANToM"); ASSERT_TRUE(device2 != nullptr) << "Device creation failed."; if (! device2->initialize()) { std::cerr << "[Warning: second Phantom did not come up; is it plugged in?]" << std::endl; } } TEST(PhantomDeviceTest, CreateDevicesWithSameName) { //PhantomScaffold::setDefaultLogLevel(SurgSim::Framework::LOG_LEVEL_DEBUG); std::shared_ptr device1 = std::make_shared("Phantom"); device1->setInitializationName("Default PHANToM"); ASSERT_TRUE(device1 != nullptr) << "Device creation failed."; ASSERT_TRUE(device1->initialize()) << "Initialization failed. Is a Phantom device plugged in?"; std::shared_ptr device2 = std::make_shared("Phantom"); device2->setInitializationName("Second PHANToM"); ASSERT_TRUE(device2 != nullptr) << "Device creation failed."; ASSERT_FALSE(device2->initialize()) << "Initialization succeeded despite duplicate name."; } TEST(PhantomDeviceTest, CreateDevicesWithSameInitializationName) { //PhantomScaffold::setDefaultLogLevel(SurgSim::Framework::LOG_LEVEL_DEBUG); std::shared_ptr device1 = std::make_shared("Phantom1"); device1->setInitializationName("Default PHANToM"); ASSERT_TRUE(device1 != nullptr) << "Device creation failed."; ASSERT_TRUE(device1->initialize()) << "Initialization failed. Is a Phantom device plugged in?"; std::shared_ptr device2 = std::make_shared("Phantom2"); device2->setInitializationName("Default PHANToM"); ASSERT_TRUE(device2 != nullptr) << "Device creation failed."; ASSERT_FALSE(device2->initialize()) << "Initialization succeeded despite duplicate initialization name."; } TEST(PhantomDeviceTest, InputConsumer) { //PhantomScaffold::setDefaultLogLevel(SurgSim::Framework::LOG_LEVEL_DEBUG); std::shared_ptr device = std::make_shared("TestPhantom"); device->setInitializationName("Default PHANToM"); ASSERT_TRUE(device != nullptr) << "Device creation failed."; EXPECT_TRUE(device->initialize()) << "Initialization failed. Is a Phantom device plugged in?"; std::shared_ptr consumer = std::make_shared(); EXPECT_EQ(0, consumer->m_numTimesReceivedInput); EXPECT_FALSE(device->removeInputConsumer(consumer)); EXPECT_EQ(0, consumer->m_numTimesReceivedInput); EXPECT_TRUE(device->addInputConsumer(consumer)); // Adding the same input consumer again should fail. EXPECT_FALSE(device->addInputConsumer(consumer)); // Sleep for a second, to see how many times the consumer is invoked. // (A Phantom device is supposed to run at 1KHz.) boost::this_thread::sleep_until(boost::chrono::steady_clock::now() + boost::chrono::milliseconds(1000)); EXPECT_TRUE(device->removeInputConsumer(consumer)); // Removing the same input consumer again should fail. EXPECT_FALSE(device->removeInputConsumer(consumer)); // Check the number of invocations. EXPECT_GE(consumer->m_numTimesReceivedInput, 700); EXPECT_LE(consumer->m_numTimesReceivedInput, 1300); EXPECT_TRUE(consumer->m_lastReceivedInput.poses().hasData(SurgSim::DataStructures::Names::POSE)); EXPECT_TRUE(consumer->m_lastReceivedInput.booleans().hasData(SurgSim::DataStructures::Names::BUTTON_1)); } TEST(PhantomDeviceTest, OutputProducer) { //PhantomScaffold::setDefaultLogLevel(SurgSim::Framework::LOG_LEVEL_DEBUG); std::shared_ptr device = std::make_shared("TestPhantom"); device->setInitializationName("Default PHANToM"); ASSERT_TRUE(device != nullptr) << "Device creation failed."; EXPECT_TRUE(device->initialize()) << "Initialization failed. Is a Phantom device plugged in?"; std::shared_ptr producer = std::make_shared(); EXPECT_EQ(0, producer->m_numTimesRequestedOutput); EXPECT_FALSE(device->removeOutputProducer(producer)); EXPECT_EQ(0, producer->m_numTimesRequestedOutput); EXPECT_TRUE(device->setOutputProducer(producer)); // Sleep for a second, to see how many times the producer is invoked. // (A Phantom device is supposed to run at 1KHz.) boost::this_thread::sleep_until(boost::chrono::steady_clock::now() + boost::chrono::milliseconds(1000)); EXPECT_TRUE(device->removeOutputProducer(producer)); // Removing the same input producer again should fail. EXPECT_FALSE(device->removeOutputProducer(producer)); // Check the number of invocations. EXPECT_GE(producer->m_numTimesRequestedOutput, 700); EXPECT_LE(producer->m_numTimesRequestedOutput, 1300); } TEST(PhantomDeviceTest, FactoryCreation) { std::shared_ptr device; ASSERT_NO_THROW(device = SurgSim::Input::DeviceInterface::getFactory().create("SurgSim::Devices::PhantomDevice", "TestPhantom")); EXPECT_EQ("SurgSim::Devices::PhantomDevice", device->getClassName()); } TEST(PhantomDeviceTest, AccessibleTest) { std::shared_ptr device = std::make_shared("TestFalcon"); std::string name = "initName"; EXPECT_NO_THROW(device->setValue("InitializationName", name)); EXPECT_EQ(name, device->getInitializationName()); } opensurgsim-0.7.0/SurgSim/Devices/Phantom/UnitTests/PhantomScaffoldTest.cpp000066400000000000000000000170101277777236100270520ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the PhantomScaffold class and its device interactions. #include #include #include #include #include #include "SurgSim/Devices/Phantom/PhantomDevice.h" #include "SurgSim/Devices/Phantom/PhantomScaffold.h" #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Matrix.h" using SurgSim::Devices::PhantomDevice; using SurgSim::Devices::PhantomScaffold; TEST(PhantomScaffoldTest, CreateAndDestroyScaffold) { //PhantomScaffold::setDefaultLogLevel(SurgSim::Framework::LOG_LEVEL_DEBUG); std::shared_ptr scaffold = PhantomScaffold::getOrCreateSharedInstance(); ASSERT_NE(nullptr, scaffold) << "The scaffold was not created!"; std::weak_ptr scaffold1 = scaffold; { std::shared_ptr stillHaveScaffold = scaffold1.lock(); EXPECT_NE(nullptr, stillHaveScaffold) << "Unable to get scaffold from weak ref (while strong ref exists)"; EXPECT_EQ(scaffold, stillHaveScaffold) << "Scaffold mismatch!"; } { std::shared_ptr sameScaffold = PhantomScaffold::getOrCreateSharedInstance(); EXPECT_NE(nullptr, sameScaffold) << "Unable to get scaffold from class"; EXPECT_EQ(scaffold, sameScaffold) << "Scaffold mismatch!"; } scaffold.reset(); { std::shared_ptr dontHaveScaffold = scaffold1.lock(); EXPECT_EQ(nullptr, dontHaveScaffold) << "Able to get scaffold from weak ref (with no strong ref)"; } scaffold = PhantomScaffold::getOrCreateSharedInstance(); ASSERT_NE(nullptr, scaffold) << "The scaffold was not created the 2nd time!"; std::weak_ptr scaffold2 = scaffold; { std::shared_ptr stillHaveScaffold = scaffold2.lock(); ASSERT_NE(nullptr, stillHaveScaffold) << "Unable to get scaffold from weak ref (while strong ref exists)"; ASSERT_EQ(scaffold, stillHaveScaffold) << "Scaffold mismatch!"; } } TEST(PhantomScaffoldTest, ScaffoldLifeCycle) { //PhantomScaffold::setDefaultLogLevel(SurgSim::Framework::LOG_LEVEL_DEBUG); std::weak_ptr lastScaffold; { std::shared_ptr scaffold = PhantomScaffold::getOrCreateSharedInstance(); ASSERT_NE(nullptr, scaffold) << "The scaffold was not created!"; lastScaffold = scaffold; } { std::shared_ptr dontHaveScaffold = lastScaffold.lock(); EXPECT_EQ(nullptr, dontHaveScaffold) << "Able to get scaffold from weak ref (with no strong ref)"; lastScaffold.reset(); } { std::shared_ptr device = std::make_shared("TestPhantom"); device->setInitializationName("Default PHANToM"); ASSERT_NE(nullptr, device) << "Creation failed. Is a Phantom device plugged in?"; // note: the device is NOT initialized! { std::shared_ptr scaffold = PhantomScaffold::getOrCreateSharedInstance(); EXPECT_NE(nullptr, scaffold) << "The scaffold was not retrieved!"; lastScaffold = scaffold; // save the scaffold for later std::shared_ptr sameScaffold = lastScaffold.lock(); EXPECT_NE(nullptr, sameScaffold); EXPECT_EQ(scaffold, sameScaffold); } // The device has not been initialized, so it should NOT be hanging on to the device! { std::shared_ptr deadScaffold = lastScaffold.lock(); EXPECT_EQ(nullptr, deadScaffold); } // the ("empty") device is about to get destroyed } { std::shared_ptr device = std::make_shared("TestPhantom"); device->setInitializationName("Default PHANToM"); ASSERT_NE(nullptr, device) << "Device creation failed."; ASSERT_TRUE(device->initialize()) << "Initialization failed. Is a Phantom device plugged in?"; { std::shared_ptr scaffold = PhantomScaffold::getOrCreateSharedInstance(); EXPECT_NE(nullptr, scaffold) << "The scaffold was not retrieved!"; lastScaffold = scaffold; // save the scaffold for later std::shared_ptr sameScaffold = lastScaffold.lock(); EXPECT_NE(nullptr, sameScaffold); EXPECT_EQ(scaffold, sameScaffold); } // The same scaffold is supposed to still be around because of the device { std::shared_ptr sameScaffold = lastScaffold.lock(); EXPECT_NE(nullptr, sameScaffold); std::shared_ptr scaffold = PhantomScaffold::getOrCreateSharedInstance(); EXPECT_NE(nullptr, scaffold) << "The scaffold was not retrieved!"; EXPECT_EQ(sameScaffold, scaffold); } // the device and the scaffold are about to get destroyed } { std::shared_ptr deadScaffold = lastScaffold.lock(); EXPECT_EQ(nullptr, deadScaffold); } { std::shared_ptr device = std::make_shared("TestPhantom"); device->setInitializationName("Default PHANToM"); ASSERT_NE(nullptr, device) << "Device creation failed."; ASSERT_TRUE(device->initialize()) << "Initialization failed. Didn't this work a moment ago?"; std::shared_ptr scaffold = PhantomScaffold::getOrCreateSharedInstance(); EXPECT_NE(nullptr, scaffold) << "The scaffold was not retrieved!"; std::shared_ptr deadScaffold = lastScaffold.lock(); EXPECT_EQ(nullptr, deadScaffold); } } TEST(PhantomScaffoldTest, CreateDeviceSeveralTimes) { //PhantomScaffold::setDefaultLogLevel(SurgSim::Framework::LOG_LEVEL_DEBUG); std::weak_ptr lastScaffold; for (int i = 0; i < 6; ++i) { SCOPED_TRACE(i); EXPECT_EQ(nullptr, lastScaffold.lock()); std::shared_ptr device = std::make_shared("TestPhantom"); device->setInitializationName("Default PHANToM"); ASSERT_NE(nullptr, device) << "Device creation failed."; ASSERT_TRUE(device->initialize()) << "Initialization failed. Is a Phantom device plugged in?"; std::shared_ptr scaffold = PhantomScaffold::getOrCreateSharedInstance(); ASSERT_NE(nullptr, scaffold) << "The scaffold was not retrieved!"; lastScaffold = scaffold; // the device and the scaffold will be destroyed here } } TEST(PhantomScaffoldTest, CreateDeviceSeveralTimesWithScaffoldRef) { //PhantomScaffold::setDefaultLogLevel(SurgSim::Framework::LOG_LEVEL_DEBUG); std::shared_ptr lastScaffold; for (int i = 0; i < 6; ++i) { SCOPED_TRACE(i); std::shared_ptr device = std::make_shared("TestPhantom"); device->setInitializationName("Default PHANToM"); ASSERT_NE(nullptr, device) << "Device creation failed."; ASSERT_TRUE(device->initialize()) << "Initialization failed. Is a Phantom device plugged in?"; std::shared_ptr scaffold = PhantomScaffold::getOrCreateSharedInstance(); ASSERT_NE(nullptr, scaffold) << "The scaffold was not retrieved!"; if (! lastScaffold) { lastScaffold = scaffold; } EXPECT_EQ(lastScaffold, scaffold); // the device will be destroyed here, but the scaffold stays around because we have a shared_ptr to it. } } opensurgsim-0.7.0/SurgSim/Devices/Phantom/VisualTest/000077500000000000000000000000001277777236100226005ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Devices/Phantom/VisualTest/CMakeLists.txt000066400000000000000000000020021277777236100253320ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. set(EXAMPLE_SOURCES main.cpp ) set(EXAMPLE_HEADERS ) surgsim_add_executable(PhantomVisualTest "${EXAMPLE_SOURCES}" "${EXAMPLE_HEADERS}") set(LIBS IdentityPoseDevice PhantomDevice SurgSimInput VisualTestCommon ) target_link_libraries(PhantomVisualTest ${LIBS}) # Put PhantomVisualTest into folder "Devices" set_target_properties(PhantomVisualTest PROPERTIES FOLDER "Devices") opensurgsim-0.7.0/SurgSim/Devices/Phantom/VisualTest/main.cpp000066400000000000000000000034211277777236100242300ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Input/DeviceInterface.h" #include "SurgSim/Devices/Phantom/PhantomDevice.h" #include "SurgSim/Devices/IdentityPoseDevice/IdentityPoseDevice.h" #include "SurgSim/Testing/VisualTestCommon/ToolSquareTest.h" using SurgSim::Input::DeviceInterface; using SurgSim::Devices::PhantomDevice; using SurgSim::Devices::IdentityPoseDevice; int main(int argc, char** argv) { std::shared_ptr toolDevice = std::make_shared("PhantomDevice"); toolDevice->setInitializationName("Default PHANToM"); // The square is controlled by a second device. For a simple test, we're using an IdentityPoseDevice-- // a pretend device that doesn't actually move. std::shared_ptr squareDevice = std::make_shared("IdentityPoseDevice"); runToolSquareTest(toolDevice, squareDevice, //2345678901234567890123456789012345678901234567890123456789012345678901234567890 "Move the Phantom device to move the sphere tool."); std::cout << std::endl << "Exiting." << std::endl; // Cleanup and shutdown will happen automatically as objects go out of scope. return 0; } opensurgsim-0.7.0/SurgSim/Devices/ReplayPoseDevice/000077500000000000000000000000001277777236100222725ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Devices/ReplayPoseDevice/CMakeLists.txt000066400000000000000000000025511277777236100250350ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. link_directories(${Boost_LIBRARY_DIRS}) include_directories("${CMAKE_CURRENT_SOURCE_DIR}") set(REPLAY_POSE_DEVICE_SOURCES ReplayPoseDevice.cpp ReplayPoseScaffold.cpp ) set(REPLAY_POSE_DEVICE_HEADERS ReplayPoseDevice.h ReplayPoseScaffold.h ) set(DEVICE_HEADERS ${DEVICE_HEADERS} ReplayPoseDevice/ReplayPoseDevice.h PARENT_SCOPE) surgsim_add_library( ReplayPoseDevice "${REPLAY_POSE_DEVICE_SOURCES}" "${REPLAY_POSE_DEVICE_HEADERS}" ) set(LIBS SurgSimDataStructures SurgSimFramework SurgSimInput SurgSimMath ) target_link_libraries(ReplayPoseDevice ${LIBS} ) if(BUILD_TESTING) add_subdirectory(UnitTests) endif() # Put ReplayPoseDevice into folder "Devices" set_target_properties(ReplayPoseDevice PROPERTIES FOLDER "Devices") opensurgsim-0.7.0/SurgSim/Devices/ReplayPoseDevice/ReplayPoseDevice.cpp000066400000000000000000000051051277777236100262020ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Devices/ReplayPoseDevice/ReplayPoseDevice.h" #include "SurgSim/Devices/ReplayPoseDevice/ReplayPoseScaffold.h" #include "SurgSim/Framework/Assert.h" namespace SurgSim { namespace Devices { SURGSIM_REGISTER(SurgSim::Input::DeviceInterface, SurgSim::Devices::ReplayPoseDevice, ReplayPoseDevice); ReplayPoseDevice::ReplayPoseDevice(const std::string& uniqueName) : SurgSim::Input::CommonDevice(uniqueName, ReplayPoseScaffold::buildDeviceInputData()), m_fileName("ReplayPoseDevice.txt"), m_rate(1000.0) { SURGSIM_ADD_SERIALIZABLE_PROPERTY(ReplayPoseDevice, std::string, FileName, getFileName, setFileName); SURGSIM_ADD_SERIALIZABLE_PROPERTY(ReplayPoseDevice, double, Rate, getRate, setRate); } ReplayPoseDevice::~ReplayPoseDevice() { if (isInitialized()) { finalize(); } } const std::string ReplayPoseDevice::getFileName() const { return m_fileName; } void ReplayPoseDevice::setFileName(const std::string& fileName) { SURGSIM_ASSERT(!isInitialized()) << "The filename can only be set before initialization"; m_fileName = fileName; } double ReplayPoseDevice::getRate() const { return m_rate; } void ReplayPoseDevice::setRate(double rate) { SURGSIM_ASSERT(!isInitialized()) << "The rate can only be set before initialization"; m_rate = rate; } bool ReplayPoseDevice::initialize() { SURGSIM_ASSERT(!isInitialized()) << getName() << " already initialized."; std::shared_ptr scaffold = ReplayPoseScaffold::getOrCreateSharedInstance(); SURGSIM_ASSERT(scaffold); if (!scaffold->registerDevice(this)) { return false; } m_scaffold = std::move(scaffold); return true; } bool ReplayPoseDevice::finalize() { SURGSIM_ASSERT(isInitialized()) << getName() << " is not initialized, cannot finalize."; bool ok = m_scaffold->unregisterDevice(); m_scaffold.reset(); return ok; } bool ReplayPoseDevice::isInitialized() const { return (m_scaffold != nullptr); } }; // namespace Devices }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Devices/ReplayPoseDevice/ReplayPoseDevice.h000066400000000000000000000062301277777236100256470ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DEVICES_REPLAYPOSEDEVICE_REPLAYPOSEDEVICE_H #define SURGSIM_DEVICES_REPLAYPOSEDEVICE_REPLAYPOSEDEVICE_H #include #include #include "SurgSim/Input/CommonDevice.h" namespace SurgSim { namespace Devices { class ReplayPoseScaffold; SURGSIM_STATIC_REGISTRATION(ReplayPoseDevice); /// A class implementing the replay pose device, which is a pretend device that replays a recorded motion from a file /// /// This can be useful not only for writing tests, but also as a way to replace real hardware devices in situations /// where the simulator needs to be run but the hardware is not currently available. /// /// \par Application input provided by the device: /// | type | name | | /// | ---- | ---- | --- | /// | pose | "pose" | %Device pose (units are meters). | /// /// \sa SurgSim::Input::CommonDevice class ReplayPoseDevice : public SurgSim::Input::CommonDevice { public: /// Constructor. /// \param uniqueName A unique name for the device that will be used by the application. explicit ReplayPoseDevice(const std::string& uniqueName); /// \return The filename from which the input poses are read (default is 'ReplayPoseDevice.txt') const std::string getFileName() const; /// \param fileName from which the input poses will be read (default is 'ReplayPoseDevice.txt') void setFileName(const std::string& fileName); /// \return The rate (in Hz) at which the device is running (1KHz is the default) double getRate() const; /// \param rate The rate (in Hz) at which the device will run (1KHz is the default) /// \exception SurgSim::Framework::AssertionFailure if the method is called after initialization void setRate(double rate); SURGSIM_CLASSNAME(SurgSim::Devices::ReplayPoseDevice); virtual ~ReplayPoseDevice(); bool initialize() override; bool isInitialized() const override; private: friend class ReplayPoseScaffold; bool finalize() override; std::shared_ptr m_scaffold; /// The filename to read the input transform from std::string m_fileName; /// The rate to run the device at (i.e. at which rate the information is populated). /// This is independent of the record being replayed, the motion will be real-time (interpolation may occur). double m_rate; }; }; // namespace Devices }; // namespace SurgSim #endif // SURGSIM_DEVICES_REPLAYPOSEDEVICE_REPLAYPOSEDEVICE_H opensurgsim-0.7.0/SurgSim/Devices/ReplayPoseDevice/ReplayPoseScaffold.cpp000066400000000000000000000165471277777236100265400ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Devices/ReplayPoseDevice/ReplayPoseScaffold.h" #include #include #include "SurgSim/DataStructures/DataGroupBuilder.h" #include "SurgSim/Devices/ReplayPoseDevice/ReplayPoseDevice.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Framework/SharedInstance.h" namespace { /// Missing istream "operator >>" for Eigen matrix type /// http://eigen.tuxfamily.org/bz/show_bug.cgi?id=622 template std::istream& operator >>(std::istream& s, Eigen::MatrixBase& m) { for (int i = 0; i < m.rows(); ++i) { for (int j = 0; j < m.cols(); j++) { s >> m(i, j); } } return s; } } namespace SurgSim { namespace Devices { ReplayPoseScaffold::ReplayPoseScaffold() : Framework::BasicThread("ReplayPoseScaffold"), m_logger(Framework::Logger::getLogger("Devices/ReplayPoseScaffold")) { SURGSIM_LOG_DEBUG(m_logger) << "ReplayPose scaffold created."; } ReplayPoseScaffold::~ReplayPoseScaffold() { if (m_device != nullptr) { unregisterDevice(); } SURGSIM_LOG_DEBUG(m_logger) << "ReplayPose scaffold destroyed."; } std::shared_ptr ReplayPoseScaffold::getOrCreateSharedInstance() { static Framework::SharedInstance sharedInstance; return sharedInstance.get(); } bool ReplayPoseScaffold::doInitialize() { return true; } bool ReplayPoseScaffold::doStartUp() { return true; } bool ReplayPoseScaffold::doUpdate(double dt) { boost::unique_lock scopedLock(m_deviceLock); SURGSIM_ASSERT(m_device != nullptr) << "DeviceData not properly allocated"; return updateDevice(m_device.get()); } struct ReplayPoseScaffold::DeviceData { /// Constructor /// \param device Device to be managed by this scaffold explicit DeviceData(ReplayPoseDevice* device) : deviceObject(device), m_timestamp(0), m_index(0), m_fileLoaded(false) { m_fileLoaded = loadFile(deviceObject->getFileName()); m_timer.start(); } /// Retrieve the pose for the given time stamp "m_timestamp" /// \return The requested pose, Identity if none could be loaded Math::RigidTransform3d getPose() { if (m_motion.size() == 0) { return Math::RigidTransform3d::Identity(); } if (m_motion.size() == 1 || (m_index == 0 && m_timestamp <= m_motion[0].first)) { return m_motion[0].second; } while (m_motion.size() > m_index && m_timestamp > m_motion[m_index].first) { m_index++; } // Requesting a timestamp over the higher limit recorded in the file if (m_motion.size() <= m_index) { return m_motion[m_motion.size() - 1].second; } // Are we requesting exactly the timestamp we just indexed if (m_timestamp == m_motion[m_index].first) { return m_motion[m_index].second; } // Otherwise, we need to interpolate between the index and the previous index double range = m_motion[m_index].first - m_motion[m_index - 1].first; double time = (m_timestamp - m_motion[m_index - 1].first) / range; return Math::interpolate(m_motion[m_index - 1].second, m_motion[m_index].second, time); } /// Device object managed by this scaffold. ReplayPoseDevice* const deviceObject; /// Timer to keep track of the time stamp and keep the replay in sync with the recording Framework::Timer m_timer; /// Time stamp for the device (which time stamp are we reproducing?) double m_timestamp; /// Series of poses through time loaded from the input file std::vector> m_motion; /// Index of the latest pose used size_t m_index; /// Valid file loaded successfully bool m_fileLoaded; private: // Prevent copy construction and copy assignment. (VS2012 does not support "= delete" yet.) DeviceData(const DeviceData&) /*= delete*/; DeviceData& operator=(const DeviceData&) /*= delete*/; /// \param fileName the file to be open and loaded /// \return True if the file was loaded successfully, False otherwise bool loadFile(const std::string& fileName) { auto logger = Framework::Logger::getLogger("Devices/ReplayPoseScaffold"); std::ifstream inputFile; bool result = true; inputFile.open(fileName, std::ios::in); if (!inputFile.is_open()) { SURGSIM_LOG_WARNING(logger) << "Could not find or open the file " << fileName << "; Replay will use Identity pose"; result = false; } else { while (!inputFile.eof()) { double timeStamp; Math::RigidTransform3d pose; inputFile >> timeStamp >> pose.matrix(); m_motion.emplace_back(timeStamp, pose); } SURGSIM_LOG_INFO(logger) << "Loaded " << m_motion.size() << " timestamps"; if (m_motion.size() >= 1) { SURGSIM_LOG_INFO(logger) << "The loaded timestamps cover a range of " << m_motion[m_motion.size() - 1].first - m_motion[0].first << " second(s)"; } SURGSIM_LOG_IF(m_motion.size() == 0, logger, WARNING) << "No poses could be properly loaded, Identity pose will be used"; inputFile.close(); } return result; } }; bool ReplayPoseScaffold::registerDevice(ReplayPoseDevice* device) { boost::unique_lock scopedLock(m_deviceLock); SURGSIM_ASSERT(m_device == nullptr) << "Can't register two ReplayPoseDevice."; m_device.reset(new ReplayPoseScaffold::DeviceData(device)); if (m_device == nullptr) { SURGSIM_LOG_CRITICAL(m_logger) << "Failed to create a DeviceData"; return false; } if (!m_device->m_fileLoaded) { SURGSIM_LOG_CRITICAL(m_logger) << "Failed to load the file to replay"; return false; } SURGSIM_LOG_DEBUG(m_logger) << "Registered device " << device->getName(); bool success = true; if (!isRunning()) { std::shared_ptr barrier = std::make_shared(2); start(barrier); barrier->wait(true); // Wait for initialize barrier->wait(true); // Wait for startup success = isInitialized(); } if (success) { setRate(device->getRate()); } return success; } bool ReplayPoseScaffold::unregisterDevice() { if (isRunning()) { stop(); } // #threadsafety After unregistering, another thread could be in the process of registering. boost::unique_lock scopedLock(m_deviceLock); m_device.reset(); SURGSIM_LOG_DEBUG(m_logger) << "Unregistered device"; return true; } bool ReplayPoseScaffold::updateDevice(ReplayPoseScaffold::DeviceData* info) { DataStructures::DataGroup& inputData = m_device->deviceObject->getInputData(); info->m_timer.markFrame(); info->m_timestamp += info->m_timer.getLastFramePeriod(); Math::RigidTransform3d pose = info->getPose(); inputData.poses().set(DataStructures::Names::POSE, pose); m_device->deviceObject->pushInput(); return true; } DataStructures::DataGroup ReplayPoseScaffold::buildDeviceInputData() { DataStructures::DataGroupBuilder builder; builder.addPose(DataStructures::Names::POSE); return builder.createData(); } }; // namespace Devices }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Devices/ReplayPoseDevice/ReplayPoseScaffold.h000066400000000000000000000056641277777236100262030ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DEVICES_REPLAYPOSEDEVICE_REPLAYPOSESCAFFOLD_H #define SURGSIM_DEVICES_REPLAYPOSEDEVICE_REPLAYPOSESCAFFOLD_H #include #include #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/Framework/BasicThread.h" #include "SurgSim/Framework/Logger.h" #include "SurgSim/Math/RigidTransform.h" namespace SurgSim { namespace Devices { class ReplayPoseDevice; class ReplayPoseScaffold : public SurgSim::Framework::BasicThread { friend class ReplayPoseDevice; public: /// Constructor. ReplayPoseScaffold(); /// Destructor. ~ReplayPoseScaffold(); /// Gets or creates the scaffold shared by all RawMultiAxisDevice instances. /// The scaffold is managed using a SharedInstance object, so it will be destroyed when all devices are released. /// \return the scaffold object. static std::shared_ptr getOrCreateSharedInstance(); protected: bool doInitialize() override; bool doStartUp() override; bool doUpdate(double dt) override; private: /// Internal per-device information. struct DeviceData; /// Registers the specified device object. /// If successful, the device object will become connected to an hardware device. /// \param device The device object to be used, which should have a unique name. /// \return True if the initialization succeeds, false if it fails. bool registerDevice(ReplayPoseDevice* device); /// Unregisters the specified device object. /// The corresponding controller will become unused, and can be re-registered later. /// \return True on success, false on failure. bool unregisterDevice(); /// Updates the device information for a single device. /// \param info The information to update the device from /// \return True on success. bool updateDevice(ReplayPoseScaffold::DeviceData* info); /// Builds the data layout for the application input (i.e. device output). static DataStructures::DataGroup buildDeviceInputData(); /// Logger used by the scaffold and all devices. std::shared_ptr m_logger; /// The ReplayPose device locking mechanism boost::mutex m_deviceLock; /// The ReplayPose device managed by this scaffold std::unique_ptr m_device; }; }; // namespace Devices }; // namespace SurgSim #endif // SURGSIM_DEVICES_REPLAYPOSEDEVICE_REPLAYPOSESCAFFOLD_H opensurgsim-0.7.0/SurgSim/Devices/ReplayPoseDevice/UnitTests/000077500000000000000000000000001277777236100242345ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Devices/ReplayPoseDevice/UnitTests/CMakeLists.txt000066400000000000000000000016011277777236100267720ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2012-2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. include_directories( ${gtest_SOURCE_DIR}/include ) set(UNIT_TEST_SOURCES ReplayPoseDeviceTest.cpp ) set(LIBS ReplayPoseDevice ) surgsim_add_unit_tests(ReplayPoseDeviceTest) set_target_properties(ReplayPoseDeviceTest PROPERTIES FOLDER "Devices") opensurgsim-0.7.0/SurgSim/Devices/ReplayPoseDevice/UnitTests/ReplayPoseDeviceTest.cpp000066400000000000000000000153411277777236100310070ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the ReplayPoseDevice class. #include #include #include #include // This is to access boost::this_thread namespace #include "SurgSim/Devices/ReplayPoseDevice/ReplayPoseDevice.h" #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/Framework/Timer.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Matrix.h" #include "SurgSim/Testing/MockInputOutput.h" using SurgSim::Devices::ReplayPoseDevice; using SurgSim::DataStructures::DataGroup; using SurgSim::Math::RigidTransform3d; using SurgSim::Math::Matrix44d; using SurgSim::Testing::MockInputOutput; namespace { void createFakeRecord(const std::string& fileName, double rate) { SurgSim::Framework::Timer timer; timer.setMaxNumberOfFrames(1); timer.start(); std::ofstream f(fileName, std::ios::out | std::ios::trunc); timer.endFrame(); double cumulativeTime = timer.getLastFramePeriod(); double deltaTime = 1.0 / rate; SurgSim::Math::Quaterniond q(Eigen::AngleAxisd(2.0123, SurgSim::Math::Vector3d(1, 2, 3).normalized())); SurgSim::Math::Vector3d t(0.01, -0.04, 0.0035); SurgSim::Math::RigidTransform3d poseStart = SurgSim::Math::makeRigidTranslation(SurgSim::Math::Vector3d::Zero()); SurgSim::Math::RigidTransform3d poseEnd = SurgSim::Math::makeRigidTransform(q, t); do { auto pose = SurgSim::Math::interpolate(poseStart, poseEnd, cumulativeTime); f << cumulativeTime << std::endl << pose.matrix() << std::endl; cumulativeTime += deltaTime; } while (cumulativeTime < 1.0); f << "1.0" << std::endl << poseEnd.matrix() << std::endl; f.close(); } bool exist(const std::string& fileName) { std::ifstream f(fileName.c_str()); bool result = f.good(); f.close(); return result; } void clearFakeRecord(const std::string& fileName) { if (exist(fileName)) { std::remove(fileName.c_str()); } } } TEST(ReplayPoseDeviceTest, Name) { auto device = std::make_shared("FakeReplayDevice"); EXPECT_EQ("FakeReplayDevice", device->getName()); } TEST(ReplayPoseDeviceTest, Filename) { std::string fileName("FakeRecord.txt"); createFakeRecord(fileName, 30); auto device = std::make_shared("FakeReplayDevice"); EXPECT_EQ(0, device->getFileName().compare("ReplayPoseDevice.txt")); EXPECT_NO_THROW(device->setFileName(fileName)); EXPECT_EQ(0, device->getFileName().compare(fileName)); EXPECT_TRUE(device->initialize()); clearFakeRecord(fileName); EXPECT_THROW(device->setFileName(fileName), SurgSim::Framework::AssertionFailure); } TEST(ReplayPoseDeviceTest, Initialize) { std::string fileName("FakeRecord.txt"); clearFakeRecord(fileName); { SCOPED_TRACE("Missing filename"); auto device = std::make_shared("FakeReplayDevice"); device->setFileName(fileName); EXPECT_FALSE(device->initialize()); // Missing the setFilename call, no file open EXPECT_FALSE(device->isInitialized()); } { SCOPED_TRACE("Success"); createFakeRecord(fileName, 30); auto device = std::make_shared("FakeReplayDevice"); device->setFileName(fileName); EXPECT_TRUE(device->initialize()); EXPECT_TRUE(device->isInitialized()); clearFakeRecord(fileName); } } TEST(ReplayPoseDeviceTest, Factory) { std::shared_ptr device; ASSERT_NO_THROW(device = SurgSim::Input::DeviceInterface::getFactory().create( "SurgSim::Devices::ReplayPoseDevice", "Device")); EXPECT_NE(nullptr, device); } namespace { void AddInputConsumerRecordXHzReplayYHz(double rateRecord, double rateReplay) { std::string fileName("FakeRecord.txt"); createFakeRecord(fileName, rateRecord); std::shared_ptr device = std::make_shared("MyReplayPoseDevice"); ASSERT_TRUE(device != nullptr) << "Device creation failed."; device->setRate(rateReplay); device->setFileName("FakeRecord.txt"); ASSERT_TRUE(device->initialize()) << "Initialization failed."; std::shared_ptr consumer = std::make_shared(); EXPECT_EQ(0, consumer->m_numTimesInitializedInput); EXPECT_EQ(0, consumer->m_numTimesReceivedInput); EXPECT_FALSE(device->removeInputConsumer(consumer)); EXPECT_EQ(0, consumer->m_numTimesInitializedInput); EXPECT_EQ(0, consumer->m_numTimesReceivedInput); EXPECT_TRUE(device->addInputConsumer(consumer)); // Adding the same input consumer again should fail. EXPECT_FALSE(device->addInputConsumer(consumer)); // Sleep for a second, to see how many times the consumer is invoked. boost::this_thread::sleep_until(boost::chrono::steady_clock::now() + boost::chrono::milliseconds(1000)); // Check the number of invocations. EXPECT_EQ(1, consumer->m_numTimesInitializedInput); EXPECT_LE(consumer->m_numTimesReceivedInput, rateReplay * 1.3); // rateReplay@ 1000Hz => higher limit@ 1300Hz EXPECT_TRUE(consumer->m_lastReceivedInput.poses().hasData(SurgSim::DataStructures::Names::POSE)); // Check the replay pose passed 1.0 second SurgSim::Math::RigidTransform3d pose; boost::this_thread::sleep_until(boost::chrono::steady_clock::now() + boost::chrono::milliseconds(50)); ASSERT_TRUE(consumer->m_lastReceivedInput.poses().get(SurgSim::DataStructures::Names::POSE, &pose)); SurgSim::Math::Quaterniond q(Eigen::AngleAxisd(2.0123, SurgSim::Math::Vector3d(1, 2, 3).normalized())); SurgSim::Math::Vector3d t(0.01, -0.04, 0.0035); SurgSim::Math::RigidTransform3d poseEnd = SurgSim::Math::makeRigidTransform(q, t); EXPECT_NEAR(0, (pose.matrix() - poseEnd.matrix()).norm(), 1e-6); EXPECT_TRUE(device->removeInputConsumer(consumer)); // Removing the same input consumer again should fail. EXPECT_FALSE(device->removeInputConsumer(consumer)); clearFakeRecord(fileName); } } TEST(ReplayPoseDeviceTest, AddInputConsumerRecord60HzReplay60Hz) { AddInputConsumerRecordXHzReplayYHz(60.0, 60.0); } TEST(ReplayPoseDeviceTest, AddInputConsumerRecord60HzReplay1000Hz) { AddInputConsumerRecordXHzReplayYHz(60.0, 1000.0); } TEST(ReplayPoseDeviceTest, AddInputConsumerRecord1000HzReplay60Hz) { AddInputConsumerRecordXHzReplayYHz(1000.0, 60.0); } TEST(ReplayPoseDeviceTest, AddInputConsumerRecord1000HzReplay1000Hz) { AddInputConsumerRecordXHzReplayYHz(1000.0, 1000.0); } opensurgsim-0.7.0/SurgSim/Devices/Sixense/000077500000000000000000000000001277777236100205055ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Devices/Sixense/CMakeLists.txt000066400000000000000000000026551277777236100232550ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. find_package(SixenseSdk REQUIRED) include_directories( ${SIXENSESDK_INCLUDE_DIR} ) set(LIBS ${SIXENSESDK_LIBRARIES} ) set(SIXENSE_DEVICE_SOURCES SixenseDevice.cpp SixenseScaffold.cpp SixenseThread.cpp ) set(SIXENSE_DEVICE_HEADERS SixenseDevice.h SixenseScaffold.h SixenseThread.h ) set(DEVICE_HEADERS ${DEVICE_HEADERS} Sixense/SixenseDevice.h PARENT_SCOPE) # TODO(advornik): the installation should NOT copy all the headers... surgsim_add_library( SixenseDevice "${SIXENSE_DEVICE_SOURCES}" "${SIXENSE_DEVICE_HEADERS}" ) target_link_libraries(SixenseDevice ${LIBS}) if(BUILD_TESTING) add_subdirectory(UnitTests) if(GLUT_FOUND) add_subdirectory(VisualTest) endif(GLUT_FOUND) endif() # Put SixenseDevice into folder "Devices" set_target_properties(SixenseDevice PROPERTIES FOLDER "Devices") opensurgsim-0.7.0/SurgSim/Devices/Sixense/Sixense.dox000066400000000000000000000016501277777236100226410ustar00rootroot00000000000000/*! \page Sixense Sixense: Motion and Orientation Tracking Device The Razer Hydra (by Sixense Entertainment and Razer USA) is a device that tracks position and orientation of two controllers using magnetic fields. Dependencies: - Requires the Sixense SDK, available through Steam http://sixense.com/hardware/sixensesdk - An environment variable named SIXENSESDK_PATH or SIXENSE_ROOT must be set to the directory containing (include\\)sixense.h - Executables that incorporate this device must have access to the appropriate libraries at runtime, either by adding the appropriate folder(s) to the path environment variable, or copying the libraries into the folder with the executable. - Sixense's SDK is distributed/built under Visual Studio 2010 or 2013 (no source code available). To run applications under debug mode with Sixense's SDK, MSVCP100d.dll is required, which is only distributed in Visual Studio 2010. */ opensurgsim-0.7.0/SurgSim/Devices/Sixense/SixenseDevice.cpp000066400000000000000000000035111277777236100237470ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Devices/Sixense/SixenseDevice.h" #include "SurgSim/Devices/Sixense/SixenseScaffold.h" #include "SurgSim/Framework/Log.h" namespace SurgSim { namespace Devices { SURGSIM_REGISTER(SurgSim::Input::DeviceInterface, SurgSim::Devices::SixenseDevice, SixenseDevice); SixenseDevice::SixenseDevice(const std::string& uniqueName) : SurgSim::Input::CommonDevice(uniqueName, SixenseScaffold::buildDeviceInputData()) { } SixenseDevice::~SixenseDevice() { if (isInitialized()) { finalize(); } } bool SixenseDevice::initialize() { SURGSIM_ASSERT(!isInitialized()) << getName() << " already initialized."; auto scaffold = SixenseScaffold::getOrCreateSharedInstance(); SURGSIM_ASSERT(scaffold != nullptr); bool initialize = false; if (scaffold->registerDevice(this)) { m_scaffold = std::move(scaffold); initialize = true; } return initialize; } bool SixenseDevice::finalize() { SURGSIM_ASSERT(isInitialized()) << getName() << " is not initialized, cannot finalize."; bool ok = m_scaffold->unregisterDevice(this); m_scaffold.reset(); return ok; } bool SixenseDevice::isInitialized() const { return (m_scaffold != nullptr); } }; // namespace Devices }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Devices/Sixense/SixenseDevice.h000066400000000000000000000066631277777236100234270ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DEVICES_SIXENSE_SIXENSEDEVICE_H #define SURGSIM_DEVICES_SIXENSE_SIXENSEDEVICE_H #include #include #include "SurgSim/Input/CommonDevice.h" namespace SurgSim { namespace Devices { class SixenseScaffold; SURGSIM_STATIC_REGISTRATION(SixenseDevice); /// A class implementing the communication with one Sixense controller, for example one of the two on the Razer Hydra. /// /// \par Application input provided by the device: /// | type | name | | /// | ---- | ---- | --- | /// | pose | "pose" | %Device pose (units are meters). | /// | scalar | "trigger" | State of the analog trigger button (0 = not pressed, 1 = fully pressed). | /// | scalar | "joystickX" | Joystick X position (0 = center, -1 = fully left, +1 = fully right). | /// | scalar | "joystickY" | Joystick Y position (0 = center, -1 = fully down/near, +1 = up/far). | /// | bool | "buttonTrigger" | True if the analog trigger button is pressed, i.e. its value is non-zero. | /// | bool | "buttonBumper" | True if the bumper button (next to the trigger) is pressed. | /// | bool | "button1" | True if the button marked "1" is pressed. | /// | bool | "button2" | True if the button marked "2" is pressed. | /// | bool | "button3" | True if the button marked "3" is pressed. | /// | bool | "button4" | True if the button marked "4" is pressed. | /// | bool | "buttonStart" | True if the "start" button is pressed. | /// | bool | "buttonJoystick" | True if the joystick is pressed down as a button ("into" the controller). | /// /// \par Application output used by the device: none. /// /// \sa SurgSim::Input::CommonDevice, SurgSim::Input::DeviceInterface class SixenseDevice : public SurgSim::Input::CommonDevice { public: /// Constructor. /// /// \param uniqueName A unique name for the device that will be used by the application. explicit SixenseDevice(const std::string& uniqueName); SURGSIM_CLASSNAME(SurgSim::Devices::SixenseDevice); /// Destructor. virtual ~SixenseDevice(); bool initialize() override; bool isInitialized() const override; private: friend class SixenseScaffold; bool finalize() override; std::shared_ptr m_scaffold; }; }; // namespace Devices }; // namespace SurgSim #endif // SURGSIM_DEVICES_SIXENSE_SIXENSEDEVICE_H opensurgsim-0.7.0/SurgSim/Devices/Sixense/SixenseScaffold.cpp000066400000000000000000000360041277777236100242740ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Devices/Sixense/SixenseScaffold.h" #include #include #include #include #include #include #include #include "SurgSim/Devices/Sixense/SixenseDevice.h" #include "SurgSim/Devices/Sixense/SixenseThread.h" #include "SurgSim/Framework/Assert.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Framework/SharedInstance.h" #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/DataStructures/DataGroupBuilder.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Math/Matrix.h" #include "SurgSim/Math/RigidTransform.h" using SurgSim::Math::Vector3d; using SurgSim::Math::Vector3f; using SurgSim::Math::Matrix44d; using SurgSim::Math::Matrix33d; using SurgSim::Math::RigidTransform3d; namespace SurgSim { namespace Devices { struct SixenseScaffold::DeviceData { public: /// Initialize the data. DeviceData(int baseIndex, int controllerIndex, SixenseDevice* device) : deviceBaseIndex(baseIndex), deviceControllerIndex(controllerIndex), deviceObject(device) { } /// The index of the Sixense base unit for this device. const int deviceBaseIndex; /// The index of the Sixense controller for this device. const int deviceControllerIndex; /// The corresponding device object. SixenseDevice* const deviceObject; private: // prohibit copy construction and assignment DeviceData(const DeviceData&); DeviceData& operator=(const DeviceData&); }; struct SixenseScaffold::StateData { public: /// Initialize the state. StateData() : isApiInitialized(false) { } /// True if the API has been initialized (and not finalized). bool isApiInitialized; /// Processing thread. std::unique_ptr thread; /// The list of known devices. std::list> activeDeviceList; /// The mutex that protects the list of known devices. boost::mutex mutex; private: // prohibit copy construction and assignment StateData(const StateData&); StateData& operator=(const StateData&); }; SixenseScaffold::SixenseScaffold() : m_logger(Framework::Logger::getLogger("Devices/Sixense")), m_state(new StateData) { SURGSIM_LOG_DEBUG(m_logger) << "Shared scaffold created."; } SixenseScaffold::~SixenseScaffold() { // The thread needs to be torn down while NOT holding the mutex, to avoid deadlock. if (m_state->thread) { destroyThread(); } // The following block controls the duration of the mutex being locked. { boost::lock_guard lock(m_state->mutex); if (! m_state->activeDeviceList.empty()) { SURGSIM_LOG_SEVERE(m_logger) << "Sixense/Hydra: Destroying scaffold while devices are active!?!"; // do anything special with each device? m_state->activeDeviceList.clear(); } if (m_state->isApiInitialized) { finalizeSdk(); } } SURGSIM_LOG_DEBUG(m_logger) << "Sixense/Hydra: Shared scaffold destroyed."; } bool SixenseScaffold::registerDevice(SixenseDevice* device) { { boost::lock_guard lock(m_state->mutex); if (! m_state->isApiInitialized) { if (! initializeSdk()) { return false; } } } boost::chrono::steady_clock::time_point tick = boost::chrono::steady_clock::now(); int numUsedDevicesSeen = 0; bool fatalError = false; bool deviceFound = findUnusedDeviceAndRegister(device, &numUsedDevicesSeen, &fatalError); if (! deviceFound && ! fatalError && (numUsedDevicesSeen == 0) && (m_startupDelayMilliseconds > 0)) { // Unfortunately, right after sixenseInit() the library has not yet completed its device discovery! // That means that calls to sixenseIsBaseConnected(), sixenseIsControllerEnabled(), etc. will return // *false* even if the base/controller is actually present. // // One way to deal with that would be to dynamically handle any (or no) connected devices, the way the // example code does. But we'd like to report missing devices to the calling code as soon as possible. // // Another is to simply sleep and retry a few times here. Ugh. // --advornik 2012-08-03 boost::chrono::steady_clock::time_point retryEnd = tick + boost::chrono::milliseconds(m_startupDelayMilliseconds); while (true) { tick += boost::chrono::milliseconds(m_startupRetryIntervalMilliseconds); boost::this_thread::sleep_until(tick); tick = boost::chrono::steady_clock::now(); // finding a device may take > 100ms, so fix up the time. deviceFound = findUnusedDeviceAndRegister(device, &numUsedDevicesSeen, &fatalError); if (deviceFound || fatalError || (numUsedDevicesSeen > 0) || (tick >= retryEnd)) { break; } } } if (! deviceFound) { if (fatalError) { // error information was hopefully already logged SURGSIM_LOG_DEBUG(m_logger) << "Sixense/Hydra: Registering device failed due to earlier fatal error."; } else if (numUsedDevicesSeen > 0) { SURGSIM_LOG_SEVERE(m_logger) << "Sixense/Hydra: Failed to find any unused controllers!"; } else { SURGSIM_LOG_SEVERE(m_logger) << "Sixense/Hydra: Failed to find any devices." << " Are the base and controllers plugged in?"; } return false; } SURGSIM_LOG_INFO(m_logger) << "Device " << device->getName() << " initialized."; return true; } bool SixenseScaffold::unregisterDevice(const SixenseDevice* const device) { bool found = false; { boost::lock_guard lock(m_state->mutex); auto matching = std::find_if(m_state->activeDeviceList.begin(), m_state->activeDeviceList.end(), [device](const std::unique_ptr& info) { return info->deviceObject == device; }); if (matching != m_state->activeDeviceList.end()) { m_state->activeDeviceList.erase(matching); // the iterator is now invalid but that's OK found = true; SURGSIM_LOG_INFO(m_logger) << "Device " << device->getName() << " finalized."; } } SURGSIM_LOG_IF(!found, m_logger, SEVERE) << "Attempted to release a non-registered device " << device->getName(); return found; } bool SixenseScaffold::runInputFrame() { boost::lock_guard lock(m_state->mutex); for (auto it = m_state->activeDeviceList.begin(); it != m_state->activeDeviceList.end(); ++it) { // We don't call it->deviceObject->pullOutput() because we don't use any output at all. if (updateDevice(**it)) { (*it)->deviceObject->pushInput(); } } return true; } bool SixenseScaffold::updateDevice(const SixenseScaffold::DeviceData& info) { //const SurgSim::DataStructures::DataGroup& outputData = info.deviceObject->getOutputData(); int status = sixenseSetActiveBase(info.deviceBaseIndex); if (status != SIXENSE_SUCCESS) { SURGSIM_LOG_CRITICAL(m_logger) << "Sixense/Hydra: Could not activate base unit #" << info.deviceBaseIndex << " to read device '" << info.deviceObject->getName() << "'! (status = " << status << ")"; return false; } sixenseControllerData data; status = sixenseGetNewestData(info.deviceControllerIndex, &data); if (status != SIXENSE_SUCCESS) { SURGSIM_LOG_CRITICAL(m_logger) << "Sixense/Hydra: Could not get data from controller #" << info.deviceBaseIndex << "," << info.deviceControllerIndex << " for device '" << info.deviceObject->getName() << "'! (status = " << status << ")"; return false; } // Use Eigen::Map to make the raw API output values look like Eigen data types Eigen::Map position(data.pos); Eigen::Map> orientation(&(data.rot_mat[0][0])); RigidTransform3d pose; pose.makeAffine(); pose.linear() = orientation.cast(); pose.translation() = position.cast() * 0.001; // convert from millimeters to meters! // TODO(bert): this code should cache the access indices. SurgSim::DataStructures::DataGroup& inputData = info.deviceObject->getInputData(); inputData.poses().set(SurgSim::DataStructures::Names::POSE, pose); inputData.scalars().set("trigger", data.trigger); inputData.scalars().set("joystickX", data.joystick_x); inputData.scalars().set("joystickY", data.joystick_y); inputData.booleans().set("buttonTrigger", (data.trigger > 0)); inputData.booleans().set("buttonBumper", (data.buttons & SIXENSE_BUTTON_BUMPER) != 0); inputData.booleans().set(SurgSim::DataStructures::Names::BUTTON_1, (data.buttons & SIXENSE_BUTTON_1) != 0); inputData.booleans().set(SurgSim::DataStructures::Names::BUTTON_2, (data.buttons & SIXENSE_BUTTON_2) != 0); inputData.booleans().set(SurgSim::DataStructures::Names::BUTTON_3, (data.buttons & SIXENSE_BUTTON_3) != 0); inputData.booleans().set(SurgSim::DataStructures::Names::BUTTON_4, (data.buttons & SIXENSE_BUTTON_4) != 0); inputData.booleans().set("buttonStart", (data.buttons & SIXENSE_BUTTON_START) != 0); inputData.booleans().set("buttonJoystick", (data.buttons & SIXENSE_BUTTON_JOYSTICK) != 0); return true; } bool SixenseScaffold::initializeSdk() { SURGSIM_ASSERT(! m_state->isApiInitialized); int status = sixenseInit(); if (status != SIXENSE_SUCCESS) { SURGSIM_LOG_CRITICAL(m_logger) << "Sixense/Hydra: Could not initialize the Sixense library (status = " << status << ")"; return false; } m_state->isApiInitialized = true; return true; } bool SixenseScaffold::finalizeSdk() { SURGSIM_ASSERT(m_state->isApiInitialized); int status = sixenseExit(); if (status != SIXENSE_SUCCESS) { SURGSIM_LOG_CRITICAL(m_logger) << "Sixense/Hydra: Could not shut down the Sixense library (status = " << status << ")"; return false; } m_state->isApiInitialized = false; return true; } bool SixenseScaffold::findUnusedDeviceAndRegister(SixenseDevice* device, int* numUsedDevicesSeen, bool* fatalError) { *numUsedDevicesSeen = 0; *fatalError = false; boost::lock_guard lock(m_state->mutex); // Make sure the object is unique. auto sameObject = std::find_if(m_state->activeDeviceList.cbegin(), m_state->activeDeviceList.cend(), [device](const std::unique_ptr& info) { return info->deviceObject == device; }); SURGSIM_ASSERT(sameObject == m_state->activeDeviceList.end()) << "Sixense/Hydra: Tried to register a device" << " which is already present!"; // Make sure the name is unique. const std::string deviceName = device->getName(); auto sameName = std::find_if(m_state->activeDeviceList.cbegin(), m_state->activeDeviceList.cend(), [&deviceName](const std::unique_ptr& info) { return info->deviceObject->getName() == deviceName; }); if (sameName != m_state->activeDeviceList.end()) { SURGSIM_LOG_CRITICAL(m_logger) << "Sixense/Hydra: Tried to register a device when the same name is" << " already present!"; *fatalError = true; return false; } const int maxNumBases = sixenseGetMaxBases(); for (int b = 0; b < maxNumBases; ++b) { SURGSIM_LOG_DEBUG(m_logger) << "Sixense/Hydra: scanning base #" << b << " (of total " << maxNumBases << ")"; if (! sixenseIsBaseConnected(b)) { continue; } int status = sixenseSetActiveBase(b); if (status != SIXENSE_SUCCESS) { SURGSIM_LOG_SEVERE(m_logger) << "Sixense/Hydra: Could not activate connected base #" << b << " (status = " << status << ")"; continue; } const int maxNumControllers = sixenseGetMaxControllers(); for (int c = 0; c < maxNumControllers; ++c) { if (! sixenseIsControllerEnabled(c)) { continue; } sixenseControllerData data; status = sixenseGetNewestData(c, &data); if (status != SIXENSE_SUCCESS) { SURGSIM_LOG_SEVERE(m_logger) << "Sixense/Hydra: Could not get data from enabled controller #" << b << "," << c << " (status = " << status << ")"; continue; } SURGSIM_LOG_DEBUG(m_logger) << "Sixense/Hydra: scanning controller #" << b << "," << c << " (of total " << maxNumControllers << ")"; if (registerIfUnused(b, c, device, numUsedDevicesSeen)) { return true; } } } return false; } bool SixenseScaffold::registerIfUnused(int baseIndex, int controllerIndex, SixenseDevice* device, int* numUsedDevicesSeen) { // Check existing devices. auto sameIndices = std::find_if(m_state->activeDeviceList.cbegin(), m_state->activeDeviceList.cend(), [baseIndex, controllerIndex](const std::unique_ptr& info) { return ((info->deviceBaseIndex == baseIndex) && (info->deviceControllerIndex == controllerIndex)); }); if (sameIndices != m_state->activeDeviceList.end()) { // We found an existing device for this controller. ++(*numUsedDevicesSeen); return false; } // The controller is not yet in use. if (! m_state->thread) { createThread(); } // Construct the object, start its thread, then move it to the list. // Note that since Visual Studio 2010 doesn't support multi-argument emplace_back() for STL containers, storing a // list of unique_ptr results in nicer code than storing a list of DeviceData values directly. std::unique_ptr info(new DeviceData(baseIndex, controllerIndex, device)); m_state->activeDeviceList.emplace_back(std::move(info)); return true; } bool SixenseScaffold::createThread() { SURGSIM_ASSERT(! m_state->thread); std::unique_ptr thread(new SixenseThread(this)); thread->start(); m_state->thread = std::move(thread); return true; } bool SixenseScaffold::destroyThread() { SURGSIM_ASSERT(m_state->thread); std::unique_ptr thread = std::move(m_state->thread); thread->stop(); thread.release(); return true; } SurgSim::DataStructures::DataGroup SixenseScaffold::buildDeviceInputData() { SurgSim::DataStructures::DataGroupBuilder builder; builder.addPose(SurgSim::DataStructures::Names::POSE); builder.addScalar("trigger"); builder.addScalar("joystickX"); builder.addScalar("joystickY"); builder.addBoolean("buttonTrigger"); builder.addBoolean("buttonBumper"); builder.addBoolean(SurgSim::DataStructures::Names::BUTTON_1); builder.addBoolean(SurgSim::DataStructures::Names::BUTTON_2); builder.addBoolean(SurgSim::DataStructures::Names::BUTTON_3); builder.addBoolean(SurgSim::DataStructures::Names::BUTTON_4); builder.addBoolean("buttonStart"); builder.addBoolean("buttonJoystick"); return builder.createData(); } std::shared_ptr SixenseScaffold::getOrCreateSharedInstance() { // Using an explicit creation function gets around problems with accessing the private constructor. static auto creator = []() { return std::shared_ptr(new SixenseScaffold); }; // NOLINT(readability/braces) static SurgSim::Framework::SharedInstance sharedInstance(creator); return sharedInstance.get(); } int SixenseScaffold::m_startupDelayMilliseconds = 6000; int SixenseScaffold::m_startupRetryIntervalMilliseconds = 100; }; // namespace Devices }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Devices/Sixense/SixenseScaffold.h000066400000000000000000000117021277777236100237370ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DEVICES_SIXENSE_SIXENSESCAFFOLD_H #define SURGSIM_DEVICES_SIXENSE_SIXENSESCAFFOLD_H #include #include "SurgSim/Framework/Logger.h" #include "SurgSim/DataStructures/DataGroup.h" namespace SurgSim { namespace Devices { class SixenseDevice; class SixenseThread; /// A class that manages Sixense devices, such as the Razer Hydra. /// /// \sa SurgSim::Devices::SixenseDevice class SixenseScaffold { public: /// Destructor. ~SixenseScaffold(); /// Gets or creates the scaffold shared by all SixenseDevice instances. /// The scaffold is managed using a SharedInstance object, so it will be destroyed when all devices are released. /// \return the scaffold object. static std::shared_ptr getOrCreateSharedInstance(); private: /// Internal shared state data type. struct StateData; /// Interal per-device information. struct DeviceData; friend class SixenseDevice; friend class SixenseThread; friend struct StateData; /// Constructor. SixenseScaffold(); /// Registers the specified device object. /// If successful, the device object will become connected to an unused controller. /// /// \param device The device object to be used, which should have a unique name. /// \return True if the initialization succeeds, false if it fails. bool registerDevice(SixenseDevice* device); /// Unregisters the specified device object. /// The corresponding controller will become unused, and can be re-registered later. /// /// \param device The device object. /// \return true on success, false on failure. bool unregisterDevice(const SixenseDevice* device); /// Executes the operations for a single input frame. /// Should only be called from the context of the input loop thread. /// \return true on success. bool runInputFrame(); /// Updates the device information for a single device. /// \return true on success. bool updateDevice(const DeviceData& info); /// Initializes the Sixense SDK. /// \return true on success. bool initializeSdk(); /// Finalizes (de-initializes) the Sixense SDK. /// \return true on success. bool finalizeSdk(); /// Scans controllers that are present in the system, and if an unused one is found, register a device for it. /// /// \param device The device object to register if an unused device is found. /// \param [out] numUsedDevicesSeen The number of devices that were found during the scan but were already /// in use. Can be used if the scan fails to determine the error message that should be displayed. /// \param [out] fatalError Set to true if an error (such as a duplicate device name) prevented device /// registration such that retrying will not help; false otherwise. /// \return true on success. bool findUnusedDeviceAndRegister(SixenseDevice* device, int* numUsedDevicesSeen, bool* fatalError); /// Register a device object given a (baseIndex, controllerIndex) pair, if the same pair is not already in use. /// /// \param baseIndex Index of the base unit. /// \param controllerIndex Index of the controller within the base unit. /// \param device The device object to register if the index pair is in fact unused. /// \param [in,out] numUsedDevicesSeen The number of devices that were found during the scan but were /// already in use; incremented when an unused device is seen. /// \return true on success. bool registerIfUnused(int baseIndex, int controllerIndex, SixenseDevice* device, int* numUsedDevicesSeen); /// Creates the input loop thread. /// \return true on success. bool createThread(); /// Destroys the input loop thread. /// Should be called while NOT holding the internal device list mutex, to prevent deadlock. /// \return true on success. bool destroyThread(); /// Builds the data layout for the application input (i.e. device output). static SurgSim::DataStructures::DataGroup buildDeviceInputData(); /// Logger used by the scaffold and all devices. std::shared_ptr m_logger; /// Internal scaffold state. std::unique_ptr m_state; /// How long we're willing to wait for devices to be detected, in milliseconds. static int m_startupDelayMilliseconds; /// How long to wait between trying to detect devices, in milliseconds. static int m_startupRetryIntervalMilliseconds; }; }; // namespace Devices }; // namespace SurgSim #endif // SURGSIM_DEVICES_SIXENSE_SIXENSESCAFFOLD_H opensurgsim-0.7.0/SurgSim/Devices/Sixense/SixenseThread.cpp000066400000000000000000000020711277777236100237570ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Devices/Sixense/SixenseThread.h" #include "SurgSim/Devices/Sixense/SixenseScaffold.h" namespace SurgSim { namespace Devices { SixenseThread::~SixenseThread() { } bool SixenseThread::doUpdate(double dt) { m_scaffold->runInputFrame(); return true; } bool SixenseThread::doInitialize() { return true; } bool SixenseThread::doStartUp() { return true; } }; // namespace Devices }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Devices/Sixense/SixenseThread.h000066400000000000000000000030711277777236100234250ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DEVICES_SIXENSE_SIXENSETHREAD_H #define SURGSIM_DEVICES_SIXENSE_SIXENSETHREAD_H #include #include #include "SurgSim/Framework/BasicThread.h" namespace SurgSim { namespace Devices { class SixenseScaffold; /// A class implementing the thread context for sampling Sixense devices. /// \sa SurgSim::Devices::SixenseScaffold class SixenseThread : public SurgSim::Framework::BasicThread { public: explicit SixenseThread(SixenseScaffold* scaffold) : BasicThread("Sixense thread"), m_scaffold(scaffold) { setRate(120.0); // The Hydra runs at 60Hz, but running at 60Hz here could introduce up to 16.6ms extra latency } virtual ~SixenseThread(); protected: bool doInitialize() override; bool doStartUp() override; bool doUpdate(double dt) override; private: SixenseScaffold* m_scaffold; }; }; // namespace Devices }; // namespace SurgSim #endif // SURGSIM_DEVICES_SIXENSE_SIXENSETHREAD_H opensurgsim-0.7.0/SurgSim/Devices/Sixense/UnitTests/000077500000000000000000000000001277777236100224475ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Devices/Sixense/UnitTests/CMakeLists.txt000066400000000000000000000025241277777236100252120ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. include_directories( ${gtest_SOURCE_DIR}/include ) set(UNIT_TEST_SOURCES SixenseDeviceTest.cpp SixenseScaffoldTest.cpp ) set(LIBS SixenseDevice SurgSimDataStructures SurgSimMath SurgSimTesting ) surgsim_add_unit_tests(SixenseDeviceTest) # Copy the device DLLs into the build directory surgsim_copy_to_target_directory_for_release(SixenseDeviceTest ${SIXENSESDK_sixense_SHARED_RELEASE} ${SIXENSESDK_sixense_utils_SHARED_RELEASE} ) surgsim_copy_to_target_directory_for_debug(SixenseDeviceTest ${SIXENSESDK_sixense_SHARED_DEBUG} ${SIXENSESDK_sixense_utils_SHARED_DEBUG} ${SIXENSESDK_DeviceDLL_SHARED_DEBUG} # crazy debug-only dependency ) set_target_properties(SixenseDeviceTest PROPERTIES FOLDER "Devices") opensurgsim-0.7.0/SurgSim/Devices/Sixense/UnitTests/SixenseDeviceTest.cpp000066400000000000000000000225251277777236100265570ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the SixenseDevice class. #include #include #include #include #include #include "SurgSim/Devices/Sixense/SixenseDevice.h" //#include "SurgSim/Devices/Sixense/SixenseScaffold.h" // only needed if calling SixenseScaffold::setDefaultLogLevel() #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Matrix.h" #include "SurgSim/Testing/MockInputOutput.h" using SurgSim::Devices::SixenseDevice; using SurgSim::Devices::SixenseScaffold; using SurgSim::DataStructures::DataGroup; using SurgSim::Math::RigidTransform3d; using SurgSim::Math::Matrix44d; using SurgSim::Testing::MockInputOutput; TEST(SixenseDeviceTest, CreateUninitializedDevice) { //SixenseScaffold::setDefaultLogLevel(SurgSim::Framework::LOG_LEVEL_DEBUG); std::shared_ptr device = std::make_shared("TestSixense"); ASSERT_TRUE(device != nullptr) << "Device creation failed."; } TEST(SixenseDeviceTest, CreateAndInitializeDevice) { //SixenseScaffold::setDefaultLogLevel(SurgSim::Framework::LOG_LEVEL_DEBUG); std::shared_ptr device = std::make_shared("TestSixense"); ASSERT_TRUE(device != nullptr) << "Device creation failed."; EXPECT_FALSE(device->isInitialized()); ASSERT_TRUE(device->initialize()) << "Initialization failed. Is a Sixense/Hydra device plugged in?"; EXPECT_TRUE(device->isInitialized()); } TEST(SixenseDeviceTest, Name) { //SixenseScaffold::setDefaultLogLevel(SurgSim::Framework::LOG_LEVEL_DEBUG); std::shared_ptr device = std::make_shared("TestSixense"); ASSERT_TRUE(device != nullptr) << "Device creation failed."; EXPECT_EQ("TestSixense", device->getName()); EXPECT_TRUE(device->initialize()) << "Initialization failed. Is a Sixense/Hydra device plugged in?"; EXPECT_EQ("TestSixense", device->getName()); } TEST(SixenseDeviceTest, CreateDeviceSeveralTimes) { //SixenseScaffold::setDefaultLogLevel(SurgSim::Framework::LOG_LEVEL_DEBUG); for (int i = 0; i < 6; ++i) { std::shared_ptr device = std::make_shared("TestSixense"); ASSERT_TRUE(device != nullptr) << "Device creation failed."; ASSERT_TRUE(device->initialize()) << "Initialization failed. Is a Sixense/Hydra device plugged in?"; // the device will be destroyed here } } TEST(SixenseDeviceTest, CreateSeveralDevices) { //SixenseScaffold::setDefaultLogLevel(SurgSim::Framework::LOG_LEVEL_DEBUG); std::shared_ptr device1 = std::make_shared("Sixense1"); ASSERT_TRUE(device1 != nullptr) << "Device creation failed."; ASSERT_TRUE(device1->initialize()) << "Initialization failed. Is a Sixense/Hydra device plugged in?"; std::shared_ptr device2 = std::make_shared("Sixense2"); ASSERT_TRUE(device2 != nullptr) << "Device creation failed."; ASSERT_TRUE(device2->initialize()) << "Initialization failed for second controller." << " Is only one controller plugged in?"; // We can't check what happens with the scaffolds, since those are no longer a part of the device's API... std::shared_ptr device3 = std::make_shared("Sixense3"); ASSERT_TRUE(device3 != nullptr) << "Device creation failed."; if (! device3->initialize()) { std::cerr << "[Warning: third Sixense/Hydra controller did not come up; is it plugged in?]" << std::endl; } } TEST(SixenseDeviceTest, CreateDevicesWithSameName) { //SixenseScaffold::setDefaultLogLevel(SurgSim::Framework::LOG_LEVEL_DEBUG); std::shared_ptr device1 = std::make_shared("Sixense"); ASSERT_TRUE(device1 != nullptr) << "Device creation failed."; ASSERT_TRUE(device1->initialize()) << "Initialization failed. Is a Sixense/Hydra device plugged in?"; std::shared_ptr device2 = std::make_shared("Sixense"); ASSERT_TRUE(device2 != nullptr) << "Device creation failed."; ASSERT_FALSE(device2->initialize()) << "Initialization succeeded despite duplicate name."; } // Create a string representation from an int. // C++11 adds std::to_string() to do this for various types, but VS2010 only half-supports that. template inline std::string makeString(T value) { std::ostringstream out; out << value; return out.str(); } TEST(SixenseDeviceTest, CreateAllDevices) { //SixenseScaffold::setDefaultLogLevel(SurgSim::Framework::LOG_LEVEL_DEBUG); std::vector> devices; for (int i = 1; ; ++i) { std::string name = "Sixense" + makeString(i); std::shared_ptr device = std::make_shared(name); ASSERT_TRUE(device != nullptr) << "Device creation failed."; if (! device->initialize()) { break; } devices.emplace_back(std::move(device)); } std::cout << devices.size() << " devices initialized." << std::endl; ASSERT_GT(devices.size(), 0U) << "Initialization failed. Is a Sixense/Hydra device plugged in?"; EXPECT_GT(devices.size(), 1U) << "Controller #2 initialization failed. Is only one controller plugged in?"; } TEST(SixenseDeviceTest, InputConsumer) { //SixenseScaffold::setDefaultLogLevel(SurgSim::Framework::LOG_LEVEL_DEBUG); std::shared_ptr device = std::make_shared("TestSixense"); ASSERT_TRUE(device != nullptr) << "Device creation failed."; ASSERT_TRUE(device->initialize()) << "Initialization failed. Is a Sixense/Hydra device plugged in?"; std::shared_ptr consumer = std::make_shared(); EXPECT_EQ(0, consumer->m_numTimesInitializedInput); EXPECT_EQ(0, consumer->m_numTimesReceivedInput); EXPECT_FALSE(device->removeInputConsumer(consumer)); EXPECT_EQ(0, consumer->m_numTimesInitializedInput); EXPECT_EQ(0, consumer->m_numTimesReceivedInput); EXPECT_TRUE(device->addInputConsumer(consumer)); // Adding the same input consumer again should fail. EXPECT_FALSE(device->addInputConsumer(consumer)); // Sleep for a second, to see how many times the consumer is invoked. // (A Sixense device updates internally at 60Hz, but our code currently runs at 120Hz to reduce latency.) boost::this_thread::sleep_until(boost::chrono::steady_clock::now() + boost::chrono::milliseconds(1000)); EXPECT_TRUE(device->removeInputConsumer(consumer)); // Removing the same input consumer again should fail. EXPECT_FALSE(device->removeInputConsumer(consumer)); // Check the number of invocations. EXPECT_EQ(1, consumer->m_numTimesInitializedInput); EXPECT_GE(consumer->m_numTimesReceivedInput, 100); EXPECT_LE(consumer->m_numTimesReceivedInput, 140); EXPECT_TRUE(consumer->m_lastReceivedInput.poses().hasData(SurgSim::DataStructures::Names::POSE)); EXPECT_TRUE(consumer->m_lastReceivedInput.scalars().hasData("trigger")); EXPECT_TRUE(consumer->m_lastReceivedInput.scalars().hasData("joystickX")); EXPECT_TRUE(consumer->m_lastReceivedInput.scalars().hasData("joystickY")); EXPECT_TRUE(consumer->m_lastReceivedInput.booleans().hasData("buttonTrigger")); EXPECT_TRUE(consumer->m_lastReceivedInput.booleans().hasData("buttonBumper")); EXPECT_TRUE(consumer->m_lastReceivedInput.booleans().hasData(SurgSim::DataStructures::Names::BUTTON_1)); EXPECT_TRUE(consumer->m_lastReceivedInput.booleans().hasData(SurgSim::DataStructures::Names::BUTTON_2)); EXPECT_TRUE(consumer->m_lastReceivedInput.booleans().hasData(SurgSim::DataStructures::Names::BUTTON_3)); EXPECT_TRUE(consumer->m_lastReceivedInput.booleans().hasData(SurgSim::DataStructures::Names::BUTTON_4)); EXPECT_TRUE(consumer->m_lastReceivedInput.booleans().hasData("buttonStart")); EXPECT_TRUE(consumer->m_lastReceivedInput.booleans().hasData("buttonJoystick")); } TEST(SixenseDeviceTest, OutputProducer) { //SixenseScaffold::setDefaultLogLevel(SurgSim::Framework::LOG_LEVEL_DEBUG); std::shared_ptr device = std::make_shared("TestSixense"); ASSERT_TRUE(device != nullptr) << "Device creation failed."; ASSERT_TRUE(device->initialize()) << "Initialization failed. Is a Sixense/Hydra device plugged in?"; std::shared_ptr producer = std::make_shared(); EXPECT_EQ(0, producer->m_numTimesRequestedOutput); EXPECT_FALSE(device->removeOutputProducer(producer)); EXPECT_EQ(0, producer->m_numTimesRequestedOutput); EXPECT_TRUE(device->setOutputProducer(producer)); // Sleep for a second, to see how many times the producer is invoked. // (A Sixense device is does not request any output.) boost::this_thread::sleep_until(boost::chrono::steady_clock::now() + boost::chrono::milliseconds(1000)); EXPECT_TRUE(device->removeOutputProducer(producer)); // Removing the same input producer again should fail. EXPECT_FALSE(device->removeOutputProducer(producer)); // Check the number of invocations. EXPECT_EQ(0, producer->m_numTimesRequestedOutput); } opensurgsim-0.7.0/SurgSim/Devices/Sixense/UnitTests/SixenseScaffoldTest.cpp000066400000000000000000000164341277777236100271030ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the SixenseScaffold class and its device interactions. #include #include #include #include #include #include "SurgSim/Devices/Sixense/SixenseDevice.h" #include "SurgSim/Devices/Sixense/SixenseScaffold.h" #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Matrix.h" using SurgSim::Devices::SixenseDevice; using SurgSim::Devices::SixenseScaffold; TEST(SixenseScaffoldTest, CreateAndDestroyScaffold) { //SixenseScaffold::setDefaultLogLevel(SurgSim::Framework::LOG_LEVEL_DEBUG); std::shared_ptr scaffold = SixenseScaffold::getOrCreateSharedInstance(); ASSERT_NE(nullptr, scaffold) << "The scaffold was not created!"; std::weak_ptr scaffold1 = scaffold; { std::shared_ptr stillHaveScaffold = scaffold1.lock(); EXPECT_NE(nullptr, stillHaveScaffold) << "Unable to get scaffold from weak ref (while strong ref exists)"; EXPECT_EQ(scaffold, stillHaveScaffold) << "Scaffold mismatch!"; } { std::shared_ptr sameScaffold = SixenseScaffold::getOrCreateSharedInstance(); EXPECT_NE(nullptr, sameScaffold) << "Unable to get scaffold from class"; EXPECT_EQ(scaffold, sameScaffold) << "Scaffold mismatch!"; } scaffold.reset(); { std::shared_ptr dontHaveScaffold = scaffold1.lock(); EXPECT_EQ(nullptr, dontHaveScaffold) << "Able to get scaffold from weak ref (with no strong ref)"; } scaffold = SixenseScaffold::getOrCreateSharedInstance(); ASSERT_NE(nullptr, scaffold) << "The scaffold was not created the 2nd time!"; std::weak_ptr scaffold2 = scaffold; { std::shared_ptr stillHaveScaffold = scaffold2.lock(); ASSERT_NE(nullptr, stillHaveScaffold) << "Unable to get scaffold from weak ref (while strong ref exists)"; ASSERT_EQ(scaffold, stillHaveScaffold) << "Scaffold mismatch!"; } } TEST(SixenseScaffoldTest, ScaffoldLifeCycle) { //SixenseScaffold::setDefaultLogLevel(SurgSim::Framework::LOG_LEVEL_DEBUG); std::weak_ptr lastScaffold; { std::shared_ptr scaffold = SixenseScaffold::getOrCreateSharedInstance(); ASSERT_NE(nullptr, scaffold) << "The scaffold was not created!"; lastScaffold = scaffold; } { std::shared_ptr dontHaveScaffold = lastScaffold.lock(); EXPECT_EQ(nullptr, dontHaveScaffold) << "Able to get scaffold from weak ref (with no strong ref)"; lastScaffold.reset(); } { std::shared_ptr device = std::make_shared("TestSixense"); ASSERT_NE(nullptr, device) << "Creation failed. Is a Sixense/Hydra device plugged in?"; // note: the device is NOT initialized! { std::shared_ptr scaffold = SixenseScaffold::getOrCreateSharedInstance(); EXPECT_NE(nullptr, scaffold) << "The scaffold was not retrieved!"; lastScaffold = scaffold; // save the scaffold for later std::shared_ptr sameScaffold = lastScaffold.lock(); EXPECT_NE(nullptr, sameScaffold); EXPECT_EQ(scaffold, sameScaffold); } // The device has not been initialized, so it should NOT be hanging on to the device! { std::shared_ptr deadScaffold = lastScaffold.lock(); EXPECT_EQ(nullptr, deadScaffold); } // the ("empty") device is about to get destroyed } { std::shared_ptr device = std::make_shared("TestSixense"); ASSERT_NE(nullptr, device) << "Device creation failed."; ASSERT_TRUE(device->initialize()) << "Initialization failed. Is a Sixense/Hydra device plugged in?"; { std::shared_ptr scaffold = SixenseScaffold::getOrCreateSharedInstance(); EXPECT_NE(nullptr, scaffold) << "The scaffold was not retrieved!"; lastScaffold = scaffold; // save the scaffold for later std::shared_ptr sameScaffold = lastScaffold.lock(); EXPECT_NE(nullptr, sameScaffold); EXPECT_EQ(scaffold, sameScaffold); } // The same scaffold is supposed to still be around because of the device { std::shared_ptr sameScaffold = lastScaffold.lock(); EXPECT_NE(nullptr, sameScaffold); std::shared_ptr scaffold = SixenseScaffold::getOrCreateSharedInstance(); EXPECT_NE(nullptr, scaffold) << "The scaffold was not retrieved!"; EXPECT_EQ(sameScaffold, scaffold); } // the device and the scaffold are about to get destroyed } { std::shared_ptr deadScaffold = lastScaffold.lock(); EXPECT_EQ(nullptr, deadScaffold); } { std::shared_ptr device = std::make_shared("TestSixense"); ASSERT_NE(nullptr, device) << "Device creation failed."; ASSERT_TRUE(device->initialize()) << "Initialization failed. Didn't this work a moment ago?"; std::shared_ptr scaffold = SixenseScaffold::getOrCreateSharedInstance(); EXPECT_NE(nullptr, scaffold) << "The scaffold was not retrieved!"; std::shared_ptr deadScaffold = lastScaffold.lock(); EXPECT_EQ(nullptr, deadScaffold); } } TEST(SixenseScaffoldTest, CreateDeviceSeveralTimes) { //SixenseScaffold::setDefaultLogLevel(SurgSim::Framework::LOG_LEVEL_DEBUG); std::weak_ptr lastScaffold; for (int i = 0; i < 6; ++i) { SCOPED_TRACE(i); EXPECT_EQ(nullptr, lastScaffold.lock()); std::shared_ptr device = std::make_shared("TestSixense"); ASSERT_NE(nullptr, device) << "Device creation failed."; ASSERT_TRUE(device->initialize()) << "Initialization failed. Is a Sixense/Hydra device plugged in?"; std::shared_ptr scaffold = SixenseScaffold::getOrCreateSharedInstance(); ASSERT_NE(nullptr, scaffold) << "The scaffold was not retrieved!"; lastScaffold = scaffold; // the device and the scaffold will be destroyed here } } TEST(SixenseScaffoldTest, CreateDeviceSeveralTimesWithScaffoldRef) { //SixenseScaffold::setDefaultLogLevel(SurgSim::Framework::LOG_LEVEL_DEBUG); std::shared_ptr lastScaffold; for (int i = 0; i < 6; ++i) { SCOPED_TRACE(i); std::shared_ptr device = std::make_shared("TestSixense"); ASSERT_NE(nullptr, device) << "Device creation failed."; ASSERT_TRUE(device->initialize()) << "Initialization failed. Is a Sixense/Hydra device plugged in?"; std::shared_ptr scaffold = SixenseScaffold::getOrCreateSharedInstance(); ASSERT_NE(nullptr, scaffold) << "The scaffold was not retrieved!"; if (! lastScaffold) { lastScaffold = scaffold; } EXPECT_EQ(lastScaffold, scaffold); // the device will be destroyed here, but the scaffold stays around because we have a shared_ptr to it. } } opensurgsim-0.7.0/SurgSim/Devices/Sixense/VisualTest/000077500000000000000000000000001277777236100226105ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Devices/Sixense/VisualTest/CMakeLists.txt000066400000000000000000000025561277777236100253600ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. set(EXAMPLE_SOURCES main.cpp ) set(EXAMPLE_HEADERS ) surgsim_add_executable(SixenseVisualTest "${EXAMPLE_SOURCES}" "${EXAMPLE_HEADERS}" ) set(LIBS IdentityPoseDevice SixenseDevice SurgSimInput VisualTestCommon ) target_link_libraries(SixenseVisualTest ${LIBS}) # Copy the device DLLs into the build directory surgsim_copy_to_target_directory_for_release(SixenseVisualTest ${SIXENSESDK_sixense_SHARED_RELEASE} ${SIXENSESDK_sixense_utils_SHARED_RELEASE} ) surgsim_copy_to_target_directory_for_debug(SixenseVisualTest ${SIXENSESDK_sixense_SHARED_DEBUG} ${SIXENSESDK_sixense_utils_SHARED_DEBUG} ${SIXENSESDK_DeviceDLL_SHARED_DEBUG} # crazy debug-only dependency ) set_target_properties(SixenseVisualTest PROPERTIES FOLDER "Devices") opensurgsim-0.7.0/SurgSim/Devices/Sixense/VisualTest/main.cpp000066400000000000000000000032471277777236100242460ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Input/DeviceInterface.h" #include "SurgSim/Devices/Sixense/SixenseDevice.h" #include "SurgSim/Devices/IdentityPoseDevice/IdentityPoseDevice.h" #include "SurgSim/Testing/VisualTestCommon/ToolSquareTest.h" using SurgSim::Input::DeviceInterface; using SurgSim::Devices::SixenseDevice; using SurgSim::Devices::IdentityPoseDevice; int main(int argc, char** argv) { std::shared_ptr toolDevice = std::make_shared("SixenseDevice1"); std::shared_ptr squareDevice = std::make_shared("SixenseDevice2"); runToolSquareTest(toolDevice, squareDevice, //2345678901234567890123456789012345678901234567890123456789012345678901234567890 "Move the Razer Hydra controllers, but keep them above the base unit!\n" "\n" "One controller will control the sphere tool, the other the square."); std::cout << std::endl << "Exiting." << std::endl; // Cleanup and shutdown will happen automatically as objects go out of scope. return 0; } opensurgsim-0.7.0/SurgSim/Devices/TrackIR/000077500000000000000000000000001277777236100203665ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Devices/TrackIR/CMakeLists.txt000066400000000000000000000036071277777236100231340ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. find_package(OptiTrack REQUIRED) include_directories( "${CMAKE_CURRENT_SOURCE_DIR}" "${OPENSCENEGRAPH_INCLUDE_DIR}" "${OPTITRACK_INCLUDE_DIR}" ) set(LIBS ${OPTITRACK_LIBRARY} ) set(TRACKIR_DEVICE_SOURCES TrackIRDevice.cpp TrackIRThread.cpp ) set(TRACKIR_DEVICE_HEADERS TrackIRDevice.h TrackIRScaffold.h TrackIRThread.h ) set(DEVICE_HEADERS ${DEVICE_HEADERS} TrackIR/TrackIRDevice.h PARENT_SCOPE) set(TRACKIR_DEVICE_LINUX_SOURCES linux/TrackIRScaffold.cpp ) set(TRACKIR_DEVICE_WIN_SOURCES win32/TrackIRScaffold.cpp ) if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux") list(APPEND TRACKIR_DEVICE_SOURCES ${TRACKIR_DEVICE_LINUX_SOURCES}) else() list(APPEND TRACKIR_DEVICE_SOURCES ${TRACKIR_DEVICE_WIN_SOURCES}) endif() surgsim_add_library( TrackIRDevice "${TRACKIR_DEVICE_SOURCES}" "${TRACKIR_DEVICE_HEADERS}" ) target_link_libraries(TrackIRDevice ${LIBS}) if(BUILD_TESTING) # The unit tests will be built whenever the library is built. add_subdirectory(UnitTests) if(GLUT_FOUND) add_subdirectory(VisualTest) endif(GLUT_FOUND) endif() # Natural Point Camera SDK needs this preprocessor definition to work properly add_definitions( -DCAMERALIBRARY_IMPORTS ) # Put TrackIRDevice into folder "Devices" set_target_properties(TrackIRDevice PROPERTIES FOLDER "Devices") opensurgsim-0.7.0/SurgSim/Devices/TrackIR/TrackIR.dox000066400000000000000000000022731277777236100224050ustar00rootroot00000000000000/*! \page TrackIR TrackIR: Optical Tracker NaturalPoint's product list contains various motion capture cameras/systems to measure position and orientation of tracked objects. Supported devices: - Linux: - NaturalPoint's TrackIR is tested. Other devices supported by linux-track (SmartNav, Wiimote, and some webcams) may work https://code.google.com/p/linux-track/wiki/InputDevices - Windows: - NaturalPoint's TrackIR is tested. All OptiTrack and SmartNav models are expected to work. Dependencies: - Linux: Requires linuxtrack https://code.google.com/p/linux-track/ - Change file 51-TIR.rules to (replace the "simquest" with your group name): SUBSYSTEM=="usb", ATTRS{idVendor}=="131d", GROUP="simquest", MODE="0666" - Then move it to /lib/udev/rules.d/ and restart the udev service. - Run ltr_gui (requires Wine). - (Probably optional) An environment variable named NP_CAMERASDK may be set to the directory containing (include/)linuxtrack.h - Windows: Requires NaturalPoint's Camera SDK https://www.naturalpoint.com/optitrack/downloads/developer-tools.html - An environment variable named NP_CAMERASDK must be set to the directory containing (include\\)cameralibrary.h */opensurgsim-0.7.0/SurgSim/Devices/TrackIR/TrackIRDevice.cpp000066400000000000000000000050351277777236100235140ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Devices/TrackIR/TrackIRDevice.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Devices/TrackIR/TrackIRScaffold.h" namespace SurgSim { namespace Devices { SURGSIM_REGISTER(SurgSim::Input::DeviceInterface, SurgSim::Devices::TrackIRDevice, TrackIRDevice); TrackIRDevice::TrackIRDevice(const std::string& uniqueName) : SurgSim::Input::CommonDevice(uniqueName, TrackIRScaffold::buildDeviceInputData()), m_positionScale(1.0), m_orientationScale(1.0) { } TrackIRDevice::~TrackIRDevice() { if (isInitialized()) { finalize(); } } bool TrackIRDevice::initialize() { SURGSIM_ASSERT(!isInitialized()) << "TrackIR device already initialized."; auto scaffold = TrackIRScaffold::getOrCreateSharedInstance(); SURGSIM_ASSERT(scaffold != nullptr) << "TrackIRDevice::initialize(): Failed to obtain a TrackIR scaffold."; bool initialize = false; if (scaffold->registerDevice(this)) { m_scaffold = std::move(scaffold); initialize = true; } return initialize; } bool TrackIRDevice::finalize() { SURGSIM_ASSERT(isInitialized()) << "TrackIR device already finalized."; bool ok = m_scaffold->unregisterDevice(this); m_scaffold.reset(); return ok; } bool TrackIRDevice::isInitialized() const { return (nullptr != m_scaffold); } void TrackIRDevice::setPositionScale(double scale) { m_positionScale = scale; if (m_scaffold) { m_scaffold->setPositionScale(this, m_positionScale); } } double TrackIRDevice::getPositionScale() const { return m_positionScale; } void TrackIRDevice::setOrientationScale(double scale) { m_orientationScale = scale; if (m_scaffold) { m_scaffold->setOrientationScale(this, m_orientationScale); } } double TrackIRDevice::getOrientationScale() const { return m_orientationScale; } double TrackIRDevice::defaultPositionScale() { return 1.0; } double TrackIRDevice::defaultOrientationScale() { return 1.0; } }; // namespace Devices }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Devices/TrackIR/TrackIRDevice.h000066400000000000000000000065021277777236100231610ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DEVICES_TRACKIR_TRACKIRDEVICE_H #define SURGSIM_DEVICES_TRACKIR_TRACKIRDEVICE_H #include #include #include "SurgSim/Input/CommonDevice.h" namespace SurgSim { namespace Devices { class TrackIRScaffold; SURGSIM_STATIC_REGISTRATION(TrackIRDevice); /// A class implementing the communication with Natural Point TrackIR camera. /// Z is the direction that the camera faces. /// Y is in the direction of the camera's up. /// X is the direction to the camera's left (making a right-hand coordinate system). /// \par Application input provided by the device: /// | type | name | | /// | ---- | ---- | --- | /// | pose | "pose" | %Device pose (units are meters). | /// /// \par Application output used by the device: none. /// /// \sa SurgSim::Input::CommonDevice, SurgSim::Input::DeviceInterface class TrackIRDevice : public SurgSim::Input::CommonDevice { public: /// Constructor. /// \param uniqueName A unique name for the device. explicit TrackIRDevice(const std::string& uniqueName); SURGSIM_CLASSNAME(SurgSim::Devices::TrackIRDevice); /// Destructor. virtual ~TrackIRDevice(); bool initialize() override; bool isInitialized() const override; /// Sets the position scale for this device. /// The position scale controls how much the pose changes for a given device translation. /// The default value for a raw device tries to correspond to the actual physical motion of the device. void setPositionScale(double scale); /// Gets the position scale for this device. double getPositionScale() const; /// Sets the orientation scale for this device. /// The orientation scale controls how much the pose changes for a given device rotation. /// The default value for a raw device tries to correspond to the actual physical motion of the device. void setOrientationScale(double scale); /// Gets the orientation scale for this device. double getOrientationScale() const; private: friend class TrackIRScaffold; bool finalize() override; // Returns the default position scale static double defaultPositionScale(); // Returns the default rotation scale static double defaultOrientationScale(); /// Scale factor for the position axes; stored locally before the device is initialized. double m_positionScale; /// Scale factor for the orientation axes; stored locally before the device is initialized. double m_orientationScale; /// Communication with hardware is handled by scaffold. std::shared_ptr m_scaffold; }; }; // namespace Devices }; // namespace SurgSim #endif // SURGSIM_DEVICES_TRACKIR_TRACKIRDEVICE_H opensurgsim-0.7.0/SurgSim/Devices/TrackIR/TrackIRScaffold.h000066400000000000000000000105631277777236100235050ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DEVICES_TRACKIR_TRACKIRSCAFFOLD_H #define SURGSIM_DEVICES_TRACKIR_TRACKIRSCAFFOLD_H #include #include "SurgSim/Framework/Logger.h" namespace SurgSim { namespace DataStructures { class DataGroup; } namespace Devices { class TrackIRDevice; /// A class that manages Natural Point TRACKIR devices. /// /// \sa SurgSim::Devices::TrackIRDevice class TrackIRScaffold { public: /// Constructor. TrackIRScaffold(); /// Destructor. ~TrackIRScaffold(); /// Gets or creates the scaffold shared by all TrackIRDevice instances. /// The scaffold is managed using a SharedInstance object, so it will be destroyed when all devices are released. /// \return the scaffold object. static std::shared_ptr getOrCreateSharedInstance(); private: /// Internal shared state data type. struct StateData; /// Internal per-device information. struct DeviceData; friend class TrackIRDevice; friend class TrackIRThread; friend struct StateData; /// Registers the specified device object. /// If successful, the device object will become connected to an unused controller. /// /// \param device The device object to be used, which should have a unique name. /// \return True if the initialization succeeds, false if it fails. bool registerDevice(TrackIRDevice* device); /// Unregisters the specified device object. /// The corresponding controller will become unused, and can be re-registered later. /// /// \param device The device object. /// \return true on success, false on failure. bool unregisterDevice(const TrackIRDevice* device); /// Sets the position scale for the device. /// \param device The device whose position scale will be set. /// \param scale Scale of the position. void setPositionScale(const TrackIRDevice* device, double scale); /// Sets the orientation scale for the device. /// \param device The device whose orientation scale will be set. /// \param scale Scale of the orientation. void setOrientationScale(const TrackIRDevice* device, double scale); /// Initializes the OptiTrack SDK. /// \return true on success. bool initializeSdk(); /// Finalizes (de-initializes) the OptiTrack SDK. /// \return true on success. bool finalizeSdk(); /// Start the camera, it will start sending frames. /// \param info DeviceData object which contains the camera to be started. /// \return true on success. bool startCamera(DeviceData* info); /// Stop the camera, it will stop sending frames. /// \param info DeviceData object which contains the camera to be stopped. /// \return true on success. bool stopCamera(DeviceData* info); /// Executes the operations for a single input frame for a single device. /// Should only be called from the context of the input loop thread. /// \param info The internal device data. /// \return true on success. bool runInputFrame(DeviceData* info); /// Updates the device information for a single device. /// \param info The device data. /// \return true on success. bool updateDevice(DeviceData* info); /// Creates a thread for the given DeviceData object /// \param data A DeviceData object /// \return true on success. bool createPerDeviceThread(DeviceData* data); /// Destroys the thread associated with the given DeviceData object /// \param data A DeviceData object /// \return true on success. bool destroyPerDeviceThread(DeviceData* data); /// Builds the data layout for the application input (i.e. device output). static SurgSim::DataStructures::DataGroup buildDeviceInputData(); /// Logger used by the scaffold and all devices. std::shared_ptr m_logger; /// Internal scaffold state. std::unique_ptr m_state; }; }; // namespace Devices }; // namespace SurgSim #endif // SURGSIM_DEVICES_TRACKIR_TRACKIRSCAFFOLD_H opensurgsim-0.7.0/SurgSim/Devices/TrackIR/TrackIRThread.cpp000066400000000000000000000024101277777236100235160ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Devices/TrackIR/TrackIRThread.h" #include "SurgSim/Devices/TrackIR/TrackIRScaffold.h" namespace SurgSim { namespace Devices { TrackIRThread::TrackIRThread(TrackIRScaffold* scaffold, TrackIRScaffold::DeviceData* deviceData) : BasicThread("TrackIR thread"), m_scaffold(scaffold), m_deviceData(deviceData) { setRate(100.0); } TrackIRThread::~TrackIRThread() { } bool TrackIRThread::doInitialize() { return true; } bool TrackIRThread::doStartUp() { return true; } bool TrackIRThread::doUpdate(double dt) { return m_scaffold->runInputFrame(m_deviceData); } }; // namespace Devices }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Devices/TrackIR/TrackIRThread.h000066400000000000000000000042011277777236100231630ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_DEVICES_TRACKIR_TRACKIRTHREAD_H #define SURGSIM_DEVICES_TRACKIR_TRACKIRTHREAD_H #include "SurgSim/Framework/BasicThread.h" #include "SurgSim/Devices/TrackIR/TrackIRScaffold.h" namespace SurgSim { namespace Devices { /// A class implementing the thread context for sampling TrackIR devices. /// \sa SurgSim::Devices::TrackIRScaffold class TrackIRThread : public SurgSim::Framework::BasicThread { public: /// Constructor /// TrackIR sample rate: 120FPS. /// Default update rate is set by BasicThread constructor to 30Hz /// \param scaffold The TrackIRScaffold updated by this thread /// \param deviceData Corresponds to the TrackIRScaffold::DeviceData updated by this thread TrackIRThread(TrackIRScaffold* scaffold, TrackIRScaffold::DeviceData* deviceData); /// Destructor virtual ~TrackIRThread(); protected: /// Initialize this thread. /// \return True on success, false otherwise. bool doInitialize() override; /// Start up this thread. /// \return True on success, false otherwise. bool doStartUp() override; /// Update work of this thread. /// \param dt The time step. /// \return True on success, false otherwise. bool doUpdate(double dt) override; private: // Pointer to the scaffold which will be updated by this thread. TrackIRScaffold* m_scaffold; // Pointer to the DeviceData object which will be updated by the scaffold. TrackIRScaffold::DeviceData* m_deviceData; }; }; // namespace Devices }; // namespace SurgSim #endif // SURGSIM_DEVICES_TRACKIR_TRACKIRTHREAD_H opensurgsim-0.7.0/SurgSim/Devices/TrackIR/UnitTests/000077500000000000000000000000001277777236100223305ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Devices/TrackIR/UnitTests/CMakeLists.txt000066400000000000000000000031771277777236100251000ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2012-2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. include_directories( ${gtest_SOURCE_DIR}/include ${gtest_SOURCE_DIR} ) set(UNIT_TEST_SOURCES TrackIRDeviceTest.cpp TrackIRScaffoldTest.cpp ) set(UNIT_TEST_HEADERS ) set(LIBS TrackIRDevice SurgSimInput SurgSimFramework SurgSimDataStructures gmock gtest ${Boost_LIBRARIES} ${OPTITRACK_LIBRARY} ) # The unit tests will be built whenever the library is built, but # running them at build time requires hardware and is disabled by # default. option(SURGSIM_TESTS_RUN_DEVICE_TRACKIR "Run the TrackIR tests as part of unit tests. (Requires hardware and OptiTrack!)" OFF) surgsim_add_unit_tests(TrackIRDeviceTest RUN ${SURGSIM_TESTS_RUN_DEVICE_TRACKIR}) # Copy the device DLLs into the build directory surgsim_copy_to_target_directory_for_release(TrackIRDeviceTest ${OPTITRACK_SHARED_RELEASE} ) surgsim_copy_to_target_directory_for_debug(TrackIRDeviceTest ${OPTITRACK_SHARED_DEBUG} ) # Put TrackIRDeviceTest into folder "Devices" set_target_properties(TrackIRDeviceTest PROPERTIES FOLDER "Devices")opensurgsim-0.7.0/SurgSim/Devices/TrackIR/UnitTests/TrackIRDeviceTest.cpp000066400000000000000000000072641277777236100263240ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the TrackIRDevice class. #include #include #include #include #include #include "SurgSim/Devices/TrackIR/TrackIRDevice.h" #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/Input/InputConsumerInterface.h" #include "SurgSim/Testing/MockInputOutput.h" using SurgSim::Devices::TrackIRDevice; using SurgSim::DataStructures::DataGroup; using SurgSim::Input::InputConsumerInterface; using SurgSim::Testing::MockInputOutput; TEST(TrackIRDeviceTest, CreateAndInitializeDevice) { std::shared_ptr device = std::make_shared("TrackIR"); ASSERT_TRUE(nullptr != device) << "Device creation failed."; EXPECT_FALSE(device->isInitialized()); EXPECT_EQ("TrackIR", device->getName()); ASSERT_TRUE(device->initialize()) << "Initialization failed. Is a TrackIR device plugged in?"; EXPECT_TRUE(device->isInitialized()); EXPECT_EQ("TrackIR", device->getName()); } TEST(TrackIRDeviceTest, CreateDevicesWithSameName) { std::shared_ptr device1 = std::make_shared("TrackIR"); ASSERT_TRUE(nullptr != device1) << "Device creation failed."; ASSERT_TRUE(device1->initialize()) << "Initialization failed. Is a TrackIR device plugged in?"; std::shared_ptr device2 = std::make_shared("TrackIR"); ASSERT_TRUE(nullptr != device2) << "Device creation failed."; ASSERT_ANY_THROW(device2->initialize()) << "Initialization succeeded despite duplicate name."; } TEST(TrackIRDeviceTest, RegisterMoreThanOneDevice) { std::shared_ptr device1 = std::make_shared("TrackIR"); ASSERT_TRUE(nullptr != device1) << "Device creation failed."; ASSERT_TRUE(device1->initialize()) << "Initialization failed. Is a TrackIR device plugged in?"; std::shared_ptr device2 = std::make_shared("TrackIR2"); ASSERT_TRUE(nullptr != device2) << "Device creation failed."; ASSERT_ANY_THROW(device2->initialize()) << "Two TrackIR cameras are registered."; } TEST(TrackIRDeviceTest, InputConsumer) { std::shared_ptr device = std::make_shared("TrackIR"); ASSERT_TRUE(nullptr != device) << "Device creation failed."; EXPECT_TRUE(device->initialize()) << "Initialization failed. Is a TrackIR device plugged in?"; std::shared_ptr consumer = std::make_shared(); EXPECT_EQ(0, consumer->m_numTimesReceivedInput); EXPECT_TRUE(device->addInputConsumer(consumer)); // Sleep for one second, to see how many times the consumer is invoked. // (TrackIR device sample rate is 120FPS.) // (The thread to poll data out of TrackIR is running at default 100Hz.) boost::this_thread::sleep_until(boost::chrono::steady_clock::now() + boost::chrono::milliseconds(1000)); EXPECT_TRUE(device->removeInputConsumer(consumer)); // Check the number of invocations. EXPECT_GE(consumer->m_numTimesReceivedInput, 50); EXPECT_LE(consumer->m_numTimesReceivedInput, 120); EXPECT_TRUE(consumer->m_lastReceivedInput.poses().isValid()); } opensurgsim-0.7.0/SurgSim/Devices/TrackIR/UnitTests/TrackIRScaffoldTest.cpp000066400000000000000000000154361277777236100266460ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the TrackIRScaffold class and its device interactions. #include #include #include "SurgSim/Devices/TrackIR/TrackIRDevice.h" #include "SurgSim/Devices/TrackIR/TrackIRScaffold.h" using SurgSim::Devices::TrackIRDevice; using SurgSim::Devices::TrackIRScaffold; TEST(TrackIRScaffoldTest, CreateAndDestroyScaffold) { std::shared_ptr scaffold = TrackIRScaffold::getOrCreateSharedInstance(); ASSERT_NE(nullptr, scaffold) << "The scaffold was not created!"; std::weak_ptr weakScaffold = scaffold; { std::shared_ptr stillHaveScaffold = weakScaffold.lock(); EXPECT_NE(nullptr, stillHaveScaffold) << "Unable to get scaffold from weak ref (while strong ref exists)"; EXPECT_EQ(scaffold, stillHaveScaffold) << "Scaffold mismatch!"; } { std::shared_ptr sameScaffold = TrackIRScaffold::getOrCreateSharedInstance(); EXPECT_NE(nullptr, sameScaffold) << "Unable to get scaffold from class"; EXPECT_EQ(scaffold, sameScaffold) << "Scaffold mismatch!"; } scaffold.reset(); { std::shared_ptr dontHaveScaffold = weakScaffold.lock(); EXPECT_EQ(nullptr, dontHaveScaffold) << "Able to get scaffold from weak ref (with no strong ref)"; } scaffold = TrackIRScaffold::getOrCreateSharedInstance(); ASSERT_NE(nullptr, scaffold) << "The scaffold was not created the 2nd time!"; std::weak_ptr yetAnotherWeakScaffold = scaffold; { std::shared_ptr stillHaveScaffold = yetAnotherWeakScaffold.lock(); ASSERT_NE(nullptr, stillHaveScaffold) << "Unable to get scaffold from weak ref (while strong ref exists)"; ASSERT_EQ(scaffold, stillHaveScaffold) << "Scaffold mismatch!"; } } TEST(TrackIRScaffoldTest, ScaffoldLifeCycle) { std::weak_ptr lastScaffold; { std::shared_ptr scaffold = TrackIRScaffold::getOrCreateSharedInstance(); ASSERT_NE(nullptr, scaffold) << "The scaffold was not created!"; lastScaffold = scaffold; } { std::shared_ptr dontHaveScaffold = lastScaffold.lock(); EXPECT_EQ(nullptr, dontHaveScaffold) << "Able to get scaffold from weak ref (with no strong ref)"; lastScaffold.reset(); } { std::shared_ptr device = std::make_shared("TrackIR"); ASSERT_NE(nullptr, device) << "Creation failed. Is a TrackIR device plugged in?"; // note: the device is NOT initialized! { std::shared_ptr scaffold = TrackIRScaffold::getOrCreateSharedInstance(); EXPECT_NE(nullptr, scaffold) << "The scaffold was not retrieved!"; lastScaffold = scaffold; // save the scaffold for later std::shared_ptr sameScaffold = lastScaffold.lock(); EXPECT_NE(nullptr, sameScaffold); EXPECT_EQ(scaffold, sameScaffold); } // The device has not been initialized, so it should NOT be hanging on to the device! { std::shared_ptr deadScaffold = lastScaffold.lock(); EXPECT_EQ(nullptr, deadScaffold); } // the ("empty") device is about to get destroyed } { std::shared_ptr device = std::make_shared("TrackIR"); ASSERT_NE(nullptr, device) << "Device creation failed."; ASSERT_TRUE(device->initialize()) << "Initialization failed. Is a TrackIR device plugged in?"; { std::shared_ptr scaffold = TrackIRScaffold::getOrCreateSharedInstance(); EXPECT_NE(nullptr, scaffold) << "The scaffold was not retrieved!"; lastScaffold = scaffold; // save the scaffold for later std::shared_ptr sameScaffold = lastScaffold.lock(); EXPECT_NE(nullptr, sameScaffold); EXPECT_EQ(scaffold, sameScaffold); } // The same scaffold is supposed to still be around because of the device { std::shared_ptr sameScaffold = lastScaffold.lock(); EXPECT_NE(nullptr, sameScaffold); std::shared_ptr scaffold = TrackIRScaffold::getOrCreateSharedInstance(); EXPECT_NE(nullptr, scaffold) << "The scaffold was not retrieved!"; EXPECT_EQ(sameScaffold, scaffold); } // the device and the scaffold are about to get destroyed } { std::shared_ptr deadScaffold = lastScaffold.lock(); EXPECT_EQ(nullptr, deadScaffold); } { std::shared_ptr device = std::make_shared("TrackIR"); ASSERT_NE(nullptr, device) << "Device creation failed."; ASSERT_TRUE(device->initialize()) << "Initialization failed. Didn't this work a moment ago?"; std::shared_ptr scaffold = TrackIRScaffold::getOrCreateSharedInstance(); EXPECT_NE(nullptr, scaffold) << "The scaffold was not retrieved!"; std::shared_ptr deadScaffold = lastScaffold.lock(); EXPECT_EQ(nullptr, deadScaffold); } } TEST(TrackIRScaffoldTest, CreateDeviceSeveralTimes) { std::weak_ptr lastScaffold; for (int i = 0; i < 6; ++i) { SCOPED_TRACE(i); EXPECT_EQ(nullptr, lastScaffold.lock()); std::shared_ptr device = std::make_shared("TrackIR"); ASSERT_NE(nullptr, device) << "Device creation failed."; ASSERT_TRUE(device->initialize()) << "Initialization failed. Is a TrackIR device plugged in?"; std::shared_ptr scaffold = TrackIRScaffold::getOrCreateSharedInstance(); ASSERT_NE(nullptr, scaffold) << "The scaffold was not retrieved!"; lastScaffold = scaffold; // the device and the scaffold will be destroyed here } } TEST(TrackIRScaffoldTest, CreateDeviceSeveralTimesWithScaffoldRef) { std::shared_ptr lastScaffold; for (int i = 0; i < 6; ++i) { SCOPED_TRACE(i); std::shared_ptr device = std::make_shared("TrackIR"); ASSERT_NE(nullptr, device) << "Device creation failed."; ASSERT_TRUE(device->initialize()) << "Initialization failed. Is a TrackIR device plugged in?"; std::shared_ptr scaffold = TrackIRScaffold::getOrCreateSharedInstance(); ASSERT_NE(nullptr, scaffold) << "The scaffold was not retrieved!"; if (!lastScaffold) { lastScaffold = scaffold; } EXPECT_EQ(lastScaffold, scaffold); // the device will be destroyed here, but the scaffold stays around because we have a shared_ptr to it. } } opensurgsim-0.7.0/SurgSim/Devices/TrackIR/VisualTest/000077500000000000000000000000001277777236100224715ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Devices/TrackIR/VisualTest/CMakeLists.txt000066400000000000000000000024031277777236100252300ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. set(EXAMPLE_SOURCES main.cpp ) set(EXAMPLE_HEADERS ) surgsim_add_executable(TrackIRVisualTest "${EXAMPLE_SOURCES}" "${EXAMPLE_HEADERS}") set(LIBS IdentityPoseDevice SurgSimInput TrackIRDevice VisualTestCommon ${OPTITRACK_LIBRARY} ) target_link_libraries(TrackIRVisualTest ${LIBS}) # Copy the device DLLs into the build directory surgsim_copy_to_target_directory_for_release(TrackIRVisualTest ${OPTITRACK_SHARED_RELEASE} ) surgsim_copy_to_target_directory_for_debug(TrackIRVisualTest ${OPTITRACK_SHARED_DEBUG} ) # Put TrackIRVisualTest into folder "Devices" set_target_properties(TrackIRVisualTest PROPERTIES FOLDER "Devices") opensurgsim-0.7.0/SurgSim/Devices/TrackIR/VisualTest/main.cpp000066400000000000000000000033321277777236100241220ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Input/DeviceInterface.h" #include "SurgSim/Devices/TrackIR/TrackIRDevice.h" #include "SurgSim/Devices/IdentityPoseDevice/IdentityPoseDevice.h" #include "SurgSim/Testing/VisualTestCommon/ToolSquareTest.h" using SurgSim::Input::DeviceInterface; using SurgSim::Devices::TrackIRDevice; using SurgSim::Devices::IdentityPoseDevice; int main(int argc, char** argv) { std::shared_ptr toolDevice = std::make_shared("TrackIRDevice"); // The square is controlled by a second device. For a simple test, we're using an IdentityPoseDevice-- // a pretend device that doesn't actually move. std::shared_ptr squareDevice = std::make_shared("IdentityPoseDevice"); runToolSquareTest(toolDevice, squareDevice, //2345678901234567890123456789012345678901234567890123456789012345678901234567890 "Move the TrackIR device to move the sphere tool."); std::cout << std::endl << "Exiting." << std::endl; // Cleanup and shutdown will happen automatically as objects go out of scope. return 0; } opensurgsim-0.7.0/SurgSim/Devices/TrackIR/linux/000077500000000000000000000000001277777236100215255ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Devices/TrackIR/linux/TrackIRScaffold.cpp000066400000000000000000000267421277777236100252050ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Devices/TrackIR/TrackIRScaffold.h" #include #include #include #include #include #include #include "SurgSim/Devices/TrackIR/TrackIRDevice.h" #include "SurgSim/Devices/TrackIR/TrackIRThread.h" #include "SurgSim/Framework/Assert.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Framework/SharedInstance.h" #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/DataStructures/DataGroupBuilder.h" #include "SurgSim/Math/Matrix.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Vector.h" using SurgSim::DataStructures::DataGroupBuilder; using SurgSim::Math::makeRotationMatrix; using SurgSim::Math::Matrix33d; using SurgSim::Math::RigidTransform3d; using SurgSim::Math::Vector3d; namespace SurgSim { namespace Devices { struct TrackIRScaffold::DeviceData { /// Constructor /// \param device Device to be wrapped explicit DeviceData(TrackIRDevice* device) : deviceObject(device), thread(), positionScale(TrackIRDevice::defaultPositionScale()), orientationScale(TrackIRDevice::defaultOrientationScale()) { } /// The corresponding device object. SurgSim::Devices::TrackIRDevice* const deviceObject; /// Processing thread. std::unique_ptr thread; /// Scale factor for the position axes; stored locally before the device is initialized. double positionScale; /// Scale factor for the orientation axes; stored locally before the device is initialized. double orientationScale; /// The mutex that protects the externally modifiable parameters. boost::mutex parametersMutex; private: // Prevent copy construction and copy assignment. (VS2012 does not support "= delete" yet.) DeviceData(const DeviceData&) /*= delete*/; DeviceData& operator=(const DeviceData&) /*= delete*/; }; struct TrackIRScaffold::StateData { public: /// Initialize the state. StateData() : isApiInitialized(false) { } /// True if the API has been initialized (and not finalized). bool isApiInitialized; /// The list of known devices. std::list> activeDeviceList; /// The mutex that protects the list of known devices. boost::mutex mutex; private: // Prevent copy construction and copy assignment. (VS2012 does not support "= delete" yet.) StateData(const StateData&) /*= delete*/; StateData& operator=(const StateData&) /*= delete*/; }; TrackIRScaffold::TrackIRScaffold() : m_logger(Framework::Logger::getLogger("Devices/TrackIR")), m_state(new StateData) { SURGSIM_LOG_DEBUG(m_logger) << "Shared scaffold created."; } TrackIRScaffold::~TrackIRScaffold() { // The following block controls the duration of the mutex being locked. { boost::lock_guard lock(m_state->mutex); if (!m_state->activeDeviceList.empty()) { SURGSIM_LOG_SEVERE(m_logger) << "TrackIR: Destroying scaffold while devices are active!?!"; for (auto it = std::begin(m_state->activeDeviceList); it != std::end(m_state->activeDeviceList); ++it) { stopCamera((*it).get()); if ((*it)->thread) { destroyPerDeviceThread(it->get()); } } m_state->activeDeviceList.clear(); } if (m_state->isApiInitialized) { if (!finalizeSdk()) { SURGSIM_LOG_SEVERE(m_logger) << "Finalizing TrackIR SDK failed."; } } } SURGSIM_LOG_DEBUG(m_logger) << "TrackIR: Shared scaffold destroyed."; } bool TrackIRScaffold::registerDevice(TrackIRDevice* device) { boost::lock_guard lock(m_state->mutex); if (!m_state->isApiInitialized) { if (!initializeSdk()) { SURGSIM_LOG_SEVERE(m_logger) << "Failed to initialize TrackIR SDK in TrackIRScaffold::registerDevice(). " << "Continuing without the TrackIR device."; } } // Only proceed when initializationSdk() is successful. if (m_state->isApiInitialized) { // Make sure the object is unique. auto sameObject = std::find_if(m_state->activeDeviceList.cbegin(), m_state->activeDeviceList.cend(), [device](const std::unique_ptr& info) { return info->deviceObject == device; }); SURGSIM_ASSERT(sameObject == m_state->activeDeviceList.end()) << "TrackIR: Tried to register a device" << " which is already registered!"; // Make sure the name is unique. const std::string name = device->getName(); auto sameName = std::find_if(m_state->activeDeviceList.cbegin(), m_state->activeDeviceList.cend(), [&name](const std::unique_ptr& info) { return info->deviceObject->getName() == name; }); SURGSIM_ASSERT(sameName == m_state->activeDeviceList.end()) << "TrackIR: Tried to register a device" << " when the same name is already present!"; // The handling of multiple cameras could be done in different ways, each with trade-offs. // Instead of choosing an approach now, we assert on attempting to use more than one camera. SURGSIM_ASSERT(m_state->activeDeviceList.size() < 1) << "There is already an active TrackIR camera." << " TrackIRScaffold only supports one TrackIR camera right now."; std::unique_ptr info(new DeviceData(device)); createPerDeviceThread(info.get()); SURGSIM_ASSERT(info->thread) << "Failed to create a per-device thread for TrackIR device: " << info->deviceObject->getName(); startCamera(info.get()); m_state->activeDeviceList.emplace_back(std::move(info)); SURGSIM_LOG_INFO(m_logger) << "Device " << device->getName() << " initialized."; } return m_state->isApiInitialized; } bool TrackIRScaffold::unregisterDevice(const TrackIRDevice* const device) { bool found = false; { boost::lock_guard lock(m_state->mutex); auto matching = std::find_if(m_state->activeDeviceList.begin(), m_state->activeDeviceList.end(), [device](const std::unique_ptr& info) { return info->deviceObject == device; }); if (matching != m_state->activeDeviceList.end()) { stopCamera((*matching).get()); if ((*matching)->thread) { destroyPerDeviceThread(matching->get()); } m_state->activeDeviceList.erase(matching); // the iterator is now invalid but that's OK found = true; SURGSIM_LOG_INFO(m_logger) << "Device " << device->getName() << " unregistered."; } } SURGSIM_LOG_IF(!found, m_logger, SEVERE) << "Attempted to release a non-registered device " << device->getName(); return found; } void TrackIRScaffold::setPositionScale(const TrackIRDevice* device, double scale) { boost::lock_guard lock(m_state->mutex); auto matching = std::find_if(m_state->activeDeviceList.begin(), m_state->activeDeviceList.end(), [device](const std::unique_ptr& info) { return info->deviceObject == device; }); if (matching != m_state->activeDeviceList.end()) { boost::lock_guard lock((*matching)->parametersMutex); (*matching)->positionScale = scale; } } void TrackIRScaffold::setOrientationScale(const TrackIRDevice* device, double scale) { boost::lock_guard lock(m_state->mutex); auto matching = std::find_if(m_state->activeDeviceList.begin(), m_state->activeDeviceList.end(), [device](const std::unique_ptr& info) { return info->deviceObject == device; }); if (matching != m_state->activeDeviceList.end()) { boost::lock_guard lock((*matching)->parametersMutex); (*matching)->orientationScale = scale; } } bool TrackIRScaffold::runInputFrame(TrackIRScaffold::DeviceData* info) { if (!updateDevice(info)) { return false; } info->deviceObject->pushInput(); return true; } bool TrackIRScaffold::updateDevice(TrackIRScaffold::DeviceData* info) { SurgSim::DataStructures::DataGroup& inputData = info->deviceObject->getInputData(); boost::lock_guard lock(info->parametersMutex); float x = 0.0, y = 0.0, z = 0.0, yaw = 0.0, pitch = 0.0, roll = 0.0; unsigned counter = 0; // Current camera frame number // roll: rotation around X-axis // yaw: rotation around Y-axis // pitch: rotation around Z-axis // Positions are reported in millimeters. // Angles are in radians. ltr_get_pose(&yaw, &pitch, &roll, &x, &y, &z, &counter); Vector3d position(static_cast(x) / 1000.0, static_cast(y) / 1000.0, static_cast(z) / 1000.0); // Convert millimeter to meter // Scale Position position *= info->positionScale; Matrix33d rotationX = makeRotationMatrix( info->orientationScale * static_cast(-roll), Vector3d(Vector3d::UnitX())); Matrix33d rotationY = makeRotationMatrix( info->orientationScale * static_cast(yaw), Vector3d(Vector3d::UnitY())); Matrix33d rotationZ = makeRotationMatrix( info->orientationScale * static_cast(pitch), Vector3d(Vector3d::UnitZ())); // Rotation order is intrinsic/local XYZ Matrix33d orientation = rotationX * rotationY * rotationZ; RigidTransform3d pose; pose.linear() = orientation; pose.translation() = position; inputData.poses().set(SurgSim::DataStructures::Names::POSE, pose); return true; } bool TrackIRScaffold::initializeSdk() { SURGSIM_ASSERT(!m_state->isApiInitialized) << "TrackIR API already initialized."; //Initialize the tracking using Default profile ltr_init(NULL); //Wait for TrackIR initialization ltr_state_type state; int timeout = 100; // Wait for 10 seconds before quit while(timeout > 0) { state = ltr_get_tracking_state(); if(state != RUNNING) { usleep(100000); //sleep 0.1s } else { m_state->isApiInitialized = true; break; } --timeout; }; return m_state->isApiInitialized; } bool TrackIRScaffold::finalizeSdk() { SURGSIM_ASSERT(m_state->isApiInitialized) << "TrackIR API already finalized."; ltr_shutdown(); ltr_state_type state; state = ltr_get_tracking_state(); if (state == STOPPED) { m_state->isApiInitialized = false; } return !m_state->isApiInitialized; } bool TrackIRScaffold::createPerDeviceThread(DeviceData* deviceData) { SURGSIM_ASSERT(!deviceData->thread) << "Device " << deviceData->deviceObject->getName() << " already has a thread."; std::unique_ptr thread(new TrackIRThread(this, deviceData)); thread->start(); deviceData->thread = std::move(thread); return true; } bool TrackIRScaffold::destroyPerDeviceThread(DeviceData* deviceData) { SURGSIM_ASSERT(deviceData->thread) << "No thread attached to device " << deviceData->deviceObject->getName(); std::unique_ptr thread = std::move(deviceData->thread); thread->stop(); thread.reset(); return true; } bool TrackIRScaffold::startCamera(DeviceData* info) { return true; } bool TrackIRScaffold::stopCamera(DeviceData* info) { return true; } SurgSim::DataStructures::DataGroup TrackIRScaffold::buildDeviceInputData() { DataGroupBuilder builder; builder.addPose(SurgSim::DataStructures::Names::POSE); return builder.createData(); } std::shared_ptr TrackIRScaffold::getOrCreateSharedInstance() { static SurgSim::Framework::SharedInstance sharedInstance; return sharedInstance.get(); } }; // namespace Devices }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Devices/TrackIR/win32/000077500000000000000000000000001277777236100213305ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Devices/TrackIR/win32/TrackIRScaffold.cpp000066400000000000000000000365131277777236100250050ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Devices/TrackIR/TrackIRScaffold.h" #include #include #include #include #include #include #include "SurgSim/Devices/TrackIR/TrackIRDevice.h" #include "SurgSim/Devices/TrackIR/TrackIRThread.h" #include "SurgSim/Framework/Assert.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Framework/SharedInstance.h" #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/DataStructures/DataGroupBuilder.h" #include "SurgSim/Math/Matrix.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Vector.h" using SurgSim::DataStructures::DataGroupBuilder; using SurgSim::Math::makeRotationMatrix; using SurgSim::Math::Matrix33d; using SurgSim::Math::RigidTransform3d; using SurgSim::Math::Vector3d; namespace SurgSim { namespace Devices { struct TrackIRScaffold::DeviceData { /// Constructor /// \param device Device to be wrapped /// \param cameraID The camera identifier explicit DeviceData(TrackIRDevice* device, int cameraID) : deviceObject(device), thread(), vector(CameraLibrary::cModuleVector::Create()), vectorProcessor(new CameraLibrary::cModuleVectorProcessing()) { CameraLibrary::CameraList list; list.Refresh(); camera = CameraLibrary::CameraManager::X().GetCamera(list[cameraID].UID()); SURGSIM_ASSERT(nullptr != camera) << "Failed to obtain a camera from CameraLibrary."; camera->SetVideoType(CameraLibrary::BitPackedPrecisionMode); CameraLibrary::cVectorProcessingSettings vectorProcessorSettings; vectorProcessorSettings = *(vectorProcessor->Settings()); vectorProcessorSettings.Arrangement = CameraLibrary::cVectorSettings::VectorClip; vectorProcessorSettings.ShowPivotPoint = false; vectorProcessorSettings.ShowProcessed = false; vectorProcessorSettings.ScaleTranslationX = device->defaultPositionScale(); vectorProcessorSettings.ScaleTranslationY = device->defaultPositionScale(); vectorProcessorSettings.ScaleTranslationZ = device->defaultPositionScale(); vectorProcessorSettings.ScaleRotationPitch = device->defaultOrientationScale(); vectorProcessorSettings.ScaleRotationYaw = device->defaultOrientationScale(); vectorProcessorSettings.ScaleRotationRoll = device->defaultOrientationScale(); vectorProcessor->SetSettings(vectorProcessorSettings); //== Plug in focal length in (mm) by converting it from pixels -> mm CameraLibrary::cVectorSettings vectorSettings; vectorSettings = *(vector->Settings()); vectorSettings.Arrangement = CameraLibrary::cVectorSettings::VectorClip; vectorSettings.Enabled = true; camera->GetDistortionModel(lensDistortion); vectorSettings.ImagerFocalLength = lensDistortion.HorizontalFocalLength / static_cast(camera->PhysicalPixelWidth()) * camera->ImagerWidth(); vectorSettings.ImagerHeight = camera->ImagerHeight(); vectorSettings.ImagerWidth = camera->ImagerWidth(); vectorSettings.PrincipalX = camera->PhysicalPixelWidth() / 2.0; vectorSettings.PrincipalY = camera->PhysicalPixelHeight() / 2.0; vectorSettings.PixelWidth = camera->PhysicalPixelWidth(); vectorSettings.PixelHeight = camera->PhysicalPixelHeight(); vector->SetSettings(vectorSettings); } ~DeviceData() { camera->Release(); } Core::DistortionModel lensDistortion; CameraLibrary::Camera* camera; CameraLibrary::cModuleVector* vector; CameraLibrary::cModuleVectorProcessing* vectorProcessor; /// The corresponding device object. SurgSim::Devices::TrackIRDevice* const deviceObject; /// Processing thread. std::unique_ptr thread; /// The mutex that protects the externally modifiable parameters. boost::mutex parametersMutex; private: // Prevent copy construction and copy assignment. (VS2012 does not support "= delete" yet.) DeviceData(const DeviceData&) /*= delete*/; DeviceData& operator=(const DeviceData&) /*= delete*/; }; struct TrackIRScaffold::StateData { public: /// Initialize the state. StateData() : isApiInitialized(false) { } /// True if the API has been initialized (and not finalized). bool isApiInitialized; /// The list of known devices. std::list> activeDeviceList; /// The mutex that protects the list of known devices. boost::mutex mutex; private: // Prevent copy construction and copy assignment. (VS2012 does not support "= delete" yet.) StateData(const StateData&) /*= delete*/; StateData& operator=(const StateData&) /*= delete*/; }; TrackIRScaffold::TrackIRScaffold() : m_logger(Framework::Logger::getLogger("Devices/TrackIR")), m_state(new StateData) { SURGSIM_LOG_DEBUG(m_logger) << "Shared scaffold created."; } TrackIRScaffold::~TrackIRScaffold() { // The following block controls the duration of the mutex being locked. { boost::lock_guard lock(m_state->mutex); if (!m_state->activeDeviceList.empty()) { SURGSIM_LOG_SEVERE(m_logger) << "TrackIR: Destroying scaffold while devices are active!?!"; for (auto it = std::begin(m_state->activeDeviceList); it != std::end(m_state->activeDeviceList); ++it) { stopCamera((*it).get()); if ((*it)->thread) { destroyPerDeviceThread(it->get()); } } m_state->activeDeviceList.clear(); } if (m_state->isApiInitialized) { if (!finalizeSdk()) { SURGSIM_LOG_SEVERE(m_logger) << "Finalizing TrackIR SDK failed."; } } } SURGSIM_LOG_DEBUG(m_logger) << "TrackIR: Shared scaffold destroyed."; } bool TrackIRScaffold::registerDevice(TrackIRDevice* device) { boost::lock_guard lock(m_state->mutex); if (!m_state->isApiInitialized) { if (!initializeSdk()) { SURGSIM_LOG_SEVERE(m_logger) << "Failed to initialize TrackIR SDK in TrackIRScaffold::registerDevice(). " << "Continuing without the TrackIR device."; } } // Only proceed when initializationSdk() is successful. if (m_state->isApiInitialized) { // Make sure the object is unique. auto sameObject = std::find_if(m_state->activeDeviceList.cbegin(), m_state->activeDeviceList.cend(), [device](const std::unique_ptr& info) { return info->deviceObject == device; }); SURGSIM_ASSERT(sameObject == m_state->activeDeviceList.end()) << "TrackIR: Tried to register a device" << " which is already registered!"; // Make sure the name is unique. const std::string name = device->getName(); auto sameName = std::find_if(m_state->activeDeviceList.cbegin(), m_state->activeDeviceList.cend(), [&name](const std::unique_ptr& info) { return info->deviceObject->getName() == name; }); SURGSIM_ASSERT(sameName == m_state->activeDeviceList.end()) << "TrackIR: Tried to register a device" << " when the same name is already present!"; // The handling of multiple cameras could be done in different ways, each with trade-offs. // Instead of choosing an approach now, we assert on attempting to use more than one camera. SURGSIM_ASSERT(m_state->activeDeviceList.size() < 1) << "There is already an active TrackIR camera." << " TrackIRScaffold only supports one TrackIR camera right now."; CameraLibrary::CameraList cameraList; cameraList.Refresh(); if (cameraList.Count() > static_cast(m_state->activeDeviceList.size())) { int cameraID = static_cast(m_state->activeDeviceList.size()); std::unique_ptr info(new DeviceData(device, cameraID)); createPerDeviceThread(info.get()); SURGSIM_ASSERT(info->thread) << "Failed to create a per-device thread for TrackIR device: " << info->deviceObject->getName() << ", with ID number " << cameraID << "."; startCamera(info.get()); m_state->activeDeviceList.emplace_back(std::move(info)); SURGSIM_LOG_INFO(m_logger) << "Device " << device->getName() << " initialized."; } else { SURGSIM_LOG_SEVERE(m_logger) << "Registration failed. Is a TrackIR device plugged in?"; m_state->isApiInitialized = false; } } return m_state->isApiInitialized; } bool TrackIRScaffold::unregisterDevice(const TrackIRDevice* const device) { bool found = false; { boost::lock_guard lock(m_state->mutex); auto matching = std::find_if(m_state->activeDeviceList.begin(), m_state->activeDeviceList.end(), [device](const std::unique_ptr& info) { return info->deviceObject == device; }); if (matching != m_state->activeDeviceList.end()) { stopCamera((*matching).get()); if ((*matching)->thread) { destroyPerDeviceThread(matching->get()); } m_state->activeDeviceList.erase(matching); // the iterator is now invalid but that's OK found = true; SURGSIM_LOG_INFO(m_logger) << "Device " << device->getName() << " unregistered."; } } SURGSIM_LOG_IF(!found, m_logger, SEVERE) << "Attempted to release a non-registered device " << device->getName(); return found; } void TrackIRScaffold::setPositionScale(const TrackIRDevice* device, double scale) { boost::lock_guard lock(m_state->mutex); auto matching = std::find_if(m_state->activeDeviceList.begin(), m_state->activeDeviceList.end(), [device](const std::unique_ptr& info) { return info->deviceObject == device; }); if (matching != m_state->activeDeviceList.end()) { boost::lock_guard lock((*matching)->parametersMutex); CameraLibrary::cVectorProcessingSettings* vectorProcessorSettings = (*matching)->vectorProcessor->Settings(); vectorProcessorSettings->ScaleTranslationX = scale; vectorProcessorSettings->ScaleTranslationY = scale; vectorProcessorSettings->ScaleTranslationZ = scale; } } void TrackIRScaffold::setOrientationScale(const TrackIRDevice* device, double scale) { boost::lock_guard lock(m_state->mutex); auto matching = std::find_if(m_state->activeDeviceList.begin(), m_state->activeDeviceList.end(), [device](const std::unique_ptr& info) { return info->deviceObject == device; }); if (matching != m_state->activeDeviceList.end()) { boost::lock_guard lock((*matching)->parametersMutex); CameraLibrary::cVectorProcessingSettings* vectorProcessorSettings = (*matching)->vectorProcessor->Settings(); vectorProcessorSettings->ScaleRotationPitch = scale; vectorProcessorSettings->ScaleRotationYaw = scale; vectorProcessorSettings->ScaleRotationRoll = scale; } } bool TrackIRScaffold::runInputFrame(TrackIRScaffold::DeviceData* info) { if (!updateDevice(info)) { return false; } info->deviceObject->pushInput(); return true; } bool TrackIRScaffold::updateDevice(TrackIRScaffold::DeviceData* info) { SurgSim::DataStructures::DataGroup& inputData = info->deviceObject->getInputData(); boost::lock_guard lock(info->parametersMutex); CameraLibrary::Frame *frame = info->camera->GetFrame(); bool poseValid = false; double x, y, z, pitch, yaw, roll; if (frame) { info->vector->BeginFrame(); for(int i = 0; i < frame->ObjectCount(); ++i) { CameraLibrary::cObject *obj = frame->Object(i); float xValue = obj->X(); float yValue = obj->Y(); Core::Undistort2DPoint(info->lensDistortion, xValue, yValue); info->vector->PushMarkerData(xValue, yValue, obj->Area(), obj->Width(), obj->Height()); } info->vector->Calculate(); info->vectorProcessor->PushData(info->vector); // Vector Clip uses 3 markers to identify the pose, i.e. 6DOF // Otherwise, the pose is considered as invalid. if(info->vectorProcessor->MarkerCount() == 3) { info->vectorProcessor->GetOrientation(yaw, pitch, roll); // Rotations are Euler Angles in degrees. info->vectorProcessor->GetPosition(x, y, z); // Positions are reported in millimeters. poseValid = true; } frame->Release(); } if (poseValid) { // Positions returned from CameraSDK are right-handed. Vector3d position(x / 1000.0, y / 1000.0, z / 1000.0); // Convert millimeter to meter // The angles returned from CameraSDK are Euler angles (y-x'-z'' intrinsic rotations): X=pitch, Y=yaw, Z=roll. // OSS use right handed coordinate system (X:Right, Y:Up, Z:Outward) and right hand rule for rotations. Matrix33d rotationX = makeRotationMatrix(pitch * M_PI / 180.0, Vector3d(Vector3d::UnitX())); Matrix33d rotationY = makeRotationMatrix(yaw * M_PI / 180.0, Vector3d(Vector3d::UnitY())); Matrix33d rotationZ = makeRotationMatrix(roll * M_PI / 180.0, Vector3d(Vector3d::UnitZ())); Matrix33d orientation = rotationY * rotationX * rotationZ; RigidTransform3d pose; pose.linear() = orientation; pose.translation() = position; inputData.poses().set(SurgSim::DataStructures::Names::POSE, pose); } else // Invalid pose. inputData.poses().hasData("pose") will be set to 'false'. { inputData.poses().reset(SurgSim::DataStructures::Names::POSE); } return true; } bool TrackIRScaffold::initializeSdk() { SURGSIM_ASSERT(!m_state->isApiInitialized) << "TrackIR API already initialized."; if (!CameraLibrary::CameraManager::X().AreCamerasInitialized()) { CameraLibrary::CameraManager::X().WaitForInitialization(); } if (CameraLibrary::CameraManager::X().GetCamera()) { m_state->isApiInitialized = true; } return m_state->isApiInitialized; } bool TrackIRScaffold::finalizeSdk() { SURGSIM_ASSERT(m_state->isApiInitialized) << "TrackIR API already finalized."; if (!CameraLibrary::CameraManager::X().AreCamerasShutdown()) { // Dec-17-2013-HW It's a bug in TrackIR CameraSDK that after calling CameraLibrary::CameraManager::X().Shutdown(), // calls to CameraLibrary::CameraManager::X().WaitForInitialization will throw memory violation error. //CameraLibrary::CameraManager::X().Shutdown(); } m_state->isApiInitialized = false; return !m_state->isApiInitialized; } bool TrackIRScaffold::createPerDeviceThread(DeviceData* deviceData) { SURGSIM_ASSERT(!deviceData->thread) << "Device " << deviceData->deviceObject->getName() << " already has a thread."; std::unique_ptr thread(new TrackIRThread(this, deviceData)); thread->start(); deviceData->thread = std::move(thread); return true; } bool TrackIRScaffold::destroyPerDeviceThread(DeviceData* deviceData) { SURGSIM_ASSERT(deviceData->thread) << "No thread attached to device " << deviceData->deviceObject->getName(); std::unique_ptr thread = std::move(deviceData->thread); thread->stop(); thread.reset(); return true; } bool TrackIRScaffold::startCamera(DeviceData* info) { info->camera->Start(); return info->camera->IsCameraRunning(); } bool TrackIRScaffold::stopCamera(DeviceData* info) { info->camera->Stop(); return !(info->camera->IsCameraRunning()); } SurgSim::DataStructures::DataGroup TrackIRScaffold::buildDeviceInputData() { DataGroupBuilder builder; builder.addPose("pose"); return builder.createData(); } std::shared_ptr TrackIRScaffold::getOrCreateSharedInstance() { static SurgSim::Framework::SharedInstance sharedInstance; return sharedInstance.get(); } }; // namespace Devices }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Devices/UnitTests/000077500000000000000000000000001277777236100210315ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Devices/UnitTests/CMakeLists.txt000066400000000000000000000022001277777236100235630ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2012-2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. include_directories( ${gtest_SOURCE_DIR}/include ) set(UNIT_TEST_SOURCES DeviceUtilitiesTests.cpp ) set(UNIT_TEST_HEADERS ) set(LIBS IdentityPoseDevice SurgSimDevices SurgSimInput ) surgsim_add_unit_tests(SurgSimDevicesTest) set_target_properties(SurgSimDevicesTest PROPERTIES FOLDER "Devices") file(COPY Data DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) # Configure the path for the data files configure_file( "${CMAKE_CURRENT_SOURCE_DIR}/config.txt.in" "${CMAKE_CURRENT_BINARY_DIR}/config.txt" ) opensurgsim-0.7.0/SurgSim/Devices/UnitTests/Data/000077500000000000000000000000001277777236100217025ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Devices/UnitTests/Data/noInitialize.yaml000066400000000000000000000000551277777236100252240ustar00rootroot00000000000000- MockDeviceNoInitialize: Name: Device opensurgsim-0.7.0/SurgSim/Devices/UnitTests/Data/noName.yaml000066400000000000000000000000731277777236100240030ustar00rootroot00000000000000- SurgSim::Devices::IdentityPoseDevice: NoName: Deviceopensurgsim-0.7.0/SurgSim/Devices/UnitTests/Data/notMap.yaml000066400000000000000000000000421277777236100240200ustar00rootroot00000000000000- SurgSim::Devices::NovintDevice opensurgsim-0.7.0/SurgSim/Devices/UnitTests/Data/notRegistered.yaml000066400000000000000000000000631277777236100254030ustar00rootroot00000000000000- SurgSim::Devices::NotADevice: Name: Device opensurgsim-0.7.0/SurgSim/Devices/UnitTests/Data/notSequence.yaml000066400000000000000000000000441277777236100250550ustar00rootroot00000000000000SurgSim::Devices::InputPoseDevice: opensurgsim-0.7.0/SurgSim/Devices/UnitTests/Data/success.yaml000066400000000000000000000001701277777236100242340ustar00rootroot00000000000000- SurgSim::Devices::IdentityPoseDevice: Name: Device1 - SurgSim::Devices::IdentityPoseDevice: Name: Device2 opensurgsim-0.7.0/SurgSim/Devices/UnitTests/DeviceUtilitiesTests.cpp000066400000000000000000000055551277777236100256650ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the DeviceUtilities. #include #include #include #include "SurgSim/Devices/DeviceUtilities.h" #include "SurgSim/Devices/IdentityPoseDevice/IdentityPoseDevice.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Input/DeviceInterface.h" namespace { class MockDeviceNoInitialize : public SurgSim::Devices::IdentityPoseDevice { public: explicit MockDeviceNoInitialize(const std::string& name) : SurgSim::Devices::IdentityPoseDevice(name) { } std::string getClassName() const override { return "MockDeviceNoInitialize"; } bool initialize() override { return false; } }; } TEST(DeviceUtilitiesTests, CreateDevice) { const std::string name = "name"; std::vector types; EXPECT_EQ(nullptr, SurgSim::Devices::createDevice(types, name)); types.push_back("DoNotHave"); EXPECT_EQ(nullptr, SurgSim::Devices::createDevice(types, name)); types.push_back("SurgSim::Devices::IdentityPoseDevice"); auto device = SurgSim::Devices::createDevice(types, name); ASSERT_NE(nullptr, device); EXPECT_NE(nullptr, std::dynamic_pointer_cast(device)); EXPECT_EQ(name, device->getName()); } TEST(DeviceUtilitiesTests, LoadDevice) { auto runtime = std::make_shared("config.txt"); std::shared_ptr device; EXPECT_ANY_THROW(device = SurgSim::Devices::loadDevice("noFile.yaml")); ASSERT_EQ(nullptr, device); EXPECT_NO_THROW(device = SurgSim::Devices::loadDevice("notSequence.yaml")); ASSERT_EQ(nullptr, device); EXPECT_NO_THROW(device = SurgSim::Devices::loadDevice("notMap.yaml")); ASSERT_EQ(nullptr, device); EXPECT_NO_THROW(device = SurgSim::Devices::loadDevice("notRegistered.yaml")); ASSERT_EQ(nullptr, device); EXPECT_NO_THROW(device = SurgSim::Devices::loadDevice("noName.yaml")); ASSERT_EQ(nullptr, device); SurgSim::Input::DeviceInterface::getFactory().registerClass("MockDeviceNoInitialize"); EXPECT_NO_THROW(device = SurgSim::Devices::loadDevice("noInitialize.yaml")); ASSERT_EQ(nullptr, device); EXPECT_NO_THROW(device = SurgSim::Devices::loadDevice("success.yaml")); ASSERT_NE(nullptr, device); EXPECT_EQ("Device1", device->getName()); }opensurgsim-0.7.0/SurgSim/Devices/UnitTests/config.txt.in000066400000000000000000000000411277777236100234370ustar00rootroot00000000000000${CMAKE_CURRENT_BINARY_DIR}/Data/opensurgsim-0.7.0/SurgSim/Devices/devices.dox000066400000000000000000000010741277777236100212270ustar00rootroot00000000000000/*! \page Devices Devices The 'Devices' namespace contains classes that add physical devices (e.g., mice, keyboards, data acquisition, and robots) to simulations. Some devices are always built, while others require specific cmake options to be set (e.g., BUILD_DEVICE_SIXENSE) due to required dependencies that may not exist in all build environments. Devices with Dependencies: - \subpage LabJack - \subpage Leap - \subpage MultiAxis - \subpage Nimble - \subpage Novint - \subpage Oculus - \subpage OpenNI - \subpage Phantom - \subpage Sixense - \subpage TrackIR */ opensurgsim-0.7.0/SurgSim/Framework/000077500000000000000000000000001277777236100174425ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Framework/Accessible-inl.h000066400000000000000000000031611277777236100224310ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_FRAMEWORK_ACCESSIBLE_INL_H #define SURGSIM_FRAMEWORK_ACCESSIBLE_INL_H #include "SurgSim/Framework/Assert.h" template bool SurgSim::Framework::Accessible::getValue(const std::string& name, T* value) const { bool result = false; auto functors = m_functors.find(name); if (value != nullptr && functors != m_functors.end() && functors->second.getter != nullptr) { try { *value = boost::any_cast(functors->second.getter()); result = true; } catch (boost::bad_any_cast exception) { } } return result; } template T SurgSim::Framework::Accessible::getValue(const std::string& name) const { T result; try { result = boost::any_cast(getValue(name)); } catch (boost::bad_any_cast exception) { SURGSIM_FAILURE() << "Failure to cast to the given type. <" << exception.what() << ">"; return T(); } return result; } template T SurgSim::Framework::convert(boost::any val) { return boost::any_cast(val); } #endif opensurgsim-0.7.0/SurgSim/Framework/Accessible.cpp000066400000000000000000000146241277777236100222120ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Framework/Accessible.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Math/Matrix.h" namespace SurgSim { namespace Framework { Accessible::Accessible() { } Accessible::~Accessible() { } template <> boost::any Accessible::getValue(const std::string& name) const { auto functors = m_functors.find(name); if (functors != std::end(m_functors) && functors->second.getter != nullptr) { return functors->second.getter(); } else { SURGSIM_FAILURE() << "Can't get property: " << name << ". " << ((functors == std::end(m_functors)) ? "Property not found." : "No getter defined for property."); return boost::any(); } } boost::any Accessible::getValue(const std::string& name) const { return getValue(name); } void Accessible::setValue(const std::string& name, const boost::any& value) { auto functors = m_functors.find(name); if (functors != std::end(m_functors) && functors->second.setter != nullptr) { functors->second.setter(value); } else { SURGSIM_FAILURE() << "Can't set property: " << name << ". " << ((functors == std::end(m_functors)) ? "Property not found." : "No setter defined for property."); } } void Accessible::setGetter(const std::string& name, GetterType func) { SURGSIM_ASSERT(func != nullptr) << "Getter functor can't be nullptr"; m_functors[name].getter = func; } void Accessible::setSetter(const std::string& name, SetterType func) { SURGSIM_ASSERT(func != nullptr) << "Setter functor can't be nullptr"; m_functors[name].setter = func; } void Accessible::setAccessors(const std::string& name, GetterType getter, SetterType setter) { setGetter(name, getter); setSetter(name, setter); } void Accessible::removeAccessors(const std::string& name) { auto functors = m_functors.find(name); if (functors != std::end(m_functors)) { functors->second.setter = nullptr; functors->second.getter = nullptr; } } bool Accessible::isReadable(const std::string& name) const { auto functors = m_functors.find(name); return (functors != m_functors.end() && functors->second.getter != nullptr); } bool Accessible::isWriteable(const std::string& name) const { auto functors = m_functors.find(name); return (functors != m_functors.end() && functors->second.setter != nullptr); } void Accessible::setSerializable(const std::string& name, EncoderType encoder, DecoderType decoder) { SURGSIM_ASSERT(encoder != nullptr) << "Encoder functor can't be nullptr."; SURGSIM_ASSERT(decoder != nullptr) << "Decoder functor can't be nullptr."; m_functors[name].encoder = encoder; m_functors[name].decoder = decoder; } void Accessible::setDecoder(const std::string& name, DecoderType decoder) { SURGSIM_ASSERT(decoder != nullptr) << "Decoder functor can't be nullptr"; m_functors[name].decoder = decoder; } YAML::Node Accessible::encode() const { YAML::Node result; for (auto functors = m_functors.cbegin(); functors != m_functors.cend(); ++functors) { auto encoder = functors->second.encoder; if (encoder != nullptr) { result[functors->first] = encoder(); } } return result; } void Accessible::decode(const YAML::Node& node, const std::vector& ignoredProperties) { SURGSIM_LOG_DEBUG(SurgSim::Framework::Logger::getLogger("Framework/Accessible")) << "Decoding node: \n" << node; SURGSIM_ASSERT(node.IsMap()) << "Node to be decoded has to be map."; for (auto data = node.begin(); data != node.end(); ++data) { std::string name = data->first.as(); if (std::find(std::begin(ignoredProperties), std::end(ignoredProperties), name) != std::end(ignoredProperties)) { continue; } auto functors = m_functors.find(name); if (functors == std::end(m_functors) || !functors->second.decoder) { SURGSIM_LOG_WARNING(SurgSim::Framework::Logger::getLogger("Framework/Accessible")) << "Can't find property with name " << name << " in the accessible, while trying to set " << data->second; } else { YAML::Node temporary = data->second; if (!temporary.IsNull() && temporary.IsDefined()) { try { functors->second.decoder(&temporary); } catch (std::exception e) { SURGSIM_FAILURE() << e.what() << " for value " << std::endl << temporary; } } else { SURGSIM_LOG_INFO(SurgSim::Framework::Logger::getLogger("Framework/Accessible")) << "Found property with name " << name << " in the accessible." << " But it seems no value is specified for this property in the YAML file."; } } } } void Accessible::forwardProperty(const std::string& name, const Accessible& target, const std::string& targetValueName) { Functors functors; auto found = target.m_functors.find(targetValueName); if (found != target.m_functors.end()) { functors.getter = found->second.getter; functors.setter = found->second.setter; functors.encoder = found->second.encoder; functors.decoder = found->second.decoder; m_functors[name] = std::move(functors); } else { SURGSIM_FAILURE() << "Target does not have any setters or getters on property " << targetValueName; } } template<> SurgSim::Math::Matrix44f convert(boost::any val) { SurgSim::Math::Matrix44f floatResult; // Use try in case this conversion was created using a Matrix44f, in which case the any_cast will // still fail and throw an exception try { SurgSim::Math::Matrix44d result = boost::any_cast(val); floatResult = result.cast(); } catch (boost::bad_any_cast&) { floatResult = boost::any_cast(val); } return floatResult; } template<> std::string convert(boost::any val) { std::string result; try { result = std::string(boost::any_cast(val)); } catch (boost::bad_any_cast&) { result = std::string(boost::any_cast(val)); } return result; } }; // Framework }; // SurgSim opensurgsim-0.7.0/SurgSim/Framework/Accessible.h000066400000000000000000000303001277777236100216440ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_FRAMEWORK_ACCESSIBLE_H #define SURGSIM_FRAMEWORK_ACCESSIBLE_H #include #include #include #include #include #include #include #include "SurgSim/Math/Matrix.h" namespace SurgSim { namespace Framework { /// Mixin class for enabling a property system on OSS classes, the instance still needs to initialize properties in /// the constructor by using either addSetter, addGetter, addAccessors or the macro for each member variable /// that should be made accessible. class Accessible { public: /// Default Constructor Accessible(); /// Destructor ~Accessible(); typedef std::function GetterType; typedef std::function SetterType; typedef std::function EncoderType; typedef std::function DecoderType; /// Retrieves the value with the name by executing the getter if it is found and tries to convert /// it to the given type. /// \throws SurgSim::Framework::AssertionFailure If the conversion fails or the property cannot be found. /// \tparam T The requested type for the property. /// \param name The name of the property. /// \return The value of the property if the getter was found template T getValue(const std::string& name) const; /// Retrieves the value with the name by executing the getter if it is found. /// \throws SurgSim::Framework::AssertionFailure if the property cannot be found /// \param name The name of the property. /// \return The value of the property if the getter was found boost::any getValue(const std::string& name) const; /// Retrieves the value with the name by executing the getter if it is found, and converts it to /// the type of the output parameter. This does not throw. /// \tparam T the type of the property, usually can be deduced automatically /// \param name The name of the property. /// \param [out] value If non-null, will receive the value of the given property. /// \return true if value != nullptr and the getter can be found. template bool getValue(const std::string& name, T* value) const; /// Sets a value of a property that has setter. /// \throws SurgSim::Framework::AssertionFailure If the property cannot be found. /// \param name The name of the property. /// \param value The value that it should be set to. void setValue(const std::string& name, const boost::any& value); /// Check whether a property is readable /// \param name Name of the property to be checked. /// \return true if the property exists and has a getter bool isReadable(const std::string& name) const; /// Check whether a property is writable /// \param name Name of the property to be checked. /// \return true if the property exists and has a setter bool isWriteable(const std::string& name) const; /// Sets a getter for a given property. /// \throws SurgSim::Framework::AssertionFailure if func is a nullptr. /// \param name The name of the property. /// \param func The getter function. void setGetter(const std::string& name, GetterType func); /// Sets a setter for a given property. /// \throws SurgSim::Framework::AssertionFailure if func is a nullptr. /// \param name The name of the property. /// \param func The setter function. void setSetter(const std::string& name, SetterType func); /// Sets the accessors getter and setter in one function. /// \throws SurgSim::Framework::AssertionFailure if either getter or setter is a nullptr. /// \param name The name of the property. /// \param getter The getter. /// \param setter The setter. void setAccessors(const std::string& name, GetterType getter, SetterType setter); /// Removes all the accessors (getter and setter) for a given property /// \param name The name of the property void removeAccessors(const std::string& name); /// Adds a property with the given name that uses the targets accessors, in effect forwarding the value /// to the target /// \note This will copy the appropriate calls into the local function table of this accessible, in effect /// exposing a pointer to the target, if the target goes out of scope, the behavior is undefined /// \throws SurgSim::Framework::AssertionFailure if the target does not contain the property named in this call. /// \param name The name of the new property /// \param target The instance that provides the actual property /// \param targetProperty The name of the property that should be used. void forwardProperty(const std::string& name, const Accessible& target, const std::string& targetProperty); /// Sets the functions used to convert data from and to a YAML::Node. Will throw an exception /// if the data type that is passed to YAML cannot be converted into a YAML::Node /// \param name The name of the property. /// \param encoder The function to be used to put the property into the node. /// \param decoder The function to be used to read the property from the node and set it /// in the instance. void setSerializable(const std::string& name, EncoderType encoder, DecoderType decoder); /// Sets the functions used to convert data from a YAML::Node. /// This leaves the encoder (class -> YAML) conversion empty, this can be used to let the user decide how to /// model the data in the data file, inside the class this should all result in one member to be created/changed. /// \param name The name of the property. /// \param decoder The function to be used to read the property from the node and set it /// in the instance. void setDecoder(const std::string& name, DecoderType decoder); /// Encode this Accessible to a YAML::Node /// \return The encoded version of this instance. YAML::Node encode() const; /// Decode this Accessible from a YAML::Node, will throw an exception if the data type cannot /// be converted. /// \throws SurgSim::Framework::AssertionFailure if node is not of YAML::NodeType::Map. /// \param node The node that carries the data to be decoded, properties with names that don't /// match up with properties in the Accessible will be reported. /// \param ignoredProperties Properties that will be ignored. void decode(const YAML::Node& node, const std::vector& ignoredProperties = std::vector()); private: /// @{ /// Prevent default copy construction and default assignment Accessible(const Accessible& other) /*= delete*/; Accessible& operator=(const Accessible& other) /*= delete*/; /// @} /// Private struct to keep the map under control struct Functors { Functors() : getter(nullptr), setter(nullptr), encoder(nullptr), decoder(nullptr) {} GetterType getter; SetterType setter; EncoderType encoder; DecoderType decoder; }; std::unordered_map m_functors; }; /// Public struct to pair an accessible with its appropriate property struct Property { std::weak_ptr accessible; std::string name; }; template <> boost::any Accessible::getValue(const std::string& name) const; /// Wrap boost::any_cast to use in std::bind, for some reason it does not work by itself. This function will /// throw an exception if the cast does not work, this usually means that the types do not match up at all. /// \tparam T target type for conversion. /// \param val The value to be converted. /// \return An object converted from boost::any to T, will throw an exception if the conversion fails template T convert(boost::any val); /// Specialization for convert() to correctly cast Matrix44d to Matrix44f, will throw if the val is not casteable to /// Matrix44[fd]. This is necessary as we need Matrix44f as outputs in some cases but all our Matrices are Matrix44d. /// This lets the user define a property that does a type conversion, without having to implement an accessor. /// \param val The value to be converted, should be a Matrix44[df]. /// \return A matrix val converted to Matrix44f. template <> SurgSim::Math::Matrix44f convert(boost::any val); /// Specialization for convert() to correctly cast const char* to std::string /// \param val The value to be converted, should be a const char* /// \return A std::string template <> std::string convert(boost::any val); /// A macro to register getter and setter for a property that is readable and writeable, /// order of getter and setter agrees with 'RW'. Note that the property should not be quoted in the original /// macro call. #define SURGSIM_ADD_RW_PROPERTY(class, type, property, getter, setter) \ setAccessors(#property, \ std::bind(&class::getter, this),\ std::bind(&class::setter, this, std::bind(SurgSim::Framework::convert,std::placeholders::_1))) /// A macro to register a getter for a property that is read only #define SURGSIM_ADD_RO_PROPERTY(class, type, property, getter) \ setGetter(#property, \ std::bind(&class::getter, this)) /// A macro to register a serializable property, this needs to support reading, writing and all the /// conversions to and from YAML::Node #define SURGSIM_ADD_SERIALIZABLE_PROPERTY(class, type, property, getter, setter) \ setAccessors(#property, \ std::bind(&class::getter, this),\ std::bind(&class::setter, this, std::bind(SurgSim::Framework::convert,std::placeholders::_1)));\ setSerializable(#property,\ std::bind(&YAML::convert::encode, std::bind(&class::getter, this)),\ std::bind(&class::setter, this, std::bind(&YAML::Node::as,std::placeholders::_1))) /// A macro to register a setter that can be used from YAML, and as a writeable property /// use this to provide alternatives to more complicated values, e.g. setModelFilename() vs generate and set Model /// Enables the alternative use of the model file instead of the actual mesh object #define SURGSIM_ADD_SETTER(class, type, property, setter) \ {\ setDecoder(#property, std::bind((void(class::*)(const type&))&class::setter, this,\ std::bind(&YAML::Node::as,std::placeholders::_1))); \ setSetter(#property, std::bind((void(class::*)(const type&))&class::setter, this,\ std::bind(SurgSim::Framework::convert,std::placeholders::_1)));\ } }; // Framework }; // SurgSim #define SURGSIM_ENUM_TOSTRING(r, data, elem) \ case data::elem: \ result = BOOST_PP_STRINGIZE(elem); \ break; #define SURGSIM_ENUM_FROMSTRING(r, data, elem) \ if (value == BOOST_PP_STRINGIZE(elem)) \ { \ rhs = data::elem; \ return true; \ } /// Required type of enums used by SURGSIM_SERIALIZABLE_ENUM #define SURGSIM_ENUM_TYPE int8_t /// A macro to create an enum that can be easily serialized /// During serialization, the enum will be converted to its string based named, /// back to an enum during deserialization. The enum must already be forward /// declared in its namespace before calling this macro in the global namespace. #define SURGSIM_SERIALIZABLE_ENUM(name, enumerators) \ enum name : SURGSIM_ENUM_TYPE\ { \ BOOST_PP_SEQ_ENUM(enumerators) \ }; \ namespace YAML \ { \ template <> \ struct convert \ { \ static Node encode(const name& rhs) \ { \ Node result; \ switch (rhs) \ { \ BOOST_PP_SEQ_FOR_EACH(SURGSIM_ENUM_TOSTRING, name, enumerators) \ default: \ SURGSIM_FAILURE() << "Can not find enum value in " << #name << ": " << rhs; \ } \ return result; \ } \ static bool decode(const Node& node, name& rhs) \ { \ std::string value = node.as(); \ std::transform(value.begin(), value.end(), value.begin(), ::toupper); \ BOOST_PP_SEQ_FOR_EACH(SURGSIM_ENUM_FROMSTRING, name, enumerators) \ SURGSIM_FAILURE() << "Unknown " << #name << ": " << value; \ return false; \ } \ }; \ } #include "SurgSim/Framework/Accessible-inl.h" #endif opensurgsim-0.7.0/SurgSim/Framework/ApplicationData.cpp000066400000000000000000000101051277777236100232000ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Framework/ApplicationData.h" #include "SurgSim/Framework/Log.h" #include #include #include using boost::filesystem::path; namespace SurgSim { namespace Framework { ApplicationData::ApplicationData(const std::vector& paths) { setPaths(paths); } ApplicationData::ApplicationData(const std::string& configurationFileName) { path filePath(configurationFileName); SURGSIM_ASSERT(boost::filesystem::exists(filePath)) << "ApplicationdData could not find configuration file " << configurationFileName << " " << "the application is probably not going to be able to find it's data files"; std::vector paths; boost::filesystem::ifstream in(filePath); std::string line; while (! in.eof()) { getline(in, line); paths.push_back(line); // Skip possible Trailing newlines in >> std::ws; } setPaths(paths); } ApplicationData::~ApplicationData() { } std::string ApplicationData::findFile(const std::string& fileName) const { std::string result; if (!isValidFilename(fileName)) { return ""; } path file(fileName); if (file.is_absolute() && boost::filesystem::exists(file)) { result = file.make_preferred().string(); } else { for (auto it = m_paths.cbegin(); it != m_paths.cend(); ++it) { path filePath(*it); filePath /= fileName; if (boost::filesystem::exists(filePath)) { result = filePath.make_preferred().string(); break; } } } return result; } bool ApplicationData::tryFindFile(const std::string& fileName, std::string* target) const { bool result = false; std::string resultName = findFile(fileName); if (resultName != "") { *target = std::move(resultName); result = true; } return result; } bool ApplicationData::setPaths(const std::vector& paths) { bool result = true; m_paths.clear(); for (auto it = paths.cbegin(); it != paths.cend(); ++it) { result = addPath(*it) && result; } return result; } bool ApplicationData::addPath(const std::string& pathName) { bool result = false; if (! isValidFilename(pathName)) { return false; } path newPath(pathName); if (boost::filesystem::exists(newPath) && boost::filesystem::is_directory(newPath)) { newPath = boost::filesystem::canonical(newPath).make_preferred(); if (std::find(m_paths.cbegin(), m_paths.cend(), newPath) == m_paths.cend()) { m_paths.push_back(newPath); result = true; } else { SURGSIM_LOG_INFO(Logger::getDefaultLogger()) << "ApplicationsData::addPath: Trying to add duplicate path " << pathName; } } else { SURGSIM_LOG_WARNING(Logger::getDefaultLogger()) << "ApplicationData, trying to add nonexistent or non directory path to search list " << newPath; } return result; } std::vector ApplicationData::getPaths() const { std::vector result; for (auto it = m_paths.cbegin(); it != m_paths.cend(); ++it) { result.push_back(it->string()); } return result; } bool ApplicationData::isValidFilename(const std::string& fileName) const { bool result = true; if (fileName.empty()) { result = false; } size_t index = fileName.find("\\"); if (index != std::string::npos) { SURGSIM_LOG_WARNING(Logger::getDefaultLogger()) << __FUNCTION__ << " Backslashes encountered in the path, this path cannot be used " << fileName << " to be useful it needs to be rewritten using '/'."; result = false; } return result; } }; // Framework }; // SurgSim opensurgsim-0.7.0/SurgSim/Framework/ApplicationData.h000066400000000000000000000100521277777236100226460ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_FRAMEWORK_APPLICATIONDATA_H #define SURGSIM_FRAMEWORK_APPLICATIONDATA_H #include #include #if !defined(SURGSIM_PARSED_BY_DOXYGEN) // do not generate documentation for Boost stuff! namespace boost { namespace filesystem { class path; } // namespace filesystem } // namespace boost #endif // defined(SURGSIM_PARSED_BY_DOXYGEN) namespace SurgSim { namespace Framework { /// Enable searching for files in a given list of paths, give access to the current directory and /// wrap boost::filesystem functionality class ApplicationData { public: /// Constructor, class is immutable, pass a list of paths to be used for searching duplicate /// paths will be eliminated, invalid paths will be eliminated, the order of the paths given here /// is the order that will be used in searching, the first occurrance of a file within a given /// path will be used. /// \param paths The list of search paths. explicit ApplicationData(const std::vector& paths); /// Reads the search paths from a given configuration file /// \param configFile The configuration file for reading the search paths. explicit ApplicationData(const std::string& configFile); ~ApplicationData(); /// Gets the search paths. /// \return The paths, passed in the constructor with duplicates and invalid paths /// removed. All paths returned will be absolute and in system format. std::vector getPaths() const; /// Searches for the first occurrence of fileName amongst the given paths, the /// search is shallow, only direct content of the directories in the path list /// will be used as search candidates. /// \param fileName Filename of the file. /// \return The absolute path to the file in system format i.e c:\\xxx\\yyy\\file.txt for /// windows and /xxx/yyy/file.txt for all other systems. An empty string will be /// returned if the file cannot be found. std::string findFile(const std::string& fileName) const; /// Searches for the first occurrence of fileName amongst the given paths, see findFile() for details. /// If the file is found the full pathName will be sent in target and true returned. If the file is /// not found the result will be false and the content of target will not change. /// \param fileName Filename of the file. /// \param target The location for the converted filename if it was found. /// \return true if the file is found, false otherwise. bool tryFindFile(const std::string& fileName, std::string* target) const; /// Checks if the filename is acceptable /// \param fileName Filename to be checked. /// \return true if the name is valid, false otherwise. bool isValidFilename(const std::string& fileName) const; private: /// Adds a single path to the list of search paths. /// \param pathName Full pathname. /// \return true if it succeeds, false if the given path does not exist or if it is /// already in the list of paths. bool addPath(const std::string& pathName); /// Sets the list of search paths to be used for finding the location of files. /// Eliminates duplicate paths and paths that do not exist /// \param paths The paths to be used for finding files. /// \return true if it succeeds, false if one or more of the paths /// do not exist in the system or are duplicated. bool setPaths(const std::vector& paths); std::vector m_paths; }; }; // Framework }; // SurgSim #endif // SURGSIM_FRAMEWORK_APPLICATIONDATA_H opensurgsim-0.7.0/SurgSim/Framework/Assert.h000066400000000000000000000072651277777236100210660ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// The header that provides the assertion API. /// \ingroup assertAPI /// \sa assertAPI #ifndef SURGSIM_FRAMEWORK_ASSERT_H #define SURGSIM_FRAMEWORK_ASSERT_H #include "SurgSim/Framework/Logger.h" #include "SurgSim/Framework/AssertMessage.h" namespace SurgSim { namespace Framework { /// \defgroup assertAPI Assertions /// The assertion API used by OpenSurgSim code. /// \sa loggingAPI /// @{ /// \defgroup assertInternals Internal assertion helpers /// Not meant for public consumption. #if !defined(SURGSIM_ASSERT_LOGGER) /// Logger used to log asserts. /// The default logger is used if no other logger is defined. /// \ingroup assertInternals #define SURGSIM_ASSERT_LOGGER ::SurgSim::Framework::Logger::getDefaultLogger() #endif /// Helper macro to determine the function name currently being compiled. /// Tries to provide some readable but information-rich version of the name, as provided by different compilers. /// \ingroup assertInternals /// \hideinitializer #if defined(__func__) #define SURGSIM_CURRENT_FUNCTION __func__ #elif defined(__FUNCSIG__) #define SURGSIM_CURRENT_FUNCTION __FUNCSIG__ #elif defined(__PRETTY_FUNCTION__) #define SURGSIM_CURRENT_FUNCTION __PRETTY_FUNCTION__ #elif defined(__FUNCTION__) #define SURGSIM_CURRENT_FUNCTION __FUNCTION__ #else #define SURGSIM_CURRENT_FUNCTION "???" #endif /// Helper macros to turn its argument into a quoted string constant. /// \ingroup assertInternals /// \param x Argument to convert into a string /// \return Quoted string constant. Note that macros such as __LINE__ may be quoted literally rather than expanded. #define SURGSIM_MAKE_STRING(x) #x /// Assert that \c condition is true. If not, abort program execution, printing an error message that will include /// \c failText, the condition, source file/line, etc. /// \param condition Condition to test /// \return Stream to output extra assert information /// /// Example: /// SURGSIM_ASSERT(index >= 0) << "bad index: " << index; #define SURGSIM_ASSERT(condition) \ if ((condition)) \ { \ } \ else \ /* important: no curly braces around this! */ \ ::SurgSim::Framework::AssertMessage(SURGSIM_ASSERT_LOGGER) << "*** Assertion failed: " << \ SURGSIM_MAKE_STRING(condition) << " ***" << std::endl << \ " in " << SURGSIM_CURRENT_FUNCTION << std::endl << \ " at " << __FILE__ << ":" << __LINE__ << std::endl /// Report that something very bad has happened and abort program execution. An error message will be printed, and will /// include \c failText, source file/line, etc. /// This is pretty similar to SURGSIM_ASSERT(true, ...), except "true" won't be included in the resulting message. =) /// \return Stream to output extra failure information /// /// Example: /// SURGSIM_FAILURE() << failText; #define SURGSIM_FAILURE() \ ::SurgSim::Framework::AssertMessage(SURGSIM_ASSERT_LOGGER) << "*** Failure ***" << std::endl << \ " in " << SURGSIM_CURRENT_FUNCTION << std::endl << \ " at " << __FILE__ << ":" << __LINE__ << std::endl /// @} }; // namespace Framework }; // namespace SurgSim #endif // SURGSIM_FRAMEWORK_ASSERT_H opensurgsim-0.7.0/SurgSim/Framework/AssertMessage.cpp000066400000000000000000000027321277777236100227200ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Framework/AssertMessage.h" #if defined(_WIN32) #include #else // not defined(_WIN32) #include #endif // not defined(_WIN32) namespace SurgSim { namespace Framework { void AssertMessage::setFailureCallback(AssertMessage::DeathCallback callback) { m_killMeNow = callback; } AssertMessage::DeathCallback AssertMessage::getFailureCallback() { return m_killMeNow; } void AssertMessage::throwException(const std::string& errorMessage) { throw AssertionFailure(errorMessage); } void AssertMessage::killApplication(const std::string& errorMessage) { #if defined(_WIN32) DebugBreak(); #else // not defined(_WIN32) abort(); #endif // not defined(_WIN32) } AssertMessage::DeathCallback AssertMessage::m_killMeNow = AssertMessage::throwException; }; // namespace Framework }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Framework/AssertMessage.h000066400000000000000000000101221277777236100223550ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_FRAMEWORK_ASSERTMESSAGE_H #define SURGSIM_FRAMEWORK_ASSERTMESSAGE_H #include #include "SurgSim/Framework/LogMessageBase.h" namespace SurgSim { namespace Framework { /// An exception class thrown by SURGSIM_ASSERT() failures and SURGSIM_FAILURE(). /// \ingroup assertAPI class AssertionFailure : public std::runtime_error { public: /// Constructor /// \param message Exception message explicit AssertionFailure(const std::string& message) : std::runtime_error(message) { } }; /// An internal message class used for assertion failures. Dies after logging. /// \ingroup assertInternals class AssertMessage : public LogMessageBase { public: /// The type used for the callback function that is triggered after an assertion has failed. typedef void (*DeathCallback)(const std::string& message); /// Constructor. /// \param logger %Logger used to log this message. explicit AssertMessage(Logger* logger) : LogMessageBase(logger, LOG_LEVEL_CRITICAL) { } /// Constructor. /// \param logger %Logger used to log this message. explicit AssertMessage(const std::unique_ptr& logger) : LogMessageBase(logger.get(), LOG_LEVEL_CRITICAL) { } /// Constructor. /// \param logger %Logger used to log this message. explicit AssertMessage(const std::shared_ptr& logger) : LogMessageBase(logger.get(), LOG_LEVEL_CRITICAL) { } /// Destructor, which may throw an exception if the failure behavior does #ifdef _MSC_VER ~AssertMessage() throw(...) // Visual Studio does not support noexcept. The throw(...) is optional. #else ~AssertMessage() noexcept(false) /// C++11 introduced noexcept #endif { flush(); m_killMeNow(getMessage()); } /// After an assertion has failed, call some arbitrary function. /// The callback function should cause the application (or at least the current thread) to terminate. /// /// Thread-unsafe if called concurrently from multiple threads, or concurrently with a failing assertion. static void setFailureCallback(DeathCallback callback); /// Get the callback that will currently be called after an assertion has failed. /// Thread-unsafe if called concurrently from multiple threads, or concurrently with a failing assertion. /// \return The callback. static DeathCallback getFailureCallback(); /// After an assertion has failed, throw a C++ exception. /// Thread-unsafe if called concurrently from multiple threads, or concurrently with a failing assertion. static void setFailureBehaviorToThrow() { setFailureCallback(throwException); } /// After an assertion has failed, enter the debugger or kill the application in a system-dependent way. /// Thread-unsafe if called concurrently from multiple threads, or concurrently with a failing assertion. static void setFailureBehaviorToDeath() { setFailureCallback(killApplication); } private: /// Kill the application by throwing an exception. /// \param errorMessage Message describing the error. static void throwException(const std::string& errorMessage); /// Enter the debugger or kill the application in a system-dependent way. /// \param errorMessage Message describing the error (which will be ignored). static void killApplication(const std::string& errorMessage); /// The callback function that is triggered after an assertion has failed. /// Thread-unsafe if called concurrently from multiple threads. static DeathCallback m_killMeNow; }; }; // namespace Framework }; // namespace SurgSim #endif // SURGSIM_FRAMEWORK_ASSERTMESSAGE_H opensurgsim-0.7.0/SurgSim/Framework/Asset.cpp000066400000000000000000000045041277777236100212300ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Framework/Asset.h" #include "SurgSim/Framework/Accessible.h" #include "SurgSim/Framework/ApplicationData.h" #include "SurgSim/Framework/Assert.h" #include "SurgSim/Framework/Runtime.h" namespace SurgSim { namespace Framework { Asset::Asset() : m_fileName() { serializeFileName(this); } Asset::Asset(const Asset& rhs) { serializeFileName(this); } Asset::~Asset() { } void Asset::load(const std::string& fileName, const SurgSim::Framework::ApplicationData& data) { m_fileName = fileName; SURGSIM_ASSERT(!m_fileName.empty()) << "File name is empty"; std::string path = data.findFile(m_fileName); SURGSIM_ASSERT(!path.empty()) << "Can not locate file " << m_fileName; SURGSIM_ASSERT(doLoad(path)) << "Failed to load file " << m_fileName; } void Asset::load(const std::string& fileName) { load(fileName, *SurgSim::Framework::Runtime::getApplicationData()); } std::string Asset::getFileName() const { return m_fileName; } void Asset::serializeFileName(SurgSim::Framework::Accessible* accessible) { // Special treatment to let std::bind() deal with overloaded function. auto resolvedOverloadFunction = static_cast(&Asset::load); accessible->setAccessors("FileName", std::bind(&Asset::getFileName, this), std::bind(resolvedOverloadFunction, this, std::bind(SurgSim::Framework::convert, std::placeholders::_1))); accessible->setSerializable("FileName", std::bind(&YAML::convert::encode, std::bind(&Asset::getFileName, this)), std::bind(resolvedOverloadFunction, this, std::bind(&YAML::Node::as, std::placeholders::_1))); } }; // Framework }; // SurgSimopensurgsim-0.7.0/SurgSim/Framework/Asset.h000066400000000000000000000071171277777236100207000ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_FRAMEWORK_ASSET_H #define SURGSIM_FRAMEWORK_ASSET_H #include #include "SurgSim/Framework/ObjectFactory.h" #include "SurgSim/Framework/Accessible.h" namespace SurgSim { namespace Framework { class Accessible; class ApplicationData; class AssetTest; /// This class is used to facilitate file loading. It uses the static ApplicationData /// in SurgSim::Framework::Runtime to load file. /// Classes not in SurgSim::Framework::Component hierarchy should inherit this class in /// order to load a file. /// Components that take assets as parameters should, in addition to their general `set()` and `get()` /// functions, implement a helper function `load()`, that creates and loads the specified asset. /// Additionally, a special YAML parameter (`FileName`) should be implemented, that can be used to specify /// the asset, without having to specify the whole asset in serialized form. class Asset : virtual public Accessible, public FactoryBase { friend AssetTest; public: /// Constructor Asset(); /// Copy Constructor Asset(const Asset& rhs); /// Destructor virtual ~Asset(); /// Load a file with given name using 'data' as look up path(s). /// If 'fileName' is not empty and the file is found, this method calls 'doLoad()' to load the file. /// Assertions will fail if 'fileName' is empty or file is not found or file loading is unsuccessful. /// \note As a side effect, the name of the file will be recorded in /// \note Asset::m_fileName and can be retrieved by Asset::getFileName(). /// \param fileName Name of the file to be loaded. /// \param data ApplicationData which provides the runtime look up path(s). void load(const std::string& fileName, const SurgSim::Framework::ApplicationData& data); /// Overloaded function using SurgSim::Framework::Runtime::getApplicationData() as look up path(s). /// \param fileName Name of the file to be loaded. void load(const std::string& fileName); /// Return the name of file loaded by this class. /// \return Name of the file loaded by this class. std::string getFileName() const; /// Support serialization with a classname /// \return the name of this class virtual std::string getClassName() const = 0; protected: /// Derived classes will overwrite this method to do actual loading. /// \note This method is not required to do any check on the validity or the existence of the file. /// \param filePath Absolute path to the file. /// \return True if loading is successful; Otherwise, false. virtual bool doLoad(const std::string& filePath) = 0; private: /// Wrap the registration calls for the filename property, which is more complicated due to the overloaded /// function call load() /// \param accessible 'this' pointer of derived class. void serializeFileName(SurgSim::Framework::Accessible* accessible); /// Name of the file to be loaded. std::string m_fileName; }; } // namespace Framework } // namespace SurgSim #endif // SURGSIM_FRAMEWORK_ASSET_H opensurgsim-0.7.0/SurgSim/Framework/Barrier.cpp000066400000000000000000000031261277777236100215360ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Based on barrier.hpp from Boost 1.51 // Copyright (C) 2002-2003 // David Moore, William E. Kempf // Copyright (C) 2007-8 Anthony Williams // // Which was distributed under the Boost Software License, Version 1.0. // (See accomanying NOTICES or a copy at http://www.boost.org/LICENSE_1_0.txt) #include "SurgSim/Framework/Barrier.h" SurgSim::Framework::Barrier::Barrier(size_t count) : m_threshold(count), m_count(count), m_generation(0), m_success(true) { SURGSIM_ASSERT(count != 0) << "Barrier constructor count cannot be zero"; } bool SurgSim::Framework::Barrier::wait(bool success) { boost::mutex::scoped_lock lock(m_mutex); size_t gen = m_generation; m_success = m_success && success; --m_count; if (m_count == 0) { m_generation++; m_count = m_threshold; m_successResult = m_success; m_success = true; m_cond.notify_all(); return m_successResult; } while (gen == m_generation) { m_cond.wait(lock); } return m_successResult; } opensurgsim-0.7.0/SurgSim/Framework/Barrier.h000066400000000000000000000047551277777236100212140ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Based on barrier.hpp from Boost 1.51 // Copyright (C) 2002-2003 // David Moore, William E. Kempf // Copyright (C) 2007-8 Anthony Williams // // Which was distributed under the Boost Software License, Version 1.0. // (See accomanying NOTICES or a copy at http://www.boost.org/LICENSE_1_0.txt) #ifndef SURGSIM_FRAMEWORK_BARRIER_H #define SURGSIM_FRAMEWORK_BARRIER_H #include #include #include #include #include "SurgSim/Framework/Assert.h" namespace SurgSim { namespace Framework { /// Barrier class, synchronize a set of threads to wait at a common point, all /// threads will wait at Barrier::wait(val) until the number of threads calling /// wait is equal to the number given in the constructor. /// Additionally wait will return a boolean AND over all the values passed into /// the wait function, this can be used to signal a failure condition across /// threads. class Barrier { public: /// Construct the barrier. /// \param count Number of threads to synchronize, can't be 0. explicit Barrier(size_t count); /// Waits until all \a count threads have called wait. /// /// The wait calls in all of the threads waiting on a barrier will return /// the same value. This return value will be true if the \c success /// argument was true in \em all of the threads; if any thread passes false, /// the return value will be false. /// \param success a value indicating if this thread has been successful, used to determine the return /// value across all threads. /// \return true if all threads claimed success, false otherwise. bool wait(bool success); private: boost::mutex m_mutex; boost::condition_variable m_cond; size_t m_threshold; size_t m_count; size_t m_generation; bool m_success; bool m_successResult; }; } // namespace Framework } // namespace SurgSim #endif opensurgsim-0.7.0/SurgSim/Framework/BasicSceneElement.cpp000066400000000000000000000017031277777236100234600ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Framework/BasicSceneElement.h" namespace SurgSim { namespace Framework { BasicSceneElement::BasicSceneElement(const std::string& name) : SurgSim::Framework::SceneElement(name) { } BasicSceneElement::~BasicSceneElement() { } bool BasicSceneElement::doInitialize() { return true; } } } opensurgsim-0.7.0/SurgSim/Framework/BasicSceneElement.h000066400000000000000000000027151277777236100231310ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_FRAMEWORK_BASICSCENEELEMENT_H #define SURGSIM_FRAMEWORK_BASICSCENEELEMENT_H #include "SurgSim/Framework/SceneElement.h" #include "SurgSim/Framework/Macros.h" namespace SurgSim { namespace Framework { /// Simple concrete implementation of a scene element that does not have any higher logic class BasicSceneElement : public SurgSim::Framework::SceneElement { public: /// Constructor /// \name Name of the scene element explicit BasicSceneElement(const std::string& name); /// Destructor virtual ~BasicSceneElement(); SURGSIM_CLASSNAME(SurgSim::Framework::BasicSceneElement); protected: /// Initializes the scene element /// \return True if succeeds, false if fails bool doInitialize() override; }; }; // namespace Framework }; // namespace SurgSim #endif // SURGSIM_FRAMEWORK_BASICSCENEELEMENT_H opensurgsim-0.7.0/SurgSim/Framework/BasicThread.cpp000066400000000000000000000164461277777236100223320ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Framework/BasicThread.h" #include #include #include #include "SurgSim/Framework/Assert.h" #include "SurgSim/Framework/Clock.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Framework/Runtime.h" namespace SurgSim { namespace Framework { BasicThread::BasicThread(const std::string& name) : m_logger(Logger::getLogger(name)), m_name(name), m_period(1.0 / 30), m_isIdle(false), m_isInitialized(false), m_isRunning(false), m_stopExecution(false), m_isSynchronous(false) { // The maximum number of frames in the timer is set to 1,000,000 // + If the timer is reset every second, that is enough frame to measure real rates up to 1MHz // + If the timer is reset every minute, that is enough frame to measure real rates up to 16.66KHz // + If the timer is reset every hour, that is enough frame to measure real rates up to 277.77Hz m_timer.setMaxNumberOfFrames(1000000); } #ifdef _MSC_VER BasicThread::~BasicThread() throw(...) // Visual Studio does not support noexcept. The throw(...) is optional. #else BasicThread::~BasicThread() noexcept(false) /// C++11 introduced noexcept #endif { // Still need to stop thread to get a clean exit if (m_isRunning || m_thisThread.joinable()) { SURGSIM_FAILURE() << "A BasicThread instance destructor was called while the thread was still running or " << "in the process of being stopped, this is currently not supported. If this was intentional " << "call stop() before destruction of the thread. If this is unintentional, make sure to prevent " << "the destructor from being called."; } } bool BasicThread::isInitialized() { return m_isInitialized; } bool BasicThread::isRunning() const { return m_isRunning; } bool BasicThread::initialize() { m_isInitialized = doInitialize(); return m_isInitialized; } bool BasicThread::startUp() { return doStartUp(); } void BasicThread::start(std::shared_ptr startupBarrier, bool isSynchronized) { boost::unique_lock lock(m_mutexStartStop); m_startupBarrier = startupBarrier; m_stopExecution = false; m_isRunning = false; m_isSynchronous = isSynchronized; // Start the thread with a reference to this // prevents making a copy m_isRunning = true; m_thisThread = boost::thread(boost::ref(*this)); } boost::thread& BasicThread::getThread() { return m_thisThread; } void BasicThread::operator()() { bool success = executeInitialization(); if (! success) { m_isRunning = false; return; } size_t numUpdates = 0; boost::chrono::duration totalFrameTime(0.0); boost::chrono::duration sleepTime(0.0); boost::chrono::duration totalSleepTime(0.0); Clock::time_point start; m_timer.start(); while (m_isRunning && !m_stopExecution) { start = Clock::now(); if (! m_isSynchronous) { if (!m_isIdle) { m_timer.beginFrame(); m_isRunning = doUpdate(m_period.count()); m_timer.endFrame(); } // Check for frameTime being > desired update period report error, adjust ... sleepTime = m_period - (Clock::now() - start); if (sleepTime.count() > 0.0) { totalSleepTime += sleepTime; SurgSim::Framework::sleep_until(start + m_period); } } else { // HS-2014-feb-21 This is not thread safe, if setSynchronous(false) is called while the thread is in the // _not_ in the wait state, the thread will exit without having issued a wait, this will cause the // all the threads that are waiting to indefinitely wait as there is one less thread on the barrier // #threadsafety bool success = waitForBarrier(true); totalSleepTime += Clock::now() - start; if (success && !m_isIdle) { m_timer.beginFrame(); m_isRunning = doUpdate(m_period.count()); m_timer.endFrame(); } if (! success || !m_isRunning) { m_isRunning = false; m_isSynchronous = false; } } totalFrameTime += Clock::now() - start; numUpdates++; if (m_logger->getThreshold() <= SURGSIM_LOG_LEVEL(INFO)) { if (totalFrameTime.count() > 5.0) { SURGSIM_LOG_INFO(m_logger) << std::setprecision(4) << "Rate: " << numUpdates / totalFrameTime.count() << "Hz / " << 1.0 / m_period.count() << "Hz, " << "Average doUpdate: " << (totalFrameTime.count() - totalSleepTime.count()) / numUpdates << "s, " << "Sleep: " << 100.0 * totalSleepTime.count() / totalFrameTime.count() << "%"; totalFrameTime = boost::chrono::duration::zero(); totalSleepTime = boost::chrono::duration::zero(); numUpdates = 0; } } } doBeforeStop(); m_isRunning = false; m_stopExecution = false; } void BasicThread::stop() { boost::unique_lock lock(m_mutexStartStop); m_stopExecution = true; if (! m_isSynchronous) { if (! m_thisThread.joinable()) { SURGSIM_LOG_INFO(m_logger) << "Thread is detached, cannot wait for it to stop."; } else { m_thisThread.join(); } } else { SURGSIM_LOG_INFO(m_logger) << "Thread is in synchronouse mode, stop with a barrier->wait(false)."; } } void BasicThread::setIdle(bool isIdle) { m_isIdle = isIdle; } bool BasicThread::isIdle() { return m_isIdle; } std::string BasicThread::getName() const { return m_name; } bool BasicThread::executeInitialization() { bool success = true; success = initialize(); SURGSIM_ASSERT(success) << "Initialization has failed for thread " << getName(); SURGSIM_LOG_INFO(m_logger) << "Initialization has succeeded for thread"; // Waits for all the threads to init and then proceeds // If one of the other thread asserts and ends this does not matter // as the process will be taken down success = waitForBarrier(success); if (!success) { return success; } success = startUp(); SURGSIM_ASSERT(success) << "Startup has failed for thread " << getName(); SURGSIM_LOG_INFO(m_logger) << "Startup has succeeded for thread " << getName(); // Waits for all the threads to startup and then proceeds success = waitForBarrier(success); return success; } bool BasicThread::waitForBarrier(bool success) { if (m_startupBarrier != nullptr) { success = m_startupBarrier->wait(success); } return success; } bool BasicThread::setSynchronous(bool val) { if (m_startupBarrier != nullptr) { m_isSynchronous = val; } return m_isSynchronous; } bool BasicThread::isSynchronous() { return m_isSynchronous; } double BasicThread::getCpuTime() const { return m_timer.getCumulativeTime(); } size_t BasicThread::getUpdateCount() const { return m_timer.getCurrentNumberOfFrames(); } void BasicThread::resetCpuTimeAndUpdateCount() { m_timer.start(); } bool BasicThread::doUpdate(double dt) { return true; } void SurgSim::Framework::BasicThread::doBeforeStop() { } }; // namespace Framework }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Framework/BasicThread.h000066400000000000000000000164421277777236100217730ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_FRAMEWORK_BASICTHREAD_H #define SURGSIM_FRAMEWORK_BASICTHREAD_H #include #include #include #include #include "SurgSim/Framework/Barrier.h" #include "SurgSim/Framework/Timer.h" namespace SurgSim { namespace Framework { class Component; class Runtime; /// Basic thread implementation, tries to maintain a constant rate, supplies /// startup an initialization, can be synchronized with other threads at startup /// after calling doRun() a thread be be set off and doInit() and doStartup() will /// be called in succession. If given a startup barrier the sequence will pause at /// both steps until all other threads are done with these steps. /// Initialization can be further customized by implementing a executeInitialization() function. /// When a barrier was used to start up the thread it can also be used to run the thread in a /// synchronous fashion. Use setIsSynchrous(true) to switch the thread over, after that the thread /// will wait for the barrier to trigger before it executes another update. When running asynchronously the thread /// cannot be stopped with the stop() call, a barrier wait with an argument of false has to be used /// to stop the thread. The thread can be set back to asynchronous execution, one last barrier wait after /// the switch has to be executed for the thread to come out of the wait. class BasicThread { public: explicit BasicThread(const std::string& name = "Unknown Thread"); #ifdef _MSC_VER virtual ~BasicThread() throw(...); // Visual Studio does not support noexcept. The throw(...) is optional. #else virtual ~BasicThread() noexcept(false); /// C++11 introduced noexcept #endif /// Live cycle functions, public implementation. /// All of these have virtual partners as private functions /// Start the thread from the outside, this will call the private /// run() function that can be overridden for each implementor of this /// interface. /// \param startupBarrier is a barrier it synchronizes a group of thread that should go through their startup /// sequence in step. /// \param isSynchronous when true the thread will wait on the barrier after each call to update(dt), this /// means that only one step will be performed at a time void start(std::shared_ptr startupBarrier = nullptr, bool isSynchronous = false); /// Stopping the execution, blocks until the running thread has actually stopped, /// \note When the thread is in synchronous mode, it needs to be stopped with a call to /// the barrier wait function with an argument of false, of course it can always be stopped /// by going back to asynchronous mode and then calling stop void stop(); /// Set/Unset the thread in an idle state (doUpdate() called or not in the update() method) /// \param isIdle True to set the thread in an idle state, false otherwise void setIdle(bool isIdle); /// Query if this thread is in idle state or not /// \return true if the thread is in idle state, false otherwise. bool isIdle(); /// Query if this object is initialized. /// \return true if initialized, false if not. bool isInitialized(); /// Query if this object is running. /// \return true if the threads update() function is being called bool isRunning() const; /// This is what boost::thread executes on thread creation. void operator()(); /// \return the boost threading object boost::thread& getThread(); /// \return the name of the thread std::string getName() const; /// Set the update rate of the thread /// \param val rate in hertz (updates per second) of the thread void setRate(double val) { m_period = boost::chrono::duration(1.0 / val); } /// Sets the thread to synchronized execution in concert with the startup /// barrier, the startup barrier has to exist for this call to succeed. /// When the thread is set to run synchronized it will only execute one update at a time /// and then wait for the startup barrier to wake it up again. /// \param val if true the thread will need to be controlled via the barrier. /// \return the actual value of isSynchronous() /// \note HS-2013-nov-01 Currently mostly for use in unit tests and debugging, when multiple thread with differing /// rates are being synchronized the call rates will not correspond to the expected rates. bool setSynchronous(bool val); /// Query if this object is synchronized. /// \return true if synchronized, false if not. bool isSynchronous(); /// \return the cumulated cpu time taken to run all update since last reset or thread creation /// \note Only the latest 1,000,000 frames since last reset are cumulated, so if the timer is never reset, /// \note the Cpu time will not increase past that limit. double getCpuTime() const; /// \return the number of updates done since last reset or thread creation /// \note The update count since last reset has a limit of 1,000,000. size_t getUpdateCount() const; /// Reset the cpu time and the update count to 0 void resetCpuTimeAndUpdateCount(); protected: /// Timer to measure the actual time taken to doUpdate Timer m_timer; /// Trigger the initialization of this object, this will be called before all other threads doStartup() /// are called /// \return true on success bool initialize(); /// Trigger the startup of this object, this will be called after all other threads doInit() was called /// the thread will only enter the run loop triggering upated() if all threads doInit() and doStartup() /// returned true /// \return true on success bool startUp(); bool waitForBarrier(bool success); virtual bool executeInitialization(); /// Logger for this thread std::shared_ptr m_logger; private: std::string m_name; boost::thread m_thisThread; boost::chrono::duration m_period; std::shared_ptr m_startupBarrier; // Protects the start and stop functions so on can only execute once the other is done boost::mutex m_mutexStartStop; bool m_isIdle; bool m_isInitialized; bool m_isRunning; bool m_stopExecution; bool m_isSynchronous; virtual bool doInitialize() = 0; virtual bool doStartUp() = 0; /// Implementation of actual work function for this thread, this has a default implementation to handle /// destruction better, as it could be called while the thread is under destruction, if left unimplemented /// this would trigger a call to a pure virtual function. /// \return false when the thread is done, this will stop execution virtual bool doUpdate(double dt); /// Prepares the thread for its execution to be stopped /// \note Called from this thread before joined virtual void doBeforeStop(); }; }; // namespace Framework }; // namespace SurgSim #endif // SURGSIM_FRAMEWORK_BASICTHREAD_H opensurgsim-0.7.0/SurgSim/Framework/Behavior.h000066400000000000000000000034511277777236100213550ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_FRAMEWORK_BEHAVIOR_H #define SURGSIM_FRAMEWORK_BEHAVIOR_H #include "SurgSim/Framework/Component.h" namespace SurgSim { namespace Framework { /// Fixed List of enums for the available manager types, do not explicitly assign values, /// MANAGER_TYPE_COUNT is used to determine the number of actual manager types enum { MANAGER_TYPE_NONE = -1, MANAGER_TYPE_BEHAVIOR, MANAGER_TYPE_GRAPHICS, MANAGER_TYPE_INPUT, MANAGER_TYPE_PHYSICS, MANAGER_TYPE_COUNT }; /// Behaviors perform actions. They can update components, facilitate /// communication between components, and create new components. They are /// updated periodicly by the BehaviorManager through update() call. class Behavior: public Component { public: explicit Behavior(const std::string& name) : Component(name) { } virtual ~Behavior() { } /// Update the behavior /// \param dt The length of time (seconds) between update calls. virtual void update(double dt) = 0; /// Specifies which manger will handle this behavior virtual int getTargetManagerType() const { return MANAGER_TYPE_BEHAVIOR; } }; }; //namespace Framework }; //namespace SurgSim #endif // SURGSIM_FRAMEWORK_BEHAVIOR_H opensurgsim-0.7.0/SurgSim/Framework/BehaviorManager.cpp000066400000000000000000000031001277777236100231720ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Framework/BehaviorManager.h" #include "SurgSim/Framework/Component.h" #include "SurgSim/Framework/Logger.h" namespace SurgSim { namespace Framework { BehaviorManager::BehaviorManager() : ComponentManager("Behavior Manager") { m_logger = SurgSim::Framework::Logger::getLogger(getName()); } BehaviorManager::~BehaviorManager() { } bool BehaviorManager::doInitialize() { return true; } bool BehaviorManager::doStartUp() { return true; } bool BehaviorManager::executeAdditions(const std::shared_ptr& component) { return false; } bool BehaviorManager::executeRemovals(const std::shared_ptr& component) { return false; } bool BehaviorManager::doUpdate(double dt) { processBehaviors(dt); processComponents(); return true; } int BehaviorManager::getType() const { return MANAGER_TYPE_BEHAVIOR; } }; // namespace Framework }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Framework/BehaviorManager.h000066400000000000000000000031061277777236100226450ustar00rootroot00000000000000 // This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_FRAMEWORK_BEHAVIORMANAGER_H #define SURGSIM_FRAMEWORK_BEHAVIORMANAGER_H #include #include "SurgSim/Framework/ComponentManager.h" namespace SurgSim { namespace Framework { /// Manager to handle Behaviors. The manager will collect all the behaviors /// in the scene through addComponent/removeComponent calls. All the /// behaviors will be update once per period (default 30Hz) once the /// BehaviorManager is started. class BehaviorManager : public ComponentManager { public: BehaviorManager(); ~BehaviorManager(); int getType() const override; protected: bool executeAdditions(const std::shared_ptr& component) override; bool executeRemovals(const std::shared_ptr& component) override; private: bool doInitialize() override; bool doStartUp() override; bool doUpdate(double dt) override; }; }; // namespace Framework }; // namespace SurgSim #endif // SURGSIM_FRAMEWORK_BEHAVIORMANAGER_H opensurgsim-0.7.0/SurgSim/Framework/CMakeLists.txt000066400000000000000000000044231277777236100222050ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2012-2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. set(SURGSIM_FRAMEWORK_SOURCES Accessible.cpp ApplicationData.cpp AssertMessage.cpp Asset.cpp Barrier.cpp BasicSceneElement.cpp BasicThread.cpp BehaviorManager.cpp Component.cpp ComponentManager.cpp FrameworkConvert.cpp Logger.cpp LoggerManager.cpp LogMessageBase.cpp LogOutput.cpp PoseComponent.cpp Representation.cpp Runtime.cpp SamplingMetricBase.cpp Scene.cpp SceneElement.cpp ThreadPool.cpp Timer.cpp TransferPropertiesBehavior.cpp ) set(SURGSIM_FRAMEWORK_HEADERS Accessible.h Accessible-inl.h ApplicationData.h Assert.h AssertMessage.h Asset.h Barrier.h BasicSceneElement.h BasicThread.h Behavior.h BehaviorManager.h Clock.h Component.h Component-inl.h ComponentManager.h ComponentManager-inl.h FrameworkConvert.h FrameworkConvert-inl.h LockedContainer.h Log.h Logger.h LoggerManager.h LogMacros.h LogMessage.h LogMessageBase.h LogOutput.h Macros.h ObjectFactory.h ObjectFactory-inl.h PoseComponent.h Representation.h ReuseFactory.h Runtime.h SamplingMetricBase.h Scene.h SceneElement.h SceneElement-inl.h SharedInstance.h SharedInstance-inl.h ThreadPool.h ThreadPool-inl.h Timer.h TransferPropertiesBehavior.h ) surgsim_create_library_header(Framework.h "${SURGSIM_FRAMEWORK_HEADERS}") surgsim_add_library( SurgSimFramework "${SURGSIM_FRAMEWORK_SOURCES}" "${SURGSIM_FRAMEWORK_HEADERS}" ) SET(LIBS ${Boost_LIBRARIES} ${YAML_CPP_LIBRARIES} ) target_link_libraries(SurgSimFramework ${LIBS}) if(BUILD_TESTING) add_subdirectory(UnitTests) endif() add_subdirectory(Documentation) # Put SurgSimFramework into folder "Framework" set_target_properties(SurgSimFramework PROPERTIES FOLDER "Framework") opensurgsim-0.7.0/SurgSim/Framework/Clock.h000066400000000000000000000031351277777236100206500ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_FRAMEWORK_CLOCK_H #define SURGSIM_FRAMEWORK_CLOCK_H #include #include /// \file /// Place for a simple wrapper around boost namespace SurgSim { namespace Framework { /// Wraps around the actual clock we are using. typedef boost::chrono::high_resolution_clock Clock; /// A more accurate sleep_until that accounts for scheduler errors /// \tparam C Clock type /// \tparam D Duration type /// \param time The time point in absolute time to sleep until template void sleep_until(const boost::chrono::time_point& time) { // 2ms gives good results on windows and linux static const boost::chrono::duration schedulerError(0.002); boost::chrono::time_point earlierTime = time - schedulerError; if (earlierTime > C::now()) { boost::this_thread::sleep_until(earlierTime); } while (C::now() < time) { boost::this_thread::yield(); } } }; // Framework }; // SurgSim #endif opensurgsim-0.7.0/SurgSim/Framework/Component-inl.h000066400000000000000000000024431277777236100223400ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_FRAMEWORK_COMPONENT_INL_H #define SURGSIM_FRAMEWORK_COMPONENT_INL_H namespace SurgSim { namespace Framework { template std::shared_ptr checkAndConvert(std::shared_ptr incoming, const std::string& expectedTypeName) { SURGSIM_ASSERT(incoming != nullptr) << "Incoming pointer can't be nullptr"; auto result = std::dynamic_pointer_cast(incoming); SURGSIM_ASSERT(result != nullptr) << "Expected " << expectedTypeName << " but received " << incoming->getClassName() << " which cannot " << "be converted, in component " << incoming->getFullName() << "."; return result; }; } } #endif opensurgsim-0.7.0/SurgSim/Framework/Component.cpp000066400000000000000000000110101277777236100221010ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Framework/Component.h" #include #include "SurgSim/Framework/Assert.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Framework/PoseComponent.h" #include "SurgSim/Framework/SceneElement.h" namespace SurgSim { namespace Framework { // Forward References class Runtime; class Scene; Component::Component(const std::string& name) : m_name(name), m_uuid(boost::uuids::random_generator()()), m_didInit(false), m_didWakeUp(false), m_isInitialized(false), m_isAwake(false), m_isLocalActive(true) { SURGSIM_ADD_RO_PROPERTY(Component, bool, IsActive, isActive); SURGSIM_ADD_SERIALIZABLE_PROPERTY(Component, bool, IsLocalActive, isLocalActive, setLocalActive); } Component::~Component() { } std::string Component::getName() const { return m_name; } std::string Component::getFullName() const { std::string name; const auto& sceneElement = getSceneElement(); if (sceneElement != nullptr) { name = sceneElement->getName() + "/"; } return name + m_name; } void Component::setName(const std::string& name) { m_name = name; } bool Component::isInitialized() const { return m_isInitialized; } bool Component::initialize(const std::weak_ptr& runtime) { SURGSIM_ASSERT(!m_didInit) << "Double initialization called in component " << getName(); m_runtime = runtime; m_didInit = true; m_isInitialized = doInitialize(); return m_isInitialized; } bool Component::isAwake() const { return m_isAwake; } bool Component::wakeUp() { SURGSIM_ASSERT(! m_didWakeUp) << "Double wakeup called on component." << getName(); SURGSIM_ASSERT(m_didInit) << "Component " << getName() << " was awoken without being initialized."; SURGSIM_ASSERT(m_isInitialized) << "Wakeup called even though initialization failed on component." << getName(); m_didWakeUp = true; m_isAwake = doWakeUp(); return m_isAwake; } void Component::retire() { doRetire(); m_isAwake = false; } void Component::doRetire() { return; } void Component::setScene(std::weak_ptr scene) { m_scene = scene; } std::shared_ptr Component::getScene() { return m_scene.lock(); } void Component::setSceneElement(std::weak_ptr sceneElement) { m_sceneElement = sceneElement; } std::shared_ptr Component::getSceneElement() { return m_sceneElement.lock(); } std::shared_ptr Component::getSceneElement() const { return m_sceneElement.lock(); } std::shared_ptr Component::getRuntime() const { return m_runtime.lock(); } std::shared_ptr Component::getPoseComponent() const { SURGSIM_ASSERT(m_isInitialized) << "Can't access the pose component before initialization"; return m_sceneElement.lock()->getPoseComponent(); } std::shared_ptr Component::getPoseComponent() { SURGSIM_ASSERT(m_isInitialized) << "Can't access the pose component before initialization"; return m_sceneElement.lock()->getPoseComponent(); } boost::uuids::uuid Component::getUuid() const { return m_uuid; } std::string Component::getClassName() const { SURGSIM_LOG_WARNING(Logger::getDefaultLogger()) << "getClassName() called on Component base class, this is wrong" << " in almost all cases, this means there is a class that does not have getClassName() defined."; return "SurgSim::Framework::Component"; } std::shared_ptr Component::getSharedPtr() { std::shared_ptr result; try { result = shared_from_this(); } catch (const std::exception&) { SURGSIM_FAILURE() << "Component was not created as a shared_ptr."; } return result; } bool Component::isActive() const { if (getSceneElement() != nullptr) { return getSceneElement()->isActive() && m_isLocalActive; } else { return m_isLocalActive; } } void Component::setLocalActive(bool val) { m_isLocalActive = val; } bool Component::isLocalActive() const { return m_isLocalActive; } }; // namespace Framework }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Framework/Component.h000066400000000000000000000165641277777236100215710ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_FRAMEWORK_COMPONENT_H #define SURGSIM_FRAMEWORK_COMPONENT_H #include #include #include #include "SurgSim/Framework/Accessible.h" #include "SurgSim/Framework/ObjectFactory.h" namespace SurgSim { namespace Framework { // Forward References class PoseComponent; class Runtime; class Scene; class SceneElement; /// Component is the main interface class to pass information to the system managers each will decide /// whether to handle a component of a given type or not. Components will get initialized by having /// doInit(), and doWakeUp() called in succession, all components together will have doInit() called before /// any component will recieve doWakeUp() class Component : public Accessible, public std::enable_shared_from_this, public FactoryBase1 { public: /// Constructor /// \param name Name of the component explicit Component(const std::string& name); /// Destructor virtual ~Component(); /// Gets component name. /// \return Name of this component. std::string getName() const; /// Gets a string containing the name of the Component and (if it has one) its SceneElement. /// \return Name of Component and SceneElement. std::string getFullName() const; /// Sets the name of component. /// \param name The name of this component. void setName(const std::string& name); /// Gets the id of the component boost::uuids::uuid getUuid() const; /// \return True if this component is initialized; otherwise, false. bool isInitialized() const; /// Initialize this component, this needs to be called before wakeUp() can be called. /// This will be done automatically by the Scene hierarchy, either in SceneElement::addComponent(), if /// SceneElement has already been added to the Scene, or through Scene::addSceneElement() on all Components /// on the SceneElement. /// \param runtime The runtime which contains this component. /// \return True if this component is initialized successfully; otherwise, false. bool initialize(const std::weak_ptr& runtime); /// \return True if this component is awake; otherwise, false. bool isAwake() const; /// Wakeup this component, this will be called when the component is inserted into the ComponentManager that is /// responsible for handling this component. /// \return True if this component is woken up successfully; otherwise, false. bool wakeUp(); /// Retire this component, this will be called when the component is removed from the ComponentManager that is /// responsible for handling this component. This gives the component a chance to get rid of all shared objects void retire(); /// Sets the scene. /// \param scene The scene for this component void setScene(std::weak_ptr scene); /// Gets the scene. /// \return The scene for this component std::shared_ptr getScene(); /// Sets the scene element. /// \param sceneElement The scene element for this component. void setSceneElement(std::weak_ptr sceneElement); /// Gets the scene element. /// \return The scene element for this component. std::shared_ptr getSceneElement(); /// Gets the scene element, constant version /// \return The scene element for this component. std::shared_ptr getSceneElement() const; /// Get the runtime which contains this component. /// \return The runtime which contains this component. std::shared_ptr getRuntime() const; /// The class name for this class, this being the base class it should /// return SurgSim::Framework::Component but this would make missing implemenentations /// of this hard to catch, therefore this calls SURGSIM_FAILURE. /// \note Use the SURGSIM_CLASSNAME macro in derived classes. /// \return The fully namespace qualified name of this class. virtual std::string getClassName() const; /// Gets a shared pointer to this component. /// \return The shared pointer. std::shared_ptr getSharedPtr(); /// Interface to be implemented by derived classes /// \return True if component is initialized successfully; otherwise, false. virtual bool doInitialize() = 0; /// Interface to be implemented by derived classes /// \return True if component is woken up successfully; otherwise, false. virtual bool doWakeUp() = 0; /// Interface to be implemented by derived classes /// Has a default implementation, does nothing virtual void doRetire(); /// \return True if this component is active and its SceneElement (if any) is also active; /// Otherwise, false. bool isActive() const; /// Set the component's active state /// \param val If true component is active, inactive if false. virtual void setLocalActive(bool val); /// \return True if this component is active /// Otherwise, false. bool isLocalActive() const; protected: /// Get the PoseComponent for this component /// \return The PoseComponent virtual std::shared_ptr getPoseComponent(); /// Get the PoseComponent for this component, constant access /// \return The PoseComponent virtual std::shared_ptr getPoseComponent() const; private: /// Name of this component std::string m_name; /// Id of this component boost::uuids::uuid m_uuid; /// Runtime which contains this component std::weak_ptr m_runtime; /// Scene which contains this component std::weak_ptr m_scene; /// SceneElement which contains this component std::weak_ptr m_sceneElement; /// Indicates if doInitialize() has been called bool m_didInit; /// Indicates if doWakeup() has been called bool m_didWakeUp; /// Indicates if this component is initialized bool m_isInitialized; /// Indicates if this component is awake bool m_isAwake; /// Indicates if this component is active bool m_isLocalActive; }; /// The function tries to convert the Source type to the Target type it will throw if Target is not a subclass /// of Source. /// \tparam Target type that is used as the target type for the conversion, can usually be deduced /// \tparam Source type that is the type of the incoming parameter, target needs to be a subclass of Source for the /// function to succeed /// \param incoming pointer to an instance of Source that is supposed to be converted to a pointer to Target /// \param expectedTypeName a name to be used in the error message if the conversion fails, use the full /// namespace name of Source here. /// \throws if /// \return pointer of type Target if Target is a subclass of Source, throws otherwise. template std::shared_ptr checkAndConvert(std::shared_ptr incoming, const std::string& expectedTypeName); }; // namespace Framework }; // namespace SurgSim #include "SurgSim/Framework/Component-inl.h" #endif // SURGSIM_FRAMEWORK_COMPONENT_H opensurgsim-0.7.0/SurgSim/Framework/ComponentManager-inl.h000066400000000000000000000063011277777236100236300ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_FRAMEWORK_COMPONENTMANAGER_INL_H #define SURGSIM_FRAMEWORK_COMPONENTMANAGER_INL_H namespace SurgSim { namespace Framework { /// Executes the add component operation. /// \tparam T Type of the component to be added. /// \param component The component that is being added. /// \param [in,out] container The container that the component is being added to. /// \return The correctly cast component if it is of type T and does not exist in the container yet, nullptr otherwise. template std::shared_ptr ComponentManager::tryAddComponent(std::shared_ptr component, std::vector>* container) { SURGSIM_ASSERT(component != nullptr) << "Trying to add a component that is null"; SURGSIM_ASSERT(container != nullptr) << "Trying to use a component container that is null"; std::shared_ptr typedComponent = std::dynamic_pointer_cast(component); if (typedComponent != nullptr) { auto found = std::find(container->cbegin(), container->cend(), typedComponent); if (found == container->cend()) { SURGSIM_LOG_INFO(m_logger) << "Added component " << component->getFullName(); container->push_back(typedComponent); } else { SURGSIM_LOG_INFO(m_logger) << "Component " << component->getFullName() << " already added to " << getName(); typedComponent = nullptr; } } return typedComponent; }; template bool ComponentManager::tryRemoveComponent(std::shared_ptr component, std::vector>* container) { SURGSIM_ASSERT(container != nullptr) << "Trying to use a component container that is null"; bool result = false; std::shared_ptr typedComponent = std::dynamic_pointer_cast(component); if (typedComponent != nullptr && container->size() != 0) { auto found = std::find(container->begin(), container->end(), typedComponent); if (found != container->end()) { container->erase(found); SURGSIM_LOG_DEBUG(m_logger) << __FUNCTION__ << " Removed component " << typedComponent->getName(); result = true; } else { SURGSIM_LOG_INFO(m_logger) << SURGSIM_CURRENT_FUNCTION << " Unable to remove component " << typedComponent->getName() << ". Not found."; } } return result; }; template void ComponentManager::retireComponents(const std::vector>& container) { static_assert(std::is_base_of::value == true, "Class has to be of type component"); for (const auto& component : container) { component->retire(); } } }; // namespace Framework }; // namespace SurgSim #endif opensurgsim-0.7.0/SurgSim/Framework/ComponentManager.cpp000066400000000000000000000153101277777236100234030ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Framework/ComponentManager.h" #include "SurgSim/Framework/Component.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Framework/Runtime.h" #include namespace SurgSim { namespace Framework { ComponentManager::ComponentManager(const std::string& name /*= "Unknown Component Manager"*/) : BasicThread(name) { } ComponentManager::~ComponentManager() { SURGSIM_LOG_INFO(m_logger) << getName() << " destruction"; } void ComponentManager::setRuntime(std::shared_ptr val) { m_runtime = val; } bool ComponentManager::enqueueAddComponent(const std::shared_ptr& component) { boost::lock_guard lock(m_componentMutex); m_componentAdditions.push_back(component); return true; } bool ComponentManager::enqueueRemoveComponent(const std::shared_ptr& component) { boost::lock_guard lock(m_componentMutex); m_componentRemovals.push_back(component); m_elementCache.push_back(component->getSceneElement()); return true; } std::shared_ptr ComponentManager::getRuntime() const { return m_runtime.lock(); } void ComponentManager::processComponents() { // Please note that the implementation of this function needs to mirror the executeInitialization() function. // This is called from within the update() function, and executeInitialization() is called at startup std::vector> inflightAdditions; std::vector> inflightRemovals; std::vector> inflightElements; std::vector> actualAdditions; copyScheduledComponents(&inflightAdditions, &inflightRemovals, &inflightElements); actualAdditions.reserve(inflightAdditions.size()); if (!inflightAdditions.empty()) { addComponents(std::begin(inflightAdditions), std::end(inflightAdditions), &actualAdditions); wakeUpComponents(std::begin(actualAdditions), std::end(actualAdditions)); } if (!inflightRemovals.empty()) { removeComponents(std::begin(inflightRemovals), std::end(inflightRemovals)); } } void ComponentManager::processBehaviors(const double dt) { auto it = std::begin(m_behaviors); auto endIt = std::end(m_behaviors); for (; it != endIt; ++it) { if ((*it)->isActive()) { (*it)->update(dt); } } } bool ComponentManager::executeInitialization() { // Please note that the implementation of this function needs to mirror processComponents() // this function is called at startup whereas the other is called during the update call. // Call BasicThread initialize to do the initialize and startup call bool success = BasicThread::executeInitialization(); if (! success) { return success; } // Now Initialize and and wakeup all the components std::vector> inflightAdditions; std::vector> inflightRemovals; std::vector> inflightElements; std::vector> actualAdditions; copyScheduledComponents(&inflightAdditions, &inflightRemovals, &inflightElements); actualAdditions.reserve(inflightAdditions.size()); if (! inflightAdditions.empty()) { addComponents(std::begin(inflightAdditions), std::end(inflightAdditions), &actualAdditions); } success = waitForBarrier(success); if (! success) { return success; } if (! inflightAdditions.empty()) { wakeUpComponents(std::begin(actualAdditions), std::end(actualAdditions)); } if (! inflightRemovals.empty()) { removeComponents(std::begin(inflightRemovals), std::end(inflightRemovals)); } success = waitForBarrier(success); return success; } void ComponentManager::copyScheduledComponents( std::vector>* inflightAdditions, std::vector>* inflightRemovals, std::vector>* inflightElements) { // Lock for any more additions or removals and then copy to local storage // this will insulate us from the actual add or remove call taking longer than it should boost::lock_guard lock(m_componentMutex); std::swap(m_componentAdditions, *inflightAdditions); m_componentAdditions.clear(); std::swap(m_componentRemovals, *inflightRemovals); m_componentRemovals.clear(); std::swap(m_elementCache, *inflightElements); m_elementCache.clear(); } void ComponentManager::removeComponents(const std::vector>::const_iterator& beginIt, const std::vector>::const_iterator& endIt) { for (auto it = beginIt; it != endIt; ++it) { if (tryRemoveComponent(*it, &m_behaviors) || executeRemovals(*it)) { (*it)->retire(); } } } void ComponentManager::addComponents( const std::vector>::const_iterator& beginIt, const std::vector>::const_iterator& endIt, std::vector>* actualAdditions) { // Add All Components to the internal storage for (auto it = beginIt; it != endIt; ++it) { std::shared_ptr behavior = std::dynamic_pointer_cast(*it); if (behavior != nullptr && behavior->getTargetManagerType() == getType()) { if (tryAddComponent(*it, &m_behaviors) != nullptr) { actualAdditions->push_back(*it); } } else if (executeAdditions(*it)) { actualAdditions->push_back(*it); } } } void ComponentManager::wakeUpComponents(const std::vector>::const_iterator& beginIt, const std::vector>::const_iterator& endIt) { for (auto it = beginIt; it != endIt; ++it) { if ((*it)->isInitialized() && !(*it)->isAwake()) { if (!(*it)->wakeUp()) { SURGSIM_LOG_WARNING(m_logger) << "Failed to wake up component " << (*it)->getName() << " in manager " << getName() << ". Component was not added to the manager!"; executeRemovals(*it); } } } } void ComponentManager::doBeforeStop() { for (const auto& behavior : m_behaviors) { behavior->retire(); } } /// Returns this manager's logger std::shared_ptr ComponentManager::getLogger() const { return m_logger; } }; // Framework }; // SurgSim opensurgsim-0.7.0/SurgSim/Framework/ComponentManager.h000066400000000000000000000176751277777236100230700ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_FRAMEWORK_COMPONENTMANAGER_H #define SURGSIM_FRAMEWORK_COMPONENTMANAGER_H #include #include #include #include #include "SurgSim/Framework/BasicThread.h" #include "SurgSim/Framework/Behavior.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Framework/Component.h" namespace SurgSim { namespace Framework { class Runtime; class Logger; /// Base Component Manager class. Component Managers manage a collection of components. /// The runtime will present each new component to the manager, and it is up to /// the manger to decide whether to handle a component of a given type or not. /// Adding and removing components is thread-safe, when the [add|remove]Component /// call is made, the component is added to an intermediary data structure, each /// ComponentManager implementation must call processComponents() to trigger the /// actual addition and removal. Each ComponentManager subclass needs to implement /// doAddComponent() and doRemoveComponent() to the actual addition and removal of /// components. /// ComponentManager implements a custom executeInitialization() method that lets the /// runtime schedule initialization of components that exist at the start of the simulation class ComponentManager : public BasicThread { public: explicit ComponentManager(const std::string& name = "Unknown Component Manager"); virtual ~ComponentManager(); /// Queues a component to be added later. /// \param component The component to be added. /// \return true if the component was scheduled for addition, this does not indicate that /// the component will actually be added to this manager bool enqueueAddComponent(const std::shared_ptr& component); /// Queues a component to be removed /// \param component The component to be removed. /// \return true if the component was scheduled for removal, this does not indicate that /// the component will actually be removed from this manager bool enqueueRemoveComponent(const std::shared_ptr& component); /// @{ /// Runtime accessors std::shared_ptr getRuntime() const; void setRuntime(std::shared_ptr val); /// @} protected: /// Template version of the addComponent method. /// \tparam T Specific type of the component that is being added. /// \param component The component that needs to be added. /// \param [in,out] container If non-null, the container that should receive the component if of the correct type. /// \return the correctly cast component pointer if successful and the /// component did not already exist in the container template std::shared_ptr tryAddComponent(std::shared_ptr component, std::vector>* container); /// Template version of the removeComponent method. /// \tparam T Specific type of the component that is being removed. /// \param component The component that needs to be removed. /// \param [in,out] container If non-null, the container, from which the component should be removed. /// \return true if the component exists in the container or the component did not cast to T, otherwise. template bool tryRemoveComponent(std::shared_ptr component, std::vector>* container); /// Processes all the components that are scheduled for addition or removal, this needs to be called /// inside the doUpdate() function. void processComponents(); /// Processes behaviors /// This needs to be called inside doUpdate() function in each 'sub' manager. void processBehaviors(const double dt); /// Returns the type of Manager // Enum is defined in the beginning of this file virtual int getType() const = 0; /// Helper, blocks access to the additions and removal queue and copies the components /// from there to the intermediate inflight queues, after this call, the incoming /// queues will be empty. void copyScheduledComponents(std::vector>* inflightAdditions, std::vector>* inflightRemovals, std::vector>* inflightElements); /// Returns this manager's logger std::shared_ptr getLogger() const; /// Blocks protects addition and removal queues boost::mutex m_componentMutex; ///@{ /// Data structures /// Contain components scheduled to be added/removed std::vector> m_componentAdditions; std::vector> m_componentRemovals; std::vector> m_elementCache; ///@} /// Collection of behaviors // Each behavior will have a type to be matched with the corresponding manager // Managers will only handle matching behaviors std::vector> m_behaviors; void doBeforeStop() override; template void retireComponents(const std::vector>& container); private: /// Adds a component. /// \param component The component to be added. /// \return true if the component was scheduled for addition, this does not indicate that /// the component will actually be added to this manager. virtual bool executeAdditions(const std::shared_ptr& component) = 0; /// Handle representations, override for each thread /// \param component The component to be removed. /// \return true if the component was scheduled for removal, this does not indicate that /// the component will actually be removed from this manager. virtual bool executeRemovals(const std::shared_ptr& component) = 0; /// Overridden from BasicThread, extends the initialization to contain component initialization /// including waiting for the other threads to conclude their component initialization and wakeup bool executeInitialization() override; /// Delegates to doRemoveComponent to remove all the components in the indicated array. /// \param beginIt The begin iterator. /// \param endIt The end iterator. void removeComponents(const std::vector>::const_iterator& beginIt, const std::vector>::const_iterator& endIt); /// Delegates to doAddComponent and calls initialize on all the components /// \param beginIt The begin iterator. /// \param endIt The end iterator. /// \param[out] actualAdditions List of components actually added void addComponents( const std::vector>::const_iterator& beginIt, const std::vector>::const_iterator& endIt, std::vector>* actualAdditions); /// Wake all the components up, only the components that were successfully initialized get /// the wakeup call, check for isAwake because there to catch multiple versions of the same /// component from being awoken more than once. Will also remove components if they did not /// wake up as expected /// \param beginIt The begin iterator. /// \param endIt The end iterator. void wakeUpComponents(const std::vector>::const_iterator& beginIt, const std::vector>::const_iterator& endIt); std::weak_ptr m_runtime; }; }; // namespace Framework }; // namespace SurgSim #include "SurgSim/Framework/ComponentManager-inl.h" #endif // SURGSIM_FRAMEWORK_COMPONENTMANAGER_H opensurgsim-0.7.0/SurgSim/Framework/Documentation/000077500000000000000000000000001277777236100222535ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Framework/Documentation/CMakeLists.txt000066400000000000000000000015731277777236100250210ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2012-2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. set(SURGSIM_FRAMEWORK_DOCUMENTATION framework.dox serialization.dox ) add_custom_target(SurgSimFrameworkDocumentation SOURCES ${SURGSIM_FRAMEWORK_DOCUMENTATION}) set_target_properties(SurgSimFrameworkDocumentation PROPERTIES FOLDER "Framework")opensurgsim-0.7.0/SurgSim/Framework/Documentation/framework.dox000066400000000000000000000004301277777236100247610ustar00rootroot00000000000000/*! \page Framework The OSS Framework \addtogroup Framework The 'Framework' namespace contains classes that are the basis of the OSS simulation framework. Most of the classes here are not used by themselves but are extended by the other libraries in OSS. \ref Serialization */ opensurgsim-0.7.0/SurgSim/Framework/Documentation/serialization.dox000066400000000000000000000156241277777236100256540ustar00rootroot00000000000000/*! \page Serialization Serialization Loading and storing of instances from the OpenSurgSim framework utilizes the facilities provided by YAML-cpp, the duck typing and introspection capabilities provided by SurgSim::Framework::Accessible and when necessary a generic class registration and factory mechanism provided by SurgSim::Framework::ObjectFactory. Together these classes enable a serialization solution that can load and store instances of classes without the need of knowing the structure. By using YAML::Node, we can represent data in a form that can be written to file and read from a file in the YAML format. By converting instances to and from YAML::Node we can enable the loading and storing of instances to disk. Depending on the requirements more or less work needs to be done to enable the conversions. We will describe the various steps in order of increasing complexity. ## Conventions For consistency we will agree on naming properties in CamelCase beginning with a capital letter, this concurs with the naming portion of the getter and setter. E.g. if a component has a public getter and setter getFileName() and setFileName() the property should be named 'FileName'. We reserve the names "ClassName", "Name" and "Uuid" for use in component serialization. ## POD SurgSim and YAML-cpp already include conversions from and to YAML::node for all the POD types that should be needed, int, float, double, std::map, std::vector, ... are handle, likewise with the main Eigen classes Matrix and Vector. These can all be used with YAML::Node as such. YAML::Node node; node["value"] = 1; int a = node["value"].as(); For more complex data types the conversion can be implemented as member functions, for consistency purposes the following signatures should be used: YAML::node Class::encode(); void Class::decode(const YAML::Node& node); If an addition to the member class is not possible or the conversion using 'node.as<>()' is wished, it will be necessary to specialize the YAML::convert structure for the required class type that needs to be converted. template <> YAML::convert(...) After implementing either of these it should be possible to create a node structure from the class under development, and to fill the members of the class with values from the node. When restoring the class these approaches work best if the class that is being handled implements a default constructor, when it does the data in the given node does not have to be inspected or extracted before class creation. And a class can be filled with data as such. Class a; a.decode(dataNode); When the constructor needs more data things like the following might become necessary possibly making the process more brittle int val = node["val"].as(); Class a(val); a.decode(dataNode); ## Accessible An easy way to enable serialization for a class is to derive from SurgSim::Framework::Accessible, and to declare all the classes' properties that need to be serialized through the `SURGSIM_SERIALIZABLE_PROPERTY` macro. This macro does two things, it declares a read/write property on the instance, but it also declares a conversion from and to YAML::Node for this property. `Accessible` implements `encode()` and `decode()` in a way so that all the properties that were declared serializable can be serialized to and from the YAML::Node. ## ObjectFactory The above approaches work well when the type of the data that is being serialized is known, e.g. a list of objects of the same type, or the specific member variables of a class. An additional facility needs to be utilized when the objects that are being dealt with are of heterogeneous types, i.e. list of objects with same base type but different subtypes. In this case a factory class needs to be filled and utilized. The main purpose of the factory is to create an instance of a class from the name of the class. `SurgSim::Framework::ObjectFactory` is one kind of factory class. For it to work correctly classes need to be registered with `ObjectFactory` through the `register()` template call. After register has been executed, you can create an instance of a class by calling `create("ClassName")` on the factory. Just by convention each class should indicate its name by using the 'ClassName' property or `getClassName()` member function. ### Registration For classes with limited subclasses it is usually pretty easy to execute all the calls to `register()` in one place, but sometimes this is not feasible and a more distributed approach is necessary. For Example when the classes are spread out over multiple libraries it can be hard to create an exhaustive list. In this case on can register the class through static initialisation using a macro. The following code used in the `.cpp` file can register a subclass in the superclasses factory if the superclass contains a factory. namespace { SURGSIM_REGISTER(BaseClass, DerivedClass) } with `Baseclass` being the fully qualified name of the base class e.g. `SurgSim::Framework::Component` and `Derived` the name of the derived class without name space e.g. `OsgBoxRepresentation`. ### Loading The key to restore the correct class under differing incoming classes is to implement the YAML conversion specialized to the base class pointer, when the decode function is called, the decode code can determine at runtime what instance needs to be created and call the appropriate factory function. After the correct instance has been created, a class member `decode()` function can be used to fill the appropriate member variables. ## Instances vs. References When there is a need to load and store references to objects, when objects are being shared amongst other objects the serialization can be specialized to object instances and object pointers to indicate whether a reference to an object as opposed to the actual object data should be written. template<> YAML::convert ... template<> YAMLL::convert> In the calling code the determination needs to be made whether the reference is serialized or the actual instance. Only the instance serialization should write out the data, the reference serializations should write out, a unique identifier for the instance and class information, if needed. When reading the unique identifier can be used to return a pointer to the shared instance in all places where the object is being used. When the actual data is found the normal `decode()` can be used to restore the member data. ## Component Loading and Storing All of the above mechanisms are in place for loading and storing components. The component class implements a factory, it utilizes the split convert object to serialize shared component references from the inside of a component. The data for a component can be written out when the owning `SceneElement` writes its component. Additionally there is a registry data structure for components in the inside of the convert object that can be used to restore shared instances to components. */ opensurgsim-0.7.0/SurgSim/Framework/FrameworkConvert-inl.h000066400000000000000000000035421277777236100236750ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_FRAMEWORK_FRAMEWORKCONVERT_INL_H #define SURGSIM_FRAMEWORK_FRAMEWORKCONVERT_INL_H #include #include "SurgSim/Framework/Assert.h" // Use of enable_if. this function is only created if 'T' is a subclass of SurgSim::Framework::Component // Which means for each subclass that is being deserialized, a new converter function is created template YAML::Node YAML::convert>::encode( const typename std::enable_if ::value, std::shared_ptr >::type rhs) { return YAML::convert>::encode(rhs); } template bool YAML::convert>::decode(const Node& node, typename std::enable_if ::value, std::shared_ptr >::type& rhs) //NOLINT { std::shared_ptr temporary; bool success = YAML::convert>::decode(node, temporary); if (success) { rhs = std::dynamic_pointer_cast(temporary); SURGSIM_ASSERT(rhs != nullptr) << "Failure to convert to target type in " << __FUNCTION__; } return success; } #endif opensurgsim-0.7.0/SurgSim/Framework/FrameworkConvert.cpp000066400000000000000000000166701277777236100234560ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Framework/BasicSceneElement.h" #include "SurgSim/Framework/Component.h" #include "SurgSim/Framework/Scene.h" #include "SurgSim/Framework/Asset.h" #include #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Framework/ApplicationData.h" namespace { const std::string NamePropertyName = "Name"; const std::string IdPropertyName = "Id"; } namespace YAML { Node convert>::encode( const std::shared_ptr rhs) { Node result; if (nullptr != rhs) { Node data; data[IdPropertyName] = to_string(rhs->getUuid()); data[NamePropertyName] = rhs->getName(); result[rhs->getClassName()] = data; } return result; } bool convert>::decode( const Node& node, std::shared_ptr& rhs) //NOLINT { bool result = false; if (!node.IsMap()) { return false; } SurgSim::Framework::Component::FactoryType& factory = SurgSim::Framework::Component::getFactory(); std::string className = node.begin()->first.as(); SURGSIM_ASSERT(factory.isRegistered(className)) << "Class " << className << " is not registered in the factory."; Node data = node.begin()->second; if (data.IsMap() && data[NamePropertyName].IsDefined()) { std::string name = data[NamePropertyName].as(); if (rhs == nullptr) { if (data[IdPropertyName].IsDefined()) { std::string id = data[IdPropertyName].as(); RegistryType& registry = getRegistry(); auto sharedComponent = registry.find(id); if (sharedComponent != registry.end()) { SURGSIM_ASSERT(name == sharedComponent->second->getName() && className == sharedComponent->second->getClassName()) << "The current node:" << std::endl << node << std::endl << "has the same id as an " << "instance already registered, but the name and/or the className are different. This is " << "likely a problem with a manually assigned id." << std::endl << "The original component is a:" << std::endl << sharedComponent->second->getClassName() << std::endl << sharedComponent->second->getName(); rhs = sharedComponent->second; } else { rhs = factory.create(className, name); getRegistry()[id] = rhs; } } else { rhs = factory.create(className, name); } } std::vector ignoredProperties; ignoredProperties.push_back(NamePropertyName); ignoredProperties.push_back(IdPropertyName); rhs->decode(data, ignoredProperties); result = true; } return result; } convert>::RegistryType& convert>::getRegistry() { static RegistryType registry; return registry; } Node convert::encode(const SurgSim::Framework::Component& rhs) { YAML::Node data(rhs.encode()); data[IdPropertyName] = to_string(rhs.getUuid()); data[NamePropertyName] = rhs.getName(); YAML::Node result; result[rhs.getClassName()] = data; return result; } Node convert>::encode( const std::shared_ptr rhs) { SURGSIM_ASSERT(rhs != nullptr) << "Trying to encode nullptr SceneElement"; return rhs->encode(false); } bool convert>::decode( const Node& node, std::shared_ptr& rhs) //NOLINT { if (rhs == nullptr) { // For now only deal with BasicSceneElement classes rhs = std::make_shared(""); } return rhs->decode(node); } bool YAML::convert>>::decode( const Node& node, std::vector>& rhs, // NOLINT std::vector* stack) { std::unique_ptr> localStack; if (node.IsSequence()) { if (stack == nullptr) { localStack.reset(new std::vector()); stack = localStack.get(); } for (auto element = node.begin(); element != node.end(); ++element) { if (element->IsMap() && element->begin()->first.as() == "INCLUDE") { auto file = element->begin()->second.as(); auto data = SurgSim::Framework::Runtime::getApplicationData(); SURGSIM_ASSERT(data->tryFindFile(file, &file)) << "Could not find include file " << file; SURGSIM_ASSERT(std::find(stack->cbegin(), stack->cend(), file) == stack->cend()) << "Found inclusion loop File: " << file << " included from " << stack->back() << " is already included."; auto included = YAML::LoadFile(file); stack->push_back(file); YAML::convert>>::decode( included, rhs, stack); stack->pop_back(); } else { rhs.push_back(element->as>()); } } } else if (node.IsMap()) { rhs.push_back(node.as>()); } else { SURGSIM_FAILURE() << "Trying to decode std::vector> but the received node is neither " << "a sequence nor a map"; return false; } return true; } Node convert::encode( const SurgSim::Framework::SceneElement& rhs) { return rhs.encode(true); } Node convert>::encode( const std::shared_ptr rhs) { SURGSIM_ASSERT(rhs != nullptr) << "Trying to encode nullptr Scene"; return rhs->encode(); } bool convert>::decode( const Node& node, std::shared_ptr& rhs) //NOLINT { bool result = false; if (rhs != nullptr) { result = rhs->decode(node); } return result; } YAML::Node YAML::convert>::encode( const std::shared_ptr rhs) { YAML::Node node; node[rhs->getClassName()] = rhs->encode(); return node; } bool YAML::convert>::decode( const Node& node, std::shared_ptr& rhs) //NOLINT { bool result = false; if (node.IsMap()) { if (nullptr == rhs) { std::string className = node.begin()->first.as(); auto& factory = SurgSim::Framework::Asset::getFactory(); if (factory.isRegistered(className)) { rhs = factory.create(className); } else { SURGSIM_FAILURE() << "Class " << className << " is not registered in the Asset factory."; } } Node data = node.begin()->second; if (data.IsMap()) { rhs->decode(data); } result = true; } return result; } } opensurgsim-0.7.0/SurgSim/Framework/FrameworkConvert.h000066400000000000000000000111351277777236100231120ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_FRAMEWORK_FRAMEWORKCONVERT_H #define SURGSIM_FRAMEWORK_FRAMEWORKCONVERT_H #include #include #include namespace SurgSim { namespace Framework { class Asset; class Component; class SceneElement; class Scene; } } namespace YAML { /// Specialization of YAML::convert for std::shared_ptr, this is used to redirect the serialization of a derived class /// to the specialization of the serialization for a base class, for example all subclasses of Component can use the /// Component serialization specialization, currently each redirection has to be implemented separately, the re is /// probably a way to do this automatically. /// \tparam T class that should be converted from a shared ptr template struct convert> { static YAML::Node encode( const typename std::enable_if ::value, std::shared_ptr>::type rhs); static bool decode( const Node& node, typename std::enable_if ::value, std::shared_ptr>::type& rhs); //NOLINT }; /// Specialization of YAML::convert for std::shared_ptr, use this for to read in a component /// written by the convert converter, or a reference to a /// component written by this converter. /// This specialization, is slightly asymmetric, on encode it will only encode a components /// name, id and className. When decoding this conversion will check whether a component with /// the same id has already been encountered. If no a new instance will be created and stored /// in a local Registry. If yes, the entry from the registry will be returned, this makes sure /// that all references to the same id will use the correct, copy of the smart pointer. /// Additionally this class contains a class factory that can be used to generate the class from /// its name. template <> struct convert> { static Node encode(const std::shared_ptr rhs); static bool decode(const Node& node, std::shared_ptr& rhs); //NOLINT typedef std::unordered_map> RegistryType; /// \return The static registry for shared instances static RegistryType& getRegistry(); }; /// Override of the convert structure for an Component, use this form to write out a full version /// of the component information, to decode a component use the other converter. This converter /// intentionally does not have a decode function. template<> struct convert { static Node encode(const SurgSim::Framework::Component& rhs); }; template<> struct convert> { static Node encode(const std::shared_ptr rhs); static bool decode(const Node& node, std::shared_ptr& rhs); //NOLINT }; template<> struct convert >> { static bool decode(const Node& node, std::vector>& rhs, //NOLINT std::vector* stack = nullptr); }; template<> struct convert { static Node encode(const SurgSim::Framework::SceneElement& rhs); }; template<> struct convert> { static Node encode(const std::shared_ptr rhs); static bool decode(const Node& node, std::shared_ptr& rhs); //NOLINT }; template<> struct convert> { static Node encode(const std::shared_ptr rhs); static bool decode(const Node& node, std::shared_ptr& rhs); //NOLINT }; }; #include "SurgSim/Framework/FrameworkConvert-inl.h" #endif // SURGSIM_FRAMEWORK_FRAMEWORKCONVERT_H opensurgsim-0.7.0/SurgSim/Framework/LockedContainer.h000066400000000000000000000160431277777236100226630ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_FRAMEWORK_LOCKEDCONTAINER_H #define SURGSIM_FRAMEWORK_LOCKEDCONTAINER_H #include #include namespace SurgSim { namespace Framework { /// A simple thread-safe data container that can support multiple writers and readers. /// /// The type of the contained data is determined by the template argument, and should satisfy the following: /// - It must be either default-constructable or copy-constructable or move-constructable. In other words, /// construction must be possible using either T() or T(const T&) or /// T(T&&), or compiler-generated equivalents. /// - It must be either copy-assignable or move-assignable. In other words, assignment must be possible using /// either operator=(const T&) or operator=(T&&), or compiler-generated /// equivalents. (If it is only move-assignable, then you can't get the value in the container without /// erasing it.) /// /// Note that STL container types, plain-old-data structs, and most other things you might want to use satisfy /// those requirements. /// /// The container will create and manage an extra internal instance of the data object. /// /// The interface has been designed to be incredibly simple. The trade-off is that the overhead of reading or /// writing to the container is significant (Each write incurs either a copy or a move of the data, plus a mutex /// lock/unlock. Each read incurs a copy, plus a mutex lock/unlock. Applications that write and read heavily /// may also become mutex-bound.) /// /// Writers write the data by calling the \ref set method, which copies or moves the data into internal storage. /// Readers read the data by calling the \ref get method, which copies the data from internal storage. /// /// \tparam T Type of the data held by the LockedContainer. template class LockedContainer { public: /// Create the container and the data it contains. /// /// The data will be initialized using the default constructor. LockedContainer() : m_buffer(), m_haveNewData(false) { } /// Create the container and the data it contains. /// /// The data will be initialized using the copy constructor. /// \param initialValue The initial value to be used. explicit LockedContainer(const T& initialValue) : m_buffer(initialValue), m_haveNewData(false) { } /// Create the container and the data it contains. /// /// The data in the active buffer will be initialized using the move constructor. /// The data in the second, inactive buffer will be initialized using the default constructor. /// \param initialValue The initial value to be moved into the active buffer. explicit LockedContainer(T&& initialValue) : m_buffer(std::move(initialValue)), m_haveNewData(false) { } /// Destroy the container and the data it contains. ~LockedContainer() { } /// Write (copy) new data into the container. /// /// The data will be copied into internal storage. If \ref set is called again before the next \ref get, /// the first data will be overwritten and lost. /// \param value The value to be written. void set(const T& value) { boost::lock_guard lock(m_mutex); m_buffer = value; m_haveNewData = true; } /// Write (move) new data into the container. /// /// The data will be moved into internal storage. If \ref set is called again before the next \ref get, the /// first data will be overwritten and lost. /// \param value The value to be written. void set(T&& value) { boost::lock_guard lock(m_mutex); m_buffer = std::move(value); m_haveNewData = true; } /// Read (copy) the data from the container. /// \param [out] value The location to write the data from the container. The pointer must be non-null. void get(T* value) const { boost::lock_guard lock(m_mutex); m_haveNewData = false; *value = m_buffer; } /// Move the data out of the container. /// For types that support move assignment, the internal state of the container will be invalidated. /// \param [out] value The location to write the data from the container. The pointer must be non-null. void take(T* value) { boost::lock_guard lock(m_mutex); m_haveNewData = false; *value = std::move(m_buffer); } /// Read (copy) the data from the container if it has been modified since the last access. /// If \ref set has not been called since the last \ref get, \ref take, \ref tryGetChanged or /// \ref tryTakeChanged, the method returns \c false and doesn't modify the data. /// /// \param [out] value The location to write the data from the container if it has changed. The pointer /// must be non-null. /// \return true if there was new data (which may or may not be equal to the old). Note that the initial /// value created when the object was constructed (if any) is not considered "new" data by this method. bool tryGetChanged(T* value) const { boost::lock_guard lock(m_mutex); if (! m_haveNewData) { return false; } else { m_haveNewData = false; *value = m_buffer; return true; } } /// Move the data out of the container if it has been modified since the last access. /// If \ref set has not been called since the last \ref get, \ref take, \ref tryGetChanged or /// \ref tryTakeChanged, the method returns \c false and doesn't modify the data. /// /// \param [out] value The location to write the data from the container if it has changed. The pointer /// must be non-null. /// \return true if there was new data (which may or may not be equal to the old). Note that the initial /// value created when the object was constructed (if any) is not considered "new" data by this method. bool tryTakeChanged(T* value) { boost::lock_guard lock(m_mutex); if (! m_haveNewData) { return false; } else { m_haveNewData = false; *value = std::move(m_buffer); return true; } } private: /// Prevent copying LockedContainer(const LockedContainer&); /// Prevent assignment LockedContainer& operator=(const LockedContainer&); /// Internal buffer. T m_buffer; /// True if there data that has been written, but not yet pulled in by get, take, etc. mutable bool m_haveNewData; /// Mutex for synchronization of set() and get() calls. mutable boost::mutex m_mutex; }; }; // namespace Framework }; // namespace SurgSim #endif // SURGSIM_FRAMEWORK_LOCKEDCONTAINER_H opensurgsim-0.7.0/SurgSim/Framework/Log.h000066400000000000000000000024671277777236100203450ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// The convenience header that provides the entirety of the logging API. /// \ingroup loggingAPI /// \sa loggingAPI #ifndef SURGSIM_FRAMEWORK_LOG_H #define SURGSIM_FRAMEWORK_LOG_H /// \defgroup loggingAPI Logging API /// The logging API used by OpenSurgSim code. /// \sa assertAPI /// @{ /// \defgroup logInternals Internal logging helpers /// Not meant for public consumption. #include "SurgSim/Framework/Logger.h" #include "SurgSim/Framework/LoggerManager.h" #include "SurgSim/Framework/LogMessage.h" #include "SurgSim/Framework/LogOutput.h" #include "SurgSim/Framework/LogMacros.h" #include "SurgSim/Framework/Assert.h" /// @} #endif // SURGSIM_FRAMEWORK_LOG_H opensurgsim-0.7.0/SurgSim/Framework/LogMacros.h000066400000000000000000000201341277777236100215010ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Macros used for logging. /// \ingroup logInternals /// \sa loggingAPI #ifndef SURGSIM_FRAMEWORK_LOGMACROS_H #define SURGSIM_FRAMEWORK_LOGMACROS_H #include "SurgSim/Framework/Logger.h" #include "SurgSim/Framework/LogMessage.h" namespace SurgSim { namespace Framework { /// \addtogroup loggingAPI /// @{ /// Converts a short level name to the log level enum value. /// \param level Short log level name /// (\link SurgSim::Framework::LOG_LEVEL_DEBUG DEBUG\endlink, /// \link SurgSim::Framework::LOG_LEVEL_INFO INFO\endlink, /// \link SurgSim::Framework::LOG_LEVEL_WARNING WARNING\endlink, /// \link SurgSim::Framework::LOG_LEVEL_SEVERE SEVERE\endlink or /// \link SurgSim::Framework::LOG_LEVEL_CRITICAL CRITICAL\endlink). /// \return Log level \link SurgSim::Framework::LogLevel enum value\endlink. /// \ingroup logInternals #define SURGSIM_LOG_LEVEL(level) ::SurgSim::Framework::LOG_LEVEL_ ## level /// Logs a message to the specified \c logger with the short \c level name. /// \param logger Logger used to log the message /// \param level Level of this log message /// (\link SurgSim::Framework::LOG_LEVEL_DEBUG DEBUG\endlink, /// \link SurgSim::Framework::LOG_LEVEL_INFO INFO\endlink, /// \link SurgSim::Framework::LOG_LEVEL_WARNING WARNING\endlink, /// \link SurgSim::Framework::LOG_LEVEL_SEVERE SEVERE\endlink or /// \link SurgSim::Framework::LOG_LEVEL_CRITICAL CRITICAL\endlink). /// \return Stream to output the log message /// /// \b Example /// ~~~~ /// SURGSIM_LOG(logger, WARNING) << messageText; /// ~~~~ #define SURGSIM_LOG(logger, level) \ if (SURGSIM_LOG_LEVEL(level) < (logger)->getThreshold()) \ { \ } \ else \ /* important: no curly braces around this! */ \ ::SurgSim::Framework::LogMessage((logger), SURGSIM_LOG_LEVEL(level)) /// Logs a message to the specified \c logger at the \link SurgSim::Framework::LOG_LEVEL_DEBUG DEBUG\endlink level. /// \param logger Logger used to log the message /// \return Stream to output the log message /// /// \b Example /// ~~~~ /// SURGSIM_LOG_DEBUG(logger) << messageText; /// ~~~~ #define SURGSIM_LOG_DEBUG(logger) SURGSIM_LOG(logger, DEBUG) /// Logs a message to the specified \c logger at the \link SurgSim::Framework::LOG_LEVEL_INFO INFO\endlink level. /// \param logger Logger used to log the message /// \return Stream to output the log message /// /// \b Example /// ~~~~ /// SURGSIM_LOG_INFO(logger) << messageText; /// ~~~~ #define SURGSIM_LOG_INFO(logger) SURGSIM_LOG(logger, INFO) /// Logs a message to the specified \c logger at the \link SurgSim::Framework::LOG_LEVEL_WARNING WARNING\endlink level. /// \param logger Logger used to log the message /// \return Stream to output the log message /// /// \b Example /// ~~~~ /// SURGSIM_LOG_WARNING(logger) << messageText; /// ~~~~ #define SURGSIM_LOG_WARNING(logger) SURGSIM_LOG(logger, WARNING) /// Logs a message to the specified \c logger at the \link SurgSim::Framework::LOG_LEVEL_SEVERE SEVERE\endlink level. /// \param logger Logger used to log the message /// \return Stream to output the log message /// /// \b Example /// ~~~~ /// SURGSIM_LOG_SEVERE(logger) << messageText; /// ~~~~ #define SURGSIM_LOG_SEVERE(logger) SURGSIM_LOG(logger, SEVERE) /// Logs a message to the specified \c logger at the \link SurgSim::Framework::LOG_LEVEL_CRITICAL CRITICAL\endlink /// level. /// \param logger Logger used to log the message /// \return Stream to output the log message /// /// \b Example /// ~~~~ /// SURGSIM_LOG_CRITICAL(logger) << messageText; /// ~~~~ #define SURGSIM_LOG_CRITICAL(logger) SURGSIM_LOG(logger, CRITICAL) /// Logs a message to the specified \c logger with the short \c level name if \c condition is true. /// \param condition Condition to test. /// \param logger Logger used to log the message. /// \param level Level of this log message /// (\link SurgSim::Framework::LOG_LEVEL_DEBUG DEBUG\endlink, /// \link SurgSim::Framework::LOG_LEVEL_INFO INFO\endlink, /// \link SurgSim::Framework::LOG_LEVEL_WARNING WARNING\endlink, /// \link SurgSim::Framework::LOG_LEVEL_SEVERE SEVERE\endlink or /// \link SurgSim::Framework::LOG_LEVEL_CRITICAL CRITICAL\endlink). /// \return Stream to output the log message. /// /// \b Example /// ~~~~ /// SURGSIM_LOG_IF(size >= 100, logger, INFO) << "size is " << size; /// ~~~~ #define SURGSIM_LOG_IF(condition, logger, level) \ if (! (condition)) \ { \ } \ else \ /* important: no curly braces around this! */ \ SURGSIM_LOG(logger, level) /// Generate a variable name that should be unique within a file. /// The name will be unique unless this macro is used twice on the same source code line, e.g. due to macro expansion. /// Two macros are needed to make sure the argument is fully expanded. /// \ingroup logInternals #define SURGSIM_FLAG_VARIABLE_NAME_HELPER(base, line) base ## line /// Generate a variable name that should be unique within a file. /// The name will be unique unless this macro is used twice on the same source code line, e.g. due to macro expansion. /// Two macros are needed to make sure the argument is fully expanded. /// \ingroup logInternals #define SURGSIM_FLAG_VARIABLE_NAME(base, line) SURGSIM_FLAG_VARIABLE_NAME_HELPER(base, line) /// Define a variable name that depends on the line number in the source file where the macro is called from. /// We need this because we can't just add braces to create a scope; that would break using << to add more info. /// \ingroup logInternals #define SURGSIM_LOG_ONCE_VARIABLE SURGSIM_FLAG_VARIABLE_NAME(surgsimLogOnceFlag, __LINE__) /// Logs a message to the specified \c logger with the short \c level name, but only the first time this statement /// is reached. /// \param logger Logger used to log the message. /// \param level Level of this log message /// (\link SurgSim::Framework::LOG_LEVEL_DEBUG DEBUG\endlink, /// \link SurgSim::Framework::LOG_LEVEL_INFO INFO\endlink, /// \link SurgSim::Framework::LOG_LEVEL_WARNING WARNING\endlink, /// \link SurgSim::Framework::LOG_LEVEL_SEVERE SEVERE\endlink or /// \link SurgSim::Framework::LOG_LEVEL_CRITICAL CRITICAL\endlink). /// \return Stream to output the log message. /// /// \b Example /// ~~~~ /// SURGSIM_LOG_ONCE(logger, level) << messageTextShownOnce; /// ~~~~ #define SURGSIM_LOG_ONCE(logger, level) \ static int SURGSIM_LOG_ONCE_VARIABLE = 0; \ if ((SURGSIM_LOG_ONCE_VARIABLE++) != 0) \ { \ } \ else \ /* important: no curly braces around this! */ \ SURGSIM_LOG(logger, level) /// Logs a message to the specified \c logger with the short \c level name if \c condition is true, but only the /// first time *this* particular condition is true. /// \param condition Condition to test /// \param logger Logger used to log the message /// \param level Level of this log message /// (\link SurgSim::Framework::LOG_LEVEL_DEBUG DEBUG\endlink, /// \link SurgSim::Framework::LOG_LEVEL_INFO INFO\endlink, /// \link SurgSim::Framework::LOG_LEVEL_WARNING WARNING\endlink, /// \link SurgSim::Framework::LOG_LEVEL_SEVERE SEVERE\endlink or /// \link SurgSim::Framework::LOG_LEVEL_CRITICAL CRITICAL\endlink). /// \return Stream to output the log message /// /// \b Example /// ~~~~ /// SURGSIM_LOG_ONCE_IF(condition, logger, level) << messageTextShownOnce; /// ~~~~ #define SURGSIM_LOG_ONCE_IF(condition, logger, level) \ static int SURGSIM_LOG_ONCE_VARIABLE = 0; \ if (! (condition)) \ { \ } \ else if ((SURGSIM_LOG_ONCE_VARIABLE++) != 0) \ { \ } \ else \ /* important: no curly braces around this! */ \ SURGSIM_LOG(logger, level) /// @} }; // namespace Framework }; // namespace SurgSim #endif // SURGSIM_FRAMEWORK_LOGMACROS_H opensurgsim-0.7.0/SurgSim/Framework/LogMessage.h000066400000000000000000000026311277777236100216430ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_FRAMEWORK_LOGMESSAGE_H #define SURGSIM_FRAMEWORK_LOGMESSAGE_H #include "SurgSim/Framework/LogMessageBase.h" namespace SurgSim { namespace Framework { class Logger; /// \addtogroup logInternals /// @{ /// Specialization, handles flush on destruction class LogMessage : public LogMessageBase { public: explicit LogMessage(Logger* logger, int level) : LogMessageBase(logger, level) { } explicit LogMessage(const std::unique_ptr& logger, int level) : LogMessageBase(logger.get(), level) { } explicit LogMessage(const std::shared_ptr& logger, int level) : LogMessageBase(logger.get(), level) { } ~LogMessage() { flush(); } }; /// @} }; // namespace Framework }; // namespace SurgSim #endif // SURGSIM_FRAMEWORK_LOGMESSAGE_H opensurgsim-0.7.0/SurgSim/Framework/LogMessageBase.cpp000066400000000000000000000032731277777236100227740ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Framework/LogMessageBase.h" #include "SurgSim/Framework/Assert.h" namespace SurgSim { namespace Framework { LogMessageBase::LogMessageBase(Logger* logger, int level) : m_stream(), m_logger(logger) { SURGSIM_ASSERT(logger) << "logger should not be a null pointer"; static std::string levelNames[5] = {"DEBUG ", "INFO ", "WARNING ", "SEVERE ", "CRITICAL"}; std::time_t timeStamp; std::time(&timeStamp); ::tm tm; #ifdef _MSC_VER localtime_s(&tm, &timeStamp); #else localtime_r(&timeStamp, &tm); #endif std::string levelName("NONE "); if (level >= 0 && level <= LOG_LEVEL_CRITICAL) { levelName = levelNames[level]; } char fillChar = m_stream.fill(); m_stream << std::setfill('0') << std::setw(2) << 1 + tm.tm_mon << "." << std::setw(2) << tm.tm_mday << ' ' << std::setw(2) << tm.tm_hour << ':' << std::setw(2) << tm.tm_min << ':' << std::setw(2) << tm.tm_sec << ' ' << std::setfill(fillChar) << levelName << " " << m_logger->getName() << " "; } }; // namespace Framework }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Framework/LogMessageBase.h000066400000000000000000000054671277777236100224500ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_FRAMEWORK_LOGMESSAGEBASE_H #define SURGSIM_FRAMEWORK_LOGMESSAGEBASE_H #include #include #include #include #include "SurgSim/Framework/Logger.h" namespace SurgSim { namespace Framework { /// \addtogroup logInternals /// @{ /// LogMessageBase is a base class to be used to customize messages for logging /// textual information can be put into a log message by using the << operator /// in general the message class will output all of its information when the /// destructor is being invoked, formats the incoming message to timestamp it /// and adds information about the logger class LogMessageBase { public: /// Construct a LogMessage /// \param logger The logger to be used /// \param level The logging level for this message LogMessageBase(Logger* logger, int level); /// Destructor. ~LogMessageBase() { } /// Add the given input to the current log message. /// \param input The input to be added to the current stream template LogMessageBase& operator <<(T&& input) { m_stream << input; return *this; } // A specialization for output manipulators (functions that apply to the stream). // Otherwise overloaded manipulators like std::endl and std::endl don't work, since the compiler can't know // what overloaded variant to apply. LogMessageBase& operator <<(std::ios_base& (*manipulator)(std::ios_base&)) { m_stream << *manipulator; return *this; } // A specialization for output manipulators (functions that apply to the stream). // Otherwise overloaded manipulators like std::hex and std::endl don't work, since the compiler can't know // what overloaded variant to apply. LogMessageBase& operator <<(std::ostream& (*manipulator)(std::ostream&)) { m_stream << *manipulator; return *this; } protected: /// \return the current content of the message to be logged std::string getMessage() { return m_stream.str(); } /// write the current message to the logger void flush() { m_logger->writeMessage(m_stream.str()); } private: std::ostringstream m_stream; Logger* m_logger; }; /// @} }; // namespace Framework }; // namespace SurgSim #endif // SURGSIM_FRAMEWORK_LOGMESSAGEBASE_H opensurgsim-0.7.0/SurgSim/Framework/LogOutput.cpp000066400000000000000000000035501277777236100221130ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Framework/LogOutput.h" #include #include #include "SurgSim/Framework/Assert.h" #include "SurgSim/Framework/Logger.h" namespace SurgSim { namespace Framework { FileOutput::FileOutput(const std::string& filename) : m_filename(filename) { if (! m_stream.is_open()) { m_stream.open(m_filename,std::ios_base::app); } SURGSIM_ASSERT(! m_stream.fail()) << "Failed to open '" << m_filename << "'!"; } bool SurgSim::Framework::FileOutput::writeMessage(const std::string& message) { SURGSIM_ASSERT(m_stream.is_open() && ! m_stream.fail()) << "Error writing to " << m_filename; { boost::mutex::scoped_lock lock(m_mutex); m_stream << message << std::endl; } return true; } StreamOutput::StreamOutput(std::ostream& ostream) : m_stream(ostream) //NOLINT { } bool StreamOutput::writeMessage(const std::string& message) { bool result = false; if (!m_stream.fail()) { boost::mutex::scoped_lock lock(m_mutex); m_stream << message << std::endl; result = true; } else { //TODO(hscheirich) 2013-01-28: Still need to figure out default logging throw("Default logging not implemented yet"); } return result; } }; // namespace Framework }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Framework/LogOutput.h000066400000000000000000000044751277777236100215670ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_FRAMEWORK_LOGOUTPUT_H #define SURGSIM_FRAMEWORK_LOGOUTPUT_H #include #include namespace SurgSim { namespace Framework { /// Virtual Base class to define an interface for outputting logging information class LogOutput { public: LogOutput() { } virtual ~LogOutput() { } /// \param message to be written out /// \return true on success virtual bool writeMessage(const std::string& message) = 0; }; class NullOutput : public LogOutput { public: virtual bool writeMessage(const std::string& message) {return true;} }; /// Class to output logging information to a give file class FileOutput : public LogOutput { public: /// Constructor /// \param filename The filename to be used for writing explicit FileOutput(const std::string& filename); /// \param message to be written out /// \return true on success bool writeMessage(const std::string& message) override; private: std::string m_filename; std::ofstream m_stream; boost::mutex m_mutex; }; /// Class to output logging information to a stream that can be passed /// into the constructor of the class class StreamOutput : public LogOutput { public: /// Constructor /// \param ostream stream to be used for writing /// ostream parameter to be passed by non-const reference on purpose. explicit StreamOutput(std::ostream& ostream); //NOLINT /// Writes a message to the stream. /// \param message Message to be written to the stream /// \return True on success bool writeMessage(const std::string& message) override; private: std::ostream& m_stream; boost::mutex m_mutex; }; }; // namespace Framework }; // namespace SurgSim #endif // SURGSIM_FRAMEWORK_LOGOUTPUT_H opensurgsim-0.7.0/SurgSim/Framework/Logger.cpp000066400000000000000000000021151277777236100213640ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Framework/Logger.h" namespace SurgSim { namespace Framework { Logger::Logger(const std::string& name, std::shared_ptr output) : m_threshold(LOG_LEVEL_DEBUG), // include all logging levels m_name(name), m_output(output) { } std::shared_ptr Logger::getLoggerManager() { static std::shared_ptr loggerManager = std::make_shared(); return loggerManager; } } } opensurgsim-0.7.0/SurgSim/Framework/Logger.h000066400000000000000000000073571277777236100210460ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_FRAMEWORK_LOGGER_H #define SURGSIM_FRAMEWORK_LOGGER_H #include "SurgSim/Framework/LoggerManager.h" #include "SurgSim/Framework/LogOutput.h" #include #include namespace SurgSim { namespace Framework { /// \addtogroup loggingAPI /// @{ /// Logging levels. /// Please note that most logging macros take an abbreviated version of these enumerations, without the leading /// \c LOG_LEVEL_, i.e. one of \c DEBUG, \c INFO, \c WARNING, \c SEVERE or \c CRITICAL . enum LogLevel { /// Use at your discretion. LOG_LEVEL_DEBUG, /// Informational, notify of state changes. LOG_LEVEL_INFO, /// Something failed, but the impact of the failure is not know or minimal (e.g. purely visual). LOG_LEVEL_WARNING, /// Something failed and will impact functionality, some parts of the program will not function correctly. LOG_LEVEL_SEVERE, /// Used by assertion, after using this level the program will not be functional at all. LOG_LEVEL_CRITICAL }; /// An object that can be used to control logging parameters, such as verbosity and log output destination. class Logger { public: friend class LoggerManager; /// Destructor. ~Logger() { } /// Uses the contained instance of LogOutput to write the log message /// \return true on success /// \param message the message to be printed bool writeMessage(const std::string& message) { return m_output->writeMessage(message); } /// Gets the logging threshold. /// Anything message with less than this level will be ignored. /// \return The threshold value. int getThreshold() const { return m_threshold; } /// Sets the logging threshold. /// Anything message with less than this level will be ignored. /// \param val The value to be used as the threshold. void setThreshold(int val) { m_threshold = val; } /// Gets the output object used by this logger. /// \return The current output object used this logger. std::shared_ptr getOutput() const { return m_output; } /// Sets the output object used by this logger. /// \param val The output object to be used. void setOutput(std::shared_ptr val) { m_output = val; } /// Gets this logger's name. /// \return The name. std::string getName( ) const { return m_name; } /// Get a logger by name from Logger Manager /// \return A logger with given name. static std::shared_ptr getLogger(const std::string& name) { return getLoggerManager()->getLogger(name); } /// Get default logger /// \return Default logger static std::shared_ptr getDefaultLogger() { return getLoggerManager()->getDefaultLogger(); } /// Get the logger manager /// \return Logger Manager that manages all loggers static std::shared_ptr getLoggerManager(); private: /// Constructor. /// \param name The name used for this logger. /// \param output The LogOutput instance used to display or log the data. Logger(const std::string& name, std::shared_ptr output); int m_threshold; std::string m_name; std::shared_ptr m_output; }; /// @} }; // namespace Framework }; // namespace SurgSim #endif // SURGSIM_FRAMEWORK_LOGGER_H opensurgsim-0.7.0/SurgSim/Framework/LoggerManager.cpp000066400000000000000000000052201277777236100226570ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Framework/Logger.h" #include "SurgSim/Framework/LogOutput.h" #include "SurgSim/Framework/LoggerManager.h" #include #include #include namespace SurgSim { namespace Framework { LoggerManager::LoggerManager(): m_loggers(), m_defaultOutput(std::make_shared(std::cerr)), m_globalThreshold(LOG_LEVEL_WARNING), m_mutex() { } LoggerManager::~LoggerManager() { } void LoggerManager::setDefaultOutput(std::shared_ptr output) { m_defaultOutput = output; } std::shared_ptr LoggerManager::getDefaultOutput() const { return m_defaultOutput; } void LoggerManager::setThreshold(int threshold) { { boost::lock_guard lock(m_mutex); m_globalThreshold = threshold; } setThreshold("", threshold); } void LoggerManager::setThreshold(const std::string& path, int threshold) { boost::lock_guard lock(m_mutex); m_thresholds.push_back(std::make_pair(path, threshold)); for (auto it = m_loggers.cbegin(); it != m_loggers.cend(); ++it) { if (boost::istarts_with(it->first, path)) { if (it->second != nullptr) { it->second->setThreshold(threshold); } } } } int LoggerManager::getThreshold() const { return m_globalThreshold; } std::shared_ptr LoggerManager::getLogger(const std::string& name) { boost::lock_guard lock(m_mutex); auto it = m_loggers.find(name); std::shared_ptr result; if (it != m_loggers.end() && (it->second != nullptr)) { result = it->second; } else { result = std::make_shared(Logger(name, m_defaultOutput)); result->setThreshold(m_globalThreshold); for (const auto& subgroupThreshold : m_thresholds) { if (boost::istarts_with(name, subgroupThreshold.first)) { result->setThreshold(subgroupThreshold.second); } } m_loggers[name] = result; } return result; } std::shared_ptr LoggerManager::getDefaultLogger() { return getLogger("default"); } }; // Framework }; // SurgSim opensurgsim-0.7.0/SurgSim/Framework/LoggerManager.h000066400000000000000000000054721277777236100223350ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_FRAMEWORK_LOGGERMANAGER_H #define SURGSIM_FRAMEWORK_LOGGERMANAGER_H #include #include #include namespace SurgSim { namespace Framework { class Logger; class LogOutput; /// Class to safely handle access to a group of loggers, manipulate the global /// logging threshold, and fetch logger(s) from a global pool class LoggerManager { public: /// Constructor LoggerManager(); /// Destructor ~LoggerManager(); /// Sets/Changes default output. /// \param output The output class to be used. void setDefaultOutput(std::shared_ptr output); /// Return the default output std::shared_ptr getDefaultOutput() const; /// Gets the default logger /// \return The default logger. std::shared_ptr getDefaultLogger(); /// Gets a logger with a given name, creates a new one if none exists or the logger /// has been deallocated. /// \param name The name. /// \return The logger. std::shared_ptr getLogger(const std::string& name); /// Sets a threshold for all loggers. /// \param threshold The threshold. void setThreshold(int threshold); /// Sets a threshold for a subgroup of loggers, the group is chosen by finding all loggers /// whose pathname starts with the same string as the pathname given. /// \param path Full pathname of the file. /// \param threshold The threshold to use for these loggers. void setThreshold(const std::string& path, int threshold); /// Return the threshold used by all loggers /// \return Threshold used by all the loggers. int getThreshold() const; private: /// Keep track of all the loggers std::unordered_map> m_loggers; /// Keep track of subgroup thresholds. std::vector> m_thresholds; /// Use for default output of the logger std::shared_ptr m_defaultOutput; /// Threshold used by all loggers int m_globalThreshold; boost::mutex m_mutex; // Aug 13, 2013 // VS2012 does not support "delete" now LoggerManager(const LoggerManager&); LoggerManager& operator=(const LoggerManager&); }; }; // Framework }; // SurgSim #endif //SURGSIM_FRAMEWORK_LOGGERMANAGER_H opensurgsim-0.7.0/SurgSim/Framework/Macros.h000066400000000000000000000034541277777236100210450ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_FRAMEWORK_MACROS_H #define SURGSIM_FRAMEWORK_MACROS_H /// Declare the class name of a class with the appropriate function header, /// do not use quotes #define SURGSIM_CLASSNAME(ClassName) \ virtual std::string getClassName() const {return #ClassName;} /// Macro to tell GCC this is a used variable, and not to optimize it out #ifdef __GNUC__ #define SURGSIM_USED_VARIABLE(x) x __attribute__((used)) #else #define SURGSIM_USED_VARIABLE(x) x #endif ///@{ /// Set of macros to create a unique name with a common basename #define SURGSIM_CONCATENATE_DETAIL(x, y) x##y #define SURGSIM_CONCATENATE(x, y) SURGSIM_CONCATENATE_DETAIL(x, y) #define SURGSIM_MAKE_UNIQUE(x) SURGSIM_CONCATENATE(x, __COUNTER__) ///@} /// \note HS-2013-dec-23 The gcc and msvc compilers seem to have different requirements when a template class /// needs to be passed template parameters in a specialization, that extend the original template interface /// gcc needs the template<> statement before the new template parameters, msvc does not like it at all. #ifdef _GNUC_ #define SURGSIM_DOUBLE_SPECIALIZATION template<> #else #define SURGSIM_DOUBLE_SPECIALIZATION #endif #endif opensurgsim-0.7.0/SurgSim/Framework/ObjectFactory-inl.h000066400000000000000000000060111277777236100231270ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_FRAMEWORK_OBJECTFACTORY_INL_H #define SURGSIM_FRAMEWORK_OBJECTFACTORY_INL_H #include "SurgSim/Framework/Assert.h" template template bool SurgSim::Framework::ObjectFactory::registerClass(const std::string& className) { boost::mutex::scoped_lock lock(m_mutex); bool result = false; if (m_constructors.find(className) == m_constructors.end()) { m_constructors[className] = boost::factory>(); result = true; }; return result; }; template std::shared_ptr SurgSim::Framework::ObjectFactory::create(const std::string& className) { boost::mutex::scoped_lock lock(m_mutex); auto it = m_constructors.find(className); if (it == m_constructors.end()) { SURGSIM_FAILURE() << "ObjectFactory does not know about class called " << className; // gcc complains if there is no return return nullptr; } return (it->second)(); }; template bool SurgSim::Framework::ObjectFactory::isRegistered(const std::string& className) const { boost::mutex::scoped_lock lock(m_mutex); auto it = m_constructors.find(className); return (it != m_constructors.end()); } template template bool SurgSim::Framework::ObjectFactory1::registerClass(const std::string& className) { boost::mutex::scoped_lock lock(m_mutex); bool result = false; if (m_constructors.find(className) == m_constructors.end()) { m_constructors[className] = boost::factory>(); result = true; }; return result; }; template std::shared_ptr SurgSim::Framework::ObjectFactory1::create( const std::string& className, const Parameter1& val) { boost::mutex::scoped_lock lock(m_mutex); auto it = m_constructors.find(className); if (it == m_constructors.end()) { SURGSIM_FAILURE() << "ObjectFactory does not know about class called " << className; // gcc complains if there is no return return nullptr; } return (it->second)(val); }; template bool SurgSim::Framework::ObjectFactory1::isRegistered(const std::string& className) const { boost::mutex::scoped_lock lock(m_mutex); auto it = m_constructors.find(className); return (it != m_constructors.end()); } #endif // SURGSIM_FRAMEWORK_OBJECTFACTORY_INL_Hopensurgsim-0.7.0/SurgSim/Framework/ObjectFactory.h000066400000000000000000000163741277777236100223640ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_FRAMEWORK_OBJECTFACTORY_H #define SURGSIM_FRAMEWORK_OBJECTFACTORY_H #include "SurgSim/Framework/Macros.h" #include #include #include #include #include namespace SurgSim { namespace Framework { /// An object factory, once a class is registered with the factory it can /// be used to create instances of registered classes. All the classes registered /// need to have a default constructor. /// \note The names used for registration and the actual c++ class names are independent /// the className parameter here is just an identifier for the class. /// \tparam Base the base class for all classes that can be registered with the factory. template class ObjectFactory { public: /// Register a class with the factory. /// \tparam T The specific type of the class to be registered. /// \param className The name of this class. /// \return true if the class was added, false if it already existed in the registry. template bool registerClass(const std::string& className); /// Create an instance of a class based on the specific class name. /// \param className The class name that was used to register the class. /// \return a shared pointer to the object of type className, fails with an /// assertion otherwise. std::shared_ptr create(const std::string& className); /// Check whether the class is registered in the factory. /// \param className Name of the class to check. /// \return true if the factory has a constructor for this class. bool isRegistered(const std::string& className) const; private: typedef boost::function()> Constructor; /// All the constructors. std::map m_constructors; /// Threadsafety for registration mutable boost::mutex m_mutex; }; /// An object factory, once a class is registered with the factory it can /// be used to create instances of registered classes. All the classes registered /// need to have a one parameter constructor, the type for that parameter can be /// passed as a template parameter. /// \note The names used for registration and the actual c++ class names are independent /// the className parameter here is just an identifier for the class. /// \tparam Base The base class for all classes that can be registered with the factory. /// \tparam Parameter1 The class for the constructor parameter. template class ObjectFactory1 { public: /// Register a class with the factory. /// \tparam T The specific type of the class to be registered. /// \param className The name of this class. /// \return true if the class was added, false if it already existed in the registry. template bool registerClass(const std::string& className); /// Create an instance of a class based on the specific class name, whose constructor takes 1 parameter. /// \param className The class name. /// \param val The value of the parameter. /// \return a shared pointer to the object of type className instantiated with the given parameter, /// fails with an assertion otherwise. std::shared_ptr create(const std::string& className, const Parameter1& val); /// Check whether the class is registered in the factory. /// \param className Name of the class to check. /// \return true if the factory has a constructor for this class bool isRegistered(const std::string& className) const; private: typedef boost::function(const Parameter1&)> Constructor; /// All the constructors. std::map m_constructors; /// Threadsafety for registration mutable boost::mutex m_mutex; }; /// CRTP Base class to implement Object Factory functionality on a base class, use this rather than writing /// your own functions to return the factory /// \tparam T base class of the generated objects template class FactoryBase { public: typedef ObjectFactory FactoryType; /// \return a reference to the factory static FactoryType& getFactory() { static FactoryType factory; return factory; } }; /// CRTP Base class to implement Object Factory functionality on a base class, use this rather than writing /// your own functions to return the factory /// \tparam T base class of the generated objects /// \tparam P constructor parameter for object generation template class FactoryBase1 { public: typedef ObjectFactory1 FactoryType; /// \return a reference to the factory static FactoryType& getFactory() { static FactoryType factory; return factory; } }; }; }; #include "SurgSim/Framework/ObjectFactory-inl.h" /// Register a class with a factory that is in a base class, DerivedClass has to be of type BaseClass. /// The assignment is used to enable the execution of registerClass during static initialization time. /// This macro should be put under the same namespace in which 'ClassName' is, to avoid symbol clashes. /// 'BaseClass' should be the full name of the base class with namespace prefix, /// 'DerivedClass' is 'ClassName' with namespace prefixes, /// and 'ClassName' is the name of the class without namespace prefix. #define SURGSIM_REGISTER(BaseClass, DerivedClass, ClassName) \ SURGSIM_USED_VARIABLE(bool SURGSIM_CONCATENATE(ClassName, Registered)) = \ BaseClass::getFactory().registerClass(#DerivedClass); /// Force compilation of the boolean symbol SURGSIM_CONCATENATE(ClassName, Registered) in SURGSIM_REGISTER macro, /// which in turn registers DerivedClass into BaseClass's ObjectFactory. /// After that, DerivedClass is linked to any code which includes its header. /// /// Boolean symbol SURGSIM_CONCATENATE(ClassName, Registered) in SURGSIM_REGISTER macro is exposed as an /// extern variable in DerivedClass's header, and is referenced to initialize the static global variable /// SURGSIM_CONCATENATE(ClassName, IsRegistered) in the header. /// /// This forces the compiler to include the definition of SURGSIM_CONCATENATE(ClassName, Registered) /// (defined most likely in the cpp file). /// The variable SURGSIM_CONCATENATE(ClassName, IsRegistered) will never be used, so the GCC warning is disabled. /// This macro should be put in the DerivedClass's header file, under the same namespace in which the DerivedClass is. /// 'ClassName' should be the name of the class without any prefix. #define SURGSIM_STATIC_REGISTRATION(ClassName) \ extern bool SURGSIM_CONCATENATE(ClassName, Registered); \ SURGSIM_USED_VARIABLE(static bool SURGSIM_CONCATENATE(ClassName, IsRegistered)) = \ SURGSIM_CONCATENATE(ClassName, Registered); #endif // SURGSIM_FRAMEWORK_OBJECTFACTORY_H opensurgsim-0.7.0/SurgSim/Framework/PoseComponent.cpp000066400000000000000000000030671277777236100227450ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Framework/PoseComponent.h" #include "SurgSim/Math/MathConvert.h" namespace SurgSim { namespace Framework { SURGSIM_REGISTER(SurgSim::Framework::Component, SurgSim::Framework::PoseComponent, PoseComponent); PoseComponent::PoseComponent(const std::string& name) : Component(name) { SURGSIM_ADD_SERIALIZABLE_PROPERTY(PoseComponent, SurgSim::Math::RigidTransform3d, Pose, getPose, setPose); } void PoseComponent::setPose(const SurgSim::Math::RigidTransform3d& pose) { m_pose = pose; } const SurgSim::Math::RigidTransform3d& PoseComponent::getPose() const { return m_pose; } std::shared_ptr PoseComponent::getPoseComponent() const { return nullptr; } std::shared_ptr PoseComponent::getPoseComponent() { return nullptr; } bool PoseComponent::doInitialize() { return true; } bool PoseComponent::doWakeUp() { return true; } }; // namespace Framework }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Framework/PoseComponent.h000066400000000000000000000043711277777236100224110ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_FRAMEWORK_POSECOMPONENT_H #define SURGSIM_FRAMEWORK_POSECOMPONENT_H #include #include "SurgSim/Framework/Component.h" #include "SurgSim/Framework/Macros.h" #include "SurgSim/Math/RigidTransform.h" namespace SurgSim { namespace Framework { SURGSIM_STATIC_REGISTRATION(PoseComponent); /// The PoseComponent holds a pose. It is used to group Representations that /// share a common pose, in a SceneElement for example. class PoseComponent : public Component { public: /// Constructor /// \param name Name of the representation explicit PoseComponent(const std::string& name); SURGSIM_CLASSNAME(SurgSim::Framework::PoseComponent); /// Set the Pose of the PoseComponent /// \param pose The pose in world coordinates void setPose(const SurgSim::Math::RigidTransform3d& pose); /// Get the pose of the PoseComponent /// \return The pose in world coordinates const SurgSim::Math::RigidTransform3d& getPose() const; protected: /// Get the PoseComponent for this component /// A PoseComponent cannot have a PoseComponent, so this will /// return nullptr. /// \return The PoseComponent std::shared_ptr getPoseComponent() override; /// Get the PoseComponent for this component, constant access /// A PoseComponent cannot have a PoseComponent, so this will /// return nullptr. /// \return The PoseComponent std::shared_ptr getPoseComponent() const override; private: bool doInitialize() override; bool doWakeUp() override; SurgSim::Math::RigidTransform3d m_pose; }; }; // namespace Framework }; // namespace SurgSim #endif // SURGSIM_FRAMEWORK_POSECOMPONENT_H opensurgsim-0.7.0/SurgSim/Framework/Representation.cpp000066400000000000000000000034331277777236100231530ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Framework/Representation.h" #include "SurgSim/Framework/PoseComponent.h" #include "SurgSim/Framework/SceneElement.h" #include "SurgSim/Math/MathConvert.h" namespace SurgSim { namespace Framework { Representation::Representation(const std::string& m_name) : Component(m_name), m_localPose(Math::RigidTransform3d::Identity()) { SURGSIM_ADD_SERIALIZABLE_PROPERTY(Representation, Math::RigidTransform3d, LocalPose, getLocalPose, setLocalPose); SURGSIM_ADD_RO_PROPERTY(Representation, Math::RigidTransform3d, Pose, getPose); } Representation::~Representation() { } bool Representation::doInitialize() { return true; } bool Representation::doWakeUp() { return true; } void Representation::setLocalPose(const SurgSim::Math::RigidTransform3d& pose) { m_localPose = pose; } SurgSim::Math::RigidTransform3d Representation::getPose() const { auto element = getSceneElement(); if (element != nullptr) { return element->getPose() * getLocalPose(); } else { return getLocalPose(); } } SurgSim::Math::RigidTransform3d Representation::getLocalPose() const { return m_localPose; } }; // namespace Framework }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Framework/Representation.h000066400000000000000000000041231277777236100226150ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_FRAMEWORK_REPRESENTATION_H #define SURGSIM_FRAMEWORK_REPRESENTATION_H #include #include "SurgSim/Framework/Component.h" #include "SurgSim/Math/RigidTransform.h" namespace SurgSim { namespace Framework { /// Representations are manifestations of a SceneElement. For example, a /// SceneElement can be represented in graphics, physics, etc. Each of these /// representation will be derived from this class. class Representation : public Component { public: /// Constructor /// \param name Name of the representation explicit Representation(const std::string& name); /// Destructor virtual ~Representation(); /// Set the pose of the representation with respect to the Scene Element /// \param pose The pose to set the representation to virtual void setLocalPose(const SurgSim::Math::RigidTransform3d& pose); /// Get the pose of the representation with respect to the Scene Element /// \return The pose of this representation virtual SurgSim::Math::RigidTransform3d getLocalPose() const; /// Get the pose of the representation in world coordinates /// \return The pose of this representation virtual SurgSim::Math::RigidTransform3d getPose() const; private: /// Local Pose of the Representation with respect to the SceneElement SurgSim::Math::RigidTransform3d m_localPose; bool doInitialize() override; bool doWakeUp() override; }; }; // namespace Framework }; // namespace SurgSim #endif // SURGSIM_FRAMEWORK_REPRESENTATION_H opensurgsim-0.7.0/SurgSim/Framework/ReuseFactory.h000066400000000000000000000100601277777236100222230ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_FRAMEWORK_REUSEFACTORY_H #define SURGSIM_FRAMEWORK_REUSEFACTORY_H #include #include namespace SurgSim { namespace Framework { /// Factory for acquiring new or unused existing instances of class T to reduce repeated deallocation and reallocation /// of objects with short lifespans. /// /// Example Usage: /// \code{.cpp} /// { /// // Create an instance of the factory to provide instances of MyObject. /// ReuseFactory factory; /// // Get an instance of MyObject. This instance will be allocated as no unused objects are available yet. /// std::shared_ptr myObject = factory.getInstance(); /// // Setup the provided object, as the state is not guaranteed to be initialized. /// myObject.set(...); /// } /// // When myObject goes out of scope, it will automatically be added back to the factory for reuse later. /// // This will return the previous, now unused, instance rather than allocating anew. /// std::shared_ptr myObject2 = factory.getInstance(); /// // Setup the provided object, as the state is not guaranteed to be initialized. /// myObject2.set(...); /// \endcode /// /// Limitations: /// - The class T must have a default constructor. /// - The state of returned objects are in no way reset, so the state will need to be setup after retrieving the /// instance from the factory. /// - Custom deleters for an instance of T cannot be specified, as a custom deleter is used to manage the unused /// objects. /// /// \tparam T Instances of this class are provided by this factory template class ReuseFactory { /// Custom Deleter is friended to manage unused objects rather than actually deleting them. friend class Deleter; public: /// Constructor. Initially no unused objects are available, so returned instances are new allocations. ReuseFactory() {} /// Destructor. Any remaining unused objects will be deleted. ~ReuseFactory() {} /// Get a new or previously deleted object of class T. /// \return Valid shared pointer to an object of class T std::shared_ptr getInstance() { std::shared_ptr object; if (m_unusedObjects.empty()) { object = std::shared_ptr(new T(), Deleter(this)); } else { object = std::shared_ptr(m_unusedObjects.top().release(), Deleter(this)); m_unusedObjects.pop(); } return object; } private: /// Custom deleter to keep unused objects for reuse, rather than actually deleting them. class Deleter { public: /// Constructor /// \param factory ReuseFactory with the collection of unused object for reuse. explicit Deleter(ReuseFactory* factory) : m_factory(factory) { } /// Deletion method, adds the object to the ReuseFactory's collection. /// \param unusedObject Object that is no longer referenced by any shared pointers void operator()(T* unusedObject) const { m_factory->addUnused(unusedObject); } private: /// ReuseFactory with the collection of unused objects for reuse. ReuseFactory* m_factory; }; /// Adds an object to the stack of unused objects. /// This should only be called from Deleter. /// \param unusedObject Object that is no longer referenced by any shared pointers void addUnused(T* unusedObject) { m_unusedObjects.push(std::unique_ptr(unusedObject)); } /// Stack of objects that are available for reuse. std::stack> m_unusedObjects; }; }; // namespace Framework }; // namespace SurgSim #endif // SURGSIM_FRAMEWORK_REUSEFACTORY_H opensurgsim-0.7.0/SurgSim/Framework/Runtime.cpp000066400000000000000000000300311277777236100215660ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Framework/ApplicationData.h" #include "SurgSim/Framework/Barrier.h" #include "SurgSim/Framework/ComponentManager.h" #include "SurgSim/Framework/Component.h" #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Framework/Scene.h" #include "SurgSim/Framework/ThreadPool.h" #include "SurgSim/Framework/Timer.h" namespace SurgSim { namespace Framework { std::shared_ptr Runtime::m_applicationData; Runtime::Runtime() : m_isRunning(false), m_isPaused(false), m_isStopped(false) { initSearchPaths(""); } Runtime::Runtime(const std::string& configFilePath) : m_isRunning(false), m_isPaused(false), m_isStopped(false) { initSearchPaths(configFilePath); } Runtime::~Runtime() { // Kill all threads stop(); } void Runtime::addManager(std::shared_ptr manager) { SURGSIM_ASSERT(! m_isRunning) << "Cannot add a manager to the runtime once it is running"; if (manager != nullptr) { manager->setRuntime(getSharedPtr()); m_managers.push_back(manager); } } std::vector> Runtime::getManagers() const { std::vector> result(m_managers.size()); std::copy(m_managers.begin(), m_managers.end(), result.begin()); return result; } std::shared_ptr Runtime::getScene() { if (m_scene == nullptr) { m_scene = std::make_shared(getSharedPtr()); } return m_scene; } bool Runtime::addSceneElement(std::shared_ptr sceneElement) { // Before the runtime has been started, adding components will be handled via // preprocessSceneElements() if (m_isRunning) { addComponents(sceneElement->getComponents()); } return m_isRunning; } void Runtime::addComponents(const std::vector>& components) { auto componentsIt = std::begin(components); auto componentsEnd = std::end(components); for (; componentsIt != componentsEnd; ++componentsIt) { for (auto manager = std::begin(m_managers); manager != std::end(m_managers); ++manager) { if ((*componentsIt)->isInitialized()) { (*manager)->enqueueAddComponent(*componentsIt); } else { SURGSIM_LOG_WARNING(Logger::getLogger("Runtime")) << "Trying to add an uninitialized component."; } } } } bool Runtime::execute() { bool doExit = false; if (start()) { auto it = m_managers.cbegin(); while (!doExit) { // Watchdog, shut down all managers if one manager is done boost::this_thread::sleep(boost::posix_time::milliseconds(2000)); for (it = m_managers.cbegin(); it != m_managers.cend(); ++it) { if (!(*it)->isRunning()) { doExit = true; break; } } } stop(); } return true; } bool Runtime::start(bool paused) { auto logger = Logger::getDefaultLogger(); SURGSIM_ASSERT(m_isStopped == false) << "This runtime has already been stopped, it cannot be started again."; // Gather all the Components from the currently known SceneElements to add them // collectively. // HS-2013-dec-12 This construct cause a bug as this also gathers the elements to be processed // any sceneelements added after this call and before initialization is finished will get lost preprocessSceneElements(); m_isRunning = true; m_isPaused = paused; std::vector>::iterator it; m_barrier.reset(new Barrier(m_managers.size() + 1)); for (it = m_managers.begin(); it != m_managers.end(); ++it) { (*it)->start(m_barrier, m_isPaused); } // Wait for all the managers to initialize m_barrier->wait(true); SURGSIM_LOG_INFO(logger) << "All managers doInit() succeeded"; // Wait for all the managers to startup m_barrier->wait(true); SURGSIM_LOG_INFO(logger) << "All managers doStartup() succeeded"; // Wait for all the components to initialize() m_barrier->wait(true); SURGSIM_LOG_INFO(logger) << "All component initialize() succeeded"; // Wait for all the components to wakeUp() m_barrier->wait(true); SURGSIM_LOG_INFO(logger) << "All component wakeUp() succeeded"; SURGSIM_LOG_INFO(logger) << "Scene is initialized. All managers updating"; return true; } bool Runtime::stop() { if (m_isStopped == true) { return false; } if (isPaused()) { resume(); } m_isRunning = false; // Suspend updates on all threads std::vector>::iterator it; for (it = m_managers.begin(); it != m_managers.end(); ++it) { (*it)->setIdle(true); } // Give all threads time to run through update boost::this_thread::sleep(boost::posix_time::milliseconds(500)); // Now stop all threads for (it = m_managers.begin(); it != m_managers.end(); ++it) { SurgSim::Framework::Timer timer; timer.start(); (*it)->stop(); timer.endFrame(); SURGSIM_LOG_INFO(SurgSim::Framework::Logger::getDefaultLogger()) << "Killing : " << (*it)->getName() << " took " << timer.getCumulativeTime() << "s"; } m_isStopped = true; return true; } void Runtime::pause() { m_isPaused = true; for (auto it = std::begin(m_managers); it != std::end(m_managers); ++it) { (*it)->setSynchronous(true); } } void Runtime::resume() { if (isPaused()) { m_isPaused = false; for (auto it = std::begin(m_managers); it != std::end(m_managers); ++it) { (*it)->setSynchronous(false); } // HS-2014-feb-21 if there are threads that are not waiting this will hang, this can happen if the above call // to setSynchronous was made while the thread was executing code rather than waiting. // #threadsafety m_barrier->wait(true); } } void Runtime::step() { if (isPaused()) { m_barrier->wait(true); } } bool Runtime::isRunning() const { return m_isRunning; } bool Runtime::isPaused() const { return m_isPaused; } void Runtime::preprocessSceneElements() { // Collect all the Components std::vector> newComponents; auto sceneElements = getScene()->getSceneElements(); for (auto it = sceneElements.begin(); it != sceneElements.end(); ++it) { // Initialize should have been called by now, if the SceneElement is not initialized this means // initialization failed if ((*it)->isInitialized()) { std::vector> elementComponents = (*it)->getComponents(); newComponents.insert(newComponents.end(), elementComponents.begin(), elementComponents.end()); } } addComponents(newComponents); } std::shared_ptr Runtime::getSharedPtr() { std::shared_ptr result; try { result = shared_from_this(); } catch (const std::exception&) { SURGSIM_FAILURE() << "Runtime was not created as a shared_ptr"; } return result; } void Runtime::initSearchPaths(const std::string& configFilePath) { if (configFilePath == "") { std::vector paths; paths.push_back("."); m_applicationData = std::make_shared(paths); } else { m_applicationData = std::make_shared(configFilePath); } } std::shared_ptr Runtime::getApplicationData() { SURGSIM_ASSERT(nullptr != m_applicationData) << "Runtime::getApplicationData() should be called after the Runtime is created."; return m_applicationData; } std::shared_ptr Runtime::getThreadPool() { static auto threadPool = std::make_shared(); return threadPool; } void Runtime::addComponent(const std::shared_ptr& component) { if (m_isRunning) { for (auto it = std::begin(m_managers); it != std::end(m_managers); ++it) { (*it)->enqueueAddComponent(component); } } } void Runtime::removeComponent(const std::shared_ptr& component) { SURGSIM_ASSERT(component != nullptr) << "Trying to remove a nullptr !"; if (m_isRunning) { for (auto it = std::begin(m_managers); it != std::end(m_managers); ++it) { (*it)->enqueueRemoveComponent(component); } } } void Runtime::loadScene(const std::string& fileName) { YAML::Node node; boost::lock_guard lock(m_sceneHandling); if (tryLoadNode(fileName, &node)) { YAML::convert>::getRegistry().clear(); m_scene = std::make_shared(getSharedPtr()); m_scene->decode(node); } else { SURGSIM_FAILURE() << "Loading of the Scene failed."; } } void Runtime::addSceneElements(const std::string& fileName) { SURGSIM_LOG_DEBUG(Logger::getLogger("Runtime")) << "Adding scene elements from " << fileName; YAML::Node node; boost::lock_guard lock(m_sceneHandling); if (tryLoadNode(fileName, &node)) { std::vector> elements; if (tryConvertElements(fileName, node, &elements)) { getScene()->addSceneElements(elements); } } else { SURGSIM_FAILURE() << "Could not add scene elements from the YAML file: " << fileName; } SURGSIM_LOG_DEBUG(Logger::getLogger("Runtime")) << "Done adding scene elements from " << fileName; } std::vector> Runtime::duplicateSceneElements(const std::string& fileName) { YAML::Node node; YAML::convert>::RegistryType registry; std::vector> result; boost::lock_guard lock(m_sceneHandling); // Use a temporary registry std::swap(YAML::convert>::getRegistry(), registry); bool success = false; if (tryLoadNode(fileName, &node) && tryConvertElements(fileName, node, &result)) { success = true; } // restore the original registry std::swap(YAML::convert>::getRegistry(), registry); if (!success) { SURGSIM_FAILURE() << "Could not clone from the YAML file: " << fileName; } return result; } bool tryLoadNode(const std::string& fileName, YAML::Node* node) { bool result = false; std::string path; SURGSIM_ASSERT(node != nullptr) << "Can't load node into nullptr."; if (Runtime::getApplicationData()->tryFindFile(fileName, &path)) { try { *node = YAML::LoadFile(path); result = true; } catch (YAML::ParserException e) { SURGSIM_LOG_SEVERE(Logger::getLogger("Runtime")) << "Could not parse YAML File at " << path << " due to " << e.msg << " at line " << e.mark.line << " column " << e.mark.column; } } else { SURGSIM_LOG_SEVERE(Logger::getLogger("Runtime")) << "Could not find file " << fileName; } return result; } bool Runtime::tryConvertElements(const std::string& filename, const YAML::Node& node, std::vector>* elements) { bool result = false; if (node.IsSequence()) { try { *elements = node.as>>(); result = true; } catch (YAML::Exception e) { SURGSIM_LOG_SEVERE(Logger::getLogger("Runtime")) << "File " << filename << " YAML conversion failed with exception: " + e.msg; } catch (SurgSim::Framework::AssertionFailure e) { SURGSIM_LOG_CRITICAL(Logger::getLogger("Runtime")) << "File " << filename << " conversion failed."; throw e; } } else { SURGSIM_LOG_SEVERE(Logger::getLogger("Runtime")) << "File " << filename << " not a YAML sequence, can't load scene elements."; } return result; } void Runtime::saveScene(const std::string& fileName) const { std::ofstream out(fileName); if (out.good()) { out << m_scene->encode(); } else { SURGSIM_LOG_WARNING(Logger::getLogger("Runtime")) << "Failed to open " << fileName << ". Cannot save the scene."; } } }; // namespace Framework }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Framework/Runtime.h000066400000000000000000000211341277777236100212370ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_FRAMEWORK_RUNTIME_H #define SURGSIM_FRAMEWORK_RUNTIME_H #include #include #include #include #include namespace YAML { class Node; } namespace SurgSim { namespace Framework { class ApplicationData; class Barrier; class ComponentManager; class Component; class Logger; class Scene; class SceneElement; class ThreadPool; /// This class contains all the information about the runtime environment of /// the simulation, all the running threads, the state, while it is de facto a /// singleton it should be passed around if needed. Needs to be created as a /// shared object. class Runtime : public std::enable_shared_from_this { public: /// Default constructor. Runtime(); /// Constructor, initializes the search path with paths from the given file. /// \param configFilePath Full pathname of the configuration file that contains paths, /// one per line, to search for application data. If no config file /// is given "." will be used as default path. explicit Runtime(const std::string& configFilePath); /// Destructor. ~Runtime(); /// Add a worker thread, this should probably only be possible if the system is not running void addManager(std::shared_ptr thread); /// \return All the managers from the runtime std::vector> getManagers() const; /// \return The first manager of type T that is found nullptr otherwise template std::shared_ptr getManager() const; /// \return The scene to be used for this runtime. Use this for any kind of scene manipulation. std::shared_ptr getScene(); /// \returns The current scene std::shared_ptr getScene() const; /// Adds a scene element /// \param sceneElement The scene element. /// \return true if it succeeds, false if it fails. bool addSceneElement(std::shared_ptr sceneElement); /// Start all the threads and block until one of them quits bool execute(); /// Start all the threads non returns after the startup as succeeded /// \return true if it succeeds, false if it fails. bool start(bool paused = false); /// Pause all managers, this will set all managers to synchronous execution, they will all complete /// their updates and then wait for step() to proceed, call resume to go back to uninterupted execution. /// \note HS-2013-nov-01 this is mostly to be used as a facillity for testing and debugging, the threads /// are not executed at the correct rates against each other, this is an issue that can be resolved /// but is not necessary right now. void pause(); /// Resume from pause, causes all managers to resume normal processing /// \warning This function is not thread safe, if stop is called when there are threads that are not waiting, /// this call will hang indefinitely. void resume(); /// Make all managers execute 1 update loop, afterwards they will wait for another step() call or resume() void step(); /// Stops the simulation. /// The call will wait for all the threads to finish, except for any threads that have been detached. /// \warning This function is not thread safe, if stop is called when there are threads that are not waiting, /// this call will hang indefinitely. /// \return true if it succeeds, false if it fails. bool stop(); /// Query if this object is running. /// \return true if running, false if not. bool isRunning() const; /// Query if this object is paused. /// \return true if paused, false if not. bool isPaused() const; /// Gets application data for the runtime. /// \return The application data. static std::shared_ptr getApplicationData(); /// Gets the thread pool for the runtime. /// \return The thread pool. static std::shared_ptr getThreadPool(); /// Adds a component. /// \param component The component. void addComponent(const std::shared_ptr& component); /// Removes the component described by component. /// \param component The component. void removeComponent(const std::shared_ptr& component); /// Loads the scene from the given file, clears all the elements in the scene, the old scene will be /// overwritten. /// \param fileName the filename of the scene to be loaded, needs to be found /// \throws If the file cannot be found or is an invalid YAML file void loadScene(const std::string& fileName); /// Adds the scene elements from the file to the current scene /// The file format should be just a list of sceneElements /// \code /// - SurgSim::Framework::BasicSceneElement: /// Name: element1 /// IsActive: true /// Components: /// - MockComponent: /// Name: component1 /// Id: 792faa40-459b-40cf-981d-560a8f2bd1801 /// - SurgSim::Framework::BasicSceneElement: /// Name: element2 /// IsActive: true /// Components: /// - MockComponent: /// Name: component2 /// Id: 1de26315-82a7-46b2-ae38-324d25009629 /// \endcode /// \param fileName the filename of the scene to be loaded, needs to be found /// \throws If the file cannot be found or is an invalid file void addSceneElements(const std::string& fileName); /// Loads and duplicates the scene elements from the file, the elements will not have common ids /// with any other cloned elements, this lets you repeatedly load a set of elements to replicate this /// set. The format is a list of scene elements \sa addSceneElements(). /// \param fileName the filename of the scene to be loaded, needs to be found /// \throws if loading failed /// \return a vector of scene elements with the loaded elements std::vector> duplicateSceneElements(const std::string& fileName); /// Write out the whole scene as a file /// \param fileName the name of the scene-file if no path is given, uses the current path of the executable void saveScene(const std::string& fileName) const; private: /// Preprocess scene elements. This is called during the startup sequence /// and installs all the Components of the SceneElements in the worker threads void preprocessSceneElements(); /// Adds the components. /// \param components The components. /// \return true if it succeeds, false if it fails. void addComponents(const std::vector>& components); /// Initializes the search paths. /// \param configFilePath Full pathname of the configuration file, if path is empty /// "." will be used as default path. void initSearchPaths(const std::string& configFilePath); /// Convert nodes to vector of elements /// \param fileName the original filename for error reporting /// \param node the node to be converted /// \param [out] elements the pointer for the results /// \return true if the conversion was successful bool tryConvertElements(const std::string& fileName, const YAML::Node& node, std::vector>* elements); /// Gets a shared pointer to the runtime. /// \return The shared pointer. std::shared_ptr getSharedPtr(); bool m_isRunning; std::vector> m_managers; std::shared_ptr m_scene; static std::shared_ptr m_applicationData; boost::mutex m_sceneHandling; std::shared_ptr m_barrier; bool m_isPaused; bool m_isStopped; }; template std::shared_ptr SurgSim::Framework::Runtime::getManager() const { std::shared_ptr result; for (auto& manager : m_managers) { result = std::dynamic_pointer_cast(manager); if (result != nullptr) { return result; } } return result; } /// Perform a YAML load operation /// \param fileName the filename of the scene to be loaded, needs to be found /// \param [out] node pointer to the nodes structure to receive the newly loaded nodes /// \return true if the loading succeeded bool tryLoadNode(const std::string& fileName, YAML::Node* node); }; // namespace Framework }; // namespace SurgSim #endif // SURGSIM_FRAMEWORK_RUNTIME_H opensurgsim-0.7.0/SurgSim/Framework/SamplingMetricBase.cpp000066400000000000000000000057511277777236100236670ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SamplingMetricBase.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Framework/Accessible.h" namespace SurgSim { namespace Framework { SamplingMetricBase::SamplingMetricBase(const std::string& name) : SurgSim::Framework::Behavior(name), m_logger(SurgSim::Framework::Logger::getLogger(name)), m_targetManagerType(SurgSim::Framework::MANAGER_TYPE_BEHAVIOR), m_elapsedTime(0.0), m_maxNumberOfMeasurements(54000) { SURGSIM_ADD_SERIALIZABLE_PROPERTY(SurgSim::Framework::SamplingMetricBase, size_t, MaxNumberOfMeasurements, getMaxNumberOfMeasurements, setMaxNumberOfMeasurements); SURGSIM_ADD_SERIALIZABLE_PROPERTY(SurgSim::Framework::SamplingMetricBase, int, TargetManagerType, getTargetManagerType, setTargetManagerType); } bool SamplingMetricBase::doWakeUp() { return true; } bool SamplingMetricBase::doInitialize() { m_elapsedTime = 0.0; m_measurementValues.clear(); return true; } bool SamplingMetricBase::canMeasure(double dt) { return true; } SamplingMetricBase::MeasurementsType SamplingMetricBase::getMeasurementValues() { return m_measurementValues; } int SamplingMetricBase::getTargetManagerType() const { return m_targetManagerType; } void SamplingMetricBase::setTargetManagerType(int targetManagerType) { m_targetManagerType = targetManagerType; } void SamplingMetricBase::setMaxNumberOfMeasurements(size_t maxNumberOfMeasurements) { m_maxNumberOfMeasurements = (maxNumberOfMeasurements > 0) ? maxNumberOfMeasurements : 1; if (m_measurementValues.size() > m_maxNumberOfMeasurements) { m_measurementValues.erase(std::begin(m_measurementValues), std::begin(m_measurementValues) + m_measurementValues.size() - m_maxNumberOfMeasurements); } } size_t SamplingMetricBase::getMaxNumberOfMeasurements() const { return m_maxNumberOfMeasurements; } size_t SamplingMetricBase::getCurrentNumberOfMeasurements() const { return m_measurementValues.size(); } double SamplingMetricBase::getElapsedTime() const { return m_elapsedTime; } void SamplingMetricBase::update(double dt) { m_elapsedTime += dt; if (canMeasure(dt)) { MeasurementEntryType newEntry; newEntry.first = m_elapsedTime; newEntry.second = performMeasurement(dt); m_measurementValues.push_back(newEntry); if (m_measurementValues.size() > m_maxNumberOfMeasurements) { m_measurementValues.pop_front(); } } } } } opensurgsim-0.7.0/SurgSim/Framework/SamplingMetricBase.h000066400000000000000000000114601277777236100233260ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_FRAMEWORK_SAMPLINGMETRICBASE_H #define SURGSIM_FRAMEWORK_SAMPLINGMETRICBASE_H #include #include "SurgSim/Framework/Behavior.h" #include "SurgSim/Framework/ObjectFactory.h" namespace SurgSim { namespace Framework { class Logger; }; }; namespace SurgSim { namespace Framework { /// SamplingMetricBase provides a base class to support metric development. New /// metrics should derive from the base class and redefine canMeasure() and /// takeMeasurement() ensure the system is ready to be measured and to perform /// the measurement respectively. /// /// The nominal setting provides for 30 minutes of continuous sampling at 30 hertz. /// After that time, old measurements will be discarded as new measurements are made /// so as to stay within the same memory footprint. class SamplingMetricBase : public SurgSim::Framework::Behavior { public: /// Constructor for the class. /// \param name is the name given to the behavior. explicit SamplingMetricBase(const std::string& name); /// Type of the individual entries in the measurement data structure. The first field of the /// pair holds the elapsed simulation time (accumulation of the dt value) since the last successful /// measurement and the second field of the pair holds the measurement value obtained at that time. typedef std::pair MeasurementEntryType; /// Type of the cumulative entries data structure. The code current caps the number of entries at a /// user prescribed value to keep from overwriting all of memory when the process is allowed to run /// unchecked over long periods. The maximum number of entries is nominally capped at 30 minutes of samples /// taken 30 times per second, but it can be adjusted using he setMaxNumberOfMeasurements call. Note /// that the last measurements taken are always saved. After the limit is reached the oldest entry is /// discarded to make room for the new measurement. typedef std::deque MeasurementsType; void update(double dt) override; /// Set the desired manager type for this metric. Given the potential tight coupling of the /// and the various other behaviors, this will provide us with the flexibility to choose /// the appropriate manager for the task. /// \param targetManagerType is the manager type to be used for managing this metric void setTargetManagerType(int targetManagerType); int getTargetManagerType() const override; /// Set the maximum number of measurements to store. void setMaxNumberOfMeasurements(size_t numberOfMeasurements); /// \return Maximum number of measurements to be stored. size_t getMaxNumberOfMeasurements() const; /// \return Number of measurements currently stored (not the maximum number of measurements). size_t getCurrentNumberOfMeasurements() const; /// Get the amount of time since the last successful measurement reading based on the /// accumulation of successive dt values. /// \return the elapsed time double getElapsedTime() const; /// Return the measurement values obtained for this measurement. virtual MeasurementsType getMeasurementValues(); protected: bool doWakeUp() override; bool doInitialize() override; /// Determine if it is appropriate to take a measurement. /// \param dt is the elapsed time since the last call to update. /// \return if it is currently valid to calculate the next measurement value. /// \note Be careful with threading when implementing this call. Anything referenced both /// here and in performMeasurement() must be safe. virtual bool canMeasure(double dt); /// Obtain the measurement. /// \param dt is the elapsed time since the last call to update. /// \return the next measurement value. This method should be overwritten to provide the /// various measurements for the simulation. /// \note Be careful with threading when implementing this call. Anything referenced both /// here and in canMeasure() must be safe. virtual double performMeasurement(double dt) = 0; std::shared_ptr m_logger; private: /// measurement list MeasurementsType m_measurementValues; int m_targetManagerType; double m_elapsedTime; size_t m_maxNumberOfMeasurements; }; }; }; #endif // SURGSIM_FRAMEWORK_SAMPLINGMETRICBASE_H opensurgsim-0.7.0/SurgSim/Framework/Scene.cpp000066400000000000000000000111551277777236100212060ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest LLC. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Framework/Scene.h" #include #include #include #include #include #include "SurgSim/Framework/Component.h" #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Framework/SceneElement.h" namespace SurgSim { namespace Framework { Scene::Scene(std::weak_ptr runtime) : m_runtime(runtime), m_logger(Framework::Logger::getLogger("Framework/Scene")) { SURGSIM_ASSERT(!m_runtime.expired()) << "Can't create scene with empty runtime."; } Scene::~Scene() { } void Scene::addSceneElement(std::shared_ptr element) { auto runtime = getRuntime(); SURGSIM_ASSERT(runtime) << "Runtime pointer is expired, cannot add SceneElement to Scene."; std::string name = element->getName(); element->setScene(getSharedPtr()); element->setRuntime(runtime); if (element->initialize()) { { boost::lock_guard lock(m_sceneElementsMutex); m_elements.push_back(element); m_groups.add(element->getGroups(), element); } runtime->addSceneElement(element); } } void Scene::removeSceneElement(std::shared_ptr element) { element->setActive(false); element->removeComponents(); boost::lock_guard lock(m_sceneElementsMutex); auto found = std::find(m_elements.begin(), m_elements.end(), element); if (found != m_elements.end()) { m_elements.erase(found); } else { SURGSIM_LOG_WARNING(m_logger) << "Could not find element '" << element->getName() << "' in Scene, unable to remove"; } } void Scene::addSceneElements(std::vector> elements) { for (auto element : elements) { addSceneElement(element); } } std::shared_ptr Scene::getRuntime() { return m_runtime.lock(); } const std::vector >& Scene::getSceneElements() const { return m_elements; } const std::shared_ptr Scene::getSceneElement(const std::string& name) const { std::shared_ptr result = nullptr; for (auto it = std::begin(m_elements); it != std::end(m_elements); ++it) { if ((*it)->getName() == name) { result = *it; break; } } return result; } std::shared_ptr Scene::getSharedPtr() { std::shared_ptr result; try { result = shared_from_this(); } catch (const std::exception&) { SURGSIM_FAILURE() << "Scene was not created as a shared_ptr"; } return result; } YAML::Node Scene::encode() const { YAML::Node result(YAML::NodeType::Map); YAML::Node data(YAML::NodeType::Map); for (auto sceneElement = m_elements.begin(); sceneElement != m_elements.end(); ++sceneElement) { data["SceneElements"].push_back(*(*sceneElement)); } result["SurgSim::Framework::Scene"] = data; return result; } bool Scene::decode(const YAML::Node& node) { bool result = false; if (node.IsMap()) { YAML::Node data = node["SurgSim::Framework::Scene"]; if (data["SceneElements"].IsDefined()) { auto sceneElements = data["SceneElements"].as>>(); std::for_each(sceneElements.begin(), sceneElements.end(), [&](std::shared_ptr element) { addSceneElement(element); }); } result = true; } return result; } SurgSim::DataStructures::Groups>& Scene::getGroups() { return m_groups; } std::shared_ptr Scene::getComponent(const std::string& elementName, const std::string& componentName) const { std::shared_ptr result; auto element = getSceneElement(elementName); if (element != nullptr) { result = element->getComponent(componentName); if (result == nullptr) { SURGSIM_LOG_INFO(m_logger) << "Could not find component '" << componentName << "' in Element '" << elementName << "'."; } } else { SURGSIM_LOG_INFO(m_logger) << "Could not find element '" << elementName << "'."; } return result; } }; // namespace Framework }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Framework/Scene.h000066400000000000000000000071621277777236100206560ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_FRAMEWORK_SCENE_H #define SURGSIM_FRAMEWORK_SCENE_H #include #include #include #include #include "SurgSim/DataStructures/Groups.h" #include "SurgSim/Framework/SceneElement.h" namespace YAML { class Node; } namespace SurgSim { namespace Framework { class Logger; class Runtime; /// Scene. Basic Container for SceneElements class Scene : public std::enable_shared_from_this { public: /// Constructor. /// \param runtime The runtime to be used. explicit Scene(std::weak_ptr runtime); /// Destructor ~Scene(); /// Adds a scene element to the Scene, the SceneElement will have its initialize() function called. /// \param element The element. void addSceneElement(std::shared_ptr element); /// Removes a scene element from the Scene /// \param element The element. void removeSceneElement(std::shared_ptr element); /// Invokes addSceneElement() for each element in the list. /// \param elements the list of elements to be added. void addSceneElements(std::vector> elements); /// Gets all the scene elements in the scene. /// \return The scene elements. const std::vector>& getSceneElements() const; /// Retrieve a SceneElement for this scene with the given name. /// \return A SceneElement with given name; Empty share_ptr<> will be returned if no such SceneElement found. const std::shared_ptr getSceneElement(const std::string& name) const; /// Look through the scene to find a component of a named element /// \param elementName The name of the element to find /// \param componentName The name of the component to find /// \return the component that was found, nullptr if no component was found std::shared_ptr getComponent(const std::string& elementName, const std::string& componentName) const; /// Gets the runtime. /// \return runtime The runtime for this scene. std::shared_ptr getRuntime(); /// Convert to a YAML::Node /// \return A node with all the public data of this instance YAML::Node encode() const; /// Pull data from a YAML::Node. /// \param node the node to decode. /// \return true if the decoding succeeded and the node was formatted correctly, false otherwise bool decode(const YAML::Node& node); /// \return the groups of the scene SurgSim::DataStructures::Groups>& getGroups(); private: /// Get a shared pointer to Scene. /// \return The shared pointer. std::shared_ptr getSharedPtr(); std::weak_ptr m_runtime; std::vector> m_elements; // Used in a const function, need to declare mutable mutable boost::mutex m_sceneElementsMutex; SurgSim::DataStructures::Groups> m_groups; std::shared_ptr m_logger; }; }; // namespace Framework }; // namespace SurgSim #endif // SURGSIM_FRAMEWORK_SCENE_H opensurgsim-0.7.0/SurgSim/Framework/SceneElement-inl.h000066400000000000000000000041051277777236100227420ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_FRAMEWORK_SCENEELEMENT_INL_H #define SURGSIM_FRAMEWORK_SCENEELEMENT_INL_H #include "SurgSim/Framework/Component.h" namespace SurgSim { namespace Framework { /// Implementation of getComponents method to get all the components with type T /// \return The type T components template std::vector> SceneElement::getComponents() const { std::vector> result; for (auto componentIt = m_components.begin(); componentIt != m_components.end(); ++componentIt) { std::shared_ptr typedElement = std::dynamic_pointer_cast(componentIt->second); if (typedElement) { result.emplace_back(std::move(typedElement)); } } return result; } template T SceneElement::getValue(const std::string& component, const std::string& property) const { auto found = m_components.find(component); SURGSIM_ASSERT(found != m_components.end()) << "Component named " << component << " not found in SceneElement named " << getName() << ". Cannot get " << property << " property."; return found->second->getValue(property); } template bool SceneElement::getValue(const std::string& component, const std::string& property, T* value) const { bool result = false; auto found = m_components.find(component); if (found != m_components.end()) { result = found->second->getValue(property, value); } return result; } }; // namespace Framework }; // namespace SurgSim #endif opensurgsim-0.7.0/SurgSim/Framework/SceneElement.cpp000066400000000000000000000241651277777236100225250ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest LLC. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Framework/SceneElement.h" #include #include "SurgSim/DataStructures/DataStructuresConvert.h" #include "SurgSim/Framework/Component.h" #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Framework/PoseComponent.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Framework/Scene.h" namespace SurgSim { namespace Framework { SceneElement::SceneElement(const std::string& name) : m_name(name), m_isInitialized(false), m_isActive(true) { m_pose = std::make_shared("Pose"); m_pose->setPose(Math::RigidTransform3d::Identity()); m_components[m_pose->getName()] = m_pose; } SceneElement::~SceneElement() { } bool SceneElement::addComponent(std::shared_ptr component) { SURGSIM_ASSERT(nullptr != component) << "Cannot add a nullptr as a component"; bool result = false; if (m_components.find(component->getName()) == m_components.end()) { result = true; if (isInitialized()) { auto runtime = getRuntime(); SURGSIM_ASSERT(nullptr != runtime) << "Runtime cannot be expired when adding a component " << getName(); result = initializeComponent(component); if (result) { runtime->addComponent(component); } } if (result) { try { // This will except if called during constructor // the this will be set in initialize() component->setSceneElement(shared_from_this()); } catch (std::exception) { // intentionally empty } m_components[component->getName()] = component; } } else { SURGSIM_LOG_WARNING(Logger::getLogger("runtime")) << "Component with name " << component->getName() << " already exists on SceneElement " << getName() << ", did not add component"; } return result; } bool SceneElement::removeComponent(std::shared_ptr component) { return removeComponent(component->getName()); } bool SceneElement::removeComponent(const std::string& name) { bool result = false; auto found = m_components.find(name); if (found != m_components.end()) { if (isInitialized()) { auto runtime = getRuntime(); SURGSIM_ASSERT(nullptr != runtime) << "Runtime cannot be expired when removing a component " << getName(); found->second->setLocalActive(false); runtime->removeComponent(found->second); } size_t count = m_components.erase(name); result = (count == 1); } return result; } void SceneElement::removeComponents() { if (!m_components.empty()) { auto runtime = getRuntime(); SURGSIM_ASSERT(runtime) << "Runtime cannot be expired when removing components from " << getName(); for (auto it = std::begin(m_components); it != std::end(m_components); ++it) { it->second->setLocalActive(false); runtime->removeComponent(it->second); } m_components.clear(); } } std::shared_ptr SceneElement::getComponent(const std::string& name) const { std::shared_ptr result; auto findResult = m_components.find(name); if (findResult != m_components.end()) { result = findResult->second; } return result; } bool SceneElement::initialize() { SURGSIM_ASSERT(!m_isInitialized) << "Double initialization calls on SceneElement " << m_name; m_isInitialized = doInitialize(); // If it did not happen in addComponent do it here m_pose->setSceneElement(getSharedPtr()); if (m_isInitialized) { // initialize all components for (auto pair = std::begin(m_components); m_isInitialized && pair != std::end(m_components); ++pair) { m_isInitialized = initializeComponent(pair->second); } } return m_isInitialized; } bool SceneElement::initializeComponent(std::shared_ptr component) { component->setSceneElement(getSharedPtr()); component->setScene(m_scene); return component->initialize(getRuntime()); } std::string SceneElement::getName() const { return m_name; } void SceneElement::setPose(const SurgSim::Math::RigidTransform3d& pose) { m_pose->setPose(pose); } const SurgSim::Math::RigidTransform3d& SceneElement::getPose() const { return m_pose->getPose(); } std::shared_ptr SceneElement::getPoseComponent() { return m_pose; } std::vector> SceneElement::getComponents() const { std::vector> result(m_components.size()); auto componentIt = m_components.begin(); for (int i = 0; componentIt != m_components.end(); ++componentIt, ++i) { result[i] = componentIt->second; } return result; } boost::any SceneElement::getValue(const std::string& component, const std::string& property) const { auto found = m_components.find(component); SURGSIM_ASSERT(found != m_components.end()) << "Component named " << component << " not found in SceneElement named " << getName() << ". Cannot get " << property << " property."; return found->second->getValue(property); } void SceneElement::setValue(const std::string& component, const std::string& property, const boost::any& value) { auto found = m_components.find(component); SURGSIM_ASSERT(found != m_components.end()) << "Component named " << component << " not found in SceneElement named " << getName() << ". Cannot get " << property << " property."; found->second->setValue(property, value); } void SceneElement::setScene(std::weak_ptr scene) { m_scene = scene; for (auto it = std::begin(m_components); it != std::end(m_components); ++it) { (it->second)->setScene(scene); } } std::shared_ptr SceneElement::getScene() { return m_scene.lock(); } void SceneElement::setRuntime(std::weak_ptr runtime) { m_runtime = runtime; } std::shared_ptr SceneElement::getRuntime() { return m_runtime.lock(); } bool SceneElement::isInitialized() const { return m_isInitialized; } std::shared_ptr SceneElement::getSharedPtr() { std::shared_ptr result; try { result = shared_from_this(); } catch (const std::exception&) { SURGSIM_FAILURE() << "SceneElement was not created as a shared_ptr."; } return result; } void SceneElement::setName(const std::string& name) { m_name = name; } YAML::Node SceneElement::encode(bool standalone) const { YAML::Node data(YAML::NodeType::Map); data["Name"] = getName(); data["IsActive"] = isActive(); // Only encode groups when they are there, also encode them using the flow style i.e. with [] if (m_groups.size() > 0) { data["Groups"] = m_groups; data["Groups"].SetStyle(YAML::EmitterStyle::Flow); } for (auto component = std::begin(m_components); component != std::end(m_components); ++component) { if (standalone) { data["Components"].push_back(*component->second); } else { data["Components"].push_back(component->second); } } YAML::Node node(YAML::NodeType::Map); node[getClassName()] = data; return node; } bool SceneElement::decode(const YAML::Node& node) { SURGSIM_ASSERT(!isInitialized()) << "Should not call decode on a SceneElement that has already been initialized."; bool result = false; if (node.IsMap()) { std::string className = node.begin()->first.as(); SURGSIM_ASSERT(className == getClassName()) << "Type in node does not match class, wanted <" << className << ">" << " but this is a <" << getClassName() << ">."; YAML::Node data = node[getClassName()]; SURGSIM_ASSERT(data.IsDefined() && !data.IsNull()) << "Content of node is empty, for class " << className << ". This is probably an indentation issue."; if (data["Name"].IsScalar()) { m_name = data["Name"].as(); } if (data["IsActive"].IsDefined()) { m_isActive = data["IsActive"].as(); } if (data["Groups"].IsDefined()) { m_groups = data["Groups"].as>(); } if (data["Components"].IsSequence()) { for (auto nodeIt = data["Components"].begin(); nodeIt != data["Components"].end(); ++nodeIt) { if ("SurgSim::Framework::PoseComponent" == nodeIt->begin()->first.as()) { removeComponent(m_pose); m_pose = nodeIt->as>(); addComponent(m_pose); } else { try { addComponent(nodeIt->as>()); } catch (YAML::Exception e) { SURGSIM_FAILURE() << e.what() << "for " << std::endl << *nodeIt; } } } result = true; } } return result; } std::string SceneElement::getClassName() const { // SURGSIM_FAILURE() << "SceneElement is abstract, this should not be called."; return "SurgSim::Framework::SceneElement"; } void SceneElement::setActive(bool val) { m_isActive = val; } bool SceneElement::isActive() const { return m_isActive; } void SceneElement::addToGroup(const std::string& group) { m_groups.insert(group); if (isInitialized()) { getScene()->getGroups().add(group, getSharedPtr()); } } void SceneElement::removeFromGroup(const std::string& group) { m_groups.erase(group); if (isInitialized()) { getScene()->getGroups().remove(group, getSharedPtr()); } } void SceneElement::setGroups(const std::vector& groups) { if (isInitialized()) { auto& groupings = getScene()->getGroups(); groupings.remove(getSharedPtr()); groupings.add(groups, getSharedPtr()); } std::unordered_set temp(groups.cbegin(), groups.cend()); std::swap(m_groups, temp); } std::vector SceneElement::getGroups() const { return std::vector(m_groups.cbegin(), m_groups.cend()); } bool SceneElement::inGroup(const std::string& name) { auto groups = getGroups(); return (std::find(groups.begin(), groups.end(), name) != groups.end()); } }; // namespace Framework }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Framework/SceneElement.h000066400000000000000000000224351277777236100221700ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_FRAMEWORK_SCENEELEMENT_H #define SURGSIM_FRAMEWORK_SCENEELEMENT_H #include #include #include #include #include #include #include #include "SurgSim/Math/RigidTransform.h" namespace YAML { class Node; } namespace SurgSim { namespace Framework { class Component; class PoseComponent; class Scene; class Runtime; /// SceneElement is the basic part of a scene, it is a container of components. When a /// SceneElement is added to a Scene, the Scene will call initialize() on the SceneElement, /// which in turn will call initialize() on all its components. /// If a component is added to a SceneElement after the SceneElement was initialized, the component will /// be initialized immediately. /// \note A SceneElement needs to be created as a shared_ptr. class SceneElement : public std::enable_shared_from_this { public: /// Constructor /// \param name Name of this SceneElement explicit SceneElement(const std::string& name); /// Destructor virtual ~SceneElement(); /// \return the class name for this class virtual std::string getClassName() const; /// Adds a component, calls initialize() on the component, if SceneElement::isInitialized() is true /// \param component The component. /// \return true if it succeeds, false if it fails. bool addComponent(std::shared_ptr component); /// Removes a given component. /// \param component The component. /// \return true if it succeeds, false if it fails or the component cannot be found. bool removeComponent(std::shared_ptr component); /// Removes the component described by name. /// \param name The name. /// \return true if it succeeds, false if it fails or the component cannot be found. bool removeComponent(const std::string& name); /// Removes all components void removeComponents(); /// Gets the component identified by name. /// \param name The name. /// \return The component or nullptr if the component cannot be found. std::shared_ptr getComponent(const std::string& name) const; /// Gets all the components of this SceneElement. /// \return The components. std::vector> getComponents() const; /// Template version of getComponents method to get all the components with type T /// \return The type T components template std::vector> getComponents() const; /// Retrieves the property value from a component /// \throws SurgSim::Framework::AssertionFailure If the conversion fails or the property cannot be found. /// \tparam T The requested type for the property. /// \param component The name of the component. /// \param property The name of the property. /// \return The value of the property if found. template T getValue(const std::string& component, const std::string& property) const; /// Retrieves the property value from a component /// \throws SurgSim::Framework::AssertionFailure if the property cannot be found /// \param component The name of the component. /// \param property The name of the property. /// \return The value of the property if found. boost::any getValue(const std::string& component, const std::string& property) const; /// Retrieves the property value from a component, and convertis it to the /// type of the output parameter. This does not throw. /// \tparam T the type of the property /// \param component The name of the component. /// \param property The name of the property. /// \param [out] value If non-null, will receive the value of the given property. /// \return true if value != nullptr and the property is found. template bool getValue(const std::string& component, const std::string& property, T* value) const; /// Sets the property value of a component /// \throws SurgSim::Framework::AssertionFailure If the property cannot be found. /// \param component The name of the component. /// \param property The name of the property. /// \param value The value that it should be set to. void setValue(const std::string& component, const std::string& property, const boost::any& value); /// Add this scene element to the given group /// \param group name of the group void addToGroup(const std::string& group); /// Remove this scene element from the given group /// \param group name of the group void removeFromGroup(const std::string& group); /// Set the groups of this scene element /// \param groups all the groups that this scene element should be in void setGroups(const std::vector& groups); /// \return all the groups of this scene element std::vector getGroups() const; /// Test whether this SceneElement is in a specific group /// \param name group to test /// \return true if the SceneElement is in group name bool inGroup(const std::string& name); /// Executes the initialize operation. /// \return true if it succeeds, false if it fails. bool initialize(); /// Return the name of this SceneElement /// \return The name. std::string getName() const; /// Set the pose of this SceneElement /// \param pose The pose void setPose(const SurgSim::Math::RigidTransform3d& pose); /// Get the pose of this SceneElement /// \return the pose const SurgSim::Math::RigidTransform3d& getPose() const; /// Get the PoseComponent that controls the pose all Representations /// in this SceneElement /// \return the PoseComponent std::shared_ptr getPoseComponent(); /// Sets the Scene. /// \param scene Pointer to the scene. void setScene(std::weak_ptr scene); /// Gets the Scene. /// \return The scene. std::shared_ptr getScene(); /// Sets the Runtime. /// \param runtime Pointer to the runtime. void setRuntime(std::weak_ptr runtime); /// Gets the runtime. /// \return The runtime. std::shared_ptr getRuntime(); /// Return if this SceneElement is initialized. /// \return True if this SceneElement is initialized; Otherwise, false. bool isInitialized() const; /// Set this SceneElement's status (active/inactive) /// \note Set 'inactive' on an active SceneElement will cause all the components it contains to not be processed. /// \note Set 'active' on an inactive SceneElement will cause all the components it contains which are active /// \note to be processed again. /// \note Inactive components will not be processed no matter the SceneElement is active or inactive. /// \param val True to set the SceneElement active, false to set inactive. void setActive(bool val); /// \return True if this SceneElement is active; Otherwise, false. bool isActive() const; /// Gets a shared pointer to this SceneElement. /// \return The shared pointer. std::shared_ptr getSharedPtr(); /// Convert to a YAML::Node /// \param standalone when true, all the components will be represented as full component, when false /// they will be represented as references /// \return A node with all the public data of this instance virtual YAML::Node encode(bool standalone) const; /// Pull data from a YAML::Node. /// \throws SurgSim::Framework::AssertionFailure if the SceneElement is already initialized /// \param node the node to decode. /// \return true if the decoding succeeded and the node was formatted correctly, false otherwise virtual bool decode(const YAML::Node& node); private: /// Initialize the given component /// \param component The component to be initialized. /// \return True if initialization succeeded, false otherwise. bool initializeComponent(std::shared_ptr component); /// Name of this SceneElement std::string m_name; std::shared_ptr m_pose; /// A collection of Components std::unordered_map> m_components; /// A (weak) back pointer to the Scene containing this SceneElement std::weak_ptr m_scene; /// A (weak) back pointer to the Runtime containing this SceneElement std::weak_ptr m_runtime; /// Local groups for serialization local handling std::unordered_set m_groups; /// Method to initialize this SceneElement. To be overridden by derived class(es). /// \return True if initialization is successful; Otherwise, false. virtual bool doInitialize() = 0; /// Sets the name of this SceneElement. /// \param name The new name. void setName(const std::string& name); /// Indicates if this SceneElement has been initialized or not. bool m_isInitialized; /// Indicates if this SceneElement is active or not. bool m_isActive; }; }; // namespace Framework }; // namespace SurgSim #include "SurgSim/Framework/SceneElement-inl.h" #endif // SURGSIM_FRAMEWORK_SCENEELEMENT_H opensurgsim-0.7.0/SurgSim/Framework/SharedInstance-inl.h000066400000000000000000000037531277777236100232760ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_FRAMEWORK_SHAREDINSTANCE_INL_H #define SURGSIM_FRAMEWORK_SHAREDINSTANCE_INL_H #include #include #include #include #include "SurgSim/Framework/Assert.h" namespace SurgSim { namespace Framework { template SharedInstance::SharedInstance() : m_instanceCreator(defaultInstanceCreator()) { } template SharedInstance::SharedInstance(const InstanceCreator& instanceCreator) : m_instanceCreator(instanceCreator) { } template SharedInstance::~SharedInstance() { } template std::shared_ptr SharedInstance::get() { boost::lock_guard lock(m_mutex); std::shared_ptr instance = m_weakInstance.lock(); if (! instance) { instance = createInstance(); m_weakInstance = instance; } return std::move(instance); } template std::shared_ptr SharedInstance::createInstance() { std::shared_ptr instance = m_instanceCreator(); SURGSIM_ASSERT(instance); return std::move(instance); } template typename SharedInstance::InstanceCreator SharedInstance::defaultInstanceCreator() { return []() { return std::make_shared(); }; // NOLINT(readability/braces) } }; // namespace Framework }; // namespace SurgSim #endif // SURGSIM_FRAMEWORK_SHAREDINSTANCE_INL_H opensurgsim-0.7.0/SurgSim/Framework/SharedInstance.h000066400000000000000000000155501277777236100225140ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_FRAMEWORK_SHAREDINSTANCE_H #define SURGSIM_FRAMEWORK_SHAREDINSTANCE_H #include #include #include #include #include "SurgSim/Framework/Assert.h" namespace SurgSim { namespace Framework { /// A utility class to manage a shared instance of an object. /// /// This class behaves in a way that is superficially similar to the Singleton pattern, in that it manages a single /// shared instance of an object. However, there are some important differences to note: /// * The Singleton pattern applies to a particular class, so that a single instance is shared between any /// and all uses of that class. The SharedInstance case applies to a specific use of a class: the user /// creates a (shared) SharedInstance<T> object that manages the sharing of one instance of T. It is /// possible for another SharedInstance<T> that manages the same type T to be created elsewhere. This /// second SharedInstance manages a second, separate instance of T. /// * The object will not only be created as needed, but also destroyed when all of the shared_ptr references to it /// are released. If it is released and then needed again, a new instance will be created. /// * This life-cycle management based on reference counting makes it imperative for the calling code to hold /// onto their own shared_ptr for as long as they want to interact with the shared object instance. /// Releasing the shared_ptr indicates that the code using it is ready for the instance to be potentially /// destroyed. /// /// Code using this class will normally use the get() method to initialize its own shared_ptr referencing the /// shared instance. Such code should hold onto the shared_ptr for as long as it needs to use the shared instance. /// As soon as all of the shared pointers are released, the shared object instance will be destroyed. /// /// A Simple Example /// /// To share an instance between many objects in the same class, you can declare a static SharedInstance member: /// ~~~~ /// class ManyObjects /// { /// ManyObjects() : m_sharedInstance(m_sharedInstanceManager.get()) /// { /// } /// /// // ... /// /// std::shared_ptr m_sharedInstance; /// static SurgSim::Framework::SharedInstance m_sharedInstanceManager; /// } /// /// // Need to also define the static member somewhere: /// SurgSim::Framework::SharedInstance ManyObjects::m_sharedInstanceManager; /// ~~~~ /// The downside to this approach is that it requires the SharedInstance object itself to be created as a static /// member of a class. Since the order of construction (and destruction) of various static data members is not /// well defined by the C++ language standards, this can lead to objects getting used before they are initialized. /// /// A Better Example /// /// To avoid the initialization order problems, you can instead use the SharedInstance as a static variable /// inside a function or a (most likely also static) method, so it will not be initialized until that /// function/method is first called. (Note that this is only safe if your compiler follows the C++11 /// requirement that the initialization of static variables inside functions must be atomic.) /// ~~~~ /// class ManyObjects /// { /// ManyObjects() : m_sharedInstance(getSharedInstance()) /// { /// } /// /// // ... /// /// static std::shared_ptr getSharedInstance(); /// std::shared_ptr m_sharedInstance; /// } /// /// std::shared_ptr ManyObjects::getSharedInstance() /// { /// static SharedInstance shared; /// return shared.get(); /// } /// ~~~~ /// /// \tparam T Type of the data held by the SharedInstance. template class SharedInstance { public: /// A type that can hold a function object or lambda that takes no arguments and returns std::shared_ptr. typedef std::function()> InstanceCreator; /// Create the SharedInstance object used to manage the shared instance. /// Note that this does not immediately create the instance itself. /// If and when the shared instance is created, it will be initialized using the default constructor via /// std::make_shared. SharedInstance(); /// Create the SharedInstance object used to manage the shared instance. /// Note that this does not immediately create the instance itself. /// If and when the shared instance is created, it will be initialized using the creator call. explicit SharedInstance(const InstanceCreator& instanceCreator); /// Destroy the container and the data it contains. ~SharedInstance(); /// Gets the shared object instance. /// If the instance has not been created previously, it will be created during the call. /// /// The calling code should generally copy the shared_ptr and hold onto it for as long as needed. /// As soon as all of the shared pointers are released, the shared object instance will be destroyed. /// /// \return a shared_ptr holding the instance. std::shared_ptr get(); private: /// Prevent copying SharedInstance(const SharedInstance&); /// Prevent assignment SharedInstance& operator=(const SharedInstance&); /// Creates an object instance. /// \return a shared_ptr containing a newly created object instance. std::shared_ptr createInstance(); /// Creates a function that can create an instance using std::make_shared(). /// The function must be default-constuctible. /// It was necessary to split this into a separate function because with VS2010, we can't just put a lambda in the /// initializer for m_instanceCreator. /// \return a function that creates a new object of type T using std::make_shared. static InstanceCreator defaultInstanceCreator(); /// A creator function used to construct the shared instance. InstanceCreator m_instanceCreator; /// A weak reference to the shared instance, if any. std::weak_ptr m_weakInstance; /// Mutex for synchronization of object creation. boost::mutex m_mutex; }; }; // namespace Framework }; // namespace SurgSim #include "SurgSim/Framework/SharedInstance-inl.h" #endif // SURGSIM_FRAMEWORK_SHAREDINSTANCE_H opensurgsim-0.7.0/SurgSim/Framework/ThreadPool-inl.h000066400000000000000000000030701277777236100224340ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_FRAMEWORK_THREADPOOL_INL_H #define SURGSIM_FRAMEWORK_THREADPOOL_INL_H namespace SurgSim { namespace Framework { class ThreadPool::TaskBase { public: virtual void execute() = 0; virtual ~TaskBase() {} }; template class ThreadPool::Task : public ThreadPool::TaskBase { public: explicit Task(std::function function) : m_task(function) { } void execute() override { m_task(); } std::future getFuture() { return m_task.get_future(); } private: std::packaged_task m_task; }; template std::future ThreadPool::enqueue(std::function function) { std::unique_ptr> task = std::unique_ptr>(new Task(function)); std::future future = task->getFuture(); { boost::unique_lock lock(m_mutex); m_tasks.push(std::move(task)); } m_threadSignaler.notify_one(); return future; } }; }; #endif //SURGSIM_FRAMEWORK_THREADPOOL_INL_H opensurgsim-0.7.0/SurgSim/Framework/ThreadPool.cpp000066400000000000000000000027461277777236100222200ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Framework/ThreadPool.h" namespace SurgSim { namespace Framework { ThreadPool::ThreadPool(size_t numThreads) : m_destructing(false) { // Main loop for each worker thread. auto threadLoop = [this] () { while (true) { std::unique_ptr task; { boost::unique_lock lock(m_mutex); m_threadSignaler.wait(lock, [this] { return m_destructing || !m_tasks.empty(); }); if (m_destructing) { return; } task = std::move(m_tasks.front()); m_tasks.pop(); } task->execute(); } }; for (size_t i = 0; i < numThreads; i++) { m_threads.emplace_back(threadLoop); } } ThreadPool::~ThreadPool() { { boost::unique_lock lock(m_mutex); m_destructing = true; } m_threadSignaler.notify_all(); for (auto& thread : m_threads) { thread.join(); } } }; }; opensurgsim-0.7.0/SurgSim/Framework/ThreadPool.h000066400000000000000000000066501277777236100216630ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_FRAMEWORK_THREADPOOL_H #define SURGSIM_FRAMEWORK_THREADPOOL_H #include #include #include #include #include #include #include namespace SurgSim { namespace Framework { /// A thread pool for completing heterogenous tasks /// /// The thread pool is a class that completes given tasks using a set of worker /// threads. These threads pull tasks off of a task queue. Once finished with /// the task, the thread gets the next task if one is available, or waits for /// another task to be added. The tasks can be heterogenous, meaning any /// callable target can be added with any return type. /// /// Example Usage: /// \code{.cpp} /// double f1() { return 1.0; } /// int f2(int val) { return val; } /// /// int main() /// { /// ThreadPool pool; /// /// // Add a task /// std::future result1 = pool.enqueue(f1); /// /// // Add a task using std::bind /// std::future result2 = pool.enqueue(std::bind(f2, 2)); /// /// // Add a task using a lambda function /// std::future result3 = pool.enqueue([]() {return "string"; }); /// /// // Print out result when task is completed /// std::cout << "Result 1: " << result1.get() << std::endl; /// std::cout << "Result 2: " << result2.get() << std::endl; /// std::cout << "Result 3: " << result3.get() << std::endl; /// } /// \endcode class ThreadPool { public: /// Constructor /// \param numThreads The number of worker threads explicit ThreadPool(size_t numThreads = boost::thread::hardware_concurrency()); /// Desctructor ~ThreadPool(); /// Queue a task to be run by the ThreadPool /// \note The task must not take any arguments. To add a function that does /// require arguments use std::bind. /// \tparam R return type of the task /// \param function The task to be queued /// \return a std::future that holds the results (of type R) once completed template std::future enqueue(std::function function); private: /// @{ /// Prevent default copy construction and default assignment ThreadPool(const ThreadPool& other); ThreadPool& operator=(const ThreadPool& other); /// @} /// Abstract base class for all tasks class TaskBase; /// Actual tasks, with typed return type template class Task; /// The worker threads std::list m_threads; /// Queued tasks waiting for an available thread std::queue> m_tasks; /// Mutex for protecting the tasks queue boost::mutex m_mutex; /// Signaler for waking up threads waiting for tasks boost::condition_variable m_threadSignaler; /// True if the ThreadPool is destructing std::atomic m_destructing; }; }; }; #include "SurgSim/Framework/ThreadPool-inl.h" #endif //SURGSIM_FRAMEWORK_THREADPOOL_H opensurgsim-0.7.0/SurgSim/Framework/Timer.cpp000066400000000000000000000111121277777236100212220ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Framework/Assert.h" #include "SurgSim/Framework/Timer.h" namespace SurgSim { namespace Framework { Timer::Timer() : m_maxNumberOfFrames(100), m_clockFails(0) { start(); } void Timer::start() { { // Define scope around m_frameDurations to lock only this access boost::unique_lock lock(m_sharedMutex); m_frameDurations.clear(); m_clockFails = 0; } beginFrame(); } void Timer::beginFrame() { m_lastTime = now(); } void Timer::endFrame() { TimerTimePoint currentTime = now(); TimerDuration duration = currentTime - m_lastTime; { // Define scope around m_frameDurations to lock only this access boost::unique_lock lock(m_sharedMutex); m_frameDurations.push_back(duration); if (m_frameDurations.size() > m_maxNumberOfFrames) { m_frameDurations.pop_front(); } } } void Timer::markFrame() { endFrame(); beginFrame(); } double Timer::getCumulativeTime() const { TimerDuration cumulativeTime; { // Define scope around m_frameDurations to lock only this access boost::shared_lock lock(m_sharedMutex); cumulativeTime = std::accumulate(std::begin(m_frameDurations), std::end(m_frameDurations), TimerDuration::zero()); } return cumulativeTime.count(); } double Timer::getAverageFramePeriod() const { TimerDuration cumulativeTime; size_t numDuration; { // Define scope around m_frameDurations to lock only this access boost::shared_lock lock(m_sharedMutex); numDuration = m_frameDurations.size(); cumulativeTime = std::accumulate(std::begin(m_frameDurations), std::end(m_frameDurations), TimerDuration::zero()); } SURGSIM_ASSERT(numDuration > 0) << "Attempted to access the frames for a Timer with no frames."; return cumulativeTime.count() / static_cast(numDuration); } double Timer::getAverageFrameRate() const { return 1.0 / getAverageFramePeriod(); } double Timer::getLastFramePeriod() const { boost::shared_lock lock(m_sharedMutex); SURGSIM_ASSERT(m_frameDurations.size() > 0) << "Attempted to access the last frame period for a Timer with no frames."; return m_frameDurations.back().count(); } double Timer::getLastFrameRate() const { return 1.0 / getLastFramePeriod(); } void Timer::setMaxNumberOfFrames(size_t maxNumberOfFrames) { boost::unique_lock lock(m_sharedMutex); m_maxNumberOfFrames = (maxNumberOfFrames > 0) ? maxNumberOfFrames : 1; if (m_frameDurations.size() > m_maxNumberOfFrames) { m_frameDurations.erase(std::begin(m_frameDurations), std::begin(m_frameDurations) + m_frameDurations.size() - m_maxNumberOfFrames); } } size_t Timer::getMaxNumberOfFrames() { return m_maxNumberOfFrames; } size_t Timer::getCurrentNumberOfFrames() const { boost::shared_lock lock(m_sharedMutex); return m_frameDurations.size(); } size_t Timer::getNumberOfClockFails() const { return m_clockFails; } Timer::TimerTimePoint Timer::now() { boost::system::error_code ec; TimerTimePoint currentTime = m_clock.now(ec); if (ec.value() != 0) { ++ m_clockFails; } return currentTime; } double Timer::getMaxFramePeriod() const { boost::shared_lock lock(m_sharedMutex); SURGSIM_ASSERT(m_frameDurations.size() > 0) << "Attempted to access the maximum frame period for a Timer with no frames."; return std::max_element(m_frameDurations.cbegin(), m_frameDurations.cend())->count(); } double Timer::getMinFramePeriod() const { boost::shared_lock lock(m_sharedMutex); SURGSIM_ASSERT(m_frameDurations.size() > 0) << "Attempted to access the maximum frame period for a Timer with no frames."; return std::min_element(m_frameDurations.cbegin(), m_frameDurations.cend())->count(); } bool Timer::isBufferFull() const { boost::shared_lock lock(m_sharedMutex); return (m_frameDurations.size() == m_maxNumberOfFrames); } }; // namespace Framework }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Framework/Timer.h000066400000000000000000000103001277777236100206650ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_FRAMEWORK_TIMER_H #define SURGSIM_FRAMEWORK_TIMER_H #include #include #include namespace SurgSim { namespace Framework { /// Timer class, measures execution times. Multiple times can be stored as "frames" to provide an average rate or /// period. class Timer { public: /// Instantiate a TimerClock and start a timing run. Timer(); /// Begin a timing run by clearing out any stored frames and beginning a frame. void start(); /// Begin a frame (storing the current time). void beginFrame(); /// End this frame by storing the duration since the current frame was begun. /// \note \c endFrame does not start a new frame, call \c beginFrame to do so. /// \sa Timer::markFrame void endFrame(); /// End the current frame and begin a new frame. void markFrame(); /// Return the sum of the durations over all the stored frames. /// \return Sum of stored frame durations in seconds. double getCumulativeTime() const; /// Return the average duration across all stored frames. Asserts if there are no frames. /// \return Average period in seconds. double getAverageFramePeriod() const; /// Return the inverse of the average duration across all stored frames. Asserts if there are no frames. /// \return The average frequency in Hz. double getAverageFrameRate() const; /// Return the duration of the most-recent frame (time between last \c endFrame and the previous \c start, /// \c beginFrame, or \c endFrame ). Asserts if there are no frames. /// \return Most-recent period in seconds. double getLastFramePeriod() const; /// Return the inverse of the duration of the most-recent frame. Asserts if there are no frames. /// \return Most-recent frequency in Hz. double getLastFrameRate() const; /// Set the maximum number of frames to store. void setMaxNumberOfFrames(size_t numberOfFrames); /// \return The maximum number of frames to store. size_t getMaxNumberOfFrames(); /// \return Number of frames currently stored (not the maximum number of frames). size_t getCurrentNumberOfFrames() const; /// \return Number of times the clock returned an error code since \c start. If this is non-zero, the frame /// durations may be incorrect. size_t getNumberOfClockFails() const; /// \return The maximum duration across all the stored frames. Asserts if there are no frames. double getMaxFramePeriod() const; /// \return The minimum duration across all the stored frames. Asserts if there are no frames. double getMinFramePeriod() const; /// \return true if the frame buffer is full. bool isBufferFull() const; private: /// The Clock used by the Timer class. typedef boost::chrono::steady_clock TimerClock; /// Durations used by the Timer class. typedef boost::chrono::duration TimerDuration; /// Time points used by the Timer class. typedef boost::chrono::time_point TimerTimePoint; /// Get the current time. Checks for any error code from the clock. /// \return Current time. TimerTimePoint now(); /// The clock used to get the time. static const TimerClock m_clock; /// The time at last \c start, \c beginFrame, or \c markFrame. TimerTimePoint m_lastTime; /// Maximum number of frames to store. size_t m_maxNumberOfFrames; /// Durations of the frames, i.e., the "stored frames". std::deque m_frameDurations; /// Mutex to access the data structure m_frameDurations safely mutable boost::shared_mutex m_sharedMutex; /// Number of clock errors since last \c start. size_t m_clockFails; }; } // Framework } // SurgSim #endif opensurgsim-0.7.0/SurgSim/Framework/TransferPropertiesBehavior.cpp000066400000000000000000000072431277777236100254750ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Framework/TransferPropertiesBehavior.h" #include #include namespace SurgSim { namespace Framework { TransferPropertiesBehavior::TransferPropertiesBehavior(const std::string& name) : SurgSim::Framework::Behavior(name), m_targetManager(MANAGER_TYPE_BEHAVIOR) { } TransferPropertiesBehavior::~TransferPropertiesBehavior() { } void TransferPropertiesBehavior::update(double dt) { { boost::lock_guard lock(m_incomingMutex); m_connections.insert(m_connections.end(), m_incomingConnections.begin(), m_incomingConnections.end()); m_incomingConnections.clear(); } for (auto it = std::begin(m_connections); it != std::end(m_connections); ++it) { if (!it->first.accessible.expired() && !it->second.accessible.expired()) { auto source = it->first.accessible.lock(); auto target = it->second.accessible.lock(); target->setValue(it->second.name, source->getValue(it->first.name)); } } } bool TransferPropertiesBehavior::connect( std::shared_ptr sourceAccessible, const std::string& sourcePropertyName, std::shared_ptr targetAccessible, const std::string& targetPropertyName) { SURGSIM_ASSERT(sourceAccessible != nullptr && targetAccessible != nullptr) << "Accessibles cannot be nullptr"; Property source = {sourceAccessible, sourcePropertyName}; Property target = {targetAccessible, targetPropertyName}; return connect(source, target); } bool TransferPropertiesBehavior::connect(const Property& source, const Property& target) { // Early outs if (source.accessible.expired() || target.accessible.expired()) { return false; } auto sharedSource = source.accessible.lock(); auto sharedTarget = target.accessible.lock(); SURGSIM_ASSERT(sharedSource != sharedTarget || source.name != target.name) << "Cannot Read/Write with exactly the same property and object."; SURGSIM_ASSERT(sharedSource->isReadable(source.name)) << "Source does not have a readable property called <" << source.name << ">."; SURGSIM_ASSERT(sharedTarget->isWriteable(target.name)) << "Target does not have a writeable property called <" << target.name << ">."; // \note HS-2013-nov-26 should also that the type of the output can be converted to the input auto entry = std::make_pair(source, target); boost::lock_guard lock(m_incomingMutex); m_incomingConnections.push_back(std::move(entry)); return true; } bool TransferPropertiesBehavior::doInitialize() { return true; } bool TransferPropertiesBehavior::doWakeUp() { // Do an update step to initialize all the values update(0.0); return true; } void TransferPropertiesBehavior::setTargetManagerType(int managerType) { SURGSIM_ASSERT(managerType >= 0 && managerType < MANAGER_TYPE_COUNT) << "Invalid manager type."; SURGSIM_ASSERT(!isInitialized()) << "Cannot change the manager type after initialization."; m_targetManager = managerType; } int TransferPropertiesBehavior::getTargetManagerType() const { return m_targetManager; } } } opensurgsim-0.7.0/SurgSim/Framework/TransferPropertiesBehavior.h000066400000000000000000000067721277777236100251500ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_FRAMEWORK_TRANSFERPROPERTIESBEHAVIOR_H #define SURGSIM_FRAMEWORK_TRANSFERPROPERTIESBEHAVIOR_H #include #include #include "SurgSim/Framework/Accessible.h" #include "SurgSim/Framework/Behavior.h" namespace SurgSim { namespace Framework { /// Behavior to copy properties between instances of Accessible /// \note HS-2013-dec-12 does not support removal of connections yes class TransferPropertiesBehavior : public SurgSim::Framework::Behavior { public: /// Constructor. /// \param name The name of the behavior. explicit TransferPropertiesBehavior(const std::string& name); /// Destructor. virtual ~TransferPropertiesBehavior(); /// Connect two properties of two instances of accessible, once connected the value of the property /// will be copied from source to target at every update call. /// \pre pointers cannot be nullptr, properties need to exist and the property /// at the source needs to be readable and the property at the target needs /// to be writeable /// \param sourceAccessible Source Accessible instance. /// \param sourcePropertyName The name of the source property. /// \param tagetAccessible Target Accessible instance. /// \param targetPropertyName The name of the target property. /// \return true if the connection was created bool connect( std::shared_ptr sourceAccessible, const std::string& sourcePropertyName, std::shared_ptr tagetAccessible, const std::string& targetPropertyName); /// Connect two properties of two instances of accessible, once connected the value of the property /// will be copied from source to target at every update call. /// \pre pointers cannot be nullptr, properties need to exist and the property /// at the source needs to be readable and the property at the target needs /// to be writeable /// \param source Source property. /// \param target Target property. /// \return true if the connection was created bool connect(const Property& source, const Property& target); /// Sets the type of manager that this behavior should use, this cannot be done after /// initialization has occurred. /// \param managerType Type of manager for this behavior void setTargetManagerType(int managerType); int getTargetManagerType() const override; void update(double dt) override; private: ///@{ /// Overridden from Behavior bool doInitialize() override; bool doWakeUp() override; ///@} /// Local typedefs typedef std::pair Connection; /// List of connections in this object std::vector m_connections; /// Lock for adding new connections boost::mutex m_incomingMutex; /// Queue for adding new connections std::vector m_incomingConnections; /// The manager type that will handle this behavior int m_targetManager; }; } } #endif opensurgsim-0.7.0/SurgSim/Framework/UnitTests/000077500000000000000000000000001277777236100214045ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Framework/UnitTests/AccessibleTests.cpp000066400000000000000000000264271277777236100252030ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Framework/Accessible.h" #include #include #include #include #include "SurgSim/Math/Matrix.h" enum TestEnum : SURGSIM_ENUM_TYPE; SURGSIM_SERIALIZABLE_ENUM(TestEnum, (TEST_ENUM_A)(TEST_ENUM_B)); namespace { class TestClass : public SurgSim::Framework::Accessible { public: TestClass() : normal(100), readWrite(100.0), readOnly(100), sharedPtr(std::make_shared(4)), serializableEnum(TEST_ENUM_A), overloadedValue(200.0), virtualProperty(300), privateProperty(100) { setGetter("normal", std::bind(&TestClass::getNormal, this)); setSetter("normal", std::bind(&TestClass::setNormal, this, std::bind(SurgSim::Framework::convert, std::placeholders::_1))); SURGSIM_ADD_RW_PROPERTY(TestClass, double, readWrite, getReadWrite, setReadWrite); SURGSIM_ADD_RW_PROPERTY(TestClass, std::shared_ptr, sharedPtr, getSharedPtr, setSharedPtr); SURGSIM_ADD_RO_PROPERTY(TestClass, int, readOnly, getReadOnly); SURGSIM_ADD_RW_PROPERTY(TestClass, double, privateProperty, getPrivateProperty, setPrivateProperty); SURGSIM_ADD_SERIALIZABLE_PROPERTY(TestClass, float, serializableProperty, getSerializableProperty, setSerializableProperty); SURGSIM_ADD_SERIALIZABLE_PROPERTY(TestClass, TestEnum, serializableEnum, getSerializableEnum, setSerializableEnum); SURGSIM_ADD_RO_PROPERTY(TestClass, int, virtualProperty, getVirtualProperty); SURGSIM_ADD_RO_PROPERTY(TestClass, int, overriddenProperty, getReadWrite); } int normal; double readWrite; int readOnly; std::shared_ptr sharedPtr; float serializableProperty; TestEnum serializableEnum; double overloadedValue; int virtualProperty; int getNormal() { return normal; } void setNormal(int val) { normal = val; } double getReadWrite() { return readWrite; } void setReadWrite(double val) { readWrite = val; } std::shared_ptr getSharedPtr() { return sharedPtr; } void setSharedPtr(std::shared_ptr val) { sharedPtr = val; } int getReadOnly() { return readOnly; } double getPrivateProperty() const { return privateProperty; } void setPrivateProperty(double val) { privateProperty = val; } float getSerializableProperty() const { return serializableProperty; } void setSerializableProperty(float val) { serializableProperty = val; } TestEnum getSerializableEnum() const { return serializableEnum; } void setSerializableEnum(TestEnum val) { serializableEnum = val; } void getOverloadedFunction(double* x) const {} double getOverloadedFunction() const { return overloadedValue; } void setOverloadedFunction(double x, double y) {} void setOverloadedFunction(const double& x) { overloadedValue = x; } virtual int getVirtualProperty() { return virtualProperty; } private: double privateProperty; }; class DerivedTestClass : public TestClass { public: DerivedTestClass() : TestClass(), otherValue(400) { // Override the accessor from the base class by changing the entry in the function table SURGSIM_ADD_RO_PROPERTY(DerivedTestClass, int, overriddenProperty, getOtherValue); } int otherValue; int getOtherValue() { return otherValue; } // Overrides the accessor, this tests if the virtual function resolution works on the function pointer int getVirtualProperty() override { return otherValue; } }; } namespace SurgSim { namespace Framework { TEST(AccessibleTest, GetterTest) { TestClass t; t.normal = 5; int receiver = -1; EXPECT_EQ(5, boost::any_cast(t.getValue("normal"))); EXPECT_EQ(5, t.getValue("normal")); EXPECT_TRUE(t.getValue("normal", &receiver)); EXPECT_EQ(5, receiver); /// Response to fetching value that does not exist EXPECT_ANY_THROW(t.getValue("xxx")); EXPECT_ANY_THROW(t.getValue("xxx")); receiver = -1; EXPECT_FALSE(t.getValue("xxx", &receiver)); EXPECT_EQ(-1, receiver); /// Response to trying to fetch an type that can't be converted std::string string; EXPECT_ANY_THROW(t.getValue("normal")); EXPECT_FALSE(t.getValue("normal", &string)); } TEST(AccessibleTest, SetterTest) { TestClass t; t.normal = 0; t.setValue("normal", 4); EXPECT_EQ(4, t.getNormal()); EXPECT_ANY_THROW(t.setValue("xxxx", 666.66)); } TEST(AccessibleTest, TransferTest) { TestClass a, b; a.normal = 100; b.normal = 0; b.setValue("normal", a.getValue("normal")); EXPECT_EQ(a.normal, b.normal); } TEST(AccessibleTest, ReadWriteMacroTest) { TestClass a; a.readWrite = 100.0; EXPECT_EQ(a.readWrite, boost::any_cast(a.getValue("readWrite"))); a.setValue("readWrite", 50.0); EXPECT_EQ(50.0, a.readWrite); } TEST(AccessibleTest, ReadOnlyMacroTest) { TestClass a; a.readOnly = 200; EXPECT_EQ(a.readOnly, boost::any_cast(a.getValue("readOnly"))); EXPECT_ANY_THROW(a.setValue("readOnly", 100)); } TEST(AccessibleTest, TemplateFunction) { TestClass a; a.normal = 10; a.readWrite = 100.0; // Parameter Deduction int aDotNormal = 123; double aDotReadWrite = 456; EXPECT_TRUE(a.getValue("normal", &aDotNormal)); EXPECT_EQ(10, aDotNormal); EXPECT_TRUE(a.getValue("readWrite", &aDotReadWrite)); EXPECT_EQ(100.0, aDotReadWrite); EXPECT_FALSE(a.getValue("xxxx", &aDotNormal)); double* noValue = nullptr; EXPECT_FALSE(a.getValue("normal", noValue)); } TEST(AccessibleTest, Privates) { TestClass a; EXPECT_EQ(a.getPrivateProperty(), boost::any_cast(a.getValue("privateProperty"))); EXPECT_NO_THROW(a.setValue("privateProperty", 123.456)); EXPECT_NEAR(123.456, boost::any_cast(a.getValue("privateProperty")), 1e10); EXPECT_NEAR(a.getPrivateProperty(), boost::any_cast(a.getValue("privateProperty")), 1e10); } TEST(AccessibleTest, SharedPointer) { TestClass a; std::shared_ptr x = std::make_shared(5); std::shared_ptr y; y = boost::any_cast>(a.getValue("sharedPtr")); EXPECT_EQ(4, *y); a.setValue("sharedPtr", x); y = boost::any_cast>(a.getValue("sharedPtr")); EXPECT_EQ(5, *y); } // We want to check whether we can forward a setter and a getter from one class to the other, // i.e. a.setValue("Forwarded") should actually change a specific value in b via Properties TEST(AccessibleTest, Forwarding) { TestClass a; TestClass b; b.normal = 543; ASSERT_NO_THROW(a.forwardProperty("forwarded", b, "normal")); EXPECT_EQ(543, a.getValue("forwarded")); ASSERT_NO_THROW(a.setValue("forwarded", 345)); EXPECT_EQ(345, b.normal); } TEST(AccessibleTest, RemoveAccessors) { TestClass a; EXPECT_NO_THROW(a.getValue("readWrite")); EXPECT_NO_THROW(a.setValue("readWrite", 2.0)); a.removeAccessors("readWrite"); EXPECT_ANY_THROW(a.getValue("readWrite")); EXPECT_ANY_THROW(a.setValue("readWrite", 2.0)); } TEST(AccessibleTests, VirtualFunctionTest) { std::shared_ptr derived = std::make_shared(); std::shared_ptr base = std::dynamic_pointer_cast(derived); EXPECT_EQ(derived->otherValue, derived->getValue("virtualProperty")); EXPECT_EQ(derived->otherValue, derived->getValue("overriddenProperty")); EXPECT_EQ(derived->otherValue, base->getValue("virtualProperty")); EXPECT_EQ(derived->otherValue, base->getValue("overriddenProperty")); } TEST(AccessibleTest, ConvertDoubleToFloat) { // Values don't matter only care for them to be filled SurgSim::Math::Matrix44d sourceDouble; sourceDouble << 1.0 / 2.0, 1.0 / 3.0, 1.0 / 4.0, 1.0 / 5.0, 1.0 / 6.0, 1.0 / 7.0, 1.0 / 8.0, 1.0 / 9.0, 1.0 / 10.0, 1.0 / 11.0, 1.0 / 12.0, 1.0 / 13.0, 1.0 / 14.0, 1.0 / 15.0, 1.0 / 16.0, 1.0 / 17.0; SurgSim::Math::Matrix44f sourceFloat; sourceFloat << 1.0f / 2.0f, 1.0f / 3.0f, 1.0f / 4.0f, 1.0f / 5.0f, 1.0f / 6.0f, 1.0f / 7.0f, 1.0f / 8.0f, 1.0f / 9.0f, 1.0f / 10.0f, 1.0f / 11.0f, 1.0f / 12.0f, 1.0f / 13.0f, 1.0f / 14.0f, 1.0f / 15.0f, 1.0f / 16.0f, 1.0f / 17.0f; SurgSim::Math::Matrix44f target; ASSERT_NO_THROW({convert(sourceDouble);}); target = convert(sourceDouble); SurgSim::Math::Matrix44f doubleToFloat = sourceDouble.cast(); EXPECT_TRUE(target.isApprox(doubleToFloat)); ASSERT_NO_THROW({convert(sourceFloat);}); target = convert(sourceFloat); EXPECT_TRUE(target.isApprox(sourceFloat)); } TEST(AccessibleTest, ConvertConstCharToString) { std::string source("Test Value"); { std::string target; ASSERT_NO_THROW({target = convert(source);}); EXPECT_EQ(source, target); } { std::string target; ASSERT_NO_THROW({target = convert(source.c_str());}); EXPECT_EQ(source, target); } float notString; ASSERT_THROW({convert(notString);}, boost::bad_any_cast); } TEST(AccessibleTests, Serialize) { TestClass a; a.serializableProperty = 100; a.serializableEnum = TEST_ENUM_B; YAML::Node node = a.encode(); EXPECT_TRUE(node.IsMap()); EXPECT_EQ(100, node["serializableProperty"].as()); EXPECT_EQ(TEST_ENUM_B, node["serializableEnum"].as()); EXPECT_EQ("TEST_ENUM_B", node["serializableEnum"].as()); node["serializableProperty"] = 50; node["serializableEnum"] = "TEST_ENUM_A"; EXPECT_NO_THROW(a.decode(node)); EXPECT_EQ(50, a.serializableProperty); EXPECT_EQ(TEST_ENUM_A, a.serializableEnum); node["serializableEnum"] = "INVALID_ENUM_STRING"; EXPECT_THROW(a.decode(node), SurgSim::Framework::AssertionFailure); } class MultipleValuesClass : public Accessible { public: MultipleValuesClass() : a("invalid"), b("invalid"), c("invalid") { SURGSIM_ADD_SERIALIZABLE_PROPERTY(MultipleValuesClass, std::string, a, getA, setA); SURGSIM_ADD_SERIALIZABLE_PROPERTY(MultipleValuesClass, std::string, b, getB, setB); SURGSIM_ADD_SERIALIZABLE_PROPERTY(MultipleValuesClass, std::string, c, getC, setC); } std::string a; std::string getA() const { return a; } void setA(const std::string& val) { a = val; } std::string b; std::string getB() const { return b; } void setB(const std::string& val) { b = val; } std::string c; std::string getC() const { return c; } void setC(const std::string& val) { c = val; } }; TEST(AccessibleTests, MultipleValues) { YAML::Node newValues; newValues["xxx"] = "invalid"; newValues["a"] = "a"; newValues["b"] = "b"; MultipleValuesClass test; test.decode(newValues); EXPECT_EQ(test.a, "a"); EXPECT_EQ(test.b, "b"); EXPECT_EQ(test.c, "invalid"); YAML::Node encodedValues = test.encode(); EXPECT_EQ("a", encodedValues["a"].as()); EXPECT_EQ("b", encodedValues["b"].as()); EXPECT_EQ("invalid", encodedValues["c"].as()); } }; // namespace Framework }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Framework/UnitTests/AccessibleTypeTests.cpp000066400000000000000000000151231277777236100260340ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Framework/Accessible.h" #include "SurgSim/Math/MathConvert.h" #include "SurgSim/Math/Matrix.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Vector.h" // We need ALL of the math types using namespace SurgSim::Math; //NOLINT namespace SurgSim { namespace Framework { template class BaseTest : public testing::Test { public: typedef T Scalar; }; template class ScalarTest : public BaseTest { }; typedef ::testing::Types ScalarTypes; TYPED_TEST_CASE(ScalarTest, ScalarTypes); template class VectorTest: public BaseTest { public: typedef T Vector; }; typedef ::testing::Types VectorTypes; TYPED_TEST_CASE(VectorTest, VectorTypes); template class QuaternionTest : public BaseTest { public: typedef T Quaternion; }; typedef ::testing::Types QuaternionTypes; TYPED_TEST_CASE(QuaternionTest, QuaternionTypes); template class RigidTransformTest : public BaseTest { public: typedef T RigidTransform; }; typedef ::testing::Types RigidTransformTypes; TYPED_TEST_CASE(RigidTransformTest, RigidTransformTypes); template class Testable : public Accessible { public: Testable() { setAccessors("property", std::bind(&Testable::getProperty, this), std::bind(&Testable::setProperty, this, std::bind(SurgSim::Framework::convert, std::placeholders::_1))); setSerializable("property", std::bind(&YAML::convert::encode, std::bind(&Testable::getProperty, this)), std::bind(&Testable::setProperty, this, std::bind(&YAML::Node::as, std::placeholders::_1))); } T property; void setProperty(const T& value) { property = value; } T getProperty() { return property; } }; template std::pair testProperty(const T& a, const T& b) { Testable test; std::pair result; test.property = a; test.setValue("property", b); result.first = test.property; test.getValue("property", &result.second); return result; } template std::pair testEncodeDecode(const T& a, const T& b) { Testable test; std::pair result; test.property = a; YAML::Node node; node["property"] = b; test.decode(node); result.first = test.property; YAML::Node resultNode = test.encode(); result.second = resultNode["property"].as(); return result; } TYPED_TEST(ScalarTest, Accessible) { typedef typename TestFixture::Scalar Scalar; Scalar initialValue = static_cast(1); Scalar newValue = static_cast(2); std::pair result = testProperty(initialValue, newValue); EXPECT_NEAR(static_cast(newValue), static_cast(result.first), 1e-6); EXPECT_NEAR(static_cast(newValue), static_cast(result.second), 1e-6); result = testEncodeDecode(initialValue, newValue); EXPECT_NEAR(static_cast(newValue), static_cast(result.first), 1e-6); EXPECT_NEAR(static_cast(newValue), static_cast(result.second), 1e-6); } TYPED_TEST(VectorTest, Accessible) { typedef typename TestFixture::Scalar Scalar; typedef typename TestFixture::Vector Vector; Vector initialValue; Vector newValue; for (int i = 0; i < initialValue.size(); ++i) { initialValue[i] = static_cast(i); newValue[i] = static_cast(i * 2); } std::pair result = testProperty(initialValue, newValue); EXPECT_TRUE(newValue.isApprox(result.first)); EXPECT_TRUE(newValue.isApprox(result.second)); result = testEncodeDecode(initialValue, newValue); EXPECT_TRUE(newValue.isApprox(result.first)); EXPECT_TRUE(newValue.isApprox(result.second)); } TYPED_TEST(QuaternionTest, Accessible) { typedef typename TestFixture::Scalar Scalar; typedef typename TestFixture::Quaternion Quaternion; Quaternion initialValue(static_cast(1.0), static_cast(2.0), static_cast(3.0), static_cast(4.0)); Quaternion newValue(static_cast(5.0), static_cast(6.0), static_cast(7.0), static_cast(8.0)); initialValue.normalize(); newValue.normalize(); std::pair result = testProperty(initialValue, newValue); EXPECT_TRUE(newValue.isApprox(result.first)); EXPECT_TRUE(newValue.isApprox(result.second)); result = testEncodeDecode(initialValue, newValue); EXPECT_TRUE(newValue.isApprox(result.first)); EXPECT_TRUE(newValue.isApprox(result.second)); } TYPED_TEST(RigidTransformTest, Accessible) { typedef typename TestFixture::Scalar Scalar; typedef typename TestFixture::RigidTransform RigidTransform; typedef Eigen::Quaternion Quaternion; typedef Eigen::Matrix Vector3; typename RigidTransform::MatrixType initialMatrix; typename RigidTransform::MatrixType newMatrix; RigidTransform initialValue; { Quaternion quaternion(1.0, 2.0, 3.0, 4.0); quaternion.normalize(); Vector3 translation(1.0, 2.0, 3.0); initialValue = SurgSim::Math::makeRigidTransform(quaternion, translation); } RigidTransform newValue; { Quaternion quaternion(4.0, 3.0, 2.0, 1.0); quaternion.normalize(); Vector3 translation(3.0, 2.0, 1.0); newValue = SurgSim::Math::makeRigidTransform(quaternion, translation); } std::pair result = testProperty(initialValue, newValue); EXPECT_TRUE(newValue.isApprox(result.first)); EXPECT_TRUE(newValue.isApprox(result.second)); result = testEncodeDecode(initialValue, newValue); EXPECT_TRUE(newValue.isApprox(result.first)); EXPECT_TRUE(newValue.isApprox(result.second)); } } } opensurgsim-0.7.0/SurgSim/Framework/UnitTests/ApplicationDataTest.cpp000066400000000000000000000171761277777236100260210ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include #include "SurgSim/Framework/ApplicationData.h" #include using SurgSim::Framework::ApplicationData; using boost::filesystem::path; namespace std { ::std::ostream& operator<<(::std::ostream& os, const vector& content) { os << "("; for (size_t i = 0; i < content.size(); ++i) { if (i > 0) { os << ", "; } os << "\"" << content[i] << "\""; } os << ")"; return os; } } ::testing::AssertionResult isContained(const std::string& expected, const std::vector& argument) { if (std::find(argument.cbegin(), argument.cend(), expected) != argument.cend()) { return ::testing::AssertionSuccess(); } else { return ::testing::AssertionFailure() << "\"" << expected << "\"" << " not contained in " << argument; } } ::testing::AssertionResult fileIsFoundCorrectly( const ApplicationData& data, const std::string& searchFileName, const std::string& expectedDirectoryName) { // First file should be there and in directory1 std::string fileName = data.findFile(searchFileName); boost::filesystem::path filePath(fileName); if (! filePath.is_absolute()) { return ::testing::AssertionFailure() << "Result not absolute path <" << fileName << "> expected " << boost::filesystem::canonical(filePath); } if (! boost::filesystem::exists(filePath)) { return ::testing::AssertionFailure() << "Result does not exist <" << fileName << ">"; } if (fileName != filePath.make_preferred().string()) { return ::testing::AssertionFailure() << "Result not system format path " << fileName << " expected " << filePath.make_preferred().string(); } if (boost::filesystem::path(searchFileName).filename() != filePath.filename()) { return ::testing::AssertionFailure() << "Expected " << searchFileName << " Result " << filePath.filename(); } if (fileName.find(expectedDirectoryName) == std::string::npos) { return ::testing::AssertionFailure() << "Expected the file to be in subdirectory " << expectedDirectoryName << " but is not " << fileName; } return ::testing::AssertionSuccess(); } TEST(ApplicationDataTest, InitTest) { std::vector paths; ASSERT_NO_THROW({ApplicationData appData(paths);}); } TEST(ApplicationDataTest, OnlyValidPaths) { // Expects to find "Data" correctly ... ASSERT_TRUE(boost::filesystem::exists("Data")) << "WARNING: Data directory could not be found, possibly you are running the " "test from the wrong directory, some or other following tests will fail. " << std::endl << "FIX THIS TEST FIRST!"; std::vector paths; paths.push_back("Data"); paths.push_back("Data"); paths.push_back("invalid"); paths.push_back("invalid"); paths.push_back("Data/ApplicationDataTest/Directory1"); // Path with backslashes should get ignored paths.push_back("Data\\ApplicationDataTest\\Directory2"); ApplicationData data(paths); ASSERT_EQ(2u, data.getPaths().size()); } TEST(ApplicationDataTest, GetPathsTest) { ASSERT_TRUE(boost::filesystem::exists("Data")); std::vector paths; std::string path1 = "Data/ApplicationDataTest/Directory1"; std::string path2 = "Data/ApplicationDataTest/Directory2"; paths.push_back(path1); paths.push_back(path2); ApplicationData data(paths); ASSERT_EQ(2u, data.getPaths().size()); paths = data.getPaths(); EXPECT_TRUE(boost::filesystem::equivalent( path(path1), path(paths[0]))) << path1 << " not considered equivalent to " << paths[0]; EXPECT_TRUE(boost::filesystem::equivalent( path(path2), path(paths[1]))) << path2 << " not considered equivalent to " << paths[1]; } TEST(ApplicationDataTest, FindFileTest) { ASSERT_TRUE(boost::filesystem::exists("Data")); std::vector paths; paths.push_back("Data/ApplicationDataTest/Directory1"); paths.push_back("Data/ApplicationDataTest/Directory2"); ApplicationData data(paths); boost::filesystem::path filePath; ASSERT_EQ(2u, data.getPaths().size()); EXPECT_TRUE(fileIsFoundCorrectly(data, "uniqueFile1.txt", "Directory1")); EXPECT_TRUE(fileIsFoundCorrectly(data, "uniqueFile2.txt", "Directory2")); EXPECT_TRUE(fileIsFoundCorrectly(data, "duplicatedFile.txt", "Directory1")); EXPECT_EQ("", data.findFile("missingFile.txt")); EXPECT_EQ("", data.findFile("")); } TEST(ApplicationDataTest, TryFindFileTest) { ASSERT_TRUE(boost::filesystem::exists("Data")); std::vector paths; paths.push_back("Data/ApplicationDataTest/Directory1"); paths.push_back("Data/ApplicationDataTest/Directory2"); ApplicationData data(paths); std::string fileName; boost::filesystem::path filePath; EXPECT_TRUE(data.tryFindFile("uniqueFile1.txt", &fileName)); EXPECT_EQ(data.findFile("uniqueFile1.txt"), fileName); EXPECT_TRUE(data.tryFindFile("duplicatedFile.txt", &fileName)); EXPECT_EQ(data.findFile("duplicatedFile.txt"), fileName); fileName = "Should Not Change"; EXPECT_FALSE(data.tryFindFile("missingFile.txt", &fileName)); EXPECT_EQ("Should Not Change", fileName); } TEST(ApplicationDataTest, DirectorywithSpaceTest) { ASSERT_TRUE(boost::filesystem::exists("Data")); std::string path = "Data/ApplicationDataTest/Test Directory/uniqueFile.txt"; ApplicationData data(path); EXPECT_TRUE(fileIsFoundCorrectly(data, "uniqueFile.txt", "Test Directory")); } // We don't accept anything that contains backslashes ... TEST(ApplicationDataTest, MessedUpSlashesTest) { ASSERT_TRUE(boost::filesystem::exists("Data")); std::vector paths; paths.push_back("Data\\ApplicationDataTest/Directory1"); paths.push_back("Data/ApplicationDataTest\\Directory2"); ApplicationData data(paths); ASSERT_EQ(0u, data.getPaths().size()); } TEST(ApplicationDataTest, DeepPathTest) { ASSERT_TRUE(boost::filesystem::exists("Data")); std::vector paths; paths.push_back("Data/ApplicationDataTest"); ApplicationData data(paths); EXPECT_TRUE(fileIsFoundCorrectly(data, "Directory1/uniqueFile1.txt", "Directory1")); EXPECT_TRUE(fileIsFoundCorrectly(data, "Directory2/uniqueFile2.txt", "Directory2")); } TEST(ApplicationDataTest, InitFromFile) { ASSERT_TRUE(boost::filesystem::exists("Data")); ASSERT_ANY_THROW({ApplicationData data("nonexistingFile.xxx");}); ASSERT_NO_THROW({ApplicationData data("Data/ApplicationDataTest/testFile1.txt");}); ApplicationData data("Data/ApplicationDataTest/testFile1.txt"); ASSERT_EQ(2u, data.getPaths().size()); EXPECT_TRUE(fileIsFoundCorrectly(data, "uniqueFile1.txt", "Directory1")); EXPECT_TRUE(fileIsFoundCorrectly(data, "uniqueFile2.txt", "Directory2")); EXPECT_TRUE(fileIsFoundCorrectly(data, "duplicatedFile.txt", "Directory1")); EXPECT_EQ("", data.findFile("missingFile.txt")); } TEST(ApplicationDataTest, IsValidFilenameTest) { ApplicationData data("Data/ApplicationDataTest/testFile1.txt"); std::string validFileName("123.txt"); std::string invalidFileName1(""); std::string invalidFileName2("\\invalid\\123.txt"); EXPECT_TRUE(data.isValidFilename(validFileName)); EXPECT_FALSE(data.isValidFilename(invalidFileName1)); EXPECT_FALSE(data.isValidFilename(invalidFileName2)); } opensurgsim-0.7.0/SurgSim/Framework/UnitTests/AssertTest.cpp000066400000000000000000000155431277777236100242210ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for SURGSIM_ASSERT() and SURGSIM_FAILURE(). #include #include "SurgSim/Framework/Assert.h" class MockOutput : public SurgSim::Framework::LogOutput { public: MockOutput() { } ~MockOutput() { } bool writeMessage(const std::string& message) { logMessage = message; return true; } void reset() { logMessage = ""; } std::string logMessage; }; class AssertTest : public ::testing::Test { public: void SetUp() { logOutput = std::make_shared(); testLogger = SurgSim::Framework::Logger::getLogger("test"); testLogger->setOutput(logOutput); // testLogger will be used for assertions in most tests, due to the definition of SURGSIM_ASSERT_LOGGER below. savedCallback = SurgSim::Framework::AssertMessage::getFailureCallback(); } void TearDown() { SurgSim::Framework::AssertMessage::setFailureCallback(savedCallback); testLogger.reset(); logOutput.reset(); } std::shared_ptr logOutput; std::shared_ptr testLogger; SurgSim::Framework::AssertMessage::DeathCallback savedCallback; }; typedef AssertTest AssertDeathTest; TEST_F(AssertTest, DefaultAssertLogger) { EXPECT_THROW(SURGSIM_ASSERT(1 == 2) << "extra information would go here", SurgSim::Framework::AssertionFailure); } #undef SURGSIM_ASSERT_LOGGER // override the default definition #define SURGSIM_ASSERT_LOGGER testLogger // defined in the test fixture, above inline bool stringContains(const std::string& string, const std::string& fragment) { return string.find(fragment) != std::string::npos; } static int numIgnoredAssertions = 0; static void ignoreAssertionKeepGoing(const std::string& message) { ++numIgnoredAssertions; } TEST_F(AssertTest, Assertion) { logOutput->reset(); EXPECT_THROW(SURGSIM_ASSERT(1 == 2) << "extra information would go here", SurgSim::Framework::AssertionFailure); EXPECT_TRUE(stringContains(logOutput->logMessage, "1 == 2")) << "message: '" << logOutput->logMessage << "'"; EXPECT_TRUE(stringContains(logOutput->logMessage, "AssertTest.cpp")) << "message: '" << logOutput->logMessage << "'"; EXPECT_TRUE(stringContains(logOutput->logMessage, "extra information")) << "message: '" << logOutput->logMessage << "'"; logOutput->reset(); EXPECT_NO_THROW({SURGSIM_ASSERT(3 == 3) << "extra information would go here";}); EXPECT_EQ("", logOutput->logMessage) << "message: '" << logOutput->logMessage << "'"; } TEST_F(AssertTest, Failure) { logOutput->reset(); EXPECT_THROW(SURGSIM_FAILURE() << "extra information would go here", SurgSim::Framework::AssertionFailure); EXPECT_TRUE(stringContains(logOutput->logMessage, "AssertTest.cpp")) << "message: '" << logOutput->logMessage << "'"; EXPECT_TRUE(stringContains(logOutput->logMessage, "extra information")) << "message: '" << logOutput->logMessage << "'"; } TEST_F(AssertTest, Manipulators) { logOutput->reset(); EXPECT_THROW(SURGSIM_ASSERT(1 == 2) << "aAa" << std::endl << "bBb", SurgSim::Framework::AssertionFailure); EXPECT_TRUE(stringContains(logOutput->logMessage, "aAa\nbBb") || stringContains(logOutput->logMessage, "aAa\r\n\bBb")) << "message: '" << logOutput->logMessage << "'"; logOutput->reset(); EXPECT_THROW(SURGSIM_ASSERT(1 == 2) << "[" << std::hex << std::setw(5) << std::setfill('0') << 0x1234 << "]", SurgSim::Framework::AssertionFailure); EXPECT_TRUE(stringContains(logOutput->logMessage, "[01234]")) << "message: '" << logOutput->logMessage << "'"; logOutput->reset(); // The next message should not show any evidence of previous manipulators. EXPECT_THROW(SURGSIM_ASSERT(1 == 2) << "[" << 987 << "]", SurgSim::Framework::AssertionFailure); EXPECT_TRUE(stringContains(logOutput->logMessage, "[987]")) << "message: '" << logOutput->logMessage << "'"; } TEST_F(AssertTest, ExceptionBehavior) { logOutput->reset(); SurgSim::Framework::AssertMessage::setFailureBehaviorToThrow(); EXPECT_THROW(SURGSIM_ASSERT(1 == 2) << "extra information would go here", SurgSim::Framework::AssertionFailure); EXPECT_NO_THROW({SURGSIM_ASSERT(3 == 3) << "extra information would go here";}); EXPECT_THROW(SURGSIM_FAILURE() << "extra information would go here", SurgSim::Framework::AssertionFailure); } TEST_F(AssertTest, Callback) { logOutput->reset(); typedef SurgSim::Framework::AssertMessage::DeathCallback CallbackType; const CallbackType defaultCallback = SurgSim::Framework::AssertMessage::getFailureCallback(); SurgSim::Framework::AssertMessage::setFailureBehaviorToThrow(); const CallbackType throwCallback = SurgSim::Framework::AssertMessage::getFailureCallback(); EXPECT_EQ(throwCallback, defaultCallback); SurgSim::Framework::AssertMessage::setFailureCallback(ignoreAssertionKeepGoing); EXPECT_EQ(static_cast(ignoreAssertionKeepGoing), SurgSim::Framework::AssertMessage::getFailureCallback()); numIgnoredAssertions = 0; EXPECT_NO_THROW(SURGSIM_ASSERT(1 == 2) << "extra information would go here"); EXPECT_EQ(1, numIgnoredAssertions); EXPECT_NO_THROW({SURGSIM_ASSERT(3 == 3) << "extra information would go here";}); EXPECT_EQ(1, numIgnoredAssertions); EXPECT_NO_THROW(SURGSIM_FAILURE() << "extra information would go here"); EXPECT_EQ(2, numIgnoredAssertions); SurgSim::Framework::AssertMessage::setFailureBehaviorToThrow(); EXPECT_EQ(throwCallback, SurgSim::Framework::AssertMessage::getFailureCallback()); EXPECT_THROW(SURGSIM_ASSERT(1 == 2) << "extra information would go here", SurgSim::Framework::AssertionFailure); EXPECT_EQ(2, numIgnoredAssertions); } TEST_F(AssertDeathTest, DebuggerBehaviorAssertFailed) { logOutput->reset(); SurgSim::Framework::AssertMessage::setFailureBehaviorToDeath(); // The assertion should die with no output to stdout. ASSERT_DEATH_IF_SUPPORTED({SURGSIM_ASSERT(1 == 2) << "extra information would go here";}, "^$"); } TEST_F(AssertDeathTest, DebuggerBehaviorAssertSucceded) { logOutput->reset(); SurgSim::Framework::AssertMessage::setFailureBehaviorToDeath(); EXPECT_NO_THROW({SURGSIM_ASSERT(3 == 3) << "extra information would go here";}); } TEST_F(AssertDeathTest, DebuggerBehaviorFailure) { logOutput->reset(); SurgSim::Framework::AssertMessage::setFailureBehaviorToDeath(); // The assertion should die with no output to stdout. ASSERT_DEATH_IF_SUPPORTED({SURGSIM_FAILURE() << "extra information would go here";}, "^$"); } opensurgsim-0.7.0/SurgSim/Framework/UnitTests/AssetTests.cpp000066400000000000000000000054151277777236100242170ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for SURGSIM_ASSERT() and SURGSIM_FAILURE(). #include #include #include #include "SurgSim/Framework/ApplicationData.h" #include "SurgSim/Framework/Asset.h" #include "SurgSim/Framework/Runtime.h" class MockAsset: public SurgSim::Framework::Asset { public: MockAsset() {} ~MockAsset() {} SURGSIM_CLASSNAME(MockAsset) virtual bool doLoad(const std::string& fileName) { bool result = false; std::ifstream in(fileName); if (in.is_open()) { result = true; } return result; } }; namespace SurgSim { namespace Framework { class AssetTest : public ::testing::Test { public: void SetUp() { runtime = std::make_shared("config.txt"); } std::shared_ptr runtime; }; TEST_F(AssetTest, InitTest) { EXPECT_NO_THROW(MockAsset t); MockAsset test; EXPECT_EQ("", test.getFileName()); } TEST_F(AssetTest, LoadAndFileNameTest) { MockAsset test; // HW-JULY-16, 2014 // Since Asset::load(const std::string&) simply delegates all calls to its overloading counterpart with // ApplicationData from SurgSim::Framwork::Runtime, // tests below actually test Asset::load(const std::string& fileName, const ApplicationData& data); // No need to duplicate tests. Update when those two functions diverge. // Call 'Asset::load()' with empty file name will fail. EXPECT_ANY_THROW(test.load("")); EXPECT_EQ("", test.getFileName()); // Loading nonexist file will fail, but the internal file name recorded by Asset will be updated. std::string invalidFileName("Non-exist-file"); EXPECT_ANY_THROW(test.load(invalidFileName)); EXPECT_EQ(invalidFileName, test.getFileName()); // Loading existing file should success and internal file name recorded by Asset will be updated. std::string validDummyFile("AssetTestData/DummyFile.txt"); EXPECT_NO_THROW(test.load(validDummyFile)); EXPECT_EQ(validDummyFile, test.getFileName()); // Loading same existing file again should success and internal file name will be the same. EXPECT_NO_THROW(test.load(validDummyFile)); EXPECT_EQ(validDummyFile, test.getFileName()); } }; // Framework }; // SurgSimopensurgsim-0.7.0/SurgSim/Framework/UnitTests/BarrierTest.cpp000066400000000000000000000032121277777236100243340ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Original barrier.hpp // Copyright (C) 2002-2003 // David Moore, William E. Kempf // Copyright (C) 2007-8 Anthony Williams // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #include #include "SurgSim/Framework/Barrier.h" #include "MockObjects.h" //NOLINT #include using SurgSim::Framework::Barrier; namespace { std::shared_ptr barrier; void threadSuccessFunc() { barrier->wait(true); } void threadFailureFunc() { barrier->wait(false); } } TEST(BarrierTest, BasicTest) { ASSERT_ANY_THROW({Barrier(0);}); EXPECT_NO_THROW({Barrier(2);}); } TEST(BarrierTest, SuccessTest) { barrier = std::make_shared(2); boost::thread thread(threadSuccessFunc); EXPECT_TRUE(barrier->wait(true)); } TEST(BarrierTest, FailureTest) { barrier = std::make_shared(2); boost::thread thread(threadFailureFunc); EXPECT_FALSE(barrier->wait(true)); } opensurgsim-0.7.0/SurgSim/Framework/UnitTests/BasicSceneElementTests.cpp000066400000000000000000000075731277777236100264600ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the BasicSceneElement class. #include "SurgSim/Framework/BasicSceneElement.h" #include "SurgSim/Framework/BehaviorManager.h" #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Framework/Scene.h" #include "SurgSim/Framework/UnitTests/MockObjects.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Testing/Utilities.h" #include #include using SurgSim::Framework::Behavior; using SurgSim::Math::Quaterniond; using SurgSim::Math::RigidTransform3d; using SurgSim::Math::Vector3d; using SurgSim::Math::makeRigidTransform; namespace { SURGSIM_REGISTER(SurgSim::Framework::Component, MockRepresentation, MockRepresentation); } namespace SurgSim { namespace Framework { TEST(BasicSceneElementTests, InitTest) { std::shared_ptr sceneElement = std::make_shared("test name"); EXPECT_EQ("test name", sceneElement->getName()); } TEST(BasicSceneElementTests, InitComponentTest) { std::shared_ptr sceneElement = std::make_shared( "SceneElement"); /// Scene element needs a runtime to initialize std::shared_ptr runtime = std::make_shared(); sceneElement->setRuntime(runtime); std::shared_ptr representation1 = std::make_shared("TestRepresentation1"); std::shared_ptr representation2 = std::make_shared("TestRepresentation2"); sceneElement->addComponent(representation1); sceneElement->addComponent(representation2); EXPECT_FALSE(representation1->didInit()); EXPECT_FALSE(representation1->didWakeUp()); EXPECT_FALSE(representation2->didInit()); EXPECT_FALSE(representation2->didWakeUp()); } TEST(BasicSceneElementTests, SerializationTest) { std::shared_ptr sceneElement = std::make_shared("SceneElement"); auto representation1 = std::make_shared("TestRepresentation1"); auto representation2 = std::make_shared("TestRepresentation2"); sceneElement->addComponent(representation1); sceneElement->addComponent(representation2); sceneElement->setActive(false); sceneElement->addToGroup("One"); RigidTransform3d pose(makeRigidTransform(Quaterniond(0.0, 1.0, 0.0, 0.0), Vector3d(1.0, 2.0, 3.0))); sceneElement->setPose(pose); YAML::Node node; ASSERT_NO_THROW(sceneElement->encode(false)) << "Failed to serialize a SceneElement";; ASSERT_NO_THROW(node = sceneElement->encode(true)) << "Failed to serialize a SceneElement"; EXPECT_TRUE(node.IsMap()); EXPECT_EQ("SurgSim::Framework::BasicSceneElement", node.begin()->first.as()); std::shared_ptr result; ASSERT_NO_THROW(result = node.as>()) << "Failed to restore SceneElement."; EXPECT_EQ("SceneElement", result->getName()); EXPECT_EQ(3u, result->getComponents().size()); EXPECT_TRUE(pose.isApprox(result->getPose())); EXPECT_FALSE(result->isActive()); EXPECT_TRUE(SurgSim::Testing::doesContain(result->getGroups(), "One")); } }; // namespace Blocks }; // namespace SurgSimopensurgsim-0.7.0/SurgSim/Framework/UnitTests/BasicThreadTests.cpp000066400000000000000000000176421277777236100253160ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Original barrier.hpp // Copyright (C) 2002-2003 // David Moore, William E. Kempf // Copyright (C) 2007-8 Anthony Williams // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #include #include #include "SurgSim/Framework/BasicThread.h" #include "MockObjects.h" //NOLINT namespace SurgSim { namespace Framework { TEST(BasicThreadTest, Instantiation) { MockThread m; EXPECT_FALSE(m.isInitialized()); EXPECT_FALSE(m.isRunning()); } TEST(BasicThreadTest, Running) { MockThread m(10); m.start(nullptr); m.getThread().join(); EXPECT_EQ(0, m.count); } TEST(BasicThreadTest, Stop) { MockThread m; m.start(nullptr); boost::this_thread::sleep(boost::posix_time::milliseconds(100)); EXPECT_TRUE(m.isRunning()); m.stop(); boost::this_thread::sleep(boost::posix_time::milliseconds(100)); EXPECT_TRUE(m.didBeforeStop); EXPECT_FALSE(m.isRunning()); } TEST(BasicThreadTest, StopWithoutSleep) { for (int i = 0; i < 10; ++i) { MockThread m; m.count = 1000000; m.start(nullptr); // Stopping right away should not create a race condition. m.stop(); EXPECT_TRUE(m.didBeforeStop); EXPECT_FALSE(m.isRunning()); } } TEST(BasicThreadTest, RunTimeManagement) { MockThread m; EXPECT_EQ(-1, m.count); std::shared_ptr barrier = std::make_shared(2); EXPECT_FALSE(m.didInitialize); EXPECT_FALSE(m.didStartUp); EXPECT_FALSE(m.isRunning()); m.start(barrier); boost::this_thread::sleep(boost::posix_time::milliseconds(100)); EXPECT_TRUE(m.isRunning()); EXPECT_TRUE(m.didInitialize); EXPECT_FALSE(m.didStartUp); barrier->wait(true); boost::this_thread::sleep(boost::posix_time::milliseconds(100)); EXPECT_TRUE(m.didInitialize); EXPECT_TRUE(m.didStartUp); barrier->wait(true); boost::this_thread::sleep(boost::posix_time::milliseconds(100)); m.stop(); } TEST(BasicThreadTest, DestructStoppedThread) { std::unique_ptr m; m.reset(new MockThread()); m->start(nullptr); m->stop(); EXPECT_NO_THROW(m.reset()); } TEST(BasicThreadTest, SynchronousThread) { MockThread m(10); EXPECT_EQ(10, m.count); std::shared_ptr barrier = std::make_shared(2); EXPECT_FALSE(m.didInitialize); EXPECT_FALSE(m.didStartUp); EXPECT_FALSE(m.isRunning()); EXPECT_FALSE(m.isSynchronous()); m.start(barrier, true); // Run through the initialization barrier->wait(true); barrier->wait(true); barrier->wait(true); EXPECT_TRUE(m.isRunning()); EXPECT_TRUE(m.isSynchronous()); boost::this_thread::sleep(boost::posix_time::milliseconds(100)); // It's running but waiting for a new wait call EXPECT_EQ(9, m.count); barrier->wait(true); boost::this_thread::sleep(boost::posix_time::milliseconds(100)); EXPECT_EQ(8, m.count); barrier->wait(true); barrier->wait(false); boost::this_thread::sleep(boost::posix_time::milliseconds(100)); m.stop(); } TEST(BasicThreadTest, PauseResumeUpdateTest) { MockThread m(100000000); int previousCount = m.count; std::shared_ptr barrier = std::make_shared(2); EXPECT_EQ(100000000, m.count); EXPECT_FALSE(m.didInitialize); EXPECT_FALSE(m.didStartUp); EXPECT_FALSE(m.isRunning()); EXPECT_FALSE(m.isSynchronous()); EXPECT_FALSE(m.isIdle()); m.start(barrier, true); // Run through the initialization barrier->wait(true); barrier->wait(true); barrier->wait(true); EXPECT_FALSE(m.isIdle()); EXPECT_TRUE(m.isRunning()); EXPECT_TRUE(m.isSynchronous()); for (int i = 0; i < 10; i++) { barrier->wait(true); } boost::this_thread::sleep(boost::posix_time::milliseconds(100)); EXPECT_EQ(m.count, previousCount - 11); m.setIdle(true); EXPECT_TRUE(m.isIdle()); EXPECT_TRUE(m.isRunning()); barrier->wait(true); previousCount = m.count; for (int i = 0; i < 10; i++) { barrier->wait(true); } EXPECT_EQ(previousCount, m.count); boost::this_thread::sleep(boost::posix_time::milliseconds(100)); m.setIdle(false); EXPECT_FALSE(m.isIdle()); EXPECT_TRUE(m.isRunning()); for (int i = 0; i < 10; i++) { barrier->wait(true); } boost::this_thread::sleep(boost::posix_time::milliseconds(100)); EXPECT_EQ(m.count, previousCount - 10); barrier->wait(false); boost::this_thread::sleep(boost::posix_time::milliseconds(100)); m.stop(); } TEST(BasicThreadTest, SwitchSyncOnThread) { MockThread m(-1); std::shared_ptr barrier = std::make_shared(2); EXPECT_FALSE(m.didInitialize); EXPECT_FALSE(m.didStartUp); EXPECT_FALSE(m.isRunning()); EXPECT_FALSE(m.isSynchronous()); m.start(barrier, false); // Run through the initialization barrier->wait(true); barrier->wait(true); boost::this_thread::sleep(boost::posix_time::milliseconds(150)); EXPECT_TRUE(m.isRunning()); // Thread is running, count should be less than count after waiting int count = m.count; boost::this_thread::sleep(boost::posix_time::milliseconds(150)); EXPECT_GT(count, m.count); m.setSynchronous(true); boost::this_thread::sleep(boost::posix_time::milliseconds(150)); // Thread is stopped count should be equal to count after waiting count = m.count; boost::this_thread::sleep(boost::posix_time::milliseconds(150)); EXPECT_EQ(count, m.count); // Take one step, count should be just on less than last count barrier->wait(true); boost::this_thread::sleep(boost::posix_time::milliseconds(100)); EXPECT_EQ(count - 1, m.count); count = count - 1; m.setSynchronous(false); // restart the thread ... barrier->wait(true); // Thread is running count should decrease and keep decreasing count = m.count; boost::this_thread::sleep(boost::posix_time::milliseconds(200)); EXPECT_GT(count, m.count); // Thread is running count should decrease and keep decreasing count = m.count; boost::this_thread::sleep(boost::posix_time::milliseconds(200)); EXPECT_GT(count, m.count); m.stop(); } TEST(BasicThreadTest, RealTimings) { MockThread m; m.start(nullptr); while (m.getCpuTime() < 1e-6); EXPECT_GT(m.getCpuTime(), 1e-6); EXPECT_GT(m.getUpdateCount(), 0u); // Ask the manager to idle for a while, just the time for us to reset the timer and check right after // what the timer contains (the delay between the reset and the checks could trigger a race condition). // Asking the thread to idle suppress this race condition. m.setIdle(true); // Reset the timer (=> no more frames in the timer queue) m.resetCpuTimeAndUpdateCount(); EXPECT_NEAR(0.0, m.getCpuTime(), 1e-9); EXPECT_EQ(m.getUpdateCount(), 0u); // Resume the thread loop update. m.setIdle(false); while (m.getCpuTime() < 1e-6); EXPECT_GT(m.getCpuTime(), 1e-6); EXPECT_GT(m.getUpdateCount(), 0u); m.stop(); } // HS-2013-jun-25 Can't figure out how to make this work or what is going wrong with the test class BasicThreadDeathTest : public ::testing::Test { public: void SetUp() { m = std::make_shared(); m->start(nullptr); } void TearDown() { m->stop(); boost::this_thread::sleep(boost::posix_time::milliseconds(100)); } std::shared_ptr m; }; TEST_F(BasicThreadDeathTest, DestructLiveThread) { ::testing::FLAGS_gtest_death_test_style = "threadsafe"; boost::this_thread::sleep(boost::posix_time::milliseconds(100)); ASSERT_DEATH_IF_SUPPORTED( { SurgSim::Framework::AssertMessage::setFailureBehaviorToDeath(); m.reset(); }, ""); } }; // namespace Framework }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Framework/UnitTests/BehaviorManagerTest.cpp000066400000000000000000000062661277777236100260140ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "boost/thread/thread.hpp" #include "SurgSim/Framework/BehaviorManager.h" #include "SurgSim/Framework/UnitTests/MockObjects.h" using SurgSim::Framework::BehaviorManager; using SurgSim::Framework::Runtime; using SurgSim::Framework::Scene; using SurgSim::Framework::SceneElement; TEST(BehaviorManagerTest, BehaviorInitTest) { std::shared_ptr runtime(new Runtime()); std::shared_ptr behaviorManager(new BehaviorManager()); runtime->addManager(behaviorManager); auto scene = runtime->getScene(); std::shared_ptr element(new MockSceneElement()); std::shared_ptr behavior(new MockBehavior("MockBehavior")); std::shared_ptr component(new MockComponent("Test Component")); element->addComponent(behavior); element->addComponent(component); scene->addSceneElement(element); EXPECT_TRUE(element->isInitialized()); EXPECT_TRUE(behavior->isInitialized()); EXPECT_TRUE(component->isInitialized()); runtime->start(); EXPECT_TRUE(behaviorManager->isInitialized()); boost::this_thread::sleep(boost::posix_time::milliseconds(250)); EXPECT_TRUE(behavior->isAwake()); runtime->stop(); EXPECT_FALSE(behavior->isAwake()); EXPECT_FALSE(component->isAwake()); EXPECT_GT(behavior->updateCount, 0); } TEST(BehaviorManagerTest, UpdateTest) { auto runtime = std::make_shared(); auto scene = runtime->getScene(); auto behaviorManager = std::make_shared(); auto element = std::make_shared(); auto behavior = std::make_shared("MockBehavior"); runtime->addManager(behaviorManager); element->addComponent(behavior); scene->addSceneElement(element); EXPECT_TRUE(element->isInitialized()); EXPECT_TRUE(behavior->isInitialized()); behavior->setLocalActive(false); behavior->updateCount = 0; // BehaviorManager will not update inactive behaviors. runtime->start(); EXPECT_TRUE(behaviorManager->isInitialized()); boost::this_thread::sleep(boost::posix_time::milliseconds(100)); EXPECT_EQ(0, behavior->updateCount); // Turn on the behavior, it will be updated. behavior->setLocalActive(true); boost::this_thread::sleep(boost::posix_time::milliseconds(100)); EXPECT_GT(behavior->updateCount, 0); // Turn off the behavior, it will not be updated any more. behavior->setLocalActive(false); boost::this_thread::sleep(boost::posix_time::milliseconds(100)); auto count = behavior->updateCount; boost::this_thread::sleep(boost::posix_time::milliseconds(100)); EXPECT_EQ(behavior->updateCount, count); runtime->stop(); } opensurgsim-0.7.0/SurgSim/Framework/UnitTests/CMakeLists.txt000066400000000000000000000032251277777236100241460ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2012-2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. include_directories ( ${gtest_SOURCE_DIR}/include ) set(UNIT_TEST_SOURCES AccessibleTests.cpp AccessibleTypeTests.cpp ApplicationDataTest.cpp AssertTest.cpp AssetTests.cpp BarrierTest.cpp BasicSceneElementTests.cpp BasicThreadTests.cpp BehaviorManagerTest.cpp ComponentManagerTests.cpp ComponentTest.cpp LockedContainerTest.cpp LoggerManagerTest.cpp LoggerTest.cpp MockObjects.cpp ObjectFactoryTests.cpp ReuseFactoryTest.cpp RuntimeTest.cpp SamplingMetricBaseTest.cpp SceneElementTest.cpp SceneTest.cpp SharedInstanceTest.cpp ThreadPoolTest.cpp TimerTest.cpp TransferPropertiesBehaviorTests.cpp ) set(UNIT_TEST_HEADERS MockObjects.h ) file(COPY Data DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) # Configure the path for the data files configure_file( "${CMAKE_CURRENT_SOURCE_DIR}/config.txt.in" "${CMAKE_CURRENT_BINARY_DIR}/config.txt" ) set(LIBS SurgSimFramework SurgSimDataStructures ) surgsim_add_unit_tests(SurgSimFrameworkTest) set_target_properties(SurgSimFrameworkTest PROPERTIES FOLDER "Framework") opensurgsim-0.7.0/SurgSim/Framework/UnitTests/ComponentManagerTests.cpp000066400000000000000000000153111277777236100263710ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. ///\file ComponentManagerTests.cpp test the basic functionality of the component manager /// mostly through a mock manager that exposes the private interface and implements /// the simplest version of the abstract interface. #include #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Framework/ComponentManager.h" #include "SurgSim/Framework/UnitTests/MockObjects.h" using SurgSim::Framework::Runtime; using SurgSim::Framework::Component; namespace SurgSim { namespace Framework { TEST(ComponentManagerTests, TestInternalAddRemove) { std::shared_ptr mock1 = std::make_shared("Component1"); std::shared_ptr mock2 = std::make_shared("Component2"); std::shared_ptr invalid = std::make_shared("Behavior1"); MockManager manager; EXPECT_EQ(0u, manager.getComponents().size()); // Basic case should be able to add mockcomponent EXPECT_TRUE(manager.testTryAddComponent(mock1)); EXPECT_EQ(1u, manager.getComponents().size()); EXPECT_TRUE(manager.testTryAddComponent(mock2)); EXPECT_EQ(2u, manager.getComponents().size()); // Should not be able to add behavior EXPECT_FALSE(manager.testTryAddComponent(invalid)); EXPECT_EQ(2u, manager.getComponents().size()); // Should not be able to add duplicate EXPECT_FALSE(manager.testTryAddComponent(mock2)); EXPECT_EQ(2u, manager.getComponents().size()); // Test the removals EXPECT_FALSE(manager.testTryRemoveComponent(invalid)); EXPECT_EQ(2u, manager.getComponents().size()); EXPECT_TRUE(manager.testTryRemoveComponent(mock1)); EXPECT_EQ(1u, manager.getComponents().size()); EXPECT_FALSE(manager.testTryRemoveComponent(mock1)); EXPECT_EQ(1u, manager.getComponents().size()); EXPECT_TRUE(manager.testTryRemoveComponent(mock2)); EXPECT_EQ(0u, manager.getComponents().size()); // Add after remove EXPECT_TRUE(manager.testTryAddComponent(mock1)); EXPECT_EQ(1u, manager.getComponents().size()); } TEST(ComponentManagerTests, SimpleAddRemoveComponentTest) { std::shared_ptr mock1 = std::make_shared("Component1"); std::shared_ptr mock2 = std::make_shared("Component2"); std::shared_ptr invalid = std::make_shared("Behavior1"); std::shared_ptr runtime = std::make_shared(); MockManager manager; manager.setRuntime(runtime); manager.enqueueAddComponent(mock1); manager.enqueueAddComponent(mock1); manager.testProcessComponents(); EXPECT_EQ(1u, manager.getComponents().size()); manager.enqueueRemoveComponent(mock1); manager.testProcessComponents(); EXPECT_EQ(0u, manager.getComponents().size()); } TEST(ComponentManagerTests, CompoundAddRemoveComponentTest) { std::shared_ptr mock1 = std::make_shared("Component1"); std::shared_ptr mock2 = std::make_shared("Component2"); std::shared_ptr invalid = std::make_shared("Behavior1"); std::shared_ptr runtime = std::make_shared(); MockManager manager; manager.setRuntime(runtime); manager.enqueueAddComponent(mock1); manager.enqueueAddComponent(mock2); manager.enqueueAddComponent(invalid); manager.testProcessComponents(); EXPECT_EQ(2u, manager.getComponents().size()); manager.enqueueRemoveComponent(mock1); manager.enqueueAddComponent(mock2); manager.enqueueRemoveComponent(invalid); manager.testProcessComponents(); EXPECT_EQ(1u, manager.getComponents().size()); } // Bug: Components that were initialized by other threads, can be woken up by a thread // that does not have responsibility. Creating a race condition TEST(ComponentManagerTest, DoNotWakeupForeignComponents) { std::shared_ptr mock1 = std::make_shared("Component1"); std::shared_ptr mock2 = std::make_shared("Component2"); std::shared_ptr invalid = std::make_shared("Behavior1"); std::shared_ptr runtime = std::make_shared(); MockManager manager; manager.setRuntime(runtime); manager.enqueueAddComponent(mock1); manager.enqueueAddComponent(mock2); manager.enqueueAddComponent(invalid); // Simulate another thread initializing 'invalid' invalid->initialize(runtime); manager.testProcessComponents(); // invalid should not be awoken ... EXPECT_FALSE(invalid->isAwake()); } TEST(ComponentManagerTests, TypeTest) { MockManager manager; EXPECT_EQ(SurgSim::Framework::MANAGER_TYPE_NONE, manager.getType()); } // Specific component manager to expose a bug where sceneelements added during initialization of // the ComponentManagers are not initialized themselves class InitializationBugManager : public ComponentManager { public: InitializationBugManager() { m_sceneElementInitialize = std::make_shared("Initialize"); auto mockComponent = std::make_shared("Component"); m_sceneElementInitialize->addComponent(mockComponent); m_sceneElementStartup = std::make_shared("Startup"); mockComponent = std::make_shared("Component"); m_sceneElementStartup->addComponent(mockComponent); } virtual int getType() const { return MANAGER_TYPE_NONE; } virtual bool executeAdditions(const std::shared_ptr& component) { return true; } virtual bool executeRemovals(const std::shared_ptr& component) { return true; } virtual bool doInitialize() { getRuntime()->getScene()->addSceneElement(m_sceneElementInitialize); return true; } virtual bool doStartUp() { getRuntime()->getScene()->addSceneElement(m_sceneElementStartup); return true; } std::shared_ptr m_sceneElementInitialize; std::shared_ptr m_sceneElementStartup; }; TEST(ComponentManagerTests, AdditionDuringInitializationTest) { auto manager = std::make_shared(); auto runtime = std::make_shared(); auto scene = runtime->getScene(); runtime->addManager(manager); runtime->start(); EXPECT_TRUE(manager->m_sceneElementInitialize->isInitialized()); EXPECT_TRUE(manager->m_sceneElementStartup->isInitialized()); } } }opensurgsim-0.7.0/SurgSim/Framework/UnitTests/ComponentTest.cpp000066400000000000000000000426301277777236100247170ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. ///\file ComponentManagerTests.cpp test the basic functionality of the component manager /// mostly through a mock manager that exposes the private interface and implements /// the simplest version of the abstract interface. #include #include #include "SurgSim/Framework/BasicSceneElement.h" #include "SurgSim/Framework/Component.h" #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Framework/Scene.h" #include "SurgSim/Framework/UnitTests/MockObjects.h" #include "SurgSim/Testing/SerializationMockComponent.h" using SurgSim::Framework::Component; using SurgSim::Framework::Runtime; using SurgSim::Framework::Scene; /// Simple component class, no additional features class TestComponent1 : public Component { public: explicit TestComponent1(const std::string& name) : Component(name) { } virtual bool doInitialize() { return true; } virtual bool doWakeUp() { return true; } std::string getClassName() const override { return "TestComponent1"; } }; /// TestComponent with properties, automatic registration in the factory class TestComponent2 : public Component { public: explicit TestComponent2(const std::string& name) : Component(name), valueOne(999), valueTwo(888) { SURGSIM_ADD_SERIALIZABLE_PROPERTY(TestComponent2, int, ValueOne, getValueOne, setValueOne); SURGSIM_ADD_SERIALIZABLE_PROPERTY(TestComponent2, int, ValueTwo, getValueTwo, setValueTwo); } virtual bool doInitialize() { return true; } virtual bool doWakeUp() { return true; } int getValueOne() const { return valueOne; } void setValueOne(int val) { valueOne = val; } int getValueTwo() const { return valueTwo; } void setValueTwo(int val) { valueTwo = val; } std::string getClassName() const override { return "TestComponent2"; } private: int valueOne; int valueTwo; }; /// Testcomponent with references to other components class TestComponent3 : public Component { public: explicit TestComponent3(const std::string& name) : Component(name) { SURGSIM_ADD_SERIALIZABLE_PROPERTY( TestComponent3, std::shared_ptr, ComponentOne, getComponentOne, setComponentOne); SURGSIM_ADD_SERIALIZABLE_PROPERTY( TestComponent3, std::shared_ptr, ComponentTwo, getComponentTwo, setComponentTwo); } virtual bool doInitialize() { return true; } virtual bool doWakeUp() { return true; } std::shared_ptr getComponentOne() const { return m_componentOne; } void setComponentOne(std::shared_ptr val) { m_componentOne = val; } std::shared_ptr getComponentTwo() const { return m_componentTwo; } void setComponentTwo(std::shared_ptr val) { m_componentTwo = val; } std::string getClassName() const override { return "TestComponent3"; } private: std::shared_ptr m_componentOne; std::shared_ptr m_componentTwo; }; namespace { SURGSIM_REGISTER(SurgSim::Framework::Component, TestComponent2, TestComponent2); SURGSIM_REGISTER(SurgSim::Framework::Component, TestComponent3, TestComponent3); } TEST(ComponentTests, Constructor) { ASSERT_NO_THROW({MockComponent component("Component");}); } TEST(ComponentTests, SetAndGetSceneElementTest) { std::shared_ptr mock1 = std::make_shared("Component"); std::shared_ptr element1(new MockSceneElement("one")); mock1->setSceneElement(element1); EXPECT_EQ(element1, mock1->getSceneElement()); } TEST(ComponentTests, SetAndGetSceneTest) { std::shared_ptr mock1 = std::make_shared("Component"); std::shared_ptr scene = std::make_shared(std::make_shared()); mock1->setScene(scene); EXPECT_EQ(scene, mock1->getScene()); } TEST(ComponentTests, PointerEncode) { auto component = std::make_shared("TestComponent"); YAML::Node node = YAML::convert>::encode(component); EXPECT_FALSE(node.IsNull()); EXPECT_TRUE(node.IsMap()); EXPECT_EQ(1u, node.size()); std::string className = node.begin()->first.as(); YAML::Node data = node[className]; EXPECT_EQ(2u, data.size()); EXPECT_EQ("TestComponent1", className); EXPECT_EQ("TestComponent", data["Name"].as()); EXPECT_EQ(to_string(component->getUuid()), data["Id"].as()); } TEST(ComponentTests, NullPointerSerialization) { // Encode a nullptr std::shared_ptr emptyComponent; EXPECT_NO_THROW(YAML::convert>::encode(emptyComponent)); YAML::Node node = YAML::convert>::encode(emptyComponent); EXPECT_FALSE(node.IsMap()); // Decode an empty node onto an empty receiver std::shared_ptr emptyComponentReceiver; EXPECT_NO_THROW(YAML::convert>::decode(node, emptyComponentReceiver);); EXPECT_EQ(nullptr, emptyComponentReceiver); // Decode an empty node onto a non-empty receiver. std::shared_ptr component = std::make_shared("TestMockComponent"); EXPECT_NO_THROW(YAML::convert>::decode(node, component);); EXPECT_NE(nullptr, component); EXPECT_EQ("TestMockComponent", component->getName()); // A derived class of component having empty components. auto container = std::make_shared("TestComponent3"); YAML::Node containerNode = YAML::convert::encode(*container); std::shared_ptr newContainer = std::dynamic_pointer_cast( containerNode.as>()); EXPECT_EQ(nullptr, newContainer->getComponentOne()); EXPECT_EQ(nullptr, newContainer->getComponentTwo()); EXPECT_EQ(container->getName(), newContainer->getName()); } TEST(ComponentTests, ConvertFactoryTest) { Component::getFactory().registerClass("TestComponent1"); YAML::Node node; node["TestComponent1"]["Name"] = "ComponentName"; node["TestComponent1"]["Id"] = "ConvertFactoryTest_TestComponent1"; auto component = node.as>(); auto testComponent = std::dynamic_pointer_cast(component); EXPECT_NE(nullptr, testComponent); EXPECT_EQ("ComponentName", testComponent->getName()); EXPECT_EQ("TestComponent1", testComponent->getClassName()); YAML::Node invalidNode; node["Invalid"]["Name"] = "Other"; node["Invalid"]["Id"] = "ConvertFactoryTest_TestComponent2"; // Should not be able to convert this class EXPECT_ANY_THROW({auto result = invalidNode.as>();}); } TEST(ComponentTests, MacroRegistrationTest) { YAML::Node node; node["TestComponent2"]["Name"] = "ComponentName"; node["TestComponent2"]["Id"] = "AutomaticRegistrationTest_ComponentName"; auto component = node.as>(); auto testComponent = std::dynamic_pointer_cast(component); EXPECT_NE(nullptr, testComponent); EXPECT_EQ("ComponentName", testComponent->getName()); EXPECT_EQ("TestComponent2", testComponent->getClassName()); EXPECT_TRUE(testComponent->isActive()); } TEST(ComponentTests, DecodeSharedReferences) { YAML::Node node; node["TestComponent2"]["Name"] = "OneComponentName"; node["TestComponent2"]["Id"] = "DecodeSharedReferences_OneComponentName"; auto component1 = node.as>(); EXPECT_NE(nullptr, component1); EXPECT_TRUE(component1->isActive()); auto component1copy = node.as>(); EXPECT_NE(nullptr, component1copy); EXPECT_EQ(component1, component1copy); EXPECT_TRUE(component1copy->isActive()); node["TestComponent2"]["Id"] = "DecodeSharedReferences_TwoComponentName"; auto component2 = node.as>(); EXPECT_NE(nullptr, component2); EXPECT_NE(component2, component1); EXPECT_NE(component2, component1copy); EXPECT_TRUE(component2->isActive()); node["TestComponent2"]["IsLocalActive"] = false; auto component3 = node.as>(); EXPECT_FALSE(component3->isLocalActive()); } TEST(ComponentTests, EncodeComponent) { auto component = std::make_shared("TestComponent"); component->setValueOne(1); component->setValueTwo(2); YAML::Node node = YAML::convert::encode(*component); std::string className = node.begin()->first.as(); YAML::Node data = node[className]; EXPECT_EQ("TestComponent", (data["Name"].IsDefined() ? data["Name"].as() : "undefined !")); EXPECT_EQ("TestComponent2", className); EXPECT_EQ(1, (data["ValueOne"].IsDefined() ? data["ValueOne"].as() : 0xbad)); EXPECT_EQ(2, (data["ValueTwo"].IsDefined() ? data["ValueTwo"].as() : 0xbad)); EXPECT_TRUE(data["IsLocalActive"].IsDefined()); EXPECT_TRUE(data["IsLocalActive"].as()); } TEST(ComponentTests, DecodeComponent) { YAML::Node node; node["TestComponent2"]["Name"] = "TestComponentName"; node["TestComponent2"]["Id"] = "DecodeComponent_TestComponentName"; node["TestComponent2"]["ValueOne"] = 100; node["TestComponent2"]["ValueTwo"] = 101; node["TestComponent2"]["IsLocalActive"] = false; auto component = node.as>(); auto testComponent = std::dynamic_pointer_cast(component); EXPECT_NE(nullptr, testComponent); EXPECT_EQ("TestComponentName", testComponent->getName()); EXPECT_EQ(100, testComponent->getValueOne()); EXPECT_EQ(101, testComponent->getValueTwo()); EXPECT_FALSE(testComponent->isLocalActive()); } TEST(ComponentTests, ComponentReferences) { auto containerComponent = std::make_shared("Root"); auto componentOne = std::make_shared("Component1"); auto componentTwo = std::make_shared("Component2"); componentOne->setValueOne(100); componentOne->setValueTwo(101); componentTwo->setValueOne(200); componentTwo->setValueTwo(201); containerComponent->setComponentOne(componentOne); containerComponent->setComponentTwo(componentTwo); // Push the components onto the node, note that one component is serialized before the container // and the other after the container, this is intentional to test referencing YAML::Node node; // because yaml internally does not know about our conversions we have to make them explicit node.push_back(YAML::convert::encode(*componentOne)); node.push_back(YAML::convert::encode(*containerComponent)); node.push_back(YAML::convert::encode(*componentTwo)); // Convert from node to shared component auto resultOne = std::dynamic_pointer_cast(node[0].as>()); auto resultContainer = std::dynamic_pointer_cast(node[1].as>()); auto resultTwo = std::dynamic_pointer_cast(node[2].as>()); // All of the components should have been de-serialized ASSERT_NE(nullptr, resultContainer); ASSERT_NE(nullptr, resultOne); ASSERT_NE(nullptr, resultTwo); // The references should have been resolved correctly ASSERT_EQ(resultContainer->getComponentOne(), resultOne); ASSERT_EQ(resultContainer->getComponentTwo(), resultTwo); // All components should have the correct values ... EXPECT_EQ(componentOne->getValueOne(), boost::any_cast(resultContainer->getComponentOne()->getValue("ValueOne"))); EXPECT_EQ(componentOne->getValueTwo(), boost::any_cast(resultContainer->getComponentOne()->getValue("ValueTwo"))); EXPECT_EQ(componentTwo->getValueOne(), boost::any_cast(resultContainer->getComponentTwo()->getValue("ValueOne"))); EXPECT_EQ(componentTwo->getValueTwo(), boost::any_cast(resultContainer->getComponentTwo()->getValue("ValueTwo"))); } TEST(ComponentTests, MockComponent) { auto component = SurgSim::Framework::Component::getFactory().create("MockComponent", "testcomponent"); ASSERT_NE(nullptr, component); /// SerializationMockComponent does not have an explicit definition anywhere in the code /// there is no SerializationMockComponent, but this should still succeed, this test protects /// against linker optimization auto nonDefinedComponent = SurgSim::Framework::Component::getFactory().create( "SerializationMockComponent", "othercomponent"); ASSERT_NE(nullptr, nonDefinedComponent) << "It looks like SerializationMockComponent was lost during linkage."; YAML::Node node = YAML::convert::encode(*nonDefinedComponent); auto roundtripComponent = node.as>(); ASSERT_NE(nullptr, roundtripComponent); EXPECT_EQ("SerializationMockComponent", roundtripComponent->getClassName()); EXPECT_EQ("othercomponent", roundtripComponent->getName()); } #include "SurgSim/Framework/PoseComponent.h" #include "SurgSim/Math/RigidTransform.h" TEST(ComponentTests, PoseComponentTest) { std::shared_ptr component; ASSERT_NO_THROW(component = SurgSim::Framework::Component::getFactory().create( "SurgSim::Framework::PoseComponent", "pose")); EXPECT_EQ("SurgSim::Framework::PoseComponent", component->getClassName()); SurgSim::Math::RigidTransform3d pose(SurgSim::Math::RigidTransform3d::Identity()); component->setValue("Pose", pose); YAML::Node node(YAML::convert::encode(*component)); auto decoded = std::dynamic_pointer_cast( node.as>()); EXPECT_NE(nullptr, decoded); EXPECT_TRUE(pose.isApprox(decoded->getValue("Pose"))); } TEST(ComponentTests, SetActiveTest) { std::shared_ptr component = std::make_shared("Component"); EXPECT_TRUE(component->isActive()); EXPECT_TRUE(component->isLocalActive()); EXPECT_NO_THROW(component->setLocalActive(false)); EXPECT_FALSE(component->isActive()); EXPECT_FALSE(component->isLocalActive()); // RW property test component->setValue("IsLocalActive", true); EXPECT_TRUE(component->isActive()); EXPECT_TRUE(component->isLocalActive()); EXPECT_TRUE(component->getValue("IsActive")); component->setValue("IsLocalActive", false); EXPECT_FALSE(component->isActive()); EXPECT_FALSE(component->isLocalActive()); EXPECT_FALSE(component->getValue("IsActive")); auto sceneElement = std::make_shared("SceneElement"); auto runtime = std::make_shared(); sceneElement->addComponent(component); runtime->getScene()->addSceneElement(sceneElement); EXPECT_TRUE(sceneElement->isActive()); // An inactive component in an active SceneElement is 'inactive'. EXPECT_FALSE(component->isActive()); // An active component in an active SceneElement is 'active'. component->setLocalActive(true); EXPECT_TRUE(component->isActive()); sceneElement->setActive(false); // An active component in an inactive SceneElement is 'inactive'. EXPECT_FALSE(component->isActive()); // An inactive component in an inactive SceneElement is 'inactive'. component->setLocalActive(false); EXPECT_FALSE(component->isActive()); // During serialization, it's Component::m_isActive being serialized, not Component::isActive(). component->setValue("IsLocalActive", true); YAML::Node node = sceneElement->encode(true); YAML::Node data = node["SurgSim::Framework::BasicSceneElement"]; // Decode the component only. std::shared_ptr decodedComponent; for (auto nodeIt = data["Components"].begin(); nodeIt != data["Components"].end(); ++nodeIt) { if ("MockComponent" == nodeIt->begin()->first.as()) { decodedComponent = nodeIt->as>(); break; } } ASSERT_NE(nullptr, decodedComponent); EXPECT_EQ(nullptr, decodedComponent->getSceneElement()); EXPECT_TRUE(decodedComponent->isActive()); EXPECT_TRUE(decodedComponent->isLocalActive()); // Decode the component with a SceneElement. The SceneElement's activity (active/inactive) will // affect the return value of Component::isActive(). decodedComponent = nullptr; auto decodedSceneElement = std::make_shared("Decoded"); decodedSceneElement->decode(node); runtime->getScene()->addSceneElement(decodedSceneElement); EXPECT_FALSE(decodedSceneElement->isActive()); decodedComponent = decodedSceneElement->getComponent("Component"); EXPECT_NE(nullptr, decodedComponent->getSceneElement()); EXPECT_FALSE(decodedComponent->isActive()); EXPECT_TRUE(decodedComponent->isLocalActive()); } TEST(ComponentTests, CheckAndConvertTest) { using SurgSim::Framework::checkAndConvert; auto original = std::make_shared("test"); auto other = std::make_shared("other"); std::shared_ptr source = original; std::shared_ptr result; EXPECT_NO_THROW(result = checkAndConvert(source, "MockComponent")); EXPECT_EQ(result, original); EXPECT_ANY_THROW(result = checkAndConvert(other, "MockBehavior")); } opensurgsim-0.7.0/SurgSim/Framework/UnitTests/Data/000077500000000000000000000000001277777236100222555ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Framework/UnitTests/Data/ApplicationDataTest/000077500000000000000000000000001277777236100261525ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Framework/UnitTests/Data/ApplicationDataTest/Directory1/000077500000000000000000000000001277777236100301775ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Framework/UnitTests/Data/ApplicationDataTest/Directory1/duplicatedFile.txt000066400000000000000000000000001277777236100336440ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Framework/UnitTests/Data/ApplicationDataTest/Directory1/uniqueFile1.txt000066400000000000000000000000001277777236100331150ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Framework/UnitTests/Data/ApplicationDataTest/Directory2/000077500000000000000000000000001277777236100302005ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Framework/UnitTests/Data/ApplicationDataTest/Directory2/duplicatedFile.txt000066400000000000000000000000001277777236100336450ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Framework/UnitTests/Data/ApplicationDataTest/Directory2/uniqueFile2.txt000066400000000000000000000000001277777236100331170ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Framework/UnitTests/Data/ApplicationDataTest/Test Directory/000077500000000000000000000000001277777236100310165ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Framework/UnitTests/Data/ApplicationDataTest/Test Directory/uniqueFile.txt000066400000000000000000000000471277777236100336660ustar00rootroot00000000000000Data/ApplicationDataTest/Test Directoryopensurgsim-0.7.0/SurgSim/Framework/UnitTests/Data/ApplicationDataTest/testFile1.txt000066400000000000000000000001101277777236100305430ustar00rootroot00000000000000Data/ApplicationDataTest/Directory1 Data/ApplicationDataTest/Directory2 opensurgsim-0.7.0/SurgSim/Framework/UnitTests/Data/AssetTestData/000077500000000000000000000000001277777236100247665ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Framework/UnitTests/Data/AssetTestData/DummyFile.txt000066400000000000000000000000001277777236100274100ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Framework/UnitTests/Data/SceneElementTest/000077500000000000000000000000001277777236100254645ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Framework/UnitTests/Data/SceneElementTest/circle-1.yaml000066400000000000000000000003001277777236100277400ustar00rootroot00000000000000- SurgSim::Framework::BasicSceneElement: Name: element IsActive: true Components: - MockComponent: Name: clone - INCLUDE: SceneElementTest/circle-2.yaml opensurgsim-0.7.0/SurgSim/Framework/UnitTests/Data/SceneElementTest/circle-2.yaml000066400000000000000000000003001277777236100277410ustar00rootroot00000000000000- SurgSim::Framework::BasicSceneElement: Name: element IsActive: true Components: - MockComponent: Name: clone - INCLUDE: SceneElementTest/circle-1.yaml opensurgsim-0.7.0/SurgSim/Framework/UnitTests/Data/SceneElementTest/included.yaml000066400000000000000000000004461277777236100301430ustar00rootroot00000000000000- SurgSim::Framework::BasicSceneElement: Name: element2 IsActive: true Components: - MockComponent: Name: clone - SurgSim::Framework::BasicSceneElement: Name: element3 IsActive: true Components: - MockComponent: Name: clone opensurgsim-0.7.0/SurgSim/Framework/UnitTests/Data/SceneElementTest/includer.yaml000066400000000000000000000003511277777236100301540ustar00rootroot00000000000000- INCLUDE: SceneElementTest/single.yaml - SurgSim::Framework::BasicSceneElement: Name: element IsActive: true Components: - MockComponent: Name: clone - INCLUDE: SceneElementTest/included.yaml opensurgsim-0.7.0/SurgSim/Framework/UnitTests/Data/SceneElementTest/single.yaml000066400000000000000000000002201277777236100276230ustar00rootroot00000000000000SurgSim::Framework::BasicSceneElement: Name: element2 IsActive: true Components: - MockComponent: Name: clone opensurgsim-0.7.0/SurgSim/Framework/UnitTests/Data/SceneTestData/000077500000000000000000000000001277777236100247445ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Framework/UnitTests/Data/SceneTestData/bad.yaml000066400000000000000000000004501277777236100263550ustar00rootroot00000000000000- SurgSim::Framework::BasicSceneElement: Name: element2 IsActive: true Components: - MockComponent: Name: clone Id 1de26315-82a7-46b2-ae38-324d25009629 IsLocalActive: true SucceedWithInit: true SucceedWithWakeUp: true opensurgsim-0.7.0/SurgSim/Framework/UnitTests/Data/SceneTestData/element.yaml000066400000000000000000000004511277777236100272610ustar00rootroot00000000000000- SurgSim::Framework::BasicSceneElement: Name: element2 IsActive: true Components: - MockComponent: Name: clone Id: 1de26315-82a7-46b2-ae38-324d25009629 IsLocalActive: true SucceedWithInit: true SucceedWithWakeUp: true opensurgsim-0.7.0/SurgSim/Framework/UnitTests/Data/SceneTestData/elements.yaml000066400000000000000000000011321277777236100274410ustar00rootroot00000000000000- SurgSim::Framework::BasicSceneElement: IsActive: true Name: element0 Components: - MockComponent: Name: component0 Id: 394ca44f-6117-4eef-90a1-52b81e430e3a IsLocalActive: true SucceedWithInit: true SucceedWithWakeUp: true - SurgSim::Framework::BasicSceneElement: Name: element1 IsActive: true Components: - MockComponent: Name: component1 Id: 2d27d6e1-2628-40a7-9e1d-da8b5032228f IsLocalActive: true SucceedWithInit: true SucceedWithWakeUp: trueopensurgsim-0.7.0/SurgSim/Framework/UnitTests/Data/SceneTestData/scene.yaml000066400000000000000000000023601277777236100267260ustar00rootroot00000000000000SurgSim::Framework::Scene: SceneElements: - SurgSim::Framework::BasicSceneElement: IsActive: true Components: - SurgSim::Framework::PoseComponent: Name: Pose Id: 71fc22e9-a908-48d5-b0f9-198d60513117 IsLocalActive: true Pose: Translation: [0, 0, 0] Quaternion: [0, 0, 0, 1] - MockComponent: Name: component0 IsLocalActive: true SucceedWithInit: true SucceedWithWakeUp: true Id: 350c883b-0283-4e34-8148-5b281b758e3b Name: element0 - SurgSim::Framework::BasicSceneElement: Components: - MockComponent: IsLocalActive: true SucceedWithInit: true SucceedWithWakeUp: true Id: 5def200c-6515-4c2b-a818-936d616c43af Name: component1 - SurgSim::Framework::PoseComponent: IsLocalActive: true Pose: Quaternion: [0, 0, 0, 1] Translation: [0, 0, 0] Id: 65a4bc87-4d3f-487b-aac9-a9db5a250a28 Name: Pose Name: element1 IsActive: trueopensurgsim-0.7.0/SurgSim/Framework/UnitTests/LockedContainerTest.cpp000066400000000000000000000344331277777236100260230ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the LockedContainer class. #include #include "SurgSim/Framework/LockedContainer.h" #include #include using SurgSim::Framework::LockedContainer; // Define some helper data types for testing. /// A class that supports copy construction and copy assignment but not moving. class Copyable { public: Copyable() : m_data(-1) { } Copyable(const Copyable& o) : m_data(o.m_data) { } void operator=(const Copyable& o) { m_data = o.m_data; } int getValue() const { return m_data; } void setValue(int d) { m_data = d; } private: // No need to disable move construction and move assignment-- the compiler does not provide those by default. int m_data; }; /// A class that supports neither copying nor moving. class NonCopyable { public: NonCopyable() : m_data(-1) { } int getValue() const { return m_data; } void setValue(int d) { m_data = d; } private: // Disable copy construction and copy assignment. // No need to disable move construction and move assignment-- the compiler does not provide those by default. NonCopyable(const NonCopyable&); void operator=(const NonCopyable&); int m_data; }; /// A class that supports move construction and move assignment but not copying. class Movable { public: Movable() : m_data(-1) { } Movable(Movable&& o) : m_data(o.m_data) { o.m_data = -1; } void operator=(Movable&& o) { m_data = o.m_data; o.m_data = -1; } int getValue() const { return m_data; } void setValue(int d) { m_data = d; } private: // Disable copy construction and copy assignment. Movable(const Movable&); void operator=(const Movable&); int m_data; }; /// A class with several pieces of data for checking consistency. class BigData { public: BigData() : m_data1(-1), m_data2(-1) { } BigData(const BigData& o) : m_data1(o.m_data1), m_data2(o.m_data2) {} void operator=(const BigData& o) { m_data1 = o.m_data1; m_data2 = o.m_data2; } BigData(BigData&& o) : m_data1(o.m_data1), m_data2(o.m_data2) { o.m_data1 = o.m_data2 = -1; } void operator=(BigData&& o) { m_data1 = o.m_data1; m_data2 = o.m_data2; o.m_data1 = o.m_data2 = -1; } int getValue1() const { return m_data1; } void setValue1(int d) { m_data1 = d; } int getValue2() const { return m_data2; } void setValue2(int d) { m_data2 = d; } private: int m_data1; int padding[1023]; // make it less likely that the cache will be kind to us int m_data2; }; // Now we're ready to start testing... // ==================== SINGLE-THREADED TESTS ==================== TEST(LockedContainerTest, Construct) { // This should work: EXPECT_NO_THROW( {LockedContainer data;}); EXPECT_NO_THROW( {LockedContainer data;}); EXPECT_NO_THROW( {LockedContainer data;}); // This should also work but it's useless (can't modify the data): EXPECT_NO_THROW( {LockedContainer data;}); } TEST(LockedContainerTest, InitializeAtConstruction) { typedef Copyable DataType; // With the following definition, the container construction should not compile: //typedef NonCopyable DataType; DataType initial; initial.setValue(123); EXPECT_EQ(123, initial.getValue()); LockedContainer data(initial); DataType contents; data.get(&contents); EXPECT_EQ(123, contents.getValue()); EXPECT_EQ(123, initial.getValue()); } TEST(LockedContainerTest, MoveInitializeAtConstruction) { typedef Movable DataType; DataType initial; initial.setValue(123); EXPECT_EQ(123, initial.getValue()); LockedContainer data(std::move(initial)); DataType contents; data.take(&contents); EXPECT_EQ(123, contents.getValue()); EXPECT_EQ(-1, initial.getValue()); // the old data has been moved out! } TEST(LockedContainerTest, Get) { Copyable content; content.setValue(987); LockedContainer data(content); EXPECT_EQ(987, content.getValue()); Copyable destination; data.get(&destination); EXPECT_EQ(987, destination.getValue()); data.get(&destination); EXPECT_EQ(987, destination.getValue()); EXPECT_EQ(987, content.getValue()); } TEST(LockedContainerTest, Take) { Movable content; content.setValue(987); LockedContainer data(std::move(content)); EXPECT_EQ(-1, content.getValue()); Movable destination; data.take(&destination); EXPECT_EQ(987, destination.getValue()); data.take(&destination); EXPECT_EQ(-1, destination.getValue()); EXPECT_EQ(-1, content.getValue()); } TEST(LockedContainerTest, SetAndGet) { Copyable initial; initial.setValue(1); LockedContainer data(initial); Copyable contents; data.get(&contents); EXPECT_EQ(1, contents.getValue()); // "writer": initial.setValue(2); // note: NOT writing to the container! // "reader": data.get(&contents); EXPECT_EQ(1, contents.getValue()); // "writer": initial.setValue(3); data.set(initial); // "reader": data.get(&contents); EXPECT_EQ(3, contents.getValue()); } TEST(LockedContainerTest, SetAndTake) { Movable initial; initial.setValue(1); EXPECT_EQ(1, initial.getValue()); LockedContainer data(std::move(initial)); Movable contents; data.take(&contents); EXPECT_EQ(1, contents.getValue()); data.take(&contents); EXPECT_EQ(-1, contents.getValue()); EXPECT_EQ(-1, initial.getValue()); // "writer": initial.setValue(2); // note: NOT writing to the container! // "reader": data.take(&contents); EXPECT_EQ(-1, contents.getValue()); // "writer": initial.setValue(3); data.set(std::move(initial)); // "reader": data.take(&contents); EXPECT_EQ(3, contents.getValue()); data.take(&contents); EXPECT_EQ(-1, contents.getValue()); EXPECT_EQ(-1, initial.getValue()); } TEST(LockedContainerTest, TryGetChanged) { { LockedContainer data; // use default constructor for Copyable Copyable destination; destination.setValue(999); { bool changed = data.tryGetChanged(&destination); EXPECT_FALSE(changed) << "no set(); tryGetChanged() should return false!"; if (! changed) { EXPECT_EQ(999, destination.getValue()) << "tryGetChanged() returned false; value shouldn't have changed!"; } } Copyable content; content.setValue(101); data.set(content); { bool changed = data.tryGetChanged(&destination); EXPECT_TRUE(changed) << "set() called; tryGetChanged() should return true!"; if (changed) { EXPECT_EQ(101, destination.getValue()) << "tryGetChanged() returned true; value should have changed!"; } } destination.setValue(888); { bool changed = data.tryGetChanged(&destination); EXPECT_FALSE(changed) << "no set() since get(); tryGetChanged() should return false!"; if (! changed) { EXPECT_EQ(888, destination.getValue()) << "tryGetChanged() returned false; value shouldn't have changed!"; } } } { Copyable content; content.setValue(654); LockedContainer data(content); // use initializing constructor for Copyable Copyable destination; destination.setValue(999); { bool changed = data.tryGetChanged(&destination); EXPECT_FALSE(changed) << "no set(); tryGetChanged() should return false!"; if (! changed) { EXPECT_EQ(999, destination.getValue()) << "tryGetChanged() returned false; value shouldn't have changed!"; } } content.setValue(121); data.set(content); { bool changed = data.tryGetChanged(&destination); EXPECT_TRUE(changed) << "set() called; tryGetChanged() should return true!"; if (changed) { EXPECT_EQ(121, destination.getValue()) << "tryGetChanged() returned true; value should have changed!"; } } destination.setValue(888); { bool changed = data.tryGetChanged(&destination); EXPECT_FALSE(changed) << "no set() since get(); tryGetChanged() should return false!"; if (! changed) { EXPECT_EQ(888, destination.getValue()) << "tryGetChanged() returned false; value shouldn't have changed!"; } } } } TEST(LockedContainerTest, TryTakeChanged) { { LockedContainer data; // use default constructor for Movable Movable destination; destination.setValue(999); { bool changed = data.tryTakeChanged(&destination); EXPECT_FALSE(changed) << "no set(); tryTakeChanged() should return false!"; if (! changed) { EXPECT_EQ(999, destination.getValue()) << "tryTakeChanged() returned false; value shouldn't have changed!"; } } Movable content; content.setValue(101); data.set(std::move(content)); { bool changed = data.tryTakeChanged(&destination); EXPECT_TRUE(changed) << "set() called; tryTakeChanged() should return true!"; if (changed) { EXPECT_EQ(101, destination.getValue()) << "tryTakeChanged() returned true; value should have changed!"; } } destination.setValue(888); { bool changed = data.tryTakeChanged(&destination); EXPECT_FALSE(changed) << "no set() since get(); tryTakeChanged() should return false!"; if (! changed) { EXPECT_EQ(888, destination.getValue()) << "tryTakeChanged() returned false; value shouldn't have changed!"; } } destination.setValue(777); { data.take(&destination); EXPECT_EQ(-1, destination.getValue()) << "an earlier tryTakeChanged() should have emptied the container!"; } } { Movable content; content.setValue(654); LockedContainer data(std::move(content)); // use initializing constructor for Movable Movable destination; destination.setValue(999); { bool changed = data.tryTakeChanged(&destination); EXPECT_FALSE(changed) << "no set(); tryTakeChanged() should return false!"; if (! changed) { EXPECT_EQ(999, destination.getValue()) << "tryTakeChanged() returned false; value shouldn't have changed!"; } } content.setValue(121); data.set(std::move(content)); { bool changed = data.tryTakeChanged(&destination); EXPECT_TRUE(changed) << "set() called; tryTakeChanged() should return true!"; if (changed) { EXPECT_EQ(121, destination.getValue()) << "tryTakeChanged() returned true; value should have changed!"; } } destination.setValue(888); { bool changed = data.tryTakeChanged(&destination); EXPECT_FALSE(changed) << "no set() since get(); tryTakeChanged() should return false!"; if (! changed) { EXPECT_EQ(888, destination.getValue()) << "tryTakeChanged() returned false; value shouldn't have changed!"; } } destination.setValue(777); { data.take(&destination); EXPECT_EQ(-1, destination.getValue()) << "an earlier tryTakeChanged() should have emptied the container!"; } } } // ==================== MULTI-THREADED TESTS ==================== typedef LockedContainer SharedData; class DataWriter { public: /// data parameter to be passed by non-const reference on purpose. explicit DataWriter(SharedData& data, int start = 0, int step = 1, int loops = 100000) : //NOLINT m_data(data), m_start(start), m_step(step), m_loops(loops), m_isDone(false) { } bool isDone() const { // Direct access to the data member is a hack, since this is called from a different thread. // If this were production code, we would really want to use a LockedContainer instead. // // But in this case, we really want to avoid locking around the flag in order to maximize the likelihood // that adverse race conditions in *actual data* access may pop up, so we do this anyway. return m_isDone; } void start() { m_thread = boost::thread(boost::ref(*this)); } void join() { m_thread.join(); } void operator()() { BigData current; int value = m_start; while (m_loops > 0) { --m_loops; value += m_step; current.setValue1(value); current.setValue2(value); m_data.set(current); } m_isDone = true; } private: DataWriter(const DataWriter&); void operator=(const DataWriter&); SharedData& m_data; int m_start; int m_step; int m_loops; bool m_isDone; boost::thread m_thread; }; void testReaderAndWriters(int numWriters) { // The number of total writes performed by all writers. // // Note that this value shouldn't be too low: when you break the code by eliminating locking altogether, you // don't get reliable failures below about 10000 writes (as tested on a MSI GE70 laptop), presumably because // the threads finish too quickly and thus don't run concurrently. const int NUM_TOTAL_WRITES = 1000000; LockedContainer data; std::vector> writers(numWriters); for (size_t i = 0; i < writers.size(); ++i) { // The step has been chosen so two writers can't ever produce the same value writers[i] = std::unique_ptr(new DataWriter(data, static_cast(i), numWriters, NUM_TOTAL_WRITES / numWriters)); } { BigData value; data.get(&value); EXPECT_EQ(-1, value.getValue1()); EXPECT_EQ(-1, value.getValue2()); } for (size_t i = 0; i < writers.size(); ++i) { writers[i]->start(); } BigData value; while (1) { int z1 = value.getValue1(); bool wasUpdated = data.tryGetChanged(&value); int a1 = value.getValue1(); int a2 = value.getValue2(); EXPECT_EQ(a1, a2); if (wasUpdated) { EXPECT_NE(z1, a1); } else { EXPECT_EQ(z1, a1); } bool allDone = true; for (size_t i = 0; i < writers.size(); ++i) { if (! writers[i]->isDone()) { allDone = false; break; } } if (allDone) { break; } } for (size_t i = 0; i < writers.size(); ++i) { writers[i]->join(); } } TEST(LockedContainerTest, DISABLED_OneWriterThread) { testReaderAndWriters(1); } TEST(LockedContainerTest, TwoWriterThreads) { testReaderAndWriters(2); } TEST(LockedContainerTest, DISABLED_FourWriterThreads) { testReaderAndWriters(4); } TEST(LockedContainerTest, DISABLED_EightWriterThreads) { testReaderAndWriters(8); } TEST(LockedContainerTest, SixteenWriterThreads) { testReaderAndWriters(16); } opensurgsim-0.7.0/SurgSim/Framework/UnitTests/LoggerManagerTest.cpp000066400000000000000000000106761277777236100254740ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for LoggerManager class. #include "SurgSim/Framework/Log.h" #include #include #include using SurgSim::Framework::Logger; using SurgSim::Framework::LoggerManager; using SurgSim::Framework::StreamOutput; class MockOutput : public SurgSim::Framework::LogOutput { public: MockOutput() { } ~MockOutput() { } bool writeMessage(const std::string& message) { logMessage = message; return true; } void reset() { logMessage.clear(); } std::string logMessage; }; TEST(LoggerManagerTest, Constructor) { EXPECT_NO_THROW({std::shared_ptr loggerManager(new LoggerManager());}); } TEST(LoggerManagerTest, DefaultOutput) { auto loggerManager = std::make_shared(); auto output = std::make_shared(std::cerr); loggerManager->setDefaultOutput(output); EXPECT_EQ(output, loggerManager->getDefaultOutput()); } TEST(LoggerManagerTest, DefaultLoggerTest) { auto loggerManager = std::make_shared(); auto defaultLogger = loggerManager->getDefaultLogger(); EXPECT_TRUE(nullptr != defaultLogger); EXPECT_EQ(loggerManager->getDefaultOutput(), defaultLogger->getOutput()); EXPECT_EQ(loggerManager->getThreshold(), defaultLogger->getThreshold()); } TEST(LoggerManagerTest, GetLogger) { auto loggerManager = std::make_shared(); /// getLogger() will create a new logger if a logger with given name is not found auto retrieved = loggerManager->getLogger("test"); EXPECT_TRUE(nullptr != retrieved); /// getLogger() guarantees to return a logger with given name { auto temp = loggerManager->getLogger("logger"); } EXPECT_TRUE(nullptr != loggerManager->getLogger("logger")); } TEST(LoggerManagerTest, Threshold) { auto loggerManager = std::make_shared(); /// Check default log level auto logger0 = loggerManager->getLogger("logger0"); EXPECT_EQ(SurgSim::Framework::LOG_LEVEL_WARNING, logger0->getThreshold()); /// setThreshold(level) will change log level of existing loggers /// and the default log level loggerManager->setThreshold(SurgSim::Framework::LOG_LEVEL_CRITICAL); EXPECT_EQ(SurgSim::Framework::LOG_LEVEL_CRITICAL, loggerManager->getThreshold()); EXPECT_EQ(SurgSim::Framework::LOG_LEVEL_CRITICAL, logger0->getThreshold()); /// setThreshold(level) will affect log level of newly created loggers auto logger1 = loggerManager->getLogger("logger1"); EXPECT_EQ(SurgSim::Framework::LOG_LEVEL_CRITICAL, logger1->getThreshold()); auto logger2 = loggerManager->getLogger("logger2"); auto logger3 = loggerManager->getLogger("logger3"); auto testLogger = loggerManager->getLogger("testLogger"); /// setThreshold(pattern, level) will change log level of existing loggers /// which match given name pattern /// Logger with different pattern will not be changed /// Default log level will not be affected loggerManager->setThreshold("logger", SurgSim::Framework::LOG_LEVEL_WARNING); EXPECT_EQ(SurgSim::Framework::LOG_LEVEL_WARNING, logger2->getThreshold()); EXPECT_EQ(SurgSim::Framework::LOG_LEVEL_WARNING, logger3->getThreshold()); EXPECT_NE(SurgSim::Framework::LOG_LEVEL_WARNING, testLogger->getThreshold()); EXPECT_NE(SurgSim::Framework::LOG_LEVEL_WARNING, loggerManager->getThreshold()); /// setThreshold(pattern, level) will affect newly created loggers if the logger's name matches the pattern auto testLogger2 = loggerManager->getLogger("testLogger2"); EXPECT_NE(SurgSim::Framework::LOG_LEVEL_WARNING, testLogger2->getThreshold()); auto logger5 = loggerManager->getLogger("logger5"); EXPECT_EQ(SurgSim::Framework::LOG_LEVEL_WARNING, logger5->getThreshold()); /// Logger manager should own the logger. loggerManager->getLogger("xxx")->setThreshold(SurgSim::Framework::LOG_LEVEL_DEBUG); EXPECT_EQ(SurgSim::Framework::LOG_LEVEL_DEBUG, loggerManager->getLogger("xxx")->getThreshold()); }opensurgsim-0.7.0/SurgSim/Framework/UnitTests/LoggerTest.cpp000066400000000000000000000213511277777236100241710ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the SURGSIM_LOG_*() macros and the related classes. #include #include "SurgSim/Framework/Log.h" #include #include #include #include using SurgSim::Framework::Logger; using SurgSim::Framework::FileOutput; ::testing::AssertionResult isContained(const std::string& expected, const std::string& argument) { if (std::string::npos != argument.find(expected)) { return ::testing::AssertionSuccess(); } else { return ::testing::AssertionFailure() << expected << " not contained in " << argument; } } class MockOutput : public SurgSim::Framework::LogOutput { public: MockOutput() { } ~MockOutput() { } bool writeMessage(const std::string& message) { logMessage = message; return true; } void reset() { logMessage = ""; } std::string logMessage; }; TEST(LoggerTest, MessageTest) { auto logger = Logger::getLogger("TestLogger"); auto output = std::make_shared(); logger->setOutput(output); logger->writeMessage("TestMessage"); EXPECT_EQ("TestMessage", output->logMessage); } TEST(LoggerTest, LogMacroTest) { auto logger = Logger::getLogger("TestLogger"); auto output = std::make_shared(); logger->setOutput(output); logger->setThreshold(SurgSim::Framework::LOG_LEVEL_WARNING); output->reset(); SURGSIM_LOG(logger, CRITICAL) << "Test Text"; EXPECT_TRUE(isContained("Test Text",output->logMessage)); output->reset(); SURGSIM_LOG(logger, DEBUG) << "Missing Text"; EXPECT_EQ("", output->logMessage); output->reset(); SURGSIM_LOG(logger, WARNING) << "Exactly At Threshold"; EXPECT_TRUE(isContained("Exactly At Threshold", output->logMessage)); } TEST(LoggerTest, SharedPtrTest) { auto logger = Logger::getLogger("TestLogger"); auto output = std::make_shared(); logger->setOutput(output); logger->setThreshold(SurgSim::Framework::LOG_LEVEL_WARNING); output->reset(); SURGSIM_LOG(logger, CRITICAL) << "Test Text"; EXPECT_TRUE(isContained("Test Text", output->logMessage)); output->reset(); SURGSIM_LOG(logger, DEBUG) << "Missing Text"; EXPECT_EQ("", output->logMessage); output->reset(); SURGSIM_LOG(logger, WARNING) << "Exactly At Threshold"; EXPECT_TRUE(isContained("Exactly At Threshold", output->logMessage)); } TEST(LoggerTest, LevelSpecificMacroTest) { auto logger = Logger::getLogger("TestLogger"); auto output = std::make_shared(); logger->setOutput(output); logger->setThreshold(SurgSim::Framework::LOG_LEVEL_WARNING); output->reset(); SURGSIM_LOG_CRITICAL(logger) << "Test Text"; EXPECT_TRUE(isContained("Test Text", output->logMessage)); output->reset(); SURGSIM_LOG_DEBUG(logger) << "Missing Text"; EXPECT_EQ("", output->logMessage); output->reset(); SURGSIM_LOG_WARNING(logger) << "Exactly At Threshold"; EXPECT_TRUE(isContained("Exactly At Threshold", output->logMessage)); } TEST(LoggerTest, IfMacroTest) { auto logger = Logger::getLogger("TestLogger"); auto output = std::make_shared(); logger->setOutput(output); logger->setThreshold(SurgSim::Framework::LOG_LEVEL_WARNING); output->reset(); SURGSIM_LOG_IF(true, logger, CRITICAL) << "Test Text"; EXPECT_TRUE(isContained("Test Text", output->logMessage)); output->reset(); SURGSIM_LOG_IF(false, logger, CRITICAL) << "Test Text"; EXPECT_EQ("", output->logMessage); output->reset(); SURGSIM_LOG_IF(true, logger, DEBUG) << "Missing Text"; EXPECT_EQ("", output->logMessage); output->reset(); SURGSIM_LOG_IF(false, logger, DEBUG) << "Missing Text"; EXPECT_EQ("", output->logMessage); output->reset(); SURGSIM_LOG_IF(true, logger, WARNING) << "Exactly At Threshold"; EXPECT_TRUE(isContained("Exactly At Threshold", output->logMessage)); output->reset(); SURGSIM_LOG_IF(false, logger, WARNING) << "Exactly At Threshold"; EXPECT_EQ("", output->logMessage); } TEST(LoggerTest, OnceMacroTest) { auto logger = Logger::getLogger("TestLogger"); auto output = std::make_shared(); logger->setOutput(output); logger->setThreshold(SurgSim::Framework::LOG_LEVEL_WARNING); for (int i = 0; i < 3; ++i) { output->reset(); SURGSIM_LOG_ONCE(logger, CRITICAL) << "Test Text"; if (i == 0) { EXPECT_TRUE(isContained("Test Text", output->logMessage)); } else { EXPECT_EQ("", output->logMessage); } output->reset(); SURGSIM_LOG_ONCE(logger, DEBUG) << "Missing Text"; EXPECT_EQ("", output->logMessage); output->reset(); SURGSIM_LOG_ONCE(logger, CRITICAL) << "More Text"; if (i == 0) { EXPECT_TRUE(isContained("More Text", output->logMessage)); } else { EXPECT_EQ("", output->logMessage); } } } TEST(LoggerTest, OnceIfMacroTest) { auto logger = Logger::getLogger("TestLogger"); auto output = std::make_shared(); logger->setOutput(output); logger->setThreshold(SurgSim::Framework::LOG_LEVEL_WARNING); for (int i = 0; i < 3; ++i) { output->reset(); SURGSIM_LOG_ONCE_IF(i >= 0, logger, CRITICAL) << "Test Text"; if (i == 0) { EXPECT_TRUE(isContained("Test Text", output->logMessage)); } else { EXPECT_EQ("", output->logMessage); } output->reset(); SURGSIM_LOG_ONCE_IF(i >= 1, logger, DEBUG) << "Missing Text"; EXPECT_EQ("", output->logMessage); output->reset(); SURGSIM_LOG_ONCE_IF(i >= 2, logger, CRITICAL) << "More Text"; if (i == 2) { EXPECT_TRUE(isContained("More Text", output->logMessage)); } else { EXPECT_EQ("", output->logMessage); } } } TEST(LoggerTest, EndOfLineTest) { auto logger = Logger::getLogger("TestLogger"); auto output = std::make_shared(); logger->setOutput(output); logger->setThreshold(SurgSim::Framework::LOG_LEVEL_WARNING); output->reset(); SURGSIM_LOG_CRITICAL(logger) << "foo" << std::endl << "bar"; EXPECT_TRUE(isContained("foo\nbar", output->logMessage)); } TEST(LoggerTest, LogLevelTest) { auto logger = Logger::getLogger("TestLogger"); auto output = std::make_shared(); logger->setOutput(output); logger->setThreshold(SurgSim::Framework::LOG_LEVEL_DEBUG); output->reset(); SURGSIM_LOG_DEBUG(logger) << "a message"; EXPECT_TRUE(isContained("DEBUG", output->logMessage)); output->reset(); SURGSIM_LOG_INFO(logger) << "a message"; EXPECT_TRUE(isContained("INFO", output->logMessage)); output->reset(); SURGSIM_LOG_WARNING(logger) << "a message"; EXPECT_TRUE(isContained("WARNING", output->logMessage)); output->reset(); SURGSIM_LOG_SEVERE(logger) << "a message"; EXPECT_TRUE(isContained("SEVERE", output->logMessage)); output->reset(); SURGSIM_LOG_CRITICAL(logger) << "a message"; EXPECT_TRUE(isContained("CRITICAL", output->logMessage)); } TEST(LoggerTest, ManipulatorTest) { auto logger = Logger::getLogger("TestLogger"); auto output = std::make_shared(); logger->setOutput(output); output->reset(); SURGSIM_LOG_WARNING(logger) << "aAa" << std::endl << "bBb"; EXPECT_TRUE(isContained("aAa\nbBb", output->logMessage) || isContained("aAa\r\n\bBb", output->logMessage)) << "message: '" << output->logMessage << "'"; output->reset(); SURGSIM_LOG_WARNING(logger) << "[" << std::hex << std::setw(5) << std::setfill('0') << 0x1234 << "]"; EXPECT_TRUE(isContained("[01234]", output->logMessage)) << "message: '" << output->logMessage << "'"; output->reset(); // The next message should not show any evidence of previous manipulators. SURGSIM_LOG_WARNING(logger) << "[" << 987 << "]"; EXPECT_TRUE(isContained("[987]", output->logMessage)) << "message: '" << output->logMessage << "'"; } class FileOutputTest : public ::testing::Test { public: void SetUp() { output = std::make_shared("test.log"); } void TearDown() { output = nullptr; boost::filesystem::remove("test.log"); } static std::shared_ptr output; }; std::shared_ptr FileOutputTest::output; TEST_F(FileOutputTest, BasicTest) { EXPECT_TRUE(boost::filesystem::exists("test.log")); } TEST_F(FileOutputTest, CreationFailure) { ASSERT_ANY_THROW(FileOutput("asdfasdf/test.log")); } TEST_F(FileOutputTest, Write) { output->writeMessage("TestMessage"); output = nullptr; std::ifstream stream("test.log"); EXPECT_FALSE(stream.fail()); std::string message; stream >> message; EXPECT_EQ("TestMessage",message); } opensurgsim-0.7.0/SurgSim/Framework/UnitTests/MockObjects.cpp000066400000000000000000000035061277777236100243170ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Framework/UnitTests/MockObjects.h" SURGSIM_REGISTER(SurgSim::Framework::Component, MockComponent, MockComponent); MockComponent::MockComponent(const std::string& name, bool succeedInit, bool succeedWakeUp) : Component(name), succeedWithInit(succeedInit), succeedWithWakeUp(succeedWakeUp), didWakeUp(false), didInit(false), didRetire(false) { SURGSIM_ADD_SERIALIZABLE_PROPERTY( MockComponent, bool, SucceedWithInit, getSucceedWithInit, setSucceedWithInit); SURGSIM_ADD_SERIALIZABLE_PROPERTY( MockComponent, bool, SucceedWithWakeUp, getSucceedWithWakeUp, setSucceedWithWakeUp); } MockComponent::~MockComponent() { } bool MockComponent::doInitialize() { didInit = true; return succeedWithInit; } bool MockComponent::doWakeUp() { didWakeUp = true; return succeedWithWakeUp; } void MockComponent::doRetire() { didRetire = true; Component::doRetire(); } bool MockComponent::getSucceedWithInit() const { return succeedWithInit; } void MockComponent::setSucceedWithInit(bool val) { succeedWithInit = val; } bool MockComponent::getSucceedWithWakeUp() const { return succeedWithWakeUp; } void MockComponent::setSucceedWithWakeUp(bool val) { succeedWithWakeUp = val; } opensurgsim-0.7.0/SurgSim/Framework/UnitTests/MockObjects.h000066400000000000000000000211031277777236100237550ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest LLC. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_FRAMEWORK_UNITTESTS_MOCKOBJECTS_H #define SURGSIM_FRAMEWORK_UNITTESTS_MOCKOBJECTS_H #include #include "SurgSim/Framework/Assert.h" #include "SurgSim/Framework/BasicThread.h" #include "SurgSim/Framework/Behavior.h" #include "SurgSim/Framework/Component.h" #include "SurgSim/Framework/ComponentManager.h" #include "SurgSim/Framework/Representation.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Framework/SamplingMetricBase.h" #include "SurgSim/Framework/Scene.h" #include "SurgSim/Framework/SceneElement.h" /// Class to catch the calls made to the scene element, does nothing class MockSceneElement : public SurgSim::Framework::SceneElement { public: explicit MockSceneElement(const std::string& name = "MockSceneElement") : SceneElement(name), didInit(false), didUpdate(false), didLateUpdate(false), didFixedUpdate(false) { m_localRuntime = std::make_shared(); setRuntime(m_localRuntime); m_localScene = m_localRuntime->getScene(); setScene(m_localScene); } virtual void update(double dt) { didUpdate = true; } virtual void lateUpdate(double dt) { didLateUpdate = true; } virtual void fixedRateUpdate(double dt) { didFixedUpdate = true; } virtual bool doInitialize() { didInit = true; return didInit; }; bool didInit; bool didUpdate; bool didLateUpdate; bool didFixedUpdate; private: std::shared_ptr m_localRuntime; std::shared_ptr m_localScene; }; class MockThread : public SurgSim::Framework::BasicThread { public: explicit MockThread(int runCount = -1) : count(runCount), totalTime(0.0), didBeforeStop(false), didInitialize(false), didStartUp(false) { } virtual ~MockThread() { } int count; double totalTime; bool didBeforeStop; bool runIndefinetly; bool didInitialize; bool didStartUp; private: virtual bool doInitialize() { didInitialize = true; return true; }; virtual bool doStartUp() { didStartUp = true; return true; }; virtual bool doUpdate(double dt) { --count; totalTime += dt; return count != 0; }; virtual void doBeforeStop() { didBeforeStop = true; }; }; class MockComponent : public SurgSim::Framework::Component { public: explicit MockComponent(const std::string& name, bool succeedInit = true, bool succeedWakeUp = true); SURGSIM_CLASSNAME(MockComponent); virtual ~MockComponent(); bool doInitialize() override; bool doWakeUp() override; void doRetire() override; bool getSucceedWithInit() const; void setSucceedWithInit(bool val); bool getSucceedWithWakeUp() const; void setSucceedWithWakeUp(bool val); bool succeedWithInit; bool succeedWithWakeUp; bool didWakeUp; bool didInit; bool didRetire; }; class MockBehavior : public SurgSim::Framework::Behavior { public: explicit MockBehavior(const std::string& name, bool succeedInit = true, bool succeedWakeUp = true) : Behavior(name), succeedWithInit(succeedInit), succeedWithWakeUp(succeedWakeUp), updateCount(0) { } virtual ~MockBehavior() { } virtual bool doInitialize() { return succeedWithInit; } virtual bool doWakeUp() { return succeedWithWakeUp; } virtual void update(double dt) { updateCount++; } bool succeedWithInit; bool succeedWithWakeUp; int updateCount; }; class MockManager : public SurgSim::Framework::ComponentManager { public: explicit MockManager(bool succeedInit = true, bool succeedStartup = true) : succeedInit(succeedInit), succeedStartup(succeedStartup), didInitialize(false), didStartUp(false), didBeforeStop(false), count(0) { } virtual ~MockManager() { } int getType() const override { return SurgSim::Framework::MANAGER_TYPE_NONE; } const std::vector>& getComponents() { return m_components; } bool testTryAddComponent(const std::shared_ptr& component) { return executeAdditions(component); } bool testTryRemoveComponent(const std::shared_ptr& component) { return executeRemovals(component); } void testProcessComponents() { processComponents(); } bool succeedInit; bool succeedStartup; bool didInitialize; bool didStartUp; bool didBeforeStop; int count; private: virtual bool doInitialize() { didInitialize = true; return succeedInit; }; virtual bool doStartUp() { didStartUp = true; return succeedStartup; }; virtual bool doUpdate(double dt) { ++count; processComponents(); return true; }; virtual void doBeforeStop() { didBeforeStop = true; retireComponents(m_components); ComponentManager::doBeforeStop(); } bool executeAdditions(const std::shared_ptr& component) override { return tryAddComponent(component, &m_components) != nullptr; } bool executeRemovals(const std::shared_ptr& component) override { return tryRemoveComponent(component, &m_components); } std::vector> m_components; }; class MockRepresentation : public SurgSim::Framework::Representation { public: /// Constructor /// \param name Name of the representation /// \post m_pose is initialized to identity /// \post m_didInit is initialized to false /// \post m_didWakeUp is initialized to false explicit MockRepresentation(const std::string& name) : SurgSim::Framework::Representation(name), m_didInit(false), m_didWakeUp(false) { } SURGSIM_CLASSNAME(MockRepresentation); /// Returns true if the representation has been initialized, otherwise false bool didInit() const { return m_didInit; } /// Returns true if the representation has been woken up, otherwise false bool didWakeUp() const { return m_didWakeUp; } private: /// Whether the representation has been initialized bool m_didInit; /// Whether the representation has been woken up bool m_didWakeUp; /// Initializes the representation /// \return True if succeeds, otherwise false virtual bool doInitialize() { m_didInit = true; return true; } /// Wakes up the representation /// \return True if succeeds, otherwise false virtual bool doWakeUp() { m_didWakeUp = true; return true; } }; class MockSamplingMetric : public SurgSim::Framework::SamplingMetricBase { public: /// Constructor /// \param name Name of the representation explicit MockSamplingMetric(const std::string& name, bool ableToMeasure = true, double initialMeasurement = 0.0) : SurgSim::Framework::SamplingMetricBase(name), m_canMeasure(ableToMeasure), m_measurement(initialMeasurement) { } SURGSIM_CLASSNAME(MockSamplingMetric); /// Type of the individual entries in the measurement data structure. The first field of the /// pair holds the elapsed time since the start of the measurement process and the second field /// of the pair holds the measurement value obtained at that time. typedef SurgSim::Framework::SamplingMetricBase::MeasurementEntryType MeasurementEntryType; /// Type of the cumulative entries data structure. The code current caps the number of entries at a /// user prescribed value to keep from overwriting all of memory when the process is allowed to run /// unchecked over long periods. The maximum number of entries is nominally capped at 30 minutes of samples /// taken 30 times per second, but it can be adjusted using he setMaxNumberOfMeasurements call. Note /// that we always save the last measurements taken. After the limit is reached we delete the oldest /// current entry every time we need to add a new measurement. typedef SurgSim::Framework::SamplingMetricBase::MeasurementsType MeasurementsType; private: /// Whether the representation has been initialized bool m_canMeasure; /// Next measurement value to return. double m_measurement; /// Return if the measurement can be made at this point /// \return true or false bool canMeasure(double dt) { return m_canMeasure; } double performMeasurement(double dt) { return ++m_measurement; } }; #endif // SURGSIM_FRAMEWORK_UNITTESTS_MOCKOBJECTS_H opensurgsim-0.7.0/SurgSim/Framework/UnitTests/ObjectFactoryTests.cpp000066400000000000000000000046011277777236100256720ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Framework/ObjectFactory.h" namespace { class TestClass { public: TestClass() : stringValue("default"), className("TestClass") { } ~TestClass() { } explicit TestClass(const std::string& val) : stringValue(val) { } std::string stringValue; std::string className; }; class TestClassA : public TestClass { public: TestClassA() : TestClass("a") { className = "TestClassA"; } explicit TestClassA(const std::string& val) : TestClass(val) { className = "TestClassA"; } }; class TestClassB : public TestClass { public: TestClassB() : TestClass("b") { className = "TestClassB"; } explicit TestClassB(const std::string& val) : TestClass(val) { className = "TestClassB"; } }; } namespace SurgSim { namespace Framework { TEST(ObjectFactoryTests, Single) { ObjectFactory factory; factory.registerClass("TestClassA"); factory.registerClass("TestClassB"); auto a = factory.create("TestClassA"); EXPECT_NE(nullptr, a); EXPECT_EQ("a", a->stringValue); auto b = factory.create("TestClassB"); EXPECT_NE(nullptr, b); EXPECT_EQ("b", b->stringValue); EXPECT_ANY_THROW(factory.create("xxx")); } TEST(ObjectFactoryTests, OneParameter) { ObjectFactory1 factory; factory.registerClass("TestClassA"); factory.registerClass("TestClassB"); auto a = factory.create("TestClassA", "abc"); EXPECT_NE(nullptr, a); EXPECT_EQ("abc", a->stringValue); EXPECT_EQ("TestClassA", a->className); auto b = factory.create("TestClassB", "cde"); EXPECT_NE(nullptr, b); EXPECT_EQ("cde", b->stringValue); EXPECT_EQ("TestClassB", b->className); EXPECT_ANY_THROW(factory.create("xxx","xyz")); } }; // Framework }; // SurgSimopensurgsim-0.7.0/SurgSim/Framework/UnitTests/ReuseFactoryTest.cpp000066400000000000000000000054021277777236100253640ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Framework/ReuseFactory.h" using SurgSim::Framework::ReuseFactory; class MockObject { public: MockObject() { } ~MockObject() { } }; TEST(ReuseFactoryTest, InitTest) { ASSERT_NO_THROW({ReuseFactory();}); } TEST(ReuseFactoryTest, GetNewTest) { ReuseFactory objectFactory; std::shared_ptr object = objectFactory.getInstance(); ASSERT_NE(nullptr, object); } TEST(ReuseFactoryTest, DeleteTest) { ReuseFactory objectFactory; std::weak_ptr weakPointer; { std::shared_ptr sharedPointer; { // Get a new object. std::shared_ptr object = objectFactory.getInstance(); ASSERT_NE(nullptr, object); weakPointer = object; ASSERT_NE(nullptr, weakPointer.lock()); // Make another shared pointer to the object. sharedPointer = object; } // The object should not have been deleted yet, as there is still a shared pointer to it. ASSERT_NE(nullptr, weakPointer.lock()); } // It should be deleted now. EXPECT_EQ(nullptr, weakPointer.lock()) << "The object should no longer exist."; } TEST(ReuseFactoryTest, ReuseTest) { ReuseFactory objectFactory; std::weak_ptr weakPointer; MockObject* pointer; // Get a new object { std::shared_ptr object = objectFactory.getInstance(); ASSERT_NE(nullptr, object); weakPointer = object; ASSERT_NE(nullptr, weakPointer.lock()); pointer = object.get(); } // It should be deleted now. EXPECT_EQ(nullptr, weakPointer.lock()) << "Weak pointer to object = " << weakPointer.lock(); // Reuse the object that has been deleted. { std::shared_ptr object = objectFactory.getInstance(); ASSERT_NE(nullptr, object); EXPECT_EQ(pointer, object.get()) << "The retrieved object should be the object that was previously deleted."; // Get another object, which should be new. { std::shared_ptr object = objectFactory.getInstance(); ASSERT_NE(nullptr, object); EXPECT_NE(pointer, object.get()) << "We should have a completely new object, not the same previous object."; } } } opensurgsim-0.7.0/SurgSim/Framework/UnitTests/RuntimeTest.cpp000066400000000000000000000227701277777236100244030ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Framework/Scene.h" #include "SurgSim/Framework/SceneElement.h" #include "MockObjects.h" //NOLINT using SurgSim::Framework::Runtime; using SurgSim::Framework::Scene; using SurgSim::Framework::Logger; TEST(RuntimeTest, Constructor) { EXPECT_NO_THROW({std::shared_ptr runtime(new Runtime());}); std::shared_ptr runtime(new Runtime()); EXPECT_NE(nullptr, runtime->getScene()); EXPECT_NO_THROW(std::make_shared()); EXPECT_NO_THROW(std::make_shared("config.txt")); EXPECT_THROW(std::make_shared("Non-exist-file"), SurgSim::Framework::AssertionFailure); } TEST(RuntimeTest, AddManager) { std::shared_ptr runtime(new Runtime()); std::shared_ptr manager(new MockManager()); runtime->addManager(manager); EXPECT_TRUE(runtime->start()); EXPECT_TRUE(manager->isInitialized()); EXPECT_TRUE(runtime->isRunning()); EXPECT_TRUE(runtime->stop()); EXPECT_FALSE(runtime->isRunning()); EXPECT_FALSE(manager->isRunning()); } TEST(RuntimeTest, InitFailureDeathTest) { std::shared_ptr runtime(new Runtime()); std::shared_ptr managerSucceeds(new MockManager()); std::shared_ptr managerFails(new MockManager(false, true)); runtime->addManager(managerSucceeds); runtime->addManager(managerFails); ASSERT_DEATH(runtime->start(), ""); } TEST(RuntimeTest, StartupFailureDeathTest) { std::shared_ptr runtime(new Runtime()); std::shared_ptr managerSucceeds(new MockManager()); std::shared_ptr managerFails(new MockManager(true, false)); runtime->addManager(managerSucceeds); runtime->addManager(managerFails); ASSERT_DEATH(runtime->start(), ""); } TEST(RuntimeTest, SceneInitialization) { std::shared_ptr runtime = std::make_shared(); std::shared_ptr manager = std::make_shared(); runtime->addManager(manager); std::shared_ptr scene = runtime->getScene(); std::vector> elements; std::vector> components; elements.push_back(std::make_shared("one")); elements.push_back(std::make_shared("two")); components.push_back(std::make_shared("one")); components.push_back(std::make_shared("two")); components.push_back(std::make_shared("three")); components.push_back(std::make_shared("four")); scene->addSceneElement(elements[0]); scene->addSceneElement(elements[1]); elements[0]->addComponent(components[0]); elements[0]->addComponent(components[1]); elements[1]->addComponent(components[2]); elements[1]->addComponent(components[3]); EXPECT_FALSE(manager->didInitialize); EXPECT_FALSE(manager->didStartUp); EXPECT_FALSE(manager->didBeforeStop); runtime->start(); EXPECT_TRUE(manager->didInitialize); EXPECT_TRUE(manager->didStartUp); EXPECT_FALSE(manager->didBeforeStop); for (int i = 0; i < 2; ++i) { EXPECT_NE(nullptr, elements[i]->getRuntime()); EXPECT_TRUE(elements[i]->didInit); } for (int i = 0; i < 4; i++) { EXPECT_TRUE(components[i]->didInit); } runtime->stop(); EXPECT_TRUE(manager->didBeforeStop); for (int i = 0; i < 4; i++) { EXPECT_TRUE(components[i]->didRetire); } } TEST(RuntimeTest, PausedStep) { std::shared_ptr runtime(new Runtime()); std::shared_ptr manager1(new MockManager()); std::shared_ptr manager2(new MockManager()); runtime->addManager(manager1); runtime->addManager(manager2); runtime->start(true); EXPECT_TRUE(runtime->isPaused()); boost::this_thread::sleep(boost::posix_time::milliseconds(150)); EXPECT_TRUE(manager1->isSynchronous()); EXPECT_TRUE(manager2->isSynchronous()); int count = manager1->count; runtime->step(); boost::this_thread::sleep(boost::posix_time::milliseconds(150)); EXPECT_EQ(count + 1, manager1->count); runtime->step(); boost::this_thread::sleep(boost::posix_time::milliseconds(150)); EXPECT_EQ(count + 2, manager1->count); runtime->stop(); } TEST(RuntimeTest, PauseResume) { std::shared_ptr runtime(new Runtime()); std::shared_ptr manager1(new MockManager()); std::shared_ptr manager2(new MockManager()); runtime->addManager(manager1); runtime->addManager(manager2); runtime->start(false); boost::this_thread::sleep(boost::posix_time::milliseconds(150)); EXPECT_FALSE(manager1->isSynchronous()); EXPECT_FALSE(manager2->isSynchronous()); runtime->pause(); boost::this_thread::sleep(boost::posix_time::milliseconds(150)); EXPECT_TRUE(manager1->isSynchronous()); EXPECT_TRUE(manager2->isSynchronous()); runtime->step(); boost::this_thread::sleep(boost::posix_time::milliseconds(150)); runtime->step(); boost::this_thread::sleep(boost::posix_time::milliseconds(150)); runtime->resume(); boost::this_thread::sleep(boost::posix_time::milliseconds(150)); EXPECT_FALSE(manager1->isSynchronous()); EXPECT_FALSE(manager2->isSynchronous()); runtime->stop(); } TEST(RuntimeTest, AddComponentAddDuringRuntime) { std::shared_ptr runtime = std::make_shared(); std::shared_ptr manager = std::make_shared(); runtime->addManager(manager); std::shared_ptr scene = runtime->getScene(); std::vector> components; auto element = std::make_shared("one"); components.push_back(std::make_shared("one")); components.push_back(std::make_shared("two")); scene->addSceneElement(element); element->addComponent(components[0]); runtime->start(true); EXPECT_TRUE(manager->didInitialize); EXPECT_TRUE(manager->didStartUp); EXPECT_FALSE(manager->didBeforeStop); // Make sure we are out of initialization completely runtime->step(); EXPECT_FALSE(components[1]->isInitialized()); EXPECT_FALSE(components[1]->isAwake()); EXPECT_TRUE(element->addComponent(components[1])); EXPECT_TRUE(components[1]->isInitialized()); EXPECT_FALSE(components[1]->isAwake()); runtime->step(); runtime->step(); // Right now step is still non-blocking, make sure the thread has finished processing... EXPECT_TRUE(components[1]->isInitialized()); EXPECT_TRUE(components[1]->isAwake()); boost::this_thread::sleep(boost::posix_time::milliseconds(150)); runtime->stop(); EXPECT_FALSE(components[1]->isAwake()); } TEST(RuntimeTest, LoadAndAddScene) { auto runtime = std::make_shared("config.txt"); EXPECT_NO_THROW(runtime->loadScene("SceneTestData/scene.yaml")); auto scene0 = runtime->getScene(); EXPECT_NE(nullptr, scene0); EXPECT_EQ(2L, scene0->getSceneElements().size()); EXPECT_NO_THROW(runtime->loadScene("SceneTestData/scene.yaml")); auto scene1 = runtime->getScene(); EXPECT_NE(nullptr, scene1); EXPECT_NE(scene0, scene1); EXPECT_NO_THROW(runtime->addSceneElements("SceneTestData/elements.yaml")); auto scene2 = runtime->getScene(); EXPECT_NE(nullptr, scene2); EXPECT_EQ(scene1, scene2); EXPECT_EQ(4L, scene2->getSceneElements().size()); } TEST(RuntimeTest, LoadAndDuplicate) { auto runtime = std::make_shared("config.txt"); EXPECT_NO_THROW(runtime->loadScene("SceneTestData/scene.yaml")); auto scene0 = runtime->getScene(); auto elements0 = runtime->duplicateSceneElements("SceneTestData/element.yaml"); auto elements1 = runtime->duplicateSceneElements("SceneTestData/element.yaml"); EXPECT_EQ(1L, elements0.size()); EXPECT_EQ(1L, elements1.size()); // Without the correct cloning, both of these elements would point to the same instance which would be bad auto component0 = elements0[0]->getComponent("clone"); auto component1 = elements1[0]->getComponent("clone"); ASSERT_NE(nullptr, component0); ASSERT_NE(nullptr, component1); EXPECT_NE(component0, component1); component0->setLocalActive(false); EXPECT_NE(component0->isLocalActive(), component1->isLocalActive()); } TEST(RuntimeTest, DuplicateBadYaml) { auto runtime = std::make_shared("config.txt"); EXPECT_NO_THROW(runtime->loadScene("SceneTestData/scene.yaml")); auto scene0 = runtime->getScene(); EXPECT_ANY_THROW(auto elements0 = runtime->duplicateSceneElements("SceneTestData/bad.yaml");); } TEST(RuntimeTest, ManagerAccess) { auto runtime = std::make_shared(); auto managers = runtime->getManagers(); EXPECT_EQ(0L, managers.size()); auto manager1 = std::make_shared(); auto manager2 = std::make_shared(); runtime->addManager(manager1); runtime->addManager(manager2); managers = runtime->getManagers(); EXPECT_EQ(2L, managers.size()); } TEST(RuntimeTest, TypedManagerAccess) { auto runtime = std::make_shared(); auto manager1 = std::make_shared(); runtime->addManager(manager1); auto manager = runtime->getManager(); EXPECT_EQ(manager1, manager); auto impossible = runtime->getManager(); EXPECT_EQ(nullptr, impossible); }opensurgsim-0.7.0/SurgSim/Framework/UnitTests/SamplingMetricBaseTest.cpp000066400000000000000000000071601277777236100264650ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include "SurgSim/Framework/SamplingMetricBase.h" #include "SurgSim/Framework/UnitTests/MockObjects.h" TEST(SamplingMetricBaseTest, SamplingMetricBaseInitTest) { std::shared_ptr mockMetric(std::make_shared("Test Metric")); auto samples = mockMetric->getMeasurementValues(); // Test initialization settings. EXPECT_EQ("Test Metric", mockMetric->getName()); EXPECT_EQ(0, samples.size()); EXPECT_EQ(0.0, mockMetric->getElapsedTime()); EXPECT_EQ(SurgSim::Framework::MANAGER_TYPE_BEHAVIOR, mockMetric->getTargetManagerType()); EXPECT_LT(0u, mockMetric->getMaxNumberOfMeasurements()); EXPECT_EQ(0, mockMetric->getCurrentNumberOfMeasurements()); } TEST(SamplingMetricBaseTest, SetGetTests) { std::shared_ptr mockMetric(std::make_shared("Test Metric")); auto samples = mockMetric->getMeasurementValues(); // Test sets and gets. mockMetric->setName("Test2"); mockMetric->setMaxNumberOfMeasurements(5); mockMetric->setTargetManagerType(SurgSim::Framework::MANAGER_TYPE_PHYSICS); EXPECT_EQ("Test2", mockMetric->getName()); EXPECT_EQ(5, mockMetric->getMaxNumberOfMeasurements()); EXPECT_EQ(SurgSim::Framework::MANAGER_TYPE_PHYSICS, mockMetric->getTargetManagerType()); } TEST(SamplingMetricBaseTest, AbleToPerformMeasurementsTests) { std::shared_ptr mockMetric(std::make_shared("Test Metric", true, 1.0)); // Make 10 updates mockMetric->setMaxNumberOfMeasurements(5); for (int counter = 0; counter < 10; ++counter) { mockMetric->update(static_cast(counter)); } auto samples = mockMetric->getMeasurementValues(); EXPECT_EQ(5, mockMetric->getCurrentNumberOfMeasurements()); EXPECT_EQ(5, samples.size()); EXPECT_EQ(45.0, mockMetric->getElapsedTime()); // When we check the results, our deque holds 5 places. We skip the // first 5 because they already rolled off the end. The metric value // starts at one and accumulates. At position 5, we should already have // a value of 15 accumulated. int counter = 5; int accumulator = 15; for (auto sampleIterator = samples.begin(); sampleIterator != samples.end(); ++sampleIterator) { EXPECT_EQ(static_cast(accumulator), sampleIterator->first); EXPECT_EQ(static_cast(counter + 2), sampleIterator->second); ++counter; accumulator += counter; } } TEST(SamplingMetricBaseTest, UnableToPerformMeasurementsTests) { std::shared_ptr mockMetric(std::make_shared("Test Metric", false, 1.0)); double accumulatedTime = 0.0; // Make 10 updates mockMetric->setMaxNumberOfMeasurements(5); for (int counter = 0; counter < 10; ++counter) { mockMetric->update(static_cast(counter)); accumulatedTime += counter; } auto samples = mockMetric->getMeasurementValues(); EXPECT_EQ(0, mockMetric->getCurrentNumberOfMeasurements()); EXPECT_EQ(0, samples.size()); EXPECT_EQ(accumulatedTime, mockMetric->getElapsedTime()); } opensurgsim-0.7.0/SurgSim/Framework/UnitTests/SceneElementTest.cpp000066400000000000000000000327651277777236100253340ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include "SurgSim/Framework/BasicSceneElement.h" #include "SurgSim/Framework/PoseComponent.h" #include "SurgSim/Framework/Scene.h" #include "SurgSim/Framework/SceneElement.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Framework/ApplicationData.h" #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Testing/Utilities.h" #include "MockObjects.h" //NOLINT using SurgSim::Framework::Component; using SurgSim::Framework::PoseComponent; using SurgSim::Framework::SceneElement; TEST(SceneElementTest, Constructor) { ASSERT_NO_THROW(MockSceneElement element); } TEST(SceneElementTest, Pose) { using SurgSim::Math::makeRigidTransform; using SurgSim::Math::Quaterniond; using SurgSim::Math::RigidTransform3d; using SurgSim::Math::Vector3d; MockSceneElement element; EXPECT_TRUE(element.getPose().isApprox(RigidTransform3d::Identity())); RigidTransform3d pose(makeRigidTransform(Quaterniond(0.0, 1.0, 0.0, 0.0), Vector3d(1.0, 2.0, 3.0))); element.setPose(pose); EXPECT_TRUE(element.getPose().isApprox(pose)); EXPECT_TRUE(element.getPoseComponent()->getPose().isApprox(pose)); } TEST(SceneElementTest, UpdateFunctions) { MockSceneElement element; element.update(1.0); EXPECT_TRUE(element.didUpdate); element.lateUpdate(1.0); EXPECT_TRUE(element.didLateUpdate); element.fixedRateUpdate(1.0); EXPECT_TRUE(element.didFixedUpdate); } TEST(SceneElementTest, AddAndTestComponentsAssembly) { std::shared_ptr runtime = std::make_shared(); std::shared_ptr manager = std::make_shared(); std::shared_ptr element = std::make_shared(); std::shared_ptr component = std::make_shared("TestComponent"); runtime->addManager(manager); EXPECT_TRUE(element->addComponent(component)); // SceneElement in Component should be set immediately EXPECT_EQ(nullptr, component->getScene()); EXPECT_NE(nullptr, component->getSceneElement()); // Scene and SceneElement should be set after add runtime->getScene()->addSceneElement(element); EXPECT_EQ(element->getScene(), component->getScene()); EXPECT_EQ(element, component->getSceneElement()); // Verify the component made it to the manager runtime->start(true); boost::this_thread::sleep(boost::posix_time::milliseconds(150)); ASSERT_EQ(1, manager->getComponents().size()); EXPECT_EQ(component, manager->getComponents()[0]); runtime->stop(); } class ConstructorSceneElement : public MockSceneElement { public: ConstructorSceneElement() { component = std::make_shared("TestComponent"); addComponent(component); } std::shared_ptr component; }; TEST(SceneElementTest, AddAndTestComponentsConstructor) { std::shared_ptr runtime = std::make_shared(); std::shared_ptr manager = std::make_shared(); std::shared_ptr element = std::make_shared(); auto component = element->component; runtime->addManager(manager); // Scene and SceneElement in Component will not be set until initialization (add to scene). EXPECT_EQ(nullptr, component->getScene()); EXPECT_EQ(nullptr, component->getSceneElement()); // Scene and SceneElement should be set after add runtime->getScene()->addSceneElement(element); EXPECT_EQ(element->getScene(), component->getScene()); EXPECT_EQ(element, component->getSceneElement()); // Verify the component made it to the manager runtime->start(true); boost::this_thread::sleep(boost::posix_time::milliseconds(150)); ASSERT_EQ(1, manager->getComponents().size()); EXPECT_EQ(component, manager->getComponents()[0]); runtime->stop(); } TEST(SceneElementTest, AddAndAccessComponents) { std::shared_ptr element(new MockSceneElement()); std::shared_ptr component1(new MockComponent("TestComponent1")); std::shared_ptr component2(new MockComponent("TestComponent2")); EXPECT_TRUE(element->addComponent(component1)); EXPECT_TRUE(element->addComponent(component2)); // Should not be able to add two with the same name EXPECT_FALSE(element->addComponent(component1)); // Should not be able to add nullptr component EXPECT_ANY_THROW(element->addComponent(nullptr)); std::shared_ptr fetched(element->getComponent("TestComponent1")); ASSERT_NE(nullptr, fetched); EXPECT_EQ("TestComponent1", fetched->getName()); fetched = element->getComponent("Random"); EXPECT_EQ(nullptr, fetched); } TEST(SceneElementTest, RemoveComponent) { std::shared_ptr runtime = std::make_shared(); std::shared_ptr manager = std::make_shared(); std::shared_ptr element(new MockSceneElement()); std::shared_ptr component1(new MockComponent("TestComponent1")); std::shared_ptr component2(new MockComponent("TestComponent2")); EXPECT_TRUE(element->addComponent(component1)); EXPECT_TRUE(element->addComponent(component2)); runtime->addManager(manager); runtime->getScene()->addSceneElement(element); runtime->start(true); boost::this_thread::sleep(boost::posix_time::milliseconds(150)); EXPECT_EQ(2, manager->getComponents().size()); EXPECT_TRUE(element->removeComponent("TestComponent2")); EXPECT_EQ(nullptr, element->getComponent("TestComponent2")); runtime->step(); boost::this_thread::sleep(boost::posix_time::milliseconds(150)); EXPECT_EQ(1, manager->getComponents().size()); EXPECT_TRUE(element->removeComponent(component1)); EXPECT_EQ(nullptr, element->getComponent("TestComponent1")); runtime->step(); boost::this_thread::sleep(boost::posix_time::milliseconds(150)); EXPECT_EQ(0, manager->getComponents().size()); runtime->stop(); } TEST(SceneElementTest, RemoveComponents) { std::shared_ptr runtime = std::make_shared(); std::shared_ptr manager = std::make_shared(); std::shared_ptr element(new MockSceneElement()); std::shared_ptr component1(new MockComponent("TestComponent1")); std::shared_ptr component2(new MockComponent("TestComponent2")); EXPECT_TRUE(element->addComponent(component1)); EXPECT_TRUE(element->addComponent(component2)); runtime->addManager(manager); runtime->getScene()->addSceneElement(element); runtime->start(true); boost::this_thread::sleep(boost::posix_time::milliseconds(150)); EXPECT_EQ(2, manager->getComponents().size()); element->removeComponents(); runtime->step(); boost::this_thread::sleep(boost::posix_time::milliseconds(150)); EXPECT_EQ(0, manager->getComponents().size()); runtime->stop(); } TEST(SceneElementTest, GetComponentsTest) { std::shared_ptr element(new MockSceneElement()); std::shared_ptr component1(new MockComponent("TestComponent1")); std::shared_ptr component2(new MockComponent("TestComponent2")); element->addComponent(component1); EXPECT_EQ(2u, element->getComponents().size()); element->addComponent(component2); EXPECT_EQ(3u, element->getComponents().size()); std::vector> components = element->getComponents(); EXPECT_NE(components.end(), std::find(components.cbegin(), components.cend(), component1)); EXPECT_NE(components.end(), std::find(components.cbegin(), components.cend(), component2)); element->removeComponent(component1); components = element->getComponents(); EXPECT_EQ(2u, components.size()); } TEST(SceneElementTest, GetTypedComponentsTests) { std::shared_ptr element(new MockSceneElement()); std::shared_ptr behavior(new MockBehavior("MockBehavior")); std::shared_ptr component1(new MockComponent("Test Component1")); std::shared_ptr component2(new MockComponent("Test Component2")); element->addComponent(behavior); element->addComponent(component1); element->addComponent(component2); EXPECT_EQ(1u, element->getComponents().size()); EXPECT_EQ(2u, element->getComponents().size()); element->removeComponent(component1); EXPECT_EQ(1u, element->getComponents().size()); element->removeComponent(component2); EXPECT_EQ(0u, element->getComponents().size()); } TEST(SceneElementTest, GetSetValue) { std::shared_ptr element(new MockSceneElement()); std::shared_ptr component(new MockComponent("Component")); element->addComponent(component); { float value; EXPECT_FALSE(element->getValue("Component", "MissingProperty", &value)); EXPECT_THROW(element->getValue("Component", "MissingProperty"), SurgSim::Framework::AssertionFailure); EXPECT_THROW(element->getValue("Component", "MissingProperty"), SurgSim::Framework::AssertionFailure); EXPECT_THROW(element->setValue("Component", "MissingProperty", value), SurgSim::Framework::AssertionFailure); } { bool value = false; component->succeedWithInit = true; EXPECT_TRUE(element->getValue("Component", "SucceedWithInit", &value)); EXPECT_TRUE(value); EXPECT_NO_THROW(element->getValue("Component", "SucceedWithInit")); EXPECT_NO_THROW(element->getValue("Component", "SucceedWithInit")); EXPECT_TRUE(boost::any_cast(element->getValue("Component", "SucceedWithInit"))); EXPECT_TRUE(element->getValue("Component", "SucceedWithInit")); } { bool value = true; component->succeedWithWakeUp = false; EXPECT_NO_THROW(element->setValue("Component", "SucceedWithWakeUp", value)); EXPECT_TRUE(component->succeedWithWakeUp); } } TEST(SceneElementTest, InitComponentTest) { std::shared_ptr element(new MockSceneElement()); std::shared_ptr component1(new MockComponent("TestComponent1")); std::shared_ptr component2(new MockComponent("TestComponent2")); element->addComponent(component1); element->addComponent(component2); element->initialize(); EXPECT_TRUE(element->didInit); } TEST(SceneElementTest, DoubleInitTest) { std::shared_ptr element(new MockSceneElement()); EXPECT_FALSE(element->didInit); element->initialize(); EXPECT_TRUE(element->didInit); ASSERT_ANY_THROW(element->initialize()); } TEST(SceneElement, InGroup) { std::shared_ptr element(new MockSceneElement()); EXPECT_FALSE(element->inGroup("xxx")); element->addToGroup("One"); EXPECT_TRUE(element->inGroup("One")); EXPECT_FALSE(element->inGroup("xxx")); } TEST(SceneElementTest, NoSceneGroupsTest) { std::shared_ptr element(new MockSceneElement()); EXPECT_TRUE(element->getGroups().empty()); element->addToGroup("One"); EXPECT_TRUE(element->inGroup("One")); element->addToGroup("Two"); EXPECT_TRUE(element->inGroup("One")); EXPECT_TRUE(element->inGroup("Two")); element->removeFromGroup("One"); EXPECT_TRUE(element->inGroup("Two")); EXPECT_FALSE(element->inGroup("One")); std::vector newGroups; newGroups.push_back("Three"); newGroups.push_back("Four"); element->setGroups(newGroups); EXPECT_FALSE(element->inGroup("One")); EXPECT_FALSE(element->inGroup("Two")); EXPECT_TRUE(element->inGroup("Three")); EXPECT_TRUE(element->inGroup("Four")); std::vector empty; element->setGroups(empty); EXPECT_FALSE(element->inGroup("One")); EXPECT_FALSE(element->inGroup("Two")); EXPECT_FALSE(element->inGroup("Three")); EXPECT_FALSE(element->inGroup("Four")); } TEST(SceneElementTest, Include) { auto runtime = std::make_shared("config.txt"); std::string file; ASSERT_TRUE(runtime->getApplicationData()->tryFindFile("SceneElementTest/includer.yaml", &file)); YAML::Node node = YAML::LoadFile(file); ASSERT_TRUE(node.IsSequence()); auto elements = node.as>>(); EXPECT_EQ(4u, elements.size()); } TEST(SceneElementTest, IncludeCircle) { auto runtime = std::make_shared("config.txt"); std::string file; ASSERT_TRUE(runtime->getApplicationData()->tryFindFile("SceneElementTest/circle-1.yaml", &file)); YAML::Node node = YAML::LoadFile(file); ASSERT_TRUE(node.IsSequence()); ASSERT_THROW(auto elements = node.as>>(), SurgSim::Framework::AssertionFailure); } TEST(SceneElementTest, SingleAsArray) { auto runtime = std::make_shared("config.txt"); std::string file; ASSERT_TRUE(runtime->getApplicationData()->tryFindFile("SceneElementTest/single.yaml", &file)); YAML::Node node = YAML::LoadFile(file); ASSERT_FALSE(node.IsSequence()); auto elements = node.as>>(); EXPECT_EQ(1u, elements.size()); } opensurgsim-0.7.0/SurgSim/Framework/UnitTests/SceneTest.cpp000066400000000000000000000166251277777236100240170ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Framework/Scene.h" #include "SurgSim/Framework/SceneElement.h" #include "SurgSim/Framework/BasicSceneElement.h" #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Framework/UnitTests/MockObjects.h" #include "SurgSim/Testing/Utilities.h" namespace SurgSim { namespace Framework { TEST(SceneTest, ConstructorTest) { ASSERT_NO_THROW({Scene scene(std::make_shared());}); } TEST(SceneTest, ElementManagement) { auto runtime(std::make_shared()); std::shared_ptr scene = runtime->getScene(); std::shared_ptr element1(new MockSceneElement("one")); std::shared_ptr element2(new MockSceneElement("two")); EXPECT_EQ(0u, scene->getSceneElements().size()); scene->addSceneElement(element1); EXPECT_EQ(1u, scene->getSceneElements().size()); scene->addSceneElement(element2); EXPECT_EQ(2u, scene->getSceneElements().size()); EXPECT_ANY_THROW(scene->addSceneElement(element1)); EXPECT_EQ(2u, scene->getSceneElements().size()); EXPECT_EQ(element1, scene->getSceneElement("one")); EXPECT_EQ(nullptr, scene->getSceneElement("three")); } TEST(SceneTest, AddAndTestScene) { auto runtime(std::make_shared()); std::shared_ptr scene = runtime->getScene(); std::shared_ptr element = std::make_shared("element"); std::shared_ptr component = std::make_shared("component"); EXPECT_TRUE(element->addComponent(component)); scene->addSceneElement(element); EXPECT_EQ(scene, component->getScene()); EXPECT_EQ(element, component->getSceneElement()); EXPECT_EQ(scene, element->getScene()); } TEST(SceneTest, TryFind) { auto runtime = std::make_shared(); auto scene = std::make_shared(runtime); auto element0 = std::make_shared("element0"); auto element1 = std::make_shared("element1"); auto component0 = std::make_shared("component0"); auto component1 = std::make_shared("component1"); element0->addComponent(component0); element1->addComponent(component1); scene->addSceneElement(element0); scene->addSceneElement(element1); std::shared_ptr result; EXPECT_EQ(component0, scene->getComponent("element0", "component0")); EXPECT_EQ(component1, scene->getComponent("element1", "component1")); EXPECT_EQ(nullptr, scene->getComponent("element1", "xxx")); EXPECT_EQ(nullptr, scene->getComponent("xxx", "component0")); } TEST(SceneTest, Removal) { auto runtime(std::make_shared()); std::shared_ptr scene = runtime->getScene(); scene->addSceneElement(std::make_shared("element1")); scene->addSceneElement(std::make_shared("element2")); scene->addSceneElement(std::make_shared("element3")); EXPECT_EQ(3L, scene->getSceneElements().size()); EXPECT_NO_THROW(scene->removeSceneElement(scene->getSceneElement("element1"))); EXPECT_EQ(2L, scene->getSceneElements().size()); } TEST(SceneTest, CheckForExpiredRuntime) { auto runtime = std::make_shared(); auto scene = std::make_shared(runtime); auto element0 = std::make_shared("element0"); auto element1 = std::make_shared("element1"); auto component0 = std::make_shared("component0"); auto component1 = std::make_shared("component1"); // This is the normal behavior EXPECT_NO_THROW(scene->addSceneElement(element0)); EXPECT_NO_THROW(element0->addComponent(component0)); // invalidate runtime pointer, this will cause the weak_ptr inside of scene and sceneelement // to expire runtime.reset(); // We should not be able to do this with an expired runtime pointer EXPECT_THROW(scene->addSceneElement(element1), SurgSim::Framework::AssertionFailure); EXPECT_THROW(element0->addComponent(component1), SurgSim::Framework::AssertionFailure); } TEST(SceneTest, YamlTest) { auto runtime = std::make_shared(); auto scene = std::make_shared(runtime); auto element0 = std::make_shared("element0"); auto element1 = std::make_shared("element1"); auto component0 = std::make_shared("component0"); auto component1 = std::make_shared("component1"); element0->addComponent(component0); element1->addComponent(component1); scene->addSceneElement(element0); scene->addSceneElement(element1); YAML::Node node; ASSERT_NO_THROW(node = scene) << "Failed to serialize Scene."; EXPECT_TRUE(node.IsMap()); EXPECT_EQ(1u, node.size()); std::shared_ptr newScene = std::make_shared(runtime); ASSERT_NO_THROW(newScene->decode(node)); EXPECT_EQ(2u, newScene->getSceneElements().size()); } TEST(SceneTest, LoadSceneTest) { auto runtime = std::make_shared("config.txt"); ASSERT_NO_THROW(runtime->loadScene("SceneTestData/scene.yaml")); auto scene = runtime->getScene(); auto element = scene->getSceneElement("element0"); auto component = element->getComponent("component0"); component->setLocalActive(false); // If we get stale components this would assert as the components would be initialized alread ASSERT_NO_THROW(runtime->loadScene("SceneTestData/scene.yaml")); scene = runtime->getScene(); element = scene->getSceneElement("element0"); component = element->getComponent("component0"); // Another check for fresh components, if they are from the cache, this would be false EXPECT_TRUE(component->isLocalActive()); } TEST(SceneTest, SceneElementGroups) { using SurgSim::Testing::doesContain; auto runtime = std::make_shared("config.txt"); auto scene = runtime->getScene(); auto element1 = std::make_shared("element1"); auto element2 = std::make_shared("element2"); element1->addToGroup("One"); auto& groups = scene->getGroups(); EXPECT_TRUE(groups.getGroups().empty()); scene->addSceneElement(element1); EXPECT_EQ(1L, groups.getGroups().size()); EXPECT_TRUE(doesContain(groups.getGroups(), "One")); EXPECT_TRUE(doesContain(groups.getMembers("One"), element1)); scene->addSceneElement(element2); EXPECT_EQ(1L, groups.getGroups().size()); element2->addToGroup("Two"); EXPECT_EQ(2L, groups.getGroups().size()); EXPECT_TRUE(doesContain(groups.getGroups(), "Two")); EXPECT_TRUE(doesContain(groups.getMembers("Two"), element2)); element1->removeFromGroup("One"); EXPECT_EQ(1L, groups.getGroups().size()); EXPECT_TRUE(doesContain(groups.getGroups(), "Two")); EXPECT_TRUE(doesContain(groups.getMembers("Two"), element2)); element1->addToGroup("One"); std::vector groupNames; groupNames.push_back("Three"); groupNames.push_back("Four"); element1->setGroups(groupNames); EXPECT_EQ(4L, groups.getGroups().size()); } } } opensurgsim-0.7.0/SurgSim/Framework/UnitTests/SharedInstanceTest.cpp000066400000000000000000000207201277777236100256440ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the SharedInstance class. #include #include #include #include #include "SurgSim/Framework/SharedInstance.h" using SurgSim::Framework::SharedInstance; // Define some helper data types for testing. /// A helper base class. class ObjectCounts { public: static int getNumInstancesCreated() { return m_constructionIndex; } static int getNumInstancesDestroyed() { return m_destructionIndex; } static void resetInstanceIndices() { m_constructionIndex = 0; m_destructionIndex = 0; } protected: ObjectCounts() { } static int getNextInstanceIndex() { // NB: not thread-safe! ++m_constructionIndex; return m_constructionIndex; } static void markDestruction() { // NB: not thread-safe! ++m_destructionIndex; } static int m_constructionIndex; static int m_destructionIndex; }; int ObjectCounts::m_constructionIndex = 0; int ObjectCounts::m_destructionIndex = 0; /// A class that only supports construction with an argument, and doesn't support copying or moving. class ArgumentOnlyConstructible : public ObjectCounts { public: explicit ArgumentOnlyConstructible(int data) : m_data(data), m_instanceIndex(getNextInstanceIndex()) { } ~ArgumentOnlyConstructible() { markDestruction(); } int getValue() const { return m_data; } void setValue(int d) { m_data = d; } int getInstanceIndex() const { return m_instanceIndex; } private: // Disable copy construction and copy assignment. // No need to disable move construction and move assignment-- the compiler does not provide those by default. ArgumentOnlyConstructible(const ArgumentOnlyConstructible&); void operator=(const ArgumentOnlyConstructible&); int m_data; int m_instanceIndex; }; /// A class that supports default construction, but neither copying nor moving. class DefaultConstructible : public ArgumentOnlyConstructible { public: DefaultConstructible() : ArgumentOnlyConstructible(-1) { } }; // Now we're ready to start testing... // ==================== SINGLE-THREADED TESTS ==================== TEST(SharedInstanceTest, Construct) { ObjectCounts::resetInstanceIndices(); // This should work: EXPECT_NO_THROW({SharedInstance shared;}); EXPECT_NO_THROW({SharedInstance shared;}); // This should NOT work: // EXPECT_NO_THROW({SharedInstance shared;}); // ...but this should: SharedInstance::InstanceCreator createArgumentOnlyConstructible = []() { return std::make_shared(1); }; EXPECT_NO_THROW({SharedInstance shared(createArgumentOnlyConstructible);}); // No objects should have been constructed: EXPECT_EQ(0, ObjectCounts::getNumInstancesCreated()); } TEST(SharedInstanceTest, CreateInstance) { typedef DefaultConstructible DataType; ObjectCounts::resetInstanceIndices(); SharedInstance shared; EXPECT_EQ(0, ObjectCounts::getNumInstancesCreated()); { std::shared_ptr ref1 = shared.get(); ASSERT_NE(nullptr, ref1); EXPECT_EQ(1, ref1->getInstanceIndex()); std::shared_ptr ref2 = shared.get(); ASSERT_NE(nullptr, ref2); EXPECT_EQ(1, ref2->getInstanceIndex()); EXPECT_EQ(ref1, ref2); EXPECT_EQ(1, ObjectCounts::getNumInstancesCreated()); EXPECT_EQ(0, ObjectCounts::getNumInstancesDestroyed()); } EXPECT_EQ(1, ObjectCounts::getNumInstancesCreated()); EXPECT_EQ(1, ObjectCounts::getNumInstancesDestroyed()); { std::shared_ptr ref1 = shared.get(); std::shared_ptr ref2 = shared.get(); EXPECT_EQ(ref1, ref2); EXPECT_EQ(2, ref1->getInstanceIndex()); EXPECT_EQ(2, ref2->getInstanceIndex()); EXPECT_EQ(2, ObjectCounts::getNumInstancesCreated()); EXPECT_EQ(1, ObjectCounts::getNumInstancesDestroyed()); ref1.reset(); ASSERT_EQ(nullptr, ref1); // it's dead now! ASSERT_NE(nullptr, ref2); EXPECT_EQ(2, ref2->getInstanceIndex()); EXPECT_EQ(2, ObjectCounts::getNumInstancesCreated()); EXPECT_EQ(1, ObjectCounts::getNumInstancesDestroyed()); ref2.reset(); ASSERT_EQ(nullptr, ref2); // it too is dead now! EXPECT_EQ(2, ObjectCounts::getNumInstancesCreated()); EXPECT_EQ(2, ObjectCounts::getNumInstancesDestroyed()); } EXPECT_EQ(2, ObjectCounts::getNumInstancesCreated()); EXPECT_EQ(2, ObjectCounts::getNumInstancesDestroyed()); } TEST(SharedInstanceTest, CreateInstanceUsingCreator) { typedef DefaultConstructible DataType; ObjectCounts::resetInstanceIndices(); SharedInstance::InstanceCreator createDataType( []() { return std::make_shared(); } ); SharedInstance shared(createDataType); EXPECT_EQ(0, ObjectCounts::getNumInstancesCreated()); { std::shared_ptr ref1 = shared.get(); ASSERT_NE(nullptr, ref1); EXPECT_EQ(1, ref1->getInstanceIndex()); std::shared_ptr ref2 = shared.get(); ASSERT_NE(nullptr, ref2); EXPECT_EQ(1, ref2->getInstanceIndex()); EXPECT_EQ(ref1, ref2); EXPECT_EQ(1, ObjectCounts::getNumInstancesCreated()); EXPECT_EQ(0, ObjectCounts::getNumInstancesDestroyed()); } EXPECT_EQ(1, ObjectCounts::getNumInstancesCreated()); EXPECT_EQ(1, ObjectCounts::getNumInstancesDestroyed()); { std::shared_ptr ref1 = shared.get(); std::shared_ptr ref2 = shared.get(); EXPECT_EQ(ref1, ref2); EXPECT_EQ(2, ref1->getInstanceIndex()); EXPECT_EQ(2, ref2->getInstanceIndex()); EXPECT_EQ(2, ObjectCounts::getNumInstancesCreated()); EXPECT_EQ(1, ObjectCounts::getNumInstancesDestroyed()); ref1.reset(); ASSERT_EQ(nullptr, ref1); // it's dead now! ASSERT_NE(nullptr, ref2); EXPECT_EQ(2, ref2->getInstanceIndex()); EXPECT_EQ(2, ObjectCounts::getNumInstancesCreated()); EXPECT_EQ(1, ObjectCounts::getNumInstancesDestroyed()); ref2.reset(); ASSERT_EQ(nullptr, ref2); // it too is dead now! EXPECT_EQ(2, ObjectCounts::getNumInstancesCreated()); EXPECT_EQ(2, ObjectCounts::getNumInstancesDestroyed()); } EXPECT_EQ(2, ObjectCounts::getNumInstancesCreated()); EXPECT_EQ(2, ObjectCounts::getNumInstancesDestroyed()); } TEST(SharedInstanceTest, CreateNonDefaultConstructibleInstance) { typedef ArgumentOnlyConstructible DataType; ObjectCounts::resetInstanceIndices(); // This should NOT work for a type that's not default-constructible: // SharedInstance shared; // ...but this should: SharedInstance::InstanceCreator createDataType( []() { return std::make_shared(2); } ); SharedInstance shared(createDataType); EXPECT_EQ(0, ObjectCounts::getNumInstancesCreated()); { std::shared_ptr ref1 = shared.get(); ASSERT_NE(nullptr, ref1); EXPECT_EQ(1, ref1->getInstanceIndex()); std::shared_ptr ref2 = shared.get(); ASSERT_NE(nullptr, ref2); EXPECT_EQ(1, ref2->getInstanceIndex()); EXPECT_EQ(ref1, ref2); EXPECT_EQ(1, ObjectCounts::getNumInstancesCreated()); EXPECT_EQ(0, ObjectCounts::getNumInstancesDestroyed()); } EXPECT_EQ(1, ObjectCounts::getNumInstancesCreated()); EXPECT_EQ(1, ObjectCounts::getNumInstancesDestroyed()); { std::shared_ptr ref1 = shared.get(); std::shared_ptr ref2 = shared.get(); EXPECT_EQ(ref1, ref2); EXPECT_EQ(2, ref1->getInstanceIndex()); EXPECT_EQ(2, ref2->getInstanceIndex()); EXPECT_EQ(2, ObjectCounts::getNumInstancesCreated()); EXPECT_EQ(1, ObjectCounts::getNumInstancesDestroyed()); ref1.reset(); ASSERT_EQ(nullptr, ref1); // it's dead now! ASSERT_NE(nullptr, ref2); EXPECT_EQ(2, ref2->getInstanceIndex()); EXPECT_EQ(2, ObjectCounts::getNumInstancesCreated()); EXPECT_EQ(1, ObjectCounts::getNumInstancesDestroyed()); ref2.reset(); ASSERT_EQ(nullptr, ref2); // it too is dead now! EXPECT_EQ(2, ObjectCounts::getNumInstancesCreated()); EXPECT_EQ(2, ObjectCounts::getNumInstancesDestroyed()); } EXPECT_EQ(2, ObjectCounts::getNumInstancesCreated()); EXPECT_EQ(2, ObjectCounts::getNumInstancesDestroyed()); } opensurgsim-0.7.0/SurgSim/Framework/UnitTests/ThreadPoolTest.cpp000066400000000000000000000033671277777236100250220ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Framework/ThreadPool.h" #include namespace { double f1() { return 1.0; } int f2(int val) { return val; } }; namespace SurgSim { namespace Framework { TEST(ThreadPoolTest, CanConstruct) { EXPECT_NO_THROW({ThreadPool pool;}); EXPECT_NO_THROW({ThreadPool pool(2);}); } TEST(ThreadPoolTest, ExampleUsage) { ThreadPool pool; // Add a task std::future result1 = pool.enqueue(f1); // Add a task using std::bind std::future result2 = pool.enqueue(std::bind(f2, 2)); // Add a task using a lambda function std::future result3 = pool.enqueue([]() {return "string"; }); EXPECT_EQ(1.0, result1.get()); EXPECT_EQ(2, result2.get()); EXPECT_EQ("string", result3.get()); } TEST(ThreadPoolTest, AddLotsOfTasks) { ThreadPool pool(2); std::vector> futures; int expectedTotal = 0; for (int i = 0; i < 100; i++) { futures.push_back(pool.enqueue(std::bind(f2, i))); expectedTotal += i; } int total = 0; for (auto& future : futures) { total += future.get(); } EXPECT_EQ(expectedTotal, total); } }; }; opensurgsim-0.7.0/SurgSim/Framework/UnitTests/TimerTest.cpp000066400000000000000000000066421277777236100240400ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Framework/Timer.h" #include "SurgSim/Framework/Assert.h" using SurgSim::Framework::Timer; TEST(TimerTest, Constructor) { EXPECT_NO_THROW({std::shared_ptr timer(new Timer());}); } TEST(TimerTest, Starting) { std::shared_ptr timer = std::make_shared(); EXPECT_EQ(timer->getCurrentNumberOfFrames(), 0); EXPECT_EQ(timer->getNumberOfClockFails(), 0); EXPECT_NO_THROW(timer->getCumulativeTime()); EXPECT_NEAR(0.0, timer->getCumulativeTime(), 1e-9); EXPECT_THROW(timer->getAverageFramePeriod(), SurgSim::Framework::AssertionFailure); EXPECT_THROW(timer->getAverageFrameRate(), SurgSim::Framework::AssertionFailure); EXPECT_THROW(timer->getLastFramePeriod(), SurgSim::Framework::AssertionFailure); EXPECT_THROW(timer->getLastFrameRate(), SurgSim::Framework::AssertionFailure); } TEST(TimerTest, SettingFrames) { std::shared_ptr timer = std::make_shared(); timer->endFrame(); EXPECT_EQ(timer->getCurrentNumberOfFrames(), 1); EXPECT_EQ(timer->getAverageFrameRate(), timer->getLastFrameRate()); EXPECT_EQ(timer->getAverageFramePeriod(), timer->getLastFramePeriod()); EXPECT_EQ(timer->getLastFramePeriod(), timer->getCumulativeTime()); timer->setMaxNumberOfFrames(3); EXPECT_EQ(3, timer->getMaxNumberOfFrames()); timer->start(); for (auto i = 0; i < 5; ++i) { timer->markFrame(); } EXPECT_EQ(timer->getCurrentNumberOfFrames(), 3); timer->setMaxNumberOfFrames(2); EXPECT_EQ(timer->getCurrentNumberOfFrames(), 2); EXPECT_TRUE(timer->isBufferFull()); } TEST(TimerTest, Comparison) { std::shared_ptr timer1 = std::make_shared(); std::shared_ptr timer2 = std::make_shared(); for (auto i = 0; i < 100; ++i) { timer2->beginFrame(); timer2->endFrame(); timer1->markFrame(); } // timer1's frames include timer2's frames and the for-loop operations, so timer1's frame period should be longer // than timer2's frames (or at least no shorter). if ((timer1->getNumberOfClockFails() == 0) && (timer2->getNumberOfClockFails() == 0)) { EXPECT_GE(timer1->getAverageFramePeriod(), timer2->getAverageFramePeriod()); EXPECT_GT(timer1->getCumulativeTime(), timer1->getLastFramePeriod()); EXPECT_GE(timer1->getMaxFramePeriod(), timer2->getMaxFramePeriod()); EXPECT_GE(timer1->getMinFramePeriod(), timer2->getMinFramePeriod()); } } TEST(TimerTest, GetWithoutAnyFrames) { std::shared_ptr timer = std::make_shared(); EXPECT_NO_THROW(timer->getCumulativeTime()); EXPECT_ANY_THROW(timer->getAverageFramePeriod()); EXPECT_ANY_THROW(timer->getAverageFrameRate()); EXPECT_ANY_THROW(timer->getLastFramePeriod()); EXPECT_ANY_THROW(timer->getLastFrameRate()); EXPECT_ANY_THROW(timer->getMaxFramePeriod()); EXPECT_ANY_THROW(timer->getMinFramePeriod()); EXPECT_FALSE(timer->isBufferFull()); } opensurgsim-0.7.0/SurgSim/Framework/UnitTests/TransferPropertiesBehaviorTests.cpp000066400000000000000000000065661277777236100304710ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Framework/TransferPropertiesBehavior.h" namespace { class A : public SurgSim::Framework::Accessible { public: explicit A(int initialA = 0, int initialB = 0) : a(initialA), b(initialB) { SURGSIM_ADD_RW_PROPERTY(A,int,a,getA,setA); SURGSIM_ADD_RW_PROPERTY(A,int,b,getB,setB); } int a; int getA() const { return a; } void setA(int val) { a = val; } int b; int getB() const { return b; } void setB(int val) { b = val; } }; }; namespace SurgSim { namespace Framework { TEST(TransferPropertiesBehaviorTest, InitTest) { ASSERT_NO_THROW({TransferPropertiesBehavior b("TestName");}); } TEST(TransferPropertiesBehaviorTest, GetSetTargetManagerType) { auto behavior = std::make_shared("test"); auto runtime = std::make_shared(); EXPECT_EQ(Framework::MANAGER_TYPE_BEHAVIOR, behavior->getTargetManagerType()); EXPECT_THROW(behavior->setTargetManagerType(-1), Framework::AssertionFailure); EXPECT_THROW(behavior->setTargetManagerType(Framework::MANAGER_TYPE_COUNT), Framework::AssertionFailure); EXPECT_NO_THROW(behavior->setTargetManagerType(Framework::MANAGER_TYPE_PHYSICS)); EXPECT_EQ(Framework::MANAGER_TYPE_PHYSICS, behavior->getTargetManagerType()); EXPECT_NO_THROW(behavior->setTargetManagerType(Framework::MANAGER_TYPE_BEHAVIOR)); EXPECT_EQ(Framework::MANAGER_TYPE_BEHAVIOR, behavior->getTargetManagerType()); behavior->initialize(runtime); EXPECT_THROW(behavior->setTargetManagerType(Framework::MANAGER_TYPE_GRAPHICS), Framework::AssertionFailure); } TEST(TransferPropertiesBehaviorTest, ValidConnections) { auto a = std::make_shared(); auto b = std::make_shared(); TransferPropertiesBehavior behavior("test"); EXPECT_ANY_THROW(behavior.connect(nullptr, "", a ,"a")); EXPECT_ANY_THROW(behavior.connect(a, "a", nullptr, "")); EXPECT_ANY_THROW(behavior.connect(a, "a", a, "a")); EXPECT_ANY_THROW(behavior.connect(a, "xxx", b, "a")); EXPECT_ANY_THROW(behavior.connect(a, "a", b, "xxx")); EXPECT_TRUE(behavior.connect(a, "a", b, "b")); } TEST(TransferPropertiesBehaviorTest, ValidUpdates) { auto runtime = std::make_shared(); auto behavior = std::make_shared("test"); auto a = std::make_shared(1,2); auto b = std::make_shared(3,4); auto c = std::make_shared(5,6); EXPECT_TRUE(behavior->initialize(runtime)); EXPECT_TRUE(behavior->wakeUp()); EXPECT_TRUE(behavior->connect(a, "a", b, "a")); EXPECT_TRUE(behavior->connect(b, "b", c, "b")); EXPECT_TRUE(behavior->connect(a, "a", c, "a")); behavior->update(0.0); EXPECT_EQ(1, a->a); EXPECT_EQ(2, a->b); EXPECT_EQ(1, b->a); EXPECT_EQ(4, b->b); EXPECT_EQ(1, c->a); EXPECT_EQ(4, c->b); } } } opensurgsim-0.7.0/SurgSim/Framework/UnitTests/config.txt.in000066400000000000000000000000411277777236100240120ustar00rootroot00000000000000${CMAKE_CURRENT_BINARY_DIR}/Data/opensurgsim-0.7.0/SurgSim/Graphics/000077500000000000000000000000001277777236100172455ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Graphics/AxesRepresentation.h000066400000000000000000000026771277777236100232550ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_AXESREPRESENTATION_H #define SURGSIM_GRAPHICS_AXESREPRESENTATION_H #include "SurgSim/Graphics/Representation.h" namespace SurgSim { namespace Graphics { /// Displays the coordinate axes, as three lines from the origin /// default size is 1.0, the X/Y/Z axis are indicated by R/G/B respectively class AxesRepresentation : public virtual Representation { public: /// Constructor explicit AxesRepresentation(const std::string& name) : Representation(name) { SURGSIM_ADD_SERIALIZABLE_PROPERTY(AxesRepresentation, double, Size, getSize, setSize); }; /// Sets the size of the shown axes. /// \param val The value. virtual void setSize(double val) = 0; /// Gets the current size. /// \return The size. virtual double getSize() = 0; private: }; }; // Graphics }; // SurgSim #endifopensurgsim-0.7.0/SurgSim/Graphics/BoxRepresentation.h000066400000000000000000000064231277777236100230760ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_BOXREPRESENTATION_H #define SURGSIM_GRAPHICS_BOXREPRESENTATION_H #include "SurgSim/Graphics/Representation.h" #include "SurgSim/Math/MathConvert.h" #include "SurgSim/Math/Vector.h" namespace SurgSim { namespace Graphics { /// Base graphics box representation class, which defines the basic interface for a box that can be visualized. /// The box center is at (0, 0, 0). class BoxRepresentation : public virtual Representation { public: /// Constructor /// \param name Name of the representation /// \post The box size is (1.0,1.0,1.0). explicit BoxRepresentation(const std::string& name) : Representation(name) { SURGSIM_ADD_SERIALIZABLE_PROPERTY(BoxRepresentation, SurgSim::Math::Vector3d, Size, getSize, setSize); SURGSIM_ADD_RW_PROPERTY(BoxRepresentation, double, SizeX, getSizeX, setSizeX); SURGSIM_ADD_RW_PROPERTY(BoxRepresentation, double, SizeY, getSizeY, setSizeY); SURGSIM_ADD_RW_PROPERTY(BoxRepresentation, double, SizeZ, getSizeZ, setSizeZ); } /// Sets the size along X-axis of the box /// \param sizeX Size along X-axis of the box virtual void setSizeX(double sizeX) = 0; /// Returns the size along X-axis of the box /// \return Size along X-axis of the box virtual double getSizeX() const = 0; /// Sets the size along Y-axis of the box /// \param sizeY Size along Y-axis of the box virtual void setSizeY(double sizeY) = 0; /// Returns the size along Y-axis of the box /// \return Size along Y-axis of the box virtual double getSizeY() const = 0; /// Sets the size along Z-axis of the box /// \param sizeZ Size along Z-axis of the box virtual void setSizeZ(double sizeZ) = 0; /// Returns the size along Z-axis of the box /// \return Size along Z-axis of the box virtual double getSizeZ() const = 0; /// Sets the size of the box /// \param sizeX Size along X-axis of the box /// \param sizeY Size along Y-axis of the box /// \param sizeZ Size along Z-axis of the box virtual void setSizeXYZ(double sizeX, double sizeY, double sizeZ) = 0; /// Gets the size of the box /// \param sizeX Reference to store the size along X-axis of the box /// \param sizeY Reference to store the size along Y-axis of the box /// \param sizeZ Reference to store the size along Z-axis of the box virtual void getSizeXYZ(double* sizeX, double* sizeY, double* sizeZ) const = 0; /// Sets the size of the box /// \param size Size of the box virtual void setSize(const SurgSim::Math::Vector3d& size) = 0; /// Returns the radius of the sphere /// \return Size of the box virtual SurgSim::Math::Vector3d getSize() const = 0; }; }; // namespace Graphics }; // namespace SurgSim #endif // SURGSIM_GRAPHICS_BOXREPRESENTATION_H opensurgsim-0.7.0/SurgSim/Graphics/CMakeLists.txt000066400000000000000000000104451277777236100220110ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2012-2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. include_directories( ${OPENTHREADS_INCLUDE_DIR} ) set(SURGSIM_GRAPHICS_SOURCES Camera.cpp CurveRepresentation.cpp Group.cpp Manager.cpp Mesh.cpp MeshPlyReaderDelegate.cpp OsgAxesRepresentation.cpp OsgBoxRepresentation.cpp OsgCamera.cpp OsgCapsuleRepresentation.cpp OsgCurveRepresentation.cpp OsgCylinderRepresentation.cpp OsgFont.cpp OsgGroup.cpp OsgLight.cpp OsgLog.cpp OsgManager.cpp OsgMaterial.cpp OsgMeshRepresentation.cpp OsgModel.cpp OsgOctreeRepresentation.cpp OsgPlaneRepresentation.cpp OsgPointCloudRepresentation.cpp OsgProgram.cpp OsgRepresentation.cpp OsgSceneryRepresentation.cpp OsgScreenSpacePass.cpp OsgScreenSpaceQuadRepresentation.cpp OsgSkeletonRepresentation.cpp OsgSphereRepresentation.cpp OsgTextRepresentation.cpp OsgTexture.cpp OsgTexture1d.cpp OsgTexture2d.cpp OsgTexture3d.cpp OsgTextureCubeMap.cpp OsgTextureRectangle.cpp OsgTrackballZoomManipulator.cpp OsgUniformBase.cpp OsgUniformFactory.cpp OsgUnitAxes.cpp OsgVectorFieldRepresentation.cpp OsgView.cpp OsgViewElement.cpp PaintBehavior.cpp PointCloudRepresentation.cpp RenderPass.cpp Representation.cpp SceneryRepresentation.cpp TangentSpaceGenerator.cpp TextRepresentation.cpp Texture.cpp TriangleNormalGenerator.cpp View.cpp ViewElement.cpp ) set(SURGSIM_GRAPHICS_HEADERS AxesRepresentation.h BoxRepresentation.h Camera.h CapsuleRepresentation.h CurveRepresentation.h CylinderRepresentation.h Font.h Group.h Light.h Manager.h Material.h Mesh.h Mesh-inl.h MeshPlyReaderDelegate.h MeshRepresentation.h Model.h OctreeRepresentation.h OsgAxesRepresentation.h OsgBoxRepresentation.h OsgCamera.h OsgCapsuleRepresentation.h OsgConversions.h OsgCurveRepresentation.h OsgCylinderRepresentation.h OsgFont.h OsgGroup.h OsgLight.h OsgLog.h OsgManager.h OsgMaterial.h OsgMatrixConversions.h OsgMeshRepresentation.h OsgModel.h OsgOctreeRepresentation.h OsgPlane.h OsgPlaneRepresentation.h OsgPointCloudRepresentation.h OsgProgram.h OsgQuaternionConversions.h OsgRenderTarget.h OsgRenderTarget-inl.h OsgRepresentation.h OsgRigidTransformConversions.h OsgSceneryRepresentation.h OsgScreenSpacePass.h OsgScreenSpaceQuadRepresentation.h OsgSkeletonRepresentation.h OsgSphereRepresentation.h OsgTextRepresentation.h OsgTexture.h OsgTexture1d.h OsgTexture2d.h OsgTexture3d.h OsgTextureCubeMap.h OsgTextureRectangle.h OsgTextureUniform.h OsgTextureUniform-inl.h OsgTrackballZoomManipulator.h OsgUniform.h OsgUniform-inl.h OsgUniformBase.h OsgUniformFactory.h OsgUniformTypes.h OsgUnitAxes.h OsgUnitBox.h OsgUnitCylinder.h OsgUnitSphere.h OsgVectorConversions.h OsgVectorFieldRepresentation.h OsgView.h OsgViewElement.h PaintBehavior.h PlaneRepresentation.h PointCloudRepresentation.h Program.h RenderPass.h RenderTarget.h Representation.h SceneryRepresentation.h ScreenSpaceQuadRepresentation.h SkeletonRepresentation.h SphereRepresentation.h TangentSpaceGenerator.h TextRepresentation.h Texture.h Texture1d.h Texture2d.h Texture3d.h TextureCubeMap.h TextureRectangle.h TriangleNormalGenerator.h Uniform.h UniformBase.h VectorField.h VectorFieldRepresentation.h View.h ViewElement.h ) surgsim_create_library_header(Graphics.h "${SURGSIM_GRAPHICS_HEADERS}") surgsim_add_library( SurgSimGraphics "${SURGSIM_GRAPHICS_SOURCES}" "${SURGSIM_GRAPHICS_HEADERS}" ) SET(LIBS SurgSimDataStructures SurgSimFramework SurgSimInput KeyboardDevice MouseDevice ${OPENSCENEGRAPH_LIBRARIES} ) target_link_libraries(SurgSimGraphics ${LIBS} ) if(BUILD_TESTING) add_subdirectory(UnitTests) if(BUILD_RENDER_TESTING) add_subdirectory(RenderTests) endif() endif() set_target_properties(SurgSimGraphics PROPERTIES FOLDER "Graphics") opensurgsim-0.7.0/SurgSim/Graphics/Camera.cpp000066400000000000000000000126711277777236100211500ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/DataStructures/DataStructuresConvert.h" #include "SurgSim/Graphics/Camera.h" #include "SurgSim/Graphics/Group.h" #include "SurgSim/Math/MathConvert.h" namespace SurgSim { namespace Graphics { Camera::Camera(const std::string& name) : Representation(name) { SURGSIM_ADD_SERIALIZABLE_PROPERTY(Camera, SurgSim::Math::Matrix44d, ProjectionMatrix, getProjectionMatrix, setProjectionMatrix); SURGSIM_ADD_SERIALIZABLE_PROPERTY(Camera, std::vector, RenderGroupReferences, getRenderGroupReferences, setRenderGroupReferences); SURGSIM_ADD_SETTER(Camera, std::string, RenderGroupReference, setRenderGroupReference); SURGSIM_ADD_SERIALIZABLE_PROPERTY(Camera, SurgSim::Math::Vector4d, AmbientColor, getAmbientColor, setAmbientColor); SURGSIM_ADD_SERIALIZABLE_PROPERTY(Camera, bool, MainCamera, isMainCamera, setMainCamera); SURGSIM_ADD_RO_PROPERTY(Camera, SurgSim::Math::Matrix44d, ViewMatrix, getViewMatrix); SURGSIM_ADD_RO_PROPERTY(Camera, SurgSim::Math::Matrix44f, FloatViewMatrix, getViewMatrix); SURGSIM_ADD_RO_PROPERTY(Camera, SurgSim::Math::Matrix44f, FloatProjectionMatrix, getProjectionMatrix); SURGSIM_ADD_RO_PROPERTY(Camera, SurgSim::Math::Matrix44f, FloatInverseViewMatrix, getInverseViewMatrix); SURGSIM_ADD_RO_PROPERTY(Camera, SurgSim::Math::Matrix44f, FloatInverseProjectionMatrix, getInverseProjectionMatrix); { typedef std::array ParamType; SURGSIM_ADD_SERIALIZABLE_PROPERTY(Camera, ParamType, ViewportSize, getViewportSize, setViewportSize); } { typedef std::array ParamType; SURGSIM_ADD_SETTER(Camera, ParamType, PerspectiveProjection, setPerspectiveProjection); } { typedef std::array ParamType; SURGSIM_ADD_SETTER(Camera, ParamType, OrthogonalProjection, setOrthogonalProjection); } { typedef std::array ParamType; // Deal with the overloaded function, by casting to explicit function type auto getter = (ParamType(Camera::*)(void) const)&Camera::getViewport; auto setter = (void(Camera::*)(ParamType))&Camera::setViewport; setAccessors("Viewport", std::bind(getter, this), std::bind(setter, this, std::bind(SurgSim::Framework::convert, std::placeholders::_1))); setSerializable("Viewport", std::bind(&YAML::convert::encode, std::bind(getter, this)), std::bind(setter, this, std::bind(&YAML::Node::as, std::placeholders::_1))); } } void Camera::setRenderGroupReference(const std::string& name) { std::vector references(1, name); setRenderGroupReferences(references); } void Camera::setRenderGroupReferences(const std::vector& names) { m_renderGroupReferences.clear(); for (const auto& name : names) { removeGroupReference(name); addRenderGroupReference(name); } } std::vector Camera::getRenderGroupReferences() const { return m_renderGroupReferences; } void Camera::addRenderGroupReference(const std::string& name) { if (std::find(m_renderGroupReferences.begin(), m_renderGroupReferences.end(), name) == m_renderGroupReferences.end()) { m_renderGroupReferences.push_back(name); } } bool Camera::setRenderGroup(std::shared_ptr group) { std::vector> groups(1, group); return setRenderGroups(groups); } bool Camera::setRenderGroups(const std::vector>& groups) { bool result = false; m_renderGroups.clear(); for (const auto& group : groups) { result = addRenderGroup(group); if (!result) { break; } } return result; } bool Camera::addRenderGroup(std::shared_ptr group) { if (std::find(m_renderGroups.begin(), m_renderGroups.end(), group) == m_renderGroups.end()) { m_renderGroups.push_back(group); return true; } else { return false; } } std::vector> Camera::getRenderGroups() const { return m_renderGroups; } bool Camera::addGroupReference(const std::string& name) { bool result = false; if (std::find(m_renderGroupReferences.begin(), m_renderGroupReferences.end(), name) == m_renderGroupReferences.end()) { result = Representation::addGroupReference(name); } return result; } void Camera::setPerspectiveProjection(const std::array& val) { setPerspectiveProjection(val[0], val[1], val[2], val[3]); } void Camera::setOrthogonalProjection(const std::array& val) { setOrthogonalProjection(val[0], val[1], val[2], val[3], val[4], val[5]); } void Camera::setViewport(std::array val) { setViewport(val[0], val[1], val[2], val[3]); } std::array Camera::getViewport() const { std::array result; getViewport(&result[0], &result[1], &result[2], &result[3]); return result; } bool Camera::doInitialize() { SURGSIM_ASSERT(!m_renderGroupReferences.empty()) << "Can't have a camera without a RenderGroupReference."; return true; } } } opensurgsim-0.7.0/SurgSim/Graphics/Camera.h000066400000000000000000000214421277777236100206110ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_CAMERA_H #define SURGSIM_GRAPHICS_CAMERA_H #include "SurgSim/Graphics/Representation.h" #include "SurgSim/Math/Matrix.h" #include "SurgSim/Math/Vector.h" #include namespace SurgSim { namespace Graphics { class Group; class Texture; class RenderTarget; /// Base graphics camera class, which defines the basic interface for all graphics cameras. /// /// A Graphics::Camera provides the viewpoint to visualize the Graphics::Group assigned to it. /// /// To disable a camera: setLocalActive(false). To re-enable, setLocalActive(true). /// A disabled (invisible) camera does not produce an image. /// /// Graphics::Camera is used with Graphics::View to provide the visualization of the virtual scene to the user. /// Cameras refer to a group that contain all the elements that they render, they may also parts of other group that /// determine whether they are rendered. /// It should provide the following Uniforms: /// \code /// uniform mat4 viewMatrix; /// uniform mat4 inverseViewMatrix; /// \endcode class Camera : public virtual Representation { public: enum RenderOrder { RENDER_ORDER_PRE_RENDER = 0, RENDER_ORDER_IN_ORDER, RENDER_ORDER_POST_RENDER, RENDER_ORDER_COUNT }; /// Constructor /// \param name Name of the camera explicit Camera(const std::string& name); /// Set the group reference that this camera wants to use as the group for rendering. Objects that, reference /// the same group will be rendered by this camera. The manager will do the actual creation of the group. /// \param name Name of the group to be used for rendering void setRenderGroupReference(const std::string& name); /// Set the collections of group references that this camera wants to use for rendering. /// \param names Vector of names of the groups used for rendering void setRenderGroupReferences(const std::vector& names); /// Gets the collection of names of render groups used for rendering /// \return Vector of names of the groups used for rendering std::vector getRenderGroupReferences() const; /// Adds a single group reference to the collection of group references for rendering /// \param name Name of the group to be used for rendering void addRenderGroupReference(const std::string& name); /// Sets the group of representations that will be seen by this camera. /// Only the representations in this group will be rendered when this camera's view is rendered. /// \note The camera can not be part of the group that it is rendering /// \param group Group of representations /// \return True if it succeeded, false if it failed virtual bool setRenderGroup(std::shared_ptr group); /// Sets the representation groups that will be seen by this camera. /// \param groups Vector of groups of representations /// \return True if it succeeded, false if it failed virtual bool setRenderGroups(const std::vector>& groups); /// Add a group of representations that will seen by this camera. /// \param group Group of representations virtual bool addRenderGroup(std::shared_ptr group); /// Gets all groups of representations that will be seen by this camera. /// Only the representations in this group will be rendered when this camera's view is rendered. /// \return Vector of groups of representations std::vector> getRenderGroups() const; /// Gets the view matrix of the camera /// \return View matrix virtual SurgSim::Math::Matrix44d getViewMatrix() const = 0; /// Gets the inverse view matrix of the camera /// \return Inverse view matrix virtual SurgSim::Math::Matrix44d getInverseViewMatrix() const = 0; /// Sets the projection matrix of the camera /// \param matrix Projection matrix virtual void setProjectionMatrix(const SurgSim::Math::Matrix44d& matrix) = 0; /// Sets the viewport size for this camera /// \param x,y location of the viewport in screen space /// \param width, height size of the viewport in screen space virtual void setViewport(int x, int y, int width, int height) = 0; /// collect the viewport values /// \param x,y,width,height [out] non-nullptr parameters to write the viewport parameters virtual void getViewport(int* x, int* y, int* width, int* height) const = 0; /// Sets the width and height of the viewport /// \param dimensions size of the viewport in screen space virtual void setViewportSize(std::array dimensions) = 0; /// Gets the dimensions of the viewport virtual std::array getViewportSize() const = 0; /// Set the projection matrix with the appropriate perspective projection parameters /// \param fovy Field of view along the y-axis /// \param aspect Aspect ration between y and x axis in the viewport /// \param near, far near and far clipping planes virtual void setPerspectiveProjection(double fovy, double aspect, double near, double far) = 0; /// Set the projection matrix with the appropriate orthogonal projection parameters /// \param left, right left and right bounds of the view volume /// \param bottom, top bottom and top bounds of the view volume /// \param near, far near and far bounds of the view volume virtual void setOrthogonalProjection( double left, double right, double bottom, double top, double near, double far) = 0; /// Gets the projection matrix of the camera /// \return Projection matrix virtual const SurgSim::Math::Matrix44d& getProjectionMatrix() const = 0; /// Gets the inverse projection matrix of the camera /// \return Inverse Projection matrix virtual SurgSim::Math::Matrix44d getInverseProjectionMatrix() const = 0; /// Sets RenderTarget for the current camera, enables the camera to render to off-screen textures. /// \param renderTarget The render target. virtual bool setRenderTarget(std::shared_ptr renderTarget) = 0; /// Gets RenderTarget that is currently being used by the camera. /// \return The RenderTarget. virtual std::shared_ptr getRenderTarget() const = 0; /// Determine when this camera will render. The main camera will render at (RENDER_ORDER_IN_ORDER,0) /// In general all preprocessing should be done in RENDER_ORDER_PRE_ORDER, HUD Displaying usually /// at RENDER_ORDER_POST_ORDER /// \param order The phase of rendering. /// \param value The index within the phase, the order between two cameras of the same phase and index is not /// determined. virtual void setRenderOrder(RenderOrder order, int value) = 0; bool addGroupReference(const std::string& name) override; /// Sets a value for the ambient lighting term, this can add light to the scene when there is no lighting /// \param color value for the light that should get added to the scene virtual void setAmbientColor(const SurgSim::Math::Vector4d& color) = 0; /// \return the ambient light that gets added to the scene virtual SurgSim::Math::Vector4d getAmbientColor() = 0; /// Marks the camera as a main view camera, this means that view dependent passes should follow this camera with /// their appropriate calculations, for this purpose when isMainCamera() is true, the camera provides a uniform /// struct with it's transforms. This function will most likely be called by the view. /// \code /// struct MainCamera { /// mat4 viewMatrix; /// mat4 inverseViewMatrix; /// mat4 projectionMatrix; /// mat4 mainProjectionMatrix; /// }; /// uniform MainCamera mainCamera; /// \endcode virtual void setMainCamera(bool val) = 0; /// \return whether this is used as a main camera virtual bool isMainCamera() = 0; private: void setPerspectiveProjection(const std::array& val); void setOrthogonalProjection(const std::array& val); void setViewport(std::array val); std::array getViewport() const; bool doInitialize() override; /// Group of representations that this camera sees /// Only the representations in this group will be rendered when this camera's view is rendered. std::vector> m_renderGroups; /// The names of the groups that the camera wants to use for rendering, the graphics manager will actually assign /// this group std::vector m_renderGroupReferences; }; }; // namespace Graphics }; // namespace SurgSim #endif // SURGSIM_GRAPHICS_CAMERA_H opensurgsim-0.7.0/SurgSim/Graphics/CapsuleRepresentation.h000066400000000000000000000054271277777236100237450ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_CAPSULEREPRESENTATION_H #define SURGSIM_GRAPHICS_CAPSULEREPRESENTATION_H #include "SurgSim/Graphics/Representation.h" #include "SurgSim/Math/Vector.h" namespace SurgSim { namespace Graphics { /// Base graphics capsule representation class, which defines the basic interface for a capsule that can be visualized. /// The capsule center is at (0, 0, 0). class CapsuleRepresentation : public virtual Representation { public: /// Constructor /// \param name Name of the representation /// \post The capsule radius is 1.0. explicit CapsuleRepresentation(const std::string& name) : Representation(name) { SURGSIM_ADD_SERIALIZABLE_PROPERTY(CapsuleRepresentation, double, Radius, getRadius, setRadius); SURGSIM_ADD_SERIALIZABLE_PROPERTY(CapsuleRepresentation, double, Height, getHeight, setHeight); } /// Sets the radius of the capsule /// \param radius Radius of the capsule virtual void setRadius(double radius) = 0; /// Returns the radius of the capsule /// \return Radius along X-axis and Z-axis of the capsule virtual double getRadius() const = 0; /// Sets the height of the capsulei /// \param height Height of the capsule virtual void setHeight(double height) = 0; /// Returns the height of the capsule /// \return Height along Y-axis of the capsule virtual double getHeight() const = 0; /// Sets the size of the capsule /// \param radius Size along X-axis and Z-axis of the capsule /// \param height Size along Y-axis of the capsule virtual void setSize(double radius, double height) = 0; /// Gets the size of the capsule /// \param [out] radius Variable to receive the size along X-axis and Z-axis of the capsule /// \param [out] height Variable to receive the size along Y-axis of the capsule virtual void getSize(double* radius, double* height) = 0; /// Sets the size of the capsule /// \param size Size of the capsule virtual void setSize(const SurgSim::Math::Vector2d& size) = 0; /// Returns the radius of the capsule /// \return Size of the capsule virtual SurgSim::Math::Vector2d getSize() const = 0; }; }; // namespace Graphics }; // namespace SurgSim #endif // SURGSIM_GRAPHICS_CAPSULEREPRESENTATION_H opensurgsim-0.7.0/SurgSim/Graphics/CurveRepresentation.cpp000066400000000000000000000044621277777236100237660ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Graphics/CurveRepresentation.h" #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Math/MathConvert.h" namespace SurgSim { namespace Graphics { CurveRepresentation::CurveRepresentation(const std::string& name) : Representation(name) { SURGSIM_ADD_SERIALIZABLE_PROPERTY(CurveRepresentation, size_t, Subdivisions, getSubdivisions, setSubdivisions); SURGSIM_ADD_SERIALIZABLE_PROPERTY(CurveRepresentation, double, Tension, getTension, setTension); SURGSIM_ADD_SERIALIZABLE_PROPERTY(CurveRepresentation, Math::Vector4d, Color, getColor, setColor); SURGSIM_ADD_SERIALIZABLE_PROPERTY(CurveRepresentation, double, Width, getWidth, setWidth); SURGSIM_ADD_SERIALIZABLE_PROPERTY(CurveRepresentation, bool, AntiAliasing, isAntiAliasing, setAntiAliasing); // Provide a common entry point accepting VerticesPlain under the label "Vertices" // this can be used by behaviors to address this structure and the point cloud the same way auto converter = std::bind(SurgSim::Framework::convert, std::placeholders::_1); auto functor = std::bind((void(CurveRepresentation::*)(const DataStructures::VerticesPlain&)) &CurveRepresentation::updateControlPoints, this, converter); setSetter("Vertices", functor); } void CurveRepresentation::updateControlPoints(const DataStructures::VerticesPlain& vertices) { SURGSIM_ASSERT(vertices.getNumVertices() > 1) << "Need at least 2 control points."; m_locker.set(vertices); } void CurveRepresentation::updateControlPoints(DataStructures::VerticesPlain&& vertices) { SURGSIM_ASSERT(vertices.getNumVertices() > 1) << "Need at least 2 control points."; m_locker.set(std::move(vertices)); } } }opensurgsim-0.7.0/SurgSim/Graphics/CurveRepresentation.h000066400000000000000000000071441277777236100234330ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_CURVEREPRESENTATION_H #define SURGSIM_GRAPHICS_CURVEREPRESENTATION_H #include "SurgSim/DataStructures/Vertices.h" #include "SurgSim/Framework/LockedContainer.h" #include "SurgSim/Graphics/Representation.h" namespace SurgSim { namespace Graphics { /// This implements a graphical object to draw an interpolated curve, it accepts a series of control points, the /// number of segments in the curve will depend on the number of control points and the value returned from /// getSubdivisions(). /// This class also provides the ad-hoc "Vertices" property, this means it can receive a /// \sa DataStructures::VerticesPlain structure as a property via setValue() class CurveRepresentation : public virtual Representation { public: /// Constructor /// \param name the name of the representation explicit CurveRepresentation(const std::string& name); /// Sets the number of intermediate points the get generated between each two control points /// \param num number of interpolated points virtual void setSubdivisions(size_t num) = 0; /// \return the number of interpolated points between control points virtual size_t getSubdivisions() const = 0; /// Sets the tension (tau) parameter of the Catmull Rom interpolation, needs to be between 0.0 and 1.0 /// \param tension the tension virtual void setTension(double tension) = 0; /// \return the tension currently used virtual double getTension() const = 0; /// Sets the color for the curve /// \param color the new color to be used virtual void setColor(const SurgSim::Math::Vector4d& color) = 0; /// \return the current color for this curve virtual Math::Vector4d getColor() const = 0; /// Sets the line width to be used for drawing this curve /// \param width the new width to be used virtual void setWidth(double width) = 0; /// \return the current width virtual double getWidth() const = 0; /// Sets up whether to use anti aliasing on the curve or not /// \param val if true anti aliasing will be turned on virtual void setAntiAliasing(bool val) = 0; /// \return whether the curve is currently being drawn with anti aliasing virtual bool isAntiAliasing() const = 0; /// Updates the control points for this class, this will cause a new curve to be generated on the next update /// \note this method is threadsafe /// \throws if the number of control points is < 2 /// \param vertices new vertices to be used as control points void updateControlPoints(const DataStructures::VerticesPlain& vertices); /// Updates the control points for this class, this will cause a new curve to be generated on the next update /// move support. /// \note this method is threadsafe /// \throws if the number of control points is < 2 /// \param vertices new vertices to be used as control points void updateControlPoints(DataStructures::VerticesPlain&& vertices); protected: /// Container control points, threadsafe access when updating. Framework::LockedContainer m_locker; }; } } #endif opensurgsim-0.7.0/SurgSim/Graphics/CylinderRepresentation.h000066400000000000000000000055261277777236100241220ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_CYLINDERREPRESENTATION_H #define SURGSIM_GRAPHICS_CYLINDERREPRESENTATION_H #include "SurgSim/Graphics/Representation.h" #include "SurgSim/Math/Vector.h" namespace SurgSim { namespace Graphics { /// Base graphics cylinder representation class, /// which defines the basic interface for a cylinder that can be visualized. /// The cylinder center is at (0, 0, 0). class CylinderRepresentation : public virtual Representation { public: /// Constructor /// \param name Name of the representation /// \post The cylinder radius is 1.0. explicit CylinderRepresentation(const std::string& name) : Representation(name) { SURGSIM_ADD_SERIALIZABLE_PROPERTY(CylinderRepresentation, double, Radius, getRadius, setRadius); SURGSIM_ADD_SERIALIZABLE_PROPERTY(CylinderRepresentation, double, Height, getHeight, setHeight); } /// Sets the radius of the cylinder /// \param radius Radius along X-axis and Z-axis of the cylinder virtual void setRadius(double radius) = 0; /// Returns the radius of the cylinder /// \return Radius along X-axis and Z-axis of cylinder virtual double getRadius() const = 0; /// Sets the height of the cylinder /// \param height Height along Y-axis of the cylinder virtual void setHeight(double height) = 0; /// Returns the height of the cylinder /// \return Height along Y-axis of the cylinder virtual double getHeight() const = 0; /// Sets the size of the cylinder /// \param radius Size along X-axis and Z-axis of the cylinder /// \param height Size along Y-axis of the cylinder virtual void setSize(double radius, double height) = 0; /// Gets the size of the cylinder /// \param [out] radius Variable to receive the size along X-axis and Z-axis of the cylinder /// \param [out] height Variable to receive the size along Y-axis of the cylinder virtual void getSize(double* radius, double* height) = 0; /// Sets the size of the cylinder /// \param size Size of the cylinder virtual void setSize(const SurgSim::Math::Vector2d& size) = 0; /// Returns the size of the cylinder /// \return Size of the cylinder virtual SurgSim::Math::Vector2d getSize() const = 0; }; }; // namespace Graphics }; // namespace SurgSim #endif // SURGSIM_GRAPHICS_CYLINDERREPRESENTATION_H opensurgsim-0.7.0/SurgSim/Graphics/Font.h000066400000000000000000000017631277777236100203330ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_FONT_H #define SURGSIM_GRAPHICS_FONT_H #include "SurgSim/Framework/Asset.h" namespace SurgSim { namespace Graphics { /// Abstract base class for the Font Asset, fonts are typefaces that can be used to render /// text on screen they would usually be loaded from disk class Font : public SurgSim::Framework::Asset { }; } } #endif opensurgsim-0.7.0/SurgSim/Graphics/Group.cpp000066400000000000000000000036321277777236100210510ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Graphics/Group.h" #include "SurgSim/Graphics/Representation.h" namespace SurgSim { namespace Graphics { Group::Group(const std::string& name) : m_name(name) { } Group::~Group() { } bool Group::add(std::shared_ptr representation) { bool result = false; if (std::find(m_representations.begin(), m_representations.end(), representation) == m_representations.end()) { m_representations.push_back(representation); result = true; } return result; } bool Group::append(std::shared_ptr group) { bool result = true; const std::vector>& members = group->getMembers(); for (auto it = members.begin(); it != members.end(); ++it) { if (! add(*it)) { result = false; } } return result; } bool Group::remove(std::shared_ptr representation) { bool result = false; auto it = std::find(m_representations.begin(), m_representations.end(), representation); if (it != m_representations.end()) { m_representations.erase(it); result = true; } return result; } const std::vector>& Group::getMembers() const { return m_representations; } void Group::clear() { m_representations.clear(); } std::string Group::getName() const { return m_name; } } } opensurgsim-0.7.0/SurgSim/Graphics/Group.h000066400000000000000000000057061277777236100205220ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_GROUP_H #define SURGSIM_GRAPHICS_GROUP_H #include "SurgSim/Framework/Component.h" #include #include namespace SurgSim { namespace Graphics { class Representation; /// Base graphics group class, which defines the interface that all graphics groups must implement. /// /// Graphics::Group allows the organization of Graphics::Representation objects so that different algorithms can /// operate on specific sub-sets rather than the entire scene. class Group { public: /// Constructor. The group is initially empty. /// \param name Name of the group, this has to be unique over the whole system, otherwise /// adding the group will fail explicit Group(const std::string& name); /// Destructor virtual ~Group(); /// Sets whether the group is currently visible /// \param visible True for visible, false for invisible virtual void setVisible(bool visible) = 0; /// Gets whether the group is currently visible /// \return visible True for visible, false for invisible virtual bool isVisible() const = 0; /// Adds an representation /// \param representation Representation to add to this group /// \return True if the representation is added successfully, false if failure virtual bool add(std::shared_ptr representation); /// Adds all representations in another group to this group /// \param group Group of representations to add /// \return True if all representations are added successfully, false if failure virtual bool append(std::shared_ptr group); /// Removes an representation. /// \param representation Representation to remove from this group /// \return True if the representation is removed successfully, false if representation is not in this group or /// other failure. virtual bool remove(std::shared_ptr representation); /// \return a container with all the representations in this group. const std::vector>& getMembers() const; /// Removes all representations. virtual void clear(); /// \return The name of this group. std::string getName() const; private: std::string m_name; /// Representations in this group std::vector> m_representations; }; }; // namespace Graphics }; // namespace SurgSim #endif // SURGSIM_GRAPHICS_GROUP_H opensurgsim-0.7.0/SurgSim/Graphics/Light.h000066400000000000000000000107521277777236100204720ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_LIGHT_H #define SURGSIM_GRAPHICS_LIGHT_H #include "SurgSim/Graphics/Representation.h" #include "SurgSim/Math/MathConvert.h" #include "SurgSim/Math/Vector.h" namespace SurgSim { namespace Graphics { class Group; /// Abstract interface for a light, a light needs to be assigned to a group to be active, only the members of this /// group will be considered to be lit by this light. Currently this light implements a pointlight. It will have to /// be extended for a directional and spot lights. The class should provide the following uniform values. The position /// is set by using the representations setPose() call. /// \code /// struct LightSource { /// vec4 ambient; /// vec4 diffuse; /// vec4 specular; /// vec4 position; /// float constantAttenuation; /// float linearAttenuation; /// float quadraticAttenuation; /// }; /// /// uniform LightSource lightSource; /// \endcode /// class Light : public virtual Representation { public: /// Constructor explicit Light(const std::string& name) : Representation(name) { SURGSIM_ADD_SERIALIZABLE_PROPERTY(Light, SurgSim::Math::Vector4d, DiffuseColor, getDiffuseColor, setDiffuseColor); SURGSIM_ADD_SERIALIZABLE_PROPERTY(Light, SurgSim::Math::Vector4d, SpecularColor, getSpecularColor, setSpecularColor); SURGSIM_ADD_SERIALIZABLE_PROPERTY(Light, double, ConstantAttenuation, getConstantAttenuation, setConstantAttenuation); SURGSIM_ADD_SERIALIZABLE_PROPERTY(Light, double, LinearAttenuation, getLinearAttenuation, setLinearAttenuation); SURGSIM_ADD_SERIALIZABLE_PROPERTY(Light, double, QuadraticAttenuation, getQuadraticAttenuation, setQuadraticAttenuation); SURGSIM_ADD_SERIALIZABLE_PROPERTY(Light, std::string, LightGroupReference, getLightGroupReference, setLightGroupReference); } virtual ~Light() { } /// Sets the group for this light, setting nullptr here will remove the light from its current group /// \param group The group. /// \return true if it succeeds, false if the group is not an OsgGroup. virtual bool setGroup(std::shared_ptr group) = 0; /// Gets the group that this light has been assigned to. /// \return The group or nullptr if no group has been set. virtual std::shared_ptr getGroup() = 0; /// Sets diffuse color of this light. /// \param color The color. virtual void setDiffuseColor(const SurgSim::Math::Vector4d& color) = 0; /// Gets diffuse color. /// \return The diffuse color. virtual SurgSim::Math::Vector4d getDiffuseColor() = 0; /// Sets specular color of this light. /// \param color The color. virtual void setSpecularColor(const SurgSim::Math::Vector4d& color) = 0; /// Gets specular color. /// \return The specular color. virtual SurgSim::Math::Vector4d getSpecularColor() = 0; /// Sets constant attenuation. /// \param val The value. virtual void setConstantAttenuation(double val) = 0; /// Gets constant attenuation. /// \return The constant attenuation. virtual double getConstantAttenuation() = 0; /// Sets linear attenuation. /// \param val The value. virtual void setLinearAttenuation(double val) = 0; /// Gets linear attenuation. /// \return The linear attenuation. virtual double getLinearAttenuation() = 0; /// Sets quadratic attenuation. /// \param val The value. virtual void setQuadraticAttenuation(double val) = 0; /// Gets quadratic attenuation. /// \return The quadratic attenuation. virtual double getQuadraticAttenuation() = 0; /// Sets the name of the group that this light should work on /// \param name The name of the group to light virtual void setLightGroupReference(const std::string& name) = 0; /// Gets the name of the group this light should operate on /// \return the name of the group for this light virtual std::string getLightGroupReference() = 0; }; }; // Graphics }; // SurgSim #endifopensurgsim-0.7.0/SurgSim/Graphics/Manager.cpp000066400000000000000000000134711277777236100213310ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Graphics/Manager.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Graphics/Camera.h" #include "SurgSim/Graphics/Light.h" #include "SurgSim/Graphics/Group.h" #include "SurgSim/Graphics/Representation.h" #include "SurgSim/Graphics/View.h" using SurgSim::Graphics::Camera; using SurgSim::Graphics::Group; using SurgSim::Graphics::Manager; using SurgSim::Graphics::Representation; using SurgSim::Graphics::View; Manager::Manager() : ComponentManager("Graphics Manager") { setRate(60.0); } Manager::~Manager() { } bool Manager::executeRemovals(const std::shared_ptr& component) { bool result = false; std::shared_ptr representation = std::dynamic_pointer_cast(component); if (representation != nullptr) { result = removeRepresentation(representation); } std::shared_ptr view = std::dynamic_pointer_cast(component); if (view != nullptr) { result = removeView(view); } return result; } bool Manager::executeAdditions(const std::shared_ptr& component) { bool result = false; std::shared_ptr representation = std::dynamic_pointer_cast(component); if (representation != nullptr) { result = addRepresentation(representation); } std::shared_ptr view = std::dynamic_pointer_cast(component); if (view != nullptr) { result = addView(view); } return result; } bool Manager::addRepresentation(std::shared_ptr representation) { bool result = false; if (std::find(m_representations.begin(), m_representations.end(), representation) == m_representations.end()) { m_representations.push_back(representation); // Check all the groups that are requested for this representation, fetch them and // add this representation std::vector requestedGroups = representation->getGroupReferences(); for (auto groupName = std::begin(requestedGroups); groupName != std::end(requestedGroups); ++groupName) { auto group = getOrCreateGroup(*groupName); group->add(representation); } // Additionally for a camera create or fetch the RenderGroup auto camera = std::dynamic_pointer_cast(representation); if (camera != nullptr) { std::vector> groups; for (auto reference : camera->getRenderGroupReferences()) { groups.push_back(getOrCreateGroup(reference)); } camera->setRenderGroups(groups); } auto light = std::dynamic_pointer_cast(representation); if (light != nullptr) { light->setGroup(getOrCreateGroup(light->getLightGroupReference())); } SURGSIM_LOG_INFO(m_logger) << "Added representation " << representation->getFullName(); result = true; } else { SURGSIM_LOG_INFO(m_logger) << "Cannot add duplicate representation " << representation->getFullName(); } return result; } bool Manager::addView(std::shared_ptr view) { bool result = false; if (std::find(m_views.begin(), m_views.end(), view) == m_views.end()) { m_views.push_back(view); SURGSIM_LOG_INFO(m_logger) << "Added view " << view->getFullName(); result = true; } else { SURGSIM_LOG_INFO(m_logger) << "Cannot add duplicate view " << view->getFullName(); } return result; } bool Manager::removeRepresentation(std::shared_ptr representation) { bool result = false; auto groupReferences = representation->getGroupReferences(); for (auto it = groupReferences.cbegin(); it != groupReferences.cend(); ++it) { m_groups[*it]->remove(representation); } auto it = std::find(m_representations.begin(), m_representations.end(), representation); if (it != m_representations.end()) { m_representations.erase(it); SURGSIM_LOG_INFO(m_logger) << "Removed representation " << representation->getFullName(); result = true; } else { SURGSIM_LOG_INFO(m_logger) << "Representation not found for removal, " << representation->getFullName(); } return result; } bool Manager::removeView(std::shared_ptr view) { bool result = false; auto it = std::find(m_views.begin(), m_views.end(), view); if (it != m_views.end()) { m_views.erase(it); SURGSIM_LOG_INFO(m_logger) << "Removed view " << view->getFullName(); result = true; } else { SURGSIM_LOG_INFO(m_logger) << "View not found for removal, " << view->getFullName(); } return result; } bool Manager::doInitialize() { return true; } bool Manager::doStartUp() { return true; } bool Manager::doUpdate(double dt) { processBehaviors(dt); processComponents(); for (auto& view : m_views) { view->update(dt); } for (auto& representation : m_representations) { representation->update(dt); } return true; } int Manager::getType() const { return SurgSim::Framework::MANAGER_TYPE_GRAPHICS; } void SurgSim::Graphics::Manager::addGroup(std::shared_ptr group) { auto oldGroup = m_groups.find(group->getName()); SURGSIM_ASSERT(oldGroup == m_groups.end()) << "Tried to add a group that has already been added, " << group->getName(); m_groups[group->getName()] = group; SURGSIM_LOG_INFO(m_logger) << "Added group " << group->getName(); } void Manager::doBeforeStop() { retireComponents(m_views); retireComponents(m_representations); ComponentManager::doBeforeStop(); } opensurgsim-0.7.0/SurgSim/Graphics/Manager.h000066400000000000000000000115721277777236100207760ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_MANAGER_H #define SURGSIM_GRAPHICS_MANAGER_H #include "SurgSim/Framework/ComponentManager.h" #include #include namespace SurgSim { namespace Graphics { class Group; class Representation; class View; /// Basic graphics manager class which manages graphics components to provide a visualization of the scene to the user. /// /// Graphics::Manager manages Graphics::Representation, Graphics::Group, and Graphics::View components. class Manager : public SurgSim::Framework::ComponentManager { public: /// Constructor Manager(); /// Destructor virtual ~Manager(); /// Returns the representations assigned to the manager const std::vector>& getRepresentations() const { return m_representations; } /// Returns the groups assigned to the manager const std::unordered_map>& getGroups() const { return m_groups; } /// Returns the views assigned to the manager const std::vector>& getViews() const { return m_views; } /// Generic unspecified debug handle, there are no requirements on this interface /// the manager implementation can decide what to do virtual void dumpDebugInfo() const = 0; protected: /// Adds a component /// \param component The component to be added. /// \return True if it succeeds or the manager is not concerned with the component, false if it fails. virtual bool executeAdditions(const std::shared_ptr& component); /// Removes a component /// \param component The component to be removed. /// \return True if it succeeds or the manager is not concerned with the component, false if it fails. virtual bool executeRemovals(const std::shared_ptr& component); /// Adds an representation to the manager. This will also add the representation to all of the groups /// contained in its groupRenferences. /// \param representation The representation to be added. /// \return True if the representation was not in this manager and has been successfully added, false if it fails. virtual bool addRepresentation(std::shared_ptr representation); /// Adds a view to the manager /// \param view The view to be added. /// \return True if the view was not in this manager and has been successfully added, false if it fails. virtual bool addView(std::shared_ptr view); /// Removes an representation from the manager /// \param representation The representation to be removed. /// \return True if the representation was in this manager and has been successfully removed, false if it fails. virtual bool removeRepresentation(std::shared_ptr representation); /// Removes a view from the manager /// \param view The view to be removed. /// \return True if the view was in this manager and has been successfully removed, false if it fails. virtual bool removeView(std::shared_ptr view); /// Performs an update for a single timestep /// \param dt The time in seconds of the preceding timestep. virtual bool doUpdate(double dt); /// Overrides ComponentManager::getType() int getType() const override; /// Fetch a group with a given name, if the group does not exist, create it. /// \param name Name of the group to be fetched. /// \return group with the given name. virtual std::shared_ptr getOrCreateGroup(const std::string& name) = 0; protected: /// Adds a group to the manager, override for manager specific behavior when adding /// \param group The group to be added. virtual void addGroup(std::shared_ptr group); void doBeforeStop() override; private: /// Initializes the manager /// \return True if it succeeds, false if it fails virtual bool doInitialize(); /// Starts up the manager after all threads have initialized /// \return True if it succeeds, false if it fails virtual bool doStartUp(); /// Representations assigned to the manager std::vector> m_representations; /// Groups assigned to the manager std::unordered_map> m_groups; /// Views assigned to the manager std::vector> m_views; }; }; // namespace Graphics }; // namespace SurgSim #endif // SURGSIM_GRAPHICS_MANAGER_H opensurgsim-0.7.0/SurgSim/Graphics/Material.h000066400000000000000000000070101277777236100211520ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_MATERIAL_H #define SURGSIM_GRAPHICS_MATERIAL_H #include #include #include "SurgSim/Framework/Component.h" namespace SurgSim { namespace Graphics { class UniformBase; class Program; /// Base class that defines the interface for graphics materials. /// /// Graphics materials define the visual appearance of graphics representations and are composed of the uniforms and /// shaders applied used when rendering the geometry. /// \sa UniformBase /// \sa Shader class Material : public SurgSim::Framework::Component { public: /// Constructor explicit Material(const std::string& name) : Component(name) {} /// Destructor. // (Note that Visual Studio does not support "= default" yet.) virtual ~Material() { } /// Adds a uniform to this material. /// \param uniform Uniform to add. virtual void addUniform(std::shared_ptr uniform) = 0; /// Adds a GLSL typed uniform to this material /// \param type the type of the uniform /// \param name the name that this uniform should have virtual void addUniform(const std::string& type, const std::string& name) = 0; /// Removes a uniform from this material. /// \param uniform Uniform to remove. /// \return True if uniform was removed successfully, otherwise false. virtual bool removeUniform(std::shared_ptr uniform) = 0; /// Removes a uniform from this material. /// \param name Uniform to remove. /// \return True if uniform was removed successfully, otherwise false. virtual bool removeUniform(const std::string& name) = 0; /// Gets a uniform in this material. /// \param name The name of the Uniform to fetch. /// \return The uniform, nullptr if the uniform does not exist. virtual std::shared_ptr getUniform(const std::string& name) const = 0; /// Gets a uniform in this material /// \param index Index of the uniform in the material's list of uniforms /// \return Uniform at the index virtual std::shared_ptr getUniform(size_t index) const = 0; /// Checks if this material has a uniform with the given name. /// \param name The name of the Uniform to check. /// \return true if the uniform is in the material, false otherwise. virtual bool hasUniform(const std::string& name) const = 0; /// Returns the number of uniforms in this material. virtual size_t getNumUniforms() const = 0; /// Sets the program used by this material. /// \param program Shader program. /// \return True if program was set successfully, otherwise false. virtual bool setProgram(std::shared_ptr program) = 0; /// Gets the program used by this material. /// \return Shader program. virtual std::shared_ptr getProgram() const = 0; /// Removes the shader from the material, falling back to fixed-function pipeline. virtual void clearProgram() = 0; }; }; // namespace Graphics }; // namespace SurgSim #endif // SURGSIM_GRAPHICS_MATERIAL_H opensurgsim-0.7.0/SurgSim/Graphics/Mesh-inl.h000066400000000000000000000020071277777236100210710ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_MESH_INL_H #define SURGSIM_GRAPHICS_MESH_INL_H namespace SurgSim { namespace Graphics { template Mesh::Mesh(const TriangleMesh& other) : DataStructures::TriangleMesh(other) { } }; // Graphics }; // SurgSim #endif // SURGSIM_GRAPHICS_MESH_INL_H opensurgsim-0.7.0/SurgSim/Graphics/Mesh.cpp000066400000000000000000000073641277777236100206570ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/DataStructures/EmptyData.h" #include "SurgSim/DataStructures/PlyReader.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Graphics/Mesh.h" #include "SurgSim/Graphics/MeshPlyReaderDelegate.h" using SurgSim::DataStructures::EmptyData; template<> std::string SurgSim::DataStructures::TriangleMesh ::m_className = "SurgSim::Graphics::Mesh"; namespace SurgSim { namespace Graphics { SURGSIM_REGISTER(SurgSim::Framework::Asset, SurgSim::Graphics::Mesh, Mesh); Mesh::Mesh() : m_updateCount(1) { } Mesh::Mesh( const Mesh& other ) : BaseType(other) { } Mesh::Mesh( Mesh&& other ) : BaseType(std::move(other)) { } void Mesh::initialize( const std::vector& vertices, const std::vector& colors, const std::vector& textures, const std::vector& triangles) { SURGSIM_ASSERT(textures.empty() || textures.size() >= vertices.size()) << "To make a mesh you need to either provide at least the same amount" << " of texture coordinates as vertices or none at all."; SURGSIM_ASSERT(colors.empty() || colors.size() >= vertices.size()) << "To make a mesh you need to either provide at least the same amount" << " of colors as vertices or none at all."; clear(); size_t i = 0; for (auto it = std::begin(vertices); it != std::end(vertices); ++it, ++i) { VertexData data; if (! colors.empty()) { data.color.setValue(colors[i]); } if (! textures.empty()) { data.texture.setValue(textures[i]); } addVertex(Mesh::VertexType(*it, data)); } for (size_t i = 0; i < triangles.size(); i += 3) { TriangleType::IdType ids = {{triangles[i], triangles[i + 1], triangles[i + 2]}}; bool valid = true; for (auto it = std::begin(ids); it != std::end(ids); ++it) { if (*it >= getNumVertices()) { valid = false; break; } } if (valid) { Mesh::TriangleType triangle(ids); addTriangle(triangle); } else { SURGSIM_LOG_WARNING(SurgSim::Framework::Logger::getLogger("Graphics")) << "When building a mesh a vertex was present in a triangle that was not in the list of vertices"; } } } bool Mesh::doLoad(const std::string& fileName) { SurgSim::DataStructures::PlyReader reader(fileName); if (! reader.isValid()) { SURGSIM_LOG_SEVERE(SurgSim::Framework::Logger::getDefaultLogger()) << "'" << fileName << "' is an invalid .ply file."; return false; } auto delegate = std::make_shared(std::dynamic_pointer_cast(shared_from_this())); if (! reader.parseWithDelegate(delegate)) { SURGSIM_LOG_SEVERE(SurgSim::Framework::Logger::getDefaultLogger()) << "The input file '" << fileName << "' does not have the property required by triangle mesh."; return false; } return true; } void Mesh::dirty() { ++m_updateCount; } size_t Mesh::getUpdateCount() const { return m_updateCount; } Mesh& Mesh::operator=( const Mesh& other ) { BaseType::operator=(other); return *this; } Mesh& Mesh::operator=( Mesh&& other ) { BaseType::operator=(std::move(other)); return *this; } }; // Graphics }; // SurgSim opensurgsim-0.7.0/SurgSim/Graphics/Mesh.h000066400000000000000000000102311277777236100203070ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_MESH_H #define SURGSIM_GRAPHICS_MESH_H #include #include "SurgSim/DataStructures/EmptyData.h" #include "SurgSim/DataStructures/TriangleMesh.h" #include "SurgSim/DataStructures/OptionalValue.h" #include "SurgSim/Math/Vector.h" namespace SurgSim { namespace Graphics { struct VertexData { SurgSim::DataStructures::OptionalValue texture; SurgSim::DataStructures::OptionalValue color; /// Equality operator. /// \param rhs The right hand side. /// \return true if the parameters are considered equivalent. bool operator==(const SurgSim::Graphics::VertexData& rhs) const { return texture == rhs.texture && color == rhs.color; } /// Inequality operator. /// \param rhs The right hand side. /// \return true if the parameters are not considered equivalent. bool operator!=(const SurgSim::Graphics::VertexData& rhs) const { return !((*this) == rhs); } }; SURGSIM_STATIC_REGISTRATION(Mesh); class Mesh : public SurgSim::DataStructures::TriangleMesh { public: /// Default constructor Mesh(); typedef TriangleMesh BaseType; /// Copy constructor when the template data is a different type /// \tparam V Type of extra data stored in each vertex /// \tparam E Type of extra data stored in each edge /// \tparam T Type of extra data stored in each triangle /// \param other The mesh to be copied from. Vertex, edge and triangle data will not be copied /// \note: Data of the input mesh, i.e. VertexDataSource, EdgeDataSource and TrianleDataSource will not be copied. template explicit Mesh(const TriangleMesh& other); /// Copy Constructor /// \param other Constructor source Mesh(const Mesh& other); /// Move Constructor /// \param other Constructor source Mesh(Mesh&& other); /// Copy Assignment /// \param other Assignment source Mesh& operator=(const Mesh& other); /// Move Assignment /// \param other Assignment source Mesh& operator=(Mesh&& other); /// Utility function to initialize a mesh with plain data, /// \param vertices An array of vertex coordinates. /// \param colors The colors, the number of colors can be 0 or /// there have to be at least as many colors as vertices. /// \param textures The textures coordinates, the number of coordinates can be 0 or /// there have to be at least as many texture coordinates as there are vertices. /// \param triangles The triangles, a plain array of triplets of triangle indices, the indices should be /// points in the vertices array. void initialize(const std::vector& vertices, const std::vector& colors, const std::vector& textures, const std::vector& triangles); /// Increase the update count, this indicates that the mesh has been changed, if used in a mesh representation /// the mesh representation will still only update the data members that have been marked for updating void dirty(); /// Return the update count, please note that it will silently roll over when the range of size_t has been exceeded size_t getUpdateCount() const; protected: bool doLoad(const std::string& fileName) override; /// For checking whether the mesh has changed size_t m_updateCount; }; }; // Graphics }; // SurgSim #include "SurgSim/Graphics/Mesh-inl.h" #endif // SURGSIM_GRAPHICS_MESH_H opensurgsim-0.7.0/SurgSim/Graphics/MeshPlyReaderDelegate.cpp000066400000000000000000000027341277777236100241160ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Graphics/MeshPlyReaderDelegate.h" #include "SurgSim/DataStructures/EmptyData.h" #include "SurgSim/DataStructures/PlyReader.h" using SurgSim::DataStructures::PlyReader; namespace SurgSim { namespace Graphics { MeshPlyReaderDelegate::MeshPlyReaderDelegate() : SurgSim::DataStructures::TriangleMeshPlyReaderDelegate() { } MeshPlyReaderDelegate::MeshPlyReaderDelegate(std::shared_ptr mesh) : SurgSim::DataStructures::TriangleMeshPlyReaderDelegate(mesh) { } void MeshPlyReaderDelegate::processVertex(const std::string& elementName) { MeshType::VertexType vertex(SurgSim::Math::Vector3d(m_vertexData.x, m_vertexData.y, m_vertexData.z)); if (hasTextureCoordinates()) { vertex.data.texture.setValue(SurgSim::Math::Vector2d(m_vertexData.s, m_vertexData.t)); } m_mesh->addVertex(vertex); } } } opensurgsim-0.7.0/SurgSim/Graphics/MeshPlyReaderDelegate.h000066400000000000000000000026371277777236100235650ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_MESHPLYREADERDELEGATE_H #define SURGSIM_GRAPHICS_MESHPLYREADERDELEGATE_H #include #include #include "SurgSim/DataStructures/EmptyData.h" #include "SurgSim/DataStructures/TriangleMeshPlyReaderDelegate.h" #include "SurgSim/Graphics/Mesh.h" namespace SurgSim { namespace Graphics { /// Implementation of PlyReaderDelegate for graphicsmeshes class MeshPlyReaderDelegate : public SurgSim::DataStructures::TriangleMeshPlyReaderDelegate { public: /// Default constructor. MeshPlyReaderDelegate(); /// Constructor. /// \param mesh The mesh to be used, it will be cleared by the constructor. explicit MeshPlyReaderDelegate(std::shared_ptr mesh); void processVertex(const std::string& elementName) override; }; } } #endif opensurgsim-0.7.0/SurgSim/Graphics/MeshRepresentation.h000066400000000000000000000063271277777236100232450ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_MESHREPRESENTATION_H #define SURGSIM_GRAPHICS_MESHREPRESENTATION_H #include "SurgSim/Framework/Asset.h" #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/DataStructures/DataStructuresConvert.h" #include "SurgSim/Math/MathConvert.h" #include "SurgSim/Graphics/Mesh.h" #include "SurgSim/Graphics/Representation.h" namespace SurgSim { namespace Graphics { /// Graphics representation of a mesh, can be initialized from a Mesh structure class MeshRepresentation : public virtual Representation { public: enum UpdateOption { UPDATE_OPTION_NONE = 0, UPDATE_OPTION_VERTICES = 0x01, UPDATE_OPTION_COLORS = 0x02, UPDATE_OPTION_TEXTURES = 0x04, UPDATE_OPTION_TRIANGLES = 0x08, UPDATE_OPTION_ALL = UPDATE_OPTION_VERTICES | UPDATE_OPTION_COLORS | UPDATE_OPTION_TEXTURES | UPDATE_OPTION_TRIANGLES }; /// Constructor. /// \param name The name of the representation. explicit MeshRepresentation(const std::string& name) : Representation(name) { SURGSIM_ADD_SERIALIZABLE_PROPERTY(MeshRepresentation, std::shared_ptr, Mesh, getMesh, setMesh); SURGSIM_ADD_SERIALIZABLE_PROPERTY(MeshRepresentation, int, UpdateOptions, getUpdateOptions, setUpdateOptions); SURGSIM_ADD_SETTER(MeshRepresentation, std::string, MeshFileName, loadMesh); } /// Destructor virtual ~MeshRepresentation() {} /// Gets the mesh. /// \return The mesh. virtual std::shared_ptr getMesh() = 0; /// Sets the mesh. /// \param mesh the graphics mesh to be used virtual void setMesh(std::shared_ptr mesh) = 0; /// Convenience function to trigger the load of the mesh with the given filename /// \param fileName name of the file to be loaded virtual void loadMesh(const std::string& fileName) = 0; /// Sets the shape of the representation /// param shape the shape of this representation /// \note only shapes of type MeshShape are supported virtual void setShape(std::shared_ptr shape) = 0; /// Sets the structures that are expected to change during the lifetime of the mesh, these will be updated /// every frame, independent of a structural change in the mesh. UPDATE_OPTION_VERTICES is set in the constructor /// as a default value. /// \param val Boolean or expression of UpdateOption enum. virtual void setUpdateOptions(int val) = 0; /// Gets update options for this mesh. /// \return The update options. virtual int getUpdateOptions() const = 0; virtual void updateMesh(const Mesh& mesh) = 0; }; }; // Graphics }; // SurgSim #endif // SURGSIM_GRAPHICS_MESHREPRESENTATION_H opensurgsim-0.7.0/SurgSim/Graphics/Model.h000066400000000000000000000016031277777236100204560ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_MODEL_H #define SURGSIM_GRAPHICS_MODEL_H #include "SurgSim/Framework/Asset.h" namespace SurgSim { namespace Graphics { // Wraps the Graphics Model class class Model : public SurgSim::Framework::Asset { }; } } #endif opensurgsim-0.7.0/SurgSim/Graphics/OctreeRepresentation.h000066400000000000000000000043601277777236100235650ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_OCTREEREPRESENTATION_H #define SURGSIM_GRAPHICS_OCTREEREPRESENTATION_H #include #include "SurgSim/Graphics/Representation.h" #include "SurgSim/Math/MathConvert.h" #include "SurgSim/Math/OctreeShape.h" namespace SurgSim { namespace Graphics { /// Graphic representation of an Octree class OctreeRepresentation : public virtual Representation { public: /// Constructor /// \param name Name of OctreeRepresentation explicit OctreeRepresentation(const std::string& name) : Representation(name) { SURGSIM_ADD_SERIALIZABLE_PROPERTY(OctreeRepresentation, std::shared_ptr, OctreeShape, getOctreeShape, setOctreeShape); } /// Destructor virtual ~OctreeRepresentation() { } /// Set the OctreeShape of this representation. The Octree is retrieved and visualized. /// \param shape The OctreeShape from which the octree is retrieved and visualized. virtual void setOctreeShape(const std::shared_ptr& shape) = 0; /// \return The OctreeShape from which the Octree is retrieved. virtual std::shared_ptr getOctreeShape() const = 0; /// Mark the OctreeNode visible/invisible in the given a OctreePath (typedef-ed in OctreeNode.h). /// \param path An OctreePath, giving the path leads to the OctreeNode whose visibility to be changed. /// \param visibility Whether or not the OctreeNode specified by 'path' is visible or not. virtual void setNodeVisible(const SurgSim::DataStructures::OctreePath& path, bool visibility) = 0; }; }; // Graphics }; // SurgSim #endif // SURGSIM_GRAPHICS_OCTREEREPRESENTATION_Hopensurgsim-0.7.0/SurgSim/Graphics/OsgAxesRepresentation.cpp000066400000000000000000000031431277777236100242460ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Graphics/OsgAxesRepresentation.h" #include "SurgSim/Framework/SharedInstance.h" #include namespace SurgSim { namespace Graphics { SURGSIM_REGISTER(SurgSim::Framework::Component, SurgSim::Graphics::OsgAxesRepresentation, OsgAxesRepresentation); OsgAxesRepresentation::OsgAxesRepresentation(const std::string& name) : Representation(name), OsgRepresentation(name), AxesRepresentation(name), m_sharedUnitAxes(getShareUnitAxes()), m_size(1.0) { m_transform->addChild(m_sharedUnitAxes->getNode()); } OsgAxesRepresentation::~OsgAxesRepresentation() { } std::shared_ptr OsgAxesRepresentation::getShareUnitAxes() { static SurgSim::Framework::SharedInstance shared; return shared.get(); } void OsgAxesRepresentation::setSize(double val) { m_size = val; m_transform->setScale(osg::Vec3d(val, val, val)); } double OsgAxesRepresentation::getSize() { return m_size; } }; // Graphics }; // SurgSim opensurgsim-0.7.0/SurgSim/Graphics/OsgAxesRepresentation.h000066400000000000000000000036721277777236100237220ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_OSGAXESREPRESENTATION_H #define SURGSIM_GRAPHICS_OSGAXESREPRESENTATION_H #include "SurgSim/Graphics/OsgRepresentation.h" #include "SurgSim/Graphics/AxesRepresentation.h" #include "SurgSim/Graphics/OsgUnitAxes.h" #if defined(_MSC_VER) #pragma warning(push) #pragma warning(disable:4250) #endif namespace SurgSim { namespace Graphics { SURGSIM_STATIC_REGISTRATION(OsgAxesRepresentation); /// Osg axes representation implementation for the AxesRepresentation interface in graphics. class OsgAxesRepresentation : public OsgRepresentation, public AxesRepresentation { public: /// Constructor explicit OsgAxesRepresentation(const std::string& name); ~OsgAxesRepresentation(); SURGSIM_CLASSNAME(SurgSim::Graphics::OsgAxesRepresentation); /// Sets the size of the shown axes. /// \param val The value. void setSize(double val) override; /// Gets the current size. /// \return The size. double getSize() override; private: /// Shared unit axes, so that the geometry can be instanced rather than having multiple copies. std::shared_ptr m_sharedUnitAxes; /// Returns the shared unit axes static std::shared_ptr getShareUnitAxes(); /// Hold the size double m_size; }; #if defined(_MSC_VER) #pragma warning(pop) #endif }; // Graphics }; // SurgSim #endifopensurgsim-0.7.0/SurgSim/Graphics/OsgBoxRepresentation.cpp000066400000000000000000000051701277777236100241000ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Graphics/OsgBoxRepresentation.h" #include "SurgSim/Graphics/OsgMaterial.h" #include "SurgSim/Graphics/OsgRigidTransformConversions.h" #include "SurgSim/Graphics/OsgUnitBox.h" #include #include #include namespace SurgSim { namespace Graphics { SURGSIM_REGISTER(SurgSim::Framework::Component, SurgSim::Graphics::OsgBoxRepresentation, OsgBoxRepresentation); OsgBoxRepresentation::OsgBoxRepresentation(const std::string& name) : Representation(name), OsgRepresentation(name), BoxRepresentation(name), m_scale(1.0, 1.0, 1.0), m_sharedUnitBox(getSharedUnitBox()) { m_transform->addChild(m_sharedUnitBox->getNode()); } void OsgBoxRepresentation::setSizeX(double sizeX) { m_scale.x() = sizeX; m_transform->setScale(m_scale); } double OsgBoxRepresentation::getSizeX() const { return m_scale.x(); } void OsgBoxRepresentation::setSizeY(double sizeY) { m_scale.y() = sizeY; m_transform->setScale(m_scale); } double OsgBoxRepresentation::getSizeY() const { return m_scale.y(); } void OsgBoxRepresentation::setSizeZ(double sizeZ) { m_scale.z() = sizeZ; m_transform->setScale(m_scale); } double OsgBoxRepresentation::getSizeZ() const { return m_scale.z(); } void OsgBoxRepresentation::setSizeXYZ(double sizeX, double sizeY, double sizeZ) { m_scale.x() = sizeX; m_scale.y() = sizeY; m_scale.z() = sizeZ; m_transform->setScale(m_scale); } void OsgBoxRepresentation::getSizeXYZ(double* sizeX, double* sizeY, double* sizeZ) const { *sizeX = m_scale.x(); *sizeY = m_scale.y(); *sizeZ = m_scale.z(); } void OsgBoxRepresentation::setSize(const SurgSim::Math::Vector3d& size) { m_scale.set(size.x(), size.y(), size.z()); m_transform->setScale(m_scale); } SurgSim::Math::Vector3d OsgBoxRepresentation::getSize() const { return SurgSim::Math::Vector3d(m_scale._v); } std::shared_ptr OsgBoxRepresentation::getSharedUnitBox() { static SurgSim::Framework::SharedInstance shared; return shared.get(); } }; // Graphics }; // SurgSimopensurgsim-0.7.0/SurgSim/Graphics/OsgBoxRepresentation.h000066400000000000000000000070571277777236100235530ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_OSGBOXREPRESENTATION_H #define SURGSIM_GRAPHICS_OSGBOXREPRESENTATION_H #include "SurgSim/Framework/SharedInstance.h" #include "SurgSim/Framework/ObjectFactory.h" #include "SurgSim/Graphics/BoxRepresentation.h" #include "SurgSim/Graphics/OsgRepresentation.h" #include "SurgSim/Math/RigidTransform.h" #include #include #if defined(_MSC_VER) #pragma warning(push) #pragma warning(disable:4250) #endif namespace SurgSim { namespace Graphics { class OsgUnitBox; SURGSIM_STATIC_REGISTRATION(OsgBoxRepresentation); /// OSG implementation of a graphics box representation. class OsgBoxRepresentation : public OsgRepresentation, public BoxRepresentation { public: /// Constructor /// \param name Name of the representation explicit OsgBoxRepresentation(const std::string& name); SURGSIM_CLASSNAME(SurgSim::Graphics::OsgBoxRepresentation); /// Sets the size along X-axis of the box /// \param sizeX Size along X-axis of the box void setSizeX(double sizeX) override; /// Returns the size along X-axis of the box /// \return Size along X-axis of the box double getSizeX() const override; /// Sets the size along Y-axis of the box /// \param sizeY Size along Y-axis of the box void setSizeY(double sizeY) override; /// Returns the size along Y-axis of the box /// \return Size along Y-axis of the box double getSizeY() const override; /// Sets the size along Z-axis of the box /// \param sizeZ Size along Z-axis of the box void setSizeZ(double sizeZ) override; /// Returns the size along Z-axis of the box /// \return Size along Z-axis of the box double getSizeZ() const override; /// Sets the size of the box /// \param sizeX Size along X-axis of the box /// \param sizeY Size along Y-axis of the box /// \param sizeZ Size along Z-axis of the box virtual void setSizeXYZ(double sizeX, double sizeY, double sizeZ); /// Gets the size of the box /// \param sizeX Reference to store the size along X-axis of the box /// \param sizeY Reference to store the size along Y-axis of the box /// \param sizeZ Reference to store the size along Z-axis of the box virtual void getSizeXYZ(double* sizeX, double* sizeY, double* sizeZ) const; /// Sets the size of the box /// \param size Size of the box void setSize(const SurgSim::Math::Vector3d& size) override; /// Returns the extents of the box /// \return Size of the box SurgSim::Math::Vector3d getSize() const override; private: /// The OSG box shape is a unit box and this transform scales it to the size set. osg::Vec3d m_scale; /// Shared unit box, so that the geometry can be instanced rather than having multiple copies. std::shared_ptr m_sharedUnitBox; /// Returns the shared unit box static std::shared_ptr getSharedUnitBox(); }; }; // namespace Graphics }; // namespace SurgSim #if defined(_MSC_VER) #pragma warning(pop) #endif #endif // SURGSIM_GRAPHICS_OSGBOXREPRESENTATION_H opensurgsim-0.7.0/SurgSim/Graphics/OsgCamera.cpp000066400000000000000000000343601277777236100216200ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Graphics/OsgCamera.h" #include "SurgSim/Graphics/Manager.h" #include "SurgSim/Graphics/Material.h" #include "SurgSim/Graphics/OsgGroup.h" #include "SurgSim/Graphics/OsgMaterial.h" #include "SurgSim/Graphics/OsgMatrixConversions.h" #include "SurgSim/Graphics/OsgQuaternionConversions.h" #include "SurgSim/Graphics/OsgRenderTarget.h" #include "SurgSim/Graphics/OsgUniform.h" #include "SurgSim/Graphics/OsgVectorConversions.h" #include "SurgSim/Math/Matrix.h" #include using SurgSim::Math::makeRigidTransform; using SurgSim::Math::Matrix44f; using SurgSim::Math::Vector4d; using SurgSim::Math::Vector4f; namespace { const osg::Camera::BufferComponent ColorBufferEnums[16] = { osg::Camera::COLOR_BUFFER0, osg::Camera::COLOR_BUFFER1, osg::Camera::COLOR_BUFFER2, osg::Camera::COLOR_BUFFER3, osg::Camera::COLOR_BUFFER4, osg::Camera::COLOR_BUFFER5, osg::Camera::COLOR_BUFFER6, osg::Camera::COLOR_BUFFER7, osg::Camera::COLOR_BUFFER8, osg::Camera::COLOR_BUFFER9, osg::Camera::COLOR_BUFFER10, osg::Camera::COLOR_BUFFER11, osg::Camera::COLOR_BUFFER12, osg::Camera::COLOR_BUFFER13, osg::Camera::COLOR_BUFFER14, osg::Camera::COLOR_BUFFER15 }; const osg::Camera::RenderOrder RenderOrderEnums[3] = { osg::Camera::PRE_RENDER, osg::Camera::NESTED_RENDER, osg::Camera::POST_RENDER }; /// Update the main camera uniforms to reflect the state of the rendering camera, this is used when rendering /// stereo via osg, the mainCamera.* uniforms will carry the values of the currently rendering camera, i.e. the left /// and the right view camera. class UniformUpdater : public osg::NodeCallback { public: UniformUpdater(osg::Uniform* projection, osg::Uniform* inverseProjection, osg::Uniform* view, osg::Uniform* inverseView) : m_projection(projection), m_inverseProjection(inverseProjection), m_view(view), m_inverseView(inverseView) { } virtual void operator()(osg::Node* node, osg::NodeVisitor* nodeVisitor) { osgUtil::CullVisitor* cv = dynamic_cast(nodeVisitor); if (cv != nullptr) { auto camera = cv->getCurrentCamera(); const auto& projection = camera->getProjectionMatrix(); m_projection->set(projection); m_inverseProjection->set(osg::Matrix::inverse(projection)); m_view->set(camera->getViewMatrix()); m_inverseView->set(camera->getInverseViewMatrix()); } traverse(node, nodeVisitor); } private: osg::ref_ptr m_projection; osg::ref_ptr m_inverseProjection; osg::ref_ptr m_view; osg::ref_ptr m_inverseView; }; osg::Uniform* addMatrixUniform(osg::Node* node, const std::string& name) { auto uniform = new osg::Uniform; uniform->setName(name); uniform->setType(osg::Uniform::FLOAT_MAT4); osg::Matrix matrix; uniform->set(matrix); node->getOrCreateStateSet()->addUniform(uniform); return uniform; } osg::Switch* createUniformUpdateNode(long mask) // NOLINT { auto node = new osg::Switch; auto projection = addMatrixUniform(node, "mainCamera.projectionMatrix"); auto inverseProjection = addMatrixUniform(node, "mainCamera.inverseProjectionMatrix"); auto view = addMatrixUniform(node, "mainCamera.viewMatrix"); auto inverseView = addMatrixUniform(node, "mainCamera.inverseViewMatrix"); auto callback = new UniformUpdater(projection, inverseProjection, view, inverseView); node->addCullCallback(callback); node->setNodeMask(mask); return node; } const long CullMask = 0xfffffff1; // NOLINT const long CullMaskLeft = 0x1; // NOLINT const long CullMaskRight = 0x2; // NOLINT }; namespace SurgSim { namespace Graphics { SURGSIM_REGISTER(SurgSim::Framework::Component, SurgSim::Graphics::OsgCamera, OsgCamera); OsgCamera::OsgCamera(const std::string& name) : Representation(name), OsgRepresentation(name), Camera(name), m_camera(new osg::Camera()), m_viewMatrixUniform(std::make_shared>("viewMatrix")), m_inverseViewMatrixUniform(std::make_shared>("inverseViewMatrix")), m_ambientColorUniform(std::make_shared>("ambientColor")), m_isMainCamera(false) { m_switch->removeChildren(0, m_switch->getNumChildren()); m_camera->setName(name + " Camera"); m_switch->addChild(m_camera); m_camera->addChild(m_materialProxy); m_materialProxy->setName(name + " MaterialProxy"); m_camera->setViewMatrix(toOsg(getLocalPose().inverse().matrix())); setPerspectiveProjection(45.0, 1.0, 0.01, 10.0); m_camera->setComputeNearFarMode(osgUtil::CullVisitor::DO_NOT_COMPUTE_NEAR_FAR); // Hopefully this will ignore the left and right nodes when rendering mono and // pick the appropriate node when rendering stereo m_camera->setCullMask(CullMask); m_camera->setCullMaskLeft(CullMaskLeft); m_camera->setCullMaskRight(CullMaskRight); /// Update storage of view and projection matrices m_projectionMatrix = fromOsg(m_camera->getProjectionMatrix()); // Set up uniforms osg::ref_ptr state = m_camera->getOrCreateStateSet(); m_viewMatrixUniform->addToStateSet(state); m_inverseViewMatrixUniform->addToStateSet(state); m_ambientColorUniform->addToStateSet(state); setAmbientColor(Vector4d(0.0, 0.0, 0.0, 0.0)); // We will want this in all cases m_camera->getOrCreateStateSet()->setMode(GL_TEXTURE_CUBE_MAP_SEAMLESS, osg::StateAttribute::ON); } bool OsgCamera::setRenderGroup(std::shared_ptr group) { std::vector> groups(1, group); return setRenderGroups(groups); } bool OsgCamera::setRenderGroups(const std::vector>& groups) { bool result = false; int numChildren = m_materialProxy->getNumChildren(); for (const auto& group : groups) { std::vector groupReferences = Camera::getRenderGroupReferences(); SURGSIM_ASSERT(std::find(groupReferences.begin(), groupReferences.end(), group->getName()) != groupReferences.end()) << "Trying to set the wrong group in the camera with group name <" << group->getName() << ">."; std::shared_ptr osgGroup = std::dynamic_pointer_cast(group); if (osgGroup) { result = true; m_materialProxy->addChild(osgGroup->getOsgGroup()); } else { result = false; break; } } if (result) { m_materialProxy->removeChildren(0, numChildren); result = Graphics::Camera::setRenderGroups(groups); } return result; } void OsgCamera::setLocalActive(bool val) { Component::setLocalActive(val); m_switch->setChildValue(m_camera, isActive()); } SurgSim::Math::Matrix44d OsgCamera::getViewMatrix() const { return getPose().matrix().inverse(); } void OsgCamera::setProjectionMatrix(const SurgSim::Math::Matrix44d& matrix) { m_projectionMatrix = matrix; m_camera->setProjectionMatrix(toOsg(matrix)); } const SurgSim::Math::Matrix44d& OsgCamera::getProjectionMatrix() const { return m_projectionMatrix; } SurgSim::Math::Matrix44d OsgCamera::getInverseProjectionMatrix() const { return m_projectionMatrix.inverse(); } void OsgCamera::update(double dt) { setVisible(isActive()); if (isActive()) { // HS-2014-may-05 There is an issue between setting the projection matrix in the constructor and the // instantiation of the viewer with the view port that may change the matrix inbetween, for now ... update // every frame // #workaround // m_projectionMatrix = fromOsg(m_camera->getProjectionMatrix()); auto viewMatrix = getViewMatrix(); auto floatMatrix = viewMatrix.cast(); m_camera->setViewMatrix(toOsg(viewMatrix)); m_viewMatrixUniform->set(floatMatrix); m_inverseViewMatrixUniform->set(floatMatrix.inverse()); } } bool OsgCamera::setRenderTarget(std::shared_ptr renderTarget) { bool result = false; // Check for correct dynamic type auto osg2dTarget = std::dynamic_pointer_cast(renderTarget); auto osgRectTarget = std::dynamic_pointer_cast(renderTarget); if (osg2dTarget != nullptr || osgRectTarget != nullptr) { if (m_renderTarget == nullptr) { detachCurrentRenderTarget(); } int width, height; renderTarget->getSize(&width, &height); m_camera->setViewport(0, 0, width, height); attachRenderTargetTexture(osg::Camera::DEPTH_BUFFER, renderTarget->getDepthTarget()); // OSG has 16 COLOR_BUFFER objects for (int i = 0; i < 16; ++i) { attachRenderTargetTexture(ColorBufferEnums[i], renderTarget->getColorTarget(i)); } m_camera->setRenderTargetImplementation(osg::Camera::FRAME_BUFFER_OBJECT, osg::Camera::PIXEL_BUFFER); m_camera->setRenderOrder(osg::Camera::PRE_RENDER); m_camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF); m_renderTarget = renderTarget; result = true; } else if (renderTarget == nullptr && m_renderTarget != nullptr) { detachCurrentRenderTarget(); result = true; } return result; } std::shared_ptr OsgCamera::getRenderTarget() const { return m_renderTarget; } bool OsgCamera::setMaterial(std::shared_ptr material) { std::shared_ptr osgMaterial = std::dynamic_pointer_cast(material); bool result = false; if (osgMaterial != nullptr) { m_materialProxy->setStateSet(osgMaterial->getOsgStateSet()); result = true; m_material = osgMaterial; } return result; } std::shared_ptr OsgCamera::getMaterial() const { return m_material; } void OsgCamera::clearMaterial() { m_materialProxy->setStateSet(new osg::StateSet()); } void OsgCamera::detachCurrentRenderTarget() { if (m_renderTarget != nullptr) { if (m_renderTarget->doesUseDepthTarget()) { m_camera->detach(osg::Camera::DEPTH_BUFFER); } for (int i = 0; i < m_renderTarget->getColorTargetCount(); ++i) { m_camera->detach(ColorBufferEnums[i]); } } m_renderTarget = nullptr; } void OsgCamera::setViewport(int x, int y, int width, int height) { m_camera->setViewport(x, y, width, height); } void OsgCamera::getViewport(int* x, int* y, int* width, int* height) const { SURGSIM_ASSERT(x != nullptr && y != nullptr && width != nullptr && height != nullptr) << "Parameter can't be nullptr."; auto viewPort = m_camera->getViewport(); SURGSIM_ASSERT(viewPort != nullptr) << "Trying to access viewport before it has been established."; *x = viewPort->x(); *y = viewPort->y(); *width = viewPort->width(); *height = viewPort->height(); } void OsgCamera::setViewportSize(std::array dimensions) { auto viewPort = m_camera->getViewport(); if (viewPort != nullptr) { double aspectRatioChange = (dimensions[0] / viewPort->width()) / (dimensions[1] / viewPort->height()); m_camera->setViewport(viewPort->x(), viewPort->y(), dimensions[0], dimensions[1]); m_camera->getProjectionMatrix() *= osg::Matrix::scale(1.0 / aspectRatioChange, aspectRatioChange,1.0); m_projectionMatrix = fromOsg(m_camera->getProjectionMatrix()); } else { m_camera->setViewport(0, 0, dimensions[0], dimensions[1]); } } std::array OsgCamera::getViewportSize() const { auto viewPort = m_camera->getViewport(); SURGSIM_ASSERT(viewPort != nullptr) << "Trying to access viewport before it has been established."; std::array dimensions = {viewPort->width(), viewPort->height()}; return dimensions; } void OsgCamera::setMainCamera(bool val) { if (val != m_isMainCamera) { if (val) { m_camera->removeChild(m_materialProxy); std::array masks = {CullMaskLeft, CullMaskRight}; // NOLINT // Insert two nodes into the camera hierarchy, they will update the global uniforms with the correct // value. Also attach the material proxy to each of the nodes. for (auto& mask : masks) { auto node = createUniformUpdateNode(mask); m_camera->addChild(node); node->addChild(m_materialProxy); } } else { // Remove the update nodes and hook the material proxy node back up m_camera->removeChildren(0, m_camera->getNumChildren()); m_camera->addChild(m_materialProxy); } m_isMainCamera = val; } } bool OsgCamera::isMainCamera() { return m_isMainCamera; } void OsgCamera::setPerspectiveProjection(double fovy, double aspect, double near, double far) { m_camera->setProjectionMatrixAsPerspective(fovy, aspect, near, far); m_projectionMatrix = fromOsg(m_camera->getProjectionMatrix()); } void OsgCamera::setOrthogonalProjection(double left, double right, double bottom, double top, double near, double far) { m_camera->setProjectionMatrixAsOrtho(left, right, bottom, top, near, far); m_projectionMatrix = fromOsg(m_camera->getProjectionMatrix()); } void OsgCamera::attachRenderTargetTexture(osg::Camera::BufferComponent buffer, std::shared_ptr texture) { if (texture == nullptr) { return; } std::shared_ptr osgTexture = std::dynamic_pointer_cast(texture); SURGSIM_ASSERT(osgTexture != nullptr) << "RenderTarget used a texture that was not an OsgTexture subclass"; osg::Texture* actualTexture = osgTexture->getOsgTexture(); SURGSIM_ASSERT(actualTexture != nullptr) << "Could not find texture"; m_camera->attach(buffer, actualTexture, 0, 0); } void OsgCamera::setRenderOrder(RenderOrder order, int value) { if (order < RENDER_ORDER_COUNT) { m_camera->setRenderOrder(RenderOrderEnums[order], value); } } osg::ref_ptr OsgCamera::getOsgCamera() const { return m_camera; } osg::ref_ptr OsgCamera::getOsgNode() const { return m_switch; } SurgSim::Math::Matrix44d OsgCamera::getInverseViewMatrix() const { return getPose().matrix(); } void OsgCamera::setAmbientColor(const SurgSim::Math::Vector4d& color) { m_ambientColor = color; m_ambientColorUniform->set(color.cast()); } SurgSim::Math::Vector4d OsgCamera::getAmbientColor() { return m_ambientColor; } void OsgCamera::setGenerateTangents(bool value) { SURGSIM_ASSERT(value == false) << "Generate Tangents is not supported on Cameras."; } }; // namespace Graphics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Graphics/OsgCamera.h000066400000000000000000000116521277777236100212640ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_OSGCAMERA_H #define SURGSIM_GRAPHICS_OSGCAMERA_H #include #include "SurgSim/Framework/Macros.h" #include "SurgSim/Framework/ObjectFactory.h" #include "SurgSim/Graphics/Camera.h" #include "SurgSim/Graphics/OsgRepresentation.h" #include "SurgSim/Graphics/Texture.h" #include #include #if defined(_MSC_VER) #pragma warning(push) #pragma warning(disable:4250) #endif namespace SurgSim { namespace Graphics { class Material; class Texture; class RenderTarget; template class OsgUniform; SURGSIM_STATIC_REGISTRATION(OsgCamera); /// OSG implementation of a graphics camera. /// /// A Graphics::OsgCamera wraps a osg::Camera to provide camera functionality and a osg::Switch to allow enabling and /// disabling of the camera. class OsgCamera : public OsgRepresentation, public Camera { public: /// Constructor /// \param name Name of the camera /// The view matrix is initialized with eye at (0, 0, 0), center at (0, 0, -1), and up (0, 1, 0). /// The projection matrix is initialized to a perspective matrix with FOV Y of 45 deg, Aspect Ratio of 1.0, /// Z Near of 0.01, and Z Far of 10.0. explicit OsgCamera(const std::string& name); SURGSIM_CLASSNAME(SurgSim::Graphics::OsgCamera); bool setRenderGroup(std::shared_ptr group) override; bool setRenderGroups(const std::vector>& groups) override; void setLocalActive(bool val) override; virtual SurgSim::Math::Matrix44d getViewMatrix() const; virtual SurgSim::Math::Matrix44d getInverseViewMatrix() const; void setProjectionMatrix(const SurgSim::Math::Matrix44d& matrix) override; const SurgSim::Math::Matrix44d& getProjectionMatrix() const override; SurgSim::Math::Matrix44d getInverseProjectionMatrix() const override; void update(double dt) override; /// \return the OSG camera node osg::ref_ptr getOsgCamera() const; /// \return the OSG parent node for this object osg::ref_ptr getOsgNode() const; bool setRenderTarget(std::shared_ptr renderTarget) override; std::shared_ptr getRenderTarget() const override; bool setMaterial(std::shared_ptr material) override; std::shared_ptr getMaterial() const override; void clearMaterial() override; void setRenderOrder(RenderOrder order, int value) override; void setAmbientColor(const SurgSim::Math::Vector4d& color) override; SurgSim::Math::Vector4d getAmbientColor() override; void setGenerateTangents(bool value) override; void setPerspectiveProjection(double fovy, double aspect, double near, double far) override; void setOrthogonalProjection( double left, double right, double bottom, double top, double near, double far) override; void setViewport(int x, int y, int width, int height) override; void getViewport(int* x, int* y, int* width, int* height) const override; void setViewportSize(std::array dimensions) override; std::array getViewportSize() const override; void setMainCamera(bool val) override; bool isMainCamera() override; private: osg::ref_ptr m_camera; /// Projection matrix of the camera SurgSim::Math::Matrix44d m_projectionMatrix; std::unordered_map> m_textureMap; std::shared_ptr m_renderTarget; /// Attach a specific texture to a specific BufferComponent, works for Depth and all the Colors. /// \param buffer The BufferComponent enum. /// \param texture The specific texture to attach. void attachRenderTargetTexture(osg::Camera::BufferComponent buffer, std::shared_ptr texture); /// Detach the current render target from the camera. void detachCurrentRenderTarget(); /// Uniform to carry the view matrix std::shared_ptr> m_viewMatrixUniform; /// Uniform to carry the inverse view matrix std::shared_ptr> m_inverseViewMatrixUniform; /// Uniform to carry the ambient color std::shared_ptr> m_ambientColorUniform; /// Value for ambient color SurgSim::Math::Vector4d m_ambientColor; bool m_isMainCamera; }; }; // namespace Graphics }; // namespace SurgSim #if defined(_MSC_VER) #pragma warning(pop) #endif #endif // SURGSIM_GRAPHICS_OSGCAMERA_H opensurgsim-0.7.0/SurgSim/Graphics/OsgCapsuleRepresentation.cpp000066400000000000000000000077651277777236100247600ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Graphics/OsgCapsuleRepresentation.h" #include "SurgSim/Graphics/OsgUnitCylinder.h" #include "SurgSim/Graphics/OsgUnitSphere.h" namespace SurgSim { namespace Graphics { SURGSIM_REGISTER(SurgSim::Framework::Component, SurgSim::Graphics::OsgCapsuleRepresentation, OsgCapsuleRepresentation); OsgCapsuleRepresentation::OsgCapsuleRepresentation(const std::string& name) : Representation(name), OsgRepresentation(name), CapsuleRepresentation(name), m_scale(1.0, 1.0), m_sharedUnitCylinder(getSharedUnitCylinder()), m_sharedUnitSphere(getSharedUnitSphere()), m_patCylinder(new osg::PositionAttitudeTransform()), m_patSphere1(new osg::PositionAttitudeTransform()), m_patSphere2(new osg::PositionAttitudeTransform()) { m_patCylinder->addChild(m_sharedUnitCylinder->getNode()); m_patSphere1->addChild(m_sharedUnitSphere->getNode()); m_patSphere2->addChild(m_sharedUnitSphere->getNode()); m_patCylinder->setAttitude(osg::Quat(osg::PI_2, osg::Vec3d(1.0, 0.0, 0.0))); m_patSphere1->setPosition(osg::Vec3d(0.0, 0.5, 0.0)); m_patSphere2->setPosition(osg::Vec3d(0.0, -0.5, 0.0)); m_transform->addChild(m_patCylinder); m_transform->addChild(m_patSphere1); m_transform->addChild(m_patSphere2); } void OsgCapsuleRepresentation::setRadius(double radius) { m_scale.x() = radius; m_patCylinder->setScale(osg::Vec3d(radius, radius, m_scale.y())); m_patSphere1->setScale(osg::Vec3d(radius, radius, radius)); m_patSphere2->setScale(osg::Vec3d(radius, radius, radius)); } double OsgCapsuleRepresentation::getRadius() const { return m_scale.x(); } void OsgCapsuleRepresentation::setHeight(double height) { m_scale.y() = height; m_patCylinder->setScale(osg::Vec3d(m_scale.x(), m_scale.x(), height)); m_patSphere1->setPosition(osg::Vec3d(0.0, height / 2, 0.0)); m_patSphere2->setPosition(osg::Vec3d(0.0, -height / 2, 0.0)); } double OsgCapsuleRepresentation::getHeight() const { return m_scale.y(); } void OsgCapsuleRepresentation::setSize(double radius, double height) { m_scale.x() = radius; m_scale.y() = height; m_patCylinder->setScale(osg::Vec3d(radius, radius, height)); m_patSphere1->setScale(osg::Vec3d(radius, radius, radius)); m_patSphere2->setScale(osg::Vec3d(radius, radius, radius)); m_patSphere1->setPosition(osg::Vec3d(0.0, height / 2, 0.0)); m_patSphere2->setPosition(osg::Vec3d(0.0, -height / 2, 0.0)); } void OsgCapsuleRepresentation::getSize(double* radius, double* height) { *radius = m_scale.x(); *height = m_scale.y(); } void OsgCapsuleRepresentation::setSize(const SurgSim::Math::Vector2d& size) { m_scale.set(size.x(), size.y()); m_patCylinder->setScale(osg::Vec3d(size.x(), size.x(), size.y())); m_patSphere1->setScale(osg::Vec3d(size.x(), size.x(), size.x())); m_patSphere2->setScale(osg::Vec3d(size.x(), size.x(), size.x())); m_patSphere1->setPosition(osg::Vec3d(0.0, size.y() / 2, 0.0)); m_patSphere2->setPosition(osg::Vec3d(0.0, -size.y() / 2, 0.0)); } SurgSim::Math::Vector2d OsgCapsuleRepresentation::getSize() const { return SurgSim::Math::Vector2d(m_scale._v); } std::shared_ptr OsgCapsuleRepresentation::getSharedUnitCylinder() { static SurgSim::Framework::SharedInstance shared; return shared.get(); } std::shared_ptr OsgCapsuleRepresentation::getSharedUnitSphere() { static SurgSim::Framework::SharedInstance sharedSphere; return sharedSphere.get(); } }; // Graphics }; // SurgSimopensurgsim-0.7.0/SurgSim/Graphics/OsgCapsuleRepresentation.h000066400000000000000000000071031277777236100244070ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_OSGCAPSULEREPRESENTATION_H #define SURGSIM_GRAPHICS_OSGCAPSULEREPRESENTATION_H #include "SurgSim/Framework/ObjectFactory.h" #include "SurgSim/Graphics/CapsuleRepresentation.h" #include "SurgSim/Graphics/OsgRepresentation.h" #include "SurgSim/Framework/SharedInstance.h" #include #if defined(_MSC_VER) #pragma warning(push) #pragma warning(disable:4250) #endif namespace SurgSim { namespace Graphics { class OsgUnitCylinder; class OsgUnitSphere; SURGSIM_STATIC_REGISTRATION(OsgCapsuleRepresentation); /// OSG implementation of a graphics capsule representation. class OsgCapsuleRepresentation : public OsgRepresentation, public CapsuleRepresentation { public: /// Constructor /// \param name Name of the representation explicit OsgCapsuleRepresentation(const std::string& name); SURGSIM_CLASSNAME(SurgSim::Graphics::OsgCapsuleRepresentation); /// Sets the radius of the capsule /// \param radius Radius of the capsule void setRadius(double radius) override; /// Returns the radius of the capsule /// \return Radius along X-axis and Z-axis of the capsule double getRadius() const override; /// Sets the height of the capsule /// \param height Height of the capsule void setHeight(double height) override; /// Returns the height of the capsule /// \return Height along Y-axis of the capsule double getHeight() const override; /// Sets the size of the capsule /// \param radius Size along X-axis and Z-axis of the capsule /// \param height Size along Y-axis of the capsule void setSize(double radius, double height) override; /// Gets the size of the capsule /// \param [out] radius Variable to receive the size along X-axis and Z-axis of the capsule /// \param [out] height Variable to receive the size along Y-axis of the capsule void getSize(double* radius, double* height) override; /// Sets the size of the capsule /// \param size Size of the capsule void setSize(const SurgSim::Math::Vector2d& size) override; /// Returns the radius of the capsule /// \return Size of the capsule SurgSim::Math::Vector2d getSize() const override; private: /// The OSG Capsule shape consist of one unit cylinder and two unit spheres /// This transform scales it to the size set. osg::Vec2d m_scale; /// Shared capsule, so that the geometry can be instanced rather than having multiple copies. std::shared_ptr m_sharedUnitCylinder; std::shared_ptr m_sharedUnitSphere; /// Returns the shared geometry static std::shared_ptr getSharedUnitCylinder(); static std::shared_ptr getSharedUnitSphere(); osg::ref_ptr m_patCylinder; osg::ref_ptr m_patSphere1; osg::ref_ptr m_patSphere2; }; }; // namespace Graphics }; // namespace SurgSim #if defined(_MSC_VER) #pragma warning(pop) #endif #endif // SURGSIM_GRAPHICS_OSGCAPSULEREPRESENTATION_H opensurgsim-0.7.0/SurgSim/Graphics/OsgConversions.h000066400000000000000000000020311277777236100223730ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Conversions to and from OSG types #ifndef SURGSIM_GRAPHICS_OSGCONVERSIONS_H #define SURGSIM_GRAPHICS_OSGCONVERSIONS_H #include "SurgSim/Graphics/OsgMatrixConversions.h" #include "SurgSim/Graphics/OsgQuaternionConversions.h" #include "SurgSim/Graphics/OsgRigidTransformConversions.h" #include "SurgSim/Graphics/OsgVectorConversions.h" #endif // SURGSIM_GRAPHICS_OSGCONVERSIONS_H opensurgsim-0.7.0/SurgSim/Graphics/OsgCurveRepresentation.cpp000066400000000000000000000132541277777236100244360ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Graphics/OsgCurveRepresentation.h" #include #include #include #include #include #include #include #include "SurgSim/DataStructures/Vertices.h" #include "SurgSim/Graphics/OsgConversions.h" #include "SurgSim/Math/CardinalSplines.h" #include "SurgSim/Math/Geometry.h" namespace SurgSim { namespace Graphics { SURGSIM_REGISTER(SurgSim::Framework::Component, SurgSim::Graphics::OsgCurveRepresentation, OsgCurveRepresentation) OsgCurveRepresentation::OsgCurveRepresentation(const std::string& name) : Representation(name), OsgRepresentation(name), CurveRepresentation(name), m_subdivision(100), m_tension(0.4) { osg::Geode* geode = new osg::Geode(); m_geometry = new osg::Geometry(); m_geometry->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::OFF); // At this stage there are no vertices in there m_drawArrays = new osg::DrawArrays(osg::PrimitiveSet::LINE_STRIP, 0, 0); m_geometry->addPrimitiveSet(m_drawArrays); m_geometry->setUseDisplayList(false); m_geometry->setUseVertexBufferObjects(true); m_geometry->setDataVariance(osg::Object::DYNAMIC); m_vertexData = new osg::Vec3Array; m_geometry->setVertexArray(m_vertexData); m_normalData = new osg::Vec3Array; m_geometry->setNormalArray(m_normalData, osg::Array::BIND_PER_VERTEX); setColor(Math::Vector4d(1.0, 1.0, 1.0, 1.0)); setWidth(1.5); setAntiAliasing(true); geode->addDrawable(m_geometry); m_transform->addChild(geode); } OsgCurveRepresentation::~OsgCurveRepresentation() { } bool OsgCurveRepresentation::doInitialize() { return true; } bool OsgCurveRepresentation::doWakeUp() { return true; } void OsgCurveRepresentation::doUpdate(double dt) { DataStructures::VerticesPlain controlPoints; if (m_locker.tryTakeChanged(&controlPoints)) { updateGraphics(controlPoints); } } void OsgCurveRepresentation::setSubdivisions(size_t num) { m_subdivision = num; } size_t OsgCurveRepresentation::getSubdivisions() const { return m_subdivision; } void OsgCurveRepresentation::setTension(double tension) { m_tension = tension; } double OsgCurveRepresentation::getTension() const { return m_tension; } void OsgCurveRepresentation::updateGraphics(const DataStructures::VerticesPlain& controlPoints) { const double stepsize = 1.0 / (m_subdivision + 1); Math::CardinalSplines::extendControlPoints(controlPoints, &m_controlPoints); size_t numPoints = static_cast(static_cast(m_controlPoints.size() - 3) / stepsize); m_vertices.clear(); m_vertices.reserve(numPoints); Math::CardinalSplines::interpolate(getSubdivisions(), m_controlPoints, &m_vertices, getTension()); size_t vertexCount = m_vertices.size(); if (m_vertexData->size() != vertexCount) { m_vertexData->resize(vertexCount); m_normalData->resize(vertexCount); m_drawArrays->set(osg::PrimitiveSet::LINE_STRIP, 0, vertexCount); m_drawArrays->dirty(); } // #performance // Calculate the bounding box while iterating over the vertices, this will save osg time in the update traversal for (size_t i = 0; i < vertexCount; ++i) { const auto& vertex0 = m_vertices[i]; const auto& vertex1 = (i < vertexCount - 1) ? m_vertices[i + 1] : m_controlPoints.back(); // Assign the segment into the normal for use in the shader const auto& normal = vertex1 - vertex0; (*m_normalData)[i][0] = static_cast(normal[0]); (*m_normalData)[i][1] = static_cast(normal[1]); (*m_normalData)[i][2] = static_cast(normal[2]); (*m_vertexData)[i][0] = static_cast(vertex0[0]); (*m_vertexData)[i][1] = static_cast(vertex0[1]); (*m_vertexData)[i][2] = static_cast(vertex0[2]); } m_vertexData->dirty(); m_normalData->dirty(); m_geometry->dirtyBound(); } void OsgCurveRepresentation::setWidth(double width) { auto lineWidth = new osg::LineWidth(width); m_geometry->getOrCreateStateSet()->setAttribute(lineWidth, osg::StateAttribute::ON); m_width = width; } double OsgCurveRepresentation::getWidth() const { return m_width; } void OsgCurveRepresentation::setAntiAliasing(bool val) { auto state = m_geometry->getOrCreateStateSet(); if (val && state->getMode(GL_BLEND) == osg::StateAttribute::INHERIT) { state->setMode(GL_BLEND, osg::StateAttribute::ON); state->setMode(GL_LINE_SMOOTH, osg::StateAttribute::ON); } else { state->setMode(GL_BLEND, osg::StateAttribute::INHERIT); state->setMode(GL_LINE_SMOOTH, osg::StateAttribute::INHERIT); } } bool OsgCurveRepresentation::isAntiAliasing() const { return m_geometry->getOrCreateStateSet()->getMode(GL_BLEND) == osg::StateAttribute::ON; } void OsgCurveRepresentation::setColor(const SurgSim::Math::Vector4d& color) { osg::Vec4Array* colors = dynamic_cast(m_geometry->getColorArray()); if (colors == nullptr) { colors = new osg::Vec4Array(1); m_geometry->setColorArray(colors); m_geometry->setColorBinding(osg::Geometry::BIND_OVERALL); } (*colors)[0] = SurgSim::Graphics::toOsg(color); m_color = color; } Math::Vector4d OsgCurveRepresentation::getColor() const { return m_color; } } } opensurgsim-0.7.0/SurgSim/Graphics/OsgCurveRepresentation.h000066400000000000000000000057471277777236100241130ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_OSGCURVEREPRESENTATION_H #define SURGSIM_GRAPHICS_OSGCURVEREPRESENTATION_H #include "SurgSim/Graphics/CurveRepresentation.h" #include "SurgSim/Graphics/OsgRepresentation.h" #include #include #if defined(_MSC_VER) #pragma warning(push) #pragma warning(disable:4250) #endif namespace osg { class Geometry; class DrawArrays; } namespace SurgSim { namespace Graphics { SURGSIM_STATIC_REGISTRATION(OsgCurveRepresentation) /// Implements the CurveRepresentation for OpenSceneGraph, it uses Catmull Rom interpolation, to draw the line /// as a GL_LINESTRIP. use the material_curve.vert shader for rendering. This class will also deposit the information /// of the segment in the normal information for the vertex. class OsgCurveRepresentation : public OsgRepresentation, public CurveRepresentation { public: /// Constructor /// \param name Name of the representation explicit OsgCurveRepresentation(const std::string& name); ~OsgCurveRepresentation(); SURGSIM_CLASSNAME(SurgSim::Graphics::OsgCurveRepresentation); bool doInitialize() override; bool doWakeUp() override; void doUpdate(double dt) override; void setSubdivisions(size_t num) override; size_t getSubdivisions() const override; void setTension(double tension) override; double getTension() const override; void setColor(const SurgSim::Math::Vector4d& color) override; Math::Vector4d getColor() const override; void setWidth(double width) override; double getWidth() const override; void setAntiAliasing(bool val) override; bool isAntiAliasing() const override; private: /// Update the OSG structure with the information of the control points /// \param controlPoints to use void updateGraphics(const DataStructures::VerticesPlain& controlPoints); ///@{ /// OSG handles for updating osg::ref_ptr m_geometry; osg::ref_ptr m_vertexData; osg::ref_ptr m_normalData; osg::ref_ptr m_drawArrays; ///@} /// @{ /// Members for the CurveRepresentation properties Math::Vector4d m_color; size_t m_subdivision; double m_tension; double m_width; ///@} ///@{ /// Local structures to keep allocations to a minimum std::vector m_controlPoints; std::vector m_vertices; ///@} }; #if defined(_MSC_VER) #pragma warning(pop) #endif } } #endif opensurgsim-0.7.0/SurgSim/Graphics/OsgCylinderRepresentation.cpp000066400000000000000000000054321277777236100251220ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Graphics/OsgCylinderRepresentation.h" #include "SurgSim/Graphics/OsgRigidTransformConversions.h" #include "SurgSim/Graphics/OsgUnitCylinder.h" #include "SurgSim/Framework/SharedInstance.h" #include #include #include namespace SurgSim { namespace Graphics { SURGSIM_REGISTER(SurgSim::Framework::Component, SurgSim::Graphics::OsgCylinderRepresentation, OsgCylinderRepresentation); OsgCylinderRepresentation::OsgCylinderRepresentation(const std::string& name) : Representation(name), OsgRepresentation(name), CylinderRepresentation(name), m_scale(1.0, 1.0), m_sharedUnitCylinder(getSharedUnitCylinder()), m_patCylinder(new osg::PositionAttitudeTransform) { m_patCylinder->addChild(m_sharedUnitCylinder->getNode()); m_patCylinder->setAttitude(osg::Quat(osg::PI_2, osg::Vec3d(1.0, 0.0, 0.0))); m_transform->addChild(m_patCylinder); } void OsgCylinderRepresentation::setRadius(double radius) { m_scale.x() = radius; m_patCylinder->setScale(osg::Vec3d(radius, radius, m_scale.y())); } double OsgCylinderRepresentation::getRadius() const { return m_scale.x(); } void OsgCylinderRepresentation::setHeight(double height) { m_scale.y() = height; m_patCylinder->setScale(osg::Vec3d(m_scale.x(), m_scale.x(), height)); } double OsgCylinderRepresentation::getHeight() const { return m_scale.y(); } void OsgCylinderRepresentation::setSize(double radius, double height) { m_scale.x() = radius; m_scale.y() = height; m_patCylinder->setScale(osg::Vec3d(radius, radius, height)); } void OsgCylinderRepresentation::getSize(double* radius, double* height) { *radius = m_scale.x(); *height = m_scale.y(); } void OsgCylinderRepresentation::setSize(const SurgSim::Math::Vector2d& size) { m_scale.set(size.x(), size.y()); m_patCylinder->setScale(osg::Vec3d(size.x(), size.x(), size.y())); } SurgSim::Math::Vector2d OsgCylinderRepresentation::getSize() const { return SurgSim::Math::Vector2d(m_scale._v); } std::shared_ptr OsgCylinderRepresentation::getSharedUnitCylinder() { static SurgSim::Framework::SharedInstance shared; return shared.get(); } }; // Graphics }; // SurgSimopensurgsim-0.7.0/SurgSim/Graphics/OsgCylinderRepresentation.h000066400000000000000000000064731277777236100245750ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_OSGCYLINDERREPRESENTATION_H #define SURGSIM_GRAPHICS_OSGCYLINDERREPRESENTATION_H #include "SurgSim/Framework/ObjectFactory.h" #include "SurgSim/Graphics/CylinderRepresentation.h" #include "SurgSim/Graphics/OsgRepresentation.h" #include #if defined(_MSC_VER) #pragma warning(push) #pragma warning(disable:4250) #endif namespace SurgSim { namespace Graphics { class OsgUnitCylinder; SURGSIM_STATIC_REGISTRATION(OsgCylinderRepresentation); /// OSG implementation of a graphics Cylinder representation. class OsgCylinderRepresentation : public OsgRepresentation, public CylinderRepresentation { public: /// Constructor /// \param name Name of the representation explicit OsgCylinderRepresentation(const std::string& name); SURGSIM_CLASSNAME(SurgSim::Graphics::OsgCylinderRepresentation); /// Sets the radius of the cylinder /// \param radius Radius along X-axis and Z-axis of the cylinder void setRadius(double radius) override; /// Returns the radius of the cylinder /// \return Radius along X-axis and Z-axis of cylinder double getRadius() const override; /// Sets the height of the cylinder /// \param height Height along Y-axis of the cylinder void setHeight(double height) override; /// Returns the height of the cylinder /// \return Height along Y-axis of the cylinder double getHeight() const override; /// Sets the size of the cylinder /// \param radius Size along X-axis and Z-axis of the cylinder /// \param height Size along Y-axis of the cylinder void setSize(double radius, double height) override; /// Gets the size of the cylinder /// \param [out] radius Variable to receive the size along X-axis and Z-axis of the cylinder /// \param [out] height Variable to receive the size along Y-axis of the cylinder void getSize(double* radius, double* height) override; /// Sets the size of the cylinder /// \param size Size of the cylinder void setSize(const SurgSim::Math::Vector2d& size) override; /// Returns the size of the cylinder /// \return Size of the cylinder SurgSim::Math::Vector2d getSize() const override; private: /// The OSG Cylinder shape is a unit Cylinder and this transform scales it to the size set. osg::Vec2d m_scale; /// Shared unit Cylinder, so that the geometry can be instanced rather than having multiple copies. std::shared_ptr m_sharedUnitCylinder; /// Returns the shared unit cylinder static std::shared_ptr getSharedUnitCylinder(); osg::ref_ptr m_patCylinder; }; }; // namespace Graphics }; // namespace SurgSim #if defined(_MSC_VER) #pragma warning(pop) #endif #endif // SURGSIM_GRAPHICS_OSGCYLINDERREPRESENTATION_H opensurgsim-0.7.0/SurgSim/Graphics/OsgFont.cpp000066400000000000000000000025461277777236100213370ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Graphics/OsgFont.h" #include #include "SurgSim/Framework/Log.h" SURGSIM_REGISTER(SurgSim::Framework::Asset, SurgSim::Graphics::OsgFont, OsgFont); namespace SurgSim { namespace Graphics { OsgFont::OsgFont() { } OsgFont::~OsgFont() { } bool OsgFont::doLoad(const std::string& filePath) { std::string osgFilePath = osgText::findFontFile(filePath); m_font = osgText::readFontFile(osgFilePath); bool result = m_font.valid(); if (!result) { SURGSIM_LOG_WARNING(SurgSim::Framework::Logger::getLogger("Graphics")) << "The font could not be loaded from " << osgFilePath << "."; } return result; } osg::ref_ptr OsgFont::getOsgFont() const { return m_font; } } } opensurgsim-0.7.0/SurgSim/Graphics/OsgFont.h000066400000000000000000000025341277777236100210010ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_OSGFONT_H #define SURGSIM_GRAPHICS_OSGFONT_H #include "SurgSim/Graphics/Font.h" #include namespace osgText { class Font; } namespace SurgSim { namespace Graphics { /// Osg specialization of the Font class, supports osgText::Font class OsgFont : public SurgSim::Graphics::Font { public: /// Constructor OsgFont(); /// Destructor virtual ~OsgFont(); SURGSIM_CLASSNAME(SurgSim::Graphics::OsgFont); /// \return the appropriate osgText::Font reference osg::ref_ptr getOsgFont() const; protected: bool doLoad(const std::string& filePath) override; private: /// Osg pointer to the font structure osg::ref_ptr m_font; }; } } #endif opensurgsim-0.7.0/SurgSim/Graphics/OsgGroup.cpp000066400000000000000000000053431277777236100215230ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Graphics/OsgGroup.h" #include "SurgSim/Framework/Assert.h" #include "SurgSim/Graphics/OsgRepresentation.h" using SurgSim::Graphics::OsgRepresentation; using SurgSim::Graphics::OsgGroup; OsgGroup::OsgGroup(const std::string& name) : SurgSim::Graphics::Group(name), m_isVisible(true), m_switch(new osg::Switch()) { m_switch->getOrCreateStateSet()->setGlobalDefaults(); m_switch->setName(name + " Switch"); }; void OsgGroup::setVisible(bool visible) { m_isVisible = visible; if (m_isVisible) { m_switch->setAllChildrenOn(); } else { m_switch->setAllChildrenOff(); } } bool OsgGroup::isVisible() const { return m_isVisible; } bool OsgGroup::add(std::shared_ptr representation) { std::shared_ptr osgRepresentation = std::dynamic_pointer_cast(representation); if (osgRepresentation && Group::add(osgRepresentation)) { m_switch->addChild(osgRepresentation->getOsgNode()); m_switch->setChildValue(osgRepresentation->getOsgNode(), m_isVisible); return true; } else { return false; } } bool OsgGroup::append(std::shared_ptr group) { std::shared_ptr osgGroup = std::dynamic_pointer_cast(group); if (osgGroup && Group::append(osgGroup)) { return true; } else { return false; } } bool OsgGroup::remove(std::shared_ptr representation) { std::shared_ptr osgRepresentation = std::dynamic_pointer_cast(representation); if (osgRepresentation && Group::remove(osgRepresentation)) { m_switch->removeChild(osgRepresentation->getOsgNode()); return true; } else { return false; } } void OsgGroup::clear() { while (!getMembers().empty()) { std::shared_ptr representation = getMembers().front(); SURGSIM_ASSERT(remove(representation)) << "Removal of representation " << representation->getName() << " failed while attempting to clear group " << getName() << "!"; } } osg::ref_ptr OsgGroup::getOsgGroup() const { return m_switch; }opensurgsim-0.7.0/SurgSim/Graphics/OsgGroup.h000066400000000000000000000054351277777236100211720ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_OSGGROUP_H #define SURGSIM_GRAPHICS_OSGGROUP_H #include "SurgSim/Graphics/Group.h" #include #include namespace SurgSim { namespace Graphics { /// OSG implementation of a graphics group. /// /// A Graphics::OsgGroup wraps a osg::Switch to provide group functionality. class OsgGroup : public Group { public: /// Constructor /// \param name Name of the group explicit OsgGroup(const std::string& name); /// Sets whether this group is currently visible /// \param visible True for visible, false for invisible void setVisible(bool visible) override; /// Gets whether this group is currently visible /// \return True for visible, false for invisible bool isVisible() const override; /// Adds an representation /// \param representation Representation to add to this group /// \return True if the representation is added successfully, false if failure /// Only subclasses of OsgRepresentation will be added successfully. bool add(std::shared_ptr representation) override; /// Adds all representations in another group to this group /// \param group Group of representations to add /// \return True if all representations are added successfully, false if failure /// Only subclasses of OsgGroup will be appended successfully. bool append(std::shared_ptr group) override; /// Removes an representation /// \param representation Representation to remove from this group /// \return True if the representation is removed successfully, false if representation is not in this group or /// other failure bool remove(std::shared_ptr representation) override; /// Removes all representations void clear() override; /// Returns the root OSG group node osg::ref_ptr getOsgGroup() const; private: /// Whether the group is currently visible or not /// Newly added representations or groups will have this visibility. bool m_isVisible; /// OSG group node /// A switch is used to provide visibility functionality. osg::ref_ptr m_switch; }; }; // namespace Graphics }; // namespace SurgSim #endif // SURGSIM_GRAPHICS_OSGGROUP_H opensurgsim-0.7.0/SurgSim/Graphics/OsgLight.cpp000066400000000000000000000143041277777236100214730ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Graphics/OsgLight.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Graphics/OsgGroup.h" #include "SurgSim/Graphics/OsgConversions.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/RigidTransform.h" using SurgSim::Math::Vector3d; using SurgSim::Math::Quaterniond; using SurgSim::Math::RigidTransform3d; #include #include #include #include using osg::Uniform; namespace SurgSim { namespace Graphics { SURGSIM_REGISTER(SurgSim::Framework::Component, SurgSim::Graphics::OsgLight, OsgLight); /// \note HS-2013-sep-09 Right now we are implementing all the shader uniforms as floats, this /// means that they all have to be downconverted from double, i don't know what the hit /// of going to double in the shaders would be OsgLight::OsgLight(const std::string& name) : Representation(name), OsgRepresentation(name), Light(name), m_diffuseColor(1.0, 1.0, 1.0, 1.0), m_specularColor(1.0, 1.0, 1.0, 1.0), m_constantAttenuation(1.0), m_linearAttenuation(0.0), m_quadraticAttenuation(0.0) { std::string prefix = "lightSource."; m_light = new osg::Light(); m_light->setName(name); m_light->setLightNum(0); m_lightSource = new osg::LightSource(); m_lightSource->setDataVariance(osg::Object::DYNAMIC); m_lightSource->setLight(m_light); m_switch->addChild(m_lightSource); m_uniforms[POSITION] = new osg::Uniform(osg::Uniform::FLOAT_VEC4, prefix + "position"); m_uniforms[DIFFUSE_COLOR] = new osg::Uniform(osg::Uniform::FLOAT_VEC4, prefix + "diffuse"); setDiffuseColor(m_diffuseColor); m_uniforms[SPECULAR_COLOR] = new osg::Uniform(osg::Uniform::FLOAT_VEC4, prefix + "specular"); setSpecularColor(m_specularColor); m_uniforms[CONSTANT_ATTENUATION] = new osg::Uniform(osg::Uniform::FLOAT, prefix + "constantAttenuation"); setConstantAttenuation(m_constantAttenuation); m_uniforms[LINEAR_ATTENUATION] = new osg::Uniform(osg::Uniform::FLOAT, prefix + "linearAttenuation"); setLinearAttenuation(m_linearAttenuation); m_uniforms[QUADRATIC_ATTENUATION] = new osg::Uniform(osg::Uniform::FLOAT, prefix + "quadraticAttenuation"); setQuadraticAttenuation(m_quadraticAttenuation); // By default light the main group setLightGroupReference(SurgSim::Graphics::Representation::DefaultGroupName); } OsgLight::~OsgLight() { } bool OsgLight::setGroup(std::shared_ptr group) { std::shared_ptr newGroup = std::dynamic_pointer_cast(group); if (group != nullptr && newGroup == nullptr) { SURGSIM_LOG_WARNING(SurgSim::Framework::Logger::getLogger("Graphics")) << "OsgLight::setGroup() called with a group that is not an OsgGroup."; } bool clearGroup = m_group != nullptr && (newGroup != nullptr || group == nullptr); bool setGroup = (newGroup != nullptr); bool success = (group != nullptr && newGroup != nullptr) || group == nullptr; if (clearGroup) { osg::ref_ptr stateSet = m_group->getOsgGroup()->getOrCreateStateSet(); remove(stateSet); m_group = nullptr; } if (setGroup) { osg::ref_ptr stateSet = newGroup->getOsgGroup()->getOrCreateStateSet(); apply(stateSet); m_group = newGroup; } return success; } std::shared_ptr OsgLight::getGroup() { return m_group; } void OsgLight::setDiffuseColor(const SurgSim::Math::Vector4d& color) { m_diffuseColor = color; SurgSim::Math::Vector4f floatColor = color.cast(); osg::Vec4f osgVec = toOsg(floatColor); m_uniforms[DIFFUSE_COLOR]->set(osgVec); m_light->setDiffuse(osgVec); } SurgSim::Math::Vector4d OsgLight::getDiffuseColor() { return m_diffuseColor; } void OsgLight::setSpecularColor(const SurgSim::Math::Vector4d& color) { m_specularColor = color; SurgSim::Math::Vector4f floatColor = color.cast(); osg::Vec4f osgVec = toOsg(floatColor); m_uniforms[SPECULAR_COLOR]->set(osgVec); m_light->setSpecular(osgVec); } SurgSim::Math::Vector4d OsgLight::getSpecularColor() { return m_specularColor; } void OsgLight::setConstantAttenuation(double val) { m_constantAttenuation = val; m_uniforms[CONSTANT_ATTENUATION]->set(static_cast(val)); m_light->setConstantAttenuation(val); } double OsgLight::getConstantAttenuation() { return m_constantAttenuation; } void OsgLight::setLinearAttenuation(double val) { m_linearAttenuation = val; m_uniforms[LINEAR_ATTENUATION]->set(static_cast(val)); m_light->setLinearAttenuation(val); } double OsgLight::getLinearAttenuation() { return m_linearAttenuation; } void OsgLight::setQuadraticAttenuation(double val) { m_quadraticAttenuation = val; m_uniforms[QUADRATIC_ATTENUATION]->set(static_cast(val)); m_light->setQuadraticAttenuation(val); } double OsgLight::getQuadraticAttenuation() { return m_quadraticAttenuation; } void OsgLight::doUpdate(double dt) { SurgSim::Math::Vector3f position = getPose().translation().cast(); osg::Vec4f osgVec(osg::Vec4f(toOsg(position), 1.0)); m_uniforms[POSITION]->set(osgVec); m_light->setPosition(osgVec); } void OsgLight::apply(osg::ref_ptr stateSet) { for (auto it = std::begin(m_uniforms); it != std::end(m_uniforms); ++it) { stateSet->addUniform(it->second); } } void OsgLight::remove(osg::ref_ptr stateSet) { for (auto it = std::begin(m_uniforms); it != std::end(m_uniforms); ++it) { stateSet->removeUniform(it->second); } } void OsgLight::setLightGroupReference(const std::string& name) { m_groupReference = name; removeGroupReference(name); } std::string OsgLight::getLightGroupReference() { return m_groupReference; } }; // Graphics }; // SurgSim opensurgsim-0.7.0/SurgSim/Graphics/OsgLight.h000066400000000000000000000073351277777236100211460ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_OSGLIGHT_H #define SURGSIM_GRAPHICS_OSGLIGHT_H #include #include #include #include "SurgSim/Graphics/OsgRepresentation.h" #include "SurgSim/Graphics/Light.h" #include #if defined(_MSC_VER) #pragma warning(push) #pragma warning(disable:4250) #endif namespace osg { class Uniform; class StateSet; class Light; class LightSource; } namespace SurgSim { namespace Graphics { class OsgGroup; SURGSIM_STATIC_REGISTRATION(OsgLight); /// OpenScenegraph implementation for the Light interface class OsgLight : public OsgRepresentation, public Light { public: /// If we use the uniforms map, to check for all the uniforms that should be set in the stateset, then /// we can reduce the breakability of the unittest friend class OsgLightTests; /// Constructor explicit OsgLight(const std::string& name); virtual ~OsgLight(); SURGSIM_CLASSNAME(SurgSim::Graphics::OsgLight); bool setGroup(std::shared_ptr group) override; void setLightGroupReference(const std::string& name) override; std::string getLightGroupReference() override; std::shared_ptr getGroup() override; void setDiffuseColor(const SurgSim::Math::Vector4d& color) override; SurgSim::Math::Vector4d getDiffuseColor() override; void setSpecularColor(const SurgSim::Math::Vector4d& color) override; SurgSim::Math::Vector4d getSpecularColor() override; void setConstantAttenuation(double val) override; double getConstantAttenuation() override; void setLinearAttenuation(double val) override; double getLinearAttenuation() override; void setQuadraticAttenuation(double val) override; double getQuadraticAttenuation() override; private: void doUpdate(double dt) override; /// Applies all the lights variables to the given StateSet void apply(osg::ref_ptr stateSet); /// Removes all the lights variable from the given StateSet void remove(osg::ref_ptr stateSet); /// Internal for managing uniforms enum UniformType { POSITION = 0, DIFFUSE_COLOR, SPECULAR_COLOR, CONSTANT_ATTENUATION, LINEAR_ATTENUATION, QUADRATIC_ATTENUATION }; /// The group for this light std::shared_ptr m_group; /// Map for managing all uniforms that this object owns std::unordered_map> m_uniforms; SurgSim::Math::Vector4d m_diffuseColor; ///< The actual diffuse color that was set SurgSim::Math::Vector4d m_specularColor; ///< The actual specular color that was set double m_constantAttenuation; ///< The actual constant attenuation value that was set double m_linearAttenuation; ///< The actual linear attenuation value that was set double m_quadraticAttenuation; ///< The actual quadratic attenuation value that was set ///@{ /// Osg instances to manage the light osg::ref_ptr m_light; osg::ref_ptr m_lightSource; ///@} std::string m_groupReference; ///< Name of the group that this light should shine on... }; #if defined(_MSC_VER) #pragma warning(pop) #endif }; // Graphics }; // SurgSim #endif opensurgsim-0.7.0/SurgSim/Graphics/OsgLog.cpp000066400000000000000000000030541277777236100211450ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Graphics/OsgLog.h" using SurgSim::Graphics::OsgLog; namespace SurgSim { namespace Graphics { OsgLog::OsgLog() : m_logger(SurgSim::Framework::Logger::getLogger("Osg")) { #ifdef OSS_DEBUG osg::setNotifyLevel(osg::DEBUG_FP); #endif } void OsgLog::notify(osg::NotifySeverity severity, const char *message) { // Map osg logging levels into OSS logging levels if (severity <= osg::FATAL) { SURGSIM_LOG(m_logger, CRITICAL) << message; } else if (osg::FATAL < severity && severity <= osg::WARN) { SURGSIM_LOG(m_logger, WARNING) << message; } else if (osg::WARN < severity && severity <= osg::INFO) { SURGSIM_LOG(m_logger, INFO) << message; } else if (osg::INFO < severity && severity <= osg::DEBUG_FP) { SURGSIM_LOG(m_logger, DEBUG) << message; } else { SURGSIM_LOG(m_logger, CRITICAL) << "Unknown severity in OsgLog::notify()"; } } }; // namespace Graphics }; // namespace SurgSimopensurgsim-0.7.0/SurgSim/Graphics/OsgLog.h000066400000000000000000000034731277777236100206170ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_OSGLOG_H #define SURGSIM_GRAPHICS_OSGLOG_H #include #include "SurgSim/Framework/Log.h" namespace SurgSim { namespace Graphics { /// Enable logging of OSG through SurgSim Logging System /// To use this, an object of OsgLog class must be created. /// Then call osg::setNotifyHandler() to let OSG use OSS logging system. class OsgLog : public osg::NotifyHandler { public: /// Constructor /// If OSS_DEBUG is defined, set OSG's log level to the lowest (osg::DEBUG_FP). /// So that all info can be logged. /// Otherwise, keep OSG's default log level (osg::NOTICE). /// Note that message can still be filtered out in user defined derived method notify(). OsgLog(); /// User defined derived log Method /// Based on log level 'severity', this method decides whether to log 'message' with OSS logging system. /// \param severity Log level of message to be logged. /// \param message The actual message to be logged. void notify(osg::NotifySeverity severity, const char *message) override; private: std::shared_ptr m_logger; }; }; // namespace Graphics }; // namespace SurgSim #endif // SURGSIM_GRAPHICS_OSGLOG_H opensurgsim-0.7.0/SurgSim/Graphics/OsgManager.cpp000066400000000000000000000147331277777236100220040ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Graphics/OsgManager.h" #include #include "SurgSim/Framework/Log.h" #include "SurgSim/Framework/Scene.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Graphics/OsgRepresentation.h" #include "SurgSim/Graphics/OsgCamera.h" #include "SurgSim/Graphics/OsgGroup.h" #include "SurgSim/Graphics/OsgView.h" #include "SurgSim/Graphics/OsgScreenSpacePass.h" #include #include #include #include #include #include using SurgSim::Graphics::OsgRepresentation; using SurgSim::Graphics::OsgCamera; using SurgSim::Graphics::OsgGroup; using SurgSim::Graphics::OsgManager; namespace { /// Class to update the "modelMatrix" uniform for all transforms in the scenegraph /// #performance This could be change to use a stack of matrices rather than query /// the nodepath for every transform class TransformUpdater : public osg::NodeCallback { public: explicit TransformUpdater(osg::Uniform* uniform) : m_uniform(uniform) { } void operator()(osg::Node* node, osg::NodeVisitor* nodeVisitor) override { osgUtil::CullVisitor* cv = dynamic_cast(nodeVisitor); if (cv != nullptr) { auto mat = osg::computeLocalToWorld(nodeVisitor->getNodePath(), true); m_uniform->set(mat); } traverse(node, nodeVisitor); } private: osg::ref_ptr m_uniform; }; /// Class to find all transform nodes in the added scenegraph, and add the "modelMatrix" uniform /// to the stateset, also ads the appropriate callback to the node class TransformModifier : public osg::NodeVisitor { public: TransformModifier() : osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN) { } void apply(osg::Transform& node) override { auto state = node.getOrCreateStateSet(); auto uniform = new osg::Uniform; uniform->setName("modelMatrix"); uniform->setType(osg::Uniform::FLOAT_MAT4); osg::Matrix matrix; uniform->set(matrix); state->addUniform(uniform); auto callback = new TransformUpdater(uniform); node.addCullCallback(callback); } }; } namespace SurgSim { namespace Graphics { OsgManager::OsgManager() : SurgSim::Graphics::Manager(), m_viewer(new osgViewer::CompositeViewer()) { setMultiThreading(true); } OsgManager::~OsgManager() { } void OsgManager::setMultiThreading(bool val) { if (val == true) { m_viewer->setThreadingModel(osgViewer::ViewerBase::DrawThreadPerContext); } else { m_viewer->setThreadingModel(osgViewer::ViewerBase::SingleThreaded); } } bool OsgManager::isMultiThreading() const { return m_viewer->getThreadingModel() != osgViewer::ViewerBase::SingleThreaded; } std::shared_ptr OsgManager::getOrCreateGroup(const std::string& name) { std::shared_ptr result; auto groups = getGroups(); auto group = groups.find(name); if (group == std::end(groups)) { auto newGroup = std::make_shared(name); addGroup(newGroup); result = newGroup; } else { result = group->second; } return result; } bool OsgManager::addRepresentation(std::shared_ptr representation) { std::shared_ptr osgRepresentation = std::dynamic_pointer_cast(representation); bool result; if (osgRepresentation) { result = Manager::addRepresentation(osgRepresentation); if (result) { TransformModifier modifier; osgRepresentation->getOsgNode()->accept(modifier); } } else { SURGSIM_LOG_INFO(getLogger()) << __FUNCTION__ << " Representation is not a subclass of OsgRepresentation " << representation->getName(); result = false; } return result; } bool OsgManager::addView(std::shared_ptr view) { std::shared_ptr osgView = std::dynamic_pointer_cast(view); bool result = true; if (osgView == nullptr) { SURGSIM_LOG_WARNING(getLogger()) << __FUNCTION__ << " View is not a subclass of OsgView " << view->getName(); result = false; } else { SURGSIM_ASSERT(view->getCamera() != nullptr) << "View should have a camera when added to the manager."; if (Manager::addView(view)) { m_viewer->addView(osgView->getOsgView()); } } return result; } bool OsgManager::removeView(std::shared_ptr view) { std::shared_ptr osgView = std::dynamic_pointer_cast(view); if (osgView) { m_viewer->removeView(osgView->getOsgView()); } return Manager::removeView(view); } bool OsgManager::doInitialize() { m_hudElement = std::make_shared(Representation::DefaultHudGroupName); return true; } bool OsgManager::doStartUp() { return true; } bool OsgManager::doUpdate(double dt) { // There is a bug in the scene initialisation where addSceneElement() will not be correctly executed if // performed inside of doInitialize(), this needs to be fixed // HS-2014-dec-12 // #workaround if (!m_hudElement->isInitialized()) { getRuntime()->getScene()->addSceneElement(m_hudElement); } if (Manager::doUpdate(dt)) { m_viewer->frame(); // \note HS-2013-dec-12 This will work as long as we deal with one view, when we move to stereoscopic // we might have to revise things. Or just assume that most views have the same size if (m_viewer->getNumViews() > 0) { auto dimensions = getViews()[0]->getDimensions(); m_hudElement->setViewPort(dimensions[0], dimensions[1]); } return true; } else { return false; } } void OsgManager::doBeforeStop() { #ifdef OSS_DEBUG dumpDebugInfo(); #endif // Delete the viewer so that the graphics context will be released in the manager's thread m_viewer = nullptr; Graphics::Manager::doBeforeStop(); } osg::ref_ptr OsgManager::getOsgCompositeViewer() const { return m_viewer; } void SurgSim::Graphics::OsgManager::dumpDebugInfo() const { osgDB::writeNodeFile(*m_viewer->getView(0)->getCamera(), "viewer_zero_camera.osgt"); } } } opensurgsim-0.7.0/SurgSim/Graphics/OsgManager.h000066400000000000000000000073211277777236100214440ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_OSGMANAGER_H #define SURGSIM_GRAPHICS_OSGMANAGER_H #include "SurgSim/Graphics/Manager.h" #include #include namespace SurgSim { namespace Graphics { class Representation; class Group; class View; class OsgCamera; class OsgGroup; class OsgScreenSpacePass; /// OSG-based implementation of graphics manager class. /// /// A Graphics::OsgManager sets up an osgViewer::CompositeViewer to manage and render each Graphics::OsgView added to /// the Manager. class OsgManager : public Manager { public: /// Constructor /// /// Sets up a default Camera which will be used if for any View that does not have a Camera assigned /// Sets up a default Group which is assigned to the default Camera. All added representations and groups will be /// added to this group. OsgManager(); /// Destructor virtual ~OsgManager(); /// Change the threading model of the graphics manager viewer /// \param val enables or disables multithreading in the viewer void setMultiThreading(bool val); /// \return true when the viewer is multithreading bool isMultiThreading() const; friend class OsgManagerTest; /// Returns the OSG CompositeViewer used to manage and render the views osg::ref_ptr getOsgCompositeViewer() const; /// OsgManager will write out the scenegraph in the working directory void dumpDebugInfo() const override; protected: bool doUpdate(double dt) override; bool doInitialize() override; bool doStartUp() override; /// Adds an representation to the manager /// \param representation The representation to be added. /// Only allows OsgRepresentation components, any other will not be set and it will return false. /// \return True if the representation was not in this manager and has been successfully added, false if it fails. bool addRepresentation(std::shared_ptr representation) override; /// Adds a view to the manager /// \param view The view to be added. /// Only allows OsgView components, any other will not be set and it will return false. /// \return True if the view was not in this manager and has been successfully added, false if it fails. bool addView(std::shared_ptr view) override; /// Removes a view from the manager /// \param view The view to be removed. /// \return True if the view was in this manager and has been successfully removed, false if it fails. /// \post The view is removed from the manager and the osgViewer::CompositeViewer. bool removeView(std::shared_ptr view) override; std::shared_ptr getOrCreateGroup(const std::string& name) override; private: /// Prepares the manager for its execution to be stopped /// \note Called from this thread before joined void doBeforeStop(); /// OSG CompositeViewer to manage and render the individual views osg::ref_ptr m_viewer; /// Builtin RenderPass that can be used for HUD functionality, uses Group "ossHud" std::shared_ptr m_hudElement; }; }; // namespace Graphics }; // namespace SurgSim #endif // SURGSIM_GRAPHICS_OSGMANAGER_H opensurgsim-0.7.0/SurgSim/Graphics/OsgMaterial.cpp000066400000000000000000000140251277777236100221620ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Graphics/OsgMaterial.h" #include #include #include #include "SurgSim/Framework/Accessible.h" #include "SurgSim/Framework/ApplicationData.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Graphics/OsgProgram.h" #include "SurgSim/Graphics/OsgUniform.h" #include "SurgSim/Graphics/OsgUniformFactory.h" using SurgSim::Graphics::OsgMaterial; using SurgSim::Graphics::OsgUniformBase; namespace SurgSim { namespace Graphics { OsgMaterial::OsgMaterial(const std::string& name) : Material(name), m_stateSet(new osg::StateSet()) { } void OsgMaterial::addUniform(std::shared_ptr uniform) { std::shared_ptr osgUniform = std::dynamic_pointer_cast(uniform); SURGSIM_ASSERT(osgUniform != nullptr) << "Uniform must be an OsgUniform"; if (isInitialized()) { osgUniform->addToStateSet(m_stateSet); } m_uniforms.push_back(osgUniform); // add a property to Material, that carries the uniform name and forwards to the value of the uniform // This exposes the non-shared pointer to the uniform in the function table, the entry in the function // table will be removed when the uniform is removed from the material. The material holds a shared // pointer to the uniform, keeping the uniform alive during the lifetime of the material. forwardProperty(osgUniform->getName(), *osgUniform.get(), "Value"); } void OsgMaterial::addUniform(const std::string& type, const std::string& name) { static OsgUniformFactory factory; if (factory.isRegistered(type)) { addUniform(factory.create(type, name)); } else { SURGSIM_FAILURE() << "OsgUniform type " << type << " not supported."; } } void OsgMaterial::addUniform(const std::string& type, const std::string& name, const boost::any& value) { addUniform(type, name); setValue(name, value); } bool OsgMaterial::removeUniform(std::shared_ptr uniform) { std::shared_ptr osgUniform = std::dynamic_pointer_cast(uniform); bool didSucceed = false; if (osgUniform) { auto it = std::find(m_uniforms.begin(), m_uniforms.end(), osgUniform); if (it != m_uniforms.end()) { if (isInitialized()) { osgUniform->removeFromStateSet(m_stateSet); } m_uniforms.erase(it); didSucceed = true; } removeAccessors(osgUniform->getName()); } return didSucceed; } size_t OsgMaterial::getNumUniforms() const { return m_uniforms.size(); } std::shared_ptr OsgMaterial::getUniform(size_t index) const { return m_uniforms[index]; } std::shared_ptr OsgMaterial::getUniform(const std::string& name) const { std::shared_ptr result; auto it = std::find_if( std::begin(m_uniforms), std::end(m_uniforms), [&name](const std::shared_ptr& uniform) { return uniform->getName() == name; }); if (it != std::end(m_uniforms)) { result = *it; } return result; } bool OsgMaterial::removeUniform(const std::string& name) { bool result = false; auto it = std::find_if( std::begin(m_uniforms), std::end(m_uniforms), [&name](const std::shared_ptr& uniform) { return uniform->getName() == name; }); if (it != std::end(m_uniforms)) { result = removeUniform(*it); } return result; } bool OsgMaterial::hasUniform(const std::string& name) const { return (getUniform(name) != nullptr); } bool OsgMaterial::setProgram(std::shared_ptr program) { bool didSucceed = false; std::shared_ptr osgProgram = std::dynamic_pointer_cast(program); if (osgProgram) { if (m_program) { m_program->removeFromStateSet(m_stateSet.get()); } osgProgram->addToStateSet(m_stateSet); m_program = osgProgram; didSucceed = true; } return didSucceed; } std::shared_ptr OsgMaterial::getProgram() const { return m_program; } void OsgMaterial::clearProgram() { if (m_program) { m_program->removeFromStateSet(m_stateSet.get()); } m_program = nullptr; } bool OsgMaterial::doInitialize() { for (auto it = m_uniforms.begin(); it != m_uniforms.end(); ++it) { (*it)->addToStateSet(m_stateSet); } return true; } bool OsgMaterial::doWakeUp() { return true; } osg::ref_ptr OsgMaterial::getOsgStateSet() const { return m_stateSet; } std::shared_ptr buildMaterial(const std::string& vertexShaderName, const std::string& fragmentShaderName) { bool result = true; std::shared_ptr material; auto program = std::make_shared(); std::string fileName; fileName = Framework::Runtime::getApplicationData()->findFile(vertexShaderName); if (!program->loadVertexShader(fileName)) { SURGSIM_LOG_WARNING(Framework::Logger::getLogger("Graphics")) << "Shader " << vertexShaderName << ", could not " << ((fileName == "") ? "find shader file" : "compile " + fileName) << "."; result = false; } fileName = Framework::Runtime::getApplicationData()->findFile(fragmentShaderName); if (!program->loadFragmentShader(fileName)) { SURGSIM_LOG_WARNING(Framework::Logger::getLogger("Graphics")) << "Shader " << fragmentShaderName << " , could not " << ((fileName == "") ? "find shader file" : "compile " + fileName) << "."; result = false; } if (result) { material = std::make_shared("material"); material->setProgram(program); } return material; } }; // namespace Graphics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Graphics/OsgMaterial.h000066400000000000000000000077711277777236100216410ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_OSGMATERIAL_H #define SURGSIM_GRAPHICS_OSGMATERIAL_H #include #include #include #include #include "SurgSim/Graphics/Material.h" namespace SurgSim { namespace Graphics { class MaterialFace; class OsgProgram; class OsgUniformBase; /// OSG-based implementation of a graphics material. /// /// Wraps an osg::StateSet which is applied to the osg::Node of the Representation that is assigned this material. /// /// \note /// Only uniforms that subclass OsgUniformBase and shaders that subclass OsgShader can be assigned to this material. /// \sa OsgUniformBase /// \sa OsgShader class OsgMaterial : public Material { public: /// Constructor /// \post The material has no uniforms and no shader. explicit OsgMaterial(const std::string& name); SURGSIM_CLASSNAME(SurgSim::Graphics::OsgMaterial); /// Adds a uniform to this material /// \param uniform Uniform to add /// \note OsgMaterial only accepts subclasses of OsgUniformBase void addUniform(std::shared_ptr uniform) override; void addUniform(const std::string& type, const std::string& name) override; /// Adds and a uniform to this material and set its value /// \param type the type of the uniform /// \param name Name used in shader code to access this uniform /// \param value The value for this uniform void addUniform(const std::string& type, const std::string& name, const boost::any& value); /// Removes a uniform from this material /// \param uniform Uniform to remove /// \return True if uniform was removed successfully, otherwise false /// \note OsgMaterial only accepts subclasses of OsgUniformBase bool removeUniform(std::shared_ptr uniform) override; bool removeUniform(const std::string& name) override; size_t getNumUniforms() const override; std::shared_ptr getUniform(size_t index) const override; std::shared_ptr getUniform(const std::string& name) const override; bool hasUniform(const std::string& name) const override; /// Sets the shader used by this material /// \param program Shader program /// \return True if program was set successfully, otherwise false /// \note OsgMaterial only accepts subclasses of OsgProgram bool setProgram(std::shared_ptr program) override; std::shared_ptr getProgram() const override; void clearProgram() override; /// \return the OSG state set with the material properties osg::ref_ptr getOsgStateSet() const; bool doInitialize() override; bool doWakeUp() override; private: /// OSG state set which provides material properties in the scenegraph osg::ref_ptr m_stateSet; /// Uniforms used by this material std::vector> m_uniforms; /// Shader used by this material std::shared_ptr m_program; }; /// Utility function to build the material. /// \param vertexShaderName name of the vertex shader to be used, needs to be available on the path. /// \param fragmentShaderName name of the fragment shader to be used, needs to be available on the path. /// \return a valid material if all the shaders are found, nullptr otherwise std::shared_ptr buildMaterial( const std::string& vertexShaderName, const std::string& fragmentShaderName); }; // namespace Graphics }; // namespace SurgSim #endif // SURGSIM_GRAPHICS_OSGMATERIAL_H opensurgsim-0.7.0/SurgSim/Graphics/OsgMatrixConversions.h000066400000000000000000000114501277777236100235650ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Conversions to and from OSG matrix types /// /// SurgSim's Eigen vectors are a single column, and matrix operations use postfix notation. /// OSG vectors are a single row and matrix operations use prefix notation, /// /// For example, with Eigen, one might write: /// \code{.cpp} /// Vector3d columnVector; /// Matrix33d matrix; /// Vector3d result = matrix * columnVector; /// \endcode /// /// However, with OSG, this should be written in the form: /// \code{.cpp} /// osg::Vec3d rowVector; /// osg::Matrix3d columnMajorMatrix; /// osg::Vec3d result = rowVector * columnMajorMatrix; /// \endcode /// /// For the result to be the same, the OSG matrix data must be interpreted as column-major. /// These conversions handle that. #ifndef SURGSIM_GRAPHICS_OSGMATRIXCONVERSIONS_H #define SURGSIM_GRAPHICS_OSGMATRIXCONVERSIONS_H #include "SurgSim/Math/Matrix.h" #include #include #include namespace SurgSim { namespace Graphics { /// Convert a fixed-size 2x2 matrix of floats to OSG. template inline const osg::Matrix2 toOsg(const Eigen::Matrix& matrix) { osg::Matrix2 osgMatrix; Eigen::Map>(osgMatrix.ptr()) = matrix; return osgMatrix; } /// Convert a fixed-size 2x2 matrix of doubles to OSG. template inline const osg::Matrix2d toOsg(const Eigen::Matrix& matrix) { osg::Matrix2d osgMatrix; Eigen::Map>(osgMatrix.ptr()) = matrix; return osgMatrix; } /// Convert from OSG to a 2x2 matrix of floats. inline const Eigen::Matrix fromOsg(const osg::Matrix2& matrix) { return Eigen::Map>(matrix.ptr()); } /// Convert from OSG to a 2x2 matrix of doubles. inline const Eigen::Matrix fromOsg(const osg::Matrix2d& matrix) { return Eigen::Map>(matrix.ptr()); } /// Convert a fixed-size 3x3 matrix of floats to OSG. template inline const osg::Matrix3 toOsg(const Eigen::Matrix& matrix) { osg::Matrix3 osgMatrix; Eigen::Map>(osgMatrix.ptr()) = matrix; return osgMatrix; } /// Convert a fixed-size 3x3 matrix of doubles to OSG. template inline const osg::Matrix3d toOsg(const Eigen::Matrix& matrix) { osg::Matrix3d osgMatrix; Eigen::Map>(osgMatrix.ptr()) = matrix; return osgMatrix; } /// Convert from OSG to a 3x3 matrix of floats. inline const Eigen::Matrix fromOsg(const osg::Matrix3& matrix) { return Eigen::Map>(matrix.ptr()); } /// Convert from OSG to a 3x3 matrix of doubles. inline const Eigen::Matrix fromOsg(const osg::Matrix3d& matrix) { return Eigen::Map>(matrix.ptr()); } /// Convert a fixed-size 4x4 matrix of floats to OSG. template inline const osg::Matrixf toOsg(const Eigen::Matrix& matrix) { osg::Matrixf osgMatrix; Eigen::Map>(osgMatrix.ptr()) = matrix; return osgMatrix; } /// Convert from OSG to a 4x4 matrix of floats. inline const Eigen::Matrix fromOsg(const osg::Matrixf& matrix) { return Eigen::Map>(matrix.ptr()); } /// Convert a fixed-size 4x4 matrix of doubles to OSG. template inline const osg::Matrixd toOsg(const Eigen::Matrix& matrix) { osg::Matrixd osgMatrix; Eigen::Map>(osgMatrix.ptr()) = matrix; return osgMatrix; } /// Convert from OSG to a 4x4 matrix of doubles. inline const Eigen::Matrix fromOsg(const osg::Matrixd& matrix) { return Eigen::Map>(matrix.ptr()); } }; // namespace Graphics }; // namespace SurgSim #endif // SURGSIM_GRAPHICS_OSGMATRIXCONVERSIONS_H opensurgsim-0.7.0/SurgSim/Graphics/OsgMeshRepresentation.cpp000066400000000000000000000234271277777236100242510ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Graphics/OsgMeshRepresentation.h" #include #include #include #include #include #include #include #include "SurgSim/Framework/ApplicationData.h" #include "SurgSim/Framework/Asset.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Framework/ObjectFactory.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Graphics/Mesh.h" #include "SurgSim/Graphics/OsgConversions.h" #include "SurgSim/Graphics/TriangleNormalGenerator.h" #include "SurgSim/Math/MeshShape.h" #include "SurgSim/Math/Shape.h" namespace SurgSim { namespace Graphics { SURGSIM_REGISTER(SurgSim::Framework::Component, SurgSim::Graphics::OsgMeshRepresentation, OsgMeshRepresentation); OsgMeshRepresentation::OsgMeshRepresentation(const std::string& name) : Representation(name), OsgRepresentation(name), MeshRepresentation(name), m_updateOptions(UPDATE_OPTION_VERTICES), m_updateCount(0) { m_meshSwitch = new osg::Switch(); m_transform->addChild(m_meshSwitch); setMesh(std::make_shared()); } OsgMeshRepresentation::~OsgMeshRepresentation() { } void OsgMeshRepresentation::loadMesh(const std::string& fileName) { auto mesh = std::make_shared(); mesh->load(fileName); setMesh(mesh); } void OsgMeshRepresentation::setMesh(std::shared_ptr mesh) { auto graphicsMesh = std::dynamic_pointer_cast(mesh); SURGSIM_ASSERT(graphicsMesh != nullptr) << "Mesh for OsgMeshRepresentation needs to be a SurgSim::Graphics::Mesh"; m_mesh = graphicsMesh; m_updateCount = m_mesh->getUpdateCount(); m_mesh->dirty(); buildGeometry(); } std::shared_ptr OsgMeshRepresentation::getMesh() { return m_mesh; } void OsgMeshRepresentation::setShape(std::shared_ptr shape) { SURGSIM_ASSERT(shape->getType() == SurgSim::Math::SHAPE_TYPE_MESH || shape->getType() == SurgSim::Math::SHAPE_TYPE_SURFACEMESH) << "Shape for OsgMeshRepresentation needs to be a SurgSim::Math::MeshShape/SurgSim::Math::SurfaceMeshShape"; auto meshShape = std::static_pointer_cast(shape); m_mesh = std::make_shared(*meshShape); } void OsgMeshRepresentation::doUpdate(double dt) { size_t updateCount = m_mesh->getUpdateCount(); if (m_updateCount != updateCount) { // The update was done through shared data (might not be threadsafe) // #threadsafety m_updateCount = updateCount; privateUpdateMesh(*m_mesh); } else { // The update was done through the threadsafe Locked container Mesh tempMesh; if (m_writeBuffer.tryTakeChanged(&tempMesh)) { privateUpdateMesh(tempMesh); } } } void OsgMeshRepresentation::privateUpdateMesh(const Mesh& mesh) { SURGSIM_ASSERT(mesh.isValid()) << "The mesh in the OsgMeshRepresentation " << getName() << " is invalid."; // Early exit if there are no vertices if (mesh.getNumVertices() == 0) { m_meshSwitch->setAllChildrenOff(); return; } m_meshSwitch->setSingleChildOn(0); int updateOptions = updateOsgArrays(mesh, m_geometry); updateOptions |= m_updateOptions; if ((updateOptions & UPDATE_OPTION_TRIANGLES) != 0) { updateTriangles(mesh, m_geometry); } if ((updateOptions & (UPDATE_OPTION_VERTICES | UPDATE_OPTION_TEXTURES | UPDATE_OPTION_COLORS)) != 0) { updateVertices(mesh, m_geometry, updateOptions); updateTangents(); m_geometry->dirtyDisplayList(); m_geometry->dirtyBound(); m_geometry->getBound(); } } bool OsgMeshRepresentation::doInitialize() { return true; } void OsgMeshRepresentation::updateVertices(const Mesh& mesh, osg::Geometry* geometry, int updateOptions) { static osg::Vec4d defaultColor(0.8, 0.2, 0.2, 1.0); static osg::Vec2d defaultTextureCoord(0.0, 0.0); bool updateColors = (updateOptions & UPDATE_OPTION_COLORS) != 0; bool updateTextures = (updateOptions & UPDATE_OPTION_TEXTURES) != 0; bool updateVertices = (updateOptions & UPDATE_OPTION_VERTICES) != 0; auto vertices = static_cast(geometry->getVertexArray()); auto colors = static_cast(geometry->getColorArray()); auto textureCoords = static_cast(geometry->getTexCoordArray(0)); size_t index = 0; for (const auto& vertex : mesh.getVertices()) { if (updateVertices) { (*vertices)[index].set(toOsg(vertex.position)); } if (updateColors) { (*colors)[index] = (vertex.data.color.hasValue()) ? toOsg(vertex.data.color.getValue()) : defaultColor; } if (updateTextures) { (*textureCoords)[index] = (vertex.data.texture.hasValue()) ? toOsg(vertex.data.texture.getValue()) : defaultTextureCoord; } ++index; } if (updateVertices) { updateNormals(geometry); } vertices->dirty(); } void OsgMeshRepresentation::updateNormals(osg::Geometry* geometry) { // Generate normals from geometry auto vertices = static_cast(geometry->getVertexArray()); auto normals = static_cast(geometry->getNormalArray()); auto normalGenerator = createNormalGenerator(vertices, normals); geometry->accept(normalGenerator); normalGenerator.normalize(); normals->dirty(); } void OsgMeshRepresentation::updateTriangles(const Mesh& mesh, osg::Geometry* geometry) { osg::Geometry::DrawElementsList drawElements; geometry->getDrawElementsList(drawElements); auto triangles = static_cast(drawElements[0]); size_t i = 0; for (auto const& triangle : mesh.getTriangles()) { if (triangle.isValid) { (*triangles)[i++] = triangle.verticesId[0]; (*triangles)[i++] = triangle.verticesId[1]; (*triangles)[i++] = triangle.verticesId[2]; } } triangles->dirty(); } int OsgMeshRepresentation::updateOsgArrays(const Mesh& mesh, osg::Geometry* geometry) { int result = 0; size_t numVertices = mesh.getNumVertices(); auto vertices = static_cast(geometry->getVertexArray()); auto normals = static_cast(geometry->getNormalArray()); if (numVertices != vertices->size()) { vertices->resize(numVertices); normals->resize(numVertices); result |= UPDATE_OPTION_VERTICES; } vertices->setDataVariance(getDataVariance(UPDATE_OPTION_VERTICES)); normals->setDataVariance(getDataVariance(UPDATE_OPTION_VERTICES)); // The first vertex determines what values the mesh should have ... Mesh::VertexType vertex = mesh.getVertex(0); auto colors = static_cast(geometry->getColorArray()); if (vertex.data.color.hasValue() && numVertices > colors->size()) { if (colors->size() > 1) { geometry->setColorArray(colors, osg::Array::BIND_PER_VERTEX); } colors->resize(numVertices); result |= UPDATE_OPTION_COLORS; } colors->setDataVariance(getDataVariance(UPDATE_OPTION_COLORS)); auto textureCoords = static_cast(geometry->getTexCoordArray(0)); if (vertex.data.texture.hasValue()) { if (textureCoords == nullptr) { textureCoords = new osg::Vec2Array(0); geometry->setTexCoordArray(0, textureCoords, osg::Array::BIND_PER_VERTEX); } textureCoords->resize(numVertices); result |= UPDATE_OPTION_TEXTURES; } if (textureCoords != nullptr) { textureCoords->setDataVariance(getDataVariance(UPDATE_OPTION_TEXTURES)); } osg::Geometry::DrawElementsList drawElements; geometry->getDrawElementsList(drawElements); auto triangles = static_cast(drawElements[0]); if (mesh.getNumTriangles() * 3 != triangles->size()) { triangles->resize(mesh.getNumTriangles() * 3); result |= UPDATE_OPTION_TRIANGLES; } triangles->setDataVariance(getDataVariance(UPDATE_OPTION_TRIANGLES)); return result; } void OsgMeshRepresentation::setUpdateOptions(int val) { if (val <= UPDATE_OPTION_ALL && val >= UPDATE_OPTION_NONE) { m_updateOptions = val; } } int OsgMeshRepresentation::getUpdateOptions() const { return m_updateOptions; } osg::ref_ptr OsgMeshRepresentation::getOsgGeometry() const { return m_geometry; } void OsgMeshRepresentation::updateMesh(const SurgSim::Graphics::Mesh& mesh) { m_writeBuffer.set(mesh); } osg::Object::DataVariance OsgMeshRepresentation::getDataVariance(int updateOption) { return ((m_updateOptions & updateOption) != 0) ? osg::Object::DYNAMIC : osg::Object::STATIC; } void OsgMeshRepresentation::buildGeometry() { // Remove old Geometry nodes m_meshSwitch->removeChildren(0, m_meshSwitch->getNumChildren()); m_geometry = new osg::Geometry; m_geometry->setUseDisplayList(false); // Create Standard arrays zero size, updateOsgArrays will take care of the correct sizing and // setting the correct data variance on them // Set up vertices array auto vertices = new osg::Vec3Array(); m_geometry->setVertexArray(vertices); // Create normals auto normals = new osg::Vec3Array(); m_geometry->setNormalArray(normals, osg::Array::BIND_PER_VERTEX); // Set up color array with default color auto colors = new osg::Vec4Array(1); (*colors)[0] = osg::Vec4(0.8f, 0.8f, 1.0f, 1.0f); m_geometry->setColorArray(colors, osg::Array::BIND_OVERALL); // Set up primitive set for triangles auto triangles = new osg::DrawElementsUInt(osg::PrimitiveSet::TRIANGLES); m_geometry->addPrimitiveSet(triangles); auto geode = new osg::Geode; geode->addDrawable(m_geometry); m_meshSwitch->setAllChildrenOff(); m_meshSwitch->addChild(geode); } }; // Graphics }; // SurgSim opensurgsim-0.7.0/SurgSim/Graphics/OsgMeshRepresentation.h000066400000000000000000000105771277777236100237200ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_OSGMESHREPRESENTATION_H #define SURGSIM_GRAPHICS_OSGMESHREPRESENTATION_H #include #include #include #include "SurgSim/Framework/Macros.h" #include "SurgSim/Framework/ObjectFactory.h" #include "SurgSim/Graphics/OsgRepresentation.h" #include "SurgSim/Graphics/MeshRepresentation.h" #include "SurgSim/Framework/LockedContainer.h" #if defined(_MSC_VER) #pragma warning(push) #pragma warning(disable:4250) #endif namespace osg { class Geode; class Geometry; class DrawElementsUInt; } namespace SurgSim { namespace Graphics { class Mesh; SURGSIM_STATIC_REGISTRATION(OsgMeshRepresentation); /// Implementation of a MeshRepresentation for rendering under osg. class OsgMeshRepresentation : public OsgRepresentation, public MeshRepresentation { public: /// Constructor. /// \param name The name. explicit OsgMeshRepresentation(const std::string& name); /// Destructor ~OsgMeshRepresentation(); SURGSIM_CLASSNAME(SurgSim::Graphics::OsgMeshRepresentation); std::shared_ptr getMesh() override; void setMesh(std::shared_ptr mesh) override; void loadMesh(const std::string& fileName) override; void setShape(std::shared_ptr shape) override; void setUpdateOptions(int val) override; int getUpdateOptions() const override; osg::ref_ptr getOsgGeometry() const; void updateMesh(const SurgSim::Graphics::Mesh& mesh) override; protected: void doUpdate(double dt) override; /// \note If m_filename is set, m_mesh will be overwritten with the mesh loaded from the external file. bool doInitialize() override; void privateUpdateMesh(const SurgSim::Graphics::Mesh& mesh); private: /// Indicates which elements of the mesh should be updated on every frame int m_updateOptions; /// The mesh. std::shared_ptr m_mesh; /// File name of the external file which contains the mesh to be used by this class. std::string m_filename; ///@{ /// Osg structures osg::ref_ptr m_meshSwitch; osg::ref_ptr m_geometry; ///@} /// Updates the internal arrays in accordance to the sizes given in the mesh /// \param mesh The mesh used to update /// \param geometry [out] The geometry that carries the data /// \return updateOptions value that indicates which of the structures where updated in size and /// will have to be updated independent of the value set in setUpdateOptions() int updateOsgArrays(const Mesh& mesh, osg::Geometry* geometry); /// Copies the attributes for each mesh vertex in the appropriate osg structure, this will only be done /// for the data as is indicated by updateOptions /// \param mesh The mesh used to update /// \param geometry [out] The geometry that carries the data /// \param updateOptions Set of flags indicating whether a specific vertex attribute should be updated void updateVertices(const Mesh& mesh, osg::Geometry* geometry, int updateOptions); /// Updates the normals. /// \param geometry [out] The geometry that carries the data void updateNormals(osg::Geometry* geometry); /// Updates the triangles. /// \param mesh The mesh used to update /// \param geometry [out] The geometry that carries the data void updateTriangles(const Mesh& mesh, osg::Geometry* geometry); /// Gets data variance for a given update option. /// \param updateOption The update option. /// \return The data variance. osg::Object::DataVariance getDataVariance(int updateOption); /// Create the appropriate geometry nodes void buildGeometry(); /// Cache for the update count pull from the mesh size_t m_updateCount; Framework::LockedContainer m_writeBuffer; }; #if defined(_MSC_VER) #pragma warning(pop) #endif }; // Graphics }; // SurgSim #endif // SURGSIM_GRAPHICS_OSGMESHREPRESENTATION_H opensurgsim-0.7.0/SurgSim/Graphics/OsgModel.cpp000066400000000000000000000022661277777236100214700ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Graphics/OsgModel.h" #include "SurgSim/Framework/Log.h" #include namespace SurgSim { namespace Graphics { SURGSIM_REGISTER(SurgSim::Framework::Asset, SurgSim::Graphics::OsgModel, OsgModel); OsgModel::OsgModel() { } OsgModel::~OsgModel() { } osg::ref_ptr OsgModel::getOsgNode() { return m_root; } bool OsgModel::doLoad(const std::string& filePath) { m_root = osgDB::readNodeFile(filePath); SURGSIM_ASSERT(m_root.valid()) << "Could not load file " << filePath << std::endl; return true; } } } opensurgsim-0.7.0/SurgSim/Graphics/OsgModel.h000066400000000000000000000026131277777236100211310ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_OSGMODEL_H #define SURGSIM_GRAPHICS_OSGMODEL_H #include "SurgSim/Framework/Macros.h" #include "SurgSim/Graphics/Model.h" #include namespace osg { class Node; } namespace SurgSim { namespace Graphics { /// Osg implementation of the Model class, inheriting from Asset, this class knows how to load models that can be /// handled by osg. class OsgModel : public Model { public: /// Constructor OsgModel(); virtual ~OsgModel(); SURGSIM_CLASSNAME(SurgSim::Graphics::OsgModel); /// \return the Node that is the root of the loaded model, nullptr if no model is loaded osg::ref_ptr getOsgNode(); private: bool doLoad(const std::string& filePath) override; osg::ref_ptr m_root; }; } } #endif opensurgsim-0.7.0/SurgSim/Graphics/OsgOctreeRepresentation.cpp000066400000000000000000000100071277777236100245640ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Graphics/OsgOctreeRepresentation.h" #include "SurgSim/DataStructures/OctreeNode.h" #include "SurgSim/Framework/Assert.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Framework/SharedInstance.h" #include "SurgSim/Graphics/OsgConversions.h" #include "SurgSim/Graphics/OsgUnitBox.h" #include "SurgSim/Math/Vector.h" namespace SurgSim { namespace Graphics { SURGSIM_REGISTER(SurgSim::Framework::Component, SurgSim::Graphics::OsgOctreeRepresentation, OsgOctreeRepresentation); using SurgSim::Math::Vector3d; OsgOctreeRepresentation::OsgOctreeRepresentation(const std::string& name) : Representation(name), OctreeRepresentation(name), OsgRepresentation(name), m_sharedUnitBox(getSharedUnitBox()) { } OsgOctreeRepresentation::~OsgOctreeRepresentation() { } void OsgOctreeRepresentation::doUpdate(double dt) { } // An Octree(Node) is traversed in following order (the 2nd OctreeNode, i.e. OctreeNode with "1" is now shown): /* ________ /3 / 7/| /-------/ | /2__/_6_/| | | | | |/| |___|___|/|5| | | | |/ |0__|__4|/ */ void OsgOctreeRepresentation::buildOctree(osg::ref_ptr transformNode, std::shared_ptr octree) { SURGSIM_ASSERT(!isAwake()) << "OsgOctreeRepresentation::buildOctree() should be called before wake up."; osg::ref_ptr osgTransform = new osg::PositionAttitudeTransform(); transformNode->addChild(osgTransform); if (octree->hasChildren()) { auto octreeChildren = octree->getChildren(); for (int i = 0; i < 8; ++i) { buildOctree(osgTransform, octreeChildren[i]); } } else { osgTransform->addChild(m_sharedUnitBox->getNode()); osgTransform->setPosition(toOsg(static_cast(octree->getBoundingBox().center()))); osgTransform->setScale(toOsg(static_cast(octree->getBoundingBox().sizes()))); int nodeMask = octree->isActive() ? 0xffffffff : 0; osgTransform->setNodeMask(nodeMask); } } void OsgOctreeRepresentation::setOctreeShape(const std::shared_ptr& shape) { SURGSIM_ASSERT(!isAwake()) << "OsgOctreeRepresentation::setOctree() should be called before wake up."; auto octreeShape = std::dynamic_pointer_cast(shape); SURGSIM_ASSERT(octreeShape != nullptr) << "OsgOctreeRepresentation can only accept an OctreeShape."; m_octreeShape = octreeShape; buildOctree(m_transform, m_octreeShape->getOctree()); } std::shared_ptr OsgOctreeRepresentation::getOctreeShape() const { return m_octreeShape; } void OsgOctreeRepresentation::setNodeVisible(const SurgSim::DataStructures::OctreePath& path, bool visibility) { SURGSIM_ASSERT(0 != m_transform->getNumChildren()) << "No Octree held by OsgOctreeRepresentation"; osg::ref_ptr result = m_transform->getChild(0)->asGroup(); for (auto index = std::begin(path); index != std::end(path); ++index) { SURGSIM_ASSERT(result->getNumChildren() > 1) << "OsgOctreeRepresentation::setNodeVisible(): Invalid OctreePath"; result = result->getChild(*index)->asGroup(); } result->setNodeMask(visibility ? 0xffffffff : 0); } std::shared_ptr OsgOctreeRepresentation::getSharedUnitBox() { static SurgSim::Framework::SharedInstance shared; return shared.get(); } }; // Graphics }; // SurgSim opensurgsim-0.7.0/SurgSim/Graphics/OsgOctreeRepresentation.h000066400000000000000000000070231277777236100242350ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_OSGOCTREEREPRESENTATION_H #define SURGSIM_GRAPHICS_OSGOCTREEREPRESENTATION_H #include #include #include #include "SurgSim/Framework/ObjectFactory.h" #include "SurgSim/Graphics/OctreeRepresentation.h" #include "SurgSim/Graphics/OsgRepresentation.h" #include "SurgSim/Math/OctreeShape.h" #if defined(_MSC_VER) #pragma warning(push) #pragma warning(disable:4250) #endif namespace SurgSim { namespace Graphics { class OsgUnitBox; SURGSIM_STATIC_REGISTRATION(OsgOctreeRepresentation); /// OSG octree representation, implements an OctreeRepresenation using OSG. /// Given a OctreeShape, this representation will copy the Octree instead of sharing the Octree (with the OctreeShape). /// Wake up call on this representation will fail if no octree is held. /// That is to say, setOctree() method MUST be called before WakeUp() to make this representation work properly. /// The OSG tree corresponds to the Octree will be built only once at wake up and can not be changed once awake. class OsgOctreeRepresentation : public OctreeRepresentation, public OsgRepresentation { public: /// Constructor /// \param name Name of OsgOctreeRepresentation explicit OsgOctreeRepresentation(const std::string& name); /// Destructor ~OsgOctreeRepresentation(); SURGSIM_CLASSNAME(SurgSim::Graphics::OsgOctreeRepresentation); /// Executes the update operation /// \param dt The time step void doUpdate(double dt) override; void setOctreeShape(const std::shared_ptr& shape) override; std::shared_ptr getOctreeShape() const override; /// Mark the OctreeNode visible/invisible in the given a OctreePath (typedef-ed in OctreeNode.h). /// \param path An OctreePath, giving the path leads to the OctreeNode whose visibility to be changed. /// \param visibility Whether or not the OctreeNode specified by 'path' is visible or not. void setNodeVisible(const SurgSim::DataStructures::OctreePath& path, bool visibility) override; private: /// Draw the Octree associated with this OSG representation. /// \param parentTransformNode The osg::PositionAttitudeTransform node under which either the octreeNode or its /// children will be drawn. /// \param octree The octree to be drawn. void buildOctree(osg::ref_ptr parentTransformNode, std::shared_ptr octree); /// Shared unit box, so that the geometry can be instanced rather than having multiple copies. std::shared_ptr m_sharedUnitBox; /// The OctreeShape whose Octree will be visualized. std::shared_ptr m_octreeShape; /// Returns the shared unit box static std::shared_ptr getSharedUnitBox(); }; }; // Graphics }; // SurgSim #if defined(_MSC_VER) #pragma warning(pop) #endif #endif // SURGSIM_GRAPHICS_OSGOCTREEREPRESENTATION_Hopensurgsim-0.7.0/SurgSim/Graphics/OsgPlane.h000066400000000000000000000036341277777236100211340ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_OSGPLANE_H #define SURGSIM_GRAPHICS_OSGPLANE_H #include #include namespace SurgSim { namespace Graphics { /// OSG plane geode to be used as a primitive shape /// The plane is the XZ plane, with normal +Y. /// The plane is drawn with a Quad at (0.0, 0.0, 0.0) with length and width specified in the constructor (or default of /// 1000 for each). /// Add the plane geode to a transform node to position it. class OsgPlane { public: /// Constructor /// \param length Length of the plane in X (default is 1000) /// \param width Width of the plane in Z (default is 1000) explicit OsgPlane(float length = 1000.0f, float width = 1000.0f) : m_geode(new osg::Geode()) { osg::ref_ptr plane = osg::createTexturedQuadGeometry( osg::Vec3(- length / 2.0f, 0.0f, width / 2.0f), osg::Vec3(length, 0.0f, 0.0f), osg::Vec3(0.0f, 0.0f, - width)); /// Normal is X^-Z = Y m_geode->addDrawable(plane); } /// Returns the root OSG node for the plane to be inserted into the scene-graph osg::ref_ptr getNode() const { return m_geode; } private: /// Root OSG node of the plane osg::ref_ptr m_geode; }; }; // namespace Graphics }; // namespace SurgSim #endif // SURGSIM_GRAPHICS_OSGPLANE_H opensurgsim-0.7.0/SurgSim/Graphics/OsgPlaneRepresentation.cpp000066400000000000000000000027341277777236100244120ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Graphics/OsgPlaneRepresentation.h" #include "SurgSim/Graphics/OsgMaterial.h" #include "SurgSim/Graphics/OsgPlane.h" #include "SurgSim/Graphics/OsgRigidTransformConversions.h" #include #include #include namespace SurgSim { namespace Graphics { SURGSIM_REGISTER(SurgSim::Framework::Component, SurgSim::Graphics::OsgPlaneRepresentation, OsgPlaneRepresentation); OsgPlaneRepresentation::OsgPlaneRepresentation(const std::string& name) : Representation(name), OsgRepresentation(name), PlaneRepresentation(name), m_sharedPlane(getSharedPlane()) { m_transform->addChild(m_sharedPlane->getNode()); } std::shared_ptr OsgPlaneRepresentation::getSharedPlane() { static SurgSim::Framework::SharedInstance shared; return shared.get(); } }; // Graphics }; // SurgSimopensurgsim-0.7.0/SurgSim/Graphics/OsgPlaneRepresentation.h000066400000000000000000000036651277777236100240630ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_OSGPLANEREPRESENTATION_H #define SURGSIM_GRAPHICS_OSGPLANEREPRESENTATION_H #include "SurgSim/Graphics/PlaneRepresentation.h" #include "SurgSim/Graphics/OsgRepresentation.h" #include "SurgSim/Framework/ObjectFactory.h" #include "SurgSim/Framework/SharedInstance.h" #include "SurgSim/Math/RigidTransform.h" #include #include #if defined(_MSC_VER) #pragma warning(push) #pragma warning(disable:4250) #endif namespace SurgSim { namespace Graphics { class OsgPlane; SURGSIM_STATIC_REGISTRATION(OsgPlaneRepresentation); /// OSG implementation of a graphics plane representation. class OsgPlaneRepresentation : public OsgRepresentation, public PlaneRepresentation { public: /// Constructor /// \param name Name of the representation explicit OsgPlaneRepresentation(const std::string& name); SURGSIM_CLASSNAME(SurgSim::Graphics::OsgPlaneRepresentation); private: /// Shared plane, so that the geometry can be instanced rather than having multiple copies. std::shared_ptr m_sharedPlane; /// Returns the shared plane static std::shared_ptr getSharedPlane(); }; }; // namespace Graphics }; // namespace SurgSim #if defined(_MSC_VER) #pragma warning(pop) #endif #endif // SURGSIM_GRAPHICS_OSGPLANEREPRESENTATION_H opensurgsim-0.7.0/SurgSim/Graphics/OsgPointCloudRepresentation.cpp000066400000000000000000000106141277777236100254270ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include #include "SurgSim/DataStructures/EmptyData.h" #include "SurgSim/DataStructures/Vertices.h" #include "SurgSim/Graphics/OsgConversions.h" #include "SurgSim/Graphics/OsgPointCloudRepresentation.h" namespace SurgSim { namespace Graphics { SURGSIM_REGISTER(SurgSim::Framework::Component, SurgSim::Graphics::OsgPointCloudRepresentation, OsgPointCloudRepresentation); OsgPointCloudRepresentation::OsgPointCloudRepresentation(const std::string& name) : Representation(name), PointCloudRepresentation(name), OsgRepresentation(name), m_color(1.0, 1.0, 1.0, 1.0) { m_vertices = std::make_shared(); osg::Geode* geode = new osg::Geode(); m_geometry = new osg::Geometry(); m_vertexData = new osg::Vec3Array; m_geometry->setVertexArray(m_vertexData); setColor(m_color); // At this stage there are no vertices in there m_drawArrays = new osg::DrawArrays(osg::PrimitiveSet::POINTS, 0, m_vertexData->size()); m_geometry->addPrimitiveSet(m_drawArrays); m_geometry->setUseDisplayList(false); m_geometry->setDataVariance(osg::Object::DYNAMIC); m_geometry->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::OFF); m_point = new osg::Point(1.0f); m_geometry->getOrCreateStateSet()->setAttribute(m_point, osg::StateAttribute::ON); geode->addDrawable(m_geometry); m_transform->addChild(geode); } OsgPointCloudRepresentation::~OsgPointCloudRepresentation() { } void OsgPointCloudRepresentation::doUpdate(double dt) { DataStructures::VerticesPlain vertices; // #performance // This is an intermediary step, it keeps the old non-threadsafe interface intact but also supports the // threadsafe update (btw, this is not any worse than what we did before) once we deprecate the non-threadsafe // access to the shared pointer we can remove the else branch // HS-2015-08-11 if (m_locker.tryTakeChanged(&vertices)) { updateGeometry(vertices); } else { updateGeometry(*m_vertices); } } void OsgPointCloudRepresentation::updateGeometry(const DataStructures::VerticesPlain& vertexData) { auto& vertices = vertexData.getVertices(); size_t count = vertices.size(); // Check for size change in number of vertices if (count != static_cast(m_drawArrays->getCount())) { if (count != m_vertexData->size()) { m_vertexData->resize(count); } m_drawArrays->set(osg::PrimitiveSet::POINTS, 0, count); m_drawArrays->dirty(); } // #performance // Calculate the bounding box while iterating over the vertices, this will save osg time in the update traversal for (size_t i = 0; i < count; ++i) { const auto& vertex = vertices[i]; (*m_vertexData)[i][0] = static_cast(vertex.position[0]); (*m_vertexData)[i][1] = static_cast(vertex.position[1]); (*m_vertexData)[i][2] = static_cast(vertex.position[2]); } m_geometry->dirtyBound(); m_geometry->dirtyDisplayList(); } std::shared_ptr OsgPointCloudRepresentation::getVertices() const { return m_vertices; } void OsgPointCloudRepresentation::setPointSize(double val) { m_point->setSize(val); } double OsgPointCloudRepresentation::getPointSize() const { return static_cast(m_point->getSize()); } void OsgPointCloudRepresentation::setColor(const SurgSim::Math::Vector4d& color) { // Set the color of the particles to one single color by default osg::Vec4Array* colors = dynamic_cast(m_geometry->getColorArray()); if (colors == nullptr) { colors = new osg::Vec4Array(1); m_geometry->setColorArray(colors); m_geometry->setColorBinding(osg::Geometry::BIND_OVERALL); } (*colors)[0] = SurgSim::Graphics::toOsg(color); m_color = color; } SurgSim::Math::Vector4d OsgPointCloudRepresentation::getColor() const { return m_color; } }; // Graphics }; // SurgSim opensurgsim-0.7.0/SurgSim/Graphics/OsgPointCloudRepresentation.h000066400000000000000000000053321277777236100250750ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_OSGPOINTCLOUDREPRESENTATION_H #define SURGSIM_GRAPHICS_OSGPOINTCLOUDREPRESENTATION_H #include #include #include #include "SurgSim/Framework/Macros.h" #include "SurgSim/Framework/ObjectFactory.h" #include "SurgSim/Graphics/PointCloudRepresentation.h" #include "SurgSim/Graphics/OsgRepresentation.h" namespace SurgSim { namespace DataStructures { class EmptyData; template class Vertices; } namespace Graphics { #if defined(_MSC_VER) #pragma warning(push) #pragma warning(disable:4250) #endif SURGSIM_STATIC_REGISTRATION(OsgPointCloudRepresentation); /// Osg point cloud representation, implementation of a PointCloudRepresenation using OSG. class OsgPointCloudRepresentation : public PointCloudRepresentation, public OsgRepresentation { public: /// Constructor /// \param name The name of the Representation. explicit OsgPointCloudRepresentation(const std::string& name); /// Destructor ~OsgPointCloudRepresentation(); SURGSIM_CLASSNAME(SurgSim::Graphics::OsgPointCloudRepresentation); std::shared_ptr getVertices() const override; void setPointSize(double val) override; double getPointSize() const override; void doUpdate(double dt) override; void setColor(const SurgSim::Math::Vector4d& color) override; SurgSim::Math::Vector4d getColor() const override; private: /// Local pointer to vertices with data std::shared_ptr m_vertices; /// OSG vertex data for updating osg::ref_ptr m_vertexData; /// OSG Geometry node holding the data osg::ref_ptr m_geometry; /// OSG DrawArrays for local operations osg::ref_ptr m_drawArrays; /// OSG::Point for local operations osg::ref_ptr m_point; /// Color backing variable SurgSim::Math::Vector4d m_color; /// Update the geometry /// \param vertices new vertices void updateGeometry(const DataStructures::VerticesPlain& vertices); }; #if defined(_MSC_VER) #pragma warning(pop) #endif }; // Graphics }; // SurgSim #endif // SURGSIM_GRAPHICS_OSGPOINTCLOUDREPRESENTATION_H opensurgsim-0.7.0/SurgSim/Graphics/OsgProgram.cpp000066400000000000000000000140761277777236100220410ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Graphics/OsgProgram.h" #include "SurgSim/Framework/ApplicationData.h" #include "SurgSim/Framework/Log.h" namespace { static const osg::Shader::Type OsgShaderTypes[3] = {osg::Shader::VERTEX, osg::Shader::FRAGMENT, osg::Shader::GEOMETRY}; } namespace SurgSim { namespace Graphics { OsgProgram::OsgProgram() : Program(), m_program(new osg::Program()), m_globalScope(false) { } void OsgProgram::addToStateSet(osg::StateSet* stateSet) { if (stateSet != nullptr) { int attribute = osg::StateAttribute::ON | ((m_globalScope) ? osg::StateAttribute::OVERRIDE : 0); stateSet->setAttributeAndModes(m_program, attribute); } } void OsgProgram::removeFromStateSet(osg::StateSet* stateSet) { if (stateSet != nullptr) { stateSet->removeAttribute(m_program); } } bool OsgProgram:: hasVertexShader() const { return hasShader(SHADER_TYPE_VERTEX); } void OsgProgram::clearVertexShader() { clearShader(SHADER_TYPE_VERTEX); } bool OsgProgram::loadVertexShader(const std::string& filePath) { return loadShaderSource(filePath, SHADER_TYPE_VERTEX); } void OsgProgram::setVertexShaderSource(const std::string& source) { setShaderSource(source, SHADER_TYPE_VERTEX); } bool OsgProgram::getVertexShaderSource(std::string* source) const { return getShaderSource(SHADER_TYPE_VERTEX, source); } bool OsgProgram::hasGeometryShader() const { return hasShader(SHADER_TYPE_GEOMETRY); } void OsgProgram::clearGeometryShader() { return clearShader(SHADER_TYPE_GEOMETRY); } bool OsgProgram::loadGeometryShader(const std::string& filePath) { return loadShaderSource(filePath, SHADER_TYPE_GEOMETRY); } void OsgProgram::setGeometryShaderSource(const std::string& source) { return setShaderSource(source, SHADER_TYPE_GEOMETRY); } bool OsgProgram::getGeometryShaderSource(std::string* source) const { return getShaderSource(SHADER_TYPE_GEOMETRY, source); } bool OsgProgram::hasFragmentShader() const { return hasShader(SHADER_TYPE_FRAGMENT); } void OsgProgram::clearFragmentShader() { clearShader(SHADER_TYPE_FRAGMENT); } bool OsgProgram::loadFragmentShader(const std::string& filePath) { return loadShaderSource(filePath, SHADER_TYPE_FRAGMENT); } void OsgProgram::setFragmentShaderSource(const std::string& source) { setShaderSource(source, SHADER_TYPE_FRAGMENT); } bool OsgProgram::getFragmentShaderSource(std::string* source) const { return getShaderSource(SHADER_TYPE_FRAGMENT, source); } osg::ref_ptr OsgProgram::getOsgProgram() const { return m_program; } void OsgProgram::setGlobalScope(bool val) { m_globalScope = val; osg::StateAttribute::ParentList parents = m_program->getParents(); for (auto it = std::begin(parents); it != std::end(parents); ++it) { addToStateSet(*it); } } bool OsgProgram::isGlobalScope() const { return m_globalScope; } bool OsgProgram::hasShader(int shaderType) const { bool result = true; if (shaderType < SHADER_TYPE_COUNT) { result = m_osgShaders[shaderType].valid(); } return result; } void OsgProgram::clearShader(int shaderType) { if (hasShader(shaderType)) { m_program->removeShader(m_osgShaders[shaderType]); m_osgShaders[shaderType] = nullptr; } } bool OsgProgram::loadShaderSource(const std::string& filePath, int shaderType) { bool result = false; auto shader = getOrCreateOsgShader(shaderType); if (shader->loadShaderSourceFromFile(filePath)) { shader->setName(filePath); result = true; } return result; } void OsgProgram::setShaderSource(const std::string& source, int shaderType) { auto shader = getOrCreateOsgShader(shaderType); shader->setShaderSource(source); } bool OsgProgram::getShaderSource(int shaderType, std::string* source) const { if (hasShader(shaderType)) { *source = m_osgShaders[shaderType]->getShaderSource(); return true; } else { *source = ""; return false; } } osg::ref_ptr OsgProgram::getOrCreateOsgShader(int shaderType) { osg::ref_ptr result; if (!hasShader(shaderType)) { result = new osg::Shader(OsgShaderTypes[shaderType]); m_program->addShader(result); m_osgShaders[shaderType] = result; } else { result = m_osgShaders[shaderType]; } return result; } std::shared_ptr loadProgram(const SurgSim::Framework::ApplicationData& data, const std::string& name) { return loadProgram(data, name + ".vert", name + ".frag"); } std::shared_ptr loadProgram(const SurgSim::Framework::ApplicationData& data, const std::string& vertexShaderName, const std::string& fragmentShaderName) { std::string filename; auto program(std::make_shared()); bool success = true; filename = data.findFile(vertexShaderName); if (filename == "") { SURGSIM_LOG_WARNING(SurgSim::Framework::Logger::getDefaultLogger()) << "Could not find vertex shader " << vertexShaderName; success = false; } else if (!program->loadVertexShader(filename)) { SURGSIM_LOG_WARNING(SurgSim::Framework::Logger::getDefaultLogger()) << "Could not load vertex shader " << vertexShaderName; success = false; } filename = data.findFile(fragmentShaderName); if (filename == "") { SURGSIM_LOG_WARNING(SurgSim::Framework::Logger::getDefaultLogger()) << "Could not find fragment shader " << fragmentShaderName; success = false; } if (!program->loadFragmentShader(filename)) { SURGSIM_LOG_WARNING(SurgSim::Framework::Logger::getDefaultLogger()) << "Could not load fragment shader " << fragmentShaderName; success = false; } if (!success) { program = nullptr; } return program; } } } opensurgsim-0.7.0/SurgSim/Graphics/OsgProgram.h000066400000000000000000000123141277777236100214770ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_OSGPROGRAM_H #define SURGSIM_GRAPHICS_OSGPROGRAM_H #include "SurgSim/Graphics/Program.h" #include #include #include #include #include namespace SurgSim { namespace Framework { class ApplicationData; } namespace Graphics { /// OSG-based implementation of a graphics shader. /// /// Wraps an osg::Program which manages the geometry, vertex, and fragment shaders. /// The osg::Program is added to the osg::StateSet of an osg::Node to use the shaders for the rendering of that /// node's geometry. class OsgProgram : public Program { public: /// Constructor /// \post No shader code is set, so the fixed-function pipeline is used. OsgProgram(); bool hasVertexShader() const override; void clearVertexShader() override; bool loadVertexShader(const std::string& filePath) override; void setVertexShaderSource(const std::string& source) override; bool getVertexShaderSource(std::string* source) const override; bool hasGeometryShader() const override; void clearGeometryShader() override; bool loadGeometryShader(const std::string& filePath) override; void setGeometryShaderSource(const std::string& source) override; bool getGeometryShaderSource(std::string* source) const override; bool hasFragmentShader() const override; void clearFragmentShader() override; bool loadFragmentShader(const std::string& filePath) override; void setFragmentShaderSource(const std::string& source) override; bool getFragmentShaderSource(std::string* source) const override; void setGlobalScope(bool val) override; bool isGlobalScope() const override; /// \return the OSG program attribute osg::ref_ptr getOsgProgram() const; /// Adds this shader to the OSG state set /// \param stateSet OSG state set void addToStateSet(osg::StateSet* stateSet); /// Removes this uniform from the OSG state set /// \param stateSet OSG state set void removeFromStateSet(osg::StateSet* stateSet); private: /// OSG program attribute osg::ref_ptr m_program; // Type of shader, internal use only enum ShaderType { SHADER_TYPE_VERTEX = 0, SHADER_TYPE_FRAGMENT, SHADER_TYPE_GEOMETRY, SHADER_TYPE_COUNT }; /// Storage of the osg objects std::array, SHADER_TYPE_COUNT> m_osgShaders; /// Check whether there is a shader in use for the given type /// \param shaderType Type of the shader /// \return true if the shader has been set, otherwise false. bool hasShader(int shaderType) const; /// Removes the geometry shader, returning that portion of the shader program to fixed-function. /// \param shaderType Type of the shader void clearShader(int shaderType); /// Loads the shader source code from a file /// \param filePath Path to file containing shader source code /// \param shaderType Type of the shader /// \return True if the source is successfully loaded, otherwise false. bool loadShaderSource(const std::string& filePath, int shaderType); /// Set the shader source code /// \param source Shader source code /// \param shaderType Type of the shader virtual void setShaderSource(const std::string& source, int shaderType); /// Gets the shader source code /// \return Shader source code virtual bool getShaderSource(int shaderType, std::string* source) const; /// Fetches the appropriate shader if it exists, creates it otherwise /// \param shaderType Type of the shader /// \return the shader with the given type osg::ref_ptr getOrCreateOsgShader(int shaderType); /// Is the shader supposed to be used globally bool m_globalScope; }; /// Utility function, load a program from a set of shader files /// \param data Application data object /// \param name the base name of the shader files to be used '.vert' and '.frag' will be added automatically /// \return a valid program if all the shaders are found, nullptr otherwise std::shared_ptr loadProgram(const SurgSim::Framework::ApplicationData& data, const std::string& name); /// Utility function, load a program from a set of shader files /// \param data Application data object /// \param vertexShaderName name of the vertex shader to be used /// \param fragmentShaderName name of the fragment shader to be used /// \return a valid program if all the shaders are found, nullptr otherwise std::shared_ptr loadProgram(const SurgSim::Framework::ApplicationData& data, const std::string& vertexShaderName, const std::string& fragmentShaderName); }; // namespace Graphics }; // namespace SurgSim #endif // SURGSIM_GRAPHICS_OSGPROGRAM_H opensurgsim-0.7.0/SurgSim/Graphics/OsgQuaternionConversions.h000066400000000000000000000037551277777236100244570ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Conversions to and from OSG quaternion types /// /// Note that the Eigen quaternion constructor takes the W component first, while OSG stores it last. /// /// Also note that OSG only has one Quat type, which uses double for the value type. Conversions are provided to and /// from this type for both SurgSim::Math::Quaternionf and SurgSim::Math::Quaterniond. #ifndef SURGSIM_GRAPHICS_OSGQUATERNIONCONVERSIONS_H #define SURGSIM_GRAPHICS_OSGQUATERNIONCONVERSIONS_H #include "SurgSim/Math/Quaternion.h" #include namespace SurgSim { namespace Graphics { /// Convert quaternion of floats to OSG inline osg::Quat toOsg(const SurgSim::Math::Quaternionf& quaternion) { return osg::Quat(quaternion.x(), quaternion.y(), quaternion.z(), quaternion.w()); } /// Convert quaternion of doubles to OSG inline osg::Quat toOsg(const SurgSim::Math::Quaterniond& quaternion) { return osg::Quat(quaternion.x(), quaternion.y(), quaternion.z(), quaternion.w()); } /// Convert from OSG to either quaternion of floats or doubles /// \tparam T Value type (float or double) template inline Eigen::Quaternion fromOsg(const osg::Quat& quaternion) { return Eigen::Quaternion(quaternion.w(), quaternion.x(), quaternion.y(), quaternion.z()); } }; // namespace Graphics }; // namespace SurgSim #endif // SURGSIM_GRAPHICS_OSGQUATERNIONCONVERSIONS_H opensurgsim-0.7.0/SurgSim/Graphics/OsgRenderTarget-inl.h000066400000000000000000000110451277777236100232360ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_OSGRENDERTARGET_INL_H #define SURGSIM_GRAPHICS_OSGRENDERTARGET_INL_H namespace SurgSim { namespace Graphics { // Osg Supports 16 Color Attachments plus the depth texture const int OsgSupportedTextureCount = 16 + 1; template OsgRenderTarget::OsgRenderTarget() : m_width(0), m_height(0), m_colorTargetCount(0), m_textures(OsgSupportedTextureCount) { } template OsgRenderTarget::OsgRenderTarget( int width, int height, double scale, int colorCount, bool useDepth) : m_width(width * scale), m_height(height * scale), m_colorTargetCount(0), m_textures(OsgSupportedTextureCount) { setColorTargetCount(colorCount); useDepthTarget(useDepth); } template OsgRenderTarget::~OsgRenderTarget() { } template void OsgRenderTarget::getSize(int* width, int* height) const { *width = m_width; *height = m_height; } template int OsgRenderTarget::setColorTargetCount(int count) { int result = (count < 16) ? count : 16; // This does not check against graphics card capabilities, the max 16 provided // by OSG might not be supported by the current graphics card // Keep the other texture allocated when the count goes down // Rendertargets are probably not going to change that much once set up // #memory for (int i = m_colorTargetCount; i < result; ++i) { setupTexture(TARGETTYPE_COLORBASE + i); } m_colorTargetCount = result; return result; } template int OsgRenderTarget::getColorTargetCount() const { return m_colorTargetCount; } template std::shared_ptr OsgRenderTarget::getColorTarget(int index) const { std::shared_ptr result; if (index < m_colorTargetCount) { result = m_textures[TARGETTYPE_COLORBASE + index]; } return result; } template std::shared_ptr OsgRenderTarget::getColorTargetOsg(int index) const { std::shared_ptr result; if (index < m_colorTargetCount) { result = m_textures[TARGETTYPE_COLORBASE + index]; } return result; } template void OsgRenderTarget::useDepthTarget(bool val) { if (val) { setupTexture(TARGETTYPE_DEPTH); } else { m_textures[TARGETTYPE_DEPTH] = nullptr; } } template bool OsgRenderTarget::doesUseDepthTarget() const { return m_textures.at(TARGETTYPE_DEPTH) != nullptr; } template std::shared_ptr OsgRenderTarget::getDepthTarget() const { return m_textures.at(TARGETTYPE_DEPTH); } template std::shared_ptr OsgRenderTarget::getDepthTargetOsg() const { return m_textures.at(TARGETTYPE_DEPTH); } template void OsgRenderTarget::setupTexture(int type) { if (m_textures[type] == nullptr) { m_textures[type] = std::make_shared(); m_textures[type]->setSize(m_width, m_height); osg::Texture* osgTexture = m_textures[type]->getOsgTexture(); // We are not dealing with mipmaps, fix up the filters to enable rendering to FBO // see http://www.opengl.org/wiki/Common_Mistakes#Creating_a_complete_texture osgTexture->setFilter(osg::Texture::MIN_FILTER, osg::Texture::LINEAR); osgTexture->setFilter(osg::Texture::MAG_FILTER, osg::Texture::LINEAR); osgTexture->setWrap(osg::Texture::WRAP_S, osg::Texture::CLAMP_TO_EDGE); osgTexture->setWrap(osg::Texture::WRAP_T, osg::Texture::CLAMP_TO_EDGE); if (type == TARGETTYPE_DEPTH) { osgTexture->setInternalFormat(GL_DEPTH_COMPONENT32F); osgTexture->setSourceFormat(GL_DEPTH_COMPONENT); osgTexture->setSourceType(GL_FLOAT); osgTexture->setWrap(osg::Texture::WRAP_S, osg::Texture::CLAMP_TO_BORDER); osgTexture->setWrap(osg::Texture::WRAP_T, osg::Texture::CLAMP_TO_BORDER); osgTexture->setBorderColor(osg::Vec4(1.0, 1.0, 1.0, 1.0)); } if (type >= TARGETTYPE_COLORBASE) { osgTexture->setInternalFormat(GL_RGBA32F_ARB); osgTexture->setSourceFormat(GL_RGBA); osgTexture->setSourceType(GL_FLOAT); } } } }; // namespace Graphics }; // namespace SurgSim #endif opensurgsim-0.7.0/SurgSim/Graphics/OsgRenderTarget.h000066400000000000000000000113621277777236100224600ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_OSGRENDERTARGET_H #define SURGSIM_GRAPHICS_OSGRENDERTARGET_H #include #include #include "SurgSim/Graphics/RenderTarget.h" #include "SurgSim/Graphics/OsgTexture.h" #include "SurgSim/Graphics/OsgTexture2d.h" #include "SurgSim/Graphics/OsgTextureRectangle.h" #include namespace SurgSim { namespace Graphics { /// Osg abstract render target, this hides the type of the actual osg texture and lets us use /// OsgRenderTarget without the template type class OsgAbstractRenderTarget : public RenderTarget { /// Accessor for the color target as an OsgTexture. /// \param index Zero-based index of the color texture. /// \return The color target as an osg specific class. virtual std::shared_ptr getColorTargetOsg(int index) const = 0; /// Accessor for the depth target as an OsgTexture. /// \return The depth target as an osg specific class. virtual std::shared_ptr getDepthTargetOsg() const = 0; }; /// Specific implementation of the render target class. It is templated so different texture formats can be chosen. /// \tparam T Type of the texture that should be used as targets probably either OsgTexture2d or OsgTextureRectangle. template class OsgRenderTarget : public OsgAbstractRenderTarget { public: /// The internal type of the texture, not exposed in the public interface typedef T TextureType; /// Default constructor OsgRenderTarget(); /// Constructor set all the paramters for the render target /// \param width, height The width and height of the target textures. /// \param scale (Optional) the scale, scales width and height by this factor. /// \param colorCount (Optional) number of color textures to use. /// \param useDepth (Optional) whether to use a depth texture. OsgRenderTarget(int width, int height, double scale = 1.0, int colorCount = 0, bool useDepth = false); /// Destructor ~OsgRenderTarget(); /// Gets a size. /// \param [out] width, height The width and height of the RenderTarget textures. void getSize(int* width, int* height) const override; /// \return The number of color targets that are available. int getColorTargetCount() const override; /// Generic accessor for a specific color target texture. /// \param index Zero-based index of the texure. /// \return The actual Texture. std::shared_ptr getColorTarget(int index) const override; /// Accessor for the color target as an OsgTexture. /// \param index Zero-based index of the color texture. /// \return The color target as an osg specific class. std::shared_ptr getColorTargetOsg(int index) const; /// Determines if RenderTarget does use a depth target. /// \return true if it does. bool doesUseDepthTarget() const override; /// Generic accessor for the depth Target. /// \return The depth target. std::shared_ptr getDepthTarget() const override; /// Accessor for the depth target as an OsgTexture. /// \return The depth target as an osg specific class. std::shared_ptr getDepthTargetOsg() const; private: /// Values that represent TargetTypes. enum TargetTypes { TARGETTYPE_DEPTH = 0, TARGETTYPE_COLORBASE = 1 }; /// The width of this RenderTarget. int m_width; /// The height of this RenderTarget. int m_height; /// Number of color targets. int m_colorTargetCount; /// The textures that are being used as target, size of this is 16 (ColorTargets) + 1 (Depth). std::vector> m_textures; /// Sets color target count. /// \param count The number of color textures to use. /// \return . int setColorTargetCount(int count); /// Use depth target. /// \param val true to value. void useDepthTarget(bool val); /// Sets up the texture with a given target type (depth or color w/ index). /// \param type The index of the texture to use. void setupTexture(int type); }; ///@{ /// Predefine specialized render targets typedef OsgRenderTarget OsgRenderTarget2d; typedef OsgRenderTarget OsgRenderTargetRectangle; ///@} }; // Graphics }; // SurgSim #include "SurgSim/Graphics/OsgRenderTarget-inl.h" #endifopensurgsim-0.7.0/SurgSim/Graphics/OsgRepresentation.cpp000066400000000000000000000115541277777236100234320ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Graphics/OsgRepresentation.h" #include #include #include #include #include #include #include #include "SurgSim/Framework/Log.h" #include "SurgSim/Graphics/OsgMaterial.h" #include "SurgSim/Graphics/OsgRigidTransformConversions.h" #include "SurgSim/Graphics/OsgUnitBox.h" #include "SurgSim/Graphics/OsgUniform.h" #include "SurgSim/Graphics/OsgUniformFactory.h" #include "SurgSim/Graphics/TangentSpaceGenerator.h" namespace SurgSim { namespace Graphics { OsgRepresentation::OsgRepresentation(const std::string& name) : Representation(name), m_drawAsWireFrame(false), m_modelMatrixUniform(std::make_shared>("modelMatrix")) { m_switch = new osg::Switch; m_switch->setName(name + " Representation Switch"); m_modelMatrixUniform->addToStateSet(m_switch->getOrCreateStateSet()); m_materialProxy = new osg::Group; m_switch->addChild(m_materialProxy); m_transform = new osg::PositionAttitudeTransform(); m_transform->setName(name + " Transform"); m_materialProxy->addChild(m_transform); m_transform->setAttitude(osg::Quat(0.0, 0.0, 0.0, 1.0)); m_transform->setPosition(osg::Vec3d(0.0, 0.0, 0.0)); } OsgRepresentation::~OsgRepresentation() { } void OsgRepresentation::update(double dt) { if (isActive()) { std::pair pose = toOsg(getPose()); m_transform->setAttitude(pose.first); m_transform->setPosition(pose.second); doUpdate(dt); setVisible(true); } else { setVisible(false); } } bool OsgRepresentation::setMaterial(std::shared_ptr material) { bool didSucceed = false; std::shared_ptr osgMaterial = std::dynamic_pointer_cast(material); if (osgMaterial != nullptr) { m_materialProxy->setStateSet(osgMaterial->getOsgStateSet()); didSucceed = true; m_material = osgMaterial; } return didSucceed; } std::shared_ptr OsgRepresentation::getMaterial() const { return m_material; } void OsgRepresentation::clearMaterial() { m_materialProxy->setStateSet(new osg::StateSet()); // Reset to empty state set m_material = nullptr; } osg::ref_ptr OsgRepresentation::getOsgNode() const { return m_switch; } void OsgRepresentation::doUpdate(double dt) { } void OsgRepresentation::setDrawAsWireFrame(bool val) { m_drawAsWireFrame = val; osg::StateSet* state = m_switch->getOrCreateStateSet(); osg::ref_ptr polygonMode; if (val) { polygonMode = new osg::PolygonMode(osg::PolygonMode::FRONT_AND_BACK, osg::PolygonMode::LINE); } else { polygonMode = new osg::PolygonMode(osg::PolygonMode::FRONT, osg::PolygonMode::FILL); } state->setAttributeAndModes(polygonMode, osg::StateAttribute::ON); } bool OsgRepresentation::getDrawAsWireFrame() const { return m_drawAsWireFrame; } void OsgRepresentation::setVisible(bool val) { m_switch->setChildValue(m_materialProxy, val); } void OsgRepresentation::setGenerateTangents(bool value) { if (value && m_tangentGenerator == nullptr) { m_tangentGenerator = new TangentSpaceGenerator(DIFFUSE_TEXTURE_UNIT, TANGENT_VERTEX_ATTRIBUTE_ID, BITANGENT_VERTEX_ATTRIBUTE_ID); m_tangentGenerator->setBasisOrthonormality(true); } if (!value) { m_tangentGenerator = nullptr; } } bool OsgRepresentation::isGeneratingTangents() const { return m_tangentGenerator != nullptr; } void OsgRepresentation::updateTangents() { if (m_tangentGenerator != nullptr) { m_switch->accept(*m_tangentGenerator); } } void OsgRepresentation::addUniform(std::shared_ptr uniform) { auto osgUniform = std::dynamic_pointer_cast(uniform); SURGSIM_ASSERT(osgUniform != nullptr) << "Uniform must be an OsgUniform"; m_transform->getOrCreateStateSet()->addUniform(osgUniform->getOsgUniform()); } void OsgRepresentation::addUniform(const std::string& type, const std::string& name, const boost::any& value) { static OsgUniformFactory factory; if (factory.isRegistered(type)) { auto uniform = factory.create(type, name); uniform->setValue("Value", value); addUniform(uniform); } else { SURGSIM_FAILURE() << "OsgUniform type " << type << " not supported."; } } }; // Graphics }; // SurgSim opensurgsim-0.7.0/SurgSim/Graphics/OsgRepresentation.h000066400000000000000000000116061277777236100230750ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_OSGREPRESENTATION_H #define SURGSIM_GRAPHICS_OSGREPRESENTATION_H #include #include #include "SurgSim/Graphics/Representation.h" #include "SurgSim/Graphics/OsgUniform.h" namespace osg { class Group; class Node; class PositionAttitudeTransform; class Switch; } namespace SurgSim { namespace Graphics { class OsgMaterial; class TangentSpaceGenerator; class UniformBase; /// OSS default value for opengl values that have to be assigned a fixed number ///@{ static const int TANGENT_VERTEX_ATTRIBUTE_ID = 6; static const int BITANGENT_VERTEX_ATTRIBUTE_ID = 7; static const int DIFFUSE_TEXTURE_UNIT = 0; static const int NORMAL_TEXTURE_UNIT = 1; static const int SHADOW_TEXTURE_UNIT = 8; ///@} /// Base OSG implementation of a graphics representation. /// /// Wraps an osg::Node which serves as the root for the representation's portion of the scene graph. class OsgRepresentation : public virtual Representation { public: /// Constructor explicit OsgRepresentation(const std::string& name); /// Destructor virtual ~OsgRepresentation(); /// Returns the root OSG Node for this representations portion of the scene graph osg::ref_ptr getOsgNode() const; /// Sets the material that defines the visual appearance of the representation /// \param material Graphics material /// \return True if set successfully, otherwise false /// \note OsgPlaneRepresentation only accepts subclasses of OsgMaterial. bool setMaterial(std::shared_ptr material) override; /// Gets the material that defines the visual appearance of the representation /// \return Graphics material std::shared_ptr getMaterial() const override; /// Removes the material from the representation void clearMaterial() override; void setDrawAsWireFrame(bool val) override; bool getDrawAsWireFrame() const override; /// Enable the generation of tangents /// When enabled it is up to the subclasses responsibility to react to changes and trigger the regeneration of /// Tangents. Tangents will be stored for every geometry node that contains a vertex, normal and texture array. /// \note the \sa TangentSpaceGenerator is used to create the appropriate vertex attribute arrays. /// These are stored as vertex attribute arrays at the indices indicated by TANGENT_ARRAY_ATTRIBUTE_ID, /// and BITANGENT_ARRAY_ATTRIBUTE_ID with the format osg::ArrayVec4. /// The tangents will be made orthonormal by default. /// tangents via \sa updateTangents() void setGenerateTangents(bool value) override; bool isGeneratingTangents() const override; /// Updates the representation. /// \param dt The time in seconds of the preceding timestep. void update(double dt) override; /// Adds a uniform to this representation. /// \param uniform Uniform to add. void addUniform(std::shared_ptr uniform); /// Adds and a uniform to this representation and set its value /// \param type the type of the uniform /// \param name Name used in shader code to access this uniform /// \param value The value for this uniform void addUniform(const std::string& type, const std::string& name, const boost::any& value); protected: virtual void doUpdate(double dt); /// Set the visibility of this representation /// \param val The visibility void setVisible(bool val); /// Causes the tangents to be recalculated if tangent generation is enabled /// Subclasses should call this whenever the state changes in a way that need tangents to be recalculated void updateTangents(); /// Switch used to toggle the visibility of the representation osg::ref_ptr m_switch; /// Transform used to pose the representation osg::ref_ptr m_transform; /// Holder for attributes coming from OsgMaterial osg::ref_ptr m_materialProxy; /// Material defining the visual appearance of the representation std::shared_ptr m_material; /// Visitor to generate tangents osg::ref_ptr m_tangentGenerator; /// Indicates if the representation is rendered as a wireframe. bool m_drawAsWireFrame; std::shared_ptr> m_modelMatrixUniform; }; }; // Graphics }; // SurgSim #endif // SURGSIM_GRAPHICS_OSGREPRESENTATION_H opensurgsim-0.7.0/SurgSim/Graphics/OsgRigidTransformConversions.h000066400000000000000000000063221277777236100252550ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Conversions to and from OSG rigid transform types /// /// Note that OSG does not have a rigid transform type, so a quaternion, vector pair are used for the rotation and /// translation components of the rigid transform. #ifndef SURGSIM_GRAPHICS_OSGRIGIDTRANSFORMCONVERSIONS_H #define SURGSIM_GRAPHICS_OSGRIGIDTRANSFORMCONVERSIONS_H #include "SurgSim/Graphics/OsgQuaternionConversions.h" #include "SurgSim/Graphics/OsgVectorConversions.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Vector.h" #include #include #include namespace SurgSim { namespace Graphics { /// Convert 3D rigid body (isometric) transform, represented as floats, to OSG inline std::pair toOsg(const SurgSim::Math::RigidTransform3f& transform) { SurgSim::Math::Quaternionf normalizedQuaternion = SurgSim::Math::Quaternionf(transform.linear()).normalized(); return std::make_pair(toOsg(normalizedQuaternion), toOsg(SurgSim::Math::Vector3f(transform.translation()))); } /// Convert 3D rigid body (isometric) transform, represented as doubles, to OSG inline std::pair toOsg(const SurgSim::Math::RigidTransform3d& transform) { SurgSim::Math::Quaterniond normalizedQuaternion = SurgSim::Math::Quaterniond(transform.linear()).normalized(); return std::make_pair(toOsg(normalizedQuaternion), toOsg(SurgSim::Math::Vector3d(transform.translation()))); } /// Convert from OSG to 3D rigid body (isometric) transform, represented as floats inline SurgSim::Math::RigidTransform3f fromOsg(const osg::Quat& rotation, const osg::Vec3f& translation) { return SurgSim::Math::makeRigidTransform(fromOsg(rotation), fromOsg(translation)); } /// Convert from OSG to 3D rigid body (isometric) transform, represented as floats inline SurgSim::Math::RigidTransform3f fromOsg(const std::pair& transform) { return fromOsg(transform.first, transform.second); } /// Convert from OSG to 3D rigid body (isometric) transform, represented as doubles inline SurgSim::Math::RigidTransform3d fromOsg(const osg::Quat& rotation, const osg::Vec3d& translation) { return SurgSim::Math::makeRigidTransform(fromOsg(rotation), fromOsg(translation)); } /// Convert from OSG to 3D rigid body (isometric) transform, represented as doubles inline SurgSim::Math::RigidTransform3d fromOsg(const std::pair& transform) { return fromOsg(transform.first, transform.second); } }; // namespace Graphics }; // namespace SurgSim #endif // SURGSIM_GRAPHICS_OSGRIGIDTRANSFORMCONVERSIONS_Hopensurgsim-0.7.0/SurgSim/Graphics/OsgSceneryRepresentation.cpp000066400000000000000000000047741277777236100247710ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include "SurgSim/Framework/Assert.h" #include "SurgSim/Framework/ApplicationData.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Graphics/OsgSceneryRepresentation.h" #include "SurgSim/Graphics/OsgModel.h" namespace SurgSim { namespace Graphics { SURGSIM_REGISTER(SurgSim::Framework::Component, SurgSim::Graphics::OsgSceneryRepresentation, OsgSceneryRepresentation); OsgSceneryRepresentation::OsgSceneryRepresentation(const std::string& name) : Representation(name), OsgRepresentation(name), SceneryRepresentation(name), m_osgNode(nullptr), m_fileName() { } bool OsgSceneryRepresentation::doInitialize() { return true; } void OsgSceneryRepresentation::loadModel(const std::string& fileName) { auto model = std::make_shared(); model->load(fileName); setModel(model); } void OsgSceneryRepresentation::setModel(std::shared_ptr model) { auto osgModel = std::dynamic_pointer_cast(model); SURGSIM_ASSERT(model == nullptr || osgModel != nullptr) << "OsgSceneryRepresentation expects an OsgModel."; if (m_osgNode.valid()) { m_transform->removeChild(m_osgNode); } if (osgModel != nullptr) { SURGSIM_ASSERT(osgModel->getOsgNode().valid()) << "OsgSceneryRepresentation was passed a model that did not have any geometry assigned to it."; m_osgNode = osgModel->getOsgNode(); m_transform->addChild(m_osgNode); } m_model = osgModel; updateTangents(); } std::shared_ptr OsgSceneryRepresentation::getModel() const { return m_model; } osg::ref_ptr OsgSceneryRepresentation::getModelNode() const { return m_osgNode; } void OsgSceneryRepresentation::setGenerateTangents(bool value) { OsgRepresentation::setGenerateTangents(value); if (m_osgNode.valid()) { updateTangents(); } } }; // namespace Graphics }; // namespace SurgSimopensurgsim-0.7.0/SurgSim/Graphics/OsgSceneryRepresentation.h000066400000000000000000000043351277777236100244270ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_OSGSCENERYREPRESENTATION_H #define SURGSIM_GRAPHICS_OSGSCENERYREPRESENTATION_H #include "SurgSim/Graphics/OsgRepresentation.h" #include "SurgSim/Graphics/SceneryRepresentation.h" #include #if defined(_MSC_VER) #pragma warning(push) #pragma warning(disable:4250) #endif namespace SurgSim { namespace Framework { class Asset; } namespace Graphics { class Model; SURGSIM_STATIC_REGISTRATION(OsgSceneryRepresentation); /// A OsgSceneryRepresentation is used to load osg object/node from file class OsgSceneryRepresentation: public OsgRepresentation, public SceneryRepresentation { public: friend class OsgSceneryRepresentationTest; /// Constructor /// \param name Name of OsgSceneryRepresentation explicit OsgSceneryRepresentation(const std::string& name); SURGSIM_CLASSNAME(SurgSim::Graphics::OsgSceneryRepresentation); void loadModel(const std::string& fileName) override; void setModel(std::shared_ptr model) override; std::shared_ptr getModel() const override; /// \return the osg node that carries the information of the loaded model osg::ref_ptr getModelNode() const; void setGenerateTangents(bool value) override; private: bool doInitialize() override; /// A osg::Node to hold the objet loaded from file osg::ref_ptr m_osgNode; std::shared_ptr m_model; /// Name of the object file to be loaded std::string m_fileName; }; }; // namespace Graphics }; // namespace SurgSim #if defined(_MSC_VER) #pragma warning(pop) #endif #endif // SURGSIM_GRAPHICS_OSGSCENERYREPRESENTATION_H opensurgsim-0.7.0/SurgSim/Graphics/OsgScreenSpacePass.cpp000066400000000000000000000036001277777236100234430ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Graphics/OsgScreenSpacePass.h" #include "SurgSim/Graphics/OsgCamera.h" #include #include namespace SurgSim { namespace Graphics { OsgScreenSpacePass::OsgScreenSpacePass(const std::string& name) : RenderPass(name), m_width(0), m_height(0) { } OsgScreenSpacePass::~OsgScreenSpacePass() { } bool OsgScreenSpacePass::doInitialize() { RenderPass::doInitialize(); auto camera = std::dynamic_pointer_cast(getCamera()); bool result = false; if (camera != nullptr) { m_camera = camera->getOsgCamera(); m_camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF); m_camera->setClearMask(GL_DEPTH_BUFFER_BIT); setRenderOrder(Camera::RENDER_ORDER_POST_RENDER, 0); updateViewport(m_width, m_height); result = true; } return result; } void OsgScreenSpacePass::updateViewport(int width, int height) { if (m_camera != nullptr) { m_camera->setProjectionMatrixAsOrtho2D(0, width, 0, height); } } void OsgScreenSpacePass::setViewPort(int width, int height) { SURGSIM_ASSERT(width >= 0 && height >= 0) << "Viewport width or height cannot be smaller than 0."; if (m_width != width || m_height != height) { m_width = width; m_height = height; updateViewport(m_width, m_height); } } } } opensurgsim-0.7.0/SurgSim/Graphics/OsgScreenSpacePass.h000066400000000000000000000032601277777236100231120ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_OSGSCREENSPACEPASS_H #define SURGSIM_GRAPHICS_OSGSCREENSPACEPASS_H #include #include "SurgSim/Graphics/RenderPass.h" #include namespace osg { class Camera; } namespace SurgSim { namespace Graphics { /// Special RenderPass to draw items using a orthogonal projection, this is specific to the /// Osg implementation of the SurgSim rendering class OsgScreenSpacePass : public RenderPass { public: /// Constructor. /// \param name The name of the component explicit OsgScreenSpacePass(const std::string& name); /// Destructor virtual ~OsgScreenSpacePass(); /// Set viewport dimensions void setViewPort(int width, int height); /// Initialize this Component bool doInitialize() override; private: /// Update the projection matrix void updateViewport(int width, int height); /// The osg camera reference osg::ref_ptr m_camera; /// The width of the viewport int m_width; /// The height of the viewport int m_height; }; } } #endif // SURGSIM_GRAPHICS_OSGSCREENSPACEPASS_H opensurgsim-0.7.0/SurgSim/Graphics/OsgScreenSpaceQuadRepresentation.cpp000066400000000000000000000167021277777236100263610ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Framework/SceneElement.h" #include "SurgSim/Graphics/OsgMaterial.h" #include "SurgSim/Graphics/OsgRigidTransformConversions.h" #include "SurgSim/Graphics/OsgScreenSpaceQuadRepresentation.h" #include "SurgSim/Graphics/OsgUniform.h" #include "SurgSim/Graphics/OsgUniformBase.h" #include "SurgSim/Graphics/Texture2d.h" #include "SurgSim/Graphics/TextureRectangle.h" #include #include #include #include #include #include #include #include namespace { enum TextureType { TEXTURE_TYPE_RECTANGLE, TEXTURE_TYPE_POWER_OF_TWO }; } namespace SurgSim { namespace Graphics { OsgScreenSpaceQuadRepresentation::OsgScreenSpaceQuadRepresentation(const std::string& name) : Representation(name), OsgRepresentation(name), ScreenSpaceQuadRepresentation(name), m_scale(1.0, 1.0, 1.0) { m_switch = new osg::Switch; m_switch->setName(name + " Switch"); m_transform = new osg::PositionAttitudeTransform(); m_transform->setName(name + " Transform"); m_geode = new osg::Geode; // Make the quad float depth = 0.0; m_geometry = osg::createTexturedQuadGeometry( osg::Vec3(0.0, 0.0, depth), osg::Vec3(1.0, 0.0, depth), osg::Vec3(0.0, 1.0, depth)); osg::Vec4Array* colors = new osg::Vec4Array; colors->push_back(osg::Vec4(1.0f, 1.0f, 1.0f, 1.0f)); m_geometry->setColorArray(colors); m_geometry->setColorBinding(osg::Geometry::BIND_OVERALL); m_geometry->addPrimitiveSet(new osg::DrawArrays(GL_QUADS, 0, 4)); m_geode->addDrawable(m_geometry); m_transform->setReferenceFrame(osg::Transform::ABSOLUTE_RF); m_transform->setCullingActive(false); m_transform->addChild(m_geode); // By default use float texture coordinates, this makes this useable without a texture set setTextureCoordinates(0.0, 0.0, 1.0, 1.0); m_switch->addChild(m_materialProxy); m_materialProxy->addChild(m_transform); m_textureUniform = std::make_shared>>("texture"); m_rectangleTextureUniform = std::make_shared>>("texture"); removeGroupReference(Representation::DefaultGroupName); addGroupReference(Representation::DefaultHudGroupName); SURGSIM_ADD_SERIALIZABLE_PROPERTY(OsgScreenSpaceQuadRepresentation, bool, Transparent, isTransparent, setTransparent); } OsgScreenSpaceQuadRepresentation::~OsgScreenSpaceQuadRepresentation() { } void OsgScreenSpaceQuadRepresentation::setSize(double width, double height) { m_scale.x() = width; m_scale.y() = height; m_transform->setScale(m_scale); } void OsgScreenSpaceQuadRepresentation::getSize(double* width, double* height) const { SURGSIM_ASSERT(width != nullptr && height != nullptr) << "Cannot use a nullptr as an output parameter"; *width = m_scale.x(); *height = m_scale.y(); } bool OsgScreenSpaceQuadRepresentation::setTexture(std::shared_ptr texture) { SURGSIM_ASSERT(texture != nullptr) << "Null texture passed to setTexture"; std::shared_ptr osgTexture2d = std::dynamic_pointer_cast(texture); if (osgTexture2d != nullptr) { return setTexture(osgTexture2d); } std::shared_ptr osgTextureRectangle = std::dynamic_pointer_cast(texture); if (osgTextureRectangle != nullptr) { return setTexture(osgTextureRectangle); } return false; } bool OsgScreenSpaceQuadRepresentation::setTexture(std::shared_ptr osgTexture) { m_textureUniform->set(osgTexture); if (m_texureType.hasValue() && m_texureType.getValue() == TEXTURE_TYPE_RECTANGLE) { SURGSIM_ASSERT(!isInitialized()) << "Cannot change the type of texture once the quad has been initialized."; m_rectangleTextureUniform->removeFromStateSet(m_switch->getOrCreateStateSet()); } else { m_textureUniform->addToStateSet(m_switch->getOrCreateStateSet()); m_texureType.setValue(TEXTURE_TYPE_POWER_OF_TWO); } setTextureCoordinates(0.0, 0.0, 1.0, 1.0); return true; } bool OsgScreenSpaceQuadRepresentation::setTexture(std::shared_ptr osgTexture) { m_rectangleTextureUniform->set(osgTexture); if (m_texureType.hasValue() && m_texureType.getValue() == TEXTURE_TYPE_POWER_OF_TWO) { SURGSIM_ASSERT(!isInitialized()) << "Cannot change the type of texture once the quad has been initialized."; m_textureUniform->removeFromStateSet(m_switch->getOrCreateStateSet()); } else { m_rectangleTextureUniform->addToStateSet(m_switch->getOrCreateStateSet()); m_texureType.setValue(TEXTURE_TYPE_RECTANGLE); } int width, height; osgTexture->getSize(&width, &height); setTextureCoordinates(0.0, 0.0, static_cast(width), static_cast(height)); return true; } void OsgScreenSpaceQuadRepresentation::setTextureCoordinates(float left, float bottom, float right, float top) { osg::Vec2Array* tcoords = new osg::Vec2Array(4); (*tcoords)[0].set(left, top); (*tcoords)[1].set(left, bottom); (*tcoords)[2].set(right, bottom); (*tcoords)[3].set(right, top); m_geometry->setTexCoordArray(0, tcoords); } void OsgScreenSpaceQuadRepresentation::setLocation(double x, double y) { SurgSim::Math::RigidTransform3d transform = SurgSim::Math::makeRigidTransform(SurgSim::Math::Quaterniond::Identity(), SurgSim::Math::Vector3d(x, y, 0)); setLocalPose(transform); } void OsgScreenSpaceQuadRepresentation::getLocation(double* x, double* y) { SURGSIM_ASSERT(x != nullptr && y != nullptr) << "Cannot use a nullptr as an output parameter."; SurgSim::Math::Vector3d position = getLocalPose().translation(); *x = position.x(); *y = position.y(); } void OsgScreenSpaceQuadRepresentation::setTransparent(bool value) { if (value) { m_geode->getOrCreateStateSet()->setRenderingHint(osg::StateSet::TRANSPARENT_BIN); } else { m_geode->getOrCreateStateSet()->setRenderingHint(osg::StateSet::DEFAULT_BIN); } } bool OsgScreenSpaceQuadRepresentation::isTransparent() { return osg::StateSet::TRANSPARENT_BIN == m_geode->getOrCreateStateSet()->getRenderingHint(); } void OsgScreenSpaceQuadRepresentation::doUpdate(double dt) { m_transform->setAttitude(osg::Quat(0.0, 0.0, 0.0, 1.0)); } bool OsgScreenSpaceQuadRepresentation::doInitialize() { bool result = true; // if the material was preassigned, don't create a default one if (getMaterial() == nullptr && m_texureType.hasValue()) { result = false; std::shared_ptr material; switch (m_texureType.getValue()) { case TEXTURE_TYPE_POWER_OF_TWO: material = buildMaterial("Shaders/unlit_texture.vert", "Shaders/unlit_texture.frag"); break; case TEXTURE_TYPE_RECTANGLE: material = buildMaterial("Shaders/unlit_texture.vert", "Shaders/unlit_texture_rectangle.frag"); break; default: break; } if (material != nullptr) { setMaterial(material); result = true; } } return result; } }; // Graphics }; // SurgSim opensurgsim-0.7.0/SurgSim/Graphics/OsgScreenSpaceQuadRepresentation.h000066400000000000000000000132471277777236100260270ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_OSGSCREENSPACEQUADREPRESENTATION_H #define SURGSIM_GRAPHICS_OSGSCREENSPACEQUADREPRESENTATION_H #include "SurgSim/DataStructures/OptionalValue.h" #include "SurgSim/Graphics/OsgRepresentation.h" #include "SurgSim/Graphics/OsgUniform.h" #include "SurgSim/Graphics/Representation.h" #include "SurgSim/Graphics/ScreenSpaceQuadRepresentation.h" #include #include #if defined(_MSC_VER) #pragma warning(push) #pragma warning(disable:4250) #endif namespace osg { class Projection; class Geode; class Geometry; } namespace SurgSim { namespace Graphics { class UniformBase; class Texture; class OsgTexture2d; class OsgTextureRectangle; /// Implements the ScreenSpaceQuadRepresentation, provides the uniform 'texture' for the texture that /// it carries. class OsgScreenSpaceQuadRepresentation : public OsgRepresentation, public ScreenSpaceQuadRepresentation { public: /// Constructor explicit OsgScreenSpaceQuadRepresentation(const std::string& name); ~OsgScreenSpaceQuadRepresentation(); /// Sets the location in screen space. /// \param x,y The x and y coordinates. virtual void setLocation(double x, double y); /// Gets the location in screen space. /// \param [out] x,y If non-null the x and y coordinates. Throws exception otherwise. virtual void getLocation(double* x, double* y); /// Sets the size for the quad in screen coordinates. /// \param width The width of the quad in screen coordinates. /// \param height The height of the quad in screen coordinates. void setSize(double width, double height) override; /// Gets the size of the quad. /// \param [out] width If non-null, the width. Throws exception otherwise. /// \param [out] height If non-null, the height. Throws exception otherwise. void getSize(double* width, double* height) const override; /// Sets a Texture for this quad, this should replace a current texture, this is a convenience function and /// this will use the uniform name "texture" for the uniform in this operation. This can be accomplished /// from the outside as well by using the material. /// \param texture The texture to be set on the quad. /// \return true if it succeeds, false if it fails. bool setTexture(std::shared_ptr texture) override; /// Sets a Texture2d for this quad, this should replace a current texture, this is a convenience function and /// this will use the uniform name "texture" for the uniform in this operation. This can be accomplished /// from the outside as well by using the material. /// \param texture The texture to be set on the quad. /// \return true if it succeeds, false if it fails. bool setTexture(std::shared_ptr texture); /// Sets a rectangular texture for this quad, this should replace a current texture, /// this is a convenience function and will use the uniform name "texture" for the uniform in this operation. /// \throws SurgSim::Framework::AssertionFailure if the type of the texture is changed during runtime. /// \param texture The texture to be set on the quad. /// \return true if it succeeds, false if it fails. bool setTexture(std::shared_ptr texture); /// Sets whether or not the alpha component of the texture should be used for transparancy blending. /// \param value true will render this last, allowing alpha-based blending to work. void setTransparent(bool value); /// Gets whether or not the alpha component of the texture should be used for transparancy blending. /// \return true if this will render last, allowing alpha-based blending to work. bool isTransparent(); protected: void doUpdate(double dt) override; bool doInitialize() override; private: /// Local geode to contain geometry osg::ref_ptr m_geode; /// Local geometry pointer osg::ref_ptr m_geometry; /// Projection matrix, needs to be updated when the view is changed osg::ref_ptr m_projection; /// Size of the quad osg::Vec3 m_scale; ///@{ /// Cached view extensions int m_displayWidth; int m_displayHeight; ///@} /// Sets texture coordinates for the quad. /// \param left, bottom, right, top The extents for the texture coordinates for the corners of the quad. void setTextureCoordinates(float left, float bottom, float right, float top); /// Replace a uniform in the material, will create the material if necessary /// \param name The name of the uniform to replace. /// \param newUniform The new uniform. /// \return true if it succeeds, false if it fails. bool replaceUniform(const std::string& name, std::shared_ptr newUniform); /// Uniform to carry the power of two texture, "texture" std::shared_ptr>> m_textureUniform; /// Uniform to carry the rectangle texture "texture" std::shared_ptr>> m_rectangleTextureUniform; /// Indicate which type of texture is currently being used SurgSim::DataStructures::OptionalValue m_texureType; }; }; // Graphics }; // SurgSim #if defined(_MSC_VER) #pragma warning(pop) #endif #endif opensurgsim-0.7.0/SurgSim/Graphics/OsgSkeletonRepresentation.cpp000066400000000000000000000310021277777236100251250ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Graphics/OsgSkeletonRepresentation.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "SurgSim/Framework/ApplicationData.h" #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Framework/ObjectFactory.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Graphics/OsgModel.h" #include "SurgSim/Graphics/OsgRigidTransformConversions.h" #include "SurgSim/Graphics/OsgProgram.h" /// Local data structure to store the bones and their references to the transforms. struct SurgSim::Graphics::BoneData { osg::ref_ptr osgBone; osg::ref_ptr osgRotation; osg::ref_ptr osgTranslation; SurgSim::Math::RigidTransform3d neutralPose; SurgSim::Math::RigidTransform3d pose; BoneData() : osgBone(nullptr), osgRotation(nullptr), osgTranslation(nullptr), neutralPose(SurgSim::Math::RigidTransform3d::Identity()), pose(SurgSim::Math::RigidTransform3d::Identity()) { } }; namespace { /// Visitor to collect information about the tree that we are using, collect all the /// osgAnimation::Bone nodes in it and add stacked transform elements to them so /// we can manipulate them, also switches the skinning to Hardware class BoneBuilder : public osg::NodeVisitor { public: /// Constructor /// \param hardwareShader The shader which does the skinning. /// \param bones The data structure to store the found bones BoneBuilder(osg::Shader* hardwareShader, std::shared_ptr> bones) : NodeVisitor(NodeVisitor::TRAVERSE_ALL_CHILDREN), m_shader(hardwareShader), m_bones(bones) { } /// Traverse the given tree and collect the bone data in them. /// Also setup for hardware skinning, if a hardware shader is provided. /// \param node The root node of the skeleton tree that needs to be traversed. virtual void apply(osg::Node& node) override // NOLINT { // Look for the transformation root .. if (m_rootTransform == nullptr) { m_rootTransform = dynamic_cast(&node); } // Parse the bone data. osgAnimation::Bone* bone = dynamic_cast(&node); if (bone != nullptr) { auto newBone = m_bones->find(bone->getName()); if (newBone == m_bones->end()) { newBone = m_bones->emplace(std::make_pair(bone->getName(), SurgSim::Graphics::BoneData())).first; } else { if (newBone->second.osgBone != nullptr) { SURGSIM_ASSERT(m_bones->find(bone->getName()) == m_bones->end()) << "There already exists a bone with name, " << bone->getName() << ", in this skeleton. Cannot create a duplicate."; } } newBone->second.osgBone = bone; newBone->second.osgRotation = new osgAnimation::StackedQuaternionElement("OssRotation"); newBone->second.osgRotation->setQuaternion(osg::Quat()); newBone->second.osgTranslation = new osgAnimation::StackedTranslateElement("OssTranslation"); osgAnimation::UpdateMatrixTransform* callback = dynamic_cast(bone->getUpdateCallback()); if (callback == nullptr) { bone->setDefaultUpdateCallback(); callback = dynamic_cast(bone->getUpdateCallback()); } SURGSIM_ASSERT(callback != nullptr) << "Could neither find nor create the appropriate BoneUpdate callback"; // Push these transformations onto the stack so we can manipulate them callback->getStackedTransforms().push_back(newBone->second.osgRotation); callback->getStackedTransforms().push_back(newBone->second.osgTranslation); } // Setup for hardware skinning. if (m_shader != nullptr) { osg::Geode* meshGeode = dynamic_cast(&node); if (nullptr != meshGeode) { osgAnimation::RigTransformHardware* rigTransform = new osgAnimation::RigTransformHardware(); osg::Shader* shader = new osg::Shader(*m_shader); rigTransform->setShader(shader); for (size_t i = 0; i < meshGeode->getNumDrawables(); ++i) { auto rigGeometry = dynamic_cast(meshGeode->getDrawable(i)); if (nullptr != rigGeometry) { rigGeometry->setRigTransformImplementation(rigTransform); } } } } traverse(node); } /// \return The root node of the skeleton on which the transform is set. osg::ref_ptr getRootTransform() { return m_rootTransform; } private: /// The root bone of the skeleton where the global transform is set. osg::ref_ptr m_rootTransform; /// The hardware skinning shader. osg::ref_ptr m_shader; /// The bone data from the skeleton. std::shared_ptr> m_bones; }; }; namespace SurgSim { namespace Graphics { SURGSIM_REGISTER(SurgSim::Framework::Component, SurgSim::Graphics::OsgSkeletonRepresentation, OsgSkeletonRepresentation); OsgSkeletonRepresentation::OsgSkeletonRepresentation(const std::string& name) : Representation(name), OsgRepresentation(name), SkeletonRepresentation(name), m_logger(SurgSim::Framework::Logger::getLogger("Graphics/OsgSkeletonRepresentation")), m_bones(std::make_shared>()) { SURGSIM_ADD_SERIALIZABLE_PROPERTY(OsgSkeletonRepresentation, std::string, SkinningShaderFileName, getSkinningShaderFileName, setSkinningShaderFileName); } void OsgSkeletonRepresentation::loadModel(const std::string& fileName) { SURGSIM_ASSERT(!isInitialized()) << "Cannot load model after OsgSkeletonRepresentation had been initialized."; auto model = std::make_shared(); model->load(fileName); setModel(model); } void OsgSkeletonRepresentation::setModel(std::shared_ptr model) { SURGSIM_ASSERT(!isInitialized()) << "Cannot set model after OsgSkeletonRepresentation had been initialized."; auto osgModel = std::dynamic_pointer_cast(model); SURGSIM_ASSERT(model == nullptr || osgModel != nullptr) << "OsgSkeletonRepresentation expects an OsgModel."; m_model = osgModel; } std::shared_ptr OsgSkeletonRepresentation::getModel() const { return m_model; } void OsgSkeletonRepresentation::setSkinningShaderFileName(const std::string& fileName) { m_skinningShaderFileName = fileName; } std::string OsgSkeletonRepresentation::getSkinningShaderFileName() const { return m_skinningShaderFileName; } void OsgSkeletonRepresentation::setBonePose(const std::string& name, const SurgSim::Math::RigidTransform3d& pose) { boost::unique_lock lock(m_mutex); auto found = m_bones->find(name); if (found != m_bones->end()) { found->second.pose = pose; } else if (isInitialized()) { SURGSIM_FAILURE() << "Bone with name " << name << " is not present in mesh."; } else { auto newBone = m_bones->emplace(std::make_pair(name, BoneData())).first; newBone->second.pose = pose; } } SurgSim::Math::RigidTransform3d OsgSkeletonRepresentation::getBonePose(const std::string& name) const { SurgSim::Math::RigidTransform3d pose = SurgSim::Math::RigidTransform3d::Identity(); boost::shared_lock lock(m_mutex); auto found = m_bones->find(name); if (found != m_bones->end()) { pose = found->second.pose; } else if (isInitialized()) { SURGSIM_FAILURE() << "Bone with name " << name << " is not present in mesh."; } return std::move(pose); } void OsgSkeletonRepresentation::setNeutralBonePose(const std::string& name, const SurgSim::Math::RigidTransform3d& pose) { boost::unique_lock lock(m_mutex); auto found = m_bones->find(name); if (found != m_bones->end()) { found->second.neutralPose = pose; } else if (isInitialized()) { SURGSIM_FAILURE() << "Bone with name " << name << " is not present in mesh."; } else { auto newBone = m_bones->emplace(std::make_pair(name, BoneData())).first; newBone->second.neutralPose = pose; } } SurgSim::Math::RigidTransform3d OsgSkeletonRepresentation::getNeutralBonePose(const std::string& name) const { SurgSim::Math::RigidTransform3d pose = SurgSim::Math::RigidTransform3d::Identity(); boost::shared_lock lock(m_mutex); auto found = m_bones->find(name); if (found != m_bones->end()) { pose = found->second.neutralPose; } else if (isInitialized()) { SURGSIM_FAILURE() << "Bone with name " << name << " is not present in mesh."; } return std::move(pose); } void OsgSkeletonRepresentation::setNeutralBonePoses(const std::map& poses) { for (auto& pose : poses) { setNeutralBonePose(pose.first, pose.second); } } std::map OsgSkeletonRepresentation::getNeutralBonePoses() const { std::map neutralBonePoses; boost::shared_lock lock(m_mutex); for (auto& bone : *m_bones) { neutralBonePoses[bone.first] = bone.second.neutralPose; } return std::move(neutralBonePoses); } void OsgSkeletonRepresentation::doUpdate(double dt) { { boost::shared_lock lock(m_mutex); for (auto& bone : *m_bones) { std::pair pose = toOsg(bone.second.pose * bone.second.neutralPose); bone.second.osgRotation->setQuaternion(pose.first); bone.second.osgTranslation->setTranslate(pose.second); } } // Update the position of the rest of the bones. m_base->accept(*m_updateVisitor); ++m_frameCount; m_updateVisitor->setTraversalNumber(m_frameCount); } bool OsgSkeletonRepresentation::doInitialize() { std::string shaderFilename; if (m_skinningShaderFileName.empty()) { SURGSIM_LOG_SEVERE(m_logger) << getName() << ": Skinning shader file not set."; return false; } getRuntime()->getApplicationData()->tryFindFile(m_skinningShaderFileName, &shaderFilename); if (shaderFilename.empty()) { SURGSIM_LOG_SEVERE(m_logger) << getName() << ": Skinning shader file (" << m_skinningShaderFileName << ") not found."; return false; } m_skinningShader = new osg::Shader(osg::Shader::VERTEX); if (!m_skinningShader->loadShaderSourceFromFile(shaderFilename)) { SURGSIM_LOG_SEVERE(m_logger) << getName() << ": Error loading shader (" << shaderFilename << ")."; return false; } if (m_model == nullptr) { SURGSIM_LOG_SEVERE(m_logger) << getName() << ": Model is not set."; return false; } m_skeleton = dynamic_cast(m_model->getOsgNode().get()); if (m_skeleton == nullptr) { SURGSIM_LOG_SEVERE(m_logger) << getName() << ": Model does not have a valid osgNode."; return false; } if (!setupBones()) { SURGSIM_LOG_SEVERE(m_logger) << getName() << ": Could not find any bones in model."; return false; } // Setup the transform updater for the skeleton. m_updateVisitor = new osgUtil::UpdateVisitor(); m_frameCount = 0; m_updateVisitor->setTraversalNumber(m_frameCount); m_base->accept(*m_updateVisitor); // Add the bone skeleton as a child to m_transform m_transform->addChild(m_base.get()); return true; } bool OsgSkeletonRepresentation::setupBones() { boost::unique_lock lock(m_mutex); BoneBuilder builder(m_skinningShader, m_bones); builder.traverse(*m_skeleton.get()); m_base = builder.getRootTransform(); for (auto bone = m_bones->begin(); bone != m_bones->end();) { if (bone->second.osgBone == nullptr) { SURGSIM_FAILURE() << "Bone with name " << bone->first << " is not present in mesh."; bone = m_bones->erase(bone); } else { ++bone; } } return (m_bones->size() != 0); } }; // Graphics }; // SurgSim opensurgsim-0.7.0/SurgSim/Graphics/OsgSkeletonRepresentation.h000066400000000000000000000076541277777236100246120ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_OSGSKELETONREPRESENTATION_H #define SURGSIM_GRAPHICS_OSGSKELETONREPRESENTATION_H #include #include #include #include #include #include #include "SurgSim/Graphics/OsgRepresentation.h" #include "SurgSim/Graphics/SkeletonRepresentation.h" #if defined(_MSC_VER) #pragma warning(push) #pragma warning(disable:4250) #endif namespace osg { class Node; class Shader; }; namespace SurgSim { namespace Graphics { struct BoneData; class OsgModel; /// Skeleton representation is used to move a mesh based on the movements of /// pre-selected control points (bones). class OsgSkeletonRepresentation : public OsgRepresentation, public SkeletonRepresentation { public: /// Constructor. /// \param name The name of the representation. explicit OsgSkeletonRepresentation(const std::string& name); SURGSIM_CLASSNAME(SurgSim::Graphics::OsgSkeletonRepresentation); void loadModel(const std::string& fileName) override; void setModel(std::shared_ptr model) override; std::shared_ptr getModel() const override; /// Set the file containing the skinning shader. /// \param fileName The file containing the skinning shader. void setSkinningShaderFileName(const std::string& fileName); /// \return The file containing the skinning shader. std::string getSkinningShaderFileName() const; void setBonePose(const std::string& name, const SurgSim::Math::RigidTransform3d& pose) override; SurgSim::Math::RigidTransform3d getBonePose(const std::string& name) const override; void setNeutralBonePose(const std::string& name, const SurgSim::Math::RigidTransform3d& pose) override; SurgSim::Math::RigidTransform3d getNeutralBonePose(const std::string& name) const override; protected: void setNeutralBonePoses(const std::map& poses) override; std::map getNeutralBonePoses() const override; void doUpdate(double dt) override; bool doInitialize() override; private: /// Setup the bones with the model and skinning shader bool setupBones(); /// The logger for this class. std::shared_ptr m_logger; /// The model containing the bone and mesh information. std::shared_ptr m_model; /// The named map of the bones in this skeleton. std::shared_ptr> m_bones; /// Mutex to access m_bones safely. mutable boost::shared_mutex m_mutex; /// The skeleton which is read from the mesh file. osg::ref_ptr m_skeleton; /// The file containing the skinning shader. std::string m_skinningShaderFileName; /// The hardware skinning shader. osg::ref_ptr m_skinningShader; /// Tree updater which updates the position of the bones. osg::ref_ptr m_updateVisitor; /// Parameter to keep track of the skeleton's frame count. Set to the UpdateVisitor. size_t m_frameCount; /// The root node of the skeleton tree. osg::ref_ptr m_root; /// The first MatrixTransform node osg::ref_ptr m_base; }; }; // namespace Graphics }; // namespace SurgSim #if defined(_MSC_VER) #pragma warning(pop) #endif #endif // SURGSIM_GRAPHICS_OSGSKELETONREPRESENTATION_H opensurgsim-0.7.0/SurgSim/Graphics/OsgSphereRepresentation.cpp000066400000000000000000000036551277777236100246040ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Graphics/OsgSphereRepresentation.h" #include "SurgSim/Graphics/OsgMaterial.h" #include "SurgSim/Graphics/OsgRigidTransformConversions.h" #include "SurgSim/Graphics/OsgUnitSphere.h" #include #include #include namespace SurgSim { namespace Graphics { SURGSIM_REGISTER(SurgSim::Framework::Component, SurgSim::Graphics::OsgSphereRepresentation, OsgSphereRepresentation); OsgSphereRepresentation::OsgSphereRepresentation(const std::string& name) : Representation(name), OsgRepresentation(name), SphereRepresentation(name), m_sharedUnitSphere(getSharedUnitSphere()) { m_transform->addChild(m_sharedUnitSphere->getNode()); } void OsgSphereRepresentation::setRadius(double radius) { m_transform->setScale(osg::Vec3d(radius, radius, radius)); } double OsgSphereRepresentation::getRadius() const { SURGSIM_ASSERT(m_transform->getScale().x() == m_transform->getScale().y() && m_transform->getScale().x() == m_transform->getScale().z()) << "Sphere should be scaled equally in all directions!"; return m_transform->getScale().x(); } std::shared_ptr OsgSphereRepresentation::getSharedUnitSphere() { static SurgSim::Framework::SharedInstance shared; return shared.get(); } }; // Graphics }; // SurgSimopensurgsim-0.7.0/SurgSim/Graphics/OsgSphereRepresentation.h000066400000000000000000000042241277777236100242420ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_OSGSPHEREREPRESENTATION_H #define SURGSIM_GRAPHICS_OSGSPHEREREPRESENTATION_H #include "SurgSim/Graphics/SphereRepresentation.h" #include "SurgSim/Graphics/OsgRepresentation.h" #include "SurgSim/Framework/SharedInstance.h" #include "SurgSim/Math/RigidTransform.h" #include #include #if defined(_MSC_VER) #pragma warning(push) #pragma warning(disable:4250) #endif namespace SurgSim { namespace Graphics { class OsgUnitSphere; SURGSIM_STATIC_REGISTRATION(OsgSphereRepresentation); /// OSG implementation of a graphics sphere representation. class OsgSphereRepresentation : public OsgRepresentation, public SphereRepresentation { public: /// Constructor /// \param name Name of the representation explicit OsgSphereRepresentation(const std::string& name); SURGSIM_CLASSNAME(SurgSim::Graphics::OsgSphereRepresentation); /// Sets the radius of the sphere /// \param radius Radius of the sphere virtual void setRadius(double radius); /// Returns the radius of the sphere /// \return Radius of the sphere virtual double getRadius() const; private: /// Shared unit sphere, so that the geometry can be instanced rather than having multiple copies. std::shared_ptr m_sharedUnitSphere; /// Returns the shared unit sphere static std::shared_ptr getSharedUnitSphere(); }; }; // namespace Graphics }; // namespace SurgSim #if defined(_MSC_VER) #pragma warning(pop) #endif #endif // SURGSIM_GRAPHICS_OSGSPHEREREPRESENTATION_H opensurgsim-0.7.0/SurgSim/Graphics/OsgTextRepresentation.cpp000066400000000000000000000172761277777236100243060ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Graphics/OsgTextRepresentation.h" #include #include #include #include #include "SurgSim/Framework/Log.h" #include "SurgSim/Graphics/OsgConversions.h" #include "SurgSim/Graphics/OsgFont.h" #include "SurgSim/Graphics/OsgMaterial.h" #include "SurgSim/Graphics/OsgUniform.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Vector.h" using SurgSim::Math::makeRigidTransform; using SurgSim::Math::Quaterniond; using SurgSim::Math::Vector3d; namespace SurgSim { namespace Graphics { SURGSIM_REGISTER(SurgSim::Framework::Component, SurgSim::Graphics::OsgTextRepresentation, OsgTextRepresentation); OsgTextRepresentation::OsgTextRepresentation(const std::string& name) : Representation(name), OsgRepresentation(name), TextRepresentation(name), m_geode(new osg::Geode), m_textNode(new osgText::Text), m_needUpdate(true) { m_textNode->setDataVariance(osg::Object::DYNAMIC); m_textNode->setUseDisplayList(false); m_characterSize = m_textNode->getCharacterHeight(); m_geode->addDrawable(m_textNode); m_transform->addChild(m_geode); m_transform->setCullingActive(false); // Try to find default font, if this fails OSG will fall back to its own default, only a warning warranted auto font = std::make_shared(); try { font->load("Fonts/Vera.ttf"); } catch (std::exception e) { font = nullptr; SURGSIM_LOG_WARNING(SurgSim::Framework::Logger::getLogger("Graphics")) << "Could not set default font Fonts/Vera.ttf"; } m_font = font; setUseScreenSpace(true); } OsgTextRepresentation::~OsgTextRepresentation() { } void OsgTextRepresentation::setLocation(double x, double y) { setLocalPose(makeRigidTransform(Quaterniond::Identity(), Vector3d(x, y, 0.0))); } void OsgTextRepresentation::getLocation(double* x, double* y) const { SURGSIM_ASSERT(x != nullptr && y != nullptr) << "Cannot use a nullptr as an output parameter."; Vector3d position = getLocalPose().translation(); *x = position.x(); *y = position.y(); } void OsgTextRepresentation::setText(const std::string& text) { boost::mutex::scoped_lock lock(m_parameterMutex); m_text = text; m_needUpdate = true; } std::string OsgTextRepresentation::getText() const { return m_text; } void OsgTextRepresentation::doUpdate(double dt) { { boost::mutex::scoped_lock lock(m_parameterMutex); if (m_needUpdate) { // Osg will catch which ones have been updated, no need for more fine grained control. // Each of these may trigger an operation that rebuilds the internal structure of the text drawable // which may cause problems with the render m_textNode->setFont(m_font->getOsgFont()); m_textNode->setText(m_text); m_textNode->setCharacterSize(m_characterSize); m_textNode->setMaximumWidth(m_optionalWidth.hasValue() ? m_optionalWidth.getValue() : 0.0); m_needUpdate = false; } } if (isUsingScreenSpace()) { m_transform->setAttitude(osg::Quat(0.0, 0.0, 0.0, 1.0)); } } bool OsgTextRepresentation::doInitialize() { bool result = true; // if the material was preassigned, don't create a default one if (getMaterial() == nullptr) { result = false; auto material = buildMaterial("Shaders/unlit_texture.vert", "Shaders/unlit_text.frag"); if (material != nullptr) { m_textNode->getOrCreateStateSet()->addUniform(new osg::Uniform("texture", 0)); setMaterial(material); result = true; } } return result; } void OsgTextRepresentation::loadFont(const std::string& fileName) { auto newFont = std::make_shared(); newFont->load(fileName); setFont(newFont); } void OsgTextRepresentation::setFont(std::shared_ptr font) { SURGSIM_ASSERT(! isInitialized()) << "Can't set font after text has been initialized."; SURGSIM_ASSERT(font != nullptr) << "Can't use nullptr font."; auto osgFont = std::dynamic_pointer_cast(font); SURGSIM_ASSERT(osgFont != nullptr) << "Font has to be OsgFont, instead it was " << font->getClassName(); { boost::mutex::scoped_lock lock(m_parameterMutex); m_font = osgFont; m_needUpdate = true; } } std::shared_ptr OsgTextRepresentation::getFont() const { return m_font; } void OsgTextRepresentation::setOptionalMaximumWidth(SurgSim::DataStructures::OptionalValue maximum) { boost::mutex::scoped_lock lock(m_parameterMutex); m_optionalWidth = maximum; m_needUpdate = true; } SurgSim::DataStructures::OptionalValue OsgTextRepresentation::getOptionalMaximumWidth() { return m_optionalWidth; } void OsgTextRepresentation::setDrawBackground(bool value) { int drawMode = osgText::TextBase::TEXT; if (value) { drawMode |= osgText::TextBase::FILLEDBOUNDINGBOX; } m_textNode->setDrawMode(drawMode); } bool OsgTextRepresentation::isDrawingBackground() const { return (m_textNode->getDrawMode() & osgText::TextBase::FILLEDBOUNDINGBOX) != 0; } void OsgTextRepresentation::setBackgroundColor(Math::Vector4d color) { m_textNode->setBoundingBoxColor(toOsg(color)); } Math::Vector4d OsgTextRepresentation::getBackgroundColor() { Math::Vector4d result = fromOsg(m_textNode->getBoundingBoxColor()).cast(); return result; } void OsgTextRepresentation::setBackgroundMargin(double margin) { m_textNode->setBoundingBoxMargin(static_cast(margin)); } double OsgTextRepresentation::getBackgroundMargin() const { return m_textNode->getBoundingBoxMargin(); } void OsgTextRepresentation::setUseScreenSpace(bool value) { if (value == true) { removeGroupReference(Representation::DefaultGroupName); addGroupReference(Representation::DefaultHudGroupName); m_transform->setReferenceFrame(osg::Transform::ABSOLUTE_RF); m_textNode->setCharacterSizeMode(osgText::TextBase::SCREEN_COORDS); } else { removeGroupReference(Representation::DefaultHudGroupName); addGroupReference(Representation::DefaultGroupName); m_transform->setReferenceFrame(osg::Transform::RELATIVE_RF); m_textNode->setCharacterSizeMode(osgText::TextBase::OBJECT_COORDS); } } bool OsgTextRepresentation::isUsingScreenSpace() const { auto references = getGroupReferences(); auto found = std::find(references.begin(), references.end(), Representation::DefaultHudGroupName); return (found != references.end()); } void OsgTextRepresentation::setMaximumWidth(double width) { boost::mutex::scoped_lock lock(m_parameterMutex); if (width > 0.0) { m_optionalWidth.setValue(width); } else { m_optionalWidth.invalidate(); } m_needUpdate = true; } double OsgTextRepresentation::getMaximumWidth() { return m_optionalWidth.hasValue() ? m_optionalWidth.getValue() : 0.0; } void OsgTextRepresentation::setFontSize(double size) { boost::mutex::scoped_lock lock(m_parameterMutex); m_characterSize = size; m_needUpdate = true; } double OsgTextRepresentation::getFontSize() const { return m_characterSize; } void OsgTextRepresentation::setColor(SurgSim::Math::Vector4d color) { m_textNode->setColor(toOsg(color)); } SurgSim::Math::Vector4d OsgTextRepresentation::getColor() const { SurgSim::Math::Vector4d result = fromOsg(m_textNode->getColor()).cast(); return result; } }; // Graphics }; // SurgSim opensurgsim-0.7.0/SurgSim/Graphics/OsgTextRepresentation.h000066400000000000000000000073421277777236100237440ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_OSGTEXTREPRESENTATION_H #define SURGSIM_GRAPHICS_OSGTEXTREPRESENTATION_H #include #include "SurgSim/Graphics/OsgRepresentation.h" #include "SurgSim/Graphics/TextRepresentation.h" #include "SurgSim/DataStructures/OptionalValue.h" #include #include #if defined(_MSC_VER) #pragma warning(push) #pragma warning(disable:4250) #endif namespace osg { class Geode; } namespace osgText { class Text; } namespace SurgSim { namespace Framework { class Asset; } namespace Graphics { class OsgFont; SURGSIM_STATIC_REGISTRATION(OsgTextRepresentation); /// Osg implementation of the TextRepresentation, to be used with OsgFont assets class OsgTextRepresentation : public OsgRepresentation, public TextRepresentation { public: /// Constructor /// \param name Name of this OsgInfo explicit OsgTextRepresentation(const std::string& name); /// Destructor ~OsgTextRepresentation(); friend class OsgTextRepresentationTests_MaximumWidth_Test; SURGSIM_CLASSNAME(SurgSim::Graphics::OsgTextRepresentation); void setLocation(double x, double y) override; void getLocation(double* x, double* y) const override; void setMaximumWidth(double width) override; double getMaximumWidth() override; void setText(const std::string& text) override; std::string getText() const override; void loadFont(const std::string& fileName) override; void setFont(std::shared_ptr font) override; std::shared_ptr getFont() const override; void setColor(SurgSim::Math::Vector4d color) override; SurgSim::Math::Vector4d getColor() const override; void setFontSize(double size) override; double getFontSize() const override; void setUseScreenSpace(bool value) override; bool isUsingScreenSpace() const override; enum Anchor { ANCHOR_TOP_LEFT, ANCHOR_CENTER }; void setAnchor(int anchor); int getAnchor() const; void setDrawBackground(bool value) override; bool isDrawingBackground() const override; void setBackgroundColor(Math::Vector4d color) override; Math::Vector4d getBackgroundColor() override; void setBackgroundMargin(double margin) override; double getBackgroundMargin() const override; protected: void doUpdate(double dt) override; bool doInitialize() override; void setOptionalMaximumWidth(SurgSim::DataStructures::OptionalValue maximum) override; SurgSim::DataStructures::OptionalValue getOptionalMaximumWidth() override; private: osg::ref_ptr m_geode; ///< node used to render text osg::ref_ptr m_textNode; ///< node for text display std::string m_text; ///< Text set by the user std::shared_ptr m_font; ///< font used for rendering SurgSim::DataStructures::OptionalValue m_optionalWidth; ///< information about the maximum width double m_characterSize; ///< the font height boost::mutex m_parameterMutex; ///< protect changes of parameters bool m_needUpdate; ///< indicate whether parameters need to be updated int m_anchor; SurgSim::Math::Vector3d m_offset; }; }; // Graphics }; // SurgSim #if defined(_MSC_VER) #pragma warning(pop) #endif #endifopensurgsim-0.7.0/SurgSim/Graphics/OsgTexture.cpp000066400000000000000000000021701277777236100220620ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Graphics/OsgTexture.h" #include using SurgSim::Graphics::OsgTexture; OsgTexture::OsgTexture(osg::Texture* texture) : m_texture(texture) { } bool OsgTexture::loadImage(const std::string& filePath) { osg::ref_ptr imageNode = osgDB::readImageFile(filePath); if (imageNode.valid()) { m_texture->setImage(0u, imageNode); return true; } else { return false; } } void OsgTexture::clearImage() { m_texture->setImage(0, nullptr); } opensurgsim-0.7.0/SurgSim/Graphics/OsgTexture.h000066400000000000000000000031561277777236100215340ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_OSGTEXTURE_H #define SURGSIM_GRAPHICS_OSGTEXTURE_H #include "SurgSim/Graphics/Texture.h" #include namespace SurgSim { namespace Graphics { /// Base class for OSG implementations of Graphics Textures. /// /// Wraps an osg::Texture. class OsgTexture : public virtual Texture { public: /// Loads an image into the texture from a file /// \param filePath Path to the image file /// \return True if the image is successfully loaded, otherwise false virtual bool loadImage(const std::string& filePath); /// Removes the image from the texture virtual void clearImage(); /// Returns the osg::Texture1D osg::ref_ptr getOsgTexture() const { return m_texture; } protected: /// Constructor /// \param texture OSG texture explicit OsgTexture(osg::Texture* texture); private: /// OSG texture osg::ref_ptr m_texture; }; }; // namespace Graphics }; // namespace SurgSim #endif // SURGSIM_GRAPHICS_OSGTEXTURE_H opensurgsim-0.7.0/SurgSim/Graphics/OsgTexture1d.cpp000066400000000000000000000021131277777236100223040ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Graphics/OsgTexture1d.h" using SurgSim::Graphics::OsgTexture1d; OsgTexture1d::OsgTexture1d() : OsgTexture(new osg::Texture1D()) { } void OsgTexture1d::setSize(int width) { getOsgTexture1d()->setTextureWidth(width); } void OsgTexture1d::getSize(int* width) const { *width = getOsgTexture1d()->getTextureWidth(); if (*width == 0 && getOsgTexture()->getNumImages() > 0) { *width = getOsgTexture()->getImage(0)->s(); } } opensurgsim-0.7.0/SurgSim/Graphics/OsgTexture1d.h000066400000000000000000000034141277777236100217560ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_OSGTEXTURE1D_H #define SURGSIM_GRAPHICS_OSGTEXTURE1D_H #include "SurgSim/Graphics/OsgTexture.h" #include "SurgSim/Graphics/Texture1d.h" #include #if defined(_MSC_VER) #pragma warning(push) #pragma warning(disable:4250) #endif namespace SurgSim { namespace Graphics { /// OSG implementation of a 1D Texture /// /// Wraps an osg::Texture1d class OsgTexture1d : public OsgTexture, public Texture1d { public: /// Constructor /// \post No image is loaded in the texture. OsgTexture1d(); /// Sets the size of the texture /// \param width Width of the texture /// \note Use this to setup a texture as a render target rather than loading from file. virtual void setSize(int width); /// Gets the size of the texture /// \return width Width of the texture virtual void getSize(int* width) const; /// Returns the osg::Texture1D osg::ref_ptr getOsgTexture1d() const { return static_cast(getOsgTexture().get()); } }; }; // namespace Graphics }; // namespace SurgSim #if defined(_MSC_VER) #pragma warning(pop) #endif #endif // SURGSIM_GRAPHICS_OSGTEXTURE1D_H opensurgsim-0.7.0/SurgSim/Graphics/OsgTexture2d.cpp000066400000000000000000000037151277777236100223160ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Graphics/OsgTexture2d.h" using SurgSim::Graphics::OsgTexture2d; OsgTexture2d::OsgTexture2d() : OsgTexture(new osg::Texture2D()) { } void OsgTexture2d::setSize(int width, int height) { getOsgTexture2d()->setTextureSize(width, height); } void OsgTexture2d::getSize(int* width, int* height) const { *width = getOsgTexture2d()->getTextureWidth(); if (*width == 0 && getOsgTexture()->getNumImages() > 0) { *width = getOsgTexture()->getImage(0)->s(); } *height = getOsgTexture2d()->getTextureHeight(); if (*height == 0 && getOsgTexture()->getNumImages() > 0) { *height = getOsgTexture()->getImage(0)->t(); } } template <> std::shared_ptr SurgSim::Framework::convert(boost::any val) { std::shared_ptr result; try { std::shared_ptr tex = boost::any_cast>(val); result = std::dynamic_pointer_cast(tex); } catch (boost::bad_any_cast&) { result = boost::any_cast>(val); } SURGSIM_ASSERT(result != nullptr) << "Conversion from the incoming type to OsgTexture2d failed, this probably means that the input value " << "was a texture but not an OsgTexture2d."; return result; } opensurgsim-0.7.0/SurgSim/Graphics/OsgTexture2d.h000066400000000000000000000043551277777236100217640ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_OSGTEXTURE2D_H #define SURGSIM_GRAPHICS_OSGTEXTURE2D_H #include "SurgSim/Graphics/OsgTexture.h" #include "SurgSim/Graphics/Texture2d.h" #include #include "SurgSim/Framework/Accessible.h" #include #include #if defined(_MSC_VER) #pragma warning(push) #pragma warning(disable:4250) #endif namespace SurgSim { namespace Graphics { /// OSG implementation of a 2D Texture /// /// Wraps an osg::Texture2d class OsgTexture2d : public OsgTexture, public Texture2d { public: /// Constructor /// \post No image is loaded in the texture. OsgTexture2d(); /// Sets the size of the texture /// \param width Width of the texture /// \param height Height of the texture /// \note Use this to setup a texture as a render target rather than loading from file. virtual void setSize(int width, int height); /// Gets the size of the texture /// \param[out] width Width of the texture /// \param[out] height Height of the texture virtual void getSize(int* width, int* height) const; /// Returns the osg::Texture2D osg::ref_ptr getOsgTexture2d() const { return static_cast(getOsgTexture().get()); } }; }; // namespace Graphics namespace Framework { /// Template specialization for the convert<> function used in accessible, this one can convert an incoming /// SurgSim::Graphics::Texture to an outgoing OsgTexture2d template <> std::shared_ptr convert(boost::any val); } }; // namespace SurgSim #if defined(_MSC_VER) #pragma warning(pop) #endif #endif // SURGSIM_GRAPHICS_OSGTEXTURE2D_H opensurgsim-0.7.0/SurgSim/Graphics/OsgTexture3d.cpp000066400000000000000000000067141277777236100223210ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Graphics/OsgTexture3d.h" #include "SurgSim/Framework/Assert.h" #include using SurgSim::Graphics::OsgTexture3d; OsgTexture3d::OsgTexture3d() : OsgTexture(new osg::Texture3D()) { } void OsgTexture3d::setSize(int width, int height, int depth) { getOsgTexture3d()->setTextureSize(width, height, depth); } void OsgTexture3d::getSize(int* width, int* height, int* depth) const { *width = getOsgTexture3d()->getTextureWidth(); if (*width == 0 && getOsgTexture()->getNumImages() > 0) { *width = getOsgTexture()->getImage(0)->s(); } *height = getOsgTexture3d()->getTextureHeight(); if (*height == 0 && getOsgTexture()->getNumImages() > 0) { *height = getOsgTexture()->getImage(0)->t(); } *depth = getOsgTexture3d()->getTextureDepth(); if (*depth == 0 && getOsgTexture()->getNumImages() > 0) { *depth = getOsgTexture()->getImage(0)->r(); } } bool OsgTexture3d::loadImageSlices(const std::vector& filePaths) { SURGSIM_ASSERT(! filePaths.empty()) << "No image file paths to load!"; std::vector> slices; slices.reserve(filePaths.size()); int width; int height; GLenum pixelFormat; GLenum dataType; /// Load first slice, all others should have same properties { osg::ref_ptr firstSlice = osgDB::readImageFile(filePaths.front()); if (! firstSlice.valid()) { return false; } slices.push_back(firstSlice); width = firstSlice->s(); height = firstSlice->t(); pixelFormat = firstSlice->getPixelFormat(); dataType = firstSlice->getDataType(); } /// Load the remaining slices for (auto it = filePaths.begin() + 1; it != filePaths.end(); ++it) { osg::ref_ptr slice = osgDB::readImageFile(*it); if (! slice.valid()) { return false; } SURGSIM_ASSERT(slice->s() == width) << "Slice has different width! File: " << *it << " Width: " << slice->s() << " Expected Width: " << width; SURGSIM_ASSERT(slice->t() == height) << "Slice has different height! File: " << *it << " Height: " << slice->s() << " Expected Height: " << height; SURGSIM_ASSERT(slice->getPixelFormat() == pixelFormat) << "Slice has different pixel format! File: " << *it << " Pixel Format: " << slice->getPixelFormat() << " Expected Pixel Format: " << pixelFormat; SURGSIM_ASSERT(slice->getDataType() == dataType) << "Slice has different data type! File: " << *it << " Data type: " << slice->getDataType() << " Expected Data Type: " << dataType; slices.push_back(slice); } /// Copy the slices into the 3D image, starting at depth 0 osg::ref_ptr image = new osg::Image(); image->allocateImage(width, height, slices.size(), pixelFormat, dataType); int depth = 0; for (auto it = slices.begin(); it != slices.end(); ++it) { image->copySubImage(0, 0, depth, it->get()); } getOsgTexture()->setImage(0u, image); return true; }opensurgsim-0.7.0/SurgSim/Graphics/OsgTexture3d.h000066400000000000000000000045021277777236100217570ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_OSGTEXTURE3D_H #define SURGSIM_GRAPHICS_OSGTEXTURE3D_H #include "SurgSim/Graphics/OsgTexture.h" #include "SurgSim/Graphics/Texture3d.h" #include #if defined(_MSC_VER) #pragma warning(push) #pragma warning(disable:4250) #endif namespace SurgSim { namespace Graphics { /// OSG implementation of a 3D Texture /// /// Wraps an osg::Texture3d class OsgTexture3d : public OsgTexture, public Texture3d { public: /// Constructor /// \post No image is loaded in the texture. OsgTexture3d(); /// Sets the size of the texture /// \param width Width of the texture /// \param height Height of the texture /// \param depth Depth of the texture /// \note Use this to setup a texture as a render target rather than loading from file. virtual void setSize(int width, int height, int depth); /// Gets the size of the texture /// \param[out] width Width of the texture /// \param[out] height Height of the texture /// \param[out] depth Depth of the texture virtual void getSize(int* width, int* height, int* depth) const; /// Loads images slices from files into the 3D texture /// \param filePaths Paths to the image files /// \return True if the image is successfully loaded, otherwise false /// \note The slices are stacked in the order provided to create the depth of the 3D texture. virtual bool loadImageSlices(const std::vector& filePaths); /// Returns the osg::Texture3D osg::ref_ptr getOsgTexture3d() const { return static_cast(getOsgTexture().get()); } }; }; // namespace Graphics }; // namespace SurgSim #if defined(_MSC_VER) #pragma warning(pop) #endif #endif // SURGSIM_GRAPHICS_OSGTEXTURE3D_H opensurgsim-0.7.0/SurgSim/Graphics/OsgTextureCubeMap.cpp000066400000000000000000000122641277777236100233240ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Graphics/OsgTextureCubeMap.h" #include using SurgSim::Graphics::OsgTextureCubeMap; OsgTextureCubeMap::OsgTextureCubeMap() : OsgTexture(new osg::TextureCubeMap()) { } void OsgTextureCubeMap::setSize(int width, int height) { getOsgTextureCubeMap()->setTextureSize(width, height); } void OsgTextureCubeMap::getSize(int* width, int* height) const { *width = getOsgTextureCubeMap()->getTextureWidth(); if (*width == 0 && getOsgTexture()->getNumImages() > 0) { *width = getOsgTexture()->getImage(0)->s(); } *height = getOsgTextureCubeMap()->getTextureHeight(); if (*height == 0 && getOsgTexture()->getNumImages() > 0) { *height = getOsgTexture()->getImage(0)->t(); } } bool OsgTextureCubeMap::loadImage(const std::string& filePath) { osg::ref_ptr imageNode = osgDB::readImageFile(filePath); if (! imageNode.valid()) { return false; } // Split up image to the six sides of the cube int width = imageNode->s() / 3; int height = imageNode->t() / 4; osg::ref_ptr negativeZ = copyImageBlock(*imageNode, width, 0, width, height); negativeZ->flipHorizontal(); osg::ref_ptr negativeY = copyImageBlock(*imageNode, width, height, width, height); negativeY->flipVertical(); osg::ref_ptr negativeX = copyImageBlock(*imageNode, 0, height * 2, width, height); negativeX->flipVertical(); osg::ref_ptr positiveZ = copyImageBlock(*imageNode, width, height * 2, width, height); positiveZ->flipVertical(); osg::ref_ptr positiveX = copyImageBlock(*imageNode, width * 2, height * 2, width, height); positiveX->flipVertical(); osg::ref_ptr positiveY = copyImageBlock(*imageNode, width, height * 3, width, height); positiveY->flipVertical(); getOsgTexture()->setImage(osg::TextureCubeMap::POSITIVE_X, positiveX); getOsgTexture()->setImage(osg::TextureCubeMap::NEGATIVE_X, negativeX); getOsgTexture()->setImage(osg::TextureCubeMap::POSITIVE_Y, positiveY); getOsgTexture()->setImage(osg::TextureCubeMap::NEGATIVE_Y, negativeY); getOsgTexture()->setImage(osg::TextureCubeMap::POSITIVE_Z, positiveZ); getOsgTexture()->setImage(osg::TextureCubeMap::NEGATIVE_Z, negativeZ); return true; } bool OsgTextureCubeMap::loadImageFaces(const std::string& negativeX, const std::string& positiveX, const std::string& negativeY, const std::string& positiveY, const std::string& negativeZ, const std::string& positiveZ) { osg::ref_ptr negativeXImage = osgDB::readImageFile(negativeX); osg::ref_ptr positiveXImage = osgDB::readImageFile(positiveX); osg::ref_ptr negativeYImage = osgDB::readImageFile(negativeY); osg::ref_ptr positiveYImage = osgDB::readImageFile(positiveY); osg::ref_ptr negativeZImage = osgDB::readImageFile(negativeZ); osg::ref_ptr positiveZImage = osgDB::readImageFile(positiveZ); if (negativeXImage.valid() && positiveXImage.valid() && negativeYImage.valid() && positiveYImage.valid() && negativeZImage.valid() && positiveZImage.valid()) { getOsgTexture()->setImage(osg::TextureCubeMap::NEGATIVE_X, negativeXImage); getOsgTexture()->setImage(osg::TextureCubeMap::POSITIVE_X, positiveXImage); getOsgTexture()->setImage(osg::TextureCubeMap::NEGATIVE_Y, negativeYImage); getOsgTexture()->setImage(osg::TextureCubeMap::POSITIVE_Y, positiveYImage); getOsgTexture()->setImage(osg::TextureCubeMap::NEGATIVE_Z, negativeZImage); getOsgTexture()->setImage(osg::TextureCubeMap::POSITIVE_Z, positiveZImage); return true; } else { return false; } } osg::ref_ptr OsgTextureCubeMap::copyImageBlock( const osg::Image& source, size_t startColumn, size_t startRow, size_t width, size_t height) { size_t pixelSize = source.getPixelSizeInBits() / 8; unsigned char* buffer = new unsigned char[(width * height) * pixelSize]; size_t index = 0; for (size_t row = startRow; row < startRow + height; ++row) { for (size_t column = startColumn; column < startColumn + width; ++column) { const unsigned char* pixel = source.data(column, row, 0); for (size_t p = 0; p < pixelSize; ++p) { buffer[index] = pixel[p]; index++; } } } osg::ref_ptr subImage = new osg::Image(); subImage->setImage(width, height, 1, source.getInternalTextureFormat(), source.getPixelFormat(), GL_UNSIGNED_BYTE, buffer, osg::Image::USE_NEW_DELETE, 1); return subImage; } osg::ref_ptr SurgSim::Graphics::OsgTextureCubeMap::getOsgTextureCubeMap() const { return static_cast(getOsgTexture().get()); } opensurgsim-0.7.0/SurgSim/Graphics/OsgTextureCubeMap.h000066400000000000000000000062031277777236100227650ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_OSGTEXTURECUBEMAP_H #define SURGSIM_GRAPHICS_OSGTEXTURECUBEMAP_H #include "SurgSim/Graphics/OsgTexture.h" #include "SurgSim/Graphics/TextureCubeMap.h" #include #if defined(_MSC_VER) #pragma warning(push) #pragma warning(disable:4250) #endif namespace SurgSim { namespace Graphics { /// OSG implementation of a Cube Map Texture /// /// Wraps an osg::TextureCubeMap class OsgTextureCubeMap : public OsgTexture, public TextureCubeMap { public: /// Constructor /// \post No image is loaded in the texture. OsgTextureCubeMap(); void setSize(int width, int height) override; void getSize(int* width, int* height) const override; /// Loads an image into the texture from a file /// \param filePath Path to the image file /// \return True if the image is successfully loaded, otherwise false /// \note /// The image should contain the cube map unwrapped such that each face is width/3 x height/4 and the corners /// for the faces are arranged as follows, with (0, 0) as the bottom-left corner and (width, height) as the /// top-right corner: /// (-Z): (width * 1/3, 0 ) to (width * 2/3, height * 1/4) /// (-Y): (width * 1/3, height * 1/4) to (width * 2/3, height * 1/2) /// (-X): (0, height * 1/2) to (width * 1/3, height * 3/4) /// (+Z): (width * 1/3, height * 1/2) to (width * 2/3, height * 3/4) /// (+X): (width * 2/3, height * 1/2) to (width, height * 3/4) /// (+Y): (width * 1/3, height * 3/4) to (width * 2/3, height ) bool loadImage(const std::string& filePath) override; bool loadImageFaces(const std::string& negativeX, const std::string& positiveX, const std::string& negativeY, const std::string& positiveY, const std::string& negativeZ, const std::string& positiveZ) override; /// Returns the osg::TextureCubeMap osg::ref_ptr getOsgTextureCubeMap() const; protected: /// Makes a copy of an image block /// \param source Source image to copy from /// \param startColumn First column of block in the source image /// \param startRow First row of block in the source image /// \param width Width of the block /// \param height Height of the block /// \return Copy of the image block osg::ref_ptr copyImageBlock(const osg::Image& source, size_t startColumn, size_t startRow, size_t width, size_t height); }; }; // namespace Graphics }; // namespace SurgSim #if defined(_MSC_VER) #pragma warning(pop) #endif #endif // SURGSIM_GRAPHICS_OSGTEXTURECUBEMAP_H opensurgsim-0.7.0/SurgSim/Graphics/OsgTextureRectangle.cpp000066400000000000000000000025221277777236100237100ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Graphics/OsgTextureRectangle.h" using SurgSim::Graphics::OsgTextureRectangle; OsgTextureRectangle::OsgTextureRectangle() : OsgTexture(new osg::TextureRectangle()) { } void OsgTextureRectangle::setSize(int width, int height) { getOsgTextureRectangle()->setTextureSize(width, height); } void OsgTextureRectangle::getSize(int* width, int* height) const { *width = getOsgTextureRectangle()->getTextureWidth(); if (*width == 0 && getOsgTexture()->getNumImages() > 0) { *width = getOsgTexture()->getImage(0)->s(); } *height = getOsgTextureRectangle()->getTextureHeight(); if (*height == 0 && getOsgTexture()->getNumImages() > 0) { *height = getOsgTexture()->getImage(0)->t(); } } opensurgsim-0.7.0/SurgSim/Graphics/OsgTextureRectangle.h000066400000000000000000000040431277777236100233550ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_OSGTEXTURERECTANGLE_H #define SURGSIM_GRAPHICS_OSGTEXTURERECTANGLE_H #include "SurgSim/Graphics/OsgTexture.h" #include "SurgSim/Graphics/TextureRectangle.h" #include #if defined(_MSC_VER) #pragma warning(push) #pragma warning(disable:4250) #endif namespace SurgSim { namespace Graphics { /// OSG implementation of a Rectangle Texture /// /// Wraps an osg::TextureRectangle /// /// \note Texel coordinates are used to access this texture. class OsgTextureRectangle : public OsgTexture, public TextureRectangle { public: /// Constructor /// \post No image is loaded in the texture. OsgTextureRectangle(); /// Sets the size of the texture /// \param width Width of the texture /// \param height Height of the texture /// \note Use this to setup a texture as a render target rather than loading from file. virtual void setSize(int width, int height); /// Gets the size of the texture /// \param[out] width Width of the texture /// \param[out] height Height of the texture virtual void getSize(int* width, int* height) const; /// Returns the osg::TextureRectangle osg::ref_ptr getOsgTextureRectangle() const { return static_cast(getOsgTexture().get()); } }; }; // namespace Graphics }; // namespace SurgSim #if defined(_MSC_VER) #pragma warning(pop) #endif #endif // SURGSIM_GRAPHICS_OSGTEXTURERECTANGLE_H opensurgsim-0.7.0/SurgSim/Graphics/OsgTextureUniform-inl.h000066400000000000000000000104451277777236100236530ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_OSGTEXTUREUNIFORM_INL_H #define SURGSIM_GRAPHICS_OSGTEXTUREUNIFORM_INL_H #include #include "SurgSim/Framework/Assert.h" #include "SurgSim/Graphics/OsgTexture.h" #include "SurgSim/Graphics/OsgTexture1d.h" #include "SurgSim/Graphics/OsgTexture2d.h" #include "SurgSim/Graphics/OsgTexture3d.h" #include "SurgSim/Graphics/OsgTextureCubeMap.h" #include "SurgSim/Graphics/OsgTextureRectangle.h" #include "SurgSim/Graphics/OsgUniformTypes.h" namespace SurgSim { namespace Graphics { template OsgTextureUniform::OsgTextureUniform(const std::string& name) : UniformBase(), Uniform>(), OsgUniformBase(name), m_unit(-1), m_minimumTextureUnit(0) { SURGSIM_ADD_RW_PROPERTY(OsgTextureUniform, size_t, MinimumTextureUnit, getMinimumTextureUnit, setMinimumTextureUnit); osg::Uniform::Type osgUniformType = getOsgUniformType>(); SURGSIM_ASSERT(osgUniformType != osg::Uniform::UNDEFINED) << "Failed to get OSG uniform type!"; SURGSIM_ASSERT(m_uniform->setType(osgUniformType)) << "Failed to set OSG uniform type!"; m_uniform->setNumElements(1); } template void OsgTextureUniform::set(const std::shared_ptr& value) { m_texture = value; if (m_stateset != nullptr) { m_stateset->setTextureAttributeAndModes(m_unit, m_texture->getOsgTexture(), osg::StateAttribute::ON); } } template void OsgTextureUniform::set(const YAML::Node& value) { m_unit = value.as(); } template const std::shared_ptr& OsgTextureUniform::get() const { return m_texture; } template void OsgTextureUniform::addToStateSet(osg::StateSet* stateSet) { SURGSIM_ASSERT(m_stateset == nullptr) << "Unexpected addToStateSet for OsgTextureUniform " << getName() << "."; const osg::StateSet::TextureAttributeList& textures = stateSet->getTextureAttributeList(); // Grab the smallest unit that is equal or higher than m_minimumTextureUnit // and search through allocated units for free ones int availableUnit = m_minimumTextureUnit; if (textures.size() > m_minimumTextureUnit) { for (auto it = textures.begin() + m_minimumTextureUnit; it != textures.end(); ++it) { if (it->empty()) { break; } availableUnit++; } } m_unit = availableUnit; SURGSIM_ASSERT(m_texture != nullptr) << "Tried to add uniform " << getName() << " without a valid Texture"; if(m_texture->isPointSprite()) { osg::PointSprite* sprite = new osg::PointSprite(); stateSet->setTextureAttributeAndModes(m_unit, sprite, osg::StateAttribute::ON); stateSet->setMode(GL_VERTEX_PROGRAM_POINT_SIZE, osg::StateAttribute::ON); } stateSet->setTextureAttributeAndModes(m_unit, m_texture->getOsgTexture(), osg::StateAttribute::ON); SURGSIM_ASSERT(m_uniform->set(static_cast(m_unit))) << "Failed to set OSG texture uniform unit!" << " Uniform: " << getName() << " unit: " << m_unit; stateSet->addUniform(m_uniform); m_stateset = stateSet; } template void OsgTextureUniform::removeFromStateSet(osg::StateSet* stateSet) { SURGSIM_ASSERT(m_stateset != stateSet) << "Unexpected Remove for OsgTextureUniform"; stateSet->removeTextureAttribute(m_unit, m_texture->getOsgTexture()); stateSet->removeUniform(m_uniform); m_stateset = nullptr; } template void OsgTextureUniform::setMinimumTextureUnit(size_t unit) { SURGSIM_ASSERT(m_unit == -1) << "Can't set minimumTextureUnit after the unit has been assigned."; m_minimumTextureUnit = unit; } template size_t OsgTextureUniform::getMinimumTextureUnit() const { return m_minimumTextureUnit; } }; // namespace Graphics }; // namespace SurgSim #endif // SURGSIM_GRAPHICS_OSGTEXTUREUNIFORM_INL_H opensurgsim-0.7.0/SurgSim/Graphics/OsgTextureUniform.h000066400000000000000000000101741277777236100230720ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_OSGTEXTUREUNIFORM_H #define SURGSIM_GRAPHICS_OSGTEXTUREUNIFORM_H /// \note HS-2013-jul-07 This file is included by OsgUniform.h, it is not meant to be used on its own namespace SurgSim { namespace Graphics { /// OSG implementation of graphics uniform with a texture value /// \tparam T Texture type template class OsgTextureUniform : public Uniform>, public OsgUniformBase { public: /// Constructor /// \param name Name used in shader code to access this uniform explicit OsgTextureUniform(const std::string& name); /// This is the texture unit from where the search for a free texture unit will start /// \param unit lowest texture unit to use, default is 0 void setMinimumTextureUnit(size_t unit); /// \return the value of the lowest texture unit to use for this uniform size_t getMinimumTextureUnit() const; /// Sets the value of the uniform /// \note using this directly might make the state of the uniform incosistent with /// the texture that was used to create this uniform virtual void set(const std::shared_ptr& value); virtual void set(const YAML::Node& node); /// Returns the value of the uniform virtual const std::shared_ptr& get() const; /// Adds this uniform to the OSG state set /// \param stateSet OSG state set virtual void addToStateSet(osg::StateSet* stateSet); /// Removes this uniform from the OSG state set /// \param stateSet OSG state set virtual void removeFromStateSet(osg::StateSet* stateSet); private: /// Texture std::shared_ptr m_texture; osg::ref_ptr m_stateset; /// Texture unit ptrdiff_t m_unit; /// The smallest unit to be used size_t m_minimumTextureUnit; }; /// Specialization of OsgUniform for OsgTexture1d template <> class OsgUniform> : public OsgTextureUniform { public: /// Constructor /// \param name Name used in shader code to access this uniform explicit OsgUniform(const std::string& name) : OsgTextureUniform(name) { } }; /// Specialization of OsgUniform for OsgTexture2d template <> class OsgUniform> : public OsgTextureUniform { public: /// Constructor /// \param name Name used in shader code to access this uniform explicit OsgUniform(const std::string& name) : OsgTextureUniform(name) { } }; /// Specialization of OsgUniform for OsgTexture3d template <> class OsgUniform> : public OsgTextureUniform { public: /// Constructor /// \param name Name used in shader code to access this uniform explicit OsgUniform(const std::string& name) : OsgTextureUniform(name) { } }; /// Specialization of OsgUniform for OsgTextureCubeMap template <> class OsgUniform> : public OsgTextureUniform { public: /// Constructor /// \param name Name used in shader code to access this uniform explicit OsgUniform(const std::string& name) : OsgTextureUniform(name) { } }; /// Specialization of OsgUniform for OsgTextureRectangle template <> class OsgUniform> : public OsgTextureUniform { public: /// Constructor /// \param name Name used in shader code to access this uniform explicit OsgUniform(const std::string& name) : OsgTextureUniform(name) { } }; }; // namespace Graphics }; // namespace SurgSim #endif // SURGSIM_GRAPHICS_OSGTEXTUREUNIFORM_H opensurgsim-0.7.0/SurgSim/Graphics/OsgTrackballZoomManipulator.cpp000066400000000000000000000124211277777236100254020ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Graphics/OsgTrackballZoomManipulator.h" #include /// Calculate the key code value of Ctrl-{character}, given the uppercase character. /// If a key is pressed while holding Ctrl, OSG "helpfully" gives you the key code of the control character /// (i.e. ^A == 1) instead of the key itself ('A' == 65). /// To cope with this, you can use CONTROL_CHAR_FROM_UPPERCASE('A') which is easier to read than /// strange character ('\001') or integral (1) constants. #define CONTROL_CHAR_FROM_UPPERCASE(uppercaseCharacter) ((uppercaseCharacter) - ('A' - 1)) namespace SurgSim { namespace Graphics { OsgTrackballZoomManipulator::OsgTrackballZoomManipulator() : osgGA::TrackballManipulator(), m_minZoomFactor(0.05), m_maxZoomFactor(1.0), m_minZoomAmount(0.01), m_maxZoomAmount(1.0), m_zoomFactor(1.0), m_zoomFactorScale(1.0) { } void OsgTrackballZoomManipulator::setMinZoomFactor(double factor) { m_minZoomFactor = factor; } double OsgTrackballZoomManipulator::getMinZoomFactor() const { return m_minZoomFactor; } void OsgTrackballZoomManipulator::setMaxZoomFactor(double factor) { m_maxZoomFactor = factor; } double OsgTrackballZoomManipulator::getMaxZoomFactor() const { return m_maxZoomFactor; } void OsgTrackballZoomManipulator::setMinZoomAmount(double amount) { m_minZoomAmount = amount; } double OsgTrackballZoomManipulator::getMinZoomAmount() const { return m_minZoomAmount; } void OsgTrackballZoomManipulator::setMaxZoomAmount(double amount) { m_maxZoomAmount = amount; } double OsgTrackballZoomManipulator::getMaxZoomAmount() const { return m_maxZoomAmount; } void OsgTrackballZoomManipulator::setZoomFactor(double factor) { m_zoomFactor = factor; } double OsgTrackballZoomManipulator::getZoomFactor() const { return m_zoomFactor; } void OsgTrackballZoomManipulator::setZoomFactorScale(double factor) { m_zoomFactorScale = factor; } double OsgTrackballZoomManipulator::getZoomFactorScale() const { return m_zoomFactorScale; } void OsgTrackballZoomManipulator::zoom(double zoomPercent) { double difference = m_zoomFactor - m_minZoomFactor; if (difference < m_minZoomAmount) { difference = m_minZoomAmount; } else if (difference > m_maxZoomAmount) { difference = m_maxZoomAmount; } m_zoomFactor += difference * zoomPercent; if (m_zoomFactor < m_minZoomFactor) { m_zoomFactor = m_minZoomFactor; } else if (m_zoomFactor > m_maxZoomFactor) { m_zoomFactor = m_maxZoomFactor; } } void OsgTrackballZoomManipulator::makeUpright() { osg::Matrixd rotationMatrix(getRotation()); // Remove any roll from the camera pose. osg::Vec3d backwards(rotationMatrix(2, 0), rotationMatrix(2, 1), rotationMatrix(2, 2)); osg::Vec3d right = osg::Vec3d(0.0, 1.0, 0.0) ^ backwards; if (right.length2() < 1e-12) { right.set(0.0, 0.0, 1.0); // arbitrary... } right.normalize(); osg::Vec3d up = backwards ^ right; // shouldn't need to be normalized for (int c = 0; c < 3; ++c) { rotationMatrix(0, c) = right[c]; } for (int c = 0; c < 3; ++c) { rotationMatrix(1, c) = up[c]; } setRotation(rotationMatrix.getRotate()); } bool OsgTrackballZoomManipulator::handle( const osgGA::GUIEventAdapter& eventAdapter, osgGA::GUIActionAdapter& actionAdapter) { unsigned int mask = eventAdapter.getModKeyMask(); switch (eventAdapter.getEventType()) { case (osgGA::GUIEventAdapter::KEYDOWN): { int key = eventAdapter.getKey(); switch (key) { case 'u': case 'U': case CONTROL_CHAR_FROM_UPPERCASE('U'): { // ctrl-U makes the camera upright, so that the up axis points up if ((mask & osgGA::GUIEventAdapter::MODKEY_CTRL) && !(mask & osgGA::GUIEventAdapter::MODKEY_ALT) && !(mask & osgGA::GUIEventAdapter::MODKEY_SHIFT)) { makeUpright(); } } break; } } default: break; } return osgGA::TrackballManipulator::handle(eventAdapter, actionAdapter); } bool OsgTrackballZoomManipulator::handleMouseWheel( const osgGA::GUIEventAdapter& eventAdapter, osgGA::GUIActionAdapter& actionAdapter) { osgGA::GUIEventAdapter::ScrollingMotion scrollingMotion = eventAdapter.getScrollingMotion(); switch (scrollingMotion) { // Scroll up to zoom in case osgGA::GUIEventAdapter::SCROLL_UP: { zoom(-_wheelZoomFactor); actionAdapter.requestRedraw(); actionAdapter.requestContinuousUpdate(false); return true; } // Scroll down to zoom out case osgGA::GUIEventAdapter::SCROLL_DOWN: { zoom(_wheelZoomFactor); actionAdapter.requestRedraw(); actionAdapter.requestContinuousUpdate(false); return true; } default: return false; } } void OsgTrackballZoomManipulator::updateCamera(osg::Camera& camera) { return; } }; // namespace Graphics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Graphics/OsgTrackballZoomManipulator.h000066400000000000000000000107401277777236100250510ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_OSGTRACKBALLZOOMMANIPULATOR_H #define SURGSIM_GRAPHICS_OSGTRACKBALLZOOMMANIPULATOR_H #include namespace SurgSim { namespace Graphics { /// Trackball manipulator that uses the mouse wheel to control zoom amount. /// The output matrices are view matrices and do not include the zoom. /// To apply the zoom, get the value from getZoomFactor() and multiply /// it by some base FOV to calculate the FOV for the current zoom level. class OsgTrackballZoomManipulator : public osgGA::TrackballManipulator { public: /// Initializes the zoom parameters to default values OsgTrackballZoomManipulator(); /// Sets the minimum zoom factor (zoomed out) /// \param factor Minimum zoom factor virtual void setMinZoomFactor(double factor); /// Gets the minimum zoom factor /// \return Minimum zoom factor double getMinZoomFactor() const; /// Sets the maximum zoom factor (zoomed out) /// \param factor Maximum zoom factor virtual void setMaxZoomFactor(double factor); /// Gets the maximum zoom factor /// \return Maximum zoom factor double getMaxZoomFactor() const; /// Sets the minimum amount to change the zoom factor in one step /// \param amount Minimum zoom amount virtual void setMinZoomAmount(double amount); /// Gets the minimum amount to change the zoom factor in one step /// \return Minimum zoom factor double getMinZoomAmount() const;// /// Sets the maximum amount to change the zoom factor in one step /// \param amount Maximum zoom amount virtual void setMaxZoomAmount(double amount); /// Gets the maximum amount to change the zoom factor in one step /// \return Maximum zoom factor double getMaxZoomAmount() const; /// Sets the current zoom factor /// \param factor Zoom factor virtual void setZoomFactor(double factor); /// Gets the current zoom factor /// \return Zoom factor double getZoomFactor() const; /// Sets the scale applied to the zoom factor before it is applied to the FOV /// \param factor Scale applied to the zoom factor virtual void setZoomFactorScale(double factor); /// Gets the current zoom factor /// \return Scale applied to the zoom factor double getZoomFactorScale() const; /// Zoom by a percent of the difference between the current zoom amount and minimum zoom factor /// \param zoomPercent Percent to zoom by: positive values zoom out, negative values zoom in virtual void zoom(double zoomPercent); /// Removes roll of the camera, so that the top of the view is towards the Y direction. virtual void makeUpright(); protected: /// Minimum zoom factor value (zoomed in) double m_minZoomFactor; /// Maximum zoom factor value (zoomed out) double m_maxZoomFactor; /// Minimum amount to change the zoom factor in one step /// This minimum prevents zooming by infinitely smaller amounts. double m_minZoomAmount; /// Maximum amount to change the zoom factor in one step double m_maxZoomAmount; /// Current zoom factor /// Larger values are zoomed out, smaller values are zoomed in. double m_zoomFactor; /// Scaling factor applied to the zoom factor before it is applied to the FOV double m_zoomFactorScale; /// Handle keyboard CTRL-U events to make the view upright /// \param eventAdapter Event adapter /// \param actionAdapter Action adapter /// \return true if the event was handled, false otherwise virtual bool handle(const osgGA::GUIEventAdapter& eventAdapter, osgGA::GUIActionAdapter& actionAdapter); //NOLINT /// Handle mouse wheel scrolling to zoom in or out /// \param eventAdapter Event adapter /// \param actionAdapter Action adapter /// \return true if the mouse wheel was handled, false otherwise virtual bool handleMouseWheel(const osgGA::GUIEventAdapter& eventAdapter, osgGA::GUIActionAdapter& actionAdapter); //NOLINT void updateCamera(osg::Camera& camera) override; }; }; // namespace Graphics }; // namespace SurgSim #endif opensurgsim-0.7.0/SurgSim/Graphics/OsgUniform-inl.h000066400000000000000000000075321277777236100222750ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_OSGUNIFORM_INL_H #define SURGSIM_GRAPHICS_OSGUNIFORM_INL_H #include "SurgSim/Framework/Assert.h" #include "SurgSim/Math/MathConvert.h" #include "SurgSim/Graphics/OsgConversions.h" #include "SurgSim/Graphics/OsgUniformTypes.h" namespace SurgSim { namespace Graphics { /// Default type conversion to OSG /// \tparam T Type /// \note /// The input value is just returned. This allows this conversion method to be used with scalar types such as int and /// float, which are the same in Eigen and OSG. template const T& toOsg(const T& value) { return value; } template OsgUniform::OsgUniform(const std::string& name) : UniformBase(), Uniform(), OsgUniformBase(name) { osg::Uniform::Type osgUniformType = getOsgUniformType(); SURGSIM_ASSERT(osgUniformType != osg::Uniform::UNDEFINED) << "Failed to get OSG uniform type!"; SURGSIM_ASSERT(m_uniform->setType(osgUniformType)) << "Failed to set OSG uniform type!"; m_uniform->setNumElements(1); } template void OsgUniform::set(const T& value) { SURGSIM_ASSERT(m_uniform->set(toOsg(value))) << "Failed to set OSG uniform value!" << " Uniform: " << getName() << " value: " << value; m_value = value; } template void OsgUniform::set(const YAML::Node& node) { set(node.as()); } template const T& OsgUniform::get() const { return m_value; } template OsgUniform>::OsgUniform(const std::string& name, size_t numElements) : UniformBase(), Uniform>(), OsgUniformBase(name) { osg::Uniform::Type osgUniformType = getOsgUniformType(); SURGSIM_ASSERT(osgUniformType != osg::Uniform::UNDEFINED) << "Failed to get OSG uniform type!"; SURGSIM_ASSERT(m_uniform->setType(osgUniformType)) << "Failed to set OSG uniform type!"; m_value.resize(numElements); m_uniform->setNumElements(numElements); } template size_t OsgUniform>::getNumElements() const { return m_uniform->getNumElements(); } template void OsgUniform>::setElement(size_t index, const T& value) { SURGSIM_ASSERT(m_uniform->setElement(index, toOsg(value))) << "Failed to set OSG uniform value!" << " Uniform: " << getName() << " index: " << index << " value: " << value; m_value[index] = value; } template void OsgUniform>::set(const std::vector& value) { SURGSIM_ASSERT(value.size() == m_uniform->getNumElements()) << "Number of elements (" << value.size() << ") must match uniform's number of elements (" << m_uniform->getNumElements() << ")! Uniform: " << getName(); for (size_t i = 0; i < value.size(); ++i) { setElement(i, value[i]); } } template void OsgUniform>::set(const YAML::Node& node) { SURGSIM_ASSERT(node.IsSequence()) << "Yaml setter called on vector uniform with non-sequence yaml node."; set(node.as>()); } template typename std::vector::const_reference OsgUniform>::getElement(size_t index) const { return m_value[index]; } template const std::vector& OsgUniform>::get() const { return m_value; } }; // namespace Graphics }; // namespace SurgSim #endif // SURGSIM_GRAPHICS_OSGUNIFORM_INL_H opensurgsim-0.7.0/SurgSim/Graphics/OsgUniform.h000066400000000000000000000073141277777236100215130ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_OSGUNIFORM_H #define SURGSIM_GRAPHICS_OSGUNIFORM_H #include "SurgSim/Graphics/OsgUniformBase.h" #include "SurgSim/Graphics/Uniform.h" namespace YAML { class Node; } namespace SurgSim { namespace Graphics { /// OSG implementation of graphics uniform with a value of type T. /// \tparam Value the value type of the uniform template class OsgUniform : public Uniform, public OsgUniformBase { public: /// Constructor /// \param name Name used in shader code to access this uniform explicit OsgUniform(const std::string& name); /// Sets the value of the uniform /// \param value the value for this uniform virtual void set(const T& value); /// Sets the value of the uniform from a YAML Node doing the correct conversion /// \param node the node that contains the value for this uniform virtual void set(const YAML::Node& node); /// \return the value of the uniform virtual const T& get() const; private: /// Value of the uniform T m_value; }; /// Specialization of OsgUniform for vectors of values. /// \tparam Value type stored in the vector template class OsgUniform> : public Uniform>, public OsgUniformBase { public: /// Constructor /// \param name Name used in shader code to access this uniform /// \param numElements Number of elements OsgUniform(const std::string& name, size_t numElements); /// \return the number of elements in the uniform virtual size_t getNumElements() const; /// Sets the value of one of the uniform's elements /// \param index Index of the element /// \param value Value to set virtual void setElement(size_t index, const T& value); /// Sets the value of all of the uniform's elements /// \param value Array of values virtual void set(const std::vector& value); /// Sets the value of the uniform from a YAML Node doing the correct conversion /// \param node that contains the values for this uniform (needs to be sequence type) /// \throws if the node is not of sequence type virtual void set(const YAML::Node& node); /// Gets the value of one of the uniform's elements /// \param index Index of the element /// \return Value of the element virtual typename std::vector::const_reference getElement(size_t index) const; /// Gets the value of all of the uniform's elements /// \return Vector of values virtual const std::vector& get() const; private: /// Vector containing the values of the uniform's elements std::vector m_value; }; }; // namespace Graphics }; // namespace SurgSim #include "SurgSim/Graphics/OsgUniform-inl.h" /// \note HS-2013-jul-30 If OsgUniform.h is included by itself without OsgTextureUniform.h we have a /// state where the specializations that are implemented in OsgTextureUniform.h will not be found /// by the compiler, the code will compile but not work correctly, if you remove this include /// make sure that OsgUniform.h AND OsgTextureUniform.h are included at the same time. #include "SurgSim/Graphics/OsgTextureUniform.h" #include "SurgSim/Graphics/OsgTextureUniform-inl.h" #endif // SURGSIM_GRAPHICS_OSGUNIFORM_H opensurgsim-0.7.0/SurgSim/Graphics/OsgUniformBase.cpp000066400000000000000000000023231277777236100226340ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Graphics/OsgUniformBase.h" #include "SurgSim/Framework/Log.h" using SurgSim::Graphics::OsgUniformBase; OsgUniformBase::OsgUniformBase(const std::string& name) : UniformBase(), m_uniform(new osg::Uniform()) { m_uniform->setName(name); } void OsgUniformBase::addToStateSet(osg::StateSet* stateSet) { SURGSIM_LOG_DEBUG(Framework::Logger::getLogger("Graphics/OsgUniformBase")) << "Base Add To Texture StateSet called"; stateSet->addUniform(m_uniform); } void OsgUniformBase::removeFromStateSet(osg::StateSet* stateSet) { stateSet->removeUniform(m_uniform); } opensurgsim-0.7.0/SurgSim/Graphics/OsgUniformBase.h000066400000000000000000000043171277777236100223060ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_OSGUNIFORMBASE_H #define SURGSIM_GRAPHICS_OSGUNIFORMBASE_H #include "SurgSim/Graphics/Uniform.h" #include #include namespace YAML { class Node; } namespace SurgSim { namespace Graphics { /// Base OSG implementation of graphics uniforms. /// /// Wraps an osg::Uniform. /// \note /// SurgSim::Graphics::OsgUniform is templated on the type of value, so this base class allows a pointer to any type of /// OSG Uniform. class OsgUniformBase : public virtual UniformBase { public: /// Returns the name used in shader code to access this uniform const std::string& getName() const { return m_uniform->getName(); } /// Sets the value of the uniform from a YAML Node, the uniform is responsible for converting the node to its own /// value /// \param node YAML node for setting the uniform value virtual void set(const YAML::Node& node) = 0; /// Adds this uniform to the OSG state set /// \param stateSet OSG state set virtual void addToStateSet(osg::StateSet* stateSet); /// Removes this uniform from the OSG state set /// \param stateSet OSG state set virtual void removeFromStateSet(osg::StateSet* stateSet); /// Returns the OSG uniform node osg::ref_ptr getOsgUniform() const { return m_uniform; } protected: /// Constructor /// \param name Name used in shader code to access this uniform explicit OsgUniformBase(const std::string& name); /// OSG uniform node osg::ref_ptr m_uniform; }; }; // namespace Graphics }; // namespace SurgSim #endif // SURGSIM_GRAPHICS_OSGUNIFORMBASE_H opensurgsim-0.7.0/SurgSim/Graphics/OsgUniformFactory.cpp000066400000000000000000000045251277777236100233770ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Graphics/OsgUniformFactory.h" #include "SurgSim/Graphics/OsgTexture1d.h" #include "SurgSim/Graphics/OsgTexture2d.h" #include "SurgSim/Graphics/OsgTexture3d.h" #include "SurgSim/Graphics/OsgTextureCubeMap.h" #include "SurgSim/Graphics/OsgUniform.h" #include "SurgSim/Math/Vector.h" namespace SurgSim { namespace Graphics { OsgUniformFactory::OsgUniformFactory() { // Scalar Types registerClass>("bool"); registerClass>("uint"); registerClass>("int"); registerClass>("float"); registerClass>("double"); // Vector Types registerClass>("vec2"); registerClass>("vec3"); registerClass>("vec4"); registerClass>("dvec2"); registerClass>("dvec3"); registerClass>("dvec4"); // Matrix Types registerClass>("mat2"); registerClass>("mat3"); registerClass>("mat4"); registerClass>("dmat2"); registerClass>("dmat3"); registerClass>("dmat4"); // Sampler Types registerClass>("sampler1D"); registerClass>("sampler2D"); registerClass>("sampler3D"); registerClass>("samplerCube"); } OsgUniformFactory::~OsgUniformFactory() { } } } opensurgsim-0.7.0/SurgSim/Graphics/OsgUniformFactory.h000066400000000000000000000023411277777236100230360ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_OSGUNIFORMFACTORY_H #define SURGSIM_GRAPHICS_OSGUNIFORMFACTORY_H #include #include "SurgSim/Framework/ObjectFactory.h" #include "SurgSim/Graphics/UniformBase.h" namespace SurgSim { namespace Graphics { /// This class can create the appropriate OsgUniform from an OpenGl glsl type, use the appropriate name /// from glsl in the create() function to recieve the correctly typed uniform class OsgUniformFactory : public SurgSim::Framework::ObjectFactory1 { public: OsgUniformFactory(); virtual ~OsgUniformFactory(); }; } } #endif opensurgsim-0.7.0/SurgSim/Graphics/OsgUniformTypes.h000066400000000000000000000102001277777236100225240ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Functions to get the OSG uniform type enum for a given type #ifndef SURGSIM_GRAPHICS_OSGUNIFORMTYPES_H #define SURGSIM_GRAPHICS_OSGUNIFORMTYPES_H #include #include "SurgSim/Math/Matrix.h" #include "SurgSim/Math/Vector.h" #include namespace SurgSim { namespace Graphics { class OsgTexture1d; class OsgTexture2d; class OsgTexture3d; class OsgTextureCubeMap; class OsgTextureRectangle; /// Returns the OSG uniform type enum value for the template parameter type. /// This template function is specialized to match each type with an enum value. /// Any types for which the function is not specialized will return osg::Uniform::UNDEFINED. /// \tparam T Data type /// \return OSG uniform type enum value template inline osg::Uniform::Type getOsgUniformType() { return osg::Uniform::UNDEFINED; } template <> inline osg::Uniform::Type getOsgUniformType() { return osg::Uniform::FLOAT; } template <> inline osg::Uniform::Type getOsgUniformType() { return osg::Uniform::DOUBLE; } template <> inline osg::Uniform::Type getOsgUniformType() { return osg::Uniform::INT; } template <> inline osg::Uniform::Type getOsgUniformType() { return osg::Uniform::UNSIGNED_INT; } template <> inline osg::Uniform::Type getOsgUniformType() { return osg::Uniform::BOOL; } template <> inline osg::Uniform::Type getOsgUniformType() { return osg::Uniform::FLOAT_VEC2; } template <> inline osg::Uniform::Type getOsgUniformType() { return osg::Uniform::FLOAT_VEC3; } template <> inline osg::Uniform::Type getOsgUniformType() { return osg::Uniform::FLOAT_VEC4; } template <> inline osg::Uniform::Type getOsgUniformType() { return osg::Uniform::DOUBLE_VEC2; } template <> inline osg::Uniform::Type getOsgUniformType() { return osg::Uniform::DOUBLE_VEC3; } template <> inline osg::Uniform::Type getOsgUniformType() { return osg::Uniform::DOUBLE_VEC4; } template <> inline osg::Uniform::Type getOsgUniformType() { return osg::Uniform::FLOAT_MAT2; } template <> inline osg::Uniform::Type getOsgUniformType() { return osg::Uniform::FLOAT_MAT3; } template <> inline osg::Uniform::Type getOsgUniformType() { return osg::Uniform::FLOAT_MAT4; } template <> inline osg::Uniform::Type getOsgUniformType() { return osg::Uniform::DOUBLE_MAT2; } template <> inline osg::Uniform::Type getOsgUniformType() { return osg::Uniform::DOUBLE_MAT3; } template <> inline osg::Uniform::Type getOsgUniformType() { return osg::Uniform::DOUBLE_MAT4; } template <> inline osg::Uniform::Type getOsgUniformType>() { return osg::Uniform::SAMPLER_1D; } template <> inline osg::Uniform::Type getOsgUniformType>() { return osg::Uniform::SAMPLER_2D; } template <> inline osg::Uniform::Type getOsgUniformType>() { return osg::Uniform::SAMPLER_3D; } template <> inline osg::Uniform::Type getOsgUniformType>() { return osg::Uniform::SAMPLER_CUBE; } template <> inline osg::Uniform::Type getOsgUniformType>() { return osg::Uniform::SAMPLER_2D_RECT; } }; // namespace Graphics }; // namespace SurgSim #endif // SURGSIM_GRAPHICS_OSGUNIFORMTYPES_Hopensurgsim-0.7.0/SurgSim/Graphics/OsgUnitAxes.cpp000066400000000000000000000043461277777236100221710ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Graphics/OsgUnitAxes.h" namespace SurgSim { namespace Graphics { OsgUnitAxes::OsgUnitAxes() { m_geode = new osg::Geode(); const int numVertices = 6; osg::Geometry* geometry = new osg::Geometry(); osg::Vec3Array* vertices = new osg::Vec3Array(numVertices); (*vertices)[0] = osg::Vec3f(0.0f, 0.0f, 0.0f); (*vertices)[1] = osg::Vec3f(0.0f, 0.0f, 0.0f); (*vertices)[2] = osg::Vec3f(0.0f, 0.0f, 0.0f); (*vertices)[3] = osg::Vec3f(1.0f, 0.0f, 0.0f); (*vertices)[4] = osg::Vec3f(0.0f, 1.0f, 0.0f); (*vertices)[5] = osg::Vec3f(0.0f, 0.0f, 1.0f); geometry->setVertexArray(vertices); osg::Vec4Array* colors = new osg::Vec4Array(numVertices); (*colors)[0] = osg::Vec4f(0.8f, 0.0f, 0.0f, 1.0f); (*colors)[1] = osg::Vec4f(0.0f, 0.8f, 0.0f, 1.0f); (*colors)[2] = osg::Vec4f(0.0f, 0.0f, 0.8f, 1.0f); (*colors)[3] = osg::Vec4f(0.8f, 0.0f, 0.0f, 1.0f); (*colors)[4] = osg::Vec4f(0.0f, 0.8f, 0.0f, 1.0f); (*colors)[5] = osg::Vec4f(0.0f, 0.0f, 0.8f, 1.0f); geometry->setColorArray(colors, osg::Array::BIND_PER_VERTEX); // Copy triangles from mesh unsigned int lines[] = {0,3,1,4,2,5}; geometry->addPrimitiveSet(new osg::DrawElementsUInt(osg::PrimitiveSet::LINES,6,lines)); m_geode->addDrawable(geometry); osg::StateSet* state = m_geode->getOrCreateStateSet(); state->setAttribute(new osg::LineWidth(2.0)); // These lines should never be lit, always render full color state->setMode(GL_LIGHTING, osg::StateAttribute::OFF | osg::StateAttribute::PROTECTED); } OsgUnitAxes::~OsgUnitAxes() { } osg::ref_ptr OsgUnitAxes::getNode() { return m_geode; } }; // Graphics }; // SurgSim opensurgsim-0.7.0/SurgSim/Graphics/OsgUnitAxes.h000066400000000000000000000021531277777236100216300ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_OSGUNITAXES_H #define SURGSIM_GRAPHICS_OSGUNITAXES_H #include #include #include #include #include namespace SurgSim { namespace Graphics { class OsgUnitAxes { public: /// Constructor OsgUnitAxes(); ~OsgUnitAxes(); /// Gets the node. /// \return The node. osg::ref_ptr getNode(); private: osg::ref_ptr m_geode; }; }; // Graphics }; // SurgSim #endifopensurgsim-0.7.0/SurgSim/Graphics/OsgUnitBox.h000066400000000000000000000033041277777236100214570ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_OSGUNITBOX_H #define SURGSIM_GRAPHICS_OSGUNITBOX_H #include #include #include namespace SurgSim { namespace Graphics { /// OSG unit box geode to be used as a primitive shape /// The box is located at (0, 0, 0) and has a size of 1 on all three axes. /// Add the box geode to a transform node to position and scale it. class OsgUnitBox { public: /// Constructor OsgUnitBox() : m_geode(new osg::Geode()) { osg::ref_ptr unitBox = new osg::Box(osg::Vec3(0.0, 0.0, 0.0), 1.0); osg::ref_ptr drawable = new osg::ShapeDrawable(unitBox); m_geode->addDrawable(drawable); m_geode->getOrCreateStateSet()->setMode(GL_NORMALIZE, osg::StateAttribute::ON); } /// Returns the root OSG node for the plane to be inserted into the scene-graph osg::ref_ptr getNode() const { return m_geode; } private: /// Root OSG node of the box osg::ref_ptr m_geode; }; }; // namespace Graphics }; // namespace SurgSim #endif // SURGSIM_GRAPHICS_OSGUNITBOX_H opensurgsim-0.7.0/SurgSim/Graphics/OsgUnitCylinder.h000066400000000000000000000034121277777236100225000ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_OSGUNITCYLINDER_H #define SURGSIM_GRAPHICS_OSGUNITCYLINDER_H #include #include #include namespace SurgSim { namespace Graphics { /// OSG unit cylinder geode to be used as a primitive shape /// The cylinder is located at (0, 0, 0) and has a radius of 1 and height of 1. /// Add the cylinder geode to a transform node to position and scale it. class OsgUnitCylinder { public: /// Constructor OsgUnitCylinder() : m_geode(new osg::Geode()) { osg::ref_ptr unitCylinder = new osg::Cylinder(osg::Vec3(0.0, 0.0, 0.0), 1.0, 1.0); osg::ref_ptr drawable = new osg::ShapeDrawable(unitCylinder); m_geode->addDrawable(drawable); m_geode->getOrCreateStateSet()->setMode(GL_NORMALIZE, osg::StateAttribute::ON); } /// Returns the root OSG node for the plane to be inserted into the scene-graph osg::ref_ptr getNode() const { return m_geode; } private: /// Root OSG node of the cylinder osg::ref_ptr m_geode; }; }; // namespace Graphics }; // namespace SurgSim #endif // SURGSIM_GRAPHICS_OSGUNITCYLINDER_H opensurgsim-0.7.0/SurgSim/Graphics/OsgUnitSphere.h000066400000000000000000000040461277777236100221610ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_OSGUNITSPHERE_H #define SURGSIM_GRAPHICS_OSGUNITSPHERE_H #include #include #include #include #include namespace SurgSim { namespace Graphics { /// OSG unit sphere geode to be used as a primitive shape /// The sphere is located at (0, 0, 0) and has a radius of 1. /// Add the sphere geode to a transform node to position and scale it. class OsgUnitSphere { public: /// Constructor OsgUnitSphere() : m_transform(new osg::PositionAttitudeTransform()) { osg::ref_ptr unitSphere = new osg::Sphere(osg::Vec3(0.0, 0.0, 0.0), 1.0); osg::ref_ptr drawable = new osg::ShapeDrawable(unitSphere); osg::ref_ptr geode = new osg::Geode(); geode->addDrawable(drawable); geode->getOrCreateStateSet()->setMode(GL_NORMALIZE, osg::StateAttribute::ON); m_transform->addChild(geode); osg::Quat rotation; rotation.makeRotate(osg::Vec3d(0.0, 0.0, 1.0), osg::Vec3d(0.0, 1.0, 0.0)); m_transform->setAttitude(rotation); } /// Returns the root OSG node for the plane to be inserted into the scene-graph osg::ref_ptr getNode() const { return m_transform; } private: /// Root OSG node of the sphere osg::ref_ptr m_transform; }; }; // namespace Graphics }; // namespace SurgSim #endif // SURGSIM_GRAPHICS_OSGUNITSPHERE_H opensurgsim-0.7.0/SurgSim/Graphics/OsgVectorConversions.h000066400000000000000000000064301277777236100235650ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Conversions to and from OSG vector types #ifndef SURGSIM_GRAPHICS_OSGVECTORCONVERSIONS_H #define SURGSIM_GRAPHICS_OSGVECTORCONVERSIONS_H #include "SurgSim/Math/Vector.h" #include #include #include #include #include #include namespace SurgSim { namespace Graphics { /// Convert 2D vector of floats to OSG inline osg::Vec2f toOsg(const SurgSim::Math::Vector2f& vector) { osg::Vec2f osgVector; Eigen::Map(osgVector.ptr()) = vector; return osgVector; } /// Convert from OSG to 2D vector of floats inline SurgSim::Math::Vector2f fromOsg(const osg::Vec2f& vector) { return SurgSim::Math::Vector2f(vector.ptr()); } /// Convert 2D vector of doubles to OSG inline osg::Vec2d toOsg(const SurgSim::Math::Vector2d& vector) { osg::Vec2d osgVector; Eigen::Map(osgVector.ptr()) = vector; return osgVector; } /// Convert from OSG to 2D vector of doubles inline SurgSim::Math::Vector2d fromOsg(const osg::Vec2d& vector) { return SurgSim::Math::Vector2d(vector.ptr()); } /// Convert 3D vector of floats to OSG inline osg::Vec3f toOsg(const SurgSim::Math::Vector3f& vector) { osg::Vec3f osgVector; Eigen::Map(osgVector.ptr()) = vector; return osgVector; } /// Convert from OSG to 3D vector of floats inline SurgSim::Math::Vector3f fromOsg(const osg::Vec3f& vector) { return SurgSim::Math::Vector3f(vector.ptr()); } /// Convert 3D vector of doubles to OSG inline osg::Vec3d toOsg(SurgSim::Math::Vector3d vector) { osg::Vec3d osgVector; Eigen::Map(osgVector.ptr()) = vector; return osgVector; } /// Convert from OSG to 3D vector of doubles inline SurgSim::Math::Vector3d fromOsg(const osg::Vec3d& vector) { return SurgSim::Math::Vector3d(vector.ptr()); } /// Convert 4D vector of floats to OSG inline osg::Vec4f toOsg(const SurgSim::Math::Vector4f& vector) { osg::Vec4f osgVector; Eigen::Map(osgVector.ptr()) = vector; return osgVector; } /// Convert from OSG to 4D vector of floats inline SurgSim::Math::Vector4f fromOsg(const osg::Vec4f& vector) { return SurgSim::Math::Vector4f(vector.ptr()); } /// Convert 4D vector of doubles to OSG inline osg::Vec4d toOsg(const SurgSim::Math::Vector4d& vector) { osg::Vec4d osgVector; Eigen::Map(osgVector.ptr()) = vector; return osgVector; } /// Convert from OSG to 4D vector of doubles inline SurgSim::Math::Vector4d fromOsg(const osg::Vec4d& vector) { return SurgSim::Math::Vector4d(vector.ptr()); } }; // namespace Graphics }; // namespace SurgSim #endif // SURGSIM_GRAPHICS_OSGVECTORCONVERSIONS_H opensurgsim-0.7.0/SurgSim/Graphics/OsgVectorFieldRepresentation.cpp000066400000000000000000000136621277777236100255630ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Graphics/OsgVectorFieldRepresentation.h" #include #include #include #include #include "SurgSim/Graphics/OsgConversions.h" namespace SurgSim { namespace Graphics { SURGSIM_REGISTER(SurgSim::Framework::Component, SurgSim::Graphics::OsgVectorFieldRepresentation, OsgVectorFieldRepresentation); using SurgSim::DataStructures::Vertex; OsgVectorFieldRepresentation::OsgVectorFieldRepresentation(const std::string& name) : Representation(name), VectorFieldRepresentation(name), OsgRepresentation(name), m_scale(0.1) { SURGSIM_ADD_SERIALIZABLE_PROPERTY(OsgVectorFieldRepresentation, double, LineWidth, getLineWidth, setLineWidth); SURGSIM_ADD_SERIALIZABLE_PROPERTY(OsgVectorFieldRepresentation, double, Scale, getScale, setScale); SURGSIM_ADD_SERIALIZABLE_PROPERTY(OsgVectorFieldRepresentation, double, PointSize, getPointSize, setPointSize); m_vectorField = std::make_shared(); m_vertexData = new osg::Vec3Array; m_lineGeometry = new osg::Geometry; m_pointGeometry = new osg::Geometry; m_drawArrays = new osg::DrawArrays(osg::PrimitiveSet::LINES); m_drawPoints = new osg::DrawElementsUInt(osg::PrimitiveSet::POINTS); m_line = new osg::LineWidth(1.0f); m_point = new osg::Point(4.0f); m_colors = new osg::Vec4Array; m_lineGeometry->setVertexArray(m_vertexData); m_lineGeometry->addPrimitiveSet(m_drawArrays); m_lineGeometry->setUseDisplayList(false); m_lineGeometry->setDataVariance(osg::Object::DYNAMIC); m_lineGeometry->getOrCreateStateSet()->setAttribute(m_line, osg::StateAttribute::ON); m_lineGeometry->setColorArray(m_colors); m_pointGeometry->setVertexArray(m_vertexData); m_pointGeometry->setUseDisplayList(false); m_pointGeometry->setDataVariance(osg::Object::DYNAMIC); m_pointGeometry->getOrCreateStateSet()->setAttribute(m_point, osg::StateAttribute::ON); m_pointGeometry->setColorArray(m_colors); osg::ref_ptr geode = new osg::Geode(); geode->addDrawable(m_lineGeometry); geode->addDrawable(m_pointGeometry); geode->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::OFF | osg::StateAttribute::PROTECTED); m_transform->addChild(geode); } OsgVectorFieldRepresentation::~OsgVectorFieldRepresentation() { } void OsgVectorFieldRepresentation::doUpdate(double dt) { VectorField vectorField; if (m_writeBuffer.tryTakeChanged(&vectorField)) { privateUpdate(vectorField.getVertices()); } else { // #threadsafety This update is through the shared datastructure, not threadsafe privateUpdate(m_vectorField->getVertices()); } } void OsgVectorFieldRepresentation::privateUpdate(const std::vector>& vertices) { size_t count = vertices.size(); if (0 != count) { // osg::DrawElementsUInt can NOT work properly when there is no data in m_vertexData // Thus, only use osg::DrawElementsUInt when there is something in m_vertexData if (0 == m_pointGeometry->getNumPrimitiveSets()) { m_pointGeometry->addPrimitiveSet(m_drawPoints); } SURGSIM_ASSERT(2 * m_drawPoints->size() == static_cast(m_drawArrays->getCount())); SURGSIM_ASSERT(m_vertexData->size() == m_colors->size()); SURGSIM_ASSERT(2 * m_drawPoints->size() == m_colors->size()); // Check for size change in number of vertices if (count != m_drawPoints->size()) { m_drawArrays->setCount(count * 2); m_drawPoints->resize(count); m_vertexData->resize(count * 2); m_colors->resize(count * 2); m_drawArrays->dirty(); m_drawPoints->dirty(); } for (size_t i = 0; i < count; ++i) { // Starting location of vector (*m_vertexData)[2 * i] = toOsg(vertices[i].position); // Ending location of vector (*m_vertexData)[2 * i + 1] = toOsg(vertices[i].position) + toOsg(vertices[i].data.direction) * m_scale; m_drawPoints->at(i) = (2 * i); } // Update color information if (vertices[0].data.color.hasValue()) { for (size_t i = 0; i < count; ++i) { osg::Vec4d color = toOsg(vertices[i].data.color.getValue()); (*m_colors)[2 * i] = color; (*m_colors)[2 * i + 1] = color; } m_lineGeometry->setColorBinding(osg::Geometry::BIND_PER_VERTEX); m_pointGeometry->setColorBinding(osg::Geometry::BIND_PER_VERTEX); } else { (*m_colors)[0] = osg::Vec4(1.0f, 1.0f, 1.0f, 1.0f); m_lineGeometry->setColorBinding(osg::Geometry::BIND_OVERALL); m_pointGeometry->setColorBinding(osg::Geometry::BIND_OVERALL); } m_lineGeometry->dirtyBound(); m_pointGeometry->dirtyBound(); } } void OsgVectorFieldRepresentation::updateVectorField(const VectorField& vectorfield) { m_writeBuffer.set(vectorfield); } std::shared_ptr OsgVectorFieldRepresentation::getVectorField() const { return m_vectorField; } void OsgVectorFieldRepresentation::setLineWidth(double width) { m_line->setWidth(width); } double OsgVectorFieldRepresentation::getLineWidth() const { return static_cast(m_line->getWidth()); } void OsgVectorFieldRepresentation::setScale(double scale) { m_scale = scale; } double OsgVectorFieldRepresentation::getScale() const { return m_scale; } void OsgVectorFieldRepresentation::setPointSize(double size) { m_point->setSize(size); } double OsgVectorFieldRepresentation::getPointSize() const { return static_cast(m_point->getSize()); } }; // Graphics }; // SurgSimopensurgsim-0.7.0/SurgSim/Graphics/OsgVectorFieldRepresentation.h000066400000000000000000000071661277777236100252320ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_OSGVECTORFIELDREPRESENTATION_H #define SURGSIM_GRAPHICS_OSGVECTORFIELDREPRESENTATION_H #include "SurgSim/Framework/LockedContainer.h" #include "SurgSim/Graphics/OsgRepresentation.h" #include "SurgSim/Graphics/VectorFieldRepresentation.h" #include "SurgSim/Graphics/VectorField.h" #include #include #include #include namespace SurgSim { namespace Graphics { SURGSIM_STATIC_REGISTRATION(OsgVectorFieldRepresentation); #if defined(_MSC_VER) #pragma warning(push) #pragma warning(disable:4250) #endif /// OSG vector field representation, implements a VectorFieldRepresenation using OSG. class OsgVectorFieldRepresentation : public VectorFieldRepresentation, public OsgRepresentation { public: /// Constructor /// \param name Name of OsgVectorFieldRepresentation explicit OsgVectorFieldRepresentation(const std::string& name); /// Destructor ~OsgVectorFieldRepresentation(); SURGSIM_CLASSNAME(SurgSim::Graphics::OsgVectorFieldRepresentation); std::shared_ptr getVectorField() const override; void setLineWidth(double width) override; double getLineWidth() const override; void setScale(double scale) override; double getScale() const override; /// Sets the size of point indicating the starting of vector /// \param size Size of starting point of a vector virtual void setPointSize(double size); /// Gets the size of starting point of a vector /// \return The size of starting point of a vector virtual double getPointSize() const; void doUpdate(double dt) override; void updateVectorField(const VectorField& vectorfield) override; private: void privateUpdate(const std::vector>& vertices); /// Vector Field holds a list of vertices/points (X,Y,Z) in 3D space /// Each point is associated with a vector and an optional color std::shared_ptr m_vectorField; SurgSim::Framework::LockedContainer m_writeBuffer; /// OSG vertex data structure osg::ref_ptr m_vertexData; /// OSG::Geometry node holding OSG representation of vectors osg::ref_ptr m_lineGeometry; /// OSG::Geometry node holding OSG representation of vector starting points osg::ref_ptr m_pointGeometry; /// An OSG::DrawArrays object specifying how vectors will be drawn osg::ref_ptr m_drawArrays; /// An OSG::DrawElementUInt object specifying how vector starting points will be drawn osg::ref_ptr m_drawPoints; /// OSG::LineWidth for representing vector osg::ref_ptr m_line; /// OSG::Point for representing vector starting point osg::ref_ptr m_point; /// OSG::Vec4Array to hold color for each vector osg::ref_ptr m_colors; /// A scale to scale the length of vector double m_scale; }; #if defined(_MSC_VER) #pragma warning(pop) #endif }; // Graphics }; // SurgSim #endif // SURGSIM_GRAPHICS_OSGVECTORFIELDREPRESENTATION_H opensurgsim-0.7.0/SurgSim/Graphics/OsgView.cpp000066400000000000000000000346341277777236100213460ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Graphics/OsgView.h" #include #include #include "SurgSim/Devices/Keyboard/KeyboardDevice.h" #include "SurgSim/Devices/Keyboard/OsgKeyboardHandler.h" #include "SurgSim/Devices/Mouse/MouseDevice.h" #include "SurgSim/Devices/Mouse/OsgMouseHandler.h" #include "SurgSim/Graphics/OsgCamera.h" #include "SurgSim/Graphics/OsgConversions.h" #include "SurgSim/Graphics/OsgTrackballZoomManipulator.h" #include "SurgSim/Framework/ApplicationData.h" #include "SurgSim/Framework/Component.h" #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Framework/SceneElement.h" #include "SurgSim/Framework/PoseComponent.h" #include "SurgSim/Math/MathConvert.h" #include "SurgSim/Math/RigidTransform.h" namespace { // Mapping from OSS values to OSG values, the order here needs to match the numerical value in // SurgSim::Graphics::View::StereoMode const osg::DisplaySettings::StereoMode StereoModeEnums[SurgSim::Graphics::View::STEREO_MODE_COUNT] = { osg::DisplaySettings::QUAD_BUFFER, osg::DisplaySettings::ANAGLYPHIC, osg::DisplaySettings::HORIZONTAL_SPLIT, osg::DisplaySettings::VERTICAL_SPLIT, osg::DisplaySettings::LEFT_EYE, osg::DisplaySettings::RIGHT_EYE, osg::DisplaySettings::HORIZONTAL_INTERLACE, osg::DisplaySettings::VERTICAL_INTERLACE, osg::DisplaySettings::CHECKERBOARD }; // Mapping from OSS values to OSG values, the order here needs to match the numerical value in // SurgSim::Graphics::View::DisplayType const osg::DisplaySettings::DisplayType DisplayTypeEnums[SurgSim::Graphics::View::DISPLAY_TYPE_COUNT] = { osg::DisplaySettings::MONITOR, osg::DisplaySettings::HEAD_MOUNTED_DISPLAY }; } namespace SurgSim { namespace Graphics { SURGSIM_REGISTER(SurgSim::Framework::Component, SurgSim::Graphics::OsgView, OsgView); OsgView::OsgView(const std::string& name) : View(name), m_isWindowBorderEnabled(true), m_isFirstUpdate(true), m_areWindowSettingsDirty(false), m_view(new osgViewer::View()), m_osgMapUniforms(false), m_manipulatorPosition(Math::Vector3d(0.0, 0.0, -3.0)), m_manipulatorLookat(Math::Vector3d::Zero()), m_keyboardEnabled(false), m_mouseEnabled(false) { m_position[0] = 0; m_position[1] = 0; m_dimensions[0] = 1024; m_dimensions[1] = 768; /// Clear the OSG default camera, let that be handled at a higher level. m_view->setCamera(nullptr); SURGSIM_ADD_SERIALIZABLE_PROPERTY(OsgView, bool, CameraManipulatorEnabled, isManipulatorEnabled, enableManipulator); SURGSIM_ADD_SERIALIZABLE_PROPERTY(OsgView, Math::Vector3d, CameraPosition, getManipulatorPosition, setManipulatorPosition); SURGSIM_ADD_SERIALIZABLE_PROPERTY(OsgView, Math::Vector3d, CameraLookAt, getManipulatorLookAt, setManipulatorLookAt); SURGSIM_ADD_SERIALIZABLE_PROPERTY(OsgView, bool, OsgMapUniforms, getOsgMapsUniforms, setOsgMapsUniforms); SURGSIM_ADD_SERIALIZABLE_PROPERTY(OsgView, bool, KeyboardDeviceEnabled, isKeyboardDeviceEnabled, enableKeyboardDevice); SURGSIM_ADD_SERIALIZABLE_PROPERTY(OsgView, bool, MouseDeviceEnabled, isMouseDeviceEnabled, enableMouseDevice); doSetTargetScreen(getTargetScreen()); } OsgView::~OsgView() { // Clean up the handler callbacks enableKeyboardDevice(false); enableMouseDevice(false); } void OsgView::setPosition(const std::array& position) { if (position != m_position) { m_position = position; m_areWindowSettingsDirty = true; } } std::array OsgView::getPosition() const { return m_position; } void OsgView::setDimensions(const std::array& dimensions) { if (m_dimensions != dimensions) { m_areWindowSettingsDirty = true; m_dimensions = dimensions; } } std::array OsgView::getDimensions() const { if (isFullScreen()) { return m_screenDimensions; } else { return m_dimensions; } } void OsgView::setDimensionsDouble(const std::array& dimensions) { if (m_dimensions[0] != static_cast(dimensions[0]) && m_dimensions[1] != static_cast(dimensions[1])) { m_areWindowSettingsDirty = true; m_dimensions[0] = dimensions[0]; m_dimensions[1] = dimensions[1]; } } std::array OsgView::getDimensionsDouble() const { std::array m_d = getDimensions(); std::array dimensions = {static_cast(m_d[0]), static_cast(m_d[1])}; return dimensions; } void OsgView::setWindowBorderEnabled(bool enabled) { m_isWindowBorderEnabled = enabled; m_areWindowSettingsDirty = true; } bool OsgView::isWindowBorderEnabled() const { return m_isWindowBorderEnabled; } void OsgView::setCamera(std::shared_ptr camera) { auto osgCamera = Framework::checkAndConvert(camera, "SurgSim::Graphics::OsgCamera"); View::setCamera(camera); m_view->setCamera(osgCamera->getOsgCamera()); osgCamera->setViewport(0, 0, m_dimensions[0], m_dimensions[1]); } void OsgView::update(double dt) { if (isActive() && m_areWindowSettingsDirty) { osg::Camera* viewCamera = m_view->getCamera(); if (viewCamera) { osgViewer::GraphicsWindow* window = dynamic_cast(viewCamera->getGraphicsContext()); if (window && !isFullScreen()) { window->setWindowDecoration(m_isWindowBorderEnabled); window->setWindowRectangle(m_position[0], m_position[1], m_dimensions[0], m_dimensions[1]); m_areWindowSettingsDirty = false; } } } else if (isActive()) { if (!isStereo()) { m_dimensions[0] = m_view->getCamera()->getGraphicsContext()->getTraits()->width; m_dimensions[1] = m_view->getCamera()->getGraphicsContext()->getTraits()->height; } } if (isManipulatorEnabled()) { auto matrix = m_view->getCameraManipulator()->getMatrix(); auto pose = Math::RigidTransform3d(fromOsg(matrix)); auto element = getSceneElement(); if (element != nullptr) { element->setPose(pose); } else { SURGSIM_LOG_WARNING(Framework::Logger::getDefaultLogger()) << getFullName() << " is not in a SceneElement, unable to set the SceneElement pose with the camera manipulator."; } } } bool OsgView::doInitialize() { return true; } bool OsgView::doWakeUp() { m_view->setDisplaySettings(createDisplaySettings()); osg::ref_ptr viewConfig; // #refactor // HS-2014-may-14 Linux is stuck at OSG 3.2.0-rc1, this is not implemented there, they are waiting for // 3.2.1 to move forward, implement this once linux has caught up // if (isFullScreen()) // { // viewConfig = new osgViewer::SingleScreen(getTargetScreen()); // } // else // { // viewConfig = new osgViewer::SingleWindow(m_x, m_y, m_width, m_height, getTargetScreen()); // } // m_view->apply(viewConfig); if (isFullScreen()) { m_view->setUpViewOnSingleScreen(getTargetScreen()); m_isWindowBorderEnabled = false; } else { m_view->setUpViewInWindow(m_position[0], m_position[1], m_dimensions[0], m_dimensions[1], getTargetScreen()); } auto statsHandler = new osgViewer::StatsHandler; m_view->addEventHandler(statsHandler); if (m_osgMapUniforms) { fixupStatsHandler(statsHandler); m_view->getCamera()->getGraphicsContext()->getState()->setUseModelViewAndProjectionUniforms(true); m_view->getCamera()->getGraphicsContext()->getState()->setUseVertexAttributeAliasing(true); } return true; } osg::ref_ptr OsgView::createDisplaySettings() const { osg::ref_ptr displaySettings = new osg::DisplaySettings; displaySettings->setDefaults(); if (isStereo()) { displaySettings->setStereo(isStereo()); displaySettings->setStereoMode(StereoModeEnums[getStereoMode()]); displaySettings->setDisplayType(DisplayTypeEnums[getDisplayType()]); displaySettings->setEyeSeparation(static_cast(getEyeSeparation())); displaySettings->setScreenDistance(static_cast(getScreenDistance())); displaySettings->setScreenWidth(static_cast(getScreenWidth())); displaySettings->setScreenHeight(static_cast(getScreenHeight())); } return displaySettings; } void OsgView::fixupStatsHandler(osgViewer::StatsHandler* statsHandler) { // use ref_ptr in case loading fails we don't have to clean up osg::ref_ptr vertexShader = new osg::Shader(osg::Shader::VERTEX); osg::ref_ptr fragmentShader = new osg::Shader(osg::Shader::FRAGMENT); bool success = true; std::string fileName; if (getRuntime()->getApplicationData()->tryFindFile("Shaders/osg_statshandler.vert", &fileName)) { success = vertexShader->loadShaderSourceFromFile(fileName); } else { SURGSIM_LOG_WARNING(Framework::Logger::getDefaultLogger()) << "Could not find Shaders/osg_statshandler.vert, the osg stats " << "display will probably not work correctly."; success = false; } if (getRuntime()->getApplicationData()->tryFindFile("Shaders/osg_statshandler.frag", &fileName)) { success = fragmentShader->loadShaderSourceFromFile(fileName); } else { SURGSIM_LOG_WARNING(Framework::Logger::getDefaultLogger()) << "Could not find Shaders/osg_statshandler.frag, the osg stats " << "display will probably not work correctly."; success = false; } if (success) { osg::ref_ptr program = new osg::Program; program->addShader(fragmentShader); program->addShader(vertexShader); auto state = statsHandler->getCamera()->getOrCreateStateSet(); auto texture = new osg::Texture2D(); texture->setTextureSize(256, 256); state->setAttributeAndModes(program); state->setTextureAttributeAndModes(0, texture); state->addUniform(new osg::Uniform("osg_TextTexture", static_cast(0))); } } int OsgView::doSetTargetScreen(int val) { osg::GraphicsContext::WindowingSystemInterface* wsi = osg::GraphicsContext::getWindowingSystemInterface(); if (!wsi) { SURGSIM_FAILURE() << "Error, no WindowSystemInterface available, cannot create windows. "; } int numScreens = wsi->getNumScreens(); if (val >= numScreens) { val = numScreens - 1; } if (val < 0) { val = 0; } unsigned int width, height; wsi->getScreenResolution(osg::GraphicsContext::ScreenIdentifier(val), width, height); m_screenDimensions[0] = static_cast(width); m_screenDimensions[1] = static_cast(height); return val; } void SurgSim::Graphics::OsgView::setOsgMapsUniforms(bool val) { SURGSIM_ASSERT(!isAwake()) << "Can't change mapping mode after waking up."; m_osgMapUniforms = val; } bool SurgSim::Graphics::OsgView::getOsgMapsUniforms() { return m_osgMapUniforms; } osg::ref_ptr SurgSim::Graphics::OsgView::getOsgView() const { return m_view; } void SurgSim::Graphics::OsgView::enableManipulator(bool val) { if (m_manipulator == nullptr) { m_manipulator = new OsgTrackballZoomManipulator(); // Set a default position m_manipulator->setTransformation(toOsg(m_manipulatorPosition), toOsg(m_manipulatorLookat), osg::Vec3d(0.0f, 1.0f, 0.0f)); } if (val) { getOsgView()->setCameraManipulator(m_manipulator, false); } else { getOsgView()->setCameraManipulator(nullptr); } } bool SurgSim::Graphics::OsgView::isManipulatorEnabled() { return getOsgView()->getCameraManipulator() != nullptr; } void SurgSim::Graphics::OsgView::enableKeyboardDevice(bool val) { // Early return if device is already turned on/off. if (val == m_keyboardEnabled) { return; } std::shared_ptr keyboardDevice = getKeyboardDevice(); osg::ref_ptr keyboardHandle = std::static_pointer_cast(keyboardDevice)->getKeyboardHandler(); if (val) { getOsgView()->addEventHandler(keyboardHandle); m_keyboardEnabled = true; } else { getOsgView()->removeEventHandler(keyboardHandle); m_keyboardEnabled = false; } } bool SurgSim::Graphics::OsgView::isKeyboardDeviceEnabled() { return m_keyboardEnabled; } std::shared_ptr SurgSim::Graphics::OsgView::getKeyboardDevice() { if (m_keyboardDevice == nullptr) { m_keyboardDevice = std::make_shared("Keyboard"); if (!m_keyboardDevice->isInitialized()) { m_keyboardDevice->initialize(); } } return m_keyboardDevice; } void SurgSim::Graphics::OsgView::enableMouseDevice(bool val) { // Early return if device is already turned on/off. if (val == m_mouseEnabled) { return; } std::shared_ptr mouseDevice = getMouseDevice(); osg::ref_ptr mouseHandler = std::static_pointer_cast(mouseDevice)->getMouseHandler(); if (val) { getOsgView()->addEventHandler(mouseHandler); m_mouseEnabled = true; } else { getOsgView()->removeEventHandler(mouseHandler); m_mouseEnabled = false; } } bool SurgSim::Graphics::OsgView::isMouseDeviceEnabled() { return m_mouseEnabled; } std::shared_ptr SurgSim::Graphics::OsgView::getMouseDevice() { if (m_mouseDevice == nullptr) { m_mouseDevice = std::make_shared("Mouse"); if (!m_mouseDevice->isInitialized()) { m_mouseDevice->initialize(); } } return m_mouseDevice; } void SurgSim::Graphics::OsgView::setManipulatorParameters(const SurgSim::Math::Vector3d& position, const SurgSim::Math::Vector3d& lookat) { m_manipulatorPosition = position; m_manipulatorLookat = lookat; if (m_manipulator != nullptr) { m_manipulator->setTransformation(toOsg(m_manipulatorPosition), toOsg(m_manipulatorLookat), osg::Vec3d(0.0f, 1.0f, 0.0f)); } } void SurgSim::Graphics::OsgView::setManipulatorPosition(const SurgSim::Math::Vector3d& position) { setManipulatorParameters(position, m_manipulatorLookat); } SurgSim::Math::Vector3d SurgSim::Graphics::OsgView::getManipulatorPosition() { return m_manipulatorPosition; } void SurgSim::Graphics::OsgView::setManipulatorLookAt(const SurgSim::Math::Vector3d& lookAt) { setManipulatorParameters(m_manipulatorPosition, lookAt); } SurgSim::Math::Vector3d SurgSim::Graphics::OsgView::getManipulatorLookAt() { return m_manipulatorLookat; } } } opensurgsim-0.7.0/SurgSim/Graphics/OsgView.h000066400000000000000000000153421277777236100210060ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_OSGVIEW_H #define SURGSIM_GRAPHICS_OSGVIEW_H #include #include "SurgSim/Graphics/View.h" namespace osgViewer { class StatsHandler; class DisplaySettings; } namespace SurgSim { namespace Input { class CommonDevice; } namespace Devices { class KeyboardDevice; class MouseDevice; } namespace Graphics { class OsgCamera; class OsgTrackballZoomManipulator; SURGSIM_STATIC_REGISTRATION(OsgView); /// OSG-based implementation of graphics view class. /// /// A Graphics::OsgView wraps a osgViewer::View to provide a visualization of the scene to the user. /// /// A Graphics::OsgCamera controls the viewpoint of this View. class OsgView : public View { public: /// Constructor /// \post The view has no camera. /// \post The position of the view is (0, 0). /// \post The dimensions of the view are 800 x 600. /// \post The window border is enabled. /// \param name Name of the view explicit OsgView(const std::string& name); /// Destructor ~OsgView(); SURGSIM_CLASSNAME(SurgSim::Graphics::OsgView); void setPosition(const std::array& position) override; std::array getPosition() const override; void setDimensions(const std::array& dimensions) override; std::array getDimensions() const override; void setDimensionsDouble(const std::array& dimensions) override; std::array getDimensionsDouble() const override; void setWindowBorderEnabled(bool enabled) override; bool isWindowBorderEnabled() const override; /// Sets the camera which provides the viewpoint in the scene /// Only allows OsgCamera components, any other will not be set and it will return false. /// \param camera Camera whose image will be shown in this view /// \return True if it succeeded, false if it failed void setCamera(std::shared_ptr camera) override; /// Enables a camera manipulator, implemented via a trackball, this is a temporary solution as it uses /// the OSG input events rather than reading from the OpenSurgSim input. /// \param val whether to enable the manipulator or not. void enableManipulator(bool val); /// \return whether the manipulator is enabled or not. bool isManipulatorEnabled(); /// As the camera is not accessible from here and as it cannot be controlled from the outside /// any more we let the user set the parameters from here. /// \param position The position of the camera. /// \param lookat The location the camera looks at. void setManipulatorParameters(const SurgSim::Math::Vector3d& position, const SurgSim::Math::Vector3d& lookat); /// Set the camera manipulator position. /// \param position The position of the camera. void setManipulatorPosition(const SurgSim::Math::Vector3d& position); /// \return The position of the camera. SurgSim::Math::Vector3d getManipulatorPosition(); /// Set the camera manipulator lookAt. /// \param lookAt The location the camera looks at. void setManipulatorLookAt(const SurgSim::Math::Vector3d& lookAt); /// \return The location the camera looks at. SurgSim::Math::Vector3d getManipulatorLookAt(); /// Enable osg modelview uniforms mapping, in this mode osg replaces the gl builtins with osg_* names, for /// uniforms and vertex attributes /// \param val Whether to enable osg uniform mapping, default false void setOsgMapsUniforms(bool val); /// \return the state of the osg modelview mapping mode. bool getOsgMapsUniforms(); /// Return the keyboard to be used with this view. /// \return A keyboard device std::shared_ptr getKeyboardDevice(); /// Turn on/off the keyboard device to be used. /// \param val Indicate whether or not to use keyboard device void enableKeyboardDevice(bool val); /// \return Whether the keyboard device is enabled. bool isKeyboardDeviceEnabled(); /// Return the mouse to be used with this view. /// \return A mouse device std::shared_ptr getMouseDevice(); /// Turn on/off the mouse device to be used. /// \param val Indicate whether or not to use mouse device void enableMouseDevice(bool val); /// \return Whether the mouse device is enabled. bool isMouseDeviceEnabled(); void update(double dt) override; /// \return the OSG view which performs the actual work involved in setting up and rendering to a window osg::ref_ptr getOsgView() const; protected: /// Initialize the view /// \post The view's window is setup. bool doInitialize() override; /// Wake up the view bool doWakeUp() override; /// Determine Screen Size int doSetTargetScreen(int val) override; /// \return The DisplaySettings to be used in this view virtual osg::ref_ptr createDisplaySettings() const; private: /// Patch the StatsHandler rendering /// \param statsHandler The statshandler that will be patched. void fixupStatsHandler(osgViewer::StatsHandler* statsHandler); /// Position of the view on the screen (in pixels) std::array m_position; /// Dimensions of the view on the screen (in pixels) std::array m_dimensions; std::array m_screenDimensions; /// Whether the view window has a border bool m_isWindowBorderEnabled; /// Whether the next update will be the first time the view has been updated /// On the first update, the view window is setup. bool m_isFirstUpdate; /// Whether the settings have been changed and the window needs to be updated bool m_areWindowSettingsDirty; /// OSG view which performs the actual work involved in setting up and rendering to a window osg::ref_ptr m_view; /// Wether to enable osg uniform mapping bool m_osgMapUniforms; osg::ref_ptr m_manipulator; SurgSim::Math::Vector3d m_manipulatorPosition; SurgSim::Math::Vector3d m_manipulatorLookat; /// Indicate if a keyboard device is enabled bool m_keyboardEnabled; std::shared_ptr m_keyboardDevice; /// Indicate if a mouse device is enabled bool m_mouseEnabled; std::shared_ptr m_mouseDevice; }; }; // namespace Graphics }; // namespace SurgSim #endif // SURGSIM_GRAPHICS_OSGVIEW_H opensurgsim-0.7.0/SurgSim/Graphics/OsgViewElement.cpp000066400000000000000000000061711277777236100226530ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Graphics/OsgViewElement.h" #include "SurgSim/Devices/Keyboard/KeyboardDevice.h" #include "SurgSim/Devices/Keyboard/OsgKeyboardHandler.h" #include "SurgSim/Devices/Mouse/MouseDevice.h" #include "SurgSim/Devices/Mouse/OsgMouseHandler.h" #include "SurgSim/Graphics/OsgCamera.h" #include "SurgSim/Graphics/OsgConversions.h" #include "SurgSim/Graphics/OsgTrackballZoomManipulator.h" #include "SurgSim/Graphics/OsgView.h" using SurgSim::Graphics::OsgCamera; using SurgSim::Graphics::OsgView; using SurgSim::Graphics::OsgViewElement; OsgViewElement::OsgViewElement(const std::string& name) : SurgSim::Graphics::ViewElement(name), m_keyboardEnabled(false), m_mouseEnabled(false) { setView(std::make_shared("View")); setCamera(std::make_shared("Camera")); getCamera()->setRenderGroupReference(Representation::DefaultGroupName); } OsgViewElement::~OsgViewElement() { } bool OsgViewElement::setView(std::shared_ptr view) { bool result = false; if (getView() == view) { result = true; } else { std::shared_ptr osgView = std::dynamic_pointer_cast(view); if (osgView) { result = ViewElement::setView(view); } } return result; } void SurgSim::Graphics::OsgViewElement::enableManipulator(bool val) { std::shared_ptr osgView = std::static_pointer_cast(getView()); osgView->enableManipulator(val); } void SurgSim::Graphics::OsgViewElement::enableKeyboardDevice(bool val) { std::shared_ptr osgView = std::static_pointer_cast(getView()); osgView->enableKeyboardDevice(val); } std::shared_ptr SurgSim::Graphics::OsgViewElement::getKeyboardDevice() { std::shared_ptr osgView = std::static_pointer_cast(getView()); return osgView->getKeyboardDevice(); } void SurgSim::Graphics::OsgViewElement::enableMouseDevice(bool val) { std::shared_ptr osgView = std::static_pointer_cast(getView()); osgView->enableMouseDevice(val); } std::shared_ptr SurgSim::Graphics::OsgViewElement::getMouseDevice() { std::shared_ptr osgView = std::static_pointer_cast(getView()); return osgView->getMouseDevice(); } void SurgSim::Graphics::OsgViewElement::setManipulatorParameters(const SurgSim::Math::Vector3d& position, const SurgSim::Math::Vector3d& lookat) { std::shared_ptr osgView = std::static_pointer_cast(getView()); osgView->setManipulatorParameters(position, lookat); } opensurgsim-0.7.0/SurgSim/Graphics/OsgViewElement.h000066400000000000000000000063311277777236100223160ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_OSGVIEWELEMENT_H #define SURGSIM_GRAPHICS_OSGVIEWELEMENT_H #include #include "SurgSim/Graphics/ViewElement.h" #include "SurgSim/Math/Vector.h" namespace SurgSim { namespace Input { class CommonDevice; } namespace Graphics { /// OSG-based implementation of graphics view element. /// /// A Graphics::OsgViewElement creates and wraps a Graphics::OsgView so that it can be added to the Scene. /// /// A Scene needs at least one Graphics::View component for any visualization of Graphics:Representation objects /// to be shown. class OsgViewElement : public Graphics::ViewElement { public: /// Constructor /// \param name Name of the scene element explicit OsgViewElement(const std::string& name); /// Destructor virtual ~OsgViewElement(); /// Sets the view component that provides the visualization of the graphics representations /// Only allows OsgView components, any other will not be set and it will return false. /// \param view The view that should be used. /// \return True if it succeeds, false if it fails. bool setView(std::shared_ptr view) override; /// Enables a camera manipulator, implemented via a trackball, this is a temporary solution as it uses /// the OSG input events rather than reading from the OpenSurgSim input. /// \param val whether to enable the manipulator or not. void enableManipulator(bool val); /// As the camera is not accessible from here and as it cannot be controlled from the outside /// any more we let the user set the parameters from here. /// \param position The position of the camera. /// \param lookat The location the camera looks at. void setManipulatorParameters(const SurgSim::Math::Vector3d& position, const SurgSim::Math::Vector3d& lookat); /// Return the keyboard to be used with this view. /// \return A keyboard device std::shared_ptr getKeyboardDevice() override; /// Turn on/off the keyboard device to be used. /// \param val Indicate whether or not to use keyboard device void enableKeyboardDevice(bool val) override; /// Return the mouse to be used with this view. /// \return A mouse device std::shared_ptr getMouseDevice() override; /// Turn on/off the mouse device to be used. /// \param val Indicate whether or not to use mouse device void enableMouseDevice(bool val) override; private: /// Indicate if a keyboard device is enabled bool m_keyboardEnabled; /// Indicate if a mouse device is enabled bool m_mouseEnabled; }; }; // namespace Graphics }; // namespace SurgSim #endif // SURGSIM_GRAPHICS_OSGVIEWELEMENT_H opensurgsim-0.7.0/SurgSim/Graphics/PaintBehavior.cpp000066400000000000000000000210061277777236100225030ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/DataStructures/Image.h" #include "SurgSim/DataStructures/ImageMap.h" #include "SurgSim/Graphics/OsgMaterial.h" #include "SurgSim/Graphics/PaintBehavior.h" #include "SurgSim/Math/Scalar.h" namespace SurgSim { namespace Graphics { SURGSIM_REGISTER(SurgSim::Framework::Component, SurgSim::Graphics::PaintBehavior, PaintBehavior); PaintBehavior::PaintBehavior(const std::string& name) : Framework::Behavior(name), m_width(0), m_height(0), m_radius(0), m_antialias(false) { SURGSIM_ADD_SERIALIZABLE_PROPERTY(PaintBehavior, std::shared_ptr, Representation, getRepresentation, setRepresentation); SURGSIM_ADD_SERIALIZABLE_PROPERTY(PaintBehavior, Math::Vector4d, Color, getColor, setColor); SURGSIM_ADD_SERIALIZABLE_PROPERTY(PaintBehavior, bool, AntiAlias, getAntiAlias, setAntiAlias); } void PaintBehavior::setRepresentation(std::shared_ptr representation) { m_representation = Framework::checkAndConvert(representation, "SurgSim::Graphics::Representation"); } std::shared_ptr PaintBehavior::getRepresentation() const { return m_representation; } void PaintBehavior::setColor(const Math::Vector4d& color) { m_color = color; } Math::Vector4d PaintBehavior::getColor() const { return m_color; } void PaintBehavior::setAntiAlias(bool antialias) { if (isInitialized()) { SURGSIM_LOG_WARNING(Framework::Logger::getDefaultLogger()) << "You cannot set anti-aliasing of " << getName() << " after it has already been initialized."; } else { m_antialias = antialias; } } bool PaintBehavior::getAntiAlias() const { return m_antialias; } void PaintBehavior::setCoordinates(const std::vector& coordinates) { boost::unique_lock lock(m_mutex); m_coordinates = coordinates; } void PaintBehavior::setTextureSize(int width, int height) { if (isInitialized()) { SURGSIM_LOG_WARNING(Framework::Logger::getDefaultLogger()) << "You cannot set texture size of " << getName() << " after it has already been initialized."; } else { m_width = width; m_height = height; } } bool PaintBehavior::doInitialize() { auto textureUniform = std::make_shared>("paintMap"); m_texture = std::make_shared(); m_texture->setSize(m_width, m_height); osg::Texture* osgTexture = m_texture->getOsgTexture(); osgTexture->setDataVariance(osg::Object::DYNAMIC); osgTexture->setFilter(osg::Texture::MIN_FILTER, osg::Texture::LINEAR); osgTexture->setFilter(osg::Texture::MAG_FILTER, osg::Texture::LINEAR); osgTexture->setWrap(osg::Texture::WRAP_S, osg::Texture::CLAMP_TO_EDGE); osgTexture->setWrap(osg::Texture::WRAP_T, osg::Texture::CLAMP_TO_EDGE); int textureSize = m_width * m_height * 4; auto data = new unsigned char[textureSize](); for (int i = 0; i < textureSize; i++) { data[i] = 0; } osg::ref_ptr image = new osg::Image(); image->setImage(m_width, m_height, 1, GL_RGBA32F_ARB, GL_RGBA, GL_UNSIGNED_BYTE, data, osg::Image::NO_DELETE); m_texture->getOsgTexture2d()->setImage(image); textureUniform->set(m_texture); m_representation->getMaterial()->addUniform(textureUniform); return true; } bool PaintBehavior::doWakeUp() { if (m_representation == nullptr) { SURGSIM_LOG_SEVERE(Framework::Logger::getDefaultLogger()) << getClassName() << " named " << getName() << " does not have a graphics representation to paint into"; return false; } if (m_texture == nullptr) { SURGSIM_LOG_SEVERE(Framework::Logger::getDefaultLogger()) << getClassName() << " named " << getName() << " does not have a texture to paint onto"; return false; } if (m_radius <= 0.0 || m_radius > 1.0) { SURGSIM_LOG_SEVERE(Framework::Logger::getDefaultLogger()) << getClassName() << " named " << getName() << " does not have a radius set"; return false; } if (m_antialias) { buildAntiAliasedBrush(getRadius()); } else { buildBrush(getRadius()); } return true; } void PaintBehavior::update(double dt) { std::vector uvCoordinates; { boost::unique_lock lock(m_mutex); auto mesh = m_representation->getMesh(); for (auto coordinate : m_coordinates) { if (coordinate.index < mesh->getNumTriangles()) { auto vertex1 = mesh->getVertex(mesh->getTriangle(coordinate.index).verticesId[0]); auto vertex2 = mesh->getVertex(mesh->getTriangle(coordinate.index).verticesId[1]); auto vertex3 = mesh->getVertex(mesh->getTriangle(coordinate.index).verticesId[2]); Math::Vector2d uv = vertex1.data.texture.getValue() * coordinate.coordinate[0] + vertex2.data.texture.getValue() * coordinate.coordinate[1] + vertex3.data.texture.getValue() * coordinate.coordinate[2]; uvCoordinates.push_back(uv); } } } for (auto& uv : uvCoordinates) { Math::Vector2d xy = toPixel(uv); paint(xy); m_texture->getOsgTexture2d()->dirtyTextureObject(); } } void PaintBehavior::setRadius(double radius) { m_radius = radius; } double PaintBehavior::getRadius() const { return m_radius; } void PaintBehavior::buildBrush(double radius) { int brushWidth = static_cast(ceil(2 * radius * m_width)); int brushHeight = static_cast(ceil(2 * radius * m_height)); int centerX = brushWidth / 2; int centerY = brushHeight / 2; m_brushOffsetX = -1 * centerX; m_brushOffsetY = -1 * centerY; m_brush.resize(brushWidth, brushHeight); for (int i = 0; i < m_brush.cols(); i++) { for (int j = 0; j < m_brush.rows(); j++) { double mag = ((i - centerX) * (i - centerX)) + ((j - centerY) * (j - centerY)); if (sqrt(mag) < m_brush.cols() / 2.0) { m_brush(i, j) = 1.0; } else { m_brush(i, j) = 0.0; } } } } void PaintBehavior::buildAntiAliasedBrush(double radius) { static const double sqrt2Half = 0.7071067811865475; double dist; int brushWidth = static_cast(ceil(2 * radius * m_width)); int brushHeight = static_cast(ceil(2 * radius * m_height)); int centerX = brushWidth / 2; int centerY = brushHeight / 2; m_brushOffsetX = -1 * centerX; m_brushOffsetY = -1 * centerY; m_brush.resize(brushWidth, brushHeight); for (int i = 0; i < m_brush.cols(); i++) { for (int j = 0; j < m_brush.rows(); j++) { double mag = (i - centerX) * (i - centerX) + (j - centerY) * (j - centerY); dist = (m_brush.cols() / 2) - sqrt(mag); dist /= m_brush.cols() / 2; if (dist > sqrt2Half) { m_brush(i, j) = 1.0; } else if (dist < 0.0) { m_brush(i, j) = 0.0; } else { m_brush(i, j) = sqrt(2) * dist; } } } } Math::Vector2d PaintBehavior::toPixel(const Math::Vector2d& uv) { double s = uv[0]; double t = uv[1]; s = Math::clamp(s, 0.0, 1.0, 0.0); t = Math::clamp(t, 0.0, 1.0, 0.0); Math::Vector2d xy; xy << floor(s * m_width + 0.5), floor(t * m_height + 0.5); return xy; } void PaintBehavior::paint(const Math::Vector2d& coordinates) { size_t numChannels = 4; DataStructures::ImageMap image(m_width, m_height, numChannels, m_texture->getOsgTexture2d()->getImage()->data()); size_t topLeftX = static_cast(std::max(0.0, coordinates[0] + m_brushOffsetX)); size_t topLeftY = static_cast(std::max(0.0, coordinates[1] + m_brushOffsetY)); size_t bottomRightX = std::min(m_width - topLeftX, static_cast(m_brush.cols())); size_t bottomRightY = std::min(m_height - topLeftY, static_cast(m_brush.rows())); for (size_t channel = 0; channel < numChannels; channel++) { auto imageBlock = image.getChannel(channel).block(topLeftX, topLeftY, bottomRightX, bottomRightY); auto brushBlock = m_brush.topLeftCorner(bottomRightX, bottomRightY); imageBlock = (brushBlock.array() > 0).select((brushBlock * m_color(channel)*255).template cast(), imageBlock); } } } // Graphics } // SurgSimopensurgsim-0.7.0/SurgSim/Graphics/PaintBehavior.h000066400000000000000000000103071277777236100221520ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_PAINTBEHAVIOR_H #define SURGSIM_GRAPHICS_PAINTBEHAVIOR_H #include "SurgSim/Collision/Representation.h" #include "SurgSim/DataStructures/IndexedLocalCoordinate.h" #include "SurgSim/Framework/Behavior.h" #include "SurgSim/Framework/Component.h" #include "SurgSim/Framework/Logger.h" #include "SurgSim/Graphics/OsgMeshRepresentation.h" #include "SurgSim/Graphics/OsgTexture2d.h" #include "SurgSim/Math/Matrix.h" #include "SurgSim/Math/Vector.h" namespace SurgSim { namespace Graphics { SURGSIM_STATIC_REGISTRATION(PaintBehavior); /// Behavior class to allow a specified scene element to receive painting effects class PaintBehavior : public Framework::Behavior { public: explicit PaintBehavior(const std::string& name); SURGSIM_CLASSNAME(SurgSim::Graphics::PaintBehavior); /// Sets graphics representation being painted on /// \param representation Graphics representation pointer void setRepresentation(std::shared_ptr representation); /// Gets graphics representation being painted on /// \return Shared pointer to a graphics representation std::shared_ptr getRepresentation() const; /// Sets the size of the texture layer to paint onto /// \param width texture width /// \param height texture height void setTextureSize(int width, int height); /// Sets color of the paint /// \param color RGBA color in [0-1] range void setColor(const Math::Vector4d& color); /// Gets color of the paint /// \return Vector4d representation of RGBA color in [0-1] range Math::Vector4d getColor() const; /// Sets radius of paint splat /// \param radius Radius in texture coordinate range [0-1] void setRadius(double radius); /// Gets radius of paint splat /// \return Radius in texture coordinate range [0-1] double getRadius() const; /// Sets whether to anti-alias the brush /// \param antialias True enables AA, False disables void setAntiAlias(bool antialias); /// Gets status of antialiased brush /// \return Boolean indicating if antialiasing is on bool getAntiAlias() const; /// Sets collection of local triangle coordinates to paint on during next update /// \param coordinate Standard vector of IndexedLocalCoordinates void setCoordinates(const std::vector& coordinate); bool doInitialize() override; bool doWakeUp() override; void update(double dt) override; private: /// Builds paint brush at the set radius size void buildBrush(double radius); /// Builds an antialiased brush at the set radius size void buildAntiAliasedBrush(double radius); /// Convert texture uv coordinates to pixel coordinates Math::Vector2d toPixel(const Math::Vector2d& uv); /// Apply paint brush to texture at specified texture coordinates void paint(const Math::Vector2d& coordinates); /// Graphics representation of the mesh to apply behavior to std::shared_ptr m_representation; /// Image data of the texture to be used as the decal layer std::shared_ptr m_texture; /// Color to use for decal painting Math::Vector4d m_color; /// Width of assigned texture int m_width; /// Height of assigned texture int m_height; /// Radius of brush double m_radius; /// Flag for antialiasing the brush bool m_antialias; /// Collection of UV texture coordinates to paint to on next update std::vector m_coordinates; int m_brushOffsetX; int m_brushOffsetY; Math::Matrix m_brush; boost::mutex m_mutex; }; } // Graphics } // SurgSim #endif // SURGSIM_GRAPHICS_PAINTBEHAVIOR_Hopensurgsim-0.7.0/SurgSim/Graphics/PlaneRepresentation.h000066400000000000000000000024501277777236100234010ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_PLANEREPRESENTATION_H #define SURGSIM_GRAPHICS_PLANEREPRESENTATION_H #include "SurgSim/Graphics/Representation.h" namespace SurgSim { namespace Graphics { /// Base graphics plane representation class, which defines the basic interface for a plane that can be visualized. /// The plane is the XZ plane, with normal +Y. class PlaneRepresentation : public virtual Representation { public: /// Constructor /// \param name Name of the representation explicit PlaneRepresentation(const std::string& name) : Representation(name) { } }; }; // namespace Graphics }; // namespace SurgSim #endif // SURGSIM_GRAPHICS_PLANEREPRESENTATION_H opensurgsim-0.7.0/SurgSim/Graphics/PointCloudRepresentation.cpp000066400000000000000000000034631277777236100247620ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Graphics/PointCloudRepresentation.h" namespace SurgSim { namespace Graphics { PointCloudRepresentation::PointCloudRepresentation(const std::string& name) : Representation(name) { SURGSIM_ADD_SERIALIZABLE_PROPERTY(PointCloudRepresentation, double, PointSize, getPointSize, setPointSize); SURGSIM_ADD_SERIALIZABLE_PROPERTY(PointCloudRepresentation, SurgSim::Math::Vector4d, Color, getColor, setColor); // Provides a common entry point for representations taking DataStructure::VerticesPlain auto converter = std::bind(SurgSim::Framework::convert, std::placeholders::_1); auto functor = std::bind((void(PointCloudRepresentation::*)(const DataStructures::VerticesPlain&)) &PointCloudRepresentation::updateVertices, this, converter); setSetter("Vertices", functor); } PointCloudRepresentation::~PointCloudRepresentation() { } void PointCloudRepresentation::updateVertices(const DataStructures::VerticesPlain& vertices) { m_locker.set(vertices); } void PointCloudRepresentation::updateVertices(DataStructures::VerticesPlain&& vertices) { m_locker.set(std::move(vertices)); } }; // Graphics }; // SurgSim opensurgsim-0.7.0/SurgSim/Graphics/PointCloudRepresentation.h000066400000000000000000000047461277777236100244340ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_POINTCLOUDREPRESENTATION_H #define SURGSIM_GRAPHICS_POINTCLOUDREPRESENTATION_H #include #include "SurgSim/DataStructures/EmptyData.h" #include "SurgSim/DataStructures/Vertices.h" #include "SurgSim/Framework/LockedContainer.h" #include "SurgSim/Graphics/Representation.h" #include "SurgSim/Math/MathConvert.h" #include "SurgSim/Math/Vector.h" namespace SurgSim { namespace Graphics { typedef SurgSim::DataStructures::Vertices PointCloud; /// Graphic representation of a point cloud, hase a very basic interface and is intentionally kept generic. class PointCloudRepresentation : public virtual Representation { public: /// Constructor explicit PointCloudRepresentation(const std::string& name); virtual ~PointCloudRepresentation(); /// Pull the vertices. /// \return The mesh. virtual std::shared_ptr getVertices() const = 0; /// Sets point size for the point elements. /// The point size defines the the width and height of the drawn square, in window pixels. /// \param val The value. virtual void setPointSize(double val) = 0; /// Gets point size. /// The point size defines the the width and height of the drawn square, in window pixels. /// \return The point size. virtual double getPointSize() const = 0; /// Sets a color for all of the points together. /// \param color The color. virtual void setColor(const SurgSim::Math::Vector4d& color) = 0; /// Gets the color. /// \return The current color. virtual SurgSim::Math::Vector4d getColor() const = 0; void updateVertices(const DataStructures::VerticesPlain& vertices); void updateVertices(DataStructures::VerticesPlain&& vertices); protected: Framework::LockedContainer m_locker; }; }; // Graphics }; // SurgSim #endif // SURGSIM_GRAPHICS_POINTCLOUDREPRESENTATION_H opensurgsim-0.7.0/SurgSim/Graphics/Program.h000066400000000000000000000111001277777236100210160ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_PROGRAM_H #define SURGSIM_GRAPHICS_PROGRAM_H #include #include "SurgSim/Framework/Accessible.h" namespace SurgSim { namespace Framework { class Asset; } namespace Graphics { /// Base class that defines the interface for graphics programs. /// /// A program in OSS is a collection of 'shaders' that are usually executed in sequence (Geometry, /// Vertex and Fragment). Each shader itself is software that is executed on the GPU, shaders are usually introduced /// as source. The concept is similar to the use of program in /// OpenGL see https://www.opengl.org/sdk/docs/man4/html/glCreateProgram.xhtml class Program { public: /// Destructor virtual ~Program() = 0; /// \return true if the vertex shader has been set, otherwise false. virtual bool hasVertexShader() const = 0; /// Removes the vertex shader, returning that portion of the shader program to fixed-function. virtual void clearVertexShader() = 0; /// Loads the vertex shader source code from a file /// \param filePath Path to file containing shader source code /// \return True if the source is successfully loaded, otherwise false. virtual bool loadVertexShader(const std::string& filePath) = 0; /// Set the vertex shader source code /// \param source Shader source code virtual void setVertexShaderSource(const std::string& source) = 0; /// Gets the vertex shader source code /// \return Shader source code virtual bool getVertexShaderSource(std::string* source) const = 0; /// \return true if the geometry shader has been set, otherwise false. virtual bool hasGeometryShader() const = 0; /// Removes the geometry shader, returning that portion of the shader program to fixed-function. virtual void clearGeometryShader() = 0; /// Loads the geometry shader source code from a file /// \param filePath Path to file containing shader source code /// \return True if the source is successfully loaded, otherwise false. virtual bool loadGeometryShader(const std::string& filePath) = 0; /// Set the geometry shader source code /// \param source Shader source code virtual void setGeometryShaderSource(const std::string& source) = 0; /// Gets the geometry shader source code /// \return Shader source code virtual bool getGeometryShaderSource(std::string* source) const = 0; /// \return true if the fragment shader has been set, otherwise false. virtual bool hasFragmentShader() const = 0; /// \return the fragment shader, returning that portion of the shader program to fixed-function. virtual void clearFragmentShader() = 0; /// Loads the fragment shader source code from a file /// \param filePath Path to file containing shader source code /// \return True if the source is successfully loaded, otherwise false. virtual bool loadFragmentShader(const std::string& filePath) = 0; /// Set the fragment shader source code /// \param source Shader source code virtual void setFragmentShaderSource(const std::string& source) = 0; /// Gets the fragment shader source code /// \return Shader source code virtual bool getFragmentShaderSource(std::string* source) const = 0; /// Clears the entire shader, returning to fixed-function pipeline. virtual void clear() { clearVertexShader(); clearGeometryShader(); clearFragmentShader(); } /// When this is set to true, this shader should be used instead of other shaders that might apply, depending /// on the hierarchy that is set out. E.g if this shader is on a camera, the shaders that occur in a group /// attached to that camera will be overridden. /// This will usually be used in conjunction with \sa RenderPass. /// \param val If true the shader should override shaders in lower levels. virtual void setGlobalScope(bool val) = 0; /// Query if this shader is of global scope. /// \return true if global scope, false if not. virtual bool isGlobalScope() const = 0; }; inline Program::~Program() { } }; // namespace Graphics }; // namespace SurgSim #endif // SURGSIM_GRAPHICS_PROGRAM_H opensurgsim-0.7.0/SurgSim/Graphics/RenderPass.cpp000066400000000000000000000070621277777236100220240ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Graphics/RenderPass.h" #include "SurgSim/Graphics/OsgCamera.h" #include "SurgSim/Graphics/OsgMaterial.h" #include "SurgSim/Graphics/OsgGroup.h" #include "SurgSim/Graphics/OsgRenderTarget.h" #include "SurgSim/Graphics/OsgScreenSpaceQuadRepresentation.h" #include "SurgSim/Graphics/View.h" #include "SurgSim/Graphics/Texture.h" namespace SurgSim { namespace Graphics { RenderPass::RenderPass(const std::string& name) : SceneElement(name) { m_camera = std::make_shared(getName() + " camera"); m_camera->setRenderGroupReference(name); m_material = std::make_shared("material"); m_camera->setMaterial(m_material); } RenderPass::~RenderPass() { } bool RenderPass::doInitialize() { addComponent(m_camera); addComponent(m_material); return true; } std::shared_ptr RenderPass::getCamera() { return m_camera; } bool RenderPass::setRenderTarget(std::shared_ptr target) { bool result = m_camera->setRenderTarget(target); if (result) { m_renderTarget = target; } return result; } std::shared_ptr RenderPass::getRenderTarget() { return m_renderTarget; } bool RenderPass::setMaterial(std::shared_ptr material) { bool result = m_camera->setMaterial(material); if (result) { m_material = std::dynamic_pointer_cast(material); } return result; } std::shared_ptr RenderPass::getMaterial() { return m_material; } void RenderPass::setRenderOrder(SurgSim::Graphics::Camera::RenderOrder order, int value) { m_camera->setRenderOrder(order, value); } void RenderPass::showColorTarget(int x, int y, int width, int height) { if (m_debugColor == nullptr && m_renderTarget->getColorTargetCount() > 0) { auto texture = m_renderTarget->getColorTarget(0); m_debugColor = buildDebugQuad("debug color", texture); } if (m_debugColor != nullptr) { m_debugColor->setLocation(x, y); m_debugColor->setSize(width, height); m_debugColor->setLocalActive(true); } } void RenderPass::hideColorTarget() { if (m_debugColor != nullptr) { m_debugColor->setLocalActive(false); } } void RenderPass::showDepthTarget(int x, int y, int width, int height) { if (m_debugDepth == nullptr && m_renderTarget->doesUseDepthTarget()) { auto texture = m_renderTarget->getDepthTarget(); m_debugDepth = buildDebugQuad("debug depth", texture); } if (m_debugDepth != nullptr) { m_debugDepth->setLocation(x, y); m_debugDepth->setSize(width, height); m_debugDepth->setLocalActive(true); } } void RenderPass::hideDepthTarget() { if (m_debugDepth != nullptr) { m_debugDepth->setLocalActive(false); } } std::shared_ptr RenderPass::buildDebugQuad(const std::string& name, std::shared_ptr texture) { auto result = std::make_shared(name); result->setTexture(texture); addComponent(result); return result; } }; // Graphics }; // SurgSim opensurgsim-0.7.0/SurgSim/Graphics/RenderPass.h000066400000000000000000000106111277777236100214630ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_RENDERPASS_H #define SURGSIM_GRAPHICS_RENDERPASS_H #include #include "SurgSim/Framework/SceneElement.h" #include "SurgSim/Graphics/Camera.h" namespace SurgSim { namespace Framework { class Component; } namespace Graphics { class Group; class Material; class RenderTarget; class ScreenSpaceQuadRepresentation; class Texture; class View; /// Encapsulation of all the components necessary needed to implement a full renderpass, this SceneElement contains /// a Camera and Group, it can also take a Material (for shaders and uniforms) and a RenderTarget for textures that /// are used as the output for the camera. /// Other components do not need to be added to the pass explicitly, they only need to refer to the passes name in /// their respective groupReferences to be added to the render pass. The passes attributes should all be set up through /// uniforms in the material. class RenderPass : public SurgSim::Framework::SceneElement { public: /// Constructor /// \param name The name for this SceneElement explicit RenderPass(const std::string& name); ~RenderPass(); /// Executes the initialize operation. /// \return true if it succeeds, false if it fails. bool doInitialize() override; /// Sets render target for the camera, this abstracts the textures that are being used for rendering into. /// \param target The rendertarget structure. /// \return true if the target was successfully set bool setRenderTarget(std::shared_ptr target); /// Gets render target that is being used in this pass. /// \return The render target that should be used. std::shared_ptr getRenderTarget(); /// Sets render order. /// \param order The general render stage for this pass. /// \param value An order value for this pass, lower means earlier. virtual void setRenderOrder(SurgSim::Graphics::Camera::RenderOrder order, int value); /// Gets the camera. /// \return The camera. std::shared_ptr getCamera(); /// Sets the material used for rendering. /// \param material The material. /// \return true if it succeeds, false if it fails. bool setMaterial(std::shared_ptr material); /// Gets the current material. /// \return The material. std::shared_ptr getMaterial(); /// Shows a quad on the screen with the texture used as the color target for this pass. /// \param x,y The x and y coordinates on the screen. /// \param width,height The width and height on the scree. void showColorTarget(int x, int y, int width, int height); /// Hides the color target display. void hideColorTarget(); /// Shows a quad on the screen with the texture used as the depth target for this pass. /// \param x,y The x and y coordinates on the screen. /// \param width,height The width and height on the screen. void showDepthTarget(int x, int y, int width, int height); /// Hides the depth target display. void hideDepthTarget(); private: std::shared_ptr m_camera; ///< The camera used for the pass std::shared_ptr m_group; ///< The groupd used for the pass std::shared_ptr m_renderTarget; ///< The camera's rendertarget std::shared_ptr m_material; ///< The material, attached to the camera int m_renderOrder; ///< The renderorder that is being used for this pass std::shared_ptr m_debugColor; std::shared_ptr m_debugDepth; /// Utility function to build a debug quad. /// \param name The name for the component. /// \param texture The texture for redering. /// \return a constructed quads. std::shared_ptr buildDebugQuad( const std::string& name, std::shared_ptr texture); }; }; // Graphics }; // SurgSim #endif opensurgsim-0.7.0/SurgSim/Graphics/RenderTarget.h000066400000000000000000000044371277777236100220140ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_RENDERTARGET_H #define SURGSIM_GRAPHICS_RENDERTARGET_H #include namespace SurgSim { namespace Graphics { class Texture; /// RenderTarget is an abstraction of the target buffers that a Camera should use to render it's scene /// valid targets are a given number of color buffers, and an optional depth buffer. The buffers need to be /// made available as textures so they can be reused in another rendering step. The type of texture is not /// determined at this point and will depend on the concrete RenderTarget that is instantiated. /// The RenderTarget is consider immutable after construction. class RenderTarget { public: /// Constructor RenderTarget() { }; virtual ~RenderTarget() { }; /// Gets a size. /// \param [out] width, height The width and height of the RenderTarget textures. virtual void getSize(int* width, int* height) const = 0; /// Returns the number of textures that this RenderTarget uses to draw into. /// \return The color target count. virtual int getColorTargetCount() const = 0; /// Gets the indicated texture that is used as a target. /// \param index Zero-based index of the texture to be used. /// \return The color target, nullptr if index exceeds getColorTargetCount(). virtual std::shared_ptr getColorTarget(int index) const = 0; /// Check wether this draws into a depth texture. /// \return true if yes, otherwise false. virtual bool doesUseDepthTarget() const = 0; /// Returns the texture that is used for the depth map drawing. /// \return The depth target. virtual std::shared_ptr getDepthTarget() const = 0; private: }; }; // Graphics }; // SurgSim #endifopensurgsim-0.7.0/SurgSim/Graphics/RenderTests/000077500000000000000000000000001277777236100215075ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Graphics/RenderTests/CMakeLists.txt000066400000000000000000000036611277777236100242550ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2012-2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. include_directories ( ${gtest_SOURCE_DIR}/include ) set(UNIT_TEST_SOURCES ImplicitSurfaceRenderTests.cpp OsgBoxRepresentationRenderTests.cpp OsgCameraRenderTests.cpp OsgCapsuleRepresentationRenderTests.cpp OsgCurveRepresentationRenderTests.cpp OsgCylinderRepresentationRenderTests.cpp OsgManagerRenderTests.cpp OsgMeshRepresentationRenderTests.cpp OsgOctreeRepresentationRenderTests.cpp OsgPlaneRepresentationRenderTests.cpp OsgPointCloudRepresentationRenderTests.cpp OsgProgramRenderTests.cpp OsgRepresentationRenderTests.cpp OsgSceneryRepresentationRenderTests.cpp OsgScreenSpaceQuadRenderTests.cpp OsgSkeletonRepresentationRenderTests.cpp OsgSphereRepresentationRenderTests.cpp OsgTextRepresentationRenderTests.cpp OsgVectorFieldRepresentationRenderTests.cpp OsgViewElementRenderTests.cpp PaintBehaviorRenderTests.cpp RenderTest.cpp ) set(UNIT_TEST_HEADERS RenderTest.h ) file(COPY Data DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) # Configure the path for the data files configure_file( "${CMAKE_CURRENT_SOURCE_DIR}/config.txt.in" "${CMAKE_CURRENT_BINARY_DIR}/config.txt" ) set(LIBS SurgSimFramework SurgSimGraphics SurgSimMath SurgSimTesting SurgSimBlocks ) surgsim_add_unit_tests(SurgSimGraphicsRenderTest) set_target_properties(SurgSimGraphicsRenderTest PROPERTIES FOLDER "Graphics") opensurgsim-0.7.0/SurgSim/Graphics/RenderTests/Data/000077500000000000000000000000001277777236100223605ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Graphics/RenderTests/Data/OsgShaderRenderTests/000077500000000000000000000000001277777236100264225ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Graphics/RenderTests/Data/OsgShaderRenderTests/L_forcep.obj000066400000000000000000000044011277777236100306460ustar00rootroot00000000000000# Blender3D v249 OBJ File: forceps_collision._blocky_tip.blend # www.blender3d.org v 0.024467 0.001716 0.000824 v -0.020851 -0.000170 0.004465 v 0.015221 -0.004827 -0.000001 v -0.019522 0.003106 0.003026 v -0.082222 -0.002056 0.008415 v 0.015886 0.004555 0.000816 v -0.081055 -0.004124 0.007234 v -0.036645 0.004459 0.002150 v -0.036274 -0.004451 0.002135 v -0.080115 0.005198 0.005436 v 0.015357 -0.004223 0.000838 v -0.104150 0.003159 0.006363 v 0.024155 0.002336 0.000013 v 0.000061 -0.003838 0.001019 v -0.104285 -0.003012 0.006608 v 0.001048 0.004519 0.000157 v 0.024474 -0.000834 0.000810 v -0.082213 0.001829 0.008614 v -0.080297 0.004058 0.007428 v -0.019028 -0.003582 0.001435 v -0.019202 -0.003043 0.003002 v -0.018394 0.003543 0.001425 v 0.000090 -0.004398 0.000012 v 0.015714 0.004829 0.000008 v 0.024297 -0.001433 0.000006 v -0.081263 -0.005133 0.005527 v -0.057169 -0.002681 0.006440 v -0.055761 -0.005151 0.005118 v -0.037785 -0.001029 0.005453 v -0.036256 -0.003701 0.004060 v -0.057356 0.002278 0.006540 v -0.055734 0.005031 0.005227 v -0.037930 0.000571 0.005502 v -0.036454 0.003585 0.004126 v -0.130109 0.002182 0.007166 v -0.134452 0.001378 0.009129 v -0.130427 -0.002319 0.007300 v -0.134419 -0.001339 0.009097 v -0.130501 -0.000018 0.007319 v -0.134581 0.000047 0.009374 v -0.134454 -0.000680 0.005675 v -0.134470 0.000678 0.005691 v -0.132460 -0.000679 0.005686 v -0.132476 0.000680 0.005702 usemtl (null) s 1 f 26 15 12 f 21 20 23 f 20 22 16 f 26 7 15 f 4 21 14 f 40 38 5 f 23 20 16 f 14 16 4 f 5 15 7 f 12 35 36 f 5 38 15 f 3 25 11 f 26 12 10 f 6 1 13 f 14 23 11 f 14 21 23 f 38 37 15 f 1 17 13 f 4 2 21 f 4 16 22 f 23 3 11 f 24 6 13 f 24 16 6 f 11 25 17 f 13 17 25 f 2 33 29 f 7 26 28 f 9 28 26 f 9 30 28 f 8 10 32 f 8 32 34 f 10 19 32 f 10 12 19 f 3 24 25 f 24 13 25 f 3 23 16 f 3 16 24 f 11 6 16 f 11 16 14 f 1 6 17 f 6 11 17 f 20 21 9 f 21 30 9 f 8 22 20 f 8 20 9 f 4 22 8 f 4 8 34 f 8 9 10 f 9 26 10 f 5 27 31 f 5 31 18 f 27 29 33 f 27 33 31 f 34 32 33 f 32 31 33 f 4 34 2 f 34 33 2 f 32 19 31 f 19 18 31 f 29 27 28 f 29 28 30 f 2 29 30 f 2 30 21 f 27 5 7 f 27 7 28 f 12 36 18 f 12 18 19 f 5 18 40 f 36 40 18 f 35 12 39 f 39 12 15 f 39 15 37 f 41 38 40 f 36 42 40 f 38 43 37 f 43 39 37 f 39 44 35 f 44 36 35 f 43 38 41 f 36 44 42 f 40 42 41 f 39 43 44 f 41 42 44 f 41 44 43 opensurgsim-0.7.0/SurgSim/Graphics/RenderTests/Data/OsgShaderRenderTests/shader.frag000066400000000000000000000001441277777236100305300ustar00rootroot00000000000000varying vec4 geomColor; /// Outputs the input color void main(void) { gl_FragColor = geomColor; };opensurgsim-0.7.0/SurgSim/Graphics/RenderTests/Data/OsgShaderRenderTests/shader.vert000066400000000000000000000003201277777236100305650ustar00rootroot00000000000000varying vec4 vertColor; /// Outputs the local normal direction as the vertex color void main(void) { gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; vertColor.rgb = gl_Normal; vertColor.a = 1.0; }opensurgsim-0.7.0/SurgSim/Graphics/RenderTests/Data/OsgShaderRenderTests/shader_axis_mirrored.geom000066400000000000000000000011511277777236100334660ustar00rootroot00000000000000#version 150 #extension GL_EXT_gpu_shader4 : enable #extension GL_EXT_geometry_shader4 : enable layout(triangles) in; layout(triangle_strip, max_vertices=6) out; in vec4 vertColor[3]; out vec4 geomColor; /// Outputs the input geometry plus it's mirror in the X-axis void main() { for (int i = 0; i < gl_VerticesIn; ++i) { gl_Position = gl_PositionIn[i]; geomColor = vertColor[i]; EmitVertex(); } EndPrimitive(); for (int i = 0; i < gl_VerticesIn; ++i) { vec4 vertex = gl_PositionIn[i]; vertex.x = - vertex.x; gl_Position = vertex; geomColor = vertColor[i]; EmitVertex(); } EndPrimitive(); }opensurgsim-0.7.0/SurgSim/Graphics/RenderTests/Data/OsgSkeletonRepresentationRenderTests/000077500000000000000000000000001277777236100317235ustar00rootroot00000000000000rigged_cylinder.osgt000066400000000000000000017022051277777236100357030ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Graphics/RenderTests/Data/OsgSkeletonRepresentationRenderTests#Ascii Scene #Version 100 #Generator OpenSceneGraph 3.2.0 osg::Group { UniqueID 1 Name "Collada visual scene group" StateSet TRUE { osg::StateSet { UniqueID 2 DataVariance STATIC } } Children 1 { osg::MatrixTransform { UniqueID 3 Name "Armature" StateSet TRUE { osg::StateSet { UniqueID 4 DataVariance STATIC ModeList 1 { GL_RESCALE_NORMAL ON|OVERRIDE } } } Children 1 { osgAnimation::Skeleton { UniqueID 5 DataVariance DYNAMIC UpdateCallback TRUE { osgAnimation::UpdateSkeleton { UniqueID 6 } } Children 2 { osgAnimation::Bone { UniqueID 7 Name "Bone" DataVariance DYNAMIC UpdateCallback TRUE { osgAnimation::UpdateBone { UniqueID 8 Name "Bone" StackedTransforms 1 { osgAnimation::StackedMatrixElement { UniqueID 9 Name "transform" Matrix { 1 0 0 0 0 0 1 0 0 -1 0 0 0 0 0 1 } } } } } Children 1 { osgAnimation::Bone { UniqueID 10 Name "Bone_002" DataVariance DYNAMIC UpdateCallback TRUE { osgAnimation::UpdateBone { UniqueID 11 Name "Bone_002" StackedTransforms 1 { osgAnimation::StackedMatrixElement { UniqueID 12 Name "transform" Matrix { 1 0 0 0 0 1 0 0 0 0 1 0 0 0.25 0 1 } } } } } Children 1 { osgAnimation::Bone { UniqueID 13 Name "Bone_001" DataVariance DYNAMIC UpdateCallback TRUE { osgAnimation::UpdateBone { UniqueID 14 Name "Bone_001" StackedTransforms 1 { osgAnimation::StackedMatrixElement { UniqueID 15 Name "transform" Matrix { 1 0 0 0 0 1 0 0 0 0 1 0 0 0.25 0 1 } } } } } Children 1 { osgAnimation::Bone { UniqueID 16 Name "Bone_003" DataVariance DYNAMIC UpdateCallback TRUE { osgAnimation::UpdateBone { UniqueID 17 Name "Bone_003" StackedTransforms 1 { osgAnimation::StackedMatrixElement { UniqueID 18 Name "transform" Matrix { 1 0 0 0 0 1 0 0 0 0 1 0 0 0.25 0 1 } } } } } Matrix { 1 0 0 0 0 1 0 0 0 0 1 0 0 0.25 0 1 } InvBindMatrixInSkeletonSpace { 10 0 0 0 0 0 -10 0 0 10 0 0 0 -0.25 0 1 } } } Matrix { 1 0 0 0 0 1 0 0 0 0 1 0 0 0.25 0 1 } InvBindMatrixInSkeletonSpace { 10 0 0 0 0 0 -10 0 0 10 0 0 0 0 0 1 } } } Matrix { 1 0 0 0 0 1 0 0 0 0 1 0 0 0.25 0 1 } InvBindMatrixInSkeletonSpace { 10 0 0 0 0 0 -10 0 0 10 0 0 0 0.25 0 1 } } } Matrix { 1 0 0 0 0 0 1 0 0 -1 0 0 0 0 0 1 } InvBindMatrixInSkeletonSpace { 10 0 0 0 0 0 -10 0 0 10 0 0 0 0.5 0 1 } } osg::Geode { UniqueID 19 DataVariance DYNAMIC Drawables 1 { osgAnimation::RigGeometry { UniqueID 20 DataVariance DYNAMIC ComputeBoundingBoxCallback TRUE { osg::ComputeBoundingBoxCallback { UniqueID 21 } } SupportsDisplayList FALSE UseDisplayList FALSE UseVertexBufferObjects TRUE UpdateCallback TRUE { osg::UpdateCallback { UniqueID 22 } } PrimitiveSetList 1 { DrawElementsUInt GL_TRIANGLES 0 1428 { 1141 653 12 1147 676 20 1153 693 28 1159 710 36 1165 727 44 1171 744 52 1177 761 60 1183 779 68 1189 796 76 1195 813 84 762 246 268 1201 847 4 1207 830 92 303 168 259 1213 852 116 1219 858 371 1225 448 103 1231 876 141 1237 882 377 1243 471 132 1249 900 162 1255 906 383 1261 488 154 1267 924 186 1273 930 389 1279 506 178 1285 948 208 1291 954 395 1297 523 200 1303 972 232 1309 978 401 1315 540 222 1321 996 253 1327 1002 407 1333 557 247 1339 1020 277 1345 1026 413 1351 574 269 1357 1044 297 1363 1050 419 1369 591 290 1375 1068 322 1381 1074 425 608 314 1086 1392 1093 110 1398 1099 431 1404 641 363 1410 1117 348 1416 1123 437 1422 625 336 853 1142 664 372 870 1143 871 104 654 877 1148 681 378 894 1149 895 133 677 901 1154 698 384 918 1155 919 155 694 925 1160 716 390 942 1161 943 179 711 949 1166 732 396 966 1167 967 201 728 973 1172 750 402 990 1173 991 223 745 997 1178 767 408 1014 1179 1015 248 763 1021 1184 785 414 1038 1185 1039 270 780 1045 1190 802 420 1062 1191 1063 291 797 1069 1196 819 426 1087 1197 1088 315 814 1094 1202 454 432 1111 1203 1112 364 848 1118 1208 835 438 1135 1209 1136 337 831 443 1214 460 96 864 1215 865 373 854 647 1220 866 0 658 1221 659 111 859 860 1226 872 112 455 1227 456 5 449 466 1232 477 122 888 1233 889 379 878 670 1238 890 8 461 1239 462 117 883 884 1244 896 118 665 1245 666 13 472 483 1250 494 147 912 1251 913 385 902 687 1256 914 16 478 1257 479 142 907 908 1262 920 143 682 1263 683 21 489 500 1268 512 169 936 1269 937 391 926 704 1274 938 24 495 1275 496 163 931 932 1280 944 164 699 1281 700 29 507 518 1286 528 192 960 1287 961 397 950 722 1292 962 32 513 1293 514 187 955 956 1298 968 188 717 1299 718 37 524 534 1304 546 214 984 1305 985 403 974 738 1310 986 40 529 1311 530 209 979 980 1316 992 210 733 1317 734 45 541 552 1322 562 238 1008 1323 1009 409 998 756 1328 1010 48 547 1329 548 233 1003 1004 1334 1016 234 751 1335 752 53 558 568 1340 579 260 1032 1341 1033 415 1022 773 1346 1034 56 563 1347 564 254 1027 1028 1352 1040 255 768 1353 769 61 575 585 1358 596 283 1056 1359 1057 421 1046 791 1364 1058 64 580 1365 581 278 1051 1052 1370 1064 279 786 1371 787 69 592 602 1376 614 304 1080 1377 1081 427 1070 808 1382 1082 72 597 1383 598 298 1075 1076 1387 1089 299 803 1388 804 77 609 636 1393 660 354 1105 1394 1106 433 1095 841 1399 1107 88 630 1400 631 349 1100 1101 1405 1113 350 836 1406 837 93 642 620 1411 632 328 1129 1412 1130 439 1119 825 1417 1131 80 615 1418 616 323 1124 1125 1423 1137 324 820 1424 821 85 626 667 1144 14 684 1150 22 701 1156 30 719 1162 38 735 1168 46 753 1174 54 770 1180 62 788 1186 70 805 1192 78 822 1198 86 473 15 655 105 450 365 451 6 849 798 316 610 338 643 832 87 815 627 317 339 816 79 799 611 593 781 292 594 71 782 576 764 271 577 63 765 559 746 249 560 55 747 729 202 542 543 47 730 525 712 203 526 39 713 695 156 508 509 31 696 678 134 490 491 23 679 474 106 135 714 180 204 452 850 366 644 94 833 817 340 628 748 224 250 157 136 341 137 158 492 475 656 107 457 1204 7 159 181 510 783 272 293 182 160 342 318 273 225 343 138 367 800 294 319 295 274 320 251 226 275 205 183 227 321 228 344 229 184 345 206 230 544 139 108 368 346 369 645 838 1210 95 637 1 648 444 671 97 445 9 672 467 688 123 468 17 689 484 705 148 485 25 706 723 193 501 502 33 724 519 739 194 520 41 740 757 239 535 536 49 758 553 774 240 554 57 775 792 284 569 570 65 793 809 305 586 587 73 810 826 329 603 604 81 827 621 842 330 622 89 843 355 638 649 331 306 605 98 124 356 776 261 241 463 1216 119 125 307 357 332 358 308 741 215 195 309 285 588 690 149 126 196 170 503 286 262 571 650 99 359 242 216 537 150 171 127 197 217 172 243 263 218 287 310 264 707 173 151 333 844 360 128 174 311 175 219 265 100 673 129 867 1222 374 873 1228 109 480 1234 144 891 1240 380 897 1246 140 497 1252 165 915 1258 386 921 1264 161 515 1270 189 939 1276 392 945 1282 185 531 1288 211 963 1294 398 969 1300 207 549 1306 235 987 1312 404 993 1318 231 565 1324 256 1011 1330 410 1017 1336 252 582 1342 280 1035 1348 416 1041 1354 276 599 1360 300 1059 1366 422 1065 1372 296 617 1378 325 1083 1384 428 1389 612 1090 661 1395 113 1108 1401 434 1114 1407 370 633 1413 351 1132 1419 440 1138 1425 347 120 855 668 856 375 1145 1146 874 657 145 879 685 880 381 1151 1152 898 680 166 903 702 904 387 1157 1158 922 697 190 927 720 928 393 1163 1164 946 715 212 951 736 952 399 1169 1170 970 731 236 975 754 976 405 1175 1176 994 749 257 999 771 1000 411 1181 1182 1018 766 281 1023 789 1024 417 1187 1188 1042 784 301 1047 806 1048 423 1193 1194 1066 801 326 1071 823 1072 429 1199 1200 1091 818 114 1096 458 1097 435 1205 1206 1115 851 352 1120 839 1121 441 1211 1212 1139 834 10 446 464 447 101 1217 1218 868 857 102 651 869 652 2 1223 1224 662 861 376 862 875 863 115 1229 1230 459 453 18 469 481 470 130 1235 1236 892 881 131 674 893 675 11 1241 1242 465 885 382 886 899 887 121 1247 1248 669 476 26 486 498 487 152 1253 1254 916 905 153 691 917 692 19 1259 1260 482 909 388 910 923 911 146 1265 1266 686 493 34 504 516 505 176 1271 1272 940 929 177 708 941 709 27 1277 1278 499 933 394 934 947 935 167 1283 1284 703 511 42 521 532 522 198 1289 1290 964 953 199 725 965 726 35 1295 1296 517 957 400 958 971 959 191 1301 1302 721 527 50 538 550 539 220 1307 1308 988 977 221 742 989 743 43 1313 1314 533 981 406 982 995 983 213 1319 1320 737 545 58 555 566 556 244 1325 1326 1012 1001 245 759 1013 760 51 1331 1332 551 1005 412 1006 1019 1007 237 1337 1338 755 561 66 572 583 573 266 1343 1344 1036 1025 267 777 1037 778 59 1349 1350 567 1029 418 1030 1043 1031 258 1355 1356 772 578 74 589 600 590 288 1361 1362 1060 1049 289 794 1061 795 67 1367 1368 584 1053 424 1054 1067 1055 282 1373 1374 790 595 82 606 618 607 312 1379 1380 1084 1073 313 811 1085 812 75 1385 1386 601 1077 430 1078 1092 1079 302 1390 1391 807 613 3 639 663 640 361 1396 1397 1109 1098 362 845 1110 846 90 1402 1403 634 1102 436 1103 1116 1104 353 1408 1409 840 646 91 623 635 624 334 1414 1415 1133 1122 335 828 1134 829 83 1420 1421 619 1126 442 1127 1140 1128 327 1426 1427 824 629 } } VertexData { Array TRUE ArrayID 1 Vec3fArray 1428 { 0 0.0499999 -0.0499999 0 0.0499999 -0.0499999 0 0.0499999 -0.0499999 0 0.0499999 -0.0499999 0 0.0499999 0.0499999 0 0.0499999 0.0499999 0 0.0499999 0.0499999 0 0.0499999 0.0499999 0.025 0.0433012 -0.0499999 0.025 0.0433012 -0.0499999 0.025 0.0433012 -0.0499999 0.025 0.0433012 -0.0499999 0.025 0.0433012 0.0499999 0.025 0.0433012 0.0499999 0.025 0.0433012 0.0499999 0.025 0.0433012 0.0499999 0.0433012 0.025 -0.0499999 0.0433012 0.025 -0.0499999 0.0433012 0.025 -0.0499999 0.0433012 0.025 -0.0499999 0.0433012 0.025 0.0499999 0.0433012 0.025 0.0499999 0.0433012 0.025 0.0499999 0.0433012 0.025 0.0499999 0.0499999 0 -0.0499999 0.0499999 0 -0.0499999 0.0499999 0 -0.0499999 0.0499999 0 -0.0499999 0.0499999 0 0.0499999 0.0499999 0 0.0499999 0.0499999 0 0.0499999 0.0499999 0 0.0499999 0.0433012 -0.025 -0.0499999 0.0433012 -0.025 -0.0499999 0.0433012 -0.025 -0.0499999 0.0433012 -0.025 -0.0499999 0.0433012 -0.025 0.0499999 0.0433012 -0.025 0.0499999 0.0433012 -0.025 0.0499999 0.0433012 -0.025 0.0499999 0.025 -0.0433012 -0.0499999 0.025 -0.0433012 -0.0499999 0.025 -0.0433012 -0.0499999 0.025 -0.0433012 -0.0499999 0.025 -0.0433012 0.0499999 0.025 -0.0433012 0.0499999 0.025 -0.0433012 0.0499999 0.025 -0.0433012 0.0499999 0 -0.0499999 -0.0499999 0 -0.0499999 -0.0499999 0 -0.0499999 -0.0499999 0 -0.0499999 -0.0499999 0 -0.0499999 0.0499999 0 -0.0499999 0.0499999 0 -0.0499999 0.0499999 0 -0.0499999 0.0499999 -0.025 -0.0433012 -0.0499999 -0.025 -0.0433012 -0.0499999 -0.025 -0.0433012 -0.0499999 -0.025 -0.0433012 -0.0499999 -0.025 -0.0433012 0.0499999 -0.025 -0.0433012 0.0499999 -0.025 -0.0433012 0.0499999 -0.025 -0.0433012 0.0499999 -0.0433012 -0.025 -0.0499999 -0.0433012 -0.025 -0.0499999 -0.0433012 -0.025 -0.0499999 -0.0433012 -0.025 -0.0499999 -0.0433012 -0.025 0.0499999 -0.0433012 -0.025 0.0499999 -0.0433012 -0.025 0.0499999 -0.0433012 -0.025 0.0499999 -0.0499999 0 -0.0499999 -0.0499999 0 -0.0499999 -0.0499999 0 -0.0499999 -0.0499999 0 -0.0499999 -0.0499999 0 0.0499999 -0.0499999 0 0.0499999 -0.0499999 0 0.0499999 -0.0499999 0 0.0499999 -0.0433013 0.025 -0.0499999 -0.0433013 0.025 -0.0499999 -0.0433013 0.025 -0.0499999 -0.0433013 0.025 -0.0499999 -0.0433013 0.025 0.0499999 -0.0433013 0.025 0.0499999 -0.0433013 0.025 0.0499999 -0.0433013 0.025 0.0499999 -0.025 0.0433012 -0.0499999 -0.025 0.0433012 -0.0499999 -0.025 0.0433012 -0.0499999 -0.025 0.0433012 -0.0499999 -0.025 0.0433012 0.0499999 -0.025 0.0433012 0.0499999 -0.025 0.0433012 0.0499999 -0.025 0.0433012 0.0499999 0.0125 0.0466506 -0.0499999 0.0125 0.0466506 -0.0499999 0.0125 0.0466506 -0.0499999 0.0125 0.0466506 -0.0499999 0.0125 0.0466506 -0.0499999 0.0125 0.0466506 -0.0499999 0.0125 0.0466506 -0.0499999 0.0125 0.0466506 0.0499999 0.0125 0.0466506 0.0499999 0.0125 0.0466506 0.0499999 0.0125 0.0466506 0.0499999 0.0125 0.0466506 0.0499999 0.0125 0.0466506 0.0499999 0.0125 0.0466506 0.0499999 0 0.0499999 0 0 0.0499999 0 0 0.0499999 0 0 0.0499999 0 0 0.0499999 0 0 0.0499999 0 0.025 0.0433012 0 0.025 0.0433012 0 0.025 0.0433012 0 0.025 0.0433012 0 0.025 0.0433012 0 0.025 0.0433012 0 0.0341506 0.0341506 -0.0499999 0.0341506 0.0341506 -0.0499999 0.0341506 0.0341506 -0.0499999 0.0341506 0.0341506 -0.0499999 0.0341506 0.0341506 -0.0499999 0.0341506 0.0341506 -0.0499999 0.0341506 0.0341506 -0.0499999 0.0341506 0.0341506 -0.0499999 0.0341506 0.0341506 -0.0499999 0.0341506 0.0341506 -0.0499999 0.0341506 0.0341506 0.0499999 0.0341506 0.0341506 0.0499999 0.0341506 0.0341506 0.0499999 0.0341506 0.0341506 0.0499999 0.0341506 0.0341506 0.0499999 0.0341506 0.0341506 0.0499999 0.0341506 0.0341506 0.0499999 0.0341506 0.0341506 0.0499999 0.0341506 0.0341506 0.0499999 0.0433012 0.025 0 0.0433012 0.025 0 0.0433012 0.025 0 0.0433012 0.025 0 0.0433012 0.025 0 0.0433012 0.025 0 0.0466506 0.0125 -0.0499999 0.0466506 0.0125 -0.0499999 0.0466506 0.0125 -0.0499999 0.0466506 0.0125 -0.0499999 0.0466506 0.0125 -0.0499999 0.0466506 0.0125 -0.0499999 0.0466506 0.0125 -0.0499999 0.0466506 0.0125 0.0499999 0.0466506 0.0125 0.0499999 0.0466506 0.0125 0.0499999 0.0466506 0.0125 0.0499999 0.0466506 0.0125 0.0499999 0.0466506 0.0125 0.0499999 0.0466506 0.0125 0.0499999 0.0466506 0.0125 0.0499999 0.0499999 0 0 0.0499999 0 0 0.0499999 0 0 0.0499999 0 0 0.0499999 0 0 0.0499999 0 0 0.0466506 -0.0125 -0.0499999 0.0466506 -0.0125 -0.0499999 0.0466506 -0.0125 -0.0499999 0.0466506 -0.0125 -0.0499999 0.0466506 -0.0125 -0.0499999 0.0466506 -0.0125 -0.0499999 0.0466506 -0.0125 -0.0499999 0.0466506 -0.0125 -0.0499999 0.0466506 -0.0125 -0.0499999 0.0466506 -0.0125 -0.0499999 0.0466506 -0.0125 0.0499999 0.0466506 -0.0125 0.0499999 0.0466506 -0.0125 0.0499999 0.0466506 -0.0125 0.0499999 0.0466506 -0.0125 0.0499999 0.0466506 -0.0125 0.0499999 0.0466506 -0.0125 0.0499999 0.0466506 -0.0125 0.0499999 0.0433012 -0.025 0 0.0433012 -0.025 0 0.0433012 -0.025 0 0.0433012 -0.025 0 0.0433012 -0.025 0 0.0433012 -0.025 0 0.0341506 -0.0341506 -0.0499999 0.0341506 -0.0341506 -0.0499999 0.0341506 -0.0341506 -0.0499999 0.0341506 -0.0341506 -0.0499999 0.0341506 -0.0341506 -0.0499999 0.0341506 -0.0341506 -0.0499999 0.0341506 -0.0341506 -0.0499999 0.0341506 -0.0341506 -0.0499999 0.0341506 -0.0341506 0.0499999 0.0341506 -0.0341506 0.0499999 0.0341506 -0.0341506 0.0499999 0.0341506 -0.0341506 0.0499999 0.0341506 -0.0341506 0.0499999 0.0341506 -0.0341506 0.0499999 0.0341506 -0.0341506 0.0499999 0.0341506 -0.0341506 0.0499999 0.025 -0.0433012 0 0.025 -0.0433012 0 0.025 -0.0433012 0 0.025 -0.0433012 0 0.025 -0.0433012 0 0.025 -0.0433012 0 0.0125 -0.0466506 -0.0499999 0.0125 -0.0466506 -0.0499999 0.0125 -0.0466506 -0.0499999 0.0125 -0.0466506 -0.0499999 0.0125 -0.0466506 -0.0499999 0.0125 -0.0466506 -0.0499999 0.0125 -0.0466506 -0.0499999 0.0125 -0.0466506 -0.0499999 0.0125 -0.0466506 0.0499999 0.0125 -0.0466506 0.0499999 0.0125 -0.0466506 0.0499999 0.0125 -0.0466506 0.0499999 0.0125 -0.0466506 0.0499999 0.0125 -0.0466506 0.0499999 0.0125 -0.0466506 0.0499999 0.0125 -0.0466506 0.0499999 0.0125 -0.0466506 0.0499999 0.0125 -0.0466506 0.0499999 0 -0.0499999 0 0 -0.0499999 0 0 -0.0499999 0 0 -0.0499999 0 0 -0.0499999 0 0 -0.0499999 0 -0.0125 -0.0466506 -0.0499999 -0.0125 -0.0466506 -0.0499999 -0.0125 -0.0466506 -0.0499999 -0.0125 -0.0466506 -0.0499999 -0.0125 -0.0466506 -0.0499999 -0.0125 -0.0466506 -0.0499999 -0.0125 -0.0466506 -0.0499999 -0.0125 -0.0466506 -0.0499999 -0.0125 -0.0466506 0.0499999 -0.0125 -0.0466506 0.0499999 -0.0125 -0.0466506 0.0499999 -0.0125 -0.0466506 0.0499999 -0.0125 -0.0466506 0.0499999 -0.0125 -0.0466506 0.0499999 -0.0125 -0.0466506 0.0499999 -0.025 -0.0433012 0 -0.025 -0.0433012 0 -0.025 -0.0433012 0 -0.025 -0.0433012 0 -0.025 -0.0433012 0 -0.025 -0.0433012 0 -0.0341506 -0.0341506 -0.0499999 -0.0341506 -0.0341506 -0.0499999 -0.0341506 -0.0341506 -0.0499999 -0.0341506 -0.0341506 -0.0499999 -0.0341506 -0.0341506 -0.0499999 -0.0341506 -0.0341506 -0.0499999 -0.0341506 -0.0341506 -0.0499999 -0.0341506 -0.0341506 -0.0499999 -0.0341506 -0.0341506 -0.0499999 -0.0341506 -0.0341506 0.0499999 -0.0341506 -0.0341506 0.0499999 -0.0341506 -0.0341506 0.0499999 -0.0341506 -0.0341506 0.0499999 -0.0341506 -0.0341506 0.0499999 -0.0341506 -0.0341506 0.0499999 -0.0341506 -0.0341506 0.0499999 -0.0341506 -0.0341506 0.0499999 -0.0341506 -0.0341506 0.0499999 -0.0433012 -0.025 0 -0.0433012 -0.025 0 -0.0433012 -0.025 0 -0.0433012 -0.025 0 -0.0433012 -0.025 0 -0.0433012 -0.025 0 -0.0466506 -0.0125 -0.0499999 -0.0466506 -0.0125 -0.0499999 -0.0466506 -0.0125 -0.0499999 -0.0466506 -0.0125 -0.0499999 -0.0466506 -0.0125 -0.0499999 -0.0466506 -0.0125 -0.0499999 -0.0466506 -0.0125 -0.0499999 -0.0466506 -0.0125 0.0499999 -0.0466506 -0.0125 0.0499999 -0.0466506 -0.0125 0.0499999 -0.0466506 -0.0125 0.0499999 -0.0466506 -0.0125 0.0499999 -0.0466506 -0.0125 0.0499999 -0.0466506 -0.0125 0.0499999 -0.0499999 0 0 -0.0499999 0 0 -0.0499999 0 0 -0.0499999 0 0 -0.0499999 0 0 -0.0499999 0 0 -0.0466506 0.0124999 -0.0499999 -0.0466506 0.0124999 -0.0499999 -0.0466506 0.0124999 -0.0499999 -0.0466506 0.0124999 -0.0499999 -0.0466506 0.0124999 -0.0499999 -0.0466506 0.0124999 -0.0499999 -0.0466506 0.0124999 -0.0499999 -0.0466506 0.0124999 -0.0499999 -0.0466506 0.0124999 -0.0499999 -0.0466506 0.0124999 -0.0499999 -0.0466506 0.0124999 -0.0499999 -0.0466506 0.0124999 0.0499999 -0.0466506 0.0124999 0.0499999 -0.0466506 0.0124999 0.0499999 -0.0466506 0.0124999 0.0499999 -0.0466506 0.0124999 0.0499999 -0.0466506 0.0124999 0.0499999 -0.0466506 0.0124999 0.0499999 -0.0466506 0.0124999 0.0499999 -0.0433013 0.025 0 -0.0433013 0.025 0 -0.0433013 0.025 0 -0.0433013 0.025 0 -0.0433013 0.025 0 -0.0433013 0.025 0 -0.0341507 0.0341506 -0.0499999 -0.0341507 0.0341506 -0.0499999 -0.0341507 0.0341506 -0.0499999 -0.0341507 0.0341506 -0.0499999 -0.0341507 0.0341506 -0.0499999 -0.0341507 0.0341506 -0.0499999 -0.0341507 0.0341506 -0.0499999 -0.0341507 0.0341506 -0.0499999 -0.0341507 0.0341506 0.0499999 -0.0341507 0.0341506 0.0499999 -0.0341507 0.0341506 0.0499999 -0.0341507 0.0341506 0.0499999 -0.0341507 0.0341506 0.0499999 -0.0341507 0.0341506 0.0499999 -0.0341507 0.0341506 0.0499999 -0.0341507 0.0341506 0.0499999 -0.0341507 0.0341506 0.0499999 -0.0341507 0.0341506 0.0499999 -0.0341507 0.0341506 0.0499999 -0.0341507 0.0341506 0.0499999 -0.025 0.0433012 0 -0.025 0.0433012 0 -0.025 0.0433012 0 -0.025 0.0433012 0 -0.025 0.0433012 0 -0.025 0.0433012 0 -0.0125 0.0466506 -0.0499999 -0.0125 0.0466506 -0.0499999 -0.0125 0.0466506 -0.0499999 -0.0125 0.0466506 -0.0499999 -0.0125 0.0466506 -0.0499999 -0.0125 0.0466506 -0.0499999 -0.0125 0.0466506 -0.0499999 -0.0125 0.0466506 -0.0499999 -0.0125 0.0466506 -0.0499999 -0.0125 0.0466506 0.0499999 -0.0125 0.0466506 0.0499999 -0.0125 0.0466506 0.0499999 -0.0125 0.0466506 0.0499999 -0.0125 0.0466506 0.0499999 -0.0125 0.0466506 0.0499999 -0.0125 0.0466506 0.0499999 -0.0125 0.0466506 0.0499999 0.0125 0.0466506 0 0.0125 0.0466506 0 0.0125 0.0466506 0 0.0125 0.0466506 0 0.0125 0.0466506 0 0.0125 0.0466506 0 0.0341506 0.0341506 0 0.0341506 0.0341506 0 0.0341506 0.0341506 0 0.0341506 0.0341506 0 0.0341506 0.0341506 0 0.0341506 0.0341506 0 0.0466506 0.0125 0 0.0466506 0.0125 0 0.0466506 0.0125 0 0.0466506 0.0125 0 0.0466506 0.0125 0 0.0466506 0.0125 0 0.0466506 -0.0125 0 0.0466506 -0.0125 0 0.0466506 -0.0125 0 0.0466506 -0.0125 0 0.0466506 -0.0125 0 0.0466506 -0.0125 0 0.0341506 -0.0341506 0 0.0341506 -0.0341506 0 0.0341506 -0.0341506 0 0.0341506 -0.0341506 0 0.0341506 -0.0341506 0 0.0341506 -0.0341506 0 0.0125 -0.0466506 0 0.0125 -0.0466506 0 0.0125 -0.0466506 0 0.0125 -0.0466506 0 0.0125 -0.0466506 0 0.0125 -0.0466506 0 -0.0125 -0.0466506 0 -0.0125 -0.0466506 0 -0.0125 -0.0466506 0 -0.0125 -0.0466506 0 -0.0125 -0.0466506 0 -0.0125 -0.0466506 0 -0.0341506 -0.0341506 0 -0.0341506 -0.0341506 0 -0.0341506 -0.0341506 0 -0.0341506 -0.0341506 0 -0.0341506 -0.0341506 0 -0.0341506 -0.0341506 0 -0.0466506 -0.0125 0 -0.0466506 -0.0125 0 -0.0466506 -0.0125 0 -0.0466506 -0.0125 0 -0.0466506 -0.0125 0 -0.0466506 -0.0125 0 -0.0466506 0.0124999 0 -0.0466506 0.0124999 0 -0.0466506 0.0124999 0 -0.0466506 0.0124999 0 -0.0466506 0.0124999 0 -0.0466506 0.0124999 0 -0.0125 0.0466506 0 -0.0125 0.0466506 0 -0.0125 0.0466506 0 -0.0125 0.0466506 0 -0.0125 0.0466506 0 -0.0125 0.0466506 0 -0.0341507 0.0341506 0 -0.0341507 0.0341506 0 -0.0341507 0.0341506 0 -0.0341507 0.0341506 0 -0.0341507 0.0341506 0 -0.0341507 0.0341506 0 0.01875 0.0449759 -0.0499999 0.01875 0.0449759 -0.0499999 0.01875 0.0449759 -0.0499999 0.01875 0.0449759 -0.0499999 0.01875 0.0449759 -0.0499999 0.00624996 0.0483253 0.0499999 0.00624996 0.0483253 0.0499999 0.00624996 0.0483253 0.0499999 0.00624996 0.0483253 0.0499999 0.00624996 0.0483253 0.0499999 0.00624996 0.0483253 0.0499999 0 0.0499999 0.025 0 0.0499999 0.025 0 0.0499999 0.025 0 0.0499999 0.025 0 0.0499999 0.025 0 0.0499999 0.025 0.025 0.0433012 -0.025 0.025 0.0433012 -0.025 0.025 0.0433012 -0.025 0.025 0.0433012 -0.025 0.025 0.0433012 -0.025 0.025 0.0433012 -0.025 0.0387259 0.0295753 -0.0499999 0.0387259 0.0295753 -0.0499999 0.0387259 0.0295753 -0.0499999 0.0387259 0.0295753 -0.0499999 0.0387259 0.0295753 -0.0499999 0.0295753 0.0387259 0.0499999 0.0295753 0.0387259 0.0499999 0.0295753 0.0387259 0.0499999 0.0295753 0.0387259 0.0499999 0.0295753 0.0387259 0.0499999 0.0295753 0.0387259 0.0499999 0.0433012 0.025 -0.025 0.0433012 0.025 -0.025 0.0433012 0.025 -0.025 0.0433012 0.025 -0.025 0.0433012 0.025 -0.025 0.0433012 0.025 -0.025 0.0483253 0.00624996 -0.0499999 0.0483253 0.00624996 -0.0499999 0.0483253 0.00624996 -0.0499999 0.0483253 0.00624996 -0.0499999 0.0483253 0.00624996 -0.0499999 0.0449759 0.01875 0.0499999 0.0449759 0.01875 0.0499999 0.0449759 0.01875 0.0499999 0.0449759 0.01875 0.0499999 0.0449759 0.01875 0.0499999 0.0449759 0.01875 0.0499999 0.0499999 0 -0.025 0.0499999 0 -0.025 0.0499999 0 -0.025 0.0499999 0 -0.025 0.0499999 0 -0.025 0.0499999 0 -0.025 0.0449759 -0.01875 -0.0499999 0.0449759 -0.01875 -0.0499999 0.0449759 -0.01875 -0.0499999 0.0449759 -0.01875 -0.0499999 0.0449759 -0.01875 -0.0499999 0.0449759 -0.01875 -0.0499999 0.0483253 -0.00624996 0.0499999 0.0483253 -0.00624996 0.0499999 0.0483253 -0.00624996 0.0499999 0.0483253 -0.00624996 0.0499999 0.0483253 -0.00624996 0.0499999 0.0483253 -0.00624996 0.0499999 0.0433012 -0.025 -0.025 0.0433012 -0.025 -0.025 0.0433012 -0.025 -0.025 0.0433012 -0.025 -0.025 0.0433012 -0.025 -0.025 0.0433012 -0.025 -0.025 0.0295753 -0.0387259 -0.0499999 0.0295753 -0.0387259 -0.0499999 0.0295753 -0.0387259 -0.0499999 0.0295753 -0.0387259 -0.0499999 0.0295753 -0.0387259 -0.0499999 0.0387259 -0.0295753 0.0499999 0.0387259 -0.0295753 0.0499999 0.0387259 -0.0295753 0.0499999 0.0387259 -0.0295753 0.0499999 0.0387259 -0.0295753 0.0499999 0.025 -0.0433012 -0.025 0.025 -0.0433012 -0.025 0.025 -0.0433012 -0.025 0.025 -0.0433012 -0.025 0.025 -0.0433012 -0.025 0.025 -0.0433012 -0.025 0.00624996 -0.0483253 -0.0499999 0.00624996 -0.0483253 -0.0499999 0.00624996 -0.0483253 -0.0499999 0.00624996 -0.0483253 -0.0499999 0.00624996 -0.0483253 -0.0499999 0.00624996 -0.0483253 -0.0499999 0.01875 -0.0449759 0.0499999 0.01875 -0.0449759 0.0499999 0.01875 -0.0449759 0.0499999 0.01875 -0.0449759 0.0499999 0.01875 -0.0449759 0.0499999 0.01875 -0.0449759 0.0499999 0 -0.0499999 -0.025 0 -0.0499999 -0.025 0 -0.0499999 -0.025 0 -0.0499999 -0.025 0 -0.0499999 -0.025 0 -0.0499999 -0.025 -0.01875 -0.0449759 -0.0499999 -0.01875 -0.0449759 -0.0499999 -0.01875 -0.0449759 -0.0499999 -0.01875 -0.0449759 -0.0499999 -0.01875 -0.0449759 -0.0499999 -0.00624996 -0.0483253 0.0499999 -0.00624996 -0.0483253 0.0499999 -0.00624996 -0.0483253 0.0499999 -0.00624996 -0.0483253 0.0499999 -0.00624996 -0.0483253 0.0499999 -0.025 -0.0433012 -0.025 -0.025 -0.0433012 -0.025 -0.025 -0.0433012 -0.025 -0.025 -0.0433012 -0.025 -0.025 -0.0433012 -0.025 -0.025 -0.0433012 -0.025 -0.0387259 -0.0295753 -0.0499999 -0.0387259 -0.0295753 -0.0499999 -0.0387259 -0.0295753 -0.0499999 -0.0387259 -0.0295753 -0.0499999 -0.0387259 -0.0295753 -0.0499999 -0.0387259 -0.0295753 -0.0499999 -0.0295753 -0.0387259 0.0499999 -0.0295753 -0.0387259 0.0499999 -0.0295753 -0.0387259 0.0499999 -0.0295753 -0.0387259 0.0499999 -0.0295753 -0.0387259 0.0499999 -0.0433012 -0.025 -0.025 -0.0433012 -0.025 -0.025 -0.0433012 -0.025 -0.025 -0.0433012 -0.025 -0.025 -0.0433012 -0.025 -0.025 -0.0433012 -0.025 -0.025 -0.0483253 -0.00624996 -0.0499999 -0.0483253 -0.00624996 -0.0499999 -0.0483253 -0.00624996 -0.0499999 -0.0483253 -0.00624996 -0.0499999 -0.0483253 -0.00624996 -0.0499999 -0.0483253 -0.00624996 -0.0499999 -0.0449759 -0.01875 0.0499999 -0.0449759 -0.01875 0.0499999 -0.0449759 -0.01875 0.0499999 -0.0449759 -0.01875 0.0499999 -0.0449759 -0.01875 0.0499999 -0.0499999 0 -0.025 -0.0499999 0 -0.025 -0.0499999 0 -0.025 -0.0499999 0 -0.025 -0.0499999 0 -0.025 -0.0499999 0 -0.025 -0.0449759 0.01875 -0.0499999 -0.0449759 0.01875 -0.0499999 -0.0449759 0.01875 -0.0499999 -0.0449759 0.01875 -0.0499999 -0.0449759 0.01875 -0.0499999 -0.0449759 0.01875 -0.0499999 -0.0483253 0.00624996 0.0499999 -0.0483253 0.00624996 0.0499999 -0.0483253 0.00624996 0.0499999 -0.0483253 0.00624996 0.0499999 -0.0483253 0.00624996 0.0499999 -0.0483253 0.00624996 0.0499999 -0.0433013 0.025 -0.025 -0.0433013 0.025 -0.025 -0.0433013 0.025 -0.025 -0.0433013 0.025 -0.025 -0.0433013 0.025 -0.025 -0.0433013 0.025 -0.025 -0.0295753 0.0387259 -0.0499999 -0.0295753 0.0387259 -0.0499999 -0.0295753 0.0387259 -0.0499999 -0.0295753 0.0387259 -0.0499999 -0.0295753 0.0387259 -0.0499999 -0.038726 0.0295753 0.0499999 -0.038726 0.0295753 0.0499999 -0.038726 0.0295753 0.0499999 -0.038726 0.0295753 0.0499999 -0.038726 0.0295753 0.0499999 -0.025 0.0433012 -0.025 -0.025 0.0433012 -0.025 -0.025 0.0433012 -0.025 -0.025 0.0433012 -0.025 -0.025 0.0433012 -0.025 -0.025 0.0433012 -0.025 -0.00624996 0.0483253 -0.0499999 -0.00624996 0.0483253 -0.0499999 -0.00624996 0.0483253 -0.0499999 -0.00624996 0.0483253 -0.0499999 -0.00624996 0.0483253 -0.0499999 -0.01875 0.0449759 0.0499999 -0.01875 0.0449759 0.0499999 -0.01875 0.0449759 0.0499999 -0.01875 0.0449759 0.0499999 -0.01875 0.0449759 0.0499999 -0.01875 0.0449759 0.0499999 0.00624996 0.0483253 -0.0499999 0.00624996 0.0483253 -0.0499999 0.00624996 0.0483253 -0.0499999 0.00624996 0.0483253 -0.0499999 0.00624996 0.0483253 -0.0499999 0.00624996 0.0483253 -0.0499999 0.01875 0.0449759 0.0499999 0.01875 0.0449759 0.0499999 0.01875 0.0449759 0.0499999 0.01875 0.0449759 0.0499999 0.01875 0.0449759 0.0499999 0 0.0499999 -0.025 0 0.0499999 -0.025 0 0.0499999 -0.025 0 0.0499999 -0.025 0 0.0499999 -0.025 0 0.0499999 -0.025 0.025 0.0433012 0.025 0.025 0.0433012 0.025 0.025 0.0433012 0.025 0.025 0.0433012 0.025 0.025 0.0433012 0.025 0.025 0.0433012 0.025 0.0295753 0.0387259 -0.0499999 0.0295753 0.0387259 -0.0499999 0.0295753 0.0387259 -0.0499999 0.0295753 0.0387259 -0.0499999 0.0295753 0.0387259 -0.0499999 0.0295753 0.0387259 -0.0499999 0.0387259 0.0295753 0.0499999 0.0387259 0.0295753 0.0499999 0.0387259 0.0295753 0.0499999 0.0387259 0.0295753 0.0499999 0.0387259 0.0295753 0.0499999 0.0433012 0.025 0.025 0.0433012 0.025 0.025 0.0433012 0.025 0.025 0.0433012 0.025 0.025 0.0433012 0.025 0.025 0.0433012 0.025 0.025 0.0449759 0.01875 -0.0499999 0.0449759 0.01875 -0.0499999 0.0449759 0.01875 -0.0499999 0.0449759 0.01875 -0.0499999 0.0449759 0.01875 -0.0499999 0.0449759 0.01875 -0.0499999 0.0483253 0.00624996 0.0499999 0.0483253 0.00624996 0.0499999 0.0483253 0.00624996 0.0499999 0.0483253 0.00624996 0.0499999 0.0483253 0.00624996 0.0499999 0.0499999 0 0.025 0.0499999 0 0.025 0.0499999 0 0.025 0.0499999 0 0.025 0.0499999 0 0.025 0.0499999 0 0.025 0.0483253 -0.00624996 -0.0499999 0.0483253 -0.00624996 -0.0499999 0.0483253 -0.00624996 -0.0499999 0.0483253 -0.00624996 -0.0499999 0.0483253 -0.00624996 -0.0499999 0.0483253 -0.00624996 -0.0499999 0.0449759 -0.01875 0.0499999 0.0449759 -0.01875 0.0499999 0.0449759 -0.01875 0.0499999 0.0449759 -0.01875 0.0499999 0.0449759 -0.01875 0.0499999 0.0449759 -0.01875 0.0499999 0.0433012 -0.025 0.025 0.0433012 -0.025 0.025 0.0433012 -0.025 0.025 0.0433012 -0.025 0.025 0.0433012 -0.025 0.025 0.0433012 -0.025 0.025 0.0387259 -0.0295753 -0.0499999 0.0387259 -0.0295753 -0.0499999 0.0387259 -0.0295753 -0.0499999 0.0387259 -0.0295753 -0.0499999 0.0387259 -0.0295753 -0.0499999 0.0295753 -0.0387259 0.0499999 0.0295753 -0.0387259 0.0499999 0.0295753 -0.0387259 0.0499999 0.0295753 -0.0387259 0.0499999 0.0295753 -0.0387259 0.0499999 0.025 -0.0433012 0.025 0.025 -0.0433012 0.025 0.025 -0.0433012 0.025 0.025 -0.0433012 0.025 0.025 -0.0433012 0.025 0.025 -0.0433012 0.025 0.01875 -0.0449759 -0.0499999 0.01875 -0.0449759 -0.0499999 0.01875 -0.0449759 -0.0499999 0.01875 -0.0449759 -0.0499999 0.01875 -0.0449759 -0.0499999 0.01875 -0.0449759 -0.0499999 0.00624996 -0.0483253 0.0499999 0.00624996 -0.0483253 0.0499999 0.00624996 -0.0483253 0.0499999 0.00624996 -0.0483253 0.0499999 0.00624996 -0.0483253 0.0499999 0.00624996 -0.0483253 0.0499999 0 -0.0499999 0.025 0 -0.0499999 0.025 0 -0.0499999 0.025 0 -0.0499999 0.025 0 -0.0499999 0.025 0 -0.0499999 0.025 -0.00624996 -0.0483253 -0.0499999 -0.00624996 -0.0483253 -0.0499999 -0.00624996 -0.0483253 -0.0499999 -0.00624996 -0.0483253 -0.0499999 -0.00624996 -0.0483253 -0.0499999 -0.01875 -0.0449759 0.0499999 -0.01875 -0.0449759 0.0499999 -0.01875 -0.0449759 0.0499999 -0.01875 -0.0449759 0.0499999 -0.01875 -0.0449759 0.0499999 -0.01875 -0.0449759 0.0499999 -0.025 -0.0433012 0.025 -0.025 -0.0433012 0.025 -0.025 -0.0433012 0.025 -0.025 -0.0433012 0.025 -0.025 -0.0433012 0.025 -0.025 -0.0433012 0.025 -0.0295753 -0.0387259 -0.0499999 -0.0295753 -0.0387259 -0.0499999 -0.0295753 -0.0387259 -0.0499999 -0.0295753 -0.0387259 -0.0499999 -0.0295753 -0.0387259 -0.0499999 -0.0295753 -0.0387259 -0.0499999 -0.0387259 -0.0295753 0.0499999 -0.0387259 -0.0295753 0.0499999 -0.0387259 -0.0295753 0.0499999 -0.0387259 -0.0295753 0.0499999 -0.0387259 -0.0295753 0.0499999 -0.0387259 -0.0295753 0.0499999 -0.0433012 -0.025 0.025 -0.0433012 -0.025 0.025 -0.0433012 -0.025 0.025 -0.0433012 -0.025 0.025 -0.0433012 -0.025 0.025 -0.0433012 -0.025 0.025 -0.0449759 -0.01875 -0.0499999 -0.0449759 -0.01875 -0.0499999 -0.0449759 -0.01875 -0.0499999 -0.0449759 -0.01875 -0.0499999 -0.0449759 -0.01875 -0.0499999 -0.0483253 -0.00624996 0.0499999 -0.0483253 -0.00624996 0.0499999 -0.0483253 -0.00624996 0.0499999 -0.0483253 -0.00624996 0.0499999 -0.0483253 -0.00624996 0.0499999 -0.0483253 -0.00624996 0.0499999 -0.0499999 0 0.025 -0.0499999 0 0.025 -0.0499999 0 0.025 -0.0499999 0 0.025 -0.0499999 0 0.025 -0.0499999 0 0.025 -0.0483253 0.00624996 -0.0499999 -0.0483253 0.00624996 -0.0499999 -0.0483253 0.00624996 -0.0499999 -0.0483253 0.00624996 -0.0499999 -0.0483253 0.00624996 -0.0499999 -0.0449759 0.01875 0.0499999 -0.0449759 0.01875 0.0499999 -0.0449759 0.01875 0.0499999 -0.0449759 0.01875 0.0499999 -0.0449759 0.01875 0.0499999 -0.0449759 0.01875 0.0499999 -0.0433013 0.025 0.025 -0.0433013 0.025 0.025 -0.0433013 0.025 0.025 -0.0433013 0.025 0.025 -0.0433013 0.025 0.025 -0.0433013 0.025 0.025 -0.038726 0.0295753 -0.0499999 -0.038726 0.0295753 -0.0499999 -0.038726 0.0295753 -0.0499999 -0.038726 0.0295753 -0.0499999 -0.038726 0.0295753 -0.0499999 -0.0295753 0.0387259 0.0499999 -0.0295753 0.0387259 0.0499999 -0.0295753 0.0387259 0.0499999 -0.0295753 0.0387259 0.0499999 -0.0295753 0.0387259 0.0499999 -0.025 0.0433012 0.025 -0.025 0.0433012 0.025 -0.025 0.0433012 0.025 -0.025 0.0433012 0.025 -0.025 0.0433012 0.025 -0.025 0.0433012 0.025 -0.01875 0.0449759 -0.0499999 -0.01875 0.0449759 -0.0499999 -0.01875 0.0449759 -0.0499999 -0.01875 0.0449759 -0.0499999 -0.01875 0.0449759 -0.0499999 -0.01875 0.0449759 -0.0499999 -0.00624996 0.0483253 0.0499999 -0.00624996 0.0483253 0.0499999 -0.00624996 0.0483253 0.0499999 -0.00624996 0.0483253 0.0499999 -0.00624996 0.0483253 0.0499999 0.01875 0.0449759 0 0.01875 0.0449759 0 0.01875 0.0449759 0 0.01875 0.0449759 0 0.01875 0.0449759 0 0.01875 0.0449759 0 0.00624996 0.0483253 0 0.00624996 0.0483253 0 0.00624996 0.0483253 0 0.00624996 0.0483253 0 0.00624996 0.0483253 0 0.00624996 0.0483253 0 0.0125 0.0466506 -0.025 0.0125 0.0466506 -0.025 0.0125 0.0466506 -0.025 0.0125 0.0466506 -0.025 0.0125 0.0466506 -0.025 0.0125 0.0466506 -0.025 0.0125 0.0466506 0.025 0.0125 0.0466506 0.025 0.0125 0.0466506 0.025 0.0125 0.0466506 0.025 0.0125 0.0466506 0.025 0.0125 0.0466506 0.025 0.0387259 0.0295753 0 0.0387259 0.0295753 0 0.0387259 0.0295753 0 0.0387259 0.0295753 0 0.0387259 0.0295753 0 0.0387259 0.0295753 0 0.0295753 0.0387259 0 0.0295753 0.0387259 0 0.0295753 0.0387259 0 0.0295753 0.0387259 0 0.0295753 0.0387259 0 0.0295753 0.0387259 0 0.0341506 0.0341506 -0.025 0.0341506 0.0341506 -0.025 0.0341506 0.0341506 -0.025 0.0341506 0.0341506 -0.025 0.0341506 0.0341506 -0.025 0.0341506 0.0341506 -0.025 0.0341506 0.0341506 0.025 0.0341506 0.0341506 0.025 0.0341506 0.0341506 0.025 0.0341506 0.0341506 0.025 0.0341506 0.0341506 0.025 0.0341506 0.0341506 0.025 0.0483253 0.00624996 0 0.0483253 0.00624996 0 0.0483253 0.00624996 0 0.0483253 0.00624996 0 0.0483253 0.00624996 0 0.0483253 0.00624996 0 0.0449759 0.01875 0 0.0449759 0.01875 0 0.0449759 0.01875 0 0.0449759 0.01875 0 0.0449759 0.01875 0 0.0449759 0.01875 0 0.0466506 0.0125 -0.025 0.0466506 0.0125 -0.025 0.0466506 0.0125 -0.025 0.0466506 0.0125 -0.025 0.0466506 0.0125 -0.025 0.0466506 0.0125 -0.025 0.0466506 0.0125 0.025 0.0466506 0.0125 0.025 0.0466506 0.0125 0.025 0.0466506 0.0125 0.025 0.0466506 0.0125 0.025 0.0466506 0.0125 0.025 0.0449759 -0.01875 0 0.0449759 -0.01875 0 0.0449759 -0.01875 0 0.0449759 -0.01875 0 0.0449759 -0.01875 0 0.0449759 -0.01875 0 0.0483253 -0.00624996 0 0.0483253 -0.00624996 0 0.0483253 -0.00624996 0 0.0483253 -0.00624996 0 0.0483253 -0.00624996 0 0.0483253 -0.00624996 0 0.0466506 -0.0125 -0.025 0.0466506 -0.0125 -0.025 0.0466506 -0.0125 -0.025 0.0466506 -0.0125 -0.025 0.0466506 -0.0125 -0.025 0.0466506 -0.0125 -0.025 0.0466506 -0.0125 0.025 0.0466506 -0.0125 0.025 0.0466506 -0.0125 0.025 0.0466506 -0.0125 0.025 0.0466506 -0.0125 0.025 0.0466506 -0.0125 0.025 0.0295753 -0.0387259 0 0.0295753 -0.0387259 0 0.0295753 -0.0387259 0 0.0295753 -0.0387259 0 0.0295753 -0.0387259 0 0.0295753 -0.0387259 0 0.0387259 -0.0295753 0 0.0387259 -0.0295753 0 0.0387259 -0.0295753 0 0.0387259 -0.0295753 0 0.0387259 -0.0295753 0 0.0387259 -0.0295753 0 0.0341506 -0.0341506 -0.025 0.0341506 -0.0341506 -0.025 0.0341506 -0.0341506 -0.025 0.0341506 -0.0341506 -0.025 0.0341506 -0.0341506 -0.025 0.0341506 -0.0341506 -0.025 0.0341506 -0.0341506 0.025 0.0341506 -0.0341506 0.025 0.0341506 -0.0341506 0.025 0.0341506 -0.0341506 0.025 0.0341506 -0.0341506 0.025 0.0341506 -0.0341506 0.025 0.00624996 -0.0483253 0 0.00624996 -0.0483253 0 0.00624996 -0.0483253 0 0.00624996 -0.0483253 0 0.00624996 -0.0483253 0 0.00624996 -0.0483253 0 0.01875 -0.0449759 0 0.01875 -0.0449759 0 0.01875 -0.0449759 0 0.01875 -0.0449759 0 0.01875 -0.0449759 0 0.01875 -0.0449759 0 0.0125 -0.0466506 -0.025 0.0125 -0.0466506 -0.025 0.0125 -0.0466506 -0.025 0.0125 -0.0466506 -0.025 0.0125 -0.0466506 -0.025 0.0125 -0.0466506 -0.025 0.0125 -0.0466506 0.025 0.0125 -0.0466506 0.025 0.0125 -0.0466506 0.025 0.0125 -0.0466506 0.025 0.0125 -0.0466506 0.025 0.0125 -0.0466506 0.025 -0.01875 -0.0449759 0 -0.01875 -0.0449759 0 -0.01875 -0.0449759 0 -0.01875 -0.0449759 0 -0.01875 -0.0449759 0 -0.01875 -0.0449759 0 -0.00624996 -0.0483253 0 -0.00624996 -0.0483253 0 -0.00624996 -0.0483253 0 -0.00624996 -0.0483253 0 -0.00624996 -0.0483253 0 -0.00624996 -0.0483253 0 -0.0125 -0.0466506 -0.025 -0.0125 -0.0466506 -0.025 -0.0125 -0.0466506 -0.025 -0.0125 -0.0466506 -0.025 -0.0125 -0.0466506 -0.025 -0.0125 -0.0466506 -0.025 -0.0125 -0.0466506 0.025 -0.0125 -0.0466506 0.025 -0.0125 -0.0466506 0.025 -0.0125 -0.0466506 0.025 -0.0125 -0.0466506 0.025 -0.0125 -0.0466506 0.025 -0.0387259 -0.0295753 0 -0.0387259 -0.0295753 0 -0.0387259 -0.0295753 0 -0.0387259 -0.0295753 0 -0.0387259 -0.0295753 0 -0.0387259 -0.0295753 0 -0.0295753 -0.0387259 0 -0.0295753 -0.0387259 0 -0.0295753 -0.0387259 0 -0.0295753 -0.0387259 0 -0.0295753 -0.0387259 0 -0.0295753 -0.0387259 0 -0.0341506 -0.0341506 -0.025 -0.0341506 -0.0341506 -0.025 -0.0341506 -0.0341506 -0.025 -0.0341506 -0.0341506 -0.025 -0.0341506 -0.0341506 -0.025 -0.0341506 -0.0341506 -0.025 -0.0341506 -0.0341506 0.025 -0.0341506 -0.0341506 0.025 -0.0341506 -0.0341506 0.025 -0.0341506 -0.0341506 0.025 -0.0341506 -0.0341506 0.025 -0.0341506 -0.0341506 0.025 -0.0483253 -0.00624996 0 -0.0483253 -0.00624996 0 -0.0483253 -0.00624996 0 -0.0483253 -0.00624996 0 -0.0483253 -0.00624996 0 -0.0483253 -0.00624996 0 -0.0449759 -0.01875 0 -0.0449759 -0.01875 0 -0.0449759 -0.01875 0 -0.0449759 -0.01875 0 -0.0449759 -0.01875 0 -0.0449759 -0.01875 0 -0.0466506 -0.0125 -0.025 -0.0466506 -0.0125 -0.025 -0.0466506 -0.0125 -0.025 -0.0466506 -0.0125 -0.025 -0.0466506 -0.0125 -0.025 -0.0466506 -0.0125 -0.025 -0.0466506 -0.0125 0.025 -0.0466506 -0.0125 0.025 -0.0466506 -0.0125 0.025 -0.0466506 -0.0125 0.025 -0.0466506 -0.0125 0.025 -0.0466506 -0.0125 0.025 -0.0449759 0.01875 0 -0.0449759 0.01875 0 -0.0449759 0.01875 0 -0.0449759 0.01875 0 -0.0449759 0.01875 0 -0.0449759 0.01875 0 -0.0483253 0.00624996 0 -0.0483253 0.00624996 0 -0.0483253 0.00624996 0 -0.0483253 0.00624996 0 -0.0483253 0.00624996 0 -0.0483253 0.00624996 0 -0.0466506 0.0124999 -0.025 -0.0466506 0.0124999 -0.025 -0.0466506 0.0124999 -0.025 -0.0466506 0.0124999 -0.025 -0.0466506 0.0124999 -0.025 -0.0466506 0.0124999 -0.025 -0.0466506 0.0124999 0.025 -0.0466506 0.0124999 0.025 -0.0466506 0.0124999 0.025 -0.0466506 0.0124999 0.025 -0.0466506 0.0124999 0.025 -0.0466506 0.0124999 0.025 -0.0466506 0.0124999 0.025 -0.00624996 0.0483253 0 -0.00624996 0.0483253 0 -0.00624996 0.0483253 0 -0.00624996 0.0483253 0 -0.00624996 0.0483253 0 -0.00624996 0.0483253 0 -0.01875 0.0449759 0 -0.01875 0.0449759 0 -0.01875 0.0449759 0 -0.01875 0.0449759 0 -0.01875 0.0449759 0 -0.01875 0.0449759 0 -0.0125 0.0466506 -0.025 -0.0125 0.0466506 -0.025 -0.0125 0.0466506 -0.025 -0.0125 0.0466506 -0.025 -0.0125 0.0466506 -0.025 -0.0125 0.0466506 -0.025 -0.0125 0.0466506 0.025 -0.0125 0.0466506 0.025 -0.0125 0.0466506 0.025 -0.0125 0.0466506 0.025 -0.0125 0.0466506 0.025 -0.0125 0.0466506 0.025 -0.0295753 0.0387259 0 -0.0295753 0.0387259 0 -0.0295753 0.0387259 0 -0.0295753 0.0387259 0 -0.0295753 0.0387259 0 -0.0295753 0.0387259 0 -0.038726 0.0295753 0 -0.038726 0.0295753 0 -0.038726 0.0295753 0 -0.038726 0.0295753 0 -0.038726 0.0295753 0 -0.038726 0.0295753 0 -0.0341507 0.0341506 -0.025 -0.0341507 0.0341506 -0.025 -0.0341507 0.0341506 -0.025 -0.0341507 0.0341506 -0.025 -0.0341507 0.0341506 -0.025 -0.0341507 0.0341506 -0.025 -0.0341507 0.0341506 0.025 -0.0341507 0.0341506 0.025 -0.0341507 0.0341506 0.025 -0.0341507 0.0341506 0.025 -0.0341507 0.0341506 0.025 -0.0341507 0.0341506 0.025 0.01875 0.0449759 0.025 0.01875 0.0449759 0.025 0.01875 0.0449759 0.025 0.01875 0.0449759 0.025 0.01875 0.0449759 0.025 0.01875 0.0449759 0.025 0.0387259 0.0295753 0.025 0.0387259 0.0295753 0.025 0.0387259 0.0295753 0.025 0.0387259 0.0295753 0.025 0.0387259 0.0295753 0.025 0.0387259 0.0295753 0.025 0.0483253 0.00624996 0.025 0.0483253 0.00624996 0.025 0.0483253 0.00624996 0.025 0.0483253 0.00624996 0.025 0.0483253 0.00624996 0.025 0.0483253 0.00624996 0.025 0.0449759 -0.01875 0.025 0.0449759 -0.01875 0.025 0.0449759 -0.01875 0.025 0.0449759 -0.01875 0.025 0.0449759 -0.01875 0.025 0.0449759 -0.01875 0.025 0.0295753 -0.0387259 0.025 0.0295753 -0.0387259 0.025 0.0295753 -0.0387259 0.025 0.0295753 -0.0387259 0.025 0.0295753 -0.0387259 0.025 0.0295753 -0.0387259 0.025 0.00624996 -0.0483253 0.025 0.00624996 -0.0483253 0.025 0.00624996 -0.0483253 0.025 0.00624996 -0.0483253 0.025 0.00624996 -0.0483253 0.025 0.00624996 -0.0483253 0.025 -0.01875 -0.0449759 0.025 -0.01875 -0.0449759 0.025 -0.01875 -0.0449759 0.025 -0.01875 -0.0449759 0.025 -0.01875 -0.0449759 0.025 -0.01875 -0.0449759 0.025 -0.0387259 -0.0295753 0.025 -0.0387259 -0.0295753 0.025 -0.0387259 -0.0295753 0.025 -0.0387259 -0.0295753 0.025 -0.0387259 -0.0295753 0.025 -0.0387259 -0.0295753 0.025 -0.0483253 -0.00624996 0.025 -0.0483253 -0.00624996 0.025 -0.0483253 -0.00624996 0.025 -0.0483253 -0.00624996 0.025 -0.0483253 -0.00624996 0.025 -0.0483253 -0.00624996 0.025 -0.0449759 0.01875 0.025 -0.0449759 0.01875 0.025 -0.0449759 0.01875 0.025 -0.0449759 0.01875 0.025 -0.0449759 0.01875 0.025 -0.0449759 0.01875 0.025 -0.00624996 0.0483253 0.025 -0.00624996 0.0483253 0.025 -0.00624996 0.0483253 0.025 -0.00624996 0.0483253 0.025 -0.00624996 0.0483253 0.025 -0.00624996 0.0483253 0.025 -0.0295753 0.0387259 0.025 -0.0295753 0.0387259 0.025 -0.0295753 0.0387259 0.025 -0.0295753 0.0387259 0.025 -0.0295753 0.0387259 0.025 -0.0295753 0.0387259 0.025 0.01875 0.0449759 -0.025 0.01875 0.0449759 -0.025 0.01875 0.0449759 -0.025 0.01875 0.0449759 -0.025 0.01875 0.0449759 -0.025 0.01875 0.0449759 -0.025 0.00624996 0.0483253 -0.025 0.00624996 0.0483253 -0.025 0.00624996 0.0483253 -0.025 0.00624996 0.0483253 -0.025 0.00624996 0.0483253 -0.025 0.00624996 0.0483253 -0.025 0.00624996 0.0483253 0.025 0.00624996 0.0483253 0.025 0.00624996 0.0483253 0.025 0.00624996 0.0483253 0.025 0.00624996 0.0483253 0.025 0.00624996 0.0483253 0.025 0.0387259 0.0295753 -0.025 0.0387259 0.0295753 -0.025 0.0387259 0.0295753 -0.025 0.0387259 0.0295753 -0.025 0.0387259 0.0295753 -0.025 0.0387259 0.0295753 -0.025 0.0295753 0.0387259 -0.025 0.0295753 0.0387259 -0.025 0.0295753 0.0387259 -0.025 0.0295753 0.0387259 -0.025 0.0295753 0.0387259 -0.025 0.0295753 0.0387259 -0.025 0.0295753 0.0387259 0.025 0.0295753 0.0387259 0.025 0.0295753 0.0387259 0.025 0.0295753 0.0387259 0.025 0.0295753 0.0387259 0.025 0.0295753 0.0387259 0.025 0.0483253 0.00624996 -0.025 0.0483253 0.00624996 -0.025 0.0483253 0.00624996 -0.025 0.0483253 0.00624996 -0.025 0.0483253 0.00624996 -0.025 0.0483253 0.00624996 -0.025 0.0449759 0.01875 -0.025 0.0449759 0.01875 -0.025 0.0449759 0.01875 -0.025 0.0449759 0.01875 -0.025 0.0449759 0.01875 -0.025 0.0449759 0.01875 -0.025 0.0449759 0.01875 0.025 0.0449759 0.01875 0.025 0.0449759 0.01875 0.025 0.0449759 0.01875 0.025 0.0449759 0.01875 0.025 0.0449759 0.01875 0.025 0.0449759 -0.01875 -0.025 0.0449759 -0.01875 -0.025 0.0449759 -0.01875 -0.025 0.0449759 -0.01875 -0.025 0.0449759 -0.01875 -0.025 0.0449759 -0.01875 -0.025 0.0483253 -0.00624996 -0.025 0.0483253 -0.00624996 -0.025 0.0483253 -0.00624996 -0.025 0.0483253 -0.00624996 -0.025 0.0483253 -0.00624996 -0.025 0.0483253 -0.00624996 -0.025 0.0483253 -0.00624996 0.025 0.0483253 -0.00624996 0.025 0.0483253 -0.00624996 0.025 0.0483253 -0.00624996 0.025 0.0483253 -0.00624996 0.025 0.0483253 -0.00624996 0.025 0.0295753 -0.0387259 -0.025 0.0295753 -0.0387259 -0.025 0.0295753 -0.0387259 -0.025 0.0295753 -0.0387259 -0.025 0.0295753 -0.0387259 -0.025 0.0295753 -0.0387259 -0.025 0.0387259 -0.0295753 -0.025 0.0387259 -0.0295753 -0.025 0.0387259 -0.0295753 -0.025 0.0387259 -0.0295753 -0.025 0.0387259 -0.0295753 -0.025 0.0387259 -0.0295753 -0.025 0.0387259 -0.0295753 0.025 0.0387259 -0.0295753 0.025 0.0387259 -0.0295753 0.025 0.0387259 -0.0295753 0.025 0.0387259 -0.0295753 0.025 0.0387259 -0.0295753 0.025 0.00624996 -0.0483253 -0.025 0.00624996 -0.0483253 -0.025 0.00624996 -0.0483253 -0.025 0.00624996 -0.0483253 -0.025 0.00624996 -0.0483253 -0.025 0.00624996 -0.0483253 -0.025 0.01875 -0.0449759 -0.025 0.01875 -0.0449759 -0.025 0.01875 -0.0449759 -0.025 0.01875 -0.0449759 -0.025 0.01875 -0.0449759 -0.025 0.01875 -0.0449759 -0.025 0.01875 -0.0449759 0.025 0.01875 -0.0449759 0.025 0.01875 -0.0449759 0.025 0.01875 -0.0449759 0.025 0.01875 -0.0449759 0.025 0.01875 -0.0449759 0.025 -0.01875 -0.0449759 -0.025 -0.01875 -0.0449759 -0.025 -0.01875 -0.0449759 -0.025 -0.01875 -0.0449759 -0.025 -0.01875 -0.0449759 -0.025 -0.01875 -0.0449759 -0.025 -0.00624996 -0.0483253 -0.025 -0.00624996 -0.0483253 -0.025 -0.00624996 -0.0483253 -0.025 -0.00624996 -0.0483253 -0.025 -0.00624996 -0.0483253 -0.025 -0.00624996 -0.0483253 -0.025 -0.00624996 -0.0483253 0.025 -0.00624996 -0.0483253 0.025 -0.00624996 -0.0483253 0.025 -0.00624996 -0.0483253 0.025 -0.00624996 -0.0483253 0.025 -0.00624996 -0.0483253 0.025 -0.0387259 -0.0295753 -0.025 -0.0387259 -0.0295753 -0.025 -0.0387259 -0.0295753 -0.025 -0.0387259 -0.0295753 -0.025 -0.0387259 -0.0295753 -0.025 -0.0387259 -0.0295753 -0.025 -0.0295753 -0.0387259 -0.025 -0.0295753 -0.0387259 -0.025 -0.0295753 -0.0387259 -0.025 -0.0295753 -0.0387259 -0.025 -0.0295753 -0.0387259 -0.025 -0.0295753 -0.0387259 -0.025 -0.0295753 -0.0387259 0.025 -0.0295753 -0.0387259 0.025 -0.0295753 -0.0387259 0.025 -0.0295753 -0.0387259 0.025 -0.0295753 -0.0387259 0.025 -0.0295753 -0.0387259 0.025 -0.0483253 -0.00624996 -0.025 -0.0483253 -0.00624996 -0.025 -0.0483253 -0.00624996 -0.025 -0.0483253 -0.00624996 -0.025 -0.0483253 -0.00624996 -0.025 -0.0483253 -0.00624996 -0.025 -0.0449759 -0.01875 -0.025 -0.0449759 -0.01875 -0.025 -0.0449759 -0.01875 -0.025 -0.0449759 -0.01875 -0.025 -0.0449759 -0.01875 -0.025 -0.0449759 -0.01875 -0.025 -0.0449759 -0.01875 0.025 -0.0449759 -0.01875 0.025 -0.0449759 -0.01875 0.025 -0.0449759 -0.01875 0.025 -0.0449759 -0.01875 0.025 -0.0449759 -0.01875 0.025 -0.0449759 0.01875 -0.025 -0.0449759 0.01875 -0.025 -0.0449759 0.01875 -0.025 -0.0449759 0.01875 -0.025 -0.0449759 0.01875 -0.025 -0.0449759 0.01875 -0.025 -0.0483253 0.00624996 -0.025 -0.0483253 0.00624996 -0.025 -0.0483253 0.00624996 -0.025 -0.0483253 0.00624996 -0.025 -0.0483253 0.00624996 -0.025 -0.0483253 0.00624996 -0.025 -0.0483253 0.00624996 0.025 -0.0483253 0.00624996 0.025 -0.0483253 0.00624996 0.025 -0.0483253 0.00624996 0.025 -0.0483253 0.00624996 0.025 -0.00624996 0.0483253 -0.025 -0.00624996 0.0483253 -0.025 -0.00624996 0.0483253 -0.025 -0.00624996 0.0483253 -0.025 -0.00624996 0.0483253 -0.025 -0.00624996 0.0483253 -0.025 -0.01875 0.0449759 -0.025 -0.01875 0.0449759 -0.025 -0.01875 0.0449759 -0.025 -0.01875 0.0449759 -0.025 -0.01875 0.0449759 -0.025 -0.01875 0.0449759 -0.025 -0.01875 0.0449759 0.025 -0.01875 0.0449759 0.025 -0.01875 0.0449759 0.025 -0.01875 0.0449759 0.025 -0.01875 0.0449759 0.025 -0.01875 0.0449759 0.025 -0.0295753 0.0387259 -0.025 -0.0295753 0.0387259 -0.025 -0.0295753 0.0387259 -0.025 -0.0295753 0.0387259 -0.025 -0.0295753 0.0387259 -0.025 -0.0295753 0.0387259 -0.025 -0.038726 0.0295753 -0.025 -0.038726 0.0295753 -0.025 -0.038726 0.0295753 -0.025 -0.038726 0.0295753 -0.025 -0.038726 0.0295753 -0.025 -0.038726 0.0295753 -0.025 -0.038726 0.0295753 0.025 -0.038726 0.0295753 0.025 -0.038726 0.0295753 0.025 -0.038726 0.0295753 0.025 -0.038726 0.0295753 0.025 -0.038726 0.0295753 0.025 } Indices FALSE Binding BIND_PER_VERTEX Normalize 0 } NormalData { Array TRUE ArrayID 2 Vec3fArray 1428 { 0.258819 0.965926 0 0 0 -1 0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 0.258819 0.965926 0 0 0 1 -0.258819 0.965926 0 0.707107 0.707107 0 0 0 -1 0.258819 0.965926 0 0.707107 0.707107 0 0.258819 0.965926 0 0.707107 0.707107 0 0.258819 0.965926 0 0 0 1 0.965926 0.258819 0 0 0 -1 0.707107 0.707107 0 0.965926 0.258819 0 0.707107 0.707107 0 0.965926 0.258819 0 0.707107 0.707107 0 0 0 1 0.965926 -0.258819 0 0 0 -1 0.965926 0.258819 0 0.965926 -0.258819 0 0.965926 0.258819 0 0.965926 -0.258819 0 0.965926 0.258819 0 0 0 1 0.707107 -0.707107 0 0 0 -1 0.965926 -0.258819 0 0.707107 -0.707107 0 0.965926 -0.258819 0 0.707107 -0.707107 0 0.965926 -0.258819 0 0 0 1 0.258819 -0.965926 0 0 0 -1 0.707107 -0.707107 0 0.258819 -0.965926 0 0.707107 -0.707107 0 0.258819 -0.965926 0 0.707107 -0.707107 0 0 0 1 -0.258819 -0.965926 0 0 0 -1 0.258819 -0.965926 0 -0.258819 -0.965926 0 0.258819 -0.965926 0 -0.258819 -0.965926 0 0.258819 -0.965926 0 0 0 1 -0.707107 -0.707107 0 0 0 -1 -0.258819 -0.965926 0 -0.707107 -0.707107 0 -0.258819 -0.965926 0 -0.707107 -0.707107 0 -0.258819 -0.965926 0 0 0 1 -0.965926 -0.25882 0 0 0 -1 -0.707106 -0.707107 0 -0.965926 -0.25882 0 -0.707106 -0.707107 0 -0.965926 -0.25882 0 -0.707106 -0.707107 0 0 0 1 -0.965926 0.258819 0 0 0 -1 -0.965926 -0.25882 0 -0.965926 0.258819 0 -0.965926 -0.25882 0 -0.965926 0.258819 0 -0.965926 -0.25882 0 0 0 1 -0.707107 0.707106 0 0 0 -1 -0.965926 0.258819 0 -0.707107 0.707106 0 -0.965926 0.258819 0 -0.707107 0.707106 0 -0.965926 0.258819 0 0 0 1 -0.258819 0.965926 0 0 0 -1 -0.258819 0.965926 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.258819 0.965926 0 0 0 1 -0.707107 0.707106 0 0.258819 0.965926 0 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0 0 1 0 0 1 0 0 1 0 0 1 0.258819 0.965926 0 -0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.707107 0.707107 0 0.707107 0.707107 0 0.258819 0.965926 0 0.258819 0.965926 0 0.707107 0.707107 0 0.707107 0.707107 0 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0.707107 0.707107 0 0.707106 0.707107 0 0.707106 0.707107 0 0.707107 0.707107 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0.707106 0.707107 0 0.707107 0.707107 0 0.965926 0.258819 0 0.965926 0.258819 0 0.707107 0.707107 0 0.707107 0.707107 0 0.965926 0.258819 0 0.965926 0.258819 0 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 -0.258819 0 0 0 -1 0.965926 -0.258819 0 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0.965926 -0.258819 0 0.965926 -0.258819 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0.707107 -0.707107 0 0.707107 -0.707107 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0.258819 -0.965926 0 0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 -0.258819 -0.965926 0 -0.258819 -0.965926 0 0 0 1 -0.258819 -0.965926 0 -0.258819 -0.965926 0 0 0 1 0 0 1 0 0 1 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.707107 -0.707107 0 -0.707107 -0.707107 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.707107 -0.707107 0 0 0 -1 -0.707107 -0.707107 0 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 -0.707107 -0.707107 0 -0.707106 -0.707107 0 0 0 1 -0.707106 -0.707107 0 -0.707107 -0.707107 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 -0.707106 -0.707107 0 -0.707106 -0.707107 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.707106 -0.707107 0 -0.707106 -0.707107 0 -0.965926 -0.25882 0 -0.965926 -0.258819 0 0 0 -1 0 0 -1 0 0 -1 0 0 -1 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 -0.25882 0 -0.965926 -0.258819 0 0 0 1 0 0 1 0 0 1 0 0 1 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 0.258819 0 0 0 -1 -0.965926 0.258819 0 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 -0.965926 0.258819 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.707107 0.707106 0 -0.707107 0.707106 0 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.258819 0.965926 0 -0.25882 0.965926 0 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 -0.25882 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.25882 0.965926 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 -0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.707106 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707106 0.707107 0 0.707107 0.707107 0 0.707106 0.707107 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.258819 0.965926 0 -0.25882 0.965926 0 -0.25882 0.965926 0 -0.258819 0.965926 0 -0.25882 0.965926 0 -0.258819 0.965926 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 0.258819 0.965926 0 0 0 -1 0 0 -1 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0 0 1 0 0 1 0 0 1 0.258819 0.965926 0 -0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.707107 0.707107 0 0.707107 0.707107 0 0.258819 0.965926 0 0.258819 0.965926 0 0.707107 0.707107 0 0.707107 0.707107 0 0 0 -1 0 0 -1 0.707107 0.707107 0 0.707107 0.707107 0 0.707106 0.707107 0 0.707107 0.707107 0 0 0 1 0 0 1 0 0 1 0.707107 0.707107 0 0.707107 0.707107 0 0.965926 0.258819 0 0.965926 0.258819 0 0.707107 0.707107 0 0.707107 0.707107 0 0.965926 0.258819 0 0.965926 0.258819 0 0 0 -1 0 0 -1 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0 0 1 0 0 1 0 0 1 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0 0 -1 0 0 -1 0 0 -1 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0 0 1 0 0 1 0 0 1 0.965926 -0.258819 0 0.965926 -0.258819 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0 0 -1 0 0 -1 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0 0 1 0 0 1 0.707107 -0.707107 0 0.707107 -0.707107 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0 0 -1 0 0 -1 0 0 -1 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0 0 1 0 0 1 0 0 1 0.258819 -0.965926 0 0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 0 0 -1 0 0 -1 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 0 0 1 0 0 1 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.707107 -0.707107 0 -0.707107 -0.707107 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 0 0 -1 0 0 -1 0 0 -1 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 0 0 1 0 0 1 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.707106 -0.707107 0 -0.707106 -0.707107 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 0 0 -1 0 0 -1 0 0 -1 -0.965926 -0.25882 0 -0.965926 -0.258819 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 0 0 1 0 0 1 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 0.258819 0 -0.965926 0.258819 0 0 0 -1 0 0 -1 0 0 -1 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 0 0 1 0 0 1 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.707107 0.707106 0 -0.707107 0.707106 0 0 0 -1 0 0 -1 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 0 0 1 0 0 1 -0.707107 0.707106 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.258819 0.965926 0 -0.707107 0.707106 0 -0.258819 0.965926 0 0 0 -1 0 0 -1 -0.258819 0.965926 0 -0.25882 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 0 0 1 0 0 1 0 0 1 -0.258819 0.965926 0 0.258819 0.965926 0 0 0 -1 0 0 -1 0 0 -1 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0 0 1 0 0 1 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 0.258819 0.965926 0 -0.258819 0.965926 0 0.258819 0.965926 0 0.707107 0.707107 0 0.707107 0.707107 0 0.258819 0.965926 0 0.258819 0.965926 0 0.707107 0.707107 0 0.707106 0.707107 0 0 0 -1 0 0 -1 0 0 -1 0.707106 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0 0 1 0 0 1 0.707107 0.707107 0 0.707107 0.707107 0 0.965926 0.258819 0 0.965926 0.258819 0 0.707107 0.707107 0 0.707107 0.707107 0 0.965926 0.258819 0 0.965926 0.258819 0 0 0 -1 0 0 -1 0 0 -1 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0 0 1 0 0 1 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0 0 -1 0 0 -1 0 0 -1 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0 0 1 0 0 1 0 0 1 0.965926 -0.258819 0 0.965926 -0.258819 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0 0 -1 0 0 -1 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0 0 1 0 0 1 0.707107 -0.707107 0 0.707107 -0.707107 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0 0 -1 0 0 -1 0 0 -1 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0 0 1 0 0 1 0 0 1 0.258819 -0.965926 0 0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 0 0 -1 0 0 -1 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 0 0 1 -0.258819 -0.965926 0 0 0 1 0 0 1 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.707107 -0.707107 0 -0.707107 -0.707107 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 0 0 -1 0 0 -1 0 0 -1 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 0 0 1 0 0 1 0 0 1 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.707106 -0.707107 0 -0.707106 -0.707107 0 -0.965926 -0.25882 0 -0.965926 -0.258819 0 0 0 -1 0 0 -1 -0.965926 -0.258819 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 -0.258819 0 0 0 1 0 0 1 0 0 1 -0.965926 -0.258819 0 -0.965926 -0.25882 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 0.258819 0 -0.965926 0.258819 0 0 0 -1 0 0 -1 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 0 0 1 0 0 1 0 0 1 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.707107 0.707106 0 -0.707107 0.707106 0 0 0 -1 0 0 -1 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 0 0 1 0 0 1 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.258819 0.965926 0 -0.258819 0.965926 0 0 0 -1 0 0 -1 0 0 -1 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.25882 0.965926 0 0 0 1 0 0 1 -0.25882 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707106 0.707107 0 0.707107 0.707107 0 0.707106 0.707107 0 0.707107 0.707107 0 0.707106 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707106 0.707107 0 0.707106 0.707107 0 0.707107 0.707107 0 0.707106 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707106 0.707107 0 0.707106 0.707107 0 0.707107 0.707107 0 0.707106 0.707107 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.707106 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707107 -0.707107 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 -0.258819 0 -0.965926 -0.25882 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 -0.258819 0 -0.965926 -0.25882 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.25882 0.965926 0 -0.258819 0.965926 0 -0.25882 0.965926 0 -0.25882 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.25882 0.965926 0 -0.25882 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.25882 0.965926 0 -0.258819 0.965926 0 -0.25882 0.965926 0 -0.25882 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.25882 0.965926 0 -0.258819 0.965926 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.707106 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707107 -0.707107 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 -0.258819 0 -0.965926 -0.25882 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.25882 0.965926 0 -0.258819 0.965926 0 -0.25882 0.965926 0 -0.25882 0.965926 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707106 0.707107 0 0.707106 0.707107 0 0.707107 0.707107 0 0.707106 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707106 0.707107 0 0.707106 0.707107 0 0.707107 0.707107 0 0.707106 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.707106 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707107 -0.707107 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 -0.258819 0 -0.965926 -0.25882 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 -0.25882 0 -0.965926 -0.258819 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.25882 0.965926 0 -0.258819 0.965926 0 -0.25882 0.965926 0 -0.25882 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 } Indices FALSE Binding BIND_PER_VERTEX Normalize 0 } InfluenceMap 4 { VertexInfluence "Bone" 1146 { 0 0.34816 1 0.34816 2 0.34816 3 0.34816 8 0.367419 9 0.367419 10 0.367419 11 0.367419 16 0.364055 17 0.364055 18 0.364055 19 0.364055 24 0.379784 25 0.379784 26 0.379784 27 0.379784 32 0.342064 33 0.342064 34 0.342064 35 0.342064 40 0.355754 41 0.355754 42 0.355754 43 0.355754 48 0.340748 49 0.340748 50 0.340748 51 0.340748 56 0.337092 57 0.337092 58 0.337092 59 0.337092 64 0.305945 65 0.305945 66 0.305945 67 0.305945 72 0.344481 73 0.344481 74 0.344481 75 0.344481 80 0.372747 81 0.372747 82 0.372747 83 0.372747 88 0.386408 89 0.386408 90 0.386408 91 0.386408 96 0.358124 97 0.358124 98 0.358124 99 0.358124 100 0.358124 101 0.358124 102 0.358124 110 0.096263 111 0.096263 112 0.096263 113 0.096263 114 0.096263 115 0.096263 116 0.0964708 117 0.0964708 118 0.0964708 119 0.0964708 120 0.0964708 121 0.0964708 122 0.378926 123 0.378926 124 0.378926 125 0.378926 126 0.378926 127 0.378926 128 0.378926 129 0.378926 130 0.378926 131 0.378926 141 0.0968001 142 0.0968001 143 0.0968001 144 0.0968001 145 0.0968001 146 0.0968001 147 0.38288 148 0.38288 149 0.38288 150 0.38288 151 0.38288 152 0.38288 153 0.38288 162 0.0968163 163 0.0968163 164 0.0968163 165 0.0968163 166 0.0968163 167 0.0968163 168 0.380374 169 0.380374 170 0.380374 171 0.380374 172 0.380374 173 0.380374 174 0.380374 175 0.380374 176 0.380374 177 0.380374 186 0.0958862 187 0.0958862 188 0.0958862 189 0.0958862 190 0.0958862 191 0.0958862 192 0.349886 193 0.349886 194 0.349886 195 0.349886 196 0.349886 197 0.349886 198 0.349886 199 0.349886 208 0.0954361 209 0.0954361 210 0.0954361 211 0.0954361 212 0.0954361 213 0.0954361 214 0.363129 215 0.363129 216 0.363129 217 0.363129 218 0.363129 219 0.363129 220 0.363129 221 0.363129 232 0.0949529 233 0.0949529 234 0.0949529 235 0.0949529 236 0.0949529 237 0.0949529 238 0.347336 239 0.347336 240 0.347336 241 0.347336 242 0.347336 243 0.347336 244 0.347336 245 0.347336 253 0.0943446 254 0.0943446 255 0.0943446 256 0.0943446 257 0.0943446 258 0.0943446 259 0.339065 260 0.339065 261 0.339065 262 0.339065 263 0.339065 264 0.339065 265 0.339065 266 0.339065 267 0.339065 277 0.0938559 278 0.0938559 279 0.0938559 280 0.0938559 281 0.0938559 282 0.0938559 283 0.324145 284 0.324145 285 0.324145 286 0.324145 287 0.324145 288 0.324145 289 0.324145 297 0.09501 298 0.09501 299 0.09501 300 0.09501 301 0.09501 302 0.09501 303 0.378378 304 0.378378 305 0.378378 306 0.378378 307 0.378378 308 0.378378 309 0.378378 310 0.378378 311 0.378378 312 0.378378 313 0.378378 322 0.0965146 323 0.0965146 324 0.0965146 325 0.0965146 326 0.0965146 327 0.0965146 328 0.388315 329 0.388315 330 0.388315 331 0.388315 332 0.388315 333 0.388315 334 0.388315 335 0.388315 348 0.0969059 349 0.0969059 350 0.0969059 351 0.0969059 352 0.0969059 353 0.0969059 354 0.365767 355 0.365767 356 0.365767 357 0.365767 358 0.365767 359 0.365767 360 0.365767 361 0.365767 362 0.365767 371 0.0958394 372 0.0958394 373 0.0958394 374 0.0958394 375 0.0958394 376 0.0958394 377 0.0962926 378 0.0962926 379 0.0962926 380 0.0962926 381 0.0962926 382 0.0962926 383 0.0965003 384 0.0965003 385 0.0965003 386 0.0965003 387 0.0965003 388 0.0965003 389 0.0960521 390 0.0960521 391 0.0960521 392 0.0960521 393 0.0960521 394 0.0960521 395 0.0951623 396 0.0951623 397 0.0951623 398 0.0951623 399 0.0951623 400 0.0951623 401 0.0948754 402 0.0948754 403 0.0948754 404 0.0948754 405 0.0948754 406 0.0948754 407 0.0942636 408 0.0942636 409 0.0942636 410 0.0942636 411 0.0942636 412 0.0942636 413 0.0936536 414 0.0936536 415 0.0936536 416 0.0936536 417 0.0936536 418 0.0936536 419 0.0938172 420 0.0938172 421 0.0938172 422 0.0938172 423 0.0938172 424 0.0938172 425 0.0955049 426 0.0955049 427 0.0955049 428 0.0955049 429 0.0955049 430 0.0955049 431 0.096215 432 0.096215 433 0.096215 434 0.096215 435 0.096215 436 0.096215 437 0.0964742 438 0.0964742 439 0.0964742 440 0.0964742 441 0.0964742 442 0.0964742 443 0.354635 444 0.354635 445 0.354635 446 0.354635 447 0.354635 454 0.00430191 455 0.00430191 456 0.00430191 457 0.00430191 458 0.00430191 459 0.00430191 460 0.374686 461 0.374686 462 0.374686 463 0.374686 464 0.374686 465 0.374686 466 0.357486 467 0.357486 468 0.357486 469 0.357486 470 0.357486 477 0.375587 478 0.375587 479 0.375587 480 0.375587 481 0.375587 482 0.375587 483 0.373781 484 0.373781 485 0.373781 486 0.373781 487 0.373781 494 0.376868 495 0.376868 496 0.376868 497 0.376868 498 0.376868 499 0.376868 500 0.354076 501 0.354076 502 0.354076 503 0.354076 504 0.354076 505 0.354076 512 0.371253 513 0.371253 514 0.371253 515 0.371253 516 0.371253 517 0.371253 518 0.344402 519 0.344402 520 0.344402 521 0.344402 522 0.344402 528 0.371254 529 0.371254 530 0.371254 531 0.371254 532 0.371254 533 0.371254 534 0.337368 535 0.337368 536 0.337368 537 0.337368 538 0.337368 539 0.337368 546 0.368766 547 0.368766 548 0.368766 549 0.368766 550 0.368766 551 0.368766 552 0.32735 553 0.32735 554 0.32735 555 0.32735 556 0.32735 562 0.366421 563 0.366421 564 0.366421 565 0.366421 566 0.366421 567 0.366421 568 0.307046 569 0.307046 570 0.307046 571 0.307046 572 0.307046 573 0.307046 579 0.362455 580 0.362455 581 0.362455 582 0.362455 583 0.362455 584 0.362455 585 0.319194 586 0.319194 587 0.319194 588 0.319194 589 0.319194 590 0.319194 596 0.368885 597 0.368885 598 0.368885 599 0.368885 600 0.368885 601 0.368885 602 0.368849 603 0.368849 604 0.368849 605 0.368849 606 0.368849 607 0.368849 614 0.375813 615 0.375813 616 0.375813 617 0.375813 618 0.375813 619 0.375813 620 0.38096 621 0.38096 622 0.38096 623 0.38096 624 0.38096 630 0.377718 631 0.377718 632 0.377718 633 0.377718 634 0.377718 635 0.377718 636 0.359173 637 0.359173 638 0.359173 639 0.359173 640 0.359173 647 0.313242 648 0.313242 649 0.313242 650 0.313242 651 0.313242 652 0.313242 658 0.372815 659 0.372815 660 0.372815 661 0.372815 662 0.372815 663 0.372815 664 0.00514126 665 0.00514126 666 0.00514126 667 0.00514126 668 0.00514126 669 0.00514126 670 0.357776 671 0.357776 672 0.357776 673 0.357776 674 0.357776 675 0.357776 681 0.00567305 682 0.00567305 683 0.00567305 684 0.00567305 685 0.00567305 686 0.00567305 687 0.347794 688 0.347794 689 0.347794 690 0.347794 691 0.347794 692 0.347794 698 0.00545162 699 0.00545162 700 0.00545162 701 0.00545162 702 0.00545162 703 0.00545162 704 0.364472 705 0.364472 706 0.364472 707 0.364472 708 0.364472 709 0.364472 716 0.00471312 717 0.00471312 718 0.00471312 719 0.00471312 720 0.00471312 721 0.00471312 722 0.305746 723 0.305746 724 0.305746 725 0.305746 726 0.305746 732 0.00370216 733 0.00370216 734 0.00370216 735 0.00370216 736 0.00370216 737 0.00370216 738 0.343717 739 0.343717 740 0.343717 741 0.343717 742 0.343717 743 0.343717 750 0.00352383 751 0.00352383 752 0.00352383 753 0.00352383 754 0.00352383 755 0.00352383 756 0.319341 757 0.319341 758 0.319341 759 0.319341 760 0.319341 767 0.00311261 768 0.00311261 769 0.00311261 770 0.00311261 771 0.00311261 772 0.00311261 773 0.321807 774 0.321807 775 0.321807 776 0.321807 777 0.321807 778 0.321807 785 0.00276154 786 0.00276154 787 0.00276154 788 0.00276154 789 0.00276154 790 0.00276154 791 0.277267 792 0.277267 793 0.277267 794 0.277267 795 0.277267 802 0.00300527 803 0.00300527 804 0.00300527 805 0.00300527 806 0.00300527 807 0.00300527 808 0.345333 809 0.345333 810 0.345333 811 0.345333 812 0.345333 819 0.00410753 820 0.00410753 821 0.00410753 822 0.00410753 823 0.00410753 824 0.00410753 825 0.354611 826 0.354611 827 0.354611 828 0.354611 829 0.354611 835 0.00450843 836 0.00450843 837 0.00450843 838 0.00450843 839 0.00450843 840 0.00450843 841 0.371096 842 0.371096 843 0.371096 844 0.371096 845 0.371096 846 0.371096 852 0.0961208 853 0.0961208 854 0.0961208 855 0.0961208 856 0.0961208 857 0.0961208 858 0.0959629 859 0.0959629 860 0.0959629 861 0.0959629 862 0.0959629 863 0.0959629 864 0.373473 865 0.373473 866 0.373473 867 0.373473 868 0.373473 869 0.373473 870 0.00435418 871 0.00435418 872 0.00435418 873 0.00435418 874 0.00435418 875 0.00435418 876 0.0965277 877 0.0965277 878 0.0965277 879 0.0965277 880 0.0965277 881 0.0965277 882 0.0963668 883 0.0963668 884 0.0963668 885 0.0963668 886 0.0963668 887 0.0963668 888 0.376317 889 0.376317 890 0.376317 891 0.376317 892 0.376317 893 0.376317 894 0.00527549 895 0.00527549 896 0.00527549 897 0.00527549 898 0.00527549 899 0.00527549 900 0.0966689 901 0.0966689 902 0.0966689 903 0.0966689 904 0.0966689 905 0.0966689 906 0.0966253 907 0.0966253 908 0.0966253 909 0.0966253 910 0.0966253 911 0.0966253 912 0.377324 913 0.377324 914 0.377324 915 0.377324 916 0.377324 917 0.377324 918 0.00535691 919 0.00535691 920 0.00535691 921 0.00535691 922 0.00535691 923 0.00535691 924 0.0959472 925 0.0959472 926 0.0959472 927 0.0959472 928 0.0959472 929 0.0959472 930 0.0964418 931 0.0964418 932 0.0964418 933 0.0964418 934 0.0964418 935 0.0964418 936 0.375737 937 0.375737 938 0.375737 939 0.375737 940 0.375737 941 0.375737 942 0.00496679 943 0.00496679 944 0.00496679 945 0.00496679 946 0.00496679 947 0.00496679 948 0.0952691 949 0.0952691 950 0.0952691 951 0.0952691 952 0.0952691 953 0.0952691 954 0.0954447 955 0.0954447 956 0.0954447 957 0.0954447 958 0.0954447 959 0.0954447 960 0.370982 961 0.370982 962 0.370982 963 0.370982 964 0.370982 965 0.370982 966 0.00385237 967 0.00385237 968 0.00385237 969 0.00385237 970 0.00385237 971 0.00385237 972 0.0948983 973 0.0948983 974 0.0948983 975 0.0948983 976 0.0948983 977 0.0948983 978 0.095146 979 0.095146 980 0.095146 981 0.095146 982 0.095146 983 0.095146 984 0.371512 985 0.371512 986 0.371512 987 0.371512 988 0.371512 989 0.371512 990 0.00338936 991 0.00338936 992 0.00338936 993 0.00338936 994 0.00338936 995 0.00338936 996 0.0942812 997 0.0942812 998 0.0942812 999 0.0942812 1000 0.0942812 1001 0.0942812 1002 0.0945738 1003 0.0945738 1004 0.0945738 1005 0.0945738 1006 0.0945738 1007 0.0945738 1008 0.368375 1009 0.368375 1010 0.368375 1011 0.368375 1012 0.368375 1013 0.368375 1014 0.00306702 1015 0.00306702 1016 0.00306702 1017 0.00306702 1018 0.00306702 1019 0.00306702 1020 0.0936896 1021 0.0936896 1022 0.0936896 1023 0.0936896 1024 0.0936896 1025 0.0936896 1026 0.0939704 1027 0.0939704 1028 0.0939704 1029 0.0939704 1030 0.0939704 1031 0.0939704 1032 0.365541 1033 0.365541 1034 0.365541 1035 0.365541 1036 0.365541 1037 0.365541 1038 0.00270522 1039 0.00270522 1040 0.00270522 1041 0.00270522 1042 0.00270522 1043 0.00270522 1044 0.0943534 1045 0.0943534 1046 0.0943534 1047 0.0943534 1048 0.0943534 1049 0.0943534 1050 0.0937264 1051 0.0937264 1052 0.0937264 1053 0.0937264 1054 0.0937264 1055 0.0937264 1056 0.364966 1057 0.364966 1058 0.364966 1059 0.364966 1060 0.364966 1061 0.364966 1062 0.00244218 1063 0.00244218 1064 0.00244218 1065 0.00244218 1066 0.00244218 1067 0.00244218 1068 0.0960259 1069 0.0960259 1070 0.0960259 1071 0.0960259 1072 0.0960259 1073 0.0960259 1074 0.0952469 1075 0.0952469 1076 0.0952469 1077 0.0952469 1078 0.0952469 1079 0.0952469 1080 0.374353 1081 0.374353 1082 0.374353 1083 0.374353 1084 0.374353 1085 0.374353 1086 0.00335479 1087 0.00335479 1088 0.00335479 1089 0.00335479 1090 0.00335479 1091 0.00335479 1092 0.00335479 1093 0.0962022 1094 0.0962022 1095 0.0962022 1096 0.0962022 1097 0.0962022 1098 0.0962022 1099 0.096563 1100 0.096563 1101 0.096563 1102 0.096563 1103 0.096563 1104 0.096563 1105 0.37611 1106 0.37611 1107 0.37611 1108 0.37611 1109 0.37611 1110 0.37611 1111 0.0041514 1112 0.0041514 1113 0.0041514 1114 0.0041514 1115 0.0041514 1116 0.0041514 1117 0.0967142 1118 0.0967142 1119 0.0967142 1120 0.0967142 1121 0.0967142 1122 0.0967142 1123 0.0964939 1124 0.0964939 1125 0.0964939 1126 0.0964939 1127 0.0964939 1128 0.0964939 1129 0.378176 1130 0.378176 1131 0.378176 1132 0.378176 1133 0.378176 1134 0.378176 1135 0.0041101 1136 0.0041101 1137 0.0041101 1138 0.0041101 1139 0.0041101 1140 0.0041101 1141 0.00472903 1142 0.00472903 1143 0.00472903 1144 0.00472903 1145 0.00472903 1146 0.00472903 1147 0.00546944 1148 0.00546944 1149 0.00546944 1150 0.00546944 1151 0.00546944 1152 0.00546944 1153 0.00535601 1154 0.00535601 1155 0.00535601 1156 0.00535601 1157 0.00535601 1158 0.00535601 1159 0.00483459 1160 0.00483459 1161 0.00483459 1162 0.00483459 1163 0.00483459 1164 0.00483459 1165 0.00366831 1166 0.00366831 1167 0.00366831 1168 0.00366831 1169 0.00366831 1170 0.00366831 1171 0.00344825 1172 0.00344825 1173 0.00344825 1174 0.00344825 1175 0.00344825 1176 0.00344825 1177 0.00304955 1178 0.00304955 1179 0.00304955 1180 0.00304955 1181 0.00304955 1182 0.00304955 1183 0.00270885 1184 0.00270885 1185 0.00270885 1186 0.00270885 1187 0.00270885 1188 0.00270885 1189 0.00261372 1190 0.00261372 1191 0.00261372 1192 0.00261372 1193 0.00261372 1194 0.00261372 1195 0.00375396 1196 0.00375396 1197 0.00375396 1198 0.00375396 1199 0.00375396 1200 0.00375396 1201 0.00419354 1202 0.00419354 1203 0.00419354 1204 0.00419354 1205 0.00419354 1206 0.00419354 1207 0.00432968 1208 0.00432968 1209 0.00432968 1210 0.00432968 1211 0.00432968 1212 0.00432968 1213 0.374055 1214 0.374055 1215 0.374055 1216 0.374055 1217 0.374055 1218 0.374055 1219 0.372065 1220 0.372065 1221 0.372065 1222 0.372065 1223 0.372065 1224 0.372065 1225 0.00420994 1226 0.00420994 1227 0.00420994 1228 0.00420994 1229 0.00420994 1230 0.00420994 1231 0.375788 1232 0.375788 1233 0.375788 1234 0.375788 1235 0.375788 1236 0.375788 1237 0.375401 1238 0.375401 1239 0.375401 1240 0.375401 1241 0.375401 1242 0.375401 1243 0.0052079 1244 0.0052079 1245 0.0052079 1246 0.0052079 1247 0.0052079 1248 0.0052079 1249 0.377278 1250 0.377278 1251 0.377278 1252 0.377278 1253 0.377278 1254 0.377278 1255 0.375941 1256 0.375941 1257 0.375941 1258 0.375941 1259 0.375941 1260 0.375941 1261 0.00551689 1262 0.00551689 1263 0.00551689 1264 0.00551689 1265 0.00551689 1266 0.00551689 1267 0.373505 1268 0.373505 1269 0.373505 1270 0.373505 1271 0.373505 1272 0.373505 1273 0.376296 1274 0.376296 1275 0.376296 1276 0.376296 1277 0.376296 1278 0.376296 1279 0.00521576 1280 0.00521576 1281 0.00521576 1282 0.00521576 1283 0.00521576 1284 0.00521576 1285 0.371128 1286 0.371128 1287 0.371128 1288 0.371128 1289 0.371128 1290 0.371128 1291 0.369947 1292 0.369947 1293 0.369947 1294 0.369947 1295 0.369947 1296 0.369947 1297 0.00425982 1298 0.00425982 1299 0.00425982 1300 0.00425982 1301 0.00425982 1302 0.00425982 1303 0.370019 1304 0.370019 1305 0.370019 1306 0.370019 1307 0.370019 1308 0.370019 1309 0.37133 1310 0.37133 1311 0.37133 1312 0.37133 1313 0.37133 1314 0.37133 1315 0.003519 1316 0.003519 1317 0.003519 1318 0.003519 1319 0.003519 1320 0.003519 1321 0.367272 1322 0.367272 1323 0.367272 1324 0.367272 1325 0.367272 1326 0.367272 1327 0.368091 1328 0.368091 1329 0.368091 1330 0.368091 1331 0.368091 1332 0.368091 1333 0.00328618 1334 0.00328618 1335 0.00328618 1336 0.00328618 1337 0.00328618 1338 0.00328618 1339 0.36367 1340 0.36367 1341 0.36367 1342 0.36367 1343 0.36367 1344 0.36367 1345 0.365851 1346 0.365851 1347 0.365851 1348 0.365851 1349 0.365851 1350 0.365851 1351 0.00289476 1352 0.00289476 1353 0.00289476 1354 0.00289476 1355 0.00289476 1356 0.00289476 1357 0.366624 1358 0.366624 1359 0.366624 1360 0.366624 1361 0.366624 1362 0.366624 1363 0.362548 1364 0.362548 1365 0.362548 1366 0.362548 1367 0.362548 1368 0.362548 1369 0.00255603 1370 0.00255603 1371 0.00255603 1372 0.00255603 1373 0.00255603 1374 0.00255603 1375 0.375304 1376 0.375304 1377 0.375304 1378 0.375304 1379 0.375304 1380 0.375304 1381 0.37154 1382 0.37154 1383 0.37154 1384 0.37154 1385 0.37154 1386 0.37154 1387 0.00318003 1388 0.00318003 1389 0.00318003 1390 0.00318003 1391 0.00318003 1392 0.374529 1393 0.374529 1394 0.374529 1395 0.374529 1396 0.374529 1397 0.374529 1398 0.377021 1399 0.377021 1400 0.377021 1401 0.377021 1402 0.377021 1403 0.377021 1404 0.00434786 1405 0.00434786 1406 0.00434786 1407 0.00434786 1408 0.00434786 1409 0.00434786 1410 0.378212 1411 0.378212 1412 0.378212 1413 0.378212 1414 0.378212 1415 0.378212 1416 0.376587 1417 0.376587 1418 0.376587 1419 0.376587 1420 0.376587 1421 0.376587 1422 0.00412774 1423 0.00412774 1424 0.00412774 1425 0.00412774 1426 0.00412774 1427 0.00412774 } VertexInfluence "Bone_001" 1428 { 0 0.0536852 1 0.0536852 2 0.0536852 3 0.0536852 4 0.663579 5 0.663579 6 0.663579 7 0.663579 8 0.0582281 9 0.0582281 10 0.0582281 11 0.0582281 12 0.68577 13 0.68577 14 0.68577 15 0.68577 16 0.059167 17 0.059167 18 0.059167 19 0.059167 20 0.692283 21 0.692283 22 0.692283 23 0.692283 24 0.0595554 25 0.0595554 26 0.0595554 27 0.0595554 28 0.705973 29 0.705973 30 0.705973 31 0.705973 32 0.0534075 33 0.0534075 34 0.0534075 35 0.0534075 36 0.698447 37 0.698447 38 0.698447 39 0.698447 40 0.0581471 41 0.0581471 42 0.0581471 43 0.0581471 44 0.683882 45 0.683882 46 0.683882 47 0.683882 48 0.0594622 49 0.0594622 50 0.0594622 51 0.0594622 52 0.628315 53 0.628315 54 0.628315 55 0.628315 56 0.0600619 57 0.0600619 58 0.0600619 59 0.0600619 60 0.622147 61 0.622147 62 0.622147 63 0.622147 64 0.0537814 65 0.0537814 66 0.0537814 67 0.0537814 68 0.621214 69 0.621214 70 0.621214 71 0.621214 72 0.0575935 73 0.0575935 74 0.0575935 75 0.0575935 76 0.634884 77 0.634884 78 0.634884 79 0.634884 80 0.058103 81 0.058103 82 0.058103 83 0.058103 84 0.582854 85 0.582854 86 0.582854 87 0.582854 88 0.0591488 89 0.0591488 90 0.0591488 91 0.0591488 92 0.616904 93 0.616904 94 0.616904 95 0.616904 96 0.0547738 97 0.0547738 98 0.0547738 99 0.0547738 100 0.0547738 101 0.0547738 102 0.0547738 103 0.690176 104 0.690176 105 0.690176 106 0.690176 107 0.690176 108 0.690176 109 0.690176 110 0.408744 111 0.408744 112 0.408744 113 0.408744 114 0.408744 115 0.408744 116 0.410372 117 0.410372 118 0.410372 119 0.410372 120 0.410372 121 0.410372 122 0.0606667 123 0.0606667 124 0.0606667 125 0.0606667 126 0.0606667 127 0.0606667 128 0.0606667 129 0.0606667 130 0.0606667 131 0.0606667 132 0.683242 133 0.683242 134 0.683242 135 0.683242 136 0.683242 137 0.683242 138 0.683242 139 0.683242 140 0.683242 141 0.411126 142 0.411126 143 0.411126 144 0.411126 145 0.411126 146 0.411126 147 0.059725 148 0.059725 149 0.059725 150 0.059725 151 0.059725 152 0.059725 153 0.059725 154 0.699151 155 0.699151 156 0.699151 157 0.699151 158 0.699151 159 0.699151 160 0.699151 161 0.699151 162 0.411491 163 0.411491 164 0.411491 165 0.411491 166 0.411491 167 0.411491 168 0.0585465 169 0.0585465 170 0.0585465 171 0.0585465 172 0.0585465 173 0.0585465 174 0.0585465 175 0.0585465 176 0.0585465 177 0.0585465 178 0.692537 179 0.692537 180 0.692537 181 0.692537 182 0.692537 183 0.692537 184 0.692537 185 0.692537 186 0.411145 187 0.411145 188 0.411145 189 0.411145 190 0.411145 191 0.411145 192 0.0545445 193 0.0545445 194 0.0545445 195 0.0545445 196 0.0545445 197 0.0545445 198 0.0545445 199 0.0545445 200 0.704511 201 0.704511 202 0.704511 203 0.704511 204 0.704511 205 0.704511 206 0.704511 207 0.704511 208 0.410016 209 0.410016 210 0.410016 211 0.410016 212 0.410016 213 0.410016 214 0.0607347 215 0.0607347 216 0.0607347 217 0.0607347 218 0.0607347 219 0.0607347 220 0.0607347 221 0.0607347 222 0.633219 223 0.633219 224 0.633219 225 0.633219 226 0.633219 227 0.633219 228 0.633219 229 0.633219 230 0.633219 231 0.633219 232 0.407998 233 0.407998 234 0.407998 235 0.407998 236 0.407998 237 0.407998 238 0.0602369 239 0.0602369 240 0.0602369 241 0.0602369 242 0.0602369 243 0.0602369 244 0.0602369 245 0.0602369 246 0.61358 247 0.61358 248 0.61358 249 0.61358 250 0.61358 251 0.61358 252 0.61358 253 0.406953 254 0.406953 255 0.406953 256 0.406953 257 0.406953 258 0.406953 259 0.0589982 260 0.0589982 261 0.0589982 262 0.0589982 263 0.0589982 264 0.0589982 265 0.0589982 266 0.0589982 267 0.0589982 268 0.602094 269 0.602094 270 0.602094 271 0.602094 272 0.602094 273 0.602094 274 0.602094 275 0.602094 276 0.602094 277 0.406649 278 0.406649 279 0.406649 280 0.406649 281 0.406649 282 0.406649 283 0.0546197 284 0.0546197 285 0.0546197 286 0.0546197 287 0.0546197 288 0.0546197 289 0.0546197 290 0.629987 291 0.629987 292 0.629987 293 0.629987 294 0.629987 295 0.629987 296 0.629987 297 0.406314 298 0.406314 299 0.406314 300 0.406314 301 0.406314 302 0.406314 303 0.0596827 304 0.0596827 305 0.0596827 306 0.0596827 307 0.0596827 308 0.0596827 309 0.0596827 310 0.0596827 311 0.0596827 312 0.0596827 313 0.0596827 314 0.617563 315 0.617563 316 0.617563 317 0.617563 318 0.617563 319 0.617563 320 0.617563 321 0.617563 322 0.405375 323 0.405375 324 0.405375 325 0.405375 326 0.405375 327 0.405375 328 0.0589791 329 0.0589791 330 0.0589791 331 0.0589791 332 0.0589791 333 0.0589791 334 0.0589791 335 0.0589791 336 0.618805 337 0.618805 338 0.618805 339 0.618805 340 0.618805 341 0.618805 342 0.618805 343 0.618805 344 0.618805 345 0.618805 346 0.618805 347 0.618805 348 0.406375 349 0.406375 350 0.406375 351 0.406375 352 0.406375 353 0.406375 354 0.0567919 355 0.0567919 356 0.0567919 357 0.0567919 358 0.0567919 359 0.0567919 360 0.0567919 361 0.0567919 362 0.0567919 363 0.641822 364 0.641822 365 0.641822 366 0.641822 367 0.641822 368 0.641822 369 0.641822 370 0.641822 371 0.410126 372 0.410126 373 0.410126 374 0.410126 375 0.410126 376 0.410126 377 0.411144 378 0.411144 379 0.411144 380 0.411144 381 0.411144 382 0.411144 383 0.411758 384 0.411758 385 0.411758 386 0.411758 387 0.411758 388 0.411758 389 0.411717 390 0.411717 391 0.411717 392 0.411717 393 0.411717 394 0.411717 395 0.411143 396 0.411143 397 0.411143 398 0.411143 399 0.411143 400 0.411143 401 0.409299 402 0.409299 403 0.409299 404 0.409299 405 0.409299 406 0.409299 407 0.407735 408 0.407735 409 0.407735 410 0.407735 411 0.407735 412 0.407735 413 0.407069 414 0.407069 415 0.407069 416 0.407069 417 0.407069 418 0.407069 419 0.407022 420 0.407022 421 0.407022 422 0.407022 423 0.407022 424 0.407022 425 0.4061 426 0.4061 427 0.4061 428 0.4061 429 0.4061 430 0.4061 431 0.407861 432 0.407861 433 0.407861 434 0.407861 435 0.407861 436 0.407861 437 0.406035 438 0.406035 439 0.406035 440 0.406035 441 0.406035 442 0.406035 443 0.0558424 444 0.0558424 445 0.0558424 446 0.0558424 447 0.0558424 448 0.709458 449 0.709458 450 0.709458 451 0.709458 452 0.709458 453 0.709458 454 0.527779 455 0.527779 456 0.527779 457 0.527779 458 0.527779 459 0.527779 460 0.117577 461 0.117577 462 0.117577 463 0.117577 464 0.117577 465 0.117577 466 0.0593598 467 0.0593598 468 0.0593598 469 0.0593598 470 0.0593598 471 0.690194 472 0.690194 473 0.690194 474 0.690194 475 0.690194 476 0.690194 477 0.118115 478 0.118115 479 0.118115 480 0.118115 481 0.118115 482 0.118115 483 0.0590717 484 0.0590717 485 0.0590717 486 0.0590717 487 0.0590717 488 0.699241 489 0.699241 490 0.699241 491 0.699241 492 0.699241 493 0.699241 494 0.118085 495 0.118085 496 0.118085 497 0.118085 498 0.118085 499 0.118085 500 0.0552082 501 0.0552082 502 0.0552082 503 0.0552082 504 0.0552082 505 0.0552082 506 0.702913 507 0.702913 508 0.702913 509 0.702913 510 0.702913 511 0.702913 512 0.11715 513 0.11715 514 0.11715 515 0.11715 516 0.11715 517 0.11715 518 0.0556777 519 0.0556777 520 0.0556777 521 0.0556777 522 0.0556777 523 0.705151 524 0.705151 525 0.705151 526 0.705151 527 0.705151 528 0.117498 529 0.117498 530 0.117498 531 0.117498 532 0.117498 533 0.117498 534 0.0595562 535 0.0595562 536 0.0595562 537 0.0595562 538 0.0595562 539 0.0595562 540 0.675713 541 0.675713 542 0.675713 543 0.675713 544 0.675713 545 0.675713 546 0.117429 547 0.117429 548 0.117429 549 0.117429 550 0.117429 551 0.117429 552 0.0596137 553 0.0596137 554 0.0596137 555 0.0596137 556 0.0596137 557 0.636998 558 0.636998 559 0.636998 560 0.636998 561 0.636998 562 0.117068 563 0.117068 564 0.117068 565 0.117068 566 0.117068 567 0.117068 568 0.0557424 569 0.0557424 570 0.0557424 571 0.0557424 572 0.0557424 573 0.0557424 574 0.627912 575 0.627912 576 0.627912 577 0.627912 578 0.627912 579 0.116074 580 0.116074 581 0.116074 582 0.116074 583 0.116074 584 0.116074 585 0.0554518 586 0.0554518 587 0.0554518 588 0.0554518 589 0.0554518 590 0.0554518 591 0.641835 592 0.641835 593 0.641835 594 0.641835 595 0.641835 596 0.116331 597 0.116331 598 0.116331 599 0.116331 600 0.116331 601 0.116331 602 0.0582382 603 0.0582382 604 0.0582382 605 0.0582382 606 0.0582382 607 0.0582382 608 0.600511 609 0.600511 610 0.600511 611 0.600511 612 0.600511 613 0.600511 614 0.116458 615 0.116458 616 0.116458 617 0.116458 618 0.116458 619 0.116458 620 0.0584118 621 0.0584118 622 0.0584118 623 0.0584118 624 0.0584118 625 0.577143 626 0.577143 627 0.577143 628 0.577143 629 0.577143 630 0.116709 631 0.116709 632 0.116709 633 0.116709 634 0.116709 635 0.116709 636 0.055461 637 0.055461 638 0.055461 639 0.055461 640 0.055461 641 0.603492 642 0.603492 643 0.603492 644 0.603492 645 0.603492 646 0.603492 647 0.0485551 648 0.0485551 649 0.0485551 650 0.0485551 651 0.0485551 652 0.0485551 653 0.691429 654 0.691429 655 0.691429 656 0.691429 657 0.691429 658 0.116582 659 0.116582 660 0.116582 661 0.116582 662 0.116582 663 0.116582 664 0.533249 665 0.533249 666 0.533249 667 0.533249 668 0.533249 669 0.533249 670 0.0586392 671 0.0586392 672 0.0586392 673 0.0586392 674 0.0586392 675 0.0586392 676 0.695704 677 0.695704 678 0.695704 679 0.695704 680 0.695704 681 0.535191 682 0.535191 683 0.535191 684 0.535191 685 0.535191 686 0.535191 687 0.0570583 688 0.0570583 689 0.0570583 690 0.0570583 691 0.0570583 692 0.0570583 693 0.720179 694 0.720179 695 0.720179 696 0.720179 697 0.720179 698 0.537441 699 0.537441 700 0.537441 701 0.537441 702 0.537441 703 0.537441 704 0.0581637 705 0.0581637 706 0.0581637 707 0.0581637 708 0.0581637 709 0.0581637 710 0.702459 711 0.702459 712 0.702459 713 0.702459 714 0.702459 715 0.702459 716 0.536746 717 0.536746 718 0.536746 719 0.536746 720 0.536746 721 0.536746 722 0.0478414 723 0.0478414 724 0.0478414 725 0.0478414 726 0.0478414 727 0.72579 728 0.72579 729 0.72579 730 0.72579 731 0.72579 732 0.532719 733 0.532719 734 0.532719 735 0.532719 736 0.532719 737 0.532719 738 0.0586395 739 0.0586395 740 0.0586395 741 0.0586395 742 0.0586395 743 0.0586395 744 0.648489 745 0.648489 746 0.648489 747 0.648489 748 0.648489 749 0.648489 750 0.521925 751 0.521925 752 0.521925 753 0.521925 754 0.521925 755 0.521925 756 0.0575213 757 0.0575213 758 0.0575213 759 0.0575213 760 0.0575213 761 0.64483 762 0.64483 763 0.64483 764 0.64483 765 0.64483 766 0.64483 767 0.518645 768 0.518645 769 0.518645 770 0.518645 771 0.518645 772 0.518645 773 0.0587439 774 0.0587439 775 0.0587439 776 0.0587439 777 0.0587439 778 0.0587439 779 0.628935 780 0.628935 781 0.628935 782 0.628935 783 0.628935 784 0.628935 785 0.518782 786 0.518782 787 0.518782 788 0.518782 789 0.518782 790 0.518782 791 0.0484385 792 0.0484385 793 0.0484385 794 0.0484385 795 0.0484385 796 0.6766 797 0.6766 798 0.6766 799 0.6766 800 0.6766 801 0.6766 802 0.518391 803 0.518391 804 0.518391 805 0.518391 806 0.518391 807 0.518391 808 0.0577665 809 0.0577665 810 0.0577665 811 0.0577665 812 0.0577665 813 0.576605 814 0.576605 815 0.576605 816 0.576605 817 0.576605 818 0.576605 819 0.510493 820 0.510493 821 0.510493 822 0.510493 823 0.510493 824 0.510493 825 0.0560403 826 0.0560403 827 0.0560403 828 0.0560403 829 0.0560403 830 0.592783 831 0.592783 832 0.592783 833 0.592783 834 0.592783 835 0.515418 836 0.515418 837 0.515418 838 0.515418 839 0.515418 840 0.515418 841 0.058051 842 0.058051 843 0.058051 844 0.058051 845 0.058051 846 0.058051 847 0.649668 848 0.649668 849 0.649668 850 0.649668 851 0.649668 852 0.410309 853 0.410309 854 0.410309 855 0.410309 856 0.410309 857 0.410309 858 0.409519 859 0.409519 860 0.409519 861 0.409519 862 0.409519 863 0.409519 864 0.116426 865 0.116426 866 0.116426 867 0.116426 868 0.116426 869 0.116426 870 0.532346 871 0.532346 872 0.532346 873 0.532346 874 0.532346 875 0.532346 876 0.411165 877 0.411165 878 0.411165 879 0.411165 880 0.411165 881 0.411165 882 0.410794 883 0.410794 884 0.410794 885 0.410794 886 0.410794 887 0.410794 888 0.117535 889 0.117535 890 0.117535 891 0.117535 892 0.117535 893 0.117535 894 0.533844 895 0.533844 896 0.533844 897 0.533844 898 0.533844 899 0.533844 900 0.411683 901 0.411683 902 0.411683 903 0.411683 904 0.411683 905 0.411683 906 0.411475 907 0.411475 908 0.411475 909 0.411475 910 0.411475 911 0.411475 912 0.117656 913 0.117656 914 0.117656 915 0.117656 916 0.117656 917 0.117656 918 0.536717 919 0.536717 920 0.536717 921 0.536717 922 0.536717 923 0.536717 924 0.411463 925 0.411463 926 0.411463 927 0.411463 928 0.411463 929 0.411463 930 0.411641 931 0.411641 932 0.411641 933 0.411641 934 0.411641 935 0.411641 936 0.117234 937 0.117234 938 0.117234 939 0.117234 940 0.117234 941 0.117234 942 0.536611 943 0.536611 944 0.536611 945 0.536611 946 0.536611 947 0.536611 948 0.410672 949 0.410672 950 0.410672 951 0.410672 952 0.410672 953 0.410672 954 0.411195 955 0.411195 956 0.411195 957 0.411195 958 0.411195 959 0.411195 960 0.116627 961 0.116627 962 0.116627 963 0.116627 964 0.116627 965 0.116627 966 0.536487 967 0.536487 968 0.536487 969 0.536487 970 0.536487 971 0.536487 972 0.40864 973 0.40864 974 0.40864 975 0.40864 976 0.40864 977 0.40864 978 0.409689 979 0.409689 980 0.409689 981 0.409689 982 0.409689 983 0.409689 984 0.117148 985 0.117148 986 0.117148 987 0.117148 988 0.117148 989 0.117148 990 0.525977 991 0.525977 992 0.525977 993 0.525977 994 0.525977 995 0.525977 996 0.407355 997 0.407355 998 0.407355 999 0.407355 1000 0.407355 1001 0.407355 1002 0.407854 1003 0.407854 1004 0.407854 1005 0.407854 1006 0.407854 1007 0.407854 1008 0.116803 1009 0.116803 1010 0.116803 1011 0.116803 1012 0.116803 1013 0.116803 1014 0.519599 1015 0.519599 1016 0.519599 1017 0.519599 1018 0.519599 1019 0.519599 1020 0.406864 1021 0.406864 1022 0.406864 1023 0.406864 1024 0.406864 1025 0.406864 1026 0.407012 1027 0.407012 1028 0.407012 1029 0.407012 1030 0.407012 1031 0.407012 1032 0.116194 1033 0.116194 1034 0.116194 1035 0.116194 1036 0.116194 1037 0.116194 1038 0.517497 1039 0.517497 1040 0.517497 1041 0.517497 1042 0.517497 1043 0.517497 1044 0.406762 1045 0.406762 1046 0.406762 1047 0.406762 1048 0.406762 1049 0.406762 1050 0.406875 1051 0.406875 1052 0.406875 1053 0.406875 1054 0.406875 1055 0.406875 1056 0.115553 1057 0.115553 1058 0.115553 1059 0.115553 1060 0.115553 1061 0.115553 1062 0.520202 1063 0.520202 1064 0.520202 1065 0.520202 1066 0.520202 1067 0.520202 1068 0.405691 1069 0.405691 1070 0.405691 1071 0.405691 1072 0.405691 1073 0.405691 1074 0.40622 1075 0.40622 1076 0.40622 1077 0.40622 1078 0.40622 1079 0.40622 1080 0.116043 1081 0.116043 1082 0.116043 1083 0.116043 1084 0.116043 1085 0.116043 1086 0.513728 1087 0.513728 1088 0.513728 1089 0.513728 1090 0.513728 1091 0.513728 1092 0.513728 1093 0.408328 1094 0.408328 1095 0.408328 1096 0.408328 1097 0.408328 1098 0.408328 1099 0.407093 1100 0.407093 1101 0.407093 1102 0.407093 1103 0.407093 1104 0.407093 1105 0.116205 1106 0.116205 1107 0.116205 1108 0.116205 1109 0.116205 1110 0.116205 1111 0.521077 1112 0.521077 1113 0.521077 1114 0.521077 1115 0.521077 1116 0.521077 1117 0.406172 1118 0.406172 1119 0.406172 1120 0.406172 1121 0.406172 1122 0.406172 1123 0.405649 1124 0.405649 1125 0.405649 1126 0.405649 1127 0.405649 1128 0.405649 1129 0.116095 1130 0.116095 1131 0.116095 1132 0.116095 1133 0.116095 1134 0.116095 1135 0.512592 1136 0.512592 1137 0.512592 1138 0.512592 1139 0.512592 1140 0.512592 1141 0.532998 1142 0.532998 1143 0.532998 1144 0.532998 1145 0.532998 1146 0.532998 1147 0.534609 1148 0.534609 1149 0.534609 1150 0.534609 1151 0.534609 1152 0.534609 1153 0.537637 1154 0.537637 1155 0.537637 1156 0.537637 1157 0.537637 1158 0.537637 1159 0.536753 1160 0.536753 1161 0.536753 1162 0.536753 1163 0.536753 1164 0.536753 1165 0.535728 1166 0.535728 1167 0.535728 1168 0.535728 1169 0.535728 1170 0.535728 1171 0.523952 1172 0.523952 1173 0.523952 1174 0.523952 1175 0.523952 1176 0.523952 1177 0.51959 1178 0.51959 1179 0.51959 1180 0.51959 1181 0.51959 1182 0.51959 1183 0.518243 1184 0.518243 1185 0.518243 1186 0.518243 1187 0.518243 1188 0.518243 1189 0.520723 1190 0.520723 1191 0.520723 1192 0.520723 1193 0.520723 1194 0.520723 1195 0.511297 1196 0.511297 1197 0.511297 1198 0.511297 1199 0.511297 1200 0.511297 1201 0.524385 1202 0.524385 1203 0.524385 1204 0.524385 1205 0.524385 1206 0.524385 1207 0.513435 1208 0.513435 1209 0.513435 1210 0.513435 1211 0.513435 1212 0.513435 1213 0.116967 1214 0.116967 1215 0.116967 1216 0.116967 1217 0.116967 1218 0.116967 1219 0.116342 1220 0.116342 1221 0.116342 1222 0.116342 1223 0.116342 1224 0.116342 1225 0.531194 1226 0.531194 1227 0.531194 1228 0.531194 1229 0.531194 1230 0.531194 1231 0.117819 1232 0.117819 1233 0.117819 1234 0.117819 1235 0.117819 1236 0.117819 1237 0.117551 1238 0.117551 1239 0.117551 1240 0.117551 1241 0.117551 1242 0.117551 1243 0.533594 1244 0.533594 1245 0.533594 1246 0.533594 1247 0.533594 1248 0.533594 1249 0.117864 1250 0.117864 1251 0.117864 1252 0.117864 1253 0.117864 1254 0.117864 1255 0.117811 1256 0.117811 1257 0.117811 1258 0.117811 1259 0.117811 1260 0.117811 1261 0.535981 1262 0.535981 1263 0.535981 1264 0.535981 1265 0.535981 1266 0.535981 1267 0.117146 1268 0.117146 1269 0.117146 1270 0.117146 1271 0.117146 1272 0.117146 1273 0.11765 1274 0.11765 1275 0.11765 1276 0.11765 1277 0.11765 1278 0.11765 1279 0.537053 1280 0.537053 1281 0.537053 1282 0.537053 1283 0.537053 1284 0.537053 1285 0.117029 1286 0.117029 1287 0.117029 1288 0.117029 1289 0.117029 1290 0.117029 1291 0.11669 1292 0.11669 1293 0.11669 1294 0.11669 1295 0.11669 1296 0.11669 1297 0.536812 1298 0.536812 1299 0.536812 1300 0.536812 1301 0.536812 1302 0.536812 1303 0.117275 1304 0.117275 1305 0.117275 1306 0.117275 1307 0.117275 1308 0.117275 1309 0.117316 1310 0.117316 1311 0.117316 1312 0.117316 1313 0.117316 1314 0.117316 1315 0.52955 1316 0.52955 1317 0.52955 1318 0.52955 1319 0.52955 1320 0.52955 1321 0.116922 1322 0.116922 1323 0.116922 1324 0.116922 1325 0.116922 1326 0.116922 1327 0.117038 1328 0.117038 1329 0.117038 1330 0.117038 1331 0.117038 1332 0.117038 1333 0.520788 1334 0.520788 1335 0.520788 1336 0.520788 1337 0.520788 1338 0.520788 1339 0.11609 1340 0.11609 1341 0.11609 1342 0.11609 1343 0.11609 1344 0.11609 1345 0.116618 1346 0.116618 1347 0.116618 1348 0.116618 1349 0.116618 1350 0.116618 1351 0.518144 1352 0.518144 1353 0.518144 1354 0.518144 1355 0.518144 1356 0.518144 1357 0.115908 1358 0.115908 1359 0.115908 1360 0.115908 1361 0.115908 1362 0.115908 1363 0.115628 1364 0.115628 1365 0.115628 1366 0.115628 1367 0.115628 1368 0.115628 1369 0.51984 1370 0.51984 1371 0.51984 1372 0.51984 1373 0.51984 1374 0.51984 1375 0.116223 1376 0.116223 1377 0.116223 1378 0.116223 1379 0.116223 1380 0.116223 1381 0.116171 1382 0.116171 1383 0.116171 1384 0.116171 1385 0.116171 1386 0.116171 1387 0.515533 1388 0.515533 1389 0.515533 1390 0.515533 1391 0.515533 1392 0.116361 1393 0.116361 1394 0.116361 1395 0.116361 1396 0.116361 1397 0.116361 1398 0.116448 1399 0.116448 1400 0.116448 1401 0.116448 1402 0.116448 1403 0.116448 1404 0.517509 1405 0.517509 1406 0.517509 1407 0.517509 1408 0.517509 1409 0.517509 1410 0.116379 1411 0.116379 1412 0.116379 1413 0.116379 1414 0.116379 1415 0.116379 1416 0.116183 1417 0.116183 1418 0.116183 1419 0.116183 1420 0.116183 1421 0.116183 1422 0.510798 1423 0.510798 1424 0.510798 1425 0.510798 1426 0.510798 1427 0.510798 } VertexInfluence "Bone_002" 1428 { 0 0.598155 1 0.598155 2 0.598155 3 0.598155 4 0.0582628 5 0.0582628 6 0.0582628 7 0.0582628 8 0.574353 9 0.574353 10 0.574353 11 0.574353 12 0.0690805 13 0.0690805 14 0.0690805 15 0.0690805 16 0.576778 17 0.576778 18 0.576778 19 0.576778 20 0.0726471 21 0.0726471 22 0.0726471 23 0.0726471 24 0.56066 25 0.56066 26 0.56066 27 0.56066 28 0.0699223 29 0.0699223 30 0.0699223 31 0.0699223 32 0.604528 33 0.604528 34 0.604528 35 0.604528 36 0.0679579 37 0.0679579 38 0.0679579 39 0.0679579 40 0.586099 41 0.586099 42 0.586099 43 0.586099 44 0.0579427 45 0.0579427 46 0.0579427 47 0.0579427 48 0.59979 49 0.59979 50 0.59979 51 0.59979 52 0.0618867 53 0.0618867 54 0.0618867 55 0.0618867 56 0.602846 57 0.602846 58 0.602846 59 0.602846 60 0.0601907 61 0.0601907 62 0.0601907 63 0.0601907 64 0.640274 65 0.640274 66 0.640274 67 0.640274 68 0.0585797 69 0.0585797 70 0.0585797 71 0.0585797 72 0.597926 73 0.597926 74 0.597926 75 0.597926 76 0.0539 77 0.0539 78 0.0539 79 0.0539 80 0.56915 81 0.56915 82 0.56915 83 0.56915 84 0.0600049 85 0.0600049 86 0.0600049 87 0.0600049 88 0.554443 89 0.554443 90 0.554443 91 0.554443 92 0.0616531 93 0.0616531 94 0.0616531 95 0.0616531 96 0.587102 97 0.587102 98 0.587102 99 0.587102 100 0.587102 101 0.587102 102 0.587102 103 0.0637755 104 0.0637755 105 0.0637755 106 0.0637755 107 0.0637755 108 0.0637755 109 0.0637755 110 0.404264 111 0.404264 112 0.404264 113 0.404264 114 0.404264 115 0.404264 116 0.40436 117 0.40436 118 0.40436 119 0.40436 120 0.40436 121 0.40436 122 0.560407 123 0.560407 124 0.560407 125 0.560407 126 0.560407 127 0.560407 128 0.560407 129 0.560407 130 0.560407 131 0.560407 132 0.0732167 133 0.0732167 134 0.0732167 135 0.0732167 136 0.0732167 137 0.0732167 138 0.0732167 139 0.0732167 140 0.0732167 141 0.404198 142 0.404198 143 0.404198 144 0.404198 145 0.404198 146 0.404198 147 0.557395 148 0.557395 149 0.557395 150 0.557395 151 0.557395 152 0.557395 153 0.557395 154 0.0720451 155 0.0720451 156 0.0720451 157 0.0720451 158 0.0720451 159 0.0720451 160 0.0720451 161 0.0720451 162 0.404162 163 0.404162 164 0.404162 165 0.404162 166 0.404162 167 0.404162 168 0.56108 169 0.56108 170 0.56108 171 0.56108 172 0.56108 173 0.56108 174 0.56108 175 0.56108 176 0.56108 177 0.56108 178 0.0721328 179 0.0721328 180 0.0721328 181 0.0721328 182 0.0721328 183 0.0721328 184 0.0721328 185 0.0721328 186 0.404965 187 0.404965 188 0.404965 189 0.404965 190 0.404965 191 0.404965 192 0.595569 193 0.595569 194 0.595569 195 0.595569 196 0.595569 197 0.595569 198 0.595569 199 0.595569 200 0.0630788 201 0.0630788 202 0.0630788 203 0.0630788 204 0.0630788 205 0.0630788 206 0.0630788 207 0.0630788 208 0.404967 209 0.404967 210 0.404967 211 0.404967 212 0.404967 213 0.404967 214 0.576136 215 0.576136 216 0.576136 217 0.576136 218 0.576136 219 0.576136 220 0.576136 221 0.576136 222 0.0616774 223 0.0616774 224 0.0616774 225 0.0616774 226 0.0616774 227 0.0616774 228 0.0616774 229 0.0616774 230 0.0616774 231 0.0616774 232 0.405261 233 0.405261 234 0.405261 235 0.405261 236 0.405261 237 0.405261 238 0.592427 239 0.592427 240 0.592427 241 0.592427 242 0.592427 243 0.592427 244 0.592427 245 0.592427 246 0.0613356 247 0.0613356 248 0.0613356 249 0.0613356 250 0.0613356 251 0.0613356 252 0.0613356 253 0.405806 254 0.405806 255 0.405806 256 0.405806 257 0.405806 258 0.405806 259 0.601937 260 0.601937 261 0.601937 262 0.601937 263 0.601937 264 0.601937 265 0.601937 266 0.601937 267 0.601937 268 0.0612082 269 0.0612082 270 0.0612082 271 0.0612082 272 0.0612082 273 0.0612082 274 0.0612082 275 0.0612082 276 0.0612082 277 0.406295 278 0.406295 279 0.406295 280 0.406295 281 0.406295 282 0.406295 283 0.621235 284 0.621235 285 0.621235 286 0.621235 287 0.621235 288 0.621235 289 0.621235 290 0.0550011 291 0.0550011 292 0.0550011 293 0.0550011 294 0.0550011 295 0.0550011 296 0.0550011 297 0.405013 298 0.405013 299 0.405013 300 0.405013 301 0.405013 302 0.405013 303 0.561939 304 0.561939 305 0.561939 306 0.561939 307 0.561939 308 0.561939 309 0.561939 310 0.561939 311 0.561939 312 0.561939 313 0.561939 314 0.057139 315 0.057139 316 0.057139 317 0.057139 318 0.057139 319 0.057139 320 0.057139 321 0.057139 322 0.403626 323 0.403626 324 0.403626 325 0.403626 326 0.403626 327 0.403626 328 0.552706 329 0.552706 330 0.552706 331 0.552706 332 0.552706 333 0.552706 334 0.552706 335 0.552706 336 0.0588137 337 0.0588137 338 0.0588137 339 0.0588137 340 0.0588137 341 0.0588137 342 0.0588137 343 0.0588137 344 0.0588137 345 0.0588137 346 0.0588137 347 0.0588137 348 0.403396 349 0.403396 350 0.403396 351 0.403396 352 0.403396 353 0.403396 354 0.577441 355 0.577441 356 0.577441 357 0.577441 358 0.577441 359 0.577441 360 0.577441 361 0.577441 362 0.577441 363 0.0601323 364 0.0601323 365 0.0601323 366 0.0601323 367 0.0601323 368 0.0601323 369 0.0601323 370 0.0601323 371 0.404841 372 0.404841 373 0.404841 374 0.404841 375 0.404841 376 0.404841 377 0.404642 378 0.404642 379 0.404642 380 0.404642 381 0.404642 382 0.404642 383 0.404494 384 0.404494 385 0.404494 386 0.404494 387 0.404494 388 0.404494 389 0.404896 390 0.404896 391 0.404896 392 0.404896 393 0.404896 394 0.404896 395 0.405469 396 0.405469 397 0.405469 398 0.405469 399 0.405469 400 0.405469 401 0.405397 402 0.405397 403 0.405397 404 0.405397 405 0.405397 406 0.405397 407 0.405906 408 0.405906 409 0.405906 410 0.405906 411 0.405906 412 0.405906 413 0.406506 414 0.406506 415 0.406506 416 0.406506 417 0.406506 418 0.406506 419 0.40626 420 0.40626 421 0.40626 422 0.40626 423 0.40626 424 0.40626 425 0.404552 426 0.404552 427 0.404552 428 0.404552 429 0.404552 430 0.404552 431 0.404184 432 0.404184 433 0.404184 434 0.404184 435 0.404184 436 0.404184 437 0.403743 438 0.403743 439 0.403743 440 0.403743 441 0.403743 442 0.403743 443 0.589523 444 0.589523 445 0.589523 446 0.589523 447 0.589523 448 0.0552031 449 0.0552031 450 0.0552031 451 0.0552031 452 0.0552031 453 0.0552031 454 0.116564 455 0.116564 456 0.116564 457 0.116564 458 0.116564 459 0.116564 460 0.507737 461 0.507737 462 0.507737 463 0.507737 464 0.507737 465 0.507737 466 0.583154 467 0.583154 468 0.583154 469 0.583154 470 0.583154 471 0.0695297 472 0.0695297 473 0.0695297 474 0.0695297 475 0.0695297 476 0.0695297 477 0.506298 478 0.506298 479 0.506298 480 0.506298 481 0.506298 482 0.506298 483 0.567147 484 0.567147 485 0.567147 486 0.567147 487 0.567147 488 0.0712864 489 0.0712864 490 0.0712864 491 0.0712864 492 0.0712864 493 0.0712864 494 0.505047 495 0.505047 496 0.505047 497 0.505047 498 0.505047 499 0.505047 500 0.590716 501 0.590716 502 0.590716 503 0.590716 504 0.590716 505 0.590716 506 0.0699366 507 0.0699366 508 0.0699366 509 0.0699366 510 0.0699366 511 0.0699366 512 0.511597 513 0.511597 514 0.511597 515 0.511597 516 0.511597 517 0.511597 518 0.599921 519 0.599921 520 0.599921 521 0.599921 522 0.599921 523 0.0643527 524 0.0643527 525 0.0643527 526 0.0643527 527 0.0643527 528 0.511186 529 0.511186 530 0.511186 531 0.511186 532 0.511186 533 0.511186 534 0.603076 535 0.603076 536 0.603076 537 0.603076 538 0.603076 539 0.603076 540 0.059269 541 0.059269 542 0.059269 543 0.059269 544 0.059269 545 0.059269 546 0.512515 547 0.512515 548 0.512515 549 0.512515 550 0.512515 551 0.512515 552 0.613036 553 0.613036 554 0.613036 555 0.613036 556 0.613036 557 0.0611269 558 0.0611269 559 0.0611269 560 0.0611269 561 0.0611269 562 0.514589 563 0.514589 564 0.514589 565 0.514589 566 0.514589 567 0.514589 568 0.637212 569 0.637212 570 0.637212 571 0.637212 572 0.637212 573 0.637212 574 0.0601891 575 0.0601891 576 0.0601891 577 0.0601891 578 0.0601891 579 0.519667 580 0.519667 581 0.519667 582 0.519667 583 0.519667 584 0.519667 585 0.625354 586 0.625354 587 0.625354 588 0.625354 589 0.625354 590 0.625354 591 0.0561587 592 0.0561587 593 0.0561587 594 0.0561587 595 0.0561587 596 0.512534 597 0.512534 598 0.512534 599 0.512534 600 0.512534 601 0.512534 602 0.572912 603 0.572912 604 0.572912 605 0.572912 606 0.572912 607 0.572912 608 0.0574506 609 0.0574506 610 0.0574506 611 0.0574506 612 0.0574506 613 0.0574506 614 0.505162 615 0.505162 616 0.505162 617 0.505162 618 0.505162 619 0.505162 620 0.560628 621 0.560628 622 0.560628 623 0.560628 624 0.560628 625 0.0610238 626 0.0610238 627 0.0610238 628 0.0610238 629 0.0610238 630 0.503603 631 0.503603 632 0.503603 633 0.503603 634 0.503603 635 0.503603 636 0.585366 637 0.585366 638 0.585366 639 0.585366 640 0.585366 641 0.0623888 642 0.0623888 643 0.0623888 644 0.0623888 645 0.0623888 646 0.0623888 647 0.638203 648 0.638203 649 0.638203 650 0.638203 651 0.638203 652 0.638203 653 0.065283 654 0.065283 655 0.065283 656 0.065283 657 0.065283 658 0.510159 659 0.510159 660 0.510159 661 0.510159 662 0.510159 663 0.510159 664 0.118231 665 0.118231 666 0.118231 667 0.118231 668 0.118231 669 0.118231 670 0.583584 671 0.583584 672 0.583584 673 0.583584 674 0.583584 675 0.583584 676 0.0708357 677 0.0708357 678 0.0708357 679 0.0708357 680 0.0708357 681 0.119047 682 0.119047 683 0.119047 684 0.119047 685 0.119047 686 0.119047 687 0.595147 688 0.595147 689 0.595147 690 0.595147 691 0.595147 692 0.595147 693 0.0665772 694 0.0665772 695 0.0665772 696 0.0665772 697 0.0665772 698 0.118746 699 0.118746 700 0.118746 701 0.118746 702 0.118746 703 0.118746 704 0.577364 705 0.577364 706 0.577364 707 0.577364 708 0.577364 709 0.577364 710 0.0681478 711 0.0681478 712 0.0681478 713 0.0681478 714 0.0681478 715 0.0681478 716 0.118146 717 0.118146 718 0.118146 719 0.118146 720 0.118146 721 0.118146 722 0.646413 723 0.646413 724 0.646413 725 0.646413 726 0.646413 727 0.0546473 728 0.0546473 729 0.0546473 730 0.0546473 731 0.0546473 732 0.116752 733 0.116752 734 0.116752 735 0.116752 736 0.116752 737 0.116752 738 0.597644 739 0.597644 740 0.597644 741 0.597644 742 0.597644 743 0.597644 744 0.0610572 745 0.0610572 746 0.0610572 747 0.0610572 748 0.0610572 749 0.0610572 750 0.117041 751 0.117041 752 0.117041 753 0.117041 754 0.117041 755 0.117041 756 0.623138 757 0.623138 758 0.623138 759 0.623138 760 0.623138 761 0.058441 762 0.058441 763 0.058441 764 0.058441 765 0.058441 766 0.058441 767 0.116932 768 0.116932 769 0.116932 770 0.116932 771 0.116932 772 0.116932 773 0.619449 774 0.619449 775 0.619449 776 0.619449 777 0.619449 778 0.619449 779 0.0591191 780 0.0591191 781 0.0591191 782 0.0591191 783 0.0591191 784 0.0591191 785 0.116482 786 0.116482 787 0.116482 788 0.116482 789 0.116482 790 0.116482 791 0.674294 792 0.674294 793 0.674294 794 0.674294 795 0.674294 796 0.0487278 797 0.0487278 798 0.0487278 799 0.0487278 800 0.0487278 801 0.0487278 802 0.115685 803 0.115685 804 0.115685 805 0.115685 806 0.115685 807 0.115685 808 0.5969 809 0.5969 810 0.5969 811 0.5969 812 0.5969 813 0.0602494 814 0.0602494 815 0.0602494 816 0.0602494 817 0.0602494 818 0.0602494 819 0.116266 820 0.116266 821 0.116266 822 0.116266 823 0.116266 824 0.116266 825 0.589349 826 0.589349 827 0.589349 828 0.589349 829 0.589349 830 0.0617826 831 0.0617826 832 0.0617826 833 0.0617826 834 0.0617826 835 0.116548 836 0.116548 837 0.116548 838 0.116548 839 0.116548 840 0.116548 841 0.570853 842 0.570853 843 0.570853 844 0.570853 845 0.570853 846 0.570853 847 0.0593951 848 0.0593951 849 0.0593951 850 0.0593951 851 0.0593951 852 0.404638 853 0.404638 854 0.404638 855 0.404638 856 0.404638 857 0.404638 858 0.404639 859 0.404639 860 0.404639 861 0.404639 862 0.404639 863 0.404639 864 0.5101 865 0.5101 866 0.5101 867 0.5101 868 0.5101 869 0.5101 870 0.116803 871 0.116803 872 0.116803 873 0.116803 874 0.116803 875 0.116803 876 0.404444 877 0.404444 878 0.404444 879 0.404444 880 0.404444 881 0.404444 882 0.404521 883 0.404521 884 0.404521 885 0.404521 886 0.404521 887 0.404521 888 0.506148 889 0.506148 890 0.506148 891 0.506148 892 0.506148 893 0.506148 894 0.118404 895 0.118404 896 0.118404 897 0.118404 898 0.118404 899 0.118404 900 0.404315 901 0.404315 902 0.404315 903 0.404315 904 0.404315 905 0.404315 906 0.404378 907 0.404378 908 0.404378 909 0.404378 910 0.404378 911 0.404378 912 0.505019 913 0.505019 914 0.505019 915 0.505019 916 0.505019 917 0.505019 918 0.118446 919 0.118446 920 0.118446 921 0.118446 922 0.118446 923 0.118446 924 0.404965 925 0.404965 926 0.404965 927 0.404965 928 0.404965 929 0.404965 930 0.404526 931 0.404526 932 0.404526 933 0.404526 934 0.404526 935 0.404526 936 0.507029 937 0.507029 938 0.507029 939 0.507029 940 0.507029 941 0.507029 942 0.118214 943 0.118214 944 0.118214 945 0.118214 946 0.118214 947 0.118214 948 0.405236 949 0.405236 950 0.405236 951 0.405236 952 0.405236 953 0.405236 954 0.405311 955 0.405311 956 0.405311 957 0.405311 958 0.405311 959 0.405311 960 0.512392 961 0.512392 962 0.512392 963 0.512392 964 0.512392 965 0.512392 966 0.116842 967 0.116842 968 0.116842 969 0.116842 970 0.116842 971 0.116842 972 0.40534 973 0.40534 974 0.40534 975 0.40534 976 0.40534 977 0.40534 978 0.40518 979 0.40518 980 0.40518 981 0.40518 982 0.40518 983 0.40518 984 0.510807 985 0.510807 986 0.510807 987 0.510807 988 0.510807 989 0.510807 990 0.116457 991 0.116457 992 0.116457 993 0.116457 994 0.116457 995 0.116457 996 0.405873 997 0.405873 998 0.405873 999 0.405873 1000 0.405873 1001 0.405873 1002 0.405617 1003 0.405617 1004 0.405617 1005 0.405617 1006 0.405617 1007 0.405617 1008 0.513382 1009 0.513382 1010 0.513382 1011 0.513382 1012 0.513382 1013 0.513382 1014 0.116536 1015 0.116536 1016 0.116536 1017 0.116536 1018 0.116536 1019 0.116536 1020 0.406472 1021 0.406472 1022 0.406472 1023 0.406472 1024 0.406472 1025 0.406472 1026 0.406184 1027 0.406184 1028 0.406184 1029 0.406184 1030 0.406184 1031 0.406184 1032 0.516566 1033 0.516566 1034 0.516566 1035 0.516566 1036 0.516566 1037 0.516566 1038 0.11641 1039 0.11641 1040 0.11641 1041 0.11641 1042 0.11641 1043 0.11641 1044 0.405684 1045 0.405684 1046 0.405684 1047 0.405684 1048 0.405684 1049 0.405684 1050 0.406396 1051 0.406396 1052 0.406396 1053 0.406396 1054 0.406396 1055 0.406396 1056 0.517821 1057 0.517821 1058 0.517821 1059 0.517821 1060 0.517821 1061 0.517821 1062 0.115424 1063 0.115424 1064 0.115424 1065 0.115424 1066 0.115424 1067 0.115424 1068 0.404072 1069 0.404072 1070 0.404072 1071 0.404072 1072 0.404072 1073 0.404072 1074 0.404785 1075 0.404785 1076 0.404785 1077 0.404785 1078 0.404785 1079 0.404785 1080 0.507313 1081 0.507313 1082 0.507313 1083 0.507313 1084 0.507313 1085 0.507313 1086 0.115527 1087 0.115527 1088 0.115527 1089 0.115527 1090 0.115527 1091 0.115527 1092 0.115527 1093 0.404256 1094 0.404256 1095 0.404256 1096 0.404256 1097 0.404256 1098 0.404256 1099 0.403785 1100 0.403785 1101 0.403785 1102 0.403785 1103 0.403785 1104 0.403785 1105 0.50667 1106 0.50667 1107 0.50667 1108 0.50667 1109 0.50667 1110 0.50667 1111 0.116069 1112 0.116069 1113 0.116069 1114 0.116069 1115 0.116069 1116 0.116069 1117 0.403544 1118 0.403544 1119 0.403544 1120 0.403544 1121 0.403544 1122 0.403544 1123 0.403687 1124 0.403687 1125 0.403687 1126 0.403687 1127 0.403687 1128 0.403687 1129 0.503588 1130 0.503588 1131 0.503588 1132 0.503588 1133 0.503588 1134 0.503588 1135 0.115894 1136 0.115894 1137 0.115894 1138 0.115894 1139 0.115894 1140 0.115894 1141 0.117496 1142 0.117496 1143 0.117496 1144 0.117496 1145 0.117496 1146 0.117496 1147 0.118709 1148 0.118709 1149 0.118709 1150 0.118709 1151 0.118709 1152 0.118709 1153 0.11847 1154 0.11847 1155 0.11847 1156 0.11847 1157 0.11847 1158 0.11847 1159 0.118171 1160 0.118171 1161 0.118171 1162 0.118171 1163 0.118171 1164 0.118171 1165 0.116581 1166 0.116581 1167 0.116581 1168 0.116581 1169 0.116581 1170 0.116581 1171 0.116727 1172 0.116727 1173 0.116727 1174 0.116727 1175 0.116727 1176 0.116727 1177 0.116657 1178 0.116657 1179 0.116657 1180 0.116657 1181 0.116657 1182 0.116657 1183 0.116443 1184 0.116443 1185 0.116443 1186 0.116443 1187 0.116443 1188 0.116443 1189 0.115361 1190 0.115361 1191 0.115361 1192 0.115361 1193 0.115361 1194 0.115361 1195 0.115911 1196 0.115911 1197 0.115911 1198 0.115911 1199 0.115911 1200 0.115911 1201 0.11626 1202 0.11626 1203 0.11626 1204 0.11626 1205 0.11626 1206 0.11626 1207 0.116221 1208 0.116221 1209 0.116221 1210 0.116221 1211 0.116221 1212 0.116221 1213 0.508977 1214 0.508977 1215 0.508977 1216 0.508977 1217 0.508977 1218 0.508977 1219 0.511594 1220 0.511594 1221 0.511594 1222 0.511594 1223 0.511594 1224 0.511594 1225 0.116476 1226 0.116476 1227 0.116476 1228 0.116476 1229 0.116476 1230 0.116476 1231 0.506393 1232 0.506393 1233 0.506393 1234 0.506393 1235 0.506393 1236 0.506393 1237 0.507048 1238 0.507048 1239 0.507048 1240 0.507048 1241 0.507048 1242 0.507048 1243 0.118316 1244 0.118316 1245 0.118316 1246 0.118316 1247 0.118316 1248 0.118316 1249 0.504857 1250 0.504857 1251 0.504857 1252 0.504857 1253 0.504857 1254 0.504857 1255 0.506248 1256 0.506248 1257 0.506248 1258 0.506248 1259 0.506248 1260 0.506248 1261 0.118738 1262 0.118738 1263 0.118738 1264 0.118738 1265 0.118738 1266 0.118738 1267 0.50935 1268 0.50935 1269 0.50935 1270 0.50935 1271 0.50935 1272 0.50935 1273 0.506054 1274 0.506054 1275 0.506054 1276 0.506054 1277 0.506054 1278 0.506054 1279 0.11847 1280 0.11847 1281 0.11847 1282 0.11847 1283 0.11847 1284 0.11847 1285 0.511842 1286 0.511842 1287 0.511842 1288 0.511842 1289 0.511842 1290 0.511842 1291 0.513364 1292 0.513364 1293 0.513364 1294 0.513364 1295 0.513364 1296 0.513364 1297 0.117473 1298 0.117473 1299 0.117473 1300 0.117473 1301 0.117473 1302 0.117473 1303 0.511786 1304 0.511786 1305 0.511786 1306 0.511786 1307 0.511786 1308 0.511786 1309 0.511063 1310 0.511063 1311 0.511063 1312 0.511063 1313 0.511063 1314 0.511063 1315 0.116543 1316 0.116543 1317 0.116543 1318 0.116543 1319 0.116543 1320 0.116543 1321 0.514116 1322 0.514116 1323 0.514116 1324 0.514116 1325 0.514116 1326 0.514116 1327 0.513524 1328 0.513524 1329 0.513524 1330 0.513524 1331 0.513524 1332 0.513524 1333 0.116773 1334 0.116773 1335 0.116773 1336 0.116773 1337 0.116773 1338 0.116773 1339 0.518506 1340 0.518506 1341 0.518506 1342 0.518506 1343 0.518506 1344 0.518506 1345 0.515716 1346 0.515716 1347 0.515716 1348 0.515716 1349 0.515716 1350 0.515716 1351 0.116662 1352 0.116662 1353 0.116662 1354 0.116662 1355 0.116662 1356 0.116662 1357 0.515539 1358 0.515539 1359 0.515539 1360 0.515539 1361 0.515539 1362 0.515539 1363 0.520186 1364 0.520186 1365 0.520186 1366 0.520186 1367 0.520186 1368 0.520186 1369 0.115923 1370 0.115923 1371 0.115923 1372 0.115923 1373 0.115923 1374 0.115923 1375 0.50603 1376 0.50603 1377 0.50603 1378 0.50603 1379 0.50603 1380 0.50603 1381 0.510017 1382 0.510017 1383 0.510017 1384 0.510017 1385 0.510017 1386 0.510017 1387 0.115599 1388 0.115599 1389 0.115599 1390 0.115599 1391 0.115599 1392 0.508396 1393 0.508396 1394 0.508396 1395 0.508396 1396 0.508396 1397 0.508396 1398 0.505024 1399 0.505024 1400 0.505024 1401 0.505024 1402 0.505024 1403 0.505024 1404 0.116323 1405 0.116323 1406 0.116323 1407 0.116323 1408 0.116323 1409 0.116323 1410 0.503336 1411 0.503336 1412 0.503336 1413 0.503336 1414 0.503336 1415 0.503336 1416 0.504887 1417 0.504887 1418 0.504887 1419 0.504887 1420 0.504887 1421 0.504887 1422 0.116081 1423 0.116081 1424 0.116081 1425 0.116081 1426 0.116081 1427 0.116081 } VertexInfluence "Bone_003" 1032 { 4 0.278159 5 0.278159 6 0.278159 7 0.278159 12 0.24515 13 0.24515 14 0.24515 15 0.24515 20 0.23507 21 0.23507 22 0.23507 23 0.23507 28 0.224104 29 0.224104 30 0.224104 31 0.224104 36 0.233595 37 0.233595 38 0.233595 39 0.233595 44 0.258175 45 0.258175 46 0.258175 47 0.258175 52 0.309799 53 0.309799 54 0.309799 55 0.309799 60 0.317662 61 0.317662 62 0.317662 63 0.317662 68 0.320206 69 0.320206 70 0.320206 71 0.320206 76 0.311216 77 0.311216 78 0.311216 79 0.311216 84 0.357141 85 0.357141 86 0.357141 87 0.357141 92 0.321442 93 0.321442 94 0.321442 95 0.321442 103 0.246048 104 0.246048 105 0.246048 106 0.246048 107 0.246048 108 0.246048 109 0.246048 110 0.090729 111 0.090729 112 0.090729 113 0.090729 114 0.090729 115 0.090729 116 0.0887967 117 0.0887967 118 0.0887967 119 0.0887967 120 0.0887967 121 0.0887967 132 0.243541 133 0.243541 134 0.243541 135 0.243541 136 0.243541 137 0.243541 138 0.243541 139 0.243541 140 0.243541 141 0.0878763 142 0.0878763 143 0.0878763 144 0.0878763 145 0.0878763 146 0.0878763 154 0.228804 155 0.228804 156 0.228804 157 0.228804 158 0.228804 159 0.228804 160 0.228804 161 0.228804 162 0.0875306 163 0.0875306 164 0.0875306 165 0.0875306 166 0.0875306 167 0.0875306 178 0.23533 179 0.23533 180 0.23533 181 0.23533 182 0.23533 183 0.23533 184 0.23533 185 0.23533 186 0.0880036 187 0.0880036 188 0.0880036 189 0.0880036 190 0.0880036 191 0.0880036 200 0.23241 201 0.23241 202 0.23241 203 0.23241 204 0.23241 205 0.23241 206 0.23241 207 0.23241 208 0.0895814 209 0.0895814 210 0.0895814 211 0.0895814 212 0.0895814 213 0.0895814 222 0.305104 223 0.305104 224 0.305104 225 0.305104 226 0.305104 227 0.305104 228 0.305104 229 0.305104 230 0.305104 231 0.305104 232 0.0917889 233 0.0917889 234 0.0917889 235 0.0917889 236 0.0917889 237 0.0917889 246 0.325085 247 0.325085 248 0.325085 249 0.325085 250 0.325085 251 0.325085 252 0.325085 253 0.0928968 254 0.0928968 255 0.0928968 256 0.0928968 257 0.0928968 258 0.0928968 268 0.336697 269 0.336697 270 0.336697 271 0.336697 272 0.336697 273 0.336697 274 0.336697 275 0.336697 276 0.336697 277 0.0932003 278 0.0932003 279 0.0932003 280 0.0932003 281 0.0932003 282 0.0932003 290 0.315012 291 0.315012 292 0.315012 293 0.315012 294 0.315012 295 0.315012 296 0.315012 297 0.0936636 298 0.0936636 299 0.0936636 300 0.0936636 301 0.0936636 302 0.0936636 314 0.325298 315 0.325298 316 0.325298 317 0.325298 318 0.325298 319 0.325298 320 0.325298 321 0.325298 322 0.0944848 323 0.0944848 324 0.0944848 325 0.0944848 326 0.0944848 327 0.0944848 336 0.322382 337 0.322382 338 0.322382 339 0.322382 340 0.322382 341 0.322382 342 0.322382 343 0.322382 344 0.322382 345 0.322382 346 0.322382 347 0.322382 348 0.0933232 349 0.0933232 350 0.0933232 351 0.0933232 352 0.0933232 353 0.0933232 363 0.298046 364 0.298046 365 0.298046 366 0.298046 367 0.298046 368 0.298046 369 0.298046 370 0.298046 371 0.0891931 372 0.0891931 373 0.0891931 374 0.0891931 375 0.0891931 376 0.0891931 377 0.0879207 378 0.0879207 379 0.0879207 380 0.0879207 381 0.0879207 382 0.0879207 383 0.0872476 384 0.0872476 385 0.0872476 386 0.0872476 387 0.0872476 388 0.0872476 389 0.0873352 390 0.0873352 391 0.0873352 392 0.0873352 393 0.0873352 394 0.0873352 395 0.0882251 396 0.0882251 397 0.0882251 398 0.0882251 399 0.0882251 400 0.0882251 401 0.0904285 402 0.0904285 403 0.0904285 404 0.0904285 405 0.0904285 406 0.0904285 407 0.092096 408 0.092096 409 0.092096 410 0.092096 411 0.092096 412 0.092096 413 0.0927711 414 0.0927711 415 0.0927711 416 0.0927711 417 0.0927711 418 0.0927711 419 0.0929004 420 0.0929004 421 0.0929004 422 0.0929004 423 0.0929004 424 0.0929004 425 0.0938426 426 0.0938426 427 0.0938426 428 0.0938426 429 0.0938426 430 0.0938426 431 0.0917399 432 0.0917399 433 0.0917399 434 0.0917399 435 0.0917399 436 0.0917399 437 0.0937478 438 0.0937478 439 0.0937478 440 0.0937478 441 0.0937478 442 0.0937478 448 0.235339 449 0.235339 450 0.235339 451 0.235339 452 0.235339 453 0.235339 454 0.351355 455 0.351355 456 0.351355 457 0.351355 458 0.351355 459 0.351355 471 0.240276 472 0.240276 473 0.240276 474 0.240276 475 0.240276 476 0.240276 488 0.229473 489 0.229473 490 0.229473 491 0.229473 492 0.229473 493 0.229473 506 0.22715 507 0.22715 508 0.22715 509 0.22715 510 0.22715 511 0.22715 523 0.230496 524 0.230496 525 0.230496 526 0.230496 527 0.230496 528 6.19344e-005 529 6.19344e-005 530 6.19344e-005 531 6.19344e-005 532 6.19344e-005 533 6.19344e-005 540 0.265018 541 0.265018 542 0.265018 543 0.265018 544 0.265018 545 0.265018 546 0.0012902 547 0.0012902 548 0.0012902 549 0.0012902 550 0.0012902 551 0.0012902 557 0.301875 558 0.301875 559 0.301875 560 0.301875 561 0.301875 562 0.00192118 563 0.00192118 564 0.00192118 565 0.00192118 566 0.00192118 567 0.00192118 574 0.311899 575 0.311899 576 0.311899 577 0.311899 578 0.311899 579 0.00180375 580 0.00180375 581 0.00180375 582 0.00180375 583 0.00180375 584 0.00180375 591 0.302006 592 0.302006 593 0.302006 594 0.302006 595 0.302006 596 0.00225085 597 0.00225085 598 0.00225085 599 0.00225085 600 0.00225085 601 0.00225085 608 0.342038 609 0.342038 610 0.342038 611 0.342038 612 0.342038 613 0.342038 614 0.0025655 615 0.0025655 616 0.0025655 617 0.0025655 618 0.0025655 619 0.0025655 625 0.361833 626 0.361833 627 0.361833 628 0.361833 629 0.361833 630 0.00196952 631 0.00196952 632 0.00196952 633 0.00196952 634 0.00196952 635 0.00196952 641 0.334119 642 0.334119 643 0.334119 644 0.334119 645 0.334119 646 0.334119 653 0.243288 654 0.243288 655 0.243288 656 0.243288 657 0.243288 658 0.000443954 659 0.000443954 660 0.000443954 661 0.000443954 662 0.000443954 663 0.000443954 664 0.343379 665 0.343379 666 0.343379 667 0.343379 668 0.343379 669 0.343379 676 0.23346 677 0.23346 678 0.23346 679 0.23346 680 0.23346 681 0.340088 682 0.340088 683 0.340088 684 0.340088 685 0.340088 686 0.340088 693 0.213244 694 0.213244 695 0.213244 696 0.213244 697 0.213244 698 0.338361 699 0.338361 700 0.338361 701 0.338361 702 0.338361 703 0.338361 710 0.229394 711 0.229394 712 0.229394 713 0.229394 714 0.229394 715 0.229394 716 0.340395 717 0.340395 718 0.340395 719 0.340395 720 0.340395 721 0.340395 727 0.219563 728 0.219563 729 0.219563 730 0.219563 731 0.219563 732 0.346827 733 0.346827 734 0.346827 735 0.346827 736 0.346827 737 0.346827 744 0.290454 745 0.290454 746 0.290454 747 0.290454 748 0.290454 749 0.290454 750 0.35751 751 0.35751 752 0.35751 753 0.35751 754 0.35751 755 0.35751 761 0.296729 762 0.296729 763 0.296729 764 0.296729 765 0.296729 766 0.296729 767 0.36131 768 0.36131 769 0.36131 770 0.36131 771 0.36131 772 0.36131 779 0.311946 780 0.311946 781 0.311946 782 0.311946 783 0.311946 784 0.311946 785 0.361974 786 0.361974 787 0.361974 788 0.361974 789 0.361974 790 0.361974 796 0.274672 797 0.274672 798 0.274672 799 0.274672 800 0.274672 801 0.274672 802 0.362919 803 0.362919 804 0.362919 805 0.362919 806 0.362919 807 0.362919 813 0.363146 814 0.363146 815 0.363146 816 0.363146 817 0.363146 818 0.363146 819 0.369134 820 0.369134 821 0.369134 822 0.369134 823 0.369134 824 0.369134 830 0.345435 831 0.345435 832 0.345435 833 0.345435 834 0.345435 835 0.363526 836 0.363526 837 0.363526 838 0.363526 839 0.363526 840 0.363526 847 0.290937 848 0.290937 849 0.290937 850 0.290937 851 0.290937 852 0.0889319 853 0.0889319 854 0.0889319 855 0.0889319 856 0.0889319 857 0.0889319 858 0.0898799 859 0.0898799 860 0.0898799 861 0.0898799 862 0.0898799 863 0.0898799 870 0.346496 871 0.346496 872 0.346496 873 0.346496 874 0.346496 875 0.346496 876 0.0878627 877 0.0878627 878 0.0878627 879 0.0878627 880 0.0878627 881 0.0878627 882 0.0883173 883 0.0883173 884 0.0883173 885 0.0883173 886 0.0883173 887 0.0883173 894 0.342477 895 0.342477 896 0.342477 897 0.342477 898 0.342477 899 0.342477 900 0.0873327 901 0.0873327 902 0.0873327 903 0.0873327 904 0.0873327 905 0.0873327 906 0.0875221 907 0.0875221 908 0.0875221 909 0.0875221 910 0.0875221 911 0.0875221 918 0.33948 919 0.33948 920 0.33948 921 0.33948 922 0.33948 923 0.33948 924 0.0876242 925 0.0876242 926 0.0876242 927 0.0876242 928 0.0876242 929 0.0876242 930 0.0873905 931 0.0873905 932 0.0873905 933 0.0873905 934 0.0873905 935 0.0873905 942 0.340208 943 0.340208 944 0.340208 945 0.340208 946 0.340208 947 0.340208 948 0.0888228 949 0.0888228 950 0.0888228 951 0.0888228 952 0.0888228 953 0.0888228 954 0.0880492 955 0.0880492 956 0.0880492 957 0.0880492 958 0.0880492 959 0.0880492 966 0.342818 967 0.342818 968 0.342818 969 0.342818 970 0.342818 971 0.342818 972 0.091122 973 0.091122 974 0.091122 975 0.091122 976 0.091122 977 0.091122 978 0.0899847 979 0.0899847 980 0.0899847 981 0.0899847 982 0.0899847 983 0.0899847 984 0.000533675 985 0.000533675 986 0.000533675 987 0.000533675 988 0.000533675 989 0.000533675 990 0.354177 991 0.354177 992 0.354177 993 0.354177 994 0.354177 995 0.354177 996 0.0924905 997 0.0924905 998 0.0924905 999 0.0924905 1000 0.0924905 1001 0.0924905 1002 0.091955 1003 0.091955 1004 0.091955 1005 0.091955 1006 0.091955 1007 0.091955 1008 0.00144082 1009 0.00144082 1010 0.00144082 1011 0.00144082 1012 0.00144082 1013 0.00144082 1014 0.360798 1015 0.360798 1016 0.360798 1017 0.360798 1018 0.360798 1019 0.360798 1020 0.0929747 1021 0.0929747 1022 0.0929747 1023 0.0929747 1024 0.0929747 1025 0.0929747 1026 0.0928345 1027 0.0928345 1028 0.0928345 1029 0.0928345 1030 0.0928345 1031 0.0928345 1032 0.00169879 1033 0.00169879 1034 0.00169879 1035 0.00169879 1036 0.00169879 1037 0.00169879 1038 0.363388 1039 0.363388 1040 0.363388 1041 0.363388 1042 0.363388 1043 0.363388 1044 0.0932003 1045 0.0932003 1046 0.0932003 1047 0.0932003 1048 0.0932003 1049 0.0932003 1050 0.093003 1051 0.093003 1052 0.093003 1053 0.093003 1054 0.093003 1055 0.093003 1056 0.00166017 1057 0.00166017 1058 0.00166017 1059 0.00166017 1060 0.00166017 1061 0.00166017 1062 0.361931 1063 0.361931 1064 0.361931 1065 0.361931 1066 0.361931 1067 0.361931 1068 0.0942117 1069 0.0942117 1070 0.0942117 1071 0.0942117 1072 0.0942117 1073 0.0942117 1074 0.0937487 1075 0.0937487 1076 0.0937487 1077 0.0937487 1078 0.0937487 1079 0.0937487 1080 0.00229049 1081 0.00229049 1082 0.00229049 1083 0.00229049 1084 0.00229049 1085 0.00229049 1086 0.36739 1087 0.36739 1088 0.36739 1089 0.36739 1090 0.36739 1091 0.36739 1092 0.36739 1093 0.0912135 1094 0.0912135 1095 0.0912135 1096 0.0912135 1097 0.0912135 1098 0.0912135 1099 0.0925583 1100 0.0925583 1101 0.0925583 1102 0.0925583 1103 0.0925583 1104 0.0925583 1105 0.00101537 1106 0.00101537 1107 0.00101537 1108 0.00101537 1109 0.00101537 1110 0.00101537 1111 0.358702 1112 0.358702 1113 0.358702 1114 0.358702 1115 0.358702 1116 0.358702 1117 0.0935701 1118 0.0935701 1119 0.0935701 1120 0.0935701 1121 0.0935701 1122 0.0935701 1123 0.0941694 1124 0.0941694 1125 0.0941694 1126 0.0941694 1127 0.0941694 1128 0.0941694 1129 0.00214052 1130 0.00214052 1131 0.00214052 1132 0.00214052 1133 0.00214052 1134 0.00214052 1135 0.367403 1136 0.367403 1137 0.367403 1138 0.367403 1139 0.367403 1140 0.367403 1141 0.344778 1142 0.344778 1143 0.344778 1144 0.344778 1145 0.344778 1146 0.344778 1147 0.341213 1148 0.341213 1149 0.341213 1150 0.341213 1151 0.341213 1152 0.341213 1153 0.338537 1154 0.338537 1155 0.338537 1156 0.338537 1157 0.338537 1158 0.338537 1159 0.340241 1160 0.340241 1161 0.340241 1162 0.340241 1163 0.340241 1164 0.340241 1165 0.344023 1166 0.344023 1167 0.344023 1168 0.344023 1169 0.344023 1170 0.344023 1171 0.355873 1172 0.355873 1173 0.355873 1174 0.355873 1175 0.355873 1176 0.355873 1177 0.360703 1178 0.360703 1179 0.360703 1180 0.360703 1181 0.360703 1182 0.360703 1183 0.362605 1184 0.362605 1185 0.362605 1186 0.362605 1187 0.362605 1188 0.362605 1189 0.361302 1190 0.361302 1191 0.361302 1192 0.361302 1193 0.361302 1194 0.361302 1195 0.369038 1196 0.369038 1197 0.369038 1198 0.369038 1199 0.369038 1200 0.369038 1201 0.355162 1202 0.355162 1203 0.355162 1204 0.355162 1205 0.355162 1206 0.355162 1207 0.366015 1208 0.366015 1209 0.366015 1210 0.366015 1211 0.366015 1212 0.366015 1225 0.34812 1226 0.34812 1227 0.34812 1228 0.34812 1229 0.34812 1230 0.34812 1243 0.342883 1244 0.342883 1245 0.342883 1246 0.342883 1247 0.342883 1248 0.342883 1261 0.339765 1262 0.339765 1263 0.339765 1264 0.339765 1265 0.339765 1266 0.339765 1279 0.33926 1280 0.33926 1281 0.33926 1282 0.33926 1283 0.33926 1284 0.33926 1297 0.341455 1298 0.341455 1299 0.341455 1300 0.341455 1301 0.341455 1302 0.341455 1303 0.000918913 1304 0.000918913 1305 0.000918913 1306 0.000918913 1307 0.000918913 1308 0.000918913 1309 0.000292073 1310 0.000292073 1311 0.000292073 1312 0.000292073 1313 0.000292073 1314 0.000292073 1315 0.350388 1316 0.350388 1317 0.350388 1318 0.350388 1319 0.350388 1320 0.350388 1321 0.00168926 1322 0.00168926 1323 0.00168926 1324 0.00168926 1325 0.00168926 1326 0.00168926 1327 0.00134689 1328 0.00134689 1329 0.00134689 1330 0.00134689 1331 0.00134689 1332 0.00134689 1333 0.359153 1334 0.359153 1335 0.359153 1336 0.359153 1337 0.359153 1338 0.359153 1339 0.00173533 1340 0.00173533 1341 0.00173533 1342 0.00173533 1343 0.00173533 1344 0.00173533 1345 0.00181556 1346 0.00181556 1347 0.00181556 1348 0.00181556 1349 0.00181556 1350 0.00181556 1351 0.362299 1352 0.362299 1353 0.362299 1354 0.362299 1355 0.362299 1356 0.362299 1357 0.00192899 1358 0.00192899 1359 0.00192899 1360 0.00192899 1361 0.00192899 1362 0.00192899 1363 0.00163853 1364 0.00163853 1365 0.00163853 1366 0.00163853 1367 0.00163853 1368 0.00163853 1369 0.361682 1370 0.361682 1371 0.361682 1372 0.361682 1373 0.361682 1374 0.361682 1375 0.00244343 1376 0.00244343 1377 0.00244343 1378 0.00244343 1379 0.00244343 1380 0.00244343 1381 0.00227117 1382 0.00227117 1383 0.00227117 1384 0.00227117 1385 0.00227117 1386 0.00227117 1387 0.365688 1388 0.365688 1389 0.365688 1390 0.365688 1391 0.365688 1392 0.000714292 1393 0.000714292 1394 0.000714292 1395 0.000714292 1396 0.000714292 1397 0.000714292 1398 0.00150722 1399 0.00150722 1400 0.00150722 1401 0.00150722 1402 0.00150722 1403 0.00150722 1404 0.36182 1405 0.36182 1406 0.36182 1407 0.36182 1408 0.36182 1409 0.36182 1410 0.00207305 1411 0.00207305 1412 0.00207305 1413 0.00207305 1414 0.00207305 1415 0.00207305 1416 0.00234353 1417 0.00234353 1418 0.00234353 1419 0.00234353 1420 0.00234353 1421 0.00234353 1422 0.368993 1423 0.368993 1424 0.368993 1425 0.368993 1426 0.368993 1427 0.368993 } } SourceGeometry TRUE { osg::Geometry { UniqueID 23 PrimitiveSetList 1 { DrawElementsUInt GL_TRIANGLES 0 1428 { 1141 653 12 1147 676 20 1153 693 28 1159 710 36 1165 727 44 1171 744 52 1177 761 60 1183 779 68 1189 796 76 1195 813 84 762 246 268 1201 847 4 1207 830 92 303 168 259 1213 852 116 1219 858 371 1225 448 103 1231 876 141 1237 882 377 1243 471 132 1249 900 162 1255 906 383 1261 488 154 1267 924 186 1273 930 389 1279 506 178 1285 948 208 1291 954 395 1297 523 200 1303 972 232 1309 978 401 1315 540 222 1321 996 253 1327 1002 407 1333 557 247 1339 1020 277 1345 1026 413 1351 574 269 1357 1044 297 1363 1050 419 1369 591 290 1375 1068 322 1381 1074 425 608 314 1086 1392 1093 110 1398 1099 431 1404 641 363 1410 1117 348 1416 1123 437 1422 625 336 853 1142 664 372 870 1143 871 104 654 877 1148 681 378 894 1149 895 133 677 901 1154 698 384 918 1155 919 155 694 925 1160 716 390 942 1161 943 179 711 949 1166 732 396 966 1167 967 201 728 973 1172 750 402 990 1173 991 223 745 997 1178 767 408 1014 1179 1015 248 763 1021 1184 785 414 1038 1185 1039 270 780 1045 1190 802 420 1062 1191 1063 291 797 1069 1196 819 426 1087 1197 1088 315 814 1094 1202 454 432 1111 1203 1112 364 848 1118 1208 835 438 1135 1209 1136 337 831 443 1214 460 96 864 1215 865 373 854 647 1220 866 0 658 1221 659 111 859 860 1226 872 112 455 1227 456 5 449 466 1232 477 122 888 1233 889 379 878 670 1238 890 8 461 1239 462 117 883 884 1244 896 118 665 1245 666 13 472 483 1250 494 147 912 1251 913 385 902 687 1256 914 16 478 1257 479 142 907 908 1262 920 143 682 1263 683 21 489 500 1268 512 169 936 1269 937 391 926 704 1274 938 24 495 1275 496 163 931 932 1280 944 164 699 1281 700 29 507 518 1286 528 192 960 1287 961 397 950 722 1292 962 32 513 1293 514 187 955 956 1298 968 188 717 1299 718 37 524 534 1304 546 214 984 1305 985 403 974 738 1310 986 40 529 1311 530 209 979 980 1316 992 210 733 1317 734 45 541 552 1322 562 238 1008 1323 1009 409 998 756 1328 1010 48 547 1329 548 233 1003 1004 1334 1016 234 751 1335 752 53 558 568 1340 579 260 1032 1341 1033 415 1022 773 1346 1034 56 563 1347 564 254 1027 1028 1352 1040 255 768 1353 769 61 575 585 1358 596 283 1056 1359 1057 421 1046 791 1364 1058 64 580 1365 581 278 1051 1052 1370 1064 279 786 1371 787 69 592 602 1376 614 304 1080 1377 1081 427 1070 808 1382 1082 72 597 1383 598 298 1075 1076 1387 1089 299 803 1388 804 77 609 636 1393 660 354 1105 1394 1106 433 1095 841 1399 1107 88 630 1400 631 349 1100 1101 1405 1113 350 836 1406 837 93 642 620 1411 632 328 1129 1412 1130 439 1119 825 1417 1131 80 615 1418 616 323 1124 1125 1423 1137 324 820 1424 821 85 626 667 1144 14 684 1150 22 701 1156 30 719 1162 38 735 1168 46 753 1174 54 770 1180 62 788 1186 70 805 1192 78 822 1198 86 473 15 655 105 450 365 451 6 849 798 316 610 338 643 832 87 815 627 317 339 816 79 799 611 593 781 292 594 71 782 576 764 271 577 63 765 559 746 249 560 55 747 729 202 542 543 47 730 525 712 203 526 39 713 695 156 508 509 31 696 678 134 490 491 23 679 474 106 135 714 180 204 452 850 366 644 94 833 817 340 628 748 224 250 157 136 341 137 158 492 475 656 107 457 1204 7 159 181 510 783 272 293 182 160 342 318 273 225 343 138 367 800 294 319 295 274 320 251 226 275 205 183 227 321 228 344 229 184 345 206 230 544 139 108 368 346 369 645 838 1210 95 637 1 648 444 671 97 445 9 672 467 688 123 468 17 689 484 705 148 485 25 706 723 193 501 502 33 724 519 739 194 520 41 740 757 239 535 536 49 758 553 774 240 554 57 775 792 284 569 570 65 793 809 305 586 587 73 810 826 329 603 604 81 827 621 842 330 622 89 843 355 638 649 331 306 605 98 124 356 776 261 241 463 1216 119 125 307 357 332 358 308 741 215 195 309 285 588 690 149 126 196 170 503 286 262 571 650 99 359 242 216 537 150 171 127 197 217 172 243 263 218 287 310 264 707 173 151 333 844 360 128 174 311 175 219 265 100 673 129 867 1222 374 873 1228 109 480 1234 144 891 1240 380 897 1246 140 497 1252 165 915 1258 386 921 1264 161 515 1270 189 939 1276 392 945 1282 185 531 1288 211 963 1294 398 969 1300 207 549 1306 235 987 1312 404 993 1318 231 565 1324 256 1011 1330 410 1017 1336 252 582 1342 280 1035 1348 416 1041 1354 276 599 1360 300 1059 1366 422 1065 1372 296 617 1378 325 1083 1384 428 1389 612 1090 661 1395 113 1108 1401 434 1114 1407 370 633 1413 351 1132 1419 440 1138 1425 347 120 855 668 856 375 1145 1146 874 657 145 879 685 880 381 1151 1152 898 680 166 903 702 904 387 1157 1158 922 697 190 927 720 928 393 1163 1164 946 715 212 951 736 952 399 1169 1170 970 731 236 975 754 976 405 1175 1176 994 749 257 999 771 1000 411 1181 1182 1018 766 281 1023 789 1024 417 1187 1188 1042 784 301 1047 806 1048 423 1193 1194 1066 801 326 1071 823 1072 429 1199 1200 1091 818 114 1096 458 1097 435 1205 1206 1115 851 352 1120 839 1121 441 1211 1212 1139 834 10 446 464 447 101 1217 1218 868 857 102 651 869 652 2 1223 1224 662 861 376 862 875 863 115 1229 1230 459 453 18 469 481 470 130 1235 1236 892 881 131 674 893 675 11 1241 1242 465 885 382 886 899 887 121 1247 1248 669 476 26 486 498 487 152 1253 1254 916 905 153 691 917 692 19 1259 1260 482 909 388 910 923 911 146 1265 1266 686 493 34 504 516 505 176 1271 1272 940 929 177 708 941 709 27 1277 1278 499 933 394 934 947 935 167 1283 1284 703 511 42 521 532 522 198 1289 1290 964 953 199 725 965 726 35 1295 1296 517 957 400 958 971 959 191 1301 1302 721 527 50 538 550 539 220 1307 1308 988 977 221 742 989 743 43 1313 1314 533 981 406 982 995 983 213 1319 1320 737 545 58 555 566 556 244 1325 1326 1012 1001 245 759 1013 760 51 1331 1332 551 1005 412 1006 1019 1007 237 1337 1338 755 561 66 572 583 573 266 1343 1344 1036 1025 267 777 1037 778 59 1349 1350 567 1029 418 1030 1043 1031 258 1355 1356 772 578 74 589 600 590 288 1361 1362 1060 1049 289 794 1061 795 67 1367 1368 584 1053 424 1054 1067 1055 282 1373 1374 790 595 82 606 618 607 312 1379 1380 1084 1073 313 811 1085 812 75 1385 1386 601 1077 430 1078 1092 1079 302 1390 1391 807 613 3 639 663 640 361 1396 1397 1109 1098 362 845 1110 846 90 1402 1403 634 1102 436 1103 1116 1104 353 1408 1409 840 646 91 623 635 624 334 1414 1415 1133 1122 335 828 1134 829 83 1420 1421 619 1126 442 1127 1140 1128 327 1426 1427 824 629 } } VertexData { Array TRUE ArrayID 3 Vec3fArray 1428 { 0 0.0499999 -0.0499999 0 0.0499999 -0.0499999 0 0.0499999 -0.0499999 0 0.0499999 -0.0499999 0 0.0499999 0.0499999 0 0.0499999 0.0499999 0 0.0499999 0.0499999 0 0.0499999 0.0499999 0.025 0.0433012 -0.0499999 0.025 0.0433012 -0.0499999 0.025 0.0433012 -0.0499999 0.025 0.0433012 -0.0499999 0.025 0.0433012 0.0499999 0.025 0.0433012 0.0499999 0.025 0.0433012 0.0499999 0.025 0.0433012 0.0499999 0.0433012 0.025 -0.0499999 0.0433012 0.025 -0.0499999 0.0433012 0.025 -0.0499999 0.0433012 0.025 -0.0499999 0.0433012 0.025 0.0499999 0.0433012 0.025 0.0499999 0.0433012 0.025 0.0499999 0.0433012 0.025 0.0499999 0.0499999 0 -0.0499999 0.0499999 0 -0.0499999 0.0499999 0 -0.0499999 0.0499999 0 -0.0499999 0.0499999 0 0.0499999 0.0499999 0 0.0499999 0.0499999 0 0.0499999 0.0499999 0 0.0499999 0.0433012 -0.025 -0.0499999 0.0433012 -0.025 -0.0499999 0.0433012 -0.025 -0.0499999 0.0433012 -0.025 -0.0499999 0.0433012 -0.025 0.0499999 0.0433012 -0.025 0.0499999 0.0433012 -0.025 0.0499999 0.0433012 -0.025 0.0499999 0.025 -0.0433012 -0.0499999 0.025 -0.0433012 -0.0499999 0.025 -0.0433012 -0.0499999 0.025 -0.0433012 -0.0499999 0.025 -0.0433012 0.0499999 0.025 -0.0433012 0.0499999 0.025 -0.0433012 0.0499999 0.025 -0.0433012 0.0499999 0 -0.0499999 -0.0499999 0 -0.0499999 -0.0499999 0 -0.0499999 -0.0499999 0 -0.0499999 -0.0499999 0 -0.0499999 0.0499999 0 -0.0499999 0.0499999 0 -0.0499999 0.0499999 0 -0.0499999 0.0499999 -0.025 -0.0433012 -0.0499999 -0.025 -0.0433012 -0.0499999 -0.025 -0.0433012 -0.0499999 -0.025 -0.0433012 -0.0499999 -0.025 -0.0433012 0.0499999 -0.025 -0.0433012 0.0499999 -0.025 -0.0433012 0.0499999 -0.025 -0.0433012 0.0499999 -0.0433012 -0.025 -0.0499999 -0.0433012 -0.025 -0.0499999 -0.0433012 -0.025 -0.0499999 -0.0433012 -0.025 -0.0499999 -0.0433012 -0.025 0.0499999 -0.0433012 -0.025 0.0499999 -0.0433012 -0.025 0.0499999 -0.0433012 -0.025 0.0499999 -0.0499999 0 -0.0499999 -0.0499999 0 -0.0499999 -0.0499999 0 -0.0499999 -0.0499999 0 -0.0499999 -0.0499999 0 0.0499999 -0.0499999 0 0.0499999 -0.0499999 0 0.0499999 -0.0499999 0 0.0499999 -0.0433013 0.025 -0.0499999 -0.0433013 0.025 -0.0499999 -0.0433013 0.025 -0.0499999 -0.0433013 0.025 -0.0499999 -0.0433013 0.025 0.0499999 -0.0433013 0.025 0.0499999 -0.0433013 0.025 0.0499999 -0.0433013 0.025 0.0499999 -0.025 0.0433012 -0.0499999 -0.025 0.0433012 -0.0499999 -0.025 0.0433012 -0.0499999 -0.025 0.0433012 -0.0499999 -0.025 0.0433012 0.0499999 -0.025 0.0433012 0.0499999 -0.025 0.0433012 0.0499999 -0.025 0.0433012 0.0499999 0.0125 0.0466506 -0.0499999 0.0125 0.0466506 -0.0499999 0.0125 0.0466506 -0.0499999 0.0125 0.0466506 -0.0499999 0.0125 0.0466506 -0.0499999 0.0125 0.0466506 -0.0499999 0.0125 0.0466506 -0.0499999 0.0125 0.0466506 0.0499999 0.0125 0.0466506 0.0499999 0.0125 0.0466506 0.0499999 0.0125 0.0466506 0.0499999 0.0125 0.0466506 0.0499999 0.0125 0.0466506 0.0499999 0.0125 0.0466506 0.0499999 0 0.0499999 0 0 0.0499999 0 0 0.0499999 0 0 0.0499999 0 0 0.0499999 0 0 0.0499999 0 0.025 0.0433012 0 0.025 0.0433012 0 0.025 0.0433012 0 0.025 0.0433012 0 0.025 0.0433012 0 0.025 0.0433012 0 0.0341506 0.0341506 -0.0499999 0.0341506 0.0341506 -0.0499999 0.0341506 0.0341506 -0.0499999 0.0341506 0.0341506 -0.0499999 0.0341506 0.0341506 -0.0499999 0.0341506 0.0341506 -0.0499999 0.0341506 0.0341506 -0.0499999 0.0341506 0.0341506 -0.0499999 0.0341506 0.0341506 -0.0499999 0.0341506 0.0341506 -0.0499999 0.0341506 0.0341506 0.0499999 0.0341506 0.0341506 0.0499999 0.0341506 0.0341506 0.0499999 0.0341506 0.0341506 0.0499999 0.0341506 0.0341506 0.0499999 0.0341506 0.0341506 0.0499999 0.0341506 0.0341506 0.0499999 0.0341506 0.0341506 0.0499999 0.0341506 0.0341506 0.0499999 0.0433012 0.025 0 0.0433012 0.025 0 0.0433012 0.025 0 0.0433012 0.025 0 0.0433012 0.025 0 0.0433012 0.025 0 0.0466506 0.0125 -0.0499999 0.0466506 0.0125 -0.0499999 0.0466506 0.0125 -0.0499999 0.0466506 0.0125 -0.0499999 0.0466506 0.0125 -0.0499999 0.0466506 0.0125 -0.0499999 0.0466506 0.0125 -0.0499999 0.0466506 0.0125 0.0499999 0.0466506 0.0125 0.0499999 0.0466506 0.0125 0.0499999 0.0466506 0.0125 0.0499999 0.0466506 0.0125 0.0499999 0.0466506 0.0125 0.0499999 0.0466506 0.0125 0.0499999 0.0466506 0.0125 0.0499999 0.0499999 0 0 0.0499999 0 0 0.0499999 0 0 0.0499999 0 0 0.0499999 0 0 0.0499999 0 0 0.0466506 -0.0125 -0.0499999 0.0466506 -0.0125 -0.0499999 0.0466506 -0.0125 -0.0499999 0.0466506 -0.0125 -0.0499999 0.0466506 -0.0125 -0.0499999 0.0466506 -0.0125 -0.0499999 0.0466506 -0.0125 -0.0499999 0.0466506 -0.0125 -0.0499999 0.0466506 -0.0125 -0.0499999 0.0466506 -0.0125 -0.0499999 0.0466506 -0.0125 0.0499999 0.0466506 -0.0125 0.0499999 0.0466506 -0.0125 0.0499999 0.0466506 -0.0125 0.0499999 0.0466506 -0.0125 0.0499999 0.0466506 -0.0125 0.0499999 0.0466506 -0.0125 0.0499999 0.0466506 -0.0125 0.0499999 0.0433012 -0.025 0 0.0433012 -0.025 0 0.0433012 -0.025 0 0.0433012 -0.025 0 0.0433012 -0.025 0 0.0433012 -0.025 0 0.0341506 -0.0341506 -0.0499999 0.0341506 -0.0341506 -0.0499999 0.0341506 -0.0341506 -0.0499999 0.0341506 -0.0341506 -0.0499999 0.0341506 -0.0341506 -0.0499999 0.0341506 -0.0341506 -0.0499999 0.0341506 -0.0341506 -0.0499999 0.0341506 -0.0341506 -0.0499999 0.0341506 -0.0341506 0.0499999 0.0341506 -0.0341506 0.0499999 0.0341506 -0.0341506 0.0499999 0.0341506 -0.0341506 0.0499999 0.0341506 -0.0341506 0.0499999 0.0341506 -0.0341506 0.0499999 0.0341506 -0.0341506 0.0499999 0.0341506 -0.0341506 0.0499999 0.025 -0.0433012 0 0.025 -0.0433012 0 0.025 -0.0433012 0 0.025 -0.0433012 0 0.025 -0.0433012 0 0.025 -0.0433012 0 0.0125 -0.0466506 -0.0499999 0.0125 -0.0466506 -0.0499999 0.0125 -0.0466506 -0.0499999 0.0125 -0.0466506 -0.0499999 0.0125 -0.0466506 -0.0499999 0.0125 -0.0466506 -0.0499999 0.0125 -0.0466506 -0.0499999 0.0125 -0.0466506 -0.0499999 0.0125 -0.0466506 0.0499999 0.0125 -0.0466506 0.0499999 0.0125 -0.0466506 0.0499999 0.0125 -0.0466506 0.0499999 0.0125 -0.0466506 0.0499999 0.0125 -0.0466506 0.0499999 0.0125 -0.0466506 0.0499999 0.0125 -0.0466506 0.0499999 0.0125 -0.0466506 0.0499999 0.0125 -0.0466506 0.0499999 0 -0.0499999 0 0 -0.0499999 0 0 -0.0499999 0 0 -0.0499999 0 0 -0.0499999 0 0 -0.0499999 0 -0.0125 -0.0466506 -0.0499999 -0.0125 -0.0466506 -0.0499999 -0.0125 -0.0466506 -0.0499999 -0.0125 -0.0466506 -0.0499999 -0.0125 -0.0466506 -0.0499999 -0.0125 -0.0466506 -0.0499999 -0.0125 -0.0466506 -0.0499999 -0.0125 -0.0466506 -0.0499999 -0.0125 -0.0466506 0.0499999 -0.0125 -0.0466506 0.0499999 -0.0125 -0.0466506 0.0499999 -0.0125 -0.0466506 0.0499999 -0.0125 -0.0466506 0.0499999 -0.0125 -0.0466506 0.0499999 -0.0125 -0.0466506 0.0499999 -0.025 -0.0433012 0 -0.025 -0.0433012 0 -0.025 -0.0433012 0 -0.025 -0.0433012 0 -0.025 -0.0433012 0 -0.025 -0.0433012 0 -0.0341506 -0.0341506 -0.0499999 -0.0341506 -0.0341506 -0.0499999 -0.0341506 -0.0341506 -0.0499999 -0.0341506 -0.0341506 -0.0499999 -0.0341506 -0.0341506 -0.0499999 -0.0341506 -0.0341506 -0.0499999 -0.0341506 -0.0341506 -0.0499999 -0.0341506 -0.0341506 -0.0499999 -0.0341506 -0.0341506 -0.0499999 -0.0341506 -0.0341506 0.0499999 -0.0341506 -0.0341506 0.0499999 -0.0341506 -0.0341506 0.0499999 -0.0341506 -0.0341506 0.0499999 -0.0341506 -0.0341506 0.0499999 -0.0341506 -0.0341506 0.0499999 -0.0341506 -0.0341506 0.0499999 -0.0341506 -0.0341506 0.0499999 -0.0341506 -0.0341506 0.0499999 -0.0433012 -0.025 0 -0.0433012 -0.025 0 -0.0433012 -0.025 0 -0.0433012 -0.025 0 -0.0433012 -0.025 0 -0.0433012 -0.025 0 -0.0466506 -0.0125 -0.0499999 -0.0466506 -0.0125 -0.0499999 -0.0466506 -0.0125 -0.0499999 -0.0466506 -0.0125 -0.0499999 -0.0466506 -0.0125 -0.0499999 -0.0466506 -0.0125 -0.0499999 -0.0466506 -0.0125 -0.0499999 -0.0466506 -0.0125 0.0499999 -0.0466506 -0.0125 0.0499999 -0.0466506 -0.0125 0.0499999 -0.0466506 -0.0125 0.0499999 -0.0466506 -0.0125 0.0499999 -0.0466506 -0.0125 0.0499999 -0.0466506 -0.0125 0.0499999 -0.0499999 0 0 -0.0499999 0 0 -0.0499999 0 0 -0.0499999 0 0 -0.0499999 0 0 -0.0499999 0 0 -0.0466506 0.0124999 -0.0499999 -0.0466506 0.0124999 -0.0499999 -0.0466506 0.0124999 -0.0499999 -0.0466506 0.0124999 -0.0499999 -0.0466506 0.0124999 -0.0499999 -0.0466506 0.0124999 -0.0499999 -0.0466506 0.0124999 -0.0499999 -0.0466506 0.0124999 -0.0499999 -0.0466506 0.0124999 -0.0499999 -0.0466506 0.0124999 -0.0499999 -0.0466506 0.0124999 -0.0499999 -0.0466506 0.0124999 0.0499999 -0.0466506 0.0124999 0.0499999 -0.0466506 0.0124999 0.0499999 -0.0466506 0.0124999 0.0499999 -0.0466506 0.0124999 0.0499999 -0.0466506 0.0124999 0.0499999 -0.0466506 0.0124999 0.0499999 -0.0466506 0.0124999 0.0499999 -0.0433013 0.025 0 -0.0433013 0.025 0 -0.0433013 0.025 0 -0.0433013 0.025 0 -0.0433013 0.025 0 -0.0433013 0.025 0 -0.0341507 0.0341506 -0.0499999 -0.0341507 0.0341506 -0.0499999 -0.0341507 0.0341506 -0.0499999 -0.0341507 0.0341506 -0.0499999 -0.0341507 0.0341506 -0.0499999 -0.0341507 0.0341506 -0.0499999 -0.0341507 0.0341506 -0.0499999 -0.0341507 0.0341506 -0.0499999 -0.0341507 0.0341506 0.0499999 -0.0341507 0.0341506 0.0499999 -0.0341507 0.0341506 0.0499999 -0.0341507 0.0341506 0.0499999 -0.0341507 0.0341506 0.0499999 -0.0341507 0.0341506 0.0499999 -0.0341507 0.0341506 0.0499999 -0.0341507 0.0341506 0.0499999 -0.0341507 0.0341506 0.0499999 -0.0341507 0.0341506 0.0499999 -0.0341507 0.0341506 0.0499999 -0.0341507 0.0341506 0.0499999 -0.025 0.0433012 0 -0.025 0.0433012 0 -0.025 0.0433012 0 -0.025 0.0433012 0 -0.025 0.0433012 0 -0.025 0.0433012 0 -0.0125 0.0466506 -0.0499999 -0.0125 0.0466506 -0.0499999 -0.0125 0.0466506 -0.0499999 -0.0125 0.0466506 -0.0499999 -0.0125 0.0466506 -0.0499999 -0.0125 0.0466506 -0.0499999 -0.0125 0.0466506 -0.0499999 -0.0125 0.0466506 -0.0499999 -0.0125 0.0466506 -0.0499999 -0.0125 0.0466506 0.0499999 -0.0125 0.0466506 0.0499999 -0.0125 0.0466506 0.0499999 -0.0125 0.0466506 0.0499999 -0.0125 0.0466506 0.0499999 -0.0125 0.0466506 0.0499999 -0.0125 0.0466506 0.0499999 -0.0125 0.0466506 0.0499999 0.0125 0.0466506 0 0.0125 0.0466506 0 0.0125 0.0466506 0 0.0125 0.0466506 0 0.0125 0.0466506 0 0.0125 0.0466506 0 0.0341506 0.0341506 0 0.0341506 0.0341506 0 0.0341506 0.0341506 0 0.0341506 0.0341506 0 0.0341506 0.0341506 0 0.0341506 0.0341506 0 0.0466506 0.0125 0 0.0466506 0.0125 0 0.0466506 0.0125 0 0.0466506 0.0125 0 0.0466506 0.0125 0 0.0466506 0.0125 0 0.0466506 -0.0125 0 0.0466506 -0.0125 0 0.0466506 -0.0125 0 0.0466506 -0.0125 0 0.0466506 -0.0125 0 0.0466506 -0.0125 0 0.0341506 -0.0341506 0 0.0341506 -0.0341506 0 0.0341506 -0.0341506 0 0.0341506 -0.0341506 0 0.0341506 -0.0341506 0 0.0341506 -0.0341506 0 0.0125 -0.0466506 0 0.0125 -0.0466506 0 0.0125 -0.0466506 0 0.0125 -0.0466506 0 0.0125 -0.0466506 0 0.0125 -0.0466506 0 -0.0125 -0.0466506 0 -0.0125 -0.0466506 0 -0.0125 -0.0466506 0 -0.0125 -0.0466506 0 -0.0125 -0.0466506 0 -0.0125 -0.0466506 0 -0.0341506 -0.0341506 0 -0.0341506 -0.0341506 0 -0.0341506 -0.0341506 0 -0.0341506 -0.0341506 0 -0.0341506 -0.0341506 0 -0.0341506 -0.0341506 0 -0.0466506 -0.0125 0 -0.0466506 -0.0125 0 -0.0466506 -0.0125 0 -0.0466506 -0.0125 0 -0.0466506 -0.0125 0 -0.0466506 -0.0125 0 -0.0466506 0.0124999 0 -0.0466506 0.0124999 0 -0.0466506 0.0124999 0 -0.0466506 0.0124999 0 -0.0466506 0.0124999 0 -0.0466506 0.0124999 0 -0.0125 0.0466506 0 -0.0125 0.0466506 0 -0.0125 0.0466506 0 -0.0125 0.0466506 0 -0.0125 0.0466506 0 -0.0125 0.0466506 0 -0.0341507 0.0341506 0 -0.0341507 0.0341506 0 -0.0341507 0.0341506 0 -0.0341507 0.0341506 0 -0.0341507 0.0341506 0 -0.0341507 0.0341506 0 0.01875 0.0449759 -0.0499999 0.01875 0.0449759 -0.0499999 0.01875 0.0449759 -0.0499999 0.01875 0.0449759 -0.0499999 0.01875 0.0449759 -0.0499999 0.00624996 0.0483253 0.0499999 0.00624996 0.0483253 0.0499999 0.00624996 0.0483253 0.0499999 0.00624996 0.0483253 0.0499999 0.00624996 0.0483253 0.0499999 0.00624996 0.0483253 0.0499999 0 0.0499999 0.025 0 0.0499999 0.025 0 0.0499999 0.025 0 0.0499999 0.025 0 0.0499999 0.025 0 0.0499999 0.025 0.025 0.0433012 -0.025 0.025 0.0433012 -0.025 0.025 0.0433012 -0.025 0.025 0.0433012 -0.025 0.025 0.0433012 -0.025 0.025 0.0433012 -0.025 0.0387259 0.0295753 -0.0499999 0.0387259 0.0295753 -0.0499999 0.0387259 0.0295753 -0.0499999 0.0387259 0.0295753 -0.0499999 0.0387259 0.0295753 -0.0499999 0.0295753 0.0387259 0.0499999 0.0295753 0.0387259 0.0499999 0.0295753 0.0387259 0.0499999 0.0295753 0.0387259 0.0499999 0.0295753 0.0387259 0.0499999 0.0295753 0.0387259 0.0499999 0.0433012 0.025 -0.025 0.0433012 0.025 -0.025 0.0433012 0.025 -0.025 0.0433012 0.025 -0.025 0.0433012 0.025 -0.025 0.0433012 0.025 -0.025 0.0483253 0.00624996 -0.0499999 0.0483253 0.00624996 -0.0499999 0.0483253 0.00624996 -0.0499999 0.0483253 0.00624996 -0.0499999 0.0483253 0.00624996 -0.0499999 0.0449759 0.01875 0.0499999 0.0449759 0.01875 0.0499999 0.0449759 0.01875 0.0499999 0.0449759 0.01875 0.0499999 0.0449759 0.01875 0.0499999 0.0449759 0.01875 0.0499999 0.0499999 0 -0.025 0.0499999 0 -0.025 0.0499999 0 -0.025 0.0499999 0 -0.025 0.0499999 0 -0.025 0.0499999 0 -0.025 0.0449759 -0.01875 -0.0499999 0.0449759 -0.01875 -0.0499999 0.0449759 -0.01875 -0.0499999 0.0449759 -0.01875 -0.0499999 0.0449759 -0.01875 -0.0499999 0.0449759 -0.01875 -0.0499999 0.0483253 -0.00624996 0.0499999 0.0483253 -0.00624996 0.0499999 0.0483253 -0.00624996 0.0499999 0.0483253 -0.00624996 0.0499999 0.0483253 -0.00624996 0.0499999 0.0483253 -0.00624996 0.0499999 0.0433012 -0.025 -0.025 0.0433012 -0.025 -0.025 0.0433012 -0.025 -0.025 0.0433012 -0.025 -0.025 0.0433012 -0.025 -0.025 0.0433012 -0.025 -0.025 0.0295753 -0.0387259 -0.0499999 0.0295753 -0.0387259 -0.0499999 0.0295753 -0.0387259 -0.0499999 0.0295753 -0.0387259 -0.0499999 0.0295753 -0.0387259 -0.0499999 0.0387259 -0.0295753 0.0499999 0.0387259 -0.0295753 0.0499999 0.0387259 -0.0295753 0.0499999 0.0387259 -0.0295753 0.0499999 0.0387259 -0.0295753 0.0499999 0.025 -0.0433012 -0.025 0.025 -0.0433012 -0.025 0.025 -0.0433012 -0.025 0.025 -0.0433012 -0.025 0.025 -0.0433012 -0.025 0.025 -0.0433012 -0.025 0.00624996 -0.0483253 -0.0499999 0.00624996 -0.0483253 -0.0499999 0.00624996 -0.0483253 -0.0499999 0.00624996 -0.0483253 -0.0499999 0.00624996 -0.0483253 -0.0499999 0.00624996 -0.0483253 -0.0499999 0.01875 -0.0449759 0.0499999 0.01875 -0.0449759 0.0499999 0.01875 -0.0449759 0.0499999 0.01875 -0.0449759 0.0499999 0.01875 -0.0449759 0.0499999 0.01875 -0.0449759 0.0499999 0 -0.0499999 -0.025 0 -0.0499999 -0.025 0 -0.0499999 -0.025 0 -0.0499999 -0.025 0 -0.0499999 -0.025 0 -0.0499999 -0.025 -0.01875 -0.0449759 -0.0499999 -0.01875 -0.0449759 -0.0499999 -0.01875 -0.0449759 -0.0499999 -0.01875 -0.0449759 -0.0499999 -0.01875 -0.0449759 -0.0499999 -0.00624996 -0.0483253 0.0499999 -0.00624996 -0.0483253 0.0499999 -0.00624996 -0.0483253 0.0499999 -0.00624996 -0.0483253 0.0499999 -0.00624996 -0.0483253 0.0499999 -0.025 -0.0433012 -0.025 -0.025 -0.0433012 -0.025 -0.025 -0.0433012 -0.025 -0.025 -0.0433012 -0.025 -0.025 -0.0433012 -0.025 -0.025 -0.0433012 -0.025 -0.0387259 -0.0295753 -0.0499999 -0.0387259 -0.0295753 -0.0499999 -0.0387259 -0.0295753 -0.0499999 -0.0387259 -0.0295753 -0.0499999 -0.0387259 -0.0295753 -0.0499999 -0.0387259 -0.0295753 -0.0499999 -0.0295753 -0.0387259 0.0499999 -0.0295753 -0.0387259 0.0499999 -0.0295753 -0.0387259 0.0499999 -0.0295753 -0.0387259 0.0499999 -0.0295753 -0.0387259 0.0499999 -0.0433012 -0.025 -0.025 -0.0433012 -0.025 -0.025 -0.0433012 -0.025 -0.025 -0.0433012 -0.025 -0.025 -0.0433012 -0.025 -0.025 -0.0433012 -0.025 -0.025 -0.0483253 -0.00624996 -0.0499999 -0.0483253 -0.00624996 -0.0499999 -0.0483253 -0.00624996 -0.0499999 -0.0483253 -0.00624996 -0.0499999 -0.0483253 -0.00624996 -0.0499999 -0.0483253 -0.00624996 -0.0499999 -0.0449759 -0.01875 0.0499999 -0.0449759 -0.01875 0.0499999 -0.0449759 -0.01875 0.0499999 -0.0449759 -0.01875 0.0499999 -0.0449759 -0.01875 0.0499999 -0.0499999 0 -0.025 -0.0499999 0 -0.025 -0.0499999 0 -0.025 -0.0499999 0 -0.025 -0.0499999 0 -0.025 -0.0499999 0 -0.025 -0.0449759 0.01875 -0.0499999 -0.0449759 0.01875 -0.0499999 -0.0449759 0.01875 -0.0499999 -0.0449759 0.01875 -0.0499999 -0.0449759 0.01875 -0.0499999 -0.0449759 0.01875 -0.0499999 -0.0483253 0.00624996 0.0499999 -0.0483253 0.00624996 0.0499999 -0.0483253 0.00624996 0.0499999 -0.0483253 0.00624996 0.0499999 -0.0483253 0.00624996 0.0499999 -0.0483253 0.00624996 0.0499999 -0.0433013 0.025 -0.025 -0.0433013 0.025 -0.025 -0.0433013 0.025 -0.025 -0.0433013 0.025 -0.025 -0.0433013 0.025 -0.025 -0.0433013 0.025 -0.025 -0.0295753 0.0387259 -0.0499999 -0.0295753 0.0387259 -0.0499999 -0.0295753 0.0387259 -0.0499999 -0.0295753 0.0387259 -0.0499999 -0.0295753 0.0387259 -0.0499999 -0.038726 0.0295753 0.0499999 -0.038726 0.0295753 0.0499999 -0.038726 0.0295753 0.0499999 -0.038726 0.0295753 0.0499999 -0.038726 0.0295753 0.0499999 -0.025 0.0433012 -0.025 -0.025 0.0433012 -0.025 -0.025 0.0433012 -0.025 -0.025 0.0433012 -0.025 -0.025 0.0433012 -0.025 -0.025 0.0433012 -0.025 -0.00624996 0.0483253 -0.0499999 -0.00624996 0.0483253 -0.0499999 -0.00624996 0.0483253 -0.0499999 -0.00624996 0.0483253 -0.0499999 -0.00624996 0.0483253 -0.0499999 -0.01875 0.0449759 0.0499999 -0.01875 0.0449759 0.0499999 -0.01875 0.0449759 0.0499999 -0.01875 0.0449759 0.0499999 -0.01875 0.0449759 0.0499999 -0.01875 0.0449759 0.0499999 0.00624996 0.0483253 -0.0499999 0.00624996 0.0483253 -0.0499999 0.00624996 0.0483253 -0.0499999 0.00624996 0.0483253 -0.0499999 0.00624996 0.0483253 -0.0499999 0.00624996 0.0483253 -0.0499999 0.01875 0.0449759 0.0499999 0.01875 0.0449759 0.0499999 0.01875 0.0449759 0.0499999 0.01875 0.0449759 0.0499999 0.01875 0.0449759 0.0499999 0 0.0499999 -0.025 0 0.0499999 -0.025 0 0.0499999 -0.025 0 0.0499999 -0.025 0 0.0499999 -0.025 0 0.0499999 -0.025 0.025 0.0433012 0.025 0.025 0.0433012 0.025 0.025 0.0433012 0.025 0.025 0.0433012 0.025 0.025 0.0433012 0.025 0.025 0.0433012 0.025 0.0295753 0.0387259 -0.0499999 0.0295753 0.0387259 -0.0499999 0.0295753 0.0387259 -0.0499999 0.0295753 0.0387259 -0.0499999 0.0295753 0.0387259 -0.0499999 0.0295753 0.0387259 -0.0499999 0.0387259 0.0295753 0.0499999 0.0387259 0.0295753 0.0499999 0.0387259 0.0295753 0.0499999 0.0387259 0.0295753 0.0499999 0.0387259 0.0295753 0.0499999 0.0433012 0.025 0.025 0.0433012 0.025 0.025 0.0433012 0.025 0.025 0.0433012 0.025 0.025 0.0433012 0.025 0.025 0.0433012 0.025 0.025 0.0449759 0.01875 -0.0499999 0.0449759 0.01875 -0.0499999 0.0449759 0.01875 -0.0499999 0.0449759 0.01875 -0.0499999 0.0449759 0.01875 -0.0499999 0.0449759 0.01875 -0.0499999 0.0483253 0.00624996 0.0499999 0.0483253 0.00624996 0.0499999 0.0483253 0.00624996 0.0499999 0.0483253 0.00624996 0.0499999 0.0483253 0.00624996 0.0499999 0.0499999 0 0.025 0.0499999 0 0.025 0.0499999 0 0.025 0.0499999 0 0.025 0.0499999 0 0.025 0.0499999 0 0.025 0.0483253 -0.00624996 -0.0499999 0.0483253 -0.00624996 -0.0499999 0.0483253 -0.00624996 -0.0499999 0.0483253 -0.00624996 -0.0499999 0.0483253 -0.00624996 -0.0499999 0.0483253 -0.00624996 -0.0499999 0.0449759 -0.01875 0.0499999 0.0449759 -0.01875 0.0499999 0.0449759 -0.01875 0.0499999 0.0449759 -0.01875 0.0499999 0.0449759 -0.01875 0.0499999 0.0449759 -0.01875 0.0499999 0.0433012 -0.025 0.025 0.0433012 -0.025 0.025 0.0433012 -0.025 0.025 0.0433012 -0.025 0.025 0.0433012 -0.025 0.025 0.0433012 -0.025 0.025 0.0387259 -0.0295753 -0.0499999 0.0387259 -0.0295753 -0.0499999 0.0387259 -0.0295753 -0.0499999 0.0387259 -0.0295753 -0.0499999 0.0387259 -0.0295753 -0.0499999 0.0295753 -0.0387259 0.0499999 0.0295753 -0.0387259 0.0499999 0.0295753 -0.0387259 0.0499999 0.0295753 -0.0387259 0.0499999 0.0295753 -0.0387259 0.0499999 0.025 -0.0433012 0.025 0.025 -0.0433012 0.025 0.025 -0.0433012 0.025 0.025 -0.0433012 0.025 0.025 -0.0433012 0.025 0.025 -0.0433012 0.025 0.01875 -0.0449759 -0.0499999 0.01875 -0.0449759 -0.0499999 0.01875 -0.0449759 -0.0499999 0.01875 -0.0449759 -0.0499999 0.01875 -0.0449759 -0.0499999 0.01875 -0.0449759 -0.0499999 0.00624996 -0.0483253 0.0499999 0.00624996 -0.0483253 0.0499999 0.00624996 -0.0483253 0.0499999 0.00624996 -0.0483253 0.0499999 0.00624996 -0.0483253 0.0499999 0.00624996 -0.0483253 0.0499999 0 -0.0499999 0.025 0 -0.0499999 0.025 0 -0.0499999 0.025 0 -0.0499999 0.025 0 -0.0499999 0.025 0 -0.0499999 0.025 -0.00624996 -0.0483253 -0.0499999 -0.00624996 -0.0483253 -0.0499999 -0.00624996 -0.0483253 -0.0499999 -0.00624996 -0.0483253 -0.0499999 -0.00624996 -0.0483253 -0.0499999 -0.01875 -0.0449759 0.0499999 -0.01875 -0.0449759 0.0499999 -0.01875 -0.0449759 0.0499999 -0.01875 -0.0449759 0.0499999 -0.01875 -0.0449759 0.0499999 -0.01875 -0.0449759 0.0499999 -0.025 -0.0433012 0.025 -0.025 -0.0433012 0.025 -0.025 -0.0433012 0.025 -0.025 -0.0433012 0.025 -0.025 -0.0433012 0.025 -0.025 -0.0433012 0.025 -0.0295753 -0.0387259 -0.0499999 -0.0295753 -0.0387259 -0.0499999 -0.0295753 -0.0387259 -0.0499999 -0.0295753 -0.0387259 -0.0499999 -0.0295753 -0.0387259 -0.0499999 -0.0295753 -0.0387259 -0.0499999 -0.0387259 -0.0295753 0.0499999 -0.0387259 -0.0295753 0.0499999 -0.0387259 -0.0295753 0.0499999 -0.0387259 -0.0295753 0.0499999 -0.0387259 -0.0295753 0.0499999 -0.0387259 -0.0295753 0.0499999 -0.0433012 -0.025 0.025 -0.0433012 -0.025 0.025 -0.0433012 -0.025 0.025 -0.0433012 -0.025 0.025 -0.0433012 -0.025 0.025 -0.0433012 -0.025 0.025 -0.0449759 -0.01875 -0.0499999 -0.0449759 -0.01875 -0.0499999 -0.0449759 -0.01875 -0.0499999 -0.0449759 -0.01875 -0.0499999 -0.0449759 -0.01875 -0.0499999 -0.0483253 -0.00624996 0.0499999 -0.0483253 -0.00624996 0.0499999 -0.0483253 -0.00624996 0.0499999 -0.0483253 -0.00624996 0.0499999 -0.0483253 -0.00624996 0.0499999 -0.0483253 -0.00624996 0.0499999 -0.0499999 0 0.025 -0.0499999 0 0.025 -0.0499999 0 0.025 -0.0499999 0 0.025 -0.0499999 0 0.025 -0.0499999 0 0.025 -0.0483253 0.00624996 -0.0499999 -0.0483253 0.00624996 -0.0499999 -0.0483253 0.00624996 -0.0499999 -0.0483253 0.00624996 -0.0499999 -0.0483253 0.00624996 -0.0499999 -0.0449759 0.01875 0.0499999 -0.0449759 0.01875 0.0499999 -0.0449759 0.01875 0.0499999 -0.0449759 0.01875 0.0499999 -0.0449759 0.01875 0.0499999 -0.0449759 0.01875 0.0499999 -0.0433013 0.025 0.025 -0.0433013 0.025 0.025 -0.0433013 0.025 0.025 -0.0433013 0.025 0.025 -0.0433013 0.025 0.025 -0.0433013 0.025 0.025 -0.038726 0.0295753 -0.0499999 -0.038726 0.0295753 -0.0499999 -0.038726 0.0295753 -0.0499999 -0.038726 0.0295753 -0.0499999 -0.038726 0.0295753 -0.0499999 -0.0295753 0.0387259 0.0499999 -0.0295753 0.0387259 0.0499999 -0.0295753 0.0387259 0.0499999 -0.0295753 0.0387259 0.0499999 -0.0295753 0.0387259 0.0499999 -0.025 0.0433012 0.025 -0.025 0.0433012 0.025 -0.025 0.0433012 0.025 -0.025 0.0433012 0.025 -0.025 0.0433012 0.025 -0.025 0.0433012 0.025 -0.01875 0.0449759 -0.0499999 -0.01875 0.0449759 -0.0499999 -0.01875 0.0449759 -0.0499999 -0.01875 0.0449759 -0.0499999 -0.01875 0.0449759 -0.0499999 -0.01875 0.0449759 -0.0499999 -0.00624996 0.0483253 0.0499999 -0.00624996 0.0483253 0.0499999 -0.00624996 0.0483253 0.0499999 -0.00624996 0.0483253 0.0499999 -0.00624996 0.0483253 0.0499999 0.01875 0.0449759 0 0.01875 0.0449759 0 0.01875 0.0449759 0 0.01875 0.0449759 0 0.01875 0.0449759 0 0.01875 0.0449759 0 0.00624996 0.0483253 0 0.00624996 0.0483253 0 0.00624996 0.0483253 0 0.00624996 0.0483253 0 0.00624996 0.0483253 0 0.00624996 0.0483253 0 0.0125 0.0466506 -0.025 0.0125 0.0466506 -0.025 0.0125 0.0466506 -0.025 0.0125 0.0466506 -0.025 0.0125 0.0466506 -0.025 0.0125 0.0466506 -0.025 0.0125 0.0466506 0.025 0.0125 0.0466506 0.025 0.0125 0.0466506 0.025 0.0125 0.0466506 0.025 0.0125 0.0466506 0.025 0.0125 0.0466506 0.025 0.0387259 0.0295753 0 0.0387259 0.0295753 0 0.0387259 0.0295753 0 0.0387259 0.0295753 0 0.0387259 0.0295753 0 0.0387259 0.0295753 0 0.0295753 0.0387259 0 0.0295753 0.0387259 0 0.0295753 0.0387259 0 0.0295753 0.0387259 0 0.0295753 0.0387259 0 0.0295753 0.0387259 0 0.0341506 0.0341506 -0.025 0.0341506 0.0341506 -0.025 0.0341506 0.0341506 -0.025 0.0341506 0.0341506 -0.025 0.0341506 0.0341506 -0.025 0.0341506 0.0341506 -0.025 0.0341506 0.0341506 0.025 0.0341506 0.0341506 0.025 0.0341506 0.0341506 0.025 0.0341506 0.0341506 0.025 0.0341506 0.0341506 0.025 0.0341506 0.0341506 0.025 0.0483253 0.00624996 0 0.0483253 0.00624996 0 0.0483253 0.00624996 0 0.0483253 0.00624996 0 0.0483253 0.00624996 0 0.0483253 0.00624996 0 0.0449759 0.01875 0 0.0449759 0.01875 0 0.0449759 0.01875 0 0.0449759 0.01875 0 0.0449759 0.01875 0 0.0449759 0.01875 0 0.0466506 0.0125 -0.025 0.0466506 0.0125 -0.025 0.0466506 0.0125 -0.025 0.0466506 0.0125 -0.025 0.0466506 0.0125 -0.025 0.0466506 0.0125 -0.025 0.0466506 0.0125 0.025 0.0466506 0.0125 0.025 0.0466506 0.0125 0.025 0.0466506 0.0125 0.025 0.0466506 0.0125 0.025 0.0466506 0.0125 0.025 0.0449759 -0.01875 0 0.0449759 -0.01875 0 0.0449759 -0.01875 0 0.0449759 -0.01875 0 0.0449759 -0.01875 0 0.0449759 -0.01875 0 0.0483253 -0.00624996 0 0.0483253 -0.00624996 0 0.0483253 -0.00624996 0 0.0483253 -0.00624996 0 0.0483253 -0.00624996 0 0.0483253 -0.00624996 0 0.0466506 -0.0125 -0.025 0.0466506 -0.0125 -0.025 0.0466506 -0.0125 -0.025 0.0466506 -0.0125 -0.025 0.0466506 -0.0125 -0.025 0.0466506 -0.0125 -0.025 0.0466506 -0.0125 0.025 0.0466506 -0.0125 0.025 0.0466506 -0.0125 0.025 0.0466506 -0.0125 0.025 0.0466506 -0.0125 0.025 0.0466506 -0.0125 0.025 0.0295753 -0.0387259 0 0.0295753 -0.0387259 0 0.0295753 -0.0387259 0 0.0295753 -0.0387259 0 0.0295753 -0.0387259 0 0.0295753 -0.0387259 0 0.0387259 -0.0295753 0 0.0387259 -0.0295753 0 0.0387259 -0.0295753 0 0.0387259 -0.0295753 0 0.0387259 -0.0295753 0 0.0387259 -0.0295753 0 0.0341506 -0.0341506 -0.025 0.0341506 -0.0341506 -0.025 0.0341506 -0.0341506 -0.025 0.0341506 -0.0341506 -0.025 0.0341506 -0.0341506 -0.025 0.0341506 -0.0341506 -0.025 0.0341506 -0.0341506 0.025 0.0341506 -0.0341506 0.025 0.0341506 -0.0341506 0.025 0.0341506 -0.0341506 0.025 0.0341506 -0.0341506 0.025 0.0341506 -0.0341506 0.025 0.00624996 -0.0483253 0 0.00624996 -0.0483253 0 0.00624996 -0.0483253 0 0.00624996 -0.0483253 0 0.00624996 -0.0483253 0 0.00624996 -0.0483253 0 0.01875 -0.0449759 0 0.01875 -0.0449759 0 0.01875 -0.0449759 0 0.01875 -0.0449759 0 0.01875 -0.0449759 0 0.01875 -0.0449759 0 0.0125 -0.0466506 -0.025 0.0125 -0.0466506 -0.025 0.0125 -0.0466506 -0.025 0.0125 -0.0466506 -0.025 0.0125 -0.0466506 -0.025 0.0125 -0.0466506 -0.025 0.0125 -0.0466506 0.025 0.0125 -0.0466506 0.025 0.0125 -0.0466506 0.025 0.0125 -0.0466506 0.025 0.0125 -0.0466506 0.025 0.0125 -0.0466506 0.025 -0.01875 -0.0449759 0 -0.01875 -0.0449759 0 -0.01875 -0.0449759 0 -0.01875 -0.0449759 0 -0.01875 -0.0449759 0 -0.01875 -0.0449759 0 -0.00624996 -0.0483253 0 -0.00624996 -0.0483253 0 -0.00624996 -0.0483253 0 -0.00624996 -0.0483253 0 -0.00624996 -0.0483253 0 -0.00624996 -0.0483253 0 -0.0125 -0.0466506 -0.025 -0.0125 -0.0466506 -0.025 -0.0125 -0.0466506 -0.025 -0.0125 -0.0466506 -0.025 -0.0125 -0.0466506 -0.025 -0.0125 -0.0466506 -0.025 -0.0125 -0.0466506 0.025 -0.0125 -0.0466506 0.025 -0.0125 -0.0466506 0.025 -0.0125 -0.0466506 0.025 -0.0125 -0.0466506 0.025 -0.0125 -0.0466506 0.025 -0.0387259 -0.0295753 0 -0.0387259 -0.0295753 0 -0.0387259 -0.0295753 0 -0.0387259 -0.0295753 0 -0.0387259 -0.0295753 0 -0.0387259 -0.0295753 0 -0.0295753 -0.0387259 0 -0.0295753 -0.0387259 0 -0.0295753 -0.0387259 0 -0.0295753 -0.0387259 0 -0.0295753 -0.0387259 0 -0.0295753 -0.0387259 0 -0.0341506 -0.0341506 -0.025 -0.0341506 -0.0341506 -0.025 -0.0341506 -0.0341506 -0.025 -0.0341506 -0.0341506 -0.025 -0.0341506 -0.0341506 -0.025 -0.0341506 -0.0341506 -0.025 -0.0341506 -0.0341506 0.025 -0.0341506 -0.0341506 0.025 -0.0341506 -0.0341506 0.025 -0.0341506 -0.0341506 0.025 -0.0341506 -0.0341506 0.025 -0.0341506 -0.0341506 0.025 -0.0483253 -0.00624996 0 -0.0483253 -0.00624996 0 -0.0483253 -0.00624996 0 -0.0483253 -0.00624996 0 -0.0483253 -0.00624996 0 -0.0483253 -0.00624996 0 -0.0449759 -0.01875 0 -0.0449759 -0.01875 0 -0.0449759 -0.01875 0 -0.0449759 -0.01875 0 -0.0449759 -0.01875 0 -0.0449759 -0.01875 0 -0.0466506 -0.0125 -0.025 -0.0466506 -0.0125 -0.025 -0.0466506 -0.0125 -0.025 -0.0466506 -0.0125 -0.025 -0.0466506 -0.0125 -0.025 -0.0466506 -0.0125 -0.025 -0.0466506 -0.0125 0.025 -0.0466506 -0.0125 0.025 -0.0466506 -0.0125 0.025 -0.0466506 -0.0125 0.025 -0.0466506 -0.0125 0.025 -0.0466506 -0.0125 0.025 -0.0449759 0.01875 0 -0.0449759 0.01875 0 -0.0449759 0.01875 0 -0.0449759 0.01875 0 -0.0449759 0.01875 0 -0.0449759 0.01875 0 -0.0483253 0.00624996 0 -0.0483253 0.00624996 0 -0.0483253 0.00624996 0 -0.0483253 0.00624996 0 -0.0483253 0.00624996 0 -0.0483253 0.00624996 0 -0.0466506 0.0124999 -0.025 -0.0466506 0.0124999 -0.025 -0.0466506 0.0124999 -0.025 -0.0466506 0.0124999 -0.025 -0.0466506 0.0124999 -0.025 -0.0466506 0.0124999 -0.025 -0.0466506 0.0124999 0.025 -0.0466506 0.0124999 0.025 -0.0466506 0.0124999 0.025 -0.0466506 0.0124999 0.025 -0.0466506 0.0124999 0.025 -0.0466506 0.0124999 0.025 -0.0466506 0.0124999 0.025 -0.00624996 0.0483253 0 -0.00624996 0.0483253 0 -0.00624996 0.0483253 0 -0.00624996 0.0483253 0 -0.00624996 0.0483253 0 -0.00624996 0.0483253 0 -0.01875 0.0449759 0 -0.01875 0.0449759 0 -0.01875 0.0449759 0 -0.01875 0.0449759 0 -0.01875 0.0449759 0 -0.01875 0.0449759 0 -0.0125 0.0466506 -0.025 -0.0125 0.0466506 -0.025 -0.0125 0.0466506 -0.025 -0.0125 0.0466506 -0.025 -0.0125 0.0466506 -0.025 -0.0125 0.0466506 -0.025 -0.0125 0.0466506 0.025 -0.0125 0.0466506 0.025 -0.0125 0.0466506 0.025 -0.0125 0.0466506 0.025 -0.0125 0.0466506 0.025 -0.0125 0.0466506 0.025 -0.0295753 0.0387259 0 -0.0295753 0.0387259 0 -0.0295753 0.0387259 0 -0.0295753 0.0387259 0 -0.0295753 0.0387259 0 -0.0295753 0.0387259 0 -0.038726 0.0295753 0 -0.038726 0.0295753 0 -0.038726 0.0295753 0 -0.038726 0.0295753 0 -0.038726 0.0295753 0 -0.038726 0.0295753 0 -0.0341507 0.0341506 -0.025 -0.0341507 0.0341506 -0.025 -0.0341507 0.0341506 -0.025 -0.0341507 0.0341506 -0.025 -0.0341507 0.0341506 -0.025 -0.0341507 0.0341506 -0.025 -0.0341507 0.0341506 0.025 -0.0341507 0.0341506 0.025 -0.0341507 0.0341506 0.025 -0.0341507 0.0341506 0.025 -0.0341507 0.0341506 0.025 -0.0341507 0.0341506 0.025 0.01875 0.0449759 0.025 0.01875 0.0449759 0.025 0.01875 0.0449759 0.025 0.01875 0.0449759 0.025 0.01875 0.0449759 0.025 0.01875 0.0449759 0.025 0.0387259 0.0295753 0.025 0.0387259 0.0295753 0.025 0.0387259 0.0295753 0.025 0.0387259 0.0295753 0.025 0.0387259 0.0295753 0.025 0.0387259 0.0295753 0.025 0.0483253 0.00624996 0.025 0.0483253 0.00624996 0.025 0.0483253 0.00624996 0.025 0.0483253 0.00624996 0.025 0.0483253 0.00624996 0.025 0.0483253 0.00624996 0.025 0.0449759 -0.01875 0.025 0.0449759 -0.01875 0.025 0.0449759 -0.01875 0.025 0.0449759 -0.01875 0.025 0.0449759 -0.01875 0.025 0.0449759 -0.01875 0.025 0.0295753 -0.0387259 0.025 0.0295753 -0.0387259 0.025 0.0295753 -0.0387259 0.025 0.0295753 -0.0387259 0.025 0.0295753 -0.0387259 0.025 0.0295753 -0.0387259 0.025 0.00624996 -0.0483253 0.025 0.00624996 -0.0483253 0.025 0.00624996 -0.0483253 0.025 0.00624996 -0.0483253 0.025 0.00624996 -0.0483253 0.025 0.00624996 -0.0483253 0.025 -0.01875 -0.0449759 0.025 -0.01875 -0.0449759 0.025 -0.01875 -0.0449759 0.025 -0.01875 -0.0449759 0.025 -0.01875 -0.0449759 0.025 -0.01875 -0.0449759 0.025 -0.0387259 -0.0295753 0.025 -0.0387259 -0.0295753 0.025 -0.0387259 -0.0295753 0.025 -0.0387259 -0.0295753 0.025 -0.0387259 -0.0295753 0.025 -0.0387259 -0.0295753 0.025 -0.0483253 -0.00624996 0.025 -0.0483253 -0.00624996 0.025 -0.0483253 -0.00624996 0.025 -0.0483253 -0.00624996 0.025 -0.0483253 -0.00624996 0.025 -0.0483253 -0.00624996 0.025 -0.0449759 0.01875 0.025 -0.0449759 0.01875 0.025 -0.0449759 0.01875 0.025 -0.0449759 0.01875 0.025 -0.0449759 0.01875 0.025 -0.0449759 0.01875 0.025 -0.00624996 0.0483253 0.025 -0.00624996 0.0483253 0.025 -0.00624996 0.0483253 0.025 -0.00624996 0.0483253 0.025 -0.00624996 0.0483253 0.025 -0.00624996 0.0483253 0.025 -0.0295753 0.0387259 0.025 -0.0295753 0.0387259 0.025 -0.0295753 0.0387259 0.025 -0.0295753 0.0387259 0.025 -0.0295753 0.0387259 0.025 -0.0295753 0.0387259 0.025 0.01875 0.0449759 -0.025 0.01875 0.0449759 -0.025 0.01875 0.0449759 -0.025 0.01875 0.0449759 -0.025 0.01875 0.0449759 -0.025 0.01875 0.0449759 -0.025 0.00624996 0.0483253 -0.025 0.00624996 0.0483253 -0.025 0.00624996 0.0483253 -0.025 0.00624996 0.0483253 -0.025 0.00624996 0.0483253 -0.025 0.00624996 0.0483253 -0.025 0.00624996 0.0483253 0.025 0.00624996 0.0483253 0.025 0.00624996 0.0483253 0.025 0.00624996 0.0483253 0.025 0.00624996 0.0483253 0.025 0.00624996 0.0483253 0.025 0.0387259 0.0295753 -0.025 0.0387259 0.0295753 -0.025 0.0387259 0.0295753 -0.025 0.0387259 0.0295753 -0.025 0.0387259 0.0295753 -0.025 0.0387259 0.0295753 -0.025 0.0295753 0.0387259 -0.025 0.0295753 0.0387259 -0.025 0.0295753 0.0387259 -0.025 0.0295753 0.0387259 -0.025 0.0295753 0.0387259 -0.025 0.0295753 0.0387259 -0.025 0.0295753 0.0387259 0.025 0.0295753 0.0387259 0.025 0.0295753 0.0387259 0.025 0.0295753 0.0387259 0.025 0.0295753 0.0387259 0.025 0.0295753 0.0387259 0.025 0.0483253 0.00624996 -0.025 0.0483253 0.00624996 -0.025 0.0483253 0.00624996 -0.025 0.0483253 0.00624996 -0.025 0.0483253 0.00624996 -0.025 0.0483253 0.00624996 -0.025 0.0449759 0.01875 -0.025 0.0449759 0.01875 -0.025 0.0449759 0.01875 -0.025 0.0449759 0.01875 -0.025 0.0449759 0.01875 -0.025 0.0449759 0.01875 -0.025 0.0449759 0.01875 0.025 0.0449759 0.01875 0.025 0.0449759 0.01875 0.025 0.0449759 0.01875 0.025 0.0449759 0.01875 0.025 0.0449759 0.01875 0.025 0.0449759 -0.01875 -0.025 0.0449759 -0.01875 -0.025 0.0449759 -0.01875 -0.025 0.0449759 -0.01875 -0.025 0.0449759 -0.01875 -0.025 0.0449759 -0.01875 -0.025 0.0483253 -0.00624996 -0.025 0.0483253 -0.00624996 -0.025 0.0483253 -0.00624996 -0.025 0.0483253 -0.00624996 -0.025 0.0483253 -0.00624996 -0.025 0.0483253 -0.00624996 -0.025 0.0483253 -0.00624996 0.025 0.0483253 -0.00624996 0.025 0.0483253 -0.00624996 0.025 0.0483253 -0.00624996 0.025 0.0483253 -0.00624996 0.025 0.0483253 -0.00624996 0.025 0.0295753 -0.0387259 -0.025 0.0295753 -0.0387259 -0.025 0.0295753 -0.0387259 -0.025 0.0295753 -0.0387259 -0.025 0.0295753 -0.0387259 -0.025 0.0295753 -0.0387259 -0.025 0.0387259 -0.0295753 -0.025 0.0387259 -0.0295753 -0.025 0.0387259 -0.0295753 -0.025 0.0387259 -0.0295753 -0.025 0.0387259 -0.0295753 -0.025 0.0387259 -0.0295753 -0.025 0.0387259 -0.0295753 0.025 0.0387259 -0.0295753 0.025 0.0387259 -0.0295753 0.025 0.0387259 -0.0295753 0.025 0.0387259 -0.0295753 0.025 0.0387259 -0.0295753 0.025 0.00624996 -0.0483253 -0.025 0.00624996 -0.0483253 -0.025 0.00624996 -0.0483253 -0.025 0.00624996 -0.0483253 -0.025 0.00624996 -0.0483253 -0.025 0.00624996 -0.0483253 -0.025 0.01875 -0.0449759 -0.025 0.01875 -0.0449759 -0.025 0.01875 -0.0449759 -0.025 0.01875 -0.0449759 -0.025 0.01875 -0.0449759 -0.025 0.01875 -0.0449759 -0.025 0.01875 -0.0449759 0.025 0.01875 -0.0449759 0.025 0.01875 -0.0449759 0.025 0.01875 -0.0449759 0.025 0.01875 -0.0449759 0.025 0.01875 -0.0449759 0.025 -0.01875 -0.0449759 -0.025 -0.01875 -0.0449759 -0.025 -0.01875 -0.0449759 -0.025 -0.01875 -0.0449759 -0.025 -0.01875 -0.0449759 -0.025 -0.01875 -0.0449759 -0.025 -0.00624996 -0.0483253 -0.025 -0.00624996 -0.0483253 -0.025 -0.00624996 -0.0483253 -0.025 -0.00624996 -0.0483253 -0.025 -0.00624996 -0.0483253 -0.025 -0.00624996 -0.0483253 -0.025 -0.00624996 -0.0483253 0.025 -0.00624996 -0.0483253 0.025 -0.00624996 -0.0483253 0.025 -0.00624996 -0.0483253 0.025 -0.00624996 -0.0483253 0.025 -0.00624996 -0.0483253 0.025 -0.0387259 -0.0295753 -0.025 -0.0387259 -0.0295753 -0.025 -0.0387259 -0.0295753 -0.025 -0.0387259 -0.0295753 -0.025 -0.0387259 -0.0295753 -0.025 -0.0387259 -0.0295753 -0.025 -0.0295753 -0.0387259 -0.025 -0.0295753 -0.0387259 -0.025 -0.0295753 -0.0387259 -0.025 -0.0295753 -0.0387259 -0.025 -0.0295753 -0.0387259 -0.025 -0.0295753 -0.0387259 -0.025 -0.0295753 -0.0387259 0.025 -0.0295753 -0.0387259 0.025 -0.0295753 -0.0387259 0.025 -0.0295753 -0.0387259 0.025 -0.0295753 -0.0387259 0.025 -0.0295753 -0.0387259 0.025 -0.0483253 -0.00624996 -0.025 -0.0483253 -0.00624996 -0.025 -0.0483253 -0.00624996 -0.025 -0.0483253 -0.00624996 -0.025 -0.0483253 -0.00624996 -0.025 -0.0483253 -0.00624996 -0.025 -0.0449759 -0.01875 -0.025 -0.0449759 -0.01875 -0.025 -0.0449759 -0.01875 -0.025 -0.0449759 -0.01875 -0.025 -0.0449759 -0.01875 -0.025 -0.0449759 -0.01875 -0.025 -0.0449759 -0.01875 0.025 -0.0449759 -0.01875 0.025 -0.0449759 -0.01875 0.025 -0.0449759 -0.01875 0.025 -0.0449759 -0.01875 0.025 -0.0449759 -0.01875 0.025 -0.0449759 0.01875 -0.025 -0.0449759 0.01875 -0.025 -0.0449759 0.01875 -0.025 -0.0449759 0.01875 -0.025 -0.0449759 0.01875 -0.025 -0.0449759 0.01875 -0.025 -0.0483253 0.00624996 -0.025 -0.0483253 0.00624996 -0.025 -0.0483253 0.00624996 -0.025 -0.0483253 0.00624996 -0.025 -0.0483253 0.00624996 -0.025 -0.0483253 0.00624996 -0.025 -0.0483253 0.00624996 0.025 -0.0483253 0.00624996 0.025 -0.0483253 0.00624996 0.025 -0.0483253 0.00624996 0.025 -0.0483253 0.00624996 0.025 -0.00624996 0.0483253 -0.025 -0.00624996 0.0483253 -0.025 -0.00624996 0.0483253 -0.025 -0.00624996 0.0483253 -0.025 -0.00624996 0.0483253 -0.025 -0.00624996 0.0483253 -0.025 -0.01875 0.0449759 -0.025 -0.01875 0.0449759 -0.025 -0.01875 0.0449759 -0.025 -0.01875 0.0449759 -0.025 -0.01875 0.0449759 -0.025 -0.01875 0.0449759 -0.025 -0.01875 0.0449759 0.025 -0.01875 0.0449759 0.025 -0.01875 0.0449759 0.025 -0.01875 0.0449759 0.025 -0.01875 0.0449759 0.025 -0.01875 0.0449759 0.025 -0.0295753 0.0387259 -0.025 -0.0295753 0.0387259 -0.025 -0.0295753 0.0387259 -0.025 -0.0295753 0.0387259 -0.025 -0.0295753 0.0387259 -0.025 -0.0295753 0.0387259 -0.025 -0.038726 0.0295753 -0.025 -0.038726 0.0295753 -0.025 -0.038726 0.0295753 -0.025 -0.038726 0.0295753 -0.025 -0.038726 0.0295753 -0.025 -0.038726 0.0295753 -0.025 -0.038726 0.0295753 0.025 -0.038726 0.0295753 0.025 -0.038726 0.0295753 0.025 -0.038726 0.0295753 0.025 -0.038726 0.0295753 0.025 -0.038726 0.0295753 0.025 } Indices FALSE Binding BIND_PER_VERTEX Normalize 0 } NormalData { Array TRUE ArrayID 4 Vec3fArray 1428 { 0.258819 0.965926 0 0 0 -1 0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 0.258819 0.965926 0 0 0 1 -0.258819 0.965926 0 0.707107 0.707107 0 0 0 -1 0.258819 0.965926 0 0.707107 0.707107 0 0.258819 0.965926 0 0.707107 0.707107 0 0.258819 0.965926 0 0 0 1 0.965926 0.258819 0 0 0 -1 0.707107 0.707107 0 0.965926 0.258819 0 0.707107 0.707107 0 0.965926 0.258819 0 0.707107 0.707107 0 0 0 1 0.965926 -0.258819 0 0 0 -1 0.965926 0.258819 0 0.965926 -0.258819 0 0.965926 0.258819 0 0.965926 -0.258819 0 0.965926 0.258819 0 0 0 1 0.707107 -0.707107 0 0 0 -1 0.965926 -0.258819 0 0.707107 -0.707107 0 0.965926 -0.258819 0 0.707107 -0.707107 0 0.965926 -0.258819 0 0 0 1 0.258819 -0.965926 0 0 0 -1 0.707107 -0.707107 0 0.258819 -0.965926 0 0.707107 -0.707107 0 0.258819 -0.965926 0 0.707107 -0.707107 0 0 0 1 -0.258819 -0.965926 0 0 0 -1 0.258819 -0.965926 0 -0.258819 -0.965926 0 0.258819 -0.965926 0 -0.258819 -0.965926 0 0.258819 -0.965926 0 0 0 1 -0.707107 -0.707107 0 0 0 -1 -0.258819 -0.965926 0 -0.707107 -0.707107 0 -0.258819 -0.965926 0 -0.707107 -0.707107 0 -0.258819 -0.965926 0 0 0 1 -0.965926 -0.25882 0 0 0 -1 -0.707106 -0.707107 0 -0.965926 -0.25882 0 -0.707106 -0.707107 0 -0.965926 -0.25882 0 -0.707106 -0.707107 0 0 0 1 -0.965926 0.258819 0 0 0 -1 -0.965926 -0.25882 0 -0.965926 0.258819 0 -0.965926 -0.25882 0 -0.965926 0.258819 0 -0.965926 -0.25882 0 0 0 1 -0.707107 0.707106 0 0 0 -1 -0.965926 0.258819 0 -0.707107 0.707106 0 -0.965926 0.258819 0 -0.707107 0.707106 0 -0.965926 0.258819 0 0 0 1 -0.258819 0.965926 0 0 0 -1 -0.258819 0.965926 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.258819 0.965926 0 0 0 1 -0.707107 0.707106 0 0.258819 0.965926 0 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0 0 1 0 0 1 0 0 1 0 0 1 0.258819 0.965926 0 -0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.707107 0.707107 0 0.707107 0.707107 0 0.258819 0.965926 0 0.258819 0.965926 0 0.707107 0.707107 0 0.707107 0.707107 0 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0.707107 0.707107 0 0.707106 0.707107 0 0.707106 0.707107 0 0.707107 0.707107 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0.707106 0.707107 0 0.707107 0.707107 0 0.965926 0.258819 0 0.965926 0.258819 0 0.707107 0.707107 0 0.707107 0.707107 0 0.965926 0.258819 0 0.965926 0.258819 0 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 -0.258819 0 0 0 -1 0.965926 -0.258819 0 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0.965926 -0.258819 0 0.965926 -0.258819 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0.707107 -0.707107 0 0.707107 -0.707107 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0.258819 -0.965926 0 0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 -0.258819 -0.965926 0 -0.258819 -0.965926 0 0 0 1 -0.258819 -0.965926 0 -0.258819 -0.965926 0 0 0 1 0 0 1 0 0 1 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.707107 -0.707107 0 -0.707107 -0.707107 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.707107 -0.707107 0 0 0 -1 -0.707107 -0.707107 0 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 -0.707107 -0.707107 0 -0.707106 -0.707107 0 0 0 1 -0.707106 -0.707107 0 -0.707107 -0.707107 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 -0.707106 -0.707107 0 -0.707106 -0.707107 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.707106 -0.707107 0 -0.707106 -0.707107 0 -0.965926 -0.25882 0 -0.965926 -0.258819 0 0 0 -1 0 0 -1 0 0 -1 0 0 -1 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 -0.25882 0 -0.965926 -0.258819 0 0 0 1 0 0 1 0 0 1 0 0 1 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 0.258819 0 0 0 -1 -0.965926 0.258819 0 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 -0.965926 0.258819 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.707107 0.707106 0 -0.707107 0.707106 0 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.258819 0.965926 0 -0.25882 0.965926 0 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 -0.25882 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.25882 0.965926 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 -0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.707106 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707106 0.707107 0 0.707107 0.707107 0 0.707106 0.707107 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.258819 0.965926 0 -0.25882 0.965926 0 -0.25882 0.965926 0 -0.258819 0.965926 0 -0.25882 0.965926 0 -0.258819 0.965926 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 0.258819 0.965926 0 0 0 -1 0 0 -1 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0 0 1 0 0 1 0 0 1 0.258819 0.965926 0 -0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.707107 0.707107 0 0.707107 0.707107 0 0.258819 0.965926 0 0.258819 0.965926 0 0.707107 0.707107 0 0.707107 0.707107 0 0 0 -1 0 0 -1 0.707107 0.707107 0 0.707107 0.707107 0 0.707106 0.707107 0 0.707107 0.707107 0 0 0 1 0 0 1 0 0 1 0.707107 0.707107 0 0.707107 0.707107 0 0.965926 0.258819 0 0.965926 0.258819 0 0.707107 0.707107 0 0.707107 0.707107 0 0.965926 0.258819 0 0.965926 0.258819 0 0 0 -1 0 0 -1 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0 0 1 0 0 1 0 0 1 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0 0 -1 0 0 -1 0 0 -1 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0 0 1 0 0 1 0 0 1 0.965926 -0.258819 0 0.965926 -0.258819 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0 0 -1 0 0 -1 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0 0 1 0 0 1 0.707107 -0.707107 0 0.707107 -0.707107 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0 0 -1 0 0 -1 0 0 -1 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0 0 1 0 0 1 0 0 1 0.258819 -0.965926 0 0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 0 0 -1 0 0 -1 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 0 0 1 0 0 1 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.707107 -0.707107 0 -0.707107 -0.707107 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 0 0 -1 0 0 -1 0 0 -1 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 0 0 1 0 0 1 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.707106 -0.707107 0 -0.707106 -0.707107 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 0 0 -1 0 0 -1 0 0 -1 -0.965926 -0.25882 0 -0.965926 -0.258819 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 0 0 1 0 0 1 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 0.258819 0 -0.965926 0.258819 0 0 0 -1 0 0 -1 0 0 -1 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 0 0 1 0 0 1 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.707107 0.707106 0 -0.707107 0.707106 0 0 0 -1 0 0 -1 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 0 0 1 0 0 1 -0.707107 0.707106 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.258819 0.965926 0 -0.707107 0.707106 0 -0.258819 0.965926 0 0 0 -1 0 0 -1 -0.258819 0.965926 0 -0.25882 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 0 0 1 0 0 1 0 0 1 -0.258819 0.965926 0 0.258819 0.965926 0 0 0 -1 0 0 -1 0 0 -1 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0 0 1 0 0 1 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 0.258819 0.965926 0 -0.258819 0.965926 0 0.258819 0.965926 0 0.707107 0.707107 0 0.707107 0.707107 0 0.258819 0.965926 0 0.258819 0.965926 0 0.707107 0.707107 0 0.707106 0.707107 0 0 0 -1 0 0 -1 0 0 -1 0.707106 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0 0 1 0 0 1 0.707107 0.707107 0 0.707107 0.707107 0 0.965926 0.258819 0 0.965926 0.258819 0 0.707107 0.707107 0 0.707107 0.707107 0 0.965926 0.258819 0 0.965926 0.258819 0 0 0 -1 0 0 -1 0 0 -1 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0 0 1 0 0 1 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0 0 -1 0 0 -1 0 0 -1 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0 0 1 0 0 1 0 0 1 0.965926 -0.258819 0 0.965926 -0.258819 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0 0 -1 0 0 -1 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0 0 1 0 0 1 0.707107 -0.707107 0 0.707107 -0.707107 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0 0 -1 0 0 -1 0 0 -1 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0 0 1 0 0 1 0 0 1 0.258819 -0.965926 0 0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 0 0 -1 0 0 -1 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 0 0 1 -0.258819 -0.965926 0 0 0 1 0 0 1 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.707107 -0.707107 0 -0.707107 -0.707107 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 0 0 -1 0 0 -1 0 0 -1 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 0 0 1 0 0 1 0 0 1 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.707106 -0.707107 0 -0.707106 -0.707107 0 -0.965926 -0.25882 0 -0.965926 -0.258819 0 0 0 -1 0 0 -1 -0.965926 -0.258819 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 -0.258819 0 0 0 1 0 0 1 0 0 1 -0.965926 -0.258819 0 -0.965926 -0.25882 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 0.258819 0 -0.965926 0.258819 0 0 0 -1 0 0 -1 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 0 0 1 0 0 1 0 0 1 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.707107 0.707106 0 -0.707107 0.707106 0 0 0 -1 0 0 -1 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 0 0 1 0 0 1 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.258819 0.965926 0 -0.258819 0.965926 0 0 0 -1 0 0 -1 0 0 -1 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.25882 0.965926 0 0 0 1 0 0 1 -0.25882 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707106 0.707107 0 0.707107 0.707107 0 0.707106 0.707107 0 0.707107 0.707107 0 0.707106 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707106 0.707107 0 0.707106 0.707107 0 0.707107 0.707107 0 0.707106 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707106 0.707107 0 0.707106 0.707107 0 0.707107 0.707107 0 0.707106 0.707107 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.707106 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707107 -0.707107 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 -0.258819 0 -0.965926 -0.25882 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 -0.258819 0 -0.965926 -0.25882 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.25882 0.965926 0 -0.258819 0.965926 0 -0.25882 0.965926 0 -0.25882 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.25882 0.965926 0 -0.25882 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.25882 0.965926 0 -0.258819 0.965926 0 -0.25882 0.965926 0 -0.25882 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.25882 0.965926 0 -0.258819 0.965926 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.707106 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707107 -0.707107 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 -0.258819 0 -0.965926 -0.25882 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.25882 0.965926 0 -0.258819 0.965926 0 -0.25882 0.965926 0 -0.25882 0.965926 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707106 0.707107 0 0.707106 0.707107 0 0.707107 0.707107 0 0.707106 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707106 0.707107 0 0.707106 0.707107 0 0.707107 0.707107 0 0.707106 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.707106 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707107 -0.707107 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 -0.258819 0 -0.965926 -0.25882 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 -0.25882 0 -0.965926 -0.258819 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.25882 0.965926 0 -0.258819 0.965926 0 -0.25882 0.965926 0 -0.25882 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 } Indices FALSE Binding BIND_PER_VERTEX Normalize 0 } } } } } } } } } Matrix { 0.1 0 0 0 0 0.1 0 0 0 0 0.1 0 0 0 -0.05 1 } } } } opensurgsim-0.7.0/SurgSim/Graphics/RenderTests/ImplicitSurfaceRenderTests.cpp000066400000000000000000000327351277777236100274730ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include #include "SurgSim/Blocks/ImplicitSurface.h" #include "SurgSim/Blocks/PoseInterpolator.h" #include "SurgSim/Blocks/ShadowMapping.h" #include "SurgSim/DataStructures/Vertices.h" #include "SurgSim/Framework/BehaviorManager.h" #include "SurgSim/Framework/Component.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Framework/Scene.h" #include "SurgSim/Graphics/OsgAxesRepresentation.h" #include "SurgSim/Graphics/OsgBoxRepresentation.h" #include "SurgSim/Graphics/Camera.h" #include "SurgSim/Graphics/OsgLight.h" #include "SurgSim/Graphics/OsgManager.h" #include "SurgSim/Graphics/OsgMaterial.h" #include "SurgSim/Graphics/OsgMeshRepresentation.h" #include "SurgSim/Graphics/OsgPlaneRepresentation.h" #include "SurgSim/Graphics/OsgPointCloudRepresentation.h" #include "SurgSim/Graphics/OsgSphereRepresentation.h" #include "SurgSim/Graphics/OsgView.h" #include "SurgSim/Graphics/OsgViewElement.h" #include "SurgSim/Graphics/RenderTests/RenderTest.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Vector.h" using SurgSim::Math::RigidTransform3d; using SurgSim::Math::Vector3d; using SurgSim::Math::makeRigidTransform; using SurgSim::Math::makeRigidTranslation; namespace SurgSim { namespace Graphics { class ImplicitSurfaceRenderTests : public RenderTest { }; TEST_F(ImplicitSurfaceRenderTests, PointSpriteFluid) { Math::Vector4f diffuseColor(0.83f, 0.0f, 0.0f, 1.0f); Math::Vector4f specularColor(0.8f, 0.8f, 0.8f, 1.0f); std::array dimensions = {1280, 720}; viewElement->getView()->setDimensions(dimensions); viewElement->getCamera()->setPerspectiveProjection(45, 1.7, 0.01, 10.0); viewElement->getCamera()->setAmbientColor(Math::Vector4d(0.2, 0.2, 0.2, 1.0)); auto interpolator = std::make_shared("Interpolator"); RigidTransform3d from = makeRigidTransform( Vector3d(0.5, 0.0, -0.5), Vector3d(0.0, 0.0, 0.0), Vector3d(0.0, 1.0, 0.0)); RigidTransform3d to = makeRigidTransform( Vector3d(-0.5, 0.0, -0.5), Vector3d(0.0, 0.0, 0.0), Vector3d(0.0, 1.0, 0.0)); interpolator->setTarget(viewElement); interpolator->setStartingPose(from); interpolator->setDuration(5.0); interpolator->setEndingPose(to); interpolator->setPingPong(true); viewElement->setPose(from); viewElement->addComponent(interpolator); auto light = std::make_shared("Light"); light->setDiffuseColor(Math::Vector4d(1.0, 1.0, 1.0, 1.0)); light->setSpecularColor(Math::Vector4d(0.8, 0.8, 0.8, 1.0)); light->setLightGroupReference(SurgSim::Graphics::Representation::DefaultGroupName); auto lightElement = std::make_shared("LightElement"); lightElement->setPose(makeRigidTransform( Math::Vector3d(-0.3 , 0.1, -0.5), Math::Vector3d(0.0 ,0.0, 0.0), Math::Vector3d(0.0, 1.0, 0.0))); lightElement->addComponent(light); scene->addSceneElement(lightElement); auto axes = std::make_shared("Axes"); lightElement->addComponent(axes); std::array lightProjection = { -1.0, 1.0, -1.0, 1.0, -1.0, 1.0 }; scene->addSceneElements(Blocks::createShadowMapping(viewElement->getCamera(), light, 4096, 1024, lightProjection, 0.002, 0.75, true, 4.0, false)); scene->addSceneElements(Blocks::createImplicitSurfaceEffect(viewElement->getView(), light, scene->getSceneElement(Blocks::GROUP_SHADOW_CASTER), 0.01f, 800.0f, 4.0, diffuseColor, specularColor, "Textures/CubeMap_reflection_diffuse.png", 0.9, "Textures/CubeMap_reflection_specular.png", 0.1, 100.0f, 0.0005f, 0.75f, false)); auto cube = std::make_shared("Graphics"); cube->setSizeXYZ(0.1, 0.1, 0.1); cube->addGroupReference(Blocks::GROUP_SHADOW_RECEIVER); auto material = Graphics::buildMaterial("Shaders/s_mapping_material.vert", "Shaders/s_mapping_material.frag"); material->addUniform("vec4", "diffuseColor"); material->setValue("diffuseColor", Math::Vector4f(0.2, 0.2, 0.2, 1.0)); material->addUniform("vec4", "specularColor"); material->setValue("specularColor", Math::Vector4f(1.0, 1.0, 1.0, 1.0)); material->addUniform("float", "shininess"); material->setValue("shininess", 10.0f); cube->setMaterial(material); auto element = std::make_shared("Cube"); element->setPose(makeRigidTranslation(Math::Vector3d(0.0, 0.0, 0.25))); element->addComponent(cube); element->addComponent(material); scene->addSceneElement(element); auto sphere = std::make_shared("Graphics"); sphere->setRadius(0.1); sphere->addGroupReference(Blocks::GROUP_SHADOW_CASTER); sphere->addGroupReference(Blocks::GROUP_SHADOW_RECEIVER); material = Graphics::buildMaterial("Shaders/s_mapping_material.vert", "Shaders/s_mapping_material.frag"); material->addUniform("vec4", "diffuseColor"); material->setValue("diffuseColor", diffuseColor); material->addUniform("vec4", "specularColor"); material->setValue("specularColor", specularColor); material->addUniform("float", "shininess"); material->setValue("shininess", 10.0f); sphere->setMaterial(material); element = std::make_shared("Sphere"); element->setPose(makeRigidTranslation(Math::Vector3d(-0.25, 0.0, -0.25))); element->addComponent(sphere); element->addComponent(material); scene->addSceneElement(element); auto plane = std::make_shared("Graphics"); plane->addGroupReference(Blocks::GROUP_SHADOW_RECEIVER); material = Graphics::buildMaterial("Shaders/s_mapping_material.vert", "Shaders/s_mapping_material.frag"); material->addUniform("vec4", "diffuseColor"); material->setValue("diffuseColor", Math::Vector4f(0.2, 0.2, 0.2, 1.0)); material->addUniform("vec4", "specularColor"); material->setValue("specularColor", Math::Vector4f(1.0, 1.0, 1.0, 1.0)); material->addUniform("float", "shininess"); material->setValue("shininess", 10.0f); plane->setMaterial(material); element = std::make_shared("Plane"); element->setPose(makeRigidTranslation(Math::Vector3d(0.0, -0.1, 0.0))); element->addComponent(plane); element->addComponent(material); scene->addSceneElement(element); // Create the point cloud auto mesh = std::make_shared("Mesh"); mesh->loadMesh("Geometry/sphere.ply"); auto graphics = std::make_shared("Cloud"); for (const auto& vertex : mesh->getMesh()->getVertices()) { graphics->getVertices()->addVertex(Graphics::PointCloud::VertexType(vertex)); } graphics->setGroupReference(Blocks::GROUP_IMPLICIT_SURFACE); auto sceneElement = std::make_shared("PointSprites"); sceneElement->addComponent(graphics); scene->addSceneElement(sceneElement); runtime->start(); boost::this_thread::sleep(boost::posix_time::milliseconds(5000)); runtime->stop(); } TEST_F(ImplicitSurfaceRenderTests, StereoFluid) { Math::Vector4f diffuseColor(0.83f, 0.0f, 0.0f, 1.0f); Math::Vector4f specularColor(0.8f, 0.8f, 0.8f, 1.0f); std::array dimensions = {1280, 720}; viewElement->getView()->setDimensions(dimensions); viewElement->getCamera()->setPerspectiveProjection(45, 1.7, 0.01, 10.0); viewElement->getCamera()->setAmbientColor(Math::Vector4d(0.2, 0.2, 0.2, 1.0)); auto osgView = std::static_pointer_cast(viewElement->getView()); osgView->setStereoMode(View::STEREO_MODE_HORIZONTAL_SPLIT); osgView->setDisplayType(View::DISPLAY_TYPE_MONITOR); osgView->setScreenWidth(0.0631); osgView->setScreenHeight(0.071); osgView->setEyeSeparation(0.06); osgView->setScreenDistance(0.10); auto interpolator = std::make_shared("Interpolator"); RigidTransform3d from = makeRigidTransform( Vector3d(2.0, 0.0, -2.0), Vector3d(0.0, 0.0, 0.0), Vector3d(0.0, 1.0, 0.0)); RigidTransform3d to = makeRigidTransform( Vector3d(-2.0, 0.0, -2.0), Vector3d(0.0, 0.0, 0.0), Vector3d(0.0, 1.0, 0.0)); interpolator->setTarget(viewElement); interpolator->setStartingPose(from); interpolator->setDuration(5.0); interpolator->setEndingPose(to); interpolator->setPingPong(true); viewElement->setPose(from); viewElement->addComponent(interpolator); auto light = std::make_shared("Light"); light->setDiffuseColor(Math::Vector4d(1.0, 1.0, 1.0, 1.0)); light->setSpecularColor(Math::Vector4d(0.8, 0.8, 0.8, 1.0)); light->setLightGroupReference(SurgSim::Graphics::Representation::DefaultGroupName); auto lightElement = std::make_shared("LightElement"); lightElement->setPose(makeRigidTransform( Math::Vector3d(-0.3 , 0.1, -0.5), Math::Vector3d(0.0 ,0.0, 0.0), Math::Vector3d(0.0, 1.0, 0.0))); lightElement->addComponent(light); scene->addSceneElement(lightElement); auto axes = std::make_shared("Axes"); lightElement->addComponent(axes); std::array lightProjection = { -1.0, 1.0, -1.0, 1.0, -1.0, 1.0 }; scene->addSceneElements(Blocks::createShadowMapping(viewElement->getCamera(), light, 4096, 1024, lightProjection, 0.002, 0.75, true, 4.0, false)); scene->addSceneElements(Blocks::createImplicitSurfaceEffect(viewElement->getView(), light, scene->getSceneElement(Blocks::GROUP_SHADOW_CASTER), 0.02f, 800.0f, 4.0, diffuseColor, specularColor, "Textures/CubeMap_reflection_diffuse.png", 0.9, "Textures/CubeMap_reflection_specular.png", 0.1, 100.0f, 0.0005f, 0.75f, false)); auto cube = std::make_shared("Graphics"); cube->setSizeXYZ(0.1, 0.1, 0.1); cube->addGroupReference(Blocks::GROUP_SHADOW_RECEIVER); auto material = Graphics::buildMaterial("Shaders/s_mapping_material.vert", "Shaders/s_mapping_material.frag"); material->addUniform("vec4", "diffuseColor"); material->setValue("diffuseColor", Math::Vector4f(0.2, 0.2, 0.2, 1.0)); material->addUniform("vec4", "specularColor"); material->setValue("specularColor", Math::Vector4f(1.0, 1.0, 1.0, 1.0)); material->addUniform("float", "shininess"); material->setValue("shininess", 10.0f); cube->setMaterial(material); auto element = std::make_shared("Cube"); element->setPose(makeRigidTranslation(Math::Vector3d(0.0, 0.0, 0.25))); element->addComponent(cube); element->addComponent(material); scene->addSceneElement(element); auto sphere = std::make_shared("Graphics"); sphere->setRadius(0.1); sphere->addGroupReference(Blocks::GROUP_SHADOW_CASTER); sphere->addGroupReference(Blocks::GROUP_SHADOW_RECEIVER); material = Graphics::buildMaterial("Shaders/s_mapping_material.vert", "Shaders/s_mapping_material.frag"); material->addUniform("vec4", "diffuseColor"); material->setValue("diffuseColor", diffuseColor); material->addUniform("vec4", "specularColor"); material->setValue("specularColor", specularColor); material->addUniform("float", "shininess"); material->setValue("shininess", 10.0f); sphere->setMaterial(material); element = std::make_shared("Sphere"); element->setPose(makeRigidTranslation(Math::Vector3d(-0.25, 0.0, -0.25))); element->addComponent(sphere); element->addComponent(material); scene->addSceneElement(element); auto plane = std::make_shared("Graphics"); plane->addGroupReference(Blocks::GROUP_SHADOW_RECEIVER); material = Graphics::buildMaterial("Shaders/s_mapping_material.vert", "Shaders/s_mapping_material.frag"); material->addUniform("vec4", "diffuseColor"); material->setValue("diffuseColor", Math::Vector4f(0.2, 0.2, 0.2, 1.0)); material->addUniform("vec4", "specularColor"); material->setValue("specularColor", Math::Vector4f(1.0, 1.0, 1.0, 1.0)); material->addUniform("float", "shininess"); material->setValue("shininess", 10.0f); plane->setMaterial(material); element = std::make_shared("Plane"); element->setPose(makeRigidTranslation(Math::Vector3d(0.0, -0.1, 0.0))); element->addComponent(plane); element->addComponent(material); scene->addSceneElement(element); // Create the point cloud auto mesh = std::make_shared("Mesh"); mesh->loadMesh("Geometry/sphere.ply"); auto graphics = std::make_shared("Cloud"); for (const auto& vertex : mesh->getMesh()->getVertices()) { graphics->getVertices()->addVertex(Graphics::PointCloud::VertexType(vertex)); } graphics->setGroupReference(Blocks::GROUP_IMPLICIT_SURFACE); auto sceneElement = std::make_shared("PointSprites"); sceneElement->addComponent(graphics); scene->addSceneElement(sceneElement); runtime->start(); boost::this_thread::sleep(boost::posix_time::milliseconds(5000)); runtime->stop(); } }; // namespace Graphics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Graphics/RenderTests/OsgBoxRepresentationRenderTests.cpp000066400000000000000000000141761277777236100305330ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Render Tests for the OsgBoxRepresentation class. #include "SurgSim/Graphics/OsgBoxRepresentation.h" #include "SurgSim/Framework/BasicSceneElement.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Framework/Scene.h" #include "SurgSim/Framework/SceneElement.h" #include "SurgSim/Graphics/OsgCamera.h" #include "SurgSim/Graphics/OsgManager.h" #include "SurgSim/Graphics/OsgView.h" #include "SurgSim/Graphics/OsgViewElement.h" #include "SurgSim/Graphics/RenderTests/RenderTest.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Testing/MathUtilities.h" #include #include using SurgSim::Framework::Runtime; using SurgSim::Framework::Scene; using SurgSim::Framework::SceneElement; using SurgSim::Math::Quaterniond; using SurgSim::Math::RigidTransform3d; using SurgSim::Math::Vector3d; using SurgSim::Math::makeRigidTransform; using SurgSim::Math::makeRotationQuaternion; using SurgSim::Testing::interpolatePose; namespace SurgSim { namespace Graphics { struct OsgBoxRepresentationRenderTests : public RenderTest { }; TEST_F(OsgBoxRepresentationRenderTests, MovingBoxesTest) { /// Initial and final position (X, Y, Z) of box 1 Vector3d startPosition1(-0.1, 0.0, -0.2), finalPosition1(0.1, 0.0, -0.2); /// Initial angles (X, Y, Z) and final of the cylinder 1 Vector3d startAngles1(0.0, 0.0, 0.0), finalAngles1(-M_PI_4, -M_PI_4, -M_PI_4); /// Initial box 1 sizeX; double startSizeX1 = 0.001; /// Final box 1 sizeX; double endSizeX1 = 0.01; /// Initial box 1 sizeY; double startSizeY1 = 0.011; /// Final box 1 sizeY; double endSizeY1 = 0.02; /// Initial box 1 sizeZ; double startSizeZ1 = 0.021; /// Final box 1 sizeZ; double endSizeZ1 = 0.03; /// Initial and final position (X, Y, Z) box 2 Vector3d startPosition2(0.0, -0.1, -0.2), finalPosition2(0.0, 0.1, -0.2); /// Initial and final angles (X, Y, Z) of the box 2 Vector3d startAngles2(-M_PI_2, -M_PI_2, -M_PI_2), finalAngles2(M_PI, M_PI, M_PI); /// Initial box 2 sizeX; double startSizeX2 = 0.001; /// Final box 2 sizeX; double endSizeX2 = 0.01; /// Initial box 2 sizeX; double startSizeY2 = 0.011; /// Final box 2 sizeX; double endSizeY2 = 0.02; /// Initial box 2 sizeX; double startSizeZ2 = 0.021; /// Final box 2 sizeX; double endSizeZ2 = 0.03; /// Initial box 2 angleX; /// Number of times to step the box position and radius from start to end. /// This number of steps will be done in 1 second. int numSteps = 100; std::shared_ptr scene = runtime->getScene(); auto sceneElement = std::make_shared("Box 1"); auto boxRepresentation1 = std::make_shared("Graphics"); sceneElement->addComponent(boxRepresentation1); scene->addSceneElement(sceneElement); sceneElement = std::make_shared("Box 2"); auto boxRepresentation2 = std::make_shared("Graphics"); sceneElement->addComponent(boxRepresentation2); scene->addSceneElement(sceneElement); /// Run the thread runtime->start(); EXPECT_TRUE(graphicsManager->isInitialized()); boost::this_thread::sleep(boost::posix_time::milliseconds(1000)); enum BoxSetterType {BoxSetterTypeIndividual, BoxSetterTypeTogether, BoxSetterTypeVector3d, // Add more setter types above this line. BoxSetterTypeCount }; int boxSetterType = 0; Vector3d box1Size, box2Size; for (int i = 0; i < numSteps; ++i) { /// Calculate t in [0.0, 1.0] double t = static_cast(i) / numSteps; /// Interpolate position and orientation boxRepresentation1->getSceneElement()->setPose( interpolatePose(startAngles1, finalAngles1, startPosition1, finalPosition1, t)); boxRepresentation2->getSceneElement()->setPose( interpolatePose(startAngles2, finalAngles2, startPosition1, finalPosition2, t)); if (boxSetterType == static_cast(BoxSetterTypeIndividual)) { boxRepresentation1->setSizeX((1 - t) * startSizeX1 + t * endSizeX1); boxRepresentation1->setSizeY((1 - t) * startSizeY1 + t * endSizeY1); boxRepresentation1->setSizeZ((1 - t) * startSizeZ1 + t * endSizeZ1); boxRepresentation2->setSizeX((1 - t) * startSizeX2 + t * endSizeX2); boxRepresentation2->setSizeY((1 - t) * startSizeY2 + t * endSizeY2); boxRepresentation2->setSizeZ((1 - t) * startSizeZ2 + t * endSizeZ2); } else if (boxSetterType == static_cast(BoxSetterTypeTogether)) { boxRepresentation1->setSizeXYZ((1 - t) * startSizeX1 + t * endSizeX1, (1 - t) * startSizeY1 + t * endSizeY1, (1 - t) * startSizeZ1 + t * endSizeZ1); boxRepresentation2->setSizeXYZ((1 - t) * startSizeX2 + t * endSizeX2, (1 - t) * startSizeY2 + t * endSizeY2, (1 - t) * startSizeZ2 + t * endSizeZ2); } else if (boxSetterType == static_cast(BoxSetterTypeVector3d)) { box1Size.x() = (1 - t) * startSizeX1 + t * endSizeX1; box1Size.y() = (1 - t) * startSizeY1 + t * endSizeY1; box1Size.z() = (1 - t) * startSizeZ1 + t * endSizeZ1; boxRepresentation1->setSize(box1Size); box2Size.x() = (1 - t) * startSizeX2 + t * endSizeX2; box2Size.y() = (1 - t) * startSizeY2 + t * endSizeY2; box2Size.z() = (1 - t) * startSizeZ2 + t * endSizeZ2; boxRepresentation2->setSize(box2Size); } boxSetterType = (boxSetterType + 1) % BoxSetterTypeCount; /// The total number of steps should complete in 1 second boost::this_thread::sleep(boost::posix_time::milliseconds(1000 / numSteps)); } runtime->stop(); } }; // namespace Graphics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Graphics/RenderTests/OsgCameraRenderTests.cpp000066400000000000000000000212361277777236100262430ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Blocks/SphereElement.h" #include "SurgSim/Framework/BasicSceneElement.h" #include "SurgSim/Framework/TransferPropertiesBehavior.h" #include "SurgSim/Graphics/OsgManager.h" #include "SurgSim/Graphics/OsgCamera.h" #include "SurgSim/Graphics/OsgScreenSpaceQuadRepresentation.h" #include "SurgSim/Graphics/OsgRenderTarget.h" #include "SurgSim/Graphics/OsgBoxRepresentation.h" #include "SurgSim/Graphics/OsgGroup.h" #include "SurgSim/Graphics/OsgMaterial.h" #include "SurgSim/Graphics/OsgProgram.h" #include "SurgSim/Graphics/OsgUniform.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Graphics/RenderTests/RenderTest.h" #include "SurgSim/Testing/MathUtilities.h" using SurgSim::Framework::BasicSceneElement; using SurgSim::Math::Quaterniond; using SurgSim::Math::Vector3d; using SurgSim::Math::Vector3f; using SurgSim::Math::RigidTransform3d; std::string vertexShaderSource = "uniform vec3 ambientColor;\n" "uniform vec3 otherColor;\n" "varying vec4 color;\n" "void main(void)\n" "{\n" " vec3 lightVector = normalize(vec3(1.0,-1.0,1.0));\n" " gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n" // This is not a realy lighting calculation ... just faking something ... " color.rgb = otherColor * max(dot(gl_Normal, lightVector), 0.0) + ambientColor;\n" " color.a = 1.0;\n" "}"; std::string fragmentShaderSource = "varying vec4 color;\n" "void main(void)\n" "{\n" " gl_FragColor = color;\n" "}"; namespace SurgSim { namespace Graphics { struct OsgCameraRenderTests: public RenderTest { }; TEST_F(OsgCameraRenderTests, PassTest) { auto defaultCamera = viewElement->getCamera(); auto renderPass = std::make_shared("RenderPass"); renderPass->setProjectionMatrix(defaultCamera->getProjectionMatrix()); renderPass->setRenderGroupReference("RenderPass"); renderPass->setGroupReference(SurgSim::Graphics::Representation::DefaultGroupName); std::array dimensions = viewElement->getView()->getDimensions(); auto renderTargetOsg = std::make_shared(dimensions[0], dimensions[1], 1.0, 2, true); renderPass->setRenderTarget(renderTargetOsg); renderPass->setRenderOrder(Camera::RENDER_ORDER_PRE_RENDER, 0); auto program = std::make_shared(); program->setFragmentShaderSource(fragmentShaderSource); program->setVertexShaderSource(vertexShaderSource); auto material1 = std::make_shared("material1"); auto material2 = std::make_shared("material2"); material1->setProgram(program); material2->setProgram(program); viewElement->addComponent(material1); viewElement->addComponent(material2); renderPass->setMaterial(material2); auto uniform = std::make_shared>("ambientColor"); uniform->set(Vector3f(0.2, 0.2, 0.2)); material1->addUniform(uniform); uniform = std::make_shared>("otherColor"); uniform->set(Vector3f(1.0, 0.0, 0.0)); material1->addUniform(uniform); uniform = std::make_shared>("otherColor"); uniform->set(Vector3f(0.0, 1.0, 0.0)); material2->addUniform(uniform); viewElement->addComponent(renderPass); int screenWidth = dimensions[0]; int screenHeight = dimensions[1]; int width = dimensions[0] / 3; int height = dimensions[1] / 3; std::shared_ptr quad; quad = makeQuad("Color1", width, height, screenWidth - width, screenHeight - height); quad->setTexture(renderTargetOsg->getColorTargetOsg(0)); viewElement->addComponent(quad); quad = makeQuad("Color2", width, height, screenWidth - width, screenHeight - height * 2); quad->setTexture(renderTargetOsg->getColorTargetOsg(1)); viewElement->addComponent(quad); quad = makeQuad("Depth", width, height, 0.0, screenHeight - height); quad->setTexture(renderTargetOsg->getDepthTargetOsg()); viewElement->addComponent(quad); Quaterniond quat = Quaterniond::Identity(); RigidTransform3d startPose = SurgSim::Math::makeRigidTransform(quat, Vector3d(0.0, 0.0, -0.2)); quat = SurgSim::Math::makeRotationQuaternion(M_PI, Vector3d::UnitY().eval()); RigidTransform3d endPose = SurgSim::Math::makeRigidTransform(quat, Vector3d(0.0, 0.0, -0.2)); auto box = std::make_shared("Graphics"); box->setSizeXYZ(0.05, 0.05, 0.05); box->setGroupReference("RenderPass"); auto boxElement1 = std::make_shared("Box 1"); boxElement1->addComponent(box); boxElement1->setPose(startPose); scene->addSceneElement(boxElement1); box = std::make_shared("Graphics"); box->setSizeXYZ(0.05, 0.05, 0.05); box->setMaterial(material1); auto boxElement2 = std::make_shared("Box 2"); boxElement2->addComponent(box); boxElement2->setPose(startPose); scene->addSceneElement(boxElement2); /// Run the thread runtime->start(); int numSteps = 100; boost::this_thread::sleep(boost::posix_time::milliseconds(500)); for (int i = 0; i < numSteps; ++i) { double t = static_cast(i) / numSteps; boxElement1->setPose(SurgSim::Testing::interpolate(endPose, startPose, t)); boxElement2->setPose(SurgSim::Testing::interpolate(startPose, endPose, t)); boost::this_thread::sleep(boost::posix_time::milliseconds(1000 / 100)); } } TEST_F(OsgCameraRenderTests, Resize) { int width = 1024; int height = 768; auto copier = std::make_shared("Copier"); copier->connect(viewElement->getView(), "DimensionsDouble", viewElement->getCamera(), "ViewportSize"); auto graphics = std::make_shared("Graphics"); graphics->setSizeXYZ(0.1, 0.1, 0.1); auto element = std::make_shared("Cube"); element->addComponent(graphics); element->setPose(Math::makeRigidTranslation(Vector3d(0.0, 0.0, -0.3))); scene->addSceneElement(element); runtime->start(); boost::this_thread::sleep(boost::posix_time::milliseconds(1000)); std::array dimensions = {width + 500, height + 100}; viewElement->getView()->setDimensions(dimensions); boost::this_thread::sleep(boost::posix_time::milliseconds(1000)); std::array swapped = {dimensions[1], dimensions[0]}; viewElement->getView()->setDimensions(swapped); boost::this_thread::sleep(boost::posix_time::milliseconds(1000)); } TEST_F(OsgCameraRenderTests, MultipleRenderGroups) { std::array dimensions = { 400, 400 }; viewElement->getView()->setDimensions(dimensions); camera->setRenderGroupReference("Left"); std::array position = { 500, 100 }; auto rightElement = std::make_shared("RighViewElement"); rightElement->getView()->setDimensions(dimensions); rightElement->getView()->setPosition(position); rightElement->getCamera()->addRenderGroupReference("Right"); scene->addSceneElement(rightElement); // Left camera only auto graphics = std::make_shared("Graphics"); graphics->setSizeXYZ(0.1, 0.1, 0.1); graphics->setGroupReference("Left"); auto element = std::make_shared("CubeLeft"); element->addComponent(graphics); element->setPose(Math::makeRigidTranslation(Vector3d(-0.2, 0.0, -0.5))); scene->addSceneElement(element); // Right camera only graphics = std::make_shared("Graphics"); graphics->setSizeXYZ(0.1, 0.1, 0.1); graphics->setGroupReference("Right"); element = std::make_shared("CubeRight"); element->addComponent(graphics); element->setPose(Math::makeRigidTranslation(Vector3d(0.2, 0.0, -0.5))); scene->addSceneElement(element); // Both cameras graphics = std::make_shared("Graphics"); graphics->setSizeXYZ(0.1, 0.1, 0.1); element = std::make_shared("CubeBoth"); element->addComponent(graphics); element->setPose(Math::makeRigidTranslation(Vector3d(0.0, 0.0, -0.5))); scene->addSceneElement(element); runtime->start(); boost::this_thread::sleep(boost::posix_time::milliseconds(2000)); } }; // namespace Graphics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Graphics/RenderTests/OsgCapsuleRepresentationRenderTests.cpp000066400000000000000000000127001277777236100313660ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Render Tests for the OsgCapsuleRepresentation class. #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Framework/Scene.h" #include "SurgSim/Framework/SceneElement.h" #include "SurgSim/Graphics/OsgCapsuleRepresentation.h" #include "SurgSim/Graphics/OsgManager.h" #include "SurgSim/Graphics/OsgViewElement.h" #include "SurgSim/Graphics/RenderTests/RenderTest.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Testing/MathUtilities.h" #include using SurgSim::Framework::Runtime; using SurgSim::Framework::Scene; using SurgSim::Framework::SceneElement; using SurgSim::Math::RigidTransform3d; using SurgSim::Math::Vector2d; using SurgSim::Math::Vector3d; using SurgSim::Math::makeRigidTransform; using SurgSim::Math::makeRotationQuaternion; using SurgSim::Testing::interpolate; using SurgSim::Testing::interpolatePose; namespace SurgSim { namespace Graphics { struct OsgCapsuleRepresentationRenderTests : public RenderTest { }; TEST_F(OsgCapsuleRepresentationRenderTests, MovingCapsuleTest) { /// Add the two capsule representation to the view element std::shared_ptr capsuleRepresentation1 = std::make_shared("capsule representation 1"); viewElement->addComponent(capsuleRepresentation1); std::shared_ptr capsuleRepresentation2 = std::make_shared("capsule representation 2"); viewElement->addComponent(capsuleRepresentation2); /// Run the thread runtime->start(); EXPECT_TRUE(graphicsManager->isInitialized()); boost::this_thread::sleep(boost::posix_time::milliseconds(1000)); enum SetterType {SetterTypeIndividual, SetterTypeTogether, SetterTypeVector2d, // Add more setter types above this line. BoxSetterTypeCount }; int setterType = 0; Vector2d capsule1Size, capsule2Size; /// Initial position of capsule 1 Vector3d startPosition1(-0.1, 0.0, -0.2); /// Final position of capsule 1 Vector3d endPosition1(0.1, 0.0, -0.2); /// Initial size (radius, height) of capsule 1 Vector2d startSize1(0.001, 0.011); /// Final size (radius, height) of capsule 1 Vector2d endSize1(0.01, 0.02); /// Initial angles (X, Y, Z) of the capsule 1 Vector3d startAngles1(0.0, 0.0, 0.0); /// Final angles (X, Y, Z) of the capsule 1 Vector3d endAngles1(-M_PI_4, -M_PI_4, -M_PI_4); /// Initial position capsule 2 Vector3d startPosition2(0.0, -0.1, -0.2); /// Final position capsule 2 Vector3d endPosition2(0.0, 0.1, -0.2); /// Initial size (radius, height) of capsule 2 Vector2d startSize2(0.001, 0.01); /// Final size (radius, height) of capsule 2 Vector2d endSize2(0.011, 0.02); /// Initial angles (X, Y, Z) of the capsule 2 Vector3d startAngles2(-M_PI_2, -M_PI_2, -M_PI_2); /// Final angles (X, Y, Z) of the capsule 2 Vector3d endAngles2(M_PI, M_PI, M_PI); /// Number of times to step the capsule position and radius from start to end. /// This number of steps will be done in 1 second. int numSteps = 100; for (int i = 0; i < numSteps; ++i) { /// Calculate t in [0.0, 1.0] double t = static_cast(i) / numSteps; /// Interpolate position and angle capsuleRepresentation1->setLocalPose( interpolatePose(startAngles1, endAngles1, startPosition1, endPosition1, t)); capsuleRepresentation2->setLocalPose( interpolatePose(startAngles2, endAngles2, startPosition2, endPosition2, t)); /// Test different ways to set the size of capsule if (setterType == static_cast(SetterTypeIndividual)) { capsuleRepresentation1->setRadius(interpolate(startSize1.x(), endSize1.x(), t)); capsuleRepresentation1->setHeight(interpolate(startSize1.y(), endSize1.y(), t)); capsuleRepresentation2->setRadius(interpolate(startSize2.x(), endSize2.x(), t)); capsuleRepresentation2->setHeight(interpolate(startSize2.y(), endSize2.y(), t)); } else if (setterType == static_cast(SetterTypeTogether)) { capsuleRepresentation1->setSize(interpolate(startSize1.x(), endSize1.x(), t), interpolate(startSize1.y(), endSize1.y(), t)); capsuleRepresentation2->setSize(interpolate(startSize2.x(), endSize2.x(), t), interpolate(startSize2.y(), endSize2.y(), t)); } else if (setterType == static_cast(SetterTypeVector2d)) { capsule1Size.x() = interpolate(startSize1.x(), endSize1.x(), t); capsule1Size.y() = interpolate(startSize1.y(), endSize1.y(), t); capsuleRepresentation1->setSize(capsule1Size); capsule2Size.x() = interpolate(startSize2.x(), endSize2.x(), t); capsule2Size.y() = interpolate(startSize2.y(), endSize2.y(), t); capsuleRepresentation2->setSize(capsule2Size); } setterType = (setterType + 1) % BoxSetterTypeCount; /// The total number of steps should complete in 1 second boost::this_thread::sleep(boost::posix_time::milliseconds(1000 / numSteps)); } } }; // namespace Graphics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Graphics/RenderTests/OsgCurveRepresentationRenderTests.cpp000066400000000000000000000110731277777236100310600ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include #include "SurgSim/DataStructures/Vertices.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Framework/Scene.h" #include "SurgSim/Graphics/OsgBoxRepresentation.h" #include "SurgSim/Graphics/OsgManager.h" #include "SurgSim/Graphics/OsgMaterial.h" #include "SurgSim/Graphics/OsgLight.h" #include "SurgSim/Graphics/OsgCurveRepresentation.h" #include "SurgSim/Graphics/OsgViewElement.h" #include "SurgSim/Graphics/RenderTests/RenderTest.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Testing/MathUtilities.h" #include #include using SurgSim::Math::Vector3d; using SurgSim::Math::Vector4d; using SurgSim::Math::Vector4f; using SurgSim::Math::Quaterniond; using SurgSim::Math::RigidTransform3d; using SurgSim::Math::makeRigidTransform; using SurgSim::Math::makeRotationQuaternion; using SurgSim::Testing::interpolate; using SurgSim::Testing::interpolatePose; namespace SurgSim { namespace Graphics { struct OsgCurveRepresentationRenderTests : public RenderTest { protected: DataStructures::VerticesPlain makeCube() { typedef DataStructures::VerticesPlain::VertexType Vertex; DataStructures::VerticesPlain result; result.addVertex(Vertex(Vector3d(0.1, -0.1, 0.1))); result.addVertex(Vertex(Vector3d(0.1, -0.1, 0.1))); result.addVertex(Vertex(Vector3d(-0.1, -0.1, 0.1))); result.addVertex(Vertex(Vector3d(-0.1, -0.1, -0.1))); result.addVertex(Vertex(Vector3d(0.1, -0.1, -0.1))); result.addVertex(Vertex(Vector3d(0.1, 0.1, 0.1))); result.addVertex(Vertex(Vector3d(-0.1, 0.1, 0.1))); result.addVertex(Vertex(Vector3d(-0.1, 0.1, -0.1))); result.addVertex(Vertex(Vector3d(0.1, 0.1, -0.1))); return result; } }; TEST_F(OsgCurveRepresentationRenderTests, DynamicRotate) { auto element = std::make_shared("Element"); auto vertices = makeCube(); auto representation = std::make_shared("Curve"); element->addComponent(representation); scene->addSceneElement(element); viewElement->enableManipulator(true); viewElement->setPose(makeRigidTransform( Math::Vector3d(0.0, 0.0, -2.0), Math::Vector3d(0.0, 0.0, 0.0), Math::Vector3d(0.0, 1.0, 0.0))); auto material = buildMaterial("Shaders/material_curve.vert", "Shaders/material.frag"); material->addUniform("vec4", "diffuseColor"); material->setValue("diffuseColor", Vector4f(0.2, 0.2, 0.9, 1.0)); material->addUniform("vec4", "specularColor"); material->setValue("specularColor", Vector4f(0.4, 0.4, 0.4, 1.0)); material->addUniform("float", "shininess"); material->setValue("shininess", 64.0f); representation->setMaterial(material); element->addComponent(material); auto light = std::make_shared("Light"); // light->setLocalPose(Math::makeRigidTranslation(Math::Vector3d(0.5, 0.5, 0.5))); viewElement->addComponent(light); /// Run the thread runtime->start(); EXPECT_TRUE(graphicsManager->isInitialized()); EXPECT_TRUE(viewElement->isInitialized()); int numSteps = 10 * 60; auto widths = std::make_pair(0.1, 5.0); auto tensions = std::make_pair(0.1, 0.9); RigidTransform3d transform = makeRigidTransform(makeRotationQuaternion(0.02, Vector3d(0.0, 1.0, 1.0)), Vector3d(0.0, -0.0, 0.0)); for (int i = 0; i < numSteps; ++i) { double t = static_cast(i) / numSteps; for (size_t i = 0; i < vertices.getNumVertices(); ++i) { vertices.setVertexPosition(i, transform * vertices.getVertexPosition(i)); } representation->setWidth(interpolate(widths.first, widths.second, t)); representation->setTension(interpolate(tensions.first, tensions.second, t)); representation->updateControlPoints(vertices); boost::this_thread::sleep(boost::posix_time::milliseconds(1000.0 / 30.0)); } boost::this_thread::sleep(boost::posix_time::milliseconds(1000)); } }; // namespace Graphics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Graphics/RenderTests/OsgCylinderRepresentationRenderTests.cpp000066400000000000000000000114201277777236100315410ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Render Tests for the OsgCylinderRepresentation class. #include "SurgSim/Graphics/OsgCylinderRepresentation.h" #include "SurgSim/Graphics/RenderTests/RenderTest.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Testing/MathUtilities.h" using SurgSim::Math::Vector2d; using SurgSim::Math::Vector3d; using SurgSim::Testing::interpolate; using SurgSim::Testing::interpolatePose; namespace SurgSim { namespace Graphics { struct OsgCylinderRepresentationRenderTests : public RenderTest { }; TEST_F(OsgCylinderRepresentationRenderTests, MovingCylinderTest) { /// Add the two cylinder representation to the view element std::shared_ptr cylinderRepresentation1 = std::make_shared("cylinder representation 1"); viewElement->addComponent(cylinderRepresentation1); std::shared_ptr cylinderRepresentation2 = std::make_shared("cylinder representation 2"); viewElement->addComponent(cylinderRepresentation2); /// Run the thread runtime->start(); EXPECT_TRUE(graphicsManager->isInitialized()); boost::this_thread::sleep(boost::posix_time::milliseconds(1000)); enum SetterType {SetterTypeIndividual, SetterTypeTogether, SetterTypeVector2d, // Add more setter types above this line. BoxSetterTypeCount}; int setterType = 0; Vector2d cylinder1Size, cylinder2Size; /// Initial and final position (X, Y, Z) of cylinder 1 Vector3d startPosition1(-0.1, 0.0, -0.2), finalPosition1(0.1, 0.0, -0.2); /// Initial size (radius, height) and final size of cylinder 1 Vector2d startSize1(0.001, 0.011), finalSize1(0.01, 0.02); /// Initial angles (X, Y, Z) and final of the cylinder 1 Vector3d startAngles1(0.0, 0.0, 0.0), finalAngles1(-M_PI_4, -M_PI_4, -M_PI_4); /// Initial and final position (X, Y, Z) cylinder 2 Vector3d startPosition2(0.0, -0.1, -0.2), finalPosition2(0.0, 0.1, -0.2); /// Initial and final size (radius, height) of cylinder 2 Vector2d startSize2(0.001, 0.011), finalSize2(0.01, 0.02); /// Initial and final angles (X, Y, Z) of the cylinder 2 Vector3d startAngles2(-M_PI_2, -M_PI_2, -M_PI_2), finalAngles2(M_PI, M_PI, M_PI); /// Number of times to step the cylinder position and radius from start to end. /// This number of steps will be done in 1 second. int numSteps = 100; for (int i = 0; i < numSteps; ++i) { /// Calculate t in [0.0, 1.0] double t = static_cast(i) / numSteps; /// Interpolate position and radius cylinderRepresentation1->setLocalPose( interpolatePose(startAngles1, finalAngles1, startPosition1, finalPosition1, t)); cylinderRepresentation2->setLocalPose( interpolatePose(startAngles2, finalAngles2, startPosition1, finalPosition2, t)); if(setterType == static_cast(SetterTypeIndividual)) { cylinderRepresentation1->setRadius(interpolate(startSize1.x(), finalSize1.x(), t)); cylinderRepresentation1->setHeight(interpolate(startSize1.y(), finalSize1.y(), t)); cylinderRepresentation2->setRadius(interpolate(startSize2.x(), finalSize2.x(), t)); cylinderRepresentation2->setHeight(interpolate(startSize2.y(), finalSize2.y(), t)); } else if(setterType == static_cast(SetterTypeTogether)) { cylinderRepresentation1->setSize(interpolate(startSize1.x(), finalSize1.x(), t), interpolate(startSize1.y(), finalSize1.y(), t)); cylinderRepresentation2->setSize(interpolate(startSize2.x(), finalSize2.x(), t), interpolate(startSize2.y(), finalSize2.y(), t)); } else if(setterType == static_cast(SetterTypeVector2d)) { cylinder1Size.x() = interpolate(startSize1.x(), finalSize1.x(), t); cylinder1Size.y() = interpolate(startSize1.y(), finalSize1.y(), t); cylinderRepresentation1->setSize(cylinder1Size); cylinder2Size.x() = interpolate(startSize2.x(), finalSize2.x(), t); cylinder2Size.y() = interpolate(startSize2.y(), finalSize2.y(), t); cylinderRepresentation2->setSize(cylinder2Size); } setterType = (setterType + 1) % BoxSetterTypeCount; /// The total number of steps should complete in 1 second boost::this_thread::sleep(boost::posix_time::milliseconds(1000 / numSteps)); } } }; // namespace Graphics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Graphics/RenderTests/OsgManagerRenderTests.cpp000066400000000000000000000033561277777236100264300ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Render Tests for the OsgManager class. #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Framework/Scene.h" #include "SurgSim/Graphics/OsgManager.h" #include "SurgSim/Graphics/OsgViewElement.h" #include #include #include using SurgSim::Framework::Runtime; using SurgSim::Framework::Scene; namespace SurgSim { namespace Graphics { // This does not acutally display anything TEST(OsgManagerRenderTests, StartUpTest) { std::shared_ptr runtime = std::make_shared(); std::shared_ptr manager = std::make_shared(); runtime->addManager(manager); std::shared_ptr scene = runtime->getScene(); /// Add a graphics component to the scene std::shared_ptr viewElement = std::make_shared("test view element"); scene->addSceneElement(viewElement); /// Run the thread for a moment runtime->start(); EXPECT_TRUE(manager->isInitialized()); boost::this_thread::sleep(boost::posix_time::milliseconds(1000)); runtime->stop(); } } // namespace Graphics } // namespace SurgSim opensurgsim-0.7.0/SurgSim/Graphics/RenderTests/OsgMeshRepresentationRenderTests.cpp000066400000000000000000000330511277777236100306700ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include #include "SurgSim/DataStructures/PlyReader.h" #include "SurgSim/DataStructures/Vertices.h" #include "SurgSim/Framework/BasicSceneElement.h" #include "SurgSim/Graphics/Camera.h" #include "SurgSim/Graphics/Mesh.h" #include "SurgSim/Graphics/MeshPlyReaderDelegate.h" #include "SurgSim/Graphics/OsgAxesRepresentation.h" #include "SurgSim/Graphics/OsgLight.h" #include "SurgSim/Graphics/OsgManager.h" #include "SurgSim/Graphics/OsgMaterial.h" #include "SurgSim/Graphics/OsgMeshRepresentation.h" #include "SurgSim/Graphics/OsgProgram.h" #include "SurgSim/Graphics/OsgUniform.h" #include "SurgSim/Graphics/OsgViewElement.h" #include "SurgSim/Graphics/RenderTests/RenderTest.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Testing/MathUtilities.h" #include "SurgSim/Testing/TestCube.h" #include using SurgSim::Math::Vector2d; using SurgSim::Math::Vector3d; using SurgSim::Math::Vector4d; using SurgSim::Math::Vector4f; using SurgSim::Math::Quaterniond; using SurgSim::Math::RigidTransform3d; using SurgSim::Math::makeRigidTransform; using SurgSim::Math::makeRotationQuaternion; using SurgSim::Testing::interpolate; namespace SurgSim { namespace Graphics { struct OsgMeshRepresentationRenderTests : public RenderTest { protected: std::vector cubeVertices; std::vector cubeTriangles; std::vector cubeColors; std::vector cubeTextures; std::shared_ptr makeRepresentation(const std::string& name) { auto meshRepresentation = std::make_shared(name); meshRepresentation->setLocalPose(makeRigidTransform(Quaterniond::Identity(), Vector3d(0.0, 0.0, 0.0))); return meshRepresentation; } }; TEST_F(OsgMeshRepresentationRenderTests, BasicCubeTest) { auto element = std::make_shared("Scene"); scene->addSceneElement(element); // make an empty mesh auto meshRepresentation0 = makeRepresentation("emptymesh"); meshRepresentation0->getMesh()->initialize(cubeVertices, cubeColors, std::vector(), cubeTriangles); meshRepresentation0->setUpdateOptions(MeshRepresentation::UPDATE_OPTION_COLORS | MeshRepresentation::UPDATE_OPTION_VERTICES); SurgSim::Testing::Cube::makeCube(&cubeVertices, &cubeColors, &cubeTextures, &cubeTriangles); // make a colored cube auto meshRepresentation1 = makeRepresentation("colormesh"); meshRepresentation1->getMesh()->initialize(cubeVertices, cubeColors, std::vector(), cubeTriangles); meshRepresentation1->setUpdateOptions(MeshRepresentation::UPDATE_OPTION_COLORS | MeshRepresentation::UPDATE_OPTION_VERTICES); // make a textured cube auto meshRepresentation2 = makeRepresentation("textureMesh"); meshRepresentation2->getMesh()->initialize(cubeVertices, std::vector(), cubeTextures, cubeTriangles); auto material = std::make_shared("material"); auto texture = std::make_shared(); texture->loadImage(applicationData->findFile("Textures/CubeMap_rgb_rotate.png")); auto uniform2d = std::make_shared>>("oss_diffuseMap"); uniform2d->set(texture); material->addUniform(uniform2d); meshRepresentation2->setMaterial(material); element->addComponent(material); element->addComponent(meshRepresentation0); element->addComponent(meshRepresentation1); element->addComponent(meshRepresentation2); auto axes = std::make_shared("Origin"); viewElement->addComponent(axes); struct InterpolationData { public: std::pair transform; std::pair scale; }; std::vector interpolators; InterpolationData interpolator; interpolator.transform.first = makeRigidTransform(makeRotationQuaternion(0.0, Vector3d(1.0, 1.0, 1.0)), Vector3d(-0.1, 0.0, -0.2)); interpolator.scale.first = 0.001; interpolator.transform.second = makeRigidTransform(makeRotationQuaternion(M_PI_2, Vector3d(1.0, -1.0, 1.0)), Vector3d(0.1, 0.0, -0.2)); interpolator.scale.second = 0.03; interpolators.push_back(interpolator); interpolator.transform.first = makeRigidTransform(makeRotationQuaternion(-M_PI_2, Vector3d(-1.0, -1.0, 0.0)), Vector3d(0.0, -0.1, -0.2)); interpolator.scale.first = 0.001; interpolator.transform.second = makeRigidTransform(makeRotationQuaternion(-M_PI_2, Vector3d(-1.0, 1.0 , 0.0)), Vector3d(0.0, 0.1, -0.2)); interpolator.scale.second = 0.03; interpolators.push_back(interpolator); std::vector> meshes; meshes.push_back(meshRepresentation1->getMesh()); meshes.push_back(std::make_shared(*meshRepresentation2->getMesh())); /// Run the thread runtime->start(); EXPECT_TRUE(graphicsManager->isInitialized()); EXPECT_TRUE(viewElement->isInitialized()); boost::this_thread::sleep(boost::posix_time::milliseconds(500)); int numSteps = 1000; std::vector newVertices(cubeVertices.size()); for (int i = 0; i < numSteps; ++i) { double t = static_cast(i) / numSteps; for (size_t j = 0; j < interpolators.size(); ++j) { InterpolationData data = interpolators[j]; double scale = interpolate(data.scale, t); RigidTransform3d transform = interpolate(data.transform, t); for (size_t index = 0; index < cubeVertices.size(); ++index) { newVertices[index] = transform * (cubeVertices[index] * scale); } meshes[j]->setVertexPositions(newVertices, true); if (j == 0) { // Not threadsafe update meshes[0]->dirty(); } else { // threadsafe update meshRepresentation2->updateMesh(*meshes[1]); } } if (i == 500) { for (size_t v = 0; v < cubeColors.size(); ++v) { meshes[0]->getVertex(v).data.color.setValue(Vector4d(1.0, 0.0, 0.5, 1.0)); } } /// The total number of steps should complete in 4 seconds boost::this_thread::sleep(boost::posix_time::milliseconds(4000 / numSteps)); } } TEST_F(OsgMeshRepresentationRenderTests, TextureTest) { // Create a triangle mesh for visualizing the surface of the finite element model auto graphics = std::make_shared("Mesh"); graphics->loadMesh("Geometry/wound_deformable_with_texture.ply"); // Create material to transport the Textures auto material = std::make_shared("material"); auto texture = std::make_shared(); std::string textureFilename; ASSERT_TRUE(runtime->getApplicationData()->tryFindFile("Textures/checkered.png", &textureFilename)); texture->loadImage(textureFilename); auto diffuseMapUniform = std::make_shared>("diffuseMap"); diffuseMapUniform->set(texture); material->addUniform(diffuseMapUniform); graphics->setMaterial(material); auto sceneElement = std::make_shared("Wound"); sceneElement->addComponent(graphics); sceneElement->addComponent(material); scene->addSceneElement(sceneElement); viewElement->setPose(SurgSim::Math::makeRigidTransform( Vector3d(-0.1, 0.1, -0.1), Vector3d(0.0, 0.0, 0.0), Vector3d(0.0, 0.0, 1.0))); runtime->start(); boost::this_thread::sleep(boost::posix_time::milliseconds(500)); runtime->stop(); } TEST_F(OsgMeshRepresentationRenderTests, ShaderTest) { std::string textureFilename; ASSERT_TRUE(runtime->getApplicationData()->tryFindFile("Textures/wound_deformable.png", &textureFilename)); // Create a triangle mesh for visualizing the surface of the finite element model auto graphics = std::make_shared("Mesh"); graphics->loadMesh("Geometry/wound_deformable_with_texture.ply"); // Create material to transport the Textures auto material = std::make_shared("material"); auto program = SurgSim::Graphics::loadProgram(*runtime->getApplicationData(), "Shaders/ds_mapping_material"); ASSERT_TRUE(program != nullptr); material->setProgram(program); { auto uniform = std::make_shared>("diffuseColor"); material->addUniform(uniform); material->setValue("diffuseColor", SurgSim::Math::Vector4f(0.8, 0.8, 0.8, 1.0)); } { auto uniform = std::make_shared>("specularColor"); material->addUniform(uniform); material->setValue("specularColor", SurgSim::Math::Vector4f(0.01, 0.01, 0.01, 1.0)); } { auto uniform = std::make_shared>("shininess"); material->addUniform(uniform); material->setValue("shininess", 32.0f); } { auto texture = std::make_shared(); texture->loadImage(textureFilename); auto uniform = std::make_shared>("diffuseMap"); uniform->set(texture); material->addUniform(uniform); } { auto texture = std::make_shared(); std::string blackTexture; ASSERT_TRUE(applicationData->tryFindFile("Textures/black.png", &blackTexture)); texture->loadImage(blackTexture); auto uniform = std::make_shared>("shadowMap"); uniform->set(texture); uniform->setMinimumTextureUnit(8); material->addUniform(uniform); } auto sceneElement = std::make_shared("Wound"); sceneElement->addComponent(graphics); auto light = std::make_shared("Light"); light->setDiffuseColor(Vector4d(1.0, 1.0, 1.0, 1.0)); light->setSpecularColor(Vector4d(0.8, 0.8, 0.8, 1.0)); light->setLightGroupReference(SurgSim::Graphics::Representation::DefaultGroupName); scene->addSceneElement(sceneElement); viewElement->setPose(SurgSim::Math::makeRigidTransform( Vector3d(-0.1, 0.1, -0.1), Vector3d(0.0, 0.0, 0.0), Vector3d(0.0, 0.0, 1.0))); viewElement->getCamera()->setAmbientColor(Vector4d(0.2, 0.2, 0.2, 1.0)); viewElement->getCamera()->setMaterial(material); viewElement->addComponent(material); viewElement->addComponent(light); std::dynamic_pointer_cast(viewElement->getView())->setOsgMapsUniforms(true); runtime->start(); boost::this_thread::sleep(boost::posix_time::milliseconds(500)); runtime->stop(); } TEST_F(OsgMeshRepresentationRenderTests, TriangleDeletionTest) { auto element = std::make_shared("Scene"); scene->addSceneElement(element); SurgSim::Testing::Cube::makeCube(&cubeVertices, &cubeColors, &cubeTextures, &cubeTriangles); // make a colored cube auto meshRepresentation1 = makeRepresentation("colormesh"); meshRepresentation1->getMesh()->initialize(cubeVertices, cubeColors, std::vector(), cubeTriangles); meshRepresentation1->setUpdateOptions(MeshRepresentation::UPDATE_OPTION_COLORS | MeshRepresentation::UPDATE_OPTION_VERTICES | MeshRepresentation::UPDATE_OPTION_TRIANGLES); element->addComponent(meshRepresentation1); auto axes = std::make_shared("Origin"); viewElement->addComponent(axes); viewElement->setPose(SurgSim::Math::makeRigidTransform( Vector3d(-2.0, -2.0, -2.0), Vector3d(0.0, 0.0, 0.0), Vector3d(0.0, 0.0, 1.0))); // auto view = std::dynamic_pointer_cast(viewElement->getView()); // view->enableManipulator(true); struct InterpolationData { public: std::pair transform; std::pair scale; }; InterpolationData interpolator; interpolator.transform.first = makeRigidTransform(makeRotationQuaternion(0.0, Vector3d(1.0, 1.0, 1.0)), Vector3d(-0.1, 0.0, -0.2)); interpolator.scale.first = 0.03; interpolator.transform.second = makeRigidTransform(makeRotationQuaternion(M_PI_2 * 2, Vector3d(1.0, -1.0, 1.0)), Vector3d(0.1, 0.0, -0.2)); interpolator.scale.second = 0.03; /// Run the thread runtime->start(); EXPECT_TRUE(graphicsManager->isInitialized()); EXPECT_TRUE(viewElement->isInitialized()); boost::this_thread::sleep(boost::posix_time::milliseconds(2000)); int numSteps = 1000; std::vector newVertices(cubeVertices.size()); size_t triangleCount = meshRepresentation1->getMesh()->getNumTriangles(); for (int i = 0; i < numSteps; ++i) { double t = static_cast(i) / numSteps; if (i % (numSteps / triangleCount) == 0) { size_t triangle = meshRepresentation1->getMesh()->getNumTriangles() - 1; // Leave one triangle for the mesh if (triangle > 0) { meshRepresentation1->getMesh()->removeTriangle(triangle); meshRepresentation1->getMesh()->dirty(); } } RigidTransform3d transform = interpolate(interpolator.transform, t); element->setPose(transform); /// The total number of steps should complete in 1 second boost::this_thread::sleep(boost::posix_time::milliseconds(1000 / numSteps) * 4); } } }; // namespace Graphics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Graphics/RenderTests/OsgOctreeRepresentationRenderTests.cpp000066400000000000000000000103201277777236100312070ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// Render Tests for the OsgOctreeRepresentation class. #include "SurgSim/DataStructures/EmptyData.h" #include "SurgSim/DataStructures/OctreeNode.h" #include "SurgSim/Graphics/RenderTests/RenderTest.h" #include "SurgSim/Graphics/OctreeRepresentation.h" #include "SurgSim/Graphics/OsgOctreeRepresentation.h" #include "SurgSim/Math/OctreeShape.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Math/RigidTransform.h" using SurgSim::Graphics::OsgOctreeRepresentation; using SurgSim::Graphics::OctreeRepresentation; using SurgSim::Math::OctreeShape; using SurgSim::Math::Vector3d; using SurgSim::Math::makeRigidTransform; using SurgSim::Math::makeRotationQuaternion; struct OsgOctreeRepresentationRenderTests : public SurgSim::Graphics::RenderTest { }; // An Octree(Node) is traversed in following order (the 2nd OctreeNode, i.e. OctreeNode with "1" is now shown): /* ________ /3 / 7/| /-------/ | /2__/_6_/| | | | | |/| |___|___|/|5| | | | |/ |0__|__4|/ */ TEST_F(OsgOctreeRepresentationRenderTests, OctreeSubdivide) { SurgSim::DataStructures::EmptyData emptyData; SurgSim::Math::OctreeShape::NodeType::AxisAlignedBoundingBox boundingBox; boundingBox.min() = Vector3d::Ones() * -0.2; boundingBox.max() = Vector3d::Ones() * 0.2; std::array secondLevelPositions = {{ Vector3d(-0.1, -0.1, -0.1), Vector3d(0.1, -0.1, -0.1), Vector3d(-0.1, 0.1, -0.1), Vector3d(0.1, 0.1, -0.1), Vector3d(-0.1, -0.1, 0.1), Vector3d(0.1, -0.1, 0.1), Vector3d(-0.1, 0.1, 0.1), Vector3d(0.1, 0.1, 0.1) } }; auto octree = std::make_shared(boundingBox); octree->addData(secondLevelPositions[0], 2, emptyData); octree->addData(secondLevelPositions[1], 2, emptyData); octree->addData(secondLevelPositions[3], 2, emptyData); octree->addData(secondLevelPositions[7], 2, emptyData); octree->addData(Vector3d(0.2, 0.2, 0.01), 3, emptyData); octree->addData(Vector3d(-0.2, -0.2, 0.2), 3, emptyData); octree->addData(Vector3d(0.01, 0.01, 0.11), 3, emptyData); octree->addData(Vector3d(0.01, 0.01, 0.11), 4, emptyData); auto octreeShape = std::make_shared(*octree); auto octreeRepresentation = std::make_shared("Octree Representation"); octreeRepresentation->setLocalPose(makeRigidTransform( makeRotationQuaternion(M_PI_4, Vector3d(1.0, 1.0, 1.0)), Vector3d(0.0, 0.0, -1.0)) ); viewElement->addComponent(octreeRepresentation); octreeRepresentation->setOctreeShape(octreeShape); // Path to a leaf node SurgSim::DataStructures::OctreePath path0; path0.push_back(2); // Path to a leaf node SurgSim::DataStructures::OctreePath path1; path1.push_back(7); path1.push_back(3); // Path to a internal OctreeNode SurgSim::DataStructures::OctreePath path2; path2.push_back(4); SurgSim::DataStructures::OctreePath invalidPath; invalidPath.push_back(0); invalidPath.push_back(1); /// Run the thread runtime->start(); EXPECT_TRUE(graphicsManager->isInitialized()); EXPECT_TRUE(viewElement->isInitialized()); boost::this_thread::sleep(boost::posix_time::milliseconds(1000)); octreeRepresentation->setNodeVisible(path0, true); boost::this_thread::sleep(boost::posix_time::milliseconds(500)); octreeRepresentation->setNodeVisible(path1, false); boost::this_thread::sleep(boost::posix_time::milliseconds(500)); octreeRepresentation->setNodeVisible(path2, false); boost::this_thread::sleep(boost::posix_time::milliseconds(500)); EXPECT_ANY_THROW(octreeRepresentation->setNodeVisible(invalidPath, true)); } opensurgsim-0.7.0/SurgSim/Graphics/RenderTests/OsgPlaneRepresentationRenderTests.cpp000066400000000000000000000075501277777236100310400ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Render Tests for the OsgPlaneRepresentation class. #include "SurgSim/Graphics/OsgManager.h" #include "SurgSim/Graphics/OsgPlaneRepresentation.h" #include "SurgSim/Graphics/OsgViewElement.h" #include "SurgSim/Framework/Scene.h" #include "SurgSim/Framework/SceneElement.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/Vector.h" #include #include using SurgSim::Framework::Runtime; using SurgSim::Framework::Scene; using SurgSim::Framework::SceneElement; using SurgSim::Math::Quaterniond; using SurgSim::Math::RigidTransform3d; using SurgSim::Math::Vector3d; using SurgSim::Math::makeRigidTransform; using SurgSim::Math::makeRotationQuaternion; namespace SurgSim { namespace Graphics { /// Pops up a window with two planes that are translating and rotating TEST(OsgPlaneRepresentationRenderTests, MovingPlanesTest) { /// Initial plane 1 position Vector3d startPosition1(0.0, -0.1, 0.0); /// Final plane 1 position Vector3d endPosition1(0.1, -0.2, 0.0); /// Initial plane 1 angle double startAngle1 = 0.0; /// Final plane 1 angle double endAngle1 = - M_PI / 4.0; /// Initial plane 2 position Vector3d startPosition2(-0.1, -0.2, 0.0); /// Final plane 2 position Vector3d endPosition2(0.1, -0.1, 0.1); /// Initial plane 2 angle double startAngle2 = -M_PI / 2.0; /// Final plane 2 angle double endAngle2 = M_PI; /// Number of times to step the sphere position and radius from start to end. /// This number of steps will be done in 1 second. int numSteps = 100; std::shared_ptr runtime = std::make_shared(); std::shared_ptr manager = std::make_shared(); runtime->addManager(manager); std::shared_ptr scene = runtime->getScene(); /// Add a graphics view element to the scene std::shared_ptr viewElement = std::make_shared("view element"); scene->addSceneElement(viewElement); /// Add the sphere representation to the view element, no need to make another scene element std::shared_ptr planeRepresentation1 = std::make_shared("plane representation 1"); viewElement->addComponent(planeRepresentation1); std::shared_ptr planeRepresentation2 = std::make_shared("plane representation 2"); viewElement->addComponent(planeRepresentation2); /// Run the thread runtime->start(); EXPECT_TRUE(manager->isInitialized()); boost::this_thread::sleep(boost::posix_time::milliseconds(1000)); for (int i = 0; i < numSteps; ++i) { /// Calculate t in [0.0, 1.0] double t = static_cast(i) / numSteps; /// Interpolate pose planeRepresentation1->setLocalPose(makeRigidTransform( makeRotationQuaternion((1.0 - t) * startAngle1 + t * endAngle1, Vector3d(1.0, 0.0, 0.0)), (1.0 - t) * startPosition1 + t * endPosition1)); planeRepresentation2->setLocalPose(makeRigidTransform( makeRotationQuaternion((1.0 - t) * startAngle2 + t * endAngle2, Vector3d(0.0, 0.0, 1.0)), (1.0 - t) * startPosition2 + t * endPosition2)); boost::this_thread::sleep(boost::posix_time::milliseconds(1000 / numSteps)); } runtime->stop(); } }; // namespace Graphics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Graphics/RenderTests/OsgPointCloudRepresentationRenderTests.cpp000066400000000000000000000177471277777236100320720ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include #include "SurgSim/DataStructures/Vertices.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Framework/Scene.h" #include "SurgSim/Graphics/OsgBoxRepresentation.h" #include "SurgSim/Graphics/OsgManager.h" #include "SurgSim/Graphics/OsgMaterial.h" #include "SurgSim/Graphics/OsgPointCloudRepresentation.h" #include "SurgSim/Graphics/OsgViewElement.h" #include "SurgSim/Graphics/PointCloudRepresentation.h" #include "SurgSim/Graphics/RenderTests/RenderTest.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Testing/MathUtilities.h" using SurgSim::Math::Vector3d; using SurgSim::Math::Vector4d; using SurgSim::Math::Quaterniond; using SurgSim::Math::RigidTransform3d; using SurgSim::Math::makeRigidTransform; using SurgSim::Math::makeRotationQuaternion; using SurgSim::Testing::interpolate; using SurgSim::Testing::interpolatePose; namespace SurgSim { namespace Graphics { using SurgSim::Graphics::PointCloud; struct OsgPointCloudRepresentationRenderTests : public RenderTest { protected: std::vector makeCube() { std::vector result; result.push_back(Vector3d(0.01, -0.01, 0.01)); result.push_back(Vector3d(0.01, -0.01, 0.01)); result.push_back(Vector3d(-0.01, -0.01, 0.01)); result.push_back(Vector3d(-0.01, -0.01, -0.01)); result.push_back(Vector3d(0.01, -0.01, -0.01)); result.push_back(Vector3d(0.01, 0.01, 0.01)); result.push_back(Vector3d(-0.01, 0.01, 0.01)); result.push_back(Vector3d(-0.01, 0.01, -0.01)); result.push_back(Vector3d(0.01, 0.01, -0.01)); return result; } std::shared_ptr makeCloud(std::vector vertices) { std::shared_ptr representation = std::make_shared("cloud representation"); representation->setLocalPose(makeRigidTransform(Quaterniond::Identity(), Vector3d(0.0, 0.0, -0.2))); for (auto it = std::begin(vertices); it != std::end(vertices); ++it) { representation->getVertices()->addVertex(SurgSim::Graphics::PointCloud::VertexType(*it)); } viewElement->addComponent(representation); return representation; } }; TEST_F(OsgPointCloudRepresentationRenderTests, PointAdd) { std::vector vertices = makeCube(); auto representation = std::make_shared("pointcloud representation"); auto pointCloud = representation->getVertices(); representation->setPointSize(2.0); RigidTransform3d pose = makeRigidTransform(makeRotationQuaternion(0.2, Vector3d(1.0, 1.0, 1.0)), Vector3d(0.0, 0.0, -0.2)); representation->setLocalPose(pose); viewElement->addComponent(representation); /// Run the thread runtime->start(); EXPECT_TRUE(graphicsManager->isInitialized()); EXPECT_TRUE(viewElement->isInitialized()); boost::this_thread::sleep(boost::posix_time::milliseconds(500)); for (size_t i = 0; i < vertices.size(); ++i) { pointCloud->addVertex(PointCloud::VertexType(vertices[i])); boost::this_thread::sleep(boost::posix_time::milliseconds(250)); } } TEST_F(OsgPointCloudRepresentationRenderTests, StaticRotate) { std::shared_ptr representation = makeCloud(makeCube()); /// Run the thread runtime->start(); EXPECT_TRUE(graphicsManager->isInitialized()); EXPECT_TRUE(viewElement->isInitialized()); boost::this_thread::sleep(boost::posix_time::milliseconds(500)); int numSteps = 100; Vector3d startAngles(0.0, 0.0, 0.0); Vector3d endAngles(M_PI_4, M_PI_2, M_PI_2); Vector3d startPosition(-0.1, 0.0, -0.0); Vector3d endPosition(0.1, 0.0, -0.4); for (int i = 0; i < numSteps; ++i) { /// Calculate t in [0.0, 1.0] double t = static_cast(i) / numSteps; representation->setLocalPose(interpolatePose(startAngles, endAngles, startPosition, endPosition, t)); boost::this_thread::sleep(boost::posix_time::milliseconds(1000 / numSteps)); } } TEST_F(OsgPointCloudRepresentationRenderTests, DynamicRotate) { std::vector startVertices = makeCube(); std::shared_ptr representation = makeCloud(startVertices); std::shared_ptr pointCloud = representation->getVertices(); /// Run the thread runtime->start(); EXPECT_TRUE(graphicsManager->isInitialized()); EXPECT_TRUE(viewElement->isInitialized()); boost::this_thread::sleep(boost::posix_time::milliseconds(500)); int numSteps = 100; RigidTransform3d start = makeRigidTransform(makeRotationQuaternion(-M_PI_2, Vector3d(1.0, 1.0, 1.0)), Vector3d(-0.1, 0.0, 0.2)); RigidTransform3d end = makeRigidTransform(makeRotationQuaternion(M_PI_2, Vector3d(1.0, 1.0, 1.0)), Vector3d(0.1, 0.0, -0.2)); for (int i = 0; i < numSteps; ++i) { /// Calculate t in [0.0, 1.0] double t = static_cast(i) / numSteps; RigidTransform3d currentPose = interpolate(start, end, t); int id = 0; for (auto it = std::begin(startVertices); it != std::end(startVertices); ++it, ++id) { pointCloud->setVertexPosition(id, currentPose * (*it)); } boost::this_thread::sleep(boost::posix_time::milliseconds(1000 / numSteps)); } } TEST_F(OsgPointCloudRepresentationRenderTests, PointSizeAndColor) { std::shared_ptr representation = makeCloud(makeCube()); /// Run the thread runtime->start(); EXPECT_TRUE(graphicsManager->isInitialized()); EXPECT_TRUE(viewElement->isInitialized()); boost::this_thread::sleep(boost::posix_time::milliseconds(500)); int numSteps = 100; std::pair size = std::make_pair(0.0, 20.0); std::pair color = std::make_pair(Vector4d(0.0, 1.0, 0.0, 1.0), Vector4d(1.0, 0.0, 1.0, 1.0)); for (int i = 0; i < numSteps; ++i) { /// Calculate t in [0.0, 1.0] double t = static_cast(i) / numSteps; representation->setPointSize(interpolate(size, t)); representation->setColor(interpolate(color, t)); boost::this_thread::sleep(boost::posix_time::milliseconds(1000 / numSteps)); } } TEST_F(OsgPointCloudRepresentationRenderTests, PointSprite) { std::vector vertices = makeCube(); auto graphics = std::make_shared("Cloud"); graphics->setPointSize(10.0f); graphics->setLocalPose(makeRigidTransform(Quaterniond::Identity(), Vector3d(0.0, 0.0, -0.2))); for (auto vertex : vertices) { graphics->getVertices()->addVertex(SurgSim::Graphics::PointCloud::VertexType(vertex)); } // Create material to transport the Textures auto material = std::make_shared("material"); auto texture = std::make_shared(); texture->setIsPointSprite(true); std::string textureFilename; ASSERT_TRUE(runtime->getApplicationData()->tryFindFile("Textures/checkered.png", &textureFilename)); texture->loadImage(textureFilename); auto diffuseMapUniform = std::make_shared>("diffuseMap"); diffuseMapUniform->set(texture); material->addUniform(diffuseMapUniform); graphics->setMaterial(material); auto sceneElement = std::make_shared("Blood"); sceneElement->addComponent(graphics); sceneElement->addComponent(material); scene->addSceneElement(sceneElement); runtime->start(); boost::this_thread::sleep(boost::posix_time::milliseconds(500)); runtime->stop(); } }; // namespace Graphics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Graphics/RenderTests/OsgProgramRenderTests.cpp000066400000000000000000000415031277777236100264610ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Blocks/GraphicsUtilities.h" #include "SurgSim/Framework/ApplicationData.h" #include "SurgSim/Framework/BasicSceneElement.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Framework/Scene.h" #include "SurgSim/Framework/SceneElement.h" #include "SurgSim/Graphics/OsgAxesRepresentation.h" #include "SurgSim/Graphics/OsgBoxRepresentation.h" #include "SurgSim/Graphics/OsgCamera.h" #include "SurgSim/Graphics/OsgLight.h" #include "SurgSim/Graphics/OsgManager.h" #include "SurgSim/Graphics/OsgMaterial.h" #include "SurgSim/Graphics/OsgMeshRepresentation.h" #include "SurgSim/Graphics/OsgProgram.h" #include "SurgSim/Graphics/OsgRenderTarget.h" #include "SurgSim/Graphics/OsgSceneryRepresentation.h" #include "SurgSim/Graphics/OsgSphereRepresentation.h" #include "SurgSim/Graphics/OsgUniform.h" #include "SurgSim/Graphics/OsgViewElement.h" #include "SurgSim/Graphics/Mesh.h" #include "SurgSim/Graphics/RenderTests/RenderTest.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/Vector.h" #include #include #include #include using SurgSim::Framework::Runtime; using SurgSim::Framework::Scene; using SurgSim::Framework::SceneElement; using SurgSim::Math::Quaterniond; using SurgSim::Math::RigidTransform3d; using SurgSim::Math::Vector3d; using SurgSim::Math::makeRigidTransform; namespace SurgSim { namespace Graphics { std::shared_ptr loadExampleProgram(const SurgSim::Framework::ApplicationData& data) { std::shared_ptr program = std::make_shared(); std::string vertexShaderPath = data.findFile("OsgShaderRenderTests/shader.vert"); std::string geometryShaderPath = data.findFile("OsgShaderRenderTests/shader_axis_mirrored.geom"); std::string fragmentShaderPath = data.findFile("OsgShaderRenderTests/shader.frag"); EXPECT_NE("", vertexShaderPath) << "Could not find vertex shader!"; EXPECT_NE("", geometryShaderPath) << "Could not find geometry shader!"; EXPECT_NE("", fragmentShaderPath) << "Could not find fragment shader!"; program->loadVertexShader(vertexShaderPath); program->loadGeometryShader(geometryShaderPath); program->loadFragmentShader(fragmentShaderPath); return program; } std::shared_ptr createShinyMaterial(const SurgSim::Framework::ApplicationData& data) { auto material = std::make_shared("material"); auto program = SurgSim::Graphics::loadProgram(data, "Shaders/material"); material->setProgram(program); std::shared_ptr uniform = std::make_shared>("diffuseColor"); material->addUniform(uniform); uniform = std::make_shared>("specularColor"); material->addUniform(uniform); uniform = std::make_shared>("shininess"); material->addUniform(uniform); return material; } std::shared_ptr loadAxisCubeMap( const SurgSim::Framework::ApplicationData& data, const std::string& prefix) { std::array filenames; bool success = data.tryFindFile(prefix + "NegativeX.png", &filenames[0]); success = data.tryFindFile(prefix + "PositiveX.png", &filenames[1]) && success; success = data.tryFindFile(prefix + "NegativeY.png", &filenames[2]) && success; success = data.tryFindFile(prefix + "PositiveY.png", &filenames[3]) && success; success = data.tryFindFile(prefix + "NegativeZ.png", &filenames[4]) && success; success = data.tryFindFile(prefix + "PositiveZ.png", &filenames[5]) && success; EXPECT_TRUE(success) << "One or more files are missing"; auto result = std::make_shared(); result->loadImageFaces(filenames[0], filenames[1], filenames[2], filenames[3], filenames[4], filenames[5]); return result; } void add2DTexture(std::shared_ptr material, const std::string& uniform, int unit, const std::string& filename) { std::string path; EXPECT_TRUE(Framework::Runtime::getApplicationData()->tryFindFile(filename, &path)); auto texture = std::make_shared(); texture->loadImage(path); auto textureUniform = std::make_shared>(uniform); textureUniform->set(texture); textureUniform->setMinimumTextureUnit(unit); material->addUniform(textureUniform); } struct OsgProgramRenderTests : public RenderTest { void SetUp() { RenderTest::SetUp(); // Light auto sceneElement = std::make_shared("Light"); auto light = std::make_shared("Light"); light->setDiffuseColor(SurgSim::Math::Vector4d(0.8, 0.8, 0.8, 1.0)); light->setSpecularColor(SurgSim::Math::Vector4d(0.8, 0.8, 0.8, 1.0)); light->setLightGroupReference(SurgSim::Graphics::Representation::DefaultGroupName); sceneElement->addComponent(light); sceneElement->addComponent(std::make_shared("axes")); sceneElement->setPose(makeRigidTransform(Quaterniond::Identity(), Vector3d(-2.0, -2.0, -4.0))); scene->addSceneElement(sceneElement); // Camera viewElement->getCamera()->setAmbientColor(SurgSim::Math::Vector4d(0.1, 0.1, 0.1, 1.0)); viewElement->setPose( makeRigidTransform(Vector3d(0.0, 0.0, -2.0), Vector3d(0.0, 0.0, 0.0), Vector3d(0.0, 1.0, 0.0))); viewElement->enableManipulator(true); } void run(size_t time = 500) { // Action runtime->start(); boost::this_thread::sleep(boost::posix_time::milliseconds(time)); runtime->stop(); } }; /// Pops up a window with a sphere colored by its normals and its mirror along the x-axis is also drawn using the /// geometry shader TEST_F(OsgProgramRenderTests, SphereShaderTest) { /// Add the sphere representation to the view element, no need to make another scene element std::shared_ptr sphereRepresentation = std::make_shared("sphere representation"); sphereRepresentation->setRadius(0.25); sphereRepresentation->setLocalPose(makeRigidTransform(Quaterniond::Identity(), Vector3d(0.25, 0.0, -1.0))); /// Add a material to the sphere std::shared_ptr material = std::make_shared("material"); std::shared_ptr program = loadExampleProgram(*applicationData); material->setProgram(program); sphereRepresentation->setMaterial(material); viewElement->addComponent(sphereRepresentation); viewElement->addComponent(material); run(); } TEST_F(OsgProgramRenderTests, Shiny) { /// Add the sphere representation to the view element, no need to make another scene element auto sceneElement = std::make_shared("Sphere"); std::shared_ptr sphereRepresentation = std::make_shared("sphere representation"); sphereRepresentation->setRadius(0.25); auto material = createShinyMaterial(*runtime->getApplicationData()); material->setValue("diffuseColor", SurgSim::Math::Vector4f(0.8, 0.8, 0.1, 1.0)); material->setValue("specularColor", SurgSim::Math::Vector4f(1.0, 1.0, 0.4, 1.0)); material->setValue("shininess", 64.0f); sphereRepresentation->setMaterial(material); sceneElement->addComponent(material); sceneElement->addComponent(sphereRepresentation); sceneElement->addComponent(std::make_shared("axes")); scene->addSceneElement(sceneElement); run(); } TEST_F(OsgProgramRenderTests, TexturedShiny) { // The textured Sphere std::shared_ptr sphereRepresentation = std::make_shared("sphere representation"); sphereRepresentation->setRadius(0.25); auto material = std::make_shared("material"); auto program = SurgSim::Graphics::loadProgram(*runtime->getApplicationData(), "Shaders/ds_mapping_material"); ASSERT_TRUE(program != nullptr); material->setProgram(program); std::shared_ptr uniform = std::make_shared>("diffuseColor"); material->addUniform(uniform); uniform = std::make_shared>("specularColor"); material->addUniform(uniform); uniform = std::make_shared>("shininess"); material->addUniform(uniform); material->setValue("diffuseColor", SurgSim::Math::Vector4f(0.8, 0.8, 0.1, 1.0)); material->setValue("specularColor", SurgSim::Math::Vector4f(1.0, 1.0, 0.4, 1.0)); material->setValue("shininess", 1.0f); // Provide a texture for the diffuse color std::string filename; EXPECT_TRUE(runtime->getApplicationData()->tryFindFile("Textures/checkered.png", &filename)); auto texture = std::make_shared(); texture->loadImage(filename); auto textureUniform = std::make_shared>("diffuseMap"); textureUniform->set(texture); material->addUniform(textureUniform); // Provide a fake shadow map, it's all black so no shadow contribution EXPECT_TRUE(runtime->getApplicationData()->tryFindFile("Textures/black.png", &filename)); texture = std::make_shared(); texture->loadImage(filename); textureUniform = std::make_shared>("shadowMap"); textureUniform->set(texture); textureUniform->setMinimumTextureUnit(8); material->addUniform(textureUniform); sphereRepresentation->setMaterial(material); auto sceneElement = std::make_shared("Sphere"); sceneElement->addComponent(sphereRepresentation); sceneElement->addComponent(material); sceneElement->addComponent(std::make_shared("axes")); scene->addSceneElement(sceneElement); run(); } TEST_F(OsgProgramRenderTests, Metal) { // Multiple objects used for testing the shader, utilize if needed std::shared_ptr sphere = std::make_shared("sphere"); sphere->setRadius(0.25); std::shared_ptr cube = std::make_shared("box"); auto scenery = std::make_shared("scenery"); scenery->loadModel("OsgShaderRenderTests/L_forcep.obj"); // Assign the object used for testing to the representation auto representation = std::dynamic_pointer_cast(sphere); auto material = std::make_shared("material"); auto program = SurgSim::Graphics::loadProgram(*runtime->getApplicationData(), "Shaders/s_mapping_metal"); ASSERT_TRUE(program != nullptr); material->setProgram(program); material->addUniform("vec4", "specularColor"); material->setValue("specularColor", SurgSim::Math::Vector4f(1.0, 1.0, 1.0, 1.0)); material->addUniform("float", "shininess"); material->setValue("shininess", 1024.0f); material->addUniform("float", "specularPercent"); material->setValue("specularPercent", 1.0f); material->addUniform("float", "diffusePercent"); material->setValue("diffusePercent", 0.0f); std::string filename; // Provide a fake shadow map, it's all black so no shadow contribution { EXPECT_TRUE(runtime->getApplicationData()->tryFindFile("Textures/black.png", &filename)); auto texture = std::make_shared(); texture->loadImage(filename); auto textureUniform = std::make_shared>("shadowMap"); textureUniform->set(texture); textureUniform->setMinimumTextureUnit(8); material->addUniform(textureUniform); } { // Provide the Diffuse environment map // Axis map is used for testing mapping // auto texture = loadAxisCubeMap(*runtime->getApplicationData(), "Textures/"); EXPECT_TRUE(runtime->getApplicationData()->tryFindFile( "Textures/CubeMap_reflection_diffuse.png", &filename)); auto texture = std::make_shared(); texture->loadImage(filename); material->addUniform("samplerCube", "diffuseEnvMap"); material->setValue("diffuseEnvMap", texture); } { // Provide the Specular environment map // Axis map is used for testing mapping // auto texture = loadAxisCubeMap(*runtime->getApplicationData(), "Textures/"); EXPECT_TRUE(runtime->getApplicationData()->tryFindFile( "Textures/CubeMap_reflection_specular.png", &filename)); auto texture = std::make_shared(); texture->loadImage(filename); material->addUniform("samplerCube", "specularEnvMap"); material->setValue("specularEnvMap", texture); } representation->setMaterial(material); auto sceneElement = std::make_shared("Sphere"); sceneElement->addComponent(representation); sceneElement->addComponent(material); sceneElement->addComponent(std::make_shared("axes")); scene->addSceneElement(sceneElement); run(); } TEST_F(OsgProgramRenderTests, NormalMap) { // Assign the object used for testing to the representation auto graphics = std::make_shared("scenery"); graphics->loadModel("Geometry/cube.osgt"); auto representation = std::dynamic_pointer_cast(graphics); representation->setGenerateTangents(true); auto material = std::make_shared("material"); auto program = SurgSim::Graphics::loadProgram(*runtime->getApplicationData(), "Shaders/dns_mapping_material"); ASSERT_TRUE(program != nullptr); material->setProgram(program); material->addUniform("vec4", "specularColor"); material->setValue("specularColor", SurgSim::Math::Vector4f(1.0, 1.0, 1.0, 1.0)); material->addUniform("vec4", "diffuseColor"); material->setValue("diffuseColor", SurgSim::Math::Vector4f(1.0, 1.0, 1.0, 1.0)); material->addUniform("float", "shininess"); material->setValue("shininess", 1.0f); std::string filename; add2DTexture(material, "shadowMap", 8, "Textures/black.png"); add2DTexture(material, "diffuseMap", 0, "Textures/checkered.png"); add2DTexture(material, "normalMap", 1, "Textures/bricks.png"); representation->setMaterial(material); auto sceneElement = std::make_shared("Graphics"); sceneElement->addComponent(representation); sceneElement->addComponent(material); sceneElement->addComponent(std::make_shared("axes")); scene->addSceneElement(sceneElement); viewElement->setPose(makeRigidTransform(Vector3d(0.5, 0.5, -0.5), Vector3d(0.0, 0.0, 0.0), Vector3d(0.0, 1.0, 0.0))); run(); } TEST_F(OsgProgramRenderTests, BlurShader) { auto element = std::make_shared("Graphics"); auto texture1 = std::make_shared(); std::string filename; ASSERT_TRUE(Runtime::getApplicationData()->tryFindFile("Textures/checkered.png", &filename)); texture1->loadImage(filename); auto texture2 = std::make_shared(); ASSERT_TRUE(Runtime::getApplicationData()->tryFindFile("Textures/checkered.png", &filename)); texture2->loadImage(filename); // Material auto material = Graphics::buildMaterial("Shaders/gauss_blur_horizontal.vert", "Shaders/gauss_blur.frag"); material->addUniform("float", "width"); material->setValue("width", 1024.0f); material->addUniform("float", "blurRadius"); material->setValue("blurRadius", 16.0f); material->getProgram()->setGlobalScope(true); auto graphics = std::make_shared("Quad"); graphics->setSize(1024, 1024); graphics->setLocation(0, 0); graphics->setTexture(texture1); graphics->setGroupReference("BlurrPass"); element->addComponent(graphics); auto passCamera = std::make_shared("BlurrPassCamera"); auto osgCamera = passCamera->getOsgCamera(); passCamera->setRenderGroupReference("BlurrPass"); passCamera->setGroupReference(Graphics::Representation::DefaultGroupName); osgCamera->setViewport(0, 0, 1024, 1024); osgCamera->setProjectionMatrixAsOrtho2D(0, 1024, 0, 1024); passCamera->setMaterial(material); auto renderTarget = std::make_shared(1024, 1024, 1.0, 1, false); passCamera->setRenderTarget(renderTarget); element->addComponent(passCamera); graphics = std::make_shared("DebugQuad"); graphics->setLocation(512, 512); graphics->setSize(256, 256); graphics->setTexture(passCamera->getRenderTarget()->getColorTarget(0)); element->addComponent(graphics); element->addComponent(material); scene->addSceneElement(element); run(); } }; // namespace Graphics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Graphics/RenderTests/OsgRepresentationRenderTests.cpp000066400000000000000000000215321277777236100300540ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Render Tests for the OsgBoxRepresentation class. #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Framework/Scene.h" #include "SurgSim/Framework/SceneElement.h" #include "SurgSim/Graphics/OsgAxesRepresentation.h" #include "SurgSim/Graphics/OsgBoxRepresentation.h" #include "SurgSim/Graphics/OsgCapsuleRepresentation.h" #include "SurgSim/Graphics/OsgCylinderRepresentation.h" #include "SurgSim/Graphics/OsgManager.h" #include "SurgSim/Graphics/OsgSphereRepresentation.h" #include "SurgSim/Graphics/OsgSceneryRepresentation.h" #include "SurgSim/Graphics/OsgViewElement.h" #include "SurgSim/Graphics/RenderTests/RenderTest.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/Vector.h" #include #include #include using SurgSim::Framework::Runtime; using SurgSim::Framework::Scene; using SurgSim::Framework::SceneElement; using SurgSim::Math::Quaterniond; using SurgSim::Math::RigidTransform3d; using SurgSim::Math::Vector3d; using SurgSim::Math::Vector2d; using SurgSim::Math::makeRigidTransform; using SurgSim::Math::makeRotationQuaternion; namespace SurgSim { namespace Graphics { struct OsgRepresentationRenderTests : public RenderTest { }; /// This test will put all shape one by one along the X-axis /// To make sure all shapes are aligned. /// X-axis points horizontally to the right /// Y-axis points vertically up /// Z-axis is perpendicular to the screen and points out TEST_F(OsgRepresentationRenderTests, RepresentationTest) { /// Box position Vector3d boxPosition(0.05, 0.0, -0.2); /// Capsule position Vector3d capsulePosition(-0.05, 0.0, -0.2); /// Cylinder position Vector3d cylinderPosition(-0.025, 0.0, -0.2); /// Sphere position Vector3d spherePosition(0.025, 0.0, -0.2); /// Size of the box Vector3d boxSize(0.01, 0.015, 0.01); /// Size of the capsule (radius, height) Vector2d capsuleSize(0.005, 0.015); /// Size of the cylinder Vector2d cylinderSize(0.005, 0.015); /// Radius of the sphere double sphereRadius = 0.005; /// Add representations to the view element so we don't need to make another concrete scene element std::shared_ptr boxRepresentation = std::make_shared("box representation"); viewElement->addComponent(boxRepresentation); std::shared_ptr capsuleRepresentation = std::make_shared("capsule representation"); viewElement->addComponent(capsuleRepresentation); std::shared_ptr cylinderRepresentation = std::make_shared("cylinder representation"); viewElement->addComponent(cylinderRepresentation); std::shared_ptr sphereRepresentation = std::make_shared("sphere representation"); viewElement->addComponent(sphereRepresentation); std::shared_ptr axesRepresentation = std::make_shared("axes"); viewElement->addComponent(axesRepresentation); /// Run the thread runtime->start(); boxRepresentation->setLocalPose(makeRigidTransform(Quaterniond::Identity(), boxPosition)); capsuleRepresentation->setLocalPose(makeRigidTransform(Quaterniond::Identity(), capsulePosition)); cylinderRepresentation->setLocalPose(makeRigidTransform(Quaterniond::Identity(), cylinderPosition)); sphereRepresentation->setLocalPose(makeRigidTransform(Quaterniond::Identity(), spherePosition)); axesRepresentation->setLocalPose(makeRigidTransform(Quaterniond::Identity(), Vector3d(0.0, 0.0, -0.2))); /// Set the size of box boxRepresentation->setSizeXYZ(boxSize.x(), boxSize.y(), boxSize.z()); /// Set the size of capsule /// Capsule should use Y-axis as its axis capsuleRepresentation->setSize(capsuleSize.x(), capsuleSize.y()); /// Set the size of cylinder /// Cylinder should use Y-axis as its axis cylinderRepresentation->setSize(cylinderSize.x(), cylinderSize.y()); /// Set the size of sphere sphereRepresentation->setRadius(sphereRadius); axesRepresentation->setSize(0.01); boost::this_thread::sleep(boost::posix_time::milliseconds(1500)); boxRepresentation->setDrawAsWireFrame(true); capsuleRepresentation->setDrawAsWireFrame(true); cylinderRepresentation->setDrawAsWireFrame(true); sphereRepresentation->setDrawAsWireFrame(true); boost::this_thread::sleep(boost::posix_time::milliseconds(1500)); } class LineGeometryVisitor : public osg::NodeVisitor { public : LineGeometryVisitor() : NodeVisitor(NodeVisitor::TRAVERSE_ALL_CHILDREN), m_normalsScale(0.1) { } virtual ~LineGeometryVisitor() {} void apply(osg::Node& node) // NOLINT { traverse(node); } void apply(osg::Geode& geode) // NOLINT { // Only deal with 1 geometry for now ... if (geode.getNumDrawables() > 0) { osg::Geometry* curGeom = geode.getDrawable(0)->asGeometry(); if (curGeom) { osg::Vec3Array* vertices = dynamic_cast(curGeom->getVertexArray()); auto normals = curGeom->getNormalArray(); geode.addDrawable(buildGeometry(vertices, normals, osg::Vec4(0.0, 0.0, 1.0, 1.0))); auto tangents = curGeom->getVertexAttribArray(TANGENT_VERTEX_ATTRIBUTE_ID); auto cast = dynamic_cast(tangents); ASSERT_NE(nullptr, cast); ASSERT_EQ(vertices->size(), cast->size()); geode.addDrawable(buildGeometry(vertices, tangents, osg::Vec4(1.0, 0.0, 0.0, 1.0))); auto bitangents = curGeom->getVertexAttribArray(BITANGENT_VERTEX_ATTRIBUTE_ID); cast = dynamic_cast(bitangents); ASSERT_NE(nullptr, cast); ASSERT_EQ(vertices->size(), cast->size()); geode.addDrawable(buildGeometry(vertices, bitangents, osg::Vec4(0.0, 1.0, 0.0, 1.0))); } } } osg::Geometry* buildGeometry(osg::Vec3Array* geomVertices, osg::Array* directions, osg::Vec4 color) { // create Geometry object to store all the vertices and lines primitive. osg::Geometry* linesGeom = new osg::Geometry(); osg::Vec3Array* vertices = new osg::Vec3Array(geomVertices->size() * 2); osg::Vec3 direction; for (size_t i = 0; i < geomVertices->size(); ++i) { (*vertices)[i * 2] = (*geomVertices)[i]; switch (directions->getType()) { case osg::Array::Vec3ArrayType: direction = static_cast(*directions)[i]; break; case osg::Array::Vec4ArrayType: for (int j = 0; j < 3; ++j) { direction[j] = static_cast(*directions)[i].ptr()[j]; } break; default: SURGSIM_FAILURE() << "Unhandled Array type."; } (*vertices)[i * 2 + 1] = (*geomVertices)[i] + direction * m_normalsScale; } // pass the created vertex array to the points geometry object. linesGeom->setVertexArray(vertices); // set the colors as before, plus using the above osg::Vec4Array* colors = new osg::Vec4Array; colors->push_back(color); linesGeom->setColorArray(colors, osg::Array::BIND_OVERALL); // set the normal in the same way color. osg::Vec3Array* normals = new osg::Vec3Array; normals->push_back(osg::Vec3(0.0f, -1.0f, 0.0f)); linesGeom->setNormalArray(normals, osg::Array::BIND_OVERALL); linesGeom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::LINES, 0, vertices->size())); osg::StateSet* state = linesGeom->getOrCreateStateSet(); state->setMode(GL_LIGHTING, osg::StateAttribute::PROTECTED | osg::StateAttribute::OFF); return linesGeom; } private: float m_normalsScale; }; TEST_F(OsgRepresentationRenderTests, TangentTest) { auto element = std::make_shared("sphere"); auto graphics = std::make_shared("sphere"); graphics->loadModel("Geometry/sphere0_5.obj"); //graphics->setDrawAsWireFrame(true); viewElement->enableManipulator(true); camera->setLocalPose(Math::makeRigidTransform( Vector3d(0.0, 0.0, -4.0), Vector3d(0.0, 0.0, 0.0), Vector3d(0.0, 1.0, 0.0))); osg::ref_ptr node = graphics->getOsgNode(); // Generate normals osgUtil::SmoothingVisitor sv; node->accept(sv); graphics->setGenerateTangents(true); LineGeometryVisitor visitor; node->accept(visitor); element->addComponent(graphics); scene->addSceneElement(element); runtime->start(); boost::this_thread::sleep(boost::posix_time::milliseconds(500)); runtime->stop(); } }; // namespace Graphics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Graphics/RenderTests/OsgSceneryRepresentationRenderTests.cpp000066400000000000000000000064241277777236100314100ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Render Tests for OsgSceneryRepresentation class. #include "SurgSim/Graphics/OsgModel.h" #include "SurgSim/Graphics/OsgSceneryRepresentation.h" #include "SurgSim/Graphics/RenderTests/RenderTest.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Testing/MathUtilities.h" namespace SurgSim { namespace Graphics { using SurgSim::Math::Vector3d; using SurgSim::Testing::interpolatePose; struct OsgSceneryRepresentationRenderTests : public RenderTest { }; TEST_F(OsgSceneryRepresentationRenderTests, RenderTest) { /// Initial position of object 1 Vector3d startPosition1(-5.0, 0.0, -5.0); /// Final position of object 1 Vector3d endPosition1(5.0, 0.0, -5.0); /// Initial angles (X, Y, Z) of object 1 Vector3d startAngles1(0.0, 0.0, 0.0); /// Final angles (X, Y, Z) of object 1 Vector3d endAngles1(-M_PI_4, -M_PI_4, -M_PI_4); /// Initial position of object 2 Vector3d startPosition2(0.0, -5.0, -5.0); /// Final position of object 2 Vector3d endPosition2(0.0, 5.0, -5.0); /// Initial angles (X, Y, Z) of object 2 Vector3d startAngles2(-M_PI_2, -M_PI_2, -M_PI_2); /// Final angles (X, Y, Z) of object 2 Vector3d endAngles2(M_PI, M_PI, M_PI); /// Number of times to step the objects' position from start to end. /// This number of steps will be done in 1 second. int numSteps = 100; auto sceneryObject1 = std::make_shared("Torus1"); sceneryObject1->loadModel("Geometry/Torus.obj"); sceneryObject1->setLocalPose(SurgSim::Math::makeRigidTransform( SurgSim::Math::Quaterniond::Identity(), startPosition1)); viewElement->addComponent(sceneryObject1); auto sceneryObject2 = std::make_shared("Torus2"); auto torus = std::make_shared(); torus->load("Geometry/Torus.osgb"); sceneryObject2->setModel(torus); sceneryObject2->setLocalPose(SurgSim::Math::makeRigidTransform( SurgSim::Math::Quaterniond::Identity(), startPosition2)); viewElement->addComponent(sceneryObject2); runtime->start(); for (int i = 0; i < numSteps; ++i) { /// Calculate t in [0.0, 1.0] double t = static_cast(i) / numSteps; /// Interpolate position sceneryObject1->setLocalPose(interpolatePose(startAngles1, endAngles1, startPosition1, endPosition1, t)); sceneryObject2->setLocalPose(interpolatePose(startAngles2, endAngles2, startPosition2, endPosition2, t)); /// The total number of steps should complete in 1 second boost::this_thread::sleep(boost::posix_time::milliseconds(1000 / numSteps)); } std::cout << sceneryObject2->encode(); } } // namespace Graphics } // namespace SurgSim opensurgsim-0.7.0/SurgSim/Graphics/RenderTests/OsgScreenSpaceQuadRenderTests.cpp000066400000000000000000000173131277777236100300620ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Framework/ApplicationData.h" #include "SurgSim/Framework/BasicSceneElement.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Framework/Scene.h" #include "SurgSim/Graphics/Material.h" #include "SurgSim/Graphics/OsgBoxRepresentation.h" #include "SurgSim/Graphics/OsgCamera.h" #include "SurgSim/Graphics/OsgGroup.h" #include "SurgSim/Graphics/OsgManager.h" #include "SurgSim/Graphics/OsgMaterial.h" #include "SurgSim/Graphics/OsgRenderTarget.h" #include "SurgSim/Graphics/OsgScreenSpaceQuadRepresentation.h" #include "SurgSim/Graphics/OsgTexture.h" #include "SurgSim/Graphics/OsgTexture2d.h" #include "SurgSim/Graphics/OsgTextureRectangle.h" #include "SurgSim/Graphics/OsgUniform.h" #include "SurgSim/Graphics/OsgViewElement.h" #include "SurgSim/Graphics/RenderTests/RenderTest.h" #include "SurgSim/Graphics/View.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Testing/MathUtilities.h" using SurgSim::Framework::BasicSceneElement; using SurgSim::Math::Vector3d; using SurgSim::Math::Quaterniond; using SurgSim::Math::RigidTransform3d; namespace SurgSim { namespace Graphics { struct OsgScreenSpaceQuadRenderTests : public RenderTest { }; TEST_F(OsgScreenSpaceQuadRenderTests, InitTest) { std::shared_ptr quad = std::make_shared("Screen Quad"); viewElement->addComponent(quad); /// Run the thread runtime->start(); EXPECT_TRUE(graphicsManager->isInitialized()); EXPECT_TRUE(viewElement->isInitialized()); quad->setSize(100, 100); boost::this_thread::sleep(boost::posix_time::milliseconds(1000)); auto dimensions = viewElement->getView()->getDimensions(); SurgSim::Math::Vector3d startPosition(0.0, 0.0, 0.0); SurgSim::Math::Vector3d endPosition(dimensions[0], dimensions[1], 0.0); SurgSim::Math::Vector2d startSize(0.0, 0.0); SurgSim::Math::Vector2d endSize(200, 200); int numSteps = 100; for (int i = 0; i < numSteps; ++i) { /// Calculate t in [0.0, 1.0] double t = static_cast(i) / numSteps; RigidTransform3d currentPose = SurgSim::Testing::interpolatePose( Vector3d::Identity(), Vector3d::Identity(), startPosition, endPosition, t); quad->setLocalPose(currentPose); SurgSim::Math::Vector2d size = SurgSim::Testing::interpolate(startSize, endSize, t); quad->setSize(size.x(), size.y()); boost::this_thread::sleep(boost::posix_time::milliseconds(1000 / numSteps)); } } TEST_F(OsgScreenSpaceQuadRenderTests, TextureTest) { std::string checkerTexturePath = applicationData->findFile("Textures/CheckerBoard.png"); std::string rectangleTexturePath = applicationData->findFile("Textures/Rectangle.png"); EXPECT_NE("", checkerTexturePath) << "Could not find checker texture shader!"; EXPECT_NE("", rectangleTexturePath) << "Could not find rectangle texture!"; std::shared_ptr checkerTexture = std::make_shared(); EXPECT_TRUE(checkerTexture->loadImage(checkerTexturePath)); std::shared_ptr rectTexture = std::make_shared(); EXPECT_TRUE(rectTexture->loadImage(rectangleTexturePath)); std::shared_ptr quad1 = std::make_shared("Screen Quad 1"); auto dimensions = viewElement->getView()->getDimensions(); quad1->setSize(256, 256); quad1->setLocalPose(SurgSim::Math::makeRigidTransform( Quaterniond::Identity(), Vector3d(dimensions[0] - 256, dimensions[1] - 256, -0.2))); EXPECT_TRUE(quad1->setTexture(checkerTexture)); viewElement->addComponent(quad1); std::shared_ptr quad2 = std::make_shared("Screen Quad 2"); int width, height; rectTexture->getSize(&width, &height); EXPECT_TRUE(quad2->setTexture(rectTexture)); quad2->setSize(width, height); viewElement->addComponent(quad2); /// Run the thread runtime->start(); EXPECT_TRUE(graphicsManager->isInitialized()); EXPECT_TRUE(viewElement->isInitialized()); boost::this_thread::sleep(boost::posix_time::milliseconds(1000)); } // Should show two rotating cubes, one in the middle of the screen being rendered normally, the // other one in the top right hand corner, being rendered onto a texture mapped on a quad TEST_F(OsgScreenSpaceQuadRenderTests, RenderTextureTest) { auto defaultCamera = viewElement->getCamera(); auto camera = std::make_shared("RenderPass"); camera->setProjectionMatrix(defaultCamera->getProjectionMatrix()); camera->setRenderGroupReference("RenderPass"); camera->setGroupReference(SurgSim::Graphics::Representation::DefaultGroupName); auto dimensions = viewElement->getView()->getDimensions(); std::shared_ptr renderTargetOsg = std::make_shared(dimensions[0], dimensions[1], 1.0, 2, true); camera->setRenderTarget(renderTargetOsg); viewElement->addComponent(camera); int screenWidth = dimensions[0]; int screenHeight = dimensions[1]; int width = dimensions[0] / 3; int height = dimensions[1] / 3; std::shared_ptr quad; quad = makeQuad("Color1", width, height, screenWidth - width, screenHeight - height); quad->setTexture(renderTargetOsg->getColorTargetOsg(0)); viewElement->addComponent(quad); quad = makeQuad("Color2", width, height, screenWidth - width, screenHeight - height * 2); quad->setTexture(renderTargetOsg->getColorTargetOsg(1)); viewElement->addComponent(quad); quad = makeQuad("Depth", width, height, 0.0, screenHeight - height); quad->setTexture(renderTargetOsg->getDepthTargetOsg()); viewElement->addComponent(quad); Quaterniond quat = Quaterniond::Identity(); RigidTransform3d startPose = SurgSim::Math::makeRigidTransform(quat, Vector3d(0.0, 0.0, -0.2)); quat = SurgSim::Math::makeRotationQuaternion(M_PI, Vector3d::UnitY().eval()); RigidTransform3d endPose = SurgSim::Math::makeRigidTransform(quat, Vector3d(0.0, 0.0, -0.2)); auto box = std::make_shared("Graphics"); box->setSizeXYZ(0.05, 0.05, 0.05); box->setGroupReference("RenderPass"); auto boxElement1 = std::make_shared("Box 1"); boxElement1->addComponent(box); boxElement1->setPose(startPose); scene->addSceneElement(boxElement1); box = std::make_shared("Graphics"); box->setSizeXYZ(0.05, 0.05, 0.05); auto boxElement2 = std::make_shared("Box 2"); boxElement2->addComponent(box); boxElement2->setPose(startPose); scene->addSceneElement(boxElement2); /// Run the thread runtime->start(); int numSteps = 100; boost::this_thread::sleep(boost::posix_time::milliseconds(1000)); for (int i = 0; i < numSteps; ++i) { double t = static_cast(i) / numSteps; boxElement1->setPose(SurgSim::Testing::interpolate(startPose, endPose, t)); boxElement2->setPose(SurgSim::Testing::interpolate(endPose, startPose, t)); boost::this_thread::sleep(boost::posix_time::milliseconds(1000 / 100)); } graphicsManager->dumpDebugInfo(); } }; // namespace Graphics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Graphics/RenderTests/OsgSkeletonRepresentationRenderTests.cpp000066400000000000000000000154441277777236100315660ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include #include "SurgSim/DataStructures/Vertices.h" #include "SurgSim/Framework/BasicSceneElement.h" #include "SurgSim/Graphics/Camera.h" #include "SurgSim/Graphics/OsgAxesRepresentation.h" #include "SurgSim/Graphics/OsgLight.h" #include "SurgSim/Graphics/OsgManager.h" #include "SurgSim/Graphics/OsgMaterial.h" #include "SurgSim/Graphics/OsgProgram.h" #include "SurgSim/Graphics/OsgSkeletonRepresentation.h" #include "SurgSim/Graphics/OsgUniform.h" #include "SurgSim/Graphics/OsgViewElement.h" #include "SurgSim/Graphics/RenderTests/RenderTest.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Testing/MathUtilities.h" #include "SurgSim/Testing/TestCube.h" #include using SurgSim::Math::Vector2d; using SurgSim::Math::Vector3d; using SurgSim::Math::Vector4d; using SurgSim::Math::Vector4f; using SurgSim::Math::Quaterniond; using SurgSim::Math::RigidTransform3d; using SurgSim::Math::makeRigidTransform; using SurgSim::Math::makeRotationQuaternion; using SurgSim::Testing::interpolate; namespace SurgSim { namespace Graphics { struct OsgSkeletonRepresentationRenderTests : public RenderTest { }; TEST_F(OsgSkeletonRepresentationRenderTests, BasicTest) { auto graphics = std::make_shared("Skeleton"); graphics->loadModel("OsgSkeletonRepresentationRenderTests/rigged_cylinder.osgt"); graphics->setSkinningShaderFileName("Shaders/skinning.vert"); auto sceneElement = std::make_shared("Rigged Cylinder"); sceneElement->addComponent(graphics); scene->addSceneElement(sceneElement); viewElement->setPose(SurgSim::Math::makeRigidTransform( Vector3d(-0.3, 0.3, -0.3), Vector3d(0.0, 0.0, 0.0), Vector3d(0.0, 0.0, 1.0))); runtime->start(); boost::this_thread::sleep(boost::posix_time::milliseconds(2000)); std::pair rootTransform; rootTransform.first = makeRigidTransform(makeRotationQuaternion(0.0, Vector3d(1.0, 1.0, 1.0)), Vector3d::Zero()); rootTransform.second = makeRigidTransform(makeRotationQuaternion(0.0, Vector3d(1.0, 1.0, 1.0)), Vector3d::Zero()); std::pair boneTransform; boneTransform.first = makeRigidTransform(makeRotationQuaternion(0.0, Vector3d(1.0, 0.0, 0.0)), Vector3d::Zero()); boneTransform.second = makeRigidTransform(makeRotationQuaternion(0.0, Vector3d(1.0, 0.0, 0.0)), Vector3d(0.0, 4.0, 0.0)); int numSteps = 1000; for (int i = 0; i < numSteps; ++i) { double t = static_cast(i) / numSteps; RigidTransform3d pose = interpolate(rootTransform, t); sceneElement->setPose(pose); pose = interpolate(boneTransform, t / 3.0); graphics->setBonePose("Bone", RigidTransform3d::Identity()); graphics->setBonePose("Bone_001", pose); graphics->setBonePose("Bone_002", pose); graphics->setBonePose("Bone_003", pose); /// The total number of steps should complete in 5 seconds boost::this_thread::sleep(boost::posix_time::milliseconds(5000 / numSteps)); } rootTransform.first = makeRigidTransform(makeRotationQuaternion(0.0, Vector3d(1.0, 1.0, 1.0)), Vector3d::Zero()); rootTransform.second = makeRigidTransform(makeRotationQuaternion(M_2_PI, Vector3d(1.0, 1.0, 1.0)), Vector3d::Zero()); boneTransform.first = makeRigidTransform(makeRotationQuaternion(0.0, Vector3d(1.0, 0.0, 0.0)), Vector3d::Zero()); boneTransform.second = makeRigidTransform(makeRotationQuaternion(M_PI, Vector3d(1.0, 0.0, 0.0)), Vector3d::Zero()); for (int i = 0; i < numSteps; ++i) { double t = static_cast(i) / numSteps; RigidTransform3d pose = interpolate(rootTransform, t); sceneElement->setPose(pose); pose = interpolate(boneTransform, t / 3.0); graphics->setBonePose("Bone", pose); graphics->setBonePose("Bone_001", pose); graphics->setBonePose("Bone_002", pose); graphics->setBonePose("Bone_003", pose); /// The total number of steps should complete in 5 seconds boost::this_thread::sleep(boost::posix_time::milliseconds(5000 / numSteps)); } runtime->stop(); } TEST_F(OsgSkeletonRepresentationRenderTests, WithNeutralPoseTest) { auto graphics = std::make_shared("Skeleton"); graphics->loadModel("OsgSkeletonRepresentationRenderTests/rigged_cylinder.osgt"); graphics->setSkinningShaderFileName("Shaders/skinning.vert"); graphics->setNeutralBonePose("Bone", makeRigidTransform(makeRotationQuaternion(M_PI_4, Vector3d(1.0, 1.0, 1.0)), Vector3d::Zero())); auto sceneElement = std::make_shared("Rigged Cylinder"); sceneElement->addComponent(graphics); scene->addSceneElement(sceneElement); viewElement->setPose(SurgSim::Math::makeRigidTransform( Vector3d(-0.3, 0.3, -0.3), Vector3d(0.0, 0.0, 0.0), Vector3d(0.0, 0.0, 1.0))); runtime->start(); boost::this_thread::sleep(boost::posix_time::milliseconds(2000)); std::pair rootTransform; rootTransform.first = makeRigidTransform(makeRotationQuaternion(0.0, Vector3d(1.0, 1.0, 1.0)), Vector3d::Zero()); rootTransform.second = makeRigidTransform(makeRotationQuaternion(0.0, Vector3d(1.0, 1.0, 1.0)), Vector3d::Zero()); std::pair boneTransform; boneTransform.first = makeRigidTransform(makeRotationQuaternion(0.0, Vector3d(1.0, 0.0, 0.0)), Vector3d::Zero()); boneTransform.second = makeRigidTransform(makeRotationQuaternion(0.0, Vector3d(1.0, 0.0, 0.0)), Vector3d(0.0, 4.0, 0.0)); int numSteps = 1000; for (int i = 0; i < numSteps; ++i) { double t = static_cast(i) / numSteps; RigidTransform3d pose = interpolate(rootTransform, t); sceneElement->setPose(pose); pose = interpolate(boneTransform, t / 3.0); graphics->setBonePose("Bone", RigidTransform3d::Identity()); graphics->setBonePose("Bone_001", pose); graphics->setBonePose("Bone_002", pose); graphics->setBonePose("Bone_003", pose); /// The total number of steps should complete in 5 seconds boost::this_thread::sleep(boost::posix_time::milliseconds(5000 / numSteps)); } runtime->stop(); } }; // namespace Graphics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Graphics/RenderTests/OsgSphereRepresentationRenderTests.cpp000066400000000000000000000072511277777236100312250ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Render Tests for the OsgSphereRepresentation class. #include "SurgSim/Graphics/OsgManager.h" #include "SurgSim/Graphics/OsgSphereRepresentation.h" #include "SurgSim/Graphics/OsgViewElement.h" #include "SurgSim/Graphics/OsgCamera.h" #include "SurgSim/Framework/Scene.h" #include "SurgSim/Framework/SceneElement.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Graphics/RenderTests/RenderTest.h" #include #include using SurgSim::Framework::Runtime; using SurgSim::Framework::Scene; using SurgSim::Framework::SceneElement; using SurgSim::Math::Quaterniond; using SurgSim::Math::RigidTransform3d; using SurgSim::Math::Vector3d; using SurgSim::Math::makeRigidTransform; namespace SurgSim { namespace Graphics { struct OsgSphereRepresentationRenderTests : public RenderTest { }; /// Pops up a window with two spheres that are translating and changing radius TEST_F(OsgSphereRepresentationRenderTests, MovingSpheresTest) { /// Initial sphere 1 position Vector3d startPosition1(-0.1, 0.0, -0.2); /// Final sphere 1 position Vector3d endPosition1(0.1, 0.0, -0.2); /// Initial sphere 1 radius; double startRadius1 = 0.001; /// Final sphere 1 radius; double endRadius1 = 0.01; /// Initial sphere 2 position Vector3d startPosition2(0.0, -0.1, -0.2); /// Final sphere 2 position Vector3d endPosition2(0.0, 0.1, -0.2); /// Initial sphere 2 radius; double startRadius2 = 0.01; /// Final sphere 2 radius; double endRadius2 = 0.05; /// Number of times to step the sphere position and radius from start to end. /// This number of steps will be done in 1 second. int numSteps = 100; /// Add the sphere representation to the view element, no need to make another scene element std::shared_ptr sphereRepresentation1 = std::make_shared("sphere representation 1"); viewElement->addComponent(sphereRepresentation1); std::shared_ptr sphereRepresentation2 = std::make_shared("sphere representation 2"); viewElement->addComponent(sphereRepresentation2); /// Run the thread runtime->start(); boost::this_thread::sleep(boost::posix_time::milliseconds(1000)); for (int i = 0; i < numSteps; ++i) { /// Calculate t in [0.0, 1.0] double t = static_cast(i) / numSteps; /// Interpolate position and radius sphereRepresentation1->setLocalPose(makeRigidTransform(Quaterniond::Identity(), (1 - t) * startPosition1 + t * endPosition1)); sphereRepresentation1->setRadius((1 - t) * startRadius1 + t * endRadius1); sphereRepresentation2->setLocalPose(makeRigidTransform(Quaterniond::Identity(), (1 - t) * startPosition2 + t * endPosition2)); sphereRepresentation2->setRadius((1 - t) * startRadius2 + t * endRadius2); /// The total number of steps should complete in 1 second boost::this_thread::sleep(boost::posix_time::milliseconds(1000 / numSteps)); } runtime->stop(); } }; // namespace Graphics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Graphics/RenderTests/OsgTextRepresentationRenderTests.cpp000066400000000000000000000110121277777236100307110ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Blocks/PoseInterpolator.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Framework/Scene.h" #include "SurgSim/Framework/BehaviorManager.h" #include "SurgSim/Graphics/OsgManager.h" #include "SurgSim/Graphics/OsgCamera.h" #include "SurgSim/Graphics/OsgTextRepresentation.h" #include "SurgSim/Graphics/OsgBoxRepresentation.h" #include "SurgSim/Graphics/OsgViewElement.h" #include "SurgSim/Graphics/OsgAxesRepresentation.h" #include "SurgSim/Graphics/View.h" #include namespace SurgSim { namespace Graphics { struct OsgTextRepresentationRenderTests : public ::testing::Test { public: void SetUp() { runtime = std::make_shared("config.txt"); graphicsManager = std::make_shared(); runtime->addManager(graphicsManager); runtime->addManager(std::make_shared()); scene = runtime->getScene(); viewElement = std::make_shared("view element"); std::array position = {100, 100}; viewElement->getView()->setPosition(position); viewElement->getView()->setWindowBorderEnabled(true); scene->addSceneElement(viewElement); } void TearDown() { runtime->stop(); } std::shared_ptr runtime; std::shared_ptr graphicsManager; std::shared_ptr scene; std::shared_ptr viewElement; }; TEST_F(OsgTextRepresentationRenderTests, Operation) { auto text = std::make_shared("HUD"); text->setText("HelloWorld"); viewElement->addComponent(text); runtime->start(); EXPECT_TRUE(graphicsManager->isInitialized()); EXPECT_TRUE(viewElement->isInitialized()); boost::this_thread::sleep(boost::posix_time::milliseconds(1500)); auto dimensions = viewElement->getView()->getDimensions(); text->setLocation(dimensions[0] / 2.0, dimensions[1] / 2.0); text->setText("Hello Again"); boost::this_thread::sleep(boost::posix_time::milliseconds(1500)); text->setColor(SurgSim::Math::Vector4d(1.0, 0.5, 0.5, 1.0)); text->setMaximumWidth(400.0); text->setFontSize(72.0); text->setText("This is a really long line that should be broken apart"); text->setDrawBackground(true); text->setBackgroundColor(Math::Vector4d(0.3, 0.3, 0.3, 1.0)); boost::this_thread::sleep(boost::posix_time::milliseconds(1500)); } TEST_F(OsgTextRepresentationRenderTests, WorldSpace) { auto element = std::make_shared("Box"); auto axis = std::make_shared("Axes"); axis->setSize(0.1); element->addComponent(axis); auto box = std::make_shared("Box"); box->setSize(Math::Vector3d(0.05, 0.05, 0.05)); element->addComponent(box); scene->addSceneElement(element); auto interpolator = std::make_shared("Interpolator"); interpolator->setTarget(viewElement); auto startingPose = Math::makeRigidTransform( Math::Vector3d(0.5, 0.5, 0.0), Math::Vector3d(0.0, 0.0, 0.0), Math::Vector3d(0.0, 1.0, 0.0)); interpolator->setStartingPose(startingPose); interpolator->setEndingPose(Math::makeRigidTransform( Math::Vector3d(-0.5, 0.5, 0.0), Math::Vector3d(0.0, 0.0, 0.0), Math::Vector3d(0.0, 1.0, 0.0))); interpolator->setPingPong(true); interpolator->setDuration(6.0); viewElement->addComponent(interpolator); auto text = std::make_shared("Text"); text->setText("This is a multiline text, it should be well readable and right in front of the camera"); text->setUseScreenSpace(false); text->setMaximumWidth(0.4); text->setFontSize(0.02); text->setLocalPose(Math::makeRigidTranslation(Math::Vector3d(0.0, 0.0, -1.0))); viewElement->addComponent(text); runtime->start(); boost::this_thread::sleep(boost::posix_time::milliseconds(1500)); runtime->stop(); } }; // namespace Graphics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Graphics/RenderTests/OsgVectorFieldRepresentationRenderTests.cpp000066400000000000000000000166621277777236100322130ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// Render Tests for the OsgVectorFieldRepresentation class. #include "SurgSim/DataStructures/Vertex.h" #include "SurgSim/Graphics/RenderTests/RenderTest.h" #include "SurgSim/Graphics/VectorField.h" #include "SurgSim/Graphics/VectorFieldRepresentation.h" #include "SurgSim/Graphics/OsgVectorFieldRepresentation.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Testing/MathUtilities.h" using SurgSim::DataStructures::Vertex; using SurgSim::Graphics::OsgVectorFieldRepresentation; using SurgSim::Graphics::VectorFieldRepresentation; using SurgSim::Math::Vector3d; using SurgSim::Math::Vector4d; using SurgSim::Math::Quaterniond; using SurgSim::Math::makeRigidTransform; using SurgSim::Testing::interpolate; struct OsgVectorFieldRepresentationRenderTests : public SurgSim::Graphics::RenderTest { protected: // A point is a location (X,Y,Z) in 3D space std::vector makeStartingPoints() { std::vector points(8); points[0] = Vector3d(1.0, 0.0, 0.0); points[1] = Vector3d(0.0, 1.0, 0.0); points[2] = Vector3d(-1.0, 0.0, 0.0); points[3] = Vector3d(0.0, -1.0, 0.0); points[4] = Vector3d(2.0, 0.0, 0.0); points[5] = Vector3d(0.0, 2.0, 0.0); points[6] = Vector3d(-2.0, 0.0, 0.0); points[7] = Vector3d(0.0, -2.0, 0.0); return points; } std::vector makeEndingPoints() { std::vector points(8); points[0] = Vector3d(1.0, 1.0, 0.0); points[1] = Vector3d(-1.0, 1.0, 0.0); points[2] = Vector3d(-1.0, -1.0, 0.0); points[3] = Vector3d(1.0, -1.0, 0.0); points[4] = Vector3d(2.0, 2.0, 0.0); points[5] = Vector3d(-2.0, 2.0, 0.0); points[6] = Vector3d(-2.0, -2.0, 0.0); points[7] = Vector3d(2.0, -2.0, 0.0); return points; } // Color is represented as (R, G, B, alpha) std::vector makeStartingColors() { std::vector colors(8); colors[0] = Vector4d(1.0, 0.0, 0.0, 0.0); colors[1] = Vector4d(0.0, 1.0, 0.0, 0.0); colors[2] = Vector4d(0.0, 0.0, 1.0, 0.0); colors[3] = Vector4d(1.0, 1.0, 0.0, 0.0); colors[4] = Vector4d(1.0, 0.0, 1.0, 0.0); colors[5] = Vector4d(1.0, 1.0, 1.0, 0.0); colors[6] = Vector4d(1.0, 0.5, 0.8, 0.0); colors[7] = Vector4d(0.5, 1.0, 0.5, 0.0); return colors; } std::vector makeEndingColors() { std::vector colors(8); colors[0] = Vector4d(0.0, 1.0, 0.0, 0.0); colors[1] = Vector4d(0.0, 0.0, 1.0, 0.0); colors[2] = Vector4d(1.0, 0.0, 0.0, 0.0); colors[3] = Vector4d(0.0, 1.0, 1.0, 0.0); colors[4] = Vector4d(0.0, 1.0, 0.0, 0.0); colors[5] = Vector4d(0.0, 0.0, 1.0, 0.0); colors[6] = Vector4d(1.0, 1.0, 0.0, 0.0); colors[7] = Vector4d(1.0, 0.0, 1.0, 0.0); return colors; } std::vector makeVectors(const std::vector& points, const std::vector& colors) { std::vector vecs(8); for (auto i = 0; i < 8; ++i) { vecs[i].direction = points[i]; vecs[i].color.setValue(colors[i]); } return vecs; } std::shared_ptr makeVectorFieldRepresentation(const std::vector& points, const std::vector& vectors) { auto representation = std::make_shared("Vector Field Representation"); auto vertices = representation->getVectorField(); // Binding vectors to points auto it = std::begin(points); auto v = std::begin(vectors); for (; it != std::end(points); ++it, ++v) { vertices->addVertex(Vertex((*it), *v)); } return representation; } }; TEST_F(OsgVectorFieldRepresentationRenderTests, AddVectors) { auto vectorRepresentation = std::make_shared("VectorField"); auto points = makeStartingPoints(); auto colors = makeStartingColors(); auto vectors = makeVectors(points, colors); SurgSim::Graphics::VectorField vectorField; vectorRepresentation->setLocalPose(makeRigidTransform(Quaterniond::Identity(), Vector3d(0.0, 0.0, -8.0))); viewElement->addComponent(vectorRepresentation); /// Run the thread runtime->start(); EXPECT_TRUE(graphicsManager->isInitialized()); EXPECT_TRUE(viewElement->isInitialized()); boost::this_thread::sleep(boost::posix_time::milliseconds(500)); auto it = std::begin(points); auto v = std::begin(vectors); for (; it != std::end(points); ++it, ++v) { vectorField.addVertex(Vertex((*it), *v)); vectorRepresentation->updateVectorField(vectorField); boost::this_thread::sleep(boost::posix_time::milliseconds(250)); } } TEST_F(OsgVectorFieldRepresentationRenderTests, LineWidth) { auto points = makeStartingPoints(); auto colors = makeStartingColors(); auto vectors = makeVectors(points, colors); auto vectorRepresentation = makeVectorFieldRepresentation(points, vectors); vectorRepresentation->setLocalPose(makeRigidTransform(Quaterniond::Identity(), Vector3d(0.0, 0.0, -8.0))); viewElement->addComponent(vectorRepresentation); runtime->start(); EXPECT_TRUE(graphicsManager->isInitialized()); EXPECT_TRUE(viewElement->isInitialized()); boost::this_thread::sleep(boost::posix_time::milliseconds(500)); int numSteps = 100; double startWidth = 0.0; double endWidth = 10.0; // Vary line widths as time changes for (int i = 0; i < numSteps; ++i) { double t = static_cast(i) / numSteps; vectorRepresentation->setLineWidth(interpolate(startWidth, endWidth, t)); boost::this_thread::sleep(boost::posix_time::milliseconds(1000 / numSteps)); } } TEST_F(OsgVectorFieldRepresentationRenderTests, ChangingVectorField) { auto startPoints = makeStartingPoints(); auto endPoints = makeEndingPoints(); auto startColors = makeStartingColors(); auto endColors = makeStartingColors(); auto startVectors = makeVectors(startPoints, startColors); auto endVectors = makeVectors(endPoints, endColors); auto vectorRepresentation = makeVectorFieldRepresentation(startPoints, endVectors); vectorRepresentation->setLocalPose(makeRigidTransform(Quaterniond::Identity(), Vector3d(0.0, 0.0, -8.0))); viewElement->addComponent(vectorRepresentation); runtime->start(); EXPECT_TRUE(graphicsManager->isInitialized()); EXPECT_TRUE(viewElement->isInitialized()); boost::this_thread::sleep(boost::posix_time::milliseconds(250)); auto& vertexList = vectorRepresentation->getVectorField()->getVertices(); int numSteps = 100; for (int i = 0; i < numSteps; ++i) { double t = static_cast(i) / numSteps; for (int j = 0; j < 8; ++j) { vertexList[j].position = interpolate(startPoints[j], endPoints[j], t); vertexList[j].data.direction = interpolate(endVectors[j].direction, startVectors[j].direction, t); vertexList[j].data.color.setValue(interpolate(startColors[j], endColors[j], t)); } boost::this_thread::sleep(boost::posix_time::milliseconds(1000 / numSteps)); } }opensurgsim-0.7.0/SurgSim/Graphics/RenderTests/OsgViewElementRenderTests.cpp000066400000000000000000000152751277777236100273050ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Render Tests for the OsgViewElement class. #include "SurgSim/Graphics/OsgManager.h" #include "SurgSim/Graphics/OsgView.h" #include "SurgSim/Graphics/OsgViewElement.h" #include "SurgSim/Graphics/OsgBoxRepresentation.h" #include "SurgSim/Blocks/PoseInterpolator.h" #include "SurgSim/Framework/BasicSceneElement.h" #include "SurgSim/Framework/BehaviorManager.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Framework/Scene.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Vector.h" #include using SurgSim::Framework::Runtime; using SurgSim::Framework::Scene; using SurgSim::Math::RigidTransform3d; using SurgSim::Math::Vector3d; using SurgSim::Math::makeRigidTransform; namespace SurgSim { namespace Graphics { // Note: This tests the ViewElement, don't derive from RenderTest TEST(OsgViewElementRenderTests, MoveAndResizeWindowTest) { std::shared_ptr runtime = std::make_shared(); std::shared_ptr manager = std::make_shared(); runtime->addManager(manager); std::shared_ptr scene = runtime->getScene(); /// Add a graphics component to the scene std::shared_ptr viewElement = std::make_shared("test element"); scene->addSceneElement(viewElement); /// Set initial position to (50, 60), dimensions to 200 x 100 and disable the window border std::array position = {50, 60}; std::array dimensions = {200, 100}; viewElement->getView()->setPosition(position); viewElement->getView()->setDimensions(dimensions); viewElement->getView()->setWindowBorderEnabled(false); /// Run the thread runtime->start(); EXPECT_TRUE(manager->isInitialized()); boost::this_thread::sleep(boost::posix_time::milliseconds(1000)); /// Move the window to (100, 200) position[0] = 100; position[1] = 200; viewElement->getView()->setPosition(position); boost::this_thread::sleep(boost::posix_time::milliseconds(1000)); /// Enable the window border and resize the window to 400 x 500 viewElement->getView()->setWindowBorderEnabled(true); dimensions[0] = 400; dimensions[1] = 500; viewElement->getView()->setDimensions(dimensions); boost::this_thread::sleep(boost::posix_time::milliseconds(1000)); runtime->stop(); } // Just an empty screen but it should be fullscreen TEST(OsgViewElementRenderTest, FullScreenView) { std::shared_ptr runtime = std::make_shared(); std::shared_ptr manager = std::make_shared(); runtime->addManager(manager); std::shared_ptr scene = runtime->getScene(); /// Add a graphics component to the scene std::shared_ptr viewElement = std::make_shared("test element"); scene->addSceneElement(viewElement); auto osgView = std::static_pointer_cast(viewElement->getView()); std::array dimensions = { 0, 0 }; osgView->setDimensions(dimensions); EXPECT_EQ(0, osgView->getDimensions()[0]); EXPECT_EQ(0, osgView->getDimensions()[1]); osgView->setFullScreen(true); // The actual value depends on the system, it's hard to test for it here EXPECT_NE(0, osgView->getDimensions()[0]); EXPECT_NE(0, osgView->getDimensions()[1]); runtime->start(); boost::this_thread::sleep(boost::posix_time::milliseconds(1000)); runtime->stop(); } TEST(OsgViewElementRenderTest, StereoView) { std::shared_ptr runtime = std::make_shared(); std::shared_ptr manager = std::make_shared(); runtime->addManager(manager); runtime->addManager(std::make_shared()); std::shared_ptr scene = runtime->getScene(); /// Add a graphics component to the scene std::shared_ptr viewElement = std::make_shared("view"); auto boxElement = std::make_shared("box"); RigidTransform3d pose = makeRigidTransform(Vector3d(1.0, 1.0, 1.0), Vector3d(0.0, 0.0, 0.0), Vector3d(0.0, 1.0, 0.0)); viewElement->setPose(pose); scene->addSceneElement(viewElement); auto box = std::make_shared("box"); box->setSizeXYZ(0.1, 0.1, 0.2); boxElement->addComponent(box); RigidTransform3d from = makeRigidTransform(Vector3d(0.2, 0.0, 0.0), Vector3d(0.0, 0.0, 0.0), Vector3d(0.0, 1.0, 0.0)); RigidTransform3d to = makeRigidTransform(Vector3d(-0.2, 0.0, 0.0), Vector3d(0.0, 0.0, 0.0), Vector3d(0.0, 1.0, 0.0)); auto interpolator = std::make_shared("interpolator"); interpolator->setDuration(2.0); interpolator->setStartingPose(from); interpolator->setEndingPose(to); interpolator->setPingPong(true); interpolator->setTarget(boxElement); boxElement->addComponent(interpolator); scene->addSceneElement(boxElement); auto osgView = std::static_pointer_cast(viewElement->getView()); osgView->setStereoMode(View::STEREO_MODE_HORIZONTAL_SPLIT); osgView->setDisplayType(View::DISPLAY_TYPE_MONITOR); osgView->setEyeSeparation(0.06); osgView->setScreenWidth(0.486918); osgView->setScreenHeight(0.273812); osgView->setScreenDistance(1.0); runtime->start(); boost::this_thread::sleep(boost::posix_time::milliseconds(1000)); runtime->stop(); } // Verify a bug fix on the OsgView that had to do with the deallocation of the mouse and // keyboard handler. TEST(OsgViewElementRenderTest, KeyBoardMouseTest) { std::shared_ptr runtime = std::make_shared(); std::shared_ptr manager = std::make_shared(); runtime->addManager(manager); runtime->addManager(std::make_shared()); std::shared_ptr scene = runtime->getScene(); /// Add a graphics component to the scene std::shared_ptr viewElement = std::make_shared("view"); scene->addSceneElement(viewElement); auto osgView = std::static_pointer_cast(viewElement->getView()); osgView->enableKeyboardDevice(true); osgView->enableMouseDevice(true); runtime->start(); boost::this_thread::sleep(boost::posix_time::milliseconds(1000)); runtime->stop(); } } // namespace Graphics } // namespace SurgSim opensurgsim-0.7.0/SurgSim/Graphics/RenderTests/PaintBehaviorRenderTests.cpp000066400000000000000000000154711277777236100271410ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Blocks/GraphicsUtilities.h" #include "SurgSim/Collision/ShapeCollisionRepresentation.h" #include "SurgSim/Framework/Component.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Graphics/OsgLight.h" #include "SurgSim/Graphics/OsgMaterial.h" #include "SurgSim/Graphics/OsgMeshRepresentation.h" #include "SurgSim/Graphics/OsgTexture2d.h" #include "SurgSim/Graphics/PaintBehavior.h" #include "SurgSim/Graphics/RenderTests/RenderTest.h" #include "SurgSim/Math/MeshShape.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Vector.h" using SurgSim::Math::makeRigidTransform; using SurgSim::Math::makeRigidTranslation; using SurgSim::Math::RigidTransform3d; using SurgSim::Math::Vector3d; namespace SurgSim { namespace Graphics { class PaintBehaviorRenderTests : public RenderTest { }; TEST_F(PaintBehaviorRenderTests, PaintTest) { viewElement->getCamera()->setLocalPose(makeRigidTransform(Math::Vector3d(0.0, 0.2, 0.0), Math::Vector3d(0.0, 0.0, 0.0), Math::Vector3d(0.0, 0.0, -1.0))); viewElement->getCamera()->setAmbientColor(Math::Vector4d(0.2, 0.2, 0.2, 1.0)); auto light = std::make_shared("Light"); light->setDiffuseColor(Math::Vector4d(1.0, 1.0, 1.0, 1.0)); light->setSpecularColor(Math::Vector4d(0.8, 0.8, 0.8, 1.0)); light->setLightGroupReference(Graphics::Representation::DefaultGroupName); auto lightElement = std::make_shared("LightElement"); lightElement->setPose(makeRigidTranslation(Math::Vector3d(2.0, 2.0, 2.0))); lightElement->addComponent(light); scene->addSceneElement(lightElement); auto element = std::make_shared("Cube"); auto graphics = std::make_shared("Graphics"); graphics->loadMesh("Geometry/wound_deformable_with_texture.ply"); auto material = Graphics::buildMaterial("Shaders/ds_mapping_material.vert", "Shaders/ds_mapping_multitexture.frag"); material->addUniform("vec4", "diffuseColor"); material->setValue("diffuseColor", Math::Vector4f(1.0, 1.0, 1.0, 1.0)); material->addUniform("vec4", "specularColor"); material->setValue("specularColor", Math::Vector4f(1.0, 1.0, 1.0, 1.0)); material->addUniform("float", "shininess"); material->setValue("shininess", 10.0f); auto texture = std::make_shared(); auto path = applicationData->findFile("Textures/wound_deformable.png"); texture->loadImage(path); material->addUniform("sampler2D", "diffuseMap"); material->setValue("diffuseMap", texture); Blocks::enable2DTexture(material, "shadowMap", Graphics::SHADOW_TEXTURE_UNIT, "Textures/black.png"); graphics->setMaterial(material); element->addComponent(graphics); element->addComponent(material); auto paintBehavior = std::make_shared("Decals"); paintBehavior->setRepresentation(graphics); paintBehavior->setTextureSize(2048, 2048); paintBehavior->setRadius(0.05); paintBehavior->setColor(Math::Vector4d(1.0, 0.0, 0.0, 0.75)); std::vector coords; for (size_t i = 0; i < 10; i++) { Math::Vector coord(3); coord << 0.5, 0.5, 0.5; DataStructures::IndexedLocalCoordinate localCoordinate(50 + i, coord); coords.push_back(localCoordinate); } paintBehavior->setCoordinates(coords); element->addComponent(paintBehavior); scene->addSceneElement(element); runtime->start(); boost::this_thread::sleep(boost::posix_time::milliseconds(5000)); runtime->stop(); } TEST_F(PaintBehaviorRenderTests, AntiAliasTest) { viewElement->getCamera()->setLocalPose(makeRigidTransform(Math::Vector3d(0.0, 0.2, 0.0), Math::Vector3d(0.0, 0.0, 0.0), Math::Vector3d(0.0, 0.0, -1.0))); viewElement->getCamera()->setAmbientColor(Math::Vector4d(0.2, 0.2, 0.2, 1.0)); auto light = std::make_shared("Light"); light->setDiffuseColor(Math::Vector4d(1.0, 1.0, 1.0, 1.0)); light->setSpecularColor(Math::Vector4d(0.8, 0.8, 0.8, 1.0)); light->setLightGroupReference(Graphics::Representation::DefaultGroupName); auto lightElement = std::make_shared("LightElement"); lightElement->setPose(makeRigidTranslation(Math::Vector3d(2.0, 2.0, 2.0))); lightElement->addComponent(light); scene->addSceneElement(lightElement); auto element = std::make_shared("Cube"); auto graphics = std::make_shared("Graphics"); graphics->loadMesh("Geometry/wound_deformable_with_texture.ply"); auto material = Graphics::buildMaterial("Shaders/ds_mapping_material.vert", "Shaders/ds_mapping_multitexture.frag"); material->addUniform("vec4", "diffuseColor"); material->setValue("diffuseColor", Math::Vector4f(1.0, 1.0, 1.0, 1.0)); material->addUniform("vec4", "specularColor"); material->setValue("specularColor", Math::Vector4f(1.0, 1.0, 1.0, 1.0)); material->addUniform("float", "shininess"); material->setValue("shininess", 10.0f); auto texture = std::make_shared(); auto path = applicationData->findFile("Textures/wound_deformable.png"); texture->loadImage(path); material->addUniform("sampler2D", "diffuseMap"); material->setValue("diffuseMap", texture); Blocks::enable2DTexture(material, "shadowMap", Graphics::SHADOW_TEXTURE_UNIT, "Textures/black.png"); graphics->setMaterial(material); element->addComponent(graphics); element->addComponent(material); auto paintBehavior = std::make_shared("Decals"); paintBehavior->setRepresentation(graphics); paintBehavior->setTextureSize(2048, 2048); paintBehavior->setRadius(0.05); paintBehavior->setColor(Math::Vector4d(1.0, 0.0, 0.0, 0.75)); paintBehavior->setAntiAlias(true); std::vector coords; for (size_t i = 0; i < 10; i++) { Math::Vector coord(3); coord << 0.5, 0.5, 0.5; DataStructures::IndexedLocalCoordinate localCoordinate(50 + i, coord); coords.push_back(localCoordinate); } paintBehavior->setCoordinates(coords); element->addComponent(paintBehavior); scene->addSceneElement(element); runtime->start(); boost::this_thread::sleep(boost::posix_time::milliseconds(5000)); runtime->stop(); } }; // namespace Graphics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Graphics/RenderTests/RenderTest.cpp000066400000000000000000000047041277777236100242770ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Graphics/RenderTests/RenderTest.h" #include "SurgSim/Framework/BehaviorManager.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Framework/Scene.h" #include "SurgSim/Graphics/OsgCamera.h" #include "SurgSim/Graphics/OsgManager.h" #include "SurgSim/Graphics/OsgScreenSpaceQuadRepresentation.h" #include "SurgSim/Graphics/OsgViewElement.h" #include "SurgSim/Graphics/OsgView.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/Vector.h" using SurgSim::Math::Quaterniond; using SurgSim::Math::Vector3d; namespace SurgSim { namespace Graphics { void RenderTest::SetUp() { runtime = std::make_shared("config.txt"); applicationData = runtime->getApplicationData(); graphicsManager = std::make_shared(); runtime->addManager(graphicsManager); runtime->addManager(std::make_shared()); scene = runtime->getScene(); viewElement = std::make_shared("view element"); std::array position = {100, 100}; viewElement->getView()->setPosition(position); viewElement->getView()->setWindowBorderEnabled(true); camera = std::dynamic_pointer_cast(viewElement->getCamera()); scene->addSceneElement(viewElement); } void RenderTest::TearDown() { runtime->stop(); } std::shared_ptr RenderTest::makeQuad( const std::string& name, int width, int height, int x, int y) { std::shared_ptr quad = std::make_shared(name); quad->setSize(width, height); Quaterniond quat; quat = SurgSim::Math::makeRotationQuaternion(0.0, Vector3d::UnitY().eval()); quad->setLocalPose(SurgSim::Math::makeRigidTransform(quat, Vector3d(x, y, -0.2))); return quad; } }; // Graphics }; // SurgSim opensurgsim-0.7.0/SurgSim/Graphics/RenderTests/RenderTest.h000066400000000000000000000034541277777236100237450ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_RENDERTESTS_RENDERTEST_H #define SURGSIM_GRAPHICS_RENDERTESTS_RENDERTEST_H #include #include #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Framework/Scene.h" #include "SurgSim/Framework/ApplicationData.h" #include "SurgSim/Graphics/OsgCamera.h" #include "SurgSim/Graphics/OsgView.h" #include "SurgSim/Graphics/OsgViewElement.h" #include "SurgSim/Graphics/OsgManager.h" #include "SurgSim/Graphics/OsgScreenSpaceQuadRepresentation.h" namespace SurgSim { namespace Framework { class Runtime; class Scene; } namespace Graphics { struct RenderTest : public ::testing::Test { public: virtual void SetUp(); virtual void TearDown(); std::shared_ptr makeQuad( const std::string& name, int width, int height, int x, int y); std::shared_ptr runtime; std::shared_ptr graphicsManager; std::shared_ptr scene; std::shared_ptr viewElement; std::shared_ptr applicationData; std::shared_ptr camera; }; }; // Graphics }; // SurgSim #endifopensurgsim-0.7.0/SurgSim/Graphics/RenderTests/config.txt.in000066400000000000000000000001551277777236100241230ustar00rootroot00000000000000${PROJECT_BINARY_DIR}/Data/ ${CMAKE_CURRENT_BINARY_DIR}/Data/ ${PROJECT_BINARY_DIR}/SurgSim/Testing/Data/ opensurgsim-0.7.0/SurgSim/Graphics/Representation.cpp000066400000000000000000000064041277777236100227570ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Graphics/Representation.h" #include "SurgSim/Graphics/Material.h" #include "SurgSim/Framework/Log.h" using SurgSim::Graphics::Material; namespace SurgSim { namespace Graphics { const std::string Representation::DefaultGroupName = "__OssDefault__"; const std::string Representation::DefaultHudGroupName = "__OssDefaulHud__"; Representation::Representation(const std::string& name) : SurgSim::Framework::Representation(name) { SURGSIM_ADD_SERIALIZABLE_PROPERTY(Representation, std::vector, GroupReferences, getGroupReferences, setGroupReferences); SURGSIM_ADD_SERIALIZABLE_PROPERTY(Representation, bool, DrawAsWireFrame, getDrawAsWireFrame, setDrawAsWireFrame); SURGSIM_ADD_SERIALIZABLE_PROPERTY(Representation, bool, GenerateTangents, isGeneratingTangents, setGenerateTangents); addGroupReference(DefaultGroupName); } bool Representation::addGroupReference(const std::string& name) { bool result = false; if (!checkAwake("addGroupReference")) { auto insertion = m_groups.insert(name); result = insertion.second; } return result; } void Representation::addGroupReferences(const std::vector& groups) { if (!checkAwake("addGroupReferences")) { for (auto it = groups.cbegin(); it != groups.cend(); ++it) { addGroupReference(*it); } } } void Representation::setGroupReferences(const std::vector& groups) { if (!checkAwake("setGroupReferences")) { m_groups.clear(); for (auto it = groups.cbegin(); it != groups.cend(); ++it) { addGroupReference(*it); } } } std::vector Representation::getGroupReferences() const { return std::vector(std::begin(m_groups), std::end(m_groups)); } void Representation::clearGroupReferences() { if (!checkAwake("clearGroupReference")) { m_groups.clear(); } } bool Representation::removeGroupReference(const std::string& name) { bool result = false; if (!checkAwake("removeGroupReference")) { result = (m_groups.erase(name) != 0u); } return result; } void Representation::setGroupReference(const std::string& group) { if (!checkAwake("setGroupReference")) { clearGroupReferences(); m_groups.insert(group); } } bool Representation::checkAwake(const std::string& functionName) { if (isAwake()) { SURGSIM_LOG_WARNING(SurgSim::Framework::Logger::getLogger("Graphics")) << "Representation::" << functionName << "() was called while the component " << "was already awake for component " << getName() << " this has no effect and should be avoided."; } return isAwake(); } Representation::~Representation() { } }; // namespace Graphics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Graphics/Representation.h000066400000000000000000000111301277777236100224140ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_REPRESENTATION_H #define SURGSIM_GRAPHICS_REPRESENTATION_H #include "SurgSim/Framework/Representation.h" #include "SurgSim/Math/RigidTransform.h" #include namespace SurgSim { namespace Graphics { class Manager; class Material; /// Base graphics representation class, which defines the interface that all graphics representations must implement. /// /// A Graphics::Representation is the visual Framework::Representation of a Framework::SceneElement in the /// Framework::Scene. Graphical representations can request to be assigned to groups, groups are used to select certain /// elements for rendering in various special effects. class Representation : public SurgSim::Framework::Representation { public: static const std::string DefaultGroupName; static const std::string DefaultHudGroupName; /// Constructor /// \param name Name of the representation explicit Representation(const std::string& name); /// Destructor virtual ~Representation(); /// Sets the material that defines the visual appearance of the representation /// \param material Graphics material /// \return True if set successfully, otherwise false virtual bool setMaterial(std::shared_ptr material) = 0; /// Gets the material that defines the visual appearance of the representation /// \return Graphics material virtual std::shared_ptr getMaterial() const = 0; /// Removes the material from the representation virtual void clearMaterial() = 0; /// Sets the representation to render as a wire frame. /// \param val true if this representation should be rendered as a wireframe. virtual void setDrawAsWireFrame(bool val) = 0; /// Return if the representation is rendered as a wire frame. /// \return True if this representation is rendered as a wireframe; false if not. virtual bool getDrawAsWireFrame() const = 0; /// Enable or disable the generation of tangents. /// \param value true enables tangent generation, false otherwise virtual void setGenerateTangents(bool value) = 0; /// \return whether tangent generation is on or off virtual bool isGeneratingTangents() const = 0; /// Updates the representation /// \param dt The time in seconds of the preceding timestep. virtual void update(double dt) = 0; /// Add a reference to a group, this will eventual add this representation to the group with the /// the same name. /// \param name The name of the group. /// \return true if it succeeds, false if the group reference already exists. virtual bool addGroupReference(const std::string& name); /// Adds a list of group references. /// \param groups The references. void addGroupReferences(const std::vector& groups); /// Sets the list of group references. Clearing all the old references /// \param groups The references. void setGroupReferences(const std::vector& groups); /// Helper functions, this clears all the references and sets, only the reference /// given in the parameter /// \param group The reference to be used for this representation void setGroupReference(const std::string& group); /// Gets group references. /// \return The group references. std::vector getGroupReferences() const; /// Function to remove an unwanted reference. /// \param group The name of the reference that should be removed /// \return true If the reference was found and removed bool removeGroupReference(const std::string& group); /// Clear all the Group references void clearGroupReferences(); private: /// List of groups that this representation would like to be added std::unordered_set m_groups; /// Check if the representation is awake and print a warning message if it is. /// \param functionName the name of the calling function to be used in the error message /// \return the value of isAwake() bool checkAwake(const std::string& functionName); }; }; // namespace Graphics }; // namespace SurgSim #endif // SURGSIM_GRAPHICS_REPRESENTATION_H opensurgsim-0.7.0/SurgSim/Graphics/SceneryRepresentation.cpp000066400000000000000000000022601277777236100243040ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Graphics/SceneryRepresentation.h" #include "SurgSim/Framework/Asset.h" #include "SurgSim/Graphics/Model.h" #include "SurgSim/Framework/FrameworkConvert.h" namespace SurgSim { namespace Graphics { SceneryRepresentation::SceneryRepresentation(const std::string& name) : Representation(name) { SURGSIM_ADD_SERIALIZABLE_PROPERTY(SceneryRepresentation, std::shared_ptr, Model , getModel, setModel); SURGSIM_ADD_SETTER(SceneryRepresentation, std::string, ModelFileName, loadModel); } } } opensurgsim-0.7.0/SurgSim/Graphics/SceneryRepresentation.h000066400000000000000000000034541277777236100237570ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_SCENERYREPRESENTATION_H #define SURGSIM_GRAPHICS_SCENERYREPRESENTATION_H #include "SurgSim/Graphics/Representation.h" #include namespace SurgSim { namespace Framework { class Asset; } namespace Graphics { class Model; /// Base class defining the interface for a Graphics Scenery Object. class SceneryRepresentation : public virtual Representation { public: /// Constructor. /// \param name The name of the representation. explicit SceneryRepresentation(const std::string& name); /// Convenience function to trigger the load of the model with the given filename, if successful, this will /// replace the old model /// \param fileName Name of the file to be loaded virtual void loadModel(const std::string& fileName) = 0; /// Set the current model to the model passed /// \param model to be used for this scenery representation, this will replace the old model virtual void setModel(std::shared_ptr model) = 0; /// \return the current model. virtual std::shared_ptr getModel() const = 0; }; }; // namespace Graphics }; // namespace SurgSim #endif // SURGSIM_GRAPHICS_SCENERYREPRESENTATION_Hopensurgsim-0.7.0/SurgSim/Graphics/ScreenSpaceQuadRepresentation.h000066400000000000000000000056061277777236100253560ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_SCREENSPACEQUADREPRESENTATION_H #define SURGSIM_GRAPHICS_SCREENSPACEQUADREPRESENTATION_H #include "SurgSim/DataStructures/DataStructuresConvert.h" #include "SurgSim/Framework/Macros.h" #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Graphics/Representation.h" #include namespace SurgSim { namespace Graphics { class View; class Texture; /// A quad to display on the screen in screen space coordinates, use setPose() to set the position but /// x,y are presumed to be in screen space with 0|0 being in the lower left corner class ScreenSpaceQuadRepresentation : public virtual Representation { public: /// Constructor. /// \param name The name. explicit ScreenSpaceQuadRepresentation(const std::string name) : Representation(name) { } ~ScreenSpaceQuadRepresentation() { } /// Sets the location in screen space. /// \param x,y The x and y coordinates. virtual void setLocation(double x, double y) = 0; /// Gets the location in screen space. /// \param [out] x,y If non-null the x and y coordinates, may throw if null is passed. virtual void getLocation(double* x, double* y) = 0; /// Sets the size for the quad in screen coordinates. /// \param width The width of the quad in screen coordinates. /// \param height The height of the quad in screen coordinates. virtual void setSize(double width, double height) = 0; /// Gets the size of the quad. /// \param [out] width If non-null, the width, may throw if null is passed. /// \param [out] height If non-null, the height, may throw if null is passed. virtual void getSize(double* width, double* height) const = 0; /// Sets a Texture for this quad, this should replace a current texture, this is a convenience function and /// this will use the uniform name "diffuseMap" for the uniform in this operation. This can be accomplished /// from the outside as well by using the material. /// \param texture The texture to be set on the quad. /// \return true if it succeeds, false if it fails. virtual bool setTexture(std::shared_ptr texture) = 0; /// \return the pose of the quad, this disregards the SceneElement pose SurgSim::Math::RigidTransform3d getPose() const override { return getLocalPose(); } }; }; // Graphics }; // SurgSim #endif opensurgsim-0.7.0/SurgSim/Graphics/SkeletonRepresentation.h000066400000000000000000000100371277777236100241260ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_SKELETONREPRESENTATION_H #define SURGSIM_GRAPHICS_SKELETONREPRESENTATION_H #include #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Graphics/Model.h" #include "SurgSim/Graphics/Representation.h" #include "SurgSim/Math/MathConvert.h" #include "SurgSim/Math/RigidTransform.h" namespace SurgSim { namespace Graphics { /// Skeleton representation is used to move a mesh based on the movements of /// pre-selected control points (bones). class SkeletonRepresentation : public virtual Representation { public: /// Constructor. /// \param name The name of the representation. explicit SkeletonRepresentation(const std::string& name): Representation(name) { SURGSIM_ADD_SERIALIZABLE_PROPERTY(SkeletonRepresentation, std::shared_ptr, Model, getModel, setModel); // Enables the alternative use of the model file instead of the actual mesh object DecoderType decoder = std::bind(&SkeletonRepresentation::loadModel, this, std::bind(&YAML::Node::as, std::placeholders::_1)); setDecoder("ModelFileName", decoder); SetterType setter = std::bind(&SkeletonRepresentation::loadModel, this, std::bind(SurgSim::Framework::convert, std::placeholders::_1)); setSetter("ModelFileName", setter); typedef std::map PoseMap; SURGSIM_ADD_SERIALIZABLE_PROPERTY(SkeletonRepresentation, PoseMap, NeutralPoses, getNeutralBonePoses, setNeutralBonePoses); } /// Convenience function to trigger the load of the model with the given filename, if successful, this will /// replace the old model /// \param fileName Name of the file to be loaded virtual void loadModel(const std::string& fileName) = 0; /// Set the current model to the model passed /// \param model to be used for this scenery representation, this will replace the old model virtual void setModel(std::shared_ptr model) = 0; /// \return the current model. virtual std::shared_ptr getModel() const = 0; /// Set the pose for a given bone. /// \param name The name of the bone. /// \param pose The pose of the bone. virtual void setBonePose(const std::string& name, const SurgSim::Math::RigidTransform3d& pose) = 0; /// Get the pose for a given bone. /// \param name The name of the bone. /// \return pose The pose of the bone. virtual SurgSim::Math::RigidTransform3d getBonePose(const std::string& name) const = 0; /// Set the neutral pose for a given bone. /// \param name The name of the bone. /// \param pose The neutral pose of the bone. virtual void setNeutralBonePose(const std::string& name, const SurgSim::Math::RigidTransform3d& pose) = 0; /// Get the neutral pose for a given bone. /// \param name The name of the bone. /// \return pose The neutral pose of the bone. virtual SurgSim::Math::RigidTransform3d getNeutralBonePose(const std::string& name) const = 0; protected: /// Set neutral poses for a set of bones. /// \param poses A map of bone names and neutral poses virtual void setNeutralBonePoses(const std::map& poses) = 0; /// Get all the neutral poses /// \return A map of bone names and neutral poses virtual std::map getNeutralBonePoses() const = 0; }; }; // namespace Graphics }; // namespace SurgSim #endif // SURGSIM_GRAPHICS_SKELETONREPRESENTATION_H opensurgsim-0.7.0/SurgSim/Graphics/SphereRepresentation.h000066400000000000000000000031121277777236100235640ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_SPHEREREPRESENTATION_H #define SURGSIM_GRAPHICS_SPHEREREPRESENTATION_H #include "SurgSim/Graphics/Representation.h" namespace SurgSim { namespace Graphics { /// Base graphics sphere representation class, which defines the basic interface for a sphere that can be visualized. /// The sphere center is at (0, 0, 0). class SphereRepresentation : public virtual Representation { public: /// Constructor /// \param name Name of the representation /// \post The sphere radius is 1.0. explicit SphereRepresentation(const std::string& name) : Representation(name) { SURGSIM_ADD_SERIALIZABLE_PROPERTY(SphereRepresentation, double, Radius, getRadius, setRadius); } /// Sets the radius of the sphere virtual void setRadius(double radius) = 0; /// Returns the radius of the sphere virtual double getRadius() const = 0; }; }; // namespace Graphics }; // namespace SurgSim #endif // SURGSIM_GRAPHICS_SPHEREREPRESENTATION_H opensurgsim-0.7.0/SurgSim/Graphics/TangentSpaceGenerator.cpp000066400000000000000000000220701277777236100241750ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Framework/Log.h" #include "SurgSim/Graphics/TangentSpaceGenerator.h" #include #include #include namespace { void orthogonalize(const osg::Vec3& normal, osg::Vec4* tangent, osg::Vec4* bitangent, bool createOrthonormalBasis = false) { SURGSIM_ASSERT(tangent != nullptr) << "Tanget parameter can't be nullptr."; SURGSIM_ASSERT(bitangent != nullptr) << "BiTangent parameter can't be nullptr."; osg::Vec4 normal4(normal, 0.0); // Gram-Schmidt orthogonalize the tangent (*tangent) = (*tangent) - normal4 * (normal4 * (*tangent)); tangent->normalize(); if (createOrthonormalBasis) { osg::Vec3 tangent3 = osg::Vec3(tangent->x(), tangent->y(), tangent->z()); osg::Vec3 bitangent3 = osg::Vec3(bitangent->x(), bitangent->y(), bitangent->z()); osg::Vec3 cross = normal ^ tangent3; // Calculate handedness float handedness = 1.0f; if ((cross * bitangent3) < 0.0f) { handedness = -1.0f; } (*bitangent) = osg::Vec4(cross * handedness, 0.0f); } else { // Gram-Schmidt orthogonalize the bitangent (*bitangent) = (*bitangent) - normal4 * (normal4 * (*bitangent)); bitangent->normalize(); } } } namespace SurgSim { namespace Graphics { GenerateTangentSpaceTriangleIndexFunctor::GenerateTangentSpaceTriangleIndexFunctor() : m_vertexArray(nullptr), m_normalArray(nullptr), m_textureCoordArray(nullptr), m_tangentArray(nullptr), m_bitangentArray(nullptr), m_createOrthonormalBasis(false) { } void GenerateTangentSpaceTriangleIndexFunctor::setBasisOrthonormality(bool orthonormal) { m_createOrthonormalBasis = orthonormal; } bool GenerateTangentSpaceTriangleIndexFunctor::getBasisOrthonormality() { return m_createOrthonormalBasis; } void GenerateTangentSpaceTriangleIndexFunctor::set( const osg::Vec3Array* vertexArray, const osg::Vec3Array* normalArray, const osg::Vec2Array* textureCoordArray, osg::Vec4Array* tangentArray, osg::Vec4Array* bitangentArray) { SURGSIM_ASSERT(vertexArray != nullptr) << "Need vertex array to generate normals!"; size_t numVertices = vertexArray->size(); SURGSIM_ASSERT(normalArray != nullptr) << "Need normal array to store normals!"; SURGSIM_ASSERT(normalArray->size() == numVertices) << "Size of normal array must match the number of vertices to generate tangent space!"; SURGSIM_ASSERT(tangentArray != nullptr) << "Need tangent array to store tangent space!"; SURGSIM_ASSERT(tangentArray->size() == numVertices) << "Size of tangent array must match the number of vertices to generate tangent space!"; SURGSIM_ASSERT(bitangentArray != nullptr) << "Need bitangent array to store tangent space!"; SURGSIM_ASSERT(bitangentArray->size() == numVertices) << "Size of bitangent array must match the number of vertices to generate tangent space!"; m_vertexArray = vertexArray; m_normalArray = normalArray; m_textureCoordArray = textureCoordArray; m_tangentArray = tangentArray; m_bitangentArray = bitangentArray; } void GenerateTangentSpaceTriangleIndexFunctor::orthogonalize() { size_t numVertices = m_vertexArray->size(); for (size_t vertexIndex = 0; vertexIndex < numVertices; ++vertexIndex) { ::orthogonalize((*m_normalArray)[vertexIndex], &(*m_tangentArray)[vertexIndex], &(*m_bitangentArray)[vertexIndex], m_createOrthonormalBasis); } } void GenerateTangentSpaceTriangleIndexFunctor::reset() { size_t numVertices = m_vertexArray->size(); for (size_t vertexIndex = 0; vertexIndex < numVertices; ++vertexIndex) { (*m_tangentArray)[vertexIndex].set(0.0f, 0.0f, 0.0f, 0.0f); (*m_bitangentArray)[vertexIndex].set(0.0f, 0.0f, 0.0f, 0.0f); } } void GenerateTangentSpaceTriangleIndexFunctor::operator()(unsigned int vertexIndex1, unsigned int vertexIndex2, unsigned int vertexIndex3) { if (vertexIndex1 == vertexIndex2 || vertexIndex2 == vertexIndex3 || vertexIndex1 == vertexIndex3) { return; } const osg::Vec3& v1 = (*m_vertexArray)[vertexIndex1]; const osg::Vec3& v2 = (*m_vertexArray)[vertexIndex2]; const osg::Vec3& v3 = (*m_vertexArray)[vertexIndex3]; const osg::Vec2& w1 = (*m_textureCoordArray)[vertexIndex1]; const osg::Vec2& w2 = (*m_textureCoordArray)[vertexIndex2]; const osg::Vec2& w3 = (*m_textureCoordArray)[vertexIndex3]; float x1 = v2.x() - v1.x(); float x2 = v3.x() - v1.x(); float y1 = v2.y() - v1.y(); float y2 = v3.y() - v1.y(); float z1 = v2.z() - v1.z(); float z2 = v3.z() - v1.z(); float s1 = w2.x() - w1.x(); float s2 = w3.x() - w1.x(); float t1 = w2.y() - w1.y(); float t2 = w3.y() - w1.y(); float r = 1.0f / (s1 * t2 - s2 * t1); osg::Vec4 tangent((t2 * x1 - t1 * x2) * r, (t2 * y1 - t1 * y2) * r, (t2 * z1 - t1 * z2) * r, 0.0f); osg::Vec4 bitangent((s1 * x2 - s2 * x1) * r, (s1 * y2 - s2 * y1) * r, (s1 * z2 - s2 * z1) * r, 0.0f); (*m_tangentArray)[vertexIndex1] += tangent; (*m_bitangentArray)[vertexIndex1] += bitangent; (*m_tangentArray)[vertexIndex2] += tangent; (*m_bitangentArray)[vertexIndex2] += bitangent; (*m_tangentArray)[vertexIndex3] += tangent; (*m_bitangentArray)[vertexIndex3] += bitangent; } TangentSpaceGenerator::TangentSpaceGenerator(int textureCoordUnit, int tangentAttribIndex, int bitangentAttribIndex) : osg::NodeVisitor(), m_textureCoordUnit(textureCoordUnit), m_tangentAttribIndex(tangentAttribIndex), m_bitangentAttribIndex(bitangentAttribIndex) { setTraversalMode(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN); } TangentSpaceGenerator::~TangentSpaceGenerator() { } void TangentSpaceGenerator::setBasisOrthonormality(bool orthonormal) { m_createOrthonormalBasis = orthonormal; } bool TangentSpaceGenerator::getBasisOrthonormality() { return m_createOrthonormalBasis; } void TangentSpaceGenerator::apply(osg::Geode& geode) { for (unsigned int i = 0; i < geode.getNumDrawables(); i++) { osg::Geometry* geometry = geode.getDrawable(i)->asGeometry(); if (geometry) { generateTangentSpace(geometry, m_textureCoordUnit, m_tangentAttribIndex, m_bitangentAttribIndex, m_createOrthonormalBasis); } } } void TangentSpaceGenerator::generateTangentSpace(osg::Geometry* geometry, int textureCoordUnit, int tangentAttribIndex, int bitangentAttribIndex, bool orthonormal) { auto logger = SurgSim::Framework::Logger::getLogger("Graphics/TangetSpaceGenerator"); osg::Vec3Array* vertexArray = dynamic_cast(geometry->getVertexArray()); if (vertexArray == nullptr) { SURGSIM_LOG_WARNING(logger) << "No Vertices found, could not produce tangents."; return; } osg::Vec3Array* normalArray = dynamic_cast(geometry->getNormalArray()); if (normalArray == nullptr || normalArray->size() != vertexArray->size()) { SURGSIM_LOG_WARNING(logger) << "No Normals found, or mismatch in array sizes, could not produce tangents."; return; } osg::Vec2Array* textureCoordArray = dynamic_cast(geometry->getTexCoordArray(textureCoordUnit)); if (textureCoordArray == nullptr || textureCoordArray->size() != vertexArray->size()) { SURGSIM_LOG_WARNING(logger) << "No Texture Coordinates found, or mismatch in array sizes could not produce tangents."; return; } bool didUpdateGeom = false; osg::Vec4Array* tangentArray = dynamic_cast(geometry->getVertexAttribArray(tangentAttribIndex)); if (tangentArray == nullptr || tangentArray->size() != vertexArray->size()) { tangentArray = new osg::Vec4Array(vertexArray->size()); geometry->setVertexAttribArray(tangentAttribIndex, tangentArray); geometry->setVertexAttribBinding(tangentAttribIndex, osg::Geometry::BIND_PER_VERTEX); didUpdateGeom = true; } osg::Vec4Array* bitangentArray = dynamic_cast(geometry->getVertexAttribArray(bitangentAttribIndex)); if (bitangentArray == nullptr || bitangentArray->size() != vertexArray->size()) { bitangentArray = new osg::Vec4Array(vertexArray->size()); geometry->setVertexAttribArray(bitangentAttribIndex, bitangentArray); geometry->setVertexAttribBinding(bitangentAttribIndex, osg::Geometry::BIND_PER_VERTEX); didUpdateGeom = true; } osg::TriangleIndexFunctor tangentSpaceGenerator; tangentSpaceGenerator.setBasisOrthonormality(orthonormal); tangentSpaceGenerator.set(vertexArray, normalArray, textureCoordArray, tangentArray, bitangentArray); tangentSpaceGenerator.reset(); geometry->accept(tangentSpaceGenerator); tangentSpaceGenerator.orthogonalize(); if (didUpdateGeom) { // geometry->dirtyDisplayList(); geometry->setUseDisplayList(false); geometry->dirtyBound(); geometry->setDataVariance(osg::Object::DYNAMIC); } } } } opensurgsim-0.7.0/SurgSim/Graphics/TangentSpaceGenerator.h000066400000000000000000000136111277777236100236430ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_TANGENTSPACEGENERATOR_H #define SURGSIM_GRAPHICS_TANGENTSPACEGENERATOR_H #include #include #include namespace SurgSim { namespace Graphics { /// Triangle index functor which calculates the tangent space basis vectors for the vertices /// of a geometry from texture coordinates class GenerateTangentSpaceTriangleIndexFunctor { public: /// Constructor GenerateTangentSpaceTriangleIndexFunctor(); /// Sets whether the three tangent space basis vectors are made to be orthonormal; /// otherwise, each tangent is separately orthonormal to the normal, but not to each other /// \param orthonormal Whether or not to create a fully orthonormal basis void setBasisOrthonormality(bool orthonormal); /// \return Gets whether the three tangent space basis vectors are made to be orthonormal; otherwise, /// each tangent is separately orthonormal to the normal, but not to each other bool getBasisOrthonormality(); /// Sets the arrays required to generate tangent space basis vectors /// \param vertexArray Array containing vertex positions /// \param normalArray Array containing vertex normals /// \param textureCoordArray Array containing texture coordinates /// \param tangentArray Array to store calculated tangents /// \param bitangentArray Array to store calculated bitangents void set(const osg::Vec3Array* vertexArray, const osg::Vec3Array* normalArray, const osg::Vec2Array* textureCoordArray, osg::Vec4Array* tangentArray, osg::Vec4Array* bitangentArray); /// Orthogonalize and normalize the calculated tangent space basis vectors void orthogonalize(); /// Resets all calculated tangent space basis vectors to 0. void reset(); /// Calculates the triangle tangent space basis vectors and adds it to each adjacent vertex's tangent // space basis vectors. /// \param vertexIndex1 First triangle vertex index /// \param vertexIndex2 Second triangle vertex index /// \param vertexIndex3 Third triangle vertex index void operator()(unsigned int vertexIndex1, unsigned int vertexIndex2, unsigned int vertexIndex3); private: /// Array containing vertex positions const osg::Vec3Array* m_vertexArray; /// Array containing normals const osg::Vec3Array* m_normalArray; /// Array containing texture coordinates const osg::Vec2Array* m_textureCoordArray; /// Array storing calculated tangents osg::Vec4Array* m_tangentArray; /// Array storing calculated bitangents osg::Vec4Array* m_bitangentArray; /// Whether or not to create a fully orthonormal basis; otherwise, each tangent is separately orthonormal /// to the normal, but not to each other bool m_createOrthonormalBasis; }; /// Node visitor which calculates the tangent space basis vectors from the texture coordinates of any /// geometry it encounters class TangentSpaceGenerator : public osg::NodeVisitor { public: /// Constructor /// \param textureCoordUnit Texture unit of texture coordinates to use for calculating the tangent space /// \param tangentAttribIndex Index of the vertex attribute array to store the calculated tangents /// \param bitangentAttribIndex Index of the vertex attribute array to store the calculated bitangents TangentSpaceGenerator(int textureCoordUnit, int tangentAttribIndex, int bitangentAttribIndex); /// Destructor virtual ~TangentSpaceGenerator(); /// Sets whether the three tangent space basis vectors are made to be orthonormal; /// otherwise, each tangent is separately orthonormal to the normal, but not to each other /// \param orthonormal Whether or not to create a fully orthonormal basis void setBasisOrthonormality(bool orthonormal); /// Gets whether the three tangent space basis vectors are made to be orthonormal; otherwise, /// each tangent is separately orthonormal to the normal, but not to each other bool getBasisOrthonormality(); /// Generates tangent space vectors for all geometry in the geode /// \param geode Geode to generate tangent space vectors void apply(osg::Geode& geode) override; // NOLINT /// Generates tangent space basis vectors for the geometry /// \param geometry Geometry to generate normals /// \param textureCoordUnit Texture unit of texture coordinates to use for calculating the tangent space /// \param tangentAttribIndex Index of the vertex attribute array to store the calculated tangents /// \param bitangentAttribIndex Index of the vertex attribute array to store the calculated bi-tangents /// \param orthonormal Whether or not to create a fully orthonormal basis; otherwise, each tangent is separately /// orthonormal to the normal, but not to each other static void generateTangentSpace(osg::Geometry* geometry, int textureCoordUnit, int tangentAttribIndex, int bitangentAttribIndex, bool orthonormal); private: /// Texture unit of texture coordinates to use for calculating the tangent space int m_textureCoordUnit; /// Index of the vertex attribute array to store the calculated tangents int m_tangentAttribIndex; /// Index of the vertex attribute array to store the calculated bitangents int m_bitangentAttribIndex; /// Whether or not to create a fully orthonormal basis; otherwise, each tangent is separately orthonormal to /// the normal, but not to each other bool m_createOrthonormalBasis; }; } } #endif opensurgsim-0.7.0/SurgSim/Graphics/TextRepresentation.cpp000066400000000000000000000045351277777236100236270ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Graphics/TextRepresentation.h" #include "SurgSim/Graphics/Font.h" #include "SurgSim/Framework/Asset.h" #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/DataStructures/DataStructuresConvert.h" #include "SurgSim/Math/MathConvert.h" namespace SurgSim { namespace Graphics { TextRepresentation::TextRepresentation(const std::string name) : Representation(name) { SURGSIM_ADD_SERIALIZABLE_PROPERTY(TextRepresentation, std::shared_ptr, Font, getFont, setFont); SURGSIM_ADD_SETTER(TextRepresentation, std::string, FontFileName, loadFont); SURGSIM_ADD_SERIALIZABLE_PROPERTY(TextRepresentation, std::string, Text, getText, setText); SURGSIM_ADD_SERIALIZABLE_PROPERTY(TextRepresentation, double, FontSize, getFontSize, setFontSize); SURGSIM_ADD_SERIALIZABLE_PROPERTY(TextRepresentation, SurgSim::DataStructures::OptionalValue, MaximumWidth, getOptionalMaximumWidth, setOptionalMaximumWidth); SURGSIM_ADD_SERIALIZABLE_PROPERTY(SurgSim::Graphics::TextRepresentation, SurgSim::Math::Vector4d, Color, getColor, setColor); SURGSIM_ADD_SERIALIZABLE_PROPERTY(SurgSim::Graphics::TextRepresentation, bool, UseScreenSpace, isUsingScreenSpace, setUseScreenSpace); SURGSIM_ADD_SERIALIZABLE_PROPERTY(SurgSim::Graphics::TextRepresentation, bool, DrawBackground, isDrawingBackground, setDrawBackground); SURGSIM_ADD_SERIALIZABLE_PROPERTY(SurgSim::Graphics::TextRepresentation, Math::Vector4d, BackgroundColor, getBackgroundColor, setBackgroundColor); SURGSIM_ADD_SERIALIZABLE_PROPERTY(SurgSim::Graphics::TextRepresentation, double, BackgroundMargin, getBackgroundMargin, setBackgroundMargin); } } } opensurgsim-0.7.0/SurgSim/Graphics/TextRepresentation.h000066400000000000000000000126001277777236100232640ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_TEXTREPRESENTATION_H #define SURGSIM_GRAPHICS_TEXTREPRESENTATION_H #include #include "SurgSim/Graphics/Representation.h" #include "SurgSim/DataStructures/OptionalValue.h" #include "SurgSim/Math/Vector.h" namespace SurgSim { namespace Framework { class Asset; } namespace Graphics { class Font; /// A text to be displayed on the screen in screen space coordinates, use setPose() to set the position but /// x,y are presumed to be in screen space with 0|0 being in the lower left corner, has a default font but can also /// received a separate font. class TextRepresentation : public virtual Representation { public: /// Constructor. /// \param name The name. explicit TextRepresentation(const std::string name); /// Destructor virtual ~TextRepresentation() {} /// Load the font with the given file name, this will overwrite the current font /// \param fileName the file that should be used to load the font virtual void loadFont(const std::string& fileName) = 0; /// Replace the current font with the one passed /// \param font the new font to be used virtual void setFont(std::shared_ptr font) = 0; /// \return the current font virtual std::shared_ptr getFont() const = 0; /// Sets the location in screen space. /// \param x,y The x and y coordinates. virtual void setLocation(double x, double y) = 0; /// Gets the location in screen space. /// \param [out] x,y If non-null the x and y coordinates, may throw if null is passed. virtual void getLocation(double* x, double* y) const = 0; /// Sets the text to be shown on the screen. /// \param text the text to be used. virtual void setText(const std::string& text) = 0; /// \return the current text virtual std::string getText() const = 0; /// Sets a maximum width to the text display, the text should be broken up into /// multiple lines if the it is longer than width, if no value is given, or values <= 0 are used /// the width is assumed to be unlimited /// \param width the value to be used. virtual void setMaximumWidth(double width) = 0; /// \return the maximum width to be used if <=0 then the width is considered unlimited virtual double getMaximumWidth() = 0; /// Set the vertical size of the font /// \param size of the font virtual void setFontSize(double size) = 0; /// \return the current font size virtual double getFontSize() const = 0; /// Set the color for the text. /// \param color the color to be used. virtual void setColor(SurgSim::Math::Vector4d color) = 0; /// \return the current text color virtual SurgSim::Math::Vector4d getColor() const = 0; /// If set to true all the coordinate values are in screen-space coordinates (i.e. pixels), world spaces otherwise /// \note ScreeenSpace is default, when using world coordinates the font size has to be adjusted to an appropriately /// small value (e.g. 0.01m) /// \param value whether to use screen space or world space coordinates virtual void setUseScreenSpace(bool value) = 0; /// \return whether using screen space coordinates virtual bool isUsingScreenSpace() const = 0; /// Draw a filled background behind the text /// \param value whether to fill the background behind the text virtual void setDrawBackground(bool value) = 0; /// \return whether the background is being drawn or not virtual bool isDrawingBackground() const = 0; /// Set the color of the background (if drawn) /// \param color The color to use. virtual void setBackgroundColor(Math::Vector4d color) = 0; /// \return the color that the background uses virtual Math::Vector4d getBackgroundColor() = 0; /// Set the margin between background and text /// \note If world coordinates is being used, this is also world coordinates and should be appropriately small, /// if set too big, the background will filled the whole screen /// \param margin the margin between text and background. virtual void setBackgroundMargin(double margin) = 0; /// \return the margin between the background and the text virtual double getBackgroundMargin() const = 0; protected: /// Optionally sets a maximum width to the text display, the text should be broken up into /// multiple lines if the it is longer than width, if no value is given, or values <= 0 are used /// the width is assumed to be unlimited /// \param width The width to be used, if width has no value, the maximum width is assumed to be unlimited virtual void setOptionalMaximumWidth(SurgSim::DataStructures::OptionalValue width) = 0; /// Get the current status of the width /// \return the current maximum width, if there is no value the width is unlimited virtual SurgSim::DataStructures::OptionalValue getOptionalMaximumWidth() = 0; }; }; // Graphics }; // SurgSim #endif // SURGSIM_GRAPHICS_TEXTREPRESENTATION_H opensurgsim-0.7.0/SurgSim/Graphics/Texture.cpp000066400000000000000000000017121277777236100214120ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Graphics/Texture.h" namespace SurgSim { namespace Graphics { Texture::Texture() : m_isPointSprite(false) { } void Texture::setIsPointSprite(bool value) { m_isPointSprite = value; } bool Texture::isPointSprite() const { return m_isPointSprite; } } // namespace Graphics } // namespace SurgSim opensurgsim-0.7.0/SurgSim/Graphics/Texture.h000066400000000000000000000027151277777236100210630ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_TEXTURE_H #define SURGSIM_GRAPHICS_TEXTURE_H #include namespace SurgSim { namespace Graphics { /// Base class defining the interface for a Graphics Texture. class Texture { public: Texture(); /// Destructor virtual ~Texture() { } /// Loads an image into the texture from a file /// \param filePath Path to the image file /// \return True if the image is successfully loaded, otherwise false virtual bool loadImage(const std::string& filePath) = 0; /// Removes the image from the texture virtual void clearImage() = 0; /// Set point sprite flag on/off void setIsPointSprite(bool value); /// Get point sprite flag state bool isPointSprite() const; private: bool m_isPointSprite; }; }; // namespace Graphics }; // namespace SurgSim #endif // SURGSIM_GRAPHICS_TEXTURE_H opensurgsim-0.7.0/SurgSim/Graphics/Texture1d.h000066400000000000000000000026551277777236100213130ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_TEXTURE1D_H #define SURGSIM_GRAPHICS_TEXTURE1D_H #include "SurgSim/Graphics/OsgTexture.h" namespace SurgSim { namespace Graphics { /// Base class defining the interface for a 1D Graphics Texture. /// A 1D Texture only has width. /// \note Normalized texture coordinates are used to access this texture. class Texture1d : public virtual Texture { public: /// Sets the size of the texture /// \param width Width of the texture /// \note Use this to setup a texture as a render target rather than loading from file. virtual void setSize(int width) = 0; /// Gets the size of the texture /// \return width Width of the texture virtual void getSize(int* width) const = 0; }; }; // namespace Graphics }; // namespace SurgSim #endif // SURGSIM_GRAPHICS_TEXTURE1D_H opensurgsim-0.7.0/SurgSim/Graphics/Texture2d.h000066400000000000000000000030441277777236100213050ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_TEXTURE2D_H #define SURGSIM_GRAPHICS_TEXTURE2D_H #include "SurgSim/Graphics/Texture.h" namespace SurgSim { namespace Graphics { /// Base class defining the interface for a 2D Graphics Texture. /// A 2D Texture has width and height. /// \note Normalized texture coordinates are used to access this texture. class Texture2d : public virtual Texture { public: /// Sets the size of the texture /// \param width Width of the texture /// \param height Height of the texture /// \note Use this to setup a texture as a render target rather than loading from file. virtual void setSize(int width, int height) = 0; /// Gets the size of the texture /// \param[out] width Width of the texture /// \param[out] height Height of the texture virtual void getSize(int* width, int* height) const = 0; }; }; // namespace Graphics }; // namespace SurgSim #endif // SURGSIM_GRAPHICS_TEXTURE2D_H opensurgsim-0.7.0/SurgSim/Graphics/Texture3d.h000066400000000000000000000040051277777236100213040ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_TEXTURE3D_H #define SURGSIM_GRAPHICS_TEXTURE3D_H #include "SurgSim/Graphics/Texture.h" #include namespace SurgSim { namespace Graphics { /// Base class defining the interface for a 3D Graphics Texture. /// A 3D Texture has width, height, and depth. /// \note Normalized texture coordinates are used to access this texture. class Texture3d : public virtual Texture { public: /// Sets the size of the texture /// \param width Width of the texture /// \param height Height of the texture /// \param depth Depth of the texture /// \note Use this to setup a texture as a render target rather than loading from file. virtual void setSize(int width, int height, int depth) = 0; /// Gets the size of the texture /// \param[out] width Width of the texture /// \param[out] height Height of the texture /// \param[out] depth Depth of the texture virtual void getSize(int* width, int* height, int* depth) const = 0; /// Loads images slices from files into the 3D texture /// \param filePaths Paths to the image files /// \return True if the image is successfully loaded, otherwise false /// \note The slices are stacked in the order provided to create the depth of the 3D texture. virtual bool loadImageSlices(const std::vector& filePaths) = 0; }; }; // namespace Graphics }; // namespace SurgSim #endif // SURGSIM_GRAPHICS_TEXTURE3D_H opensurgsim-0.7.0/SurgSim/Graphics/TextureCubeMap.h000066400000000000000000000044751277777236100223250ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_TEXTURECUBEMAP_H #define SURGSIM_GRAPHICS_TEXTURECUBEMAP_H #include "SurgSim/Graphics/Texture.h" namespace SurgSim { namespace Graphics { /// Base class defining the interface for a Cube Map Graphics Texture. /// A Cube Map Texture has a width and height, which is the same for each face of the cube. class TextureCubeMap : public virtual Texture { public: /// Sets the size of the texture, which is the same for each face of the cube /// \param width Width of the texture /// \param height Height of the texture /// \note Use this to setup a texture as a render target rather than loading from file. virtual void setSize(int width, int height) = 0; /// Gets the size of the texture, which is the same for each face of the cube /// \param[out] width Width of the texture /// \param[out] height Height of the texture virtual void getSize(int* width, int* height) const = 0; /// Loads images from files into the faces of the cube map /// \param negativeX Path to the image for the (-X) face /// \param positiveX Path to the image for the (+X) face /// \param negativeY Path to the image for the (-Y) face /// \param positiveY Path to the image for the (+Y) face /// \param negativeZ Path to the image for the (-Z) face /// \param positiveZ Path to the image for the (+Z) face /// \return True if the image is successfully loaded, otherwise false virtual bool loadImageFaces(const std::string& negativeX, const std::string& positiveX, const std::string& negativeY, const std::string& positiveY, const std::string& negativeZ, const std::string& positiveZ) = 0; }; }; // namespace Graphics }; // namespace SurgSim #endif // SURGSIM_GRAPHICS_TEXTURECUBEMAP_H opensurgsim-0.7.0/SurgSim/Graphics/TextureRectangle.h000066400000000000000000000031011277777236100226760ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_TEXTURERECTANGLE_H #define SURGSIM_GRAPHICS_TEXTURERECTANGLE_H #include "SurgSim/Graphics/Texture.h" namespace SurgSim { namespace Graphics { /// Base class defining the interface for a Rectangle Graphics Texture. /// A Rectangle Texture has width and height. /// \note Texel coordinates are used to access this texture. class TextureRectangle : public virtual Texture { public: /// Sets the size of the texture /// \param width Width of the texture /// \param height Height of the texture /// \note Use this to setup a texture as a render target rather than loading from file. virtual void setSize(int width, int height) = 0; /// Gets the size of the texture /// \param[out] width Width of the texture /// \param[out] height Height of the texture virtual void getSize(int* width, int* height) const = 0; }; }; // namespace Graphics }; // namespace SurgSim #endif // SURGSIM_GRAPHICS_TEXTURERECTANGLE_H opensurgsim-0.7.0/SurgSim/Graphics/TriangleNormalGenerator.cpp000066400000000000000000000052411277777236100245400ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Graphics/TriangleNormalGenerator.h" #include "SurgSim/Framework/Log.h" #include #include #include namespace SurgSim { namespace Graphics { TriangleNormalGenerator::TriangleNormalGenerator() : m_vertexArray(nullptr), m_normalArray(nullptr) { } void TriangleNormalGenerator::set( osg::Vec3Array* vertexArray, osg::Vec3Array* normalArray) { SURGSIM_ASSERT(vertexArray != nullptr) << "Need vertex array to generate normals!"; SURGSIM_ASSERT(normalArray != nullptr) << "Need normal array to store normals!"; SURGSIM_ASSERT(normalArray->size() == vertexArray->size()) << "Vertex and normal array need to have same size"; m_vertexArray = vertexArray; m_normalArray = normalArray; m_size = vertexArray->size(); } void TriangleNormalGenerator::normalize() { for(osg::Vec3Array::iterator normalIt = m_normalArray->begin(); normalIt != m_normalArray->end(); ++normalIt) { (*normalIt).normalize(); } } void TriangleNormalGenerator::reset() { for(osg::Vec3Array::iterator normalIt = m_normalArray->begin(); normalIt != m_normalArray->end(); ++normalIt) { (*normalIt).set(0.0f, 0.0f, 0.0f); } } void TriangleNormalGenerator::operator() (size_t vertexIndex1, size_t vertexIndex2, size_t vertexIndex3) { if (vertexIndex1 == vertexIndex2 || vertexIndex2 == vertexIndex3 || vertexIndex1 == vertexIndex3) { return; } const osg::Vec3& v1 = (*m_vertexArray)[vertexIndex1]; const osg::Vec3& v2 = (*m_vertexArray)[vertexIndex2]; const osg::Vec3& v3 = (*m_vertexArray)[vertexIndex3]; osg::Vec3 normal = (v2-v1) ^ (v3-v1); normal.normalize(); (*m_normalArray)[vertexIndex1] += normal; (*m_normalArray)[vertexIndex2] += normal; (*m_normalArray)[vertexIndex3] += normal; } osg::TriangleIndexFunctor createNormalGenerator( osg::Vec3Array* vertexArray, osg::Vec3Array* normalArray) { osg::TriangleIndexFunctor result; result.set(vertexArray, normalArray); return result; } }; // Graphics }; // SurgSim opensurgsim-0.7.0/SurgSim/Graphics/TriangleNormalGenerator.h000066400000000000000000000047071277777236100242130ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_TRIANGLENORMALGENERATOR_H #define SURGSIM_GRAPHICS_TRIANGLENORMALGENERATOR_H #include #include #include #include namespace SurgSim { namespace Graphics { /// Triangle index functor which calculates normals for the vertices of a geometry, use /// createNormalGenerator to instantiate this class TriangleNormalGenerator { public: /// Sets the arrays required to generate normals /// \pre vertexArray and normalArray, need to have the same number of entries and not be nullptr /// \param vertexArray Array containing vertex positions /// \param normalArray Array to store calculated normals void set(osg::Vec3Array* vertexArray, osg::Vec3Array* normalArray); /// Normalizes the calculated normals, this needs to be called after the pass to normalize all the normals /// Due to the osg way this object is called there is no real good way of having this called automatically void normalize(); /// Resets all calculated normals to 0. void reset(); /// Calculates the triangle normal and adds it to each adjacent vertex normal. /// \param vertexIndex1 First triangle vertex index /// \param vertexIndex2 Second triangle vertex index /// \param vertexIndex3 Third triangle vertex index void operator() (size_t vertexIndex1, size_t vertexIndex2, size_t vertexIndex3); protected: /// Constructor TriangleNormalGenerator(); private: /// Array containing vertex positions osg::ref_ptr m_vertexArray; /// Array storing calculated normals osg::ref_ptr m_normalArray; /// Size of vertex and normal array size_t m_size; }; osg::TriangleIndexFunctor createNormalGenerator( osg::Vec3Array* vertexArray, osg::Vec3Array* normalArray); }; // Graphics }; // SurgSim #endifopensurgsim-0.7.0/SurgSim/Graphics/Uniform.h000066400000000000000000000043011277777236100210330ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_UNIFORM_H #define SURGSIM_GRAPHICS_UNIFORM_H #include "SurgSim/Graphics/UniformBase.h" #include namespace SurgSim { namespace Graphics { /// Base class for a graphics uniform with a value of type T. /// \tparam Value type template class Uniform : public virtual UniformBase { public: Uniform() { SURGSIM_ADD_RW_PROPERTY(Uniform, T, Value, get, set); } /// Sets the value of the uniform virtual void set(const T& value) = 0; /// Returns the value of the uniform virtual const T& get() const = 0; }; /// Specialization of Uniform for vectors of values. /// \tparam Value type stored in the vector template class Uniform> : public virtual UniformBase { public: /// Returns the number of elements virtual size_t getNumElements() const = 0; /// Sets the value of one of the uniform's elements /// \param index Index of the element /// \param value Value to set virtual void setElement(size_t index, const T& value) = 0; /// Sets the value of all of the uniform's elements /// \param value Vector of values virtual void set(const std::vector& value) = 0; /// Gets the value of one of the uniform's elements /// \param index Index of the element /// \return Value of the element virtual typename std::vector::const_reference getElement(size_t index) const = 0; /// Gets the value of all of the uniform's elements /// \return Vector of values virtual const std::vector& get() const = 0; }; }; // namespace Graphics }; // namespace SurgSim #endif // SURGSIM_GRAPHICS_UNIFORM_Hopensurgsim-0.7.0/SurgSim/Graphics/UniformBase.h000066400000000000000000000024531277777236100216340ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_UNIFORMBASE_H #define SURGSIM_GRAPHICS_UNIFORMBASE_H #include "SurgSim/Framework/Accessible.h" namespace SurgSim { namespace Graphics { /// Common base class for all graphics uniforms. /// /// Graphics uniforms act as parameters to shader programs. /// \note /// SurgSim::Graphics::Uniform is templated on the type of value, so this base class allows a pointer to any type /// of Uniform. class UniformBase : public SurgSim::Framework::Accessible { public: /// Destructor virtual ~UniformBase() = 0; }; inline UniformBase::~UniformBase() { } }; // namespace Graphics }; // namespace SurgSim #endif // SURGSIM_GRAPHICS_UNIFORMBASE_H opensurgsim-0.7.0/SurgSim/Graphics/UnitTests/000077500000000000000000000000001277777236100212075ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Graphics/UnitTests/CMakeLists.txt000066400000000000000000000046741277777236100237620ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2012-2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. include_directories ( ${gtest_SOURCE_DIR}/include ${gmock_SOURCE_DIR}/include ) set(UNIT_TEST_SOURCES GroupTests.cpp ManagerTests.cpp MeshTests.cpp OsgAxesRepresentationTests.cpp OsgBoxRepresentationTests.cpp OsgCameraTests.cpp OsgCapsuleRepresentationTests.cpp OsgCurveRepresentationTests.cpp OsgCylinderRepresentationTests.cpp OsgGroupTests.cpp OsgLightTests.cpp OsgLogTests.cpp OsgManagerTests.cpp OsgMaterialTests.cpp OsgMatrixConversionsTests.cpp OsgMeshRepresentationTests.cpp OsgOctreeRepresentationTests.cpp OsgPlaneRepresentationTests.cpp OsgPlaneTests.cpp OsgPointCloudRepresentationTests.cpp OsgProgramTests.cpp OsgQuaternionConversionsTests.cpp OsgRenderTargetTests.cpp OsgRepresentationTests.cpp OsgRigidTransformConversionsTests.cpp OsgSceneryRepresentationTests.cpp OsgScreenSpaceQuadTests.cpp OsgSkeletonRepresentationTests.cpp OsgSphereRepresentationTests.cpp OsgTextRepresentationTests.cpp OsgTexture1dTests.cpp OsgTexture2dTests.cpp OsgTexture3dTests.cpp OsgTextureCubeMapTests.cpp OsgTextureRectangleTests.cpp OsgTextureTests.cpp OsgTextureUniformTests.cpp OsgUniformBaseTests.cpp OsgUniformTests.cpp OsgUniformTypesTests.cpp OsgUnitSphereTests.cpp OsgVectorConversionsTests.cpp OsgVectorFieldRepresentationTests.cpp OsgViewElementTests.cpp OsgViewTests.cpp PaintBehaviorTests.cpp RenderPassTests.cpp ViewElementTests.cpp ViewTests.cpp ) set(UNIT_TEST_HEADERS MockObjects.h MockOsgObjects.h ) # Configure the path for the data files configure_file( "${CMAKE_CURRENT_SOURCE_DIR}/config.txt.in" "${CMAKE_CURRENT_BINARY_DIR}/config.txt" ) file(COPY Data DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) set(LIBS SurgSimGraphics SurgSimMath SurgSimTesting ) surgsim_add_unit_tests(SurgSimGraphicsTest) set_target_properties(SurgSimGraphicsTest PROPERTIES FOLDER "Graphics") opensurgsim-0.7.0/SurgSim/Graphics/UnitTests/Data/000077500000000000000000000000001277777236100220605ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Graphics/UnitTests/Data/OsgProgramTests/000077500000000000000000000000001277777236100251635ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Graphics/UnitTests/Data/OsgProgramTests/shader.frag000066400000000000000000000001441277777236100272710ustar00rootroot00000000000000varying vec4 geomColor; /// Outputs the input color void main(void) { gl_FragColor = geomColor; };opensurgsim-0.7.0/SurgSim/Graphics/UnitTests/Data/OsgProgramTests/shader.geom000066400000000000000000000006321277777236100273030ustar00rootroot00000000000000#version 150 #extension GL_EXT_gpu_shader4 : enable #extension GL_EXT_geometry_shader4 : enable layout(triangles) in; layout(triangle_strip, max_vertices=3) out; in vec4 vertColor[3]; out vec4 geomColor; /// Outputs the same geometry as is input void main() { for (int i = 0; i < gl_VerticesIn; ++i) { gl_Position = gl_PositionIn[i]; geomColor = vertColor[i]; EmitVertex(); } EndPrimitive(); }opensurgsim-0.7.0/SurgSim/Graphics/UnitTests/Data/OsgProgramTests/shader.vert000066400000000000000000000003201277777236100273260ustar00rootroot00000000000000varying vec4 vertColor; /// Outputs the local normal direction as the vertex color void main(void) { gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; vertColor.rgb = gl_Normal; vertColor.a = 1.0; }opensurgsim-0.7.0/SurgSim/Graphics/UnitTests/Data/OsgSkeletonRepresentationTests/000077500000000000000000000000001277777236100302635ustar00rootroot00000000000000rigged_cylinder.osgt000066400000000000000000017022051277777236100342430ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Graphics/UnitTests/Data/OsgSkeletonRepresentationTests#Ascii Scene #Version 100 #Generator OpenSceneGraph 3.2.0 osg::Group { UniqueID 1 Name "Collada visual scene group" StateSet TRUE { osg::StateSet { UniqueID 2 DataVariance STATIC } } Children 1 { osg::MatrixTransform { UniqueID 3 Name "Armature" StateSet TRUE { osg::StateSet { UniqueID 4 DataVariance STATIC ModeList 1 { GL_RESCALE_NORMAL ON|OVERRIDE } } } Children 1 { osgAnimation::Skeleton { UniqueID 5 DataVariance DYNAMIC UpdateCallback TRUE { osgAnimation::UpdateSkeleton { UniqueID 6 } } Children 2 { osgAnimation::Bone { UniqueID 7 Name "Bone" DataVariance DYNAMIC UpdateCallback TRUE { osgAnimation::UpdateBone { UniqueID 8 Name "Bone" StackedTransforms 1 { osgAnimation::StackedMatrixElement { UniqueID 9 Name "transform" Matrix { 1 0 0 0 0 0 1 0 0 -1 0 0 0 0 0 1 } } } } } Children 1 { osgAnimation::Bone { UniqueID 10 Name "Bone_002" DataVariance DYNAMIC UpdateCallback TRUE { osgAnimation::UpdateBone { UniqueID 11 Name "Bone_002" StackedTransforms 1 { osgAnimation::StackedMatrixElement { UniqueID 12 Name "transform" Matrix { 1 0 0 0 0 1 0 0 0 0 1 0 0 0.25 0 1 } } } } } Children 1 { osgAnimation::Bone { UniqueID 13 Name "Bone_001" DataVariance DYNAMIC UpdateCallback TRUE { osgAnimation::UpdateBone { UniqueID 14 Name "Bone_001" StackedTransforms 1 { osgAnimation::StackedMatrixElement { UniqueID 15 Name "transform" Matrix { 1 0 0 0 0 1 0 0 0 0 1 0 0 0.25 0 1 } } } } } Children 1 { osgAnimation::Bone { UniqueID 16 Name "Bone_003" DataVariance DYNAMIC UpdateCallback TRUE { osgAnimation::UpdateBone { UniqueID 17 Name "Bone_003" StackedTransforms 1 { osgAnimation::StackedMatrixElement { UniqueID 18 Name "transform" Matrix { 1 0 0 0 0 1 0 0 0 0 1 0 0 0.25 0 1 } } } } } Matrix { 1 0 0 0 0 1 0 0 0 0 1 0 0 0.25 0 1 } InvBindMatrixInSkeletonSpace { 10 0 0 0 0 0 -10 0 0 10 0 0 0 -0.25 0 1 } } } Matrix { 1 0 0 0 0 1 0 0 0 0 1 0 0 0.25 0 1 } InvBindMatrixInSkeletonSpace { 10 0 0 0 0 0 -10 0 0 10 0 0 0 0 0 1 } } } Matrix { 1 0 0 0 0 1 0 0 0 0 1 0 0 0.25 0 1 } InvBindMatrixInSkeletonSpace { 10 0 0 0 0 0 -10 0 0 10 0 0 0 0.25 0 1 } } } Matrix { 1 0 0 0 0 0 1 0 0 -1 0 0 0 0 0 1 } InvBindMatrixInSkeletonSpace { 10 0 0 0 0 0 -10 0 0 10 0 0 0 0.5 0 1 } } osg::Geode { UniqueID 19 DataVariance DYNAMIC Drawables 1 { osgAnimation::RigGeometry { UniqueID 20 DataVariance DYNAMIC ComputeBoundingBoxCallback TRUE { osg::ComputeBoundingBoxCallback { UniqueID 21 } } SupportsDisplayList FALSE UseDisplayList FALSE UseVertexBufferObjects TRUE UpdateCallback TRUE { osg::UpdateCallback { UniqueID 22 } } PrimitiveSetList 1 { DrawElementsUInt GL_TRIANGLES 0 1428 { 1141 653 12 1147 676 20 1153 693 28 1159 710 36 1165 727 44 1171 744 52 1177 761 60 1183 779 68 1189 796 76 1195 813 84 762 246 268 1201 847 4 1207 830 92 303 168 259 1213 852 116 1219 858 371 1225 448 103 1231 876 141 1237 882 377 1243 471 132 1249 900 162 1255 906 383 1261 488 154 1267 924 186 1273 930 389 1279 506 178 1285 948 208 1291 954 395 1297 523 200 1303 972 232 1309 978 401 1315 540 222 1321 996 253 1327 1002 407 1333 557 247 1339 1020 277 1345 1026 413 1351 574 269 1357 1044 297 1363 1050 419 1369 591 290 1375 1068 322 1381 1074 425 608 314 1086 1392 1093 110 1398 1099 431 1404 641 363 1410 1117 348 1416 1123 437 1422 625 336 853 1142 664 372 870 1143 871 104 654 877 1148 681 378 894 1149 895 133 677 901 1154 698 384 918 1155 919 155 694 925 1160 716 390 942 1161 943 179 711 949 1166 732 396 966 1167 967 201 728 973 1172 750 402 990 1173 991 223 745 997 1178 767 408 1014 1179 1015 248 763 1021 1184 785 414 1038 1185 1039 270 780 1045 1190 802 420 1062 1191 1063 291 797 1069 1196 819 426 1087 1197 1088 315 814 1094 1202 454 432 1111 1203 1112 364 848 1118 1208 835 438 1135 1209 1136 337 831 443 1214 460 96 864 1215 865 373 854 647 1220 866 0 658 1221 659 111 859 860 1226 872 112 455 1227 456 5 449 466 1232 477 122 888 1233 889 379 878 670 1238 890 8 461 1239 462 117 883 884 1244 896 118 665 1245 666 13 472 483 1250 494 147 912 1251 913 385 902 687 1256 914 16 478 1257 479 142 907 908 1262 920 143 682 1263 683 21 489 500 1268 512 169 936 1269 937 391 926 704 1274 938 24 495 1275 496 163 931 932 1280 944 164 699 1281 700 29 507 518 1286 528 192 960 1287 961 397 950 722 1292 962 32 513 1293 514 187 955 956 1298 968 188 717 1299 718 37 524 534 1304 546 214 984 1305 985 403 974 738 1310 986 40 529 1311 530 209 979 980 1316 992 210 733 1317 734 45 541 552 1322 562 238 1008 1323 1009 409 998 756 1328 1010 48 547 1329 548 233 1003 1004 1334 1016 234 751 1335 752 53 558 568 1340 579 260 1032 1341 1033 415 1022 773 1346 1034 56 563 1347 564 254 1027 1028 1352 1040 255 768 1353 769 61 575 585 1358 596 283 1056 1359 1057 421 1046 791 1364 1058 64 580 1365 581 278 1051 1052 1370 1064 279 786 1371 787 69 592 602 1376 614 304 1080 1377 1081 427 1070 808 1382 1082 72 597 1383 598 298 1075 1076 1387 1089 299 803 1388 804 77 609 636 1393 660 354 1105 1394 1106 433 1095 841 1399 1107 88 630 1400 631 349 1100 1101 1405 1113 350 836 1406 837 93 642 620 1411 632 328 1129 1412 1130 439 1119 825 1417 1131 80 615 1418 616 323 1124 1125 1423 1137 324 820 1424 821 85 626 667 1144 14 684 1150 22 701 1156 30 719 1162 38 735 1168 46 753 1174 54 770 1180 62 788 1186 70 805 1192 78 822 1198 86 473 15 655 105 450 365 451 6 849 798 316 610 338 643 832 87 815 627 317 339 816 79 799 611 593 781 292 594 71 782 576 764 271 577 63 765 559 746 249 560 55 747 729 202 542 543 47 730 525 712 203 526 39 713 695 156 508 509 31 696 678 134 490 491 23 679 474 106 135 714 180 204 452 850 366 644 94 833 817 340 628 748 224 250 157 136 341 137 158 492 475 656 107 457 1204 7 159 181 510 783 272 293 182 160 342 318 273 225 343 138 367 800 294 319 295 274 320 251 226 275 205 183 227 321 228 344 229 184 345 206 230 544 139 108 368 346 369 645 838 1210 95 637 1 648 444 671 97 445 9 672 467 688 123 468 17 689 484 705 148 485 25 706 723 193 501 502 33 724 519 739 194 520 41 740 757 239 535 536 49 758 553 774 240 554 57 775 792 284 569 570 65 793 809 305 586 587 73 810 826 329 603 604 81 827 621 842 330 622 89 843 355 638 649 331 306 605 98 124 356 776 261 241 463 1216 119 125 307 357 332 358 308 741 215 195 309 285 588 690 149 126 196 170 503 286 262 571 650 99 359 242 216 537 150 171 127 197 217 172 243 263 218 287 310 264 707 173 151 333 844 360 128 174 311 175 219 265 100 673 129 867 1222 374 873 1228 109 480 1234 144 891 1240 380 897 1246 140 497 1252 165 915 1258 386 921 1264 161 515 1270 189 939 1276 392 945 1282 185 531 1288 211 963 1294 398 969 1300 207 549 1306 235 987 1312 404 993 1318 231 565 1324 256 1011 1330 410 1017 1336 252 582 1342 280 1035 1348 416 1041 1354 276 599 1360 300 1059 1366 422 1065 1372 296 617 1378 325 1083 1384 428 1389 612 1090 661 1395 113 1108 1401 434 1114 1407 370 633 1413 351 1132 1419 440 1138 1425 347 120 855 668 856 375 1145 1146 874 657 145 879 685 880 381 1151 1152 898 680 166 903 702 904 387 1157 1158 922 697 190 927 720 928 393 1163 1164 946 715 212 951 736 952 399 1169 1170 970 731 236 975 754 976 405 1175 1176 994 749 257 999 771 1000 411 1181 1182 1018 766 281 1023 789 1024 417 1187 1188 1042 784 301 1047 806 1048 423 1193 1194 1066 801 326 1071 823 1072 429 1199 1200 1091 818 114 1096 458 1097 435 1205 1206 1115 851 352 1120 839 1121 441 1211 1212 1139 834 10 446 464 447 101 1217 1218 868 857 102 651 869 652 2 1223 1224 662 861 376 862 875 863 115 1229 1230 459 453 18 469 481 470 130 1235 1236 892 881 131 674 893 675 11 1241 1242 465 885 382 886 899 887 121 1247 1248 669 476 26 486 498 487 152 1253 1254 916 905 153 691 917 692 19 1259 1260 482 909 388 910 923 911 146 1265 1266 686 493 34 504 516 505 176 1271 1272 940 929 177 708 941 709 27 1277 1278 499 933 394 934 947 935 167 1283 1284 703 511 42 521 532 522 198 1289 1290 964 953 199 725 965 726 35 1295 1296 517 957 400 958 971 959 191 1301 1302 721 527 50 538 550 539 220 1307 1308 988 977 221 742 989 743 43 1313 1314 533 981 406 982 995 983 213 1319 1320 737 545 58 555 566 556 244 1325 1326 1012 1001 245 759 1013 760 51 1331 1332 551 1005 412 1006 1019 1007 237 1337 1338 755 561 66 572 583 573 266 1343 1344 1036 1025 267 777 1037 778 59 1349 1350 567 1029 418 1030 1043 1031 258 1355 1356 772 578 74 589 600 590 288 1361 1362 1060 1049 289 794 1061 795 67 1367 1368 584 1053 424 1054 1067 1055 282 1373 1374 790 595 82 606 618 607 312 1379 1380 1084 1073 313 811 1085 812 75 1385 1386 601 1077 430 1078 1092 1079 302 1390 1391 807 613 3 639 663 640 361 1396 1397 1109 1098 362 845 1110 846 90 1402 1403 634 1102 436 1103 1116 1104 353 1408 1409 840 646 91 623 635 624 334 1414 1415 1133 1122 335 828 1134 829 83 1420 1421 619 1126 442 1127 1140 1128 327 1426 1427 824 629 } } VertexData { Array TRUE ArrayID 1 Vec3fArray 1428 { 0 0.0499999 -0.0499999 0 0.0499999 -0.0499999 0 0.0499999 -0.0499999 0 0.0499999 -0.0499999 0 0.0499999 0.0499999 0 0.0499999 0.0499999 0 0.0499999 0.0499999 0 0.0499999 0.0499999 0.025 0.0433012 -0.0499999 0.025 0.0433012 -0.0499999 0.025 0.0433012 -0.0499999 0.025 0.0433012 -0.0499999 0.025 0.0433012 0.0499999 0.025 0.0433012 0.0499999 0.025 0.0433012 0.0499999 0.025 0.0433012 0.0499999 0.0433012 0.025 -0.0499999 0.0433012 0.025 -0.0499999 0.0433012 0.025 -0.0499999 0.0433012 0.025 -0.0499999 0.0433012 0.025 0.0499999 0.0433012 0.025 0.0499999 0.0433012 0.025 0.0499999 0.0433012 0.025 0.0499999 0.0499999 0 -0.0499999 0.0499999 0 -0.0499999 0.0499999 0 -0.0499999 0.0499999 0 -0.0499999 0.0499999 0 0.0499999 0.0499999 0 0.0499999 0.0499999 0 0.0499999 0.0499999 0 0.0499999 0.0433012 -0.025 -0.0499999 0.0433012 -0.025 -0.0499999 0.0433012 -0.025 -0.0499999 0.0433012 -0.025 -0.0499999 0.0433012 -0.025 0.0499999 0.0433012 -0.025 0.0499999 0.0433012 -0.025 0.0499999 0.0433012 -0.025 0.0499999 0.025 -0.0433012 -0.0499999 0.025 -0.0433012 -0.0499999 0.025 -0.0433012 -0.0499999 0.025 -0.0433012 -0.0499999 0.025 -0.0433012 0.0499999 0.025 -0.0433012 0.0499999 0.025 -0.0433012 0.0499999 0.025 -0.0433012 0.0499999 0 -0.0499999 -0.0499999 0 -0.0499999 -0.0499999 0 -0.0499999 -0.0499999 0 -0.0499999 -0.0499999 0 -0.0499999 0.0499999 0 -0.0499999 0.0499999 0 -0.0499999 0.0499999 0 -0.0499999 0.0499999 -0.025 -0.0433012 -0.0499999 -0.025 -0.0433012 -0.0499999 -0.025 -0.0433012 -0.0499999 -0.025 -0.0433012 -0.0499999 -0.025 -0.0433012 0.0499999 -0.025 -0.0433012 0.0499999 -0.025 -0.0433012 0.0499999 -0.025 -0.0433012 0.0499999 -0.0433012 -0.025 -0.0499999 -0.0433012 -0.025 -0.0499999 -0.0433012 -0.025 -0.0499999 -0.0433012 -0.025 -0.0499999 -0.0433012 -0.025 0.0499999 -0.0433012 -0.025 0.0499999 -0.0433012 -0.025 0.0499999 -0.0433012 -0.025 0.0499999 -0.0499999 0 -0.0499999 -0.0499999 0 -0.0499999 -0.0499999 0 -0.0499999 -0.0499999 0 -0.0499999 -0.0499999 0 0.0499999 -0.0499999 0 0.0499999 -0.0499999 0 0.0499999 -0.0499999 0 0.0499999 -0.0433013 0.025 -0.0499999 -0.0433013 0.025 -0.0499999 -0.0433013 0.025 -0.0499999 -0.0433013 0.025 -0.0499999 -0.0433013 0.025 0.0499999 -0.0433013 0.025 0.0499999 -0.0433013 0.025 0.0499999 -0.0433013 0.025 0.0499999 -0.025 0.0433012 -0.0499999 -0.025 0.0433012 -0.0499999 -0.025 0.0433012 -0.0499999 -0.025 0.0433012 -0.0499999 -0.025 0.0433012 0.0499999 -0.025 0.0433012 0.0499999 -0.025 0.0433012 0.0499999 -0.025 0.0433012 0.0499999 0.0125 0.0466506 -0.0499999 0.0125 0.0466506 -0.0499999 0.0125 0.0466506 -0.0499999 0.0125 0.0466506 -0.0499999 0.0125 0.0466506 -0.0499999 0.0125 0.0466506 -0.0499999 0.0125 0.0466506 -0.0499999 0.0125 0.0466506 0.0499999 0.0125 0.0466506 0.0499999 0.0125 0.0466506 0.0499999 0.0125 0.0466506 0.0499999 0.0125 0.0466506 0.0499999 0.0125 0.0466506 0.0499999 0.0125 0.0466506 0.0499999 0 0.0499999 0 0 0.0499999 0 0 0.0499999 0 0 0.0499999 0 0 0.0499999 0 0 0.0499999 0 0.025 0.0433012 0 0.025 0.0433012 0 0.025 0.0433012 0 0.025 0.0433012 0 0.025 0.0433012 0 0.025 0.0433012 0 0.0341506 0.0341506 -0.0499999 0.0341506 0.0341506 -0.0499999 0.0341506 0.0341506 -0.0499999 0.0341506 0.0341506 -0.0499999 0.0341506 0.0341506 -0.0499999 0.0341506 0.0341506 -0.0499999 0.0341506 0.0341506 -0.0499999 0.0341506 0.0341506 -0.0499999 0.0341506 0.0341506 -0.0499999 0.0341506 0.0341506 -0.0499999 0.0341506 0.0341506 0.0499999 0.0341506 0.0341506 0.0499999 0.0341506 0.0341506 0.0499999 0.0341506 0.0341506 0.0499999 0.0341506 0.0341506 0.0499999 0.0341506 0.0341506 0.0499999 0.0341506 0.0341506 0.0499999 0.0341506 0.0341506 0.0499999 0.0341506 0.0341506 0.0499999 0.0433012 0.025 0 0.0433012 0.025 0 0.0433012 0.025 0 0.0433012 0.025 0 0.0433012 0.025 0 0.0433012 0.025 0 0.0466506 0.0125 -0.0499999 0.0466506 0.0125 -0.0499999 0.0466506 0.0125 -0.0499999 0.0466506 0.0125 -0.0499999 0.0466506 0.0125 -0.0499999 0.0466506 0.0125 -0.0499999 0.0466506 0.0125 -0.0499999 0.0466506 0.0125 0.0499999 0.0466506 0.0125 0.0499999 0.0466506 0.0125 0.0499999 0.0466506 0.0125 0.0499999 0.0466506 0.0125 0.0499999 0.0466506 0.0125 0.0499999 0.0466506 0.0125 0.0499999 0.0466506 0.0125 0.0499999 0.0499999 0 0 0.0499999 0 0 0.0499999 0 0 0.0499999 0 0 0.0499999 0 0 0.0499999 0 0 0.0466506 -0.0125 -0.0499999 0.0466506 -0.0125 -0.0499999 0.0466506 -0.0125 -0.0499999 0.0466506 -0.0125 -0.0499999 0.0466506 -0.0125 -0.0499999 0.0466506 -0.0125 -0.0499999 0.0466506 -0.0125 -0.0499999 0.0466506 -0.0125 -0.0499999 0.0466506 -0.0125 -0.0499999 0.0466506 -0.0125 -0.0499999 0.0466506 -0.0125 0.0499999 0.0466506 -0.0125 0.0499999 0.0466506 -0.0125 0.0499999 0.0466506 -0.0125 0.0499999 0.0466506 -0.0125 0.0499999 0.0466506 -0.0125 0.0499999 0.0466506 -0.0125 0.0499999 0.0466506 -0.0125 0.0499999 0.0433012 -0.025 0 0.0433012 -0.025 0 0.0433012 -0.025 0 0.0433012 -0.025 0 0.0433012 -0.025 0 0.0433012 -0.025 0 0.0341506 -0.0341506 -0.0499999 0.0341506 -0.0341506 -0.0499999 0.0341506 -0.0341506 -0.0499999 0.0341506 -0.0341506 -0.0499999 0.0341506 -0.0341506 -0.0499999 0.0341506 -0.0341506 -0.0499999 0.0341506 -0.0341506 -0.0499999 0.0341506 -0.0341506 -0.0499999 0.0341506 -0.0341506 0.0499999 0.0341506 -0.0341506 0.0499999 0.0341506 -0.0341506 0.0499999 0.0341506 -0.0341506 0.0499999 0.0341506 -0.0341506 0.0499999 0.0341506 -0.0341506 0.0499999 0.0341506 -0.0341506 0.0499999 0.0341506 -0.0341506 0.0499999 0.025 -0.0433012 0 0.025 -0.0433012 0 0.025 -0.0433012 0 0.025 -0.0433012 0 0.025 -0.0433012 0 0.025 -0.0433012 0 0.0125 -0.0466506 -0.0499999 0.0125 -0.0466506 -0.0499999 0.0125 -0.0466506 -0.0499999 0.0125 -0.0466506 -0.0499999 0.0125 -0.0466506 -0.0499999 0.0125 -0.0466506 -0.0499999 0.0125 -0.0466506 -0.0499999 0.0125 -0.0466506 -0.0499999 0.0125 -0.0466506 0.0499999 0.0125 -0.0466506 0.0499999 0.0125 -0.0466506 0.0499999 0.0125 -0.0466506 0.0499999 0.0125 -0.0466506 0.0499999 0.0125 -0.0466506 0.0499999 0.0125 -0.0466506 0.0499999 0.0125 -0.0466506 0.0499999 0.0125 -0.0466506 0.0499999 0.0125 -0.0466506 0.0499999 0 -0.0499999 0 0 -0.0499999 0 0 -0.0499999 0 0 -0.0499999 0 0 -0.0499999 0 0 -0.0499999 0 -0.0125 -0.0466506 -0.0499999 -0.0125 -0.0466506 -0.0499999 -0.0125 -0.0466506 -0.0499999 -0.0125 -0.0466506 -0.0499999 -0.0125 -0.0466506 -0.0499999 -0.0125 -0.0466506 -0.0499999 -0.0125 -0.0466506 -0.0499999 -0.0125 -0.0466506 -0.0499999 -0.0125 -0.0466506 0.0499999 -0.0125 -0.0466506 0.0499999 -0.0125 -0.0466506 0.0499999 -0.0125 -0.0466506 0.0499999 -0.0125 -0.0466506 0.0499999 -0.0125 -0.0466506 0.0499999 -0.0125 -0.0466506 0.0499999 -0.025 -0.0433012 0 -0.025 -0.0433012 0 -0.025 -0.0433012 0 -0.025 -0.0433012 0 -0.025 -0.0433012 0 -0.025 -0.0433012 0 -0.0341506 -0.0341506 -0.0499999 -0.0341506 -0.0341506 -0.0499999 -0.0341506 -0.0341506 -0.0499999 -0.0341506 -0.0341506 -0.0499999 -0.0341506 -0.0341506 -0.0499999 -0.0341506 -0.0341506 -0.0499999 -0.0341506 -0.0341506 -0.0499999 -0.0341506 -0.0341506 -0.0499999 -0.0341506 -0.0341506 -0.0499999 -0.0341506 -0.0341506 0.0499999 -0.0341506 -0.0341506 0.0499999 -0.0341506 -0.0341506 0.0499999 -0.0341506 -0.0341506 0.0499999 -0.0341506 -0.0341506 0.0499999 -0.0341506 -0.0341506 0.0499999 -0.0341506 -0.0341506 0.0499999 -0.0341506 -0.0341506 0.0499999 -0.0341506 -0.0341506 0.0499999 -0.0433012 -0.025 0 -0.0433012 -0.025 0 -0.0433012 -0.025 0 -0.0433012 -0.025 0 -0.0433012 -0.025 0 -0.0433012 -0.025 0 -0.0466506 -0.0125 -0.0499999 -0.0466506 -0.0125 -0.0499999 -0.0466506 -0.0125 -0.0499999 -0.0466506 -0.0125 -0.0499999 -0.0466506 -0.0125 -0.0499999 -0.0466506 -0.0125 -0.0499999 -0.0466506 -0.0125 -0.0499999 -0.0466506 -0.0125 0.0499999 -0.0466506 -0.0125 0.0499999 -0.0466506 -0.0125 0.0499999 -0.0466506 -0.0125 0.0499999 -0.0466506 -0.0125 0.0499999 -0.0466506 -0.0125 0.0499999 -0.0466506 -0.0125 0.0499999 -0.0499999 0 0 -0.0499999 0 0 -0.0499999 0 0 -0.0499999 0 0 -0.0499999 0 0 -0.0499999 0 0 -0.0466506 0.0124999 -0.0499999 -0.0466506 0.0124999 -0.0499999 -0.0466506 0.0124999 -0.0499999 -0.0466506 0.0124999 -0.0499999 -0.0466506 0.0124999 -0.0499999 -0.0466506 0.0124999 -0.0499999 -0.0466506 0.0124999 -0.0499999 -0.0466506 0.0124999 -0.0499999 -0.0466506 0.0124999 -0.0499999 -0.0466506 0.0124999 -0.0499999 -0.0466506 0.0124999 -0.0499999 -0.0466506 0.0124999 0.0499999 -0.0466506 0.0124999 0.0499999 -0.0466506 0.0124999 0.0499999 -0.0466506 0.0124999 0.0499999 -0.0466506 0.0124999 0.0499999 -0.0466506 0.0124999 0.0499999 -0.0466506 0.0124999 0.0499999 -0.0466506 0.0124999 0.0499999 -0.0433013 0.025 0 -0.0433013 0.025 0 -0.0433013 0.025 0 -0.0433013 0.025 0 -0.0433013 0.025 0 -0.0433013 0.025 0 -0.0341507 0.0341506 -0.0499999 -0.0341507 0.0341506 -0.0499999 -0.0341507 0.0341506 -0.0499999 -0.0341507 0.0341506 -0.0499999 -0.0341507 0.0341506 -0.0499999 -0.0341507 0.0341506 -0.0499999 -0.0341507 0.0341506 -0.0499999 -0.0341507 0.0341506 -0.0499999 -0.0341507 0.0341506 0.0499999 -0.0341507 0.0341506 0.0499999 -0.0341507 0.0341506 0.0499999 -0.0341507 0.0341506 0.0499999 -0.0341507 0.0341506 0.0499999 -0.0341507 0.0341506 0.0499999 -0.0341507 0.0341506 0.0499999 -0.0341507 0.0341506 0.0499999 -0.0341507 0.0341506 0.0499999 -0.0341507 0.0341506 0.0499999 -0.0341507 0.0341506 0.0499999 -0.0341507 0.0341506 0.0499999 -0.025 0.0433012 0 -0.025 0.0433012 0 -0.025 0.0433012 0 -0.025 0.0433012 0 -0.025 0.0433012 0 -0.025 0.0433012 0 -0.0125 0.0466506 -0.0499999 -0.0125 0.0466506 -0.0499999 -0.0125 0.0466506 -0.0499999 -0.0125 0.0466506 -0.0499999 -0.0125 0.0466506 -0.0499999 -0.0125 0.0466506 -0.0499999 -0.0125 0.0466506 -0.0499999 -0.0125 0.0466506 -0.0499999 -0.0125 0.0466506 -0.0499999 -0.0125 0.0466506 0.0499999 -0.0125 0.0466506 0.0499999 -0.0125 0.0466506 0.0499999 -0.0125 0.0466506 0.0499999 -0.0125 0.0466506 0.0499999 -0.0125 0.0466506 0.0499999 -0.0125 0.0466506 0.0499999 -0.0125 0.0466506 0.0499999 0.0125 0.0466506 0 0.0125 0.0466506 0 0.0125 0.0466506 0 0.0125 0.0466506 0 0.0125 0.0466506 0 0.0125 0.0466506 0 0.0341506 0.0341506 0 0.0341506 0.0341506 0 0.0341506 0.0341506 0 0.0341506 0.0341506 0 0.0341506 0.0341506 0 0.0341506 0.0341506 0 0.0466506 0.0125 0 0.0466506 0.0125 0 0.0466506 0.0125 0 0.0466506 0.0125 0 0.0466506 0.0125 0 0.0466506 0.0125 0 0.0466506 -0.0125 0 0.0466506 -0.0125 0 0.0466506 -0.0125 0 0.0466506 -0.0125 0 0.0466506 -0.0125 0 0.0466506 -0.0125 0 0.0341506 -0.0341506 0 0.0341506 -0.0341506 0 0.0341506 -0.0341506 0 0.0341506 -0.0341506 0 0.0341506 -0.0341506 0 0.0341506 -0.0341506 0 0.0125 -0.0466506 0 0.0125 -0.0466506 0 0.0125 -0.0466506 0 0.0125 -0.0466506 0 0.0125 -0.0466506 0 0.0125 -0.0466506 0 -0.0125 -0.0466506 0 -0.0125 -0.0466506 0 -0.0125 -0.0466506 0 -0.0125 -0.0466506 0 -0.0125 -0.0466506 0 -0.0125 -0.0466506 0 -0.0341506 -0.0341506 0 -0.0341506 -0.0341506 0 -0.0341506 -0.0341506 0 -0.0341506 -0.0341506 0 -0.0341506 -0.0341506 0 -0.0341506 -0.0341506 0 -0.0466506 -0.0125 0 -0.0466506 -0.0125 0 -0.0466506 -0.0125 0 -0.0466506 -0.0125 0 -0.0466506 -0.0125 0 -0.0466506 -0.0125 0 -0.0466506 0.0124999 0 -0.0466506 0.0124999 0 -0.0466506 0.0124999 0 -0.0466506 0.0124999 0 -0.0466506 0.0124999 0 -0.0466506 0.0124999 0 -0.0125 0.0466506 0 -0.0125 0.0466506 0 -0.0125 0.0466506 0 -0.0125 0.0466506 0 -0.0125 0.0466506 0 -0.0125 0.0466506 0 -0.0341507 0.0341506 0 -0.0341507 0.0341506 0 -0.0341507 0.0341506 0 -0.0341507 0.0341506 0 -0.0341507 0.0341506 0 -0.0341507 0.0341506 0 0.01875 0.0449759 -0.0499999 0.01875 0.0449759 -0.0499999 0.01875 0.0449759 -0.0499999 0.01875 0.0449759 -0.0499999 0.01875 0.0449759 -0.0499999 0.00624996 0.0483253 0.0499999 0.00624996 0.0483253 0.0499999 0.00624996 0.0483253 0.0499999 0.00624996 0.0483253 0.0499999 0.00624996 0.0483253 0.0499999 0.00624996 0.0483253 0.0499999 0 0.0499999 0.025 0 0.0499999 0.025 0 0.0499999 0.025 0 0.0499999 0.025 0 0.0499999 0.025 0 0.0499999 0.025 0.025 0.0433012 -0.025 0.025 0.0433012 -0.025 0.025 0.0433012 -0.025 0.025 0.0433012 -0.025 0.025 0.0433012 -0.025 0.025 0.0433012 -0.025 0.0387259 0.0295753 -0.0499999 0.0387259 0.0295753 -0.0499999 0.0387259 0.0295753 -0.0499999 0.0387259 0.0295753 -0.0499999 0.0387259 0.0295753 -0.0499999 0.0295753 0.0387259 0.0499999 0.0295753 0.0387259 0.0499999 0.0295753 0.0387259 0.0499999 0.0295753 0.0387259 0.0499999 0.0295753 0.0387259 0.0499999 0.0295753 0.0387259 0.0499999 0.0433012 0.025 -0.025 0.0433012 0.025 -0.025 0.0433012 0.025 -0.025 0.0433012 0.025 -0.025 0.0433012 0.025 -0.025 0.0433012 0.025 -0.025 0.0483253 0.00624996 -0.0499999 0.0483253 0.00624996 -0.0499999 0.0483253 0.00624996 -0.0499999 0.0483253 0.00624996 -0.0499999 0.0483253 0.00624996 -0.0499999 0.0449759 0.01875 0.0499999 0.0449759 0.01875 0.0499999 0.0449759 0.01875 0.0499999 0.0449759 0.01875 0.0499999 0.0449759 0.01875 0.0499999 0.0449759 0.01875 0.0499999 0.0499999 0 -0.025 0.0499999 0 -0.025 0.0499999 0 -0.025 0.0499999 0 -0.025 0.0499999 0 -0.025 0.0499999 0 -0.025 0.0449759 -0.01875 -0.0499999 0.0449759 -0.01875 -0.0499999 0.0449759 -0.01875 -0.0499999 0.0449759 -0.01875 -0.0499999 0.0449759 -0.01875 -0.0499999 0.0449759 -0.01875 -0.0499999 0.0483253 -0.00624996 0.0499999 0.0483253 -0.00624996 0.0499999 0.0483253 -0.00624996 0.0499999 0.0483253 -0.00624996 0.0499999 0.0483253 -0.00624996 0.0499999 0.0483253 -0.00624996 0.0499999 0.0433012 -0.025 -0.025 0.0433012 -0.025 -0.025 0.0433012 -0.025 -0.025 0.0433012 -0.025 -0.025 0.0433012 -0.025 -0.025 0.0433012 -0.025 -0.025 0.0295753 -0.0387259 -0.0499999 0.0295753 -0.0387259 -0.0499999 0.0295753 -0.0387259 -0.0499999 0.0295753 -0.0387259 -0.0499999 0.0295753 -0.0387259 -0.0499999 0.0387259 -0.0295753 0.0499999 0.0387259 -0.0295753 0.0499999 0.0387259 -0.0295753 0.0499999 0.0387259 -0.0295753 0.0499999 0.0387259 -0.0295753 0.0499999 0.025 -0.0433012 -0.025 0.025 -0.0433012 -0.025 0.025 -0.0433012 -0.025 0.025 -0.0433012 -0.025 0.025 -0.0433012 -0.025 0.025 -0.0433012 -0.025 0.00624996 -0.0483253 -0.0499999 0.00624996 -0.0483253 -0.0499999 0.00624996 -0.0483253 -0.0499999 0.00624996 -0.0483253 -0.0499999 0.00624996 -0.0483253 -0.0499999 0.00624996 -0.0483253 -0.0499999 0.01875 -0.0449759 0.0499999 0.01875 -0.0449759 0.0499999 0.01875 -0.0449759 0.0499999 0.01875 -0.0449759 0.0499999 0.01875 -0.0449759 0.0499999 0.01875 -0.0449759 0.0499999 0 -0.0499999 -0.025 0 -0.0499999 -0.025 0 -0.0499999 -0.025 0 -0.0499999 -0.025 0 -0.0499999 -0.025 0 -0.0499999 -0.025 -0.01875 -0.0449759 -0.0499999 -0.01875 -0.0449759 -0.0499999 -0.01875 -0.0449759 -0.0499999 -0.01875 -0.0449759 -0.0499999 -0.01875 -0.0449759 -0.0499999 -0.00624996 -0.0483253 0.0499999 -0.00624996 -0.0483253 0.0499999 -0.00624996 -0.0483253 0.0499999 -0.00624996 -0.0483253 0.0499999 -0.00624996 -0.0483253 0.0499999 -0.025 -0.0433012 -0.025 -0.025 -0.0433012 -0.025 -0.025 -0.0433012 -0.025 -0.025 -0.0433012 -0.025 -0.025 -0.0433012 -0.025 -0.025 -0.0433012 -0.025 -0.0387259 -0.0295753 -0.0499999 -0.0387259 -0.0295753 -0.0499999 -0.0387259 -0.0295753 -0.0499999 -0.0387259 -0.0295753 -0.0499999 -0.0387259 -0.0295753 -0.0499999 -0.0387259 -0.0295753 -0.0499999 -0.0295753 -0.0387259 0.0499999 -0.0295753 -0.0387259 0.0499999 -0.0295753 -0.0387259 0.0499999 -0.0295753 -0.0387259 0.0499999 -0.0295753 -0.0387259 0.0499999 -0.0433012 -0.025 -0.025 -0.0433012 -0.025 -0.025 -0.0433012 -0.025 -0.025 -0.0433012 -0.025 -0.025 -0.0433012 -0.025 -0.025 -0.0433012 -0.025 -0.025 -0.0483253 -0.00624996 -0.0499999 -0.0483253 -0.00624996 -0.0499999 -0.0483253 -0.00624996 -0.0499999 -0.0483253 -0.00624996 -0.0499999 -0.0483253 -0.00624996 -0.0499999 -0.0483253 -0.00624996 -0.0499999 -0.0449759 -0.01875 0.0499999 -0.0449759 -0.01875 0.0499999 -0.0449759 -0.01875 0.0499999 -0.0449759 -0.01875 0.0499999 -0.0449759 -0.01875 0.0499999 -0.0499999 0 -0.025 -0.0499999 0 -0.025 -0.0499999 0 -0.025 -0.0499999 0 -0.025 -0.0499999 0 -0.025 -0.0499999 0 -0.025 -0.0449759 0.01875 -0.0499999 -0.0449759 0.01875 -0.0499999 -0.0449759 0.01875 -0.0499999 -0.0449759 0.01875 -0.0499999 -0.0449759 0.01875 -0.0499999 -0.0449759 0.01875 -0.0499999 -0.0483253 0.00624996 0.0499999 -0.0483253 0.00624996 0.0499999 -0.0483253 0.00624996 0.0499999 -0.0483253 0.00624996 0.0499999 -0.0483253 0.00624996 0.0499999 -0.0483253 0.00624996 0.0499999 -0.0433013 0.025 -0.025 -0.0433013 0.025 -0.025 -0.0433013 0.025 -0.025 -0.0433013 0.025 -0.025 -0.0433013 0.025 -0.025 -0.0433013 0.025 -0.025 -0.0295753 0.0387259 -0.0499999 -0.0295753 0.0387259 -0.0499999 -0.0295753 0.0387259 -0.0499999 -0.0295753 0.0387259 -0.0499999 -0.0295753 0.0387259 -0.0499999 -0.038726 0.0295753 0.0499999 -0.038726 0.0295753 0.0499999 -0.038726 0.0295753 0.0499999 -0.038726 0.0295753 0.0499999 -0.038726 0.0295753 0.0499999 -0.025 0.0433012 -0.025 -0.025 0.0433012 -0.025 -0.025 0.0433012 -0.025 -0.025 0.0433012 -0.025 -0.025 0.0433012 -0.025 -0.025 0.0433012 -0.025 -0.00624996 0.0483253 -0.0499999 -0.00624996 0.0483253 -0.0499999 -0.00624996 0.0483253 -0.0499999 -0.00624996 0.0483253 -0.0499999 -0.00624996 0.0483253 -0.0499999 -0.01875 0.0449759 0.0499999 -0.01875 0.0449759 0.0499999 -0.01875 0.0449759 0.0499999 -0.01875 0.0449759 0.0499999 -0.01875 0.0449759 0.0499999 -0.01875 0.0449759 0.0499999 0.00624996 0.0483253 -0.0499999 0.00624996 0.0483253 -0.0499999 0.00624996 0.0483253 -0.0499999 0.00624996 0.0483253 -0.0499999 0.00624996 0.0483253 -0.0499999 0.00624996 0.0483253 -0.0499999 0.01875 0.0449759 0.0499999 0.01875 0.0449759 0.0499999 0.01875 0.0449759 0.0499999 0.01875 0.0449759 0.0499999 0.01875 0.0449759 0.0499999 0 0.0499999 -0.025 0 0.0499999 -0.025 0 0.0499999 -0.025 0 0.0499999 -0.025 0 0.0499999 -0.025 0 0.0499999 -0.025 0.025 0.0433012 0.025 0.025 0.0433012 0.025 0.025 0.0433012 0.025 0.025 0.0433012 0.025 0.025 0.0433012 0.025 0.025 0.0433012 0.025 0.0295753 0.0387259 -0.0499999 0.0295753 0.0387259 -0.0499999 0.0295753 0.0387259 -0.0499999 0.0295753 0.0387259 -0.0499999 0.0295753 0.0387259 -0.0499999 0.0295753 0.0387259 -0.0499999 0.0387259 0.0295753 0.0499999 0.0387259 0.0295753 0.0499999 0.0387259 0.0295753 0.0499999 0.0387259 0.0295753 0.0499999 0.0387259 0.0295753 0.0499999 0.0433012 0.025 0.025 0.0433012 0.025 0.025 0.0433012 0.025 0.025 0.0433012 0.025 0.025 0.0433012 0.025 0.025 0.0433012 0.025 0.025 0.0449759 0.01875 -0.0499999 0.0449759 0.01875 -0.0499999 0.0449759 0.01875 -0.0499999 0.0449759 0.01875 -0.0499999 0.0449759 0.01875 -0.0499999 0.0449759 0.01875 -0.0499999 0.0483253 0.00624996 0.0499999 0.0483253 0.00624996 0.0499999 0.0483253 0.00624996 0.0499999 0.0483253 0.00624996 0.0499999 0.0483253 0.00624996 0.0499999 0.0499999 0 0.025 0.0499999 0 0.025 0.0499999 0 0.025 0.0499999 0 0.025 0.0499999 0 0.025 0.0499999 0 0.025 0.0483253 -0.00624996 -0.0499999 0.0483253 -0.00624996 -0.0499999 0.0483253 -0.00624996 -0.0499999 0.0483253 -0.00624996 -0.0499999 0.0483253 -0.00624996 -0.0499999 0.0483253 -0.00624996 -0.0499999 0.0449759 -0.01875 0.0499999 0.0449759 -0.01875 0.0499999 0.0449759 -0.01875 0.0499999 0.0449759 -0.01875 0.0499999 0.0449759 -0.01875 0.0499999 0.0449759 -0.01875 0.0499999 0.0433012 -0.025 0.025 0.0433012 -0.025 0.025 0.0433012 -0.025 0.025 0.0433012 -0.025 0.025 0.0433012 -0.025 0.025 0.0433012 -0.025 0.025 0.0387259 -0.0295753 -0.0499999 0.0387259 -0.0295753 -0.0499999 0.0387259 -0.0295753 -0.0499999 0.0387259 -0.0295753 -0.0499999 0.0387259 -0.0295753 -0.0499999 0.0295753 -0.0387259 0.0499999 0.0295753 -0.0387259 0.0499999 0.0295753 -0.0387259 0.0499999 0.0295753 -0.0387259 0.0499999 0.0295753 -0.0387259 0.0499999 0.025 -0.0433012 0.025 0.025 -0.0433012 0.025 0.025 -0.0433012 0.025 0.025 -0.0433012 0.025 0.025 -0.0433012 0.025 0.025 -0.0433012 0.025 0.01875 -0.0449759 -0.0499999 0.01875 -0.0449759 -0.0499999 0.01875 -0.0449759 -0.0499999 0.01875 -0.0449759 -0.0499999 0.01875 -0.0449759 -0.0499999 0.01875 -0.0449759 -0.0499999 0.00624996 -0.0483253 0.0499999 0.00624996 -0.0483253 0.0499999 0.00624996 -0.0483253 0.0499999 0.00624996 -0.0483253 0.0499999 0.00624996 -0.0483253 0.0499999 0.00624996 -0.0483253 0.0499999 0 -0.0499999 0.025 0 -0.0499999 0.025 0 -0.0499999 0.025 0 -0.0499999 0.025 0 -0.0499999 0.025 0 -0.0499999 0.025 -0.00624996 -0.0483253 -0.0499999 -0.00624996 -0.0483253 -0.0499999 -0.00624996 -0.0483253 -0.0499999 -0.00624996 -0.0483253 -0.0499999 -0.00624996 -0.0483253 -0.0499999 -0.01875 -0.0449759 0.0499999 -0.01875 -0.0449759 0.0499999 -0.01875 -0.0449759 0.0499999 -0.01875 -0.0449759 0.0499999 -0.01875 -0.0449759 0.0499999 -0.01875 -0.0449759 0.0499999 -0.025 -0.0433012 0.025 -0.025 -0.0433012 0.025 -0.025 -0.0433012 0.025 -0.025 -0.0433012 0.025 -0.025 -0.0433012 0.025 -0.025 -0.0433012 0.025 -0.0295753 -0.0387259 -0.0499999 -0.0295753 -0.0387259 -0.0499999 -0.0295753 -0.0387259 -0.0499999 -0.0295753 -0.0387259 -0.0499999 -0.0295753 -0.0387259 -0.0499999 -0.0295753 -0.0387259 -0.0499999 -0.0387259 -0.0295753 0.0499999 -0.0387259 -0.0295753 0.0499999 -0.0387259 -0.0295753 0.0499999 -0.0387259 -0.0295753 0.0499999 -0.0387259 -0.0295753 0.0499999 -0.0387259 -0.0295753 0.0499999 -0.0433012 -0.025 0.025 -0.0433012 -0.025 0.025 -0.0433012 -0.025 0.025 -0.0433012 -0.025 0.025 -0.0433012 -0.025 0.025 -0.0433012 -0.025 0.025 -0.0449759 -0.01875 -0.0499999 -0.0449759 -0.01875 -0.0499999 -0.0449759 -0.01875 -0.0499999 -0.0449759 -0.01875 -0.0499999 -0.0449759 -0.01875 -0.0499999 -0.0483253 -0.00624996 0.0499999 -0.0483253 -0.00624996 0.0499999 -0.0483253 -0.00624996 0.0499999 -0.0483253 -0.00624996 0.0499999 -0.0483253 -0.00624996 0.0499999 -0.0483253 -0.00624996 0.0499999 -0.0499999 0 0.025 -0.0499999 0 0.025 -0.0499999 0 0.025 -0.0499999 0 0.025 -0.0499999 0 0.025 -0.0499999 0 0.025 -0.0483253 0.00624996 -0.0499999 -0.0483253 0.00624996 -0.0499999 -0.0483253 0.00624996 -0.0499999 -0.0483253 0.00624996 -0.0499999 -0.0483253 0.00624996 -0.0499999 -0.0449759 0.01875 0.0499999 -0.0449759 0.01875 0.0499999 -0.0449759 0.01875 0.0499999 -0.0449759 0.01875 0.0499999 -0.0449759 0.01875 0.0499999 -0.0449759 0.01875 0.0499999 -0.0433013 0.025 0.025 -0.0433013 0.025 0.025 -0.0433013 0.025 0.025 -0.0433013 0.025 0.025 -0.0433013 0.025 0.025 -0.0433013 0.025 0.025 -0.038726 0.0295753 -0.0499999 -0.038726 0.0295753 -0.0499999 -0.038726 0.0295753 -0.0499999 -0.038726 0.0295753 -0.0499999 -0.038726 0.0295753 -0.0499999 -0.0295753 0.0387259 0.0499999 -0.0295753 0.0387259 0.0499999 -0.0295753 0.0387259 0.0499999 -0.0295753 0.0387259 0.0499999 -0.0295753 0.0387259 0.0499999 -0.025 0.0433012 0.025 -0.025 0.0433012 0.025 -0.025 0.0433012 0.025 -0.025 0.0433012 0.025 -0.025 0.0433012 0.025 -0.025 0.0433012 0.025 -0.01875 0.0449759 -0.0499999 -0.01875 0.0449759 -0.0499999 -0.01875 0.0449759 -0.0499999 -0.01875 0.0449759 -0.0499999 -0.01875 0.0449759 -0.0499999 -0.01875 0.0449759 -0.0499999 -0.00624996 0.0483253 0.0499999 -0.00624996 0.0483253 0.0499999 -0.00624996 0.0483253 0.0499999 -0.00624996 0.0483253 0.0499999 -0.00624996 0.0483253 0.0499999 0.01875 0.0449759 0 0.01875 0.0449759 0 0.01875 0.0449759 0 0.01875 0.0449759 0 0.01875 0.0449759 0 0.01875 0.0449759 0 0.00624996 0.0483253 0 0.00624996 0.0483253 0 0.00624996 0.0483253 0 0.00624996 0.0483253 0 0.00624996 0.0483253 0 0.00624996 0.0483253 0 0.0125 0.0466506 -0.025 0.0125 0.0466506 -0.025 0.0125 0.0466506 -0.025 0.0125 0.0466506 -0.025 0.0125 0.0466506 -0.025 0.0125 0.0466506 -0.025 0.0125 0.0466506 0.025 0.0125 0.0466506 0.025 0.0125 0.0466506 0.025 0.0125 0.0466506 0.025 0.0125 0.0466506 0.025 0.0125 0.0466506 0.025 0.0387259 0.0295753 0 0.0387259 0.0295753 0 0.0387259 0.0295753 0 0.0387259 0.0295753 0 0.0387259 0.0295753 0 0.0387259 0.0295753 0 0.0295753 0.0387259 0 0.0295753 0.0387259 0 0.0295753 0.0387259 0 0.0295753 0.0387259 0 0.0295753 0.0387259 0 0.0295753 0.0387259 0 0.0341506 0.0341506 -0.025 0.0341506 0.0341506 -0.025 0.0341506 0.0341506 -0.025 0.0341506 0.0341506 -0.025 0.0341506 0.0341506 -0.025 0.0341506 0.0341506 -0.025 0.0341506 0.0341506 0.025 0.0341506 0.0341506 0.025 0.0341506 0.0341506 0.025 0.0341506 0.0341506 0.025 0.0341506 0.0341506 0.025 0.0341506 0.0341506 0.025 0.0483253 0.00624996 0 0.0483253 0.00624996 0 0.0483253 0.00624996 0 0.0483253 0.00624996 0 0.0483253 0.00624996 0 0.0483253 0.00624996 0 0.0449759 0.01875 0 0.0449759 0.01875 0 0.0449759 0.01875 0 0.0449759 0.01875 0 0.0449759 0.01875 0 0.0449759 0.01875 0 0.0466506 0.0125 -0.025 0.0466506 0.0125 -0.025 0.0466506 0.0125 -0.025 0.0466506 0.0125 -0.025 0.0466506 0.0125 -0.025 0.0466506 0.0125 -0.025 0.0466506 0.0125 0.025 0.0466506 0.0125 0.025 0.0466506 0.0125 0.025 0.0466506 0.0125 0.025 0.0466506 0.0125 0.025 0.0466506 0.0125 0.025 0.0449759 -0.01875 0 0.0449759 -0.01875 0 0.0449759 -0.01875 0 0.0449759 -0.01875 0 0.0449759 -0.01875 0 0.0449759 -0.01875 0 0.0483253 -0.00624996 0 0.0483253 -0.00624996 0 0.0483253 -0.00624996 0 0.0483253 -0.00624996 0 0.0483253 -0.00624996 0 0.0483253 -0.00624996 0 0.0466506 -0.0125 -0.025 0.0466506 -0.0125 -0.025 0.0466506 -0.0125 -0.025 0.0466506 -0.0125 -0.025 0.0466506 -0.0125 -0.025 0.0466506 -0.0125 -0.025 0.0466506 -0.0125 0.025 0.0466506 -0.0125 0.025 0.0466506 -0.0125 0.025 0.0466506 -0.0125 0.025 0.0466506 -0.0125 0.025 0.0466506 -0.0125 0.025 0.0295753 -0.0387259 0 0.0295753 -0.0387259 0 0.0295753 -0.0387259 0 0.0295753 -0.0387259 0 0.0295753 -0.0387259 0 0.0295753 -0.0387259 0 0.0387259 -0.0295753 0 0.0387259 -0.0295753 0 0.0387259 -0.0295753 0 0.0387259 -0.0295753 0 0.0387259 -0.0295753 0 0.0387259 -0.0295753 0 0.0341506 -0.0341506 -0.025 0.0341506 -0.0341506 -0.025 0.0341506 -0.0341506 -0.025 0.0341506 -0.0341506 -0.025 0.0341506 -0.0341506 -0.025 0.0341506 -0.0341506 -0.025 0.0341506 -0.0341506 0.025 0.0341506 -0.0341506 0.025 0.0341506 -0.0341506 0.025 0.0341506 -0.0341506 0.025 0.0341506 -0.0341506 0.025 0.0341506 -0.0341506 0.025 0.00624996 -0.0483253 0 0.00624996 -0.0483253 0 0.00624996 -0.0483253 0 0.00624996 -0.0483253 0 0.00624996 -0.0483253 0 0.00624996 -0.0483253 0 0.01875 -0.0449759 0 0.01875 -0.0449759 0 0.01875 -0.0449759 0 0.01875 -0.0449759 0 0.01875 -0.0449759 0 0.01875 -0.0449759 0 0.0125 -0.0466506 -0.025 0.0125 -0.0466506 -0.025 0.0125 -0.0466506 -0.025 0.0125 -0.0466506 -0.025 0.0125 -0.0466506 -0.025 0.0125 -0.0466506 -0.025 0.0125 -0.0466506 0.025 0.0125 -0.0466506 0.025 0.0125 -0.0466506 0.025 0.0125 -0.0466506 0.025 0.0125 -0.0466506 0.025 0.0125 -0.0466506 0.025 -0.01875 -0.0449759 0 -0.01875 -0.0449759 0 -0.01875 -0.0449759 0 -0.01875 -0.0449759 0 -0.01875 -0.0449759 0 -0.01875 -0.0449759 0 -0.00624996 -0.0483253 0 -0.00624996 -0.0483253 0 -0.00624996 -0.0483253 0 -0.00624996 -0.0483253 0 -0.00624996 -0.0483253 0 -0.00624996 -0.0483253 0 -0.0125 -0.0466506 -0.025 -0.0125 -0.0466506 -0.025 -0.0125 -0.0466506 -0.025 -0.0125 -0.0466506 -0.025 -0.0125 -0.0466506 -0.025 -0.0125 -0.0466506 -0.025 -0.0125 -0.0466506 0.025 -0.0125 -0.0466506 0.025 -0.0125 -0.0466506 0.025 -0.0125 -0.0466506 0.025 -0.0125 -0.0466506 0.025 -0.0125 -0.0466506 0.025 -0.0387259 -0.0295753 0 -0.0387259 -0.0295753 0 -0.0387259 -0.0295753 0 -0.0387259 -0.0295753 0 -0.0387259 -0.0295753 0 -0.0387259 -0.0295753 0 -0.0295753 -0.0387259 0 -0.0295753 -0.0387259 0 -0.0295753 -0.0387259 0 -0.0295753 -0.0387259 0 -0.0295753 -0.0387259 0 -0.0295753 -0.0387259 0 -0.0341506 -0.0341506 -0.025 -0.0341506 -0.0341506 -0.025 -0.0341506 -0.0341506 -0.025 -0.0341506 -0.0341506 -0.025 -0.0341506 -0.0341506 -0.025 -0.0341506 -0.0341506 -0.025 -0.0341506 -0.0341506 0.025 -0.0341506 -0.0341506 0.025 -0.0341506 -0.0341506 0.025 -0.0341506 -0.0341506 0.025 -0.0341506 -0.0341506 0.025 -0.0341506 -0.0341506 0.025 -0.0483253 -0.00624996 0 -0.0483253 -0.00624996 0 -0.0483253 -0.00624996 0 -0.0483253 -0.00624996 0 -0.0483253 -0.00624996 0 -0.0483253 -0.00624996 0 -0.0449759 -0.01875 0 -0.0449759 -0.01875 0 -0.0449759 -0.01875 0 -0.0449759 -0.01875 0 -0.0449759 -0.01875 0 -0.0449759 -0.01875 0 -0.0466506 -0.0125 -0.025 -0.0466506 -0.0125 -0.025 -0.0466506 -0.0125 -0.025 -0.0466506 -0.0125 -0.025 -0.0466506 -0.0125 -0.025 -0.0466506 -0.0125 -0.025 -0.0466506 -0.0125 0.025 -0.0466506 -0.0125 0.025 -0.0466506 -0.0125 0.025 -0.0466506 -0.0125 0.025 -0.0466506 -0.0125 0.025 -0.0466506 -0.0125 0.025 -0.0449759 0.01875 0 -0.0449759 0.01875 0 -0.0449759 0.01875 0 -0.0449759 0.01875 0 -0.0449759 0.01875 0 -0.0449759 0.01875 0 -0.0483253 0.00624996 0 -0.0483253 0.00624996 0 -0.0483253 0.00624996 0 -0.0483253 0.00624996 0 -0.0483253 0.00624996 0 -0.0483253 0.00624996 0 -0.0466506 0.0124999 -0.025 -0.0466506 0.0124999 -0.025 -0.0466506 0.0124999 -0.025 -0.0466506 0.0124999 -0.025 -0.0466506 0.0124999 -0.025 -0.0466506 0.0124999 -0.025 -0.0466506 0.0124999 0.025 -0.0466506 0.0124999 0.025 -0.0466506 0.0124999 0.025 -0.0466506 0.0124999 0.025 -0.0466506 0.0124999 0.025 -0.0466506 0.0124999 0.025 -0.0466506 0.0124999 0.025 -0.00624996 0.0483253 0 -0.00624996 0.0483253 0 -0.00624996 0.0483253 0 -0.00624996 0.0483253 0 -0.00624996 0.0483253 0 -0.00624996 0.0483253 0 -0.01875 0.0449759 0 -0.01875 0.0449759 0 -0.01875 0.0449759 0 -0.01875 0.0449759 0 -0.01875 0.0449759 0 -0.01875 0.0449759 0 -0.0125 0.0466506 -0.025 -0.0125 0.0466506 -0.025 -0.0125 0.0466506 -0.025 -0.0125 0.0466506 -0.025 -0.0125 0.0466506 -0.025 -0.0125 0.0466506 -0.025 -0.0125 0.0466506 0.025 -0.0125 0.0466506 0.025 -0.0125 0.0466506 0.025 -0.0125 0.0466506 0.025 -0.0125 0.0466506 0.025 -0.0125 0.0466506 0.025 -0.0295753 0.0387259 0 -0.0295753 0.0387259 0 -0.0295753 0.0387259 0 -0.0295753 0.0387259 0 -0.0295753 0.0387259 0 -0.0295753 0.0387259 0 -0.038726 0.0295753 0 -0.038726 0.0295753 0 -0.038726 0.0295753 0 -0.038726 0.0295753 0 -0.038726 0.0295753 0 -0.038726 0.0295753 0 -0.0341507 0.0341506 -0.025 -0.0341507 0.0341506 -0.025 -0.0341507 0.0341506 -0.025 -0.0341507 0.0341506 -0.025 -0.0341507 0.0341506 -0.025 -0.0341507 0.0341506 -0.025 -0.0341507 0.0341506 0.025 -0.0341507 0.0341506 0.025 -0.0341507 0.0341506 0.025 -0.0341507 0.0341506 0.025 -0.0341507 0.0341506 0.025 -0.0341507 0.0341506 0.025 0.01875 0.0449759 0.025 0.01875 0.0449759 0.025 0.01875 0.0449759 0.025 0.01875 0.0449759 0.025 0.01875 0.0449759 0.025 0.01875 0.0449759 0.025 0.0387259 0.0295753 0.025 0.0387259 0.0295753 0.025 0.0387259 0.0295753 0.025 0.0387259 0.0295753 0.025 0.0387259 0.0295753 0.025 0.0387259 0.0295753 0.025 0.0483253 0.00624996 0.025 0.0483253 0.00624996 0.025 0.0483253 0.00624996 0.025 0.0483253 0.00624996 0.025 0.0483253 0.00624996 0.025 0.0483253 0.00624996 0.025 0.0449759 -0.01875 0.025 0.0449759 -0.01875 0.025 0.0449759 -0.01875 0.025 0.0449759 -0.01875 0.025 0.0449759 -0.01875 0.025 0.0449759 -0.01875 0.025 0.0295753 -0.0387259 0.025 0.0295753 -0.0387259 0.025 0.0295753 -0.0387259 0.025 0.0295753 -0.0387259 0.025 0.0295753 -0.0387259 0.025 0.0295753 -0.0387259 0.025 0.00624996 -0.0483253 0.025 0.00624996 -0.0483253 0.025 0.00624996 -0.0483253 0.025 0.00624996 -0.0483253 0.025 0.00624996 -0.0483253 0.025 0.00624996 -0.0483253 0.025 -0.01875 -0.0449759 0.025 -0.01875 -0.0449759 0.025 -0.01875 -0.0449759 0.025 -0.01875 -0.0449759 0.025 -0.01875 -0.0449759 0.025 -0.01875 -0.0449759 0.025 -0.0387259 -0.0295753 0.025 -0.0387259 -0.0295753 0.025 -0.0387259 -0.0295753 0.025 -0.0387259 -0.0295753 0.025 -0.0387259 -0.0295753 0.025 -0.0387259 -0.0295753 0.025 -0.0483253 -0.00624996 0.025 -0.0483253 -0.00624996 0.025 -0.0483253 -0.00624996 0.025 -0.0483253 -0.00624996 0.025 -0.0483253 -0.00624996 0.025 -0.0483253 -0.00624996 0.025 -0.0449759 0.01875 0.025 -0.0449759 0.01875 0.025 -0.0449759 0.01875 0.025 -0.0449759 0.01875 0.025 -0.0449759 0.01875 0.025 -0.0449759 0.01875 0.025 -0.00624996 0.0483253 0.025 -0.00624996 0.0483253 0.025 -0.00624996 0.0483253 0.025 -0.00624996 0.0483253 0.025 -0.00624996 0.0483253 0.025 -0.00624996 0.0483253 0.025 -0.0295753 0.0387259 0.025 -0.0295753 0.0387259 0.025 -0.0295753 0.0387259 0.025 -0.0295753 0.0387259 0.025 -0.0295753 0.0387259 0.025 -0.0295753 0.0387259 0.025 0.01875 0.0449759 -0.025 0.01875 0.0449759 -0.025 0.01875 0.0449759 -0.025 0.01875 0.0449759 -0.025 0.01875 0.0449759 -0.025 0.01875 0.0449759 -0.025 0.00624996 0.0483253 -0.025 0.00624996 0.0483253 -0.025 0.00624996 0.0483253 -0.025 0.00624996 0.0483253 -0.025 0.00624996 0.0483253 -0.025 0.00624996 0.0483253 -0.025 0.00624996 0.0483253 0.025 0.00624996 0.0483253 0.025 0.00624996 0.0483253 0.025 0.00624996 0.0483253 0.025 0.00624996 0.0483253 0.025 0.00624996 0.0483253 0.025 0.0387259 0.0295753 -0.025 0.0387259 0.0295753 -0.025 0.0387259 0.0295753 -0.025 0.0387259 0.0295753 -0.025 0.0387259 0.0295753 -0.025 0.0387259 0.0295753 -0.025 0.0295753 0.0387259 -0.025 0.0295753 0.0387259 -0.025 0.0295753 0.0387259 -0.025 0.0295753 0.0387259 -0.025 0.0295753 0.0387259 -0.025 0.0295753 0.0387259 -0.025 0.0295753 0.0387259 0.025 0.0295753 0.0387259 0.025 0.0295753 0.0387259 0.025 0.0295753 0.0387259 0.025 0.0295753 0.0387259 0.025 0.0295753 0.0387259 0.025 0.0483253 0.00624996 -0.025 0.0483253 0.00624996 -0.025 0.0483253 0.00624996 -0.025 0.0483253 0.00624996 -0.025 0.0483253 0.00624996 -0.025 0.0483253 0.00624996 -0.025 0.0449759 0.01875 -0.025 0.0449759 0.01875 -0.025 0.0449759 0.01875 -0.025 0.0449759 0.01875 -0.025 0.0449759 0.01875 -0.025 0.0449759 0.01875 -0.025 0.0449759 0.01875 0.025 0.0449759 0.01875 0.025 0.0449759 0.01875 0.025 0.0449759 0.01875 0.025 0.0449759 0.01875 0.025 0.0449759 0.01875 0.025 0.0449759 -0.01875 -0.025 0.0449759 -0.01875 -0.025 0.0449759 -0.01875 -0.025 0.0449759 -0.01875 -0.025 0.0449759 -0.01875 -0.025 0.0449759 -0.01875 -0.025 0.0483253 -0.00624996 -0.025 0.0483253 -0.00624996 -0.025 0.0483253 -0.00624996 -0.025 0.0483253 -0.00624996 -0.025 0.0483253 -0.00624996 -0.025 0.0483253 -0.00624996 -0.025 0.0483253 -0.00624996 0.025 0.0483253 -0.00624996 0.025 0.0483253 -0.00624996 0.025 0.0483253 -0.00624996 0.025 0.0483253 -0.00624996 0.025 0.0483253 -0.00624996 0.025 0.0295753 -0.0387259 -0.025 0.0295753 -0.0387259 -0.025 0.0295753 -0.0387259 -0.025 0.0295753 -0.0387259 -0.025 0.0295753 -0.0387259 -0.025 0.0295753 -0.0387259 -0.025 0.0387259 -0.0295753 -0.025 0.0387259 -0.0295753 -0.025 0.0387259 -0.0295753 -0.025 0.0387259 -0.0295753 -0.025 0.0387259 -0.0295753 -0.025 0.0387259 -0.0295753 -0.025 0.0387259 -0.0295753 0.025 0.0387259 -0.0295753 0.025 0.0387259 -0.0295753 0.025 0.0387259 -0.0295753 0.025 0.0387259 -0.0295753 0.025 0.0387259 -0.0295753 0.025 0.00624996 -0.0483253 -0.025 0.00624996 -0.0483253 -0.025 0.00624996 -0.0483253 -0.025 0.00624996 -0.0483253 -0.025 0.00624996 -0.0483253 -0.025 0.00624996 -0.0483253 -0.025 0.01875 -0.0449759 -0.025 0.01875 -0.0449759 -0.025 0.01875 -0.0449759 -0.025 0.01875 -0.0449759 -0.025 0.01875 -0.0449759 -0.025 0.01875 -0.0449759 -0.025 0.01875 -0.0449759 0.025 0.01875 -0.0449759 0.025 0.01875 -0.0449759 0.025 0.01875 -0.0449759 0.025 0.01875 -0.0449759 0.025 0.01875 -0.0449759 0.025 -0.01875 -0.0449759 -0.025 -0.01875 -0.0449759 -0.025 -0.01875 -0.0449759 -0.025 -0.01875 -0.0449759 -0.025 -0.01875 -0.0449759 -0.025 -0.01875 -0.0449759 -0.025 -0.00624996 -0.0483253 -0.025 -0.00624996 -0.0483253 -0.025 -0.00624996 -0.0483253 -0.025 -0.00624996 -0.0483253 -0.025 -0.00624996 -0.0483253 -0.025 -0.00624996 -0.0483253 -0.025 -0.00624996 -0.0483253 0.025 -0.00624996 -0.0483253 0.025 -0.00624996 -0.0483253 0.025 -0.00624996 -0.0483253 0.025 -0.00624996 -0.0483253 0.025 -0.00624996 -0.0483253 0.025 -0.0387259 -0.0295753 -0.025 -0.0387259 -0.0295753 -0.025 -0.0387259 -0.0295753 -0.025 -0.0387259 -0.0295753 -0.025 -0.0387259 -0.0295753 -0.025 -0.0387259 -0.0295753 -0.025 -0.0295753 -0.0387259 -0.025 -0.0295753 -0.0387259 -0.025 -0.0295753 -0.0387259 -0.025 -0.0295753 -0.0387259 -0.025 -0.0295753 -0.0387259 -0.025 -0.0295753 -0.0387259 -0.025 -0.0295753 -0.0387259 0.025 -0.0295753 -0.0387259 0.025 -0.0295753 -0.0387259 0.025 -0.0295753 -0.0387259 0.025 -0.0295753 -0.0387259 0.025 -0.0295753 -0.0387259 0.025 -0.0483253 -0.00624996 -0.025 -0.0483253 -0.00624996 -0.025 -0.0483253 -0.00624996 -0.025 -0.0483253 -0.00624996 -0.025 -0.0483253 -0.00624996 -0.025 -0.0483253 -0.00624996 -0.025 -0.0449759 -0.01875 -0.025 -0.0449759 -0.01875 -0.025 -0.0449759 -0.01875 -0.025 -0.0449759 -0.01875 -0.025 -0.0449759 -0.01875 -0.025 -0.0449759 -0.01875 -0.025 -0.0449759 -0.01875 0.025 -0.0449759 -0.01875 0.025 -0.0449759 -0.01875 0.025 -0.0449759 -0.01875 0.025 -0.0449759 -0.01875 0.025 -0.0449759 -0.01875 0.025 -0.0449759 0.01875 -0.025 -0.0449759 0.01875 -0.025 -0.0449759 0.01875 -0.025 -0.0449759 0.01875 -0.025 -0.0449759 0.01875 -0.025 -0.0449759 0.01875 -0.025 -0.0483253 0.00624996 -0.025 -0.0483253 0.00624996 -0.025 -0.0483253 0.00624996 -0.025 -0.0483253 0.00624996 -0.025 -0.0483253 0.00624996 -0.025 -0.0483253 0.00624996 -0.025 -0.0483253 0.00624996 0.025 -0.0483253 0.00624996 0.025 -0.0483253 0.00624996 0.025 -0.0483253 0.00624996 0.025 -0.0483253 0.00624996 0.025 -0.00624996 0.0483253 -0.025 -0.00624996 0.0483253 -0.025 -0.00624996 0.0483253 -0.025 -0.00624996 0.0483253 -0.025 -0.00624996 0.0483253 -0.025 -0.00624996 0.0483253 -0.025 -0.01875 0.0449759 -0.025 -0.01875 0.0449759 -0.025 -0.01875 0.0449759 -0.025 -0.01875 0.0449759 -0.025 -0.01875 0.0449759 -0.025 -0.01875 0.0449759 -0.025 -0.01875 0.0449759 0.025 -0.01875 0.0449759 0.025 -0.01875 0.0449759 0.025 -0.01875 0.0449759 0.025 -0.01875 0.0449759 0.025 -0.01875 0.0449759 0.025 -0.0295753 0.0387259 -0.025 -0.0295753 0.0387259 -0.025 -0.0295753 0.0387259 -0.025 -0.0295753 0.0387259 -0.025 -0.0295753 0.0387259 -0.025 -0.0295753 0.0387259 -0.025 -0.038726 0.0295753 -0.025 -0.038726 0.0295753 -0.025 -0.038726 0.0295753 -0.025 -0.038726 0.0295753 -0.025 -0.038726 0.0295753 -0.025 -0.038726 0.0295753 -0.025 -0.038726 0.0295753 0.025 -0.038726 0.0295753 0.025 -0.038726 0.0295753 0.025 -0.038726 0.0295753 0.025 -0.038726 0.0295753 0.025 -0.038726 0.0295753 0.025 } Indices FALSE Binding BIND_PER_VERTEX Normalize 0 } NormalData { Array TRUE ArrayID 2 Vec3fArray 1428 { 0.258819 0.965926 0 0 0 -1 0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 0.258819 0.965926 0 0 0 1 -0.258819 0.965926 0 0.707107 0.707107 0 0 0 -1 0.258819 0.965926 0 0.707107 0.707107 0 0.258819 0.965926 0 0.707107 0.707107 0 0.258819 0.965926 0 0 0 1 0.965926 0.258819 0 0 0 -1 0.707107 0.707107 0 0.965926 0.258819 0 0.707107 0.707107 0 0.965926 0.258819 0 0.707107 0.707107 0 0 0 1 0.965926 -0.258819 0 0 0 -1 0.965926 0.258819 0 0.965926 -0.258819 0 0.965926 0.258819 0 0.965926 -0.258819 0 0.965926 0.258819 0 0 0 1 0.707107 -0.707107 0 0 0 -1 0.965926 -0.258819 0 0.707107 -0.707107 0 0.965926 -0.258819 0 0.707107 -0.707107 0 0.965926 -0.258819 0 0 0 1 0.258819 -0.965926 0 0 0 -1 0.707107 -0.707107 0 0.258819 -0.965926 0 0.707107 -0.707107 0 0.258819 -0.965926 0 0.707107 -0.707107 0 0 0 1 -0.258819 -0.965926 0 0 0 -1 0.258819 -0.965926 0 -0.258819 -0.965926 0 0.258819 -0.965926 0 -0.258819 -0.965926 0 0.258819 -0.965926 0 0 0 1 -0.707107 -0.707107 0 0 0 -1 -0.258819 -0.965926 0 -0.707107 -0.707107 0 -0.258819 -0.965926 0 -0.707107 -0.707107 0 -0.258819 -0.965926 0 0 0 1 -0.965926 -0.25882 0 0 0 -1 -0.707106 -0.707107 0 -0.965926 -0.25882 0 -0.707106 -0.707107 0 -0.965926 -0.25882 0 -0.707106 -0.707107 0 0 0 1 -0.965926 0.258819 0 0 0 -1 -0.965926 -0.25882 0 -0.965926 0.258819 0 -0.965926 -0.25882 0 -0.965926 0.258819 0 -0.965926 -0.25882 0 0 0 1 -0.707107 0.707106 0 0 0 -1 -0.965926 0.258819 0 -0.707107 0.707106 0 -0.965926 0.258819 0 -0.707107 0.707106 0 -0.965926 0.258819 0 0 0 1 -0.258819 0.965926 0 0 0 -1 -0.258819 0.965926 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.258819 0.965926 0 0 0 1 -0.707107 0.707106 0 0.258819 0.965926 0 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0 0 1 0 0 1 0 0 1 0 0 1 0.258819 0.965926 0 -0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.707107 0.707107 0 0.707107 0.707107 0 0.258819 0.965926 0 0.258819 0.965926 0 0.707107 0.707107 0 0.707107 0.707107 0 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0.707107 0.707107 0 0.707106 0.707107 0 0.707106 0.707107 0 0.707107 0.707107 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0.707106 0.707107 0 0.707107 0.707107 0 0.965926 0.258819 0 0.965926 0.258819 0 0.707107 0.707107 0 0.707107 0.707107 0 0.965926 0.258819 0 0.965926 0.258819 0 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 -0.258819 0 0 0 -1 0.965926 -0.258819 0 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0.965926 -0.258819 0 0.965926 -0.258819 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0.707107 -0.707107 0 0.707107 -0.707107 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0.258819 -0.965926 0 0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 -0.258819 -0.965926 0 -0.258819 -0.965926 0 0 0 1 -0.258819 -0.965926 0 -0.258819 -0.965926 0 0 0 1 0 0 1 0 0 1 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.707107 -0.707107 0 -0.707107 -0.707107 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.707107 -0.707107 0 0 0 -1 -0.707107 -0.707107 0 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 -0.707107 -0.707107 0 -0.707106 -0.707107 0 0 0 1 -0.707106 -0.707107 0 -0.707107 -0.707107 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 -0.707106 -0.707107 0 -0.707106 -0.707107 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.707106 -0.707107 0 -0.707106 -0.707107 0 -0.965926 -0.25882 0 -0.965926 -0.258819 0 0 0 -1 0 0 -1 0 0 -1 0 0 -1 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 -0.25882 0 -0.965926 -0.258819 0 0 0 1 0 0 1 0 0 1 0 0 1 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 0.258819 0 0 0 -1 -0.965926 0.258819 0 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 -0.965926 0.258819 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.707107 0.707106 0 -0.707107 0.707106 0 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.258819 0.965926 0 -0.25882 0.965926 0 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 -0.25882 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.25882 0.965926 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 -0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.707106 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707106 0.707107 0 0.707107 0.707107 0 0.707106 0.707107 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.258819 0.965926 0 -0.25882 0.965926 0 -0.25882 0.965926 0 -0.258819 0.965926 0 -0.25882 0.965926 0 -0.258819 0.965926 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 0.258819 0.965926 0 0 0 -1 0 0 -1 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0 0 1 0 0 1 0 0 1 0.258819 0.965926 0 -0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.707107 0.707107 0 0.707107 0.707107 0 0.258819 0.965926 0 0.258819 0.965926 0 0.707107 0.707107 0 0.707107 0.707107 0 0 0 -1 0 0 -1 0.707107 0.707107 0 0.707107 0.707107 0 0.707106 0.707107 0 0.707107 0.707107 0 0 0 1 0 0 1 0 0 1 0.707107 0.707107 0 0.707107 0.707107 0 0.965926 0.258819 0 0.965926 0.258819 0 0.707107 0.707107 0 0.707107 0.707107 0 0.965926 0.258819 0 0.965926 0.258819 0 0 0 -1 0 0 -1 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0 0 1 0 0 1 0 0 1 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0 0 -1 0 0 -1 0 0 -1 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0 0 1 0 0 1 0 0 1 0.965926 -0.258819 0 0.965926 -0.258819 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0 0 -1 0 0 -1 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0 0 1 0 0 1 0.707107 -0.707107 0 0.707107 -0.707107 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0 0 -1 0 0 -1 0 0 -1 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0 0 1 0 0 1 0 0 1 0.258819 -0.965926 0 0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 0 0 -1 0 0 -1 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 0 0 1 0 0 1 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.707107 -0.707107 0 -0.707107 -0.707107 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 0 0 -1 0 0 -1 0 0 -1 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 0 0 1 0 0 1 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.707106 -0.707107 0 -0.707106 -0.707107 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 0 0 -1 0 0 -1 0 0 -1 -0.965926 -0.25882 0 -0.965926 -0.258819 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 0 0 1 0 0 1 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 0.258819 0 -0.965926 0.258819 0 0 0 -1 0 0 -1 0 0 -1 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 0 0 1 0 0 1 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.707107 0.707106 0 -0.707107 0.707106 0 0 0 -1 0 0 -1 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 0 0 1 0 0 1 -0.707107 0.707106 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.258819 0.965926 0 -0.707107 0.707106 0 -0.258819 0.965926 0 0 0 -1 0 0 -1 -0.258819 0.965926 0 -0.25882 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 0 0 1 0 0 1 0 0 1 -0.258819 0.965926 0 0.258819 0.965926 0 0 0 -1 0 0 -1 0 0 -1 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0 0 1 0 0 1 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 0.258819 0.965926 0 -0.258819 0.965926 0 0.258819 0.965926 0 0.707107 0.707107 0 0.707107 0.707107 0 0.258819 0.965926 0 0.258819 0.965926 0 0.707107 0.707107 0 0.707106 0.707107 0 0 0 -1 0 0 -1 0 0 -1 0.707106 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0 0 1 0 0 1 0.707107 0.707107 0 0.707107 0.707107 0 0.965926 0.258819 0 0.965926 0.258819 0 0.707107 0.707107 0 0.707107 0.707107 0 0.965926 0.258819 0 0.965926 0.258819 0 0 0 -1 0 0 -1 0 0 -1 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0 0 1 0 0 1 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0 0 -1 0 0 -1 0 0 -1 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0 0 1 0 0 1 0 0 1 0.965926 -0.258819 0 0.965926 -0.258819 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0 0 -1 0 0 -1 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0 0 1 0 0 1 0.707107 -0.707107 0 0.707107 -0.707107 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0 0 -1 0 0 -1 0 0 -1 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0 0 1 0 0 1 0 0 1 0.258819 -0.965926 0 0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 0 0 -1 0 0 -1 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 0 0 1 -0.258819 -0.965926 0 0 0 1 0 0 1 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.707107 -0.707107 0 -0.707107 -0.707107 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 0 0 -1 0 0 -1 0 0 -1 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 0 0 1 0 0 1 0 0 1 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.707106 -0.707107 0 -0.707106 -0.707107 0 -0.965926 -0.25882 0 -0.965926 -0.258819 0 0 0 -1 0 0 -1 -0.965926 -0.258819 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 -0.258819 0 0 0 1 0 0 1 0 0 1 -0.965926 -0.258819 0 -0.965926 -0.25882 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 0.258819 0 -0.965926 0.258819 0 0 0 -1 0 0 -1 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 0 0 1 0 0 1 0 0 1 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.707107 0.707106 0 -0.707107 0.707106 0 0 0 -1 0 0 -1 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 0 0 1 0 0 1 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.258819 0.965926 0 -0.258819 0.965926 0 0 0 -1 0 0 -1 0 0 -1 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.25882 0.965926 0 0 0 1 0 0 1 -0.25882 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707106 0.707107 0 0.707107 0.707107 0 0.707106 0.707107 0 0.707107 0.707107 0 0.707106 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707106 0.707107 0 0.707106 0.707107 0 0.707107 0.707107 0 0.707106 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707106 0.707107 0 0.707106 0.707107 0 0.707107 0.707107 0 0.707106 0.707107 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.707106 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707107 -0.707107 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 -0.258819 0 -0.965926 -0.25882 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 -0.258819 0 -0.965926 -0.25882 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.25882 0.965926 0 -0.258819 0.965926 0 -0.25882 0.965926 0 -0.25882 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.25882 0.965926 0 -0.25882 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.25882 0.965926 0 -0.258819 0.965926 0 -0.25882 0.965926 0 -0.25882 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.25882 0.965926 0 -0.258819 0.965926 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.707106 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707107 -0.707107 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 -0.258819 0 -0.965926 -0.25882 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.25882 0.965926 0 -0.258819 0.965926 0 -0.25882 0.965926 0 -0.25882 0.965926 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707106 0.707107 0 0.707106 0.707107 0 0.707107 0.707107 0 0.707106 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707106 0.707107 0 0.707106 0.707107 0 0.707107 0.707107 0 0.707106 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.707106 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707107 -0.707107 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 -0.258819 0 -0.965926 -0.25882 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 -0.25882 0 -0.965926 -0.258819 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.25882 0.965926 0 -0.258819 0.965926 0 -0.25882 0.965926 0 -0.25882 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 } Indices FALSE Binding BIND_PER_VERTEX Normalize 0 } InfluenceMap 4 { VertexInfluence "Bone" 1146 { 0 0.34816 1 0.34816 2 0.34816 3 0.34816 8 0.367419 9 0.367419 10 0.367419 11 0.367419 16 0.364055 17 0.364055 18 0.364055 19 0.364055 24 0.379784 25 0.379784 26 0.379784 27 0.379784 32 0.342064 33 0.342064 34 0.342064 35 0.342064 40 0.355754 41 0.355754 42 0.355754 43 0.355754 48 0.340748 49 0.340748 50 0.340748 51 0.340748 56 0.337092 57 0.337092 58 0.337092 59 0.337092 64 0.305945 65 0.305945 66 0.305945 67 0.305945 72 0.344481 73 0.344481 74 0.344481 75 0.344481 80 0.372747 81 0.372747 82 0.372747 83 0.372747 88 0.386408 89 0.386408 90 0.386408 91 0.386408 96 0.358124 97 0.358124 98 0.358124 99 0.358124 100 0.358124 101 0.358124 102 0.358124 110 0.096263 111 0.096263 112 0.096263 113 0.096263 114 0.096263 115 0.096263 116 0.0964708 117 0.0964708 118 0.0964708 119 0.0964708 120 0.0964708 121 0.0964708 122 0.378926 123 0.378926 124 0.378926 125 0.378926 126 0.378926 127 0.378926 128 0.378926 129 0.378926 130 0.378926 131 0.378926 141 0.0968001 142 0.0968001 143 0.0968001 144 0.0968001 145 0.0968001 146 0.0968001 147 0.38288 148 0.38288 149 0.38288 150 0.38288 151 0.38288 152 0.38288 153 0.38288 162 0.0968163 163 0.0968163 164 0.0968163 165 0.0968163 166 0.0968163 167 0.0968163 168 0.380374 169 0.380374 170 0.380374 171 0.380374 172 0.380374 173 0.380374 174 0.380374 175 0.380374 176 0.380374 177 0.380374 186 0.0958862 187 0.0958862 188 0.0958862 189 0.0958862 190 0.0958862 191 0.0958862 192 0.349886 193 0.349886 194 0.349886 195 0.349886 196 0.349886 197 0.349886 198 0.349886 199 0.349886 208 0.0954361 209 0.0954361 210 0.0954361 211 0.0954361 212 0.0954361 213 0.0954361 214 0.363129 215 0.363129 216 0.363129 217 0.363129 218 0.363129 219 0.363129 220 0.363129 221 0.363129 232 0.0949529 233 0.0949529 234 0.0949529 235 0.0949529 236 0.0949529 237 0.0949529 238 0.347336 239 0.347336 240 0.347336 241 0.347336 242 0.347336 243 0.347336 244 0.347336 245 0.347336 253 0.0943446 254 0.0943446 255 0.0943446 256 0.0943446 257 0.0943446 258 0.0943446 259 0.339065 260 0.339065 261 0.339065 262 0.339065 263 0.339065 264 0.339065 265 0.339065 266 0.339065 267 0.339065 277 0.0938559 278 0.0938559 279 0.0938559 280 0.0938559 281 0.0938559 282 0.0938559 283 0.324145 284 0.324145 285 0.324145 286 0.324145 287 0.324145 288 0.324145 289 0.324145 297 0.09501 298 0.09501 299 0.09501 300 0.09501 301 0.09501 302 0.09501 303 0.378378 304 0.378378 305 0.378378 306 0.378378 307 0.378378 308 0.378378 309 0.378378 310 0.378378 311 0.378378 312 0.378378 313 0.378378 322 0.0965146 323 0.0965146 324 0.0965146 325 0.0965146 326 0.0965146 327 0.0965146 328 0.388315 329 0.388315 330 0.388315 331 0.388315 332 0.388315 333 0.388315 334 0.388315 335 0.388315 348 0.0969059 349 0.0969059 350 0.0969059 351 0.0969059 352 0.0969059 353 0.0969059 354 0.365767 355 0.365767 356 0.365767 357 0.365767 358 0.365767 359 0.365767 360 0.365767 361 0.365767 362 0.365767 371 0.0958394 372 0.0958394 373 0.0958394 374 0.0958394 375 0.0958394 376 0.0958394 377 0.0962926 378 0.0962926 379 0.0962926 380 0.0962926 381 0.0962926 382 0.0962926 383 0.0965003 384 0.0965003 385 0.0965003 386 0.0965003 387 0.0965003 388 0.0965003 389 0.0960521 390 0.0960521 391 0.0960521 392 0.0960521 393 0.0960521 394 0.0960521 395 0.0951623 396 0.0951623 397 0.0951623 398 0.0951623 399 0.0951623 400 0.0951623 401 0.0948754 402 0.0948754 403 0.0948754 404 0.0948754 405 0.0948754 406 0.0948754 407 0.0942636 408 0.0942636 409 0.0942636 410 0.0942636 411 0.0942636 412 0.0942636 413 0.0936536 414 0.0936536 415 0.0936536 416 0.0936536 417 0.0936536 418 0.0936536 419 0.0938172 420 0.0938172 421 0.0938172 422 0.0938172 423 0.0938172 424 0.0938172 425 0.0955049 426 0.0955049 427 0.0955049 428 0.0955049 429 0.0955049 430 0.0955049 431 0.096215 432 0.096215 433 0.096215 434 0.096215 435 0.096215 436 0.096215 437 0.0964742 438 0.0964742 439 0.0964742 440 0.0964742 441 0.0964742 442 0.0964742 443 0.354635 444 0.354635 445 0.354635 446 0.354635 447 0.354635 454 0.00430191 455 0.00430191 456 0.00430191 457 0.00430191 458 0.00430191 459 0.00430191 460 0.374686 461 0.374686 462 0.374686 463 0.374686 464 0.374686 465 0.374686 466 0.357486 467 0.357486 468 0.357486 469 0.357486 470 0.357486 477 0.375587 478 0.375587 479 0.375587 480 0.375587 481 0.375587 482 0.375587 483 0.373781 484 0.373781 485 0.373781 486 0.373781 487 0.373781 494 0.376868 495 0.376868 496 0.376868 497 0.376868 498 0.376868 499 0.376868 500 0.354076 501 0.354076 502 0.354076 503 0.354076 504 0.354076 505 0.354076 512 0.371253 513 0.371253 514 0.371253 515 0.371253 516 0.371253 517 0.371253 518 0.344402 519 0.344402 520 0.344402 521 0.344402 522 0.344402 528 0.371254 529 0.371254 530 0.371254 531 0.371254 532 0.371254 533 0.371254 534 0.337368 535 0.337368 536 0.337368 537 0.337368 538 0.337368 539 0.337368 546 0.368766 547 0.368766 548 0.368766 549 0.368766 550 0.368766 551 0.368766 552 0.32735 553 0.32735 554 0.32735 555 0.32735 556 0.32735 562 0.366421 563 0.366421 564 0.366421 565 0.366421 566 0.366421 567 0.366421 568 0.307046 569 0.307046 570 0.307046 571 0.307046 572 0.307046 573 0.307046 579 0.362455 580 0.362455 581 0.362455 582 0.362455 583 0.362455 584 0.362455 585 0.319194 586 0.319194 587 0.319194 588 0.319194 589 0.319194 590 0.319194 596 0.368885 597 0.368885 598 0.368885 599 0.368885 600 0.368885 601 0.368885 602 0.368849 603 0.368849 604 0.368849 605 0.368849 606 0.368849 607 0.368849 614 0.375813 615 0.375813 616 0.375813 617 0.375813 618 0.375813 619 0.375813 620 0.38096 621 0.38096 622 0.38096 623 0.38096 624 0.38096 630 0.377718 631 0.377718 632 0.377718 633 0.377718 634 0.377718 635 0.377718 636 0.359173 637 0.359173 638 0.359173 639 0.359173 640 0.359173 647 0.313242 648 0.313242 649 0.313242 650 0.313242 651 0.313242 652 0.313242 658 0.372815 659 0.372815 660 0.372815 661 0.372815 662 0.372815 663 0.372815 664 0.00514126 665 0.00514126 666 0.00514126 667 0.00514126 668 0.00514126 669 0.00514126 670 0.357776 671 0.357776 672 0.357776 673 0.357776 674 0.357776 675 0.357776 681 0.00567305 682 0.00567305 683 0.00567305 684 0.00567305 685 0.00567305 686 0.00567305 687 0.347794 688 0.347794 689 0.347794 690 0.347794 691 0.347794 692 0.347794 698 0.00545162 699 0.00545162 700 0.00545162 701 0.00545162 702 0.00545162 703 0.00545162 704 0.364472 705 0.364472 706 0.364472 707 0.364472 708 0.364472 709 0.364472 716 0.00471312 717 0.00471312 718 0.00471312 719 0.00471312 720 0.00471312 721 0.00471312 722 0.305746 723 0.305746 724 0.305746 725 0.305746 726 0.305746 732 0.00370216 733 0.00370216 734 0.00370216 735 0.00370216 736 0.00370216 737 0.00370216 738 0.343717 739 0.343717 740 0.343717 741 0.343717 742 0.343717 743 0.343717 750 0.00352383 751 0.00352383 752 0.00352383 753 0.00352383 754 0.00352383 755 0.00352383 756 0.319341 757 0.319341 758 0.319341 759 0.319341 760 0.319341 767 0.00311261 768 0.00311261 769 0.00311261 770 0.00311261 771 0.00311261 772 0.00311261 773 0.321807 774 0.321807 775 0.321807 776 0.321807 777 0.321807 778 0.321807 785 0.00276154 786 0.00276154 787 0.00276154 788 0.00276154 789 0.00276154 790 0.00276154 791 0.277267 792 0.277267 793 0.277267 794 0.277267 795 0.277267 802 0.00300527 803 0.00300527 804 0.00300527 805 0.00300527 806 0.00300527 807 0.00300527 808 0.345333 809 0.345333 810 0.345333 811 0.345333 812 0.345333 819 0.00410753 820 0.00410753 821 0.00410753 822 0.00410753 823 0.00410753 824 0.00410753 825 0.354611 826 0.354611 827 0.354611 828 0.354611 829 0.354611 835 0.00450843 836 0.00450843 837 0.00450843 838 0.00450843 839 0.00450843 840 0.00450843 841 0.371096 842 0.371096 843 0.371096 844 0.371096 845 0.371096 846 0.371096 852 0.0961208 853 0.0961208 854 0.0961208 855 0.0961208 856 0.0961208 857 0.0961208 858 0.0959629 859 0.0959629 860 0.0959629 861 0.0959629 862 0.0959629 863 0.0959629 864 0.373473 865 0.373473 866 0.373473 867 0.373473 868 0.373473 869 0.373473 870 0.00435418 871 0.00435418 872 0.00435418 873 0.00435418 874 0.00435418 875 0.00435418 876 0.0965277 877 0.0965277 878 0.0965277 879 0.0965277 880 0.0965277 881 0.0965277 882 0.0963668 883 0.0963668 884 0.0963668 885 0.0963668 886 0.0963668 887 0.0963668 888 0.376317 889 0.376317 890 0.376317 891 0.376317 892 0.376317 893 0.376317 894 0.00527549 895 0.00527549 896 0.00527549 897 0.00527549 898 0.00527549 899 0.00527549 900 0.0966689 901 0.0966689 902 0.0966689 903 0.0966689 904 0.0966689 905 0.0966689 906 0.0966253 907 0.0966253 908 0.0966253 909 0.0966253 910 0.0966253 911 0.0966253 912 0.377324 913 0.377324 914 0.377324 915 0.377324 916 0.377324 917 0.377324 918 0.00535691 919 0.00535691 920 0.00535691 921 0.00535691 922 0.00535691 923 0.00535691 924 0.0959472 925 0.0959472 926 0.0959472 927 0.0959472 928 0.0959472 929 0.0959472 930 0.0964418 931 0.0964418 932 0.0964418 933 0.0964418 934 0.0964418 935 0.0964418 936 0.375737 937 0.375737 938 0.375737 939 0.375737 940 0.375737 941 0.375737 942 0.00496679 943 0.00496679 944 0.00496679 945 0.00496679 946 0.00496679 947 0.00496679 948 0.0952691 949 0.0952691 950 0.0952691 951 0.0952691 952 0.0952691 953 0.0952691 954 0.0954447 955 0.0954447 956 0.0954447 957 0.0954447 958 0.0954447 959 0.0954447 960 0.370982 961 0.370982 962 0.370982 963 0.370982 964 0.370982 965 0.370982 966 0.00385237 967 0.00385237 968 0.00385237 969 0.00385237 970 0.00385237 971 0.00385237 972 0.0948983 973 0.0948983 974 0.0948983 975 0.0948983 976 0.0948983 977 0.0948983 978 0.095146 979 0.095146 980 0.095146 981 0.095146 982 0.095146 983 0.095146 984 0.371512 985 0.371512 986 0.371512 987 0.371512 988 0.371512 989 0.371512 990 0.00338936 991 0.00338936 992 0.00338936 993 0.00338936 994 0.00338936 995 0.00338936 996 0.0942812 997 0.0942812 998 0.0942812 999 0.0942812 1000 0.0942812 1001 0.0942812 1002 0.0945738 1003 0.0945738 1004 0.0945738 1005 0.0945738 1006 0.0945738 1007 0.0945738 1008 0.368375 1009 0.368375 1010 0.368375 1011 0.368375 1012 0.368375 1013 0.368375 1014 0.00306702 1015 0.00306702 1016 0.00306702 1017 0.00306702 1018 0.00306702 1019 0.00306702 1020 0.0936896 1021 0.0936896 1022 0.0936896 1023 0.0936896 1024 0.0936896 1025 0.0936896 1026 0.0939704 1027 0.0939704 1028 0.0939704 1029 0.0939704 1030 0.0939704 1031 0.0939704 1032 0.365541 1033 0.365541 1034 0.365541 1035 0.365541 1036 0.365541 1037 0.365541 1038 0.00270522 1039 0.00270522 1040 0.00270522 1041 0.00270522 1042 0.00270522 1043 0.00270522 1044 0.0943534 1045 0.0943534 1046 0.0943534 1047 0.0943534 1048 0.0943534 1049 0.0943534 1050 0.0937264 1051 0.0937264 1052 0.0937264 1053 0.0937264 1054 0.0937264 1055 0.0937264 1056 0.364966 1057 0.364966 1058 0.364966 1059 0.364966 1060 0.364966 1061 0.364966 1062 0.00244218 1063 0.00244218 1064 0.00244218 1065 0.00244218 1066 0.00244218 1067 0.00244218 1068 0.0960259 1069 0.0960259 1070 0.0960259 1071 0.0960259 1072 0.0960259 1073 0.0960259 1074 0.0952469 1075 0.0952469 1076 0.0952469 1077 0.0952469 1078 0.0952469 1079 0.0952469 1080 0.374353 1081 0.374353 1082 0.374353 1083 0.374353 1084 0.374353 1085 0.374353 1086 0.00335479 1087 0.00335479 1088 0.00335479 1089 0.00335479 1090 0.00335479 1091 0.00335479 1092 0.00335479 1093 0.0962022 1094 0.0962022 1095 0.0962022 1096 0.0962022 1097 0.0962022 1098 0.0962022 1099 0.096563 1100 0.096563 1101 0.096563 1102 0.096563 1103 0.096563 1104 0.096563 1105 0.37611 1106 0.37611 1107 0.37611 1108 0.37611 1109 0.37611 1110 0.37611 1111 0.0041514 1112 0.0041514 1113 0.0041514 1114 0.0041514 1115 0.0041514 1116 0.0041514 1117 0.0967142 1118 0.0967142 1119 0.0967142 1120 0.0967142 1121 0.0967142 1122 0.0967142 1123 0.0964939 1124 0.0964939 1125 0.0964939 1126 0.0964939 1127 0.0964939 1128 0.0964939 1129 0.378176 1130 0.378176 1131 0.378176 1132 0.378176 1133 0.378176 1134 0.378176 1135 0.0041101 1136 0.0041101 1137 0.0041101 1138 0.0041101 1139 0.0041101 1140 0.0041101 1141 0.00472903 1142 0.00472903 1143 0.00472903 1144 0.00472903 1145 0.00472903 1146 0.00472903 1147 0.00546944 1148 0.00546944 1149 0.00546944 1150 0.00546944 1151 0.00546944 1152 0.00546944 1153 0.00535601 1154 0.00535601 1155 0.00535601 1156 0.00535601 1157 0.00535601 1158 0.00535601 1159 0.00483459 1160 0.00483459 1161 0.00483459 1162 0.00483459 1163 0.00483459 1164 0.00483459 1165 0.00366831 1166 0.00366831 1167 0.00366831 1168 0.00366831 1169 0.00366831 1170 0.00366831 1171 0.00344825 1172 0.00344825 1173 0.00344825 1174 0.00344825 1175 0.00344825 1176 0.00344825 1177 0.00304955 1178 0.00304955 1179 0.00304955 1180 0.00304955 1181 0.00304955 1182 0.00304955 1183 0.00270885 1184 0.00270885 1185 0.00270885 1186 0.00270885 1187 0.00270885 1188 0.00270885 1189 0.00261372 1190 0.00261372 1191 0.00261372 1192 0.00261372 1193 0.00261372 1194 0.00261372 1195 0.00375396 1196 0.00375396 1197 0.00375396 1198 0.00375396 1199 0.00375396 1200 0.00375396 1201 0.00419354 1202 0.00419354 1203 0.00419354 1204 0.00419354 1205 0.00419354 1206 0.00419354 1207 0.00432968 1208 0.00432968 1209 0.00432968 1210 0.00432968 1211 0.00432968 1212 0.00432968 1213 0.374055 1214 0.374055 1215 0.374055 1216 0.374055 1217 0.374055 1218 0.374055 1219 0.372065 1220 0.372065 1221 0.372065 1222 0.372065 1223 0.372065 1224 0.372065 1225 0.00420994 1226 0.00420994 1227 0.00420994 1228 0.00420994 1229 0.00420994 1230 0.00420994 1231 0.375788 1232 0.375788 1233 0.375788 1234 0.375788 1235 0.375788 1236 0.375788 1237 0.375401 1238 0.375401 1239 0.375401 1240 0.375401 1241 0.375401 1242 0.375401 1243 0.0052079 1244 0.0052079 1245 0.0052079 1246 0.0052079 1247 0.0052079 1248 0.0052079 1249 0.377278 1250 0.377278 1251 0.377278 1252 0.377278 1253 0.377278 1254 0.377278 1255 0.375941 1256 0.375941 1257 0.375941 1258 0.375941 1259 0.375941 1260 0.375941 1261 0.00551689 1262 0.00551689 1263 0.00551689 1264 0.00551689 1265 0.00551689 1266 0.00551689 1267 0.373505 1268 0.373505 1269 0.373505 1270 0.373505 1271 0.373505 1272 0.373505 1273 0.376296 1274 0.376296 1275 0.376296 1276 0.376296 1277 0.376296 1278 0.376296 1279 0.00521576 1280 0.00521576 1281 0.00521576 1282 0.00521576 1283 0.00521576 1284 0.00521576 1285 0.371128 1286 0.371128 1287 0.371128 1288 0.371128 1289 0.371128 1290 0.371128 1291 0.369947 1292 0.369947 1293 0.369947 1294 0.369947 1295 0.369947 1296 0.369947 1297 0.00425982 1298 0.00425982 1299 0.00425982 1300 0.00425982 1301 0.00425982 1302 0.00425982 1303 0.370019 1304 0.370019 1305 0.370019 1306 0.370019 1307 0.370019 1308 0.370019 1309 0.37133 1310 0.37133 1311 0.37133 1312 0.37133 1313 0.37133 1314 0.37133 1315 0.003519 1316 0.003519 1317 0.003519 1318 0.003519 1319 0.003519 1320 0.003519 1321 0.367272 1322 0.367272 1323 0.367272 1324 0.367272 1325 0.367272 1326 0.367272 1327 0.368091 1328 0.368091 1329 0.368091 1330 0.368091 1331 0.368091 1332 0.368091 1333 0.00328618 1334 0.00328618 1335 0.00328618 1336 0.00328618 1337 0.00328618 1338 0.00328618 1339 0.36367 1340 0.36367 1341 0.36367 1342 0.36367 1343 0.36367 1344 0.36367 1345 0.365851 1346 0.365851 1347 0.365851 1348 0.365851 1349 0.365851 1350 0.365851 1351 0.00289476 1352 0.00289476 1353 0.00289476 1354 0.00289476 1355 0.00289476 1356 0.00289476 1357 0.366624 1358 0.366624 1359 0.366624 1360 0.366624 1361 0.366624 1362 0.366624 1363 0.362548 1364 0.362548 1365 0.362548 1366 0.362548 1367 0.362548 1368 0.362548 1369 0.00255603 1370 0.00255603 1371 0.00255603 1372 0.00255603 1373 0.00255603 1374 0.00255603 1375 0.375304 1376 0.375304 1377 0.375304 1378 0.375304 1379 0.375304 1380 0.375304 1381 0.37154 1382 0.37154 1383 0.37154 1384 0.37154 1385 0.37154 1386 0.37154 1387 0.00318003 1388 0.00318003 1389 0.00318003 1390 0.00318003 1391 0.00318003 1392 0.374529 1393 0.374529 1394 0.374529 1395 0.374529 1396 0.374529 1397 0.374529 1398 0.377021 1399 0.377021 1400 0.377021 1401 0.377021 1402 0.377021 1403 0.377021 1404 0.00434786 1405 0.00434786 1406 0.00434786 1407 0.00434786 1408 0.00434786 1409 0.00434786 1410 0.378212 1411 0.378212 1412 0.378212 1413 0.378212 1414 0.378212 1415 0.378212 1416 0.376587 1417 0.376587 1418 0.376587 1419 0.376587 1420 0.376587 1421 0.376587 1422 0.00412774 1423 0.00412774 1424 0.00412774 1425 0.00412774 1426 0.00412774 1427 0.00412774 } VertexInfluence "Bone_001" 1428 { 0 0.0536852 1 0.0536852 2 0.0536852 3 0.0536852 4 0.663579 5 0.663579 6 0.663579 7 0.663579 8 0.0582281 9 0.0582281 10 0.0582281 11 0.0582281 12 0.68577 13 0.68577 14 0.68577 15 0.68577 16 0.059167 17 0.059167 18 0.059167 19 0.059167 20 0.692283 21 0.692283 22 0.692283 23 0.692283 24 0.0595554 25 0.0595554 26 0.0595554 27 0.0595554 28 0.705973 29 0.705973 30 0.705973 31 0.705973 32 0.0534075 33 0.0534075 34 0.0534075 35 0.0534075 36 0.698447 37 0.698447 38 0.698447 39 0.698447 40 0.0581471 41 0.0581471 42 0.0581471 43 0.0581471 44 0.683882 45 0.683882 46 0.683882 47 0.683882 48 0.0594622 49 0.0594622 50 0.0594622 51 0.0594622 52 0.628315 53 0.628315 54 0.628315 55 0.628315 56 0.0600619 57 0.0600619 58 0.0600619 59 0.0600619 60 0.622147 61 0.622147 62 0.622147 63 0.622147 64 0.0537814 65 0.0537814 66 0.0537814 67 0.0537814 68 0.621214 69 0.621214 70 0.621214 71 0.621214 72 0.0575935 73 0.0575935 74 0.0575935 75 0.0575935 76 0.634884 77 0.634884 78 0.634884 79 0.634884 80 0.058103 81 0.058103 82 0.058103 83 0.058103 84 0.582854 85 0.582854 86 0.582854 87 0.582854 88 0.0591488 89 0.0591488 90 0.0591488 91 0.0591488 92 0.616904 93 0.616904 94 0.616904 95 0.616904 96 0.0547738 97 0.0547738 98 0.0547738 99 0.0547738 100 0.0547738 101 0.0547738 102 0.0547738 103 0.690176 104 0.690176 105 0.690176 106 0.690176 107 0.690176 108 0.690176 109 0.690176 110 0.408744 111 0.408744 112 0.408744 113 0.408744 114 0.408744 115 0.408744 116 0.410372 117 0.410372 118 0.410372 119 0.410372 120 0.410372 121 0.410372 122 0.0606667 123 0.0606667 124 0.0606667 125 0.0606667 126 0.0606667 127 0.0606667 128 0.0606667 129 0.0606667 130 0.0606667 131 0.0606667 132 0.683242 133 0.683242 134 0.683242 135 0.683242 136 0.683242 137 0.683242 138 0.683242 139 0.683242 140 0.683242 141 0.411126 142 0.411126 143 0.411126 144 0.411126 145 0.411126 146 0.411126 147 0.059725 148 0.059725 149 0.059725 150 0.059725 151 0.059725 152 0.059725 153 0.059725 154 0.699151 155 0.699151 156 0.699151 157 0.699151 158 0.699151 159 0.699151 160 0.699151 161 0.699151 162 0.411491 163 0.411491 164 0.411491 165 0.411491 166 0.411491 167 0.411491 168 0.0585465 169 0.0585465 170 0.0585465 171 0.0585465 172 0.0585465 173 0.0585465 174 0.0585465 175 0.0585465 176 0.0585465 177 0.0585465 178 0.692537 179 0.692537 180 0.692537 181 0.692537 182 0.692537 183 0.692537 184 0.692537 185 0.692537 186 0.411145 187 0.411145 188 0.411145 189 0.411145 190 0.411145 191 0.411145 192 0.0545445 193 0.0545445 194 0.0545445 195 0.0545445 196 0.0545445 197 0.0545445 198 0.0545445 199 0.0545445 200 0.704511 201 0.704511 202 0.704511 203 0.704511 204 0.704511 205 0.704511 206 0.704511 207 0.704511 208 0.410016 209 0.410016 210 0.410016 211 0.410016 212 0.410016 213 0.410016 214 0.0607347 215 0.0607347 216 0.0607347 217 0.0607347 218 0.0607347 219 0.0607347 220 0.0607347 221 0.0607347 222 0.633219 223 0.633219 224 0.633219 225 0.633219 226 0.633219 227 0.633219 228 0.633219 229 0.633219 230 0.633219 231 0.633219 232 0.407998 233 0.407998 234 0.407998 235 0.407998 236 0.407998 237 0.407998 238 0.0602369 239 0.0602369 240 0.0602369 241 0.0602369 242 0.0602369 243 0.0602369 244 0.0602369 245 0.0602369 246 0.61358 247 0.61358 248 0.61358 249 0.61358 250 0.61358 251 0.61358 252 0.61358 253 0.406953 254 0.406953 255 0.406953 256 0.406953 257 0.406953 258 0.406953 259 0.0589982 260 0.0589982 261 0.0589982 262 0.0589982 263 0.0589982 264 0.0589982 265 0.0589982 266 0.0589982 267 0.0589982 268 0.602094 269 0.602094 270 0.602094 271 0.602094 272 0.602094 273 0.602094 274 0.602094 275 0.602094 276 0.602094 277 0.406649 278 0.406649 279 0.406649 280 0.406649 281 0.406649 282 0.406649 283 0.0546197 284 0.0546197 285 0.0546197 286 0.0546197 287 0.0546197 288 0.0546197 289 0.0546197 290 0.629987 291 0.629987 292 0.629987 293 0.629987 294 0.629987 295 0.629987 296 0.629987 297 0.406314 298 0.406314 299 0.406314 300 0.406314 301 0.406314 302 0.406314 303 0.0596827 304 0.0596827 305 0.0596827 306 0.0596827 307 0.0596827 308 0.0596827 309 0.0596827 310 0.0596827 311 0.0596827 312 0.0596827 313 0.0596827 314 0.617563 315 0.617563 316 0.617563 317 0.617563 318 0.617563 319 0.617563 320 0.617563 321 0.617563 322 0.405375 323 0.405375 324 0.405375 325 0.405375 326 0.405375 327 0.405375 328 0.0589791 329 0.0589791 330 0.0589791 331 0.0589791 332 0.0589791 333 0.0589791 334 0.0589791 335 0.0589791 336 0.618805 337 0.618805 338 0.618805 339 0.618805 340 0.618805 341 0.618805 342 0.618805 343 0.618805 344 0.618805 345 0.618805 346 0.618805 347 0.618805 348 0.406375 349 0.406375 350 0.406375 351 0.406375 352 0.406375 353 0.406375 354 0.0567919 355 0.0567919 356 0.0567919 357 0.0567919 358 0.0567919 359 0.0567919 360 0.0567919 361 0.0567919 362 0.0567919 363 0.641822 364 0.641822 365 0.641822 366 0.641822 367 0.641822 368 0.641822 369 0.641822 370 0.641822 371 0.410126 372 0.410126 373 0.410126 374 0.410126 375 0.410126 376 0.410126 377 0.411144 378 0.411144 379 0.411144 380 0.411144 381 0.411144 382 0.411144 383 0.411758 384 0.411758 385 0.411758 386 0.411758 387 0.411758 388 0.411758 389 0.411717 390 0.411717 391 0.411717 392 0.411717 393 0.411717 394 0.411717 395 0.411143 396 0.411143 397 0.411143 398 0.411143 399 0.411143 400 0.411143 401 0.409299 402 0.409299 403 0.409299 404 0.409299 405 0.409299 406 0.409299 407 0.407735 408 0.407735 409 0.407735 410 0.407735 411 0.407735 412 0.407735 413 0.407069 414 0.407069 415 0.407069 416 0.407069 417 0.407069 418 0.407069 419 0.407022 420 0.407022 421 0.407022 422 0.407022 423 0.407022 424 0.407022 425 0.4061 426 0.4061 427 0.4061 428 0.4061 429 0.4061 430 0.4061 431 0.407861 432 0.407861 433 0.407861 434 0.407861 435 0.407861 436 0.407861 437 0.406035 438 0.406035 439 0.406035 440 0.406035 441 0.406035 442 0.406035 443 0.0558424 444 0.0558424 445 0.0558424 446 0.0558424 447 0.0558424 448 0.709458 449 0.709458 450 0.709458 451 0.709458 452 0.709458 453 0.709458 454 0.527779 455 0.527779 456 0.527779 457 0.527779 458 0.527779 459 0.527779 460 0.117577 461 0.117577 462 0.117577 463 0.117577 464 0.117577 465 0.117577 466 0.0593598 467 0.0593598 468 0.0593598 469 0.0593598 470 0.0593598 471 0.690194 472 0.690194 473 0.690194 474 0.690194 475 0.690194 476 0.690194 477 0.118115 478 0.118115 479 0.118115 480 0.118115 481 0.118115 482 0.118115 483 0.0590717 484 0.0590717 485 0.0590717 486 0.0590717 487 0.0590717 488 0.699241 489 0.699241 490 0.699241 491 0.699241 492 0.699241 493 0.699241 494 0.118085 495 0.118085 496 0.118085 497 0.118085 498 0.118085 499 0.118085 500 0.0552082 501 0.0552082 502 0.0552082 503 0.0552082 504 0.0552082 505 0.0552082 506 0.702913 507 0.702913 508 0.702913 509 0.702913 510 0.702913 511 0.702913 512 0.11715 513 0.11715 514 0.11715 515 0.11715 516 0.11715 517 0.11715 518 0.0556777 519 0.0556777 520 0.0556777 521 0.0556777 522 0.0556777 523 0.705151 524 0.705151 525 0.705151 526 0.705151 527 0.705151 528 0.117498 529 0.117498 530 0.117498 531 0.117498 532 0.117498 533 0.117498 534 0.0595562 535 0.0595562 536 0.0595562 537 0.0595562 538 0.0595562 539 0.0595562 540 0.675713 541 0.675713 542 0.675713 543 0.675713 544 0.675713 545 0.675713 546 0.117429 547 0.117429 548 0.117429 549 0.117429 550 0.117429 551 0.117429 552 0.0596137 553 0.0596137 554 0.0596137 555 0.0596137 556 0.0596137 557 0.636998 558 0.636998 559 0.636998 560 0.636998 561 0.636998 562 0.117068 563 0.117068 564 0.117068 565 0.117068 566 0.117068 567 0.117068 568 0.0557424 569 0.0557424 570 0.0557424 571 0.0557424 572 0.0557424 573 0.0557424 574 0.627912 575 0.627912 576 0.627912 577 0.627912 578 0.627912 579 0.116074 580 0.116074 581 0.116074 582 0.116074 583 0.116074 584 0.116074 585 0.0554518 586 0.0554518 587 0.0554518 588 0.0554518 589 0.0554518 590 0.0554518 591 0.641835 592 0.641835 593 0.641835 594 0.641835 595 0.641835 596 0.116331 597 0.116331 598 0.116331 599 0.116331 600 0.116331 601 0.116331 602 0.0582382 603 0.0582382 604 0.0582382 605 0.0582382 606 0.0582382 607 0.0582382 608 0.600511 609 0.600511 610 0.600511 611 0.600511 612 0.600511 613 0.600511 614 0.116458 615 0.116458 616 0.116458 617 0.116458 618 0.116458 619 0.116458 620 0.0584118 621 0.0584118 622 0.0584118 623 0.0584118 624 0.0584118 625 0.577143 626 0.577143 627 0.577143 628 0.577143 629 0.577143 630 0.116709 631 0.116709 632 0.116709 633 0.116709 634 0.116709 635 0.116709 636 0.055461 637 0.055461 638 0.055461 639 0.055461 640 0.055461 641 0.603492 642 0.603492 643 0.603492 644 0.603492 645 0.603492 646 0.603492 647 0.0485551 648 0.0485551 649 0.0485551 650 0.0485551 651 0.0485551 652 0.0485551 653 0.691429 654 0.691429 655 0.691429 656 0.691429 657 0.691429 658 0.116582 659 0.116582 660 0.116582 661 0.116582 662 0.116582 663 0.116582 664 0.533249 665 0.533249 666 0.533249 667 0.533249 668 0.533249 669 0.533249 670 0.0586392 671 0.0586392 672 0.0586392 673 0.0586392 674 0.0586392 675 0.0586392 676 0.695704 677 0.695704 678 0.695704 679 0.695704 680 0.695704 681 0.535191 682 0.535191 683 0.535191 684 0.535191 685 0.535191 686 0.535191 687 0.0570583 688 0.0570583 689 0.0570583 690 0.0570583 691 0.0570583 692 0.0570583 693 0.720179 694 0.720179 695 0.720179 696 0.720179 697 0.720179 698 0.537441 699 0.537441 700 0.537441 701 0.537441 702 0.537441 703 0.537441 704 0.0581637 705 0.0581637 706 0.0581637 707 0.0581637 708 0.0581637 709 0.0581637 710 0.702459 711 0.702459 712 0.702459 713 0.702459 714 0.702459 715 0.702459 716 0.536746 717 0.536746 718 0.536746 719 0.536746 720 0.536746 721 0.536746 722 0.0478414 723 0.0478414 724 0.0478414 725 0.0478414 726 0.0478414 727 0.72579 728 0.72579 729 0.72579 730 0.72579 731 0.72579 732 0.532719 733 0.532719 734 0.532719 735 0.532719 736 0.532719 737 0.532719 738 0.0586395 739 0.0586395 740 0.0586395 741 0.0586395 742 0.0586395 743 0.0586395 744 0.648489 745 0.648489 746 0.648489 747 0.648489 748 0.648489 749 0.648489 750 0.521925 751 0.521925 752 0.521925 753 0.521925 754 0.521925 755 0.521925 756 0.0575213 757 0.0575213 758 0.0575213 759 0.0575213 760 0.0575213 761 0.64483 762 0.64483 763 0.64483 764 0.64483 765 0.64483 766 0.64483 767 0.518645 768 0.518645 769 0.518645 770 0.518645 771 0.518645 772 0.518645 773 0.0587439 774 0.0587439 775 0.0587439 776 0.0587439 777 0.0587439 778 0.0587439 779 0.628935 780 0.628935 781 0.628935 782 0.628935 783 0.628935 784 0.628935 785 0.518782 786 0.518782 787 0.518782 788 0.518782 789 0.518782 790 0.518782 791 0.0484385 792 0.0484385 793 0.0484385 794 0.0484385 795 0.0484385 796 0.6766 797 0.6766 798 0.6766 799 0.6766 800 0.6766 801 0.6766 802 0.518391 803 0.518391 804 0.518391 805 0.518391 806 0.518391 807 0.518391 808 0.0577665 809 0.0577665 810 0.0577665 811 0.0577665 812 0.0577665 813 0.576605 814 0.576605 815 0.576605 816 0.576605 817 0.576605 818 0.576605 819 0.510493 820 0.510493 821 0.510493 822 0.510493 823 0.510493 824 0.510493 825 0.0560403 826 0.0560403 827 0.0560403 828 0.0560403 829 0.0560403 830 0.592783 831 0.592783 832 0.592783 833 0.592783 834 0.592783 835 0.515418 836 0.515418 837 0.515418 838 0.515418 839 0.515418 840 0.515418 841 0.058051 842 0.058051 843 0.058051 844 0.058051 845 0.058051 846 0.058051 847 0.649668 848 0.649668 849 0.649668 850 0.649668 851 0.649668 852 0.410309 853 0.410309 854 0.410309 855 0.410309 856 0.410309 857 0.410309 858 0.409519 859 0.409519 860 0.409519 861 0.409519 862 0.409519 863 0.409519 864 0.116426 865 0.116426 866 0.116426 867 0.116426 868 0.116426 869 0.116426 870 0.532346 871 0.532346 872 0.532346 873 0.532346 874 0.532346 875 0.532346 876 0.411165 877 0.411165 878 0.411165 879 0.411165 880 0.411165 881 0.411165 882 0.410794 883 0.410794 884 0.410794 885 0.410794 886 0.410794 887 0.410794 888 0.117535 889 0.117535 890 0.117535 891 0.117535 892 0.117535 893 0.117535 894 0.533844 895 0.533844 896 0.533844 897 0.533844 898 0.533844 899 0.533844 900 0.411683 901 0.411683 902 0.411683 903 0.411683 904 0.411683 905 0.411683 906 0.411475 907 0.411475 908 0.411475 909 0.411475 910 0.411475 911 0.411475 912 0.117656 913 0.117656 914 0.117656 915 0.117656 916 0.117656 917 0.117656 918 0.536717 919 0.536717 920 0.536717 921 0.536717 922 0.536717 923 0.536717 924 0.411463 925 0.411463 926 0.411463 927 0.411463 928 0.411463 929 0.411463 930 0.411641 931 0.411641 932 0.411641 933 0.411641 934 0.411641 935 0.411641 936 0.117234 937 0.117234 938 0.117234 939 0.117234 940 0.117234 941 0.117234 942 0.536611 943 0.536611 944 0.536611 945 0.536611 946 0.536611 947 0.536611 948 0.410672 949 0.410672 950 0.410672 951 0.410672 952 0.410672 953 0.410672 954 0.411195 955 0.411195 956 0.411195 957 0.411195 958 0.411195 959 0.411195 960 0.116627 961 0.116627 962 0.116627 963 0.116627 964 0.116627 965 0.116627 966 0.536487 967 0.536487 968 0.536487 969 0.536487 970 0.536487 971 0.536487 972 0.40864 973 0.40864 974 0.40864 975 0.40864 976 0.40864 977 0.40864 978 0.409689 979 0.409689 980 0.409689 981 0.409689 982 0.409689 983 0.409689 984 0.117148 985 0.117148 986 0.117148 987 0.117148 988 0.117148 989 0.117148 990 0.525977 991 0.525977 992 0.525977 993 0.525977 994 0.525977 995 0.525977 996 0.407355 997 0.407355 998 0.407355 999 0.407355 1000 0.407355 1001 0.407355 1002 0.407854 1003 0.407854 1004 0.407854 1005 0.407854 1006 0.407854 1007 0.407854 1008 0.116803 1009 0.116803 1010 0.116803 1011 0.116803 1012 0.116803 1013 0.116803 1014 0.519599 1015 0.519599 1016 0.519599 1017 0.519599 1018 0.519599 1019 0.519599 1020 0.406864 1021 0.406864 1022 0.406864 1023 0.406864 1024 0.406864 1025 0.406864 1026 0.407012 1027 0.407012 1028 0.407012 1029 0.407012 1030 0.407012 1031 0.407012 1032 0.116194 1033 0.116194 1034 0.116194 1035 0.116194 1036 0.116194 1037 0.116194 1038 0.517497 1039 0.517497 1040 0.517497 1041 0.517497 1042 0.517497 1043 0.517497 1044 0.406762 1045 0.406762 1046 0.406762 1047 0.406762 1048 0.406762 1049 0.406762 1050 0.406875 1051 0.406875 1052 0.406875 1053 0.406875 1054 0.406875 1055 0.406875 1056 0.115553 1057 0.115553 1058 0.115553 1059 0.115553 1060 0.115553 1061 0.115553 1062 0.520202 1063 0.520202 1064 0.520202 1065 0.520202 1066 0.520202 1067 0.520202 1068 0.405691 1069 0.405691 1070 0.405691 1071 0.405691 1072 0.405691 1073 0.405691 1074 0.40622 1075 0.40622 1076 0.40622 1077 0.40622 1078 0.40622 1079 0.40622 1080 0.116043 1081 0.116043 1082 0.116043 1083 0.116043 1084 0.116043 1085 0.116043 1086 0.513728 1087 0.513728 1088 0.513728 1089 0.513728 1090 0.513728 1091 0.513728 1092 0.513728 1093 0.408328 1094 0.408328 1095 0.408328 1096 0.408328 1097 0.408328 1098 0.408328 1099 0.407093 1100 0.407093 1101 0.407093 1102 0.407093 1103 0.407093 1104 0.407093 1105 0.116205 1106 0.116205 1107 0.116205 1108 0.116205 1109 0.116205 1110 0.116205 1111 0.521077 1112 0.521077 1113 0.521077 1114 0.521077 1115 0.521077 1116 0.521077 1117 0.406172 1118 0.406172 1119 0.406172 1120 0.406172 1121 0.406172 1122 0.406172 1123 0.405649 1124 0.405649 1125 0.405649 1126 0.405649 1127 0.405649 1128 0.405649 1129 0.116095 1130 0.116095 1131 0.116095 1132 0.116095 1133 0.116095 1134 0.116095 1135 0.512592 1136 0.512592 1137 0.512592 1138 0.512592 1139 0.512592 1140 0.512592 1141 0.532998 1142 0.532998 1143 0.532998 1144 0.532998 1145 0.532998 1146 0.532998 1147 0.534609 1148 0.534609 1149 0.534609 1150 0.534609 1151 0.534609 1152 0.534609 1153 0.537637 1154 0.537637 1155 0.537637 1156 0.537637 1157 0.537637 1158 0.537637 1159 0.536753 1160 0.536753 1161 0.536753 1162 0.536753 1163 0.536753 1164 0.536753 1165 0.535728 1166 0.535728 1167 0.535728 1168 0.535728 1169 0.535728 1170 0.535728 1171 0.523952 1172 0.523952 1173 0.523952 1174 0.523952 1175 0.523952 1176 0.523952 1177 0.51959 1178 0.51959 1179 0.51959 1180 0.51959 1181 0.51959 1182 0.51959 1183 0.518243 1184 0.518243 1185 0.518243 1186 0.518243 1187 0.518243 1188 0.518243 1189 0.520723 1190 0.520723 1191 0.520723 1192 0.520723 1193 0.520723 1194 0.520723 1195 0.511297 1196 0.511297 1197 0.511297 1198 0.511297 1199 0.511297 1200 0.511297 1201 0.524385 1202 0.524385 1203 0.524385 1204 0.524385 1205 0.524385 1206 0.524385 1207 0.513435 1208 0.513435 1209 0.513435 1210 0.513435 1211 0.513435 1212 0.513435 1213 0.116967 1214 0.116967 1215 0.116967 1216 0.116967 1217 0.116967 1218 0.116967 1219 0.116342 1220 0.116342 1221 0.116342 1222 0.116342 1223 0.116342 1224 0.116342 1225 0.531194 1226 0.531194 1227 0.531194 1228 0.531194 1229 0.531194 1230 0.531194 1231 0.117819 1232 0.117819 1233 0.117819 1234 0.117819 1235 0.117819 1236 0.117819 1237 0.117551 1238 0.117551 1239 0.117551 1240 0.117551 1241 0.117551 1242 0.117551 1243 0.533594 1244 0.533594 1245 0.533594 1246 0.533594 1247 0.533594 1248 0.533594 1249 0.117864 1250 0.117864 1251 0.117864 1252 0.117864 1253 0.117864 1254 0.117864 1255 0.117811 1256 0.117811 1257 0.117811 1258 0.117811 1259 0.117811 1260 0.117811 1261 0.535981 1262 0.535981 1263 0.535981 1264 0.535981 1265 0.535981 1266 0.535981 1267 0.117146 1268 0.117146 1269 0.117146 1270 0.117146 1271 0.117146 1272 0.117146 1273 0.11765 1274 0.11765 1275 0.11765 1276 0.11765 1277 0.11765 1278 0.11765 1279 0.537053 1280 0.537053 1281 0.537053 1282 0.537053 1283 0.537053 1284 0.537053 1285 0.117029 1286 0.117029 1287 0.117029 1288 0.117029 1289 0.117029 1290 0.117029 1291 0.11669 1292 0.11669 1293 0.11669 1294 0.11669 1295 0.11669 1296 0.11669 1297 0.536812 1298 0.536812 1299 0.536812 1300 0.536812 1301 0.536812 1302 0.536812 1303 0.117275 1304 0.117275 1305 0.117275 1306 0.117275 1307 0.117275 1308 0.117275 1309 0.117316 1310 0.117316 1311 0.117316 1312 0.117316 1313 0.117316 1314 0.117316 1315 0.52955 1316 0.52955 1317 0.52955 1318 0.52955 1319 0.52955 1320 0.52955 1321 0.116922 1322 0.116922 1323 0.116922 1324 0.116922 1325 0.116922 1326 0.116922 1327 0.117038 1328 0.117038 1329 0.117038 1330 0.117038 1331 0.117038 1332 0.117038 1333 0.520788 1334 0.520788 1335 0.520788 1336 0.520788 1337 0.520788 1338 0.520788 1339 0.11609 1340 0.11609 1341 0.11609 1342 0.11609 1343 0.11609 1344 0.11609 1345 0.116618 1346 0.116618 1347 0.116618 1348 0.116618 1349 0.116618 1350 0.116618 1351 0.518144 1352 0.518144 1353 0.518144 1354 0.518144 1355 0.518144 1356 0.518144 1357 0.115908 1358 0.115908 1359 0.115908 1360 0.115908 1361 0.115908 1362 0.115908 1363 0.115628 1364 0.115628 1365 0.115628 1366 0.115628 1367 0.115628 1368 0.115628 1369 0.51984 1370 0.51984 1371 0.51984 1372 0.51984 1373 0.51984 1374 0.51984 1375 0.116223 1376 0.116223 1377 0.116223 1378 0.116223 1379 0.116223 1380 0.116223 1381 0.116171 1382 0.116171 1383 0.116171 1384 0.116171 1385 0.116171 1386 0.116171 1387 0.515533 1388 0.515533 1389 0.515533 1390 0.515533 1391 0.515533 1392 0.116361 1393 0.116361 1394 0.116361 1395 0.116361 1396 0.116361 1397 0.116361 1398 0.116448 1399 0.116448 1400 0.116448 1401 0.116448 1402 0.116448 1403 0.116448 1404 0.517509 1405 0.517509 1406 0.517509 1407 0.517509 1408 0.517509 1409 0.517509 1410 0.116379 1411 0.116379 1412 0.116379 1413 0.116379 1414 0.116379 1415 0.116379 1416 0.116183 1417 0.116183 1418 0.116183 1419 0.116183 1420 0.116183 1421 0.116183 1422 0.510798 1423 0.510798 1424 0.510798 1425 0.510798 1426 0.510798 1427 0.510798 } VertexInfluence "Bone_002" 1428 { 0 0.598155 1 0.598155 2 0.598155 3 0.598155 4 0.0582628 5 0.0582628 6 0.0582628 7 0.0582628 8 0.574353 9 0.574353 10 0.574353 11 0.574353 12 0.0690805 13 0.0690805 14 0.0690805 15 0.0690805 16 0.576778 17 0.576778 18 0.576778 19 0.576778 20 0.0726471 21 0.0726471 22 0.0726471 23 0.0726471 24 0.56066 25 0.56066 26 0.56066 27 0.56066 28 0.0699223 29 0.0699223 30 0.0699223 31 0.0699223 32 0.604528 33 0.604528 34 0.604528 35 0.604528 36 0.0679579 37 0.0679579 38 0.0679579 39 0.0679579 40 0.586099 41 0.586099 42 0.586099 43 0.586099 44 0.0579427 45 0.0579427 46 0.0579427 47 0.0579427 48 0.59979 49 0.59979 50 0.59979 51 0.59979 52 0.0618867 53 0.0618867 54 0.0618867 55 0.0618867 56 0.602846 57 0.602846 58 0.602846 59 0.602846 60 0.0601907 61 0.0601907 62 0.0601907 63 0.0601907 64 0.640274 65 0.640274 66 0.640274 67 0.640274 68 0.0585797 69 0.0585797 70 0.0585797 71 0.0585797 72 0.597926 73 0.597926 74 0.597926 75 0.597926 76 0.0539 77 0.0539 78 0.0539 79 0.0539 80 0.56915 81 0.56915 82 0.56915 83 0.56915 84 0.0600049 85 0.0600049 86 0.0600049 87 0.0600049 88 0.554443 89 0.554443 90 0.554443 91 0.554443 92 0.0616531 93 0.0616531 94 0.0616531 95 0.0616531 96 0.587102 97 0.587102 98 0.587102 99 0.587102 100 0.587102 101 0.587102 102 0.587102 103 0.0637755 104 0.0637755 105 0.0637755 106 0.0637755 107 0.0637755 108 0.0637755 109 0.0637755 110 0.404264 111 0.404264 112 0.404264 113 0.404264 114 0.404264 115 0.404264 116 0.40436 117 0.40436 118 0.40436 119 0.40436 120 0.40436 121 0.40436 122 0.560407 123 0.560407 124 0.560407 125 0.560407 126 0.560407 127 0.560407 128 0.560407 129 0.560407 130 0.560407 131 0.560407 132 0.0732167 133 0.0732167 134 0.0732167 135 0.0732167 136 0.0732167 137 0.0732167 138 0.0732167 139 0.0732167 140 0.0732167 141 0.404198 142 0.404198 143 0.404198 144 0.404198 145 0.404198 146 0.404198 147 0.557395 148 0.557395 149 0.557395 150 0.557395 151 0.557395 152 0.557395 153 0.557395 154 0.0720451 155 0.0720451 156 0.0720451 157 0.0720451 158 0.0720451 159 0.0720451 160 0.0720451 161 0.0720451 162 0.404162 163 0.404162 164 0.404162 165 0.404162 166 0.404162 167 0.404162 168 0.56108 169 0.56108 170 0.56108 171 0.56108 172 0.56108 173 0.56108 174 0.56108 175 0.56108 176 0.56108 177 0.56108 178 0.0721328 179 0.0721328 180 0.0721328 181 0.0721328 182 0.0721328 183 0.0721328 184 0.0721328 185 0.0721328 186 0.404965 187 0.404965 188 0.404965 189 0.404965 190 0.404965 191 0.404965 192 0.595569 193 0.595569 194 0.595569 195 0.595569 196 0.595569 197 0.595569 198 0.595569 199 0.595569 200 0.0630788 201 0.0630788 202 0.0630788 203 0.0630788 204 0.0630788 205 0.0630788 206 0.0630788 207 0.0630788 208 0.404967 209 0.404967 210 0.404967 211 0.404967 212 0.404967 213 0.404967 214 0.576136 215 0.576136 216 0.576136 217 0.576136 218 0.576136 219 0.576136 220 0.576136 221 0.576136 222 0.0616774 223 0.0616774 224 0.0616774 225 0.0616774 226 0.0616774 227 0.0616774 228 0.0616774 229 0.0616774 230 0.0616774 231 0.0616774 232 0.405261 233 0.405261 234 0.405261 235 0.405261 236 0.405261 237 0.405261 238 0.592427 239 0.592427 240 0.592427 241 0.592427 242 0.592427 243 0.592427 244 0.592427 245 0.592427 246 0.0613356 247 0.0613356 248 0.0613356 249 0.0613356 250 0.0613356 251 0.0613356 252 0.0613356 253 0.405806 254 0.405806 255 0.405806 256 0.405806 257 0.405806 258 0.405806 259 0.601937 260 0.601937 261 0.601937 262 0.601937 263 0.601937 264 0.601937 265 0.601937 266 0.601937 267 0.601937 268 0.0612082 269 0.0612082 270 0.0612082 271 0.0612082 272 0.0612082 273 0.0612082 274 0.0612082 275 0.0612082 276 0.0612082 277 0.406295 278 0.406295 279 0.406295 280 0.406295 281 0.406295 282 0.406295 283 0.621235 284 0.621235 285 0.621235 286 0.621235 287 0.621235 288 0.621235 289 0.621235 290 0.0550011 291 0.0550011 292 0.0550011 293 0.0550011 294 0.0550011 295 0.0550011 296 0.0550011 297 0.405013 298 0.405013 299 0.405013 300 0.405013 301 0.405013 302 0.405013 303 0.561939 304 0.561939 305 0.561939 306 0.561939 307 0.561939 308 0.561939 309 0.561939 310 0.561939 311 0.561939 312 0.561939 313 0.561939 314 0.057139 315 0.057139 316 0.057139 317 0.057139 318 0.057139 319 0.057139 320 0.057139 321 0.057139 322 0.403626 323 0.403626 324 0.403626 325 0.403626 326 0.403626 327 0.403626 328 0.552706 329 0.552706 330 0.552706 331 0.552706 332 0.552706 333 0.552706 334 0.552706 335 0.552706 336 0.0588137 337 0.0588137 338 0.0588137 339 0.0588137 340 0.0588137 341 0.0588137 342 0.0588137 343 0.0588137 344 0.0588137 345 0.0588137 346 0.0588137 347 0.0588137 348 0.403396 349 0.403396 350 0.403396 351 0.403396 352 0.403396 353 0.403396 354 0.577441 355 0.577441 356 0.577441 357 0.577441 358 0.577441 359 0.577441 360 0.577441 361 0.577441 362 0.577441 363 0.0601323 364 0.0601323 365 0.0601323 366 0.0601323 367 0.0601323 368 0.0601323 369 0.0601323 370 0.0601323 371 0.404841 372 0.404841 373 0.404841 374 0.404841 375 0.404841 376 0.404841 377 0.404642 378 0.404642 379 0.404642 380 0.404642 381 0.404642 382 0.404642 383 0.404494 384 0.404494 385 0.404494 386 0.404494 387 0.404494 388 0.404494 389 0.404896 390 0.404896 391 0.404896 392 0.404896 393 0.404896 394 0.404896 395 0.405469 396 0.405469 397 0.405469 398 0.405469 399 0.405469 400 0.405469 401 0.405397 402 0.405397 403 0.405397 404 0.405397 405 0.405397 406 0.405397 407 0.405906 408 0.405906 409 0.405906 410 0.405906 411 0.405906 412 0.405906 413 0.406506 414 0.406506 415 0.406506 416 0.406506 417 0.406506 418 0.406506 419 0.40626 420 0.40626 421 0.40626 422 0.40626 423 0.40626 424 0.40626 425 0.404552 426 0.404552 427 0.404552 428 0.404552 429 0.404552 430 0.404552 431 0.404184 432 0.404184 433 0.404184 434 0.404184 435 0.404184 436 0.404184 437 0.403743 438 0.403743 439 0.403743 440 0.403743 441 0.403743 442 0.403743 443 0.589523 444 0.589523 445 0.589523 446 0.589523 447 0.589523 448 0.0552031 449 0.0552031 450 0.0552031 451 0.0552031 452 0.0552031 453 0.0552031 454 0.116564 455 0.116564 456 0.116564 457 0.116564 458 0.116564 459 0.116564 460 0.507737 461 0.507737 462 0.507737 463 0.507737 464 0.507737 465 0.507737 466 0.583154 467 0.583154 468 0.583154 469 0.583154 470 0.583154 471 0.0695297 472 0.0695297 473 0.0695297 474 0.0695297 475 0.0695297 476 0.0695297 477 0.506298 478 0.506298 479 0.506298 480 0.506298 481 0.506298 482 0.506298 483 0.567147 484 0.567147 485 0.567147 486 0.567147 487 0.567147 488 0.0712864 489 0.0712864 490 0.0712864 491 0.0712864 492 0.0712864 493 0.0712864 494 0.505047 495 0.505047 496 0.505047 497 0.505047 498 0.505047 499 0.505047 500 0.590716 501 0.590716 502 0.590716 503 0.590716 504 0.590716 505 0.590716 506 0.0699366 507 0.0699366 508 0.0699366 509 0.0699366 510 0.0699366 511 0.0699366 512 0.511597 513 0.511597 514 0.511597 515 0.511597 516 0.511597 517 0.511597 518 0.599921 519 0.599921 520 0.599921 521 0.599921 522 0.599921 523 0.0643527 524 0.0643527 525 0.0643527 526 0.0643527 527 0.0643527 528 0.511186 529 0.511186 530 0.511186 531 0.511186 532 0.511186 533 0.511186 534 0.603076 535 0.603076 536 0.603076 537 0.603076 538 0.603076 539 0.603076 540 0.059269 541 0.059269 542 0.059269 543 0.059269 544 0.059269 545 0.059269 546 0.512515 547 0.512515 548 0.512515 549 0.512515 550 0.512515 551 0.512515 552 0.613036 553 0.613036 554 0.613036 555 0.613036 556 0.613036 557 0.0611269 558 0.0611269 559 0.0611269 560 0.0611269 561 0.0611269 562 0.514589 563 0.514589 564 0.514589 565 0.514589 566 0.514589 567 0.514589 568 0.637212 569 0.637212 570 0.637212 571 0.637212 572 0.637212 573 0.637212 574 0.0601891 575 0.0601891 576 0.0601891 577 0.0601891 578 0.0601891 579 0.519667 580 0.519667 581 0.519667 582 0.519667 583 0.519667 584 0.519667 585 0.625354 586 0.625354 587 0.625354 588 0.625354 589 0.625354 590 0.625354 591 0.0561587 592 0.0561587 593 0.0561587 594 0.0561587 595 0.0561587 596 0.512534 597 0.512534 598 0.512534 599 0.512534 600 0.512534 601 0.512534 602 0.572912 603 0.572912 604 0.572912 605 0.572912 606 0.572912 607 0.572912 608 0.0574506 609 0.0574506 610 0.0574506 611 0.0574506 612 0.0574506 613 0.0574506 614 0.505162 615 0.505162 616 0.505162 617 0.505162 618 0.505162 619 0.505162 620 0.560628 621 0.560628 622 0.560628 623 0.560628 624 0.560628 625 0.0610238 626 0.0610238 627 0.0610238 628 0.0610238 629 0.0610238 630 0.503603 631 0.503603 632 0.503603 633 0.503603 634 0.503603 635 0.503603 636 0.585366 637 0.585366 638 0.585366 639 0.585366 640 0.585366 641 0.0623888 642 0.0623888 643 0.0623888 644 0.0623888 645 0.0623888 646 0.0623888 647 0.638203 648 0.638203 649 0.638203 650 0.638203 651 0.638203 652 0.638203 653 0.065283 654 0.065283 655 0.065283 656 0.065283 657 0.065283 658 0.510159 659 0.510159 660 0.510159 661 0.510159 662 0.510159 663 0.510159 664 0.118231 665 0.118231 666 0.118231 667 0.118231 668 0.118231 669 0.118231 670 0.583584 671 0.583584 672 0.583584 673 0.583584 674 0.583584 675 0.583584 676 0.0708357 677 0.0708357 678 0.0708357 679 0.0708357 680 0.0708357 681 0.119047 682 0.119047 683 0.119047 684 0.119047 685 0.119047 686 0.119047 687 0.595147 688 0.595147 689 0.595147 690 0.595147 691 0.595147 692 0.595147 693 0.0665772 694 0.0665772 695 0.0665772 696 0.0665772 697 0.0665772 698 0.118746 699 0.118746 700 0.118746 701 0.118746 702 0.118746 703 0.118746 704 0.577364 705 0.577364 706 0.577364 707 0.577364 708 0.577364 709 0.577364 710 0.0681478 711 0.0681478 712 0.0681478 713 0.0681478 714 0.0681478 715 0.0681478 716 0.118146 717 0.118146 718 0.118146 719 0.118146 720 0.118146 721 0.118146 722 0.646413 723 0.646413 724 0.646413 725 0.646413 726 0.646413 727 0.0546473 728 0.0546473 729 0.0546473 730 0.0546473 731 0.0546473 732 0.116752 733 0.116752 734 0.116752 735 0.116752 736 0.116752 737 0.116752 738 0.597644 739 0.597644 740 0.597644 741 0.597644 742 0.597644 743 0.597644 744 0.0610572 745 0.0610572 746 0.0610572 747 0.0610572 748 0.0610572 749 0.0610572 750 0.117041 751 0.117041 752 0.117041 753 0.117041 754 0.117041 755 0.117041 756 0.623138 757 0.623138 758 0.623138 759 0.623138 760 0.623138 761 0.058441 762 0.058441 763 0.058441 764 0.058441 765 0.058441 766 0.058441 767 0.116932 768 0.116932 769 0.116932 770 0.116932 771 0.116932 772 0.116932 773 0.619449 774 0.619449 775 0.619449 776 0.619449 777 0.619449 778 0.619449 779 0.0591191 780 0.0591191 781 0.0591191 782 0.0591191 783 0.0591191 784 0.0591191 785 0.116482 786 0.116482 787 0.116482 788 0.116482 789 0.116482 790 0.116482 791 0.674294 792 0.674294 793 0.674294 794 0.674294 795 0.674294 796 0.0487278 797 0.0487278 798 0.0487278 799 0.0487278 800 0.0487278 801 0.0487278 802 0.115685 803 0.115685 804 0.115685 805 0.115685 806 0.115685 807 0.115685 808 0.5969 809 0.5969 810 0.5969 811 0.5969 812 0.5969 813 0.0602494 814 0.0602494 815 0.0602494 816 0.0602494 817 0.0602494 818 0.0602494 819 0.116266 820 0.116266 821 0.116266 822 0.116266 823 0.116266 824 0.116266 825 0.589349 826 0.589349 827 0.589349 828 0.589349 829 0.589349 830 0.0617826 831 0.0617826 832 0.0617826 833 0.0617826 834 0.0617826 835 0.116548 836 0.116548 837 0.116548 838 0.116548 839 0.116548 840 0.116548 841 0.570853 842 0.570853 843 0.570853 844 0.570853 845 0.570853 846 0.570853 847 0.0593951 848 0.0593951 849 0.0593951 850 0.0593951 851 0.0593951 852 0.404638 853 0.404638 854 0.404638 855 0.404638 856 0.404638 857 0.404638 858 0.404639 859 0.404639 860 0.404639 861 0.404639 862 0.404639 863 0.404639 864 0.5101 865 0.5101 866 0.5101 867 0.5101 868 0.5101 869 0.5101 870 0.116803 871 0.116803 872 0.116803 873 0.116803 874 0.116803 875 0.116803 876 0.404444 877 0.404444 878 0.404444 879 0.404444 880 0.404444 881 0.404444 882 0.404521 883 0.404521 884 0.404521 885 0.404521 886 0.404521 887 0.404521 888 0.506148 889 0.506148 890 0.506148 891 0.506148 892 0.506148 893 0.506148 894 0.118404 895 0.118404 896 0.118404 897 0.118404 898 0.118404 899 0.118404 900 0.404315 901 0.404315 902 0.404315 903 0.404315 904 0.404315 905 0.404315 906 0.404378 907 0.404378 908 0.404378 909 0.404378 910 0.404378 911 0.404378 912 0.505019 913 0.505019 914 0.505019 915 0.505019 916 0.505019 917 0.505019 918 0.118446 919 0.118446 920 0.118446 921 0.118446 922 0.118446 923 0.118446 924 0.404965 925 0.404965 926 0.404965 927 0.404965 928 0.404965 929 0.404965 930 0.404526 931 0.404526 932 0.404526 933 0.404526 934 0.404526 935 0.404526 936 0.507029 937 0.507029 938 0.507029 939 0.507029 940 0.507029 941 0.507029 942 0.118214 943 0.118214 944 0.118214 945 0.118214 946 0.118214 947 0.118214 948 0.405236 949 0.405236 950 0.405236 951 0.405236 952 0.405236 953 0.405236 954 0.405311 955 0.405311 956 0.405311 957 0.405311 958 0.405311 959 0.405311 960 0.512392 961 0.512392 962 0.512392 963 0.512392 964 0.512392 965 0.512392 966 0.116842 967 0.116842 968 0.116842 969 0.116842 970 0.116842 971 0.116842 972 0.40534 973 0.40534 974 0.40534 975 0.40534 976 0.40534 977 0.40534 978 0.40518 979 0.40518 980 0.40518 981 0.40518 982 0.40518 983 0.40518 984 0.510807 985 0.510807 986 0.510807 987 0.510807 988 0.510807 989 0.510807 990 0.116457 991 0.116457 992 0.116457 993 0.116457 994 0.116457 995 0.116457 996 0.405873 997 0.405873 998 0.405873 999 0.405873 1000 0.405873 1001 0.405873 1002 0.405617 1003 0.405617 1004 0.405617 1005 0.405617 1006 0.405617 1007 0.405617 1008 0.513382 1009 0.513382 1010 0.513382 1011 0.513382 1012 0.513382 1013 0.513382 1014 0.116536 1015 0.116536 1016 0.116536 1017 0.116536 1018 0.116536 1019 0.116536 1020 0.406472 1021 0.406472 1022 0.406472 1023 0.406472 1024 0.406472 1025 0.406472 1026 0.406184 1027 0.406184 1028 0.406184 1029 0.406184 1030 0.406184 1031 0.406184 1032 0.516566 1033 0.516566 1034 0.516566 1035 0.516566 1036 0.516566 1037 0.516566 1038 0.11641 1039 0.11641 1040 0.11641 1041 0.11641 1042 0.11641 1043 0.11641 1044 0.405684 1045 0.405684 1046 0.405684 1047 0.405684 1048 0.405684 1049 0.405684 1050 0.406396 1051 0.406396 1052 0.406396 1053 0.406396 1054 0.406396 1055 0.406396 1056 0.517821 1057 0.517821 1058 0.517821 1059 0.517821 1060 0.517821 1061 0.517821 1062 0.115424 1063 0.115424 1064 0.115424 1065 0.115424 1066 0.115424 1067 0.115424 1068 0.404072 1069 0.404072 1070 0.404072 1071 0.404072 1072 0.404072 1073 0.404072 1074 0.404785 1075 0.404785 1076 0.404785 1077 0.404785 1078 0.404785 1079 0.404785 1080 0.507313 1081 0.507313 1082 0.507313 1083 0.507313 1084 0.507313 1085 0.507313 1086 0.115527 1087 0.115527 1088 0.115527 1089 0.115527 1090 0.115527 1091 0.115527 1092 0.115527 1093 0.404256 1094 0.404256 1095 0.404256 1096 0.404256 1097 0.404256 1098 0.404256 1099 0.403785 1100 0.403785 1101 0.403785 1102 0.403785 1103 0.403785 1104 0.403785 1105 0.50667 1106 0.50667 1107 0.50667 1108 0.50667 1109 0.50667 1110 0.50667 1111 0.116069 1112 0.116069 1113 0.116069 1114 0.116069 1115 0.116069 1116 0.116069 1117 0.403544 1118 0.403544 1119 0.403544 1120 0.403544 1121 0.403544 1122 0.403544 1123 0.403687 1124 0.403687 1125 0.403687 1126 0.403687 1127 0.403687 1128 0.403687 1129 0.503588 1130 0.503588 1131 0.503588 1132 0.503588 1133 0.503588 1134 0.503588 1135 0.115894 1136 0.115894 1137 0.115894 1138 0.115894 1139 0.115894 1140 0.115894 1141 0.117496 1142 0.117496 1143 0.117496 1144 0.117496 1145 0.117496 1146 0.117496 1147 0.118709 1148 0.118709 1149 0.118709 1150 0.118709 1151 0.118709 1152 0.118709 1153 0.11847 1154 0.11847 1155 0.11847 1156 0.11847 1157 0.11847 1158 0.11847 1159 0.118171 1160 0.118171 1161 0.118171 1162 0.118171 1163 0.118171 1164 0.118171 1165 0.116581 1166 0.116581 1167 0.116581 1168 0.116581 1169 0.116581 1170 0.116581 1171 0.116727 1172 0.116727 1173 0.116727 1174 0.116727 1175 0.116727 1176 0.116727 1177 0.116657 1178 0.116657 1179 0.116657 1180 0.116657 1181 0.116657 1182 0.116657 1183 0.116443 1184 0.116443 1185 0.116443 1186 0.116443 1187 0.116443 1188 0.116443 1189 0.115361 1190 0.115361 1191 0.115361 1192 0.115361 1193 0.115361 1194 0.115361 1195 0.115911 1196 0.115911 1197 0.115911 1198 0.115911 1199 0.115911 1200 0.115911 1201 0.11626 1202 0.11626 1203 0.11626 1204 0.11626 1205 0.11626 1206 0.11626 1207 0.116221 1208 0.116221 1209 0.116221 1210 0.116221 1211 0.116221 1212 0.116221 1213 0.508977 1214 0.508977 1215 0.508977 1216 0.508977 1217 0.508977 1218 0.508977 1219 0.511594 1220 0.511594 1221 0.511594 1222 0.511594 1223 0.511594 1224 0.511594 1225 0.116476 1226 0.116476 1227 0.116476 1228 0.116476 1229 0.116476 1230 0.116476 1231 0.506393 1232 0.506393 1233 0.506393 1234 0.506393 1235 0.506393 1236 0.506393 1237 0.507048 1238 0.507048 1239 0.507048 1240 0.507048 1241 0.507048 1242 0.507048 1243 0.118316 1244 0.118316 1245 0.118316 1246 0.118316 1247 0.118316 1248 0.118316 1249 0.504857 1250 0.504857 1251 0.504857 1252 0.504857 1253 0.504857 1254 0.504857 1255 0.506248 1256 0.506248 1257 0.506248 1258 0.506248 1259 0.506248 1260 0.506248 1261 0.118738 1262 0.118738 1263 0.118738 1264 0.118738 1265 0.118738 1266 0.118738 1267 0.50935 1268 0.50935 1269 0.50935 1270 0.50935 1271 0.50935 1272 0.50935 1273 0.506054 1274 0.506054 1275 0.506054 1276 0.506054 1277 0.506054 1278 0.506054 1279 0.11847 1280 0.11847 1281 0.11847 1282 0.11847 1283 0.11847 1284 0.11847 1285 0.511842 1286 0.511842 1287 0.511842 1288 0.511842 1289 0.511842 1290 0.511842 1291 0.513364 1292 0.513364 1293 0.513364 1294 0.513364 1295 0.513364 1296 0.513364 1297 0.117473 1298 0.117473 1299 0.117473 1300 0.117473 1301 0.117473 1302 0.117473 1303 0.511786 1304 0.511786 1305 0.511786 1306 0.511786 1307 0.511786 1308 0.511786 1309 0.511063 1310 0.511063 1311 0.511063 1312 0.511063 1313 0.511063 1314 0.511063 1315 0.116543 1316 0.116543 1317 0.116543 1318 0.116543 1319 0.116543 1320 0.116543 1321 0.514116 1322 0.514116 1323 0.514116 1324 0.514116 1325 0.514116 1326 0.514116 1327 0.513524 1328 0.513524 1329 0.513524 1330 0.513524 1331 0.513524 1332 0.513524 1333 0.116773 1334 0.116773 1335 0.116773 1336 0.116773 1337 0.116773 1338 0.116773 1339 0.518506 1340 0.518506 1341 0.518506 1342 0.518506 1343 0.518506 1344 0.518506 1345 0.515716 1346 0.515716 1347 0.515716 1348 0.515716 1349 0.515716 1350 0.515716 1351 0.116662 1352 0.116662 1353 0.116662 1354 0.116662 1355 0.116662 1356 0.116662 1357 0.515539 1358 0.515539 1359 0.515539 1360 0.515539 1361 0.515539 1362 0.515539 1363 0.520186 1364 0.520186 1365 0.520186 1366 0.520186 1367 0.520186 1368 0.520186 1369 0.115923 1370 0.115923 1371 0.115923 1372 0.115923 1373 0.115923 1374 0.115923 1375 0.50603 1376 0.50603 1377 0.50603 1378 0.50603 1379 0.50603 1380 0.50603 1381 0.510017 1382 0.510017 1383 0.510017 1384 0.510017 1385 0.510017 1386 0.510017 1387 0.115599 1388 0.115599 1389 0.115599 1390 0.115599 1391 0.115599 1392 0.508396 1393 0.508396 1394 0.508396 1395 0.508396 1396 0.508396 1397 0.508396 1398 0.505024 1399 0.505024 1400 0.505024 1401 0.505024 1402 0.505024 1403 0.505024 1404 0.116323 1405 0.116323 1406 0.116323 1407 0.116323 1408 0.116323 1409 0.116323 1410 0.503336 1411 0.503336 1412 0.503336 1413 0.503336 1414 0.503336 1415 0.503336 1416 0.504887 1417 0.504887 1418 0.504887 1419 0.504887 1420 0.504887 1421 0.504887 1422 0.116081 1423 0.116081 1424 0.116081 1425 0.116081 1426 0.116081 1427 0.116081 } VertexInfluence "Bone_003" 1032 { 4 0.278159 5 0.278159 6 0.278159 7 0.278159 12 0.24515 13 0.24515 14 0.24515 15 0.24515 20 0.23507 21 0.23507 22 0.23507 23 0.23507 28 0.224104 29 0.224104 30 0.224104 31 0.224104 36 0.233595 37 0.233595 38 0.233595 39 0.233595 44 0.258175 45 0.258175 46 0.258175 47 0.258175 52 0.309799 53 0.309799 54 0.309799 55 0.309799 60 0.317662 61 0.317662 62 0.317662 63 0.317662 68 0.320206 69 0.320206 70 0.320206 71 0.320206 76 0.311216 77 0.311216 78 0.311216 79 0.311216 84 0.357141 85 0.357141 86 0.357141 87 0.357141 92 0.321442 93 0.321442 94 0.321442 95 0.321442 103 0.246048 104 0.246048 105 0.246048 106 0.246048 107 0.246048 108 0.246048 109 0.246048 110 0.090729 111 0.090729 112 0.090729 113 0.090729 114 0.090729 115 0.090729 116 0.0887967 117 0.0887967 118 0.0887967 119 0.0887967 120 0.0887967 121 0.0887967 132 0.243541 133 0.243541 134 0.243541 135 0.243541 136 0.243541 137 0.243541 138 0.243541 139 0.243541 140 0.243541 141 0.0878763 142 0.0878763 143 0.0878763 144 0.0878763 145 0.0878763 146 0.0878763 154 0.228804 155 0.228804 156 0.228804 157 0.228804 158 0.228804 159 0.228804 160 0.228804 161 0.228804 162 0.0875306 163 0.0875306 164 0.0875306 165 0.0875306 166 0.0875306 167 0.0875306 178 0.23533 179 0.23533 180 0.23533 181 0.23533 182 0.23533 183 0.23533 184 0.23533 185 0.23533 186 0.0880036 187 0.0880036 188 0.0880036 189 0.0880036 190 0.0880036 191 0.0880036 200 0.23241 201 0.23241 202 0.23241 203 0.23241 204 0.23241 205 0.23241 206 0.23241 207 0.23241 208 0.0895814 209 0.0895814 210 0.0895814 211 0.0895814 212 0.0895814 213 0.0895814 222 0.305104 223 0.305104 224 0.305104 225 0.305104 226 0.305104 227 0.305104 228 0.305104 229 0.305104 230 0.305104 231 0.305104 232 0.0917889 233 0.0917889 234 0.0917889 235 0.0917889 236 0.0917889 237 0.0917889 246 0.325085 247 0.325085 248 0.325085 249 0.325085 250 0.325085 251 0.325085 252 0.325085 253 0.0928968 254 0.0928968 255 0.0928968 256 0.0928968 257 0.0928968 258 0.0928968 268 0.336697 269 0.336697 270 0.336697 271 0.336697 272 0.336697 273 0.336697 274 0.336697 275 0.336697 276 0.336697 277 0.0932003 278 0.0932003 279 0.0932003 280 0.0932003 281 0.0932003 282 0.0932003 290 0.315012 291 0.315012 292 0.315012 293 0.315012 294 0.315012 295 0.315012 296 0.315012 297 0.0936636 298 0.0936636 299 0.0936636 300 0.0936636 301 0.0936636 302 0.0936636 314 0.325298 315 0.325298 316 0.325298 317 0.325298 318 0.325298 319 0.325298 320 0.325298 321 0.325298 322 0.0944848 323 0.0944848 324 0.0944848 325 0.0944848 326 0.0944848 327 0.0944848 336 0.322382 337 0.322382 338 0.322382 339 0.322382 340 0.322382 341 0.322382 342 0.322382 343 0.322382 344 0.322382 345 0.322382 346 0.322382 347 0.322382 348 0.0933232 349 0.0933232 350 0.0933232 351 0.0933232 352 0.0933232 353 0.0933232 363 0.298046 364 0.298046 365 0.298046 366 0.298046 367 0.298046 368 0.298046 369 0.298046 370 0.298046 371 0.0891931 372 0.0891931 373 0.0891931 374 0.0891931 375 0.0891931 376 0.0891931 377 0.0879207 378 0.0879207 379 0.0879207 380 0.0879207 381 0.0879207 382 0.0879207 383 0.0872476 384 0.0872476 385 0.0872476 386 0.0872476 387 0.0872476 388 0.0872476 389 0.0873352 390 0.0873352 391 0.0873352 392 0.0873352 393 0.0873352 394 0.0873352 395 0.0882251 396 0.0882251 397 0.0882251 398 0.0882251 399 0.0882251 400 0.0882251 401 0.0904285 402 0.0904285 403 0.0904285 404 0.0904285 405 0.0904285 406 0.0904285 407 0.092096 408 0.092096 409 0.092096 410 0.092096 411 0.092096 412 0.092096 413 0.0927711 414 0.0927711 415 0.0927711 416 0.0927711 417 0.0927711 418 0.0927711 419 0.0929004 420 0.0929004 421 0.0929004 422 0.0929004 423 0.0929004 424 0.0929004 425 0.0938426 426 0.0938426 427 0.0938426 428 0.0938426 429 0.0938426 430 0.0938426 431 0.0917399 432 0.0917399 433 0.0917399 434 0.0917399 435 0.0917399 436 0.0917399 437 0.0937478 438 0.0937478 439 0.0937478 440 0.0937478 441 0.0937478 442 0.0937478 448 0.235339 449 0.235339 450 0.235339 451 0.235339 452 0.235339 453 0.235339 454 0.351355 455 0.351355 456 0.351355 457 0.351355 458 0.351355 459 0.351355 471 0.240276 472 0.240276 473 0.240276 474 0.240276 475 0.240276 476 0.240276 488 0.229473 489 0.229473 490 0.229473 491 0.229473 492 0.229473 493 0.229473 506 0.22715 507 0.22715 508 0.22715 509 0.22715 510 0.22715 511 0.22715 523 0.230496 524 0.230496 525 0.230496 526 0.230496 527 0.230496 528 6.19344e-005 529 6.19344e-005 530 6.19344e-005 531 6.19344e-005 532 6.19344e-005 533 6.19344e-005 540 0.265018 541 0.265018 542 0.265018 543 0.265018 544 0.265018 545 0.265018 546 0.0012902 547 0.0012902 548 0.0012902 549 0.0012902 550 0.0012902 551 0.0012902 557 0.301875 558 0.301875 559 0.301875 560 0.301875 561 0.301875 562 0.00192118 563 0.00192118 564 0.00192118 565 0.00192118 566 0.00192118 567 0.00192118 574 0.311899 575 0.311899 576 0.311899 577 0.311899 578 0.311899 579 0.00180375 580 0.00180375 581 0.00180375 582 0.00180375 583 0.00180375 584 0.00180375 591 0.302006 592 0.302006 593 0.302006 594 0.302006 595 0.302006 596 0.00225085 597 0.00225085 598 0.00225085 599 0.00225085 600 0.00225085 601 0.00225085 608 0.342038 609 0.342038 610 0.342038 611 0.342038 612 0.342038 613 0.342038 614 0.0025655 615 0.0025655 616 0.0025655 617 0.0025655 618 0.0025655 619 0.0025655 625 0.361833 626 0.361833 627 0.361833 628 0.361833 629 0.361833 630 0.00196952 631 0.00196952 632 0.00196952 633 0.00196952 634 0.00196952 635 0.00196952 641 0.334119 642 0.334119 643 0.334119 644 0.334119 645 0.334119 646 0.334119 653 0.243288 654 0.243288 655 0.243288 656 0.243288 657 0.243288 658 0.000443954 659 0.000443954 660 0.000443954 661 0.000443954 662 0.000443954 663 0.000443954 664 0.343379 665 0.343379 666 0.343379 667 0.343379 668 0.343379 669 0.343379 676 0.23346 677 0.23346 678 0.23346 679 0.23346 680 0.23346 681 0.340088 682 0.340088 683 0.340088 684 0.340088 685 0.340088 686 0.340088 693 0.213244 694 0.213244 695 0.213244 696 0.213244 697 0.213244 698 0.338361 699 0.338361 700 0.338361 701 0.338361 702 0.338361 703 0.338361 710 0.229394 711 0.229394 712 0.229394 713 0.229394 714 0.229394 715 0.229394 716 0.340395 717 0.340395 718 0.340395 719 0.340395 720 0.340395 721 0.340395 727 0.219563 728 0.219563 729 0.219563 730 0.219563 731 0.219563 732 0.346827 733 0.346827 734 0.346827 735 0.346827 736 0.346827 737 0.346827 744 0.290454 745 0.290454 746 0.290454 747 0.290454 748 0.290454 749 0.290454 750 0.35751 751 0.35751 752 0.35751 753 0.35751 754 0.35751 755 0.35751 761 0.296729 762 0.296729 763 0.296729 764 0.296729 765 0.296729 766 0.296729 767 0.36131 768 0.36131 769 0.36131 770 0.36131 771 0.36131 772 0.36131 779 0.311946 780 0.311946 781 0.311946 782 0.311946 783 0.311946 784 0.311946 785 0.361974 786 0.361974 787 0.361974 788 0.361974 789 0.361974 790 0.361974 796 0.274672 797 0.274672 798 0.274672 799 0.274672 800 0.274672 801 0.274672 802 0.362919 803 0.362919 804 0.362919 805 0.362919 806 0.362919 807 0.362919 813 0.363146 814 0.363146 815 0.363146 816 0.363146 817 0.363146 818 0.363146 819 0.369134 820 0.369134 821 0.369134 822 0.369134 823 0.369134 824 0.369134 830 0.345435 831 0.345435 832 0.345435 833 0.345435 834 0.345435 835 0.363526 836 0.363526 837 0.363526 838 0.363526 839 0.363526 840 0.363526 847 0.290937 848 0.290937 849 0.290937 850 0.290937 851 0.290937 852 0.0889319 853 0.0889319 854 0.0889319 855 0.0889319 856 0.0889319 857 0.0889319 858 0.0898799 859 0.0898799 860 0.0898799 861 0.0898799 862 0.0898799 863 0.0898799 870 0.346496 871 0.346496 872 0.346496 873 0.346496 874 0.346496 875 0.346496 876 0.0878627 877 0.0878627 878 0.0878627 879 0.0878627 880 0.0878627 881 0.0878627 882 0.0883173 883 0.0883173 884 0.0883173 885 0.0883173 886 0.0883173 887 0.0883173 894 0.342477 895 0.342477 896 0.342477 897 0.342477 898 0.342477 899 0.342477 900 0.0873327 901 0.0873327 902 0.0873327 903 0.0873327 904 0.0873327 905 0.0873327 906 0.0875221 907 0.0875221 908 0.0875221 909 0.0875221 910 0.0875221 911 0.0875221 918 0.33948 919 0.33948 920 0.33948 921 0.33948 922 0.33948 923 0.33948 924 0.0876242 925 0.0876242 926 0.0876242 927 0.0876242 928 0.0876242 929 0.0876242 930 0.0873905 931 0.0873905 932 0.0873905 933 0.0873905 934 0.0873905 935 0.0873905 942 0.340208 943 0.340208 944 0.340208 945 0.340208 946 0.340208 947 0.340208 948 0.0888228 949 0.0888228 950 0.0888228 951 0.0888228 952 0.0888228 953 0.0888228 954 0.0880492 955 0.0880492 956 0.0880492 957 0.0880492 958 0.0880492 959 0.0880492 966 0.342818 967 0.342818 968 0.342818 969 0.342818 970 0.342818 971 0.342818 972 0.091122 973 0.091122 974 0.091122 975 0.091122 976 0.091122 977 0.091122 978 0.0899847 979 0.0899847 980 0.0899847 981 0.0899847 982 0.0899847 983 0.0899847 984 0.000533675 985 0.000533675 986 0.000533675 987 0.000533675 988 0.000533675 989 0.000533675 990 0.354177 991 0.354177 992 0.354177 993 0.354177 994 0.354177 995 0.354177 996 0.0924905 997 0.0924905 998 0.0924905 999 0.0924905 1000 0.0924905 1001 0.0924905 1002 0.091955 1003 0.091955 1004 0.091955 1005 0.091955 1006 0.091955 1007 0.091955 1008 0.00144082 1009 0.00144082 1010 0.00144082 1011 0.00144082 1012 0.00144082 1013 0.00144082 1014 0.360798 1015 0.360798 1016 0.360798 1017 0.360798 1018 0.360798 1019 0.360798 1020 0.0929747 1021 0.0929747 1022 0.0929747 1023 0.0929747 1024 0.0929747 1025 0.0929747 1026 0.0928345 1027 0.0928345 1028 0.0928345 1029 0.0928345 1030 0.0928345 1031 0.0928345 1032 0.00169879 1033 0.00169879 1034 0.00169879 1035 0.00169879 1036 0.00169879 1037 0.00169879 1038 0.363388 1039 0.363388 1040 0.363388 1041 0.363388 1042 0.363388 1043 0.363388 1044 0.0932003 1045 0.0932003 1046 0.0932003 1047 0.0932003 1048 0.0932003 1049 0.0932003 1050 0.093003 1051 0.093003 1052 0.093003 1053 0.093003 1054 0.093003 1055 0.093003 1056 0.00166017 1057 0.00166017 1058 0.00166017 1059 0.00166017 1060 0.00166017 1061 0.00166017 1062 0.361931 1063 0.361931 1064 0.361931 1065 0.361931 1066 0.361931 1067 0.361931 1068 0.0942117 1069 0.0942117 1070 0.0942117 1071 0.0942117 1072 0.0942117 1073 0.0942117 1074 0.0937487 1075 0.0937487 1076 0.0937487 1077 0.0937487 1078 0.0937487 1079 0.0937487 1080 0.00229049 1081 0.00229049 1082 0.00229049 1083 0.00229049 1084 0.00229049 1085 0.00229049 1086 0.36739 1087 0.36739 1088 0.36739 1089 0.36739 1090 0.36739 1091 0.36739 1092 0.36739 1093 0.0912135 1094 0.0912135 1095 0.0912135 1096 0.0912135 1097 0.0912135 1098 0.0912135 1099 0.0925583 1100 0.0925583 1101 0.0925583 1102 0.0925583 1103 0.0925583 1104 0.0925583 1105 0.00101537 1106 0.00101537 1107 0.00101537 1108 0.00101537 1109 0.00101537 1110 0.00101537 1111 0.358702 1112 0.358702 1113 0.358702 1114 0.358702 1115 0.358702 1116 0.358702 1117 0.0935701 1118 0.0935701 1119 0.0935701 1120 0.0935701 1121 0.0935701 1122 0.0935701 1123 0.0941694 1124 0.0941694 1125 0.0941694 1126 0.0941694 1127 0.0941694 1128 0.0941694 1129 0.00214052 1130 0.00214052 1131 0.00214052 1132 0.00214052 1133 0.00214052 1134 0.00214052 1135 0.367403 1136 0.367403 1137 0.367403 1138 0.367403 1139 0.367403 1140 0.367403 1141 0.344778 1142 0.344778 1143 0.344778 1144 0.344778 1145 0.344778 1146 0.344778 1147 0.341213 1148 0.341213 1149 0.341213 1150 0.341213 1151 0.341213 1152 0.341213 1153 0.338537 1154 0.338537 1155 0.338537 1156 0.338537 1157 0.338537 1158 0.338537 1159 0.340241 1160 0.340241 1161 0.340241 1162 0.340241 1163 0.340241 1164 0.340241 1165 0.344023 1166 0.344023 1167 0.344023 1168 0.344023 1169 0.344023 1170 0.344023 1171 0.355873 1172 0.355873 1173 0.355873 1174 0.355873 1175 0.355873 1176 0.355873 1177 0.360703 1178 0.360703 1179 0.360703 1180 0.360703 1181 0.360703 1182 0.360703 1183 0.362605 1184 0.362605 1185 0.362605 1186 0.362605 1187 0.362605 1188 0.362605 1189 0.361302 1190 0.361302 1191 0.361302 1192 0.361302 1193 0.361302 1194 0.361302 1195 0.369038 1196 0.369038 1197 0.369038 1198 0.369038 1199 0.369038 1200 0.369038 1201 0.355162 1202 0.355162 1203 0.355162 1204 0.355162 1205 0.355162 1206 0.355162 1207 0.366015 1208 0.366015 1209 0.366015 1210 0.366015 1211 0.366015 1212 0.366015 1225 0.34812 1226 0.34812 1227 0.34812 1228 0.34812 1229 0.34812 1230 0.34812 1243 0.342883 1244 0.342883 1245 0.342883 1246 0.342883 1247 0.342883 1248 0.342883 1261 0.339765 1262 0.339765 1263 0.339765 1264 0.339765 1265 0.339765 1266 0.339765 1279 0.33926 1280 0.33926 1281 0.33926 1282 0.33926 1283 0.33926 1284 0.33926 1297 0.341455 1298 0.341455 1299 0.341455 1300 0.341455 1301 0.341455 1302 0.341455 1303 0.000918913 1304 0.000918913 1305 0.000918913 1306 0.000918913 1307 0.000918913 1308 0.000918913 1309 0.000292073 1310 0.000292073 1311 0.000292073 1312 0.000292073 1313 0.000292073 1314 0.000292073 1315 0.350388 1316 0.350388 1317 0.350388 1318 0.350388 1319 0.350388 1320 0.350388 1321 0.00168926 1322 0.00168926 1323 0.00168926 1324 0.00168926 1325 0.00168926 1326 0.00168926 1327 0.00134689 1328 0.00134689 1329 0.00134689 1330 0.00134689 1331 0.00134689 1332 0.00134689 1333 0.359153 1334 0.359153 1335 0.359153 1336 0.359153 1337 0.359153 1338 0.359153 1339 0.00173533 1340 0.00173533 1341 0.00173533 1342 0.00173533 1343 0.00173533 1344 0.00173533 1345 0.00181556 1346 0.00181556 1347 0.00181556 1348 0.00181556 1349 0.00181556 1350 0.00181556 1351 0.362299 1352 0.362299 1353 0.362299 1354 0.362299 1355 0.362299 1356 0.362299 1357 0.00192899 1358 0.00192899 1359 0.00192899 1360 0.00192899 1361 0.00192899 1362 0.00192899 1363 0.00163853 1364 0.00163853 1365 0.00163853 1366 0.00163853 1367 0.00163853 1368 0.00163853 1369 0.361682 1370 0.361682 1371 0.361682 1372 0.361682 1373 0.361682 1374 0.361682 1375 0.00244343 1376 0.00244343 1377 0.00244343 1378 0.00244343 1379 0.00244343 1380 0.00244343 1381 0.00227117 1382 0.00227117 1383 0.00227117 1384 0.00227117 1385 0.00227117 1386 0.00227117 1387 0.365688 1388 0.365688 1389 0.365688 1390 0.365688 1391 0.365688 1392 0.000714292 1393 0.000714292 1394 0.000714292 1395 0.000714292 1396 0.000714292 1397 0.000714292 1398 0.00150722 1399 0.00150722 1400 0.00150722 1401 0.00150722 1402 0.00150722 1403 0.00150722 1404 0.36182 1405 0.36182 1406 0.36182 1407 0.36182 1408 0.36182 1409 0.36182 1410 0.00207305 1411 0.00207305 1412 0.00207305 1413 0.00207305 1414 0.00207305 1415 0.00207305 1416 0.00234353 1417 0.00234353 1418 0.00234353 1419 0.00234353 1420 0.00234353 1421 0.00234353 1422 0.368993 1423 0.368993 1424 0.368993 1425 0.368993 1426 0.368993 1427 0.368993 } } SourceGeometry TRUE { osg::Geometry { UniqueID 23 PrimitiveSetList 1 { DrawElementsUInt GL_TRIANGLES 0 1428 { 1141 653 12 1147 676 20 1153 693 28 1159 710 36 1165 727 44 1171 744 52 1177 761 60 1183 779 68 1189 796 76 1195 813 84 762 246 268 1201 847 4 1207 830 92 303 168 259 1213 852 116 1219 858 371 1225 448 103 1231 876 141 1237 882 377 1243 471 132 1249 900 162 1255 906 383 1261 488 154 1267 924 186 1273 930 389 1279 506 178 1285 948 208 1291 954 395 1297 523 200 1303 972 232 1309 978 401 1315 540 222 1321 996 253 1327 1002 407 1333 557 247 1339 1020 277 1345 1026 413 1351 574 269 1357 1044 297 1363 1050 419 1369 591 290 1375 1068 322 1381 1074 425 608 314 1086 1392 1093 110 1398 1099 431 1404 641 363 1410 1117 348 1416 1123 437 1422 625 336 853 1142 664 372 870 1143 871 104 654 877 1148 681 378 894 1149 895 133 677 901 1154 698 384 918 1155 919 155 694 925 1160 716 390 942 1161 943 179 711 949 1166 732 396 966 1167 967 201 728 973 1172 750 402 990 1173 991 223 745 997 1178 767 408 1014 1179 1015 248 763 1021 1184 785 414 1038 1185 1039 270 780 1045 1190 802 420 1062 1191 1063 291 797 1069 1196 819 426 1087 1197 1088 315 814 1094 1202 454 432 1111 1203 1112 364 848 1118 1208 835 438 1135 1209 1136 337 831 443 1214 460 96 864 1215 865 373 854 647 1220 866 0 658 1221 659 111 859 860 1226 872 112 455 1227 456 5 449 466 1232 477 122 888 1233 889 379 878 670 1238 890 8 461 1239 462 117 883 884 1244 896 118 665 1245 666 13 472 483 1250 494 147 912 1251 913 385 902 687 1256 914 16 478 1257 479 142 907 908 1262 920 143 682 1263 683 21 489 500 1268 512 169 936 1269 937 391 926 704 1274 938 24 495 1275 496 163 931 932 1280 944 164 699 1281 700 29 507 518 1286 528 192 960 1287 961 397 950 722 1292 962 32 513 1293 514 187 955 956 1298 968 188 717 1299 718 37 524 534 1304 546 214 984 1305 985 403 974 738 1310 986 40 529 1311 530 209 979 980 1316 992 210 733 1317 734 45 541 552 1322 562 238 1008 1323 1009 409 998 756 1328 1010 48 547 1329 548 233 1003 1004 1334 1016 234 751 1335 752 53 558 568 1340 579 260 1032 1341 1033 415 1022 773 1346 1034 56 563 1347 564 254 1027 1028 1352 1040 255 768 1353 769 61 575 585 1358 596 283 1056 1359 1057 421 1046 791 1364 1058 64 580 1365 581 278 1051 1052 1370 1064 279 786 1371 787 69 592 602 1376 614 304 1080 1377 1081 427 1070 808 1382 1082 72 597 1383 598 298 1075 1076 1387 1089 299 803 1388 804 77 609 636 1393 660 354 1105 1394 1106 433 1095 841 1399 1107 88 630 1400 631 349 1100 1101 1405 1113 350 836 1406 837 93 642 620 1411 632 328 1129 1412 1130 439 1119 825 1417 1131 80 615 1418 616 323 1124 1125 1423 1137 324 820 1424 821 85 626 667 1144 14 684 1150 22 701 1156 30 719 1162 38 735 1168 46 753 1174 54 770 1180 62 788 1186 70 805 1192 78 822 1198 86 473 15 655 105 450 365 451 6 849 798 316 610 338 643 832 87 815 627 317 339 816 79 799 611 593 781 292 594 71 782 576 764 271 577 63 765 559 746 249 560 55 747 729 202 542 543 47 730 525 712 203 526 39 713 695 156 508 509 31 696 678 134 490 491 23 679 474 106 135 714 180 204 452 850 366 644 94 833 817 340 628 748 224 250 157 136 341 137 158 492 475 656 107 457 1204 7 159 181 510 783 272 293 182 160 342 318 273 225 343 138 367 800 294 319 295 274 320 251 226 275 205 183 227 321 228 344 229 184 345 206 230 544 139 108 368 346 369 645 838 1210 95 637 1 648 444 671 97 445 9 672 467 688 123 468 17 689 484 705 148 485 25 706 723 193 501 502 33 724 519 739 194 520 41 740 757 239 535 536 49 758 553 774 240 554 57 775 792 284 569 570 65 793 809 305 586 587 73 810 826 329 603 604 81 827 621 842 330 622 89 843 355 638 649 331 306 605 98 124 356 776 261 241 463 1216 119 125 307 357 332 358 308 741 215 195 309 285 588 690 149 126 196 170 503 286 262 571 650 99 359 242 216 537 150 171 127 197 217 172 243 263 218 287 310 264 707 173 151 333 844 360 128 174 311 175 219 265 100 673 129 867 1222 374 873 1228 109 480 1234 144 891 1240 380 897 1246 140 497 1252 165 915 1258 386 921 1264 161 515 1270 189 939 1276 392 945 1282 185 531 1288 211 963 1294 398 969 1300 207 549 1306 235 987 1312 404 993 1318 231 565 1324 256 1011 1330 410 1017 1336 252 582 1342 280 1035 1348 416 1041 1354 276 599 1360 300 1059 1366 422 1065 1372 296 617 1378 325 1083 1384 428 1389 612 1090 661 1395 113 1108 1401 434 1114 1407 370 633 1413 351 1132 1419 440 1138 1425 347 120 855 668 856 375 1145 1146 874 657 145 879 685 880 381 1151 1152 898 680 166 903 702 904 387 1157 1158 922 697 190 927 720 928 393 1163 1164 946 715 212 951 736 952 399 1169 1170 970 731 236 975 754 976 405 1175 1176 994 749 257 999 771 1000 411 1181 1182 1018 766 281 1023 789 1024 417 1187 1188 1042 784 301 1047 806 1048 423 1193 1194 1066 801 326 1071 823 1072 429 1199 1200 1091 818 114 1096 458 1097 435 1205 1206 1115 851 352 1120 839 1121 441 1211 1212 1139 834 10 446 464 447 101 1217 1218 868 857 102 651 869 652 2 1223 1224 662 861 376 862 875 863 115 1229 1230 459 453 18 469 481 470 130 1235 1236 892 881 131 674 893 675 11 1241 1242 465 885 382 886 899 887 121 1247 1248 669 476 26 486 498 487 152 1253 1254 916 905 153 691 917 692 19 1259 1260 482 909 388 910 923 911 146 1265 1266 686 493 34 504 516 505 176 1271 1272 940 929 177 708 941 709 27 1277 1278 499 933 394 934 947 935 167 1283 1284 703 511 42 521 532 522 198 1289 1290 964 953 199 725 965 726 35 1295 1296 517 957 400 958 971 959 191 1301 1302 721 527 50 538 550 539 220 1307 1308 988 977 221 742 989 743 43 1313 1314 533 981 406 982 995 983 213 1319 1320 737 545 58 555 566 556 244 1325 1326 1012 1001 245 759 1013 760 51 1331 1332 551 1005 412 1006 1019 1007 237 1337 1338 755 561 66 572 583 573 266 1343 1344 1036 1025 267 777 1037 778 59 1349 1350 567 1029 418 1030 1043 1031 258 1355 1356 772 578 74 589 600 590 288 1361 1362 1060 1049 289 794 1061 795 67 1367 1368 584 1053 424 1054 1067 1055 282 1373 1374 790 595 82 606 618 607 312 1379 1380 1084 1073 313 811 1085 812 75 1385 1386 601 1077 430 1078 1092 1079 302 1390 1391 807 613 3 639 663 640 361 1396 1397 1109 1098 362 845 1110 846 90 1402 1403 634 1102 436 1103 1116 1104 353 1408 1409 840 646 91 623 635 624 334 1414 1415 1133 1122 335 828 1134 829 83 1420 1421 619 1126 442 1127 1140 1128 327 1426 1427 824 629 } } VertexData { Array TRUE ArrayID 3 Vec3fArray 1428 { 0 0.0499999 -0.0499999 0 0.0499999 -0.0499999 0 0.0499999 -0.0499999 0 0.0499999 -0.0499999 0 0.0499999 0.0499999 0 0.0499999 0.0499999 0 0.0499999 0.0499999 0 0.0499999 0.0499999 0.025 0.0433012 -0.0499999 0.025 0.0433012 -0.0499999 0.025 0.0433012 -0.0499999 0.025 0.0433012 -0.0499999 0.025 0.0433012 0.0499999 0.025 0.0433012 0.0499999 0.025 0.0433012 0.0499999 0.025 0.0433012 0.0499999 0.0433012 0.025 -0.0499999 0.0433012 0.025 -0.0499999 0.0433012 0.025 -0.0499999 0.0433012 0.025 -0.0499999 0.0433012 0.025 0.0499999 0.0433012 0.025 0.0499999 0.0433012 0.025 0.0499999 0.0433012 0.025 0.0499999 0.0499999 0 -0.0499999 0.0499999 0 -0.0499999 0.0499999 0 -0.0499999 0.0499999 0 -0.0499999 0.0499999 0 0.0499999 0.0499999 0 0.0499999 0.0499999 0 0.0499999 0.0499999 0 0.0499999 0.0433012 -0.025 -0.0499999 0.0433012 -0.025 -0.0499999 0.0433012 -0.025 -0.0499999 0.0433012 -0.025 -0.0499999 0.0433012 -0.025 0.0499999 0.0433012 -0.025 0.0499999 0.0433012 -0.025 0.0499999 0.0433012 -0.025 0.0499999 0.025 -0.0433012 -0.0499999 0.025 -0.0433012 -0.0499999 0.025 -0.0433012 -0.0499999 0.025 -0.0433012 -0.0499999 0.025 -0.0433012 0.0499999 0.025 -0.0433012 0.0499999 0.025 -0.0433012 0.0499999 0.025 -0.0433012 0.0499999 0 -0.0499999 -0.0499999 0 -0.0499999 -0.0499999 0 -0.0499999 -0.0499999 0 -0.0499999 -0.0499999 0 -0.0499999 0.0499999 0 -0.0499999 0.0499999 0 -0.0499999 0.0499999 0 -0.0499999 0.0499999 -0.025 -0.0433012 -0.0499999 -0.025 -0.0433012 -0.0499999 -0.025 -0.0433012 -0.0499999 -0.025 -0.0433012 -0.0499999 -0.025 -0.0433012 0.0499999 -0.025 -0.0433012 0.0499999 -0.025 -0.0433012 0.0499999 -0.025 -0.0433012 0.0499999 -0.0433012 -0.025 -0.0499999 -0.0433012 -0.025 -0.0499999 -0.0433012 -0.025 -0.0499999 -0.0433012 -0.025 -0.0499999 -0.0433012 -0.025 0.0499999 -0.0433012 -0.025 0.0499999 -0.0433012 -0.025 0.0499999 -0.0433012 -0.025 0.0499999 -0.0499999 0 -0.0499999 -0.0499999 0 -0.0499999 -0.0499999 0 -0.0499999 -0.0499999 0 -0.0499999 -0.0499999 0 0.0499999 -0.0499999 0 0.0499999 -0.0499999 0 0.0499999 -0.0499999 0 0.0499999 -0.0433013 0.025 -0.0499999 -0.0433013 0.025 -0.0499999 -0.0433013 0.025 -0.0499999 -0.0433013 0.025 -0.0499999 -0.0433013 0.025 0.0499999 -0.0433013 0.025 0.0499999 -0.0433013 0.025 0.0499999 -0.0433013 0.025 0.0499999 -0.025 0.0433012 -0.0499999 -0.025 0.0433012 -0.0499999 -0.025 0.0433012 -0.0499999 -0.025 0.0433012 -0.0499999 -0.025 0.0433012 0.0499999 -0.025 0.0433012 0.0499999 -0.025 0.0433012 0.0499999 -0.025 0.0433012 0.0499999 0.0125 0.0466506 -0.0499999 0.0125 0.0466506 -0.0499999 0.0125 0.0466506 -0.0499999 0.0125 0.0466506 -0.0499999 0.0125 0.0466506 -0.0499999 0.0125 0.0466506 -0.0499999 0.0125 0.0466506 -0.0499999 0.0125 0.0466506 0.0499999 0.0125 0.0466506 0.0499999 0.0125 0.0466506 0.0499999 0.0125 0.0466506 0.0499999 0.0125 0.0466506 0.0499999 0.0125 0.0466506 0.0499999 0.0125 0.0466506 0.0499999 0 0.0499999 0 0 0.0499999 0 0 0.0499999 0 0 0.0499999 0 0 0.0499999 0 0 0.0499999 0 0.025 0.0433012 0 0.025 0.0433012 0 0.025 0.0433012 0 0.025 0.0433012 0 0.025 0.0433012 0 0.025 0.0433012 0 0.0341506 0.0341506 -0.0499999 0.0341506 0.0341506 -0.0499999 0.0341506 0.0341506 -0.0499999 0.0341506 0.0341506 -0.0499999 0.0341506 0.0341506 -0.0499999 0.0341506 0.0341506 -0.0499999 0.0341506 0.0341506 -0.0499999 0.0341506 0.0341506 -0.0499999 0.0341506 0.0341506 -0.0499999 0.0341506 0.0341506 -0.0499999 0.0341506 0.0341506 0.0499999 0.0341506 0.0341506 0.0499999 0.0341506 0.0341506 0.0499999 0.0341506 0.0341506 0.0499999 0.0341506 0.0341506 0.0499999 0.0341506 0.0341506 0.0499999 0.0341506 0.0341506 0.0499999 0.0341506 0.0341506 0.0499999 0.0341506 0.0341506 0.0499999 0.0433012 0.025 0 0.0433012 0.025 0 0.0433012 0.025 0 0.0433012 0.025 0 0.0433012 0.025 0 0.0433012 0.025 0 0.0466506 0.0125 -0.0499999 0.0466506 0.0125 -0.0499999 0.0466506 0.0125 -0.0499999 0.0466506 0.0125 -0.0499999 0.0466506 0.0125 -0.0499999 0.0466506 0.0125 -0.0499999 0.0466506 0.0125 -0.0499999 0.0466506 0.0125 0.0499999 0.0466506 0.0125 0.0499999 0.0466506 0.0125 0.0499999 0.0466506 0.0125 0.0499999 0.0466506 0.0125 0.0499999 0.0466506 0.0125 0.0499999 0.0466506 0.0125 0.0499999 0.0466506 0.0125 0.0499999 0.0499999 0 0 0.0499999 0 0 0.0499999 0 0 0.0499999 0 0 0.0499999 0 0 0.0499999 0 0 0.0466506 -0.0125 -0.0499999 0.0466506 -0.0125 -0.0499999 0.0466506 -0.0125 -0.0499999 0.0466506 -0.0125 -0.0499999 0.0466506 -0.0125 -0.0499999 0.0466506 -0.0125 -0.0499999 0.0466506 -0.0125 -0.0499999 0.0466506 -0.0125 -0.0499999 0.0466506 -0.0125 -0.0499999 0.0466506 -0.0125 -0.0499999 0.0466506 -0.0125 0.0499999 0.0466506 -0.0125 0.0499999 0.0466506 -0.0125 0.0499999 0.0466506 -0.0125 0.0499999 0.0466506 -0.0125 0.0499999 0.0466506 -0.0125 0.0499999 0.0466506 -0.0125 0.0499999 0.0466506 -0.0125 0.0499999 0.0433012 -0.025 0 0.0433012 -0.025 0 0.0433012 -0.025 0 0.0433012 -0.025 0 0.0433012 -0.025 0 0.0433012 -0.025 0 0.0341506 -0.0341506 -0.0499999 0.0341506 -0.0341506 -0.0499999 0.0341506 -0.0341506 -0.0499999 0.0341506 -0.0341506 -0.0499999 0.0341506 -0.0341506 -0.0499999 0.0341506 -0.0341506 -0.0499999 0.0341506 -0.0341506 -0.0499999 0.0341506 -0.0341506 -0.0499999 0.0341506 -0.0341506 0.0499999 0.0341506 -0.0341506 0.0499999 0.0341506 -0.0341506 0.0499999 0.0341506 -0.0341506 0.0499999 0.0341506 -0.0341506 0.0499999 0.0341506 -0.0341506 0.0499999 0.0341506 -0.0341506 0.0499999 0.0341506 -0.0341506 0.0499999 0.025 -0.0433012 0 0.025 -0.0433012 0 0.025 -0.0433012 0 0.025 -0.0433012 0 0.025 -0.0433012 0 0.025 -0.0433012 0 0.0125 -0.0466506 -0.0499999 0.0125 -0.0466506 -0.0499999 0.0125 -0.0466506 -0.0499999 0.0125 -0.0466506 -0.0499999 0.0125 -0.0466506 -0.0499999 0.0125 -0.0466506 -0.0499999 0.0125 -0.0466506 -0.0499999 0.0125 -0.0466506 -0.0499999 0.0125 -0.0466506 0.0499999 0.0125 -0.0466506 0.0499999 0.0125 -0.0466506 0.0499999 0.0125 -0.0466506 0.0499999 0.0125 -0.0466506 0.0499999 0.0125 -0.0466506 0.0499999 0.0125 -0.0466506 0.0499999 0.0125 -0.0466506 0.0499999 0.0125 -0.0466506 0.0499999 0.0125 -0.0466506 0.0499999 0 -0.0499999 0 0 -0.0499999 0 0 -0.0499999 0 0 -0.0499999 0 0 -0.0499999 0 0 -0.0499999 0 -0.0125 -0.0466506 -0.0499999 -0.0125 -0.0466506 -0.0499999 -0.0125 -0.0466506 -0.0499999 -0.0125 -0.0466506 -0.0499999 -0.0125 -0.0466506 -0.0499999 -0.0125 -0.0466506 -0.0499999 -0.0125 -0.0466506 -0.0499999 -0.0125 -0.0466506 -0.0499999 -0.0125 -0.0466506 0.0499999 -0.0125 -0.0466506 0.0499999 -0.0125 -0.0466506 0.0499999 -0.0125 -0.0466506 0.0499999 -0.0125 -0.0466506 0.0499999 -0.0125 -0.0466506 0.0499999 -0.0125 -0.0466506 0.0499999 -0.025 -0.0433012 0 -0.025 -0.0433012 0 -0.025 -0.0433012 0 -0.025 -0.0433012 0 -0.025 -0.0433012 0 -0.025 -0.0433012 0 -0.0341506 -0.0341506 -0.0499999 -0.0341506 -0.0341506 -0.0499999 -0.0341506 -0.0341506 -0.0499999 -0.0341506 -0.0341506 -0.0499999 -0.0341506 -0.0341506 -0.0499999 -0.0341506 -0.0341506 -0.0499999 -0.0341506 -0.0341506 -0.0499999 -0.0341506 -0.0341506 -0.0499999 -0.0341506 -0.0341506 -0.0499999 -0.0341506 -0.0341506 0.0499999 -0.0341506 -0.0341506 0.0499999 -0.0341506 -0.0341506 0.0499999 -0.0341506 -0.0341506 0.0499999 -0.0341506 -0.0341506 0.0499999 -0.0341506 -0.0341506 0.0499999 -0.0341506 -0.0341506 0.0499999 -0.0341506 -0.0341506 0.0499999 -0.0341506 -0.0341506 0.0499999 -0.0433012 -0.025 0 -0.0433012 -0.025 0 -0.0433012 -0.025 0 -0.0433012 -0.025 0 -0.0433012 -0.025 0 -0.0433012 -0.025 0 -0.0466506 -0.0125 -0.0499999 -0.0466506 -0.0125 -0.0499999 -0.0466506 -0.0125 -0.0499999 -0.0466506 -0.0125 -0.0499999 -0.0466506 -0.0125 -0.0499999 -0.0466506 -0.0125 -0.0499999 -0.0466506 -0.0125 -0.0499999 -0.0466506 -0.0125 0.0499999 -0.0466506 -0.0125 0.0499999 -0.0466506 -0.0125 0.0499999 -0.0466506 -0.0125 0.0499999 -0.0466506 -0.0125 0.0499999 -0.0466506 -0.0125 0.0499999 -0.0466506 -0.0125 0.0499999 -0.0499999 0 0 -0.0499999 0 0 -0.0499999 0 0 -0.0499999 0 0 -0.0499999 0 0 -0.0499999 0 0 -0.0466506 0.0124999 -0.0499999 -0.0466506 0.0124999 -0.0499999 -0.0466506 0.0124999 -0.0499999 -0.0466506 0.0124999 -0.0499999 -0.0466506 0.0124999 -0.0499999 -0.0466506 0.0124999 -0.0499999 -0.0466506 0.0124999 -0.0499999 -0.0466506 0.0124999 -0.0499999 -0.0466506 0.0124999 -0.0499999 -0.0466506 0.0124999 -0.0499999 -0.0466506 0.0124999 -0.0499999 -0.0466506 0.0124999 0.0499999 -0.0466506 0.0124999 0.0499999 -0.0466506 0.0124999 0.0499999 -0.0466506 0.0124999 0.0499999 -0.0466506 0.0124999 0.0499999 -0.0466506 0.0124999 0.0499999 -0.0466506 0.0124999 0.0499999 -0.0466506 0.0124999 0.0499999 -0.0433013 0.025 0 -0.0433013 0.025 0 -0.0433013 0.025 0 -0.0433013 0.025 0 -0.0433013 0.025 0 -0.0433013 0.025 0 -0.0341507 0.0341506 -0.0499999 -0.0341507 0.0341506 -0.0499999 -0.0341507 0.0341506 -0.0499999 -0.0341507 0.0341506 -0.0499999 -0.0341507 0.0341506 -0.0499999 -0.0341507 0.0341506 -0.0499999 -0.0341507 0.0341506 -0.0499999 -0.0341507 0.0341506 -0.0499999 -0.0341507 0.0341506 0.0499999 -0.0341507 0.0341506 0.0499999 -0.0341507 0.0341506 0.0499999 -0.0341507 0.0341506 0.0499999 -0.0341507 0.0341506 0.0499999 -0.0341507 0.0341506 0.0499999 -0.0341507 0.0341506 0.0499999 -0.0341507 0.0341506 0.0499999 -0.0341507 0.0341506 0.0499999 -0.0341507 0.0341506 0.0499999 -0.0341507 0.0341506 0.0499999 -0.0341507 0.0341506 0.0499999 -0.025 0.0433012 0 -0.025 0.0433012 0 -0.025 0.0433012 0 -0.025 0.0433012 0 -0.025 0.0433012 0 -0.025 0.0433012 0 -0.0125 0.0466506 -0.0499999 -0.0125 0.0466506 -0.0499999 -0.0125 0.0466506 -0.0499999 -0.0125 0.0466506 -0.0499999 -0.0125 0.0466506 -0.0499999 -0.0125 0.0466506 -0.0499999 -0.0125 0.0466506 -0.0499999 -0.0125 0.0466506 -0.0499999 -0.0125 0.0466506 -0.0499999 -0.0125 0.0466506 0.0499999 -0.0125 0.0466506 0.0499999 -0.0125 0.0466506 0.0499999 -0.0125 0.0466506 0.0499999 -0.0125 0.0466506 0.0499999 -0.0125 0.0466506 0.0499999 -0.0125 0.0466506 0.0499999 -0.0125 0.0466506 0.0499999 0.0125 0.0466506 0 0.0125 0.0466506 0 0.0125 0.0466506 0 0.0125 0.0466506 0 0.0125 0.0466506 0 0.0125 0.0466506 0 0.0341506 0.0341506 0 0.0341506 0.0341506 0 0.0341506 0.0341506 0 0.0341506 0.0341506 0 0.0341506 0.0341506 0 0.0341506 0.0341506 0 0.0466506 0.0125 0 0.0466506 0.0125 0 0.0466506 0.0125 0 0.0466506 0.0125 0 0.0466506 0.0125 0 0.0466506 0.0125 0 0.0466506 -0.0125 0 0.0466506 -0.0125 0 0.0466506 -0.0125 0 0.0466506 -0.0125 0 0.0466506 -0.0125 0 0.0466506 -0.0125 0 0.0341506 -0.0341506 0 0.0341506 -0.0341506 0 0.0341506 -0.0341506 0 0.0341506 -0.0341506 0 0.0341506 -0.0341506 0 0.0341506 -0.0341506 0 0.0125 -0.0466506 0 0.0125 -0.0466506 0 0.0125 -0.0466506 0 0.0125 -0.0466506 0 0.0125 -0.0466506 0 0.0125 -0.0466506 0 -0.0125 -0.0466506 0 -0.0125 -0.0466506 0 -0.0125 -0.0466506 0 -0.0125 -0.0466506 0 -0.0125 -0.0466506 0 -0.0125 -0.0466506 0 -0.0341506 -0.0341506 0 -0.0341506 -0.0341506 0 -0.0341506 -0.0341506 0 -0.0341506 -0.0341506 0 -0.0341506 -0.0341506 0 -0.0341506 -0.0341506 0 -0.0466506 -0.0125 0 -0.0466506 -0.0125 0 -0.0466506 -0.0125 0 -0.0466506 -0.0125 0 -0.0466506 -0.0125 0 -0.0466506 -0.0125 0 -0.0466506 0.0124999 0 -0.0466506 0.0124999 0 -0.0466506 0.0124999 0 -0.0466506 0.0124999 0 -0.0466506 0.0124999 0 -0.0466506 0.0124999 0 -0.0125 0.0466506 0 -0.0125 0.0466506 0 -0.0125 0.0466506 0 -0.0125 0.0466506 0 -0.0125 0.0466506 0 -0.0125 0.0466506 0 -0.0341507 0.0341506 0 -0.0341507 0.0341506 0 -0.0341507 0.0341506 0 -0.0341507 0.0341506 0 -0.0341507 0.0341506 0 -0.0341507 0.0341506 0 0.01875 0.0449759 -0.0499999 0.01875 0.0449759 -0.0499999 0.01875 0.0449759 -0.0499999 0.01875 0.0449759 -0.0499999 0.01875 0.0449759 -0.0499999 0.00624996 0.0483253 0.0499999 0.00624996 0.0483253 0.0499999 0.00624996 0.0483253 0.0499999 0.00624996 0.0483253 0.0499999 0.00624996 0.0483253 0.0499999 0.00624996 0.0483253 0.0499999 0 0.0499999 0.025 0 0.0499999 0.025 0 0.0499999 0.025 0 0.0499999 0.025 0 0.0499999 0.025 0 0.0499999 0.025 0.025 0.0433012 -0.025 0.025 0.0433012 -0.025 0.025 0.0433012 -0.025 0.025 0.0433012 -0.025 0.025 0.0433012 -0.025 0.025 0.0433012 -0.025 0.0387259 0.0295753 -0.0499999 0.0387259 0.0295753 -0.0499999 0.0387259 0.0295753 -0.0499999 0.0387259 0.0295753 -0.0499999 0.0387259 0.0295753 -0.0499999 0.0295753 0.0387259 0.0499999 0.0295753 0.0387259 0.0499999 0.0295753 0.0387259 0.0499999 0.0295753 0.0387259 0.0499999 0.0295753 0.0387259 0.0499999 0.0295753 0.0387259 0.0499999 0.0433012 0.025 -0.025 0.0433012 0.025 -0.025 0.0433012 0.025 -0.025 0.0433012 0.025 -0.025 0.0433012 0.025 -0.025 0.0433012 0.025 -0.025 0.0483253 0.00624996 -0.0499999 0.0483253 0.00624996 -0.0499999 0.0483253 0.00624996 -0.0499999 0.0483253 0.00624996 -0.0499999 0.0483253 0.00624996 -0.0499999 0.0449759 0.01875 0.0499999 0.0449759 0.01875 0.0499999 0.0449759 0.01875 0.0499999 0.0449759 0.01875 0.0499999 0.0449759 0.01875 0.0499999 0.0449759 0.01875 0.0499999 0.0499999 0 -0.025 0.0499999 0 -0.025 0.0499999 0 -0.025 0.0499999 0 -0.025 0.0499999 0 -0.025 0.0499999 0 -0.025 0.0449759 -0.01875 -0.0499999 0.0449759 -0.01875 -0.0499999 0.0449759 -0.01875 -0.0499999 0.0449759 -0.01875 -0.0499999 0.0449759 -0.01875 -0.0499999 0.0449759 -0.01875 -0.0499999 0.0483253 -0.00624996 0.0499999 0.0483253 -0.00624996 0.0499999 0.0483253 -0.00624996 0.0499999 0.0483253 -0.00624996 0.0499999 0.0483253 -0.00624996 0.0499999 0.0483253 -0.00624996 0.0499999 0.0433012 -0.025 -0.025 0.0433012 -0.025 -0.025 0.0433012 -0.025 -0.025 0.0433012 -0.025 -0.025 0.0433012 -0.025 -0.025 0.0433012 -0.025 -0.025 0.0295753 -0.0387259 -0.0499999 0.0295753 -0.0387259 -0.0499999 0.0295753 -0.0387259 -0.0499999 0.0295753 -0.0387259 -0.0499999 0.0295753 -0.0387259 -0.0499999 0.0387259 -0.0295753 0.0499999 0.0387259 -0.0295753 0.0499999 0.0387259 -0.0295753 0.0499999 0.0387259 -0.0295753 0.0499999 0.0387259 -0.0295753 0.0499999 0.025 -0.0433012 -0.025 0.025 -0.0433012 -0.025 0.025 -0.0433012 -0.025 0.025 -0.0433012 -0.025 0.025 -0.0433012 -0.025 0.025 -0.0433012 -0.025 0.00624996 -0.0483253 -0.0499999 0.00624996 -0.0483253 -0.0499999 0.00624996 -0.0483253 -0.0499999 0.00624996 -0.0483253 -0.0499999 0.00624996 -0.0483253 -0.0499999 0.00624996 -0.0483253 -0.0499999 0.01875 -0.0449759 0.0499999 0.01875 -0.0449759 0.0499999 0.01875 -0.0449759 0.0499999 0.01875 -0.0449759 0.0499999 0.01875 -0.0449759 0.0499999 0.01875 -0.0449759 0.0499999 0 -0.0499999 -0.025 0 -0.0499999 -0.025 0 -0.0499999 -0.025 0 -0.0499999 -0.025 0 -0.0499999 -0.025 0 -0.0499999 -0.025 -0.01875 -0.0449759 -0.0499999 -0.01875 -0.0449759 -0.0499999 -0.01875 -0.0449759 -0.0499999 -0.01875 -0.0449759 -0.0499999 -0.01875 -0.0449759 -0.0499999 -0.00624996 -0.0483253 0.0499999 -0.00624996 -0.0483253 0.0499999 -0.00624996 -0.0483253 0.0499999 -0.00624996 -0.0483253 0.0499999 -0.00624996 -0.0483253 0.0499999 -0.025 -0.0433012 -0.025 -0.025 -0.0433012 -0.025 -0.025 -0.0433012 -0.025 -0.025 -0.0433012 -0.025 -0.025 -0.0433012 -0.025 -0.025 -0.0433012 -0.025 -0.0387259 -0.0295753 -0.0499999 -0.0387259 -0.0295753 -0.0499999 -0.0387259 -0.0295753 -0.0499999 -0.0387259 -0.0295753 -0.0499999 -0.0387259 -0.0295753 -0.0499999 -0.0387259 -0.0295753 -0.0499999 -0.0295753 -0.0387259 0.0499999 -0.0295753 -0.0387259 0.0499999 -0.0295753 -0.0387259 0.0499999 -0.0295753 -0.0387259 0.0499999 -0.0295753 -0.0387259 0.0499999 -0.0433012 -0.025 -0.025 -0.0433012 -0.025 -0.025 -0.0433012 -0.025 -0.025 -0.0433012 -0.025 -0.025 -0.0433012 -0.025 -0.025 -0.0433012 -0.025 -0.025 -0.0483253 -0.00624996 -0.0499999 -0.0483253 -0.00624996 -0.0499999 -0.0483253 -0.00624996 -0.0499999 -0.0483253 -0.00624996 -0.0499999 -0.0483253 -0.00624996 -0.0499999 -0.0483253 -0.00624996 -0.0499999 -0.0449759 -0.01875 0.0499999 -0.0449759 -0.01875 0.0499999 -0.0449759 -0.01875 0.0499999 -0.0449759 -0.01875 0.0499999 -0.0449759 -0.01875 0.0499999 -0.0499999 0 -0.025 -0.0499999 0 -0.025 -0.0499999 0 -0.025 -0.0499999 0 -0.025 -0.0499999 0 -0.025 -0.0499999 0 -0.025 -0.0449759 0.01875 -0.0499999 -0.0449759 0.01875 -0.0499999 -0.0449759 0.01875 -0.0499999 -0.0449759 0.01875 -0.0499999 -0.0449759 0.01875 -0.0499999 -0.0449759 0.01875 -0.0499999 -0.0483253 0.00624996 0.0499999 -0.0483253 0.00624996 0.0499999 -0.0483253 0.00624996 0.0499999 -0.0483253 0.00624996 0.0499999 -0.0483253 0.00624996 0.0499999 -0.0483253 0.00624996 0.0499999 -0.0433013 0.025 -0.025 -0.0433013 0.025 -0.025 -0.0433013 0.025 -0.025 -0.0433013 0.025 -0.025 -0.0433013 0.025 -0.025 -0.0433013 0.025 -0.025 -0.0295753 0.0387259 -0.0499999 -0.0295753 0.0387259 -0.0499999 -0.0295753 0.0387259 -0.0499999 -0.0295753 0.0387259 -0.0499999 -0.0295753 0.0387259 -0.0499999 -0.038726 0.0295753 0.0499999 -0.038726 0.0295753 0.0499999 -0.038726 0.0295753 0.0499999 -0.038726 0.0295753 0.0499999 -0.038726 0.0295753 0.0499999 -0.025 0.0433012 -0.025 -0.025 0.0433012 -0.025 -0.025 0.0433012 -0.025 -0.025 0.0433012 -0.025 -0.025 0.0433012 -0.025 -0.025 0.0433012 -0.025 -0.00624996 0.0483253 -0.0499999 -0.00624996 0.0483253 -0.0499999 -0.00624996 0.0483253 -0.0499999 -0.00624996 0.0483253 -0.0499999 -0.00624996 0.0483253 -0.0499999 -0.01875 0.0449759 0.0499999 -0.01875 0.0449759 0.0499999 -0.01875 0.0449759 0.0499999 -0.01875 0.0449759 0.0499999 -0.01875 0.0449759 0.0499999 -0.01875 0.0449759 0.0499999 0.00624996 0.0483253 -0.0499999 0.00624996 0.0483253 -0.0499999 0.00624996 0.0483253 -0.0499999 0.00624996 0.0483253 -0.0499999 0.00624996 0.0483253 -0.0499999 0.00624996 0.0483253 -0.0499999 0.01875 0.0449759 0.0499999 0.01875 0.0449759 0.0499999 0.01875 0.0449759 0.0499999 0.01875 0.0449759 0.0499999 0.01875 0.0449759 0.0499999 0 0.0499999 -0.025 0 0.0499999 -0.025 0 0.0499999 -0.025 0 0.0499999 -0.025 0 0.0499999 -0.025 0 0.0499999 -0.025 0.025 0.0433012 0.025 0.025 0.0433012 0.025 0.025 0.0433012 0.025 0.025 0.0433012 0.025 0.025 0.0433012 0.025 0.025 0.0433012 0.025 0.0295753 0.0387259 -0.0499999 0.0295753 0.0387259 -0.0499999 0.0295753 0.0387259 -0.0499999 0.0295753 0.0387259 -0.0499999 0.0295753 0.0387259 -0.0499999 0.0295753 0.0387259 -0.0499999 0.0387259 0.0295753 0.0499999 0.0387259 0.0295753 0.0499999 0.0387259 0.0295753 0.0499999 0.0387259 0.0295753 0.0499999 0.0387259 0.0295753 0.0499999 0.0433012 0.025 0.025 0.0433012 0.025 0.025 0.0433012 0.025 0.025 0.0433012 0.025 0.025 0.0433012 0.025 0.025 0.0433012 0.025 0.025 0.0449759 0.01875 -0.0499999 0.0449759 0.01875 -0.0499999 0.0449759 0.01875 -0.0499999 0.0449759 0.01875 -0.0499999 0.0449759 0.01875 -0.0499999 0.0449759 0.01875 -0.0499999 0.0483253 0.00624996 0.0499999 0.0483253 0.00624996 0.0499999 0.0483253 0.00624996 0.0499999 0.0483253 0.00624996 0.0499999 0.0483253 0.00624996 0.0499999 0.0499999 0 0.025 0.0499999 0 0.025 0.0499999 0 0.025 0.0499999 0 0.025 0.0499999 0 0.025 0.0499999 0 0.025 0.0483253 -0.00624996 -0.0499999 0.0483253 -0.00624996 -0.0499999 0.0483253 -0.00624996 -0.0499999 0.0483253 -0.00624996 -0.0499999 0.0483253 -0.00624996 -0.0499999 0.0483253 -0.00624996 -0.0499999 0.0449759 -0.01875 0.0499999 0.0449759 -0.01875 0.0499999 0.0449759 -0.01875 0.0499999 0.0449759 -0.01875 0.0499999 0.0449759 -0.01875 0.0499999 0.0449759 -0.01875 0.0499999 0.0433012 -0.025 0.025 0.0433012 -0.025 0.025 0.0433012 -0.025 0.025 0.0433012 -0.025 0.025 0.0433012 -0.025 0.025 0.0433012 -0.025 0.025 0.0387259 -0.0295753 -0.0499999 0.0387259 -0.0295753 -0.0499999 0.0387259 -0.0295753 -0.0499999 0.0387259 -0.0295753 -0.0499999 0.0387259 -0.0295753 -0.0499999 0.0295753 -0.0387259 0.0499999 0.0295753 -0.0387259 0.0499999 0.0295753 -0.0387259 0.0499999 0.0295753 -0.0387259 0.0499999 0.0295753 -0.0387259 0.0499999 0.025 -0.0433012 0.025 0.025 -0.0433012 0.025 0.025 -0.0433012 0.025 0.025 -0.0433012 0.025 0.025 -0.0433012 0.025 0.025 -0.0433012 0.025 0.01875 -0.0449759 -0.0499999 0.01875 -0.0449759 -0.0499999 0.01875 -0.0449759 -0.0499999 0.01875 -0.0449759 -0.0499999 0.01875 -0.0449759 -0.0499999 0.01875 -0.0449759 -0.0499999 0.00624996 -0.0483253 0.0499999 0.00624996 -0.0483253 0.0499999 0.00624996 -0.0483253 0.0499999 0.00624996 -0.0483253 0.0499999 0.00624996 -0.0483253 0.0499999 0.00624996 -0.0483253 0.0499999 0 -0.0499999 0.025 0 -0.0499999 0.025 0 -0.0499999 0.025 0 -0.0499999 0.025 0 -0.0499999 0.025 0 -0.0499999 0.025 -0.00624996 -0.0483253 -0.0499999 -0.00624996 -0.0483253 -0.0499999 -0.00624996 -0.0483253 -0.0499999 -0.00624996 -0.0483253 -0.0499999 -0.00624996 -0.0483253 -0.0499999 -0.01875 -0.0449759 0.0499999 -0.01875 -0.0449759 0.0499999 -0.01875 -0.0449759 0.0499999 -0.01875 -0.0449759 0.0499999 -0.01875 -0.0449759 0.0499999 -0.01875 -0.0449759 0.0499999 -0.025 -0.0433012 0.025 -0.025 -0.0433012 0.025 -0.025 -0.0433012 0.025 -0.025 -0.0433012 0.025 -0.025 -0.0433012 0.025 -0.025 -0.0433012 0.025 -0.0295753 -0.0387259 -0.0499999 -0.0295753 -0.0387259 -0.0499999 -0.0295753 -0.0387259 -0.0499999 -0.0295753 -0.0387259 -0.0499999 -0.0295753 -0.0387259 -0.0499999 -0.0295753 -0.0387259 -0.0499999 -0.0387259 -0.0295753 0.0499999 -0.0387259 -0.0295753 0.0499999 -0.0387259 -0.0295753 0.0499999 -0.0387259 -0.0295753 0.0499999 -0.0387259 -0.0295753 0.0499999 -0.0387259 -0.0295753 0.0499999 -0.0433012 -0.025 0.025 -0.0433012 -0.025 0.025 -0.0433012 -0.025 0.025 -0.0433012 -0.025 0.025 -0.0433012 -0.025 0.025 -0.0433012 -0.025 0.025 -0.0449759 -0.01875 -0.0499999 -0.0449759 -0.01875 -0.0499999 -0.0449759 -0.01875 -0.0499999 -0.0449759 -0.01875 -0.0499999 -0.0449759 -0.01875 -0.0499999 -0.0483253 -0.00624996 0.0499999 -0.0483253 -0.00624996 0.0499999 -0.0483253 -0.00624996 0.0499999 -0.0483253 -0.00624996 0.0499999 -0.0483253 -0.00624996 0.0499999 -0.0483253 -0.00624996 0.0499999 -0.0499999 0 0.025 -0.0499999 0 0.025 -0.0499999 0 0.025 -0.0499999 0 0.025 -0.0499999 0 0.025 -0.0499999 0 0.025 -0.0483253 0.00624996 -0.0499999 -0.0483253 0.00624996 -0.0499999 -0.0483253 0.00624996 -0.0499999 -0.0483253 0.00624996 -0.0499999 -0.0483253 0.00624996 -0.0499999 -0.0449759 0.01875 0.0499999 -0.0449759 0.01875 0.0499999 -0.0449759 0.01875 0.0499999 -0.0449759 0.01875 0.0499999 -0.0449759 0.01875 0.0499999 -0.0449759 0.01875 0.0499999 -0.0433013 0.025 0.025 -0.0433013 0.025 0.025 -0.0433013 0.025 0.025 -0.0433013 0.025 0.025 -0.0433013 0.025 0.025 -0.0433013 0.025 0.025 -0.038726 0.0295753 -0.0499999 -0.038726 0.0295753 -0.0499999 -0.038726 0.0295753 -0.0499999 -0.038726 0.0295753 -0.0499999 -0.038726 0.0295753 -0.0499999 -0.0295753 0.0387259 0.0499999 -0.0295753 0.0387259 0.0499999 -0.0295753 0.0387259 0.0499999 -0.0295753 0.0387259 0.0499999 -0.0295753 0.0387259 0.0499999 -0.025 0.0433012 0.025 -0.025 0.0433012 0.025 -0.025 0.0433012 0.025 -0.025 0.0433012 0.025 -0.025 0.0433012 0.025 -0.025 0.0433012 0.025 -0.01875 0.0449759 -0.0499999 -0.01875 0.0449759 -0.0499999 -0.01875 0.0449759 -0.0499999 -0.01875 0.0449759 -0.0499999 -0.01875 0.0449759 -0.0499999 -0.01875 0.0449759 -0.0499999 -0.00624996 0.0483253 0.0499999 -0.00624996 0.0483253 0.0499999 -0.00624996 0.0483253 0.0499999 -0.00624996 0.0483253 0.0499999 -0.00624996 0.0483253 0.0499999 0.01875 0.0449759 0 0.01875 0.0449759 0 0.01875 0.0449759 0 0.01875 0.0449759 0 0.01875 0.0449759 0 0.01875 0.0449759 0 0.00624996 0.0483253 0 0.00624996 0.0483253 0 0.00624996 0.0483253 0 0.00624996 0.0483253 0 0.00624996 0.0483253 0 0.00624996 0.0483253 0 0.0125 0.0466506 -0.025 0.0125 0.0466506 -0.025 0.0125 0.0466506 -0.025 0.0125 0.0466506 -0.025 0.0125 0.0466506 -0.025 0.0125 0.0466506 -0.025 0.0125 0.0466506 0.025 0.0125 0.0466506 0.025 0.0125 0.0466506 0.025 0.0125 0.0466506 0.025 0.0125 0.0466506 0.025 0.0125 0.0466506 0.025 0.0387259 0.0295753 0 0.0387259 0.0295753 0 0.0387259 0.0295753 0 0.0387259 0.0295753 0 0.0387259 0.0295753 0 0.0387259 0.0295753 0 0.0295753 0.0387259 0 0.0295753 0.0387259 0 0.0295753 0.0387259 0 0.0295753 0.0387259 0 0.0295753 0.0387259 0 0.0295753 0.0387259 0 0.0341506 0.0341506 -0.025 0.0341506 0.0341506 -0.025 0.0341506 0.0341506 -0.025 0.0341506 0.0341506 -0.025 0.0341506 0.0341506 -0.025 0.0341506 0.0341506 -0.025 0.0341506 0.0341506 0.025 0.0341506 0.0341506 0.025 0.0341506 0.0341506 0.025 0.0341506 0.0341506 0.025 0.0341506 0.0341506 0.025 0.0341506 0.0341506 0.025 0.0483253 0.00624996 0 0.0483253 0.00624996 0 0.0483253 0.00624996 0 0.0483253 0.00624996 0 0.0483253 0.00624996 0 0.0483253 0.00624996 0 0.0449759 0.01875 0 0.0449759 0.01875 0 0.0449759 0.01875 0 0.0449759 0.01875 0 0.0449759 0.01875 0 0.0449759 0.01875 0 0.0466506 0.0125 -0.025 0.0466506 0.0125 -0.025 0.0466506 0.0125 -0.025 0.0466506 0.0125 -0.025 0.0466506 0.0125 -0.025 0.0466506 0.0125 -0.025 0.0466506 0.0125 0.025 0.0466506 0.0125 0.025 0.0466506 0.0125 0.025 0.0466506 0.0125 0.025 0.0466506 0.0125 0.025 0.0466506 0.0125 0.025 0.0449759 -0.01875 0 0.0449759 -0.01875 0 0.0449759 -0.01875 0 0.0449759 -0.01875 0 0.0449759 -0.01875 0 0.0449759 -0.01875 0 0.0483253 -0.00624996 0 0.0483253 -0.00624996 0 0.0483253 -0.00624996 0 0.0483253 -0.00624996 0 0.0483253 -0.00624996 0 0.0483253 -0.00624996 0 0.0466506 -0.0125 -0.025 0.0466506 -0.0125 -0.025 0.0466506 -0.0125 -0.025 0.0466506 -0.0125 -0.025 0.0466506 -0.0125 -0.025 0.0466506 -0.0125 -0.025 0.0466506 -0.0125 0.025 0.0466506 -0.0125 0.025 0.0466506 -0.0125 0.025 0.0466506 -0.0125 0.025 0.0466506 -0.0125 0.025 0.0466506 -0.0125 0.025 0.0295753 -0.0387259 0 0.0295753 -0.0387259 0 0.0295753 -0.0387259 0 0.0295753 -0.0387259 0 0.0295753 -0.0387259 0 0.0295753 -0.0387259 0 0.0387259 -0.0295753 0 0.0387259 -0.0295753 0 0.0387259 -0.0295753 0 0.0387259 -0.0295753 0 0.0387259 -0.0295753 0 0.0387259 -0.0295753 0 0.0341506 -0.0341506 -0.025 0.0341506 -0.0341506 -0.025 0.0341506 -0.0341506 -0.025 0.0341506 -0.0341506 -0.025 0.0341506 -0.0341506 -0.025 0.0341506 -0.0341506 -0.025 0.0341506 -0.0341506 0.025 0.0341506 -0.0341506 0.025 0.0341506 -0.0341506 0.025 0.0341506 -0.0341506 0.025 0.0341506 -0.0341506 0.025 0.0341506 -0.0341506 0.025 0.00624996 -0.0483253 0 0.00624996 -0.0483253 0 0.00624996 -0.0483253 0 0.00624996 -0.0483253 0 0.00624996 -0.0483253 0 0.00624996 -0.0483253 0 0.01875 -0.0449759 0 0.01875 -0.0449759 0 0.01875 -0.0449759 0 0.01875 -0.0449759 0 0.01875 -0.0449759 0 0.01875 -0.0449759 0 0.0125 -0.0466506 -0.025 0.0125 -0.0466506 -0.025 0.0125 -0.0466506 -0.025 0.0125 -0.0466506 -0.025 0.0125 -0.0466506 -0.025 0.0125 -0.0466506 -0.025 0.0125 -0.0466506 0.025 0.0125 -0.0466506 0.025 0.0125 -0.0466506 0.025 0.0125 -0.0466506 0.025 0.0125 -0.0466506 0.025 0.0125 -0.0466506 0.025 -0.01875 -0.0449759 0 -0.01875 -0.0449759 0 -0.01875 -0.0449759 0 -0.01875 -0.0449759 0 -0.01875 -0.0449759 0 -0.01875 -0.0449759 0 -0.00624996 -0.0483253 0 -0.00624996 -0.0483253 0 -0.00624996 -0.0483253 0 -0.00624996 -0.0483253 0 -0.00624996 -0.0483253 0 -0.00624996 -0.0483253 0 -0.0125 -0.0466506 -0.025 -0.0125 -0.0466506 -0.025 -0.0125 -0.0466506 -0.025 -0.0125 -0.0466506 -0.025 -0.0125 -0.0466506 -0.025 -0.0125 -0.0466506 -0.025 -0.0125 -0.0466506 0.025 -0.0125 -0.0466506 0.025 -0.0125 -0.0466506 0.025 -0.0125 -0.0466506 0.025 -0.0125 -0.0466506 0.025 -0.0125 -0.0466506 0.025 -0.0387259 -0.0295753 0 -0.0387259 -0.0295753 0 -0.0387259 -0.0295753 0 -0.0387259 -0.0295753 0 -0.0387259 -0.0295753 0 -0.0387259 -0.0295753 0 -0.0295753 -0.0387259 0 -0.0295753 -0.0387259 0 -0.0295753 -0.0387259 0 -0.0295753 -0.0387259 0 -0.0295753 -0.0387259 0 -0.0295753 -0.0387259 0 -0.0341506 -0.0341506 -0.025 -0.0341506 -0.0341506 -0.025 -0.0341506 -0.0341506 -0.025 -0.0341506 -0.0341506 -0.025 -0.0341506 -0.0341506 -0.025 -0.0341506 -0.0341506 -0.025 -0.0341506 -0.0341506 0.025 -0.0341506 -0.0341506 0.025 -0.0341506 -0.0341506 0.025 -0.0341506 -0.0341506 0.025 -0.0341506 -0.0341506 0.025 -0.0341506 -0.0341506 0.025 -0.0483253 -0.00624996 0 -0.0483253 -0.00624996 0 -0.0483253 -0.00624996 0 -0.0483253 -0.00624996 0 -0.0483253 -0.00624996 0 -0.0483253 -0.00624996 0 -0.0449759 -0.01875 0 -0.0449759 -0.01875 0 -0.0449759 -0.01875 0 -0.0449759 -0.01875 0 -0.0449759 -0.01875 0 -0.0449759 -0.01875 0 -0.0466506 -0.0125 -0.025 -0.0466506 -0.0125 -0.025 -0.0466506 -0.0125 -0.025 -0.0466506 -0.0125 -0.025 -0.0466506 -0.0125 -0.025 -0.0466506 -0.0125 -0.025 -0.0466506 -0.0125 0.025 -0.0466506 -0.0125 0.025 -0.0466506 -0.0125 0.025 -0.0466506 -0.0125 0.025 -0.0466506 -0.0125 0.025 -0.0466506 -0.0125 0.025 -0.0449759 0.01875 0 -0.0449759 0.01875 0 -0.0449759 0.01875 0 -0.0449759 0.01875 0 -0.0449759 0.01875 0 -0.0449759 0.01875 0 -0.0483253 0.00624996 0 -0.0483253 0.00624996 0 -0.0483253 0.00624996 0 -0.0483253 0.00624996 0 -0.0483253 0.00624996 0 -0.0483253 0.00624996 0 -0.0466506 0.0124999 -0.025 -0.0466506 0.0124999 -0.025 -0.0466506 0.0124999 -0.025 -0.0466506 0.0124999 -0.025 -0.0466506 0.0124999 -0.025 -0.0466506 0.0124999 -0.025 -0.0466506 0.0124999 0.025 -0.0466506 0.0124999 0.025 -0.0466506 0.0124999 0.025 -0.0466506 0.0124999 0.025 -0.0466506 0.0124999 0.025 -0.0466506 0.0124999 0.025 -0.0466506 0.0124999 0.025 -0.00624996 0.0483253 0 -0.00624996 0.0483253 0 -0.00624996 0.0483253 0 -0.00624996 0.0483253 0 -0.00624996 0.0483253 0 -0.00624996 0.0483253 0 -0.01875 0.0449759 0 -0.01875 0.0449759 0 -0.01875 0.0449759 0 -0.01875 0.0449759 0 -0.01875 0.0449759 0 -0.01875 0.0449759 0 -0.0125 0.0466506 -0.025 -0.0125 0.0466506 -0.025 -0.0125 0.0466506 -0.025 -0.0125 0.0466506 -0.025 -0.0125 0.0466506 -0.025 -0.0125 0.0466506 -0.025 -0.0125 0.0466506 0.025 -0.0125 0.0466506 0.025 -0.0125 0.0466506 0.025 -0.0125 0.0466506 0.025 -0.0125 0.0466506 0.025 -0.0125 0.0466506 0.025 -0.0295753 0.0387259 0 -0.0295753 0.0387259 0 -0.0295753 0.0387259 0 -0.0295753 0.0387259 0 -0.0295753 0.0387259 0 -0.0295753 0.0387259 0 -0.038726 0.0295753 0 -0.038726 0.0295753 0 -0.038726 0.0295753 0 -0.038726 0.0295753 0 -0.038726 0.0295753 0 -0.038726 0.0295753 0 -0.0341507 0.0341506 -0.025 -0.0341507 0.0341506 -0.025 -0.0341507 0.0341506 -0.025 -0.0341507 0.0341506 -0.025 -0.0341507 0.0341506 -0.025 -0.0341507 0.0341506 -0.025 -0.0341507 0.0341506 0.025 -0.0341507 0.0341506 0.025 -0.0341507 0.0341506 0.025 -0.0341507 0.0341506 0.025 -0.0341507 0.0341506 0.025 -0.0341507 0.0341506 0.025 0.01875 0.0449759 0.025 0.01875 0.0449759 0.025 0.01875 0.0449759 0.025 0.01875 0.0449759 0.025 0.01875 0.0449759 0.025 0.01875 0.0449759 0.025 0.0387259 0.0295753 0.025 0.0387259 0.0295753 0.025 0.0387259 0.0295753 0.025 0.0387259 0.0295753 0.025 0.0387259 0.0295753 0.025 0.0387259 0.0295753 0.025 0.0483253 0.00624996 0.025 0.0483253 0.00624996 0.025 0.0483253 0.00624996 0.025 0.0483253 0.00624996 0.025 0.0483253 0.00624996 0.025 0.0483253 0.00624996 0.025 0.0449759 -0.01875 0.025 0.0449759 -0.01875 0.025 0.0449759 -0.01875 0.025 0.0449759 -0.01875 0.025 0.0449759 -0.01875 0.025 0.0449759 -0.01875 0.025 0.0295753 -0.0387259 0.025 0.0295753 -0.0387259 0.025 0.0295753 -0.0387259 0.025 0.0295753 -0.0387259 0.025 0.0295753 -0.0387259 0.025 0.0295753 -0.0387259 0.025 0.00624996 -0.0483253 0.025 0.00624996 -0.0483253 0.025 0.00624996 -0.0483253 0.025 0.00624996 -0.0483253 0.025 0.00624996 -0.0483253 0.025 0.00624996 -0.0483253 0.025 -0.01875 -0.0449759 0.025 -0.01875 -0.0449759 0.025 -0.01875 -0.0449759 0.025 -0.01875 -0.0449759 0.025 -0.01875 -0.0449759 0.025 -0.01875 -0.0449759 0.025 -0.0387259 -0.0295753 0.025 -0.0387259 -0.0295753 0.025 -0.0387259 -0.0295753 0.025 -0.0387259 -0.0295753 0.025 -0.0387259 -0.0295753 0.025 -0.0387259 -0.0295753 0.025 -0.0483253 -0.00624996 0.025 -0.0483253 -0.00624996 0.025 -0.0483253 -0.00624996 0.025 -0.0483253 -0.00624996 0.025 -0.0483253 -0.00624996 0.025 -0.0483253 -0.00624996 0.025 -0.0449759 0.01875 0.025 -0.0449759 0.01875 0.025 -0.0449759 0.01875 0.025 -0.0449759 0.01875 0.025 -0.0449759 0.01875 0.025 -0.0449759 0.01875 0.025 -0.00624996 0.0483253 0.025 -0.00624996 0.0483253 0.025 -0.00624996 0.0483253 0.025 -0.00624996 0.0483253 0.025 -0.00624996 0.0483253 0.025 -0.00624996 0.0483253 0.025 -0.0295753 0.0387259 0.025 -0.0295753 0.0387259 0.025 -0.0295753 0.0387259 0.025 -0.0295753 0.0387259 0.025 -0.0295753 0.0387259 0.025 -0.0295753 0.0387259 0.025 0.01875 0.0449759 -0.025 0.01875 0.0449759 -0.025 0.01875 0.0449759 -0.025 0.01875 0.0449759 -0.025 0.01875 0.0449759 -0.025 0.01875 0.0449759 -0.025 0.00624996 0.0483253 -0.025 0.00624996 0.0483253 -0.025 0.00624996 0.0483253 -0.025 0.00624996 0.0483253 -0.025 0.00624996 0.0483253 -0.025 0.00624996 0.0483253 -0.025 0.00624996 0.0483253 0.025 0.00624996 0.0483253 0.025 0.00624996 0.0483253 0.025 0.00624996 0.0483253 0.025 0.00624996 0.0483253 0.025 0.00624996 0.0483253 0.025 0.0387259 0.0295753 -0.025 0.0387259 0.0295753 -0.025 0.0387259 0.0295753 -0.025 0.0387259 0.0295753 -0.025 0.0387259 0.0295753 -0.025 0.0387259 0.0295753 -0.025 0.0295753 0.0387259 -0.025 0.0295753 0.0387259 -0.025 0.0295753 0.0387259 -0.025 0.0295753 0.0387259 -0.025 0.0295753 0.0387259 -0.025 0.0295753 0.0387259 -0.025 0.0295753 0.0387259 0.025 0.0295753 0.0387259 0.025 0.0295753 0.0387259 0.025 0.0295753 0.0387259 0.025 0.0295753 0.0387259 0.025 0.0295753 0.0387259 0.025 0.0483253 0.00624996 -0.025 0.0483253 0.00624996 -0.025 0.0483253 0.00624996 -0.025 0.0483253 0.00624996 -0.025 0.0483253 0.00624996 -0.025 0.0483253 0.00624996 -0.025 0.0449759 0.01875 -0.025 0.0449759 0.01875 -0.025 0.0449759 0.01875 -0.025 0.0449759 0.01875 -0.025 0.0449759 0.01875 -0.025 0.0449759 0.01875 -0.025 0.0449759 0.01875 0.025 0.0449759 0.01875 0.025 0.0449759 0.01875 0.025 0.0449759 0.01875 0.025 0.0449759 0.01875 0.025 0.0449759 0.01875 0.025 0.0449759 -0.01875 -0.025 0.0449759 -0.01875 -0.025 0.0449759 -0.01875 -0.025 0.0449759 -0.01875 -0.025 0.0449759 -0.01875 -0.025 0.0449759 -0.01875 -0.025 0.0483253 -0.00624996 -0.025 0.0483253 -0.00624996 -0.025 0.0483253 -0.00624996 -0.025 0.0483253 -0.00624996 -0.025 0.0483253 -0.00624996 -0.025 0.0483253 -0.00624996 -0.025 0.0483253 -0.00624996 0.025 0.0483253 -0.00624996 0.025 0.0483253 -0.00624996 0.025 0.0483253 -0.00624996 0.025 0.0483253 -0.00624996 0.025 0.0483253 -0.00624996 0.025 0.0295753 -0.0387259 -0.025 0.0295753 -0.0387259 -0.025 0.0295753 -0.0387259 -0.025 0.0295753 -0.0387259 -0.025 0.0295753 -0.0387259 -0.025 0.0295753 -0.0387259 -0.025 0.0387259 -0.0295753 -0.025 0.0387259 -0.0295753 -0.025 0.0387259 -0.0295753 -0.025 0.0387259 -0.0295753 -0.025 0.0387259 -0.0295753 -0.025 0.0387259 -0.0295753 -0.025 0.0387259 -0.0295753 0.025 0.0387259 -0.0295753 0.025 0.0387259 -0.0295753 0.025 0.0387259 -0.0295753 0.025 0.0387259 -0.0295753 0.025 0.0387259 -0.0295753 0.025 0.00624996 -0.0483253 -0.025 0.00624996 -0.0483253 -0.025 0.00624996 -0.0483253 -0.025 0.00624996 -0.0483253 -0.025 0.00624996 -0.0483253 -0.025 0.00624996 -0.0483253 -0.025 0.01875 -0.0449759 -0.025 0.01875 -0.0449759 -0.025 0.01875 -0.0449759 -0.025 0.01875 -0.0449759 -0.025 0.01875 -0.0449759 -0.025 0.01875 -0.0449759 -0.025 0.01875 -0.0449759 0.025 0.01875 -0.0449759 0.025 0.01875 -0.0449759 0.025 0.01875 -0.0449759 0.025 0.01875 -0.0449759 0.025 0.01875 -0.0449759 0.025 -0.01875 -0.0449759 -0.025 -0.01875 -0.0449759 -0.025 -0.01875 -0.0449759 -0.025 -0.01875 -0.0449759 -0.025 -0.01875 -0.0449759 -0.025 -0.01875 -0.0449759 -0.025 -0.00624996 -0.0483253 -0.025 -0.00624996 -0.0483253 -0.025 -0.00624996 -0.0483253 -0.025 -0.00624996 -0.0483253 -0.025 -0.00624996 -0.0483253 -0.025 -0.00624996 -0.0483253 -0.025 -0.00624996 -0.0483253 0.025 -0.00624996 -0.0483253 0.025 -0.00624996 -0.0483253 0.025 -0.00624996 -0.0483253 0.025 -0.00624996 -0.0483253 0.025 -0.00624996 -0.0483253 0.025 -0.0387259 -0.0295753 -0.025 -0.0387259 -0.0295753 -0.025 -0.0387259 -0.0295753 -0.025 -0.0387259 -0.0295753 -0.025 -0.0387259 -0.0295753 -0.025 -0.0387259 -0.0295753 -0.025 -0.0295753 -0.0387259 -0.025 -0.0295753 -0.0387259 -0.025 -0.0295753 -0.0387259 -0.025 -0.0295753 -0.0387259 -0.025 -0.0295753 -0.0387259 -0.025 -0.0295753 -0.0387259 -0.025 -0.0295753 -0.0387259 0.025 -0.0295753 -0.0387259 0.025 -0.0295753 -0.0387259 0.025 -0.0295753 -0.0387259 0.025 -0.0295753 -0.0387259 0.025 -0.0295753 -0.0387259 0.025 -0.0483253 -0.00624996 -0.025 -0.0483253 -0.00624996 -0.025 -0.0483253 -0.00624996 -0.025 -0.0483253 -0.00624996 -0.025 -0.0483253 -0.00624996 -0.025 -0.0483253 -0.00624996 -0.025 -0.0449759 -0.01875 -0.025 -0.0449759 -0.01875 -0.025 -0.0449759 -0.01875 -0.025 -0.0449759 -0.01875 -0.025 -0.0449759 -0.01875 -0.025 -0.0449759 -0.01875 -0.025 -0.0449759 -0.01875 0.025 -0.0449759 -0.01875 0.025 -0.0449759 -0.01875 0.025 -0.0449759 -0.01875 0.025 -0.0449759 -0.01875 0.025 -0.0449759 -0.01875 0.025 -0.0449759 0.01875 -0.025 -0.0449759 0.01875 -0.025 -0.0449759 0.01875 -0.025 -0.0449759 0.01875 -0.025 -0.0449759 0.01875 -0.025 -0.0449759 0.01875 -0.025 -0.0483253 0.00624996 -0.025 -0.0483253 0.00624996 -0.025 -0.0483253 0.00624996 -0.025 -0.0483253 0.00624996 -0.025 -0.0483253 0.00624996 -0.025 -0.0483253 0.00624996 -0.025 -0.0483253 0.00624996 0.025 -0.0483253 0.00624996 0.025 -0.0483253 0.00624996 0.025 -0.0483253 0.00624996 0.025 -0.0483253 0.00624996 0.025 -0.00624996 0.0483253 -0.025 -0.00624996 0.0483253 -0.025 -0.00624996 0.0483253 -0.025 -0.00624996 0.0483253 -0.025 -0.00624996 0.0483253 -0.025 -0.00624996 0.0483253 -0.025 -0.01875 0.0449759 -0.025 -0.01875 0.0449759 -0.025 -0.01875 0.0449759 -0.025 -0.01875 0.0449759 -0.025 -0.01875 0.0449759 -0.025 -0.01875 0.0449759 -0.025 -0.01875 0.0449759 0.025 -0.01875 0.0449759 0.025 -0.01875 0.0449759 0.025 -0.01875 0.0449759 0.025 -0.01875 0.0449759 0.025 -0.01875 0.0449759 0.025 -0.0295753 0.0387259 -0.025 -0.0295753 0.0387259 -0.025 -0.0295753 0.0387259 -0.025 -0.0295753 0.0387259 -0.025 -0.0295753 0.0387259 -0.025 -0.0295753 0.0387259 -0.025 -0.038726 0.0295753 -0.025 -0.038726 0.0295753 -0.025 -0.038726 0.0295753 -0.025 -0.038726 0.0295753 -0.025 -0.038726 0.0295753 -0.025 -0.038726 0.0295753 -0.025 -0.038726 0.0295753 0.025 -0.038726 0.0295753 0.025 -0.038726 0.0295753 0.025 -0.038726 0.0295753 0.025 -0.038726 0.0295753 0.025 -0.038726 0.0295753 0.025 } Indices FALSE Binding BIND_PER_VERTEX Normalize 0 } NormalData { Array TRUE ArrayID 4 Vec3fArray 1428 { 0.258819 0.965926 0 0 0 -1 0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 0.258819 0.965926 0 0 0 1 -0.258819 0.965926 0 0.707107 0.707107 0 0 0 -1 0.258819 0.965926 0 0.707107 0.707107 0 0.258819 0.965926 0 0.707107 0.707107 0 0.258819 0.965926 0 0 0 1 0.965926 0.258819 0 0 0 -1 0.707107 0.707107 0 0.965926 0.258819 0 0.707107 0.707107 0 0.965926 0.258819 0 0.707107 0.707107 0 0 0 1 0.965926 -0.258819 0 0 0 -1 0.965926 0.258819 0 0.965926 -0.258819 0 0.965926 0.258819 0 0.965926 -0.258819 0 0.965926 0.258819 0 0 0 1 0.707107 -0.707107 0 0 0 -1 0.965926 -0.258819 0 0.707107 -0.707107 0 0.965926 -0.258819 0 0.707107 -0.707107 0 0.965926 -0.258819 0 0 0 1 0.258819 -0.965926 0 0 0 -1 0.707107 -0.707107 0 0.258819 -0.965926 0 0.707107 -0.707107 0 0.258819 -0.965926 0 0.707107 -0.707107 0 0 0 1 -0.258819 -0.965926 0 0 0 -1 0.258819 -0.965926 0 -0.258819 -0.965926 0 0.258819 -0.965926 0 -0.258819 -0.965926 0 0.258819 -0.965926 0 0 0 1 -0.707107 -0.707107 0 0 0 -1 -0.258819 -0.965926 0 -0.707107 -0.707107 0 -0.258819 -0.965926 0 -0.707107 -0.707107 0 -0.258819 -0.965926 0 0 0 1 -0.965926 -0.25882 0 0 0 -1 -0.707106 -0.707107 0 -0.965926 -0.25882 0 -0.707106 -0.707107 0 -0.965926 -0.25882 0 -0.707106 -0.707107 0 0 0 1 -0.965926 0.258819 0 0 0 -1 -0.965926 -0.25882 0 -0.965926 0.258819 0 -0.965926 -0.25882 0 -0.965926 0.258819 0 -0.965926 -0.25882 0 0 0 1 -0.707107 0.707106 0 0 0 -1 -0.965926 0.258819 0 -0.707107 0.707106 0 -0.965926 0.258819 0 -0.707107 0.707106 0 -0.965926 0.258819 0 0 0 1 -0.258819 0.965926 0 0 0 -1 -0.258819 0.965926 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.258819 0.965926 0 0 0 1 -0.707107 0.707106 0 0.258819 0.965926 0 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0 0 1 0 0 1 0 0 1 0 0 1 0.258819 0.965926 0 -0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.707107 0.707107 0 0.707107 0.707107 0 0.258819 0.965926 0 0.258819 0.965926 0 0.707107 0.707107 0 0.707107 0.707107 0 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0.707107 0.707107 0 0.707106 0.707107 0 0.707106 0.707107 0 0.707107 0.707107 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0.707106 0.707107 0 0.707107 0.707107 0 0.965926 0.258819 0 0.965926 0.258819 0 0.707107 0.707107 0 0.707107 0.707107 0 0.965926 0.258819 0 0.965926 0.258819 0 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 -0.258819 0 0 0 -1 0.965926 -0.258819 0 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0.965926 -0.258819 0 0.965926 -0.258819 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0.707107 -0.707107 0 0.707107 -0.707107 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0.258819 -0.965926 0 0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 -0.258819 -0.965926 0 -0.258819 -0.965926 0 0 0 1 -0.258819 -0.965926 0 -0.258819 -0.965926 0 0 0 1 0 0 1 0 0 1 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.707107 -0.707107 0 -0.707107 -0.707107 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.707107 -0.707107 0 0 0 -1 -0.707107 -0.707107 0 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 -0.707107 -0.707107 0 -0.707106 -0.707107 0 0 0 1 -0.707106 -0.707107 0 -0.707107 -0.707107 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 -0.707106 -0.707107 0 -0.707106 -0.707107 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.707106 -0.707107 0 -0.707106 -0.707107 0 -0.965926 -0.25882 0 -0.965926 -0.258819 0 0 0 -1 0 0 -1 0 0 -1 0 0 -1 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 -0.25882 0 -0.965926 -0.258819 0 0 0 1 0 0 1 0 0 1 0 0 1 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 0.258819 0 0 0 -1 -0.965926 0.258819 0 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 -0.965926 0.258819 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.707107 0.707106 0 -0.707107 0.707106 0 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.258819 0.965926 0 -0.25882 0.965926 0 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 -0.25882 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.25882 0.965926 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 -0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.707106 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707106 0.707107 0 0.707107 0.707107 0 0.707106 0.707107 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.258819 0.965926 0 -0.25882 0.965926 0 -0.25882 0.965926 0 -0.258819 0.965926 0 -0.25882 0.965926 0 -0.258819 0.965926 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 0.258819 0.965926 0 0 0 -1 0 0 -1 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0 0 1 0 0 1 0 0 1 0.258819 0.965926 0 -0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.707107 0.707107 0 0.707107 0.707107 0 0.258819 0.965926 0 0.258819 0.965926 0 0.707107 0.707107 0 0.707107 0.707107 0 0 0 -1 0 0 -1 0.707107 0.707107 0 0.707107 0.707107 0 0.707106 0.707107 0 0.707107 0.707107 0 0 0 1 0 0 1 0 0 1 0.707107 0.707107 0 0.707107 0.707107 0 0.965926 0.258819 0 0.965926 0.258819 0 0.707107 0.707107 0 0.707107 0.707107 0 0.965926 0.258819 0 0.965926 0.258819 0 0 0 -1 0 0 -1 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0 0 1 0 0 1 0 0 1 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0 0 -1 0 0 -1 0 0 -1 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0 0 1 0 0 1 0 0 1 0.965926 -0.258819 0 0.965926 -0.258819 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0 0 -1 0 0 -1 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0 0 1 0 0 1 0.707107 -0.707107 0 0.707107 -0.707107 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0 0 -1 0 0 -1 0 0 -1 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0 0 1 0 0 1 0 0 1 0.258819 -0.965926 0 0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 0 0 -1 0 0 -1 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 0 0 1 0 0 1 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.707107 -0.707107 0 -0.707107 -0.707107 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 0 0 -1 0 0 -1 0 0 -1 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 0 0 1 0 0 1 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.707106 -0.707107 0 -0.707106 -0.707107 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 0 0 -1 0 0 -1 0 0 -1 -0.965926 -0.25882 0 -0.965926 -0.258819 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 0 0 1 0 0 1 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 0.258819 0 -0.965926 0.258819 0 0 0 -1 0 0 -1 0 0 -1 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 0 0 1 0 0 1 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.707107 0.707106 0 -0.707107 0.707106 0 0 0 -1 0 0 -1 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 0 0 1 0 0 1 -0.707107 0.707106 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.258819 0.965926 0 -0.707107 0.707106 0 -0.258819 0.965926 0 0 0 -1 0 0 -1 -0.258819 0.965926 0 -0.25882 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 0 0 1 0 0 1 0 0 1 -0.258819 0.965926 0 0.258819 0.965926 0 0 0 -1 0 0 -1 0 0 -1 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0 0 1 0 0 1 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 0.258819 0.965926 0 -0.258819 0.965926 0 0.258819 0.965926 0 0.707107 0.707107 0 0.707107 0.707107 0 0.258819 0.965926 0 0.258819 0.965926 0 0.707107 0.707107 0 0.707106 0.707107 0 0 0 -1 0 0 -1 0 0 -1 0.707106 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0 0 1 0 0 1 0.707107 0.707107 0 0.707107 0.707107 0 0.965926 0.258819 0 0.965926 0.258819 0 0.707107 0.707107 0 0.707107 0.707107 0 0.965926 0.258819 0 0.965926 0.258819 0 0 0 -1 0 0 -1 0 0 -1 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0 0 1 0 0 1 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0 0 -1 0 0 -1 0 0 -1 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0 0 1 0 0 1 0 0 1 0.965926 -0.258819 0 0.965926 -0.258819 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0 0 -1 0 0 -1 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0 0 1 0 0 1 0.707107 -0.707107 0 0.707107 -0.707107 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0 0 -1 0 0 -1 0 0 -1 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0 0 1 0 0 1 0 0 1 0.258819 -0.965926 0 0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 0 0 -1 0 0 -1 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 0 0 1 -0.258819 -0.965926 0 0 0 1 0 0 1 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.707107 -0.707107 0 -0.707107 -0.707107 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 0 0 -1 0 0 -1 0 0 -1 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 0 0 1 0 0 1 0 0 1 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.707106 -0.707107 0 -0.707106 -0.707107 0 -0.965926 -0.25882 0 -0.965926 -0.258819 0 0 0 -1 0 0 -1 -0.965926 -0.258819 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 -0.258819 0 0 0 1 0 0 1 0 0 1 -0.965926 -0.258819 0 -0.965926 -0.25882 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 0.258819 0 -0.965926 0.258819 0 0 0 -1 0 0 -1 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 0 0 1 0 0 1 0 0 1 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.707107 0.707106 0 -0.707107 0.707106 0 0 0 -1 0 0 -1 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 0 0 1 0 0 1 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.258819 0.965926 0 -0.258819 0.965926 0 0 0 -1 0 0 -1 0 0 -1 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.25882 0.965926 0 0 0 1 0 0 1 -0.25882 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707106 0.707107 0 0.707107 0.707107 0 0.707106 0.707107 0 0.707107 0.707107 0 0.707106 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707106 0.707107 0 0.707106 0.707107 0 0.707107 0.707107 0 0.707106 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707106 0.707107 0 0.707106 0.707107 0 0.707107 0.707107 0 0.707106 0.707107 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.707106 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707107 -0.707107 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 -0.258819 0 -0.965926 -0.25882 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 -0.258819 0 -0.965926 -0.25882 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.25882 0.965926 0 -0.258819 0.965926 0 -0.25882 0.965926 0 -0.25882 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.25882 0.965926 0 -0.25882 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.25882 0.965926 0 -0.258819 0.965926 0 -0.25882 0.965926 0 -0.25882 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.25882 0.965926 0 -0.258819 0.965926 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.707106 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707107 -0.707107 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 -0.258819 0 -0.965926 -0.25882 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.25882 0.965926 0 -0.258819 0.965926 0 -0.25882 0.965926 0 -0.25882 0.965926 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.258819 0.965926 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707106 0.707107 0 0.707106 0.707107 0 0.707107 0.707107 0 0.707106 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.707106 0.707107 0 0.707106 0.707107 0 0.707107 0.707107 0 0.707106 0.707107 0 0.707107 0.707107 0 0.707107 0.707107 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.965926 -0.258819 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.707107 -0.707107 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.258819 -0.965926 0 -0.707106 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707106 -0.707107 0 -0.707107 -0.707107 0 -0.707107 -0.707107 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 -0.258819 0 -0.965926 -0.25882 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 -0.258819 0 -0.965926 -0.25882 0 -0.965926 -0.258819 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 -0.25882 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.965926 0.258819 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.25882 0.965926 0 -0.258819 0.965926 0 -0.25882 0.965926 0 -0.25882 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.258819 0.965926 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 -0.707107 0.707106 0 } Indices FALSE Binding BIND_PER_VERTEX Normalize 0 } } } } } } } } } Matrix { 0.1 0 0 0 0 0.1 0 0 0 0 0.1 0 0 0 -0.05 1 } } } } opensurgsim-0.7.0/SurgSim/Graphics/UnitTests/GroupTests.cpp000066400000000000000000000133511277777236100240350ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the Group class. #include "SurgSim/Graphics/UnitTests/MockObjects.h" #include namespace SurgSim { namespace Graphics { TEST(GroupTests, InitTest) { ASSERT_NO_THROW({std::shared_ptr group = std::make_shared("test name");}); } TEST(GroupTests, VisibilityTest) { std::shared_ptr group = std::make_shared("test name"); group->setVisible(true); EXPECT_TRUE(group->isVisible()); group->setVisible(false); EXPECT_FALSE(group->isVisible()); } TEST(GroupTests, AddRemoveTest) { std::shared_ptr group = std::make_shared("test name"); std::shared_ptr representation1 = std::make_shared("test representation 1"); std::shared_ptr representation2 = std::make_shared("test representation 2"); std::shared_ptr group1 = std::make_shared("test group 1"); std::shared_ptr group2 = std::make_shared("test group 2"); EXPECT_EQ(0u, group->getMembers().size()); /// Add an representation EXPECT_TRUE(group->add(representation1)); EXPECT_EQ(1u, group->getMembers().size()); EXPECT_NE(group->getMembers().end(), std::find(group->getMembers().begin(), group->getMembers().end(), representation1)); /// Add another representation EXPECT_TRUE(group->add(representation2)); EXPECT_EQ(2u, group->getMembers().size()); EXPECT_NE(group->getMembers().end(), std::find(group->getMembers().begin(), group->getMembers().end(), representation2)); /// Try to add a duplicate representation EXPECT_FALSE(group->add(representation1)); EXPECT_EQ(2u, group->getMembers().size()); /// Remove an representation EXPECT_TRUE(group->remove(representation1)); EXPECT_EQ(group->getMembers().end(), std::find(group->getMembers().begin(), group->getMembers().end(), representation1)); /// Try to remove an representation that is not in the group EXPECT_FALSE(group->remove(representation1)); EXPECT_EQ(group->getMembers().end(), std::find(group->getMembers().begin(), group->getMembers().end(), representation1)); } TEST(GroupTests, AppendTest) { std::shared_ptr group1 = std::make_shared("test group 1"); EXPECT_EQ(0u, group1->getMembers().size()); std::shared_ptr representation1 = std::make_shared("test representation 1"); std::shared_ptr representation2 = std::make_shared("test representation 2"); /// Add 2 representations to group 1 EXPECT_TRUE(group1->add(representation1)); EXPECT_TRUE(group1->add(representation2)); EXPECT_EQ(2u, group1->getMembers().size()); std::shared_ptr representation3 = std::make_shared("test representation 3"); std::shared_ptr group2 = std::make_shared("test group 2"); EXPECT_EQ(0u, group2->getMembers().size()); /// Add an representation to group 2 and append group 1 to group 2. EXPECT_TRUE(group2->add(representation3)); EXPECT_TRUE(group2->append(group1)); EXPECT_EQ(3u, group2->getMembers().size()); // Check that the representations from group 1 were added to group 2, and that it still has the representation // that was added directly to it. EXPECT_NE(group2->getMembers().end(), std::find(group2->getMembers().begin(), group2->getMembers().end(), representation1)); EXPECT_NE(group2->getMembers().end(), std::find(group2->getMembers().begin(), group2->getMembers().end(), representation2)); EXPECT_NE(group2->getMembers().end(), std::find(group2->getMembers().begin(), group2->getMembers().end(), representation3)); /// Try to append a group that has already been appended - this will try to add duplicate representations. EXPECT_FALSE(group2->append(group1)) << "Append should return false if any representation is a duplicate!"; EXPECT_EQ(3u, group2->getMembers().size()); /// Check that group 1 was not modified by appending it to group 2. EXPECT_EQ(2u, group1->getMembers().size()); EXPECT_NE(group1->getMembers().end(), std::find(group1->getMembers().begin(), group1->getMembers().end(), representation1)); EXPECT_NE(group1->getMembers().end(), std::find(group1->getMembers().begin(), group1->getMembers().end(), representation2)); } TEST(GroupTests, ClearTest) { std::shared_ptr group = std::make_shared("test name"); std::shared_ptr representation1 = std::make_shared("test representation 1"); std::shared_ptr representation2 = std::make_shared("test representation 2"); std::shared_ptr representation3 = std::make_shared("test representation 3"); EXPECT_EQ(0u, group->getMembers().size()); /// Add 3 representations EXPECT_TRUE(group->add(representation1)); EXPECT_TRUE(group->add(representation2)); EXPECT_TRUE(group->add(representation3)); EXPECT_EQ(3u, group->getMembers().size()); /// Remove all representations and make sure that they are removed correctly group->clear(); EXPECT_EQ(0u, group->getMembers().size()); } }; // namespace Graphics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Graphics/UnitTests/ManagerTests.cpp000066400000000000000000000214351277777236100243150ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the Graphics Manager class. #include "SurgSim/Framework/BasicSceneElement.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Framework/Scene.h" #include "SurgSim/Framework/Component.h" #include "SurgSim/Framework/ComponentManager.h" #include "SurgSim/Graphics/UnitTests/MockObjects.h" #include #include using SurgSim::Framework::BasicSceneElement; using SurgSim::Framework::ComponentManager; using SurgSim::Framework::Component; using SurgSim::Framework::Runtime; using SurgSim::Framework::Scene; class GraphicsManagerTest : public ::testing::Test { public: virtual void SetUp() { runtime = std::make_shared(); graphicsManager = std::make_shared(); runtime->addManager(graphicsManager); // runtime->start(); } virtual void TearDown() { runtime->stop(); } bool testDoAddComponent(const std::shared_ptr& component) { return graphicsManager->executeAdditions(component); } bool testDoRemoveComponent(const std::shared_ptr& component) { return graphicsManager->executeRemovals(component); } void doProcessComponents() { graphicsManager->processComponents(); } std::shared_ptr runtime; std::shared_ptr graphicsManager; }; namespace SurgSim { namespace Graphics { TEST_F(GraphicsManagerTest, InitTest) { ASSERT_NO_THROW({std::shared_ptr manager = std::make_shared();}); } TEST_F(GraphicsManagerTest, StartUpTest) { std::shared_ptr runtime = std::make_shared(); std::shared_ptr manager = std::make_shared(); runtime->addManager(manager); EXPECT_EQ(0, manager->getNumUpdates()); EXPECT_EQ(0.0, manager->getSumDt()); std::shared_ptr scene = runtime->getScene(); /// Run the thread for a moment runtime->start(); EXPECT_TRUE(manager->isInitialized()); boost::this_thread::sleep(boost::posix_time::milliseconds(100)); runtime->stop(); /// Check that the manager did update when the thread was running EXPECT_GT(manager->getNumUpdates(), 0); EXPECT_GT(manager->getSumDt(), 0.0); } TEST_F(GraphicsManagerTest, AddRemoveTest) { /// Perform add and remove from a pointer to a ComponentManager to check that the intended polymorphism is working. std::shared_ptr componentManager = graphicsManager; std::shared_ptr representation1 = std::make_shared("test representation 1"); std::shared_ptr representation2 = std::make_shared("test representation 2"); representation2->addGroupReference("other_group"); std::shared_ptr view1 = std::make_shared("test view 1"); std::shared_ptr view2 = std::make_shared("test view 2"); std::shared_ptr nonGraphicsComponent = std::make_shared("non-graphics component"); EXPECT_EQ(0u, graphicsManager->getRepresentations().size()); EXPECT_EQ(0u, graphicsManager->getGroups().size()); EXPECT_EQ(0u, graphicsManager->getViews().size()); /// Add an representation EXPECT_TRUE(testDoAddComponent(representation1)); EXPECT_EQ(1u, graphicsManager->getRepresentations().size()); EXPECT_NE(graphicsManager->getRepresentations().end(), std::find(graphicsManager->getRepresentations().begin(), graphicsManager->getRepresentations().end(), representation1)); // Should have added the default group EXPECT_EQ(1u, graphicsManager->getGroups().size()); EXPECT_NE(std::end(graphicsManager->getGroups()), graphicsManager->getGroups().find(Representation::DefaultGroupName)); /// Add a view EXPECT_TRUE(testDoAddComponent(view1)); EXPECT_EQ(1u, graphicsManager->getViews().size()); EXPECT_NE(graphicsManager->getViews().end(), std::find(graphicsManager->getViews().begin(), graphicsManager->getViews().end(), view1)); /// Add another view EXPECT_TRUE(testDoAddComponent(view2)); EXPECT_EQ(2u, graphicsManager->getViews().size()); EXPECT_NE(graphicsManager->getViews().end(), std::find(graphicsManager->getViews().begin(), graphicsManager->getViews().end(), view2)); /// Add another representation EXPECT_TRUE(testDoAddComponent(representation2)); EXPECT_EQ(2u, graphicsManager->getRepresentations().size()); EXPECT_NE(graphicsManager->getRepresentations().end(), std::find(graphicsManager->getRepresentations().begin(), graphicsManager->getRepresentations().end(), representation2)); /// There should be another group in there now EXPECT_EQ(2u, graphicsManager->getGroups().size()); /// Try to add a duplicate representation /// the public interface functions addComponent and removeComponent always return true when the allocation /// succeeded EXPECT_TRUE(componentManager->enqueueAddComponent(representation1)); doProcessComponents(); EXPECT_EQ(2u, graphicsManager->getRepresentations().size()); /// Try to add a duplicate view EXPECT_TRUE(componentManager->enqueueAddComponent(view1)); doProcessComponents(); EXPECT_EQ(2u, graphicsManager->getViews().size()); /// Try to add a component that is not graphics-related EXPECT_TRUE(componentManager->enqueueAddComponent(nonGraphicsComponent)) << "Adding a component that this manager is not concerned with should return false"; /// Remove a view EXPECT_TRUE(componentManager->enqueueRemoveComponent(view2)); doProcessComponents(); EXPECT_EQ(graphicsManager->getViews().end(), std::find(graphicsManager->getViews().begin(), graphicsManager->getViews().end(), view2)); /// Remove an representation EXPECT_TRUE(componentManager->enqueueRemoveComponent(representation1)); doProcessComponents(); EXPECT_EQ(graphicsManager->getRepresentations().end(), std::find(graphicsManager->getRepresentations().begin(), graphicsManager->getRepresentations().end(), representation1)); /// Try to remove an representation that is not in the manager EXPECT_TRUE(componentManager->enqueueRemoveComponent(representation1)); doProcessComponents(); EXPECT_EQ(graphicsManager->getRepresentations().end(), std::find(graphicsManager->getRepresentations().begin(), graphicsManager->getRepresentations().end(), representation1)); /// Try to remove a view that is not in the manager EXPECT_TRUE(componentManager->enqueueRemoveComponent(view2)); doProcessComponents(); EXPECT_EQ(graphicsManager->getViews().end(), std::find(graphicsManager->getViews().begin(), graphicsManager->getViews().end(), view2)); /// Try to remove a component that is not graphics-related EXPECT_TRUE(componentManager->enqueueRemoveComponent(nonGraphicsComponent)) << "Removing a component that this manager is not concerned with should return true"; } TEST_F(GraphicsManagerTest, UpdateTest) { auto mockRepresentation = std::make_shared("MockRepresentation"); auto sceneElement = std::make_shared("BasicSceneElement"); sceneElement->addComponent(mockRepresentation); runtime->getScene()->addSceneElement(sceneElement); EXPECT_TRUE(mockRepresentation->isActive()); // When a graphics representation is inactive, it will be set to invisible by Graphics Manager. // And it won't be updated by Graphics Manager. mockRepresentation->setLocalActive(false); runtime->start(); EXPECT_TRUE(graphicsManager->isInitialized()); boost::this_thread::sleep(boost::posix_time::milliseconds(100)); EXPECT_EQ(0, mockRepresentation->getNumUpdates()); EXPECT_FALSE(mockRepresentation->isActive()); // When a graphics representation is active, it will be set to visible by Graphics Manager. // And it will be updated by Graphics Manager. mockRepresentation->setLocalActive(true); boost::this_thread::sleep(boost::posix_time::milliseconds(100)); EXPECT_GT(mockRepresentation->getNumUpdates(), 0); EXPECT_TRUE(mockRepresentation->isActive()); // Turn off an active graphics representation, the update of it will be stopped and it will be invisible. mockRepresentation->setLocalActive(false); auto updateCount = mockRepresentation->getNumUpdates(); boost::this_thread::sleep(boost::posix_time::milliseconds(100)); EXPECT_EQ(updateCount, mockRepresentation->getNumUpdates()); EXPECT_FALSE(mockRepresentation->isActive()); runtime->stop(); } }; // namespace Graphics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Graphics/UnitTests/MeshTests.cpp000066400000000000000000000072011277777236100236320ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include "SurgSim/Graphics/Mesh.h" #include "SurgSim/Testing/TestCube.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/RigidTransform.h" using SurgSim::Math::Vector2d; using SurgSim::Math::Vector3d; using SurgSim::Math::Vector4d; using SurgSim::Math::Quaterniond; using SurgSim::Math::RigidTransform3d; namespace SurgSim { namespace Graphics { struct MeshTests : public ::testing::Test { public: virtual void SetUp() { SurgSim::Testing::Cube::makeCube(&cubeVertices, &cubeColors, &cubeTextures, &cubeTriangles); } std::vector cubeVertices; std::vector cubeTriangles; std::vector cubeColors; std::vector cubeTextures; }; TEST_F(MeshTests, MakeMeshTestWorking) { std::shared_ptr mesh = std::make_shared(); ASSERT_NO_THROW({ mesh->initialize(cubeVertices, cubeColors, cubeTextures, cubeTriangles);} ); EXPECT_TRUE(mesh->isValid()); EXPECT_EQ(cubeVertices.size(), mesh->getNumVertices()); EXPECT_EQ(cubeTriangles.size()/3, mesh->getNumTriangles()); for (size_t i=0; i< cubeVertices.size(); ++i) { EXPECT_TRUE(cubeColors[i] == mesh->getVertex(i).data.color.getValue()); EXPECT_TRUE(cubeTextures[i] == mesh->getVertex(i).data.texture.getValue()); } } TEST_F(MeshTests, MakeMeshColors) { std::vector emptyCubeColors; std::vector tooFewCubeColors; std::vector tooManyCubeColors(cubeColors); tooFewCubeColors.push_back(Vector4d(0.0,0.0,0.0,0.0)); tooManyCubeColors.push_back(Vector4d(0.0,0.0,0.0,0.0)); std::shared_ptr mesh = std::make_shared(); ASSERT_NO_THROW({ mesh->initialize(cubeVertices, emptyCubeColors, cubeTextures, cubeTriangles);} ); for (size_t i=0; i< cubeVertices.size(); ++i) { EXPECT_FALSE(mesh->getVertex(i).data.color.hasValue()); } mesh = std::make_shared(); ASSERT_ANY_THROW({ mesh->initialize(cubeVertices, tooFewCubeColors, cubeTextures, cubeTriangles);} ); mesh = std::make_shared(); ASSERT_NO_THROW({ mesh->initialize(cubeVertices, tooManyCubeColors, cubeTextures, cubeTriangles);} ); } TEST_F(MeshTests, MakeMeshTextures) { std::vector emptyCubeTextures; std::vector tooFewCubeTextures; std::vector tooManyCubeTextures(cubeTextures); tooFewCubeTextures.push_back(Vector2d(0.0,0.0)); tooManyCubeTextures.push_back(Vector2d(0.0,0.0)); std::shared_ptr mesh = std::make_shared(); ASSERT_NO_THROW({ mesh->initialize(cubeVertices, cubeColors, emptyCubeTextures, cubeTriangles);} ); for (size_t i=0; i< cubeVertices.size(); ++i) { EXPECT_FALSE(mesh->getVertex(i).data.texture.hasValue()); } mesh = std::make_shared(); ASSERT_ANY_THROW({ mesh->initialize(cubeVertices, cubeColors, tooFewCubeTextures, cubeTriangles);} ); mesh = std::make_shared(); ASSERT_NO_THROW({ mesh->initialize(cubeVertices, cubeColors, tooManyCubeTextures, cubeTriangles);} ); } }; // namespace Graphics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Graphics/UnitTests/MockObjects.h000066400000000000000000000373031277777236100235710ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_UNITTESTS_MOCKOBJECTS_H #define SURGSIM_GRAPHICS_UNITTESTS_MOCKOBJECTS_H #include "SurgSim/Graphics/Camera.h" #include "SurgSim/Graphics/Group.h" #include "SurgSim/Graphics/Manager.h" #include "SurgSim/Graphics/Material.h" #include "SurgSim/Graphics/Program.h" #include "SurgSim/Graphics/RenderTarget.h" #include "SurgSim/Graphics/Representation.h" #include "SurgSim/Graphics/Texture.h" #include "SurgSim/Graphics/UniformBase.h" #include "SurgSim/Graphics/View.h" #include "SurgSim/Graphics/ViewElement.h" #include "SurgSim/Math/Vector.h" #include class MockGroup : public SurgSim::Graphics::Group { public: /// Constructor. The group is initially empty. /// \param name Name of the group explicit MockGroup(const std::string& name) : SurgSim::Graphics::Group(name) { } /// Sets whether the group is currently visible /// \param visible True for visible, false for invisible virtual void setVisible(bool visible) { m_isVisible = visible; } /// Gets whether the group is currently visible /// \return visible True for visible, false for invisible virtual bool isVisible() const { return m_isVisible; } private: /// Whether this group is currently visible or not bool m_isVisible; }; /// Manager class for testing class MockManager : public SurgSim::Graphics::Manager { public: friend class GraphicsManagerTest; /// Constructor /// \post m_numUpdates and m_sumDt are initialized to 0 MockManager() : SurgSim::Graphics::Manager(), m_numUpdates(0), m_sumDt(0.0) { } /// Returns the number of times the manager has been updated int getNumUpdates() const { return m_numUpdates; } /// Returns the sum of the dt that the manager has been updated with double getSumDt() const { return m_sumDt; } void dumpDebugInfo() const { return; } int getType() const override { return SurgSim::Framework::MANAGER_TYPE_NONE; } virtual std::shared_ptr getOrCreateGroup(const std::string& name) { if (getGroups().find(name) == std::end(getGroups())) { addGroup(std::make_shared(name)); } return getGroups().at(name); } private: /// Updates the manager. /// \param dt The time in seconds of the preceding timestep. /// \post m_numUpdates is incremented and dt is added to m_sumDt virtual bool doUpdate(double dt) { if (Manager::doUpdate(dt)) { ++m_numUpdates; m_sumDt += dt; return true; } else { return false; } } /// Number of times the manager has been updated int m_numUpdates; /// Sum of the dt that the manager has been updated with double m_sumDt; }; /// Representation class for testing class MockRepresentation : public SurgSim::Graphics::Representation { public: /// Constructor /// \param name Name of the representation /// \post m_numUpdates and m_sumDt are initialized to 0 /// \post m_transform is set to identity /// \post m_isInitialized and m_isAwoken are set to false explicit MockRepresentation(const std::string& name) : SurgSim::Graphics::Representation(name), m_numUpdates(0), m_sumDt(0.0), m_isInitialized(false), m_isAwoken(false), m_drawAsWireFrame(false) { m_transform.setIdentity(); } /// Returns the number of times the representation has been updated int getNumUpdates() const { return m_numUpdates; } /// Returns the sum of the dt that the representation has been updated with double getSumDt() const { return m_sumDt; } /// Updates the representation. /// \param dt The time in seconds of the preceding timestep. /// \post m_numUpdates is incremented and dt is added to m_sumDt virtual void update(double dt) { if (isActive()) { ++m_numUpdates; m_sumDt += dt; } } /// Gets whether the representation has been initialized bool isInitialized() const { return m_isInitialized; } /// Gets whether the representation has been awoken bool isAwoken() const { return m_isAwoken; } /// Sets the material that defines the visual appearance of the representation /// \param material Graphics material /// \return True if set successfully, otherwise false virtual bool setMaterial(std::shared_ptr material) { return false; } /// Gets the material that defines the visual appearance of the representation /// \return Graphics material virtual std::shared_ptr getMaterial() const { return nullptr; } /// Removes the material from the representation virtual void clearMaterial() { } virtual void setDrawAsWireFrame(bool val) { m_drawAsWireFrame = val; } virtual bool getDrawAsWireFrame() const { return m_drawAsWireFrame; } void setGenerateTangents(bool value) { } bool isGeneratingTangents() const { return false; } private: /// Initializes the representation /// \post m_isInitialized is set to true virtual bool doInitialize() { m_isInitialized = true; return true; } /// Wakes up the representation /// \post m_isAwoken is set to true virtual bool doWakeUp() { m_isAwoken = true; return true; } /// Number of times the representation has been updated int m_numUpdates; /// Sum of the dt that the representation has been updated with double m_sumDt; /// Whether the representation has been initialized bool m_isInitialized; /// Whether the representation has been awoken bool m_isAwoken; /// Indicates if the representation is rendered as a wireframe. bool m_drawAsWireFrame; /// Rigid transform describing pose of the representation SurgSim::Math::RigidTransform3d m_transform; }; /// Camera class for testing class MockCamera : public SurgSim::Graphics::Camera { public: /// Constructor /// \param name Name of the camera /// \post m_numUpdates and m_sumDt are initialized to 0 /// \post m_transform is set to identity, m_eye to (0,0,0), m_center to (0, 0, -1), and m_up to (0, 1, 0) /// \post m_isVisible is set to true explicit MockCamera(const std::string& name) : SurgSim::Graphics::Representation(name), SurgSim::Graphics::Camera(name), m_numUpdates(0), m_sumDt(0.0) { m_pose.setIdentity(); m_viewMatrix.setIdentity(); m_projectionMatrix.setIdentity(); } /// Returns the number of times the representation has been updated int getNumUpdates() const { return m_numUpdates; } /// Returns the sum of the dt that the representation has been updated with double getSumDt() const { return m_sumDt; } /// Sets the current pose of the camera /// \param transform Rigid transformation that describes the current pose of the camera virtual void setPose(const SurgSim::Math::RigidTransform3d& transform) { m_pose = transform; } /// Gets the pose of the camera /// \return Rigid transformation that describes the pose of the representation virtual SurgSim::Math::RigidTransform3d getPose() const { return m_pose; } /// Sets the view matrix of the camera /// \param matrix View matrix virtual void setViewMatrix(const SurgSim::Math::Matrix44d& matrix) { m_viewMatrix = matrix; } /// Gets the view matrix of the camera /// \return View matrix virtual SurgSim::Math::Matrix44d getViewMatrix() const { return m_viewMatrix; } /// Sets the projection matrix of the camera /// \param matrix Projection matrix virtual void setProjectionMatrix(const SurgSim::Math::Matrix44d& matrix) { m_projectionMatrix = matrix; } /// Gets the projection matrix of the camera /// \return Projection matrix virtual const SurgSim::Math::Matrix44d& getProjectionMatrix() const { return m_projectionMatrix; } virtual SurgSim::Math::Matrix44d getInverseProjectionMatrix() const { return m_projectionMatrix.inverse(); } /// Updates the camera. /// \param dt The time in seconds of the preceding timestep. /// \post m_numUpdates is incremented and dt is added to m_sumDt virtual void update(double dt) { ++m_numUpdates; m_sumDt += dt; } /// Sets the material that defines the visual appearance of the representation /// \param material Graphics material /// \return True if set successfully, otherwise false virtual bool setMaterial(std::shared_ptr material) { return false; } /// Gets the material that defines the visual appearance of the representation /// \return Graphics material virtual std::shared_ptr getMaterial() const { return nullptr; } /// Removes the material from the representation virtual void clearMaterial() { } virtual void setDrawAsWireFrame(bool val) { } virtual bool getDrawAsWireFrame() const { return false; } virtual bool setColorRenderTexture(std::shared_ptr texture) { return true; } virtual std::shared_ptr getColorRenderTexture() const { return nullptr; } virtual bool setRenderTarget(std::shared_ptr renderTarget) { return true; } virtual std::shared_ptr getRenderTarget() const { return nullptr; } void setRenderOrder(RenderOrder bin, int value) override { } void setMainCamera(bool val) override { } bool isMainCamera() override { return false; } virtual SurgSim::Math::Matrix44d getInverseViewMatrix() const { throw std::logic_error("The method or operation is not implemented."); } void setAmbientColor(const SurgSim::Math::Vector4d& color) { throw std::logic_error("The method or operation is not implemented."); } SurgSim::Math::Vector4d getAmbientColor() { throw std::logic_error("The method or operation is not implemented."); } void setGenerateTangents(bool value) { throw std::logic_error("The method or operation is not implemented."); } bool isGeneratingTangents() const { throw std::logic_error("The method or operation is not implemented."); } void setPerspectiveProjection(double fovy, double aspect, double near, double far) { throw std::logic_error("The method or operation is not implemented."); } void setOrthogonalProjection(double left, double right, double bottom, double top, double near, double far) { throw std::logic_error("The method or operation is not implemented."); } void setViewport(int x, int y, int width, int height) { throw std::logic_error("The method or operation is not implemented."); } std::array getViewport() const { throw std::logic_error("The method or operation is not implemented."); } void getViewport(int* x, int* y, int* width, int* height) const { throw std::logic_error("The method or operation is not implemented."); } void setViewportSize(std::array dimensions) { throw std::logic_error("The method or operation is not implemented."); } std::array getViewportSize() const { throw std::logic_error("The method or operation is not implemented."); } private: /// Number of times the camera has been updated int m_numUpdates; /// Sum of the dt that the camera has been updated with double m_sumDt; /// Rigid transform describing pose of the camera SurgSim::Math::RigidTransform3d m_pose; /// View matrix of the camera SurgSim::Math::Matrix44d m_viewMatrix; /// Projection matrix of the camera SurgSim::Math::Matrix44d m_projectionMatrix; }; /// View class for testing class MockView : public SurgSim::Graphics::View { public: /// Constructor /// \param name Name of the view /// \post m_x and m_y are initialized to 0 /// \post m_width is initialized to 800, m_height to 600 /// \post m_isWindowBorderEnabled is initialized to true /// \post m_numUpdates and m_sumDt are initialized to 0 /// \post m_transform is set to identity explicit MockView(const std::string& name) : SurgSim::Graphics::View(name), m_x(0), m_y(0), m_width(800), m_height(600), m_isWindowBorderEnabled(true), m_numUpdates(0), m_sumDt(0.0), m_isInitialized(false), m_isAwoken(false) { } /// Set the position of this view /// \param x,y Position on the screen (in pixels) void setPosition(const std::array& position) override { m_x = position[0]; m_y = position[1]; } /// Get the position of this view /// \param[out] x,y Position on the screen (in pixels) std::array getPosition() const override { std::array result = {m_x, m_y}; return result; } /// Set the dimensions of this view /// \param width,height Dimensions on the screen (in pixels) void setDimensions(const std::array& dimensions) override { m_width = dimensions[0]; m_height = dimensions[1]; } /// Set the dimensions of this view /// \param[out] width,height Dimensions on the screen (in pixels) std::array getDimensions() const override { std::array result = {m_width, m_height}; return result; } void setDimensionsDouble(const std::array& dimensions) { m_width = static_cast(dimensions[0]); m_height = static_cast(dimensions[1]); } std::array getDimensionsDouble() const { std::array result = {static_cast(m_width), static_cast(m_height)}; return std::move(result); } /// Sets whether the view window has a border /// \param enabled True to enable the border around the window; false for no border void setWindowBorderEnabled(bool enabled) override { m_isWindowBorderEnabled = enabled; } /// Returns whether the view window has a border /// \return True to enable the border around the window; false for no border bool isWindowBorderEnabled() const override { return m_isWindowBorderEnabled; } /// Returns the number of times the view has been updated int getNumUpdates() const { return m_numUpdates; } /// Returns the sum of the dt that the view has been updated with double getSumDt() const { return m_sumDt; } /// Updates the view. /// \param dt The time in seconds of the preceding timestep. /// \post m_numUpdates is incremented and dt is added to m_sumDt virtual void update(double dt) { ++m_numUpdates; m_sumDt += dt; } /// Gets whether the view has been initialized bool isInitialized() const { return m_isInitialized; } /// Gets whether the view has been awoken bool isAwoken() const { return m_isAwoken; } private: /// Initialize the view /// \post m_isInitialized is set to true virtual bool doInitialize() { m_isInitialized = true; return true; } /// Wake up the view /// \post m_isAwoken is set to true virtual bool doWakeUp() { m_isAwoken = true; return true; } int doSetTargetScreen(int val) { return 0; } /// Position of the view on the screen (in pixels) int m_x, m_y; /// Dimensions of the view on the screen (in pixels) int m_width, m_height; /// Whether the view window has a border bool m_isWindowBorderEnabled; /// Number of times the view has been updated int m_numUpdates; /// Sum of the dt that the view has been updated with double m_sumDt; /// Whether the view has been initialized bool m_isInitialized; /// Whether the view has been awoken bool m_isAwoken; }; /// Representation that does not subclass any graphics components class NonGraphicsRepresentation : public SurgSim::Framework::Representation { public: /// Constructor /// \param name Name of the representation explicit NonGraphicsRepresentation(const std::string& name) : SurgSim::Framework::Representation(name) { } }; #endif // SURGSIM_GRAPHICS_UNITTESTS_MOCKOBJECTS_H opensurgsim-0.7.0/SurgSim/Graphics/UnitTests/MockOsgObjects.h000066400000000000000000000073171277777236100242440ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_UNITTESTS_MOCKOSGOBJECTS_H #define SURGSIM_GRAPHICS_UNITTESTS_MOCKOSGOBJECTS_H #include "SurgSim/Graphics/OsgRepresentation.h" #include "SurgSim/Framework/Runtime.h" #include #include #include /// Representation class for testing class MockOsgRepresentation : public SurgSim::Graphics::OsgRepresentation { public: /// Constructor /// \param name Name of the representation /// \post m_numUpdates and m_sumDt are initialized to 0 /// \post m_transform is set to identity /// \post m_isInitialized and m_isAwoken are set to false /// \post m_isVisible is set to true explicit MockOsgRepresentation(const std::string& name) : SurgSim::Graphics::Representation(name), SurgSim::Graphics::OsgRepresentation(name), m_numUpdates(0), m_sumDt(0.0), m_isInitialized(false), m_isAwoken(false) { } /// Returns the number of times the representation has been updated int getNumUpdates() const { return m_numUpdates; } /// Returns the sum of the dt that the representation has been updated with double getSumDt() const { return m_sumDt; } /// Updates the representation. /// \param dt The time in seconds of the preceding timestep. /// \post m_numUpdates is incremented and dt is added to m_sumDt virtual void doUpdate(double dt) { ++m_numUpdates; m_sumDt += dt; } /// Gets whether the representation has been initialized bool isInitialized() const { return m_isInitialized; } /// Gets whether the representation has been awoken bool isAwoken() const { return m_isAwoken; } private: /// Initializes the representation /// \post m_isInitialized is set to true virtual bool doInitialize() { m_isInitialized = true; return true; } /// Wakes up the representation /// \post m_isAwoken is set to true virtual bool doWakeUp() { m_isAwoken = true; return true; } /// Number of times the representation has been updated int m_numUpdates; /// Sum of the dt that the representation has been updated with double m_sumDt; /// Whether the representation has been initialized bool m_isInitialized; /// Whether the representation has been awoken bool m_isAwoken; }; /// Enable Logging of OSG through SurgSim Logging System class MockOsgLog : public osg::NotifyHandler { public: MockOsgLog() { osg::setNotifyLevel(osg::DEBUG_FP); } void notify(osg::NotifySeverity severity, const char *message) override { reset(); if (severity <= osg::FATAL) { m_message << "CRITICAL " << message; } else if (osg::FATAL < severity && severity <= osg::WARN) { m_message << "WARNING " << message; } else if (osg::WARN < severity && severity <= osg::INFO) { m_message << "INFO " << message; } else if (osg::INFO < severity && severity <= osg::DEBUG_FP) { m_message << "DEBUG " << message; } else { m_message << "Unknown severity in OsgLog::notify()"; } } std::string getMessage() const { return m_message.str(); } void reset() { m_message.clear(); m_message.str(""); } std::stringstream m_message; }; #endif // SURGSIM_GRAPHICS_UNITTESTS_MOCKOSGOBJECTS_H opensurgsim-0.7.0/SurgSim/Graphics/UnitTests/OsgAxesRepresentationTests.cpp000066400000000000000000000026051277777236100272350ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Graphics/OsgAxesRepresentation.h" #include "SurgSim/Framework/FrameworkConvert.h" namespace SurgSim { namespace Graphics { TEST(OsgAxesRepresentationTests, Serialization) { using SurgSim::Framework::Component; std::shared_ptr axes = std::make_shared("axes"); axes->setValue("Size", 12.0); YAML::Node node = YAML::convert::encode(*axes); std::shared_ptr component = node.as>(); ASSERT_NE(nullptr, component); std::shared_ptr newAxes = std::dynamic_pointer_cast(component); ASSERT_NE(nullptr, newAxes); EXPECT_DOUBLE_EQ(12.0, newAxes->getValue("Size")); } } } opensurgsim-0.7.0/SurgSim/Graphics/UnitTests/OsgBoxRepresentationTests.cpp000066400000000000000000000115031277777236100270620ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the OsgBoxRepresentation class. #include "SurgSim/Graphics/UnitTests/MockOsgObjects.h" #include "SurgSim/Framework/BasicSceneElement.h" #include "SurgSim/Graphics/OsgMaterial.h" #include "SurgSim/Graphics/OsgBoxRepresentation.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Framework/FrameworkConvert.h" #include #include using SurgSim::Framework::BasicSceneElement; using SurgSim::Math::Quaterniond; using SurgSim::Math::RigidTransform3d; using SurgSim::Math::Vector3d; using SurgSim::Math::makeRigidTransform; namespace SurgSim { namespace Graphics { TEST(OsgBoxRepresentationTests, InitTest) { ASSERT_NO_THROW({std::shared_ptr representation = std::make_shared("test name"); }); std::shared_ptr representation = std::make_shared("test name"); EXPECT_EQ("test name", representation->getName()); } TEST(OsgBoxRepresentationTests, AccessibleTest) { std::shared_ptr component; ASSERT_NO_THROW(component = SurgSim::Framework::Component::getFactory().create( "SurgSim::Graphics::OsgBoxRepresentation", "box")); EXPECT_EQ("SurgSim::Graphics::OsgBoxRepresentation", component->getClassName()); SurgSim::Math::Vector3d size(1.0, 2.0, 3.0); component->setValue("Size", size); YAML::Node node(YAML::convert::encode(*component)); auto decoded = std::dynamic_pointer_cast( node.as>()); EXPECT_NE(nullptr, decoded); EXPECT_TRUE(size.isApprox(decoded->getValue("Size"))); } TEST(OsgBoxRepresentationTests, SizeXTest) { std::shared_ptr boxRepresentation = std::make_shared("test name"); std::default_random_engine generator; std::uniform_real_distribution distribution(1.0, 10.0); double randomSize = distribution(generator); boxRepresentation->setSizeX(randomSize); EXPECT_EQ(randomSize, boxRepresentation->getSizeX()); } TEST(OsgBoxRepresentationTests, SizeYTest) { std::shared_ptr boxRepresentation = std::make_shared("test name"); std::default_random_engine generator; std::uniform_real_distribution distribution(1.0, 10.0); double randomSize = distribution(generator); boxRepresentation->setSizeY(randomSize); EXPECT_EQ(randomSize, boxRepresentation->getSizeY()); } TEST(OsgBoxRepresentationTests, SizeZTest) { std::shared_ptr boxRepresentation = std::make_shared("test name"); std::default_random_engine generator; std::uniform_real_distribution distribution(1.0, 10.0); double randomSize = distribution(generator); boxRepresentation->setSizeZ(randomSize); EXPECT_EQ(randomSize, boxRepresentation->getSizeZ()); } TEST(OsgBoxRepresentationTests, SizeTest) { std::shared_ptr boxRepresentation = std::make_shared("test name"); std::default_random_engine generator; std::uniform_real_distribution distribution(1.0, 10.0); double randomSizeX = distribution(generator); double randomSizeY = distribution(generator); double randomSizeZ = distribution(generator); boxRepresentation->setSizeXYZ(randomSizeX, randomSizeY, randomSizeZ); EXPECT_EQ(randomSizeX, boxRepresentation->getSizeX()); EXPECT_EQ(randomSizeY, boxRepresentation->getSizeY()); EXPECT_EQ(randomSizeZ, boxRepresentation->getSizeZ()); } TEST(OsgBoxRepresentationTests, SizeVector3dTest) { std::shared_ptr boxRepresentation = std::make_shared("test name"); std::default_random_engine generator; std::uniform_real_distribution distribution(1.0, 10.0); Vector3d randomSize(distribution(generator), distribution(generator), distribution(generator)); boxRepresentation->setSize(randomSize); EXPECT_EQ(randomSize.x(), boxRepresentation->getSizeX()); EXPECT_EQ(randomSize.y(), boxRepresentation->getSizeY()); EXPECT_EQ(randomSize.z(), boxRepresentation->getSizeZ()); } }; // namespace Graphics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Graphics/UnitTests/OsgCameraTests.cpp000066400000000000000000000323421277777236100246030ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the OsgCamera class. #include #include #include #include #include "SurgSim/Framework/BasicSceneElement.h" #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Framework/Scene.h" #include "SurgSim/Graphics/OsgCamera.h" #include "SurgSim/Graphics/OsgGroup.h" #include "SurgSim/Graphics/OsgMatrixConversions.h" #include "SurgSim/Graphics/OsgRenderTarget.h" #include "SurgSim/Graphics/OsgTexture2d.h" #include "SurgSim/Graphics/UnitTests/MockObjects.h" #include "SurgSim/Graphics/UnitTests/MockOsgObjects.h" #include "SurgSim/Math/Quaternion.h" using SurgSim::Framework::BasicSceneElement; using SurgSim::Math::makeRigidTransform; using SurgSim::Math::Matrix44d; using SurgSim::Math::Quaterniond; using SurgSim::Math::RigidTransform3d; using SurgSim::Math::Vector3d; namespace SurgSim { namespace Graphics { TEST(OsgCameraTests, InitTest) { ASSERT_NO_THROW({std::shared_ptr camera = std::make_shared("test name");}); std::shared_ptr osgCamera = std::make_shared("test name"); std::shared_ptr camera = osgCamera; EXPECT_EQ("test name", camera->getName()); EXPECT_TRUE(camera->isActive()); EXPECT_TRUE(camera->getPose().matrix().isApprox( fromOsg(osgCamera->getOsgCamera()->getViewMatrix()).inverse())) << "Camera's pose should be initialized to the inverse of the osg::Camera's view matrix!"; EXPECT_TRUE(camera->getViewMatrix().isApprox(fromOsg(osgCamera->getOsgCamera()->getViewMatrix()))) << "Camera's view matrix should be initialized to the osg::Camera's view matrix!"; EXPECT_TRUE(camera->getProjectionMatrix().isApprox(fromOsg(osgCamera->getOsgCamera()->getProjectionMatrix()))) << "Camera's projection matrix should be initialized to the osg::Camera's projection matrix!"; EXPECT_EQ(0, camera->getRenderGroups().size()); } TEST(OsgCameraTests, OsgNodesTest) { std::shared_ptr osgCamera = std::make_shared("test name"); std::shared_ptr osgRepresentation = osgCamera; /// Check that the OSG nodes of the camera are built correctly osg::ref_ptr node = osgRepresentation->getOsgNode(); osg::ref_ptr switchNode = dynamic_cast(node.get()); EXPECT_TRUE(switchNode.valid()); EXPECT_EQ(1u, switchNode->getNumChildren()); osg::ref_ptr camera = osgCamera->getOsgCamera(); EXPECT_EQ(camera.get(), switchNode->getChild(0)); } TEST(OsgCameraTests, ActivenessTest) { std::shared_ptr osgCamera = std::make_shared("test name"); std::shared_ptr osgRepresentation = osgCamera; std::shared_ptr camera = osgCamera; // Get the osg::Switch from the OsgRepresentation so that we can make sure that the osg::Camera has the // correct visibility. osg::ref_ptr switchNode = dynamic_cast(osgRepresentation->getOsgNode().get()); EXPECT_TRUE(switchNode.valid()); EXPECT_TRUE(camera->isActive()); EXPECT_TRUE(switchNode->getChildValue(osgCamera->getOsgCamera())); camera->setLocalActive(false); EXPECT_FALSE(camera->isActive()); EXPECT_FALSE(switchNode->getChildValue(osgCamera->getOsgCamera())); camera->setLocalActive(true); EXPECT_TRUE(camera->isActive()); EXPECT_TRUE(switchNode->getChildValue(osgCamera->getOsgCamera())); } TEST(OsgCameraTests, GroupTest) { std::shared_ptr osgCamera = std::make_shared("test name"); std::shared_ptr camera = osgCamera; camera->addRenderGroupReference("test group"); EXPECT_EQ(0, camera->getRenderGroups().size()); /// Adding an OsgGroup should succeed std::shared_ptr osgGroup = std::make_shared(camera->getRenderGroupReferences().front()); std::shared_ptr group = osgGroup; EXPECT_TRUE(camera->setRenderGroup(group)); EXPECT_EQ(group, camera->getRenderGroups().front()); /// Check that the OSG node of the group is added to the OSG camera correctly EXPECT_EQ(osgGroup->getOsgGroup(), osgCamera->getOsgCamera()->getChild(0)->asGroup()->getChild(0)); /// Adding a group that does not derive from OsgGroup should fail std::shared_ptr mockGroup = std::make_shared(camera->getRenderGroupReferences().front()); EXPECT_FALSE(camera->setRenderGroup(mockGroup)); EXPECT_EQ(group, camera->getRenderGroups().front()); EXPECT_EQ(osgGroup->getOsgGroup(), osgCamera->getOsgCamera()->getChild(0)->asGroup()->getChild(0)); } TEST(OsgCameraTests, PoseTest) { auto runtime = std::make_shared(); auto scene = runtime->getScene(); std::shared_ptr osgCamera = std::make_shared("test name"); std::shared_ptr camera = osgCamera; camera->setRenderGroupReference("Test"); std::shared_ptr element = std::make_shared("element"); element->addComponent(camera); scene->addSceneElement(element); camera->wakeUp(); RigidTransform3d elementPose = SurgSim::Math::makeRigidTransform( Quaterniond(SurgSim::Math::Vector4d::Random()).normalized(), Vector3d::Random()); RigidTransform3d localPose = SurgSim::Math::makeRigidTransform( Quaterniond(SurgSim::Math::Vector4d::Random()).normalized(), Vector3d::Random()); RigidTransform3d pose = elementPose * localPose; { SCOPED_TRACE("Check Initial Pose"); EXPECT_TRUE(camera->getLocalPose().isApprox(RigidTransform3d::Identity())); EXPECT_TRUE(camera->getPose().isApprox(RigidTransform3d::Identity())); } { SCOPED_TRACE("Set Local Pose"); camera->setLocalPose(localPose); EXPECT_TRUE(camera->getLocalPose().isApprox(localPose)); EXPECT_TRUE(camera->getPose().isApprox(localPose)); EXPECT_TRUE(camera->getViewMatrix().isApprox(localPose.matrix().inverse())); EXPECT_TRUE(camera->getViewMatrix().inverse().isApprox(camera->getInverseViewMatrix())); camera->update(0.01); EXPECT_TRUE(fromOsg(osgCamera->getOsgCamera()->getViewMatrix()).isApprox(localPose.matrix().inverse())); } { SCOPED_TRACE("Set Element Pose"); element->setPose(elementPose); EXPECT_TRUE(camera->getLocalPose().isApprox(localPose)); EXPECT_TRUE(camera->getPose().isApprox(pose)); EXPECT_TRUE(camera->getViewMatrix().isApprox(pose.matrix().inverse())); EXPECT_TRUE(camera->getViewMatrix().inverse().isApprox(camera->getInverseViewMatrix())); camera->update(0.01); EXPECT_TRUE(fromOsg(osgCamera->getOsgCamera()->getViewMatrix()).isApprox(pose.matrix().inverse())); } } TEST(OsgCameraTests, MatricesTest) { std::shared_ptr osgCamera = std::make_shared("test name"); std::shared_ptr camera = osgCamera; Matrix44d projectionMatrix = Matrix44d::Random(); camera->setProjectionMatrix(projectionMatrix); EXPECT_TRUE(camera->getProjectionMatrix().isApprox(projectionMatrix)); EXPECT_TRUE(camera->getInverseProjectionMatrix().isApprox(projectionMatrix.inverse())); } TEST(OsgCameraTests, RenderTargetTest) { auto osgCamera = std::make_shared("test camera"); std::shared_ptr camera = osgCamera; std::shared_ptr renderTarget = std::make_shared(256, 256, 1.0, 2, true); EXPECT_NO_THROW(camera->setRenderTarget(renderTarget)); EXPECT_TRUE(osgCamera->getOsgCamera()->isRenderToTextureCamera()); } TEST(OsgCameraTests, CameraGroupTest) { std::shared_ptr camera = std::make_shared("TestRepresentation"); camera->clearGroupReferences(); camera->addGroupReference("test1"); camera->addGroupReference("test2"); EXPECT_EQ(2u, camera->getGroupReferences().size()); camera->setRenderGroupReference("otherTest"); EXPECT_EQ(2u, camera->getGroupReferences().size()); // Setting the render group of a camera to the group that it is in should remove the group // from the set camera->setRenderGroupReference("test1"); EXPECT_EQ(1u, camera->getGroupReferences().size()); // Should not be able to set group reference to the current render group EXPECT_FALSE(camera->addGroupReference("test1")); EXPECT_EQ(1u, camera->getGroupReferences().size()); } TEST(OsgCameraTests, Serialization) { std::shared_ptr camera = std::make_shared("TestOsgCamera"); // Set values. SurgSim::Math::Matrix44d projection = SurgSim::Math::Matrix44d::Random(); std::array viewport = { 1024, 768}; camera->setValue("ProjectionMatrix", projection); camera->setValue("ViewportSize", viewport); camera->setValue("AmbientColor", SurgSim::Math::Vector4d(0.1, 0.2, 0.3, 0.4)); camera->setViewport(10, 20, 30, 50); // Serialize. YAML::Node node; EXPECT_NO_THROW(node = YAML::convert::encode(*camera);); // Deserialize. std::shared_ptr newCamera; newCamera = std::dynamic_pointer_cast(node.as>()); EXPECT_NE(nullptr, newCamera); // Verify. EXPECT_TRUE(boost::any_cast(camera->getValue("ProjectionMatrix")).isApprox( boost::any_cast(newCamera->getValue("ProjectionMatrix")))); typedef std::array ParamType; EXPECT_TRUE(boost::any_cast(camera->getValue("ViewportSize")) == boost::any_cast(newCamera->getValue("ViewportSize"))); EXPECT_TRUE(boost::any_cast(camera->getValue("AmbientColor")).isApprox( boost::any_cast(newCamera->getValue("AmbientColor")))); } TEST(OsgCameraTests, SetProjection) { std::shared_ptr camera = std::make_shared("TestOsgCamera"); Math::Matrix44d identity = Math::Matrix44d::Identity(); camera->setProjectionMatrix(identity); osg::ref_ptr osgCamera(new osg::Camera); // Windows does not support initializer lists ... std::array persp = {{90.0, 1.0, 0.01, 10.0}}; osgCamera->setProjectionMatrixAsPerspective(persp[0], persp[1], persp[2], persp[3]); auto expectedPerspective = Graphics::fromOsg(osgCamera->getProjectionMatrix()); camera->setPerspectiveProjection(persp[0], persp[1], persp[2], persp[3]); EXPECT_TRUE(expectedPerspective.isApprox(camera->getProjectionMatrix())); camera->setProjectionMatrix(identity); EXPECT_NO_THROW(camera->setValue("PerspectiveProjection", persp)); EXPECT_TRUE(expectedPerspective.isApprox(camera->getProjectionMatrix())); camera->setProjectionMatrix(identity); std::array ortho = {{ -1.0, 1.0, 2.0, -2.0, 3.0, -3.0}}; osgCamera->setProjectionMatrixAsOrtho(ortho[0], ortho[1], ortho[2], ortho[3], ortho[4], ortho[5]); auto expectedOrtho = Graphics::fromOsg(osgCamera->getProjectionMatrix()); camera->setOrthogonalProjection(ortho[0], ortho[1], ortho[2], ortho[3], ortho[4], ortho[5]); EXPECT_TRUE(expectedOrtho.isApprox(camera->getProjectionMatrix())); camera->setProjectionMatrix(identity); EXPECT_NO_THROW(camera->setValue("OrthogonalProjection", ortho)); EXPECT_TRUE(expectedOrtho.isApprox(camera->getProjectionMatrix())); } TEST(OsgCameraTests, Viewport) { std::shared_ptr camera = std::make_shared("TestOsgCamera"); std::array original = {10, 20, 30, 40}; std::array result = {0, 0, 0, 0}; camera->setViewport(original[0], original[1], original[2], original[3]); camera->getViewport(&result[0], &result[1], &result[2], &result[3]); EXPECT_EQ(original, result); camera->setViewport(0, 0, 0, 0); camera->setValue("Viewport", original); result = camera->getValue>("Viewport"); EXPECT_EQ(original, result); } TEST(OsgCameraTests, MultipleRenderGroups) { std::shared_ptr camera = std::make_shared("TestOsgCamera"); EXPECT_EQ(0, camera->getRenderGroupReferences().size()); camera->addRenderGroupReference("Group1"); camera->addRenderGroupReference("Group2"); EXPECT_EQ(2, camera->getRenderGroupReferences().size()); std::vector references; references.push_back("Group3"); references.push_back("Group4"); references.push_back("Group5"); camera->setRenderGroupReferences(references); EXPECT_EQ(3, camera->getRenderGroupReferences().size()); camera->addRenderGroup(std::make_shared("Group3")); camera->addRenderGroup(std::make_shared("Group4")); camera->addRenderGroup(std::make_shared("Group5")); std::vector> groups; camera->getOsgCamera()->removeChildren(0, 1); references.push_back("Group6"); references.push_back("Group7"); references.push_back("Group8"); for (auto reference : references) { camera->addRenderGroupReference(reference); groups.push_back(std::make_shared(reference)); } camera->setRenderGroups(groups); EXPECT_EQ(groups.size(), camera->getRenderGroups().size()); } } // namespace Graphics } // namespace SurgSim opensurgsim-0.7.0/SurgSim/Graphics/UnitTests/OsgCapsuleRepresentationTests.cpp000066400000000000000000000065111277777236100277310ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the OsgCapsuleRepresentation class. #include "SurgSim/Graphics/UnitTests/MockOsgObjects.h" #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Graphics/OsgCapsuleRepresentation.h" #include "SurgSim/Math/Vector.h" #include using SurgSim::Math::Vector2d; namespace { const double epsilon = 1e-10; }; namespace SurgSim { namespace Graphics { TEST(OsgCapsuleRepresentationTests, AccessibleTest) { std::shared_ptr component; ASSERT_NO_THROW(component = SurgSim::Framework::Component::getFactory().create( "SurgSim::Graphics::OsgCapsuleRepresentation", "capsule")); EXPECT_EQ("SurgSim::Graphics::OsgCapsuleRepresentation", component->getClassName()); double radius = 4.321; double height = 1.234; component->setValue("Height", height); component->setValue("Radius", radius); YAML::Node node(YAML::convert::encode(*component)); auto decoded = std::dynamic_pointer_cast( node.as>()); EXPECT_NE(nullptr, decoded); EXPECT_DOUBLE_EQ(radius, decoded->getValue("Radius")); EXPECT_DOUBLE_EQ(height, decoded->getValue("Height")); } TEST(OsgCapsuleRepresentationTests, RadiusTest) { std::shared_ptr capsuleRepresentation = std::make_shared("test name"); double radius = 1.0; capsuleRepresentation->setRadius(radius); EXPECT_NEAR(capsuleRepresentation->getRadius(), radius, epsilon); } TEST(OsgCapsuleRepresentationTests, HeightTest) { std::shared_ptr capsuleRepresentation = std::make_shared("test name"); double height = 1.0; capsuleRepresentation->setHeight(height); EXPECT_NEAR(capsuleRepresentation->getHeight(), height, epsilon); } TEST(OsgCapsuleRepresentationTests, SizeTest) { std::shared_ptr capsuleRepresentation = std::make_shared("test name"); double radius = 1.0, height = 1.0; double retrievedRadius, retrievedHeight; capsuleRepresentation->setSize(radius, height); capsuleRepresentation->getSize(&retrievedRadius, &retrievedHeight); EXPECT_NEAR(radius, retrievedRadius, epsilon); EXPECT_NEAR(height, retrievedHeight, epsilon); } TEST(OsgCapsuleRepresentationTests, SizeVectordTest) { std::shared_ptr capsuleRepresentation = std::make_shared("test name"); Vector2d size(1.0, 1.0); capsuleRepresentation->setSize(size); EXPECT_TRUE(capsuleRepresentation->getSize().isApprox(size)); } }; // namespace Graphics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Graphics/UnitTests/OsgCurveRepresentationTests.cpp000066400000000000000000000053231277777236100274210ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Graphics/OsgCurveRepresentation.h" #include "SurgSim/DataStructures/Vertices.h" #include namespace { const double epsilon = 1e-5; } namespace SurgSim { namespace Graphics { TEST(OsgCurveRepresentationTests, Init) { ASSERT_NO_THROW({std::shared_ptr representation = std::make_shared("Test"); }); } // Tests setters and getters through the properties, thereby also testing the properties TEST(OsgCurveRepresentationTests, SetterGettersProperties) { auto curve = std::make_shared("Test"); double width = 1234.0; curve->setValue("Width", width); EXPECT_NEAR(width, curve->getValue("Width"), epsilon); EXPECT_NEAR(width, curve->getWidth(), epsilon); double tension = 0.1234; curve->setValue("Tension", tension); EXPECT_NEAR(tension, curve->getValue("Tension"), epsilon); EXPECT_NEAR(tension, curve->getTension(), epsilon); bool val = curve->isAntiAliasing(); curve->setValue("AntiAliasing", !val); EXPECT_EQ(!val, curve->isAntiAliasing()); EXPECT_EQ(!val, curve->getValue("AntiAliasing")); size_t subdivisions = 4321; curve->setValue("Subdivisions", subdivisions); EXPECT_EQ(subdivisions, curve->getValue("Subdivisions")); EXPECT_EQ(subdivisions, curve->getSubdivisions()); Math::Vector4d color(4.0, 3.0, 2.0, 1.0); curve->setValue("Color", color); EXPECT_TRUE(color.isApprox(curve->getValue("Color"))); EXPECT_TRUE(color.isApprox(curve->getColor())); } TEST(OsgCurveRepresentationTests, ControlPoints) { typedef DataStructures::VerticesPlain::VertexType Vertex; DataStructures::VerticesPlain vertices; vertices.addVertex(Vertex(Math::Vector3d(1.0, 2.0, 3.0))); auto curve = std::make_shared("Test"); EXPECT_ANY_THROW(curve->updateControlPoints(vertices)); vertices.addVertex(Vertex(Math::Vector3d(1.0, 2.0, 3.0))); vertices.addVertex(Vertex(Math::Vector3d(1.0, 2.0, 3.0))); EXPECT_NO_THROW(curve->updateControlPoints(vertices)); EXPECT_NO_THROW(curve->setValue("Vertices", vertices)); } } }opensurgsim-0.7.0/SurgSim/Graphics/UnitTests/OsgCylinderRepresentationTests.cpp000066400000000000000000000065501277777236100301110ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the OsgCylinderRepresentation class. #include "SurgSim/Graphics/UnitTests/MockOsgObjects.h" #include "SurgSim/Graphics/OsgMaterial.h" #include "SurgSim/Graphics/OsgCylinderRepresentation.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Framework/FrameworkConvert.h" #include #include using SurgSim::Math::Vector2d; namespace { const double epsilon = 1e-10; }; namespace SurgSim { namespace Graphics { TEST(OsgCylinderRepresentationTests, AccessibleTest) { std::shared_ptr component; ASSERT_NO_THROW(component = SurgSim::Framework::Component::getFactory().create( "SurgSim::Graphics::OsgCylinderRepresentation", "sphere")); EXPECT_EQ("SurgSim::Graphics::OsgCylinderRepresentation", component->getClassName()); double radius = 4.321; double height = 1.234; component->setValue("Height", height); component->setValue("Radius", radius); YAML::Node node(YAML::convert::encode(*component)); auto decoded = std::dynamic_pointer_cast( node.as>()); EXPECT_NE(nullptr, decoded); EXPECT_DOUBLE_EQ(radius, decoded->getValue("Radius")); EXPECT_DOUBLE_EQ(height, decoded->getValue("Height")); } TEST(OsgCylinderRepresentationTests, RadiusTest) { std::shared_ptr cylinderRepresentation = std::make_shared("test name"); double radius = 1.0; cylinderRepresentation->setRadius(radius); EXPECT_NEAR(radius, cylinderRepresentation->getRadius(), epsilon); } TEST(OsgCylinderRepresentationTests, HeightTest) { std::shared_ptr cylinderRepresentation = std::make_shared("test name"); double height = 1.0; cylinderRepresentation->setHeight(height); EXPECT_NEAR(height, cylinderRepresentation->getHeight(), epsilon); } TEST(OsgCylinderRepresentationTests, SizeTest) { std::shared_ptr cylinderRepresentation = std::make_shared("test name"); double radius = 1.0, height = 1.0; cylinderRepresentation->setSize(radius, height); EXPECT_NEAR(radius, cylinderRepresentation->getRadius(), epsilon); EXPECT_NEAR(height, cylinderRepresentation->getHeight(), epsilon); } TEST(OsgCylinderRepresentationTests, SizeVector2dTest) { std::shared_ptr cylinderRepresentation = std::make_shared("test name"); Vector2d size(1.0, 1.0); cylinderRepresentation->setSize(size); EXPECT_TRUE(size.isApprox(cylinderRepresentation->getSize(), epsilon)); } }; // namespace Graphics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Graphics/UnitTests/OsgGroupTests.cpp000066400000000000000000000230411277777236100245030ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the Group class. #include "SurgSim/Graphics/UnitTests/MockObjects.h" #include "SurgSim/Graphics/UnitTests/MockOsgObjects.h" #include "SurgSim/Graphics/OsgGroup.h" #include namespace SurgSim { namespace Graphics { TEST(OsgGroupTests, InitTest) { ASSERT_NO_THROW({std::shared_ptr group = std::make_shared("test name");}); std::shared_ptr osgGroup = std::make_shared("test group"); std::shared_ptr group = osgGroup; EXPECT_EQ("test group", group->getName()); EXPECT_TRUE(group->isVisible()); EXPECT_EQ(0u, group->getMembers().size()); EXPECT_EQ(0u, osgGroup->getOsgGroup()->getNumChildren()); } TEST(OsgGroupTests, OsgNodesTest) { std::shared_ptr osgGroup = std::make_shared("test group"); osg::ref_ptr osgSwitch = dynamic_cast(osgGroup->getOsgGroup().get()); ASSERT_TRUE(osgSwitch.valid()) << "Group's OSG node should be a switch!"; } TEST(OsgGroupTests, VisibilityTest) { std::shared_ptr osgGroup = std::make_shared("test group"); std::shared_ptr group = osgGroup; group->setVisible(false); EXPECT_FALSE(group->isVisible()); group->setVisible(true); EXPECT_TRUE(group->isVisible()); } TEST(OsgGroupTests, AddRemoveTest) { std::shared_ptr osgGroup = std::make_shared("test group"); std::shared_ptr group = osgGroup; EXPECT_EQ(0u, group->getMembers().size()); osg::ref_ptr osgSwitch = dynamic_cast(osgGroup->getOsgGroup().get()); ASSERT_TRUE(osgSwitch.valid()) << "Group's OSG node should be a switch!"; EXPECT_EQ(0u, osgSwitch->getNumChildren()); /// Add an representation and make sure the osg::Switch value for it is set correctly (should be true) std::shared_ptr representation1 = std::make_shared("test representation 1"); group->add(representation1); EXPECT_EQ(1u, group->getMembers().size()); EXPECT_EQ(1u, osgSwitch->getNumChildren()); EXPECT_EQ(0u, osgSwitch->getChildIndex(representation1->getOsgNode())); EXPECT_TRUE(osgSwitch->getChildValue(representation1->getOsgNode())) << "Representation 1 should be visible!"; /// Set group to not visible and check the osg::Switch values group->setVisible(false); EXPECT_FALSE(group->isVisible()); EXPECT_FALSE(osgSwitch->getChildValue(representation1->getOsgNode())) << "Representation 1 should not be visible!"; /// Add another representation and make sure the osg::Switch value for it is set correctly (should be false) std::shared_ptr representation2 = std::make_shared("test representation 2"); group->add(representation2); EXPECT_EQ(2u, group->getMembers().size()); EXPECT_EQ(2u, osgSwitch->getNumChildren()); EXPECT_EQ(1u, osgSwitch->getChildIndex(representation2->getOsgNode())); EXPECT_FALSE(osgSwitch->getChildValue(representation2->getOsgNode())) << "Representation 2 should not be visible!"; /// Set group to visible and check the osg::Switch values group->setVisible(true); EXPECT_TRUE(group->isVisible()); EXPECT_TRUE(osgSwitch->getChildValue(representation1->getOsgNode())) << "Representation 1 should be visible!"; EXPECT_TRUE(osgSwitch->getChildValue(representation2->getOsgNode())) << "Representation 2 should be visible!"; /// Set group to not visible and check the osg::Switch values group->setVisible(false); EXPECT_FALSE(group->isVisible()); EXPECT_FALSE(osgSwitch->getChildValue(representation1->getOsgNode())) << "Representation 1 should not be visible!"; EXPECT_FALSE(osgSwitch->getChildValue(representation2->getOsgNode())) << "Representation 1 should not be visible!"; /// Try to add a duplicate representation EXPECT_FALSE(group->add(representation1)); EXPECT_EQ(2u, group->getMembers().size()); EXPECT_EQ(2u, osgSwitch->getNumChildren()); /// Remove an representation EXPECT_TRUE(group->remove(representation1)); EXPECT_EQ(1u, osgSwitch->getNumChildren()); EXPECT_EQ(1u, osgSwitch->getChildIndex(representation1->getOsgNode())); /// Try to remove an representation that is not in the group EXPECT_FALSE(group->remove(representation1)); EXPECT_EQ(1u, osgSwitch->getChildIndex(representation1->getOsgNode())); /// Try to add a non-OSG representation std::shared_ptr nonOsgRepresentation = std::make_shared("non-osg representation"); EXPECT_FALSE(group->add(nonOsgRepresentation)) << "OsgGroup should only succeed on representations that derive from OsgRepresentation!"; EXPECT_EQ(1u, group->getMembers().size()); EXPECT_EQ(group->getMembers().end(), std::find(group->getMembers().begin(), group->getMembers().end(), nonOsgRepresentation)) << "Only subclasses of OsgRepresentation should be in an OsgGroup!"; EXPECT_EQ(1u, osgSwitch->getNumChildren()); } TEST(OsgGroupTests, AppendTest) { std::shared_ptr group1 = std::make_shared("test group 1"); EXPECT_EQ(0u, group1->getMembers().size()); std::shared_ptr representation1 = std::make_shared("test representation 1"); std::shared_ptr representation2 = std::make_shared("test representation 2"); /// Add 2 representations to group 1 EXPECT_TRUE(group1->add(representation1)); EXPECT_TRUE(group1->add(representation2)); EXPECT_EQ(2u, group1->getMembers().size()); std::shared_ptr representation3 = std::make_shared("test representation 3"); std::shared_ptr group2 = std::make_shared("test group 2"); EXPECT_EQ(0u, group2->getMembers().size()); /// Add an representation to group 2 and append group 1 to group 2. EXPECT_TRUE(group2->add(representation3)); EXPECT_TRUE(group2->append(group1)); EXPECT_EQ(3u, group2->getMembers().size()); // Check that the representations from group 1 were added to group 2, and that it still has the representation // that was added directly to it. EXPECT_NE(group2->getMembers().end(), std::find(group2->getMembers().begin(), group2->getMembers().end(), representation1)); EXPECT_NE(group2->getMembers().end(), std::find(group2->getMembers().begin(), group2->getMembers().end(), representation2)); EXPECT_NE(group2->getMembers().end(), std::find(group2->getMembers().begin(), group2->getMembers().end(), representation3)); /// Try to append a group that has already been appended - this will try to add duplicate representations. EXPECT_FALSE(group2->append(group1)) << "Append should return false if any representation is a duplicate!"; EXPECT_EQ(3u, group2->getMembers().size()); /// Check that group 1 was not modified by appending it to group 2. EXPECT_EQ(2u, group1->getMembers().size()); EXPECT_NE(group1->getMembers().end(), std::find(group1->getMembers().begin(), group1->getMembers().end(), representation1)); EXPECT_NE(group1->getMembers().end(), std::find(group1->getMembers().begin(), group1->getMembers().end(), representation2)); /// Try to append a group that is not a subclass of OsgGroup std::shared_ptr nonOsgGroup = std::make_shared("non-osg group"); std::shared_ptr nonOsgRepresentation = std::make_shared("non-osg representation"); /// Add an OSG and non-OSG representation to this group. EXPECT_TRUE(nonOsgGroup->add(representation3)); EXPECT_TRUE(nonOsgGroup->add(nonOsgRepresentation)); EXPECT_FALSE(group1->append(nonOsgGroup)); EXPECT_EQ(2u, group1->getMembers().size()) << "Nothing from the non-OSG group should have been added to the OsgGroup!"; EXPECT_EQ(group1->getMembers().end(), std::find(group1->getMembers().begin(), group1->getMembers().end(), representation3)); EXPECT_EQ(group1->getMembers().end(), std::find(group1->getMembers().begin(), group1->getMembers().end(), nonOsgRepresentation)); } TEST(OsgGroupTests, ClearTest) { std::shared_ptr osgGroup = std::make_shared("test name"); std::shared_ptr group = osgGroup; std::shared_ptr representation1 = std::make_shared("test representation 1"); std::shared_ptr representation2 = std::make_shared("test representation 2"); std::shared_ptr representation3 = std::make_shared("test representation 3"); osg::ref_ptr osgSwitch = dynamic_cast(osgGroup->getOsgGroup().get()); ASSERT_TRUE(osgSwitch.valid()) << "Group's OSG node should be a switch!"; EXPECT_EQ(0u, group->getMembers().size()); EXPECT_EQ(0u, osgSwitch->getNumChildren()); // Add 3 representations EXPECT_TRUE(group->add(representation1)); EXPECT_TRUE(group->add(representation2)); EXPECT_TRUE(group->add(representation3)); EXPECT_EQ(3u, group->getMembers().size()); EXPECT_EQ(3u, osgSwitch->getNumChildren()); // Remove all representations group->clear(); EXPECT_EQ(0u, group->getMembers().size()); EXPECT_EQ(0u, osgSwitch->getNumChildren()); } } // namespace Graphics } // namespace SurgSim opensurgsim-0.7.0/SurgSim/Graphics/UnitTests/OsgLightTests.cpp000066400000000000000000000160531277777236100244630ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Basic logic tests for OsgLight #include #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Graphics/Light.h" #include "SurgSim/Graphics/OsgGroup.h" #include "SurgSim/Graphics/OsgLight.h" #include "SurgSim/Graphics/OsgConversions.h" #include "SurgSim/Graphics/UnitTests/MockObjects.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/RigidTransform.h" using SurgSim::Math::Vector3d; using SurgSim::Math::Vector4d; using SurgSim::Math::Quaterniond; using SurgSim::Math::RigidTransform3d; namespace { const double epsilon = 1e-8; } namespace SurgSim { namespace Graphics { class OsgLightTests : public testing::Test { public: testing::AssertionResult hasUniforms( std::shared_ptr light, std::shared_ptr group, bool doesHave) { osg::ref_ptr osgGroup = group->getOsgGroup(); osg::ref_ptr stateSet = osgGroup->getStateSet(); for (auto it = std::begin(light->m_uniforms); it != std::end(light->m_uniforms); ++it) { osg::ref_ptr uniform = stateSet->getUniform(it->second->getName()); if (doesHave && uniform == nullptr) { return testing::AssertionFailure() << "Expected uniform " << it->second->getName() << " not found."; } else if (!doesHave && uniform != nullptr) { return testing::AssertionFailure() << "Did not expect uniform " << it->second->getName() << " but found it."; } } return testing::AssertionSuccess(); } osg::ref_ptr getUniform(std::shared_ptr light, int type) { return light->m_uniforms[type]; } }; TEST_F(OsgLightTests, InitTest) { ASSERT_NO_THROW({auto light = std::make_shared("TestLight");}); std::shared_ptr light = std::make_shared("TestLight"); ASSERT_EQ(nullptr, light->getGroup()); } TEST_F(OsgLightTests, GroupAccessorTest) { std::shared_ptr light = std::make_shared("TestLight"); std::shared_ptr group = std::make_shared("TestGroup"); std::shared_ptr mockGroup = std::make_shared("MockGroup"); // Light does not have a default group EXPECT_EQ(nullptr, light->getGroup()); // Assigning a light to a group EXPECT_TRUE(light->setGroup(group)); EXPECT_EQ(group, light->getGroup()); EXPECT_TRUE(hasUniforms(light, group, true)); // Light should not take a mock group as a group EXPECT_FALSE(light->setGroup(mockGroup)); EXPECT_EQ(group, light->getGroup()); // Assigning an empty group should clear the group EXPECT_TRUE(light->setGroup(nullptr)); EXPECT_EQ(nullptr, light->getGroup()); // Still should not accept a mock group EXPECT_FALSE(light->setGroup(mockGroup)); EXPECT_EQ(nullptr, light->getGroup()); // Setting the nullptr should also work EXPECT_TRUE(light->setGroup(nullptr)); EXPECT_EQ(nullptr, light->getGroup()); EXPECT_TRUE(hasUniforms(light, group, false)); } TEST_F(OsgLightTests, ColorAccessorTests) { std::shared_ptr light = std::make_shared("TestLight"); std::shared_ptr group = std::make_shared("TestGroup"); light->setGroup(group); // We are using the indices directly from the enum, in a white box way, there are not really // any good ways to do this better besides digging for the uniform by name ... // make sure all the values are different from each other so not to get false positives osg::Vec4f osgColor; Vector4d diffuse(1.0, 2.0, 3.0, 4.0); light->setDiffuseColor(diffuse); EXPECT_TRUE(diffuse.isApprox(light->getDiffuseColor())); getUniform(light, 1)->get(osgColor); EXPECT_TRUE(diffuse.isApprox(fromOsg(osgColor).cast())); Vector4d specular(2.0, 3.0, 4.0, 5.0); light->setSpecularColor(specular); EXPECT_TRUE(specular.isApprox(light->getSpecularColor())); getUniform(light, 2)->get(osgColor); EXPECT_TRUE(specular.isApprox(fromOsg(osgColor).cast())); } TEST_F(OsgLightTests, AttenuationAccessorTests) { std::shared_ptr light = std::make_shared("TestLight"); std::shared_ptr group = std::make_shared("TestGroup"); light->setGroup(group); float osgValue; double constantAttenuation = 3.0; light->setConstantAttenuation(constantAttenuation); EXPECT_NEAR(constantAttenuation, light->getConstantAttenuation(), epsilon); getUniform(light, 3)->get(osgValue); EXPECT_NEAR(constantAttenuation, static_cast(osgValue), epsilon); double linearAttenuation = 4.0; light->setLinearAttenuation(linearAttenuation); EXPECT_NEAR(linearAttenuation , light->getLinearAttenuation(), epsilon); getUniform(light, 4)->get(osgValue); EXPECT_NEAR(linearAttenuation, static_cast(osgValue), epsilon); double quadraticAttenuation = 5.0; light->setQuadraticAttenuation(quadraticAttenuation); EXPECT_NEAR(quadraticAttenuation, light->getQuadraticAttenuation(), epsilon); getUniform(light, 5)->get(osgValue); EXPECT_NEAR(quadraticAttenuation, static_cast(osgValue), epsilon); } TEST_F(OsgLightTests, Serialization) { std::shared_ptr component; ASSERT_NO_THROW(component = SurgSim::Framework::Component::getFactory().create( "SurgSim::Graphics::OsgLight", "light")); SurgSim::Math::Vector4d diffuse(0.1, 0.2, 0.3, 0.4); SurgSim::Math::Vector4d specular(0.4, 0.3, 0.2, 0.1); double constant = 0.1; double linear = 0.2; double quadratic = 0.3; std::string lightGroupRef = "test"; component->setValue("DiffuseColor", diffuse); component->setValue("SpecularColor", specular); component->setValue("ConstantAttenuation", constant); component->setValue("LinearAttenuation", linear); component->setValue("QuadraticAttenuation", quadratic); component->setValue("LightGroupReference", lightGroupRef); YAML::Node node(YAML::convert::encode(*component)); auto decode = std::dynamic_pointer_cast( node.as>()); EXPECT_NE(nullptr, decode); EXPECT_TRUE(diffuse.isApprox(decode->getValue("DiffuseColor"))); EXPECT_TRUE(specular.isApprox(decode->getValue("SpecularColor"))); EXPECT_NEAR(constant, decode->getValue("ConstantAttenuation"), 1e-9); EXPECT_NEAR(linear, decode->getValue("LinearAttenuation"), 1e-9); EXPECT_NEAR(quadratic, decode->getValue("QuadraticAttenuation"), 1e-9); EXPECT_EQ(lightGroupRef, decode->getValue("LightGroupReference")); } } // namespace Graphics } // namespace SurgSim opensurgsim-0.7.0/SurgSim/Graphics/UnitTests/OsgLogTests.cpp000066400000000000000000000042451277777236100241350ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include "SurgSim/Graphics/OsgLog.h" #include "SurgSim/Graphics/UnitTests/MockOsgObjects.h" TEST(OsgLogTests, MessageTest) { osg::NotifyHandler* pOsgLog = new MockOsgLog; osg::setNotifyHandler(pOsgLog); EXPECT_EQ("", dynamic_cast(pOsgLog)->getMessage()); osg::notify(osg::ALWAYS) << "osg::ALWAYS Test" << std::endl; EXPECT_EQ("CRITICAL osg::ALWAYS Test\n", dynamic_cast(pOsgLog)->getMessage()); osg::notify(osg::FATAL) << "osg::FATAL Test" << std::endl; EXPECT_EQ("CRITICAL osg::FATAL Test\n", dynamic_cast(pOsgLog)->getMessage()); osg::notify(osg::WARN) << "osg::WARN Test" << std::endl; EXPECT_EQ("WARNING osg::WARN Test\n", dynamic_cast(pOsgLog)->getMessage()); osg::notify(osg::NOTICE) << "osg::NOTICE Test" << std::endl; EXPECT_EQ("INFO osg::NOTICE Test\n", dynamic_cast(pOsgLog)->getMessage()); osg::notify(osg::INFO) << "osg::INFO Test" << std::endl; EXPECT_EQ("INFO osg::INFO Test\n", dynamic_cast(pOsgLog)->getMessage()); osg::notify(osg::DEBUG_INFO) << "osg::DEBUG_INFO Test" << std::endl; EXPECT_EQ("DEBUG osg::DEBUG_INFO Test\n", dynamic_cast(pOsgLog)->getMessage()); osg::notify(osg::DEBUG_FP) << "osg::DEBUG_FP Test" << std::endl; EXPECT_EQ("DEBUG osg::DEBUG_FP Test\n", dynamic_cast(pOsgLog)->getMessage()); osg::notify(osg::DEBUG_FP) << "osg::DEBUG_FP Test" << std::endl; EXPECT_EQ("DEBUG osg::DEBUG_FP Test\n", dynamic_cast(pOsgLog)->getMessage()); } opensurgsim-0.7.0/SurgSim/Graphics/UnitTests/OsgManagerTests.cpp000066400000000000000000000231621277777236100247650ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the OsgManager class. #include "SurgSim/Graphics/UnitTests/MockObjects.h" #include "SurgSim/Graphics/UnitTests/MockOsgObjects.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Graphics/OsgCamera.h" #include "SurgSim/Graphics/OsgGroup.h" #include "SurgSim/Graphics/OsgManager.h" #include "SurgSim/Graphics/OsgRepresentation.h" #include "SurgSim/Graphics/OsgView.h" #include "SurgSim/Graphics/OsgViewElement.h" #include #include #include #include using SurgSim::Framework::Runtime; using SurgSim::Framework::ComponentManager; using SurgSim::Framework::Representation; using SurgSim::Framework::Component; namespace SurgSim { namespace Graphics { class OsgManagerTest : public ::testing::Test { public: virtual void SetUp() { runtime = std::make_shared(); graphicsManager = std::make_shared(); runtime->addManager(graphicsManager); } virtual void TearDown() { runtime->stop(); } bool testDoAddComponent(const std::shared_ptr& component) { return graphicsManager->executeAdditions(component); } bool testDoRemoveComponent(const std::shared_ptr& component) { return graphicsManager->executeRemovals(component); } void doProcessComponents() { graphicsManager->processComponents(); } std::shared_ptr runtime; std::shared_ptr graphicsManager; }; TEST_F(OsgManagerTest, InitTest) { ASSERT_NO_THROW({std::shared_ptr manager = std::make_shared();}); } bool hasView(osgViewer::CompositeViewer* compositeViewer, osg::View* view) { bool foundView = false; for (unsigned int i = 0; i < compositeViewer->getNumViews(); ++i) { if (compositeViewer->getView(i) == view) { foundView = true; } } return foundView; } TEST_F(OsgManagerTest, AddRemoveTest) { osgViewer::CompositeViewer* compositeViewer = graphicsManager->getOsgCompositeViewer(); /// Perform add and remove from a pointer to a ComponentManager to check that the intended polymorphism is working. std::shared_ptr componentManager = graphicsManager; std::shared_ptr representation1 = std::make_shared("test representation 1"); std::shared_ptr representation2 = std::make_shared("test representation 2"); std::shared_ptr group1 = std::make_shared("test group 1"); std::shared_ptr group2 = std::make_shared("test group 2"); std::shared_ptr camera = std::make_shared("test camera"); std::shared_ptr view1 = std::make_shared("test view 1"); view1->setCamera(camera); std::shared_ptr view2 = std::make_shared("test view 2"); view2->setCamera(camera); std::shared_ptr nonOsgRepresentation = std::make_shared("non-osg representation"); std::shared_ptr nonOsgGroup = std::make_shared("non-osg group"); std::shared_ptr nonOsgView = std::make_shared("non-osg view"); using SurgSim::Framework::Representation; std::shared_ptr nonGraphicsComponent = std::make_shared( "non-graphics component"); EXPECT_EQ(0u, graphicsManager->getRepresentations().size()); EXPECT_EQ(0u, graphicsManager->getGroups().size()); EXPECT_EQ(0u, graphicsManager->getViews().size()); /// Add an representation EXPECT_TRUE(componentManager->enqueueAddComponent(representation1)); doProcessComponents(); EXPECT_EQ(1u, graphicsManager->getRepresentations().size()); EXPECT_EQ(1u, graphicsManager->getGroups().size()); EXPECT_NE(graphicsManager->getRepresentations().end(), std::find(graphicsManager->getRepresentations().begin(), graphicsManager->getRepresentations().end(), representation1)); /// Add a view EXPECT_TRUE(componentManager->enqueueAddComponent(view1)); doProcessComponents(); EXPECT_EQ(1u, graphicsManager->getViews().size()); EXPECT_NE(graphicsManager->getViews().end(), std::find(graphicsManager->getViews().begin(), graphicsManager->getViews().end(), view1)); EXPECT_TRUE(hasView(compositeViewer, view1->getOsgView())); /// Add another view EXPECT_TRUE(componentManager->enqueueAddComponent(view2)); doProcessComponents(); EXPECT_EQ(2u, graphicsManager->getViews().size()); EXPECT_NE(graphicsManager->getViews().end(), std::find(graphicsManager->getViews().begin(), graphicsManager->getViews().end(), view2)); /// Add another representation EXPECT_TRUE(componentManager->enqueueAddComponent(representation2)); doProcessComponents(); EXPECT_EQ(2u, graphicsManager->getRepresentations().size()); EXPECT_NE(graphicsManager->getRepresentations().end(), std::find(graphicsManager->getRepresentations().begin(), graphicsManager->getRepresentations().end(), representation2)); /// Try to add a duplicate representation EXPECT_TRUE(componentManager->enqueueAddComponent(representation1)); doProcessComponents(); EXPECT_EQ(2u, graphicsManager->getRepresentations().size()); /// Try to add a duplicate view EXPECT_TRUE(componentManager->enqueueAddComponent(view1)); doProcessComponents(); EXPECT_EQ(2u, graphicsManager->getViews().size()); /// Try to add an representation that is not a subclass of OsgRepresentation EXPECT_TRUE(componentManager->enqueueAddComponent(nonOsgRepresentation)) << "Adding an Representation that is not a subclass of OsgRepresentation should fail and return false"; doProcessComponents(); EXPECT_EQ(2u, graphicsManager->getRepresentations().size()); /// Try to add a view that is not a subclass of OsgView EXPECT_TRUE(componentManager->enqueueAddComponent(nonOsgView)) << "Adding a View that is not a subclass of OsgView should fail and return false"; doProcessComponents(); EXPECT_EQ(2u, graphicsManager->getViews().size()); /// Try to add a component that is not graphics-related EXPECT_TRUE(componentManager->enqueueAddComponent(nonGraphicsComponent)) << "Adding a component that this manager is not concerned with should return true"; /// Remove a view EXPECT_TRUE(componentManager->enqueueRemoveComponent(view2)); doProcessComponents(); EXPECT_EQ(graphicsManager->getViews().end(), std::find(graphicsManager->getViews().begin(), graphicsManager->getViews().end(), view2)); /// Remove an representation EXPECT_TRUE(componentManager->enqueueRemoveComponent(representation1)); doProcessComponents(); EXPECT_EQ(graphicsManager->getRepresentations().end(), std::find(graphicsManager->getRepresentations().begin(), graphicsManager->getRepresentations().end(), representation1)); /// Try to remove an representation that is not in the manager EXPECT_TRUE(componentManager->enqueueRemoveComponent(representation1)); doProcessComponents(); EXPECT_EQ(graphicsManager->getRepresentations().end(), std::find(graphicsManager->getRepresentations().begin(), graphicsManager->getRepresentations().end(), representation1)); /// Try to remove a view that is not in the manager EXPECT_TRUE(componentManager->enqueueRemoveComponent(view2)); doProcessComponents(); EXPECT_EQ(graphicsManager->getViews().end(), std::find(graphicsManager->getViews().begin(), graphicsManager->getViews().end(), view2)); /// Try to remove a component that is not graphics-related EXPECT_TRUE(componentManager->enqueueRemoveComponent(nonGraphicsComponent)) << "Removing a component that this manager is not concerned with should return true"; } TEST_F(OsgManagerTest, LazyGroupsTest) { std::shared_ptr representation1 = std::make_shared("TestRepresentation_1"); std::shared_ptr representation2 = std::make_shared("TestRepresentation_2"); std::shared_ptr representation3 = std::make_shared("TestRepresentation_3"); representation1->addGroupReference("TestGroup_1"); representation1->addGroupReference("TestGroup_2"); representation1->addGroupReference("TestGroup_3"); representation2->addGroupReference("TestGroup_2"); representation2->addGroupReference("TestGroup_3"); representation3->addGroupReference("TestGroup_3"); graphicsManager->enqueueAddComponent(representation1); graphicsManager->enqueueAddComponent(representation2); doProcessComponents(); auto defaultGroup = graphicsManager->getGroups().at(SurgSim::Graphics::Representation::DefaultGroupName); auto group1 = graphicsManager->getGroups().at("TestGroup_1"); auto group2 = graphicsManager->getGroups().at("TestGroup_2"); EXPECT_EQ(2U, defaultGroup->getMembers().size()); EXPECT_EQ(1U, group1->getMembers().size()); EXPECT_EQ(2U, group2->getMembers().size()); graphicsManager->enqueueAddComponent(representation3); doProcessComponents(); auto group3 = graphicsManager->getGroups().at("TestGroup_3"); EXPECT_EQ(3U, defaultGroup->getMembers().size()); EXPECT_EQ(1U, group1->getMembers().size()); EXPECT_EQ(2U, group2->getMembers().size()); EXPECT_EQ(3U, group3->getMembers().size()); } }; // namespace Graphics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Graphics/UnitTests/OsgMaterialTests.cpp000066400000000000000000000223341277777236100251510ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the OsgMaterial class. #include #include #include #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Graphics/OsgMaterial.h" #include "SurgSim/Graphics/OsgProgram.h" #include "SurgSim/Graphics/OsgUniform.h" using SurgSim::Math::Vector2f; namespace SurgSim { namespace Graphics { /// Uniform that does not subclass OsgUniformBase class MockUniform : public UniformBase { public: /// Constructor MockUniform() : UniformBase() { } }; class MockProgram : public Program { public: MOCK_CONST_METHOD0(hasGeometryShader, bool()); MOCK_CONST_METHOD0(hasVertexShader, bool()); MOCK_CONST_METHOD0(hasFragmentShader, bool()); MOCK_METHOD1(setGeometryShaderSource, void(const std::string&)); MOCK_METHOD1(setVertexShaderSource, void(const std::string&)); MOCK_METHOD1(setFragmentShaderSource, void(const std::string&)); MOCK_METHOD1(loadGeometryShader, bool(const std::string&)); MOCK_METHOD1(loadVertexShader, bool(const std::string&)); MOCK_METHOD1(loadFragmentShader, bool(const std::string&)); MOCK_CONST_METHOD1(getGeometryShaderSource, bool(std::string*)); MOCK_CONST_METHOD1(getVertexShaderSource, bool(std::string*)); MOCK_CONST_METHOD1(getFragmentShaderSource, bool(std::string*)); MOCK_METHOD0(clearGeometryShader, void()); MOCK_METHOD0(clearVertexShader, void()); MOCK_METHOD0(clearFragmentShader, void()); MOCK_CONST_METHOD0(isGlobalScope, bool()); MOCK_METHOD1(setGlobalScope, void(bool)); //NOLINT }; TEST(OsgMaterialTests, InitTest) { auto material = std::make_shared("material"); EXPECT_EQ(0u, material->getNumUniforms()); EXPECT_EQ(nullptr, material->getProgram()); EXPECT_NE(nullptr, material->getOsgStateSet()); } TEST(OsgMaterialTests, AddUniformTest) { auto material = std::make_shared("material"); { float value = 2.0; ASSERT_NO_THROW(material->addUniform("float", "test_float_uniform", value)); EXPECT_EQ(value, material->getValue("test_float_uniform")); } { float value = 2.0; EXPECT_THROW(material->addUniform("invalid", "test_float_uniform", value), Framework::AssertionFailure); } { double value = 2.0; EXPECT_THROW(material->addUniform("float", "test_float_uniform", value), boost::bad_any_cast); } { Math::Vector4f vector(1.0, 2.0, 3.0, 4.0); ASSERT_NO_THROW(material->addUniform("vec4", "test_vector_uniform", vector)); EXPECT_TRUE(vector.isApprox(material->getValue("test_vector_uniform"))); } { Math::Vector4f vector(1.0, 2.0, 3.0, 4.0); EXPECT_THROW(material->addUniform("dvec4", "test_vector_uniform", vector), boost::bad_any_cast); } { auto texture = std::make_shared(); ASSERT_NO_THROW(material->addUniform("samplerCube", "test_texture_uniform", texture)); EXPECT_EQ(texture, material->getValue>("test_texture_uniform")); } } TEST(OsgMaterialTests, AddAndRemoveUniformsTest) { std::shared_ptr osgMaterial = std::make_shared("material"); std::shared_ptr material = osgMaterial; auto runtime = std::make_shared(); material->initialize(runtime); EXPECT_EQ(0u, material->getNumUniforms()); std::shared_ptr> osgUniform1 = std::make_shared>("float uniform"); std::shared_ptr> uniform1 = osgUniform1; std::shared_ptr> osgUniform2 = std::make_shared>("Vector2f uniform"); std::shared_ptr> uniform2 = osgUniform2; const osg::StateSet::UniformList& uniforms = osgMaterial->getOsgStateSet()->getUniformList(); // Add a uniform to the material EXPECT_NO_THROW(material->addUniform(uniform1)); EXPECT_EQ(1u, material->getNumUniforms()); EXPECT_EQ(uniform1, material->getUniform(0)); EXPECT_EQ(1u, uniforms.size()); EXPECT_EQ(osgUniform1->getOsgUniform(), uniforms.at("float uniform").first); /// Add another uniform to the material EXPECT_NO_THROW(material->addUniform(uniform2)); EXPECT_EQ(2u, material->getNumUniforms()); EXPECT_EQ(uniform2, material->getUniform(1)); EXPECT_EQ(2u, uniforms.size()); EXPECT_EQ(osgUniform1->getOsgUniform(), uniforms.at("float uniform").first); EXPECT_EQ(osgUniform2->getOsgUniform(), uniforms.at("Vector2f uniform").first); /// Remove the first uniform from the material EXPECT_TRUE(material->removeUniform(uniform1)); EXPECT_EQ(1u, material->getNumUniforms()); EXPECT_EQ(uniform2, material->getUniform(0)); EXPECT_EQ(1u, uniforms.size()); EXPECT_EQ(osgUniform2->getOsgUniform(), uniforms.at("Vector2f uniform").first); /// Try removing the same uniform again EXPECT_FALSE(material->removeUniform(uniform1)); EXPECT_EQ(1u, material->getNumUniforms()); /// Try adding a non-OSG Uniform std::shared_ptr nonOsgUniform = std::make_shared(); EXPECT_THROW(material->addUniform(nonOsgUniform), Framework::AssertionFailure) << "Should not be able to add a uniform that is not a subclass of OsgUniformBase!"; EXPECT_EQ(1u, material->getNumUniforms()); /// Try removing a non-OSG Uniform EXPECT_FALSE(material->removeUniform(nonOsgUniform)) << "Should not be able to remove a uniform that is not a subclass of OsgUniformBase!"; EXPECT_EQ(1u, material->getNumUniforms()); } TEST(OsgMaterialTests, SetAndClearShaderTest) { std::shared_ptr osgMaterial = std::make_shared("material"); std::shared_ptr material = osgMaterial; EXPECT_EQ(nullptr, material->getProgram()); std::shared_ptr osgProgram = std::make_shared(); std::shared_ptr program = osgProgram; const osg::StateSet::AttributeList& attributes = osgMaterial->getOsgStateSet()->getAttributeList(); // Set the material's program EXPECT_TRUE(material->setProgram(program)); EXPECT_EQ(program, material->getProgram()); EXPECT_EQ(1u, attributes.size()); EXPECT_EQ(osgProgram->getOsgProgram(), attributes.at(osg::StateAttribute::TypeMemberPair( osg::StateAttribute::PROGRAM, 0)).first) << "Program should have been added to the material's state attributes!"; /// Try setting a non-OSG Program std::shared_ptr nonOsgProgram = std::make_shared(); EXPECT_FALSE(material->setProgram(nonOsgProgram)) << "Should not be able to set a program that is not a subclass of OsgProgram!"; EXPECT_NE(nonOsgProgram, material->getProgram()); /// Clear the program material->clearProgram(); EXPECT_EQ(nullptr, material->getProgram()); EXPECT_EQ(0u, attributes.size()) << "Program should have been removed from the material's state attributes!"; } TEST(OsgMaterialTests, NamedAccessTest) { std::shared_ptr osgMaterial = std::make_shared("material"); std::shared_ptr material = osgMaterial; std::string uniform1Name = "float uniform"; std::shared_ptr> osgUniform1 = std::make_shared>(uniform1Name); std::shared_ptr> uniform1 = osgUniform1; std::string uniform2Name = "Vector2f uniform"; std::shared_ptr> osgUniform2 = std::make_shared>(uniform2Name); std::shared_ptr> uniform2 = osgUniform2; material->addUniform(uniform1); material->addUniform(uniform2); EXPECT_TRUE(material->hasUniform(uniform1Name)); EXPECT_EQ(uniform1.get(), material->getUniform(uniform1Name).get()); EXPECT_TRUE(material->hasUniform(uniform2Name)); EXPECT_EQ(uniform2.get(), material->getUniform(uniform2Name).get()); EXPECT_FALSE(material->hasUniform("xxx")); EXPECT_EQ(nullptr, material->getUniform("xxx")); EXPECT_TRUE(material->removeUniform(uniform1Name)); EXPECT_FALSE(material->hasUniform(uniform1Name)); } TEST(OsgMaterialTests, AccessibleUniformTest) { auto material = std::make_shared("material"); std::string uniform1Name = "ossFloatUniform"; auto uniform1 = std::make_shared>(uniform1Name); std::string uniform2Name = "ossVector2fUniform"; auto uniform2 = std::make_shared>(uniform2Name); material->addUniform(uniform1); material->addUniform(uniform2); material->setValue(uniform1Name, 2.0f); EXPECT_FLOAT_EQ(2.0, uniform1->get()); uniform1->set(4.0f); EXPECT_FLOAT_EQ(4.0f, material->getValue(uniform1Name)); Vector2f vector1(1.0f, 2.0f); Vector2f vector2(3.0f, 4.0f); material->setValue(uniform2Name, vector1); EXPECT_TRUE(vector1.isApprox(uniform2->get())); uniform2->set(vector2); EXPECT_TRUE(vector2.isApprox(material->getValue(uniform2Name))); material->removeUniform(uniform1); EXPECT_ANY_THROW(material->setValue(uniform1Name, 1.0f)); } } // namespace Graphics } // namespace SurgSim opensurgsim-0.7.0/SurgSim/Graphics/UnitTests/OsgMatrixConversionsTests.cpp000066400000000000000000000063361277777236100271140ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for conversions to and from OSG matrix types #include "SurgSim/Graphics/OsgMatrixConversions.h" #include "SurgSim/Graphics/OsgVectorConversions.h" #include using SurgSim::Graphics::fromOsg; using SurgSim::Graphics::toOsg; using SurgSim::Math::Matrix22f; using SurgSim::Math::Matrix22d; using SurgSim::Math::Matrix33f; using SurgSim::Math::Matrix33d; using SurgSim::Math::Matrix44f; using SurgSim::Math::Matrix44d; using SurgSim::Math::Vector2f; using SurgSim::Math::Vector2d; using SurgSim::Math::Vector3f; using SurgSim::Math::Vector3d; using SurgSim::Math::Vector4f; using SurgSim::Math::Vector4d; TEST(OsgMatrixConversionsTests, Matrix22fTest) { Matrix22f matrix = Matrix22f::Random(); osg::Matrix2 osgMatrix = toOsg(matrix); EXPECT_TRUE(matrix.isApprox(fromOsg(osgMatrix))); } TEST(OsgMatrixConversionsTests, Matrix22dTest) { Matrix22d matrix = Matrix22d::Random(); osg::Matrix2d osgMatrix = toOsg(matrix); EXPECT_TRUE(matrix.isApprox(fromOsg(osgMatrix))); } TEST(OsgMatrixConversionsTests, Matrix33fTest) { Matrix33f matrix = Matrix33f::Random(); osg::Matrix3 osgMatrix = toOsg(matrix); EXPECT_TRUE(matrix.isApprox(fromOsg(osgMatrix))); } TEST(OsgMatrixConversionsTests, Matrix33dTest) { Matrix33d matrix = Matrix33d::Random(); osg::Matrix3d osgMatrix = toOsg(matrix); EXPECT_TRUE(matrix.isApprox(fromOsg(osgMatrix))); } TEST(OsgMatrixConversionsTests, Matrix44fConversionTest) { Matrix44f matrix = Matrix44f::Random(); osg::Matrixf osgMatrix = toOsg(matrix); EXPECT_TRUE(matrix.isApprox(fromOsg(osgMatrix))); } TEST(OsgMatrixConversionsTests, Matrix44fMultiplicationTest) { Matrix44f matrix = Matrix44f::Random(); Vector4f vector = Vector4f::Random(); osg::Matrixf osgMatrix = toOsg(matrix); osg::Vec4f osgVector = toOsg(vector); /// Multiply with Eigen Vector4f result = matrix * vector; /// Multiply with OSG osg::Vec4f osgResult = osgVector * osgMatrix; /// Compare the two results EXPECT_TRUE(result.isApprox(fromOsg(osgResult))); } TEST(OsgMatrixConversionsTests, Matrix44dTest) { Matrix44d matrix = Matrix44d::Random(); osg::Matrixd osgMatrix = toOsg(matrix); EXPECT_TRUE(matrix.isApprox(fromOsg(osgMatrix))); } TEST(OsgMatrixConversionsTests, Matrix44dMultiplicationTest) { Matrix44d matrix = Matrix44d::Random(); Vector4d vector = Vector4d::Random(); osg::Matrixd osgMatrix = toOsg(matrix); osg::Vec4d osgVector = toOsg(vector); /// Multiply with Eigen Vector4d result = matrix * vector; /// Multiply with OSG osg::Vec4d osgResult = osgVector * osgMatrix; /// Compare the two results EXPECT_TRUE(result.isApprox(fromOsg(osgResult))); }opensurgsim-0.7.0/SurgSim/Graphics/UnitTests/OsgMeshRepresentationTests.cpp000066400000000000000000000126111277777236100272270ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include #include #include #include "SurgSim/DataStructures/PlyReader.h" #include "SurgSim/Framework/ApplicationData.h" #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Graphics/Mesh.h" #include "SurgSim/Graphics/MeshPlyReaderDelegate.h" #include "SurgSim/Graphics/OsgMeshRepresentation.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Testing/TestCube.h" using SurgSim::Math::Vector2d; using SurgSim::Math::Vector3d; using SurgSim::Math::Vector4d; using SurgSim::Framework::Runtime; namespace { std::vector cubeVertices; std::vector cubeTriangles; std::vector cubeColors; std::vector cubeTextures; } namespace SurgSim { namespace Graphics { TEST(OsgMeshRepresentationTests, InitTest) { std::shared_ptr runtime = std::make_shared(); std::shared_ptr meshRepresentation; ASSERT_NO_THROW(meshRepresentation = std::make_shared("TestMesh")); SurgSim::Testing::Cube::makeCube(&cubeVertices, &cubeColors, &cubeTextures, &cubeTriangles); ASSERT_NE(nullptr, meshRepresentation->getMesh()); EXPECT_EQ(OsgMeshRepresentation::UPDATE_OPTION_VERTICES, meshRepresentation->getUpdateOptions()); }; TEST(OsgMeshRepresentationTests, InitialisationTest) { std::shared_ptr runtime = std::make_shared(); auto meshRepresentation = std::make_shared("TestMesh"); std::shared_ptr mesh = meshRepresentation->getMesh(); mesh->initialize(cubeVertices, cubeColors, cubeTextures, cubeTriangles); EXPECT_TRUE(meshRepresentation->initialize(runtime)); EXPECT_TRUE(meshRepresentation->wakeUp()); ASSERT_NO_THROW(meshRepresentation->update(0.1)); osg::ref_ptr geometry = meshRepresentation->getOsgGeometry(); EXPECT_NE(nullptr, geometry); osg::ref_ptr array = geometry->getVertexArray(); ASSERT_NE(nullptr, array); EXPECT_EQ(cubeVertices.size(), array->getNumElements()); array = geometry->getColorArray(); ASSERT_NE(nullptr, array); EXPECT_EQ(cubeColors.size(), array->getNumElements()); array = geometry->getTexCoordArray(0); ASSERT_NE(nullptr, array); EXPECT_EQ(cubeTextures.size(), array->getNumElements()); osg::ref_ptr primitiveSet = geometry->getPrimitiveSet(0); ASSERT_NE(nullptr, primitiveSet); EXPECT_EQ(cubeTriangles.size(), primitiveSet->getNumIndices()); } TEST(OsgMeshRepresentationTests, SerializationTest) { std::shared_ptr runtime = std::make_shared("config.txt"); std::shared_ptr osgMesh = std::make_shared("TestMesh"); std::string filename = "Geometry/Cube_with_texture.ply"; osgMesh->setValue("MeshFileName", filename); osgMesh->setValue("UpdateOptions", 2); osgMesh->setValue("DrawAsWireFrame", true); YAML::Node node; ASSERT_NO_THROW(node = YAML::convert::encode(*osgMesh)); EXPECT_EQ(1u, node.size()); YAML::Node data; data = node["SurgSim::Graphics::OsgMeshRepresentation"]; std::shared_ptr newOsgMesh; ASSERT_NO_THROW(newOsgMesh = std::dynamic_pointer_cast( node.as>())); EXPECT_EQ("SurgSim::Graphics::OsgMeshRepresentation", newOsgMesh->getClassName()); EXPECT_EQ(filename, newOsgMesh->getMesh()->getFileName()); EXPECT_EQ(2u, newOsgMesh->getValue("UpdateOptions")); EXPECT_TRUE(newOsgMesh->getValue("DrawAsWireFrame")); } TEST(OsgMeshRepresentationTests, MeshDelegateTest) { SurgSim::Framework::ApplicationData data("config.txt"); SurgSim::DataStructures::PlyReader reader(data.findFile("Geometry/Cube_with_texture.ply")); auto delegate = std::make_shared(); EXPECT_NO_THROW(EXPECT_TRUE(reader.parseWithDelegate(delegate))); auto mesh = delegate->getMesh(); EXPECT_EQ(26u, mesh->getNumVertices()); EXPECT_EQ(12u, mesh->getNumTriangles()); // The first and last vertices from the file Vector3d vertex0(1.0, 1.0, -1.0); Vector3d vertex25(-1.0, -1.0, 1.0); Vector2d texture0(0.00, 0.50); Vector2d texture25(0.25, 0.75); EXPECT_TRUE(vertex0.isApprox(mesh->getVertex(0).position)); EXPECT_TRUE(vertex25.isApprox(mesh->getVertex(25).position)); EXPECT_TRUE(texture0.isApprox(mesh->getVertex(0).data.texture.getValue())); EXPECT_TRUE(texture25.isApprox(mesh->getVertex(25).data.texture.getValue())); std::array triangle0 = {0, 1, 2}; std::array triangle11 = {10, 25, 11}; EXPECT_EQ(triangle0, mesh->getTriangle(0).verticesId); EXPECT_EQ(triangle11, mesh->getTriangle(11).verticesId); } }; // namespace Graphics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Graphics/UnitTests/OsgOctreeRepresentationTests.cpp000066400000000000000000000117131277777236100275560ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Unit Tests for the OsgOctreeRepresentation class. #include #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/DataStructures/EmptyData.h" #include "SurgSim/Graphics/OsgOctreeRepresentation.h" #include "SurgSim/Math/OctreeShape.h" #include "SurgSim/Math/Vector.h" using SurgSim::Framework::Runtime; using SurgSim::DataStructures::EmptyData; using SurgSim::Graphics::OsgOctreeRepresentation; using SurgSim::Math::OctreeShape; using SurgSim::Math::Vector3d; TEST(OsgOctreeRepresentationTests, InitilizationTest) { ASSERT_NO_THROW(std::make_shared("Test Octree")); }; TEST(OsgOctreeRepresentationTests, GetSetUpdateTest) { OctreeShape::NodeType::AxisAlignedBoundingBox boundingBox(Vector3d::Zero(), Vector3d::Ones() * 4.0); auto octreeNode = std::make_shared(boundingBox); auto octreeShape = std::make_shared(*octreeNode); auto runtime = std::make_shared(); auto octreeRepresentation = std::make_shared("Test Octree"); octreeRepresentation->setOctreeShape(octreeShape); EXPECT_TRUE(octreeRepresentation->initialize(runtime)); EXPECT_TRUE(octreeRepresentation->wakeUp()); // Set the octree after wake up will cause a assertion failure. ASSERT_ANY_THROW({ octreeRepresentation->setOctreeShape(octreeShape); }); ASSERT_NO_THROW(octreeRepresentation->update(0.1)); } TEST(OsgOctreeRepresentationTests, SetNodeVisibilityTest) { SurgSim::DataStructures::EmptyData emptyData; OctreeShape::NodeType::AxisAlignedBoundingBox boundingBox(Vector3d::Zero(), Vector3d::Ones() * 4.0); auto octreeNode = std::make_shared(boundingBox); octreeNode->addData(Vector3d(0.0, 0.0, 0.0), 2, emptyData); octreeNode->addData(Vector3d(0.0, 0.0, 1.0), 3, emptyData); auto octreeShape = std::make_shared(*octreeNode); auto octreeRepresentation = std::make_shared("TestOctree"); // Path to leaf node SurgSim::DataStructures::OctreePath path; path.push_back(0); path.push_back(0); // Set node visibility when no octree is held by OsgOctreeRepresentation will throw. EXPECT_ANY_THROW(octreeRepresentation->setNodeVisible(path, true)); octreeRepresentation->setOctreeShape(octreeShape); EXPECT_NO_THROW(octreeRepresentation->setNodeVisible(path, false)); // Path to internal node SurgSim::DataStructures::OctreePath path2; path2.push_back(0); EXPECT_NO_THROW(octreeRepresentation->setNodeVisible(path2, true)); // Invalid path SurgSim::DataStructures::OctreePath invalidPath; invalidPath.push_back(4); invalidPath.push_back(1); EXPECT_ANY_THROW(octreeRepresentation->setNodeVisible(invalidPath, true)); } TEST(OsgOctreeRepresentationTests, SerializationTest) { Runtime runtime("config.txt"); std::shared_ptr octreeShape = std::make_shared(); std::string filename = "Geometry/staple.ply"; std::static_pointer_cast(octreeShape)->loadOctree(filename); std::shared_ptr osgOctree = std::make_shared("TestOctree"); osgOctree->setValue("OctreeShape", octreeShape); YAML::Node node; ASSERT_NO_THROW(node = YAML::convert::encode(*osgOctree)); EXPECT_EQ(1u, node.size()); YAML::Node data = node["SurgSim::Graphics::OsgOctreeRepresentation"]; std::shared_ptr newOsgOctree; ASSERT_NO_THROW(newOsgOctree = std::dynamic_pointer_cast( node.as>())); EXPECT_EQ("SurgSim::Graphics::OsgOctreeRepresentation", newOsgOctree->getClassName()); auto newOctree = newOsgOctree->getOctreeShape(); auto oldOctree = std::static_pointer_cast(octreeShape)->getOctree(); EXPECT_TRUE(newOctree->getOctree()->getBoundingBox().isApprox(oldOctree->getBoundingBox())); EXPECT_TRUE(newOsgOctree->getOctreeShape()->isValid()); EXPECT_EQ(SurgSim::Math::SHAPE_TYPE_OCTREE, newOctree->getType()); EXPECT_THROW(newOctree->getVolume(), SurgSim::Framework::AssertionFailure); EXPECT_TRUE((newOctree->getCenter() - Vector3d::Zero()).isZero()); EXPECT_THROW(newOctree->getSecondMomentOfVolume(), SurgSim::Framework::AssertionFailure); } opensurgsim-0.7.0/SurgSim/Graphics/UnitTests/OsgPlaneRepresentationTests.cpp000066400000000000000000000045441277777236100274000ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the OsgPlaneRepresentation class. #include "SurgSim/Graphics/UnitTests/MockOsgObjects.h" #include "SurgSim/Framework/BasicSceneElement.h" #include "SurgSim/Graphics/OsgMaterial.h" #include "SurgSim/Graphics/OsgPlaneRepresentation.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Framework/FrameworkConvert.h" #include #include #include using SurgSim::Framework::BasicSceneElement; using SurgSim::Math::Quaterniond; using SurgSim::Math::RigidTransform3d; using SurgSim::Math::Vector3d; using SurgSim::Math::makeRigidTransform; using SurgSim::Math::makeRotationQuaternion; namespace SurgSim { namespace Graphics { TEST(OsgPlaneRepresentationTests, InitTest) { ASSERT_NO_THROW({std::shared_ptr representation = std::make_shared("test name"); }); std::shared_ptr representation = std::make_shared("test name"); EXPECT_EQ("test name", representation->getName()); } TEST(OsgPlaneRepresentationTests, AccessibleTest) { std::shared_ptr component; ASSERT_NO_THROW(component = SurgSim::Framework::Component::getFactory().create( "SurgSim::Graphics::OsgPlaneRepresentation", "plane")); EXPECT_EQ("SurgSim::Graphics::OsgPlaneRepresentation", component->getClassName()); YAML::Node node(YAML::convert::encode(*component)); auto decoded = std::dynamic_pointer_cast( node.as>()); EXPECT_NE(nullptr, decoded); } }; // namespace Graphics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Graphics/UnitTests/OsgPlaneTests.cpp000066400000000000000000000043071277777236100244520ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the OsgPlane class. #include "SurgSim/Graphics/OsgPlane.h" #include namespace SurgSim { namespace Graphics { TEST(OsgPlaneTests, InitTest) { ASSERT_NO_THROW({OsgPlane plane;}); ASSERT_NO_THROW({OsgPlane plane(100.0, 200.0);}); OsgPlane plane; osg::ref_ptr node = plane.getNode(); EXPECT_NE(nullptr, node.get()); osg::ref_ptr geode = dynamic_cast(node.get()); EXPECT_NE(nullptr, geode.get()); EXPECT_EQ(1u, geode->getNumDrawables()); osg::ref_ptr drawable = geode->getDrawable(0); EXPECT_NE(nullptr, drawable.get()); osg::ref_ptr geometry = dynamic_cast(drawable.get()); EXPECT_NE(nullptr, geometry.get()); osg::Vec3Array* vertices = dynamic_cast(geometry->getVertexArray()); ASSERT_EQ(4u, vertices->size()); osg::Vec3 u = vertices->at(1) - vertices->at(0); osg::Vec3 v = vertices->at(2) - vertices->at(0); osg::Vec3 normal = u ^ v; normal.normalize(); EXPECT_EQ(0.0, vertices->at(0).y()) << "The plane should be in the XZ plane (Y = 0)!"; EXPECT_NEAR(1.0, normal * osg::Vec3(0.0, 1.0, 0.0), 1.0e-10) << "The plane normal should be +Y!"; EXPECT_NEAR(0.0, vertices->at(3) * normal, 1.0e-10) << "All vertices should be co-planar!"; osg::Vec3 sum(0.0, 0.0, 0.0); for (size_t i = 0; i < vertices->size(); ++i) { sum += vertices->at(i); } sum /= vertices->size(); EXPECT_NEAR(0.0, sum.length(), 1e-10) << "The center of the plane should be (0, 0, 0)!"; } }; // namespace Graphics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Graphics/UnitTests/OsgPointCloudRepresentationTests.cpp000066400000000000000000000074251277777236100304220ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include "SurgSim/DataStructures/EmptyData.h" #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Graphics/OsgPointCloudRepresentation.h" #include "SurgSim/Math/Vector.h" using SurgSim::DataStructures::EmptyData; using SurgSim::Graphics::PointCloudRepresentation; using SurgSim::Graphics::OsgPointCloudRepresentation; using SurgSim::Math::Vector3d; using SurgSim::Math::Vector4d; namespace { const double epsilon = 1e-5; } namespace SurgSim { namespace Graphics { TEST(OsgPointCloudRepresentationTests, InitTest) { ASSERT_NO_THROW(OsgPointCloudRepresentation("TestPointCloud")); }; TEST(OsgPointCloudRepresentationTests, PointSizeTest) { auto pointCloud = std::make_shared("TestPointCloud"); double pointSize = 1.234; pointCloud->setPointSize(pointSize); EXPECT_NEAR(pointSize, pointCloud->getPointSize(), epsilon); } TEST(OsgPointCloudRepresentationTests, ColorTest) { auto pointCloud = std::make_shared("TestPointCloud"); Vector4d color = Vector4d(1.0, 2.0, 3.0, 4.0); pointCloud->setColor(color); EXPECT_TRUE(color.isApprox(pointCloud->getColor())); } TEST(OsgPointCloudRepresentationTests, VertexTest) { auto pointCloud = std::make_shared("TestPointCloud"); auto vertices = pointCloud->getVertices(); EXPECT_EQ(0u, vertices->getNumVertices()); std::vector vertexList; vertexList.push_back(Vector3d(0.01, -0.01, 0.01)); vertexList.push_back(Vector3d(0.01, -0.01, 0.01)); vertexList.push_back(Vector3d(-0.01, -0.01, 0.01)); vertexList.push_back(Vector3d(-0.01, -0.01, -0.01)); vertexList.push_back(Vector3d(0.01, -0.01, -0.01)); for (auto it = std::begin(vertexList); it != std::end(vertexList); ++it) { vertices->addVertex(SurgSim::Graphics::PointCloud::VertexType(*it)); } auto updatedVertices = pointCloud->getVertices(); ASSERT_EQ(vertexList.size(), updatedVertices->getNumVertices()); for (size_t i = 0; i < vertexList.size(); ++i) { EXPECT_TRUE(vertexList[i].isApprox(updatedVertices->getVertexPosition(i))); } } TEST(OsgPointCloudRepresentationTests, SerializationTest) { auto pointCloud = std::make_shared("TestPointCloud"); double pointSize = 1.234; Vector4d color = Vector4d(1.0, 2.0, 3.0, 4.0); pointCloud->setValue("PointSize", pointSize); pointCloud->setValue("Color", color); YAML::Node node; ASSERT_NO_THROW(node = YAML::convert::encode(*pointCloud)); EXPECT_EQ(1u, node.size()); YAML::Node data; data = node["SurgSim::Graphics::OsgPointCloudRepresentation"]; std::shared_ptr newOsgPointCloud; ASSERT_NO_THROW(newOsgPointCloud = std::dynamic_pointer_cast (node.as>())); EXPECT_EQ("SurgSim::Graphics::OsgPointCloudRepresentation", newOsgPointCloud->getClassName()); EXPECT_NEAR(pointSize, newOsgPointCloud->getValue("PointSize"), epsilon); EXPECT_TRUE(color.isApprox(newOsgPointCloud->getValue("Color"))); } }; // namespace Graphics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Graphics/UnitTests/OsgProgramTests.cpp000066400000000000000000000211571277777236100250240ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the OsgProgram class. #include "SurgSim/Framework/ApplicationData.h" #include "SurgSim/Graphics/OsgProgram.h" #include #include #include #include namespace { /// Sample vertex shader code const std::string vertexShader = "varying vec4 vertColor;\n" "void main(void)\n" "{\n" " gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n" " vertColor.rgb = gl_Normal;\n" " vertColor.a = 1.0;\n" "}\n"; /// Sample geometry shader code const std::string geometryShader = "#version 150\n" "#extension GL_EXT_gpu_shader4 : enable\n" "#extension GL_EXT_geometry_shader4 : enable\n" "layout(triangles) in;\n" "layout(triangle_strip, max_vertices=3) out;\n" "in vec4 vertColor[3];\n" "out vec4 geomColor;\n" "void main()\n" "{\n" " for (int i = 0; i < gl_VerticesIn; ++i)\n" " {\n" " gl_Position = gl_PositionIn[i];\n" " geomColor = vertColor[i];\n" " EmitVertex();\n" " }\n" " EndPrimitive();\n" "};"; /// Sample fragment shader code const std::string fragmentShader = "varying vec4 geomColor;\n" "void main(void)\n" "{\n" " gl_FragColor = geomColor;\n" "}"; } namespace SurgSim { namespace Graphics { TEST(OsgProgramTests, InitTest) { OsgProgram program; EXPECT_NE(nullptr, program.getOsgProgram()); EXPECT_EQ(0u, program.getOsgProgram()->getNumShaders()); } TEST(OsgProgramTests, StateSetTest) { OsgProgram program; // Create an OSG state set osg::ref_ptr stateSet = new osg::StateSet(); const osg::StateSet::AttributeList& attributes = stateSet->getAttributeList(); EXPECT_EQ(0u, attributes.size()); /// Add the program to the state set program.addToStateSet(stateSet.get()); EXPECT_EQ(1u, attributes.size()) << "State set has no attributes, one program should have been added!"; EXPECT_EQ(program.getOsgProgram(), attributes.at(osg::StateAttribute::TypeMemberPair(osg::StateAttribute::PROGRAM, 0)).first) << "First attribute in state set should be the added program!"; /// Remove the program from the state set program.removeFromStateSet(stateSet.get()); EXPECT_EQ(0u, attributes.size()) << "State set should no longer have any attributes, the program should have been removed!"; } TEST(OsgProgramTests, SetShaderSourceTest) { std::shared_ptr osgProgram = std::make_shared(); std::shared_ptr program = osgProgram; EXPECT_FALSE(program->hasVertexShader()); EXPECT_FALSE(program->hasGeometryShader()); EXPECT_FALSE(program->hasFragmentShader()); { SCOPED_TRACE("Set vertex shader source"); program->setVertexShaderSource(vertexShader); std::string resultVertexShader; EXPECT_TRUE(program->hasVertexShader()); EXPECT_TRUE(program->getVertexShaderSource(&resultVertexShader)); EXPECT_EQ(vertexShader, resultVertexShader); EXPECT_EQ(1u, osgProgram->getOsgProgram()->getNumShaders()); } { SCOPED_TRACE("Set geometry shader source"); program->setGeometryShaderSource(geometryShader); std::string resultGeometryShader; EXPECT_TRUE(program->hasGeometryShader()); EXPECT_TRUE(program->getGeometryShaderSource(&resultGeometryShader)); EXPECT_EQ(geometryShader, resultGeometryShader); EXPECT_EQ(2u, osgProgram->getOsgProgram()->getNumShaders()); } { SCOPED_TRACE("Set fragment shader source"); program->setFragmentShaderSource(fragmentShader); std::string resultFragmentShader; EXPECT_TRUE(program->hasFragmentShader()); EXPECT_TRUE(program->getFragmentShaderSource(&resultFragmentShader)); EXPECT_EQ(fragmentShader, resultFragmentShader); EXPECT_EQ(3u, osgProgram->getOsgProgram()->getNumShaders()); } } void expectFileContents(const std::string& filePath, const std::string& contents) { boost::filesystem::ifstream fileStream(filePath); std::stringstream resultStream(contents); ASSERT_FALSE(fileStream.bad()); std::string fileLine; std::string resultLine; while (!fileStream.eof() && !resultStream.eof()) { fileStream >> fileLine; resultStream >> resultLine; // Skip possible trailing newlines fileStream >> std::ws; resultStream >> std::ws; EXPECT_EQ(fileLine, resultLine); } EXPECT_TRUE(fileStream.eof()); EXPECT_TRUE(resultStream.eof()); fileStream.close(); } TEST(OsgProgramTests, LoadShaderSourceTest) { SurgSim::Framework::ApplicationData data("config.txt"); std::string vertexShaderPath = data.findFile("OsgProgramTests/shader.vert"); std::string geometryShaderPath = data.findFile("OsgProgramTests/shader.geom"); std::string fragmentShaderPath = data.findFile("OsgProgramTests/shader.frag"); ASSERT_NE("", vertexShaderPath) << "Could not find vertex shader!"; ASSERT_NE("", geometryShaderPath) << "Could not find geometry shader!"; ASSERT_NE("", fragmentShaderPath) << "Could not find fragment shader!"; std::shared_ptr osgProgram = std::make_shared(); std::shared_ptr program = osgProgram; { SCOPED_TRACE("Load vertex shader source from file"); EXPECT_TRUE(program->loadVertexShader(vertexShaderPath)); std::string resultVertexShader; EXPECT_TRUE(program->getVertexShaderSource(&resultVertexShader)); expectFileContents(vertexShaderPath, resultVertexShader); EXPECT_EQ(1u, osgProgram->getOsgProgram()->getNumShaders()); } { SCOPED_TRACE("Load geometry shader source from file"); EXPECT_TRUE(program->loadGeometryShader(geometryShaderPath)); std::string resultGeometryShader; EXPECT_TRUE(program->getGeometryShaderSource(&resultGeometryShader)); expectFileContents(geometryShaderPath, resultGeometryShader); EXPECT_EQ(2u, osgProgram->getOsgProgram()->getNumShaders()); } { SCOPED_TRACE("Load fragment shader source from file"); EXPECT_TRUE(program->loadFragmentShader(fragmentShaderPath)); std::string resultFragmentShader; EXPECT_TRUE(program->getFragmentShaderSource(&resultFragmentShader)); expectFileContents(fragmentShaderPath, resultFragmentShader); EXPECT_EQ(3u, osgProgram->getOsgProgram()->getNumShaders()); } } TEST(OsgProgramTests, ClearShaderTest) { std::shared_ptr osgProgram = std::make_shared(); std::shared_ptr program = osgProgram; // Set vertex, geometry, and fragment shaders EXPECT_FALSE(program->hasVertexShader()); program->setVertexShaderSource(vertexShader); EXPECT_TRUE(program->hasVertexShader()); EXPECT_FALSE(program->hasGeometryShader()); program->setGeometryShaderSource(geometryShader); EXPECT_TRUE(program->hasGeometryShader()); EXPECT_FALSE(program->hasFragmentShader()); program->setFragmentShaderSource(fragmentShader); EXPECT_TRUE(program->hasFragmentShader()); EXPECT_EQ(3u, osgProgram->getOsgProgram()->getNumShaders()); { SCOPED_TRACE("Clear vertex shader"); program->clearVertexShader(); EXPECT_FALSE(program->hasVertexShader()); EXPECT_TRUE(program->hasGeometryShader()); EXPECT_TRUE(program->hasFragmentShader()); EXPECT_EQ(2u, osgProgram->getOsgProgram()->getNumShaders()); } program->setVertexShaderSource(vertexShader); EXPECT_TRUE(program->hasVertexShader()); { SCOPED_TRACE("Clear geometry shader"); program->clearGeometryShader(); EXPECT_TRUE(program->hasVertexShader()); EXPECT_FALSE(program->hasGeometryShader()); EXPECT_TRUE(program->hasFragmentShader()); EXPECT_EQ(2u, osgProgram->getOsgProgram()->getNumShaders()); } program->setGeometryShaderSource(geometryShader); EXPECT_TRUE(program->hasGeometryShader()); { SCOPED_TRACE("Clear fragment shader"); program->clearFragmentShader(); EXPECT_TRUE(program->hasVertexShader()); EXPECT_TRUE(program->hasGeometryShader()); EXPECT_FALSE(program->hasFragmentShader()); EXPECT_EQ(2u, osgProgram->getOsgProgram()->getNumShaders()); } program->setFragmentShaderSource(fragmentShader); EXPECT_TRUE(program->hasFragmentShader()); { SCOPED_TRACE("Clear the entire shader"); program->clear(); EXPECT_FALSE(program->hasVertexShader()); EXPECT_FALSE(program->hasGeometryShader()); EXPECT_FALSE(program->hasFragmentShader()); EXPECT_EQ(0u, osgProgram->getOsgProgram()->getNumShaders()); } } } // namespace Graphics } // namespace SurgSim opensurgsim-0.7.0/SurgSim/Graphics/UnitTests/OsgQuaternionConversionsTests.cpp000066400000000000000000000027271277777236100277750ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for conversions to and from OSG quaternion types #include "SurgSim/Graphics/OsgQuaternionConversions.h" #include "SurgSim/Math/Vector.h" #include using SurgSim::Graphics::fromOsg; using SurgSim::Graphics::toOsg; using SurgSim::Math::Quaternionf; using SurgSim::Math::Quaterniond; using SurgSim::Math::Vector4f; using SurgSim::Math::Vector4d; TEST(OsgQuaternionConversionsTests, QuaternionfTest) { Quaternionf quaternion = Quaternionf(Vector4f::Random()); osg::Quat osgQuaternion = toOsg(quaternion); EXPECT_TRUE(quaternion.isApprox(fromOsg(osgQuaternion))); } TEST(OsgQuaternionConversionsTests, QuaterniondTest) { Quaterniond quaternion = Quaterniond(Vector4d::Random()); osg::Quat osgQuaternion = toOsg(quaternion); EXPECT_TRUE(quaternion.isApprox(fromOsg(osgQuaternion))); } opensurgsim-0.7.0/SurgSim/Graphics/UnitTests/OsgRenderTargetTests.cpp000066400000000000000000000046251277777236100260040ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Graphics/OsgRenderTarget.h" #include "SurgSim/Graphics/OsgCamera.h" namespace SurgSim { namespace Graphics { TEST(OsgRenderTargetTests, DefaultConstructorTest) { EXPECT_NO_THROW({OsgRenderTarget2d target;}); EXPECT_NO_THROW({OsgRenderTargetRectangle target;}); } TEST(OsgRenderTargetTests, PotDefaultConstructorTest) { EXPECT_NO_THROW({OsgRenderTarget2d target;}); OsgRenderTarget2d target; int width, height; target.getSize(&width, &height); EXPECT_EQ(0.0, width); EXPECT_EQ(0.0, height); EXPECT_FALSE(target.doesUseDepthTarget()); EXPECT_TRUE(nullptr == target.getDepthTarget()); ASSERT_EQ(0, target.getColorTargetCount()); for(int i=0; i<16; ++i) { EXPECT_TRUE(nullptr == target.getColorTarget(i)) << "color target should be nullptr at index:" << i; } } TEST(OsgRenderTargetTests, PotSpecificConstructorTest) { ASSERT_NO_THROW({OsgRenderTarget2d target(256,256,1.0,16,true);}); OsgRenderTarget2d target(256,128,1.0,16,true); int width, height; target.getSize(&width, &height); EXPECT_EQ(256, width); EXPECT_EQ(128, height); EXPECT_TRUE(target.doesUseDepthTarget()); EXPECT_FALSE(nullptr == target.getDepthTarget()); EXPECT_EQ(16, target.getColorTargetCount()); for(int i=0; i<16; ++i) { EXPECT_FALSE(nullptr == target.getColorTarget(i)) << "color target is nullptr at index:" << i; } } TEST(OsgRenderTargetTests, CameraTest) { auto camera = std::make_shared("Camera1"); auto renderTarget1 = std::make_shared(256,256,1.0,8,true); auto renderTarget2 = std::make_shared(128,128,1.0,8,true); EXPECT_NO_THROW(camera->setRenderTarget(renderTarget1)); EXPECT_NO_THROW(camera->setRenderTarget(renderTarget2)); } }; // namespace Graphics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Graphics/UnitTests/OsgRepresentationTests.cpp000066400000000000000000000316701277777236100264200ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the OsgRepresentation class. #include #include #include #include #include "SurgSim/Framework/BasicSceneElement.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Framework/Scene.h" #include "SurgSim/Graphics/OsgCamera.h" #include "SurgSim/Graphics/OsgMaterial.h" #include "SurgSim/Graphics/OsgSceneryRepresentation.h" #include "SurgSim/Graphics/UnitTests/MockOsgObjects.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/Vector.h" using SurgSim::Framework::BasicSceneElement; using SurgSim::Math::Quaterniond; using SurgSim::Math::RigidTransform3d; using SurgSim::Math::Vector3d; using SurgSim::Math::makeRigidTransform; namespace SurgSim { namespace Graphics { TEST(OsgRepresentationTests, InitTest) { ASSERT_NO_THROW({std::shared_ptr representation = std::make_shared("test name"); }); std::shared_ptr representation = std::make_shared("test name"); EXPECT_EQ("test name", representation->getName()); EXPECT_TRUE(representation->isActive()); } TEST(OsgRepresentationsTests, ParameterTests) { auto representation = std::make_shared("name"); ASSERT_NO_THROW(representation->setValue("GroupReferences", std::vector())); ASSERT_NO_THROW(representation->getValue("GroupReferences")); ASSERT_NO_THROW(representation->setValue("DrawAsWireFrame", true)); ASSERT_NO_THROW(representation->getValue("DrawAsWireFrame")); ASSERT_NO_THROW(representation->setValue("GenerateTangents", true)); ASSERT_NO_THROW(representation->getValue("GenerateTangents")); } TEST(OsgRepresentationTests, OsgNodeTest) { std::shared_ptr representation = std::make_shared("test name"); EXPECT_NE(nullptr, representation->getOsgNode()); // Check that the OSG node is a group (MockOsgRepresentation passes a new group as the node into the // OsgRepresentation constructor) osg::ref_ptr osgGroup = dynamic_cast(representation->getOsgNode().get()); EXPECT_TRUE(osgGroup.valid()) << "Representation's OSG node should be a group!"; } TEST(OsgRepresentationTests, ActivityTest) { std::shared_ptr osgRepresentation = std::make_shared("test name"); std::shared_ptr representation = osgRepresentation; osg::Switch* switchNode = dynamic_cast(osgRepresentation->getOsgNode().get()); ASSERT_NE(nullptr, switchNode) << "Could not get OSG switch node!"; ASSERT_EQ(1u, switchNode->getNumChildren()) << "OSG switch node should have 1 child, the transform node!"; EXPECT_TRUE(representation->isActive()); representation->update(0.0); EXPECT_TRUE(switchNode->getChildValue(switchNode->getChild(0))); representation->setLocalActive(false); EXPECT_FALSE(representation->isActive()); representation->update(0.0); EXPECT_FALSE(switchNode->getChildValue(switchNode->getChild(0))); representation->setLocalActive(true); EXPECT_TRUE(representation->isActive()); representation->update(0.0); EXPECT_TRUE(switchNode->getChildValue(switchNode->getChild(0))); } TEST(OsgRepresentationTests, WireFrameTest) { std::shared_ptr representation = std::make_shared("test name"); EXPECT_FALSE(representation->getDrawAsWireFrame()); representation->setDrawAsWireFrame(true); EXPECT_TRUE(representation->getDrawAsWireFrame()); } TEST(OsgRepresentationTests, PoseTest) { auto runtime = std::make_shared(); auto scene = runtime->getScene(); std::shared_ptr representation = std::make_shared("test name"); std::shared_ptr element = std::make_shared("element"); element->addComponent(representation); scene->addSceneElement(element); representation->wakeUp(); { SCOPED_TRACE("Check Initial Pose"); EXPECT_TRUE(representation->getLocalPose().isApprox(RigidTransform3d::Identity())); EXPECT_TRUE(representation->getPose().isApprox(RigidTransform3d::Identity())); } RigidTransform3d localPose; { SCOPED_TRACE("Set Local Pose"); localPose = Math::makeRigidTransform(Quaterniond(Math::Vector4d::Random()).normalized(), Vector3d::Random()); representation->setLocalPose(localPose); EXPECT_TRUE(representation->getLocalPose().isApprox(localPose)); EXPECT_TRUE(representation->getPose().isApprox(localPose)); } RigidTransform3d elementPose; { SCOPED_TRACE("Set Element Pose"); elementPose = Math::makeRigidTransform(Quaterniond(Math::Vector4d::Random()).normalized(), Vector3d::Random()); element->setPose(elementPose); EXPECT_TRUE(representation->getLocalPose().isApprox(localPose)); EXPECT_TRUE(representation->getPose().isApprox(elementPose * localPose)); } { SCOPED_TRACE("Change Local Pose"); localPose = Math::makeRigidTransform(Quaterniond(Math::Vector4d::Random()).normalized(), Vector3d::Random()); representation->setLocalPose(localPose); EXPECT_TRUE(representation->getLocalPose().isApprox(localPose)); EXPECT_TRUE(representation->getPose().isApprox(elementPose * localPose)); } } TEST(OsgRepresentationTests, MaterialTest) { std::shared_ptr osgRepresentation = std::make_shared("test name"); std::shared_ptr representation = osgRepresentation; std::shared_ptr osgMaterial = std::make_shared("material"); std::shared_ptr material = osgMaterial; { SCOPED_TRACE("Set material"); EXPECT_TRUE(representation->setMaterial(material)); EXPECT_EQ(material, representation->getMaterial()); osg::Switch* switchNode = dynamic_cast(osgRepresentation->getOsgNode().get()); ASSERT_NE(nullptr, switchNode) << "Could not get OSG switch node!"; ASSERT_EQ(1u, switchNode->getNumChildren()) << "OSG switch node should have 1 child, the transform node!"; EXPECT_EQ(osgMaterial->getOsgStateSet(), switchNode->getChild(0)->getStateSet()) << "State set should be the material's state set!"; } { SCOPED_TRACE("Clear material"); representation->clearMaterial(); EXPECT_EQ(nullptr, representation->getMaterial()); osg::Switch* switchNode = dynamic_cast(osgRepresentation->getOsgNode().get()); ASSERT_NE(nullptr, switchNode) << "Could not get OSG switch node!"; ASSERT_EQ(1u, switchNode->getNumChildren()) << "OSG switch node should have 1 child, the transform node!"; EXPECT_NE(osgMaterial->getOsgStateSet(), switchNode->getChild(0)->getStateSet()) << "State set should have been cleared!"; } } TEST(OsgRepresentationTests, AddUniformTest) { std::shared_ptr representation = std::make_shared("test name"); { float value = 2.0; ASSERT_NO_THROW(representation->addUniform("float", "test_float_uniform", value)); } { float value = 2.0; EXPECT_THROW(representation->addUniform("invalid", "test_float_uniform", value), Framework::AssertionFailure); } { double value = 2.0; EXPECT_THROW(representation->addUniform("float", "test_float_uniform", value), boost::bad_any_cast); } { Math::Vector4f vector(1.0, 2.0, 3.0, 4.0); ASSERT_NO_THROW(representation->addUniform("vec4", "test_vector_uniform", vector)); } { Math::Vector4f vector(1.0, 2.0, 3.0, 4.0); EXPECT_THROW(representation->addUniform("dvec4", "test_vector_uniform", vector), boost::bad_any_cast); } { auto texture = std::make_shared(); ASSERT_NO_THROW(representation->addUniform("samplerCube", "test_texture_uniform", texture)); } } TEST(OsgRepresentationTests, UpdateTest) { std::shared_ptr mockRepresentation = std::make_shared("test name"); std::shared_ptr representation = mockRepresentation; EXPECT_EQ(0, mockRepresentation->getNumUpdates()); EXPECT_EQ(0.0, mockRepresentation->getSumDt()); double sumDt = 0.0; std::default_random_engine generator; std::uniform_real_distribution distribution(0.0, 1.0); /// Do 10 updates with random dt and check each time that the number of updates and sum of dt are correct. for (int i = 1; i <= 10; ++i) { double dt = distribution(generator); sumDt += dt; representation->update(dt); EXPECT_EQ(i, mockRepresentation->getNumUpdates()); EXPECT_LT(fabs(sumDt - mockRepresentation->getSumDt()), Eigen::NumTraits::dummy_precision()); } } TEST(OsgRepresentationTests, GroupTest) { std::shared_ptr rep = std::make_shared("TestRepresentation"); rep->clearGroupReferences(); EXPECT_TRUE(rep->addGroupReference("group1")); EXPECT_FALSE(rep->addGroupReference("group1")); EXPECT_TRUE(rep->addGroupReference("group2")); EXPECT_TRUE(rep->addGroupReference("group3")); std::vector groups = rep->getGroupReferences(); EXPECT_EQ(3U, groups.size()); EXPECT_NE(std::end(groups), std::find(std::begin(groups), std::end(groups), "group1")); EXPECT_NE(std::end(groups), std::find(std::begin(groups), std::end(groups), "group2")); EXPECT_NE(std::end(groups), std::find(std::begin(groups), std::end(groups), "group3")); } TEST(OsgRepresentationTests, GroupsTest) { std::shared_ptr rep = std::make_shared("TestRepresentation"); rep->clearGroupReferences(); std::vector newGroups; newGroups.push_back("group1"); newGroups.push_back("group1"); newGroups.push_back("group2"); newGroups.push_back("group3"); rep->addGroupReferences(newGroups); std::vector groups = rep->getGroupReferences(); EXPECT_EQ(3U, groups.size()); EXPECT_NE(std::end(groups), std::find(std::begin(groups), std::end(groups), "group1")); EXPECT_NE(std::end(groups), std::find(std::begin(groups), std::end(groups), "group2")); EXPECT_NE(std::end(groups), std::find(std::begin(groups), std::end(groups), "group3")); } TEST(OsgRepresentationTests, SetGroupsTests) { std::shared_ptr rep = std::make_shared("TestRepresentation"); std::vector newGroups; newGroups.push_back("group1"); newGroups.push_back("group1"); newGroups.push_back("group2"); newGroups.push_back("group3"); rep->addGroupReference("OtherGroup"); rep->setGroupReferences(newGroups); std::vector groups = rep->getGroupReferences(); EXPECT_EQ(3U, groups.size()); EXPECT_NE(std::end(groups), std::find(std::begin(groups), std::end(groups), "group1")); EXPECT_NE(std::end(groups), std::find(std::begin(groups), std::end(groups), "group2")); EXPECT_NE(std::end(groups), std::find(std::begin(groups), std::end(groups), "group3")); } class CheckTangentsVisitor : public osg::NodeVisitor { public : CheckTangentsVisitor() : NodeVisitor(NodeVisitor::TRAVERSE_ALL_CHILDREN) { } virtual ~CheckTangentsVisitor() { } void apply(osg::Node& node) // NOLINT { traverse(node); } void apply(osg::Geode& geode) // NOLINT { // Test object only has 1 geometry ... if (geode.getNumDrawables() > 0) { osg::Geometry* curGeom = geode.getDrawable(0)->asGeometry(); if (curGeom) { osg::Vec3Array* vertices = dynamic_cast(curGeom->getVertexArray()); auto tangents = dynamic_cast(curGeom->getVertexAttribArray(TANGENT_VERTEX_ATTRIBUTE_ID)); ASSERT_NE(nullptr, tangents) << "Looks like no tangents where produced, or they are not of type osg::Vec4Array"; ASSERT_EQ(vertices->size(), tangents->size()) << "Looks like number of tangents does not match number of vertices"; auto bitangents = dynamic_cast(curGeom->getVertexAttribArray(BITANGENT_VERTEX_ATTRIBUTE_ID)); ASSERT_NE(nullptr, bitangents) << "Looks like no bitangents tangents where produced, or they are not of type osg::Vec4Array"; ASSERT_EQ(vertices->size(), bitangents->size()) << "Looks like number of bitangents does not match number of vertices"; } } } }; TEST(OsgRepresentationTests, TangentGenerationTest) { auto runtime = std::make_shared("config.txt"); auto scenery = std::make_shared("scenery"); scenery->loadModel("Geometry/sphere0_5.obj"); EXPECT_FALSE(scenery->isGeneratingTangents()); scenery->setGenerateTangents(true); EXPECT_TRUE(scenery->isGeneratingTangents()); CheckTangentsVisitor visitor; scenery->getOsgNode()->accept(visitor); } } // namespace Graphics } // namespace SurgSim opensurgsim-0.7.0/SurgSim/Graphics/UnitTests/OsgRigidTransformConversionsTests.cpp000066400000000000000000000075541277777236100306050ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for conversions to and from OSG rigid transform types #include "SurgSim/Graphics/OsgQuaternionConversions.h" #include "SurgSim/Graphics/OsgRigidTransformConversions.h" #include "SurgSim/Graphics/OsgVectorConversions.h" #include "SurgSim/Math/Matrix.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Vector.h" #include using SurgSim::Graphics::fromOsg; using SurgSim::Graphics::toOsg; using SurgSim::Math::Quaternionf; using SurgSim::Math::Quaterniond; using SurgSim::Math::RigidTransform2f; using SurgSim::Math::RigidTransform2d; using SurgSim::Math::RigidTransform3f; using SurgSim::Math::RigidTransform3d; using SurgSim::Math::Vector3f; using SurgSim::Math::Vector3d; using SurgSim::Math::Vector4f; using SurgSim::Math::Vector4d; using SurgSim::Math::makeRigidTransform; TEST(OsgRigidTransformConversionsTests, RigidTransform3fTest) { Quaternionf rotation = Quaternionf(Vector4f::Random()); rotation.normalize(); Vector3f translation = Vector3f::Random(); RigidTransform3f transform = makeRigidTransform(rotation, translation); /// Convert to OSG std::pair osgTransform = toOsg(transform); /// Convert back to Eigen and compare with original RigidTransform3f resultTransform = fromOsg(osgTransform); EXPECT_TRUE(transform.isApprox(resultTransform)); } TEST(OsgRigidTransformConversionsTests, RigidTransform3fMultiplyTest) { Quaternionf rotation = Quaternionf(Vector4f::Random()); rotation.normalize(); Vector3f translation = Vector3f::Random(); RigidTransform3f transform = makeRigidTransform(rotation, translation); Vector3f vector = Vector3f::Random(); osg::Vec3f osgVector = toOsg(vector); /// Transform the vector using Eigen Vector3f result = transform * vector; std::pair osgTransform = toOsg(transform); /// Transform the vector using OSG osg::Vec3f osgResult = osgTransform.first * osgVector + osgTransform.second; /// Compare the transformations EXPECT_TRUE(result.isApprox(fromOsg(osgResult))); } TEST(OsgRigidTransformConversionsTests, RigidTransform3dTest) { Quaterniond rotation = Quaterniond(Vector4d::Random()); rotation.normalize(); Vector3d translation = Vector3d::Random(); RigidTransform3d transform = makeRigidTransform(rotation, translation); /// Convert to OSG std::pair osgTransform = toOsg(transform); /// Convert back to Eigen and compare with original RigidTransform3d resultTransform = fromOsg(osgTransform); EXPECT_TRUE(transform.isApprox(resultTransform)); } TEST(OsgRigidTransformConversionsTests, RigidTransform3dMultiplyTest) { Quaterniond rotation = Quaterniond(Vector4d::Random()); rotation.normalize(); Vector3d translation = Vector3d::Random(); RigidTransform3d transform = makeRigidTransform(rotation, translation); Vector3d vector = Vector3d::Random(); osg::Vec3d osgVector = toOsg(vector); /// Transform the vector using Eigen Vector3d result = transform * vector; std::pair osgTransform = toOsg(transform); /// Transform the vector using OSG osg::Vec3d osgResult = osgTransform.first * osgVector + osgTransform.second; /// Compare the transformations EXPECT_TRUE(result.isApprox(fromOsg(osgResult))); } opensurgsim-0.7.0/SurgSim/Graphics/UnitTests/OsgSceneryRepresentationTests.cpp000066400000000000000000000131771277777236100277530ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Unit Tests for the OsgSceneryRepresentation class. #include #include #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Framework/Scene.h" #include "SurgSim/Graphics/OsgManager.h" #include "SurgSim/Graphics/OsgSceneryRepresentation.h" #include "SurgSim/Graphics/OsgViewElement.h" #include "SurgSim/Graphics/OsgModel.h" #include #include #include using SurgSim::Graphics::OsgSceneryRepresentation; using SurgSim::Graphics::OsgViewElement; using SurgSim::Graphics::SceneryRepresentation; class OsgSceneryRepresentationTest: public ::testing::Test { public: void SetUp() override { sceneryObject = std::make_shared("test"); sceneryObject2 = std::make_shared("test2"); runtime = std::make_shared("config.txt"); manager = std::make_shared(); scene = runtime->getScene(); viewElement = std::make_shared("view element"); scene->addSceneElement(viewElement); runtime->addManager(manager); } void TearDown() override { } std::shared_ptr sceneryObject; std::shared_ptr sceneryObject2; std::shared_ptr runtime; std::shared_ptr manager; std::shared_ptr scene; std::shared_ptr viewElement; }; TEST_F(OsgSceneryRepresentationTest, FileNameTest) { sceneryObject->loadModel("Geometry/Torus.obj"); EXPECT_EQ("Geometry/Torus.obj", sceneryObject->getModel()->getFileName()); } TEST_F(OsgSceneryRepresentationTest, InitTest) { EXPECT_EQ(nullptr, sceneryObject->getModelNode()); sceneryObject->loadModel("Geometry/Torus.obj"); EXPECT_NO_THROW(viewElement->addComponent(sceneryObject)); EXPECT_NE(nullptr, sceneryObject->getModelNode()); sceneryObject2->loadModel("Geometry/Torus.osgb"); EXPECT_NO_THROW(viewElement->addComponent(sceneryObject2)); } TEST_F(OsgSceneryRepresentationTest, AccessibleTest) { std::shared_ptr component; ASSERT_NO_THROW(component = SurgSim::Framework::Component::getFactory().create( "SurgSim::Graphics::OsgSceneryRepresentation", "scenery")); std::string fileName("Geometry/Torus.obj"); component->setValue("ModelFileName", fileName); auto asset = component->getValue>("Model"); EXPECT_EQ(fileName, asset->getFileName()); } TEST_F(OsgSceneryRepresentationTest, SerializationTests) { std::shared_ptr scenery = std::make_shared("OsgScenery"); std::string fileName("Geometry/Torus.obj"); scenery->loadModel(fileName); YAML::Node node; ASSERT_NO_THROW(node = scenery->encode()); EXPECT_TRUE(node.IsMap()); std::shared_ptr result = std::make_shared("OsgScenery"); ASSERT_NO_THROW(result->decode(node)); EXPECT_EQ("SurgSim::Graphics::OsgSceneryRepresentation", result->getClassName()); EXPECT_EQ(fileName, result->getModel()->getFileName()); } // This checks a fix for an intermittent bug where on deserialization setGenerateTangents would sometimes be called // before setModel, in which case no tangents where generated on scenery representations TEST_F(OsgSceneryRepresentationTest, GenerateTangents) { { SCOPED_TRACE("setGenerateTangents before loadModel"); auto object = std::make_shared("representation"); object->setGenerateTangents(true); object->loadModel("Geometry/cube.osgt"); // Structure from the osgt file, we need to get to the geometry to make sure the tangents where generated auto group = object->getModelNode()->asGroup(); ASSERT_NE(nullptr, group); auto geode = group->getChild(0)->asGeode(); ASSERT_NE(nullptr, geode); auto geometry = geode->getDrawable(0)->asGeometry(); ASSERT_NE(nullptr, geometry); ASSERT_NE(nullptr, geometry->getVertexAttribArray(SurgSim::Graphics::TANGENT_VERTEX_ATTRIBUTE_ID)); ASSERT_NE(nullptr, geometry->getVertexAttribArray(SurgSim::Graphics::BITANGENT_VERTEX_ATTRIBUTE_ID)); } { SCOPED_TRACE("setGenerateTangents after loadModel"); auto object = std::make_shared("representation"); object->loadModel("Geometry/cube.osgt"); object->setGenerateTangents(true); // Structure from the osgt file, we need to get to the geometry to make sure the tangents where generated auto group = object->getModelNode()->asGroup(); ASSERT_NE(nullptr, group); auto geode = group->getChild(0)->asGeode(); ASSERT_NE(nullptr, geode); auto geometry = geode->getDrawable(0)->asGeometry(); ASSERT_NE(nullptr, geometry); ASSERT_NE(nullptr, geometry->getVertexAttribArray(SurgSim::Graphics::TANGENT_VERTEX_ATTRIBUTE_ID)); ASSERT_NE(nullptr, geometry->getVertexAttribArray(SurgSim::Graphics::BITANGENT_VERTEX_ATTRIBUTE_ID)); } } opensurgsim-0.7.0/SurgSim/Graphics/UnitTests/OsgScreenSpaceQuadTests.cpp000066400000000000000000000102201277777236100264100ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the OsgTexture class. #include #include "SurgSim/Framework/ApplicationData.h" #include "SurgSim/Framework/BasicSceneElement.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Graphics/OsgMaterial.h" #include "SurgSim/Graphics/OsgScreenSpaceQuadRepresentation.h" #include "SurgSim/Graphics/OsgTexture.h" #include "SurgSim/Graphics/OsgUniform.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Vector.h" using SurgSim::Math::Vector3d; using SurgSim::Math::Quaterniond; using SurgSim::Math::RigidTransform3d; #include #include #include namespace SurgSim { namespace Graphics { TEST(OsgScreenSpaceQuadRepresentationTests, SetTexture2d) { auto texture = std::make_shared(); texture->setSize(256, 256); auto quad = std::make_shared("quad"); EXPECT_TRUE(quad->setTexture(texture)); osg::StateSet* stateSet = quad->getOsgNode()->getOrCreateStateSet(); EXPECT_EQ(1u, stateSet->getTextureAttributeList().size()); // Test Initialization auto runtime = std::make_shared("config.txt"); EXPECT_TRUE(quad->initialize(runtime)); } TEST(OsgScreenSpaceQuadRepresentationTests, SetTextureRectangle) { std::shared_ptr texture = std::make_shared(); texture->setSize(10, 100); std::shared_ptr quad = std::make_shared("quad"); EXPECT_TRUE(quad->setTexture(texture)); osg::StateSet* stateSet = quad->getOsgNode()->getOrCreateStateSet(); EXPECT_EQ(1u, stateSet->getTextureAttributeList().size()); // Test Initialization auto runtime = std::make_shared("config.txt"); EXPECT_TRUE(quad->initialize(runtime)); } TEST(OsgScreenSpaceQuadRepresentation, SetSize) { std::shared_ptr quad = std::make_shared("quad"); double width = 100.0; double height = 100.0; ASSERT_ANY_THROW(quad->getSize(nullptr, &height)); ASSERT_ANY_THROW(quad->getSize(&width, nullptr)); ASSERT_ANY_THROW(quad->getSize(nullptr, nullptr)); quad->getLocation(&width, &height); EXPECT_DOUBLE_EQ(0.0, width); EXPECT_DOUBLE_EQ(0.0, height); quad->setSize(100.0, 200.0); quad->getSize(&width, &height); EXPECT_DOUBLE_EQ(100.0, width); EXPECT_DOUBLE_EQ(200.0, height); } TEST(OsgScreenSpaceQuadRepresentationTests, SetLocation) { std::shared_ptr quad = std::make_shared("quad"); double x = 100.0; double y = 100.0; ASSERT_ANY_THROW(quad->getLocation(nullptr, &y)); ASSERT_ANY_THROW(quad->getLocation(&x, nullptr)); ASSERT_ANY_THROW(quad->getLocation(nullptr, nullptr)); quad->getLocation(&x, &y); EXPECT_DOUBLE_EQ(0.0, x); EXPECT_DOUBLE_EQ(0.0, y); quad->setLocation(100.0, 200.0); quad->getLocation(&x, &y); EXPECT_DOUBLE_EQ(100.0, x); EXPECT_DOUBLE_EQ(200.0, y); Vector3d position(300.0, 400.0, 0.0); quad->setLocalPose(SurgSim::Math::makeRigidTransform(Quaterniond::Identity(), position)); quad->getLocation(&x, &y); EXPECT_DOUBLE_EQ(300.0, x); EXPECT_DOUBLE_EQ(400.0, y); } TEST(OsgScreenSpaceQuadRepresentationTests, SetTransparent) { auto quad = std::make_shared("quad"); EXPECT_FALSE(quad->isTransparent()); quad->setTransparent(true); EXPECT_TRUE(quad->isTransparent()); } } // namespace Graphics } // namespace SurgSim opensurgsim-0.7.0/SurgSim/Graphics/UnitTests/OsgSkeletonRepresentationTests.cpp000066400000000000000000000214451277777236100301240ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Unit Tests for the OsgSkeletonRepresentation class. #include #include #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Graphics/OsgManager.h" #include "SurgSim/Graphics/OsgSkeletonRepresentation.h" #include "SurgSim/Graphics/OsgViewElement.h" #include "SurgSim/Graphics/OsgModel.h" using SurgSim::Graphics::OsgSkeletonRepresentation; using SurgSim::Graphics::OsgViewElement; using SurgSim::Graphics::SkeletonRepresentation; using SurgSim::Math::makeRigidTransform; using SurgSim::Math::makeRotationQuaternion; using SurgSim::Math::RigidTransform3d; using SurgSim::Math::Vector3d; namespace SurgSim { namespace Graphics { class OsgSkeletonRepresentationTest: public ::testing::Test { public: void SetUp() override { runtime = std::make_shared("config.txt"); } void TearDown() override { } std::shared_ptr runtime; }; TEST_F(OsgSkeletonRepresentationTest, CanConstruct) { EXPECT_NO_THROW({OsgSkeletonRepresentation skeleton("test");}); EXPECT_NO_THROW({auto skeleton = std::make_shared("test");}); } TEST_F(OsgSkeletonRepresentationTest, FileNameTest) { auto skeleton = std::make_shared("test"); skeleton->loadModel("OsgSkeletonRepresentationTests/rigged_cylinder.osgt"); EXPECT_EQ("OsgSkeletonRepresentationTests/rigged_cylinder.osgt", skeleton->getModel()->getFileName()); } TEST_F(OsgSkeletonRepresentationTest, SkinningShaderFileNameTest) { auto skeleton = std::make_shared("test"); skeleton->setSkinningShaderFileName("Shaders/skinning.vert"); EXPECT_EQ("Shaders/skinning.vert", skeleton->getSkinningShaderFileName()); } TEST_F(OsgSkeletonRepresentationTest, InitTest) { { auto skeleton = std::make_shared("test"); skeleton->loadModel("OsgSkeletonRepresentationTests/rigged_cylinder.osgt"); skeleton->setSkinningShaderFileName("Shaders/skinning.vert"); EXPECT_NO_THROW(skeleton->initialize(runtime)); EXPECT_TRUE(skeleton->isInitialized()) << "Should initialize with both model and shader."; } { auto skeleton = std::make_shared("test"); skeleton->setSkinningShaderFileName("Shaders/skinning.vert"); EXPECT_NO_THROW(skeleton->initialize(runtime)); EXPECT_FALSE(skeleton->isInitialized()) << "Should not be initialized, no model set"; } { auto skeleton = std::make_shared("test"); skeleton->loadModel("OsgSkeletonRepresentationTests/rigged_cylinder.osgt"); EXPECT_NO_THROW(skeleton->initialize(runtime)); EXPECT_FALSE(skeleton->isInitialized()) << "Should not be initialized, no shader set"; } } TEST_F(OsgSkeletonRepresentationTest, PosesTest) { RigidTransform3d pose = makeRigidTransform(makeRotationQuaternion(2.143, Vector3d::UnitZ().eval()), Vector3d(2.3, 4.5, 6.7)); { auto skeleton = std::make_shared("test"); skeleton->loadModel("OsgSkeletonRepresentationTests/rigged_cylinder.osgt"); skeleton->setSkinningShaderFileName("Shaders/skinning.vert"); EXPECT_NO_THROW(skeleton->initialize(runtime)); RigidTransform3d actualPose; EXPECT_NO_THROW({actualPose = skeleton->getBonePose("Bone");}); EXPECT_TRUE(RigidTransform3d::Identity().isApprox(actualPose)); EXPECT_THROW(skeleton->getBonePose("BadBoneName"), SurgSim::Framework::AssertionFailure); } { auto skeleton = std::make_shared("test"); skeleton->loadModel("OsgSkeletonRepresentationTests/rigged_cylinder.osgt"); skeleton->setSkinningShaderFileName("Shaders/skinning.vert"); EXPECT_NO_THROW(skeleton->setBonePose("Bone", pose)); RigidTransform3d actualPose; EXPECT_NO_THROW({actualPose = skeleton->getBonePose("Bone");}); EXPECT_TRUE(pose.isApprox(actualPose)); EXPECT_NO_THROW(skeleton->initialize(runtime)); EXPECT_NO_THROW({actualPose = skeleton->getBonePose("Bone");}); EXPECT_TRUE(pose.isApprox(actualPose)); } { auto skeleton = std::make_shared("test"); skeleton->loadModel("OsgSkeletonRepresentationTests/rigged_cylinder.osgt"); skeleton->setSkinningShaderFileName("Shaders/skinning.vert"); EXPECT_NO_THROW(skeleton->setBonePose("BadBoneName", pose)); RigidTransform3d actualPose; EXPECT_NO_THROW({actualPose = skeleton->getBonePose("BadBoneName");}); EXPECT_TRUE(pose.isApprox(actualPose)); EXPECT_THROW(skeleton->initialize(runtime), SurgSim::Framework::AssertionFailure); } } TEST_F(OsgSkeletonRepresentationTest, NeutralPosesTest) { RigidTransform3d pose = makeRigidTransform(makeRotationQuaternion(2.143, Vector3d::UnitZ().eval()), Vector3d(2.3, 4.5, 6.7)); { auto skeleton = std::make_shared("test"); skeleton->loadModel("OsgSkeletonRepresentationTests/rigged_cylinder.osgt"); skeleton->setSkinningShaderFileName("Shaders/skinning.vert"); EXPECT_NO_THROW(skeleton->initialize(runtime)); RigidTransform3d actualPose; EXPECT_NO_THROW({actualPose = skeleton->getNeutralBonePose("Bone");}); EXPECT_TRUE(RigidTransform3d::Identity().isApprox(actualPose)); EXPECT_THROW(skeleton->getNeutralBonePose("BadBoneName"), SurgSim::Framework::AssertionFailure); } { auto skeleton = std::make_shared("test"); skeleton->loadModel("OsgSkeletonRepresentationTests/rigged_cylinder.osgt"); skeleton->setSkinningShaderFileName("Shaders/skinning.vert"); EXPECT_NO_THROW(skeleton->setNeutralBonePose("Bone", pose)); RigidTransform3d actualPose; EXPECT_NO_THROW({actualPose = skeleton->getNeutralBonePose("Bone");}); EXPECT_TRUE(pose.isApprox(actualPose)); EXPECT_NO_THROW(skeleton->initialize(runtime)); EXPECT_NO_THROW({actualPose = skeleton->getNeutralBonePose("Bone");}); EXPECT_TRUE(pose.isApprox(actualPose)); } { auto skeleton = std::make_shared("test"); skeleton->loadModel("OsgSkeletonRepresentationTests/rigged_cylinder.osgt"); skeleton->setSkinningShaderFileName("Shaders/skinning.vert"); EXPECT_NO_THROW(skeleton->setNeutralBonePose("BadBoneName", pose)); RigidTransform3d actualPose; EXPECT_NO_THROW({actualPose = skeleton->getNeutralBonePose("BadBoneName");}); EXPECT_TRUE(pose.isApprox(actualPose)); EXPECT_THROW(skeleton->initialize(runtime), SurgSim::Framework::AssertionFailure); } } TEST_F(OsgSkeletonRepresentationTest, AccessibleTest) { std::shared_ptr component; ASSERT_NO_THROW(component = SurgSim::Framework::Component::getFactory().create( "SurgSim::Graphics::OsgSkeletonRepresentation", "skeleton")); std::string fileName("OsgSkeletonRepresentationTests/rigged_cylinder.osgt"); component->setValue("ModelFileName", fileName); std::string skinningShaderFileName("Shaders/skinning.vert"); component->setValue("SkinningShaderFileName", skinningShaderFileName); auto asset = component->getValue>("Model"); EXPECT_EQ(fileName, asset->getFileName()); auto shaderName = component->getValue("SkinningShaderFileName"); EXPECT_EQ(skinningShaderFileName, shaderName); } TEST_F(OsgSkeletonRepresentationTest, SerializationTests) { auto skeleton = std::make_shared("test"); std::string fileName("OsgSkeletonRepresentationTests/rigged_cylinder.osgt"); skeleton->loadModel(fileName); std::string skinningShaderFileName("Shaders/skinning.vert"); skeleton->setSkinningShaderFileName(skinningShaderFileName); RigidTransform3d pose = makeRigidTransform(makeRotationQuaternion(2.143, Vector3d(2.463, 6.346, 7.135).normalized()), Vector3d(2.3, 4.5, 6.7)); skeleton->setNeutralBonePose("Bone", pose); YAML::Node node; node = skeleton->encode(); ASSERT_NO_THROW(node = skeleton->encode()); EXPECT_TRUE(node.IsMap()); std::shared_ptr result = std::make_shared("Skeleton"); ASSERT_NO_THROW(result->decode(node)); EXPECT_EQ("SurgSim::Graphics::OsgSkeletonRepresentation", result->getClassName()); EXPECT_EQ(fileName, result->getModel()->getFileName()); EXPECT_EQ(skinningShaderFileName, result->getSkinningShaderFileName()); EXPECT_TRUE(pose.isApprox(result->getNeutralBonePose("Bone"))); } }; }; opensurgsim-0.7.0/SurgSim/Graphics/UnitTests/OsgSphereRepresentationTests.cpp000066400000000000000000000055641277777236100275720ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the OsgSphereRepresentation class. #include "SurgSim/Graphics/UnitTests/MockOsgObjects.h" #include "SurgSim/Framework/BasicSceneElement.h" #include "SurgSim/Graphics/OsgMaterial.h" #include "SurgSim/Graphics/OsgSphereRepresentation.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Framework/FrameworkConvert.h" #include #include #include using SurgSim::Framework::BasicSceneElement; using SurgSim::Math::Quaterniond; using SurgSim::Math::RigidTransform3d; using SurgSim::Math::Vector3d; using SurgSim::Math::makeRigidTransform; namespace SurgSim { namespace Graphics { TEST(OsgSphereRepresentationTests, InitTest) { ASSERT_NO_THROW({std::shared_ptr representation = std::make_shared("test name"); }); std::shared_ptr representation = std::make_shared("test name"); EXPECT_EQ("test name", representation->getName()); } TEST(OsgSphereRepresentationTests, AccessibleTest) { std::shared_ptr component; ASSERT_NO_THROW(component = SurgSim::Framework::Component::getFactory().create( "SurgSim::Graphics::OsgSphereRepresentation", "sphere")); EXPECT_EQ("SurgSim::Graphics::OsgSphereRepresentation", component->getClassName()); double radius = 4.321; component->setValue("Radius", radius); YAML::Node node(YAML::convert::encode(*component)); auto decoded = std::dynamic_pointer_cast( node.as>()); EXPECT_NE(nullptr, decoded); EXPECT_DOUBLE_EQ(radius, decoded->getValue("Radius")); } TEST(OsgSphereRepresentationTests, RadiusTest) { std::shared_ptr sphereRepresentation = std::make_shared("test name"); std::default_random_engine generator; std::uniform_real_distribution distribution(1.0, 10.0); double randomRadius = distribution(generator); sphereRepresentation->setRadius(randomRadius); EXPECT_EQ(randomRadius, sphereRepresentation->getRadius()); } }; // namespace Graphics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Graphics/UnitTests/OsgTextRepresentationTests.cpp000066400000000000000000000111431277777236100272560ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for OsgInfo class. #include #include #include "SurgSim/Graphics/Graphics.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Graphics/OsgFont.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Framework/Component.h" #include "SurgSim/DataStructures/DataStructuresConvert.h" using SurgSim::Math::Vector3d; using SurgSim::Math::Quaterniond; using SurgSim::Math::RigidTransform3d; namespace SurgSim { namespace Graphics { TEST(OsgTextRepresentationTests, SetLocation) { auto text = std::make_shared("text"); double x = 100.0; double y = 100.0; ASSERT_ANY_THROW(text->getLocation(nullptr, &y)); ASSERT_ANY_THROW(text->getLocation(&x, nullptr)); ASSERT_ANY_THROW(text->getLocation(nullptr, nullptr)); text->getLocation(&x, &y); EXPECT_DOUBLE_EQ(0.0, x); EXPECT_DOUBLE_EQ(0.0, y); text->setLocation(100.0, 200.0); text->getLocation(&x, &y); EXPECT_DOUBLE_EQ(100.0, x); EXPECT_DOUBLE_EQ(200.0, y); Vector3d position(300.0, 400.0, 0.0); text->setLocalPose(SurgSim::Math::makeRigidTransform(Quaterniond::Identity(), position)); text->getLocation(&x, &y); EXPECT_DOUBLE_EQ(300.0, x); EXPECT_DOUBLE_EQ(400.0, y); } TEST(OsgTextRepresentationTests, TextTest) { auto text = std::make_shared("text"); std::string testText("HelloWorld"); EXPECT_NO_THROW(text->setText(testText)); } TEST(OsgTextRepresentationTests, FontTests) { auto runtime = std::make_shared("config.txt"); auto text = std::make_shared("text"); std::shared_ptr font = std::make_shared(); font->load("Fonts/Vera.ttf"); // Should have default font EXPECT_NE(nullptr, text->getFont()); // Font setting should work EXPECT_NO_THROW(text->setFont(font)); EXPECT_EQ(font, text->getFont()); EXPECT_ANY_THROW(text->setFont(nullptr)); // Other ways to set the font EXPECT_NO_THROW(text->loadFont("Fonts/Vera.ttf")); EXPECT_NO_THROW(text->setValue("FontFileName", std::string("Fonts/Vera.ttf"))); } TEST(OsgTextRepresentationTests, MaximumWidth) { auto text = std::make_shared("text"); SurgSim::DataStructures::OptionalValue optional; EXPECT_DOUBLE_EQ(0.0, text->getMaximumWidth()); EXPECT_EQ(optional, text->getOptionalMaximumWidth()); text->setMaximumWidth(10.0); EXPECT_DOUBLE_EQ(10.0, text->getMaximumWidth()); optional.setValue(10.0); EXPECT_DOUBLE_EQ(*optional, *(text->getOptionalMaximumWidth())); optional.invalidate(); text->setOptionalMaximumWidth(optional); EXPECT_DOUBLE_EQ(0.0, text->getMaximumWidth()); EXPECT_FALSE(text->getOptionalMaximumWidth().hasValue()); optional.setValue(20.0); text->setOptionalMaximumWidth(optional); EXPECT_DOUBLE_EQ(20.0, text->getMaximumWidth()); EXPECT_DOUBLE_EQ(*optional, *(text->getOptionalMaximumWidth())); } TEST(OsgTextRepresentationTests, Serialization) { using SurgSim::Framework::Component; auto runtime = std::make_shared("config.txt"); std::shared_ptr text = std::make_shared("text"); text->setText("TestTest"); text->setFontSize(123.0); text->setColor(SurgSim::Math::Vector4d(1.0, 2.0, 3.0, 4.0)); text->setMaximumWidth(321.0); typedef YAML::convert Converter; YAML::Node node; ASSERT_NO_THROW(node = Converter::encode(*text)); std::shared_ptr result; ASSERT_NO_THROW(result = node.as>()); ASSERT_NE(nullptr, result); auto textResult = std::dynamic_pointer_cast(result); ASSERT_NE(nullptr, textResult); EXPECT_EQ("TestTest", textResult->getText()); EXPECT_DOUBLE_EQ(123.0, textResult->getFontSize()); EXPECT_DOUBLE_EQ(321.0, textResult->getMaximumWidth()); EXPECT_TRUE(SurgSim::Math::Vector4d(1.0, 2.0, 3.0, 4.0).isApprox(textResult->getColor())); } }; // Graphics }; // SurgSim opensurgsim-0.7.0/SurgSim/Graphics/UnitTests/OsgTexture1dTests.cpp000066400000000000000000000050361277777236100253000ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the OsgTexture1d class. #include "SurgSim/Framework/ApplicationData.h" #include "SurgSim/Graphics/OsgTexture1d.h" #include #include #include #include namespace SurgSim { namespace Graphics { TEST(OsgTexture1dTests, InitTest) { OsgTexture1d texture; EXPECT_NE(nullptr, texture.getOsgTexture()); EXPECT_EQ(nullptr, texture.getOsgTexture()->getImage(0u)); } TEST(OsgTexture1dTests, SetSizeTest) { OsgTexture1d texture; texture.setSize(256); int width; texture.getSize(&width); EXPECT_EQ(256, width); } TEST(OsgTexture1dTests, LoadAndClearImageTest) { SurgSim::Framework::ApplicationData data("config.txt"); std::string imagePath = data.findFile("Textures/Gradient.png"); ASSERT_NE("", imagePath) << "Could not find image file!"; // Load the image std::shared_ptr osgTexture = std::make_shared(); std::shared_ptr texture = osgTexture; EXPECT_TRUE(texture->loadImage(imagePath)) << "Failed to load image!"; EXPECT_EQ(1u, osgTexture->getOsgTexture()->getNumImages()); EXPECT_NE(nullptr, osgTexture->getOsgTexture()->getImage(0u)) << "Texture should have an image!"; // Make sure the image has the expected size int width; osgTexture->getSize(&width); EXPECT_EQ(256, width); osg::Image* image = osgTexture->getOsgTexture()->getImage(0u); EXPECT_EQ(256, image->s()); EXPECT_EQ(1, image->t()); EXPECT_EQ(1, image->r()); // Remove the image texture->clearImage(); EXPECT_EQ(nullptr, osgTexture->getOsgTexture()->getImage(0u)) << "Texture image should have been cleared!"; // Try to load an image that does not exist EXPECT_FALSE(texture->loadImage("NotHere.png")) << "Should not have been able to load image - it does not exist!"; EXPECT_EQ(nullptr, osgTexture->getOsgTexture()->getImage(0u)); } } // namespace Graphics } // namespace SurgSim opensurgsim-0.7.0/SurgSim/Graphics/UnitTests/OsgTexture2dTests.cpp000066400000000000000000000051011277777236100252720ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the OsgTexture2d class. #include "SurgSim/Framework/ApplicationData.h" #include "SurgSim/Graphics/OsgTexture2d.h" #include #include namespace SurgSim { namespace Graphics { TEST(OsgTexture2dTests, InitTest) { OsgTexture2d texture; EXPECT_NE(nullptr, texture.getOsgTexture()); EXPECT_EQ(nullptr, texture.getOsgTexture()->getImage(0u)); } TEST(OsgTexture2dTests, SetSizeTest) { OsgTexture2d texture; texture.setSize(256, 512); int width, height; texture.getSize(&width, &height); EXPECT_EQ(256, width); EXPECT_EQ(512, height); } TEST(OsgTexture2dTests, LoadAndClearImageTest) { SurgSim::Framework::ApplicationData data("config.txt"); std::string imagePath = data.findFile("Textures/CheckerBoard.png"); ASSERT_NE("", imagePath) << "Could not find image file!"; // Load the image std::shared_ptr osgTexture = std::make_shared(); std::shared_ptr texture = osgTexture; EXPECT_TRUE(texture->loadImage(imagePath)) << "Failed to load image!"; EXPECT_EQ(1u, osgTexture->getOsgTexture()->getNumImages()); EXPECT_NE(nullptr, osgTexture->getOsgTexture()->getImage(0u)) << "Texture should have an image!"; // Make sure the image has the expected size int width, height; osgTexture->getSize(&width, &height); EXPECT_EQ(512, width); EXPECT_EQ(512, height); osg::Image* image = osgTexture->getOsgTexture()->getImage(0u); EXPECT_EQ(512, image->s()); EXPECT_EQ(512, image->t()); EXPECT_EQ(1, image->r()); // Remove the image texture->clearImage(); EXPECT_EQ(nullptr, osgTexture->getOsgTexture()->getImage(0u)) << "Texture image should have been cleared!"; // Try to load an image that does not exist EXPECT_FALSE(texture->loadImage("NotHere.png")) << "Should not have been able to load image - it does not exist!"; EXPECT_EQ(nullptr, osgTexture->getOsgTexture()->getImage(0u)); } } // namespace Graphics } // namespace SurgSim opensurgsim-0.7.0/SurgSim/Graphics/UnitTests/OsgTexture3dTests.cpp000066400000000000000000000104171277777236100253010ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the OsgTextureCubeMap class. #include "SurgSim/Framework/ApplicationData.h" #include "SurgSim/Graphics/OsgTexture3d.h" #include #include namespace SurgSim { namespace Graphics { TEST(OsgTexture3dTests, InitTest) { OsgTexture3d texture; EXPECT_NE(nullptr, texture.getOsgTexture()); EXPECT_EQ(nullptr, texture.getOsgTexture()->getImage(0u)); } TEST(OsgTexture3dTests, SetSizeTest) { OsgTexture3d texture; texture.setSize(256, 512, 1024); int width, height, depth; texture.getSize(&width, &height, &depth); EXPECT_EQ(256, width); EXPECT_EQ(512, height); EXPECT_EQ(1024, depth); } TEST(OsgTexture3dTests, LoadAndClearImageTest) { SurgSim::Framework::ApplicationData data("config.txt"); std::string imagePath = data.findFile("Textures/CheckerBoard.png"); ASSERT_NE("", imagePath) << "Could not find image file!"; // Load the image std::shared_ptr osgTexture = std::make_shared(); std::shared_ptr texture = osgTexture; EXPECT_TRUE(texture->loadImage(imagePath)) << "Failed to load image!"; EXPECT_EQ(1u, osgTexture->getOsgTexture()->getNumImages()); EXPECT_NE(nullptr, osgTexture->getOsgTexture()->getImage(0u)) << "Texture should have an image!"; // Make sure the image has the expected size int width, height, depth; osgTexture->getSize(&width, &height, &depth); EXPECT_EQ(512, width); EXPECT_EQ(512, height); EXPECT_EQ(1, depth); osg::Image* image = osgTexture->getOsgTexture()->getImage(0u); EXPECT_EQ(512, image->s()); EXPECT_EQ(512, image->t()); EXPECT_EQ(1, image->r()); // Remove the image texture->clearImage(); EXPECT_EQ(nullptr, osgTexture->getOsgTexture()->getImage(0u)) << "Texture image should have been cleared!"; // Try to load an image that does not exist EXPECT_FALSE(texture->loadImage("NotHere.png")) << "Should not have been able to load image - it does not exist!"; EXPECT_EQ(nullptr, osgTexture->getOsgTexture()->getImage(0u)); } TEST(OsgTexture3dTests, LoadImageSlicesTest) { SurgSim::Framework::ApplicationData data("config.txt"); std::string slice0Path = data.findFile("Textures/Brdf0.png"); ASSERT_NE("", slice0Path) << "Could not find image file for slice 0!"; std::string slice1Path = data.findFile("Textures/Brdf1.png"); ASSERT_NE("", slice1Path) << "Could not find image file for slice 1!"; std::vector slicePaths; slicePaths.push_back(slice0Path); slicePaths.push_back(slice1Path); // Load the images std::shared_ptr osgTexture = std::make_shared(); std::shared_ptr texture = osgTexture; EXPECT_TRUE(osgTexture->loadImageSlices(slicePaths)) << "Failed to load images!"; EXPECT_EQ(1u, osgTexture->getOsgTexture()->getNumImages()); EXPECT_NE(nullptr, osgTexture->getOsgTexture()->getImage(0u)) << "Texture should have an image!"; // Make sure the image has the expected size int width, height, depth; osgTexture->getSize(&width, &height, &depth); EXPECT_EQ(256, width); EXPECT_EQ(256, height); EXPECT_EQ(2, depth); osg::Image* image = osgTexture->getOsgTexture()->getImage(0u); EXPECT_EQ(256, image->s()); EXPECT_EQ(256, image->t()); EXPECT_EQ(2, image->r()); // Remove the image texture->clearImage(); EXPECT_EQ(nullptr, osgTexture->getOsgTexture()->getImage(0u)) << "Texture image should have been cleared!"; // Try to load an image that does not exist slicePaths.push_back("NotHere.png"); EXPECT_FALSE(osgTexture->loadImageSlices(slicePaths)) << "Should not have been able to load an image - it does not exist!"; EXPECT_EQ(nullptr, osgTexture->getOsgTexture()->getImage(0u)); } } // namespace Graphics } // namespace SurgSim opensurgsim-0.7.0/SurgSim/Graphics/UnitTests/OsgTextureCubeMapTests.cpp000066400000000000000000000116501277777236100263070ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the OsgTextureCubeMap class. #include "SurgSim/Framework/ApplicationData.h" #include "SurgSim/Graphics/OsgTextureCubeMap.h" #include #include #include #include namespace SurgSim { namespace Graphics { TEST(OsgTextureCubeMapTests, InitTest) { OsgTextureCubeMap texture; EXPECT_NE(nullptr, texture.getOsgTexture()); EXPECT_EQ(nullptr, texture.getOsgTexture()->getImage(0u)); } TEST(OsgTextureCubeMapTests, SetSizeTest) { OsgTextureCubeMap texture; texture.setSize(256, 512); int width, height; texture.getSize(&width, &height); EXPECT_EQ(256, width); EXPECT_EQ(512, height); } TEST(OsgTextureCubeMapTests, LoadAndClearImageTest) { SurgSim::Framework::ApplicationData data("config.txt"); std::string imagePath = data.findFile("Textures/CubeMap_axes.png"); ASSERT_NE("", imagePath) << "Could not find image file!"; // Load the image std::shared_ptr osgTexture = std::make_shared(); std::shared_ptr texture = osgTexture; EXPECT_TRUE(texture->loadImage(imagePath)) << "Failed to load image!"; EXPECT_EQ(6u, osgTexture->getOsgTexture()->getNumImages()); // Make sure each face has the expected size int width, height; osgTexture->getSize(&width, &height); EXPECT_EQ(256, width); EXPECT_EQ(256, height); for (size_t i = 0; i < 6; ++i) { osg::Image* image = osgTexture->getOsgTexture()->getImage(i); ASSERT_NE(nullptr, image) << "The texture should have an image for each face!"; EXPECT_EQ(256, image->s()); EXPECT_EQ(256, image->t()); EXPECT_EQ(1, image->r()); } // Remove the image texture->clearImage(); EXPECT_EQ(nullptr, osgTexture->getOsgTexture()->getImage(0u)) << "Texture image should have been cleared!"; // Try to load an image that does not exist EXPECT_FALSE(texture->loadImage("NotHere.png")) << "Should not have been able to load image - it does not exist!"; EXPECT_EQ(nullptr, osgTexture->getOsgTexture()->getImage(0u)); } TEST(OsgTextureCubeMapTests, LoadImageFacesTest) { SurgSim::Framework::ApplicationData data("config.txt"); std::string negativeXPath = data.findFile("Textures/NegativeX.png"); ASSERT_NE("", negativeXPath) << "Could not find image file for (-X) face!"; std::string positiveXPath = data.findFile("Textures/PositiveX.png"); ASSERT_NE("", positiveXPath) << "Could not find image file for (+X) face!"; std::string negativeYPath = data.findFile("Textures/NegativeY.png"); ASSERT_NE("", negativeYPath) << "Could not find image file for (-Y) face!"; std::string positiveYPath = data.findFile("Textures/PositiveY.png"); ASSERT_NE("", positiveYPath) << "Could not find image file for (+Y) face!"; std::string negativeZPath = data.findFile("Textures/NegativeZ.png"); ASSERT_NE("", negativeZPath) << "Could not find image file for (-Z) face!"; std::string positiveZPath = data.findFile("Textures/PositiveZ.png"); ASSERT_NE("", positiveZPath) << "Could not find image file for (+Z) face!"; // Load the images std::shared_ptr osgTexture = std::make_shared(); std::shared_ptr texture = osgTexture; EXPECT_TRUE(osgTexture->loadImageFaces(negativeXPath, positiveXPath, negativeYPath, positiveYPath, negativeZPath, positiveZPath)) << "Failed to load images!"; EXPECT_EQ(6u, osgTexture->getOsgTexture()->getNumImages()); // Make sure each face has the expected size int width, height; osgTexture->getSize(&width, &height); EXPECT_EQ(256, width); EXPECT_EQ(256, height); for (size_t i = 0; i < 6; ++i) { osg::Image* image = osgTexture->getOsgTexture()->getImage(i); ASSERT_NE(nullptr, image) << "The texture should have an image for each face!"; EXPECT_EQ(256, image->s()); EXPECT_EQ(256, image->t()); EXPECT_EQ(1, image->r()); } // Remove the image texture->clearImage(); EXPECT_EQ(nullptr, osgTexture->getOsgTexture()->getImage(0u)) << "Texture image should have been cleared!"; // Try to load an image that does not exist EXPECT_FALSE(osgTexture->loadImageFaces(negativeXPath, positiveXPath, "NotHere.png", positiveYPath, negativeZPath, positiveZPath)) << "Should not have been able to load an image - it does not exist!"; EXPECT_EQ(nullptr, osgTexture->getOsgTexture()->getImage(0u)); } } // namespace Graphics } // namespace SurgSim opensurgsim-0.7.0/SurgSim/Graphics/UnitTests/OsgTextureRectangleTests.cpp000066400000000000000000000052001277777236100266710ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the OsgTextureRectangle class. #include "SurgSim/Framework/ApplicationData.h" #include "SurgSim/Graphics/OsgTextureRectangle.h" #include #include namespace SurgSim { namespace Graphics { TEST(OsgTextureRectangleTests, InitTest) { OsgTextureRectangle texture; EXPECT_NE(nullptr, texture.getOsgTexture()); EXPECT_EQ(nullptr, texture.getOsgTexture()->getImage(0u)); } TEST(OsgTextureRectangleTests, SetSizeTest) { OsgTextureRectangle texture; texture.setSize(256, 512); int width, height; texture.getSize(&width, &height); EXPECT_EQ(256, width); EXPECT_EQ(512, height); } TEST(OsgTextureRectangleTests, LoadAndClearImageTest) { SurgSim::Framework::ApplicationData data("config.txt"); std::string imagePath = data.findFile("Textures/CheckerBoard.png"); ASSERT_NE("", imagePath) << "Could not find image file!"; // Load the image std::shared_ptr osgTexture = std::make_shared(); std::shared_ptr texture = osgTexture; EXPECT_TRUE(texture->loadImage(imagePath)) << "Failed to load image!"; EXPECT_EQ(1u, osgTexture->getOsgTexture()->getNumImages()); EXPECT_NE(nullptr, osgTexture->getOsgTexture()->getImage(0u)) << "Texture should have an image!"; // Make sure the image has the expected size int width, height; osgTexture->getSize(&width, &height); EXPECT_EQ(512, width); EXPECT_EQ(512, height); osg::Image* image = osgTexture->getOsgTexture()->getImage(0u); EXPECT_EQ(512, image->s()); EXPECT_EQ(512, image->t()); EXPECT_EQ(1, image->r()); // Remove the image texture->clearImage(); EXPECT_EQ(nullptr, osgTexture->getOsgTexture()->getImage(0u)) << "Texture image should have been cleared!"; // Try to load an image that does not exist EXPECT_FALSE(texture->loadImage("NotHere.png")) << "Should not have been able to load image - it does not exist!"; EXPECT_EQ(nullptr, osgTexture->getOsgTexture()->getImage(0u)); } } // namespace Graphics } // namespace SurgSim opensurgsim-0.7.0/SurgSim/Graphics/UnitTests/OsgTextureTests.cpp000066400000000000000000000040261277777236100250510ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the OsgTexture class. #include "SurgSim/Framework/ApplicationData.h" #include "SurgSim/Graphics/OsgTexture.h" #include #include #include #include #include namespace SurgSim { namespace Graphics { /// Concrete OSG Texture for testing. /// Wraps an osg::Texture2D. class MockOsgTexture : public OsgTexture { public: /// Constructor MockOsgTexture() : OsgTexture(new osg::Texture2D()) { } }; TEST(OsgTextureTests, InitTest) { MockOsgTexture texture; EXPECT_NE(nullptr, texture.getOsgTexture()); EXPECT_EQ(nullptr, texture.getOsgTexture()->getImage(0u)); } TEST(OsgTextureTests, LoadAndClearImageTest) { SurgSim::Framework::ApplicationData data("config.txt"); std::string imagePath = data.findFile("Textures/CheckerBoard.png"); ASSERT_NE("", imagePath) << "Could not find image file!"; std::shared_ptr osgTexture = std::make_shared(); std::shared_ptr texture = osgTexture; EXPECT_TRUE(texture->loadImage(imagePath)) << "Failed to load image!"; EXPECT_NE(nullptr, osgTexture->getOsgTexture()->getImage(0u)) << "Texture should have an image!"; texture->clearImage(); EXPECT_EQ(nullptr, osgTexture->getOsgTexture()->getImage(0u)) << "Texture image should have been cleared!"; } } // namespace Graphics } // namespace SurgSim opensurgsim-0.7.0/SurgSim/Graphics/UnitTests/OsgTextureUniformTests.cpp000066400000000000000000000110221277777236100264030ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Graphics/OsgMaterial.h" #include "SurgSim/Graphics/OsgUniform.h" #include "SurgSim/Graphics/OsgTexture1d.h" #include "SurgSim/Graphics/OsgTexture2d.h" #include "SurgSim/Graphics/OsgTexture3d.h" #include "SurgSim/Graphics/OsgTextureRectangle.h" #include namespace SurgSim { namespace Graphics { TEST(OsgTextureUniformTest, AddUniformTests) { auto uniform2d = std::make_shared>>("TextureUniform"); auto runtime = std::make_shared(); { // Material not initialized, should be able to add Uniform without Texture auto material = std::make_shared("material"); EXPECT_NO_THROW(material->addUniform(uniform2d)); } { // Material is initialized, should not be able to add Uniform without Texture auto material = std::make_shared("material"); material->initialize(runtime); EXPECT_ANY_THROW(material->addUniform(uniform2d)); } { // Material is initialized, should be able to add Uniform with Texture auto material = std::make_shared("material"); material->initialize(runtime); auto texture2d = std::make_shared(); texture2d->setSize(256, 256); uniform2d->set(texture2d); EXPECT_NO_THROW(material->addUniform(uniform2d)); } } // Check for correct assignment of uniforms to texture units TEST(OsgTextureUniformTests, TextureUnitAssignment) { auto material = std::make_shared("material"); auto runtime = std::make_shared(); material->initialize(runtime); auto uniform2d0 = std::make_shared>>("TextureUniform0"); auto uniform2d1 = std::make_shared>>("TextureUniform1"); auto uniform2d2 = std::make_shared>>("TextureUniform2"); uniform2d1->setMinimumTextureUnit(8); auto texture2d0 = std::make_shared(); uniform2d0->set(texture2d0); auto texture2d1 = std::make_shared(); uniform2d1->set(texture2d1); auto texture2d2 = std::make_shared(); uniform2d2->set(texture2d2); osg::StateSet* stateSet = material->getOsgStateSet(); EXPECT_EQ(0u, stateSet->getTextureAttributeList().size()); material->addUniform(uniform2d0); EXPECT_EQ(1u, stateSet->getTextureAttributeList().size()); EXPECT_FALSE(stateSet->getTextureAttributeList()[0].empty()); material->addUniform(uniform2d1); EXPECT_EQ(9u, stateSet->getTextureAttributeList().size()); EXPECT_FALSE(stateSet->getTextureAttributeList()[0].empty()); EXPECT_TRUE(stateSet->getTextureAttributeList()[1].empty()); EXPECT_FALSE(stateSet->getTextureAttributeList()[8].empty()); material->addUniform(uniform2d2); EXPECT_EQ(9u, stateSet->getTextureAttributeList().size()); EXPECT_FALSE(stateSet->getTextureAttributeList()[0].empty()); EXPECT_FALSE(stateSet->getTextureAttributeList()[1].empty()); EXPECT_TRUE(stateSet->getTextureAttributeList()[2].empty()); EXPECT_FALSE(stateSet->getTextureAttributeList()[8].empty()); } /// Expose a bug where a texture uniform could be created that is not really a correctly specialized /// uniform, if this fails then the uniform2d was not created correctly TEST(OsgTextureUniformTests, TextureUniformTemplateProblem) { auto material = std::make_shared("material"); auto runtime = std::make_shared(); material->initialize(runtime); auto uniform2d = std::make_shared>>("TextureUniform"); auto texture2d = std::make_shared(); texture2d->setSize(256, 256); uniform2d->set(texture2d); material->addUniform(uniform2d); osg::StateSet* stateSet = material->getOsgStateSet(); EXPECT_EQ(1u, stateSet->getTextureAttributeList().size()); } }; // namespace Graphics }; // namespace SurgSimopensurgsim-0.7.0/SurgSim/Graphics/UnitTests/OsgUniformBaseTests.cpp000066400000000000000000000041521277777236100256230ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the OsgUniformBase class. #include "SurgSim/Graphics/OsgUniformBase.h" #include namespace SurgSim { namespace Graphics { /// OsgUniformBase class for testing class MockOsgUniformBase : public OsgUniformBase { public: /// Constructor /// \param name Name used in shader code to access this uniform explicit MockOsgUniformBase(const std::string& name) : OsgUniformBase(name) { } void set(const YAML::Node&) { } }; TEST(OsgUniformBaseTests, InitTest) { MockOsgUniformBase uniform("test name"); EXPECT_EQ("test name", uniform.getName()); EXPECT_NE(nullptr, uniform.getOsgUniform()); } TEST(OsgUniformBaseTests, StateSetTest) { MockOsgUniformBase uniform("test name"); // Create an OSG state set osg::ref_ptr stateSet = new osg::StateSet(); const osg::StateSet::UniformList& uniforms = stateSet->getUniformList(); EXPECT_EQ(0u, uniforms.size()); /// Add the uniform to the state set uniform.addToStateSet(stateSet.get()); EXPECT_EQ(1u, uniforms.size()) << "State set has no uniforms, one should have been added!"; EXPECT_EQ(uniform.getOsgUniform(), uniforms.at("test name").first) << "First uniform in state set should be the added uniform!"; /// Remove the uniform from the state set uniform.removeFromStateSet(stateSet.get()); EXPECT_EQ(0u, uniforms.size()) << "State set should no longer have any uniforms, the uniform should have been removed!"; } } // namespace Graphics } // namespace SurgSimopensurgsim-0.7.0/SurgSim/Graphics/UnitTests/OsgUniformTests.cpp000066400000000000000000000336131277777236100250340ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the OsgUniform class. #include "SurgSim/Graphics/OsgUniform.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Math/MathConvert.h" #include #include using SurgSim::Math::Vector2f; using SurgSim::Math::Vector3f; using SurgSim::Math::Vector4f; using SurgSim::Math::Vector2d; using SurgSim::Math::Vector3d; using SurgSim::Math::Vector4d; using SurgSim::Math::Matrix22f; using SurgSim::Math::Matrix33f; using SurgSim::Math::Matrix44f; using SurgSim::Math::Matrix22d; using SurgSim::Math::Matrix33d; using SurgSim::Math::Matrix44d; namespace { /// Random number generator, used to generate random values for the tests. std::default_random_engine generator; } namespace SurgSim { namespace Graphics { /// Constructs an OsgUniform, sets it to the given value, and returns the result of Uniform::get() and the wrapped /// osg::Uniform::get(). /// \tparam Type Uniform's value type /// \tparam OsgType Type stored in the osg::Uniform template std::pair testUniformConstruction(const Type& value) { std::shared_ptr> osgUniform = std::make_shared>("test name"); std::shared_ptr osgUniformBase = osgUniform; std::shared_ptr> uniform = osgUniform; std::shared_ptr uniformBase = osgUniform; EXPECT_EQ("test name", osgUniformBase->getName()); uniform->set(value); OsgType osgValue; EXPECT_TRUE(osgUniformBase->getOsgUniform()->get(osgValue)) << "Failed to get osg::Uniform value. The Uniform type may be wrong!"; return std::make_pair(uniform->get(), osgValue); } template std::pair testAccessible(const Type& value) { auto osgUniform = std::make_shared>("test name"); osgUniform->setValue("Value", value); return std::make_pair(osgUniform->get(), osgUniform->getValue("Value")); } template Type testYamlSetter(const Type& value) { YAML::Node node = YAML::convert::encode(value); auto osgUniform = std::make_shared>("test name"); osgUniform->set(node); return osgUniform->get(); } /// Constructs an OsgUniform that stores a vector of values, sets it to the given vector values, and returns the result /// of Uniform::get() and the wrapped osg::Uniform::get(). /// \tparam Type Uniform's value type /// \tparam OsgType Type stored in the osg::Uniform template std::pair, std::vector> testUniformElementsConstruction( const std::vector& value, size_t numElements) { std::shared_ptr>> osgUniform = std::make_shared>>("test name", numElements); std::shared_ptr osgUniformBase = osgUniform; std::shared_ptr>> uniform = osgUniform; std::shared_ptr uniformBase = osgUniform; EXPECT_EQ("test name", osgUniformBase->getName()); uniform->set(value); std::vector osgValue; for (unsigned int i = 0; i < osgUniformBase->getOsgUniform()->getNumElements(); ++i) { OsgType element; EXPECT_TRUE(osgUniformBase->getOsgUniform()->getElement(i, element)) << "Failed to get osg::Uniform element value. The Uniform type may be wrong!"; osgValue.push_back(element); } return std::make_pair(uniform->get(), osgValue); } /// Tests OsgUniform with a random floating point type value. /// \tparam FloatType Floating point type (float, double, ...) /// \param min Minimum random value /// \param max Maximum random value template void testUniformFloat(FloatType min, FloatType max) { std::uniform_real_distribution distribution(min, max); FloatType value = distribution(generator); std::pair result = testUniformConstruction(value); EXPECT_NEAR(value, result.first, Eigen::NumTraits::dummy_precision()); EXPECT_NEAR(value, result.second, Eigen::NumTraits::dummy_precision()); auto accessibleResult = testAccessible(value); FloatType accessibleValue; ASSERT_NO_THROW({boost::any_cast(accessibleResult.second);}); accessibleValue = boost::any_cast(accessibleResult.second); EXPECT_NEAR(value, accessibleValue, Eigen::NumTraits::dummy_precision()); FloatType nodeValue = 0.0; ASSERT_NO_THROW(nodeValue = testYamlSetter(value)); EXPECT_NEAR(value, nodeValue, Eigen::NumTraits::dummy_precision()); } /// Tests OsgUniform with a vector of random floating point type values. /// \tparam FloatType Floating point type (float, double, ...) /// \param min Minimum random value /// \param max Maximum random value /// \param numElements Number of elements template void testUniformElementsFloat(FloatType min, FloatType max, size_t numElements) { std::uniform_real_distribution distribution(min, max); std::vector elements; for (size_t i = 0; i < numElements; ++i) { elements.push_back(distribution(generator)); } std::pair, std::vector> result = testUniformElementsConstruction(elements, numElements); EXPECT_EQ(elements.size(), result.first.size()) << "Number of resulting float-type elements does not match input"; EXPECT_EQ(elements.size(), result.second.size()) << "Number of resulting OSG-type elements does not match input"; for (size_t i = 0; i < elements.size(); ++i) { EXPECT_NEAR(elements[i], result.first[i], Eigen::NumTraits::dummy_precision()); EXPECT_NEAR(elements[i], result.second[i], Eigen::NumTraits::dummy_precision()); } } /// Tests OsgUniform with a random integer type value. /// \tparam IntType Integer type (int, unsigned int, ...) /// \param min Minimum random value /// \param max Maximum random value template void testUniformInt(IntType min, IntType max) { std::uniform_int_distribution distribution(min, max); IntType value = distribution(generator); std::pair result = testUniformConstruction(value); EXPECT_EQ(value, result.first); EXPECT_EQ(value, result.second); auto accessibleResult = testAccessible(value); IntType accessibleValue; ASSERT_NO_THROW({accessibleValue = boost::any_cast(accessibleResult.second);}); EXPECT_EQ(value, accessibleValue); IntType nodeValue; EXPECT_NO_THROW(nodeValue = testYamlSetter(value)); EXPECT_EQ(value, nodeValue); } /// Tests OsgUniform with a vector of random integer type values. /// \tparam IntType Integer type (int, unsigned int, ...) /// \param min Minimum random value /// \param max Maximum random value /// \param numElements Number of elements template void testUniformElementsInt(IntType min, IntType max, size_t numElements) { std::uniform_int_distribution distribution(min, max); std::vector elements; for (size_t i = 0; i < numElements; ++i) { elements.push_back(distribution(generator)); } std::pair, std::vector> result = testUniformElementsConstruction(elements, numElements); EXPECT_EQ(elements.size(), result.first.size()) << "Number of resulting int-type elements does not match input"; EXPECT_EQ(elements.size(), result.second.size()) << "Number of resulting OSG-type elements does not match input"; for (size_t i = 0; i < elements.size(); ++i) { EXPECT_EQ(elements[i], result.first[i]); EXPECT_EQ(elements[i], result.second[i]); } } /// Tests OsgUniform with a random Eigen type values. /// \tparam Type Eigen type (Vector2f, Matrix44d, ...) /// \tparam OsgType OSG type which corresponds with the Eigen type (must have a fromOsg() defined for this type) template void testUniformEigen() { Type value = Type::Random(); std::pair result = testUniformConstruction(value); EXPECT_TRUE(result.first.isApprox(value)); EXPECT_TRUE(fromOsg(result.second).isApprox(value)); auto accessibleResult = testAccessible(value); Type accessibleValue; ASSERT_NO_THROW({boost::any_cast(accessibleResult.second);}); accessibleValue = boost::any_cast(accessibleResult.second); EXPECT_TRUE(value.isApprox(accessibleValue)); Type nodeValue; EXPECT_NO_THROW(nodeValue = testYamlSetter(value)); EXPECT_TRUE(value.isApprox(nodeValue)); } /// Tests OsgUniform with a vector of random Eigen type values. /// \tparam Type Eigen type (Vector2f, Matrix44d, ...) /// \tparam OsgType OSG type which corresponds with the Eigen type (must have a fromOsg() defined for this type) template void testUniformElementsEigen(size_t numElements) { std::vector elements; for (size_t i = 0; i < numElements; ++i) { elements.push_back(Type::Random()); } std::pair, std::vector> result = testUniformElementsConstruction(elements, numElements); EXPECT_EQ(elements.size(), result.first.size()) << "Number of resulting Eigen-type elements does not match input"; EXPECT_EQ(elements.size(), result.second.size()) << "Number of resulting OSG-type elements does not match input"; for (size_t i = 0; i < elements.size(); ++i) { const Type& eigenInput = elements[i]; const Type& eigenOutput = result.first[i]; const OsgType& osgOutput = result.second[i]; EXPECT_TRUE(eigenOutput.isApprox(eigenInput)); EXPECT_TRUE(fromOsg(osgOutput).isApprox(eigenInput)); } } TEST(OsgUniformTests, FloatTest) { testUniformFloat(-10.0f, 10.0f); } TEST(OsgUniformTests, DoubleTest) { testUniformFloat(-10.0, 10.0); } TEST(OsgUniformTests, IntTest) { testUniformInt(-10, 10); } TEST(OsgUniformTests, UnsignedIntTest) { testUniformInt(0, 10); } TEST(OsgUniformTests, BoolTest) { { std::pair result = testUniformConstruction(true); EXPECT_TRUE(result.first); EXPECT_TRUE(result.second); } { std::pair result = testUniformConstruction(false); EXPECT_FALSE(result.first); EXPECT_FALSE(result.second); } } TEST(OsgUniformTests, Vector2fTest) { testUniformEigen(); } TEST(OsgUniformTests, Vector3fTest) { testUniformEigen(); } TEST(OsgUniformTests, Vector4fTest) { testUniformEigen(); } TEST(OsgUniformTests, Vector2dTest) { testUniformEigen(); } TEST(OsgUniformTests, Vector3dTest) { testUniformEigen(); } TEST(OsgUniformTests, Vector4dTest) { testUniformEigen(); } TEST(OsgUniformTests, Matrix22fTest) { testUniformEigen(); } TEST(OsgUniformTests, Matrix33fTest) { testUniformEigen(); } TEST(OsgUniformTests, Matrix44fTest) { testUniformEigen(); } TEST(OsgUniformTests, Matrix22dTest) { testUniformEigen(); } TEST(OsgUniformTests, Matrix33dTest) { testUniformEigen(); } TEST(OsgUniformTests, Matrix44dTest) { testUniformEigen(); } TEST(OsgUniformTests, FloatElementsTest) { testUniformElementsFloat(-10.0f, 10.0f, 10); } TEST(OsgUniformTests, DoubleElementsTest) { testUniformElementsFloat(-10.0, 10.0, 10); } TEST(OsgUniformTests, IntElementsTest) { testUniformElementsInt(-10, 10, 10); } TEST(OsgUniformTests, UnsignedIntElementsTest) { testUniformElementsInt(0, 10, 10); } TEST(OsgUniformTests, BoolElementsTest) { std::vector elements; for (size_t i = 0; i < 10; ++i) { elements.push_back(i % 2 == 0); } std::pair, std::vector> result = testUniformElementsConstruction(elements, 10); EXPECT_EQ(elements.size(), result.first.size()) << "Number of resulting bool-type elements does not match input"; EXPECT_EQ(elements.size(), result.second.size()) << "Number of resulting OSG-type elements does not match input"; for (size_t i = 0; i < elements.size(); ++i) { EXPECT_EQ(elements[i], result.first[i]); EXPECT_EQ(elements[i], result.second[i]); } } TEST(OsgUniformTests, Vector2fElementsTest) { testUniformElementsEigen(10); } TEST(OsgUniformTests, Vector3fElementsTest) { testUniformElementsEigen(10); } TEST(OsgUniformTests, Vector4fElementsTest) { testUniformElementsEigen(10); } TEST(OsgUniformTests, Vector2dElementsTest) { testUniformElementsEigen(10); } TEST(OsgUniformTests, Vector3dElementsTest) { testUniformElementsEigen(10); } TEST(OsgUniformTests, Vector4dElementsTest) { testUniformElementsEigen(10); } TEST(OsgUniformTests, Matrix22fElementsTest) { testUniformElementsEigen(10); } TEST(OsgUniformTests, Matrix33fElementsTest) { testUniformElementsEigen(10); } TEST(OsgUniformTests, Matrix44fElementsTest) { testUniformElementsEigen(10); } TEST(OsgUniformTests, Matrix22dElementsTest) { testUniformElementsEigen(10); } TEST(OsgUniformTests, Matrix33dElementsTest) { testUniformElementsEigen(10); } TEST(OsgUniformTests, Matrix44dElementsTest) { testUniformElementsEigen(10); } } // namespace Graphics } // namespace SurgSim opensurgsim-0.7.0/SurgSim/Graphics/UnitTests/OsgUniformTypesTests.cpp000066400000000000000000000057451277777236100260660ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the OsgUniformTypes functions to make sure they return the correct enum values. #include "SurgSim/Graphics/OsgUniformTypes.h" #include #include namespace SurgSim { namespace Graphics { TEST(OsgUniformTypesTests, FloatTest) { EXPECT_EQ(osg::Uniform::FLOAT, getOsgUniformType()); } TEST(OsgUniformTypesTests, DoubleTest) { EXPECT_EQ(osg::Uniform::DOUBLE, getOsgUniformType()); } TEST(OsgUniformTypesTests, IntTest) { EXPECT_EQ(osg::Uniform::INT, getOsgUniformType()); } TEST(OsgUniformTypesTests, UnsignedIntTest) { EXPECT_EQ(osg::Uniform::UNSIGNED_INT, getOsgUniformType()); } TEST(OsgUniformTypesTests, BoolTest) { EXPECT_EQ(osg::Uniform::BOOL, getOsgUniformType()); } TEST(OsgUniformTypesTests, Vector2fTest) { EXPECT_EQ(osg::Uniform::FLOAT_VEC2, getOsgUniformType()); } TEST(OsgUniformTypesTests, Vector3fTest) { EXPECT_EQ(osg::Uniform::FLOAT_VEC3, getOsgUniformType()); } TEST(OsgUniformTypesTests, Vector4fTest) { EXPECT_EQ(osg::Uniform::FLOAT_VEC4, getOsgUniformType()); } TEST(OsgUniformTypesTests, Vector2dTest) { EXPECT_EQ(osg::Uniform::DOUBLE_VEC2, getOsgUniformType()); } TEST(OsgUniformTypesTests, Vector3dTest) { EXPECT_EQ(osg::Uniform::DOUBLE_VEC3, getOsgUniformType()); } TEST(OsgUniformTypesTests, Vector4dTest) { EXPECT_EQ(osg::Uniform::DOUBLE_VEC4, getOsgUniformType()); } TEST(OsgUniformTypesTests, Matrix22fTest) { EXPECT_EQ(osg::Uniform::FLOAT_MAT2, getOsgUniformType()); } TEST(OsgUniformTypesTests, Matrix33fTest) { EXPECT_EQ(osg::Uniform::FLOAT_MAT3, getOsgUniformType()); } TEST(OsgUniformTypesTests, Matrix44fTest) { EXPECT_EQ(osg::Uniform::FLOAT_MAT4, getOsgUniformType()); } TEST(OsgUniformTypesTests, Matrix22dTest) { EXPECT_EQ(osg::Uniform::DOUBLE_MAT2, getOsgUniformType()); } TEST(OsgUniformTypesTests, Matrix33dTest) { EXPECT_EQ(osg::Uniform::DOUBLE_MAT3, getOsgUniformType()); } TEST(OsgUniformTypesTests, Matrix44dTest) { EXPECT_EQ(osg::Uniform::DOUBLE_MAT4, getOsgUniformType()); } } // namespace Graphics } // namespace SurgSimopensurgsim-0.7.0/SurgSim/Graphics/UnitTests/OsgUnitSphereTests.cpp000066400000000000000000000045501277777236100255010ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the OsgUnitSphere class. #include "SurgSim/Graphics/OsgUnitSphere.h" #include namespace SurgSim { namespace Graphics { TEST(OsgUnitSphereTests, InitTest) { ASSERT_NO_THROW({OsgUnitSphere sphere;}); OsgUnitSphere sphere; osg::ref_ptr node = sphere.getNode(); EXPECT_NE(nullptr, node.get()); osg::ref_ptr transform = dynamic_cast(node.get()); EXPECT_NE(nullptr, transform.get()); osg::Quat rotation; rotation.makeRotate(osg::Vec3d(0.0, 0.0, 1.0), osg::Vec3d(0.0, 1.0, 0.0)); EXPECT_EQ(rotation, transform->getAttitude()); EXPECT_EQ(osg::Vec3(0.0, 0.0, 0.0), transform->getPosition()); EXPECT_EQ(osg::Vec3(1.0, 1.0, 1.0), transform->getScale()); EXPECT_EQ(1u, transform->getNumChildren()); osg::ref_ptr geode = dynamic_cast(transform->getChild(0u)); EXPECT_NE(nullptr, geode.get()); EXPECT_EQ(1u, geode->getNumDrawables()); osg::ref_ptr drawable = geode->getDrawable(0); EXPECT_NE(nullptr, drawable.get()); osg::ref_ptr shapeDrawable = dynamic_cast(drawable.get()); EXPECT_NE(nullptr, shapeDrawable.get()); osg::ref_ptr shape = shapeDrawable->getShape(); EXPECT_NE(nullptr, shape.get()); osg::ref_ptr sphereShape = dynamic_cast(shape.get()); EXPECT_NE(nullptr, sphereShape.get()); /// The sphere should be at (0, 0, 0) with radius 1 EXPECT_EQ(0.0f, sphereShape->getCenter().x()); EXPECT_EQ(0.0f, sphereShape->getCenter().y()); EXPECT_EQ(0.0f, sphereShape->getCenter().z()); EXPECT_EQ(1.0f, sphereShape->getRadius()); } }; // namespace Graphics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Graphics/UnitTests/OsgVectorConversionsTests.cpp000066400000000000000000000041211277777236100271000ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for conversions to and from OSG vector types #include "SurgSim/Graphics/OsgVectorConversions.h" #include using SurgSim::Graphics::fromOsg; using SurgSim::Graphics::toOsg; using SurgSim::Math::Vector2f; using SurgSim::Math::Vector2d; using SurgSim::Math::Vector3f; using SurgSim::Math::Vector3d; using SurgSim::Math::Vector4f; using SurgSim::Math::Vector4d; TEST(OsgVectorConversionsTests, Vector2fTest) { Vector2f vector = Vector2f::Random(); osg::Vec2f osgVector = toOsg(vector); EXPECT_TRUE(vector.isApprox(fromOsg(osgVector))); } TEST(OsgVectorConversionsTests, Vector2dTest) { Vector2d vector = Vector2d::Random(); osg::Vec2d osgVector = toOsg(vector); EXPECT_TRUE(vector.isApprox(fromOsg(osgVector))); } TEST(OsgVectorConversionsTests, Vector3fTest) { Vector3f vector = Vector3f::Random(); osg::Vec3f osgVector = toOsg(vector); EXPECT_TRUE(vector.isApprox(fromOsg(osgVector))); } TEST(OsgVectorConversionsTests, Vector3dTest) { Vector3d vector = Vector3d::Random(); osg::Vec3d osgVector = toOsg(vector); EXPECT_TRUE(vector.isApprox(fromOsg(osgVector))); } TEST(OsgVectorConversionsTests, Vector4fTest) { Vector4f vector = Vector4f::Random(); osg::Vec4f osgVector = toOsg(vector); EXPECT_TRUE(vector.isApprox(fromOsg(osgVector))); } TEST(OsgVectorConversionsTests, Vector4dTest) { Vector4d vector = Vector4d::Random(); osg::Vec4d osgVector = toOsg(vector); EXPECT_TRUE(vector.isApprox(fromOsg(osgVector))); } opensurgsim-0.7.0/SurgSim/Graphics/UnitTests/OsgVectorFieldRepresentationTests.cpp000066400000000000000000000055501277777236100305450ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Unit Tests for the OsgVectorFieldRepresentation class. #include "SurgSim/Graphics/VectorFieldRepresentation.h" #include "SurgSim/Graphics/OsgVectorFieldRepresentation.h" #include "SurgSim/Math/Vector.h" #include namespace { const double epsilon = 1e-6; }; using SurgSim::Graphics::OsgVectorFieldRepresentation; using SurgSim::Graphics::VectorFieldRepresentation; TEST(OsgVectorFieldRepresentationTests, VerticesTest) { std::shared_ptr vectorFieldRepresentation = std::make_shared("Vector Field"); EXPECT_EQ(0u, vectorFieldRepresentation->getVectorField()->getNumVertices()); } TEST(OsgVectorFieldRepresentationTests, LineWidthTest) { std::shared_ptr vectorFieldRepresentation = std::make_shared("Vector Field"); vectorFieldRepresentation->setLineWidth(1.25); EXPECT_NEAR(1.25, vectorFieldRepresentation->getLineWidth(), epsilon); } TEST(OsgVectorFieldRepresentationTests, ScaleTest) { std::shared_ptr vectorFieldRepresentation = std::make_shared("Vector Field"); vectorFieldRepresentation->setScale(1.25); EXPECT_NEAR(1.25, vectorFieldRepresentation->getScale(), epsilon); } TEST(OsgVectorFieldRepresentationTests, PointSizeTest) { std::shared_ptr vectorFieldRepresentation = std::make_shared("Vector Field"); vectorFieldRepresentation->setPointSize(1.25); EXPECT_NEAR(1.25, vectorFieldRepresentation->getPointSize(), epsilon); } TEST(OsgVectorFieldRepresentation, Properties) { auto representation = std::make_shared("Vector Field"); EXPECT_EQ("SurgSim::Graphics::OsgVectorFieldRepresentation", representation->getClassName()); EXPECT_NO_THROW(representation->setValue("Scale", 2.34)); EXPECT_NEAR(2.34, representation->getValue("Scale"), epsilon); EXPECT_NO_THROW(representation->setValue("LineWidth", 4.56)); EXPECT_NEAR(4.56, representation->getValue("LineWidth"), epsilon); EXPECT_NO_THROW(representation->setValue("PointSize", 7.89)); EXPECT_NEAR(7.89, representation->getValue("PointSize"), epsilon); }opensurgsim-0.7.0/SurgSim/Graphics/UnitTests/OsgViewElementTests.cpp000066400000000000000000000036461277777236100256440ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the OsgViewElement class. #include "SurgSim/Graphics/UnitTests/MockObjects.h" #include "SurgSim/Graphics/UnitTests/MockOsgObjects.h" #include "SurgSim/Graphics/OsgView.h" #include "SurgSim/Graphics/OsgViewElement.h" #include namespace SurgSim { namespace Graphics { TEST(OsgViewElementTests, InitTest) { ASSERT_NO_THROW({std::shared_ptr viewElement = std::make_shared("test name");}); std::shared_ptr viewElement = std::make_shared("test name"); std::shared_ptr osgView = std::dynamic_pointer_cast(viewElement->getView()); EXPECT_NE(nullptr, osgView); } TEST(OsgViewElementTests, ViewTest) { std::shared_ptr element = std::make_shared("test name"); /// Setting an OsgView should succeed std::shared_ptr osgView = std::make_shared("test osg view"); EXPECT_TRUE(element->setView(osgView)); EXPECT_EQ(osgView, element->getView()); /// Any other View should fail std::shared_ptr mockView = std::make_shared("test mock view"); EXPECT_FALSE(element->setView(mockView)); EXPECT_NE(mockView, element->getView()); EXPECT_EQ(osgView, element->getView()); } }; // namespace Graphics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Graphics/UnitTests/OsgViewTests.cpp000066400000000000000000000232561277777236100243310ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the OsgView class. #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Graphics/UnitTests/MockObjects.h" #include "SurgSim/Graphics/UnitTests/MockOsgObjects.h" #include "SurgSim/Graphics/OsgCamera.h" #include "SurgSim/Graphics/OsgView.h" #include #include #include "osg/GraphicsContext" namespace SurgSim { namespace Graphics { TEST(OsgViewTests, InitTest) { ASSERT_NO_THROW({std::shared_ptr view = std::make_shared("test name");}); std::shared_ptr view = std::make_shared("test name"); EXPECT_EQ("test name", view->getName()); EXPECT_EQ(nullptr, view->getCamera()); std::array position = view->getPosition(); EXPECT_EQ(0, position[0]); EXPECT_EQ(0, position[1]); std::array dimensions = view->getDimensions(); EXPECT_EQ(1024, dimensions[0]); EXPECT_EQ(768, dimensions[1]); EXPECT_TRUE(view->isWindowBorderEnabled()); } TEST(OsgViewTests, PositionAndDimensionsTest) { std::shared_ptr osgView = std::make_shared("test name"); std::shared_ptr view = osgView; std::default_random_engine generator; std::uniform_int_distribution distribution(0, 1000); std::array position = {distribution(generator), distribution(generator)}; std::array dimensions = {distribution(generator), distribution(generator)}; /// Set position and check that it set correctly view->setPosition(position); auto test = view->getPosition(); EXPECT_EQ(position, test); /// Set dimensions and check that it set correctly view->setDimensions(dimensions); test = view->getDimensions(); EXPECT_EQ(dimensions, test); /// The window border should be enabled initially EXPECT_TRUE(view->isWindowBorderEnabled()); /// Disable the window border view->setWindowBorderEnabled(false); EXPECT_FALSE(view->isWindowBorderEnabled()); } TEST(OsgViewTests, FullScreenSize) { std::shared_ptr osgView = std::make_shared("test name"); std::shared_ptr view = osgView; std::array dimensions = { 20, 30 }; view->setDimensions(dimensions); EXPECT_EQ(dimensions, view->getDimensions()); view->setFullScreen(true); osg::GraphicsContext::WindowingSystemInterface* wsi = osg::GraphicsContext::getWindowingSystemInterface(); ASSERT_NE(nullptr, wsi); unsigned int width, height; wsi->getScreenResolution(osg::GraphicsContext::ScreenIdentifier(view->getTargetScreen()), width, height); std::array screen = { static_cast(width), static_cast(height) }; EXPECT_EQ(screen, view->getDimensions()); view->setFullScreen(false); EXPECT_EQ(dimensions, view->getDimensions()); } TEST(OsgViewTests, CameraTest) { std::shared_ptr view = std::make_shared("test name"); std::shared_ptr camera = std::make_shared("test camera"); /// Set the camera and check that it set correctly EXPECT_NO_THROW(view->setCamera(camera)); EXPECT_EQ(camera, view->getCamera()); std::shared_ptr mockCamera = std::make_shared("non-osg camera"); /// Try to set a camera that does not derive from OsgCamera EXPECT_ANY_THROW(view->setCamera(mockCamera)); EXPECT_EQ(camera, view->getCamera()); } typedef std::array CoordinateType; using SurgSim::Math::Vector3d; void expectEqual(std::shared_ptr expected, std::shared_ptr actual) { if (expected->getCamera() == nullptr) { EXPECT_EQ(nullptr, actual->getCamera()); } else { EXPECT_NE(nullptr, actual->getCamera()); EXPECT_EQ(boost::any_cast>(expected->getValue("Camera"))->getName(), boost::any_cast>(actual->getValue("Camera"))->getName()); } EXPECT_EQ(boost::any_cast(expected->getValue("Position")), boost::any_cast(actual->getValue("Position"))); EXPECT_EQ(boost::any_cast(expected->getValue("Dimensions")), boost::any_cast(actual->getValue("Dimensions"))); EXPECT_EQ(boost::any_cast(expected->getValue("WindowBorder")), boost::any_cast(actual->getValue("WindowBorder"))); EXPECT_EQ(boost::any_cast(expected->getValue("StereoMode")), boost::any_cast(actual->getValue("StereoMode"))); EXPECT_EQ(boost::any_cast(expected->getValue("DisplayType")), boost::any_cast(actual->getValue("DisplayType"))); EXPECT_EQ(boost::any_cast(expected->getValue("FullScreen")), boost::any_cast(actual->getValue("FullScreen"))); EXPECT_EQ(boost::any_cast(expected->getValue("TargetScreen")), boost::any_cast(actual->getValue("TargetScreen"))); EXPECT_EQ(boost::any_cast(expected->getValue("EyeSeparation")), boost::any_cast(actual->getValue("EyeSeparation"))); EXPECT_EQ(boost::any_cast(expected->getValue("ScreenDistance")), boost::any_cast(actual->getValue("ScreenDistance"))); EXPECT_EQ(boost::any_cast(expected->getValue("ScreenWidth")), boost::any_cast(actual->getValue("ScreenWidth"))); EXPECT_EQ(boost::any_cast(expected->getValue("ScreenHeight")), boost::any_cast(actual->getValue("ScreenHeight"))); EXPECT_EQ(boost::any_cast(expected->getValue("CameraManipulatorEnabled")), boost::any_cast(actual->getValue("CameraManipulatorEnabled"))); EXPECT_TRUE(boost::any_cast(expected->getValue("CameraPosition")).isApprox( boost::any_cast(actual->getValue("CameraPosition")))); EXPECT_TRUE(boost::any_cast(expected->getValue("CameraLookAt")).isApprox( boost::any_cast(actual->getValue("CameraLookAt")))); EXPECT_EQ(boost::any_cast(expected->getValue("OsgMapUniforms")), boost::any_cast(actual->getValue("OsgMapUniforms"))); EXPECT_EQ(boost::any_cast(expected->getValue("KeyboardDeviceEnabled")), boost::any_cast(actual->getValue("KeyboardDeviceEnabled"))); EXPECT_EQ(boost::any_cast(expected->getValue("MouseDeviceEnabled")), boost::any_cast(actual->getValue("MouseDeviceEnabled"))); } TEST(OsgViewTests, Serialization) { { SCOPED_TRACE("Serialize with default values"); std::shared_ptr view = std::make_shared("test name"); /// Serialize YAML::Node node; EXPECT_NO_THROW(node = YAML::convert::encode(*view);); /// Deserialize std::shared_ptr newView; EXPECT_NO_THROW(newView = std::dynamic_pointer_cast( node.as>())); EXPECT_NE(nullptr, newView); // Verify expectEqual(view, newView); } { SCOPED_TRACE("Serialize with user-defined values"); std::shared_ptr view = std::make_shared("test name"); std::shared_ptr camera = std::make_shared("test camera"); CoordinateType position; position[0] = 100; position[1] = 100; view->setValue("Position", position); CoordinateType dimensions; dimensions[0] = 200; dimensions[1] = 200; view->setValue("Dimensions", dimensions); view->setValue("WindowBorder", true); view->setValue("Camera", std::dynamic_pointer_cast(camera)); view->setValue("StereoMode", static_cast(SurgSim::Graphics::View::STEREO_MODE_QUAD_BUFFER)); view->setValue("DisplayType", static_cast(SurgSim::Graphics::View::DISPLAY_TYPE_HMD)); view->setValue("FullScreen", true); view->setValue("TargetScreen", 3); view->setValue("EyeSeparation", 0.123); view->setValue("ScreenDistance", 2.123); view->setValue("ScreenWidth", 1.1); view->setValue("ScreenHeight", 1.1); view->setValue("CameraManipulatorEnabled", true); view->setValue("CameraPosition", Vector3d(1.5, 1.5, 1.5)); view->setValue("CameraLookAt", Vector3d(10.5, 10.5, 10.5)); view->setValue("OsgMapUniforms", true); /// Serialize YAML::Node node; EXPECT_NO_THROW(node = YAML::convert::encode(*view);); /// Deserialize std::shared_ptr newView; EXPECT_NO_THROW(newView = std::dynamic_pointer_cast( node.as>())); EXPECT_NE(nullptr, newView); // Verify expectEqual(view, newView); YAML::Node cameraNode; EXPECT_NO_THROW(cameraNode = YAML::convert::encode(*camera);); EXPECT_EQ(cameraNode[camera->getClassName()]["Id"].as(), node[view->getClassName()]["Camera"][camera->getClassName()]["Id"].as()); } } TEST(OsgViewTests, OnlyOneDevice) { std::shared_ptr view1 = std::make_shared("One"); std::shared_ptr view2 = std::make_shared("Two"); view1->enableKeyboardDevice(true); view1->enableMouseDevice(true); EXPECT_ANY_THROW(view2->enableKeyboardDevice(true)); EXPECT_ANY_THROW(view2->enableMouseDevice(true)); } TEST(OsgViewTest, TargetScreenTest) { std::shared_ptr view = std::make_shared("view"); EXPECT_NO_THROW(view->setTargetScreen(100)); EXPECT_NE(100, view->getTargetScreen()); // The actual number is dependent on the number of screens } } // namespace Graphics } // namespace SurgSim opensurgsim-0.7.0/SurgSim/Graphics/UnitTests/PaintBehaviorTests.cpp000066400000000000000000000033131277777236100254710ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Graphics/OsgMeshRepresentation.h" #include "SurgSim/Graphics/PaintBehavior.h" namespace SurgSim { namespace Graphics { class PaintBehaviorTests : public testing::Test { }; TEST_F(PaintBehaviorTests, Serialization) { auto component = std::make_shared("Painter"); auto representation = std::make_shared("MeshRepresentation"); auto color = Math::Vector4d(1.0, 0.0, 0.0, 1.0); component->setRepresentation(representation); component->setColor(color); component->setAntiAlias(true); YAML::Node node(YAML::convert::encode(*component)); auto decode = std::dynamic_pointer_cast( node.as>()); EXPECT_NE(nullptr, decode); EXPECT_EQ(representation->getFullName(), decode->getRepresentation()->getFullName()); EXPECT_TRUE(color.isApprox(decode->getColor())); EXPECT_TRUE(decode->getAntiAlias()); } } // namespace Graphics } // namespace SurgSimopensurgsim-0.7.0/SurgSim/Graphics/UnitTests/RenderPassTests.cpp000066400000000000000000000036621277777236100250130ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Graphics/RenderPass.h" #include "SurgSim/Graphics/Group.h" #include "SurgSim/Graphics/Camera.h" #include "SurgSim/Graphics/OsgRenderTarget.h" #include "SurgSim/Graphics/OsgMaterial.h" namespace SurgSim { namespace Graphics { TEST(RenderPassTests, InitTest) { std::shared_ptr renderPass; ASSERT_NO_THROW({renderPass = std::make_shared("testpass");}); EXPECT_NE(nullptr, renderPass->getCamera()); EXPECT_NE(nullptr, renderPass->getMaterial()); EXPECT_EQ(renderPass->getCamera()->getMaterial(), renderPass->getMaterial()); auto references = renderPass->getCamera()->getRenderGroupReferences(); EXPECT_TRUE(std::find(references.begin(), references.end(), renderPass->getName()) != references.end()); } TEST(RenderPassTests, SettersTest) { auto renderPass = std::make_shared("testpass"); auto renderTarget = std::make_shared(1024, 1024, 1.0, 1, true); ASSERT_NO_THROW({renderPass->setRenderTarget(renderTarget);}); EXPECT_EQ(renderTarget, renderPass->getCamera()->getRenderTarget()); auto material = std::make_shared("material"); ASSERT_NO_THROW({renderPass->setMaterial(material);}); EXPECT_EQ(material, renderPass->getMaterial()); } }; // namespace Graphics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Graphics/UnitTests/ViewElementTests.cpp000066400000000000000000000074031277777236100251660ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the ViewElement class. #include "SurgSim/Graphics/ViewElement.h" #include "SurgSim/Graphics/UnitTests/MockObjects.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Framework/Scene.h" #include "SurgSim/Input/CommonDevice.h" #include using SurgSim::Framework::Runtime; using SurgSim::Framework::Scene; namespace SurgSim { namespace Graphics { /// Concrete ViewElement subclass for testing class MockViewElement : public ViewElement { public: explicit MockViewElement(const std::string& name) : ViewElement(name), m_isInitialized(false) { setView(std::make_shared(name + " View")); setCamera(std::make_shared(name + " Camera")); getCamera()->setRenderGroupReference("Test"); } std::shared_ptr getKeyboardDevice() override { return nullptr; } void enableKeyboardDevice(bool val) override { return; } std::shared_ptr getMouseDevice() override { return nullptr; } void enableMouseDevice(bool val) override { return; } private: /// Initialize the view element /// \post m_isInitialized is set to true virtual bool doInitialize() { if (ViewElement::doInitialize()) { m_isInitialized = true; return true; } else { return false; } } /// Whether the view has been initialized bool m_isInitialized; }; /// View class for testing adding a non-MockView class NotMockView : public View { public: /// Constructor /// \param name Name of the view explicit NotMockView(const std::string& name) : View(name) { return; } }; TEST(ViewElementTests, InitTest) { ASSERT_NO_THROW({std::shared_ptr element = std::make_shared("test name");}); } TEST(ViewElementTests, StartUpTest) { auto runtime = std::make_shared(); auto manager = std::make_shared(); runtime->addManager(manager); EXPECT_EQ(0, manager->getNumUpdates()); EXPECT_EQ(0.0, manager->getSumDt()); std::shared_ptr scene = runtime->getScene(); /// Add a graphics component to the scene auto viewElement = std::make_shared("Testing MockViewElement"); scene->addSceneElement(viewElement); /// Run the thread for a moment runtime->start(); EXPECT_TRUE(manager->isInitialized()); boost::this_thread::sleep(boost::posix_time::milliseconds(100)); /// Check that the view element was initialized and awoken EXPECT_TRUE(viewElement->getView()->isInitialized()); EXPECT_TRUE(viewElement->getView()->isAwake()); runtime->stop(); /// Check that the view element was initialized and retired again EXPECT_TRUE(viewElement->isInitialized()); EXPECT_TRUE(viewElement->getView()->isInitialized()); EXPECT_FALSE(viewElement->getView()->isAwake()); } TEST(ViewElementTests, ViewTest) { std::shared_ptr element = std::make_shared("Testing MockViewElement"); /// Setting a MockView should succeed std::shared_ptr mockView = std::make_shared("Testing MockView"); EXPECT_TRUE(element->setView(mockView)); EXPECT_EQ(mockView, element->getView()); } }; // namespace Graphics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Graphics/UnitTests/ViewTests.cpp000066400000000000000000000060631277777236100236550ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the View class. #include "SurgSim/Graphics/UnitTests/MockObjects.h" #include "SurgSim/Graphics/OsgCamera.h" #include #include namespace SurgSim { namespace Graphics { TEST(ViewTests, InitTest) { ASSERT_NO_THROW({std::shared_ptr view = std::make_shared("test name");}); } TEST(ViewTests, NameTest) { std::shared_ptr view = std::make_shared("test name"); EXPECT_EQ("test name", view->getName()); } TEST(ViewTests, WindowSettingsTests) { std::shared_ptr view = std::make_shared("test name"); std::default_random_engine generator; std::uniform_int_distribution distribution(0, 1000); std::array position = {distribution(generator), distribution(generator)}; std::array dimensions = {distribution(generator), distribution(generator)}; /// Set position and check that it set correctly view->setPosition(position); auto test = view->getPosition(); EXPECT_EQ(position, test); /// Set dimensions and check that it set correctly view->setDimensions(dimensions); test = view->getDimensions(); EXPECT_EQ(dimensions, test); /// The window border should be enabled initially EXPECT_TRUE(view->isWindowBorderEnabled()); /// Disable the window border view->setWindowBorderEnabled(false); EXPECT_FALSE(view->isWindowBorderEnabled()); } TEST(ViewTests, CameraTest) { std::shared_ptr view = std::make_shared("test name"); std::shared_ptr camera = std::make_shared("test camera"); /// Set the camera and check that it set correctly EXPECT_NO_THROW(view->setCamera(camera)); EXPECT_EQ(camera, view->getCamera()); } TEST(ViewTests, UpdateTest) { std::shared_ptr mockView = std::make_shared("test name"); std::shared_ptr view = mockView; EXPECT_EQ(0, mockView->getNumUpdates()); EXPECT_EQ(0.0, mockView->getSumDt()); double sumDt = 0.0; std::default_random_engine generator; std::uniform_real_distribution distribution(0.0, 1.0); /// Do 10 updates with random dt and check each time that the number of updates and sum of dt are correct. for (int i = 1; i <= 10; ++i) { double dt = distribution(generator); sumDt += dt; view->update(dt); EXPECT_EQ(i, mockView->getNumUpdates()); EXPECT_LT(fabs(sumDt - mockView->getSumDt()), Eigen::NumTraits::dummy_precision()); } } }; // namespace Graphics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Graphics/UnitTests/config.txt.in000066400000000000000000000001551277777236100236230ustar00rootroot00000000000000${PROJECT_BINARY_DIR}/Data/ ${CMAKE_CURRENT_BINARY_DIR}/Data/ ${PROJECT_BINARY_DIR}/SurgSim/Testing/Data/ opensurgsim-0.7.0/SurgSim/Graphics/VectorField.h000066400000000000000000000037701277777236100216330ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_VECTORFIELD_H #define SURGSIM_GRAPHICS_VECTORFIELD_H #include "SurgSim/DataStructures/OptionalValue.h" #include "SurgSim/DataStructures/Vertices.h" #include "SurgSim/Math/Vector.h" namespace SurgSim { namespace Graphics { /// A (mathematical) vector is represented as (X,Y,Z) associated with an optional color (R,G,B,alpha) information struct VectorFieldData { /// Direction (X,Y,Z) of the vector SurgSim::Math::Vector3d direction; /// Color (R,G,B,alpha) of the vector (Optional) SurgSim::DataStructures::OptionalValue color; /// Compare the vectors and return true if equal; Othwise, false. /// \return True if vector1 and rhs have the same value; Otherwise, false. bool operator==(const VectorFieldData& rhs) const { if (color.hasValue() && rhs.color.hasValue()) { return direction == rhs.direction && color.getValue() == rhs.color.getValue(); } else { return direction == rhs.direction; } } /// Compare the vectors and return true if not equal, false if equal. /// \return True if vector1 and rhs have different values; Otherwise, false. bool operator!=(const VectorFieldData& rhs) const { return ! (*this == rhs); } }; typedef SurgSim::DataStructures::Vertices VectorField; }; // namespace Graphics }; // namespace SurgSim #endif // SURGSIM_GRAPHICS_VECTORFIELD_Hopensurgsim-0.7.0/SurgSim/Graphics/VectorFieldRepresentation.h000066400000000000000000000046601277777236100245550ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_VECTORFIELDREPRESENTATION_H #define SURGSIM_GRAPHICS_VECTORFIELDREPRESENTATION_H #include "SurgSim/Graphics/Representation.h" #include "SurgSim/Graphics/VectorField.h" namespace SurgSim { namespace Graphics { /// Graphic representation of a vector field /// Each point/location, i.e. (X,Y,Z), in the vector field is associated with a vector and an optional color class VectorFieldRepresentation : public virtual Representation { public: /// Constructor /// \param name Name of VectorFieldRepresentation explicit VectorFieldRepresentation(const std::string& name) : Representation(name) { } /// Destructor virtual ~VectorFieldRepresentation() { } /// Gets the vector field /// \return The vector field virtual std::shared_ptr getVectorField() const = 0; /// Updates the vector field in a threadsafe manner /// \param vectorfield the new data virtual void updateVectorField(const SurgSim::Graphics::VectorField& vectorfield) = 0; /// Sets vector line width /// \param width Width of vector line virtual void setLineWidth(double width) = 0; /// Gets line width /// \return The line width virtual double getLineWidth() const = 0; /// Sets the scale to be applied to all vectors /// \param scale The scale virtual void setScale(double scale) = 0; /// Gets the scale applied to all vectors /// \return The scale virtual double getScale() const = 0; /// Sets the size of point indicating the starting of vector /// \param size Size of starting point of a vector virtual void setPointSize(double size) = 0; /// Gets the size of starting point of a vector /// \return The size of starting point of a vector virtual double getPointSize() const = 0; }; }; // Graphics }; // SurgSim #endif // SURGSIM_GRAPHICS_VECTORFIELDREPRESENTATION_Hopensurgsim-0.7.0/SurgSim/Graphics/View.cpp000066400000000000000000000122031277777236100206610ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Graphics/View.h" #include "SurgSim/DataStructures/DataStructuresConvert.h" #include "SurgSim/Framework/Macros.h" #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Framework/Component.h" #include "SurgSim/Graphics/Camera.h" using SurgSim::Framework::Component; using SurgSim::Framework::checkAndConvert; namespace SurgSim { namespace Graphics { View::View(const std::string& name) : SurgSim::Framework::Component(name), m_stereoMode(STEREO_MODE_NONE), m_displayType(DISPLAY_TYPE_MONITOR), m_targetScreen(0), m_isFullscreen(false), m_eyeSeparation(0.06), m_screenDistance(1.0), m_screenWidth(0.0), m_screenHeight(0.0) { typedef std::array CoordinateType; typedef std::array DoubleType; SURGSIM_ADD_SERIALIZABLE_PROPERTY(View, CoordinateType, Position, getPosition, setPosition); SURGSIM_ADD_SERIALIZABLE_PROPERTY(View, CoordinateType, Dimensions, getDimensions, setDimensions); SURGSIM_ADD_SERIALIZABLE_PROPERTY(View, DoubleType, DimensionsDouble, getDimensionsDouble, setDimensionsDouble); SURGSIM_ADD_SERIALIZABLE_PROPERTY(View, std::shared_ptr, Camera, getCamera, setCamera); SURGSIM_ADD_SERIALIZABLE_PROPERTY(View, bool, WindowBorder, isWindowBorderEnabled, setWindowBorderEnabled); SURGSIM_ADD_SERIALIZABLE_PROPERTY(View, int, StereoMode, getStereoMode, setStereoMode); SURGSIM_ADD_SERIALIZABLE_PROPERTY(View, int, DisplayType, getDisplayType, setDisplayType); SURGSIM_ADD_SERIALIZABLE_PROPERTY(View, bool, FullScreen, isFullScreen, setFullScreen); SURGSIM_ADD_SERIALIZABLE_PROPERTY(View, int, TargetScreen, getTargetScreen, setTargetScreen); SURGSIM_ADD_SERIALIZABLE_PROPERTY(View, double, EyeSeparation, getEyeSeparation, setEyeSeparation); SURGSIM_ADD_SERIALIZABLE_PROPERTY(View, double, ScreenDistance, getScreenDistance, setScreenDistance); SURGSIM_ADD_SERIALIZABLE_PROPERTY(View, double, ScreenWidth, getScreenWidth, setScreenWidth); SURGSIM_ADD_SERIALIZABLE_PROPERTY(View, double, ScreenHeight, getScreenHeight, setScreenHeight); } void View::setCamera(std::shared_ptr camera) { if (m_camera != nullptr) { m_camera->setMainCamera(false); } m_camera = checkAndConvert(camera, "SurgSim::Graphics::Camera"); m_camera->setMainCamera(true); } std::shared_ptr View::getCamera() const { return m_camera; } bool View::doInitialize() { SURGSIM_ASSERT(m_camera != nullptr) << "View cannot be created without a camera."; return true; } bool View::isStereo() const { return m_stereoMode != STEREO_MODE_NONE; } void View::setStereoMode(int mode) { SURGSIM_ASSERT(!isAwake()) << "Can't change the view settings once the view has been woken up."; SURGSIM_ASSERT(mode < STEREO_MODE_COUNT) << "Invalid StereoMode " << mode; m_stereoMode = static_cast(mode); } int View::getStereoMode() const { return m_stereoMode; } void View::setDisplayType(int type) { SURGSIM_ASSERT(!isAwake()) << "Can't change the view settings once the view has been woken up."; SURGSIM_ASSERT(type < DISPLAY_TYPE_COUNT) << "Invalid DisplayType " << type; m_displayType = type; } int View::getDisplayType() const { return m_displayType; } void View::setFullScreen(bool val) { SURGSIM_ASSERT(!isAwake()) << "Can't change the view settings once the view has been woken up."; m_isFullscreen = val; } bool View::isFullScreen() const { return m_isFullscreen; } void View::setTargetScreen(int val) { SURGSIM_ASSERT(!isAwake()) << "Can't change the view settings once the view has been woken up."; m_targetScreen = doSetTargetScreen(val); } int View::getTargetScreen() const { return m_targetScreen; } void View::setScreenDistance(double val) { SURGSIM_ASSERT(!isAwake()) << "Can't change the view settings once the view has been woken up."; m_screenDistance = val; } double View::getScreenDistance() const { return m_screenDistance; } void View::setEyeSeparation(double val) { SURGSIM_ASSERT(!isAwake()) << "Can't change the view settings once the view has been woken up."; m_eyeSeparation = val; } double View::getEyeSeparation() const { return m_eyeSeparation; } double View::getScreenWidth() const { return m_screenWidth; } void View::setScreenWidth(double val) { SURGSIM_ASSERT(!isAwake()) << "Can't change the view settings once the view has been woken up."; m_screenWidth = val; } double View::getScreenHeight() const { return m_screenHeight; } void View::setScreenHeight(double val) { SURGSIM_ASSERT(!isAwake()) << "Can't change the view settings once the view has been woken up."; m_screenHeight = val; } } } opensurgsim-0.7.0/SurgSim/Graphics/View.h000066400000000000000000000171031277777236100203320ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_VIEW_H #define SURGSIM_GRAPHICS_VIEW_H #include "SurgSim/Framework/Component.h" #include "SurgSim/Math/Vector.h" #include #include namespace SurgSim { namespace Graphics { class Camera; /// Base graphics view class, which defines the basic interface for all graphics views. /// /// A Graphics::View provides a visualization of the scene to the user. /// /// A Graphics::Camera controls the viewpoint of this View. class View : public SurgSim::Framework::Component { public: /// Constructor /// \param name Name of the view explicit View(const std::string& name); enum StereoMode { STEREO_MODE_NONE = -1, STEREO_MODE_QUAD_BUFFER, STEREO_MODE_ANAGLYPHIC, STEREO_MODE_HORIZONTAL_SPLIT, STEREO_MODE_VERTICAL_SPLIT, STEREO_MODE_LEFT_EYE, STEREO_MODE_RIGHT_EYE, STEREO_MODE_HORIZONTAL_INTERLACE, STEREO_MODE_VERTICAL_INTERLACE, STEREO_MODE_CHECKERBOARD, STEREO_MODE_COUNT }; enum DisplayType { DISPLAY_TYPE_MONITOR, DISPLAY_TYPE_HMD, DISPLAY_TYPE_COUNT }; /// Set the position of this view /// \param position Position on the screen (in pixels) /// \return True if it succeeded, false if it failed virtual void setPosition(const std::array& position) = 0; /// Get the position of this view /// \return Position on the screen (in pixels) virtual std::array getPosition() const = 0; /// Set the dimensions of this view /// \param dimensions Dimensions on the screen (in pixels) virtual void setDimensions(const std::array& dimensions) = 0; /// Get the dimensions of this view /// \return Dimensions on the screen (in pixels) virtual std::array getDimensions() const = 0; /// Set the dimensions of this view in doubles /// \param dimensions Dimensions on the screen (in pixels) virtual void setDimensionsDouble(const std::array& dimensions) = 0; /// Get the dimensions of this view in doubles /// \return Dimensions on the screen (in pixels) virtual std::array getDimensionsDouble() const = 0; /// Sets whether the view window has a border /// \param enabled True to enable the border around the window; false for no border virtual void setWindowBorderEnabled(bool enabled) = 0; /// Returns whether the view window has a border /// \return True to enable the border around the window; false for no border virtual bool isWindowBorderEnabled() const = 0; /// Sets the camera which provides the viewpoint in the scene /// \param camera Camera whose image will be shown in this view /// \return True if it succeeded, false if it failed virtual void setCamera(std::shared_ptr camera); /// Gets the camera which provides the viewpoint in the scene /// \return camera Camera whose image will be shown in this view std::shared_ptr getCamera() const; /// Updates the view /// \param dt The time in seconds of the preceding timestep. virtual void update(double dt) = 0; /// \return true if the display is set to render a stereo view, or is currently rendering in stereo. virtual bool isStereo() const; /// Set the mode that this view should use for stereo display, see StereMode for all the modes. /// \throws SurgSim::Framework::AssertionFailure if used after initialize has been called. /// \param val The actual mode. virtual void setStereoMode(int val); /// \return What kind of stereo rendering is being used for this view. int getStereoMode() const; /// Set the kind of display. /// \throws SurgSim::Framework::AssertionFailure if used after initialize has been called /// \param type The type of display void setDisplayType(int type); /// \return The type of display that the view is on int getDisplayType() const; /// Request the display to use the whole screen. /// \throws SurgSim::Framework::AssertionFailure if used after initialize has been called. /// \param val If true the display will use up the whole screen, ignoring the dimension and location settings void setFullScreen(bool val); /// \return true if the display is set to use the whole screen, or is currently using the whole screen. bool isFullScreen() const; /// Request a certain screen to be used for this view. /// \throws SurgSim::Framework::AssertionFailure if used after initialize has been called. /// \param val The number of the screen (base 0) that should be used for this view. void setTargetScreen(int val); /// \return The number of the screen that this view is on. int getTargetScreen() const; /// Set the distance between the users eyes, this is necessary to calculate the correct projection matrices /// for stereo rendering. /// \throws SurgSim::Framework::AssertionFailure if used after initialize has been called. /// \note this is only used when rendering stereo. /// \param val The distance between the eyes in m. void setEyeSeparation(double val); /// \return The current distance between the eye points in m. double getEyeSeparation() const; /// Set the distance of the user from the screen, this is necessary to calculate the correct projection matrices /// for stereo rendering. /// \throws SurgSim::Framework::AssertionFailure if used after initialize has been called. /// \note this is only used when rendering stereo. /// \param val The distance from the user to the screen in m. void setScreenDistance(double val); /// \return The current distance from user to screen in m. double getScreenDistance() const; /// Set the width of the screen, this is necessary to calculate the correct projection matrices /// for stereo rendering. /// \throws SurgSim::Framework::AssertionFailure if used after initialize has been called. /// \note this is only used when rendering stereo. /// \param val The width of the screen used, in m. void setScreenWidth(double val); /// \return The currently used width of the screen in m. double getScreenWidth() const; /// Set the height of the screen, this is necessary to calculate the correct projection matrices /// for stereo rendering. /// \throws SurgSim::Framework::AssertionFailure if used after initialize has been called. /// \note this is only used when rendering stereo. /// \param val The height of the screen used, in m. void setScreenHeight(double val); /// \return The currently used height of the screen in m. double getScreenHeight() const; private: bool doInitialize() override; virtual int doSetTargetScreen(int val) = 0; /// Camera whose image will be shown in this view std::shared_ptr m_camera; int m_stereoMode; ///< The stereo mode, that is being used. int m_displayType; ///< The requested display type. int m_targetScreen; ///< Index of the screen to be used bool m_isFullscreen; ///< Whether to go fullscreen double m_eyeSeparation; ///< Distance between eypoints in m. double m_screenDistance; ///< Distance from user to screen in m. double m_screenWidth; ///< Width of screen in m. double m_screenHeight; ///< Height of screen in m. }; }; // namespace Graphics }; // namespace SurgSim #endif // SURGSIM_GRAPHICS_VIEW_H opensurgsim-0.7.0/SurgSim/Graphics/ViewElement.cpp000066400000000000000000000031501277777236100221740ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Graphics/ViewElement.h" #include "SurgSim/Graphics/Camera.h" #include "SurgSim/Graphics/View.h" namespace SurgSim { namespace Graphics { ViewElement::ViewElement(const std::string& name) : BasicSceneElement(name) { } ViewElement::~ViewElement() { } bool ViewElement::setView(std::shared_ptr view) { m_view = view; if (m_camera != nullptr) { m_view->setCamera(m_camera); } return true; } std::shared_ptr ViewElement::getView() { return m_view; } void ViewElement::setCamera(std::shared_ptr camera) { m_camera = camera; } std::shared_ptr ViewElement::getCamera() { return m_camera; } bool ViewElement::doInitialize() { SURGSIM_ASSERT(m_view != nullptr) << "ViewElements require a View"; SURGSIM_ASSERT(m_camera != nullptr) << "ViewElements require a Camera"; m_view->setCamera(m_camera); addComponent(m_view); addComponent(m_camera); return true; } }; // namespace Graphics }; // namespace SurgSimopensurgsim-0.7.0/SurgSim/Graphics/ViewElement.h000066400000000000000000000061751277777236100216530ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_GRAPHICS_VIEWELEMENT_H #define SURGSIM_GRAPHICS_VIEWELEMENT_H #include "SurgSim/Framework/BasicSceneElement.h" namespace SurgSim { namespace Input { class CommonDevice; } namespace Graphics { class Camera; class View; /// Basic SceneElement that wraps a View so that it can be added to the Scene. /// /// A Scene needs at least one Graphics::View component for any visualization of Graphics:Representation objects /// to be shown. A view needs a camera to do its' rendering, this component can connect all the pieces correctly. class ViewElement : public Framework::BasicSceneElement { public: /// Constructor /// \param name Name of the scene element explicit ViewElement(const std::string& name); /// Destructor virtual ~ViewElement(); /// Sets the view component that provides the visualization of the graphics representations /// \return True if setView() succeeds; Otherwise, false. virtual bool setView(std::shared_ptr view); /// Returns the view component that provides the visualization of the graphics representations /// \return A shared_ptr pointing to the View component std::shared_ptr getView(); /// Sets the camera for the view in this sceneelement /// \param camera The camera to be used with the view void setCamera(std::shared_ptr camera); /// Get the camera for the view in this sceneelement. /// \return The camera used in the view of this sceneelement. std::shared_ptr getCamera(); /// Return the keyboard to be used with this view. /// \return A keyboard device virtual std::shared_ptr getKeyboardDevice() = 0; /// Turn on/off the keyboard device to be used. /// \param val Indicate whether or not to use keyboard device virtual void enableKeyboardDevice(bool val) = 0; /// Return the mouse to be used with this view. /// \return A mouse device virtual std::shared_ptr getMouseDevice() = 0; /// Turn on/off the mouse device to be used. /// \param val Indicate whether or not to use mouse device virtual void enableMouseDevice(bool val) = 0; protected: /// Initializes the scene element /// \return True if it succeeds, false if it fails bool doInitialize() override; private: /// View component that provides the visualization of the graphics representations std::shared_ptr m_view; /// Camera component connected to the view std::shared_ptr m_camera; }; }; // namespace Graphics }; // namespace SurgSim #endif // SURGSIM_GRAPHICS_VIEWELEMENT_H opensurgsim-0.7.0/SurgSim/Input/000077500000000000000000000000001277777236100166045ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Input/CMakeLists.txt000066400000000000000000000025671277777236100213560ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2012-2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. set(SURGSIM_INPUT_SOURCES CombiningOutputComponent.cpp CommonDevice.cpp InputComponent.cpp InputManager.cpp OutputComponent.cpp ) set(SURGSIM_INPUT_HEADERS CombiningOutputComponent.h CommonDevice.h DeviceInterface.h InputComponent.h InputConsumerInterface.h InputManager.h OutputComponent.h OutputProducerInterface.h ) surgsim_create_library_header(Input.h "${SURGSIM_INPUT_HEADERS}") surgsim_add_library( SurgSimInput "${SURGSIM_INPUT_SOURCES}" "${SURGSIM_INPUT_HEADERS}" ) set(LIBS SurgSimFramework SurgSimDataStructures ) target_link_libraries(SurgSimInput ${LIBS} ) if(BUILD_TESTING) add_subdirectory(UnitTests) endif() # Put SurgSimInput into folder "Input" set_target_properties(SurgSimInput PROPERTIES FOLDER "Input") opensurgsim-0.7.0/SurgSim/Input/CombiningOutputComponent.cpp000066400000000000000000000115321277777236100243230ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Input/CombiningOutputComponent.h" #include #include #include "SurgSim/DataStructures/DataGroupBuilder.h" #include "SurgSim/Framework/FrameworkConvert.h" namespace { /// This functor accumulates the force and torque. No other data is passed along. /// This can be used to combine the forces and torques from multiple OutputComponents (e.g., from multiple /// VirtualToolCouplers) to drive a single haptic device. auto DEFAULT_FUNCTOR = [](const std::vector>& outputs, SurgSim::DataStructures::DataGroup *resultData) { bool result = false; SurgSim::Math::Vector3d cumulativeForce = SurgSim::Math::Vector3d::Zero(); SurgSim::Math::Vector3d cumulativeTorque = SurgSim::Math::Vector3d::Zero(); for (const auto& output : outputs) { if (output != nullptr) { SurgSim::DataStructures::DataGroup data; if (output->requestOutput("", &data)) { result = true; SurgSim::Math::Vector3d force; if (data.vectors().get(SurgSim::DataStructures::Names::FORCE, &force)) { cumulativeForce += force; } SurgSim::Math::Vector3d torque; if (data.vectors().get(SurgSim::DataStructures::Names::TORQUE, &torque)) { cumulativeTorque += torque; } } } } if (resultData->isEmpty()) { SurgSim::DataStructures::DataGroupBuilder builder; builder.addVector(SurgSim::DataStructures::Names::FORCE); builder.addVector(SurgSim::DataStructures::Names::TORQUE); *resultData = builder.createData(); } if (result && resultData->vectors().hasEntry(SurgSim::DataStructures::Names::FORCE)) { resultData->vectors().set(SurgSim::DataStructures::Names::FORCE, cumulativeForce); } if (result && resultData->vectors().hasEntry(SurgSim::DataStructures::Names::TORQUE)) { resultData->vectors().set(SurgSim::DataStructures::Names::TORQUE, cumulativeTorque); } return result; }; } namespace SurgSim { namespace Input { SURGSIM_REGISTER(SurgSim::Framework::Component, SurgSim::Input::CombiningOutputComponent, CombiningOutputComponent); CombiningOutputComponent::CombiningOutputComponent(const std::string& name) : SurgSim::Input::OutputComponent(name), m_combiner(DEFAULT_FUNCTOR) { SURGSIM_ADD_SERIALIZABLE_PROPERTY(CombiningOutputComponent, std::vector>, Outputs, getOutputs, setOutputs); } CombiningOutputComponent::~CombiningOutputComponent() { } void CombiningOutputComponent::setData(const SurgSim::DataStructures::DataGroup& dataGroup) { SURGSIM_FAILURE() << "Cannot setData on CombiningOutputComponent " << getFullName(); } std::vector> CombiningOutputComponent::getOutputs() const { std::vector> outputs; for (const auto& output : m_outputs) { auto shared = output.lock(); if (shared != nullptr) { outputs.push_back(shared); } } return outputs; } void CombiningOutputComponent::setOutputs(const std::vector>& outputs) { std::unordered_set> uniqueOutputs; m_outputs.clear(); for (const auto& component : outputs) { auto output = SurgSim::Framework::checkAndConvert(component, "SurgSim::Input::OutputComponent"); if (uniqueOutputs.insert(output).second) { m_outputs.push_back(output); } } } void CombiningOutputComponent::setCombiner(FunctorType combiner) { m_combiner = combiner; } bool CombiningOutputComponent::requestOutput(const std::string& device, SurgSim::DataStructures::DataGroup* outputData) { std::vector> shareds; { boost::lock_guard lock(m_mutex); std::vector>::const_iterator> stale; for (auto weak = m_outputs.cbegin(); weak != m_outputs.cend(); ++weak) { auto shared = weak->lock(); if (shared == nullptr) { stale.push_back(weak); } else { shareds.push_back(shared); } } std::reverse(stale.begin(), stale.end()); for (auto it : stale) { m_outputs.erase(it); } } return m_combiner(shareds, outputData); } }; // namespace Input }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Input/CombiningOutputComponent.h000066400000000000000000000061211277777236100237660ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_INPUT_COMBININGOUTPUTCOMPONENT_H #define SURGSIM_INPUT_COMBININGOUTPUTCOMPONENT_H #include #include #include #include #include #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/Input/OutputComponent.h" namespace SurgSim { namespace Input { SURGSIM_STATIC_REGISTRATION(CombiningOutputComponent); /// CombiningOutputComponents is-a OutputComponent that takes one or more OutputComponents and combines their /// datagroups into a single output datagroup. /// The combining functor can be set, with the default functor accumulating all vectors named "force", and all vectors /// named "torque". The resulting DataGroup has only those two specific entries, and can be used to drive a haptic /// device from multiple OutputComponents. class CombiningOutputComponent : public SurgSim::Input::OutputComponent { public: typedef std::function>&, SurgSim::DataStructures::DataGroup*)> FunctorType; /// Constructor /// \param name Name of this output component explicit CombiningOutputComponent(const std::string& name); /// Destructor virtual ~CombiningOutputComponent(); SURGSIM_CLASSNAME(SurgSim::Input::CombiningOutputComponent); void setData(const SurgSim::DataStructures::DataGroup& dataGroup) override; /// \return The OutputComponents that will be combined. std::vector> getOutputs() const; /// \param outputs The OutputComponents that will be combined. They should have their device names set to the /// empty string. void setOutputs(const std::vector>& outputs); /// Set the function to do the combining. /// The parameter is a function that receives all the OutputComponents and returns a DataGroup and a bool /// indicating success. void setCombiner(FunctorType combiner); bool requestOutput(const std::string& device, SurgSim::DataStructures::DataGroup* outputData) override; private: /// The OutputComponents that will be combined. std::vector> m_outputs; /// The function that takes the OutputComponents and returns a DataGroup and a bool that specifies whether /// it was successful. FunctorType m_combiner; /// The mutex that protects the outputs. boost::mutex m_mutex; }; }; // namespace Input }; // namespace SurgSim #endif opensurgsim-0.7.0/SurgSim/Input/CommonDevice.cpp000066400000000000000000000127221277777236100216640ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Input/CommonDevice.h" #include #include #include "SurgSim/Framework/Log.h" #include "SurgSim/Input/InputConsumerInterface.h" #include "SurgSim/Input/OutputProducerInterface.h" namespace SurgSim { namespace Input { CommonDevice::CommonDevice(const std::string& name) : m_name(name), m_nameForCallback(name), m_inputData(DataStructures::DataGroup()) { } CommonDevice::CommonDevice(const std::string& name, const DataStructures::DataGroup& inputData) : m_name(name), m_nameForCallback(name), m_inputData(inputData) { } CommonDevice::CommonDevice(const std::string& name, DataStructures::DataGroup&& inputData) : m_name(name), m_nameForCallback(name), m_inputData(std::move(inputData)) { } CommonDevice::~CommonDevice() { clearInputConsumers(); clearOutputProducer(); } std::string CommonDevice::getName() const { return m_name; } std::string CommonDevice::getClassName() const { SURGSIM_LOG_WARNING(Framework::Logger::getDefaultLogger()) << "getClassName() called on CommonDevice base class, this is wrong in almost all cases," << " this means there is a class that does not have getClassName() defined."; return "SurgSim::Devices::CommonDevice"; } void CommonDevice::setNameForCallback(const std::string& name) { m_nameForCallback = name; } std::string CommonDevice::getNameForCallback() const { return m_nameForCallback; } bool CommonDevice::addInputConsumer(std::shared_ptr inputConsumer) { if (inputConsumer == nullptr) { return false; } boost::lock_guard lock(m_consumerProducerMutex); for (const auto& input : m_inputConsumerList) { if (input.lock() == inputConsumer) { return false; } } // NB: callbacks are called with the local m_nameForCallback. // This allows e.g. filters to call their callbacks with a name different from their "real" name. inputConsumer->initializeInput(m_nameForCallback, m_inputData); m_inputConsumerList.emplace_back(std::move(inputConsumer)); return true; } bool CommonDevice::removeInputConsumer(std::shared_ptr inputConsumer) { if (inputConsumer == nullptr) { return false; } boost::lock_guard lock(m_consumerProducerMutex); for (auto it = m_inputConsumerList.begin(); it != m_inputConsumerList.end(); ++it) { if (it->lock() == inputConsumer) { m_inputConsumerList.erase(it); // The iterator is now invalid. return true; } } return false; } void CommonDevice::clearInputConsumers() { boost::lock_guard lock(m_consumerProducerMutex); m_inputConsumerList.clear(); } bool CommonDevice::setOutputProducer(std::shared_ptr outputProducer) { if (outputProducer == nullptr) { return false; } boost::lock_guard lock(m_consumerProducerMutex); if (m_outputProducer.lock() == outputProducer) { return false; } m_outputProducer = std::move(outputProducer); return true; } bool CommonDevice::removeOutputProducer(std::shared_ptr outputProducer) { if (! outputProducer) { return false; } boost::lock_guard lock(m_consumerProducerMutex); if (m_outputProducer.lock() == outputProducer) { m_outputProducer.reset(); return true; } return false; } void CommonDevice::clearOutputProducer() { boost::lock_guard lock(m_consumerProducerMutex); m_outputProducer.reset(); } bool CommonDevice::hasOutputProducer() { return (m_outputProducer.lock() != nullptr); } void CommonDevice::pushInput() { boost::lock_guard lock(m_consumerProducerMutex); for (auto it = m_inputConsumerList.begin(); it != m_inputConsumerList.end(); ++it) { // NB: callbacks are called with the local m_nameForCallback. // This allows e.g. filters to call their callbacks with a name different from their "real" name. auto inputConsumer = it->lock(); if (inputConsumer != nullptr) { inputConsumer->handleInput(m_nameForCallback, m_inputData); } } } bool CommonDevice::pullOutput() { boost::lock_guard lock(m_consumerProducerMutex); auto outputProducer = m_outputProducer.lock(); if (outputProducer != nullptr) { // NB: callbacks are called with the local m_nameForCallback. // This allows e.g. filters to call their callbacks with a name different from their "real" name. bool gotOutput = outputProducer->requestOutput(m_nameForCallback, &m_outputData); if (gotOutput) { return true; } // If we're here, then the producer has refused to provide output. } // If we haven't received an update, the old data is meaningless. m_outputData.resetAll(); return false; } DataStructures::DataGroup& CommonDevice::getInputData() { return m_inputData; } const DataStructures::DataGroup& CommonDevice::getOutputData() const { return m_outputData; } }; // namespace Input }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Input/CommonDevice.h000066400000000000000000000121711277777236100213270ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_INPUT_COMMONDEVICE_H #define SURGSIM_INPUT_COMMONDEVICE_H #include #include #include "SurgSim/Input/DeviceInterface.h" #include "SurgSim/DataStructures/DataGroup.h" namespace SurgSim { namespace Input { class InputConsumerInterface; class OutputProducerInterface; /// A class that implements some common management code on top of the DeviceInterface. /// Practically every class that implements DeviceInterface will likely want to inherit from CommonDevice. class CommonDevice : public DeviceInterface { public: /// Constructor. Sets the input data to an empty DataGroup. /// \param name The name associated with the input device. explicit CommonDevice(const std::string& name); /// Constructor. /// /// \param name The name associated with the input device. /// \param inputData An initial value for the application's input from the device (e.g. pose etc). /// The concrete device implementation should pass in a DataGroup whose contents has been set up, e.g. by /// using a DataGroupBuilder, to that device's supported values that it will push to the application. CommonDevice(const std::string& name, const DataStructures::DataGroup& inputData); /// Constructor. /// /// \param name The name associated with the input device. /// \param inputData An initial value for the application's input from the device (e.g. pose etc). /// The concrete device implementation should pass in a DataGroup whose contents has been set up, e.g. by /// using a DataGroupBuilder, to that device's supported values that it will push to the application. CommonDevice(const std::string& name, DataStructures::DataGroup&& inputData); /// Destructor. virtual ~CommonDevice(); std::string getName() const override; std::string getClassName() const override; /// Set the name used for calling the input consumers and output producer. /// By default, this will be the same as the name of the device that was passed to the constructor. /// \param name The name to be used. void setNameForCallback(const std::string& name); /// Get the name used for calling the input consumers and output producer. /// By default, this will be the same as the name of the device that was passed to the constructor. /// \return The name being used. std::string getNameForCallback() const; bool addInputConsumer(std::shared_ptr inputConsumer) override; bool removeInputConsumer(std::shared_ptr inputConsumer) override; void clearInputConsumers() override; bool setOutputProducer(std::shared_ptr outputProducer) override; bool removeOutputProducer(std::shared_ptr outputProducer) override; bool hasOutputProducer() override; void clearOutputProducer() override; protected: /// Push application input to consumers. virtual void pushInput(); /// Pull application output from a producer. virtual bool pullOutput(); /// Getter for the input data \ref SurgSim::DataStructures::DataGroup "DataGroup". This function is typically /// called by friend scaffolds, to get a DataGroup they can modify then set back to the device to send to the /// device's input consumers. /// \return A reference to the input data. DataStructures::DataGroup& getInputData(); /// Getter for the output data \ref SurgSim::DataStructures::DataGroup "DataGroup". This function is typically /// called by friend scaffolds, to get the data that the output producer wants to send to the device (and then send /// that data through the device's SDK). Note that a writable variant is not provided, an output producer registered /// via \ref setOutputProducer will set the output data. /// \return A reference to the output data. const DataStructures::DataGroup& getOutputData() const; private: struct State; const std::string m_name; /// The name used for the callbacks, defaults to the device name. std::string m_nameForCallback; /// The data the device is providing to its input consumers. DataStructures::DataGroup m_inputData; /// The data the output producer (if any) is providing to the device. DataStructures::DataGroup m_outputData; /// The list of input consumers. std::vector> m_inputConsumerList; /// The output producer, if any. std::weak_ptr m_outputProducer; /// The mutex that protects the consumers and the producer. boost::mutex m_consumerProducerMutex; }; }; // namespace Input }; // namespace SurgSim #endif // SURGSIM_INPUT_COMMONDEVICE_H opensurgsim-0.7.0/SurgSim/Input/DeviceInterface.h000066400000000000000000000076511277777236100220060ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_INPUT_DEVICEINTERFACE_H #define SURGSIM_INPUT_DEVICEINTERFACE_H #include #include #include "SurgSim/Input/InputConsumerInterface.h" #include "SurgSim/Input/OutputProducerInterface.h" #include "SurgSim/Framework/Accessible.h" #include "SurgSim/Framework/ObjectFactory.h" namespace SurgSim { namespace Input { /// Interface used to communicate with user-interface hardware devices. /// /// Classes that implement communication with a hardware device implement this interface. This includes /// input/output devices (haptic devices are the most obvious example, but many other devices can, for example, /// display visual indicators such as LEDs, etc.), as well as input-only and output-only devices. /// /// Derived classes will likely want to hide their constructor and only /// allow creation through a manager object for that type of device. class DeviceInterface : public Framework::Accessible, public Framework::FactoryBase1 { public: /// Virtual destructor (empty). virtual ~DeviceInterface() { } /// Return a (hopefully unique) device name. virtual std::string getName() const = 0; /// The class name for this class /// \note Use the SURGSIM_CLASSNAME macro in derived classes. /// \return The fully namespace qualified name of this class. virtual std::string getClassName() const = 0; /// Fully initialize the device. /// /// When the manager object creates the device, the internal state of the device usually isn't fully /// initialized yet. This method performs any needed initialization. virtual bool initialize() = 0; /// \return true if the device has been initialized and has not yet been finalized. virtual bool isInitialized() const = 0; /// Adds an input consumer that will be notified when the application input state is updated. /// /// \param inputConsumer The input consumer to be added. /// \return true on success, false on failure. virtual bool addInputConsumer(std::shared_ptr inputConsumer) = 0; /// Removes an input consumer previously added via \ref addInputConsumer. /// \param inputConsumer The input consumer to be removed. virtual bool removeInputConsumer(std::shared_ptr inputConsumer) = 0; /// Removes all InputConsumers. virtual void clearInputConsumers() = 0; /// Sets an output producer that will be asked for application output state when the device needs it. /// Any previously set output producer will be removed. /// /// \param outputProducer The output producer to be added. /// \return true on success, false on failure. virtual bool setOutputProducer(std::shared_ptr outputProducer) = 0; /// Removes an output producer previously added via \ref setOutputProducer. /// \param outputProducer The output producer to be removed. virtual bool removeOutputProducer(std::shared_ptr outputProducer) = 0; /// Query if this object has output producer. /// \return true if there is an output producer, false if not. virtual bool hasOutputProducer() = 0; /// Removes any OutputProducer virtual void clearOutputProducer() = 0; private: /// Finalize (de-initialize) the device. virtual bool finalize() = 0; }; }; // namespace Input }; // namespace SurgSim #endif // SURGSIM_INPUT_DEVICEINTERFACE_H opensurgsim-0.7.0/SurgSim/Input/InputComponent.cpp000066400000000000000000000036701277777236100223000ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Input/InputComponent.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Input/DeviceInterface.h" namespace SurgSim { namespace Input { SURGSIM_REGISTER(SurgSim::Framework::Component, SurgSim::Input::InputComponent, InputComponent); InputComponent::InputComponent(const std::string& name) : Representation(name), m_hasInput(false) { SURGSIM_ADD_SERIALIZABLE_PROPERTY(InputComponent, std::string, DeviceName, getDeviceName, setDeviceName); } InputComponent::~InputComponent() { } void InputComponent::setDeviceName(const std::string& deviceName) { m_deviceName = deviceName; } std::string InputComponent::getDeviceName() const { return m_deviceName; } void InputComponent::getData(SurgSim::DataStructures::DataGroup* dataGroup) { if (m_hasInput) { m_lastInput.get(dataGroup); } } bool InputComponent::doInitialize() { return true; } bool InputComponent::doWakeUp() { return true; } void InputComponent::initializeInput(const std::string& device, const SurgSim::DataStructures::DataGroup& initialData) { m_hasInput = true; m_lastInput.set(initialData); } void InputComponent::handleInput(const std::string& device, const SurgSim::DataStructures::DataGroup& inputData) { m_hasInput = true; m_lastInput.set(inputData); } }; // namespace Input }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Input/InputComponent.h000066400000000000000000000052061277777236100217420ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_INPUT_INPUTCOMPONENT_H #define SURGSIM_INPUT_INPUTCOMPONENT_H #include #include #include #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/Framework/LockedContainer.h" #include "SurgSim/Framework/Representation.h" #include "SurgSim/Input/InputConsumerInterface.h" namespace SurgSim { namespace Input { class DeviceInterface; SURGSIM_STATIC_REGISTRATION(InputComponent); /// InputComponents connect devices to SceneElements, facilitating data transfer /// from a device to SceneElements and other Components. class InputComponent : public SurgSim::Framework::Representation, public InputConsumerInterface { public: /// Constructor /// \param name Name of this input component explicit InputComponent(const std::string& name); /// Destructor virtual ~InputComponent(); SURGSIM_CLASSNAME(SurgSim::Input::InputComponent); /// Set name of the device this input component connects to. /// \param deviceName Name of the device this input component connects void setDeviceName(const std::string& deviceName); /// Gets device name. /// \return The device name. std::string getDeviceName() const; /// Gets the input data. /// \param [out] dataGroup The location to write the data. The pointer must be non-null. /// \exception Asserts if the InputComponent is not connected to a device. void getData(SurgSim::DataStructures::DataGroup* dataGroup); bool doInitialize() override; bool doWakeUp() override; void initializeInput(const std::string& device, const SurgSim::DataStructures::DataGroup& initialData) override; void handleInput(const std::string& device, const SurgSim::DataStructures::DataGroup& inputData) override; private: /// Name of the device to which this input component connects std::string m_deviceName; /// Thread safe container of most recent input data SurgSim::Framework::LockedContainer m_lastInput; std::atomic m_hasInput; }; }; // namespace Input }; // namespace SurgSim #endif opensurgsim-0.7.0/SurgSim/Input/InputConsumerInterface.h000066400000000000000000000067341277777236100234230ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_INPUT_INPUTCONSUMERINTERFACE_H #define SURGSIM_INPUT_INPUTCONSUMERINTERFACE_H #include namespace SurgSim { namespace DataStructures { class DataGroup; }; // namespace DataStructures namespace Input { /// Interface for a consumer that monitors device and signal state updates (pose, buttons, etc). class InputConsumerInterface { public: /// Virtual destructor (empty). virtual ~InputConsumerInterface() { } /// Notifies the consumer that the application input coming from the device has been updated. /// /// Typical input data contents (but note that individual devices may do things differently): /// | type | name | | /// | ---- | ---- | --- | /// | pose | "pose" | %Device pose (units are meters). | /// | bool | "button1" | State of the first device button. | /// | bool | "button2" | State of the second device button (and so on). | /// /// Other possible contents includes: /// | type | name | | /// | ---- | ---- | | /// | bool | "isHomed" | %Device homing status. | /// | bool | "isHomedX" | Individual homing status for the X axis (and so on). | /// | bool | "isHeld" | Safety sensor etc. status. | /// | string | "model" | %Device model description. | /// | string | "serial" | Serial number string. | /// | (any) | "debug:*" | Various debugging information | /// /// \param device The name of the device that is producing the input. This should only be used to identify /// the device (e.g. if the consumer is listening to several devices at once). /// \param inputData The application input state coming from the device. virtual void handleInput(const std::string& device, const SurgSim::DataStructures::DataGroup& inputData) = 0; /// Set the initial input data group. /// \param device The name of the device that is producing the input. This should only be used to identify /// the device (e.g. if the consumer is listening to several devices at once). /// \param inputData The application input state coming from the device. virtual void initializeInput(const std::string& device, const SurgSim::DataStructures::DataGroup& inputData) = 0; }; }; // namespace Input }; // namespace SurgSim #endif // SURGSIM_INPUT_INPUTCONSUMERINTERFACE_H opensurgsim-0.7.0/SurgSim/Input/InputManager.cpp000066400000000000000000000130531277777236100217040ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Input/InputManager.h" #include "SurgSim/Framework/Component.h" #include "SurgSim/Input/DeviceInterface.h" #include "SurgSim/Input/InputComponent.h" #include "SurgSim/Input/OutputComponent.h" namespace SurgSim { namespace Input { InputManager::InputManager() : ComponentManager("Input Manager") { } InputManager::~InputManager() { } bool InputManager::doInitialize() { return true; } bool InputManager::doStartUp() { return true; } bool InputManager::doUpdate(double dt) { processBehaviors(dt); processComponents(); return true; } void InputManager::doBeforeStop() { retireComponents(m_inputs); retireComponents(m_outputs); ComponentManager::doBeforeStop(); } bool InputManager::executeAdditions(const std::shared_ptr& component) { auto input = tryAddComponent(component, &m_inputs); if (input != nullptr) { boost::lock_guard lock(m_mutex); addInputComponent(input); return true; } auto output = tryAddComponent(component, &m_outputs); if (output != nullptr) { boost::lock_guard lock(m_mutex); addOutputComponent(output); return true; } // If we got he the component was neither an Input nor and OutputComponent, no add was performed // return false return false; } bool InputManager::executeRemovals(const std::shared_ptr& component) { bool result = false; boost::lock_guard lock(m_mutex); if (tryRemoveComponent(component, &m_inputs)) { auto input = std::static_pointer_cast(component); DeviceInterface* device = nullptr; if (tryFindDevice(input->getDeviceName(), &device)) { device->removeInputConsumer(input); } result = true; } else if (tryRemoveComponent(component, &m_outputs)) { auto output = std::dynamic_pointer_cast(component); DeviceInterface* device = nullptr; if (tryFindDevice(output->getDeviceName(), &device)) { device->removeOutputProducer(output); } result = true; } return result; } bool InputManager::addInputComponent(const std::shared_ptr& input) { bool result = false; DeviceInterface* device = nullptr; if (tryFindDevice(input->getDeviceName(), &device)) { device->addInputConsumer(input); SURGSIM_LOG_INFO(m_logger) << "Added input component " << input->getFullName() << " connected to device " << input->getDeviceName(); result = true; } else { SURGSIM_LOG_CRITICAL(m_logger) << " Could not find Device named '" << input->getDeviceName() << "' when adding input component named '" << input->getFullName() << "'."; } return result; } bool InputManager::addOutputComponent(const std::shared_ptr& output) { bool result = false; const auto outputName = output->getFullName(); const auto deviceName = output->getDeviceName(); DeviceInterface* device = nullptr; if (tryFindDevice(deviceName, &device)) { if (device->hasOutputProducer()) { SURGSIM_LOG_WARNING(m_logger) << "Trying to add OutputProducer " << outputName << " to device " << deviceName << ", but the device already has an OutputProducer assigned, this add will be ignored!"; } else { device->setOutputProducer(output); SURGSIM_LOG_INFO(m_logger) << "Added output component " << outputName << " connected to device " << deviceName; result = true; } } else { SURGSIM_LOG_CRITICAL(m_logger) << "Could not find Device with name " << deviceName << " when adding output component " << outputName; } return result; } bool InputManager::addDevice(std::shared_ptr device) { bool result = false; boost::lock_guard lock(m_mutex); DeviceInterface* foundDevice = nullptr; const auto& deviceName = device->getName(); if (deviceName == "") { SURGSIM_LOG_WARNING(m_logger) << "Cannot add a device that has an empty name."; } else if (tryFindDevice(deviceName, &foundDevice)) { SURGSIM_LOG_WARNING(m_logger) << "Device " << deviceName << " is already available in Input Manager"; } else { m_devices[deviceName] = device; SURGSIM_LOG_INFO(m_logger) << "Added device " << deviceName; result = true; } return result; } bool InputManager::removeDevice(std::shared_ptr device) { bool result = false; boost::lock_guard lock(m_mutex); auto it = m_devices.find(device->getName()); if (it != m_devices.end()) { m_devices.erase(it); SURGSIM_LOG_DEBUG(m_logger) << "Removed device " << device->getName(); result = true; } else { SURGSIM_LOG_DEBUG(m_logger) << "Failed to find device to remove, " << device->getName(); } return result; } int InputManager::getType() const { return SurgSim::Framework::MANAGER_TYPE_INPUT; } bool InputManager::tryFindDevice(const std::string& name, DeviceInterface** device) { auto found = m_devices.find(name); if (found != m_devices.end()) { *device = found->second.get(); return true; } return false; } } // Input } // SurgSim opensurgsim-0.7.0/SurgSim/Input/InputManager.h000066400000000000000000000101311277777236100213430ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_INPUT_INPUTMANAGER_H #define SURGSIM_INPUT_INPUTMANAGER_H #include #include #include #include #include "SurgSim/Framework/ComponentManager.h" namespace SurgSim { namespace Input { class DeviceInterface; class InputComponent; class OutputComponent; /// Manager to handle InputComponent and OutputComponent, SceneElement can add these to /// get input from devices, or even write output to devices. The devices have to be added /// to this class before components can be added to it. class InputManager : public SurgSim::Framework::ComponentManager { public: InputManager(); virtual ~InputManager(); friend class InputManagerTest; /// Adds a device to the manager. /// \param device The device. /// \return true if it succeeds, false if the device already exists in the manager. bool addDevice(std::shared_ptr device); /// Removes the device described by device. /// \param device The device. /// \return true if it succeeds, false if the device is not in. bool removeDevice(std::shared_ptr device); int getType() const override; private: bool doInitialize() override; bool doStartUp() override; bool doUpdate(double dt) override; void doBeforeStop() override; /// Adds a component, this can be either input or output, it will call the appropriate /// function in the device. For an InputComonent this will succeed if the device name /// inside the component is known to the InputManager and if the component has not /// been added as an input yet. For an OutputComponent the call will fail if the device /// does not exist or the device has already been assigned an output. /// \param component The component. /// \return true if it succeeds, it will fail if the device cannot be found to the component /// has already been added to the manager, and return false. bool executeAdditions(const std::shared_ptr& component) override; /// Removes the component described by component. /// \param component The component. /// \return true if it succeeds, it will fail if the component cannot be found and return false. bool executeRemovals(const std::shared_ptr& component) override; /// Specific call for input components. /// Link input consumer to input device /// Data produced by device will then be consumed by input consumer bool addInputComponent(const std::shared_ptr& input); /// Specific call for output components. bool addOutputComponent(const std::shared_ptr& output); /// Returns a device with the given name, if one is available. /// \param name The name of the device. /// \param device [out] The device. Unchanged if the return value is false. /// \return true if the device was found. bool tryFindDevice(const std::string& name, DeviceInterface** device); /// Collection of all input components. std::vector> m_inputs; /// Collection of all output components. std::vector> m_outputs; /// Collection of all devices that have been added to the input manager /// key is the name, no two devices with the same name can be added to the /// input manager std::unordered_map> m_devices; /// Protect critical sections boost::mutex m_mutex; }; }; //namespace Input }; //namespace SurgSim #endif opensurgsim-0.7.0/SurgSim/Input/OutputComponent.cpp000066400000000000000000000040631277777236100224760ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Input/OutputComponent.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Input/DeviceInterface.h" namespace SurgSim { namespace Input { SURGSIM_REGISTER(SurgSim::Framework::Component, SurgSim::Input::OutputComponent, OutputComponent); OutputComponent::OutputComponent(const std::string& name) : Representation(name), m_deviceName(), m_haveData(false) { SURGSIM_ADD_SERIALIZABLE_PROPERTY(OutputComponent, std::string, DeviceName, getDeviceName, setDeviceName); } OutputComponent::~OutputComponent() { } void OutputComponent::setDeviceName(const std::string& deviceName) { SURGSIM_ASSERT(!isInitialized()) << "Cannot call OutputComponent::setDeviceName after initialization of " << getFullName(); m_deviceName = deviceName; } void OutputComponent::setData(const SurgSim::DataStructures::DataGroup& dataGroup) { m_lastOutput.set(dataGroup); m_haveData = true; } bool OutputComponent::doInitialize() { return true; } bool OutputComponent::doWakeUp() { return true; } std::string OutputComponent::getDeviceName() const { return m_deviceName; } bool OutputComponent::requestOutput(const std::string& device, SurgSim::DataStructures::DataGroup* outputData) { bool result = false; if (m_haveData && (outputData != nullptr)) { m_lastOutput.get(outputData); // cannot get() until after the first call to setData result = true; } return result; } }; // namespace Input }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Input/OutputComponent.h000066400000000000000000000047631277777236100221520ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_INPUT_OUTPUTCOMPONENT_H #define SURGSIM_INPUT_OUTPUTCOMPONENT_H #include #include #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/Framework/LockedContainer.h" #include "SurgSim/Framework/Representation.h" #include "SurgSim/Input/OutputProducerInterface.h" namespace SurgSim { namespace Input { class DeviceInterface; SURGSIM_STATIC_REGISTRATION(OutputComponent); /// OutputComponents connect SceneElements to devices, facilitating data /// transfer from a SceneElement to a device. class OutputComponent : public SurgSim::Framework::Representation, public OutputProducerInterface { public: /// Constructor /// \param name Name of this output component explicit OutputComponent(const std::string& name); /// Destructor virtual ~OutputComponent(); SURGSIM_CLASSNAME(SurgSim::Input::OutputComponent); /// Set name of the device of output component. /// \param deviceName The name of the device that will receive the output data. void setDeviceName(const std::string& deviceName); /// Gets device name. /// \return The device name. std::string getDeviceName() const; /// Sets the output data. /// \param dataGroup The data to output. virtual void setData(const SurgSim::DataStructures::DataGroup& dataGroup); /// Overridden from Component, do nothing virtual bool doInitialize(); /// Overridden from Component, do nothing virtual bool doWakeUp(); bool requestOutput(const std::string& device, SurgSim::DataStructures::DataGroup* outputData) override; private: /// Name of the device to which this output component connects std::string m_deviceName; /// Thread safe container of most recent output data SurgSim::Framework::LockedContainer m_lastOutput; /// True if there is data available bool m_haveData; }; }; // namespace Input }; // namespace SurgSim #endif opensurgsim-0.7.0/SurgSim/Input/OutputProducerInterface.h000066400000000000000000000060471277777236100236110ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_INPUT_OUTPUTPRODUCERINTERFACE_H #define SURGSIM_INPUT_OUTPUTPRODUCERINTERFACE_H #include namespace SurgSim { namespace DataStructures { class DataGroup; }; // namespace DataStructures namespace Input { /// Interface for a producer that generates device output updates (forces, status LED state, etc). class OutputProducerInterface { public: /// Virtual destructor (empty). virtual ~OutputProducerInterface() { } /// Asks the producer to provide output state to the device. /// /// Note that devices may never call this method, e.g. because the device doesn't actually have any /// output capability. /// /// Typical output data contents (but note that individual devices may do things differently): /// | type | name | | /// | ---- | ---- | --- | /// | vector | "force" | Commanded force for the device (units are newtons). | /// | vector | "torque" | Commanded torque for the device (units are newton-meters). | /// | bool | "isEnabled" | Safety switch input. | /// /// Other possible contents includes: /// | type | name | | /// | ---- | ---- | --- | /// | bool | "led0" | Desired state for LED 0. | /// | bool | "led1" | Desired state for LED 1. | /// | string | "toolId" | Calibration ID to use, e.g. for camera devices. | /// /// \param device The name of the device that is requesting the output. This should only be used to identify /// the device (e.g. if the producer is listening to several devices at once). /// \param [out] outputData The application output state being fed into the device. /// /// \return true if the producer has provided some output, false if it refuses to do so. A producer /// that returns false should leave outputData unmodified. virtual bool requestOutput(const std::string& device, SurgSim::DataStructures::DataGroup* outputData) = 0; }; }; // namespace Input }; // namespace SurgSim #endif // SURGSIM_INPUT_OUTPUTPRODUCERINTERFACE_H opensurgsim-0.7.0/SurgSim/Input/UnitTests/000077500000000000000000000000001277777236100205465ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Input/UnitTests/CMakeLists.txt000066400000000000000000000023561277777236100233140ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2012-2016, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. include_directories( ${gtest_SOURCE_DIR}/include ) set(UNIT_TEST_SOURCES CombiningOutputComponentTest.cpp CommonDeviceTests.cpp InputComponentTest.cpp InputManagerTest.cpp OutputComponentTest.cpp TestDevice.cpp ) set(UNIT_TEST_HEADERS TestDevice.h ) set(LIBS IdentityPoseDevice SurgSimInput ) surgsim_add_unit_tests(SurgSimInputTest) set_target_properties(SurgSimInputTest PROPERTIES FOLDER "Input") file(COPY Data DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) # Configure the path for the data files configure_file( "${CMAKE_CURRENT_SOURCE_DIR}/config.txt.in" "${CMAKE_CURRENT_BINARY_DIR}/config.txt" ) opensurgsim-0.7.0/SurgSim/Input/UnitTests/CombiningOutputComponentTest.cpp000066400000000000000000000263011277777236100271250ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the CombiningOutputComponent class. #include #include #include #include #include #include #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/DataStructures/DataGroupBuilder.h" #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Framework/Scene.h" #include "SurgSim/Framework/SceneElement.h" #include "SurgSim/Input/CombiningOutputComponent.h" #include "SurgSim/Input/CommonDevice.h" #include "SurgSim/Input/InputManager.h" #include "SurgSim/Input/OutputComponent.h" #include "SurgSim/Math/Vector.h" namespace { const double ERROR_EPSILON = 1e-7; auto DO_NOTHING_FUNCTOR = [](const std::vector>&, SurgSim::DataStructures::DataGroup*) { return false; }; /// Device that exposes pullOutput and getOutputData. class MockDevice : public SurgSim::Input::CommonDevice { public: explicit MockDevice(const std::string& name) : SurgSim::Input::CommonDevice(name) { } ~MockDevice() { } using CommonDevice::pullOutput; using CommonDevice::getOutputData; bool initialize() override { return true; } bool isInitialized() const override { return true; } bool finalize() override { return true; } }; }; TEST(CombiningOutputComponentTest, NoOutputs) { auto combiningOutputComponent = std::make_shared("combiner"); auto mockDevice = std::make_shared("device"); mockDevice->setOutputProducer(combiningOutputComponent); EXPECT_FALSE(mockDevice->pullOutput()); } TEST(CombiningOutputComponentTest, DuplicateOutputs) { auto combiningOutputComponent = std::make_shared("combiner"); auto mockDevice = std::make_shared("device"); mockDevice->setOutputProducer(combiningOutputComponent); std::vector> outputs; auto output1 = std::make_shared("output1"); auto output2 = std::make_shared("output2"); outputs.push_back(output1); outputs.push_back(output2); outputs.push_back(output1); outputs.push_back(output2); outputs.push_back(output2); combiningOutputComponent->setOutputs(outputs); auto storedOutputs = combiningOutputComponent->getOutputs(); ASSERT_EQ(2, storedOutputs.size()); EXPECT_EQ(output1, storedOutputs[0]); EXPECT_EQ(output2, storedOutputs[1]); } TEST(CombiningOutputComponentTest, EmptyOutputs) { auto combiningOutputComponent = std::make_shared("combiner"); auto mockDevice = std::make_shared("device"); mockDevice->setOutputProducer(combiningOutputComponent); std::vector> outputs; outputs.push_back(std::make_shared("output1")); outputs.push_back(std::make_shared("output2")); combiningOutputComponent->setOutputs(outputs); ASSERT_EQ(outputs, combiningOutputComponent->getOutputs()); EXPECT_FALSE(mockDevice->pullOutput()); } TEST(CombiningOutputComponentTest, OneNonEmptyOutput) { auto combiningOutputComponent = std::make_shared("combiner"); auto mockDevice = std::make_shared("device"); mockDevice->setOutputProducer(combiningOutputComponent); std::vector> outputs; auto output = std::make_shared("output1"); outputs.push_back(output); combiningOutputComponent->setOutputs(outputs); SurgSim::DataStructures::DataGroupBuilder builder; builder.addVector(SurgSim::DataStructures::Names::FORCE); builder.addBoolean("extraData"); SurgSim::DataStructures::DataGroup data = builder.createData(); auto initialForce = SurgSim::Math::Vector3d(0.89, 0.0, -324.67); data.vectors().set(SurgSim::DataStructures::Names::FORCE, initialForce); data.booleans().set("extraData", true); output->setData(data); ASSERT_TRUE(mockDevice->pullOutput()); SurgSim::DataStructures::DataGroup actualData = mockDevice->getOutputData(); ASSERT_FALSE(actualData.isEmpty()); SurgSim::Math::Vector3d actualForce; ASSERT_TRUE(actualData.vectors().get(SurgSim::DataStructures::Names::FORCE, &actualForce)); EXPECT_TRUE(actualForce.isApprox(initialForce)); EXPECT_FALSE(actualData.booleans().hasEntry("extraData")); EXPECT_ANY_THROW(combiningOutputComponent->setData(data)); } TEST(CombiningOutputComponentTest, SetCombiner) { auto combiningOutputComponent = std::make_shared("combiner"); combiningOutputComponent->setCombiner(DO_NOTHING_FUNCTOR); auto mockDevice = std::make_shared("device"); mockDevice->setOutputProducer(combiningOutputComponent); std::vector> outputs; auto output1 = std::make_shared("output1"); outputs.push_back(output1); auto output2 = std::make_shared("output2"); outputs.push_back(output2); auto output3 = std::make_shared("output3"); outputs.push_back(output3); combiningOutputComponent->setOutputs(outputs); SurgSim::DataStructures::DataGroupBuilder builder; builder.addVector(SurgSim::DataStructures::Names::FORCE); SurgSim::DataStructures::DataGroup data = builder.createData(); auto initialForce = SurgSim::Math::Vector3d(0.89, 0.0, -324.67); data.vectors().set(SurgSim::DataStructures::Names::FORCE, initialForce); output1->setData(data); output3->setData(data); EXPECT_FALSE(mockDevice->pullOutput()); } TEST(CombiningOutputComponentTest, MultipleOutputs) { auto combiningOutputComponent = std::make_shared("combiner"); auto mockDevice = std::make_shared("device"); mockDevice->setOutputProducer(combiningOutputComponent); std::vector> outputs; auto output1 = std::make_shared("output1"); outputs.push_back(output1); auto output2 = std::make_shared("output2"); outputs.push_back(output2); auto output3 = std::make_shared("output3"); outputs.push_back(output3); combiningOutputComponent->setOutputs(outputs); SurgSim::DataStructures::DataGroupBuilder builder; builder.addVector(SurgSim::DataStructures::Names::FORCE); SurgSim::DataStructures::DataGroup data = builder.createData(); auto initialForce = SurgSim::Math::Vector3d(0.89, 0.0, -324.67); data.vectors().set(SurgSim::DataStructures::Names::FORCE, initialForce); output1->setData(data); output3->setData(data); ASSERT_TRUE(mockDevice->pullOutput()); SurgSim::DataStructures::DataGroup actualData = mockDevice->getOutputData(); ASSERT_FALSE(actualData.isEmpty()); SurgSim::Math::Vector3d actualForce; ASSERT_TRUE(actualData.vectors().get(SurgSim::DataStructures::Names::FORCE, &actualForce)); EXPECT_TRUE(actualForce.isApprox(2.0 * initialForce)); // Check subsequent calls to pullOutput will correctly handle non-asserting DataGroup assignment. EXPECT_NO_THROW(mockDevice->pullOutput()); // Check first OutputComponent going away. outputs.clear(); output1.reset(); EXPECT_TRUE(mockDevice->pullOutput()); EXPECT_EQ(2, combiningOutputComponent->getOutputs().size()); } TEST(CombiningOutputComponentTest, Serialization) { auto runtime = std::make_shared("config.txt"); auto inputManager = std::make_shared(); runtime->addManager(inputManager); runtime->addSceneElements("CombiningOutputComponent.yaml"); auto element = runtime->getScene()->getSceneElement("element"); ASSERT_NE(element, nullptr); auto outputs = element->getComponents(); ASSERT_EQ(outputs.size(), 4); std::shared_ptr combiningOutputComponent; for (size_t i = 0; i < outputs.size(); ++i) { combiningOutputComponent = std::dynamic_pointer_cast(outputs[i]); if (combiningOutputComponent != nullptr) { outputs.erase(outputs.begin() + i); break; } } ASSERT_NE(combiningOutputComponent, nullptr); std::set> componentsFromElement; componentsFromElement.insert(outputs.begin(), outputs.end()); std::set> componentsFromCombiner; auto actualOutputs = combiningOutputComponent->getOutputs(); componentsFromCombiner.insert(actualOutputs.begin(), actualOutputs.end()); ASSERT_EQ(componentsFromElement, componentsFromCombiner); EXPECT_EQ("output1", actualOutputs[0]->getName()); EXPECT_EQ("output2", actualOutputs[1]->getName()); EXPECT_EQ("output3", actualOutputs[2]->getName()); auto mockDevice = std::make_shared("device"); inputManager->addDevice(mockDevice); SurgSim::DataStructures::DataGroupBuilder builder; builder.addVector(SurgSim::DataStructures::Names::FORCE); SurgSim::DataStructures::DataGroup data = builder.createData(); auto initialForce = SurgSim::Math::Vector3d(0.89, 0.0, -324.67); data.vectors().set(SurgSim::DataStructures::Names::FORCE, initialForce); std::static_pointer_cast(actualOutputs[0])->setData(data); std::static_pointer_cast(actualOutputs[2])->setData(data); runtime->start(true); runtime->step(); runtime->step(); runtime->step(); boost::this_thread::sleep(boost::posix_time::milliseconds(50)); runtime->stop(); ASSERT_TRUE(mockDevice->pullOutput()); SurgSim::DataStructures::DataGroup actualData = mockDevice->getOutputData(); ASSERT_FALSE(actualData.isEmpty()); SurgSim::Math::Vector3d actualForce; ASSERT_TRUE(actualData.vectors().get(SurgSim::DataStructures::Names::FORCE, &actualForce)); EXPECT_TRUE(actualForce.isApprox(2.0 * initialForce)); YAML::Node node; EXPECT_NO_THROW(node = YAML::convert::encode(*combiningOutputComponent)); EXPECT_TRUE(node.IsMap()); std::shared_ptr newComponent; EXPECT_NO_THROW(newComponent = std::dynamic_pointer_cast( node.as>())); ASSERT_NE(newComponent, nullptr); auto newOutputs = newComponent->getValue>>("Outputs"); for (auto newOutput : newOutputs) { EXPECT_NE(std::dynamic_pointer_cast(newOutput), nullptr); } } opensurgsim-0.7.0/SurgSim/Input/UnitTests/CommonDeviceTests.cpp000066400000000000000000000250451277777236100246530ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the CommonDevice class. #include #include #include #include "SurgSim/Input/CommonDevice.h" #include "SurgSim/Input/InputConsumerInterface.h" #include "SurgSim/Input/OutputProducerInterface.h" #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/DataStructures/DataGroupBuilder.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Matrix.h" #include "SurgSim/Input/UnitTests/TestDevice.h" using SurgSim::Input::CommonDevice; using SurgSim::Input::InputConsumerInterface; using SurgSim::Input::OutputProducerInterface; using SurgSim::DataStructures::DataGroup; using SurgSim::DataStructures::DataGroupBuilder; using SurgSim::Math::RigidTransform3d; using SurgSim::Math::Matrix44d; TEST(CommonDeviceTests, CanConstruct) { EXPECT_NO_THROW({TestDevice device("MyTestDevice");}); } TEST(CommonDeviceTests, Name) { TestDevice device("MyTestDevice"); EXPECT_EQ("MyTestDevice", device.getName()); } TEST(CommonDeviceTests, AddInputConsumer) { TestDevice device("MyTestDevice"); std::shared_ptr consumer = std::make_shared(); EXPECT_EQ(0, consumer->m_numTimesReceivedInput); EXPECT_TRUE(device.addInputConsumer(consumer)); EXPECT_EQ(0, consumer->m_numTimesReceivedInput); EXPECT_FALSE(device.addInputConsumer(consumer)); EXPECT_EQ(0, consumer->m_numTimesReceivedInput); std::shared_ptr consumer2 = std::make_shared(); EXPECT_EQ(0, consumer2->m_numTimesReceivedInput); EXPECT_TRUE(device.addInputConsumer(consumer2)); EXPECT_EQ(0, consumer2->m_numTimesReceivedInput); EXPECT_EQ(0, consumer->m_numTimesReceivedInput); } TEST(CommonDeviceTests, SetOutputProducer) { TestDevice device("MyTestDevice"); std::shared_ptr producer = std::make_shared(); EXPECT_EQ(0, producer->m_numTimesRequestedOutput); EXPECT_TRUE(device.setOutputProducer(producer)); EXPECT_TRUE(device.hasOutputProducer()); EXPECT_EQ(0, producer->m_numTimesRequestedOutput); EXPECT_FALSE(device.setOutputProducer(producer)); EXPECT_EQ(0, producer->m_numTimesRequestedOutput); std::shared_ptr producer2 = std::make_shared(); EXPECT_EQ(0, producer2->m_numTimesRequestedOutput); EXPECT_TRUE(device.setOutputProducer(producer2)); EXPECT_TRUE(device.hasOutputProducer()); EXPECT_EQ(0, producer2->m_numTimesRequestedOutput); EXPECT_EQ(0, producer->m_numTimesRequestedOutput); } TEST(CommonDeviceTests, PushInput) { TestDevice device("MyTestDevice"); std::shared_ptr consumer1 = std::make_shared(); std::shared_ptr consumer2 = std::make_shared(); std::shared_ptr producer = std::make_shared(); EXPECT_TRUE(device.addInputConsumer(consumer1)); EXPECT_TRUE(device.addInputConsumer(consumer2)); EXPECT_TRUE(device.setOutputProducer(producer)); EXPECT_EQ(0, consumer1->m_numTimesReceivedInput); EXPECT_EQ(0, consumer2->m_numTimesReceivedInput); EXPECT_EQ(0, producer->m_numTimesRequestedOutput); device.pushInput(); EXPECT_EQ(1, consumer1->m_numTimesReceivedInput); EXPECT_EQ(1, consumer2->m_numTimesReceivedInput); EXPECT_TRUE(consumer1->m_lastReceivedInput.strings().hasData("helloWorld")); EXPECT_TRUE(consumer2->m_lastReceivedInput.strings().hasData("helloWorld")); EXPECT_EQ(0, producer->m_numTimesRequestedOutput); // invalidate the state consumer1->m_lastReceivedInput.resetAll(); consumer2->m_lastReceivedInput.resetAll(); EXPECT_EQ(1, consumer1->m_numTimesReceivedInput); EXPECT_EQ(1, consumer2->m_numTimesReceivedInput); EXPECT_FALSE(consumer1->m_lastReceivedInput.strings().hasData("helloWorld")); EXPECT_FALSE(consumer2->m_lastReceivedInput.strings().hasData("helloWorld")); device.pushInput(); EXPECT_EQ(2, consumer1->m_numTimesReceivedInput); EXPECT_EQ(2, consumer2->m_numTimesReceivedInput); EXPECT_TRUE(consumer1->m_lastReceivedInput.strings().hasData("helloWorld")); EXPECT_TRUE(consumer2->m_lastReceivedInput.strings().hasData("helloWorld")); EXPECT_EQ(0, producer->m_numTimesRequestedOutput); } TEST(CommonDeviceTests, PullOutput) { TestDevice device("MyTestDevice"); std::shared_ptr producer1 = std::make_shared(); std::shared_ptr producer2 = std::make_shared(); std::shared_ptr consumer = std::make_shared(); EXPECT_TRUE(device.setOutputProducer(producer1)); EXPECT_TRUE(device.setOutputProducer(producer2)); EXPECT_TRUE(device.addInputConsumer(consumer)); EXPECT_EQ(0, producer1->m_numTimesRequestedOutput); EXPECT_EQ(0, producer2->m_numTimesRequestedOutput); EXPECT_EQ(0, consumer->m_numTimesReceivedInput); EXPECT_TRUE(device.pullOutput()); EXPECT_EQ(0, producer1->m_numTimesRequestedOutput); EXPECT_EQ(1, producer2->m_numTimesRequestedOutput); EXPECT_TRUE(device.getOutputData().integers().hasData("value")); EXPECT_EQ(0, consumer->m_numTimesReceivedInput); EXPECT_TRUE(device.pullOutput()); EXPECT_EQ(0, producer1->m_numTimesRequestedOutput); EXPECT_EQ(2, producer2->m_numTimesRequestedOutput); EXPECT_TRUE(device.getOutputData().integers().hasData("value")); EXPECT_EQ(0, consumer->m_numTimesReceivedInput); // Test what happens when the producer returns false. producer2->m_refuseToProduce = true; EXPECT_FALSE(device.pullOutput()); EXPECT_EQ(0, producer1->m_numTimesRequestedOutput); EXPECT_EQ(3, producer2->m_numTimesRequestedOutput); EXPECT_FALSE(device.getOutputData().integers().hasData("value")); EXPECT_EQ(0, consumer->m_numTimesReceivedInput); } TEST(CommonDeviceTests, RemoveInputConsumer) { TestDevice device("MyTestDevice"); EXPECT_FALSE(device.removeInputConsumer(std::shared_ptr())); EXPECT_FALSE(device.removeInputConsumer(std::shared_ptr(nullptr))); std::shared_ptr consumer1 = std::make_shared(); std::shared_ptr consumer2 = std::make_shared(); EXPECT_FALSE(device.removeInputConsumer(consumer1)); EXPECT_TRUE(device.addInputConsumer(consumer1)); EXPECT_TRUE(device.addInputConsumer(consumer2)); EXPECT_EQ(0, consumer1->m_numTimesReceivedInput); EXPECT_EQ(0, consumer2->m_numTimesReceivedInput); EXPECT_FALSE(device.removeInputConsumer(std::shared_ptr())); EXPECT_FALSE(device.removeInputConsumer(std::shared_ptr(nullptr))); device.pushInput(); EXPECT_EQ(1, consumer1->m_numTimesReceivedInput); EXPECT_EQ(1, consumer2->m_numTimesReceivedInput); EXPECT_TRUE(consumer1->m_lastReceivedInput.strings().hasData("helloWorld")); EXPECT_TRUE(consumer2->m_lastReceivedInput.strings().hasData("helloWorld")); // invalidate the state consumer1->m_lastReceivedInput.resetAll(); consumer2->m_lastReceivedInput.resetAll(); EXPECT_EQ(1, consumer1->m_numTimesReceivedInput); EXPECT_EQ(1, consumer2->m_numTimesReceivedInput); EXPECT_FALSE(consumer1->m_lastReceivedInput.strings().hasData("helloWorld")); EXPECT_FALSE(consumer2->m_lastReceivedInput.strings().hasData("helloWorld")); EXPECT_TRUE(device.removeInputConsumer(consumer1)); device.pushInput(); EXPECT_EQ(1, consumer1->m_numTimesReceivedInput); EXPECT_EQ(2, consumer2->m_numTimesReceivedInput); EXPECT_FALSE(consumer1->m_lastReceivedInput.strings().hasData("helloWorld")); EXPECT_TRUE(consumer2->m_lastReceivedInput.strings().hasData("helloWorld")); EXPECT_FALSE(device.removeInputConsumer(consumer1)); device.pushInput(); EXPECT_EQ(1, consumer1->m_numTimesReceivedInput); EXPECT_EQ(3, consumer2->m_numTimesReceivedInput); EXPECT_FALSE(consumer1->m_lastReceivedInput.strings().hasData("helloWorld")); EXPECT_TRUE(consumer2->m_lastReceivedInput.strings().hasData("helloWorld")); device.clearInputConsumers(); device.pushInput(); EXPECT_EQ(1, consumer1->m_numTimesReceivedInput); EXPECT_EQ(3, consumer2->m_numTimesReceivedInput); EXPECT_FALSE(device.removeInputConsumer(consumer2)); } TEST(CommonDeviceTests, RemoveOutputProducer) { TestDevice device("MyTestDevice"); EXPECT_FALSE(device.removeOutputProducer(std::shared_ptr())); EXPECT_FALSE(device.removeOutputProducer(std::shared_ptr(nullptr))); std::shared_ptr producer1 = std::make_shared(); std::shared_ptr producer2 = std::make_shared(); EXPECT_FALSE(device.removeOutputProducer(producer1)); EXPECT_TRUE(device.setOutputProducer(producer1)); EXPECT_TRUE(device.setOutputProducer(producer2)); EXPECT_EQ(0, producer1->m_numTimesRequestedOutput); EXPECT_EQ(0, producer2->m_numTimesRequestedOutput); EXPECT_FALSE(device.removeOutputProducer(std::shared_ptr())); EXPECT_FALSE(device.removeOutputProducer(std::shared_ptr(nullptr))); EXPECT_TRUE(device.pullOutput()); EXPECT_EQ(0, producer1->m_numTimesRequestedOutput); EXPECT_EQ(1, producer2->m_numTimesRequestedOutput); EXPECT_TRUE(device.getOutputData().integers().hasData("value")); EXPECT_FALSE(device.removeOutputProducer(producer1)); EXPECT_TRUE(device.pullOutput()); EXPECT_EQ(0, producer1->m_numTimesRequestedOutput); EXPECT_EQ(2, producer2->m_numTimesRequestedOutput); EXPECT_TRUE(device.getOutputData().integers().hasData("value")); EXPECT_TRUE(device.removeOutputProducer(producer2)); EXPECT_FALSE(device.pullOutput()); EXPECT_EQ(0, producer1->m_numTimesRequestedOutput); EXPECT_EQ(2, producer2->m_numTimesRequestedOutput); EXPECT_FALSE(device.getOutputData().integers().hasData("value")); EXPECT_FALSE(device.removeOutputProducer(producer2)); EXPECT_FALSE(device.pullOutput()); EXPECT_EQ(0, producer1->m_numTimesRequestedOutput); EXPECT_EQ(2, producer2->m_numTimesRequestedOutput); EXPECT_FALSE(device.getOutputData().integers().hasData("value")); EXPECT_TRUE(device.setOutputProducer(producer1)); EXPECT_TRUE(device.hasOutputProducer()); device.clearOutputProducer(); EXPECT_FALSE(device.hasOutputProducer()); } opensurgsim-0.7.0/SurgSim/Input/UnitTests/Data/000077500000000000000000000000001277777236100214175ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Input/UnitTests/Data/CombiningOutputComponent.yaml000066400000000000000000000014361277777236100273200ustar00rootroot00000000000000- SurgSim::Framework::BasicSceneElement: Name: element Components: - SurgSim::Input::CombiningOutputComponent: Name: reducer DeviceName: device Outputs: - SurgSim::Input::OutputComponent: Name: output1 Id: output1 - SurgSim::Input::OutputComponent: Name: output2 Id: output2 - SurgSim::Input::OutputComponent: Name: output3 Id: output3 - SurgSim::Input::OutputComponent: Name: output1 Id: output1 - SurgSim::Input::OutputComponent: Name: output2 Id: output2 - SurgSim::Input::OutputComponent: Name: output3 Id: output3 opensurgsim-0.7.0/SurgSim/Input/UnitTests/InputComponentTest.cpp000066400000000000000000000045041277777236100250770ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /** @file * Tests for the InputComponent class. */ #include #include #include #include "yaml-cpp/yaml.h" #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Input/InputComponent.h" #include "SurgSim/Input/UnitTests/TestDevice.h" using SurgSim::Input::InputComponent; TEST(InputComponentTest, CanConstruct) { EXPECT_NO_THROW(InputComponent input("Input"); input.setDeviceName("InputDevice")); } TEST(InputComponentTest, Accessors) { InputComponent input("Input"); input.setDeviceName("InputDevice"); EXPECT_EQ("Input", input.getName()); EXPECT_EQ("InputDevice", input.getDeviceName()); } TEST(InputComponentTest, GetData) { auto input = std::make_shared("Input"); SurgSim::DataStructures::DataGroup data; ASSERT_NO_THROW(input->getData(&data)) << "Getting data from an unconnected InputComponent should not assert."; EXPECT_TRUE(data.isEmpty()) << "The data from an unconnected InputComponent should be empty."; TestDevice device("MyTestDevice"); device.addInputConsumer(input); ASSERT_NO_THROW(input->getData(&data)); EXPECT_FALSE(data.isEmpty()); } TEST(InputComponentTest, Serialization) { auto input = std::make_shared("Input"); input->setDeviceName("InputDevice"); // Encode YAML::Node node; EXPECT_NO_THROW(node = YAML::convert::encode(*input);); // Decode std::shared_ptr newInput; EXPECT_NO_THROW(newInput = std::dynamic_pointer_cast( node.as>());); // Verify EXPECT_EQ(input->getDeviceName(), newInput->getDeviceName()); } opensurgsim-0.7.0/SurgSim/Input/UnitTests/InputManagerTest.cpp000066400000000000000000000165601277777236100245140ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the InputManaget class. Note that InputManagerTest, the test fixture /// is declared as a friend class in InputManager to make it easier to test the /// add and removal of components, for this to work correctly PhysicsManagerTest is required /// to be in the SurgSim::Physics namespace. #include #include #include #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Input/CommonDevice.h" #include "SurgSim/Input/OutputProducerInterface.h" #include "SurgSim/Input/InputManager.h" #include "SurgSim/Input/InputComponent.h" #include "SurgSim/Input/OutputComponent.h" #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/DataStructures/DataGroupBuilder.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Matrix.h" #include "SurgSim/Input/UnitTests/TestDevice.h" using SurgSim::Framework::Runtime; using SurgSim::Framework::Component; using SurgSim::Input::DeviceInterface; using SurgSim::Input::CommonDevice; using SurgSim::Input::OutputProducerInterface; using SurgSim::Input::InputManager; using SurgSim::Input::InputComponent; using SurgSim::Input::OutputComponent; using SurgSim::DataStructures::DataGroup; using SurgSim::DataStructures::DataGroupBuilder; class MockComponent : public SurgSim::Framework::Component { public: explicit MockComponent(const std::string& name = "MockComponent") : Component(name) {} virtual ~MockComponent() {} protected: virtual bool doInitialize() { return true; } virtual bool doWakeUp() { return true; } }; namespace SurgSim { namespace Input { class InputManagerTest : public ::testing::Test { public: virtual void SetUp() { testDevice1 = std::make_shared("TestDevice1"); testDevice2 = std::make_shared("TestDevice2"); runtime = std::make_shared(); inputManager = std::make_shared(); runtime->addManager(inputManager); runtime->start(); inputManager->addDevice(testDevice1); inputManager->addDevice(testDevice2); } virtual void TearDown() { runtime->stop(); } bool testDoAddComponent(const std::shared_ptr& component) { return inputManager->executeAdditions(component); } bool testDoRemoveComponent(const std::shared_ptr& component) { return inputManager->executeRemovals(component); } std::shared_ptr testDevice1; std::shared_ptr testDevice2; std::shared_ptr runtime; std::shared_ptr inputManager; }; TEST_F(InputManagerTest, DeviceAddRemove) { std::shared_ptr testDevice3 = std::make_shared("TestDevice3"); std::shared_ptr testDevice4 = std::make_shared("TestDevice4"); std::shared_ptr testDevice5 = std::make_shared(""); EXPECT_TRUE(inputManager->addDevice(testDevice3)); EXPECT_TRUE(inputManager->addDevice(testDevice4)); EXPECT_FALSE(inputManager->addDevice(testDevice5)); EXPECT_FALSE(inputManager->addDevice(testDevice3)); EXPECT_TRUE(inputManager->removeDevice(testDevice4)); EXPECT_FALSE(inputManager->removeDevice(testDevice4)); EXPECT_TRUE(inputManager->addDevice(testDevice4)); } TEST_F(InputManagerTest, InputAddRemove) { std::shared_ptr listener1 = std::make_shared("Component1"); std::shared_ptr listener2 = std::make_shared("Component2"); std::shared_ptr listener3 = std::make_shared("Component3"); std::shared_ptr notvalid = std::make_shared("Component4"); listener1->setDeviceName("TestDevice1"); listener2->setDeviceName("TestDevice1"); listener3->setDeviceName("TestDevice2"); notvalid->setDeviceName("NonExistantDevice"); // Add various listeners to the input manager EXPECT_TRUE(testDoAddComponent(listener1)); EXPECT_TRUE(testDoAddComponent(listener2)); EXPECT_TRUE(testDoAddComponent(listener3)); EXPECT_TRUE(testDoAddComponent(notvalid)); // InputManager will add InputComponents that don't connect to a device. // Excercise adds and removes // Duplicate false on duplicate will become deprecated EXPECT_FALSE(testDoAddComponent(listener1)); EXPECT_TRUE(testDoRemoveComponent(listener1)); EXPECT_FALSE(testDoRemoveComponent(listener1)); // Should not be able to add random components std::shared_ptr component = std::make_shared(); EXPECT_FALSE(testDoAddComponent(component)); } TEST_F(InputManagerTest, InputfromDevice) { std::string data; SurgSim::DataStructures::DataGroup dataGroup; std::shared_ptr listener1 = std::make_shared("Component1"); listener1->setDeviceName("TestDevice1"); testDoAddComponent(listener1); EXPECT_NO_THROW(listener1->getData(&dataGroup)); testDevice1->pushInput("avalue"); EXPECT_NO_THROW(listener1->getData(&dataGroup)); EXPECT_TRUE(dataGroup.strings().get("helloWorld", &data)); EXPECT_EQ("avalue", data); testDevice1->pushInput("bvalue"); EXPECT_NO_THROW(listener1->getData(&dataGroup)); EXPECT_TRUE(dataGroup.strings().get("helloWorld", &data)); EXPECT_EQ("bvalue", data); } TEST_F(InputManagerTest, OutputAddRemove) { std::shared_ptr output1 = std::make_shared("Component1"); std::shared_ptr output2 = std::make_shared("Component2"); std::shared_ptr output3 = std::make_shared("Component3"); std::shared_ptr invalid = std::make_shared("Component5"); output1->setDeviceName("TestDevice1"); output2->setDeviceName("TestDevice1"); output3->setDeviceName("TestDevice2"); invalid->setDeviceName("InvalidDevice"); EXPECT_TRUE(testDoAddComponent(output1)); EXPECT_TRUE(testDoAddComponent(output2)); // InputManager will add even if same device already connected. EXPECT_FALSE(testDoAddComponent(output2)); EXPECT_TRUE(testDoAddComponent(output3)); EXPECT_TRUE(testDoAddComponent(invalid)); // InputManager will add even if does not connect to a device. EXPECT_TRUE(testDoRemoveComponent(output1)); EXPECT_FALSE(testDoRemoveComponent(output1)); EXPECT_TRUE(testDoRemoveComponent(invalid)); } TEST_F(InputManagerTest, OutputPush) { std::shared_ptr output = std::make_shared("Component1"); output->setDeviceName("TestDevice1"); EXPECT_TRUE(testDoAddComponent(output)); DataGroupBuilder builder; builder.addString("data"); DataGroup data = builder.createData(); data.strings().set("data", "outputdata"); output->setData(data); EXPECT_TRUE(testDevice1->pullOutput()); EXPECT_EQ("outputdata", testDevice1->lastPulledData); } TEST_F(InputManagerTest, TypeTest) { EXPECT_EQ(SurgSim::Framework::MANAGER_TYPE_INPUT, inputManager->getType()); } }; // namespace Input }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Input/UnitTests/OutputComponentTest.cpp000066400000000000000000000046061277777236100253030ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /** @file * Tests for the OutputComponent class. */ #include #include #include #include #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/DataStructures/DataGroupBuilder.h" #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Input/OutputComponent.h" using SurgSim::Input::OutputComponent; using SurgSim::DataStructures::DataGroup; TEST(OutputComponentTest, CanConstruct) { EXPECT_NO_THROW(OutputComponent output("Output"); output.setDeviceName("OutputDevice")); } TEST(OutputComponentTest, Accessors) { OutputComponent output("Output"); output.setDeviceName("OutputDevice"); EXPECT_EQ("Output", output.getName()); EXPECT_EQ("OutputDevice", output.getDeviceName()); SurgSim::DataStructures::DataGroup actualData; ASSERT_FALSE(output.requestOutput("", &actualData)); SurgSim::DataStructures::DataGroupBuilder builder; std::string name = "aBool"; builder.addBoolean(name); DataGroup dataGroup = builder.createData(); dataGroup.booleans().set(name, true); output.setData(dataGroup); bool result = false; ASSERT_TRUE(output.requestOutput("", &actualData)); ASSERT_TRUE(actualData.booleans().get(name, &result)); EXPECT_TRUE(result); } TEST(OutputComponentTest, Serialization) { auto output = std::make_shared("Output"); output->setDeviceName("OutputDevice"); // Encode YAML::Node node; EXPECT_NO_THROW(node = YAML::convert::encode(*output);); // Decode std::shared_ptr newOutput; EXPECT_NO_THROW(newOutput = std::dynamic_pointer_cast( node.as>());); // Verify EXPECT_EQ(output->getDeviceName(), newOutput->getDeviceName()); } opensurgsim-0.7.0/SurgSim/Input/UnitTests/TestDevice.cpp000066400000000000000000000047051277777236100233170ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Input/UnitTests/TestDevice.h" TestDevice::TestDevice(const std::string& uniqueName) : CommonDevice(uniqueName, buildInputData()), m_initialized(false) { } // required by the DeviceInterface API bool TestDevice::initialize() { SURGSIM_ASSERT(!isInitialized()) << getName() << " already initialized."; m_initialized = true; return true; } // required by the DeviceInterface API bool TestDevice::finalize() { SURGSIM_ASSERT(isInitialized()) << getName() << " is not initialized, cannot finalize."; m_initialized = false; return true; } bool TestDevice::isInitialized() const { return m_initialized; } // expose the pushInput method to the world void TestDevice::pushInput() { CommonDevice::pushInput(); } void TestDevice::pushInput(const std::string& data) { getInputData().strings().set("helloWorld", data); pushInput(); } // expose the pullOutput method to the world bool TestDevice::pullOutput() { bool result = CommonDevice::pullOutput(); getOutputData().strings().get("data", &lastPulledData); return result; } // expose the getOutputData method to the world const DataGroup& TestDevice::getOutputData() const { return CommonDevice::getOutputData(); } DataGroup TestDevice::buildInputData() { DataGroupBuilder builder; builder.addString("helloWorld"); DataGroup data = builder.createData(); data.strings().set("helloWorld", "data"); return data; } // Consumer Class Callback Function void TestInputConsumer::handleInput(const std::string& device, const DataGroup& inputData) { ++m_numTimesReceivedInput; m_lastReceivedInput = inputData; } // Producer class Hook bool TestOutputProducer::requestOutput(const std::string& device, DataGroup* outputData) { ++m_numTimesRequestedOutput; if (m_refuseToProduce) { return false; } else { *outputData = m_nextSentOutput; return true; } } opensurgsim-0.7.0/SurgSim/Input/UnitTests/TestDevice.h000066400000000000000000000053271277777236100227650ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_INPUT_UNITTESTS_TESTDEVICE_H #define SURGSIM_INPUT_UNITTESTS_TESTDEVICE_H #include "SurgSim/Input/CommonDevice.h" #include "SurgSim/Input/InputConsumerInterface.h" #include "SurgSim/Input/OutputProducerInterface.h" #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/DataStructures/DataGroupBuilder.h" using SurgSim::Input::CommonDevice; using SurgSim::DataStructures::DataGroup; using SurgSim::DataStructures::DataGroupBuilder; using SurgSim::Input::InputConsumerInterface; using SurgSim::Input::OutputProducerInterface; class TestDevice : public CommonDevice { public: explicit TestDevice(const std::string& uniqueName); bool initialize() override; bool isInitialized() const override; void pushInput() override; // Send some data down the stream void pushInput(const std::string& data); bool pullOutput() override; const DataGroup& getOutputData() const; /// Builds the data layout for the application input (i.e. device output). static DataGroup buildInputData(); DataGroup buildOutputData(); std::string lastPulledData; /// true if initialized and not finalized. bool m_initialized; private: bool finalize() override; }; struct TestInputConsumer : public InputConsumerInterface { public: TestInputConsumer() : m_numTimesReceivedInput(0) { } virtual void initializeInput(const std::string& device, const DataGroup& initialInput) { } virtual void handleInput(const std::string& device, const DataGroup& inputData); int m_numTimesReceivedInput; DataGroup m_lastReceivedInput; }; struct TestOutputProducer : public OutputProducerInterface { public: TestOutputProducer() : m_numTimesRequestedOutput(0), m_refuseToProduce(false) { DataGroupBuilder builder; builder.addInteger("value"); m_nextSentOutput = builder.createData(); m_nextSentOutput.integers().set("value", 123); } virtual bool requestOutput(const std::string& device, DataGroup* outputData); int m_numTimesRequestedOutput; bool m_refuseToProduce; DataGroup m_nextSentOutput; }; #endif // SURGSIM_INPUT_UNITTESTS_TESTDEVICE_H opensurgsim-0.7.0/SurgSim/Input/UnitTests/config.txt.in000066400000000000000000000000411277777236100231540ustar00rootroot00000000000000${CMAKE_CURRENT_BINARY_DIR}/Data/opensurgsim-0.7.0/SurgSim/Math/000077500000000000000000000000001277777236100163765ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Math/Aabb.h000066400000000000000000000104051277777236100173740ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_MATH_AABB_H #define SURGSIM_MATH_AABB_H #include namespace SurgSim { namespace Math { /// Wrapper around the Eigen type typedef Eigen::AlignedBox Aabbf; /// Wrapper around the Eigen type typedef Eigen::AlignedBox Aabbd; /// Determine whether two AABBs have an intersection with each other, for the calculation see /// http://www.gamasutra.com/view/feature/131790/simple_intersection_tests_for_games.php?page=3 /// \tparam Scalar numeric type /// \tparam Dim dimension of the space to be used /// \param aabb0 first axis aligned bounding box /// \param aabb1 second axis aligned bounding box /// \param tolerance the bounding boxes will be considered bigger by this amount /// \return true if there is an overlap between the two boxes template bool doAabbIntersect(const Eigen::AlignedBox& aabb0, const Eigen::AlignedBox& aabb1, double tolerance) { typedef typename Eigen::AlignedBox::VectorType VectorType; VectorType vector = (aabb1.center() - aabb0.center()).array().abs(); VectorType totalSizes = ((aabb0.sizes() + aabb1.sizes()) * 0.5).array() + tolerance; return (vector.array() <= totalSizes.array()).all(); } /// Determine whether two AABBs overlap, using a minimal set of eigen calls, does not take a tolerance /// \tparam Scalar numeric type /// \tparam Dim dimension of the space to be used /// \param a first axis aligned bounding box /// \param b second axis aligned bounding box /// \return true if there is an overlap between the two boxes template bool doAabbIntersect(const Eigen::AlignedBox& a, const Eigen::AlignedBox& b) { return !a.intersection(b).isEmpty(); } /// Convenience function for creating a bounding box from three vertices (e.g. the vertices of a triangle) /// \tparam Scalar numeric type /// \tparam Dim dimension of the space to be used /// \tparam MType the eigen type of the vectors /// \return an AABB containing all the points passed template Eigen::AlignedBox makeAabb( const Eigen::Matrix& vector0, const Eigen::Matrix& vector1, const Eigen::Matrix& vector2) { Eigen::AlignedBox result(vector0); result.extend(vector1); result.extend(vector2); return result; } /// Rotate the extrema of the aabb, note that that will extend the size of the box /// \tparam Scalar numeric type /// \tparam Dim dimension of the space to be used /// \param transform The Rigidtransform to use /// \param aabb the aabb to transform /// \return the transformed aabb template Eigen::AlignedBox transformAabb(const Eigen::Transform& transform, const Eigen::AlignedBox& aabb) { static std::array::CornerType, 8> corners = { Eigen::AlignedBox::BottomLeftFloor, Eigen::AlignedBox::BottomRightFloor, Eigen::AlignedBox::TopLeftFloor, Eigen::AlignedBox::TopRightFloor, Eigen::AlignedBox::BottomLeftCeil, Eigen::AlignedBox::BottomRightCeil, Eigen::AlignedBox::TopLeftCeil, Eigen::AlignedBox::TopRightCeil, }; if (aabb.isEmpty()) { return aabb; } Eigen::AlignedBox result; std::for_each(corners.cbegin(), corners.cend(), [&result, &aabb, &transform](typename Eigen::AlignedBox::CornerType c) { result.extend(transform * aabb.corner(c)); }); return result; } } } #endif opensurgsim-0.7.0/SurgSim/Math/BoxShape.cpp000066400000000000000000000061331277777236100206160ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Math/BoxShape.h" namespace SurgSim { namespace Math { SURGSIM_REGISTER(SurgSim::Math::Shape, SurgSim::Math::BoxShape, BoxShape); BoxShape::BoxShape(double sizeX, double sizeY, double sizeZ) : m_size(Vector3d(sizeX, sizeY, sizeZ)) { calculateVertices(); updateAabb(); SURGSIM_ADD_SERIALIZABLE_PROPERTY(BoxShape, double, SizeX, getSizeX, setSizeX); SURGSIM_ADD_SERIALIZABLE_PROPERTY(BoxShape, double, SizeY, getSizeY, setSizeY); SURGSIM_ADD_SERIALIZABLE_PROPERTY(BoxShape, double, SizeZ, getSizeZ, setSizeZ); } int BoxShape::getType() const { return SHAPE_TYPE_BOX; } Vector3d BoxShape::getSize() const { return m_size; } double BoxShape::getSizeX() const { return m_size[0]; } double BoxShape::getSizeY() const { return m_size[1]; } double BoxShape::getSizeZ() const { return m_size[2]; } void BoxShape::setSizeX(double sizeX) { m_size[0] = sizeX; updateAabb(); } void BoxShape::setSizeY(double sizeY) { m_size[1] = sizeY; updateAabb(); } void BoxShape::setSizeZ(double sizeZ) { m_size[2] = sizeZ; updateAabb(); } double BoxShape::getVolume() const { return m_size[0] * m_size[1] * m_size[2]; } SurgSim::Math::Vector3d BoxShape::getCenter() const { return Vector3d(0.0, 0.0, 0.0); } SurgSim::Math::Matrix33d BoxShape::getSecondMomentOfVolume() const { const double volume = getVolume(); const Vector3d sizeSquared = m_size.array() * m_size.array(); const double coef = 1.0 / 12.0 * volume; Matrix33d inertia = Matrix33d::Zero(); inertia.diagonal() = coef * Vector3d(sizeSquared[1] + sizeSquared[2], sizeSquared[0] + sizeSquared[2], sizeSquared[0] + sizeSquared[1]); return inertia; } SurgSim::Math::Vector3d BoxShape::getVertex(const int i) const { return m_vertices[i]; } const std::array& BoxShape::getVertices() const { return m_vertices; } void BoxShape::calculateVertices() { static const std::array multiplier = {{ Vector3d(-0.5, -0.5, -0.5), Vector3d(-0.5, -0.5, 0.5), Vector3d(-0.5, 0.5, 0.5), Vector3d(-0.5, 0.5, -0.5), Vector3d(0.5, -0.5, -0.5), Vector3d(0.5, -0.5, 0.5), Vector3d(0.5, 0.5, 0.5), Vector3d(0.5, 0.5, -0.5) } }; for (int i = 0; i < 8; ++i) { m_vertices[i] = m_size.array() * multiplier[i].array(); } } void BoxShape::updateAabb() { m_aabb.setEmpty(); m_aabb.extend(-(m_size / 2.0)); m_aabb.extend(m_size / 2.0); } bool BoxShape::isValid() const { return (m_size.minCoeff() >= 0); } }; // namespace Math }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Math/BoxShape.h000066400000000000000000000065151277777236100202670ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_MATH_BOXSHAPE_H #define SURGSIM_MATH_BOXSHAPE_H #include #include "SurgSim/Framework/ObjectFactory.h" #include "SurgSim/Math/Shape.h" namespace SurgSim { namespace Math { SURGSIM_STATIC_REGISTRATION(BoxShape); /// Box shape: box centered on (0 0 0), aligned with the axis /// with different sizes along X, Y and Z class BoxShape: public Shape { public: /// Constructor /// \param sizeX, sizeY, sizeZ the box sizes in all 3 directions (in m) explicit BoxShape(double sizeX = 0.0, double sizeY = 0.0, double sizeZ = 0.0); SURGSIM_CLASSNAME(SurgSim::Math::BoxShape); /// \return the type of the shape int getType() const override; /// Get size of the box /// \return the size of the box (in m) Vector3d getSize() const; /// Get size in X direction /// \return the size in the X direction (in m) double getSizeX() const; /// Get size in Y direction /// \return the size in the Y direction (in m) double getSizeY() const; /// Get size in Z direction /// \return the size in the Z direction (in m) double getSizeZ() const; /// Get the volume of the shape /// \return The volume of the shape (in m-3) double getVolume() const override; /// Get the volumetric center of the shape /// \return The center of the shape Vector3d getCenter() const override; /// Get the second central moment of the volume, commonly used /// to calculate the moment of inertia matrix /// \return The 3x3 symmetric second moment matrix Matrix33d getSecondMomentOfVolume() const override; /// Function that returns the local vertex location, given an index. /// \param i The vertex index. /// \return The local vertex position. Vector3d getVertex(const int i) const; /// Function that returns the local vertices' location /// \return All eight vertices of the box const std::array& getVertices() const; /// \return True if size along X, Y, Z are bigger than or equal to 0; Otherwise, false. bool isValid() const override; protected: // Setters in 'protected' sections are for serialization purpose only. /// Set size in X direction /// \param sizeX the size in the X direction (in m) void setSizeX(double sizeX); /// Set size in Y direction /// \param sizeY the size in the Y direction (in m) void setSizeY(double sizeY); /// Set size in Z direction /// \param sizeZ the size in the Z direction (in m) void setSizeZ(double sizeZ); private: /// Function that calculates the box vertices. void calculateVertices(); /// Update the local aabb for this box void updateAabb(); /// The box sizes along the 3 axis respectively {X,Y,Z} Vector3d m_size; /// The box vertices. std::array m_vertices; }; }; // Math }; // SurgSim #endif // SURGSIM_MATH_BOXSHAPE_H opensurgsim-0.7.0/SurgSim/Math/CMakeLists.txt000066400000000000000000000067521277777236100211500ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2012-2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. set(SURGSIM_MATH_SOURCES BoxShape.cpp CapsuleShape.cpp CardinalSplines.cpp CompoundShape.cpp CylinderShape.cpp DoubleSidedPlaneShape.cpp GaussLegendreQuadrature.cpp LinearSolveAndInverse.cpp LinearSparseSolveAndInverse.cpp MathConvert.cpp MeshShape.cpp MlcpGaussSeidelSolver.cpp MlcpProblem.cpp OctreeShape.cpp OdeEquation.cpp OdeSolver.cpp OdeSolverEulerExplicit.cpp OdeSolverEulerExplicitModified.cpp OdeSolverEulerImplicit.cpp OdeSolverLinearEulerExplicit.cpp OdeSolverLinearEulerExplicitModified.cpp OdeSolverLinearEulerImplicit.cpp OdeSolverLinearRungeKutta4.cpp OdeSolverLinearStatic.cpp OdeSolverRungeKutta4.cpp OdeSolverStatic.cpp OdeState.cpp ParticlesShape.cpp PlaneShape.cpp SegmentMeshShape.cpp SegmentMeshShapePlyReaderDelegate.cpp Shape.cpp SphereShape.cpp SurfaceMeshShape.cpp ) set(SURGSIM_MATH_HEADERS Aabb.h BoxShape.h CapsuleShape.h CardinalSplines.h CompoundShape.h CubicSolver.h CubicSolver-inl.h CylinderShape.h DoubleSidedPlaneShape.h GaussLegendreQuadrature.h Geometry.h IntervalArithmetic.h IntervalArithmetic-inl.h KalmanFilter.h KalmanFilter-inl.h LinearMotionArithmetic.h LinearMotionArithmetic-inl.h LinearSolveAndInverse.h LinearSolveAndInverse-inl.h LinearSparseSolveAndInverse.h MathConvert.h MathConvert-inl.h Matrix.h MeshShape.h MeshShape-inl.h MinMax.h MinMax-inl.h MlcpConstraintType.h MlcpConstraintTypeName.h MlcpGaussSeidelSolver.h MlcpProblem.h MlcpSolution.h MlcpSolver.h OctreeShape.h OctreeShape-inl.h OdeEquation.h OdeSolver.h OdeSolverEulerExplicit.h OdeSolverEulerExplicitModified.h OdeSolverEulerImplicit.h OdeSolverLinearEulerExplicit.h OdeSolverLinearEulerExplicitModified.h OdeSolverLinearEulerImplicit.h OdeSolverLinearRungeKutta4.h OdeSolverLinearStatic.h OdeSolverRungeKutta4.h OdeSolverStatic.h OdeState.h ParticlesShape.h ParticlesShape-inl.h PlaneShape.h PointTriangleCcdContactCalculation-inl.h Polynomial.h Polynomial-inl.h PolynomialRoots.h PolynomialRoots-inl.h PolynomialValues.h PolynomialValues-inl.h Quaternion.h RigidTransform.h Scalar.h Scalar-inl.h SegmentMeshShape.h SegmentMeshShape-inl.h SegmentMeshShapePlyReaderDelegate.h SegmentSegmentCcdContactCalculation-inl.h Shape.h Shapes.h SparseMatrix.h SphereShape.h SurfaceMeshShape.h SurfaceMeshShape-inl.h TriangleCapsuleContactCalculation-inl.h TriangleTriangleContactCalculation-inl.h TriangleTriangleIntersection-inl.h Valid.h Valid-inl.h Vector.h ) surgsim_create_library_header(Math.h "${SURGSIM_MATH_HEADERS}") surgsim_add_library( SurgSimMath "${SURGSIM_MATH_SOURCES}" "${SURGSIM_MATH_HEADERS}" ) set(LIBS SurgSimDataStructures SurgSimFramework ${YAML_CPP_LIBRARIES} ) target_link_libraries(SurgSimMath ${LIBS}) if(BUILD_TESTING) add_subdirectory(UnitTests) endif() # Put SurgSimMath into folder "Math" set_target_properties(SurgSimMath PROPERTIES FOLDER "Math") opensurgsim-0.7.0/SurgSim/Math/CapsuleShape.cpp000066400000000000000000000070751277777236100214700ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Math/CapsuleShape.h" namespace SurgSim { namespace Math { SURGSIM_REGISTER(SurgSim::Math::Shape, SurgSim::Math::CapsuleShape, CapsuleShape); CapsuleShape::CapsuleShape(double length, double radius) : m_length(length), m_radius(radius) { SURGSIM_ADD_SERIALIZABLE_PROPERTY(CapsuleShape, double, Radius, getRadius, setRadius); SURGSIM_ADD_SERIALIZABLE_PROPERTY(CapsuleShape, double, Length, getLength, setLength); updateAabb(); } int CapsuleShape::getType() const { return SHAPE_TYPE_CAPSULE; } double CapsuleShape::getLength() const { return m_length; } double CapsuleShape::getRadius() const { return m_radius; } void CapsuleShape::setLength(double length) { m_length = length; updateAabb(); } void CapsuleShape::setRadius(double radius) { m_radius = radius; updateAabb(); } double CapsuleShape::getVolume() const { const double r2 = m_radius * m_radius; const double localCylinderVolume = M_PI * (r2) * m_length; const double localSphereVolume = 4.0 / 3.0 * M_PI * r2 * m_radius; return localCylinderVolume + localSphereVolume; } SurgSim::Math::Vector3d CapsuleShape::getCenter() const { return Vector3d(0.0, 0.0, 0.0); } SurgSim::Math::Vector3d CapsuleShape::topCenter() const { return Vector3d(0.0, m_length / 2.0, 0.0); } SurgSim::Math::Vector3d CapsuleShape::bottomCenter() const { return Vector3d(0.0, -m_length / 2.0, 0.0); } SurgSim::Math::Matrix33d CapsuleShape::getSecondMomentOfVolume() const { const double& r = m_radius; const double& l = m_length; const double r2 = r * r; const double l2 = l * l; const double cylinderVolume = M_PI * (r2) * l; const double sphereVolume = 4.0 / 3.0 * M_PI * r2 * r; // The matrix is a combination of the cylinder and // the 2 hemispheres: // // Second central moment of cylinder along the Y axis // vc = PI.radius.radius.length (volume of the cylinder) // a = 1/2.vc.r^2 // b = 1/12.vc.(3.r^2 + h^2) // (b 0 0) // I(cylinder) = (0 a 0) // (0 0 b) // // Second central moment of the 2 hemispheres along the X axis (direction = 0) // vs = 4/3 pi.radius.radius.radius (volume of the entire sphere) // c = 2/5.vs.r^2 // d = 2/5.vs.r^2 + vs.h^2/4 + 3/8.vs.r.h // (d 0 0) // I(2 hemispheres) = (0 c 0) // (0 0 d) double a = 1.0 / 2.0 * cylinderVolume * r2; double b = 1.0 / 12.0 * cylinderVolume * (3.0 * r2 + l2); double c = 2.0 / 5.0 * sphereVolume * r2; double d = c + sphereVolume * l * (l / 4.0 + 3.0 / 8.0 * r); Matrix33d secondMoment; secondMoment.setZero(); secondMoment.diagonal().setConstant(b + d); secondMoment(1, 1) = a + c; return secondMoment; } bool CapsuleShape::isValid() const { return (m_length >= 0) && (m_radius >= 0); } void CapsuleShape::updateAabb() { m_aabb.setEmpty(); m_aabb.extend(Vector3d(-m_radius, -m_length / 2.0 - m_radius, -m_radius)); m_aabb.extend(Vector3d(m_radius, m_length / 2.0 + m_radius, m_radius)); } }; // namespace Math }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Math/CapsuleShape.h000066400000000000000000000057101277777236100211270ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_MATH_CAPSULESHAPE_H #define SURGSIM_MATH_CAPSULESHAPE_H #include "SurgSim/Framework/ObjectFactory.h" #include "SurgSim/Math/Shape.h" namespace SurgSim { namespace Math { SURGSIM_STATIC_REGISTRATION(CapsuleShape); /// Capsule shape: centered on (0, 0, 0), aligned along Y, /// with length and radius class CapsuleShape: public Shape { public: /// Constructor /// \param length The capsule length (i.e. of the cylinder) (in m) /// \param radius The capsule radius (i.e. of the cylinder/spheres) (in m) explicit CapsuleShape(double length = 0.0, double radius = 0.0); SURGSIM_CLASSNAME(SurgSim::Math::CapsuleShape); /// \return the type of the shape int getType() const override; /// Get the capsule length (i.e. cylinder length) /// \return The capsule length (in m) double getLength() const; /// Get the capsule radius (i.e. cylinder/spheres radius) /// \return The capsule radius (in m) double getRadius() const; /// Get the volume of the shape /// \return The volume of the shape (in m-3) double getVolume() const override; /// Get the volumetric center of the shape /// \return The center of the shape Vector3d getCenter() const override; /// Return the center of the top sphere of the internal cylinder /// \return The top center of the sphere of the capsule Vector3d topCenter() const; /// Return the center of the bottom sphere of the internal cylinder /// \return The bottom center of the sphere of the capsule Vector3d bottomCenter() const; /// Get the second central moment of the volume, commonly used /// to calculate the moment of inertia matrix /// \return The 3x3 symmetric second moment matrix Matrix33d getSecondMomentOfVolume() const override; /// \return True if length and radius are bigger than or equal to 0; Otherwise, false. bool isValid() const override; protected: // Setters in 'protected' sections are for serialization purpose only. /// Set the capsule length (i.e. cylinder length) /// \param length The capsule length (in m) void setLength(double length); /// Set the capsule radius (i.e. cylinder/spheres radius) /// \param radius The capsule radius (in m) void setRadius(double radius); void updateAabb(); private: /// Capsule length double m_length; /// Capsule radius double m_radius; }; }; // Math }; // SurgSim #endif // SURGSIM_MATH_CAPSULESHAPE_H opensurgsim-0.7.0/SurgSim/Math/CardinalSplines.cpp000066400000000000000000000071131277777236100221570ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Framework/Assert.h" #include "SurgSim/Math/CardinalSplines.h" namespace SurgSim { namespace Math { namespace CardinalSplines { void extendControlPoints(const SurgSim::DataStructures::VerticesPlain& points, std::vector* result) { SURGSIM_ASSERT(points.getNumVertices() >= 2) << "Cannot extend control points less than 2."; SURGSIM_ASSERT(result != nullptr) << "'result' can not be nullptr."; result->clear(); result->reserve(points.getNumVertices() + 2); // Interpolate the 1st point (ghost) as the symmetric of P1 from P0: P-1 = P0 - (P1 - P0) result->push_back(2.0 * points.getVertexPosition(0) - points.getVertexPosition(1)); for (size_t i = 0; i < points.getNumVertices(); ++i) { result->push_back(points.getVertexPosition(i)); } // Interpolate the last point (ghost) as the symmetric of Pn-1 from Pn: Pn+1 = Pn - (Pn-1 - Pn) result->push_back(2.0 * points.getVertexPosition(points.getNumVertices() - 1) - points.getVertexPosition(points.getNumVertices() - 2)); } void interpolate(size_t subdivisions, const std::vector& controlPoints, std::vector* points, double tau) { SURGSIM_ASSERT(subdivisions >= 0) << "'subdivision' must be at least 0."; SURGSIM_ASSERT(controlPoints.size() >= 4) << "Cannot apply Cardinal Splines interpolation with less than 4 points"; SURGSIM_ASSERT(points != nullptr) << "'points' is nullptr"; SURGSIM_ASSERT(0 <= tau && tau <= 1) << "Tension parameter 'tau' must be in the range [0,1]."; size_t numPoints = controlPoints.size(); // Allow for no subdivisions for debug scenarios. if (subdivisions == 0) { for (size_t pointIndex = 0; pointIndex < numPoints; ++pointIndex) { points->push_back(controlPoints[pointIndex]); } return; } double stepsize = 1.0 / static_cast(subdivisions); for (size_t pointIndex = 0; pointIndex < numPoints - 3; ++pointIndex) { std::array p = { controlPoints[pointIndex], controlPoints[pointIndex + 1], controlPoints[pointIndex + 2], controlPoints[pointIndex + 3] }; double abscissa = 0.0; /* Note that 'controlPoints' are NOT included in the final result, 'points'. However, when 'abscissa' is 0.0, the interpolated point will happen to have the same value with one of the control points and thus being included in the result. */ for (size_t i = 0; i < subdivisions; ++i) { double abcissaSquared = abscissa * abscissa; double abcissaCubed = abcissaSquared * abscissa; SurgSim::Math::Vector3d result = p[1] + abscissa * (tau * (p[2] - p[0])) + abcissaSquared * (2.0 * tau * p[0] + (tau - 3.0) * p[1] + (3.0 - 2.0 * tau) * p[2] - tau * p[3]) + abcissaCubed * (-tau * p[0] + (2.0 - tau) * p[1] + (tau - 2.0) * p[2] + tau * p[3]); points->push_back(std::move(result)); abscissa += stepsize; } } } }; // namespace CardinalSplines }; // namespace Math }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Math/CardinalSplines.h000066400000000000000000000046141277777236100216270ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_MATH_CARDINALSPLINES_H #define SURGSIM_MATH_CARDINALSPLINES_H #include #include "SurgSim/DataStructures/Vertices.h" #include "SurgSim/Math/Vector.h" /// \file CardinalSplines.h collects the utilities to do Cardinal Splines interpolation. namespace SurgSim { namespace Math { namespace CardinalSplines { /// Function to add two 'ghost' points to 'points' at the beginning and the end, /// prepare 'points' for Cardinal Splines interpolation. /// \param points List of points to be interpolated. /// \param[out] result List of points with two ghost points added, /// one at the beginning and another at the end of 'points'. void extendControlPoints(const SurgSim::DataStructures::VerticesPlain& points, std::vector* result); /// Run Cardinal Splines interpolation on 'controlPoints'. /// See https://en.wikipedia.org/wiki/Centripetal_Catmull-Rom_spline /// https://en.wikipedia.org/wiki/Cubic_Hermite_spline /// https://people.cs.clemson.edu/~dhouse/courses/405/notes/splines.pdf /// https://www.cs.utexas.edu/~fussell/courses/cs384g/lectures/lecture16-Interpolating_curves.pdf for more details. /// \param subdivisions Number of interpolated points between each pair of control points. /// \param controlPoints List of points to be interpolated. /// \param[out] points List of interpolated points, not including the control points. /// \param tau Defines the tension, affects how sharply the curve bends at the control points. void interpolate(size_t subdivisions, const std::vector& controlPoints, std::vector* points, double tau = 0.4); }; // namespace CardinalSplines }; // namespace Math }; // namespace SurgSim #endif // SURGSIM_MATH_CARDINALSPLINES_H opensurgsim-0.7.0/SurgSim/Math/CompoundShape.cpp000066400000000000000000000134131277777236100216510ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Math/CompoundShape.h" #include "SurgSim/Math/MathConvert.h" namespace SurgSim { namespace Math { SURGSIM_REGISTER(SurgSim::Math::Shape, SurgSim::Math::CompoundShape, CompoundShape); CompoundShape::CompoundShape() { { typedef std::vector PropertyType; SURGSIM_ADD_SERIALIZABLE_PROPERTY(SurgSim::Math::CompoundShape, PropertyType, Shapes, getShapes, setShapes); } } CompoundShape::~CompoundShape() { } int CompoundShape::getType() const { return SHAPE_TYPE_COMPOUNDSHAPE; } double CompoundShape::getVolume() const { { ReadLock lock(m_mutex); if (m_volume.hasValue()) { return *m_volume; } } { WriteLock lock(m_mutex); if (!m_volume.hasValue()) { double volume = 0.0; for (const auto& shape : m_shapes) { volume += (shape.first)->getVolume(); } m_volume = volume; } return *m_volume; } } Vector3d CompoundShape::getCenter() const { { ReadLock lock(m_mutex); if (m_center.hasValue()) { return *m_center; } } { WriteLock lock(m_mutex); if (!m_center.hasValue()) { Vector3d result = Vector3d::Zero(); if (m_shapes.size() > 0) { double total = 0.0; for (const auto& shape : m_shapes) { double volume = shape.first->getVolume(); result += shape.second * (shape.first->getCenter()) * volume; total += volume; } result /= total; // We have it, write the total volume as well ... m_volume = total; } m_center = result; } return *m_center; } } Matrix33d CompoundShape::getSecondMomentOfVolume() const { // Calculate the compound values, this needs to be done outside of the ReadLock, otherwise // this might freeze up auto center = getCenter(); { ReadLock lock(m_mutex); if (m_secondMoment.hasValue()) { return *m_secondMoment; } } { WriteLock lock(m_mutex); if (!m_secondMoment.hasValue()) { Matrix33d result = Matrix33d::Zero(); if (m_shapes.size() > 0) { for (const auto& subShape : m_shapes) { const auto& shape = subShape.first; const auto& pose = subShape.second; const auto& r = pose.linear(); Matrix33d skew = makeSkewSymmetricMatrix((center - pose * shape->getCenter()).eval()); Matrix33d inertia = r * shape->getSecondMomentOfVolume() * r.transpose() - shape->getVolume() * skew * skew; result += inertia; } } m_secondMoment = result; } return *m_secondMoment; } } bool CompoundShape::isValid() const { return true; } const Math::Aabbd& CompoundShape::getBoundingBox() const { { ReadLock lock(m_mutex); if (m_localAabb.hasValue()) { return *m_localAabb; } } { WriteLock lock(m_mutex); if (!m_localAabb.hasValue()) { Math::Aabbd result; for (const auto& subShape : m_shapes) { result.extend(Math::transformAabb(subShape.second, subShape.first->getBoundingBox())); } m_localAabb.setValue(result); } return *m_localAabb; } } void CompoundShape::invalidateData() { m_volume.invalidate(); m_center.invalidate(); m_secondMoment.invalidate(); m_localAabb.invalidate(); } size_t CompoundShape::addShape(const std::shared_ptr& shape, const RigidTransform3d& pose) { WriteLock lock(m_mutex); m_shapes.emplace_back(shape, pose); invalidateData(); return m_shapes.size() - 1; } void CompoundShape::setShapes(const std::vector& shapes) { WriteLock lock(m_mutex); m_shapes = shapes; invalidateData(); } const std::vector& CompoundShape::getShapes() const { ReadLock lock(m_mutex); return m_shapes; } const std::shared_ptr& CompoundShape::getShape(size_t index) const { ReadLock lock(m_mutex); SURGSIM_ASSERT(index < m_shapes.size()) << "Shape index out of range."; return m_shapes[index].first; } RigidTransform3d CompoundShape::getPose(size_t index) const { ReadLock lock(m_mutex); SURGSIM_ASSERT(index < m_shapes.size()) << "Shape index out of range."; return m_shapes[index].second; } void CompoundShape::setPoses(const std::vector& poses) { WriteLock lock(m_mutex); SURGSIM_ASSERT(poses.size() == m_shapes.size()) << "New poses and number of shapes differ in size"; size_t i = 0; for (auto& shape : m_shapes) { shape.second = poses[i++]; } invalidateData(); } void CompoundShape::setPose(size_t index, const RigidTransform3d& pose) { WriteLock(m_mutex); SURGSIM_ASSERT(index < m_shapes.size()) << "Shape index out of range."; m_shapes[index].second = pose; invalidateData(); } size_t CompoundShape::getNumShapes() const { ReadLock lock(m_mutex); return m_shapes.size(); } void CompoundShape::clearShapes() { WriteLock lock(m_mutex); m_shapes.clear(); invalidateData(); } bool CompoundShape::isTransformable() const { return true; } std::shared_ptr CompoundShape::getTransformed(const RigidTransform3d& pose) const { auto transformed = std::make_shared(); for (const auto& shape : m_shapes) { std::shared_ptr newShape; RigidTransform3d newPose = pose * shape.second; if (shape.first->isTransformable()) { newShape = shape.first->getTransformed(newPose); } else { newShape = shape.first; } transformed->addShape(newShape, newPose); } return transformed; } } }opensurgsim-0.7.0/SurgSim/Math/CompoundShape.h000066400000000000000000000103521277777236100213150ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_MATH_COMPOUNDSHAPE_H #define SURGSIM_MATH_COMPOUNDSHAPE_H #include #include #include #include "SurgSim/Math/Shape.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/DataStructures/OptionalValue.h" namespace SurgSim { namespace Math { SURGSIM_STATIC_REGISTRATION(CompoundShape); class CompoundShape : public Shape { public: /// Constructor CompoundShape(); /// Destructor ~CompoundShape(); SURGSIM_CLASSNAME(SurgSim::Math::CompoundShape); typedef std::pair, RigidTransform3d> SubShape; /// Add a shape to this shape, you can optionally supply a pose for the added shape /// \param shape to be added /// \param pose for the newly added shape /// \return the index of the newly added shape size_t addShape(const std::shared_ptr& shape, const RigidTransform3d& pose = RigidTransform3d::Identity()); /// Sets the shapes for this object, the shapes should be a list of shapes together with their respective poses, /// this will clear all the previously contained shapes /// \param shapes list of shapes void setShapes(const std::vector& shapes); /// \return all the contained shapes and their respective poses const std::vector& getShapes() const; /// \return a specific shape /// \throws SurgSim::AssertionFailure if the index exceeds the current number of shapes const std::shared_ptr& getShape(size_t index) const; /// \return the pose of a specific shape /// \throws SurgSim::AssertionFailure if the index exceeds the current number of shapes RigidTransform3d getPose(size_t index) const; /// Sets the poses for all shapes /// \param poses array of poses to be copied to each shape /// \throws SurgSimm::AssertialFailure if the size of poses.size() != getNumShapes() void setPoses(const std::vector& poses); /// Set the pose for the specified shape /// \param index index of the target shape /// \param pose new pose for the indicated shape /// \throws SurgSim::AssertionFailure if the index exceeds the current number of shapes void setPose(size_t index, const RigidTransform3d& pose); /// \return the number of shapes in this shape size_t getNumShapes() const; /// clears all the enclosed shapes void clearShapes(); int getType() const override; /// \return the volume of the shape /// \note that currently this is a very simple sum of all the volumes of the enclosed shapes it will /// disregard any overlapping shapes. double getVolume() const override; Vector3d getCenter() const override; Matrix33d getSecondMomentOfVolume() const override; bool isValid() const override; const Math::Aabbd& getBoundingBox() const override; bool isTransformable() const override; std::shared_ptr getTransformed(const RigidTransform3d& pose) const override; private: /// Clears the data for the volume, center and secondMoment and aabb /// so it can be recalculated when needed again void invalidateData(); std::vector m_shapes; typedef boost::shared_lock ReadLock; typedef boost::unique_lock WriteLock; mutable boost::shared_mutex m_mutex; ///@{ /// Storage for the physical properties of this shape /// mutable so they can be recalculated inside the /// const functions getVolume(), getCenter(), getSecondMommentOfVolume() mutable DataStructures::OptionalValue m_center; mutable DataStructures::OptionalValue m_volume; mutable DataStructures::OptionalValue m_secondMoment; mutable DataStructures::OptionalValue m_localAabb; ///@} }; } } #endif opensurgsim-0.7.0/SurgSim/Math/CubicSolver-inl.h000066400000000000000000000071241277777236100215530ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_MATH_CUBICSOLVER_INL_H #define SURGSIM_MATH_CUBICSOLVER_INL_H #include #include #include #include "SurgSim/Math/IntervalArithmetic.h" #include "SurgSim/Math/PolynomialRoots.h" using boost::math::tools::bisect; namespace SurgSim { namespace Math { template int findRootsInRange01(const Polynomial& p, std::array* roots) { int numberOfRoots = 0; boost::math::tools::eps_tolerance tolerance(std::numeric_limits::digits - 3); const T epsilon = 4 * std::numeric_limits::epsilon(); // Is degenerate? if (isNearZero(p.getCoefficient(3), epsilon)) { Polynomial quadratic(p.getCoefficient(0), p.getCoefficient(1), p.getCoefficient(2)); PolynomialRoots quadraticRoots(quadratic, std::numeric_limits::epsilon()); for (int i = 0; i < quadraticRoots.getNumRoots(); ++i) { if (quadraticRoots[i] >= 0.0 && quadraticRoots[i] <= 1.0) { (*roots)[numberOfRoots++] = quadraticRoots[i]; } } return numberOfRoots; } PolynomialRoots stationaryPoints(p.derivative(), std::numeric_limits::epsilon()); if (stationaryPoints.getNumRoots() < 2 || !Interval(0, 1).overlapsWith(Interval(stationaryPoints[0], stationaryPoints[1]))) { T p0 = p.getCoefficient(0); // p.evaluate(static_cast(0)); if (isNearZero(p0, epsilon)) { (*roots)[0] = 0.0; return 1; } T p1 = p.evaluate(static_cast(1)); if (isNearZero(p1, epsilon)) { (*roots)[0] = static_cast(1); return 1; } if (p0 * p1 < 0) { auto bracket = bisect(p, static_cast(0), static_cast(1), tolerance); (*roots)[0] = (bracket.first + bracket.second) * 0.5; return 1; } } else { // Build the monotonic intervals partitioning [0..1] to be analyzed one by one // #performance HS-2016-feb-17 Test with boost::static_vector as this gets used by the CCD std::vector> intervals; T lastValue = static_cast(0); if (stationaryPoints[0] > static_cast(0)) { intervals.emplace_back(lastValue, stationaryPoints[0]); lastValue = stationaryPoints[0]; } if (stationaryPoints[1] < static_cast(1)) { intervals.emplace_back(lastValue, stationaryPoints[1]); lastValue = stationaryPoints[1]; } intervals.emplace_back(lastValue, static_cast(1)); for (auto interval : intervals) { // On each interval, only 1 root can be found T pMin = p.evaluate(interval.getMin()); if (isNearZero(pMin, epsilon)) { (*roots)[numberOfRoots++] = interval.getMin(); } else { T pMax = p.evaluate(interval.getMax()); if (isNearZero(pMax, epsilon)) { (*roots)[numberOfRoots++] = interval.getMax(); } else if (pMin * pMax < 0) { auto bracket = bisect(p, interval.getMin(), interval.getMax(), tolerance); (*roots)[numberOfRoots++] = (bracket.first + bracket.second) * 0.5; } } } } return numberOfRoots; } }; // Math }; // SurgSim #endif // SURGSIM_MATH_CUBICSOLVER_INL_H opensurgsim-0.7.0/SurgSim/Math/CubicSolver.h000066400000000000000000000036501277777236100207730ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_MATH_CUBICSOLVER_H #define SURGSIM_MATH_CUBICSOLVER_H #include "SurgSim/Math/Polynomial.h" namespace SurgSim { namespace Math { /// Find all roots in range \f$[0 \ldotp\ldotp 1]\f$ of a cubic equation /// \tparam T The equation coefficient type /// \param polynomial The cubic polynomial \f$ax^3 + bx^2 + cx + d\f$ /// \param[out] roots All roots ordered ascendingly in \f$[0 \ldotp\ldotp 1]\f$ if any (3 max) /// \return The number of roots found in \f$[0 \ldotp\ldotp 1]\f$ and saved in roots. /// \f[ /// \begin{array}{lll} /// P(x) &=& ax^3 + bx^2 + cx + d \\ \text{} /// P'(x) &=& 3ax^2 + 2bx + c \Rightarrow \Delta = (2b)^2 - 4(3a)(c) = 4(b^2 - 3ac) /// \end{array} /// \\ \text{} /// \left\{ /// \begin{array}{ll} /// \Delta < 0 & \text{P is monotonic, P' is always the same sign, the sign of P'(0) = sign(c)} \\ \text{} /// \Delta = 0 & \text{P is monotonic with an inflection point, P' is always the same sign, except at P'(root) = 0} /// \\ \text{} /// \Delta > 0 & \text{P is monotonic on 3 separate intervals} /// \end{array} /// \right. /// \f] template int findRootsInRange01(const Polynomial& polynomial, std::array* roots); }; // Math }; // SurgSim #include "SurgSim/Math/CubicSolver-inl.h" #endif // SURGSIM_MATH_CUBICSOLVER_H opensurgsim-0.7.0/SurgSim/Math/CylinderShape.cpp000066400000000000000000000046541277777236100216450ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Math/CylinderShape.h" namespace SurgSim { namespace Math { SURGSIM_REGISTER(SurgSim::Math::Shape, SurgSim::Math::CylinderShape, CylinderShape); CylinderShape::CylinderShape(double length, double radius) : m_length(length), m_radius(radius) { SURGSIM_ADD_SERIALIZABLE_PROPERTY(CylinderShape, double, Radius, getRadius, setRadius); SURGSIM_ADD_SERIALIZABLE_PROPERTY(CylinderShape, double, Length, getLength, setLength); updateAabb(); } int CylinderShape::getType() const { return SHAPE_TYPE_CYLINDER; } double CylinderShape::getLength() const { return m_length; } double CylinderShape::getRadius() const { return m_radius; } void CylinderShape::setLength(double length) { m_length = length; updateAabb(); } void CylinderShape::setRadius(double radius) { m_radius = radius; updateAabb(); } void CylinderShape::updateAabb() { m_aabb.setEmpty(); m_aabb.extend(Vector3d(-m_radius, -m_length / 2.0, -m_radius)); m_aabb.extend(Vector3d(m_radius, m_length / 2.0, m_radius)); } double CylinderShape::getVolume() const { return M_PI * m_radius * m_radius * m_length; } SurgSim::Math::Vector3d CylinderShape::getCenter() const { return Vector3d(0.0, 0.0, 0.0); } SurgSim::Math::Matrix33d CylinderShape::getSecondMomentOfVolume() const { const double volume = getVolume(); const double coef = 1.0 / 12.0 * volume; const double coefDir = 1.0 / 2.0 * volume; const double squareL = m_length * m_length; const double squareRadius = m_radius * m_radius; Matrix33d secondMoment; secondMoment.setZero(); secondMoment.diagonal().setConstant(coef * (3.0 * squareRadius + squareL)); secondMoment(1, 1) = coefDir * (squareRadius); return secondMoment; } bool CylinderShape::isValid() const { return (m_length >= 0) && (m_radius >= 0); } }; // namespace Math }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Math/CylinderShape.h000066400000000000000000000050261277777236100213040ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_MATH_CYLINDERSHAPE_H #define SURGSIM_MATH_CYLINDERSHAPE_H #include "SurgSim/Framework/ObjectFactory.h" #include "SurgSim/Math/Shape.h" namespace SurgSim { namespace Math { SURGSIM_STATIC_REGISTRATION(CylinderShape); /// Cylinder shape: centered on (0 0 0), aligned along Y, /// defined with length and radius. class CylinderShape: public Shape { public: /// Constructor /// \param length The length of the cylinder (in m) /// \param radius The cylinder radius (in m) explicit CylinderShape(double length = 0.0, double radius = 0.0); SURGSIM_CLASSNAME(SurgSim::Math::CylinderShape); /// \return the type of the shape int getType() const override; /// Get the cylinder length /// \return The cylinder length (in m) double getLength() const; /// Get the cylinder radius /// \return The cylinder radius (in m) double getRadius() const; /// Get the volume of the shape /// \return The volume of the shape (in m-3) double getVolume() const override; /// Get the volumetric center of the shape /// \return The center of the shape Vector3d getCenter() const override; /// Get the second central moment of the volume, commonly used /// to calculate the moment of inertia matrix /// \return The 3x3 symmetric second moment matrix Matrix33d getSecondMomentOfVolume() const override; /// \return True if length and radius are bigger than or equal to 0; Otherwise, false. bool isValid() const override; protected: // Setters in 'protected' sections are for serialization purpose only. /// Set the cylinder length /// \param length The capsule length (in m) void setLength(double length); /// Set the cylinder radius /// \param radius The capsule radius (in m) void setRadius(double radius); private: void updateAabb(); /// The cylinder length double m_length; /// The cylinder radius double m_radius; }; }; // Math }; // SurgSim #endif // SURGSIM_MATH_CYLINDERSHAPE_H opensurgsim-0.7.0/SurgSim/Math/DoubleSidedPlaneShape.cpp000066400000000000000000000027731277777236100232370ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Math/DoubleSidedPlaneShape.h" namespace SurgSim { namespace Math { SURGSIM_REGISTER(SurgSim::Math::Shape, SurgSim::Math::DoubleSidedPlaneShape, DoubleSidedPlaneShape); DoubleSidedPlaneShape::DoubleSidedPlaneShape() { } int DoubleSidedPlaneShape::getType() const { return SHAPE_TYPE_DOUBLESIDEDPLANE; } double DoubleSidedPlaneShape::getVolume() const { return 0.0; } SurgSim::Math::Vector3d DoubleSidedPlaneShape::getCenter() const { return Vector3d(0.0, 0.0, 0.0); } SurgSim::Math::Matrix33d DoubleSidedPlaneShape::getSecondMomentOfVolume() const { return Matrix33d::Zero(); } double DoubleSidedPlaneShape::getD() const { return 0.0; } SurgSim::Math::Vector3d DoubleSidedPlaneShape::getNormal() const { return Vector3d(0.0, 1.0, 0.0); } bool DoubleSidedPlaneShape::isValid() const { return true; } }; // namespace Math }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Math/DoubleSidedPlaneShape.h000066400000000000000000000040501277777236100226720ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_MATH_DOUBLESIDEDPLANESHAPE_H #define SURGSIM_MATH_DOUBLESIDEDPLANESHAPE_H #include "SurgSim/Framework/ObjectFactory.h" #include "SurgSim/Math/Shape.h" namespace SurgSim { namespace Math { SURGSIM_STATIC_REGISTRATION(DoubleSidedPlaneShape); /// DoubleSidedPlaneShape: The XZ plane (d = 0) with normal pointing along /// positive Y axis. class DoubleSidedPlaneShape: public Shape { public: /// Constructor DoubleSidedPlaneShape(); SURGSIM_CLASSNAME(SurgSim::Math::DoubleSidedPlaneShape); /// \return the type of the shape int getType() const override; /// Get the volume of the shape /// \return The volume of the shape (in m-3) double getVolume() const override; /// Get the volumetric center of the shape /// \return The center of the shape Vector3d getCenter() const override; /// Get the second central moment of the volume, commonly used /// to calculate the moment of inertia matrix /// \return The 3x3 symmetric second moment matrix Matrix33d getSecondMomentOfVolume() const override; /// Gets the d of the plane equation. /// \return The value of d (always 0). double getD() const; /// Gets the normal of the plane equation. /// \return The value of the normal (always Y axis). Vector3d getNormal() const; /// A DoubleSidedPlaneShape is always valid. /// \return True. bool isValid() const override; }; }; // Math }; // SurgSim #endif // SURGSIM_MATH_DOUBLESIDEDPLANESHAPE_H opensurgsim-0.7.0/SurgSim/Math/GaussLegendreQuadrature.cpp000066400000000000000000000304411277777236100236720ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Math/GaussLegendreQuadrature.h" namespace SurgSim { namespace Math { const std::array gaussQuadrature1Point = {{ gaussQuadraturePoint(0.0, 2.0) }}; const std::array gaussQuadrature2Points = {{ gaussQuadraturePoint( 1.0 / sqrt(3.0), 1.0), gaussQuadraturePoint(-1.0 / sqrt(3.0), 1.0) }}; const std::array gaussQuadrature3Points = {{ gaussQuadraturePoint( 0.0, 8.0 / 9.0), gaussQuadraturePoint( sqrt(3.0 / 5.0), 5.0 / 9.0), gaussQuadraturePoint(-sqrt(3.0 / 5.0), 5.0 / 9.0) }}; const std::array gaussQuadrature4Points = {{ gaussQuadraturePoint( sqrt((3.0 - 2.0 * sqrt(6.0 / 5.0)) / 7.0), (18.0 + sqrt(30.0)) / 36.0), gaussQuadraturePoint(-sqrt((3.0 - 2.0 * sqrt(6.0 / 5.0)) / 7.0), (18.0 + sqrt(30.0)) / 36.0), gaussQuadraturePoint( sqrt((3.0 + 2.0 * sqrt(6.0 / 5.0)) / 7.0), (18.0 - sqrt(30.0)) / 36.0), gaussQuadraturePoint(-sqrt((3.0 + 2.0 * sqrt(6.0 / 5.0)) / 7.0), (18.0 - sqrt(30.0)) / 36.0) }}; const std::array gaussQuadrature5Points = {{ gaussQuadraturePoint( 0.0, 128.0 / 225.0), gaussQuadraturePoint( sqrt(5.0 - 2.0 * sqrt(10.0 / 7.0)) / 3.0, (322.0 + 13.0 * sqrt(70.0)) / 900.0), gaussQuadraturePoint(-sqrt(5.0 - 2.0 * sqrt(10.0 / 7.0)) / 3.0, (322.0 + 13.0 * sqrt(70.0)) / 900.0), gaussQuadraturePoint( sqrt(5.0 + 2.0 * sqrt(10.0 / 7.0)) / 3.0, (322.0 - 13.0 * sqrt(70.0)) / 900.0), gaussQuadraturePoint(-sqrt(5.0 + 2.0 * sqrt(10.0 / 7.0)) / 3.0, (322.0 - 13.0 * sqrt(70.0)) / 900.0) }}; const std::array gaussQuadrature100Points = {{ gaussQuadraturePoint( 0.0156289844215430828722167, 0.0312554234538633569476425), gaussQuadraturePoint(-0.0156289844215430828722167, 0.0312554234538633569476425), gaussQuadraturePoint( 0.0468716824215916316149239, 0.0312248842548493577323765), gaussQuadraturePoint(-0.0468716824215916316149239, 0.0312248842548493577323765), gaussQuadraturePoint( 0.0780685828134366366948174, 0.0311638356962099067838183), gaussQuadraturePoint(-0.0780685828134366366948174, 0.0311638356962099067838183), gaussQuadraturePoint( 0.1091892035800611150034260, 0.0310723374275665165878102), gaussQuadraturePoint(-0.1091892035800611150034260, 0.0310723374275665165878102), gaussQuadraturePoint( 0.1402031372361139732075146, 0.0309504788504909882340635), gaussQuadraturePoint(-0.1402031372361139732075146, 0.0309504788504909882340635), gaussQuadraturePoint( 0.1710800805386032748875324, 0.0307983790311525904277139), gaussQuadraturePoint(-0.1710800805386032748875324, 0.0307983790311525904277139), gaussQuadraturePoint( 0.2017898640957359972360489, 0.0306161865839804484964594), gaussQuadraturePoint(-0.2017898640957359972360489, 0.0306161865839804484964594), gaussQuadraturePoint( 0.2323024818449739696495100, 0.0304040795264548200165079), gaussQuadraturePoint(-0.2323024818449739696495100, 0.0304040795264548200165079), gaussQuadraturePoint( 0.2625881203715034791689293, 0.0301622651051691449190687), gaussQuadraturePoint(-0.2625881203715034791689293, 0.0301622651051691449190687), gaussQuadraturePoint( 0.2926171880384719647375559, 0.0298909795933328309168368), gaussQuadraturePoint(-0.2926171880384719647375559, 0.0298909795933328309168368), gaussQuadraturePoint( 0.3223603439005291517224766, 0.0295904880599126425117545), gaussQuadraturePoint(-0.3223603439005291517224766, 0.0295904880599126425117545), gaussQuadraturePoint( 0.3517885263724217209723438, 0.0292610841106382766201190), gaussQuadraturePoint(-0.3517885263724217209723438, 0.0292610841106382766201190), gaussQuadraturePoint( 0.3808729816246299567633625, 0.0289030896011252031348762), gaussQuadraturePoint(-0.3808729816246299567633625, 0.0289030896011252031348762), gaussQuadraturePoint( 0.4095852916783015425288684, 0.0285168543223950979909368), gaussQuadraturePoint(-0.4095852916783015425288684, 0.0285168543223950979909368), gaussQuadraturePoint( 0.4378974021720315131089780, 0.0281027556591011733176483), gaussQuadraturePoint(-0.4378974021720315131089780, 0.0281027556591011733176483), gaussQuadraturePoint( 0.4657816497733580422492166, 0.0276611982207923882942042), gaussQuadraturePoint(-0.4657816497733580422492166, 0.0276611982207923882942042), gaussQuadraturePoint( 0.4932107892081909335693088, 0.0271926134465768801364916), gaussQuadraturePoint(-0.4932107892081909335693088, 0.0271926134465768801364916), gaussQuadraturePoint( 0.5201580198817630566468157, 0.0266974591835709626603847), gaussQuadraturePoint(-0.5201580198817630566468157, 0.0266974591835709626603847), gaussQuadraturePoint( 0.5465970120650941674679943, 0.0261762192395456763423087), gaussQuadraturePoint(-0.5465970120650941674679943, 0.0261762192395456763423087), gaussQuadraturePoint( 0.5725019326213811913168704, 0.0256294029102081160756420), gaussQuadraturePoint(-0.5725019326213811913168704, 0.0256294029102081160756420), gaussQuadraturePoint( 0.5978474702471787212648065, 0.0250575444815795897037642), gaussQuadraturePoint(-0.5978474702471787212648065, 0.0250575444815795897037642), gaussQuadraturePoint( 0.6226088602037077716041908, 0.0244612027079570527199750), gaussQuadraturePoint(-0.6226088602037077716041908, 0.0244612027079570527199750), gaussQuadraturePoint( 0.6467619085141292798326303, 0.0238409602659682059625604), gaussQuadraturePoint(-0.6467619085141292798326303, 0.0238409602659682059625604), gaussQuadraturePoint( 0.6702830156031410158025870, 0.0231974231852541216224889), gaussQuadraturePoint(-0.6702830156031410158025870, 0.0231974231852541216224889), gaussQuadraturePoint( 0.6931491993558019659486479, 0.0225312202563362727017970), gaussQuadraturePoint(-0.6931491993558019659486479, 0.0225312202563362727017970), gaussQuadraturePoint( 0.7153381175730564464599671, 0.0218430024162473863139537), gaussQuadraturePoint(-0.7153381175730564464599671, 0.0218430024162473863139537), gaussQuadraturePoint( 0.7368280898020207055124277, 0.0211334421125276415426723), gaussQuadraturePoint(-0.7368280898020207055124277, 0.0211334421125276415426723), gaussQuadraturePoint( 0.7575981185197071760356680, 0.0204032326462094327668389), gaussQuadraturePoint(-0.7575981185197071760356680, 0.0204032326462094327668389), gaussQuadraturePoint( 0.7776279096494954756275514, 0.0196530874944353058653815), gaussQuadraturePoint(-0.7776279096494954756275514, 0.0196530874944353058653815), gaussQuadraturePoint( 0.7968978923903144763895729, 0.0188837396133749045529412), gaussQuadraturePoint(-0.7968978923903144763895729, 0.0188837396133749045529412), gaussQuadraturePoint( 0.8153892383391762543939888, 0.0180959407221281166643908), gaussQuadraturePoint(-0.8153892383391762543939888, 0.0180959407221281166643908), gaussQuadraturePoint( 0.8330838798884008235429158, 0.0172904605683235824393442), gaussQuadraturePoint(-0.8330838798884008235429158, 0.0172904605683235824393442), gaussQuadraturePoint( 0.8499645278795912842933626, 0.0164680861761452126431050), gaussQuadraturePoint(-0.8499645278795912842933626, 0.0164680861761452126431050), gaussQuadraturePoint( 0.8660146884971646234107400, 0.0156296210775460027239369), gaussQuadraturePoint(-0.8660146884971646234107400, 0.0156296210775460027239369), gaussQuadraturePoint( 0.8812186793850184155733168, 0.0147758845274413017688800), gaussQuadraturePoint(-0.8812186793850184155733168, 0.0147758845274413017688800), gaussQuadraturePoint( 0.8955616449707269866985210, 0.0139077107037187726879541), gaussQuadraturePoint(-0.8955616449707269866985210, 0.0139077107037187726879541), gaussQuadraturePoint( 0.9090295709825296904671263, 0.0130259478929715422855586), gaussQuadraturePoint(-0.9090295709825296904671263, 0.0130259478929715422855586), gaussQuadraturePoint( 0.9216092981453339526669513, 0.0121314576629794974077448), gaussQuadraturePoint(-0.9216092981453339526669513, 0.0121314576629794974077448), gaussQuadraturePoint( 0.9332885350430795459243337, 0.0112251140231859771172216), gaussQuadraturePoint(-0.9332885350430795459243337, 0.0112251140231859771172216), gaussQuadraturePoint( 0.9440558701362559779627747, 0.0103078025748689695857821), gaussQuadraturePoint(-0.9440558701362559779627747, 0.0103078025748689695857821), gaussQuadraturePoint( 0.9539007829254917428493369, 0.0093804196536944579514182), gaussQuadraturePoint(-0.9539007829254917428493369, 0.0093804196536944579514182), gaussQuadraturePoint( 0.9628136542558155272936593, 0.0084438714696689714026208), gaussQuadraturePoint(-0.9628136542558155272936593, 0.0084438714696689714026208), gaussQuadraturePoint( 0.9707857757637063319308979, 0.0074990732554647115788287), gaussQuadraturePoint(-0.9707857757637063319308979, 0.0074990732554647115788287), gaussQuadraturePoint( 0.9778093584869182885537811, 0.0065469484508453227641521), gaussQuadraturePoint(-0.9778093584869182885537811, 0.0065469484508453227641521), gaussQuadraturePoint( 0.9838775407060570154961002, 0.0055884280038655151572119), gaussQuadraturePoint(-0.9838775407060570154961002, 0.0055884280038655151572119), gaussQuadraturePoint( 0.9889843952429917480044187, 0.0046244500634221193510958), gaussQuadraturePoint(-0.9889843952429917480044187, 0.0046244500634221193510958), gaussQuadraturePoint( 0.9931249370374434596520099, 0.0036559612013263751823425), gaussQuadraturePoint(-0.9931249370374434596520099, 0.0036559612013263751823425), gaussQuadraturePoint( 0.9962951347331251491861317, 0.0026839253715534824194396), gaussQuadraturePoint(-0.9962951347331251491861317, 0.0026839253715534824194396), gaussQuadraturePoint( 0.9984919506395958184001634, 0.0017093926535181052395294), gaussQuadraturePoint(-0.9984919506395958184001634, 0.0017093926535181052395294), gaussQuadraturePoint( 0.9997137267734412336782285, 0.0007346344905056717304063), gaussQuadraturePoint(-0.9997137267734412336782285, 0.0007346344905056717304063) }}; const std::array gaussQuadrature2DTriangle3Points = {{ gaussQuadratureTrianglePoint(1.0 / 2.0, 1.0 / 2.0, 1.0 / 3.0), gaussQuadratureTrianglePoint(1.0 / 2.0, 0.0, 1.0 / 3.0), gaussQuadratureTrianglePoint(0.0 , 1.0 / 2.0, 1.0 / 3.0) }}; const std::array gaussQuadrature2DTriangle6Points = {{ gaussQuadratureTrianglePoint(0.44594849091597, 0.44594849091597, 0.22338158967801), gaussQuadratureTrianglePoint(0.44594849091597, 0.10810301816807, 0.22338158967801), gaussQuadratureTrianglePoint(0.10810301816807, 0.44594849091597, 0.22338158967801), gaussQuadratureTrianglePoint(0.09157621350977, 0.09157621350977, 0.10995174365532), gaussQuadratureTrianglePoint(0.09157621350977, 0.81684757298046, 0.10995174365532), gaussQuadratureTrianglePoint(0.81684757298046, 0.09157621350977, 0.10995174365532) }}; const std::array gaussQuadrature2DTriangle12Points = {{ gaussQuadratureTrianglePoint(0.24928674517091, 0.24928674517091, 0.11678627572638), gaussQuadratureTrianglePoint(0.24928674517091, 0.50142650965818, 0.11678627572638), gaussQuadratureTrianglePoint(0.50142650965818, 0.24928674517091, 0.11678627572638), gaussQuadratureTrianglePoint(0.06308901449150, 0.06308901449150, 0.05084490637021), gaussQuadratureTrianglePoint(0.06308901449150, 0.87382197101700, 0.05084490637021), gaussQuadratureTrianglePoint(0.87382197101700, 0.06308901449150, 0.05084490637021), gaussQuadratureTrianglePoint(0.31035245103378, 0.63650249912140, 0.08285107561837), gaussQuadratureTrianglePoint(0.63650249912140, 0.05314504984482, 0.08285107561837), gaussQuadratureTrianglePoint(0.05314504984482, 0.31035245103378, 0.08285107561837), gaussQuadratureTrianglePoint(0.63650249912140, 0.31035245103378, 0.08285107561837), gaussQuadratureTrianglePoint(0.31035245103378, 0.05314504984482, 0.08285107561837), gaussQuadratureTrianglePoint(0.05314504984482, 0.63650249912140, 0.08285107561837) }}; }; // namespace Math }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Math/GaussLegendreQuadrature.h000066400000000000000000000207041277777236100233400ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Definitions of a n-point Gaussian quadrature rule (a.k.a. Gauss-Legendre quadrature rule) /// http://en.wikipedia.org/wiki/Gaussian_quadrature #ifndef SURGSIM_MATH_GAUSSLEGENDREQUADRATURE_H #define SURGSIM_MATH_GAUSSLEGENDREQUADRATURE_H #include #include namespace SurgSim { namespace Math { /// 1D Gauss-Legendre quadrature struct gaussQuadraturePoint { gaussQuadraturePoint(double p, double w) : point(p), weight(w){} const double point; const double weight; }; /// 2D Gauss-Legendre quadrature on a triangle /// \note In a triangle ABC, a point \f$P\f$ is defined by its parametrized coordinate \f$(\xi, \eta)\f$ as /// \note \f$P = A + \xi.AB + \eta.AC\f$ struct gaussQuadratureTrianglePoint { gaussQuadratureTrianglePoint(double xi, double eta, double w) : coordinateXi(xi), coordinateEta(eta), weight(w){} const double coordinateXi; ///< \f$\xi \in [0, 1]\f$, must verify \f$\xi + \eta \leq 1.0\f$ const double coordinateEta; ///< \f$\eta \in [0, 1]\f$, must verify \f$\xi + \eta \leq 1.0\f$ const double weight; }; /// 1D 1-point Gauss-Legendre quadrature \f${}\f$ /// \note Gauss-Legendre quadrature numerically evaluates the integral of a function \f$f\f$ with a finite sum /// using some weights and specific points of evaluation of the function \f$f\f$: /// \note \f$\int_{-1}^{+1} f(x) dx = \sum_{i=1}^n w_i f(x_i)\f$ /// \note n is the number of points used to discretized the integral /// \note \f$x_i\f$ is the point to evaluate the function \f$f\f$ with /// \note \f$w_i\f$ is the weight to assign to the function evaluation at the given point \f$x_i\f$ extern const std::array gaussQuadrature1Point; /// 1D 2-points Gauss-Legendre quadrature \f${, }\f$ /// \note Gauss-Legendre quadrature numerically evaluates the integral of a function \f$f\f$ with a finite sum /// using some weights and specific points of evaluation of the function \f$f\f$: /// \note \f$\int_{-1}^{+1} f(x) dx = \sum_{i=1}^n w_i f(x_i)\f$ /// \note n is the number of points used to discretized the integral /// \note \f$x_i\f$ is the point to evaluate the function \f$f\f$ with /// \note \f$w_i\f$ is the weight to assign to the function evaluation at the given point \f$x_i\f$ extern const std::array gaussQuadrature2Points; /// 1D 3-points Gauss-Legendre quadrature \f${, , }\f$ /// \note Gauss-Legendre quadrature numerically evaluates the integral of a function \f$f\f$ with a finite sum /// using some weights and specific points of evaluation of the function \f$f\f$: /// \note \f$\int_{-1}^{+1} f(x) dx = \sum_{i=1}^n w_i f(x_i)\f$ /// \note n is the number of points used to discretized the integral /// \note \f$x_i\f$ is the point to evaluate the function \f$f\f$ with /// \note \f$w_i\f$ is the weight to assign to the function evaluation at the given point \f$x_i\f$ extern const std::array gaussQuadrature3Points; /// 1D 4-points Gauss-Legendre quadrature \f${, , , }\f$ /// \note Gauss-Legendre quadrature numerically evaluates the integral of a function \f$f\f$ with a finite sum /// using some weights and specific points of evaluation of the function \f$f\f$: /// \note \f$\int_{-1}^{+1} f(x) dx = \sum_{i=1}^n w_i f(x_i)\f$ /// \note n is the number of points used to discretized the integral /// \note \f$x_i\f$ is the point to evaluate the function \f$f\f$ with /// \note \f$w_i\f$ is the weight to assign to the function evaluation at the given point \f$x_i\f$ extern const std::array gaussQuadrature4Points; /// 1D 5-points Gauss-Legendre quadrature \f${, , , , }\f$ /// \note Gauss-Legendre quadrature numerically evaluates the integral of a function \f$f\f$ with a finite sum /// using some weights and specific points of evaluation of the function \f$f\f$: /// \note \f$\int_{-1}^{+1} f(x) dx = \sum_{i=1}^n w_i f(x_i)\f$ /// \note n is the number of points used to discretized the integral /// \note \f$x_i\f$ is the point to evaluate the function \f$f\f$ with /// \note \f$w_i\f$ is the weight to assign to the function evaluation at the given point \f$x_i\f$ extern const std::array gaussQuadrature5Points; /// 1D 100-points Gauss-Legendre quadrature \f${, , , ..., }\f$ /// \note Gauss-Legendre quadrature numerically evaluates the integral of a function \f$f\f$ with a finite sum /// using some weights and specific points of evaluation of the function \f$f\f$: /// \note \f$\int_{-1}^{+1} f(x) dx = \sum_{i=1}^n w_i f(x_i)\f$ /// \note n is the number of points used to discretized the integral /// \note \f$x_i\f$ is the point to evaluate the function \f$f\f$ with /// \note \f$w_i\f$ is the weight to assign to the function evaluation at the given point \f$x_i\f$ extern const std::array gaussQuadrature100Points; // http://math2.uncc.edu/~shaodeng/TEACHING/math5172/Lectures/Lect_15.PDF // "Quadrature Formulas in Two Dimensions" // \int_0^1 \int_0^{1-eta} f(xi, eta) dxi deta = 1/2 sum_i w[i] f(xi[i], eta[i]) /// 2D triangle Gauss-Legendre quadrature 3-points \f${<\xi_1, \eta_1, w_1>, ..., <\xi_3, \eta_3, w_3>}\f$ /// \note Gauss-Legendre quadrature numerically evaluates the integral of a function \f$f(\xi, \eta)\f$ with a /// finite sum using some weights and specific points on the triangle. /// \note \f$\int_{0}^{1} \int_{0}^{1-\eta} f(\xi, \eta) d\xi d\eta = \sum_{i=1}^n w_i f(\xi_i, \eta_i)\f$ /// \note n is the number of points used to discretized the integral /// \note \f$(\xi_i, \eta_i)\f$ is the parametrized location of the triangle point to evaluate the function with /// \note \f$w_i\f$ is the weight to assign to the function evaluation at the given point /// \note A 3-points Gauss-Legendre quadrature on the triangle is exact for polynomial functions of degree 2 or less. extern const std::array gaussQuadrature2DTriangle3Points; /// 2D triangle Gauss-Legendre quadrature 6-points \f${<\xi_1, \eta_1, w_1>, ..., <\xi_6, \eta_6, w_6>}\f$ /// \note Gauss-Legendre quadrature numerically evaluates the integral of a function \f$f(\xi, \eta)\f$ with a /// finite sum using some weights and specific points on the triangle. /// \note \f$\int_{0}^{1} \int_{0}^{1-\eta} f(\xi, \eta) d\xi d\eta = \sum_{i=1}^n w_i f(\xi_i, \eta_i)\f$ /// \note n is the number of points used to discretized the integral /// \note \f$(\xi_i, \eta_i)\f$ is the parametrized location of the triangle point to evaluate the function with /// \note \f$w_i\f$ is the weight to assign to the function evaluation at the given point /// \note A 6-points Gauss-Legendre quadrature on the triangle is exact for polynomial functions of degree 4 or less. extern const std::array gaussQuadrature2DTriangle6Points; /// 2D triangle Gauss-Legendre quadrature 12-points \f${<\xi_1, \eta_1, w_1>, ..., <\xi_{12}, \eta_{12}, w_{12}>}\f$ /// \note Gauss-Legendre quadrature numerically evaluates the integral of a function \f$f(\xi, \eta)\f$ with a /// finite sum using some weights and specific points on the triangle. /// \note \f$\int_{0}^{1} \int_{0}^{1-\eta} f(\xi, \eta) d\xi d\eta = \sum_{i=1}^n w_i f(\xi_i, \eta_i)\f$ /// \note n is the number of points used to discretized the integral /// \note \f$(\xi_i, \eta_i)\f$ is the parametrized location of the triangle point to evaluate the function with /// \note \f$w_i\f$ is the weight to assign to the function evaluation at the given point /// \note A 12-points Gauss-Legendre quadrature on the triangle is exact for polynomial functions of degree 6 or less. extern const std::array gaussQuadrature2DTriangle12Points; }; // namespace Math }; // namespace SurgSim #endif // SURGSIM_MATH_GAUSSLEGENDREQUADRATURE_H opensurgsim-0.7.0/SurgSim/Math/Geometry.h000066400000000000000000002031221277777236100203420ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_MATH_GEOMETRY_H #define SURGSIM_MATH_GEOMETRY_H #include #include #include #include "SurgSim/Framework/Log.h" #include "SurgSim/Math/Polynomial.h" #include "SurgSim/Math/Vector.h" /// \file Geometry.h a collection of functions that calculation geometric properties of various basic geometric shapes. /// Point, LineSegment, Plane, Triangle. All functions are templated for the accuracy of the calculation /// (float/double). There are also three kinds of epsilon defined that are used on a case by case basis. /// In general all function here will return a floating point or boolean value and take a series of output /// parameters. When those outputs cannot be calculated their values will be set to NAN. /// This functions are meant as a basic layer that will be wrapped with calls from structures mainting more /// state information about the primitives they are handling. /// As a convention we are using a plane equation in the form nx + d = 0 /// \note HS-2013-may-07 Even though some of the names in this file do not agree with the coding standards in /// regard to the use of verbs for functions it was determined that other phrasing would not necessarily /// improve the readability or expressiveness of the function names. namespace SurgSim { namespace Math { namespace Geometry { /// Used as epsilon for general distance calculations static const double DistanceEpsilon = 1e-10; /// Used as epsilon for general distance calculations with squared distances static const double SquaredDistanceEpsilon = 1e-10; /// Epsilon used in angular comparisons static const double AngularEpsilon = 1e-10; /// Used as epsilon for scalar comparisons static const double ScalarEpsilon = 1e-10; } /// Calculate the barycentric coordinates of a point with respect to a line segment. /// \tparam T Floating point type of the calculation, can usually be inferred. /// \tparam MOpt Eigen Matrix options, can usually be inferred. /// \param pt Vertex of the point. /// \param sv0, sv1 Vertices of the line segment. /// \param [out] coordinates Barycentric coordinates. /// \return bool true on success, false if two or more if the line segment is considered degenerate /// \note The point need not be on the line segment, in which case, the barycentric coordinate of the projection /// is calculated. template inline bool barycentricCoordinates(const Eigen::Matrix& pt, const Eigen::Matrix& sv0, const Eigen::Matrix& sv1, Eigen::Matrix* coordinates) { const Eigen::Matrix line = sv1 - sv0; const T length2 = line.squaredNorm(); if (length2 < Geometry::SquaredDistanceEpsilon) { coordinates->setConstant((std::numeric_limits::quiet_NaN())); return false; } (*coordinates)[1] = (pt - sv0).dot(line) / length2; (*coordinates)[0] = static_cast(1) - (*coordinates)[1]; return true; } /// Calculate the barycentric coordinates of a point with respect to a triangle. /// \pre The normal must be unit length /// \pre The triangle vertices must be in counter clockwise order in respect to the normal /// \tparam T Floating point type of the calculation, can usually be inferred. /// \tparam MOpt Eigen Matrix options, can usually be inferred. /// \param pt Vertex of the point. /// \param tv0, tv1, tv2 Vertices of the triangle in counter clockwise order in respect to the normal. /// \param tn Normal of the triangle (yes must be of norm 1 and a,b,c CCW). /// \param [out] coordinates Barycentric coordinates. /// \return bool true on success, false if two or more if the triangle is considered degenerate template inline bool barycentricCoordinates(const Eigen::Matrix& pt, const Eigen::Matrix& tv0, const Eigen::Matrix& tv1, const Eigen::Matrix& tv2, const Eigen::Matrix& tn, Eigen::Matrix* coordinates) { const T signedTriAreaX2 = ((tv1 - tv0).cross(tv2 - tv0)).dot(tn); if (signedTriAreaX2 < Geometry::SquaredDistanceEpsilon) { // SQ_ASSERT_WARNING(false, "Cannot compute barycentric coords (degenetrate triangle), assigning center"); coordinates->setConstant((std::numeric_limits::quiet_NaN())); return false; } (*coordinates)[0] = ((tv1 - pt).cross(tv2 - pt)).dot(tn) / signedTriAreaX2; (*coordinates)[1] = ((tv2 - pt).cross(tv0 - pt)).dot(tn) / signedTriAreaX2; (*coordinates)[2] = 1 - (*coordinates)[0] - (*coordinates)[1]; return true; } /// Calculate the barycentric coordinates of a point with respect to a triangle. /// Please note that each time you use this call the normal of the triangle will be /// calculated, if you convert more than one coordinate against this triangle, precalculate /// the normal and use the other version of this function /// \tparam T Floating point type of the calculation, can usually be inferred. /// \tparam MOpt Eigen Matrix options, can usually be inferred. /// \param pt Vertex of the point. /// \param tv0, tv1, tv2 Vertices of the triangle. /// \param [out] coordinates The Barycentric coordinates. /// \return bool true on success, false if the triangle is considered degenerate template inline bool barycentricCoordinates( const Eigen::Matrix& pt, const Eigen::Matrix& tv0, const Eigen::Matrix& tv1, const Eigen::Matrix& tv2, Eigen::Matrix* coordinates) { Eigen::Matrix tn = (tv1 - tv0).cross(tv2 - tv0); double norm = tn.norm(); if (norm < Geometry::DistanceEpsilon) { coordinates->setConstant((std::numeric_limits::quiet_NaN())); return false; } tn /= norm; return barycentricCoordinates(pt, tv0, tv1, tv2, tn, coordinates); } /// Check if a point is inside a triangle /// \note Use barycentricCoordinates() if you need the coordinates /// \pre The normal must be unit length /// \pre The triangle vertices must be in counter clockwise order in respect to the normal /// \tparam T Accuracy of the calculation, can usually be inferred. /// \tparam MOpt Eigen Matrix options, can usually be inferred. /// \param pt Vertex of the point. /// \param tv0, tv1, tv2 Vertices of the triangle, must be in CCW. /// \param tn Normal of the triangle (yes must be of norm 1 and a,b,c CCW). /// \return true if pt lies inside the triangle tv0, tv1, tv2, false otherwise. template inline bool isPointInsideTriangle( const Eigen::Matrix& pt, const Eigen::Matrix& tv0, const Eigen::Matrix& tv1, const Eigen::Matrix& tv2, const Eigen::Matrix& tn) { Eigen::Matrix baryCoords; bool result = barycentricCoordinates(pt, tv0, tv1, tv2, tn, &baryCoords); return (result && baryCoords[0] >= -Geometry::ScalarEpsilon && baryCoords[1] >= -Geometry::ScalarEpsilon && baryCoords[2] >= -Geometry::ScalarEpsilon); } /// Check if a point is inside a triangle. /// \note Use barycentricCoordinates() if you need the coordinates. /// Please note that the normal will be calculated each time you use this call, if you are doing more than one /// test with the same triangle, precalculate the normal and pass it. Into the other version of this function /// \tparam T Accuracy of the calculation, can usually be inferred. /// \tparam MOpt Eigen Matrix options, can usually be inferred. /// \param pt Vertex of the point. /// \param tv0, tv1, tv2 Vertices of the triangle, must be in CCW. /// \return true if pt lies inside the triangle tv0, tv1, tv2, false otherwise. template inline bool isPointInsideTriangle( const Eigen::Matrix& pt, const Eigen::Matrix& tv0, const Eigen::Matrix& tv1, const Eigen::Matrix& tv2) { Eigen::Matrix baryCoords; bool result = barycentricCoordinates(pt, tv0, tv1, tv2, &baryCoords); return (result && baryCoords[0] >= -Geometry::ScalarEpsilon && baryCoords[1] >= -Geometry::ScalarEpsilon && baryCoords[2] >= -Geometry::ScalarEpsilon); } /// Check if a point is on the edge of a triangle. /// \note Use barycentricCoordinates() if you need the coordinates. /// \tparam T Accuracy of the calculation, can usually be inferred. /// \tparam MOpt Eigen Matrix options, can usually be inferred. /// \param pt Vertex of the point. /// \param tv0, tv1, tv2 Vertices of the triangle, must be in CCW. /// \param tn Normal of the triangle (must be of norm 1 and a,b,c CCW). /// \return true if pt lies on the edge of the triangle tv0, tv1, tv2, false otherwise. template inline bool isPointOnTriangleEdge( const Eigen::Matrix& pt, const Eigen::Matrix& tv0, const Eigen::Matrix& tv1, const Eigen::Matrix& tv2, const Eigen::Matrix& tn) { Eigen::Matrix baryCoords; bool result = barycentricCoordinates(pt, tv0, tv1, tv2, tn, &baryCoords); return (result && baryCoords[0] >= -Geometry::ScalarEpsilon && baryCoords[1] >= -Geometry::ScalarEpsilon && baryCoords[2] >= -Geometry::ScalarEpsilon && baryCoords.minCoeff() <= Geometry::ScalarEpsilon); } /// Check if a point is on the edge of a triangle. /// \note Use barycentricCoordinates() if you need the coordinates. /// Please note that the normal will be calculated each time you use this call, if you are doing more than one /// test with the same triangle, precalculate the normal and pass it. Into the other version of this function /// \tparam T Accuracy of the calculation, can usually be inferred. /// \tparam MOpt Eigen Matrix options, can usually be inferred. /// \param pt Vertex of the point. /// \param tv0, tv1, tv2 Vertices of the triangle, must be in CCW. /// \return true if pt lies on the edge of the triangle tv0, tv1, tv2, false otherwise. template inline bool isPointOnTriangleEdge( const Eigen::Matrix& pt, const Eigen::Matrix& tv0, const Eigen::Matrix& tv1, const Eigen::Matrix& tv2) { Eigen::Matrix baryCoords; bool result = barycentricCoordinates(pt, tv0, tv1, tv2, &baryCoords); return (result && baryCoords[0] >= -Geometry::ScalarEpsilon && baryCoords[1] >= -Geometry::ScalarEpsilon && baryCoords[2] >= -Geometry::ScalarEpsilon && baryCoords.minCoeff() <= Geometry::ScalarEpsilon); } /// Check whether the points are coplanar. /// \tparam T Accuracy of the calculation, can usually be inferred. /// \tparam MOpt Eigen Matrix options, can usually be inferred. /// \param a, b, c, d Points to check for coplanarity. /// \return true if the points are coplanar. template inline bool isCoplanar( const Eigen::Matrix& a, const Eigen::Matrix& b, const Eigen::Matrix& c, const Eigen::Matrix& d) { return std::abs((c - a).dot((b - a).cross(d - c))) < Geometry::ScalarEpsilon; } /// Calculate the normal distance between a point and a line. /// \param pt The input point. /// \param v0,v1 Two vertices on the line. /// \param [out] result The point projected onto the line. /// \return The normal distance between the point and the line template inline T distancePointLine( const Eigen::Matrix& pt, const Eigen::Matrix& v0, const Eigen::Matrix& v1, Eigen::Matrix* result) { // The lines is parametrized by: // q = v0 + lambda0 * (v1-v0) // and we solve for pq.v01 = 0; Eigen::Matrix v01 = v1 - v0; T v01_norm2 = v01.squaredNorm(); if (v01_norm2 <= Geometry::SquaredDistanceEpsilon) { *result = v0; // closest point is either T pv_norm2 = (pt - v0).squaredNorm(); return sqrt(pv_norm2); } T lambda = (v01).dot(pt - v0); *result = v0 + lambda * v01 / v01_norm2; return (*result - pt).norm(); } /// Point segment distance, if the projection of the closest point is not within the segments, the /// closest segment point is used for the distance calculation. /// \tparam T Accuracy of the calculation, can usually be inferred. /// \tparam MOpt Eigen Matrix options, can usually be inferred. /// \param pt The input point /// \param sv0,sv1 The segment extremities. /// \param [out] result Either the projection onto the segment or one of the 2 vertices. /// \return The distance of the point from the segment. template inline T distancePointSegment( const Eigen::Matrix& pt, const Eigen::Matrix& sv0, const Eigen::Matrix& sv1, Eigen::Matrix* result) { Eigen::Matrix v01 = sv1 - sv0; T v01Norm2 = v01.squaredNorm(); if (v01Norm2 <= Geometry::SquaredDistanceEpsilon) { *result = sv0; // closest point is either return (pt - sv0).norm(); } T lambda = v01.dot(pt - sv0); if (lambda <= 0) { *result = sv0; } else if (lambda >= v01Norm2) { *result = sv1; } else { *result = sv0 + lambda * v01 / v01Norm2; } return (*result - pt).norm(); } /// Determine the distance between two lines /// \tparam T Accuracy of the calculation, can usually be inferred. /// \tparam MOpt Eigen Matrix options, can usually be inferred. /// \param l0v0, l0v1 Points on Line 0. /// \param l1v0, l1v1 Points on Line 1. /// \param [out] pt0 The closest point on line 0. /// \param [out] pt1 The closest point on line 1. /// \return The normal distance between the two given lines i.e. (pt0 - pt1).norm() /// \note We are using distancePointSegment for the degenerate cases as opposed to /// distancePointLine, why is that ??? (HS-2013-apr-26) template inline T distanceLineLine( const Eigen::Matrix& l0v0, const Eigen::Matrix& l0v1, const Eigen::Matrix& l1v0, const Eigen::Matrix& l1v1, Eigen::Matrix* pt0, Eigen::Matrix* pt1) { // Based on the outline of http://www.geometrictools.com/Distance.html, also refer to // http://geomalgorithms.com/a07-_distance.html for a geometric interpretation // The lines are parametrized by: // p0 = l0v0 + lambda0 * (l0v1-l0v0) // p1 = l1v0 + lambda1 * (l1v1-l1v0) // and we solve for p0p1 perpendicular to both lines T lambda0, lambda1; Eigen::Matrix l0v01 = l0v1 - l0v0; T a = l0v01.squaredNorm(); if (a <= Geometry::SquaredDistanceEpsilon) { // Degenerate line 0 *pt0 = l0v0; return distancePointSegment(l0v0, l1v0, l1v1, pt1); } Eigen::Matrix l1v01 = l1v1 - l1v0; T b = -l0v01.dot(l1v01); T c = l1v01.squaredNorm(); if (c <= Geometry::SquaredDistanceEpsilon) { // Degenerate line 1 *pt1 = l1v0; return distancePointSegment(l1v0, l0v0, l0v1, pt0); } Eigen::Matrix l0v0_l1v0 = l0v0 - l1v0; T d = l0v01.dot(l0v0_l1v0); T e = -l1v01.dot(l0v0_l1v0); T ratio = a * c - b * b; if (std::abs(ratio) <= Geometry::ScalarEpsilon) { // parallel case lambda0 = 0; lambda1 = e / c; } else { // non-parallel case T inv_ratio = T(1) / ratio; lambda0 = (b * e - c * d) * inv_ratio; lambda1 = (b * d - a * e) * inv_ratio; } *pt0 = l0v0 + lambda0 * l0v01; *pt1 = l1v0 + lambda1 * l1v01; return ((*pt0) - (*pt1)).norm(); } /// Distance between two segments, if the project of the closest point is not on the opposing segment, /// the segment endpoints will be used for the distance calculation /// \tparam T Accuracy of the calculation, can usually be inferred. /// \tparam MOpt Eigen Matrix options, can usually be inferred. /// \param s0v0, s0v1 Segment 0 Extremities. /// \param s1v0, s1v1 Segment 1 Extremities. /// \param [out] pt0 Closest point on segment 0 /// \param [out] pt1 Closest point on segment 1 /// \param [out] s0t Abscissa at the point of intersection on Segment 0 (s0v0 + t * (s0v1 - s0v0)). /// \param [out] s1t Abscissa at the point of intersection on Segment 0 (s1v0 + t * (s1v1 - s1v0)). /// \return Distance between the segments, i.e. (pt0 - pt1).norm() template T distanceSegmentSegment( const Eigen::Matrix& s0v0, const Eigen::Matrix& s0v1, const Eigen::Matrix& s1v0, const Eigen::Matrix& s1v1, Eigen::Matrix* pt0, Eigen::Matrix* pt1, T* s0t = nullptr, T* s1t = nullptr) { // Based on the outline of http://www.geometrictools.com/Documentation/DistanceLine3Line3.pdf, also refer to // http://geomalgorithms.com/a07-_distance.html for a geometric interpretation // The segments are parametrized by: // p0 = l0v0 + s * (l0v1-l0v0), with s between 0 and 1 // p1 = l1v0 + t * (l1v1-l1v0), with t between 0 and 1 // We are minimizing Q(s, t) = as*as + 2bst + ct*ct + 2ds + 2et + f, Eigen::Matrix s0v01 = s0v1 - s0v0; T a = s0v01.squaredNorm(); if (a <= Geometry::SquaredDistanceEpsilon) { // Degenerate segment 0 *pt0 = s0v0; return distancePointSegment(s0v0, s1v0, s1v1, pt1); } Eigen::Matrix s1v01 = s1v1 - s1v0; T b = -s0v01.dot(s1v01); T c = s1v01.squaredNorm(); if (c <= Geometry::SquaredDistanceEpsilon) { // Degenerate segment 1 *pt1 = s1v1; return distancePointSegment(s1v0, s0v0, s0v1, pt0); } Eigen::Matrix tempLine = s0v0 - s1v0; T d = s0v01.dot(tempLine); T e = -s1v01.dot(tempLine); T ratio = a * c - b * b; T s, t; // parametrization variables (do not initialize) int region = -1; T tmp; // Non-parallel case if (1.0 - std::abs(s0v01.normalized().dot(s1v01.normalized())) >= Geometry::SquaredDistanceEpsilon) { // Get the region of the global minimum in the s-t space based on the line-line solution // s=0 s=1 // ^ // | | // 4 | 3 | 2 // ----|-------|------- t=1 // | | // 5 | 0 | 1 // | | // ----|-------|-------> t=0 // | | // 6 | 7 | 8 // | | // s = b * e - c * d; t = b * d - a * e; if (s >= 0) { if (s <= ratio) { if (t >= 0) { if (t <= ratio) { region = 0; } else { region = 3; } } else { region = 7; } } else { if (t >= 0) { if (t <= ratio) { region = 1; } else { region = 2; } } else { region = 8; } } } else { if (t >= 0) { if (t <= ratio) { region = 5; } else { region = 4; } } else { region = 6; } } enum edge_type { s0, s1, t0, t1, edge_skip, edge_invalid }; edge_type edge = edge_invalid; switch (region) { case 0: // Global minimum inside [0,1] [0,1] s /= ratio; t /= ratio; edge = edge_skip; break; case 1: edge = s1; break; case 2: // Q_s(1,1)/2 = a+b+d if (a + b + d > 0) { edge = t1; } else { edge = s1; } break; case 3: edge = t1; break; case 4: // Q_s(0,1)/2 = b+d if (b + d > 0) { edge = s0; } else { edge = t1; } break; case 5: edge = s0; break; case 6: // Q_s(0,0)/2 = d if (d > 0) { edge = s0; } else { edge = t0; } break; case 7: edge = t0; break; case 8: // Q_s(1,0)/2 = a+d if (a + d > 0) { edge = t0; } else { edge = s1; } break; default: break; } switch (edge) { case s0: // F(t) = Q(0,t), F?(t) = 2*(e+c*t) // F?(T) = 0 when T = -e/c, then clamp between 0 and 1 (c always >= 0) s = 0; tmp = e; if (tmp > 0) { t = 0; } else if (-tmp > c) { t = 1; } else { t = -tmp / c; } break; case s1: // F(t) = Q(1,t), F?(t) = 2*((b+e)+c*t) // F?(T) = 0 when T = -(b+e)/c, then clamp between 0 and 1 (c always >= 0) s = 1; tmp = b + e; if (tmp > 0) { t = 0; } else if (-tmp > c) { t = 1; } else { t = -tmp / c; } break; case t0: // F(s) = Q(s,0), F?(s) = 2*(d+a*s) => // F?(S) = 0 when S = -d/a, then clamp between 0 and 1 (a always >= 0) t = 0; tmp = d; if (tmp > 0) { s = 0; } else if (-tmp > a) { s = 1; } else { s = -tmp / a; } break; case t1: // F(s) = Q(s,1), F?(s) = 2*(b+d+a*s) => // F?(S) = 0 when S = -(b+d)/a, then clamp between 0 and 1 (a always >= 0) t = 1; tmp = b + d; if (tmp > 0) { s = 0; } else if (-tmp > a) { s = 1; } else { s = -tmp / a; } break; case edge_skip: break; default: break; } } else // Parallel case { if (b > 0) { // Segments have different directions if (d >= 0) { // 0-0 end points since s-segment 0 less than t-segment 0 s = 0; t = 0; } else if (-d <= a) { // s-segment 0 end-point in the middle of the t 0-1 segment, get distance s = -d / a; t = 0; } else { // s-segment 1 is definitely closer s = 1; tmp = a + d; if (-tmp >= b) { t = 1; } else { t = -tmp / b; } } } else { // Both segments have the same dir if (-d >= a) { // 1-0 s = 1; t = 0; } else if (d <= 0) { // mid-0 s = -d / a; t = 0; } else { s = 0; // 1-mid if (d >= -b) { t = 1; } else { t = -d / b; } } } } *pt0 = s0v0 + s * (s0v01); *pt1 = s1v0 + t * (s1v01); if (s0t != nullptr && s1t != nullptr) { *s0t = s; *s1t = t; } return ((*pt1) - (*pt0)).norm(); } /// Calculate the normal distance of a point from a triangle, the resulting point will be on the edge of the triangle /// if the projection of the point is not inside the triangle. /// \tparam T Accuracy of the calculation, can usually be inferred. /// \tparam MOpt Eigen Matrix options, can usually be inferred. /// \param pt The point that is being measured. /// \param tv0, tv1, tv2 The vertices of the triangle. /// \param [out] result The point on the triangle that is closest to pt, if the projection of pt onto the triangle. /// plane is not inside the triangle the closest point on the edge will be used. /// \return The distance between the point and the triangle, i.e (result - pt).norm() template inline T distancePointTriangle( const Eigen::Matrix& pt, const Eigen::Matrix& tv0, const Eigen::Matrix& tv1, const Eigen::Matrix& tv2, Eigen::Matrix* result) { // Based on the outline of http://www.geometrictools.com/Distance.html, also refer to // http://softsurfer.com/Archive/algorithm_0106 for a geometric interpretation // The triangle is parametrized by: // t: tv0 + s * (tv1-tv0) + t * (tv2-tv0) , with s and t between 0 and 1 // We are minimizing Q(s, t) = as*as + 2bst + ct*ct + 2ds + 2et + f, Eigen::Matrix tv01 = tv1 - tv0; Eigen::Matrix tv02 = tv2 - tv0; T a = tv01.squaredNorm(); if (a <= Geometry::SquaredDistanceEpsilon) { // Degenerate edge 1 return distancePointSegment(pt, tv0, tv2, result); } T b = tv01.dot(tv02); T tCross = tv01.cross(tv02).squaredNorm(); if (tCross <= Geometry::SquaredDistanceEpsilon) { // Degenerate edge 2 return distancePointSegment(pt, tv0, tv1, result); } T c = tv02.squaredNorm(); if (c <= Geometry::SquaredDistanceEpsilon) { // Degenerate edge 3 return distancePointSegment(pt, tv0, tv1, result); } Eigen::Matrix tv0pv0 = tv0 - pt; T d = tv01.dot(tv0pv0); T e = tv02.dot(tv0pv0); T ratio = a * c - b * b; T s = b * e - c * d; T t = b * d - a * e; // Determine region (inside-outside triangle) int region = -1; if (s + t <= ratio) { if (s < 0) { if (t < 0) { region = 4; } else { region = 3; } } else if (t < 0) { region = 5; } else { region = 0; } } else { if (s < 0) { region = 2; } else if (t < 0) { region = 6; } else { region = 1; } } // Regions: / // ^ t=0 / // \ 2| / // \ | / // \| / // \ / // |\ / // | \ 1 / // 3 | \ / // | 0 \ / // ----|----\-------> s=0 / // | \ / // 4 | 5 \ 6 / // | \ / // / T numer, denom, tmp0, tmp1; enum edge_type { s0, t0, s1t1, edge_skip, edge_invalid }; edge_type edge = edge_invalid; switch (region) { case 0: // Global minimum inside [0,1] [0,1] numer = T(1) / ratio; s *= numer; t *= numer; edge = edge_skip; break; case 1: edge = s1t1; break; case 2: // Grad(Q(0,1)).(0,-1)/2 = -c-e // Grad(Q(0,1)).(1,-1)/2 = b=d-c-e tmp0 = b + d; tmp1 = c + e; if (tmp1 > tmp0) { edge = s1t1; } else { edge = s0; } break; case 3: edge = s0; break; case 4: // Grad(Q(0,0)).(0,1)/2 = e // Grad(Q(0,0)).(1,0)/2 = d if (e >= d) { edge = t0; } else { edge = s0; } break; case 5: edge = t0; break; case 6: // Grad(Q(1,0)).(-1,0)/2 = -a-d // Grad(Q(1,0)).(-1,1)/2 = -a-d+b+e tmp0 = -a - d; tmp1 = -a - d + b + e; if (tmp1 > tmp0) { edge = t0; } else { edge = s1t1; } break; default: break; } switch (edge) { case s0: // F(t) = Q(0, t), F'(t)=0 when -e/c = 0 s = 0; if (e >= 0) { t = 0; } else { t = (-e >= c ? 1 : -e / c); } break; case t0: // F(s) = Q(s, 0), F'(s)=0 when -d/a = 0 t = 0; if (d >= 0) { s = 0; } else { s = (-d >= a ? 1 : -d / a); } break; case s1t1: // F(s) = Q(s, 1-s), F'(s) = 0 when (c+e-b-d)/(a-2b+c) = 0 (denom = || tv01-tv02 ||^2 always > 0) numer = c + e - b - d; if (numer <= 0) { s = 0; } else { denom = a - 2 * b + c; s = (numer >= denom ? 1 : numer / denom); } t = 1 - s; break; case edge_skip: break; default: break; } *result = tv0 + s * tv01 + t * tv02; return ((*result) - pt).norm(); } /// Calculate the intersection of a line segment with a triangle /// See http://geomalgorithms.com/a06-_intersect-2.html#intersect_RayTriangle for the algorithm /// \pre The normal must be unit length /// \pre The triangle vertices must be in counter clockwise order in respect to the normal /// \tparam T Accuracy of the calculation, can usually be inferred. /// \tparam MOpt Eigen Matrix options, can usually be inferred. /// \param sv0,sv1 Extremities of the segment. /// \param tv0,tv1,tv2 The triangle vertices. CCW around the normal. /// \param tn The triangle normal, should be normalized. /// \param [out] result The point where the triangle and the line segment intersect, invalid if they don't intersect. /// \return true if the segment intersects with the triangle, false if it does not /// \note HS-2013-may-07 This is the only function that only checks for intersection rather than returning a distance /// if necessary this should be rewritten to do the distance calculation, doing so would necessitate to check /// against all the triangle edges in the non intersection cases. template inline bool doesCollideSegmentTriangle( const Eigen::Matrix& sv0, const Eigen::Matrix& sv1, const Eigen::Matrix& tv0, const Eigen::Matrix& tv1, const Eigen::Matrix& tv2, const Eigen::Matrix& tn, Eigen::Matrix* result) { // Triangle edges vectors Eigen::Matrix u = tv1 - tv0; Eigen::Matrix v = tv2 - tv0; // Ray direction vector Eigen::Matrix dir = sv1 - sv0; Eigen::Matrix w0 = sv0 - tv0; T a = -tn.dot(w0); T b = tn.dot(dir); result->setConstant((std::numeric_limits::quiet_NaN())); // Ray is parallel to triangle plane if (std::abs(b) <= Geometry::AngularEpsilon) { if (std::abs(a) <= Geometry::AngularEpsilon) { // Ray lies in triangle plane Eigen::Matrix baryCoords; for (int i = 0; i < 2; ++i) { barycentricCoordinates((i == 0 ? sv0 : sv1), tv0, tv1, tv2, tn, &baryCoords); if (baryCoords[0] >= 0 && baryCoords[1] >= 0 && baryCoords[2] >= 0) { *result = (i == 0) ? sv0 : sv1; return true; } } // All segment endpoints outside of triangle return false; } else { // Segment parallel to triangle but not in same plane return false; } } // Get intersect point of ray with triangle plane T r = a / b; // Ray goes away from triangle if (r < -Geometry::DistanceEpsilon) { return false; } //Ray comes toward triangle but isn't long enough to reach it if (r > 1 + Geometry::DistanceEpsilon) { return false; } // Intersect point of ray and plane Eigen::Matrix presumedIntersection = sv0 + r * dir; // Collision point inside T? T uu = u.dot(u); T uv = u.dot(v); T vv = v.dot(v); Eigen::Matrix w = presumedIntersection - tv0; T wu = w.dot(u); T wv = w.dot(v); T D = uv * uv - uu * vv; // Get and test parametric coords T s = (uv * wv - vv * wu) / D; // I is outside T if (s < -Geometry::DistanceEpsilon || s > 1 + Geometry::DistanceEpsilon) { return false; } T t = (uv * wu - uu * wv) / D; // I is outside T if (t < -Geometry::DistanceEpsilon || (s + t) > 1 + Geometry::DistanceEpsilon) { return false; } // I is in T *result = sv0 + r * dir; return true; } /// Calculate the distance of a point to a plane /// \pre n needs to the normalized /// \tparam T Accuracy of the calculation, can usually be inferred. /// \tparam MOpt Eigen Matrix options, can usually be inferred. /// \param pt The point to check. /// \param n The normal of the plane n (normalized). /// \param d Constant d for the plane equation as in n.x + d = 0. /// \param [out] result Projection of point p into the plane. /// \return The distance to the plane (negative if on the backside of the plane). template inline T distancePointPlane( const Eigen::Matrix& pt, const Eigen::Matrix& n, T d, Eigen::Matrix* result) { T dist = n.dot(pt) + d; *result = pt - n * dist; return dist; } /// Calculate the distance between a segment and a plane. /// \pre n should be normalized /// \tparam T Accuracy of the calculation, can usually be inferred. /// \tparam MOpt Eigen Matrix options, can usually be inferred. /// \param sv0,sv1 Endpoints of the segments. /// \param n Normal of the plane n (normalized). /// \param d Constant d in n.x + d = 0. /// \param [out] closestPointSegment Point closest to the plane, the midpoint of the segment (v0+v1)/2 /// is being used if the segment is parallel to the plane. If the segment actually /// intersects the plane segmentIntersectionPoint will be equal to planeIntersectionPoint. /// \param [out] planeIntersectionPoint the point on the plane where the line defined by the segment /// intersects the plane. /// \return the distance of closest point of the segment to the plane, 0 if the segment intersects the plane, /// negative if the closest point is on the other side of the plane. template inline T distanceSegmentPlane( const Eigen::Matrix& sv0, const Eigen::Matrix& sv1, const Eigen::Matrix& n, T d, Eigen::Matrix* closestPointSegment, Eigen::Matrix* planeIntersectionPoint) { T dist0 = n.dot(sv0) + d; T dist1 = n.dot(sv1) + d; // Parallel case Eigen::Matrix v01 = sv1 - sv0; if (std::abs(n.dot(v01)) <= Geometry::AngularEpsilon) { *closestPointSegment = (sv0 + sv1) * T(0.5); dist0 = n.dot(*closestPointSegment) + d; *planeIntersectionPoint = *closestPointSegment - dist0 * n; return (std::abs(dist0) < Geometry::DistanceEpsilon ? 0 : dist0); } // Both on the same side if ((dist0 > 0 && dist1 > 0) || (dist0 < 0 && dist1 < 0)) { if (std::abs(dist0) < std::abs(dist1)) { *closestPointSegment = sv0; *planeIntersectionPoint = sv0 - dist0 * n; return dist0; } else { *closestPointSegment = sv1; *planeIntersectionPoint = sv1 - dist1 * n; return dist1; } } // Segment cutting through else { Eigen::Matrix v01 = sv1 - sv0; T lambda = (-d - sv0.dot(n)) / v01.dot(n); *planeIntersectionPoint = sv0 + lambda * v01; *closestPointSegment = *planeIntersectionPoint; return 0; } } /// Calculate the distance of a triangle to a plane. /// \pre n should be normalized. /// \tparam T Accuracy of the calculation, can usually be inferred. /// \tparam MOpt Eigen Matrix options, can usually be inferred. /// \param tv0,tv1,tv2 Points of the triangle. /// \param n Normal of the plane n (normalized). /// \param d Constant d in n.x + d = 0. /// \param closestPointTriangle Closest point on the triangle, when the triangle is coplanar to /// the plane (tv0+tv1+tv2)/3 is used, when the triangle intersects the plane the midpoint of /// the intersection segment is returned. /// \param planeProjectionPoint Projection of the closest point onto the plane, when the triangle intersects /// the plane the midpoint of the intersection segment is returned. /// \return The distance of the triangle to the plane. template inline T distanceTrianglePlane( const Eigen::Matrix& tv0, const Eigen::Matrix& tv1, const Eigen::Matrix& tv2, const Eigen::Matrix& n, T d, Eigen::Matrix* closestPointTriangle, Eigen::Matrix* planeProjectionPoint) { Eigen::Matrix distances(n.dot(tv0) + d, n.dot(tv1) + d, n.dot(tv2) + d); Eigen::Matrix t01 = tv1 - tv0; Eigen::Matrix t02 = tv2 - tv0; Eigen::Matrix t12 = tv2 - tv1; closestPointTriangle->setConstant((std::numeric_limits::quiet_NaN())); planeProjectionPoint->setConstant((std::numeric_limits::quiet_NaN())); // HS-2013-may-09 Could there be a case where we fall into the wrong tree because of the checks against // the various epsilon values all going against us ??? // Parallel case (including Coplanar) if (std::abs(n.dot(t01)) <= Geometry::AngularEpsilon && std::abs(n.dot(t02)) <= Geometry::AngularEpsilon) { *closestPointTriangle = (tv0 + tv1 + tv2) / T(3); *planeProjectionPoint = *closestPointTriangle - n * distances[0]; return distances[0]; } // Is there an intersection if ((distances.array() < -Geometry::DistanceEpsilon).any() && (distances.array() > Geometry::DistanceEpsilon).any()) { if (distances[0] * distances[1] < 0) { *closestPointTriangle = tv0 + (-d - n.dot(tv0)) / n.dot(t01) * t01; if (distances[0] * distances[2] < 0) { *planeProjectionPoint = tv0 + (-d - n.dot(tv0)) / n.dot(t02) * t02; } else { Eigen::Matrix t12 = tv2 - tv1; *planeProjectionPoint = tv1 + (-d - n.dot(tv1)) / n.dot(t12) * t12; } } else { *closestPointTriangle = tv0 + (-d - n.dot(tv0)) / n.dot(t02) * t02; *planeProjectionPoint = tv1 + (-d - n.dot(tv1)) / n.dot(t12) * t12; } // Find the midpoint, take this out to return the segment endpoints *closestPointTriangle = *planeProjectionPoint = (*closestPointTriangle + *planeProjectionPoint) * T(0.5); return 0; } int index; distances.cwiseAbs().minCoeff(&index); switch (index) { case 0: //distances[0] is closest *closestPointTriangle = tv0; *planeProjectionPoint = tv0 - n * distances[0]; return distances[0]; case 1: //distances[1] is closest *closestPointTriangle = tv1; *planeProjectionPoint = tv1 - n * distances[1]; return distances[1]; case 2: //distances[2] is closest *closestPointTriangle = tv2; *planeProjectionPoint = tv2 - n * distances[2]; return distances[2]; } return std::numeric_limits::quiet_NaN(); } /// Test if two planes are intersecting, if yes also calculate the intersection line. /// \tparam T Accuracy of the calculation, can usually be inferred. /// \tparam MOpt Eigen Matrix options, can usually be inferred. /// \param pn0,pd0 Normal and constant of the first plane, nx + d = 0. /// \param pn1,pd1 Normal and constant of the second plane, nx + d = 0. /// \param [out] pt0,pt1 Two points on the intersection line, not valid if there is no intersection. /// \return true when a unique line exists, false for disjoint or coinciding. template inline bool doesIntersectPlanePlane( const Eigen::Matrix& pn0, T pd0, const Eigen::Matrix& pn1, T pd1, Eigen::Matrix* pt0, Eigen::Matrix* pt1) { // Algorithm from real time collision detection - optimized version page 210 (with extra checks) const Eigen::Matrix lineDir = pn0.cross(pn1); const T lineDirNorm2 = lineDir.squaredNorm(); pt0->setConstant((std::numeric_limits::quiet_NaN())); pt1->setConstant((std::numeric_limits::quiet_NaN())); // Test if the two planes are parallel if (lineDirNorm2 <= Geometry::SquaredDistanceEpsilon) { return false; // planes disjoint } // Compute common point *pt0 = (pd1 * pn0 - pd0 * pn1).cross(lineDir) / lineDirNorm2; *pt1 = *pt0 + lineDir; return true; } /// Calculate the distance of a line segment to a triangle. /// Note that this version will calculate the normal of the triangle, /// if the normal is known use the other version of this function. /// \tparam T Accuracy of the calculation, can usually be inferred. /// \tparam MOpt Eigen Matrix options, can usually be inferred. /// \param sv0,sv1 Extremities of the line segment. /// \param tv0, tv1, tv2 Triangle points. /// \param [out] segmentPoint Closest point on the segment. /// \param [out] trianglePoint Closest point on the triangle. /// \return the the distance between the two closest points, i.e. (trianglePoint - segmentPoint).norm(). template inline T distanceSegmentTriangle( const Eigen::Matrix& sv0, const Eigen::Matrix& sv1, const Eigen::Matrix& tv0, const Eigen::Matrix& tv1, const Eigen::Matrix& tv2, Eigen::Matrix* segmentPoint, Eigen::Matrix* trianglePoint) { Eigen::Matrix n = (tv1 - tv0).cross(tv2 - tv1); n.normalize(); return distanceSegmentTriangle(sv0, sv1, tv0, tv1, tv2, n, segmentPoint, trianglePoint); } /// Calculate the distance of a line segment to a triangle. /// \pre n needs to be normalized. /// \tparam T Accuracy of the calculation, can usually be inferred. /// \tparam MOpt Eigen Matrix options, can usually be inferred. /// \param sv0,sv1 Extremities of the line segment. /// \param tv0, tv1, tv2 Points of the triangle. /// \param normal Normal of the triangle (Expected to be normalized) /// \param [out] segmentPoint Closest point on the segment. /// \param [out] trianglePoint Closest point on the triangle. /// \return the distance between the two closest points. template inline T distanceSegmentTriangle( const Eigen::Matrix& sv0, const Eigen::Matrix& sv1, const Eigen::Matrix& tv0, const Eigen::Matrix& tv1, const Eigen::Matrix& tv2, const Eigen::Matrix& normal, Eigen::Matrix* segmentPoint, Eigen::Matrix* trianglePoint) { segmentPoint->setConstant((std::numeric_limits::quiet_NaN())); trianglePoint->setConstant((std::numeric_limits::quiet_NaN())); // Setting up the plane that the triangle is in const Eigen::Matrix& n = normal; T d = -n.dot(tv0); Eigen::Matrix baryCoords; // Degenerate case: Line and triangle plane parallel const Eigen::Matrix v01 = sv1 - sv0; const T v01DotTn = n.dot(v01); if (std::abs(v01DotTn) <= Geometry::AngularEpsilon) { // Check if any of the points project onto the tri // otherwise normal (non-parallel) processing will get the right result T dst = std::abs(distancePointPlane(sv0, n, d, trianglePoint)); Eigen::Matrix baryCoords; barycentricCoordinates(*trianglePoint, tv0, tv1, tv2, normal, &baryCoords); if (baryCoords[0] >= 0 && baryCoords[1] >= 0 && baryCoords[2] >= 0) { *segmentPoint = sv0; return dst; } dst = std::abs(distancePointPlane(sv1, n, d, trianglePoint)); barycentricCoordinates(*trianglePoint, tv0, tv1, tv2, normal, &baryCoords); if (baryCoords[0] >= 0 && baryCoords[1] >= 0 && baryCoords[2] >= 0) { *segmentPoint = sv1; return dst; } } // Line and triangle plane *not* parallel: check cut through case only, the rest will be check later else { T lambda = -n.dot(sv0 - tv0) / v01DotTn; if (lambda >= 0 && lambda <= 1) { *segmentPoint = *trianglePoint = sv0 + lambda * v01; barycentricCoordinates(*trianglePoint, tv0, tv1, tv2, normal, &baryCoords); if (baryCoords[0] >= 0 && baryCoords[1] >= 0 && baryCoords[2] >= 0) { // Segment goes through the triangle return 0; } } } // At this point the segment is nearest point to one of the triangle edges or one of the end points Eigen::Matrix segColPt01, segColPt02, segColPt12, triColPt01, triColPt02, triColPt12; T dst01 = distanceSegmentSegment(sv0, sv1, tv0, tv1, &segColPt01, &triColPt01); T dst02 = distanceSegmentSegment(sv0, sv1, tv0, tv2, &segColPt02, &triColPt02); T dst12 = distanceSegmentSegment(sv0, sv1, tv1, tv2, &segColPt12, &triColPt12); Eigen::Matrix ptTriCol0, ptTriCol1; T dstPtTri0 = std::abs(distancePointPlane(sv0, n, d, &ptTriCol0)); barycentricCoordinates(ptTriCol0, tv0, tv1, tv2, normal, &baryCoords); if (baryCoords[0] < 0 || baryCoords[1] < 0 || baryCoords[2] < 0) { dstPtTri0 = std::numeric_limits::max(); } T dstPtTri1 = std::abs(distancePointPlane(sv1, n, d, &ptTriCol1)); barycentricCoordinates(ptTriCol1, tv0, tv1, tv2, normal, &baryCoords); if (baryCoords[0] < 0 || baryCoords[1] < 0 || baryCoords[2] < 0) { dstPtTri1 = std::numeric_limits::max(); } int minIndex; Eigen::Matrix distances; (distances << dst01, dst02, dst12, dstPtTri0, dstPtTri1).finished().minCoeff(&minIndex); switch (minIndex) { case 0: *segmentPoint = segColPt01; *trianglePoint = triColPt01; return dst01; case 1: *segmentPoint = segColPt02; *trianglePoint = triColPt02; return dst02; case 2: *segmentPoint = segColPt12; *trianglePoint = triColPt12; return dst12; case 3: *segmentPoint = sv0; *trianglePoint = ptTriCol0; return dstPtTri0; case 4: *segmentPoint = sv1; *trianglePoint = ptTriCol1; return dstPtTri1; } // Invalid ... return std::numeric_limits::quiet_NaN(); } /// Calculate the distance between two triangles /// \tparam T Accuracy of the calculation, can usually be inferred. /// \tparam MOpt Eigen Matrix options, can usually be inferred. /// \param t0v0,t0v1,t0v2 Points of the first triangle. /// \param t1v0,t1v1,t1v2 Points of the second triangle. /// \param [out] closestPoint0 Closest point on the first triangle, unless penetrating, /// in which case it is the point along the edge that allows min separation. /// \param [out] closestPoint1 Closest point on the second triangle, unless penetrating, /// in which case it is the point along the edge that allows min separation. /// \return the distance between the two triangles. template inline T distanceTriangleTriangle( const Eigen::Matrix& t0v0, const Eigen::Matrix& t0v1, const Eigen::Matrix& t0v2, const Eigen::Matrix& t1v0, const Eigen::Matrix& t1v1, const Eigen::Matrix& t1v2, Eigen::Matrix* closestPoint0, Eigen::Matrix* closestPoint1) { // Check the segments of t0 against t1 T minDst = std::numeric_limits::max(); T currDst = 0; Eigen::Matrix segPt, triPt; Eigen::Matrix n0 = (t0v1 - t0v0).cross(t0v2 - t0v0); n0.normalize(); Eigen::Matrix n1 = (t1v1 - t1v0).cross(t1v2 - t1v0); n1.normalize(); currDst = distanceSegmentTriangle(t0v0, t0v1, t1v0, t1v1, t1v2, n1, &segPt, &triPt); if (currDst < minDst) { minDst = currDst; *closestPoint0 = segPt; *closestPoint1 = triPt; } currDst = distanceSegmentTriangle(t0v1, t0v2, t1v0, t1v1, t1v2, n1, &segPt, &triPt); if (currDst < minDst) { minDst = currDst; *closestPoint0 = segPt; *closestPoint1 = triPt; } currDst = distanceSegmentTriangle(t0v2, t0v0, t1v0, t1v1, t1v2, n1, &segPt, &triPt); if (currDst < minDst) { minDst = currDst; *closestPoint0 = segPt; *closestPoint1 = triPt; } // Check the segments of t1 against t0 currDst = distanceSegmentTriangle(t1v0, t1v1, t0v0, t0v1, t0v2, n0, &segPt, &triPt); if (currDst < minDst) { minDst = currDst; *closestPoint1 = segPt; *closestPoint0 = triPt; } currDst = distanceSegmentTriangle(t1v1, t1v2, t0v0, t0v1, t0v2, n0, &segPt, &triPt); if (currDst < minDst) { minDst = currDst; *closestPoint1 = segPt; *closestPoint0 = triPt; } currDst = distanceSegmentTriangle(t1v2, t1v0, t0v0, t0v1, t0v2, n0, &segPt, &triPt); if (currDst < minDst) { minDst = currDst; *closestPoint1 = segPt; *closestPoint0 = triPt; } return (minDst); } /// Calculate the intersections between a line segment and an axis aligned box /// \tparam T Accuracy of the calculation, can usually be inferred. /// \tparam MOpt Eigen Matrix options, can usually be inferred. /// \param sv0,sv1 Extremities of the line segment. /// \param box Axis aligned bounding box /// \param [out] intersections The points of intersection between the segment and the box template void intersectionsSegmentBox( const Eigen::Matrix& sv0, const Eigen::Matrix& sv1, const Eigen::AlignedBox& box, std::vector>* intersections) { Eigen::Array v01 = sv1 - sv0; Eigen::Array parallelToPlane = (v01.cwiseAbs().array() < Geometry::DistanceEpsilon); if (parallelToPlane.any()) { Eigen::Array beyondMinCorner = (sv0.array() < box.min().array()); Eigen::Array beyondMaxCorner = (sv0.array() > box.max().array()); if ((parallelToPlane && (beyondMinCorner || beyondMaxCorner)).any()) { return; } } // Calculate the intersection of the segment with each of the 6 box planes. // The intersection is calculated as the distance along the segment (abscissa) // scaled from 0 to 1. Eigen::Array planeIntersectionAbscissas; planeIntersectionAbscissas.col(0) = (box.min().array() - sv0.array()); planeIntersectionAbscissas.col(1) = (box.max().array() - sv0.array()); // While we could be dividing by zero here, INF values are // correctly handled by the rest of the function. planeIntersectionAbscissas.colwise() /= v01; T entranceAbscissa = planeIntersectionAbscissas.rowwise().minCoeff().maxCoeff(); T exitAbscissa = planeIntersectionAbscissas.rowwise().maxCoeff().minCoeff(); if (entranceAbscissa < exitAbscissa && exitAbscissa > T(0.0)) { if (entranceAbscissa >= T(0.0) && entranceAbscissa <= T(1.0)) { intersections->push_back(sv0 + v01.matrix() * entranceAbscissa); } if (exitAbscissa >= T(0.0) && exitAbscissa <= T(1.0)) { intersections->push_back(sv0 + v01.matrix() * exitAbscissa); } } } /// Test if an axis aligned box intersects with a capsule /// \tparam T Accuracy of the calculation, can usually be inferred. /// \tparam MOpt Eigen Matrix options, can usually be inferred. /// \param capsuleBottom Position of the capsule bottom /// \param capsuleTop Position of the capsule top /// \param capsuleRadius The capsule radius /// \param box Axis aligned bounding box /// \return True, if intersection is detected. template bool doesIntersectBoxCapsule( const Eigen::Matrix& capsuleBottom, const Eigen::Matrix& capsuleTop, const T capsuleRadius, const Eigen::AlignedBox& box) { Eigen::AlignedBox dilatedBox(box.min().array() - capsuleRadius, box.max().array() + capsuleRadius); std::vector candidates; intersectionsSegmentBox(capsuleBottom, capsuleTop, dilatedBox, &candidates); if (dilatedBox.contains(capsuleBottom)) { candidates.push_back(capsuleBottom); } if (dilatedBox.contains(capsuleTop)) { candidates.push_back(capsuleTop); } bool doesIntersect = false; ptrdiff_t dimensionsOutsideBox; Vector3d clampedPosition, segmentPoint; for (auto candidate = candidates.cbegin(); candidate != candidates.cend(); ++candidate) { // Collisions between a capsule and a box are the same as a segment and a dilated // box with rounded corners. If the intersection occurs outside the original box // in two dimensions (collision with an edge of the dilated box) or three // dimensions (collision with the corner of the dilated box) dimensions, we need // to check if it is inside these rounded corners. dimensionsOutsideBox = (candidate->array() > box.max().array()).count(); dimensionsOutsideBox += (candidate->array() < box.min().array()).count(); if (dimensionsOutsideBox >= 2) { clampedPosition = (*candidate).array().min(box.max().array()).max(box.min().array()); if (distancePointSegment(clampedPosition, capsuleBottom, capsuleTop, &segmentPoint) > capsuleRadius) { // Doesn't intersect, try the next candidate. continue; } } doesIntersect = true; break; } return doesIntersect; } /// Helper method to determine the nearest point between a point and a line. /// \tparam T the numeric data type used for the vector argument. Can usually be deduced. /// \tparam VOpt the option flags (alignment etc.) used for the vector argument. Can be deduced. /// \param point is the point under consideration. /// \param segment0 one point on the line /// \param segment1 second point on the line /// \return the closest point on the line through the segment to the point under test template Eigen::Matrix nearestPointOnLine(const Eigen::Matrix& point, const Eigen::Matrix& segment0, const Eigen::Matrix& segment1) { auto pointToSegmentStart = segment0 - point; auto segmentDirection = segment1 - segment0; auto squaredNorm = segmentDirection.squaredNorm(); SURGSIM_ASSERT(squaredNorm != 0.0) << "Line is defined by two collocated points."; auto distance = -pointToSegmentStart.dot(segmentDirection) / squaredNorm; auto p0Proj = segment0 + distance * segmentDirection; return p0Proj; } /// Check if the two triangles intersect using separating axis test. /// Algorithm is implemented from http://fileadmin.cs.lth.se/cs/Personal/Tomas_Akenine-Moller/pubs/tritri.pdf /// /// \tparam T Accuracy of the calculation, can usually be inferred. /// \tparam MOpt Eigen Matrix options, can usually be inferred. /// \param t0v0,t0v1,t0v2 Vertices of the first triangle. /// \param t1v0,t1v1,t1v2 Vertices of the second triangle. /// \param t0n Normal of the first triangle, should be normalized. /// \param t1n Normal of the second triangle, should be normalized. /// \return True, if intersection is detected. template inline bool doesIntersectTriangleTriangle( const Eigen::Matrix& t0v0, const Eigen::Matrix& t0v1, const Eigen::Matrix& t0v2, const Eigen::Matrix& t1v0, const Eigen::Matrix& t1v1, const Eigen::Matrix& t1v2, const Eigen::Matrix& t0n, const Eigen::Matrix& t1n); /// Check if the two triangles intersect using separating axis test. /// \tparam T Accuracy of the calculation, can usually be inferred. /// \tparam MOpt Eigen Matrix options, can usually be inferred. /// \param t0v0,t0v1,t0v2 Vertices of the first triangle. /// \param t1v0,t1v1,t1v2 Vertices of the second triangle. /// \return True, if intersection is detected. template inline bool doesIntersectTriangleTriangle( const Eigen::Matrix& t0v0, const Eigen::Matrix& t0v1, const Eigen::Matrix& t0v2, const Eigen::Matrix& t1v0, const Eigen::Matrix& t1v1, const Eigen::Matrix& t1v2); /// Calculate the contact between two triangles. /// Algorithm presented in /// https://docs.google.com/a/simquest.com/document/d/11ajMD7QoTVelT2_szGPpeUEY0wHKKxW1TOgMe8k5Fsc/pub. /// If the triangle are known to intersect, the deepest penetration of the triangles into each other is calculated. /// The triangle which penetrates less into the other triangle is chosen as contact. /// \tparam T Accuracy of the calculation, can usually be inferred. /// \tparam MOpt Eigen Matrix options, can usually be inferred. /// \param t0v0,t0v1,t0v2 Vertices of the first triangle. /// \param t1v0,t1v1,t1v2 Vertices of the second triangle. /// \param t0n Unit length normal of the first triangle, should be normalized. /// \param t1n Unit length normal of the second triangle, should be normalized. /// \param [out] penetrationDepth The depth of penetration. /// \param [out] penetrationPoint0 The contact point on triangle0 (t0v0,t0v1,t0v2). /// \param [out] penetrationPoint1 The contact point on triangle1 (t1v0,t1v1,t1v2). /// \param [out] contactNormal The contact normal that points from triangle1 to triangle0. /// \return True, if intersection is detected. /// \note The [out] params are not modified if there is no intersection. /// \note If penetrationPoint0 is moved by (contactNormal*penetrationDepth*0.5) and penetrationPoint1 /// is moved by -(contactNormal*penetrationDepth*0.5), the triangles will no longer be intersecting. template inline bool calculateContactTriangleTriangle( const Eigen::Matrix& t0v0, const Eigen::Matrix& t0v1, const Eigen::Matrix& t0v2, const Eigen::Matrix& t1v0, const Eigen::Matrix& t1v1, const Eigen::Matrix& t1v2, const Eigen::Matrix& t0n, const Eigen::Matrix& t1n, T* penetrationDepth, Eigen::Matrix* penetrationPoint0, Eigen::Matrix* penetrationPoint1, Eigen::Matrix* contactNormal); /// Calculate the contact between two triangles. /// Algorithm presented in /// https://docs.google.com/a/simquest.com/document/d/11ajMD7QoTVelT2_szGPpeUEY0wHKKxW1TOgMe8k5Fsc/pub. /// If the triangle are known to intersect, the deepest penetration of the triangles into each other is calculated. /// The triangle which penetrates less into the other triangle is chosen as contact. /// \tparam T Accuracy of the calculation, can usually be inferred. /// \tparam MOpt Eigen Matrix options, can usually be inferred. /// \param t0v0,t0v1,t0v2 Vertices of the first triangle, should be normalized. /// \param t1v0,t1v1,t1v2 Vertices of the second triangle, should be normalized. /// \param [out] penetrationDepth The depth of penetration. /// \param [out] penetrationPoint0 The contact point on triangle0 (t0v0,t0v1,t0v2). /// \param [out] penetrationPoint1 The contact point on triangle1 (t1v0,t1v1,t1v2). /// \param [out] contactNormal The contact normal that points from triangle1 to triangle0. /// \return True, if intersection is detected. /// \note The [out] params are not modified if there is no intersection. /// \note If penetrationPoint0 is moved by (contactNormal*penetrationDepth*0.5) and penetrationPoint1 /// is moved by -(contactNormal*penetrationDepth*0.5), the triangles will no longer be intersecting. template inline bool calculateContactTriangleTriangle( const Eigen::Matrix& t0v0, const Eigen::Matrix& t0v1, const Eigen::Matrix& t0v2, const Eigen::Matrix& t1v0, const Eigen::Matrix& t1v1, const Eigen::Matrix& t1v2, T* penetrationDepth, Eigen::Matrix* penetrationPoint0, Eigen::Matrix* penetrationPoint1, Eigen::Matrix* contactNormal); /// Calculate the contact between two triangles. /// Algorithm is implemented from http://fileadmin.cs.lth.se/cs/Personal/Tomas_Akenine-Moller/pubs/tritri.pdf /// /// \tparam T Accuracy of the calculation, can usually be inferred. /// \tparam MOpt Eigen Matrix options, can usually be inferred. /// \param t0v0,t0v1,t0v2 Vertices of the first triangle. /// \param t1v0,t1v1,t1v2 Vertices of the second triangle. /// \param t0n Normal of the first triangle, should be normalized. /// \param t1n Normal of the second triangle, should be normalized. /// \param [out] penetrationDepth The depth of penetration. /// \param [out] penetrationPoint0 The contact point on triangle0 (t0v0,t0v1,t0v2). /// \param [out] penetrationPoint1 The contact point on triangle1 (t1v0,t1v1,t1v2). /// \param [out] contactNormal The contact normal that points from triangle1 to triangle0. /// \return True, if intersection is detected. /// \note The [out] params are not modified if there is no intersection. /// \note If penetrationPoint0 is moved by (contactNormal*penetrationDepth*0.5) and penetrationPoint1 /// is moved by -(contactNormal*penetrationDepth*0.5), the triangles will no longer be intersecting. template inline bool calculateContactTriangleTriangleSeparatingAxis( const Eigen::Matrix& t0v0, const Eigen::Matrix& t0v1, const Eigen::Matrix& t0v2, const Eigen::Matrix& t1v0, const Eigen::Matrix& t1v1, const Eigen::Matrix& t1v2, const Eigen::Matrix& t0n, const Eigen::Matrix& t1n, T* penetrationDepth, Eigen::Matrix* penetrationPoint0, Eigen::Matrix* penetrationPoint1, Eigen::Matrix* contactNormal); /// Calculate the contact between two triangles. /// \tparam T Accuracy of the calculation, can usually be inferred. /// \tparam MOpt Eigen Matrix options, can usually be inferred. /// \param t0v0,t0v1,t0v2 Vertices of the first triangle. /// \param t1v0,t1v1,t1v2 Vertices of the second triangle. /// \param [out] penetrationDepth The depth of penetration. /// \param [out] penetrationPoint0 The contact point on triangle0 (t0v0,t0v1,t0v2). /// \param [out] penetrationPoint1 The contact point on triangle1 (t1v0,t1v1,t1v2). /// \param [out] contactNormal The contact normal that points from triangle1 to triangle0. /// \return True, if intersection is detected. /// \note The [out] params are not modified if there is no intersection. /// \note If penetrationPoint0 is moved by (contactNormal*penetrationDepth*0.5) and penetrationPoint1 /// is moved by -(contactNormal*penetrationDepth*0.5), the triangles will no longer be intersecting. template inline bool calculateContactTriangleTriangleSeparatingAxis( const Eigen::Matrix& t0v0, const Eigen::Matrix& t0v1, const Eigen::Matrix& t0v2, const Eigen::Matrix& t1v0, const Eigen::Matrix& t1v1, const Eigen::Matrix& t1v2, T* penetrationDepth, Eigen::Matrix* penetrationPoint0, Eigen::Matrix* penetrationPoint1, Eigen::Matrix* contactNormal); /// Calculate the contact between a capsule and a triangle. /// If the shapes intersect, the deepest penetration of the capsule along the triangle normal is calculated. /// \tparam T Accuracy of the calculation, can usually be inferred. /// \tparam MOpt Eigen Matrix options, can usually be inferred. /// \param tv0,tv1,tv2 Vertices of the triangle. /// \param tn Normal of the triangle, should be normalized. /// \param cv0,cv1 Ends of the capsule axis. /// \param cr Capsule radius. /// \param [out] penetrationDepth The depth of penetration. /// \param [out] penetrationPointTriangle The contact point on triangle. /// \param [out] penetrationPointCapsule The contact point on capsule. /// \param [out] contactNormal The contact normal that points from capsule to triangle. /// \param [out] penetrationPointCapsuleAxis The point on the capsule axis closest to the triangle. /// \return True, if intersection is detected. /// \note The [out] params are not modified if there is no intersection. /// \note If penetrationPointTriangle is moved by (contactNormal*penetrationDepth*0.5) and penetrationPointCapsule /// is moved by -(contactNormal*penetrationDepth*0.5), the shapes will no longer be intersecting. template inline bool calculateContactTriangleCapsule( const Eigen::Matrix& tv0, const Eigen::Matrix& tv1, const Eigen::Matrix& tv2, const Eigen::Matrix& tn, const Eigen::Matrix& cv0, const Eigen::Matrix& cv1, double cr, T* penetrationDepth, Eigen::Matrix* penetrationPointTriangle, Eigen::Matrix* penetrationPointCapsule, Eigen::Matrix* contactNormal, Eigen::Matrix* penetrationPointCapsuleAxis); /// Calculate the contact between a capsule and a triangle. /// If the shapes intersect, the deepest penetration of the capsule along the triangle normal is calculated. /// \tparam T Accuracy of the calculation, can usually be inferred. /// \tparam MOpt Eigen Matrix options, can usually be inferred. /// \param tv0,tv1,tv2 Vertices of the triangle. /// \param cv0,cv1 Ends of the capsule axis. /// \param cr Capsule radius. /// \param [out] penetrationDepth The depth of penetration. /// \param [out] penetrationPointTriangle The contact point on triangle. /// \param [out] penetrationPointCapsule The contact point on capsule. /// \param [out] contactNormal The contact normal that points from capsule to triangle. /// \param [out] penetrationPointCapsuleAxis The point on the capsule axis closest to the triangle. /// \return True, if intersection is detected. /// \note The [out] params are not modified if there is no intersection. /// \note If penetrationPointTriangle is moved by (contactNormal*penetrationDepth*0.5) and penetrationPointCapsule /// is moved by -(contactNormal*penetrationDepth*0.5), the shapes will no longer be intersecting. template inline bool calculateContactTriangleCapsule( const Eigen::Matrix& tv0, const Eigen::Matrix& tv1, const Eigen::Matrix& tv2, const Eigen::Matrix& cv0, const Eigen::Matrix& cv1, double cr, T* penetrationDepth, Eigen::Matrix* penetrationPointTriangle, Eigen::Matrix* penetrationPointCapsule, Eigen::Matrix* contactNormal, Eigen::Matrix* penetrationPointCapsuleAxis); /// Test when 4 points are coplanar in the range [0..1] given their linear motion /// \tparam T The scalar type /// \tparam MOpt The matrix options /// \param A, B, C, D the 4 point' motion (each has a pair from -> to) /// \param[out] timesOfCoplanarity The normalized times (in [0..1]) at which the 4 points are coplanar /// \return The number of times the 4 points are coplanar throughout their motion in [0..1] template int timesOfCoplanarityInRange01( const std::pair, Eigen::Matrix>& A, const std::pair, Eigen::Matrix>& B, const std::pair, Eigen::Matrix>& C, const std::pair, Eigen::Matrix>& D, std::array* timesOfCoplanarity) { /// Let's define the following: /// A(t) = A0 + t * VA with VA = A1 - A0 /// Similarily for B(t), C(t) and D(t) /// Therefore we have AB(t) = B(t) - A(t) = B(0) + t * VB - A(0) - t * VA /// = AB(0) + t * [VB - VA] = AB(0) + t * VAB /// /// The 4 points ABCD are coplanar are time t if they verify: /// [AB(t).cross(CD(t))].AC(t) = 0 /// We develop this equation to clearly formulate the resulting cubic equation: /// /// [AB(0).cross(CD(0)) + t*AB(0).cross(VCD) + t*VAB.cross(CD(0)) + t^2*VAB.cross(VCD)] . [AC(0) + t * VAC] = 0 /// t^0 * [[AB(0).cross(CD(0))].AC(0)] + /// t^1 * [[AB(0).cross(CD(0))].VAC + [AB(0).cross(VCD)].AC(0) + [VAB.cross(CD(0))].AC(0)] + /// t^2 * [[AB(0).cross(VCD)].VAC + [VAB.cross(CD(0))].VAC + [VAB.cross(VCD)].AC(0)] + /// t^3 * [[VAB.cross(VCD)].VAC] = 0 Eigen::Matrix AB0 = B.first - A.first; Eigen::Matrix AC0 = C.first - A.first; Eigen::Matrix CD0 = D.first - C.first; Eigen::Matrix VA = (A.second - A.first); Eigen::Matrix VC = (C.second - C.first); Eigen::Matrix VAB = (B.second - B.first) - VA; Eigen::Matrix VAC = VC - VA; Eigen::Matrix VCD = (D.second - D.first) - VC; T a0 = AB0.cross(CD0).dot(AC0); T a1 = AB0.cross(CD0).dot(VAC) + (AB0.cross(VCD) + VAB.cross(CD0)).dot(AC0); T a2 = (AB0.cross(VCD) + VAB.cross(CD0)).dot(VAC) + VAB.cross(VCD).dot(AC0); T a3 = VAB.cross(VCD).dot(VAC); return findRootsInRange01(Polynomial(a0, a1, a2, a3), timesOfCoplanarity); } }; // namespace Math }; // namespace SurgSim #include "SurgSim/Math/PointTriangleCcdContactCalculation-inl.h" #include "SurgSim/Math/SegmentSegmentCcdContactCalculation-inl.h" #include "SurgSim/Math/TriangleCapsuleContactCalculation-inl.h" #include "SurgSim/Math/TriangleTriangleIntersection-inl.h" #include "SurgSim/Math/TriangleTriangleContactCalculation-inl.h" #endif opensurgsim-0.7.0/SurgSim/Math/IntervalArithmetic-inl.h000066400000000000000000000521151277777236100231310ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_MATH_INTERVALARITHMETIC_INL_H #define SURGSIM_MATH_INTERVALARITHMETIC_INL_H #include "SurgSim/Math/MinMax.h" namespace SurgSim { namespace Math { template Interval::Interval(): m_min(static_cast(0)), m_max(static_cast(0)) {} template Interval::Interval(const T& min, const T& max): m_min(min), m_max(max) { SURGSIM_ASSERT(min <= max) << "Incorrect order of interval bounds"; } template Interval::Interval(const Interval& i): m_min(i.m_min), m_max(i.m_max) {} template Interval::Interval(Interval&& i): m_min(static_cast(0)), m_max(static_cast(0)) { m_min = i.m_min; m_max = i.m_max; } template Interval& Interval::operator=(const Interval& i) { m_min = i.m_min; m_max = i.m_max; return *this; } template Interval& Interval::operator=(Interval&& i) { m_min = i.m_min; m_max = i.m_max; return *this; } template Interval Interval::minToMax(const T& a1, const T& a2) { T min, max; minMax(a1, a2, &min, &max); return Interval(min, max); } template Interval Interval::minToMax(const T& a1, const T& a2, const T& a3) { T min, max; minMax(a1, a2, a3, &min, &max); return Interval(min, max); } template Interval Interval::minToMax(const T& a1, const T& a2, const T& a3, const T& a4) { T min, max; minMax(a1, a2, a3, a4, &min, &max); return Interval(min, max); } template bool Interval::overlapsWith(const Interval& i) const { return (m_min <= i.m_max && i.m_min <= m_max); } template bool Interval::contains(const T& val) const { return (m_min <= val && m_max >= val); } template bool Interval::containsZero() const { return contains(static_cast(0)); } template bool Interval::isApprox(const Interval& i, const T& epsilon) const { return (std::abs(m_min - i.m_min) <= epsilon) && (std::abs(m_max - i.m_max) <= epsilon); } template bool Interval::operator ==(const Interval& i) const { return (m_min == i.m_min && m_max == i.m_max); } template bool Interval::operator !=(const Interval& i) const { return !(this->operator==(i)); } template Interval& Interval::addThickness(const T& thickness) { m_min -= thickness; m_max += thickness; return *this; } template Interval& Interval::extendToInclude(const T& x) { if (x < m_min) { m_min = x; } else if (x > m_max) { m_max = x; } return *this; } template Interval& Interval::extendToInclude(const Interval& i) { if (i.m_min < m_min) { m_min = i.m_min; } if (i.m_max > m_max) { m_max = i.m_max; } return *this; } template Interval Interval::operator +(const Interval& i) const { return Interval(m_min + i.m_min, m_max + i.m_max); } template Interval Interval::operator +(const T& v) const { return Interval(m_min + v, m_max + v); } template Interval& Interval::operator +=(const Interval& i) { m_min += i.m_min; m_max += i.m_max; return *this; } template Interval& Interval::operator +=(const T& v) { m_min += v; m_max += v; return *this; } template Interval Interval::operator -() const { return Interval(-m_max, -m_min); } template Interval Interval::operator -(const Interval& i) const { return Interval(m_min - i.m_max, m_max - i.m_min); } template Interval Interval::operator -(const T& v) const { return Interval(m_min - v, m_max - v); } template Interval& Interval::operator -=(const Interval& i) { m_min -= i.m_max; m_max -= i.m_min; return *this; } template Interval& Interval::operator -=(const T& v) { m_min -= v; m_max -= v; return *this; } template Interval Interval::operator *(const Interval& i) const { return minToMax(m_min * i.m_min, m_min * i.m_max, m_max * i.m_min, m_max * i.m_max); } template Interval Interval::operator *(const T& v) const { if (v >= 0) { return Interval(m_min * v, m_max * v); } else { return Interval(m_max * v, m_min * v); } } template Interval& Interval::operator *=(const Interval& i) { *this = minToMax(m_min * i.m_min, m_min * i.m_max, m_max * i.m_min, m_max * i.m_max); return *this; } template Interval& Interval::operator *=(const T& v) { *this = minToMax(v * m_min, v * m_max); return *this; } template Interval Interval::inverse() const { SURGSIM_ASSERT(!containsZero()) << "Cannot invert or divide by an interval containing 0. Interval: [" << getMin() << ", " << getMax() << "]" << std::endl; return Interval(static_cast(1) / m_max, static_cast(1) / m_min); } template Interval Interval::operator /(const Interval& i) const { return (*this) * i.inverse(); } template Interval& Interval::operator /=(const Interval& i) { return (*this) = (*this) * i.inverse(); } template Interval Interval::square() const { T lowerBoundSquared = m_min * m_min; T upperBoundSquared = m_max * m_max; T minSquare, maxSquare; minMax(lowerBoundSquared, upperBoundSquared, &minSquare, &maxSquare); return Interval((m_min < 0 && m_max > 0) ? 0 : minSquare, maxSquare); } template T Interval::getMin() const { return m_min; } template T Interval::getMax() const { return m_max; } template Interval Interval::lowerHalf() const { return Interval(m_min, (m_min + m_max) * static_cast(0.5)); } template Interval Interval::upperHalf() const { return Interval((m_min + m_max) * static_cast(0.5), m_max); } // Class ND template IntervalND::IntervalND() { for (int i = 0; i < N; i++) { m_interval[i] = Interval(); } } template IntervalND::IntervalND(const std::array, N>& x) { for (int i = 0; i < N; i++) { m_interval[i] = x[i]; } } template IntervalND::IntervalND(const IntervalND& interval) { for (int i = 0; i < N; i++) { m_interval[i] = interval.m_interval[i]; } } template IntervalND::IntervalND(IntervalND&& i) { for (int j = 0; j < N; j++) { m_interval[j] = i.m_interval[j]; } } template IntervalND::IntervalND(const std::array& a, const std::array& b) { for (int i = 0; i < N; ++i) { m_interval[i] = Interval::minToMax(a[i], b[i]); } } template IntervalND& IntervalND::operator =(const IntervalND& interval) { for (int i = 0; i < N; i++) { m_interval[i] = interval.m_interval[i]; } return *this; } template IntervalND& IntervalND::operator=(IntervalND&& i) { if (this != &i) { for (int j = 0; j < N; j++) { m_interval[j] = i.m_interval[j]; } } return *this; } template bool IntervalND::overlapsWith(const IntervalND& interval) const { // For the rectangular [hyper]prisms to overlap, they must overlap in all axes. for (int i = 0; i < N; ++i) { if (!m_interval[i].overlapsWith(interval.m_interval[i])) { return false; } } return true; } template bool IntervalND::isApprox(const IntervalND& interval, const T& epsilon) const { for (int i = 0; i < N; i++) { if (!m_interval[i].isApprox(interval.m_interval[i], epsilon)) { return false; } } return true; } template bool IntervalND::operator ==(const IntervalND& interval) const { for (int i = 0; i < N; i++) { if (m_interval[i] != interval.m_interval[i]) { return false; } } return true; } template bool IntervalND::operator !=(const IntervalND& interval) const { return !(this->operator==(interval)); } template IntervalND& IntervalND::addThickness(const T& thickness) { for (int i = 0; i < N; i++) { m_interval[i].addThickness(thickness); } return *this; } template IntervalND IntervalND::operator +(const IntervalND& interval) const { IntervalND ret; for (int i = 0; i < N; i++) { ret.m_interval[i] = m_interval[i] + interval.m_interval[i]; } return ret; } template IntervalND& IntervalND::operator +=(const IntervalND& interval) { for (int i = 0; i < N; i++) { m_interval[i] += interval.m_interval[i]; } return *this; } template IntervalND IntervalND::operator -(const IntervalND& interval) const { IntervalND ret; for (int i = 0; i < N; i++) { ret.m_interval[i] = m_interval[i] - interval.m_interval[i]; } return ret; } template IntervalND& IntervalND::operator -=(const IntervalND& interval) { for (int i = 0; i < N; i++) { m_interval[i] -= interval.m_interval[i]; } return *this; } template IntervalND IntervalND::operator *(const IntervalND& interval) const { IntervalND ret; for (int i = 0; i < N; i++) { ret.m_interval[i] = m_interval[i] * interval.m_interval[i]; } return ret; } template IntervalND& IntervalND::operator *=(const IntervalND& interval) { for (int i = 0; i < N; i++) { m_interval[i] *= interval.m_interval[i]; } return *this; } template IntervalND IntervalND::inverse() const { IntervalND ret; for (int i = 0; i < N; i++) { ret.m_interval[i] = m_interval[i].inverse(); } return ret; } template IntervalND IntervalND::operator /(const IntervalND& interval) const { IntervalND ret; for (int i = 0; i < N; i++) { ret.m_interval[i] = m_interval[i] / interval.m_interval[i]; } return ret; } template IntervalND& IntervalND::operator /=(const IntervalND& interval) { for (int i = 0; i < N; i++) { m_interval[i] /= interval.m_interval[i]; } return *this; } template Interval IntervalND::dotProduct(const IntervalND& interval) const { Interval ret(static_cast(0), static_cast(0)); for (int i = 0; i < N; i++) { ret += m_interval[i] * interval.m_interval[i]; } return ret; } template Interval IntervalND::magnitudeSquared() const { Interval result = m_interval[0].square(); for (int i = 1; i < N; ++i) { result += m_interval[i].square(); } return result; } template Interval IntervalND::magnitude() const { Interval magnitudeSq = magnitudeSquared(); // Both minimum and maximum are guaranteed to be non-negative. return Interval(sqrt(magnitudeSq.getMin()), sqrt(magnitudeSq.getMax())); } template const Interval& IntervalND::getAxis(size_t i) const { return m_interval[i]; } template IntervalND::IntervalND() { m_interval[0] = Interval(); m_interval[1] = Interval(); m_interval[2] = Interval(); } template IntervalND::IntervalND(const std::array, 3>& x) { m_interval[0] = x[0]; m_interval[1] = x[1]; m_interval[2] = x[2]; } template IntervalND::IntervalND(const Interval& x, const Interval& y, const Interval& z) { m_interval[0] = x; m_interval[1] = y; m_interval[2] = z; } template IntervalND::IntervalND(const IntervalND& i) { m_interval[0] = i.m_interval[0]; m_interval[1] = i.m_interval[1]; m_interval[2] = i.m_interval[2]; } template IntervalND::IntervalND(IntervalND&& i) { m_interval[0] = i.m_interval[0]; m_interval[1] = i.m_interval[1]; m_interval[2] = i.m_interval[2]; } template IntervalND::IntervalND(const std::array& a, const std::array& b) { m_interval[0] = Interval::minToMax(a[0], b[0]); m_interval[1] = Interval::minToMax(a[1], b[1]); m_interval[2] = Interval::minToMax(a[2], b[2]); } template IntervalND& IntervalND::operator =(const IntervalND& i) { m_interval[0] = i.m_interval[0]; m_interval[1] = i.m_interval[1]; m_interval[2] = i.m_interval[2]; return *this; } template IntervalND& IntervalND::operator=(IntervalND&& i) { m_interval[0] = i.m_interval[0]; m_interval[1] = i.m_interval[1]; m_interval[2] = i.m_interval[2]; return *this; } template bool IntervalND::overlapsWith(const IntervalND& interval) const { // For the rectangular prisms to overlap, they must overlap in all axes. return (m_interval[0].overlapsWith(interval.m_interval[0]) && m_interval[1].overlapsWith(interval.m_interval[1]) && m_interval[2].overlapsWith(interval.m_interval[2])); } template bool IntervalND::isApprox(const IntervalND& i, const T& epsilon) const { return (m_interval[0].isApprox(i.m_interval[0], epsilon) && m_interval[1].isApprox(i.m_interval[1], epsilon) && m_interval[2].isApprox(i.m_interval[2], epsilon)); } template bool IntervalND::operator ==(const IntervalND& i) const { return (m_interval[0] == i.m_interval[0] && m_interval[1] == i.m_interval[1] && m_interval[2] == i.m_interval[2]); } template bool IntervalND::operator !=(const IntervalND& i) const { return !(this->operator==(i)); } template IntervalND& IntervalND::addThickness(const T& thickness) { m_interval[0].addThickness(thickness); m_interval[1].addThickness(thickness); m_interval[2].addThickness(thickness); return *this; } template IntervalND IntervalND::operator +(const IntervalND& i) const { return IntervalND(m_interval[0] + i.m_interval[0], m_interval[1] + i.m_interval[1], m_interval[2] + i.m_interval[2]); } template IntervalND& IntervalND::operator +=(const IntervalND& i) { m_interval[0] += i.m_interval[0]; m_interval[1] += i.m_interval[1]; m_interval[2] += i.m_interval[2]; return *this; } template IntervalND IntervalND::operator -(const IntervalND& i) const { return IntervalND(m_interval[0] - i.m_interval[0], m_interval[1] - i.m_interval[1], m_interval[2] - i.m_interval[2]); } template IntervalND& IntervalND::operator -=(const IntervalND& i) { m_interval[0] -= i.m_interval[0]; m_interval[1] -= i.m_interval[1]; m_interval[2] -= i.m_interval[2]; return *this; } template IntervalND IntervalND::operator *(const IntervalND& i) const { return IntervalND(m_interval[0] * i.m_interval[0], m_interval[1] * i.m_interval[1], m_interval[2] * i.m_interval[2]); } template IntervalND& IntervalND::operator *=(const IntervalND& i) { m_interval[0] *= i.m_interval[0]; m_interval[1] *= i.m_interval[1]; m_interval[2] *= i.m_interval[2]; return *this; } template IntervalND IntervalND::inverse() const { return IntervalND(m_interval[0].inverse(), m_interval[1].inverse(), m_interval[2].inverse()); } template IntervalND IntervalND::operator /(const IntervalND& i) const { return IntervalND(m_interval[0] / i.m_interval[0], m_interval[1] / i.m_interval[1], m_interval[2] / i.m_interval[2]); } template IntervalND& IntervalND::operator /=(const IntervalND& i) { m_interval[0] /= i.m_interval[0]; m_interval[1] /= i.m_interval[1]; m_interval[2] /= i.m_interval[2]; return *this; } template Interval IntervalND::dotProduct(const IntervalND& i) const { return (m_interval[0] * i.m_interval[0] + m_interval[1] * i.m_interval[1] + m_interval[2] * i.m_interval[2]); } template IntervalND IntervalND::crossProduct(const IntervalND& i) const { return IntervalND(m_interval[1] * i.m_interval[2] - m_interval[2] * i.m_interval[1], m_interval[2] * i.m_interval[0] - m_interval[0] * i.m_interval[2], m_interval[0] * i.m_interval[1] - m_interval[1] * i.m_interval[0]); } template Interval IntervalND::magnitudeSquared() const { return m_interval[0].square() + m_interval[1].square() + m_interval[2].square(); } template Interval IntervalND::magnitude() const { Interval magnitudeSq = magnitudeSquared(); // Both minimum and maximum are guaranteed to be non-negative. return Interval(sqrt(magnitudeSq.getMin()), sqrt(magnitudeSq.getMax())); } template const Interval& IntervalND::getAxis(size_t i) const { return m_interval[i]; } // Utility functions not part of any class template Interval operator+ (T v, const Interval& i) { return i + v; } template Interval operator* (T v, const Interval& i) { return i * v; } template void IntervalArithmetic_add(const Interval& a, const Interval& b, Interval* res) { res->m_min = a.m_min + b.m_min; res->m_max = a.m_max + b.m_max; } template void IntervalArithmetic_addadd(const Interval& a, const Interval& b, Interval* res) { res->m_min += a.m_min + b.m_min; res->m_max += a.m_max + b.m_max; } template void IntervalArithmetic_sub(const Interval& a, const Interval& b, Interval* res) { res->m_min = a.m_min - b.m_max; res->m_max = a.m_max - b.m_min; } template void IntervalArithmetic_addsub(const Interval& a, const Interval& b, Interval* res) { res->m_min += a.m_min - b.m_max; res->m_max += a.m_max - b.m_min; } template void IntervalArithmetic_mul(const Interval& a, const Interval& b, Interval* res) { T min, max; minMax(a.m_min * b.m_min, a.m_min * b.m_max, a.m_max * b.m_min, a.m_max * b.m_max, &min, &max); res->m_min = min; res->m_max = max; } template void IntervalArithmetic_addmul(const Interval& a, const Interval& b, Interval* res) { T min, max; minMax(a.m_min * b.m_min, a.m_min * b.m_max, a.m_max * b.m_min, a.m_max * b.m_max, &min, &max); res->m_min += min; res->m_max += max; } template void IntervalArithmetic_submul(const Interval& a, const Interval& b, Interval* res) { T min, max; minMax(a.m_min * b.m_min, a.m_min * b.m_max, a.m_max * b.m_min, a.m_max * b.m_max, &min, &max); res->m_min -= max; res->m_max -= min; } // Interval functions template std::ostream& operator<< (std::ostream& o, const Interval& interval) { o << "[" << interval.getMin() << "," << interval.getMax() << "]"; return o; } // Interval ND functions template std::ostream& operator<< (std::ostream& o, const IntervalND& interval) { o << "(" << interval.getAxis(0); for (int i = 1; i < N; ++i) { o << ";" << interval.getAxis(i); } o << ")"; return o; } // Interval 3D functions template void IntervalArithmetic_add(const IntervalND& a, const IntervalND& b, IntervalND* res) { IntervalArithmetic_add(a.m_interval[0], b.m_interval[0], &(res->m_interval[0])); IntervalArithmetic_add(a.m_interval[1], b.m_interval[1], &(res->m_interval[1])); IntervalArithmetic_add(a.m_interval[2], b.m_interval[2], &(res->m_interval[2])); } template void IntervalArithmetic_sub(const IntervalND& a, const IntervalND& b, IntervalND* res) { IntervalArithmetic_sub(a.m_interval[0], b.m_interval[0], &(res->m_interval[0])); IntervalArithmetic_sub(a.m_interval[1], b.m_interval[1], &(res->m_interval[1])); IntervalArithmetic_sub(a.m_interval[2], b.m_interval[2], &(res->m_interval[2])); } template void IntervalArithmetic_crossProduct(const IntervalND& a, const IntervalND& b, IntervalND* res) { IntervalArithmetic_mul(a.m_interval[1], b.m_interval[2], &(res->m_interval[0])); IntervalArithmetic_submul(a.m_interval[2], b.m_interval[1], &(res->m_interval[0])); IntervalArithmetic_mul(a.m_interval[2], b.m_interval[0], &(res->m_interval[1])); IntervalArithmetic_submul(a.m_interval[0], b.m_interval[2], &(res->m_interval[1])); IntervalArithmetic_mul(a.m_interval[0], b.m_interval[1], &(res->m_interval[2])); IntervalArithmetic_submul(a.m_interval[1], b.m_interval[0], &(res->m_interval[2])); } template void IntervalArithmetic_dotProduct(const IntervalND& a, const IntervalND& b, Interval* res) { IntervalArithmetic_mul(a.m_interval[0], b.m_interval[0], res); IntervalArithmetic_addmul(a.m_interval[1], b.m_interval[1], res); IntervalArithmetic_addmul(a.m_interval[2], b.m_interval[2], res); } }; // Math }; // SurgSim #endif // SURGSIM_MATH_INTERVALARITHMETIC_INL_H opensurgsim-0.7.0/SurgSim/Math/IntervalArithmetic.h000066400000000000000000000525711277777236100223570ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_MATH_INTERVALARITHMETIC_H #define SURGSIM_MATH_INTERVALARITHMETIC_H #include #include namespace SurgSim { namespace Math { /// Interval defines the concept of a mathematical interval and provides operations on it /// including arithmetic operations, construction, and IO. /// /// \tparam T underlying data type over which the interval is defined. /// /// \sa IntervalND and IntervalND template class Interval { template friend void IntervalArithmetic_add(const Interval

& a, const Interval

& b, Interval

* res); // + template friend void IntervalArithmetic_addadd(const Interval

& a, const Interval

& b, Interval

* res); // +=( + ) template friend void IntervalArithmetic_sub(const Interval

& a, const Interval

& b, Interval

* res); // - template friend void IntervalArithmetic_addsub(const Interval

& a, const Interval

& b, Interval

* res); // +=( - ) template friend void IntervalArithmetic_mul(const Interval

& a, const Interval

& b, Interval

* res); // * template friend void IntervalArithmetic_addmul(const Interval

& a, const Interval

& b, Interval

* res); // += ( * ) template friend void IntervalArithmetic_submul(const Interval

& a, const Interval

& b, Interval

* res); // -= ( * ) public: /// Constructor Interval(); /// Constructor /// \param min Lower bound of the constructed interval /// \param max Upper bound of the constructed interval /// \exception if max is less than min Interval(const T& min, const T& max); /// Copy constructor /// \param i Interval to be copied Interval(const Interval& i); /// Move constructor /// \param i Interval to be copied Interval(Interval&& i); /// Assignment operator /// \param i Interval to be copied Interval& operator =(const Interval& i); /// Move assignment operator /// \param i Interval to be moved Interval& operator=(Interval&& i); /// Generate an interval from min to max based on the inputs /// \param a1 first input value /// \param a2 second input value /// \return an interval spanning the minimum input to the maximum input. static Interval minToMax(const T& a1, const T& a2); /// Generate an interval from min to max based on the inputs /// \param a1 first input value /// \param a2 second input value /// \param a3 third input value /// \return an interval spanning the minimum input to the maximum input. static Interval minToMax(const T& a1, const T& a2, const T& a3); /// Generate an interval from min to max based on the inputs /// \param a1 first input value /// \param a2 second input value /// \param a3 third input value /// \param a4 fourth input value /// \return an interval spanning the minimum input to the maximum input. static Interval minToMax(const T& a1, const T& a2, const T& a3, const T& a4); /// \param i the interval the current interval will be tested against /// \return true if the input interval overlaps the current interval bool overlapsWith(const Interval& i) const; /// \param val the value to test for inclusion in the interval /// \return true if the current interval contains val bool contains(const T& val) const; /// \return true if the current interval contains 0 bool containsZero() const; /// \param i the interval to be tested /// \param epsilon the nearness parameter /// \return true if the current interval is within epsilon of the input interval bool isApprox(const Interval& i, const T& epsilon) const; /// \param i the interval to be tested /// \return true if the current interval is identical to the input interval bool operator ==(const Interval& i) const; /// \param i the interval to be tested /// \return true if the current interval is not identical to the input interval bool operator !=(const Interval& i) const; /// Widens the current interval by thickness on both sides /// \param thickness the amount to widen the current interval on both sides /// \return the current interval after modification Interval& addThickness(const T& thickness); /// Widens the current interval on one end to include x /// \param x the value to be included in the interval /// \return the current interval extended to include x Interval& extendToInclude(const T& x); /// Widens the current interval on both ends to include i /// \param i the interval to be wholly contained in the current interval /// \return the current interval extended to include the entirety of i Interval& extendToInclude(const Interval& i); /// @{ /// Standard arithmetic operators extended to intervals Interval operator +(const Interval& i) const; Interval operator +(const T& v) const; Interval& operator +=(const Interval& i); Interval& operator +=(const T& v); Interval operator -() const; Interval operator -(const Interval& i) const; Interval operator -(const T& v) const; Interval& operator -=(const Interval& i); Interval& operator -=(const T& v); Interval operator *(const Interval& i) const; Interval operator *(const T& v) const; Interval& operator *=(const Interval& i); Interval& operator *=(const T& v); /// @} /// \return the inverse of the current interval /// \exception if the interval includes 0 Interval inverse() const; /// \param i the interval to be divided by /// \return the current interval multiplied by the inverse of i /// \exception if i includes 0 Interval operator /(const Interval& i) const; /// \param i the interval to be divided by /// \return the current interval multiplied by the inverse of i /// \exception if i includes 0 /// \note the current interval is modified by this operation Interval& operator /=(const Interval& i); /// \return the square of the current interval /// \note if the original interval contains 0, then the result will have the minimum identically set to 0 Interval square() const; /// \return the lower limit of the interval T getMin() const; /// \return the upper limit of the interval T getMax() const; /// \return the interval from the lower limit to the midpoint Interval lowerHalf() const; /// \return the interval from the midpoint to the upper limit Interval upperHalf() const; private: /// The lower (m_min) and upper (m_max) limits of the interval T m_min, m_max; }; /// IntervalND defines the concept of a group of mathematical intervals and provides operations on them /// including arithmetic operations, construction, and IO. /// /// \tparam T underlying data type over which the interval is defined. /// \tparam N number of intervals in the group. /// /// \sa Interval and IntervalND template class IntervalND { public: static_assert(N >= 1, "IntervalND cannot be instantiated with N<=0."); /// Constructor IntervalND(); /// Constructor /// \param x array of N intervals to be copied into the group explicit IntervalND(const std::array, N>& x); /// Copy constructor /// \param interval interval group to copied IntervalND(const IntervalND& interval); /// Move constructor /// \param i Interval to be copied IntervalND(IntervalND&& i); /// Constructor /// \param a array of N values to be used as the respective minimums for the interval entries. /// \param b array of N values to be used as the respective maximums for the interval entries. IntervalND(const std::array& a, const std::array& b); /// Assignment operator /// \param interval Interval group to be copied IntervalND& operator =(const IntervalND& interval); /// Move assignment operator /// \param i Interval to be moved IntervalND& operator=(IntervalND&& i); /// \param interval the interval group the current group will be tested against /// \return true if the input group interval overlaps the current group bool overlapsWith(const IntervalND& interval) const; /// \param interval the interval group to be tested /// \param epsilon the nearness parameter /// \return true if each interval in the input group is approximately equal to its correspondent /// element in interval. bool isApprox(const IntervalND& interval, const T& epsilon) const; /// \param interval the interval group to be tested /// \return true if the current interval group is identical to the input group bool operator ==(const IntervalND& interval) const; /// \param interval the interval group to be tested /// \return true if the current interval group is not identical to the input group bool operator !=(const IntervalND& interval) const; /// Widens every interval in the current interval group by thickness on both sides /// \param thickness the amount to widen on both sides /// \return the current interval group after modification IntervalND& addThickness(const T& thickness); /// @{ /// Standard arithmetic operators extended to interval groups IntervalND operator +(const IntervalND& interval) const; IntervalND& operator +=(const IntervalND& interval); IntervalND operator -(const IntervalND& interval) const; IntervalND& operator -=(const IntervalND& interval); IntervalND operator *(const IntervalND& interval) const; IntervalND& operator *=(const IntervalND& interval); /// @} /// \return the inverse of each interval in the interval group /// \exception if any interval includes 0 IntervalND inverse() const; /// \param interval the interval to be divided by /// \return the product of each interval in the group multiplied by the inverse of /// its correspondent in interval /// \exception if any component of interval includes 0 IntervalND operator /(const IntervalND& interval) const; /// \param interval the interval to be divided by /// \return the product of each interval in the group multiplied by the inverse of /// its correspondent in interval /// \note the current interval is modified by this operation IntervalND& operator /=(const IntervalND& interval); /// \param interval the input interval group /// \return the interval dot product of the current group and interval Interval dotProduct(const IntervalND& interval) const; /// \return the square of the interval magnitude for the current group Interval magnitudeSquared() const; /// \return the interval magnitude for the current group Interval magnitude() const; /// \param i the selector for the interval to be returned /// \return the ith interval in the current group const Interval& getAxis(size_t i) const; private: /// The N dimensional group of intervals std::array, N> m_interval; }; /// IntervalND defines the concept of a group of mathematical intervals specialized to 3 intervals and provides /// operations on them including arithmetic operations, construction, and IO. /// /// \tparam T underlying data type over which the interval is defined. /// /// \sa Interval and IntervalND template class IntervalND { template friend void IntervalArithmetic_add(const IntervalND& a, const IntervalND& b, IntervalND* res); template friend void IntervalArithmetic_sub(const IntervalND& a, const IntervalND& b, IntervalND* res); template friend void IntervalArithmetic_crossProduct(const IntervalND& a, const IntervalND& b, IntervalND* res); template friend void IntervalArithmetic_dotProduct(const IntervalND& a, const IntervalND& b, Interval

* res); public: /// Constructor IntervalND(); /// Constructor /// \param x array of 3 intervals to be copied into the group explicit IntervalND(const std::array, 3>& x); /// Constructor /// \param x first interval to be added to the 3 group /// \param y second interval to be added to the 3 group /// \param z third interval to be added to the 3 group IntervalND(const Interval& x, const Interval& y, const Interval& z); /// Copy constructor /// \param i interval 3 group to copied IntervalND(const IntervalND& i); /// Move constructor /// \param i Interval to be copied IntervalND(IntervalND&& i); /// Constructor /// \param a array of 3 values to be used as the respective minimums for the interval entries. /// \param b array of 3 values to be used as the respective maximums for the interval entries. IntervalND(const std::array& a, const std::array& b); /// Assignment operator /// \param i Interval 3 group to be copied IntervalND& operator =(const IntervalND& i); /// Move assignment operator /// \param i Interval to be moved IntervalND& operator=(IntervalND&& i); /// \param interval the interval group the current group will be tested against /// \return true if the input 3 group interval overlaps the current 3 group bool overlapsWith(const IntervalND& interval) const; /// \param interval the interval group to be tested /// \param epsilon the nearness parameter /// \return true if each interval in the input group is approximately equal to its correspondent /// element in interval. bool isApprox(const IntervalND& interval, const T& epsilon) const; /// \param i the interval group to be tested /// \return true if the current interval 3 group is identical to the input 3 group i bool operator ==(const IntervalND& i) const; /// \param i the interval group to be tested /// \return true if the current interval 3 group is not identical to the input 3 group i bool operator !=(const IntervalND& i) const; /// Widens every interval in the current interval group by thickness on both sides /// \param thickness the amount to widen on both sides /// \return the current interval group after modification IntervalND& addThickness(const T& thickness); /// @{ /// Standard arithmetic operators extended to 3 interval groups IntervalND operator +(const IntervalND& i) const; IntervalND& operator +=(const IntervalND& i); IntervalND operator -(const IntervalND& i) const; IntervalND& operator -=(const IntervalND& i); IntervalND operator *(const IntervalND& i) const; IntervalND& operator *=(const IntervalND& i); /// @} /// \return the inverse of each interval in the 3 interval group /// \exception if any interval includes 0 IntervalND inverse() const; /// \param i the interval to be divided by /// \return the product of each interval in the 3 group multiplied by the inverse of /// its correspondent in i /// \exception if any component of interval includes 0 IntervalND operator /(const IntervalND& i) const; /// \param i the interval to be divided by /// \return the product of each interval in the 3 group multiplied by the inverse of /// its correspondent in i /// \note the current interval is modified by this operation IntervalND& operator /=(const IntervalND& i); /// \param i the input interval group /// \return the interval dot product of the current 3 group and interval Interval dotProduct(const IntervalND& i) const; /// \param i the input interval group /// \return the interval cross product of the current 3 group and interval IntervalND crossProduct(const IntervalND& i) const; /// \return the square of the interval magnitude for the current 3 group Interval magnitudeSquared() const; /// \return the interval magnitude for the current 3 group Interval magnitude() const; /// \param i the selector for the interval to be returned /// \return the ith interval in the current 3 group const Interval& getAxis(size_t i) const; private: /// The 3 dimensional group of intervals std::array, 3> m_interval; }; // Interval utilities /// \tparam T underlying type of the interval /// \param v the scalar /// \param i the interval /// \return the sum of the scalar v and the interval i template Interval operator+ (T v, const Interval& i); /// \tparam T underlying type of the interval /// \param v the scalar /// \param i the interval /// \return the product of the scalar v and the interval i template Interval operator* (T v, const Interval& i); /// Write a textual version of the interval to an output stream /// \tparam T underlying type of the interval /// \param o the ostream to be written to /// \param interval the interval to write /// \return the active ostream template std::ostream& operator<< (std::ostream& o, const Interval& interval); /// Calculate the sum of two intervals /// \tparam P underlying type of the interval /// \param a the first interval /// \param b the second interval /// \param res [out] the result of a + b template void IntervalArithmetic_add(const Interval

& a, const Interval

& b, Interval

* res); // + /// Calculate the sum of three intervals res + a + b /// \tparam P underlying type of the interval /// \param a the first interval /// \param b the second interval /// \param res [in/out] the result of res + a + b template void IntervalArithmetic_addadd(const Interval

& a, const Interval

& b, Interval

* res); // +=( + ) /// Calculate the difference of two intervals /// \tparam P underlying type of the interval /// \param a the first interval /// \param b the second interval /// \param res [out] the result of a - b template void IntervalArithmetic_sub(const Interval

& a, const Interval

& b, Interval

* res); // - /// Add the difference of two intervals to an existing value /// \tparam P underlying type of the interval /// \param a the first interval /// \param b the second interval /// \param res [in/out] the result of res + (a - b) template void IntervalArithmetic_addsub(const Interval

& a, const Interval

& b, Interval

* res); // +=( - ) /// Calculate the product of two intervals /// \tparam P underlying type of the interval /// \param a the first interval /// \param b the second interval /// \param res [out] the result of a * b template void IntervalArithmetic_mul(const Interval

& a, const Interval

& b, Interval

* res); // * /// Add the product of two intervals to an existing value /// \tparam P underlying type of the interval /// \param a the first interval /// \param b the second interval /// \param res [in/out] the result of res + (a * b) template void IntervalArithmetic_addmul(const Interval

& a, const Interval

& b, Interval

* res); // += ( * ) /// Subtract the product of two intervals from an existing value /// \tparam P underlying type of the interval /// \param a the first interval /// \param b the second interval /// \param res [in/out] the result of res - (a * b) template void IntervalArithmetic_submul(const Interval

& a, const Interval

& b, Interval

* res); // -= ( * ) // Interval ND utilities /// Write a textual version of an interval group to an output stream /// \tparam T underlying type of the interval /// \tparam N number of intervals in the group /// \param o the ostream to be written to /// \param interval the interval group to write /// \return the active ostream template std::ostream& operator<< (std::ostream& o, const IntervalND& interval); // Interval 3D utilities /// Calculate the sum of two interval groups /// \tparam P underlying type of the interval /// \param a the first interval group /// \param b the second interval group /// \param res [out] the result of a + b template void IntervalArithmetic_add(const IntervalND& a, const IntervalND& b, IntervalND* res); /// Calculate the difference of two interval groups /// \tparam P underlying type of the interval /// \param a the first interval group /// \param b the second interval group /// \param res [out] the result of a - b template void IntervalArithmetic_sub(const IntervalND& a, const IntervalND& b, IntervalND* res); /// Calculate the dot product of two interval groups /// \tparam P underlying type of the interval /// \param a the first interval group /// \param b the second interval group /// \param res [out] the dot product of a and b template void IntervalArithmetic_dotProduct(const IntervalND& a, const IntervalND& b, Interval

* res); /// Calculate the cross product of two interval groups /// \tparam P underlying type of the interval /// \param a the first interval group /// \param b the second interval group /// \param res [out] the cross product of a and b template void IntervalArithmetic_crossProduct(const IntervalND& a, const IntervalND& b, IntervalND* res); }; // Math }; // SurgSim #include "SurgSim/Math/IntervalArithmetic-inl.h" #endif // SURGSIM_MATH_INTERVALARITHMETIC_H opensurgsim-0.7.0/SurgSim/Math/KalmanFilter-inl.h000066400000000000000000000075071277777236100217110ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_MATH_KALMANFILTER_INL_H #define SURGSIM_MATH_KALMANFILTER_INL_H namespace SurgSim { namespace Math { template KalmanFilter::KalmanFilter() : m_stateTransition(Eigen::Matrix::Constant(std::numeric_limits::quiet_NaN())), m_observationMatrix(Eigen::Matrix::Constant( std::numeric_limits::quiet_NaN())), m_processNoiseCovariance(Eigen::Matrix::Constant( std::numeric_limits::quiet_NaN())), m_measurementNoiseCovariance(Eigen::Matrix::Constant( std::numeric_limits::quiet_NaN())), m_state(Eigen::Matrix::Constant(std::numeric_limits::quiet_NaN())), m_stateCovariance(Eigen::Matrix::Constant(std::numeric_limits::quiet_NaN())) { } template KalmanFilter::~KalmanFilter() { } template void KalmanFilter::setInitialState(const Eigen::Ref>& x) { m_state = x; } template void KalmanFilter::setInitialStateCovariance(const Eigen::Ref>& p) { m_stateCovariance = p; } template void KalmanFilter::setStateTransition(const Eigen::Ref>& a) { m_stateTransition = a; } template void KalmanFilter::setObservationMatrix(const Eigen::Ref>& h) { m_observationMatrix = h; } template void KalmanFilter::setProcessNoiseCovariance(const Eigen::Ref>& q) { m_processNoiseCovariance = q; } template void KalmanFilter::setMeasurementNoiseCovariance(const Eigen::Ref>& r) { m_measurementNoiseCovariance = r; } template const Eigen::Matrix& KalmanFilter::update() { updatePrediction(); return m_state; } template const Eigen::Matrix& KalmanFilter::update(const Eigen::Ref>& measurement) { updatePrediction(); updateMeasurement(measurement); return m_state; } template const Eigen::Matrix& KalmanFilter::getState() const { return m_state; } template void KalmanFilter::updatePrediction() { m_state = m_stateTransition * m_state; m_stateCovariance = m_stateTransition * m_stateCovariance * m_stateTransition.transpose() + m_processNoiseCovariance; } template void KalmanFilter::updateMeasurement(const Eigen::Ref>& measurement) { const Matrix gain = m_stateCovariance * m_observationMatrix.transpose() * (m_observationMatrix * m_stateCovariance * m_observationMatrix.transpose() + m_measurementNoiseCovariance).inverse(); m_state += gain * (measurement - m_observationMatrix * m_state); m_stateCovariance -= gain * m_observationMatrix * m_stateCovariance; } }; // namespace Math }; // namespace SurgSim #endif // SURGSIM_MATH_KALMANFILTER_INL_Hopensurgsim-0.7.0/SurgSim/Math/KalmanFilter.h000066400000000000000000000076411277777236100211300ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_MATH_KALMANFILTER_H #define SURGSIM_MATH_KALMANFILTER_H #include "SurgSim/Math/Matrix.h" #include "SurgSim/Math/Vector.h" namespace SurgSim { namespace Math { /// Implements a linear Kalman filter, a recursive estimator. /// Does not support control inputs. /// \tparam M The length of the state vector. /// \tparam N The length of the measurement vector. template class KalmanFilter { public: /// Constructor. KalmanFilter(); /// Destructor. virtual ~KalmanFilter(); /// Set the initial state vector, x(0), length m. /// \param x The initial state. void setInitialState(const Eigen::Ref>& x); /// Set the initial covariance of the state, P(0), size m x m. /// \param p The initial covariance. void setInitialStateCovariance(const Eigen::Ref>& p); /// Set the state transition, A, such that x(t+1) = A.x(t), size m x m. /// \param a The state transition matrix. void setStateTransition(const Eigen::Ref>& a); /// Set the observation matrix, H, such that z(t) = H.x(t), size n x m. /// \param h The observation matrix. void setObservationMatrix(const Eigen::Ref>& h); /// Set the process noise covariance, size m x m. /// \param q The process noise covariance. void setProcessNoiseCovariance(const Eigen::Ref>& q); /// Set the measurement noise covariance, size n x n. /// \param r The measurement noise covariance. void setMeasurementNoiseCovariance(const Eigen::Ref>& r); /// Advance one step without a measurement. /// \return The estimate for the new state, x(t+1), length m. const Eigen::Matrix& update(); /// Advance one step with measurement. /// \param measurement The measurement, z(t), length n. /// \return The estimate for the new state, x(t+1), length m. const Eigen::Matrix& update(const Eigen::Ref>& measurement); /// Get the current state. Does not advance the state. /// \return The estimate for the current state, x(t), length m. const Eigen::Matrix& getState() const; private: /// Use the current estimated state, x(t), and matrices to predict the new state, x(t+1), and /// state covariance, P(t+1). void updatePrediction(); /// Correct the current estimated state, x(t), and state covariance, P(t), based on a measurement, z(t). /// \param measurement The measurement, length n. void updateMeasurement(const Eigen::Ref>& measurement); /// The state transition matrix. Eigen::Matrix m_stateTransition; /// The observation matrix. Eigen::Matrix m_observationMatrix; /// The process noise covariance. Eigen::Matrix m_processNoiseCovariance; /// The measurement noise covariance. Eigen::Matrix m_measurementNoiseCovariance; /// The state. Eigen::Matrix m_state; /// The covariance of the state. Eigen::Matrix m_stateCovariance; }; }; // Math }; // SurgSim #include "SurgSim/Math/KalmanFilter-inl.h" #endif // SURGSIM_MATH_KALMANFILTER_H opensurgsim-0.7.0/SurgSim/Math/LinearMotionArithmetic-inl.h000066400000000000000000000451001277777236100237410ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_MATH_LINEARMOTIONARITHMETIC_INL_H #define SURGSIM_MATH_LINEARMOTIONARITHMETIC_INL_H namespace SurgSim { namespace Math { template LinearMotion::LinearMotion() : m_start(static_cast(0)), m_end(static_cast(0)) {} template LinearMotion::LinearMotion(const T& start, const T& end) : m_start(start), m_end(end) {} template LinearMotion::LinearMotion(const LinearMotion& m) : m_start(m.m_start), m_end(m.m_end) {} template LinearMotion::LinearMotion(LinearMotion&& m) { *this = std::move(m); } template LinearMotion& LinearMotion::operator=(const LinearMotion& m) { m_start = m.m_start; m_end = m.m_end; return *this; } template LinearMotion& LinearMotion::operator=(LinearMotion&& m) { m_start = std::move(m.m_start); m_end = std::move(m.m_end); return *this; } template Interval LinearMotion::toInterval() const { return Interval::minToMax(m_start, m_end); } template Polynomial LinearMotion::toPolynomial() const { return Polynomial(m_start, m_end - m_start); } template bool LinearMotion::containsZero() const { return toInterval().containsZero(); } template bool LinearMotion::isApprox(const LinearMotion& m, const T& epsilon) const { return (std::abs(m_start - m.m_start) <= epsilon) && (std::abs(m_end - m.m_end) <= epsilon); } template bool LinearMotion::operator==(const LinearMotion& m) const { return ((m_start == m.m_start) && (m_end == m.m_end)); } template bool LinearMotion::operator!=(const LinearMotion& m) const { return !(*this == m); } template LinearMotion LinearMotion::operator+(const LinearMotion& m) const { return LinearMotion(m_start + m.m_start, m_end + m.m_end); } template LinearMotion& LinearMotion::operator+=(const LinearMotion& m) { m_start += m.m_start; m_end += m.m_end; return *this; } template LinearMotion LinearMotion::operator-(const LinearMotion& m) const { return LinearMotion(m_start - m.m_start, m_end - m.m_end); } template LinearMotion& LinearMotion::operator-=(const LinearMotion& m) { m_start -= m.m_start; m_end -= m.m_end; return *this; } template Interval LinearMotion::operator*(const LinearMotion& m) const { return this->toInterval() * m.toInterval(); } template Interval LinearMotion::operator/(const LinearMotion& m) const { return this->toInterval() / m.toInterval(); } template T LinearMotion::getStart() const { return m_start; } template T LinearMotion::getEnd() const { return m_end; } template T LinearMotion::atTime(const T& t) const { return ((static_cast(1) - t) * m_start + t * m_end); } template LinearMotion LinearMotion::firstHalf() const { return LinearMotion(m_start, (m_start + m_end) * static_cast(0.5)); } template LinearMotion LinearMotion::secondHalf() const { return LinearMotion((m_start + m_end) * static_cast(0.5), m_end); } // Class ND template LinearMotionND::LinearMotionND() { } template LinearMotionND::LinearMotionND(const std::array, N>& x) { m_motion = x; } template LinearMotionND::LinearMotionND(const LinearMotionND& motion) { m_motion = motion.m_motion; } template LinearMotionND::LinearMotionND(LinearMotionND&& motion) { *this = std::move(motion); } template LinearMotionND::LinearMotionND(const std::array& a, const std::array& b) { for (int i = 0; i < N; ++i) { m_motion[i] = LinearMotion(a[i], b[i]); } } template LinearMotionND& LinearMotionND::operator=(const LinearMotionND& motion) { m_motion = motion.m_motion; return *this; } template LinearMotionND& LinearMotionND::operator=(LinearMotionND&& motion) { if (this != &motion) { m_motion = std::move(motion.m_motion); } return *this; } template IntervalND LinearMotionND::toInterval() const { std::array, N> motions; for (int i = 0; i < N; ++i) { motions[i] = m_motion[i].toInterval(); } return IntervalND(motions); } template bool LinearMotionND::isApprox(const LinearMotionND& motion, const T& epsilon) const { for (int i = 0; i < N; i++) { if (!m_motion[i].isApprox(motion.m_interval[i], epsilon)) { return false; } } return true; } template bool LinearMotionND::operator==(const LinearMotionND& motion) const { return (m_motion == motion.m_motion); } template bool LinearMotionND::operator!=(const LinearMotionND& motion) const { return !(this->operator==(motion)); } template LinearMotionND LinearMotionND::operator+(const LinearMotionND& m) const { LinearMotionND ret(*this); ret += m; return ret; } template LinearMotionND& LinearMotionND::operator+=(const LinearMotionND& m) { for (int i = 0; i < N; ++i) { m_motion[i] += m.m_motion[i]; } return *this; } template LinearMotionND LinearMotionND::operator-(const LinearMotionND& m) const { LinearMotionND ret(*this); ret -= m; return ret; } template LinearMotionND& LinearMotionND::operator-=(const LinearMotionND& m) { for (int i = 0; i < N; ++i) { m_motion[i] -= m.m_motion[i]; } return *this; } template IntervalND LinearMotionND::operator*(const LinearMotionND& m) const { return this->toInterval() * m.toInterval(); } template IntervalND LinearMotionND::operator/(const LinearMotionND& m) const { return this->toInterval() / m.toInterval(); } template Interval LinearMotionND::dotProduct(const LinearMotionND& motion) const { Interval ret(static_cast(0), static_cast(0)); for (int i = 0 ; i < N ; i++) { ret += m_motion[i] * motion.m_motion[i]; } return ret; } template const LinearMotion& LinearMotionND::getAxis(int i) const { SURGSIM_ASSERT((i >= 0) && (i < N)) << "Asking for an axis greater than the dimensionality of the linear motion"; return m_motion[i]; } template void LinearMotionND::getStart(std::array* start) const { for (int i = 0; i < N; ++i) { (*start)[i] = m_motion[i].getStart(); } } template void LinearMotionND::getEnd(std::array* end) const { for (int i = 0; i < N; ++i) { (*end)[i] = m_motion[i].getEnd(); } } template LinearMotionND LinearMotionND::firstHalf() const { LinearMotionND ret; for (int i = 0; i < N; ++i) { ret.m_motion[i] = m_motion[i].firstHalf(); } return ret; } template LinearMotionND LinearMotionND::secondHalf() const { LinearMotionND ret; for (int i = 0; i < N; ++i) { ret.m_motion[i] = m_motion[i].secondHalf(); } return ret; } // Special case for dimension 3 template LinearMotionND::LinearMotionND() { } template LinearMotionND::LinearMotionND(const std::array, 3>& x) { m_motion[0] = x[0]; m_motion[1] = x[1]; m_motion[2] = x[2]; } template LinearMotionND::LinearMotionND(const LinearMotion& a, const LinearMotion& b, const LinearMotion& c) { m_motion[0] = a; m_motion[1] = b; m_motion[2] = c; } template LinearMotionND::LinearMotionND(const LinearMotionND& motion) { m_motion[0] = motion.m_motion[0]; m_motion[1] = motion.m_motion[1]; m_motion[2] = motion.m_motion[2]; } template LinearMotionND::LinearMotionND(LinearMotionND&& motion) { *this = std::move(motion); } template LinearMotionND::LinearMotionND(const std::array& start, const std::array& end) { m_motion[0] = LinearMotion(start[0], end[0]); m_motion[1] = LinearMotion(start[1], end[1]); m_motion[2] = LinearMotion(start[2], end[2]); } template LinearMotionND::LinearMotionND(const Vector3& start, const Vector3& end) { m_motion[0] = LinearMotion(start[0], end[0]); m_motion[1] = LinearMotion(start[1], end[1]); m_motion[2] = LinearMotion(start[2], end[2]); } template LinearMotionND& LinearMotionND::operator=(const LinearMotionND& motion) { m_motion[0] = motion.m_motion[0]; m_motion[1] = motion.m_motion[1]; m_motion[2] = motion.m_motion[2]; return *this; } template LinearMotionND& LinearMotionND::operator=(LinearMotionND&& motion) { m_motion[0] = std::move(motion.m_motion[0]); m_motion[1] = std::move(motion.m_motion[1]); m_motion[2] = std::move(motion.m_motion[2]); return *this; } template IntervalND LinearMotionND::toInterval() const { std::array, 3> intervals; intervals[0] = m_motion[0].toInterval(); intervals[1] = m_motion[1].toInterval(); intervals[2] = m_motion[2].toInterval(); return IntervalND(intervals); } template bool LinearMotionND::isApprox(const LinearMotionND& motion, const T& epsilon) const { return (m_motion[0].isApprox(motion.m_motion[0], epsilon) && m_motion[1].isApprox(motion.m_motion[1], epsilon) && m_motion[2].isApprox(motion.m_motion[2], epsilon)); } template bool LinearMotionND::operator==(const LinearMotionND& motion) const { return (m_motion[0] == motion.m_motion[0] && m_motion[1] == motion.m_motion[1] && m_motion[2] == motion.m_motion[2]); } template bool LinearMotionND::operator!=(const LinearMotionND& motion) const { return !(this->operator==(motion)); } template LinearMotionND LinearMotionND::operator+(const LinearMotionND& m) const { LinearMotionND ret(*this); ret += m; return ret; } template LinearMotionND& LinearMotionND::operator+=(const LinearMotionND& m) { m_motion[0] += m.m_motion[0]; m_motion[1] += m.m_motion[1]; m_motion[2] += m.m_motion[2]; return *this; } template LinearMotionND LinearMotionND::operator-(const LinearMotionND& m) const { LinearMotionND ret(*this); ret -= m; return ret; } template LinearMotionND& LinearMotionND::operator-=(const LinearMotionND& m) { m_motion[0] -= m.m_motion[0]; m_motion[1] -= m.m_motion[1]; m_motion[2] -= m.m_motion[2]; return *this; } template IntervalND LinearMotionND::operator*(const LinearMotionND& m) const { return this->toInterval() * m.toInterval(); } template IntervalND LinearMotionND::operator/(const LinearMotionND& m) const { return this->toInterval() / m.toInterval(); } template Interval LinearMotionND::dotProduct(const LinearMotionND& motion, const Interval& range) const { return valuesOverInterval(analyticDotProduct(*this, motion), range); } template IntervalND LinearMotionND::crossProduct(const LinearMotionND& motion, const Interval& range) const { // toInterval().crossProduct(motion.toInterval()) // results in intervals that are too broad. return IntervalND(valuesOverInterval(analyticCrossProductAxis(*this, motion), range), valuesOverInterval(analyticCrossProductAxis(*this, motion), range), valuesOverInterval(analyticCrossProductAxis(*this, motion), range)); } template Interval LinearMotionND::magnitudeSquared(const Interval& range) const { return valuesOverInterval(analyticMagnitudeSquared(*this), range); } template Interval LinearMotionND::magnitude(const Interval& range) const { Interval magnitudeSq = magnitudeSquared(range); // Both minimum and maximum are guaranteed to be non-negative. return Interval(sqrt(magnitudeSq.getMin()), sqrt(magnitudeSq.getMax())); } template const LinearMotion& LinearMotionND::getAxis(int i) const { SURGSIM_ASSERT((i >= 0) && (i < 3)) << "Asking for an axis greater than the dimensionality of the linear motion"; return m_motion[i]; } template void LinearMotionND::getStart(std::array* start) const { (*start)[0] = m_motion[0].getStart(); (*start)[1] = m_motion[1].getStart(); (*start)[2] = m_motion[2].getStart(); } template void LinearMotionND::getEnd(std::array* end) const { (*end)[0] = m_motion[0].getEnd(); (*end)[1] = m_motion[1].getEnd(); (*end)[2] = m_motion[2].getEnd(); } template typename LinearMotionND::Vector3 LinearMotionND::getStart() const { return LinearMotionND::Vector3(m_motion[0].getStart(), m_motion[1].getStart(), m_motion[2].getStart()); } template typename LinearMotionND::Vector3 LinearMotionND::getEnd() const { return Vector3(m_motion[0].getEnd(), m_motion[1].getEnd(), m_motion[2].getEnd()); } template typename LinearMotionND::Vector3 LinearMotionND::atTime(const T& t) const { return Vector3(m_motion[0].atTime(t), m_motion[1].atTime(t), m_motion[2].atTime(t)); } template LinearMotionND LinearMotionND::firstHalf() const { LinearMotionND ret; ret.m_motion[0] = m_motion[0].firstHalf(); ret.m_motion[1] = m_motion[1].firstHalf(); ret.m_motion[2] = m_motion[2].firstHalf(); return ret; } template LinearMotionND LinearMotionND::secondHalf() const { LinearMotionND ret; ret.m_motion[0] = m_motion[0].secondHalf(); ret.m_motion[1] = m_motion[1].secondHalf(); ret.m_motion[2] = m_motion[2].secondHalf(); return ret; } // Utility functions not part of any class // Interval functions template std::ostream& operator<<(std::ostream& o, const LinearMotion& motion) { o << "(" << motion.getStart() << " -> " << motion.getEnd() << ")"; return o; } // Interval ND functions template std::ostream& operator<<(std::ostream& o, const LinearMotionND& motion) { o << "([" << motion.getAxis(0).getStart(); for (int i = 1; i < N; ++i) { o << "," << motion.getAxis(i).getStart(); } o << "] -> [" << motion.getAxis(0).getEnd(); for (int i = 1; i < N; ++i) { o << "," << motion.getAxis(i).getEnd(); } o << "])"; return o; } // Interval 3D functions template Polynomial analyticDotProduct(const LinearMotionND& a, const LinearMotionND& b) { return a.getAxis(0).toPolynomial() * b.getAxis(0).toPolynomial() + a.getAxis(1).toPolynomial() * b.getAxis(1).toPolynomial() + a.getAxis(2).toPolynomial() * b.getAxis(2).toPolynomial(); } template Polynomial analyticCrossProductAxis(const LinearMotionND& a, const LinearMotionND& b) { // The labels here are probably a bit confusing for anyone else, but at least this makes sense. // For A == 0, the "Y" and "Z" mean what they say, and the output is the X component. // For A == 1, they get rotated "down" by one (so Y -> Z, Z -> X), and the output is the Y component. // For A == 2, they get rotated "down" by two (so Y -> X, Z -> Y), and the output is the Z component. const LinearMotion& aY = a.getAxis((A + 1) % 3); const LinearMotion& aZ = a.getAxis((A + 2) % 3); const LinearMotion& bY = b.getAxis((A + 1) % 3); const LinearMotion& bZ = b.getAxis((A + 2) % 3); return aY.toPolynomial() * bZ.toPolynomial() - aZ.toPolynomial() * bY.toPolynomial(); } template Polynomial analyticCrossProductXAxis(const LinearMotionND& a, const LinearMotionND& b) { return analyticCrossProductAxis(a, b); } template Polynomial analyticCrossProductYAxis(const LinearMotionND& a, const LinearMotionND& b) { return analyticCrossProductAxis(a, b); } template Polynomial analyticCrossProductZAxis(const LinearMotionND& a, const LinearMotionND& b) { return analyticCrossProductAxis(a, b); } template void analyticCrossProduct(const LinearMotionND& a, const LinearMotionND& b, Polynomial* resultXAxis, Polynomial* resultYAxis, Polynomial* resultZAxis) { (*resultXAxis) = analyticCrossProductXAxis(a, b); (*resultYAxis) = analyticCrossProductYAxis(a, b); (*resultZAxis) = analyticCrossProductZAxis(a, b); } template Polynomial analyticTripleProduct(const LinearMotionND& a, const LinearMotionND& b, const LinearMotionND& c) { const Polynomial aX = a.getAxis(0).toPolynomial(); const Polynomial aY = a.getAxis(1).toPolynomial(); const Polynomial aZ = a.getAxis(2).toPolynomial(); const Polynomial bX = b.getAxis(0).toPolynomial(); const Polynomial bY = b.getAxis(1).toPolynomial(); const Polynomial bZ = b.getAxis(2).toPolynomial(); const Polynomial cX = c.getAxis(0).toPolynomial(); const Polynomial cY = c.getAxis(1).toPolynomial(); const Polynomial cZ = c.getAxis(2).toPolynomial(); return ((bY * cZ - bZ * cY) * aX + (bZ * cX - bX * cZ) * aY + (bX * cY - bY * cX) * aZ); } template static Interval tripleProduct(const LinearMotionND& a, const LinearMotionND& b, const LinearMotionND& c, const Interval& range) { return valuesOverInterval(analyticTripleProduct(a, b, c), range); } template Polynomial analyticMagnitudeSquared(const LinearMotionND& motion) { return analyticDotProduct(motion, motion); } }; // Math }; // SurgSim #endif // SURGSIM_MATH_LINEARMOTIONARITHMETIC_INL_H opensurgsim-0.7.0/SurgSim/Math/LinearMotionArithmetic.h000066400000000000000000000477521277777236100232000ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_MATH_LINEARMOTIONARITHMETIC_H #define SURGSIM_MATH_LINEARMOTIONARITHMETIC_H #include #include #include #include "SurgSim/Math/IntervalArithmetic.h" #include "SurgSim/Math/PolynomialValues.h" #include "SurgSim/Math/Vector.h" namespace SurgSim { namespace Math { /// LinearMotion is (intentionally) a lot like Interval, but it deals with linear motion where /// all operands start and end their motion simultaneously. /// /// LinearMotion results in much tighter bounds compared to Interval, since Interval must consider /// *any* value of each operand, and LinearMotion only considers values that are synchronous with /// one another. /// /// The bounds of a LinearMotion are a start value and an end value; there's no requirement that /// start <= end (or vice versa). /// /// Many operations on LinearMotion arguments (*, /) return results that are not linear in time, /// so those operations will return Interval instead. /// /// \tparam T underlying data type over which the linear motion is defined. /// /// \sa Interval, and IntervalND template class LinearMotion { public: /// Constructor LinearMotion(); /// Constructor /// \param start initial value of the constructed linear motion /// \param end final value of the constructed linear motion /// \exception if max is less than min LinearMotion(const T& start, const T& end); /// Copy constructor /// \param m Interval to be copied LinearMotion(const LinearMotion& m); /// Move constructor /// \param m LinearMotion to be copied LinearMotion(LinearMotion&& m); /// Assignment operator /// \param m Interval to be copied LinearMotion& operator=(const LinearMotion& m); /// Move assignment operator /// \param m Interval to be moved LinearMotion& operator=(LinearMotion&& m); /// Convert from LinearMotion to an Interval /// \return the conversion of the LinearMotion to an Interval Interval toInterval() const; /// Returns a linear expression (degree-1 polynomial) whose value for t=0..1 /// progresses from `start' to `end'. /// \return the conversion of the LinearMotion to a polynomial Polynomial toPolynomial() const; /// \return true if the linear motion crosses through 0. bool containsZero() const; /// \param i the linear motion to be tested /// \param epsilon the nearness parameter /// \return true if the current linear motion is within epsilon of the input linear motion bool isApprox(const LinearMotion& i, const T& epsilon) const; /// \param m the linear motion to be tested /// \return true if the current linear motion is identical to the input linear motion bool operator==(const LinearMotion& m) const; /// \param m the linear motion to be tested /// \return true if the current linear motion is not identical to the input linear motion bool operator!=(const LinearMotion& m) const; /// @{ /// Standard arithmetic operators extended to linear motions LinearMotion operator+(const LinearMotion& m) const; LinearMotion& operator+=(const LinearMotion& m); LinearMotion operator-(const LinearMotion& m) const; LinearMotion& operator-=(const LinearMotion& m); /// @} /// Standard arithmetic operators extended to interval groups /// \note Multiplication and division operators by their nature do not /// preserve time ordering and so the return value is an IntervalND instead /// of a LinearMotionND Interval operator*(const LinearMotion& m) const; /// Standard arithmetic operators extended to interval groups /// \note Multiplication and division operators by their nature do not /// preserve time ordering and so the return value is an IntervalND instead /// of a LinearMotionND /// \exception if any component of interval includes 0 Interval operator/(const LinearMotion& m) const; /// \return the initial value of the linear motion T getStart() const; /// \return the end point of the linear motion T getEnd() const; /// \param t the parametric time at which to evaluate the linear motion /// \return the value of the linear motion at parametric time t T atTime(const T& t) const; /// \return the linear motion from the initial time to the midpoint LinearMotion firstHalf() const; /// \return the linear motion from the midpoint to the endpoint LinearMotion secondHalf() const; private: /// The start point of the linear motion T m_start; /// The end point of the linear motion T m_end; }; /// LinearMotionND defines the concept of a group of linear motions and provides /// operations on them including arithmetic operations, construction, and I/O. /// /// \tparam T underlying data type over which the linear motion is defined. /// \tparam N Dimensionality of the interval /// /// \sa LinearMotionND and IntervalArthmetic template class LinearMotionND { static_assert(N > 0, "LinearMotion must have dimensionality > 0."); public: /// Constructor LinearMotionND(); /// Constructor /// \param x array of N motions to be copied into the group explicit LinearMotionND(const std::array, N>& x); /// Copy constructor /// \param motion motion group to copied LinearMotionND(const LinearMotionND& motion); /// Move constructor /// \param motion motion to be copied LinearMotionND(LinearMotionND&& motion); /// Constructor /// \param a array of N values to be used as the respective starts for the linear motion entries. /// \param b array of N values to be used as the respective ends for the linear motion entries. LinearMotionND(const std::array& a, const std::array& b); /// Assignment operator /// \param motion Linear motion group to be copied LinearMotionND& operator=(const LinearMotionND& motion); /// Move assignment operator /// \param motion Linear motion group to be moved LinearMotionND& operator=(LinearMotionND&& motion); /// Convert from LinearMotion to an Interval /// \return the conversion of the ND LinearMotion to an ND Interval IntervalND toInterval() const; /// \param motion the linear motion group to be tested /// \param epsilon the nearness parameter /// \return true if each linear motion in the input group is approximately equal to its correspondent /// element in motion. bool isApprox(const LinearMotionND& motion, const T& epsilon) const; /// \param motion the linear motion group to be tested /// \return true if the current linear motion group is identical to the input group bool operator==(const LinearMotionND& motion) const; /// \param motion the linear motion group to be tested /// \return true if the current linear motion group is not identical to the input group bool operator!=(const LinearMotionND& motion) const; /// @{ /// Standard arithmetic operators extended to interval groups LinearMotionND operator+(const LinearMotionND& m) const; LinearMotionND& operator+=(const LinearMotionND& m); LinearMotionND operator-(const LinearMotionND& m) const; LinearMotionND& operator-=(const LinearMotionND& m); /// @} /// Standard arithmetic operators extended to interval groups /// \note Multiplication and division operators by their nature do not /// preserve time ordering and so the return value is an IntervalND instead /// of a LinearMotionND IntervalND operator*(const LinearMotionND& m) const; /// Standard arithmetic operators extended to interval groups /// \note Multiplication and division operators by their nature do not /// preserve time ordering and so the return value is an IntervalND instead /// of a LinearMotionND /// \exception if any component of interval includes 0 IntervalND operator/(const LinearMotionND& m) const; /// \param motion the input linear motion group /// \return the interval dot product of the current group and interval Interval dotProduct(const LinearMotionND& motion) const; /// \param i the selector for the linear motion to be returned /// \return the ith interval in the current group /// \exception thrown if the requested axis is < 0 or greater than N - 1 const LinearMotion& getAxis(int i) const; /// \param start [out] the starting points of the linear motion group as an N dimension array. void getStart(std::array* start) const; /// \param end [out] the ending points of the linear motion group as an N dimension array. void getEnd(std::array* end) const; /// \return the linear motion from the starting point to the midpoint LinearMotionND firstHalf() const; /// \return the linear motion from the midpoint to the ending point LinearMotionND secondHalf() const; private: /// The N dimensional group of linear motions std::array, N> m_motion; }; /// LinearMotionND specializes the LinearMotionND class for 3 dimensions /// /// \sa LinearMotion, LinearMotionND and IntervalArthmetic template class LinearMotionND { public: /// Typedef for a vector 3 return typedef Eigen::Matrix Vector3; /// Constructor LinearMotionND(); /// Constructor /// \param x array of 3 linear motions to be copied into the group explicit LinearMotionND(const std::array, 3>& x); /// Constructor /// \param a first linear motion to be added to the 3 group /// \param b second linear motion to be added to the 3 group /// \param c third linear motion to be added to the 3 group LinearMotionND(const LinearMotion& a, const LinearMotion& b, const LinearMotion& c); /// Copy constructor /// \param motion linear motion 3 group to be copied LinearMotionND(const LinearMotionND& motion); /// Move constructor /// \param motion Linear motion to be copied LinearMotionND(LinearMotionND&& motion); /// Constructor /// \param start array of 3 values to be used as the respective starts for the linear motion entries. /// \param end array of 3 values to be used as the respective ends for the linear motion entries. LinearMotionND(const std::array& start, const std::array& end); /// Constructor /// \param start array of 3 values to be used as the respective starts for the linear motion entries. /// \param end array of 3 values to be used as the respective ends for the linear motion entries. LinearMotionND(const Vector3& start, const Vector3& end); /// Assignment operator /// \param motion Linear motion 3 group to be copied LinearMotionND& operator=(const LinearMotionND& motion); /// Move assignment operator /// \param motion Linear motion 3 group to be moved LinearMotionND& operator=(LinearMotionND&& motion); /// Convert from LinearMotion to an Interval /// \return the conversion of the 3D LinearMotion to a 3D Interval IntervalND toInterval() const; /// \param motion the motion group to be tested /// \param epsilon the nearness parameter /// \return true if each linear motion in the input group is approximately equal to its correspondent /// element in motion. bool isApprox(const LinearMotionND& motion, const T& epsilon) const; /// \param motion the linear motion group to be tested /// \return true if the current linear motion 3 group is identical to the input 3 group motion bool operator==(const LinearMotionND& motion) const; /// \param motion the linear motion group to be tested /// \return true if the current linear motion 3 group is not identical to the input 3 group motion. bool operator!=(const LinearMotionND& motion) const; /// @{ /// Standard arithmetic operators extended to 3 interval groups LinearMotionND operator+(const LinearMotionND& m) const; LinearMotionND& operator+=(const LinearMotionND& m); LinearMotionND operator-(const LinearMotionND& m) const; LinearMotionND& operator-=(const LinearMotionND& m); /// @} /// Standard arithmetic operators extended to interval groups /// \note Multiplication and division operators by their nature do not /// preserve time ordering and so the return value is an IntervalND instead /// of a LinearMotionND IntervalND operator*(const LinearMotionND& m) const; /// Standard arithmetic operators extended to interval groups /// \note Multiplication and division operators by their nature do not /// preserve time ordering and so the return value is an IntervalND instead /// of a LinearMotionND /// \exception if any component of interval includes 0 IntervalND operator/(const LinearMotionND& m) const; /// \param motion the input linear motion 3 group /// \param range the range over which the dot product is to be evaluated. /// \return the interval dot product of the current 3 group and interval evaluated over the interval range. Interval dotProduct(const LinearMotionND& motion, const Interval& range) const; /// \param motion the input linear motion 3 group /// \param range the range over which the cross product is to be evaluated. /// \return the interval cross product of the current 3 group and interval evaluated over the interval range. IntervalND crossProduct(const LinearMotionND& motion, const Interval& range) const; /// \return the square of the linear motion magnitude for the current 3 group Interval magnitudeSquared(const Interval& range) const; /// \return the linear motion magnitude for the current 3 group Interval magnitude(const Interval& range) const; /// \param i the selector for the linear motion to be returned /// \return the ith linear motion in the current 3 group /// \exception thrown if the requested axis is < 0 or greater than 2 const LinearMotion& getAxis(int i) const; /// \param start [out] the start of the linear motion 3D as a 3 value array void getStart(std::array* start) const; /// \param end [out] the end of the linear motion 3D as a 3 value array void getEnd(std::array* end) const; /// \return the start of the linear motion 3D as a 3 Vector Vector3 getStart() const; /// \return the end of the linear motion 3D as a 3 Vector Vector3 getEnd() const; /// \param t the parametric value at which to evaluate the linear motion /// \return the value of the linear motion 3D at time t as a 3 Vector Vector3 atTime(const T& t) const; /// \return the linear motion 3D from the start to the midpoint LinearMotionND firstHalf() const; /// \return the linear motion 3D from the midpoint to the start LinearMotionND secondHalf() const; private: /// The 3 dimensional group of linear motions std::array, 3> m_motion; }; // Linear motion utilities /// Write a textual version of a linear motion to an output stream /// \tparam T underlying type of the linear motion /// \param o the ostream to be written to /// \param motion the motion to write /// \return the active ostream template std::ostream& operator<<(std::ostream& o, const LinearMotion& motion); // Linear motion ND utilities /// Write a textual version of a linear motion group to an output stream /// \tparam T underlying type of the linear motion /// \tparam N number of linear motions in the group /// \param o the ostream to be written to /// \param motion the motion group to write /// \return the active ostream template std::ostream& operator<<(std::ostream& o, const LinearMotionND& motion); // Linear motion 3D utilities /// Calculate an analytic dot product as a Polynomial /// \tparam T underlying type of the linear motion /// \param a the first linear motion 3 group /// \param b the second linear motion 3 group /// \return the dot product in a polynomial representation template Polynomial analyticDotProduct(const LinearMotionND& a, const LinearMotionND& b); /// Calculate a single axis of an analytic cross product as a Polynomial /// \tparam T underlying type of the linear motion /// \tparam A axis to generate: 0 = X, 1=Y, 2=Z /// \param a the first linear motion 3 group /// \param b the second linear motion 3 group /// \return the selected axis in a polynomial representation template Polynomial analyticCrossProductAxis(const LinearMotionND& a, const LinearMotionND& b); /// Calculate the X axis of an analytic cross product as a Polynomial /// \tparam T underlying type of the linear motion /// \param a the first linear motion 3 group /// \param b the second linear motion 3 group /// \return the X axis in a polynomial representation template Polynomial analyticCrossProductXAxis(const LinearMotionND& a, const LinearMotionND& b); /// Calculate the Y axis of an analytic cross product as a Polynomial /// \tparam T underlying type of the linear motion /// \param a the first linear motion 3 group /// \param b the second linear motion 3 group /// \return the Y axis in a polynomial representation template Polynomial analyticCrossProductYAxis(const LinearMotionND& a, const LinearMotionND& b); /// Calculate the Z axis of an analytic cross product as a Polynomial /// \tparam T underlying type of the linear motion /// \param a the first linear motion 3 group /// \param b the second linear motion 3 group /// \return the Z axis in a polynomial representation template Polynomial analyticCrossProductZAxis(const LinearMotionND& a, const LinearMotionND& b); /// Calculate an analytic cross product as a Polynomial /// \tparam T underlying type of the linear motion /// \param a the first linear motion 3 group /// \param b the second linear motion 3 group /// \param [out] resultXAxis the X axis in a polynomial representation /// \param [out] resultYAxis the Y axis in a polynomial representation /// \param [out] resultZAxis the Z axis in a polynomial representation template void analyticCrossProduct(const LinearMotionND& a, const LinearMotionND& b, Polynomial* resultXAxis, Polynomial* resultYAxis, Polynomial* resultZAxis); /// Calculate an analytic cross product as a Polynomial, as a polynomial whose value for t=0..1 is /// the value of the triple product. /// \tparam T underlying type of the linear motion /// \param a the first linear motion 3 group /// \param b the second linear motion 3 group /// \param c the third linear motion 3 group /// \return a 3rd order polynomial representation of the triple product template Polynomial analyticTripleProduct(const LinearMotionND& a, const LinearMotionND& b, const LinearMotionND& c); /// Calculate the triple product, as an interval. /// \tparam T underlying type of the linear motion /// \param a the first linear motion 3 group /// \param b the second linear motion 3 group /// \param c the third linear motion 3 group /// \param range the range over which the triple product is to be evaluated /// \return an interval representation of the triple product template Interval tripleProduct(const LinearMotionND& a, const LinearMotionND& b, const LinearMotionND& c, const Interval& range); /// Calculate the magnitude squared of a linear motion 3 group as a polynomial /// \tparam T underlying type of the linear motion /// \param motion the linear motion 3 group /// \return the magnitude squared of the linear motion as a polynomial template Polynomial analyticMagnitudeSquared(const LinearMotionND& motion); }; // Math }; // SurgSim #include "SurgSim/Math/LinearMotionArithmetic-inl.h" #endif // SURGSIM_MATH_LINEARMOTIONARITHMETIC_H opensurgsim-0.7.0/SurgSim/Math/LinearSolveAndInverse-inl.h000066400000000000000000000145361277777236100235420ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_MATH_LINEARSOLVEANDINVERSE_INL_H #define SURGSIM_MATH_LINEARSOLVEANDINVERSE_INL_H #include "SurgSim/Framework/Assert.h" namespace SurgSim { namespace Math { template const Eigen::Block LinearSolveAndInverseTriDiagonalBlockMatrix::minusAi(const SurgSim::Math::Matrix& A, size_t i) const { return A.block(BlockSize * i, BlockSize * (i - 1)); } template const Eigen::Block LinearSolveAndInverseTriDiagonalBlockMatrix::Bi(const SurgSim::Math::Matrix& A, size_t i) const { return A.block(BlockSize * i, BlockSize * i); } template const Eigen::Block LinearSolveAndInverseTriDiagonalBlockMatrix::minusCi(const SurgSim::Math::Matrix& A, size_t i) const { return A.block(BlockSize * i, BlockSize * (i + 1)); } template void LinearSolveAndInverseTriDiagonalBlockMatrix::inverseTriDiagonalBlock(const SurgSim::Math::Matrix& A, SurgSim::Math::Matrix* inverse, bool isSymmetric) { SURGSIM_ASSERT(inverse != nullptr) << "Null inverse matrix pointer"; SURGSIM_ASSERT(A.cols() == A.rows()) << "Cannot inverse a non square tri-diagonal block matrix ("<< A.rows() <<" x "<< A.cols() <<")"; const size_t size = A.rows(); const size_t numBlocks = size / BlockSize; SURGSIM_ASSERT(numBlocks * BlockSize == size) << "Bad tri-diagonal block matrix structure, size = " << size << " block size = " << BlockSize << " and the number of blocks are " << numBlocks; // If the matrix size is less or equal to 4 (Eigen inverse use co-factor for those), or the matrix is // composed of an unique block, simply call the normal Eigen inverse method. if (size <= 4 || numBlocks == static_cast(1)) { *inverse = A.inverse(); return; } if (inverse->rows() < 0 || static_cast(inverse->rows()) != size || inverse->cols() < 0 || static_cast(inverse->cols()) != size) { inverse->resize(size, size); } m_Bi_AiDiminus1_inv.resize(numBlocks); m_Di.resize(numBlocks - 1); m_Ei.resize(numBlocks); // Should be of size m_numBlocks - 1 too, but index 0 is undefined and we // decided to not change the indexing to not introduce any confusion // Bi_AiDiminus1_inv[0] = (B0)^-1 // D [0] = (B0)^-1.C0 m_Bi_AiDiminus1_inv[0] = Bi(A, 0).inverse(); m_Di[0] = m_Bi_AiDiminus1_inv[0] * (-minusCi(A, 0)); // Bi_AiDiminus1_inv[i] = (Bi - Ai.D[i-1])^-1 // Di [i] = (Bi - Ai.D[i-1])^-1 . Ci for(size_t i = 1; i < numBlocks - 1; ++i) { m_Bi_AiDiminus1_inv[i] = (Bi(A, i) - (-minusAi(A, i)) * m_Di[i - 1]).inverse(); m_Di[i] = m_Bi_AiDiminus1_inv[i] * (-minusCi(A, i)); } // Bi_AiDiminus1_inv[nbBlock-1] = (B(nbBlock-1) - A(nbBlock-1).D(nbBlock-2))^-1 // D [nbBlock-1] = UNDEFINED because C(nbBlock-1) does not exist m_Bi_AiDiminus1_inv[numBlocks - 1] = (Bi(A, numBlocks - 1) - (-minusAi(A, numBlocks - 1)) * m_Di[numBlocks - 2]).inverse(); // E[nbBlock-1] = (B(nbBlock-1))^-1 . A(nbBlock-1) // Ei = (Bi - Ci.E(i+1))^-1 . Ai // E0 = UNDEFINED because A0 does not exist m_Ei[numBlocks - 1] = Bi(A, numBlocks - 1).inverse() * (-minusAi(A, numBlocks - 1)); for(size_t i = numBlocks - 2; i > 0; --i) { m_Ei[i] = (Bi(A, i) - (-minusCi(A, i)) * m_Ei[i + 1]).inverse() * (-minusAi(A, i)); } // Inverse diagonal blocks: // inv(i,i) = (I - Di.E(i+1))^-1.Bi_AiDiminus1_inv[i] for(size_t i = 0; i < numBlocks - 1; ++i) { inverse->block(BlockSize * i, BlockSize * i) = (Block::Identity() - m_Di[i] * m_Ei[i + 1]).inverse() * m_Bi_AiDiminus1_inv[i]; } // inv(nbBlock-1,nbBlock-1) = Bi_AiDiminus1_inv[nbBlock-1] inverse->block(BlockSize * (numBlocks - 1), BlockSize * (numBlocks - 1)) = m_Bi_AiDiminus1_inv[numBlocks - 1]; // Inverse off-diagonal blocks: // inv(i,j) = Di.inv(i+1,j) for ij if (isSymmetric) { for(size_t j = 1; j < numBlocks; ++j) { for(size_t i = j; i > 0; --i) { inverse->block(BlockSize * (i - 1), BlockSize * j) = m_Di[i - 1] * inverse->block(BlockSize * i, BlockSize * j); inverse->block(BlockSize * j, BlockSize * (i - 1)) = inverse->block(BlockSize * (i - 1), BlockSize * j).transpose(); } } } else { for(int j = 0; j < static_cast(numBlocks); ++j) { for(int i = j - 1; i >= 0; --i) { inverse->block(BlockSize * i, BlockSize * j) = m_Di[i] * inverse->block(BlockSize * (i + 1), BlockSize * j); } for(int i = j + 1; i < static_cast(numBlocks); ++i) { inverse->block(BlockSize * i, BlockSize * j) = m_Ei[i] * inverse->block(BlockSize * (i - 1), BlockSize * j); } } } } template void LinearSolveAndInverseTriDiagonalBlockMatrix::setMatrix(const Matrix& matrix) { inverseTriDiagonalBlock(matrix, &m_inverse); } template Vector LinearSolveAndInverseTriDiagonalBlockMatrix::solve(const Vector& b) { return m_inverse * b; } template Matrix LinearSolveAndInverseTriDiagonalBlockMatrix::getInverse() { return m_inverse; } template void LinearSolveAndInverseSymmetricTriDiagonalBlockMatrix::setMatrix(const Matrix& matrix) { inverseTriDiagonalBlock(matrix, &m_inverse, true); } }; // namespace Math }; // namespace SurgSim #endif // SURGSIM_MATH_LINEARSOLVEANDINVERSE_INL_H opensurgsim-0.7.0/SurgSim/Math/LinearSolveAndInverse.cpp000066400000000000000000000031471277777236100233110ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Math/LinearSolveAndInverse.h" namespace SurgSim { namespace Math { void LinearSolveAndInverseDiagonalMatrix::setMatrix(const Matrix& matrix) { SURGSIM_ASSERT(matrix.cols() == matrix.rows()) << "Cannot inverse a non square matrix"; m_inverseDiagonal = matrix.diagonal().cwiseInverse(); } Vector LinearSolveAndInverseDiagonalMatrix::solve(const Vector& b) { return m_inverseDiagonal.cwiseProduct(b); } Matrix LinearSolveAndInverseDiagonalMatrix::getInverse() { return m_inverseDiagonal.asDiagonal(); } void LinearSolveAndInverseDenseMatrix::setMatrix(const Matrix& matrix) { SURGSIM_ASSERT(matrix.cols() == matrix.rows()) << "Cannot inverse a non square matrix"; m_luDecomposition = matrix.partialPivLu(); } Vector LinearSolveAndInverseDenseMatrix::solve(const Vector& b) { return m_luDecomposition.solve(b); } Matrix LinearSolveAndInverseDenseMatrix::getInverse() { return m_luDecomposition.inverse(); } }; // namespace Math }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Math/LinearSolveAndInverse.h000066400000000000000000000130501277777236100227500ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_MATH_LINEARSOLVEANDINVERSE_H #define SURGSIM_MATH_LINEARSOLVEANDINVERSE_H #include #include "SurgSim/Framework/Assert.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Math/Matrix.h" namespace SurgSim { namespace Math { /// LinearSolveAndInverse aims at performing an efficient linear system resolution and /// calculating its inverse matrix at the same time. /// This class is very useful in the OdeSolver resolution to improve performance. /// \sa SurgSim::Math::OdeSolver class LinearSolveAndInverse { public: virtual ~LinearSolveAndInverse(){} /// Set the linear solver matrix /// \param matrix the new matrix to solve/inverse for virtual void setMatrix(const Matrix& matrix) = 0; /// Solve the linear system (matrix.x=b) using the matrix provided by the latest setMatrix call /// \param b The rhs vector /// \return The solution vector virtual Vector solve(const Vector& b) = 0; /// \return The linear system's inverse matrix, i.e. the inverse of the matrix provided on the last setMatrix call virtual Matrix getInverse() = 0; }; /// Derivation for dense matrix type class LinearSolveAndInverseDenseMatrix : public LinearSolveAndInverse { public: void setMatrix(const Matrix& matrix) override; Vector solve(const Vector& b) override; Matrix getInverse() override; private: Eigen::PartialPivLU::PlainObject> m_luDecomposition; }; /// Derivation for diagonal matrix type class LinearSolveAndInverseDiagonalMatrix : public LinearSolveAndInverse { private: Vector m_inverseDiagonal; public: void setMatrix(const Matrix& matrix) override; Vector solve(const Vector& b) override; Matrix getInverse() override; }; /// Derivation for tri-diagonal block matrix type /// \tparam BlockSize Define the block size of the tri-diagonal block matrix template class LinearSolveAndInverseTriDiagonalBlockMatrix : public LinearSolveAndInverse { public: void setMatrix(const Matrix& matrix) override; Vector solve(const Vector& b) override; Matrix getInverse() override; protected: /// Computes the inverse matrix /// \param A The matrix to inverse /// \param[out] inv The inverse matrix /// \param isSymmetric True if the matrix is symmetric, False otherwise /// \note isSymmetric is only indicative and helps optimizing the computation when the matrix is symmetric. /// \note On the other side, if the flag is true and the matrix is not symmetric, the result will be wrong. /// \note Assert on inverse matrix pointer (inv), on the matrix being square and on /// \note proper size matching between the matrix size and the blockSize void inverseTriDiagonalBlock(const SurgSim::Math::Matrix& A, SurgSim::Math::Matrix* inv, bool isSymmetric = false); /// Member variable to hold the inverse matrix in case only the solving is requested Matrix m_inverse; private: typedef Eigen::Matrix Block; /// Gets a lower-diagonal block element (named -Ai in the algorithm) /// \param A The matrix on which to retrieve the lower-diagonal block element /// \param i The line index on which to retrieve the lower-diagonal block element /// \return The lower-diagonal block element requested (i.e. block (i, i-1)) const Eigen::Block minusAi(const SurgSim::Math::Matrix& A, size_t i) const; /// Gets a diagonal block element (named Bi in the algorithm) /// \param A The matrix on which to retrieve the diagonal block element /// \param i The line index on which to retrieve the diagonal block element /// \return The diagonal block element requested (i.e. block (i, i)) const Eigen::Block Bi(const SurgSim::Math::Matrix& A, size_t i) const; /// Gets a upper-diagonal block element (named -Ci in the algorithm) /// \param A The matrix on which to retrieve the upper-diagonal block element /// \param i The line index on which to retrieve the upper-diagonal block element /// \return The upper-diagonal block element requested (i.e. block (i, i+1)) const Eigen::Block minusCi(const SurgSim::Math::Matrix& A, size_t i) const; ///@{ /// Intermediate block matrices, helpful to construct the inverse matrix std::vector m_Di, m_Ei, m_Bi_AiDiminus1_inv; ///@} }; /// Derivation for symmetric tri-diagonal block matrix type /// \tparam BlockSize Define the block size of the tri-diagonal block matrix template class LinearSolveAndInverseSymmetricTriDiagonalBlockMatrix : public LinearSolveAndInverseTriDiagonalBlockMatrix { public: void setMatrix(const Matrix& matrix) override; using LinearSolveAndInverseTriDiagonalBlockMatrix::inverseTriDiagonalBlock; using LinearSolveAndInverseTriDiagonalBlockMatrix::m_inverse; }; }; // namespace Math }; // namespace SurgSim #include "SurgSim/Math/LinearSolveAndInverse-inl.h" #endif // SURGSIM_MATH_LINEARSOLVEANDINVERSE_H opensurgsim-0.7.0/SurgSim/Math/LinearSparseSolveAndInverse.cpp000066400000000000000000000040331277777236100244620ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Framework/Assert.h" #include "SurgSim/Math/LinearSparseSolveAndInverse.h" namespace SurgSim { namespace Math { Matrix LinearSparseSolveAndInverse::getInverse() const { return m_matrix.toDense().inverse(); } void LinearSparseSolveAndInverseLU::setMatrix(const SparseMatrix& matrix) { SURGSIM_ASSERT(matrix.cols() == matrix.rows()) << "Cannot inverse a non square matrix"; m_solver.compute(matrix); SURGSIM_ASSERT(m_solver.info() == Eigen::Success) << m_solver.lastErrorMessage(); m_matrix = matrix; } Matrix LinearSparseSolveAndInverseLU::solve(const Matrix& b) const { return m_solver.solve(b); } void LinearSparseSolveAndInverseCG::setTolerance(double tolerance) { m_solver.setTolerance(tolerance); } double LinearSparseSolveAndInverseCG::getTolerance() { return m_solver.tolerance(); } void LinearSparseSolveAndInverseCG::setMaxIterations(SparseMatrix::Index iterations) { m_solver.setMaxIterations(iterations); } SparseMatrix::Index LinearSparseSolveAndInverseCG::getMaxIterations() { return m_solver.maxIterations(); } void LinearSparseSolveAndInverseCG::setMatrix(const SparseMatrix& matrix) { SURGSIM_ASSERT(matrix.cols() == matrix.rows()) << "Cannot inverse a non square matrix"; m_solver.compute(matrix); m_matrix = matrix; } Matrix LinearSparseSolveAndInverseCG::solve(const Matrix& b) const { return m_solver.solve(b); } }; // namespace Math }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Math/LinearSparseSolveAndInverse.h000066400000000000000000000074201277777236100241320ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_MATH_LINEARSPARSESOLVEANDINVERSE_H #define SURGSIM_MATH_LINEARSPARSESOLVEANDINVERSE_H #if defined(_MSC_VER) #pragma warning(push) #pragma warning(disable:4244) #endif #include #include #include // for 'map_list_of()' #include "SurgSim/Math/Matrix.h" #include "SurgSim/Math/SparseMatrix.h" #include "SurgSim/Math/Vector.h" namespace SurgSim { namespace Math { /// The linear numerical integration scheme supported /// Each Linear Solver should have its own entry in this enum enum LinearSolver { LINEARSOLVER_LU = 0, LINEARSOLVER_CONJUGATEGRADIENT, MAX_LINEARSOLVER }; const std::unordered_map> LinearSolverNames = boost::assign::map_list_of (LINEARSOLVER_LU, "LINEARSOLVER_LU") (LINEARSOLVER_CONJUGATEGRADIENT, "LINEARSOLVER_CONJUGATEGRADIENT"); /// LinearSparseSolveAndInverse aims at performing an efficient linear system resolution and /// calculating its inverse matrix at the same time. /// This class is very useful in the OdeSolver resolution to improve performance. /// \sa SurgSim::Math::OdeSolver class LinearSparseSolveAndInverse { public: virtual ~LinearSparseSolveAndInverse() {} /// Set the linear solver matrix /// \param matrix the new matrix to solve/inverse for virtual void setMatrix(const SparseMatrix& matrix) = 0; /// Solve the linear system (matrix.x=b) using the matrix provided by the latest setMatrix call /// for all columns of the rhs matrix b. /// \param b The rhs matrix /// \return The solution matrix virtual Matrix solve(const Matrix& b) const = 0; /// \return The linear system's inverse matrix, i.e. the inverse of the matrix provided on the last setMatrix call virtual Matrix getInverse() const; protected: /// A copy of the system matrix for use when an inverse is necessary. SparseMatrix m_matrix; }; /// Derivation for sparse LU solver class LinearSparseSolveAndInverseLU : public LinearSparseSolveAndInverse { public: void setMatrix(const SparseMatrix& matrix) override; Matrix solve(const Matrix& b) const override; private: Eigen::SparseLU m_solver; }; /// Derivation for sparse CG solver class LinearSparseSolveAndInverseCG : public LinearSparseSolveAndInverse { public: /// Set the conjugate gradient convergence tolerance /// \param tolerance the new convergence tolerance void setTolerance(double tolerance); /// Get the conjugate gradient convergence tolerance /// \return the convergence tolerance double getTolerance(); /// Set the maximum number of iterations for conjugate gradient /// \param iterations the new maximum number of iterations void setMaxIterations(SparseMatrix::Index iterations); /// Get the conjugate gradient maximum iterations /// \return the maximum number of iterations allowed SparseMatrix::Index getMaxIterations(); void setMatrix(const SparseMatrix& matrix) override; Matrix solve(const Matrix& b) const override; private: Eigen::ConjugateGradient m_solver; }; }; // namespace Math }; // namespace SurgSim #if defined(_MSC_VER) #pragma warning(pop) #endif #endif // SURGSIM_MATH_LINEARSPARSESOLVEANDINVERSE_H opensurgsim-0.7.0/SurgSim/Math/MathConvert-inl.h000066400000000000000000000145521277777236100215700ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_MATH_MATHCONVERT_INL_H #define SURGSIM_MATH_MATHCONVERT_INL_H #include #include "SurgSim/Framework/Log.h" namespace { const std::string rotationPropertyName = "Quaternion"; const std::string translationPropertyName = "Translation"; const std::string serializeLogger = "Serialization"; }; SURGSIM_DOUBLE_SPECIALIZATION template YAML::Node YAML::convert>::encode( const typename Eigen::Matrix& rhs) { typedef typename Eigen::Matrix::Index Index; YAML::Node node; node.SetStyle(YAML::EmitterStyle::Flow); if (Cols == 1) { for (Index i = 0; i < rhs.size(); ++i) { node.push_back(rhs(i, 0)); } } else { for (size_t row = 0; row < Rows; ++row) { YAML::Node rowNode; for (size_t col = 0; col < Cols; ++col) { rowNode.push_back(rhs.row(row)[col]); } node.push_back(rowNode); } } return node; } SURGSIM_DOUBLE_SPECIALIZATION template bool YAML::convert>::decode( const Node& node, typename Eigen::Matrix& rhs) //NOLINT { if (! node.IsSequence() || node.size() != Rows) { return false; } if (Cols == 1) { for (size_t i = 0; i < node.size(); ++i) { try { rhs(i, 0) = node[i].as(); } catch (YAML::RepresentationException) { rhs(i, 0) = std::numeric_limits::quiet_NaN(); auto logger = SurgSim::Framework::Logger::getLogger(serializeLogger); SURGSIM_LOG(logger, WARNING) << "Bad conversion, using #NaN value. For node: " << node; } } } else { for (size_t row = 0; row < node.size(); ++row) { YAML::Node rowNode = node[row]; if (!rowNode.IsSequence() || node.size() != Cols) { return false; } for (size_t col = 0; col < rowNode.size(); ++col) { try { rhs.row(row)[col] = rowNode[col].as(); } catch (YAML::RepresentationException) { rhs.row(row)[col] = std::numeric_limits::quiet_NaN(); auto logger = SurgSim::Framework::Logger::getLogger(serializeLogger); SURGSIM_LOG(logger, WARNING) << "Bad conversion, using #NaN value. For node: " << node; } } } } return true; } SURGSIM_DOUBLE_SPECIALIZATION template YAML::Node YAML::convert>::encode( const typename Eigen::Quaternion& rhs) { return Node(convert>::encode(rhs.coeffs())); } SURGSIM_DOUBLE_SPECIALIZATION template bool YAML::convert>::decode( const Node& node, typename Eigen::Quaternion& rhs) //NOLINT { bool result = false; if (node.IsSequence() && node.size() == 4) { result = convert>::decode(node, rhs.coeffs()); } else { Eigen::AngleAxis angleAxis; result = convert>::decode(node, angleAxis); if (result) { rhs = angleAxis; } } return result; } SURGSIM_DOUBLE_SPECIALIZATION template YAML::Node YAML::convert>::encode( const typename Eigen::Transform& rhs) { typedef typename Eigen::Transform::LinearMatrixType LinearMatrixType; LinearMatrixType linear(rhs.linear()); Eigen::Quaternion quaternion(linear); Eigen::Matrix translation(rhs.translation()); Node node; node[rotationPropertyName] = quaternion; node[translationPropertyName] = translation; return node; } SURGSIM_DOUBLE_SPECIALIZATION template bool YAML::convert>::decode( const Node& node, typename Eigen::Transform& rhs) //NOLINT { bool result = false; if (node.IsMap()) { Eigen::Quaternion rotation(Eigen::Quaternion::Identity()); Eigen::Matrix translation(Eigen::Matrix::Zero()); if (node[rotationPropertyName].IsDefined()) { rotation = node[rotationPropertyName].as>(); result = true; } if (node[translationPropertyName].IsDefined()) { translation = node[translationPropertyName].as>(); result = true; } rhs.makeAffine(); rhs.linear() = rotation.matrix(); rhs.translation() = translation; } return result; } SURGSIM_DOUBLE_SPECIALIZATION template YAML::Node YAML::convert>::encode( const typename Eigen::AngleAxis& rhs) { Node node; node.SetStyle(EmitterStyle::Flow); node["Angle"] = rhs.angle(); node["Axis"] = convert>::encode(rhs.axis()); return node; } SURGSIM_DOUBLE_SPECIALIZATION template bool YAML::convert>::decode( const Node& node, typename Eigen::AngleAxis& rhs) //NOLINT { bool result = false; if (node.IsMap() && node["Angle"].IsDefined() && node["Axis"].IsDefined()) { try { rhs.angle() = node["Angle"].as(); } catch (RepresentationException) { rhs.angle() = std::numeric_limits::quiet_NaN(); auto logger = SurgSim::Framework::Logger::getLogger(serializeLogger); SURGSIM_LOG(logger, WARNING) << "Bad conversion, using #NaN value. For node: " << node; } result = convert>::decode(node["Axis"], rhs.axis()); } return result; } #endif // SURGSIM_MATH_MATHCONVERT_INL_H opensurgsim-0.7.0/SurgSim/Math/MathConvert.cpp000066400000000000000000000105151277777236100213360ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Math/MathConvert.h" #include #include "SurgSim/Math/Shape.h" namespace YAML { Node convert>::encode( const std::shared_ptr& rhs) { SURGSIM_ASSERT(nullptr != rhs) << "Trying to encode nullptr SurgSim::Math::Shape"; Node result; result[rhs->getClassName()] = rhs->encode(); return result; } bool convert>::decode( const Node& node, std::shared_ptr& rhs) //NOLINT { bool result = false; if (node.IsMap()) { if (nullptr == rhs) { std::string className = node.begin()->first.as(); SurgSim::Math::Shape::FactoryType& factory = SurgSim::Math::Shape::getFactory(); if (factory.isRegistered(className)) { rhs = factory.create(className); } else { SURGSIM_FAILURE() << "Class " << className << " is not registered in the factory."; } } Node data = node.begin()->second; if (data.IsMap()) { rhs->decode(data); } result = true; } return result; } Node convert::encode( const SurgSim::Math::IntegrationScheme& rhs) { Node result; auto it = SurgSim::Math::IntegrationSchemeNames.find(rhs); SURGSIM_ASSERT(it != std::end(SurgSim::Math::IntegrationSchemeNames)) << "Can not find the enum value in " << "SurgSim::Math::IntegrationSchemeNames. Is the enum value registered?"; result["SurgSim::Math::IntegrationScheme"] = it->second; return result; } bool convert::decode( const Node& node, SurgSim::Math::IntegrationScheme& rhs) //NOLINT { bool result = false; if (node.IsMap()) { std::string className = node.begin()->first.as(); SURGSIM_ASSERT("SurgSim::Math::IntegrationScheme" == className); std::string schemeName = node.begin()->second.as(); std::transform(schemeName.begin(), schemeName.end(), schemeName.begin(), ::toupper); auto it = std::find_if(std::begin(SurgSim::Math::IntegrationSchemeNames), std::end(SurgSim::Math::IntegrationSchemeNames), [&schemeName](const std::pair& pair) { return pair.second == schemeName; } ); SURGSIM_ASSERT(it != std::end(SurgSim::Math::IntegrationSchemeNames)) << "Unknown IntegrationScheme " << schemeName; rhs = it->first; result = true; } return result; } Node convert::encode( const SurgSim::Math::LinearSolver& rhs) { Node result; auto it = SurgSim::Math::LinearSolverNames.find(rhs); SURGSIM_ASSERT(it != std::end(SurgSim::Math::LinearSolverNames)) << "Can not find the enum value in " << "SurgSim::Math::LinearSolverNames. Is the enum value registered?"; result["SurgSim::Math::LinearSolver"] = it->second; return result; } bool convert::decode( const Node& node, SurgSim::Math::LinearSolver& rhs) //NOLINT { bool result = false; if (node.IsMap()) { std::string className = node.begin()->first.as(); SURGSIM_ASSERT("SurgSim::Math::LinearSolver" == className); std::string schemeName = node.begin()->second.as(); std::transform(schemeName.begin(), schemeName.end(), schemeName.begin(), ::toupper); auto it = std::find_if(std::begin(SurgSim::Math::LinearSolverNames), std::end(SurgSim::Math::LinearSolverNames), [&schemeName](const std::pair& pair) { return pair.second == schemeName; } ); SURGSIM_ASSERT(it != std::end(SurgSim::Math::LinearSolverNames)) << "Unknown LinearSolver " << schemeName; rhs = it->first; result = true; } return result; } }; // namespace YAML opensurgsim-0.7.0/SurgSim/Math/MathConvert.h000066400000000000000000000071401277777236100210030ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_MATH_MATHCONVERT_H #define SURGSIM_MATH_MATHCONVERT_H #include #include #include #include "SurgSim/Framework/Macros.h" #include "SurgSim/Math/LinearSparseSolveAndInverse.h" #include "SurgSim/Math/OdeSolver.h" namespace SurgSim { namespace Math { class Shape; } } /// \file MathConvert.h /// This contains a series of functions to encode and decode Eigen data structures to /// and from YAML nodes. These conversion functions will extinguish Eigen options, these /// are not serialized, the output is determined by the type as it is declared in the /// appropriate conversion function, with Eigen::Transform, this could lead to problems /// If the mode that is used for reading is different than the mode that was used while /// writing. namespace YAML { /// Specialization of convert for fixed size Eigen::Matrix SURGSIM_DOUBLE_SPECIALIZATION template struct convert> { static Node encode(const typename Eigen::Matrix& rhs); static bool decode(const Node& node, typename Eigen::Matrix& rhs); //NOLINT }; /// Specialization of convert for Eigen::Quaternion SURGSIM_DOUBLE_SPECIALIZATION template struct convert> { static Node encode(const typename Eigen::Quaternion& rhs); static bool decode(const Node& node, typename Eigen::Quaternion& rhs); //NOLINT }; /// Specialization of convert for Eigen::RigidTransform SURGSIM_DOUBLE_SPECIALIZATION template struct convert> { static Node encode(const typename Eigen::Transform& rhs); static bool decode(const Node& node, typename Eigen::Transform& rhs); //NOLINT }; /// Specialization of convert for Eigen::AngleAxis SURGSIM_DOUBLE_SPECIALIZATION template struct convert> { static Node encode(const typename Eigen::AngleAxis& rhs); static bool decode(const Node& node, typename Eigen::AngleAxis& rhs); //NOLINT }; template <> struct convert> { static Node encode(const std::shared_ptr& rhs); static bool decode(const Node& node, std::shared_ptr& rhs); //NOLINT }; template <> struct convert { static Node encode(const SurgSim::Math::IntegrationScheme& rhs); static bool decode(const Node& node, SurgSim::Math::IntegrationScheme& rhs); //NOLINT }; template <> struct convert { static Node encode(const SurgSim::Math::LinearSolver& rhs); static bool decode(const Node& node, SurgSim::Math::LinearSolver& rhs); //NOLINT }; }; #include "SurgSim/Math/MathConvert-inl.h" #endif // SURGSIM_MATH_MATHCONVERT_H opensurgsim-0.7.0/SurgSim/Math/Matrix.h000066400000000000000000000242461277777236100200230ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Definitions of small fixed-size square matrix types. #ifndef SURGSIM_MATH_MATRIX_H #define SURGSIM_MATH_MATRIX_H #include #include #include #include // needed for determinant() and inverse() namespace SurgSim { namespace Math { /// A 2x2 matrix of floats. /// This type (and any structs that contain it) can be safely allocated via new. typedef Eigen::Matrix Matrix22f; /// A 3x3 matrix of floats. /// This type (and any structs that contain it) can be safely allocated via new. typedef Eigen::Matrix Matrix33f; /// A 4x4 matrix of floats. /// This type (and any structs that contain it) can be safely allocated via new. typedef Eigen::Matrix Matrix44f; /// A 2x2 matrix of doubles. /// This type (and any structs that contain it) can be safely allocated via new. typedef Eigen::Matrix Matrix22d; /// A 3x3 matrix of doubles. /// This type (and any structs that contain it) can be safely allocated via new. typedef Eigen::Matrix Matrix33d; /// A 4x4 matrix of doubles. /// This type (and any structs that contain it) can be safely allocated via new. typedef Eigen::Matrix Matrix44d; /// A 6x6 matrix of doubles. /// This type (and any structs that contain it) can be safely allocated via new. typedef Eigen::Matrix Matrix66d; /// A dynamic size diagonal matrix typedef Eigen::DiagonalMatrix DiagonalMatrix; /// A dynamic size matrix typedef Eigen::Matrix Matrix; /// Create a rotation matrix corresponding to the specified angle (in radians) and axis. /// \tparam T the numeric data type used for arguments and the return value. Can usually be deduced. /// \tparam VOpt the option flags (alignment etc.) used for the axis vector argument. Can be deduced. /// \param angle the angle of the rotation, in radians. /// \param axis the axis of the rotation. /// \returns the rotation matrix. template inline Eigen::Matrix makeRotationMatrix(const T& angle, const Eigen::Matrix& axis) { return Eigen::AngleAxis(angle, axis).toRotationMatrix(); } /// Create a skew-symmetric matrix corresponding to the specified vector. Skew-symmetric matrices are particularly /// useful for representing a portion of the vector cross-product. /// \tparam T the numeric data type used for arguments and the return value. Can usually be deduced. /// \tparam VOpt the option flags (alignment etc.) used for the vector argument. Can be deduced. /// \param vector the vector to be transformed. /// \returns the skew-symmetric matrix corresponding with the vector argument. template inline Eigen::Matrix makeSkewSymmetricMatrix(const Eigen::Matrix& vector) { Eigen::Matrix result; result(0, 0) = 0.0; result(0, 1) = -vector(2); result(0, 2) = vector(1); result(1, 0) = vector(2); result(1, 1) = 0.0; result(1, 2) = -vector(0); result(2, 0) = -vector(1); result(2, 1) = vector(0); result(2, 2) = 0.0; return result; } /// Extract the unique vector from the skew-symmetric part of a given matrix. /// \tparam T the numeric data type used for arguments and the return value. Can usually be deduced. /// \tparam MOpt the option flags (alignment etc.) used for the matrix argument. Can be deduced. /// \param matrix the matrix to compute the skew symmetric part from. /// \returns the unique vector defining the skew-symmetric part of the matrix. /// \note For any vector u, skew(makeSkewSymmetricMatrix(u)) = u /// \note In general, returns the vector of the skew symmetric part of matrix: (matrix - matrix^T)/2 template inline Eigen::Matrix skew(const Eigen::Matrix& matrix) { Eigen::Matrix skewSymmetricPart = (matrix - matrix.transpose()) / 2.0; return Eigen::Matrix(skewSymmetricPart(2, 1), skewSymmetricPart(0, 2), skewSymmetricPart(1, 0)); } /// Get the angle (in radians) and axis corresponding to a rotation matrix. /// \tparam T the numeric data type used for arguments and the return value. Can usually be deduced. /// \tparam MOpt the option flags (alignment etc.) used for the rotation matrix argument. Can be deduced. /// \tparam VOpt the option flags (alignment etc.) used for the axis vector argument. Can be deduced. /// \param matrix the rotation matrix to inspect. /// \param [out] angle the angle of the rotation, in radians. /// \param [out] axis the axis of the rotation. template inline void computeAngleAndAxis(const Eigen::Matrix& matrix, T* angle, Eigen::Matrix* axis) { Eigen::AngleAxis angleAxis(matrix); *angle = angleAxis.angle(); *axis = angleAxis.axis(); } /// Get the angle corresponding to a quaternion's rotation, in radians. /// If you don't care about the rotation axis, this is more efficient than computeAngleAndAxis(). /// \tparam T the numeric data type used for arguments and the return value. Can usually be deduced. /// \tparam MOpt the option flags (alignment etc.) used for the rotation matrix argument. Can be deduced. /// \param matrix the rotation matrix to inspect. /// \returns the angle of the rotation, in radians. template inline T computeAngle(const Eigen::Matrix& matrix) { // TODO(bert): there has to be a more efficient way... Eigen::AngleAxis angleAxis(matrix); return angleAxis.angle(); } /// Helper method to add a sub-matrix into a matrix, for the sake of clarity /// \tparam Matrix The matrix type /// \tparam SubMatrix The sub-matrix type /// \param subMatrix The sub-matrix /// \param blockIdRow, blockIdCol The block indices in matrix /// \param blockSizeRow, blockSizeCol The block size (size of the sub-matrix) /// \param[out] matrix The matrix to add the sub-matrix into template void addSubMatrix(const SubMatrix& subMatrix, size_t blockIdRow, size_t blockIdCol, size_t blockSizeRow, size_t blockSizeCol, Matrix* matrix) { matrix->block(blockSizeRow * blockIdRow, blockSizeCol * blockIdCol, blockSizeRow, blockSizeCol) += subMatrix; } /// Helper method to add a sub-matrix made of squared-blocks into a matrix, for the sake of clarity /// \tparam Matrix The matrix type /// \tparam SubMatrix The sub-matrix type /// \param subMatrix The sub-matrix (containing all the squared-blocks) /// \param blockIds Vector of block indices (for accessing matrix) corresponding to the blocks in sub-matrix /// \param blockSize The blocks size /// \param[out] matrix The matrix to add the sub-matrix blocks into template void addSubMatrix(const SubMatrix& subMatrix, const std::vector blockIds, size_t blockSize, Matrix* matrix) { const size_t numBlocks = blockIds.size(); for (size_t block0 = 0; block0 < numBlocks; block0++) { size_t blockId0 = blockIds[block0]; for (size_t block1 = 0; block1 < numBlocks; block1++) { size_t blockId1 = blockIds[block1]; matrix->block(blockSize * blockId0, blockSize * blockId1, blockSize, blockSize) += subMatrix.block(blockSize * block0, blockSize * block1, blockSize, blockSize); } } } /// Helper method to set a sub-matrix into a matrix, for the sake of clarity /// \tparam Matrix The matrix type /// \tparam SubMatrix The sub-matrix type /// \param subMatrix The sub-matrix /// \param blockIdRow, blockIdCol The block indices for row and column in matrix /// \param blockSizeRow, blockSizeCol The size of the sub-matrix /// \param[out] matrix The matrix to set the sub-matrix into template void setSubMatrix(const SubMatrix& subMatrix, size_t blockIdRow, size_t blockIdCol, size_t blockSizeRow, size_t blockSizeCol, Matrix* matrix) { matrix->block(blockSizeRow * blockIdRow, blockSizeCol * blockIdCol, blockSizeRow, blockSizeCol) = subMatrix; } /// Helper method to access a sub-matrix from a matrix, for the sake of clarity /// \tparam Matrix The matrix type to get the sub-matrix from /// \param matrix The matrix to get the sub-matrix from /// \param blockIdRow, blockIdCol The block indices /// \param blockSizeRow, blockSizeCol The block size /// \return The requested sub-matrix /// \note Disable cpplint warnings for use of non-const reference /// \note Eigen has a specific type for Block that we want to return with read/write access /// \note therefore the Matrix from which the Block is built from must not be const template Eigen::Block getSubMatrix(Matrix& matrix, size_t blockIdRow, size_t blockIdCol, // NOLINT size_t blockSizeRow, size_t blockSizeCol) { return matrix.block(blockSizeRow * blockIdRow, blockSizeCol * blockIdCol, blockSizeRow, blockSizeCol); } /// Helper method to zero a row of a matrix. /// \tparam Matrix The matrix type /// \param row The row to set to zero /// \param[in,out] matrix The matrix to set the zero row on. template void zeroRow(size_t row, Eigen::DenseBase* matrix) { matrix->middleRows(row, 1).setZero(); } /// Helper method to zero a column of a matrix. /// \tparam Matrix The matrix type /// \param column The column to set to zero /// \param[in,out] matrix The matrix to set the zero column on. template void zeroColumn(size_t column, Eigen::DenseBase* matrix) { (*matrix).middleCols(column, 1).setZero(); } }; // namespace Math }; // namespace SurgSim #endif // SURGSIM_MATH_MATRIX_H opensurgsim-0.7.0/SurgSim/Math/MeshShape-inl.h000066400000000000000000000023261277777236100212070ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // #ifndef SURGSIM_MATH_MESHSHAPE_INL_H #define SURGSIM_MATH_MESHSHAPE_INL_H namespace SurgSim { namespace Math { template MeshShape::MeshShape(const SurgSim::DataStructures::TriangleMesh& other) : SurgSim::DataStructures::TriangleMesh::TriangleMesh(other) { SURGSIM_ASSERT(other.isValid()) << "Invalid mesh"; updateAabbTree(); computeVolumeIntegrals(); calculateNormals(); } }; // namespace Math }; // namespace SurgSim #endif opensurgsim-0.7.0/SurgSim/Math/MeshShape.cpp000066400000000000000000000173021277777236100207620ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Math/MeshShape.h" #include "SurgSim/DataStructures/AabbTree.h" #include "SurgSim/DataStructures/AabbTreeData.h" #include "SurgSim/Framework/Assert.h" using SurgSim::DataStructures::EmptyData; using SurgSim::DataStructures::NormalData; template<> std::string SurgSim::DataStructures::TriangleMesh ::m_className = "SurgSim::Math::MeshShape"; namespace SurgSim { namespace Math { SURGSIM_REGISTER(SurgSim::Math::Shape, SurgSim::Math::MeshShape, MeshShape); MeshShape::MeshShape() : m_center(Vector3d::Constant(std::numeric_limits::quiet_NaN())), m_volume(std::numeric_limits::quiet_NaN()), m_secondMomentOfVolume(Matrix33d::Constant(std::numeric_limits::quiet_NaN())) { } MeshShape::MeshShape(const MeshShape& other) : DataStructures::TriangleMesh ::TriangleMesh(other), m_center(other.getCenter()), m_volume(other.getVolume()), m_secondMomentOfVolume(other.getSecondMomentOfVolume()) { updateAabbTree(); } const SurgSim::Math::Vector3d& MeshShape::getNormal(size_t triangleId) const { return getTriangle(triangleId).data.normal; } bool MeshShape::calculateNormals() { bool result = true; for (size_t i = 0; i < getNumTriangles(); ++i) { const SurgSim::Math::Vector3d& vertex0 = getVertexPosition(getTriangle(i).verticesId[0]); const SurgSim::Math::Vector3d& vertex1 = getVertexPosition(getTriangle(i).verticesId[1]); const SurgSim::Math::Vector3d& vertex2 = getVertexPosition(getTriangle(i).verticesId[2]); // Calculate normal vector SurgSim::Math::Vector3d normal = (vertex1 - vertex0).cross(vertex2 - vertex0); if (normal.isZero()) { SURGSIM_LOG_WARNING(SurgSim::Framework::Logger::getLogger("Math/MeshShape")) << "MeshShape::calculateNormals unable to calculate normals. For example, for triangle #" << i << " with vertices:" << std::endl << "1: " << vertex0.transpose() << std::endl << "2: " << vertex1.transpose() << std::endl << "3: " << vertex2.transpose(); result = false; break; } normal.normalize(); getTriangle(i).data.normal = normal; } return result; } bool MeshShape::doUpdate() { updateAabbTree(); computeVolumeIntegrals(); return calculateNormals(); } bool MeshShape::doLoad(const std::string& fileName) { if (!SurgSim::DataStructures::TriangleMesh::doLoad(fileName)) { return false; } return update(); } int MeshShape::getType() const { return SHAPE_TYPE_MESH; } double MeshShape::getVolume() const { return m_volume; } bool MeshShape::isValid() const { return SurgSim::DataStructures::TriangleMesh::isValid(); } SurgSim::Math::Vector3d MeshShape::getCenter() const { return m_center; } SurgSim::Math::Matrix33d MeshShape::getSecondMomentOfVolume() const { return m_secondMomentOfVolume; } namespace { /// Compute various integral terms /// \note Please refer to http://www.geometrictools.com/Documentation/PolyhedralMassProperties.pdf /// \note for details about parameters void computeIntegralTerms(const double w0, const double w1, const double w2, double* f1, double* f2, double* f3, double* g0, double* g1, double* g2) { double temp0 = w0 + w1; double temp1 = w0 * w0; double temp2 = temp1 + w1 * temp0; *f1 = temp0 + w2; *f2 = temp2 + w2 * (*f1); *f3 = w0 * temp1 + w1 * temp2 + w2 * (*f2); *g0 = (*f2) + w0 * ((*f1) + w0); *g1 = (*f2) + w1 * ((*f1) + w1); *g2 = (*f2) + w2 * ((*f1) + w2); } }; void MeshShape::computeVolumeIntegrals() { Eigen::VectorXd multiplier(10); multiplier << 1.0 / 6.0, 1.0 / 24.0, 1.0 / 24.0, 1.0 / 24.0, 1.0 / 60.0, 1.0 / 60.0, 1.0 / 60.0, 1.0 / 120.0, 1.0 / 120.0, 1.0 / 120.0; Eigen::VectorXd integral(10); // integral order: 1, x, y, z, x^2, y^2, z^2, xy, yz, zx integral.setZero(); for (auto const& triangle : getTriangles()) { if (! triangle.isValid) { continue; } const Vector3d& v0 = getVertexPosition(triangle.verticesId[0]); const Vector3d& v1 = getVertexPosition(triangle.verticesId[1]); const Vector3d& v2 = getVertexPosition(triangle.verticesId[2]); // get edges and cross product of edges Vector3d normal = (v1 - v0).cross(v2 - v0); // compute integral terms double f1x, f1y, f1z, f2x, f2y, f2z, f3x, f3y, f3z; double g0x, g0y, g0z, g1x, g1y, g1z, g2x, g2y, g2z; computeIntegralTerms(v0.x(), v1.x(), v2.x(), &f1x, &f2x, &f3x, &g0x, &g1x, &g2x); computeIntegralTerms(v0.y(), v1.y(), v2.y(), &f1y, &f2y, &f3y, &g0y, &g1y, &g2y); computeIntegralTerms(v0.z(), v1.z(), v2.z(), &f1z, &f2z, &f3z, &g0z, &g1z, &g2z); // update integrals integral[0] += normal[0] * f1x; integral[1] += normal[0] * f2x; integral[2] += normal[1] * f2y; integral[3] += normal[2] * f2z; integral[4] += normal[0] * f3x; integral[5] += normal[1] * f3y; integral[6] += normal[2] * f3z; integral[7] += normal[0] * (v0.y() * g0x + v1.y() * g1x + v2.y() * g2x); integral[8] += normal[1] * (v0.z() * g0y + v1.z() * g1y + v2.z() * g2y); integral[9] += normal[2] * (v0.x() * g0z + v1.x() * g1z + v2.x() * g2z); } integral = integral.cwiseProduct(multiplier); // volume m_volume = integral[0]; // center of mass if (m_volume != 0.0) { m_center = integral.segment(1, 3) / m_volume; } else { m_center.setZero(); } // second moment of volume relative to center Vector3d centerSquared = m_center.cwiseProduct(m_center); m_secondMomentOfVolume(0, 0) = integral[5] + integral[6] - m_volume * (centerSquared.y() + centerSquared.z()); m_secondMomentOfVolume(1, 1) = integral[4] + integral[6] - m_volume * (centerSquared.z() + centerSquared.x()); m_secondMomentOfVolume(2, 2) = integral[4] + integral[5] - m_volume * (centerSquared.x() + centerSquared.y()); m_secondMomentOfVolume(0, 1) = -(integral[7] - m_volume * m_center.x() * m_center.y()); m_secondMomentOfVolume(1, 0) = m_secondMomentOfVolume(0, 1); m_secondMomentOfVolume(1, 2) = -(integral[8] - m_volume * m_center.y() * m_center.z()); m_secondMomentOfVolume(2, 1) = m_secondMomentOfVolume(1, 2); m_secondMomentOfVolume(0, 2) = -(integral[9] - m_volume * m_center.z() * m_center.x()); m_secondMomentOfVolume(2, 0) = m_secondMomentOfVolume(0, 2); } std::shared_ptr MeshShape::getTransformed(const RigidTransform3d& pose) const { auto transformed = std::make_shared(*this); transformed->transform(pose); transformed->update(); return transformed; } const std::shared_ptr MeshShape::getAabbTree() const { return m_aabbTree; } void MeshShape::updateAabbTree() { m_aabbTree = std::make_shared(); std::list items; auto const& triangles = getTriangles(); for (size_t id = 0, count = triangles.size(); id < count; ++id) { if (triangles[id].isValid) { auto vertices = getTrianglePositions(id); items.emplace_back(SurgSim::Math::makeAabb(vertices[0], vertices[1], vertices[2]), id); } } m_aabbTree->set(std::move(items)); m_aabb = m_aabbTree->getAabb(); } bool MeshShape::isTransformable() const { return true; } }; // namespace Math }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Math/MeshShape.h000066400000000000000000000111611277777236100204240ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_MATH_MESHSHAPE_H #define SURGSIM_MATH_MESHSHAPE_H #include #include "SurgSim/DataStructures/EmptyData.h" #include "SurgSim/DataStructures/NormalData.h" #include "SurgSim/DataStructures/TriangleMesh.h" #include "SurgSim/Framework/ObjectFactory.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Shape.h" namespace SurgSim { namespace DataStructures { class AabbTree; } namespace Math { SURGSIM_STATIC_REGISTRATION(MeshShape); /// Mesh shape: shape made of a triangle mesh /// The triangle mesh needs to be watertight to produce valid volume, center and second moment of /// volume. If it is not the case and you need valid geometric properties, use SurfaceMeshShape instead. /// Various geometrical properties (volume based) are computed from the triangle mesh using /// David Eberly's work (http://www.geometrictools.com/Documentation/PolyhedralMassProperties.pdf) /// which is improving Brian Mirtich previous work (http://www.cs.berkeley.edu/~jfc/mirtich/massProps.html) /// by making the assumption that the polyhedral mesh is composed of triangles. /// /// \note The internal mesh should not be modified, otherwise the geometric properties will be invalid. /// \note Practical use cases: /// \note * Fixed/Rigid object, the mesh will not change anyway. /// \note * Deformable object, the mesh will be updated, but the geometric properties will not be used. /// /// \sa SurfaceMeshShape class MeshShape : public Shape, public SurgSim::DataStructures::TriangleMesh { public: /// Constructor MeshShape(); /// Copy constructor /// \param other The MeshShape to be copied from explicit MeshShape(const MeshShape& other); /// Copy constructor when the template data is a different type /// \tparam VertexData Type of extra data stored in each vertex /// \tparam EdgeData Type of extra data stored in each edge /// \tparam TriangleData Type of extra data stored in each triangle /// \param other The mesh to be copied from. Vertex, edge and triangle data will not be copied template explicit MeshShape(const SurgSim::DataStructures::TriangleMesh& other); SURGSIM_CLASSNAME(SurgSim::Math::MeshShape); int getType() const override; /// Get normal for triangle. /// \param triangleId The triangle to get normal. /// \return The normal for the triangle with given ID. const SurgSim::Math::Vector3d& getNormal(size_t triangleId) const; double getVolume() const override; Vector3d getCenter() const override; Matrix33d getSecondMomentOfVolume() const override; std::shared_ptr getTransformed(const RigidTransform3d& pose) const override; /// Get the AabbTree /// \return The object's associated AabbTree const std::shared_ptr getAabbTree() const; bool isValid() const override; bool isTransformable() const override; protected: bool doUpdate() override; bool doLoad(const std::string& fileName) override; /// Calculate normals for all triangles. /// \note Normals will be normalized. /// \return true on success, or false if any triangle has an indeterminate normal. bool calculateNormals(); /// Update the AabbTree, which is an axis-aligned bounding box r-tree used to accelerate spatial searches void updateAabbTree(); /// Compute useful volume integrals based on the triangle mesh, which /// are used to get the volume , center and second moment of volume. virtual void computeVolumeIntegrals(); /// Center (considering a uniform distribution in the mesh volume) SurgSim::Math::Vector3d m_center; /// Volume (in m^-3) double m_volume; /// Second moment of volume SurgSim::Math::Matrix33d m_secondMomentOfVolume; private: /// The aabb tree used to accelerate collision detection against the mesh std::shared_ptr m_aabbTree; }; }; // Math }; // SurgSim #include "SurgSim/Math/MeshShape-inl.h" #endif // SURGSIM_MATH_MESHSHAPE_H opensurgsim-0.7.0/SurgSim/Math/MinMax-inl.h000066400000000000000000000050771277777236100205310ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_MATH_MINMAX_INL_H #define SURGSIM_MATH_MINMAX_INL_H #include "SurgSim/Framework/Assert.h" namespace SurgSim { namespace Math { template void minMax(const T& a1, const T& a2, T* minVal, T* maxVal) { if (a1 < a2) { *minVal = a1; *maxVal = a2; } else { *minVal = a2; *maxVal = a1; } } template void minMax(const T& a1, const T& a2, const T& a3, T* minVal, T* maxVal) { T min = a1; T max = a1; if (a2 < min) { min = a2; } else if (a2 > max) { max = a2; } if (a3 < min) { min = a3; } else if (a3 > max) { max = a3; } *minVal = min; *maxVal = max; } template void minMax(const T& a1, const T& a2, const T& a3, const T& a4, T* minVal, T* maxVal) { T min = a1; T max = a1; if (a2 < min) { min = a2; } else if (a2 > max) { max = a2; } if (a3 < min) { min = a3; } else if (a3 > max) { max = a3; } if (a4 < min) { min = a4; } else if (a4 > max) { max = a4; } *minVal = min; *maxVal = max; } template void minMax(const T& a1, const T& a2, const T& a3, const T& a4, const T& a5, T* minVal, T* maxVal) { T min = a1; T max = a1; if (a2 < min) { min = a2; } else if (a2 > max) { max = a2; } if (a3 < min) { min = a3; } else if (a3 > max) { max = a3; } if (a4 < min) { min = a4; } else if (a4 > max) { max = a4; } if (a5 < min) { min = a5; } else if (a5 > max) { max = a5; } *minVal = min; *maxVal = max; } template void minMax(const T* values, int numValues, T* minVal, T* maxVal) { SURGSIM_ASSERT(numValues > 0) << "MinMax was called with a negative or null" << " number of values; the result is indeterminate."; T min = values[0]; T max = values[0]; for (int i = 1; i < numValues; ++i) { if (values[i] < min) { min = values[i]; } else if (values[i] > max) { max = values[i]; } } *minVal = min; *maxVal = max; } }; }; #endif // SURGSIM_MATH_MINMAX_INL_H opensurgsim-0.7.0/SurgSim/Math/MinMax.h000066400000000000000000000053711277777236100177460ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_MATH_MINMAX_H #define SURGSIM_MATH_MINMAX_H namespace SurgSim { namespace Math { /// Calculate the minimum and maximum of two values /// \tparam T underlying type /// \param a1 the first value /// \param a2 the second value /// \param minVal [out] the minimum of a1 and a2 /// \param maxVal [out] the maximum of a1 and a2 template void minMax(const T& a1, const T& a2, T* minVal, T* maxVal); /// Calculate the minimum and maximum of three values /// \tparam T underlying type /// \param a1 the first value /// \param a2 the second value /// \param a3 the third value /// \param minVal [out] the minimum of a1, a2 and a3 /// \param maxVal [out] the maximum of a1, a2 and a3 template void minMax(const T& a1, const T& a2, const T& a3, T* minVal, T* maxVal); /// Calculate the minimum and maximum of four values /// \tparam T underlying type /// \param a1 the first value /// \param a2 the second value /// \param a3 the third value /// \param a4 the fourth value /// \param minVal [out] the minimum of a1, a2, a3 and a4 /// \param maxVal [out] the maximum of a1, a2, a3 and a4 template void minMax(const T& a1, const T& a2, const T& a3, const T& a4, T* minVal, T* maxVal); /// Calculate the minimum and maximum of five values /// \tparam T underlying type /// \param a1 the first value /// \param a2 the second value /// \param a3 the third value /// \param a4 the fourth value /// \param a5 the fifth value /// \param minVal [out] the minimum of a1, a2, a3, a4 and a5 /// \param maxVal [out] the maximum of a1, a2, a3, a4 and a5 template void minMax(const T& a1, const T& a2, const T& a3, const T& a4, const T& a5, T* minVal, T* maxVal); /// Calculate the minimum and maximum of numValues values /// \tparam T underlying type /// \param values a series of numValues values /// \param numValues the number of values in the series /// \param minVal [out] the minimum value in values /// \param maxVal [out] the maximum value in values template void minMax(const T* values, int numValues, T* minVal, T* maxVal); }; }; #include "SurgSim/Math/MinMax-inl.h" #endif // SURGSIM_MATH_MINMAX_H opensurgsim-0.7.0/SurgSim/Math/MlcpConstraintType.h000066400000000000000000000035731277777236100223610ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_MATH_MLCPCONSTRAINTTYPE_H #define SURGSIM_MATH_MLCPCONSTRAINTTYPE_H namespace SurgSim { namespace Math { enum MlcpConstraintType { // Invalid value -- not used for any constraint type MLCP_INVALID_CONSTRAINT = -1, // Fixing 1 DOF MLCP_BILATERAL_1D_CONSTRAINT = 0, // Fixing 2 DOF MLCP_BILATERAL_2D_CONSTRAINT, // Fixing 3 DOF (could be a fixed point in 3D space for example) MLCP_BILATERAL_3D_CONSTRAINT, // Fixing 4 DOF (could be a fixed point with twist included for the MechanicalSpline for example) // MLCP_BILATERAL_4D_CONSTRAINT, // Frictionless contact (could be in 2D or 3D => only 1 atomic unilateral constraint) MLCP_UNILATERAL_3D_FRICTIONLESS_CONSTRAINT, // Frictional contact in 3D, using Coulomb friction => 1 entry in the friction coefficient array ! MLCP_UNILATERAL_3D_FRICTIONAL_CONSTRAINT, // Frictionless suturing in 3D => 2 directional constraint = 2 bilateral constraints ! MLCP_BILATERAL_FRICTIONLESS_SLIDING_CONSTRAINT, // Frictional suturing in 3D => 2 directional constraint + 1 frictional tangent constraint linked by Coulomb's law MLCP_BILATERAL_FRICTIONAL_SLIDING_CONSTRAINT, MLCP_NUM_CONSTRAINT_TYPES }; }; // namespace Math }; // namespace SurgSim #endif // SURGSIM_MATH_MLCPCONSTRAINTTYPE_H opensurgsim-0.7.0/SurgSim/Math/MlcpConstraintTypeName.h000066400000000000000000000061211277777236100231520ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_MATH_MLCPCONSTRAINTTYPENAME_H #define SURGSIM_MATH_MLCPCONSTRAINTTYPENAME_H #include #include "SurgSim/Math/MlcpConstraintType.h" #include "SurgSim/Framework/Assert.h" #include "SurgSim/Framework/Log.h" namespace SurgSim { namespace Math { inline std::string getMlcpConstraintTypeName(MlcpConstraintType constraintType) { switch (constraintType) { case MLCP_BILATERAL_1D_CONSTRAINT: return "MLCP_BILATERAL_1D_CONSTRAINT"; case MLCP_BILATERAL_2D_CONSTRAINT: return "MLCP_BILATERAL_2D_CONSTRAINT"; case MLCP_BILATERAL_3D_CONSTRAINT: return "MLCP_BILATERAL_3D_CONSTRAINT"; // case MLCP_BILATERAL_4D_CONSTRAINT: // return "MLCP_BILATERAL_4D_CONSTRAINT"; case MLCP_UNILATERAL_3D_FRICTIONLESS_CONSTRAINT: return "MLCP_UNILATERAL_3D_FRICTIONLESS_CONSTRAINT"; case MLCP_UNILATERAL_3D_FRICTIONAL_CONSTRAINT: return "MLCP_UNILATERAL_3D_FRICTIONAL_CONSTRAINT"; case MLCP_BILATERAL_FRICTIONLESS_SLIDING_CONSTRAINT: return "MLCP_BILATERAL_FRICTIONLESS_SLIDING_CONSTRAINT"; case MLCP_BILATERAL_FRICTIONAL_SLIDING_CONSTRAINT: return "MLCP_BILATERAL_FRICTIONAL_SLIDING_CONSTRAINT"; default: SURGSIM_LOG_SEVERE(SURGSIM_ASSERT_LOGGER) << "bad MLCP constraint type value: " << constraintType; return ""; } } inline MlcpConstraintType getMlcpConstraintTypeValue(const std::string& typeName) { if (typeName == "MLCP_BILATERAL_1D_CONSTRAINT") { return MLCP_BILATERAL_1D_CONSTRAINT; } else if (typeName == "MLCP_BILATERAL_2D_CONSTRAINT") { return MLCP_BILATERAL_2D_CONSTRAINT; } else if (typeName == "MLCP_BILATERAL_3D_CONSTRAINT") { return MLCP_BILATERAL_3D_CONSTRAINT; } // else if (typeName == "MLCP_BILATERAL_4D_CONSTRAINT") // { // return MLCP_BILATERAL_4D_CONSTRAINT; // } else if (typeName == "MLCP_UNILATERAL_3D_FRICTIONLESS_CONSTRAINT") { return MLCP_UNILATERAL_3D_FRICTIONLESS_CONSTRAINT; } else if (typeName == "MLCP_UNILATERAL_3D_FRICTIONAL_CONSTRAINT") { return MLCP_UNILATERAL_3D_FRICTIONAL_CONSTRAINT; } else if (typeName == "MLCP_BILATERAL_FRICTIONLESS_SLIDING_CONSTRAINT") { return MLCP_BILATERAL_FRICTIONLESS_SLIDING_CONSTRAINT; } else if (typeName == "MLCP_BILATERAL_FRICTIONAL_SLIDING_CONSTRAINT") { return MLCP_BILATERAL_FRICTIONAL_SLIDING_CONSTRAINT; } else { SURGSIM_LOG_WARNING(SURGSIM_ASSERT_LOGGER) << "bad MLCP constraint type name: '" << typeName << "'"; return MLCP_INVALID_CONSTRAINT; } } }; // namespace Math }; // namespace SurgSim #endif // SURGSIM_MATH_MLCPCONSTRAINTTYPENAME_H opensurgsim-0.7.0/SurgSim/Math/MlcpGaussSeidelSolver.cpp000066400000000000000000000722151277777236100233300ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Math/MlcpConstraintTypeName.h" #include "SurgSim/Math/MlcpGaussSeidelSolver.h" #include #include "SurgSim/Framework/Log.h" #include "SurgSim/Math/Valid.h" namespace SurgSim { namespace Math { MlcpGaussSeidelSolver::MlcpGaussSeidelSolver() : m_epsilonConvergence(1e-4), m_contactTolerance(2e-5), m_maxIterations(30), m_numEnforcedAtomicConstraints(0), m_logger(SurgSim::Framework::Logger::getLogger("Math/MlcpGaussSeidelSolver")) { } MlcpGaussSeidelSolver::MlcpGaussSeidelSolver(double epsilonConvergence, double contactTolerance, size_t maxIterations) : m_epsilonConvergence(epsilonConvergence), m_contactTolerance(contactTolerance), m_maxIterations(maxIterations), m_numEnforcedAtomicConstraints(0), m_logger(SurgSim::Framework::Logger::getLogger("Math/MlcpGaussSeidelSolver")) { } MlcpGaussSeidelSolver::~MlcpGaussSeidelSolver() { } double MlcpGaussSeidelSolver::getEpsilonConvergence() const { return m_epsilonConvergence; } void MlcpGaussSeidelSolver::setEpsilonConvergence(double precision) { m_epsilonConvergence = precision; } double MlcpGaussSeidelSolver::getContactTolerance() const { return m_contactTolerance; } void MlcpGaussSeidelSolver::setContactTolerance(double tolerance) { m_contactTolerance = tolerance; } size_t MlcpGaussSeidelSolver::getMaxIterations() const { return m_maxIterations; } void MlcpGaussSeidelSolver::setMaxIterations(size_t maxIterations) { m_maxIterations = maxIterations; } bool MlcpGaussSeidelSolver::solve(const MlcpProblem& problem, MlcpSolution* solution) { const size_t problemSize = problem.getSize(); const MlcpProblem::Matrix& A = problem.A; const MlcpProblem::Vector& b = problem.b; MlcpSolution::Vector& initialGuessAndSolution = solution->x; const std::vector& constraintsType = problem.constraintTypes; size_t* iteration = &solution->numIterations; bool* validConvergence = &solution->validConvergence; bool* validSignorini = &solution->validSignorini; double* convergenceCriteria = &solution->convergenceCriteria; double* initialConvergenceCriteria = &solution->initialConvergenceCriteria; double* constraintConvergenceCriteria = solution->constraintConvergenceCriteria; double* initialConstraintConvergenceCriteria = solution->initialConstraintConvergenceCriteria; // Loop until it converges or maxIterations are reached *iteration = 0; *validSignorini = true; calculateConvergenceCriteria(problemSize, A, b, initialGuessAndSolution, constraintsType, initialConstraintConvergenceCriteria, initialConvergenceCriteria, validSignorini); // If it is already converged, fill the output and return true. if (*initialConvergenceCriteria <= m_epsilonConvergence && *validSignorini) { *validConvergence = true; *convergenceCriteria = *initialConvergenceCriteria; return true; } do { doOneIteration(problemSize, A, b, &initialGuessAndSolution, problem.mu, constraintsType, constraintConvergenceCriteria, convergenceCriteria, validSignorini); calculateConvergenceCriteria(problemSize, A, b, initialGuessAndSolution, constraintsType, constraintConvergenceCriteria, convergenceCriteria, validSignorini); ++(*iteration); // If we have an incredibly high convergence criteria value, the displacements are going to be very large, // causing problems in the next iteration, so we should break out here. The convergence_criteria should // really only be a couple order of magnitudes higher than epsilon. if (!SurgSim::Math::isValid(*convergenceCriteria) || *convergenceCriteria > 1.0) { SURGSIM_LOG_WARNING(m_logger) << "Convergence (" << *convergenceCriteria << ") is NaN, infinite, or greater than 1.0! MLCP is exploding after " << *iteration << " Gauss Seidel iterations!!"; break; } } while ((!(*validSignorini) || (*convergenceCriteria > m_epsilonConvergence)) && *iteration < m_maxIterations); *validConvergence = SurgSim::Math::isValid(*convergenceCriteria) && *convergenceCriteria <= 1.0; SURGSIM_LOG_IF(*convergenceCriteria >= sqrt(m_epsilonConvergence), m_logger, WARNING) << "Convergence criteria (" << *convergenceCriteria << ") is greater than " << sqrt(m_epsilonConvergence) << " at end of " << *iteration << " Gauss Seidel iterations."; SURGSIM_LOG_IF(*convergenceCriteria > *initialConvergenceCriteria, m_logger, WARNING) << "Convergence criteria (" << *convergenceCriteria << ") is greater than before " << *iteration << " Gauss Seidel iterations (" << *initialConvergenceCriteria << ")."; SURGSIM_LOG_IF(!(*validSignorini), m_logger, WARNING) << "Signorini not verified after " << *iteration << " Gauss Seidel iterations."; return (SurgSim::Math::isValid(*convergenceCriteria) && *convergenceCriteria <= m_epsilonConvergence); } void MlcpGaussSeidelSolver::calculateConvergenceCriteria(size_t problemSize, const MlcpProblem::Matrix& A, const MlcpProblem::Vector& b, const MlcpSolution::Vector& initialGuessAndSolution, const std::vector& constraintsType, double constraintConvergenceCriteria[MLCP_NUM_CONSTRAINT_TYPES], double* convergenceCriteria, bool* validSignorini) { // Calculate initial convergence criteria. for (size_t constraint = 0; constraint < MLCP_NUM_CONSTRAINT_TYPES; ++constraint) { constraintConvergenceCriteria[constraint] = 0.0; } *convergenceCriteria = 0.0; *validSignorini = true; size_t currentAtomicIndex = 0; const size_t nbConstraints = constraintsType.size(); size_t nbNonContactConstraints = 0; for (size_t constraint = 0; constraint < nbConstraints; ++constraint) { switch (constraintsType[constraint]) { case MLCP_BILATERAL_1D_CONSTRAINT: { const double criteria = (b.segment<1>(currentAtomicIndex) + A.row(currentAtomicIndex) * initialGuessAndSolution).norm(); *convergenceCriteria += criteria; constraintConvergenceCriteria[constraintsType[constraint]] += criteria; ++nbNonContactConstraints; currentAtomicIndex += 1; break; } case MLCP_BILATERAL_2D_CONSTRAINT: { const double criteria = (b.segment<2>(currentAtomicIndex) + A.block(currentAtomicIndex, 0, 2, problemSize) * initialGuessAndSolution).norm(); *convergenceCriteria += criteria; constraintConvergenceCriteria[constraintsType[constraint]] += criteria; ++nbNonContactConstraints; currentAtomicIndex += 2; break; } case MLCP_BILATERAL_3D_CONSTRAINT: { const double criteria = (b.segment<3>(currentAtomicIndex) + A.block(currentAtomicIndex, 0, 3, problemSize) * initialGuessAndSolution).norm(); *convergenceCriteria += criteria; constraintConvergenceCriteria[constraintsType[constraint]] += criteria; ++nbNonContactConstraints; currentAtomicIndex += 3; break; } case MLCP_UNILATERAL_3D_FRICTIONLESS_CONSTRAINT: { const double violation = b[currentAtomicIndex] + A.row(currentAtomicIndex) * initialGuessAndSolution; // Enforce orthogonality condition if (!SurgSim::Math::isValid(violation) || violation < -m_contactTolerance || (initialGuessAndSolution[currentAtomicIndex] > m_epsilonConvergence && violation > m_contactTolerance)) { *validSignorini = false; } currentAtomicIndex += 1; break; } case MLCP_UNILATERAL_3D_FRICTIONAL_CONSTRAINT: { const double violation = b[currentAtomicIndex] + A.row(currentAtomicIndex) * initialGuessAndSolution; // Enforce orthogonality condition if (!SurgSim::Math::isValid(violation) || violation < -m_contactTolerance || (initialGuessAndSolution[currentAtomicIndex] > m_epsilonConvergence && violation > m_contactTolerance)) { *validSignorini = false; } currentAtomicIndex += 3; break; } case MLCP_BILATERAL_FRICTIONLESS_SLIDING_CONSTRAINT: { const double criteria = (b.segment<2>(currentAtomicIndex) + A.block(currentAtomicIndex, 0, 2, problemSize) * initialGuessAndSolution).norm(); *convergenceCriteria += criteria; constraintConvergenceCriteria[constraintsType[constraint]] += criteria; ++nbNonContactConstraints; currentAtomicIndex += 2; break; } case MLCP_BILATERAL_FRICTIONAL_SLIDING_CONSTRAINT: { // We verify that the sliding point is on the line...no matter what the friction violation is // (3rd component) const double criteria = (b.segment<2>(currentAtomicIndex) + A.block(currentAtomicIndex, 0, 2, problemSize) * initialGuessAndSolution).norm(); *convergenceCriteria += criteria; constraintConvergenceCriteria[constraintsType[constraint]] += criteria; ++nbNonContactConstraints; currentAtomicIndex += 3; break; } default: SURGSIM_FAILURE() << "unknown constraint type [" << constraintsType[constraint] << "]"; break; } } if (nbNonContactConstraints > 0) { *convergenceCriteria /= nbNonContactConstraints; // normalize if necessary } } void MlcpGaussSeidelSolver::computeEnforcementSystem( size_t problemSize, const MlcpProblem::Matrix& A, const MlcpProblem::Vector& b, const MlcpSolution::Vector& initialGuessAndSolution, const std::vector& constraintsType, size_t constraintID, size_t matrixEntryForConstraintID) { const size_t nbConstraints = constraintsType.size(); // Total size of the system (number of line and column in the final matrix) size_t systemSize = 0; // Total size of the system counting only the {1D,2D,3D} bilateral constraints size_t systemSizeWithoutConstraintID = 0; // 1st) compute the size of the final system // We suppose that the constraint to enforce are only 1D, 2D or 3D bilateral constraints // and all appearing first in the list ! { bool done = false; for (size_t i = 0; i < nbConstraints; ++i) { switch (constraintsType[i]) { case MLCP_BILATERAL_1D_CONSTRAINT: { systemSize += 1; systemSizeWithoutConstraintID += 1; break; } case MLCP_BILATERAL_2D_CONSTRAINT: { systemSize += 2; systemSizeWithoutConstraintID += 2; break; } case MLCP_BILATERAL_3D_CONSTRAINT: { systemSize += 3; systemSizeWithoutConstraintID += 3; break; } default: done = true; break; } if (done) { break; } } // We added all the constraints, now we need to add the constraintID (contact, sliding,...) to have the total // system size! switch (constraintsType[constraintID]) { case MLCP_BILATERAL_1D_CONSTRAINT: case MLCP_UNILATERAL_3D_FRICTIONLESS_CONSTRAINT: // The system will solve the normal contact, not the frictional parts ! case MLCP_UNILATERAL_3D_FRICTIONAL_CONSTRAINT: { systemSize += 1; break; } case MLCP_BILATERAL_2D_CONSTRAINT: case MLCP_BILATERAL_FRICTIONLESS_SLIDING_CONSTRAINT: // The system will solve the sliding case, not the frictional part ! case MLCP_BILATERAL_FRICTIONAL_SLIDING_CONSTRAINT: { systemSize += 2; break; } case MLCP_BILATERAL_3D_CONSTRAINT: { systemSize += 3; break; } default: SURGSIM_LOG_SEVERE(m_logger) << "MlcpGaussSeidelSolver::computeEnforcementSystem Unknown constraint !?"; break; } } m_numEnforcedAtomicConstraints = systemSize; m_rhsEnforcedLocalSystem.resize(systemSize); m_lhsEnforcedLocalSystem.resize(systemSize, systemSize); // 2nd) Fill up the system // We suppose that the constraint to enforce are only 1D, 2D or 3D bilateral constraints { // Here we fill up the core part, compliance between all the constraints themselves ! m_rhsEnforcedLocalSystem.head(systemSizeWithoutConstraintID) = b.head(systemSizeWithoutConstraintID) + A.block(0, 0, systemSizeWithoutConstraintID, problemSize) * initialGuessAndSolution; m_lhsEnforcedLocalSystem.block(0, 0, systemSizeWithoutConstraintID, systemSizeWithoutConstraintID) = A.block(0, 0, systemSizeWithoutConstraintID, systemSizeWithoutConstraintID); // Now we complete the contact matrix by adding the coupling constraint/{contact|sliding} and the compliance // for {contact|sliding} switch (constraintsType[constraintID]) { case MLCP_BILATERAL_1D_CONSTRAINT: // In any case of contact, we only register the normal part...the friction part is computed afterward ! case MLCP_UNILATERAL_3D_FRICTIONLESS_CONSTRAINT: case MLCP_UNILATERAL_3D_FRICTIONAL_CONSTRAINT: { // Coupling part (fill up LHS and RHS) m_rhsEnforcedLocalSystem[systemSizeWithoutConstraintID] = b[matrixEntryForConstraintID] + A.row(matrixEntryForConstraintID) * initialGuessAndSolution; m_lhsEnforcedLocalSystem.block(0, systemSizeWithoutConstraintID, systemSizeWithoutConstraintID, 1) = A.block(0, matrixEntryForConstraintID, systemSizeWithoutConstraintID, 1); m_lhsEnforcedLocalSystem.block(systemSizeWithoutConstraintID, 0, 1, systemSizeWithoutConstraintID) = A.block(matrixEntryForConstraintID, 0, 1, systemSizeWithoutConstraintID); // Compliance part for the {contact|sliding} m_lhsEnforcedLocalSystem(systemSizeWithoutConstraintID, systemSizeWithoutConstraintID) = A(matrixEntryForConstraintID, matrixEntryForConstraintID); break; } case MLCP_BILATERAL_2D_CONSTRAINT: // In any case of sliding, we only register the normals part...the friction part along the // tangent is computed afterward ! case MLCP_BILATERAL_FRICTIONLESS_SLIDING_CONSTRAINT: case MLCP_BILATERAL_FRICTIONAL_SLIDING_CONSTRAINT: { // Coupling part (fill up LHS and RHS) m_rhsEnforcedLocalSystem.segment<2>(systemSizeWithoutConstraintID) = b.segment<2>(matrixEntryForConstraintID) + A.block(matrixEntryForConstraintID, 0, 2, problemSize) * initialGuessAndSolution; m_lhsEnforcedLocalSystem.block(0, systemSizeWithoutConstraintID, systemSizeWithoutConstraintID, 2) = A.block(0, matrixEntryForConstraintID, systemSizeWithoutConstraintID, 2); m_lhsEnforcedLocalSystem.block(systemSizeWithoutConstraintID, 0, 2, systemSizeWithoutConstraintID) = A.block(matrixEntryForConstraintID, 0, 2, systemSizeWithoutConstraintID); // Compliance part for the {contact|sliding} m_lhsEnforcedLocalSystem.block(systemSizeWithoutConstraintID, systemSizeWithoutConstraintID, 2, 2) = A.block(matrixEntryForConstraintID, matrixEntryForConstraintID, 2, 2); break; } case MLCP_BILATERAL_3D_CONSTRAINT: { // Coupling part (fill up LHS and RHS) m_rhsEnforcedLocalSystem.segment<3>(systemSizeWithoutConstraintID) = b.segment<3>(matrixEntryForConstraintID) + A.block(matrixEntryForConstraintID, 0, 3, problemSize) * initialGuessAndSolution; m_lhsEnforcedLocalSystem.block(0, systemSizeWithoutConstraintID, systemSizeWithoutConstraintID, 3) = A.block(0, matrixEntryForConstraintID, systemSizeWithoutConstraintID, 3); m_lhsEnforcedLocalSystem.block(systemSizeWithoutConstraintID, 0, 3, systemSizeWithoutConstraintID) = A.block(matrixEntryForConstraintID, 0, 3, systemSizeWithoutConstraintID); // Compliance part for the {contact|sliding} m_lhsEnforcedLocalSystem.block(systemSizeWithoutConstraintID, systemSizeWithoutConstraintID, 3, 3) = A.block(matrixEntryForConstraintID, matrixEntryForConstraintID, 3, 3); break; } default: SURGSIM_LOG_SEVERE(m_logger) << "MlcpGaussSeidelSolver::computeEnforcementSystem Unknown constraint !?"; break; } } } // Solve the system A x = b for x, with the assumption that the size is "size" static inline void solveSystem(const MlcpProblem::Matrix& A, const MlcpProblem::Vector& b, size_t size, MlcpSolution::Vector* x) { MlcpProblem::Matrix AA = A.block(0, 0, size, size); MlcpProblem::Vector bb = b.head(size); MlcpSolution::Vector solution = AA.partialPivLu().solve(bb); //MlcpSolution::Vector solution = AA.colPivHouseholderQr().solve(bb); //MlcpSolution::Vector solution = AA.householderQr().solve(bb); *x = solution; } void MlcpGaussSeidelSolver::doOneIteration(size_t problemSize, const MlcpProblem::Matrix& A, const MlcpProblem::Vector& b, MlcpSolution::Vector* initialGuessAndSolution, const MlcpProblem::Vector& frictionCoefs, const std::vector& constraintsType, double constraintConvergenceCriteria[MLCP_NUM_CONSTRAINT_TYPES], double* convergenceCriteria, bool* validSignorini) { for (size_t constraint = 0; constraint < MLCP_NUM_CONSTRAINT_TYPES; ++constraint) { constraintConvergenceCriteria[constraint] = 0.0; } *convergenceCriteria = 0.0; *validSignorini = true; size_t currentAtomicIndex = 0; size_t nbConstraints = constraintsType.size(); // For each constraint, we look if the constraint is violated or not ! for (size_t constraint = 0; constraint < nbConstraints; ++constraint) { switch (constraintsType[constraint]) { case MLCP_BILATERAL_1D_CONSTRAINT: { (*initialGuessAndSolution)[currentAtomicIndex] -= (b[currentAtomicIndex] + A.row(currentAtomicIndex) * (*initialGuessAndSolution)) / A(currentAtomicIndex, currentAtomicIndex); ++currentAtomicIndex; break; } case MLCP_BILATERAL_2D_CONSTRAINT: { (*initialGuessAndSolution).segment<2>(currentAtomicIndex) -= A.block<2, 2>(currentAtomicIndex, currentAtomicIndex).inverse() * (b.segment<2>(currentAtomicIndex) + A.block(currentAtomicIndex, 0, 2, problemSize) * (*initialGuessAndSolution)); currentAtomicIndex += 2; break; } case MLCP_BILATERAL_3D_CONSTRAINT: { (*initialGuessAndSolution).segment<3>(currentAtomicIndex) -= A.block<3, 3>(currentAtomicIndex, currentAtomicIndex).inverse() * (b.segment<3>(currentAtomicIndex) + A.block(currentAtomicIndex, 0, 3, problemSize) * (*initialGuessAndSolution)); currentAtomicIndex += 3; break; } case MLCP_UNILATERAL_3D_FRICTIONLESS_CONSTRAINT: { // Form the local system computeEnforcementSystem(problemSize, A, b, *initialGuessAndSolution, constraintsType, constraint, currentAtomicIndex); // Solve A.f = violation solveSystem(m_lhsEnforcedLocalSystem, m_rhsEnforcedLocalSystem, m_numEnforcedAtomicConstraints, &m_rhsEnforcedLocalSystem); // Correct the forces accordingly (*initialGuessAndSolution).head(m_numEnforcedAtomicConstraints - 1) -= m_rhsEnforcedLocalSystem.head(m_numEnforcedAtomicConstraints - 1); double& Fn = (*initialGuessAndSolution)[currentAtomicIndex]; Fn -= m_rhsEnforcedLocalSystem[m_numEnforcedAtomicConstraints - 1]; if (Fn < 0.0) { Fn = 0; // inactive contact on normal } ++currentAtomicIndex; break; } case MLCP_UNILATERAL_3D_FRICTIONAL_CONSTRAINT: { // Form the local system computeEnforcementSystem(problemSize, A, b, *initialGuessAndSolution, constraintsType, constraint, currentAtomicIndex); // Solve A.f = violation solveSystem(m_lhsEnforcedLocalSystem, m_rhsEnforcedLocalSystem, m_numEnforcedAtomicConstraints, &m_rhsEnforcedLocalSystem); // Correct the forces accordingly (*initialGuessAndSolution).head(m_numEnforcedAtomicConstraints - 1) -= m_rhsEnforcedLocalSystem.head(m_numEnforcedAtomicConstraints - 1); double& Fn = (*initialGuessAndSolution)[currentAtomicIndex]; Eigen::VectorBlock Ft = (*initialGuessAndSolution).segment<2>(currentAtomicIndex + 1); Fn -= m_rhsEnforcedLocalSystem[m_numEnforcedAtomicConstraints - 1]; if (Fn > 0.0) { // Compute the frictions violation Ft -= 2.0 * (b.segment<2>(currentAtomicIndex + 1) + A.block(currentAtomicIndex + 1, 0, 2, problemSize) * (*initialGuessAndSolution)) / (A(currentAtomicIndex + 1, currentAtomicIndex + 1) + A(currentAtomicIndex + 2, currentAtomicIndex + 2)); const double maxFriction = frictionCoefs[currentAtomicIndex] * Fn; if (Ft.norm() > maxFriction) { // Here, the Friction is too strong, we keep the direction, but modulate its length // to verify the Coulomb's law: |Ft| = mu |Fn| Ft = Ft.normalized() * maxFriction; } } else { Fn = 0; // inactive contact on normal // inactive contact on tangent Ft.setZero(); } currentAtomicIndex += 3; break; } case MLCP_BILATERAL_FRICTIONLESS_SLIDING_CONSTRAINT: { // Form the local system computeEnforcementSystem(problemSize, A, b, *initialGuessAndSolution, constraintsType, constraint, currentAtomicIndex); // Solve A.f = violation solveSystem(m_lhsEnforcedLocalSystem, m_rhsEnforcedLocalSystem, m_numEnforcedAtomicConstraints, &m_rhsEnforcedLocalSystem); // Correct the forces accordingly (*initialGuessAndSolution).head(m_numEnforcedAtomicConstraints - 2) -= m_rhsEnforcedLocalSystem.head(m_numEnforcedAtomicConstraints - 2); (*initialGuessAndSolution).segment<2>(currentAtomicIndex) -= m_rhsEnforcedLocalSystem.segment<2>(m_numEnforcedAtomicConstraints - 2); currentAtomicIndex += 2; break; } case MLCP_BILATERAL_FRICTIONAL_SLIDING_CONSTRAINT: { // Form the local system computeEnforcementSystem(problemSize, A, b, *initialGuessAndSolution, constraintsType, constraint, currentAtomicIndex); // Solve A.f = violation solveSystem(m_lhsEnforcedLocalSystem, m_rhsEnforcedLocalSystem, m_numEnforcedAtomicConstraints, &m_rhsEnforcedLocalSystem); // Correct the forces accordingly (*initialGuessAndSolution).head(m_numEnforcedAtomicConstraints - 2) -= m_rhsEnforcedLocalSystem.head(m_numEnforcedAtomicConstraints - 2); Eigen::VectorBlock Fn = (*initialGuessAndSolution).segment<2>(currentAtomicIndex); Fn -= m_rhsEnforcedLocalSystem.segment<2>(m_numEnforcedAtomicConstraints - 2); // No Signorini to verify here, it is NOT a unilateral constraint, but bilateral { // Complete the violation of the friction along t, with the missing terms... double& Ft = (*initialGuessAndSolution)[currentAtomicIndex + 2]; Ft -= (b[currentAtomicIndex + 2] + A.row(currentAtomicIndex + 2) * (*initialGuessAndSolution)) / A(currentAtomicIndex + 2, currentAtomicIndex + 2); const double maxFriction = frictionCoefs[currentAtomicIndex] * Fn.norm(); const double ftNorm = fabs(Ft); if (ftNorm > maxFriction) { // Here, the Friction is too strong, we keep the direction, but modulate its length // to verify the Coulomb's law: |Ft| = mu |Fn| Ft *= maxFriction / ftNorm; } } currentAtomicIndex += 3; break; } default: SURGSIM_FAILURE() << "unknown constraint type [" << constraintsType[constraint] << "]"; break; } } } void MlcpGaussSeidelSolver::printViolationsAndConvergence(size_t problemSize, const MlcpProblem::Matrix& A, const MlcpProblem::Vector& b, const MlcpSolution::Vector& initialGuessAndSolution, const std::vector& constraintsType, double convergenceCriteria, bool validSignorini, size_t iterations) { SURGSIM_LOG_INFO(m_logger) << "MLCP at iteration " << iterations << " ="; size_t currentAtomicIndex = 0; size_t nbConstraints = constraintsType.size(); for (size_t constraint = 0; constraint < nbConstraints; ++constraint) { switch (constraintsType[constraint]) { case MLCP_BILATERAL_1D_CONSTRAINT: { double violation = b[currentAtomicIndex] + A.row(currentAtomicIndex) * initialGuessAndSolution; SURGSIM_LOG_INFO(m_logger) << "Constraint [" << constraint << "] of type " << getMlcpConstraintTypeName(constraintsType[constraint]) << std::endl << "\t with initial violation b=(" << b[currentAtomicIndex] << ")" << std::endl << "\t with final violation b-Ax=(" << violation << ")" << std::endl << "\t force=(" << initialGuessAndSolution[currentAtomicIndex] << ")"; currentAtomicIndex += 1; break; } case MLCP_BILATERAL_2D_CONSTRAINT: { Vector2d violation = b.segment<2>(currentAtomicIndex) + A.block(currentAtomicIndex, 0, 2, problemSize) * initialGuessAndSolution; SURGSIM_LOG_INFO(m_logger) << "Constraint [" << constraint << "] of type " << getMlcpConstraintTypeName(constraintsType[constraint]) << std::endl << "\t with initial violation b=(" << b.segment<2>(currentAtomicIndex).transpose() << ") " << std::endl << "\t with final violation b-Ax=(" << violation.transpose() << ")" << std::endl << "\t force=(" << initialGuessAndSolution.segment<2>(currentAtomicIndex).transpose() << ")"; currentAtomicIndex += 2; break; } case MLCP_BILATERAL_3D_CONSTRAINT: { Vector3d violation = b.segment<3>(currentAtomicIndex) + A.block(currentAtomicIndex, 0, 3, problemSize) * initialGuessAndSolution; SURGSIM_LOG_INFO(m_logger) << "Constraint [" << constraint << "] of type " << getMlcpConstraintTypeName(constraintsType[constraint]) << std::endl << "\t with initial violation b=(" << b.segment<3>(currentAtomicIndex).transpose() << ")" << std::endl << "\t with final violation b-Ax=(" << violation.transpose() << ") " << std::endl << "\t force=(" << initialGuessAndSolution.segment<3>(currentAtomicIndex).transpose() << ")"; currentAtomicIndex += 3; break; } case MLCP_UNILATERAL_3D_FRICTIONLESS_CONSTRAINT: { double violation = b[currentAtomicIndex] + A.row(currentAtomicIndex) * initialGuessAndSolution; SURGSIM_LOG_INFO(m_logger) << "Constraint [" << constraint << "] of type " << getMlcpConstraintTypeName(constraintsType[constraint]) << std::endl << "\t with initial violation b=(" << b[currentAtomicIndex] << ") " << std::endl << "\t with final violation b-Ax=(" << violation << ") "; if (violation < -m_contactTolerance) { SURGSIM_LOG_INFO(m_logger) << "\t => normal violation = " << violation << " < -m_contactTolerance => Signorini not verified yet !"; } SURGSIM_LOG_INFO(m_logger) << "\t force=(" << initialGuessAndSolution[currentAtomicIndex] << ")"; currentAtomicIndex += 1; break; } case MLCP_UNILATERAL_3D_FRICTIONAL_CONSTRAINT: { Vector3d violation = b.segment<3>(currentAtomicIndex) + A.block(currentAtomicIndex, 0, 3, problemSize) * initialGuessAndSolution; SURGSIM_LOG_INFO(m_logger) << "Constraint [" << constraint << "] of type " << getMlcpConstraintTypeName(constraintsType[constraint]) << std::endl << "\t with initial violation b=(" << b.segment<3>(currentAtomicIndex).transpose() << ")" << std::endl << "\t with final violation b-Ax=(" << violation.transpose() << ")"; if (violation[0] < -m_contactTolerance) { SURGSIM_LOG_INFO(m_logger) << "\t => normal violation = " << violation[0] << " < -contactTolerance => Signorini not verified yet !"; } SURGSIM_LOG_INFO(m_logger) << "\t force=(" << initialGuessAndSolution.segment<3>(currentAtomicIndex).transpose() << ")"; currentAtomicIndex += 3; break; } case MLCP_BILATERAL_FRICTIONLESS_SLIDING_CONSTRAINT: { Vector2d violation = b.segment<2>(currentAtomicIndex) + A.block(currentAtomicIndex, 0, 2, problemSize) * initialGuessAndSolution; getMlcpConstraintTypeName(constraintsType[constraint]); SURGSIM_LOG_INFO(m_logger) << "Constraint [" << constraint << "] of type " << getMlcpConstraintTypeName(constraintsType[constraint]) << std::endl << "\t with initial violation b=(" << b.segment<2>(currentAtomicIndex).transpose() << ") " << std::endl << "\t with final violation b-Ax=(" << violation.transpose() << ") " << std::endl << "\t force=(" << initialGuessAndSolution.segment<2>(currentAtomicIndex).transpose() << ")"; currentAtomicIndex += 2; break; } case MLCP_BILATERAL_FRICTIONAL_SLIDING_CONSTRAINT: { Vector3d violation = b.segment<3>(currentAtomicIndex) + A.block(currentAtomicIndex, 0, 3, problemSize) * initialGuessAndSolution; SURGSIM_LOG_INFO(m_logger) << "Constraint [" << constraint << "] of type " << getMlcpConstraintTypeName(constraintsType[constraint]) << std::endl << "\t with initial violation b=(" << b.segment<3>(currentAtomicIndex).transpose() << ") " << std::endl << "\t with final violation b-Ax=(" << violation.transpose() << ")" << std::endl << "\t force=(" << initialGuessAndSolution.segment<3>(currentAtomicIndex).transpose() << ")"; currentAtomicIndex += 3; break; } default: break; } } SURGSIM_LOG_INFO(m_logger) << "convergence_criteria=" << convergenceCriteria << " Signorini verified=" << (validSignorini ? "yes" : "NO"); } }; // namespace Math }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Math/MlcpGaussSeidelSolver.h000066400000000000000000000124731277777236100227750ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_MATH_MLCPGAUSSSEIDELSOLVER_H #define SURGSIM_MATH_MLCPGAUSSSEIDELSOLVER_H #include #include "SurgSim/Math/Matrix.h" #include "SurgSim/Math/MlcpProblem.h" #include "SurgSim/Math/MlcpSolver.h" #include "SurgSim/Math/MlcpSolution.h" #include "SurgSim/Math/Vector.h" namespace SurgSim { namespace Framework { class Logger; } namespace Math { /// A solver for mixed LCP problems using the Gauss-Seidel iterative method. /// /// The problem can contain: /// - CONSTRAINT = Bilateral constraint (all atomic, a fixed 3D point=3 atomics independents constraints) /// - CONTACT = Unilateral constraint /// * frictionless => 1 atomic constraint per contact /// * frictional with Coulomb friction (1 mu parameter per contact) => 3 atomic dependent constraints per contact /// (1 directional + 2 tangentials) /// - SUTURING = Sliding constraint for suturing /// * Frictionless suturing constraint => 2 atomic constraints per sliding point /// * Frictional suturing constraint => 3 atomic constraints per sliding point (2 directional + 1 tangential with /// friction on it) => 1 mu parameter per frictional suturing /// /// See e.g.: Duriez, Christian; Dubois, F.; Kheddar, A.; Andriot, C., "Realistic haptic rendering of interacting /// deformable objects in virtual environments," IEEE Transactions on Visualization and Computer Graphics, /// vol.12, no.1, pp.36,47, Jan.-Feb. 2006. class MlcpGaussSeidelSolver : public MlcpSolver { public: /// Constructor. MlcpGaussSeidelSolver(); /// Constructor. /// \param epsilonConvergence The precision. /// \param contactTolerance The contact tolerance. /// \param maxIterations The max iterations. MlcpGaussSeidelSolver(double epsilonConvergence, double contactTolerance, size_t maxIterations); /// Destructor. virtual ~MlcpGaussSeidelSolver(); /// Resolution of a given MLCP (Gauss Seidel iterative solver) /// \param problem The mlcp problem /// \param [out] solution The mlcp solution /// \return true if successfully converged. bool solve(const MlcpProblem& problem, MlcpSolution* solution); /// \return The precision. double getEpsilonConvergence() const; /// Set the precision. /// \param precision The precision. void setEpsilonConvergence(double precision); /// \return The contact tolerance. double getContactTolerance() const; /// Set the contact tolerance. /// \param tolerance The contact tolerance. void setContactTolerance(double tolerance); /// \return The max number of iterations. size_t getMaxIterations() const; /// Set the max number of iterations. /// \param maxIterations The max number of iterations. void setMaxIterations(size_t maxIterations); private: void computeEnforcementSystem(size_t problemSize, const MlcpProblem::Matrix& A, const MlcpProblem::Vector& b, const MlcpSolution::Vector& initialGuessAndSolution, const std::vector& constraintsType, size_t constraintID, size_t matrixEntryForConstraintID); void calculateConvergenceCriteria(size_t problemSize, const MlcpProblem::Matrix& A, const MlcpProblem::Vector& b, const MlcpSolution::Vector& initialGuessAndSolution, const std::vector& constraintsType, double constraintConvergenceCriteria[MLCP_NUM_CONSTRAINT_TYPES], double* convergenceCriteria, bool* validSignorini); void doOneIteration(size_t problemSize, const MlcpProblem::Matrix& A, const MlcpProblem::Vector& b, MlcpSolution::Vector* initialGuessAndSolution, const MlcpProblem::Vector& frictionCoefs, const std::vector& constraintsType, double constraintConvergenceCriteria[MLCP_NUM_CONSTRAINT_TYPES], double* convergenceCriteria, bool* validSignorini); void printViolationsAndConvergence(size_t problemSize, const MlcpProblem::Matrix& A, const MlcpProblem::Vector& b, const MlcpSolution::Vector& initialGuessAndSolution, const std::vector& constraintsType, double convergenceCriteria, bool validSignorini, size_t iterations); /// The precision. double m_epsilonConvergence; /// The contact tolerance. double m_contactTolerance; /// The maximum number of iterations size_t m_maxIterations; /// The number of atomic constraints, aka the system size. size_t m_numEnforcedAtomicConstraints; /// The left-hand side matrix. Matrix m_lhsEnforcedLocalSystem; /// The right-hand side vector. Vector m_rhsEnforcedLocalSystem; /// The logger. std::shared_ptr m_logger; }; }; // namespace Math }; // namespace SurgSim #endif // SURGSIM_MATH_MLCPGAUSSSEIDELSOLVER_H opensurgsim-0.7.0/SurgSim/Math/MlcpProblem.cpp000066400000000000000000000023201277777236100213130ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Math/MlcpProblem.h" namespace SurgSim { namespace Math { MlcpProblem::~MlcpProblem() { } void MlcpProblem::setZero(size_t numDof, size_t numConstraintDof, size_t numConstraints) { A.setZero(numConstraintDof, numConstraintDof); b.setZero(numConstraintDof); mu.setZero(numConstraintDof); constraintTypes.clear(); } MlcpProblem MlcpProblem::Zero(size_t numDof, size_t numConstraintDof, size_t numConstraints) { MlcpProblem result; result.setZero(numDof, numConstraintDof, numConstraints); return result; } } // namespace SurgSim } // namespace Math opensurgsim-0.7.0/SurgSim/Math/MlcpProblem.h000066400000000000000000000132001277777236100207570ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_MATH_MLCPPROBLEM_H #define SURGSIM_MATH_MLCPPROBLEM_H #include #include #include "SurgSim/Math/MlcpConstraintType.h" namespace SurgSim { namespace Math { /// A description of an MLCP (mixed linear complementarity problem, or mixed LCP) system to be solved. /// /// A traditional (not mixed!) LCP problem is expressed as \f$\mathbf{A}x + b = c\f$, where \f$x\f$ is the vector of /// variables of interest to be determined, \f$c\f$ is the vector of slack variables (transforming a system of /// inequalities into a system of equalities), and \f$x\f$ and \f$c\f$ are subject to the inequality conditions /// \f$x_i \ge 0\f$, \f$c_i \ge 0\f$, and \f$x \perp c\f$ (i.e., \f$x \cdot c = 0\f$). /// Thus for each row \f$i\f$, either /// * \f$(\mathbf{A}x+b)_i = \mathbf{A}_{i,*}\cdot x+b_i = c_i \ge 0\f$ and \f$x_i = 0\f$ /// (the constraint is non-binding, so the variable of interest enforcing the constraint is zero); /// or /// * \f$(\mathbf{A}x+b)_i = \mathbf{A}_{i,*}\cdot x+b_i = c_i = 0\f$ and \f$x_i > 0\f$ /// (the constraint is binding, so the variable of interest is nonzero to enforce the constraint). /// /// Solving the problem produces the vector \f$x\f$, from which \f$c\f$ can also be computed if needed. /// /// A mixed LCP problem is defined in the same way, except that for a certain subset of indices, the conditions are /// restricted further to require \f$c_i\f$ to be zero, \f$\mathbf{A}_{i,*}\cdot x+b_i = 0\f$. These are referred to as /// bilateral constraints, as opposed to the unilateral constraints in the LCP problem. /// /// Friction is integrated directly into the problem, using the general approach described e.g. in:
/// Duriez, Christian; Dubois, F.; Kheddar, A.; Andriot, C., "Realistic haptic rendering of interacting /// deformable objects in virtual environments," IEEE Transactions on Visualization and Computer %Graphics, /// vol.12, no.1, pp.36,47, Jan.-Feb. 2006. /// /// \sa SurgSim::Physics::MlcpPhysicsProblem, MlcpSolution, MlcpSolver // // TODO(advornik): Describe the approach to friction in more detail. // TODO(advornik): Get rid of the constraint types and encode necessary info in other ways. struct MlcpProblem { /// Destructor virtual ~MlcpProblem(); typedef Eigen::Matrix Matrix; typedef Eigen::Matrix Vector; /// Matrix \f$\mathbf{A}\f$ used to describe the mixed LCP problem. Matrix A; /// Vector \f$b\f$ used to describe the mixed LCP problem. Vector b; /// A vector of friction coefficients used to describe the mixed LCP problem. /// \todo This API will change in the future to something more independent of physics. Vector mu; /// A vector of constraint types used to describe the mixed LCP problem. /// \todo This API will change in the future to something more independent of physics. std::vector constraintTypes; // NB: We let the compiler generate the default code for the constructor, copy constructor and copy assignment, // because we currently sometimes need to copy the problem (although we ought to minimize this). // The C++11-ish way to indicate that explicitly would be to write code like this: // MlcpProblem() = default; // MlcpProblem(const MlcpProblem& other) = default; // MlcpProblem& operator= (const MlcpProblem& other) = default; // but I haven't yet tested that this works correctly on VS 2010, so I'm just putting in the comment. // We may also want to add move construction and move assignment. --advornik 2013-06-24 /// Gets the size of the system. /// \return the number of degrees of freedom of the system. size_t getSize() const { return (b.rows() >= 0) ? static_cast(b.rows()) : 0; } /// Checks if the sizes of various elements of the system are consistent with each other. /// \return true if consistent, false otherwise. bool isConsistent() const { size_t numConstraintTypes = constraintTypes.size(); return ((b.rows() >= 0) && (b.cols() == 1) && (A.rows() == b.rows()) && (A.cols() == A.rows()) && (numConstraintTypes <= static_cast(b.rows())) && (mu.size() >= 0)); } /// Resize an MlcpProblem and set to zero. /// \param numDof the total degrees of freedom. /// \param numConstraintDof the total constrained degrees of freedom. /// \param numConstraints the number of constraints. virtual void setZero(size_t numDof, size_t numConstraintDof, size_t numConstraints); /// Initialize an MlcpProblem with zero values. /// \param numDof the total degrees of freedom for the MlcpProblem to be constructed. /// \param numConstraintDof the total constrained degrees of freedom for the MlcpProblem to be constructed. /// \param numConstraints the number of constraints for the MlcpProblem to be constructed. /// \return An MlcpProblem appropriately sized and initialized to zero. static MlcpProblem Zero(size_t numDof, size_t numConstraintDof, size_t numConstraints); }; }; // namespace Math }; // namespace SurgSim #endif // SURGSIM_MATH_MLCPPROBLEM_H opensurgsim-0.7.0/SurgSim/Math/MlcpSolution.h000066400000000000000000000054271277777236100212070ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_MATH_MLCPSOLUTION_H #define SURGSIM_MATH_MLCPSOLUTION_H #include #include "SurgSim/Math/MlcpConstraintType.h" namespace SurgSim { namespace Math { /// The description of a solution to a \ref MlcpProblem "mixed linear complementarity problem". /// /// The solution consists of the vector \f$x\f$ and various diagnostic parameters. /// If \f$c = \mathbf{A}x + b\f$ is also needed, it can be computed by the caller. /// /// \sa SurgSim::Physics::MlcpPhysicsSolution, MlcpProblem, MlcpSolver struct MlcpSolution { typedef Eigen::Matrix Vector; /// Vector \f$x\f$ specifying a solution to the specified mixed LCP problem. Vector x; /// The number of iterations performed. size_t numIterations; /// True if the final value of the convergence criteria is valid. bool validConvergence; /// True if the final solution satisfies the Signorini conditions. bool validSignorini; /// The final value of the convergence criteria. double convergenceCriteria; /// The initial value of the convergence criteria, before the solver has done anything. double initialConvergenceCriteria; /// The final value of the convergence criteria for each of the constraint types. double constraintConvergenceCriteria[MLCP_NUM_CONSTRAINT_TYPES]; /// The initial value of the convergence criteria for each of the constraint types. double initialConstraintConvergenceCriteria[MLCP_NUM_CONSTRAINT_TYPES]; // NB: We let the compiler generate the default code for the constructor, copy constructor and copy assignment, // because we currently sometimes need to copy the solution (although we ought to minimize this). // The C++11-ish way to indicate that explicitly would be to write code like this: // MlcpProblem() = default; // MlcpProblem(const MlcpProblem& other) = default; // MlcpProblem& operator= (const MlcpProblem& other) = default; // but I haven't yet tested that this works correctly on VS 2010, so I'm just putting in the comment. // We may also want to add move construction and move assignment. --advornik 2013-06-24 }; }; // namespace Math }; // namespace SurgSim #endif // SURGSIM_MATH_MLCPSOLUTION_H opensurgsim-0.7.0/SurgSim/Math/MlcpSolver.h000066400000000000000000000030541277777236100206370ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_MATH_MLCPSOLVER_H #define SURGSIM_MATH_MLCPSOLVER_H namespace SurgSim { namespace Math { struct MlcpProblem; struct MlcpSolution; /// This class provides a solver interface for mixed linear complementarity problems. /// /// \sa MlcpProblem class MlcpSolver { public: /// Constructor. MlcpSolver() { } // Destructor. virtual ~MlcpSolver() { } /// Attempts to solve the specified MLCP problem. /// \param problem the MLCP problem. /// \param [out] solution the solution to the problem, if available. /// \return true if solved (in which case solution will be set to the solution); false if failed. virtual bool solve(const MlcpProblem& problem, MlcpSolution* solution) = 0; private: /// Prevent copy construction and assignment. MlcpSolver(const MlcpSolver&); MlcpSolver& operator==(const MlcpSolver&); }; }; // namespace Math }; // namespace SurgSim #endif // SURGSIM_MATH_MLCPSOLVER_H opensurgsim-0.7.0/SurgSim/Math/OctreeShape-inl.h000066400000000000000000000017751277777236100215430ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // #ifndef SURGSIM_MATH_OCTREESHAPE_INL_H #define SURGSIM_MATH_OCTREESHAPE_INL_H namespace SurgSim { namespace Math { template OctreeShape::OctreeShape(const SurgSim::DataStructures::OctreeNode& node) : m_rootNode(std::make_shared(node)) { } }; // namespace Math }; // namespace SurgSim #endif // SURGSIM_MATH_OCTREESHAPE_INL_H opensurgsim-0.7.0/SurgSim/Math/OctreeShape.cpp000066400000000000000000000056141277777236100213120ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Math/OctreeShape.h" #include "SurgSim/Framework/Assert.h" #include "SurgSim/Framework/Asset.h" #include "SurgSim/Framework/FrameworkConvert.h" namespace SurgSim { namespace Math { SURGSIM_REGISTER(SurgSim::Math::Shape, SurgSim::Math::OctreeShape, OctreeShape); OctreeShape::OctreeShape() : m_rootNode(std::make_shared()) { SURGSIM_ADD_SERIALIZABLE_PROPERTY( SurgSim::Math::OctreeShape, std::shared_ptr, Octree, getOctree, setOctree); SURGSIM_ADD_SETTER(OctreeShape, std::string, OctreeFileName, loadOctree); } OctreeShape::~OctreeShape() { } int OctreeShape::getType() const { return SHAPE_TYPE_OCTREE; } void OctreeShape::loadOctree(const std::string& filePath) { auto rootNode = std::make_shared(); rootNode->load(filePath); SURGSIM_ASSERT(isValid(rootNode)) << "Loading failed " << filePath << " contains an invalid octree."; setOctree(rootNode); } double OctreeShape::getVolume() const { SURGSIM_FAILURE() << "OctreeShape::getVolume not implemented"; return 0.0; } Vector3d OctreeShape::getCenter() const { return Vector3d::Zero(); } Matrix33d OctreeShape::getSecondMomentOfVolume() const { SURGSIM_FAILURE() << "OctreeShape::getSecondMomentOfVolume not implemented"; return Matrix33d::Zero(); } std::shared_ptr OctreeShape::getOctree() { return m_rootNode; } void OctreeShape::setOctree(std::shared_ptr node) { SURGSIM_ASSERT(node != nullptr) << "Tried to set the shape with a nullptr"; auto octreeNode = std::dynamic_pointer_cast(node); SURGSIM_ASSERT(octreeNode != nullptr) << "OctreeShape needs OctreeNode but received " << node->getClassName(); SURGSIM_ASSERT(isValid(octreeNode)) << "OctreeShape was passed an invalid Octree."; m_rootNode = octreeNode; } bool OctreeShape::isValid(std::shared_ptr node) const { return (nullptr != node) && (node->getBoundingBox().sizes().minCoeff() >= 0); } bool OctreeShape::isValid() const { return isValid(m_rootNode); } const Math::Aabbd& OctreeShape::getBoundingBox() const { if (m_rootNode != nullptr) { return m_rootNode->getBoundingBox(); } else { return m_aabb; } } }; // namespace Math }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Math/OctreeShape.h000066400000000000000000000060321277777236100207520ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_MATH_OCTREESHAPE_H #define SURGSIM_MATH_OCTREESHAPE_H #include "SurgSim/DataStructures/EmptyData.h" #include "SurgSim/DataStructures/OctreeNode.h" #include "SurgSim/Framework/Asset.h" #include "SurgSim/Framework/ObjectFactory.h" #include "SurgSim/Math/Shape.h" namespace SurgSim { namespace Math { SURGSIM_STATIC_REGISTRATION(OctreeShape); /// Octree Shape /// A defined by an octree data structure class OctreeShape : public Shape { public: typedef SurgSim::DataStructures::OctreeNode NodeType; /// Constructor OctreeShape(); SURGSIM_CLASSNAME(SurgSim::Math::OctreeShape); /// Construct an OctreeShape by copying data from an OctreeNode /// NOTE: The Data stored in the octree node will not be copied into the /// OctreeShape. /// \tparam T octree node data structure to build Octree Shape from /// \param node octree node data structure to build Octree Shape from template explicit OctreeShape(const SurgSim::DataStructures::OctreeNode& node); /// Destructor virtual ~OctreeShape(); /// \return the type of shape int getType() const override; /// Get the volume of the shape /// \return The volume of the shape (in m-3) double getVolume() const override; /// Get the volumetric center of the shape /// \return The center of the shape Vector3d getCenter() const override; /// Get the second central moment of the volume, commonly used /// to calculate the moment of inertia matrix /// \return The 3x3 symmetric second moment matrix Matrix33d getSecondMomentOfVolume() const override; /// Get the root node /// \return the octree root node of this shape std::shared_ptr getOctree(); /// Set the root node /// \param node the octree root node of this shape void setOctree(std::shared_ptr node); /// \return True if the bounding box is bigger than or equal to 0; Otherwise, false. bool isValid() const override; void loadOctree(const std::string& filePath); const Math::Aabbd& getBoundingBox() const override; private: /// \param node the OctreeNode to check /// \return True if the bounding box is bigger than or equal to 0; Otherwise, false. bool isValid(std::shared_ptr node) const; /// Root node of the octree datastructure std::shared_ptr m_rootNode; }; }; // Math }; // SurgSim #include "SurgSim/Math/OctreeShape-inl.h" #endif // SURGSIM_MATH_OCTREESHAPE_H opensurgsim-0.7.0/SurgSim/Math/OdeEquation.cpp000066400000000000000000000031101277777236100213120ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Math/OdeEquation.h" #include "SurgSim/Math/OdeState.h" #include "SurgSim/Framework/Log.h" namespace SurgSim { namespace Math { const std::shared_ptr OdeEquation::getInitialState() const { return m_initialState; } const Vector& OdeEquation::getF() const { return m_f; } const SparseMatrix& OdeEquation::getM() const { return m_M; } const SparseMatrix& OdeEquation::getD() const { return m_D; } const SparseMatrix& OdeEquation::getK() const { return m_K; } void OdeEquation::updateFMDK(const OdeState& state, int options) { if (options == ODEEQUATIONUPDATE_FMDK) { computeFMDK(state); } else { if (options & ODEEQUATIONUPDATE_F) { computeF(state); } if (options & ODEEQUATIONUPDATE_M) { computeM(state); } if (options & ODEEQUATIONUPDATE_D) { computeD(state); } if (options & ODEEQUATIONUPDATE_K) { computeK(state); } } } }; // namespace Math }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Math/OdeEquation.h000066400000000000000000000124371277777236100207730ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_MATH_ODEEQUATION_H #define SURGSIM_MATH_ODEEQUATION_H #include #include "SurgSim/Math/SparseMatrix.h" #include "SurgSim/Math/Matrix.h" #include "SurgSim/Math/Vector.h" namespace SurgSim { namespace Math { class OdeState; /// Enum to identify which of the data need to be updated by the OdeEquation::update() enum OdeEquationUpdate { ODEEQUATIONUPDATE_F = 1<<0, ODEEQUATIONUPDATE_M = 1<<1, ODEEQUATIONUPDATE_D = 1<<2, ODEEQUATIONUPDATE_K = 1<<3, ODEEQUATIONUPDATE_FMDK = ODEEQUATIONUPDATE_F | ODEEQUATIONUPDATE_M | ODEEQUATIONUPDATE_D | ODEEQUATIONUPDATE_K }; /// Ode equation of 2nd order of the form \f$M(x,v).a = F(x, v)\f$ with \f$(x0, v0)\f$ for initial conditions /// and a set of boundary conditions. The problem is called a Boundary Value Problem (BVP). /// This ode equation is solved as an ode of order 1 by defining the state vector /// \f$y = \left(\begin{array}{c}x\\v\end{array}\right)\f$: /// \f[ /// y' = \left(\begin{array}{c} x' \\ v' \end{array}\right) = /// \left(\begin{array}{c} v \\ M(x, v)^{-1}.f(t, x, v) \end{array}\right) /// \f] /// \note To allow the use of explicit and implicit solver, we need to be able to evaluate /// \note \f$M(x, v)\f$, \f$f(t, x, v)\f$ but also \f$K = -dF/dx(x, v)\f$ and \f$D = -dF/dv(x, v)\f$ /// \note Models wanting the use of implicit solvers will need to compute these Jacobian matrices. class OdeEquation { public: /// Virtual destructor virtual ~OdeEquation() {} /// Retrieves the ode initial conditions \f$(x0, v0)\f$ (i.e the initial state) /// \return The initial state const std::shared_ptr getInitialState() const; /// Calculate the product C.b where C is the compliance matrix with boundary conditions /// applied. Note that this can be rewritten as (Bt)(M^-1)(B.b) = (Bt)((M^-1)(B.b)) = x, /// where (M^-1)(B.b) = y is simply the solution to M.y = B.b and Bt.y = x. /// \param state \f$(x, v)\f$ the current position and velocity to evaluate the various terms with /// \param b The input matrix /// \return The matrix \f$C.b\f$ virtual Matrix applyCompliance(const OdeState& state, const Matrix& b) = 0; /// Update the OdeEquation (and support data) based on the given state. /// \param state \f$(x, v)\f$ the current position and velocity to evaluate the various terms with /// \param options Flag to specify which of F, M, D, K needs to be updated. virtual void updateFMDK(const OdeState& state, int options); /// \return The vector containing \f$f(x, v)\f$ const Vector& getF() const; /// \return The matrix \f$M(x,v)\f$ const SparseMatrix& getM() const; /// \return The matrix \f$D = -\frac{\partial f}{\partial v}(x,v)\f$ const SparseMatrix& getD() const; /// \return The matrix \f$K = -\frac{\partial f}{\partial x}(x,v)\f$ const SparseMatrix& getK() const; protected: /// Evaluation of the RHS function \f$f(x, v)\f$ for a given state /// \param state \f$(x, v)\f$ the current position and velocity to evaluate the function \f$f(x,v)\f$ with virtual void computeF(const OdeState& state) = 0; /// Evaluation of the LHS matrix \f$M(x,v)\f$ for a given state /// \param state \f$(x, v)\f$ the current position and velocity to evaluate the matrix \f$M(x,v)\f$ with virtual void computeM(const OdeState& state) = 0; /// Evaluation of \f$D = -\frac{\partial f}{\partial v}(x,v)\f$ for a given state /// \param state \f$(x, v)\f$ the current position and velocity to evaluate the Jacobian matrix with virtual void computeD(const OdeState& state) = 0; /// Evaluation of \f$K = -\frac{\partial f}{\partial x}(x,v)\f$ for a given state /// \param state \f$(x, v)\f$ the current position and velocity to evaluate the Jacobian matrix with virtual void computeK(const OdeState& state) = 0; /// Evaluation of \f$f(x,v)\f$, \f$M(x,v)\f$, \f$D = -\frac{\partial f}{\partial v}(x,v)\f$ and /// \f$K = -\frac{\partial f}{\partial x}(x,v)\f$. /// When all the terms are needed, this method can perform optimization in evaluating everything together /// \param state \f$(x, v)\f$ the current position and velocity to evaluate the various terms with /// \note computeF(), computeM(), computeD(), computeK() virtual void computeFMDK(const OdeState& state) = 0; /// The initial state (which defines the ODE initial conditions \f$(x0, v0)\f$) /// \note MUST be set by the derived classes std::shared_ptr m_initialState; /// The vector containing \f$f(x, v)\f$ Vector m_f; /// The matrix \f$M(x,v)\f$ SparseMatrix m_M; /// The The matrix \f$D = -\frac{\partial f}{\partial v}(x,v)\f$ SparseMatrix m_D; /// The The matrix \f$K = -\frac{\partial f}{\partial x}(x,v)\f$ SparseMatrix m_K; }; }; // namespace Math }; // namespace SurgSim #endif // SURGSIM_MATH_ODEEQUATION_H opensurgsim-0.7.0/SurgSim/Math/OdeSolver.cpp000066400000000000000000000043331277777236100210070ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Math/OdeSolver.h" #include "SurgSim/Math/OdeState.h" namespace SurgSim { namespace Math { OdeSolver::OdeSolver(OdeEquation* equation) : m_equation(*equation) { // Default linear solver setLinearSolver(std::make_shared()); } const std::string OdeSolver::getName() const { return m_name; } void OdeSolver::setLinearSolver(std::shared_ptr linearSolver) { m_linearSolver = linearSolver; } std::shared_ptr OdeSolver::getLinearSolver() const { return m_linearSolver; } const SparseMatrix& OdeSolver::getSystemMatrix() const { return m_systemMatrix; } const Matrix& OdeSolver::getComplianceMatrix() const { return m_complianceMatrix; } void OdeSolver::computeMatrices(double dt, const OdeState& state, bool computeCompliance) { /// Compute the system matrix (and discard the RHS calculation) assembleLinearSystem(dt, state, state, false); /// Compute the compliance matrix if (computeCompliance) { computeComplianceMatrixFromSystemMatrix(state); } } void OdeSolver::computeComplianceMatrixFromSystemMatrix(const OdeState& state) { // The compliance matrix is the inverse of the system matrix m_complianceMatrix = m_linearSolver->getInverse(); // The boundary conditions needs to be set on the compliance matrix and no compliance should be used for the nodes // Which means that the compliance matrix has entire rows and columns of zeros for the boundary conditions. state.applyBoundaryConditionsToMatrix(&m_complianceMatrix, false); } }; // namespace Math }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Math/OdeSolver.h000066400000000000000000000163221277777236100204550ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_MATH_ODESOLVER_H #define SURGSIM_MATH_ODESOLVER_H #include #include #include // for 'map_list_of()' #include "SurgSim/Math/LinearSparseSolveAndInverse.h" #include "SurgSim/Math/Matrix.h" #include "SurgSim/Math/OdeEquation.h" namespace SurgSim { namespace Math { /// The diverse numerical integration scheme supported /// Each Ode Solver should have its own entry in this enum enum IntegrationScheme { INTEGRATIONSCHEME_STATIC = 0, INTEGRATIONSCHEME_LINEAR_STATIC, INTEGRATIONSCHEME_EULER_EXPLICIT, INTEGRATIONSCHEME_LINEAR_EULER_EXPLICIT, INTEGRATIONSCHEME_EULER_EXPLICIT_MODIFIED, INTEGRATIONSCHEME_LINEAR_EULER_EXPLICIT_MODIFIED, INTEGRATIONSCHEME_EULER_IMPLICIT, INTEGRATIONSCHEME_LINEAR_EULER_IMPLICIT, INTEGRATIONSCHEME_RUNGE_KUTTA_4, INTEGRATIONSCHEME_LINEAR_RUNGE_KUTTA_4, MAX_INTEGRATIONSCHEMES }; const std::unordered_map> IntegrationSchemeNames = boost::assign::map_list_of (INTEGRATIONSCHEME_STATIC, "INTEGRATIONSCHEME_STATIC") (INTEGRATIONSCHEME_LINEAR_STATIC, "INTEGRATIONSCHEME_LINEAR_STATIC") (INTEGRATIONSCHEME_EULER_EXPLICIT, "INTEGRATIONSCHEME_EULER_EXPLICIT") (INTEGRATIONSCHEME_LINEAR_EULER_EXPLICIT, "INTEGRATIONSCHEME_LINEAR_EULER_EXPLICIT") (INTEGRATIONSCHEME_EULER_EXPLICIT_MODIFIED, "INTEGRATIONSCHEME_EULER_EXPLICIT_MODIFIED") (INTEGRATIONSCHEME_LINEAR_EULER_EXPLICIT_MODIFIED, "INTEGRATIONSCHEME_LINEAR_EULER_EXPLICIT_MODIFIED") (INTEGRATIONSCHEME_EULER_IMPLICIT, "INTEGRATIONSCHEME_EULER_IMPLICIT") (INTEGRATIONSCHEME_LINEAR_EULER_IMPLICIT, "INTEGRATIONSCHEME_LINEAR_EULER_IMPLICIT") (INTEGRATIONSCHEME_RUNGE_KUTTA_4, "INTEGRATIONSCHEME_RUNGE_KUTTA_4") (INTEGRATIONSCHEME_LINEAR_RUNGE_KUTTA_4, "INTEGRATIONSCHEME_LINEAR_RUNGE_KUTTA_4"); /// Base class for all solvers of ode equation of order 2 of the form \f$M(x(t), v(t)).a(t) = f(t, x(t), v(t))\f$.
/// This ode equation is solved as an ode of order 1 by defining the state vector /// \f$y = \left(\begin{array}{c}x\\v\end{array}\right)\f$: /// \f[ /// y' = \left(\begin{array}{c} x' \\ v' \end{array}\right) = /// \left(\begin{array}{c} v \\ M(x, v)^{-1}.f(t, x, v) \end{array}\right) /// \f] /// \note To allow the use of explicit and implicit solver, we need to be able to evaluate: /// \note \f$M(x(t), v(t))\f$ /// \note \f$f(t, x(t), v(t))\f$ but also /// \note \f$K = -\frac{\partial f}{\partial x}(x(t), v(t))\f$ /// \note \f$D = -\frac{\partial f}{\partial v}(x(t), v(t))\f$ /// \note Models wanting the use of implicit solvers will need to compute these Jacobian matrices. /// \note Matrices all have dense storage, but a specialized linear solver can be set per solver. class OdeSolver { public: /// Constructor /// \param equation The ode equation to be solved explicit OdeSolver(OdeEquation* equation); /// Virtual destructor virtual ~OdeSolver() {} /// Gets the solver's name /// \return The solver name const std::string getName() const; /// Sets the specialized linear solver to use with this Ode solver /// \param linearSolver the linear solver to use when solving the ode equation void setLinearSolver(std::shared_ptr linearSolver); /// Gets the specialized linear solver used with this Ode solver /// \return The linear solver used when solving the ode equation std::shared_ptr getLinearSolver() const; /// Solves the equation /// \param dt The time step /// \param currentState State at time t /// \param[out] newState State at time t+dt /// \param computeCompliance True to explicitly compute the compliance matrix, False otherwise virtual void solve(double dt, const OdeState& currentState, OdeState* newState, bool computeCompliance = true) = 0; /// Computes the system and compliance matrices for a given state /// \param dt The time step /// \param state The state to compute the system and compliance matrices for /// \param computeCompliance True to explicitly compute the compliance matrix, False otherwise void computeMatrices(double dt, const OdeState& state, bool computeCompliance = true); /// Queries the current system matrix /// \return The latest system matrix calculated const SparseMatrix& getSystemMatrix() const; /// \return The latest compliance matrix computed (either by calling solve or computeMatrices) const Matrix& getComplianceMatrix() const; protected: /// Assemble the linear system (A.x=b) to be solved for the state and new states (useful for certain ode solver). /// \param dt The time step used in the system /// \param state, newState The state and newState to be used to evaluate the system /// \param computeRHS True to compute the RHS vector, False otherwise /// \note The method should fill up the LHS matrix in m_systemMatrix and the RHS vector in m_b (if requested) /// \note The method should take care of the boundary conditions properly on both the matrix and the vector. /// \note The method should prepare the linear solver m_linearSolver to be used with the m_systemMatrix virtual void assembleLinearSystem(double dt, const OdeState& state, const OdeState& newState, bool computeRHS = true) = 0; /// Helper method computing the compliance matrix from the system matrix and setting the boundary conditions /// \param state The state describing the boundary conditions /// \note The full system is not re-evaluated from the state, the current m_systemMatrix is directly used. /// \note This method supposes that the linear solver has been updated with the current m_systemMatrix. void computeComplianceMatrixFromSystemMatrix(const OdeState& state); /// Name for this solver /// \note MUST be set by the derived classes std::string m_name; /// The ode equation (API providing the necessary evaluation methods and the initial state) OdeEquation& m_equation; /// The specialized linear solver to use when solving the ode equation std::shared_ptr m_linearSolver; /// Linear system matrix (can be M, K, combination of MDK depending on the solver), including boundary conditions /// \note A static solver will have K for system matrix /// \note A dynamic explicit solver will have M for system matrix /// \note A dynamic implicit solver will have a combination of M, D and K for system matrix SparseMatrix m_systemMatrix; /// Linear system solution and rhs vectors (including boundary conditions) Vector m_solution, m_rhs; /// Compliance matrix which is the inverse of the system matrix, including boundary conditions Matrix m_complianceMatrix; }; }; // namespace Math }; // namespace SurgSim #endif // SURGSIM_MATH_ODESOLVER_H opensurgsim-0.7.0/SurgSim/Math/OdeSolverEulerExplicit.cpp000066400000000000000000000057361277777236100235160ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Math/OdeSolverEulerExplicit.h" #include "SurgSim/Math/OdeState.h" namespace SurgSim { namespace Math { OdeSolverEulerExplicit::OdeSolverEulerExplicit(OdeEquation* equation) : OdeSolver(equation) { m_name = "Ode Solver Euler Explicit"; } void OdeSolverEulerExplicit::solve(double dt, const OdeState& currentState, OdeState* newState, bool computeCompliance) { // General equation to solve: // M.a(t) = f(t, x(t), v(t)) // Using Euler explicit { v(t+dt) = v(t) + dt.a(t) // { x(t+dt) = x(t) + dt.v(t) // The resulting linear system on the velocity level is: // (M/dt) . deltaV = f(t, x(t), v(t)) // systemMatrix . solution = rhs // Therefore, systemMatrix = M/dt, solution = deltaV and rhs = f // Assemble the linear system systemMatrix.solution = rhs assembleLinearSystem(dt, currentState, *newState); // Solve the linear system to find solution = deltaV m_solution = m_linearSolver->solve(m_rhs); // Compute the new state using the Euler Explicit scheme: newState->getPositions() = currentState.getPositions() + dt * currentState.getVelocities(); newState->getVelocities() = currentState.getVelocities() + m_solution; if (computeCompliance) { computeComplianceMatrixFromSystemMatrix(currentState); } } void OdeSolverEulerExplicit::assembleLinearSystem(double dt, const OdeState& state, const OdeState& newState, bool computeRHS) { // General equation to solve: // M.a(t) = f(t, x(t), v(t)) // Using Euler explicit { v(t+dt) = v(t) + dt.a(t) // { x(t+dt) = x(t) + dt.v(t) // The resulting linear system on the velocity level is: // (M/dt) . deltaV = f(t, x(t), v(t)) // systemMatrix . solution = rhs // Therefore, systemMatrix = M/dt, solution = deltaV and rhs = f // Update the stiffness matrix m_equation.updateFMDK(state, ODEEQUATIONUPDATE_F | ODEEQUATIONUPDATE_M); // Computes the LHS systemMatrix m_systemMatrix = m_equation.getM() / dt; state.applyBoundaryConditionsToMatrix(&m_systemMatrix); // Feed the systemMatrix to the linear solver, so it can be used after this call to solve or inverse the matrix m_linearSolver->setMatrix(m_systemMatrix); // Computes the RHS vector if (computeRHS) { m_rhs = m_equation.getF(); state.applyBoundaryConditionsToVector(&m_rhs); } } }; // namespace Math }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Math/OdeSolverEulerExplicit.h000066400000000000000000000047331277777236100231570ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_MATH_ODESOLVEREULEREXPLICIT_H #define SURGSIM_MATH_ODESOLVEREULEREXPLICIT_H #include "SurgSim/Math/OdeSolver.h" namespace SurgSim { namespace Math { /// Euler Explicit ode solver solves the following \f$2^{nd}\f$ order ode /// \f$M(x(t), v(t)).a(t) = f(t, x(t), v(t))\f$. /// This ode is solved as an ode of order 1 by defining the state vector /// \f$y = \left(\begin{array}{c}x\\v\end{array}\right)\f$: /// \f[ /// y' = \left(\begin{array}{c} x' \\ v' \end{array}\right) = /// \left(\begin{array}{c} v \\ M(x, v)^{-1}.f(t,x, v) \end{array}\right) = /// f(t, y) /// \f] /// After integrating this equation, we get: /// \f[ y(t+dt) - y(t) = \int_t^{t+dt} f(t,y) dt \f] /// \note Euler explicit uses a rectangular numerical integration on the left to evaluate this integral, leading to /// \f$ \int_t^{t+dt} f(t,y) dt \simeq dt.f(t, y(t))\f$, therefore: /// \f[ /// \begin{array}{ccc} /// y(t+dt) - y(t) = dt.f(t, y(t)) /// & /// \Leftrightarrow /// & /// \left\{ /// \begin{array}{ccccl} /// x(t+dt) &=& x(t) &+& dt.v(t) /// \\ v(t+dt) &=& v(t) &+& dt.a(t) /// \end{array} /// \right. /// \end{array} /// \f] /// \note Euler Explicit is also known as forward Euler as it uses a forward evaluation of the derivative /// \f$y' = (y(t+dt) - y(t)) / dt\f$ which leads to the same result. class OdeSolverEulerExplicit : public OdeSolver { public: /// Constructor /// \param equation The ode equation to be solved explicit OdeSolverEulerExplicit(OdeEquation* equation); void solve(double dt, const OdeState& currentState, OdeState* newState, bool computeCompliance = true) override; protected: void assembleLinearSystem(double dt, const OdeState& state, const OdeState& newState, bool computeRHS = true) override; }; }; // namespace Math }; // namespace SurgSim #endif // SURGSIM_MATH_ODESOLVEREULEREXPLICIT_H opensurgsim-0.7.0/SurgSim/Math/OdeSolverEulerExplicitModified.cpp000066400000000000000000000057701277777236100251550ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Math/OdeSolverEulerExplicitModified.h" #include "SurgSim/Math/OdeState.h" namespace SurgSim { namespace Math { OdeSolverEulerExplicitModified::OdeSolverEulerExplicitModified(OdeEquation* equation) : OdeSolver(equation) { m_name = "Ode Solver Euler Explicit Modified"; } void OdeSolverEulerExplicitModified::solve(double dt, const OdeState& currentState, OdeState* newState, bool computeCompliance) { // General equation to solve: // M.a(t) = f(t, x(t), v(t)) // Using Euler explicit { v(t+dt) = v(t) + dt.a(t) // { x(t+dt) = x(t) + dt.v(t+dt) // The resulting linear system on the velocity level is: // (M/dt) . deltaV = f(t, x(t), v(t)) // systemMatrix . solution = rhs // Therefore, systemMatrix = M/dt, solution = deltaV and rhs = f // Assemble the linear system systemMatrix.solution = rhs assembleLinearSystem(dt, currentState, *newState); // Solve the linear system to find solution = deltaV m_solution = m_linearSolver->solve(m_rhs); // Compute the new state using the Modified Euler Explicit scheme: newState->getVelocities() = currentState.getVelocities() + m_solution; newState->getPositions() = currentState.getPositions() + dt * newState->getVelocities(); if (computeCompliance) { computeComplianceMatrixFromSystemMatrix(currentState); } } void OdeSolverEulerExplicitModified::assembleLinearSystem(double dt, const OdeState& state, const OdeState& newState, bool computeRHS) { // General equation to solve: // M.a(t) = f(t, x(t), v(t)) // Using Euler explicit { v(t+dt) = v(t) + dt.a(t) // { x(t+dt) = x(t) + dt.v(t) // The resulting linear system on the velocity level is: // (M/dt) . deltaV = f(t, x(t), v(t)) // systemMatrix . x = b // Therefore, systemMatrix = M/dt, x = deltaV and b = f m_equation.updateFMDK(state, ODEEQUATIONUPDATE_F | ODEEQUATIONUPDATE_M); // Computes the LHS systemMatrix m_systemMatrix = m_equation.getM() / dt; state.applyBoundaryConditionsToMatrix(&m_systemMatrix); // Feed the systemMatrix to the linear solver, so it can be used after this call to solve or inverse the matrix m_linearSolver->setMatrix(m_systemMatrix); // Computes the RHS vector if (computeRHS) { m_rhs = m_equation.getF(); state.applyBoundaryConditionsToVector(&m_rhs); } } }; // namespace Math }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Math/OdeSolverEulerExplicitModified.h000066400000000000000000000050271277777236100246150ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_MATH_ODESOLVEREULEREXPLICITMODIFIED_H #define SURGSIM_MATH_ODESOLVEREULEREXPLICITMODIFIED_H #include "SurgSim/Math/OdeSolver.h" namespace SurgSim { namespace Math { /// Modified Euler Explicit ode solver solves the following \f$2^{nd}\f$ order ode /// \f$M(x(t), v(t)).a(t) = f(t, x(t), v(t))\f$. /// This ode is solved as an ode of order 1 by defining the state vector /// \f$y = \left(\begin{array}{c}x\\v\end{array}\right)\f$: /// \f[ /// y' = \left(\begin{array}{c} x' \\ v' \end{array}\right) = /// \left(\begin{array}{c} v \\ M(x, v)^{-1}.f(t,x, v) \end{array}\right) = /// f(t, y) /// \f] /// After integrating this equation, we get: /// \f[ y(t+dt) - y(t) = \int_t^{t+dt} f(t,y) dt \f] /// \note The modified Euler explicit is the same as Euler explicit, but simply using the newly calculated velocity /// to update the position with instead of using the velocity from the previous time-step. /// \note This makes this solver explicit on the velocity and implicit on the position, it improves the stability /// of the method compare to the Euler explicit but is still an explicit method. /// \note The numerical integration scheme becomes: /// \f[ /// \left\{ /// \begin{array}{ccccl} /// x(t+dt) &=& x(t) &+& dt.v(t+dt) /// \\ v(t+dt) &=& v(t) &+& dt.a(t) /// \end{array} /// \right. /// \f] /// \sa OdeSolverEulerExplicit class OdeSolverEulerExplicitModified : public OdeSolver { public: /// Constructor /// \param equation The ode equation to be solved explicit OdeSolverEulerExplicitModified(OdeEquation* equation); void solve(double dt, const OdeState& currentState, OdeState* newState, bool computeCompliance = true) override; protected: void assembleLinearSystem(double dt, const OdeState& state, const OdeState& newState, bool computeRHS = true) override; }; }; // namespace Math }; // namespace SurgSim #endif // SURGSIM_MATH_ODESOLVEREULEREXPLICITMODIFIED_H opensurgsim-0.7.0/SurgSim/Math/OdeSolverEulerImplicit.cpp000066400000000000000000000140701277777236100234760ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Math/OdeSolverEulerImplicit.h" #include "SurgSim/Math/OdeState.h" namespace SurgSim { namespace Math { OdeSolverEulerImplicit::OdeSolverEulerImplicit(OdeEquation* equation) : OdeSolver(equation), m_maximumIteration(1), m_epsilonConvergence(1e-5) { m_name = "Ode Solver Euler Implicit"; } void OdeSolverEulerImplicit::setNewtonRaphsonMaximumIteration(size_t maximumIteration) { SURGSIM_ASSERT(maximumIteration >= 1) << "The maximum iteration needs to be at least 1"; m_maximumIteration = maximumIteration; } size_t OdeSolverEulerImplicit::getNewtonRaphsonMaximumIteration() const { return m_maximumIteration; } void OdeSolverEulerImplicit::setNewtonRaphsonEpsilonConvergence(double epsilonConvergence) { SURGSIM_ASSERT(epsilonConvergence >= 0.0) << "The epsilon convergence cannot be negative"; m_epsilonConvergence = epsilonConvergence; } double OdeSolverEulerImplicit::getNewtonRaphsonEpsilonConvergence() const { return m_epsilonConvergence; } void OdeSolverEulerImplicit::solve(double dt, const OdeState& currentState, OdeState* newState, bool computeCompliance) { // General equation to solve: // M.a(t+dt) = f(t+dt, x(t+dt), v(t+dt)) // Let's note K = -df/dx and D = -df/dv. // Using Euler implicit { v(t+dt) = v(t) + dt.a(t+dt) // { x(t+dt) = x(t) + dt.v(t+dt) // For a single linearization, we get the following linear system: // M/dt.deltaV = f(t, x(t), v(t)) - K.deltaX - D.deltaV // (M/dt + D + dt.K) . deltaV = f(t, x(t), v(t)) - dt.K.v(t) // systemMatrix . solution = rhs // Therefore systemMatrix = (M/dt + D + dt.K), solution = deltaV, rhs = f - dt.K.v(t) // More terms are coming from the Newton-Raphson iterations (see class OdeSolverEulerImplicit doxygen doc for // more details) // Note that the resulting system is non-linear as K and D are non-linear in absence of information on the nature // of the model. We use a Newton-Raphson algorithm (http://en.wikipedia.org/wiki/Newton%27s_method) to solve // this non-linear problem. Note that each iteration will re-evaluate the complete system (forces and matrices). // Also note that this method converges quadratically around the root. In our case, the solution is deltaV, which // should be close to 0. This makes our problem well suited for this method. if (m_maximumIteration > 1) { m_previousSolution = Vector::Zero(currentState.getNumDof()); } // Prepare the newState to be used in the loop, it starts as the current state. *newState = currentState; // See the class doxygen documentation (.dox) for explanation of the algorithm. // * currentState is y(t) = (x(t), v(t)). // * newState is the current estimate, y_n = (x_n, v_n) (with y_0 = y(t)) // * Each iteration search for the next estimate y_{n+1} = (x_{n+1}, v_{n+1}). size_t numIteration = 0; while (numIteration < m_maximumIteration) { // Assemble the linear system systemMatrix*solution = rhs assembleLinearSystem(dt, currentState, *newState); // Solve the linear system to find solution = deltaV m_solution = m_linearSolver->solve(m_rhs); // Compute the new state using the Euler Implicit scheme: newState->getVelocities() += m_solution; newState->getPositions() = currentState.getPositions() + dt * newState->getVelocities(); if (m_maximumIteration > 1) { // Use the infinity norm, to treat models with small or large number of dof the same way. double solutionVariation = (m_solution - m_previousSolution).lpNorm(); if (solutionVariation < m_epsilonConvergence) { break; } m_previousSolution = m_solution; } numIteration++; } // The compliance matrix (if requested) is computed w.r.t. the latest state. if (computeCompliance) { computeComplianceMatrixFromSystemMatrix(currentState); } } void OdeSolverEulerImplicit::assembleLinearSystem(double dt, const OdeState& state, const OdeState& newState, bool computeRHS) { // General equation to solve: // M.a(t+dt) = f(t+dt, x(t+dt), v(t+dt)) // Let's note K = -df/dx and D = -df/dv. // Using Euler implicit { v(t+dt) = v(t) + dt.a(t+dt) // { x(t+dt) = x(t) + dt.v(t+dt) // For a single linearization, we get the following linear system: // M/dt.deltaV = f(t, x(t), v(t)) - K.deltaX - D.deltaV // (M/dt + D + dt.K) . deltaV = f(t, x(t), v(t)) - dt.K.v(t) // systemMatrix . solution = rhs // Therefore systemMatrix = (M/dt + D + dt.K), solution = deltaV, rhs = f - dt.K.v(t) // More terms are coming from the Newton-Raphson iterations (see class OdeSolverEulerImplicit doxygen doc for // more details) m_equation.updateFMDK(newState, ODEEQUATIONUPDATE_FMDK); const SparseMatrix& M = m_equation.getM(); const SparseMatrix& D = m_equation.getD(); const SparseMatrix& K = m_equation.getK(); const Vector& f = m_equation.getF(); // Computes the LHS systemMatrix m_systemMatrix = M * (1.0 / dt); m_systemMatrix += D; m_systemMatrix += K * dt; state.applyBoundaryConditionsToMatrix(&m_systemMatrix); // Feed the systemMatrix to the linear solver, so it can be used after this call to solve or inverse the matrix m_linearSolver->setMatrix(m_systemMatrix); // Computes the RHS vector by adding the Euler Implicit/Newton-Raphson terms if (computeRHS) { m_rhs = f + K * (newState.getPositions() - state.getPositions() - newState.getVelocities() * dt); m_rhs -= (M * (newState.getVelocities() - state.getVelocities())) / dt; state.applyBoundaryConditionsToVector(&m_rhs); } } }; // namespace Math }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Math/OdeSolverEulerImplicit.dox000066400000000000000000000111331277777236100235030ustar00rootroot00000000000000/*! \class SurgSim::Math::OdeSolverEulerImplicit The ODE to be solved is of the form: \f[ \displaystyle M.a(t) = f(t, x(t), v(t)) \f] \note \f$f\f$ is supposed to be continuous with partial derivatives \f$\displaystyle\frac{\partial f}{\partial x} = -K\f$ and \f$\displaystyle\frac{\partial f}{\partial v} = -D\f$.
\note Also, we define the system matrix \f$\displaystyle S = \frac{M}{dt} + D + dt.K\f$. ODE of order 1
This ODE is solved as an ODE of order 1 by defining the state vector \f$y = \left(\begin{array}{c} x \\ v \end{array}\right)\f$: \f[ \displaystyle y' = \left(\begin{array}{c} x' \\ v' \end{array}\right) = \left(\begin{array}{c} v \\ M^{-1}.f(t, x, v) \end{array}\right) = f(t, y) \f] Integrating this equation gives: \f[ \displaystyle y(t+dt) - y(t) = \int_{t}^{t+dt} f(t, y) dt \f] Backward Euler to numerically integrate the ODE
Euler Implicit uses a rectangular numerical integration evaluated on the right: \f$\int_{t}^{t+dt} f(t, y) dt \simeq dt. f(t+dt, y(t+dt))\f$. Unlike Explicit Euler (a.k.a. forward Euler) which uses a rectangular numerical integration evaluated on the left: \f$\int_{t}^{t+dt} f(t, y) dt \simeq dt. f(t, y(t))\f$.
Euler implicit is also called backward Euler because the tangent evaluation is numerically evaluated using a backward evaluation: \f$y'(t) = (y(t) - y(t-dt)) / dt\f$ which leads to the well known integration scheme (written using the state vector \f$y\f$ or the variables \f$x\f$ and \f$v\f$: \f[ \begin{array}{ccc} y(t+dt) = y(t) + dt. f(t+dt, y(t+dt)) & or & \left\{ \begin{array}{ccccl} x(t+dt) &=& x(t) &+& dt.v(t+dt) \\ v(t+dt) &=& v(t) &+& dt.M^{-1}.f(t+dt, x(t+dt), v(t+dt)) \end{array} \right. \end{array} \f] This system of equations is non-linear w.r.t. to the unknown \f$y(t+dt)\f$. Newton-Raphson to solve the non-linear resulting equations
We use Newton-Raphson to solve this non-liner problem http://en.wikipedia.org/wiki/Newton%27s_method. Let's pose the non-linear problem to solve as: \f[ F(y) = y - y(t) - dt.f(t+dt, y) = 0 \f] The solution to this non-linear equation is \f$y(t+dt)\f$. The Newton-Raphson algorithm iteratively calculates a series of state \f$y_n\f$ converging to the solution \f$y(t+dt)\f$ (if the problem has a solution and the initial solution is close enough).
Each iteration computes: \f[ y_{n+1} = y_{n} - \frac{\partial F}{\partial y}(y_{n})^{-1} F(y_{n}) \f] where \f$y_n = \left(\begin{array}{c}x_n\\v_n\end{array}\right)\f$ and \f$y_{n+1} = \left(\begin{array}{c}x_{n+1}\\v_{n+1}\end{array}\right)\f$ are 2 successive approximations of the solution. They are neither \f$y(t) = \left(\begin{array}{c}x(t)\\v(t)\end{array}\right)\f$ nor the solution \f$y(t+dt) = \left(\begin{array}{c}x(t+dt)\\v(t+dt)\end{array}\right)\f$. Except on the very first iteration where \f$y_0 = y(t)\f$. \note The initial solution \f$y_0\f$ is set to be \f$y(t)\f$ as it is the latest solution and should by nature be close to the solution \f$y(t+dt)\f$. \note Therefore, on the first iteration, \f$F(y_0)\f$ will evaluate to exactly \f$-dt.f(t+dt, y(t))\f$ which is the force evaluation from the previous time step. \f[ \frac{\partial F}{\partial y} = \left( I - dt.\frac{\partial f}{\partial y}\right) = \left( \begin{array}{cc} I & -dt.I \\ dt.M^{-1}K & I + dt.M^{-1}D \end{array} \right) \f] It can be easily shown using a Gauss pivot technique that the inverse is: \f[ \frac{\partial F}{\partial y}^{-1} = \left( \begin{array}{cc} I - dt.S^{-1}K & S^{-1}M \\ -S^{-1}K & \frac{S^{-1}M}{dt} \end{array} \right) \f] Therefore, we can formally develop the solution: \f[ y_{n+1} = \left\{ \begin{array}{ccccl} x_{n+1} &=& x_n &-& \left[\left(I - dt.S^{-1}K\right).\left(x_n - x(t) - dt.v_n\right) + S^{-1}M.\left(v_n - v(t) - dt.M^{-1}.f(x_n, v_n)\right)\right] \\ &=& x_n &-& x_n + x(t) + dt.v_n + dt.S^{-1}K\left(x_n - x(t) - dt.v_n\right) - S^{-1}M.\left(v_n - v(t) - dt.M^{-1}.f(x_n, v_n)\right) \\ &=& x(t) &+& dt.\left[v_n + S^{-1}\left(f(x_n, v_n) + K(x_n - x(t) - dt.v_n) - \frac{M}{dt}(v_n - v(t))\right)\right] \\ &=& x(t) &+& dt.v_{n+1} \\ v_{n+1} &=& v_n &-& \left[-S^{-1}K.\left(x_n - x(t) - dt.v_n\right) + \frac{S^{-1}M}{dt}.\left(v_n - v(t) - dt.M^{-1}.f(x_n, v_n)\right)\right] \\ &=& v_n &+& S^{-1}\left(f(x_n, v_n) + K(x_n - x(t) - dt.v_n) - \frac{M}{dt}(v_n - v(t)) \right) \end{array} \right. \f] We simply need to solve the system to find the velocity variation and we can deduct the new position from there. */ opensurgsim-0.7.0/SurgSim/Math/OdeSolverEulerImplicit.h000066400000000000000000000044511277777236100231450ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_MATH_ODESOLVEREULERIMPLICIT_H #define SURGSIM_MATH_ODESOLVEREULERIMPLICIT_H #include "SurgSim/Math/OdeSolver.h" namespace SurgSim { namespace Math { /// Euler implicit (a.k.a backward Euler) ode solver (see %OdeSolverEulerImplicit.dox for more details). class OdeSolverEulerImplicit : public OdeSolver { public: /// Constructor /// \param equation The ode equation to be solved explicit OdeSolverEulerImplicit(OdeEquation* equation); /// \param maximumIteration The Newton-Raphson algorithm maximum number of iterations virtual void setNewtonRaphsonMaximumIteration(size_t maximumIteration); /// \return The Newton-Raphson algorithm maximum number of iterations size_t getNewtonRaphsonMaximumIteration() const; /// \param epsilonConvergence The Newton-Raphson algorithm epsilon convergence void setNewtonRaphsonEpsilonConvergence(double epsilonConvergence); /// \return The Newton-Raphson algorithm epsilon convergence double getNewtonRaphsonEpsilonConvergence() const; void solve(double dt, const OdeState& currentState, OdeState* newState, bool computeCompliance = true) override; protected: void assembleLinearSystem(double dt, const OdeState& state, const OdeState& newState, bool computeRHS = true) override; /// Newton-Raphson maximum number of iteration (1 => linearization) size_t m_maximumIteration; /// Newton-Raphson convergence criteria (variation of the solution over time) double m_epsilonConvergence; /// Newton-Raphson previous solution (we solve a problem to find deltaV, the variation in velocity) Vector m_previousSolution; }; }; // namespace Math }; // namespace SurgSim #endif // SURGSIM_MATH_ODESOLVEREULERIMPLICIT_H opensurgsim-0.7.0/SurgSim/Math/OdeSolverLinearEulerExplicit.cpp000066400000000000000000000032751277777236100246450ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Math/OdeSolverLinearEulerExplicit.h" #include "SurgSim/Math/OdeState.h" namespace SurgSim { namespace Math { OdeSolverLinearEulerExplicit::OdeSolverLinearEulerExplicit(OdeEquation* equation) : OdeSolverEulerExplicit(equation), m_initialized(false) { m_name = "Ode Solver Linear Euler Explicit"; } void OdeSolverLinearEulerExplicit::solve(double dt, const OdeState& currentState, OdeState* newState, bool computeCompliance) { if (!m_initialized) { // The compliance matrix is constant and used in all following calls, so we force its calculation on 1st pass. OdeSolverEulerExplicit::solve(dt, currentState, newState, true); m_initialized = true; } else { m_equation.updateFMDK(currentState, ODEEQUATIONUPDATE_F); const Vector& f = m_equation.getF(); Vector deltaV = m_equation.applyCompliance(currentState, f); newState->getPositions() = currentState.getPositions() + dt * currentState.getVelocities(); newState->getVelocities() = currentState.getVelocities() + deltaV; } } }; // namespace Math }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Math/OdeSolverLinearEulerExplicit.h000066400000000000000000000033031277777236100243020ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_MATH_ODESOLVERLINEAREULEREXPLICIT_H #define SURGSIM_MATH_ODESOLVERLINEAREULEREXPLICIT_H #include "SurgSim/Math/OdeSolverEulerExplicit.h" namespace SurgSim { namespace Math { /// Linear Version of the Euler Explicit ode solver /// This solver assumes that the system is linear, /// ie that Mass, Damping, and Stiffness matrices do not change. class OdeSolverLinearEulerExplicit : public OdeSolverEulerExplicit { public: /// Constructor /// \param equation The ode equation to be solved explicit OdeSolverLinearEulerExplicit(OdeEquation* equation); /// The parameter computeCompliance is irrelevant for any Linear solver as it is a constant matrix. /// It will be precomputed on the first call and use in the following calls, no matter what the parameter value is. void solve(double dt, const OdeState& currentState, OdeState* newState, bool computeCompliance = true) override; private: /// Has the solver been initialized bool m_initialized; }; }; // namespace Math }; // namespace SurgSim #endif // SURGSIM_MATH_ODESOLVERLINEAREULEREXPLICIT_H opensurgsim-0.7.0/SurgSim/Math/OdeSolverLinearEulerExplicitModified.cpp000066400000000000000000000033631277777236100263040ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Math/OdeSolverLinearEulerExplicitModified.h" #include "SurgSim/Math/OdeState.h" namespace SurgSim { namespace Math { OdeSolverLinearEulerExplicitModified::OdeSolverLinearEulerExplicitModified(OdeEquation* equation) : OdeSolverEulerExplicitModified(equation), m_initialized(false) { m_name = "Ode Solver Linear Euler Explicit Modified"; } void OdeSolverLinearEulerExplicitModified::solve(double dt, const OdeState& currentState, OdeState* newState, bool computeCompliance) { if (!m_initialized) { // The compliance matrix is constant and used in all following calls, so we force its calculation on 1st pass. OdeSolverEulerExplicitModified::solve(dt, currentState, newState, true); m_initialized = true; } else { m_equation.updateFMDK(currentState, ODEEQUATIONUPDATE_F); const Vector& f = m_equation.getF(); Vector deltaV = m_equation.applyCompliance(currentState, f); newState->getVelocities() = currentState.getVelocities() + deltaV; newState->getPositions() = currentState.getPositions() + dt * newState->getVelocities(); } } }; // namespace Math }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Math/OdeSolverLinearEulerExplicitModified.h000066400000000000000000000034041277777236100257450ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_MATH_ODESOLVERLINEAREULEREXPLICITMODIFIED_H #define SURGSIM_MATH_ODESOLVERLINEAREULEREXPLICITMODIFIED_H #include "SurgSim/Math/OdeSolverEulerExplicitModified.h" namespace SurgSim { namespace Math { /// Linear Version of the Modified Euler Explicit ode solver /// This solver assumes that the system is linear, /// ie that Mass, Damping, and Stiffness matrices do not change. class OdeSolverLinearEulerExplicitModified : public OdeSolverEulerExplicitModified { public: /// Constructor /// \param equation The ode equation to be solved explicit OdeSolverLinearEulerExplicitModified(OdeEquation* equation); /// The parameter computeCompliance is irrelevant for any Linear solver as it is a constant matrix. /// It will be precomputed on the first call and use in the following calls, no matter what the parameter value is. void solve(double dt, const OdeState& currentState, OdeState* newState, bool computeCompliance = true) override; private: /// Has the solver been initialized bool m_initialized; }; }; // namespace Math }; // namespace SurgSim #endif // SURGSIM_MATH_ODESOLVERLINEAREULEREXPLICITMODIFIED_H opensurgsim-0.7.0/SurgSim/Math/OdeSolverLinearEulerImplicit.cpp000066400000000000000000000046241277777236100246350ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Framework/Log.h" #include "SurgSim/Math/OdeSolverLinearEulerImplicit.h" #include "SurgSim/Math/OdeState.h" namespace SurgSim { namespace Math { OdeSolverLinearEulerImplicit::OdeSolverLinearEulerImplicit(OdeEquation* equation) : OdeSolverEulerImplicit(equation), m_initialized(false) { m_name = "Ode Solver Linear Euler Implicit"; // The system being linear, only 1 iteration is necessary to find the exact solution. setNewtonRaphsonMaximumIteration(1); } void OdeSolverLinearEulerImplicit::setNewtonRaphsonMaximumIteration(size_t maximumIteration) { OdeSolverEulerImplicit::setNewtonRaphsonMaximumIteration(maximumIteration); SURGSIM_LOG_IF(maximumIteration != 1, SurgSim::Framework::Logger::getLogger("OdeSolver"), WARNING) << "OdeSolverLinearEulerImplicit should have a maximum number of iteration of 1 for the Newton-Raphson. " << "As the model is (supposed to be) linear, a single iteration will find the exact solution."; } void OdeSolverLinearEulerImplicit::solve(double dt, const OdeState& currentState, OdeState* newState, bool computeCompliance) { if (!m_initialized) { // The compliance matrix is constant and used in all following calls, so we force its calculation on 1st pass. OdeSolverEulerImplicit::solve(dt, currentState, newState, true); m_constantK = m_equation.getK(); m_initialized = true; } else { m_equation.updateFMDK(currentState, ODEEQUATIONUPDATE_F); Vector f = m_equation.getF(); f -= m_constantK * (currentState.getVelocities() * dt); Vector deltaV = m_equation.applyCompliance(currentState, f); newState->getVelocities() = currentState.getVelocities() + deltaV; newState->getPositions() = currentState.getPositions() + dt * newState->getVelocities(); } } }; // namespace Math }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Math/OdeSolverLinearEulerImplicit.h000066400000000000000000000041611277777236100242760ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_MATH_ODESOLVERLINEAREULERIMPLICIT_H #define SURGSIM_MATH_ODESOLVERLINEAREULERIMPLICIT_H #include "SurgSim/Math/OdeSolverEulerImplicit.h" #include "SurgSim/Math/SparseMatrix.h" namespace SurgSim { namespace Math { /// Linear Version of the Euler Implicit ode solver /// This solver assumes that the system is linear, /// ie that Mass, Damping, and Stiffness matrices do not change. /// \note If the matrices are all constant, the problem to solve becomes linear, /// \note therefore the Newton-Raphson algorithm will be exact in only 1 iteration. /// \note Therefore this solver uses a number of maximum iteration of 1 unless overriden. class OdeSolverLinearEulerImplicit : public OdeSolverEulerImplicit { public: /// Constructor /// \param equation The ode equation to be solved explicit OdeSolverLinearEulerImplicit(OdeEquation* equation); void setNewtonRaphsonMaximumIteration(size_t maximumIteration) override; /// The parameter computeCompliance is irrelevant for any Linear solver as it is a constant matrix. /// It will be precomputed on the first call and use in the following calls, no matter what the parameter value is. void solve(double dt, const OdeState& currentState, OdeState* newState, bool computeCompliance = true) override; private: /// The constant stiffness matrix SparseMatrix m_constantK; /// Has the solver been initialized bool m_initialized; }; }; // namespace Math }; // namespace SurgSim #endif // SURGSIM_MATH_ODESOLVERLINEAREULERIMPLICIT_H opensurgsim-0.7.0/SurgSim/Math/OdeSolverLinearRungeKutta4.cpp000066400000000000000000000075051277777236100242440ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Math/OdeSolverLinearRungeKutta4.h" #include "SurgSim/Math/OdeState.h" namespace SurgSim { namespace Math { OdeSolverLinearRungeKutta4::OdeSolverLinearRungeKutta4(OdeEquation* equation) : OdeSolverRungeKutta4(equation), m_initialized(false) { m_name = "Ode Solver Linear Runge Kutta 4"; } void OdeSolverLinearRungeKutta4::solve(double dt, const OdeState& currentState, OdeState* newState, bool computeCompliance) { if (!m_initialized) { // The compliance matrix is constant and used in all following calls, so we force its calculation on 1st pass. OdeSolverRungeKutta4::solve(dt, currentState, newState, true); m_initialized = true; } else { // General equation to solve: // M.a(t) = F(t, x(t), v(t)), which is an ode of order 2 that can be reduced to an ode of order 1: // y' = (x)' = ( v ) = f(t, y) // (v) = (M^-1.F(t, x(t), v(t))) // In terms of (x), f(t, (x)) = (v ) // (v) (v) (M^-1.F(t, x(t), v(t))) // Runge Kutta 4 computes y(n+1) = y(n) + 1/6.dt.(k1 + 2 * k2 + 2 * k3 + k4) // with k1 = f(t(n) , y(n) ) // with k2 = f(t(n) + dt/2, y(n) + k1 * dt/2) // with k3 = f(t(n) + dt/2, y(n) + k2 * dt/2) // with k4 = f(t(n) + dt , y(n) + k3 * dt ) // 1st evaluate k1 (note that y(n) is currentState) m_k1.velocity = currentState.getVelocities(); // Reminder: m_complianceMatrix = dt.M^-1 (including 0 compliance for all boundary conditions) m_equation.updateFMDK(currentState, ODEEQUATIONUPDATE_F); m_k1.acceleration = m_equation.applyCompliance(currentState, m_equation.getF() / dt); // 2nd evaluate k2 newState->getPositions() = currentState.getPositions() + m_k1.velocity * dt / 2.0; newState->getVelocities() = currentState.getVelocities() + m_k1.acceleration * dt / 2.0; m_k2.velocity = newState->getVelocities(); m_equation.updateFMDK(*newState, ODEEQUATIONUPDATE_F); m_k2.acceleration = m_equation.applyCompliance(*newState, m_equation.getF() / dt); // 3rd evaluate k3 newState->getPositions() = currentState.getPositions() + m_k2.velocity * dt / 2.0; newState->getVelocities() = currentState.getVelocities() + m_k2.acceleration * dt / 2.0; m_k3.velocity = newState->getVelocities(); m_equation.updateFMDK(*newState, ODEEQUATIONUPDATE_F); m_k3.acceleration = m_equation.applyCompliance(*newState, m_equation.getF() / dt); // 4th evaluate k4 newState->getPositions() = currentState.getPositions() + m_k3.velocity * dt; newState->getVelocities() = currentState.getVelocities() + m_k3.acceleration * dt; m_k4.velocity = newState->getVelocities(); m_equation.updateFMDK(*newState, ODEEQUATIONUPDATE_F); m_k4.acceleration = m_equation.applyCompliance(*newState, m_equation.getF() / dt); // Compute the new state using Runge Kutta 4 integration scheme: newState->getPositions() = currentState.getPositions() + (m_k1.velocity + m_k4.velocity + 2.0 * (m_k2.velocity + m_k3.velocity)) * dt / 6.0; newState->getVelocities() = currentState.getVelocities() + (m_k1.acceleration + m_k4.acceleration + 2.0 * (m_k2.acceleration + m_k3.acceleration)) * dt / 6.0; } } }; // namespace Math }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Math/OdeSolverLinearRungeKutta4.h000066400000000000000000000032141277777236100237020ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_MATH_ODESOLVERLINEARRUNGEKUTTA4_H #define SURGSIM_MATH_ODESOLVERLINEARRUNGEKUTTA4_H #include "SurgSim/Math/OdeSolverRungeKutta4.h" namespace SurgSim { namespace Math { /// Linear Version of the Runge Kutta 4 ode solver /// This solver assumes that the system is linear /// ie that Mass, Damping, and Stiffness matrices do not change. class OdeSolverLinearRungeKutta4 : public OdeSolverRungeKutta4 { public: /// Constructor /// \param equation The ode equation to be solved explicit OdeSolverLinearRungeKutta4(OdeEquation* equation); /// The parameter computeCompliance is irrelevant for any Linear solver as it is a constant matrix. /// It will be precomputed on the first call and use in the following calls, no matter what the parameter value is. void solve(double dt, const OdeState& currentState, OdeState* newState, bool computeCompliance = true) override; private: bool m_initialized; }; }; // namespace Math }; // namespace SurgSim #endif // SURGSIM_MATH_ODESOLVERLINEARRUNGEKUTTA4_H opensurgsim-0.7.0/SurgSim/Math/OdeSolverLinearStatic.cpp000066400000000000000000000031341277777236100233100ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Math/OdeSolverLinearStatic.h" #include "SurgSim/Math/OdeState.h" namespace SurgSim { namespace Math { OdeSolverLinearStatic::OdeSolverLinearStatic(OdeEquation* equation) : OdeSolverStatic(equation), m_initialized(false) { m_name = "Ode Solver Linear Static"; } void OdeSolverLinearStatic::solve(double dt, const OdeState& currentState, OdeState* newState, bool computeCompliance) { if (!m_initialized) { OdeSolverStatic::solve(dt, currentState, newState, computeCompliance); m_initialized = true; } else { m_equation.updateFMDK(currentState, ODEEQUATIONUPDATE_F); const Vector& f = m_equation.getF(); Vector deltaX = m_equation.applyCompliance(currentState, f); // Compute the new state using the static scheme: newState->getPositions() = currentState.getPositions() + deltaX; // Velocities are null in static mode (no time dependency) newState->getVelocities().setZero(); } } }; // namespace Math }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Math/OdeSolverLinearStatic.h000066400000000000000000000031611277777236100227550ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_MATH_ODESOLVERLINEARSTATIC_H #define SURGSIM_MATH_ODESOLVERLINEARSTATIC_H #include "SurgSim/Math/OdeSolverStatic.h" namespace SurgSim { namespace Math { /// Linear version of the static ode solver /// This solver assumes that the system is linear, ie that Stiffness matrix does not change. class OdeSolverLinearStatic : public OdeSolverStatic { public: /// Constructor /// \param equation The ode equation to be solved explicit OdeSolverLinearStatic(OdeEquation* equation); /// The parameter computeCompliance is irrelevant for any Linear solver as it is a constant matrix. /// It will be precomputed on the first call and use in the following calls, no matter what the parameter value is. void solve(double dt, const OdeState& currentState, OdeState* newState, bool computeCompliance = true) override; private: /// Has the solver been initialized bool m_initialized; }; }; // namespace Math }; // namespace SurgSim #endif // SURGSIM_MATH_ODESOLVERLINEARSTATIC_H opensurgsim-0.7.0/SurgSim/Math/OdeSolverRungeKutta4.cpp000066400000000000000000000104711277777236100231050ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Math/OdeSolverRungeKutta4.h" #include "SurgSim/Math/OdeState.h" namespace SurgSim { namespace Math { OdeSolverRungeKutta4::OdeSolverRungeKutta4(OdeEquation* equation) : OdeSolver(equation) { m_name = "Ode Solver Runge Kutta 4"; } void OdeSolverRungeKutta4::solve(double dt, const OdeState& currentState, OdeState* newState, bool computeCompliance) { // General equation to solve: // M.a(t) = F(t, x(t), v(t)), which is an ode of order 2 that can be reduced to an ode of order 1: // y' = (x)' = ( v ) = f(t, y) // (v) = (M^-1.F(t, x(t), v(t))) // In terms of (x), f(t, (x)) = (v ) // (v) (v) (M^-1.F(t, x(t), v(t))) // On the velocity level, we can write M/dt.deltaV = F // Therefore the system matrix is M/dt // Runge Kutta 4 computes y(n+1) = y(n) + 1/6.dt.(k1 + 2 * k2 + 2 * k3 + k4) // with k1 = f(t(n) , y(n) ) // with k2 = f(t(n) + dt/2, y(n) + k1 * dt/2) // with k3 = f(t(n) + dt/2, y(n) + k2 * dt/2) // with k4 = f(t(n) + dt , y(n) + k3 * dt ) // Assemble the linear system systemMatrix.solution = rhs assembleLinearSystem(dt, currentState, *newState); // 1st evaluate k1 (note that y(n) is currentState) m_k1.velocity = currentState.getVelocities(); m_k1.acceleration = m_linearSolver->solve(m_rhs / dt); // 2nd evaluate k2 newState->getPositions() = currentState.getPositions() + m_k1.velocity * dt / 2.0; newState->getVelocities() = currentState.getVelocities() + m_k1.acceleration * dt / 2.0; m_k2.velocity = newState->getVelocities(); m_equation.updateFMDK(*newState, ODEEQUATIONUPDATE_F); Vector f = m_equation.getF(); m_k2.acceleration = m_linearSolver->solve(*currentState.applyBoundaryConditionsToVector(&f) / dt); // 3rd evaluate k3 newState->getPositions() = currentState.getPositions() + m_k2.velocity * dt / 2.0; newState->getVelocities() = currentState.getVelocities() + m_k2.acceleration * dt / 2.0; m_k3.velocity = newState->getVelocities(); m_equation.updateFMDK(*newState, ODEEQUATIONUPDATE_F); f = m_equation.getF(); m_k3.acceleration = m_linearSolver->solve(*currentState.applyBoundaryConditionsToVector(&f) / dt); // 4th evaluate k4 newState->getPositions() = currentState.getPositions() + m_k3.velocity * dt; newState->getVelocities() = currentState.getVelocities() + m_k3.acceleration * dt; m_k4.velocity = newState->getVelocities(); m_equation.updateFMDK(*newState, ODEEQUATIONUPDATE_F); f = m_equation.getF(); m_k4.acceleration = m_linearSolver->solve(*currentState.applyBoundaryConditionsToVector(&f) / dt); // Compute the new state using Runge Kutta 4 integration scheme: newState->getPositions() = currentState.getPositions() + (m_k1.velocity + m_k4.velocity + 2.0 * (m_k2.velocity + m_k3.velocity)) * dt / 6.0; newState->getVelocities() = currentState.getVelocities() + (m_k1.acceleration + m_k4.acceleration + 2.0 * (m_k2.acceleration + m_k3.acceleration)) * dt / 6.0; if (computeCompliance) { computeComplianceMatrixFromSystemMatrix(currentState); } } void OdeSolverRungeKutta4::assembleLinearSystem(double dt, const OdeState& state, const OdeState& newState, bool computeRHS) { m_equation.updateFMDK(state, ODEEQUATIONUPDATE_F | ODEEQUATIONUPDATE_M); // Computes the LHS systemMatrix m_systemMatrix = m_equation.getM() / dt; state.applyBoundaryConditionsToMatrix(&m_systemMatrix); // Feed the systemMatrix to the linear solver, so it can be used after this call to solve or inverse the matrix m_linearSolver->setMatrix(m_systemMatrix); // Computes the RHS vector if (computeRHS) { m_rhs = m_equation.getF(); state.applyBoundaryConditionsToVector(&m_rhs); } } }; // namespace Math }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Math/OdeSolverRungeKutta4.h000066400000000000000000000055771277777236100225650ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_MATH_ODESOLVERRUNGEKUTTA4_H #define SURGSIM_MATH_ODESOLVERRUNGEKUTTA4_H #include #include "SurgSim/Math/OdeSolver.h" namespace SurgSim { namespace Math { /// Runge Kutta 4 ode solver (See http://en.wikipedia.org/wiki/Runge%E2%80%93Kutta_methods) /// solves the following \f$2^{nd}\f$ order ode /// \f$M(x(t), v(t)).a(t) = f(t, x(t), v(t))\f$. /// This ode is solved as an ode of order 1 by defining the state vector /// \f$y = \left(\begin{array}{c}x\\v\end{array}\right)\f$: /// \f[ /// y' = \left(\begin{array}{c} x' \\ v' \end{array}\right) = /// \left(\begin{array}{c} v \\ M(x, v)^{-1}.f(t,x, v) \end{array}\right) = /// f(t, y) /// \f] /// After integrating this equation, we get: /// \f[ y(t+dt) - y(t) = \int_t^{t+dt} f(t,y) dt \f] /// Runge Kutta 4 evaluates the integral term using 4 dependents evaluations of \f$f\f$ at different times and states: /// \f[ /// \begin{array}{l} /// y(t+dt) = y(t) + \frac{dt}{6} (k_1 + 2k_2 + 2k_3 + k_4) /// \\ \text{with:} /// \\ \quad /// \begin{array}{lllllll} /// k_1 &=& f(& t &,& y(t) &) /// \\ k_2 &=& f(& t+\frac{dt}{2} &,& y(t) + \frac{dt}{2} k_1 &) /// \\ k_3 &=& f(& t+\frac{dt}{2} &,& y(t) + \frac{dt}{2} k_2 &) /// \\ k_4 &=& f(& t+dt &,& y(t) + dt k_3 &) /// \end{array} /// \end{array} /// \f] class OdeSolverRungeKutta4 : public OdeSolver { public: /// Constructor /// \param equation The ode equation to be solved explicit OdeSolverRungeKutta4(OdeEquation* equation); void solve(double dt, const OdeState& currentState, OdeState* newState, bool computeCompliance = true) override; protected: void assembleLinearSystem(double dt, const OdeState& state, const OdeState& newState, bool computeRHS = true) override; /// Internal structure to hold the 4 temporary evaluations struct RungeKuttaDerivedState { RungeKuttaDerivedState(){} RungeKuttaDerivedState(const Vector& v, const Vector& a) : velocity(v), acceleration(a) {} Vector velocity; Vector acceleration; }; ///@{ /// Runge kutta 4 intermediate system evaluation RungeKuttaDerivedState m_k1, m_k2, m_k3, m_k4; ///@} }; }; // namespace Math }; // namespace SurgSim #endif // SURGSIM_MATH_ODESOLVERRUNGEKUTTA4_H opensurgsim-0.7.0/SurgSim/Math/OdeSolverStatic.cpp000066400000000000000000000054261277777236100221630ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Math/OdeSolverStatic.h" #include "SurgSim/Math/OdeState.h" namespace SurgSim { namespace Math { OdeSolverStatic::OdeSolverStatic(OdeEquation* equation) : OdeSolver(equation) { m_name = "Ode Solver Static"; } void OdeSolverStatic::solve(double dt, const OdeState& currentState, OdeState* newState, bool computeCompliance) { // General equation to solve: // K.deltaX = f(t) = Fext + Fint(t) // which in the case of a linear model will derive in the expected equation: // K.(x(t+dt) - x(t)) = Fext - K.(x(t) - x(0)) // K.(x(t+dt) - x(0)) = Fext // systemMatrix . solution = rhs // Therefore systemMatrix = K, solution = deltaX, rhs = f(t) // Assemble the linear system systemMatrix.solution = rhs assembleLinearSystem(dt, currentState, *newState); // Solve the linear system to find solution = deltaX m_solution = m_linearSolver->solve(m_rhs); // Compute the new state using the static scheme: newState->getPositions() = currentState.getPositions() + m_solution; // Velocities are null in static mode (no time dependency) newState->getVelocities().setZero(); if (computeCompliance) { computeComplianceMatrixFromSystemMatrix(currentState); } } void OdeSolverStatic::assembleLinearSystem(double dt, const OdeState& state, const OdeState& newState, bool computeRHS) { // General equation to solve: // K.deltaX = Fext + Fint(t) // which in the case of a linear model will derive in the expected equation: // K.(x(t+dt) - x(t)) = Fext - K.(x(t) - x(0)) // K.(x(t+dt) - x(0)) = Fext // systemMatrix . solution = rhs // Therefore systemMatrix = K, solution = deltaX, rhs = f(t) m_equation.updateFMDK(state, ODEEQUATIONUPDATE_F | ODEEQUATIONUPDATE_K); // Computes the LHS systemMatrix m_systemMatrix = m_equation.getK(); state.applyBoundaryConditionsToMatrix(&m_systemMatrix); // Feed the systemMatrix to the linear solver, so it can be used after this call to solve or inverse the matrix m_linearSolver->setMatrix(m_systemMatrix); // Computes the RHS vector if (computeRHS) { m_rhs = m_equation.getF(); state.applyBoundaryConditionsToVector(&m_rhs); } } }; // namespace Math }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Math/OdeSolverStatic.h000066400000000000000000000034201277777236100216200ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_MATH_ODESOLVERSTATIC_H #define SURGSIM_MATH_ODESOLVERSTATIC_H #include "SurgSim/Math/OdeSolver.h" namespace SurgSim { namespace Math { /// Static ode solver solves the following \f$2^{nd}\f$ order ode \f$M(x(t), v(t)).a(t) = f(t, x(t), v(t))\f$.
/// This ode equation is solved w.r.t. \f$x\f$, by discarding all time derived variables (i.e. \f$v\f$, \f$a\f$) /// reducing the equation to solve to: /// \f[ /// 0 = f(t, x(t)) = f_{ext} + f_{int}(t, x(t)) = f_{ext} - K(x).(x - x0) /// \f] /// \note This solver does not solve the resulting non-linear equations, but their linearization: /// \f$f_{ext} - K.(x - x0)=0\f$ class OdeSolverStatic : public OdeSolver { public: /// Constructor /// \param equation The ode equation to be solved explicit OdeSolverStatic(OdeEquation* equation); void solve(double dt, const OdeState& currentState, OdeState* newState, bool computeCompliance = true) override; protected: void assembleLinearSystem(double dt, const OdeState& state, const OdeState& newState, bool computeRHS = true) override; }; }; // namespace Math }; // namespace SurgSim #endif // SURGSIM_MATH_ODESOLVERSTATIC_H opensurgsim-0.7.0/SurgSim/Math/OdeState.cpp000066400000000000000000000145161277777236100206210ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Math/OdeState.h" #include "SurgSim/Framework/Assert.h" #include "SurgSim/Math/Valid.h" namespace SurgSim { namespace Math { OdeState::OdeState() : m_numDofPerNode(0u), m_numNodes(0u) { } OdeState::~OdeState() { } bool OdeState::operator ==(const OdeState& state) const { return m_x == state.m_x && m_v == state.m_v && m_boundaryConditionsPerDof == state.m_boundaryConditionsPerDof; } bool OdeState::operator !=(const OdeState& state) const { return !((*this) == state); } void OdeState::reset() { m_x.setZero(); m_v.setZero(); m_boundaryConditionsPerDof.setConstant(false); m_boundaryConditionsAsDofIds.clear(); } void OdeState::setNumDof(size_t numDofPerNode, size_t numNodes) { const size_t numDof = numDofPerNode * numNodes; m_numDofPerNode = numDofPerNode; m_numNodes = numNodes; m_x.resize(numDof); m_v.resize(numDof); m_boundaryConditionsPerDof.resize(numDof); // Zero-out everything reset(); } size_t OdeState::getNumDof() const { const size_t numDof = m_numDofPerNode * m_numNodes; SURGSIM_ASSERT(m_x.size() == m_v.size() && m_x.size() == m_boundaryConditionsPerDof.size() && m_x.size() >= 0 && static_cast(m_x.size()) == numDof); return numDof; } size_t OdeState::getNumNodes() const { return m_numNodes; } SurgSim::Math::Vector& OdeState::getPositions() { return m_x; } const SurgSim::Math::Vector& OdeState::getPositions() const { return m_x; } const SurgSim::Math::Vector3d OdeState::getPosition(size_t nodeId) const { return SurgSim::Math::getSubVector(m_x, nodeId, m_numDofPerNode).segment(0, 3); } SurgSim::Math::Vector& OdeState::getVelocities() { return m_v; } const SurgSim::Math::Vector& OdeState::getVelocities() const { return m_v; } const SurgSim::Math::Vector3d OdeState::getVelocity(size_t nodeId) const { return SurgSim::Math::getSubVector(m_v, nodeId, m_numDofPerNode).segment(0, 3); } void OdeState::addBoundaryCondition(size_t nodeId) { SURGSIM_ASSERT(m_numDofPerNode != 0u) << "Number of dof per node = 0. Make sure to call setNumDof() " << "prior to adding boundary conditions."; for (size_t nodeDofId = 0; nodeDofId < m_numDofPerNode; ++nodeDofId) { addBoundaryCondition(nodeId, nodeDofId); } } void OdeState::addBoundaryCondition(size_t nodeId, size_t nodeDofId) { SURGSIM_ASSERT(m_numDofPerNode != 0u) << "Number of dof per node = 0. Make sure to call setNumDof() " << "prior to adding boundary conditions."; SURGSIM_ASSERT(nodeId < m_numNodes) << "Invalid nodeId " << nodeId << " number of nodes is " << m_numNodes; SURGSIM_ASSERT(nodeDofId < m_numDofPerNode) << "Invalid nodeDofId " << nodeDofId << " number of dof per node is " << m_numDofPerNode; size_t globalDofId = nodeId * m_numDofPerNode + nodeDofId; if (! m_boundaryConditionsPerDof[globalDofId]) { m_boundaryConditionsPerDof[globalDofId] = true; m_boundaryConditionsAsDofIds.push_back(globalDofId); } } size_t OdeState::getNumBoundaryConditions() const { return m_boundaryConditionsAsDofIds.size(); } const std::vector& OdeState::getBoundaryConditions() const { return m_boundaryConditionsAsDofIds; } bool OdeState::isBoundaryCondition(size_t dof) const { return m_boundaryConditionsPerDof[dof]; } Vector* OdeState::applyBoundaryConditionsToVector(Vector* vector) const { SURGSIM_ASSERT(vector != nullptr && vector->size() >= 0 && static_cast(vector->size()) == getNumDof()) << "Invalid vector to apply boundary conditions on"; for (auto it = getBoundaryConditions().cbegin(); it != getBoundaryConditions().cend(); ++it) { (*vector)[*it] = 0.0; } return vector; } void OdeState::applyBoundaryConditionsToMatrix(Matrix* matrix, bool hasCompliance) const { SURGSIM_ASSERT(matrix != nullptr && static_cast(matrix->rows()) == getNumDof() && static_cast(matrix->cols()) == getNumDof()) << "Invalid matrix to apply boundary conditions on"; double complianceValue = 0.0; if (hasCompliance) { complianceValue = 1.0; } for (auto it = getBoundaryConditions().cbegin(); it != getBoundaryConditions().cend(); ++it) { (*matrix).middleRows(*it, 1).setZero(); (*matrix).middleCols(*it, 1).setZero(); (*matrix)(*it, *it) = complianceValue; } } void OdeState::applyBoundaryConditionsToMatrix(SparseMatrix* matrix, bool hasCompliance) const { SURGSIM_ASSERT(matrix != nullptr && static_cast(matrix->rows()) == getNumDof() && static_cast(matrix->cols()) == getNumDof()) << "Invalid matrix to apply boundary conditions on"; double complianceValue = 0.0; if (hasCompliance) { complianceValue = 1.0; } for (auto it = getBoundaryConditions().cbegin(); it != getBoundaryConditions().cend(); ++it) { Math::zeroRow((*it), matrix); Math::zeroColumn(static_cast((*it)), matrix); (*matrix).coeffRef(static_cast(*it), static_cast(*it)) = complianceValue; } } bool OdeState::isValid() const { using SurgSim::Math::isValid; /// http://steve.hollasch.net/cgindex/coding/ieeefloat.html /// We use the IEEE754 standard stipulating that any arithmetic operation with a NaN operand will produce NaN /// and any sum of +-INF with a finite number or +-INF will produce +-INF. /// Therefore, testing if a vector contains only finite numbers can be achieve easily by summing all the values /// and testing if the result is a finite number or not. return isValid(getPositions().sum()) && isValid(getVelocities().sum()); } OdeState OdeState::interpolate(const OdeState& other, double t) const { auto result = OdeState(*this); if (t != 0) { result.m_v += (other.m_v - m_v) * t; result.m_x += (other.m_x - m_x) * t; } return result; } }; // namespace Math }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Math/OdeState.h000066400000000000000000000172471277777236100202720ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_MATH_ODESTATE_H #define SURGSIM_MATH_ODESTATE_H #include #include "SurgSim/Math/Matrix.h" #include "SurgSim/Math/SparseMatrix.h" #include "SurgSim/Math/Vector.h" namespace SurgSim { namespace Math { /// The state \f$y\f$ of an ode of 2nd order of the form \f$M(x,v).a = F(x, v)\f$ with boundary conditions. /// This ode equation is solved as an ode of order 1 by defining the state vector /// \f$y = \left(\begin{array}{c}x\\v\end{array}\right)\f$: /// \f[ /// y' = \left(\begin{array}{c} x' \\ v' \end{array}\right) = /// \left(\begin{array}{c} v \\ M(x, v)^{-1}.F(x, v) \end{array}\right) /// \f] class OdeState { public: /// Default constructor OdeState(); /// Destructor virtual ~OdeState(); /// Comparison operator (equality test) /// \param state The state to compare it to /// \return True if the 2 states are equal, False otherwise bool operator ==(const OdeState& state) const; /// Comparison operator (difference test) /// \param state The state to compare it to /// \return False if the 2 states are equal, True otherwise bool operator !=(const OdeState& state) const; /// Resets the state /// \note Simply set all positions/velocities to 0 and remove all boundary conditions virtual void reset(); /// Allocates the state for a given number of degrees of freedom /// \param numDofPerNode The number of degrees of freedom per node to account for /// \param numNodes The number of nodes to account for /// \note This method clears all the data structures and remove all existing boundary conditions virtual void setNumDof(size_t numDofPerNode, size_t numNodes); /// Retrieves the number of degrees of freedom /// \return The number of DOF for this representation size_t getNumDof() const; /// Retrieves the number of nodes /// \return The number of nodes for this representation size_t getNumNodes() const; /// Retrieves all degrees of freedom's position (non-const version) /// \return Vector of collected DOF's position SurgSim::Math::Vector& getPositions(); /// Retrieves all degrees of freedom's position (const version) /// \return Vector of collected DOF's position const SurgSim::Math::Vector& getPositions() const; /// Retrieves the position of a given node (const version) /// \param nodeId The desired node id for which the position is requested (must be a valid id) /// \return The position of the node nodeId /// \note Behavior undefined if the nodeId is not in the correct range [0 getNumNodes()-1] const SurgSim::Math::Vector3d getPosition(size_t nodeId) const; /// Retrieves all degrees of freedom's velocity (non-const version) /// \return Vector of collected DOF's velocity SurgSim::Math::Vector& getVelocities(); /// Retrieves all degrees of freedom's velocity (const version) /// \return Vector of collected DOF's velocity const SurgSim::Math::Vector& getVelocities() const; /// Retrieves the velocity of a given node (const version) /// \param nodeId The desired node id for which the velocity is requested (must be a valid id) /// \return The velocity of the node nodeId /// \note Behavior undefined if the nodeId is not in the correct range [0 getNumNodes()-1] const SurgSim::Math::Vector3d getVelocity(size_t nodeId) const; /// Adds boundary conditions for a given node (fixes all the dof for this node) /// \param nodeId The node to set the boundary conditions on void addBoundaryCondition(size_t nodeId); /// Adds a boundary condition on a given dof of a given node (only 1 dof is fixed) /// \param nodeId The node on which the boundary condition needs to be set /// \param nodeDofId The dof of the node to set as boundary condition void addBoundaryCondition(size_t nodeId, size_t nodeDofId); /// Retrieves the number of boundary conditions /// \return The number of boundary conditions size_t getNumBoundaryConditions() const; /// Retrieves all boundary conditions /// \return All boundary conditions as a vector of dof ids const std::vector& getBoundaryConditions() const; /// Queries if a specific dof is a boundary condition or not /// \param dof The requested dof /// \return True if dof is a boundary condition, False otherwise /// \note The behavior is undefined when dof is out of range [0 getNumBoundaryConditions()-1] bool isBoundaryCondition(size_t dof) const; /// Apply boundary conditions to a given vector /// \param vector The vector to apply the boundary conditions on /// \return The parameter vector. This enables chained use like /// \f$U = K^1 * \text{applyBoundaryConditionsToVector}(x)\f$ Vector* applyBoundaryConditionsToVector(Vector* vector) const; /// Apply boundary conditions to a given matrix /// \param matrix The dense matrix to apply the boundary conditions on /// \param hasCompliance True if the fixed dofs should have a compliance of 1 with themselves in the matrix or not. /// \note hasCompliance is practical to remove all compliance, which is helpful when the compliance matrix is used /// \note in an architecture of type LCP. It ensures that a separate constraint resolution will never violates the /// \note boundary conditions. void applyBoundaryConditionsToMatrix(Matrix* matrix, bool hasCompliance = true) const; /// Apply boundary conditions to a given matrix /// \param matrix The sparse matrix to apply the boundary conditions on /// \param hasCompliance True if the fixed dofs should have a compliance of 1 with themselves in the matrix or not. /// \note hasCompliance is practical to remove all compliance, which is helpful when the compliance matrix is used /// \note in an architecture of type LCP. It ensures that a separate constraint resolution will never violates the /// \note boundary conditions. void applyBoundaryConditionsToMatrix(SparseMatrix* matrix, bool hasCompliance = true) const; /// Check if this state is numerically valid /// \return True if all positions and velocities are valid numerical values, False otherwise virtual bool isValid() const; /// Returns the linear interpolated ODE state between this and other at parameter t /// \param other the end point for the linear interpolation /// \param t the interpolation time /// \return the interpolated state = this + (other - this) * t; /// \note All dof are independently linearly interpolated (This will not work correctly /// on rotation vectors where a slerp will be required.) OdeState interpolate(const OdeState& other, double t) const; private: /// Default public copy constructor and assignment operator are being used on purpose /// Keep track of the number of degrees of freedom per node and the number of nodes size_t m_numDofPerNode, m_numNodes; /// Degrees of freedom position SurgSim::Math::Vector m_x; /// Degrees of freedom velocity (m_x 1st derivative w.r.t. time) SurgSim::Math::Vector m_v; /// Boundary conditions stored as a list of dof ids std::vector m_boundaryConditionsAsDofIds; /// Boundary conditions stored per dof (True indicates a boundary condition, False does not) Eigen::Matrix m_boundaryConditionsPerDof; }; }; // namespace Math }; // namespace SurgSim #endif // SURGSIM_MATH_ODESTATE_H opensurgsim-0.7.0/SurgSim/Math/ParticlesShape-inl.h000066400000000000000000000023401277777236100222350ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // #ifndef SURGSIM_MATH_PARTICLESSHAPE_INL_H #define SURGSIM_MATH_PARTICLESSHAPE_INL_H namespace SurgSim { namespace Math { template ParticlesShape::ParticlesShape(const SurgSim::DataStructures::Vertices& other) : DataStructures::Vertices(other), m_radius(0.0) { update(); } template ParticlesShape& ParticlesShape::operator=(const SurgSim::DataStructures::Vertices& other) { DataStructures::Vertices::operator=(other); update(); return *this; } }; // namespace Math }; // namespace SurgSim #endif opensurgsim-0.7.0/SurgSim/Math/ParticlesShape.cpp000066400000000000000000000071631277777236100220200ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Math/ParticlesShape.h" #include "SurgSim/DataStructures/AabbTree.h" #include "SurgSim/DataStructures/AabbTreeData.h" namespace SurgSim { namespace Math { SURGSIM_REGISTER(SurgSim::Math::Shape, SurgSim::Math::ParticlesShape, ParticlesShape); ParticlesShape::ParticlesShape(double radius) : m_radius(radius) { SURGSIM_ADD_SERIALIZABLE_PROPERTY(ParticlesShape, double, Radius, getRadius, setRadius); update(); } ParticlesShape::ParticlesShape(const ParticlesShape& other) : DataStructures::Vertices(other), m_aabbTree(other.m_aabbTree), m_radius(other.getRadius()), m_center(other.getCenter()), m_volume(other.getVolume()), m_secondMomentOfVolume(other.getSecondMomentOfVolume()) { } int ParticlesShape::getType() const { return SHAPE_TYPE_PARTICLES; } double ParticlesShape::getVolume() const { return m_volume; } Vector3d ParticlesShape::getCenter() const { return m_center; } Matrix33d ParticlesShape::getSecondMomentOfVolume() const { return m_secondMomentOfVolume; } bool ParticlesShape::isValid() const { return m_radius >= 0.0; } double ParticlesShape::getRadius() const { return m_radius; } void ParticlesShape::setRadius(double radius) { m_radius = radius; } bool ParticlesShape::doUpdate() { const double numParticles = static_cast(getVertices().size()); const Vector3d radius = Vector3d::Constant(m_radius); std::list items; Vector3d totalPosition = Vector3d::Zero(); Matrix33d totalDisplacementSkewSquared = Matrix33d::Zero(); size_t id = 0; for (auto const& vertex : getVertices()) { totalPosition += vertex.position; Matrix33d skewOfDisplacement = makeSkewSymmetricMatrix(vertex.position); totalDisplacementSkewSquared += skewOfDisplacement * skewOfDisplacement; SurgSim::Math::Aabbd aabb(vertex.position - radius, vertex.position + radius); items.emplace_back(std::make_pair(std::move(aabb), id)); id++; } m_center = totalPosition / numParticles; double sphereVolume = (4.0 / 3.0) * M_PI * m_radius * m_radius * m_radius; m_volume = sphereVolume * numParticles; // Parallel Axis Theorem m_secondMomentOfVolume = Matrix33d::Identity() * (2.0 / 5.0) * sphereVolume * m_radius * m_radius * numParticles; m_secondMomentOfVolume -= sphereVolume * totalDisplacementSkewSquared; m_aabbTree = std::make_shared(); m_aabbTree->set(std::move(items)); return true; } std::shared_ptr ParticlesShape::getTransformed(const RigidTransform3d& pose) const { auto transformed = std::make_shared(*this); transformed->transform(pose); transformed->update(); return transformed; } const std::shared_ptr ParticlesShape::getAabbTree() const { return m_aabbTree; } bool ParticlesShape::isTransformable() const { return true; } const Math::Aabbd& ParticlesShape::getBoundingBox() const { if (m_aabbTree != nullptr) { return m_aabbTree->getAabb(); } else { return m_aabb; } } }; }; opensurgsim-0.7.0/SurgSim/Math/ParticlesShape.h000066400000000000000000000064031277777236100214610ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_MATH_PARTICLESSHAPE_H #define SURGSIM_MATH_PARTICLESSHAPE_H #include #include "SurgSim/DataStructures/EmptyData.h" #include "SurgSim/DataStructures/Vertices.h" #include "SurgSim/Framework/ObjectFactory.h" #include "SurgSim/Math/Matrix.h" #include "SurgSim/Math/Shape.h" #include "SurgSim/Math/Vector.h" namespace SurgSim { namespace DataStructures { class AabbTree; }; namespace Math { SURGSIM_STATIC_REGISTRATION(ParticlesShape); /// Particles Shape: A shape consisting of a group of particles of equal radius class ParticlesShape : public Shape, public SurgSim::DataStructures::Vertices { public: /// Constructor /// \param radius The particles' radius (in m) explicit ParticlesShape(double radius = 0.0); /// Copy constructor /// \param other The ParticleShape to be copied from explicit ParticlesShape(const ParticlesShape& other); /// Copy constructor from another Vertices type /// \tparam V type of data stored in the other vertices /// \param other The vertices to be copied from. Vertex data will not be copied template explicit ParticlesShape(const SurgSim::DataStructures::Vertices& other); /// Assignment when the template data is a different type /// \tparam V type of data stored in the other Vertices /// \param other the Vertices to copy from template ParticlesShape& operator=(const Vertices& other); SURGSIM_CLASSNAME(SurgSim::Math::ParticlesShape); /// Get the AabbTree /// \return The object's associated AabbTree const std::shared_ptr getAabbTree() const; /// Set the particles' radius /// \param radius the radius being set to all particles void setRadius(double radius); /// Get the radius of the particles /// \return The particles' radius double getRadius() const; int getType() const override; double getVolume() const override; Vector3d getCenter() const override; Matrix33d getSecondMomentOfVolume() const override; std::shared_ptr getTransformed(const RigidTransform3d& pose) const override; bool isValid() const override; bool isTransformable() const override; const Math::Aabbd& getBoundingBox() const override; private: bool doUpdate() override; /// The aabb tree of the ParticlesShape std::shared_ptr m_aabbTree; /// Particles' radius double m_radius; /// Volumetric center of particles Vector3d m_center; /// Total volume of particles double m_volume; /// Second moment of volume Matrix33d m_secondMomentOfVolume; }; }; }; #include "SurgSim/Math/ParticlesShape-inl.h" #endif // SURGSIM_MATH_PARTICLESSHAPE_H opensurgsim-0.7.0/SurgSim/Math/PlaneShape.cpp000066400000000000000000000025541277777236100211300ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Math/PlaneShape.h" namespace SurgSim { namespace Math { SURGSIM_REGISTER(SurgSim::Math::Shape, SurgSim::Math::PlaneShape, PlaneShape); PlaneShape::PlaneShape() { } int PlaneShape::getType() const { return SHAPE_TYPE_PLANE; } double PlaneShape::getVolume() const { return 0.0; } SurgSim::Math::Vector3d PlaneShape::getCenter() const { return Vector3d(0.0, 0.0, 0.0); } SurgSim::Math::Matrix33d PlaneShape::getSecondMomentOfVolume() const { return Matrix33d::Zero(); } double PlaneShape::getD() const { return 0.0; } SurgSim::Math::Vector3d PlaneShape::getNormal() const { return Vector3d(0.0, 1.0, 0.0); } bool PlaneShape::isValid() const { return true; } }; // namespace Math }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Math/PlaneShape.h000066400000000000000000000050411277777236100205670ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_MATH_PLANESHAPE_H #define SURGSIM_MATH_PLANESHAPE_H #include "SurgSim/Framework/ObjectFactory.h" #include "SurgSim/Math/Shape.h" namespace SurgSim { namespace Math { SURGSIM_STATIC_REGISTRATION(PlaneShape); /// The XZ plane (d = 0) with normal pointing along positive Y axis. /// The difference between PlaneShape and DoubleSidedPlane shape is in the way the Physics scene /// handles these in terms of collision detection. While the DoubleSidedPlane is handled as a thin /// solid of (essentially) zero thickness and space on either side it, the PlaneShape is considered /// to be a entirely solid on the side of the plane which is opposite to the normal. It is made of /// space only on the positive side of the plane normal. This results in having a robust collision /// object which does not let any objects through, and could be useful to define the scene floor. class PlaneShape: public Shape { public: /// Constructor: No members to initialize. PlaneShape(); SURGSIM_CLASSNAME(SurgSim::Math::PlaneShape); /// \return the type of the shape int getType() const override; /// Get the volume of the shape /// \return The volume of the shape (in m-3) double getVolume() const override; /// Get the volumetric center of the shape /// \return The center of the shape Vector3d getCenter() const override; /// Get the second central moment of the volume, commonly used /// to calculate the moment of inertia matrix /// \return The 3x3 symmetric second moment matrix Matrix33d getSecondMomentOfVolume() const override; /// Gets the d of the plane equation. /// \return The value of d (always 0). double getD() const; /// Gets the normal of the plane equation. /// \return The value of the normal (always Y axis). Vector3d getNormal() const; /// A PlaneShape is always valid. /// \return True. bool isValid() const override; }; }; // Math }; // SurgSim #endif // SURGSIM_MATH_PLANESHAPE_H opensurgsim-0.7.0/SurgSim/Math/PointTriangleCcdContactCalculation-inl.h000066400000000000000000000121131277777236100262110ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_MATH_POINTTRIANGLECCDCONTACTCALCULATION_INL_H #define SURGSIM_MATH_POINTTRIANGLECCDCONTACTCALCULATION_INL_H #include #include #include "SurgSim/Math/CubicSolver.h" namespace SurgSim { namespace Math { /// Check if a point belongs to a triangle at a given time of their motion /// \tparam T Accuracy of the calculation, can usually be inferred. /// \tparam MOpt Eigen Matrix options, can usually be inferred. /// \param time The time of coplanarity of the 4 points (P(t), A(t), B(t), C(t) are expected to be coplanar) /// \param P the point motion (from first to second) /// \param A, B, C The triangle points motion (from first to second) /// \param[out] barycentricCoordinates The barycentric coordinates of P(t) in ABC(t) /// \return true if P(t) is inside the triangle ABC(t) template bool isPointInsideTriangle( T time, const std::pair, Eigen::Matrix>& P, const std::pair, Eigen::Matrix>& A, const std::pair, Eigen::Matrix>& B, const std::pair, Eigen::Matrix>& C, Eigen::Matrix* barycentricCoordinates) { Eigen::Matrix Pt = interpolate(P.first, P.second, time); Eigen::Matrix At = interpolate(A.first, A.second, time); Eigen::Matrix Bt = interpolate(B.first, B.second, time); Eigen::Matrix Ct = interpolate(C.first, C.second, time); bool result = Math::barycentricCoordinates(Pt, At, Bt, Ct, barycentricCoordinates); for (int i = 0; i < 3; i++) { if (std::abs((*barycentricCoordinates)[i]) < Math::Geometry::ScalarEpsilon) { (*barycentricCoordinates)[i] = 0.0; } if (std::abs(1.0 - (*barycentricCoordinates)[i]) < Math::Geometry::ScalarEpsilon) { (*barycentricCoordinates)[i] = 1.0; } } return (result && (*barycentricCoordinates)[0] >= 0.0 && (*barycentricCoordinates)[1] >= 0.0 && (*barycentricCoordinates)[2] >= 0.0); } /// Continuous collision detection between a point P and a triangle ABC /// \tparam T Accuracy of the calculation, can usually be inferred. /// \tparam MOpt Eigen Matrix options, can usually be inferred. /// \param P the point motion (from first to second) to calculate the ccd with /// \param A, B, C The triangle points motion (from first to second) to calculate the ccd with /// \param[out] timeOfImpact The time of impact within [0..1] if a collision is found /// \param[out] tv01Param, tv02Param The barycentric coordinate of the contact point in the triangle /// i.e. ContactPoint(timeOfImpact) = A(timeOfImpact) + tv01Param.AB(timeOfImpact) + tv02Param.AC(timeOfImpact) /// \return True if the given point/triangle motions intersect, False otherwise /// \note Simple cubic-solver https://graphics.stanford.edu/courses/cs468-02-winter/Papers/Collisions_vetements.pdf /// \note Optimized method http://www.robotics.sei.ecnu.edu.cn/CCDLY/GMOD15.pdf /// \note Optimized method https://www.cs.ubc.ca/~rbridson/docs/brochu-siggraph2012-ccd.pdf template inline bool calculateCcdContactPointTriangle( const std::pair, Eigen::Matrix>& P, const std::pair, Eigen::Matrix>& A, const std::pair, Eigen::Matrix>& B, const std::pair, Eigen::Matrix>& C, T* timeOfImpact, T* tv01Param, T* tv02Param) { std::array roots; int numberOfRoots = timesOfCoplanarityInRange01(P, A, B, C, &roots); // The roots are all in [0..1] and ordered ascendingly for (int rootId = 0; rootId < numberOfRoots; ++rootId) { Eigen::Matrix baryCoords; if (isPointInsideTriangle(roots[rootId], P, A, B, C, &baryCoords)) { // The point P is in the triangle plane at time t, and is inside the triangle *timeOfImpact = roots[rootId]; *tv01Param = baryCoords[1]; *tv02Param = baryCoords[2]; // None of these assertion should be necessary, but just to double check SURGSIM_ASSERT(*timeOfImpact >= 0.0 && *timeOfImpact <= 1.0); SURGSIM_ASSERT(*tv01Param >= 0.0); SURGSIM_ASSERT(*tv02Param >= 0.0); SURGSIM_ASSERT(*tv01Param + *tv02Param <= 1.0 + Geometry::ScalarEpsilon); return true; } } return false; } }; // namespace Math }; // namespace SurgSim #endif // SURGSIM_MATH_POINTTRIANGLECCDCONTACTCALCULATION_INL_H opensurgsim-0.7.0/SurgSim/Math/Polynomial-inl.h000066400000000000000000000330161277777236100214550ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_MATH_POLYNOMIAL_INL_H #define SURGSIM_MATH_POLYNOMIAL_INL_H #include #include #include "SurgSim/Math/IntervalArithmetic.h" namespace SurgSim { namespace Math { template bool isNearZero(const T& value, const T& epsilon) { return (value + epsilon >= 0 && value - epsilon <= 0); } // Polynomial of degree 0 template Polynomial::Polynomial() : m_a0(static_cast(0)) { } template Polynomial::Polynomial(const T& a0) : m_a0(a0) { } template T Polynomial::evaluate(const T& x) const { return m_a0; } template T Polynomial::operator()(const T& x) const { return evaluate(x); } template T& Polynomial::operator[](const size_t i) { return const_cast(const_cast*>(this)->operator[](i)); } template const T& Polynomial::operator[](const size_t i) const { SURGSIM_ASSERT(i <= 0) << "Attempting to set a coefficient greater than the polynomial degree"; return m_a0; } template Polynomial Polynomial::operator- () const { return Polynomial(-m_a0); } template Polynomial Polynomial::operator+ (const Polynomial& rhs) const { return Polynomial(m_a0 + rhs.m_a0); } template Polynomial& Polynomial::operator+= (const Polynomial& rhs) { m_a0 += rhs.m_a0; return *this; } template Polynomial Polynomial::operator- (const Polynomial& rhs) const { return Polynomial(m_a0 - rhs.m_a0); } template Polynomial& Polynomial::operator-= (const Polynomial& rhs) { m_a0 -= rhs.m_a0; return *this; } template bool Polynomial::isNearZero(const T& epsilon) const { return SurgSim::Math::isNearZero(m_a0, epsilon); } template bool Polynomial::isApprox(const Polynomial& p, const T& epsilon) const { return ((*this) - p).isNearZero(epsilon); } template T Polynomial::getCoefficient(size_t i) const { switch (i) { case 0: return m_a0; default: return 0; } } template void Polynomial::setCoefficient(size_t i, const T& value) { SURGSIM_ASSERT(i <= 0) << "Attempting to set a coefficient greater than the polynomial degree"; m_a0 = value; } // Polynomial of degree 1 template Polynomial::Polynomial() : m_a0(static_cast(0)), m_a1(static_cast(0)) { } template Polynomial::Polynomial(const T& a0, const T& a1) : m_a0(a0), m_a1(a1) { } template T Polynomial::evaluate(const T& x) const { return m_a1 * x + m_a0; } template T Polynomial::operator()(const T& x) const { return evaluate(x); } template T& Polynomial::operator[](const size_t i) { return const_cast(const_cast*>(this)->operator[](i)); } template const T& Polynomial::operator[](const size_t i) const { SURGSIM_ASSERT(i <= 1) << "Attempting to set a coefficient greater than the polynomial degree"; switch (i) { case 0: { return m_a0; } default: { return m_a1; } } } template Polynomial Polynomial::operator- () const { return Polynomial(-m_a0, -m_a1); } template Polynomial Polynomial::operator+ (const Polynomial& rhs) const { return Polynomial(m_a0 + rhs.m_a0, m_a1 + rhs.m_a1); } template Polynomial& Polynomial::operator+= (const Polynomial& rhs) { m_a0 += rhs.m_a0; m_a1 += rhs.m_a1; return *this; } template Polynomial Polynomial::operator- (const Polynomial& rhs) const { return Polynomial(m_a0 - rhs.m_a0, m_a1 - rhs.m_a1); } template Polynomial& Polynomial::operator-= (const Polynomial& rhs) { m_a0 -= rhs.m_a0; m_a1 -= rhs.m_a1; return *this; } template Polynomial Polynomial::derivative() const { return Polynomial(m_a1); } template bool Polynomial::isNearZero(const T& epsilon) const { return SurgSim::Math::isNearZero(m_a0, epsilon) && SurgSim::Math::isNearZero(m_a1, epsilon); } template bool Polynomial::isApprox(const Polynomial& p, const T& epsilon) const { return ((*this) - p).isNearZero(epsilon); } template T Polynomial::getCoefficient(size_t i) const { switch (i) { case 0: { return m_a0; } case 1: { return m_a1; } default: { return 0; } } } template void Polynomial::setCoefficient(size_t i, const T& value) { SURGSIM_ASSERT(i <= 1) << "Attempting to set a coefficient greater than the polynomial degree"; switch (i) { case 0: { m_a0 = value; break; } case 1: { m_a1 = value; break; } } } // Polynomial of degree 2 template Polynomial::Polynomial() : m_a0(static_cast(0)), m_a1(static_cast(0)), m_a2(static_cast(0)) { } template Polynomial::Polynomial(const T& a0, const T& a1, const T& a2) : m_a0(a0), m_a1(a1), m_a2(a2) { } template T Polynomial::discriminant() const { return m_a1 * m_a1 - static_cast(4) * m_a0 * m_a2; } template T Polynomial::evaluate(const T& x) const { return (m_a2 * x + m_a1) * x + m_a0; } template T Polynomial::operator()(const T& x) const { return evaluate(x); } template T& Polynomial::operator[](const size_t i) { return const_cast(const_cast*>(this)->operator[](i)); } template const T& Polynomial::operator[](const size_t i) const { SURGSIM_ASSERT(i <= 2) << "Attempting to set a coefficient greater than the polynomial degree"; switch (i) { case 0: { return m_a0; } case 1: { return m_a1; } default: { return m_a2; } } } template Polynomial Polynomial::operator- () const { return Polynomial(-m_a0, -m_a1, -m_a2); } template Polynomial Polynomial::operator+ (const Polynomial& rhs) const { return Polynomial(m_a0 + rhs.m_a0, m_a1 + rhs.m_a1, m_a2 + rhs.m_a2); } template Polynomial& Polynomial::operator+= (const Polynomial& rhs) { m_a0 += rhs.m_a0; m_a1 += rhs.m_a1; m_a2 += rhs.m_a2; return *this; } template Polynomial Polynomial::operator- (const Polynomial& rhs) const { return Polynomial(m_a0 - rhs.m_a0, m_a1 - rhs.m_a1, m_a2 - rhs.m_a2); } template Polynomial& Polynomial::operator-= (const Polynomial& rhs) { m_a0 -= rhs.m_a0; m_a1 -= rhs.m_a1; m_a2 -= rhs.m_a2; return *this; } template Polynomial Polynomial::derivative() const { return Polynomial(m_a1, 2 * m_a2); } template bool Polynomial::isNearZero(const T& epsilon) const { return SurgSim::Math::isNearZero(m_a0, epsilon) && SurgSim::Math::isNearZero(m_a1, epsilon) && SurgSim::Math::isNearZero(m_a2, epsilon); } template bool Polynomial::isApprox(const Polynomial& p, const T& epsilon) const { return ((*this) - p).isNearZero(epsilon); } template T Polynomial::getCoefficient(size_t i) const { switch (i) { case 0: { return m_a0; } case 1: { return m_a1; } case 2: { return m_a2; } default: { return 0; } } } template void Polynomial::setCoefficient(size_t i, const T& value) { SURGSIM_ASSERT(i <= 2) << "Attempting to set a coefficient greater than the polynomial degree"; switch (i) { case 0: { m_a0 = value; break; } case 1: { m_a1 = value; break; } case 2: { m_a2 = value; break; } } } // Polynomial of degree 3 template Polynomial::Polynomial() : m_a0(static_cast(0)), m_a1(static_cast(0)), m_a2(static_cast(0)), m_a3(static_cast(0)) { } template Polynomial::Polynomial(const T& a0, const T& a1, const T& a2, const T& a3) : m_a0(a0), m_a1(a1), m_a2(a2), m_a3(a3) { } template T Polynomial::evaluate(const T& x) const { return ((m_a3 * x + m_a2) * x + m_a1) * x + m_a0; } template T Polynomial::operator()(const T& x) const { return evaluate(x); } template T& Polynomial::operator[](const size_t i) { return const_cast(const_cast*>(this)->operator[](i)); } template const T& Polynomial::operator[](const size_t i) const { SURGSIM_ASSERT(i <= 3) << "Attempting to set or access a coefficient greater than the polynomial degree"; switch (i) { case 0: { return m_a0; } case 1: { return m_a1; } case 2: { return m_a2; } default: { return m_a3; } } } template Polynomial Polynomial::operator- () const { return Polynomial(-m_a0, -m_a1, -m_a2, -m_a3); } template Polynomial Polynomial::operator+ (const Polynomial& rhs) const { return Polynomial(m_a0 + rhs.m_a0, m_a1 + rhs.m_a1, m_a2 + rhs.m_a2, m_a3 + rhs.m_a3); } template Polynomial& Polynomial::operator+= (const Polynomial& rhs) { m_a0 += rhs.m_a0; m_a1 += rhs.m_a1; m_a2 += rhs.m_a2; m_a3 += rhs.m_a3; return *this; } template Polynomial Polynomial::operator- (const Polynomial& rhs) const { return Polynomial(m_a0 - rhs.m_a0, m_a1 - rhs.m_a1, m_a2 - rhs.m_a2, m_a3 - rhs.m_a3); } template Polynomial& Polynomial::operator-= (const Polynomial& rhs) { m_a0 -= rhs.m_a0; m_a1 -= rhs.m_a1; m_a2 -= rhs.m_a2; m_a3 -= rhs.m_a3; return *this; } template Polynomial Polynomial::derivative() const { return Polynomial(m_a1, 2 * m_a2, 3 * m_a3); } template bool Polynomial::isNearZero(const T& epsilon) const { return SurgSim::Math::isNearZero(m_a0, epsilon) && SurgSim::Math::isNearZero(m_a1, epsilon) && SurgSim::Math::isNearZero(m_a2, epsilon) && SurgSim::Math::isNearZero(m_a3, epsilon); } template bool Polynomial::isApprox(const Polynomial& p, const T& epsilon) const { return ((*this) - p).isNearZero(epsilon); } template T Polynomial::getCoefficient(size_t i) const { switch (i) { case 0: { return m_a0; } case 1: { return m_a1; } case 2: { return m_a2; } case 3: { return m_a3; } default: { return 0; } } } template void Polynomial::setCoefficient(size_t i, const T& value) { SURGSIM_ASSERT(i <= 3) << "Attempting to set a coefficient greater than the polynomial degree"; switch (i) { case 0: { m_a0 = value; break; } case 1: { m_a1 = value; break; } case 2: { m_a2 = value; break; } case 3: { m_a3 = value; break; } } } // Operators template Polynomial < T, N + M > operator*(const Polynomial& p, const Polynomial& q) { Polynomial < T, N + M > result; for (int i = 0; i <= N + M; ++i) { T coeff = 0; int jMin = std::max(0, i - M); int jMax = std::min(i, N); for (int j = jMin; j <= jMax; ++j) { coeff += p.getCoefficient(j) * q.getCoefficient(i - j); } result.setCoefficient(i, coeff); } return result; } template Polynomial operator*(const Polynomial& p, const Polynomial& q) { const T p0 = p.getCoefficient(0); const T p1 = p.getCoefficient(1); const T q0 = q.getCoefficient(0); const T q1 = q.getCoefficient(1); return Polynomial(p0 * q0, p0 * q1 + p1 * q0, p1 * q1); } template Polynomial operator*(const Polynomial& p, const Polynomial& q) { const T p0 = p.getCoefficient(0); const T p1 = p.getCoefficient(1); const T p2 = p.getCoefficient(2); const T q0 = q.getCoefficient(0); const T q1 = q.getCoefficient(1); return Polynomial(p0 * q0, p0 * q1 + p1 * q0, p1 * q1 + p2 * q0, p2 * q1); } template Polynomial operator*(const Polynomial& p, const Polynomial& q) { const T p0 = p.getCoefficient(0); const T p1 = p.getCoefficient(1); const T q0 = q.getCoefficient(0); const T q1 = q.getCoefficient(1); const T q2 = q.getCoefficient(2); return Polynomial(p0 * q0, p0 * q1 + p1 * q0, p0 * q2 + p1 * q1, p1 * q2); } template Polynomial square(const Polynomial& p) { const T c = p.getCoefficient(0); return Polynomial(c * c); } template Polynomial square(const Polynomial& p) { const T p0 = p.getCoefficient(0); const T p1 = p.getCoefficient(1); return Polynomial(p0 * p0, 2 * p1 * p0, p1 * p1); } template inline std::ostream& operator<<(std::ostream& stream, const Polynomial& p) { stream << "("; for (int i = N; i > 1; --i) { stream << p.getCoefficient(i) << "*x^" << i << " + "; } if (N >= 1) { stream << p.getCoefficient(1) << "*x + "; } stream << p.getCoefficient(0) << ")"; return stream; } }; // Math }; // SurgSim #endif // SURGSIM_MATH_POLYNOMIAL_INL_H opensurgsim-0.7.0/SurgSim/Math/Polynomial.h000066400000000000000000000321671277777236100207030ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_MATH_POLYNOMIAL_H #define SURGSIM_MATH_POLYNOMIAL_H #include namespace SurgSim { namespace Math { namespace { double polynomial_epsilon = 1.0e-09; } /// Define an utility function for comparing individual coefficients to 0. /// /// \tparam T underlying data type used as either the scalar or as the data type /// for the interval /// \param value the value to compare /// \param epsilon the tolerance /// \return true if the value is within epsilon of 0 template bool isNearZero(const T& value, const T& epsilon = static_cast(polynomial_epsilon)); /// Polynomial defines the concept of an N degree polynomial with type T /// coefficients and provides operations on them including arithmetic operations, /// construction, and IO. /// /// \tparam T underlying data type over which the interval is defined. /// \tparam N degree of the Polynomial template class Polynomial { static_assert(N >= 0, "Polynomials must have degree >= 0."); static_assert(N <= 3, "Polynomials of degree > 3 are not yet supported."); }; /// Polynomial specializes the Polynomial class for degree 0 (constant polynomials) /// \sa Polynomial template class Polynomial { public: /// Constructor Polynomial(); /// Constructor /// \param a0 coefficient of the 0 degree term explicit Polynomial(const T& a0); /// Evaluate the polynomial at a point /// \param x point at which to evaluate the polynomial /// \return the value of the polynomial at x T evaluate(const T& x) const; /// Evaluate the polynomial at a point /// \param x point at which to evaluate the polynomial /// \return the value of the polynomial at x T operator()(const T& x) const; /// @{ /// Standard arithmetic operators extended to intervals T& operator[](const size_t i); const T& operator[](const size_t i) const; Polynomial operator- () const; Polynomial operator+ (const Polynomial& rhs) const; Polynomial& operator+= (const Polynomial& rhs); Polynomial operator- (const Polynomial& rhs) const; Polynomial& operator-= (const Polynomial& rhs); /// @} /// \param epsilon the closeness parameter /// \return true if all coefficients of the polynomial are within an epsilon of 0 bool isNearZero(const T& epsilon = static_cast(polynomial_epsilon)) const; /// \param p the test polynomial /// \param epsilon the closeness parameter /// \return true if all the coefficients of the current polynomial are within an epsilon of /// the corresponding coefficient in p bool isApprox(const Polynomial& p, const T& epsilon) const; /// \param i index of the desired coefficient /// \return the value of coefficient i T getCoefficient(size_t i) const; /// Set a specified coefficient to a desired value /// \param i index of the desired coefficient /// \param value the value to be set in the coefficient /// \exception if i is greater than the polynomial degree void setCoefficient(size_t i, const T& value); private: /// @{ /// Coefficient of the polynomial T m_a0; /// @} }; /// Polynomial specializes the Polynomial class for degree 1 (linear polynomials) /// \sa Polynomial template class Polynomial { public: /// Constructor Polynomial(); /// Constructor /// \param a0 coefficient of the 0 degree term /// \param a1 coefficient of the 1 degree term Polynomial(const T& a0, const T& a1); /// Evaluate the polynomial at a point /// \param x point at which to evaluate the polynomial /// \return the value of the polynomial at x T evaluate(const T& x) const; /// Evaluate the polynomial at a point /// \param x point at which to evaluate the polynomial /// \return the value of the polynomial at x T operator()(const T& x) const; /// @{ /// Standard arithmetic operators extended to intervals T& operator[](const size_t i); const T& operator[](const size_t i) const; Polynomial operator- () const; Polynomial operator+ (const Polynomial& rhs) const; Polynomial& operator+= (const Polynomial& rhs); Polynomial operator- (const Polynomial& rhs) const; Polynomial& operator-= (const Polynomial& rhs); /// @} /// \return the derivative of the polynomial Polynomial derivative() const; /// \param epsilon the closeness parameter /// \return true if all coefficients of the polynomial are within an epsilon of 0 bool isNearZero(const T& epsilon = static_cast(polynomial_epsilon)) const; /// \param p the test polynomial /// \param epsilon the closeness parameter /// \return true if all the coefficients of the current polynomial are within an epsilon of /// the corresponding coefficient in p bool isApprox(const Polynomial& p, const T& epsilon) const; /// \param i index of the desired coefficient /// \return the value of coefficient i T getCoefficient(size_t i) const; /// Set a specified coefficient to a desired value /// \param i index of the desired coefficient /// \param value the value to be set in the coefficient /// \exception if i is greater than the polynomial degree void setCoefficient(size_t i, const T& value); private: /// @{ /// Coefficient of the polynomial T m_a0; T m_a1; /// @} }; /// Polynomial specializes the Polynomial class for degree 2 (quadratic polynomials) /// \sa Polynomial template class Polynomial { public: /// Constructor Polynomial(); /// Constructor /// \param a0 coefficient of the 0 degree term /// \param a1 coefficient of the 1 degree term /// \param a2 coefficient of the 2 degree term Polynomial(const T& a0, const T& a1, const T& a2); /// Evaluate the discriminant of a quadratic polynomial /// \return the discriminant (b^2 - a4c) T discriminant() const; /// Evaluate the polynomial at a point /// \param x point at which to evaluate the polynomial /// \return the value of the polynomial at x T evaluate(const T& x) const; /// Evaluate the polynomial at a point /// \param x point at which to evaluate the polynomial /// \return the value of the polynomial at x T operator()(const T& x) const; /// @{ /// Standard arithmetic operators extended to intervals T& operator[](const size_t i); const T& operator[](const size_t i) const; Polynomial operator- () const; Polynomial operator+ (const Polynomial& rhs) const; Polynomial& operator+= (const Polynomial& rhs); Polynomial operator- (const Polynomial& rhs) const; Polynomial& operator-= (const Polynomial& rhs); /// @} /// \return the derivative of the polynomial Polynomial derivative() const; /// \param epsilon the closeness parameter /// \return true if all coefficients of the polynomial are within an epsilon of 0 bool isNearZero(const T& epsilon = static_cast(polynomial_epsilon)) const; /// \param p the test polynomial /// \param epsilon the closeness parameter /// \return true if all the coefficients of the current polynomial are within an epsilon of /// the corresponding coefficient in p bool isApprox(const Polynomial& p, const T& epsilon) const; /// \param i index of the desired coefficient /// \return the value of coefficient i T getCoefficient(size_t i) const; /// Set a specified coefficient to a desired value /// \param i index of the desired coefficient /// \param value the value to be set in the coefficient /// \exception if i is greater than the polynomial degree void setCoefficient(size_t i, const T& value); private: /// @{ /// Coefficient of the polynomial T m_a0; T m_a1; T m_a2; /// @} }; /// Polynomial specializes the Polynomial class for degree 3 (cubic polynomials) /// \sa Polynomial template class Polynomial { public: /// Constructor Polynomial(); /// Constructor /// \param a0 coefficient of the 0 degree term /// \param a1 coefficient of the 1 degree term /// \param a2 coefficient of the 2 degree term /// \param a3 coefficient of the 3 degree term Polynomial(const T& a0, const T& a1, const T& a2, const T& a3); /// Evaluate the polynomial at a point /// \param x point at which to evaluate the polynomial /// \return the value of the polynomial at x T evaluate(const T& x) const; /// Evaluate the polynomial at a point /// \param x point at which to evaluate the polynomial /// \return the value of the polynomial at x T operator()(const T& x) const; /// @{ /// Standard arithmetic operators extended to intervals T& operator[](const size_t i); const T& operator[](const size_t i) const; Polynomial operator- () const; Polynomial operator+ (const Polynomial& rhs) const; Polynomial& operator+= (const Polynomial& rhs); Polynomial operator- (const Polynomial& rhs) const; Polynomial& operator-= (const Polynomial& rhs); /// @} /// \return the derivative of the polynomial Polynomial derivative() const; /// \param epsilon the closeness parameter /// \return true if all coefficients of the polynomial are within an epsilon of 0 bool isNearZero(const T& epsilon = static_cast(polynomial_epsilon)) const; /// \param p the test polynomial /// \param epsilon the closeness parameter /// \return true if all the coefficients of the current polynomial are within an epsilon of /// the corresponding coefficient in p bool isApprox(const Polynomial& p, const T& epsilon) const; /// \param i index of the desired coefficient /// \return the value of coefficient i T getCoefficient(size_t i) const; /// Set a specified coefficient to a desired value /// \param i index of the desired coefficient /// \param value the value to be set in the coefficient /// \exception if i is greater than the polynomial degree void setCoefficient(size_t i, const T& value); private: /// @{ /// Coefficient of the polynomial T m_a0; T m_a1; T m_a2; T m_a3; /// @} }; // Operators /// Multiply two polynomials of arbitrary degree. This current implementation is limited to /// a resulting polynomial of no more than degree 3 (i.e. N + M <= 3) because of limits in the /// underlying polynomial representations. /// \tparam N degree of the first polynomial /// \tparam M degree of the second polynomial /// \tparam T underlying data type over which the interval is defined. /// \param p first polynomial of degree N /// \param q second polynomial of degree M /// \return p * q as a polynomial of degree N + M template Polynomial < T, N + M > operator*(const Polynomial& p, const Polynomial& q); /// Multiply two polynomials of degree 1. /// \tparam T underlying data type over which the interval is defined. /// \param p first polynomial of degree 1 /// \param q second polynomial of degree 1 /// \return p * q as a polynomial of degree 2 template Polynomial operator*(const Polynomial& p, const Polynomial& q); /// Multiply two polynomials of degree 2 and 1 respectively. /// \tparam T underlying data type over which the interval is defined. /// \param p first polynomial of degree 2 /// \param q second polynomial of degree 1 /// \return p * q as a polynomial of degree 3 template Polynomial operator*(const Polynomial& p, const Polynomial& q); /// Multiply two polynomials of degree 1 and 2 respectively. /// \tparam T underlying data type over which the interval is defined. /// \param p first polynomial of degree 1 /// \param q second polynomial of degree 2 /// \return p * q as a polynomial of degree 3 template Polynomial operator*(const Polynomial& p, const Polynomial& q); /// Square a degree 0 polynomial /// \tparam T underlying data type over which the interval is defined. /// \param p polynomial of degree 0 /// \return p^2 as a polynomial of degree 0 template Polynomial square(const Polynomial& p); /// Square a degree 1 polynomial /// \tparam T underlying data type over which the interval is defined. /// \param p polynomial of degree 1 /// \return p^2 as a polynomial of degree 2 template Polynomial square(const Polynomial& p); /// Write a textual version of a Polynomial to an output stream /// \tparam T underlying type of the polynomial coefficients /// \tparam N degree of the polynomial /// \param stream the ostream to be written to /// \param p the polynomial to write /// \return the active stream template std::ostream& operator<<(std::ostream& stream, const Polynomial& p); }; // Math }; // SurgSim #include "SurgSim/Math/Polynomial-inl.h" #endif // SURGSIM_MATH_POLYNOMIAL_H opensurgsim-0.7.0/SurgSim/Math/PolynomialRoots-inl.h000066400000000000000000000070431277777236100225050ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_MATH_POLYNOMIALROOTS_INL_H #define SURGSIM_MATH_POLYNOMIALROOTS_INL_H namespace SurgSim { namespace Math { // PolynomialRootsCommon template bool PolynomialRootsCommon::isDegenerate() const { return m_numRoots == DEGENERATE; } template int PolynomialRootsCommon::getNumRoots() const { return m_numRoots; } template T PolynomialRootsCommon::operator[](const int i) const { SURGSIM_ASSERT((m_numRoots > i) && (i >= 0)) << "Requesting a root beyond the number of roots available for this polynomial, " << "or a root with a negative index."; return m_roots[i]; } // roots of an degree-1 polynomial (linear) template PolynomialRoots::PolynomialRoots(const Polynomial& p, const T& epsilon) { solve(p.getCoefficient(1), p.getCoefficient(0), static_cast(epsilon), &(this->m_numRoots), &(this->m_roots)); } // roots of an degree-2 polynomial (quadratic) template PolynomialRoots::PolynomialRoots(const Polynomial& p, const T& epsilon) { solve(p.getCoefficient(2), p.getCoefficient(1), p.getCoefficient(0), static_cast(epsilon), &(this->m_numRoots), &(this->m_roots)); } // Utilities: Solve for roots of linear equation a * x + b = y template void solve(const T& a, const T& b, const T& epsilon, int* numRoots, std::array* roots) { static_assert(N >= 1, "Root array is not large enough to hold the roots of the polynomial"); if (isNearZero(a, epsilon)) { // The "1-st degree polynomial" is really close to a constant. // If the constant is zero, there are infinitely many solutions; otherwise there are zero. if (isNearZero(b, epsilon)) { *numRoots = PolynomialRootsCommon::DEGENERATE; // infinitely many solutions } else { *numRoots = 0; } } else { *numRoots = 1; (*roots)[0] = -b / a; } } // Utilities: Solve for roots of quadratic equation a * x^2 + b * x + c = y template void solve(const T& a, const T& b, const T& c, const T& epsilon, int* numRoots, std::array* roots) { static_assert(N >= 2, "Root array is not large enough to hold the roots of the polynomial"); if (isNearZero(a, epsilon)) { // The "2nd degree polynomial" is really (close to) 1st degree or less. // We can delegate the solution in this case. solve(b, c, epsilon, numRoots, roots); return; } T discriminant = b * b - 4.0 * a * c; if (discriminant > epsilon) { *numRoots = 2; T sqrtDiscriminant = sqrt(discriminant); (*roots)[0] = (-b - sqrtDiscriminant) / (2 * a); (*roots)[1] = (-b + sqrtDiscriminant) / (2 * a); if ((*roots)[0] > (*roots)[1]) { std::swap((*roots)[0], (*roots)[1]); } } else if (discriminant > -epsilon) { *numRoots = 1; (*roots)[0] = -b / (2 * a); } else { *numRoots = 0; } } }; // Math }; // SurgSim #endif // SURGSIM_MATH_POLYNOMIALROOTS_INL_H opensurgsim-0.7.0/SurgSim/Math/PolynomialRoots.h000066400000000000000000000123701277777236100217240ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_MATH_POLYNOMIALROOTS_H #define SURGSIM_MATH_POLYNOMIALROOTS_H #include #include #include "SurgSim/Math/Polynomial.h" namespace SurgSim { namespace Math { /// The (algebraic) roots of a Polynomial. /// If all coefficients of a polynomial are 0, the roots are degenerate: the polynomial equals 0 for any x. /// Otherwise, there may be anywhere between 0 and N roots. /// /// \tparam T type of the coefficients and computations /// \tparam N degree of the polynomial for which roots are being calculated /// \sa PolynomialRootsCommon template class PolynomialRoots; /// The common base class for PolynomialRoots specializations for various N. /// /// \tparam T type of the coefficients and computations /// \tparam N degree of the polynomial for which roots are being calculated /// \sa PolynomialRoots template class PolynomialRootsCommon { public: /// Indicator for a degenerate polynomial (infinite number of roots). static const int DEGENERATE = -1; /// \return true in the polynomial is degenerate bool isDegenerate() const; /// \return the number of available roots or DEGENERATE if there are infinitely many int getNumRoots() const; /// Read only access to the roots of the polynomial /// \param i is the number of the root to return /// \return the value of the ith root /// \exception if there is no root of rank i /// \note The roots are ordered ascendingly, so PolynomialRootsCommon[0] < PolynomialRootsCommon[1] < ... T operator[](int i) const; private: /// @{ /// Prohibit copying and assignment. PolynomialRootsCommon(const PolynomialRootsCommon&); PolynomialRootsCommon& operator=(const PolynomialRootsCommon&); /// @} protected: /// Constructor. Since the constructor must define the roots, only allow construction from a derived class PolynomialRootsCommon() {} /// The number of roots available for the polynomial, or DEGENERATE if there are infinite roots int m_numRoots; /// An array of up to N roots for a degree N polynomial ordered ascendingly std::array m_roots; }; /// PolynomialRoots specializes the PolynomialRoots class for degree 1 (linear polynomials) /// \sa PolynomialRoots template class PolynomialRoots : public PolynomialRootsCommon { public: /// Constructor /// \param p the degree 1 polynomial for which the roots are to be calculated /// \param epsilon tolerance parameter for determining the number of valid, unique roots explicit PolynomialRoots(const Polynomial& p, const T& epsilon = 1.0e-09); }; /// PolynomialRoots specializes the PolynomialRoots class for degree 2 (quadratic polynomials) /// \sa PolynomialRoots template class PolynomialRoots : public PolynomialRootsCommon { public: /// Constructor /// \param p the degree 2 polynomial for which the roots are to be calculated /// \param epsilon tolerance parameter for determining the number of valid, unique roots explicit PolynomialRoots(const Polynomial& p, const T& epsilon = 1.0e-09); }; /// Specialized solve routine for linear polynomials (2 coefficients) /// \tparam N maximum number of roots that can be stored /// \tparam T type of the coefficients and computations /// \param a coefficient of the linear term /// \param b coefficient of the constant term /// \param epsilon tolerance parameter for determining the number of valid, unique roots /// \param numRoots [out] number of roots calculated, or DEGENERATE if there are infinitely many /// \param roots [out] array containing the calculated roots ordered ascendingly /// \exception if there are more than N roots template void solve(const T& a, const T& b, const T& epsilon, int* numRoots, std::array* roots); /// Specialized solve routine for quadratic polynomials (3 coefficients) /// \tparam N maximum number of roots that can be stored /// \tparam T type of the coefficients and computations /// \param a coefficient of the square term /// \param b coefficient of the linear term /// \param c coefficient of the constant term /// \param epsilon tolerance parameter for determining the number of valid, unique roots /// \param numRoots [out] number of roots calculated, or DEGENERATE if there are infinitely many /// \param roots [out] array containing the calculated roots ordered ascendingly /// \exception if there are more than N roots template void solve(const T& a, const T& b, const T& c, const T& epsilon, int* numRoots, std::array* roots); }; // Math }; // SurgSim #include "SurgSim/Math/PolynomialRoots-inl.h" #endif // SURGSIM_MATH_POLYNOMIALROOTS_H opensurgsim-0.7.0/SurgSim/Math/PolynomialValues-inl.h000066400000000000000000000104321277777236100226320ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_MATH_POLYNOMIALVALUES_INL_H #define SURGSIM_MATH_POLYNOMIALVALUES_INL_H namespace SurgSim { namespace Math { template PolynomialValues::PolynomialValues(const Polynomial& p) : m_polynomial(p) { } template const Polynomial& PolynomialValues::getPolynomial() const { return m_polynomial; } template Interval PolynomialValues::valuesOverInterval(const Interval&) const { return Interval(m_polynomial.evaluate(0), m_polynomial.evaluate(0)); } template PolynomialValues::PolynomialValues(const Polynomial& p) : m_polynomial(p) {} template const Polynomial& PolynomialValues::getPolynomial() const { return m_polynomial; } template Interval PolynomialValues::valuesOverInterval(const Interval& interval) const { return Interval::minToMax(m_polynomial.evaluate(interval.getMin()), m_polynomial.evaluate(interval.getMax())); } template PolynomialValues::PolynomialValues(const Polynomial& p) : m_polynomial(p), m_derivative(m_polynomial.derivative()), m_locationOfExtremum(m_derivative) { } template const Polynomial& PolynomialValues::getPolynomial() const { return m_polynomial; } template const Polynomial& PolynomialValues::getDerivative() const { return m_derivative; } template const PolynomialRoots& PolynomialValues::getLocationsOfExtrema() const { return m_locationOfExtremum; } template Interval PolynomialValues::valuesOverInterval(const Interval& interval) const { // Always consider the endpoints. Interval result = Interval::minToMax(m_polynomial.evaluate(interval.getMin()), m_polynomial.evaluate(interval.getMax())); if (m_locationOfExtremum.getNumRoots() > 0) { // There is an extremum (min or max)... if (interval.contains(m_locationOfExtremum[0])) { //...and it occurs somewhere in the middle of the interval. // The value at the extremum needs to be made a part of the result interval. result.extendToInclude(m_polynomial.evaluate(m_locationOfExtremum[0])); } } return result; } template PolynomialValues::PolynomialValues(const Polynomial& p) : m_polynomial(p), m_derivative(m_polynomial.derivative()), m_locationOfExtremum(m_derivative) { } template const Polynomial& PolynomialValues::getPolynomial() const { return m_polynomial; } template const Polynomial& PolynomialValues::getDerivative() const { return m_derivative; } template const PolynomialRoots& PolynomialValues::getLocationsOfExtrema() const { return m_locationOfExtremum; } template Interval PolynomialValues::valuesOverInterval(const Interval& interval) const { // Always consider the endpoints. Interval result = Interval::minToMax(m_polynomial.evaluate(interval.getMin()), m_polynomial.evaluate(interval.getMax())); for (int i = 0; i < m_locationOfExtremum.getNumRoots(); ++i) { // There is an extremum (min or max)... if (interval.contains(m_locationOfExtremum[i])) { //...and it occurs somewhere in the middle of the interval. // The value at the extremum needs to be made a part of the result interval. result.extendToInclude(m_polynomial.evaluate(m_locationOfExtremum[i])); } } return result; } template Interval valuesOverInterval(const Polynomial& p, const Interval& interval) { return PolynomialValues(p).valuesOverInterval(interval); } }; // Math }; // SurgSim #endif // SURGSIM_MATH_POLYNOMIALVALUES_INL_H opensurgsim-0.7.0/SurgSim/Math/PolynomialValues.h000066400000000000000000000135021277777236100220530ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_MATH_POLYNOMIALVALUES_H #define SURGSIM_MATH_POLYNOMIALVALUES_H #include "SurgSim/Math/Polynomial.h" #include "SurgSim/Math/PolynomialRoots.h" #include "SurgSim/Math/IntervalArithmetic.h" #include "SurgSim/Math/MinMax.h" namespace SurgSim { namespace Math { /// Class to manage polynomial based calculations of interval boundaries. /// /// \tparam T type of the coefficients and computations /// \tparam N degree of the polynomial being managed template class PolynomialValues; /// PolynomialValues specializes the PolynomialValues class for degree 0 (constant polynomials) /// \sa PolynomialValues template class PolynomialValues { public: /// Constructor. Initialize based on the polynomial p /// \param p polynomial on which the value calculations are based explicit PolynomialValues(const Polynomial& p); /// \return the polynomial basis of this calculation const Polynomial& getPolynomial() const; /// \param interval an interval on the independent variable over which the /// values are to be calculated /// \return the minimum and maximum polynomial values over interval Interval valuesOverInterval(const Interval& interval) const; private: /// The polynomial under consideration Polynomial m_polynomial; }; /// PolynomialValues specializes the PolynomialValues class for degree 1 (linear polynomials) /// \sa PolynomialValues template class PolynomialValues { public: /// Constructor. Initialize based on the polynomial p /// \param p polynomial on which the value calculations are based explicit PolynomialValues(const Polynomial& p); /// \return the polynomial basis of this calculation const Polynomial& getPolynomial() const; /// \param interval an interval on the independent variable over which the /// values are to be calculated /// \return the minimum and maximum polynomial values over interval Interval valuesOverInterval(const Interval& interval) const; private: /// The polynomial under consideration Polynomial m_polynomial; }; /// PolynomialValues specializes the PolynomialValues class for degree 2 (quadratic polynomials) /// \sa PolynomialValues template class PolynomialValues { public: /// Constructor. Initialize based on the polynomial p /// \param p polynomial on which the value calculations are based explicit PolynomialValues(const Polynomial& p); /// \return the polynomial basis of this calculation const Polynomial& getPolynomial() const; /// \return the derivative of the polynomial basis for this calculation const Polynomial& getDerivative() const; /// \return the locations of the extrema for the polynomial const PolynomialRoots& getLocationsOfExtrema() const; /// \param interval an interval on the independent variable over which the /// values are to be calculated /// \return the minimum and maximum polynomial values over interval Interval valuesOverInterval(const Interval& interval) const; private: /// The polynomial under consideration Polynomial m_polynomial; /// Cached version of the derivative of the polynomial Polynomial m_derivative; /// Cached version of the locations of the extrema PolynomialRoots m_locationOfExtremum; }; /// PolynomialValues specializes the PolynomialValues class for degree 3 (cubic polynomials) /// \sa PolynomialValues template class PolynomialValues { public: /// Constructor. Initialize based on the polynomial p /// \param p polynomial on which the value calculations are based explicit PolynomialValues(const Polynomial& p); /// \return the polynomial basis of this calculation const Polynomial& getPolynomial() const; /// \return the derivative of the polynomial basis for this calculation const Polynomial& getDerivative() const; /// \return the locations of the extrema for the polynomial const PolynomialRoots& getLocationsOfExtrema() const; /// \param interval an interval on the independent variable over which the /// values are to be calculated /// \return the minimum and maximum polynomial values over interval Interval valuesOverInterval(const Interval& interval) const; private: /// The polynomial under consideration Polynomial m_polynomial; /// Cached version of the derivative of the polynomial Polynomial m_derivative; /// Cached version of the locations of the extrema PolynomialRoots m_locationOfExtremum; }; /// Calculate the minimum and maximum values of the dependent variable over a specified /// range of the independent variable /// \tparam N degree of the polynomial being managed /// \tparam T type of the coefficients and computations /// \param p polynomial on which the value calculations are based /// \param interval an interval on the independent variable over which the /// values are to be calculated /// \return the minimum and maximum polynomial values over interval template Interval valuesOverInterval(const Polynomial& p, const Interval& interval); }; // Math }; // SurgSim #include "SurgSim/Math/PolynomialValues-inl.h" #endif // SURGSIM_MATH_POLYNOMIALVALUES_H opensurgsim-0.7.0/SurgSim/Math/Quaternion.h000066400000000000000000000146161277777236100207040ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Definitions of quaternion types. #ifndef SURGSIM_MATH_QUATERNION_H #define SURGSIM_MATH_QUATERNION_H #include #include #include namespace SurgSim { namespace Math { /// A quaternion of floats. /// This type (and any structs that contain it) can be safely allocated via new. typedef Eigen::Quaternion Quaternionf; /// A quaternion of doubles. /// This type (and any structs that contain it) can be safely allocated via new. typedef Eigen::Quaternion Quaterniond; /// Create a quaternion rotation corresponding to the specified angle (in radians) and axis. /// \tparam T the numeric data type used for arguments and the return value. Can usually be deduced. /// \tparam VOpt the option flags (alignment etc.) used for the axis vector argument. Can be deduced. /// \param angle the angle of the rotation, in radians. /// \param axis the axis of the rotation. /// \returns the rotation quaternion. template inline Eigen::Quaternion makeRotationQuaternion(const T& angle, const Eigen::Matrix& axis) { return Eigen::Quaternion(Eigen::AngleAxis(angle, axis)); } /// Quaternion negation (i.e. unary operator -) /// \tparam T the numeric data type used for arguments and the return value. Can usually be deduced. /// \tparam QOpt the option flags (alignment etc.) used for the quaternion arguments. Can be deduced. /// \param q The quaternion to negate /// \returns the negation of q (i.e. -q) template inline Eigen::Quaternion negate(const Eigen::Quaternion& q) { return Eigen::Quaternion(q.coeffs() * -1.0); } /// Get the angle (in radians) and axis corresponding to a quaternion's rotation. /// \note Unit quaternions cover the unit sphere twice (q=-q). To make sure that the same rotation (q or -q) /// \note returns the same Axis/Angle, we need a pi range for the angle. /// \note We choose to enforce half the angle in the quadrant [0 +pi/2], which leads to an output angle in [0 +pi]. /// \tparam T the numeric data type used for arguments and the return value. Can usually be deduced. /// \tparam QOpt the option flags (alignment etc.) used for the quaternion argument. Can be deduced. /// \tparam VOpt the option flags (alignment etc.) used for the axis vector argument. Can be deduced. /// \param quaternion the rotation quaternion to inspect. /// \param [out] angle the angle of the rotation in [0 +pi], in radians. /// \param [out] axis the axis of the rotation. template inline void computeAngleAndAxis(const Eigen::Quaternion& quaternion, T* angle, Eigen::Matrix* axis) { using SurgSim::Math::negate; if (quaternion.w() >= T(0)) { Eigen::AngleAxis angleAxis(quaternion); *angle = angleAxis.angle(); *axis = angleAxis.axis(); } else { Eigen::AngleAxis angleAxis(negate(quaternion)); *angle = angleAxis.angle(); *axis = angleAxis.axis(); } } /// Get the angle corresponding to a quaternion's rotation, in radians. /// \tparam T the numeric data type used for arguments and the return value. Can usually be deduced. /// \tparam QOpt the option flags (alignment etc.) used for the quaternion argument. Can be deduced. /// \param quaternion the rotation quaternion to inspect. /// \returns the angle of the rotation within [0 +pi], in radians. template inline T computeAngle(const Eigen::Quaternion& quaternion) { using SurgSim::Math::negate; if (quaternion.w() >= T(0)) { Eigen::AngleAxis angleAxis(quaternion); return angleAxis.angle(); } else { Eigen::AngleAxis angleAxis(negate(quaternion)); return angleAxis.angle(); } } /// Get the vector corresponding to the rotation between transforms. /// \tparam T the numeric data type used for arguments and the return value. Can usually be deduced. /// \tparam TOpt the option flags (alignment etc.) used for the transform arguments. Can be deduced. /// \tparam VOpt the option flags (alignment etc.) used for the vector argument. Can be deduced. /// \param end the transform after the rotation. /// \param start the transform before the rotation. /// \param[out] rotationVector a vector describing the rotation. template void computeRotationVector(const Eigen::Transform& end, const Eigen::Transform& start, Eigen::Matrix* rotationVector) { Eigen::Quaternion q1(end.linear()); Eigen::Quaternion q2(start.linear()); double angle; Eigen::Matrix axis; computeAngleAndAxis((q1 * q2.inverse()).normalized(), &angle, &axis); *rotationVector = angle * axis; } /// Interpolate (slerp) between 2 quaternions /// \tparam T the numeric data type used for arguments and the return value. Can usually be deduced. /// \tparam QOpt the option flags (alignment etc.) used for the quaternion arguments. Can be deduced. /// \param q0 The start quaternion (at time 0.0). /// \param q1 The end quaternion (at time 1.0). /// \param t The interpolation time requested. Within [0..1]. /// \returns the quaternion resulting in the slerp interpolation at time t, between q0 and q1. /// \note t=0 => returns either q0 or -q0 /// \note t=1 => returns either q1 or -q1 /// \note 'Interpolate' has been created because slerp might not be enough in certain cases. /// This gives room for correction and special future treatment template inline Eigen::Quaternion interpolate(const Eigen::Quaternion& q0, const Eigen::Quaternion& q1, T t) { Eigen::Quaternion result; result = q0.slerp(t, q1); return result; } }; // namespace Math }; // namespace SurgSim #endif // SURGSIM_MATH_QUATERNION_H opensurgsim-0.7.0/SurgSim/Math/RigidTransform.h000066400000000000000000000154601277777236100215070ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Definitions of 2x2 and 3x3 rigid (isometric) transforms. #ifndef SURGSIM_MATH_RIGIDTRANSFORM_H #define SURGSIM_MATH_RIGIDTRANSFORM_H #include #include #include "SurgSim/Math/Quaternion.h" namespace SurgSim { namespace Math { /// A 2D rigid (isometric) transform, represented as floats. /// This type (and any struct that contain it) can be safely allocated via new. typedef Eigen::Transform RigidTransform2f; /// A 3D rigid (isometric) transform, represented as floats. /// This type (and any struct that contain it) can be safely allocated via new. typedef Eigen::Transform RigidTransform3f; /// A 2D rigid (isometric) transform, represented as doubles. /// This type (and any struct that contain it) can be safely allocated via new. typedef Eigen::Transform RigidTransform2d; /// A 3D rigid (isometric) transform, represented as doubles. /// This type (and any struct that contain it) can be safely allocated via new. typedef Eigen::Transform RigidTransform3d; /// Create a rigid transform using the specified rotation matrix and translation. /// \tparam M the type used to describe the rotation matrix. Can usually be deduced. /// \tparam V the type used to describe the translation vector. Can usually be deduced. /// \param rotation the rotation matrix. /// \param translation the translation vector. /// \returns the transform with the specified rotation and translation. template inline Eigen::Transform makeRigidTransform( const Eigen::MatrixBase& rotation, const Eigen::MatrixBase& translation) { Eigen::Transform rigid; rigid.makeAffine(); rigid.linear() = rotation; rigid.translation() = translation; return rigid; } /// Create a rigid transform using the specified rotation quaternion and translation. /// \tparam Q the type used to describe the rotation quaternion. Can usually be deduced. /// \tparam V the type used to describe the translation vector. Can usually be deduced. /// \param rotation the rotation quaternion. /// \param translation the translation vector. /// \returns the transform with the specified rotation and translation. template inline Eigen::Transform makeRigidTransform( const Eigen::QuaternionBase& rotation, const Eigen::MatrixBase& translation) { Eigen::Transform rigid; rigid.makeAffine(); rigid.linear() = rotation.matrix(); rigid.translation() = translation; return rigid; } /// Make a rigid transform from a eye point a center view point and an up direction, does not check whether up is /// colinear with eye-center /// The original formula can be found at /// http://www.opengl.org/sdk/docs/man2/xhtml/gluLookAt.xml /// \tparam typename T T the numeric data type used for arguments and the return value. Can usually be deduced. /// \tparam int VOpt VOpt the option flags (alignment etc.) used for the axis vector argument. Can be deduced. /// \param position The position of the object. /// \param center The point to which the object should point. /// \param up The up vector to be used for this calculation. /// \return a RigidTransform that locates the object at position rotated into the direction of center. template inline Eigen::Transform makeRigidTransform( const Eigen::Matrix& position, const Eigen::Matrix& center, const Eigen::Matrix& up) { Eigen::Transform rigid; rigid.makeAffine(); Eigen::Matrix forward = (center - position).normalized(); Eigen::Matrix side = (forward.cross(up)).normalized(); Eigen::Matrix actualUp = side.cross(forward).normalized(); typename Eigen::Transform::LinearMatrixType rotation; rotation << side[0], actualUp[0], -forward[0], side[1], actualUp[1], -forward[1], side[2], actualUp[2], -forward[2]; rigid.linear() = rotation; rigid.translation() = position; return rigid; } /// Create a rigid transform using the identity rotation and the specified translation. /// \tparam V the type used to describe the translation vector. Can usually be deduced. /// \param translation the translation vector. /// \returns the transform with the identity rotation and the specified translation. template inline Eigen::Transform makeRigidTranslation( const Eigen::MatrixBase& translation) { EIGEN_STATIC_ASSERT_VECTOR_ONLY(Eigen::MatrixBase); Eigen::Transform rigid; rigid.makeAffine(); rigid.linear().setIdentity(); rigid.translation() = translation; return rigid; } /// Interpolate (slerp) between 2 rigid transformations /// \tparam T the numeric data type used for arguments and the return value. Can usually be deduced. /// \tparam TOpt the option flags (alignment etc.) used for the Transform arguments. Can be deduced. /// \param t0 The start transform (at time 0.0). /// \param t1 The end transform (at time 1.0). /// \param t The interpolation time requested. Within [0..1]. /// \returns the transform resulting in the slerp interpolation at time t, between t0 and t1. /// \note t=0 => returns t0 /// \note t=1 => returns t1 template inline Eigen::Transform interpolate( const Eigen::Transform& t0, const Eigen::Transform& t1, T t) { Eigen::Transform transform; transform.makeAffine(); transform.translation() = t0.translation() * (static_cast(1.0) - t) + t1.translation() * t; { Eigen::Quaternion q0(t0.linear()); Eigen::Quaternion q1(t1.linear()); q0.normalize(); q1.normalize(); transform.linear() = interpolate(q0, q1, t).matrix(); } return transform; } }; // namespace Math }; // namespace SurgSim #endif // SURGSIM_MATH_RIGIDTRANSFORM_H opensurgsim-0.7.0/SurgSim/Math/Scalar-inl.h000066400000000000000000000021401277777236100205310ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_MATH_SCALAR_INL_H #define SURGSIM_MATH_SCALAR_INL_H #include "SurgSim/Framework/Assert.h" namespace SurgSim { namespace Math { template T clamp(T value, T min, T max, T epsilon) { return (value >= (max - epsilon) ? max : (value <= (min + epsilon) ? min : value)); } template const T clampOperator::operator()(const T& x) const { return clamp(x, m_min, m_max, m_epsilon); } }; }; #endif // SURGSIM_MATH_SCALAR_INL_H opensurgsim-0.7.0/SurgSim/Math/Scalar.h000066400000000000000000000052051277777236100177560ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_MATH_SCALAR_H #define SURGSIM_MATH_SCALAR_H namespace SurgSim { namespace Math { /// Clamp any values within an epsilon window to a maximum or minimum value. /// \note max is tested first, so if the value < min + epsilon and value > /// max - epsilon, value will be set to max. /// \tparam T underlying type /// \param value [in/out] the value to be clamped /// \param min the minimum value for the clamp /// \param max the maximum value for the clamp /// \param epsilon definition of the epsilon window. template T clamp(T value, T min, T max, T epsilon); /// define a custom template unary functor to execute the clamp operation /// over an Eigen matrix structure. The operation clamps based on an epsilon /// interval. For values outside the interval min to max, the clamp proceeds /// as expected. However, values within the interval that lie within epsilon /// of an endpoint are also clamped to th endpoint. /// /// \tparam T the type over which the operator is defined. template class clampOperator { public: /// Constructor. /// /// \param min minimum value for the clamp interval /// \param max maximum value for the clamp interval /// \param epsilon values within epsilon of an interval endpoint /// are clamped to the interval regardless of if they are within the interval or not clampOperator(const T& min, const T& max, const T& epsilon) : m_min(min), m_max(max), m_epsilon(epsilon) {} /// Execute the clamp operator /// \param x the value to clamp based /// \return the x clamped using the minimum, maximum and epsilon specified in he class constructor const T operator()(const T& x) const; private: /// The minimum value of the interval T m_min; /// The maximum value of the interval T m_max; /// The closeness parameter for the clamp. Values within epsilon of an interval endpoint /// are clamped to the interval regardless of if they are within the interval or not T m_epsilon; }; }; }; #include "SurgSim/Math/Scalar-inl.h" #endif // SURGSIM_MATH_SCALAR_H opensurgsim-0.7.0/SurgSim/Math/SegmentMeshShape-inl.h000066400000000000000000000021621277777236100225300ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // #ifndef SURGSIM_MATH_SEGMENTMESHSHAPE_INL_H #define SURGSIM_MATH_SEGMENTMESHSHAPE_INL_H namespace SurgSim { namespace Math { template SegmentMeshShape::SegmentMeshShape( const SurgSim::DataStructures::SegmentMesh& mesh, double radius) : SurgSim::DataStructures::SegmentMeshPlain(mesh) { setRadius(radius); updateAabbTree(); } }; // namespace Math }; // namespace SurgSim #endif // SURGSIM_MATH_SEGMENTMESHSHAPE_INL_H opensurgsim-0.7.0/SurgSim/Math/SegmentMeshShape.cpp000066400000000000000000000105261277777236100223060ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // #include "SurgSim/Math/SegmentMeshShape.h" #include "SurgSim/DataStructures/AabbTree.h" #include "SurgSim/DataStructures/AabbTreeData.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Math/Geometry.h" #include "SurgSim/Math/SegmentMeshShapePlyReaderDelegate.h" namespace SurgSim { namespace Math { SURGSIM_REGISTER(SurgSim::Math::Shape, SurgSim::Math::SegmentMeshShape, SegmentMeshShape); SegmentMeshShape::SegmentMeshShape() { setRadius(0.001); updateAabbTree(); } SegmentMeshShape::SegmentMeshShape(const SegmentMeshShape& other) : DataStructures::SegmentMeshPlain(other) { setRadius(other.m_radius); updateAabbTree(); } int SegmentMeshShape::getType() const { return SHAPE_TYPE_SEGMENTMESH; } double SegmentMeshShape::getVolume() const { SURGSIM_ASSERT("SegmentMeshShape: Volume calculation not implemented."); return std::numeric_limits::quiet_NaN(); } Vector3d SegmentMeshShape::getCenter() const { SURGSIM_ASSERT("SegmentMeshShape: Center calculation not implemented."); return Vector3d::Constant(std::numeric_limits::quiet_NaN()); } Matrix33d SegmentMeshShape::getSecondMomentOfVolume() const { SURGSIM_ASSERT("SegmentMeshShape: Second Moment Of Volume calculation not implemented."); return Matrix33d::Constant(std::numeric_limits::quiet_NaN()); } bool SegmentMeshShape::isValid() const { // If the radius is less than DistanceEpsilon, the collision detection (which assumes the segments are capsules), /// will not work correctly. return (m_radius >= Geometry::DistanceEpsilon && m_segmentEndBoundingBoxHalfExtent.isApprox(Vector3d(m_radius, m_radius, m_radius))); } void SegmentMeshShape::setRadius(double radius) { m_radius = radius; m_segmentEndBoundingBoxHalfExtent = Vector3d(m_radius, m_radius, m_radius); } double SegmentMeshShape::getRadius() const { return m_radius; } bool SegmentMeshShape::doUpdate() { updateAabbTree(); return true; } bool SegmentMeshShape::doLoad(const std::string& fileName) { DataStructures::PlyReader reader(fileName); if (!reader.isValid()) { SURGSIM_LOG_SEVERE(SurgSim::Framework::Logger::getDefaultLogger()) << "'" << fileName << "' is an invalid .ply file."; return false; } auto delegate = std::make_shared( std::dynamic_pointer_cast(this->shared_from_this())); if (!reader.parseWithDelegate(delegate)) { SURGSIM_LOG_SEVERE(SurgSim::Framework::Logger::getDefaultLogger()) << "The input file '" << fileName << "' does not have the property required by segment mesh."; return false; } return true; } std::shared_ptr SegmentMeshShape::getAabbTree() const { return m_aabbTree; } std::shared_ptr SegmentMeshShape::getTransformed(const RigidTransform3d& pose) const { auto transformed = std::make_shared(*this); transformed->transform(pose); transformed->update(); return transformed; } void SegmentMeshShape::updateAabbTree() { m_aabbTree = std::make_shared(); std::list items; auto const& edges = getEdges(); for (size_t id = 0; id < edges.size(); ++id) { if (edges[id].isValid) { const auto& vertices = getEdgePositions(id); Aabbd aabb((vertices[0] - m_segmentEndBoundingBoxHalfExtent).eval()); aabb.extend((vertices[0] + m_segmentEndBoundingBoxHalfExtent).eval()); aabb.extend((vertices[1] - m_segmentEndBoundingBoxHalfExtent).eval()); aabb.extend((vertices[1] + m_segmentEndBoundingBoxHalfExtent).eval()); items.emplace_back(aabb, id); } } m_aabbTree->set(std::move(items)); m_aabb = m_aabbTree->getAabb(); } bool SegmentMeshShape::isTransformable() const { return true; } }; // namespace Math }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Math/SegmentMeshShape.h000066400000000000000000000061621277777236100217540ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_MATH_SEGMENTMESHSHAPE_H #define SURGSIM_MATH_SEGMENTMESHSHAPE_H #include "SurgSim/DataStructures/AabbTree.h" #include "SurgSim/DataStructures/SegmentMesh.h" #include "SurgSim/Framework/ObjectFactory.h" #include "SurgSim/Math/Geometry.h" #include "SurgSim/Math/Shape.h" namespace SurgSim { namespace Math { SURGSIM_STATIC_REGISTRATION(SegmentMeshShape); /// SegmentMeshShape defines a shape based on a mesh, like MeshShape. /// But, unlike MeshShape, the mesh does not have any triangle topology. It only consists of edges. /// /// \sa MeshShape class SegmentMeshShape : public Shape, public DataStructures::SegmentMeshPlain { public: /// Constructor SegmentMeshShape(); /// Copy constructor /// \param other The SegmentMeshShape to be copied from explicit SegmentMeshShape(const SegmentMeshShape& other); /// Constructor /// \param mesh The segment mesh to build the shape from /// \param radius The radius associated to this surface mesh /// \note The default radius is positive EPSILON to be relevant in collision detection calculations. template explicit SegmentMeshShape(const DataStructures::SegmentMesh& mesh, double radius = Geometry::DistanceEpsilon); SURGSIM_CLASSNAME(SurgSim::Math::SegmentMeshShape); int getType() const override; double getVolume() const override; Vector3d getCenter() const override; Matrix33d getSecondMomentOfVolume() const override; bool isValid() const override; /// \param radius The radius of the segments. void setRadius(double radius); /// \return The radius of the segments. double getRadius() const; /// \return The object's associated AabbTree std::shared_ptr getAabbTree() const; bool isTransformable() const override; std::shared_ptr getTransformed(const RigidTransform3d& pose) const override; protected: bool doUpdate() override; bool doLoad(const std::string& fileName) override; /// Update the AabbTree, which is an axis-aligned bounding box r-tree used to accelerate spatial searches void updateAabbTree(); private: /// Segment radius double m_radius; /// The aabb tree used to accelerate collision detection against the mesh std::shared_ptr m_aabbTree; /// Half extent of the AABB of the sphere at one of the segment end. Vector3d m_segmentEndBoundingBoxHalfExtent; }; } // Math } // SurgSim #include "SurgSim/Math/SegmentMeshShape-inl.h" #endif // SURGSIM_MATH_SEGMENTMESHSHAPE_H opensurgsim-0.7.0/SurgSim/Math/SegmentMeshShapePlyReaderDelegate.cpp000066400000000000000000000046521277777236100255540ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Math/SegmentMeshShapePlyReaderDelegate.h" namespace SurgSim { namespace Math { SegmentMeshShapePlyReaderDelegate::SegmentMeshShapePlyReaderDelegate() : m_radius(0.0) { } SegmentMeshShapePlyReaderDelegate::SegmentMeshShapePlyReaderDelegate( const std::shared_ptr& shape) : TriangleMeshPlyReaderDelegate(shape), m_hasRadius(false), m_radius(0.0), m_shape(shape) { SURGSIM_ASSERT(m_shape != nullptr) << "Shape can't be nullptr."; } SegmentMeshShapePlyReaderDelegate::~SegmentMeshShapePlyReaderDelegate() { } void* SegmentMeshShapePlyReaderDelegate::beginRadius(const std::string&, size_t value) { SURGSIM_ASSERT(value <= 1) << "Can't process more than 1 radius"; return &m_radius; } void SegmentMeshShapePlyReaderDelegate::processRadius(const std::string&) { m_shape->setRadius(m_radius); } bool SegmentMeshShapePlyReaderDelegate::registerDelegate(DataStructures::PlyReader* reader) { bool result = TriangleMeshPlyReaderDelegate::registerDelegate(reader); if (m_hasRadius) { reader->requestElement("radius", std::bind(&SegmentMeshShapePlyReaderDelegate::beginRadius, this, std::placeholders::_1, std::placeholders::_2), std::bind(&SegmentMeshShapePlyReaderDelegate::processRadius, this, std::placeholders::_1), nullptr); reader->requestScalarProperty("radius", "value", DataStructures::PlyReader::TYPE_DOUBLE, 0); } return result; } bool SegmentMeshShapePlyReaderDelegate::fileIsAcceptable(const DataStructures::PlyReader& reader) { bool result = TriangleMeshPlyReaderDelegate::fileIsAcceptable(reader); m_hasRadius = reader.hasProperty("radius", "value") && reader.isScalar("radius", "value"); return result; } } }opensurgsim-0.7.0/SurgSim/Math/SegmentMeshShapePlyReaderDelegate.h000066400000000000000000000041241277777236100252130ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_MATH_SEGMENTMESHSHAPEPLYREADERDELEGATE_H #define SURGSIM_MATH_SEGMENTMESHSHAPEPLYREADERDELEGATE_H #include "SurgSim/DataStructures/TriangleMeshPlyReaderDelegate.h" #include "SurgSim/Math/SegmentMeshShape.h" namespace SurgSim { namespace Math { /// Implementation of ply reader for segment meshes, enable to read the radius from the ply file class SegmentMeshShapePlyReaderDelegate : public DataStructures::TriangleMeshPlyReaderDelegate { public: /// Constructor SegmentMeshShapePlyReaderDelegate(); explicit SegmentMeshShapePlyReaderDelegate(const std::shared_ptr& shape); /// Destructor ~SegmentMeshShapePlyReaderDelegate(); /// Delegate function to begin radius processing /// \param element the name of the element being processed 'radius' in this case, it is ignored /// \param value the number of radius entries should be == 1 /// \return the address for ply to deposit the radius data void* beginRadius(const std::string& element, size_t value); /// Callback function to process the radius /// \param element the name of element being processed 'radius' in this case, it is ignored void processRadius(const std::string& element); bool registerDelegate(DataStructures::PlyReader* reader) override; bool fileIsAcceptable(const DataStructures::PlyReader& reader) override; private: bool m_hasRadius; double m_radius; std::shared_ptr m_shape; }; } } #endif opensurgsim-0.7.0/SurgSim/Math/SegmentSegmentCcdContactCalculation-inl.h000066400000000000000000000136201277777236100263630ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_MATH_SEGMENTSEGMENTCCDCONTACTCALCULATION_INL_H #define SURGSIM_MATH_SEGMENTSEGMENTCCDCONTACTCALCULATION_INL_H #include #include #include "SurgSim/Math/CubicSolver.h" #include "SurgSim/Math/Scalar.h" namespace SurgSim { namespace Math { /// Check if 2 segments intersect at a given time of their motion /// \tparam T Accuracy of the calculation, can usually be inferred. /// \tparam MOpt Eigen Matrix options, can usually be inferred. /// \param time The time of coplanarity of the 4 points (A(t), B(t), C(t), D(t) are expected to be coplanar) /// \param A, B The 1st segment motion (each point's motion is from first to second) /// \param C, D The 2nd segment motion (each point's motion is from first to second) /// \param[out] barycentricCoordinates The barycentric coordinates of the intersection in AB(t) and CD(t) /// i.e. P(t) = A + barycentricCoordinates[0].AB(t) = C + barycentricCoordinates[1].CD /// \return True if AB(t) is intersecting CD(t), False otherwise template bool areSegmentsIntersecting( T time, const std::pair, Eigen::Matrix>& A, const std::pair, Eigen::Matrix>& B, const std::pair, Eigen::Matrix>& C, const std::pair, Eigen::Matrix>& D, Eigen::Matrix* barycentricCoordinates) { Eigen::Matrix At = interpolate(A.first, A.second, time); Eigen::Matrix Bt = interpolate(B.first, B.second, time); Eigen::Matrix Ct = interpolate(C.first, C.second, time); Eigen::Matrix Dt = interpolate(D.first, D.second, time); // P = A + alpha.AB and P = C + beta.CD // A + alpha.AB = C + beta.CD // (AB -CD).(alpha) = (AC) which is a 3x2 linear system A.x = b // (beta ) // Let's solve it using (A^t.A)^-1.(A^t.A) = Id2x2 // (A^t.A)^-1.A^t.(A.x) = (A^t.A)^-1.A^t.b // x = (A^t.A)^-1.A^t.b Eigen::Matrix matrixA; matrixA.col(0) = Bt - At; matrixA.col(1) = -(Dt - Ct); Eigen::Matrix b = Ct - At; Eigen::Matrix inv; bool invertible; (matrixA.transpose() * matrixA).computeInverseWithCheck(inv, invertible); if (!invertible) { return false; } *barycentricCoordinates = inv * matrixA.transpose() * b; for (int i = 0; i < 2; i++) { if (std::abs((*barycentricCoordinates)[i]) < Math::Geometry::ScalarEpsilon) { (*barycentricCoordinates)[i] = 0.0; } if (std::abs(1.0 - (*barycentricCoordinates)[i]) < Math::Geometry::ScalarEpsilon) { (*barycentricCoordinates)[i] = 1.0; } } return (*barycentricCoordinates)[0] >= 0.0 && (*barycentricCoordinates)[0] <= 1.0 && (*barycentricCoordinates)[1] >= 0.0 && (*barycentricCoordinates)[1] <= 1.0; } /// Continuous collision detection between two segments AB and CD /// \tparam T Accuracy of the calculation, can usually be inferred. /// \tparam MOpt Eigen Matrix options, can usually be inferred. /// \param A, B The 1st segment motion (each point's motion is from first to second) /// \param C, D The 2nd segment motion (each point's motion is from first to second) /// \param[out] timeOfImpact The time of impact within [0..1] if an collision is found /// \param[out] s0p1Factor, s1p1Factor The barycentric coordinate of the contact point on the 2 segments /// i.e. ContactPoint(timeOfImpact) = A(timeOfImpact) + s0p1Factor.AB(timeOfImpact) /// i.e. ContactPoint(timeOfImpact) = C(timeOfImpact) + s1p1Factor.CD(timeOfImpact) /// \return True if the given segment/segment motions intersect, False otherwise /// \note Simple cubic-solver https://graphics.stanford.edu/courses/cs468-02-winter/Papers/Collisions_vetements.pdf /// \note Optimized method http://www.robotics.sei.ecnu.edu.cn/CCDLY/GMOD15.pdf /// \note Optimized method https://www.cs.ubc.ca/~rbridson/docs/brochu-siggraph2012-ccd.pdf template inline bool calculateCcdContactSegmentSegment( const std::pair, Eigen::Matrix>& A, const std::pair, Eigen::Matrix>& B, const std::pair, Eigen::Matrix>& C, const std::pair, Eigen::Matrix>& D, T* timeOfImpact, T* s0p1Factor, T* s1p1Factor) { std::array roots; int numberOfRoots = timesOfCoplanarityInRange01(A, B, C, D, &roots); // The roots are all in [0..1] and ordered ascendingly for (int rootId = 0; rootId < numberOfRoots; ++rootId) { Eigen::Matrix barycentricCoordinates; if (areSegmentsIntersecting(roots[rootId], A, B, C, D, &barycentricCoordinates)) { // The segments AB and CD are coplanar at time t, and they intersect *timeOfImpact = roots[rootId]; *s0p1Factor = barycentricCoordinates[0]; *s1p1Factor = barycentricCoordinates[1]; // None of these assertion should be necessary, but just to double check SURGSIM_ASSERT(*timeOfImpact >= 0.0 && *timeOfImpact <= 1.0); SURGSIM_ASSERT(*s0p1Factor >= 0.0 && *s0p1Factor <= 1.0); SURGSIM_ASSERT(*s1p1Factor >= 0.0 && *s1p1Factor <= 1.0); return true; } } return false; } }; // namespace Math }; // namespace SurgSim #endif // SURGSIM_MATH_SEGMENTSEGMENTCCDCONTACTCALCULATION_INL_H opensurgsim-0.7.0/SurgSim/Math/Shape.cpp000066400000000000000000000030231277777236100201400ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Framework/Log.h" #include "SurgSim/Framework/ObjectFactory.h" #include "SurgSim/Math/Shape.h" namespace SurgSim { namespace Math { Shape::Shape() { m_aabb.setEmpty(); } Shape::~Shape() { } bool Shape::isTransformable() const { return false; } std::shared_ptr Shape::getTransformed(const RigidTransform3d& pose) const { SURGSIM_FAILURE() << "getTransformed not implemented for " << getClassName(); return nullptr; } /// Get class name std::string Shape::getClassName() const { SURGSIM_LOG_WARNING(SurgSim::Framework::Logger::getDefaultLogger()) << "getClassName() called on Math::Shape base class, this is wrong" << " in almost all cases, this means there is a class that does not have getClassName() defined."; return "SurgSim::Math::Shape"; } const Math::Aabbd& Shape::getBoundingBox() const { return m_aabb; } } // namespace Math } // namespace SurgSim opensurgsim-0.7.0/SurgSim/Math/Shape.h000066400000000000000000000105311277777236100176070ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_MATH_SHAPE_H #define SURGSIM_MATH_SHAPE_H #include "SurgSim/Framework/Accessible.h" #include "SurgSim/Framework/ObjectFactory.h" #include "SurgSim/Math/Matrix.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Math/Aabb.h" #include "SurgSim/DataStructures/OptionalValue.h" namespace SurgSim { namespace Math { /// Type defining the shape direction for certain templatized shape /// (i.e. CylinderShape and CapsuleShape) typedef enum { SHAPE_DIRECTION_AXIS_X = 0, SHAPE_DIRECTION_AXIS_Y = 1, SHAPE_DIRECTION_AXIS_Z = 2 } ShapeDirection; /// Fixed List of enums for the available Shape types, do not explicitly assign values, ShapeCount is /// used to determine the number of actual shape types typedef enum { SHAPE_TYPE_NONE = -1, SHAPE_TYPE_BOX, SHAPE_TYPE_CAPSULE, SHAPE_TYPE_CYLINDER, SHAPE_TYPE_DOUBLESIDEDPLANE, SHAPE_TYPE_MESH, SHAPE_TYPE_OCTREE, SHAPE_TYPE_PARTICLES, SHAPE_TYPE_PLANE, SHAPE_TYPE_SPHERE, SHAPE_TYPE_SURFACEMESH, SHAPE_TYPE_SEGMENTMESH, SHAPE_TYPE_COMPOUNDSHAPE, SHAPE_TYPE_COUNT } ShapeType; /// Generic rigid shape class defining a shape /// \note This class gives the ability to analyze the shape and compute /// \note physical information (volume, mass, mass center, inertia) class Shape : virtual public SurgSim::Framework::Accessible, public Framework::FactoryBase { public: typedef ::SurgSim::Math::Vector3d Vector3d; typedef ::SurgSim::Math::Matrix33d Matrix33d; /// Constructor Shape(); /// Destructor virtual ~Shape(); /// \return the type of shape virtual int getType() const = 0; /// Get the volume of the shape /// \return The volume of the shape (in m-3) virtual double getVolume() const = 0; /// Get the volumetric center of the shape /// \return The center of the shape virtual Vector3d getCenter() const = 0; /// Get the second central moment of the volume, commonly used /// to calculate the moment of inertia matrix /// \return The 3x3 symmetric second moment matrix virtual Matrix33d getSecondMomentOfVolume() const = 0; /// \return true if the the shape can be transformed virtual bool isTransformable() const; /// Get a copy of this shape with an applied rigid transform /// \param pose The pose to transform the shape by /// \return the posed shape virtual std::shared_ptr getTransformed(const RigidTransform3d& pose) const; /// Get class name virtual std::string getClassName() const; /// Check if the shape is valid /// \return True if shape is valid; Otherwise, false. virtual bool isValid() const = 0; /// \return the bounding box for the shape virtual const Math::Aabbd& getBoundingBox() const; protected: Math::Aabbd m_aabb; }; /// PosedShape is a transformed shape with a record of the pose used to transform it. template struct PosedShape { PosedShape() { pose = Math::RigidTransform3d::Identity(); } PosedShape(const T& shapeInput, const Math::RigidTransform3d& poseInput) : shape(shapeInput), pose(poseInput) {} void invalidate() { shape = nullptr; } const T& getShape() const { return shape; } const Math::RigidTransform3d& getPose() const { return pose; } protected: T shape; Math::RigidTransform3d pose; }; /// PosedShapeMotion is embedding the motion of a PosedShape, providing a posed shape at 2 different instant. template struct PosedShapeMotion : public std::pair, PosedShape> { PosedShapeMotion() {} PosedShapeMotion(const PosedShape& posedShapeFirst, const PosedShape& posedShapeSecond) { this->first = posedShapeFirst; this->second = posedShapeSecond; } void invalidate() { this->first.invalidate(); this->second.invalidate(); } }; }; // Math }; // SurgSim #endif // SURGSIM_MATH_SHAPE_H opensurgsim-0.7.0/SurgSim/Math/Shapes.h000066400000000000000000000023041277777236100177710ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_MATH_SHAPES_H #define SURGSIM_MATH_SHAPES_H /// This file includes all the shapes #include "SurgSim/Math/BoxShape.h" #include "SurgSim/Math/CapsuleShape.h" #include "SurgSim/Math/CompoundShape.h" #include "SurgSim/Math/CylinderShape.h" #include "SurgSim/Math/DoubleSidedPlaneShape.h" #include "SurgSim/Math/MeshShape.h" #include "SurgSim/Math/OctreeShape.h" #include "SurgSim/Math/ParticlesShape.h" #include "SurgSim/Math/PlaneShape.h" #include "SurgSim/Math/SphereShape.h" #include "SurgSim/Math/SurfaceMeshShape.h" #endif // SURGSIM_MATH_SHAPES_H opensurgsim-0.7.0/SurgSim/Math/SparseMatrix.h000066400000000000000000000442241277777236100211770ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file SparseMatrix.h /// Definitions of useful sparse matrix functions #ifndef SURGSIM_MATH_SPARSEMATRIX_H #define SURGSIM_MATH_SPARSEMATRIX_H #include #include "SurgSim/Framework/Assert.h" #include "SurgSim/Math/Matrix.h" namespace SurgSim { namespace Math { /// A sparse matrix typedef Eigen::SparseMatrix SparseMatrix; /// Helper class to run operation a column/row of a matrix to a chunk of memory where the size is dynamically defined /// \tparam DerivedSub The class of the matrix from which the data are copied /// \tparam SparseType The type of the SparseVector/SparseMatrix containing the chunk of memory /// \tparam StorageOrder The storage option of the SparseType template < class DerivedSub, class SparseType, int StorageOrder = ((SparseType::Flags & Eigen::RowMajorBit) == Eigen::RowMajorBit) ? Eigen::RowMajor : Eigen::ColMajor > class Operation { public : typedef typename SparseType::Scalar T; typedef typename SparseType::Index Index; /// Do the assignment of a row/column of a matrix to a chunk of memory /// \param ptr The chunk of memory /// \param start Where the assignment starts in the chunk of memory /// \param n, m The size of the block (n rows, m columns) /// \param subMatrix The matrix from which the row/column is copied /// \param colRowId The column or row id depending on the template parameter Opt void assign(T* ptr, size_t start, size_t n, Index m, const DerivedSub& subMatrix, size_t colRowId) {} /// Do the assignment of a single matrix element (operator =) /// \param ptr The matrix element to be assigned /// \param value The value to assign to void assign(T* ptr, const T& value) {} /// Do the addition of a row/column of a matrix to a chunk of memory /// \param ptr The chunk of memory /// \param start Where the addition starts in the chunk of memory /// \param n, m The size of the block (n rows, m columns) /// \param subMatrix The matrix from which the row/column is added /// \param colRowId The column or row id depending on the template parameter Opt void add(T* ptr, size_t start, size_t n, size_t m, const DerivedSub& subMatrix, size_t colRowId) {} /// Do the addition of a single matrix element (operator +=) /// \param ptr The matrix element to be increased /// \param value The value to add void add(T* ptr, const T& value) {} }; /// Specialization for column major storage template class Operation { public: typedef typename SparseType::Scalar T; typedef typename SparseType::Index Index; void assign(T* ptr, size_t start, size_t n, size_t m, const DerivedSub& subMatrix, size_t colId) { typedef Eigen::Matrix < T, Eigen::Dynamic, 1, Eigen::DontAlign | Eigen::ColMajor > ColVector; typedef typename Eigen::Matrix < T, Eigen::Dynamic, 1, Eigen::DontAlign | Eigen::ColMajor >::Index IndexVector; typedef typename DerivedSub::Index IndexSub; // ptr[start] is the 1st element in the column // The elements exists and are contiguous in memory, we use Eigen::Map functionality to optimize the operation Eigen::Map(&ptr[start], static_cast(n)).operator = ( subMatrix.col(static_cast(colId)).segment(0, static_cast(n))); } void assign(T* ptr, const T& value) { *ptr = value; } void add(T* ptr, size_t start, size_t n, size_t m, const DerivedSub& subMatrix, size_t colId) { typedef Eigen::Matrix < T, Eigen::Dynamic, 1, Eigen::DontAlign | Eigen::ColMajor > ColVector; typedef typename Eigen::Matrix < T, Eigen::Dynamic, 1, Eigen::DontAlign | Eigen::ColMajor >::Index IndexVector; typedef typename DerivedSub::Index IndexSub; // ptr[start] is the 1st element in the column // The elements exists and are contiguous in memory, we use Eigen::Map functionality to optimize the operation Eigen::Map(&ptr[start], static_cast(n)).operator += ( subMatrix.col(static_cast(colId)).segment(0, static_cast(n))); } void add(T* ptr, const T& value) { *ptr += value; } }; /// Specialization for row major storage template class Operation { public: typedef typename SparseType::Scalar T; typedef typename SparseType::Index Index; void assign(T* ptr, size_t start, size_t n, size_t m, const DerivedSub& subMatrix, size_t rowId) { typedef Eigen::Matrix < T, 1, Eigen::Dynamic, Eigen::DontAlign | Eigen::RowMajor > RowVector; typedef typename Eigen::Matrix < T, 1, Eigen::Dynamic, Eigen::DontAlign | Eigen::RowMajor >::Index IndexVector; typedef typename DerivedSub::Index IndexSub; // ptr[start] is the 1st element in the row // The elements exists and are contiguous in memory, we use Eigen::Map functionality to optimize the operation Eigen::Map(&ptr[start], static_cast(m)).operator = ( subMatrix.row(static_cast(rowId)).segment(0, static_cast(m))); } void assign(T* ptr, const T& value) { *ptr = value; } void add(T* ptr, size_t start, size_t n, size_t m, const DerivedSub& subMatrix, size_t rowId) { typedef Eigen::Matrix < T, 1, Eigen::Dynamic, Eigen::DontAlign | Eigen::RowMajor > RowVector; typedef typename Eigen::Matrix < T, 1, Eigen::Dynamic, Eigen::DontAlign | Eigen::RowMajor >::Index IndexVector; typedef typename DerivedSub::Index IndexSub; // ptr[start] is the 1st element in the row // The elements exists and are contiguous in memory, we use Eigen::Map functionality to optimize the operation Eigen::Map(&ptr[start], static_cast(m)).operator += ( subMatrix.row(static_cast(rowId)).segment(0, static_cast(m))); } void add(T* ptr, const T& value) { *ptr += value; } }; /// Runs a given operation on a SparseMatrix block(i, j, n, m) from a (n x m) 'subMatrix' with searching for the /// block 1st element.
/// It supposes:
/// + that the SparseMatrix already contains all the elements within the block (no insertion necessary)
/// + that both the SparseMatrix and the 'subMatrix' are using the same Scalar type, double.
/// This function will not change anything to the structure of the SparseMatrix, only change the values of the /// corresponding coefficients. /// \tparam Opt, Index Type parameters defining the output matrix type SparseMatrix /// \param subMatrix The sub matrix that will be copied into the SparseMatrix block /// \param rowStart, columnStart The row and column indices to indicate where the block in the SparseMatrix starts /// \param n, m The block size (Derived may be bigger but cannot be smaller in both dimension) /// \param[in,out] matrix The sparse matrix in which the block needs to be set by 'subMatrix' /// \param op The operation to run on the block /// \exception SurgSim::Framework::AssertionFailure If one of the following conditions is met:
/// * if 'subMatrix' is smaller than (n x m) in any dimension
/// * if 'matrix' is nullptr or smaller than (n x m) in any dimension
/// * if the requested block is out of range in 'matrix'.
/// * if 'matrix' does not fulfill the requirement (i.e. is missing elements within the block).
/// \note The receiving SparseMatrix must have a structure like the following:
/// (xx x0 x)
/// (xx 0x x)
/// (x0[xx]x) -> The block must already contain all the coefficients but these rows and columns may
/// (0x[xx]0) -> contains more coefficients before and after the block.
/// (xx 00 x)
template void blockWithSearch(const Eigen::Ref& subMatrix, size_t rowStart, size_t columnStart, size_t n, size_t m, Eigen::SparseMatrix* matrix, void (Operation>::*op) (double*, size_t, size_t, size_t, const Matrix&, size_t)) { static Operation> operation; SURGSIM_ASSERT(nullptr != matrix) << "Invalid recipient matrix, nullptr found"; SURGSIM_ASSERT(subMatrix.rows() >= static_cast(n)) << "subMatrix doesn't have enough rows"; SURGSIM_ASSERT(subMatrix.cols() >= static_cast(m)) << "subMatrix doesn't have enough columns"; SURGSIM_ASSERT(matrix->rows() >= static_cast(rowStart + n)) << "The block is out of range in matrix"; SURGSIM_ASSERT(matrix->cols() >= static_cast(columnStart + m)) << "The block is out of range in matrix"; SURGSIM_ASSERT(matrix->valuePtr() != nullptr) << "The matrix is not initialized correctly, null pointer to values"; double* ptr = matrix->valuePtr(); const Index* innerIndices = matrix->innerIndexPtr(); const Index* outerIndices = matrix->outerIndexPtr(); Index outerStart = static_cast(Opt == Eigen::ColMajor ? columnStart : rowStart); Index innerStart = static_cast(Opt == Eigen::ColMajor ? rowStart : columnStart); Index outerSize = static_cast(Opt == Eigen::ColMajor ? m : n); Index innerSize = static_cast(Opt == Eigen::ColMajor ? n : m); for (Index outerLoop = 0; outerLoop < outerSize; ++outerLoop) { // outerIndices[outerStart + outerLoop] is the index in ptr and innerIndices of the first non-zero element in // the outer element (outerStart + outerLoop) const Index innerStartIdInCurrentOuter = outerIndices[outerStart + outerLoop]; const Index innerStartIdInNextOuter = outerIndices[outerStart + outerLoop + 1]; // Look for the index of innerStart in this outer (the column/row may contain elements before) Index innerFirstElement; if (innerIndices[innerStartIdInCurrentOuter] == innerStart) { innerFirstElement = innerStartIdInCurrentOuter; } else { innerFirstElement = static_cast(matrix->data().searchLowerIndex( innerStartIdInCurrentOuter, innerStartIdInNextOuter - 1, innerStart)); } // Make sure we actually found the 1st element of the block in this outer SURGSIM_ASSERT(innerIndices[innerFirstElement] == innerStart) << "matrix is missing an element of the block (1st element on a row/column)"; // Make sure that we are not going to write out of the range... // i.e. The column/row (starting at the beginning of the block) has at least innerSize elements SURGSIM_ASSERT(static_cast(innerSize) <= innerStartIdInNextOuter - innerFirstElement) << "matrix is missing elements of the block (but not the 1st element on a row/column)"; // Make sure that the last element corresponding to the block size has the expected index SURGSIM_ASSERT(innerStart + static_cast(innerSize) - 1 == \ innerIndices[innerFirstElement + static_cast(innerSize) - 1]) << "The last element of the block does not have the expected index. " << "The matrix is missing elements of the block (but not the 1st element on a row/column)"; (operation.*op)(ptr, innerFirstElement, n, m, subMatrix, outerLoop); } } /// Runs a given operation on a SparseMatrix block(i, j, n, m) from a (n x m) 'subMatrix' with searching for the /// block 1st element.
/// It supposes:
/// + that both the SparseMatrix and the 'subMatrix' are using the same Scalar type, double.
/// This function can be used to initialize the form of a sparse matrix as it will add entries when appropriate /// entries do not exist. /// \tparam Opt, Index Type parameters defining the output matrix type SparseMatrix /// \param subMatrix The sub matrix that will be copied into the SparseMatrix block /// \param rowStart, columnStart The row and column indices to indicate where the block in the SparseMatrix starts /// \param[in,out] matrix The sparse matrix in which the block needs to be set by 'subMatrix' /// \param op The operation to run on the block /// \exception SurgSim::Framework::AssertionFailure If one of the following conditions is met:
/// * if 'subMatrix' is smaller than (n x m) in any dimension
/// * if 'matrix' is nullptr or smaller than (n x m) in any dimension
/// * if the requested block is out of range in 'matrix'.
/// * if 'matrix' does not fulfill the requirement (i.e. is missing elements within the block).
/// \note The receiving SparseMatrix must have a structure like the following:
/// (xx x0 x)
/// (xx 0x x)
/// (x0[xx]x) -> The block must already contain all the coefficients but these rows and columns may
/// (0x[xx]0) -> contains more coefficients before and after the block.
/// (xx 00 x)
template void blockOperation(const Eigen::Ref& subMatrix, size_t rowStart, size_t columnStart, Eigen::SparseMatrix* matrix, void (Operation>::*op)(double*, const double&)) { static Operation> operation; SURGSIM_ASSERT(nullptr != matrix) << "Invalid recipient matrix, nullptr found"; Index n = static_cast(subMatrix.rows()); Index m = static_cast(subMatrix.cols()); SURGSIM_ASSERT(matrix->rows() >= static_cast(rowStart) + n) << "The block is out of range in matrix"; SURGSIM_ASSERT(matrix->cols() >= static_cast(columnStart) + m) << "The block is out of range in matrix"; for (Index row = 0; row < n; ++row) { for (Index column = 0; column < m; ++column) { (operation.*op)( &matrix->coeffRef(static_cast(rowStart) + row, static_cast(columnStart) + column), subMatrix(row, column)); } } } /// Helper method to add a sub-matrix into a matrix, for the sake of clarity /// \tparam Opt, Index Type parameters defining the output matrix type SparseMatrix /// \param subMatrix The sub-matrix /// \param blockIdRow, blockIdCol The block indices in matrix /// \param[in,out] matrix The matrix to add the sub-matrix into /// \param initialize Option parameter, default=true. If true, the matrix form is assumed to be undefined /// and is initialized when necessary. If false, the matrix form is assumed to be previously defined. /// \note This is a specialization of addSubMatrix for sparse matrices. template void addSubMatrix(const Eigen::Ref& subMatrix, size_t blockIdRow, size_t blockIdCol, Eigen::SparseMatrix* matrix, bool initialize = true) { if (initialize) { blockOperation(subMatrix, static_cast(subMatrix.rows() * blockIdRow), static_cast(subMatrix.cols() * blockIdCol), matrix, &Operation>::add); } else { blockWithSearch(subMatrix, static_cast(subMatrix.rows() * blockIdRow), static_cast(subMatrix.cols() * blockIdCol), static_cast(subMatrix.rows()), static_cast(subMatrix.cols()), matrix, &Operation>::add); } } /// Helper method to assign a sub-matrix into a matrix, for the sake of clarity /// \tparam Opt, Index Type parameters defining the output matrix type SparseMatrix /// \param subMatrix The sub-matrix /// \param blockIdRow, blockIdCol The block indices in matrix /// \param[in,out] matrix The matrix to assign the sub-matrix into /// \param initialize Option parameter, default=true. If true, the matrix form is assumed to be undefined /// and is initialized when necessary. If false, the matrix form is assumed to be previously defined. template void assignSubMatrix(const Eigen::Ref& subMatrix, size_t blockIdRow, size_t blockIdCol, Eigen::SparseMatrix* matrix, bool initialize = true) { if (initialize) { blockOperation(subMatrix, (subMatrix.rows() * blockIdRow), (subMatrix.cols() * blockIdCol), matrix, &Operation>::assign); } else { blockWithSearch(subMatrix, (subMatrix.rows() * blockIdRow), (subMatrix.cols() * blockIdCol), subMatrix.rows(), subMatrix.cols(), matrix, &Operation>::assign); } } /// Helper method to zero a row of a matrix specialized for Sparse Matrices /// \param row The row to set to zero /// \param[in,out] matrix The matrix to set the zero row on. template void zeroRow(size_t row, Eigen::SparseMatrix* matrix) { for (Index column = 0; column < matrix->cols(); ++column) { if (matrix->coeff(static_cast(row), column)) { matrix->coeffRef(static_cast(row), column) = 0; } } } /// Helper method to zero a column of a matrix specialized for Sparse Matrices /// \param column The column to set to zero /// \param[in,out] matrix The matrix to set the zero column on. template inline void zeroColumn(size_t column, Eigen::SparseMatrix* matrix) { for (Index row = 0; row < matrix->rows(); ++row) { if (matrix->coeff(row, static_cast(column))) { matrix->coeffRef(row, static_cast(column)) = 0; } } } /// Helper method to zero all entries of a matrix specialized for Sparse Matrices. This /// allows the preservation of the the matrix form while still allowing the reset of /// the matrix entries to zero. /// \param[in,out] matrix The matrix to set to zero template inline void clearMatrix(Eigen::SparseMatrix* matrix) { SURGSIM_ASSERT(matrix->isCompressed()) << "Invalid matrix. Matrix must be in compressed form."; T* ptr = matrix->valuePtr(); for (Index value = 0; value < matrix->nonZeros(); ++value) { *ptr = 0; ++ptr; } } }; // namespace Math }; // namespace SurgSim #endif // SURGSIM_MATH_SPARSEMATRIX_H opensurgsim-0.7.0/SurgSim/Math/SphereShape.cpp000066400000000000000000000036711277777236100213200ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Math/SphereShape.h" namespace SurgSim { namespace Math { SURGSIM_REGISTER(SurgSim::Math::Shape, SurgSim::Math::SphereShape, SphereShape); SphereShape::SphereShape(double radius) : m_radius(radius) { SURGSIM_ADD_SERIALIZABLE_PROPERTY(SphereShape, double, Radius, getRadius, setRadius); updateAabb(); } int SphereShape::getType() const { return SHAPE_TYPE_SPHERE; } double SphereShape::getRadius() const { return m_radius; } void SphereShape::setRadius(double radius) { m_radius = radius; updateAabb(); } void SphereShape::updateAabb() { m_aabb.setEmpty(); m_aabb.extend(Vector3d(-m_radius, -m_radius, -m_radius)); m_aabb.extend(Vector3d(m_radius, m_radius, m_radius)); } double SphereShape::getVolume() const { return 4.0 / 3.0 * M_PI * m_radius * m_radius * m_radius; } SurgSim::Math::Vector3d SphereShape::getCenter() const { return Vector3d(0.0, 0.0, 0.0); } SurgSim::Math::Matrix33d SphereShape::getSecondMomentOfVolume() const { const double volume = getVolume(); double diagonalCoefficient = 2.0 / 5.0 * volume * m_radius * m_radius; Matrix33d secondMoment; secondMoment.setZero(); secondMoment.diagonal().setConstant(diagonalCoefficient); return secondMoment; } bool SphereShape::isValid() const { return m_radius >= 0; } }; // namespace Math }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Math/SphereShape.h000066400000000000000000000042001277777236100207520ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_MATH_SPHERESHAPE_H #define SURGSIM_MATH_SPHERESHAPE_H #include "SurgSim/Framework/ObjectFactory.h" #include "SurgSim/Math/Shape.h" namespace SurgSim { namespace Math { SURGSIM_STATIC_REGISTRATION(SphereShape); /// Sphere shape: sphere centered on (0 0 0), defined with radius class SphereShape: public Shape { public: /// Constructor /// \param radius The sphere radius (in m) explicit SphereShape(double radius = 0.0); SURGSIM_CLASSNAME(SurgSim::Math::SphereShape); /// \return the type of the shape int getType() const override; /// Get the sphere radius /// \return The sphere radius double getRadius() const; /// Get the volume of the shape /// \return The volume of the shape (in m-3) double getVolume() const override; /// Get the volumetric center of the shape /// \return The center of the shape Vector3d getCenter() const override; /// Get the second central moment of the volume, commonly used /// to calculate the moment of inertia matrix /// \return The 3x3 symmetric second moment matrix Matrix33d getSecondMomentOfVolume() const override; /// \return True if radius is bigger than or equal to 0; Otherwise, false. bool isValid() const override; protected: // Setters in 'protected' sections are for serialization purpose only. /// Set the sphere radius /// \param radius The sphere radius void setRadius(double radius); void updateAabb(); private: /// Sphere radius double m_radius; }; }; // Math }; // SurgSim #endif // SURGSIM_MATH_SPHERESHAPE_H opensurgsim-0.7.0/SurgSim/Math/SurfaceMeshShape-inl.h000066400000000000000000000022041277777236100225130ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // #ifndef SURGSIM_MATH_SURFACEMESHSHAPE_INL_H #define SURGSIM_MATH_SURFACEMESHSHAPE_INL_H namespace SurgSim { namespace Math { template SurfaceMeshShape::SurfaceMeshShape( const SurgSim::DataStructures::TriangleMesh& mesh, double thickness) : MeshShape(mesh), m_thickness(thickness) { computeVolumeIntegrals(); } }; // namespace Math }; // namespace SurgSim #endif // SURGSIM_MATH_SURFACEMESHSHAPE_INL_H opensurgsim-0.7.0/SurgSim/Math/SurfaceMeshShape.cpp000066400000000000000000000135721277777236100223000ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // #include "SurgSim/Math/SurfaceMeshShape.h" #include "SurgSim/Framework/Log.h" namespace { const double epsilon = 1e-10; }; namespace SurgSim { namespace Math { SURGSIM_REGISTER(SurgSim::Math::Shape, SurgSim::Math::SurfaceMeshShape, SurfaceMeshShape); SurfaceMeshShape::SurfaceMeshShape() : m_thickness(1e-2) { } int SurfaceMeshShape::getType() const { return SHAPE_TYPE_SURFACEMESH; } void SurfaceMeshShape::computeVolumeIntegrals() { // Considering a surface mesh with thickness, the goal is to compute the following properties: // 1) volume = integral(over volume) dx dy dz // 2) center = integral(over volume) (x y z)^T dx dy dz / volume // 3) the inertia matrix without the mass density: // I = (Ixx Ixy Ixz) = integral(over volume) (y^2+z^2 -xy -xz ) dx dy dz // (Iyx Iyy Iyz) ( -yx x^2+z^2 -yz ) // (Izx Izy Izz) ( -zx -zy x^2+y^2) // Each term of the matrix I can be evaluated independently and each monome can also be evaluated // independently and summed up after: integral(V) y^2+z^2 dV = integral(V) y^2 dV + integral(V) z^2 dV // // Therefore, we simply need to compute 10 different volume integral: // {1, x, y, z, x^2, y^2, z^2, xy, yz, zx} // // Example for the monome 'xy': // = integral(over volume) x.y dx dy dz = integral(over volume) x.y dV // = integral(over area) x.y dS * thickness // = [sum(over all triangles) integral(over triangle) x.y dS] * thickness // // Change the integration variables from cartesian coordinates to a parametrization of the // triangle ABC = {P | P = A + a.u + b.v} // with // { u=AB the 1st triangle edge supporting the parametrization // { v=AC the 2nd triangle edge supporting the parametrization // { 0<=a<=1 the triangle 1st coordinate in the new coordinate system (parametrized) // { 0<=b<=1-a the triangle 2nd coordinate in the new coordinate system (parametrized) // => dS = |dP/db x dP/da|.db.da = |vxu|.db.da = |uxv|.db.da // => x = Px // => y = Py // // integral(over volume) x.y dx dy dz = // [sum(over all triangles) integral(over triangle) x.y dS] * thickness = // [sum(over all triangles) integral(from 0 to 1) integral(from 0 to 1-a) Px.Py db.da |uxv|] * thickness // // From here, the various integral terms can be found related to A, u and v using any formal integration tool. // Order: 1, x, y, z, x^2, y^2, z^2, xy, yz, zx Eigen::VectorXd integral(10); integral.setZero(); for (auto const& triangle : getTriangles()) { if (!triangle.isValid) { continue; } auto A = getVertexPosition(triangle.verticesId[0]); auto B = getVertexPosition(triangle.verticesId[1]); auto C = getVertexPosition(triangle.verticesId[2]); // Triangle parametrization P(a, b) = A + u.a + v.b with u=AB and v=AC const Vector3d u = B - A; const Vector3d v = C - A; const double area = u.cross(v).norm() / 2.0; // Triangle area integral[0] += area; integral[1] += (A[0] + (u[0] + v[0]) / 3.0) * area; integral[2] += (A[1] + (u[1] + v[1]) / 3.0) * area; integral[3] += (A[2] + (u[2] + v[2]) / 3.0) * area; integral[4] += (A[0] * (A[0] + 2.0 * (u[0] + v[0]) / 3.0) + (u[0] * v[0] + v[0] * v[0] + u[0] * u[0]) / 6.0) * area; integral[5] += (A[1] * (A[1] + 2.0 * (u[1] + v[1]) / 3.0) + (u[1] * v[1] + v[1] * v[1] + u[1] * u[1]) / 6.0) * area; integral[6] += (A[2] * (A[2] + 2.0 * (u[2] + v[2]) / 3.0) + (u[2] * v[2] + v[2] * v[2] + u[2] * u[2]) / 6.0) * area; integral[7] += (A[0] * A[1] + (A[0] * (u[1] + v[1]) + A[1] * (u[0] + v[0])) / 3.0) * area; integral[7] += ((u[0] * u[1] + v[0] * v[1]) / 6.0 + (u[0] * v[1] + u[1] * v[0]) / 12.0) * area; integral[8] += (A[1] * A[2] + (A[1] * (u[2] + v[2]) + A[2] * (u[1] + v[1])) / 3.0) * area; integral[8] += ((u[1] * u[2] + v[1] * v[2]) / 6.0 + (u[1] * v[2] + u[2] * v[1]) / 12.0) * area; integral[9] += (A[2] * A[0] + (A[2] * (u[0] + v[0]) + A[0] * (u[2] + v[2])) / 3.0) * area; integral[9] += ((u[2] * u[0] + v[2] * v[0]) / 6.0 + (u[2] * v[0] + u[0] * v[2]) / 12.0) * area; } // integral[0] is the sum of all triangle's area double area = integral[0]; // Center of mass m_center = integral.segment(1, 3); if (area > epsilon) { m_center /= area; } // second moment of volume relative to center Vector3d centerSquared = m_center.cwiseProduct(m_center); m_secondMomentOfVolume(0, 0) = integral[5] + integral[6] - area * (centerSquared.y() + centerSquared.z()); m_secondMomentOfVolume(1, 1) = integral[4] + integral[6] - area * (centerSquared.z() + centerSquared.x()); m_secondMomentOfVolume(2, 2) = integral[4] + integral[5] - area * (centerSquared.x() + centerSquared.y()); m_secondMomentOfVolume(0, 1) = -(integral[7] - area * m_center.x() * m_center.y()); m_secondMomentOfVolume(1, 0) = m_secondMomentOfVolume(0, 1); m_secondMomentOfVolume(1, 2) = -(integral[8] - area * m_center.y() * m_center.z()); m_secondMomentOfVolume(2, 1) = m_secondMomentOfVolume(1, 2); m_secondMomentOfVolume(0, 2) = -(integral[9] - area * m_center.z() * m_center.x()); m_secondMomentOfVolume(2, 0) = m_secondMomentOfVolume(0, 2); m_secondMomentOfVolume *= m_thickness; m_volume = (area * m_thickness); } bool SurfaceMeshShape::isValid() const { return (m_thickness > 1e-5) && MeshShape::isValid(); } }; // namespace Math }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Math/SurfaceMeshShape.h000066400000000000000000000072401277777236100217400ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_MATH_SURFACEMESHSHAPE_H #define SURGSIM_MATH_SURFACEMESHSHAPE_H #include "SurgSim/DataStructures/TriangleMesh.h" #include "SurgSim/Framework/ObjectFactory.h" #include "SurgSim/Math/MeshShape.h" #include "SurgSim/Math/Shape.h" namespace SurgSim { namespace Math { SURGSIM_STATIC_REGISTRATION(SurfaceMeshShape); /// SurfaceMeshShape defines a shape based on a mesh, like MeshShape. /// But, unlike MeshShape, the mesh does not need to be watertight to produce valid volume, center and second moment of /// volume. In the MeshShape case, these quantities are based on the notion of volume and are therefore undefined /// if no volume if properly defined. In the SurfaceMeshShape case, these quantities are based on a surface /// mesh, with a thickness (which is considered constant over the surface and should be multiple orders of magnitude /// smaller than the two other dimesions, i.e. 1e-3 in practice). If the mesh is not closed or has holes, the class /// will still produce valid geometric properties. /// /// \note If not used in physics, there is no differences between using a SurfaceMeshShape or a MeshShape. /// /// \note Any change on the mesh will invalidate the geometric properties. /// \note Practical use cases: /// \note * Fixed/Rigid object, the mesh will not change anyway. /// \note * Deformable object, the mesh will be updated, but the geometric properties will not be used. /// /// \note The thickness should be multiple order of magnitude smaller than the other 2 dimensions of the mesh. /// \note It should also not be smaller than 1e-5 to avoid formal and numerical issues when getting close to 0. /// /// \note SurfaceMeshShape does not have any collision algorithm associated with it in SurgSim::Collision and /// \note SurgSim::Physics::DcdCollision so far. /// /// \sa MeshShape class SurfaceMeshShape : public MeshShape { public: /// Constructor SurfaceMeshShape(); /// Constructor /// \param mesh The triangle mesh to build the shape from /// \param thickness The thickness associated to this surface mesh /// \exception Raise an exception if the mesh is invalid template SurfaceMeshShape( const SurgSim::DataStructures::TriangleMesh& mesh, double thickness = 1e-2); SURGSIM_CLASSNAME(SurgSim::Math::SurfaceMeshShape); /// \return the type of the shape int getType() const override; /// Check if this shape contains a valid mesh and the thickness is at least 1e-5 (in meter, /// to avoid formal and numerical issues). /// \return True if this shape contains a valid mesh and thickness is at least 1e-5; Otherwise, false. bool isValid() const override; protected: /// Compute useful volume integrals based on the triangle mesh, which /// are used to get the volume , center and second moment of volume. void computeVolumeIntegrals() override; private: /// Surface mesh thickness double m_thickness; }; }; // Math }; // SurgSim #include "SurgSim/Math/SurfaceMeshShape-inl.h" #endif // SURGSIM_MATH_SURFACEMESHSHAPE_H opensurgsim-0.7.0/SurgSim/Math/TriangleCapsuleContactCalculation-inl.h000066400000000000000000000561271277777236100261170ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_MATH_TRIANGLECAPSULECONTACTCALCULATION_INL_H #define SURGSIM_MATH_TRIANGLECAPSULECONTACTCALCULATION_INL_H #include "SurgSim/Math/Valid.h" #include "SurgSim/DataStructures/OptionalValue.h" namespace SurgSim { namespace Math { namespace TriangleCapsuleContactCalculation { /// Find the point on (positive X side of) ellipse parallel to the given tangent. /// \tparam T Accuracy of the calculation, can usually be inferred. /// \tparam MOpt Eigen Matrix options, can usually be inferred. /// \param tangent The given tangent to this ellipse, whose corresponding point is to be found /// \param center Center of the ellipse. /// \param majorAxis, minorAxis The major/minor axes of the ellipse, both of unit length /// \param majorRadius, minorRadius Major/minor radii of the ellipse /// \note majorAxis and minorAxis are assumed to be orthogonal to each other. /// \return The point on the ellipse (in positive x direction) which has the given tangent. template Eigen::Matrix pointWithTangentOnEllipse(const Eigen::Matrix& center, const Eigen::Matrix& majorAxis, const Eigen::Matrix& minorAxis, const double majorRadius, const double minorRadius, const Eigen::Matrix& tangent) { Eigen::Transform transform; transform.translation() = center; transform.linear().col(0) = majorAxis; transform.linear().col(1) = minorAxis; transform.linear().col(2) = majorAxis.cross(minorAxis); // tangent in local coordinates. Eigen::Matrix localTangent = transform.inverse().linear() * tangent; // Slope of this tangent T m = localTangent[1] / localTangent[0]; // Ellipse equation: x*x/a*a + y*y/b*b = 1 // Rewriting ellipse equation in the form, y = f(x): y = sqrt(a*a - x*x) * b / a // Slope of ellipse: y' = -x*b*b/a*a*y // This slope is equal to the slope of the localTangent. So, we can solve for x and y. T x = std::sqrt((m * m * majorRadius * majorRadius * majorRadius * majorRadius) / (minorRadius * minorRadius + m * m * majorRadius * majorRadius)); T y = (minorRadius / majorRadius) * std::sqrt(majorRadius * majorRadius - x * x) * ((m > 0.0) ? -1.0 : 1.0); // Transforming this point into world coordinates. return transform * Eigen::Matrix(x, y, static_cast(0)); } /// Class used to find the intersection between a triangle and a capsule. /// \tparam T Accuracy of the calculation, can usually be inferred. /// \tparam MOpt Eigen Matrix options, can usually be inferred. template class TriangleCapsuleContactCalculation { typedef Eigen::Matrix Vector3; typedef Eigen::Matrix Vector2; typedef Eigen::Transform RigidTransform3; public: /// Constructor. /// \param tv0,tv1,tv2 Vertices of the triangle. /// \param tn Normal of the triangle, should be normalized. /// \param cv0,cv1 Ends of the capsule axis. /// \param cr Capsule radius. TriangleCapsuleContactCalculation( const Vector3& tv0, const Vector3& tv1, const Vector3& tv2, const Vector3& tn, const Vector3& cv0, const Vector3& cv1, double cr) : m_tv0(tv0), m_tv1(tv1), m_tv2(tv2), m_tn(tn), m_cvTop(cv0), m_cvBottom(cv1), m_cr(cr) { m_epsilon = static_cast(Geometry::DistanceEpsilon); m_distance = distanceSegmentTriangle(cv0, cv1, m_tv0, m_tv1, m_tv2, m_tn, &m_penetrationPointCapsuleAxis, &m_penetrationPointTriangle); m_cAxis = m_cvBottom - m_cvTop; m_cLength = m_cAxis.norm(); m_cAxis = m_cAxis / m_cLength; if (m_cAxis.dot(tn) > 0.0) { m_cvTop = cv1; m_cvBottom = cv0; m_cAxis = -m_cAxis; } } /// \return Whether there is an intersection. bool isIntersecting() { return m_distance < (m_cr - m_epsilon); } /// Calculate the contact info. /// \param [out] penetrationDepth The depth of penetration. /// \param [out] penetrationPointTriangle The contact point on triangle. /// \param [out] penetrationPointCapsule The contact point on capsule. /// \param [out] contactNormal The contact normal that points from capsule to triangle. /// \param [out] penetrationPointCapsuleAxis The point on the capsule axis closest to the triangle. void calculateContact(T* penetrationDepth, Vector3* penetrationPointTriangle, Vector3* penetrationPointCapsule, Vector3* contactNormal, Vector3* penetrationPointCapsuleAxis) { if (isIntersecting()) { bool result = axisAwayFromTriangle() || axisPerpendicularToTriangle() || axisTouchingTriangle() || axisThroughTriangle(); SURGSIM_ASSERT(result) << "At this point, there has to be an intersection."; *penetrationDepth = m_penetrationDepth; *penetrationPointTriangle = m_penetrationPointTriangle; *penetrationPointCapsule = m_penetrationPointCapsule; *contactNormal = m_contactNormal; *penetrationPointCapsuleAxis = m_penetrationPointCapsuleAxis; } } private: /// This function handles the contact data calculation for the case where there is an intersection between the /// capsule and the triangle, but the capsule axis does not intersect the triangle. /// \return True, if the axis of the capsule is away from the triangle. /// \note This function presupposes that isIntersecting() returned true. bool axisAwayFromTriangle() { if (m_distance > m_epsilon) { m_contactNormal = m_penetrationPointTriangle - m_penetrationPointCapsuleAxis; m_contactNormal.normalize(); m_penetrationPointCapsule = m_penetrationPointCapsuleAxis + (m_contactNormal * m_cr); m_penetrationDepth = m_cr - m_distance; return true; } return false; } /// This function handles the contact data calculation for the case where there is an intersection between the /// capsule and the triangle, and the capsule axis is perpendicular to the triangle. /// \return True, if the axis of the capsule is perpendicular to the triangle. /// \note This function presupposes that isIntersecting() returned true and axisAwayFromTriangle() returned false. bool axisPerpendicularToTriangle() { if (std::abs(m_cAxis.dot(m_tn) + 1.0) < m_epsilon) { m_penetrationPointCapsule = m_cvBottom - m_tn * m_cr; m_penetrationPointCapsuleAxis = m_cvBottom; m_contactNormal = -m_tn; m_penetrationDepth = (m_tv0 - m_penetrationPointCapsule).dot(m_tn); return true; } return false; } /// This function handles the contact data calculation for the case where there is an intersection between the /// capsule and the triangle, and the capsule axis just touches the triangle. /// \return True, if the axis of the capsule is just touching triangle. /// \note This function presupposes that isIntersecting() returned true, axisAwayFromTriangle() returned false, /// and axisPerpendicularToTriangle() returned false. bool axisTouchingTriangle() { if (m_penetrationPointCapsuleAxis.isApprox(m_cvTop, m_epsilon) || m_penetrationPointCapsuleAxis.isApprox(m_cvBottom, m_epsilon) || isPointOnTriangleEdge(m_penetrationPointTriangle, m_tv0, m_tv1, m_tv2, m_tn)) { m_contactNormal = -m_tn; auto projectionCvBottom = (m_cvBottom + m_tn * (m_tv0 - m_cvBottom).dot(m_tn)).eval(); if (SurgSim::Math::isPointInsideTriangle(projectionCvBottom, m_tv0, m_tv1, m_tv2, m_tn)) { m_contactNormal = -m_tn; m_penetrationPointCapsule = m_cvBottom - m_tn * m_cr; m_penetrationPointCapsuleAxis = m_cvBottom; } else { farthestIntersectionLineCapsule(m_penetrationPointTriangle, -m_tn, &m_penetrationPointCapsule, &m_penetrationPointCapsuleAxis); } m_penetrationDepth = (m_tv0 - m_penetrationPointCapsule).dot(m_tn); return true; } return false; } /// This function handles the contact data calculation for the case where there is an intersection between the /// capsule and the triangle, and the capsule axis goes through the triangle. /// \return True, if the axis of the capsule goes through the triangle. Also calculates the contact info. /// \note This function presupposes that isIntersecting() returned true, axisAwayFromTriangle() returned false, /// axisPerpendicularToTriangle() returned false, and axisTouchingTriangle() returned false. bool axisThroughTriangle() { if (m_distance != 0.0) { return false; } // Extruding the triangle along the direction of -tn creates a volume. Clip off the capsule axis that is // outside of this volume. Vector3 v[3] = {m_tv0, m_tv1, m_tv2}; Vector3 planeN[4] = {m_tn, (-m_tn.cross(m_tv1 - m_tv0)).normalized(), (-m_tn.cross(m_tv2 - m_tv1)).normalized(), (-m_tn.cross(m_tv0 - m_tv2)).normalized()}; double planeD[4] = {-m_tv0.dot(planeN[0]), -m_tv0.dot(planeN[1]), -m_tv1.dot(planeN[2]), -m_tv2.dot(planeN[3])}; auto segmentStart = m_cvTop; auto segmentEnd = m_cvBottom; size_t j = clipSegmentAgainstTriangle(&segmentStart, &segmentEnd, v, planeN, planeD); if (j == 0) { m_contactNormal = -m_tn; m_penetrationPointCapsule = m_cvBottom - m_tn * m_cr; m_penetrationDepth = (m_tv0 - m_penetrationPointCapsule).dot(m_tn); m_penetrationPointCapsuleAxis = m_cvBottom; m_penetrationPointTriangle = m_penetrationPointCapsule + m_tn * m_penetrationDepth; return true; } Vector3 deepestPoint = ((segmentStart - segmentEnd).dot(planeN[0]) < 0.0) ? segmentStart : segmentEnd; Vector3 edgeVertices[2] = {v[(j - 1) % 3], v[j % 3]}; Vector3 triangleEdge = (edgeVertices[1] - edgeVertices[0]).normalized(); // The capsule axis intersects the plane (planeN[j], planeD[j]). First, the capsule is treated as a cylinder. // Its intersection with this plane is an ellipse. The deepest point on this ellipse along -tn and bounded // by vectors (edgeVertices[0] -> edgeVertices[0] - tn) and (edgeVertices[1] -> edgeVertices[1] - tn) is found. Vector3 center = deepestPoint; Vector3 majorAxis = (triangleEdge * (triangleEdge.dot(m_cAxis)) + m_tn * (m_tn.dot(m_cAxis))).normalized(); double majorRadius = farthestIntersectionLineCylinder(center, majorAxis, &deepestPoint); SURGSIM_ASSERT(isValid(majorRadius)) << "The major radius of the ellipse should be a valid number."; if (std::abs(majorAxis.dot(triangleEdge)) > m_epsilon) { // majorApex is not the deepest point because the ellipse is angled. The deepest point is between majorApex // and minorApex on the circumference of the ellipse, and the tangent at that point is parallel to the // triangleEdge. auto minorAxis = planeN[j].cross(majorAxis); double minorRadius = farthestIntersectionLineCylinder(center, minorAxis); SURGSIM_ASSERT(isValid(minorRadius)) << "The minor radius of the ellipse should be a valid number."; deepestPoint = pointWithTangentOnEllipse(center, majorAxis, minorAxis, majorRadius, minorRadius, triangleEdge); Vector3 result; if (std::abs(distancePointSegment(deepestPoint, m_cvTop, m_cvBottom, &result) - m_cr) > m_epsilon) { // The deepest point is not on the capsule, which means that the capsule end (the sphere) is // intersecting the triangle edge plane (planeN[j], planeD[j]). The intersection between them is a // circle. Define a 2D co-ordinate system with the origin at edgeVertices[0], the x-axis as // triangleEdge, and the y-axis as tn. Transforming the circle to this 2D co-ordinate system, creates a // circle of radius, r, with its center at x, y. Now the deepest point on this circle is (x, y - r). Vector3 origin = edgeVertices[0], xAxis = triangleEdge, yAxis = m_tn, zAxis = planeN[j]; double sphereCenterToXYPlane = (m_cvBottom - origin).dot(zAxis); SURGSIM_ASSERT(m_cr + m_epsilon >= sphereCenterToXYPlane) << "The sphere center is too far from the triangle edge plane."; double circleRadius = std::sqrt(m_cr * m_cr - sphereCenterToXYPlane * sphereCenterToXYPlane); SURGSIM_ASSERT(isValid(circleRadius)) << "The radius of the circle of intersection between the sphere and the plane is invalid."; Vector3 circleCenter = m_cvBottom - zAxis * sphereCenterToXYPlane; double x = (circleCenter - origin).dot(xAxis); double y = (circleCenter - origin).dot(yAxis) - circleRadius; deepestPoint = xAxis * x + yAxis * y + origin; } } // Project deepestPoint on the triangle edge to make sure it is within the edge. auto edgeLength = (edgeVertices[1] - edgeVertices[0]).norm(); double deepestPointDotEdge = triangleEdge.dot(deepestPoint - edgeVertices[0]); if (deepestPointDotEdge <= -m_epsilon || deepestPointDotEdge >= edgeLength + m_epsilon) { // In this case, the intersection of the cylinder with the triangle edge plane gives an ellipse // that is close to a triangle corner and the deepest penetration point on the ellipse is // actually outside the triangle. // Solution: find the deepest point on the ellipse which projection is still on the triangle. // For that: Find the corner edgeVertex of the triangle closest to deepestPointDotEdge // Find the deepest penetration point verifying P - tn*t and the cylinder equation. // The triangle point to consider is edgeVertices[0] or edgeVertices[1]. Vector3 edgeVertex = (deepestPointDotEdge < 0.0) ? edgeVertices[0] : edgeVertices[1]; double d = farthestIntersectionLineCapsule(edgeVertex, -m_tn, &deepestPoint, &m_penetrationPointCapsuleAxis); SURGSIM_ASSERT(isValid(d)) << "There must be a part of the ellipse between the triangle edge at this point"; } m_contactNormal = -m_tn; m_penetrationPointCapsule = deepestPoint; m_penetrationDepth = -m_tn.dot(deepestPoint - m_tv0); m_penetrationPointTriangle = deepestPoint + m_tn * (m_penetrationDepth); return true; } /// \param lineStart The origin of the line /// \param lineDir Unit directional vector of the line /// \param point [out] The point of intersection. /// \return The distance of the point of intersection from the lineStart. double farthestIntersectionLineCylinder(const Vector3& lineStart, const Vector3& lineDir, Vector3* point = nullptr) { if (!m_cInverseTransform.hasValue()) { Vector3 j, k; SurgSim::Math::buildOrthonormalBasis(&m_cAxis, &j, &k); m_cTransform.translation() = m_cvTop; m_cTransform.linear().col(0) = m_cAxis; m_cTransform.linear().col(1) = j; m_cTransform.linear().col(2) = k; m_cInverseTransform = m_cTransform.inverse(); } // Transform the problem in the cylinder space to solve the local cylinder equation y^2 + z^2 = r^2 // Point on ellipse should be on the line, P + t.(D) // => Py^2 + t^2.Dy^2 + 2.Py.t.Dy + Pz^2 + t^2.Dz^2 + 2.Pz.t.Dz = r^2 // => t^2.(Dy^2 + Dz^2) + t.(2.Py.Dy + 2.Pz.Dz) + (Py^2 + Pz^2 - r^2) = 0 // Let a = (Dy^2 + Dz^2), b = (2.Py.Dy + 2.Pz.Dz), c = (Py^2 + Pz^2 - r^2): // => t^2.a + t.b + c = 0, whose solution is: // (-b +/- sqrt(b^2 - 4*a*c))/2*a auto const P = (m_cInverseTransform.getValue() * lineStart).eval(); auto const D = (m_cInverseTransform.getValue().linear() * lineDir).eval(); T a = D[1] * D[1] + D[2] * D[2]; T b = static_cast(2) * (P[1] * D[1] + P[2] * D[2]); T c = (P[1] * P[1] + P[2] * P[2] - m_cr * m_cr); T discriminant = b * b - static_cast(4) * a * c; if (discriminant < 0.0) { // Cannot use a sqrt on a negative number. Push it to zero if it is small. if (discriminant >= -Geometry::ScalarEpsilon) { discriminant = 0.0; } else { return std::numeric_limits::quiet_NaN(); } } // We have two solutions. We want the larger value. double d = (-b / (static_cast(2) * a)) + std::abs(std::sqrt(discriminant) / (static_cast(2) * a)); SURGSIM_ASSERT(isValid(d)); if (point != nullptr) { *point = lineStart + lineDir * d; } return d; } /// \param lineStart The start of the line segment /// \param lineDir The direction of the line segment /// \param point [in,out] The point which is to be clipped. /// \param pointOnCapsuleAxis [out] The recalculated point on the capsule axis. /// \return The distance of the point of intersection from the lineStart. /// \note Asserts when there is no intersection. double farthestIntersectionLineCapsule(const Vector3& lineStart, const Vector& lineDir, Vector3* point, Vector3* pointOnCapsuleAxis) { // Transform the problem into the capsule space to solve the local capsule equation. The capsule coordinate // system has its origin on one the capsule ends (m_cvTop), the x axis is along the capsule axis (m_cAxis), and // the y and z axes are any orthogonal vectors to the capsule axis. The equation of the capsule can be written // as the following: // x^2 + y^2 + z^2 = r^2 | x < 0 ------ [1] // y^2 + z^2 = r^2 | 0 < x < length ------ [2] // (x - length)^2 + y^2 + z^2 = r^2 | x > length ------ [3] // Point should be on the line, P + t.(D) // First find the intersection with an infinite cylinder centered around the capsule axis. double d = farthestIntersectionLineCylinder(lineStart, lineDir, point); SURGSIM_ASSERT(isValid(d)); *point = lineStart + lineDir * d; // When x <0 or x > length, the equation of the capsule is that of the sphere (from equations [1] and [3]). So, // the intersection between the line (P + t.D) and the sphere is calculated as below. Here l is the length of // the capsule. // => ((P + t.D).x - l)^2 + (P + t.D).y^2 + (P + t.D).z^2 = r^2 // => Px^2 + t^2.Dx^2 + l^2 + 2.Px.t.Dx - 2.t.Dx.l - 2.Px.l + // Py^2 + t^2.Dy^2 + 2.Py.t.Dy + Pz^2 + t^2.Dz^2 + 2.Pz.t.Dz = r^2 // => t^2.(Dx^2 + Dy^2 + Dz^2) + t.(2.Px.Dx + 2.Py.Dy + 2.Pz.Dz - 2.Dx.l) + // (Px^2 + Py^2 + Pz^2 + l^2 - 2.Px.l - r^2) = 0 // Let a = (Dx^2 + Dy^2 + Dz^2), // b = (2.Px.Dx + 2.Py.Dy + 2.Pz.Dz - 2.Dx.l), // c = (Px^2 + Py^2 + Pz^2 + l^2 - 2.Px.l - r^2): double x = ((*point) - m_cvTop).dot(m_cAxis); if (x <= 0.0 || x >= m_cLength) { x = (x <= 0.0) ? 0.0 : m_cLength; auto const P = (m_cInverseTransform.getValue() * lineStart).eval(); auto const D = (m_cInverseTransform.getValue().linear() * lineDir).eval(); T a = D[0] * D[0] + D[1] * D[1] + D[2] * D[2]; T b = static_cast(2) * (P[0] * D[0] + P[1] * D[1] + P[2] * D[2] - D[0] * x); T c = (P[0] * P[0] + P[1] * P[1] + P[2] * P[2] + x * x - static_cast(2) * P[0] * x - m_cr * m_cr); // => t^2.a + t.b + c = 0, whose solution is: // (-b +/- sqrt(b^2 - 4*a*c))/2*a T discriminant = b * b - static_cast(4) * a * c; if (discriminant < 0.0 && discriminant >= -Geometry::ScalarEpsilon) { discriminant = 0.0; } // We have two solutions. We want the smaller value. d = (-b - std::abs(std::sqrt(discriminant))) / (static_cast(2) * a); SURGSIM_ASSERT(isValid(d)); *point = lineStart + lineDir * d; } *pointOnCapsuleAxis = m_cTransform * Vector3(x, 0.0, 0.0); return d; } /// \param segmentStart [in,out] The start of the line segment /// \param segmentEnd [in,out] The end of the line segment /// \param v The vertices of the triangle. /// \param planeN Normals of the triangle and each of the edge planes. /// \param planeD d from plane equation for the plane of the triangle and each of the edge planes. /// \return The index of the last plane which clips the segment passed in. size_t clipSegmentAgainstTriangle(Vector3* segmentStart, Vector3* segmentEnd, Vector3* v, Vector3* planeN, double* planeD) { double ratio, dStart, dEnd; size_t j = 4; for (size_t i = 0; i < 4; ++i) { dStart = segmentStart->dot(planeN[i]) + planeD[i]; dEnd = segmentEnd->dot(planeN[i]) + planeD[i]; if (dStart < -m_epsilon && dEnd > m_epsilon) { ratio = std::abs(dStart) / (std::abs(dStart) + dEnd); *segmentEnd = *segmentStart + (*segmentEnd - *segmentStart) * ratio; j = i; } else if (dStart > m_epsilon && dEnd < -m_epsilon) { ratio = dStart / (dStart + std::abs(dEnd)); *segmentStart = *segmentStart + (*segmentEnd - *segmentStart) * ratio; j = i; } else if (dStart < m_epsilon && dEnd > m_epsilon) { *segmentEnd = *segmentStart; j = i; } else if (dStart > m_epsilon && dEnd < m_epsilon) { *segmentStart = *segmentEnd; j = i; } } SURGSIM_ASSERT(j < 4) << "The clipping should have happened at least with the triangle plane."; return j; } ///@{ /// Triangle vertices and normal. Vector3 m_tv0; Vector3 m_tv1; Vector3 m_tv2; Vector3 m_tn; ///@} ///@{ /// Capsule ends, axis , radius and length. Vector3 m_cvTop; Vector3 m_cvBottom; Vector3 m_cAxis; double m_cr; double m_cLength; ///@} /// Distance between triangle and capsule double m_distance; ///@{ /// Contact info T m_penetrationDepth; Vector3 m_penetrationPointTriangle; Vector3 m_penetrationPointCapsule; Vector3 m_contactNormal; Vector3 m_penetrationPointCapsuleAxis; ///@} /// The transform of the capsule RigidTransform3 m_cTransform; /// The inverse transform of the capsule SurgSim::DataStructures::OptionalValue m_cInverseTransform; /// epsilon T m_epsilon; }; } template inline bool calculateContactTriangleCapsule( const Eigen::Matrix& tv0, const Eigen::Matrix& tv1, const Eigen::Matrix& tv2, const Eigen::Matrix& tn, const Eigen::Matrix& cv0, const Eigen::Matrix& cv1, double cr, T* penetrationDepth, Eigen::Matrix* penetrationPointTriangle, Eigen::Matrix* penetrationPointCapsule, Eigen::Matrix* contactNormal, Eigen::Matrix* penetrationPointCapsuleAxis) { TriangleCapsuleContactCalculation::TriangleCapsuleContactCalculation calc(tv0, tv1, tv2, tn, cv0, cv1, cr); if (calc.isIntersecting()) { calc.calculateContact(penetrationDepth, penetrationPointTriangle, penetrationPointCapsule, contactNormal, penetrationPointCapsuleAxis); return true; } return false; } template inline bool calculateContactTriangleCapsule( const Eigen::Matrix& tv0, const Eigen::Matrix& tv1, const Eigen::Matrix& tv2, const Eigen::Matrix& cv0, const Eigen::Matrix& cv1, double cr, T* penetrationDepth, Eigen::Matrix* penetrationPoint0, Eigen::Matrix* penetrationPoint1, Eigen::Matrix* contactNormal, Eigen::Matrix* penetrationPointCapsuleAxis) { Eigen::Matrix tn = (tv1 - tv0).cross(tv2 - tv0); Eigen::Matrix ca = cv1 - cv0; if (tn.isZero() || ca.isZero()) { // Degenerate triangle/capsule passed to calculateContactTriangleTriangle return false; } tn.normalize(); return calculateContactTriangleCapsule(tv0, tv1, tv2, tn, cv0, cv1, cr, penetrationDepth, penetrationPoint0, penetrationPoint1, contactNormal, penetrationPointCapsuleAxis); } } // namespace Math } // namespace SurgSim #endif // SURGSIM_MATH_TRIANGLECAPSULECONTACTCALCULATION_INL_H opensurgsim-0.7.0/SurgSim/Math/TriangleTriangleContactCalculation-inl.h000066400000000000000000000445621277777236100262700ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_MATH_TRIANGLETRIANGLECONTACTCALCULATION_INL_H #define SURGSIM_MATH_TRIANGLETRIANGLECONTACTCALCULATION_INL_H namespace SurgSim { namespace Math { /// A helper class for a triangle, used for the following two purposes: /// - Clip against a given plane. /// - Find the deepest point given a plane. /// Created as a triangle and can become 4 or more sided polygon when clipped. /// \note The vertices are stored in order, so that the edges of the polygon run between adjacent vertices /// (and from the last vertex to the first). /// \tparam T Accuracy of the calculation. /// \tparam MOpt Eigen Matrix options. template class TriangleHelper { static const size_t CAPACITY = 10; typedef Eigen::Matrix Vector3; typedef boost::container::static_vector Vertices; public: /// Constructor using the triangle data to initialize. /// \param v0, v1, v2 The vertices of the triangle. /// \param n The normal of the triangle. TriangleHelper(const Vector3& v0, const Vector3& v1, const Vector3& v2, const Vector3& n) : m_normal(n), m_receiverBufferIndex(0) { m_vertices[0] = &v0; m_vertices[1] = &v1; m_vertices[2] = &v2; m_planeD = -m_vertices[0]->dot(m_normal); } /// Given a triangle, find the deepest vertex in the swept volume of that triangle. /// \param triangle The triangle against which the penetration is checked. /// \param [out] penetrationDepth The depth of the deepest point in this triangle to the triangle sent in. /// \param [out] penetrationPoint0 The penetration point on this triangle. /// \param [out] penetrationPoint1 The penetration point on the triangle sent in. void findDeepestPenetrationWithTriangle(const TriangleHelper& triangle, T* penetrationDepth, Vector3* penetrationPoint0, Vector3* penetrationPoint1) { m_clippedVerticesBuffer[0].push_back(*m_vertices[0]); m_clippedVerticesBuffer[0].push_back(*m_vertices[1]); m_clippedVerticesBuffer[0].push_back(*m_vertices[2]); m_receiverBufferIndex = 1; Vector3 clipPlaneNormal; T clipPlaneD; for (size_t i = 0; i < 3; ++i) { triangle.getPrismPlane(i, &clipPlaneNormal, &clipPlaneD); clipAgainstPlane(clipPlaneNormal, clipPlaneD); } findDeepestVertexUnderPlane(triangle.m_normal, triangle.m_planeD, penetrationDepth, penetrationPoint0); SURGSIM_ASSERT(*penetrationDepth <= T(0)) << "The distance from triangle is calculated as " << *penetrationDepth << ". At this point in the" << " algorithm, the depth is expected to be negative."; *penetrationPoint1 = *penetrationPoint0 - (triangle.m_normal * (*penetrationDepth)); *penetrationDepth = -(*penetrationDepth); } private: /// Get the bounding plane of the swept volume of this triangle. /// The swept volume of a triangle is an infinitely long prism. /// \param index There are three prism sides, the index indicates which one is to be calculated. /// \param planeNormal The outward facing normal of the prism plane. /// \param planeD d from the plane equation (n.x + d = 0) of the prism plane. void getPrismPlane(size_t index, Vector3* planeNormal, T* planeD) const { *planeNormal = *m_vertices[(index + 1) % 3] - *m_vertices[index]; *planeNormal = planeNormal->cross(m_normal); planeNormal->normalize(); *planeD = -m_vertices[index]->dot(*planeNormal); } /// Clip the polygon given a plane. Any part of the polygon above this plane is clipped. /// \note This may alter the number of vertices in this polygon. /// \param planeN The normal of the clipping plane. /// \param planeD The d from plane eqn (nx + d) of the clipping plane. void clipAgainstPlane(const Vector3& planeN, T planeD) { // Loop through the edges starting from (m_vertices[0]->m_vertices[1]) to // (m_vertices[m_numVertices - 1]->m_vertices[0]). // The start vertex and end vertex can be either under/on/over the clipping plane. // start | end | action // ---------------------------------------------- // under | under | add start to clipped vertices // under | on | add start to clipped vertices // under | over | add start to clipped vertices, clip the edge to the plane (creating a vertex) // on | under | add start to clipped vertices // on | on | add start to clipped vertices // on | over | add start to clipped vertices // over | under | clip the edge to the plane (creating a vertex) // over | on | none // over | over | none Vertices& clippedVertices = m_clippedVerticesBuffer[m_receiverBufferIndex]; m_receiverBufferIndex = (m_receiverBufferIndex + 1) % 2; Vertices& originalVertices = m_clippedVerticesBuffer[m_receiverBufferIndex]; clippedVertices.clear(); static const T EPSILON = T(Geometry::DistanceEpsilon); // Calculate the signed distance of the vertices from the clipping plane. boost::container::static_vector signedDistanceFromPlane; for (auto it = originalVertices.cbegin(); it != originalVertices.cend(); ++it) { signedDistanceFromPlane.push_back((*it).dot(planeN) + planeD); } // Temp variable. T ratio; // Iterators for the end vertices of an edge. typename boost::container::static_vector::iterator end; // Iterators for the signed distance from plane of the start and end vertices of an edge. auto startSignedDistance = signedDistanceFromPlane.begin(); typename boost::container::static_vector::iterator endSignedDistance; // Iterate over the edges of the current polygon. for (auto start = originalVertices.begin(); start != originalVertices.end(); ++start, ++startSignedDistance) { // If the end has reached the end of list, point it back to the front of list. end = start + 1; endSignedDistance = startSignedDistance + 1; if (end == originalVertices.end()) { end = originalVertices.begin(); endSignedDistance = signedDistanceFromPlane.begin(); } // If the vertex is under or on the plane, add to the clippedVertices. if (*startSignedDistance <= EPSILON) { clippedVertices.push_back(*start); } // If the edge runs from one side of the plane to another. Clip it. if ((*startSignedDistance < -EPSILON && *endSignedDistance > EPSILON) || (*startSignedDistance > EPSILON && *endSignedDistance < -EPSILON)) { ratio = *startSignedDistance / (*startSignedDistance - *endSignedDistance); clippedVertices.push_back(*start + (*end - *start) * ratio); } } } /// Find the deepest vertex of this polygon under the plane. /// \note Asserts if there are no vertices in the polygon. /// \param planeN The normal of the plane. /// \param planeD The distance from origin of the plane. /// \param [out] depth The depth of the deepest point in the polygon from the given plane. /// \param [out] point The deepest point in the polgon from the given plane. void findDeepestVertexUnderPlane(const Vector3& planeN, T planeD, T* depth, Vector3* point) const { const Vertices& originalVertices = m_clippedVerticesBuffer[(m_receiverBufferIndex + 1) % 2]; SURGSIM_ASSERT(originalVertices.size() > 0) << "There are no vertices under the plane. This scenario should not arise according to the" << " Triangle-Triangle Contact Calculation algorithm, because of the circumstances under which" << " this function is set to be called."; T signedDistanceFromPlane; *depth = T(0); for (auto it = originalVertices.cbegin(); it != originalVertices.cend(); ++it) { signedDistanceFromPlane = (*it).dot(planeN) + planeD; if (signedDistanceFromPlane < *depth) { *depth = signedDistanceFromPlane; *point = *it; } } } /// Original vertices of the triangle. const Vector3* m_vertices[3]; /// Normal of the triangle. const Vector3& m_normal; /// d from the plane equation (n.x + d = 0) for the plane of this triangle. T m_planeD; /// The buffers for the clipped vertices of the triangle. Vertices m_clippedVerticesBuffer[2]; size_t m_receiverBufferIndex; }; template inline bool calculateContactTriangleTriangle( const Eigen::Matrix& t0v0, const Eigen::Matrix& t0v1, const Eigen::Matrix& t0v2, const Eigen::Matrix& t1v0, const Eigen::Matrix& t1v1, const Eigen::Matrix& t1v2, const Eigen::Matrix& t0n, const Eigen::Matrix& t1n, T* penetrationDepth, Eigen::Matrix* penetrationPoint0, Eigen::Matrix* penetrationPoint1, Eigen::Matrix* contactNormal) { typedef Eigen::Matrix Vector3; // Check if the triangles intersect. if (!doesIntersectTriangleTriangle(t0v0, t0v1, t0v2, t1v0, t1v1, t1v2, t0n, t1n)) { return false; } // When control reaches here, the two triangles are definitely intersecting. // Calculate the deepest penetration along each of the triangle normals. TriangleHelper triangle1(t0v0, t0v1, t0v2, t0n); TriangleHelper triangle2(t1v0, t1v1, t1v2, t1n); // Penetration info to be calculated. T penetrationDepths[2] = {T(0), T(0)}; Vector3 penetrationPoints[2][2]; // Calculate deepest penetration for each of the triangle. triangle1.findDeepestPenetrationWithTriangle( triangle2, &penetrationDepths[0], &penetrationPoints[0][0], &penetrationPoints[0][1]); triangle2.findDeepestPenetrationWithTriangle( triangle1, &penetrationDepths[1], &penetrationPoints[1][1], &penetrationPoints[1][0]); // Choose the lower penetration of the two as the contact. if (penetrationDepths[0] < penetrationDepths[1]) { *penetrationDepth = penetrationDepths[0]; *contactNormal = t1n; *penetrationPoint0 = penetrationPoints[0][0]; *penetrationPoint1 = penetrationPoints[0][1]; } else { *penetrationDepth = penetrationDepths[1]; *contactNormal = -t0n; *penetrationPoint0 = penetrationPoints[1][0]; *penetrationPoint1 = penetrationPoints[1][1]; } return true; } template inline bool calculateContactTriangleTriangle( const Eigen::Matrix& t0v0, const Eigen::Matrix& t0v1, const Eigen::Matrix& t0v2, const Eigen::Matrix& t1v0, const Eigen::Matrix& t1v1, const Eigen::Matrix& t1v2, T* penetrationDepth, Eigen::Matrix* penetrationPoint0, Eigen::Matrix* penetrationPoint1, Eigen::Matrix* contactNormal) { Eigen::Matrix t0n = (t0v1 - t0v0).cross(t0v2 - t0v0); Eigen::Matrix t1n = (t1v1 - t1v0).cross(t1v2 - t1v0); if (t0n.isZero() || t1n.isZero()) { // Degenerate triangle(s) passed to calculateContactTriangleTriangle return false; } t0n.normalize(); t1n.normalize(); return calculateContactTriangleTriangle(t0v0, t0v1, t0v2, t1v0, t1v1, t1v2, t0n, t1n, penetrationDepth, penetrationPoint0, penetrationPoint1, contactNormal); } template inline bool calculateContactTriangleTriangleSeparatingAxis( const Eigen::Matrix& t0v0, const Eigen::Matrix& t0v1, const Eigen::Matrix& t0v2, const Eigen::Matrix& t1v0, const Eigen::Matrix& t1v1, const Eigen::Matrix& t1v2, const Eigen::Matrix& t0n, const Eigen::Matrix& t1n, T* penetrationDepth, Eigen::Matrix* penetrationPoint0, Eigen::Matrix* penetrationPoint1, Eigen::Matrix* contactNormal) { typedef Eigen::Matrix Vector3; using SurgSim::Math::Geometry::DistanceEpsilon; using SurgSim::Math::Geometry::ScalarEpsilon; SURGSIM_ASSERT(std::abs(t0n.norm() - 1.0) < ScalarEpsilon && std::abs(t1n.norm() - 1.0) < ScalarEpsilon) << "The normals sent in are not normalized! t0n{" << t0n.transpose() << "}, t1n{" << t1n.transpose() << "}."; // Early Rejection test: // If all the vertices of one triangle are on one side of the plane of the other triangle, // there is no intersection. std::array d = {Vector3(t1n.dot(t0v0 - t1v0), t1n.dot(t0v1 - t1v0), t1n.dot(t0v2 - t1v0)), Vector3(t0n.dot(t1v0 - t0v0), t0n.dot(t1v1 - t0v0), t0n.dot(t1v2 - t0v0))}; if ((d[0].array() < DistanceEpsilon).all() || (d[0].array() > -DistanceEpsilon).all() || (d[1].array() < DistanceEpsilon).all() || (d[1].array() > -DistanceEpsilon).all()) { return false; } const std::array, 2> tv = {{{t0v0, t0v1, t0v2}, {t1v0, t1v1, t1v2}}}; // Find the intersection between a triangle and the plane of the other triangle. These intersections would // lie on the separating axis (which is the cross product of the triangle normals). // The name tsa is to indicate that this is storing the intersection of the Triangle with the Separating Axis. std::array, 2> tsa; for (int i = 0; i < 2; ++i) { int index = 0; for (int j = 0; j < 3; ++j) { int k = (j + 1) % 3; // Intersect the edge tivj->tivk with the plane of t{(i+1)/2} if ((d[i][j] < 0.0 && d[i][k] >= 0.0) || (d[i][j] > 0.0 && d[i][k] <= 0.0)) { // The edge intersects the plane of t{(i+1)/2}. auto ratio = std::abs(d[i][j]) / (std::abs(d[i][j]) + std::abs(d[i][k])); tsa[i][index++] = tv[i][j] + ratio * (tv[i][k] - tv[i][j]); } } SURGSIM_ASSERT(index == 2) << "The intersection between the edges of triangle " << i << " and the plane of the other triangle" << " must result in two points exactly."; } // The separating axis. const Vector3 D = t0n.cross(t1n).normalized(); Vector3 result; SURGSIM_ASSERT(distancePointLine(tsa[0][1], tsa[0][0], (tsa[0][0] + D).eval(), &result) < DistanceEpsilon && distancePointLine(tsa[1][0], tsa[0][0], (tsa[0][0] + D).eval(), &result) < DistanceEpsilon && distancePointLine(tsa[1][1], tsa[0][0], (tsa[0][0] + D).eval(), &result) < DistanceEpsilon) << "The intersection points on the triangles do not lie on the separating axis"; static const int DISTANCE = 0; static const int TRIANGLE = 1; static const int VERTEX = 2; // Find the signed distance of the four points on D (from tsa[0][0]) // Store it in a tuple containing this signed distance, the corresponding triangle ID and vertex ID. std::array, 4> intervals = {std::tuple(0.0, 0, 0), std::tuple((tsa[0][1] - tsa[0][0]).dot(D), 0, 1), std::tuple((tsa[1][0] - tsa[0][0]).dot(D), 1, 0), std::tuple((tsa[1][1] - tsa[0][0]).dot(D), 1, 1)}; // Sort the signed distance std::sort(intervals.begin(), intervals.end(), [](const std::tuple& i, std::tuple& j) { return (std::get(i) < std::get(j)); }); // The intersections of the triangles on the separating axis (P, Q, R, S) are now sorted according to their distance // along the separating axis. // // *--------*--------*--------* // P Q R S // If P and Q belong to the same triangle, there is no intersection between the triangles. enum {P = 0, Q, R, S}; if (std::get(intervals[P]) == std::get(intervals[Q])) { return false; } // At this point, there is some overlap of the triangles along the separating axis. size_t indexLeft, indexRight; if (std::get(intervals[Q]) == std::get(intervals[R])) { // Q and R belong to the same triangle: Depending on whether PQ or RS is shorter, either PS is moved to the // right of QR or QR is moved to the right of PS. // // *--------*--------*--------* // P Q R S // *--------* // t1 // *--------------------------* // t2 if ((std::get(intervals[Q]) - std::get(intervals[P])) < (std::get(intervals[S]) - std::get(intervals[R]))) { indexLeft = P; indexRight = R; } else { indexLeft = Q; indexRight = S; } } else { // Q and R belong to different triangle: QS is moved to the right of PR. // // *--------*--------*--------* // P Q R S // *-----------------* // t1 // *-----------------* // t2 indexLeft = Q; indexRight = R; } *penetrationDepth = std::get(intervals[indexRight]) - std::get(intervals[indexLeft]); if (*penetrationDepth < DistanceEpsilon) { // Not enough overlap to be determined as an intersection. return false; } if (std::get(intervals[indexLeft]) == 0) { *penetrationPoint0 = tsa[0][std::get(intervals[indexLeft])]; *penetrationPoint1 = tsa[1][std::get(intervals[indexRight])]; } else { *penetrationPoint0 = tsa[0][std::get(intervals[indexRight])]; *penetrationPoint1 = tsa[1][std::get(intervals[indexLeft])]; } if ((*penetrationPoint0 - *penetrationPoint1).dot(D) > 0.0) { *contactNormal = -D; } else { *contactNormal = D; } return true; } template inline bool calculateContactTriangleTriangleSeparatingAxis( const Eigen::Matrix& t0v0, const Eigen::Matrix& t0v1, const Eigen::Matrix& t0v2, const Eigen::Matrix& t1v0, const Eigen::Matrix& t1v1, const Eigen::Matrix& t1v2, T* penetrationDepth, Eigen::Matrix* penetrationPoint0, Eigen::Matrix* penetrationPoint1, Eigen::Matrix* contactNormal) { Eigen::Matrix t0n = (t0v1 - t0v0).cross(t0v2 - t0v0); Eigen::Matrix t1n = (t1v1 - t1v0).cross(t1v2 - t1v0); if (t0n.isZero() || t1n.isZero()) { // Degenerate triangle(s) passed to calculateContactTriangleTriangle return false; } t0n.normalize(); t1n.normalize(); return calculateContactTriangleTriangleSeparatingAxis(t0v0, t0v1, t0v2, t1v0, t1v1, t1v2, t0n, t1n, penetrationDepth, penetrationPoint0, penetrationPoint1, contactNormal); } } // namespace Math } // namespace SurgSim #endif // SURGSIM_MATH_TRIANGLETRIANGLECONTACTCALCULATION_INL_H opensurgsim-0.7.0/SurgSim/Math/TriangleTriangleIntersection-inl.h000066400000000000000000000166171277777236100251640ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_MATH_TRIANGLETRIANGLEINTERSECTION_INL_H #define SURGSIM_MATH_TRIANGLETRIANGLEINTERSECTION_INL_H namespace { static const double EPSILOND = 1e-12; } namespace SurgSim { namespace Math { /// Two ends of the triangle edge are given in terms of the following vertex properties. /// - Signed distance from the colliding triangle. /// - Projection on the separating axis. /// Get the intersection of this edge and the plane in terms of the projection on the separating axis. /// \tparam T Accuracy of the calculation, can usually be inferred. /// \param dStart Signed distance of the start of edge from the plane of the colliding triangle. /// \param dEnd Signed distance of the end of edge from the plane of the colliding triangle. /// \param pvStart Projection of the start of edge from the plane of the colliding triangle. /// \param pvEnd Projection of the end of edge from the plane of the colliding triangle. /// \param parametricIntersection Parametric representation of the intersection between the triangle edge /// and the plane in terms of the projection on the separating axis. /// \param parametricIntersectionIndex The array index of parametricIntersection. template void edgeIntersection(T dStart, T dEnd, T pvStart, T pvEnd, T* parametricIntersection, size_t* parametricIntersectionIndex) { // Epsilon used in this function. static const T EPSILON = static_cast(EPSILOND); bool edgeFromUnderToAbove = dStart < 0.0 && dEnd >= 0.0; bool edgeFromAboveToUnder = dStart > 0.0 && dEnd <= 0.0; if (edgeFromUnderToAbove || edgeFromAboveToUnder) { if (std::abs(dStart - dEnd) < EPSILON) { // Start and End are really close. Pick start. parametricIntersection[(*parametricIntersectionIndex)++] = pvStart; } else { // Clip to the point in the intersection of Start->End and plane of the colliding triangle. parametricIntersection[(*parametricIntersectionIndex)++] = pvStart + (pvEnd - pvStart) * (dStart / (dStart - dEnd)); } } } template inline bool doesIntersectTriangleTriangle( const Eigen::Matrix& t0v0, const Eigen::Matrix& t0v1, const Eigen::Matrix& t0v2, const Eigen::Matrix& t1v0, const Eigen::Matrix& t1v1, const Eigen::Matrix& t1v2, const Eigen::Matrix& t0n, const Eigen::Matrix& t1n) { typedef Eigen::Matrix Vector3; using SurgSim::Math::Geometry::DistanceEpsilon; if (t0n.isZero() || t1n.isZero()) { // Degenerate triangle(s) passed to checkTriangleTriangleIntersection. return false; } // Variable names mentioned here are the notations used in the paper: // T1 - Triangle with vertices (t0v0, t0v1, t0v2). // T2 - Triangle with vertices (t1v0, t1v1, t1v2). // d1[3] - Signed distances of the vertices of T1 from the plane of T2. // d2[3] - Signed distances of the vertices of T2 from the plane of T1. // D - Separating axis used for the test. This is calculated as the cross products of the triangle normals. // pv1[3] - Projection of the vertices of T1 onto the separating axis (D). // pv2[3] - Projection of the vertices of T2 onto the separating axis (D). // s1[2] - The intersection between T1 and D is a line segment. // s1[0] and s1[1] are the parametric representation of the ends of this line segment. // s2[2] - The intersection between T2 and D is a line segment. // s2[0] and s2[1] are the parametric representation of the ends of this line segment. // Early Rejection test: // If all the vertices of one triangle are on one side of the plane of the other triangle, // there is no intersection. // Check if all the vertices of T2 are on one side of p1. // Plane eqn of T1: DotProduct(t0n, X) + distanceFromOrigin = 0 // where distanceFromOrigin = -DotProduct(t0n, t0v0) // So, plane eqn of T1: DotProduct(t0n, X - t0v0) = 0 // Distance of first vertex of T2 from the plane of T1 is: DotProduct(t0n, t1v0 - t0v0) Vector3 d2(t0n.dot(t1v0 - t0v0), t0n.dot(t1v1 - t0v0), t0n.dot(t1v2 - t0v0)); if ((d2.array() < DistanceEpsilon).all() || (d2.array() > -DistanceEpsilon).all()) { return false; } // Check if all the vertices of T1 are on one side of p2. Vector3 d1(t1n.dot(t0v0 - t1v0), t1n.dot(t0v1 - t1v0), t1n.dot(t0v2 - t1v0)); if ((d1.array() < DistanceEpsilon).all() || (d1.array() > -DistanceEpsilon).all()) { return false; } // The separating axis. Vector3 D = t0n.cross(t1n).normalized(); // Projection of the triangle vertices on the separating axis. Vector3 pv1(D.dot(t0v0), D.dot(t0v1), D.dot(t0v2)); Vector3 pv2(D.dot(t1v0), D.dot(t1v1), D.dot(t1v2)); // The intersection of the triangles with the separating axis (D). T s1[3]; T s2[3]; size_t s1Index = 0; size_t s2Index = 0; // Loop through the edges of each triangle and find the intersection of these edges onto // the plane of the other triangle. for (int i = 0; i < 3; ++i) { int j = (i + 1) % 3; edgeIntersection(d1[i], d1[j], pv1[i], pv1[j], s1, &s1Index); edgeIntersection(d2[i], d2[j], pv2[i], pv2[j], s2, &s2Index); } SURGSIM_ASSERT(s1Index == 2 && s2Index == 2) << "The intersection between the triangle and the separating axis is not a line segment." << " This scenario cannot happen, at this point in the algorithm."; // s1[0], s1[1] are the (unordered) extents of the projection of T1 on D. // s2[0], s2[1] are the (unordered) extents of the projection of T2 on D. // If both these are line segments (i.e. the distance between them is > epsilon), // and if they overlap, then the two triangles intersect. return !(std::abs(s1[0] - s1[1]) <= DistanceEpsilon || std::abs(s2[0] - s2[1]) <= DistanceEpsilon) && !(s1[0] <= (s2[0] + DistanceEpsilon) && s1[0] <= (s2[1] + DistanceEpsilon) && s1[1] <= (s2[0] + DistanceEpsilon) && s1[1] <= (s2[1] + DistanceEpsilon)) && !(s1[0] >= (s2[0] - DistanceEpsilon) && s1[0] >= (s2[1] - DistanceEpsilon) && s1[1] >= (s2[0] - DistanceEpsilon) && s1[1] >= (s2[1] - DistanceEpsilon)); } template inline bool doesIntersectTriangleTriangle( const Eigen::Matrix& t0v0, const Eigen::Matrix& t0v1, const Eigen::Matrix& t0v2, const Eigen::Matrix& t1v0, const Eigen::Matrix& t1v1, const Eigen::Matrix& t1v2) { Eigen::Matrix t0n = (t0v1 - t0v0).cross(t0v2 - t0v0); Eigen::Matrix t1n = (t1v1 - t1v0).cross(t1v2 - t1v0); if (t0n.isZero() || t1n.isZero()) { // Degenerate triangle(s) passed to checkTriangleTriangleIntersection. return false; } t0n.normalize(); t1n.normalize(); return doesIntersectTriangleTriangle(t0v0, t0v1, t0v2, t1v0, t1v1, t1v2, t0n, t1n); } } // namespace Math } // namespace SurgSim #endif // SURGSIM_MATH_TRIANGLETRIANGLEINTERSECTION_INL_H opensurgsim-0.7.0/SurgSim/Math/UnitTests/000077500000000000000000000000001277777236100203405ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Math/UnitTests/AabbTests.cpp000066400000000000000000000057211277777236100227210ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Math/Aabb.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Math/RigidTransform.h" namespace SurgSim { namespace Math { TEST(AabbTests, DoIntersectTest) { Aabbd center(Vector3d(-1.0, -1.0, -1.0), Vector3d(1.0, 1.0, 1.0)); // Move the sampler around in all directions only when one of the factors is greater than 2 // Should the intersection fail for (double i = -3.0; i <= 3.0; i += 1) { for (double j = -3.0; j <= 3.0; j += 1) { for (double k = -3.0; k <= 3.0; k += 1) { Vector3d translation(i, j, k); /// Whenever all of the coordinates are <= 2.0 the result should be true bool expected = (translation.cwiseAbs().array().abs() <= Vector3d(2.0, 2.0, 2.0).array()).all(); Aabbd sampler = Aabbd(center).translate(translation); EXPECT_EQ(expected, doAabbIntersect(center, sampler)) << "Error For " << translation.transpose(); EXPECT_EQ(expected, doAabbIntersect(sampler, center)) << "Error For " << translation.transpose(); EXPECT_EQ(expected, doAabbIntersect(center, sampler, 0.0)) << "Error For " << translation.transpose(); EXPECT_EQ(expected, doAabbIntersect(sampler, center, 0.0)) << "Error For " << translation.transpose(); double tolerance = 0.01; expected = (translation.cwiseAbs().array().abs() <= Vector3d(2.0 + tolerance, 2.0 + tolerance, 2.0 + tolerance).array()).all(); EXPECT_EQ(expected, doAabbIntersect(center, sampler, tolerance)) << "Error For " << tolerance << " " << translation.transpose(); EXPECT_EQ(expected, doAabbIntersect(sampler, center, tolerance)) << "Error For " << tolerance << " " << translation.transpose(); } } } } TEST(AabbdTests, makeAabb) { Vector3d one(0.0, 0.0, 0.0); Vector3d two(-1.0, -1.0, -1.0); Vector3d three(1.0, 1.0, 1.0); Aabbd aabb(makeAabb(one, two, three)); Aabbd expected(Vector3d(-1.0, -1.0, -1.0), Vector3d(1.0, 1.0, 1.0)); EXPECT_TRUE(expected.isApprox(aabb)); } TEST(AabbdTest, rotateAabb) { Vector3d one(1.0, 2.0, 3.0); Vector3d two(-6.0, -4.0, -3.0); RigidTransform3d transform = makeRigidTransform(Quaterniond(0.0, 1.0, 0.0, 0.0), Vector3d(1.0, 2.0, 3.0)); Aabbd expected(transform * one); expected.extend(transform * two); Aabbd aabb(one); aabb.extend(two); aabb = transformAabb(transform, aabb); EXPECT_TRUE(expected.isApprox(aabb)); } } } opensurgsim-0.7.0/SurgSim/Math/UnitTests/AngleAxisTests.cpp000066400000000000000000000037651277777236100237550ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests that exercise the functionality of our quaternion typedefs, which /// come straight from Eigen. #include #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/MathConvert.h" #include "gtest/gtest.h" // Define test fixture class templates. // We don't really need fixtures as such, but the templatization encodes type. template class AngleAxisTests : public testing::Test { public: typedef T AngleAxis; typedef typename T::Scalar Scalar; }; typedef ::testing::Types AngleAxisVariants; TYPED_TEST_CASE(AngleAxisTests, AngleAxisVariants); // Now we're ready to start testing... // Test conversion to and from yaml node TYPED_TEST(AngleAxisTests, YamlConvert) { typedef typename TestFixture::AngleAxis AngleAxis; typedef typename TestFixture::Scalar T; AngleAxis angleAxis; angleAxis.angle() = T(0.1); angleAxis.axis()[0] = T(1.2); angleAxis.axis()[1] = T(2.3); angleAxis.axis()[2] = T(3.4); YAML::Node node; ASSERT_NO_THROW(node = angleAxis); EXPECT_TRUE(node.IsMap()); YAML::Node angleNode = node["Angle"]; EXPECT_TRUE(angleNode.IsScalar()); YAML::Node axisNode = node["Axis"]; EXPECT_TRUE(axisNode.IsSequence()); EXPECT_EQ(3u, axisNode.size()); ASSERT_NO_THROW({ AngleAxis expected = node.as(); }); EXPECT_TRUE(angleAxis.isApprox(node.as())); } opensurgsim-0.7.0/SurgSim/Math/UnitTests/CMakeLists.txt000066400000000000000000000056441277777236100231110ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2012-2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. include_directories( ${gtest_SOURCE_DIR}/include ) set(UNIT_TEST_SOURCES AabbTests.cpp CardinalSplinesTests.cpp CompoundShapeTests.cpp CubicSolverTests.cpp GeometryTests.cpp IntervalArithmeticTests.cpp KalmanFilterTests.cpp LinearMotionArithmeticTests.cpp MakeRigidTransformTests.cpp MeshShapeTests.cpp MinMaxTests.cpp MlcpGaussSeidelSolverTests.cpp OdeEquationTests.cpp OdeSolverEulerExplicitModifiedTests.cpp OdeSolverEulerExplicitTests.cpp OdeSolverEulerImplicitTests.cpp OdeSolverRungeKutta4Tests.cpp OdeSolverStaticTests.cpp OdeSolverTests.cpp OdeStateTests.cpp ParticlesShapeTests.cpp PolynomialRootTests.cpp PolynomialTests.cpp PolynomialValuesTests.cpp ScalarTests.cpp SegmentMeshShapeTests.cpp ShapeTests.cpp SurfaceMeshShapeTests.cpp TriangleCapsuleContactCalculationTests.cpp TriangleTriangleContactCalculationTests.cpp TriangleTriangleIntersectionTests.cpp TriangleTriangleSeparatingAxisContactCalculationTests.cpp ValidTests.cpp ) set(UNIT_TEST_HEADERS MockCapsule.h MockObject.h MockTriangle.h TriangleTriangleTestParameters.h ) set(UNIT_TEST_EIGEN_TYPE_SOURCES AngleAxisTests.cpp LinearSolveAndInverseTests.cpp LinearSparseSolveAndInverseTests.cpp MatrixTests.cpp QuaternionTests.cpp RigidTransformTests.cpp SparseMatrixTests.cpp VectorTests.cpp ) set(UNIT_TEST_EIGEN_TYPE_HEADERS ) option(BUILD_TESTING_EIGEN "Include basic tests for Eigen math class typedefs, which build very slowly." OFF) if(BUILD_TESTING_EIGEN) set(UNIT_TEST_SOURCES ${UNIT_TEST_SOURCES} ${UNIT_TEST_EIGEN_TYPE_SOURCES}) set(UNIT_TEST_HEADERS ${UNIT_TEST_HEADERS} ${UNIT_TEST_EIGEN_TYPE_HEADERS}) # Fix a problem with 64-bit builds running out of sections. if(MSVC AND CMAKE_CL_64) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /bigobj") endif(MSVC AND CMAKE_CL_64) endif(BUILD_TESTING_EIGEN) set(LIBS SurgSimMath MlcpTestIO ) file(COPY ${SURGSIM_SOURCE_DIR}/SurgSim/Math/UnitTests/MlcpTestData DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) file(COPY ${SURGSIM_SOURCE_DIR}/SurgSim/Math/UnitTests/Data DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) # Configure the path for the data files configure_file( "${CMAKE_CURRENT_SOURCE_DIR}/config.txt.in" "${CMAKE_CURRENT_BINARY_DIR}/config.txt" ) surgsim_add_unit_tests(SurgSimMathTest) set_target_properties(SurgSimMathTest PROPERTIES FOLDER "Math") opensurgsim-0.7.0/SurgSim/Math/UnitTests/CardinalSplinesTests.cpp000066400000000000000000000072421277777236100251470ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for Cardinal Splines interpolation utilities /// #include #include #include #include "SurgSim/DataStructures/Vertices.h" #include "SurgSim/Math/CardinalSplines.h" TEST(CardinalSplinesTests, extension) { { SurgSim::DataStructures::VerticesPlain emptyPoints; std::vector result; EXPECT_ANY_THROW(SurgSim::Math::CardinalSplines::extendControlPoints(emptyPoints, &result)); } { SurgSim::DataStructures::VerticesPlain onePoints; onePoints.addVertex(SurgSim::DataStructures::VerticesPlain::VertexType(SurgSim::Math::Vector3d(0.0, 1.0, 2.0))); std::vector result; EXPECT_ANY_THROW(SurgSim::Math::CardinalSplines::extendControlPoints(onePoints, &result)); } { SurgSim::DataStructures::VerticesPlain twoPoints; twoPoints.addVertex(SurgSim::DataStructures::VerticesPlain::VertexType(SurgSim::Math::Vector3d(0.0, 0.0, 0.0))); twoPoints.addVertex(SurgSim::DataStructures::VerticesPlain::VertexType(SurgSim::Math::Vector3d(1.0, 2.0, 3.0))); EXPECT_ANY_THROW(SurgSim::Math::CardinalSplines::extendControlPoints(twoPoints, nullptr)); } { SurgSim::DataStructures::VerticesPlain twoPoints; twoPoints.addVertex(SurgSim::DataStructures::VerticesPlain::VertexType(SurgSim::Math::Vector3d(0.0, 0.0, 0.0))); twoPoints.addVertex(SurgSim::DataStructures::VerticesPlain::VertexType(SurgSim::Math::Vector3d(1.0, 2.0, 3.0))); std::vector result; EXPECT_NO_THROW(SurgSim::Math::CardinalSplines::extendControlPoints(twoPoints, &result)); EXPECT_EQ(4u, result.size()); EXPECT_TRUE(result[0].isApprox(SurgSim::Math::Vector3d(-1.0, -2.0, -3.0))); EXPECT_TRUE(result[3].isApprox(SurgSim::Math::Vector3d(2.0, 4.0, 6.0))); } } TEST(CardinalSplinesTests, interpolate) { std::vector controlPoints; std::vector points; controlPoints.push_back(SurgSim::Math::Vector3d(0.0, 1.0, 2.0)); controlPoints.push_back(SurgSim::Math::Vector3d(0.1, 1.1, 2.1)); controlPoints.push_back(SurgSim::Math::Vector3d(0.2, 1.2, 2.2)); // Less than 4 control points. EXPECT_ANY_THROW(SurgSim::Math::CardinalSplines::interpolate(1, controlPoints, &points, 0.5)); controlPoints.push_back(SurgSim::Math::Vector3d(0.3, 1.3, 2.3)); EXPECT_NO_THROW(SurgSim::Math::CardinalSplines::interpolate(0, controlPoints, &points, 0.5)); EXPECT_EQ(4u, points.size()); auto control = controlPoints.begin(); for (auto point : points) { EXPECT_DOUBLE_EQ(point[0], (*control)[0]); EXPECT_DOUBLE_EQ(point[1], (*control)[1]); EXPECT_DOUBLE_EQ(point[2], (*control)[2]); control++; } points.clear(); EXPECT_ANY_THROW(SurgSim::Math::CardinalSplines::interpolate(1, controlPoints, &points, -0.5)); EXPECT_ANY_THROW(SurgSim::Math::CardinalSplines::interpolate(1, controlPoints, &points, 1.5)); EXPECT_ANY_THROW(SurgSim::Math::CardinalSplines::interpolate(1, controlPoints, nullptr, 0.5)); EXPECT_NO_THROW(SurgSim::Math::CardinalSplines::interpolate(10, controlPoints, &points, 0.5)); EXPECT_EQ(10u, points.size()); }opensurgsim-0.7.0/SurgSim/Math/UnitTests/CompoundShapeTests.cpp000066400000000000000000000163441277777236100246440ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Math/CompoundShape.h" #include "SurgSim/Math/MathConvert.h" #include "SurgSim/Math/Shapes.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Vector.h" #include namespace SurgSim { namespace Math { struct CompoundShapeTest : public ::testing::Test { public: virtual void SetUp() { compoundShape = std::make_shared(); shape1 = std::make_shared(1.0, 1.0, 1.0); shape2 = std::make_shared(1.0, 2.0, 1.0); transform1 = makeRigidTranslation(Vector3d(-1.0, 0.0, 0.0)); transform2 = makeRigidTranslation(Vector3d(1.0, 0.0, 0.0)); } std::shared_ptr compoundShape; std::shared_ptr shape1; std::shared_ptr shape2; RigidTransform3d transform1; RigidTransform3d transform2; }; TEST_F(CompoundShapeTest, SimpleShapes) { EXPECT_EQ(0u, compoundShape->getNumShapes()); auto index = compoundShape->addShape(shape1); EXPECT_EQ(0u, index); EXPECT_EQ(1u, compoundShape->getNumShapes()); index = compoundShape->addShape(shape2, transform2); EXPECT_EQ(1u, index); EXPECT_EQ(2u, compoundShape->getNumShapes()); EXPECT_EQ(shape1, compoundShape->getShape(0)); EXPECT_EQ(shape2, compoundShape->getShape(1)); EXPECT_ANY_THROW(compoundShape->getShape(3)); compoundShape->clearShapes(); EXPECT_EQ(0u, compoundShape->getNumShapes()); } TEST_F(CompoundShapeTest, Transforms) { compoundShape->addShape(shape1); EXPECT_TRUE(RigidTransform3d::Identity().isApprox(compoundShape->getPose(0))); compoundShape->addShape(shape2, transform2); EXPECT_TRUE(transform2.isApprox(compoundShape->getPose(1))); compoundShape->setPose(0, transform2); EXPECT_TRUE(transform2.isApprox(compoundShape->getPose(0))); compoundShape->setPose(1, transform1); std::vector poses; EXPECT_ANY_THROW(compoundShape->setPoses(poses)); poses.push_back(transform1); poses.push_back(transform2); EXPECT_NO_THROW(compoundShape->setPoses(poses)); EXPECT_TRUE(transform1.isApprox(compoundShape->getPose(0))); EXPECT_TRUE(transform2.isApprox(compoundShape->getPose(1))); } TEST_F(CompoundShapeTest, Volume) { EXPECT_DOUBLE_EQ(0.0, compoundShape->getVolume()); compoundShape->addShape(shape1); EXPECT_DOUBLE_EQ(1.0, compoundShape->getVolume()); compoundShape->addShape(shape2, transform2); EXPECT_DOUBLE_EQ(3.0, compoundShape->getVolume()); } TEST_F(CompoundShapeTest, Center) { Vector3d center = Vector3d::Zero(); EXPECT_TRUE(center.isApprox(compoundShape->getCenter())) << "Expected:" << center.transpose() << " Actual: " << compoundShape->getCenter().transpose(); center = transform1.translation(); compoundShape->addShape(shape1, transform1); EXPECT_TRUE(center.isApprox(compoundShape->getCenter())) << "Expected:" << center.transpose() << " Actual: " << compoundShape->getCenter().transpose(); EXPECT_DOUBLE_EQ(1.0, compoundShape->getVolume()); center = Vector3d(1.0 - 2.0 / 3.0, 0.0, 0.0); compoundShape->addShape(shape2, transform2); EXPECT_TRUE(center.isApprox(compoundShape->getCenter())) << "Expected:" << center.transpose() << " Actual: " << compoundShape->getCenter().transpose(); EXPECT_DOUBLE_EQ(3.0, compoundShape->getVolume()); } TEST_F(CompoundShapeTest, SecondMomentOfVolumeBasic) { auto zero = Math::Matrix33d::Zero(); EXPECT_TRUE(zero.isApprox(compoundShape->getSecondMomentOfVolume())); auto box1 = std::make_shared(1.0, 1.0, 1.0); auto box2 = std::make_shared(2.0, 1.0, 1.0); auto left = makeRigidTranslation(Vector3d(-0.5, 0.0, 0.0)); auto right = makeRigidTranslation(Vector3d(0.5, 0.0, 0.0)); compoundShape->addShape(box1); auto shapeInertia = box1->getSecondMomentOfVolume(); auto compoundInertia = compoundShape->getSecondMomentOfVolume(); EXPECT_TRUE(shapeInertia.isApprox(compoundInertia)); compoundShape->clearShapes(); compoundShape->addShape(box1, left); compoundShape->addShape(box1, right); shapeInertia = box2->getSecondMomentOfVolume(); compoundInertia = compoundShape->getSecondMomentOfVolume(); EXPECT_TRUE(shapeInertia.isApprox(compoundInertia)); } TEST_F(CompoundShapeTest, SecondMomentOfVolumeComplex) { // Organisation of shape // // tl Y-Axis // tl ^ // bl -> 0, Z-Axis // bl // bl auto base = std::make_shared(1.0, 5.0, 2.0); auto l = std::make_shared(1.0, 5.0, 1.0); compoundShape->addShape(l, makeRigidTranslation(Vector3d(0.0, 0.0, 0.5))); auto t = std::make_shared(2.0, 1.0, 1.0); Quaterniond quat = makeRotationQuaternion(M_PI_2, Vector3d::UnitZ().eval()); auto transform = makeRigidTransform(quat, Vector3d(0.0, 1.5, -0.5)); compoundShape->addShape(t, transform); auto b = std::make_shared(3.0, 1.0, 1.0); quat = makeRotationQuaternion(-M_PI_2, Vector3d::UnitZ().eval()); transform = makeRigidTransform(quat, Vector3d(0.0, -1.0, -0.5)); compoundShape->addShape(b, transform); auto shapeInertia = base->getSecondMomentOfVolume(); auto compoundInertia = compoundShape->getSecondMomentOfVolume(); EXPECT_TRUE(shapeInertia.isApprox(compoundInertia)); } TEST_F(CompoundShapeTest, Properties) { auto box = std::make_shared(1.0, 5.0, 2.0); std::vector shapes, result; shapes.emplace_back(shape1, transform1); shapes.emplace_back(box, transform2); ASSERT_NO_THROW(compoundShape->setValue("Shapes", shapes)); ASSERT_NO_THROW(result = compoundShape->getValue>("Shapes")); // Spot check content EXPECT_EQ(2u, result.size()); EXPECT_TRUE(transform2.isApprox(result[1].second)); } TEST_F(CompoundShapeTest, Serialization) { std::shared_ptr shape; ASSERT_NO_THROW(shape = Shape::getFactory().create("SurgSim::Math::CompoundShape")); std::vector shapes; shapes.emplace_back(shape1, transform1); shapes.emplace_back(shape2, transform2); shape->setValue("Shapes", shapes); EXPECT_TRUE(shape->isValid()); YAML::Node node; ASSERT_NO_THROW(node = shape); EXPECT_TRUE(node.IsMap()); EXPECT_EQ(1u, node.size()); ASSERT_TRUE(node["SurgSim::Math::CompoundShape"].IsDefined()); auto data = node["SurgSim::Math::CompoundShape"]; EXPECT_EQ(1u, data.size()); std::shared_ptr compoundShape; ASSERT_NO_THROW(compoundShape = std::dynamic_pointer_cast(node.as>())); EXPECT_EQ("SurgSim::Math::CompoundShape", compoundShape->getClassName()); EXPECT_TRUE(compoundShape->isValid()); // Check de-serialized data std::vector result; ASSERT_NO_THROW(result = compoundShape->getValue>("Shapes")); EXPECT_EQ(2u, result.size()); EXPECT_TRUE(transform2.isApprox(result[1].second)); } } } opensurgsim-0.7.0/SurgSim/Math/UnitTests/CubicSolverTests.cpp000066400000000000000000000153571277777236100243220ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file CubicSolverTests.cpp /// Tests for the cubic solver function. #include #include "SurgSim/Math/CubicSolver.h" namespace SurgSim { namespace Math { typedef Polynomial CubicPolynomial; TEST(CubicSolverTests, DegenerateCases) { std::array roots; int numberOfRoots; { SCOPED_TRACE("0.x^3 + x^2 + x + 1 = 0 (no solution on R: none on [0..1])"); EXPECT_NO_THROW(numberOfRoots = findRootsInRange01(CubicPolynomial(1.0, 1.0, 1.0, 0.0), &roots)); EXPECT_EQ(0, numberOfRoots); } { SCOPED_TRACE("0.x^3 + 1x^2 + 4x - 12 = 0 (2 solutions on R: -6 and 2, none on [0..1])"); EXPECT_NO_THROW(numberOfRoots = findRootsInRange01(CubicPolynomial(-12.0, 4.0, 1.0, 0.0), &roots)); EXPECT_EQ(0, numberOfRoots); } { SCOPED_TRACE("0.x^3 + x^2 + 0x + 0 = 0 (1 solution on R: 0, 1 on [0..1])"); EXPECT_NO_THROW(numberOfRoots = findRootsInRange01(CubicPolynomial(0.0, 0.0, 1.0, 0.0), &roots)); EXPECT_EQ(1, numberOfRoots); EXPECT_DOUBLE_EQ(0.0, roots[0]); } { SCOPED_TRACE("0.x^3 + x^2 + x - 2 = 0 (2 solutions on R: -2 and 1, 1 on [0..1])"); EXPECT_NO_THROW(numberOfRoots = findRootsInRange01(CubicPolynomial(-2.0, 1.0, 1.0, 0.0), &roots)); EXPECT_EQ(1, numberOfRoots); EXPECT_DOUBLE_EQ(1.0, roots[0]); } { SCOPED_TRACE("0.x^3 + 2x^2 + x - 1 = 0 (2 solutions on R: -1 and 0.5, 1 on [0..1])"); EXPECT_NO_THROW(numberOfRoots = findRootsInRange01(CubicPolynomial(-1.0, 1.0, 2.0, 0.0), &roots)); EXPECT_EQ(1, numberOfRoots); EXPECT_DOUBLE_EQ(0.5, roots[0]); } }; TEST(CubicSolverTests, dNullCase) { std::array roots; int numberOfRoots; { SCOPED_TRACE("x^3 + x^2 + x + 0 = 0"); EXPECT_NO_THROW(numberOfRoots = findRootsInRange01(CubicPolynomial(0.0, 1.0, 1.0, 1.0), &roots)); EXPECT_EQ(1, numberOfRoots); EXPECT_DOUBLE_EQ(0.0, roots[0]); } } TEST(CubicSolverTests, DerivativeNullDeterminantCases) { std::array roots; int numberOfRoots; { SCOPED_TRACE("P(x) = -x^3 + 3x^2 - 3x + 1 = 0 => P'(x) = -3x^2 + 6x - 3 => discriminant = 36 - 4*(3)*(3) = 0"); EXPECT_NO_THROW(numberOfRoots = findRootsInRange01(CubicPolynomial(1.0, -3.0, 3.0, -1.0), &roots)); EXPECT_EQ(1, numberOfRoots); EXPECT_DOUBLE_EQ(1.0, roots[0]); } { SCOPED_TRACE("P(x) = -x^3 + 3x^2 - 3x - 2 = 0 => P'(x) = -3x^2 + 6x - 3 => discriminant = 36 - 4*(3)*(3) = 0"); EXPECT_NO_THROW(numberOfRoots = findRootsInRange01(CubicPolynomial(-2.0, -3.0, 3.0, -1.0), &roots)); EXPECT_EQ(0, numberOfRoots); } }; TEST(CubicSolverTests, DerivativeNegativeDeterminantCases) { std::array roots; int numberOfRoots; { SCOPED_TRACE("P(x) = x^3 + x^2 + x + 1 = 0 => P'(x) = 3x^2 + 2x + 1 => discriminant = 4 - 4*(3)*(1) = -8"); // P(0) = 1 // P(1) = 4 // P is monotonic and 0 is not in [P(0)..P(1)], so the unique solution is not within [0..1] EXPECT_NO_THROW(numberOfRoots = findRootsInRange01(CubicPolynomial(1.0, 1.0, 1.0, 1.0), &roots)); EXPECT_EQ(0, numberOfRoots); } { SCOPED_TRACE("P(x) = x^3 - x^2 + x - 0.5 = 0 => P'(x) = 3x^2 - 2x + 1 => discriminant = 4 - 4*(3)*(1) = -8"); // P(0) = -0.5 // P(1) = 0.5 // P is monotonic and 0 is in [P(0)..P(1)], so the unique solution is within [0..1] CubicPolynomial p(-0.5, 1.0, -1.0, 1.0); EXPECT_NO_THROW(numberOfRoots = findRootsInRange01(p, &roots)); EXPECT_EQ(1, numberOfRoots); EXPECT_TRUE(roots[0] >= 0.0 && roots[0] <= 1.0); double eval = p.evaluate(roots[0]); EXPECT_TRUE(isNearZero(eval)) << "P(" << roots[0] << ") = " << eval; } }; TEST(CubicSolverTests, DerivativePositiveDeterminantCases) { std::array roots; int numberOfRoots; { SCOPED_TRACE("P(x) = -x^3 + x^2 + x + 1 = 0 => P'(x) = -3x^2 + 2x + 1 => discriminant = 4 - 4*(-3)*(1) = 16"); // P' has 2 roots: -1/3 and 1 // P'(-1/3) = 0 P'(1) = 0 // P (-1/3) = 1 > -1/27 + 1/9 - 1/3 + 1 > 0 P(0) = 1 P (1) = 2 // P is monotonic in 3 intervals [-Inf -1/3[, [-1/3 1] and ]1 +Inf[ // Therefore P is monotonic in [0..1] and above 0 on this interval, so there is no root in [0..1] EXPECT_NO_THROW(numberOfRoots = findRootsInRange01(CubicPolynomial(1.0, 1.0, 1.0, -1.0), &roots)); EXPECT_EQ(0, numberOfRoots); } { SCOPED_TRACE("P(x) = -x^3 + x^2 + x - 0.5 = 0 => P'(x) = -3x^2 + 2x + 1 => discriminant = 4 - 4*(-3)*(1) = 16"); // P' has 2 roots: -1/3 and 1 // P'(-1/3) = 0 P'(1) = 0 // P (-1/3) = -1/27 + 1/9 - 1/3 -0.5 < 0 P(0) = -0.5 P (1) = 0.5 > 0 // P is monotonic in 3 intervals [-Inf -1/3[, [-1/3 1] and ]1 +Inf[ // Therefore P is monotonic in [0..1] and cross 0 on this interval, so there is 1 root in [0..1] CubicPolynomial p(-0.5, 1.0, 1.0, -1.0); EXPECT_NO_THROW(numberOfRoots = findRootsInRange01(p, &roots)); EXPECT_EQ(1, numberOfRoots); EXPECT_TRUE(roots[0] >= 0.0 && roots[0] <= 1.0); double eval = p.evaluate(roots[0]); EXPECT_TRUE(isNearZero(eval)) << "P(" << roots[0] << ") = " << eval; } { // From a real use case of point/triangle continuous collision detection SCOPED_TRACE("P(x) = 7.84x^3 - 37.08x^2 + 19.5x - 1.46 = 0 => P'(x) = 23.52x^2 - 74.16x + 19.5"); // P' has 2 roots: x1 = (74.16 - 60.540445984482142729500176673066) / 47.04 = 0.2895313353639000270089248156236 // and x2 = (74.16 + 60.540445984482142729500176673066) / 47.04 = 2.8635298891258958913584221231519 // P is monotonic in 3 intervals [-Inf x1[, [x1 x2] and ]x2 +Inf[ // P'(0) > 0 ; P'(x1) = 0 ; P'(1) = -31.14 ; P'(x2) = 0 // P(0) = -1.46 < 0 ; P (x1) = 1.26 > 0 ; P (1) = -11.2 < 0 ; P(x2) = -65.58 // Therefore P is monotonic and has a solution in [0..x1] and [x1 1] CubicPolynomial p(-1.46, 19.5, -37.08, 7.84); EXPECT_NO_THROW(numberOfRoots = findRootsInRange01(p, &roots)); EXPECT_EQ(2, numberOfRoots); EXPECT_TRUE(roots[0] >= 0.0 && roots[0] <= 1.0); EXPECT_TRUE(roots[1] >= 0.0 && roots[1] <= 1.0); EXPECT_TRUE(roots[1] > roots[0]); double eval = p.evaluate(roots[0]); EXPECT_TRUE(isNearZero(eval)) << "P(" << roots[0] << ") = " << eval; eval = p.evaluate(roots[1]); EXPECT_TRUE(isNearZero(eval)) << "P(" << roots[1] << ") = " << eval; } }; }; // namespace Math }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Math/UnitTests/Data/000077500000000000000000000000001277777236100212115ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Math/UnitTests/Data/segmentmesh.ply000066400000000000000000000004261277777236100242600ustar00rootroot00000000000000ply format ascii 1.0 comment Created by hand element vertex 4 property double x property double y property double z element 1d_element 3 property list uint uint vertex_indices element radius 1 property double value end_header 1 2 3 4 5 6 7 8 9 11 11 12 2 0 1 2 1 2 2 2 3 1.234 opensurgsim-0.7.0/SurgSim/Math/UnitTests/GeometryTests.cpp000066400000000000000000002367441277777236100237020ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the Geometry.cpp functions. /// #include #include #include #include #include "SurgSim/Math/Geometry.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/UnitTests/MockTriangle.h" #include namespace SurgSim { namespace Math { typedef double SizeType; typedef Eigen::Matrix VectorType; ::std::ostream& operator <<(std::ostream& stream, const VectorType& vector) { stream << "(" << vector[0] << ", " << vector[1] << ", " << vector[2] << ")"; return stream; } bool near(double val1, double val2, double abs_error) { const double diff = std::abs(val1 - val2); if (diff <= abs_error) { return true; } else { return false; } } ::testing::AssertionResult eigenEqual(const VectorType& expected, const VectorType& actual) { double precision = 1e-4; if (expected.isApprox(actual, precision)) { return ::testing::AssertionSuccess(); } else { return ::testing::AssertionFailure() << "Eigen Matrices not the same " << std::endl << "expected: " << expected << std::endl << "actual: " << actual << std::endl; } } ::testing::AssertionResult eigenAllNan(const VectorType& actual) { if (boost::math::isnan(actual[0]) && boost::math::isnan(actual[1]) && boost::math::isnan(actual[2])) { return ::testing::AssertionSuccess(); } else { return ::testing::AssertionFailure() << "Not all elements are NAN"; } } class Segment { public: VectorType a; VectorType b; VectorType ab; Segment() {} Segment(const VectorType& pointA, const VectorType& pointB) : a(pointA), b(pointB), ab(pointB - pointA) {} ~Segment() {} /// Point on the line that the segment is on, s =< 1 and s >= 0 will give you a point on the segment VectorType pointOnLine(double s) const { return a + ab * s; } }; namespace { SizeType epsilon = 1e-10; } class GeometryTest : public ::testing::Test { protected: virtual void SetUp() { plainPoint = VectorType(45, 20, 10); plainSegment = Segment(VectorType(1.1, 2.2, 3.3), VectorType(6.6, 5.5, 4.4)); plainNormal = plainSegment.ab.cross(plainPoint); // Normal to segment plainNormal.normalize(); degenerateSegment.a = plainSegment.a; degenerateSegment.b = degenerateSegment.a + (plainSegment.ab) * 1e-9; degenerateSegment.ab = degenerateSegment.b - degenerateSegment.a; plainLine = Segment(VectorType(-10.0, 10, 10), VectorType(10.0, 10.0, 10.0)); parallelLine = Segment(VectorType(-100.0, 5.0, 5.0), VectorType(-90.0, 5.0, 5.0)); intersectingLine = Segment(VectorType(0, 0, 0), VectorType(20, 20, 20)); nonIntersectingLine = Segment(VectorType(5, 5, -5), VectorType(5, 5, 5)); tri = MockTriangle(VectorType(5, 0, 0), VectorType(0, -5, -5), VectorType(0, 5, 5)); } virtual void TearDown() { } VectorType plainPoint; Vector3d plainNormal; Segment plainSegment; Segment degenerateSegment; Segment plainLine; Segment parallelLine; Segment intersectingLine; Segment nonIntersectingLine; MockTriangle tri; }; TEST_F(GeometryTest, BaryCentricOfSegment) { typedef Eigen::Matrix Vector2; Vector2 outputPoint; EXPECT_TRUE(barycentricCoordinates(plainSegment.a, plainSegment.a, plainSegment.b, &outputPoint)); EXPECT_TRUE(Vector2(1.0, 0.0).isApprox(outputPoint)); EXPECT_TRUE(barycentricCoordinates(plainSegment.b, plainSegment.a, plainSegment.b, &outputPoint)); EXPECT_TRUE(Vector2(0.0, 1.0).isApprox(outputPoint)); // Halfway points EXPECT_TRUE(barycentricCoordinates(plainSegment.pointOnLine(0.5), plainSegment.a, plainSegment.b, &outputPoint)); EXPECT_TRUE(Vector2(0.5, 0.5).isApprox(outputPoint)); // Random point EXPECT_TRUE(barycentricCoordinates(plainSegment.pointOnLine(0.327), plainSegment.a, plainSegment.b, &outputPoint)); EXPECT_TRUE(Vector2(1.0 - 0.327, 0.327).isApprox(outputPoint)); // Point not on line VectorType orthogonal = plainSegment.ab.cross(VectorType(plainSegment.ab[0] * 0.5, plainSegment.ab[1] * 0.6, plainSegment.ab[2] * 0.7)); VectorType point = plainSegment.pointOnLine(0.486) + orthogonal; EXPECT_TRUE(barycentricCoordinates(point, plainSegment.a, plainSegment.b, &outputPoint)); EXPECT_TRUE(Vector2(1.0 - 0.486, 0.486).isApprox(outputPoint)); // Degenerate EXPECT_FALSE(barycentricCoordinates(degenerateSegment.a, degenerateSegment.a, degenerateSegment.b, &outputPoint)); EXPECT_TRUE(boost::math::isnan(outputPoint[0]) && boost::math::isnan(outputPoint[1])); } TEST_F(GeometryTest, BaryCentricWithNormal) { // Order of Points is v0,v1,v2 //Check Edges first VectorType outputPoint; EXPECT_TRUE(barycentricCoordinates(tri.v0, tri.v0, tri.v1, tri.v2, tri.n, &outputPoint)); EXPECT_TRUE(eigenEqual(VectorType(1, 0, 0), outputPoint)); EXPECT_TRUE(barycentricCoordinates(tri.v1, tri.v0, tri.v1, tri.v2, tri.n, &outputPoint)); EXPECT_TRUE(eigenEqual(VectorType(0, 1, 0), outputPoint)); EXPECT_TRUE(barycentricCoordinates(tri.v2, tri.v0, tri.v1, tri.v2, tri.n, &outputPoint)); EXPECT_TRUE(eigenEqual(VectorType(0, 0, 1), outputPoint)); // Halfway points EXPECT_TRUE(barycentricCoordinates(tri.pointInTriangle(0.5, 0), tri.v0, tri.v1, tri.v2, tri.n, &outputPoint)); EXPECT_TRUE(eigenEqual(VectorType(0.5, 0.5, 0), outputPoint)); EXPECT_TRUE(barycentricCoordinates(tri.pointInTriangle(0, 0.5), tri.v0, tri.v1, tri.v2, tri.n, &outputPoint)); EXPECT_TRUE(eigenEqual(VectorType(0.5, 0.0, 0.5), outputPoint)); // Center Point VectorType inputPoint; inputPoint = (tri.v0 + tri.v1 + tri.v2) / 3; EXPECT_TRUE(barycentricCoordinates(inputPoint, tri.v0, tri.v1, tri.v2, tri.n, &outputPoint)); EXPECT_TRUE(eigenEqual(VectorType(1.0 / 3.0, 1.0 / 3.0, 1.0 / 3.0), outputPoint)); // random Point inputPoint = tri.v0 * 0.2 + tri.v1 * 0.25 + tri.v2 * 0.55; EXPECT_TRUE(barycentricCoordinates(inputPoint, tri.v0, tri.v1, tri.v2, tri.n, &outputPoint)); EXPECT_TRUE(eigenEqual(VectorType(0.2, 0.25, 0.55), outputPoint)); // Degenerate EXPECT_FALSE(barycentricCoordinates(inputPoint, tri.v1, tri.v1, tri.v2, tri.n, &outputPoint)); EXPECT_TRUE(eigenAllNan(outputPoint)); EXPECT_FALSE(barycentricCoordinates(inputPoint, tri.v0, tri.v0, tri.v2, tri.n, &outputPoint)); EXPECT_TRUE(eigenAllNan(outputPoint)); EXPECT_FALSE(barycentricCoordinates(inputPoint, tri.v2, tri.v1, tri.v2, tri.n, &outputPoint)); EXPECT_TRUE(eigenAllNan(outputPoint)); } TEST_F(GeometryTest, BaryCentricWithoutNormal) { // Order of Points is v0,v1,v2 //Check Edges first VectorType outputPoint; EXPECT_TRUE(barycentricCoordinates(tri.v0, tri.v0, tri.v1, tri.v2, &outputPoint)); EXPECT_TRUE(eigenEqual(VectorType(1, 0, 0), outputPoint)); EXPECT_TRUE(barycentricCoordinates(tri.v1, tri.v0, tri.v1, tri.v2, &outputPoint)); EXPECT_TRUE(eigenEqual(VectorType(0, 1, 0), outputPoint)); EXPECT_TRUE(barycentricCoordinates(tri.v2, tri.v0, tri.v1, tri.v2, &outputPoint)); EXPECT_TRUE(eigenEqual(VectorType(0, 0, 1), outputPoint)); // Halfway points EXPECT_TRUE(barycentricCoordinates(tri.pointInTriangle(0.5, 0), tri.v0, tri.v1, tri.v2, tri.n, &outputPoint)); EXPECT_TRUE(eigenEqual(VectorType(0.5, 0.5, 0), outputPoint)); EXPECT_TRUE(barycentricCoordinates(tri.pointInTriangle(0, 0.5), tri.v0, tri.v1, tri.v2, tri.n, &outputPoint)); EXPECT_TRUE(eigenEqual(VectorType(0.5, 0.0, 0.5), outputPoint)); // Center Point VectorType inputPoint; inputPoint = (tri.v0 + tri.v1 + tri.v2) / 3; EXPECT_TRUE(barycentricCoordinates(inputPoint, tri.v0, tri.v1, tri.v2, &outputPoint)); EXPECT_TRUE(eigenEqual(VectorType(1.0 / 3.0, 1.0 / 3.0, 1.0 / 3.0), outputPoint)); // random Point inputPoint = tri.v0 * 0.2 + tri.v1 * 0.25 + tri.v2 * 0.55; EXPECT_TRUE(barycentricCoordinates(inputPoint, tri.v0, tri.v1, tri.v2, &outputPoint)); EXPECT_TRUE(eigenEqual(VectorType(0.2, 0.25, 0.55), outputPoint)); // Degenerate EXPECT_FALSE(barycentricCoordinates(inputPoint, tri.v0, tri.v0, tri.v2, &outputPoint)); EXPECT_TRUE(eigenAllNan(outputPoint)); EXPECT_FALSE(barycentricCoordinates(inputPoint, tri.v0, tri.v1, tri.v1, &outputPoint)); EXPECT_TRUE(eigenAllNan(outputPoint)); EXPECT_FALSE(barycentricCoordinates(inputPoint, tri.v2, tri.v1, tri.v2, &outputPoint)); EXPECT_TRUE(eigenAllNan(outputPoint)); } TEST_F(GeometryTest, DistancePointLine) { SizeType distance; Vector3d result; // Trivial point lies on the line distance = distancePointLine(plainSegment.pointOnLine(0.5), plainSegment.a, plainSegment.b, &result); EXPECT_NEAR(0.0, distance, epsilon); EXPECT_EQ(plainSegment.pointOnLine(0.5), result); // Point is away from the line Vector3d offLinePoint = plainSegment.a + (plainNormal * 1.5); distance = distancePointLine(offLinePoint, plainSegment.a, plainSegment.b, &result); EXPECT_NEAR(1.5, distance, epsilon); EXPECT_EQ(plainSegment.a, result); // Degenerate line, just do plain distance offLinePoint = plainSegment.a + plainNormal * 1.5; distance = distancePointLine(offLinePoint, plainSegment.a, plainSegment.a, &result); EXPECT_NEAR(1.5, distance, epsilon); EXPECT_EQ(plainSegment.a, result); } TEST_F(GeometryTest, DistancePointSegment) { SizeType distance; Vector3d result; // Trivial point lies on the line distance = distancePointSegment(plainSegment.pointOnLine(0.5), plainSegment.a, plainSegment.b, &result); EXPECT_NEAR(0.0, distance, epsilon); EXPECT_EQ(plainSegment.pointOnLine(0.5), result); // Point On the line but outside the segment VectorType point = plainSegment.pointOnLine(1.5); distance = distancePointSegment(point, plainSegment.a, plainSegment.b, &result); EXPECT_NEAR((plainSegment.ab.norm() * 0.5), distance, epsilon); EXPECT_TRUE(eigenEqual(plainSegment.b, result)); // Point projection is on the segment VectorType resultPoint = plainSegment.a + plainSegment.ab * 0.25; VectorType offLinePoint = resultPoint + (plainNormal * 1.5); distance = distancePointSegment(offLinePoint, plainSegment.a, plainSegment.b, &result); EXPECT_NEAR(1.5, distance, epsilon); EXPECT_TRUE(eigenEqual(resultPoint, result)); // Point projection is away from the segment, distance is to the closest segment point resultPoint = plainSegment.a; offLinePoint = plainSegment.a - plainSegment.ab + (plainNormal * 1.5); distance = distancePointSegment(offLinePoint, plainSegment.a, plainSegment.b, &result); EXPECT_NEAR((offLinePoint - resultPoint).norm(), distance, epsilon); EXPECT_TRUE(eigenEqual(resultPoint, result)); // Other Side of the above case resultPoint = plainSegment.b; offLinePoint = plainSegment.b + plainSegment.ab * 0.01 + plainNormal * 0.1; distance = distancePointSegment(offLinePoint, plainSegment.a, plainSegment.b, &result); EXPECT_NEAR((offLinePoint - resultPoint).norm(), distance, epsilon); EXPECT_TRUE(eigenEqual(resultPoint, result)); // Degenerated Segment distance = distancePointSegment(offLinePoint, plainSegment.a, plainSegment.a, &result); EXPECT_NEAR((offLinePoint - plainSegment.a).norm(), distance, epsilon); EXPECT_TRUE(eigenEqual(plainSegment.a, result)); } typedef std::tuple LineLineCheckData; void checkLineLineDistance(const LineLineCheckData& data) { Segment line0 = std::get<0>(data); Segment line1 = std::get<1>(data); VectorType expectedResult0 = std::get<2>(data); VectorType expectedResult1 = std::get<3>(data); VectorType result0, result1; double distance; { SCOPED_TRACE("Forward Case"); distance = distanceLineLine(line0.a, line0.b, line1.a, line1.b, &result0, &result1); EXPECT_NEAR((expectedResult1 - expectedResult0).norm(), distance, epsilon); EXPECT_TRUE(expectedResult0.isApprox(result0)); EXPECT_TRUE(expectedResult1.isApprox(result1)); } { SCOPED_TRACE("Backward Case"); distance = distanceLineLine(line1.a, line1.b, line0.a, line0.b, &result1, &result0); EXPECT_NEAR((expectedResult1 - expectedResult0).norm(), distance, epsilon); EXPECT_TRUE(expectedResult0.isApprox(result0)); EXPECT_TRUE(expectedResult1.isApprox(result1)); } { SCOPED_TRACE("Turn around the first line"); distance = distanceLineLine(line0.b, line0.a, line1.a, line1.b, &result0, &result1); EXPECT_NEAR((expectedResult1 - expectedResult0).norm(), distance, epsilon); EXPECT_TRUE(expectedResult0.isApprox(result0)); EXPECT_TRUE(expectedResult1.isApprox(result1)); } { SCOPED_TRACE("And switch lines again"); distance = distanceLineLine(line0.b, line0.a, line1.a, line1.b, &result0, &result1); EXPECT_NEAR((expectedResult1 - expectedResult0).norm(), distance, epsilon); EXPECT_TRUE(expectedResult0.isApprox(result0)); EXPECT_TRUE(expectedResult1.isApprox(result1)); } } TEST_F(GeometryTest, DistanceLineLine) { SizeType distance; VectorType p0, p1; // Trivial the same line compared against itself distance = distanceLineLine(plainSegment.a, plainSegment.b, plainSegment.a, plainSegment.b, &p0, &p1); EXPECT_NEAR(0.0, distance, epsilon); // Parallel Line Segment parallel = Segment(plainSegment.a + plainNormal * 2, plainSegment.b + plainNormal * 2); distance = distanceLineLine(plainSegment.a, plainSegment.b, parallel.a, parallel.b, &p0, &p1); EXPECT_NEAR(2.0, distance, epsilon); // Not quite parallel, trying to get below epsilon parallel = Segment(plainSegment.a + plainNormal * 2 , plainSegment.b + plainNormal * 2 - plainNormal * 1.0e-10); distance = distanceLineLine(plainSegment.a, plainSegment.b, parallel.a, parallel.b, &p0, &p1); EXPECT_NEAR(2.0, distance, epsilon); { SCOPED_TRACE("Intersecting Lines"); LineLineCheckData data(plainLine, intersectingLine, plainLine.b, plainLine.b); checkLineLineDistance(data); } { SCOPED_TRACE("Non-intersecting Lines"); // Non Intersecting Line, don't know a better way to design this case besides reimplementing line/line distance Segment line0(VectorType(0, -5, 0), VectorType(0, 5, 0)); Segment line1(VectorType(-5, 5, 5), VectorType(5, 5, 5)); checkLineLineDistance(LineLineCheckData(line0, line1, VectorType(0, 5, 0), VectorType(0, 5, 5))); } // Degenerate Cases { SCOPED_TRACE("Both lines degenerate"); Segment line0(VectorType(0, -5, 0), VectorType(0, -5, 0)); Segment line1(VectorType(5, 5, 5), VectorType(5, 5, 5)); checkLineLineDistance(LineLineCheckData(line0, line1, line0.a, line1.a)); } { SCOPED_TRACE("Only one line degenerate"); VectorType offLinePoint = plainSegment.a + plainSegment.ab * 0.5 + plainNormal * 1.5; LineLineCheckData data(plainSegment, Segment(offLinePoint, offLinePoint), plainSegment.pointOnLine(0.5), offLinePoint); checkLineLineDistance(data); } { SCOPED_TRACE("Orthogonal Lines intersecting"); Segment line0(VectorType(0, -5, 0), VectorType(0, 5, 0)); VectorType v(3, 4, 5); VectorType n = line0.ab.cross(v); n.normalize(); Segment line1(line0.a + n, line0.a - n); checkLineLineDistance(LineLineCheckData(line0, line1, line0.a, line0.a)); } { SCOPED_TRACE("Orthogonal Lines non intersecting"); Segment line0(VectorType(0, -5, 0), VectorType(0, 5, 0)); VectorType v(3, 4, 5); VectorType n = line0.ab.cross(v); n.normalize(); VectorType n2 = line0.ab.cross(n); n2.normalize(); Segment line1(line0.a + n + n2, line0.a - n + n2); checkLineLineDistance(LineLineCheckData(line0, line1, line0.a, line0.a + n2)); } { SCOPED_TRACE("not quite orthogonal Lines non intersecting "); Segment line0(VectorType(0, -5, 0), VectorType(0, 5, 0)); VectorType v(3, 4, 5); VectorType n = line0.ab.cross(v); n.normalize(); VectorType n2 = line0.ab.cross(n); n2.normalize(); Segment line1(line0.a + n + n2 + line0.ab * 0.01, line0.a - n + n2 - line0.ab * 0.01); checkLineLineDistance(LineLineCheckData(line0, line1, line0.a, line0.a + n2)); } } struct SegmentData { Segment segment0; Segment segment1; VectorType p0; VectorType p1; SegmentData() {} SegmentData(Segment seg0, Segment seg1, VectorType vec0, VectorType vec1) : segment0(seg0), segment1(seg1), p0(vec0), p1(vec1) {} }; void testSegmentDistance(const SegmentData& segmentData, const std::string& info, size_t i) { SizeType distance; VectorType p0, p1; // The expected distance should be the distance between the two points that were // reported as being the closes ones SizeType expectedDistance = (segmentData.p1 - segmentData.p0).norm(); distance = distanceSegmentSegment(segmentData.segment0.a, segmentData.segment0.b, segmentData.segment1.a, segmentData.segment1.b, &p0, &p1); EXPECT_NEAR(expectedDistance, distance, 1e-8) << "for " << info << " at index " << i; EXPECT_TRUE(eigenEqual(segmentData.p0, p0)) << "for " << info << " at index " << i; EXPECT_TRUE(eigenEqual(segmentData.p1, p1)) << "for " << info << " at index " << i; distance = distanceSegmentSegment(segmentData.segment1.a, segmentData.segment1.b, segmentData.segment0.a, segmentData.segment0.b, &p0, &p1); EXPECT_NEAR(expectedDistance, distance, 1e-8) << "for " << info << " at index " << i; EXPECT_TRUE(eigenEqual(segmentData.p1, p0)) << "for " << info << " at index " << i; EXPECT_TRUE(eigenEqual(segmentData.p0, p1)) << "for " << info << " at index " << i; } TEST_F(GeometryTest, DistanceSegmentSegment) { SizeType distance; VectorType p0, p1; // Intersecting segments // Intersecting inside VectorType closestPoint = plainSegment.pointOnLine(0.5); Segment otherSegment(closestPoint + plainNormal, closestPoint - plainNormal); distance = distanceSegmentSegment(plainSegment.a, plainSegment.b, otherSegment.a, otherSegment.b, &p0, &p1); EXPECT_NEAR(0.0, distance, epsilon); EXPECT_TRUE(eigenEqual(closestPoint, p0)); EXPECT_TRUE(eigenEqual(closestPoint, p1)); // Explode the cases std::vector segments; // The following series test the segment to segment distance for // a) coplanar segments // b) non coplanar segments // for each of the groups multiple pairs of segments are testes in various configurations, where the // projections either intersect or don't, this should cover all the segments that are used in the // algorithm, inside testSegmentDistance the segments are also swapped around and tested against each other // <0> Intersecting outside past b with segment straddling the line closestPoint = plainSegment.pointOnLine(1.5); otherSegment = Segment(closestPoint + plainNormal, closestPoint - plainNormal); segments.push_back(SegmentData(plainSegment, otherSegment, plainSegment.b, closestPoint)); // <1> segment not straddling, the correct points on the edges of the segments should get picked otherSegment = Segment(closestPoint + plainNormal, closestPoint + plainNormal * 2); segments.push_back(SegmentData(plainSegment, otherSegment, plainSegment.b, otherSegment.a)); // <2> segment not straddling, reverse the order of the points, reverse the side where the other segments falls otherSegment = Segment(closestPoint - plainNormal * 2, closestPoint - plainNormal); segments.push_back(SegmentData(plainSegment, otherSegment, plainSegment.b, otherSegment.b)); // Go to the other side of the segment closestPoint = plainSegment.pointOnLine(-0.5); // <3> Straddling, there is actual an intersection otherSegment = Segment(closestPoint + plainNormal, closestPoint - plainNormal); segments.push_back(SegmentData(plainSegment, otherSegment, plainSegment.a, closestPoint)); // <4> segment not straddling, the correct points on the edges of the segments should get picked otherSegment = Segment(closestPoint + plainNormal, closestPoint + plainNormal * 2); segments.push_back(SegmentData(plainSegment, otherSegment, plainSegment.a, otherSegment.a)); // <5> segment not straddling, reverse the order of the points, reverse the side where the other segments falls otherSegment = Segment(closestPoint - plainNormal * 2, closestPoint - plainNormal); segments.push_back(SegmentData(plainSegment, otherSegment, plainSegment.a, otherSegment.b)); // Repeat the same sequence for the segments as they are not touching VectorType otherNormal = plainSegment.ab.cross(plainNormal); // <6> segment projections intersect closestPoint = plainSegment.pointOnLine(0.5) + plainNormal * 3; otherSegment = Segment(closestPoint + otherNormal, closestPoint - otherNormal); segments.push_back(SegmentData(plainSegment, otherSegment, plainSegment.pointOnLine(0.5), closestPoint)); // <7> go past the end of the segment but straddle the line (T intersection) closestPoint = plainSegment.pointOnLine(1.5) + plainNormal * 3; otherSegment = Segment(closestPoint + otherNormal, closestPoint - otherNormal); segments.push_back(SegmentData(plainSegment, otherSegment, plainSegment.b, closestPoint)); // <8> go past the end of the segment not straddling the line anymore otherSegment = Segment(closestPoint + otherNormal, closestPoint + otherNormal * 2); segments.push_back(SegmentData(plainSegment, otherSegment, plainSegment.b, otherSegment.a)); // <9> go past the end of the on the other side, switching up endpoints otherSegment = Segment(closestPoint - otherNormal * 2, closestPoint - otherNormal); segments.push_back(SegmentData(plainSegment, otherSegment, plainSegment.b, otherSegment.b)); // Repeat for the other end of the base segment // <10> go past the end of the segment but straddle the line (T intersection) closestPoint = plainSegment.pointOnLine(-2.0) + plainNormal * 3; otherSegment = Segment(closestPoint + otherNormal, closestPoint - otherNormal); segments.push_back(SegmentData(plainSegment, otherSegment, plainSegment.a, closestPoint)); // <11> go past the end of the segment not straddling the line anymore otherSegment = Segment(closestPoint + otherNormal, closestPoint + otherNormal * 2); segments.push_back(SegmentData(plainSegment, otherSegment, plainSegment.a, otherSegment.a)); // <12> go past the end of the on the other side, switching up endpoints otherSegment = Segment(closestPoint - otherNormal * 2, closestPoint - otherNormal); segments.push_back(SegmentData(plainSegment, otherSegment, plainSegment.a, otherSegment.b)); // <13> projections intersect, short segments const VectorType aPoint = VectorType(1, 0, 0); const SizeType shortLength = 0.0001; const Segment shortSegment = Segment(VectorType(0, -shortLength / 2, 0), VectorType(0, shortLength / 2, 0)); const VectorType shortSegmentNormal = shortSegment.ab.cross(aPoint).normalized(); const Segment otherShortSegment = Segment(aPoint, aPoint + shortLength * shortSegmentNormal); segments.push_back(SegmentData(shortSegment, otherShortSegment, shortSegment.pointOnLine(0.5), otherShortSegment.a)); for (size_t i = 0; i < segments.size(); ++i) { testSegmentDistance(segments[i], "basic cases", i); } // Parallel Segments otherSegment = Segment(plainSegment.a + plainNormal * 4, plainSegment.b + plainNormal * 4); distance = distanceSegmentSegment(plainSegment.a, plainSegment.b, otherSegment.a, otherSegment.b, &p0, &p1); EXPECT_NEAR(4.0, distance, epsilon); // What should the points be here ? segments.clear(); // <0> parallel, non-overlapping closestPoint = plainSegment.a; const Vector3d segmentDirection = plainSegment.a - plainSegment.b; otherSegment = Segment(closestPoint + plainNormal * 4 + 2 * segmentDirection, closestPoint + plainNormal * 4 + 4 * segmentDirection); distance = distanceSegmentSegment(plainSegment.a, plainSegment.b, otherSegment.a, otherSegment.b, &p0, &p1); segments.push_back(SegmentData(plainSegment, otherSegment, closestPoint, otherSegment.a)); // Anti-parallel Segments otherSegment = Segment(plainSegment.b + plainNormal * 4, plainSegment.a + plainNormal * 4); distance = distanceSegmentSegment(plainSegment.a, plainSegment.b, otherSegment.a, otherSegment.b, &p0, &p1); EXPECT_NEAR(4.0, distance, epsilon); // <1> anti-parallel, non-overlapping closestPoint = plainSegment.a; otherSegment = Segment(closestPoint + plainNormal * 4 + 4 * segmentDirection, closestPoint + plainNormal * 4 + 2 * segmentDirection); distance = distanceSegmentSegment(plainSegment.a, plainSegment.b, otherSegment.a, otherSegment.b, &p0, &p1); segments.push_back(SegmentData(plainSegment, otherSegment, closestPoint, otherSegment.b)); for (size_t i = 0; i < segments.size(); ++i) { testSegmentDistance(segments[i], "parallel cases", i); } segments.clear(); // The closest points are some assumptions, it looks like the algorithm is slanted towards // <0> the beginning points of the segments for this closestPoint = plainSegment.pointOnLine(0.5); otherSegment = Segment(closestPoint + plainNormal * 4, closestPoint + plainNormal * 8); segments.push_back(SegmentData(plainSegment, otherSegment, plainSegment.pointOnLine(0.5), otherSegment.a)); // <1> Move past the end of the segment on the far end closestPoint = plainSegment.pointOnLine(1.5); otherSegment = Segment(closestPoint + plainNormal * 4, closestPoint + plainNormal * 8); segments.push_back(SegmentData(plainSegment, otherSegment, plainSegment.b, otherSegment.a)); // <2> Move past the end of the segment on the near end closestPoint = plainSegment.pointOnLine(-2.0); otherSegment = Segment(closestPoint - plainNormal * 8, closestPoint - plainNormal * 4); segments.push_back(SegmentData(plainSegment, otherSegment, plainSegment.a, otherSegment.b)); // Degenerate cases delegate to PointSegDistance, just some spotChecks // <3> On the segment closestPoint = plainSegment.pointOnLine(0.5); otherSegment = Segment(closestPoint, closestPoint); segments.push_back(SegmentData(plainSegment, otherSegment, closestPoint, closestPoint)); // <4> off the segment closestPoint = plainSegment.pointOnLine(1.5) + plainNormal * 4 + otherNormal * 10; otherSegment = Segment(closestPoint, closestPoint); segments.push_back(SegmentData(plainSegment, otherSegment, plainSegment.b, closestPoint)); for (size_t i = 0; i < segments.size(); ++i) { testSegmentDistance(segments[i], "other cases", i); } } TEST_F(GeometryTest, DistancePointTriangle) { double distance; VectorType closestPoint; VectorType result; VectorType inputPoint; // Trivial, point on triangle inputPoint = VectorType(0, 0, 0); distance = distancePointTriangle(inputPoint, tri.v0, tri.v1, tri.v2, &result); EXPECT_NEAR(0.0, distance, epsilon); EXPECT_TRUE(eigenEqual(inputPoint, result)); distance = distancePointTriangle(tri.v1, tri.v0, tri.v1, tri.v2, &result); EXPECT_NEAR(0.0, distance, epsilon); EXPECT_TRUE(eigenEqual(tri.v1, result)); // Closest Point is inside Triangle closestPoint = tri.v0 + tri.v0v1 * 0.3 + tri.v0v2 * 0.7; inputPoint = closestPoint + tri.n * 2.5; distance = distancePointTriangle(inputPoint, tri.v0, tri.v1, tri.v2, &result); EXPECT_NEAR(2.5, distance, epsilon); EXPECT_TRUE(eigenEqual(closestPoint, result)); // other side inputPoint = closestPoint - tri.n * 3.5; distance = distancePointTriangle(inputPoint, tri.v0, tri.v1, tri.v2, &result); EXPECT_NEAR(3.5, distance, epsilon); EXPECT_TRUE(eigenEqual(closestPoint, result)); // Test the Point close to a triangle Edge cases // Point closest to edge v0v1 double expectedDistance; inputPoint = tri.v0 + tri.v0v1 * 0.5 - tri.v0v2 + tri.n; distance = distancePointTriangle(inputPoint, tri.v0, tri.v1, tri.v2, &result); expectedDistance = distancePointSegment(inputPoint, tri.v0, tri.v1, &closestPoint); EXPECT_NEAR(expectedDistance, distance, epsilon); EXPECT_TRUE(eigenEqual(closestPoint, result)); // Point closest to edge v0v2 inputPoint = tri.v0 + tri.v0v2 * 0.3 - tri.v0v1 + tri.n * 2; distance = distancePointTriangle(inputPoint, tri.v0, tri.v1, tri.v2, &result); expectedDistance = distancePointSegment(inputPoint, tri.v0, tri.v2, &closestPoint); EXPECT_NEAR(expectedDistance, distance, epsilon); EXPECT_TRUE(eigenEqual(closestPoint, result)); // Point closest to edge v1v2 inputPoint = tri.v1 + (tri.v2 - tri.v1) * .75 + tri.v0v1 * 0.2 + tri.n; distance = distancePointTriangle(inputPoint, tri.v0, tri.v1, tri.v2, &result); expectedDistance = distancePointSegment(inputPoint, tri.v1, tri.v2, &closestPoint); EXPECT_NEAR(expectedDistance, distance, epsilon); EXPECT_TRUE(eigenEqual(closestPoint, result)); // Point closest to point v0 inputPoint = tri.v0 - tri.v0v1 - tri.v0v2 * 0.5 - tri.n; distance = distancePointTriangle(inputPoint, tri.v0, tri.v1, tri.v2, &result); expectedDistance = (tri.v0 - inputPoint).norm(); EXPECT_NEAR(expectedDistance, distance, epsilon); EXPECT_TRUE(eigenEqual(tri.v0, result)); // Point closest to point v1 inputPoint = tri.v1 + tri.v0v1 + (tri.v1 - tri.v2) * 2.0 - tri.n * 2.0; distance = distancePointTriangle(inputPoint, tri.v0, tri.v1, tri.v2, &result); expectedDistance = (tri.v1 - inputPoint).norm(); EXPECT_NEAR(expectedDistance, distance, epsilon); EXPECT_TRUE(eigenEqual(tri.v1, result)); // Point closest to point v2 inputPoint = tri.v2 + tri.v0v2 + (tri.v2 - tri.v1) * 3.0 - tri.n * 1.5; distance = distancePointTriangle(inputPoint, tri.v0, tri.v1, tri.v2, &result); expectedDistance = (tri.v2 - inputPoint).norm(); EXPECT_NEAR(expectedDistance, distance, epsilon); EXPECT_TRUE(eigenEqual(tri.v2, result)); // Degenerate Edges // Edge v0v1 distance = distancePointTriangle(inputPoint, tri.v0, (tri.v0 + tri.v0v1 * epsilon * 0.01).eval(), tri.v2, &result); expectedDistance = distancePointSegment(inputPoint, tri.v0, tri.v2, &closestPoint); EXPECT_NEAR(expectedDistance, distance, epsilon); EXPECT_TRUE(eigenEqual(closestPoint, result)); // Edge v0v2 distance = distancePointTriangle(inputPoint, (tri.v2 - tri.v0v2 * epsilon * 0.01).eval(), tri.v1 , tri.v2, &result); expectedDistance = distancePointSegment(inputPoint, tri.v1, tri.v2, &closestPoint); EXPECT_NEAR(expectedDistance, distance, epsilon); EXPECT_TRUE(eigenEqual(closestPoint, result)); // Edge v1v2 distance = distancePointTriangle(inputPoint, tri.v0, tri.v1 , tri.v1, &result); expectedDistance = distancePointSegment(inputPoint, tri.v1, tri.v0, &closestPoint); EXPECT_NEAR(expectedDistance, distance, epsilon); EXPECT_TRUE(eigenEqual(closestPoint, result)); } TEST_F(GeometryTest, PointInsideTriangleWithNormal) { EXPECT_TRUE(isPointInsideTriangle(tri.v0, tri.v0, tri.v1, tri.v2, tri.n)); EXPECT_TRUE(isPointInsideTriangle(tri.v1, tri.v0, tri.v1, tri.v2, tri.n)); EXPECT_TRUE(isPointInsideTriangle(tri.v2, tri.v0, tri.v1, tri.v2, tri.n)); VectorType inputPoint = tri.v0 + tri.v0v1 * 0.2; EXPECT_TRUE(isPointInsideTriangle(inputPoint, tri.v0, tri.v1, tri.v2, tri.n)); inputPoint += tri.v0v2 * 0.5; EXPECT_TRUE(isPointInsideTriangle(inputPoint, tri.v0, tri.v1, tri.v2, tri.n)); inputPoint = tri.v0 + tri.v0v1 * 1.5; EXPECT_FALSE(isPointInsideTriangle(inputPoint, tri.v0, tri.v1, tri.v2, tri.n)); EXPECT_FALSE(isPointInsideTriangle(inputPoint, tri.v1, tri.v1, tri.v2, tri.n)); inputPoint = tri.v0 + tri.v0v2 * 2 + tri.v0v1 * 2; EXPECT_FALSE(isPointInsideTriangle(inputPoint, tri.v0, tri.v1, tri.v2, tri.n)); } TEST_F(GeometryTest, PointInsideTriangleWithoutNormal) { EXPECT_TRUE(isPointInsideTriangle(tri.v0, tri.v0, tri.v1, tri.v2)); EXPECT_TRUE(isPointInsideTriangle(tri.v1, tri.v0, tri.v1, tri.v2)); EXPECT_TRUE(isPointInsideTriangle(tri.v2, tri.v0, tri.v1, tri.v2)); VectorType inputPoint = tri.v0 + tri.v0v1 * 0.2; EXPECT_TRUE(isPointInsideTriangle(inputPoint, tri.v0, tri.v1, tri.v2)); inputPoint += tri.v0v2 * 0.5; EXPECT_TRUE(isPointInsideTriangle(inputPoint, tri.v0, tri.v1, tri.v2)); inputPoint = tri.v0 + tri.v0v1 * 1.5; EXPECT_FALSE(isPointInsideTriangle(inputPoint, tri.v0, tri.v1, tri.v2)); EXPECT_FALSE(isPointInsideTriangle(inputPoint, tri.v1, tri.v1, tri.v2)); inputPoint = tri.v0 + tri.v0v2 * 2 + tri.v0v1 * 2; EXPECT_FALSE(isPointInsideTriangle(inputPoint, tri.v0, tri.v1, tri.v2)); } TEST_F(GeometryTest, PointOnTriangleEdgeWithNormal) { EXPECT_TRUE(isPointOnTriangleEdge(tri.v0, tri.v0, tri.v1, tri.v2, tri.n)); EXPECT_TRUE(isPointOnTriangleEdge(tri.v1, tri.v0, tri.v1, tri.v2, tri.n)); EXPECT_TRUE(isPointOnTriangleEdge(tri.v2, tri.v0, tri.v1, tri.v2, tri.n)); VectorType inputPoint = tri.v0 + tri.v0v1 * 0.2; EXPECT_TRUE(isPointOnTriangleEdge(inputPoint, tri.v0, tri.v1, tri.v2, tri.n)); inputPoint = tri.v0 + tri.v0v2 * 0.2; EXPECT_TRUE(isPointOnTriangleEdge(inputPoint, tri.v0, tri.v1, tri.v2, tri.n)); inputPoint = tri.v1 + tri.v1v2 * 0.2; EXPECT_TRUE(isPointOnTriangleEdge(inputPoint, tri.v0, tri.v1, tri.v2, tri.n)); inputPoint = tri.v0 + tri.v0v1 * 1.5; EXPECT_FALSE(isPointOnTriangleEdge(inputPoint, tri.v0, tri.v1, tri.v2, tri.n)); EXPECT_FALSE(isPointOnTriangleEdge(inputPoint, tri.v1, tri.v1, tri.v2, tri.n)); inputPoint = tri.v0 + tri.v0v2 * 2 + tri.v0v1 * 2; EXPECT_FALSE(isPointOnTriangleEdge(inputPoint, tri.v0, tri.v1, tri.v2, tri.n)); } TEST_F(GeometryTest, PointOnTriangleEdgeWithoutNormal) { EXPECT_TRUE(isPointOnTriangleEdge(tri.v0, tri.v0, tri.v1, tri.v2)); EXPECT_TRUE(isPointOnTriangleEdge(tri.v1, tri.v0, tri.v1, tri.v2)); EXPECT_TRUE(isPointOnTriangleEdge(tri.v2, tri.v0, tri.v1, tri.v2)); VectorType inputPoint = tri.v0 + tri.v0v1 * 0.2; EXPECT_TRUE(isPointOnTriangleEdge(inputPoint, tri.v0, tri.v1, tri.v2)); inputPoint = tri.v0 + tri.v0v2 * 0.2; EXPECT_TRUE(isPointOnTriangleEdge(inputPoint, tri.v0, tri.v1, tri.v2)); inputPoint = tri.v1 + tri.v1v2 * 0.2; EXPECT_TRUE(isPointOnTriangleEdge(inputPoint, tri.v0, tri.v1, tri.v2)); inputPoint = tri.v0 + tri.v0v1 * 1.5; EXPECT_FALSE(isPointOnTriangleEdge(inputPoint, tri.v0, tri.v1, tri.v2)); EXPECT_FALSE(isPointOnTriangleEdge(inputPoint, tri.v1, tri.v1, tri.v2)); inputPoint = tri.v0 + tri.v0v2 * 2 + tri.v0v1 * 2; EXPECT_FALSE(isPointOnTriangleEdge(inputPoint, tri.v0, tri.v1, tri.v2)); } TEST_F(GeometryTest, Coplanarity) { struct CoplanarityTestCandidate { bool expected; std::array points; }; CoplanarityTestCandidate candidates[] = { {true, Vector3d(0.0, 0.0, 0.0), Vector3d(0.0, 0.0, 0.0), Vector3d(0.0, 0.0, 0.0), Vector3d(0.0, 0.0, 0.0)}, {true, Vector3d(0.0, 0.0, 0.0), Vector3d(0.0, 0.0, 0.0), Vector3d(0.0, 0.0, 0.0), Vector3d(3.7, 0.0, 0.0)}, {true, Vector3d(0.0, 0.0, 0.0), Vector3d(0.0, 0.0, 0.0), Vector3d(2.3, 0.0, 0.0), Vector3d(3.7, 0.0, 0.0)}, {true, Vector3d(0.0, 0.0, 0.0), Vector3d(1.1, 0.0, 0.0), Vector3d(2.3, 0.0, 0.0), Vector3d(3.7, 0.0, 0.0)}, {true, Vector3d(0.0, 0.0, 0.0), Vector3d(1.1, 1.5, 0.0), Vector3d(2.3, 0.0, 0.0), Vector3d(3.7, 0.0, 0.0)}, {true, Vector3d(0.0, 0.0, 0.0), Vector3d(1.1, 1.5, 0.0), Vector3d(2.3, 0.0, 0.0), Vector3d(3.7, 3.0, 0.0)}, {false, Vector3d(0.0, 0.0, 1.0), Vector3d(1.1, 1.5, 0.0), Vector3d(2.3, 0.0, 0.0), Vector3d(3.7, 3.0, 0.0)}, {false, Vector3d(0.0, 0.0, 0.0), Vector3d(1.1, 1.5, 1.1), Vector3d(2.3, 0.0, 0.0), Vector3d(3.7, 3.0, 0.0)}, {false, Vector3d(0.0, 0.0, 0.0), Vector3d(1.1, 1.5, 0.0), Vector3d(2.3, 0.0, 7.7), Vector3d(3.7, 3.0, 0.0)}, {false, Vector3d(0.0, 0.0, 0.0), Vector3d(1.1, 1.5, 0.0), Vector3d(2.3, 0.0, 0.0), Vector3d(3.7, 3.0, -9.6)}, {true, Vector3d(0.0, 0.0, 0.0), Vector3d(1.0, 0.0, 0.0), Vector3d(0.0, 1.0, 0.0), Vector3d(12.3, -41.3, 0.0)}, {false, Vector3d(0.0, 0.0, 0.0), Vector3d(1.0, 0.0, 0.0), Vector3d(0.0, 1.0, 0.0), Vector3d(12.3, -41.3, 4.0)}, { false, Vector3d(10932.645, 43.1987, -0.009874245), Vector3d(53432.4, -9.87243, 654.31), Vector3d(28.71, 0.005483927, 2.34515), Vector3d(5897.1, -5.432, 512152.7654) } }; for (auto candidate = std::begin(candidates); candidate != std::end(candidates); ++candidate) { EXPECT_EQ(candidate->expected, isCoplanar(candidate->points[0], candidate->points[1], candidate->points[2], candidate->points[3])) << "Candidate points were [" << candidate->points[0].transpose() << "], [" << candidate->points[1].transpose() << "], [" << candidate->points[2].transpose() << "], [" << candidate->points[3].transpose() << "]"; } } typedef std::tuple SegTriIntersectionData; ::testing::AssertionResult checkSegTriIntersection(const SegTriIntersectionData& data) { std::stringstream errorMessage; Segment segment = std::get<0>(data); MockTriangle tri = std::get<1>(data); VectorType expectedClosestPoint = std::get<2>(data); bool expectedResult = std::get<3>(data); VectorType closestPoint; bool result = doesCollideSegmentTriangle(segment.a, segment.b, tri.v0, tri.v1, tri.v2, tri.n, &closestPoint); if (result != expectedResult) { errorMessage << "Intersection result does not match should be: " << expectedResult << " but got " << result << std::endl; }; if (expectedResult) { if (! expectedClosestPoint.isApprox(closestPoint)) { errorMessage << "Closest Point was expected to be " << expectedClosestPoint << " but is " << closestPoint << std::endl; } } else { errorMessage << eigenAllNan(closestPoint).message(); } if (errorMessage.str() == "") { return ::testing::AssertionSuccess(); } else { return ::testing::AssertionFailure() << errorMessage.str(); } } TEST_F(GeometryTest, SegmentTriangleIntersection) { VectorType closestPoint; VectorType intersectionPoint = tri.pointInTriangle(0.2, 0.7); Segment intersecting(intersectionPoint - tri.n * 2, intersectionPoint + tri.n * 2); SegTriIntersectionData data; data = SegTriIntersectionData(intersecting, tri, intersectionPoint, true); EXPECT_TRUE(checkSegTriIntersection(data)); intersecting.a = intersectionPoint + tri.n * 4; data = SegTriIntersectionData(intersecting, tri, intersectionPoint, false); EXPECT_TRUE(checkSegTriIntersection(data)); // in the plane of the triangle intersecting = Segment(intersectionPoint, intersectionPoint + tri.v0v1 + tri.v1v2); data = SegTriIntersectionData(intersecting, tri, intersectionPoint, true); EXPECT_TRUE(checkSegTriIntersection(data)); intersecting = Segment(intersectionPoint + tri.v0v1 + tri.v1v2, intersectionPoint); data = SegTriIntersectionData(intersecting, tri, intersectionPoint, true); EXPECT_TRUE(checkSegTriIntersection(data)); intersecting = Segment(intersectionPoint + tri.v0v1 + tri.v1v2, intersectionPoint + 2 * tri.v0v1 + tri.v1v2); data = SegTriIntersectionData(intersecting, tri, intersectionPoint, false); EXPECT_TRUE(checkSegTriIntersection(data)); // Slanting but intersecting // Point On triangle intersecting = Segment(intersectionPoint, intersectionPoint + tri.n * 2 + tri.v0v1 * 2); data = SegTriIntersectionData(intersecting, tri, intersectionPoint, true); EXPECT_TRUE(checkSegTriIntersection(data)); // Intersection in Triangle intersecting = Segment(intersectionPoint - tri.n * 2 - tri.v1v2 * 2, intersectionPoint + 2 * tri.n + tri.v1v2 * 2); data = SegTriIntersectionData(intersecting, tri, intersectionPoint, true); EXPECT_TRUE(checkSegTriIntersection(data)); // Intersection not on Segment intersecting = Segment(intersectionPoint + tri.n * 4 + tri.v1v2 * 4, intersectionPoint + 2 * tri.n + tri.v1v2 * 2); data = SegTriIntersectionData(intersecting, tri, intersectionPoint, false); EXPECT_TRUE(checkSegTriIntersection(data)); // Normal segment through one edge VectorType pointOnEdge = tri.v0 + tri.v0v1 * 0.5; intersecting = Segment(pointOnEdge + tri.n, pointOnEdge - tri.n); data = SegTriIntersectionData(intersecting, tri, pointOnEdge, true); EXPECT_TRUE(checkSegTriIntersection(data)); intersecting = Segment(pointOnEdge + tri.n, pointOnEdge); data = SegTriIntersectionData(intersecting, tri, pointOnEdge, true); EXPECT_TRUE(checkSegTriIntersection(data)); intersecting = Segment(pointOnEdge + tri.n * 3, pointOnEdge + tri.n * 4); data = SegTriIntersectionData(intersecting, tri, pointOnEdge, false); EXPECT_TRUE(checkSegTriIntersection(data)); intersecting = Segment(pointOnEdge + tri.n + tri.v0v1 * 0.5, pointOnEdge); data = SegTriIntersectionData(intersecting, tri, pointOnEdge, true); EXPECT_TRUE(checkSegTriIntersection(data)); // Segment away from the triangle intersecting = Segment(tri.v0 - tri.v0v1 - tri.v1v2, tri.v0 - tri.n * 3.0 - tri.v0v1 - tri.v1v2); data = SegTriIntersectionData(intersecting, tri, pointOnEdge, false); EXPECT_TRUE(checkSegTriIntersection(data)); } TEST_F(GeometryTest, distancePointPlane) { MockTriangle triangle(VectorType(3, 4, 5), VectorType(5, 5, 5), VectorType(10, 5, 2)); VectorType pointInTriangle = triangle.v0 + triangle.v0v1 * 0.4; double d = -triangle.n.dot(triangle.v0); VectorType point = pointInTriangle; VectorType projectionPoint; double distance = distancePointPlane(point, triangle.n, d, &projectionPoint); EXPECT_NEAR(0.0, distance, epsilon); EXPECT_TRUE(pointInTriangle.isApprox(projectionPoint)); point = pointInTriangle + triangle.n * 2; distance = distancePointPlane(point, triangle.n, d, &projectionPoint); EXPECT_NEAR(2.0, distance, epsilon); EXPECT_TRUE(pointInTriangle.isApprox(projectionPoint)); point = pointInTriangle - triangle.n * 3; distance = distancePointPlane(point, triangle.n, d, &projectionPoint); EXPECT_NEAR(-3.0, distance, epsilon); EXPECT_TRUE(pointInTriangle.isApprox(projectionPoint)); } typedef std::tuple SegmentPlaneData; void checkSegmentPlanDistance(const SegmentPlaneData& data) { Segment seg = std::get<0>(data); VectorType n = std::get<1>(data); double d = std::get<2>(data); VectorType expectedSegmentPoint = std::get<3>(data); VectorType expectedPlanePoint = std::get<4>(data); // The sign of the expected distance [1|-1|0], you must use 0 for expected 0 int sign = std::get<5>(data); double distance; VectorType segResultPoint, planeResultPoint; distance = distanceSegmentPlane(seg. a, seg.b, n, d, &segResultPoint, &planeResultPoint); EXPECT_NEAR((planeResultPoint - segResultPoint).norm(), std::abs(distance), epsilon); EXPECT_TRUE(distance * sign > 0 || distance == static_cast(sign)); EXPECT_TRUE(expectedSegmentPoint.isApprox(segResultPoint)); EXPECT_TRUE(expectedPlanePoint.isApprox(planeResultPoint)); } TEST_F(GeometryTest, SegmentPlaneDistance) { MockTriangle triangle(VectorType(3, 4, 5), VectorType(5, 5, 5), VectorType(10, 5, 2)); double d = -triangle.n.dot(triangle.v0); VectorType intersectionPoint = triangle.pointInTriangle(0.2, 0.7); Segment seg(intersectionPoint - triangle.n * 2, intersectionPoint + triangle.n * 2); VectorType segResultPoint, planeResultPoint; { SCOPED_TRACE("Segment intersects Plane"); checkSegmentPlanDistance(SegmentPlaneData(seg, triangle.n, d, intersectionPoint, intersectionPoint, 0)); } { SCOPED_TRACE("Segment above plane, segment intersection should be point a"); seg = Segment(intersectionPoint + triangle.n * 2, intersectionPoint + triangle.n * 3); distanceSegmentPlane(seg.a, seg.b, triangle.n, d, &segResultPoint, &planeResultPoint); checkSegmentPlanDistance(SegmentPlaneData(seg, triangle.n, d, seg.a, intersectionPoint, 1)); } { SCOPED_TRACE("Segment below plane, segment intersection should be point a"); seg = Segment(intersectionPoint - triangle.n * 3, intersectionPoint - triangle.n * 2); distanceSegmentPlane(seg.a, seg.b, triangle.n, d, &segResultPoint, &planeResultPoint); checkSegmentPlanDistance(SegmentPlaneData(seg, triangle.n, d, seg.b, intersectionPoint, -1)); } { SCOPED_TRACE("Segment below plane, segment intersection should be point a, reverse case from above"); seg = Segment(intersectionPoint - triangle.n * 2, intersectionPoint - triangle.n * 3); checkSegmentPlanDistance(SegmentPlaneData(seg, triangle.n, d, seg.a, intersectionPoint, -1)); } { SCOPED_TRACE("Segment coplanar with plane"); seg = Segment(intersectionPoint - triangle.v0v1, intersectionPoint + triangle.v0v1); checkSegmentPlanDistance(SegmentPlaneData(seg, triangle.n, d, intersectionPoint, intersectionPoint, 0)); } { SCOPED_TRACE("Segment parallel with plane"); seg = Segment(intersectionPoint - triangle.v0v1 + triangle.n * 2.0, intersectionPoint + triangle.v0v1 + triangle.n * 2.0); checkSegmentPlanDistance(SegmentPlaneData(seg, triangle.n, d, seg.pointOnLine(0.5), intersectionPoint, 1)); } { SCOPED_TRACE("Segment parallel with plane but on the other side"); seg = Segment(intersectionPoint - triangle.v0v1 - triangle.n * 2.0, intersectionPoint + triangle.v0v1 - triangle.n * 2.0); checkSegmentPlanDistance(SegmentPlaneData(seg, triangle.n, d, seg.pointOnLine(0.5), intersectionPoint, -1)); } } template class GeometryVectorTestBase : public testing::Test { public: typedef T Scalar; }; template class GeometryVector3Tests : public GeometryVectorTestBase { public: typedef T Vector3; }; typedef ::testing::Types GeometryVector3Variants; TYPED_TEST_CASE(GeometryVector3Tests, GeometryVector3Variants); TYPED_TEST(GeometryVector3Tests, nearestPointOnLine) { typedef typename TestFixture::Vector3 Vector3; typedef typename Vector3::Scalar T; const int VOpt = Vector3::Options; Vector3 point(static_cast(2.0), static_cast(-4.0), static_cast(3.0)); Vector3 segmentEnd1(static_cast(-2.0), static_cast(2.0), static_cast(4.0)); Vector3 segmentEnd2(static_cast(-1.0), static_cast(1.0), static_cast(2.0)); T precision = Eigen::NumTraits::dummy_precision(); // Assert if segment is degenerate ASSERT_ANY_THROW((SurgSim::Math::nearestPointOnLine(point, segmentEnd1, segmentEnd1))); // Otherwise, calculate the correct value ASSERT_NO_THROW((SurgSim::Math::nearestPointOnLine(point, segmentEnd1, segmentEnd2))); auto result = SurgSim::Math::nearestPointOnLine(point, segmentEnd1, segmentEnd2); EXPECT_GT(precision, (std::abs((segmentEnd2 - segmentEnd1).dot(result - point)))); } typedef std::tuple TriPlaneData; void checkTriPlaneDistance(const TriPlaneData& data) { MockTriangle tri = std::get<0>(data); VectorType n = std::get<1>(data); double d = std::get<2>(data); VectorType expectedTrianglePoint = std::get<3>(data); VectorType expectedPlanePoint = std::get<4>(data); int sign = std::get<5>(data); VectorType triangleResultPoint, planeResultPoint; double distance; distance = distanceTrianglePlane(tri.v0, tri.v1, tri.v2, n, d, &triangleResultPoint, &planeResultPoint); EXPECT_NEAR((planeResultPoint - triangleResultPoint).norm(), std::abs(distance), epsilon); EXPECT_TRUE((sign == 0 && std::abs(distance) <= epsilon) || (distance * sign > 0)); EXPECT_TRUE(expectedTrianglePoint.isApprox(triangleResultPoint)); EXPECT_TRUE(expectedPlanePoint.isApprox(planeResultPoint)); } TEST_F(GeometryTest, TrianglePlaneTest) { MockTriangle triangle(VectorType(3, 4, 5), VectorType(5, 5, 5), VectorType(10, 5, 2)); // Start with the coplanar case double d = -triangle.n.dot(triangle.v0); double distance; VectorType intersectionPoint0; VectorType intersectionPoint1; // Coplanar VectorType third = (triangle.v0 + triangle.v1 + triangle.v2) / 3.0; distance = distanceTrianglePlane(triangle.v0, triangle.v1, triangle.v2, triangle.n, d, &intersectionPoint0, &intersectionPoint1); EXPECT_NEAR(0.0, distance, epsilon); EXPECT_TRUE(third.isApprox(intersectionPoint0)); EXPECT_TRUE(third.isApprox(intersectionPoint1)); VectorType pointOnPlane = (triangle.v0 + triangle.v1 + triangle.v2) / 3.0; { SCOPED_TRACE("Coplanar Case"); MockTriangle target(triangle.v0 , triangle.v1 , triangle.v2); checkTriPlaneDistance(TriPlaneData(target, triangle.n, d, pointOnPlane, pointOnPlane, 0)); } { SCOPED_TRACE("Parallel, below the plane"); MockTriangle target(triangle.v0 - triangle.n * 3, triangle.v1 - triangle.n * 3, triangle.v2 - triangle.n * 3); checkTriPlaneDistance(TriPlaneData(target, triangle.n, d, pointOnPlane - triangle.n * 3, pointOnPlane, -1)); } { SCOPED_TRACE("Parallel, above the plane"); MockTriangle target(triangle.v0 + triangle.n, triangle.v1 + triangle.n, triangle.v2 + triangle.n); checkTriPlaneDistance(TriPlaneData(target, triangle.n, d, pointOnPlane + triangle.n, pointOnPlane, 1)); } { SCOPED_TRACE("Not Intersecting, triangle.v0 is closest above the plane"); MockTriangle target(triangle.v0 + triangle.n * 2, triangle.v1 + triangle.n * 3, triangle.v2 + triangle.n * 3); checkTriPlaneDistance(TriPlaneData(target, triangle.n, d, target.v0, triangle.v0, 1)); } { SCOPED_TRACE("Not Intersecting, triangle.v1 is closest above the plane"); MockTriangle target(triangle.v0 + triangle.n * 3, triangle.v1 + triangle.n * 2, triangle.v2 + triangle.n * 3); checkTriPlaneDistance(TriPlaneData(target, triangle.n, d, target.v1, triangle.v1, 1)); } { SCOPED_TRACE("Not Intersecting, triangle.v2 is closest above the plane"); MockTriangle target(triangle.v0 + triangle.n * 4, triangle.v1 + triangle.n * 3, triangle.v2 + triangle.n * 2); checkTriPlaneDistance(TriPlaneData(target, triangle.n, d, target.v2, triangle.v2, 1)); } { SCOPED_TRACE("Not Intersecting, triangle.v0 is closest below the plane"); MockTriangle target(triangle.v0 - triangle.n * 2, triangle.v1 - triangle.n * 3, triangle.v2 - triangle.n * 3); checkTriPlaneDistance(TriPlaneData(target, triangle.n, d, target.v0, triangle.v0, -1)); } { SCOPED_TRACE("Not Intersecting, triangle.v1 is closest below the plane"); MockTriangle target(triangle.v0 - triangle.n * 4, triangle.v1 - triangle.n * 2, triangle.v2 - triangle.n * 3); checkTriPlaneDistance(TriPlaneData(target, triangle.n, d, target.v1, triangle.v1, -1)); } { SCOPED_TRACE("Not Intersecting, triangle.v2 is closest below the plane"); MockTriangle target(triangle.v0 - triangle.n * 4, triangle.v1 - triangle.n * 3, triangle.v2 - triangle.n * 2); checkTriPlaneDistance(TriPlaneData(target, triangle.n, d, target.v2, triangle.v2, -1)); } { SCOPED_TRACE("Triangle point on the plane"); // Need to change the order of points for this to work ... strange ... MockTriangle target(triangle.v0 + triangle.n * 3, triangle.v2 + triangle.n * 3, triangle.v1); checkTriPlaneDistance(TriPlaneData(target, triangle.n, d, target.v2, target.v2, 0)); } { SCOPED_TRACE("Triangle plane intersection with v0 being under the plane"); MockTriangle target(triangle.v0 - triangle.n * 2, triangle.v1 + triangle.n * 2, triangle.v2 + triangle.n * 2); distance = distanceTrianglePlane(target.v0, target.v1, target.v2, triangle.n, d, &intersectionPoint0, &intersectionPoint1); EXPECT_NEAR(0.0, distance, epsilon); EXPECT_TRUE(intersectionPoint0.isApprox(intersectionPoint1)); EXPECT_TRUE(isPointInsideTriangle(intersectionPoint0, target.v0, target.v1, target.v2, target.n)); EXPECT_TRUE(isPointInsideTriangle(intersectionPoint0, triangle.v0, triangle.v1, triangle.v2, triangle.n)); } { SCOPED_TRACE("Triangle plane intersection with v0 and v1 being under the plane"); MockTriangle target(triangle.v0 - triangle.n * 2, triangle.v1 - triangle.n * 2, triangle.v2 + triangle.n * 2); distance = distanceTrianglePlane(target.v0, target.v1, target.v2, triangle.n, d, &intersectionPoint0, &intersectionPoint1); EXPECT_NEAR(0.0, distance, epsilon); EXPECT_TRUE(intersectionPoint0.isApprox(intersectionPoint1)); EXPECT_TRUE(isPointInsideTriangle(intersectionPoint0, target.v0, target.v1, target.v2, target.n)); EXPECT_TRUE(isPointInsideTriangle(intersectionPoint0, triangle.v0, triangle.v1, triangle.v2, triangle.n)); } { SCOPED_TRACE("Triangle plane intersection with v2 being under the plane"); MockTriangle target(triangle.v0 + triangle.n * 2, triangle.v1 + triangle.n * 2, triangle.v2 - triangle.n * 2); distance = distanceTrianglePlane(target.v0, target.v1, target.v2, triangle.n, d, &intersectionPoint0, &intersectionPoint1); EXPECT_NEAR(0.0, distance, epsilon); EXPECT_TRUE(intersectionPoint0.isApprox(intersectionPoint1)); EXPECT_TRUE(isPointInsideTriangle(intersectionPoint0, target.v0, target.v1, target.v2, target.n)); EXPECT_TRUE(isPointInsideTriangle(intersectionPoint0, triangle.v0, triangle.v1, triangle.v2, triangle.n)); } } TEST_F(GeometryTest, PlanePlaneDistance) { // Simple test against same double d1 = -tri.n.dot(tri.v0); VectorType point0, point1; bool result = doesIntersectPlanePlane(tri.n, d1, tri.n, d1, &point0, &point1); EXPECT_FALSE(result); EXPECT_TRUE(eigenAllNan(point0)); EXPECT_TRUE(eigenAllNan(point1)); result = doesIntersectPlanePlane(tri.n, -2.0, tri.n, 8.8, &point0, &point1); EXPECT_FALSE(result); EXPECT_TRUE(eigenAllNan(point0)); EXPECT_TRUE(eigenAllNan(point1)); VectorType n2 = VectorType(5, 6, 7); n2.normalize(); double d2 = -2; result = doesIntersectPlanePlane(tri.n, d1, n2, d2, &point0, &point1); VectorType output; EXPECT_TRUE(result); EXPECT_FALSE(eigenAllNan(point0)); EXPECT_NEAR(0, distancePointPlane(point0, tri.n, d1, &output), epsilon); EXPECT_NEAR(0, distancePointPlane(point1, tri.n, d1, &output), epsilon); EXPECT_FALSE(eigenAllNan(point1)); EXPECT_NEAR(0, distancePointPlane(point0, n2, d2, &output), epsilon); EXPECT_NEAR(0, distancePointPlane(point1, n2, d2, &output), epsilon); } typedef std::tuple SegTriDistanceData; void checkSegTriDistance(const SegTriDistanceData& data) { std::stringstream errorMessage; Segment segment = std::get<0>(data); MockTriangle tri = std::get<1>(data); VectorType expectedSegmentPoint = std::get<2>(data); VectorType expectedTrianglePoint = std::get<3>(data); double expectedDistance = (expectedSegmentPoint - expectedTrianglePoint).norm(); double distance; VectorType segmentPoint, trianglePoint; distance = distanceSegmentTriangle(segment.a, segment.b, tri.v0, tri.v1, tri.v2, tri.n, &segmentPoint, &trianglePoint); EXPECT_NEAR(expectedDistance, distance, epsilon); EXPECT_TRUE(expectedSegmentPoint.isApprox(segmentPoint)); EXPECT_TRUE(expectedTrianglePoint.isApprox(trianglePoint)); // Repeat above with segment reversed distance = distanceSegmentTriangle(segment.b, segment.a, tri.v0, tri.v1, tri.v2, tri.n, &segmentPoint, &trianglePoint); EXPECT_NEAR(expectedDistance, distance, epsilon); EXPECT_TRUE(expectedSegmentPoint.isApprox(segmentPoint)); EXPECT_TRUE(expectedTrianglePoint.isApprox(trianglePoint)); } TEST_F(GeometryTest, SegmentTriangleDistance) { Segment segment; VectorType intersection; { SCOPED_TRACE("Segment endpoint equivalent to triangle point"); segment = Segment(tri.v0, tri.v1 + tri.n * 3); checkSegTriDistance(SegTriDistanceData(segment, tri, segment.a, tri.v0)); } { SCOPED_TRACE("Segment endpoint inside triangle on triangle plane"); segment = Segment(tri.pointInTriangle(0.5, 0.2), tri.pointInTriangle(2, 2) + tri.n * 4); checkSegTriDistance(SegTriDistanceData(segment, tri, segment.a, segment.a)); } { SCOPED_TRACE("Intersection inside triangle"); intersection = tri.pointInTriangle(0.5, 0.2); segment = Segment(intersection - tri.n * 4 - tri.v0v1, intersection + tri.n * 4 + tri.v0v1); checkSegTriDistance(SegTriDistanceData(segment, tri, intersection, intersection)); } { SCOPED_TRACE("Segment endpoint on triangle edge"); segment = Segment(tri.pointInTriangle(0.0, 0.2), tri.pointInTriangle(2, 2) + tri.n * 4); checkSegTriDistance(SegTriDistanceData(segment, tri, segment.a, segment.a)); } { SCOPED_TRACE("intersection on triangle edge"); intersection = tri.pointInTriangle(0, 0.2); segment = Segment(intersection - tri.n * 3 - tri.v1v2 * .5, intersection + tri.n * 3 + tri.v1v2 * .5); checkSegTriDistance(SegTriDistanceData(segment, tri, intersection, intersection)); } { SCOPED_TRACE("segment endpoint is close to point inside of triangle"); intersection = tri.pointInTriangle(0.5, 0.2); Segment seg(intersection, intersection + tri.n * 2 + tri.v0v1 * 3); segment = Segment(seg.a + tri.n * 0.1, seg.b + tri.n * 0.1); checkSegTriDistance(SegTriDistanceData(segment, tri, segment.a, intersection)); } { SCOPED_TRACE("segment endpoint is close to triangle point v0"); Segment seg(tri.v0, tri.v0 - tri.n * 2 - tri.v0v1 * 2); segment = Segment(seg.a - tri.n * 0.1, seg.b - tri.n * 0.1); checkSegTriDistance(SegTriDistanceData(segment, tri, segment.a, tri.v0)); } { SCOPED_TRACE("segment endpoint is close to triangle point v1"); Segment seg(tri.v1, tri.v1 - tri.n * 2 - tri.v0v1 * 2); segment = Segment(seg.a - tri.n * 0.1, seg.b - tri.n * 0.1); checkSegTriDistance(SegTriDistanceData(segment, tri, segment.a, tri.v1)); } { SCOPED_TRACE("segment endpoint is close to triangle point v2"); Segment seg(tri.v2, tri.v2 - tri.n * 2 - tri.v1v2 * 2); segment = Segment(seg.a - tri.n * 0.1, seg.b - tri.n * 0.1); checkSegTriDistance(SegTriDistanceData(segment, tri, segment.a, tri.v2)); } { SCOPED_TRACE("segment endpoint is close to edge v0v1"); intersection = tri.v0 + tri.v0v1 * 0.2; Segment seg(intersection, intersection + tri.n * 2); segment = Segment(seg.a + seg.ab * 0.01, seg.b + seg.ab * 0.01); checkSegTriDistance(SegTriDistanceData(segment, tri, segment.a, intersection)); } { SCOPED_TRACE("segment endpoint is close to edge v0v2"); intersection = tri.v0 + tri.v0v2 * 0.4; Segment seg(intersection, intersection + tri.n * 2); segment = Segment(seg.a + seg.ab * 0.01, seg.b + seg.ab * 0.01); checkSegTriDistance(SegTriDistanceData(segment, tri, segment.a , intersection)); } { SCOPED_TRACE("segment endpoint is close to edge v1v2"); intersection = tri.v1 + tri.v1v2 * 0.2; Segment seg(intersection, intersection + tri.n * 2); segment = Segment(seg.a + seg.ab * 0.01, seg.b + seg.ab * 0.01); checkSegTriDistance(SegTriDistanceData(segment, tri, segment.a, intersection)); } { SCOPED_TRACE("point on segment is close to triangle vertex v0"); segment = Segment(tri.v0 - tri.n * 3, tri.v0 + tri.n * 3); checkSegTriDistance(SegTriDistanceData(segment, tri, tri.v0, tri.v0)); } { SCOPED_TRACE("point on segment is close to triangle vertex v1"); segment = Segment(tri.v1 - tri.n * 3, tri.v1 + tri.n * 3); checkSegTriDistance(SegTriDistanceData(segment, tri, tri.v1, tri.v1)); } { SCOPED_TRACE("point on segment is close to triangle vertex v2"); segment = Segment(tri.v2 - tri.n * 3, tri.v2 + tri.n * 3); checkSegTriDistance(SegTriDistanceData(segment, tri, tri.v2, tri.v2)); } { SCOPED_TRACE("point on segment is close to edge v0v1"); intersection = tri.v0 + tri.v0v1 * 0.2; Segment seg(intersection - tri.n * 3, intersection + tri.n * 2); VectorType cross = tri.n.cross(tri.v0v1); segment = Segment(seg.a - cross * 0.01, seg.b - cross * 0.01); checkSegTriDistance(SegTriDistanceData(segment, tri, intersection - cross * 0.01, intersection)); } { SCOPED_TRACE("point on segment is close to edge v0v2"); intersection = tri.v0 + tri.v0v2 * 0.2; Segment seg(intersection - tri.n * 3, intersection + tri.n * 2); VectorType cross = tri.n.cross(tri.v0v2); segment = Segment(seg.a + cross * 0.01, seg.b + cross * 0.01); checkSegTriDistance(SegTriDistanceData(segment, tri, intersection + cross * 0.01, intersection)); } { SCOPED_TRACE("point on segment is close to edge v1v2"); intersection = tri.v1 + tri.v1v2 * 0.2; Segment seg(intersection - tri.n * 3, intersection + tri.n * 2); VectorType cross = tri.n.cross(tri.v1v2); segment = Segment(seg.a - cross * 0.01, seg.b - cross * 0.01); checkSegTriDistance(SegTriDistanceData(segment, tri, intersection - cross * 0.01, intersection)); } } typedef std::tuple TriTriDistanceData; void checkTriTriDistance(const TriTriDistanceData& data) { MockTriangle t0 = std::get<0>(data); MockTriangle t1 = std::get<1>(data); VectorType expectedT0Point = std::get<2>(data); VectorType expectedT1Point = std::get<3>(data); double expectedDistance = (expectedT1Point - expectedT0Point).norm(); double distance; VectorType t0Point, t1Point; { SCOPED_TRACE("Normal Test"); distance = distanceTriangleTriangle(t0.v0, t0.v1, t0.v2, t1.v0, t1.v1, t1.v2, &t0Point, &t1Point); EXPECT_NEAR(expectedDistance, distance, epsilon); EXPECT_TRUE(expectedT0Point.isApprox(t0Point)); EXPECT_TRUE(expectedT1Point.isApprox(t1Point)); } // { // SCOPED_TRACE("Reversed Triangles"); // distance = TriangleTriangleDistance(t1.v0, t1.v1, t1.v2, t0.v0, t0.v1, t0.v2, &t1Point, &t0Point); // EXPECT_NEAR(expectedDistance, distance,epsilon); // EXPECT_TRUE(expectedT0Point.isApprox(t0Point)); // EXPECT_TRUE(expectedT1Point.isApprox(t1Point)); // } { SCOPED_TRACE("Shift t0 edges once"); distance = distanceTriangleTriangle(t0.v1, t0.v2, t0.v0, t1.v0, t1.v1, t1.v2, &t0Point, &t1Point); EXPECT_NEAR(expectedDistance, distance, epsilon); EXPECT_TRUE(expectedT0Point.isApprox(t0Point)); EXPECT_TRUE(expectedT1Point.isApprox(t1Point)); } { SCOPED_TRACE("Shift t0 edges twice"); distance = distanceTriangleTriangle(t0.v2, t0.v0, t0.v1, t1.v0, t1.v1, t1.v2, &t0Point, &t1Point); EXPECT_NEAR(expectedDistance, distance, epsilon); EXPECT_TRUE(expectedT0Point.isApprox(t0Point)); EXPECT_TRUE(expectedT1Point.isApprox(t1Point)); } } TEST_F(GeometryTest, distanceTriangleTriangle) { MockTriangle t0(VectorType(5, 0, 0), VectorType(0, 2, 2), VectorType(0, -2, -2)); MockTriangle t1; { SCOPED_TRACE("vertex t1v0 equal to t0v0"); t1 = MockTriangle(t0.v0, t0.v1 + t0.n * 2, t0.v2 + t0.n * 2); checkTriTriDistance(TriTriDistanceData(t1, t0, t0.v0, t0.v0)); } { SCOPED_TRACE("vertex t1v0 inside of triangle t0"); VectorType intersection = t0.pointInTriangle(0.2, 0.2); t1 = MockTriangle(intersection, t0.v1 + t0.n * 2, t0.v2 + t0.n * 2); checkTriTriDistance(TriTriDistanceData(t1, t0, t1.v0, intersection)); } { SCOPED_TRACE("vertex t1v0 close to t0v0"); t1 = MockTriangle(t0.v0 + t0.n, t0.v1 + t0.n * 2, t0.v2 + t0.n * 2); checkTriTriDistance(TriTriDistanceData(t1, t0, t1.v0, t0.v0)); } { SCOPED_TRACE("vertex t1v0 close to the inside of triangle t0"); VectorType intersection = t0.pointInTriangle(0.2, 0.2); t1 = MockTriangle(intersection + t0.n , t0.v1 + t0.n * 2, t0.v2 + t0.n * 2); checkTriTriDistance(TriTriDistanceData(t1, t0, t1.v0, intersection)); } { SCOPED_TRACE("edge t1v0v1 through triangle t0"); VectorType intersection = t0.pointInTriangle(0.2, 0.2); t1 = MockTriangle(intersection + t0.n * 3, t0.v0 - t0.v0v2 * 4 + t0.n, intersection - t0.n * 4); checkTriTriDistance(TriTriDistanceData(t1, t0, intersection, intersection)); } { SCOPED_TRACE("Triangles parallel"); t1 = MockTriangle(t0.v0 + tri.n * 3, t0.v1 + tri.n * 3, t0.v2 + tri.n * 3); VectorType closest0, closest1; double distance = distanceTriangleTriangle(t0.v0, t0.v1, t0.v2, t1.v0, t1.v1, t1.v2, &closest0, &closest1); EXPECT_NEAR(3.0, distance, epsilon); } { SCOPED_TRACE("edge t0v0v1 close to t1v0v1"); VectorType closest0 = t0.v0 + t0.v0v1 * 0.2; VectorType shift = t0.n.cross(t0.v0v1.normalized()); shift.normalize(); VectorType closest1 = closest0 - shift * 2; t1 = MockTriangle(closest1 - tri.n * 2, closest1 + tri.n * 2, closest1 + tri.n - shift * 10); checkTriTriDistance(TriTriDistanceData(t1, t0, closest1, closest0)); } } TEST_F(GeometryTest, IntersectionsSegmentBox) { Eigen::AlignedBox box; { SCOPED_TRACE("No intersection, zero length segment"); VectorType point1(0.0, 0.0, 0.0); VectorType point2(0.0, 0.0, 0.0); box.min() = VectorType(1.0 , 1.0, 1.0); box.max() = VectorType(5.0 , 5.0, 5.0); std::vector intersections; intersectionsSegmentBox(point1, point2, box, &intersections); EXPECT_EQ(0, intersections.size()); } { SCOPED_TRACE("No intersection, zero size box"); VectorType point1(0.0, 0.0, 0.0); VectorType point2(0.0, 5.0, 0.0); box.min() = VectorType(1.0 , 1.0, 1.0); box.max() = VectorType(1.0 , 1.0, 1.0); std::vector intersections; intersectionsSegmentBox(point1, point2, box, &intersections); EXPECT_EQ(0, intersections.size()); } { SCOPED_TRACE("No Intersection, parallel and beyond corners"); VectorType point1(-0.0, 0.0, -0.0); VectorType point2(0.0, 5.0, -0.0); box.min() = VectorType(1.0 , 1.0, 1.0); box.max() = VectorType(5.0 , 5.0, 5.0); std::vector intersections; intersectionsSegmentBox(point1, point2, box, &intersections); EXPECT_EQ(0, intersections.size()); } { SCOPED_TRACE("Entering box, but not leaving"); VectorType point1(2.0, 2.0, 0.0); VectorType point2(3.0, 3.0, 2.0); box.min() = VectorType(1.0 , 1.0, 1.0); box.max() = VectorType(5.0 , 5.0, 5.0); std::vector intersections; intersectionsSegmentBox(point1, point2, box, &intersections); EXPECT_EQ(1, intersections.size()); EXPECT_TRUE(intersections[0].isApprox(VectorType(2.5, 2.5, 1.0))); } { SCOPED_TRACE("Entering and exiting box, through box corners"); VectorType point1(0.0, 0.0, 0.0); VectorType point2(6.0, 6.0, 6.0); box.min() = VectorType(1.0 , 1.0, 1.0); box.max() = VectorType(5.0 , 5.0, 5.0); std::vector intersections; intersectionsSegmentBox(point1, point2, box, &intersections); EXPECT_EQ(2, intersections.size()); EXPECT_TRUE(intersections[0].isApprox(box.min()) || intersections[0].isApprox(box.max())); EXPECT_TRUE(intersections[1].isApprox(box.min()) || intersections[1].isApprox(box.max())); } } TEST_F(GeometryTest, DoesIntersectBoxCapsule) { typedef Eigen::AlignedBox BoxType; { SCOPED_TRACE("No intersection"); VectorType bottom(-5.0, 5.0, 0.0); VectorType top(5.0, 5.0, 0.0); double radius = 1.0; BoxType box(VectorType(-1.0 , -1.0, -1.0), VectorType(1.0 , 1.0, 1.0)); EXPECT_FALSE(doesIntersectBoxCapsule(bottom, top, radius, box)); } { SCOPED_TRACE("Intersection, capsule in middle of box"); VectorType bottom(-5.0, -5.0, -5.0); VectorType top(5.0, 5.0, 5.0); double radius = 10.0; BoxType box(VectorType(-1.0 , -1.0, -1.0), VectorType(1.0 , 1.0, 1.0)); EXPECT_TRUE(doesIntersectBoxCapsule(bottom, top, radius, box)); } { SCOPED_TRACE("No Intersection, box not centered"); VectorType bottom(-5.0, -5.0, -5.0); VectorType top(5.0, 5.0, 5.0); double radius = 1.0; BoxType box(VectorType(1.0 , 1.0, -1.0), VectorType(2.0 , 2.0, -2.0)); EXPECT_FALSE(doesIntersectBoxCapsule(bottom, top, radius, box)); } { SCOPED_TRACE("Intersection, box not centered"); VectorType bottom(-5.0, -5.0, -5.0); VectorType top(5.0, 5.0, 5.0); double radius = 1.0; BoxType box(VectorType(0.0 , 0.0, 0.0), VectorType(1.0 , 1.0, 1.0)); EXPECT_TRUE(doesIntersectBoxCapsule(bottom, top, radius, box)); } { SCOPED_TRACE("No intersection, capsule along edge"); VectorType bottom(2.0, -2.0, 2.0); VectorType top(2.0, 2.0, 2.0); double radius = sqrt(2.0) - 1.0; BoxType box(VectorType(-1.0 , -1.0, -1.0), VectorType(1.0 , 1.0, 1.0)); EXPECT_FALSE(doesIntersectBoxCapsule(bottom, top, radius, box)); } { SCOPED_TRACE("Intersection, capsule along edge"); VectorType bottom(2.0, -2.0, 2.0); VectorType top(2.0, 2.0, 2.0); double radius = sqrt(2.0) + 0.1; BoxType box(VectorType(-1.0 , -1.0, -1.0), VectorType(1.0 , 1.0, 1.0)); EXPECT_TRUE(doesIntersectBoxCapsule(bottom, top, radius, box)); } { SCOPED_TRACE("No Intersection, capsule at corner"); VectorType bottom(2.0, 3.0, 1.0); VectorType top(2.0, 1.0, 3.0); double radius = sqrt(3.0) - 0.1; BoxType box(VectorType(-1.0 , -1.0, -1.0), VectorType(1.0 , 1.0, 1.0)); EXPECT_FALSE(doesIntersectBoxCapsule(bottom, top, radius, box)); } { SCOPED_TRACE("Intersection, capsule at corner"); VectorType bottom(2.0, 3.0, 1.0); VectorType top(2.0, 1.0, 3.0); double radius = sqrt(3.0) + 0.1; BoxType box(VectorType(-1.0 , -1.0, -1.0), VectorType(1.0 , 1.0, 1.0)); EXPECT_TRUE(doesIntersectBoxCapsule(bottom, top, radius, box)); } } TEST_F(GeometryTest, TimesOfCoplanarity) { std::array times; { SCOPED_TRACE("No coplanarity case in [0..1]"); std::pair A = std::make_pair(VectorType(0.0, 0.0, 0.0), VectorType(1.0, 0.0, 1.0)); std::pair B = std::make_pair(VectorType(1.0, 0.0, 2.0), VectorType(2.0, 0.0, 4.0)); std::pair C = std::make_pair(VectorType(0.0, 0.1, 10.0), VectorType(0.0, 1.1, 10.0)); std::pair D = std::make_pair(VectorType(0.0, 1.1, 10.0), VectorType(0.0, 2.1, 10.0)); EXPECT_EQ(0, (timesOfCoplanarityInRange01(A, B, C, D, ×))); } { SCOPED_TRACE("1 case of coplanarity at time 0"); std::pair A = std::make_pair(VectorType(0.0, 0.0, 0.0), VectorType(1.0, 0.0, 1.0)); std::pair B = std::make_pair(VectorType(1.0, 0.0, 2.0), VectorType(2.0, 0.0, 4.0)); std::pair C = std::make_pair(VectorType(0.0, 1.0, -2.0), VectorType(0.0, 2.0, -3.5)); std::pair D = std::make_pair(VectorType(0.0, 0.0, 0.0), VectorType(0.0, 1.0, -10.0)); EXPECT_EQ(1, (timesOfCoplanarityInRange01(A, B, C, D, ×))); EXPECT_DOUBLE_EQ(0.0, times[0]); } { SCOPED_TRACE("1 case of coplanarity at time 0.5"); std::pair A = std::make_pair(VectorType(0.1, 0.0, 1.0), VectorType(-0.1, 0.0, -1.0)); // A(0.5) = 0.0 0.0 0.0 std::pair B = std::make_pair(VectorType(1.0, 0.0, 2.0), VectorType(2.0, 3.0, -2.0)); // B(0.5) = 1.5 1.5 0.0 std::pair C = std::make_pair(VectorType(-0.3, 2.0, -2.0), VectorType(0.3, 1.0, 2.0)); // C(0.5) = 0.0 1.5 0.0 std::pair D = std::make_pair(VectorType(1.7, 1.0, -1.0), VectorType(1.3, -1.0, 1.0)); // D(0.5) = 1.5 0.0 0.0 EXPECT_EQ(1, (timesOfCoplanarityInRange01(A, B, C, D, ×))); EXPECT_NEAR(0.5, times[0], Math::Geometry::ScalarEpsilon); } { SCOPED_TRACE("2 cases of coplanarity at times 0.089971778657590915 and 0.5"); std::pair A = std::make_pair(VectorType(0.4, 0.8, 1.0), VectorType(0.8, 1.0, -1.0)); // A(0.5) = 0.6 0.9 0.0 std::pair B = std::make_pair(VectorType(1.0, 0.0, 2.0), VectorType(2.0, 3.0, -2.0)); // B(0.5) = 1.5 1.5 0.0 std::pair C = std::make_pair(VectorType(-0.3, 2.0, -2.0), VectorType(0.3, 1.0, 2.0)); // C(0.5) = 0.0 1.5 0.0 std::pair D = std::make_pair(VectorType(1.7, 1.0, -1.0), VectorType(1.3, -1.0, 1.0)); // D(0.5) = 1.5 0.0 0.0 EXPECT_EQ(2, (timesOfCoplanarityInRange01(A, B, C, D, ×))); EXPECT_NEAR(0.089971778657590915, times[0], Math::Geometry::ScalarEpsilon); EXPECT_NEAR(0.5, times[1], Math::Geometry::ScalarEpsilon); } { SCOPED_TRACE("1 case of coplanarity at time 1"); std::pair A = std::make_pair(VectorType(0.0, 0.0, 0.0), VectorType(1.0, 0.0, 1.0)); std::pair B = std::make_pair(VectorType(1.0, 0.0, 1.24), VectorType(2.0, 0.0, 3.0)); std::pair C = std::make_pair(VectorType(0.0, 1.0, -2.0), VectorType(2.0, 0.0, 3.0)); std::pair D = std::make_pair(VectorType(0.1, 1.0, 1.1), VectorType(0.0, 1.0, -1.54)); EXPECT_EQ(1, (timesOfCoplanarityInRange01(A, B, C, D, ×))); EXPECT_NEAR(1.0, times[0], Math::Geometry::ScalarEpsilon); } } TEST_F(GeometryTest, CcdIntersectionsSegmentSegment) { SizeType time, s0p1Factor, s1p1Factor; { SCOPED_TRACE("No intersection"); std::pair A = std::make_pair(VectorType(0.0, 0.0, 0.0), VectorType(1.0, 0.0, 1.0)); std::pair B = std::make_pair(VectorType(1.0, 0.0, 2.0), VectorType(2.0, 0.0, 4.0)); std::pair C = std::make_pair(VectorType(0.0, 0.1, 4.0), VectorType(0.0, 1.1, 8.0)); std::pair D = std::make_pair(VectorType(0.0, 1.1, 6.0), VectorType(0.0, 2.1, 54.0)); EXPECT_FALSE(calculateCcdContactSegmentSegment(A, B, C, D, &time, &s0p1Factor, &s1p1Factor)); } { SCOPED_TRACE("Intersection at t=0"); std::pair A = std::make_pair(VectorType(0.0, 0.0, 0.0), VectorType(1.0, 0.0, 1.0)); std::pair B = std::make_pair(VectorType(1.0, 0.0, 2.0), VectorType(2.0, 0.0, 4.0)); std::pair C = std::make_pair(VectorType(0.0, 1.0, -2.0), VectorType(0.0, 2.0, -3.5)); std::pair D = std::make_pair(VectorType(0.0, 0.0, 0.0), VectorType(0.0, 1.0, -10.0)); EXPECT_TRUE(calculateCcdContactSegmentSegment(A, B, C, D, &time, &s0p1Factor, &s1p1Factor)); EXPECT_DOUBLE_EQ(0.0, time); EXPECT_DOUBLE_EQ(0.0, s0p1Factor); EXPECT_DOUBLE_EQ(1.0, s1p1Factor); } { SCOPED_TRACE("Intersection at t=0.5"); std::pair A = std::make_pair(VectorType(0.1, 0.0, 1.0), VectorType(-0.1, 0.0, -1.0)); // A(0.5) = 0.0 0.0 0.0 std::pair B = std::make_pair(VectorType(1.0, 0.0, 2.0), VectorType(2.0, 3.0, -2.0)); // B(0.5) = 1.5 1.5 0.0 std::pair C = std::make_pair(VectorType(-0.3, 2.0, -2.0), VectorType(0.3, 1.0, 2.0)); // C(0.5) = 0.0 1.5 0.0 std::pair D = std::make_pair(VectorType(1.7, 1.0, -1.0), VectorType(1.3, -1.0, 1.0)); // D(0.5) = 1.5 0.0 0.0 // At time 0.5, the segments AB and CD are coplanar and intersect exactly in their middle EXPECT_TRUE(calculateCcdContactSegmentSegment(A, B, C, D, &time, &s0p1Factor, &s1p1Factor)); EXPECT_NEAR(0.5, time, Math::Geometry::ScalarEpsilon); EXPECT_NEAR(0.5, s0p1Factor, Math::Geometry::ScalarEpsilon); EXPECT_NEAR(0.5, s1p1Factor, Math::Geometry::ScalarEpsilon); } { SCOPED_TRACE("Intersection at t=0.5"); std::pair A = std::make_pair(VectorType(0.4, 0.0, 1.0), VectorType(0.6, 0.0, -1.0)); // A(0.5) = 0.5 0.0 0.0 std::pair B = std::make_pair(VectorType(1.0, 0.0, 2.0), VectorType(2.0, 3.0, -2.0)); // B(0.5) = 1.5 1.5 0.0 std::pair C = std::make_pair(VectorType(-0.3, 2.0, -2.0), VectorType(0.3, 1.0, 2.0)); // C(0.5) = 0.0 1.5 0.0 std::pair D = std::make_pair(VectorType(1.7, 1.0, -1.0), VectorType(1.3, -1.0, 1.0)); // D(0.5) = 1.5 0.0 0.0 // At time 0.5, the segments AB and CD are coplanar and intersect at P: // P = A + 0.4 AB = (0.5 0.0 0.0) + 0.4 (1.0 1.5 0.0) = (0.9 0.6 0.0) // P = C + 0.6 CD = (0.0 1.5 0.0) + 0.6 (1.5 -1.5 0.0) = (0.9 0.6 0.0) EXPECT_TRUE(calculateCcdContactSegmentSegment(A, B, C, D, &time, &s0p1Factor, &s1p1Factor)); EXPECT_NEAR(0.5, time, Math::Geometry::ScalarEpsilon); EXPECT_NEAR(0.4, s0p1Factor, Math::Geometry::ScalarEpsilon); EXPECT_NEAR(0.6, s1p1Factor, Math::Geometry::ScalarEpsilon); } { SCOPED_TRACE("Intersection at t=0.5 (2 cubic roots in [0..1]: 0.0899 (no collision) and 0.5 (collision))"); std::pair A = std::make_pair(VectorType(0.4, 0.8, 1.0), VectorType(0.8, 1.0, -1.0)); // A(0.5) = 0.6 0.9 0.0 std::pair B = std::make_pair(VectorType(1.0, 0.0, 2.0), VectorType(2.0, 3.0, -2.0)); // B(0.5) = 1.5 1.5 0.0 std::pair C = std::make_pair(VectorType(-0.3, 2.0, -2.0), VectorType(0.3, 1.0, 2.0)); // C(0.5) = 0.0 1.5 0.0 std::pair D = std::make_pair(VectorType(1.7, 1.0, -1.0), VectorType(1.3, -1.0, 1.0)); // D(0.5) = 1.5 0.0 0.0 // At time 0.5, all 4 points are coplanar and AB/CD intersect: // P = A + 0*AB = (0.6 0.9 0.0) // P = C + 0.4*CD = (0.0 1.5 0.0) + 0.4 (1.5 -1.5 0.0) = (0.6 0.9 0.0) EXPECT_TRUE(calculateCcdContactSegmentSegment(A, B, C, D, &time, &s0p1Factor, &s1p1Factor)); EXPECT_NEAR(0.5, time, Math::Geometry::ScalarEpsilon); EXPECT_NEAR(0.0, s0p1Factor, Math::Geometry::ScalarEpsilon); EXPECT_NEAR(0.4, s1p1Factor, Math::Geometry::ScalarEpsilon); } { SCOPED_TRACE("Intersection at t=1"); std::pair A = std::make_pair(VectorType(0.0, 0.0, 0.0), VectorType(1.0, 0.0, 1.0)); std::pair B = std::make_pair(VectorType(1.0, 0.0, 1.24), VectorType(2.0, 0.0, 3.0)); std::pair C = std::make_pair(VectorType(0.0, 1.0, -2.0), VectorType(2.0, 0.0, 3.0)); std::pair D = std::make_pair(VectorType(0.1, 1.0, 1.1), VectorType(0.0, 1.0, -1.54)); EXPECT_TRUE(calculateCcdContactSegmentSegment(A, B, C, D, &time, &s0p1Factor, &s1p1Factor)); EXPECT_DOUBLE_EQ(1.0, time); EXPECT_DOUBLE_EQ(1.0, s0p1Factor); EXPECT_DOUBLE_EQ(0.0, s1p1Factor); } } TEST_F(GeometryTest, CcdIntersectionsPointTriangle) { SizeType time, tv01Factor, tv02Factor; { SCOPED_TRACE("No intersection"); std::pair P = std::make_pair(VectorType(0.0, 0.0, 0.0), VectorType(1.0, 0.0, 1.0)); std::pair A = std::make_pair(VectorType(1.0, 0.0, 2.0), VectorType(2.0, 0.0, 4.0)); std::pair B = std::make_pair(VectorType(0.0, 0.1, 4.0), VectorType(0.0, 1.1, 8.0)); std::pair C = std::make_pair(VectorType(0.0, 1.1, 6.0), VectorType(0.0, 2.1, 54.0)); EXPECT_FALSE(calculateCcdContactPointTriangle(P, A, B, C, &time, &tv01Factor, &tv02Factor)); } { SCOPED_TRACE("Intersection at t=0"); std::pair P = std::make_pair(VectorType(0.0, 0.0, 0.0), VectorType(1.0, 0.0, 1.0)); std::pair A = std::make_pair(VectorType(1.0, 0.0, 2.0), VectorType(2.0, 0.0, 4.0)); std::pair B = std::make_pair(VectorType(0.0, 1.0, -2.0), VectorType(0.0, 2.0, -3.5)); std::pair C = std::make_pair(VectorType(0.0, 0.0, 0.0), VectorType(0.0, 1.0, -10.0)); EXPECT_TRUE(calculateCcdContactPointTriangle(P, A, B, C, &time, &tv01Factor, &tv02Factor)); EXPECT_DOUBLE_EQ(0.0, time); EXPECT_DOUBLE_EQ(0.0, tv01Factor); EXPECT_DOUBLE_EQ(1.0, tv02Factor); } { SCOPED_TRACE("Intersection at t=0.5"); std::pair P = std::make_pair(VectorType(1.1, 0.0, 1.0), VectorType(0.9, 2.0, -1.0)); // P(0.5) = 1.0 1.0 0.0 std::pair A = std::make_pair(VectorType(1.0, 0.0, 2.0), VectorType(2.0, 3.0, -2.0)); // A(0.5) = 1.5 1.5 0.0 std::pair B = std::make_pair(VectorType(-0.3, 2.0, -2.0), VectorType(0.3, 1.0, 2.0)); // B(0.5) = 0.0 1.5 0.0 std::pair C = std::make_pair(VectorType(1.7, 1.0, -1.0), VectorType(1.3, -1.0, 1.0)); // C(0.5) = 1.5 0.0 0.0 // At time 0.5, all 4 points are coplanar and P is inside ABC with the barycentric coordinates (1/3 1/3 1/3) EXPECT_TRUE(calculateCcdContactPointTriangle(P, A, B, C, &time, &tv01Factor, &tv02Factor)); EXPECT_NEAR(0.5, time, Math::Geometry::ScalarEpsilon); EXPECT_NEAR(1.0 / 3.0, tv01Factor, Math::Geometry::ScalarEpsilon); EXPECT_NEAR(1.0 / 3.0, tv01Factor, Math::Geometry::ScalarEpsilon); } { SCOPED_TRACE("Intersection at t=0.5 (2 cubic roots in [0..1]: 0.0899 (no collision) and 0.5 (collision))"); std::pair P = std::make_pair(VectorType(0.4, 0.8, 1.0), VectorType(0.8, 1.0, -1.0)); // P(0.5) = 0.6 0.9 0.0 std::pair A = std::make_pair(VectorType(1.0, 0.0, 2.0), VectorType(2.0, 3.0, -2.0)); // A(0.5) = 1.5 1.5 0.0 std::pair B = std::make_pair(VectorType(-0.3, 2.0, -2.0), VectorType(0.3, 1.0, 2.0)); // B(0.5) = 0.0 1.5 0.0 std::pair C = std::make_pair(VectorType(1.7, 1.0, -1.0), VectorType(1.3, -1.0, 1.0)); // C(0.5) = 1.5 0.0 0.0 // At time 0.5, all 4 points are coplanar and P is inside ABC with the barycentric coordinates (0 0.6 0.4) // P = A + 0.6 AB + 0.4 AC = (1.5 1.5 0.0) + 0.6 (-1.5 0.0 0.0) + 0.4 (0.0 -1.5 0.0) = (0.6 0.9 0.0) EXPECT_TRUE(calculateCcdContactPointTriangle(P, A, B, C, &time, &tv01Factor, &tv02Factor)); EXPECT_NEAR(0.5, time, Math::Geometry::ScalarEpsilon); EXPECT_NEAR(0.6, tv01Factor, Math::Geometry::ScalarEpsilon); EXPECT_NEAR(0.4, tv02Factor, Math::Geometry::ScalarEpsilon); } { SCOPED_TRACE("Intersection at t=1"); std::pair P = std::make_pair(VectorType(1.0, 0.0, 1.24), VectorType(2.0, 0.0, 3.0)); std::pair A = std::make_pair(VectorType(0.0, 0.0, 0.0), VectorType(1.0, 0.0, 1.0)); std::pair B = std::make_pair(VectorType(0.0, 1.0, -2.0), VectorType(2.0, 0.0, 3.0)); std::pair C = std::make_pair(VectorType(0.1, 1.0, 1.1), VectorType(0.0, 1.0, -1.54)); EXPECT_TRUE(calculateCcdContactPointTriangle(P, A, B, C, &time, &tv01Factor, &tv02Factor)); EXPECT_DOUBLE_EQ(1.0, time); EXPECT_DOUBLE_EQ(1.0, tv01Factor); EXPECT_DOUBLE_EQ(0.0, tv02Factor); } } }; // namespace Math }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Math/UnitTests/IntervalArithmeticTests.cpp000066400000000000000000000651301277777236100256720ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the IntervalArithmetic functions. #include #include #include "SurgSim/Math/IntervalArithmetic.h" namespace SurgSim { namespace Math { namespace { double epsilon = 1.0e-10; double delta = 1.0e-11; } class IntervalArithmeticTests : public ::testing::Test { public: typedef IntervalND IntervalDouble2; typedef IntervalND IntervalDouble3; Interval testIntervalMoveConstructor(Interval dummy) { Interval ret; ret = dummy; return ret; } IntervalND testIntervalNDMoveConstructor(IntervalND dummy) { IntervalND ret; ret = dummy; return ret; } IntervalND testInterval3DMoveConstructor(IntervalND dummy) { IntervalND ret; ret = dummy; return ret; } }; TEST_F(IntervalArithmeticTests, IntervalInitializationTests) { // Constructor tests EXPECT_NO_THROW(Interval a); EXPECT_THROW(Interval a(3.8, 3.7), SurgSim::Framework::AssertionFailure); EXPECT_NO_THROW(Interval a(3.7, 3.8)); Interval b(9.8, 100); EXPECT_NO_THROW(Interval a(b)); Interval a(b); EXPECT_TRUE(a == b); EXPECT_NO_THROW(testIntervalMoveConstructor(b)); Interval f = testIntervalMoveConstructor(b); EXPECT_TRUE(f == b); // Assignment and equal/not equal tests Interval c; EXPECT_TRUE(c != b); EXPECT_FALSE(c == b); c = a; EXPECT_FALSE(c != b); EXPECT_TRUE(c == b); Interval e; e = (b * 1); EXPECT_TRUE(e == b); Interval ePlusEpsilon = e + delta; Interval ePlus2Epsilon = e + (2 * epsilon); EXPECT_TRUE(e.isApprox(ePlusEpsilon, epsilon)); EXPECT_TRUE(ePlusEpsilon.isApprox(e, epsilon)); EXPECT_FALSE(e.isApprox(ePlus2Epsilon, epsilon)); EXPECT_FALSE(ePlus2Epsilon.isApprox(e, epsilon)); // Reordering initializers EXPECT_TRUE(b == SurgSim::Math::Interval::minToMax(100, 9.8)); EXPECT_TRUE(b == SurgSim::Math::Interval::minToMax(12, 100, 9.8)); EXPECT_TRUE(b == SurgSim::Math::Interval::minToMax(12, 100, 9.8, 99)); // Get upper and lower EXPECT_EQ(-5.0, Interval (-5.0, 37).getMin()); EXPECT_EQ(37.0, Interval (-5.0, 37).getMax()); }; TEST_F(IntervalArithmeticTests, RangeTests) { Interval middle(10.0, 20.0); Interval low(5.0, 10 - epsilon); Interval high(20 + epsilon, 40.0); Interval lowOverlap(5.0, 10.0); Interval highOverlap(20.0, 40.0); Interval contained(12.0, 15.0); Interval contains(9.0, 21.0); // Overlap EXPECT_FALSE(middle.overlapsWith(low)); EXPECT_FALSE(middle.overlapsWith(high)); EXPECT_TRUE(middle.overlapsWith(lowOverlap)); EXPECT_TRUE(middle.overlapsWith(highOverlap)); EXPECT_TRUE(middle.overlapsWith(contained)); EXPECT_TRUE(middle.overlapsWith(contains)); // Contains value ... EXPECT_FALSE(middle.contains(10 - epsilon)); EXPECT_FALSE(middle.contains(20 + epsilon)); EXPECT_TRUE(middle.contains(10.0)); EXPECT_TRUE(middle.contains(20.0)); EXPECT_TRUE(middle.contains(15.0)); Interval aroundZero(-5.0, 13.0); Interval zeroLow(-5.0, 0.0); Interval zeroHigh(0.0, 13.0); Interval almostZeroLow(-5.0, -epsilon); Interval almostZeroHigh(epsilon, 13.0); // Contains zero ... EXPECT_FALSE(middle.containsZero()); EXPECT_FALSE(almostZeroLow.containsZero()); EXPECT_FALSE(almostZeroHigh.containsZero()); EXPECT_TRUE(aroundZero.containsZero()); EXPECT_TRUE(zeroLow.containsZero()); EXPECT_TRUE(zeroHigh.containsZero()); // Subrange tests EXPECT_TRUE(middle.lowerHalf().isApprox(Interval (10.0, 15.0), epsilon)); EXPECT_TRUE(middle.upperHalf().isApprox(Interval (15.0, 20.0), epsilon)); }; TEST_F(IntervalArithmeticTests, ExtendRangeTests) { Interval middle(10.0, 20.0); Interval original(middle); EXPECT_TRUE(original == middle); // Add onto both ends EXPECT_FALSE(middle.contains(8.0)); EXPECT_FALSE(middle.contains(22.0)); Interval add(middle.addThickness(2.0)); EXPECT_TRUE(add == middle); EXPECT_FALSE(original == middle); EXPECT_TRUE(middle.contains(8.0)); EXPECT_TRUE(middle.contains(22.0)); EXPECT_FALSE(middle.contains(7.999999999)); EXPECT_FALSE(middle.contains(22.00000001)); // Extend the interval ... original = middle; Interval extend(middle.extendToInclude(12.0)); EXPECT_TRUE(original == middle); EXPECT_TRUE(extend == middle); EXPECT_TRUE(middle.contains(8.0)); EXPECT_TRUE(middle.contains(22.0)); EXPECT_FALSE(middle.contains(7.999999999)); EXPECT_FALSE(middle.contains(22.00000001)); extend = middle.extendToInclude(5.0); EXPECT_FALSE(original == middle); EXPECT_TRUE(extend == middle); EXPECT_TRUE(middle == Interval(5.0, 22)); extend = middle.extendToInclude(24.0); EXPECT_TRUE(extend == middle); EXPECT_TRUE(middle == Interval(5.0, 24.0)); original = middle; extend = middle.extendToInclude(Interval (5.0, 24.0)); EXPECT_TRUE(extend == middle); EXPECT_TRUE(middle == original); extend = middle.extendToInclude(Interval (4.0, 25.0)); EXPECT_TRUE(extend == middle); EXPECT_FALSE(middle == original); EXPECT_TRUE(middle == Interval(4.0, 25.0)); extend = middle.extendToInclude(Interval (3.0, 24.0)); EXPECT_TRUE(extend == middle); EXPECT_TRUE(middle == Interval(3.0, 25.0)); extend = middle.extendToInclude(Interval (7.0, 32.0)); EXPECT_TRUE(extend == middle); EXPECT_TRUE(middle == Interval(3.0, 32.0)); }; TEST_F(IntervalArithmeticTests, OperatorTests) { Interval initial(10.0, 20.0); // + EXPECT_TRUE(Interval(12, 30).isApprox((initial + Interval(2.0, 10.0)), epsilon)); EXPECT_TRUE(Interval(20, 30).isApprox((initial + 10), epsilon)); // += Interval dummy(initial); dummy += Interval(2.0, 10.0); EXPECT_TRUE(dummy.isApprox(Interval(12, 30), epsilon)); dummy = initial; dummy += 10.0; EXPECT_TRUE(dummy.isApprox(Interval(20, 30), epsilon)); // - EXPECT_TRUE(Interval(0.0, 18.0).isApprox((initial - Interval(2.0, 10.0)), epsilon)); EXPECT_TRUE(Interval(0, 10).isApprox((initial - 10), epsilon)); // -= dummy = initial; dummy -= Interval(2.0, 10.0); EXPECT_TRUE(Interval(0.0, 18.0).isApprox(dummy, epsilon)); dummy = initial; dummy -= 10.0; EXPECT_TRUE(Interval(0.0, 10.0).isApprox(dummy, epsilon)); // Negation EXPECT_TRUE(Interval(-20.0, -10.0).isApprox(-initial, epsilon)); // * EXPECT_TRUE(Interval(20.0, 200.0).isApprox((initial * Interval(2.0, 10.0)), epsilon)); EXPECT_TRUE(Interval(-200.0, 40.0).isApprox((-initial * Interval(-2.0, 10.0)), epsilon)); EXPECT_TRUE(Interval(100.0, 200.0).isApprox((initial * 10), epsilon)); EXPECT_TRUE(Interval(100.0, 200.0).isApprox((-initial * -10), epsilon)); // *= dummy = initial; dummy *= Interval(2.0, 10.0); EXPECT_TRUE(Interval(20.0, 200.0).isApprox(dummy, epsilon)); dummy = -initial; dummy *= Interval(-2.0, 10.0); EXPECT_TRUE(Interval(-200.0, 40.0).isApprox(dummy, epsilon)); dummy = initial; dummy *= 10.0; EXPECT_TRUE(Interval(100.0, 200.0).isApprox((initial * 10), epsilon)); dummy = -initial; dummy *= -10.0; EXPECT_TRUE(Interval(100.0, 200.0).isApprox((-initial * -10), epsilon)); // / Interval zeroInterval(-5.0, 5.0); EXPECT_THROW(initial / zeroInterval, SurgSim::Framework::AssertionFailure); EXPECT_TRUE(Interval(20.0, 200.0).isApprox((initial / Interval(0.1, 0.5)), epsilon)); // /= dummy = zeroInterval; EXPECT_THROW(dummy /= zeroInterval, SurgSim::Framework::AssertionFailure); dummy = initial; dummy /= Interval(0.1, 0.5); EXPECT_TRUE(Interval(20.0, 200.0).isApprox(dummy, epsilon)); // Inverse EXPECT_THROW(zeroInterval.inverse(), SurgSim::Framework::AssertionFailure); EXPECT_TRUE(Interval (2, 10).isApprox(Interval(0.1, 0.5).inverse(), epsilon)); // Square EXPECT_TRUE(Interval (0, 25).isApprox(zeroInterval.square(), epsilon)); EXPECT_TRUE(Interval (0, 25).isApprox((-zeroInterval).square(), epsilon)); EXPECT_TRUE(Interval (100, 400).isApprox(initial.square(), epsilon)); EXPECT_TRUE(Interval (100, 400).isApprox((-initial).square(), epsilon)); }; // Interval ND tests TEST_F(IntervalArithmeticTests, IntervalNDInitializationTests) { // Constructor tests Interval testInterval(3.7, 3.8); std::array minimums = {1.1, 4.4}; std::array maximums = {4.1, 3.2}; std::array minimumsPlusEpsilon = {1.1 + delta, 4.4 + delta}; std::array maximumsPlusEpsilon = {4.1 + delta, 3.2 + delta}; std::array maximumsPlus2Epsilon = {4.1 + (2 * epsilon), 3.2 + delta}; std::array, 2> testIntervalArray; testIntervalArray[0] = Interval (1.0, 2.0); testIntervalArray[1] = Interval (2.0, 3.0); EXPECT_NO_THROW(IntervalDouble2 a); EXPECT_NO_THROW(IntervalDouble2 a(testIntervalArray)); EXPECT_NO_THROW(IntervalDouble2 a(minimums, maximums)); EXPECT_NO_THROW(IntervalDouble2 a(IntervalDouble2(minimums, maximums))); IntervalDouble2 b(minimums, maximums); IntervalDouble2 a(b); EXPECT_TRUE(a == b); EXPECT_NO_THROW(testIntervalNDMoveConstructor(b)); IntervalDouble2 f = testIntervalNDMoveConstructor(b); EXPECT_TRUE(f == b); // Assignment and equal/not equal tests IntervalDouble2 c; EXPECT_TRUE(c != b); EXPECT_FALSE(c == b); c = a; EXPECT_FALSE(c != b); EXPECT_TRUE(c == b); IntervalDouble2 e; e = (b * c); EXPECT_TRUE(e == (b * c)); IntervalDouble2 bPlusEpsilon(minimumsPlusEpsilon, maximumsPlusEpsilon); IntervalDouble2 bPlus2Epsilon(minimumsPlusEpsilon, maximumsPlus2Epsilon); EXPECT_TRUE(b.isApprox(bPlusEpsilon, epsilon)); EXPECT_TRUE(bPlusEpsilon.isApprox(b, epsilon)); EXPECT_FALSE(b.isApprox(bPlus2Epsilon, epsilon)); EXPECT_FALSE(bPlus2Epsilon.isApprox(b, epsilon)); // Getting components and the reordering initializer Interval axis0(b.getAxis(0)); Interval axis1(b.getAxis(1)); EXPECT_TRUE(axis0 == Interval(1.1, 4.1)); EXPECT_TRUE(axis1 == Interval(3.2, 4.4)); }; TEST_F(IntervalArithmeticTests, IntervalNDRangeTests) { std::array minimumsShape = {1.1, 3.2}; std::array maximumsShape = {4.1, 4.4}; std::array noOverlapMin = {1.1, 4.5}; std::array noOverlapMax = {4.5, 4.8}; std::array overlapMin = {1.7, 2.0}; std::array overlapMax = {4.3, 4.7}; IntervalDouble2 shape(minimumsShape, maximumsShape); EXPECT_FALSE(shape.overlapsWith(IntervalDouble2(noOverlapMin, noOverlapMax))); EXPECT_TRUE(shape.overlapsWith(IntervalDouble2(overlapMin, overlapMax))); }; TEST_F(IntervalArithmeticTests, IntervalNDExtendRangeTests) { std::array minimumsShape = {1.1, 3.2}; std::array maximumsShape = {4.1, 4.4}; std::array finalMin = { -5.9, -3.8}; std::array finalMax = {11.1, 11.4}; IntervalDouble2 shape(minimumsShape, maximumsShape); shape.addThickness(7.0); EXPECT_EQ(IntervalDouble2(finalMin, finalMax), shape); }; TEST_F(IntervalArithmeticTests, IntervalNDOperatorTests) { std::array minimumsShape = {1.1, 3.2}; std::array maximumsShape = {4.1, 4.4}; std::array deltaMin = { -1.0, -2.0}; std::array deltaMax = {3.0, 4.0}; std::array nonZeroDeltaMin = { -3.0, 2.0}; std::array nonZeroDeltaMax = { -1.0, 4.0}; IntervalDouble2 initial(minimumsShape, maximumsShape); IntervalDouble2 deltaInterval(deltaMin, deltaMax); IntervalDouble2 nonZeroDelta(nonZeroDeltaMin, nonZeroDeltaMax); IntervalDouble2 dummy; // + EXPECT_TRUE((Interval(1.1, 4.1) + Interval(-1.0, 3.0)).isApprox( (initial + deltaInterval).getAxis(0), epsilon)); EXPECT_TRUE((Interval(3.2, 4.4) + Interval(-2.0, 4.0)).isApprox( (initial + deltaInterval).getAxis(1), epsilon)); // += dummy = initial; dummy += deltaInterval; EXPECT_TRUE((Interval(1.1, 4.1) + Interval(-1.0, 3.0)).isApprox(dummy.getAxis(0), epsilon)); EXPECT_TRUE((Interval(3.2, 4.4) + Interval(-2.0, 4.0)).isApprox(dummy.getAxis(1), epsilon)); // - EXPECT_TRUE((Interval(1.1, 4.1) - Interval(-1.0, 3.0)).isApprox( (initial - deltaInterval).getAxis(0), epsilon)); EXPECT_TRUE((Interval(3.2, 4.4) - Interval(-2.0, 4.0)).isApprox( (initial - deltaInterval).getAxis(1), epsilon)); // -= dummy = initial; dummy -= deltaInterval; EXPECT_TRUE((Interval(1.1, 4.1) - Interval(-1.0, 3.0)).isApprox(dummy.getAxis(0), epsilon)); EXPECT_TRUE((Interval(3.2, 4.4) - Interval(-2.0, 4.0)).isApprox(dummy.getAxis(1), epsilon)); // * EXPECT_TRUE((Interval(1.1, 4.1) * Interval(-1.0, 3.0)).isApprox( (initial * deltaInterval).getAxis(0), epsilon)); EXPECT_TRUE((Interval(3.2, 4.4) * Interval(-2.0, 4.0)).isApprox( (initial * deltaInterval).getAxis(1), epsilon)); // *= dummy = initial; dummy *= deltaInterval; EXPECT_TRUE((Interval(1.1, 4.1) * Interval(-1.0, 3.0)).isApprox(dummy.getAxis(0), epsilon)); EXPECT_TRUE((Interval(3.2, 4.4) * Interval(-2.0, 4.0)).isApprox(dummy.getAxis(1), epsilon)); // / EXPECT_TRUE((Interval(1.1, 4.1) / Interval(-3.0, -1.0)).isApprox( (initial / nonZeroDelta).getAxis(0), epsilon)); EXPECT_TRUE((Interval(3.2, 4.4) / Interval(2.0, 4.0)).isApprox( (initial / nonZeroDelta).getAxis(1), epsilon)); // /= dummy = initial; dummy /= nonZeroDelta; EXPECT_TRUE((Interval(1.1, 4.1) / Interval(-3.0, -1.0)).isApprox(dummy.getAxis(0), epsilon)); EXPECT_TRUE((Interval(3.2, 4.4) / Interval(2.0, 4.0)).isApprox(dummy.getAxis(1), epsilon)); // Inverse EXPECT_TRUE(Interval(1.1, 4.1).inverse().isApprox(initial.inverse().getAxis(0), epsilon)); EXPECT_TRUE(Interval(3.2, 4.4).inverse().isApprox(initial.inverse().getAxis(1), epsilon)); // Dot product Interval dotValue(initial.dotProduct(deltaInterval)); EXPECT_TRUE(dotValue.isApprox((initial.getAxis(0) * deltaInterval.getAxis(0)) + (initial.getAxis(1) * deltaInterval.getAxis(1)), epsilon)); // Magnitude and magnitude squared Interval magnitudeSquaredValue(initial.magnitudeSquared()); EXPECT_TRUE(magnitudeSquaredValue.isApprox((initial.getAxis(0).square() + initial.getAxis(1).square()), epsilon)); Interval magnitudeValue(initial.magnitude()); EXPECT_NEAR(std::sqrt(magnitudeSquaredValue.getMin()), magnitudeValue.getMin(), epsilon); EXPECT_NEAR(std::sqrt(magnitudeSquaredValue.getMax()), magnitudeValue.getMax(), epsilon); }; // Interval ND tests TEST_F(IntervalArithmeticTests, Interval3DInitializationTests) { // Constructor tests Interval testInterval(3.7, 3.8); std::array minimums = {1.1, 4.4, -7.2}; std::array maximums = {4.1, 3.2, -1.0}; std::array minimumsPlusEpsilon = {1.1 + delta, 4.4 + delta, -7.2 + delta}; std::array maximumsPlusEpsilon = {4.1 + delta, 3.2 + delta, -1.0 + delta}; std::array maximumsPlus2Epsilon = {4.1 + (2 * epsilon), 3.2 + delta, -1.0 + delta}; std::array, 3> testIntervalArray; testIntervalArray[0] = Interval (1.0, 2.0); testIntervalArray[1] = Interval (2.0, 3.0); testIntervalArray[2] = Interval (3.0, 4.0); EXPECT_NO_THROW(IntervalDouble3 a); EXPECT_NO_THROW(IntervalDouble3 a(testIntervalArray)); EXPECT_NO_THROW(IntervalDouble3 a(Interval (1.0, 2.0), Interval (2.0, 3.0), Interval (3.0, 4.0))); EXPECT_NO_THROW(IntervalDouble3 a(minimums, maximums)); EXPECT_NO_THROW(IntervalDouble3 a(IntervalDouble3(minimums, maximums))); IntervalDouble3 b(minimums, maximums); IntervalDouble3 a(b); EXPECT_TRUE(a == b); EXPECT_NO_THROW(testInterval3DMoveConstructor(b)); IntervalDouble3 f = testInterval3DMoveConstructor(b); EXPECT_TRUE(f == b); // Assignment and equal/not equal tests IntervalDouble3 c; EXPECT_TRUE(c != b); EXPECT_FALSE(c == b); c = a; EXPECT_FALSE(c != b); EXPECT_TRUE(c == b); IntervalDouble3 e; e = (b * c); EXPECT_TRUE(e == (b * c)); IntervalDouble3 bPlusEpsilon(minimumsPlusEpsilon, maximumsPlusEpsilon); IntervalDouble3 bPlus2Epsilon(minimumsPlusEpsilon, maximumsPlus2Epsilon); EXPECT_TRUE(b.isApprox(bPlusEpsilon, epsilon)); EXPECT_TRUE(bPlusEpsilon.isApprox(b, epsilon)); EXPECT_FALSE(b.isApprox(bPlus2Epsilon, epsilon)); EXPECT_FALSE(bPlus2Epsilon.isApprox(b, epsilon)); // Getting components and the reordering initializer Interval axis0 = b.getAxis(0); Interval axis1 = b.getAxis(1); Interval axis2 = b.getAxis(2); EXPECT_TRUE(axis0 == Interval(1.1, 4.1)); EXPECT_TRUE(axis1 == Interval(3.2, 4.4)); EXPECT_TRUE(axis2 == Interval(-7.2, -1.0)); }; TEST_F(IntervalArithmeticTests, Interval3DRangeTests) { std::array minimumsShape = {1.1, 3.2, -7.2}; std::array maximumsShape = {4.1, 4.4, -1.0}; std::array noOverlapMin = {1.1, 4.5, -8.0}; std::array noOverlapMax = {4.5, 4.8, -3.0}; std::array overlapMin = {1.7, 2.0, -8.0}; std::array overlapMax = {4.3, 4.7, -3.0}; IntervalDouble3 shape(minimumsShape, maximumsShape); EXPECT_FALSE(shape.overlapsWith(IntervalDouble3(noOverlapMin, noOverlapMax))); EXPECT_TRUE(shape.overlapsWith(IntervalDouble3(overlapMin, overlapMax))); }; TEST_F(IntervalArithmeticTests, Interval3DExtendRangeTests) { std::array minimumsShape = {1.1, 3.2, -7.2}; std::array maximumsShape = {4.1, 4.4, -1.0}; std::array finalMin = { -5.9, -3.8, -14.2}; std::array finalMax = {11.1, 11.4, 6.0}; IntervalDouble3 shape(minimumsShape, maximumsShape); shape.addThickness(7.0); EXPECT_EQ(IntervalDouble3(finalMin, finalMax), shape); }; TEST_F(IntervalArithmeticTests, Interval3DOperatorTests) { std::array minimumsShape = {1.1, 3.2, -7.2}; std::array maximumsShape = {4.1, 4.4, -1.0}; std::array deltaMin = { -1.0, -2.0, -3.0}; std::array deltaMax = {3.0, 4.0, 5.0}; std::array nonZeroDeltaMin = { -3.0, 2.0, 3.0}; std::array nonZeroDeltaMax = { -1.0, 4.0, 5.0}; IntervalDouble3 initial(minimumsShape, maximumsShape); IntervalDouble3 delta(deltaMin, deltaMax); IntervalDouble3 nonZeroDelta(nonZeroDeltaMin, nonZeroDeltaMax); IntervalDouble3 dummy; // + EXPECT_TRUE((Interval(1.1, 4.1) + Interval(-1.0, 3.0)).isApprox( (initial + delta).getAxis(0), epsilon)); EXPECT_TRUE((Interval(3.2, 4.4) + Interval(-2.0, 4.0)).isApprox( (initial + delta).getAxis(1), epsilon)); EXPECT_TRUE((Interval(-7.2, -1.0) + Interval(-3.0, 5.0)).isApprox( (initial + delta).getAxis(2), epsilon)); // += dummy = initial; dummy += delta; EXPECT_TRUE((Interval(1.1, 4.1) + Interval(-1.0, 3.0)).isApprox(dummy.getAxis(0), epsilon)); EXPECT_TRUE((Interval(3.2, 4.4) + Interval(-2.0, 4.0)).isApprox(dummy.getAxis(1), epsilon)); EXPECT_TRUE((Interval(-7.2, -1.0) + Interval(-3.0, 5.0)).isApprox(dummy.getAxis(2), epsilon)); // - EXPECT_TRUE((Interval(1.1, 4.1) - Interval(-1.0, 3.0)).isApprox( (initial - delta).getAxis(0), epsilon)); EXPECT_TRUE((Interval(3.2, 4.4) - Interval(-2.0, 4.0)).isApprox( (initial - delta).getAxis(1), epsilon)); EXPECT_TRUE((Interval(-7.2, -1.0) - Interval(-3.0, 5.0)).isApprox( (initial - delta).getAxis(2), epsilon)); // -= dummy = initial; dummy -= delta; EXPECT_TRUE((Interval(1.1, 4.1) - Interval(-1.0, 3.0)).isApprox(dummy.getAxis(0), epsilon)); EXPECT_TRUE((Interval(3.2, 4.4) - Interval(-2.0, 4.0)).isApprox(dummy.getAxis(1), epsilon)); EXPECT_TRUE((Interval(-7.2, -1.0) - Interval(-3.0, 5.0)).isApprox(dummy.getAxis(2), epsilon)); // * EXPECT_TRUE((Interval(1.1, 4.1) * Interval(-1.0, 3.0)).isApprox( (initial * delta).getAxis(0), epsilon)); EXPECT_TRUE((Interval(3.2, 4.4) * Interval(-2.0, 4.0)).isApprox( (initial * delta).getAxis(1), epsilon)); EXPECT_TRUE((Interval(-7.2, -1.0) * Interval(-3.0, 5.0)).isApprox( (initial * delta).getAxis(2), epsilon)); // *= dummy = initial; dummy *= delta; EXPECT_TRUE((Interval(1.1, 4.1) * Interval(-1.0, 3.0)).isApprox(dummy.getAxis(0), epsilon)); EXPECT_TRUE((Interval(3.2, 4.4) * Interval(-2.0, 4.0)).isApprox(dummy.getAxis(1), epsilon)); EXPECT_TRUE((Interval(-7.2, -1.0) * Interval(-3.0, 5.0)).isApprox(dummy.getAxis(2), epsilon)); // / EXPECT_TRUE((Interval(1.1, 4.1) / Interval(-3.0, -1.0)).isApprox( (initial / nonZeroDelta).getAxis(0), epsilon)); EXPECT_TRUE((Interval(3.2, 4.4) / Interval(2.0, 4.0)).isApprox( (initial / nonZeroDelta).getAxis(1), epsilon)); EXPECT_TRUE((Interval(-7.2, -1.0) / Interval(3.0, 5.0)).isApprox( (initial / nonZeroDelta).getAxis(2), epsilon)); // /= dummy = initial; dummy /= nonZeroDelta; EXPECT_TRUE((Interval(1.1, 4.1) / Interval(-3.0, -1.0)).isApprox(dummy.getAxis(0), epsilon)); EXPECT_TRUE((Interval(3.2, 4.4) / Interval(2.0, 4.0)).isApprox(dummy.getAxis(1), epsilon)); EXPECT_TRUE((Interval(-7.2, -1.0) / Interval(3.0, 5.0)).isApprox(dummy.getAxis(2), epsilon)); // Inverse EXPECT_TRUE(Interval(1.1, 4.1).inverse().isApprox(initial.inverse().getAxis(0), epsilon)); EXPECT_TRUE(Interval(3.2, 4.4).inverse().isApprox(initial.inverse().getAxis(1), epsilon)); EXPECT_TRUE(Interval(-7.2, -1.0).inverse().isApprox(initial.inverse().getAxis(2), epsilon)); // Dot product Interval dotValue = initial.dotProduct(delta); EXPECT_TRUE(dotValue.isApprox((initial.getAxis(0) * delta.getAxis(0)) + (initial.getAxis(1) * delta.getAxis(1)) + (initial.getAxis(2) * delta.getAxis(2)), epsilon)); // Cross product IntervalDouble3 crossValue = initial.crossProduct(delta); EXPECT_TRUE(crossValue.getAxis(0).isApprox((initial.getAxis(1) * delta.getAxis(2) - initial.getAxis(2) * delta.getAxis(1)), epsilon)); EXPECT_TRUE(crossValue.getAxis(1).isApprox((initial.getAxis(2) * delta.getAxis(0) - initial.getAxis(0) * delta.getAxis(2)), epsilon)); EXPECT_TRUE(crossValue.getAxis(2).isApprox((initial.getAxis(0) * delta.getAxis(1) - initial.getAxis(1) * delta.getAxis(0)), epsilon)); // Magnitude and magnitude squared Interval magnitudeSquaredValue = initial.magnitudeSquared(); EXPECT_TRUE(magnitudeSquaredValue.isApprox((initial.getAxis(0).square() + initial.getAxis(1).square() + initial.getAxis(2).square()), epsilon)); Interval magnitudeValue = initial.magnitude(); EXPECT_NEAR(std::sqrt(magnitudeSquaredValue.getMin()), magnitudeValue.getMin(), epsilon); EXPECT_NEAR(std::sqrt(magnitudeSquaredValue.getMax()), magnitudeValue.getMax(), epsilon); }; TEST_F(IntervalArithmeticTests, IntervalUtilityTests) { Interval initial(10.0, 20.0); Interval deltaInterval(3.0, 4.0); Interval resultLoad(-2.0, -1.0); Interval result; // Constant + interval EXPECT_TRUE((initial + 11.5).isApprox(11.5 + initial, epsilon)); // Constant * interval EXPECT_TRUE((initial * 11.5).isApprox(11.5 * initial, epsilon)); // Output std::ostringstream intervalOutput; intervalOutput << initial; EXPECT_EQ("[10,20]", intervalOutput.str()); // + IntervalArithmetic_add(initial, deltaInterval, &result); EXPECT_TRUE((initial + deltaInterval).isApprox(result, epsilon)); // +=( + ) result = resultLoad; IntervalArithmetic_addadd(initial, deltaInterval, &result); EXPECT_TRUE((resultLoad + initial + deltaInterval).isApprox(result, epsilon)); // - IntervalArithmetic_sub(initial, deltaInterval, &result); EXPECT_TRUE((initial - deltaInterval).isApprox(result, epsilon)); // +=( - ) result = resultLoad; IntervalArithmetic_addsub(initial, deltaInterval, &result); EXPECT_TRUE((resultLoad + (initial - deltaInterval)).isApprox(result, epsilon)); // * IntervalArithmetic_mul(initial, deltaInterval, &result); EXPECT_TRUE((initial * deltaInterval).isApprox(result, epsilon)); // += ( * ) result = resultLoad; IntervalArithmetic_addmul(initial, deltaInterval, &result); EXPECT_TRUE((resultLoad + (initial * deltaInterval)).isApprox(result, epsilon)); // -= ( * ) result = resultLoad; IntervalArithmetic_submul(initial, deltaInterval, &result); EXPECT_TRUE((resultLoad - (initial * deltaInterval)).isApprox(result, epsilon)); }; TEST_F(IntervalArithmeticTests, IntervalNDUtilityTests) { std::array minimumsShape = {1.1, 3.2}; std::array maximumsShape = {4.1, 4.4}; IntervalDouble2 shape(minimumsShape, maximumsShape); // Output std::ostringstream intervalOutput; intervalOutput << shape; EXPECT_EQ("([1.1,4.1];[3.2,4.4])", intervalOutput.str()); }; TEST_F(IntervalArithmeticTests, Interval3DUtilityTests) { std::array minimumsShape = {1.1, 3.2, -7.2}; std::array maximumsShape = {4.1, 4.4, -1.0}; std::array deltaMin = { -1.0, -2.0, -3.0}; std::array deltaMax = {3.0, 4.0, 5.0}; IntervalDouble3 initial(minimumsShape, maximumsShape); IntervalDouble3 deltaInterval(deltaMin, deltaMax); IntervalDouble3 result; Interval intervalResult; // + IntervalArithmetic_add(initial, deltaInterval, &result); EXPECT_TRUE((initial + deltaInterval).isApprox(result, epsilon)); // - IntervalArithmetic_sub(initial, deltaInterval, &result); EXPECT_TRUE((initial - deltaInterval).isApprox(result, epsilon)); // dot product IntervalArithmetic_dotProduct(initial, deltaInterval, &intervalResult); EXPECT_TRUE(initial.dotProduct(deltaInterval).isApprox(intervalResult, epsilon)); // Cross product IntervalArithmetic_crossProduct(initial, deltaInterval, &result); EXPECT_TRUE(initial.crossProduct(deltaInterval).isApprox(result, epsilon)); }; }; // namespace Math }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Math/UnitTests/KalmanFilterTests.cpp000066400000000000000000000106321277777236100244420ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the KalmanFilter.cpp functions. #include #include #include "SurgSim/Math/KalmanFilter.h" #include "SurgSim/Math/Matrix.h" #include "SurgSim/Math/Vector.h" typedef Eigen::Matrix Vector1d; typedef Eigen::Matrix Matrix11d; namespace SurgSim { namespace Math { TEST(KalmanFilterTests, 1DConstant) { auto kalman = std::make_shared>(); EXPECT_TRUE(boost::math::isnan(kalman->getState()[0])); const Vector1d initialState = Vector1d::Zero(); kalman->setInitialState(initialState); // the state is a scalar, and we have an initial guess for it EXPECT_DOUBLE_EQ(initialState[0], kalman->getState()[0]); kalman->setInitialStateCovariance(Matrix11d::Constant(1000.0)); // the uncertainty about initial guess is high kalman->setStateTransition(Matrix11d::Constant(1.0)); // we predict the true state will stay constant kalman->setObservationMatrix(Matrix11d::Constant(1.0)); // we observe the actual state plus measurement error kalman->setProcessNoiseCovariance(Matrix11d::Constant(0.0001)); // the noise in the prediction action is low kalman->setMeasurementNoiseCovariance(Matrix11d::Constant(0.1)); // the assumed measurement noise const double measurements[] = {0.9, 0.8, 1.1, 1, 0.95, 1.05, 1.2, 0.9, 0.85, 1.15}; for (double measurement : measurements) { kalman->update(Vector1d::Constant(measurement)); } const double result = 0.99046032523740679; EXPECT_NEAR(result , kalman->getState()[0], 1e-9); // The state doesn't change unless there's an update. EXPECT_NEAR(result, kalman->getState()[0], 1e-9); // Updating a constant model without a measurement shouldn't change the state. EXPECT_NEAR(result, kalman->update()[0], 1e-9); } TEST(KalmanFilterTests, 1DVelocity) { auto kalman = std::make_shared>(); // The state is the position and velocity, and here's our initial guess. const Vector2d initialState = Vector2d::Zero(); kalman->setInitialState(initialState); const Matrix22d initialStateCovariance = 1000.0 * Matrix22d::Identity(); kalman->setInitialStateCovariance(initialStateCovariance); // The new position is the old position plus velocity times dt. The velocity is constant. const double dt = 0.1; Matrix22d stateTransition; stateTransition << 1.0, dt, 0.0, 1.0; kalman->setStateTransition(stateTransition); // The measurements are of the position, plus measurement error. Eigen::Matrix observationMatrix; observationMatrix.setIdentity(); kalman->setObservationMatrix(observationMatrix); const double velocityNoise = 0.001; // Assume the noise is only in the velocity, so a continuous noise model of [0, 0; 0, velocityNoise], then // approximate that by a time-discrete process to get... Matrix22d processNoise; processNoise << dt * dt * dt * velocityNoise / 3.0, dt * dt * velocityNoise / 2.0, dt * dt * velocityNoise / 3.0, dt * velocityNoise; kalman->setProcessNoiseCovariance(processNoise); kalman->setMeasurementNoiseCovariance(Matrix11d::Constant(0.1)); const double measurements[] = {0.11, 0.29, 0.32, 0.5, 0.58, 0.54}; for (double measurement : measurements) { kalman->update(Vector1d::Constant(measurement)); } // check the state const double position = 0.61844193701221828; EXPECT_NEAR(position, kalman->getState()[0], 1e-9); const double velocity = 0.91376229444025137; EXPECT_NEAR(velocity, kalman->getState()[1], 1e-9); // The state doesn't change unless there's an update. EXPECT_NEAR(position, kalman->getState()[0], 1e-9); // Updating without a measurement will predict ahead. EXPECT_NEAR(position + velocity * dt, kalman->update()[0], 1e-9); EXPECT_NEAR(velocity, kalman->getState()[1], 1e-9); } }; // namespace Math }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Math/UnitTests/LinearMotionArithmeticTests.cpp000066400000000000000000000346631277777236100265150ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the LinearMotionArithmetic functions. #include #include #include "SurgSim/Math/LinearMotionArithmetic.h" namespace SurgSim { namespace Math { namespace { double epsilon = 1.0e-10; } template class LinearMotionArithmeticTests : public ::testing::Test { public: typedef LinearMotionND LinearMotionDouble2; typedef LinearMotionND LinearMotionDouble3; LinearMotion testLinearMotionMoveConstructor(LinearMotion dummy) { LinearMotion ret; ret = dummy; return ret; } template LinearMotionND testLinearMotionNDMoveConstructor(LinearMotionND dummy) { LinearMotionND ret; ret = dummy; return ret; } void initializeConstructor(LinearMotion* motion) { // Constructor tests EXPECT_NO_THROW(LinearMotion a); EXPECT_NO_THROW(LinearMotion a(1.0, 2.0)); EXPECT_NO_THROW(LinearMotion a(2.0, 1.0)); LinearMotion a(2.0, 1.0); EXPECT_NO_THROW(LinearMotion b(a)); LinearMotion b(a); EXPECT_TRUE(b == a); EXPECT_NO_THROW(testLinearMotionMoveConstructor(b)); LinearMotion f = testLinearMotionMoveConstructor(b); EXPECT_TRUE(f == b); *motion = a; } template void initializeConstructor(LinearMotionND* motion) { typedef LinearMotionND LinearMotionDoubleType; // Constructor tests LinearMotion testLinearMotion(3.8, 3.7); std::array starts; std::array ends; std::array, dimension> testLinearMotionArray; for (int counter = 0; counter < dimension; ++counter) { starts[counter] = counter + 1.0; ends[counter] = counter + 2.0; testLinearMotionArray[counter] = LinearMotion (counter + 2.0, counter + 1.0); } EXPECT_NO_THROW(LinearMotionDoubleType a); EXPECT_NO_THROW(LinearMotionDoubleType a(testLinearMotionArray)); EXPECT_NO_THROW(LinearMotionDoubleType a(starts, ends)); EXPECT_NO_THROW(LinearMotionDoubleType a(LinearMotionDoubleType(starts, ends))); LinearMotionDoubleType b(testLinearMotionArray); LinearMotionDoubleType a(b); EXPECT_TRUE(a == b); EXPECT_NO_THROW(testLinearMotionNDMoveConstructor(b)); LinearMotionDoubleType f = testLinearMotionNDMoveConstructor(b); EXPECT_TRUE(f == b); *motion = a; } void checkLinearMotionConstructor(LinearMotion* motion) { EXPECT_DOUBLE_EQ(2.0, motion->getStart()); EXPECT_DOUBLE_EQ(1.0, motion->getEnd()); } template void checkLinearMotionConstructor(LinearMotionND* motion) { // Check get ... up to numb for (int counter = 0; counter < dimension; ++counter) { EXPECT_DOUBLE_EQ(counter + 2.0, motion->getAxis(counter).getStart()); EXPECT_DOUBLE_EQ(counter + 1.0, motion->getAxis(counter).getEnd()); } EXPECT_THROW(motion->getAxis(-1), SurgSim::Framework::AssertionFailure); EXPECT_THROW(motion->getAxis(dimension), SurgSim::Framework::AssertionFailure); } void setLinearMotionFromOffset(double offsetStart, double offsetEnd, LinearMotion* motion) { (*motion) = LinearMotion(offsetStart, offsetEnd); } template void setLinearMotionFromOffset(double offsetStart, double offsetEnd, LinearMotionND* motion) { std::array, dimension> values; for (size_t counter = 0; counter < dimension; ++counter) { values[counter] = LinearMotion(counter + offsetStart, counter + offsetEnd); } (*motion) = LinearMotionND(values); } void checkLinearMotionOperators(LinearMotion* motion1, LinearMotion* motion2) { // Assignment and equal/not equal tests LinearMotion c; c = *motion2; EXPECT_TRUE(c != *motion1); EXPECT_FALSE(c == *motion1); c = *motion1; EXPECT_FALSE(c != *motion1); EXPECT_TRUE(c == *motion1); // Move assignment LinearMotion e; LinearMotion zeros(0.0, 0.0); e = (*motion1 + zeros); EXPECT_TRUE(e == *motion1); // to interval and polynomial EXPECT_TRUE(motion1->toInterval().isApprox(Interval(1.0, 2.0), epsilon)); EXPECT_TRUE(motion1->toPolynomial().isApprox(Polynomial(2.0, -1.0), epsilon)); // Contains 0 and isApprox LinearMotion containsZero(-1.0, 1.0); EXPECT_TRUE(containsZero.containsZero()); EXPECT_FALSE(motion1->containsZero()); EXPECT_FALSE(motion2->containsZero()); LinearMotion closeStart(motion1->getStart() + epsilon, motion1->getEnd()); LinearMotion closeEnd(motion1->getStart(), motion1->getEnd() + epsilon); EXPECT_TRUE(motion1->isApprox(closeStart, 2 * epsilon)); EXPECT_TRUE(motion1->isApprox(closeEnd, 2 * epsilon)); EXPECT_FALSE(motion1->isApprox(closeStart, 0.5 * epsilon)); EXPECT_FALSE(motion1->isApprox(closeEnd, 0.5 * epsilon)); // +, +=, -, -=, *, / LinearMotion scratch; scratch = *motion1 + *motion2; EXPECT_TRUE(scratch.isApprox(LinearMotion(3.0, 3.0), epsilon)); scratch = *motion1; scratch += *motion2; EXPECT_TRUE(scratch.isApprox(LinearMotion(3.0, 3.0), epsilon)); scratch = *motion1 - *motion2; EXPECT_TRUE(scratch.isApprox(LinearMotion(1.0, -1.0), epsilon)); scratch = *motion1; scratch -= *motion2; EXPECT_TRUE(scratch.isApprox(LinearMotion(1.0, -1.0), epsilon)); EXPECT_TRUE((*motion1 * *motion2).isApprox(Interval(1.0, 4.0), epsilon)); EXPECT_TRUE((*motion1 / *motion2).isApprox(Interval(0.5, 2.0), epsilon)); // Range operators EXPECT_DOUBLE_EQ(1.75, motion1->atTime(0.25)); EXPECT_TRUE(motion1->firstHalf().isApprox(LinearMotion(2.0, 1.5), epsilon)); EXPECT_TRUE(motion1->secondHalf().isApprox(LinearMotion(1.5, 1.0), epsilon)); } template void checkLinearMotionOperators(LinearMotionND* motion1, LinearMotionND* motion2) { typedef LinearMotionND LinearMotionDoubleType; typedef IntervalND IntervalDoubleType; // Assignment and equal/not equal tests LinearMotionDoubleType c; c = *motion2; EXPECT_TRUE(c != *motion1); EXPECT_FALSE(c == *motion1); c = *motion1; EXPECT_FALSE(c != *motion1); EXPECT_TRUE(c == *motion1); // Move assignment LinearMotionDoubleType e; std::array zeroArray; for (int counter = 0; counter < dimension; ++counter) { zeroArray[counter] = 0.0; } LinearMotionDoubleType zeros(zeroArray, zeroArray); e = (*motion1 + zeros); EXPECT_TRUE(e == *motion1); // to interval std::array, dimension> motionArray; for (int counter = 0; counter < dimension; ++counter) { motionArray[counter] = motion1->getAxis(counter).toInterval(); } EXPECT_TRUE(motion1->toInterval().isApprox(IntervalDoubleType(motionArray), epsilon)); // is approx std::array, dimension> approxArray; for (int counter = 0; counter < dimension; ++counter) { approxArray[counter] = motion1->getAxis(counter).toInterval(); } for (int counter = 0; counter < dimension; ++counter) { approxArray[counter] = (motion1->getAxis(counter) + LinearMotion(epsilon, 0.0)).toInterval(); EXPECT_TRUE(motion1->toInterval().isApprox(IntervalDoubleType(approxArray), 2.0 * epsilon)); EXPECT_FALSE(motion1->toInterval().isApprox(IntervalDoubleType(approxArray), epsilon / 2.0)); approxArray[counter] = motion1->getAxis(counter).toInterval(); } // +, +=, -, -=, *, / LinearMotionDoubleType scratch; scratch = *motion1 + *motion2; for (int counter = 0; counter < dimension; ++counter) { EXPECT_TRUE(scratch.getAxis(counter).isApprox(LinearMotion((2.0 * counter) + 3.0, (2.0 * counter) + 3.0), epsilon)); } scratch = *motion1; scratch += *motion2; for (int counter = 0; counter < dimension; ++counter) { EXPECT_TRUE(scratch.getAxis(counter).isApprox(LinearMotion((2.0 * counter) + 3.0, (2.0 * counter) + 3.0), epsilon)); } scratch = *motion1 - *motion2; for (int counter = 0; counter < dimension; ++counter) { EXPECT_TRUE(scratch.getAxis(counter).isApprox(LinearMotion(1.0, -1.0), epsilon)); } scratch = *motion1; scratch -= *motion2; for (int counter = 0; counter < dimension; ++counter) { EXPECT_TRUE(scratch.getAxis(counter).isApprox(LinearMotion(1.0, -1.0), epsilon)); } IntervalDoubleType intervalScratch; intervalScratch = *motion1 * *motion2; for (int counter = 0; counter < dimension; ++counter) { EXPECT_TRUE(intervalScratch.getAxis(counter).isApprox(Interval((counter + 1) * (counter + 1), (counter + 2) * (counter + 2)), epsilon)); } intervalScratch = *motion1 / *motion2; for (int counter = 0; counter < dimension; ++counter) { EXPECT_TRUE(intervalScratch.getAxis(counter).isApprox( Interval((counter + 1.0) / (counter + 2.0), (counter + 2.0) / (counter + 1.0)), epsilon)); } // Range operators for (int counter = 0; counter < dimension; ++counter) { EXPECT_TRUE(motion1->firstHalf().getAxis(counter).isApprox( LinearMotion(counter + 2.0, counter + 1.5), epsilon)); EXPECT_TRUE(motion1->secondHalf().getAxis(counter).isApprox( LinearMotion(counter + 1.5, counter + 1.0), epsilon)); } } }; typedef ::testing::Types , LinearMotionND, LinearMotionND> LinearMotionArithmeticTypes; TYPED_TEST_CASE(LinearMotionArithmeticTests, LinearMotionArithmeticTypes); TYPED_TEST(LinearMotionArithmeticTests, LinearMotionInitializationTests) { // Constructor tests EXPECT_NO_THROW(TypeParam motion); TypeParam motion; this->initializeConstructor(&motion); this->checkLinearMotionConstructor(&motion); }; TYPED_TEST(LinearMotionArithmeticTests, LinearMotionOperatorTests) { TypeParam motion1; TypeParam motion2; this->setLinearMotionFromOffset(2, 1, &motion1); this->setLinearMotionFromOffset(1, 2, &motion2); this->checkLinearMotionOperators(&motion1, &motion2); }; TEST(LinearMotionSpecializations, LinearMotionNDExtras) { // Dot product std::array high; high[0] = 2.0; high[1] = 3.0; std::array low; low[0] = 1.0; low[1] = 2.0; LinearMotionND motion1(high, low); LinearMotionND motion2(low, high); double lower = 0; double upper = 0; for (int counter = 0; counter < 2; ++counter) { lower += (counter + 1) * (counter + 1); upper += (counter + 2) * (counter + 2); } EXPECT_TRUE(motion1.dotProduct(motion2).isApprox(Interval(lower, upper), epsilon)); } TEST(LinearMotionSpecializations, LinearMotion3DExtras) { // Dot product std::array high; high[0] = 2.0; high[1] = 3.0; high[2] = 4.0; std::array low; low[0] = 1.0; low[1] = 2.0; low[2] = 3.0; LinearMotionND motion1(high, low); LinearMotionND motion2(low, high); Interval range(0.0, 1.0); // Dot product // Dot product has an optimization using polynomials. Each linear motion is first converted to a linear // polynomial and then the 6 linear polynomials are multiplied against each other to give three quadratic // polynomials. The extrema of the sum of the quadratic polynomials limited to the interval under // evaluation form the minimum and maximum of the new interval. For this test, we end up with a parabola // opening downward. At 0 and 1 it has value 20. The maximum value occurs at 0.5 and has the value 20.75. EXPECT_TRUE(motion1.dotProduct(motion2, range).isApprox(Interval(20.0, 20.75), epsilon)); // Cross product IntervalND cross = motion1.crossProduct(motion2, range); EXPECT_TRUE(cross.getAxis(0).isApprox(Interval(-1.0, 1.0), epsilon)); EXPECT_TRUE(cross.getAxis(1).isApprox(Interval(-2.0, 2.0), epsilon)); EXPECT_TRUE(cross.getAxis(2).isApprox(Interval(-1.0, 1.0), epsilon)); // Analytic cross product (polynomials) Polynomial xPoly; Polynomial yPoly; Polynomial zPoly; analyticCrossProduct(motion1, motion2, &xPoly, &yPoly, &zPoly); EXPECT_TRUE(valuesOverInterval(xPoly, range).isApprox(Interval(-1.0, 1.0), epsilon)); EXPECT_TRUE(valuesOverInterval(yPoly, range).isApprox(Interval(-2.0, 2.0), epsilon)); EXPECT_TRUE(valuesOverInterval(zPoly, range).isApprox(Interval(-1.0, 1.0), epsilon)); /// Magnitudes EXPECT_TRUE(motion1.magnitudeSquared(range).isApprox(motion1.dotProduct(motion1, range), epsilon)); Interval magnitude = motion1.magnitude(range); Interval dot = motion1.dotProduct(motion1, range); EXPECT_DOUBLE_EQ(std::sqrt(dot.getMin()), magnitude.getMin()); EXPECT_DOUBLE_EQ(std::sqrt(dot.getMax()), magnitude.getMax()); // At Time for (int counter = 0; counter < 3; ++counter) { EXPECT_DOUBLE_EQ(counter + 1.75, motion1.atTime(0.25)[counter]); } } TEST(LinearMotionUtilities, LinearMotionUtilities) { LinearMotion motion(-12.1, 8.7); // Output std::ostringstream linearMotionOutput; linearMotionOutput << motion; EXPECT_EQ("(-12.1 -> 8.7)", linearMotionOutput.str()); } TEST(LinearMotionUtilities, LinearMotion3DUtilities) { Math::Vector3d high; high[0] = 3.0; high[1] = 4.0; high[2] = 5.0; Math::Vector3d low; low[0] = 1.0; low[1] = 2.0; low[2] = 3.0; Math::Vector3d medium; medium[0] = 2.0; medium[1] = 3.0; medium[2] = 4.0; LinearMotionND motion1(medium, low); LinearMotionND motion2(low, medium); LinearMotionND motion3(high, low); Interval range(0.0, 1.0); // Output std::ostringstream linearMotionOutput; linearMotionOutput << motion1; EXPECT_EQ("([2,3,4] -> [1,2,3])", linearMotionOutput.str()); // Triple Product a * (b X c) EXPECT_TRUE(tripleProduct(motion1, motion2, motion3, range).isApprox(Interval(0.0, 0.0), epsilon)); } }; // namespace Math }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Math/UnitTests/LinearSolveAndInverseTests.cpp000066400000000000000000000177111277777236100263000ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the LinearSolveAndInverse.cpp functions. #include #include "SurgSim/Math/LinearSolveAndInverse.h" namespace SurgSim { namespace Math { class LinearSolveAndInverseTests : public ::testing::Test { private: size_t size; void initializeVector(Vector* v) { v->resize(size); for (size_t row = 0; row < size; row++) { (*v)(row) = std::fmod(-4.1 * row * row + 3.46, 5.0); } } void initializeDenseMatrix(Matrix* m) { m->resize(size, size); for (size_t row = 0; row < size; row++) { for (size_t col = 0; col < size; col++) { (*m)(row, col) = std::fmod((10.3 * std::cos(static_cast(row * col)) + 3.24), 10.0); } } } void initializeDiagonalMatrix(Matrix* m) { m->resize(size, size); m->setZero(); for (size_t row = 0; row < size; row++) { (*m)(row, row) = std::fmod((10.3 * std::cos(static_cast(row * row)) + 3.24), 10.0); } } template void initializeTriDiagonalBlockMatrix(Matrix* m, bool isSymmetric) { size_t numBlocks = size / BlockSize; m->resize(size, size); m->setZero(); for (size_t rowBlockId = 0; rowBlockId < numBlocks; rowBlockId++) { for (int colBlockId = static_cast(rowBlockId) - 1; colBlockId <= static_cast(rowBlockId) + 1; colBlockId++) { if (colBlockId < 0 || colBlockId >= static_cast(numBlocks)) { continue; } for (size_t rowInBlockId = 0; rowInBlockId < BlockSize; ++rowInBlockId) { for (size_t colInBlockId = 0; colInBlockId < BlockSize; ++colInBlockId) { size_t row = rowBlockId * BlockSize + rowInBlockId; size_t col = colBlockId * BlockSize + colInBlockId; (*m)(row, col) = fmod((10.3 * std::cos(static_cast(row * col)) + 3.24), 10.0); } } } } if (isSymmetric) { // Force symmetry (lower triangular is copied from the upper triangular) for (size_t row = 0; row < size; ++row) { for (size_t col = row + 1; col < size; ++col) { (*m)(col, row) = (*m)(row, col); } } } } void setupTest() { initializeVector(&b); expectedInverse = matrix.inverse(); expectedX = expectedInverse * b; } public: void setupDenseMatrixTest() { size = 18; initializeDenseMatrix(&matrix); setupTest(); } void setupDiagonalMatrixTest() { size = 18; initializeDiagonalMatrix(&matrix); setupTest(); } template void setupTriDiagonalBlockMatrixTest(bool isSymmetric = false) { size = BlockSize * 6; initializeTriDiagonalBlockMatrix(&matrix, isSymmetric); setupTest(); } Matrix matrix; Matrix inverseMatrix, expectedInverse; Vector b; Vector x, expectedX; }; TEST_F(LinearSolveAndInverseTests, DenseMatrixTests) { setupDenseMatrixTest(); LinearSolveAndInverseDenseMatrix solveAndInverse; solveAndInverse.setMatrix(matrix); x = solveAndInverse.solve(b); inverseMatrix = solveAndInverse.getInverse(); EXPECT_TRUE(x.isApprox(expectedX)); EXPECT_TRUE(inverseMatrix.isApprox(expectedInverse)); }; TEST_F(LinearSolveAndInverseTests, DiagonalMatrixTests) { setupDiagonalMatrixTest(); LinearSolveAndInverseDiagonalMatrix solveAndInverse; solveAndInverse.setMatrix(matrix); x = solveAndInverse.solve(b); inverseMatrix = solveAndInverse.getInverse(); EXPECT_TRUE(x.isApprox(expectedX)); EXPECT_TRUE(inverseMatrix.isApprox(expectedInverse)); }; TEST_F(LinearSolveAndInverseTests, TriDiagonalBlockMatrixBlockSize2Tests) { setupTriDiagonalBlockMatrixTest<2>(); LinearSolveAndInverseTriDiagonalBlockMatrix<2> solveAndInverse; solveAndInverse.setMatrix(matrix); x = solveAndInverse.solve(b); inverseMatrix = solveAndInverse.getInverse(); EXPECT_TRUE(x.isApprox(expectedX)); EXPECT_TRUE(inverseMatrix.isApprox(expectedInverse)); }; TEST_F(LinearSolveAndInverseTests, TriDiagonalBlockMatrixBlockSize3Tests) { setupTriDiagonalBlockMatrixTest<3>(); LinearSolveAndInverseTriDiagonalBlockMatrix<3> solveAndInverse; solveAndInverse.setMatrix(matrix); x = solveAndInverse.solve(b); inverseMatrix = solveAndInverse.getInverse(); EXPECT_TRUE(x.isApprox(expectedX)); EXPECT_TRUE(inverseMatrix.isApprox(expectedInverse)); }; TEST_F(LinearSolveAndInverseTests, TriDiagonalBlockMatrixBlockSize4Tests) { setupTriDiagonalBlockMatrixTest<4>(); LinearSolveAndInverseTriDiagonalBlockMatrix<4> solveAndInverse; solveAndInverse.setMatrix(matrix); x = solveAndInverse.solve(b); inverseMatrix = solveAndInverse.getInverse(); EXPECT_TRUE(x.isApprox(expectedX)); EXPECT_TRUE(inverseMatrix.isApprox(expectedInverse)); }; TEST_F(LinearSolveAndInverseTests, TriDiagonalBlockMatrixBlockSize5Tests) { setupTriDiagonalBlockMatrixTest<5>(); LinearSolveAndInverseTriDiagonalBlockMatrix<5> solveAndInverse; solveAndInverse.setMatrix(matrix); x = solveAndInverse.solve(b); inverseMatrix = solveAndInverse.getInverse(); EXPECT_TRUE(x.isApprox(expectedX)); EXPECT_TRUE(inverseMatrix.isApprox(expectedInverse)); }; TEST_F(LinearSolveAndInverseTests, TriDiagonalBlockMatrixBlockSize6Tests) { setupTriDiagonalBlockMatrixTest<6>(); LinearSolveAndInverseTriDiagonalBlockMatrix<6> solveAndInverse; solveAndInverse.setMatrix(matrix); x = solveAndInverse.solve(b); inverseMatrix = solveAndInverse.getInverse(); EXPECT_TRUE(x.isApprox(expectedX)); EXPECT_TRUE(inverseMatrix.isApprox(expectedInverse)); }; TEST_F(LinearSolveAndInverseTests, SymmetricTriDiagonalBlockMatrixBlockSize2Tests) { setupTriDiagonalBlockMatrixTest<2>(true); LinearSolveAndInverseSymmetricTriDiagonalBlockMatrix<2> solveAndInverse; solveAndInverse.setMatrix(matrix); x = solveAndInverse.solve(b); inverseMatrix = solveAndInverse.getInverse(); EXPECT_TRUE(x.isApprox(expectedX)); EXPECT_TRUE(inverseMatrix.isApprox(expectedInverse)); }; TEST_F(LinearSolveAndInverseTests, SymmetricTriDiagonalBlockMatrixBlockSize3Tests) { setupTriDiagonalBlockMatrixTest<3>(true); LinearSolveAndInverseSymmetricTriDiagonalBlockMatrix<3> solveAndInverse; solveAndInverse.setMatrix(matrix); x = solveAndInverse.solve(b); inverseMatrix = solveAndInverse.getInverse(); EXPECT_TRUE(x.isApprox(expectedX)); EXPECT_TRUE(inverseMatrix.isApprox(expectedInverse)); }; TEST_F(LinearSolveAndInverseTests, SymmetricTriDiagonalBlockMatrixBlockSize4Tests) { setupTriDiagonalBlockMatrixTest<4>(true); LinearSolveAndInverseSymmetricTriDiagonalBlockMatrix<4> solveAndInverse; solveAndInverse.setMatrix(matrix); x = solveAndInverse.solve(b); inverseMatrix = solveAndInverse.getInverse(); EXPECT_TRUE(x.isApprox(expectedX)); EXPECT_TRUE(inverseMatrix.isApprox(expectedInverse)); }; TEST_F(LinearSolveAndInverseTests, SymmetricTriDiagonalBlockMatrixBlockSize5Tests) { setupTriDiagonalBlockMatrixTest<5>(true); LinearSolveAndInverseSymmetricTriDiagonalBlockMatrix<5> solveAndInverse; solveAndInverse.setMatrix(matrix); x = solveAndInverse.solve(b); inverseMatrix = solveAndInverse.getInverse(); EXPECT_TRUE(x.isApprox(expectedX)); EXPECT_TRUE(inverseMatrix.isApprox(expectedInverse)); }; TEST_F(LinearSolveAndInverseTests, SymmetricTriDiagonalBlockMatrixBlockSize6Tests) { setupTriDiagonalBlockMatrixTest<6>(true); LinearSolveAndInverseSymmetricTriDiagonalBlockMatrix<6> solveAndInverse; solveAndInverse.setMatrix(matrix); x = solveAndInverse.solve(b); inverseMatrix = solveAndInverse.getInverse(); EXPECT_TRUE(x.isApprox(expectedX)); EXPECT_TRUE(inverseMatrix.isApprox(expectedInverse)); }; }; // namespace Math }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Math/UnitTests/LinearSparseSolveAndInverseTests.cpp000066400000000000000000000131501277777236100274470ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the LinearSparseSolveAndInverse.cpp functions. #include #include "SurgSim/Math/LinearSparseSolveAndInverse.h" namespace SurgSim { namespace Math { class LinearSparseSolveAndInverseTests : public ::testing::Test { public: void setupSparseMatrixTest() { inverseMatrix.resize(size, size); initializeSparseMatrix(&matrix); } SparseMatrix matrix; Matrix denseMatrix, inverseMatrix, expectedInverse; Vector b; Vector x, expectedX; protected: void SetUp() override { size = 18; initializeVector(&b); initializeDenseMatrix(&denseMatrix); expectedInverse = denseMatrix.inverse(); expectedX = expectedInverse * b; } private: size_t size; void initializeVector(Vector* v) { v->resize(size); for (size_t row = 0; row < size; row++) { (*v)(row) = std::fmod(-4.1 * row * row + 3.46, 5.0); } } void initializeSparseMatrix(SparseMatrix* m) { m->resize(static_cast(size), static_cast(size)); for (SparseMatrix::Index row = 0; row < static_cast(size); row++) { for (SparseMatrix::Index col = 0; col < static_cast(size); col++) { (*m).insert(row, col) = std::fmod((10.3 * std::cos(static_cast(row * col)) + 3.24), 10.0); } } m->makeCompressed(); } void initializeDenseMatrix(Matrix* m) { m->resize(size, size); for (size_t row = 0; row < size; row++) { for (size_t col = 0; col < size; col++) { (*m)(row, col) = std::fmod((10.3 * std::cos(static_cast(row * col)) + 3.24), 10.0); } } } }; TEST_F(LinearSparseSolveAndInverseTests, SparseLUInitializationTests) { SparseMatrix nonSquare(9, 18); SparseMatrix square(18, 18); nonSquare.setZero(); for (SparseMatrix::Index counter = 0; counter < 18; ++counter) { square.insert(counter, counter) = 1.0; } square.makeCompressed(); LinearSparseSolveAndInverseLU solveAndInverse; EXPECT_THROW(solveAndInverse.setMatrix(nonSquare), SurgSim::Framework::AssertionFailure); EXPECT_NO_THROW(solveAndInverse.setMatrix(square)); clearMatrix(&square); EXPECT_THROW(solveAndInverse.setMatrix(square), SurgSim::Framework::AssertionFailure); }; TEST_F(LinearSparseSolveAndInverseTests, SparseLUMatrixComponentsTest) { setupSparseMatrixTest(); LinearSparseSolveAndInverseLU solveAndInverse; solveAndInverse.setMatrix(matrix); x = solveAndInverse.solve(b); inverseMatrix = solveAndInverse.getInverse(); EXPECT_TRUE(x.isApprox(expectedX)); EXPECT_TRUE(inverseMatrix.isApprox(expectedInverse)); inverseMatrix = solveAndInverse.solve(denseMatrix); EXPECT_TRUE(inverseMatrix.isApprox(Matrix::Identity(18, 18))); }; TEST_F(LinearSparseSolveAndInverseTests, SparseCGSetGetTests) { LinearSparseSolveAndInverseCG solveAndInverse; EXPECT_NE(100, solveAndInverse.getMaxIterations()); solveAndInverse.setMaxIterations(100); EXPECT_EQ(100, solveAndInverse.getMaxIterations()); EXPECT_NE(1.0e-03, solveAndInverse.getTolerance()); solveAndInverse.setTolerance(1.0e-03); EXPECT_EQ(1.0e-03, solveAndInverse.getTolerance()); }; TEST_F(LinearSparseSolveAndInverseTests, SparseCGInitializationTests) { SparseMatrix nonSquare(9, 18); SparseMatrix square(18, 18); nonSquare.setZero(); for (SparseMatrix::Index counter = 0; counter < 18; ++counter) { square.insert(counter, counter) = 1.0; } square.makeCompressed(); LinearSparseSolveAndInverseCG solveAndInverse; EXPECT_THROW(solveAndInverse.setMatrix(nonSquare), SurgSim::Framework::AssertionFailure); EXPECT_NO_THROW(solveAndInverse.setMatrix(square)); clearMatrix(&square); EXPECT_NO_THROW(solveAndInverse.setMatrix(square)); }; TEST_F(LinearSparseSolveAndInverseTests, SparseCGMatrixComponentsTest) { setupSparseMatrixTest(); double lowPrecision = 1.0e-05; double highPrecision = 1.0e-10; LinearSparseSolveAndInverseCG solveAndInverse; solveAndInverse.setMatrix(matrix); x = solveAndInverse.solve(b); inverseMatrix = solveAndInverse.getInverse(); EXPECT_TRUE(x.isApprox(expectedX, lowPrecision)) << std::endl << "x: " << x.transpose() << std::endl << "Expected: " << expectedX.transpose() << std::endl; inverseMatrix = solveAndInverse.solve(denseMatrix); EXPECT_TRUE(inverseMatrix.isApprox(Matrix::Identity(18, 18), lowPrecision)) << std::endl << "Identity: " << inverseMatrix << std::endl; solveAndInverse.setTolerance(highPrecision); solveAndInverse.setMaxIterations(18); x = solveAndInverse.solve(b); EXPECT_TRUE(x.isApprox(expectedX, lowPrecision)) << std::endl << "x: " << x.transpose() << std::endl << "Expected: " << expectedX.transpose() << std::endl; EXPECT_FALSE(x.isApprox(expectedX, highPrecision)) << std::endl << "x: " << x.transpose() << std::endl << "Expected: " << expectedX.transpose() << std::endl; solveAndInverse.setMaxIterations(50); x = solveAndInverse.solve(b); EXPECT_TRUE(x.isApprox(expectedX, highPrecision)) << std::endl << "x: " << x.transpose() << std::endl << "Expected: " << expectedX.transpose() << std::endl; }; }; // namespace Math }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Math/UnitTests/MakeRigidTransformTests.cpp000066400000000000000000000101471277777236100256220ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /** @file * Tests that exercise the functionality of methods we define related to rigid transforms. */ #include #include #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Quaternion.h" #include "gtest/gtest.h" template class MakeRigidTransform3Tests : public testing::Test { public: typedef T RigidTransform; }; typedef ::testing::Types RigidTransform3Variants; TYPED_TEST_CASE(MakeRigidTransform3Tests, RigidTransform3Variants); template class MakeAllRigidTransformTests : public testing::Test { public: typedef T RigidTransform; }; typedef ::testing::Types AllRigidTransformVariants; TYPED_TEST_CASE(MakeAllRigidTransformTests, AllRigidTransformVariants); /// Test makeRigidTransform using a rotation matrix and a translation TYPED_TEST(MakeAllRigidTransformTests, MakeRigidTransformWithMatrix) { typedef typename TestFixture::RigidTransform RigidTransform; typedef typename RigidTransform::LinearMatrixType RotationMatrix; typedef typename RigidTransform::TranslationType::VectorType Translation; const int DIM = RigidTransform::Dim; RotationMatrix rotationMatrix = RotationMatrix::Identity(); rotationMatrix.row(0).swap(rotationMatrix.row(DIM-1)); Translation translation(Translation::Random()); RigidTransform transform = SurgSim::Math::makeRigidTransform(rotationMatrix, translation); typename RigidTransform::MatrixType matrix = transform.matrix(); EXPECT_TRUE(rotationMatrix.isApprox(matrix.block(0,0,DIM,DIM), 1e-6f)) << "Rotation part of transform is not properly set"; EXPECT_TRUE(translation.isApprox(matrix.block(0,DIM,DIM,1), 1e-6f)) << "Translation part of transform is not properly set"; EXPECT_NEAR(1.0, matrix(DIM,DIM), 1e-6) << "Transform matrix is not 1.0 in bottom right corner"; EXPECT_TRUE(matrix.block(DIM,0,1,DIM).isApproxToConstant(0.0, 1e-6f)) << "Bottom row of matrix is not all zeros (except for last column)."; } /// Test makeRigidTransform using a quaternion and a translation TYPED_TEST(MakeRigidTransform3Tests, MakeRigidTransformWithQuaternion) { typedef typename TestFixture::RigidTransform RigidTransform; typedef typename RigidTransform::TranslationType::VectorType Translation; typedef typename RigidTransform::Scalar Scalar; typedef typename Eigen::Quaternion Quaternion; typedef typename RigidTransform::LinearMatrixType RotationMatrix; const int DIM = RigidTransform::Dim; Translation translation = Translation::Random(); Quaternion quaternion(0.0, 1.0, 0.0, 0.0); RotationMatrix quaternionRotationMatrix; quaternionRotationMatrix << 1.0, 0.0, 0.0, 0.0,-1.0, 0.0, 0.0, 0.0,-1.0; RigidTransform transform = SurgSim::Math::makeRigidTransform(quaternion, translation); typename RigidTransform::MatrixType matrix = transform.matrix(); EXPECT_TRUE(quaternionRotationMatrix.isApprox(matrix.block(0,0,DIM,DIM), 1e-6f)) << "Rotation part of transform is not properly set"; EXPECT_TRUE(translation.isApprox(matrix.block(0,DIM,DIM,1), 1e-6f)) << "Translation part of transform is not properly set"; EXPECT_NEAR(1.0, matrix(DIM,DIM), 1e-6) << "Transform matrix is not 1.0 in bottom right corner"; EXPECT_TRUE(matrix.block(DIM,0,1,DIM).isApproxToConstant(0.0, 1e-6f)) << "Bottom row of matrix is not all zeros (except for last column)."; } opensurgsim-0.7.0/SurgSim/Math/UnitTests/MatrixTests.cpp000066400000000000000000001154221277777236100233400ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests that exercise the functionality of our matrix typedefs, which come /// straight from Eigen. #include #include // SurgSim/Math/Matrix.h by itself does not provide cross() #include #include "SurgSim/Math/MathConvert.h" #include "SurgSim/Math/Matrix.h" // Define test fixture class templates. // We don't really need fixtures as such, but the templatization encodes type. template class MatrixTestBase : public testing::Test { public: typedef T Scalar; }; template class Matrix22Tests : public MatrixTestBase { public: typedef T Matrix22; }; // This used to contain aligned (via Eigen::AutoAlign) matrix type aliases, but we got rid of those. typedef ::testing::Types Matrix22Variants; TYPED_TEST_CASE(Matrix22Tests, Matrix22Variants); template class Matrix33Tests : public MatrixTestBase { public: typedef T Matrix33; }; // This used to contain aligned (via Eigen::AutoAlign) matrix type aliases, but we got rid of those. typedef ::testing::Types Matrix33Variants; TYPED_TEST_CASE(Matrix33Tests, Matrix33Variants); template class Matrix44Tests : public MatrixTestBase { public: typedef T Matrix44; }; // This used to contain aligned (via Eigen::AutoAlign) matrix type aliases, but we got rid of those. typedef ::testing::Types Matrix44Variants; TYPED_TEST_CASE(Matrix44Tests, Matrix44Variants); template class AllMatrixTests : public MatrixTestBase { public: typedef T Matrix; }; template class AllDynamicMatrixTests : public MatrixTestBase { public: typedef T Matrix; }; // This used to contain aligned (via Eigen::AutoAlign) matrix type aliases, but we got rid of those. typedef ::testing::Types AllMatrixVariants; TYPED_TEST_CASE(AllMatrixTests, AllMatrixVariants); typedef ::testing::Types AllDynamicMatrixVariants; TYPED_TEST_CASE(AllDynamicMatrixTests, AllDynamicMatrixVariants); template class UnalignedMatrixTests : public MatrixTestBase { public: typedef T Matrix; }; template class UnalignedDynamicMatrixTests : public MatrixTestBase { public: typedef T Matrix; }; typedef ::testing::Types UnalignedMatrixVariants; TYPED_TEST_CASE(UnalignedMatrixTests, UnalignedMatrixVariants); typedef ::testing::Types UnalignedDynamicMatrixVariants; TYPED_TEST_CASE(UnalignedDynamicMatrixTests, UnalignedDynamicMatrixVariants); // Now we're ready to start testing... // ==================== CONSTRUCTION & INITIALIZATION ==================== /// Test that matrices can be constructed. TYPED_TEST(Matrix22Tests, CanConstruct) { typedef typename TestFixture::Matrix22 Matrix22; // Warning: Eigen *does not* provide a 1-argument constructor that // initializes all elements to the same value! If you do something like // SurgSim::Math::Matrix22fu oneArg2fu(1.23f); // the argument is converted to an integral type, interpreted as a size, // and promptly ignored because the size is fixed. Oops. // To generate a constant matrix, use Matrix22f::Constant(val). Matrix22 default2; } /// Test that matrices can be constructed. TYPED_TEST(Matrix33Tests, CanConstruct) { typedef typename TestFixture::Matrix33 Matrix33; // Warning: Eigen *does not* provide a 1-argument constructor that // initializes all elements to the same value! If you do something like // SurgSim::Math::Matrix22fu oneArg2fu(1.23f); // the argument is converted to an integral type, interpreted as a size, // and promptly ignored because the size is fixed. Oops. // To generate a constant matrix, use Matrix22f::Constant(val). Matrix33 default3; } /// Test that matrices can be constructed. TYPED_TEST(Matrix44Tests, CanConstruct) { typedef typename TestFixture::Matrix44 Matrix44; // Warning: Eigen *does not* provide a 1-argument constructor that // initializes all elements to the same value! If you do something like // SurgSim::Math::Matrix22fu oneArg2fu(1.23f); // the argument is converted to an integral type, interpreted as a size, // and promptly ignored because the size is fixed. Oops. // To generate a constant matrix, use Matrix22f::Constant(val). Matrix44 default4; } /// Test that the default constructor DOESN'T initialize matrices. // // Only test the non-vectorized versions. Otherwise, we'd need to // allocate memory in a way that guarantees Eigen-compatible alignment. // // TODO(bert): There is some Eigen flag that causes matrices and matrices to be // initialized after all! We should check for that here. TYPED_TEST(UnalignedMatrixTests, DefaultConstructorInitialization) { typedef typename TestFixture::Matrix Matrix; const int SIZE = Matrix::RowsAtCompileTime; EXPECT_TRUE(SIZE >= 2 && SIZE <= 4); EXPECT_EQ(SIZE, Matrix::ColsAtCompileTime); // Allocate a buffer for the matrix type on stack, based on the size // of the object we're testing. The object will be allocated inside // the buffer using the placement syntax for the new() operator. // Eigen's new operatore will attempt to align returned value on word sized // boundaries, so add 64 bytes to guarantee enough size. unsigned char buffer[sizeof(Matrix) + 64]; { // Please don't write production (non-test) code that looks like this. =) memset(&buffer, 0xF0, sizeof(buffer)); Matrix* matrix = new(&buffer) Matrix; for (int row = 0; row < SIZE; ++row) { for (int col = 0; col < SIZE; ++col) { EXPECT_NE(0.0f, (*matrix)(row, col)) << row << "," << col << " was NOT supposed to be zeroed."; } } // Destroying the object is a good idea, even if unnecessary here: matrix->Matrix::~Matrix(); } } /// Test setting the matrix using the << syntax. TYPED_TEST(Matrix22Tests, ShiftCommaInitialization) { typedef typename TestFixture::Matrix22 Matrix22; Matrix22 matrix; // Initialize elements in order. Do NOT put parentheses around the list! matrix << 1.1f, 1.2f, 1.3f, 1.4f; for (int row = 0; row < 2; ++row) { for (int col = 0; col < 2; ++col) { EXPECT_NEAR(1.1 + 0.2*row + 0.1*col, matrix(row, col), 1e-6) << row << "," << col << " wasn't properly initialized."; } } } /// Test setting the matrix using the << syntax. TYPED_TEST(Matrix33Tests, ShiftCommaInitialization) { typedef typename TestFixture::Matrix33 Matrix33; Matrix33 matrix; // Initialize elements in order. Do NOT put parentheses around the list! matrix << 1.1f, 1.2f, 1.3f, 1.4f, 1.5f, 1.6f, 1.7f, 1.8f, 1.9f; for (int row = 0; row < 3; ++row) { for (int col = 0; col < 3; ++col) { EXPECT_NEAR(1.1 + 0.3*row + 0.1*col, matrix(row, col), 1e-6) << row << "," << col << " wasn't properly initialized."; } } } /// Test setting the matrix using the << syntax. TYPED_TEST(Matrix44Tests, ShiftCommaInitialization) { typedef typename TestFixture::Matrix44 Matrix44; Matrix44 matrix; // Initialize elements in order. Do NOT put parentheses around the list! matrix << 1.1f, 1.2f, 1.3f, 1.4f, 1.5f, 1.6f, 1.7f, 1.8f, 1.9f, 2.0f, 2.1f, 2.2f, 2.3f, 2.4f, 2.5f, 2.6f; for (int row = 0; row < 4; ++row) { for (int col = 0; col < 4; ++col) { EXPECT_NEAR(1.1 + 0.4*row + 0.1*col, matrix(row, col), 1e-6) << row << "," << col << " wasn't properly initialized."; } } } /// Test getting a zero value usable in expressions. TYPED_TEST(AllMatrixTests, ZeroValue) { typedef typename TestFixture::Matrix Matrix; const int SIZE = Matrix::RowsAtCompileTime; Matrix matrix = 1000 * Matrix::Zero(); for (int row = 0; row < SIZE; ++row) { for (int col = 0; col < SIZE; ++col) { EXPECT_NEAR(0.0, matrix(row, col), 1e-20) << row << "," << col << " wasn't properly initialized."; } } } /// Test setting matrices to 0. TYPED_TEST(AllMatrixTests, SetToZero) { typedef typename TestFixture::Matrix Matrix; const int SIZE = Matrix::RowsAtCompileTime; Matrix matrix; matrix.setZero(); for (int row = 0; row < SIZE; ++row) { for (int col = 0; col < SIZE; ++col) { EXPECT_NEAR(0.0, matrix(row, col), 1e-20) << row << "," << col << " wasn't properly cleared."; } } } /// Test getting a constant value usable in expressions. TYPED_TEST(AllMatrixTests, ConstantValue) { typedef typename TestFixture::Matrix Matrix; const int SIZE = Matrix::RowsAtCompileTime; Matrix matrix = 2 * Matrix::Constant(0.5f); for (int row = 0; row < SIZE; ++row) { for (int col = 0; col < SIZE; ++col) { EXPECT_NEAR(1.0, matrix(row, col), 1e-6) << row << "," << col << " wasn't properly initialized."; } } } /// Test setting matrices to a constant. TYPED_TEST(AllMatrixTests, SetToConstant) { typedef typename TestFixture::Matrix Matrix; const int SIZE = Matrix::RowsAtCompileTime; Matrix matrix; matrix.setConstant(7.2f); for (int row = 0; row < SIZE; ++row) { for (int col = 0; col < SIZE; ++col) { EXPECT_NEAR(7.2, matrix(row, col), 1e-6) << row << "," << col << " wasn't properly initialized."; } } } /// Test initializing a row-major Eigen matrix from a float array. TYPED_TEST(AllMatrixTests, InitializeRowMajorFromArray) { typedef typename TestFixture::Matrix Matrix; typedef typename TestFixture::Scalar T; const int SIZE = Matrix::RowsAtCompileTime; typedef Eigen::Matrix RMatrix; // This array has more elements than we will need. // The element type must match the matrix! const T inputArray[18] = { 0.01f, 1.02f, 2.03f, 3.04f, 4.05f, 5.06f, 6.07f, 7.08f, 8.09f, 9.10f, 10.11f, 11.12f, 12.13f, 13.14f, 14.15f, 15.16f, 16.17f, 17.18f }; RMatrix matrix(inputArray); for (int row = 0; row < SIZE; ++row) { for (int col = 0; col < SIZE; ++col) { EXPECT_NEAR(0.01 + (row*SIZE + col) * 1.01, matrix(row, col), 1e-6) << row << "," << col << " wasn't properly initialized."; } } } /// Test initializing a column-major Eigen matrix from a float array. TYPED_TEST(AllMatrixTests, InitializeColumnMajorFromArray) { typedef typename TestFixture::Matrix Matrix; typedef typename TestFixture::Scalar T; const int SIZE = Matrix::RowsAtCompileTime; typedef Eigen::Matrix CMatrix; // This array has more elements than we will need. // The element type must match the matrix! const T inputArray[18] = { 0.01f, 1.02f, 2.03f, 3.04f, 4.05f, 5.06f, 6.07f, 7.08f, 8.09f, 9.10f, 10.11f, 11.12f, 12.13f, 13.14f, 14.15f, 15.16f, 16.17f, 17.18f }; CMatrix matrix(inputArray); for (int row = 0; row < SIZE; ++row) { for (int col = 0; col < SIZE; ++col) { EXPECT_NEAR(0.01 + (col*SIZE + row) * 1.01, matrix(row, col), 1e-6) << row << "," << col << " wasn't properly initialized."; } } } /// Test initializing from a float array. /// Among other things, tests that our matrices are row-major. TYPED_TEST(AllMatrixTests, InitializeFromArray) { typedef typename TestFixture::Matrix Matrix; typedef typename TestFixture::Scalar T; const int SIZE = Matrix::RowsAtCompileTime; // This array has more elements than we will need. // The element type must match the matrix! const T inputArray[18] = { 0.01f, 1.02f, 2.03f, 3.04f, 4.05f, 5.06f, 6.07f, 7.08f, 8.09f, 9.10f, 10.11f, 11.12f, 12.13f, 13.14f, 14.15f, 15.16f, 16.17f, 17.18f }; Matrix matrix(inputArray); for (int row = 0; row < SIZE; ++row) { for (int col = 0; col < SIZE; ++col) { EXPECT_NEAR(0.01 + (row*SIZE + col) * 1.01, matrix(row, col), 1e-6) << row << "," << col << " wasn't properly initialized."; } } } // Test conversion to and from yaml node TYPED_TEST(AllMatrixTests, YamlConvert) { typedef typename TestFixture::Matrix Matrix; typedef typename TestFixture::Scalar T; // This array has more elements than we will need. // The element type must match the matrix! const T inputArray[18] = { 0.01f, 1.02f, 2.03f, 3.04f, 4.05f, 5.06f, 6.07f, 7.08f, 8.09f, 9.10f, 10.11f, 11.12f, 12.13f, 13.14f, 14.15f, 15.16f, 16.17f, 17.18f }; Matrix matrix(inputArray); YAML::Node node; ASSERT_NO_THROW(node = matrix); EXPECT_TRUE(node.IsSequence()); EXPECT_EQ(matrix.rows(), node.size()); ASSERT_NO_THROW({Matrix expected = node.as();}); EXPECT_TRUE(matrix.isApprox(node.as())); } /// Test assignment. TYPED_TEST(AllMatrixTests, Assign) { typedef typename TestFixture::Matrix Matrix; const int SIZE = Matrix::RowsAtCompileTime; Matrix a = Matrix::Constant(6.0f); EXPECT_NEAR(6.0f * SIZE * SIZE, a.sum(), 1e-6); const Matrix b = Matrix::Constant(7.0f); EXPECT_NEAR(7.0f * SIZE * SIZE, b.sum(), 1e-6); a = b; EXPECT_NEAR(7.0f * SIZE * SIZE, a.sum(), 1e-6); } // ==================== ACCESS ==================== /// Access by rows and columns. TYPED_TEST(AllMatrixTests, RowsAndColumns) { typedef typename TestFixture::Matrix Matrix; typedef typename TestFixture::Scalar T; const int SIZE = Matrix::RowsAtCompileTime; typedef Eigen::Matrix Vector; Matrix a = Matrix::Zero(); for (int i = 0; i < SIZE; ++i) { Vector rowVector = Vector::Constant(i + 1.f); a.row(i) = rowVector; } for (int i = 0; i < SIZE; ++i) { Vector rowVector = a.row(i); EXPECT_NEAR((i + 1.f) * SIZE, rowVector.sum(), 1e-6); Vector columnVector = a.col(i); EXPECT_NEAR(SIZE * (SIZE+1) / 2., columnVector.sum(), 1e-6); } for (int i = 0; i < SIZE; ++i) { Vector columnVector = Vector::Constant(i + 1.f); a.col(i) = columnVector; } for (int i = 0; i < SIZE; ++i) { Vector columnVector = a.col(i); EXPECT_NEAR((i + 1.f) * SIZE, columnVector.sum(), 1e-6); Vector rowVector = a.row(i); EXPECT_NEAR(SIZE * (SIZE+1) / 2., rowVector.sum(), 1e-6); } } /// Access to the diagonal. TYPED_TEST(AllMatrixTests, Diagonal) { typedef typename TestFixture::Matrix Matrix; typedef typename TestFixture::Scalar T; const int SIZE = Matrix::RowsAtCompileTime; typedef Eigen::Matrix Vector; Matrix a = Matrix::Zero(); { Vector diagonalVector = Vector::Constant(2.f); a.diagonal() = diagonalVector; } EXPECT_NEAR(2.f * SIZE, a.sum(), 1e-6); Matrix b = Matrix::Identity(); { EXPECT_NEAR(1.f * SIZE, b.diagonal().sum(), 1e-6); } } // ==================== REPRESENTATION CONVERSIONS ==================== /// Test setting quaternions from an angle/axis rotation. TYPED_TEST(Matrix33Tests, FromAngleAxis) { typedef typename TestFixture::Matrix33 Matrix33; typedef typename TestFixture::Scalar T; typedef Eigen::Matrix Vector3; T angle = 0.1f; Vector3 axis = Vector3::UnitZ(); Matrix33 expectedMatrix; T sinAngle = std::sin(angle); T cosAngle = std::cos(angle); expectedMatrix << cosAngle, -sinAngle, 0, sinAngle, cosAngle, 0, 0, 0, 1; using SurgSim::Math::makeRotationMatrix; Matrix33 matrix = makeRotationMatrix(angle, axis); EXPECT_NEAR(0, (matrix - expectedMatrix).norm(), 9e-6) << "The rotation matrix wasn't properly computed."; } /// Test extracting an angle/axis rotation from a quaternion. TYPED_TEST(Matrix33Tests, ToAngleAxis) { typedef typename TestFixture::Matrix33 Matrix33; typedef typename TestFixture::Scalar T; typedef Eigen::Matrix Vector3; T angle = -0.1f; Vector3 axis = Vector3::UnitZ(); Matrix33 matrix; T sinAngle = std::sin(angle); T cosAngle = std::cos(angle); matrix << cosAngle, -sinAngle, 0, sinAngle, cosAngle, 0, 0, 0, 1; using SurgSim::Math::computeAngleAndAxis; using SurgSim::Math::computeAngle; T angle2; Vector3 axis2; computeAngleAndAxis(matrix, &angle2, &axis2); EXPECT_NEAR(-angle, angle2, 1e-6) << "angle wasn't properly computed."; EXPECT_NEAR(-axis.x(), axis2.x(), 1e-6) << "X wasn't properly computed."; EXPECT_NEAR(-axis.y(), axis2.y(), 1e-6) << "Y wasn't properly computed."; EXPECT_NEAR(-axis.z(), axis2.z(), 1e-6) << "Y wasn't properly computed."; EXPECT_NEAR(-angle, computeAngle(matrix), 1e-6) << "angle wasn't properly computed by computeAngle()."; } /// Test building a skew symmetric matrix from a vector TYPED_TEST(Matrix33Tests, MakeSkewSymmetricMatrixTest) { typedef typename TestFixture::Matrix33 Matrix33; typedef typename TestFixture::Scalar T; typedef Eigen::Matrix Vector3; Vector3 v(static_cast(0.3), static_cast(-1.4), static_cast(8.3)); Matrix33 matrix = SurgSim::Math::makeSkewSymmetricMatrix(v); EXPECT_TRUE(matrix.diagonal().isZero()); EXPECT_NEAR(static_cast(0.3) , matrix(2, 1), std::numeric_limits::epsilon()); EXPECT_NEAR(static_cast(-0.3), matrix(1, 2), std::numeric_limits::epsilon()); EXPECT_NEAR(static_cast(-1.4), matrix(0, 2), std::numeric_limits::epsilon()); EXPECT_NEAR(static_cast(1.4) , matrix(2, 0), std::numeric_limits::epsilon()); EXPECT_NEAR(static_cast(8.3) , matrix(1, 0), std::numeric_limits::epsilon()); EXPECT_NEAR(static_cast(-8.3), matrix(0, 1), std::numeric_limits::epsilon()); } /// Test extracting a vector from a skew symmetric part of a matrix TYPED_TEST(Matrix33Tests, SkewTest) { typedef typename TestFixture::Scalar T; typedef Eigen::Matrix Vector3; Vector3 vExpected(static_cast(0.3), static_cast(-1.4), static_cast(8.3)); Vector3 v = SurgSim::Math::skew(SurgSim::Math::makeSkewSymmetricMatrix(vExpected)); EXPECT_TRUE(v.isApprox(vExpected)); } // ==================== ARITHMETIC ==================== /// Negation (unary minus). TYPED_TEST(AllMatrixTests, Negate) { typedef typename TestFixture::Matrix Matrix; const int SIZE = Matrix::RowsAtCompileTime; Matrix a = Matrix::Constant(0.1f); EXPECT_NEAR(0.1 * SIZE * SIZE, a.sum(), 1e-6); Matrix b = -a; EXPECT_NEAR(-0.1 * SIZE * SIZE, b.sum(), 1e-6); } /// Addition. TYPED_TEST(AllMatrixTests, Add) { typedef typename TestFixture::Matrix Matrix; const int SIZE = Matrix::RowsAtCompileTime; Matrix a = Matrix::Constant(0.1f); EXPECT_NEAR(0.1 * SIZE * SIZE, a.sum(), 1e-6); Matrix b = a + Matrix::Ones() + a; EXPECT_NEAR(1.2 * SIZE * SIZE, b.sum(), 1e-6); } /// Subtraction. TYPED_TEST(AllMatrixTests, Subtract) { typedef typename TestFixture::Matrix Matrix; const int SIZE = Matrix::RowsAtCompileTime; Matrix a = Matrix::Constant(0.1f); EXPECT_NEAR(0.1 * SIZE * SIZE, a.sum(), 1e-6); Matrix b = Matrix::Ones() - a; EXPECT_NEAR(0.9 * SIZE * SIZE, b.sum(), 1e-6); } /// Incrementing by a value. TYPED_TEST(AllMatrixTests, AddTo) { typedef typename TestFixture::Matrix Matrix; const int SIZE = Matrix::RowsAtCompileTime; Matrix a = Matrix::Constant(0.1f); EXPECT_NEAR(0.1 * SIZE * SIZE, a.sum(), 1e-6); a += Matrix::Ones(); EXPECT_NEAR(1.1 * SIZE * SIZE, a.sum(), 1e-6); } /// Decrementing by a value. TYPED_TEST(AllMatrixTests, SubtractFrom) { typedef typename TestFixture::Matrix Matrix; const int SIZE = Matrix::RowsAtCompileTime; Matrix a = Matrix::Constant(1.1f); EXPECT_NEAR(1.1 * SIZE * SIZE, a.sum(), 1e-6); a -= Matrix::Ones(); EXPECT_NEAR(0.1 * SIZE * SIZE, a.sum(), 1e-6); } /// Matrix-scalar multiplication. TYPED_TEST(AllMatrixTests, MultiplyMatrixScalar) { typedef typename TestFixture::Matrix Matrix; Matrix a = Matrix::Random(); Matrix b = a * 1.23f; EXPECT_NEAR(1.23 * a.sum(), b.sum(), 1e-6); } /// Scalar-matrix multiplication. TYPED_TEST(AllMatrixTests, MultiplyScalarMatrix) { typedef typename TestFixture::Matrix Matrix; Matrix a = Matrix::Random(); Matrix b = 1.23f * a; EXPECT_NEAR(1.23 * a.sum(), b.sum(), 1e-6); } /// Division by scalar. TYPED_TEST(AllMatrixTests, DivideScalar) { typedef typename TestFixture::Matrix Matrix; Matrix a = Matrix::Random(); Matrix b = a / 1.23f; EXPECT_NEAR(a.sum() / 1.23, b.sum(), 1e-6); } /// Matrix-vector multiplication. TYPED_TEST(AllMatrixTests, MultiplyMatrixVector) { typedef typename TestFixture::Matrix Matrix; typedef typename TestFixture::Scalar T; const int SIZE = Matrix::RowsAtCompileTime; typedef Eigen::Matrix Vector; Matrix a = Matrix::Random(); Vector v = Vector::Zero(); v[0] = 1.f; Vector w = a * v; EXPECT_NEAR(a.col(0).sum(), w.sum(), 1e-6); } /// Matrix-matrix multiplication. TYPED_TEST(AllMatrixTests, MultiplyMatrixMatrix) { typedef typename TestFixture::Matrix Matrix; const int SIZE = Matrix::RowsAtCompileTime; Matrix a = Matrix::Random(); Matrix I = Matrix::Identity(); Matrix b = I * a * I; EXPECT_NEAR(0, (b - a).norm(), SIZE * SIZE * 1e-6); } /// Matrix inverse. TYPED_TEST(AllMatrixTests, Inverse) { typedef typename TestFixture::Matrix Matrix; const int SIZE = Matrix::RowsAtCompileTime; Matrix a = 2.0f * Matrix::Identity() + 0.5f * Matrix::Random(); // try to make an invertible matrix Matrix b = a.inverse(); Matrix ab = a * b; EXPECT_NEAR(0, (ab - Matrix::Identity()).norm(), SIZE * SIZE * 1e-6); Matrix ba = b * a; EXPECT_NEAR(0, (ba - Matrix::Identity()).norm(), SIZE * SIZE * 1e-6); } /// Matrix transpose. TYPED_TEST(AllMatrixTests, Transpose) { typedef typename TestFixture::Matrix Matrix; const int SIZE = Matrix::RowsAtCompileTime; Matrix a; for (int row = 0; row < SIZE; ++row) { for (int col = 0; col < SIZE; ++col) { a(row, col) = 2.f * row - 3.f * col; } } // Note: DO NOT do things like "a = a.transpose()"; aliasing will result in an error. // You can use transposeInPlace(), or "a = a.transpose().eval()". Matrix b = a.transpose(); for (int row = 0; row < SIZE; ++row) { for (int col = 0; col < SIZE; ++col) { EXPECT_NEAR(2.f * col - 3.f * row, b(row, col), 1e-6); } } } /// Component-wise multiplication. TYPED_TEST(AllMatrixTests, ComponentwiseMultiply) { typedef typename TestFixture::Matrix Matrix; Matrix a = Matrix::Random(); Matrix b = Matrix::Identity(); Matrix c = a.cwiseProduct(b); EXPECT_NEAR(0, c.sum() - c.diagonal().sum(), 1e-6); EXPECT_NEAR(0, (a - c).diagonal().sum(), 1e-6); } /// Component-wise division. TYPED_TEST(AllMatrixTests, ComponentwiseDivide) { typedef typename TestFixture::Matrix Matrix; Matrix a = Matrix::Random(); Matrix b = Matrix::Constant(0.5f); Matrix c = a.cwiseQuotient(b); EXPECT_NEAR(a.sum() * 2, c.sum(), 1e-6); } /// Frobenius norm and its square. TYPED_TEST(AllMatrixTests, FrobeniusNorm) { typedef typename TestFixture::Matrix Matrix; typedef typename TestFixture::Scalar T; const int SIZE = Matrix::RowsAtCompileTime; Matrix m; T sumSquares = 0; for (int row = 0; row < SIZE; ++row) { for (int col = 0; col < SIZE; ++col) { T value = row + col + 11.0f; m(row, col) = value; sumSquares += value * value; } } EXPECT_NEAR(sumSquares, m.squaredNorm(), 1e-4); EXPECT_NEAR(sqrt(sumSquares), m.norm(), 1e-4); } /// L1 (Manhattan) norm and L_Infinity (largest absolute value) norm. TYPED_TEST(AllMatrixTests, L1NormAndLInfNorm) { typedef typename TestFixture::Matrix Matrix; typedef typename TestFixture::Scalar T; const int SIZE = Matrix::RowsAtCompileTime; Matrix m; T sumAbsolute = 0; for (int row = 0; row < SIZE; ++row) { for (int col = 0; col < SIZE; ++col) { T value = row + col - (SIZE + 0.6f); m(row, col) = value; // NOTE: DON'T use plain abs(), it may truncate to int! sumAbsolute += std::abs(value); } } // the function is set up so that the (0,0) corner will always have the biggest absolute value T maxAbsolute = (SIZE + 0.6f); Matrix n = -m; // Ugh, "template" is required to get this to parse properly. This is // triggered because the test is a part of a template class; you don't // need to do this in a non-template context. EXPECT_NEAR(sumAbsolute, m.template lpNorm<1>(), 1e-4) << "m=" << m; EXPECT_NEAR(sumAbsolute, n.template lpNorm<1>(), 1e-4) << "n=" << n; EXPECT_NEAR(maxAbsolute, m.template lpNorm(), 1e-4) << "m=" << m; EXPECT_NEAR(maxAbsolute, n.template lpNorm(), 1e-4) << "n=" << m; } /// Minimum and maximum elements. TYPED_TEST(AllMatrixTests, MinAndMax) { typedef typename TestFixture::Matrix Matrix; typedef typename TestFixture::Scalar T; const int SIZE = Matrix::RowsAtCompileTime; const T inputArray[18] = { 0.01f, 1.02f, 2.03f, 3.04f, 4.05f, 5.06f, 6.07f, 7.08f, 8.09f, 9.10f, 10.11f, 11.12f, 12.13f, 13.14f, 14.15f, 15.16f, 16.17f, 17.18f }; Matrix m(inputArray); EXPECT_NEAR(inputArray[0], m.minCoeff(), 1e-6); EXPECT_NEAR(inputArray[SIZE*SIZE-1], m.maxCoeff(), 1e-6); } /// Trace. TYPED_TEST(AllMatrixTests, Trace) { typedef typename TestFixture::Matrix Matrix; typedef typename TestFixture::Scalar T; Matrix a = Matrix::Random(); T expectedTrace = a.diagonal().sum(); EXPECT_NEAR(expectedTrace, a.trace(), 1e-6); } /// Determinant. TYPED_TEST(AllMatrixTests, Determinant) { typedef typename TestFixture::Matrix Matrix; const int SIZE = Matrix::RowsAtCompileTime; Matrix m = exp(1.f) * Matrix::Identity(); EXPECT_NEAR(exp(1.*SIZE), m.determinant(), 1e-4); } /// Determinant (explicit 2x2 result). TYPED_TEST(Matrix22Tests, Determinant22) { typedef typename TestFixture::Matrix22 Matrix22; typedef typename TestFixture::Scalar T; Matrix22 m = Matrix22::Random(); T expectedDeterminant = m(0, 0) * m(1, 1) - m(0, 1) * m(1, 0); EXPECT_NEAR(expectedDeterminant, m.determinant(), 1e-6); } /// Determinant (explicit 3x3 result). TYPED_TEST(Matrix33Tests, Determinant33) { typedef typename TestFixture::Matrix33 Matrix33; typedef typename TestFixture::Scalar T; Matrix33 m = Matrix33::Random(); T expectedDeterminant = m.row(0).cross(m.row(1)).dot(m.row(2)); EXPECT_NEAR(expectedDeterminant, m.determinant(), 1e-6); } // ==================== SUBMATRICES (EXTENDING/SHRINKING) ==================== /// Extending matrices using the block() syntax. TYPED_TEST(Matrix22Tests, Extend2to3) { typedef typename TestFixture::Matrix22 Matrix22; typedef typename TestFixture::Scalar T; typedef Eigen::Matrix Matrix33; Matrix22 matrix2; matrix2 << 1.1f, 1.2f, 1.3f, 1.4f; Matrix33 matrix3 = Matrix33::Identity(); // Ugh, this is efficient but "template" is required to get it to parse // properly. This is triggered because the test is a part of a template // class; you don't need to do this in a non-template context. matrix3.template block<2, 2>(0, 0) = matrix2; EXPECT_NEAR(6.0, matrix3.sum(), 1e-6) << "extending was incorrect: " << matrix3; } /// Extending matrices using the block(i,j,r,c) syntax. TYPED_TEST(Matrix22Tests, DynamicExtend2to3) { typedef typename TestFixture::Matrix22 Matrix22; typedef typename TestFixture::Scalar T; typedef Eigen::Matrix Matrix33; Matrix22 matrix2; matrix2 << 1.1f, 1.2f, 1.3f, 1.4f; Matrix33 matrix3 = Matrix33::Identity(); matrix3.block(0, 0, 2, 2) = matrix2; EXPECT_NEAR(6.0, matrix3.sum(), 1e-6) << "extending was incorrect: " << matrix3; } /// Shrinking matrices using the block() syntax. TYPED_TEST(Matrix22Tests, Shrink3to2) { typedef typename TestFixture::Matrix22 Matrix22; typedef typename TestFixture::Scalar T; typedef Eigen::Matrix Matrix33; Matrix33 matrix3; matrix3 << 1.1f, 1.2f, 1.3f, 1.4f, 1.5f, 1.6f, 1.7f, 1.8f, 1.9f; Matrix22 matrix2; // Ugh, this is efficient but "template" is required to get it to parse // properly. This is triggered because the test is a part of a template // class; you don't need to do this in a non-template context. matrix2 = matrix3.template block<2, 2>(0, 0); EXPECT_NEAR(5.2, matrix2.sum(), 1e-6) << "shrinking was incorrect: " << matrix2; } /// Extending matrices using the block() syntax. TYPED_TEST(Matrix33Tests, Extend2to3) { typedef typename TestFixture::Matrix33 Matrix33; typedef typename TestFixture::Scalar T; typedef Eigen::Matrix Matrix22; Matrix22 matrix2; matrix2 << 1.1f, 1.2f, 1.3f, 1.4f; Matrix33 matrix3 = Matrix33::Identity(); // Ugh, this is efficient but "template" is required to get it to parse // properly. This is triggered because the test is a part of a template // class; you don't need to do this in a non-template context. matrix3.template block<2, 2>(0, 0) = matrix2; EXPECT_NEAR(6.0, matrix3.sum(), 1e-6) << "extending was incorrect: " << matrix3; } /// Shrinking matrices using the block() syntax. TYPED_TEST(Matrix33Tests, Shrink3to2) { typedef typename TestFixture::Matrix33 Matrix33; typedef typename TestFixture::Scalar T; typedef Eigen::Matrix Matrix22; Matrix33 matrix3; matrix3 << 1.1f, 1.2f, 1.3f, 1.4f, 1.5f, 1.6f, 1.7f, 1.8f, 1.9f; Matrix22 matrix2; // Ugh, this is efficient but "template" is required to get it to parse // properly. This is triggered because the test is a part of a template // class; you don't need to do this in a non-template context. matrix2 = matrix3.template block<2, 2>(0, 0); EXPECT_NEAR(5.2, matrix2.sum(), 1e-6) << "shrinking was incorrect: " << matrix2; } /// Extending matrices using the block() syntax. TYPED_TEST(Matrix33Tests, Extend3to4) { typedef typename TestFixture::Matrix33 Matrix33; typedef typename TestFixture::Scalar T; typedef Eigen::Matrix Matrix44; Matrix33 matrix3; matrix3 << 1.1f, 1.2f, 1.3f, 1.4f, 1.5f, 1.6f, 1.7f, 1.8f, 1.9f; Matrix44 matrix4 = Matrix44::Identity(); // Ugh, this is efficient but "template" is required to get it to parse // properly. This is triggered because the test is a part of a template // class; you don't need to do this in a non-template context. matrix4.template block<3, 3>(0, 0) = matrix3; EXPECT_NEAR(14.5, matrix4.sum(), 1e-6) << "extending was incorrect: " << matrix4; } /// Shrinking matrices using the block() syntax. TYPED_TEST(Matrix33Tests, Shrink4to3) { typedef typename TestFixture::Matrix33 Matrix33; typedef typename TestFixture::Scalar T; typedef Eigen::Matrix Matrix44; Matrix44 matrix4; matrix4 << 1.1f, 1.2f, 1.3f, 1.4f, 1.5f, 1.6f, 1.7f, 1.8f, 1.9f, 2.0f, 2.1f, 2.2f, 2.3f, 2.4f, 2.5f, 2.6f; Matrix33 matrix3; // Ugh, this is efficient but "template" is required to get it to parse // properly. This is triggered because the test is a part of a template // class; you don't need to do this in a non-template context. matrix3 = matrix4.template block<3, 3>(0, 0); EXPECT_NEAR(14.4, matrix3.sum(), 1e-6) << "shrinking was incorrect: " << matrix3; } /// Extending matrices using the block() syntax. TYPED_TEST(Matrix44Tests, Extend3to4) { typedef typename TestFixture::Matrix44 Matrix44; typedef typename TestFixture::Scalar T; typedef Eigen::Matrix Matrix33; Matrix33 matrix3; matrix3 << 1.1f, 1.2f, 1.3f, 1.4f, 1.5f, 1.6f, 1.7f, 1.8f, 1.9f; Matrix44 matrix4 = Matrix44::Identity(); // Ugh, this is efficient but "template" is required to get it to parse // properly. This is triggered because the test is a part of a template // class; you don't need to do this in a non-template context. matrix4.template block<3, 3>(0, 0) = matrix3; EXPECT_NEAR(14.5, matrix4.sum(), 1e-6) << "extending was incorrect: " << matrix4; } /// Shrinking matrices using the block() syntax. TYPED_TEST(Matrix44Tests, Shrink4to3) { typedef typename TestFixture::Matrix44 Matrix44; typedef typename TestFixture::Scalar T; typedef Eigen::Matrix Matrix33; Matrix44 matrix4; matrix4 << 1.1f, 1.2f, 1.3f, 1.4f, 1.5f, 1.6f, 1.7f, 1.8f, 1.9f, 2.0f, 2.1f, 2.2f, 2.3f, 2.4f, 2.5f, 2.6f; Matrix33 matrix3; // Ugh, this is efficient but "template" is required to get it to parse // properly. This is triggered because the test is a part of a template // class; you don't need to do this in a non-template context. matrix3 = matrix4.template block<3, 3>(0, 0); EXPECT_NEAR(14.4, matrix3.sum(), 1e-6) << "shrinking was incorrect: " << matrix3; } // ==================== TYPE CONVERSION ==================== /// Typecasting matrices (double <-> float conversions). TYPED_TEST(AllMatrixTests, TypeCasting) { typedef typename TestFixture::Matrix Matrix; typedef typename TestFixture::Scalar T; const int SIZE = Matrix::RowsAtCompileTime; typedef Eigen::Matrix Matrixd; typedef Eigen::Matrix Matrixf; Matrix a = Matrix::Random(); T expectedSum = a.sum(); // Ugh, "template" is required to get this to parse properly. This is // triggered because the test is a part of a template class; you don't // need to do this in a non-template context. Matrixd d = a.template cast(); EXPECT_NEAR(expectedSum, d.sum(), 1e-6); Matrixf f = a.template cast(); EXPECT_NEAR(expectedSum, f.sum(), 1e-6); } // ==================== MISCELLANEOUS ==================== /// Reading from and writing to arrays or blocks of double/float in memory. TYPED_TEST(AllMatrixTests, ArrayReadWrite) { typedef typename TestFixture::Matrix Matrix; typedef typename TestFixture::Scalar T; const int NUM_ELEMENTS = Matrix::SizeAtCompileTime; const T inputArray[18] = { 0.01f, 1.02f, 2.03f, 3.04f, 4.05f, 5.06f, 6.07f, 7.08f, 8.09f, 9.10f, 10.11f, 11.12f, 12.13f, 13.14f, 14.15f, 15.16f, 16.17f, 17.18f }; T outputArray[18]; Eigen::Map inputMatrix(inputArray); Matrix a = inputMatrix; Eigen::Map outputMatrix(outputArray); outputMatrix = a; for (int i = 0; i < NUM_ELEMENTS; ++i) { EXPECT_NEAR(inputArray[i], outputArray[i], 1e-6); } } // TO DO: // non-checked access via coeff() // testing numerical validity // testing for denormalized numbers namespace { template void testScalar(T valueExpected, T value){} template <> void testScalar(double valueExpected, double value) { EXPECT_DOUBLE_EQ(valueExpected, value); } template <> void testScalar(float valueExpected, float value) { EXPECT_FLOAT_EQ(valueExpected, value); } }; TYPED_TEST(AllDynamicMatrixTests, addSubMatrix) { typedef typename TestFixture::Matrix Matrix; Matrix m, mInit, m2, m2Init; m.resize(18, 18); m.setRandom(); mInit = m; m2.resize(18, 18); m2.setRandom(); m2Init = m2; ASSERT_NO_THROW(SurgSim::Math::addSubMatrix(m2.block(3,3, 3,3), 2,2, 3,3, &m);); EXPECT_TRUE(m2.isApprox(m2Init)); EXPECT_FALSE(m.isApprox(mInit)); for (int rowId = 0; rowId < 6; rowId++) { EXPECT_TRUE(m.row(rowId).isApprox(mInit.row(rowId))); EXPECT_TRUE(m.col(rowId).isApprox(mInit.col(rowId))); } for (int rowId = 6; rowId < 9; rowId++) { for (int colId = 6; colId < 9; colId++) { testScalar(mInit(rowId, colId) + m2Init(3 + rowId-6, 3 + colId-6), m(rowId, colId)); } } for (int rowId = 9; rowId < 18; rowId++) { EXPECT_TRUE(m.row(rowId).isApprox(mInit.row(rowId))); EXPECT_TRUE(m.col(rowId).isApprox(mInit.col(rowId))); } } TYPED_TEST(AllDynamicMatrixTests, addSubMatrixBlocks) { typedef typename TestFixture::Matrix Matrix; Matrix m, mInit, m2, m2Init; std::vector nodeIds; m.resize(18, 18); m.setRandom(); mInit = m; m2.resize(18, 18); m2.setRandom(); m2Init = m2; nodeIds.push_back(1); nodeIds.push_back(3); nodeIds.push_back(5); ASSERT_NO_THROW(SurgSim::Math::addSubMatrix(m2.block(3,3, 9,9), nodeIds, 3, &m);); EXPECT_TRUE(m2.isApprox(m2Init)); EXPECT_FALSE(m.isApprox(mInit)); for (int rowId = 0; rowId < 3; rowId++) { EXPECT_TRUE(m.row(rowId).isApprox(mInit.row(rowId))); EXPECT_TRUE(m.col(rowId).isApprox(mInit.col(rowId))); } for (int rowId = 3; rowId < 6; rowId++) { for (int colId = 3; colId < 6; colId++) { testScalar(mInit(rowId, colId) + m2Init(3 + rowId-3, 3 + colId-3), m(rowId, colId)); } for (int colId = 9; colId < 12; colId++) { testScalar(mInit(rowId, colId) + m2Init(3 + rowId-3, 3 + colId-6), m(rowId, colId)); } for (int colId = 15; colId < 18; colId++) { testScalar(mInit(rowId, colId) + m2Init(3 + rowId-3, 3 + colId-9), m(rowId, colId)); } } for (int rowId = 6; rowId < 9; rowId++) { EXPECT_TRUE(m.row(rowId).isApprox(mInit.row(rowId))); EXPECT_TRUE(m.col(rowId).isApprox(mInit.col(rowId))); } for (int rowId = 9; rowId < 12; rowId++) { for (int colId = 3; colId < 6; colId++) { testScalar(mInit(rowId, colId) + m2Init(3 + rowId-6, 3 + colId-3), m(rowId, colId)); } for (int colId = 9; colId < 12; colId++) { testScalar(mInit(rowId, colId) + m2Init(3 + rowId-6, 3 + colId-6), m(rowId, colId)); } for (int colId = 15; colId < 18; colId++) { testScalar(mInit(rowId, colId) + m2Init(3 + rowId-6, 3 + colId-9), m(rowId, colId)); } } for (int rowId = 12; rowId < 15; rowId++) { EXPECT_TRUE(m.row(rowId).isApprox(mInit.row(rowId))); EXPECT_TRUE(m.col(rowId).isApprox(mInit.col(rowId))); } for (int rowId = 15; rowId < 18; rowId++) { for (int colId = 3; colId < 6; colId++) { testScalar(mInit(rowId, colId) + m2Init(3 + rowId-9, 3 + colId-3), m(rowId, colId)); } for (int colId = 9; colId < 12; colId++) { testScalar(mInit(rowId, colId) + m2Init(3 + rowId-9, 3 + colId-6), m(rowId, colId)); } for (int colId = 15; colId < 18; colId++) { testScalar(mInit(rowId, colId) + m2Init(3 + rowId-9, 3 + colId-9), m(rowId, colId)); } } } TYPED_TEST(AllDynamicMatrixTests, setSubMatrix) { typedef typename TestFixture::Matrix Matrix; Matrix m, mInit, m2, m2Init; m.resize(18, 18); m.setRandom(); mInit = m; m2.resize(18, 18); m2.setRandom(); m2Init = m2; ASSERT_NO_THROW(SurgSim::Math::setSubMatrix(m2.block(3,3, 3,3), 2,2, 3,3, &m);); EXPECT_TRUE(m2.isApprox(m2Init)); EXPECT_FALSE(m.isApprox(mInit)); for (int rowId = 0; rowId < 6; rowId++) { EXPECT_TRUE(m.row(rowId).isApprox(mInit.row(rowId))); EXPECT_TRUE(m.col(rowId).isApprox(mInit.col(rowId))); } for (int rowId = 6; rowId < 6+3; rowId++) { for (int colId = 6; colId < 6+3; colId++) { testScalar(m2Init(3 + rowId-6, 3 + colId-6), m(rowId, colId)); } } for (int rowId = 6+3; rowId < 18; rowId++) { EXPECT_TRUE(m.row(rowId).isApprox(mInit.row(rowId))); EXPECT_TRUE(m.col(rowId).isApprox(mInit.col(rowId))); } } TYPED_TEST(AllDynamicMatrixTests, getSubMatrix) { typedef typename TestFixture::Matrix Matrix; Matrix m, mInit; m.resize(18, 18); m.setRandom(); mInit = m; Eigen::Block subMatrix = SurgSim::Math::getSubMatrix(m, 2,2, 3,3); EXPECT_TRUE(m.isApprox(mInit)); for (int rowId = 0; rowId < 3; rowId++) { for (int colId = 0; colId < 3; colId++) { testScalar(m(2 * 3 + rowId, 2 * 3 + colId) , subMatrix(rowId, colId)); // Also test that the returned value are pointing to the correct data EXPECT_EQ(&subMatrix(rowId, colId), &m(2 * 3 + rowId, 2 * 3 + colId)); } } } opensurgsim-0.7.0/SurgSim/Math/UnitTests/MeshShapeTests.cpp000066400000000000000000000310621277777236100237460ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include "SurgSim/DataStructures/AabbTree.h" #include "SurgSim/DataStructures/AabbTreeNode.h" #include "SurgSim/DataStructures/EmptyData.h" #include "SurgSim/Framework/ApplicationData.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Math/BoxShape.h" #include "SurgSim/Math/MathConvert.h" #include "SurgSim/Math/MeshShape.h" #include "SurgSim/Math/Vector.h" using SurgSim::DataStructures::EmptyData; using SurgSim::DataStructures::TriangleMeshPlain; namespace { const double epsilon = 1e-8; } namespace SurgSim { namespace Math { // CUBE // 3*----------*2 // / /| // 7*----------* | // | 6| | // | *0 | *1 // | |/ // 4*----------*5 static const int cubeNumPoints = 8; static const Vector3d cubePoints[8] = { Vector3d(-1.0 / 2.0, -1.0 / 2.0, -1.0 / 2.0), Vector3d(1.0 / 2.0, -1.0 / 2.0, -1.0 / 2.0), Vector3d(1.0 / 2.0, 1.0 / 2.0, -1.0 / 2.0), Vector3d(-1.0 / 2.0, 1.0 / 2.0, -1.0 / 2.0), Vector3d(-1.0 / 2.0, -1.0 / 2.0, 1.0 / 2.0), Vector3d(1.0 / 2.0, -1.0 / 2.0, 1.0 / 2.0), Vector3d(1.0 / 2.0, 1.0 / 2.0, 1.0 / 2.0), Vector3d(-1.0 / 2.0, 1.0 / 2.0, 1.0 / 2.0) }; static const int cubeNumEdges = 12; static const int cubeEdges[12][2] = { {0, 1}, {3, 2}, {4, 5}, {7, 6}, // +X {0, 3}, {1, 2}, {4, 7}, {5 , 6}, // +Y {0, 4}, {1, 5}, {2, 6}, {3, 7} // +Z }; static const int cubeNumTriangles = 12; static const int cubeTrianglesCCW[12][3] = { {6, 2, 3}, {6, 3, 7}, // Top ( 0 1 0) [6237] {0, 1, 5}, {0, 5, 4}, // Bottom ( 0 -1 0) [0154] {4, 5, 6}, {4, 6, 7}, // Front ( 0 0 1) [4567] {0, 3, 2}, {0, 2, 1}, // Back ( 0 0 -1) [0321] {1, 2, 6}, {1, 6, 5}, // Right ( 1 0 0) [1265] {0, 4, 7}, {0, 7, 3} // Left (-1 0 0) [0473] }; class MeshShapeTest : public ::testing::Test { public: void SetUp() { m_numIterations = 100; m_runtime = std::make_shared("config.txt"); srand((unsigned int)time(nullptr)); } /// Number of iterations to test int m_numIterations; std::shared_ptr m_runtime; }; TEST_F(MeshShapeTest, InvalidMeshCubeTest) { // Cube std::shared_ptr invalidTriMesh = std::make_shared(); for (int i = 0; i < cubeNumPoints; i++) { Vector3d p; p[0] = cubePoints[i][0]; p[1] = cubePoints[i][1]; p[2] = cubePoints[i][2]; TriangleMeshPlain::VertexType v(p); invalidTriMesh->addVertex(v); } for (int i = 0; i < cubeNumEdges; i++) { std::array edgePoints; for (int j = 0; j < 2; j++) { edgePoints[j] = cubeEdges[i][j]; } TriangleMeshPlain::EdgeType e(edgePoints); invalidTriMesh->addEdge(e); } for (int i = 0; i < cubeNumTriangles; i++) { std::array trianglePoints; for (int j = 0; j < 3; j++) { // Add an offset of 3 to the indices (=> some of them will be invalid) trianglePoints[j] = cubeTrianglesCCW[i][j] + 3; } TriangleMeshPlain::TriangleType t(trianglePoints); invalidTriMesh->addTriangle(t); } EXPECT_THROW(MeshShape invalidMeshShape(*invalidTriMesh), SurgSim::Framework::AssertionFailure); } TEST_F(MeshShapeTest, EmptyMeshTest) { std::shared_ptr emptyMesh = std::make_shared(); EXPECT_NO_THROW(MeshShape meshShape(*emptyMesh)); MeshShape meshShape(*emptyMesh); EXPECT_NEAR(0.0, meshShape.getVolume(), epsilon); EXPECT_TRUE(meshShape.getCenter().isZero()); EXPECT_TRUE(meshShape.getSecondMomentOfVolume().isZero()); EXPECT_TRUE(meshShape.isValid()); // An empty mesh is regarded as valid. MeshShape emptyMeshShape; EXPECT_TRUE(emptyMeshShape.isValid()); EXPECT_TRUE(emptyMeshShape.getBoundingBox().isEmpty()); } TEST_F(MeshShapeTest, ValidMeshTest) { { SCOPED_TRACE("Invalid Mesh"); auto emptyMesh = std::make_shared(); auto meshShape = std::make_shared(*emptyMesh); for (int i = 0; i < cubeNumEdges; ++i) { std::array edgePoints; for (int j = 0; j < 2; j++) { edgePoints[j] = cubeEdges[i][j]; } TriangleMeshPlain::EdgeType e(edgePoints); meshShape->addEdge(e); } EXPECT_FALSE(meshShape->isValid()); } { SCOPED_TRACE("Valid Mesh"); auto emptyMesh = std::make_shared(); auto meshShape = std::make_shared(*emptyMesh); std::shared_ptr invalidTriMesh = std::make_shared(); for (int i = 0; i < cubeNumPoints; i++) { Vector3d point(cubePoints[i][0], cubePoints[i][1], cubePoints[i][2]); TriangleMeshPlain::VertexType vertex(point); meshShape->addVertex(vertex); } EXPECT_TRUE(meshShape->isValid()); } } TEST_F(MeshShapeTest, MeshCubeVSBoxTest) { for (int iterationID = 0; iterationID < m_numIterations; iterationID++) { double lx = 10.0 * (1.0 / static_cast(iterationID + 1)); double ly = 10.0 * (2.0 / static_cast(iterationID + 1)); double lz = 10.0 * (static_cast(iterationID + 1) / 3.0); // Cube std::shared_ptr mesh = std::make_shared(); for (int i = 0; i < cubeNumPoints; i++) { Vector3d p; p[0] = cubePoints[i][0] * lx; p[1] = cubePoints[i][1] * ly; p[2] = cubePoints[i][2] * lz; TriangleMeshPlain::VertexType v(p); mesh->addVertex(v); } for (int i = 0; i < cubeNumEdges; i++) { std::array edgePoints; for (int j = 0; j < 2; j++) { edgePoints[j] = cubeEdges[i][j]; } TriangleMeshPlain::EdgeType e(edgePoints); mesh->addEdge(e); } for (int i = 0; i < cubeNumTriangles; i++) { std::array trianglePoints; for (int j = 0; j < 3; j++) { trianglePoints[j] = cubeTrianglesCCW[i][j]; } TriangleMeshPlain::TriangleType t(trianglePoints); mesh->addTriangle(t); } MeshShape boxMesh(*mesh); BoxShape boxShape(lx, ly, lz); EXPECT_NEAR(boxShape.getVolume(), boxMesh.getVolume(), epsilon); EXPECT_TRUE((boxShape.getCenter() - boxMesh.getCenter()).isZero()); EXPECT_TRUE(boxShape.getSecondMomentOfVolume().isApprox(boxMesh.getSecondMomentOfVolume(), epsilon)); } } TEST_F(MeshShapeTest, SerializationTest) { const std::string fileName = "Geometry/staple_collision.ply"; auto meshShape = std::make_shared(); EXPECT_NO_THROW(meshShape->load(fileName)); EXPECT_TRUE(meshShape->isValid()); // We chose to let YAML serialization only works with base class pointer. // i.e. We need to serialize 'meshShape' via a SurgSim::Math::Shape pointer. // The usage YAML::Node node = meshShape; will not compile. std::shared_ptr shape = meshShape; YAML::Node node; ASSERT_NO_THROW(node = shape); // YAML::convert> will be called. EXPECT_TRUE(node.IsMap()); EXPECT_EQ(1u, node.size()); std::shared_ptr newMeshShape; ASSERT_NO_THROW(newMeshShape = std::dynamic_pointer_cast(node.as>())); EXPECT_EQ("SurgSim::Math::MeshShape", newMeshShape->getClassName()); EXPECT_EQ(meshShape->getNumVertices(), newMeshShape->getNumVertices()); EXPECT_EQ(meshShape->getNumEdges(), newMeshShape->getNumEdges()); EXPECT_EQ(meshShape->getNumTriangles(), newMeshShape->getNumTriangles()); EXPECT_TRUE(newMeshShape->isValid()); } TEST_F(MeshShapeTest, CreateAabbTreeTest) { const std::string fileName = "Geometry/staple_collision.ply"; auto meshShape = std::make_shared(); EXPECT_NO_THROW(meshShape->load(fileName)); auto tree = meshShape->getAabbTree(); auto triangles = meshShape->getTriangles(); auto vertices = meshShape->getVertices(); EXPECT_EQ(224u, triangles.size()); EXPECT_EQ(504u, vertices.size()); for (auto it = triangles.begin(); it != triangles.end(); ++it) { auto ids = it->verticesId; EXPECT_TRUE(tree->getAabb().contains(makeAabb( vertices[ids[0]].position, vertices[ids[1]].position, vertices[ids[2]].position))); } EXPECT_TRUE(meshShape->getBoundingBox().isApprox(tree->getAabb())); } TEST_F(MeshShapeTest, TransformTest) { const std::string fileName = "Geometry/staple_collision.ply"; auto mesh = std::make_shared(); ASSERT_NO_THROW(mesh->load(fileName)); auto originalMesh = std::make_shared(*mesh); auto actualMesh = std::make_shared(*mesh); EXPECT_TRUE(originalMesh->isTransformable()); RigidTransform3d transform = makeRigidTransform(Vector3d(4.3, 2.1, 6.5), Vector3d(-1.5, 7.5, -2.5), Vector3d(8.7, -4.7, -3.1)); actualMesh->transform(transform); EXPECT_TRUE(actualMesh->update()); Vector3d expectedPosition; ASSERT_EQ(originalMesh->getNumVertices(), actualMesh->getNumVertices()); for (size_t i = 0; i < actualMesh->getNumVertices(); i++) { Vector3d expectedPosition = transform * originalMesh->getVertexPosition(i); ASSERT_TRUE(actualMesh->getVertexPosition(i).isApprox(expectedPosition, epsilon)) << "Vertex #" << i << " is not as expected, remaining vertices may also be incorrect."; } Vector3d expectedNormal; ASSERT_EQ(originalMesh->getNumTriangles(), actualMesh->getNumTriangles()); for (size_t i = 0; i < actualMesh->getNumTriangles(); i++) { expectedNormal = transform.linear() * originalMesh->getTriangle(i).data.normal; ASSERT_TRUE(expectedNormal.isApprox(actualMesh->getTriangle(i).data.normal, epsilon)) << "Normal #" << i << " is not as expected, remaining normals may also be incorrect."; } // Expect indeterminate normals due to numerical precision. actualMesh->transform(makeRigidTranslation(Vector3d(1e100, 1e100, 1e100))); EXPECT_FALSE(actualMesh->update()); } TEST_F(MeshShapeTest, NormalTest) { auto mesh = std::make_shared(); // Add vertex TriangleMeshPlain::VertexType v0(Vector3d(-1.0, -1.0, -1.0)); TriangleMeshPlain::VertexType v1(Vector3d(1.0, -1.0, -1.0)); TriangleMeshPlain::VertexType v2(Vector3d(-1.0, 1.0, -1.0)); mesh->addVertex(v0); mesh->addVertex(v1); mesh->addVertex(v2); // Add edges std::array edgePoints01 = {0, 1}; std::array edgePoints12 = {1, 2}; std::array edgePoints20 = {2, 0}; TriangleMeshPlain::EdgeType e01(edgePoints01); TriangleMeshPlain::EdgeType e12(edgePoints12); TriangleMeshPlain::EdgeType e20(edgePoints20); mesh->addEdge(e01); mesh->addEdge(e12); mesh->addEdge(e20); // Add triangle std::array trianglePoints = {0, 1, 2}; TriangleMeshPlain::TriangleType t(trianglePoints); mesh->addTriangle(t); std::shared_ptr meshWithNormal = std::make_shared(*mesh); Vector3d expectedZNormal(0.0, 0.0, 1.0); EXPECT_EQ(expectedZNormal, meshWithNormal->getNormal(0)); // Update new vertex location of v2 to v3 MeshShape::VertexType v3(Vector3d(-1.0, -1.0, 1.0)); SurgSim::DataStructures::Vertex& v2p = meshWithNormal->getVertex(2); v2p = v3; // Recompute normals for meshWithNormal EXPECT_TRUE(meshWithNormal->update()); Vector3d expectedXNormal(0.0, -1.0, 0.0); EXPECT_EQ(expectedXNormal, meshWithNormal->getNormal(0)); v2p = v1; EXPECT_FALSE(meshWithNormal->update()); } TEST_F(MeshShapeTest, DoLoadTest) { auto runtime = std::make_shared("config.txt"); { SCOPED_TRACE("Normal load should succeed"); auto meshShape = std::make_shared(); EXPECT_NO_THROW(meshShape->load("Geometry/staple_collision.ply")); EXPECT_TRUE(meshShape->isValid()); } { SCOPED_TRACE("Load through parameter should succeed"); auto fileName = std::string("Geometry/staple_collision.ply"); auto meshShape = std::make_shared(); EXPECT_NO_THROW(meshShape->setValue("FileName", fileName)); EXPECT_TRUE(meshShape->isValid()); } { SCOPED_TRACE("Load of invalid mesh should throw"); auto meshShape = std::make_shared(); EXPECT_THROW(meshShape->load("Geometry/InvalidMesh.ply"), SurgSim::Framework::AssertionFailure); } { SCOPED_TRACE("Load of non existant file should throw"); auto fileName = std::string("Nonexistent file"); auto meshShape = std::make_shared(); EXPECT_THROW(meshShape->load("Nonexistent file"), SurgSim::Framework::AssertionFailure); } } }; }; opensurgsim-0.7.0/SurgSim/Math/UnitTests/MinMaxTests.cpp000066400000000000000000000135441277777236100232670ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the MinMax functions. #include #include "SurgSim/Math/MinMax.h" namespace SurgSim { namespace Math { class MinMaxTests : public ::testing::Test {}; TEST_F(MinMaxTests, TwoEntriesTests) { const int numValues = 2; float floatValues[numValues] = { 7, 52}; float minFloatVal = 7; float maxFloatVal = 52; float floatMin; float floatMax; double doubleValues[numValues] = { -47, -2}; double minDoubleVal = -47; double maxDoubleVal = -2; double doubleMin; double doubleMax; std::sort(floatValues, floatValues + numValues); do { minMax(floatValues[0], floatValues[1], &floatMin, &floatMax); EXPECT_EQ(minFloatVal, floatMin); EXPECT_EQ(maxFloatVal, floatMax); } while (std::next_permutation(floatValues, floatValues + numValues)); std::sort(doubleValues, doubleValues + numValues); do { minMax(doubleValues[0], doubleValues[1], &doubleMin, &doubleMax); EXPECT_EQ(minDoubleVal, doubleMin); EXPECT_EQ(maxDoubleVal, doubleMax); } while (std::next_permutation(doubleValues, doubleValues + numValues)); }; TEST_F(MinMaxTests, ThreeEntriesTests) { const int numValues = 3; float floatValues[numValues] = { 22, 7, 52}; float minFloatVal = 7; float maxFloatVal = 52; float floatMin; float floatMax; double doubleValues[numValues] = { -47, -2, -7}; double minDoubleVal = -47; double maxDoubleVal = -2; double doubleMin; double doubleMax; std::sort(floatValues, floatValues + numValues); do { minMax(floatValues[0], floatValues[1], floatValues[2], &floatMin, &floatMax); EXPECT_EQ(minFloatVal, floatMin); EXPECT_EQ(maxFloatVal, floatMax); } while (std::next_permutation(floatValues, floatValues + numValues)); std::sort(doubleValues, doubleValues + numValues); do { minMax(doubleValues[0], doubleValues[1], doubleValues[2], &doubleMin, &doubleMax); EXPECT_EQ(minDoubleVal, doubleMin); EXPECT_EQ(maxDoubleVal, doubleMax); } while (std::next_permutation(doubleValues, doubleValues + numValues)); }; TEST_F(MinMaxTests, FourEntriesTests) { const int numValues = 4; float floatValues[numValues] = { 18, 7, 52, 12}; float minFloatVal = 7; float maxFloatVal = 52; float floatMin; float floatMax; double doubleValues[numValues] = { -23, -47, -2, -17}; double minDoubleVal = -47; double maxDoubleVal = -2; double doubleMin; double doubleMax; std::sort(floatValues, floatValues + numValues); do { minMax(floatValues[0], floatValues[1], floatValues[2], floatValues[3], &floatMin, &floatMax); EXPECT_EQ(minFloatVal, floatMin); EXPECT_EQ(maxFloatVal, floatMax); } while (std::next_permutation(floatValues, floatValues + numValues)); std::sort(doubleValues, doubleValues + numValues); do { minMax(doubleValues[0], doubleValues[1], doubleValues[2], doubleValues[3], &doubleMin, &doubleMax); EXPECT_EQ(minDoubleVal, doubleMin); EXPECT_EQ(maxDoubleVal, doubleMax); } while (std::next_permutation(doubleValues, doubleValues + numValues)); }; TEST_F(MinMaxTests, FiveEntriesTests) { const int numValues = 5; float floatValues[numValues] = { 18, 7, 52, 12, 12}; float minFloatVal = 7; float maxFloatVal = 52; float floatMin; float floatMax; double doubleValues[numValues] = { -23, -47, -2, -17, -17}; double minDoubleVal = -47; double maxDoubleVal = -2; double doubleMin; double doubleMax; std::sort(floatValues, floatValues + numValues); do { minMax(floatValues[0], floatValues[1], floatValues[2], floatValues[3], floatValues[4], &floatMin, &floatMax); EXPECT_EQ(minFloatVal, floatMin); EXPECT_EQ(maxFloatVal, floatMax); } while (std::next_permutation(floatValues, floatValues + numValues)); std::sort(doubleValues, doubleValues + numValues); do { minMax(doubleValues[0], doubleValues[1], doubleValues[2], doubleValues[3], doubleValues[4], &doubleMin, &doubleMax); EXPECT_EQ(minDoubleVal, doubleMin); EXPECT_EQ(maxDoubleVal, doubleMax); } while (std::next_permutation(doubleValues, doubleValues + numValues)); }; TEST_F(MinMaxTests, AribtraryEntriesTests) { const int numValues = 5; float floatValues[numValues] = { 18, 7, 52, 12, 12}; float minFloatVal = 7; float maxFloatVal = 52; float floatMin; float floatMax; double doubleValues[numValues] = { -23, -47, -2, -17, -17}; double minDoubleVal = -47; double maxDoubleVal = -2; double doubleMin; double doubleMax; ASSERT_THROW(minMax(floatValues, 0, &floatMin, &floatMax), SurgSim::Framework::AssertionFailure); ASSERT_THROW(minMax(floatValues, -1, &floatMin, &floatMax), SurgSim::Framework::AssertionFailure); std::sort(floatValues, floatValues + numValues); do { minMax(floatValues, numValues, &floatMin, &floatMax); EXPECT_EQ(minFloatVal, floatMin); EXPECT_EQ(maxFloatVal, floatMax); } while (std::next_permutation(floatValues, floatValues + numValues)); ASSERT_THROW(minMax(doubleValues, 0, &doubleMin, &doubleMax), SurgSim::Framework::AssertionFailure); ASSERT_THROW(minMax(doubleValues, -1, &doubleMin, &doubleMax), SurgSim::Framework::AssertionFailure); std::sort(doubleValues, doubleValues + numValues); do { minMax(doubleValues, numValues, &doubleMin, &doubleMax); EXPECT_EQ(minDoubleVal, doubleMin); EXPECT_EQ(maxDoubleVal, doubleMax); } while (std::next_permutation(doubleValues, doubleValues + numValues)); }; }; // namespace Math }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Math/UnitTests/MlcpGaussSeidelSolverTests.cpp000066400000000000000000000175421277777236100263170ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the Gauss-Seidel implementation of the MLCP solver. #include #include #include #include "gtest/gtest.h" #include #include "SurgSim/Math/Valid.h" #include "SurgSim/Math/MlcpGaussSeidelSolver.h" #include "SurgSim/Math/MlcpSolution.h" #include "SurgSim/Testing/MlcpIO/MlcpTestData.h" #include "SurgSim/Testing/MlcpIO/ReadText.h" using SurgSim::Math::isValid; using SurgSim::Math::MlcpGaussSeidelSolver; TEST(MlcpGaussSeidelSolverTests, CanConstruct) { //ASSERT_NO_THROW({ MlcpGaussSeidelSolver mlcpSolver(1.0, 1.0, 100); } static void solveAndCompareResult(const std::string& fileName, double gsSolverPrecision = 1e-9, double gsContactTolerance = 1e-9, int gsMaxIterations = 100) { SCOPED_TRACE("while running test " + fileName); const std::shared_ptr data = loadTestData(fileName); ASSERT_TRUE(data != nullptr) << "Failed to load " << fileName; // NB: need to make the solver calls const-correct. Eigen::MatrixXd A = data->problem.A; Eigen::VectorXd b = data->problem.b; Eigen::VectorXd mu = data->problem.mu; std::vector constraintTypes = data->problem.constraintTypes; const size_t size = data->getSize(); SurgSim::Math::MlcpSolution solution; solution.x.resize(size); //################################ // Gauss-Seidel solver MlcpGaussSeidelSolver mlcpSolver(gsSolverPrecision, gsContactTolerance, gsMaxIterations); solution.x.setZero(); // XXX set ratio to 1 mlcpSolver.solve(data->problem, &solution); ASSERT_EQ(size, solution.x.rows()); ASSERT_EQ(size, data->expectedLambda.rows()); if (size > 0) { ASSERT_TRUE(isValid(solution.x)) << solution.x; } // TODO(advornik): Because this is a mixed LCP problem *with friction*, we can't just easily check that // all x are positive (the frictional entries may not be), or that all Ax+b are positive(ditto). // We need to either (a) make the test aware of the meaning of the constraint types, or (b) get rid // of the constraint types and flag the frictional DOFs more directly. // // For now, we check if the MLCP is really a pure LCP (only unilaterals without friction), and we // perform some simple checks that apply to that case and that case only. bool isSimpleLcp = true; for (auto it = constraintTypes.cbegin(); it != constraintTypes.cend(); ++it) { if ((*it) != SurgSim::Math::MLCP_UNILATERAL_3D_FRICTIONLESS_CONSTRAINT) { isSimpleLcp = false; } } if (isSimpleLcp && (size > 0)) { EXPECT_GE(solution.x.minCoeff(), 0.0) << "x contains negative coefficients:" << std::endl << solution.x; Eigen::VectorXd c = A * solution.x + b; EXPECT_GE(c.minCoeff(), -gsSolverPrecision) << "Ax+b contains negative coefficients:" << std::endl << c; // Orthogonality test should be taking into account the scaling factor double maxAbsForce = abs(solution.x.maxCoeff()); if (abs(solution.x.minCoeff()) > maxAbsForce) { maxAbsForce = abs(solution.x.minCoeff()); } const double epsilon = 1e-9 * maxAbsForce; EXPECT_NEAR(0.0, c.dot(solution.x), epsilon) << "Ax+b is not orthogonal to x!" << std::endl << "x:" << std::endl << solution.x << std::endl << "Ax+b:" << std::endl << c; } EXPECT_TRUE(solution.x.isApprox(data->expectedLambda)) << "lambda:" << std::endl << solution.x << std::endl << "expected:" << std::endl << data->expectedLambda; // double convergenceCriteria=0.0; // bool validSignorini=false; // int nbContactToSkip=0; // int currentAtomicIndex = calculateConvergenceCriteria(lambda, nbContactToSkip, convergenceCriteria, // validSignorini, 1.0); } TEST(MlcpGaussSeidelSolverTests, SolveOriginal) { const double gsSolverPrecision = 1e-4; const double gsContactTolerance = 2e-4; int gsMaxIterations = 30; solveAndCompareResult("mlcpOriginalTest.txt", gsSolverPrecision, gsContactTolerance, gsMaxIterations); } TEST(MlcpGaussSeidelSolverTests, SolveSequence) { for (int i = 0; i <= 9; ++i) { solveAndCompareResult(getTestFileName("mlcpTest", i, ".txt")); } } static void solveRepeatedly(const MlcpTestData& data, /*XXX const */ MlcpGaussSeidelSolver* mlcpSolver, const int repetitions) { // NB: need to make the solver calls const-correct. SurgSim::Math::MlcpProblem problem; SurgSim::Math::MlcpSolution solution; std::vector constraintTypes; const size_t size = data.getSize(); solution.x.resize(size); for (int i = repetitions; i > 0; --i) { problem = data.problem; if (mlcpSolver) { solution.x.setZero(); mlcpSolver->solve(problem, &solution); } } } static double measureExecutionTimeUsec(const std::string& fileName, double gsSolverPrecision = 1e-8, double gsContactTolerance = 1e-8, int gsMaxIterations = 20) { SCOPED_TRACE("while running test " + fileName); const std::shared_ptr data = loadTestData(fileName); EXPECT_TRUE(data != nullptr) << "Failed to load " << fileName; MlcpGaussSeidelSolver mlcpSolver(gsSolverPrecision, gsContactTolerance, gsMaxIterations); typedef boost::chrono::high_resolution_clock clock; clock::time_point calibrationStart = clock::now(); const int calibrationRepetitions = 1000; solveRepeatedly(*data, &mlcpSolver, calibrationRepetitions); boost::chrono::duration calibrationTime = clock::now() - calibrationStart; double desiredTestTimeSec = 1.0; double desiredRepetitions = desiredTestTimeSec * calibrationRepetitions / calibrationTime.count(); const int repetitions = std::max(10, std::min(1000000, static_cast(desiredRepetitions))); clock::time_point time0 = clock::now(); // Do not actually solve the problem; just copy the input data. solveRepeatedly(*data, nullptr, repetitions); clock::time_point time1 = clock::now(); // Actually solve the problem. solveRepeatedly(*data, &mlcpSolver, repetitions); clock::time_point time2 = clock::now(); boost::chrono::duration elapsedSolveTime = time2 - time1; //std::cout << "Elapsed: " << (elapsedSolveTime.count() * 1000.) << " ms" << std::endl; boost::chrono::duration elapsedBaseline = time1 - time0; //std::cout << "Baseline: " << (elapsedBaseline.count() * 1000.) << " ms" << std::endl; double solveTimeUsec = (elapsedSolveTime - elapsedBaseline).count() * 1e6 / repetitions; double copyTimeUsec = elapsedBaseline.count() * 1e6 / repetitions; std::cout << "Average solution time: " << solveTimeUsec << " microseconds (~" << (solveTimeUsec+copyTimeUsec) << "-" << copyTimeUsec << ") over " << repetitions << " loops" << std::endl; return solveTimeUsec; } TEST(MlcpGaussSeidelSolverTests, MeasureExecutionTimeOriginal) { const double gsSolverPrecision = 1e-4; const double gsContactTolerance = 2e-5; int gsMaxIterations = 30; double solveTimeUsec = measureExecutionTimeUsec("mlcpOriginalTest.txt", gsSolverPrecision, gsContactTolerance, gsMaxIterations); // When refactoring the MLCP code, it can be very useful to compare the execution time before and after making // changes. But you can't usefully compare execution times on different machines, or with different build // settings, so you'll need to manually uncomment the following line and adjust the time accordingly. // EXPECT_LE(solveTimeUsec, 14.0); EXPECT_LE(solveTimeUsec, 1e6); } opensurgsim-0.7.0/SurgSim/Math/UnitTests/MlcpTestData/000077500000000000000000000000001277777236100226655ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Math/UnitTests/MlcpTestData/mlcpOriginalTest.txt000066400000000000000000000117431277777236100267140ustar00rootroot00000000000000# Original MLCP test - some data from a live simulation flags = total degrees of freedom = -1 number of constraints = 6 number of constraint DOFs ("atomic constraints") = 16 constraint types = MLCP_BILATERAL_3D_CONSTRAINT MLCP_BILATERAL_2D_CONSTRAINT MLCP_BILATERAL_3D_CONSTRAINT MLCP_BILATERAL_2D_CONSTRAINT MLCP_UNILATERAL_3D_FRICTIONAL_CONSTRAINT MLCP_UNILATERAL_3D_FRICTIONAL_CONSTRAINT E = ( -1.078639261242742e-009 3.8628052700939719e-009 3.4365124678206738e-011 5.2439675317372814e-008 -1.0881681666852216e-010 -5.4598438617436962e-010 1.3895925000950715e-009 -8.0260487492211929e-010 3.182259790575348e-008 1.5418919745158188e-008 -0.0028349485130807293 -0.00024345752383292049 -6.8288003755851215e-005 -0.0024687155316284442 0.00044509381981076065 0.00036473635193496473) HCHt = ( ( 1.3345657526376539e-008 1.4762129451361012e-012 1.3021510888275589e-009 -3.1071425782284856e-008 -5.6308255099272961e-011 0 0 0 0 0 0 0 0 0 0 0) ( 1.4762129451361044e-012 1.4730637830740187e-008 -1.2917016738606647e-012 -7.1607792168177411e-016 -4.2296549471529904e-012 0 0 0 0 0 0 0 0 0 0 0) ( 1.3021510888275589e-009 -1.2917016738606573e-012 1.350942244549466e-008 -3.3089655917465503e-008 -5.993834037837092e-011 0 0 0 0 0 0 0 0 0 0 0) ( -3.1071425782284856e-008 -7.1607792168177411e-016 -3.3089655917465503e-008 7.9109243566832458e-007 -2.0914474411210304e-011 0 0 0 0 0 0 0 0 0 0 0) ( -5.6308255099272961e-011 -4.2296549471529904e-012 -5.993834037837092e-011 -2.0914474411210346e-011 7.9999738402362291e-007 0 0 0 0 0 0 0 0 0 0 0) ( 0 0 0 0 0 1.5589983172147443e-008 2.4655681638273228e-010 -2.6547210557780089e-010 -4.0242767107961668e-010 2.9172027027174455e-008 -1.4626940755792081e-009 -8.3546545220688397e-009 -6.910879572780377e-012 1.0076117393553975e-009 8.6338319022767194e-009 -1.2342675099707964e-010) ( 0 0 0 0 0 2.4655681638273228e-010 1.2772429953165537e-008 -2.8455178752109829e-010 -7.9973379384833891e-011 5.8411815009243883e-009 -6.474323176106377e-009 -5.7283661469222675e-010 -1.0858340296547962e-009 6.2702667451699401e-009 -1.7749942115993248e-009 -4.3201426346668623e-010) ( 0 0 0 0 0 -2.6547210557780094e-010 -2.8455178752109829e-010 1.5781997723164011e-008 5.6863004741912405e-010 -4.1221084373918575e-008 6.434508335504067e-010 1.5299613175269497e-010 -8.7523797506238338e-009 -1.24204206311367e-009 -6.5906217261540902e-011 8.5224220548311002e-009) ( 0 0 0 0 0 -4.0242767107961668e-010 -7.9973379384833891e-011 5.6863004741912405e-010 7.9763312499397027e-007 1.1507401561300607e-010 3.3984526634410832e-009 8.0413593280745838e-009 -1.1262542833458448e-008 3.4590894897356843e-009 7.1961798751286384e-009 -1.0553214707732758e-008) ( 0 0 0 0 0 2.9172027027174455e-008 5.8411815009243883e-009 -4.1221084373918575e-008 1.1507401561300607e-010 7.8929265028778233e-007 -8.7525370098262112e-009 -2.0706484870371629e-008 2.8946431215678211e-008 9.6712597799773566e-009 2.016714890447026e-008 -2.951199226885018e-008) ( 0 0 0 0 0 -1.4626940755792081e-009 -6.474323176106377e-009 6.434508335504067e-010 3.3984526634410832e-009 -8.7525370098262112e-009 9.3508899127147559e-005 6.1061434208882659e-006 -1.0005996410361315e-005 2.3175132657846745e-005 -5.7725592020145953e-007 -2.6121568520215946e-006) ( 0 0 0 0 0 -8.3546545220688397e-009 -5.7283661469222675e-010 1.5299613175269497e-010 8.0413593280745838e-009 -2.0706484870371629e-008 6.1061434208882693e-006 9.9502091897911858e-005 7.7201461732487004e-006 6.37466867795377e-006 2.3794026441112229e-005 5.9700902633940878e-006) ( 0 0 0 0 0 -6.910879572780377e-012 -1.0858340296547962e-009 -8.7523797506238338e-009 -1.1262542833458448e-008 2.8946431215678211e-008 -1.0005996410361326e-005 7.7201461732486902e-006 0.00010300469354547019 2.0371361118566863e-006 1.2143141546752772e-005 1.9538302894163935e-005) ( 0 0 0 0 0 1.0076117393553975e-009 6.2702667451699401e-009 -1.24204206311367e-009 3.4590894897356843e-009 9.6712597799773566e-009 2.3175132657846745e-005 6.37466867795377e-006 2.0371361118566863e-006 7.024991409575548e-005 4.749834757924254e-006 -3.4246067483125659e-006) ( 0 0 0 0 0 8.6338319022767194e-009 -1.7749942115993248e-009 -6.5906217261540902e-011 7.1961798751286384e-009 2.016714890447026e-008 -5.7725592020145953e-007 2.3794026441112229e-005 1.2143141546752772e-005 4.7498347579242642e-006 6.0599243166315907e-005 7.4677104014104345e-006) ( 0 0 0 0 0 -1.2342675099707964e-010 -4.3201426346668623e-010 8.5224220548311002e-009 -1.0553214707732758e-008 -2.951199226885018e-008 -2.6121568520215946e-006 5.9700902633940878e-006 1.9538302894163935e-005 -3.4246067483125621e-006 7.4677104014104133e-006 5.4786811573213588e-005) ) friction = ( 2.8797662206765437e-216 0 0 0 0 0 0 0 0 0 0.40000000000000002 0 0 0.40000000000000002 0 0) lambda = ( -0.080836084913972622 -0.26223731104011477 -0.18374150677203246 -0.077148138493640786 0.00011316190840491921 6.5804169707683497 -2.1186332046610241 5.7403838888910892 -0.18883274186185561 -0.05530115251517391 24.309512511537893 1.4775577619944267 4.3566278655246844 27.275211987031248 -10.073699584423007 -4.1893349010069185) == END == opensurgsim-0.7.0/SurgSim/Math/UnitTests/MlcpTestData/mlcpTest000.txt000066400000000000000000000003261277777236100254420ustar00rootroot00000000000000# MLCP Test 000 - size 0 flags = total degrees of freedom = 0 number of constraints = 0 number of constraint DOFs ("atomic constraints") = 0 constraint types = E = () HCHt = ( ) friction = () lambda = () == END == opensurgsim-0.7.0/SurgSim/Math/UnitTests/MlcpTestData/mlcpTest001.txt000066400000000000000000000107631277777236100254510ustar00rootroot00000000000000# MLCP Test 001 - size 3N - All independent (N rigid bodies) bilateral 3D (diagonal block (3) matrix) flags = SOLVER_STATUS_METHOD total degrees of freedom = 60 number of constraints = 10 number of constraint DOFs ("atomic constraints") = 30 constraint types = MLCP_BILATERAL_3D_CONSTRAINT MLCP_BILATERAL_3D_CONSTRAINT MLCP_BILATERAL_3D_CONSTRAINT MLCP_BILATERAL_3D_CONSTRAINT MLCP_BILATERAL_3D_CONSTRAINT MLCP_BILATERAL_3D_CONSTRAINT MLCP_BILATERAL_3D_CONSTRAINT MLCP_BILATERAL_3D_CONSTRAINT MLCP_BILATERAL_3D_CONSTRAINT MLCP_BILATERAL_3D_CONSTRAINT E = ( -1.0000000000000001e-007 -2.0000000000000002e-007 -2.9999999999999999e-007 -1.0000000000000001e-007 -2.0000000000000002e-007 -2.9999999999999999e-007 -1.0000000000000001e-007 -2.0000000000000002e-007 -2.9999999999999999e-007 -1.0000000000000001e-007 -2.0000000000000002e-007 -2.9999999999999999e-007 -1.0000000000000001e-007 -2.0000000000000002e-007 -2.9999999999999999e-007 -1.0000000000000001e-007 -2.0000000000000002e-007 -2.9999999999999999e-007 -1.0000000000000001e-007 -2.0000000000000002e-007 -2.9999999999999999e-007 -1.0000000000000001e-007 -2.0000000000000002e-007 -2.9999999999999999e-007 -1.0000000000000001e-007 -2.0000000000000002e-007 -2.9999999999999999e-007 -1.0000000000000001e-007 -2.0000000000000002e-007 -2.9999999999999999e-007) HCHt = ( ( 1.0000000000000001e-009 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0) ( 0 1.0000000000000001e-009 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0) ( 0 0 1.0000000000000001e-009 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0) ( 0 0 0 1.0000000000000001e-009 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0) ( 0 0 0 0 1.0000000000000001e-009 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0) ( 0 0 0 0 0 1.0000000000000001e-009 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0) ( 0 0 0 0 0 0 1.0000000000000001e-009 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0) ( 0 0 0 0 0 0 0 1.0000000000000001e-009 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0) ( 0 0 0 0 0 0 0 0 1.0000000000000001e-009 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0) ( 0 0 0 0 0 0 0 0 0 1.0000000000000001e-009 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0) ( 0 0 0 0 0 0 0 0 0 0 1.0000000000000001e-009 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0) ( 0 0 0 0 0 0 0 0 0 0 0 1.0000000000000001e-009 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0) ( 0 0 0 0 0 0 0 0 0 0 0 0 1.0000000000000001e-009 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0) ( 0 0 0 0 0 0 0 0 0 0 0 0 0 1.0000000000000001e-009 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0) ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1.0000000000000001e-009 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0) ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1.0000000000000001e-009 0 0 0 0 0 0 0 0 0 0 0 0 0 0) ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1.0000000000000001e-009 0 0 0 0 0 0 0 0 0 0 0 0 0) ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1.0000000000000001e-009 0 0 0 0 0 0 0 0 0 0 0 0) ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1.0000000000000001e-009 0 0 0 0 0 0 0 0 0 0 0) ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1.0000000000000001e-009 0 0 0 0 0 0 0 0 0 0) ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1.0000000000000001e-009 0 0 0 0 0 0 0 0 0) ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1.0000000000000001e-009 0 0 0 0 0 0 0 0) ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1.0000000000000001e-009 0 0 0 0 0 0 0) ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1.0000000000000001e-009 0 0 0 0 0 0) ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1.0000000000000001e-009 0 0 0 0 0) ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1.0000000000000001e-009 0 0 0 0) ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1.0000000000000001e-009 0 0 0) ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1.0000000000000001e-009 0 0) ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1.0000000000000001e-009 0) ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1.0000000000000001e-009) ) friction = ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0) lambda = ( 99.999999999999986 199.99999999999997 299.99999999999994 99.999999999999986 199.99999999999997 299.99999999999994 99.999999999999986 199.99999999999997 299.99999999999994 99.999999999999986 199.99999999999997 299.99999999999994 99.999999999999986 199.99999999999997 299.99999999999994 99.999999999999986 199.99999999999997 299.99999999999994 99.999999999999986 199.99999999999997 299.99999999999994 99.999999999999986 199.99999999999997 299.99999999999994 99.999999999999986 199.99999999999997 299.99999999999994 99.999999999999986 199.99999999999997 299.99999999999994) == END == opensurgsim-0.7.0/SurgSim/Math/UnitTests/MlcpTestData/mlcpTest002.txt000066400000000000000000000113251277777236100254450ustar00rootroot00000000000000# MLCP Test 002 - size 3N - All dependent (1 rigid body) bilateral 3D (full matrix) - physically possible flags = SOLVER_GAUSS_SEIDEL total degrees of freedom = 6 number of constraints = 6 number of constraint DOFs ("atomic constraints") = 18 constraint types = MLCP_BILATERAL_3D_CONSTRAINT MLCP_BILATERAL_3D_CONSTRAINT MLCP_BILATERAL_3D_CONSTRAINT MLCP_BILATERAL_3D_CONSTRAINT MLCP_BILATERAL_3D_CONSTRAINT MLCP_BILATERAL_3D_CONSTRAINT E = ( -1.0000000000000001e-007 -2.0000000000000002e-007 -2.9999999999999999e-007 -1.0000000000000001e-007 -2.0000000000000002e-007 -2.9999999999999999e-007 -1.0000000000000001e-007 -2.0000000000000002e-007 -2.9999999999999999e-007 -1.0000000000000001e-007 -2.0000000000000002e-007 -2.9999999999999999e-007 -1.0000000000000001e-007 -2.0000000000000002e-007 -2.9999999999999999e-007 -1.0000000000000001e-007 -2.0000000000000002e-007 -2.9999999999999999e-007) HCHt = ( ( 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0 0) ( 0 3.4999999999999999e-009 0 0 -1.5e-009 0 -2.5000000000000001e-009 1.0000000000000001e-009 0 2.5000000000000001e-009 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0) ( 0 0 3.4999999999999999e-009 0 0 -1.5e-009 0 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 -2.5000000000000001e-009 0 1.0000000000000001e-009 2.5000000000000001e-009 0 1.0000000000000001e-009) ( 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0 0) ( 0 -1.5e-009 0 0 3.4999999999999999e-009 0 2.5000000000000001e-009 1.0000000000000001e-009 0 -2.5000000000000001e-009 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0) ( 0 0 -1.5e-009 0 0 3.4999999999999999e-009 0 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 2.5000000000000001e-009 0 1.0000000000000001e-009 -2.5000000000000001e-009 0 1.0000000000000001e-009) ( 1.0000000000000001e-009 -2.5000000000000001e-009 0 1.0000000000000001e-009 2.5000000000000001e-009 0 3.4999999999999999e-009 0 0 -1.5e-009 0 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0 0) ( 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0) ( 0 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0 0 3.4999999999999999e-009 0 0 -1.5e-009 0 -2.5000000000000001e-009 1.0000000000000001e-009 0 2.5000000000000001e-009 1.0000000000000001e-009) ( 1.0000000000000001e-009 2.5000000000000001e-009 0 1.0000000000000001e-009 -2.5000000000000001e-009 0 -1.5e-009 0 0 3.4999999999999999e-009 0 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0 0) ( 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0) ( 0 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0 0 -1.5e-009 0 0 3.4999999999999999e-009 0 2.5000000000000001e-009 1.0000000000000001e-009 0 -2.5000000000000001e-009 1.0000000000000001e-009) ( 1.0000000000000001e-009 0 -2.5000000000000001e-009 1.0000000000000001e-009 0 2.5000000000000001e-009 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0 0 3.4999999999999999e-009 0 0 -1.5e-009 0 0) ( 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 -2.5000000000000001e-009 0 1.0000000000000001e-009 2.5000000000000001e-009 0 3.4999999999999999e-009 0 0 -1.5e-009 0) ( 0 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009) ( 1.0000000000000001e-009 0 2.5000000000000001e-009 1.0000000000000001e-009 0 -2.5000000000000001e-009 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0 0 -1.5e-009 0 0 3.4999999999999999e-009 0 0) ( 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 2.5000000000000001e-009 0 1.0000000000000001e-009 -2.5000000000000001e-009 0 -1.5e-009 0 0 3.4999999999999999e-009 0) ( 0 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009) ) friction = ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0) lambda = ( 113.54027658543633 55.984447685184627 81.845635261303883 -3.3087224502121103e-015 84.261711722572898 124.6596369935406 -18.056081083408476 63.19628379192968 25.729224155848073 10.317760619090549 4.9630836753181653e-015 38.723144908175662 -24.501830651667866 -8.2978167660376485 29.042358681131724 18.422943494849036 4.7416095805929466 3.3087224502121107e-015) == END == opensurgsim-0.7.0/SurgSim/Math/UnitTests/MlcpTestData/mlcpTest003.txt000066400000000000000000000112151277777236100254440ustar00rootroot00000000000000# MLCP Test 003 - size 3N - All dependent (1 rigid body) bilateral 3D (full matrix) - physically impossible flags = SOLVER_GAUSS_SEIDEL total degrees of freedom = 6 number of constraints = 6 number of constraint DOFs ("atomic constraints") = 18 constraint types = MLCP_BILATERAL_3D_CONSTRAINT MLCP_BILATERAL_3D_CONSTRAINT MLCP_BILATERAL_3D_CONSTRAINT MLCP_BILATERAL_3D_CONSTRAINT MLCP_BILATERAL_3D_CONSTRAINT MLCP_BILATERAL_3D_CONSTRAINT E = ( -0 -0 -0 -1.0000000000000001e-007 -2.0000000000000002e-007 -2.9999999999999999e-007 -2.0000000000000002e-007 -8.0000000000000007e-007 -2.3999999999999999e-006 -3.0000000000000004e-007 -1.8000000000000001e-006 -8.1000000000000004e-006 -4.0000000000000003e-007 -3.2000000000000003e-006 -1.9199999999999999e-005 -4.9999999999999998e-007 -5.0000000000000004e-006 -3.749999999999999e-005) HCHt = ( ( 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0 0) ( 0 3.4999999999999999e-009 0 0 -1.5e-009 0 -2.5000000000000001e-009 1.0000000000000001e-009 0 2.5000000000000001e-009 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0) ( 0 0 3.4999999999999999e-009 0 0 -1.5e-009 0 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 -2.5000000000000001e-009 0 1.0000000000000001e-009 2.5000000000000001e-009 0 1.0000000000000001e-009) ( 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0 0) ( 0 -1.5e-009 0 0 3.4999999999999999e-009 0 2.5000000000000001e-009 1.0000000000000001e-009 0 -2.5000000000000001e-009 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0) ( 0 0 -1.5e-009 0 0 3.4999999999999999e-009 0 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 2.5000000000000001e-009 0 1.0000000000000001e-009 -2.5000000000000001e-009 0 1.0000000000000001e-009) ( 1.0000000000000001e-009 -2.5000000000000001e-009 0 1.0000000000000001e-009 2.5000000000000001e-009 0 3.4999999999999999e-009 0 0 -1.5e-009 0 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0 0) ( 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0) ( 0 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0 0 3.4999999999999999e-009 0 0 -1.5e-009 0 -2.5000000000000001e-009 1.0000000000000001e-009 0 2.5000000000000001e-009 1.0000000000000001e-009) ( 1.0000000000000001e-009 2.5000000000000001e-009 0 1.0000000000000001e-009 -2.5000000000000001e-009 0 -1.5e-009 0 0 3.4999999999999999e-009 0 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0 0) ( 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0) ( 0 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0 0 -1.5e-009 0 0 3.4999999999999999e-009 0 2.5000000000000001e-009 1.0000000000000001e-009 0 -2.5000000000000001e-009 1.0000000000000001e-009) ( 1.0000000000000001e-009 0 -2.5000000000000001e-009 1.0000000000000001e-009 0 2.5000000000000001e-009 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0 0 3.4999999999999999e-009 0 0 -1.5e-009 0 0) ( 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 -2.5000000000000001e-009 0 1.0000000000000001e-009 2.5000000000000001e-009 0 3.4999999999999999e-009 0 0 -1.5e-009 0) ( 0 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009) ( 1.0000000000000001e-009 0 2.5000000000000001e-009 1.0000000000000001e-009 0 -2.5000000000000001e-009 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0 0 -1.5e-009 0 0 3.4999999999999999e-009 0 0) ( 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 2.5000000000000001e-009 0 1.0000000000000001e-009 -2.5000000000000001e-009 0 -1.5e-009 0 0 3.4999999999999999e-009 0) ( 0 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009 0 0 1.0000000000000001e-009) ) friction = ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0) lambda = ( -176303.18958583617 -87925.632737205815 -1024484.8029754778 10000.000000000253 -119643.57244199516 -1527437.2554425916 25637.908380427547 -19732.679331495205 -316650.30202035437 -6078.8047888158735 100000.00000000031 -182244.36546376004 326005.38228295406 -2376.207400623372 1258316.7259021834 -177465.42049975123 132786.40422892763 1830000.0000000005) == END == opensurgsim-0.7.0/SurgSim/Math/UnitTests/MlcpTestData/mlcpTest004.txt000066400000000000000000000027511277777236100254520ustar00rootroot00000000000000# MLCP Test 004 - size N - All independent (N rigid bodies) unilateral frictionless (diagonal block (1) matrix = diagonal matrix) - positive violation (nothing to solve) flags = SOLVER_STATUS_METHOD total degrees of freedom = 60 number of constraints = 10 number of constraint DOFs ("atomic constraints") = 10 constraint types = MLCP_UNILATERAL_3D_FRICTIONLESS_CONSTRAINT MLCP_UNILATERAL_3D_FRICTIONLESS_CONSTRAINT MLCP_UNILATERAL_3D_FRICTIONLESS_CONSTRAINT MLCP_UNILATERAL_3D_FRICTIONLESS_CONSTRAINT MLCP_UNILATERAL_3D_FRICTIONLESS_CONSTRAINT MLCP_UNILATERAL_3D_FRICTIONLESS_CONSTRAINT MLCP_UNILATERAL_3D_FRICTIONLESS_CONSTRAINT MLCP_UNILATERAL_3D_FRICTIONLESS_CONSTRAINT MLCP_UNILATERAL_3D_FRICTIONLESS_CONSTRAINT MLCP_UNILATERAL_3D_FRICTIONLESS_CONSTRAINT E = ( 0.9876159799998131 2.1304951684997055 3.2733743569995983 4.4162535454994911 5.5591327339993839 6.7020119224992767 7.8448911109991686 8.9877702994990614 10.130649487998955 11.273528676498847) HCHt = ( ( 1.0000000000000003e-009 0 0 0 0 0 0 0 0 0) ( 0 1.0000000000000003e-009 0 0 0 0 0 0 0 0) ( 0 0 1.0000000000000003e-009 0 0 0 0 0 0 0) ( 0 0 0 1.0000000000000003e-009 0 0 0 0 0 0) ( 0 0 0 0 1.0000000000000003e-009 0 0 0 0 0) ( 0 0 0 0 0 1.0000000000000003e-009 0 0 0 0) ( 0 0 0 0 0 0 1.0000000000000003e-009 0 0 0) ( 0 0 0 0 0 0 0 1.0000000000000003e-009 0 0) ( 0 0 0 0 0 0 0 0 1.0000000000000003e-009 0) ( 0 0 0 0 0 0 0 0 0 1.0000000000000003e-009) ) friction = ( 0 0 0 0 0 0 0 0 0 0) lambda = ( 0 0 0 0 0 0 0 0 0 0) == END == opensurgsim-0.7.0/SurgSim/Math/UnitTests/MlcpTestData/mlcpTest005.txt000066400000000000000000000032101277777236100254420ustar00rootroot00000000000000# MLCP Test 005 - size N - All dependent (1 rigid body) unilateral frictionless (full matrix) - positive violation (nothing to solve). 6 contacts per object, the 6 cardinal points. flags = SOLVER_GAUSS_SEIDEL total degrees of freedom = 6 number of constraints = 6 number of constraint DOFs ("atomic constraints") = 6 constraint types = MLCP_UNILATERAL_3D_FRICTIONLESS_CONSTRAINT MLCP_UNILATERAL_3D_FRICTIONLESS_CONSTRAINT MLCP_UNILATERAL_3D_FRICTIONLESS_CONSTRAINT MLCP_UNILATERAL_3D_FRICTIONLESS_CONSTRAINT MLCP_UNILATERAL_3D_FRICTIONLESS_CONSTRAINT MLCP_UNILATERAL_3D_FRICTIONLESS_CONSTRAINT E = ( 1.8882351809998226 2.0869967789998038 0.9938079899999066 2.98142396999972 1.9379255804998179 2.0373063794998085) HCHt = ( ( 3.47530864197531e-009 -1.4753086419753095e-009 7.530864197530866e-010 1.2469135802469138e-009 9.8765432098765449e-010 1.0123456790123461e-009) ( -1.4753086419753095e-009 3.47530864197531e-009 1.2469135802469138e-009 7.530864197530866e-010 1.0123456790123461e-009 9.8765432098765449e-010) ( 7.530864197530866e-010 1.2469135802469138e-009 1.0308641975308644e-009 9.6913580246913612e-010 8.7654320987654348e-010 1.1234567901234571e-009) ( 1.2469135802469138e-009 7.530864197530866e-010 9.6913580246913612e-010 1.0308641975308644e-009 1.1234567901234571e-009 8.7654320987654348e-010) ( 9.8765432098765449e-010 1.0123456790123461e-009 8.7654320987654348e-010 1.1234567901234571e-009 3.4938271604938288e-009 -1.493827160493828e-009) ( 1.0123456790123461e-009 9.8765432098765449e-010 1.1234567901234571e-009 8.7654320987654348e-010 -1.493827160493828e-009 3.4938271604938288e-009) ) friction = ( 0 0 0 0 0 0) lambda = ( 0 0 0 0 0 0) == END == opensurgsim-0.7.0/SurgSim/Math/UnitTests/MlcpTestData/mlcpTest006.txt000066400000000000000000000033011277777236100254440ustar00rootroot00000000000000# MLCP Test 006 - size N - All independent (N rigid bodies) unilateral frictionless (diagonal block (1) matrix = diagonal matrix). 1 contact per object, the deepest point penetrated. flags = SOLVER_GAUSS_SEIDEL total degrees of freedom = 60 number of constraints = 10 number of constraint DOFs ("atomic constraints") = 10 constraint types = MLCP_UNILATERAL_3D_FRICTIONLESS_CONSTRAINT MLCP_UNILATERAL_3D_FRICTIONLESS_CONSTRAINT MLCP_UNILATERAL_3D_FRICTIONLESS_CONSTRAINT MLCP_UNILATERAL_3D_FRICTIONLESS_CONSTRAINT MLCP_UNILATERAL_3D_FRICTIONLESS_CONSTRAINT MLCP_UNILATERAL_3D_FRICTIONLESS_CONSTRAINT MLCP_UNILATERAL_3D_FRICTIONLESS_CONSTRAINT MLCP_UNILATERAL_3D_FRICTIONLESS_CONSTRAINT MLCP_UNILATERAL_3D_FRICTIONLESS_CONSTRAINT MLCP_UNILATERAL_3D_FRICTIONLESS_CONSTRAINT E = ( -0.0020000000000000018 -0.0040000000000000036 -0.0060000000000000053 -0.0080000000000000071 -0.010000000000000009 -0.012000000000000011 -0.014000000000000012 -0.016000000000000014 -0.018000000000000016 -0.020000000000000018) HCHt = ( ( 1.0000000000000001e-009 0 0 0 0 0 0 0 0 0) ( 0 1.0000000000000001e-009 0 0 0 0 0 0 0 0) ( 0 0 1.0000000000000001e-009 0 0 0 0 0 0 0) ( 0 0 0 1.0000000000000001e-009 0 0 0 0 0 0) ( 0 0 0 0 1.0000000000000001e-009 0 0 0 0 0) ( 0 0 0 0 0 1.0000000000000001e-009 0 0 0 0) ( 0 0 0 0 0 0 1.0000000000000001e-009 0 0 0) ( 0 0 0 0 0 0 0 1.0000000000000001e-009 0 0) ( 0 0 0 0 0 0 0 0 1.0000000000000001e-009 0) ( 0 0 0 0 0 0 0 0 0 1.0000000000000001e-009) ) friction = ( 0 0 0 0 0 0 0 0 0 0) lambda = ( 2000000.0000000016 4000000.0000000033 6000000.0000000047 8000000.0000000065 10000000.000000007 12000000.000000009 14000000.000000011 16000000.000000013 18000000.000000015 20000000.000000015) == END == opensurgsim-0.7.0/SurgSim/Math/UnitTests/MlcpTestData/mlcpTest007.txt000066400000000000000000000032111277777236100254450ustar00rootroot00000000000000# MLCP Test 007 - size N - All dependent (1 rigid body) unilateral frictionless (full matrix). 6 contacts per object, the 6 cardinal points in local frame. flags = SOLVER_GAUSS_SEIDEL total degrees of freedom = 6 number of constraints = 6 number of constraint DOFs ("atomic constraints") = 6 constraint types = MLCP_UNILATERAL_3D_FRICTIONLESS_CONSTRAINT MLCP_UNILATERAL_3D_FRICTIONLESS_CONSTRAINT MLCP_UNILATERAL_3D_FRICTIONLESS_CONSTRAINT MLCP_UNILATERAL_3D_FRICTIONLESS_CONSTRAINT MLCP_UNILATERAL_3D_FRICTIONLESS_CONSTRAINT MLCP_UNILATERAL_3D_FRICTIONLESS_CONSTRAINT E = ( 0.89061920100000957 1.0893807989999909 -0.0038079899999064557 1.9838079899999068 0.94030960050000489 1.0396903994999955) HCHt = ( ( 3.47530864197531e-009 -1.4753086419753095e-009 7.530864197530866e-010 1.2469135802469138e-009 9.8765432098765449e-010 1.0123456790123461e-009) ( -1.4753086419753095e-009 3.47530864197531e-009 1.2469135802469138e-009 7.530864197530866e-010 1.0123456790123461e-009 9.8765432098765449e-010) ( 7.530864197530866e-010 1.2469135802469138e-009 1.0308641975308644e-009 9.6913580246913612e-010 8.7654320987654348e-010 1.1234567901234571e-009) ( 1.2469135802469138e-009 7.530864197530866e-010 9.6913580246913612e-010 1.0308641975308644e-009 1.1234567901234571e-009 8.7654320987654348e-010) ( 9.8765432098765449e-010 1.0123456790123461e-009 8.7654320987654348e-010 1.1234567901234571e-009 3.4938271604938288e-009 -1.4938271604938272e-009) ( 1.0123456790123461e-009 9.8765432098765449e-010 1.1234567901234571e-009 8.7654320987654348e-010 -1.4938271604938272e-009 3.4938271604938267e-009) ) friction = ( 0 0 0 0 0 0) lambda = ( 0 0 3693978.323262549 0 0 0) == END == opensurgsim-0.7.0/SurgSim/Math/UnitTests/MlcpTestData/mlcpTest008.txt000066400000000000000000000112221277777236100254470ustar00rootroot00000000000000# MLCP Test 008 - size 2N - All dependent (1 rigid body) unilateral frictionless (full matrix). 2x6 contacts per object, the 6 cardinal points in local frame against 2 convex planes. flags = SOLVER_GAUSS_SEIDEL total degrees of freedom = 6 number of constraints = 12 number of constraint DOFs ("atomic constraints") = 12 constraint types = MLCP_UNILATERAL_3D_FRICTIONLESS_CONSTRAINT MLCP_UNILATERAL_3D_FRICTIONLESS_CONSTRAINT MLCP_UNILATERAL_3D_FRICTIONLESS_CONSTRAINT MLCP_UNILATERAL_3D_FRICTIONLESS_CONSTRAINT MLCP_UNILATERAL_3D_FRICTIONLESS_CONSTRAINT MLCP_UNILATERAL_3D_FRICTIONLESS_CONSTRAINT MLCP_UNILATERAL_3D_FRICTIONLESS_CONSTRAINT MLCP_UNILATERAL_3D_FRICTIONLESS_CONSTRAINT MLCP_UNILATERAL_3D_FRICTIONLESS_CONSTRAINT MLCP_UNILATERAL_3D_FRICTIONLESS_CONSTRAINT MLCP_UNILATERAL_3D_FRICTIONLESS_CONSTRAINT MLCP_UNILATERAL_3D_FRICTIONLESS_CONSTRAINT E = ( 0.73543550676819003 1.127667777044558 -0.049029033784546046 1.9121323175972942 0.93155164190637407 0.93155164190637407 1.127667777044558 0.73543550676819003 -0.049029033784546046 1.9121323175972942 0.93155164190637407 0.93155164190637407) HCHt = ( ( 3.4004457081380151e-009 -1.4024437101360178e-009 5.1871205717359543e-010 1.4792899408284021e-009 9.9900099900099875e-010 9.9900099900099875e-010 3.3235994774456308e-009 -1.4792899408284023e-009 1.4024437101360176e-009 4.4186582648121088e-010 9.2215476830861419e-010 9.2215476830861419e-010) ( -1.4024437101360178e-009 3.4004457081380151e-009 1.4792899408284021e-009 5.1871205717359543e-010 9.9900099900099875e-010 9.9900099900099875e-010 -1.4792899408284023e-009 3.3235994774456308e-009 4.4186582648121088e-010 1.4024437101360176e-009 9.2215476830861419e-010 9.2215476830861419e-010) ( 5.1871205717359543e-010 1.4792899408284021e-009 1.0950587873664794e-009 9.0294321063551812e-010 9.9900099900099875e-010 9.9900099900099875e-010 4.4186582648121098e-010 1.4024437101360174e-009 8.2609697994313357e-010 1.0182125566740949e-009 9.2215476830861419e-010 9.2215476830861419e-010) ( 1.4792899408284021e-009 5.1871205717359543e-010 9.0294321063551812e-010 1.0950587873664794e-009 9.9900099900099875e-010 9.9900099900099875e-010 1.4024437101360174e-009 4.4186582648121098e-010 1.0182125566740949e-009 8.2609697994313357e-010 9.2215476830861419e-010 9.2215476830861419e-010) ( 9.9900099900099875e-010 9.9900099900099875e-010 9.9900099900099875e-010 9.9900099900099875e-010 3.4965034965034959e-009 -1.4985014985014984e-009 9.2215476830861419e-010 9.2215476830861419e-010 9.2215476830861419e-010 9.2215476830861419e-010 3.22754168908015e-009 -1.3832321524629216e-009) ( 9.9900099900099875e-010 9.9900099900099875e-010 9.9900099900099875e-010 9.9900099900099875e-010 -1.4985014985014984e-009 3.4965034965034959e-009 9.2215476830861419e-010 9.2215476830861419e-010 9.2215476830861419e-010 9.2215476830861419e-010 -1.3832321524629216e-009 3.22754168908015e-009) ( 3.3235994774456308e-009 -1.4792899408284023e-009 4.4186582648121098e-010 1.4024437101360174e-009 9.2215476830861419e-010 9.2215476830861419e-010 3.4004457081380151e-009 -1.4024437101360178e-009 1.4792899408284021e-009 5.1871205717359543e-010 9.9900099900099875e-010 9.9900099900099875e-010) ( -1.4792899408284023e-009 3.3235994774456308e-009 1.4024437101360174e-009 4.4186582648121098e-010 9.2215476830861419e-010 9.2215476830861419e-010 -1.4024437101360178e-009 3.4004457081380151e-009 5.1871205717359543e-010 1.4792899408284021e-009 9.9900099900099875e-010 9.9900099900099875e-010) ( 1.4024437101360176e-009 4.4186582648121088e-010 8.2609697994313357e-010 1.0182125566740949e-009 9.2215476830861419e-010 9.2215476830861419e-010 1.4792899408284021e-009 5.1871205717359543e-010 1.0950587873664794e-009 9.0294321063551812e-010 9.9900099900099875e-010 9.9900099900099875e-010) ( 4.4186582648121088e-010 1.4024437101360176e-009 1.0182125566740949e-009 8.2609697994313357e-010 9.2215476830861419e-010 9.2215476830861419e-010 5.1871205717359543e-010 1.4792899408284021e-009 9.0294321063551812e-010 1.0950587873664794e-009 9.9900099900099875e-010 9.9900099900099875e-010) ( 9.2215476830861419e-010 9.2215476830861419e-010 9.2215476830861419e-010 9.2215476830861419e-010 3.22754168908015e-009 -1.3832321524629216e-009 9.9900099900099875e-010 9.9900099900099875e-010 9.9900099900099875e-010 9.9900099900099875e-010 3.4965034965034959e-009 -1.4985014985014984e-009) ( 9.2215476830861419e-010 9.2215476830861419e-010 9.2215476830861419e-010 9.2215476830861419e-010 -1.3832321524629216e-009 3.22754168908015e-009 9.9900099900099875e-010 9.9900099900099875e-010 9.9900099900099875e-010 9.9900099900099875e-010 -1.4985014985014984e-009 3.4965034965034959e-009) ) friction = ( 0 0 0 0 0 0 0 0 0 0 0 0) lambda = ( 0 0 25520594.196313217 0 0 0 0 0 25520591.510731984 0 0 0) == END == opensurgsim-0.7.0/SurgSim/Math/UnitTests/MlcpTestData/mlcpTest009.txt000066400000000000000000000046141277777236100254570ustar00rootroot00000000000000# MLCP Test 009 - size N - dependent Bilateral3D + unilateral frictionless (full matrix) - 1 rigid body + 1 fem3d linked together, rigid body colliding with plane flags = SOLVER_GAUSS_SEIDEL SOLVER_GAUSS_SEIDEL total degrees of freedom = 654 number of constraints = 7 number of constraint DOFs ("atomic constraints") = 9 constraint types = MLCP_UNILATERAL_3D_FRICTIONLESS_CONSTRAINT MLCP_UNILATERAL_3D_FRICTIONLESS_CONSTRAINT MLCP_UNILATERAL_3D_FRICTIONLESS_CONSTRAINT MLCP_UNILATERAL_3D_FRICTIONLESS_CONSTRAINT MLCP_UNILATERAL_3D_FRICTIONLESS_CONSTRAINT MLCP_UNILATERAL_3D_FRICTIONLESS_CONSTRAINT MLCP_BILATERAL_3D_CONSTRAINT E = ( 0.90998999999999997 0.90998999999999997 -0.090009999999999923 1.9099900000000001 0.90998999999999997 0.90998999999999997 9.9999999999961231e-006 -9.9999999999961231e-006 1.0000000000010001e-005) HCHt = ( ( 1.0250000000000001e-007 9.7500000000000006e-008 1.0000000000000001e-007 1.0000000000000001e-007 1.0000000000000001e-007 1.0000000000000001e-007 0 1.0000000000000001e-007 0) ( 9.7500000000000006e-008 1.0250000000000001e-007 1.0000000000000001e-007 1.0000000000000001e-007 1.0000000000000001e-007 1.0000000000000001e-007 0 1.0000000000000001e-007 0) ( 1.0000000000000001e-007 1.0000000000000001e-007 1.0000000000000001e-007 1.0000000000000001e-007 1.0000000000000001e-007 1.0000000000000001e-007 0 1.0000000000000001e-007 0) ( 1.0000000000000001e-007 1.0000000000000001e-007 1.0000000000000001e-007 1.0000000000000001e-007 1.0000000000000001e-007 1.0000000000000001e-007 0 1.0000000000000001e-007 0) ( 1.0000000000000001e-007 1.0000000000000001e-007 1.0000000000000001e-007 1.0000000000000001e-007 1.0250000000000001e-007 9.7500000000000006e-008 0 1.0000000000000001e-007 0) ( 1.0000000000000001e-007 1.0000000000000001e-007 1.0000000000000001e-007 1.0000000000000001e-007 9.7500000000000006e-008 1.0250000000000001e-007 0 1.0000000000000001e-007 0) ( 0 0 0 0 0 0 3.7980968564082065e-006 3.1102531565232793e-009 -1.0190003838823684e-008) ( 1.0000000000000001e-007 1.0000000000000001e-007 1.0000000000000001e-007 1.0000000000000001e-007 1.0000000000000001e-007 1.0000000000000001e-007 3.1102531565232789e-009 3.5138140462957323e-006 4.3038176725570532e-010) ( 0 0 0 0 0 0 -1.0190003838823735e-008 4.3038176725570671e-010 3.6670209077024139e-006) ) friction = ( 0 0 0 0 0 0 0 0 0) lambda = ( 0 0 926463.49146198574 0 0 0 18.957234335337965 -26363.491940144901 0.41983413283463433) == END == opensurgsim-0.7.0/SurgSim/Math/UnitTests/MockCapsule.h000066400000000000000000000044371277777236100227270ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_MATH_UNITTESTS_MOCKCAPSULE_H #define SURGSIM_MATH_UNITTESTS_MOCKCAPSULE_H #include "SurgSim/Math/Vector.h" #include "SurgSim/Math/RigidTransform.h" namespace SurgSim { namespace Math { /// MockCapsule class used in the unit tests. class MockCapsule { public: // Default constructor. MockCapsule() {} // Constructor. MockCapsule(const Vector3d& vertex0, const Vector3d& vertex1, double radius) : v0(vertex0), v1(vertex1), v0v1(vertex1 - vertex0), r(radius) {} // Move this capsule by the given vector. void translate(const Vector3d& v) { v0 += v; v1 += v; } // Rotate this capsule about the x-axis by the given angle. void rotateAboutXBy(double angle) { RigidTransform3d r(Eigen::AngleAxis(angle * (M_PI / 180.0), Vector3d(1, 0, 0))); v0 = r * v0; v1 = r * v1; } // Rotate this capsule about the y-axis by the given angle. void rotateAboutYBy(double angle) { SurgSim::Math::RigidTransform3d r(Eigen::AngleAxis(angle * (M_PI / 180.0), Vector3d(0, 1, 0))); v0 = r * v0; v1 = r * v1; } // Rotate this capsule about the z-axis by the given angle. void rotateAboutZBy(double angle) { SurgSim::Math::RigidTransform3d r(Eigen::AngleAxis(angle * (M_PI / 180.0), Vector3d(0, 0, 1))); v0 = r * v0; v1 = r * v1; } // Transform this capsule by the given matrix. void transform(SurgSim::Math::RigidTransform3d transform) { v0 = transform * v0; v1 = transform * v1; } // Vertices of this capsule. Vector3d v0; Vector3d v1; // Axis of this capsule. Vector3d v0v1; // Radius double r; }; } // namespace Math } // namespace SurgSim #endif // SURGSIM_MATH_UNITTESTS_MOCKCAPSULE_Hopensurgsim-0.7.0/SurgSim/Math/UnitTests/MockObject.h000066400000000000000000000200221277777236100225250ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_MATH_UNITTESTS_MOCKOBJECT_H #define SURGSIM_MATH_UNITTESTS_MOCKOBJECT_H #include #include "SurgSim/Math/OdeEquation.h" #include "SurgSim/Math/OdeSolver.h" #include "SurgSim/Math/OdeState.h" namespace SurgSim { namespace Math { class MassPointState : public OdeState { public: MassPointState() : OdeState() { setNumDof(3, 1); getPositions().setLinSpaced(1.0, 1.3); getVelocities().setLinSpaced(0.4, -0.3); } }; class MassPoint : public OdeEquation { public: /// Constructor /// \param viscosity The mass viscosity explicit MassPoint(double viscosity = 0.0) : m_mass(0.456), m_viscosity(viscosity), m_gravity(0.0, -9.81, 0.0) { m_f.resize(3); m_M.resize(3, 3); m_D.resize(3, 3); m_K.resize(3, 3); this->m_initialState = std::make_shared(); } void disableGravity() { m_gravity.setZero(); } Matrix applyCompliance(const OdeState& state, const Matrix& b) override { SURGSIM_ASSERT(m_odeSolver) << "Ode solver not initialized, it should have been initialized on wake-up"; Math::Matrix bTemp = b; for (auto condition : state.getBoundaryConditions()) { Math::zeroRow(condition, &bTemp); } auto solution = m_odeSolver->getLinearSolver()->solve(bTemp); for (auto condition : state.getBoundaryConditions()) { Math::zeroRow(condition, &solution); } return solution; } void setOdeSolver(std::shared_ptr solver) { m_odeSolver = solver; } /// Ode solver (its type depends on the numerical integration scheme) std::shared_ptr m_odeSolver; double m_mass, m_viscosity; Vector3d m_gravity; protected: void computeF(const OdeState& state) override { m_f = m_mass * m_gravity - m_viscosity * state.getVelocities(); } void computeM(const OdeState& state) override { m_M.setIdentity(); m_M *= m_mass; } void computeD(const OdeState& state) override { m_D.setIdentity(); m_D *= m_viscosity; } void computeK(const OdeState& state) override { m_K.setZero(); } void computeFMDK(const OdeState& state) override { m_M.setIdentity(); m_M *= m_mass; m_D.setIdentity(); m_D *= m_viscosity; m_K.setZero(); m_f = m_mass * m_gravity - m_viscosity * state.getVelocities(); } }; /// State class for static resolution /// It contains 3 nodes with 3 dofs each, with positions (0 0 0) (1 0 0) (2 0 0) and null velocities/accelerations class MassPointsStateForStatic : public OdeState { public: MassPointsStateForStatic() : OdeState() { setNumDof(3, 3); getPositions().segment<3>(3) = Vector3d(1.0, 0.0, 0.0); getPositions().segment<3>(6) = Vector3d(2.0, 0.0, 0.0); } }; // Model of 3 nodes connected by springs with the 1st node fixed (no mass, no damping, only deformations) class MassPointsForStatic : public SurgSim::Math::OdeEquation { public: /// Constructor MassPointsForStatic() : m_gravityForce(9) { m_f.resize(9); m_M.resize(9, 9); m_D.resize(9, 9); m_K.resize(9, 9); m_f.setZero(); m_K.setZero(); m_gravityForce.setZero(); m_gravityForce.segment<3>(3) = Vector3d(0.0, 0.01 * -9.81, 0.0); m_gravityForce.segment<3>(6) = Vector3d(0.0, 0.01 * -9.81, 0.0); this->m_initialState = std::make_shared(); } const Vector& getExternalForces() const { return m_gravityForce; } Matrix applyCompliance(const OdeState& state, const Matrix& b) override { SURGSIM_ASSERT(m_odeSolver) << "Ode solver not initialized, it should have been initialized on wake-up"; Math::Matrix bTemp = b; for (auto condition : state.getBoundaryConditions()) { Math::zeroRow(condition, &bTemp); } auto solution = m_odeSolver->getLinearSolver()->solve(bTemp); for (auto condition : state.getBoundaryConditions()) { Math::zeroRow(condition, &solution); } return solution; } void setOdeSolver(std::shared_ptr solver) { m_odeSolver = solver; } protected: void computeF(const OdeState& state) override { computeK(state); // Internal deformation forces m_f = -m_K * (state.getPositions() - m_initialState->getPositions()); // Gravity pulling on the free nodes m_f += m_gravityForce; } void computeM(const OdeState& state) override { m_M.setZero(); } void computeD(const OdeState& state) override { m_D.setZero(); } void computeK(const OdeState& state) override { // A fake but valid stiffness matrix (node 0 fixed) // Desired matrix is: // // 1 0 0 0 0 0 0 0 0 // 0 1 0 0 0 0 0 0 0 // 0 0 1 0 0 0 0 0 0 // 0 0 0 10 2 2 2 2 2 // 0 0 0 2 10 2 2 2 2 // 0 0 0 2 2 10 2 2 2 // 0 0 0 2 2 2 10 2 2 // 0 0 0 2 2 2 2 10 2 // 0 0 0 2 2 2 2 2 10 // // Generate it using sparse matrix notation. m_K.resize(9, 9); typedef Eigen::Triplet T; std::vector tripletList; tripletList.reserve(39); // Upper 3x3 identity block for (int counter = 0; counter < 3; ++counter) { tripletList.push_back(T(counter, counter, 1.0)); } for (int row = 3; row < 9; ++row) { // Diagonal is 8 more than the rest of the 6x6 block tripletList.push_back(T(row, row, 8.0)); // Now add in the 2's over the entire block for (int col = 3; col < 9; ++col) { tripletList.push_back(T(row, col, 2.0)); } } m_K.setFromTriplets(tripletList.begin(), tripletList.end()); } void computeFMDK(const OdeState& state) override { computeF(state); computeM(state); computeD(state); computeK(state); } private: /// Ode solver (its type depends on the numerical integration scheme) std::shared_ptr m_odeSolver; Vector m_gravityForce; }; /// Class for the complex non-linear ODE a = x.v^2 class OdeComplexNonLinear : public OdeEquation { public: /// Constructor OdeComplexNonLinear() { m_f.resize(3); m_M.resize(3, 3); m_D.resize(3, 3); m_K.resize(3, 3); this->m_initialState = std::make_shared(); } Matrix applyCompliance(const OdeState& state, const Matrix& b) override { SURGSIM_ASSERT(m_odeSolver) << "Ode solver not initialized, it should have been initialized on wake-up"; Math::Matrix bTemp = b; for (auto condition : state.getBoundaryConditions()) { Math::zeroRow(condition, &bTemp); } auto solution = m_odeSolver->getLinearSolver()->solve(bTemp); for (auto condition : state.getBoundaryConditions()) { Math::zeroRow(condition, &solution); } return solution; } void setOdeSolver(std::shared_ptr solver) { m_odeSolver = solver; } protected: void computeF(const OdeState& state) override { double v2 = state.getVelocities().dot(state.getVelocities()); m_f = v2 * state.getPositions(); } void computeM(const OdeState& state) override { m_M.setIdentity(); } void computeD(const OdeState& state) override { m_D = 2.0 * state.getPositions() * state.getVelocities().transpose().sparseView(); } void computeK(const OdeState& state) override { m_K.resize(static_cast(state.getNumDof()), static_cast(state.getNumDof())); m_K.setIdentity(); m_K *= state.getVelocities().squaredNorm(); } void computeFMDK(const OdeState& state) override { computeF(state); computeM(state); computeD(state); computeK(state); } private: /// Ode solver (its type depends on the numerical integration scheme) std::shared_ptr m_odeSolver; }; }; // Math }; // SurgSim #endif // SURGSIM_MATH_UNITTESTS_MOCKOBJECT_H opensurgsim-0.7.0/SurgSim/Math/UnitTests/MockTriangle.h000066400000000000000000000054661277777236100231030ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_MATH_UNITTESTS_MOCKTRIANGLE_H #define SURGSIM_MATH_UNITTESTS_MOCKTRIANGLE_H #include "SurgSim/Math/Vector.h" #include "SurgSim/Math/RigidTransform.h" namespace SurgSim { namespace Math { /// MockTriangle class used in the unit tests. class MockTriangle { public: // Default constructor. MockTriangle() {} // Constructor. MockTriangle(const Vector3d& vertex0, const Vector3d& vertex1, const Vector3d& vertex2) : v0(vertex0), v1(vertex1), v2(vertex2), v0v1(vertex1 - vertex0), v0v2(vertex2 - vertex0), v1v2(vertex2 - vertex1) { n = v0v1.cross(v0v2); n.normalize(); } // Find a point inside the triangle, given a pair of scaling factor for the edges (v0v1 and v0v2). Vector3d pointInTriangle(double a, double b) const { return v0 + a * v0v1 + b * v0v2; } // Move this triangle by the given vector. void translate(const Vector3d& v) { v0 += v; v1 += v; v2 += v; } // Rotate this triangle about the x-axis by the given angle. void rotateAboutXBy(double angle) { RigidTransform3d r(Eigen::AngleAxis(angle * (M_PI / 180.0), Vector3d(1, 0, 0))); v0 = r * v0; v1 = r * v1; v2 = r * v2; n = r * n; } // Rotate this triangle about the y-axis by the given angle. void rotateAboutYBy(double angle) { SurgSim::Math::RigidTransform3d r(Eigen::AngleAxis(angle * (M_PI / 180.0), Vector3d(0, 1, 0))); v0 = r * v0; v1 = r * v1; v2 = r * v2; n = r * n; } // Rotate this triangle about the z-axis by the given angle. void rotateAboutZBy(double angle) { SurgSim::Math::RigidTransform3d r(Eigen::AngleAxis(angle * (M_PI / 180.0), Vector3d(0, 0, 1))); v0 = r * v0; v1 = r * v1; v2 = r * v2; n = r * n; } // Transform this triangle by the given matrix. void transform(SurgSim::Math::RigidTransform3d transform) { v0 = transform * v0; v1 = transform * v1; v2 = transform * v2; n = transform.linear() * n; } // Vertices of this triangle. Vector3d v0; Vector3d v1; Vector3d v2; // Edges of this triangle. Vector3d v0v1; Vector3d v0v2; Vector3d v1v2; // Normal of the triangle. Vector3d n; }; } // namespace Math } // namespace SurgSim #endif // SURGSIM_MATH_UNITTESTS_MOCKTRIANGLE_Hopensurgsim-0.7.0/SurgSim/Math/UnitTests/OdeEquationTests.cpp000066400000000000000000000102461277777236100243070ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the class OdeSolverEulerExplicitModified. /// #include #include #include "SurgSim/Math/OdeEquation.h" #include "SurgSim/Math/UnitTests/MockObject.h" using SurgSim::Math::MassPoint; using SurgSim::Math::MassPointState; TEST(OdeEquationTests, Constructor) { ASSERT_NO_THROW({MassPoint m;}); ASSERT_NO_THROW({MassPoint* m = new MassPoint; delete m;}); ASSERT_NO_THROW({MassPoint* m = new MassPoint[10]; delete [] m;}); ASSERT_NO_THROW({std::shared_ptr m = std::make_shared(); }); } TEST(OdeEquationTests, GetInitialStateTest) { MassPoint m; ASSERT_NE(nullptr, m.getInitialState()); EXPECT_EQ(3, m.getInitialState()->getPositions().size()); EXPECT_EQ(3, m.getInitialState()->getVelocities().size()); SurgSim::Math::Vector3d expectedX = SurgSim::Math::Vector3d::LinSpaced(1.0, 1.3); EXPECT_TRUE(m.getInitialState()->getPositions().isApprox(expectedX)); SurgSim::Math::Vector3d expectedV = SurgSim::Math::Vector3d::LinSpaced(0.4, -0.3); EXPECT_TRUE(m.getInitialState()->getVelocities().isApprox(expectedV)); } TEST(OdeEquationTests, ComputesTest) { { SCOPED_TRACE("OdeEquationTests computes tests with 0 viscosity"); MassPoint m; MassPointState state; state.getPositions() = SurgSim::Math::Vector3d(1.0, 1.0, 1.0); state.getVelocities() = SurgSim::Math::Vector3d(1.0, 1.0, 1.0); SurgSim::Math::Vector3d expectedF = m.m_gravity * m.m_mass; SurgSim::Math::Matrix33d expectedM = m.m_mass * SurgSim::Math::Matrix33d::Identity(); SurgSim::Math::Matrix33d expectedD = SurgSim::Math::Matrix33d::Zero(); SurgSim::Math::Matrix33d expectedK = SurgSim::Math::Matrix33d::Zero(); m.updateFMDK(state, SurgSim::Math::ODEEQUATIONUPDATE_F); EXPECT_TRUE(m.getF().isApprox(expectedF)); m.updateFMDK(state, SurgSim::Math::ODEEQUATIONUPDATE_M); EXPECT_TRUE(m.getM().isApprox(expectedM)); m.updateFMDK(state, SurgSim::Math::ODEEQUATIONUPDATE_D); EXPECT_TRUE(m.getD().isApprox(expectedD)); m.updateFMDK(state, SurgSim::Math::ODEEQUATIONUPDATE_K); EXPECT_TRUE(m.getK().isApprox(expectedK)); { m.updateFMDK(state, SurgSim::Math::ODEEQUATIONUPDATE_FMDK); EXPECT_TRUE(m.getF().isApprox(expectedF)); EXPECT_TRUE(m.getM().isApprox(expectedM)); EXPECT_TRUE(m.getD().isApprox(expectedD)); EXPECT_TRUE(m.getK().isApprox(expectedK)); } } { SCOPED_TRACE("OdeEquationTests computes tests with non 0 viscosity"); MassPoint m(0.1); MassPointState state; state.getPositions() = SurgSim::Math::Vector3d(1.0, 1.0, 1.0); state.getVelocities() = SurgSim::Math::Vector3d(1.0, 1.0, 1.0); SurgSim::Math::Vector3d expectedF = m.m_gravity * m.m_mass - 0.1 * state.getVelocities(); SurgSim::Math::Matrix33d expectedM = m.m_mass * SurgSim::Math::Matrix33d::Identity(); SurgSim::Math::Matrix33d expectedD = 0.1 * SurgSim::Math::Matrix33d::Identity(); SurgSim::Math::Matrix33d expectedK = SurgSim::Math::Matrix33d::Zero(); m.updateFMDK(state, SurgSim::Math::ODEEQUATIONUPDATE_F); EXPECT_TRUE(m.getF().isApprox(expectedF)); m.updateFMDK(state, SurgSim::Math::ODEEQUATIONUPDATE_M); EXPECT_TRUE(m.getM().isApprox(expectedM)); m.updateFMDK(state, SurgSim::Math::ODEEQUATIONUPDATE_D); EXPECT_TRUE(m.getD().isApprox(expectedD)); m.updateFMDK(state, SurgSim::Math::ODEEQUATIONUPDATE_K); EXPECT_TRUE(m.getK().isApprox(expectedK)); { m.updateFMDK(state, SurgSim::Math::ODEEQUATIONUPDATE_FMDK); EXPECT_TRUE(m.getF().isApprox(expectedF)); EXPECT_TRUE(m.getM().isApprox(expectedM)); EXPECT_TRUE(m.getD().isApprox(expectedD)); EXPECT_TRUE(m.getK().isApprox(expectedK)); } } } opensurgsim-0.7.0/SurgSim/Math/UnitTests/OdeSolverEulerExplicitModifiedTests.cpp000066400000000000000000000120041277777236100301260ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the class OdeSolverEulerExplicitModified. /// #include #include #include "SurgSim/Math/OdeSolverEulerExplicitModified.h" #include "SurgSim/Math/OdeSolverLinearEulerExplicitModified.h" #include "SurgSim/Math/UnitTests/MockObject.h" namespace SurgSim { namespace Math { namespace { template void doConstructorTest() { MassPoint m; ASSERT_NO_THROW({T solver(&m);}); } }; TEST(OdeSolverEulerExplicitModified, ConstructorTest) { { SCOPED_TRACE("EulerExplicitModified"); doConstructorTest(); } { SCOPED_TRACE("LinearEulerExplicitModified"); doConstructorTest(); } } namespace { template void doSolveTest(bool computeCompliance) { // Test 2 iterations because Linear solvers have a different algorithm on the 1st pass from the following passes. { MassPoint m; MassPointState defaultState, state0, state1, state2; auto solver = std::make_shared(&m); m.setOdeSolver(solver); // ma = mg <=> a = g // v(1) = g.dt + v(0) // x(1) = v(1).dt + x(0) ASSERT_NO_THROW({solver->solve(1e-3, state0, &state1, computeCompliance);}); EXPECT_EQ(defaultState, state0); EXPECT_NE(defaultState, state1); EXPECT_TRUE(state1.getVelocities().isApprox(m.m_gravity * 1e-3 + state0.getVelocities())); EXPECT_TRUE(state1.getPositions().isApprox(state1.getVelocities() * 1e-3 + state0.getPositions())); // v(2) = g.dt + v(1) // x(2) = v(2).dt + x(1) ASSERT_NO_THROW({solver->solve(1e-3, state1, &state2, computeCompliance);}); EXPECT_NE(defaultState, state1); EXPECT_NE(defaultState, state2); EXPECT_NE(state2, state1); EXPECT_TRUE(state2.getVelocities().isApprox(m.m_gravity * 1e-3 + state1.getVelocities())); EXPECT_TRUE(state2.getPositions().isApprox(state2.getVelocities() * 1e-3 + state1.getPositions())); } { MassPoint m(0.1); MassPointState defaultState, state0, state1, state2; auto solver = std::make_shared(&m); m.setOdeSolver(solver); // ma = mg - c.v <=> a = g - c/m.v // v(1) = (g - c/m.v).dt + v(0) // x(1) = v(1).dt + x(0) ASSERT_NO_THROW({solver->solve(1e-3, state0, &state1, computeCompliance);}); EXPECT_EQ(defaultState, state0); EXPECT_NE(defaultState, state1); Vector3d acceleration0 = m.m_gravity - 0.1 * state0.getVelocities() / m.m_mass; EXPECT_TRUE(state1.getVelocities().isApprox(acceleration0 * 1e-3 + state0.getVelocities())); EXPECT_TRUE(state1.getPositions().isApprox(state1.getVelocities() * 1e-3 + state0.getPositions())); // v(2) = (g - c/m.v).dt + v(1) // x(2) = v(2).dt + x(1) ASSERT_NO_THROW({solver->solve(1e-3, state1, &state2, computeCompliance);}); EXPECT_NE(defaultState, state1); EXPECT_NE(defaultState, state2); EXPECT_NE(state1, state2); Vector3d acceleration1 = m.m_gravity - 0.1 * state1.getVelocities() / m.m_mass; EXPECT_TRUE(state2.getVelocities().isApprox(acceleration1 * 1e-3 + state1.getVelocities())); EXPECT_TRUE(state2.getPositions().isApprox(state2.getVelocities() * 1e-3 + state1.getPositions())); } } }; TEST(OdeSolverEulerExplicitModified, SolveTest) { { SCOPED_TRACE("EulerExplicitModified computing the compliance matrix"); doSolveTest(true); } { SCOPED_TRACE("EulerExplicitModified not computing the compliance matrix"); doSolveTest(false); } { SCOPED_TRACE("LinearEulerExplicitModified computing the compliance matrix"); doSolveTest(true); } { SCOPED_TRACE("LinearEulerExplicitModified not computing the compliance matrix"); doSolveTest(false); } } namespace { template void doComputeMatricesTest() { MassPoint m; T solver(&m); MassPointState state; double dt = 1e-3; m.updateFMDK(state, SurgSim::Math::ODEEQUATIONUPDATE_M); Matrix expectedSystemMatrix = m.getM() / dt; EXPECT_NO_THROW(solver.computeMatrices(dt, state)); EXPECT_TRUE(solver.getSystemMatrix().isApprox(expectedSystemMatrix)); EXPECT_TRUE(solver.getComplianceMatrix().isApprox(expectedSystemMatrix.inverse())); } }; TEST(OdeSolverEulerExplicitModified, ComputeMatricesTest) { { SCOPED_TRACE("EulerExplicitModified"); doComputeMatricesTest(); } { SCOPED_TRACE("LinearEulerExplicitModified"); doComputeMatricesTest(); } } }; // Math }; // SurgSim opensurgsim-0.7.0/SurgSim/Math/UnitTests/OdeSolverEulerExplicitTests.cpp000066400000000000000000000115041277777236100264710ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the class OdeSolverEulerExplicit. /// #include #include #include "SurgSim/Math/OdeSolverEulerExplicit.h" #include "SurgSim/Math/OdeSolverLinearEulerExplicit.h" #include "SurgSim/Math/UnitTests/MockObject.h" namespace SurgSim { namespace Math { namespace { template void doConstructorTest() { MassPoint m; ASSERT_NO_THROW({T solver(&m);}); } }; TEST(OdeSolverEulerExplicit, ConstructorTest) { { SCOPED_TRACE("EulerExplicit"); doConstructorTest(); } { SCOPED_TRACE("LinearEulerExplicit"); doConstructorTest(); } } namespace { template void doSolveTest(bool computeCompliance) { // Test 2 iterations because Linear solvers have a different algorithm on the 1st pass from the following passes. { MassPoint m; MassPointState defaultState, state0, state1, state2; auto solver = std::make_shared(&m); m.setOdeSolver(solver); // ma = mg <=> a = g // v(1) = g.dt + v(0) // x(1) = v(0).dt + x(0) ASSERT_NO_THROW({solver->solve(1e-3, state0, &state1, computeCompliance);}); EXPECT_EQ(defaultState, state0); EXPECT_NE(defaultState, state1); EXPECT_TRUE(state1.getVelocities().isApprox(m.m_gravity * 1e-3 + state0.getVelocities())); EXPECT_TRUE(state1.getPositions().isApprox(state0.getVelocities() * 1e-3 + state0.getPositions())); // v(2) = g.dt + v(1) // x(2) = v(1).dt + x(1) ASSERT_NO_THROW({solver->solve(1e-3, state1, &state2, computeCompliance);}); EXPECT_NE(defaultState, state1); EXPECT_NE(defaultState, state2); EXPECT_NE(state2, state1); EXPECT_TRUE(state2.getVelocities().isApprox(m.m_gravity * 1e-3 + state1.getVelocities())); EXPECT_TRUE(state2.getPositions().isApprox(state1.getVelocities() * 1e-3 + state1.getPositions())); } { MassPoint m(0.1); MassPointState defaultState, state0, state1, state2; auto solver = std::make_shared(&m); m.setOdeSolver(solver); // ma = mg - c.v <=> a = g - c/m.v // v(1) = (g - c/m.v).dt + v(0) // x(1) = v(0).dt + x(0) ASSERT_NO_THROW({solver->solve(1e-3, state0, &state1, computeCompliance);}); EXPECT_EQ(defaultState, state0); EXPECT_NE(defaultState, state1); Vector3d acceleration0 = m.m_gravity - 0.1 * state0.getVelocities() / m.m_mass; EXPECT_TRUE(state1.getVelocities().isApprox(acceleration0 * 1e-3 + state0.getVelocities())); EXPECT_TRUE(state1.getPositions().isApprox(state0.getVelocities() * 1e-3 + state0.getPositions())); // v(2) = (g - c/m.v).dt + v(1) // x(2) = v(1).dt + x(1) ASSERT_NO_THROW({solver->solve(1e-3, state1, &state2, computeCompliance);}); EXPECT_NE(defaultState, state1); EXPECT_NE(defaultState, state2); EXPECT_NE(state1, state2); Vector3d acceleration1 = m.m_gravity - 0.1 * state1.getVelocities() / m.m_mass; EXPECT_TRUE(state2.getVelocities().isApprox(acceleration1 * 1e-3 + state1.getVelocities())); EXPECT_TRUE(state2.getPositions().isApprox(state1.getVelocities() * 1e-3 + state1.getPositions())); } } }; TEST(OdeSolverEulerExplicit, SolveTest) { { SCOPED_TRACE("EulerExplicit computing the compliance matrix"); doSolveTest(true); } { SCOPED_TRACE("EulerExplicit not computing the compliance matrix"); doSolveTest(false); } { SCOPED_TRACE("LinearEulerExplicit computing the compliance matrix"); doSolveTest(true); } { SCOPED_TRACE("LinearEulerExplicit not computing the compliance matrix"); doSolveTest(false); } } namespace { template void doComputeMatricesTest() { MassPoint m; T solver(&m); MassPointState state; double dt = 1e-3; m.updateFMDK(state, ODEEQUATIONUPDATE_M); Matrix expectedSystemMatrix = m.getM() / dt; EXPECT_NO_THROW(solver.computeMatrices(dt, state)); EXPECT_TRUE(solver.getSystemMatrix().isApprox(expectedSystemMatrix)); EXPECT_TRUE(solver.getComplianceMatrix().isApprox(expectedSystemMatrix.inverse())); } }; TEST(OdeSolverEulerExplicit, ComputeMatricesTest) { { SCOPED_TRACE("EulerExplicit"); doComputeMatricesTest(); } { SCOPED_TRACE("LinearEulerExplicit"); doComputeMatricesTest(); } } }; // Math }; // SurgSim opensurgsim-0.7.0/SurgSim/Math/UnitTests/OdeSolverEulerImplicitTests.cpp000066400000000000000000000175561277777236100264770ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the class OdeSolverEulerImplicit. /// #include #include #include "SurgSim/Math/OdeSolverEulerImplicit.h" #include "SurgSim/Math/OdeSolverLinearEulerImplicit.h" #include "SurgSim/Math/UnitTests/MockObject.h" namespace SurgSim { namespace Math { namespace { template void doConstructorTest() { MassPoint m; ASSERT_NO_THROW({T solver(&m);}); } }; TEST(OdeSolverEulerImplicit, ConstructorTest) { { SCOPED_TRACE("EulerImplicit"); doConstructorTest(); } { SCOPED_TRACE("LinearEulerImplicit"); doConstructorTest(); } } namespace { template void doSolveTest(bool computeCompliance) { // Test 2 iterations because Linear solvers have a different algorithm on the 1st pass from the following passes. { MassPoint m; MassPointState defaultState, state0, state1, state2; auto solver = std::make_shared(&m); m.setOdeSolver(solver); solver->setNewtonRaphsonMaximumIteration(1); // ma = mg <=> a = g // v(1) = g.dt + v(0) // x(1) = v(1).dt + x(0) ASSERT_NO_THROW({solver->solve(1e-3, state0, &state1, computeCompliance);}); EXPECT_EQ(defaultState, state0); EXPECT_NE(defaultState, state1); EXPECT_TRUE(state1.getVelocities().isApprox(m.m_gravity * 1e-3 + state0.getVelocities())); EXPECT_TRUE(state1.getPositions().isApprox(state1.getVelocities() * 1e-3 + state0.getPositions())); // v(2) = g.dt + v(1) // x(2) = v(2).dt + x(1) ASSERT_NO_THROW({solver->solve(1e-3, state1, &state2, computeCompliance);}); EXPECT_NE(defaultState, state1); EXPECT_NE(defaultState, state2); EXPECT_NE(state2, state1); EXPECT_TRUE(state2.getVelocities().isApprox(m.m_gravity * 1e-3 + state1.getVelocities())); EXPECT_TRUE(state2.getPositions().isApprox(state2.getVelocities() * 1e-3 + state1.getPositions())); } { MassPoint m(0.1); MassPointState defaultState, state0, state1, state2; auto solver = std::make_shared(&m); m.setOdeSolver(solver); solver->setNewtonRaphsonMaximumIteration(1); // ma = mg - c.v <=> a = g - c/m.v // v(1) = (g - c/m.v(1)).dt + v(0) <=> v(1) = I.(1.0 + dt.c/m)^-1.(g.dt + v(0)) // x(1) = v(1).dt + x(0) ASSERT_NO_THROW({solver->solve(1e-3, state0, &state1, computeCompliance);}); EXPECT_EQ(defaultState, state0); EXPECT_NE(defaultState, state1); Matrix33d systemInverse = Matrix33d::Identity() * 1.0 / (1.0 + 1e-3 * 0.1 / m.m_mass); EXPECT_TRUE(state1.getVelocities().isApprox(systemInverse * (m.m_gravity * 1e-3 + state0.getVelocities()))); EXPECT_TRUE(state1.getPositions().isApprox(state1.getVelocities() * 1e-3 + state0.getPositions())); // v(2) = (g - c/m.v(2)).dt + v(1) <=> v(2) = I.(1.0 + dt.c/m)^-1.(g.dt + v(1)) // x(2) = v(2).dt + x(1) ASSERT_NO_THROW({solver->solve(1e-3, state1, &state2, computeCompliance);}); EXPECT_NE(defaultState, state1); EXPECT_NE(defaultState, state2); EXPECT_NE(state1, state2); EXPECT_TRUE(state2.getVelocities().isApprox(systemInverse * (m.m_gravity * 1e-3 + state1.getVelocities()))); EXPECT_TRUE(state2.getPositions().isApprox(state2.getVelocities() * 1e-3 + state1.getPositions())); } } }; TEST(OdeSolverEulerImplicit, SolveTest) { { SCOPED_TRACE("EulerImplicit computing the compliance matrix"); doSolveTest(true); } { SCOPED_TRACE("EulerImplicit not computing the compliance matrix"); doSolveTest(false); } { SCOPED_TRACE("LinearEulerImplicit computing the compliance matrix"); doSolveTest(true); } { SCOPED_TRACE("LinearEulerImplicit not computing the compliance matrix"); doSolveTest(false); } } namespace { template void doComplexNonLinearOdeTest(size_t numNewtonRaphsonIteration, bool expectExactSolution) { OdeComplexNonLinear odeEquation; MassPointState state0, state1, state2; state0.getPositions().setLinSpaced(1.4, 5.67); state0.getVelocities().setLinSpaced(-0.4, -0.3); double dt = 1e-3; auto solver = std::make_shared(&odeEquation); odeEquation.setOdeSolver(solver); solver->setNewtonRaphsonMaximumIteration(numNewtonRaphsonIteration); solver->setNewtonRaphsonEpsilonConvergence(1e-13); ASSERT_NO_THROW({solver->solve(dt, state0, &state1);}); // We do 2 iterations as Linear ode solver will do the 1st iteration as a normal non-linear ode solver ASSERT_NO_THROW({solver->solve(dt, state1, &state2);}); EXPECT_NE(state0, state1); EXPECT_NE(state1, state2); // The new state should verify the following equation: // {x(t+dt) = x(t) + dt.v(t+dt) // {v(t+dt) = v(t) + dt.M^-1.f(x(t+dt), v(t+dt)) // with the notes that M = Id and f(x,v)=x.v^2 // BUT the function f is non-linear enough that a single iteration of the Newton-Raphson won't produce // a solution close enough to the real solution of the problem. More iterations would be required to // refine the solution. auto xt = state1.getPositions(); auto vt = state1.getVelocities(); auto xt_plus_dt = state2.getPositions(); auto vt_plus_dt = state2.getVelocities(); odeEquation.updateFMDK(state2, ODEEQUATIONUPDATE_F); auto ft_plus_dt = odeEquation.getF(); Vector expectedVelocity = vt + dt * ft_plus_dt; // This is always true by construction EXPECT_TRUE(xt_plus_dt.isApprox(xt + dt * vt_plus_dt)); if (!expectExactSolution) { EXPECT_FALSE(xt_plus_dt.isApprox(xt + dt * expectedVelocity)); EXPECT_FALSE(vt_plus_dt.isApprox(expectedVelocity)); } else { EXPECT_TRUE(xt_plus_dt.isApprox(xt + dt * expectedVelocity)); EXPECT_TRUE(vt_plus_dt.isApprox(expectedVelocity)); } } }; TEST(OdeSolverEulerImplicit, VerifyComplexNonLinearOdeTest) { // OdeSolverEulerImplicit should succeed with enough number of Newton-Raphson iterations. { SCOPED_TRACE("A single Newton-Raphson iteration, using OdeSolverEulerImplicit"); doComplexNonLinearOdeTest(1, false); } { SCOPED_TRACE("Multiple Newton-Raphson iterations, using OdeSolverEulerImplicit"); doComplexNonLinearOdeTest(10, true); } // OdeSolverLinearEulerImplicit should fail no matter the number of Newton-Raphson iterations // it just does not handle non-linear problems. { SCOPED_TRACE("A single Newton-Raphson iteration, using OdeSolverLinearEulerImplicit"); doComplexNonLinearOdeTest(1, false); } { SCOPED_TRACE("Multiple Newton-Raphson iterations, using OdeSolverLinearEulerImplicit"); doComplexNonLinearOdeTest(10, false); } } namespace { template void doComputeMatricesTest() { MassPoint m; auto solver = std::make_shared(&m); m.setOdeSolver(solver); MassPointState state; double dt = 1e-3; m.updateFMDK(state, ODEEQUATIONUPDATE_M | ODEEQUATIONUPDATE_D | ODEEQUATIONUPDATE_K); Matrix expectedSystemMatrix = m.getM() / dt + m.getD() + dt * m.getK(); EXPECT_NO_THROW(solver->computeMatrices(dt, state)); EXPECT_TRUE(solver->getSystemMatrix().isApprox(expectedSystemMatrix)); EXPECT_TRUE(solver->getComplianceMatrix().isApprox(expectedSystemMatrix.inverse())); } }; TEST(OdeSolverEulerImplicit, ComputeMatricesTest) { { SCOPED_TRACE("EulerImplicit"); doComputeMatricesTest(); } { SCOPED_TRACE("LinearEulerImplicit"); doComputeMatricesTest(); } } }; // Math }; // SurgSim opensurgsim-0.7.0/SurgSim/Math/UnitTests/OdeSolverRungeKutta4Tests.cpp000066400000000000000000000232611277777236100260730ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file OdeSolverRungeKutta4Tests.cpp /// Tests for the class OdeSolverRungeKutta4. #include #include #include "SurgSim/Math/OdeSolverRungeKutta4.h" #include "SurgSim/Math/OdeSolverLinearRungeKutta4.h" #include "SurgSim/Math/UnitTests/MockObject.h" namespace SurgSim { namespace Math { namespace { template void doConstructorTest() { MassPoint m; ASSERT_NO_THROW({T solver(&m);}); } }; TEST(OdeSolverRungeKutta4, ConstructorTest) { { SCOPED_TRACE("OdeSolverRungeKutta4"); doConstructorTest(); } { SCOPED_TRACE("OdeSolverLinearRungeKutta4"); doConstructorTest(); } } namespace { struct RungeKuttaState { RungeKuttaState() {} RungeKuttaState(const Vector& p, const Vector& v) : position(p), velocity(v) {} Vector position; Vector velocity; }; struct RungeKuttaDerivedState { RungeKuttaDerivedState() {} RungeKuttaDerivedState(const Vector& v, const Vector& a) : velocity(v), acceleration(a) {} Vector velocity; Vector acceleration; }; void integrateRK4(double dt, const MassPoint& m, const RungeKuttaState& yn, RungeKuttaState* yn_plus_1) { RungeKuttaDerivedState k1, k2, k3, k4; // Problem to solve is // m.a = m.g - c.v which is an ode of order 2 that can be reduced to order 1 as following: // y' = (x)' = ( v ) = f(t, y) // (v) = (m.g/m - c.v/m) // In terms of (x), f(t, (x)) = (v) // (v) (v) (g - c.v/m) // Runge Kutta 4 computes y(n+1) = y(n) + 1/6.dt.(k1 + 2 * k2 + 2 * k3 + k4) // with k1 = f(t(n) , y(n) ) // with k2 = f(t(n) + dt/2, y(n) + k1 * dt/2) // with k3 = f(t(n) + dt/2, y(n) + k2 * dt/2) // with k4 = f(t(n) + dt , y(n) + k3 * dt ) // 1st evaluation k1 = f(t(n) , y(n) ) k1.velocity = yn.velocity; k1.acceleration = m.m_gravity - m.m_viscosity * yn.velocity / m.m_mass; // 2nd evaluation k2 = f(t(n) + dt/2, y(n) + k1 * dt/2) k2.velocity = yn.velocity + k1.acceleration * dt / 2.0; k2.acceleration = m.m_gravity - m.m_viscosity * (yn.velocity + k1.acceleration * dt / 2.0) / m.m_mass; // 3rd evaluation k3 = f(t(n) + dt/2, y(n) + k2 * dt/2) k3.velocity = yn.velocity + k2.acceleration * dt / 2.0; k3.acceleration = m.m_gravity - m.m_viscosity * (yn.velocity + k2.acceleration * dt / 2.0) / m.m_mass; // 4th evaluation k4 = f(t(n) + dt , y(n) + k3 * dt ) k4.velocity = yn.velocity + k3.acceleration * dt; k4.acceleration = m.m_gravity - m.m_viscosity * (yn.velocity + k3.acceleration * dt) / m.m_mass; yn_plus_1->position = yn.position + dt / 6.0 * (k1.velocity + k4.velocity + 2.0 * (k2.velocity + k3.velocity)); yn_plus_1->velocity = yn.velocity + dt / 6.0 * (k1.acceleration + k4.acceleration + 2.0 * (k2.acceleration + k3.acceleration)); } template void doSolveTest(bool computeCompliance) { Vector deltaWithoutViscosity; Vector deltaWithViscosity; double dt = 1e-3; // Test direction correctness of a moving point under gravity (no viscosity) { MassPoint m; MassPointState defaultState, currentState, newState; defaultState.getVelocities().setZero(); defaultState.getPositions().setZero(); currentState = defaultState; newState = defaultState; T solver(&m); ASSERT_NO_THROW({solver.solve(dt, currentState, &newState, computeCompliance);}); EXPECT_EQ(defaultState, currentState); EXPECT_NE(defaultState, newState); EXPECT_FALSE(newState.getVelocities().isZero()); EXPECT_DOUBLE_EQ(0.0, newState.getVelocities().dot(Vector3d::UnitX())); EXPECT_GT(0.0, newState.getVelocities().dot(Vector3d::UnitY())); EXPECT_DOUBLE_EQ(0.0, newState.getVelocities().dot(Vector3d::UnitZ())); EXPECT_FALSE(newState.getPositions().isZero()); deltaWithoutViscosity = (newState.getPositions() - currentState.getPositions()); EXPECT_DOUBLE_EQ(0.0, deltaWithoutViscosity.dot(Vector3d::UnitX())); EXPECT_GT(0.0, deltaWithoutViscosity.dot(Vector3d::UnitY())); EXPECT_DOUBLE_EQ(0.0, deltaWithoutViscosity.dot(Vector3d::UnitZ())); } // Test direction correctness of a moving point under gravity (viscosity) { MassPoint m(0.1); MassPointState defaultState, currentState, newState; defaultState.getVelocities().setZero(); defaultState.getPositions().setZero(); currentState = defaultState; newState = defaultState; T solver(&m); ASSERT_NO_THROW({solver.solve(dt, currentState, &newState, computeCompliance);}); EXPECT_EQ(defaultState, currentState); EXPECT_NE(defaultState, newState); EXPECT_FALSE(newState.getVelocities().isZero()); EXPECT_FALSE(newState.getVelocities().isApprox(currentState.getVelocities())); EXPECT_DOUBLE_EQ(currentState.getVelocities()[0], newState.getVelocities()[0]); EXPECT_NE(currentState.getVelocities()[1], newState.getVelocities()[1]); EXPECT_LT(newState.getVelocities()[1], currentState.getVelocities()[1]); EXPECT_DOUBLE_EQ(currentState.getVelocities()[2], newState.getVelocities()[2]); EXPECT_FALSE(newState.getPositions().isZero()); deltaWithViscosity = (newState.getPositions() - currentState.getPositions()); EXPECT_DOUBLE_EQ(0.0, deltaWithViscosity.dot(Vector3d::UnitX())); EXPECT_GT(0.0, deltaWithViscosity.dot(Vector3d::UnitY())); EXPECT_DOUBLE_EQ(0.0, deltaWithViscosity.dot(Vector3d::UnitZ())); } EXPECT_GT(deltaWithoutViscosity.norm(), deltaWithViscosity.norm()); // Test Runge Kutta 4 algorithm itself (without viscosity) // Test 2 iterations because Linear solvers have a different algorithm on the 1st pass from the following passes. { SCOPED_TRACE("RK4 without viscosity"); MassPoint m(0.0); MassPointState currentState, newState, newState2; currentState.getPositions().setLinSpaced(1.0, 3.0); currentState.getVelocities().setConstant(1.0); auto solver = std::make_shared(&m); m.setOdeSolver(solver); RungeKuttaState yn(currentState.getPositions(), currentState.getVelocities()); RungeKuttaState yn_plus_1, yn_plus_2; EXPECT_TRUE(currentState.getPositions().isApprox(yn.position)); EXPECT_TRUE(currentState.getVelocities().isApprox(yn.velocity)); // 1st time step integrateRK4(dt, m, yn, &yn_plus_1); ASSERT_NO_THROW({solver->solve(dt, currentState, &newState, computeCompliance);}); EXPECT_TRUE(newState.getPositions().isApprox(yn_plus_1.position)); EXPECT_TRUE(newState.getVelocities().isApprox(yn_plus_1.velocity)); // 2nd time step integrateRK4(dt, m, yn_plus_1, &yn_plus_2); ASSERT_NO_THROW({solver->solve(dt, newState, &newState2, computeCompliance);}); EXPECT_TRUE(newState2.getPositions().isApprox(yn_plus_2.position)); EXPECT_TRUE(newState2.getVelocities().isApprox(yn_plus_2.velocity)); } // Test Runge Kutta 4 algorithm itself (with viscosity) // Test 2 iterations because Linear solvers have a different algorithm on the 1st pass from the following passes. { SCOPED_TRACE("RK4 with viscosityof 0.1"); MassPoint m(0.1); MassPointState currentState, newState, newState2; currentState.getPositions().setLinSpaced(1.0, 3.0); currentState.getVelocities().setConstant(1.0); auto solver = std::make_shared(&m); m.setOdeSolver(solver); RungeKuttaState yn(currentState.getPositions(), currentState.getVelocities()); RungeKuttaState yn_plus_1, yn_plus_2; EXPECT_TRUE(currentState.getPositions().isApprox(yn.position)); EXPECT_TRUE(currentState.getVelocities().isApprox(yn.velocity)); // 1st time step integrateRK4(dt, m, yn, &yn_plus_1); ASSERT_NO_THROW({solver->solve(dt, currentState, &newState, computeCompliance);}); EXPECT_TRUE(newState.getPositions().isApprox(yn_plus_1.position)); EXPECT_TRUE(newState.getVelocities().isApprox(yn_plus_1.velocity)); // 2nd time step integrateRK4(dt, m, yn_plus_1, &yn_plus_2); ASSERT_NO_THROW({solver->solve(dt, newState, &newState2, computeCompliance);}); EXPECT_TRUE(newState2.getPositions().isApprox(yn_plus_2.position)); EXPECT_TRUE(newState2.getVelocities().isApprox(yn_plus_2.velocity)); } } }; TEST(OdeSolverRungeKutta4, SolveTest) { { SCOPED_TRACE("OdeSolverRungeKutta4 computing the compliance matrix"); doSolveTest(true); } { SCOPED_TRACE("OdeSolverRungeKutta4 not computing the compliance matrix"); doSolveTest(false); } { SCOPED_TRACE("OdeSolverLinearRungeKutta4 computing the compliance matrix"); doSolveTest(true); } { SCOPED_TRACE("OdeSolverLinearRungeKutta4 not computing the compliance matrix"); doSolveTest(false); } } namespace { template void doComputeMatricesTest() { MassPoint m; auto solver = std::make_shared(&m); m.setOdeSolver(solver); MassPointState state; double dt = 1e-3; m.updateFMDK(state, ODEEQUATIONUPDATE_M); Matrix expectedSystemMatrix = m.getM() / dt; EXPECT_NO_THROW(solver->computeMatrices(dt, state)); EXPECT_TRUE(solver->getSystemMatrix().isApprox(expectedSystemMatrix)); EXPECT_TRUE(solver->getComplianceMatrix().isApprox(expectedSystemMatrix.inverse())); } }; TEST(OdeSolverRungeKutta4, ComputeMatricesTest) { { SCOPED_TRACE("RungeKutta4"); doComputeMatricesTest(); } { SCOPED_TRACE("LinearRungeKutta4"); doComputeMatricesTest(); } } }; // Math }; // SurgSim opensurgsim-0.7.0/SurgSim/Math/UnitTests/OdeSolverStaticTests.cpp000066400000000000000000000064421277777236100251470ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the class OdeSolverStatic. /// #include #include #include "SurgSim/Math/OdeSolverStatic.h" #include "SurgSim/Math/OdeSolverLinearStatic.h" #include "SurgSim/Math/UnitTests/MockObject.h" namespace SurgSim { namespace Math { namespace { template void doConstructorTest() { MassPointsForStatic m; ASSERT_NO_THROW({T solver(&m);}); } }; TEST(OdeSolverStatic, ConstructorTest) { { SCOPED_TRACE("Static"); doConstructorTest(); } { SCOPED_TRACE("LinearStatic"); doConstructorTest(); } } namespace { template void doSolveTest(bool computeCompliance) { MassPointsForStatic m; MassPointsStateForStatic defaultState, currentState, newState; auto solver = std::make_shared(&m); EXPECT_NO_THROW(m.setOdeSolver(solver)); ASSERT_NO_THROW({solver->solve(1e-3, currentState, &newState, computeCompliance);}); EXPECT_EQ(defaultState, currentState); EXPECT_NE(defaultState, newState); // Solve manually K.(x - x0) = Fext Eigen::SparseLU eigenSolver; const Vector& Fext = m.getExternalForces(); m.updateFMDK(currentState, ODEEQUATIONUPDATE_K); eigenSolver.compute(m.getK()); Eigen::VectorXd expectedDeltaX = eigenSolver.solve(Fext); Vector expectedX = defaultState.getPositions() + expectedDeltaX; EXPECT_TRUE(newState.getPositions().isApprox(expectedX)); } }; TEST(OdeSolverStatic, SolveTest) { { SCOPED_TRACE("Static computing the compliance matrix"); doSolveTest(true); } { SCOPED_TRACE("Static not computing the compliance matrix"); doSolveTest(false); } { SCOPED_TRACE("LinearStatic computing the compliance matrix"); doSolveTest(true); } { SCOPED_TRACE("LinearStatic not computing the compliance matrix"); doSolveTest(false); } } namespace { template void doComputeMatricesTest() { MassPointsForStatic m; auto solver = std::make_shared(&m); EXPECT_NO_THROW(m.setOdeSolver(solver)); MassPointsStateForStatic state; double dt = 1e-3; m.updateFMDK(state, ODEEQUATIONUPDATE_K); Matrix expectedSystemMatrix = m.getK(); EXPECT_NO_THROW(solver->computeMatrices(dt, state)); EXPECT_TRUE(solver->getSystemMatrix().isApprox(expectedSystemMatrix)); EXPECT_TRUE(m.applyCompliance(state, Matrix::Identity(state.getNumDof(), state.getNumDof())).isApprox(expectedSystemMatrix.inverse())); } }; TEST(OdeSolverStatic, ComputeMatricesTest) { { SCOPED_TRACE("Static"); doComputeMatricesTest(); } { SCOPED_TRACE("LinearStatic"); doComputeMatricesTest(); } } }; // Math }; // SurgSim opensurgsim-0.7.0/SurgSim/Math/UnitTests/OdeSolverTests.cpp000066400000000000000000000045241277777236100237760ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the class OdeSolver. /// #include #include #include "SurgSim/Math/OdeSolver.h" #include "SurgSim/Math/UnitTests/MockObject.h" namespace SurgSim { namespace Math { namespace { const std::string name = "MockOdeSolver"; }; class MockOdeSolver : public OdeSolver { public: /// Constructor /// \param equation The ode equation to be solved explicit MockOdeSolver(OdeEquation* equation) : OdeSolver(equation) { this->m_name = name; } /// Virtual destructor virtual ~MockOdeSolver() { } void solve(double dt, const OdeState& currentState, OdeState* newState, bool computeCompliance = true) override { } void assembleLinearSystem(double dt, const OdeState& state, const OdeState& newState, bool computeRHS) override { } }; TEST(OdeSolver, ConstructorTest) { // OdeEquation is tested separately and is considered valid to use here. MassPoint m; std::shared_ptr solver; ASSERT_NO_THROW({solver = std::make_shared(&m); }); EXPECT_NE(nullptr, solver->getLinearSolver()); EXPECT_NE(nullptr, std::dynamic_pointer_cast(solver->getLinearSolver())); } TEST(OdeSolver, GetTest) { MassPoint m; MockOdeSolver solver(&m); EXPECT_EQ(name, solver.getName()); EXPECT_NE(nullptr, solver.getLinearSolver()); EXPECT_NE(nullptr, std::dynamic_pointer_cast(solver.getLinearSolver())); EXPECT_NO_THROW(solver.setLinearSolver(std::make_shared())); EXPECT_NE(nullptr, solver.getLinearSolver()); EXPECT_NE(nullptr, std::dynamic_pointer_cast(solver.getLinearSolver())); } }; // namespace Math }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Math/UnitTests/OdeStateTests.cpp000066400000000000000000000373171277777236100236120ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include "SurgSim/Math/OdeState.h" #include "SurgSim/Framework/Assert.h" using SurgSim::Math::OdeState; namespace { const double epsilon = 1e-10; }; TEST(OdeStateTest, ConstructorTest) { // Test the constructor normally ASSERT_NO_THROW({OdeState state;}); // Test the object creation through the operator new // Eigen needs special care with fixed-size matrix member variables of a class created dynamically via new. // We are using non fixed-size matrix, so it should be all fine...this is just to make sure. ASSERT_NO_THROW({OdeState* state = new OdeState; delete state; }); // Test the object creation through the operator new [] // Eigen needs special care with fixed-size matrix member variables of a class created dynamically via new []. // We are using non fixed-size matrix, so it should be all fine...this is just to make sure. ASSERT_NO_THROW({OdeState* state = new OdeState[10]; delete [] state; }); // Test the object creation through std::shared_ptr // Eigen needs special care with fixed-size matrix member variables of a class created dynamically via new. // We are using non fixed-size matrix, so it should be all fine...this is just to make sure. ASSERT_NO_THROW({std::shared_ptr state = std::make_shared();}); } TEST(OdeStateTest, AllocateTest) { OdeState state; EXPECT_EQ(0u, state.getNumDof()); EXPECT_EQ(0u, state.getNumNodes()); EXPECT_EQ(0u, state.getNumBoundaryConditions()); EXPECT_EQ(0, state.getBoundaryConditions().size()); EXPECT_EQ(0, state.getPositions().size()); EXPECT_EQ(0, state.getVelocities().size()); ASSERT_NO_THROW(state.setNumDof(3u, 3u)); EXPECT_EQ(9u, state.getNumDof()); EXPECT_EQ(3u, state.getNumNodes()); EXPECT_EQ(9, state.getPositions().size()); EXPECT_EQ(9, state.getVelocities().size()); EXPECT_EQ(0u , state.getNumBoundaryConditions()); EXPECT_EQ(0 , state.getBoundaryConditions().size()); } TEST(OdeStateTest, GetPositionsTest) { OdeState state1, state2; state1.setNumDof(3u, 3u); state2.setNumDof(3u, 3u); for (size_t i = 0; i < state1.getNumDof(); i++) { state1.getPositions()[i] = static_cast(i); state2.getPositions()[i] = 0.0; } // state1.m_x contains (0 1 2 3 4 5 6 7 8 9 10) & state2.m_x contains (0 0 0 0 0 0 0 0 0 0 0) EXPECT_NE(state2.getPositions(), state1.getPositions()); state2.getPositions() = state1.getPositions(); // state1.m_x contains (0 1 2 3 4 5 6 7 8 9 10) & state2.m_x contains (0 1 2 3 4 5 6 7 8 9 10) EXPECT_EQ(state2.getPositions(), state1.getPositions()); state1.reset(); // state1.m_x contains (0 0 0 0 0 0 0 0 0 0 0) & state2.m_x contains (0 1 2 3 4 5 6 7 8 9 10) for (size_t i = 0; i < state1.getNumDof(); i++) { EXPECT_EQ(0.0, state1.getPositions()[i]); EXPECT_EQ(static_cast(i), state2.getPositions()[i]); } state2.reset(); // state1.m_x contains (0 0 0 0 0 0 0 0 0 0 0) & state2.m_x contains (0 0 0 0 0 0 0 0 0 0 0) EXPECT_EQ(state2.getPositions(), state1.getPositions()); } TEST(OdeStateTest, GetVelocitiesTest) { OdeState state1, state2; state1.setNumDof(3u, 3u); state2.setNumDof(3u, 3u); for (size_t i = 0; i < state1.getNumDof(); i++) { state1.getVelocities()[i] = static_cast(i); state2.getVelocities()[i] = 0.0; } // state1.m_v contains (0 1 2 3 4 5 6 7 8 9 10) & state2.m_v contains (0 0 0 0 0 0 0 0 0 0 0) EXPECT_NE(state2.getVelocities(), state1.getVelocities()); state2.getVelocities() = state1.getVelocities(); // state1.m_v contains (0 1 2 3 4 5 6 7 8 9 10) & state2.m_v contains (0 1 2 3 4 5 6 7 8 9 10) EXPECT_EQ(state2.getVelocities(), state1.getVelocities()); state1.reset(); // state1.m_v contains (0 0 0 0 0 0 0 0 0 0 0) & state2.m_v contains (0 1 2 3 4 5 6 7 8 9 10) for (size_t i = 0; i < state1.getNumDof(); i++) { EXPECT_EQ(0.0, state1.getVelocities()[i]); EXPECT_EQ(static_cast(i), state2.getVelocities()[i]); } state2.reset(); // state1.m_v contains (0 0 0 0 0 0 0 0 0 0 0) & state2.m_v contains (0 0 0 0 0 0 0 0 0 0 0) EXPECT_EQ(state2.getVelocities(), state1.getVelocities()); } namespace { void testBoundaryConditions(const SurgSim::Math::OdeState& state, std::vector expectedDofIds) { EXPECT_EQ(6u, state.getNumDof()); EXPECT_EQ(expectedDofIds.size(), state.getNumBoundaryConditions()); ASSERT_EQ(expectedDofIds.size(), state.getBoundaryConditions().size()); for (size_t index = 0; index < expectedDofIds.size(); ++index) { EXPECT_EQ(expectedDofIds[index], state.getBoundaryConditions()[index]); } for (size_t dofId = 0; dofId < 6; dofId++) { if (std::find(expectedDofIds.begin(), expectedDofIds.end(), dofId) != expectedDofIds.end()) { EXPECT_TRUE(state.isBoundaryCondition(dofId)); } else { EXPECT_FALSE(state.isBoundaryCondition(dofId)); } } EXPECT_EQ(6, state.getPositions().size()); EXPECT_EQ(6, state.getVelocities().size()); EXPECT_TRUE(state.getPositions().isZero()); EXPECT_TRUE(state.getVelocities().isZero()); } }; // anonymous namespace TEST(OdeStateTest, AddGetIsBoundaryConditionsTest) { { OdeState state; std::vector expectedDofIdsBoundaryConditions; // Assert trying to add a boundary condition before setting the number of node and dof per node ASSERT_THROW(state.addBoundaryCondition(0u, 0u), SurgSim::Framework::AssertionFailure); state.setNumDof(3u, 2u); // Number of dof per node is 3 SCOPED_TRACE("Testing addBoundaryCondition(size_t nodeId, size_t dofId)"); state.addBoundaryCondition(0u, 0u); expectedDofIdsBoundaryConditions.push_back((0u * 3u + 0u)); // (node 0, dof 0) testBoundaryConditions(state, expectedDofIdsBoundaryConditions); state.addBoundaryCondition(1u, 2u); expectedDofIdsBoundaryConditions.push_back((1u * 3u + 2u)); // (node 1, dof 2) testBoundaryConditions(state, expectedDofIdsBoundaryConditions); state.addBoundaryCondition(0u, 2u); expectedDofIdsBoundaryConditions.push_back((0u * 3u + 2u)); // (node 0, dof 2) testBoundaryConditions(state, expectedDofIdsBoundaryConditions); // Assert on wrong nodeId ASSERT_THROW(state.addBoundaryCondition(3u, 0u), SurgSim::Framework::AssertionFailure); // Assert on wrong dofId ASSERT_THROW(state.addBoundaryCondition(0u, 4u), SurgSim::Framework::AssertionFailure); } { OdeState state; std::vector expectedDofIdsBoundaryConditions; // Assert trying to add a boundary condition before setting the number of node and dof per node ASSERT_THROW(state.addBoundaryCondition(0u), SurgSim::Framework::AssertionFailure); state.setNumDof(3u, 2u); // Number of dof per node is 3 SCOPED_TRACE("Testing addBoundaryCondition(size_t nodeId)"); state.addBoundaryCondition(0u); expectedDofIdsBoundaryConditions.push_back((0u * 3u + 0u)); // (node 0, dof 0) expectedDofIdsBoundaryConditions.push_back((0u * 3u + 1u)); // (node 0, dof 1) expectedDofIdsBoundaryConditions.push_back((0u * 3u + 2u)); // (node 0, dof 2) testBoundaryConditions(state, expectedDofIdsBoundaryConditions); // Assert on wrong nodeId ASSERT_THROW(state.addBoundaryCondition(3u), SurgSim::Framework::AssertionFailure); state.addBoundaryCondition(1u); expectedDofIdsBoundaryConditions.push_back((1u * 3u + 0u)); // (node 0, dof 0) expectedDofIdsBoundaryConditions.push_back((1u * 3u + 1u)); // (node 0, dof 1) expectedDofIdsBoundaryConditions.push_back((1u * 3u + 2u)); // (node 0, dof 2) testBoundaryConditions(state, expectedDofIdsBoundaryConditions); } } TEST(OdeStateTest, ResetTest) { OdeState state1, state2; state1.setNumDof(3u, 3u); state2.setNumDof(3u, 3u); for (size_t i = 0; i < state1.getNumDof(); i++) { state1.getPositions()[i] = static_cast(i); state1.getVelocities()[i] = 2.0 * static_cast(i); } state1.addBoundaryCondition(0u, 0u); state1.addBoundaryCondition(state1.getNumNodes() - 1u, 2u); EXPECT_NE(state2, state1); state1.reset(); EXPECT_EQ(state2, state1); EXPECT_EQ(9u, state1.getNumDof()); EXPECT_EQ(3u, state1.getNumNodes()); EXPECT_TRUE(state1.getPositions().isZero()); EXPECT_TRUE(state1.getVelocities().isZero()); EXPECT_EQ(0u, state1.getNumBoundaryConditions()); EXPECT_EQ(0, state1.getBoundaryConditions().size()); } TEST(OdeStateTest, CopyConstructorAndAssignmentTest) { OdeState state, stateAssigned; state.setNumDof(3u, 3u); for (size_t i = 0; i < state.getNumDof(); i++) { state.getPositions()[i] = static_cast(i); state.getVelocities()[i] = 2.0 * static_cast(i); } state.addBoundaryCondition(0u, 0u); state.addBoundaryCondition(state.getNumNodes() - 1u, 2u); { OdeState stateCopied(state); ASSERT_EQ(9u, stateCopied.getNumDof()); ASSERT_EQ(state.getNumDof(), stateCopied.getNumDof()); ASSERT_EQ(9, stateCopied.getPositions().size()); ASSERT_EQ(state.getPositions().size(), stateCopied.getPositions().size()); ASSERT_EQ(9, stateCopied.getVelocities().size()); ASSERT_EQ(state.getVelocities().size(), stateCopied.getVelocities().size()); for (size_t i = 0; i < stateCopied.getNumDof(); i++) { EXPECT_NEAR(state.getPositions()[i], stateCopied.getPositions()[i], epsilon); EXPECT_NEAR(static_cast(i), stateCopied.getPositions()[i], epsilon); EXPECT_NEAR(state.getVelocities()[i], stateCopied.getVelocities()[i], epsilon); EXPECT_NEAR(2.0 * static_cast(i), stateCopied.getVelocities()[i], epsilon); } ASSERT_EQ(2u, stateCopied.getNumBoundaryConditions()); ASSERT_EQ(state.getNumBoundaryConditions(), stateCopied.getNumBoundaryConditions()); ASSERT_EQ(2, stateCopied.getBoundaryConditions().size()); ASSERT_EQ(state.getBoundaryConditions().size(), stateCopied.getBoundaryConditions().size()); ASSERT_EQ(0u, stateCopied.getBoundaryConditions()[0]); ASSERT_EQ(state.getBoundaryConditions()[0], stateCopied.getBoundaryConditions()[0]); ASSERT_EQ(state.getNumDof() - 1, stateCopied.getBoundaryConditions()[1]); ASSERT_EQ(state.getBoundaryConditions()[1], stateCopied.getBoundaryConditions()[1]); } { stateAssigned = state; ASSERT_EQ(9u, stateAssigned.getNumDof()); ASSERT_EQ(state.getNumDof(), stateAssigned.getNumDof()); ASSERT_EQ(9, stateAssigned.getPositions().size()); ASSERT_EQ(state.getPositions().size(), stateAssigned.getPositions().size()); ASSERT_EQ(9, stateAssigned.getVelocities().size()); ASSERT_EQ(state.getVelocities().size(), stateAssigned.getVelocities().size()); for (size_t i = 0; i < stateAssigned.getNumDof(); i++) { EXPECT_NEAR(state.getPositions()[i], stateAssigned.getPositions()[i], epsilon); EXPECT_NEAR(static_cast(i), stateAssigned.getPositions()[i], epsilon); EXPECT_NEAR(state.getVelocities()[i], stateAssigned.getVelocities()[i], epsilon); EXPECT_NEAR(2.0 * static_cast(i), stateAssigned.getVelocities()[i], epsilon); } ASSERT_EQ(2u, stateAssigned.getNumBoundaryConditions()); ASSERT_EQ(state.getNumBoundaryConditions(), stateAssigned.getNumBoundaryConditions()); ASSERT_EQ(2, stateAssigned.getBoundaryConditions().size()); ASSERT_EQ(state.getBoundaryConditions().size(), stateAssigned.getBoundaryConditions().size()); ASSERT_EQ(0u, stateAssigned.getBoundaryConditions()[0]); ASSERT_EQ(state.getBoundaryConditions()[0], stateAssigned.getBoundaryConditions()[0]); ASSERT_EQ(state.getNumDof() - 1, stateAssigned.getBoundaryConditions()[1]); ASSERT_EQ(state.getBoundaryConditions()[1], stateAssigned.getBoundaryConditions()[1]); } } TEST(OdeStateTest, ApplyBoundaryConditionsToVectorTest) { OdeState state; state.setNumDof(3u, 3u); state.addBoundaryCondition(0u, 1u); state.addBoundaryCondition(state.getNumNodes() - 1u, 2u); SurgSim::Math::Vector F(state.getNumDof()); F.setLinSpaced(1.0, 2.0); SurgSim::Math::Vector initialF = F; state.applyBoundaryConditionsToVector(&F); EXPECT_FALSE(F.isApprox(initialF)); for (size_t dofId = 0; dofId < state.getNumDof(); ++dofId) { if (dofId == 1u || dofId == state.getNumDof() - 1u) { EXPECT_NE(initialF[dofId], F[dofId]); EXPECT_EQ(0u, F[dofId]); } else { EXPECT_EQ(initialF[dofId], F[dofId]); } } } TEST(OdeStateTest, ApplyBoundaryConditionsToMatrixTest) { OdeState state; state.setNumDof(3u, 3u); state.addBoundaryCondition(0u, 1u); state.addBoundaryCondition(state.getNumNodes() - 1u, 2u); size_t numDof = state.getNumDof(); SurgSim::Math::Matrix M = 2.0 * SurgSim::Math::Matrix::Ones(numDof, numDof); SurgSim::Math::Matrix initialM = M; SurgSim::Math::Matrix expectedM = M; for (int bcId = 0; bcId < 2; ++bcId) { size_t dofId = state.getBoundaryConditions()[bcId]; expectedM.block<1, 9>(dofId, 0).setZero(); expectedM.block<9, 1>(0, dofId).setZero(); expectedM(dofId, dofId) = 1.0; } state.applyBoundaryConditionsToMatrix(&M); EXPECT_FALSE(M.isApprox(initialM)); EXPECT_TRUE(M.isApprox(expectedM)); } namespace { void testOdeStateValidityWith(double number, bool isValid) { OdeState stateWithNumberOnPosition; stateWithNumberOnPosition.setNumDof(3u, 3u); stateWithNumberOnPosition.getPositions().setOnes(); stateWithNumberOnPosition.getPositions()[2] = number; if (isValid) { EXPECT_TRUE(stateWithNumberOnPosition.isValid()); } else { EXPECT_FALSE(stateWithNumberOnPosition.isValid()); } OdeState stateWithNumberOnVelocity; stateWithNumberOnVelocity.setNumDof(3u, 3u); stateWithNumberOnVelocity.getVelocities().setOnes(); stateWithNumberOnVelocity.getVelocities()[2] = number; if (isValid) { EXPECT_TRUE(stateWithNumberOnVelocity.isValid()); } else { EXPECT_FALSE(stateWithNumberOnVelocity.isValid()); } } }; // anonymous namespace TEST(OdeStateTest, IsValidTest) { { SCOPED_TRACE("Test with invalid number INF"); testOdeStateValidityWith(std::numeric_limits::infinity(), false); } { SCOPED_TRACE("Test with invalid number QuietNaN"); testOdeStateValidityWith(std::numeric_limits::quiet_NaN(), false); } { SCOPED_TRACE("Test with invalid number SignalingNaN"); testOdeStateValidityWith(std::numeric_limits::signaling_NaN(), false); } { SCOPED_TRACE("Test with valid numbers"); testOdeStateValidityWith(4.5e-34, true); } } TEST(OdeStateTest, Interpolation) { OdeState state1; OdeState state2; OdeState expected; state1.setNumDof(3u, 3u); state2.setNumDof(3u, 3u); expected.setNumDof(3u, 3u); double t = 0.25; for (size_t i = 0; i < state1.getNumDof(); i++) { double num = static_cast(i); state1.getVelocities()[i] = 1.0; state2.getVelocities()[i] = num; expected.getVelocities()[i] = 1.0 + (num - 1.0) * t; state1.getPositions()[i] = num * 2; state2.getPositions()[i] = 0.0; expected.getPositions()[i] = num * 2 + (0.0 - num * 2) * t; } auto result = state1.interpolate(state2, t); ASSERT_TRUE(result.isValid()); for (size_t i = 0; i < expected.getNumDof(); i++) { EXPECT_NEAR(expected.getPositions()[i], result.getPositions()[i], epsilon); EXPECT_NEAR(expected.getVelocities()[i], result.getVelocities()[i], epsilon); } result = state1.interpolate(state2, 0.0); for (size_t i = 0; i < expected.getNumDof(); i++) { EXPECT_NEAR(state1.getPositions()[i], result.getPositions()[i], epsilon); EXPECT_NEAR(state1.getVelocities()[i], result.getVelocities()[i], epsilon); } result = state1.interpolate(state2, 1.0); for (size_t i = 0; i < expected.getNumDof(); i++) { EXPECT_NEAR(state2.getPositions()[i], result.getPositions()[i], epsilon); EXPECT_NEAR(state2.getVelocities()[i], result.getVelocities()[i], epsilon); } } opensurgsim-0.7.0/SurgSim/Math/UnitTests/ParticlesShapeTests.cpp000066400000000000000000000117431277777236100250040ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/DataStructures/EmptyData.h" #include "SurgSim/DataStructures/NormalData.h" #include "SurgSim/Math/MathConvert.h" #include "SurgSim/Math/Shapes.h" #include "SurgSim/Math/Valid.h" namespace { const double epsilon = 1e-10; } namespace SurgSim { namespace Math { TEST(ParticlesShapeTests, CanConstruct) { ASSERT_NO_THROW({ ParticlesShape particles; }); ASSERT_NO_THROW({ ParticlesShape particles(0.01); }); } TEST(ParticlesShapeTests, CopyConstruct) { { DataStructures::Vertices otherVertices; otherVertices.addVertex(DataStructures::Vertex(Vector3d::Constant(3.0))); ParticlesShape particles(otherVertices); EXPECT_EQ(1, particles.getNumVertices()); EXPECT_TRUE(particles.getVertex(0).position.isApprox(Vector3d::Constant(3.0))); } { DataStructures::Vertices otherVertices; otherVertices.addVertex(DataStructures::Vertex(Vector3d::Constant(3.0))); ParticlesShape particles(otherVertices); EXPECT_EQ(1, particles.getNumVertices()); EXPECT_TRUE(particles.getVertex(0).position.isApprox(Vector3d::Constant(3.0))); } } TEST(ParticlesShapeTests, DefaultProperties) { ParticlesShape particles; EXPECT_NEAR(0.0, particles.getRadius(), epsilon); EXPECT_EQ(SHAPE_TYPE_PARTICLES, particles.getType()); EXPECT_NEAR(0.0, particles.getVolume(), epsilon); EXPECT_FALSE(isValid(particles.getCenter())); EXPECT_TRUE(particles.getSecondMomentOfVolume().isZero()); EXPECT_NE(nullptr, particles.getAabbTree()); EXPECT_TRUE(particles.isTransformable()); } TEST(ParticlesShapeTests, SetGetRadius) { ParticlesShape particles; particles.setRadius(0.1); EXPECT_NEAR(0.1, particles.getRadius(), epsilon); } TEST(ParticlesShapeTests, GeometricProperties) { SphereShape unitSphere(1.0); ParticlesShape particles(1.0); particles.addVertex(ParticlesShape::VertexType(Vector3d::Zero())); particles.update(); EXPECT_TRUE(particles.getCenter().isApprox(Vector3d::Zero())); EXPECT_NEAR(unitSphere.getVolume(), particles.getVolume(), epsilon); EXPECT_TRUE(particles.getSecondMomentOfVolume().isApprox(unitSphere.getSecondMomentOfVolume())) << unitSphere.getSecondMomentOfVolume() << std::endl << particles.getSecondMomentOfVolume(); particles.addVertex(ParticlesShape::VertexType(Vector3d::Ones())); particles.update(); EXPECT_TRUE(particles.getCenter().isApprox(Vector3d::Ones() * 0.5)); EXPECT_NEAR(2.0 * unitSphere.getVolume(), particles.getVolume(), epsilon); Matrix33d distanceSkew = makeSkewSymmetricMatrix(Vector3d::Ones().eval()); EXPECT_TRUE(particles.getSecondMomentOfVolume().isApprox(2.0 * unitSphere.getSecondMomentOfVolume() - unitSphere.getVolume() * distanceSkew * distanceSkew)); particles.addVertex(ParticlesShape::VertexType(-Vector3d::Ones())); particles.update(); EXPECT_TRUE(particles.getCenter().isApprox(Vector3d::Zero())); EXPECT_NEAR(3.0 * unitSphere.getVolume(), particles.getVolume(), epsilon); EXPECT_TRUE(particles.getSecondMomentOfVolume().isApprox(3 * unitSphere.getSecondMomentOfVolume() - 2.0 * unitSphere.getVolume() * distanceSkew * distanceSkew)); } TEST(ParticlesShapeTests, Serialization) { const double radius = 0.2; { YAML::Node node; node["SurgSim::Math::ParticlesShape"]["Radius"] = radius; std::shared_ptr shape; ASSERT_NO_THROW(shape = node.as>()); EXPECT_EQ("SurgSim::Math::ParticlesShape", shape->getClassName()); EXPECT_NEAR(radius, shape->getValue("Radius"), epsilon); EXPECT_TRUE(shape->isValid()); } { std::shared_ptr shape; ASSERT_NO_THROW(shape = Shape::getFactory().create("SurgSim::Math::ParticlesShape")); shape->setValue("Radius", radius); EXPECT_TRUE(shape->isValid()); YAML::Node node; ASSERT_NO_THROW(node = shape); EXPECT_TRUE(node.IsMap()); EXPECT_EQ(1u, node.size()); ASSERT_TRUE(node["SurgSim::Math::ParticlesShape"].IsDefined()); auto data = node["SurgSim::Math::ParticlesShape"]; EXPECT_EQ(1u, data.size()); std::shared_ptr particlesShape; ASSERT_NO_THROW(particlesShape = std::dynamic_pointer_cast(node.as>())); EXPECT_EQ("SurgSim::Math::ParticlesShape", particlesShape->getClassName()); EXPECT_NEAR(radius, particlesShape->getValue("Radius"), epsilon); EXPECT_TRUE(particlesShape->isValid()); } } }; }; opensurgsim-0.7.0/SurgSim/Math/UnitTests/PolynomialRootTests.cpp000066400000000000000000000117431277777236100250640ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the Polynomial functions. #include #include #include "SurgSim/Math/PolynomialRoots.h" namespace SurgSim { namespace Math { namespace { double epsilon = 1.0e-9; } TEST(PolynomialRootsTest, PolynomialDegree1Roots) { // Degenerate Linear, infinite roots SurgSim::Math::Polynomial degenerate(epsilon / 2.0, epsilon / 2.0); PolynomialRoots degenerateRoots(degenerate, 1.0e-09); EXPECT_TRUE(degenerateRoots.isDegenerate()); EXPECT_EQ(-1, degenerateRoots.getNumRoots()); EXPECT_THROW(degenerateRoots[0], SurgSim::Framework::AssertionFailure); // Semi-degenerate Linear, no roots SurgSim::Math::Polynomial constantPoly(2.0, epsilon / 2.0); PolynomialRootsconstantPolyRoots(constantPoly, 1.0e-09); EXPECT_FALSE(constantPolyRoots.isDegenerate()); EXPECT_EQ(0, constantPolyRoots.getNumRoots()); EXPECT_THROW(constantPolyRoots[0], SurgSim::Framework::AssertionFailure); // Linear, one root SurgSim::Math::Polynomial linearPoly(-24.0, 2.0); PolynomialRootslinearPolyRoots(linearPoly, 1.0e-09); EXPECT_FALSE(linearPolyRoots.isDegenerate()); EXPECT_EQ(1, linearPolyRoots.getNumRoots()); EXPECT_NEAR(12.0, linearPolyRoots[0], epsilon); EXPECT_THROW(linearPolyRoots[1], SurgSim::Framework::AssertionFailure); }; TEST(PolynomialRootsTest, PolynomialDegree2Roots) { // Degenerate Linear, infinite roots SurgSim::Math::Polynomial degenerate(epsilon / 2.0, epsilon / 2.0, epsilon / 2.0); PolynomialRootsdegenerateRoots(degenerate, 1.0e-09); EXPECT_TRUE(degenerateRoots.isDegenerate()); EXPECT_EQ(-1, degenerateRoots.getNumRoots()); EXPECT_THROW(degenerateRoots[0], SurgSim::Framework::AssertionFailure); // Semi-degenerate Linear, no roots SurgSim::Math::Polynomial constantPoly(2.0, epsilon / 2.0, epsilon / 2.0); PolynomialRootsconstantPolyRoots(constantPoly, 1.0e-09); EXPECT_FALSE(constantPolyRoots.isDegenerate()); EXPECT_EQ(0, constantPolyRoots.getNumRoots()); EXPECT_THROW(constantPolyRoots[0], SurgSim::Framework::AssertionFailure); // Linear, one root SurgSim::Math::Polynomial linearPoly(-24.0, 2.0, epsilon / 2.0); PolynomialRootslinearPolyRoots(linearPoly, 1.0e-09); EXPECT_FALSE(linearPolyRoots.isDegenerate()); EXPECT_EQ(1, linearPolyRoots.getNumRoots()); EXPECT_NEAR(12.0, linearPolyRoots[0], epsilon); EXPECT_THROW(linearPolyRoots[1], SurgSim::Framework::AssertionFailure); // Quadratic, two imaginary roots SurgSim::Math::Polynomial imaginaryPoly(1.0, epsilon / 8.0, 1.0); PolynomialRootsimaginaryPolyRoots(imaginaryPoly, 1.0e-09); EXPECT_FALSE(imaginaryPolyRoots.isDegenerate()); EXPECT_EQ(0, imaginaryPolyRoots.getNumRoots()); EXPECT_THROW(imaginaryPolyRoots[0], SurgSim::Framework::AssertionFailure); // Quadratic, one (duplicate) root SurgSim::Math::Polynomial oneRootPoly(288.0, -48.0, 2.0); PolynomialRootsoneRootPolyRoots(oneRootPoly, 1.0e-09); EXPECT_FALSE(oneRootPolyRoots.isDegenerate()); EXPECT_EQ(1, oneRootPolyRoots.getNumRoots()); EXPECT_NEAR(12.0, oneRootPolyRoots[0], epsilon); EXPECT_THROW(oneRootPolyRoots[1], SurgSim::Framework::AssertionFailure); // Quadratic SurgSim::Math::Polynomial quadraticPoly(-8.0, 6.0, 2.0); PolynomialRootsquadraticPolyRoots(quadraticPoly, 1.0e-09); EXPECT_FALSE(quadraticPolyRoots.isDegenerate()); EXPECT_EQ(2, quadraticPolyRoots.getNumRoots()); EXPECT_NEAR(-4.0, quadraticPolyRoots[0], epsilon); EXPECT_NEAR(1.0, quadraticPolyRoots[1], epsilon); EXPECT_THROW(quadraticPolyRoots[2], SurgSim::Framework::AssertionFailure); // Quadratic (ascending order => coefficient of higher order < 0) // Discriminant = 49 => 2 roots that should be ordered this way: // (-9 - 7) / -4 = 4 // (-9 + 7) / -4 = 1/2 // But will be reordered to be in ascending order SurgSim::Math::Polynomial quadraticPolyOrdered(-4.0, 9.0, -2.0); PolynomialRootsquadraticPolyOrderedRoots(quadraticPolyOrdered, 1.0e-09); EXPECT_FALSE(quadraticPolyOrderedRoots.isDegenerate()); EXPECT_EQ(2, quadraticPolyOrderedRoots.getNumRoots()); EXPECT_NEAR(0.5, quadraticPolyOrderedRoots[0], epsilon); EXPECT_NEAR(4.0, quadraticPolyOrderedRoots[1], epsilon); EXPECT_THROW(quadraticPolyOrderedRoots[2], SurgSim::Framework::AssertionFailure); }; }; // namespace Math }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Math/UnitTests/PolynomialTests.cpp000066400000000000000000000244031277777236100242150ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the Polynomial functions. #include #include #include "SurgSim/Math/Polynomial.h" namespace SurgSim { namespace Math { namespace { double epsilon = 1.0e-10; template void checkDiscriminant(Polynomial* poly, double expected) { } template <> void checkDiscriminant(Polynomial* poly, double expected) { EXPECT_DOUBLE_EQ(expected, poly->discriminant()); } } class PolynomialUtilityTests : public ::testing::Test { }; template class PolynomialTests : public ::testing::Test { public: void initializeConstructor(Polynomial* poly) { typedef Polynomial PolynomialType; EXPECT_NO_THROW(PolynomialType polyNew); EXPECT_NO_THROW(PolynomialType polyNew(7.0)); PolynomialType polyNew(1.0); *poly = polyNew; } void initializeConstructor(Polynomial* poly) { typedef Polynomial PolynomialType; EXPECT_NO_THROW(PolynomialType polyNew); EXPECT_NO_THROW(PolynomialType polyNew(7.0, 8)); PolynomialType polyNew(1.0, 2.0); *poly = polyNew; } void initializeConstructor(Polynomial* poly) { typedef Polynomial PolynomialType; EXPECT_NO_THROW(PolynomialType polyNew); EXPECT_NO_THROW(PolynomialType polyNew(7.0, 8.0, 9.0)); PolynomialType polyNew(1.0, 2.0, 3.0); *poly = polyNew; } void initializeConstructor(Polynomial* poly) { typedef Polynomial PolynomialType; EXPECT_NO_THROW(PolynomialType polyNew); EXPECT_NO_THROW(PolynomialType polyNew(7.0, 8.0, 9.0, 10.0)); PolynomialType polyNew(1.0, 2.0, 3.0, 4.0); *poly = polyNew; } template void setPolynomialFromOffset(int offset, Polynomial* poly) { for (size_t counter = 0; counter <= degree; ++counter) { (*poly)[counter] = static_cast(counter + offset); } } template void setPolynomialToSmallValue(Polynomial* poly) { for (size_t counter = 0; counter <= degree; ++counter) { (*poly)[counter] = epsilon / 2.0; } } template void checkPolynomialConstructor(Polynomial* poly) { // Check get ... up to degree for (size_t counter = 0; counter <= degree; ++counter) { EXPECT_DOUBLE_EQ(counter + 1.0, poly->getCoefficient(counter)); EXPECT_DOUBLE_EQ(counter + 1.0, (*poly)[counter]); } // Check get ... beyond degree for (size_t counter = degree + 1; counter < 5; ++counter) { EXPECT_DOUBLE_EQ(0.0, poly->getCoefficient(counter)); EXPECT_THROW((*poly)[counter], SurgSim::Framework::AssertionFailure); } // Check set up to degree for (size_t counter = 0; counter <= degree; ++counter) { poly->setCoefficient(counter, static_cast(counter)); EXPECT_DOUBLE_EQ(static_cast(counter), poly->getCoefficient(counter)); (*poly)[counter] = static_cast(counter + 1); EXPECT_DOUBLE_EQ(static_cast(counter + 1), poly->getCoefficient(counter)); } // Check set beyond degree EXPECT_THROW(poly->setCoefficient(degree + 1, 12.0), SurgSim::Framework::AssertionFailure); EXPECT_THROW((*poly)[degree + 1] = 12, SurgSim::Framework::AssertionFailure); } template void checkPolynomialArithmetic(const Polynomial& poly1, const Polynomial& poly2) { Polynomial scratch; // Check evaluate ... double evaluate = static_cast(degree + 1); for (int counter = degree - 1; counter >= 0; --counter) { evaluate = (0.5 * evaluate) + counter + 1; } EXPECT_NEAR(evaluate, poly1.evaluate(0.5), epsilon); // Check negation ... scratch = -poly1; for (size_t counter = 0; counter <= degree; ++counter) { EXPECT_DOUBLE_EQ(-1 * (static_cast(counter) + 1.0), scratch.getCoefficient(counter)); EXPECT_DOUBLE_EQ(-1 * (static_cast(counter) + 1.0), scratch[counter]); } // Check add ... scratch = poly1 + poly2; for (size_t counter = 0; counter <= degree; ++counter) { EXPECT_DOUBLE_EQ(2 * static_cast(counter) + 3.0, scratch.getCoefficient(counter)); EXPECT_DOUBLE_EQ(2 * static_cast(counter) + 3.0, scratch[counter]); } scratch = poly1; scratch += poly2; for (size_t counter = 0; counter <= degree; ++counter) { EXPECT_DOUBLE_EQ(2 * static_cast(counter) + 3.0, scratch.getCoefficient(counter)); EXPECT_DOUBLE_EQ(2 * static_cast(counter) + 3.0, scratch[counter]); } // Check subtract ... scratch = poly1 - poly2; for (size_t counter = 0; counter <= degree; ++counter) { EXPECT_DOUBLE_EQ(-1.0, scratch.getCoefficient(counter)); EXPECT_DOUBLE_EQ(-1.0, scratch[counter]); } scratch = poly1; scratch -= poly2; for (size_t counter = 0; counter <= degree; ++counter) { EXPECT_DOUBLE_EQ(-1.0, scratch.getCoefficient(counter)); EXPECT_DOUBLE_EQ(-1.0, scratch[counter]); } // Check isApprox ... scratch = poly1; for (size_t counter = 0; counter <= degree; ++counter) { scratch[counter] += epsilon / 2.0; } EXPECT_TRUE(scratch.isApprox(poly1, epsilon)); scratch[0] = poly1[0] + 2.0 * epsilon; for (size_t counter = 0; counter < degree; ++counter) { EXPECT_FALSE(scratch.isApprox(poly1, epsilon)); scratch[counter] = poly1[counter] + epsilon / 2.0; scratch[counter + 1] = poly1[counter + 1] + 2.0 * epsilon; } EXPECT_FALSE(scratch.isApprox(poly1, epsilon)); } template void checkPolynomialDerivative(const Polynomial& poly1) { if (degree != 0) { // Check derivative ... auto smallScratch = poly1.derivative(); for (size_t counter = 0; counter < degree; ++counter) { EXPECT_DOUBLE_EQ((counter + 2.0) * (counter + 1.0), smallScratch.getCoefficient(counter)); EXPECT_DOUBLE_EQ((counter + 2.0) * (counter + 1.0), smallScratch[counter]); } EXPECT_DOUBLE_EQ(0.0, smallScratch.getCoefficient(degree)); EXPECT_THROW(smallScratch[degree], SurgSim::Framework::AssertionFailure); } } template void checkIsNearZero(Polynomial* poly1) { EXPECT_TRUE(poly1->isNearZero(epsilon)); for (size_t counter = 0; counter <= degree; counter++) { poly1->setCoefficient(counter, 2 * epsilon); EXPECT_FALSE(poly1->isNearZero(epsilon)); poly1->setCoefficient(counter, epsilon / 2.0); EXPECT_TRUE(poly1->isNearZero(epsilon)); (*poly1)[counter] = 2 * epsilon; EXPECT_FALSE(poly1->isNearZero(epsilon)); (*poly1)[counter] = epsilon / 2.0; EXPECT_TRUE(poly1->isNearZero(epsilon)); } } }; template class PolynomialDerivativeTests : public PolynomialTests { }; typedef ::testing::Types, Polynomial, Polynomial, Polynomial> PolynomialTypes; typedef ::testing::Types < Polynomial, Polynomial, Polynomial> PolynomialDerivativeTypes; TYPED_TEST_CASE(PolynomialTests, PolynomialTypes); TYPED_TEST_CASE(PolynomialDerivativeTests, PolynomialDerivativeTypes); TYPED_TEST(PolynomialTests, InitializationTests) { EXPECT_NO_THROW(TypeParam poly); TypeParam poly; this->initializeConstructor(&poly); this->checkPolynomialConstructor(&poly); }; TYPED_TEST(PolynomialTests, ArithmeticTests) { TypeParam poly1; this->setPolynomialFromOffset(1, &poly1); TypeParam poly2; this->setPolynomialFromOffset(2, &poly2); this->checkPolynomialArithmetic(poly1, poly2); }; TYPED_TEST(PolynomialDerivativeTests, DerivativeTests) { TypeParam poly1; this->setPolynomialFromOffset(1, &poly1); this->checkPolynomialDerivative(poly1); }; TYPED_TEST(PolynomialTests, NearZeroTests) { TypeParam poly1; this->setPolynomialToSmallValue(&poly1); this->checkIsNearZero(&poly1); }; TYPED_TEST(PolynomialTests, DiscriminantTests) { TypeParam poly1; { SCOPED_TRACE("0 + 1x + 2x^2"); this->setPolynomialFromOffset(0, &poly1); // discriminant = 1 - 4*0 = 1 checkDiscriminant(&poly1, 1.0); } { SCOPED_TRACE("1 + 2x + 3x^2"); this->setPolynomialFromOffset(1, &poly1); // discriminant = 4 - 4*3 = -8 checkDiscriminant(&poly1, -8.0); } { SCOPED_TRACE("2 + 3x + 4x^2"); this->setPolynomialFromOffset(2, &poly1); // discriminant = 9 - 4*8 = -23 checkDiscriminant(&poly1, -23.0); } }; TEST_F(PolynomialUtilityTests, UtilityTests) { Polynomial p0_1(1.0); Polynomial p0_2(2.0); Polynomial p1_1(1.0, 2.0); Polynomial p1_2(2.0, 3.0); Polynomial p2_1(1.0, 2.0, 3.0); Polynomial p2_2(2.0, 3.0, 4.0); Polynomial p3_1(1.0, 2.0, 3.0, 4.0); Polynomial p3_2(2.0, 3.0, 4.0, 5.0); // degree n * degree m { auto result = p0_2 * p3_2; EXPECT_TRUE(result.isApprox(Polynomial(4.0, 6.0, 8.0, 10.0), epsilon)); } // degree 1 * degree 1 { auto result = p1_1 * p1_2; EXPECT_TRUE(result.isApprox(Polynomial(2.0, 7.0, 6.0), epsilon)); } // degree 2 * degree 1 { auto result = p2_1 * p1_2; EXPECT_TRUE(result.isApprox(Polynomial(2.0, 7.0, 12.0, 9.0), epsilon)); } // degree 1 * degree 2 { auto result = p1_1 * p2_2; EXPECT_TRUE(result.isApprox(Polynomial(2.0, 7.0, 10.0, 8.0), epsilon)); } // degree 0^2 { auto result_p0_1 = square(p0_1); EXPECT_TRUE(result_p0_1.isApprox(Polynomial(1.0), epsilon)); auto result_p0_2 = square(p0_2); EXPECT_TRUE(result_p0_2.isApprox(Polynomial(4.0), epsilon)); } // degree 1^2 { auto result = square(p1_2); EXPECT_TRUE(result.isApprox(Polynomial(4.0, 12.0, 9.0), epsilon)); } // Output { // Output std::ostringstream intervalOutput; intervalOutput << p3_1; EXPECT_EQ("(4*x^3 + 3*x^2 + 2*x + 1)", intervalOutput.str()); } }; }; // namespace Math }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Math/UnitTests/PolynomialValuesTests.cpp000066400000000000000000000120251277777236100253720ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the Polynomial functions. #include #include #include "SurgSim/Math/PolynomialValues.h" namespace SurgSim { namespace Math { namespace { double epsilon = 1.0e-9; } TEST(PolynomialValuesTest, PolnomialDegree0Values) { SurgSim::Math::Polynomial constantPoly(-24.0); SurgSim::Math::Interval interval(-1.0, 10.0); PolynomialValues constantValues(constantPoly); EXPECT_DOUBLE_EQ(constantPoly.getCoefficient(0), constantValues.getPolynomial().getCoefficient(0)); EXPECT_TRUE(Interval(-24.0, -24.0).isApprox(constantValues.valuesOverInterval(interval), epsilon)); }; TEST(PolynomialValuesTest, PolnomialDegree1Values) { SurgSim::Math::Polynomial linearPoly(-24.0, 2.0); SurgSim::Math::Interval interval(-1.0, 10.0); PolynomialValues linearValues(linearPoly); EXPECT_DOUBLE_EQ(linearPoly.getCoefficient(0), linearValues.getPolynomial().getCoefficient(0)); EXPECT_DOUBLE_EQ(linearPoly.getCoefficient(1), linearValues.getPolynomial().getCoefficient(1)); EXPECT_TRUE(Interval(-26.0, -4.0).isApprox(linearValues.valuesOverInterval(interval), epsilon)); }; TEST(PolynomialValuesTest, PolnomialDegree2Values) { SurgSim::Math::Polynomial quadraticPoly(-8.0, 6.0, 2.0); SurgSim::Math::Interval interval1(-1.0, 10.0); SurgSim::Math::Interval interval2(-2.0, 10.0); PolynomialValues quadraticValues(quadraticPoly); EXPECT_DOUBLE_EQ(quadraticPoly.getCoefficient(0), quadraticValues.getPolynomial().getCoefficient(0)); EXPECT_DOUBLE_EQ(quadraticPoly.getCoefficient(1), quadraticValues.getPolynomial().getCoefficient(1)); EXPECT_DOUBLE_EQ(quadraticPoly.getCoefficient(2), quadraticValues.getPolynomial().getCoefficient(2)); EXPECT_NEAR(6.0, quadraticValues.getDerivative().getCoefficient(0), epsilon); EXPECT_NEAR(4.0, quadraticValues.getDerivative().getCoefficient(1), epsilon); EXPECT_EQ(1, quadraticValues.getLocationsOfExtrema().getNumRoots()); EXPECT_NEAR(-1.5, quadraticValues.getLocationsOfExtrema()[0], epsilon); EXPECT_TRUE(Interval(-12.0, 252.0).isApprox(quadraticValues.valuesOverInterval(interval1), epsilon)); EXPECT_TRUE(Interval(-12.5, 252.0).isApprox(quadraticValues.valuesOverInterval(interval2), epsilon)); }; TEST(PolynomialValuesTest, PolnomialDegree3Values) { SurgSim::Math::Polynomial cubicPoly(7.0, -63.0, -6.0, 1.0); SurgSim::Math::Interval interval1(-10.0, 20.0); SurgSim::Math::Interval interval2(-4.0, 10.0); PolynomialValues cubicValues(cubicPoly); EXPECT_DOUBLE_EQ(cubicPoly.getCoefficient(0), cubicValues.getPolynomial().getCoefficient(0)); EXPECT_DOUBLE_EQ(cubicPoly.getCoefficient(1), cubicValues.getPolynomial().getCoefficient(1)); EXPECT_DOUBLE_EQ(cubicPoly.getCoefficient(2), cubicValues.getPolynomial().getCoefficient(2)); EXPECT_DOUBLE_EQ(cubicPoly.getCoefficient(3), cubicValues.getPolynomial().getCoefficient(3)); EXPECT_NEAR(-63.0, cubicValues.getDerivative().getCoefficient(0), epsilon); EXPECT_NEAR(-12.0, cubicValues.getDerivative().getCoefficient(1), epsilon); EXPECT_NEAR(3.0, cubicValues.getDerivative().getCoefficient(2), epsilon); EXPECT_EQ(2, cubicValues.getLocationsOfExtrema().getNumRoots()); EXPECT_NEAR(-3.0, cubicValues.getLocationsOfExtrema()[0], epsilon); EXPECT_NEAR(7.0, cubicValues.getLocationsOfExtrema()[1], epsilon); EXPECT_TRUE(Interval(-963.0, 4347.0).isApprox(cubicValues.valuesOverInterval(interval1), epsilon)); EXPECT_TRUE(Interval(-385.0, 115.0).isApprox(cubicValues.valuesOverInterval(interval2), epsilon)); }; TEST(PolynomialValuesTest, ValuesOverIntervalTests) { SurgSim::Math::Polynomial constantPoly(-24.0); SurgSim::Math::Polynomial linearPoly(-24.0, 2.0); SurgSim::Math::Polynomial quadraticPoly(-8.0, 6.0, 2.0); SurgSim::Math::Polynomial cubicPoly(7.0, -63.0, -6.0, 1.0); SurgSim::Math::Interval interval(-1.0, 10.0); EXPECT_TRUE(Interval(-24.0, -24.0).isApprox(valuesOverInterval(constantPoly, interval), epsilon)); EXPECT_TRUE(Interval(-26.0, -4.0).isApprox(valuesOverInterval(linearPoly, interval), epsilon)); EXPECT_TRUE(Interval(-12.0, 252.0).isApprox(valuesOverInterval(quadraticPoly, interval), epsilon)); EXPECT_TRUE(Interval(-385.0, 63.0).isApprox(valuesOverInterval(cubicPoly, interval), epsilon)); }; }; // namespace Math }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Math/UnitTests/QuaternionTests.cpp000066400000000000000000000571271277777236100242300ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests that exercise the functionality of our quaternion typedefs, which /// come straight from Eigen. #include #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/MathConvert.h" #include "gtest/gtest.h" // Define test fixture class templates. // We don't really need fixtures as such, but the templatization encodes type. template class QuaternionTests : public testing::Test { public: typedef T Quaternion; typedef typename T::AngleAxisType AngleAxis; typedef typename T::Scalar Scalar; }; // This used to contain aligned (via Eigen::AutoAlign) quaternion type aliases, but we got rid of those. typedef ::testing::Types QuaternionVariants; TYPED_TEST_CASE(QuaternionTests, QuaternionVariants); template class UnalignedQuaternionTests : public QuaternionTests { }; typedef ::testing::Types UnalignedQuaternionVariants; TYPED_TEST_CASE(UnalignedQuaternionTests, UnalignedQuaternionVariants); // Now we're ready to start testing... // ==================== CONSTRUCTION & INITIALIZATION ==================== /// Test that quaternions can be constructed. TYPED_TEST(QuaternionTests, CanConstruct) { typedef typename TestFixture::Quaternion Quaternion; typedef typename TestFixture::Scalar T; Quaternion defaultConstructed; Quaternion fourArg(static_cast(1.0), static_cast(2.0), static_cast(3.0), static_cast(4.0)); } /// Test that the constructor properly initializes quaternions in the WXYZ order. TYPED_TEST(QuaternionTests, ConstructorInitialization) { typedef typename TestFixture::Quaternion Quaternion; typedef typename TestFixture::Scalar T; Quaternion quaternion(static_cast(1.03), static_cast(1.04), static_cast(1.05), static_cast(1.06)); EXPECT_NEAR(1.03, quaternion.w(), 1e-6) << "W wasn't properly initialized."; EXPECT_NEAR(1.04, quaternion.x(), 1e-6) << "X wasn't properly initialized."; EXPECT_NEAR(1.05, quaternion.y(), 1e-6) << "Y wasn't properly initialized."; EXPECT_NEAR(1.06, quaternion.z(), 1e-6) << "Z wasn't properly initialized."; } /// Test setting the quaternion from a 4D vector. /// The order of components is XYZW (not WXYZ), which is why doing this may be confusing. TYPED_TEST(QuaternionTests, InitializeFromVector4) { typedef typename TestFixture::Quaternion Quaternion; typedef typename TestFixture::Scalar T; Eigen::Matrix vector4; vector4 << 1.1f, 1.2f, 1.3f, 1.4f; // Note: this initializes the quaternion from the vector in the **XYZW** order (not WXYZ!) Quaternion quaternion(vector4); EXPECT_NEAR(1.1, quaternion.x(), 1e-6) << "X wasn't properly initialized."; EXPECT_NEAR(1.2, quaternion.y(), 1e-6) << "Y wasn't properly initialized."; EXPECT_NEAR(1.3, quaternion.z(), 1e-6) << "Z wasn't properly initialized."; EXPECT_NEAR(1.4, quaternion.w(), 1e-6) << "W wasn't properly initialized."; } /// Test initializing from a float array. /// The order of components is XYZW (not WXYZ), which is why doing this may be confusing. TYPED_TEST(QuaternionTests, InitializeFromArray) { typedef typename TestFixture::Quaternion Quaternion; typedef typename TestFixture::Scalar T; Quaternion quaternion(T(3.4), T(0.1), T(1.2), T(2.3)); EXPECT_NEAR(0.1, quaternion.x(), 1e-6) << "X wasn't properly initialized."; EXPECT_NEAR(1.2, quaternion.y(), 1e-6) << "Y wasn't properly initialized."; EXPECT_NEAR(2.3, quaternion.z(), 1e-6) << "Z wasn't properly initialized."; EXPECT_NEAR(3.4, quaternion.w(), 1e-6) << "W wasn't properly initialized."; } /// Test getting an identity value usable in expressions. TYPED_TEST(QuaternionTests, IdentityValue) { typedef typename TestFixture::Quaternion Quaternion; Quaternion quaternion = Quaternion::Identity(); EXPECT_NEAR(1.0, quaternion.w(), 1e-6) << "W wasn't properly initialized."; EXPECT_NEAR(0.0, quaternion.x(), 1e-6) << "X wasn't properly initialized."; EXPECT_NEAR(0.0, quaternion.y(), 1e-6) << "Y wasn't properly initialized."; EXPECT_NEAR(0.0, quaternion.z(), 1e-6) << "Z wasn't properly initialized."; } /// Test setting quaternions to identity. TYPED_TEST(QuaternionTests, SetToIdentity) { typedef typename TestFixture::Quaternion Quaternion; Quaternion quaternion; quaternion.setIdentity(); EXPECT_NEAR(1.0, quaternion.w(), 1e-6) << "W wasn't properly initialized."; EXPECT_NEAR(0.0, quaternion.x(), 1e-6) << "X wasn't properly initialized."; EXPECT_NEAR(0.0, quaternion.y(), 1e-6) << "Y wasn't properly initialized."; EXPECT_NEAR(0.0, quaternion.z(), 1e-6) << "Z wasn't properly initialized."; } /// Test getting a zero value usable in expressions. /// Note: many "4D" operations are not defined on Eigen::Quaternion, but can be performed on quaternion.coeffs(). TYPED_TEST(QuaternionTests, ZeroValue) { typedef typename TestFixture::Quaternion Quaternion; typedef typename TestFixture::Scalar T; typedef Eigen::Matrix Vector4; // There is no Quaternion::Zero(), but you can do this: Quaternion quaternion = Quaternion(Vector4::Zero()); EXPECT_NEAR(0.0, quaternion.w(), 1e-6) << "W wasn't properly initialized."; EXPECT_NEAR(0.0, quaternion.x(), 1e-6) << "X wasn't properly initialized."; EXPECT_NEAR(0.0, quaternion.y(), 1e-6) << "Y wasn't properly initialized."; EXPECT_NEAR(0.0, quaternion.z(), 1e-6) << "Z wasn't properly initialized."; } /// Test setting quaternions to zero. /// Note: many "4D" operations are not defined on Eigen::Quaternion, but can be performed on quaternion.coeffs(). TYPED_TEST(QuaternionTests, SetToZero) { typedef typename TestFixture::Quaternion Quaternion; // There is no Quaternion::setZero(), but you can do this: Quaternion quaternion; quaternion.coeffs().setZero(); EXPECT_NEAR(0.0, quaternion.w(), 1e-6) << "W wasn't properly initialized."; EXPECT_NEAR(0.0, quaternion.x(), 1e-6) << "X wasn't properly initialized."; EXPECT_NEAR(0.0, quaternion.y(), 1e-6) << "Y wasn't properly initialized."; EXPECT_NEAR(0.0, quaternion.z(), 1e-6) << "Z wasn't properly initialized."; } // Test conversion to and from yaml node TYPED_TEST(QuaternionTests, YamlConvert) { typedef typename TestFixture::AngleAxis AngleAxis; typedef typename TestFixture::Quaternion Quaternion; typedef typename TestFixture::Scalar T; Quaternion quaternion(T(0.1), T(1.2), T(2.3), T(3.4)); YAML::Node node; ASSERT_NO_THROW(node = quaternion); EXPECT_TRUE(node.IsSequence()); EXPECT_EQ(4u, node.size()); ASSERT_NO_THROW({Quaternion expected = node.as();}); EXPECT_TRUE(quaternion.isApprox(node.as())); // test decoding from AngleAxis AngleAxis angleAxis; angleAxis.angle() = T(0.1); angleAxis.axis()[0] = T(0.1); angleAxis.axis()[1] = T(1.2); angleAxis.axis()[2] = T(2.3); YAML::Node angleAxisNode = YAML::convert::encode(angleAxis); EXPECT_TRUE(Quaternion(angleAxis).isApprox(angleAxisNode.as())); } // ==================== REPRESENTATION CONVERSIONS ==================== /// Test setting quaternions from an angle/axis rotation. TYPED_TEST(QuaternionTests, FromAngleAxis) { typedef typename TestFixture::Quaternion Quaternion; typedef typename TestFixture::Scalar T; typedef Eigen::Matrix Vector3; T angle = 1.6f; Vector3 axis = Vector3(1.f, 2.f, 3.f).normalized(); using SurgSim::Math::makeRotationQuaternion; Quaternion quaternion = makeRotationQuaternion(angle, axis); EXPECT_NEAR(std::cos(angle / 2.0f), quaternion.w(), 1e-6) << "W wasn't properly initialized."; EXPECT_NEAR(axis.x() * std::sin(angle / 2.0f), quaternion.x(), 1e-6) << "X wasn't properly initialized."; EXPECT_NEAR(axis.y() * std::sin(angle / 2.0f), quaternion.y(), 1e-6) << "X wasn't properly initialized."; EXPECT_NEAR(axis.z() * std::sin(angle / 2.0f), quaternion.z(), 1e-6) << "X wasn't properly initialized."; } template void testAngleAxis(const Eigen::Quaternion& q, const Eigen::AngleAxis& expectedAA, bool expectNegatedQuatOppositeAxis = false) { using SurgSim::Math::computeAngleAndAxis; using SurgSim::Math::computeAngle; Eigen::Matrix axis, axisNeg; T angle, angleNeg; computeAngleAndAxis(q, &angle, &axis); EXPECT_NEAR(expectedAA.angle(), angle, 1e-6) << "angle wasn't properly computed."; EXPECT_NEAR(expectedAA.axis()[0], axis.x(), 1e-6) << "X wasn't properly computed."; EXPECT_NEAR(expectedAA.axis()[1], axis.y(), 1e-6) << "Y wasn't properly computed."; EXPECT_NEAR(expectedAA.axis()[2], axis.z(), 1e-6) << "Y wasn't properly computed."; EXPECT_NEAR(expectedAA.angle(), computeAngle(q), 1e-6) << "angle wasn't properly computed by computeAngle()."; Eigen::Quaternion qNeg = SurgSim::Math::negate(q); computeAngleAndAxis(qNeg, &angleNeg, &axisNeg); EXPECT_NEAR(angle, angleNeg, 1e-6) << "angle wasn't properly computed."; if (expectNegatedQuatOppositeAxis) { EXPECT_NEAR(-axis.x(), axisNeg.x(), 1e-6) << "X wasn't properly computed."; EXPECT_NEAR(-axis.y(), axisNeg.y(), 1e-6) << "Y wasn't properly computed."; EXPECT_NEAR(-axis.z(), axisNeg.z(), 1e-6) << "Y wasn't properly computed."; } else { EXPECT_NEAR(axis.x(), axisNeg.x(), 1e-6) << "X wasn't properly computed."; EXPECT_NEAR(axis.y(), axisNeg.y(), 1e-6) << "Y wasn't properly computed."; EXPECT_NEAR(axis.z(), axisNeg.z(), 1e-6) << "Y wasn't properly computed."; } } /// Test extracting an angle/axis rotation from a quaternion. TYPED_TEST(QuaternionTests, ToAngleAxis) { using SurgSim::Math::makeRotationQuaternion; using SurgSim::Math::computeAngleAndAxis; using SurgSim::Math::computeAngle; typedef typename TestFixture::AngleAxis AngleAxis; typedef typename TestFixture::Quaternion Quaternion; typedef typename TestFixture::Scalar T; typedef Eigen::Matrix Vector3; Vector3 axis(T(1.0), T(2.0), T(3.0)); AngleAxis expectedAA; T angle; axis.normalize(); // Angle 0 in [0 pi] angle = T(0); // Expected result: 0 (to be in [0 pi]), same axis (same quaternion) { SCOPED_TRACE("Angle = 0"); Quaternion quaternion = makeRotationQuaternion(angle, axis); // q=(1 0 0 0) expectedAA.angle() = angle; expectedAA.axis() = Vector3(1, 0, 0); testAngleAxis(quaternion, expectedAA); } // Angle pi/2 in [0 pi] angle = T(M_PI_2); // Expected result: pi/2 (to be in [0 pi]), same axis (same quaternion) { SCOPED_TRACE("Angle = PI/2"); Quaternion quaternion = makeRotationQuaternion(angle, axis); expectedAA.angle() = angle; expectedAA.axis() = axis; testAngleAxis(quaternion, expectedAA); } // Angle pi-epsilon in [0 pi] // => cos(angle/2) = +epsilon' angle = T(2) * acos(std::numeric_limits::epsilon()); // Expected result: pi-epsilon (to be in [0 pi]), same axis (same quaternion) { SCOPED_TRACE("Angle = PI-epsilon"); Quaternion quaternion = makeRotationQuaternion(angle, axis); expectedAA.angle() = angle; expectedAA.axis() = axis; testAngleAxis(quaternion, expectedAA); } // Angle pi angle = T(M_PI); // Expected result: pi (to be in [0 pi]), same axis (same quaternion) // For negated quaternion, we expected angle=pi and opposite axis // Quaternion with w=0 are the only one for which q and -q will give different rotation axis { SCOPED_TRACE("Angle = PI"); // Calling makeRotationQuaternion(M_PI, axis) will not set w to 0 (=cos(PI/2)) because of numerical error // So we set it manually to force the test Quaternion quaternion; quaternion.w() = T(0); quaternion.x() = axis[0]; quaternion.y() = axis[1]; quaternion.z() = axis[2]; expectedAA.angle() = angle; expectedAA.axis() = axis; testAngleAxis(quaternion, expectedAA, true); } // Angle pi+epsilon in [pi 2pi] // => cos(angle/2) = -epsilon' angle = T(2) * acos(-std::numeric_limits::epsilon()); // Expected result: -(pi+epsilon-2pi) (to be in [0 pi]), opposite axis (modulo 2pi + opposite quaternion) { SCOPED_TRACE("Angle = PI+epsilon"); Quaternion quaternion = makeRotationQuaternion(angle, axis); expectedAA.angle() = T(2) * T(M_PI) - angle; expectedAA.axis() = -axis; testAngleAxis(quaternion, expectedAA); } // Angle in [-2pi -pi] angle = T(-3.56); // Expected result: angle+2PI (to be in [0 pi]), same axis (modulo 2pi + same quaternion) { SCOPED_TRACE("Angle in [-2PI -PI]"); Quaternion quaternion = makeRotationQuaternion(angle, axis); expectedAA.angle() = angle + (T)2.0 * T(M_PI); expectedAA.axis() = axis; testAngleAxis(quaternion, expectedAA); } // Angle in [-pi 0] angle = T(-2.12); // Expected result: Opposite angle (to be in [0 pi]), opposite axis (opposite quaternion) { SCOPED_TRACE("Angle in [-PI 0]"); Quaternion quaternion = makeRotationQuaternion(angle, axis); expectedAA.angle() = -angle; expectedAA.axis() = -axis; testAngleAxis(quaternion, expectedAA); } // Angle in [0 pi] angle = T(0.34); // Expected result: Same angle (already in [0 pi]), same axis (same quaternion) { SCOPED_TRACE("Angle in [0 PI]"); Quaternion quaternion = makeRotationQuaternion(angle, axis); expectedAA.angle() = angle; expectedAA.axis() = axis; testAngleAxis(quaternion, expectedAA); } // Angle in [pi, 2pi] angle = T(4.73); // Expected result: -(angle-2PI) to be in [0, pi], opposite axis (modulo 2pi + opposite quaternion) { SCOPED_TRACE("Angle in [PI 2PI]"); Quaternion quaternion = makeRotationQuaternion(angle, axis); expectedAA.angle() = -angle + T(2) * T(M_PI); expectedAA.axis() = -axis; testAngleAxis(quaternion, expectedAA); } } /// Test setting a quaternion from a matrix. TYPED_TEST(QuaternionTests, FromMatrix) { typedef typename TestFixture::Quaternion Quaternion; typedef typename TestFixture::Scalar T; typedef Eigen::Matrix Matrix33; T angle = 0.1f; T sinAngle = std::sin(angle); T cosAngle = std::cos(angle); Matrix33 matrix; matrix << cosAngle, -sinAngle, 0, sinAngle, cosAngle, 0, 0, 0, 1; Quaternion quaternion(matrix); EXPECT_NEAR(std::cos(angle / 2), quaternion.w(), 1e-6) << "W wasn't properly computed."; EXPECT_NEAR(0, quaternion.x(), 1e-6) << "X wasn't properly computed."; EXPECT_NEAR(0, quaternion.y(), 1e-6) << "Y wasn't properly computed."; EXPECT_NEAR(std::sin(angle / 2), quaternion.z(), 1e-6) << "Z wasn't properly computed."; } /// Test setting a matrix from a quaternion. TYPED_TEST(QuaternionTests, ToMatrix) { typedef typename TestFixture::Quaternion Quaternion; typedef typename TestFixture::Scalar T; typedef Eigen::Matrix Matrix33; T angle = 0.1f; Quaternion quaternion(std::cos(angle / 2), 0, 0, std::sin(angle / 2)); Matrix33 expectedMatrix; T sinAngle = std::sin(angle); T cosAngle = std::cos(angle); expectedMatrix << cosAngle, -sinAngle, 0, sinAngle, cosAngle, 0, 0, 0, 1; Matrix33 matrix1 = quaternion.matrix(); EXPECT_NEAR(0, (matrix1 - expectedMatrix).norm(), 9e-6) << "The rotation matrix wasn't properly computed" << " by matrix()."; Matrix33 matrix2 = quaternion.toRotationMatrix(); EXPECT_NEAR(0, (matrix2 - expectedMatrix).norm(), 9e-6) << "The rotation matrix wasn't properly computed" << " by toRotationMatrix()."; } // ==================== ARITHMETIC ==================== /// Test quaternion conjugate. TYPED_TEST(QuaternionTests, Conjugate) { typedef typename TestFixture::Quaternion Quaternion; Quaternion q(2.1f, 2.2f, 2.3f, 2.4f); Quaternion n = q.conjugate(); EXPECT_NEAR(2.1, n.w(), 1e-6) << "W wasn't properly initialized."; EXPECT_NEAR(-2.2, n.x(), 1e-6) << "X wasn't properly initialized."; EXPECT_NEAR(-2.3, n.y(), 1e-6) << "Y wasn't properly initialized."; EXPECT_NEAR(-2.4, n.z(), 1e-6) << "Z wasn't properly initialized."; } /// Test quaternion inverse. TYPED_TEST(QuaternionTests, Inverse) { typedef typename TestFixture::Quaternion Quaternion; typedef typename TestFixture::Scalar T; Quaternion q(2.1f, 2.2f, 2.3f, 2.4f); Quaternion n = q.inverse(); T scale = q.squaredNorm(); EXPECT_NEAR(2.1 / scale, n.w(), 1e-6) << "W wasn't properly initialized."; EXPECT_NEAR(-2.2 / scale, n.x(), 1e-6) << "X wasn't properly initialized."; EXPECT_NEAR(-2.3 / scale, n.y(), 1e-6) << "Y wasn't properly initialized."; EXPECT_NEAR(-2.4 / scale, n.z(), 1e-6) << "Z wasn't properly initialized."; Quaternion qn = q * n; EXPECT_NEAR(1.0, qn.w(), 1e-6) << "W of q * q^1 is messed up."; EXPECT_NEAR(0.0, qn.x(), 1e-6) << "X of q * q^1 is messed up."; EXPECT_NEAR(0.0, qn.y(), 1e-6) << "Y of q * q^1 is messed up."; EXPECT_NEAR(0.0, qn.z(), 1e-6) << "Z of q * q^1 is messed up."; Quaternion nq = n * q; EXPECT_NEAR(1.0, nq.w(), 1e-6) << "W of q^1 * q is messed up."; EXPECT_NEAR(0.0, nq.x(), 1e-6) << "X of q^1 * q is messed up."; EXPECT_NEAR(0.0, nq.y(), 1e-6) << "Y of q^1 * q is messed up."; EXPECT_NEAR(0.0, nq.z(), 1e-6) << "Z of q^1 * q is messed up."; } /// Test quaternion rotation of vectors. TYPED_TEST(QuaternionTests, ApplyToVector) { typedef typename TestFixture::Quaternion Quaternion; typedef typename TestFixture::Scalar T; typedef Eigen::Matrix Vector; using SurgSim::Math::makeRotationQuaternion; Quaternion q = makeRotationQuaternion(static_cast(M_PI_2), Vector(1, 0, 0)); // You can use this, which is actually more efficient if you can manage to apply the same matrix more than once: Vector qx = q.matrix() * Vector::UnitX(); EXPECT_TRUE(qx.isApprox(Vector::UnitX(), 1e-6f)) << qx; // ...or this, which clearly isn't very recommended by the API designers: Vector qx2 = q._transformVector(Vector::UnitX()); EXPECT_TRUE(qx2.isApprox(Vector::UnitX(), 1e-6f)) << qx2; Vector qy = q.matrix() * Vector::UnitY(); EXPECT_TRUE(qy.isApprox(Vector::UnitZ(), 1e-6f)) << qy; Vector qz = q.matrix() * Vector::UnitZ(); EXPECT_TRUE(qz.isApprox(-Vector::UnitY(), 1e-6f)) << qz; } /// Quaternion norm and its square. TYPED_TEST(QuaternionTests, NormAndSquared) { typedef typename TestFixture::Quaternion Quaternion; Quaternion q(3.1f, 3.4f, 3.7f, 4.0f); // sum of the squares of the components double expectedSumSquares = 50.86; EXPECT_NEAR(expectedSumSquares, q.squaredNorm(), 1e-6); EXPECT_NEAR(sqrt(expectedSumSquares), q.norm(), 1e-6); } /// Normalization of quaternions. TYPED_TEST(QuaternionTests, Normalize) { typedef typename TestFixture::Quaternion Quaternion; Quaternion q(3.1f, 3.4f, 3.7f, 4.0f); // sum of the squares of the components double expectedSumSquares = 50.86; EXPECT_NEAR(sqrt(expectedSumSquares), q.norm(), 1e-6); // normalized() RETURNS the normalized quaternion, leaving original unchanged. Quaternion qNorm = q.normalized(); EXPECT_NEAR(1, qNorm.norm(), 1e-6); EXPECT_NEAR(sqrt(expectedSumSquares), q.norm(), 1e-6); // normalize() NORMALIZES the quaternion, modifying it. q.normalize(); EXPECT_NEAR(1, q.norm(), 1e-6); EXPECT_NEAR(0, (qNorm.coeffs() - q.coeffs()).norm(), 1e-6); } // ==================== TYPE CONVERSION ==================== /// Typecasting quaternions (double <-> float conversions). TYPED_TEST(QuaternionTests, TypeCasting) { typedef typename TestFixture::Quaternion Quaternion; typedef Eigen::Quaternion Quaterniond; typedef Eigen::Quaternion Quaternionf; Quaternion q(12.1f, 12.2f, 12.3f, 12.4f); // Ugh, "template" is required to get this to parse properly. This is // triggered because the test is a part of a template class; you don't // need to do this in a non-template context. Quaterniond qd = q.template cast(); EXPECT_NEAR(q.norm(), qd.norm(), 1e-6); Quaternionf qf = q.template cast(); EXPECT_NEAR(q.norm(), qf.norm(), 1e-4); } // ==================== MISCELLANEOUS ==================== /// Reading from and writing to arrays or blocks of double/float in memory. TYPED_TEST(QuaternionTests, ArrayReadWrite) { typedef typename TestFixture::Quaternion Quaternion; typedef typename TestFixture::Scalar T; const T inputArray[5] = { 12.1f, 12.2f, 12.3f, 12.4f, 12.5f }; T outputArray[5]; // Note that with the current versions of Eigen, you CANNOT say this: // Eigen::Map q(array); // because you can't map Eigen::Quaternion with non-zero flags! // But mapping a default (AutoAlign) quaternion should be safe even if the buffer is not aligned. Eigen::Map > q_in(inputArray); Quaternion q1 = q_in; Eigen::Map > q_out(outputArray); q_out = q1; for (int i = 0; i < 4; ++i) { EXPECT_NEAR(inputArray[i], outputArray[i], 1e-6); } } /// Test quaternion negation. TYPED_TEST(QuaternionTests, Negate) { using SurgSim::Math::negate; typedef typename TestFixture::Scalar T; typedef Eigen::Quaternion Quaternion; // Test that 2 quaternions are opposite if they are not equal but give the same rotation for (size_t numLoop = 0; numLoop < 100; numLoop++) { Quaternion q(Eigen::Matrix::Random()); q.normalize(); Quaternion qNeg = negate(q); EXPECT_FALSE(q.isApprox(qNeg)); typename Quaternion::Matrix3 m = q.toRotationMatrix(); typename Quaternion::Matrix3 mNeg = qNeg.toRotationMatrix(); EXPECT_TRUE(m.isApprox(mNeg)); } } // ==================== SLERP ==================== /// Test quaternion interpolation. TYPED_TEST(QuaternionTests, SlerpInterpolation) { using SurgSim::Math::negate; typedef typename TestFixture::Scalar T; typedef Eigen::Quaternion Quaternion; for (size_t numLoop = 0; numLoop < 100; numLoop++) { Quaternion q; Quaternion q0(Eigen::Matrix::Random()); Quaternion q1(Eigen::Matrix::Random()); q0.normalize(); q1.normalize(); q = SurgSim::Math::interpolate(q0, q1, static_cast(0.0)); EXPECT_TRUE(q.isApprox(q0) || q.isApprox(negate(q0))); q = SurgSim::Math::interpolate(q0, q1, static_cast(1.0)); EXPECT_TRUE(q.isApprox(q1) || q.isApprox(negate(q1))); q = SurgSim::Math::interpolate(q0, q1, static_cast(0.234)); EXPECT_FALSE(q.isApprox(q0) || q.isApprox(negate(q0))); EXPECT_FALSE(q.isApprox(q1) || q.isApprox(negate(q1))); q = SurgSim::Math::interpolate(q0, q1, static_cast(0.5)); EXPECT_FALSE(q.isApprox(q0) || q.isApprox(negate(q0))); EXPECT_FALSE(q.isApprox(q1) || q.isApprox(negate(q1))); // At t=0.5, the interpolation should return (q0 + q1)/2 normalized // c.f. http://en.wikipedia.org/wiki/Slerp // If the quaternions are over PI angle, the slerp will interpolate between q0 and -q1 // in this case, the interpolation is (q0 - q1)/2 normalized // From our specification, both quaternions could be considered negative, so we extend // the tests to these possibilities as well: // (-q0 + q1) / 2 normalized // (-q0 - q1) / 2 normalized Quaternion qHalf0((q0.coeffs() + q1.coeffs()) * 0.5); Quaternion qHalf1((q0.coeffs() - q1.coeffs()) * 0.5); Quaternion qHalf2((-q0.coeffs() + q1.coeffs()) * 0.5); Quaternion qHalf3((-q0.coeffs() - q1.coeffs()) * 0.5); qHalf0.normalize(); qHalf1.normalize(); qHalf2.normalize(); qHalf3.normalize(); EXPECT_TRUE(q.isApprox(qHalf0) || q.isApprox(qHalf1) || q.isApprox(qHalf2) || q.isApprox(qHalf3)); q = SurgSim::Math::interpolate(q0, q1, static_cast(0.874)); EXPECT_FALSE(q.isApprox(q0) || q.isApprox(negate(q0))); EXPECT_FALSE(q.isApprox(q1) || q.isApprox(negate(q1))); } } // TO DO: // testing numerical validity // testing for denormalized numbers // testing degeneracy (norm near 0) // compute an orthonormal frame based on a given normal (z-axis) // Euler angles (various conventions) // power/slerp opensurgsim-0.7.0/SurgSim/Math/UnitTests/RigidTransformTests.cpp000066400000000000000000000145101277777236100250220ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests that exercise the functionality of our rigid transform typedefs, which /// come straight from Eigen. #include #include #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/MathConvert.h" #include "gtest/gtest.h" template class RigidTransformTestBase : public testing::Test { public: typedef T RigidTransform; typedef typename T::Scalar Scalar; }; template class RigidTransform3Tests : public RigidTransformTestBase { }; typedef ::testing::Types RigidTransform3Variants; TYPED_TEST_CASE(RigidTransform3Tests, RigidTransform3Variants); template class AllRigidTransformTests : public RigidTransformTestBase { }; typedef ::testing::Types AllRigidTransformVariants; TYPED_TEST_CASE(AllRigidTransformTests, AllRigidTransformVariants); /// Test that rigid transforms can be constructed TYPED_TEST(AllRigidTransformTests, CanConstruct) { typename TestFixture::RigidTransform transform; } /// Test rigid transforms interpolation TYPED_TEST(AllRigidTransformTests, Interpolation) { using SurgSim::Math::makeRigidTransform; typedef typename TestFixture::Scalar T; typedef Eigen::Quaternion Quaternion; typedef Eigen::Transform Transform; typedef Eigen::Matrix Vector3; for (size_t numLoop = 0; numLoop < 100; numLoop++) { Quaternion q0(Eigen::Matrix::Random()); Quaternion q1(Eigen::Matrix::Random()); q0.normalize(); q1.normalize(); Vector3 t0(Vector3::Random()); Vector3 t1(Vector3::Random()); Transform transform0 = makeRigidTransform(q0, t0); Transform transform1 = makeRigidTransform(q1, t1); { Transform transform = SurgSim::Math::interpolate(transform0, transform1, static_cast(0.0)); EXPECT_TRUE(transform.isApprox(transform0)); } { Transform transform = SurgSim::Math::interpolate(transform0, transform1, static_cast(1.0)); EXPECT_TRUE(transform.isApprox(transform1)); } { Transform transform = SurgSim::Math::interpolate(transform0, transform1, static_cast(0.234)); EXPECT_FALSE(transform.isApprox(transform0)); EXPECT_FALSE(transform.isApprox(transform1)); } { Transform transform = SurgSim::Math::interpolate(transform0, transform1, static_cast(0.5)); EXPECT_FALSE(transform.isApprox(transform0)); EXPECT_FALSE(transform.isApprox(transform1)); // At t=0.5, the rotation interpolation should return (q0 + q1)/2 normalized // c.f. http://en.wikipedia.org/wiki/Slerp // If the quaternions are over PI angle, the slerp will interpolate between q0 and -q1 // in this case, the interpolation is (q0 - q1)/2 normalized // From our specification, both quaternions could be considered negative, so we extend // the tests to these possibilities as well: // (-q0 + q1) / 2 normalized // (-q0 - q1) / 2 normalized Quaternion qHalf0((q0.coeffs() + q1.coeffs()) * 0.5); Quaternion qHalf1((q0.coeffs() - q1.coeffs()) * 0.5); Quaternion qHalf2((-q0.coeffs() + q1.coeffs()) * 0.5); Quaternion qHalf3((-q0.coeffs() - q1.coeffs()) * 0.5); qHalf0.normalize(); qHalf1.normalize(); qHalf2.normalize(); qHalf3.normalize(); Vector3 tHalf = (t0 + t1) * 0.5; Transform transformHalf0 = makeRigidTransform(qHalf0, tHalf); Transform transformHalf1 = makeRigidTransform(qHalf1, tHalf); Transform transformHalf2 = makeRigidTransform(qHalf2, tHalf); Transform transformHalf3 = makeRigidTransform(qHalf3, tHalf); EXPECT_TRUE(transform.isApprox(transformHalf0) || transform.isApprox(transformHalf1) || transform.isApprox(transformHalf2) || transform.isApprox(transformHalf3)); } { Transform transform = SurgSim::Math::interpolate(transform0, transform1, static_cast(0.839)); EXPECT_FALSE(transform.isApprox(transform0)); EXPECT_FALSE(transform.isApprox(transform1)); } } } TYPED_TEST(AllRigidTransformTests, MakeLookAt) { typedef typename TestFixture::Scalar T; typedef Eigen::Transform Transform; typedef Eigen::Matrix Vector3; typedef Eigen::Matrix Vector4; Vector3 origin(0.0, 0.0, 0.0); Vector3 eye(10.0, 10.0, 10.0); Vector3 up(0.0, 1.0, 0.0); Vector4 center4(0.0, 0.0, 0.0, 1.0); // This follows the OpenGl convention for the camera view matrix transform, any axis would do see // the documentation for makeRigidTransform and gluLookAt() Vector4 direction4(0.0, 0.0, -1.0, 1.0); Vector4 eye4(10.0, 10.0, 10.0, 1.0); Transform transform = SurgSim::Math::makeRigidTransform(eye, origin, up); EXPECT_TRUE(eye4.isApprox(transform * center4)); Vector4 transformed = transform * direction4; Vector3 direction3(transformed[0], transformed[1], transformed[2]); EXPECT_TRUE(eye.normalized().isApprox(direction3.normalized())); } // Test conversion to and from yaml node TYPED_TEST(AllRigidTransformTests, YamlConvert) { using SurgSim::Math::makeRigidTransform; typedef typename TestFixture::Scalar T; typedef Eigen::Quaternion Quaternion; typedef Eigen::Transform Transform; typedef Eigen::Matrix Vector3; const T inputValues[4] = {1.1f, 2.2f, 3.3f, 4.4f}; Quaternion quaternion(inputValues); quaternion.normalize(); Vector3 translation(inputValues); Transform transform = makeRigidTransform(quaternion, translation); YAML::Node node; ASSERT_NO_THROW(node = transform); EXPECT_TRUE(node.IsMap()); EXPECT_EQ(2, node.size()); Transform expected; ASSERT_NO_THROW(expected = node.as()); EXPECT_TRUE(transform.isApprox(expected)); }opensurgsim-0.7.0/SurgSim/Math/UnitTests/ScalarTests.cpp000066400000000000000000000117141277777236100233000ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the Scalar functions. #include #include "SurgSim/Math/Matrix.h" #include "SurgSim/Math/Scalar.h" namespace SurgSim { namespace Math { class ScalarTests : public ::testing::Test {}; TEST(ScalarTests, TwoEntriesTests) { int minInt = 7; int maxInt = 52; int valueInt; int epsilonInt = 5; float minFloat = 7.0; float maxFloat = 52.0; float valueFloat; float epsilonFloat = 5.0; double minDouble = 7.0; double maxDouble = 52.0; double valueDouble; double epsilonDouble = 5.0; { SCOPED_TRACE("Test < minimum"); valueInt = 6; EXPECT_EQ(minInt, Math::clamp(valueInt, minInt, maxInt, epsilonInt)); valueFloat = 6.0; EXPECT_FLOAT_EQ(minFloat, Math::clamp(valueFloat, minFloat, maxFloat, epsilonFloat)); valueDouble = 6.0; EXPECT_DOUBLE_EQ(minDouble, Math::clamp(valueDouble, minDouble, maxDouble, epsilonDouble)); } { SCOPED_TRACE("Test value = minimum + epsilon"); valueInt = 12; EXPECT_EQ(minInt, Math::clamp(valueInt, minInt, maxInt, epsilonInt)); valueFloat = 12.0; EXPECT_FLOAT_EQ(minFloat, Math::clamp(valueFloat, minFloat, maxFloat, epsilonFloat)); valueDouble = 12.0; EXPECT_DOUBLE_EQ(minDouble, Math::clamp(valueDouble, minDouble, maxDouble, epsilonDouble)); } { SCOPED_TRACE("Test value > minimum + epsilon"); valueInt = 13; EXPECT_EQ(13, Math::clamp(valueInt, minInt, maxInt, epsilonInt)); valueFloat = static_cast(12.0 + 1.0e-04); EXPECT_FLOAT_EQ(static_cast(12.0 + 1.0e-04), Math::clamp(valueFloat, minFloat, maxFloat, epsilonFloat)); valueDouble = 12.0 + 1.0e-12; EXPECT_DOUBLE_EQ(12.0 + 1.0e-12, Math::clamp(valueDouble, minDouble, maxDouble, epsilonDouble)); } { SCOPED_TRACE("Test > maximum"); valueInt = 54; EXPECT_EQ(maxInt, Math::clamp(valueInt, minInt, maxInt, epsilonInt)); valueFloat = 54.0; EXPECT_FLOAT_EQ(maxFloat, Math::clamp(valueFloat, minFloat, maxFloat, epsilonFloat)); valueDouble = 54.0; EXPECT_DOUBLE_EQ(maxDouble, Math::clamp(valueDouble, minDouble, maxDouble, epsilonDouble)); } { SCOPED_TRACE("Test value = maximum - epsilon"); valueInt = 47; EXPECT_EQ(maxInt, Math::clamp(valueInt, minInt, maxInt, epsilonInt)); valueFloat = 47.0; EXPECT_FLOAT_EQ(maxFloat, Math::clamp(valueFloat, minFloat, maxFloat, epsilonFloat)); valueDouble = 47.0; EXPECT_DOUBLE_EQ(maxDouble, Math::clamp(valueDouble, minDouble, maxDouble, epsilonDouble)); } { SCOPED_TRACE("Test value < maximum - epsilon"); valueInt = 46; EXPECT_EQ(46, Math::clamp(valueInt, minInt, maxInt, epsilonInt)); valueFloat = static_cast(47.0 - 1.0e-04); EXPECT_FLOAT_EQ(static_cast(47.0 - 1.0e-04), Math::clamp(valueFloat, minFloat, maxFloat, epsilonFloat)); valueDouble = 47.0 - 1.0e-12; EXPECT_DOUBLE_EQ(47.0 - 1.0e-12, Math::clamp(valueDouble, minDouble, maxDouble, epsilonDouble)); } { SCOPED_TRACE("Test maximum - epsilon < value > minimum + epsilon "); valueInt = 36; epsilonInt = 30; EXPECT_EQ(maxInt, Math::clamp(valueInt, minInt, maxInt, epsilonInt)); valueFloat = 36.0; epsilonFloat = 30; EXPECT_FLOAT_EQ(maxFloat, Math::clamp(valueFloat, minFloat, maxFloat, epsilonFloat)); valueDouble = 36.0; epsilonDouble = 30.0; EXPECT_DOUBLE_EQ(maxDouble, Math::clamp(valueDouble, minDouble, maxDouble, epsilonDouble)); } { SCOPED_TRACE("Test matrix implementation for all cases "); Math::Matrix33d m1 = Math::Matrix33d::Zero(); m1(0, 0) = 12.0; m1(0, 1) = 6.0; m1(0, 2) = 12.0 + 1.0e-12; m1(1, 0) = 54.0; m1(1, 1) = 47.0; m1(1, 2) = 47.0 - 1.0e-12; m1(2, 0) = 36.0; Math::Matrix33d backup = m1; double epsilonDouble = 5.0; Math::Matrix33d result = m1.unaryExpr(clampOperator(minDouble, maxDouble, epsilonDouble)); for (size_t row = 0; row < 3; ++row) { for (size_t column = 0; column < 3; ++column) { EXPECT_DOUBLE_EQ(Math::clamp(backup.coeffRef(row, column), minDouble, maxDouble, epsilonDouble), result.coeff(row, column)); } } epsilonDouble = 30.0; result = m1.unaryExpr(clampOperator(minDouble, maxDouble, epsilonDouble)); for (size_t row = 0; row < 3; ++row) { for (size_t column = 0; column < 3; ++column) { EXPECT_DOUBLE_EQ(Math::clamp(backup.coeffRef(row, column), minDouble, maxDouble, epsilonDouble), result.coeff(row, column)); } } } }; }; // namespace Math }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Math/UnitTests/SegmentMeshShapeTests.cpp000066400000000000000000000113721277777236100252730ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/DataStructures/AabbTree.h" #include "SurgSim/DataStructures/EmptyData.h" #include "SurgSim/Framework/ApplicationData.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Math/Aabb.h" #include "SurgSim/Math/Geometry.h" #include "SurgSim/Math/MathConvert.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/SegmentMeshShape.h" #include "SurgSim/Math/Vector.h" using SurgSim::DataStructures::EmptyData; using SurgSim::DataStructures::SegmentMeshPlain; using SurgSim::Math::Matrix33d; using SurgSim::Math::SegmentMeshShape; using SurgSim::Math::Quaterniond; using SurgSim::Math::Vector3d; class SegmentMeshShapeTest : public ::testing::Test { public: std::shared_ptr build(const Vector3d& start, const Vector3d& direction, size_t numVertices = 10) const { auto mesh = std::make_shared(); // Add the vertices for (size_t i = 0; i < numVertices; ++i) { mesh->addVertex(SegmentMeshPlain::VertexType(start + direction * static_cast(i))); } // Define the edges for (size_t i = 0; i < numVertices - 1; ++i) { std::array indices = {{i, i + 1}}; mesh->addEdge(SegmentMeshPlain::EdgeType(indices)); } return mesh; } }; TEST_F(SegmentMeshShapeTest, EmptyMeshTest) { SegmentMeshPlain emptyMesh; EXPECT_NO_THROW(SurgSim::Math::SegmentMeshShape(emptyMesh, 1.0)); } TEST_F(SegmentMeshShapeTest, MeshTypeTest) { SegmentMeshPlain emptyMesh; SurgSim::Math::SegmentMeshShape segmentShape(emptyMesh, 1.0); EXPECT_EQ(SurgSim::Math::SHAPE_TYPE_SEGMENTMESH, segmentShape.getType()); } TEST_F(SegmentMeshShapeTest, ValidTest) { SegmentMeshPlain emptyMesh; SurgSim::Math::SegmentMeshShape shape(emptyMesh, 1.0); EXPECT_TRUE(shape.isValid()); shape.setRadius(SurgSim::Math::Geometry::DistanceEpsilon / 2.0); EXPECT_FALSE(shape.isValid()); EXPECT_TRUE(shape.isTransformable()); } TEST_F(SegmentMeshShapeTest, AabbTest) { std::shared_ptr mesh = build(Vector3d(-10.0, -10.0, -10.0), Vector3d(10.0, 10.0, 10.0), 3); std::shared_ptr shape = std::make_shared(*mesh, 3.0); SurgSim::Math::Aabbd expected(Vector3d(-13.0, -13.0, -13.0), Vector3d(13.0, 13.0, 13.0)); shape->update(); EXPECT_TRUE(expected.isApprox(shape->getAabbTree()->getAabb())); } TEST_F(SegmentMeshShapeTest, TransformTest) { using SurgSim::Math::makeRigidTransform; using SurgSim::Math::makeRotationQuaternion; std::shared_ptr mesh = build(Vector3d(-10.0, -10.0, -10.0), Vector3d(10.0, 10.0, 10.0), 3); std::shared_ptr shape = std::make_shared(*mesh, 3.0); // Transform into a new mesh auto newShape = std::dynamic_pointer_cast(shape->getTransformed( makeRigidTransform(makeRotationQuaternion(M_PI_2, Vector3d(0.0, 1.0, 0.0)), Vector3d(0.0, 10.0, 0.0)))); EXPECT_TRUE(Vector3d(-10.0, 0.0, 10.0).isApprox(newShape->getVertex(0).position)); EXPECT_TRUE(Vector3d(0.0, 10.0, 0.0).isApprox(newShape->getVertex(1).position)); EXPECT_TRUE(Vector3d(10.0, 20.0, -10.0).isApprox(newShape->getVertex(2).position)); // Transform existing mesh mesh->transform( makeRigidTransform(makeRotationQuaternion(M_PI_2, Vector3d(0.0, 1.0, 0.0)), Vector3d(0.0, 10.0, 0.0))); // Verify EXPECT_TRUE(Vector3d(-10.0, 0.0, 10.0).isApprox(mesh->getVertex(0).position)); EXPECT_TRUE(Vector3d(0.0, 10.0, 0.0).isApprox(mesh->getVertex(1).position)); EXPECT_TRUE(Vector3d(10.0, 20.0, -10.0).isApprox(mesh->getVertex(2).position)); } TEST_F(SegmentMeshShapeTest, LoadShape) { auto mesh = std::make_shared(); SurgSim::Framework::ApplicationData data("config.txt"); mesh->load("segmentmesh.ply", data); ASSERT_EQ(4u, mesh->getNumVertices()); ASSERT_EQ(3u, mesh->getNumEdges()); auto edge = mesh->getEdge(0); ASSERT_EQ(0u, edge.verticesId[0]); ASSERT_EQ(1u, edge.verticesId[1]); edge = mesh->getEdge(1); ASSERT_EQ(1u, edge.verticesId[0]); ASSERT_EQ(2u, edge.verticesId[1]); edge = mesh->getEdge(2); ASSERT_EQ(2u, edge.verticesId[0]); ASSERT_EQ(3u, edge.verticesId[1]); EXPECT_DOUBLE_EQ(1.234, mesh->getRadius()); } opensurgsim-0.7.0/SurgSim/Math/UnitTests/ShapeTests.cpp000066400000000000000000000470221277777236100231340ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Framework/ApplicationData.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Math/MathConvert.h" #include "SurgSim/Math/Matrix.h" #include "SurgSim/Math/Shape.h" #include "SurgSim/Math/Shapes.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/DataStructures/OctreeNode.h" namespace { const double epsilon = 1e-10; } namespace SurgSim { namespace Math { class ShapeTest : public ::testing::Test { public: void SetUp() { m_rho = 9000.0; m_radius = 0.01; m_length = 0.1; m_size[0] = 0.1; m_size[1] = 0.2; m_size[2] = 0.3; } void TearDown() { } // Mass density double m_rho; // Radius (sphere/cylinder/capsule) double m_radius; // Length (cylinder/capsule) double m_length; // Size (box) double m_size[3]; }; TEST_F(ShapeTest, EncodeEmptyShapeTest) { std::shared_ptr shape; EXPECT_ANY_THROW(YAML::convert>::encode(shape)); } TEST_F(ShapeTest, SphereSerializationTest) { { YAML::Node node; node["SurgSim::Math::SphereShape"]["Radius"] = m_radius; std::shared_ptr shape; ASSERT_NO_THROW(shape = node.as>()); EXPECT_EQ("SurgSim::Math::SphereShape", shape->getClassName()); EXPECT_NEAR(m_radius, shape->getValue("Radius"), epsilon); EXPECT_TRUE(shape->isValid()); } { std::shared_ptr shape; ASSERT_NO_THROW(shape = Shape::getFactory().create("SurgSim::Math::SphereShape")); shape->setValue("Radius", m_radius); EXPECT_TRUE(shape->isValid()); YAML::Node node; ASSERT_NO_THROW(node = shape); EXPECT_TRUE(node.IsMap()); EXPECT_EQ(1u, node.size()); ASSERT_TRUE(node["SurgSim::Math::SphereShape"].IsDefined()); auto data = node["SurgSim::Math::SphereShape"]; EXPECT_EQ(1u, data.size()); std::shared_ptr sphereShape; ASSERT_NO_THROW(sphereShape = std::dynamic_pointer_cast(node.as>())); EXPECT_EQ("SurgSim::Math::SphereShape", sphereShape->getClassName()); EXPECT_NEAR(m_radius, sphereShape->getValue("Radius"), epsilon); EXPECT_TRUE(sphereShape->isValid()); } } TEST_F(ShapeTest, Sphere) { ASSERT_NO_THROW(SphereShape sphere(m_radius)); { SphereShape invalidSphere(-0.1); EXPECT_FALSE(invalidSphere.isValid()); SphereShape sphere(0.1); EXPECT_TRUE(sphere.isValid()); } SphereShape sphere(m_radius); EXPECT_EQ(SurgSim::Math::SHAPE_TYPE_SPHERE, sphere.getType()); EXPECT_NEAR(m_radius, sphere.getRadius(), epsilon); const double& r = m_radius; const double r2 = r * r; double expectedVolume = 4.0 / 3.0 * M_PI * (r2 * r); double expectedMass = m_rho * expectedVolume; double coef = 2.0 / 5.0 * expectedMass * r2; Matrix33d expectedInertia; expectedInertia << coef, 0.0, 0.0, 0.0, coef, 0.0, 0.0, 0.0, coef; double volume = sphere.getVolume(); Vector3d center = sphere.getCenter(); Matrix33d inertia = sphere.getSecondMomentOfVolume() * m_rho; Math::Aabbd aabb(Vector3d(-m_radius, -m_radius, -m_radius)); aabb.extend(Vector3d(m_radius, m_radius, m_radius)); EXPECT_NEAR(expectedVolume, volume, epsilon); EXPECT_TRUE(center.isZero()); EXPECT_TRUE(expectedInertia.isApprox(inertia)); EXPECT_TRUE(sphere.isValid()); EXPECT_FALSE(sphere.isTransformable()); EXPECT_TRUE(aabb.isApprox(sphere.getBoundingBox())); } TEST_F(ShapeTest, BoxSerializationTest) { { YAML::Node node; node["SurgSim::Math::BoxShape"]["SizeX"] = m_size[0]; node["SurgSim::Math::BoxShape"]["SizeY"] = m_size[1]; node["SurgSim::Math::BoxShape"]["SizeZ"] = m_size[2]; std::shared_ptr shape; ASSERT_NO_THROW(shape = node.as>()); EXPECT_EQ("SurgSim::Math::BoxShape", shape->getClassName()); EXPECT_NEAR(m_size[0], shape->getValue("SizeX"), epsilon); EXPECT_NEAR(m_size[1], shape->getValue("SizeY"), epsilon); EXPECT_NEAR(m_size[2], shape->getValue("SizeZ"), epsilon); EXPECT_TRUE(shape->isValid()); } { std::shared_ptr shape; ASSERT_NO_THROW(shape = Shape::getFactory().create("SurgSim::Math::BoxShape")); EXPECT_TRUE(shape->isValid()); // BoxShape of size (0, 0, 0) is regarded as 'valid'. shape->setValue("SizeX", m_size[0]); shape->setValue("SizeY", m_size[1]); shape->setValue("SizeZ", m_size[2]); EXPECT_TRUE(shape->isValid()); YAML::Node node; ASSERT_NO_THROW(node = shape); EXPECT_TRUE(node.IsMap()); EXPECT_EQ(1u, node.size()); ASSERT_TRUE(node["SurgSim::Math::BoxShape"].IsDefined()); auto data = node["SurgSim::Math::BoxShape"]; EXPECT_EQ(3u, data.size()); std::shared_ptr boxShape; ASSERT_NO_THROW(boxShape = std::dynamic_pointer_cast(node.as>())); EXPECT_EQ("SurgSim::Math::BoxShape", boxShape->getClassName()); EXPECT_NEAR(m_size[0], boxShape->getValue("SizeX"), epsilon); EXPECT_NEAR(m_size[1], boxShape->getValue("SizeY"), epsilon); EXPECT_NEAR(m_size[2], boxShape->getValue("SizeZ"), epsilon); EXPECT_TRUE(boxShape->isValid()); } } TEST_F(ShapeTest, Box) { ASSERT_NO_THROW(BoxShape box(m_size[0], m_size[1], m_size[2])); { BoxShape invalidBox(0.1, -0.1, 0.1); EXPECT_FALSE(invalidBox.isValid()); BoxShape box(0.1, 0.2, 0.3); EXPECT_TRUE(box.isValid()); } Vector3d size(m_size[0], m_size[1], m_size[2]); BoxShape box(m_size[0], m_size[1], m_size[2]); EXPECT_NEAR(m_size[0], box.getSizeX(), epsilon); EXPECT_NEAR(m_size[1], box.getSizeY(), epsilon); EXPECT_NEAR(m_size[2], box.getSizeZ(), epsilon); EXPECT_TRUE(box.getSize().isApprox(size)); EXPECT_EQ(SurgSim::Math::SHAPE_TYPE_BOX, box.getType()); EXPECT_TRUE(box.isValid()); double expectedVolume = m_size[0] * m_size[1] * m_size[2]; double expectedMass = m_rho * expectedVolume; double coef = 1.0 / 12.0 * expectedMass; double x2 = m_size[0] * m_size[0]; double y2 = m_size[1] * m_size[1]; double z2 = m_size[2] * m_size[2]; Matrix33d expectedInertia; expectedInertia << coef * (y2 + z2), 0.0, 0.0, 0.0, coef * (x2 + z2), 0.0, 0.0, 0.0, coef * (x2 + y2); double volume = box.getVolume(); Vector3d center = box.getCenter(); Matrix33d inertia = box.getSecondMomentOfVolume() * m_rho; Aabbd aabb(size / 2.0); aabb.extend(-(size / 2.0)); EXPECT_NEAR(expectedVolume, volume, epsilon); EXPECT_TRUE(center.isZero()); EXPECT_TRUE(expectedInertia.isApprox(inertia)); EXPECT_FALSE(box.isTransformable()); EXPECT_TRUE(aabb.isApprox(box.getBoundingBox())); } TEST_F(ShapeTest, CylinderSerializationTest) { { YAML::Node node; node["SurgSim::Math::CylinderShape"]["Length"] = m_length; node["SurgSim::Math::CylinderShape"]["Radius"] = m_length; std::shared_ptr shape; ASSERT_NO_THROW(shape = node.as>()); EXPECT_EQ("SurgSim::Math::CylinderShape", shape->getClassName()); EXPECT_NEAR(m_length, shape->getValue("Length"), epsilon); EXPECT_NEAR(m_length, shape->getValue("Radius"), epsilon); EXPECT_TRUE(shape->isValid()); } { std::shared_ptr shape; ASSERT_NO_THROW(shape = Shape::getFactory().create("SurgSim::Math::CylinderShape")); shape->setValue("Length", m_length); shape->setValue("Radius", m_radius); EXPECT_TRUE(shape->isValid()); YAML::Node node; ASSERT_NO_THROW(node = shape); EXPECT_TRUE(node.IsMap()); EXPECT_EQ(1u, node.size()); ASSERT_TRUE(node["SurgSim::Math::CylinderShape"].IsDefined()); auto data = node["SurgSim::Math::CylinderShape"]; EXPECT_EQ(2u, data.size()); std::shared_ptr cylinderShape; ASSERT_NO_THROW(cylinderShape = std::dynamic_pointer_cast(node.as>())); EXPECT_EQ("SurgSim::Math::CylinderShape", cylinderShape->getClassName()); EXPECT_NEAR(m_length, cylinderShape->getValue("Length"), epsilon); EXPECT_NEAR(m_radius, cylinderShape->getValue("Radius"), epsilon); EXPECT_TRUE(shape->isValid()); } } TEST_F(ShapeTest, Cylinder) { ASSERT_NO_THROW(CylinderShape cyliner(m_length, m_radius)); { CylinderShape invalidCylinder(-0.1, 0.1); EXPECT_FALSE(invalidCylinder.isValid()); CylinderShape invalidCylinder2(0.1, -0.1); EXPECT_FALSE(invalidCylinder2.isValid()); CylinderShape validCylinder(0.1, 0.1); EXPECT_TRUE(validCylinder.isValid()); } CylinderShape cylinder(m_length, m_radius); EXPECT_NEAR(m_length, cylinder.getLength(), epsilon); EXPECT_NEAR(m_radius, cylinder.getRadius(), epsilon); EXPECT_EQ(SurgSim::Math::SHAPE_TYPE_CYLINDER, cylinder.getType()); double expectedVolume = M_PI * m_radius * m_radius * m_length; double expectedMass = m_rho * expectedVolume; double r1sq = m_radius * m_radius; double l2 = m_length * m_length; double coefDir = 1.0 / 2.0 * expectedMass * (r1sq); double coef = 1.0 / 12.0 * expectedMass * (3.0 * (r1sq) + l2); Matrix33d expectedInertia; expectedInertia << coef, 0.0, 0.0, 0.0, coefDir, 0.0, 0.0, 0.0, coef; double volume = cylinder.getVolume(); Vector3d center = cylinder.getCenter(); Matrix33d inertia = cylinder.getSecondMomentOfVolume() * m_rho; Aabbd aabb(Vector3d(-m_radius, -m_length / 2.0, -m_radius)); aabb.extend(Vector3d(m_radius, m_length / 2.0, m_radius)); EXPECT_NEAR(expectedVolume, volume, epsilon); EXPECT_TRUE(center.isZero()); EXPECT_TRUE(expectedInertia.isApprox(inertia)); EXPECT_TRUE(cylinder.isValid()); EXPECT_FALSE(cylinder.isTransformable()); EXPECT_TRUE(aabb.isApprox(cylinder.getBoundingBox())); } TEST_F(ShapeTest, CapsuleSerializationTest) { { YAML::Node node; node["SurgSim::Math::CapsuleShape"]["Length"] = m_length; node["SurgSim::Math::CapsuleShape"]["Radius"] = m_length; std::shared_ptr shape; ASSERT_NO_THROW(shape = node.as>()); EXPECT_EQ("SurgSim::Math::CapsuleShape", shape->getClassName()); EXPECT_NEAR(m_length, shape->getValue("Length"), epsilon); EXPECT_NEAR(m_length, shape->getValue("Radius"), epsilon); EXPECT_TRUE(shape->isValid()); } { std::shared_ptr shape; ASSERT_NO_THROW(shape = Shape::getFactory().create("SurgSim::Math::CapsuleShape")); shape->setValue("Length", m_length); shape->setValue("Radius", m_radius); EXPECT_TRUE(shape->isValid()); YAML::Node node; ASSERT_NO_THROW(node = shape); EXPECT_TRUE(node.IsMap()); EXPECT_EQ(1u, node.size()); ASSERT_TRUE(node["SurgSim::Math::CapsuleShape"].IsDefined()); auto data = node["SurgSim::Math::CapsuleShape"]; EXPECT_EQ(2u, data.size()); std::shared_ptr capsuleShape; ASSERT_NO_THROW(capsuleShape = std::dynamic_pointer_cast(node.as>())); EXPECT_EQ("SurgSim::Math::CapsuleShape", capsuleShape->getClassName()); EXPECT_NEAR(m_length, capsuleShape->getValue("Length"), epsilon); EXPECT_NEAR(m_radius, capsuleShape->getValue("Radius"), epsilon); EXPECT_TRUE(capsuleShape->isValid()); } } TEST_F(ShapeTest, Capsule) { ASSERT_NO_THROW(CapsuleShape capsule(m_length, m_radius)); { CapsuleShape invalidCapsule(-0.1, 0.1); EXPECT_FALSE(invalidCapsule.isValid()); CapsuleShape invalidCapsule2(0.1, -0.1); EXPECT_FALSE(invalidCapsule2.isValid()); CapsuleShape validCapsule(0.1, 0.1); EXPECT_TRUE(validCapsule.isValid()); } CapsuleShape capsule(m_length, m_radius); EXPECT_NEAR(m_length, capsule.getLength(), epsilon); EXPECT_NEAR(m_radius, capsule.getRadius(), epsilon); EXPECT_EQ(SurgSim::Math::SHAPE_TYPE_CAPSULE, capsule.getType()); double r2 = m_radius * m_radius; double r3 = r2 * m_radius; double l2 = m_length * m_length; double volumeCylinder = M_PI * r2 * m_length; double massCylinder = m_rho * volumeCylinder; double volumeSphere = 4.0 / 3.0 * M_PI * r3; double massSphere = m_rho * volumeSphere; double expectedVolume = volumeCylinder + volumeSphere; double coefDir = 2.0 / 5.0 * massSphere * r2; double coef = coefDir; coefDir += 1.0 / 2.0 * massCylinder * r2; coef += massSphere * (1.0 / 4.0 * l2 + 3.0 / 8.0 * m_radius * m_length); coef += 1.0 / 12.0 * massCylinder * (3 * r2 + l2); Matrix33d expectedInertia; expectedInertia << coef, 0.0, 0.0, 0.0, coefDir, 0.0, 0.0, 0.0, coef; double volume = capsule.getVolume(); Vector3d center = capsule.getCenter(); Matrix33d inertia = capsule.getSecondMomentOfVolume() * m_rho; Aabbd aabb(Vector3d(-m_radius, -m_length / 2.0 - m_radius, -m_radius)); aabb.extend(Vector3d(m_radius, m_length / 2.0 + m_radius, m_radius)); EXPECT_NEAR(expectedVolume, volume, epsilon); EXPECT_TRUE(center.isZero()); EXPECT_TRUE(expectedInertia.isApprox(inertia)); EXPECT_TRUE(capsule.isValid()); EXPECT_FALSE(capsule.isTransformable()); EXPECT_TRUE(aabb.isApprox(capsule.getBoundingBox())); } TEST_F(ShapeTest, DoubleSidedPlaneShapeSerializationTest) { { YAML::Node node, empty; node["SurgSim::Math::DoubleSidedPlaneShape"] = empty; std::shared_ptr shape; ASSERT_NO_THROW(shape = node.as>()); EXPECT_EQ("SurgSim::Math::DoubleSidedPlaneShape", shape->getClassName()); EXPECT_TRUE(shape->isValid()); } { std::shared_ptr shape; ASSERT_NO_THROW(shape = Shape::getFactory().create("SurgSim::Math::DoubleSidedPlaneShape")); EXPECT_TRUE(shape->isValid()); YAML::Node node; ASSERT_NO_THROW(node = shape); EXPECT_TRUE(node.IsMap()); EXPECT_EQ(1u, node.size()); ASSERT_TRUE(node["SurgSim::Math::DoubleSidedPlaneShape"].IsDefined()); auto data = node["SurgSim::Math::DoubleSidedPlaneShape"]; EXPECT_EQ(0u, data.size()); // DoubleSidedPlaneShape has no serialized property . std::shared_ptr doubleSidedPlaneShape; ASSERT_NO_THROW(doubleSidedPlaneShape = std::dynamic_pointer_cast(node.as>())); EXPECT_EQ("SurgSim::Math::DoubleSidedPlaneShape", doubleSidedPlaneShape->getClassName()); EXPECT_TRUE(doubleSidedPlaneShape->isValid()); } } TEST_F(ShapeTest, DoubleSidedPlaneShape) { EXPECT_NO_THROW(DoubleSidedPlaneShape doubleSidedPlaneShape); DoubleSidedPlaneShape doubleSidedPlaneShape; EXPECT_EQ(SurgSim::Math::SHAPE_TYPE_DOUBLESIDEDPLANE, doubleSidedPlaneShape.getType()); EXPECT_NEAR(0.0, doubleSidedPlaneShape.getVolume(), epsilon); EXPECT_TRUE(doubleSidedPlaneShape.getCenter().isZero()); EXPECT_TRUE(doubleSidedPlaneShape.getSecondMomentOfVolume().isApprox(Matrix33d::Zero())); EXPECT_NEAR(0.0, doubleSidedPlaneShape.getD(), epsilon); EXPECT_TRUE(doubleSidedPlaneShape.getNormal().isApprox(Vector3d(0.0, 1.0, 0.0))); EXPECT_TRUE(doubleSidedPlaneShape.isValid()); EXPECT_FALSE(doubleSidedPlaneShape.isTransformable()); // There is no sense to trying to build the Bounding box here EXPECT_TRUE(doubleSidedPlaneShape.getBoundingBox().isEmpty()); } TEST_F(ShapeTest, OctreeShapeSerializationTest) { const std::string fileName = "Geometry/staple.ply"; SurgSim::Framework::Runtime runtime("config.txt"); auto shape = std::make_shared(); ASSERT_NO_THROW(shape->loadOctree(fileName)); YAML::Node node = YAML::convert>::encode(shape); EXPECT_TRUE(node[shape->getClassName()].IsMap()); EXPECT_TRUE(node[shape->getClassName()]["Octree"].IsMap()); std::shared_ptr decodedShape; ASSERT_NO_THROW(decodedShape = node.as>()); ASSERT_NE(nullptr, decodedShape); auto convertedShape = std::dynamic_pointer_cast(decodedShape); ASSERT_NE(nullptr, convertedShape); ASSERT_NE(nullptr, convertedShape->getOctree()); EXPECT_EQ(fileName, convertedShape->getOctree()->getFileName()); } TEST_F(ShapeTest, OctreeShape) { OctreeShape::NodeType::AxisAlignedBoundingBox boundingBox(Vector3d::Zero(), m_size); std::shared_ptr node = std::make_shared(boundingBox); SurgSim::Framework::Runtime runtime("config.txt"); { ASSERT_NO_THROW({OctreeShape shape; EXPECT_FALSE(shape.isValid());}); ASSERT_NO_THROW({OctreeShape shape(*node); EXPECT_TRUE(shape.isValid());}); } { OctreeShape shape; EXPECT_NE(nullptr, shape.getOctree()); shape.setOctree(node); EXPECT_EQ(node, shape.getOctree()); EXPECT_TRUE(shape.isValid()); } { SCOPED_TRACE("Normal Loading"); const std::string fileName = "Geometry/staple.ply"; OctreeShape shape; EXPECT_NO_THROW(shape.setOctree(node)); EXPECT_NO_THROW(shape.loadOctree(fileName)); EXPECT_EQ(fileName, shape.getOctree()->getFileName()); EXPECT_EQ(shape.getClassName(), "SurgSim::Math::OctreeShape"); EXPECT_EQ(SurgSim::Math::SHAPE_TYPE_OCTREE, shape.getType()); EXPECT_THROW(shape.getVolume(), SurgSim::Framework::AssertionFailure); EXPECT_TRUE(shape.getCenter().isApprox(Vector3d::Zero(), epsilon)); EXPECT_THROW(shape.getSecondMomentOfVolume(), SurgSim::Framework::AssertionFailure); EXPECT_EQ(fileName, shape.getOctree()->getFileName()); EXPECT_TRUE(shape.isValid()); EXPECT_TRUE(shape.getOctree()->getBoundingBox().isApprox(shape.getBoundingBox())); } { SCOPED_TRACE("Alternative load through property"); const std::string fileName = "Geometry/staple.ply"; OctreeShape shape; EXPECT_NO_THROW(shape.setValue("OctreeFileName", fileName)); EXPECT_EQ(fileName, shape.getOctree()->getFileName()); } { SCOPED_TRACE("Load nonexistent file will throw"); SurgSim::Framework::ApplicationData appData("config.txt"); const std::string fileName = "Nonexistent file"; OctreeShape shape; EXPECT_ANY_THROW(shape.loadOctree(fileName)); } { SCOPED_TRACE("Load existent file containing invalid Octree will throw"); SurgSim::Framework::ApplicationData appData("config.txt"); const std::string fileName = "Geometry/invalid-staple.ply"; OctreeShape shape; EXPECT_ANY_THROW(shape.loadOctree(fileName)); } } TEST_F(ShapeTest, PlaneShapeSerializationTest) { { YAML::Node node, empty; node["SurgSim::Math::PlaneShape"] = empty; std::shared_ptr shape; ASSERT_NO_THROW(shape = node.as>()); EXPECT_EQ("SurgSim::Math::PlaneShape", shape->getClassName()); EXPECT_TRUE(shape->isValid()); } { std::shared_ptr shape; ASSERT_NO_THROW(shape = Shape::getFactory().create("SurgSim::Math::PlaneShape")); YAML::Node node; ASSERT_NO_THROW(node = shape); EXPECT_TRUE(node.IsMap()); EXPECT_EQ(1u, node.size()); ASSERT_TRUE(node["SurgSim::Math::PlaneShape"].IsDefined()); auto data = node["SurgSim::Math::PlaneShape"]; EXPECT_EQ(0u, data.size()); //PlaneShape has no serialized property. std::shared_ptr planeShape; ASSERT_NO_THROW(planeShape = std::dynamic_pointer_cast(node.as>())); EXPECT_EQ("SurgSim::Math::PlaneShape", planeShape->getClassName()); EXPECT_TRUE(planeShape->isValid()); } } TEST_F(ShapeTest, PlaneShape) { EXPECT_NO_THROW(PlaneShape planeShape); PlaneShape planeShape; EXPECT_EQ(SurgSim::Math::SHAPE_TYPE_PLANE, planeShape.getType()); EXPECT_NEAR(0.0, planeShape.getVolume(), epsilon); EXPECT_TRUE(planeShape.getCenter().isZero()); EXPECT_TRUE(planeShape.getSecondMomentOfVolume().isApprox(Matrix33d::Zero())); EXPECT_NEAR(0.0, planeShape.getD(), epsilon); EXPECT_TRUE(planeShape.getNormal().isApprox(Vector3d(0.0, 1.0, 0.0))); EXPECT_TRUE(planeShape.isValid()); EXPECT_FALSE(planeShape.isTransformable()); EXPECT_TRUE(planeShape.getBoundingBox().isEmpty()); } } } opensurgsim-0.7.0/SurgSim/Math/UnitTests/SparseMatrixTests.cpp000066400000000000000000000325661277777236100245250ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file SparseMatrixTests.cpp /// Tests that exercise the functionality of our sparse matrices, which come /// straight from Eigen. #include #include #include "SurgSim/Math/SparseMatrix.h" using std::tuple; using std::tuple_element; using SurgSim::Math::Matrix; template class TypeValue { public: static const size_t value = N; }; template const size_t TypeValue::value; template class SparseMatrices : public ::testing::Test { public: typedef typename tuple_element<0, Tuple>::type T; static const int Opt = tuple_element<1, Tuple>::type::value; typedef typename tuple_element<2, Tuple>::type I; void SetUp() override { m_columnId = 6; m_rowId = 11; m_matrixTooSmall.resize(m_n - 1, m_m - 1); m_matrixTooSmall.setZero(); m_matrixWithoutExtraCoefficients.resize(18, 18); m_matrixWithoutExtraCoefficients.setZero(); m_matrixMissingCoefficients.resize(18, 18); m_matrixMissingCoefficients.setZero(); m_matrixWithoutExtraCoefficientsExpected.resize(18, 18); m_matrixWithoutExtraCoefficientsExpected.setZero(); for (I i = 0; i < m_rowId; i++) { for (I j = 0; j < m_columnId; j++) { m_matrixWithoutExtraCoefficients.insert(i, j) = 1.0; m_matrixMissingCoefficients.insert(i, j) = 1.0; m_matrixWithoutExtraCoefficientsExpected.insert(i, j) = 1.0; } for (I j = m_columnId + m_m; j < 18; j++) { m_matrixWithoutExtraCoefficients.insert(i, j) = 1.0; m_matrixMissingCoefficients.insert(i, j) = 1.0; m_matrixWithoutExtraCoefficientsExpected.insert(i, j) = 1.0; } } for (I i = m_rowId; i < m_rowId + m_n; i++) { for (I j = m_columnId; j < m_columnId + m_m; j++) { m_matrixWithoutExtraCoefficients.insert(i , j) = 1.0; if (i % 2 == 0 || j % 2 == 0) { m_matrixMissingCoefficients.insert(i, j) = 1.0; } m_matrixWithoutExtraCoefficientsExpected.insert(i, j) = (i - m_rowId == 0 && j - m_columnId == 3 ? 2 : static_cast(i - m_rowId + 1) * static_cast(j - m_columnId + 1)); } } for (I i = m_rowId + m_n; i < 18; i++) { for (I j = 0; j < m_columnId; j++) { m_matrixWithoutExtraCoefficients.insert(i, j) = 1.0; m_matrixMissingCoefficients.insert(i, j) = 1.0; m_matrixWithoutExtraCoefficientsExpected.insert(i, j) = 1.0; } for (I j = m_columnId + m_m; j < 18; j++) { m_matrixWithoutExtraCoefficients.insert(i, j) = 1.0; m_matrixMissingCoefficients.insert(i, j) = 1.0; m_matrixWithoutExtraCoefficientsExpected.insert(i, j) = 1.0; } } m_matrixWithExtraCoefficients = m_matrixWithoutExtraCoefficients; m_matrixWithExtraCoefficientsExpected = m_matrixWithoutExtraCoefficientsExpected; addElementOnBlockRowsCols(&m_matrixWithExtraCoefficients); addElementOnBlockRowsCols(&m_matrixWithExtraCoefficientsExpected); m_matrixWithoutExtraCoefficients.makeCompressed(); m_matrixMissingCoefficients.makeCompressed(); m_matrixWithoutExtraCoefficientsExpected.makeCompressed(); } void addElementOnBlockRowsCols(Eigen::SparseMatrix* m) { m->insert(m_rowId, m_columnId - 3) = 1.0; m->insert(m_rowId, m_columnId - 1) = 1.0; m->insert(m_rowId - 4, m_columnId) = 1.0; m->insert(m_rowId - 2, m_columnId) = 1.0; m->insert(m_rowId - 3, m_columnId + 1) = 1.0; m->makeCompressed(); } void TestSetWithSearchDynamic(const Eigen::Ref& sub, bool subTooSmall = false, bool success = true) { using SurgSim::Math::blockWithSearch; using SurgSim::Math::Operation; SetUp(); if (subTooSmall) { EXPECT_THROW((blockWithSearch(sub, m_rowId, m_columnId, m_n, m_m,\ &m_matrixWithExtraCoefficients,\ &Operation>::assign)),\ SurgSim::Framework::AssertionFailure); } else { // No recipient specified EXPECT_THROW((blockWithSearch(sub, m_rowId, m_columnId, m_n, m_m,\ nullptr, &Operation>::assign)),\ SurgSim::Framework::AssertionFailure); // Recipient too small EXPECT_THROW((blockWithSearch(sub, m_rowId, m_columnId, m_n, m_m, &m_matrixTooSmall,\ &Operation>::assign)),\ SurgSim::Framework::AssertionFailure); // Recipient does not have all the block coefficients (missing coefficients in the block) EXPECT_THROW((blockWithSearch(sub, m_rowId, m_columnId, m_n, m_m, &m_matrixMissingCoefficients,\ &Operation>::assign)),\ SurgSim::Framework::AssertionFailure); // Recipient is correct and sub is correct EXPECT_NO_THROW((blockWithSearch(sub, m_rowId, m_columnId, m_n, m_m, &m_matrixWithExtraCoefficients,\ &Operation>::assign))); if (success) { EXPECT_TRUE(m_matrixWithExtraCoefficients.isApprox(m_matrixWithExtraCoefficientsExpected)); } else { EXPECT_FALSE(m_matrixWithExtraCoefficients.isApprox(m_matrixWithExtraCoefficientsExpected)); } } } void TestAddWithSearchDynamic(const Eigen::Ref& sub, bool subTooSmall = false, bool success = true) { using SurgSim::Math::blockWithSearch; using SurgSim::Math::Operation; SetUp(); if (subTooSmall) { EXPECT_THROW((blockWithSearch(sub, m_rowId, m_columnId, m_n, m_m, &m_matrixWithExtraCoefficients,\ &Operation>::add)),\ SurgSim::Framework::AssertionFailure); } else { // No recipient specified EXPECT_THROW((blockWithSearch(sub, m_rowId, m_columnId, m_n, m_m, nullptr,\ &Operation>::add)),\ SurgSim::Framework::AssertionFailure); // Recipient too small EXPECT_THROW((blockWithSearch(sub, m_rowId, m_columnId, m_n, m_m, &m_matrixTooSmall, &Operation>::add)),\ SurgSim::Framework::AssertionFailure); // Recipient does not have all the block coefficients (missing coefficients in the block) EXPECT_THROW((blockWithSearch(sub, m_rowId, m_columnId, m_n, m_m, &m_matrixMissingCoefficients, &Operation>::add)),\ SurgSim::Framework::AssertionFailure); // Recipient is correct and sub is correct EXPECT_NO_THROW((blockWithSearch(sub, m_rowId, m_columnId, m_n, m_m, &m_matrixWithExtraCoefficients, &Operation>::add))); Eigen::Matrix dense(m_matrixWithExtraCoefficients); Eigen::Matrix denseSub(sub); auto ones = Eigen::Matrix::Ones(m_n, m_m); auto expectedMatrix = denseSub.block(0, 0, m_n, m_m) + ones; if (success) { EXPECT_TRUE((dense.block(m_rowId, m_columnId, m_n, m_m).isApprox(expectedMatrix))); } else { EXPECT_FALSE((dense.block(m_rowId, m_columnId, m_n, m_m).isApprox(expectedMatrix))); } } } template Eigen::Matrix getStaticMatrix() { Eigen::Matrix vec1 = Eigen::Matrix::LinSpaced(1.0, n); Eigen::Matrix vec2 = Eigen::Matrix::LinSpaced(1.0, m); Eigen::Matrix result = vec1 * vec2; if (m >= 4) { result(0, 3) = 2; } return result; } template Eigen::Matrix getDynamicMatrix() { Eigen::Matrix vec1 = Eigen::Matrix::LinSpaced(n, 1.0, n); Eigen::Matrix vec2 = Eigen::Matrix::LinSpaced(m, 1.0, m); Eigen::Matrix result = vec1 * vec2; if (m >= 4) { result(0, 3) = 2; } return result; } template Eigen::SparseMatrix getSparseMatrix() { typedef typename Eigen::SparseVector::Index Index1; typedef typename Eigen::SparseVector::Index Index2; Eigen::SparseVector vec1(n); Eigen::SparseVector vec2(m); for (Index1 i = 0; i < n; i++) { vec1.insert(i) = static_cast(i + 1); } for (Index2 i = 0; i < m; i++) { vec2.insert(i) = static_cast(i + 1); } Eigen::SparseMatrix result(vec1 * vec2); if (m >= 4) { result.coeffRef(0, 3) = 2; } return result; } template Eigen::SparseVector getSparseVector() { typedef typename Eigen::SparseVector::Index Index; Eigen::SparseVector vec(n); for (Index i = 0; i < n; i++) { vec.insert(i) = static_cast(i + 1); } return vec; } protected: Eigen::SparseMatrix m_matrixWithoutExtraCoefficients; Eigen::SparseMatrix m_matrixWithoutExtraCoefficientsExpected; Eigen::SparseMatrix m_matrixWithExtraCoefficients; Eigen::SparseMatrix m_matrixWithExtraCoefficientsExpected; Eigen::SparseMatrix m_matrixTooSmall; Eigen::SparseMatrix m_matrixMissingCoefficients; I m_rowId, m_columnId; static const I m_n = 4; static const I m_m = 4; }; template const typename tuple_element<2, Tuple>::type SparseMatrices::m_n; template const typename tuple_element<2, Tuple>::type SparseMatrices::m_m; template const int SparseMatrices::Opt; typedef ::testing::Types < tuple, int>, tuple, int>, tuple, ptrdiff_t>, tuple, ptrdiff_t>> MyTypes; TYPED_TEST_CASE(SparseMatrices, MyTypes); TYPED_TEST(SparseMatrices, setSubMatrixWithSearchDynamicCall) { typedef typename tuple_element<0, TypeParam>::type T; const int Opt = tuple_element<1, TypeParam>::type::value; const int OtherOpt = (Opt == Eigen::ColMajor ? Eigen::RowMajor : Eigen::ColMajor); { SCOPED_TRACE("Test with static dense input sub-matrix"); this->TestSetWithSearchDynamic(this->template getStaticMatrix(), true); ///< Sub too small (1D) this->TestSetWithSearchDynamic(this->template getStaticMatrix(), true); ///< Sub too small (2D) this->TestSetWithSearchDynamic(this->template getStaticMatrix()); this->TestSetWithSearchDynamic(this->template getStaticMatrix()); this->TestSetWithSearchDynamic(this->template getStaticMatrix()); ///< Sub larger (1D) this->TestSetWithSearchDynamic(this->template getStaticMatrix()); ///< Sub larger (2D) } { SCOPED_TRACE("Test with dynamic dense input sub-matrix"); this->TestSetWithSearchDynamic(this->template getDynamicMatrix(), true); ///< Sub too small (1D) this->TestSetWithSearchDynamic(this->template getDynamicMatrix(), true); ///< Sub too small (2D) this->TestSetWithSearchDynamic(this->template getDynamicMatrix()); this->TestSetWithSearchDynamic(this->template getDynamicMatrix()); this->TestSetWithSearchDynamic(this->template getDynamicMatrix()); ///< Sub larger (1D) this->TestSetWithSearchDynamic(this->template getDynamicMatrix()); ///< Sub larger (2D) } } TYPED_TEST(SparseMatrices, addSubMatrixWithSearchDynamicCall) { typedef typename tuple_element<0, TypeParam>::type T; const int Opt = tuple_element<1, TypeParam>::type::value; const int OtherOpt = (Opt == Eigen::ColMajor ? Eigen::RowMajor : Eigen::ColMajor); { SCOPED_TRACE("Test with static dense input sub-matrix"); this->TestAddWithSearchDynamic(this->template getStaticMatrix(), true); ///< Sub too small (1D) this->TestAddWithSearchDynamic(this->template getStaticMatrix(), true); ///< Sub too small (2D) this->TestAddWithSearchDynamic(this->template getStaticMatrix()); this->TestAddWithSearchDynamic(this->template getStaticMatrix()); this->TestAddWithSearchDynamic(this->template getStaticMatrix()); ///< Sub larger (1D) this->TestAddWithSearchDynamic(this->template getStaticMatrix()); ///< Sub larger (2D) } { SCOPED_TRACE("Test with dynamic dense input sub-matrix"); this->TestAddWithSearchDynamic(this->template getDynamicMatrix(), true); ///< Sub too small (1D) this->TestAddWithSearchDynamic(this->template getDynamicMatrix(), true); ///< Sub too small (2D) this->TestAddWithSearchDynamic(this->template getDynamicMatrix()); this->TestAddWithSearchDynamic(this->template getDynamicMatrix()); this->TestAddWithSearchDynamic(this->template getDynamicMatrix()); ///< Sub larger (1D) this->TestAddWithSearchDynamic(this->template getDynamicMatrix()); ///< Sub larger (2D) } } opensurgsim-0.7.0/SurgSim/Math/UnitTests/SurfaceMeshShapeTests.cpp000066400000000000000000000126051277777236100252610ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/DataStructures/EmptyData.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Math/MathConvert.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/SurfaceMeshShape.h" #include "SurgSim/Math/Vector.h" using SurgSim::DataStructures::EmptyData; using SurgSim::DataStructures::TriangleMeshPlain; using SurgSim::Math::Matrix33d; using SurgSim::Math::SurfaceMeshShape; using SurgSim::Math::Quaterniond; using SurgSim::Math::Vector3d; class SurfaceMeshShapeTest : public ::testing::Test { public: void SetUp() { m_radius = 2.34; m_thickness = 1e-2; m_center = Vector3d(1.3, 3.4, 5.6); m_expectedVolume = M_PI * m_radius * m_radius * m_thickness; m_expectedMatrix.setZero(); m_expectedMatrix(0, 0) = m_expectedVolume * m_radius * m_radius / 4.0; m_expectedMatrix(1, 1) = m_expectedVolume * m_radius * m_radius / 4.0; m_expectedMatrix(2, 2) = m_expectedVolume * m_radius * m_radius / 2.0; } void TearDown() { } double m_radius; double m_thickness; Vector3d m_center; double m_expectedVolume; Matrix33d m_expectedMatrix; std::shared_ptr buildDiskZ(const Quaterniond& q, const Vector3d& center, double radius) const { size_t totalNumNodes = 501; // 1 center + lots on perimeter double deltaAngle = 2.0 * M_PI / static_cast(totalNumNodes - 1); auto disk = std::make_shared(); // Add the center point disk->addVertex(TriangleMeshPlain::VertexType(center)); // Add the peripheral points for (size_t nodeId = 0; nodeId < totalNumNodes - 1; ++nodeId) { double angle = deltaAngle * nodeId; Vector3d p(m_radius * cos(angle), m_radius * sin(angle), 0.0); disk->addVertex(TriangleMeshPlain::VertexType(q._transformVector(p) + center)); } // Define the triangles for (size_t triId = 1; triId < totalNumNodes - 1; ++triId) { std::array indices = {{ 0, triId, triId + 1}}; disk->addTriangle(TriangleMeshPlain::TriangleType(indices)); } return disk; } }; TEST_F(SurfaceMeshShapeTest, EmptyMeshTest) { TriangleMeshPlain emptyMesh; std::shared_ptr diskShape = std::make_shared(emptyMesh, m_thickness); EXPECT_NEAR(0.0, diskShape->getVolume(), 1e-9); EXPECT_TRUE(diskShape->getCenter().isZero()); EXPECT_TRUE(diskShape->getSecondMomentOfVolume().isZero()); } TEST_F(SurfaceMeshShapeTest, DiskShapeTest) { std::shared_ptr diskMesh = buildDiskZ(Quaterniond::Identity(), m_center, m_radius); std::shared_ptr diskShape = std::make_shared(*diskMesh, m_thickness); EXPECT_NEAR(m_expectedVolume, diskShape->getVolume(), 1e-2); EXPECT_TRUE(diskShape->getCenter().isApprox(m_center, 1e-2)); EXPECT_TRUE(diskShape->getSecondMomentOfVolume().isApprox(m_expectedMatrix, 1e-2)); } TEST_F(SurfaceMeshShapeTest, NonAlignedDiskShapeTest) { Quaterniond q(1.3, 5.3, -8.2, 2.4); q.normalize(); std::shared_ptr diskMesh = buildDiskZ(q, m_center, m_radius); std::shared_ptr diskShape = std::make_shared(*diskMesh, m_thickness); Matrix33d rotatedExpectedMatrix = q.toRotationMatrix() * m_expectedMatrix * q.toRotationMatrix().transpose(); EXPECT_NEAR(m_expectedVolume, diskShape->getVolume(), 1e-2); EXPECT_TRUE(diskShape->getCenter().isApprox(m_center, 1e-2)); EXPECT_TRUE(diskShape->getSecondMomentOfVolume().isApprox(rotatedExpectedMatrix, 1e-2)); } TEST_F(SurfaceMeshShapeTest, SerializationTest) { auto runtime = std::make_shared("config.txt"); const std::string fileName = "Geometry/staple_collision.ply"; auto surfaceMeshShape = std::make_shared(); surfaceMeshShape->load(fileName); // We chose to let YAML serialization only works with base class pointer. // i.e. We need to serialize 'surfaceMeshShape' via a SurgSim::Math::Shape pointer. // The usage YAML::Node node = surfaceMeshShape; will not compile. std::shared_ptr shape = surfaceMeshShape; YAML::Node node; ASSERT_NO_THROW(node = shape); // YAML::convert> will be called. EXPECT_TRUE(node.IsMap()); EXPECT_EQ(1u, node.size()); std::shared_ptr newSurfaceMesh; ASSERT_NO_THROW(newSurfaceMesh = std::dynamic_pointer_cast( node.as>())); EXPECT_EQ("SurgSim::Math::SurfaceMeshShape", newSurfaceMesh->getClassName()); EXPECT_EQ(fileName, newSurfaceMesh->getFileName()); EXPECT_EQ(surfaceMeshShape->getNumVertices(), newSurfaceMesh->getNumVertices()); EXPECT_EQ(surfaceMeshShape->getNumEdges(), newSurfaceMesh->getNumEdges()); EXPECT_EQ(surfaceMeshShape->getNumTriangles(), newSurfaceMesh->getNumTriangles()); } opensurgsim-0.7.0/SurgSim/Math/UnitTests/TriangleCapsuleContactCalculationTests.cpp000066400000000000000000000454761277777236100306640ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Math/Geometry.h" #include "SurgSim/Math/UnitTests/MockCapsule.h" #include "SurgSim/Math/UnitTests/MockTriangle.h" namespace SurgSim { namespace Math { class TriangleCapsuleContactCalculationTest : public ::testing::Test { protected: typedef std::tuple // Expected penetration point in the capsule. TriangleCapsuleTestCase; SurgSim::Math::RigidTransform3d buildRigidTransform(double angle, double axisX, double axisY, double axisZ, double translationX, double translationY, double translationZ) { using SurgSim::Math::makeRigidTransform; using SurgSim::Math::makeRotationQuaternion; return makeRigidTransform(makeRotationQuaternion(angle, Vector3d(axisX, axisY, axisZ).normalized()), Vector3d(translationX, translationY, translationZ)); } void SetUp() override { m_transforms.push_back(buildRigidTransform(0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0)); m_transforms.push_back(buildRigidTransform(1.234, 17.04, 2.047, 3.052, 23.34, 42.45, 83.68)); m_transforms.push_back(buildRigidTransform(-5.34, 41.03, -2.52, -3.84, -3.45, 66.47, 29.34)); m_transforms.push_back(buildRigidTransform(0.246, -9.42, -4.86, 2.469, 37.68, -34.6, -17.1)); m_transforms.push_back(buildRigidTransform(-0.85, 3.344, 8.329, -97.4, 9.465, 0.275, -95.9)); } void checkEqual(const Vector3d& v1, const Vector3d& v2) { if (v1.isZero(Geometry::DistanceEpsilon)) { EXPECT_TRUE(v2.isZero(Geometry::DistanceEpsilon)); } else { EXPECT_TRUE(v1.isApprox(v2, Geometry::DistanceEpsilon)); } } void testTriangleCapsuleContactCalculation(const TriangleCapsuleTestCase& data) { MockTriangle t = std::get<1>(data); MockCapsule c = std::get<2>(data); bool contactExpected = std::get<3>(data); bool checkForPenetrationPoints = std::get<4>(data); Vector3d expectedTPoint = std::get<5>(data); Vector3d expectedCPoint = std::get<6>(data); double expectedPenetrationDepth = (expectedCPoint - expectedTPoint).norm(); double penetrationDepth; Vector3d tPoint, cPoint, normal, cPointAxis; bool contactFound = false; std::string traceMessage[12] = {"Triangle vs Capsule", "Triangle (vertices shifted once) vs Capsule", "Triangle (vertices shifted twice) vs Capsule", "Triangle vs Capsule (vertices interchanged)", "Triangle (vertices shifted once) vs Capsule (vertices interchanged)", "Triangle (vertices shifted twice) vs Capsule (vertices interchanged)", "Reversed Triangle vs Capsule", "Reversed Triangle (vertices shifted once) vs Capsule", "Reversed Triangle (vertices shifted twice) vs Capsule", "Reversed Triangle vs Capsule (vertices interchanged)", "Reversed Triangle (vertices shifted once) vs Capsule (vertices interchanged)", "Reversed Triangle (vertices shifted twice) vs Capsule (vertices interchanged)" }; for (int count = 0; count < 12; ++count) { SCOPED_TRACE(std::get<0>(data) + ": " + traceMessage[count]); switch (count) { case 0: EXPECT_NO_THROW( contactFound = calculateContactTriangleCapsule(t.v0, t.v1, t.v2, t.n, c.v0, c.v1, c.r, &penetrationDepth, &tPoint, &cPoint, &normal, &cPointAxis)); break; case 1: EXPECT_NO_THROW( contactFound = calculateContactTriangleCapsule(t.v1, t.v2, t.v0, t.n, c.v0, c.v1, c.r, &penetrationDepth, &tPoint, &cPoint, &normal, &cPointAxis)); break; case 2: EXPECT_NO_THROW( contactFound = calculateContactTriangleCapsule(t.v2, t.v0, t.v1, t.n, c.v0, c.v1, c.r, &penetrationDepth, &tPoint, &cPoint, &normal, &cPointAxis)); break; case 3: EXPECT_NO_THROW( contactFound = calculateContactTriangleCapsule(t.v0, t.v1, t.v2, t.n, c.v1, c.v0, c.r, &penetrationDepth, &tPoint, &cPoint, &normal, &cPointAxis)); break; case 4: EXPECT_NO_THROW( contactFound = calculateContactTriangleCapsule(t.v1, t.v2, t.v0, t.n, c.v1, c.v0, c.r, &penetrationDepth, &tPoint, &cPoint, &normal, &cPointAxis)); break; case 5: EXPECT_NO_THROW( contactFound = calculateContactTriangleCapsule(t.v2, t.v0, t.v1, t.n, c.v1, c.v0, c.r, &penetrationDepth, &tPoint, &cPoint, &normal, &cPointAxis)); break; case 6: EXPECT_NO_THROW( contactFound = calculateContactTriangleCapsule(t.v2, t.v1, t.v0, c.v0, c.v1, c.r, &penetrationDepth, &tPoint, &cPoint, &normal, &cPointAxis)); break; case 7: EXPECT_NO_THROW( contactFound = calculateContactTriangleCapsule(t.v1, t.v0, t.v2, c.v0, c.v1, c.r, &penetrationDepth, &tPoint, &cPoint, &normal, &cPointAxis)); break; case 8: EXPECT_NO_THROW( contactFound = calculateContactTriangleCapsule(t.v0, t.v2, t.v1, c.v0, c.v1, c.r, &penetrationDepth, &tPoint, &cPoint, &normal, &cPointAxis)); break; case 9: EXPECT_NO_THROW( contactFound = calculateContactTriangleCapsule(t.v2, t.v1, t.v0, c.v1, c.v0, c.r, &penetrationDepth, &tPoint, &cPoint, &normal, &cPointAxis)); break; case 10: EXPECT_NO_THROW( contactFound = calculateContactTriangleCapsule(t.v1, t.v0, t.v2, c.v1, c.v0, c.r, &penetrationDepth, &tPoint, &cPoint, &normal, &cPointAxis)); break; case 11: EXPECT_NO_THROW( contactFound = calculateContactTriangleCapsule(t.v0, t.v2, t.v1, c.v1, c.v0, c.r, &penetrationDepth, &tPoint, &cPoint, &normal, &cPointAxis)); break; } EXPECT_EQ(contactExpected, contactFound); if (contactFound) { if (checkForPenetrationPoints && count < 6) { EXPECT_NEAR(expectedPenetrationDepth, penetrationDepth, Geometry::DistanceEpsilon); checkEqual(expectedTPoint, tPoint); checkEqual(expectedCPoint, cPoint); } // Check that tPoint is on the plane of t. double tSignedDistance = std::abs(tPoint.dot(t.n) - t.v0.dot(t.n)); EXPECT_NEAR(tSignedDistance, 0.0, Geometry::DistanceEpsilon); // Check that cPoint is on the surface of c. Vector3d result; double cDistance = SurgSim::Math::distancePointSegment(cPoint, c.v0, c.v1, &result) - c.r; EXPECT_LE(std::abs(cDistance), Geometry::DistanceEpsilon); // Check that tPoint is inside t. EXPECT_TRUE(SurgSim::Math::isPointInsideTriangle(tPoint, t.v0, t.v1, t.v2)); // Check if the penetration depth when applied as correction, separates the shapes. // First move the shapes apart by just short of the penetration depth, to make sure // the shapes are still colliding. { Vector3d tP, cP; Vector3d correction = normal * (0.5 * penetrationDepth - Geometry::DistanceEpsilon); MockTriangle correctedT(t); correctedT.translate(correction); MockCapsule correctedC(c); correctedC.translate(-correction); auto correctedDistance = distanceSegmentTriangle(correctedC.v0, correctedC.v1, correctedT.v0, correctedT.v1, correctedT.v2, correctedT.n, &cP, &tP) - c.r; EXPECT_TRUE(correctedDistance >= -4.0 * Geometry::DistanceEpsilon) << "correctedDistance = " << correctedDistance; EXPECT_TRUE(correctedDistance <= Geometry::DistanceEpsilon) << "correctedDistance = " << correctedDistance; } // Now move the shapes apart by just a little farther than the penetration depth, to establish // that the shapes are not colliding. { Vector3d tP, cP; Vector3d correction = normal * (0.5 * penetrationDepth + Geometry::DistanceEpsilon); MockTriangle correctedT(t); correctedT.translate(correction); MockCapsule correctedC(c); correctedC.translate(-correction); auto correctedDistance = distanceSegmentTriangle(correctedC.v0, correctedC.v1, correctedT.v0, correctedT.v1, correctedT.v2, correctedT.n, &cP, &tP) - c.r; EXPECT_TRUE(correctedDistance <= 4.0 * Geometry::DistanceEpsilon) << "correctedDistance = " << correctedDistance; EXPECT_TRUE(correctedDistance >= -Geometry::DistanceEpsilon) << "correctedDistance = " << correctedDistance; } } } } void testTriangleCapsuleContactCalculation(std::string scenario, Vector3d cv0, Vector3d cv1, bool contactFound, bool checkPenetrationPoints = false, Vector3d pointOnTriangle = Vector3d::Zero(), Vector3d pointOnCapsule = Vector3d::Zero()) { MockTriangle t(Vector3d(5, -5, 0), Vector3d(0, 5, 0), Vector3d(-5, -5, 0)); MockCapsule c(MockCapsule(cv0, cv1, 0.5)); for (const auto& transform : m_transforms) { MockTriangle transformedT(t); transformedT.transform(transform); MockCapsule transformedC(c); transformedC.transform(transform); testTriangleCapsuleContactCalculation(TriangleCapsuleTestCase(scenario, transformedT, transformedC, contactFound, checkPenetrationPoints, (transform * pointOnTriangle).eval(), (transform * pointOnCapsule).eval())); } } private: // List of random transformations. std::vector m_transforms; }; TEST_F(TriangleCapsuleContactCalculationTest, TestCase1) { testTriangleCapsuleContactCalculation("(Perpendicular) Capsule far away from triangle", Vector3d(0.0, 0.0, 10.0), Vector3d(0.0, 0.0, 5.0), false); } TEST_F(TriangleCapsuleContactCalculationTest, TestCase2) { testTriangleCapsuleContactCalculation("(Perpendicular) Capsule far away from triangle", Vector3d(0.0, 0.0, 10.0), Vector3d(0.0, 0.0, 5.0), false); } TEST_F(TriangleCapsuleContactCalculationTest, TestCase3) { testTriangleCapsuleContactCalculation("(Perpendicular) Capsule just away triangle", Vector3d(0.0, 0.0, 10.0), Vector3d(0.0, 0.0, 0.500001), false); } TEST_F(TriangleCapsuleContactCalculationTest, TestCase4) { testTriangleCapsuleContactCalculation("(Perpendicular) Capsule just touching triangle", Vector3d(0.0, 0.0, 10.0), Vector3d(0.0, 0.0, 0.49999), true, true, Vector3d::Zero(), Vector3d(0, 0, -0.00001)); } TEST_F(TriangleCapsuleContactCalculationTest, TestCase5) { testTriangleCapsuleContactCalculation("(Perpendicular) Capsule axis just away from triangle", Vector3d(0.0, 0.0, 10.0), Vector3d(0.0, 0.0, 0.0001), true, true, Vector3d::Zero(), Vector3d(0, 0, -0.4999)); } TEST_F(TriangleCapsuleContactCalculationTest, TestCase6) { testTriangleCapsuleContactCalculation("(Perpendicular) Capsule axis just touching triangle", Vector3d(0.0, 0.0, 10.0), Vector3d(0.0, 0.0, -0.0001), true, true, Vector3d::Zero(), Vector3d(0, 0, -0.5001)); } TEST_F(TriangleCapsuleContactCalculationTest, TestCase7) { testTriangleCapsuleContactCalculation("(Angled) Capsule far away from triangle", Vector3d(1.0, 1.0, 10.0), Vector3d(0.0, 0.0, 5.0), false); } TEST_F(TriangleCapsuleContactCalculationTest, TestCase8) { testTriangleCapsuleContactCalculation("(Angled) Capsule just away triangle", Vector3d(1.0, 1.0, 10.0), Vector3d(0.0, 0.0, 0.500001), false); } TEST_F(TriangleCapsuleContactCalculationTest, TestCase9) { testTriangleCapsuleContactCalculation("(Angled) Capsule just touching triangle", Vector3d(1.0, 1.0, 10.0), Vector3d(0.0, 0.0, 0.49999), true, true, Vector3d::Zero(), Vector3d(0, 0, -0.00001)); } TEST_F(TriangleCapsuleContactCalculationTest, TestCase10) { testTriangleCapsuleContactCalculation("(Angled) Capsule axis just away from triangle", Vector3d(1.0, 1.0, 10.0), Vector3d(0.0, 0.0, 0.0001), true, true, Vector3d::Zero(), Vector3d(0, 0, -0.4999)); } TEST_F(TriangleCapsuleContactCalculationTest, TestCase11) { testTriangleCapsuleContactCalculation("(Angled) Capsule axis just touching triangle", Vector3d(1.0, 1.0, 10.0), Vector3d(0.0, 0.0, -0.0001), true, true, Vector3d::Zero(), Vector3d(0, 0, -0.5001)); } TEST_F(TriangleCapsuleContactCalculationTest, TestCase12) { testTriangleCapsuleContactCalculation("Capsule axis through triangle", Vector3d(0.0, 6.0, 1.0), Vector3d(0.0, -6.0, -1.0), true, false); } TEST_F(TriangleCapsuleContactCalculationTest, TestCase13) { testTriangleCapsuleContactCalculation("(Angled, near edge 1) Capsule far away from triangle", Vector3d(4.0, 0.0, 5.0), Vector3d(2.4, 0.0, 2.0), false); } TEST_F(TriangleCapsuleContactCalculationTest, TestCase14) { testTriangleCapsuleContactCalculation("(Angled, near edge 1) Capsule just away triangle", Vector3d(4.0, 0.0, 5.0), Vector3d(2.4, 0.0, 0.500001), false); } TEST_F(TriangleCapsuleContactCalculationTest, TestCase15) { testTriangleCapsuleContactCalculation("(Angled, near edge 1) Capsule just touching triangle", Vector3d(4.0, 0.0, 5.0), Vector3d(2.4, 0.0, 0.49999), true, true, Vector3d(2.4, 0.0, 0.0), Vector3d(2.4, 0.0,-0.00001)); } TEST_F(TriangleCapsuleContactCalculationTest, TestCase16) { testTriangleCapsuleContactCalculation("(Angled, near edge 1) Capsule axis just away from triangle", Vector3d(4.0, 0.0, 5.0), Vector3d(2.4, 0.0, 0.0001), true, true, Vector3d(2.4, 0.0, 0.0), Vector3d(2.4, 0.0, -0.4999)); } TEST_F(TriangleCapsuleContactCalculationTest, TestCase17) { testTriangleCapsuleContactCalculation("(Angled, near edge 1) Capsule axis just touching triangle", Vector3d(4.0, 0.0, 5.0), Vector3d(2.4, 0.0, -0.0001), true, true, Vector3d(2.4, 0.0, 0.0), Vector3d(2.4, 0.0, -0.5001)); } TEST_F(TriangleCapsuleContactCalculationTest, TestCase18) { testTriangleCapsuleContactCalculation("(Angled, near edge 1) Capsule axis inside triangle", Vector3d(4.0, 0.0, 5.0), Vector3d(2.4, 0.0, -0.5), true); } TEST_F(TriangleCapsuleContactCalculationTest, TestCase19) { testTriangleCapsuleContactCalculation("(Angled, near edge 2) Capsule far away from triangle", Vector3d(-4.0, 0.0, 5.0), Vector3d(-2.4, 0.0, 2.0), false); } TEST_F(TriangleCapsuleContactCalculationTest, TestCase20) { testTriangleCapsuleContactCalculation("(Angled, near edge 2) Capsule just away triangle", Vector3d(-4.0, 0.0, 5.0), Vector3d(-2.4, 0.0, 0.500001), false); } TEST_F(TriangleCapsuleContactCalculationTest, TestCase21) { testTriangleCapsuleContactCalculation("(Angled, near edge 2) Capsule just touching triangle", Vector3d(-4.0, 0.0, 5.0), Vector3d(-2.4, 0.0, 0.49999), true, true, Vector3d(-2.4, 0.0, 0.0), Vector3d(-2.4, 0.0, -0.00001)); } TEST_F(TriangleCapsuleContactCalculationTest, TestCase22) { testTriangleCapsuleContactCalculation("(Angled, near edge 2) Capsule axis just away from triangle", Vector3d(-4.0, 0.0, 5.0), Vector3d(-2.4, 0.0, 0.0001), true, true, Vector3d(-2.4, 0.0, 0.0), Vector3d(-2.4, 0.0, -0.4999)); } TEST_F(TriangleCapsuleContactCalculationTest, TestCase23) { testTriangleCapsuleContactCalculation("(Angled, near edge 2) Capsule axis just touching triangle", Vector3d(-4.0, 0.0, 5.0), Vector3d(-2.4, 0.0, -0.0001), true, true, Vector3d(-2.4, 0.0, 0.0), Vector3d(-2.4, 0.0, -0.5001)); } TEST_F(TriangleCapsuleContactCalculationTest, TestCase24) { testTriangleCapsuleContactCalculation("(Angled, near edge 2) Capsule axis inside triangle", Vector3d(-4.0, 0.0, 5.0), Vector3d(-2.4, 0.0, -0.5), true); } TEST_F(TriangleCapsuleContactCalculationTest, TestCase25) { testTriangleCapsuleContactCalculation("(Angled, near edge 3) Capsule far away from triangle", Vector3d(0.0, -6.0, 5.0), Vector3d(0.0, -4.8, 2.0), false); } TEST_F(TriangleCapsuleContactCalculationTest, TestCase26) { testTriangleCapsuleContactCalculation("(Angled, near edge 3) Capsule just away triangle", Vector3d(0.0, -6.0, 5.0), Vector3d(0.0, -4.8, 0.500001), false); } TEST_F(TriangleCapsuleContactCalculationTest, TestCase27) { testTriangleCapsuleContactCalculation("(Angled, near edge 3) Capsule just touching triangle", Vector3d(0.0, -6.0, 5.0), Vector3d(0.0, -4.8, 0.49999), true, true, Vector3d(0,-4.8,0), Vector3d(0,-4.8,-0.00001)); } TEST_F(TriangleCapsuleContactCalculationTest, TestCase28) { testTriangleCapsuleContactCalculation("(Angled, near edge 3) Capsule axis just away from triangle", Vector3d(0.0, -6.0, 5.0), Vector3d(0.0, -4.8, 0.0001), true, true, Vector3d(0.0, -4.8, 0.0), Vector3d(0.0, -4.8, -0.4999)); } TEST_F(TriangleCapsuleContactCalculationTest, TestCase29) { testTriangleCapsuleContactCalculation("(Angled, near edge 3) Capsule axis just touching triangle", Vector3d(0.0, -6.0, 5.0), Vector3d(0.0, -4.8, -0.0001), true, true, Vector3d(0.0 ,-4.8, 0.0), Vector3d(0.0, -4.8, -0.5001)); } TEST_F(TriangleCapsuleContactCalculationTest, TestCase30) { testTriangleCapsuleContactCalculation("(Angled, near edge 3) Capsule axis inside triangle", Vector3d(0.0, -6.0, 5.0), Vector3d(0.0, -4.8, -0.5), true); } TEST_F(TriangleCapsuleContactCalculationTest, TestCase31) { testTriangleCapsuleContactCalculation("(Angled, at center) Capsule axis inside triangle", Vector3d(0.0, 0.0, -0.01), Vector3d(0.0, -0.1, 3.0), true); } TEST_F(TriangleCapsuleContactCalculationTest, TestCase32) { MockTriangle t(Vector3d(0.0085640543450962274, -0.17216352338611343, 0.032793871473806267), Vector3d(0.17462358883922274, -0.16815838417660384, 0.13533384863957792), Vector3d(0.16119856859908893, -0.21686057517329485, 0.072690609592390418)); MockCapsule c(Vector3d(0.18735007841383616, -0.28690200129741239, 0.11717293620266563), Vector3d(0.10383485572751404, -0.17364876935318688, 0.046339120022104330), 1e-5); testTriangleCapsuleContactCalculation( TriangleCapsuleTestCase("Failing test 1", t, c, true, false, Vector3d(), Vector3d())); } TEST_F(TriangleCapsuleContactCalculationTest, TestCase33) { MockTriangle t(Vector3d(5, -5, 0), Vector3d(0, 5, 0), Vector3d(-5, -5, 0)); MockCapsule c(Vector3d(0, -4, -1), Vector3d(0, -5 + 1e-9, 0), 1e-9); testTriangleCapsuleContactCalculation( TriangleCapsuleTestCase("Failing test 2", t, c, true, false, Vector3d(), Vector3d())); } TEST_F(TriangleCapsuleContactCalculationTest, TestCase34) { MockTriangle t(Vector3d(0005.55605,0087.7003,-0047.2398), Vector3d(0000.110703,0113.919,-0039.387), Vector3d(-0005.57197,0087.8735,-0047.1883)); MockCapsule c(Vector3d(0,0115.5,-0045.), Vector3d(0,0110.,-0040.), 0000.1); testTriangleCapsuleContactCalculation( TriangleCapsuleTestCase("Failing test 3", t, c, true, false, Vector3d(), Vector3d())); } TEST_F(TriangleCapsuleContactCalculationTest, TestCase35) { MockTriangle t(Vector3d(0.013092,0.108735,-0.0290345), Vector3d(0.0077754,0.135282,-0.0222713), Vector3d(0.00196512,0.108977,-0.0290394)); MockCapsule c(Vector3d(0.00207912,0.109781,-0.0298305), Vector3d(0.00309017,0.109511,-0.0247458), 0.0001); testTriangleCapsuleContactCalculation( TriangleCapsuleTestCase("Failing test 4", t, c, true, false, Vector3d(), Vector3d())); } } } opensurgsim-0.7.0/SurgSim/Math/UnitTests/TriangleTriangleContactCalculationTests.cpp000066400000000000000000000150021277777236100310130ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Math/Geometry.h" #include "SurgSim/Math/UnitTests/TriangleTriangleTestParameters.h" namespace SurgSim { namespace Math { class TriangleTriangleContactCalculationTest : public ::testing::Test, public TriangleTriangleTestParameters { protected: void checkEqual(const Vector3d& v1, const Vector3d& v2) { if (v1.isZero(Geometry::DistanceEpsilon)) { EXPECT_TRUE(v2.isZero(Geometry::DistanceEpsilon)); } else { EXPECT_TRUE(v1.isApprox(v2, Geometry::DistanceEpsilon)); } } void testTriangleTriangleContactCalculation(const TriangleTriangleTestCase& data) { SCOPED_TRACE(std::get<0>(data)); MockTriangle t0 = std::get<1>(data); MockTriangle t1 = std::get<2>(data); bool contactExpected = std::get<3>(data); bool checkForPenetrationPoints = std::get<4>(data); Vector3d expectedT0Point = std::get<5>(data); Vector3d expectedT1Point = std::get<6>(data); double expectedPenetrationDepth = (expectedT1Point - expectedT0Point).norm(); double penetrationDepth; Vector3d t0Point, t1Point, normal; bool contactFound = false; std::string traceMessage[6] = {"Normal Test", "Shift t0 edges once", "Shift t0 edges twice", "Switched triangles: Normal Test", "Switched triangles: Shift t1 edges once", "Switched triangles: Shift t1 edges twise" }; for (int count = 0; count < 6; ++count) { SCOPED_TRACE(traceMessage[count]); switch (count) { case 0: EXPECT_NO_THROW( contactFound = calculateContactTriangleTriangle(t0.v0, t0.v1, t0.v2, t1.v0, t1.v1, t1.v2, &penetrationDepth, &t0Point, &t1Point, &normal);); break; case 1: EXPECT_NO_THROW( contactFound = calculateContactTriangleTriangle(t0.v1, t0.v2, t0.v0, t1.v0, t1.v1, t1.v2, &penetrationDepth, &t0Point, &t1Point, &normal);); break; case 2: EXPECT_NO_THROW( contactFound = calculateContactTriangleTriangle(t0.v2, t0.v0, t0.v1, t1.v0, t1.v1, t1.v2, &penetrationDepth, &t0Point, &t1Point, &normal);); break; case 3: EXPECT_NO_THROW( contactFound = calculateContactTriangleTriangle(t1.v0, t1.v1, t1.v2, t0.v0, t0.v1, t0.v2, &penetrationDepth, &t1Point, &t0Point, &normal);); break; case 4: EXPECT_NO_THROW( contactFound = calculateContactTriangleTriangle(t1.v1, t1.v2, t1.v0, t0.v0, t0.v1, t0.v2, &penetrationDepth, &t1Point, &t0Point, &normal);); break; case 5: EXPECT_NO_THROW( contactFound = calculateContactTriangleTriangle(t1.v2, t1.v0, t1.v1, t0.v0, t0.v1, t0.v2, &penetrationDepth, &t1Point, &t0Point, &normal);); break; } EXPECT_EQ(contactExpected, contactFound); if (contactFound) { if (checkForPenetrationPoints && count < 3) { EXPECT_NEAR(expectedPenetrationDepth, penetrationDepth, Geometry::DistanceEpsilon); checkEqual(expectedT0Point, t0Point); checkEqual(expectedT1Point, t1Point); } // Check that t0Point is on the plane of t0. double t0SignedDistance = std::abs(t0Point.dot(t0.n) - t0.v0.dot(t0.n)); EXPECT_NEAR(t0SignedDistance, 0.0, Geometry::DistanceEpsilon); // Check that t1Point is on the plane of t1. double t1SignedDistance = std::abs(t1Point.dot(t1.n) - t1.v0.dot(t1.n)); EXPECT_NEAR(t1SignedDistance, 0.0, Geometry::DistanceEpsilon); // Check that t0Point is inside t0. Vector3d bary0; barycentricCoordinates(t0Point, t0.v0, t0.v1, t0.v2, &bary0); bool isBary0WithinTriangle = bary0[0] >= -Geometry::DistanceEpsilon && bary0[0] <= (1.0 + Geometry::DistanceEpsilon) && bary0[1] >= -Geometry::DistanceEpsilon && bary0[1] <= (1.0 + Geometry::DistanceEpsilon) && bary0[2] >= -Geometry::DistanceEpsilon && bary0[2] <= (1.0 + Geometry::DistanceEpsilon); EXPECT_TRUE(isBary0WithinTriangle); // Check that t1Point is inside t1. Vector3d bary1; barycentricCoordinates(t1Point, t1.v0, t1.v1, t1.v2, &bary1); bool isBary1WithinTriangle = bary1[0] >= -Geometry::DistanceEpsilon && bary1[0] <= (1.0 + Geometry::DistanceEpsilon) && bary1[1] >= -Geometry::DistanceEpsilon && bary1[1] <= (1.0 + Geometry::DistanceEpsilon) && bary1[2] >= -Geometry::DistanceEpsilon && bary1[2] <= (1.0 + Geometry::DistanceEpsilon); EXPECT_TRUE(isBary1WithinTriangle); // Check if the penetration depth when applied as correction, separates the triangles. // First move the triangles apart by just short of the penetration depth, to make sure // the triangles are still colliding. { Vector3d correction = normal * (0.5 * penetrationDepth - Geometry::DistanceEpsilon); if (count > 2) { // Switched triangles. correction = -correction; } MockTriangle correctedT0(t0); correctedT0.translate(correction); MockTriangle correctedT1(t1); correctedT1.translate(-correction); EXPECT_TRUE(doesIntersectTriangleTriangle(correctedT0.v0, correctedT0.v1, correctedT0.v2, correctedT1.v0, correctedT1.v1, correctedT1.v2)); } // Now move the triangles apart by just a little farther than the penetration depth, to establish // that the triangles are not colliding. { Vector3d correction = normal * (0.5 * penetrationDepth + Geometry::DistanceEpsilon); if (count > 2) { // Switched triangles. correction = -correction; } MockTriangle correctedT0(t0); correctedT0.translate(correction); MockTriangle correctedT1(t1); correctedT1.translate(-correction); EXPECT_FALSE(doesIntersectTriangleTriangle(correctedT0.v0, correctedT0.v1, correctedT0.v2, correctedT1.v0, correctedT1.v1, correctedT1.v2)); } } } } }; TEST_F(TriangleTriangleContactCalculationTest, TestCases) { for (auto it = m_testCases.begin(); it != m_testCases.end(); ++it) { testTriangleTriangleContactCalculation(*it); } } } }opensurgsim-0.7.0/SurgSim/Math/UnitTests/TriangleTriangleIntersectionTests.cpp000066400000000000000000000035171277777236100277170ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Math/Geometry.h" #include "SurgSim/Math/UnitTests/TriangleTriangleTestParameters.h" namespace SurgSim { namespace Math { class TriangleTriangleIntersectionTest : public ::testing::Test, public TriangleTriangleTestParameters { }; TEST_F(TriangleTriangleIntersectionTest, TestCases) { for (auto it = m_testCases.begin(); it != m_testCases.end(); ++it) { SCOPED_TRACE(std::get<0>(*it)); MockTriangle t0 = std::get<1>(*it); MockTriangle t1 = std::get<2>(*it); bool intersectionExpected = std::get<3>(*it); EXPECT_EQ(intersectionExpected, doesIntersectTriangleTriangle(t0.v0, t0.v1, t0.v2, t1.v0, t1.v1, t1.v2)); EXPECT_EQ(intersectionExpected, doesIntersectTriangleTriangle(t0.v1, t0.v2, t0.v0, t1.v0, t1.v1, t1.v2)); EXPECT_EQ(intersectionExpected, doesIntersectTriangleTriangle(t0.v2, t0.v0, t0.v1, t1.v0, t1.v1, t1.v2)); EXPECT_EQ(intersectionExpected, doesIntersectTriangleTriangle(t1.v0, t1.v1, t1.v2, t0.v0, t0.v1, t0.v2)); EXPECT_EQ(intersectionExpected, doesIntersectTriangleTriangle(t1.v1, t1.v2, t1.v0, t0.v0, t0.v1, t0.v2)); EXPECT_EQ(intersectionExpected, doesIntersectTriangleTriangle(t1.v2, t1.v0, t1.v1, t0.v0, t0.v1, t0.v2)); } } } }opensurgsim-0.7.0/SurgSim/Math/UnitTests/TriangleTriangleSeparatingAxisContactCalculationTests.cpp000066400000000000000000000140151277777236100336610ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Math/Geometry.h" #include "SurgSim/Math/UnitTests/TriangleTriangleTestParameters.h" namespace SurgSim { namespace Math { class TriangleTriangleSeparatingAxisContactCalculationTest : public ::testing::Test, public TriangleTriangleTestParameters { protected: void checkEqual(const Vector3d& v1, const Vector3d& v2) { if (v1.isZero(Geometry::DistanceEpsilon)) { EXPECT_TRUE(v2.isZero(Geometry::DistanceEpsilon)); } else { EXPECT_TRUE(v1.isApprox(v2, Geometry::DistanceEpsilon)); } } void testTriangleTriangleContactCalculation(const TriangleTriangleTestCase& data) { SCOPED_TRACE(std::get<0>(data)); MockTriangle t0 = std::get<1>(data); MockTriangle t1 = std::get<2>(data); bool contactExpected = std::get<3>(data); double penetrationDepth; Vector3d t0Point, t1Point, normal; bool contactFound = false; std::string traceMessage[6] = {"Normal Test", "Shift t0 edges once", "Shift t0 edges twice", "Switched triangles: Normal Test", "Switched triangles: Shift t1 edges once", "Switched triangles: Shift t1 edges twice" }; for (int count = 0; count < 6; ++count) { SCOPED_TRACE(traceMessage[count]); switch (count) { case 0: EXPECT_NO_THROW( contactFound = calculateContactTriangleTriangleSeparatingAxis(t0.v0, t0.v1, t0.v2, t1.v0, t1.v1, t1.v2, &penetrationDepth, &t0Point, &t1Point, &normal);); break; case 1: EXPECT_NO_THROW( contactFound = calculateContactTriangleTriangleSeparatingAxis(t0.v1, t0.v2, t0.v0, t1.v0, t1.v1, t1.v2, &penetrationDepth, &t0Point, &t1Point, &normal);); break; case 2: EXPECT_NO_THROW( contactFound = calculateContactTriangleTriangleSeparatingAxis(t0.v2, t0.v0, t0.v1, t1.v0, t1.v1, t1.v2, &penetrationDepth, &t0Point, &t1Point, &normal);); break; case 3: EXPECT_NO_THROW( contactFound = calculateContactTriangleTriangleSeparatingAxis(t1.v0, t1.v1, t1.v2, t0.v0, t0.v1, t0.v2, &penetrationDepth, &t1Point, &t0Point, &normal);); break; case 4: EXPECT_NO_THROW( contactFound = calculateContactTriangleTriangleSeparatingAxis(t1.v1, t1.v2, t1.v0, t0.v0, t0.v1, t0.v2, &penetrationDepth, &t1Point, &t0Point, &normal);); break; case 5: EXPECT_NO_THROW( contactFound = calculateContactTriangleTriangleSeparatingAxis(t1.v2, t1.v0, t1.v1, t0.v0, t0.v1, t0.v2, &penetrationDepth, &t1Point, &t0Point, &normal);); break; } EXPECT_EQ(contactExpected, contactFound); if (contactFound) { // Check that t0Point is on the plane of t0. double t0SignedDistance = std::abs(t0Point.dot(t0.n) - t0.v0.dot(t0.n)); EXPECT_NEAR(t0SignedDistance, 0.0, Geometry::DistanceEpsilon); // Check that t1Point is on the plane of t1. double t1SignedDistance = std::abs(t1Point.dot(t1.n) - t1.v0.dot(t1.n)); EXPECT_NEAR(t1SignedDistance, 0.0, Geometry::DistanceEpsilon); // Check that t0Point is inside t0. Vector3d bary0; barycentricCoordinates(t0Point, t0.v0, t0.v1, t0.v2, &bary0); bool isBary0WithinTriangle = bary0[0] >= -Geometry::DistanceEpsilon && bary0[0] <= (1.0 + Geometry::DistanceEpsilon) && bary0[1] >= -Geometry::DistanceEpsilon && bary0[1] <= (1.0 + Geometry::DistanceEpsilon) && bary0[2] >= -Geometry::DistanceEpsilon && bary0[2] <= (1.0 + Geometry::DistanceEpsilon); EXPECT_TRUE(isBary0WithinTriangle); // Check that t1Point is inside t1. Vector3d bary1; barycentricCoordinates(t1Point, t1.v0, t1.v1, t1.v2, &bary1); bool isBary1WithinTriangle = bary1[0] >= -Geometry::DistanceEpsilon && bary1[0] <= (1.0 + Geometry::DistanceEpsilon) && bary1[1] >= -Geometry::DistanceEpsilon && bary1[1] <= (1.0 + Geometry::DistanceEpsilon) && bary1[2] >= -Geometry::DistanceEpsilon && bary1[2] <= (1.0 + Geometry::DistanceEpsilon); EXPECT_TRUE(isBary1WithinTriangle); // Check if the penetration depth when applied as correction, separates the triangles. // First move the triangles apart by just short of the penetration depth, to make sure // the triangles are still colliding. { Vector3d correction = normal * (0.5 * penetrationDepth - Geometry::DistanceEpsilon); if (count > 2) { // Switched triangles. correction = -correction; } MockTriangle correctedT0(t0); correctedT0.translate(correction); MockTriangle correctedT1(t1); correctedT1.translate(-correction); EXPECT_TRUE(doesIntersectTriangleTriangle(correctedT0.v0, correctedT0.v1, correctedT0.v2, correctedT1.v0, correctedT1.v1, correctedT1.v2)); } // Now move the triangles apart by just a little farther than the penetration depth, to establish // that the triangles are not colliding. { Vector3d correction = normal * (0.5 * penetrationDepth + Geometry::DistanceEpsilon); if (count > 2) { // Switched triangles. correction = -correction; } MockTriangle correctedT0(t0); correctedT0.translate(correction); MockTriangle correctedT1(t1); correctedT1.translate(-correction); EXPECT_FALSE(doesIntersectTriangleTriangle(correctedT0.v0, correctedT0.v1, correctedT0.v2, correctedT1.v0, correctedT1.v1, correctedT1.v2)); } } } } }; TEST_F(TriangleTriangleSeparatingAxisContactCalculationTest, TestCases) { for (auto it = m_testCases.begin(); it != m_testCases.end(); ++it) { testTriangleTriangleContactCalculation(*it); } } } } opensurgsim-0.7.0/SurgSim/Math/UnitTests/TriangleTriangleTestParameters.h000066400000000000000000000242211277777236100266310ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"; // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_MATH_UNITTESTS_TRIANGLETRIANGLETESTPARAMETERS_H #define SURGSIM_MATH_UNITTESTS_TRIANGLETRIANGLETESTPARAMETERS_H #include "SurgSim/Math/Vector.h" #include "SurgSim/Math/UnitTests/MockTriangle.h" #include "SurgSim/Math/Geometry.h" namespace SurgSim { namespace Math { /// A base class for triangle-triangle tests, which has a preset list of test cases. class TriangleTriangleTestParameters { protected: typedef std::tuple // Expected penetration point in the second triangle. TriangleTriangleTestCase; /// A list of common test cases. std::vector m_testCases; /// Default constructor. TriangleTriangleTestParameters() { double d = 5.0 * Geometry::DistanceEpsilon; MockTriangle t0(Vector3d(-5, 0, 0), Vector3d(0, 10, 0), Vector3d(5, 0, 0)); MockTriangle t1; { std::string scenario = "vertex t1v0 inside t0v0"; t1 = MockTriangle(t0.v0 + Vector3d(0, 0, d), t0.v1 + t0.n * 2, t0.v2 + t0.n * 2); m_testCases.push_back(TriangleTriangleTestCase(scenario, t1, t0, true, true, t1.v0, t0.v0)); } { std::string scenario = "vertex t1v0 inside of triangle t0"; Vector3d t1v0 = t0.pointInTriangle(0.2, 0.2); t1 = MockTriangle(t1v0 + Vector3d(0, 0, d), t0.v1 + t0.n * 2, t0.v2 + t0.n * 2); m_testCases.push_back(TriangleTriangleTestCase(scenario, t1, t0, true, true, t1.v0, t1v0)); } { std::string scenario = "vertex t1v0, t1v1 inside of triangle t0, at same depth"; Vector3d t1v0 = t0.pointInTriangle(0.2, 0.2); Vector3d t1v1 = t0.pointInTriangle(0.4, 0.4); t1 = MockTriangle(t1v0 + Vector3d(0, 0, d), t1v1 + Vector3d(0, 0, d), t0.v2 + t0.n * 2); m_testCases.push_back(TriangleTriangleTestCase(scenario, t1, t0, true, false, t1.v1, t1v1)); } { std::string scenario = "vertex t1v0, t1v1 inside of triangle t0, depth of t1v0 < t1v1"; Vector3d t1v0 = t0.pointInTriangle(0.2, 0.2); Vector3d t1v1 = t0.pointInTriangle(0.4, 0.4); t1 = MockTriangle(t1v0 + Vector3d(0, 0, d), t1v1 + Vector3d(0, 0, d * 2.0), t0.v2 + t0.n * 2); m_testCases.push_back(TriangleTriangleTestCase(scenario, t1, t0, true, true, t1.v1, t1v1)); } { std::string scenario = "vertex t1v0, t1v1 inside of triangle t0, depth of t1v0 > t1v1"; Vector3d t1v0 = t0.pointInTriangle(0.2, 0.2); Vector3d t1v1 = t0.pointInTriangle(0.4, 0.4); t1 = MockTriangle(t1v0 + Vector3d(0, 0, d * 2.0), t1v1 + Vector3d(0, 0, d), t0.v2 + t0.n * 2); m_testCases.push_back(TriangleTriangleTestCase(scenario, t1, t0, true, true, t1.v0, t1v0)); } { std::string scenario = "vertex t1v0 close to t0v0"; t1 = MockTriangle(t0.v0 + t0.n, t0.v1 + t0.n * 2, t0.v2 + t0.n * 2); m_testCases.push_back(TriangleTriangleTestCase(scenario, t1, t0, false, false, t1.v0, t0.v0)); } { std::string scenario = "vertex t1v0 close to the inside of triangle t0"; Vector3d intersection = t0.pointInTriangle(0.2, 0.2); t1 = MockTriangle(intersection + t0.n , t0.v1 + t0.n * 2, t0.v2 + t0.n * 2); m_testCases.push_back(TriangleTriangleTestCase(scenario, t1, t0, false, false, t1.v0, intersection)); } { std::string scenario = "edge t1v0v1 through triangle t0"; Vector3d t1v0 = t0.pointInTriangle(0.2, 0.2); t1 = MockTriangle(t1v0 + t0.n * 3, t0.v0 - t0.v0v2 * 4 + t0.n, t1v0 - t0.n * 4); Vector3d t0p; Vector3d t1p; m_testCases.push_back(TriangleTriangleTestCase(scenario, t0, t1, true, false, t0p, t1p)); } { std::string scenario = "Triangles parallel"; t1 = MockTriangle(t0.v0 + t0.n * 3, t0.v1 + t0.n * 3, t0.v2 + t0.n * 3); m_testCases.push_back(TriangleTriangleTestCase(scenario, t1, t0, false, false, t1.v0, t1.v0)); } MockTriangle T0(Vector3d(-5.0, 0, 0), Vector3d(5, 0, 0), Vector3d(0, 10, 0)); T0.translate(Vector3d(0, -3.333333333, 0)); MockTriangle T1(Vector3d(-5.0, 0, 0), Vector3d(5, 0, 0), Vector3d(0, 10, 0)); T1.translate(Vector3d(0, -10, 0)); T1.rotateAboutXBy(-90.0); { std::string scenario = "vertex t1v0 inside t0 - 1"; MockTriangle t0(T0); Vector3d t0p(0, 0, 0); MockTriangle t1(T1); t1.translate(Vector3d(0.0, 0.0, -0.1)); Vector3d t1p(0, 0, -0.1); m_testCases.push_back(TriangleTriangleTestCase(scenario, t0, t1, true, true, t0p, t1p)); } { std::string scenario = "vertex t1v0 inside t0 - 2"; MockTriangle t0(T0); Vector3d t0p; MockTriangle t1(T1); t1.translate(Vector3d(0.0, -3.3, -0.1)); Vector3d t1p; m_testCases.push_back(TriangleTriangleTestCase(scenario, t0, t1, true, false, t0p, t1p)); } { std::string scenario = "vertex t1v0 inside t0 - 3"; MockTriangle t0(T0); Vector3d t0p(0, -3.22222222, 0); MockTriangle t1(T1); t1.translate(Vector3d(0.0, -3.22222222, -0.1)); Vector3d t1p(0, -3.22222222, -0.1); m_testCases.push_back(TriangleTriangleTestCase(scenario, t0, t1, true, true, t0p, t1p)); } { std::string scenario = "vertex t1v0 inside t0 - 4"; MockTriangle t0(T0); Vector3d t0p(0, 0, 0); MockTriangle t1(T1); t1.translate(Vector3d(0.0, 0.0, -0.6)); Vector3d t1p(0, 0, -0.6); m_testCases.push_back(TriangleTriangleTestCase(scenario, t0, t1, true, true, t0p, t1p)); } { std::string scenario = "vertex t1v0 inside t0 - 5"; MockTriangle t0(T0); Vector3d t0p(0, 0, 0); MockTriangle t1(T1); t1.rotateAboutZBy(180.0); t1.translate(Vector3d(0.0, 0.0, -6.6)); Vector3d t1p(0, 0, -6.6); m_testCases.push_back(TriangleTriangleTestCase(scenario, t0, t1, true, true, t0p, t1p)); } { std::string scenario = "vertex t1v0 inside t0 - 6"; MockTriangle t0(T0); Vector3d t0p(t0.v2); MockTriangle t1(T1); t1.rotateAboutZBy(180.0); t1.translate(Vector3d(0.0, 0.0, -6.7)); Vector3d t1p(0, 0, 0); m_testCases.push_back(TriangleTriangleTestCase(scenario, t0, t1, true, true, t0p, t1p)); } { std::string scenario = "edge (t1v0,t1v1) inside t0 - 1"; MockTriangle t0(T0); Vector3d t0p; MockTriangle t1(T1); t1.translate(Vector3d(-3.0, 0.0, -6.0)); Vector3d t1p; m_testCases.push_back(TriangleTriangleTestCase(scenario, t0, t1, true, false, t0p, t1p)); } { std::string scenario = "edge (t1v0,t1v1) inside t0 - 2"; MockTriangle t0(T0); Vector3d t0p; MockTriangle t1(T1); t1.rotateAboutZBy(90.0); t1.translate(Vector3d(0.0, -3.5, -9.0)); Vector3d t1p; m_testCases.push_back(TriangleTriangleTestCase(scenario, t0, t1, true, false, t0p, t1p)); } { std::string scenario = "edge (t1v0,t1v1) inside t0 - 3"; MockTriangle t0(T0); Vector3d t0p; MockTriangle t1(T1); t1.rotateAboutYBy(180.0); t1.rotateAboutZBy(90.0); t1.translate(Vector3d(0.0, -4.0, 6.0)); Vector3d t1p; m_testCases.push_back(TriangleTriangleTestCase(scenario, t0, t1, true, false, t0p, t1p)); } { std::string scenario = "edge (t1v0,t1v1) inside t0 - 4"; MockTriangle t0(T0); Vector3d t0p; MockTriangle t1(T1); t1.rotateAboutYBy(180.0); t1.rotateAboutZBy(90.0); t1.translate(Vector3d(4.0, -4.0, 6.0)); Vector3d t1p; m_testCases.push_back(TriangleTriangleTestCase(scenario, t0, t1, true, false, t0p, t1p)); } { std::string scenario = "Failed case in Stapler demo - 1"; MockTriangle t0(Vector3d(-0.0063320380397585046, 0.0028276973112210521, 0.014661107730129588), Vector3d(-0.012108385700376603, 0.0012180224983028599, 0.011926511653863735), Vector3d(-0.016994324947197881, -0.011073183474260971, 0.022191024814086323)); Vector3d t0p; MockTriangle t1(Vector3d(-0.031071999999999999, 0.0028570000000000002, 0.012547000000000001), Vector3d(-0.0016770000000000001, -0.0010070000000000001, 0.0048640000000000003), Vector3d(-0.0013829999999999999, -0.0010030000000000000, 0.012973000000000000)); Vector3d t1p; m_testCases.push_back(TriangleTriangleTestCase(scenario, t0, t1, true, false, t0p, t1p)); } { std::string scenario = "Failed case in Stapler demo - 2"; MockTriangle t0(Vector3d(3.4602053093157404, -1.1441614263267368, 37.870346680755349), Vector3d(3.3720821269094003, -0.20927613787449697, 118.95490947665477), Vector3d(3.2033802246727975, -36.106495941162471, 119.36861234419522)); Vector3d t0p; MockTriangle t1(Vector3d(0.50000000000000002, 3.8999999999999999, 53.099999999999996), Vector3d(0.50000000000000002, -3.8999999999999999, 53.099999999999996), Vector3d(21.299999999999999, 0.00000000000000000, 53.299999999999997)); Vector3d t1p; m_testCases.push_back(TriangleTriangleTestCase(scenario, t0, t1, true, false, t0p, t1p)); } { std::string scenario = "Failed case in Vascular"; MockTriangle t0(Vector3d(0.12419200000000000, -0.0027260000000000001, -0.039763000000000000), Vector3d(0.10276100000000001, -0.0020000000000000000, -0.034617000000000002), Vector3d(0.10060200000000000, -0.0026749999999999999, -0.036646999999999999)); Vector3d t0p; MockTriangle t1(Vector3d(0.13072899974405072, -0.0023620000000000000, -0.033049000000000002), Vector3d(0.12155499974405069, -0.0017220000000000000, -0.039350000000000003), Vector3d(0.12419199974405069, -0.0027260000000000001, -0.039763000000000000)); Vector3d t1p; m_testCases.push_back(TriangleTriangleTestCase(scenario, t0, t1, false, false, t0p, t1p)); } } }; } // namespace Math } // namespace SurgSim #endif // SURGSIM_MATH_UNITTESTS_TRIANGLETRIANGLETESTPARAMETERS_Hopensurgsim-0.7.0/SurgSim/Math/UnitTests/ValidTests.cpp000066400000000000000000000526711277777236100231410ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests that exercise the isValid() functions. #include #include #include "SurgSim/Math/Matrix.h" #include "SurgSim/Math/Valid.h" #include #include "gtest/gtest.h" // Define test fixture class templates. // We don't really need fixtures as such, but the templatization encodes type. template class ValidTests : public testing::Test { public: typedef T Scalar; }; // This used to contain aligned (via Eigen::AutoAlign) matrix type aliases, but we got rid of those. typedef ::testing::Types FloatingPointVariants; TYPED_TEST_CASE(ValidTests, FloatingPointVariants); // Now we're ready to start testing... TYPED_TEST(ValidTests, ValidScalars) { typedef typename TestFixture::Scalar Scalar; using SurgSim::Math::isValid; EXPECT_TRUE(isValid(static_cast(0))); EXPECT_TRUE(isValid(static_cast(1))); EXPECT_TRUE(isValid(std::numeric_limits::denorm_min())); EXPECT_FALSE(isValid(std::numeric_limits::quiet_NaN())); EXPECT_FALSE(isValid(std::numeric_limits::signaling_NaN())); EXPECT_FALSE(isValid(std::numeric_limits::infinity())); } TYPED_TEST(ValidTests, SubnormalScalars) { typedef typename TestFixture::Scalar Scalar; using SurgSim::Math::isSubnormal; EXPECT_FALSE(isSubnormal(static_cast(0))); EXPECT_FALSE(isSubnormal(static_cast(1))); EXPECT_TRUE(isSubnormal(std::numeric_limits::denorm_min())); EXPECT_FALSE(isSubnormal(std::numeric_limits::quiet_NaN())); EXPECT_FALSE(isSubnormal(std::numeric_limits::signaling_NaN())); EXPECT_FALSE(isSubnormal(std::numeric_limits::infinity())); } TYPED_TEST(ValidTests, SubnormalArithmetic) { typedef typename TestFixture::Scalar Scalar; using SurgSim::Math::isSubnormal; Scalar x = 1; EXPECT_FALSE(isSubnormal(x)); int normalSteps; for (normalSteps = 0; normalSteps < 1000000; ++normalSteps) { if (isSubnormal(x) || (x == 0)) { break; } x /= 2; } EXPECT_GT(normalSteps, 0); int subnormalSteps; for (subnormalSteps = 0; subnormalSteps < 1000000; ++subnormalSteps) { if (!isSubnormal(x) || (x == 0)) { break; } x /= 2; } EXPECT_GT(subnormalSteps, 0); } template static void matrixCheckHelper(const T& validMatrix) { // Assumes T is a matrix, 2x2 or larger typedef T Matrix; typedef typename Matrix::Scalar Scalar; using SurgSim::Math::isValid; using SurgSim::Math::isSubnormal; { Matrix matrix = validMatrix; EXPECT_TRUE(isValid(matrix)); EXPECT_FALSE(isSubnormal(matrix)); matrix(0, 1) = std::numeric_limits::denorm_min(); EXPECT_TRUE(isValid(matrix)); EXPECT_TRUE(isSubnormal(matrix)); } { Matrix matrix = validMatrix; EXPECT_TRUE(isValid(matrix)); EXPECT_FALSE(isSubnormal(matrix)); matrix(0, 0) = std::numeric_limits::infinity(); EXPECT_FALSE(isValid(matrix)); EXPECT_FALSE(isSubnormal(matrix)); matrix(1, 1) = std::numeric_limits::denorm_min(); EXPECT_FALSE(isValid(matrix)); EXPECT_TRUE(isSubnormal(matrix)); } { Matrix matrix = validMatrix; EXPECT_TRUE(isValid(matrix)); EXPECT_FALSE(isSubnormal(matrix)); matrix(1, 0) = std::numeric_limits::quiet_NaN(); EXPECT_FALSE(isValid(matrix)); EXPECT_FALSE(isSubnormal(matrix)); } } TYPED_TEST(ValidTests, MatrixChecks) { typedef typename TestFixture::Scalar Scalar; { Eigen::Matrix matrix; matrix.setIdentity(); matrixCheckHelper(matrix); matrix.setZero(); matrixCheckHelper(matrix); } { Eigen::Matrix matrix; matrix.setIdentity(); matrixCheckHelper(matrix); } { Eigen::Matrix matrix; matrix.setIdentity(); matrixCheckHelper(matrix); } { Eigen::Matrix matrix; matrix.setIdentity(); matrixCheckHelper(matrix); } { Eigen::Matrix matrix; matrix.setIdentity(11, 11); matrixCheckHelper(matrix); } } template static void vectorCheckHelper(const T& validVector) { // Assumes T is a vector, size 2 or larger typedef T Vector; typedef typename Vector::Scalar Scalar; using SurgSim::Math::isValid; using SurgSim::Math::isSubnormal; { Vector vector = validVector; EXPECT_TRUE(isValid(vector)); EXPECT_FALSE(isSubnormal(vector)); vector[0] = static_cast(1); EXPECT_TRUE(isValid(vector)); EXPECT_FALSE(isSubnormal(vector)); } { Vector vector = validVector; EXPECT_TRUE(isValid(vector)); EXPECT_FALSE(isSubnormal(vector)); vector[1] = std::numeric_limits::denorm_min(); EXPECT_TRUE(isValid(vector)); EXPECT_TRUE(isSubnormal(vector)); } { Vector vector = validVector; EXPECT_TRUE(isValid(vector)); EXPECT_FALSE(isSubnormal(vector)); vector[0] = std::numeric_limits::infinity(); EXPECT_FALSE(isValid(vector)); EXPECT_FALSE(isSubnormal(vector)); vector[1] = std::numeric_limits::denorm_min(); EXPECT_FALSE(isValid(vector)); EXPECT_TRUE(isSubnormal(vector)); } { Vector vector = validVector; EXPECT_TRUE(isValid(vector)); EXPECT_FALSE(isSubnormal(vector)); vector[1] = std::numeric_limits::quiet_NaN(); EXPECT_FALSE(isValid(vector)); EXPECT_FALSE(isSubnormal(vector)); } } TYPED_TEST(ValidTests, VectorChecks) { typedef typename TestFixture::Scalar Scalar; { Eigen::Matrix vector; vector.setZero(); vectorCheckHelper(vector); vector.setZero(); vectorCheckHelper(vector); } { Eigen::Matrix vector; vector.setZero(); vectorCheckHelper(vector); } { Eigen::Matrix vector; vector.setZero(); vectorCheckHelper(vector); } { Eigen::Matrix vector; vector.setZero(); vectorCheckHelper(vector); } { Eigen::Matrix vector; vector.setZero(11); vectorCheckHelper(vector); } } TYPED_TEST(ValidTests, QuaternionChecks) { typedef typename TestFixture::Scalar Scalar; using SurgSim::Math::isValid; using SurgSim::Math::isSubnormal; Eigen::Quaternion quaternion(1, 0, 0, 0); EXPECT_TRUE(isValid(quaternion)); EXPECT_FALSE(isSubnormal(quaternion)); quaternion.x() = std::numeric_limits::denorm_min(); EXPECT_TRUE(isValid(quaternion)); EXPECT_TRUE(isSubnormal(quaternion)); quaternion = Eigen::Quaternion(std::numeric_limits::infinity(), 0, 0, 0); EXPECT_FALSE(isValid(quaternion)); EXPECT_FALSE(isSubnormal(quaternion)); quaternion.z() = std::numeric_limits::denorm_min(); EXPECT_FALSE(isValid(quaternion)); EXPECT_TRUE(isSubnormal(quaternion)); } TYPED_TEST(ValidTests, AngleAxisChecks) { typedef typename TestFixture::Scalar Scalar; using SurgSim::Math::isValid; using SurgSim::Math::isSubnormal; Eigen::AngleAxis rotation = Eigen::AngleAxis::Identity(); EXPECT_TRUE(isValid(rotation)); EXPECT_FALSE(isSubnormal(rotation)); rotation.angle() = std::numeric_limits::denorm_min(); EXPECT_TRUE(isValid(rotation)); EXPECT_TRUE(isSubnormal(rotation)); rotation = Eigen::AngleAxis::Identity(); rotation.axis()[2] = std::numeric_limits::denorm_min(); EXPECT_TRUE(isValid(rotation)); EXPECT_TRUE(isSubnormal(rotation)); rotation = Eigen::AngleAxis::Identity(); rotation.angle() = std::numeric_limits::infinity(); EXPECT_FALSE(isValid(rotation)); EXPECT_FALSE(isSubnormal(rotation)); rotation.axis()[1] = std::numeric_limits::denorm_min(); EXPECT_FALSE(isValid(rotation)); EXPECT_TRUE(isSubnormal(rotation)); rotation = Eigen::AngleAxis::Identity(); rotation.axis()[0] = std::numeric_limits::quiet_NaN(); EXPECT_FALSE(isValid(rotation)); EXPECT_FALSE(isSubnormal(rotation)); rotation.angle() = std::numeric_limits::denorm_min(); EXPECT_FALSE(isValid(rotation)); EXPECT_TRUE(isSubnormal(rotation)); } TYPED_TEST(ValidTests, Rotation2DChecks) { typedef typename TestFixture::Scalar Scalar; using SurgSim::Math::isValid; using SurgSim::Math::isSubnormal; Eigen::Rotation2D rotation(0); EXPECT_TRUE(isValid(rotation)); EXPECT_FALSE(isSubnormal(rotation)); rotation.angle() = static_cast(1); EXPECT_TRUE(isValid(rotation)); EXPECT_FALSE(isSubnormal(rotation)); rotation.angle() = std::numeric_limits::denorm_min(); EXPECT_TRUE(isValid(rotation)); EXPECT_TRUE(isSubnormal(rotation)); rotation = Eigen::Rotation2D(std::numeric_limits::infinity()); EXPECT_FALSE(isValid(rotation)); EXPECT_FALSE(isSubnormal(rotation)); } template static void transformCheckHelper() { // Assumes T is an Eigen::Transform type of some sort typedef T Transform; typedef typename Transform::Scalar Scalar; using SurgSim::Math::isValid; using SurgSim::Math::isSubnormal; Transform transform = Transform::Identity(); EXPECT_TRUE(isValid(transform)); EXPECT_FALSE(isSubnormal(transform)); transform(1, 1) = std::numeric_limits::denorm_min(); EXPECT_TRUE(isValid(transform)); EXPECT_TRUE(isSubnormal(transform)); transform = Transform::Identity(); transform(0, 0) = std::numeric_limits::quiet_NaN(); EXPECT_FALSE(isValid(transform)); EXPECT_FALSE(isSubnormal(transform)); transform(0, 1) = std::numeric_limits::denorm_min(); EXPECT_FALSE(isValid(transform)); EXPECT_TRUE(isSubnormal(transform)); } TYPED_TEST(ValidTests, TransformChecks) { typedef typename TestFixture::Scalar Scalar; using SurgSim::Math::isValid; using SurgSim::Math::isSubnormal; transformCheckHelper>(); transformCheckHelper>(); transformCheckHelper>(); transformCheckHelper>(); transformCheckHelper>(); transformCheckHelper>(); } TYPED_TEST(ValidTests, ClearSubnormalScalars) { typedef typename TestFixture::Scalar Scalar; using SurgSim::Math::setSubnormalToZero; using SurgSim::Math::isValid; Scalar x; x = 0; EXPECT_FALSE(setSubnormalToZero(&x)); EXPECT_EQ(0, x); x = -1; EXPECT_FALSE(setSubnormalToZero(&x)); EXPECT_EQ(-1, x); x = std::numeric_limits::infinity(); EXPECT_FALSE(setSubnormalToZero(&x)); EXPECT_FALSE(isValid(x)); x = std::numeric_limits::quiet_NaN(); EXPECT_FALSE(setSubnormalToZero(&x)); EXPECT_FALSE(isValid(x)); x = std::numeric_limits::signaling_NaN(); EXPECT_FALSE(setSubnormalToZero(&x)); EXPECT_FALSE(isValid(x)); x = std::numeric_limits::denorm_min(); EXPECT_TRUE(setSubnormalToZero(&x)); EXPECT_EQ(0, x); } template static void compareMatrices(const T& a, const T& b) { typedef T Matrix; typedef typename Matrix::Index Index; EXPECT_EQ(a.rows(), b.rows()); EXPECT_EQ(a.cols(), b.cols()); const Index numColumns = std::min(a.cols(), b.cols()); const Index numRows = std::min(a.rows(), b.rows()); for (Index j = 0; j < numColumns; ++j) { for (Index i = 0; i < numRows; ++i) { bool isValidAij = SurgSim::Math::isValid(a.coeff(i, j)); bool isValidBij = SurgSim::Math::isValid(b.coeff(i, j)); EXPECT_EQ(isValidAij, isValidBij) << "i = " << i << ", j = " << j << ", Aij = " << a.coeff(i, j) << ", Bij = " << b.coeff(i, j); if (isValidAij && isValidBij) { // In general, floating point equality checks are bad, but here they are needed. EXPECT_EQ(a.coeff(i, j), b.coeff(i, j)) << "i = " << i << ", j = " << j; } } } } template static void matrixSetSubnormalHelper(const T& validMatrix) { // Assumes T is a matrix, 2x2 or larger typedef T Matrix; typedef typename Matrix::Scalar Scalar; EXPECT_TRUE(SurgSim::Math::isValid(validMatrix)); EXPECT_FALSE(SurgSim::Math::isSubnormal(validMatrix)); using SurgSim::Math::setSubnormalToZero; { Matrix a = validMatrix; Matrix b = a; EXPECT_FALSE(setSubnormalToZero(&a)); EXPECT_FALSE(setSubnormalToZero(&b)); compareMatrices(a, b); } { Matrix a = validMatrix; a(0, 1) = 0; Matrix b = a; b(0, 1) = std::numeric_limits::denorm_min(); EXPECT_FALSE(setSubnormalToZero(&a)); EXPECT_TRUE(setSubnormalToZero(&b)); compareMatrices(a, b); } { Matrix a = validMatrix; a(0, 0) = std::numeric_limits::infinity(); Matrix b = a; EXPECT_FALSE(setSubnormalToZero(&a)); EXPECT_FALSE(setSubnormalToZero(&b)); compareMatrices(a, b); } { Matrix a = validMatrix; a(1, 0) = std::numeric_limits::quiet_NaN(); a(1, 1) = 0; Matrix b = a; b(1, 1) = std::numeric_limits::denorm_min(); EXPECT_FALSE(setSubnormalToZero(&a)); EXPECT_TRUE(setSubnormalToZero(&b)); compareMatrices(a, b); } } TYPED_TEST(ValidTests, ClearSubnormalMatrix) { typedef typename TestFixture::Scalar Scalar; { Eigen::Matrix matrix; matrix.setConstant(123); matrixSetSubnormalHelper(matrix); matrix.setZero(); matrixSetSubnormalHelper(matrix); } { Eigen::Matrix matrix; matrix.setConstant(123); matrixSetSubnormalHelper(matrix); } { Eigen::Matrix matrix; matrix.setConstant(123); matrixSetSubnormalHelper(matrix); } { Eigen::Matrix matrix; matrix.setConstant(123); matrixSetSubnormalHelper(matrix); } { Eigen::Matrix matrix; matrix.setConstant(11, 13, static_cast(123)); matrixSetSubnormalHelper(matrix); } } template static void vectorSetSubnormalHelper(const T& validVector) { // Assumes T is a vector, size 2 or larger typedef T Vector; typedef typename Vector::Scalar Scalar; using SurgSim::Math::setSubnormalToZero; { Vector a = validVector; Vector b = a; EXPECT_FALSE(setSubnormalToZero(&a)); EXPECT_FALSE(setSubnormalToZero(&b)); compareMatrices(a, b); } { Vector a = validVector; a[0] = 0; Vector b = a; b[0] = std::numeric_limits::denorm_min(); EXPECT_FALSE(setSubnormalToZero(&a)); EXPECT_TRUE(setSubnormalToZero(&b)); compareMatrices(a, b); } { Vector a = validVector; a[1] = std::numeric_limits::infinity(); Vector b = a; EXPECT_FALSE(setSubnormalToZero(&a)); EXPECT_FALSE(setSubnormalToZero(&b)); compareMatrices(a, b); } { Vector a = validVector; a[0] = std::numeric_limits::quiet_NaN(); a[1] = 0; Vector b = a; b[1] = std::numeric_limits::denorm_min(); EXPECT_FALSE(setSubnormalToZero(&a)); EXPECT_TRUE(setSubnormalToZero(&b)); compareMatrices(a, b); } } TYPED_TEST(ValidTests, ClearSubnormalVector) { typedef typename TestFixture::Scalar Scalar; { Eigen::Matrix vector; vector.setConstant(543); vectorSetSubnormalHelper(vector); vector.setZero(); vectorSetSubnormalHelper(vector); } { Eigen::Matrix vector; vector.setConstant(543); vectorSetSubnormalHelper(vector); } { Eigen::Matrix vector; vector.setConstant(543); vectorSetSubnormalHelper(vector); } { Eigen::Matrix vector; vector.setConstant(543); vectorSetSubnormalHelper(vector); } { Eigen::Matrix vector; vector.setConstant(21, static_cast(543)); vectorSetSubnormalHelper(vector); } } TYPED_TEST(ValidTests, ClearSubnormalQuaternion) { typedef typename TestFixture::Scalar Scalar; using SurgSim::Math::setSubnormalToZero; Eigen::Quaternion quaternion(1, 0, 0, 0); EXPECT_FALSE(setSubnormalToZero(&quaternion)); { Eigen::Quaternion q2 = quaternion; q2.x() = std::numeric_limits::denorm_min(); EXPECT_TRUE(setSubnormalToZero(&q2)); compareMatrices(quaternion.coeffs(), q2.coeffs()); } { Eigen::Quaternion q3 = quaternion; q3.y() = std::numeric_limits::infinity(); EXPECT_FALSE(setSubnormalToZero(&q3)); EXPECT_FALSE(SurgSim::Math::isValid(q3)); Eigen::Quaternion q4 = q3; q4.z() = std::numeric_limits::denorm_min(); EXPECT_TRUE(setSubnormalToZero(&q4)); compareMatrices(q3.coeffs(), q4.coeffs()); } } template static void compareAngleAxis(const T& a, const T& b) { bool isValidAngleA = SurgSim::Math::isValid(a.angle()); bool isValidAngleB = SurgSim::Math::isValid(b.angle()); EXPECT_EQ(isValidAngleA, isValidAngleB) << " angle A = " << a.angle() << ", B = " << b.angle(); if (isValidAngleA && isValidAngleB) { // In general, floating point equality checks are bad, but here they are needed. EXPECT_EQ(a.angle(), b.angle()); } compareMatrices(a.axis(), b.axis()); } TYPED_TEST(ValidTests, ClearSubnormalAngleAxis) { typedef typename TestFixture::Scalar Scalar; using SurgSim::Math::setSubnormalToZero; typedef Eigen::AngleAxis AngleAxis; typedef Eigen::Matrix Vector3; AngleAxis rotation; rotation = AngleAxis(-1, Vector3(1, 2, 3)); EXPECT_FALSE(setSubnormalToZero(&rotation)); compareAngleAxis(AngleAxis(-1, Vector3(1, 2, 3)), rotation); rotation = AngleAxis(std::numeric_limits::denorm_min(), Vector3(1, 2, 3)); EXPECT_TRUE(setSubnormalToZero(&rotation)); compareAngleAxis(AngleAxis(0, Vector3(1, 2, 3)), rotation); rotation = AngleAxis(-1, Vector3(std::numeric_limits::denorm_min(), 2, 3)); EXPECT_TRUE(setSubnormalToZero(&rotation)); compareAngleAxis(AngleAxis(-1, Vector3(0, 2, 3)), rotation); rotation = AngleAxis(-1, Vector3(1, std::numeric_limits::infinity(), 3)); EXPECT_FALSE(setSubnormalToZero(&rotation)); compareAngleAxis(AngleAxis(-1, Vector3(1, std::numeric_limits::infinity(), 3)), rotation); rotation = AngleAxis(std::numeric_limits::denorm_min(), Vector3(1, 2, std::numeric_limits::infinity())); EXPECT_TRUE(setSubnormalToZero(&rotation)); compareAngleAxis(AngleAxis(0, Vector3(1, 2, std::numeric_limits::infinity())), rotation); } TYPED_TEST(ValidTests, ClearSubnormalRotation2D) { typedef typename TestFixture::Scalar Scalar; using SurgSim::Math::setSubnormalToZero; Eigen::Rotation2D rotation(0); EXPECT_FALSE(setSubnormalToZero(&rotation)); EXPECT_EQ(0, rotation.angle()); rotation.angle() = static_cast(1); EXPECT_FALSE(setSubnormalToZero(&rotation)); EXPECT_EQ(1, rotation.angle()); rotation.angle() = std::numeric_limits::denorm_min(); EXPECT_TRUE(setSubnormalToZero(&rotation)); EXPECT_EQ(0, rotation.angle()); rotation = Eigen::Rotation2D(std::numeric_limits::infinity()); EXPECT_FALSE(setSubnormalToZero(&rotation)); EXPECT_FALSE(SurgSim::Math::isValid(rotation.angle())); } template static void transformSetSubnormalHelper() { // Assumes T is an Eigen::Transform type of some sort typedef T Transform; typedef typename Transform::Scalar Scalar; using SurgSim::Math::setSubnormalToZero; Transform transform = Transform::Identity(); EXPECT_FALSE(setSubnormalToZero(&transform)); compareMatrices(Transform::Identity().matrix(), transform.matrix()); { Transform t2 = transform; t2(0, 1) = std::numeric_limits::denorm_min(); EXPECT_TRUE(setSubnormalToZero(&t2)); compareMatrices(Transform::Identity().matrix(), transform.matrix()); } { Transform t3 = transform; t3(0, 1) = std::numeric_limits::quiet_NaN(); Transform t4 = t3; EXPECT_FALSE(setSubnormalToZero(&t4)); compareMatrices(t3.matrix(), t4.matrix()); } { Transform t5 = transform; t5(0, 1) = std::numeric_limits::quiet_NaN(); t5(1, 0) = 0; Transform t6 = t5; t6(1, 0) = std::numeric_limits::denorm_min(); EXPECT_TRUE(setSubnormalToZero(&t6)); compareMatrices(t5.matrix(), t6.matrix()); } } TYPED_TEST(ValidTests, ClearSubnormalTransform) { typedef typename TestFixture::Scalar Scalar; transformSetSubnormalHelper>(); transformSetSubnormalHelper>(); transformSetSubnormalHelper>(); transformSetSubnormalHelper>(); transformSetSubnormalHelper>(); transformSetSubnormalHelper>(); } TYPED_TEST(ValidTests, Blocks) { typedef typename TestFixture::Scalar Scalar; using SurgSim::Math::isValid; using SurgSim::Math::isSubnormal; using SurgSim::Math::setSubnormalToZero; { Eigen::Matrix matrix; matrix.setConstant(123); EXPECT_TRUE(isValid(matrix.template block<2, 2>(1, 1))); EXPECT_FALSE(isSubnormal(matrix.template block<2, 2>(1, 1))); { auto submatrix = matrix.template block<2, 2>(1, 1); EXPECT_FALSE(setSubnormalToZero(&submatrix)); } } { Eigen::Matrix matrix; matrix.setConstant(11, 13, static_cast(123)); EXPECT_TRUE(isValid(matrix.template block<6, 6>(3, 5))); EXPECT_FALSE(isSubnormal(matrix.template block<6, 6>(3, 5))); { auto submatrix = matrix.template block<6, 6>(3, 5); EXPECT_FALSE(setSubnormalToZero(&submatrix)); } } } opensurgsim-0.7.0/SurgSim/Math/UnitTests/VectorTests.cpp000066400000000000000000001414041277777236100233350ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests that exercise the functionality of our vector typedefs, which come /// straight from Eigen. #include #include #include #include "SurgSim/Math/MathConvert.h" #include "SurgSim/Math/Vector.h" // Define test fixture class templates. // We don't really need fixtures as such, but the templatization encodes type. template class VectorTestBase : public testing::Test { public: typedef T Scalar; }; template class Vector2Tests : public VectorTestBase { public: typedef T Vector2; }; // This used to contain aligned (via Eigen::AutoAlign) vector type aliases, but we got rid of those. typedef ::testing::Types Vector2Variants; TYPED_TEST_CASE(Vector2Tests, Vector2Variants); template class Vector3Tests : public VectorTestBase { public: typedef T Vector3; }; // This used to contain aligned (via Eigen::AutoAlign) vector type aliases, but we got rid of those. typedef ::testing::Types Vector3Variants; TYPED_TEST_CASE(Vector3Tests, Vector3Variants); template class Vector4Tests : public VectorTestBase { public: typedef T Vector4; }; // This used to contain aligned (via Eigen::AutoAlign) vector type aliases, but we got rid of those. typedef ::testing::Types Vector4Variants; TYPED_TEST_CASE(Vector4Tests, Vector4Variants); template class Vector6Tests : public VectorTestBase { public: typedef T Vector6; }; // This used to contain aligned (via Eigen::AutoAlign) vector type aliases, but we got rid of those. typedef ::testing::Types Vector6Variants; TYPED_TEST_CASE(Vector6Tests, Vector6Variants); template class AllVectorTests : public VectorTestBase { public: typedef T Vector; }; template class AllDynamicVectorTests : public VectorTestBase { public: typedef T Vector; }; // This used to contain aligned (via Eigen::AutoAlign) vector type aliases, but we got rid of those. typedef ::testing::Types AllVectorVariants; TYPED_TEST_CASE(AllVectorTests, AllVectorVariants); typedef ::testing::Types AllDynamicVectorVariants; TYPED_TEST_CASE(AllDynamicVectorTests, AllDynamicVectorVariants); template class UnalignedVectorTests : public VectorTestBase { public: typedef T Vector; }; template class UnalignedDynamicVectorTests : public VectorTestBase { public: typedef T Vector; }; typedef ::testing::Types UnalignedVectorVariants; TYPED_TEST_CASE(UnalignedVectorTests, UnalignedVectorVariants); typedef ::testing::Types UnalignedDynamicVectorVariants; TYPED_TEST_CASE(UnalignedDynamicVectorTests, UnalignedDynamicVectorVariants); // Now we're ready to start testing... // ==================== CONSTRUCTION & INITIALIZATION ==================== /// Test that vectors can be constructed. TYPED_TEST(Vector2Tests, CanConstruct) { typedef typename TestFixture::Vector2 Vector2; typedef typename TestFixture::Scalar T; // Warning: Eigen *does not* provide a 1-argument constructor that // initializes all elements to the same value! If you do something like // SurgSim::Math::Vector2f oneArg2f(1.23f); // the argument is converted to an integral type, interpreted as a size, // and promptly ignored because the size is fixed. Oops. // To generate a constant vector, use Vector2f::Constant(val). Vector2 default2; Vector2 twoArg2(static_cast(1.0), static_cast(2.0)); } /// Test that vectors can be constructed. TYPED_TEST(Vector3Tests, CanConstruct) { typedef typename TestFixture::Vector3 Vector3; typedef typename TestFixture::Scalar T; // Warning: Eigen *does not* provide a 1-argument constructor that // initializes all elements to the same value! If you do something like // SurgSim::Math::Vector2fu oneArg2fu(1.23f); // the argument is converted to an integral type, interpreted as a size, // and promptly ignored because the size is fixed. Oops. // To generate a constant vector, use Vector2f::Constant(val). Vector3 default3; Vector3 threeArg3(static_cast(1.0), static_cast(2.0), static_cast(3.0)); } /// Test that vectors can be constructed. TYPED_TEST(Vector4Tests, CanConstruct) { typedef typename TestFixture::Vector4 Vector4; typedef typename TestFixture::Scalar T; // Warning: Eigen *does not* provide a 1-argument constructor that // initializes all elements to the same value! If you do something like // SurgSim::Math::Vector2fu oneArg2fu(1.23f); // the argument is converted to an integral type, interpreted as a size, // and promptly ignored because the size is fixed. Oops. // To generate a constant vector, use Vector2f::Constant(val). Vector4 default4; Vector4 fourArg4(static_cast(1.0), static_cast(2.0), static_cast(3.0), static_cast(4.0)); } /// Test that the N-argument constructor properly initializes vectors. TYPED_TEST(Vector2Tests, NArgumentConstructorInitialization) { typedef typename TestFixture::Vector2 Vector2; typedef typename TestFixture::Scalar T; Vector2 vector(static_cast(1.01), static_cast(1.02)); EXPECT_NEAR(1.01, vector[0], 1e-6) << "X wasn't properly initialized."; EXPECT_NEAR(1.02, vector[1], 1e-6) << "Y wasn't properly initialized."; } /// Test that the N-argument constructor properly initializes vectors. TYPED_TEST(Vector3Tests, NArgumentConstructorInitialization) { typedef typename TestFixture::Vector3 Vector3; typedef typename TestFixture::Scalar T; Vector3 vector(static_cast(1.03), static_cast(1.04), static_cast(1.05)); EXPECT_NEAR(1.03, vector[0], 1e-6) << "X wasn't properly initialized."; EXPECT_NEAR(1.04, vector[1], 1e-6) << "Y wasn't properly initialized."; EXPECT_NEAR(1.05, vector[2], 1e-6) << "Z wasn't properly initialized."; } /// Test that the N-argument constructor properly initializes vectors. TYPED_TEST(Vector4Tests, NArgumentConstructorInitialization) { typedef typename TestFixture::Vector4 Vector4; typedef typename TestFixture::Scalar T; Vector4 vector(static_cast(1.06), static_cast(1.07), static_cast(1.08), static_cast(1.09)); EXPECT_NEAR(1.06, vector[0], 1e-6) << "X wasn't properly initialized."; EXPECT_NEAR(1.07, vector[1], 1e-6) << "Y wasn't properly initialized."; EXPECT_NEAR(1.08, vector[2], 1e-6) << "Z wasn't properly initialized."; EXPECT_NEAR(1.09, vector[3], 1e-6) << "W wasn't properly initialized."; } /// Test that the default constructor DOESN'T initialize vectors. // // Only test the non-vectorized versions. Otherwise, we'd need to // allocate memory in a way that guarantees Eigen-compatible alignment. // // TODO(bert): There is some Eigen flag that causes matrices and vectors to be // initialized after all! We should check for that here. TYPED_TEST(UnalignedVectorTests, DefaultConstructorInitialization) { typedef typename TestFixture::Vector Vector; const int SIZE = Vector::RowsAtCompileTime; EXPECT_TRUE(SIZE >= 2 && SIZE <= 6); EXPECT_EQ(1, Vector::ColsAtCompileTime); // Allocate a buffer for various vector types on stack, based on the size // of the largest object we're testing. Objects will be allocated inside // the buffer using the placement syntax for the new() operator. // Eigen's new operatore will attempt to align returned value on word sized // boundaries, so add 64 bytes to guarantee enough size. unsigned char buffer[sizeof(Vector) + 64]; { // Please don't write production (non-test) code that looks like this. =) memset(&buffer, 0xF0, sizeof(buffer)); Vector* vector = new(&buffer) Vector; for (int i = 0; i < SIZE; ++i) { EXPECT_NE(0.0f, (*vector)[i]) << i << " was NOT supposed to be zeroed."; } // Destroying the object is a good idea, even if unnecessary here: vector->Vector::~Vector(); } } /// Test setting the vector using the << syntax. TYPED_TEST(Vector2Tests, ShiftCommaInitialization) { typedef typename TestFixture::Vector2 Vector2; typedef typename Vector2::Scalar T; Vector2 vector; // Initialize elements in order. Do NOT put parentheses around the list! vector << static_cast(1.1), static_cast(1.2); EXPECT_NEAR(2.3, vector.sum(), 5e-6) << "initialization was incorrect: " << vector; } /// Test setting the vector using the << syntax. TYPED_TEST(Vector3Tests, ShiftCommaInitialization) { typedef typename TestFixture::Vector3 Vector3; typedef typename Vector3::Scalar T; Vector3 vector; // Initialize elements in order. Do NOT put parentheses around the list! vector << static_cast(1.1), static_cast(1.2), static_cast(1.3); EXPECT_NEAR(3.6, vector.sum(), 5e-6) << "initialization was incorrect: " << vector; } /// Test setting the vector using the << syntax. TYPED_TEST(Vector4Tests, ShiftCommaInitialization) { typedef typename TestFixture::Vector4 Vector4; typedef typename Vector4::Scalar T; Vector4 vector; // Initialize elements in order. Do NOT put parentheses around the list! vector << static_cast(1.1), static_cast(1.2), static_cast(1.3), static_cast(1.4); EXPECT_NEAR(5.0, vector.sum(), 5e-6) << "initialization was incorrect: " << vector; } /// Test setting the vector using the << syntax. TYPED_TEST(Vector6Tests, ShiftCommaInitialization) { typedef typename TestFixture::Vector6 Vector6; typedef typename Vector6::Scalar T; Vector6 vector; // Initialize elements in order. Do NOT put parentheses around the list! vector << static_cast(1.1), static_cast(1.2), static_cast(1.3), static_cast(1.4), static_cast(1.5), static_cast(1.6); EXPECT_NEAR(8.1, vector.sum(), 5e-6) << "initialization was incorrect: " << vector; } /// Test getting a zero value usable in expressions. TYPED_TEST(AllVectorTests, ZeroValue) { typedef typename TestFixture::Vector Vector; const int SIZE = Vector::RowsAtCompileTime; Vector vector = 1000 * Vector::Zero(); for (int i = 0; i < SIZE; ++i) { EXPECT_NEAR(0.0, vector[i], 1e-20) << i << " wasn't properly initialized."; } } /// Test setting vectors to 0. TYPED_TEST(AllVectorTests, SetToZero) { typedef typename TestFixture::Vector Vector; const int SIZE = Vector::RowsAtCompileTime; Vector vector; vector.setZero(); for (int i = 0; i < SIZE; ++i) { EXPECT_NEAR(0.0, vector[i], 1e-20) << i << " wasn't properly cleared."; } } /// Test getting a constant value usable in expressions. TYPED_TEST(AllVectorTests, ConstantValue) { typedef typename TestFixture::Vector Vector; typedef typename Vector::Scalar T; const int SIZE = Vector::RowsAtCompileTime; Vector vector = static_cast(2) * Vector::Constant(static_cast(0.5)); for (int i = 0; i < SIZE; ++i) { EXPECT_NEAR(static_cast(1.0), vector[i], 1e-6) << i << " wasn't properly initialized."; } } /// Test setting vectors to a constant. TYPED_TEST(AllVectorTests, SetToConstant) { typedef typename TestFixture::Vector Vector; typedef typename Vector::Scalar T; const int SIZE = Vector::RowsAtCompileTime; Vector vector; vector.setConstant(static_cast(7.2)); for (int i = 0; i < SIZE; ++i) { EXPECT_NEAR(static_cast(7.2), vector[i], 1e-6) << i << " wasn't properly initialized."; } } /// Test initializing from a float array. TYPED_TEST(AllVectorTests, SetFromArray) { typedef typename TestFixture::Vector Vector; typedef typename TestFixture::Scalar T; const int SIZE = Vector::RowsAtCompileTime; // This array has more elements than we will need. // The element type must match the vector! const T inputArray[6] = { static_cast(0.1), static_cast(1.2), static_cast(2.3), static_cast(3.4), static_cast(4.5), static_cast(5.6) }; Vector vector(inputArray); for (int i = 0; i < SIZE; ++i) { EXPECT_NEAR(static_cast(0.1 + i * 1.1), vector[i], 1e-6) << i << " wasn't properly initialized."; } } // Test conversion to and from yaml node TYPED_TEST(AllVectorTests, YamlConvert) { typedef typename TestFixture::Vector Vector; typedef typename TestFixture::Scalar T; T testData[6] = { static_cast(3.1), static_cast(3.4), static_cast(3.7), static_cast(4.0), static_cast(4.3), static_cast(4.6) }; Vector original(testData); YAML::Node node; ASSERT_NO_THROW(node = original); EXPECT_TRUE(node.IsSequence()); EXPECT_EQ(original.size(), node.size()); ASSERT_NO_THROW({Vector expected = node.as();}); EXPECT_TRUE(original.isApprox(node.as())); } /// Test assignment. TYPED_TEST(AllVectorTests, Assign) { typedef typename TestFixture::Vector Vector; typedef typename TestFixture::Scalar T; const int SIZE = Vector::RowsAtCompileTime; const T inputArrayA[6] = { static_cast(6.1), static_cast(6.2), static_cast(6.3), static_cast(6.4), static_cast(6.5), static_cast(6.6) }; const T inputArrayB[6] = { static_cast(7.1), static_cast(7.2), static_cast(7.3), static_cast(7.4), static_cast(7.5), static_cast(7.6) }; Vector a(inputArrayA); // sum of the first SIZE elements of inputArrayA double expectedSumA = SIZE * (SIZE * 0.05 + 6.05); EXPECT_NEAR(static_cast(expectedSumA), a.sum(), 5e-6); const Vector b(inputArrayB); // sum of the first SIZE elements of inputArrayB double expectedSumB = SIZE * (SIZE * 0.05 + 7.05); EXPECT_NEAR(static_cast(expectedSumB), b.sum(), 5e-6); a = b; EXPECT_NEAR(static_cast(expectedSumB), a.sum(), 5e-6); } // ==================== ARITHMETIC ==================== /// Negation (unary minus). TYPED_TEST(AllVectorTests, Negate) { typedef typename TestFixture::Vector Vector; typedef typename TestFixture::Scalar T; const int SIZE = Vector::RowsAtCompileTime; const T inputArray[6] = { static_cast(2.1), static_cast(2.2), static_cast(2.3), static_cast(2.4), static_cast(2.5), static_cast(2.6) }; // sum of the first SIZE elements of inputArray double expectedSum = SIZE * (SIZE * 0.05 + 2.05); Vector v(inputArray); Vector n = -v; EXPECT_NEAR(static_cast(-expectedSum), n.sum(), 5e-6); } /// Addition. TYPED_TEST(AllVectorTests, Add) { typedef typename TestFixture::Vector Vector; typedef typename TestFixture::Scalar T; const int SIZE = Vector::RowsAtCompileTime; const T inputArray[6] = { static_cast(2.1), static_cast(2.2), static_cast(2.3), static_cast(2.4), static_cast(2.5), static_cast(2.6) }; // sum of the first SIZE elements of inputArray double expectedSum = SIZE * (SIZE * 0.05 + 2.05); Vector v(inputArray); Vector w = v + Vector::Ones() + v; EXPECT_NEAR(static_cast(2 * expectedSum) + SIZE, w.sum(), 5e-6); } /// Subtraction. TYPED_TEST(AllVectorTests, Subtract) { typedef typename TestFixture::Vector Vector; typedef typename TestFixture::Scalar T; const int SIZE = Vector::RowsAtCompileTime; const T inputArray[6] = { static_cast(2.1), static_cast(2.2), static_cast(2.3), static_cast(2.4), static_cast(2.5), static_cast(2.6) }; // sum of the first SIZE elements of inputArray double expectedSum = SIZE * (SIZE * 0.05 + 2.05); Vector v(inputArray); Vector w = v - Vector::Ones(); EXPECT_NEAR(static_cast(expectedSum) - SIZE, w.sum(), 5e-6); } /// Incrementing by a value. TYPED_TEST(AllVectorTests, AddTo) { typedef typename TestFixture::Vector Vector; typedef typename TestFixture::Scalar T; const int SIZE = Vector::RowsAtCompileTime; const T inputArray[6] = { static_cast(2.1), static_cast(2.2), static_cast(2.3), static_cast(2.4), static_cast(2.5), static_cast(2.6) }; // sum of the first SIZE elements of inputArray double expectedSum = SIZE * (SIZE * 0.05 + 2.05); Vector v(inputArray); v += Vector::Ones(); EXPECT_NEAR(static_cast(expectedSum) + SIZE, v.sum(), 5e-6); } /// Decrementing by a value. TYPED_TEST(AllVectorTests, SubtractFrom) { typedef typename TestFixture::Vector Vector; typedef typename TestFixture::Scalar T; const int SIZE = Vector::RowsAtCompileTime; const T inputArray[6] = { static_cast(2.1), static_cast(2.2), static_cast(2.3), static_cast(2.4), static_cast(2.5), static_cast(2.6) }; // sum of the first SIZE elements of inputArray double expectedSum = SIZE * (SIZE * 0.05 + 2.05); Vector v(inputArray); v -= Vector::Ones(); EXPECT_NEAR(static_cast(expectedSum) - SIZE, v.sum(), 5e-6); } /// Vector-scalar multiplication. TYPED_TEST(AllVectorTests, MultiplyVectorScalar) { typedef typename TestFixture::Vector Vector; typedef typename TestFixture::Scalar T; const int SIZE = Vector::RowsAtCompileTime; const T inputArray[6] = { static_cast(2.1), static_cast(2.2), static_cast(2.3), static_cast(2.4), static_cast(2.5), static_cast(2.6) }; // sum of the first SIZE elements of inputArray double expectedSum = SIZE * (SIZE * 0.05 + 2.05); Vector v(inputArray); Vector w = v * static_cast(1.23); EXPECT_NEAR(static_cast(1.23 * expectedSum), w.sum(), 5e-6); } /// Scalar-vector multiplication. TYPED_TEST(AllVectorTests, MultiplyScalarVector) { typedef typename TestFixture::Vector Vector; typedef typename TestFixture::Scalar T; const int SIZE = Vector::RowsAtCompileTime; const T inputArray[6] = { static_cast(2.1), static_cast(2.2), static_cast(2.3), static_cast(2.4), static_cast(2.5), static_cast(2.6) }; // sum of the first SIZE elements of inputArray double expectedSum = SIZE * (SIZE * 0.05 + 2.05); Vector v(inputArray); Vector w = static_cast(1.23) * v; EXPECT_NEAR(static_cast(1.23 * expectedSum), w.sum(), 5e-6); } /// Division by scalar. TYPED_TEST(AllVectorTests, DivideScalar) { typedef typename TestFixture::Vector Vector; typedef typename TestFixture::Scalar T; const int SIZE = Vector::RowsAtCompileTime; const T inputArray[6] = { static_cast(2.1), static_cast(2.2), static_cast(2.3), static_cast(2.4), static_cast(2.5), static_cast(2.6) }; // sum of the first SIZE elements of inputArray double expectedSum = SIZE * (SIZE * 0.05 + 2.05); Vector v(inputArray); Vector w = v / static_cast(1.23); EXPECT_NEAR(static_cast(expectedSum / 1.23), w.sum(), 5e-6); } /// Component-wise multiplication. TYPED_TEST(AllVectorTests, ComponentwiseMultiply) { typedef typename TestFixture::Vector Vector; typedef typename TestFixture::Scalar T; const int SIZE = Vector::RowsAtCompileTime; const T inputArray[6] = { static_cast(3.1), static_cast(3.4), static_cast(3.7), static_cast(4.0), static_cast(4.3), static_cast(4.6) }; // sum of the squares of the first SIZE elements of inputArray double expectedSumSquares = SIZE * (SIZE * (SIZE * 0.03 + 0.885) + 8.695); Vector v(inputArray); // use the component-wise Eigen matrix operation: Vector w = v.cwiseProduct(v); EXPECT_NEAR(static_cast(expectedSumSquares), w.sum(), 5e-6); // OR, the same thing done via conversion to arrays: w = v.array() * v.array(); EXPECT_NEAR(static_cast(expectedSumSquares), w.sum(), 5e-6); } /// Component-wise division. TYPED_TEST(AllVectorTests, ComponentwiseDivide) { typedef typename TestFixture::Vector Vector; typedef typename TestFixture::Scalar T; const int SIZE = Vector::RowsAtCompileTime; const T inputArray[6] = { static_cast(3.1), static_cast(3.4), static_cast(3.7), static_cast(4.0), static_cast(4.3), static_cast(4.6) }; Vector v(inputArray); Vector u = static_cast(2) * v; // use the component-wise Eigen matrix operation: Vector w = u.cwiseQuotient(v); EXPECT_NEAR(static_cast(2 * SIZE), w.sum(), 5e-6); // OR, the same thing done via conversion to arrays: w = u.array() / v.array(); EXPECT_NEAR(static_cast(2 * SIZE), w.sum(), 5e-6); } /// Dot product. TYPED_TEST(AllVectorTests, DotProduct) { typedef typename TestFixture::Vector Vector; typedef typename TestFixture::Scalar T; const int SIZE = Vector::RowsAtCompileTime; const T inputArray[6] = { static_cast(3.1), static_cast(3.4), static_cast(3.7), static_cast(4.0), static_cast(4.3), static_cast(4.6) }; // sum of the squares of the first SIZE elements of inputArray double expectedSumSquares = SIZE * (SIZE * (SIZE * 0.03 + 0.885) + 8.695); Vector v(inputArray); EXPECT_NEAR(static_cast(expectedSumSquares), v.dot(v), 5e-6); } /// Cross product. TYPED_TEST(Vector3Tests, CrossProduct) { typedef typename TestFixture::Vector3 Vector3; typedef typename Vector3::Scalar T; Vector3 v; v << static_cast(3.4), static_cast(5.6), static_cast(7.8); Vector3 u = -v; u[0] = v[0]; Vector3 w = v.cross(u); std::cout << w << std::endl; EXPECT_NEAR(0, w[0], 1e-6); EXPECT_GT(abs(w[1]), 1); // nonzero EXPECT_GT(abs(w[2]), 1); // nonzero } /// Outer product. TYPED_TEST(AllVectorTests, OuterProduct) { typedef typename TestFixture::Vector Vector; typedef typename TestFixture::Scalar T; const int SIZE = Vector::RowsAtCompileTime; typedef Eigen::Matrix Matrix; const T inputArray[6] = { static_cast(3.1), static_cast(3.4), static_cast(3.7), static_cast(4.0), static_cast(4.3), static_cast(4.6) }; // sum of the squares of the first SIZE elements of inputArray double expectedSumSquares = SIZE * (SIZE * (SIZE * 0.03 + 0.885) + 8.695); Vector v(inputArray); // You have to write out the outer product, like this: Matrix m = v * v.transpose(); // TODO(bert): maybe needs better testing here? Vector u = v / v.squaredNorm(); EXPECT_NEAR(static_cast(expectedSumSquares), (m * u).squaredNorm(), 1e-3); } /// Euclidean norm and its square. TYPED_TEST(AllVectorTests, NormAndSquared) { typedef typename TestFixture::Vector Vector; typedef typename TestFixture::Scalar T; const int SIZE = Vector::RowsAtCompileTime; const T inputArray[6] = { static_cast(3.1), static_cast(3.4), static_cast(3.7), static_cast(4.0), static_cast(4.3), static_cast(4.6) }; // sum of the squares of the first SIZE elements of inputArray double expectedSumSquares = SIZE * (SIZE * (SIZE * 0.03 + 0.885) + 8.695); Vector v(inputArray); EXPECT_NEAR(static_cast(expectedSumSquares), v.squaredNorm(), 5e-6); EXPECT_NEAR(sqrt(static_cast(expectedSumSquares)), v.norm(), 5e-6); } /// L1 (Manhattan) norm and L_Infinity (largest absolute value) norm. TYPED_TEST(AllVectorTests, L1NormAndLInfNorm) { typedef typename TestFixture::Vector Vector; typedef typename TestFixture::Scalar T; const int SIZE = Vector::RowsAtCompileTime; const T inputArray[6] = { static_cast(2.1), static_cast(2.2), static_cast(2.3), static_cast(2.4), static_cast(2.5), static_cast(2.6) }; // sum of the first SIZE elements of inputArray double expectedSum = SIZE * (SIZE * 0.05 + 2.05); Vector v(inputArray); Vector w = -v; // Ugh, "template" is required to get this to parse properly. This is // triggered because the test is a part of a template class; you don't // need to do this in a non-template context. EXPECT_NEAR(static_cast(expectedSum), v.template lpNorm<1>(), 5e-6); EXPECT_NEAR(static_cast(expectedSum), w.template lpNorm<1>(), 5e-6); EXPECT_NEAR(inputArray[SIZE - 1], v.template lpNorm(), 1e-6); EXPECT_NEAR(inputArray[SIZE - 1], w.template lpNorm(), 1e-6); } /// Normalization of vectors. TYPED_TEST(AllVectorTests, Normalize) { typedef typename TestFixture::Vector Vector; typedef typename TestFixture::Scalar T; const int SIZE = Vector::RowsAtCompileTime; const T inputArray[6] = { static_cast(3.1), static_cast(3.4), static_cast(3.7), static_cast(4.0), static_cast(4.3), static_cast(4.6) }; // sum of the squares of the first SIZE elements of inputArray double expectedSumSquares = SIZE * (SIZE * (SIZE * 0.03 + 0.885) + 8.695); Vector v(inputArray); EXPECT_NEAR(sqrt(expectedSumSquares), v.norm(), 5e-6); // normalized() RETURNS the normalized vector, leaving original unchanged. Vector u = v.normalized(); EXPECT_NEAR(static_cast(1), u.norm(), 5e-6); EXPECT_NEAR(sqrt(static_cast(expectedSumSquares)), v.norm(), 5e-6); // normalize() NORMALIZES the vector, modifying it. v.normalize(); EXPECT_NEAR(static_cast(1), v.norm(), 5e-6); EXPECT_NEAR(static_cast(0), (u - v).norm(), 5e-6); } /// Minimum and maximum elements. TYPED_TEST(AllVectorTests, MinAndMax) { typedef typename TestFixture::Vector Vector; typedef typename TestFixture::Scalar T; const int SIZE = Vector::RowsAtCompileTime; const T inputArray[6] = { static_cast(3.1), static_cast(3.4), static_cast(3.7), static_cast(4.0), static_cast(4.3), static_cast(4.6) }; Vector v(inputArray); EXPECT_NEAR(inputArray[0], v.minCoeff(), 1e-6); EXPECT_NEAR(inputArray[SIZE - 1], v.maxCoeff(), 1e-6); } // ==================== SUBVECTORS (EXTENDING/SHRINKING) ==================== /// Extending vectors using the head() syntax. TYPED_TEST(Vector2Tests, Extend2to3) { typedef typename TestFixture::Vector2 Vector2; typedef typename TestFixture::Scalar T; typedef Eigen::Matrix Vector3; Vector2 vector2; vector2 << static_cast(1.1), static_cast(1.2); Vector3 vector3; // Ugh, this is efficient but "template" is required to get it to parse // properly. This is triggered because the test is a part of a template // class; you don't need to do this in a non-template context. vector3.template head<2>() = vector2; vector3[2] = static_cast(0); EXPECT_NEAR(2.3, vector3.sum(), 5e-6) << "extending was incorrect: " << vector3; } /// Extending vectors using the head(r) syntax. TYPED_TEST(Vector2Tests, DynamicExtend2to3) { typedef typename TestFixture::Vector2 Vector2; typedef typename TestFixture::Scalar T; typedef Eigen::Matrix Vector3; Vector2 vector2; vector2 << static_cast(1.1), static_cast(1.2); Vector3 vector3; vector3.head(2) = vector2; vector3[2] = static_cast(0); EXPECT_NEAR(2.3, vector3.sum(), 5e-6) << "extending was incorrect: " << vector3; } /// Extending vectors using the block() syntax. TYPED_TEST(Vector2Tests, BlockExtend2to3) { typedef typename TestFixture::Vector2 Vector2; typedef typename TestFixture::Scalar T; typedef Eigen::Matrix Vector3; Vector2 vector2; vector2 << static_cast(1.1), static_cast(1.2); Vector3 vector3; // Ugh, this is efficient but "template" is required to get it to parse // properly. This is triggered because the test is a part of a template // class; you don't need to do this in a non-template context. vector3.template block<2, 1>(0, 0) = vector2; vector3(2, 0) = static_cast(0); EXPECT_NEAR(2.3, vector3.sum(), 5e-6) << "extending was incorrect: " << vector3; } /// Extending vectors using the block(i,j,r,c) syntax. TYPED_TEST(Vector2Tests, DynamicBlockExtend2to3) { typedef typename TestFixture::Vector2 Vector2; typedef typename TestFixture::Scalar T; typedef Eigen::Matrix Vector3; Vector2 vector2; vector2 << static_cast(1.1), static_cast(1.2); Vector3 vector3; vector3.block(0, 0, 2, 1) = vector2; vector3(2, 0) = static_cast(0); EXPECT_NEAR(2.3, vector3.sum(), 5e-6) << "extending was incorrect: " << vector3; } /// Shrinking vectors using the head() syntax. TYPED_TEST(Vector2Tests, Shrink3to2) { typedef typename TestFixture::Vector2 Vector2; typedef typename TestFixture::Scalar T; typedef Eigen::Matrix Vector3; Vector3 vector3; vector3 << static_cast(1.1), static_cast(1.2), static_cast(1.3); Vector2 vector2; // Ugh, this is efficient but "template" is required to get it to parse // properly. This is triggered because the test is a part of a template // class; you don't need to do this in a non-template context. vector2 = vector3.template head<2>(); EXPECT_NEAR(2.3, vector2.sum(), 5e-6) << "shrinking was incorrect: " << vector2; } /// Extending vectors using the head() syntax. TYPED_TEST(Vector3Tests, Extend2to3) { typedef typename TestFixture::Vector3 Vector3; typedef typename TestFixture::Scalar T; typedef Eigen::Matrix Vector2; Vector2 vector2; vector2 << static_cast(1.1), static_cast(1.2); Vector3 vector3; // Ugh, this is efficient but "template" is required to get it to parse // properly. This is triggered because the test is a part of a template // class; you don't need to do this in a non-template context. vector3.template head<2>() = vector2; vector3[2] = static_cast(0); EXPECT_NEAR(2.3, vector3.sum(), 5e-6) << "extending was incorrect: " << vector3; } /// Shrinking vectors using the head() syntax. TYPED_TEST(Vector3Tests, Shrink3to2) { typedef typename TestFixture::Vector3 Vector3; typedef typename TestFixture::Scalar T; typedef Eigen::Matrix Vector2; Vector3 vector3; vector3 << static_cast(1.1), static_cast(1.2), static_cast(1.3); Vector2 vector2; // Ugh, this is efficient but "template" is required to get it to parse // properly. This is triggered because the test is a part of a template // class; you don't need to do this in a non-template context. vector2 = vector3.template head<2>(); EXPECT_NEAR(2.3, vector2.sum(), 5e-6) << "shrinking was incorrect" << vector2; } /// Extending vectors using the head() syntax. TYPED_TEST(Vector3Tests, Extend3to4) { typedef typename TestFixture::Vector3 Vector3; typedef typename TestFixture::Scalar T; typedef Eigen::Matrix Vector4; Vector3 vector3; vector3 << static_cast(1.1), static_cast(1.2), static_cast(1.3); Vector4 vector4; // Ugh, this is efficient but "template" is required to get it to parse // properly. This is triggered because the test is a part of a template // class; you don't need to do this in a non-template context. vector4.template head<3>() = vector3; vector4[3] = static_cast(0); EXPECT_NEAR(3.6, vector4.sum(), 5e-6) << "extending was incorrect" << vector4; } /// Shrinking vectors using the head() syntax. TYPED_TEST(Vector3Tests, Shrink4to3) { typedef typename TestFixture::Vector3 Vector3; typedef typename TestFixture::Scalar T; typedef Eigen::Matrix Vector4; Vector4 vector4; vector4 << static_cast(1.1), static_cast(1.2), static_cast(1.3), static_cast(1.4); Vector3 vector3; // Ugh, this is efficient but "template" is required to get it to parse // properly. This is triggered because the test is a part of a template // class; you don't need to do this in a non-template context. vector3 = vector4.template head<3>(); EXPECT_NEAR(3.6, vector3.sum(), 5e-6) << "shrinking was incorrect" << vector3; } /// Extending vectors using the head() syntax. TYPED_TEST(Vector4Tests, Extend3to4) { typedef typename TestFixture::Vector4 Vector4; typedef typename TestFixture::Scalar T; typedef Eigen::Matrix Vector3; Vector3 vector3; vector3 << static_cast(1.1), static_cast(1.2), static_cast(1.3); Vector4 vector4; // Ugh, this is efficient but "template" is required to get it to parse // properly. This is triggered because the test is a part of a template // class; you don't need to do this in a non-template context. vector4.template head<3>() = vector3; vector4[3] = static_cast(0); EXPECT_NEAR(3.6, vector4.sum(), 5e-6) << "extending was incorrect" << vector4; } /// Shrinking vectors using the head() syntax. TYPED_TEST(Vector4Tests, Shrink4to3) { typedef typename TestFixture::Vector4 Vector4; typedef typename TestFixture::Scalar T; typedef Eigen::Matrix Vector3; Vector4 vector4; vector4 << static_cast(1.1), static_cast(1.2), static_cast(1.3), static_cast(1.4); Vector3 vector3; // Ugh, this is efficient but "template" is required to get it to parse // properly. This is triggered because the test is a part of a template // class; you don't need to do this in a non-template context. vector3 = vector4.template head<3>(); EXPECT_NEAR(3.6, vector3.sum(), 5e-6) << "shrinking was incorrect" << vector3; } /// Extend Euclidean N-vector [a_i] to homogeneous (N+1)-vector [a_i 1]. TYPED_TEST(AllVectorTests, HomogeneousExtend) { typedef typename TestFixture::Vector Vector; typedef typename TestFixture::Scalar T; const int SIZE = Vector::RowsAtCompileTime; typedef Eigen::Matrix < T, SIZE + 1, 1 > HVector; const T inputArray[6] = { static_cast(10.1), static_cast(10.2), static_cast(10.3), static_cast(10.4), static_cast(10.5), static_cast(10.6) }; Vector v(inputArray); HVector h = v.homogeneous(); for (int i = 0; i < SIZE; ++i) { EXPECT_NEAR(inputArray[i], h[i], 1e-6) << "homogeneous form garbled."; } EXPECT_NEAR(1.0, h[SIZE], 1e-6) << "homogeneous form garbled."; } /// Shrink a homogeneous (N+1)-vector [a_i 1] to Euclidean N-vector [a_i]. /// /// Note that if the last element is not 1, the result will be divided by it, /// which is helpful in projective geometry but may not be what you wanted! TYPED_TEST(AllVectorTests, HomogeneousShrink) { typedef typename TestFixture::Vector HVector; typedef typename TestFixture::Scalar T; const int SIZE = HVector::RowsAtCompileTime - 1; typedef Eigen::Matrix Vector; const T inputArray[6] = { static_cast(10.1), static_cast(10.2), static_cast(10.3), static_cast(10.4), static_cast(10.5), static_cast(10.6) }; HVector h(inputArray); h[SIZE] = 2; // makes calculating expected values simpler =) Vector v = h.hnormalized(); for (int i = 0; i < SIZE; ++i) { EXPECT_NEAR(inputArray[i] / 2, v[i], 1e-6) << "Euclidean form from homogeneous garbled."; } } // ==================== TYPE CONVERSION ==================== /// Typecasting vectors (double <-> float conversions). TYPED_TEST(AllVectorTests, TypeCasting) { typedef typename TestFixture::Vector Vector; typedef typename TestFixture::Scalar T; const int SIZE = Vector::RowsAtCompileTime; typedef Eigen::Matrix Vectord; typedef Eigen::Matrix Vectorf; const T inputArray[6] = { static_cast(12.1), static_cast(12.2), static_cast(12.3), static_cast(12.4), static_cast(12.5), static_cast(12.6) }; // sum of the first SIZE elements of inputArray T expectedSum = SIZE * (SIZE * static_cast(0.05) + static_cast(12.05)); Vector v(inputArray); // Ugh, "template" is required to get this to parse properly. This is // triggered because the test is a part of a template class; you don't // need to do this in a non-template context. Vectord vd = v.template cast(); EXPECT_NEAR(static_cast(expectedSum), vd.sum(), 1e-5); Vectorf vf = v.template cast(); EXPECT_NEAR(static_cast(expectedSum), vf.sum(), 1e-5); } // ==================== MISCELLANEOUS ==================== /// Reading from and writing to arrays or blocks of double/float in memory. TYPED_TEST(AllVectorTests, ArrayReadWrite) { typedef typename TestFixture::Vector Vector; typedef typename TestFixture::Scalar T; const int SIZE = Vector::RowsAtCompileTime; const T inputArray[6] = { static_cast(12.1), static_cast(12.2), static_cast(12.3), static_cast(12.4), static_cast(12.5), static_cast(12.6) }; T outputArray[6]; Eigen::Map v_in(inputArray); Vector v1 = v_in; Eigen::Map v_out(outputArray); v_out = v1; for (int i = 0; i < SIZE; ++i) { EXPECT_NEAR(inputArray[i], outputArray[i], 1e-6); } } TYPED_TEST(AllVectorTests, Interpolate) { typedef typename TestFixture::Vector Vector; typedef typename TestFixture::Scalar T; T epsilon = static_cast(1e-6); T prevArray[6] = { static_cast(3.1), static_cast(3.4), static_cast(3.7), static_cast(4.0), static_cast(4.3), static_cast(4.6) }; T nextArray[6] = { static_cast(7.2), static_cast(0.6), static_cast(4.8), static_cast(5.1), static_cast(8.9), static_cast(1.5) }; T interpArray[6]; Vector prev(prevArray); Vector next(nextArray); Vector interp; // 0.0 interpArray[0] = static_cast(3.1) * static_cast(1.0) + static_cast(7.2) * static_cast(0.0); interpArray[1] = static_cast(3.4) * static_cast(1.0) + static_cast(0.6) * static_cast(0.0); interpArray[2] = static_cast(3.7) * static_cast(1.0) + static_cast(4.8) * static_cast(0.0); interpArray[3] = static_cast(4.0) * static_cast(1.0) + static_cast(5.1) * static_cast(0.0); interpArray[4] = static_cast(4.3) * static_cast(1.0) + static_cast(8.9) * static_cast(0.0); interpArray[5] = static_cast(4.6) * static_cast(1.0) + static_cast(1.5) * static_cast(0.0); interp = Vector(interpArray); EXPECT_TRUE(interp.isApprox(prev)); EXPECT_TRUE(interp.isApprox(SurgSim::Math::interpolate(prev, next, static_cast(0.0)), epsilon)); // 1.0 interpArray[0] = static_cast(3.1) * static_cast(0.0) + static_cast(7.2) * static_cast(1.0); interpArray[1] = static_cast(3.4) * static_cast(0.0) + static_cast(0.6) * static_cast(1.0); interpArray[2] = static_cast(3.7) * static_cast(0.0) + static_cast(4.8) * static_cast(1.0); interpArray[3] = static_cast(4.0) * static_cast(0.0) + static_cast(5.1) * static_cast(1.0); interpArray[4] = static_cast(4.3) * static_cast(0.0) + static_cast(8.9) * static_cast(1.0); interpArray[5] = static_cast(4.6) * static_cast(0.0) + static_cast(1.5) * static_cast(1.0); interp = Vector(interpArray); EXPECT_TRUE(interp.isApprox(next)); EXPECT_TRUE(interp.isApprox(SurgSim::Math::interpolate(prev, next, static_cast(1.0)), epsilon)); // 0.5 interpArray[0] = static_cast(3.1) * static_cast(0.5) + static_cast(7.2) * static_cast(0.5); interpArray[1] = static_cast(3.4) * static_cast(0.5) + static_cast(0.6) * static_cast(0.5); interpArray[2] = static_cast(3.7) * static_cast(0.5) + static_cast(4.8) * static_cast(0.5); interpArray[3] = static_cast(4.0) * static_cast(0.5) + static_cast(5.1) * static_cast(0.5); interpArray[4] = static_cast(4.3) * static_cast(0.5) + static_cast(8.9) * static_cast(0.5); interpArray[5] = static_cast(4.6) * static_cast(0.5) + static_cast(1.5) * static_cast(0.5); interp = Vector(interpArray); EXPECT_TRUE(interp.isApprox(SurgSim::Math::interpolate(prev, next, static_cast(0.5)), epsilon)); // 0.886 interpArray[0] = static_cast(3.1) * static_cast(0.114) + static_cast(7.2) * static_cast(0.886); interpArray[1] = static_cast(3.4) * static_cast(0.114) + static_cast(0.6) * static_cast(0.886); interpArray[2] = static_cast(3.7) * static_cast(0.114) + static_cast(4.8) * static_cast(0.886); interpArray[3] = static_cast(4.0) * static_cast(0.114) + static_cast(5.1) * static_cast(0.886); interpArray[4] = static_cast(4.3) * static_cast(0.114) + static_cast(8.9) * static_cast(0.886); interpArray[5] = static_cast(4.6) * static_cast(0.114) + static_cast(1.5) * static_cast(0.886); interp = Vector(interpArray); EXPECT_TRUE(interp.isApprox(SurgSim::Math::interpolate(prev, next, static_cast(0.886)), epsilon)); // 0.623 interpArray[0] = static_cast(3.1) * static_cast(0.377) + static_cast(7.2) * static_cast(0.623); interpArray[1] = static_cast(3.4) * static_cast(0.377) + static_cast(0.6) * static_cast(0.623); interpArray[2] = static_cast(3.7) * static_cast(0.377) + static_cast(4.8) * static_cast(0.623); interpArray[3] = static_cast(4.0) * static_cast(0.377) + static_cast(5.1) * static_cast(0.623); interpArray[4] = static_cast(4.3) * static_cast(0.377) + static_cast(8.9) * static_cast(0.623); interpArray[5] = static_cast(4.6) * static_cast(0.377) + static_cast(1.5) * static_cast(0.623); interp = Vector(interpArray); EXPECT_TRUE(interp.isApprox(SurgSim::Math::interpolate(prev, next, static_cast(0.623)), epsilon)); } // TO DO: // testing numerical validity // testing for denormalized numbers // testing degeneracy (norm near 0) // compute an orthonormal frame based on a given normal (z-axis) TYPED_TEST(AllDynamicVectorTests, CanResize) { typedef typename TestFixture::Vector Vector; ASSERT_NO_THROW({Vector a; a.resize(10);}); } namespace { template void testScalar(T valueExpected, T value) {} template <> void testScalar(double valueExpected, double value) { EXPECT_DOUBLE_EQ(valueExpected, value); } template <> void testScalar(float valueExpected, float value) { EXPECT_FLOAT_EQ(valueExpected, value); } }; TYPED_TEST(AllDynamicVectorTests, addSubVector) { typedef typename TestFixture::Vector Vector; Vector v, vInit, v2, v2Init; v.resize(18); v.setRandom(); vInit = v; v2.resize(18); v2.setRandom(); v2Init = v2; ASSERT_NO_THROW(SurgSim::Math::addSubVector(v2.segment(3, 3), 2, 3, &v);); EXPECT_TRUE(v2.isApprox(v2Init)); EXPECT_FALSE(v.isApprox(vInit)); for (int dofId = 0; dofId < 6; dofId++) { testScalar(vInit[dofId], v[dofId]); } for (int dofId = 6; dofId < 9; dofId++) { testScalar(vInit[dofId] + v2Init[3 + dofId - 6], v[dofId]); } for (int dofId = 9; dofId < 18; dofId++) { testScalar(vInit[dofId], v[dofId]); } } TYPED_TEST(AllDynamicVectorTests, addSubVectorBlocks) { typedef typename TestFixture::Vector Vector; Vector v, vInit, v2, v2Init; std::vector nodeIds; v.resize(18); v.setRandom(); vInit = v; v2.resize(18); v2.setRandom(); v2Init = v2; nodeIds.push_back(1); nodeIds.push_back(3); nodeIds.push_back(5); ASSERT_NO_THROW(SurgSim::Math::addSubVector(v2.segment(3, 15), nodeIds, 3, &v);); EXPECT_TRUE(v2.isApprox(v2Init)); EXPECT_FALSE(v.isApprox(vInit)); for (int dofId = 0; dofId < 3; dofId++) { testScalar(vInit[dofId], v[dofId]); } for (int dofId = 3; dofId < 6; dofId++) { testScalar(vInit[dofId] + v2Init[3 + (dofId - 3)], v[dofId]); } for (int dofId = 6; dofId < 9; dofId++) { testScalar(vInit[dofId], v[dofId]); } for (int dofId = 9; dofId < 12; dofId++) { testScalar(vInit[dofId] + v2Init[3 + (dofId - 6)], v[dofId]); } for (int dofId = 12; dofId < 15; dofId++) { testScalar(vInit[dofId], v[dofId]); } for (int dofId = 15; dofId < 18; dofId++) { testScalar(vInit[dofId] + v2Init[3 + (dofId - 9)], v[dofId]); } } TYPED_TEST(AllDynamicVectorTests, setSubVector) { typedef typename TestFixture::Vector Vector; Vector v, vInit, v2, v2Init; v.resize(18); v.setRandom(); vInit = v; v2.resize(18); v2.setRandom(); v2Init = v2; ASSERT_NO_THROW(SurgSim::Math::setSubVector(v2.segment(3, 3), 2, 3, &v);); EXPECT_TRUE(v2.isApprox(v2Init)); EXPECT_FALSE(v.isApprox(vInit)); for (int dofId = 0; dofId < 6; dofId++) { testScalar(vInit[dofId], v[dofId]); } for (int dofId = 6; dofId < 9; dofId++) { testScalar(v2Init[3 + dofId - 6], v[dofId]); } for (int dofId = 9; dofId < 18; dofId++) { testScalar(vInit[dofId], v[dofId]); } } TYPED_TEST(AllDynamicVectorTests, getSubVector) { typedef typename TestFixture::Vector Vector; Vector v, vInit; v.resize(18); v.setRandom(); vInit = v; Eigen::VectorBlock subVector = SurgSim::Math::getSubVector(v, 2, 3); EXPECT_TRUE(v.isApprox(vInit)); for (int dofId = 0; dofId < 3; dofId++) { testScalar(v[2 * 3 + dofId], subVector[dofId]); // Also test that the returned value are pointing to the correct data EXPECT_EQ(&subVector[dofId], &v[2 * 3 + dofId]); } } TYPED_TEST(AllDynamicVectorTests, getSubVectorBlocks) { typedef typename TestFixture::Vector Vector; Vector v, vInit, v2; std::vector nodeIds; v.resize(18); v.setRandom(); vInit = v; v2.resize(9); v2.setZero(); nodeIds.push_back(1); nodeIds.push_back(3); nodeIds.push_back(5); EXPECT_EQ(18, v.size()); EXPECT_TRUE(v.isApprox(vInit)); EXPECT_EQ(9, v2.size()); EXPECT_TRUE(v2.isZero()); ASSERT_NO_THROW(SurgSim::Math::getSubVector(v, nodeIds, 3, &v2);); EXPECT_EQ(18, v.size()); EXPECT_TRUE(v.isApprox(vInit)); EXPECT_EQ(9, v2.size()); EXPECT_FALSE(v2.isZero()); for (int dofId = 0; dofId < 3; dofId++) { testScalar(v[3 + dofId], v2[dofId]); } for (int dofId = 3; dofId < 6; dofId++) { testScalar(v[9 + (dofId - 3)], v2[dofId]); } for (int dofId = 6; dofId < 9; dofId++) { testScalar(v[15 + (dofId - 6)], v2[dofId]); } } template void testOrthonormalBasis(const Vector& i, const Vector& j, const Vector& k) { typedef typename Vector::Scalar T; T precision = Eigen::NumTraits::dummy_precision(); EXPECT_NEAR(i.dot(j), 0.0, precision); EXPECT_NEAR(i.dot(k), 0.0, precision); EXPECT_NEAR(j.dot(i), 0.0, precision); EXPECT_NEAR(j.dot(k), 0.0, precision); EXPECT_NEAR(k.dot(i), 0.0, precision); EXPECT_NEAR(k.dot(j), 0.0, precision); EXPECT_TRUE(i.cross(j).isApprox(k)); EXPECT_TRUE(j.cross(k).isApprox(i)); EXPECT_TRUE(k.cross(i).isApprox(j)); EXPECT_NEAR(i.norm(), 1.0, precision); EXPECT_NEAR(j.norm(), 1.0, precision); EXPECT_NEAR(k.norm(), 1.0, precision); } TYPED_TEST(Vector3Tests, buildOrthonormalBasis) { typedef typename TestFixture::Vector3 Vector3; typedef typename Vector3::Scalar T; const int VOpt = Vector3::Options; Vector3 i(static_cast(1.54), static_cast(-4.25), static_cast(0.983)); Vector3 j, k; T precision = Eigen::NumTraits::dummy_precision(); // Assert if 1 parameter is nullptr ASSERT_ANY_THROW((SurgSim::Math::buildOrthonormalBasis(nullptr, &j, &k))); ASSERT_ANY_THROW((SurgSim::Math::buildOrthonormalBasis(&i, nullptr, &k))); ASSERT_ANY_THROW((SurgSim::Math::buildOrthonormalBasis(&i, &j, nullptr))); // Assert if 2 parameters are nullptr ASSERT_ANY_THROW((SurgSim::Math::buildOrthonormalBasis(nullptr, nullptr, &k))); ASSERT_ANY_THROW((SurgSim::Math::buildOrthonormalBasis(nullptr, &j, nullptr))); ASSERT_ANY_THROW((SurgSim::Math::buildOrthonormalBasis(&i, nullptr, nullptr))); // Assert if 3 parameters are nullptr ASSERT_ANY_THROW((SurgSim::Math::buildOrthonormalBasis(nullptr, nullptr, nullptr))); // Input parameter 'i' = (0, 0, 0) Vector3 zero = Vector3::Zero(); ASSERT_NO_THROW(EXPECT_EQ(false, SurgSim::Math::buildOrthonormalBasis(&zero, &j, &k))); // Input parameter 'i' = (0, 0, 0) + (epsilon, epsilon, epsilon) Vector3 closeToZero = Vector3::Constant(precision); ASSERT_NO_THROW(EXPECT_EQ(false, SurgSim::Math::buildOrthonormalBasis(&closeToZero, &j, &k))); // Input parameter 'i' is already normalized { Vector3 i(static_cast(1.54), static_cast(-4.25), static_cast(0.983)); Vector3 j, k; i.normalize(); ASSERT_NO_THROW(EXPECT_EQ(true, SurgSim::Math::buildOrthonormalBasis(&i, &j, &k))); testOrthonormalBasis(i, j, k); } // Input parameter 'i' is not already normalized { Vector3 i(static_cast(1.54), static_cast(-4.25), static_cast(0.983)); Vector3 j, k; ASSERT_NO_THROW(EXPECT_EQ(true, SurgSim::Math::buildOrthonormalBasis(&i, &j, &k))); testOrthonormalBasis(i, j, k); } } TYPED_TEST(Vector3Tests, robustCrossProduct) { typedef typename TestFixture::Vector3 Vector3; typedef typename Vector3::Scalar T; T epsilon = static_cast(1.0e02 * Eigen::NumTraits::dummy_precision()); Vector3 p0(static_cast(0.0), static_cast(0.0), static_cast(0.2)); Vector3 p1(static_cast(0.0), static_cast(0.1), static_cast(0.2)); std::array p; p[0] = p0; p[1] = p1; { SCOPED_TRACE("Safe cross product, p1q0 works."); Vector3 q0(static_cast(0.1), static_cast(0.0), static_cast(0.2)); Vector3 q1(static_cast(0.0), static_cast(0.2), static_cast(0.2)); std::array q; q[0] = q0; q[1] = q1; EXPECT_TRUE(SurgSim::Math::robustCrossProduct(p, q, epsilon).isApprox(Vector3(static_cast(0.0), static_cast(0.0), static_cast(-1.0)), epsilon)); } { SCOPED_TRACE("Safe cross product, p1q0 doesn't work, but p1q1 works."); Vector3 q0(static_cast(0.0), static_cast(0.2), static_cast(0.2)); Vector3 q1(static_cast(0.1), static_cast(0.0), static_cast(0.2)); std::array q; q[0] = q0; q[1] = q1; EXPECT_TRUE(SurgSim::Math::robustCrossProduct(p, q, epsilon).isApprox(Vector3(static_cast(0.0), static_cast(0.0), static_cast(-1.0)), epsilon)); } } opensurgsim-0.7.0/SurgSim/Math/UnitTests/config.txt.in000066400000000000000000000001701277777236100227510ustar00rootroot00000000000000${CMAKE_CURRENT_BINARY_DIR}/MlcpTestData/ ${CMAKE_CURRENT_BINARY_DIR}/Data/ ${PROJECT_BINARY_DIR}/SurgSim/Testing/Data/ opensurgsim-0.7.0/SurgSim/Math/Valid-inl.h000066400000000000000000000152441277777236100203740ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Implementation of isValid(), isSubnormal() and setSubnormalToZero(). #ifndef SURGSIM_MATH_VALID_INL_H #define SURGSIM_MATH_VALID_INL_H #include namespace SurgSim { namespace Math { namespace internal { template class PredicateAlwaysTrueVisitor { public: typedef typename T::Index Index; typedef typename T::Scalar Scalar; PredicateAlwaysTrueVisitor() : m_result(true) { } inline bool getResult() const { return m_result; } inline void init(const Scalar& value, Index i, Index j) { if (! V::evaluate(value)) { m_result = false; } } inline void operator()(const Scalar& value, Index i, Index j) { if (! V::evaluate(value)) { m_result = false; } } private: bool m_result; }; template class ValidVisitor : public PredicateAlwaysTrueVisitor> { public: typedef typename PredicateAlwaysTrueVisitor>::Scalar Scalar; static bool evaluate(const Scalar& value) { // The extra parentheses protect from pain if isfinite() is also defined as a macro. return (boost::math::isfinite)(value); } }; template class NonSubnormalVisitor : public PredicateAlwaysTrueVisitor> { public: typedef typename PredicateAlwaysTrueVisitor>::Scalar Scalar; static bool evaluate(const Scalar& value) { // The extra parentheses protect from pain if fpclassify() is also defined as a macro. return ((boost::math::fpclassify)(value) != FP_SUBNORMAL); } }; }; // namespace internal inline bool isValid(float value) { // The extra parentheses protect from pain if isfinite() is also defined as a macro. return (boost::math::isfinite)(value); } inline bool isValid(double value) { // The extra parentheses protect from pain if isfinite() is also defined as a macro. return (boost::math::isfinite)(value); } template inline bool isValid(const Eigen::DenseBase& value) { internal::ValidVisitor visitor; value.visit(visitor); return visitor.getResult(); } template inline bool isValid(const Eigen::QuaternionBase& value) { return isValid(value.coeffs()); } template inline bool isValid(const Eigen::AngleAxis& value) { return isValid(value.angle()) && isValid(value.axis()); } template inline bool isValid(const Eigen::Rotation2D& value) { return isValid(value.angle()); } template inline bool isValid(const Eigen::Transform& value) { return isValid(value.matrix()); } inline bool isSubnormal(float value) { // The extra parentheses protect from pain if fpclassify() is also defined as a macro. return ((boost::math::fpclassify)(value) == FP_SUBNORMAL); } inline bool isSubnormal(double value) { // The extra parentheses protect from pain if fpclassify() is also defined as a macro. return ((boost::math::fpclassify)(value) == FP_SUBNORMAL); } template inline bool isSubnormal(const Eigen::DenseBase& value) { internal::NonSubnormalVisitor visitor; value.visit(visitor); // The visitor checks whether *all* entries are "non-subnormal", i.e. false means some are subnormal. // This is a consequence of deriving from PredicateAlwaysTrueVisitor. return ! visitor.getResult(); } template inline bool isSubnormal(const Eigen::QuaternionBase& value) { return isSubnormal(value.coeffs()); } template inline bool isSubnormal(const Eigen::AngleAxis& value) { return isSubnormal(value.angle()) || isSubnormal(value.axis()); } template inline bool isSubnormal(const Eigen::Rotation2D& value) { return isSubnormal(value.angle()); } template inline bool isSubnormal(const Eigen::Transform& value) { return isSubnormal(value.matrix()); } inline bool setSubnormalToZero(float* value) { // The extra parentheses protect from pain if fpclassify() is also defined as a macro. if ((boost::math::fpclassify)(*value) != FP_SUBNORMAL) { return false; } else { *value = 0.0f; return true; } } inline bool setSubnormalToZero(double* value) { // The extra parentheses protect from pain if fpclassify() is also defined as a macro. if ((boost::math::fpclassify)(*value) != FP_SUBNORMAL) { return false; } else { *value = 0.0; return true; } } template inline bool setSubnormalToZero(Eigen::DenseBase* value) { if (! isSubnormal(*value)) // optimize for the common case where nothing is subnormal { return false; } // TODO(bert): This is a simple implementation; it could be much more optimized by e.g. unrolling loops along // the lines of the implementation of Eigen::DenseBase::visit(). Unfortunately, we can't just *use* Eigen's // visitors here, because the visitor API doesn't allow modifying the values. typedef typename Eigen::DenseBase::Index Index; const Index numColumns = value->cols(); const Index numRows = value->rows(); for (Index j = 0; j < numColumns; ++j) { for (Index i = 0; i < numRows; ++i) { // The extra parentheses protect from pain if fpclassify() is also defined as a macro. if ((boost::math::fpclassify)(value->coeffRef(i, j)) == FP_SUBNORMAL) { value->coeffRef(i, j) = 0; } } } return true; } template inline bool setSubnormalToZero(Eigen::QuaternionBase* value) { return setSubnormalToZero(&(value->coeffs())); } template inline bool setSubnormalToZero(Eigen::AngleAxis* value) { bool angleChanged = setSubnormalToZero(&(value->angle())); bool axisChanged = setSubnormalToZero(&(value->axis())); return angleChanged || axisChanged; // careful about short-circuiting! } template inline bool setSubnormalToZero(Eigen::Rotation2D* value) { return setSubnormalToZero(&(value->angle())); } template inline bool setSubnormalToZero(Eigen::Transform* value) { return setSubnormalToZero(&(value->matrix())); } }; // namespace Math }; // namespace SurgSim #endif // SURGSIM_MATH_VALID_INL_H opensurgsim-0.7.0/SurgSim/Math/Valid.h000066400000000000000000000303361277777236100176130ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Declarations of isValid(), isSubnormal() and setSubnormalToZero(). #ifndef SURGSIM_MATH_VALID_H #define SURGSIM_MATH_VALID_H #include #include #include namespace SurgSim { namespace Math { /// Check if a float value is valid. /// Zero, subnormal and normal numbers are valid; infinities and NaNs are not. /// \param value the value to check. /// \returns true if valid, false if not. inline bool isValid(float value); /// Check if a double value is valid. /// Zero, subnormal and normal numbers are valid; infinities and NaNs are not. /// \param value the value to check. /// \returns true if valid, false if not. inline bool isValid(double value); /// Check if a matrix or a vector is valid. /// These quantities are valid if all of their elements are valid. /// Zero, subnormal and normal numbers are valid; infinities and NaNs are not. /// \tparam T the base type used to describe the matrix or vector. Can usually be deduced. /// \param value the matrix or vector value to check. /// \returns true if valid, false if not. template inline bool isValid(const Eigen::DenseBase& value); /// Check if a quaternion is valid. /// Quaternions are valid if all of their components are valid. /// Zero, subnormal and normal numbers are valid; infinities and NaNs are not. /// \tparam T the base type used to describe the quaternion. Can usually be deduced. /// \param value the quaternion value to check. /// \returns true if valid, false if not. template inline bool isValid(const Eigen::QuaternionBase& value); /// Check if an angle/axis 3D rotation is valid. /// Angle/axis rotations are valid if the angle and the axis components are valid. /// Zero, subnormal and normal numbers are valid; infinities and NaNs are not. /// \tparam T the scalar type used to describe the rotation. Can usually be deduced. /// \param value the rotation value to check. /// \returns true if valid, false if not. template inline bool isValid(const Eigen::AngleAxis& value); /// Check if a 2D rotation is valid. /// 2D rotations are valid if the rotation angle is valid. /// Zero, subnormal and normal numbers are valid; infinities and NaNs are not. /// \tparam T the scalar type used to describe the rotation. Can usually be deduced. /// \param value the rotation value to check. /// \returns true if valid, false if not. template inline bool isValid(const Eigen::Rotation2D& value); /// Check if a transform is valid. /// Transforms are valid if all of their components are valid. /// Zero, subnormal and normal numbers are valid; infinities and NaNs are not. /// \tparam T the scalar type used to describe the transform. Can usually be deduced. /// \tparam D the dimension used to describe the transform. Can usually be deduced. /// \tparam M the mode value used to describe the transform. Can usually be deduced. /// \tparam O the options value used to describe the transform. Can usually be deduced. /// \param value the transform value to check. /// \returns true if valid, false if not. template inline bool isValid(const Eigen::Transform& value); /// Check if a float value is subnormal. /// Subnormal values have absolute values in the range std::numeric_limits<float>::%denorm_min() <= /// x < std::numeric_limits<float>::%min(), and can result in very slow floating point calculations /// under some conditions. /// \param value the value to check. /// \returns true if subnormal; false if not (normal, zero, infinite or NaN). inline bool isSubnormal(float value); /// Check if a double value is subnormal. /// Subnormal values have absolute values in the range std::numeric_limits<double>::%denorm_min() <= /// x < std::numeric_limits<double>::%min(), and can result in very slow floating point /// calculations under some conditions. /// \param value the value to check. /// \returns true if subnormal; false if not (normal, zero, infinite or NaN). inline bool isSubnormal(double value); /// Check if a matrix or a vector contains any subnormal floating-point values. /// Subnormal values have absolute values in the range std::numeric_limits<T>::%denorm_min() <= x /// < std::numeric_limits<T>::%min(), and can result in very slow floating point calculations under /// some conditions. /// \tparam T the base type used to describe the matrix or vector. Can usually be deduced. /// \param value the matrix or vector value to check. /// \returns true if any value is subnormal; false if none are (i.e. each is normal, zero, infinite or NaN). template inline bool isSubnormal(const Eigen::DenseBase& value); /// Check if a quaternion contains any subnormal floating-point values. /// Subnormal values have absolute values in the range std::numeric_limits<T>::%denorm_min() <= x /// < std::numeric_limits<T>::%min(), and can result in very slow floating point calculations under /// some conditions. /// \tparam T the base type used to describe the quaternion. Can usually be deduced. /// \param value the quaternion value to check. /// \returns true if any value is subnormal; false if none are (i.e. each is normal, zero, infinite or NaN). template inline bool isSubnormal(const Eigen::QuaternionBase& value); /// Check if an angle/axis 3D rotation contains any subnormal floating-point values. /// Subnormal values have absolute values in the range std::numeric_limits<T>::%denorm_min() <= x /// < std::numeric_limits<T>::%min(), and can result in very slow floating point calculations under /// some conditions. /// \tparam T the scalar type used to describe the rotation. Can usually be deduced. /// \param value the rotation value to check. /// \returns true if any value is subnormal; false if none are (i.e. each is normal, zero, infinite or NaN). template inline bool isSubnormal(const Eigen::AngleAxis& value); /// Check if a 2D rotation is described by an angle that is subnormal. /// Subnormal values have absolute values in the range std::numeric_limits<T>::%denorm_min() <= x /// < std::numeric_limits<T>::%min(), and can result in very slow floating point calculations under /// some conditions. /// \tparam T the scalar type used to describe the rotation. Can usually be deduced. /// \param value the 2D rotation value to check. /// \returns true if the angle is subnormal; false if not (normal, zero, infinite or NaN). template inline bool isSubnormal(const Eigen::Rotation2D& value); /// Check if a transform contains any subnormal floating-point values. /// Subnormal values have absolute values in the range std::numeric_limits<T>::%denorm_min() <= x /// < std::numeric_limits<T>::%min(), and can result in very slow floating point calculations under /// some conditions. /// \tparam T the scalar type used to describe the transform. Can usually be deduced. /// \tparam D the dimension used to describe the transform. Can usually be deduced. /// \tparam M the mode value used to describe the transform. Can usually be deduced. /// \tparam O the options value used to describe the transform. Can usually be deduced. /// \param value the transform value to check. /// \returns true if any value is subnormal; false if none are (i.e. each is normal, zero, infinite or NaN). template inline bool isSubnormal(const Eigen::Transform& value); /// If the float value is subnormal, set it to zero. /// Subnormal values have absolute values in the range std::numeric_limits<float>::%denorm_min() <= /// x < std::numeric_limits<float>::%min(), and can result in very slow floating point calculations /// under some conditions. /// \param [in,out] value the value to check and possibly modify. /// \returns true if the value was modified. inline bool setSubnormalToZero(float* value); /// If the double value is subnormal, set it to zero. /// Subnormal values have absolute values in the range std::numeric_limits<double>::%denorm_min() <= /// x < std::numeric_limits<double>::%min(), and can result in very slow floating point calculations /// under some conditions. /// \param [in,out] value the value to check and possibly modify. /// \returns true if the value was modified. inline bool setSubnormalToZero(double* value); /// Set all subnormal values in a matrix or a vector to zero. /// Subnormal values have absolute values in the range std::numeric_limits<T>::%denorm_min() <= x /// < std::numeric_limits<T>::%min(), and can result in very slow floating point calculations under /// some conditions. /// \tparam T the base type used to describe the matrix or vector. Can usually be deduced. /// \param [in,out] value the matrix or vector value to check and possibly modify. /// \returns true if any value was modified. template inline bool setSubnormalToZero(Eigen::DenseBase* value); /// Set all subnormal values in a quaternion to zero. /// Subnormal values have absolute values in the range std::numeric_limits<T>::%denorm_min() <= x /// < std::numeric_limits<T>::%min(), and can result in very slow floating point calculations under /// some conditions. /// \tparam T the base type used to describe the quaternion. Can usually be deduced. /// \param [in,out] value the quaternion value to check and possibly modify. /// \returns true if any value was modified. template inline bool setSubnormalToZero(Eigen::QuaternionBase* value); /// Set all subnormal values in an angle/axis 3D rotation to zero. /// Subnormal values have absolute values in the range std::numeric_limits<T>::%denorm_min() <= x /// < std::numeric_limits<T>::%min(), and can result in very slow floating point calculations under /// some conditions. /// \tparam T the scalar type used to describe the rotation. Can usually be deduced. /// \param [in,out] value the rotation value to check and possibly modify. /// \returns true if any value was modified. template inline bool setSubnormalToZero(Eigen::AngleAxis* value); /// If the angle of a 2D rotation is subnormal, set it to zero. /// Subnormal values have absolute values in the range std::numeric_limits<T>::%denorm_min() <= x /// < std::numeric_limits<T>::%min(), and can result in very slow floating point calculations under /// some conditions. /// \tparam T the scalar type used to describe the rotation. Can usually be deduced. /// \param [in,out] value the rotation value to check and possibly modify. /// \returns true if the value was modified. template inline bool setSubnormalToZero(Eigen::Rotation2D* value); /// Set all subnormal values in a transform to zero. /// Subnormal values have absolute values in the range std::numeric_limits<T>::%denorm_min() <= x /// < std::numeric_limits<T>::%min(), and can result in very slow floating point calculations under /// some conditions. /// \tparam T the base type used to describe the transform. Can usually be deduced. /// \param [in,out] value the transform value to check and possibly modify. /// \returns true if any value was modified. template inline bool setSubnormalToZero(Eigen::Transform* value); }; // namespace Math }; // namespace SurgSim #include "SurgSim/Math/Valid-inl.h" #endif // SURGSIM_MATH_VALID_H opensurgsim-0.7.0/SurgSim/Math/Vector.h000066400000000000000000000214131277777236100200120ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Definitions of small fixed-size vector types. #ifndef SURGSIM_MATH_VECTOR_H #define SURGSIM_MATH_VECTOR_H #include #include #include #include #include "SurgSim/Framework/Assert.h" namespace SurgSim { namespace Math { /// A 2D vector of floats. /// This type (and any structs that contain it) can be safely allocated via new. typedef Eigen::Matrix Vector2f; /// A 3D vector of floats. /// This type (and any structs that contain it) can be safely allocated via new. typedef Eigen::Matrix Vector3f; /// A 4D vector of floats. /// This type (and any structs that contain it) can be safely allocated via new. typedef Eigen::Matrix Vector4f; /// A 6D vector of floats. /// This type (and any structs that contain it) can be safely allocated via new. typedef Eigen::Matrix Vector6f; /// A 2D vector of doubles. /// This type (and any structs that contain it) can be safely allocated via new. typedef Eigen::Matrix Vector2d; /// A 3D vector of doubles. /// This type (and any structs that contain it) can be safely allocated via new. typedef Eigen::Matrix Vector3d; /// A 4D vector of doubles. /// This type (and any structs that contain it) can be safely allocated via new. typedef Eigen::Matrix Vector4d; /// A 6D matrix of doubles. /// This type (and any structs that contain it) can be safely allocated via new. typedef Eigen::Matrix Vector6d; /// A dynamic size column vector typedef Eigen::Matrix Vector; /// Helper method to add a sub-vector into a vector, for the sake of clarity /// \tparam Vector The vector type /// \tparam SubVector The sub-vector type /// \param subVector The sub-vector /// \param blockId The block index in vector /// \param blockSize The block size /// \param[out] vector The vector to add the sub-vector into template void addSubVector(const SubVector& subVector, size_t blockId, size_t blockSize, Vector* vector) { vector->segment(blockSize * blockId, blockSize) += subVector; } /// Helper method to add a sub-vector per block into a vector, for the sake of clarity /// \tparam Vector The vector type /// \tparam SubVector The sub-vector type /// \param subVector The sub-vector (containing all the blocks) /// \param blockIds Vector of block indices (for accessing vector) corresponding to the blocks in sub-vector /// \param blockSize The block size /// \param[out] vector The vector to add the sub-vector blocks into template void addSubVector(const SubVector& subVector, const std::vector blockIds, size_t blockSize, Vector* vector) { const size_t numBlocks = blockIds.size(); for (size_t block = 0; block < numBlocks; block++) { size_t blockId = blockIds[block]; vector->segment(blockSize * blockId, blockSize) += subVector.segment(blockSize * block, blockSize); } } /// Helper method to set a sub-vector into a vector, for the sake of clarity /// \tparam Vector The vector type /// \tparam SubVector The sub-vector type /// \param subVector The sub-vector /// \param blockId The block index in vector /// \param blockSize The size of the sub-vector /// \param[out] vector The vector to set the sub-vector into template void setSubVector(const SubVector& subVector, size_t blockId, size_t blockSize, Vector* vector) { vector->segment(blockSize * blockId, blockSize) = subVector; } /// Helper method to access a sub-vector from a vector, for the sake of clarity /// \tparam Vector The vector type to get the sub-vector from /// \param vector The vector to get the sub-vector from /// \param blockId The block index /// \param blockSize The block size /// \return The requested sub-vector /// \note Disable cpplint warnings for use of non-const reference /// \note Eigen has a specific type for VectorBlock that we want to return with read/write access /// \note therefore the Vector from which the VectorBlock is built from must not be const template Eigen::VectorBlock getSubVector(Vector& vector, size_t blockId, size_t blockSize) // NOLINT { return vector.segment(blockSize * blockId, blockSize); } /// Helper method to get a sub-vector per block from a vector, for the sake of clarity /// \tparam Vector The vector type /// \tparam SubVector The sub-vector type /// \param vector The vector (containing the blocks in a sparse manner) /// \param blockIds Vector of block indices (for accessing vector) corresponding to the blocks in vector /// \param blockSize The block size /// \param[out] subVector The sub-vector to store the requested blocks (blockIds) from vector into template void getSubVector(const Vector& vector, const std::vector blockIds, size_t blockSize, SubVector* subVector) { const size_t numBlocks = blockIds.size(); for (size_t block = 0; block < numBlocks; block++) { size_t blockId = blockIds[block]; subVector->segment(blockSize * block, blockSize) = vector.segment(blockSize * blockId, blockSize); } } /// Interpolate (slerp) between 2 vectors /// \tparam T the numeric data type used for arguments and the return value. Can usually be deduced. /// \tparam size the size of the vectors. Can be deduced. /// \tparam TOpt the option flags (alignment etc.) used for the Vector arguments. Can be deduced. /// \param previous The starting vector (at time 0.0). /// \param next The ending vector (at time 1.0). /// \param t The interpolation time requested. Within [0..1], although note bounds are not checked. /// \returns the transform resulting in the slerp interpolation at time t. /// \note t=0 => returns vector 'previous' /// \note t=1 => returns vector 'next' template Eigen::Matrix interpolate( const Eigen::Matrix& previous, const Eigen::Matrix& next, T t) { return previous + t * (next - previous); } /// Helper method to construct an orthonormal basis (i, j, k) given the 1st vector direction /// \tparam T the numeric data type used for the vector argument. Can usually be deduced. /// \tparam VOpt the option flags (alignment etc.) used for the vector argument. Can be deduced. /// \param[in, out] i Should provide the 1st direction on input. The 1st vector of the basis (i, j, k) on output. /// \param[out] j, k The 2nd and 3rd orthonormal vectors of the basis (i, j, k) /// \return True if (i, j, k) has been built successfully, False if 'i' is a (or close to a) null vector /// \note If any of the parameter is a nullptr, an exception will be raised template bool buildOrthonormalBasis(Eigen::Matrix* i, Eigen::Matrix* j, Eigen::Matrix* k) { SURGSIM_ASSERT(i != nullptr) << "Parameter [in, out] 'i' is a nullptr"; SURGSIM_ASSERT(j != nullptr) << "Parameter [out] 'j' is a nullptr"; SURGSIM_ASSERT(k != nullptr) << "Parameter [out] 'k' is a nullptr"; if (i->isZero()) { return false; } i->normalize(); *j = i->unitOrthogonal(); *k = i->cross(*j); return true; } /// Calculate the best unit normal we can find in the direction of pXq for one of the endpoints of q. /// Try multiple arrangements of the end points to reduce the artifacts when three of the vertices may /// be nearly collinear. /// \param p segment p /// \param q segment q /// \param epsilon when the norm of p x q is above epsilon, the cross product is assumed to be valid. /// return the normalized cross product of p x q template Eigen::Matrix robustCrossProduct(const std::array, 2>& p, const std::array, 2>& q, T epsilon) { auto p0p1 = p[1] - p[0]; auto p1q0 = q[0] - p[1]; auto p0q0 = q[0] - p[0]; auto p1q1 = q[1] - p[1]; auto pXq = p0p1.cross(p1q0); auto norm = pXq.norm(); if (norm < epsilon) { pXq = p0p1.cross(p0q0); norm = pXq.norm(); } if (norm < epsilon) { pXq = p0p1.cross(p1q1); norm = pXq.norm(); } pXq *= static_cast(1.0 / norm); return pXq; } }; // namespace Math }; // namespace SurgSim #endif // SURGSIM_MATH_VECTOR_H opensurgsim-0.7.0/SurgSim/Particles/000077500000000000000000000000001277777236100174335ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Particles/CMakeLists.txt000066400000000000000000000031071277777236100221740ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2012-2015, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. set(SURGSIM_PARTICLES_SOURCES DefaultPointGenerator.cpp Emitter.cpp ParticlesCollisionRepresentation.cpp PointGenerator.cpp RandomBoxPointGenerator.cpp RandomMeshPointGenerator.cpp RandomPointGenerator.cpp RandomSpherePointGenerator.cpp Representation.cpp Sink.cpp SphRepresentation.cpp ) set(SURGSIM_PARTICLES_HEADERS DefaultPointGenerator.h Emitter.h Particles.h ParticlesCollisionRepresentation.h PointGenerator.h RandomBoxPointGenerator.h RandomMeshPointGenerator.h RandomPointGenerator.h RandomSpherePointGenerator.h Representation.h Sink.h SphRepresentation.h ) surgsim_add_library( SurgSimParticles "${SURGSIM_PARTICLES_SOURCES}" "${SURGSIM_PARTICLES_HEADERS}" ) SET(LIBS SurgSimMath) target_link_libraries(SurgSimParticles ${LIBS}) if(BUILD_TESTING) add_subdirectory(UnitTests) if(BUILD_RENDER_TESTING) add_subdirectory(RenderTests) endif() endif() set_target_properties(SurgSimParticles PROPERTIES FOLDER "Particles") opensurgsim-0.7.0/SurgSim/Particles/DefaultPointGenerator.cpp000066400000000000000000000030021277777236100243770ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Particles/DefaultPointGenerator.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Math/Shape.h" namespace SurgSim { namespace Particles { using SurgSim::Math::Vector3d; DefaultPointGenerator::~DefaultPointGenerator() { } Vector3d DefaultPointGenerator::pointInShape(std::shared_ptr shape) { SURGSIM_LOG_SEVERE(SurgSim::Framework::Logger::getDefaultLogger()) << "PointGenerator does not support generating points in shape type: "<< shape->getType(); return Vector3d::Zero(); } Vector3d DefaultPointGenerator::pointOnShape(std::shared_ptr shape) { SURGSIM_LOG_SEVERE(SurgSim::Framework::Logger::getDefaultLogger()) << "PointGenerator does not support generating points on the surface of shape type: "<< shape->getType(); return Vector3d::Zero(); } }; // namespace Particles }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Particles/DefaultPointGenerator.h000066400000000000000000000031371277777236100240550ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PARTICLES_DEFAULTPOINTGENERATOR_H #define SURGSIM_PARTICLES_DEFAULTPOINTGENERATOR_H #include "SurgSim/Math/Vector.h" #include "SurgSim/Particles/PointGenerator.h" namespace SurgSim { namespace Math { class Shape; } namespace Particles { /// DefaultPointGenerator, methods of this class will always return (0.0, 0.0, 0.0) and output a severe logging message. /// They are served more like a place holder (concrete implementation) to be used in ShapesPointGenerator. /// One should develop an actual XXXPointGenerator to produce points in/on the shape. class DefaultPointGenerator: public PointGenerator { public: /// Destructor virtual ~DefaultPointGenerator(); SurgSim::Math::Vector3d pointInShape(std::shared_ptr shape) override; SurgSim::Math::Vector3d pointOnShape(std::shared_ptr shape) override; }; }; // namespace Particles }; // namespace SurgSim #endif // SURGSIM_PARTICLES_DEFAULTPOINTGENERATOR_H opensurgsim-0.7.0/SurgSim/Particles/Emitter.cpp000066400000000000000000000137411277777236100215560ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Particles/Emitter.h" #include #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Framework/SceneElement.h" #include "SurgSim/Math/MathConvert.h" #include "SurgSim/Math/Shape.h" #include "SurgSim/Particles/Representation.h" using SurgSim::Math::Vector3d; namespace SurgSim { namespace Particles { SURGSIM_REGISTER(SurgSim::Framework::Component, SurgSim::Particles::Emitter, Emitter); Emitter::Emitter(const std::string& name) : SurgSim::Framework::Behavior(name), m_mode(EMIT_MODE_VOLUME), m_rate(0.0), m_lifetimeRange(std::make_pair(0.0, 0.0)), m_velocityRange(std::make_pair(Vector3d::Zero(), Vector3d::Zero())), m_particlesNotAdded(0.0), m_localPose(SurgSim::Math::RigidTransform3d::Identity()), m_logger(SurgSim::Framework::Logger::getLogger("Particles")) { typedef std::pair LifetimeRangeType; SURGSIM_ADD_SERIALIZABLE_PROPERTY(Emitter, LifetimeRangeType, LifetimeRange, getLifetimeRange, setLifetimeRange); SURGSIM_ADD_SERIALIZABLE_PROPERTY(Emitter, int, Mode, getMode, setMode); SURGSIM_ADD_SERIALIZABLE_PROPERTY(Emitter, double, Rate, getRate, setRate); SURGSIM_ADD_SERIALIZABLE_PROPERTY(Emitter, std::shared_ptr, Shape, getShape, setShape); SURGSIM_ADD_SERIALIZABLE_PROPERTY(Emitter, std::shared_ptr, Target, getTarget, setTarget); typedef std::pair VelocityRangeType; SURGSIM_ADD_SERIALIZABLE_PROPERTY(Emitter, VelocityRangeType, VelocityRange, getVelocityRange, setVelocityRange); SURGSIM_ADD_SERIALIZABLE_PROPERTY(Emitter, SurgSim::Math::RigidTransform3d, LocalPose, getLocalPose, setLocalPose); SURGSIM_ADD_RO_PROPERTY(Emitter, SurgSim::Math::RigidTransform3d, Pose, getPose); std::random_device device; m_generator.seed(device()); m_zeroOneDistribution.param(std::uniform_real_distribution::param_type(0.0, 1.0)); } Emitter::~Emitter() { } bool Emitter::doInitialize() { return true; } bool Emitter::doWakeUp() { if (m_target == nullptr) { SURGSIM_LOG_SEVERE(m_logger) << "Emitters need a Representation to emit to."; return false; } if (m_shape == nullptr) { SURGSIM_LOG_SEVERE(m_logger) << "Emitters need a shape."; return false; } return true; } void Emitter::update(double dt) { Vector3d position, velocity; double lifetime; double particlesToAdd = m_rate * dt + m_particlesNotAdded; size_t particlesAdded = 0; for ( ; particlesAdded < std::floor(particlesToAdd); particlesAdded++) { if (m_mode == EMIT_MODE_VOLUME) { position = getPose() * m_pointGenerator.pointInShape(m_shape); } else { position = getPose() * m_pointGenerator.pointOnShape(m_shape); } velocity = Vector3d::NullaryExpr([this](int index){return m_zeroOneDistribution(m_generator);}); velocity = m_velocityRange.first + (m_velocityRange.second - m_velocityRange.first).cwiseProduct(velocity); lifetime = m_zeroOneDistribution(m_generator); lifetime = m_lifetimeRange.first + (m_lifetimeRange.second - m_lifetimeRange.first) * lifetime; if (!m_target->addParticle(position, velocity, lifetime)) { SURGSIM_LOG_DEBUG(m_logger) << "Unable to add particle to " << m_target->getName(); break; } } m_particlesNotAdded = particlesToAdd - particlesAdded; } int Emitter::getTargetManagerType() const { return SurgSim::Framework::MANAGER_TYPE_PHYSICS; } void Emitter::setShape(std::shared_ptr shape) { m_shape = shape; } std::shared_ptr Emitter::getShape() const { return m_shape; } void Emitter::setTarget(const std::shared_ptr target) { m_target = SurgSim::Framework::checkAndConvert(target, "SurgSim::Particles::Representation"); } const std::shared_ptr Emitter::getTarget() { return m_target; } void Emitter::setMode(int mode) { SURGSIM_ASSERT(0 <= mode && mode < EMIT_MODE_COUNT) << "Invalid emit mode"; m_mode = mode; } int Emitter::getMode() const { return m_mode; } void Emitter::setRate(double rate) { SURGSIM_ASSERT(rate >= 0.0) << "Emit rate must be non-negative"; m_rate = rate; } double Emitter::getRate() const { return m_rate; } void Emitter::setLifetimeRange(const std::pair& range) { SURGSIM_ASSERT(0.0 < range.first && range.first <= range.second) << "Lower bound of lifetime must be greater than 0 and not greater than the upper bound of lifetime."; m_lifetimeRange = range; } std::pair Emitter::getLifetimeRange() const { return m_lifetimeRange; } void Emitter::setVelocityRange(const std::pair& range) { SURGSIM_ASSERT((range.first.array() <= range.second.array()).all()) << "Minimum velocity must be less than maximum"; m_velocityRange = range; } const std::pair& Emitter::getVelocityRange() const { return m_velocityRange; } void Emitter::setLocalPose(const SurgSim::Math::RigidTransform3d& pose) { m_localPose = pose; } SurgSim::Math::RigidTransform3d Emitter::getPose() const { if (getSceneElement() != nullptr) { return getSceneElement()->getPose() * getLocalPose(); } else { return getLocalPose(); } } SurgSim::Math::RigidTransform3d Emitter::getLocalPose() const { return m_localPose; } }; // namespace Particles }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Particles/Emitter.h000066400000000000000000000124421277777236100212200ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PARTICLES_EMITTER_H #define SURGSIM_PARTICLES_EMITTER_H #include #include #include #include "SurgSim/Framework/ObjectFactory.h" #include "SurgSim/Framework/Behavior.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Particles/RandomPointGenerator.h" namespace SurgSim { namespace Framework { class Logger; }; namespace Math { class Shape; }; namespace Particles { class Representation; /// Emitting modes of the Emitter enum EmitMode { /// Emit particles from within the shapes volume EMIT_MODE_VOLUME = 0, /// Emit particles only from the surface EMIT_MODE_SURFACE, /// The number of EmitModes EMIT_MODE_COUNT }; SURGSIM_STATIC_REGISTRATION(Emitter); /// Emitter emits particles into a ParticleSystem class Emitter : public SurgSim::Framework::Behavior { public: /// Constructor /// \param name The Emitter's name explicit Emitter(const std::string& name); /// Destructor virtual ~Emitter(); SURGSIM_CLASSNAME(SurgSim::Particles::Emitter); void update(double dt) override; int getTargetManagerType() const override; /// Set the target to emit to. /// \param target The ParticleSystem to emit to. void setTarget(const std::shared_ptr target); /// Get the target to emit to. /// \return The ParticleSystem to emit to. const std::shared_ptr getTarget(); /// Set the shape of this emitter. /// \param shape Shape of this emitter. void setShape(std::shared_ptr shape); /// Get the shape of this emitter. /// \return Shape of this emitter. std::shared_ptr getShape() const; /// Set the emit mode of this emitter. /// \param mode The emit mode. void setMode(int mode); /// Get the emit mode of this emitter. /// \return Emit mode of this emitter. int getMode() const; /// Set the emit rate of this emitter. /// \param rate The rate of emitting [particles/s]. void setRate(double rate); /// Get the emit rate of this emitter. /// \return Emitting rate [particles/s]. double getRate() const; /// Set the range of lifetimes of emitted particles. /// Each emitted particle will have a randomly chosen lifetime in the supplied range. /// \param range The shortest and longest lifetimes to produce. void setLifetimeRange(const std::pair& range); /// Get the range of lifetimes of emitted particles. /// \return The shortest and longest lifetimes. std::pair getLifetimeRange() const; /// Set the range of velocities of the emitted particles. /// Each produced particle will have a randomly chosen velocity in the supplied range. /// \param range The minimum and maximum velocity. void setVelocityRange(const std::pair& range); /// Get the range of velocities of the emitted particles. const std::pair& getVelocityRange() const; /// Set the pose of the Emitter with respect to the Scene Element /// \param pose The pose to set the Emitter to virtual void setLocalPose(const SurgSim::Math::RigidTransform3d& pose); /// Get the pose of the Emitter with respect to the Scene Element /// \return The pose of this Emitter virtual SurgSim::Math::RigidTransform3d getLocalPose() const; /// Get the pose of the Emitter in world coordinates /// \return The pose of this Emitter virtual SurgSim::Math::RigidTransform3d getPose() const; private: bool doInitialize() override; bool doWakeUp() override; /// PointGenerator for generating random points within or on the emitter shape. RandomPointGenerator m_pointGenerator; /// The emit mode of this emitter. int m_mode; /// The emit rate of this emitter. double m_rate; /// The range of lifetimes of emitted particles. std::pair m_lifetimeRange; /// The range of velocities of the emitted particles. std::pair m_velocityRange; /// Number of particles not added during last update. double m_particlesNotAdded; ///@{ /// Random number generator and distribution used to assign random lifetimes and velocities std::mt19937 m_generator; std::uniform_real_distribution m_zeroOneDistribution; ///@} /// Shape of emitter. std::shared_ptr m_shape; /// Representation to emit to. std::shared_ptr m_target; /// Local Pose of the Representation with respect to the SceneElement SurgSim::Math::RigidTransform3d m_localPose; /// Logger used by the Emitter std::shared_ptr m_logger; }; }; // namespace Particles }; // namespace SurgSim #endif // SURGSIM_PARTICLES_EMITTER_H opensurgsim-0.7.0/SurgSim/Particles/Particles.h000066400000000000000000000031121277777236100215270ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PARTICLES_PARTICLES_H #define SURGSIM_PARTICLES_PARTICLES_H #include "SurgSim/DataStructures/Vertices.h" #include "SurgSim/Math/Vector.h" namespace SurgSim { namespace Particles { struct ParticleData { /// The lifetime of the particle [s] double lifetime; /// The velocity of the particle [m/s] Math::Vector3d velocity; /// Equality operator. /// \param rhs The right hand side. /// \return true if the parameters are considered equivalent. bool operator==(const ParticleData& rhs) const { return lifetime == rhs.lifetime && velocity.isApprox(rhs.velocity); } /// Inequality operator. /// \param rhs The right hand side. /// \return true if the parameters are not considered equivalent. bool operator!=(const ParticleData& rhs) const { return !((*this) == rhs); } }; typedef DataStructures::Vertices Particles; typedef Particles::VertexType Particle; }; }; #endif //SURGSIM_PARTICLES_PARTICLES_H opensurgsim-0.7.0/SurgSim/Particles/ParticlesCollisionRepresentation.cpp000066400000000000000000000060361277777236100266710ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Particles/ParticlesCollisionRepresentation.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Math/ParticlesShape.h" #include "SurgSim/Math/Shape.h" #include "SurgSim/Particles/Representation.h" namespace SurgSim { namespace Particles { SURGSIM_REGISTER(SurgSim::Framework::Component, SurgSim::Particles::ParticlesCollisionRepresentation, ParticlesCollisionRepresentation); ParticlesCollisionRepresentation::ParticlesCollisionRepresentation(const std::string& name) : SurgSim::Collision::Representation(name), m_shape(std::make_shared()) { m_shape->setRadius(0.01); } ParticlesCollisionRepresentation::~ParticlesCollisionRepresentation() { } bool ParticlesCollisionRepresentation::doInitialize() { return true; } bool ParticlesCollisionRepresentation::doWakeUp() { auto particleRepresentation = m_particleRepresentation.lock(); if (particleRepresentation == nullptr) { SURGSIM_LOG_SEVERE(SurgSim::Framework::Logger::getDefaultLogger()) << getName() << ": does not have a Particle Representation."; return false; } m_shape->getVertices().reserve(particleRepresentation->getMaxParticles()); update(0.0); return true; } int ParticlesCollisionRepresentation::getShapeType() const { return m_shape->getType(); } const std::shared_ptr ParticlesCollisionRepresentation::getShape() const { return m_shape; } void ParticlesCollisionRepresentation::setParticleRepresentation( std::shared_ptr representation) { m_particleRepresentation = representation; } const std::shared_ptr ParticlesCollisionRepresentation::getParticleRepresentation() const { auto particleRepresentation = m_particleRepresentation.lock(); SURGSIM_ASSERT(particleRepresentation != nullptr) << "Failed to get the Particle Representation. The ParticlesCollisionRepresentation either was not " "attached to a Particle Representation or the Particle Representation has expired."; return particleRepresentation; } void ParticlesCollisionRepresentation::setParticleRadius(double radius) { m_shape->setRadius(radius); } double ParticlesCollisionRepresentation::getParticleRadius() const { return m_shape->getRadius(); } void ParticlesCollisionRepresentation::updateShapeData() { *m_shape = getParticleRepresentation()->getParticles().unsafeGet(); invalidatePosedShapeMotion(); } }; }; opensurgsim-0.7.0/SurgSim/Particles/ParticlesCollisionRepresentation.h000066400000000000000000000053431277777236100263360ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PARTICLES_PARTICLESCOLLISIONREPRESENTATION_H #define SURGSIM_PARTICLES_PARTICLESCOLLISIONREPRESENTATION_H #include #include #include "SurgSim/Collision/Representation.h" #include "SurgSim/Framework/ObjectFactory.h" namespace SurgSim { namespace Math { class Shape; class ParticlesShape; }; namespace Particles { class Representation; SURGSIM_STATIC_REGISTRATION(ParticlesCollisionRepresentation); /// A Collision Representation that can be attached to a Particle Representation class ParticlesCollisionRepresentation : public SurgSim::Collision::Representation { public: /// Constructor /// \param name Name of the Representation explicit ParticlesCollisionRepresentation(const std::string& name); /// Destructor virtual ~ParticlesCollisionRepresentation(); SURGSIM_CLASSNAME(SurgSim::Particles::ParticlesCollisionRepresentation); const std::shared_ptr getShape() const override; int getShapeType() const override; void updateShapeData() override; /// Sets the particle representation this collision representation is connected /// \param representation The paticle representation void setParticleRepresentation(std::shared_ptr representation); /// Gets the particle representation this collision representation is connected /// \return The particle representation const std::shared_ptr getParticleRepresentation() const; /// Set the particles' radius /// \param radius the radius being set to all particles void setParticleRadius(double radius); /// Get the radius of the particles /// \return The particles' radius double getParticleRadius() const; private: bool doInitialize() override; bool doWakeUp() override; /// Shape used for collision detection std::shared_ptr m_shape; /// Reference to the particle representation driving changes to this collision representation std::weak_ptr m_particleRepresentation; }; }; }; #endif // SURGSIM_PARTICLES_PARTICLESCOLLISIONREPRESENTATION_H opensurgsim-0.7.0/SurgSim/Particles/PointGenerator.cpp000066400000000000000000000023541277777236100231030ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Particles/PointGenerator.h" #include // For boost::math::float_next() namespace SurgSim { namespace Particles { PointGenerator::PointGenerator() : m_openOneOneDistribution(boost::math::float_next(-1.0), 1.0), m_closedOneOneDistribution(-1.0, boost::math::float_next(1.0)), m_closedZeroOneDistribution(0.0, boost::math::float_next(1.0)), m_closedZeroOpenOneDistribution(0.0, 1.0) { std::random_device randomDevice; m_generator.seed(randomDevice()); } PointGenerator::~PointGenerator() { } }; // namespace Particles }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Particles/PointGenerator.h000066400000000000000000000045311277777236100225470ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PARTICLES_POINTGENERATOR_H #define SURGSIM_PARTICLES_POINTGENERATOR_H #include #include #include "SurgSim/Math/Vector.h" namespace SurgSim { namespace Math { class Shape; } namespace Particles { /// PointGenerator is used to generate points inside or on the surface of a given shape. /// Derived classes need to implement pointInShape() and pointOnShape(). class PointGenerator { public: /// Constructor PointGenerator(); /// Destructor virtual ~PointGenerator(); /// Generates one point inside the given shape. /// \param shape The shape inside which a point will be generated. /// \return A point inside the shape, shape is assumed to be located at the origin. virtual SurgSim::Math::Vector3d pointInShape(std::shared_ptr shape) = 0; /// Generates one point on the surface of the given shape. /// \param shape The shape on which a point will be generated. /// \return A point on the surface of the shape, shape is assumed to be located at the origin. virtual SurgSim::Math::Vector3d pointOnShape(std::shared_ptr shape) = 0; protected: ///@{ /// Random number generator and some predefined distributions to be used by different shape point generators. std::mt19937 m_generator; std::uniform_real_distribution m_openOneOneDistribution; // <-- (-1.0, 1.0) std::uniform_real_distribution m_closedOneOneDistribution; // <-- [-1.0, 1.0] std::uniform_real_distribution m_closedZeroOneDistribution; // <-- [0.0, 1.0] std::uniform_real_distribution m_closedZeroOpenOneDistribution; // <-- [0.0, 1.0) ///@} }; }; // namespace Particles }; // namespace SurgSim #endif // SURGSIM_PARTICLES_POINTGENERATOR_H opensurgsim-0.7.0/SurgSim/Particles/RandomBoxPointGenerator.cpp000066400000000000000000000040561277777236100247160ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Particles/RandomBoxPointGenerator.h" #include "SurgSim/Math/BoxShape.h" namespace SurgSim { namespace Particles { using SurgSim::Math::Vector3d; RandomBoxPointGenerator::~RandomBoxPointGenerator() { } Vector3d RandomBoxPointGenerator::pointInShape(std::shared_ptr shape) { auto box = std::static_pointer_cast(shape); auto halfSize = box->getSize() * 0.5; Vector3d random = Vector3d::NullaryExpr([&](int index){return m_openOneOneDistribution(m_generator);}); return random.array() * halfSize.array(); } Vector3d RandomBoxPointGenerator::pointOnShape(std::shared_ptr shape) { auto box = std::static_pointer_cast(shape); Vector3d halfSize = box->getSize() * 0.5; std::uniform_int_distribution axisDirectionSelector(0, 2); // 0: X-Axis, 1: Y-Axis, 2: Z-Axis. std::uniform_int_distribution valueSelector(0, 1); // 0: negative size value, 1: positive size value. Vector3d result; // Choose one axis to be fixed. int axis = axisDirectionSelector(m_generator); result[axis] = valueSelector(m_generator) == 0 ? -halfSize[axis] : halfSize[axis]; // Then generate coordinates for the other two axes. for (size_t t = 0; t < 2; ++t) { ++axis; axis %= 3; result[axis] = m_closedOneOneDistribution(m_generator) * halfSize[axis]; } return result; } }; // namespace Particles }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Particles/RandomBoxPointGenerator.h000066400000000000000000000025571277777236100243670ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PARTICLES_RANDOMBOXPOINTGENERATOR_H #define SURGSIM_PARTICLES_RANDOMBOXPOINTGENERATOR_H #include "SurgSim/Math/Vector.h" #include "SurgSim/Particles/PointGenerator.h" namespace SurgSim { namespace Math { class Shape; } namespace Particles { /// Class to generate points inside or on the surface of a box. class RandomBoxPointGenerator: public PointGenerator { public: /// Destructor virtual ~RandomBoxPointGenerator(); SurgSim::Math::Vector3d pointInShape(std::shared_ptr shape) override; SurgSim::Math::Vector3d pointOnShape(std::shared_ptr shape) override; }; }; // namespace Particles }; // namespace SurgSim #endif // SURGSIM_PARTICLES_RANDOMBOXPOINTGENERATOR_H opensurgsim-0.7.0/SurgSim/Particles/RandomMeshPointGenerator.cpp000066400000000000000000000047041277777236100250620ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Particles/RandomMeshPointGenerator.h" #include "SurgSim/Math/MeshShape.h" using SurgSim::Math::Vector2d; using SurgSim::Math::Vector3d; namespace SurgSim { namespace Particles { Math::Vector3d RandomMeshPointGenerator::pointInShape(std::shared_ptr shape) { SURGSIM_LOG_SEVERE(SurgSim::Framework::Logger::getDefaultLogger()) << "PointGenerator does not support generating points in shape: "<< shape->getType(); return Vector3d::Zero(); } Math::Vector3d RandomMeshPointGenerator::pointOnShape(std::shared_ptr shape) { Vector3d point; auto mesh = std::static_pointer_cast(shape); if (mesh->getNumTriangles() > 0) { auto& triangles = mesh->getTriangles(); std::uniform_int_distribution triangleSelector(0, static_cast(triangles.size()) - 1); bool validTriangleFound = false; size_t index; while (!validTriangleFound) { index = triangleSelector(m_generator); validTriangleFound = triangles[index].isValid; } auto vertices = mesh->getTrianglePositions(index); // Find a random point on the triangle using algorithm developed by Osada et al. // R. Osada, T. Funkhouser, B. Chazelle, D. Dobkin, "Shape Distributions", // ACM Transactions on Graphics, vol. 21, no. 4, pp. 807–832, October 2002 Vector2d random = Vector2d::NullaryExpr([&](int index){return m_closedZeroOneDistribution(m_generator);}); random[0] = sqrt(random[0]); point = (1 - random[0]) * vertices[0]; point += random[0] * (1 - random[1]) * vertices[1]; point += random[0] * random[1] * vertices[2]; } else { SURGSIM_LOG_SEVERE(SurgSim::Framework::Logger::getDefaultLogger()) << "Mesh does not contain any triangles, cannot generate point."; point = Vector3d::Zero(); } return point; } }; // namespace Particles }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Particles/RandomMeshPointGenerator.h000066400000000000000000000027331277777236100245270ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PARTICLES_RANDOMMESHPOINTGENERATOR_H #define SURGSIM_PARTICLES_RANDOMMESHPOINTGENERATOR_H #include "SurgSim/Particles/PointGenerator.h" namespace SurgSim { namespace Math { class Shape; } namespace Particles { /// Class to generate points on the surface of a mesh /// \note Each triangle in the mesh has equal weight in the distribution of /// points. As a result, areas with higher triangle density have a higher /// likely hood of generating points than areas with a lower triangle density. class RandomMeshPointGenerator: public PointGenerator { public: Math::Vector3d pointInShape(std::shared_ptr shape) override; Math::Vector3d pointOnShape(std::shared_ptr shape) override; }; }; // namespace Particles }; // namespace SurgSim #endif // SURGSIM_PARTICLES_RANDOMMESHPOINTGENERATOR_H opensurgsim-0.7.0/SurgSim/Particles/RandomPointGenerator.cpp000066400000000000000000000043331277777236100242430ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Particles/RandomPointGenerator.h" #include "SurgSim/Math/Shape.h" #include "SurgSim/Particles/DefaultPointGenerator.h" #include "SurgSim/Particles/RandomBoxPointGenerator.h" #include "SurgSim/Particles/RandomMeshPointGenerator.h" #include "SurgSim/Particles/RandomSpherePointGenerator.h" namespace SurgSim { namespace Particles { RandomPointGenerator::RandomPointGenerator() { for (size_t index = 0; index < static_cast(Math::SHAPE_TYPE_COUNT); ++index) { m_pointGenerators[index].reset(new DefaultPointGenerator()); } m_pointGenerators[Math::SHAPE_TYPE_BOX].reset(new RandomBoxPointGenerator()); m_pointGenerators[Math::SHAPE_TYPE_MESH].reset(new RandomMeshPointGenerator()); m_pointGenerators[Math::SHAPE_TYPE_SPHERE].reset(new RandomSpherePointGenerator()); } Math::Vector3d RandomPointGenerator::pointInShape(std::shared_ptr shape) { SURGSIM_ASSERT(shape != nullptr) << "Empty shape passed in."; auto shapeType = shape->getType(); SURGSIM_ASSERT(Math::SHAPE_TYPE_NONE < shapeType && shapeType < Math::SHAPE_TYPE_COUNT) << "Unknown shape type passed in."; return m_pointGenerators[shapeType]->pointInShape(shape); } Math::Vector3d RandomPointGenerator::pointOnShape(std::shared_ptr shape) { SURGSIM_ASSERT(shape != nullptr) << "Empty shape passed in."; auto shapeType = shape->getType(); SURGSIM_ASSERT(Math::SHAPE_TYPE_NONE < shapeType && shapeType < Math::SHAPE_TYPE_COUNT) << "Unknown shape type passed in."; return m_pointGenerators[shapeType]->pointOnShape(shape); } }; // namespace Particles }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Particles/RandomPointGenerator.h000066400000000000000000000033531277777236100237110ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PARTICLES_RANDOMPOINTGENERATOR_H #define SURGSIM_PARTICLES_RANDOMPOINTGENERATOR_H #include #include #include "SurgSim/Math/Shape.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Particles/PointGenerator.h" namespace SurgSim { namespace Particles { /// RandomPointGenerator will generate points based on the shape passed. /// Internally, this class maintains a list of PointGenerators for each supported shape. /// The list gets populated when RandomPointGenerator is constructed. /// \sa PointGenerator class RandomPointGenerator : public PointGenerator { public: /// Constructor RandomPointGenerator(); SurgSim::Math::Vector3d pointInShape(std::shared_ptr shape) override; SurgSim::Math::Vector3d pointOnShape(std::shared_ptr shape) override; private: /// List of point generators. /// Will be populated by constructor. std::array, SurgSim::Math::SHAPE_TYPE_COUNT> m_pointGenerators; }; }; // namespace Particles }; // namespace SurgSim #endif // SURGSIM_PARTICLES_RANDOMPOINTGENERATOR_H opensurgsim-0.7.0/SurgSim/Particles/RandomSpherePointGenerator.cpp000066400000000000000000000044311277777236100254110ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Particles/RandomSpherePointGenerator.h" #include "SurgSim/Math/SphereShape.h" namespace SurgSim { namespace Particles { using SurgSim::Math::Vector3d; RandomSpherePointGenerator::~RandomSpherePointGenerator() { } Vector3d RandomSpherePointGenerator::pointInShape(std::shared_ptr shape) { auto sphere = std::static_pointer_cast(shape); // A point on the sphere, use it as direction and then multiple it by a number between [0,1) to move it inside. Vector3d result = pointOnShape(shape) * m_closedZeroOpenOneDistribution(m_generator); return result; } Vector3d RandomSpherePointGenerator::pointOnShape(std::shared_ptr shape) { auto sphere = std::static_pointer_cast(shape); double radius = sphere->getRadius(); // Spherical coordinate system can not produce an uniformly distributed points on the surface of the sphere. // ref: http://mathworld.wolfram.com/SpherePointPicking.html // Implementation was based on http://www.cs.cmu.edu/~mws/rpos.html double z = 0.0; double phi = 0.0; double theta = 0.0; double cosineTheta = 0.0; Vector3d result = Vector3d::Zero(); // If the origin (0.0, 0.0, 0.0) is produced, regenerate. while (result.isZero()) { z = m_closedOneOneDistribution(m_generator) * radius; phi = m_closedZeroOneDistribution(m_generator) * 2.0 * M_PI; theta = std::asin(z / radius); cosineTheta = std::cos(theta); result.x() = radius * cosineTheta * std::cos(phi); result.y() = radius * cosineTheta * std::sin(phi); result.z() = z; } return result; } }; // namespace Particles }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Particles/RandomSpherePointGenerator.h000066400000000000000000000026011277777236100250530ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PARTICLES_RANDOMSPHEREPOINTGENERATOR_H #define SURGSIM_PARTICLES_RANDOMSPHEREPOINTGENERATOR_H #include "SurgSim/Math/Vector.h" #include "SurgSim/Particles/PointGenerator.h" namespace SurgSim { namespace Math { class Shape; } namespace Particles { /// Class to generate points inside or on the surface of a sphere. class RandomSpherePointGenerator: public PointGenerator { public: /// Destructor virtual ~RandomSpherePointGenerator(); SurgSim::Math::Vector3d pointInShape(std::shared_ptr shape) override; SurgSim::Math::Vector3d pointOnShape(std::shared_ptr shape) override; }; }; // namespace Particles }; // namespace SurgSim #endif // SURGSIM_PARTICLES_RANDOMSPHEREPOINTGENERATOR_H opensurgsim-0.7.0/SurgSim/Particles/RenderTests/000077500000000000000000000000001277777236100216755ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Particles/RenderTests/CMakeLists.txt000066400000000000000000000024051277777236100244360ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2012-2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. include_directories( ${gtest_SOURCE_DIR}/include ${OPENTHREADS_INCLUDE_DIR} ) set(UNIT_TEST_SOURCES RenderTest.cpp RenderTestSphRepresentation.cpp ) set(UNIT_TEST_HEADERS RenderTest.h ) configure_file( "${CMAKE_CURRENT_SOURCE_DIR}/config.txt.in" "${CMAKE_CURRENT_BINARY_DIR}/config.txt" ) set(LIBS SurgSimBlocks SurgSimGraphics SurgSimParticles ) surgsim_add_unit_tests(SurgSimParticlesRenderTest) set_target_properties(SurgSimParticlesRenderTest PROPERTIES FOLDER "Particles") # Configure the path for the data files configure_file( "${CMAKE_CURRENT_SOURCE_DIR}/config.txt.in" "${CMAKE_CURRENT_BINARY_DIR}/config.txt" ) opensurgsim-0.7.0/SurgSim/Particles/RenderTests/RenderTest.cpp000066400000000000000000000040441277777236100244620ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Graphics/OsgAxesRepresentation.h" #include "SurgSim/Particles/RenderTests/RenderTest.h" namespace SurgSim { namespace Particles { void RenderTests::SetUp() { runtime = std::make_shared("config.txt"); graphicsManager = std::make_shared(); runtime->addManager(graphicsManager); physicsManager = std::make_shared(); runtime->addManager(physicsManager); behaviorManager = std::make_shared(); runtime->addManager(behaviorManager); scene = runtime->getScene(); viewElement = std::make_shared("Physics Render Scene"); scene->addSceneElement(viewElement); } void RenderTests::TearDown() { runtime->stop(); } void RenderTests::runTest(const SurgSim::Math::Vector3d& cameraPosition, const SurgSim::Math::Vector3d& cameraLookAt, double miliseconds) { using SurgSim::Graphics::OsgAxesRepresentation; viewElement->enableManipulator(true); viewElement->setManipulatorParameters(cameraPosition, cameraLookAt); std::shared_ptr axes = std::make_shared("axes"); axes->setSize(1.0); viewElement->addComponent(axes); /// Run the thread runtime->start(); boost::this_thread::sleep(boost::posix_time::milliseconds(miliseconds)); } }; // namespace Particles }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Particles/RenderTests/RenderTest.h000066400000000000000000000034551277777236100241340ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PARTICLES_RENDERTESTS_RENDERTEST_H #define SURGSIM_PARTICLES_RENDERTESTS_RENDERTEST_H #include #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Framework/Scene.h" #include "SurgSim/Framework/BehaviorManager.h" #include "SurgSim/Graphics/OsgManager.h" #include "SurgSim/Graphics/OsgViewElement.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/PhysicsManager.h" namespace SurgSim { namespace Particles { struct RenderTests : public ::testing::Test { public: virtual void SetUp(); virtual void TearDown(); virtual void runTest(const SurgSim::Math::Vector3d& cameraPosition, const SurgSim::Math::Vector3d& cameraLookAt, double miliseconds); std::shared_ptr runtime; std::shared_ptr graphicsManager; std::shared_ptr physicsManager; std::shared_ptr behaviorManager; std::shared_ptr scene; std::shared_ptr viewElement; }; }; // namespace Particles }; // namespace SurgSim #endif //SURGSIM_PARTICLES_RENDERTESTS_RENDERTEST_H opensurgsim-0.7.0/SurgSim/Particles/RenderTests/RenderTestSphRepresentation.cpp000066400000000000000000000133341277777236100300620ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. ///\file RenderTestSphRepresentation.cpp render test for SphRepresentation #include #include "SurgSim/Blocks/TransferParticlesToPointCloudBehavior.h" #include "SurgSim/Collision/ShapeCollisionRepresentation.h" #include "SurgSim/Graphics/OsgMeshRepresentation.h" #include "SurgSim/Graphics/OsgPointCloudRepresentation.h" #include "SurgSim/Graphics/OsgSphereRepresentation.h" #include "SurgSim/Math/MeshShape.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/SphereShape.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Particles/Emitter.h" #include "SurgSim/Particles/ParticlesCollisionRepresentation.h" #include "SurgSim/Particles/RandomSpherePointGenerator.h" #include "SurgSim/Particles/RenderTests/RenderTest.h" #include "SurgSim/Particles/Sink.h" #include "SurgSim/Particles/SphRepresentation.h" namespace SurgSim { namespace Particles { std::shared_ptr createCube() { auto element = std::make_shared("cube"); auto mesh = std::make_shared(); mesh->load("Geometry/Cube.ply"); auto collision = std::make_shared("collision"); collision->setShape(mesh); element->addComponent(collision); auto graphics = std::make_shared("graphics"); graphics->setShape(mesh); graphics->setDrawAsWireFrame(true); element->addComponent(graphics); return element; } std::shared_ptr createSink(const std::shared_ptr& particles) { auto element = std::make_shared("cube sink"); auto mesh = std::make_shared(); mesh->load("Geometry/Cube.ply"); auto collision = std::make_shared("collision"); collision->setShape(mesh); element->addComponent(collision); auto graphics = std::make_shared("graphics"); graphics->setShape(mesh); graphics->setDrawAsWireFrame(true); element->addComponent(graphics); auto sink = std::make_shared("sink"); sink->setCollisionRepresentation(collision); sink->setTarget(particles->getComponent("physics")); element->addComponent(sink); return element; } std::shared_ptr createEmitter(const std::shared_ptr& particles) { auto element = std::make_shared("sphere emitter"); const double radius = 0.1; auto emitter = std::make_shared("emitter"); emitter->setTarget(particles->getComponent("physics")); emitter->setShape(std::make_shared(radius)); emitter->setMode(EMIT_MODE_SURFACE); emitter->setRate(2000.0); emitter->setLifetimeRange(std::make_pair(30000, 600000)); emitter->setVelocityRange(std::make_pair(Math::Vector3d::Zero(), Math::Vector3d::Zero())); element->addComponent(emitter); auto graphics = std::make_shared("graphics"); graphics->setRadius(radius); graphics->setDrawAsWireFrame(true); element->addComponent(graphics); return element; } std::shared_ptr createParticleSystem() { auto element = std::make_shared("particles"); // c.f. "Lagrangian Fluid Dynamics Using Smoothed Particle Hydrodynamics", Micky Kelager, January 9th 2006. // for input data to simulate water. auto particles = std::make_shared("physics"); particles->setMaxParticles(2000); particles->setMassPerParticle(0.02); particles->setDensity(998.29); particles->setGasStiffness(3.0); particles->setKernelSupport(0.0457); particles->setSurfaceTension(0.0728); particles->setViscosity(3.5); particles->setStiffness(1000.0); particles->setDamping(4.0); particles->setFriction(0.1); element->addComponent(particles); auto particleCollision = std::make_shared("collision"); particles->setCollisionRepresentation(particleCollision); element->addComponent(particleCollision); auto particleGraphics = std::make_shared("graphics"); particleGraphics->setColor(Math::Vector4d::Ones()); particleGraphics->setPointSize(3.0f); element->addComponent(particleGraphics); auto graphicsUpdater = std::make_shared("particles to graphics"); graphicsUpdater->setSource(particles); graphicsUpdater->setTarget(particleGraphics); element->addComponent(graphicsUpdater); return element; } TEST_F(RenderTests, SphRenderTest) { auto particles = createParticleSystem(); scene->addSceneElement(particles); auto cube = createCube(); cube->setPose(Math::makeRigidTranslation(Math::Vector3d(1.0, -1.5, 0.0))); scene->addSceneElement(cube); auto emitter = createEmitter(particles); emitter->setPose(Math::makeRigidTranslation(Math::Vector3d(0.0, 0.1, 0.0))); scene->addSceneElement(emitter); auto sink = createSink(particles); sink->setPose(Math::makeRigidTranslation(Math::Vector3d(-1.0, -1.5, 0.0))); scene->addSceneElement(sink); physicsManager->setRate(500.0); runTest(Math::Vector3d(0.0, 0.0, 8.5), Math::Vector3d::Zero(), 20000.0); } }; }; opensurgsim-0.7.0/SurgSim/Particles/RenderTests/config.txt.in000066400000000000000000000000551277777236100243100ustar00rootroot00000000000000${PROJECT_BINARY_DIR}/SurgSim/Testing/Data/ opensurgsim-0.7.0/SurgSim/Particles/Representation.cpp000066400000000000000000000102141277777236100231370ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Particles/Representation.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Particles/ParticlesCollisionRepresentation.h" namespace SurgSim { namespace Particles { Representation::Representation(const std::string& name) : SurgSim::Framework::Representation(name), m_maxParticles(0u), m_logger(SurgSim::Framework::Logger::getLogger("Particles")) { SURGSIM_ADD_SERIALIZABLE_PROPERTY(Representation, size_t, MaxParticles, getMaxParticles, setMaxParticles); } Representation::~Representation() { } bool Representation::doInitialize() { m_particles.publish(); return true; } void Representation::setMaxParticles(size_t maxParticles) { m_particles.unsafeGet().getVertices().reserve(maxParticles); m_maxParticles = maxParticles; } size_t Representation::getMaxParticles() const { return m_maxParticles; } SurgSim::DataStructures::BufferedValue& Representation::getParticles() { return m_particles; } bool Representation::addParticle(const Particle& particle) { bool result; auto& particles = m_particles.unsafeGet().getVertices(); if (particles.size() < m_maxParticles) { particles.push_back(particle); result = true; } else { SURGSIM_LOG_DEBUG(m_logger) << "Unable to add another particle, maximum has been reached (" << m_maxParticles << ")."; result = false; } return result; } bool Representation::addParticle(const Math::Vector3d& position, const Math::Vector3d& velocity, double lifetime) { ParticleData data = {lifetime, velocity}; return addParticle(Particle(position, data)); } void Representation::removeParticle(size_t index) { auto& particles = m_particles.unsafeGet().getVertices(); particles.at(index).data.lifetime = 0.0; } void Representation::update(double dt) { auto& particles = m_particles.unsafeGet().getVertices(); auto particle = particles.begin(); auto newEnd = particles.end(); while (particle != newEnd) { particle->data.lifetime -= dt; if (particle->data.lifetime <= 0.0) { --newEnd; std::swap(*particle, *newEnd); } else { ++particle; } } particles.erase(newEnd, particles.end()); if (!doUpdate(dt)) { SURGSIM_LOG_WARNING(m_logger) << "Particle System " << getName() << " failed to update."; } m_particles.publish(); } void Representation::handleCollisions(double dt) { auto collisionRepresentation = m_collisionRepresentation; if (collisionRepresentation != nullptr) { if (!doHandleCollisions(dt, collisionRepresentation->getCollisions().unsafeGet())) { SURGSIM_LOG_WARNING(m_logger) << "Particle System " << getName() << " failed to handle collisions."; } } } std::shared_ptr Representation::getCollisionRepresentation() const { return m_collisionRepresentation; } void Representation::setCollisionRepresentation(std::shared_ptr representation) { if (m_collisionRepresentation != representation) { auto oldCollisionRep = std::dynamic_pointer_cast(m_collisionRepresentation); if (oldCollisionRep != nullptr) { oldCollisionRep->setParticleRepresentation(nullptr); } m_collisionRepresentation = representation; auto newCollisionRep = std::dynamic_pointer_cast(representation); if (newCollisionRep != nullptr) { newCollisionRep->setParticleRepresentation( std::static_pointer_cast(getSharedPtr())); } } } }; // namespace Particles }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Particles/Representation.h000066400000000000000000000077761277777236100226270ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PARTICLES_REPRESENTATION_H #define SURGSIM_PARTICLES_REPRESENTATION_H #include #include #include "SurgSim/Collision/Representation.h" #include "SurgSim/Framework/Representation.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Particles/Particles.h" namespace SurgSim { namespace Framework { class Logger; }; namespace Particles { /// The Representation class defines the base class for all Particle System. class Representation : public SurgSim::Framework::Representation { public: /// Constructor /// \param name The representation's name explicit Representation(const std::string& name); /// Destructor virtual ~Representation(); /// Set the maximum number of particles of this system. /// \note Once initialized, it can't be changed. /// \param maxParticles The maximum number of particles in this system. void setMaxParticles(size_t maxParticles); /// \return The number of particles allowed in this system. size_t getMaxParticles() const; /// Add a particle /// \param particle The new particle /// \return True if the particle was successfully added, false otherwise bool addParticle(const Particle& particle); /// Add a particle /// \param position The position of the new particle /// \param velocity The velocity of the new particle /// \param lifetime The lenght of time the particle will exist /// \return True if the particle was successfully added, false otherwise bool addParticle(const Math::Vector3d& position, const Math::Vector3d& velocity, double lifetime); /// Remove a particle /// \note The particle will be removed during the next update /// \param index of the particle void removeParticle(size_t index); /// Get the particles /// \return The particles in a BufferedValue SurgSim::DataStructures::BufferedValue& getParticles(); /// Update the particle system /// \param dt The time step. void update(double dt); /// Handle collisions with particle system /// \param dt The time step. void handleCollisions(double dt); /// Set the collision representation for this Particle Representation /// \param representation The collision representation to be set void setCollisionRepresentation(std::shared_ptr representation); /// Get the collision representation for this Particle Representation /// \return the collision representation std::shared_ptr getCollisionRepresentation() const; protected: /// Implementation of the specific behavior of the particle system /// \return True if update succeeded, False otherwise. virtual bool doUpdate(double dt) = 0; /// Implementation of the specific collision handling of the particle system /// \return True if succeeded, False otherwise. virtual bool doHandleCollisions(double dt, const SurgSim::Collision::ContactMapType& collisions) = 0; bool doInitialize() override; /// Maximum amount of particles allowed in this particle system. size_t m_maxParticles; /// BufferedValue of particles. SurgSim::DataStructures::BufferedValue m_particles; /// Logger used by the particle system. std::shared_ptr m_logger; /// This entity's collision representation std::shared_ptr m_collisionRepresentation; }; }; // namespace Particles }; // namespace SurgSim #endif // SURGSIM_PARTICLES_REPRESENTATION_H opensurgsim-0.7.0/SurgSim/Particles/Sink.cpp000066400000000000000000000056441277777236100210540ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Particles/Sink.h" #include "SurgSim/Collision/CollisionPair.h" #include "SurgSim/Collision/Representation.h" #include "SurgSim/Framework/Component.h" #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Particles/Representation.h" namespace SurgSim { namespace Particles { SURGSIM_REGISTER(SurgSim::Framework::Component, SurgSim::Particles::Sink, Sink); Sink::Sink(const std::string& name) : Framework::Behavior(name), m_logger(Framework::Logger::getLogger("Particles")) { SURGSIM_ADD_SERIALIZABLE_PROPERTY(Sink, std::shared_ptr, Target, getTarget, setTarget); SURGSIM_ADD_SERIALIZABLE_PROPERTY(Sink, std::shared_ptr, CollisionRepresentation, getCollisionRepresentation, setCollisionRepresentation); } void Sink::setTarget(const std::shared_ptr& target) { m_target = Framework::checkAndConvert(target, "SurgSim::Particles::Representation"); } std::shared_ptr Sink::getTarget() { return m_target; } void Sink::setCollisionRepresentation(const std::shared_ptr& representation) { m_collisionRepresentation = Framework::checkAndConvert(representation, "SurgSim::Collision::Representation"); } std::shared_ptr Sink::getCollisionRepresentation() { return m_collisionRepresentation; } bool Sink::doInitialize() { return true; } bool Sink::doWakeUp() { if (m_collisionRepresentation == nullptr) { SURGSIM_LOG_SEVERE(m_logger) << "Sinks need a Collision Representation."; return false; } if (m_target == nullptr) { SURGSIM_LOG_SEVERE(m_logger) << "Sinks need a Particle Representation to remove from."; return false; } return true; } void Sink::update(double dt) { auto collisions = m_collisionRepresentation->getCollisions().safeGet(); auto found = collisions->find(m_target->getCollisionRepresentation()); if (found != collisions->end()) { for (auto& contact : found->second) { m_target->removeParticle(contact->penetrationPoints.second.index.getValue()); } } } int Sink::getTargetManagerType() const { return Framework::MANAGER_TYPE_PHYSICS; } }; }; opensurgsim-0.7.0/SurgSim/Particles/Sink.h000066400000000000000000000050101277777236100205040ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PARTICLES_SINK_H #define SURGSIM_PARTICLES_SINK_H #include #include "SurgSim/Framework/Behavior.h" #include "SurgSim/Framework/ObjectFactory.h" namespace SurgSim { namespace Collision { class Representation; }; namespace Framework { class Component; class Logger; }; namespace Particles { class Representation; SURGSIM_STATIC_REGISTRATION(Sink); /// Sink removes particles from a ParticleSystem class Sink : public SurgSim::Framework::Behavior { public: /// Constructor /// \param name The Sink's name explicit Sink(const std::string& name); SURGSIM_CLASSNAME(SurgSim::Particles::Sink); /// Set the target to remove particles from /// \param target The ParticleSystem to remove from. void setTarget(const std::shared_ptr& target); /// Get the target removing particles from /// \return The ParticleSystem to remove from. std::shared_ptr getTarget(); /// Set the collision representation for this Sink /// Particles that collide with this collision representation will be removed /// \param representation The collision representation void setCollisionRepresentation(const std::shared_ptr& representation); /// Get the collision representation for this Sink /// Particles that collide with this collision representation will be removed /// \return the collision representation for this Sink std::shared_ptr getCollisionRepresentation(); void update(double dt) override; int getTargetManagerType() const override; private: bool doInitialize() override; bool doWakeUp() override; std::shared_ptr m_collisionRepresentation; std::shared_ptr m_target; std::shared_ptr m_logger; }; }; }; #endif // SURGSIM_PARTICLES_SINK_H opensurgsim-0.7.0/SurgSim/Particles/SphRepresentation.cpp000066400000000000000000000263031277777236100236200ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Particles/SphRepresentation.h" #include "SurgSim/Collision/CollisionPair.h" #include "SurgSim/DataStructures/Grid.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Math/MathConvert.h" #include "SurgSim/Math/Vector.h" namespace SurgSim { namespace Particles { SURGSIM_REGISTER(SurgSim::Framework::Component, SurgSim::Particles::SphRepresentation, SphRepresentation); SphRepresentation::SphRepresentation(const std::string& name) : Representation(name), m_mass(0.0), m_densityReference(0.0), m_gasStiffness(0.0), m_surfaceTension(0.0), m_stiffness(0.0), m_damping(0.0), m_friction(0.0), m_gravity(Math::Vector3d(0.0, -9.81, 0.0)), m_viscosity(0.0), m_h(0.0) { SURGSIM_ADD_SERIALIZABLE_PROPERTY(SphRepresentation, double, MassPerParticle, getMassPerParticle, setMassPerParticle); SURGSIM_ADD_SERIALIZABLE_PROPERTY(SphRepresentation, double, Density, getDensity, setDensity); SURGSIM_ADD_SERIALIZABLE_PROPERTY(SphRepresentation, double, GasStiffness, getGasStiffness, setGasStiffness); SURGSIM_ADD_SERIALIZABLE_PROPERTY(SphRepresentation, double, SurfaceTension, getSurfaceTension, setSurfaceTension); SURGSIM_ADD_SERIALIZABLE_PROPERTY(SphRepresentation, double, Viscosity, getViscosity, setViscosity); SURGSIM_ADD_SERIALIZABLE_PROPERTY(SphRepresentation, double, Stiffness, getStiffness, setStiffness); SURGSIM_ADD_SERIALIZABLE_PROPERTY(SphRepresentation, double, Damping, getDamping, setDamping); SURGSIM_ADD_SERIALIZABLE_PROPERTY(SphRepresentation, double, Friction, getFriction, setFriction); SURGSIM_ADD_SERIALIZABLE_PROPERTY(SphRepresentation, double, KernelSupport, getKernelSupport, setKernelSupport); SURGSIM_ADD_SERIALIZABLE_PROPERTY(SphRepresentation, Math::Vector3d, Gravity, getGravity, setGravity); } SphRepresentation::~SphRepresentation() { } void SphRepresentation::setMassPerParticle(double particleMass) { SURGSIM_ASSERT(particleMass > 0.0) << "The mass per particle needs to be a valid positive non null value." << particleMass << " was provided."; m_mass = particleMass; } double SphRepresentation::getMassPerParticle() const { return m_mass; } void SphRepresentation::setDensity(double density) { SURGSIM_ASSERT(density > 0.0) << "The density needs to be a valid positive non null value." << density << " was provided."; m_densityReference = density; } double SphRepresentation::getDensity() const { return m_densityReference; } void SphRepresentation::setGasStiffness(double stiffness) { SURGSIM_ASSERT(stiffness > 0.0) << "The gas stiffness needs to be a valid positive non null value." << stiffness << " was provided."; m_gasStiffness = stiffness; } double SphRepresentation::getGasStiffness() const { return m_gasStiffness; } void SphRepresentation::setSurfaceTension(double surfaceTension) { SURGSIM_ASSERT(surfaceTension >= 0.0) << "The surface tension needs to be a valid positive or null value." << surfaceTension << " was provided."; m_surfaceTension = surfaceTension; } double SphRepresentation::getSurfaceTension() const { return m_surfaceTension; } void SphRepresentation::setGravity(const SurgSim::Math::Vector3d& gravity) { m_gravity = gravity; } SurgSim::Math::Vector3d SphRepresentation::getGravity() const { return m_gravity; } void SphRepresentation::setViscosity(double viscosity) { SURGSIM_ASSERT(viscosity >= 0.0) << "The viscosity needs to be a valid positive or null value." << viscosity << " was provided."; m_viscosity = viscosity; } double SphRepresentation::getViscosity() const { return m_viscosity; } void SphRepresentation::setKernelSupport(double support) { SURGSIM_ASSERT(support > 0.0) << "The kernel support needs to be a valid positive non-null value." << support << " was provided."; m_h = support; m_hSquared = m_h * m_h; m_kernelPoly6 = 315.0 / (64.0 * M_PI * std::pow(m_h, 9)); m_kernelPoly6Gradient = -945.0 / (32.0 * M_PI * std::pow(m_h, 9)); m_kernelSpikyGradient = -45.0 / (M_PI * std::pow(m_h, 6)); m_kernelViscosityLaplacian = 45.0 / (M_PI * std::pow(m_h, 5)); m_kernelPoly6Laplacian = 945.0 / (8.0 * M_PI * std::pow(m_h, 9)); } double SphRepresentation::getKernelSupport() const { return m_h; } void SphRepresentation::setStiffness(double stiffness) { m_stiffness = stiffness; } double SphRepresentation::getStiffness() const { return m_stiffness; } void SphRepresentation::setDamping(double damping) { m_damping = damping; } double SphRepresentation::getDamping() const { return m_damping; } void SphRepresentation::setFriction(double friction) { m_friction = friction; } double SphRepresentation::getFriction() const { return m_friction; } bool SphRepresentation::doInitialize() { if (!Representation::doInitialize()) { return false; } SURGSIM_ASSERT(m_mass > 0.0) << "The mass per particle needs to be set prior to adding the component in the SceneElement"; SURGSIM_ASSERT(m_densityReference > 0.0) << "The reference density needs to be set prior to adding the component in the SceneElement"; SURGSIM_ASSERT(m_gasStiffness > 0.0) << "The gas stiffness needs to be set prior to adding the component in the SceneElement"; SURGSIM_ASSERT(m_h > 0.0) << "The kernel support needs to be set prior to adding the component in the SceneElement"; m_normal.resize(m_maxParticles, 3); m_acceleration.resize(m_maxParticles, 3); m_density.resize(m_maxParticles); m_pressure.resize(m_maxParticles); // The 3d grid is composed of 2^10 cubic cells on each dimension of size m_h each. // This covers a volume of (m_h * 2^10)^3 cubic meter centered on the origin. Math::Vector3d aabbSize(1024 * m_h, 1024 * m_h, 1024 * m_h); Eigen::AlignedBox aabb; aabb.min() = -aabbSize / 2.0; aabb.max() = aabbSize / 2.0; Math::Vector3d cellSize = Math::Vector3d::Constant(m_h); m_grid = std::make_shared>(cellSize, aabb); return true; } bool SphRepresentation::doUpdate(double dt) { // Compute acceleration computeNeighbors(); computeDensityAndPressureField(); computeNormalField(); computeAccelerations(); // Integrate ODE to determine new velocity and position computeVelocityAndPosition(dt); return true; } void SphRepresentation::computeVelocityAndPosition(double dt) { auto& particles = m_particles.unsafeGet().getVertices(); for (size_t i = 0; i < particles.size(); i++) { particles[i].data.velocity += dt * m_acceleration.row(i); particles[i].position += dt * particles[i].data.velocity; } } void SphRepresentation::computeNeighbors() { m_grid->reset(); auto& particles = m_particles.unsafeGet().getVertices(); for (size_t i = 0; i < particles.size(); i++) { m_grid->addElement(i, particles[i].position); } } void SphRepresentation::computeDensityAndPressureField() { auto& particles = m_particles.unsafeGet().getVertices(); m_density.head(particles.size()).setZero(); for (size_t i = 0; i < particles.size(); i++) { for (auto j : m_grid->getNeighbors(i)) { const Math::Vector3d r = particles[i].position - particles[j].position; const double rSquaredNorm = r.squaredNorm(); if (rSquaredNorm < m_hSquared) { m_density[i] += (m_hSquared - rSquaredNorm) * (m_hSquared - rSquaredNorm) * (m_hSquared - rSquaredNorm); } } } m_density *= m_mass * m_kernelPoly6; m_pressure = m_gasStiffness * (m_density.array() - m_densityReference); } void SphRepresentation::computeNormalField() { auto& particles = m_particles.unsafeGet().getVertices(); m_normal.topRows(particles.size()).setZero(); for (size_t i = 0; i < particles.size(); i++) { for (auto j : m_grid->getNeighbors(i)) { const Math::Vector3d r = particles[i].position - particles[j].position; const double rSquaredNorm = r.squaredNorm(); if (rSquaredNorm < m_hSquared) { m_normal.row(i) += (m_hSquared - rSquaredNorm) * (m_hSquared - rSquaredNorm)/ m_density[j] * r; } } } m_normal *= m_kernelPoly6Gradient * m_mass; } void SphRepresentation::computeAccelerations() { auto& particles = m_particles.unsafeGet().getVertices(); m_acceleration.topRows(particles.size()).setZero(); for (size_t i = 0; i < particles.size(); i++) { for (auto j : m_grid->getNeighbors(i)) { // Consider symmetry here if (j <= i) { continue; } const Math::Vector3d r = particles[i].position - particles[j].position; const double rSquaredNorm = r.squaredNorm(); if (rSquaredNorm < m_hSquared) { // Pressure force const double rNorm = std::max(std::sqrt(rSquaredNorm), 0.0001); const Math::Vector3d gradient = r * m_kernelSpikyGradient * (m_h - rNorm) * (m_h -rNorm) / rNorm; Math::Vector3d f = (-(m_pressure[i] + m_pressure[j]) / (2.0 * m_density[i])) * gradient; // Viscosity force const Math::Vector3d v = particles[i].data.velocity - particles[j].data.velocity; const double laplacian = m_kernelViscosityLaplacian * (1.0 - rNorm / m_h); f += -(m_viscosity * v / m_density[j]) * laplacian; // Surface tension force const double normalNorm = m_normal.row(j).norm(); if (normalNorm > 20.0) { const Math::Vector3d unitNormal = m_normal.row(j) / normalNorm; double laplacianPoly6 = m_kernelPoly6Laplacian * (m_hSquared - rSquaredNorm); laplacianPoly6 *= (rSquaredNorm - 3.0 / 4.0 * (m_hSquared - rSquaredNorm)); f += -m_surfaceTension / m_density[j] * laplacianPoly6 * unitNormal; } // Action/reaction application on the pair of particles m_acceleration.row(i) += f; m_acceleration.row(j) -= f; } } } m_acceleration.array().colwise() *= m_mass / m_density.array(); const Math::Vector3d localGravity = getPose().linear().inverse() * m_gravity; m_acceleration.rowwise() += localGravity.transpose(); } bool SphRepresentation::doHandleCollisions(double dt, const SurgSim::Collision::ContactMapType& collisions) { const Math::RigidTransform3d inversePose = getPose().inverse(); auto& particles = m_particles.unsafeGet().getVertices(); for (auto& collision : collisions) { for (auto& contact : collision.second) { Math::Vector3d normal = inversePose.linear() * contact->normal; size_t index = contact->penetrationPoints.first.index.getValue(); auto& particle = particles[index]; double velocityAlongNormal = particle.data.velocity.dot(normal); double forceIntensity = m_stiffness * contact->depth - m_damping * velocityAlongNormal; Math::Vector3d tangentVelocity = particle.data.velocity - velocityAlongNormal * normal; Math::Vector3d forceDirection = normal - m_friction * tangentVelocity.normalized(); Math::Vector3d accelerationCorrection = (forceIntensity / m_mass) * forceDirection; particle.data.velocity += dt * accelerationCorrection; particle.position += dt * dt * accelerationCorrection; } } return true; } }; // namespace Particles }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Particles/SphRepresentation.h000066400000000000000000000171531277777236100232700ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PARTICLES_SPHREPRESENTATION_H #define SURGSIM_PARTICLES_SPHREPRESENTATION_H #include #include #include "SurgSim/Math/Vector.h" #include "SurgSim/Particles/Representation.h" namespace SurgSim { namespace DataStructures { template class Grid; }; // namespace DataStructures namespace Particles { SURGSIM_STATIC_REGISTRATION(SphRepresentation); /// SphRepresentation is a Representation dedicated to Smoothed-Particles Hydrodynamics (SPH). /// This class is mostly based on these papers: /// "Particle-Based Fluid Simulation for Interactive Applications", M. Muller, D. Charypar, M. Gross. /// In Proceedings of ACM SIGGRAPH Symposium on Computer Animation (SCA) 2003, pp 154-159. /// "Interactive Blood Simulation for Virtual Surgery Based on Smoothed Particle Hydrodynamics", M. Muller, /// S. Schirm, M. Teschner. Journal of Technology and Health Care, ISSN 0928-7329, IOS Press, Amsterdam. class SphRepresentation : public Representation { public: SURGSIM_CLASSNAME(SurgSim::Particles::SphRepresentation); /// Constructor /// \param name The representation's name explicit SphRepresentation(const std::string& name); /// Destructor virtual ~SphRepresentation(); /// Set the mass for each particle /// \param particleMass The mass that will be used for all particles [Kg] /// \throws An exception SurgSim::Framework::AssertionFailure if the value is negative or null /// \note In the SPH model, a particle has a constant mass, but its volume and density vary /// \note (mass = volume * density).
/// \note Example: If we want to simulate 1 liter of water (0.001 m3 at 1000kg.m-3) /// \note with 50 particles, we need each particle to have a mass of 1.0/50 = 0.02kg void setMassPerParticle(double particleMass); /// Get the mass for each particle /// \return The mass that is used for all particle [Kg] double getMassPerParticle() const; /// Set the density of the fluid /// \param density of the fluid [Kg.m-3] /// \throws An exception SurgSim::Framework::AssertionFailure if the value is negative or null void setDensity(double density); /// Get the density of the fluid /// \return The density of the fluid [Kg.m-3] double getDensity() const; /// Set the gas stiffness coefficient /// \param stiffness coefficient of the gas [N.m.Kg-1] /// \throws An exception SurgSim::Framework::AssertionFailure if the value is negative or null void setGasStiffness(double stiffness); /// Get the gas stiffness coefficient /// \return The stiffness coefficient of the gas [N.m.Kg-1] double getGasStiffness() const; /// Set the surface tension /// \param surfaceTension The surface tension [N.m-1] /// \throws An exception SurgSim::Framework::AssertionFailure if the value is negative void setSurfaceTension(double surfaceTension); /// Get the surface tension /// \return The surface tension [N.m-1] double getSurfaceTension() const; /// Set the gravity vector /// \param gravity The 3d gravity vector [m] void setGravity(const SurgSim::Math::Vector3d& gravity); /// Get the gravity vector (default is (0 -9.81 0)) /// \return The 3d gravity vector [m] SurgSim::Math::Vector3d getGravity() const; /// Set the viscosity coefficient /// \param viscosity coefficient [N.s.m-2] /// \throws An exception SurgSim::Framework::AssertionFailure if the value is negative void setViscosity(double viscosity); /// Get the viscosity coefficient (default is 0.0) /// \return The viscosity coefficient [N.s.m-2] double getViscosity() const; /// Set the kernel function support /// \param support The length of the kernel support [m] /// \throws An exception SurgSim::Framework::AssertionFailure if the value is negative or null void setKernelSupport(double support); /// Get the kernel function support /// \return The length of the kernel support [m] double getKernelSupport() const; /// Set the particles stiffness when colliding /// \param stiffness The stiffness [N/m] void setStiffness(double stiffness); /// Get the particles stiffness when colliding /// \return The stiffness [N/m] double getStiffness() const; /// Set the particles damping when colliding /// \param damping The damping [Ns/m] void setDamping(double damping); /// Get the particles damping when colliding /// \return The damping [Ns/m] double getDamping() const; /// Set the sliding coefficient of friction for the particles during collisions /// \param friction The sliding coefficient of friction void setFriction(double friction); /// Get the sliding coefficient of friction for the particles during collisions /// \return The sliding coefficient of friction double getFriction() const; protected: bool doInitialize() override; bool doUpdate(double dt) override; bool doHandleCollisions(double dt, const SurgSim::Collision::ContactMapType& collisions) override; /// Compute the particles' velocity and position given a time step dt /// \param dt The time step to advance the simulation too /// \note This method integrates the ODE equation of the SPH, computing velocities and positions from the /// \note accelerations and storing them in the state. Therefore computeAcceleration(dt) should be called before. void computeVelocityAndPosition(double dt); Eigen::Matrix m_normal; ///< Particles' normal Eigen::Matrix m_acceleration; ///< Particles' acceleration Math::Vector m_density; ///< Particles' density Math::Vector m_pressure; ///< Particles' pressure double m_mass; ///< Mass per particle (determine the density of particle per m3) double m_densityReference; ///< Density of the reference gas double m_gasStiffness; ///< Stiffness of the gas considered double m_surfaceTension; ///< Surface tension double m_stiffness; ///< Collision stiffness double m_damping; ///< Collision damping double m_friction; ///< Collision sliding friction coefficient SurgSim::Math::Vector3d m_gravity; ///< 3D Gravity vector double m_viscosity; ///< Viscosity coefficient /// Kernels parameter (support length and its powers) double m_h; double m_hSquared; double m_kernelPoly6; double m_kernelPoly6Gradient; double m_kernelSpikyGradient; double m_kernelViscosityLaplacian; double m_kernelPoly6Laplacian; /// Grid acceleration to evaluate the kernels locally (storing the particles' index) std::shared_ptr> m_grid; private: /// Compute the neighbors void computeNeighbors(); /// Compute the density and pressure field void computeDensityAndPressureField(); /// Compute the normal field void computeNormalField(); /// Compute the Sph accelerations void computeAccelerations(); }; }; // namespace Particles }; // namespace SurgSim #endif // SURGSIM_PARTICLES_SPHREPRESENTATION_H opensurgsim-0.7.0/SurgSim/Particles/UnitTests/000077500000000000000000000000001277777236100213755ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Particles/UnitTests/CMakeLists.txt000066400000000000000000000024051277777236100241360ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2012-2015, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. include_directories( ${gtest_SOURCE_DIR}/include ) set(UNIT_TEST_SOURCES EmitterTests.cpp MockObjects.cpp ParticlesCollisionRepresentationTests.cpp PointGeneratorTests.cpp RandomPointGeneratorTests.cpp RepresentationTests.cpp SinkTests.cpp SphRepresentationTests.cpp ) set(UNIT_TEST_HEADERS MockObjects.h ) configure_file( "${CMAKE_CURRENT_SOURCE_DIR}/config.txt.in" "${CMAKE_CURRENT_BINARY_DIR}/config.txt" ) set(LIBS SurgSimCollision SurgSimFramework SurgSimMath SurgSimParticles SurgSimPhysics ) surgsim_add_unit_tests(SurgSimParticlesTest) set_target_properties(SurgSimParticlesTest PROPERTIES FOLDER "Particles") opensurgsim-0.7.0/SurgSim/Particles/UnitTests/EmitterTests.cpp000066400000000000000000000270211277777236100245370ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include #include #include #include "SurgSim/Framework/BasicSceneElement.h" #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Framework/ObjectFactory.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Framework/Scene.h" #include "SurgSim/Math/MathConvert.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/SphereShape.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Particles/Emitter.h" #include "SurgSim/Particles/UnitTests/MockObjects.h" using SurgSim::Framework::Component; using SurgSim::Math::Shape; using SurgSim::Math::Vector3d; using SurgSim::Math::makeRigidTransform; namespace { SURGSIM_REGISTER(SurgSim::Framework::Component, MockParticleSystem, MockParticleSystem); } namespace SurgSim { namespace Particles { TEST(EmitterTest, Constructor) { std::shared_ptr emitter; ASSERT_NO_THROW(emitter = std::make_shared("Emitter")); EXPECT_EQ(EMIT_MODE_VOLUME, emitter->getMode()); EXPECT_EQ(0.0, emitter->getRate()); EXPECT_EQ(0.0, emitter->getLifetimeRange().first); EXPECT_EQ(0.0, emitter->getLifetimeRange().second); EXPECT_TRUE(emitter->getVelocityRange().first.isZero()); EXPECT_TRUE(emitter->getVelocityRange().second.isZero()); EXPECT_EQ(nullptr, emitter->getShape()); } TEST(EmitterTest, SetGetShape) { auto runtime = std::make_shared(); auto sphere = std::make_shared(0.1); auto particleSystem = std::make_shared("ParticleSystem"); { auto emitter = std::make_shared("Emitter"); emitter->setTarget(particleSystem); EXPECT_TRUE(emitter->initialize(runtime)); EXPECT_FALSE(emitter->wakeUp()) << "Without a shape, the emitter should not wakup"; } { auto emitter = std::make_shared("Emitter"); emitter->setTarget(particleSystem); emitter->setShape(sphere); EXPECT_EQ(sphere, emitter->getShape()); EXPECT_TRUE(emitter->initialize(runtime)); EXPECT_TRUE(emitter->wakeUp()) << "With a shape, the emitter should wakeup"; } } TEST(EmitterTest, SetGetTarget) { auto runtime = std::make_shared(); auto sphere = std::make_shared(0.1); auto particleSystem = std::make_shared("ParticleSystem"); { auto emitter = std::make_shared("Emitter"); auto notParticleSystem = std::make_shared("Not a ParticleSystem"); emitter->setShape(sphere); EXPECT_THROW(emitter->setTarget(notParticleSystem), SurgSim::Framework::AssertionFailure); EXPECT_TRUE(emitter->initialize(runtime)); EXPECT_FALSE(emitter->wakeUp()) << "Without a target, the emitter should not wakup"; } { auto emitter = std::make_shared("Emitter"); emitter->setShape(sphere); EXPECT_NO_THROW(emitter->setTarget(particleSystem)); EXPECT_EQ(particleSystem, emitter->getTarget()); EXPECT_TRUE(emitter->initialize(runtime)); EXPECT_TRUE(emitter->wakeUp()) << "With a target, the emitter should wakeup"; } } TEST(EmitterTest, SetGetMode) { auto emitter = std::make_shared("Emitter"); EXPECT_THROW(emitter->setMode(EMIT_MODE_COUNT), SurgSim::Framework::AssertionFailure); EXPECT_NO_THROW(emitter->setMode(EMIT_MODE_SURFACE)); EXPECT_EQ(EMIT_MODE_SURFACE, emitter->getMode()); } TEST(EmitterTest, GetSetRate) { auto emitter = std::make_shared("Emitter"); EXPECT_THROW(emitter->setRate(-10.0), SurgSim::Framework::AssertionFailure); EXPECT_NO_THROW(emitter->setRate(2.0)); EXPECT_EQ(2.0, emitter->getRate()); } TEST(EmitterTest, GetSetLifetimeRange) { auto emitter = std::make_shared("Emitter"); EXPECT_THROW(emitter->setLifetimeRange(std::make_pair(-1.0, 1.0)), SurgSim::Framework::AssertionFailure) << "Negative lifetimes should not be allowed"; EXPECT_THROW(emitter->setLifetimeRange(std::make_pair(10.0, 1.0)), SurgSim::Framework::AssertionFailure) << "Should not allow lower bound to be greater than upper bound"; EXPECT_NO_THROW(emitter->setLifetimeRange(std::make_pair(1.0, 10.0))); EXPECT_EQ(1.0, emitter->getLifetimeRange().first); EXPECT_EQ(10.0, emitter->getLifetimeRange().second); } TEST(EmitterTest, GetSetVelocityRange) { auto emitter = std::make_shared("Emitter"); EXPECT_THROW(emitter->setVelocityRange(std::make_pair(Vector3d::Constant(20.0), Vector3d::Ones())), SurgSim::Framework::AssertionFailure) << "Minimum velocity must be less than maximum"; EXPECT_NO_THROW(emitter->setVelocityRange(std::make_pair(Vector3d::Ones(), Vector3d::Constant(3.0)))); EXPECT_NO_THROW(emitter->setVelocityRange(std::make_pair(Vector3d::Constant(-2.0), Vector3d::Ones()))); EXPECT_TRUE(emitter->getVelocityRange().first.isApprox(Vector3d::Constant(-2.0))); EXPECT_TRUE(emitter->getVelocityRange().second.isApprox(Vector3d::Ones())); } TEST(EmitterTest, Update) { auto runtime = std::make_shared(); auto sphere = std::make_shared(0.1); auto particleSystem = std::make_shared("ParticleSystem"); particleSystem->setMaxParticles(10); particleSystem->initialize(runtime); auto emitter = std::make_shared("Emitter"); emitter->setShape(sphere); emitter->setTarget(particleSystem); emitter->setMode(EMIT_MODE_SURFACE); emitter->setRate(10.0); emitter->setLifetimeRange(std::make_pair(5.0, 10.0)); emitter->setVelocityRange(std::make_pair(Vector3d::Ones(), Vector3d::Constant(2.0))); emitter->initialize(runtime); ASSERT_TRUE(emitter->wakeUp()); ASSERT_TRUE(particleSystem->wakeUp()); emitter->update(0.1); EXPECT_EQ(1, particleSystem->getParticles().unsafeGet().getNumVertices()); emitter->update(0.05); EXPECT_EQ(1, particleSystem->getParticles().unsafeGet().getNumVertices()); emitter->update(0.05); EXPECT_EQ(2, particleSystem->getParticles().unsafeGet().getNumVertices()); emitter->update(0.9); EXPECT_EQ(10, particleSystem->getParticles().unsafeGet().getNumVertices()); emitter->update(0.2); EXPECT_EQ(10, particleSystem->getParticles().unsafeGet().getNumVertices()) << "Particles should not have been added, the particle system should have reached its maximum."; particleSystem->update(1.0); auto particles = particleSystem->getParticles().unsafeGet().getVertices(); ASSERT_EQ(10, particles.size()); for (auto particle : particles) { EXPECT_NEAR(sphere->getRadius(), particle.position.norm(), 1e-9); EXPECT_LT(4.0, particle.data.lifetime); EXPECT_GT(9.0, particle.data.lifetime); EXPECT_TRUE((Vector3d::Ones().array() <= particle.data.velocity.array()).all()); EXPECT_TRUE((Vector3d::Constant(2.0).array() >= particle.data.velocity.array()).all()); } } TEST(EmitterTest, PosedUpdate) { auto runtime = std::make_shared(); auto sphere = std::make_shared(0.1); auto particleSystem = std::make_shared("ParticleSystem"); particleSystem->setMaxParticles(10); auto emitter = std::make_shared("Emitter"); emitter->setShape(sphere); emitter->setTarget(particleSystem); emitter->setMode(EMIT_MODE_VOLUME); emitter->setRate(1.0); emitter->setLifetimeRange(std::make_pair(5.0, 10.0)); emitter->setVelocityRange(std::make_pair(Vector3d::Ones(), Vector3d::Constant(2.0))); auto element = std::make_shared("Element"); element->addComponent(particleSystem); element->addComponent(emitter); runtime->getScene()->addSceneElement(element); ASSERT_TRUE(emitter->wakeUp()); ASSERT_TRUE(particleSystem->wakeUp()); auto pose1 = makeRigidTransform(Eigen::AngleAxisd(0.25 * M_PI, Vector3d::UnitX()).matrix(), Vector3d(1.0, 2.0, 3.0)); auto pose2 = makeRigidTransform(Eigen::AngleAxisd(0.25 * M_PI, Vector3d::UnitZ()).matrix(), Vector3d(2.0, -2.0, 2.0)); emitter->update(1.0); EXPECT_TRUE(emitter->getPose().isApprox(Math::RigidTransform3d::Identity())); ASSERT_EQ(1, particleSystem->getParticles().unsafeGet().getNumVertices()); emitter->setLocalPose(pose1); emitter->update(1.0); EXPECT_TRUE(emitter->getPose().isApprox(pose1)); ASSERT_EQ(2, particleSystem->getParticles().unsafeGet().getNumVertices()); element->setPose(pose2); emitter->update(1.0); EXPECT_TRUE(emitter->getPose().isApprox(pose2 * pose1)); ASSERT_EQ(3, particleSystem->getParticles().unsafeGet().getNumVertices()); auto particles = particleSystem->getParticles().unsafeGet().getVertices(); EXPECT_GT(sphere->getRadius(), particles[0].position.norm()); EXPECT_GT(sphere->getRadius(), (pose1.inverse() * particles[1].position).norm()); EXPECT_GT(sphere->getRadius(), ((pose2 * pose1).inverse() * particles[2].position).norm()); } TEST(EmitterTest, Serialization) { auto emitter = std::make_shared("Emitter"); EXPECT_EQ("SurgSim::Particles::Emitter", emitter->getClassName()); const std::pair expectedLifetimeRange(1.0, 10.0); const int expectedMode = 1; const double expectedRate = 10.0; std::shared_ptr expectedShape = std::make_shared(0.1); std::shared_ptr expectedTarget = std::make_shared("ParticleSystem"); const std::pair expectedVelocityRange(Vector3d::Ones(), Vector3d::Constant(2.0)); Math::RigidTransform3d expectedPose = makeRigidTransform(Eigen::AngleAxisd(0.25 * M_PI, Vector3d::UnitX()).matrix(), Vector3d(1.0, 2.0, 3.0)); EXPECT_NO_THROW(emitter->setValue("LifetimeRange", expectedLifetimeRange)); EXPECT_NO_THROW(emitter->setValue("Mode", expectedMode)); EXPECT_NO_THROW(emitter->setValue("Rate", expectedRate)); EXPECT_NO_THROW(emitter->setValue("Shape", expectedShape)); EXPECT_NO_THROW(emitter->setValue("Target", expectedTarget)); EXPECT_NO_THROW(emitter->setValue("VelocityRange", expectedVelocityRange)); EXPECT_NO_THROW(emitter->setValue("LocalPose", expectedPose)); YAML::Node node; EXPECT_NO_THROW(node = YAML::convert::encode(*emitter)); EXPECT_TRUE(node.IsMap()); EXPECT_EQ(10, node[emitter->getClassName()].size()); std::shared_ptr decodedEmitter; ASSERT_NO_THROW(decodedEmitter = std::dynamic_pointer_cast( node.as>())); auto lifetimeRange = decodedEmitter->getValue>("LifetimeRange"); EXPECT_EQ(expectedLifetimeRange, lifetimeRange); EXPECT_EQ(expectedMode, decodedEmitter->getValue("Mode")); EXPECT_EQ(expectedRate, decodedEmitter->getValue("Rate")); EXPECT_EQ(expectedShape->getType(), decodedEmitter->getValue>("Shape")->getType()); EXPECT_EQ("ParticleSystem", decodedEmitter->getValue>("Target")->getName()); auto velocityRange = decodedEmitter->getValue>("VelocityRange"); EXPECT_TRUE(expectedVelocityRange.first.isApprox(velocityRange.first)); EXPECT_TRUE(expectedVelocityRange.second.isApprox(velocityRange.second)); EXPECT_TRUE(expectedPose.isApprox(decodedEmitter->getValue("LocalPose"))); } }; // namespace Particles }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Particles/UnitTests/MockObjects.cpp000066400000000000000000000023461277777236100243110ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Particles/UnitTests/MockObjects.h" MockParticleSystem::MockParticleSystem(const std::string& name) : SurgSim::Particles::Representation(name), updateCount(0) { } bool MockParticleSystem::doUpdate(double dt) { updateCount++; return true; } bool MockParticleSystem::doHandleCollisions(double dt, const SurgSim::Collision::ContactMapType& collisions) { return true; } MockEmitter::MockEmitter(const std::string& name) : SurgSim::Particles::Emitter(name), updateCount(0) { } void MockEmitter::update(double dt) { SurgSim::Particles::Emitter::update(dt); updateCount++; } opensurgsim-0.7.0/SurgSim/Particles/UnitTests/MockObjects.h000066400000000000000000000027221277777236100237540ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PARTICLES_UNITTESTS_MOCKOBJECTS_H #define SURGSIM_PARTICLES_UNITTESTS_MOCKOBJECTS_H #include "SurgSim/Framework/Behavior.h" #include "SurgSim/Framework/ObjectFactory.h" #include "SurgSim/Particles/Emitter.h" #include "SurgSim/Particles/Representation.h" class MockParticleSystem : public SurgSim::Particles::Representation { public: explicit MockParticleSystem(const std::string& name); SURGSIM_CLASSNAME(MockParticleSystem); int updateCount; private: bool doUpdate(double dt) override; bool doHandleCollisions(double dt, const SurgSim::Collision::ContactMapType& collisions) override; }; class MockEmitter : public SurgSim::Particles::Emitter { public: explicit MockEmitter(const std::string& name); void update(double dt) override; int updateCount; }; #endif //SURGSIM_PARTICLES_UNITTESTS_MOCKOBJECTS_H opensurgsim-0.7.0/SurgSim/Particles/UnitTests/ParticlesCollisionRepresentationTests.cpp000066400000000000000000000102421277777236100316500ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Math/ParticlesShape.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Particles/ParticlesCollisionRepresentation.h" #include "SurgSim/Particles/Representation.h" #include "SurgSim/Particles/UnitTests/MockObjects.h" namespace { const double epsilon = 1e-10; } namespace SurgSim { namespace Particles { struct ParticlesCollisionRepresentationTest : public ::testing::Test { void SetUp() { m_runtime = std::make_shared(); m_particleRepresentation = std::make_shared("ParticleRepresentation"); m_particleCollisionRepresentation = std::make_shared("ParticlesCollisionRepresentation"); } std::shared_ptr m_runtime; std::shared_ptr m_particleRepresentation; std::shared_ptr m_particleCollisionRepresentation; }; TEST_F(ParticlesCollisionRepresentationTest, InitTest) { EXPECT_NO_THROW(ParticlesCollisionRepresentation("TestParticlesCollisionRepresentation")); } TEST_F(ParticlesCollisionRepresentationTest, SetGetParticlesRepresentationTest) { EXPECT_THROW(m_particleCollisionRepresentation->getParticleRepresentation(), SurgSim::Framework::AssertionFailure); ASSERT_NO_THROW(m_particleCollisionRepresentation->setParticleRepresentation(m_particleRepresentation)); EXPECT_EQ(m_particleRepresentation, m_particleCollisionRepresentation->getParticleRepresentation()); } TEST_F(ParticlesCollisionRepresentationTest, SetGetParticleRadius) { ASSERT_NO_THROW(m_particleCollisionRepresentation->setParticleRadius(4.0)); EXPECT_EQ(4.0, m_particleCollisionRepresentation->getParticleRadius()); } TEST_F(ParticlesCollisionRepresentationTest, ShapeTypeTest) { EXPECT_EQ(SurgSim::Math::SHAPE_TYPE_PARTICLES, m_particleCollisionRepresentation->getShapeType()); } TEST_F(ParticlesCollisionRepresentationTest, SerializationTest) { YAML::Node node; ASSERT_NO_THROW(node = YAML::convert::encode(*m_particleCollisionRepresentation)); std::shared_ptr newParticlesCollisionRepresentation; ASSERT_NO_THROW(newParticlesCollisionRepresentation = std::dynamic_pointer_cast (node.as>())); } TEST_F(ParticlesCollisionRepresentationTest, UpdateAndInitializationTest) { m_particleRepresentation->setCollisionRepresentation(m_particleCollisionRepresentation); m_particleRepresentation->setMaxParticles(100); m_particleRepresentation->addParticle(Math::Vector3d::Zero(), Math::Vector3d::Zero(), 1.5); ASSERT_TRUE(m_particleRepresentation->initialize(m_runtime)); ASSERT_TRUE(m_particleRepresentation->wakeUp()); auto shape = std::dynamic_pointer_cast(m_particleCollisionRepresentation->getShape()); EXPECT_EQ(0u, shape->getNumVertices()); EXPECT_TRUE(m_particleCollisionRepresentation->initialize(m_runtime)); EXPECT_TRUE(m_particleCollisionRepresentation->wakeUp()); EXPECT_NO_THROW(m_particleRepresentation->update(1.0)); EXPECT_NO_THROW(m_particleCollisionRepresentation->updateShapeData()); EXPECT_EQ(1u, shape->getNumVertices()); EXPECT_NO_THROW(m_particleRepresentation->update(1.0)); EXPECT_NO_THROW(m_particleCollisionRepresentation->updateShapeData()); EXPECT_EQ(0u, shape->getNumVertices()); } }; }; opensurgsim-0.7.0/SurgSim/Particles/UnitTests/PointGeneratorTests.cpp000066400000000000000000000114531277777236100260700ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include "SurgSim/Math/Aabb.h" #include "SurgSim/Math/BoxShape.h" #include "SurgSim/Math/Geometry.h" #include "SurgSim/Math/MeshShape.h" #include "SurgSim/Math/SphereShape.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Particles/RandomBoxPointGenerator.h" #include "SurgSim/Particles/RandomMeshPointGenerator.h" #include "SurgSim/Particles/RandomSpherePointGenerator.h" using SurgSim::Math::BoxShape; using SurgSim::Math::Geometry::DistanceEpsilon; using SurgSim::Math::MeshShape; using SurgSim::Math::SphereShape; using SurgSim::Math::Vector3d; using SurgSim::Particles::RandomBoxPointGenerator; using SurgSim::Particles::RandomMeshPointGenerator; using SurgSim::Particles::RandomSpherePointGenerator; TEST(PointGeneratorTest, ConstructorTest) { ASSERT_NO_THROW(RandomBoxPointGenerator()); ASSERT_NO_THROW(RandomMeshPointGenerator()); ASSERT_NO_THROW(RandomSpherePointGenerator()); } TEST(PointGeneratorTest, BoxPointGeneratorTest) { auto boxShape = std::make_shared(2.0, 4.0, 6.0); auto aabb = SurgSim::Math::Aabbd(Vector3d(-1.0, -2.0, -3.0), Vector3d(1.0, 2.0, 3.0)); auto boxPointGenerator = std::make_shared(); auto pointInsideBox = boxPointGenerator->pointInShape(boxShape); bool isInOrOnBox = ((pointInsideBox - aabb.min()).array() > -SurgSim::Math::Geometry::ScalarEpsilon).all() && ((pointInsideBox - aabb.max()).array() < SurgSim::Math::Geometry::ScalarEpsilon).all(); EXPECT_TRUE(isInOrOnBox) << "Point should be in or on the box " << pointInsideBox; bool intersection = ((aabb.min() - pointInsideBox).array().abs() < SurgSim::Math::Geometry::ScalarEpsilon).any() || ((aabb.max() - pointInsideBox).array().abs() < SurgSim::Math::Geometry::ScalarEpsilon).any(); EXPECT_FALSE(intersection) << "Point should not be on surface of box " << pointInsideBox; auto pointOnBox = boxPointGenerator->pointOnShape(boxShape); isInOrOnBox = ((pointOnBox - aabb.min()).array() >= -SurgSim::Math::Geometry::ScalarEpsilon).all() && ((pointOnBox - aabb.max()).array() <= SurgSim::Math::Geometry::ScalarEpsilon).all(); EXPECT_TRUE(isInOrOnBox) << "Point should be in or on the box " << pointOnBox; bool intersection2 = ((aabb.min() - pointOnBox).array().abs() < SurgSim::Math::Geometry::ScalarEpsilon).any() || ((aabb.max() - pointOnBox).array().abs() < SurgSim::Math::Geometry::ScalarEpsilon).any(); EXPECT_TRUE(intersection2) << "Point should be on surface of box " << pointOnBox; } TEST(PointGeneratorTest, MeshPointGeneratorTest) { auto meshShape = std::make_shared(); std::array triangleIds; triangleIds[0] = meshShape->addVertex(MeshShape::VertexType(Vector3d(-1.0, 1.0, 1.0))); triangleIds[1] = meshShape->addVertex(MeshShape::VertexType(Vector3d(-1.0, 5.0, 1.0))); triangleIds[2] = meshShape->addVertex(MeshShape::VertexType(Vector3d(-1.0, 1.0, 5.0))); meshShape->addTriangle(MeshShape::TriangleType(triangleIds)); triangleIds[0] = meshShape->addVertex(MeshShape::VertexType(Vector3d(1.0, 1.0, 1.0))); triangleIds[1] = meshShape->addVertex(MeshShape::VertexType(Vector3d(1.0, 5.0, 1.0))); triangleIds[2] = meshShape->addVertex(MeshShape::VertexType(Vector3d(1.0, 1.0, 5.0))); size_t triangleId = meshShape->addTriangle(MeshShape::TriangleType(triangleIds)); meshShape->getTriangle(triangleId).isValid = false; auto meshPointGenerator = std::make_shared(); auto pointOnMesh = meshPointGenerator->pointOnShape(meshShape); EXPECT_NEAR(-1.0, pointOnMesh[0], DistanceEpsilon) << "Point is not on a triangle, or was generated with an invalid triangle."; EXPECT_LE(1.0, pointOnMesh[1]); EXPECT_LE(1.0, pointOnMesh[2]); EXPECT_GE(6.0, pointOnMesh[1] + pointOnMesh[2]); } TEST(PointGeneratorTest, SpherePointGeneratorTest) { auto sphereShape = std::make_shared(2.0); auto spherePointGenerator = std::make_shared(); auto pointInsideSphere = spherePointGenerator->pointInShape(sphereShape); EXPECT_LT(pointInsideSphere.norm(), sphereShape->getRadius()); auto pointOnSphere = spherePointGenerator->pointOnShape(sphereShape); EXPECT_NEAR(sphereShape->getRadius(), pointOnSphere.norm(), DistanceEpsilon); } opensurgsim-0.7.0/SurgSim/Particles/UnitTests/RandomPointGeneratorTests.cpp000066400000000000000000000033661277777236100272350ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include "SurgSim/Math/BoxShape.h" #include "SurgSim/Math/MeshShape.h" #include "SurgSim/Math/SphereShape.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Particles/RandomPointGenerator.h" using SurgSim::Math::BoxShape; using SurgSim::Math::MeshShape; using SurgSim::Math::Shape; using SurgSim::Math::SphereShape; using SurgSim::Math::Vector3d; using SurgSim::Particles::RandomPointGenerator; TEST(RandomPointGeneratorTest, ConstructorTest) { ASSERT_NO_THROW(RandomPointGenerator()); } TEST(RandomPointGeneratorTest, GenerationTest) { auto pointGenerator = std::make_shared(); auto boxShape = std::make_shared(1.0, 2.0, 3.0); EXPECT_NO_THROW(pointGenerator->pointInShape(boxShape)); auto sphereShape = std::make_shared(6.0); EXPECT_NO_THROW(pointGenerator->pointOnShape(sphereShape)); auto meshShape = std::make_shared(); EXPECT_NO_THROW(pointGenerator->pointOnShape(meshShape)); std::shared_ptr shape; EXPECT_THROW(pointGenerator->pointOnShape(shape), SurgSim::Framework::AssertionFailure); } opensurgsim-0.7.0/SurgSim/Particles/UnitTests/RepresentationTests.cpp000066400000000000000000000132511277777236100261300ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Math/SphereShape.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Particles/Emitter.h" #include "SurgSim/Particles/Representation.h" #include "SurgSim/Particles/UnitTests/MockObjects.h" using SurgSim::Math::Vector3d; namespace SurgSim { namespace Particles { TEST(RepresentationTest, ConstructorTest) { ASSERT_NO_THROW(MockParticleSystem representation("representation")); MockParticleSystem representation("representation"); EXPECT_EQ(0u, representation.getMaxParticles()); } TEST(RepresentationTest, SetGetMaxParticles) { auto representation = std::make_shared("representation"); auto runtime = std::make_shared(); EXPECT_NO_THROW(representation->setMaxParticles(1)); EXPECT_EQ(1u, representation->getMaxParticles()); } TEST(RepresentationTest, AddParticle) { auto representation = std::make_shared("representation"); auto runtime = std::make_shared(); representation->setMaxParticles(1); representation->initialize(runtime); ASSERT_TRUE(representation->addParticle(Vector3d::Ones(), Vector3d::Constant(3.0), 10)); ASSERT_EQ(1, representation->getParticles().unsafeGet().getNumVertices()); auto& particle = representation->getParticles().unsafeGet().getVertices()[0]; EXPECT_TRUE(particle.position.isApprox(Vector3d::Ones())); EXPECT_TRUE(particle.data.velocity.isApprox(Vector3d::Constant(3.0))); EXPECT_NEAR(10.0, particle.data.lifetime, 1e-9); } TEST(RepresentationTest, RemoveParticle) { auto representation = std::make_shared("representation"); auto runtime = std::make_shared(); representation->setMaxParticles(2); representation->initialize(runtime); ASSERT_TRUE(representation->addParticle(Vector3d::Ones(), Vector3d::Constant(3.0), 10)); ASSERT_TRUE(representation->addParticle(Vector3d(2.0, 3.0, 4.0), Vector3d::Zero(), 10)); ASSERT_EQ(2, representation->getParticles().unsafeGet().getNumVertices()); representation->update(1.0); ASSERT_EQ(2, representation->getParticles().safeGet()->getNumVertices()); representation->removeParticle(0); representation->update(1.0); auto& particleVertices = representation->getParticles().safeGet()->getVertices(); ASSERT_EQ(1, particleVertices.size()); EXPECT_TRUE(particleVertices[0].position.isApprox(Vector3d(2.0, 3.0, 4.0))); EXPECT_TRUE(particleVertices[0].data.velocity.isApprox(Vector3d::Zero())); representation->removeParticle(0); representation->update(1.0); ASSERT_EQ(0, representation->getParticles().safeGet()->getNumVertices()); } TEST(RepresentationTest, GetParticles) { auto representation = std::make_shared("representation"); representation->setMaxParticles(100); Vector3d expectedPosition = Vector3d(1.0, 2.0, 3.0); Vector3d expectedVelocity = Vector3d(-4.0, 5.0, -6.0); double expectedLifetime = 12.34; representation->addParticle(expectedPosition, expectedVelocity, expectedLifetime); ASSERT_EQ(1, representation->getParticles().unsafeGet().getNumVertices()); auto& particles = representation->getParticles().unsafeGet().getVertices(); EXPECT_TRUE(expectedPosition.isApprox(particles[0].position)); EXPECT_TRUE(expectedVelocity.isApprox(particles[0].data.velocity)); EXPECT_NEAR(expectedLifetime, particles[0].data.lifetime, 1e-9); } TEST(RepresentationTest, MaxParticles) { auto representation = std::make_shared("representation"); representation->setMaxParticles(1); EXPECT_TRUE(representation->addParticle(Vector3d::Constant(1.0), Vector3d::Zero(), 10)); EXPECT_FALSE(representation->addParticle(Vector3d::Constant(2.0), Vector3d::Zero(), 10)); } TEST(RepresentationTest, Aging) { auto representation = std::make_shared("representation"); auto runtime = std::make_shared(); representation->setMaxParticles(100); representation->initialize(runtime); representation->addParticle(Vector3d(1.0, 1.0, 1.0), Vector3d(0.0, 0.0, 0.0), 1); representation->addParticle(Vector3d(2.0, 2.0, 2.0), Vector3d(0.0, 0.0, 0.0), 2); representation->addParticle(Vector3d(3.0, 3.0, 3.0), Vector3d(0.0, 0.0, 0.0), 3); EXPECT_EQ(3, representation->getParticles().unsafeGet().getNumVertices()); representation->update(1.0); EXPECT_EQ(2, representation->getParticles().unsafeGet().getNumVertices()); EXPECT_EQ(2, representation->getParticles().safeGet()->getNumVertices()); representation->update(1.0); EXPECT_EQ(1, representation->getParticles().unsafeGet().getNumVertices()); EXPECT_EQ(1, representation->getParticles().safeGet()->getNumVertices()); representation->update(1.0); EXPECT_EQ(0, representation->getParticles().unsafeGet().getNumVertices()); EXPECT_EQ(0, representation->getParticles().safeGet()->getNumVertices()); representation->update(1.0); EXPECT_EQ(0, representation->getParticles().unsafeGet().getNumVertices()); EXPECT_EQ(0, representation->getParticles().safeGet()->getNumVertices()); } }; // namespace Particles }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Particles/UnitTests/SinkTests.cpp000066400000000000000000000141161277777236100240330ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2015-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Collision/ShapeCollisionRepresentation.h" #include "SurgSim/Framework/BasicSceneElement.h" #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Framework/ObjectFactory.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Framework/Scene.h" #include "SurgSim/Math/MeshShape.h" #include "SurgSim/Particles/ParticlesCollisionRepresentation.h" #include "SurgSim/Particles/Sink.h" #include "SurgSim/Particles/UnitTests/MockObjects.h" #include "SurgSim/Physics/PhysicsManager.h" namespace { SURGSIM_REGISTER(SurgSim::Framework::Component, MockParticleSystem, MockParticleSystem); } namespace SurgSim { namespace Particles { TEST(SinkTest, Constructor) { std::shared_ptr sink; ASSERT_NO_THROW(sink = std::make_shared("Sink")); EXPECT_EQ(Framework::MANAGER_TYPE_PHYSICS, sink->getTargetManagerType()); EXPECT_EQ(nullptr, sink->getTarget()); EXPECT_EQ(nullptr, sink->getCollisionRepresentation()); } TEST(SinkTest, SetGetCollisionRepresentation) { auto runtime = std::make_shared(); auto collision = std::make_shared("Collision"); auto notCollision = std::make_shared("Not a CollisionRepresentation"); auto particleSystem = std::make_shared("ParticleSystem"); { auto sink = std::make_shared("Sink"); sink->setTarget(particleSystem); EXPECT_THROW(sink->setCollisionRepresentation(notCollision), SurgSim::Framework::AssertionFailure); EXPECT_TRUE(sink->initialize(runtime)); EXPECT_FALSE(sink->wakeUp()) << "Without a CollisionRepresentation, the sink should not wakup"; } { auto sink = std::make_shared("Sink"); sink->setTarget(particleSystem); EXPECT_NO_THROW(sink->setCollisionRepresentation(collision)); EXPECT_EQ(collision, sink->getCollisionRepresentation()); EXPECT_TRUE(sink->initialize(runtime)); EXPECT_TRUE(sink->wakeUp()) << "With a CollisionRepresentation, the sink should wakeup"; } } TEST(SinkTest, SetGetTarget) { auto runtime = std::make_shared(); auto collision = std::make_shared("Collision"); auto particleSystem = std::make_shared("ParticleSystem"); auto notParticleSystem = std::make_shared("Not a ParticleSystem"); { auto sink = std::make_shared("Sink"); sink->setCollisionRepresentation(collision); EXPECT_THROW(sink->setTarget(notParticleSystem), SurgSim::Framework::AssertionFailure); EXPECT_TRUE(sink->initialize(runtime)); EXPECT_FALSE(sink->wakeUp()) << "Without a target, the sink should not wakup"; } { auto sink = std::make_shared("Sink"); sink->setCollisionRepresentation(collision); EXPECT_NO_THROW(sink->setTarget(particleSystem)); EXPECT_EQ(particleSystem, sink->getTarget()); EXPECT_TRUE(sink->initialize(runtime)); EXPECT_TRUE(sink->wakeUp()) << "With a target, the sink should wakeup"; } } TEST(SinkTest, Update) { auto runtime = std::make_shared("config.txt"); runtime->addManager(std::make_shared()); auto element = std::make_shared("Element"); auto particleCollision = std::make_shared("Particle Collision"); particleCollision->setParticleRadius(0.01); element->addComponent(particleCollision); auto particleSystem = std::make_shared("ParticleSystem"); particleSystem->setMaxParticles(10); particleSystem->setCollisionRepresentation(particleCollision); element->addComponent(particleSystem); auto mesh = std::make_shared(); mesh->load("Geometry/Cube.ply"); auto sinkCollision = std::make_shared("Sink Collision"); sinkCollision->setShape(mesh); element->addComponent(sinkCollision); auto sink = std::make_shared("Sink"); sink->setTarget(particleSystem); sink->setCollisionRepresentation(sinkCollision); element->addComponent(sink); particleSystem->addParticle(Math::Vector3d(0.0, 1.009, 0.0), Math::Vector3d::Zero(), 10); runtime->getScene()->addSceneElement(element); EXPECT_EQ(1, particleSystem->getParticles().safeGet()->getNumVertices()); runtime->start(true); runtime->step(); runtime->step(); boost::this_thread::sleep(boost::posix_time::milliseconds(50)); runtime->stop(); EXPECT_EQ(0, particleSystem->getParticles().safeGet()->getNumVertices()); } TEST(SinkTest, Serialization) { auto sink = std::make_shared("Sink"); EXPECT_EQ("SurgSim::Particles::Sink", sink->getClassName()); std::shared_ptr expectedTarget = std::make_shared("ParticleSystem"); std::shared_ptr expectedCollision = std::make_shared("Collision"); EXPECT_NO_THROW(sink->setValue("CollisionRepresentation", expectedCollision)); EXPECT_NO_THROW(sink->setValue("Target", expectedTarget)); YAML::Node node; EXPECT_NO_THROW(node = YAML::convert::encode(*sink)); EXPECT_TRUE(node.IsMap()); std::shared_ptr decodedSink; ASSERT_NO_THROW(decodedSink = std::dynamic_pointer_cast(node.as>())); EXPECT_EQ("ParticleSystem", decodedSink->getValue>("Target")->getName()); EXPECT_EQ("Collision", decodedSink->getValue>("CollisionRepresentation")->getName()); } }; // namespace Particles }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Particles/UnitTests/SphRepresentationTests.cpp000066400000000000000000000311661277777236100266100ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Particles/SphRepresentation.h" using SurgSim::Math::Vector3d; namespace SurgSim { namespace Particles { TEST(SphRepresentationTest, ConstructorTest) { ASSERT_NO_THROW(std::make_shared("representation")); } TEST(SphRepresentationTest, SetGetTest) { auto sph = std::make_shared("representation"); EXPECT_DOUBLE_EQ(0.0, sph->getMassPerParticle()); EXPECT_THROW(sph->setMassPerParticle(0.0), SurgSim::Framework::AssertionFailure); EXPECT_THROW(sph->setMassPerParticle(-1.0), SurgSim::Framework::AssertionFailure); sph->setMassPerParticle(0.02); EXPECT_DOUBLE_EQ(0.02, sph->getMassPerParticle()); EXPECT_DOUBLE_EQ(0.0, sph->getDensity()); EXPECT_THROW(sph->setDensity(0.0), SurgSim::Framework::AssertionFailure); EXPECT_THROW(sph->setDensity(-1.0), SurgSim::Framework::AssertionFailure); sph->setDensity(0.03); EXPECT_DOUBLE_EQ(0.03, sph->getDensity()); EXPECT_DOUBLE_EQ(0.0, sph->getGasStiffness()); EXPECT_THROW(sph->setGasStiffness(0.0), SurgSim::Framework::AssertionFailure); EXPECT_THROW(sph->setGasStiffness(-1.0), SurgSim::Framework::AssertionFailure); sph->setGasStiffness(0.04); EXPECT_DOUBLE_EQ(0.04, sph->getGasStiffness()); EXPECT_DOUBLE_EQ(0.0, sph->getSurfaceTension()); EXPECT_NO_THROW(sph->setSurfaceTension(0.0)); EXPECT_THROW(sph->setSurfaceTension(-1.0), SurgSim::Framework::AssertionFailure); sph->setSurfaceTension(0.04); EXPECT_DOUBLE_EQ(0.04, sph->getSurfaceTension()); EXPECT_TRUE(sph->getGravity().isApprox(SurgSim::Math::Vector3d(0.0, -9.81, 0.0))); sph->setGravity(SurgSim::Math::Vector3d::Ones() * 0.56); EXPECT_TRUE(sph->getGravity().isApprox(SurgSim::Math::Vector3d::Ones() * 0.56)); EXPECT_DOUBLE_EQ(0.0, sph->getViscosity()); EXPECT_NO_THROW(sph->setViscosity(0.0)); EXPECT_THROW(sph->setViscosity(-1.0), SurgSim::Framework::AssertionFailure); sph->setViscosity(0.04); EXPECT_DOUBLE_EQ(0.04, sph->getViscosity()); EXPECT_DOUBLE_EQ(0.0, sph->getStiffness()); EXPECT_NO_THROW(sph->setStiffness(0.0)); sph->setStiffness(0.04); EXPECT_DOUBLE_EQ(0.04, sph->getStiffness()); EXPECT_DOUBLE_EQ(0.0, sph->getDamping()); EXPECT_NO_THROW(sph->setDamping(0.0)); sph->setDamping(0.04); EXPECT_DOUBLE_EQ(0.04, sph->getDamping()); EXPECT_DOUBLE_EQ(0.0, sph->getFriction()); EXPECT_NO_THROW(sph->setFriction(0.0)); sph->setFriction(0.04); EXPECT_DOUBLE_EQ(0.04, sph->getFriction()); EXPECT_DOUBLE_EQ(0.0, sph->getKernelSupport()); EXPECT_THROW(sph->setKernelSupport(0.0), SurgSim::Framework::AssertionFailure); EXPECT_THROW(sph->setKernelSupport(-1.0), SurgSim::Framework::AssertionFailure); sph->setKernelSupport(0.04); EXPECT_DOUBLE_EQ(0.04, sph->getKernelSupport()); } TEST(SphRepresentationTest, DoInitializeTest) { { SCOPED_TRACE("Bad Mass Per Particle"); auto runtime = std::make_shared(); auto sph = std::make_shared("representation"); EXPECT_THROW(sph->initialize(runtime), SurgSim::Framework::AssertionFailure); } { SCOPED_TRACE("Bad density reference"); auto runtime = std::make_shared(); auto sph = std::make_shared("representation"); sph->setMassPerParticle(0.02); EXPECT_THROW(sph->initialize(runtime), SurgSim::Framework::AssertionFailure); } { SCOPED_TRACE("Bad gas stiffness"); auto runtime = std::make_shared(); auto sph = std::make_shared("representation"); sph->setMassPerParticle(0.02); sph->setDensity(0.02); EXPECT_THROW(sph->initialize(runtime), SurgSim::Framework::AssertionFailure); } { SCOPED_TRACE("Bad kernel support"); auto runtime = std::make_shared(); auto sph = std::make_shared("representation"); sph->setMassPerParticle(0.02); sph->setDensity(0.02); sph->setGasStiffness(0.02); EXPECT_THROW(sph->initialize(runtime), SurgSim::Framework::AssertionFailure); } { SCOPED_TRACE("All set"); auto runtime = std::make_shared(); auto sph = std::make_shared("representation"); sph->setMassPerParticle(0.02); sph->setDensity(0.02); sph->setGasStiffness(0.02); sph->setKernelSupport(0.02); EXPECT_NO_THROW(sph->initialize(runtime)); } } TEST(SphRepresentationTest, DoUpdate1ParticleTest) { auto runtime = std::make_shared(); auto sph = std::make_shared("representation"); double dt = 1e-3; // 1ms sph->setMaxParticles(1); sph->setMassPerParticle(0.02); sph->setDensity(1000.0); sph->setGasStiffness(3.0); sph->setKernelSupport(0.01); sph->setViscosity(0.01); sph->setSurfaceTension(0.0); sph->initialize(runtime); sph->addParticle(Math::Vector3d::Zero(), Math::Vector3d::Zero(), 10); EXPECT_EQ(1u, sph->getParticles().unsafeGet().getNumVertices()); EXPECT_NO_THROW(sph->update(dt)); auto particles = sph->getParticles().safeGet()->getVertices(); EXPECT_EQ(1u, particles.size()); EXPECT_DOUBLE_EQ(0.0, particles[0].position[0]); EXPECT_GT(0.0, particles[0].position[1]); EXPECT_DOUBLE_EQ(0.0, particles[0].position[2]); EXPECT_DOUBLE_EQ(0.0, particles[0].data.velocity[0]); EXPECT_GT(0.0, particles[0].data.velocity[1]); EXPECT_DOUBLE_EQ(0.0, particles[0].data.velocity[2]); } namespace { /// Set up a Unit Test where 2 particles interact with a radius R (h/2) of null interaction /// If they are closer than R, they repel each other /// If they are at distance R from each other, they are in equilibrium /// If they are further than R, the attract each other std::shared_ptr set2ParticlesInteracting(double h, double distance) { auto runtime = std::make_shared(); auto sph = std::make_shared("representation"); double dt = 1e-3; // 1ms sph->setMaxParticles(2); sph->setMassPerParticle(0.02); // 50 particles for 0.001 m3 at 1000Kg.m-3 // If you note R the radius of 1 particle, then (50 * 4/3.PI.R^3) = 0.001 => R = 0.01683890300960629672761734255721m sph->setDensity(1000.0); sph->setGasStiffness(3.0); sph->setKernelSupport(h); sph->setViscosity(0.01); sph->setSurfaceTension(0.0); sph->initialize(runtime); sph->addParticle(Math::Vector3d::Zero(), Math::Vector3d::Zero(), 10); sph->addParticle(Math::Vector3d(distance, 0.0, 0.0), Math::Vector3d::Zero(), 10); EXPECT_EQ(2u, sph->getParticles().unsafeGet().getNumVertices()); EXPECT_NO_THROW(sph->update(dt)); EXPECT_EQ(2u, sph->getParticles().unsafeGet().getNumVertices()); size_t index = 0; for (auto particle : sph->getParticles().unsafeGet().getVertices()) { std::string scope = "Particle "+boost::to_string(index); SCOPED_TRACE(scope); EXPECT_LT(particle.position[1], 0.0); EXPECT_DOUBLE_EQ(0.0, particle.position[2]); EXPECT_GT(0.0, particle.data.velocity[1]); EXPECT_DOUBLE_EQ(0.0, particle.data.velocity[2]); index++; } return sph; } }; // namespace anonymous TEST(SphRepresentationTest, DoUpdate2ParticlesNotInteractingTest) { // If you note R the radius of 1 particle, then a volume of 1l covered by 50 particles requires: // (50 * 4/3.PI.R^3) = 0.001 => R = 0.01683890300960629672761734255721m // Let's take a smooth kernel support of 2R, anything above that distance is not interacting double h = 2.0 * 0.01683890300960629672761734255721; double distance = 10.0 * h; // Far from their radius of influence auto sph = set2ParticlesInteracting(h, distance); auto& particles = sph->getParticles().unsafeGet().getVertices(); EXPECT_DOUBLE_EQ(particles[0].position[1], particles[1].position[1]); EXPECT_DOUBLE_EQ(particles[0].data.velocity[1], particles[1].data.velocity[1]); double finalDistance = (particles[0].position - particles[1].position).norm(); EXPECT_DOUBLE_EQ(distance, finalDistance); } TEST(SphRepresentationTest, DoUpdate2ParticlesAttractingTest) { // If you note R the radius of 1 particle, then a volume of 1l covered by 50 particles requires: // (50 * 4/3.PI.R^3) = 0.001 => R = 0.01683890300960629672761734255721m // Let's take a smooth kernel support of 2R, anything above that distance is not interacting double h = 2.0 * 0.01683890300960629672761734255721; double distance = h * 3.0 / 4.0; auto sph = set2ParticlesInteracting(h, distance); auto& particles = sph->getParticles().unsafeGet().getVertices(); EXPECT_DOUBLE_EQ(particles[0].position[1], particles[1].position[1]); EXPECT_DOUBLE_EQ(particles[0].data.velocity[1], particles[1].data.velocity[1]); double finalDistance = (particles[0].position - particles[1].position).norm(); EXPECT_GT(distance, finalDistance); } TEST(SphRepresentationTest, DoUpdate2ParticlesRetractingTest) { // If you note R the radius of 1 particle, then a volume of 1l covered by 50 particles requires: // (50 * 4/3.PI.R^3) = 0.001 => R = 0.01683890300960629672761734255721m // Let's take a smooth kernel support of 2R, anything above that distance is not interacting double h = 2.0 * 0.01683890300960629672761734255721; double distance = h * 1.0 / 4.0; auto sph = set2ParticlesInteracting(h, distance); auto& particles = sph->getParticles().unsafeGet().getVertices(); EXPECT_DOUBLE_EQ(particles[0].position[1], particles[1].position[1]); EXPECT_DOUBLE_EQ(particles[0].data.velocity[1], particles[1].data.velocity[1]); double finalDistance = (particles[0].position - particles[1].position).norm(); EXPECT_LT(distance, finalDistance); } TEST(SphRepresentationTest, DoUpdate2ParticlesInEquilibriumTest) { // If you note R the radius of 1 particle, then a volume of 1l covered by 50 particles requires: // (50 * 4/3.PI.R^3) = 0.001 => R = 0.01683890300960629672761734255721m // Let's take a smooth kernel support of 2R, anything above that distance is not interacting double h = 2.0 * 0.01683890300960629672761734255721; double distance = h / 2.0; auto sph = set2ParticlesInteracting(h, distance); auto& particles = sph->getParticles().unsafeGet().getVertices(); EXPECT_DOUBLE_EQ(particles[0].position[1], particles[1].position[1]); EXPECT_DOUBLE_EQ(particles[0].data.velocity[1], particles[1].data.velocity[1]); double finalDistance = (particles[0].position - particles[1].position).norm(); EXPECT_NEAR(distance, finalDistance, pow(h, 2)); } TEST(SphRepresentationTest, SerializationTest) { auto sph = std::make_shared("TestSphRepresentation"); sph->setDensity(1.1); sph->setGasStiffness(2.2); sph->setGravity(SurgSim::Math::Vector3d::Ones()); sph->setKernelSupport(3.3); sph->setMassPerParticle(4.4); sph->setMaxParticles(5); sph->setSurfaceTension(10.1); sph->setViscosity(11.11); sph->setStiffness(12.12); sph->setDamping(13.13); sph->setFriction(0.14); YAML::Node node; ASSERT_NO_THROW(node = YAML::convert::encode(*sph)); std::shared_ptr newRepresentation; EXPECT_NO_THROW(newRepresentation = std::dynamic_pointer_cast(node.as>())); EXPECT_DOUBLE_EQ(sph->getDensity(), newRepresentation->getValue("Density")); EXPECT_DOUBLE_EQ(sph->getGasStiffness(), newRepresentation->getValue("GasStiffness")); EXPECT_TRUE(sph->getGravity().isApprox(newRepresentation->getValue("Gravity"))); EXPECT_DOUBLE_EQ(sph->getKernelSupport(), newRepresentation->getValue("KernelSupport")); EXPECT_DOUBLE_EQ(sph->getMassPerParticle(), newRepresentation->getValue("MassPerParticle")); EXPECT_EQ(sph->getMaxParticles(), newRepresentation->getValue("MaxParticles")); EXPECT_DOUBLE_EQ(sph->getSurfaceTension(), newRepresentation->getValue("SurfaceTension")); EXPECT_DOUBLE_EQ(sph->getViscosity(), newRepresentation->getValue("Viscosity")); EXPECT_DOUBLE_EQ(sph->getStiffness(), newRepresentation->getValue("Stiffness")); EXPECT_DOUBLE_EQ(sph->getDamping(), newRepresentation->getValue("Damping")); EXPECT_DOUBLE_EQ(sph->getFriction(), newRepresentation->getValue("Friction")); } }; // namespace Particles }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Particles/UnitTests/config.txt.in000066400000000000000000000000551277777236100240100ustar00rootroot00000000000000${PROJECT_BINARY_DIR}/SurgSim/Testing/Data/ opensurgsim-0.7.0/SurgSim/Physics/000077500000000000000000000000001277777236100171275ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Physics/BuildMlcp.cpp000066400000000000000000000106301277777236100215060ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include using Eigen::MatrixXd; using Eigen::VectorXd; #include "SurgSim/Physics/BuildMlcp.h" #include "SurgSim/Physics/Constraint.h" #include "SurgSim/Physics/ConstraintImplementation.h" #include "SurgSim/Physics/Localization.h" #include "SurgSim/Physics/MlcpPhysicsProblem.h" #include "SurgSim/Physics/PhysicsManagerState.h" #include "SurgSim/Physics/Representation.h" namespace SurgSim { namespace Physics { BuildMlcp::BuildMlcp(bool doCopyState) : Computation(doCopyState) {} BuildMlcp::~BuildMlcp() {} std::shared_ptr BuildMlcp::doUpdate(const double& dt, const std::shared_ptr& state) { // Copy state to new state std::shared_ptr result = state; MlcpMapping representationsMapping; MlcpMapping constraintsMapping; size_t numAtomicConstraint = 0; size_t numDof = 0; // Calculate numAtomicConstraint auto const activeConstraints = result->getActiveConstraints(); for (auto it = activeConstraints.cbegin(); it != activeConstraints.cend(); it++) { constraintsMapping.setValue((*it).get(), static_cast(numAtomicConstraint)); numAtomicConstraint += (*it)->getNumDof(); } result->setConstraintsMapping(constraintsMapping); // Calculate numDof size const auto& activeRepresentations = result->getActiveRepresentations(); for (auto it = activeRepresentations.cbegin(); it != activeRepresentations.cend(); it++) { representationsMapping.setValue((*it).get(), numDof); numDof += (*it)->getNumDof(); } result->setRepresentationsMapping(representationsMapping); // Resize the Mlcp problem result->getMlcpProblem().A.setZero(numAtomicConstraint, numAtomicConstraint); result->getMlcpProblem().b.setZero(numAtomicConstraint); result->getMlcpProblem().H.resize(numAtomicConstraint, numDof); result->getMlcpProblem().CHt.setZero(numDof, numAtomicConstraint); result->getMlcpProblem().mu.setZero(numAtomicConstraint); result->getMlcpProblem().constraintTypes.clear(); // Resize the Mlcp solution result->getMlcpSolution().dofCorrection.setZero(numDof); result->getMlcpSolution().x.setZero(numAtomicConstraint); // Fill up the Mlcp problem for (auto it = activeConstraints.begin(); it != activeConstraints.end(); it++) { ptrdiff_t indexConstraint = result->getConstraintsMapping().getValue((*it).get()); SURGSIM_ASSERT(indexConstraint >= 0) << "Index for constraint is invalid: " << indexConstraint << std::endl; std::shared_ptr side0 = (*it)->getImplementations().first; std::shared_ptr side1 = (*it)->getImplementations().second; SURGSIM_ASSERT(side0) << "Constraint does not have a side0" << std::endl; SURGSIM_ASSERT(side1) << "Constraint does not have a side1" << std::endl; std::shared_ptr localization0 = (*it)->getLocalizations().first; std::shared_ptr localization1 = (*it)->getLocalizations().second; SURGSIM_ASSERT(localization0) << "ConstraintImplementation does not have a localization on side0"; SURGSIM_ASSERT(localization1) << "ConstraintImplementation does not have a localization on side1"; const MlcpMapping& mapping = result->getRepresentationsMapping(); ptrdiff_t indexRepresentation0 = mapping.getValue(localization0->getRepresentation().get()); ptrdiff_t indexRepresentation1 = mapping.getValue(localization1->getRepresentation().get()); SURGSIM_ASSERT(indexRepresentation0 >= 0) << "Index for representation 0 is invalid: " << indexRepresentation0; SURGSIM_ASSERT(indexRepresentation1 >= 0) << "Index for representation 1 is invalid: " << indexRepresentation1; (*it)->build(dt, &result->getMlcpProblem(), indexRepresentation0, indexRepresentation1, indexConstraint); } return result; } }; // namespace Physics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/BuildMlcp.h000066400000000000000000000027441277777236100211620ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_BUILDMLCP_H #define SURGSIM_PHYSICS_BUILDMLCP_H #include "SurgSim/Framework/Macros.h" #include "SurgSim/Physics/Computation.h" namespace SurgSim { namespace Physics { /// Build an mlcp from a list of constraints stored in a PhysicsManagerState class BuildMlcp : public Computation { public: /// Constructor /// \param doCopyState Specify if the output state in Computation::Update() is a copy or not of the input state explicit BuildMlcp(bool doCopyState = false); SURGSIM_CLASSNAME(SurgSim::Physics::BuildMlcp); /// Destructor virtual ~BuildMlcp(); protected: /// Override doUpdate from superclass std::shared_ptr doUpdate(const double& dt, const std::shared_ptr& state) override; }; }; // namespace Physics }; // namespace SurgSim #endif // SURGSIM_PHYSICS_BUILDMLCP_H opensurgsim-0.7.0/SurgSim/Physics/CMakeLists.txt000066400000000000000000000124751277777236100217000ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2012-2016, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. set(SURGSIM_PHYSICS_SOURCES BuildMlcp.cpp CcdCollision.cpp CcdCollisionLoop.cpp Computation.cpp ComputationGroup.cpp Constraint.cpp ConstraintComponent.cpp ConstraintData.cpp ConstraintImplementation.cpp ConstraintImplementationFactory.cpp ContactConstraintGeneration.cpp ContactFiltering.cpp DcdCollision.cpp DeformableCollisionRepresentation.cpp DeformableRepresentation.cpp Fem1D.cpp Fem1DElementBeam.cpp Fem1DLocalization.cpp Fem1DPlyReaderDelegate.cpp Fem1DRepresentation.cpp Fem2D.cpp Fem2DElementTriangle.cpp Fem2DLocalization.cpp Fem2DPlyReaderDelegate.cpp Fem2DRepresentation.cpp Fem3D.cpp Fem3DElementCorotationalTetrahedron.cpp Fem3DElementCube.cpp Fem3DElementTetrahedron.cpp Fem3DLocalization.cpp Fem3DPlyReaderDelegate.cpp Fem3DRepresentation.cpp FemConstraintFixedPoint.cpp FemConstraintFixedRotationVector.cpp FemConstraintFrictionalSliding.cpp FemConstraintFrictionlessContact.cpp FemConstraintFrictionlessSliding.cpp FemElement.cpp FemLocalization.cpp FemPlyReaderDelegate.cpp FemRepresentation.cpp FixedConstraintFixedPoint.cpp FixedConstraintFixedRotationVector.cpp FixedConstraintFrictionlessContact.cpp FixedRepresentation.cpp FreeMotion.cpp LinearSpring.cpp Localization.cpp MassSpringConstraintFixedPoint.cpp MassSpringConstraintFrictionlessContact.cpp MassSpringLocalization.cpp MassSpringRepresentation.cpp MlcpPhysicsProblem.cpp ParticleCollisionResponse.cpp PhysicsConvert.cpp PhysicsManager.cpp PhysicsManagerState.cpp PostUpdate.cpp PrepareCollisionPairs.cpp PreUpdate.cpp PushResults.cpp Representation.cpp RigidCollisionRepresentation.cpp RigidConstraintFixedPoint.cpp RigidConstraintFixedRotationVector.cpp RigidConstraintFrictionlessContact.cpp RigidLocalization.cpp RigidRepresentation.cpp RigidRepresentationBase.cpp RigidState.cpp RotationVectorConstraint.cpp SlidingConstraint.cpp SlidingConstraintData.cpp SolveMlcp.cpp Spring.cpp UpdateCcdData.cpp UpdateCollisionData.cpp UpdateCollisionRepresentations.cpp UpdateDcdData.cpp VirtualToolCoupler.cpp ) set(SURGSIM_PHYSICS_HEADERS BuildMlcp.h CcdCollision.h CcdCollisionLoop.h Computation.h ComputationGroup.h Constraint.h ConstraintComponent.h ConstraintData.h ConstraintImplementation.h ConstraintImplementationFactory.h ConstraintType.h ContactConstraintData.h ContactConstraintGeneration.h ContactFiltering.h DcdCollision.h DeformableCollisionRepresentation.h DeformableRepresentation.h Fem.h Fem-inl.h Fem1D.h Fem1DElementBeam.h Fem1DLocalization.h Fem1DPlyReaderDelegate.h Fem1DRepresentation.h Fem2D.h Fem2DElementTriangle.h Fem2DLocalization.h Fem2DPlyReaderDelegate.h Fem2DRepresentation.h Fem3D.h Fem3DElementCorotationalTetrahedron.h Fem3DElementCube.h Fem3DElementTetrahedron.h Fem3DLocalization.h Fem3DPlyReaderDelegate.h Fem3DRepresentation.h FemConstraintFixedPoint.h FemConstraintFixedRotationVector.h FemConstraintFrictionalSliding.h FemConstraintFrictionlessContact.h FemConstraintFrictionlessSliding.h FemElement.h FemElement-inl.h FemElementStructs.h FemLocalization.h FemPlyReaderDelegate.h FemRepresentation.h FixedConstraintFixedPoint.h FixedConstraintFixedRotationVector.h FixedConstraintFrictionlessContact.h FixedRepresentation.h FreeMotion.h LinearSpring.h Localization.h Mass.h MassSpringConstraintFixedPoint.h MassSpringConstraintFrictionlessContact.h MassSpringLocalization.h MassSpringRepresentation.h MlcpMapping.h MlcpPhysicsProblem.h MlcpPhysicsSolution.h ParticleCollisionResponse.h PhysicsConvert.h PhysicsManager.h PhysicsManagerState.h PostUpdate.h PrepareCollisionPairs.h PreUpdate.h PushResults.h Representation.h RigidCollisionRepresentation.h RigidConstraintFixedPoint.h RigidConstraintFixedRotationVector.h RigidConstraintFrictionlessContact.h RigidLocalization.h RigidRepresentation.h RigidRepresentationBase.h RigidRepresentationBase-inl.h RigidState.h RotationVectorConstraint.h RotationVectorConstraintData.h SlidingConstraint.h SlidingConstraintData.h SolveMlcp.h Spring.h UpdateCcdData.h UpdateCollisionData.h UpdateCollisionRepresentations.h UpdateDcdData.h VirtualToolCoupler.h ) surgsim_create_library_header(Physics.h "${SURGSIM_PHYSICS_HEADERS}") surgsim_add_library( SurgSimPhysics "${SURGSIM_PHYSICS_SOURCES}" "${SURGSIM_PHYSICS_HEADERS}" ) SET(LIBS SurgSimCollision SurgSimDataStructures SurgSimFramework SurgSimInput SurgSimMath SurgSimParticles ) target_link_libraries(SurgSimPhysics ${LIBS}) if(BUILD_TESTING) add_subdirectory(UnitTests) if(BUILD_RENDER_TESTING) add_subdirectory(RenderTests) endif() if(BUILD_PERFORMANCE_TESTING) add_subdirectory(PerformanceTests) endif() endif() set_target_properties(SurgSimPhysics PROPERTIES FOLDER "Physics") opensurgsim-0.7.0/SurgSim/Physics/CcdCollision.cpp000066400000000000000000000040401277777236100221760ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Collision/CollisionPair.h" #include "SurgSim/Collision/ContactCalculation.h" #include "SurgSim/Collision/CcdDcdCollision.h" #include "SurgSim/Collision/Representation.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Framework/ThreadPool.h" #include "SurgSim/Physics/CcdCollision.h" #include "SurgSim/Physics/PhysicsManagerState.h" using SurgSim::Collision::CollisionPair; using SurgSim::Collision::ContactCalculation; namespace SurgSim { namespace Physics { CcdCollision::CcdCollision(bool doCopyState) : Computation(doCopyState) { } CcdCollision::~CcdCollision() { } std::shared_ptr CcdCollision::doUpdate( const double& dt, const std::shared_ptr& state) { std::shared_ptr result = state; auto threadPool = Framework::Runtime::getThreadPool(); std::vector> tasks; const auto& calculations = ContactCalculation::getCcdContactTable(); for (auto& pair : result->getCollisionPairs()) { if (pair->getType() == Collision::COLLISION_DETECTION_TYPE_CONTINUOUS) { tasks.push_back(threadPool->enqueue([&]() { calculations[pair->getFirst()->getShapeType()] [pair->getSecond()->getShapeType()]->calculateContact(pair); })); } } std::for_each(tasks.begin(), tasks.end(), [](std::future& p){p.get();}); return result; } }; // Physics }; // SurgSim opensurgsim-0.7.0/SurgSim/Physics/CcdCollision.h000066400000000000000000000044061277777236100216510ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_CCDCOLLISION_H #define SURGSIM_PHYSICS_CCDCOLLISION_H #include #include "SurgSim/Math/Shape.h" #include "SurgSim/Physics/Computation.h" namespace SurgSim { namespace Collision { class ContactCalculation; } namespace Physics { class PhysicsManagerState; /// Computation to determine the contacts between a list of CollisionPairs. /// This Computation class takes a list of representations, it will generate a list of collision pairs /// from this list on every frame, for each CollisionPair, it uses a two dimensional table of /// function objects (ContactCalculation) to determine how to calculate a contact between the two /// members of each pair, if no specific function exists a default function will be used. /// will update the collision pairs accordingly. /// \note When a new ContactCalculation type gets implemented, the type needs to be registered with the table /// inside of ContactCalculation class CcdCollision : public Computation { public: /// Constructor /// \param doCopyState Specify if the output state in Computation::Update() is a copy or not of the input state explicit CcdCollision(bool doCopyState = false); SURGSIM_CLASSNAME(SurgSim::Physics::CcdCollision); /// Destructor virtual ~CcdCollision(); protected: /// Executes the update operation, overridden from Computation. /// \param dt The time passed. /// \param state The PhysicsManagerState from previous computation. std::shared_ptr doUpdate(const double& dt, const std::shared_ptr& state) override; }; }; // Physics }; // SurgSim #endif // SURGSIM_PHYSICS_CCDCOLLISION_H opensurgsim-0.7.0/SurgSim/Physics/CcdCollisionLoop.cpp000066400000000000000000000155051277777236100230400ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Collision/CollisionPair.h" #include "SurgSim/Physics/BuildMlcp.h" #include "SurgSim/Physics/CcdCollision.h" #include "SurgSim/Physics/CcdCollisionLoop.h" #include "SurgSim/Physics/ContactConstraintGeneration.h" #include "SurgSim/Physics/ContactFiltering.h" #include "SurgSim/Physics/PhysicsManagerState.h" #include "SurgSim/Physics/PushResults.h" #include "SurgSim/Physics/SolveMlcp.h" #include "SurgSim/Physics/UpdateCcdData.h" #include #include namespace SurgSim { namespace Physics { CcdCollisionLoop::CcdCollisionLoop(bool copyState) : Computation(copyState), m_ccdCollision(new CcdCollision(copyState)), m_updateCcdData(new UpdateCcdData(copyState)), m_contactFilter(new ContactFiltering(copyState)), m_constraintGeneration(new ContactConstraintGeneration(copyState)), m_buildMlcp(new BuildMlcp(copyState)), m_solveMlcp(new SolveMlcp(copyState)), m_pushResults(new PushResults(copyState)), m_maxIterations(20), m_epsilonFactor(100), m_logger(SurgSim::Framework::Logger::getLogger("Physics/CCDCollisionLoop")) { } CcdCollisionLoop::~CcdCollisionLoop() { } std::shared_ptr CcdCollisionLoop::doUpdate(const double& dt, const std::shared_ptr& state) { auto ccdState = state; auto& collisionPairs = state->getCollisionPairs(); std::vector> ccdPairs; ccdPairs.reserve(collisionPairs.size()); std::copy_if(collisionPairs.cbegin(), collisionPairs.cend(), std::back_inserter(ccdPairs), [](const std::shared_ptr& p) { return p->getType() == Collision::COLLISION_DETECTION_TYPE_CONTINUOUS; }); double timeOfImpact = 0.0; double localTimeOfImpact = 0.0; std::vector>> oldContacts; bool executedOnce = false; size_t iterations = 0; for (; iterations < m_maxIterations; ++iterations) { double epsilon = 1.0 / ((1 - timeOfImpact) * m_epsilonFactor); ccdState = m_updateCcdData->update(localTimeOfImpact, ccdState); ccdState = m_ccdCollision->update(dt, ccdState); ccdState = m_contactFilter->update(dt, ccdState); if (m_logger->getThreshold() <= SurgSim::Framework::LOG_LEVEL_DEBUG) { printContacts(ccdPairs); } // Find the first impact and filter all contacts beyond a given epsilon if (!findEarliestContact(ccdPairs, &localTimeOfImpact)) { break; } filterLaterContacts(&ccdPairs, epsilon, localTimeOfImpact); restoreContacts(&ccdPairs, &oldContacts); ccdState = m_constraintGeneration->update(dt, ccdState); ccdState = m_buildMlcp->update(dt, ccdState); ccdState = m_solveMlcp->update(dt, ccdState); ccdState = m_pushResults->update(dt, ccdState); executedOnce = true; backupContacts(&ccdPairs, &oldContacts); timeOfImpact += (1.0 - timeOfImpact) * localTimeOfImpact; if (timeOfImpact > 1.0) { SURGSIM_LOG_SEVERE(m_logger) << "Calculated time of impact is greater " << "than the parametric upper bound of 1.0 (" << timeOfImpact << ")" << std::endl; break; } // Lambda == 0 means we are no longer generating corrections. Exit the loop. // We will take up the collision detection at the start of the next time step. if (ccdState->getMlcpSolution().x.isZero()) { break; } } SURGSIM_LOG_IF(iterations == m_maxIterations, m_logger, WARNING) << "Maxed out iterations (" << m_maxIterations << ")"; restoreContacts(&ccdPairs, &oldContacts); if (!executedOnce) { ccdState = m_constraintGeneration->update(dt, ccdState); ccdState = m_buildMlcp->update(dt, ccdState); ccdState = m_solveMlcp->update(dt, ccdState); ccdState = m_pushResults->update(dt, ccdState); } return ccdState; } bool CcdCollisionLoop::findEarliestContact( const std::vector>& ccdPairs, double* currentTimeOfImpact) { SURGSIM_ASSERT(currentTimeOfImpact != nullptr) << "Please provide a valid currentTimeOfImpact variable"; double timeOfImpact = std::numeric_limits::max(); // Find earliest time of impact for (auto& pair : ccdPairs) { std::for_each(pair->getContacts().begin(), pair->getContacts().end(), [&timeOfImpact](const std::shared_ptr& contact) { timeOfImpact = std::min(timeOfImpact, contact->time); }); } // Did not find any contacts return false if (!(timeOfImpact < std::numeric_limits::max())) { return false; } *currentTimeOfImpact = timeOfImpact; return true; } void CcdCollisionLoop::filterLaterContacts( std::vector>* ccdPairs, double epsilon, double timeOfImpact) { for (auto& pair : (*ccdPairs)) { pair->getContacts().remove_if([timeOfImpact, epsilon](const std::shared_ptr& contact) { return contact->time > timeOfImpact + epsilon; }); } } void CcdCollisionLoop::backupContacts(std::vector>* ccdPairs, std::vector>>* oldContacts) { SURGSIM_ASSERT(oldContacts != nullptr) << "Invalid container found."; for (auto& pair : (*ccdPairs)) { oldContacts->push_back(std::move(pair->getContacts())); pair->getContacts().clear(); } } void CcdCollisionLoop::restoreContacts(std::vector>* ccdPairs, std::vector>>* oldContacts) { SURGSIM_ASSERT(oldContacts != nullptr) << "Invalid container found."; if (oldContacts->size() == 0) { return; } SURGSIM_ASSERT(oldContacts->size() == ccdPairs->size()) << "Contact size exception detected"; for (size_t i = 0; i < oldContacts->size(); ++i) { auto& newContacts = ccdPairs->at(i)->getContacts(); newContacts.splice(newContacts.end(), std::move(oldContacts->at(i))); } oldContacts->clear(); } void CcdCollisionLoop::printContacts(const std::vector>& ccdPairs) { std::stringstream out; size_t contactCount = 0; for (const auto& pair : ccdPairs) { for (const auto& contact : pair->getContacts()) { out << *contact; contactCount++; } } SURGSIM_LOG_IF(contactCount != 0, m_logger, DEBUG) << "Number of Contacts: " << contactCount << std::endl << out.str(); } } } opensurgsim-0.7.0/SurgSim/Physics/CcdCollisionLoop.h000066400000000000000000000102461277777236100225020ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_CCDCOLLISIONLOOP_H #define SURGSIM_PHYSICS_CCDCOLLISIONLOOP_H #include "SurgSim/Physics/ComputationGroup.h" namespace SurgSim { namespace Framework { class Logger; } namespace Collision { class CollisionPair; struct Contact; } namespace Physics { class CcdCollision; class ContactFiltering; class UpdateCcdData; class ContactConstraintGeneration; class BuildMlcp; class SolveMlcp; class PushResults; class PhysicsManager; class CcdCollisionLoop : public Computation { public: /// Constructor explicit CcdCollisionLoop(bool copyState); /// Destructor ~CcdCollisionLoop(); SURGSIM_CLASSNAME(SurgSim::Physics::CcdCollisionLoop); std::shared_ptr doUpdate(const double& dt, const std::shared_ptr& state) override; ///@{ /// Test access friend class CcdCollisionLoopTest_FilterContacts_Test; friend class CcdCollisionLoopTest_FilterContactsWithEpsilon_Test; ///@} private: ///@{ /// Computations std::unique_ptr m_ccdCollision; std::unique_ptr m_updateCcdData; std::unique_ptr m_contactFilter; std::unique_ptr m_constraintGeneration; std::unique_ptr m_buildMlcp; std::unique_ptr m_solveMlcp; std::unique_ptr m_pushResults; ///@} size_t m_maxIterations; ///< maximum number of iterations to run /// epsilon as a fraction of dt, i.e. if this is 100, the epsilon will be dt/100 /// during the iteration epsilon will be scaled to remain dt/100 as it pertains to the ever shrinking interval /// that is the iterations intervall double m_epsilonFactor; /// Takes all the contacts from ccdPairs, finds the first contact wrt contact time /// \param ccdPairs the list of pairs that should be checked for contacts /// \param [out] currentTimeOfImpact the earliest contact time found in ccdPairs /// \return true if there were any contacts found in ccdPairs bool findEarliestContact(const std::vector>& ccdPairs, double* currentTimeOfImpact); /// Removes all contacts with contact time greater than the first contact time + epsilon /// \param ccdPairs the list of pairs that should be checked for contacts /// \param epsilon the epsilon to be added to the first contactTime for filtering /// \param contactTime times outside of epsilon from contactTime will be reomved from consideration void filterLaterContacts(std::vector>* ccdPairs, double epsilon, double contactTime); /// Backs up all current contacts into oldContacts and then clears the ccdPairs /// \param ccdPairs the list of current contact pairs /// \param oldContacts the backup of the contacts void backupContacts(std::vector>* ccdPairs, std::vector>>* oldContacts); /// Adds all of the backed up contacts back into the current contacts. Contacts already in 'ccdPairs' /// will be kept.. /// \param ccdPairs the list of current contact pairs /// \param oldContacts the backup of the contacts void restoreContacts(std::vector>* ccdPairs, std::vector>>* oldContacts); /// Logs all of the contacts /// \param ccdPairs the list of current contact pairs void printContacts(const std::vector>& ccdPairs); std::shared_ptr m_logger; }; } } #endif opensurgsim-0.7.0/SurgSim/Physics/Computation.cpp000066400000000000000000000070261277777236100221420ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Physics/Computation.h" #include "SurgSim/Framework/Component.h" #include "SurgSim/Physics/PhysicsManagerState.h" namespace SurgSim { namespace Physics { Computation::Computation(bool doCopyState) : m_copyState(doCopyState) { } Computation::~Computation() { } std::shared_ptr Computation::update(double dt, const std::shared_ptr& state) { m_timer.beginFrame(); auto newState = doUpdate(dt, preparePhysicsState(state)); m_timer.endFrame(); return newState; } void Computation::setDoCopyState(bool val) { m_copyState = val; } bool Computation::isCopyingState() { return m_copyState; } Framework::Timer& Computation::getTimer() { return m_timer; } std::shared_ptr Computation::preparePhysicsState(const std::shared_ptr& state) { auto isInactive = [](std::shared_ptr component) { return !component->isActive(); }; // Compile the list of active representations and set it on the state. auto representations = state->getRepresentations(); representations.erase(std::remove_if(representations.begin(), representations.end(), isInactive), representations.end()); state->setActiveRepresentations(representations); // Compile the list of active collision representations and set it on the state. auto collisionRepresentations = state->getCollisionRepresentations(); collisionRepresentations.erase( std::remove_if(collisionRepresentations.begin(), collisionRepresentations.end(), isInactive), collisionRepresentations.end()); state->setActiveCollisionRepresentations(collisionRepresentations); // Compile the list of active particle representations and set it on the state. auto particleRepresentations = state->getParticleRepresentations(); particleRepresentations.erase( std::remove_if(particleRepresentations.begin(), particleRepresentations.end(), isInactive), particleRepresentations.end()); state->setActiveParticleRepresentations(particleRepresentations); // Compile the list of active constraints and set it on the state. std::vector> activeConstraints; size_t size = 0; int constraintTypeEnd = static_cast(CONSTRAINT_GROUP_TYPE_COUNT); for (int constraintType = 0 ; constraintType < constraintTypeEnd ; constraintType++) { size += state->getConstraintGroup(constraintType).size(); } activeConstraints.reserve(size); for (int constraintType = 0 ; constraintType < constraintTypeEnd ; constraintType++) { auto constraints = state->getConstraintGroup(constraintType); for (auto it = constraints.begin(); it != constraints.end(); it++) { if ((*it)->isActive()) { activeConstraints.push_back(*it); } } } state->setActiveConstraints(activeConstraints); if (m_copyState) { return std::move(std::make_shared(*state)); } else { return std::move(state); } } }; // Physics }; // SurgSim opensurgsim-0.7.0/SurgSim/Physics/Computation.h000066400000000000000000000055661277777236100216160ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_COMPUTATION_H #define SURGSIM_PHYSICS_COMPUTATION_H #include #include #include "SurgSim/Framework/Timer.h" namespace SurgSim { namespace Physics { class PhysicsManagerState; /// Encapsulates a calculation over a selection of objects, needs to be subclassed to be used class Computation { public: /// Constructor /// \param doCopyState Specify if the output state in Computation::Update() is a copy or not of the input state explicit Computation(bool doCopyState); /// Destructor virtual ~Computation(); /// Public Interface execute this objects computations, dt is the time from the last update /// call in seconds. /// \param dt The time passed from the last update in seconds. /// \param state The physics state. /// \return The changed state of the, depending on the setting of doCopyState this is either the same instance /// or a copied instance of the physics state. std::shared_ptr update(double dt, const std::shared_ptr& state); /// Sets up whether the computation will copy the state of PhysicsManagerState before executing. /// \param val Whether to create a copy of the PhysicsState before running the update fuction. void setDoCopyState(bool val); /// Query if this object is copying the PhysicsManagerState. /// \return true if copying the state, false if not. bool isCopyingState(); /// The class name for this class /// \note Use the SURGSIM_CLASSNAME macro in derived classes. /// \return The fully namespace qualified name of this class. virtual std::string getClassName() const = 0; /// Provides access to the update timer. /// \return The timer. Framework::Timer& getTimer(); protected: /// Override this function to implement the computations specific behavior virtual std::shared_ptr doUpdate( const double& dt, const std::shared_ptr& state) = 0; private: bool m_copyState; /// Copy the PhysicsManagerState object when isCopyingState() is true std::shared_ptr preparePhysicsState(const std::shared_ptr& state); /// The update timer. Framework::Timer m_timer; }; }; // Physics }; // SurgSim #endif // SURGSIM_PHYSICS_COMPUTATION_H opensurgsim-0.7.0/SurgSim/Physics/ComputationGroup.cpp000066400000000000000000000042471277777236100231610ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Physics/ComputationGroup.h" #include "SurgSim/Physics/PhysicsManagerState.h" namespace SurgSim { namespace Physics { ComputationGroup::ComputationGroup(bool copyState) : Computation(copyState) { } ComputationGroup::~ComputationGroup() { } std::shared_ptr ComputationGroup::doUpdate( const double& dt, const std::shared_ptr& state) { boost::unique_lock lock(m_computationsMutex); m_iterations = 0; bool keepRunning = true; auto lastState = state; while (keepRunning) { ++m_iterations; for (const auto& computation : m_computations) { lastState = computation->update(dt, lastState); if (lastState->shouldAbortGroup()) { lastState->setAbortGroup(false); keepRunning = false; break; } } keepRunning = keepRunning && !endIteration(); } return lastState; } void ComputationGroup::addComputation(const std::shared_ptr& computation) { boost::unique_lock lock(m_computationsMutex); m_computations.push_back(computation); } bool ComputationGroup::endIteration() { return true; } std::vector> ComputationGroup::getComputations() const { boost::unique_lock lock(m_computationsMutex); return m_computations; } void ComputationGroup::setComputations(const std::vector>& val) { boost::unique_lock lock(m_computationsMutex); m_computations = val; } size_t ComputationGroup::getIterations() { return m_iterations; } } }opensurgsim-0.7.0/SurgSim/Physics/ComputationGroup.h000066400000000000000000000050041277777236100226160ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_COMPUTATIONGROUP_H #define SURGSIM_PHYSICS_COMPUTATIONGROUP_H #include "SurgSim/Physics/Computation.h" #include "SurgSim/Framework/Macros.h" #include namespace SurgSim { namespace Physics { /// Implements a mechanism to group and loop computations, the computations will be called in sequence repeatedly /// until one of the exit criteria is met. That is either the endIteration() call, or shouldAbortLoop() /// in the \sa PhysicsManagerState return true. class ComputationGroup : public Computation { public: /// Constructor explicit ComputationGroup(bool copyState); /// Destructor ~ComputationGroup(); SURGSIM_CLASSNAME(SurgSim::Physics::ComputationGroup); std::shared_ptr doUpdate(const double& dt, const std::shared_ptr& state) override; /// Override this function to implement a custom criterion to exit this computation, when this returns true /// the computation will exit and return the last state /// \note the computation can also be stopped by calling setAbortLoop(true) on the physics state by any calculation /// \return true to stop calculating. virtual bool endIteration(); /// Adds a computation to this group, the computation will be appended at the end /// \param computation the computation to be added to this group void addComputation(const std::shared_ptr& computation); /// \return the computations used by this class std::vector> getComputations() const; /// \param val set the computations used by this class void setComputations(const std::vector>& val); /// \return the number of iterations that have passed size_t getIterations(); private: size_t m_iterations; mutable boost::mutex m_computationsMutex; std::vector> m_computations; }; } } #endif opensurgsim-0.7.0/SurgSim/Physics/Constraint.cpp000066400000000000000000000122541277777236100217630ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Math/MlcpConstraintType.h" #include "SurgSim/Physics/Constraint.h" #include "SurgSim/Physics/ConstraintData.h" #include "SurgSim/Physics/Localization.h" #include "SurgSim/Framework/Assert.h" namespace SurgSim { namespace Physics { Constraint::Constraint(ConstraintType constraintType, std::shared_ptr data, std::shared_ptr representation0, const SurgSim::DataStructures::Location& location0, std::shared_ptr representation1, const SurgSim::DataStructures::Location& location1) : m_active(true) { m_mlcpMap[FIXED_3DPOINT] = Math::MLCP_BILATERAL_3D_CONSTRAINT; m_mlcpMap[FIXED_3DROTATION_VECTOR] = Math::MLCP_BILATERAL_3D_CONSTRAINT; m_mlcpMap[FRICTIONAL_3DCONTACT] = Math::MLCP_UNILATERAL_3D_FRICTIONAL_CONSTRAINT; m_mlcpMap[FRICTIONLESS_3DCONTACT] = Math::MLCP_UNILATERAL_3D_FRICTIONLESS_CONSTRAINT; m_mlcpMap[FRICTIONAL_SLIDING] = Math::MLCP_BILATERAL_FRICTIONAL_SLIDING_CONSTRAINT; m_mlcpMap[FRICTIONLESS_SLIDING] = Math::MLCP_BILATERAL_FRICTIONLESS_SLIDING_CONSTRAINT; setInformation(constraintType, data, representation0, location0, representation1, location1); } Constraint::~Constraint() { } const std::pair, std::shared_ptr>& Constraint::getImplementations() const { return m_implementations; } const std::pair, std::shared_ptr>& Constraint::getLocalizations() const { return m_localizations; } std::shared_ptr Constraint::getData() const { return m_data; } size_t Constraint::getNumDof() const { return m_numDof; } ConstraintType Constraint::getType() { return m_constraintType; } void Constraint::build(double dt, MlcpPhysicsProblem* mlcp, size_t indexOfRepresentation0, size_t indexOfRepresentation1, size_t indexOfConstraint) { doBuild(dt, *m_data.get(), mlcp, indexOfRepresentation0, indexOfRepresentation1, indexOfConstraint); } bool Constraint::isActive() { return m_active && m_localizations.first->getRepresentation()->isActive() && m_localizations.second->getRepresentation()->isActive(); } void Constraint::setActive(bool flag) { m_active = flag; } void Constraint::doBuild(double dt, const ConstraintData& data, MlcpPhysicsProblem* mlcp, size_t indexOfRepresentation0, size_t indexOfRepresentation1, size_t indexOfConstraint) { m_implementations.first->build( dt, *m_data.get(), m_localizations.first, mlcp, indexOfRepresentation0, indexOfConstraint, CONSTRAINT_POSITIVE_SIDE); m_implementations.second->build( dt, *m_data.get(), m_localizations.second, mlcp, indexOfRepresentation1, indexOfConstraint, CONSTRAINT_NEGATIVE_SIDE); mlcp->constraintTypes.push_back( (m_constraintType != INVALID_CONSTRAINT) ? m_mlcpMap[m_constraintType] : Math::MLCP_INVALID_CONSTRAINT); } void Constraint::setInformation(ConstraintType constraintType, std::shared_ptr data, std::shared_ptr representation0, const SurgSim::DataStructures::Location& location0, std::shared_ptr representation1, const SurgSim::DataStructures::Location& location1) { m_constraintType = constraintType; SURGSIM_ASSERT(data != nullptr) << "ConstraintData can't be nullptr"; SURGSIM_ASSERT(representation0 != nullptr) << "First representation can't be nullptr"; SURGSIM_ASSERT(representation1 != nullptr) << "Second representation can't be nullptr"; auto localization0 = representation0->createLocalization(location0); SURGSIM_ASSERT(localization0 != nullptr) << "Could not create localization for " << representation0->getName(); auto localization1 = representation1->createLocalization(location1); SURGSIM_ASSERT(localization1 != nullptr) << "Could not create localization for " << representation1->getName(); auto implementation0 = representation0->getConstraintImplementation(m_constraintType); SURGSIM_ASSERT(implementation0 != nullptr) << "Could not get implementation for " << representation0->getName(); auto implementation1 = representation1->getConstraintImplementation(m_constraintType); SURGSIM_ASSERT(implementation1 != nullptr) << "Could not get implementation for " << representation1->getName(); SURGSIM_ASSERT(implementation0->getNumDof() == implementation1->getNumDof()) << "The number of DOFs does not match between the two implementations"; m_data = data; m_implementations = std::make_pair(implementation0, implementation1); m_localizations = std::make_pair(localization0, localization1); m_numDof = implementation0->getNumDof(); } }; // namespace Physics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/Constraint.h000066400000000000000000000131551277777236100214310ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_CONSTRAINT_H #define SURGSIM_PHYSICS_CONSTRAINT_H #include "SurgSim/DataStructures/Location.h" #include "SurgSim/Physics/ConstraintData.h" #include "SurgSim/Physics/ConstraintImplementation.h" #include "SurgSim/Physics/MlcpPhysicsProblem.h" #include #include namespace SurgSim { namespace Physics { /// Base class for all physics constraints. Contains data specific to the constraint and a pair of implementations. class Constraint { public: /// Sets all the values for this constraints, does validation on the parameters and will throw if something /// is wrong with the constraint. /// \param constraintType The constraint type. /// \param data The data for this constraint. /// \param representation0, representation1 Both representations in this constraint. /// \param location0, location1 Both locations of the representations involved in this constraint. Constraint( ConstraintType constraintType, std::shared_ptr data, std::shared_ptr representation0, const SurgSim::DataStructures::Location& location0, std::shared_ptr representation1, const SurgSim::DataStructures::Location& location1); /// Destructor virtual ~Constraint(); /// Sets all the values for this constraints, does validation on the parameters and will throw if something /// is wrong with the constraint. /// \param constraintType The constraint type. /// \param data The data for this constraint. /// \param representation0, representation1 Both representations in this constraint. /// \param location0, location1 Both locations of the representations involved in this constraint. void setInformation( ConstraintType constraintType, std::shared_ptr data, std::shared_ptr representation0, const SurgSim::DataStructures::Location& location0, std::shared_ptr representation1, const SurgSim::DataStructures::Location& location1); /// Gets both sides implementation as a pair. /// \return the pair of implementations forming this constraint. const std::pair, std::shared_ptr>& getImplementations() const; /// Gets both sides Localization as a pair. /// \return the pair of localizations forming this constraint. const std::pair, std::shared_ptr>& getLocalizations() const; /// Gets the data associated to this constraint. /// \return The data associated to this constraint. std::shared_ptr getData() const; /// Gets the number of degree of freedom for this constraint. /// \return The number of degree of freedom for this constraint. size_t getNumDof() const; /// Gets the ConstraintType /// \return The type ConstraintType getType(); /// Builds subset of an Mlcp physics problem associated to this constraint. /// \param dt The time step. /// \param [in,out] mlcpPhysicsProblem The Mlcp physics problem to be filled up. /// \param indexOfRepresentation0 The index of the 1st representation in the Mlcp. /// \param indexOfRepresentation1 The index of the 2nd representation in the Mlcp. /// \param indexOfConstraint The index of this constraint in the Mlcp. void build(double dt, MlcpPhysicsProblem* mlcpPhysicsProblem, size_t indexOfRepresentation0, size_t indexOfRepresentation1, size_t indexOfConstraint); /// \return Whether this constraint is active. bool isActive(); /// \param flag Whether this constraint is active. void setActive(bool flag); protected: /// Constraint-MLCP mapping std::array m_mlcpMap; /// Specific data associated to this constraint std::shared_ptr m_data; /// Pair of implementations defining the 2 sides of the constraint std::pair, std::shared_ptr> m_implementations; std::pair, std::shared_ptr> m_localizations; /// The degrees of freedom that this constraint has size_t m_numDof; /// The type of this constraint ConstraintType m_constraintType; /// Builds subset of an Mlcp physics problem associated to this constraint user-defined call for extra treatment /// \param dt The time step /// \param data The data specific to this constraint /// \param [in,out] mlcpPhysicsProblem The Mlcp physics problem to be filled up /// \param indexOfRepresentation0 The index of the 1st representation in the Mlcp /// \param indexOfRepresentation1 The index of the 2nd representation in the Mlcp /// \param indexOfConstraint The index of this constraint in the Mlcp virtual void doBuild(double dt, const ConstraintData& data, MlcpPhysicsProblem* mlcpPhysicsProblem, size_t indexOfRepresentation0, size_t indexOfRepresentation1, size_t indexOfConstraint); /// Flag to indicate whether this constraint is active or not. bool m_active; }; }; // namespace Physics }; // namespace SurgSim #endif // SURGSIM_PHYSICS_CONSTRAINT_H opensurgsim-0.7.0/SurgSim/Physics/ConstraintComponent.cpp000066400000000000000000000023751277777236100236510ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Physics/ConstraintComponent.h" namespace SurgSim { namespace Physics { ConstraintComponent::ConstraintComponent(const std::string& name) : Component(name) { } ConstraintComponent::~ConstraintComponent() { } void ConstraintComponent::setConstraint(std::shared_ptr constraint) { m_constraint = constraint; } std::shared_ptr ConstraintComponent::getConstraint() const { return m_constraint; } bool ConstraintComponent::doInitialize() { return m_constraint != nullptr; }; bool ConstraintComponent::doWakeUp() { return true; } }; // namespace Physics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/ConstraintComponent.h000066400000000000000000000035431277777236100233140ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_CONSTRAINTCOMPONENT_H #define SURGSIM_PHYSICS_CONSTRAINTCOMPONENT_H #include #include #include "SurgSim/Framework/Component.h" namespace SurgSim { namespace Physics { class Constraint; /// Component class for inserting constraints between physics representations into the scene. class ConstraintComponent : public SurgSim::Framework::Component { public: /// Constructor /// \param name Name of the component explicit ConstraintComponent(const std::string& name); /// Destructor virtual ~ConstraintComponent(); /// Set the constraint associated with this component /// \param constraint The constraint to be set void setConstraint(std::shared_ptr constraint); /// Get the constraint associated with this component /// \return The associated constraint std::shared_ptr getConstraint() const; protected: /// The stored constraint std::shared_ptr m_constraint; /// Initialize the component /// \return true if successful bool doInitialize() override; /// Wakeup the component /// \return true if successful bool doWakeUp() override; }; }; // namespace SurgSim }; // namespace Physics #endif // SURGSIM_PHYSICS_CONSTRAINTCOMPONENT_H opensurgsim-0.7.0/SurgSim/Physics/ConstraintData.cpp000066400000000000000000000015411277777236100225520ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Physics/ConstraintData.h" namespace SurgSim{ namespace Physics{ ConstraintData::ConstraintData() { } ConstraintData::~ConstraintData() { } }; // namespace Physics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/ConstraintData.h000066400000000000000000000021101277777236100222100ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_CONSTRAINTDATA_H #define SURGSIM_PHYSICS_CONSTRAINTDATA_H namespace SurgSim { namespace Physics { /// Base class for all CosntraintData /// Derived classes should be specific to a given constraint class ConstraintData { public: /// Default Constructor ConstraintData(); /// Destructor virtual ~ConstraintData(); }; }; // namespace Physics }; // namespace SurgSim #endif // SURGSIM_PHYSICS_CONSTRAINTDATA_H opensurgsim-0.7.0/SurgSim/Physics/ConstraintImplementation.cpp000066400000000000000000000030231277777236100246630ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Physics/Constraint.h" #include "SurgSim/Physics/ConstraintData.h" #include "SurgSim/Physics/ConstraintImplementation.h" namespace SurgSim { namespace Physics { ConstraintImplementation::ConstraintImplementation() { } ConstraintImplementation::~ConstraintImplementation() { } ConstraintImplementationFactory& ConstraintImplementation::getFactory() { static ConstraintImplementationFactory factory; return factory; } size_t ConstraintImplementation::getNumDof() const { return doGetNumDof(); } void ConstraintImplementation::build(double dt, const ConstraintData& data, const std::shared_ptr& localization, MlcpPhysicsProblem* mlcp, size_t indexOfRepresentation, size_t indexOfConstraint, ConstraintSideSign sign) { doBuild(dt, data, localization, mlcp, indexOfRepresentation, indexOfConstraint, sign); } }; // namespace Physics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/ConstraintImplementation.h000066400000000000000000000103451277777236100243350ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_CONSTRAINTIMPLEMENTATION_H #define SURGSIM_PHYSICS_CONSTRAINTIMPLEMENTATION_H #include #include #include "SurgSim/Physics/Representation.h" #include "SurgSim/Physics/ConstraintData.h" #include "SurgSim/Physics/ConstraintImplementationFactory.h" #include "SurgSim/Physics/ConstraintType.h" #include "SurgSim/Physics/Localization.h" #include "SurgSim/Physics/MlcpPhysicsProblem.h" namespace SurgSim { namespace Physics { /// Enum defining on which side of the constraint an implementation is (positive or negative side) /// \note A constraint can be seen as C: side0 = side1 <=> C: side0 - side1 = 0 /// \note Therefore 1 side will have a positive sign (+1), and 1 side a negative sign (-1) enum ConstraintSideSign {CONSTRAINT_POSITIVE_SIDE, CONSTRAINT_NEGATIVE_SIDE}; /// Base class for all constraint implementations. A ConstraintImplementation defines 1 side of a constraint. class ConstraintImplementation { public: /// Constructor ConstraintImplementation(); /// Destructor virtual ~ConstraintImplementation(); /// \return The static class factory that contains the implementations for a given Representation type. static ConstraintImplementationFactory& getFactory(); /// Gets the number of degree of freedom for this implementation /// \return The number of degree of freedom for this implementation size_t getNumDof() const; /// Gets the constraint type for this ConstraintImplementation /// \return The constraint type corresponding to this constraint implementation virtual SurgSim::Physics::ConstraintType getConstraintType() const = 0; /// Builds the subset of an Mlcp physics problem associated to this implementation /// \param dt The time step /// \param data The data associated to the constraint /// \param localization The localization for this implementation /// \param [in, out] mlcp The Mixed LCP physics problem to fill up /// \param indexOfRepresentation The index of the representation (associated to this implementation) in the mlcp /// \param indexOfConstraint The index of the constraint in the mlcp /// \param sign The sign of this implementation in the constraint (positive or negative side) void build(double dt, const ConstraintData& data, const std::shared_ptr& localization, MlcpPhysicsProblem* mlcp, size_t indexOfRepresentation, size_t indexOfConstraint, ConstraintSideSign sign); protected: /// Preallocated variable for derived implementations of doBuild. Eigen::SparseVector m_newH; private: /// Does get number of degree of freedom /// \return The number of degree of freedom associated to this implementation virtual size_t doGetNumDof() const = 0; /// Builds the subset of an Mlcp physics problem associated to this implementation /// \param dt The time step /// \param data The data associated to the constraint /// \param localization The localization for the constraint /// \param [in, out] mlcp The Mixed LCP physics problem to fill up /// \param indexOfRepresentation The index of the representation (associated to this implementation) in the mlcp /// \param indexOfConstraint The index of the constraint in the mlcp /// \param sign The sign of this implementation in the constraint (positive or negative side) virtual void doBuild(double dt, const ConstraintData& data, const std::shared_ptr& localization, MlcpPhysicsProblem* mlcp, size_t indexOfRepresentation, size_t indexOfConstraint, ConstraintSideSign sign) = 0; }; }; // namespace Physics }; // namespace SurgSim #endif // SURGSIM_PHYSICS_CONSTRAINTIMPLEMENTATION_H opensurgsim-0.7.0/SurgSim/Physics/ConstraintImplementationFactory.cpp000066400000000000000000000136771277777236100262330ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Blocks/MassSpring1DRepresentation.h" #include "SurgSim/Blocks/MassSpring2DRepresentation.h" #include "SurgSim/Blocks/MassSpring3DRepresentation.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Physics/ConstraintImplementationFactory.h" #include "SurgSim/Physics/Fem1DRepresentation.h" #include "SurgSim/Physics/Fem2DRepresentation.h" #include "SurgSim/Physics/Fem3DRepresentation.h" #include "SurgSim/Physics/FemConstraintFixedPoint.h" #include "SurgSim/Physics/FemConstraintFixedRotationVector.h" #include "SurgSim/Physics/FemConstraintFrictionalSliding.h" #include "SurgSim/Physics/FemConstraintFrictionlessContact.h" #include "SurgSim/Physics/FemConstraintFrictionlessSliding.h" #include "SurgSim/Physics/FixedConstraintFixedPoint.h" #include "SurgSim/Physics/FixedConstraintFixedRotationVector.h" #include "SurgSim/Physics/FixedConstraintFrictionlessContact.h" #include "SurgSim/Physics/FixedRepresentation.h" #include "SurgSim/Physics/MassSpringConstraintFixedPoint.h" #include "SurgSim/Physics/MassSpringConstraintFrictionlessContact.h" #include "SurgSim/Physics/MassSpringRepresentation.h" #include "SurgSim/Physics/RigidConstraintFixedPoint.h" #include "SurgSim/Physics/RigidConstraintFixedRotationVector.h" #include "SurgSim/Physics/RigidConstraintFrictionlessContact.h" #include "SurgSim/Physics/RigidRepresentation.h" namespace SurgSim { namespace Physics { ConstraintImplementationFactory::ConstraintImplementationFactory() { using SurgSim::Blocks::MassSpring1DRepresentation; using SurgSim::Blocks::MassSpring2DRepresentation; using SurgSim::Blocks::MassSpring3DRepresentation; addImplementation(typeid(FixedRepresentation), std::make_shared()); addImplementation(typeid(RigidRepresentation), std::make_shared()); addImplementation(typeid(Fem1DRepresentation), std::make_shared()); addImplementation(typeid(Fem2DRepresentation), std::make_shared()); addImplementation(typeid(Fem3DRepresentation), std::make_shared()); addImplementation(typeid(FixedRepresentation), std::make_shared()); addImplementation(typeid(RigidRepresentation), std::make_shared()); addImplementation(typeid(Fem1DRepresentation), std::make_shared()); addImplementation(typeid(Fem2DRepresentation), std::make_shared()); addImplementation(typeid(Fem3DRepresentation), std::make_shared()); addImplementation(typeid(Fem1DRepresentation), std::make_shared()); addImplementation(typeid(Fem2DRepresentation), std::make_shared()); addImplementation(typeid(Fem3DRepresentation), std::make_shared()); addImplementation(typeid(Fem1DRepresentation), std::make_shared()); addImplementation(typeid(Fem2DRepresentation), std::make_shared()); addImplementation(typeid(Fem3DRepresentation), std::make_shared()); addImplementation(typeid(FixedRepresentation), std::make_shared()); addImplementation(typeid(RigidRepresentation), std::make_shared()); addImplementation(typeid(Fem1DRepresentation), std::make_shared()); addImplementation(typeid(MassSpringRepresentation), std::make_shared()); addImplementation(typeid(MassSpringRepresentation), std::make_shared()); addImplementation(typeid(MassSpring1DRepresentation), std::make_shared()); addImplementation(typeid(MassSpring1DRepresentation), std::make_shared()); addImplementation(typeid(MassSpring2DRepresentation), std::make_shared()); addImplementation(typeid(MassSpring2DRepresentation), std::make_shared()); addImplementation(typeid(MassSpring3DRepresentation), std::make_shared()); addImplementation(typeid(MassSpring3DRepresentation), std::make_shared()); } ConstraintImplementationFactory::~ConstraintImplementationFactory() { } std::shared_ptr ConstraintImplementationFactory::getImplementation( std::type_index representationType, ConstraintType constraintType) { SURGSIM_ASSERT(constraintType >= 0 && constraintType < NUM_CONSTRAINT_TYPES) << "Invalid constraint type " << constraintType; auto implementation = m_implementations[representationType][constraintType]; SURGSIM_LOG_IF(implementation == nullptr, SurgSim::Framework::Logger::getDefaultLogger(), WARNING) << "No constraint implementation for representation type (" << representationType.name() << ") and constraint type (" << constraintType << ")"; return implementation; } void ConstraintImplementationFactory::addImplementation( std::type_index typeIndex, std::shared_ptr implementation) { m_implementations[typeIndex][implementation->getConstraintType()] = implementation; } }; // Physics }; // SurgSim opensurgsim-0.7.0/SurgSim/Physics/ConstraintImplementationFactory.h000066400000000000000000000046531277777236100256720ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_CONSTRAINTIMPLEMENTATIONFACTORY_H #define SURGSIM_PHYSICS_CONSTRAINTIMPLEMENTATIONFACTORY_H #include #include #include #include #include "SurgSim/Physics/ConstraintType.h" #include "SurgSim/Physics/Representation.h" namespace SurgSim { namespace Physics { class ConstraintImplementation; /// This class manages ConstraintImplementations, and can be used to look up the correct implementation /// by representation and constraint type. /// The only maintenance that needs to be done right now when a new /// ConstraintImplementation is added is to add a call into the constructor. class ConstraintImplementationFactory { public: /// Constructor ConstraintImplementationFactory(); /// Destructor ~ConstraintImplementationFactory(); /// Get the instance of a ConstraintImplementation for a specific representation and /// constraint type. /// \param representationType Type index of the representation. /// \param constraintType Type of the constraint. /// \return a pointer to an implementation if the implementation can be found, nullptr otherwise. std::shared_ptr getImplementation( std::type_index representationType, ConstraintType constraintType); /// Add an implementation to the internal directory. /// \param typeIndex The type of representation associated with the implementation. /// \param implementation The ConstraintImplementation to add. void addImplementation(std::type_index typeIndex, std::shared_ptr implementation); private: /// Lookup table for constraint implementations std::unordered_map, NUM_CONSTRAINT_TYPES>> m_implementations; }; }; // Physics }; // SurgSim #endif opensurgsim-0.7.0/SurgSim/Physics/ConstraintType.h000066400000000000000000000020671277777236100222730ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_CONSTRAINTTYPE_H #define SURGSIM_PHYSICS_CONSTRAINTTYPE_H namespace SurgSim { namespace Physics { enum ConstraintType { INVALID_CONSTRAINT = -1, FIXED_3DPOINT = 0, FIXED_3DROTATION_VECTOR, FRICTIONLESS_3DCONTACT, FRICTIONAL_3DCONTACT, FRICTIONLESS_SLIDING, FRICTIONAL_SLIDING, NUM_CONSTRAINT_TYPES }; } // namespace Physics } // namespace SurgSim #endif // SURGSIM_PHYSICS_CONSTRAINTTYPE_H opensurgsim-0.7.0/SurgSim/Physics/ContactConstraintData.h000066400000000000000000000052101277777236100235300ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_CONTACTCONSTRAINTDATA_H #define SURGSIM_PHYSICS_CONTACTCONSTRAINTDATA_H #include "SurgSim/Collision/CollisionPair.h" #include "SurgSim/Physics/ConstraintData.h" #include "SurgSim/Math/Vector.h" namespace SurgSim { namespace Physics { /// Class for Frictionless contact (only needs a plane equation) class ContactConstraintData : public ConstraintData { public: /// Default constructor ContactConstraintData() : ConstraintData(), m_distance(0.0) { m_normal.setZero(); } /// Destructor virtual ~ContactConstraintData() { } /// Sets the plane equation of the frictionless contact /// \param n The plane normal (normalized vector) /// \param d The plane distance to the origin /// \note The plane is defined by { P | n.P + d = 0 } void setPlaneEquation(const SurgSim::Math::Vector3d& n, double d) { m_normal = n; m_distance = d; } /// Gets the plane normal vector /// \return The plane equation's normal vector (normalized vector) const SurgSim::Math::Vector3d& getNormal() const { return m_normal; } /// Gets the plane distance to the origin /// \return The plane equation's distance to the origin double getDistance() const { return m_distance; } /// Gets the time of contact for the collision /// \return The time of contact for the collision double getContactTime() const { return m_contact->time; } /// \return The contact that uses this constraint data. std::shared_ptr getContact() { return m_contact; } /// \param contacts The contacts that use this constraint data. void setContact(const std::shared_ptr& contacts) { m_contact = contacts; } private: /// Plane equation normal vector (normalized vector) SurgSim::Math::Vector3d m_normal; /// Plane equation distance to origin double m_distance; /// The contact that uses this constraint data. std::shared_ptr m_contact; }; }; // namespace Physics }; // namespace SurgSim #endif // SURGSIM_PHYSICS_CONTACTCONSTRAINTDATA_H opensurgsim-0.7.0/SurgSim/Physics/ContactConstraintGeneration.cpp000066400000000000000000000130071277777236100253100ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Physics/ContactConstraintGeneration.h" #include #include #include "SurgSim/Collision/CollisionPair.h" #include "SurgSim/Collision/Representation.h" #include "SurgSim/DataStructures/Location.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Physics/Constraint.h" #include "SurgSim/Physics/ContactConstraintData.h" #include "SurgSim/Physics/ConstraintImplementation.h" #include "SurgSim/Physics/PhysicsManagerState.h" #include "SurgSim/Physics/Representation.h" namespace SurgSim { namespace Physics { ContactConstraintGeneration::ContactConstraintGeneration(bool doCopyState) : Computation(doCopyState) { m_logger = SurgSim::Framework::Logger::getLogger("ContactConstraintGeneration"); } ContactConstraintGeneration::~ContactConstraintGeneration() { } std::shared_ptr ContactConstraintGeneration::doUpdate( const double& dt, const std::shared_ptr& state) { using SurgSim::DataStructures::Location; auto result = state; auto& pairs = result->getCollisionPairs(); std::vector> constraints; // This will check all collision pairs for contacts, then iterate over all // the contacts and for each contact will create a constraint between the // sides of the collisionpair and the localizations created from the contact // point. The list of all the constraints will be added back into the // Physics state as a result of this computation for (auto& pair : pairs) { if (pair->hasContacts()) { auto collisionRepresentations = pair->getRepresentations(); auto collisionToPhysicsMap = state->getCollisionToPhysicsMap(); auto foundFirst = collisionToPhysicsMap.find(collisionRepresentations.first); auto foundSecond = collisionToPhysicsMap.find(collisionRepresentations.second); if (foundFirst == collisionToPhysicsMap.end() || foundSecond == collisionToPhysicsMap.end()) { SURGSIM_LOG_DEBUG(m_logger) << __FUNCTION__ << " Not creating a constraint. " << collisionRepresentations.first->getName() << " and/or " << collisionRepresentations.second->getName() << " does not have a physics representation"; continue; } std::pair, std::shared_ptr> physicsRepresentations; physicsRepresentations.first = foundFirst->second; physicsRepresentations.second = foundSecond->second; if (!(physicsRepresentations.first->isActive() && physicsRepresentations.second->isActive())) { SURGSIM_LOG_DEBUG(m_logger) << __FUNCTION__ << " Not creating a constraint. " << physicsRepresentations.first->getName() << " and/or " << physicsRepresentations.second->getName() << " is not an active physics representation"; continue; } const auto& contacts = pair->getContacts(); for (auto& contact : contacts) { std::pair, std::shared_ptr> locations; locations.first = makeLocation(physicsRepresentations.first, collisionRepresentations.first, contact->penetrationPoints.first); locations.second = makeLocation(physicsRepresentations.second, collisionRepresentations.second, contact->penetrationPoints.second); // HS-2013-jul-12 The type of constraint is fixed here right now, to get to a constraint // that we can change we probably will need to predefine collision pairs and their appropriate // contact constraints so we can look up which constraint to use here auto data = std::make_shared(); data->setPlaneEquation(contact->normal, contact->depth); data->setContact(contact); constraints.push_back(std::make_shared( SurgSim::Physics::FRICTIONLESS_3DCONTACT, data, physicsRepresentations.first, *locations.first, physicsRepresentations.second, *locations.second)); } } } result->setConstraintGroup(CONSTRAINT_GROUP_TYPE_CONTACT, constraints); return std::move(result); } std::shared_ptr ContactConstraintGeneration::makeLocation( std::shared_ptr physicsRepresentation, std::shared_ptr collisionRepresentation, const SurgSim::DataStructures::Location& location) { auto physicsLocation = std::make_shared(location); SURGSIM_ASSERT(physicsLocation != nullptr) << "Cannot create Location object."; if (location.rigidLocalPosition.hasValue()) { // Move the local position from the collision representation that created the location // to local coordinates of the physics representation that is creating a localization physicsLocation->rigidLocalPosition.setValue( physicsRepresentation->getLocalPose().inverse() * collisionRepresentation->getLocalPose() * location.rigidLocalPosition.getValue()); } return physicsLocation; } }; // Physics }; // SurgSim opensurgsim-0.7.0/SurgSim/Physics/ContactConstraintGeneration.h000066400000000000000000000065741277777236100247700ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_CONTACTCONSTRAINTGENERATION_H #define SURGSIM_PHYSICS_CONTACTCONSTRAINTGENERATION_H #include #include "SurgSim/Framework/Macros.h" #include "SurgSim/Physics/Computation.h" namespace SurgSim { namespace Framework { class Logger; } namespace DataStructures { struct Location; } namespace Collision { class Representation; } namespace Physics { class Localization; class PhysicsManagerState; class Representation; /// Generate a constraint for every contact that was calculated. /// The general algorithm is such, for each pair of Collision Representations that has Contacts /// For each contact: /// - Generate a localization for each side of the pair /// - Find the correct CollisionImplementation for the Representation and type of constraint, note that currently /// we use only one type of constraint for the collision /// - Create the ConstraintData for the contact with /// - Create a constraint from, the ContactImplmentation, Localization and ConstraintData /// - Add it to the list of Constraints /// At the end those constraints are added as contact constraints to the physics state class ContactConstraintGeneration : public Computation { public: /// Constructor /// \param doCopyState Specify if the output state in Computation::Update() is a copy or not of the input state explicit ContactConstraintGeneration(bool doCopyState = false); SURGSIM_CLASSNAME(SurgSim::Physics::ContactConstraintGeneration); /// Destructor ~ContactConstraintGeneration(); private: /// The logger for this class std::shared_ptr m_logger; /// Overridden function from Computation, the actual work is done here /// \param dt The time passed from the last update in seconds. /// \param state The physics state. /// \return The changed state of the, depending on the setting of doCopyState this is either the same instance /// or a copied instance of the physics state. std::shared_ptr doUpdate(const double& dt, const std::shared_ptr& state) override; /// Generate a location from a Collision Representation. /// \param physicsRepresentation The physics representation. /// \param collisionRepresentation The collision representation. /// \param location The location generated by the contact calculation. /// \return The localization for the collision representations physics representation. /// \note Asserts if cannot Location create shared object. std::shared_ptr makeLocation( std::shared_ptr physicsRepresentation, std::shared_ptr collisionRepresentation, const SurgSim::DataStructures::Location& location); }; }; // Physics }; // SurgSim #endif opensurgsim-0.7.0/SurgSim/Physics/ContactFiltering.cpp000066400000000000000000000047441277777236100231030ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Collision/ContactFilter.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Framework/ThreadPool.h" #include "SurgSim/Physics/ContactFiltering.h" #include "SurgSim/Physics/PhysicsManagerState.h" namespace SurgSim { namespace Physics { ContactFiltering::ContactFiltering(bool doCopyState) : Computation(doCopyState) { } ContactFiltering::~ContactFiltering() { } std::shared_ptr ContactFiltering::doUpdate( const double& dt, const std::shared_ptr& state) { static auto isActive = [](std::shared_ptr f) { return f->isActive(); }; static auto hasContacts = [](std::shared_ptr p) { return p->hasContacts(); }; std::shared_ptr result = state; auto threadPool = Framework::Runtime::getThreadPool(); std::vector> tasks; const auto& stateFilters = state->getContactFilters(); std::vector> filters; filters.reserve(stateFilters.size()); std::copy_if(stateFilters.begin(), stateFilters.end(), std::back_inserter(filters), isActive); if (filters.size() == 0) { return result; } for (const auto& filter : filters) { filter->update(dt); } const auto& statePairs = state->getCollisionPairs(); std::vector > pairs; pairs.reserve(statePairs.size()); std::copy_if(statePairs.begin(), statePairs.end(), std::back_inserter(pairs), hasContacts); for (auto& pair : pairs) { tasks.push_back(threadPool->enqueue([&state, &filters, &pair]() { for (const auto& filter : filters) { filter->filterContacts(state, pair); } })); } std::for_each(tasks.begin(), tasks.end(), [](std::future& p) { p.get(); }); return result; } }; // Physics }; // SurgSim opensurgsim-0.7.0/SurgSim/Physics/ContactFiltering.h000066400000000000000000000032051277777236100225370ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_CONTACTFILTERING_H #define SURGSIM_PHYSICS_CONTACTFILTERING_H #include #include "SurgSim/Framework/Macros.h" #include "SurgSim/Physics/Computation.h" namespace SurgSim { namespace Physics { class PhysicsManagerState; /// Computation to determine filter the contacts on collisions pairs. /// This Computation class takes the list of collision pairs and the list of contact filters and will apply all /// the filters to the collision pairs' contacts. class ContactFiltering : public Computation { public: /// Constructor /// \param doCopyState Specify if the output state in Computation::Update() is a copy or not of the input state explicit ContactFiltering(bool doCopyState = false); SURGSIM_CLASSNAME(SurgSim::Physics::ContactFiltering); /// Destructor virtual ~ContactFiltering(); protected: std::shared_ptr doUpdate(const double& dt, const std::shared_ptr& state) override; }; }; // Physics }; // SurgSim #endif opensurgsim-0.7.0/SurgSim/Physics/DcdCollision.cpp000066400000000000000000000040611277777236100222020ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Collision/CollisionPair.h" #include "SurgSim/Collision/ContactCalculation.h" #include "SurgSim/Collision/CcdDcdCollision.h" #include "SurgSim/Collision/Representation.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Framework/ThreadPool.h" #include "SurgSim/Physics/DcdCollision.h" #include "SurgSim/Physics/PhysicsManagerState.h" using SurgSim::Collision::CollisionPair; using SurgSim::Collision::ContactCalculation; namespace SurgSim { namespace Physics { DcdCollision::DcdCollision(bool doCopyState) : Computation(doCopyState) { } DcdCollision::~DcdCollision() { } std::shared_ptr DcdCollision::doUpdate( const double& dt, const std::shared_ptr& state) { std::shared_ptr result = state; auto threadPool = Framework::Runtime::getThreadPool(); std::vector> tasks; const auto& calculations = ContactCalculation::getDcdContactTable(); for (auto& pair : result->getCollisionPairs()) { if (pair->getType() == Collision::COLLISION_DETECTION_TYPE_DISCRETE) { tasks.push_back(threadPool->enqueue([&calculations, &pair]() { calculations[pair->getFirst()->getShapeType()] [pair->getSecond()->getShapeType()]->calculateContact(pair); })); } } std::for_each(tasks.begin(), tasks.end(), [](std::future& p){p.get();}); return result; } }; // Physics }; // SurgSim opensurgsim-0.7.0/SurgSim/Physics/DcdCollision.h000066400000000000000000000044051277777236100216510ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_DCDCOLLISION_H #define SURGSIM_PHYSICS_DCDCOLLISION_H #include #include "SurgSim/Framework/Macros.h" #include "SurgSim/Math/Shape.h" #include "SurgSim/Physics/Computation.h" namespace SurgSim { namespace Collision { class ContactCalculation; } namespace Physics { class PhysicsManagerState; /// Computation to determine the contacts between a list of CollisionPairs. /// This Computation class takes a list of representations, it will generate a list of collision pairs /// from this list on every frame, for each CollisionPair, it uses a two dimensional table of /// function objects (ContactCalculation) to determine how to calculate a contact between the two /// members of each pair, if no specific function exists a default function will be used. /// will update the collision pairs accordingly. /// \note When a new ContactCalculation type gets implemented, the type needs to be registered with the table /// inside of ContactCalculation class DcdCollision : public Computation { public: /// Constructor /// \param doCopyState Specify if the output state in Computation::Update() is a copy or not of the input state explicit DcdCollision(bool doCopyState = false); SURGSIM_CLASSNAME(SurgSim::Physics::DcdCollision); /// Destructor virtual ~DcdCollision(); protected: /// Executes the update operation, overridden from Computation. /// \param dt The time passed. /// \param state The PhysicsManagerState from previous computation. std::shared_ptr doUpdate(const double& dt, const std::shared_ptr& state) override; }; }; // Physics }; // SurgSim #endif opensurgsim-0.7.0/SurgSim/Physics/DeformableCollisionRepresentation.cpp000066400000000000000000000207731277777236100265030ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/DataStructures/TriangleMesh.h" #include "SurgSim/Framework/ObjectFactory.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Framework/SceneElement.h" #include "SurgSim/Math/MathConvert.h" #include "SurgSim/Math/MeshShape.h" #include "SurgSim/Math/OdeState.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/SegmentMeshShape.h" #include "SurgSim/Math/Shape.h" #include "SurgSim/Math/SurfaceMeshShape.h" #include "SurgSim/Physics/DeformableCollisionRepresentation.h" #include "SurgSim/Physics/DeformableRepresentation.h" namespace SurgSim { namespace Physics { SURGSIM_REGISTER(SurgSim::Framework::Component, SurgSim::Physics::DeformableCollisionRepresentation, DeformableCollisionRepresentation); DeformableCollisionRepresentation::DeformableCollisionRepresentation(const std::string& name) : SurgSim::Collision::Representation(name) { SURGSIM_ADD_SERIALIZABLE_PROPERTY(DeformableCollisionRepresentation, std::shared_ptr, Shape, getShape, setShape); } DeformableCollisionRepresentation::~DeformableCollisionRepresentation() { } namespace { bool updateShapeFromOdeState(const Math::OdeState& odeState, SurgSim::Math::Shape* shape) { bool result = false; const size_t numNodes = odeState.getNumNodes(); if (shape->getType() == SurgSim::Math::SHAPE_TYPE_MESH || shape->getType() == SurgSim::Math::SHAPE_TYPE_SURFACEMESH) { auto meshShape = dynamic_cast(shape); SURGSIM_ASSERT(meshShape != nullptr) << "The shape is neither a mesh nor a surface mesh"; SURGSIM_ASSERT(meshShape->getNumVertices() == numNodes) << "The number of nodes in the deformable does not match the number of vertices in the mesh."; for (size_t nodeId = 0; nodeId < numNodes; ++nodeId) { meshShape->setVertexPosition(nodeId, odeState.getPosition(nodeId)); } result = meshShape->update(); } else if (shape->getType() == SurgSim::Math::SHAPE_TYPE_SEGMENTMESH) { auto meshShape = dynamic_cast(shape); SURGSIM_ASSERT(meshShape != nullptr) << "The shape is of type mesh but is not a mesh"; SURGSIM_ASSERT(meshShape->getNumVertices() == numNodes) << "The number of nodes in the deformable does not match the number of vertices in the mesh."; for (size_t nodeId = 0; nodeId < numNodes; ++nodeId) { meshShape->setVertexPosition(nodeId, odeState.getPosition(nodeId)); } result = meshShape->update(); } return result; } } bool DeformableCollisionRepresentation::doInitialize() { bool result = false; if (nullptr != m_shape && m_shape->isValid()) { result = true; } return result; } bool DeformableCollisionRepresentation::doWakeUp() { auto physicsRepresentation = m_deformable.lock(); SURGSIM_ASSERT(nullptr != physicsRepresentation) << "The Physics::Representation referred by this DeformableCollisionRepresentation has expired."; auto state = physicsRepresentation->getCurrentState(); SURGSIM_ASSERT(nullptr != state) << "DeformableRepresentation " << physicsRepresentation->getName() << " holds an empty OdeState."; auto shape = std::dynamic_pointer_cast(m_shape); SURGSIM_ASSERT(shape != nullptr) << "The shape object is not inherited from DataStructures::VerticesPlain, but should be."; SURGSIM_ASSERT(shape->getNumVertices() == state->getNumNodes()) << "The number of nodes in the deformable does not match the number of vertices in the mesh."; update(0.0); return true; } int DeformableCollisionRepresentation::getShapeType() const { SURGSIM_ASSERT(nullptr != m_shape) << "No mesh/shape assigned to DeformableCollisionRepresentation " << getName(); return m_shape->getType(); } void DeformableCollisionRepresentation::setShape(std::shared_ptr shape) { SURGSIM_ASSERT(shape->getType() == SurgSim::Math::SHAPE_TYPE_MESH || shape->getType() == SurgSim::Math::SHAPE_TYPE_SEGMENTMESH || shape->getType() == SurgSim::Math::SHAPE_TYPE_SURFACEMESH) << "Deformable collision shape has to be a mesh. But what passed in is " << shape->getType(); m_shape = shape; } const std::shared_ptr DeformableCollisionRepresentation::getShape() const { return m_shape; } void DeformableCollisionRepresentation::setDeformableRepresentation( std::shared_ptrrepresentation) { m_deformable = representation; } const std::shared_ptr DeformableCollisionRepresentation::getDeformableRepresentation() const { auto physicsRepresentation = m_deformable.lock(); SURGSIM_ASSERT(physicsRepresentation != nullptr) << "Failed to get the deformable representation. The DeformableCollisionRepresentation either was not " "attached to a Physics::Representation or the Physics::Representation has expired."; return physicsRepresentation; } void DeformableCollisionRepresentation::updateShapeData() { auto physicsRepresentation = m_deformable.lock(); SURGSIM_ASSERT(nullptr != physicsRepresentation) << "Failed to update. The DeformableCollisionRepresentation either was not attached to a " "Physics::Representation or the Physics::Representation has expired."; // Write current shape if (!updateShapeFromOdeState(*physicsRepresentation->getCurrentState().get(), m_shape.get())) { setLocalActive(false); SURGSIM_LOG_SEVERE(Framework::Logger::getLogger("Collision/DeformableCollisionRepresentation")) << "CollisionRepresentation '" << getFullName() << "' went inactive because its shape failed to update."; } } void DeformableCollisionRepresentation::updateDcdData() { // HS-2-Mar-2016 // #todo should only have to build the AABB tree here } void DeformableCollisionRepresentation::updateCcdData(double interval) { auto physicsRepresentation = m_deformable.lock(); SURGSIM_ASSERT(nullptr != physicsRepresentation) << "Failed to update. The DeformableCollisionRepresentation either was not attached to a " "Physics::Representation or the Physics::Representation has expired."; if (m_previousShape == nullptr) { if (m_shape->getType() == SurgSim::Math::SHAPE_TYPE_MESH || m_shape->getType() == SurgSim::Math::SHAPE_TYPE_SEGMENTMESH || m_shape->getType() == SurgSim::Math::SHAPE_TYPE_SURFACEMESH) { m_previousShape = m_shape->getTransformed(Math::RigidTransform3d::Identity()); } else { SURGSIM_FAILURE() << "Invalid type, should be MeshShape(" << SurgSim::Math::SHAPE_TYPE_MESH << ") or SegmentMeshShape(" << SurgSim::Math::SHAPE_TYPE_SEGMENTMESH << ") or SurfaceMeshShape(" << SurgSim::Math::SHAPE_TYPE_SURFACEMESH <<"), but it is " << m_shape->getType(); } } if (!updateShapeFromOdeState(*physicsRepresentation->getPreviousState().get(), m_previousShape.get())) { setLocalActive(false); SURGSIM_LOG_SEVERE(SurgSim::Framework::Logger::getLogger("Collision/DeformableCollisionRepresentation")) << "CollisionRepresentation '" << getFullName() << "' went inactive because its shape failed to update."; } // Write current shape if (!updateShapeFromOdeState(*physicsRepresentation->getCurrentState().get(), m_shape.get())) { setLocalActive(false); SURGSIM_LOG_SEVERE(Framework::Logger::getLogger("Collision/DeformableCollisionRepresentation")) << "CollisionRepresentation '" << getFullName() << "' went inactive because its shape failed to update."; } Math::PosedShape> posedShapeFirst(m_previousShape, Math::RigidTransform3d::Identity()); Math::PosedShape> posedShapeSecond(m_shape, Math::RigidTransform3d::Identity()); Math::PosedShapeMotion> posedShapeMotion(posedShapeFirst, posedShapeSecond); setPosedShapeMotion(posedShapeMotion); // HS-2-Mar-2016 // #todo Add AABB tree for the posedShapeMotion (i.e. that is the tree where each bounding box consists of the // corresponding elements from posedShape1 and posedShape2 } } // namespace Physics } // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/DeformableCollisionRepresentation.h000066400000000000000000000057531277777236100261510ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_DEFORMABLECOLLISIONREPRESENTATION_H #define SURGSIM_PHYSICS_DEFORMABLECOLLISIONREPRESENTATION_H #include #include #include "SurgSim/Collision/Representation.h" #include "SurgSim/Framework/ObjectFactory.h" namespace SurgSim { namespace Math { class Shape; class MeshShape; } namespace Physics { class DeformableRepresentation; SURGSIM_STATIC_REGISTRATION(DeformableCollisionRepresentation); /// A collision representation that can be attached to a deformable, when this contains a mesh with the same number /// of vertices as the deformable has nodes, the mesh vertices will move to match the positions of the nodes in /// the deformable. class DeformableCollisionRepresentation : public SurgSim::Collision::Representation { public: /// Constructor /// \param name Name of the Representation explicit DeformableCollisionRepresentation(const std::string& name); /// Destructor virtual ~DeformableCollisionRepresentation(); SURGSIM_CLASSNAME(SurgSim::Physics::DeformableCollisionRepresentation); /// Set the shape for this collision representation, has to be a SurgSim::Math::MeshShape. /// The vertices in the mesh need to be the same number as the vertices in the deformable representation. /// \param shape The shape to be used. void setShape(std::shared_ptr shape); const std::shared_ptr getShape() const override; /// Sets the deformable to which this collision representation is connected /// \param representation The deformable that will be used to update the contained mesh void setDeformableRepresentation(std::shared_ptr representation); /// \return The deformable that is used to update the contained mesh const std::shared_ptr getDeformableRepresentation() const; int getShapeType() const override; void updateDcdData() override; void updateCcdData(double interval) override; void updateShapeData() override; private: bool doInitialize() override; bool doWakeUp() override; /// Shape used for collision detection std::shared_ptr m_shape, m_previousShape; /// Reference to the deformable driving changes to this mesh std::weak_ptr m_deformable; }; } // namespace Physics } // namespace SurgSim #endif opensurgsim-0.7.0/SurgSim/Physics/DeformableRepresentation.cpp000066400000000000000000000343461277777236100246300ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2012-2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Framework/SceneElement.h" #include "SurgSim/Framework/PoseComponent.h" #include "SurgSim/Math/LinearSparseSolveAndInverse.h" #include "SurgSim/Math/MathConvert.h" #include "SurgSim/Math/OdeSolverEulerExplicit.h" #include "SurgSim/Math/OdeSolverEulerExplicitModified.h" #include "SurgSim/Math/OdeSolverEulerImplicit.h" #include "SurgSim/Math/OdeSolverRungeKutta4.h" #include "SurgSim/Math/OdeSolverLinearEulerExplicit.h" #include "SurgSim/Math/OdeSolverLinearEulerExplicitModified.h" #include "SurgSim/Math/OdeSolverLinearEulerImplicit.h" #include "SurgSim/Math/OdeSolverLinearRungeKutta4.h" #include "SurgSim/Math/OdeSolverLinearStatic.h" #include "SurgSim/Math/OdeSolverStatic.h" #include "SurgSim/Math/OdeState.h" #include "SurgSim/Physics/DeformableRepresentation.h" #include "SurgSim/Physics/DeformableCollisionRepresentation.h" using SurgSim::Math::Matrix; using SurgSim::Math::OdeState; using SurgSim::Math::SparseMatrix; using SurgSim::Math::Vector; namespace SurgSim { namespace Physics { DeformableRepresentation::DeformableRepresentation(const std::string& name) : Representation(name), SurgSim::Math::OdeEquation(), m_numDofPerNode(0), m_integrationScheme(SurgSim::Math::INTEGRATIONSCHEME_EULER_EXPLICIT), m_linearSolver(SurgSim::Math::LINEARSOLVER_LU) { SURGSIM_ADD_SERIALIZABLE_PROPERTY(DeformableRepresentation, SurgSim::Math::IntegrationScheme, IntegrationScheme, getIntegrationScheme, setIntegrationScheme); SURGSIM_ADD_SERIALIZABLE_PROPERTY(DeformableRepresentation, SurgSim::Math::LinearSolver, LinearSolver, getLinearSolver, setLinearSolver); SURGSIM_ADD_SERIALIZABLE_PROPERTY(DeformableRepresentation, std::shared_ptr, CollisionRepresentation, getCollisionRepresentation, setCollisionRepresentation); } DeformableRepresentation::~DeformableRepresentation() { } void DeformableRepresentation::resetState() { Representation::resetState(); // Reminder: m_initialState is being held in OdeEquation *m_currentState = *m_initialState; *m_previousState = *m_initialState; // m_newState does not need to be reset, it is a temporary variable *m_finalState = *m_initialState; } void DeformableRepresentation::setLocalPose(const SurgSim::Math::RigidTransform3d& pose) { SURGSIM_ASSERT(!isInitialized()) << "Cannot set the local pose of a DeformableRepresentation after it has been initialized"; Representation::setLocalPose(pose); } void DeformableRepresentation::setInitialState( std::shared_ptr initialState) { // This initializes and allocates the m_initialState data member m_initialState = initialState; m_previousState = std::make_shared(*m_initialState); m_currentState = std::make_shared(*m_initialState); m_newState = std::make_shared(*m_initialState); m_finalState = std::make_shared(*m_initialState); // Set the representation number of degree of freedom setNumDof(m_initialState->getNumDof()); m_hasExternalGeneralizedForce = false; m_externalGeneralizedForce.setZero(getNumDof()); m_externalGeneralizedStiffness.resize(static_cast(getNumDof()), static_cast(getNumDof())); m_externalGeneralizedDamping.resize(static_cast(getNumDof()), static_cast(getNumDof())); m_previousHasExternalGeneralizedForce = m_hasExternalGeneralizedForce; m_previousExternalGeneralizedStiffness = m_externalGeneralizedStiffness; m_previousExternalGeneralizedDamping = m_externalGeneralizedDamping; } const std::shared_ptr DeformableRepresentation::getCurrentState() const { return m_currentState; } const std::shared_ptr DeformableRepresentation::getPreviousState() const { return m_previousState; } const std::shared_ptr DeformableRepresentation::getFinalState() const { return m_finalState; } size_t DeformableRepresentation::getNumDofPerNode() const { return m_numDofPerNode; } void DeformableRepresentation::setIntegrationScheme(SurgSim::Math::IntegrationScheme integrationScheme) { SURGSIM_ASSERT(!isInitialized()) << "You cannot set the integration scheme after the component has been initialized"; m_integrationScheme = integrationScheme; } SurgSim::Math::IntegrationScheme DeformableRepresentation::getIntegrationScheme() const { return m_integrationScheme; } std::shared_ptr DeformableRepresentation::getOdeSolver() const { return m_odeSolver; } void DeformableRepresentation::setLinearSolver(SurgSim::Math::LinearSolver linearSolver) { SURGSIM_ASSERT(!isInitialized()) << "You cannot set the linear solver after the component has been initialized"; m_linearSolver = linearSolver; } SurgSim::Math::LinearSolver DeformableRepresentation::getLinearSolver() const { return m_linearSolver; } const SurgSim::Math::Vector& DeformableRepresentation::getExternalGeneralizedForce() const { return m_externalGeneralizedForce; } const SurgSim::Math::SparseMatrix& DeformableRepresentation::getExternalGeneralizedStiffness() const { return m_externalGeneralizedStiffness; } const SurgSim::Math::SparseMatrix& DeformableRepresentation::getExternalGeneralizedDamping() const { return m_externalGeneralizedDamping; } Math::Matrix DeformableRepresentation::applyCompliance(const Math::OdeState& state, const Math::Matrix& b) { SURGSIM_ASSERT(m_odeSolver) << "Ode solver not initialized, it should have been initialized on wake-up"; Math::Matrix bTemp = b; for (auto condition : state.getBoundaryConditions()) { Math::zeroRow(condition, &bTemp); } auto solution = m_odeSolver->getLinearSolver()->solve(bTemp); for (auto condition : state.getBoundaryConditions()) { Math::zeroRow(condition, &solution); } return solution; } const SurgSim::Math::Matrix& DeformableRepresentation::getComplianceMatrix() const { SURGSIM_ASSERT(m_odeSolver) << "Ode solver not initialized, it should have been initialized on wake-up"; return m_odeSolver->getComplianceMatrix(); } void DeformableRepresentation::update(double dt) { if (! isActive()) { return; } SURGSIM_ASSERT(m_odeSolver != nullptr) << "Ode solver has not been set yet. Did you call beforeUpdate() ?"; SURGSIM_ASSERT(m_initialState != nullptr) << "Initial state has not been set yet. Did you call setInitialState() ?"; // Solve the ode m_odeSolver->solve(dt, *m_currentState, m_newState.get()); // Back up the current state into the previous state (by swapping) m_currentState.swap(m_previousState); // Make the new state, the current state (by swapping) m_currentState.swap(m_newState); if (!m_currentState->isValid()) { SURGSIM_LOG(SurgSim::Framework::Logger::getDefaultLogger(), DEBUG) << getName() << " deactivated :" << std::endl << "position=(" << m_currentState->getPositions().transpose() << ")" << std::endl << "velocity=(" << m_currentState->getVelocities().transpose() << ")" << std::endl; setLocalActive(false); } } void DeformableRepresentation::afterUpdate(double dt) { if (! isActive()) { return; } driveSceneElementPose(SurgSim::Math::RigidTransform3d::Identity()); // Back up the current state into the final state // #threadsafety *m_finalState = *m_currentState; // Reset the external generalized force, stiffness and damping m_previousHasExternalGeneralizedForce = m_hasExternalGeneralizedForce; if (m_hasExternalGeneralizedForce) { std::swap(m_previousExternalGeneralizedStiffness, m_externalGeneralizedStiffness); std::swap(m_previousExternalGeneralizedDamping, m_externalGeneralizedDamping); m_externalGeneralizedForce.setZero(); m_externalGeneralizedStiffness.setZero(); m_externalGeneralizedDamping.setZero(); m_hasExternalGeneralizedForce = false; } } void DeformableRepresentation::applyCorrection(double dt, const Eigen::VectorBlock& deltaVelocity) { if (!isActive()) { return; } m_currentState->getPositions() += deltaVelocity * dt; m_currentState->getVelocities() += deltaVelocity; if (!m_currentState->isValid()) { SURGSIM_LOG(SurgSim::Framework::Logger::getDefaultLogger(), DEBUG) << getName() << " deactivated :" << std::endl << "position=(" << m_currentState->getPositions() << ")" << std::endl << "velocity=(" << m_currentState->getVelocities() << ")" << std::endl; setLocalActive(false); } } void DeformableRepresentation::deactivateAndReset() { SURGSIM_LOG(SurgSim::Framework::Logger::getDefaultLogger(), DEBUG) << getName() << " deactivated and reset:" << std::endl << "position=(" << m_currentState->getPositions() << ")" << std::endl << "velocity=(" << m_currentState->getVelocities() << ")" << std::endl; resetState(); setLocalActive(false); } void DeformableRepresentation::setCollisionRepresentation( std::shared_ptr representation) { if (m_collisionRepresentation != representation) { // If we have an old collision representation clear the dependency if it was a deformable collision // representation auto oldCollisionRep = std::dynamic_pointer_cast(m_collisionRepresentation); if (oldCollisionRep != nullptr) { oldCollisionRep->setDeformableRepresentation(nullptr); } Representation::setCollisionRepresentation(representation); // If its a RigidCollisionRepresentation connect with this representation auto newCollisionRep = std::dynamic_pointer_cast(representation); if (newCollisionRep != nullptr) { newCollisionRep->setDeformableRepresentation( std::static_pointer_cast(getSharedPtr())); } } } bool DeformableRepresentation::doInitialize() { SURGSIM_ASSERT(m_initialState != nullptr) << "You must set the initial state before calling Initialize"; // Transform the state with the initial pose transformState(m_initialState, getPose()); *m_previousState = *m_initialState; *m_currentState = *m_initialState; *m_newState = *m_initialState; *m_finalState = *m_initialState; // Since the pose is now embedded in the state, reset element and local pose to identity. setLocalPose(SurgSim::Math::RigidTransform3d::Identity()); std::shared_ptr sceneElement = getSceneElement(); if (sceneElement != nullptr) { sceneElement->setPose(SurgSim::Math::RigidTransform3d::Identity()); } // Set the ode solver using the chosen integration scheme switch (m_integrationScheme) { case SurgSim::Math::INTEGRATIONSCHEME_EULER_EXPLICIT: m_odeSolver = std::make_shared(this); break; case SurgSim::Math::INTEGRATIONSCHEME_EULER_EXPLICIT_MODIFIED: m_odeSolver = std::make_shared(this); break; case SurgSim::Math::INTEGRATIONSCHEME_EULER_IMPLICIT: m_odeSolver = std::make_shared(this); break; case SurgSim::Math::INTEGRATIONSCHEME_STATIC: m_odeSolver = std::make_shared(this); break; case SurgSim::Math::INTEGRATIONSCHEME_RUNGE_KUTTA_4: m_odeSolver = std::make_shared(this); break; case SurgSim::Math::INTEGRATIONSCHEME_LINEAR_EULER_EXPLICIT: m_odeSolver = std::make_shared(this); break; case SurgSim::Math::INTEGRATIONSCHEME_LINEAR_EULER_EXPLICIT_MODIFIED: m_odeSolver = std::make_shared(this); break; case SurgSim::Math::INTEGRATIONSCHEME_LINEAR_EULER_IMPLICIT: m_odeSolver = std::make_shared(this); break; case SurgSim::Math::INTEGRATIONSCHEME_LINEAR_STATIC: m_odeSolver = std::make_shared(this); break; case SurgSim::Math::INTEGRATIONSCHEME_LINEAR_RUNGE_KUTTA_4: m_odeSolver = std::make_shared(this); break; default: SURGSIM_LOG_WARNING(SurgSim::Framework::Logger::getDefaultLogger()) << "Ode solver (integration scheme) not initialized, the integration scheme is invalid"; return false; } // Set the linear solver with initial settings on the ode solver switch (m_linearSolver) { case SurgSim::Math::LINEARSOLVER_LU: m_odeSolver->setLinearSolver(std::make_shared()); break; case SurgSim::Math::LINEARSOLVER_CONJUGATEGRADIENT: m_odeSolver->setLinearSolver(std::make_shared()); break; default: SURGSIM_LOG_WARNING(SurgSim::Framework::Logger::getDefaultLogger()) << "Linear solver not initialized, the linear solver is invalid"; return false; } return true; } bool DeformableRepresentation::doWakeUp() { std::shared_ptr sceneElement = getSceneElement(); if (sceneElement != nullptr) { bool isIdentity = sceneElement->getPose().isApprox(SurgSim::Math::RigidTransform3d::Identity()); auto logger = SurgSim::Framework::Logger::getLogger("Physics"); SURGSIM_LOG_IF(!isIdentity, logger, WARNING) << "SceneElement '" << sceneElement->getName() << "' pose has been changed in between initialize() " << "and wakeUp() which can produce unrealistic behavior for the DeformableRepresentation '" << getName() << "'"; } return true; } void DeformableRepresentation::interpolatePreviousState(double t) { m_previousState = std::make_shared(getPreviousState()->interpolate(*getCurrentState(), t)); } }; // namespace Physics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/DeformableRepresentation.h000066400000000000000000000217361277777236100242740ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file DeformableRepresentation.h /// Base class for all deformable representations (abstract class) #ifndef SURGSIM_PHYSICS_DEFORMABLEREPRESENTATION_H #define SURGSIM_PHYSICS_DEFORMABLEREPRESENTATION_H #include #include "SurgSim/Math/LinearSparseSolveAndInverse.h" #include "SurgSim/Math/Matrix.h" #include "SurgSim/Math/OdeEquation.h" #include "SurgSim/Math/OdeSolver.h" #include "SurgSim/Math/OdeState.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/Representation.h" namespace SurgSim { namespace Physics { class Localization; /// Base class for all deformable representations MassSprings, Finite Element Models,... /// \note It is both a Physics::Representation and a Math::OdeEquation /// \note It holds the representation states (common to all deformable) except the initial state, /// \note which is being held by the OdeEquation (initial condition of the ode problem). /// \note It holds the initial pose, which should be set before setting the initial state so the states /// \note can be properly transformed. /// \note The current pose is always identity and therefore cannot be set. Calling setPose will raise an exception. /// \note It holds the force vector; the mass, damping and stiffness matrices /// \note Derived classes must implement the Representation API and the OdeEquation API, also set /// \note m_numDofPerNode and call Representation::setNumDof() class DeformableRepresentation : public Representation, public SurgSim::Math::OdeEquation { public: /// Constructor /// \param name The deformable representation's name explicit DeformableRepresentation(const std::string& name); /// Destructor virtual ~DeformableRepresentation(); void resetState() override; /// Initialize the state variables to initialState /// \param initialState is the state to be set as the starting state virtual void setInitialState(std::shared_ptr initialState); /// Return the current state of the deformable representation /// \return the current state virtual const std::shared_ptr getCurrentState() const; /// Return the previous state of the deformable representation /// \return the previous state virtual const std::shared_ptr getPreviousState() const; /// Return the final state of the deformable representation /// \return the final state virtual const std::shared_ptr getFinalState() const; /// Declare a new previous state by interpolating between the old previous /// state and the current state using parametric time variable t /// \param t parametric time at which to calculate the new state virtual void interpolatePreviousState(double t); /// Gets the number of degrees of freedom per node /// \return The number of degrees of freedom per node for this Deformable Representation size_t getNumDofPerNode() const; /// Sets the numerical integration scheme /// \param integrationScheme The integration scheme to use /// \exception SurgSim::Framework::AssertionFailure raised if called after the component has been initialized. void setIntegrationScheme(SurgSim::Math::IntegrationScheme integrationScheme); /// Gets the numerical integration scheme /// \return The integration scheme currently in use /// \note Default is SurgSim::Math::INTEGRATIONSCHEME_EULER_EXPLICIT SurgSim::Math::IntegrationScheme getIntegrationScheme() const; /// \return The ode solver (dependent on the integration scheme) /// \note Will return nullptr if called before initialization. std::shared_ptr getOdeSolver() const; /// Sets the linear algebraic solver /// \param linearSolver The linear algebraic solver to use /// \exception SurgSim::Framework::AssertionFailure raised if called after the component has been initialized. void setLinearSolver(SurgSim::Math::LinearSolver linearSolver); /// Gets the linear algebraic solver /// \return The linear solver currently in use /// \note Default is SurgSim::Math::LINEARSOLVER_LU SurgSim::Math::LinearSolver getLinearSolver() const; /// Add an external generalized force applied on a specific localization /// \param localization where the generalized force is applied /// \param generalizedForce The force to apply (of dimension getNumDofPerNode()) /// \param K The stiffness matrix associated with the generalized force (Jacobian of the force w.r.t dof's position) /// \param D The damping matrix associated with the generalized force (Jacobian of the force w.r.t dof's velocity) virtual void addExternalGeneralizedForce(std::shared_ptr localization, const SurgSim::Math::Vector& generalizedForce, const SurgSim::Math::Matrix& K = SurgSim::Math::Matrix(), const SurgSim::Math::Matrix& D = SurgSim::Math::Matrix()) = 0; /// \return the external generalized force vector const SurgSim::Math::Vector& getExternalGeneralizedForce() const; /// \return the external generalized stiffness matrix const SurgSim::Math::SparseMatrix& getExternalGeneralizedStiffness() const; /// \return the external generalized damping matrix const SurgSim::Math::SparseMatrix& getExternalGeneralizedDamping() const; Math::Matrix applyCompliance(const Math::OdeState& state, const Math::Matrix& b) override; /// Gets the compliance matrix associated with motion virtual const SurgSim::Math::Matrix& getComplianceMatrix() const; void update(double dt) override; void afterUpdate(double dt) override; void applyCorrection(double dt, const Eigen::VectorBlock& deltaVelocity) override; /// Deactivate and call resetState void deactivateAndReset(); /// Set the collision representation for this physics representation, when the collision object /// is involved in a collision, the collision should be resolved inside the dynamics calculation. /// Specializes for discarding anything besides a rigid collision representation. /// \param representation The collision representation to be used. void setCollisionRepresentation(std::shared_ptr representation) override; void setLocalPose(const SurgSim::Math::RigidTransform3d& pose) override; protected: bool doInitialize() override; bool doWakeUp() override; /// Transform a state using a given transformation /// \param[in,out] state The state to be transformed /// \param transform The transformation to apply virtual void transformState(std::shared_ptr state, const SurgSim::Math::RigidTransform3d& transform) = 0; /// The previous state inside the calculation loop, this has no meaning outside of the loop std::shared_ptr m_previousState; /// The currently calculated state inside the physics loop, after the whole calculation is done this will /// become m_finalState std::shared_ptr m_currentState; /// New state is a temporary variable to store the newly computed state std::shared_ptr m_newState; /// Last valid state (a.k.a final state) /// \note Backup of the current state for thread-safety access while the current state is being recomputed. std::shared_ptr m_finalState; /// External generalized force, stiffness and damping applied on the deformable representation /// @{ bool m_hasExternalGeneralizedForce; SurgSim::Math::Vector m_externalGeneralizedForce; SurgSim::Math::SparseMatrix m_externalGeneralizedStiffness; SurgSim::Math::SparseMatrix m_externalGeneralizedDamping; bool m_previousHasExternalGeneralizedForce; SurgSim::Math::SparseMatrix m_previousExternalGeneralizedStiffness; SurgSim::Math::SparseMatrix m_previousExternalGeneralizedDamping; /// @} /// Number of degrees of freedom per node (varies per deformable model) /// \note MUST be set by the derived classes size_t m_numDofPerNode; /// Numerical Integration scheme (dynamic explicit/implicit solver) SurgSim::Math::IntegrationScheme m_integrationScheme; /// Linear algebraic solver used SurgSim::Math::LinearSolver m_linearSolver; /// Ode solver (its type depends on the numerical integration scheme) std::shared_ptr m_odeSolver; private: /// NO copy constructor DeformableRepresentation(const DeformableRepresentation&); /// NO assignment operator DeformableRepresentation& operator =(const DeformableRepresentation&); }; }; // namespace Physics }; // namespace SurgSim #endif // SURGSIM_PHYSICS_DEFORMABLEREPRESENTATION_H opensurgsim-0.7.0/SurgSim/Physics/Fem-inl.h000066400000000000000000000062721277777236100205760ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_FEM_INL_H #define SURGSIM_PHYSICS_FEM_INL_H #include "SurgSim/DataStructures/PlyReader.h" #include "SurgSim/Framework/Log.h" using SurgSim::DataStructures::PlyReader; namespace SurgSim { namespace Physics { template Fem::Fem() { } template size_t Fem::addElement(std::shared_ptr element) { m_elements.push_back(element); return m_elements.size() - 1; } template size_t Fem::getNumElements() const { return m_elements.size(); } template const std::vector>& Fem::getElements() const { return m_elements; } template std::vector>& Fem::getElements() { return m_elements; } template std::shared_ptr Fem::getElement(size_t id) const { return m_elements[id]; } template size_t Fem::addBoundaryCondition(size_t boundaryCondition) { m_boundaryConditions.push_back(boundaryCondition); return m_boundaryConditions.size() - 1; } template const std::vector& Fem::getBoundaryConditions() const { return m_boundaryConditions; } template std::vector& Fem::getBoundaryConditions() { return m_boundaryConditions; } template size_t Fem::getBoundaryCondition(size_t id) const { return m_boundaryConditions[id]; } template template bool Fem::loadFemFile(const std::string& filename) { SurgSim::DataStructures::PlyReader reader(filename); if (!reader.isValid()) { SURGSIM_LOG_SEVERE(SurgSim::Framework::Logger::getDefaultLogger()) << "'" << filename << "' is an invalid .ply file."; return false; } auto delegate = std::make_shared( std::dynamic_pointer_cast(this->shared_from_this())); if (!reader.parseWithDelegate(delegate)) { SURGSIM_LOG_SEVERE(SurgSim::Framework::Logger::getDefaultLogger()) << "The input file '" << filename << "' does not have the property required by FEM element mesh."; return false; } return true; } } // namespace Physics } // namespace SurgSim #endif // SURGSIM_PHYSICS_FEM_INL_H opensurgsim-0.7.0/SurgSim/Physics/Fem.h000066400000000000000000000075061277777236100200170ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_FEM_H #define SURGSIM_PHYSICS_FEM_H #include "SurgSim/DataStructures/Vertices.h" #include "SurgSim/Framework/Asset.h" #include "SurgSim/Physics/FemElementStructs.h" namespace SurgSim { namespace Physics { /// Base class for a data structure for holding FEM mesh data of different dimensions /// /// Fem itself should not be used directly itself as it contains no override for doLoad since the implementation is /// dependent on the dimension of the FEM you are trying to load. Each dimension overrides the doLoad function present /// in Asset using its own version of an FemPlyReaderDelegate. Each dimension supports loading both linear and /// corotational models. /// /// \tparam VertexData Type of extra data stored in each vertex /// \tparam Element Type of FEM element the mesh will be storing /// \sa TriangleMesh template class Fem : public SurgSim::DataStructures::Vertices, public SurgSim::Framework::Asset, public std::enable_shared_from_this> { public: /// Default constructor Fem(); /// Adds FEM element to mesh of Element template type /// \param element A shared pointer of the Element template type /// \return The new size of the vector of elements size_t addElement(std::shared_ptr element); /// Gets number of FEM elements in the mesh /// \return The number of FEM elements stored size_t getNumElements() const; /// Gets entire FEM element vector /// \return A const vector of all FEM elements stored in the mesh const std::vector>& getElements() const; /// Gets entire FEM element vector (non-const) /// \return A vector of all FEM elements stored in the mesh std::vector>& getElements(); /// Retrieve a specific element from the mesh /// \param id The id in the element vector /// \return A shared pointer to the element std::shared_ptr getElement(size_t id) const; /// Add boundary condition to mesh /// \param boundaryCondition A vertex id that has a boundary condition /// \return The new size of the vector of boundary conditions size_t addBoundaryCondition(size_t boundaryCondition); /// Gets entire vector of boundary conditions /// \return A vector of boundary conditions const std::vector& getBoundaryConditions() const; /// Gets entire vector of boundary conditions (non-const) /// \return A vector of boundary conditions std::vector& getBoundaryConditions(); /// Retrieves a specific boundary condition /// \param id The id of the boundary condition in the vector /// \return The vertex id which has a boundary condition size_t getBoundaryCondition(size_t id) const; protected: /// Shared loading method for all 3 dimensions /// \note Assign template class to the proper dimension PlyReaderDelegate template bool loadFemFile(const std::string& filename); /// Vector of individual elements std::vector> m_elements; /// Vector of vertex ids that have boundary conditions std::vector m_boundaryConditions; }; } // namespace Physics } // namespace SurgSim #include "SurgSim/Physics/Fem-inl.h" #endif // SURGSIM_PHYSICS_FEM_H opensurgsim-0.7.0/SurgSim/Physics/Fem1D.cpp000066400000000000000000000020171277777236100205270ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Physics/Fem1D.h" #include "SurgSim/Physics/Fem1DPlyReaderDelegate.h" namespace SurgSim { namespace Physics { SURGSIM_REGISTER(SurgSim::Framework::Asset, SurgSim::Physics::Fem1D, Fem1D) Fem1D::Fem1D() { } bool Fem1D::doLoad(const std::string& filePath) { return loadFemFile(filePath); } } // namespace Physics } // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/Fem1D.h000066400000000000000000000023451277777236100202000ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_FEM1D_H #define SURGSIM_PHYSICS_FEM1D_H #include "SurgSim/Physics/Fem.h" namespace SurgSim { namespace Physics { SURGSIM_STATIC_REGISTRATION(Fem1D); /// Fem class data structure implementation for 1-Dimensional FEMs /// \sa Fem class Fem1D : public Fem { public: Fem1D(); SURGSIM_CLASSNAME(SurgSim::Physics::Fem1D); protected: // Asset API override bool doLoad(const std::string& filePath) override; }; } // namespace Physics } // namespace SurgSim #endif // SURGSIM_PHYSICS_FEM1D_H opensurgsim-0.7.0/SurgSim/Physics/Fem1DElementBeam.cpp000066400000000000000000000276511277777236100226410ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Framework/Log.h" #include "SurgSim/Math/Geometry.h" #include "SurgSim/Math/OdeEquation.h" #include "SurgSim/Math/OdeState.h" #include "SurgSim/Physics/Fem1DElementBeam.h" using SurgSim::Math::addSubVector; using SurgSim::Math::getSubMatrix; using SurgSim::Math::getSubVector; using SurgSim::Math::setSubMatrix; using SurgSim::Math::Vector; using SurgSim::Math::Vector3d; namespace SurgSim { namespace Physics { SURGSIM_REGISTER(SurgSim::Physics::FemElement, SurgSim::Physics::Fem1DElementBeam, Fem1DElementBeam) Fem1DElementBeam::Fem1DElementBeam() { initializeMembers(); } Fem1DElementBeam::Fem1DElementBeam(std::array nodeIds) { initializeMembers(); m_nodeIds.assign(nodeIds.cbegin(), nodeIds.cend()); } Fem1DElementBeam::Fem1DElementBeam(std::shared_ptr elementData) { initializeMembers(); auto element1DData = std::dynamic_pointer_cast(elementData); SURGSIM_ASSERT(element1DData != nullptr) << "Incorrect struct type passed"; SURGSIM_ASSERT(element1DData->nodeIds.size() == 2) << "Incorrect number of nodes for a Fem1D Beam"; m_nodeIds.assign(element1DData->nodeIds.begin(), element1DData->nodeIds.end()); setShearingEnabled(element1DData->enableShear); setRadius(element1DData->radius); setMassDensity(element1DData->massDensity); setPoissonRatio(element1DData->poissonRatio); setYoungModulus(element1DData->youngModulus); } void Fem1DElementBeam::setRadius(double radius) { SURGSIM_ASSERT(radius != 0.0) << "The beam radius cannot be set to 0"; SURGSIM_ASSERT(radius > 0.0) << "The beam radius cannot be negative (trying to set it to " << radius << ")"; m_radius = radius; } double Fem1DElementBeam::getRadius() const { return m_radius; } bool Fem1DElementBeam::getShearingEnabled() const { return m_haveShear; } void Fem1DElementBeam::setShearingEnabled(bool enabled) { m_haveShear = enabled; } double Fem1DElementBeam::getVolume(const SurgSim::Math::OdeState& state) const { const Vector3d A = state.getPosition(m_nodeIds[0]); const Vector3d B = state.getPosition(m_nodeIds[1]); return m_A * (B - A).norm(); } void Fem1DElementBeam::initializeMembers() { m_G = 0.0; m_restLength = 0.0; m_radius = 0.0; m_A = 0.0; m_haveShear = true; m_shearFactor = (5.0 / 8.0); m_Asy = 0.0; m_Asz = 0.0; m_Phi_y = 0.0; m_Phi_z = 0.0; m_Iy = 0.0; m_Iz = 0.0; m_J = 0.0; // 6 dof per node (x, y, z, thetaX, thetaY, thetaZ) setNumDofPerNode(6); } void Fem1DElementBeam::initialize(const SurgSim::Math::OdeState& state) { // Test the validity of the physical parameters FemElement::initialize(state); SURGSIM_ASSERT(m_radius > 0) << "Fem1DElementBeam radius should be positive and non-zero. Did you call " "setCrossSectionCircular(radius) ?"; m_A = M_PI * (m_radius * m_radius); m_Iz = M_PI * (m_radius * m_radius * m_radius * m_radius) / 4.0; m_Iy = m_Iz; m_J = m_Iz + m_Iy; // Store the rest state for this beam in m_x0 getSubVector(state.getPositions(), m_nodeIds, 6, &m_x0); m_restLength = (m_x0.segment<3>(6) - m_x0.segment<3>(0)).norm(); SURGSIM_ASSERT(m_restLength > 0) << "Fem1DElementBeam rest length is zero (degenerate beam)"; computeInitialRotation(state); // Pre-compute the mass and stiffness matrix computeMass(state); computeStiffness(state); } SurgSim::Math::Matrix33d Fem1DElementBeam::getInitialRotation() const { return m_R0.block<3, 3>(0, 0); } void Fem1DElementBeam::computeMass(const SurgSim::Math::OdeState& state) { double& L = m_restLength; double L2 = L * L; double AL = m_A * L; double AL2 = AL * L; double m = AL * m_rho; m_MLocal.setZero(); // From pg 294 of "Theory of Matrix Structural Analysis" from J.S. Przemieniecki: // Mass matrix for node0 / node0 m_MLocal(0, 0) = 1.0 / 3.0; m_MLocal(1, 1) = 13.0 / 35.0 + 6.0 * m_Iz / (5.0 * AL2); m_MLocal(1, 5) = 11.0 * L / 210.0 + m_Iz / (10.0 * AL); m_MLocal(2, 2) = 13.0 / 35.0 + 6.0 * m_Iy / (5.0 * AL2); m_MLocal(2, 4) = -11.0 * L / 210.0 - m_Iy / (10.0 * AL); m_MLocal(3, 3) = m_J / (3.0 * m_A); m_MLocal(4, 2) = -11.0 * L / 210.0 - m_Iy / (10.0 * AL); m_MLocal(4, 4) = L2 / 105.0 + 2.0 * m_Iy / (15.0 * m_A); m_MLocal(5, 1) = 11.0 * L / 210.0 + m_Iz / (10.0 * AL); m_MLocal(5, 5) = L2 / 105.0 + 2.0 * m_Iz / (15.0 * m_A); // Mass matrix for node1 / node1 m_MLocal(6, 6) = 1.0 / 3.0; m_MLocal(7, 7) = 13.0 / 35.0 + 6.0 * m_Iz / (5.0 * AL2); m_MLocal(7, 11) = -11.0 * L / 210.0 - m_Iz / (10.0 * AL); m_MLocal(8, 8) = 13.0 / 35.0 + 6.0 * m_Iy / (5.0 * AL2); m_MLocal(8, 10) = 11.0 * L / 210.0 + m_Iy / (10.0 * AL); m_MLocal(9, 9) = m_J / (3.0 * m_A); m_MLocal(10, 8) = 11.0 * L / 210.0 + m_Iy / (10.0 * AL); m_MLocal(10, 10) = L2 / 105.0 + 2.0 * m_Iy / (15.0 * m_A); m_MLocal(11, 7) = -11.0 * L / 210.0 - m_Iz / (10.0 * AL); m_MLocal(11, 11) = L2 / 105.0 + 2.0 * m_Iz / (15.0 * m_A); // Mass matrix for node1 / node0 m_MLocal(6, 0) = 1.0 / 6.0; m_MLocal(7, 1) = 9.0 / 70.0 - 6.0 * m_Iz / (5.0 * AL2); m_MLocal(7, 5) = 13.0 * L / 420.0 - m_Iz / (10.0 * AL); m_MLocal(8, 2) = 9.0 / 70.0 - 6.0 * m_Iy / (5.0 * AL2); m_MLocal(8, 4) = -13.0 * L / 420.0 + m_Iy / (10.0 * AL); m_MLocal(9, 3) = m_J / (6.0 * m_A); m_MLocal(10, 2) = 13.0 * L / 420.0 - m_Iy / (10.0 * AL); m_MLocal(10, 4) = -L2 / 140.0 - m_Iy / (30.0 * m_A); m_MLocal(11, 1) = -13.0 * L / 420.0 + m_Iz / (10.0 * AL); m_MLocal(11, 5) = -L2 / 140.0 - m_Iz / (30.0 * m_A); // Mass matrix for node0 / node1 m_MLocal(0, 6) = 1.0 / 6.0; m_MLocal(1, 7) = 9.0 / 70.0 - 6.0 * m_Iz / (5.0 * AL2); m_MLocal(1, 11) = -13.0 * L / 420.0 + m_Iz / (10.0 * AL); m_MLocal(2, 8) = 9.0 / 70.0 - 6.0 * m_Iy / (5.0 * AL2); m_MLocal(2, 10) = 13.0 * L / 420.0 - m_Iy / (10.0 * AL); m_MLocal(3, 9) = m_J / (6.0 * m_A); m_MLocal(4, 8) = -13.0 * L / 420.0 + m_Iy / (10.0 * AL); m_MLocal(4, 10) = -L2 / 140.0 - m_Iy / (30.0 * m_A); m_MLocal(5, 7) = 13.0 * L / 420.0 - m_Iz / (10.0 * AL); m_MLocal(5, 11) = -L2 / 140.0 - m_Iz / (30.0 * m_A); m_MLocal *= m; // Transformation Local -> Global m_M = m_R0 * m_MLocal * m_R0.transpose(); } void Fem1DElementBeam::computeStiffness(const SurgSim::Math::OdeState& state) { double& L = m_restLength; double L2 = L * L; double L3 = L2 * L; // General expression for shear modulus in terms of Young's modulus and Poisson's ratio m_G = m_E / (2.0 * (1.0 + m_nu)); if (m_haveShear) { // Special values for solid cross sections. m_Asy = m_A * 5.0 / 6.0; m_Asz = m_A * 5.0 / 6.0; // From pg 80 of "Theory of Matrix Structural Analysis" from J.S. Przemieniecki: m_Phi_y = 12.0 * m_E * m_Iz / (m_G * m_Asy * L2); m_Phi_z = 12.0 * m_E * m_Iy / (m_G * m_Asz * L2); } else { m_Asy = 0.0; m_Asz = 0.0; m_Phi_y = 0.0; m_Phi_z = 0.0; } m_KLocal.setZero(); // From pg 79 of "Theory of Matrix Structural Analysis" from J.S. Przemieniecki: // Stiffness matrix node 1 / node 1 m_KLocal(0, 0) = m_E * m_A / L; m_KLocal(1, 1) = 12 * m_E * m_Iz / (L3 * (1 + m_Phi_y)); m_KLocal(2, 2) = 12 * m_E * m_Iy / (L3 * (1 + m_Phi_z)); m_KLocal(3, 3) = m_G * m_J / L; m_KLocal(4, 4) = (4 + m_Phi_z) * m_E * m_Iy / (L * (1 + m_Phi_z)); m_KLocal(4, 2) = -6 * m_E * m_Iy / (L2 * (1 + m_Phi_z)); // Symmetric m_KLocal(2, 4) = -6 * m_E * m_Iy / (L2 * (1 + m_Phi_z)); // Symmetric m_KLocal(5, 5) = (4 + m_Phi_y) * m_E * m_Iz / (L * (1 + m_Phi_y)); m_KLocal(5, 1) = 6 * m_E * m_Iz / (L2 * (1 + m_Phi_y)); // Symmetric m_KLocal(1, 5) = 6 * m_E * m_Iz / (L2 * (1 + m_Phi_y)); // Symmetric // Stiffness matrix node 2 / node 2 m_KLocal(6, 6) = m_E * m_A / L; m_KLocal(7, 7) = 12 * m_E * m_Iz / (L3 * (1 + m_Phi_y)); m_KLocal(8, 8) = 12 * m_E * m_Iy / (L3 * (1 + m_Phi_z)); m_KLocal(9, 9) = m_G * m_J / L; m_KLocal(10, 10) = (4 + m_Phi_z) * m_E * m_Iy / (L * (1 + m_Phi_z)); m_KLocal(10, 8) = 6 * m_E * m_Iy / (L2 * (1 + m_Phi_z)); // Symmetric m_KLocal(8, 10) = 6 * m_E * m_Iy / (L2 * (1 + m_Phi_z)); // Symmetric m_KLocal(11, 11) = (4 + m_Phi_y) * m_E * m_Iz / (L * (1 + m_Phi_y)); m_KLocal(11, 7) = -6 * m_E * m_Iz / (L2 * (1 + m_Phi_y)); // Symmetric m_KLocal(7, 11) = -6 * m_E * m_Iz / (L2 * (1 + m_Phi_y)); // Symmetric // Stiffness matrix node 2 / node 1 m_KLocal(6, 0) = -m_E * m_A / L; m_KLocal(7, 1) = -12 * m_E * m_Iz / (L3 * (1 + m_Phi_y)); m_KLocal(8, 2) = -12 * m_E * m_Iy / (L3 * (1 + m_Phi_z)); m_KLocal(9, 3) = -m_G * m_J / L; m_KLocal(10, 4) = (2 - m_Phi_z) * m_E * m_Iy / (L * (1 + m_Phi_z)); m_KLocal(10, 2) = -6 * m_E * m_Iy / (L2 * (1 + m_Phi_z)); // Anti-symmetric m_KLocal(8, 4) = -m_KLocal(10, 2); // Anti-symmetric m_KLocal(11, 5) = (2 - m_Phi_y) * m_E * m_Iz / (L * (1 + m_Phi_y)); m_KLocal(11, 1) = 6 * m_E * m_Iz / (L2 * (1 + m_Phi_y)); // Anti-symmetric m_KLocal(7, 5) = -m_KLocal(11, 1); // Anti-symmetric // Stiffness matrix node 1 / node 2 (symmetric of node 2 / node 1) m_KLocal(0, 6) = m_KLocal(6, 0); m_KLocal(1, 7) = m_KLocal(7, 1); m_KLocal(2, 8) = m_KLocal(8, 2); m_KLocal(3, 9) = m_KLocal(9, 3); m_KLocal(4, 10) = m_KLocal(10, 4); m_KLocal(2, 10) = m_KLocal(10, 2); m_KLocal(4, 8) = m_KLocal(8, 4); m_KLocal(5, 11) = m_KLocal(11, 5); m_KLocal(1, 11) = m_KLocal(11, 1); m_KLocal(5, 7) = m_KLocal(7, 5); // Transformation Local -> Global m_K = m_R0 * m_KLocal * m_R0.transpose(); } void Fem1DElementBeam::computeInitialRotation(const SurgSim::Math::OdeState& state) { // Build (i, j, k) an orthonormal frame const Vector3d A = state.getPosition(m_nodeIds[0]); const Vector3d B = state.getPosition(m_nodeIds[1]); Vector3d i = B - A; Vector3d j, k; SURGSIM_ASSERT(SurgSim::Math::buildOrthonormalBasis(&i, &j, &k)) << "Invalid beam formed by extremities A=(" << A.transpose() << ") B=(" << B.transpose() << ")"; // Set up a temporary 3x3 initial rotation matrix SurgSim::Math::Matrix33d rotation3x3; rotation3x3.col(0) = i; rotation3x3.col(1) = j; rotation3x3.col(2) = k; // Set up the 12x12 initial rotation matrix m_R0.setZero(); setSubMatrix(rotation3x3, 0, 0, 3, 3, &m_R0); setSubMatrix(rotation3x3, 1, 1, 3, 3, &m_R0); setSubMatrix(rotation3x3, 2, 2, 3, 3, &m_R0); setSubMatrix(rotation3x3, 3, 3, 3, 3, &m_R0); } SurgSim::Math::Vector Fem1DElementBeam::computeCartesianCoordinate( const SurgSim::Math::OdeState& state, const SurgSim::Math::Vector& naturalCoordinate) const { SURGSIM_ASSERT(isValidCoordinate(naturalCoordinate)) << "naturalCoordinate must be normalized and length 2."; Vector3d cartesianCoordinate(0.0, 0.0, 0.0); const Vector& positions = state.getPositions(); for (int i = 0; i < 2; i++) { cartesianCoordinate += naturalCoordinate(i) * getSubVector(positions, m_nodeIds[i], 6).segment<3>(0); } return cartesianCoordinate; } void Fem1DElementBeam::doUpdateFMDK(const Math::OdeState& state, int options) { if (options & SurgSim::Math::OdeEquationUpdate::ODEEQUATIONUPDATE_F) { Eigen::Matrix x; // K.U = F_ext // K.(x - x0) = F_ext // 0 = F_ext + F_int, with F_int = -K.(x - x0) getSubVector(state.getPositions(), m_nodeIds, 6, &x); m_f = -m_K * (x - m_x0); } } SurgSim::Math::Vector Fem1DElementBeam::computeNaturalCoordinate( const SurgSim::Math::OdeState& state, const SurgSim::Math::Vector& cartesianCoordinate) const { SURGSIM_FAILURE() << "Function " << __FUNCTION__ << " not yet implemented."; return SurgSim::Math::Vector3d::Zero(); } } // namespace Physics } // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/Fem1DElementBeam.h000066400000000000000000000121331277777236100222730ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_FEM1DELEMENTBEAM_H #define SURGSIM_PHYSICS_FEM1DELEMENTBEAM_H #include #include "SurgSim/Physics/FemElement.h" namespace SurgSim { namespace Physics { SURGSIM_STATIC_REGISTRATION(Fem1DElementBeam); /// 1D FemElement based on a beam volume discretization with a fixed cross section /// /// The inertia property (mass) and the stiffness matrices are derived from "Theory of Matrix Structural Analysis" from /// J.S. Przemieniecki. The deformation is based on linear elasticity theory and not on visco-elasticity theory; /// therefore, the element does not have any damping components. /// \note The element is considered to have a circular cross section. class Fem1DElementBeam : public FemElement { public: /// Constructor Fem1DElementBeam(); /// Constructor /// \param nodeIds An array of 2 node ids defining this beam element with respect to a /// DeformableRepresentationState which is passed to the initialize method. explicit Fem1DElementBeam(std::array nodeIds); /// Constructor for FemElement object factory /// \param elementData A FemElement struct defining this beam element with respect to a /// DeformableRepresentationState which is passed to the initialize method. /// \exception SurgSim::Framework::AssertionFailure if nodeIds has a size different than 2 explicit Fem1DElementBeam(std::shared_ptr elementData); SURGSIM_CLASSNAME(SurgSim::Physics::Fem1DElementBeam) /// Sets the beam's circular cross-section radius /// \param radius The radius of the beam void setRadius(double radius); /// Gets the beam's circular cross-section radius /// \return The radius of the beam double getRadius() const; void initialize(const SurgSim::Math::OdeState& state) override; double getVolume(const SurgSim::Math::OdeState& state) const override; /// Gets whether shearing is enabled for the element /// \return True if shearing is enabled bool getShearingEnabled() const; /// Enables or disables shearing for the element /// /// Shearing can only be meaningfully enabled or disabled before the element has had initialize called. /// \param enabled Boolean determining whether shearing is enabled void setShearingEnabled(bool enabled); SurgSim::Math::Vector computeCartesianCoordinate( const SurgSim::Math::OdeState& state, const SurgSim::Math::Vector& naturalCoordinate) const override; SurgSim::Math::Vector computeNaturalCoordinate( const SurgSim::Math::OdeState& state, const SurgSim::Math::Vector& cartesianCoordinate) const override; /// \return the initial beam rotation SurgSim::Math::Matrix33d getInitialRotation() const; protected: /// Initializes variables needed before Initialize() is called void initializeMembers(); /// Computes the beam element's initial rotation /// \param state The state to compute the rotation from /// \note This method stores the result in m_R0 void computeInitialRotation(const SurgSim::Math::OdeState& state); /// Computes the beam's stiffness matrix /// \param state The state to compute the stiffness matrix from void computeStiffness(const SurgSim::Math::OdeState& state); /// Computes the beam's mass matrix /// \param state The state to compute the stiffness matrix from void computeMass(const SurgSim::Math::OdeState& state); void doUpdateFMDK(const Math::OdeState& state, int options) override; /// The element's rest state Eigen::Matrix m_x0; /// Initial rotation matrix for the element Eigen::Matrix m_R0; /// Stiffness matrix (in local coordinate frame) Eigen::Matrix m_MLocal; /// Stiffness matrix (in local coordinate frame) Eigen::Matrix m_KLocal; /// Physical shear modulus G = E/( 2(1+mu) ) double m_G; /// Rest length double m_restLength; /// radius for a circular Beam double m_radius; /// Cross sectional area = PI.radius.radius if circular double m_A; /// Does this beam element have shear bool m_haveShear; /// Shear factor (usually 5/8) double m_shearFactor; /// The shear area in the y and z directions (=0 => no shear) http://en.wikipedia.org/wiki/Timoshenko_beam_theory double m_Asy, m_Asz; /// Shear deformation parameters /// Phi_y=12.E.Iz/(G.Asy.L^2) or 0 if As?=0 /// Phi_z=12.E.Iy/(G.Asz.L^2) or 0 if As?=0 double m_Phi_y, m_Phi_z; /// Cross sectional moment of inertia double m_Iy, m_Iz; /// Polar moment of inertia double m_J; }; } // namespace Physics } // namespace SurgSim #endif // SURGSIM_PHYSICS_FEM1DELEMENTBEAM_H opensurgsim-0.7.0/SurgSim/Physics/Fem1DLocalization.cpp000066400000000000000000000066171277777236100231120ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Physics/Fem1DLocalization.h" #include "SurgSim/Math/Geometry.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/Fem1DRepresentation.h" #include "SurgSim/Physics/FemElement.h" namespace SurgSim { namespace Physics { Fem1DLocalization::Fem1DLocalization( std::shared_ptr representation, const SurgSim::DataStructures::IndexedLocalCoordinate& localPosition) : FemLocalization(representation, localPosition) { } Fem1DLocalization::~Fem1DLocalization() { } bool Fem1DLocalization::isValidRepresentation(std::shared_ptr representation) { auto femRepresentation = std::dynamic_pointer_cast(representation); // Allows to reset the representation to nullptr ... return (femRepresentation != nullptr || representation == nullptr); } bool Fem1DLocalization::moveClosestTo(const Math::Vector3d& point, bool* hasReachedEnd) { if (hasReachedEnd != nullptr) { *hasReachedEnd = false; } auto femRepresentation = std::static_pointer_cast(getRepresentation()); auto& currentState = femRepresentation->getCurrentState(); double closestDistance = std::numeric_limits::max(), newDistance; Math::Vector3d closestPoint, newPoint; std::array closestNodePositions; size_t closestNodeIndex = std::numeric_limits::max(); auto numFemElements = femRepresentation->getNumFemElements(); for (size_t i = 0; i < numFemElements; ++i) { auto femElement = femRepresentation->getFemElement(i); const auto& nodeIds = femElement->getNodeIds(); std::array nodePositions = {currentState->getPosition(nodeIds[0]), currentState->getPosition(nodeIds[1]) }; Math::distancePointSegment(point, nodePositions[0], nodePositions[1], &newPoint); newDistance = (newPoint - point).norm(); if (newDistance < closestDistance) { closestNodeIndex = i; closestDistance = newDistance; closestPoint = newPoint; closestNodePositions[0] = nodePositions[0]; closestNodePositions[1] = nodePositions[1]; } } if (closestNodeIndex < numFemElements) { Math::Vector2d bary; Math::barycentricCoordinates(closestPoint, closestNodePositions[0], closestNodePositions[1], &bary); auto position = getLocalPosition(); position.index = closestNodeIndex; position.coordinate[0] = bary[0]; position.coordinate[1] = bary[1]; if (hasReachedEnd != nullptr) { *hasReachedEnd = (closestNodeIndex == 0 && std::abs(position.coordinate[0] - 1.0) < Math::Geometry::DistanceEpsilon) || (closestNodeIndex == numFemElements - 1 && std::abs(position.coordinate[1] - 1.0) < Math::Geometry::DistanceEpsilon); } setLocalPosition(position); return true; } return false; } } // namespace Physics } // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/Fem1DLocalization.h000066400000000000000000000036621277777236100225540ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_FEM1DLOCALIZATION_H #define SURGSIM_PHYSICS_FEM1DLOCALIZATION_H #include "SurgSim/DataStructures/IndexedLocalCoordinate.h" #include "SurgSim/Physics/FemLocalization.h" namespace SurgSim { namespace Physics { /// Implementation of Localization for Fem1DRepresentation /// /// Fem1DLocalization tracks the global coordinates of an IndexedLocalCoordinate associated with an /// Fem1DRepresentation. The IndexedLocalCoordinate must be related to an FemElement (the index is an FemElement id and /// the local coordinates are the barycentric coordinates of the nodes in this FemElement). class Fem1DLocalization : public FemLocalization { public: /// Constructor /// \param representation The representation to assign to this localization. /// \param localCoordinate The indexed local coordinate relative to the representation. Fem1DLocalization(std::shared_ptr representation, const SurgSim::DataStructures::IndexedLocalCoordinate& localCoordinate); /// Destructor virtual ~Fem1DLocalization(); bool isValidRepresentation(std::shared_ptr representation) override; bool moveClosestTo(const Math::Vector3d& point, bool *hasReachedEnd) override; }; } // namespace Physics } // namespace SurgSim #endif // SURGSIM_PHYSICS_FEM1DLOCALIZATION_H opensurgsim-0.7.0/SurgSim/Physics/Fem1DPlyReaderDelegate.cpp000066400000000000000000000074311277777236100237770ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Math/Valid.h" #include "SurgSim/Physics/Fem1DPlyReaderDelegate.h" using SurgSim::DataStructures::PlyReader; namespace SurgSim { namespace Physics { Fem1DPlyReaderDelegate::Fem1DPlyReaderDelegate() { } Fem1DPlyReaderDelegate::Fem1DPlyReaderDelegate(std::shared_ptr mesh) : m_enableShear(false), m_mesh(mesh) { SURGSIM_ASSERT(mesh != nullptr) << "The mesh cannot be null."; mesh->clear(); } std::string Fem1DPlyReaderDelegate::getElementName() const { return "1d_element"; } bool Fem1DPlyReaderDelegate::registerDelegate(PlyReader* reader) { FemPlyReaderDelegate::registerDelegate(reader); // Radius Processing reader->requestElement( "radius", std::bind( &Fem1DPlyReaderDelegate::beginRadius, this, std::placeholders::_1, std::placeholders::_2), nullptr, std::bind(&Fem1DPlyReaderDelegate::endRadius, this, std::placeholders::_1)); reader->requestScalarProperty("radius", "value", PlyReader::TYPE_DOUBLE, 0); return true; } bool Fem1DPlyReaderDelegate::fileIsAcceptable(const PlyReader& reader) { bool result = FemPlyReaderDelegate::fileIsAcceptable(reader); result = result && reader.hasProperty("radius", "value"); return result; } void Fem1DPlyReaderDelegate::endParseFile() { for (auto element : m_mesh->getElements()) { element->radius = m_radius; element->enableShear = m_enableShear; if (!m_hasPerElementMaterial && m_hasMaterial) { element->massDensity = m_materialData.massDensity; element->poissonRatio = m_materialData.poissonRatio; element->youngModulus = m_materialData.youngModulus; } } m_mesh->update(); } void Fem1DPlyReaderDelegate::processVertex(const std::string& elementName) { FemElementStructs::RotationVectorData data; if (m_hasRotationDOF) { data.thetaX = m_vertexData.thetaX; data.thetaY = m_vertexData.thetaY; data.thetaZ = m_vertexData.thetaZ; } Fem1D::VertexType vertex(SurgSim::Math::Vector3d(m_vertexData.x, m_vertexData.y, m_vertexData.z), data); m_mesh->addVertex(vertex); } void Fem1DPlyReaderDelegate::processFemElement(const std::string& elementName) { SURGSIM_ASSERT(m_elementData.vertexCount == 2) << "Cannot process 1D Element with " << m_elementData.vertexCount << " vertices."; auto femElement = std::make_shared(); femElement->nodeIds.resize(m_elementData.vertexCount); std::copy(m_elementData.indices, m_elementData.indices + m_elementData.vertexCount, femElement->nodeIds.data()); if (m_hasPerElementMaterial) { femElement->massDensity = m_elementData.massDensity; femElement->poissonRatio = m_elementData.poissonRatio; femElement->youngModulus = m_elementData.youngModulus; } m_mesh->addElement(femElement); } void* Fem1DPlyReaderDelegate::beginRadius(const std::string& elementName, size_t radiusCount) { return &m_radius; } void Fem1DPlyReaderDelegate::endRadius(const std::string& elementName) { SURGSIM_ASSERT(SurgSim::Math::isValid(m_radius)) << "No radius information processed."; } void Fem1DPlyReaderDelegate::processBoundaryCondition(const std::string& elementName) { m_mesh->addBoundaryCondition(static_cast(m_boundaryConditionData)); } } // namespace Physics } // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/Fem1DPlyReaderDelegate.h000066400000000000000000000045631277777236100234470ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_FEM1DPLYREADERDELEGATE_H #define SURGSIM_PHYSICS_FEM1DPLYREADERDELEGATE_H #include #include #include "SurgSim/DataStructures/EmptyData.h" #include "SurgSim/DataStructures/PlyReader.h" #include "SurgSim/Physics/Fem1D.h" #include "SurgSim/Physics/FemPlyReaderDelegate.h" namespace SurgSim { namespace Physics { class Fem1DPlyReaderDelegate : public FemPlyReaderDelegate { public: /// Default constructor. Fem1DPlyReaderDelegate(); /// Constructor. /// \param mesh The mesh to be used, it will be cleared by the constructor. explicit Fem1DPlyReaderDelegate(std::shared_ptr mesh); protected: std::string getElementName() const override; bool registerDelegate(PlyReader* reader) override; bool fileIsAcceptable(const PlyReader& reader) override; void endParseFile() override; void processVertex(const std::string& elementName) override; void processFemElement(const std::string& elementName) override; /// Callback function, begin the processing of radius. /// \param elementName Name of the element. /// \param radiusCount Number of radii. /// \return memory for radius data to the reader. void* beginRadius(const std::string& elementName, size_t radiusCount); /// Callback function, end the processing of radius. /// \param elementName Name of the element. void endRadius(const std::string& elementName); void processBoundaryCondition(const std::string& elementName) override; private: /// Element's radius information double m_radius; /// Element's shear information bool m_enableShear; /// Fem1D mesh asset to contain the ply file information std::shared_ptr m_mesh; }; } // namespace Physics } // namespace SurgSim #endif // SURGSIM_PHYSICS_FEM1DPLYREADERDELEGATE_H opensurgsim-0.7.0/SurgSim/Physics/Fem1DRepresentation.cpp000066400000000000000000000217471277777236100234650ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/DataStructures/IndexedLocalCoordinate.h" #include "SurgSim/DataStructures/Location.h" #include "SurgSim/Framework/Assert.h" #include "SurgSim/Framework/Asset.h" #include "SurgSim/Math/OdeState.h" #include "SurgSim/Math/SparseMatrix.h" #include "SurgSim/Physics/Fem1DElementBeam.h" #include "SurgSim/Physics/Fem1DLocalization.h" #include "SurgSim/Physics/Fem1DRepresentation.h" #include "SurgSim/Physics/FemElement.h" #include "SurgSim/Physics/Localization.h" namespace { void transformVectorByBlockOf3(const SurgSim::Math::RigidTransform3d& transform, SurgSim::Math::Vector* x, bool rotationOnly = false) { typedef SurgSim::Math::Vector::Index IndexType; IndexType numNodes = x->size() / 6; SURGSIM_ASSERT(numNodes * 6 == x->size()) << "Unexpected number of dof in a Fem1D state vector (not a multiple of 6)"; for (IndexType nodeId = 0; nodeId < numNodes; nodeId++) { // Only the translational dof are transformed, rotational dof remains unchanged SurgSim::Math::Vector3d xi = x->segment<3>(6 * nodeId); x->segment<3>(6 * nodeId) = (rotationOnly) ? transform.linear() * xi : transform * xi; } } } namespace SurgSim { namespace Physics { SURGSIM_REGISTER(SurgSim::Framework::Component, SurgSim::Physics::Fem1DRepresentation, Fem1DRepresentation); Fem1DRepresentation::Fem1DRepresentation(const std::string& name) : FemRepresentation(name) { SURGSIM_ADD_SERIALIZABLE_PROPERTY(Fem1DRepresentation, std::shared_ptr, Fem, getFem, setFem); SURGSIM_ADD_SETTER(Fem1DRepresentation, std::string, FemFileName, loadFem) // Reminder: m_numDofPerNode is held by DeformableRepresentation but needs to be set by all // concrete derived classes m_numDofPerNode = 6; m_fem = std::make_shared(); } Fem1DRepresentation::~Fem1DRepresentation() { } void Fem1DRepresentation::loadFem(const std::string& fileName) { auto mesh = std::make_shared(); mesh->load(fileName); setFem(mesh); } void Fem1DRepresentation::setFem(std::shared_ptr mesh) { SURGSIM_ASSERT(!isInitialized()) << "The Fem cannot be set after initialization"; SURGSIM_ASSERT(mesh != nullptr) << "Mesh for Fem1DRepresentation cannot be a nullptr"; auto femMesh = std::dynamic_pointer_cast(mesh); SURGSIM_ASSERT(femMesh != nullptr) << "Mesh for Fem1DRepresentation needs to be a SurgSim::Physics::Fem1D"; m_fem = femMesh; auto state = std::make_shared(); state->setNumDof(getNumDofPerNode(), m_fem->getNumVertices()); for (size_t i = 0; i < m_fem->getNumVertices(); i++) { state->getPositions().segment<3>(getNumDofPerNode() * i) = m_fem->getVertexPosition(i); } for (auto boundaryCondition : m_fem->getBoundaryConditions()) { state->addBoundaryCondition(boundaryCondition); } // If we have elements, ensure that they are all of the same nature if (femMesh->getNumElements() > 0) { const auto& e0 = femMesh->getElement(0); for (auto const& e : femMesh->getElements()) { SURGSIM_ASSERT(e->nodeIds.size() == e0->nodeIds.size()) << "Cannot mix and match elements of different nature." << " Found an element with " << e->nodeIds.size() << " nodes but was expecting " << e0->nodeIds.size(); } // If the FemElement types hasn't been registered yet, let's set a default one if (getFemElementType().empty()) { if (e0->nodeIds.size() == 2) { Fem1DElementBeam beam; setFemElementType(beam.getClassName()); } } } setInitialState(state); } std::shared_ptr Fem1DRepresentation::getFem() const { return m_fem; } void Fem1DRepresentation::addExternalGeneralizedForce(std::shared_ptr localization, const Math::Vector& generalizedForce, const Math::Matrix& K, const Math::Matrix& D) { using Math::SparseMatrix; const size_t dofPerNode = getNumDofPerNode(); const Math::Matrix::Index expectedSize = static_cast(dofPerNode); SURGSIM_ASSERT(localization != nullptr) << "Invalid localization (nullptr)"; SURGSIM_ASSERT(generalizedForce.size() == expectedSize) << "Generalized force has an invalid size of " << generalizedForce.size() << ". Expected " << dofPerNode; SURGSIM_ASSERT(K.size() == 0 || (K.rows() == expectedSize && K.cols() == expectedSize)) << "Stiffness matrix K has an invalid size (" << K.rows() << "," << K.cols() << ") was expecting a square matrix of size " << dofPerNode; SURGSIM_ASSERT(D.size() == 0 || (D.rows() == expectedSize && D.cols() == expectedSize)) << "Damping matrix D has an invalid size (" << D.rows() << "," << D.cols() << ") was expecting a square matrix of size " << dofPerNode; std::shared_ptr localization1D = std::dynamic_pointer_cast(localization); SURGSIM_ASSERT(localization1D != nullptr) << "Invalid localization type (not a Fem1DLocalization)"; const size_t elementId = localization1D->getLocalPosition().index; const Math::Vector& coordinate = localization1D->getLocalPosition().coordinate; std::shared_ptr element = getFemElement(elementId); size_t index = 0; for (auto nodeId : element->getNodeIds()) { m_externalGeneralizedForce.segment(dofPerNode * nodeId, dofPerNode) += generalizedForce * coordinate[index]; index++; } if (K.size() != 0 || D.size() != 0) { size_t index1 = 0; for (auto nodeId1 : element->getNodeIds()) { size_t index2 = 0; for (auto nodeId2 : element->getNodeIds()) { if (K.size() != 0) { Math::addSubMatrix(coordinate[index1] * coordinate[index2] * K, nodeId1, nodeId2, &m_externalGeneralizedStiffness, true); } if (D.size() != 0) { Math::addSubMatrix(coordinate[index1] * coordinate[index2] * D, nodeId1, nodeId2, &m_externalGeneralizedDamping, true); } index2++; } index1++; } } m_externalGeneralizedStiffness.makeCompressed(); m_externalGeneralizedDamping.makeCompressed(); m_hasExternalGeneralizedForce = true; } std::shared_ptr Fem1DRepresentation::createNodeLocalization(size_t nodeId) { DataStructures::IndexedLocalCoordinate coordinate; SURGSIM_ASSERT(nodeId >= 0 && nodeId < getCurrentState()->getNumNodes()) << "Invalid node id"; // Look for any element that contains this node bool foundNodeId = false; for (size_t elementId = 0; elementId < getNumFemElements(); elementId++) { auto element = getFemElement(elementId); auto found = std::find(element->getNodeIds().begin(), element->getNodeIds().end(), nodeId); if (found != element->getNodeIds().end()) { coordinate.index = elementId; coordinate.coordinate.setZero(element->getNumNodes()); coordinate.coordinate[found - element->getNodeIds().begin()] = 1.0; foundNodeId = true; break; } } SURGSIM_ASSERT(foundNodeId) << "Could not find any element containing the node " << nodeId; // Fem1DLocalization will verify the coordinate (2nd parameter) based on // the Fem1DRepresentation passed as 1st parameter. return std::make_shared( std::static_pointer_cast(getSharedPtr()), coordinate); } std::shared_ptr Fem1DRepresentation::createElementLocalization( const DataStructures::IndexedLocalCoordinate& location) { return std::make_shared( std::static_pointer_cast(getSharedPtr()), location); } std::shared_ptr Fem1DRepresentation::createLocalization(const DataStructures::Location& location) { if (location.index.hasValue()) { return createNodeLocalization(*location.index); } else if (location.elementMeshLocalCoordinate.hasValue()) { return createElementLocalization(*location.elementMeshLocalCoordinate); } SURGSIM_FAILURE() << "Fem1DRepresentation supports only node and element-based location (not triangle-based)"; return nullptr; } void Fem1DRepresentation::transformState(std::shared_ptr state, const Math::RigidTransform3d& transform) { transformVectorByBlockOf3(transform, &state->getPositions()); transformVectorByBlockOf3(transform, &state->getVelocities(), true); } bool Fem1DRepresentation::doInitialize() { for (auto& element : m_fem->getElements()) { std::shared_ptr femElement; femElement = FemElement::getFactory().create(getFemElementType(), element); m_femElements.push_back(femElement); } return FemRepresentation::doInitialize(); } } // namespace Physics } // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/Fem1DRepresentation.h000066400000000000000000000066411277777236100231260ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_FEM1DREPRESENTATION_H #define SURGSIM_PHYSICS_FEM1DREPRESENTATION_H #include #include #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Math/Matrix.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/Fem1D.h" #include "SurgSim/Physics/FemRepresentation.h" namespace SurgSim { namespace DataStructures { struct IndexedLocalCoordinate; struct Location; } namespace Framework { class Asset; } namespace Math { class OdeState; } namespace Physics { class Localization; SURGSIM_STATIC_REGISTRATION(Fem1DRepresentation); /// Finite Element Model 1D is a fem built with 1D FemElement /// /// The structure of a 1D model derives into a matrix structure of tri-diagonal block. class Fem1DRepresentation : public FemRepresentation { public: /// Constructor /// \param name The name of the Fem1DRepresentation explicit Fem1DRepresentation(const std::string& name); /// Destructor virtual ~Fem1DRepresentation(); SURGSIM_CLASSNAME(SurgSim::Physics::Fem1DRepresentation); void loadFem(const std::string& fileName) override; /// Sets the fem mesh asset /// \param mesh The fem mesh to assign to this representation /// \exception SurgSim::Framework::AssertionFailure if mesh is nullptr or it's actual type is not Fem1D void setFem(std::shared_ptr mesh); /// \return The fem mesh asset as a Fem1D std::shared_ptr getFem() const; void addExternalGeneralizedForce(std::shared_ptr localization, const SurgSim::Math::Vector& generalizedForce, const SurgSim::Math::Matrix& K = SurgSim::Math::Matrix(), const SurgSim::Math::Matrix& D = SurgSim::Math::Matrix()) override; std::shared_ptr createLocalization(const SurgSim::DataStructures::Location& location) override; protected: void transformState(std::shared_ptr state, const SurgSim::Math::RigidTransform3d& transform) override; bool doInitialize() override; private: /// Helper method: create a localization for a node /// \param nodeId The node index /// \return Localization of the node for this representation std::shared_ptr createNodeLocalization(size_t nodeId); /// Helper method: create a localization for an element-based IndexedLocalCoordinate (beam) /// \param location The IndexedLocalCoordinate defining a point on the element mesh /// \return Localization of the point for this representation std::shared_ptr createElementLocalization( const SurgSim::DataStructures::IndexedLocalCoordinate& location); /// The Fem1DRepresentation's asset as a Fem1D std::shared_ptr m_fem; }; } // namespace Physics } // namespace SurgSim #endif // SURGSIM_PHYSICS_FEM1DREPRESENTATION_H opensurgsim-0.7.0/SurgSim/Physics/Fem2D.cpp000066400000000000000000000020301277777236100205230ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Physics/Fem2D.h" #include "SurgSim/Physics/Fem2DPlyReaderDelegate.h" namespace SurgSim { namespace Physics { SURGSIM_REGISTER(SurgSim::Framework::Asset, SurgSim::Physics::Fem2D, Fem2D) Fem2D::Fem2D() : Fem() { } bool Fem2D::doLoad(const std::string& filePath) { return loadFemFile(filePath); } } // namespace Physics } // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/Fem2D.h000066400000000000000000000023761277777236100202050ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_FEM2D_H #define SURGSIM_PHYSICS_FEM2D_H #include "SurgSim/Physics/Fem.h" namespace SurgSim { namespace Physics { SURGSIM_STATIC_REGISTRATION(Fem2D); /// Fem class data structure implementation for 2-Dimensional FEMs /// \sa Fem class Fem2D : public Fem { public: /// Default constructor Fem2D(); SURGSIM_CLASSNAME(SurgSim::Physics::Fem2D); protected: // Asset API override bool doLoad(const std::string& filePath) override; }; } // namespace Physics } // namespace SurgSim #endif // SURGSIM_PHYSICS_FEM2D_H opensurgsim-0.7.0/SurgSim/Physics/Fem2DElementTriangle.cpp000066400000000000000000001271411277777236100235360ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Framework/Log.h" #include "SurgSim/Math/GaussLegendreQuadrature.h" #include "SurgSim/Math/Geometry.h" #include "SurgSim/Math/OdeEquation.h" #include "SurgSim/Math/OdeState.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Physics/Fem2DElementTriangle.h" using SurgSim::Math::addSubVector; using SurgSim::Math::gaussQuadrature2DTriangle3Points; using SurgSim::Math::getSubMatrix; using SurgSim::Math::getSubVector; using SurgSim::Math::setSubMatrix; using SurgSim::Math::Vector; using SurgSim::Math::Vector3d; namespace { const double epsilon = 1e-8; const double epsilonArea = 1e-10; }; namespace SurgSim { namespace Physics { SURGSIM_REGISTER(SurgSim::Physics::FemElement, SurgSim::Physics::Fem2DElementTriangle, Fem2DElementTriangle) Fem2DElementTriangle::Fem2DElementTriangle() { initializeMembers(); } Fem2DElementTriangle::Fem2DElementTriangle(std::array nodeIds) { initializeMembers(); m_nodeIds.assign(nodeIds.cbegin(), nodeIds.cend()); } Fem2DElementTriangle::Fem2DElementTriangle(std::shared_ptr elementData) { initializeMembers(); auto element2DData = std::dynamic_pointer_cast(elementData); SURGSIM_ASSERT(element2DData != nullptr) << "Incorrect struct type passed"; SURGSIM_ASSERT(element2DData->nodeIds.size() == 3) << "Incorrect number of nodes for Fem2D Triangle"; m_nodeIds.assign(element2DData->nodeIds.begin(), element2DData->nodeIds.end()); setThickness(element2DData->thickness); setMassDensity(element2DData->massDensity); setPoissonRatio(element2DData->poissonRatio); setYoungModulus(element2DData->youngModulus); } void Fem2DElementTriangle::setThickness(double thickness) { SURGSIM_ASSERT(thickness != 0.0) << "The thickness cannot be set to 0"; SURGSIM_ASSERT(thickness > 0.0) << "The thickness cannot be negative (trying to set it to " << thickness << ")"; m_thickness = thickness; } double Fem2DElementTriangle::getThickness() const { return m_thickness; } double Fem2DElementTriangle::getVolume(const SurgSim::Math::OdeState& state) const { const Vector3d A = state.getPosition(m_nodeIds[0]); const Vector3d B = state.getPosition(m_nodeIds[1]); const Vector3d C = state.getPosition(m_nodeIds[2]); return m_thickness * (B - A).cross(C - A).norm() / 2.0; } void Fem2DElementTriangle::initializeMembers() { m_restArea = 0.0; m_thickness = 0.0; // 6 dof per node (x, y, z, thetaX, thetaY, thetaZ) setNumDofPerNode(6); } void Fem2DElementTriangle::initialize(const SurgSim::Math::OdeState& state) { // Test the validity of the physical parameters FemElement::initialize(state); SURGSIM_ASSERT(m_thickness > 0.0) << "Fem2DElementTriangle thickness should be positive and non-zero. " << "Did you call setThickness(thickness) ?"; // Store the rest state for this beam in m_x0 getSubVector(state.getPositions(), m_nodeIds, 6, &m_x0); // Store the rest rotation in m_initialRotation m_initialRotation = computeRotation(state); // computeShapeFunctionsParameters needs the initial rotation and // is required to compute the stiffness and mass matrices computeShapeFunctionsParameters(state); // Pre-compute the mass and stiffness matrix computeMass(state, &m_M); computeStiffness(state, &m_K); } void Fem2DElementTriangle::computeLocalMembraneMass(const SurgSim::Math::OdeState& state, Eigen::Matrix* localMassMatrix) { double mass = m_rho * m_restArea * m_thickness; for (size_t i = 0; i < 3; ++i) { size_t j = (i + 1) % 3; size_t k = (j + 1) % 3; localMassMatrix->block<2, 2>(i * 6, i * 6).diagonal().setConstant(mass / 6.0); localMassMatrix->block<2, 2>(i * 6, j * 6).diagonal().setConstant(mass / 12.0); localMassMatrix->block<2, 2>(i * 6, k * 6).diagonal().setConstant(mass / 12.0); } } void Fem2DElementTriangle::computeLocalPlateMass(const SurgSim::Math::OdeState& state, Eigen::Matrix* localMassMatrix) { double coefZ = 2.0 * m_restArea * m_rho * m_thickness; double coefTheta = m_restArea * m_rho * (m_thickness * m_thickness * m_thickness) / 6.0; for (size_t nodeId1 = 0; nodeId1 < 3; ++nodeId1) { for (size_t nodeId2 = 0; nodeId2 < 3; ++nodeId2) { localMassMatrix->block<3, 3>(6 * nodeId1 + 2, 6 * nodeId2 + 2) = coefZ * m_integral_dT_d.block<3, 3>(3 * nodeId1, 3 * nodeId2) + coefTheta * m_integralHxiHxj.block<3, 3>(3 * nodeId1, 3 * nodeId2) + coefTheta * m_integralHyiHyj.block<3, 3>(3 * nodeId1, 3 * nodeId2); } } } void Fem2DElementTriangle::computeLocalMass(const SurgSim::Math::OdeState& state, Eigen::Matrix* localMassMatrix) { localMassMatrix->setIdentity(); computeLocalMembraneMass(state, localMassMatrix); computeLocalPlateMass(state, localMassMatrix); } void Fem2DElementTriangle::computeMass(const SurgSim::Math::OdeState& state, SurgSim::Math::Matrix* massMatrix) { computeLocalMass(state, &m_MLocal); // Transformation Local -> Global const SurgSim::Math::Matrix33d& rotation = m_initialRotation; const SurgSim::Math::Matrix33d rotationTranspose = m_initialRotation.transpose(); for (size_t rowBlockId = 0; rowBlockId < 6; ++rowBlockId) { for (size_t colBlockId = 0; colBlockId < 6; ++colBlockId) { auto MLocal3x3block = getSubMatrix(m_MLocal, rowBlockId, colBlockId, 3, 3); setSubMatrix(rotation * MLocal3x3block * rotationTranspose, rowBlockId, colBlockId, 3, 3, massMatrix); } } } void Fem2DElementTriangle::computeLocalStiffness(const SurgSim::Math::OdeState& state, Eigen::Matrix* localStiffnessMatrix) { // Membrane part from "Theory of Matrix Structural Analysis" from J.S. Przemieniecki // Compute the membrane local strain-displacement matrix Matrix36Type membraneStrainDisplacement = Matrix36Type::Zero(); for (size_t i = 0; i < 3; ++i) { // Noting f(x,y) the membrane shape function, the displacement is: // u(x,y) = f0(x,y).u0 + f1(x,y).u1 + f2(x,y).u2 // The strain is E=(Exx , Eyy , Exy) // Exx = dux/dx = df0/dx.u0x + df1/dx.u1x + df2/dx.u2x // dfi/dx = bi membraneStrainDisplacement(0, 2 * i) = m_membraneShapeFunctionsParameters(i, 1); // Eyy = duy/dy = df0/dy.u0y + df1/dy.u1y + df2/dy.u2y // dfi/dy = ci membraneStrainDisplacement(1, 2 * i + 1) = m_membraneShapeFunctionsParameters(i, 2); // Exy = dux/dy + duy/dx = // (df0/dy.u0x + df0/dx.u0y) + (df1/dy.u1x + df1/dx.u1y) + (df2/dy.u2x + df2/dx.u2y) membraneStrainDisplacement(2, 2 * i) = m_membraneShapeFunctionsParameters(i, 2); membraneStrainDisplacement(2, 2 * i + 1) = m_membraneShapeFunctionsParameters(i, 1); } // Membrane material stiffness coming from Hooke Law (isotropic material) Matrix33Type membraneElasticMaterial; membraneElasticMaterial.setIdentity(); membraneElasticMaterial(2, 2) = 0.5 * (1.0 - m_nu); membraneElasticMaterial(0, 1) = m_nu; membraneElasticMaterial(1, 0) = m_nu; membraneElasticMaterial *= m_E / (1.0 - m_nu * m_nu); // Membrane local stiffness matrix = integral(strain:stress) Matrix66Type membraneKLocal = membraneStrainDisplacement.transpose() * membraneElasticMaterial * membraneStrainDisplacement; membraneKLocal *= m_thickness * m_restArea; // Thin-plate part from "A Study Of Three-Node Triangular Plate Bending Elements", Jean-Louis Batoz // Thin-plate material stiffness coming from Hooke Law (isotropic material) Matrix33Type plateElasticMaterial = membraneElasticMaterial; plateElasticMaterial *= m_thickness * m_thickness * m_thickness / 12.0; // Thin-Plate stiffness matrix evaluation using a 3 point Gauss quadrature for exact integration (quadratic terms) Matrix99Type plateKLocal = Matrix99Type::Zero(); for (size_t pointId = 0; pointId < 3; ++pointId) { const double xi = gaussQuadrature2DTriangle3Points[pointId].coordinateXi; const double eta = gaussQuadrature2DTriangle3Points[pointId].coordinateEta; const double weight = gaussQuadrature2DTriangle3Points[pointId].weight; Matrix39Type strainDisplacementAtGaussPoint = batozStrainDisplacement(xi , eta); plateKLocal += ((2.0 * m_restArea) * 0.5 * weight) * strainDisplacementAtGaussPoint.transpose() * plateElasticMaterial * strainDisplacementAtGaussPoint; } // Assemble shell stiffness as combination of membrane (Ux Uy) and plate stiffnesses (Uz ThetaX ThetaY) // In the Kirchhof theory of Thin-Plate, the drilling dof (ThetaZ) is not considered. // DOF are stored as follow (Ux Uy Uz ThetaX ThetaY ThetaZ) localStiffnessMatrix->setIdentity(); for (size_t row = 0; row < 3; ++row) { for (size_t column = 0; column < 3; ++column) { // Membrane part localStiffnessMatrix->block<2, 2>(6 * row, 6 * column) = membraneKLocal.block<2 , 2>(2 * row , 2 * column); // Thin-plate part localStiffnessMatrix->block<3, 3>(6 * row + 2, 6 * column + 2) = plateKLocal.block<3, 3>(3 * row, 3 * column); } } } void Fem2DElementTriangle::computeStiffness(const SurgSim::Math::OdeState& state, SurgSim::Math::Matrix* stiffnessMatrix) { computeLocalStiffness(state, &m_KLocal); // Transformation Local -> Global const SurgSim::Math::Matrix33d& rotation = m_initialRotation; const SurgSim::Math::Matrix33d rotationTranspose = m_initialRotation.transpose(); for (size_t rowBlockId = 0; rowBlockId < 6; ++rowBlockId) { for (size_t colBlockId = 0; colBlockId < 6; ++colBlockId) { auto KLocal3x3block = getSubMatrix(m_KLocal, rowBlockId, colBlockId, 3, 3); setSubMatrix(rotation * KLocal3x3block * rotationTranspose, rowBlockId, colBlockId, 3, 3, stiffnessMatrix); } } } SurgSim::Math::Matrix33d Fem2DElementTriangle::computeRotation(const SurgSim::Math::OdeState& state) { SurgSim::Math::Matrix33d rotation; // Build (A; i, j, k) an orthonormal frame // such that in the local frame, we have: // A(0, 0) // B(xb > 0, 0) // C(xc, yc > 0) const Vector3d A = state.getPosition(m_nodeIds[0]); const Vector3d B = state.getPosition(m_nodeIds[1]); const Vector3d C = state.getPosition(m_nodeIds[2]); Vector3d i = B - A; SURGSIM_ASSERT(!i.isZero()) << "Degenerate triangle A=B, A=(" << A.transpose() << ") B=(" << B.transpose() << ")"; i.normalize(); Vector3d j = C - A; SURGSIM_ASSERT(!j.isZero()) << "Degenerate triangle A=C, A=(" << A.transpose() << ") C=(" << C.transpose() << ")"; Vector3d k = i.cross(j); SURGSIM_ASSERT(!k.isZero()) << "Degenerate triangle ABC aligned or B=C, " << "A=(" << A.transpose() << ") " << "B=(" << B.transpose() << ") " << "C=(" << C.transpose() << ")"; k.normalize(); j = k.cross(i); j.normalize(); // Initialize the initial rotation matrix (transform vectors from local to global coordinates) rotation.col(0) = i; rotation.col(1) = j; rotation.col(2) = k; return rotation; } SurgSim::Math::Vector Fem2DElementTriangle::computeCartesianCoordinate( const SurgSim::Math::OdeState& state, const SurgSim::Math::Vector& naturalCoordinate) const { SURGSIM_ASSERT(isValidCoordinate(naturalCoordinate)) << "naturalCoordinate must be normalized and length 3."; Vector3d cartesianCoordinate(0.0, 0.0, 0.0); const Vector& positions = state.getPositions(); for (int i = 0; i < 3; i++) { cartesianCoordinate += naturalCoordinate(i) * getSubVector(positions, m_nodeIds[i], 6).segment<3>(0); } return cartesianCoordinate; } SurgSim::Math::Vector Fem2DElementTriangle::computeNaturalCoordinate( const SurgSim::Math::OdeState& state, const SurgSim::Math::Vector& cartesianCoordinate) const { SURGSIM_FAILURE() << "Function " << __FUNCTION__ << " not yet implemented."; return SurgSim::Math::Vector3d::Zero(); } void Fem2DElementTriangle::doUpdateFMDK(const Math::OdeState& state, int options) { if (options & Math::ODEEQUATIONUPDATE_F) { Eigen::Matrix x; // K.U = F_ext // K.(x - x0) = F_ext // 0 = F_ext + F_int, with F_int = -K.(x - x0) getSubVector(state.getPositions(), m_nodeIds, 6, &x); m_f = -m_K * (x - m_x0); } } void Fem2DElementTriangle::computeIntegral_dTd() { // Component of the plate mass matrix coming from the displacement w(x,y) = d.U = [d1 d2 d3 d4 d5 d6 d7 d8 d9].U // With d = [N1, N2.y10 + N3.y20, -N2.x10 - N3.x20, // N4, N5.y10 + N6.y20, -N5.x10 - N6.x20, // N7, N8.y10 + N9.y20, -N8.x10 - N9.x20] // Let's define lambda = 1 - xi - eta // N1(xi, eta) = 3.lambda^2 - 2.lambda^3 + 2.xi.eta.lambda // N2(xi, eta) = lambda^2.xi + xi.eta.lambda/2 // N3(xi, eta) = lambda^2.eta + xi.eta.lambda/2 // N4(xi, eta) = 3.xi^2 - 2.xi^3 + 2.xi.eta.lambda // N5(xi, eta) = xi^2.(xi - 1) - xi.eta.lambda // N6(xi, eta) = xi^2.eta + xi.eta.lambda/2 // N7(xi, eta) = 3.eta^2 - 2.eta^3 + 2.xi.eta.lambda // N8(xi, eta) = eta^2.xi + xi.eta.lambda/2 // N9(xi, eta) = eta^2.(eta - 1) - xi.eta.lambda // For more details, c.f. "Shell elements: modelizations DKT, DST, DKTG and Q4g", Code_Aster, 2013, Thomas De Soza. // w = N1.w1 + N2.dw1/dxi + N3.dw1/deta // + N4.w2 + N5.dw2/dxi + N6.dw2/deta // + N7.w3 + N8.dw3/dxi + N9.dw3/deta // // Note that J = (dx/dxi=x10 dy/dxi=y10 ) // (dx/deta=x20 dy/deta=y20) // And dw/dx = -thetay // And dw/dy = thetax // with dwi/dxi = dwi/dx.dx/dxi + dwi/dy.dy/dxi = -thetayi.x10 + thetaxi.y10 // with dwi/deta = dwi/dx.dx/deta + dwi/dy.dy/deta = -thetayi.x20 + thetaxi.y20 // m_integral_dT_d(i, j) = int_0^1 int_0^{1-eta} di.dj dxi deta m_integral_dT_d.resize(9, 9); // In the local space, the triangle point coordinates are A(x0=0, y0=0) B(x1, y1=0) C(x2, y2) const double x1 = -m_xij[2]; // -(x0 - x1) = x1 (as x0 = 0) const double x2 = m_xij[1]; // x2 - x0 = x2 (as x0 = 0) const double y2 = m_yij[1]; // y2 - y0) = y2 (as y1 = 0) const double x1x1 = x1 * x1; const double x2x2 = x2 * x2; const double y2y2 = y2 * y2; const double x1x2 = x1 * x2; m_integral_dT_d(0, 0) = 121.0 / 1260.0; m_integral_dT_d(0, 1) = 13.0 / 1260.0 * y2; m_integral_dT_d(0, 2) = 13.0 / 1260.0 * (-x1 - x2); m_integral_dT_d(0, 3) = 89.0 / 2520.0; m_integral_dT_d(0, 4) = 19.0 / 5040.0 * y2; m_integral_dT_d(0, 5) = (53.0 * x1 - 19.0 * x2) / 5040.0; m_integral_dT_d(0, 6) = 89.0 / 2520.0; m_integral_dT_d(0, 7) = 53.0 / 5040.0 * (-y2); m_integral_dT_d(0, 8) = (53.0 * x2 - 19.0 * x1) / 5040.0; m_integral_dT_d(1, 0) = m_integral_dT_d(0, 1); // symmetric part m_integral_dT_d(1, 1) = 31.0 / 20160.0 * y2y2; m_integral_dT_d(1, 2) = (-y2) / 20160.0 * (19.0 * x1 + 31.0 * x2); m_integral_dT_d(1, 3) = 19.0 / 5040.0 * y2; m_integral_dT_d(1, 4) = 11.0 / 20160.0 * y2y2; m_integral_dT_d(1, 5) = y2 / 20160.0 * (24.0 * x1 - 11.0 * x2); m_integral_dT_d(1, 6) = 17.0 / 2520.0 * y2; m_integral_dT_d(1, 7) = 19.0 / 10080.0 * (-y2y2); m_integral_dT_d(1, 8) = (-y2) / 20160.0 * (13.0 * x1 - 38.0 * x2); m_integral_dT_d(2, 0) = m_integral_dT_d(0, 2); // symmetric part m_integral_dT_d(2, 1) = m_integral_dT_d(1, 2); // symmetric part m_integral_dT_d(2, 2) = (31.0 * (x1x1 + x2x2) + 2.0 * 19.0 * x1x2) / 20160.0; m_integral_dT_d(2, 3) = (-19.0 * x2 - 2.0 * 17.0 * x1) / 5040.0; m_integral_dT_d(2, 4) = (-y2) / 20160.0 * (13.0 * x1 + 11.0 * x2); m_integral_dT_d(2, 5) = (11.0 * x2 * (x2 - x1) - 2.0 * 19.0 * x1x1) / 20160.0; m_integral_dT_d(2, 6) = (-19.0 * x1 - 2.0 * 17.0 * x2) / 5040.0; m_integral_dT_d(2, 7) = y2 / 10080.0 * (12.0 * x1 + 19.0 * x2); m_integral_dT_d(2, 8) = (11.0 * x1 * (x1 - x2) - 2.0 * 19.0 * x2x2) / 20160.0; m_integral_dT_d(3, 0) = m_integral_dT_d(0, 3); // symmetric part m_integral_dT_d(3, 1) = m_integral_dT_d(1, 3); // symmetric part m_integral_dT_d(3, 2) = m_integral_dT_d(2, 3); // symmetric part m_integral_dT_d(3, 3) = 121.0 / 1260.0; m_integral_dT_d(3, 4) = 13.0 / 1260.0 * y2; m_integral_dT_d(3, 5) = (-13.0 * x2 + 2.0 * 13.0 * x1) / 1260.0; m_integral_dT_d(3, 6) = 89.0 / 2520.0; m_integral_dT_d(3, 7) = 53.0 / 5040.0 * (-y2); m_integral_dT_d(3, 8) = (53.0 * x2 - 2.0 * 17.0 * x1) / 5040.0; m_integral_dT_d(4, 0) = m_integral_dT_d(0, 4); // symmetric part m_integral_dT_d(4, 1) = m_integral_dT_d(1, 4); // symmetric part m_integral_dT_d(4, 2) = m_integral_dT_d(2, 4); // symmetric part m_integral_dT_d(4, 3) = m_integral_dT_d(3, 4); // symmetric part m_integral_dT_d(4, 4) = 31.0 / 20160.0 * y2y2; m_integral_dT_d(4, 5) = y2 / 20160.0 * (50.0 * x1 - 31.0 * x2); m_integral_dT_d(4, 6) = 17.0 / 2520.0 * y2; m_integral_dT_d(4, 7) = 19.0 / 10080.0 * (-y2y2); m_integral_dT_d(4, 8) = (-y2) / 20160.0 * (25.0 * x1 - 38.0 * x2); m_integral_dT_d(5, 0) = m_integral_dT_d(0, 5); // symmetric part m_integral_dT_d(5, 1) = m_integral_dT_d(1, 5); // symmetric part m_integral_dT_d(5, 2) = m_integral_dT_d(2, 5); // symmetric part m_integral_dT_d(5, 3) = m_integral_dT_d(3, 5); // symmetric part m_integral_dT_d(5, 4) = m_integral_dT_d(4, 5); // symmetric part m_integral_dT_d(5, 5) = (20.0 * 5.0 * x1 * (x1 - x2) + 31.0 * x2x2) / 20160.0; m_integral_dT_d(5, 6) = (53.0 * x1 - 2.0 * 17.0 * x2) / 5040.0; m_integral_dT_d(5, 7) = (-y2) / 10080.0 * (31.0 * x1 - 19.0 * x2); m_integral_dT_d(5, 8) = 19.0 * (-x1x1 - x2x2) / 10080.0 + 29.0 / 6720.0 * x1x2; m_integral_dT_d(6, 0) = m_integral_dT_d(0, 6); // symmetric part m_integral_dT_d(6, 1) = m_integral_dT_d(1, 6); // symmetric part m_integral_dT_d(6, 2) = m_integral_dT_d(2, 6); // symmetric part m_integral_dT_d(6, 3) = m_integral_dT_d(3, 6); // symmetric part m_integral_dT_d(6, 4) = m_integral_dT_d(4, 6); // symmetric part m_integral_dT_d(6, 5) = m_integral_dT_d(5, 6); // symmetric part m_integral_dT_d(6, 6) = 121.0 / 1260.0; m_integral_dT_d(6, 7) = (-y2) * 13.0 / 630.0; m_integral_dT_d(6, 8) = (-13.0 * x1 + 2.0 * 13.0 * x2) / 1260.0; m_integral_dT_d(7, 0) = m_integral_dT_d(0, 7); // symmetric part m_integral_dT_d(7, 1) = m_integral_dT_d(1, 7); // symmetric part m_integral_dT_d(7, 2) = m_integral_dT_d(2, 7); // symmetric part m_integral_dT_d(7, 3) = m_integral_dT_d(3, 7); // symmetric part m_integral_dT_d(7, 4) = m_integral_dT_d(4, 7); // symmetric part m_integral_dT_d(7, 5) = m_integral_dT_d(5, 7); // symmetric part m_integral_dT_d(7, 6) = m_integral_dT_d(6, 7); // symmetric part m_integral_dT_d(7, 7) = 5.0 / 1008.0 * y2y2; m_integral_dT_d(7, 8) = 5.0 / 2016.0 * y2 * (x1 - 2.0 * x2); m_integral_dT_d(8, 0) = m_integral_dT_d(0, 8); // symmetric part m_integral_dT_d(8, 1) = m_integral_dT_d(1, 8); // symmetric part m_integral_dT_d(8, 2) = m_integral_dT_d(2, 8); // symmetric part m_integral_dT_d(8, 3) = m_integral_dT_d(3, 8); // symmetric part m_integral_dT_d(8, 4) = m_integral_dT_d(4, 8); // symmetric part m_integral_dT_d(8, 5) = m_integral_dT_d(5, 8); // symmetric part m_integral_dT_d(8, 6) = m_integral_dT_d(6, 8); // symmetric part m_integral_dT_d(8, 7) = m_integral_dT_d(7, 8); // symmetric part m_integral_dT_d(8, 8) = 5.0 / 1008.0 * x2 * (x2 - x1) + 31.0 / 20160.0 * x1x1; } void Fem2DElementTriangle::computeIntegral_HxHxT() { // Compute the integral terms of Batoz Hx product functions // m_integralHxiHxj(i, j) = int_0^1 int_0^{1-eta} Hxi.Hxj dxi deta const double& a4 = m_ak[0]; const double& a5 = m_ak[1]; const double& a6 = m_ak[2]; const double& b4 = m_bk[0]; const double& b5 = m_bk[1]; const double& b6 = m_bk[2]; const double& c4 = m_ck[0]; const double& c5 = m_ck[1]; const double& c6 = m_ck[2]; m_integralHxiHxj.resize(9, 9); m_integralHxiHxj(0, 0) = 1. / 5. * (a6 * a6 - a5 * a6 + a5 * a5); m_integralHxiHxj(0, 1) = 1. / 15. * (b6 * (2.0 * a6 - a5) + b5 * (a6 - 2.0 * a5)); m_integralHxiHxj(0, 2) = 1. / 15. * (c6 * (-2.0 * a6 + a5) + c5 * (-a6 + 2.0 * a5)); m_integralHxiHxj(0, 3) = 1. / 10. * (a6 * (-2.0 * a6 + a5) + a4 * (a6 - a5)); m_integralHxiHxj(0, 4) = 1. / 15. * (b6 * (2.0 * a6 - a5) + b4 * (a6 - a5)); m_integralHxiHxj(0, 5) = 1. / 60. * a5 + 1. / 15. * (c6 * (-2.0 * a6 + a5) + c4 * (-a6 + a5)); m_integralHxiHxj(0, 6) = 1. / 10. * (a5 * (a6 - 2.0 * a5) + a4 * (-a6 + a5)); m_integralHxiHxj(0, 7) = 1. / 15. * (b5 * (a6 - 2.0 * a5) + b4 * (a6 - a5)); m_integralHxiHxj(0, 8) = -1. / 60. * a6 + 1. / 15. * (c5 * (-a6 + 2.0 * a5) + c4 * (-a6 + a5)); m_integralHxiHxj(1, 0) = m_integralHxiHxj(0, 1); // symmetric part m_integralHxiHxj(1, 1) = 4. / 45. * (b5 * b5 + b5 * b6 + b6 * b6); m_integralHxiHxj(1, 2) = 2. / 45. * (c5 * (-2.0 * b5 - b6) + c6 * (-b5 - 2.0 * b6)); m_integralHxiHxj(1, 3) = 1. / 15. * (a6 * (-2.0 * b6 - b5) + a4 * (b6 + b5)); m_integralHxiHxj(1, 4) = 2. / 45. * (b6 * (b5 + 2.0 * b6) + b4 * (b6 + b5)); m_integralHxiHxj(1, 5) = -1. / 90. * b5 + 2. / 45. * (c6 * (-2.0 * b6 - b5) - c4 * (b6 + b5)); m_integralHxiHxj(1, 6) = 1. / 15. * (a5 * (b6 + 2.0 * b5) - a4 * (b6 + b5)); m_integralHxiHxj(1, 7) = 2. / 45. * (b5 * (b6 + 2.0 * b5) + b4 * (b6 + b5)); m_integralHxiHxj(1, 8) = -1. / 90. * b6 - 2. / 45. * (c5 * (2.0 * b5 + b6) + c4 * (b6 + b5)); m_integralHxiHxj(2, 0) = m_integralHxiHxj(0, 2); // symmetric part m_integralHxiHxj(2, 1) = m_integralHxiHxj(1, 2); // symmetric part m_integralHxiHxj(2, 2) = 1. / 60. + 4. / 45. * (c5 * c5 + c6 * c6 + c5 * c6); m_integralHxiHxj(2, 3) = -1. / 60. * a4 + 1. / 15. * (-a4 * (c6 + c5) + a6 * (2.0 * c6 + c5)); m_integralHxiHxj(2, 4) = -1. / 90. * b4 - 2. / 45. * (b6 * (c5 + 2.0 * c6) + b4 * (c6 + c5)); m_integralHxiHxj(2, 5) = -1. / 360. + 1. / 90. * (c5 + c4) + 2. / 45. * (c6 * (2.0 * c6 + c5) + c4 * (c6 + c5)); m_integralHxiHxj(2, 6) = 1. / 60. * a4 + 1. / 15. * (a4 * (c6 + c5) - a5 * (c6 + 2.0 * c5)); m_integralHxiHxj(2, 7) = -1. / 90. * b4 - 2. / 45. * (b5 * (2.0 * c5 + c6) + b4 * (c6 + c5)); m_integralHxiHxj(2, 8) = -1. / 360. + 1. / 90. * (c6 + c4) + 2. / 45. * (c5 * (2.0 * c5 + c6) + c4 * (c6 + c5)); m_integralHxiHxj(3, 0) = m_integralHxiHxj(0, 3); // symmetric part m_integralHxiHxj(3, 1) = m_integralHxiHxj(1, 3); // symmetric part m_integralHxiHxj(3, 2) = m_integralHxiHxj(2, 3); // symmetric part m_integralHxiHxj(3, 3) = 1. / 5. * (a6 * a6 - a6 * a4 + a4 * a4); m_integralHxiHxj(3, 4) = 1. / 15. * (b6 * (-2.0 * a6 + a4) + b4 * (-a6 + 2.0 * a4)); m_integralHxiHxj(3, 5) = 1. / 15. * (c6 * (-a4 + 2.0 * a6) + c4 * (-2.0 * a4 + a6)); m_integralHxiHxj(3, 6) = 1. / 10. * (a6 * (-a5 + a4) + a4 * (a5 - 2.0 * a4)); m_integralHxiHxj(3, 7) = 1. / 15. * (-a6 * (b4 + b5) + a4 * (2.0 * b4 + b5)); m_integralHxiHxj(3, 8) = 1. / 60. * a6 + 1. / 15. * (a6 * (c4 + c5) - a4 * (2.0 * c4 + c5)); m_integralHxiHxj(4, 0) = m_integralHxiHxj(0, 4); // symmetric part m_integralHxiHxj(4, 1) = m_integralHxiHxj(1, 4); // symmetric part m_integralHxiHxj(4, 2) = m_integralHxiHxj(2, 4); // symmetric part m_integralHxiHxj(4, 3) = m_integralHxiHxj(3, 4); // symmetric part m_integralHxiHxj(4, 4) = 4. / 45. * (b6 * b6 + b6 * b4 + b4 * b4); m_integralHxiHxj(4, 5) = -2. / 45. * (b6 * (2.0 * b6 + c4) + b4 * (c6 + 2.0 * c4)); m_integralHxiHxj(4, 6) = 1. / 15. * (b6 * (a5 - a4) + b4 * (a5 - 2.0 * a4)); m_integralHxiHxj(4, 7) = 2. / 45. * (b6 * (b4 + b5) + b4 * (2.0 * b4 + b5)); m_integralHxiHxj(4, 8) = -1. / 90. * b6 - 2. / 45. * (b6 * (c4 + c5) + b4 * (2.0 * c4 + c5)); m_integralHxiHxj(5, 0) = m_integralHxiHxj(0, 5); // symmetric part m_integralHxiHxj(5, 1) = m_integralHxiHxj(1, 5); // symmetric part m_integralHxiHxj(5, 2) = m_integralHxiHxj(2, 5); // symmetric part m_integralHxiHxj(5, 3) = m_integralHxiHxj(3, 5); // symmetric part m_integralHxiHxj(5, 4) = m_integralHxiHxj(4, 5); // symmetric part m_integralHxiHxj(5, 5) = 1. / 60. + 4. / 45. * (c6 * c6 + c6 * c4 + c4 * c4); m_integralHxiHxj(5, 6) = -1. / 60. * a5 + 1. / 15. * (-a5 * (c6 + c4) + a4 * (c6 + 2.0 * c4)); m_integralHxiHxj(5, 7) = -1. / 90. * b5 - 2. / 45. * (c6 * (b4 + b5) + c4 * (b5 + 2.0 * b4)); m_integralHxiHxj(5, 8) = -1. / 360. + 1. / 90. * (c5 + c6) + 2. / 45. * (c4 * (2.0 * c4 + c5) + c6 * (c5 + c4)); m_integralHxiHxj(6, 0) = m_integralHxiHxj(0, 6); // symmetric part m_integralHxiHxj(6, 1) = m_integralHxiHxj(1, 6); // symmetric part m_integralHxiHxj(6, 2) = m_integralHxiHxj(2, 6); // symmetric part m_integralHxiHxj(6, 3) = m_integralHxiHxj(3, 6); // symmetric part m_integralHxiHxj(6, 4) = m_integralHxiHxj(4, 6); // symmetric part m_integralHxiHxj(6, 5) = m_integralHxiHxj(5, 6); // symmetric part m_integralHxiHxj(6, 6) = 1. / 5. * (a4 * a4 - a4 * a5 + a5 * a5); m_integralHxiHxj(6, 7) = 1. / 15. * (a5 * (b4 + 2.0 * b5) - a4 * (2.0 * b4 + b5)); m_integralHxiHxj(6, 8) = 1. / 15. * (-a5 * (c4 + 2.0 * c5) + a4 * (2.0 * c4 + c5)); m_integralHxiHxj(7, 0) = m_integralHxiHxj(0, 7); // symmetric part m_integralHxiHxj(7, 1) = m_integralHxiHxj(1, 7); // symmetric part m_integralHxiHxj(7, 2) = m_integralHxiHxj(2, 7); // symmetric part m_integralHxiHxj(7, 3) = m_integralHxiHxj(3, 7); // symmetric part m_integralHxiHxj(7, 4) = m_integralHxiHxj(4, 7); // symmetric part m_integralHxiHxj(7, 5) = m_integralHxiHxj(5, 7); // symmetric part m_integralHxiHxj(7, 6) = m_integralHxiHxj(6, 7); // symmetric part m_integralHxiHxj(7, 7) = 4. / 45. * (b4 * b4 + b4 * b5 + b5 * b5); m_integralHxiHxj(7, 8) = -2. / 45. * (b4 * (2.0 * c4 + c5) + b5 * (c4 + 2.0 * c5)); m_integralHxiHxj(8, 0) = m_integralHxiHxj(0, 8); // symmetric part m_integralHxiHxj(8, 1) = m_integralHxiHxj(1, 8); // symmetric part m_integralHxiHxj(8, 2) = m_integralHxiHxj(2, 8); // symmetric part m_integralHxiHxj(8, 3) = m_integralHxiHxj(3, 8); // symmetric part m_integralHxiHxj(8, 4) = m_integralHxiHxj(4, 8); // symmetric part m_integralHxiHxj(8, 5) = m_integralHxiHxj(5, 8); // symmetric part m_integralHxiHxj(8, 6) = m_integralHxiHxj(6, 8); // symmetric part m_integralHxiHxj(8, 7) = m_integralHxiHxj(7, 8); // symmetric part m_integralHxiHxj(8, 8) = 1. / 60. + 4. / 45. * (c4 * c4 + c5 * c4 + c5 * c5); } void Fem2DElementTriangle::computeIntegral_HyHyT() { // Compute the integral terms of Batoz Hy product functions // m_integralHyiHyj(i, j) = int_0^1 int_0^{1-eta} Hyi.Hyj dxi deta const double& b4 = m_bk[0]; const double& b5 = m_bk[1]; const double& b6 = m_bk[2]; const double& d4 = m_dk[0]; const double& d5 = m_dk[1]; const double& d6 = m_dk[2]; const double& e4 = m_ek[0]; const double& e5 = m_ek[1]; const double& e6 = m_ek[2]; m_integralHyiHyj.resize(9, 9); m_integralHyiHyj(0, 0) = 1. / 5. * (d6 * d6 - d5 * d6 + d5 * d5); m_integralHyiHyj(0, 1) = 1. / 15. * (d6 * (2.0 * e6 + e5) - d5 * (e6 + 2.0 * e5)); m_integralHyiHyj(0, 2) = 1. / 15. * (b6 * (-2.0 * d6 + d5) + b5 * (-d6 + 2.0 * d5)); m_integralHyiHyj(0, 3) = 1. / 10. * (d6 * (d4 - 2.0 * d6) + d5 * (-d4 + d6)); m_integralHyiHyj(0, 4) = -1. / 60. * d5 + 1. / 15. * (d6 * (2.0 * e6 + e4) - d5 * (e6 + e4)); m_integralHyiHyj(0, 5) = 1. / 15. * (b6 * (-2.0 * d6 + d5) + b4 * (-d6 + d5)); m_integralHyiHyj(0, 6) = 1. / 10. * (d6 * (d5 - d4) + d5 * (-2.0 * d5 + d4)); m_integralHyiHyj(0, 7) = 1. / 60. * d6 + 1. / 15. * (d6 * (e4 + e5) - d5 * (e4 + 2.0 * e5)); m_integralHyiHyj(0, 8) = 1. / 15. * (b5 * (-d6 + 2.0 * d5) + b4 * (-d6 + d5)); m_integralHyiHyj(1, 0) = m_integralHyiHyj(0, 1); // symmetric part m_integralHyiHyj(1, 1) = 1. / 60. + 4. / 45. * (e6 * e6 + e5 * e6 + e5 * e5); m_integralHyiHyj(1, 2) = 2. / 45. * (-e5 * (b6 + 2.0 * b5) - e6 * (b5 + 2.0 * b6)); m_integralHyiHyj(1, 3) = 1. / 60. * d4 + 1. / 15. * (e6 * (d4 - 2.0 * d6) + e5 * (-d6 + d4)); m_integralHyiHyj(1, 4) = -1. / 360. + 1. / 90. * (e5 + e4) + 2. / 45. * (e6 * (2.0 * e6 + e5) + e4 * (e5 + e6)); m_integralHyiHyj(1, 5) = -1. / 90. * b4 - 2. / 45. * (e5 * (b6 + b4) + e6 * (2.0 * b6 + b4)); m_integralHyiHyj(1, 6) = -1. / 60. * d4 + 1. / 15. * (e6 * (-d4 + d5) + e5 * (-d4 + 2.0 * d5)); m_integralHyiHyj(1, 7) = -1. / 360. + 1. / 90. * (e4 + e6) + 2. / 45. * (e6 * (e5 + e4) + e5 * (e4 + 2.0 * e5)); m_integralHyiHyj(1, 8) = -1. / 90. * b4 - 2. / 45. * (e5 * (b4 + 2.0 * b5) + e6 * (b5 + b4)); m_integralHyiHyj(2, 0) = m_integralHyiHyj(0, 2); // symmetric part m_integralHyiHyj(2, 1) = m_integralHyiHyj(1, 2); // symmetric part m_integralHyiHyj(2, 2) = 4. / 45. * (b5 * b5 + b5 * b6 + b6 * b6); m_integralHyiHyj(2, 3) = 1. / 15. * (b6 * (2.0 * d6 - d4) + b5 * (d6 - d4)); m_integralHyiHyj(2, 4) = -1. / 90. * b5 - 2. / 45. * (b6 * (2.0 * e6 + e4) + b5 * (e6 + e4)); m_integralHyiHyj(2, 5) = 2. / 45. * (b6 * (2.0 * b6 + b4) + b5 * (b6 + b4)); m_integralHyiHyj(2, 6) = 1. / 15. * (b6 * (-d5 + d4) + b5 * (-2.0 * d5 + d4)); m_integralHyiHyj(2, 7) = -1. / 90. * b6 - 2. / 45. * (b6 * (e5 + e4) + b5 * (2.0 * e5 + e4)); m_integralHyiHyj(2, 8) = 2. / 45. * (b5 * (b4 + 2.0 * b5) + b6 * (b4 + b5)); m_integralHyiHyj(3, 0) = m_integralHyiHyj(0, 3); // symmetric part m_integralHyiHyj(3, 1) = m_integralHyiHyj(1, 3); // symmetric part m_integralHyiHyj(3, 2) = m_integralHyiHyj(2, 3); // symmetric part m_integralHyiHyj(3, 3) = 1. / 5. * (d6 * d6 - d6 * d4 + d4 * d4); m_integralHyiHyj(3, 4) = 1. / 15. * (d4 * (e6 + 2.0 * e4) - d6 * (2.0 * e6 + e4)); m_integralHyiHyj(3, 5) = 1. / 15. * (d6 * (2.0 * b6 + b4) - d4 * (b6 + 2.0 * b4)); m_integralHyiHyj(3, 6) = 1. / 10. * (d6 * (-d5 + d4) + d4 * (d5 - 2.0 * d4)); m_integralHyiHyj(3, 7) = -1. / 60. * d6 + 1. / 15. * (-d6 * (e4 + e5) + d4 * (2.0 * e4 + e5)); m_integralHyiHyj(3, 8) = 1. / 15. * (d6 * (b4 + b5) - d4 * (2.0 * b4 + b5)); m_integralHyiHyj(4, 0) = m_integralHyiHyj(0, 4); // symmetric part m_integralHyiHyj(4, 1) = m_integralHyiHyj(1, 4); // symmetric part m_integralHyiHyj(4, 2) = m_integralHyiHyj(2, 4); // symmetric part m_integralHyiHyj(4, 3) = m_integralHyiHyj(3, 4); // symmetric part m_integralHyiHyj(4, 4) = 1. / 60. + 4. / 45. * (e6 * e6 + e6 * e4 + e4 * e4); m_integralHyiHyj(4, 5) = -2. / 45. * (e6 * (2.0 * b6 + b4) + e4 * (b6 + 2.0 * b4)); m_integralHyiHyj(4, 6) = 1. / 60. * d5 + 1. / 15. * (e6 * (d5 - d4) + e4 * (d5 - 2.0 * d4)); m_integralHyiHyj(4, 7) = -1. / 360. + 1. / 90. * (e6 + e5) + 2. / 45. * (e6 * (e5 + e4) + e4 * (e5 + 2.0 * e4)); m_integralHyiHyj(4, 8) = -1. / 90. * b5 - 2. / 45. * (e6 * (b5 + b4) + e4 * (b5 + 2.0 * b4)); m_integralHyiHyj(5, 0) = m_integralHyiHyj(0, 5); // symmetric part m_integralHyiHyj(5, 1) = m_integralHyiHyj(1, 5); // symmetric part m_integralHyiHyj(5, 2) = m_integralHyiHyj(2, 5); // symmetric part m_integralHyiHyj(5, 3) = m_integralHyiHyj(3, 5); // symmetric part m_integralHyiHyj(5, 4) = m_integralHyiHyj(4, 5); // symmetric part m_integralHyiHyj(5, 5) = 4. / 45. * (b6 * b6 + b6 * b4 + b4 * b4); m_integralHyiHyj(5, 6) = 1. / 15. * (b6 * (-d5 + d4) + b4 * (-d5 + 2.0 * d4)); m_integralHyiHyj(5, 7) = -1. / 90. * b6 - 2. / 45. * (b6 * (e4 + e5) + b4 * (2.0 * e4 + e5)); m_integralHyiHyj(5, 8) = 2. / 45. * (b6 * (b4 + b5) + b4 * (2.0 * b4 + b5)); m_integralHyiHyj(6, 0) = m_integralHyiHyj(0, 6); // symmetric part m_integralHyiHyj(6, 1) = m_integralHyiHyj(1, 6); // symmetric part m_integralHyiHyj(6, 2) = m_integralHyiHyj(2, 6); // symmetric part m_integralHyiHyj(6, 3) = m_integralHyiHyj(3, 6); // symmetric part m_integralHyiHyj(6, 4) = m_integralHyiHyj(4, 6); // symmetric part m_integralHyiHyj(6, 5) = m_integralHyiHyj(5, 6); // symmetric part m_integralHyiHyj(6, 6) = 1. / 5. * (d4 * d4 - d5 * d4 + d5 * d5); m_integralHyiHyj(6, 7) = 1. / 15. * (d5 * (e4 + 2.0 * e5) - d4 * (2.0 * e4 + e5)); m_integralHyiHyj(6, 8) = 1. / 15. * (-d5 * (b4 + 2.0 * b5) + d4 * (2.0 * b4 + b5)); m_integralHyiHyj(7, 0) = m_integralHyiHyj(0, 7); // symmetric part m_integralHyiHyj(7, 1) = m_integralHyiHyj(1, 7); // symmetric part m_integralHyiHyj(7, 2) = m_integralHyiHyj(2, 7); // symmetric part m_integralHyiHyj(7, 3) = m_integralHyiHyj(3, 7); // symmetric part m_integralHyiHyj(7, 4) = m_integralHyiHyj(4, 7); // symmetric part m_integralHyiHyj(7, 5) = m_integralHyiHyj(5, 7); // symmetric part m_integralHyiHyj(7, 6) = m_integralHyiHyj(6, 7); // symmetric part m_integralHyiHyj(7, 7) = 1. / 60. + 4. / 45. * (e4 * e4 + e4 * e5 + e5 * e5); m_integralHyiHyj(7, 8) = -2. / 45. * (e4 * (2.0 * b4 + b5) + e5 * (b4 + 2.0 * b5)); m_integralHyiHyj(8, 0) = m_integralHyiHyj(0, 8); // symmetric part m_integralHyiHyj(8, 1) = m_integralHyiHyj(1, 8); // symmetric part m_integralHyiHyj(8, 2) = m_integralHyiHyj(2, 8); // symmetric part m_integralHyiHyj(8, 3) = m_integralHyiHyj(3, 8); // symmetric part m_integralHyiHyj(8, 4) = m_integralHyiHyj(4, 8); // symmetric part m_integralHyiHyj(8, 5) = m_integralHyiHyj(5, 8); // symmetric part m_integralHyiHyj(8, 6) = m_integralHyiHyj(6, 8); // symmetric part m_integralHyiHyj(8, 7) = m_integralHyiHyj(7, 8); // symmetric part m_integralHyiHyj(8, 8) = 4. / 45. * (b4 * b4 + b4 * b5 + b5 * b5); } void Fem2DElementTriangle::computeShapeFunctionsParameters(const SurgSim::Math::OdeState& restState) { SURGSIM_ASSERT(m_nodeIds[0] < restState.getNumNodes()) << "Invalid nodeId[0] = " << m_nodeIds[0] << ", the number of nodes is " << restState.getNumNodes(); SURGSIM_ASSERT(m_nodeIds[1] < restState.getNumNodes()) << "Invalid nodeId[1] = " << m_nodeIds[1] << ", the number of nodes is " << restState.getNumNodes(); SURGSIM_ASSERT(m_nodeIds[2] < restState.getNumNodes()) << "Invalid nodeId[2] = " << m_nodeIds[2] << ", the number of nodes is " << restState.getNumNodes(); const SurgSim::Math::Vector3d a = restState.getPosition(m_nodeIds[0]); const SurgSim::Math::Vector3d b = restState.getPosition(m_nodeIds[1]); const SurgSim::Math::Vector3d c = restState.getPosition(m_nodeIds[2]); // Transforms the 3 triangle points in 2D triangle cartesian coordinates SurgSim::Math::RigidTransform3d inverseTransform; inverseTransform = SurgSim::Math::makeRigidTransform(m_initialRotation, a).inverse(); SurgSim::Math::Vector2d a2D = (inverseTransform * a).segment(0, 2); SurgSim::Math::Vector2d b2D = (inverseTransform * b).segment(0, 2); SurgSim::Math::Vector2d c2D = (inverseTransform * c).segment(0, 2); // To avoid confusion, we base all our notation on a 0-based indexing // Note that Batoz paper has a 0-based indexing as well, but Przemieniecki has a 1-base indexing double x0 = a2D[0]; double y0 = a2D[1]; double x1 = b2D[0]; double y1 = b2D[1]; double x2 = c2D[0]; double y2 = c2D[1]; // Note that by construction, we should have x0=y0=0 and y1=0 SURGSIM_ASSERT(std::abs(x0) < epsilon && std::abs(y0) < epsilon && std::abs(y1) < epsilon) << "Membrane local transform problem. We should have x0=y0=y1=0, but we have x0=" << x0 << " y0=" << y0 << " y1=" << y1; x0 = y0 = y1 = 0.0; // Force it to exactly 0 for numerical purpose // Also note that x1>=0 and y2>=0 by construction SURGSIM_ASSERT(x1 >= 0 && y2 >= 0) << "Membrane local transform problem. We should have " << "x1>=0 and y2>=0, but we have x1=" << x1 << " y2=" << y2; // Note: 2Area(ABC) = 2A = (x0y1 + x1y2 + x2y0 - x0y2 - x1y0 - x2y1) = // (x1-x2)(y1-y0) - (x1-x0)(y1-y2) = x12y10 - x10y12 // In the local frame, we have x0=y0=y1=0 // 2A = x1y2 (with x1>=0 and y2>=0) m_restArea = x1 * y2 / 2.0; SURGSIM_ASSERT(m_restArea != 0.0) << "Triangle with null area, A=(" << a.transpose() << "), B=(" << b.transpose() << "), C=(" << c.transpose() << ")"; SURGSIM_ASSERT(m_restArea > 0.0) << "Triangle with negtive area, Area = " << m_restArea << ", A=(" << a.transpose() << "), B=(" << b.transpose() << "), C=(" << c.transpose() << ")"; // Membrane shape functions // Notation: yij = yi - yj (reminder Przemieniecki use 1-based indexing, while we use 0-based) // Notation: xij = xi - xj (reminder Przemieniecki use 1-based indexing, while we use 0-based) // // Shape functions fi(x, y) = ai + bi.x + ci.y // Let's note A the area of the triangle // // Identifying coefficient for f1: // (a0) 1 ( x1y2-x2y1 -(x0y2-x2y0) x0y1-x1y0 )(1) 1/2A (x1y2-x2y1) ( x1y2-x2y1) // (b0) = ---- ( y1-y2 -(y0-y2) y0-y1 )(0) = 1/2A y12 = 1/2A (-y21 ) // (c0) 2A (-(x1-x2) x0-x2 -(x0-x1) )(0) 1/2A x21 ( x21 ) // Similarly for f2: // (a1) 1 ( x1y2-x2y1 -(x0y2-x2y0) x0y1-x1y0 )(0) 1/2A (x2y0-x0y2) (-x0y2+x2y0) // (b1) = ---- ( y1-y2 -(y0-y2) y0-y1 )(1) = 1/2A y20 = 1/2A ( y20 ) // (c1) 2A (-(x1-x2) x0-x2 -(x0-x1) )(0) 1/2A x02 (-x20 ) // Similarly for f3: // (a2) 1 ( x1y2-x2y1 -(x0y2-x2y0) x0y1-x1y0 )(0) 1/2A (x0y1-x1y0) ( x0y1-x1y0) // (b2) = ---- ( y1-y2 -(y0-y2) y0-y1 )(0) = 1/2A y01 = 1/2A (-y10 ) // (c2) 2A (-(x1-x2) x0-x2 -(x0-x1) )(1) 1/2A x10 ( x10 ) // // The above equation has been simplified in the following assignment using x0=y0=y1=0 // and 2A = x1y2 (cf. above for more details) // f0(x, y) = a0 + b0.x + c0.y, store a0 b0 c0 m_membraneShapeFunctionsParameters(0, 0) = 1.0; // = (x1 * y2 - x2 * y1) / 2A m_membraneShapeFunctionsParameters(0, 1) = -1.0 / x1; // = (y1 - y2) / 2A m_membraneShapeFunctionsParameters(0, 2) = (x2 / x1 - 1.0) / y2; // = (x2 - x1) / 2A // f1(x, y) = a1 + b1.x + c1.y, store a1 b1 c1 m_membraneShapeFunctionsParameters(1, 0) = 0.0; // = (x2 * y0 - x0 * y2) / 2A m_membraneShapeFunctionsParameters(1, 1) = 1.0 / x1; // = (y2 - y0) / 2A m_membraneShapeFunctionsParameters(1, 2) = -x2 / (x1 * y2); // = (x0 - x2) / 2A // f2(x, y) = a2 + b2.x + c2.y, store a2 b2 c2 m_membraneShapeFunctionsParameters(2, 0) = 0.0; // = (x0 * y1 - x1 * y0) / 2A m_membraneShapeFunctionsParameters(2, 1) = 0.0; // = (y0 - y1) / 2A m_membraneShapeFunctionsParameters(2, 2) = 1.0 / y2; // = (x1 - x0) / 2A // Thin-Plate Batoz specific data m_xij[0] = x1 - x2; // xij[0] = x1 - x2 m_xij[1] = x2; // xij[1] = x2 - x0 but x0=0 m_xij[2] = -x1; // xij[2] = x0 - x1 but x0=0 m_yij[0] = -y2; // yij[0] = y1 - y2 but y1=0 m_yij[1] = y2; // yij[1] = y2 - y0 but y0=0 m_yij[2] = 0.0; // yij[2] = y0 - y1 but y0=y1=0 for (size_t k = 0; k < 3; ++k) { m_lij_sqr[k] = m_xij[k] * m_xij[k] + m_yij[k] * m_yij[k]; // lij_sqr = xij^2 + yij^2 m_ak[k] = -m_xij[k] / m_lij_sqr[k]; // ak = -xij/li^2 m_bk[k] = 0.75 * m_xij[k] * m_yij[k] / m_lij_sqr[k]; // bk = 3/4 xij yij/lij^2 m_ck[k] = (0.25 * m_xij[k] * m_xij[k] - 0.5 * m_yij[k] * m_yij[k]) / m_lij_sqr[k]; // ck = (1/4 xij^2 - 1/2 yij^2)/lij^2 m_dk[k] = -m_yij[k] / m_lij_sqr[k]; // dk = -yij/lij^2 m_ek[k] = (0.25 * m_yij[k] * m_yij[k] - 0.5 * m_xij[k] * m_xij[k]) / m_lij_sqr[k]; // ek = (1/4 yij^2 - 1/2 xij^2)/lij^2 //// ... and some more for the derivatives... m_Pk[k] = 6.0 * m_ak[k]; // Pk = -6xij/lij^2 = 6ak m_qk[k] = 4.0 * m_bk[k]; // qk = 3xijyij/lij^2 = 4bk m_tk[k] = 6.0 * m_dk[k]; // tk = -6yij/lij^2 = 6dk m_rk[k] = 3.0 * m_yij[k] * m_yij[k] / m_lij_sqr[k]; // rk = 3yij^2/lij^2 } // Pre-compute the 3 integral terms useful for the plate mass matrix computeIntegral_dTd(); // associated to the displacement along z (noted w) computeIntegral_HyHyT(); // associated to the displacement along thetax computeIntegral_HxHxT(); // associated to the displacement along thetay } std::array Fem2DElementTriangle::batozDhxDxi(double xi, double eta) const { std::array res; double a = 1.0 - 2.0 * xi; res[0] = m_Pk[2] * a + (m_Pk[1] - m_Pk[2]) * eta; // P6(1-2xi) + (P5-P6)eta res[1] = m_qk[2] * a - (m_qk[1] + m_qk[2]) * eta; // q6(1-2xi) - (q5-q6)eta res[2] = -4.0 + 6.0 * (xi + eta) + m_rk[2] * a - // -4 + 6(xi+eta) + r6(1-2xi) - eta(r5+r6) eta * (m_rk[1] + m_rk[2]); res[3] = -m_Pk[2] * a + eta * (m_Pk[0] + m_Pk[2]); // -P6(1-2xi) + eta(P4+P6) res[4] = m_qk[2] * a - eta * (m_qk[2] - m_qk[0]); // q6(1-2xi) - eta(q6-q4) res[5] = -2.0 + 6.0 * xi + m_rk[2] * a + eta * (m_rk[0] - m_rk[2]); // -2 + 6xi + r6(1-2xi) + eta(r4-r6) res[6] = -eta * (m_Pk[1] + m_Pk[0]); // -eta(P5+P4) res[7] = eta * (m_qk[0] - m_qk[1]); // eta(a4-a5) res[8] = -eta * (m_rk[1] - m_rk[0]); // -eta(r5-r4) return res; } std::array Fem2DElementTriangle::batozDhxDeta(double xi, double eta) const { std::array res; double a = 1.0 - 2.0 * eta; res[0] = -m_Pk[1] * a - xi * (m_Pk[2] - m_Pk[1]); // -P5(1-2eta) - xi(P6-P5) res[1] = m_qk[1] * a - xi * (m_qk[1] + m_qk[2]); // q5(1-2eta) - xi(q5+q6) res[2] = -4.0 + 6.0 * (xi + eta) + m_rk[1] * a - // -4 + 6(xi+eta) + r5(1-2eta) - xi(r5+r6) xi * (m_rk[1] + m_rk[2]); res[3] = xi * (m_Pk[0] + m_Pk[2]); // xi(P4+P6) res[4] = xi * (m_qk[0] - m_qk[2]); // xi(q4-q6) res[5] = -xi * (m_rk[2] - m_rk[0]); // -xi(r6-r4) res[6] = m_Pk[1] * a - xi * (m_Pk[0] + m_Pk[1]); // P5(1-2eta) - xi(P4+P5) res[7] = m_qk[1] * a + xi * (m_qk[0] - m_qk[1]); // q5(1-2eta) + xi(q4-q5) res[8] = -2.0 + 6.0 * eta + m_rk[1] * a + xi * (m_rk[0] - m_rk[1]); // -2 + 6eta + r5(1-2eta) + xi(r4-r5) return res; } std::array Fem2DElementTriangle::batozDhyDxi(double xi, double eta) const { std::array res; double a = 1.0 - 2.0 * xi; res[0] = m_tk[2] * a + eta * (m_tk[1] - m_tk[2]); // t6(1-2xi) + eta(t5-t6) res[1] = 1.0 + m_rk[2] * a - eta * (m_rk[1] + m_rk[2]); // 1+r6(1-2xi) - eta(r5+r6) res[2] = -m_qk[2] * a + eta * (m_qk[1] + m_qk[2]); // -q6(1-2xi) + eta(q5+q6) res[3] = -m_tk[2] * a + eta * (m_tk[0] + m_tk[2]); // -t6(1-2xi) + eta(t4+t6) res[4] = -1.0 + m_rk[2] * a + eta * (m_rk[0] - m_rk[2]); // -1 + r6(1-2xi) + eta(r4-r6) res[5] = -m_qk[2] * a - eta * (m_qk[0] - m_qk[2]); // -q6(1-2xi) - eta(q4-q6) res[6] = -eta * (m_tk[0] + m_tk[1]); // -eta(t4+t5) res[7] = eta * (m_rk[0] - m_rk[1]); // eta(r4-r5) res[8] = -eta * (m_qk[0] - m_qk[1]); // -eta(q4-q5) return res; } std::array Fem2DElementTriangle::batozDhyDeta(double xi, double eta) const { std::array res; double a = 1.0 - 2.0 * eta; res[0] = -m_tk[1] * a - xi * (m_tk[2] - m_tk[1]); // -t5(1-2eta) - xi(t6-t5) res[1] = 1.0 + m_rk[1] * a - xi * (m_rk[1] + m_rk[2]); // 1+r5(1-2eta) - xi(r5+r6) res[2] = -m_qk[1] * a + xi * (m_qk[1] + m_qk[2]); // -q5(1-2eta) + xi(q5+q6) res[3] = xi * (m_tk[0] + m_tk[2]); // xi(t4+t6) res[4] = xi * (m_rk[0] - m_rk[2]); // xi(r4-r6) res[5] = -xi * (m_qk[0] - m_qk[2]); // -xi(q4-q6) res[6] = m_tk[1] * a - xi * (m_tk[0] + m_tk[1]); // t5(1-2eta) - xi(t4+t5) res[7] = -1.0 + m_rk[1] * a + xi * (m_rk[0] - m_rk[1]); // -1 + r5(1-2eta) + xi (r4-r5) res[8] = -m_qk[1] * a - xi * (m_qk[0] - m_qk[1]); // -q5(1-2eta) - xi(q4-q5) return res; } Fem2DElementTriangle::Matrix39Type Fem2DElementTriangle::batozStrainDisplacement(double xi, double eta)const { Matrix39Type res; std::array dHx_dxi, dHx_deta, dHy_dxi, dHy_deta; double coefficient = 1.0 / (2.0 * m_restArea); dHx_dxi = batozDhxDxi(xi, eta); dHx_deta = batozDhxDeta(xi, eta); dHy_dxi = batozDhyDxi(xi, eta); dHy_deta = batozDhyDeta(xi, eta); for (size_t i = 0; i < 9; ++i) { // 4 -> mid-edge 12 // 5 -> mid-edge 20 // 6 -> mid-edge 01 res(0, i) = coefficient * (m_yij[1] * dHx_dxi[i] + m_yij[2] * dHx_deta[i]); res(1, i) = coefficient * (-m_xij[1] * dHy_dxi[i] - m_xij[2] * dHy_deta[i]); res(2, i) = coefficient * (-m_xij[1] * dHx_dxi[i] - m_xij[2] * dHx_deta[i] + m_yij[1] * dHy_dxi[i] + m_yij[2] * dHy_deta[i]); } return res; } } // namespace Physics } // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/Fem2DElementTriangle.h000066400000000000000000000271101277777236100231760ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_FEM2DELEMENTTRIANGLE_H #define SURGSIM_PHYSICS_FEM2DELEMENTTRIANGLE_H #include #include "SurgSim/Physics/Fem.h" #include "SurgSim/Physics/FemElement.h" namespace SurgSim { namespace Physics { SURGSIM_STATIC_REGISTRATION(Fem2DElementTriangle); /// 2D FemElement based on a triangle with a constant thickness /// /// The triangle is modeled as a shell (6DOF) which is decomposed into a membrane (in-plane 2DOF \f$(x, y)\f$) and a /// plate (bending/twisting 3DOF \f$(z, \theta_x, \theta_y)\f$). The thin-plate assumption does not consider the /// drilling dof \f$\theta_z\f$. /// The system includes the drilling DOF for completeness but does not assign any mass or stiffness to it. /// /// The membrane (in-plane) equations (mass and stiffness) are following /// "Theory of Matrix Structural Analysis" from J.S. Przemieniecki. /// /// The thin-plate (bending) equations (mass and stiffness) are following /// "A Study Of Three-Node Triangular Plate Bending Elements", Jean-Louis Batoz /// Numerical Methods in Engineering, vol 15, 1771-1812 (1980).
/// The plate mass matrix is not detailed in the above paper, but the analytical equations /// have been derived from it. Moreover, to account for contribution of the displacement /// along z to the plate mass matrix, we used a cubic expression of this displacement given in: /// "Shell elements: modelizations DKT, DST, DKTG and Q4g", Code_Aster, 2013, Thomas De Soza. /// /// \note The element is considered to have a constant thickness. /// \note The element uses linear elasticity (not visco-elasticity), so it does not have any damping. class Fem2DElementTriangle : public FemElement { typedef Eigen::Matrix Matrix33Type; typedef Eigen::Matrix Matrix36Type; typedef Eigen::Matrix Matrix66Type; typedef Eigen::Matrix Matrix39Type; typedef Eigen::Matrix Matrix99Type; public: /// Constructor Fem2DElementTriangle(); /// Constructor /// \param nodeIds An array of 3 node ids defining this triangle element with respect to a /// DeformableRepresentationState which is passed to the initialize method. explicit Fem2DElementTriangle(std::array nodeIds); /// Constructor for FemElement object factory /// \param elementData A FemElement struct defining this triangle element with respect to a /// DeformableRepresentationState which is passed to the initialize method. /// \exception SurgSim::Framework::AssertionFailure if nodeIds has a size different than 3 explicit Fem2DElementTriangle(std::shared_ptr elementData); SURGSIM_CLASSNAME(SurgSim::Physics::Fem2DElementTriangle) /// Sets the triangle's thickness /// \param thickness The thickness of the triangle void setThickness(double thickness); /// Gets the triangle's thickness /// \return The thickness of the triangle double getThickness() const; void initialize(const SurgSim::Math::OdeState& state) override; double getVolume(const SurgSim::Math::OdeState& state) const override; SurgSim::Math::Vector computeCartesianCoordinate(const SurgSim::Math::OdeState& state, const SurgSim::Math::Vector& naturalCoordinate) const override; SurgSim::Math::Vector computeNaturalCoordinate(const SurgSim::Math::OdeState& state, const SurgSim::Math::Vector& cartesianCoordinate) const override; protected: /// Initializes variables needed before Initialize() is called void initializeMembers(); /// Computes the triangle element's rotation given a state /// \param state The state to compute the rotation from /// \return The rotation matrix of the element in the given state SurgSim::Math::Matrix33d computeRotation(const SurgSim::Math::OdeState& state); /// Computes the triangle's local stiffness matrix /// \param state The state to compute the local stiffness matrix from /// \param[out] localStiffnessMatrix The local stiffness matrix to store the result into virtual void computeLocalStiffness(const SurgSim::Math::OdeState& state, Eigen::Matrix* localStiffnessMatrix); /// Computes the triangle's stiffness matrix /// \param state The state to compute the stiffness matrix from /// \param[out] stiffnessMatrix The stiffness matrix to store the result into void computeStiffness(const SurgSim::Math::OdeState& state, SurgSim::Math::Matrix* stiffnessMatrix); /// Computes the triangle's local mass matrix /// \param state The state to compute the local mass matrix from /// \param[out] localMassMatrix The local mass matrix to store the result into virtual void computeLocalMass(const SurgSim::Math::OdeState& state, Eigen::Matrix* localMassMatrix); /// Computes the triangle's mass matrix /// \param state The state to compute the mass matrix from /// \param[out] massMatrix The mass matrix to store the result into void computeMass(const SurgSim::Math::OdeState& state, SurgSim::Math::Matrix* massMatrix); void doUpdateFMDK(const Math::OdeState& state, int options) override; /// The element's rest state Eigen::Matrix m_x0; /// Initial rotation matrix for the element SurgSim::Math::Matrix33d m_initialRotation; /// Stiffness matrix (in local coordinate frame) Eigen::Matrix m_MLocal; /// Stiffness matrix (in local coordinate frame) Eigen::Matrix m_KLocal; /// The triangle rest area double m_restArea; /// Thickness of the element double m_thickness; /// Compute the various shape functions (membrane and plate deformations) parameters /// \param restState the rest state to compute the shape functions parameters from void computeShapeFunctionsParameters(const SurgSim::Math::OdeState& restState); /// Membrane (in-plane) deformation. DOF simulated: (x, y). /// "Theory of Matrix Structural Analysis" from J.S. Przemieniecki. /// Shape functions are \f$f_i(x, y) = a_i + b_i.x + c_i.y\f$, here we store \f$(a_i, b_i, c_i)\f$ on each row. SurgSim::Math::Matrix33d m_membraneShapeFunctionsParameters; // Thin-plate (bending/twisting) specific data structure // DOF simulated: (z, thetaX, thetaY) // "A Study Of Three-Node Triangular Plate Bending Elements", Jean-Louis Batoz // Numerical Methods in Engineering, vol 15, 1771-1812 (1980) // Indices are as follow: // 0 1 2 denotes triangle's points ABC: // 4 (mid-edge 12) 5 (mid-edge 20) 6 (mid-edge 01) denotes mid-edge points // Data structures having only mid-edge information are 0 based (0->4 (mid-egde 12) ; 1->5 ; 2->6) //@{ SurgSim::Math::Vector3d m_xij; ///< Batoz variable \f$x_{ij} = x_i - x_j\f$ SurgSim::Math::Vector3d m_yij; ///< Batoz variable \f$y_{ij} = y_i - y_j\f$ SurgSim::Math::Vector3d m_lij_sqr; ///< Batoz variable \f$l_{ij}^2 = x_{ij}^2 + y_{ij}^2\f$ SurgSim::Math::Vector3d m_ak; ///< Batoz variable \f$a_{k} = -x_{ij}/l_i^2\f$ SurgSim::Math::Vector3d m_bk; ///< Batoz variable \f$b_{k} = 3/4 x_{ij} y_{ij}/l_{ij}2\f$ SurgSim::Math::Vector3d m_ck; ///< Batoz variable \f$c_{k} = (1/4 x_{ij}^2 - 1/2 y_{ij}^2)/l_{ij}^2\f$ SurgSim::Math::Vector3d m_dk; ///< Batoz variable \f$d_{k} = -y_{ij}/l_{ij}^2\f$ SurgSim::Math::Vector3d m_ek; ///< Batoz variable \f$e_{k} = (1/4 y_{ij}^2 - 1/2 x_{ij}^2)/l_{ij}^2\f$ //@} //@{ SurgSim::Math::Vector3d m_Pk; ///< Batoz variable \f$P_{k} = -6x_{ij}/l_{ij}^2 = 6.\textrm{m_a}_k\f$ SurgSim::Math::Vector3d m_qk; ///< Batoz variable \f$q_{k} = 3x_{ij}y_{ij}/l_{ij}^2 = 4.\textrm{m_b}_k\f$ SurgSim::Math::Vector3d m_tk; ///< Batoz variable \f$t_{k} = -6y_{ij}/l_{ij}^2 = 6.\textrm{m_d}_k\f$ SurgSim::Math::Vector3d m_rk; ///< Batoz variable \f$r_{k} = 3y_{ij}^2/l_{ij}^2\f$ //@} //@{ SurgSim::Math::Matrix m_integral_dT_d; ///< Plate mass matrix: integral terms related to the dof \f$(z)\f$ SurgSim::Math::Matrix m_integralHyiHyj; ///< Plate mass matrix: integral terms related to the dof \f$(\theta_x)\f$ SurgSim::Math::Matrix m_integralHxiHxj; ///< Plate mass matrix: integral terms related to the dof \f$(\theta_y)\f$ //@} /// Batoz derivative dHx/dxi /// \param xi, eta The parametric coordinate (in [0 1] and xi+eta<1.0) /// \return The vector dHx/dxi evaluated at (xi, eta) std::array batozDhxDxi(double xi, double eta) const; /// Batoz derivative dHx/deta /// \param xi, eta The parametric coordinate (in [0 1] and xi+eta<1.0) /// \return The vector dHx/deta evaluated at (xi, eta) std::array batozDhxDeta(double xi, double eta) const; /// Batoz derivative dHy/dxi /// \param xi, eta The parametric coordinate (in [0 1] and xi+eta<1.0) /// \return The vector dHy/dxi evaluated at (xi, eta) std::array batozDhyDxi(double xi, double eta) const; /// Batoz derivative dHy/deta /// \param xi, eta The parametric coordinate (in [0 1] and xi+eta<1.0) /// \return The vector dHy/deta evaluated at (xi, eta) std::array batozDhyDeta(double xi, double eta) const; /// Batoz strain displacement matrix evaluated at a given point /// \param xi, eta The parametric coordinate (in [0 1] and xi+eta<1.0) /// \return The 3x9 strain displacement matrix evaluated at (xi, eta) Matrix39Type batozStrainDisplacement(double xi, double eta) const; private: /// Computes the triangle's local membrane part mass matrix /// \param state The state to compute the local membrane part mass matrix from /// \param[out] localMassMatrix The local mass matrix to store the result into void computeLocalMembraneMass(const SurgSim::Math::OdeState& state, Eigen::Matrix* localMassMatrix); /// Computes the triangle's local plate part mass matrix /// \param state The state to compute the local plate part mass matrix from /// \param[out] localMassMatrix The local mass matrix to store the result into /// \note The plate mass matrix is composed of 3 matrices associated respectively to /// \note displacements in direction (z, thetax, thetay). void computeLocalPlateMass(const SurgSim::Math::OdeState& state, Eigen::Matrix* localMassMatrix); /// Computes the integral terms d^T.d over the parametrized triangle area. /// This integral is required in the plate mass matrix computation. /// The displacement along z is w(x, y) = [d1 d2 d3 d4 d5 d6 d7 d8 d9].U = d.U /// with di cubic shape functions and U nodal plate displacements. void computeIntegral_dTd(); /// Computes the integral terms Hy.Hy^T over the parametrized triangle area. /// This integral is required in the plate mass matrix computation. /// The displacement along thetay is Thetay(x, y) = -dw/dx = betax = Hx^T.U /// with Hxi quadratic shape functions and U nodal plate displacements. void computeIntegral_HxHxT(); /// Computes the integral terms Hx.Hx^T over the parametrized triangle area. /// This integral is required in the plate mass matrix computation. /// The displacement along thetax is Thetax(x, y) = dw/dy = -betay = -Hy^T.U /// with Hyi quadratic shape functions and U nodal plate displacements. void computeIntegral_HyHyT(); }; } // namespace Physics } // namespace SurgSim #endif // SURGSIM_PHYSICS_FEM2DELEMENTTRIANGLE_H opensurgsim-0.7.0/SurgSim/Physics/Fem2DElementTriangle_computeLocalMembraneMass.dox000066400000000000000000000104031277777236100305400ustar00rootroot00000000000000/*! \fn void SurgSim::Physics::Fem2DElementTriangle::computeLocalMembraneMass(const SurgSim::Math::OdeState& state, Eigen::Matrix* localMassMatrix)
The mass matrix is derived from the kinetic energy, which depends on the displacements \f$\mathbf{u}\f$.
In the case of triangle membrane, the displacements are a subset of the full shell displacements: \f[ \displaystyle \mathbf{u}(x, y) = \left( \begin{array}{c} u_x(x, y) \\ u_y(x, y) \end{array} \right) = \left( \begin{array}{c} \sum_{i=0}^2 N_i(x, y).u_x^i \\ \sum_{i=0}^2 N_i(x, y).u_y^i \end{array} \right) = \left( \begin{array}{cccccc} N_0(x, y) & 0 & N_1(x, y) & 0 & N_2(x, y) & 0 \\ 0 & N_0(x, y) & 0 & N_1(x, y) & 0 & N_2(x, y) \end{array} \right) \left( \begin{array}{c} u_x^0 \\ u_y^0 \\ u_x^1 \\ u_y^1 \\ u_x^2 \\ u_y^2 \end{array} \right) = a.\mathbf{U} \f] with \f$\mathbf{U}\f$ the triangle membrane nodal displacements vector (subset of the full shell nodal displacements) and \f$N_i(x, y) = a_i + b_i.x + c_i.y\f$ the triangle linear shape functions. Considering a constant mass density \f$\rho\f$ and a constant thickness \f$t\f$, the kinetic energy of the triangle membrane is \f$T = \int_V \frac{1}{2} \rho(x, y, z) \mathbf{\dot{u}}^T.\mathbf{\dot{u}} \, dV = \frac{1}{2}.\rho.t.\int_A \left(\dot{\mathbf{U}}^T.a^T\right).\left(a.\dot{\mathbf{U}}\right) \, dA\f$. The triangle membrane mass matrix can be derived from the kinetic energy using the Lagrange equation of motion: \f[ \displaystyle \frac{d \frac{\partial T}{\partial \dot{\mathbf{U}}}}{d t} = \frac{1}{2}.\rho.t.\frac{d \frac{\partial \displaystyle \int_A \left(\dot{\mathbf{U}}^T.a^T\right).\left(a.\dot{\mathbf{U}}\right) \, dA}{\partial \dot{\mathbf{U}}}}{d t} = \frac{1}{2}.\rho.t.\frac{d \displaystyle \int_A 2.a^T.a.\dot{\mathbf{U}} \, dA}{d t} = \left( \rho.t.\int_A a^T.a \, dA \right).\ddot{\mathbf{U}} \f] Therefore, the mass matrix is: \f[ M = \rho.t.\int_A a^T.a \, dA \f] To integrate over the triangle area, we operate the following variables change: \f[ \left\{ \begin{array}{ccc} x(\xi, \eta) & = & x_0 + \xi.(x_1 - x_0) + \eta.(x_2 - x_0) \\ y(\xi, \eta) & = & y_0 + \xi.(y_1 - y_0) + \eta.(y_2 - y_0) \end{array} \right. \f] Therefore, we have \f$ J = \left( \begin{array}{cc} \frac{\partial x}{\partial \xi} & \frac{\partial x}{\partial \eta} \\ \frac{\partial y}{\partial \xi} & \frac{\partial y}{\partial \eta} \end{array} \right) = \left( \begin{array}{cc} (x_1 - x_0) & (x_2 - x_0) \\ (y_1 - y_0) & (y_2 - y_0) \\ \end{array} \right) \f$ and \f$|J| = 2A\f$. Therefore the mass matrix becomes \f[ M = \rho.t.\int_0^1 \int_0^{1-\eta} a^T.a |J| \, d\xi \, d\eta = 2.A.\rho.t.\int_0^1 \int_0^{1-\eta} \left( \begin{array}{cccccc} N0.N0 & 0 & N0.N1 & 0 & N0.N2 & 0 \\ 0 & N0.N0 & 0 & N0.N1 & 0 & N0.N2 \\ N1.N0 & 0 & N1.N1 & 0 & N1.N2 & 0 \\ 0 & N1.N0 & 0 & N1.N1 & 0 & N1.N2 \\ N2.N0 & 0 & N2.N1 & 0 & N2.N2 & 0 \\ 0 & N2.N0 & 0 & N2.N1 & 0 & N2.N2 \end{array} \right) \, d\xi \, d\eta \f] Considering the triangle in its local space (i.e. \f$x_0=y_0=y_1=0\f$, \f$x_1>0\f$, \f$y_2>0\f$), we get: \f[ M = 2.A.\rho.t. \left( \begin{array}{cccccc} \frac{1.0}{12.0} & 0 & \frac{1.0}{24.0} & 0 & \frac{1.0}{24.0} & 0 \\ 0 & \frac{1.0}{12.0} & 0 & \frac{1.0}{24.0} & 0 & \frac{1.0}{24.0} \\ \frac{1.0}{24.0} & 0 & \frac{1.0}{12.0} & 0 & \frac{1.0}{24.0} & 0 \\ 0 & \frac{1.0}{24.0} & 0 & \frac{1.0}{12.0} & 0 & \frac{1.0}{24.0} \\ \frac{1.0}{24.0} & 0 & \frac{1.0}{24.0} & 0 & \frac{1.0}{12.0} & 0 \\ 0 & \frac{1.0}{24.0} & 0 & \frac{1.0}{24.0} & 0 & \frac{1.0}{12.0} \end{array} \right) = \rho.A.t. \left( \begin{array}{cccccc} \frac{1.0}{6.0} & 0 & \frac{1.0}{12.0} & 0 & \frac{1.0}{12.0} & 0 \\ 0 & \frac{1.0}{6.0} & 0 & \frac{1.0}{12.0} & 0 & \frac{1.0}{12.0} \\ \frac{1.0}{12.0} & 0 & \frac{1.0}{6.0} & 0 & \frac{1.0}{12.0} & 0 \\ 0 & \frac{1.0}{12.0} & 0 & \frac{1.0}{6.0} & 0 & \frac{1.0}{12.0} \\ \frac{1.0}{12.0} & 0 & \frac{1.0}{12.0} & 0 & \frac{1.0}{6.0} & 0 \\ 0 & \frac{1.0}{12.0} & 0 & \frac{1.0}{12.0} & 0 & \frac{1.0}{6.0} \end{array} \right) \f] which needs to be assembled properly in the full shell element mass matrix. */opensurgsim-0.7.0/SurgSim/Physics/Fem2DElementTriangle_computeLocalPlateMass.dox000066400000000000000000000141541277777236100300660ustar00rootroot00000000000000/*! \fn void SurgSim::Physics::Fem2DElementTriangle::computeLocalPlateMass(const SurgSim::Math::OdeState& state, Eigen::Matrix* localMassMatrix)
The mass matrix is derived from the kinetic energy, which depends on the displacements \f$\mathbf{u}\f$.
In the case of triangle plate, the displacements are a subset of the full shell displacements: \f[ \displaystyle \mathbf{u}(x, y, z) = \left( \begin{array}{c} u(x, y, z) = z.\beta_x(x, y) \\ v(x, y, z) = z.\beta_y(x, y) \\ w(x, y) \end{array} \right) \f] Note that we use the plate formulation DKT (Discrete Kirchhoff Theory) developped by Batoz in 1980. In this formulation, the displacement \f$w\f$ is never formaly expressed, we only know that it is a cubic polynomial function of \f$(x, y)\f$. To complete the plate mass matrix calculation, we tried to use the expression of \f$w\f$ from Przemieniecki book "Theory of Matrix Structural Analysis" Chapter 11.10, equation 11.57 (i.e. \f$w(x, y) = \mathbf{d}.C^{-1}.\mathbf{U}\f$). Unfortunately, it can occur that the matrix \f$C\f$ becomes singular (example of a right isoceles triangle, i.e. \f$x_0=y_0=y_1=x_2=0\f$ and \f$x_1=y_2=1\f$). To overcome this issue, we prefered the Code_Aster approach developped in "Shell elements: modelizations DKT, DST, DKTG and Q4g", Code_Aster, 2013, Thomas De Soza, where a cubic well defined expression of \f$w(x, y)\f$ is given as: \f$w(x, y) = \mathbf{d}.\mathbf{U}\f$ where \f$d_i\f$ are cubic shape functions. Therefore, it leads to the following plate displacements: \f[ \mathbf{u}(x, y, z) = \left( \begin{array}{c} u(x, y, z) = z.\beta_x(x, y) = z.\mathbf{H_x}^T(\xi, \eta).\mathbf{U} \\ v(x, y, z) = z.\beta_y(x, y) = z.\mathbf{H_y}^T(\xi, \eta).\mathbf{U} \\ w(x, y) = \mathbf{d}.\mathbf{U} \end{array} \right) = \left( \begin{array}{c} z.\mathbf{H_x}^T(\xi, \eta) \\ z.\mathbf{H_y}^T(\xi, \eta) \\ \mathbf{d} \end{array} \right) . \mathbf{U} = a.\mathbf{U} \f] with \f$\mathbf{U}\f$ the triangle plate nodal displacements vector (subset of the full shell nodal displacements) and \f$\mathbf{H_x}\f$ and \f$\mathbf{H_y}\f$ are the Batoz shape functions. Considering a constant mass density \f$\rho\f$ and a constant thickness \f$t\f$, the kinetic energy of the triangle plate is \f$T = \int_V \frac{1}{2} \rho(x, y, z) \mathbf{\dot{u}}^T.\mathbf{\dot{u}} \, dV = \frac{1}{2}.\rho.\int_{-t/2}^{+t/2} \int_A \left(\dot{\mathbf{U}}^T.a^T\right).\left(a.\dot{\mathbf{U}}\right) \, dA \, dz \f$. The triangle plate mass matrix can be derived from the kinetic energy using the Lagrange equation of motion: \f[ \displaystyle \frac{d \frac{\partial T}{\partial \dot{\mathbf{U}}}}{d t} = \frac{1}{2}.\rho.\frac{d \frac{\partial \displaystyle \int_{-t/2}^{+t/2} \int_A \left(\dot{\mathbf{U}}^T.a^T\right).\left(a.\dot{\mathbf{U}}\right) \, dA \, dz}{\partial \dot{\mathbf{U}}}}{d t} = \frac{1}{2}.\rho.\frac{d \displaystyle \int_{-t/2}^{+t/2} \int_A 2.a^T.a.\dot{\mathbf{U}} \, dA \, dz}{d t} \\ = \left( \rho.\int_{-t/2}^{+t/2} \int_A a^T.a \, dA \, dz \right).\ddot{\mathbf{U}} = \left( \rho.\int_{-t/2}^{+t/2} \int_A (z.\mathbf{H_x}).(z.\mathbf{H_x}^T) + (z.\mathbf{H_y}).(z.\mathbf{H_y}^T) + \mathbf{d}^T).\mathbf{d} \, dA \, dz \right).\ddot{\mathbf{U}} \f] Therefore, the mass matrix is: \f[ M = \rho.\int_{-t/2}^{+t/2} \int_A (z.\mathbf{H_x}).(z.\mathbf{H_x}^T) \, dA \, dz + \rho.\int_{-t/2}^{+t/2} \int_A (z.\mathbf{H_y}).(z.\mathbf{H_y}^T) \, dA \, dz + \rho.\int_{-t/2}^{+t/2} \int_A \mathbf{d}^T.\mathbf{d} \, dA \, dz \f] It clearly appears that the triangle plate mass matrix is composed of 3 matrices, each providing the contribution of a displacement (i.e. \f$(u, v, w)\f$) associated to a given degree of freedom (i.e. respectively \f$(\theta_y, \theta_x, z)\f$). Let's note these 3 matrices \f$M_u\f$, \f$M_v\f$ and \f$M_w\f$. To integrate over the triangle area, we operate the following variables change: \f[ \left\{ \begin{array}{ccc} x(\xi, \eta) & = & x_0 + \xi.(x_1 - x_0) + \eta.(x_2 - x_0) \\ y(\xi, \eta) & = & y_0 + \xi.(y_1 - y_0) + \eta.(y_2 - y_0) \end{array} \right. \f] Therefore, we have \f$ J = \left( \begin{array}{cc} \frac{\partial x}{\partial \xi} & \frac{\partial x}{\partial \eta} \\ \frac{\partial y}{\partial \xi} & \frac{\partial y}{\partial \eta} \end{array} \right) = \left( \begin{array}{cc} (x_1 - x_0) & (x_2 - x_0) \\ (y_1 - y_0) & (y_2 - y_0) \\ \end{array} \right) \f$ and \f$|J| = 2A\f$. Therefore the mass matrices become (noting that the shape functions \f$d_i\f$ do not depend on \f$z\f$): \f[ \begin{array}{ccc} M_u & = & \rho.\int_{-t/2}^{+t/2} \int_A (z.\mathbf{H_x}).(z.\mathbf{H_x}^T) \, dA \, dz = \rho.\int_{-t/2}^{+t/2} z^2 \, dz.\int_A \mathbf{H_x}.\mathbf{H_x}^T \, dA \\ & = & \rho.\frac{t^3}{12}.\int_0^1 \int_0^{1-\eta} \mathbf{H_x}.\mathbf{H_x}^T |J| \, d\xi d\eta = 2.A.\rho.\frac{t^3}{12}.\int_0^1 \int_0^{1-\eta} \mathbf{H_x}.\mathbf{H_x}^T \, d\xi d\eta \\ M_v & = & \rho.\int_{-t/2}^{+t/2} \int_A (z.\mathbf{H_y}).(z.\mathbf{H_y}^T) \, dA \, dz = \rho.\int_{-t/2}^{+t/2} z^2 \, dz.\int_A \mathbf{H_y}.\mathbf{H_y}^T \, dA \\ & = & \rho.\frac{t^3}{12}.\int_0^1 \int_0^{1-\eta} \mathbf{H_y}.\mathbf{H_y}^T |J| \, d\xi d\eta = 2.A.\rho.\frac{t^3}{12}.\int_0^1 \int_0^{1-\eta} \mathbf{H_y}.\mathbf{H_y}^T \, d\xi d\eta \\ M_w & = & \rho.\int_{-t/2}^{+t/2} \int_A \mathbf{d}^T.\mathbf{d} \, dA \, dz = 2.A.\rho.t.\int_0^1 \int_0^{1-\eta} \mathbf{d}^T.\mathbf{d} \, d\xi d\eta \end{array} \f] To evaluate the 3 integral terms \f[ \begin{array}{ccccc} \int_0^1 \int_0^{1-\eta} \mathbf{H_x}.\mathbf{H_x}^T \, d\xi d\eta & , & \int_0^1 \int_0^{1-\eta} \mathbf{H_y}.\mathbf{H_y}^T \, d\xi d\eta & , & \int_0^1 \int_0^{1-\eta} \mathbf{d}^T.\mathbf{d} \, d\xi d\eta \end{array} \f] we used a formal mathematical package and tested the corresponding code against a numerically exact evaluation using the appropriate Gauss quadrature on the triangle. The resulting triangle plate mass matrix needs to be assembled properly in the full shell element mass matrix. */opensurgsim-0.7.0/SurgSim/Physics/Fem2DLocalization.cpp000066400000000000000000000047211277777236100231050ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Physics/Fem2DLocalization.h" #include "SurgSim/DataStructures/Location.h" #include "SurgSim/Math/Geometry.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/Fem2DRepresentation.h" #include "SurgSim/Physics/FemElement.h" namespace SurgSim { namespace Physics { Fem2DLocalization::Fem2DLocalization( std::shared_ptr representation, const SurgSim::DataStructures::IndexedLocalCoordinate& localPosition) : FemLocalization(representation, localPosition) { } Fem2DLocalization::~Fem2DLocalization() { } bool Fem2DLocalization::isValidRepresentation(std::shared_ptr representation) { auto femRepresentation = std::dynamic_pointer_cast(representation); // Allows to reset the representation to nullptr ... return (femRepresentation != nullptr || representation == nullptr); } Math::RigidTransform3d Fem2DLocalization::getElementPose() { auto femRepresentation = std::static_pointer_cast(getRepresentation()); auto position = getLocalPosition(); auto femElement = femRepresentation->getFemElement(getLocalPosition().index); const auto& nodeIds = femElement->getNodeIds(); std::array nodePositions = {femRepresentation->getCurrentState()->getPosition(nodeIds[0]), femRepresentation->getCurrentState()->getPosition(nodeIds[1]), femRepresentation->getCurrentState()->getPosition(nodeIds[2])}; Math::Vector3d edge, normal, binormal; edge = (nodePositions[1] - nodePositions[0]).normalized(); normal = (nodePositions[2] - nodePositions[0]).cross(edge).normalized(); binormal = edge.cross(normal); Math::Matrix33d rotation; rotation << edge, normal, binormal; return Math::makeRigidTransform(rotation, (nodePositions[0] + nodePositions[1] + nodePositions[2]) / 3.0); } } // namespace Physics } // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/Fem2DLocalization.h000066400000000000000000000040651277777236100225530ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_FEM2DLOCALIZATION_H #define SURGSIM_PHYSICS_FEM2DLOCALIZATION_H #include "SurgSim/DataStructures/IndexedLocalCoordinate.h" #include "SurgSim/Physics/FemLocalization.h" namespace SurgSim { namespace Physics { /// Implementation of Localization for Fem2DRepresentation /// /// Fem2DLocalization tracks the global coordinates of an IndexedLocalCoordinate associated with an /// Fem2DRepresentation. The IndexedLocalCoordinate must be related to an FemElement (the index is an FemElement id and /// the local coordinates are the barycentric coordinates of the nodes in this FemElement). class Fem2DLocalization : public FemLocalization { public: /// Constructor /// \param representation The representation to assign to this localization. /// \param localCoordinate The indexed local coordinate relative to the representation. Fem2DLocalization(std::shared_ptr representation, const SurgSim::DataStructures::IndexedLocalCoordinate& localCoordinate); /// Destructor virtual ~Fem2DLocalization(); /// Query if 'representation' is valid representation. /// \param representation The representation. /// \return true if valid representation, false if not. bool isValidRepresentation(std::shared_ptr representation) override; Math::RigidTransform3d getElementPose() override; }; } // namespace Physics } // namespace SurgSim #endif // SURGSIM_PHYSICS_FEM2DLOCALIZATION_H opensurgsim-0.7.0/SurgSim/Physics/Fem2DPlyReaderDelegate.cpp000066400000000000000000000074051277777236100240010ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Math/Valid.h" #include "SurgSim/Physics/Fem2DPlyReaderDelegate.h" using SurgSim::DataStructures::PlyReader; namespace SurgSim { namespace Physics { Fem2DPlyReaderDelegate::Fem2DPlyReaderDelegate() { } Fem2DPlyReaderDelegate::Fem2DPlyReaderDelegate(std::shared_ptr mesh) : m_mesh(mesh) { SURGSIM_ASSERT(mesh != nullptr) << "The mesh cannot be null."; mesh->clear(); } std::string Fem2DPlyReaderDelegate::getElementName() const { return "2d_element"; } bool Fem2DPlyReaderDelegate::registerDelegate(PlyReader* reader) { FemPlyReaderDelegate::registerDelegate(reader); // Thickness processing reader->requestElement( "thickness", std::bind( &Fem2DPlyReaderDelegate::beginThickness, this, std::placeholders::_1, std::placeholders::_2), nullptr, std::bind(&Fem2DPlyReaderDelegate::endThickness, this, std::placeholders::_1)); reader->requestScalarProperty("thickness", "value", PlyReader::TYPE_DOUBLE, 0); return true; } bool Fem2DPlyReaderDelegate::fileIsAcceptable(const PlyReader& reader) { bool result = FemPlyReaderDelegate::fileIsAcceptable(reader); result = result && reader.hasProperty("thickness", "value"); return result; } void Fem2DPlyReaderDelegate::endParseFile() { if (!m_hasPerElementMaterial && m_hasMaterial) { for (auto element : m_mesh->getElements()) { element->thickness = m_thickness; element->massDensity = m_materialData.massDensity; element->poissonRatio = m_materialData.poissonRatio; element->youngModulus = m_materialData.youngModulus; } } m_mesh->update(); } void Fem2DPlyReaderDelegate::processVertex(const std::string& elementName) { FemElementStructs::RotationVectorData data; if (m_hasRotationDOF) { data.thetaX = m_vertexData.thetaX; data.thetaY = m_vertexData.thetaY; data.thetaZ = m_vertexData.thetaZ; } Fem2D::VertexType vertex(SurgSim::Math::Vector3d(m_vertexData.x, m_vertexData.y, m_vertexData.z), data); m_mesh->addVertex(vertex); } void Fem2DPlyReaderDelegate::processFemElement(const std::string& elementName) { SURGSIM_ASSERT(m_elementData.vertexCount == 3) << "Cannot process 2D Element with " << m_elementData.vertexCount << " vertices."; auto femElement = std::make_shared(); femElement->nodeIds.resize(m_elementData.vertexCount); std::copy(m_elementData.indices, m_elementData.indices + m_elementData.vertexCount, femElement->nodeIds.data()); if (m_hasPerElementMaterial) { femElement->massDensity = m_elementData.massDensity; femElement->poissonRatio = m_elementData.poissonRatio; femElement->youngModulus = m_elementData.youngModulus; } m_mesh->addElement(femElement); } void* Fem2DPlyReaderDelegate::beginThickness(const std::string& elementName, size_t thicknessCount) { return &m_thickness; } void Fem2DPlyReaderDelegate::endThickness(const std::string& elementName) { SURGSIM_ASSERT(SurgSim::Math::isValid(m_thickness)) << "No radius information processed."; } void Fem2DPlyReaderDelegate::processBoundaryCondition(const std::string& elementName) { m_mesh->addBoundaryCondition(static_cast(m_boundaryConditionData)); } } // namespace Physics } // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/Fem2DPlyReaderDelegate.h000066400000000000000000000045331277777236100234450ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_FEM2DPLYREADERDELEGATE_H #define SURGSIM_PHYSICS_FEM2DPLYREADERDELEGATE_H #include #include #include "SurgSim/DataStructures/EmptyData.h" #include "SurgSim/DataStructures/PlyReader.h" #include "SurgSim/Physics/Fem2D.h" #include "SurgSim/Physics/FemPlyReaderDelegate.h" namespace SurgSim { namespace Physics { class Fem2DPlyReaderDelegate : public FemPlyReaderDelegate { public: /// Default constructor. Fem2DPlyReaderDelegate(); /// Constructor. /// \param mesh The mesh to be used, it will be cleared by the constructor. explicit Fem2DPlyReaderDelegate(std::shared_ptr mesh); protected: std::string getElementName() const override; bool registerDelegate(PlyReader* reader) override; bool fileIsAcceptable(const PlyReader& reader) override; void endParseFile() override; void processVertex(const std::string& elementName) override; void processFemElement(const std::string& elementName) override; /// Callback function, begin the processing of thickness. /// \param elementName Name of the element. /// \param thicknessCount Number of thicknesses. /// \return memory for thickness data to the reader. void* beginThickness(const std::string& elementName, size_t thicknessCount); /// Callback function, end the processing of radius. /// \param elementName Name of the element. void endThickness(const std::string& elementName); void processBoundaryCondition(const std::string& elementName) override; private: /// Element's thickness information double m_thickness; /// Fem2D mesh asset to contain the ply file information std::shared_ptr m_mesh; }; } // namespace Physics } // namespace SurgSim #endif // SURGSIM_PHYSICS_FEM2DPLYREADERDELEGATE_H opensurgsim-0.7.0/SurgSim/Physics/Fem2DRepresentation.cpp000066400000000000000000000230571277777236100234620ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/DataStructures/IndexedLocalCoordinate.h" #include "SurgSim/DataStructures/Location.h" #include "SurgSim/Framework/Assert.h" #include "SurgSim/Framework/Asset.h" #include "SurgSim/Math/OdeState.h" #include "SurgSim/Math/SparseMatrix.h" #include "SurgSim/Physics/Fem2DElementTriangle.h" #include "SurgSim/Physics/Fem2DLocalization.h" #include "SurgSim/Physics/Fem2DRepresentation.h" #include "SurgSim/Physics/FemElement.h" #include "SurgSim/Physics/Localization.h" namespace { void transformVectorByBlockOf3(const SurgSim::Math::RigidTransform3d& transform, SurgSim::Math::Vector* x, bool rotationOnly = false) { typedef SurgSim::Math::Vector::Index IndexType; IndexType numNodes = x->size() / 6; SURGSIM_ASSERT(numNodes * 6 == x->size()) << "Unexpected number of dof in a Fem2D state vector (not a multiple of 6)"; for (IndexType nodeId = 0; nodeId < numNodes; nodeId++) { // Only the translational dof are transformed, rotational dof remains unchanged SurgSim::Math::Vector3d xi = x->segment<3>(6 * nodeId); x->segment<3>(6 * nodeId) = (rotationOnly) ? transform.linear() * xi : transform * xi; } } } namespace SurgSim { namespace Physics { SURGSIM_REGISTER(SurgSim::Framework::Component, SurgSim::Physics::Fem2DRepresentation, Fem2DRepresentation); Fem2DRepresentation::Fem2DRepresentation(const std::string& name) : FemRepresentation(name) { SURGSIM_ADD_SERIALIZABLE_PROPERTY(Fem2DRepresentation, std::shared_ptr, Fem, getFem, setFem); SURGSIM_ADD_SETTER(Fem2DRepresentation, std::string, FemFileName, loadFem) // Reminder: m_numDofPerNode is held by DeformableRepresentation but needs to be set by all // concrete derived classes m_numDofPerNode = 6; m_fem = std::make_shared(); } Fem2DRepresentation::~Fem2DRepresentation() { } void Fem2DRepresentation::loadFem(const std::string& fileName) { auto mesh = std::make_shared(); mesh->load(fileName); setFem(mesh); } void Fem2DRepresentation::setFem(std::shared_ptr mesh) { SURGSIM_ASSERT(!isInitialized()) << "The Fem cannot be set after initialization"; SURGSIM_ASSERT(mesh != nullptr) << "Mesh for Fem2DRepresentation cannot be a nullptr"; auto femMesh = std::dynamic_pointer_cast(mesh); SURGSIM_ASSERT(femMesh != nullptr) << "Mesh for Fem2DRepresentation needs to be a SurgSim::Physics::Fem2D"; m_fem = femMesh; auto state = std::make_shared(); state->setNumDof(getNumDofPerNode(), m_fem->getNumVertices()); for (size_t i = 0; i < m_fem->getNumVertices(); i++) { state->getPositions().segment<3>(getNumDofPerNode() * i) = m_fem->getVertexPosition(i); } for (auto boundaryCondition : m_fem->getBoundaryConditions()) { state->addBoundaryCondition(boundaryCondition); } // If we have elements, ensure that they are all of the same nature if (femMesh->getNumElements() > 0) { const auto& e0 = femMesh->getElement(0); for (auto const& e : femMesh->getElements()) { SURGSIM_ASSERT(e->nodeIds.size() == e0->nodeIds.size()) << "Cannot mix and match elements of different nature." << " Found an element with " << e->nodeIds.size() << " nodes but was expecting " << e0->nodeIds.size(); } // If the FemElement types hasn't been registered yet, let's set a default one if (getFemElementType().empty()) { if (e0->nodeIds.size() == 3) { Fem2DElementTriangle triangle; setFemElementType(triangle.getClassName()); } } } setInitialState(state); } std::shared_ptr Fem2DRepresentation::getFem() const { return m_fem; } void Fem2DRepresentation::addExternalGeneralizedForce(std::shared_ptr localization, const Math::Vector& generalizedForce, const Math::Matrix& K, const Math::Matrix& D) { using SurgSim::Math::SparseMatrix; const size_t dofPerNode = getNumDofPerNode(); const Math::Matrix::Index expectedSize = static_cast(dofPerNode); SURGSIM_ASSERT(localization != nullptr) << "Invalid localization (nullptr)"; SURGSIM_ASSERT(generalizedForce.size() == expectedSize) << "Generalized force has an invalid size of " << generalizedForce.size() << ". Expected " << dofPerNode; SURGSIM_ASSERT(K.size() == 0 || (K.rows() == expectedSize && K.cols() == expectedSize)) << "Stiffness matrix K has an invalid size (" << K.rows() << "," << K.cols() << ") was expecting a square matrix of size " << dofPerNode; SURGSIM_ASSERT(D.size() == 0 || (D.rows() == expectedSize && D.cols() == expectedSize)) << "Damping matrix D has an invalid size (" << D.rows() << "," << D.cols() << ") was expecting a square matrix of size " << dofPerNode; std::shared_ptr localization2D = std::dynamic_pointer_cast(localization); SURGSIM_ASSERT(localization2D != nullptr) << "Invalid localization type (not a Fem2DLocalization)"; const size_t elementId = localization2D->getLocalPosition().index; const Math::Vector& coordinate = localization2D->getLocalPosition().coordinate; std::shared_ptr element = getFemElement(elementId); size_t index = 0; for (auto nodeId : element->getNodeIds()) { m_externalGeneralizedForce.segment(dofPerNode * nodeId, dofPerNode) += generalizedForce * coordinate[index]; index++; } if (K.size() != 0 || D.size() != 0) { size_t index1 = 0; for (auto nodeId1 : element->getNodeIds()) { size_t index2 = 0; for (auto nodeId2 : element->getNodeIds()) { if (K.size() != 0) { Math::addSubMatrix(coordinate[index1] * coordinate[index2] * K, static_cast(nodeId1), static_cast(nodeId2), &m_externalGeneralizedStiffness, true); } if (D.size() != 0) { Math::addSubMatrix(coordinate[index1] * coordinate[index2] * D, static_cast(nodeId1), static_cast(nodeId2), &m_externalGeneralizedDamping, true); } index2++; } index1++; } } m_externalGeneralizedStiffness.makeCompressed(); m_externalGeneralizedDamping.makeCompressed(); m_hasExternalGeneralizedForce = true; } std::shared_ptr Fem2DRepresentation::createNodeLocalization(size_t nodeId) { DataStructures::IndexedLocalCoordinate coordinate; SURGSIM_ASSERT(nodeId >= 0 && nodeId < getCurrentState()->getNumNodes()) << "Invalid node id"; // Look for any element that contains this node bool foundNodeId = false; for (size_t elementId = 0; elementId < getNumFemElements(); elementId++) { auto element = getFemElement(elementId); auto found = std::find(element->getNodeIds().begin(), element->getNodeIds().end(), nodeId); if (found != element->getNodeIds().end()) { coordinate.index = elementId; coordinate.coordinate.setZero(element->getNumNodes()); coordinate.coordinate[found - element->getNodeIds().begin()] = 1.0; foundNodeId = true; break; } } SURGSIM_ASSERT(foundNodeId) << "Could not find any element containing the node " << nodeId; // Fem2DLocalization will verify the coordinate (2nd parameter) based on // the Fem2DRepresentation passed as 1st parameter. return std::make_shared( std::static_pointer_cast(getSharedPtr()), coordinate); } std::shared_ptr Fem2DRepresentation::createElementLocalization( const DataStructures::IndexedLocalCoordinate& location) { return std::make_shared( std::static_pointer_cast(getSharedPtr()), location); } std::shared_ptr Fem2DRepresentation::createLocalization(const DataStructures::Location& location) { if (location.index.hasValue()) { return createNodeLocalization(*location.index); } else if (location.triangleMeshLocalCoordinate.hasValue()) { // In the 2d case, elements are triangles, so Locations of type triangleMesh and elementMesh refer to the same // mesh. The distinction between an element and a triangle is mostly useful in the 3d case to separate the // surface from the volume. return createElementLocalization(*location.triangleMeshLocalCoordinate); } else if (location.elementMeshLocalCoordinate.hasValue()) { return createElementLocalization(*location.elementMeshLocalCoordinate); } SURGSIM_FAILURE() << "Localization cannot be created without a mesh-based location (node, triangle or element)."; return nullptr; } void Fem2DRepresentation::transformState(std::shared_ptr state, const Math::RigidTransform3d& transform) { transformVectorByBlockOf3(transform, &state->getPositions()); transformVectorByBlockOf3(transform, &state->getVelocities(), true); } bool Fem2DRepresentation::doInitialize() { for (auto& element : m_fem->getElements()) { std::shared_ptr femElement; femElement = FemElement::getFactory().create(getFemElementType(), element); m_femElements.push_back(femElement); } return FemRepresentation::doInitialize(); } } // namespace Physics } // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/Fem2DRepresentation.h000066400000000000000000000064571277777236100231340ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_FEM2DREPRESENTATION_H #define SURGSIM_PHYSICS_FEM2DREPRESENTATION_H #include #include #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Math/Matrix.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/Fem2D.h" #include "SurgSim/Physics/FemRepresentation.h" namespace SurgSim { namespace DataStructures { struct IndexedLocalCoordinate; struct Location; } namespace Framework { class Asset; } namespace Math { class OdeState; } namespace Physics { class Localization; SURGSIM_STATIC_REGISTRATION(Fem2DRepresentation); /// Finite Element Model 2D is a fem built with 2D FemElement class Fem2DRepresentation : public FemRepresentation { public: /// Constructor /// \param name The name of the Fem2DRepresentation explicit Fem2DRepresentation(const std::string& name); /// Destructor virtual ~Fem2DRepresentation(); SURGSIM_CLASSNAME(SurgSim::Physics::Fem2DRepresentation); void loadFem(const std::string& fileName) override; /// Sets the fem mesh asset /// \param mesh The fem mesh to assign to this representation /// \exception SurgSim::Framework::AssertionFailure if mesh is nullptr or it's actual type is not Fem2D void setFem(std::shared_ptr mesh); /// \return The fem mesh asset as a Fem2D std::shared_ptr getFem() const; void addExternalGeneralizedForce(std::shared_ptr localization, const SurgSim::Math::Vector& generalizedForce, const SurgSim::Math::Matrix& K = SurgSim::Math::Matrix(), const SurgSim::Math::Matrix& D = SurgSim::Math::Matrix()) override; std::shared_ptr createLocalization(const SurgSim::DataStructures::Location& location) override; protected: void transformState(std::shared_ptr state, const SurgSim::Math::RigidTransform3d& transform) override; bool doInitialize() override; private: /// Helper method: create a localization for a node /// \param nodeId The node index /// \return Localization of the node for this representation std::shared_ptr createNodeLocalization(size_t nodeId); /// Helper method: create a localization for an element-based IndexedLocalCoordinate (triangle) /// \param location The IndexedLocalCoordinate defining a point on the element mesh /// \return Localization of the point for this representation std::shared_ptr createElementLocalization( const SurgSim::DataStructures::IndexedLocalCoordinate& location); /// The Fem2DRepresentation's asset as a Fem2D std::shared_ptr m_fem; }; } // namespace Physics } // namespace SurgSim #endif // SURGSIM_PHYSICS_FEM2DREPRESENTATION_H opensurgsim-0.7.0/SurgSim/Physics/Fem3D.cpp000066400000000000000000000020211277777236100205240ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Physics/Fem3D.h" #include "SurgSim/Physics/Fem3DPlyReaderDelegate.h" namespace SurgSim { namespace Physics { SURGSIM_REGISTER(SurgSim::Framework::Asset, SurgSim::Physics::Fem3D, Fem3D) Fem3D::Fem3D() { } bool Fem3D::doLoad(const std::string& filePath) { return loadFemFile(filePath); } } // namespace Physics } // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/Fem3D.h000066400000000000000000000024511277777236100202000ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_FEM3D_H #define SURGSIM_PHYSICS_FEM3D_H #include "SurgSim/DataStructures/EmptyData.h" #include "SurgSim/Physics/Fem.h" namespace SurgSim { namespace Physics { SURGSIM_STATIC_REGISTRATION(Fem3D); /// Fem class data structure implementation for 3-Dimensional FEMs /// \sa Fem class Fem3D : public Fem { public: /// Default constructor Fem3D(); SURGSIM_CLASSNAME(SurgSim::Physics::Fem3D); protected: // Asset API override bool doLoad(const std::string& filePath) override; }; } // namespace Physics } // namespace SurgSim #endif // SURGSIM_PHYSICS_FEM3D_H opensurgsim-0.7.0/SurgSim/Physics/Fem3DElementCorotationalTetrahedron.cpp000066400000000000000000000247031277777236100266300ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Framework/Log.h" #include "SurgSim/Math/OdeEquation.h" #include "SurgSim/Math/OdeState.h" #include "SurgSim/Physics/Fem3DElementCorotationalTetrahedron.h" using SurgSim::Math::addSubVector; using SurgSim::Math::getSubMatrix; using SurgSim::Math::getSubVector; namespace SurgSim { namespace Physics { SURGSIM_REGISTER(SurgSim::Physics::FemElement, SurgSim::Physics::Fem3DElementCorotationalTetrahedron, Fem3DElementCorotationalTetrahedron) Fem3DElementCorotationalTetrahedron::Fem3DElementCorotationalTetrahedron() : Fem3DElementTetrahedron() { } Fem3DElementCorotationalTetrahedron::Fem3DElementCorotationalTetrahedron(std::array nodeIds) : Fem3DElementTetrahedron(nodeIds) { } Fem3DElementCorotationalTetrahedron::Fem3DElementCorotationalTetrahedron( std::shared_ptr elementData) : Fem3DElementTetrahedron(elementData) { } void Fem3DElementCorotationalTetrahedron::initialize(const SurgSim::Math::OdeState& state) { // Initialize the linear tetrahedron element (this computes the linear stiffness matrix) Fem3DElementTetrahedron::initialize(state); m_MLinear = m_M; m_KLinear = m_K; // Pre-compute the matrix V^-1 with V the matrix of the undeformed tetrahedron points in homogeneous coordinates SurgSim::Math::Matrix44d V; V.col(0).segment<3>(0) = state.getPosition(m_nodeIds[0]); V.col(1).segment<3>(0) = state.getPosition(m_nodeIds[1]); V.col(2).segment<3>(0) = state.getPosition(m_nodeIds[2]); V.col(3).segment<3>(0) = state.getPosition(m_nodeIds[3]); V.row(3).setOnes(); double determinant; bool invertible; V.computeInverseAndDetWithCheck(m_Vinverse, determinant, invertible); SURGSIM_ASSERT(invertible) << "Trying to initialize an invalid co-rotational tetrahedron." << " Matrix V not invertible." << std::endl << "More likely the tetrahedron is degenerated:" << std::endl << " A = (" << state.getPosition(m_nodeIds[0]).transpose() << ")" << std::endl << " B = (" << state.getPosition(m_nodeIds[1]).transpose() << ")" << std::endl << " C = (" << state.getPosition(m_nodeIds[2]).transpose() << ")" << std::endl << " D = (" << state.getPosition(m_nodeIds[3]).transpose() << ")" << std::endl; updateFMDK(state, Math::ODEEQUATIONUPDATE_FMDK); } void Fem3DElementCorotationalTetrahedron::doUpdateFMDK(const Math::OdeState& state, int options) { SurgSim::Math::Matrix33d* rotation = nullptr; Math::Matrix* M = nullptr; Math::Matrix* K = nullptr; if (options & Math::ODEEQUATIONUPDATE_F) { rotation = &m_R; K = &m_K; } if (options & Math::ODEEQUATIONUPDATE_M) { M = &m_M; } if (options & Math::ODEEQUATIONUPDATE_K) { K = &m_K; } computeRotationMassAndStiffness(state, rotation, M, K); if (options & Math::ODEEQUATIONUPDATE_F) { Eigen::Matrix x, R_x0; // R.K.(R^-1.x - x0) = Fext // 0 = Fext + Fint with Fint = -R.K.R^-1.(x - R.x0) getSubVector(state.getPositions(), m_nodeIds, 3, &x); for (size_t nodeId = 0; nodeId < 4; ++nodeId) { getSubVector(R_x0, nodeId, 3) = m_R * getSubVector(m_x0, nodeId, 3); } m_f = -m_K * (x - R_x0); } } void Fem3DElementCorotationalTetrahedron::computeRotationMassAndStiffness(const SurgSim::Math::OdeState& state, SurgSim::Math::Matrix33d* rotation, Math::Matrix* Me, Math::Matrix* Ke) const { using SurgSim::Math::makeSkewSymmetricMatrix; using SurgSim::Math::skew; using SurgSim::Math::Vector3d; SurgSim::Math::Matrix33d R; // This method does two things: // 1) Recompute the element's rotation R // 2) Update the element's stiffness matrix based on the new rotation // 1) Recompute the element's rotation R Eigen::Matrix x; getSubVector(state.getPositions(), m_nodeIds, 3, &x); // Matrix P is the matrix of the deformed tetrahedron points in homogenous coordinates. SurgSim::Math::Matrix44d P; P.col(0).segment<3>(0) = getSubVector(x, 0, 3); P.col(1).segment<3>(0) = getSubVector(x, 1, 3); P.col(2).segment<3>(0) = getSubVector(x, 2, 3); P.col(3).segment<3>(0) = getSubVector(x, 3, 3); P.row(3).setOnes(); // Matrix V is the matrix of the undeformed tetrahedron points in homogeneous coordinates. // F = P.V^1 is an affine transformation (deformation gradient) measuring the transformation // between the undeformed and deformed configurations. Eigen::Transform F(P * m_Vinverse); // F is of the form (B t) where t contains the translation part and B the rotation and stretching. // (0 1) // c.f. "Interactive Virtual Materials", Muller, Gross. Graphics Interface 2004 // http://en.wikipedia.org/wiki/Polar_decomposition // Compute the polar decomposition of F to extract the rotation and the scaling parts. SurgSim::Math::Matrix33d scaling; F.computeRotationScaling(&R, &scaling); if (rotation != nullptr) { *rotation = R; } if (std::abs(R.determinant() - 1.0) > 1e-8) { SURGSIM_LOG_SEVERE(SurgSim::Framework::Logger::getDefaultLogger()) << "Rotation has an invalid determinant of " << R.determinant(); return; } Eigen::Matrix R12x12; if (Me != nullptr || Ke != nullptr) { // Build a 12x12 rotation matrix, duplicating the 3x3 rotation on the diagonal blocks // This is useful only in the mass and stiffness matrices calculation. R12x12.setZero(); for (size_t nodeId = 0; nodeId < 4; ++nodeId) { getSubMatrix(R12x12, nodeId, nodeId, 3, 3) = R; } } // 2) Update the element's mass matrix based on the new rotation // M = R.Me.R^t if (Me != nullptr) { Eigen::Matrix RM = R12x12 * m_MLinear; *Me = RM * R12x12.transpose(); } // 3) Update the element's stiffness matrix based on the new rotation // F = -RKe(R^t.x - x0) with Ke the element linear stiffness matrix, R the 12x12 rotation matrix // K = -dF/dx // K = sum[dR/dxl.Ke.(R^t.x-x0)]_l + R.Ke.R^t + [R.Ke.(dR/dxl)^T.x]_l // c.f. "Exact Corotational Linear FEM Stiffness Matrix", Jernej Barbic. Technical Report USC 2012. // with // xl the l^th component of the dof vector x // [v(l)]_l is a 12x12 matrix whose l^th column is defined by the column vector v(l) // Each column of the 2 matrices [dR/dxl.Ke.(R^t.x-x0)]_l + [R.Ke.(dR/dxl)^T.x]_l // can be calculated independently by differentiating R with respect to x, so the entire matrices are defined // with a sum over the 12 degrees of freedom, to define each column one by one. if (Ke != nullptr) { // Here is the rotated element stiffness matrix part Eigen::Matrix RK = R12x12 * m_KLinear; *Ke = RK * R12x12.transpose(); // Now we compute some useful matrices for the next step double determinant; bool invertible; Math::Matrix33d G = (scaling.trace() * Math::Matrix33d::Identity() - scaling) * R.transpose(); Math::Matrix33d Ginv = Math::Matrix33d::Zero(); G.computeInverseAndDetWithCheck(Ginv, determinant, invertible); if (!invertible) { SURGSIM_LOG(SurgSim::Framework::Logger::getDefaultLogger(), WARNING) << "Corotational element has a singular G matrix"; return; } // dR/dx = dR/dF . dF/dx with dF/dx constant over time. // Here, we compute the various dR/d(F[i][j]). std::array, 3> dRdF; for (size_t i = 0; i < 3; ++i) { for (size_t j = 0; j < 3; ++j) { // Compute wij, the vector solution of G.wij = 2.skew(R^t.ei.ej^t) // wij is a rotation vector by nature Vector3d wij = Ginv * 2.0 * skew((R.transpose() * (Vector3d::Unit(i) * Vector3d::Unit(j).transpose())).eval()); // Compute dR/dFij = [wij].R dRdF[i][j] = makeSkewSymmetricMatrix(wij) * R; } } // dR/dx = dR/dF . dF/dx // dF/dx is block sparse and constant over time, so we develop the matrix multiplication to avoid unecessary // calculation. Nevertheless, to allow the user to follow this calculation, we relate it to the notation in // the paper: // A3x3 being a 3x3 matrix, asVector(A3x3) = (A00 A01 A02 A10 A11 A12 A20 A21 A22) // dR/dF becomes a single 9x9 matrix where the 3x3 matrix dR/dFij is stored asVector in the (3*i+j)th row // dF/dx becomes a single 9x12 matrix of the form (n1 0 0 n2 0 0 n3 0 0 n4 0 0) // (0 n1 0 0 n2 0 0 n3 0 0 n4 0) // (0 0 n1 0 0 n2 0 0 n3 0 0 n4) // ni being the first 3 entries of the i^th row of V^1 (m_Vinverse) // // dR/dx = (asVector(dRdF00)).(n1x 0 0 n2x 0 0 n3x 0 0 n4x 0 0) // (asVector(dRdF01)) (n1y 0 0 n2y 0 0 n3y 0 0 n4y 0 0) // ( ... ) ( ... ) // (asVector(dRdF22)) (0 0 n1z 0 0 n2z 0 0 n3z 0 0 n4z) // dR/dxl is a 3x3 matrix stored asVector in the l^th column of the above resulting matrix std::array dRdX; for (int nodeId = 0; nodeId < 4; ++nodeId) { Vector3d ni(m_Vinverse.row(nodeId).segment<3>(0)); for (int axis = 0; axis < 3; ++axis) { size_t dofId = 3 * nodeId + axis; // Let's define the 3x3 matrix dR/d(x[dofId]) for (int i = 0; i < 3; ++i) { for (int j = 0; j < 3; ++j) { dRdX[dofId](i, j) = dRdF[i][j].row(axis).dot(ni); } } } } // Now that we have dR/dx, we can add the 2 extra terms to the stiffness matrix: // K += [dR/dxl.Ke.(R^t.x-x0]_l + [R.Ke.(dR/dxl)^T.x]_l // with // xl the l^th component of the dof vector x // [v(l)]_l a 12x12 matrix whose l^th column is defined by the column vector v(l) Eigen::Matrix KTimesRx_x0 = m_K * (R12x12.transpose() * x - m_x0); Eigen::Matrix dRdxl12x12 = Eigen::Matrix::Zero(); for (size_t dofId = 0; dofId < 12; ++dofId) { for (size_t nodeId = 0; nodeId < 4; ++nodeId) { getSubMatrix(dRdxl12x12, nodeId, nodeId, 3, 3) = dRdX[dofId]; } Ke->col(dofId) += dRdxl12x12 * KTimesRx_x0 + (RK * dRdxl12x12.transpose()) * x; } } } }; // namespace Physics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/Fem3DElementCorotationalTetrahedron.h000066400000000000000000000115431277777236100262730ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_FEM3DELEMENTCOROTATIONALTETRAHEDRON_H #define SURGSIM_PHYSICS_FEM3DELEMENTCOROTATIONALTETRAHEDRON_H #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Physics/Fem3DElementTetrahedron.h" namespace SurgSim { namespace Physics { SURGSIM_STATIC_REGISTRATION(Fem3DElementCorotationalTetrahedron); /// Fem Element 3D co-rotational based on a tetrahedron volume discretization /// \note This class derives from the linear version of the FEM 3D element tetrahedron, adding a rigid frame /// \note attached to the tetrahedron element to follow its rigid motion. Therefore it computes deformation in the /// \note local coordinate system of the tetrahedron. This class is based on 2 papers: /// \note "Interactive Virtual Materials", Muller, Gross. Graphics Interface 2004 /// \note "Exact Corotational Linear FEM Stiffness Matrix", Jernej Barbic. Technical Report USC 2012. /// \note Only the force and stiffness calculation are different, involving some changes as well in addMatVec /// \note (it uses the updated stiffness matrix). /// \note The update method takes care of extracting the rigid motion of the element. /// \note This element is updating its stiffness matrix at each new time step, which means that it cannot /// \note be used with any OdeSolverLinearXXX, it needs an ode solver that recomputes the data at each iteration. class Fem3DElementCorotationalTetrahedron : public Fem3DElementTetrahedron { public: /// Constructor Fem3DElementCorotationalTetrahedron(); /// Constructor /// \param nodeIds A vector of node ids defining this tetrahedron element in a overall mesh /// \note It is required that the triangle ABC is CCW looking from D (i.e. dot(cross(AB, AC), AD) > 0) /// \note This is required from the signed volume calculation method getVolume() /// \note A warning will be logged when the initialize function is called if this condition is not met, but the /// simulation will keep running. Behavior will be undefined because of possible negative volume terms. explicit Fem3DElementCorotationalTetrahedron(std::array nodeIds); /// Constructor for FemElement object factory /// \param elementData A FemElement3D struct defining this tetrahedron element in a overall mesh /// \note It is required that the triangle ABC is CCW looking from D (i.e. dot(cross(AB, AC), AD) > 0) /// \note This is required from the signed volume calculation method getVolume() /// \note A warning will be logged when the initialize function is called if this condition is not met, but the /// simulation will keep running. Behavior will be undefined because of possible negative volume terms. /// \exception SurgSim::Framework::AssertionFailure if nodeIds has a size different than 4 explicit Fem3DElementCorotationalTetrahedron(std::shared_ptr elementData); SURGSIM_CLASSNAME(SurgSim::Physics::Fem3DElementCorotationalTetrahedron); void initialize(const SurgSim::Math::OdeState& state) override; protected: /// Compute the rotation, mass and stiffness matrices of the element from the given state /// \param state The state to compute the rotation and jacobians from /// \param [out] R rotation matrix of the element in the given state (can be nullptr if not needed) /// \param [out] Me, Ke Respectively the mass and stiffness matrices (Me and/or Ke be nullptr if not needed) /// \note The model is not viscoelastic but purely elastic, so there is no damping matrix here. void computeRotationMassAndStiffness(const SurgSim::Math::OdeState& state, SurgSim::Math::Matrix33d* R, Math::Matrix* Me, Math::Matrix* Ke) const; void doUpdateFMDK(const Math::OdeState& state, int options) override; /// The constant inverse matrix of the undeformed tetrahedron homogeneous 4 points coordinates. /// This is useful to compute the deformation gradient from which the element rotation is extracted. SurgSim::Math::Matrix44d m_Vinverse; // The mass matrix of the linear tetrahedron Eigen::Matrix m_MLinear; // The stiffness matrix of the linear tetrahedron Eigen::Matrix m_KLinear; // The rotation matrix SurgSim::Math::Matrix33d m_R; }; } // namespace Physics } // namespace SurgSim #endif // SURGSIM_PHYSICS_FEM3DELEMENTCOROTATIONALTETRAHEDRON_H opensurgsim-0.7.0/SurgSim/Physics/Fem3DElementCube.cpp000066400000000000000000000354631277777236100226550ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Framework/Log.h" #include "SurgSim/Math/Geometry.h" #include "SurgSim/Math/OdeEquation.h" #include "SurgSim/Math/OdeState.h" #include "SurgSim/Physics/Fem3DElementCube.h" using SurgSim::Math::addSubVector; using SurgSim::Math::getSubVector; using SurgSim::Math::Vector; using SurgSim::Math::Vector3d; namespace SurgSim { namespace Physics { SURGSIM_REGISTER(SurgSim::Physics::FemElement, SurgSim::Physics::Fem3DElementCube, Fem3DElementCube) Fem3DElementCube::Fem3DElementCube() { initializeMembers(); } Fem3DElementCube::Fem3DElementCube(std::array nodeIds) { initializeMembers(); m_nodeIds.assign(nodeIds.cbegin(), nodeIds.cend()); } Fem3DElementCube::Fem3DElementCube(std::shared_ptr elementData) { initializeMembers(); auto element3DData = std::dynamic_pointer_cast(elementData); SURGSIM_ASSERT(element3DData != nullptr) << "Incorrect struct type passed"; SURGSIM_ASSERT(element3DData->nodeIds.size() == 8) << "Incorrect number of nodes for Fem3D cube"; m_nodeIds.assign(element3DData->nodeIds.begin(), element3DData->nodeIds.end()); setMassDensity(element3DData->massDensity); setPoissonRatio(element3DData->poissonRatio); setYoungModulus(element3DData->youngModulus); } void Fem3DElementCube::initializeMembers() { // Set the number of dof per node (3 in this case) setNumDofPerNode(3); } void Fem3DElementCube::initialize(const SurgSim::Math::OdeState& state) { // Test the validity of the physical parameters FemElement::initialize(state); // Set the shape functions coefficients // Ni(epsilon, eta, mu) = (1 + epsilon * sign(epsilon_i))(1 + eta * sign(eta_i))(1 + mu * sign(mu_i))/8 std::array tmpEpsilon = {{ -1.0, +1.0, +1.0, -1.0, -1.0, +1.0, +1.0, -1.0}}; std::array tmpEta = {{ -1.0, -1.0, +1.0, +1.0, -1.0, -1.0, +1.0, +1.0}}; std::array tmpMu = {{ -1.0, -1.0, -1.0, -1.0, +1.0, +1.0, +1.0, +1.0}}; m_shapeFunctionsEpsilonSign = tmpEpsilon; m_shapeFunctionsEtaSign = tmpEta; m_shapeFunctionsMuSign = tmpMu; // Store the 8 nodeIds in order for (auto nodeId = m_nodeIds.cbegin(); nodeId != m_nodeIds.cend(); ++nodeId) { SURGSIM_ASSERT(*nodeId >= 0 && *nodeId < state.getNumNodes()) << "Invalid nodeId " << *nodeId << " expected in range [0.." << state.getNumNodes() - 1 << "]"; } // Store the rest state for this cube in m_elementRestPosition getSubVector(state.getPositions(), m_nodeIds, 3, &m_elementRestPosition); // Compute the cube rest volume m_restVolume = getVolume(state); // Pre-compute the mass and stiffness matrix computeMass(state, &m_M); computeStiffness(state, &m_strain, &m_stress, &m_K); } void Fem3DElementCube::computeMass(const SurgSim::Math::OdeState& state, SurgSim::Math::Matrix* M) { using SurgSim::Math::gaussQuadrature2Points; // From the internal documentation on cube mass matrix calculation, we have: // M = rho * integration{over volume} {phi^T.phi} dV // with phi = (N0 0 0 N1 0 0...) // ( 0 N0 0 0 N1 0...) // ( 0 0 N0 0 0 N1...) // a 3x24 matrix filled with shape functions evaluation at a given point. // Using the Gauss-Legendre quadrature to evaluate this integral, we have: // M = sum{i=1..2} sum{j=1..2} sum{k=1..2}(w_i * w_j * _w_k * det(J) * rho * phi^T.phi) // Zero out the mass matrix M->setZero(); // Build up the mass matrix using a 2-points Gauss-Legendre quadrature for (int i = 0; i < 2; ++i) { for (int j = 0; j < 2; ++j) { for (int k = 0; k < 2; ++k) { addMassMatrixAtPoint(state, gaussQuadrature2Points[i], gaussQuadrature2Points[j], gaussQuadrature2Points[k], M); } } } } void Fem3DElementCube::doUpdateFMDK(const Math::OdeState& state, int options) { if (options & Math::ODEEQUATIONUPDATE_F) { Eigen::Matrix x; // K.U = Fext // K.(x - x0) = Fext // 0 = Fext + Fint with Fint = -K.(x - x0) getSubVector(state.getPositions(), m_nodeIds, 3, &x); m_f = -m_K * (x - m_elementRestPosition); } } void Fem3DElementCube::computeStiffness(const SurgSim::Math::OdeState& state, Eigen::Matrix* strain, Eigen::Matrix* stress, SurgSim::Math::Matrix* stiffness) { using SurgSim::Math::gaussQuadrature2Points; // Zero out the stiffness matrix stiffness->setZero(); // Build up the stiffness matrix using a 2-points Gauss-Legendre quadrature for (int i = 0; i < 2; ++i) { for (int j = 0; j < 2; ++j) { for (int k = 0; k < 2; ++k) { addStrainStressStiffnessAtPoint(state, gaussQuadrature2Points[i], gaussQuadrature2Points[j], gaussQuadrature2Points[k], strain, stress, stiffness); } } } } void Fem3DElementCube::evaluateJ(const SurgSim::Math::OdeState& state, double epsilon, double eta, double mu, SurgSim::Math::Matrix33d* J, SurgSim::Math::Matrix33d* Jinv, double* detJ) const { using SurgSim::Framework::Logger; SURGSIM_ASSERT(J != nullptr) << "Trying to evaluate J with a nullptr for matrix J"; Vector3d p[8]; for (size_t index = 0; index < 8; index++) { p[index] = state.getPosition(m_nodeIds[index]); } // Zero out the matrix J J->setZero(); // Compute J = d(x,y,z)/d(epsilon,eta,mu) // Note that (x,y,z) = for(i in {0..7}){ (x,y,z) += (xi,yi,zi).Ni(epsilon,eta,mu)} for (size_t index = 0; index < 8; ++index) { for (size_t axis = 0; axis < 3; ++axis) { (*J)(0, axis) += p[index][axis] * dShapeFunctiondepsilon(index, epsilon, eta, mu); (*J)(1, axis) += p[index][axis] * dShapeFunctiondeta(index, epsilon, eta, mu); (*J)(2, axis) += p[index][axis] * dShapeFunctiondmu(index, epsilon, eta, mu); } } if (Jinv != nullptr && detJ != nullptr) { bool invertible; J->computeInverseAndDetWithCheck(*Jinv, *detJ, invertible); SURGSIM_ASSERT(invertible) << "Found a non invertible matrix J\n" << *J << "\ndet(J)=" << *detJ << ") while computing Fem3DElementCube stiffness matrix\n"; SURGSIM_LOG_IF(*detJ <= 1e-8 && *detJ >= -1e-8, Logger::getLogger("Physics"), WARNING) << "Found an invalid matrix J\n" << *J << "\ninvertible, but det(J)=" << *detJ << ") while computing Fem3DElementCube stiffness matrix\n"; } } void Fem3DElementCube::evaluateStrainDisplacement(double epsilon, double eta, double mu, const SurgSim::Math::Matrix33d& Jinv, Eigen::Matrix* B) const { SURGSIM_ASSERT(B != nullptr) << "Trying to evaluate the strain-displacmenet with a nullptr"; // Zero out the strain-displacement B->setZero(); // Set non-zero entries of the strain-displacement for (size_t index = 0; index < 8; ++index) { // Compute dNi/d(x,y,z) = dNi/d(epsilon,eta,mu) d(epsilon,eta,mu)/d(x,y,z) // = J^{-1}.dNi/d(epsilon,eta,mu) Vector3d dNidEpsilonEtaMu( dShapeFunctiondepsilon(index, epsilon, eta, mu), dShapeFunctiondeta(index, epsilon, eta, mu), dShapeFunctiondmu(index, epsilon, eta, mu) ); Vector3d dNidxyz = Jinv * dNidEpsilonEtaMu; // B = (dNi/dx 0 0) // ( 0 dNi/dy 0) // ( 0 0 dNi/dz) // (dNi/dy dNi/dx 0) // ( 0 dNi/dz dNi/dy) // (dNi/dz 0 dNi/dx) // c.f. http://www.colorado.edu/engineering/CAS/courses.d/AFEM.d/AFEM.Ch11.d/AFEM.Ch11.pdf (*B)(0, getNumDofPerNode() * index) = dNidxyz[0]; (*B)(1, getNumDofPerNode() * index + 1) = dNidxyz[1]; (*B)(2, getNumDofPerNode() * index + 2) = dNidxyz[2]; (*B)(3, getNumDofPerNode() * index) = dNidxyz[1]; (*B)(3, getNumDofPerNode() * index + 1) = dNidxyz[0]; (*B)(4, getNumDofPerNode() * index + 1) = dNidxyz[2]; (*B)(4, getNumDofPerNode() * index + 2) = dNidxyz[1]; (*B)(5, getNumDofPerNode() * index) = dNidxyz[2]; (*B)(5, getNumDofPerNode() * index + 2) = dNidxyz[0]; } } void Fem3DElementCube::buildConstitutiveMaterialMatrix( Eigen::Matrix* constitutiveMatrix) { // Compute the elasticity material matrix // which is commonly based on the Lame coefficients (1st = lambda, 2nd = mu = shear modulus): double lambda = m_E * m_nu / ((1.0 + m_nu) * (1.0 - 2.0 * m_nu)); double mu = m_E / (2.0 * (1 + m_nu)); constitutiveMatrix->setZero(); (*constitutiveMatrix)(0, 0) = (*constitutiveMatrix)(1, 1) = (*constitutiveMatrix)(2, 2) = 2.0 * mu + lambda; (*constitutiveMatrix)(0, 1) = (*constitutiveMatrix)(0, 2) = (*constitutiveMatrix)(1, 0) = lambda; (*constitutiveMatrix)(1, 2) = (*constitutiveMatrix)(2, 0) = (*constitutiveMatrix)(2, 1) = lambda; (*constitutiveMatrix)(3, 3) = (*constitutiveMatrix)(4, 4) = (*constitutiveMatrix)(5, 5) = mu; } void Fem3DElementCube::addStrainStressStiffnessAtPoint(const SurgSim::Math::OdeState& state, const SurgSim::Math::gaussQuadraturePoint& epsilon, const SurgSim::Math::gaussQuadraturePoint& eta, const SurgSim::Math::gaussQuadraturePoint& mu, Eigen::Matrix* strain, Eigen::Matrix* stress, SurgSim::Math::Matrix* k) { SurgSim::Math::Matrix33d J, Jinv; double detJ; Eigen::Matrix B; evaluateJ(state, epsilon.point, eta.point, mu.point, &J, &Jinv, &detJ); evaluateStrainDisplacement(epsilon.point, eta.point, mu.point, Jinv, &B); buildConstitutiveMaterialMatrix(&m_constitutiveMaterial); *strain += (epsilon.weight * eta.weight * mu.weight * detJ) * B; *stress += (epsilon.weight * eta.weight * mu.weight * detJ) * m_constitutiveMaterial * B; *k += (epsilon.weight * eta.weight * mu.weight * detJ) * B.transpose() * m_constitutiveMaterial * B; } void Fem3DElementCube::addMassMatrixAtPoint(const SurgSim::Math::OdeState& state, const SurgSim::Math::gaussQuadraturePoint& epsilon, const SurgSim::Math::gaussQuadraturePoint& eta, const SurgSim::Math::gaussQuadraturePoint& mu, SurgSim::Math::Matrix* m) { // This helper method hels to compute: // M = rho * integration{over volume} {phi^T.phi} dV // = sum{i=1..2} sum{j=1..2} sum{k=1..2} (w_i * w_j * w_k * det(J) * rho * phi^T.phi) // with phi = (N0 0 0 N1 0 0...) a 3x24 matrix filled with shape functions // ( 0 N0 0 0 N1 0...) evaluation at a given point. // ( 0 0 N0 0 0 N1...) // by computing the term inside the sums: (w_i * w_j * w_k * det(J) * rho * phi^T.phi) SurgSim::Math::Matrix33d J, Jinv; SurgSim::Math::Matrix phi(3, 24); double detJ; evaluateJ(state, epsilon.point, eta.point, mu.point, &J, &Jinv, &detJ); phi.setZero(); for (size_t index = 0; index < 8; ++index) { double weightPerIndex = shapeFunction(index, epsilon.point, eta.point, mu.point); phi(0, getNumDofPerNode() * index) += weightPerIndex; phi(1, getNumDofPerNode() * index + 1) += weightPerIndex; phi(2, getNumDofPerNode() * index + 2) += weightPerIndex; } *m += (epsilon.weight * eta.weight * mu.weight * detJ * m_rho) * phi.transpose() * phi; } double Fem3DElementCube::getVolume(const SurgSim::Math::OdeState& state) const { using SurgSim::Math::gaussQuadrature2Points; double v = 0.0; // Compute the volume: // V = integration{over volume} dV // Using a 2-points Gauss-Legendre quadrature: // V = for{i in {0..1}} for{j in {0..1}} for{k in {0..1}} // V += weightEpsilon[i] * weightEta[j] * weightMu[k] * det(J(epsilon[i], eta[j], mu[k])) for (int i = 0; i < 2; ++i) { const double& epsilon = gaussQuadrature2Points[i].point; const double& weightEpsilon = gaussQuadrature2Points[i].weight; for (int j = 0; j < 2; ++j) { const double& eta = gaussQuadrature2Points[j].point; const double& weightEta = gaussQuadrature2Points[j].weight; for (int k = 0; k < 2; ++k) { const double& mu = gaussQuadrature2Points[k].point; const double& weightMu = gaussQuadrature2Points[k].weight; SurgSim::Math::Matrix33d J, Jinv; double detJ; evaluateJ(state, epsilon, eta, mu, &J, &Jinv, &detJ); v += weightEpsilon * weightEta * weightMu * detJ; } } } SURGSIM_ASSERT(v > 1e-12) << "Fem3DElementCube ill-defined, its volume is " << v << std::endl << "Please make sure the element is not degenerate and " << "check the node ordering of your element formed by node ids " << m_nodeIds[0] << " " << m_nodeIds[1] << " " << m_nodeIds[2] << " " << m_nodeIds[3] << " " << m_nodeIds[4] << " " << m_nodeIds[5] << " " << m_nodeIds[6] << " " << m_nodeIds[7] << std::endl; return v; } double Fem3DElementCube::shapeFunction(size_t i, double epsilon, double eta, double mu) const { return 1.0 / 8.0 * (1 + epsilon * m_shapeFunctionsEpsilonSign[i]) * (1 + eta * m_shapeFunctionsEtaSign[i]) * (1 + mu * m_shapeFunctionsMuSign[i]); } double Fem3DElementCube::dShapeFunctiondepsilon(size_t i, double epsilon, double eta, double mu) const { return 1.0 / 8.0 * m_shapeFunctionsEpsilonSign[i] * (1 + eta * m_shapeFunctionsEtaSign[i]) * (1 + mu * m_shapeFunctionsMuSign[i]); } double Fem3DElementCube::dShapeFunctiondeta(size_t i, double epsilon, double eta, double mu) const { return 1.0 / 8.0 * (1 + epsilon * m_shapeFunctionsEpsilonSign[i]) * m_shapeFunctionsEtaSign[i] * (1 + mu * m_shapeFunctionsMuSign[i]); } double Fem3DElementCube::dShapeFunctiondmu(size_t i, double epsilon, double eta, double mu) const { return 1.0 / 8.0 * (1 + epsilon * m_shapeFunctionsEpsilonSign[i]) * (1 + eta * m_shapeFunctionsEtaSign[i]) * m_shapeFunctionsMuSign[i]; } SurgSim::Math::Vector Fem3DElementCube::computeCartesianCoordinate( const SurgSim::Math::OdeState& state, const SurgSim::Math::Vector& naturalCoordinate) const { SURGSIM_ASSERT(isValidCoordinate(naturalCoordinate)) << "naturalCoordinate must be normalized and length 8 within [0 1]."; Vector3d cartesianCoordinate(0.0, 0.0, 0.0); const Vector& positions = state.getPositions(); for (int i = 0; i < 8; i++) { cartesianCoordinate += naturalCoordinate(i) * getSubVector(positions, m_nodeIds[i], 3); } return cartesianCoordinate; } SurgSim::Math::Vector Fem3DElementCube::computeNaturalCoordinate( const SurgSim::Math::OdeState& state, const SurgSim::Math::Vector& cartesianCoordinate) const { SURGSIM_FAILURE() << "Function " << __FUNCTION__ << " not yet implemented."; return SurgSim::Math::Vector3d::Zero(); } } // namespace Physics } // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/Fem3DElementCube.h000066400000000000000000000304461277777236100223160ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_FEM3DELEMENTCUBE_H #define SURGSIM_PHYSICS_FEM3DELEMENTCUBE_H #include #include "SurgSim/Physics/FemElement.h" #include "SurgSim/Math/GaussLegendreQuadrature.h" namespace SurgSim { namespace Physics { SURGSIM_STATIC_REGISTRATION(Fem3DElementCube); /// Class for Fem Element 3D based on a cube volume discretization /// \note The stiffness property of the cube is derived from /// \note http://www.colorado.edu/engineering/CAS/courses.d/AFEM.d/AFEM.Ch11.d/AFEM.Ch11.pdf /// \note The mass property of the cube is derived from the kinetic energy computed on the cube's volume /// \note (c.f. internal documentation on cube mass matrix computation for details). /// \note Integral terms over the volume are evaluated using the Gauss-Legendre 2-points quadrature. /// \note http://en.wikipedia.org/wiki/Gaussian_quadrature /// \note Note that this technique is accurate for any polynomial evaluation up to degree 3. /// \note In our case, the shape functions \f$N_i\f$ are linear (of degree 1). So for exmaple, /// \note in the mass matrix we have integral terms like \f$\int_V N_i.N_j dV\f$, which are of degree 2. /// \note Fem3DElementCube uses linear elasticity (not visco-elasticity), so it does not give any damping. class Fem3DElementCube : public FemElement { public: /// Constructor Fem3DElementCube(); /// Constructor /// \param nodeIds An array of 8 node ids defining this cube element in an overall mesh /// \note It is required that getVolume() is positive, to do so, it needs (looking at the cube from /// \note the exterior, face normal 'n' pointing outward): /// \note the 1st 4 nodeIds (ABCD) should define any face CW i.e. (AB^AC or AB^AD or AC^AD).n < 0 /// \note the last 4 nodeIds (EFGH) should define the opposite face CCW i.e. (EF^EG or EF^EH or EG^EH).n > 0 /// \note A warning will be logged when the initialize function is called if this condition is not met, but the /// \note simulation will keep running. Behavior will be undefined because of possible negative volume terms. explicit Fem3DElementCube(std::array nodeIds); /// Constructor for FemElement object factory /// \param elementData A FemElement3D struct defining this cube element in an overall mesh /// \note It is required that getVolume() is positive, to do so, it needs (looking at the cube from /// \note the exterior, face normal 'n' pointing outward): /// \note the 1st 4 nodeIds (ABCD) should define any face CW i.e. (AB^AC or AB^AD or AC^AD).n < 0 /// \note the last 4 nodeIds (EFGH) should define the opposite face CCW i.e. (EF^EG or EF^EH or EG^EH).n > 0 /// \note A warning will be logged when the initialize function is called if this condition is not met, but the /// \note simulation will keep running. Behavior will be undefined because of possible negative volume terms. /// \exception SurgSim::Framework::AssertionFailure if nodeIds has a size different than 8 explicit Fem3DElementCube(std::shared_ptr elementData); SURGSIM_CLASSNAME(SurgSim::Physics::Fem3DElementCube) /// Initializes the element once everything has been set /// \param state The state to initialize the FemElement with /// \note We use the theory of linear elasticity, so this method precomputes the stiffness and mass matrices /// \note The 8 node ids must be valid in the given state, if they aren't an ASSERT will be raised /// \note The 8 node ids must define a cube with positive volume, if they don't an ASSERT will be raised /// \note In order to do so (looking at the cube from the exterior, face normal 'n' pointing outward), /// \note the 1st 4 nodeIds (ABCD) should define any face CW i.e. (AB^AC or AB^AD or AC^AD).n < 0 /// \note the last 4 nodeIds (EFGH) should define the opposite face CCW i.e. (EF^EG or EF^EH or EG^EH).n > 0 /// \note A warning will be logged in if this condition is not met, but the simulation will keep running. /// \note Behavior will be undefined because of possible negative volume terms. void initialize(const SurgSim::Math::OdeState& state) override; double getVolume(const SurgSim::Math::OdeState& state) const override; SurgSim::Math::Vector computeCartesianCoordinate(const SurgSim::Math::OdeState& state, const SurgSim::Math::Vector& naturalCoordinate) const override; SurgSim::Math::Vector computeNaturalCoordinate(const SurgSim::Math::OdeState& state, const SurgSim::Math::Vector& cartesianCoordinate) const override; protected: /// Initializes variables needed before Initialize() is called void initializeMembers(); /// Build the constitutive material 6x6 matrix /// \param[out] constitutiveMatrix The 6x6 constitutive material matrix void buildConstitutiveMaterialMatrix(Eigen::Matrix* constitutiveMatrix); /// Computes the cube stiffness matrix along with the strain and stress matrices /// \param state The state to compute the stiffness matrix from /// \param[out] strain, stress, k The strain, stress and stiffness matrices to store the result into void computeStiffness(const SurgSim::Math::OdeState& state, Eigen::Matrix* strain, Eigen::Matrix* stress, SurgSim::Math::Matrix* k); /// Computes the cube mass matrix /// \param state The state to compute the mass matrix from /// \param[out] m The mass matrix to store the result into void computeMass(const SurgSim::Math::OdeState& state, SurgSim::Math::Matrix* m); void doUpdateFMDK(const Math::OdeState& state, int options) override; /// Helper method to evaluate strain-stress and stiffness integral terms with a discrete sum using /// a Gauss quadrature rule /// \param state The state to compute the evaluation with /// \param epsilon, eta, mu The Gauss quadrature points to evaluate the data at /// \param[out] strain, stress, k The matrices in which to add the evaluations void addStrainStressStiffnessAtPoint(const SurgSim::Math::OdeState& state, const SurgSim::Math::gaussQuadraturePoint& epsilon, const SurgSim::Math::gaussQuadraturePoint& eta, const SurgSim::Math::gaussQuadraturePoint& mu, Eigen::Matrix* strain, Eigen::Matrix* stress, SurgSim::Math::Matrix* k); /// Helper method to evaluate mass integral terms with a discrete sum using a Gauss quadrature rule /// \param state The state to compute the evaluation with /// \param epsilon, eta, mu The Gauss quadrature points to evaluate the data at /// \param[out] m The matrix in which to add the evaluations void addMassMatrixAtPoint(const SurgSim::Math::OdeState& state, const SurgSim::Math::gaussQuadraturePoint& epsilon, const SurgSim::Math::gaussQuadraturePoint& eta, const SurgSim::Math::gaussQuadraturePoint& mu, SurgSim::Math::Matrix* m); /// Helper method to evaluate matrix J = d(x,y,z)/d(epsilon,eta,mu) at a given 3D parametric location /// J expresses the 3D space coordinate frames variation w.r.t. parametric coordinates /// \param state The state to compute the evaluation with /// \param epsilon, eta, mu The 3D parametric coordinates to evaluate the data at (within \f$[-1 +1]\f$) /// \param[out] J, Jinv, detJ The J matrix with its inverse and determinant evaluated at (epsilon, eta, mu) void evaluateJ(const SurgSim::Math::OdeState& state, double epsilon, double eta, double mu, SurgSim::Math::Matrix33d* J, SurgSim::Math::Matrix33d* Jinv, double* detJ) const; /// Helper method to evaluate the strain-displacement matrix at a given 3D parametric location /// c.f. http://www.colorado.edu/engineering/CAS/courses.d/AFEM.d/AFEM.Ch11.d/AFEM.Ch11.pdf for more details /// \param epsilon, eta, mu The 3D parametric coordinates to evaluate the data at (within \f$[-1 +1]\f$) /// \param Jinv The inverse of matrix J (3D global coords to 3D parametric coords) /// \param[out] B The strain-displacement matrix void evaluateStrainDisplacement(double epsilon, double eta, double mu, const SurgSim::Math::Matrix33d& Jinv, Eigen::Matrix* B) const; /// Cube rest volume double m_restVolume; ///@{ /// Shape functions parameters /// \f$N_i(\epsilon, \eta, \mu) = (1\pm\epsilon)(1\pm\eta)(1\pm\mu)/8 /// = (1+\epsilon.sign(\epsilon_i))(1+\eta.sign(\eta_i))(1+\mu.sign(\mu_i))/8 /// \textbf{ with } (\epsilon, \eta, \mu) \in [-1 +1]^3\f$ /// /// We choose to only store the sign of epsilon, eta and mu for each shape functions. /// \sa N std::array m_shapeFunctionsEpsilonSign; std::array m_shapeFunctionsEtaSign; std::array m_shapeFunctionsMuSign; ///@} /// Shape functions \f$N_i(\epsilon, \eta, \mu) = (1\pm\epsilon)(1\pm\eta)(1\pm\mu)/8\f$ /// /*! \f$ * \begin{array}{r | r r r} * i & sign(\epsilon) & sign(\eta) & sign(\mu) \\ * \hline * 0 & -1 & -1 & -1 \\ * 1 & +1 & -1 & -1 \\ * 2 & +1 & +1 & -1 \\ * 3 & -1 & +1 & -1 \\ * 4 & -1 & -1 & +1 \\ * 5 & +1 & -1 & +1 \\ * 6 & +1 & +1 & +1 \\ * 7 & -1 & +1 & +1 * \end{array} * \f$ */ /// \param i The node id (w.r.t. local element) to evaluate at /// \param epsilon, eta, mu The 3D parametric coordinates each within \f$[-1 +1]\f$ /// \return Ni(epsilon, eta, mu) /// \note A check is performed on the nodeId i but not on the 3D parametric coordinates range /// \sa m_shapeFunctionsEpsilonSign, m_shapeFunctionsEtaSign, m_shapeFunctionsMuSign /// \sa dNdepsilon, dNdeta, dNdmu double shapeFunction(size_t i, double epsilon, double eta, double mu) const; /// Shape functions derivative \f$dN_i/d\epsilon(\epsilon, \eta, \mu) = \pm(1\pm\eta)(1\pm\mu)/8\f$ /// \param i The node id (w.r.t. local element) to evaluate at /// \param epsilon, eta, mu The 3D parametric coordinates each within \f$[-1 +1]\f$ /// \return dNi/depsilon(epsilon, eta, mu) /// \note A check is performed on the nodeId i but not on the 3D parametric coordinates range /// \sa N /// \sa m_shapeFunctionsEpsilonSign, m_shapeFunctionsEtaSign, m_shapeFunctionsMuSign double dShapeFunctiondepsilon(size_t i, double epsilon, double eta, double mu) const; /// Shape functions derivative \f$dN_i/d\eta(\epsilon, \eta, \mu) = \pm(1\pm\epsilon)(1\pm\mu)/8\f$ /// \param i The node id (w.r.t. local element) to evaluate at /// \param epsilon, eta, mu The 3D parametric coordinates each within \f$[-1 +1]\f$ /// \return dNi/depsilon(epsilon, eta, mu) /// \note A check is performed on the nodeId i but not on the 3D parametric coordinates range /// \sa N /// \sa m_shapeFunctionsEpsilonSign, m_shapeFunctionsEtaSign, m_shapeFunctionsMuSign double dShapeFunctiondeta(size_t i, double epsilon, double eta, double mu) const; /// Shape functions derivative \f$dN_i/d\mu(\epsilon, \eta, \mu) = \pm(1\pm\epsilon)(1\pm\eta)/8\f$ /// \param i The node id (w.r.t. local element) to evaluate at /// \param epsilon, eta, mu The 3D parametric coordinates each within \f$[-1 +1]\f$ /// \return dNi/depsilon(epsilon, eta, mu) /// \note A check is performed on the nodeId i but not on the 3D parametric coordinates range /// \sa N /// \sa m_shapeFunctionsEpsilonSign, m_shapeFunctionsEtaSign, m_shapeFunctionsMuSign double dShapeFunctiondmu(size_t i, double epsilon, double eta, double mu) const; /// The cube rest state (nodes ordered by m_nodeIds) Eigen::Matrix m_elementRestPosition; /// Strain matrix (usually noted \f$\epsilon\f$) Eigen::Matrix m_strain; /// Stress matrix (usually noted \f$\sigma\f$) Eigen::Matrix m_stress; /// Constitutive material matrix (Hooke's law in this case) defines the relationship between stress and strain Eigen::Matrix m_constitutiveMaterial; }; } // namespace Physics } // namespace SurgSim #endif // SURGSIM_PHYSICS_FEM3DELEMENTCUBE_H opensurgsim-0.7.0/SurgSim/Physics/Fem3DElementTetrahedron.cpp000066400000000000000000000376711277777236100242610ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Framework/Log.h" #include "SurgSim/Math/Geometry.h" #include "SurgSim/Math/OdeEquation.h" #include "SurgSim/Math/OdeState.h" #include "SurgSim/Physics/Fem3DElementTetrahedron.h" using SurgSim::Math::getSubVector; using SurgSim::Math::getSubMatrix; using SurgSim::Math::addSubVector; using SurgSim::Math::Vector; using SurgSim::Math::Vector3d; namespace { /// Computes the determinant of 3 vectors /// \param a, b, c The 3 vectors to compute the determinant from /// \return |a b c|, The determinant of the 3 vectors a, b and c double det(const Vector3d& a, const Vector3d& b, const Vector3d& c) { return a[0] * b[1] * c[2] + a[2] * b[0] * c[1] + a[1] * b[2] * c[0] - a[2] * b[1] * c[0] - a[1] * b[0] * c[2] - a[0] * b[2] * c[1]; } }; namespace SurgSim { namespace Physics { SURGSIM_REGISTER(SurgSim::Physics::FemElement, SurgSim::Physics::Fem3DElementTetrahedron, Fem3DElementTetrahedron) Fem3DElementTetrahedron::Fem3DElementTetrahedron() { initializeMembers(); } Fem3DElementTetrahedron::Fem3DElementTetrahedron(std::array nodeIds) { initializeMembers(); m_nodeIds.assign(std::begin(nodeIds), std::end(nodeIds)); } Fem3DElementTetrahedron::Fem3DElementTetrahedron(std::shared_ptr elementData) { initializeMembers(); auto element3DData = std::dynamic_pointer_cast(elementData); SURGSIM_ASSERT(element3DData != nullptr) << "Incorrect struct type passed"; SURGSIM_ASSERT(element3DData->nodeIds.size() == 4) << "Incorrect number of nodes for Fem3D Tetrahedron"; m_nodeIds.assign(element3DData->nodeIds.begin(), element3DData->nodeIds.end()); setMassDensity(element3DData->massDensity); setPoissonRatio(element3DData->poissonRatio); setYoungModulus(element3DData->youngModulus); } void Fem3DElementTetrahedron::initializeMembers() { setNumDofPerNode(3); // 3 dof per node (x, y, z) } void Fem3DElementTetrahedron::doUpdateFMDK(const Math::OdeState& state, int options) { if (options & Math::ODEEQUATIONUPDATE_F) { Eigen::Matrix x; // K.U = Fext // K.(x - x0) = Fext // 0 = Fext + Fint with Fint = -K.(x - x0) getSubVector(state.getPositions(), m_nodeIds, 3, &x); m_f = -m_K * (x - m_x0); } } void Fem3DElementTetrahedron::initialize(const SurgSim::Math::OdeState& state) { // Test the validity of the physical parameters FemElement::initialize(state); for (auto nodeId = m_nodeIds.cbegin(); nodeId != m_nodeIds.cend(); nodeId++) { SURGSIM_ASSERT(*nodeId >= 0 && *nodeId < state.getNumNodes()) << "Invalid nodeId " << *nodeId << " expected in range [0.." << state.getNumNodes() - 1 << "]"; } // Compute the fem tetrahedron shape functions Ni(x,y,z) = 1/6V ( ai + x.bi + y.ci + z.di ) computeShapeFunctions(state, &m_restVolume, &m_ai, &m_bi, &m_ci, &m_di); // Store the rest state for this tetrahedron in m_x0 getSubVector(state.getPositions(), m_nodeIds, 3, &m_x0); // Verify the Counter clock-wise condition auto A = getSubVector(m_x0, 0, 3); auto B = getSubVector(m_x0, 1, 3); auto C = getSubVector(m_x0, 2, 3); auto D = getSubVector(m_x0, 3, 3); SurgSim::Math::Vector3d AB = B - A; SurgSim::Math::Vector3d AC = C - A; SurgSim::Math::Vector3d AD = D - A; SURGSIM_LOG_IF(AB.cross(AC).dot(AD) < 0, SurgSim::Framework::Logger::getDefaultLogger(), WARNING) << "Tetrahedron ill-defined (ABC defined counter clock viewed from D) with node ids[" << m_nodeIds[0] << ", " << m_nodeIds[1] << ", " << m_nodeIds[2] << ", " << m_nodeIds[3] << "]"; // Pre-compute the mass and stiffness matrix computeMass(state, &m_M); computeStiffness(state, &m_K); } void Fem3DElementTetrahedron::computeMass(const SurgSim::Math::OdeState& state, SurgSim::Math::Matrix* M) { // From Przemieniecki book // -> section 11 "Inertia properties of structural elements // -> subsection 8 "Solid Tetrahedron" // // On each axis (x, y, z), the mass matrix is // m = rho * volume / 20 * (2 1 1 1) // (1 2 1 1) // (1 1 2 1) // (1 1 1 2) // // x1 y1 z1 x2 y2 z2 x3 y3 z3 x4 y4 z4 // x1 ( 2 1 1 1 ) // y1 ( 2 1 1 1 ) // z1 ( 2 1 1 1 ) // x2 ( 1 2 1 1 ) // y2 ( 1 2 1 1 ) // M = z2 ( 1 2 1 1 ) * rho * volume / 20 // x3 ( 1 1 2 1 ) // y3 ( 1 1 2 1 ) // z3 ( 1 1 2 1 ) // x4 ( 1 1 1 2 ) // y4 ( 1 1 1 2 ) // z4 ( 1 1 1 2 ) double coef = getVolume(state) * m_rho / 20.0; for (size_t rowNodeId = 0; rowNodeId < 4; rowNodeId++) { for (size_t colNodeId = 0; colNodeId < 4; colNodeId++) { auto Mii = getSubMatrix(*M, rowNodeId, colNodeId, 3, 3); if (rowNodeId == colNodeId) { Mii = SurgSim::Math::Matrix33d::Identity() * (2.0 * coef); } else { Mii = SurgSim::Math::Matrix33d::Identity() * coef; } } } } void Fem3DElementTetrahedron::computeStiffness(const SurgSim::Math::OdeState& state, SurgSim::Math::Matrix* k) { m_Em.setZero(); m_strain.setZero(); // Compute the strain matrix double coef = 1.0 / (6.0 * m_restVolume); for (int i = 0; i < 4; i++) { m_strain(0, 3 * i) = coef * m_bi[i]; m_strain(1, 3 * i + 1) = coef * m_ci[i]; m_strain(2, 3 * i + 2) = coef * m_di[i]; m_strain(3, 3 * i) = coef * m_ci[i]; m_strain(3, 3 * i + 1) = coef * m_bi[i]; m_strain(4, 3 * i + 1) = coef * m_di[i]; m_strain(4, 3 * i + 2) = coef * m_ci[i]; m_strain(5, 3 * i) = coef * m_di[i]; m_strain(5, 3 * i + 2) = coef * m_bi[i]; } // Compute the elasticity material matrix // which is commonly based on the Lame coefficients (1st = lambda, 2nd = mu = shear modulus): double lambda = m_E * m_nu / ((1.0 + m_nu) * (1.0 - 2.0 * m_nu)); double mu = m_E / (2.0 * (1 + m_nu)); m_Em(0, 0) = m_Em(1, 1) = m_Em(2, 2) = 2.0 * mu + lambda; m_Em(0, 1) = m_Em(0, 2) = m_Em(1, 0) = m_Em(1, 2) = m_Em(2, 0) = m_Em(2, 1) = lambda; m_Em(3, 3) = m_Em(4, 4) = m_Em(5, 5) = mu; // Compute the stress matrix m_stress = m_Em * m_strain; // Compute the stiffness matrix *k = m_restVolume * m_strain.transpose() * m_stress; // Ke is symmetric but numerical computation might introduce epsilon, we force the symmetry here *k = ((*k) + (*k).transpose()) * 0.5; } double Fem3DElementTetrahedron::getVolume(const SurgSim::Math::OdeState& state) const { /// Computes the tetrahedron volume 1/6 * | 1 p0x p0y p0z | /// | 1 p1x p1y p1z | /// | 1 p2x p2y p2z | /// | 1 p3x p3y p3z | const Vector& x = state.getPositions(); auto p0 = getSubVector(x, m_nodeIds[0], 3); auto p1 = getSubVector(x, m_nodeIds[1], 3); auto p2 = getSubVector(x, m_nodeIds[2], 3); auto p3 = getSubVector(x, m_nodeIds[3], 3); // fabs is necessary if we don't pay attention to the indexing ! // If the tetrahedron verify ABC counter clock wise viewed from D, this determinant is always positive = 6V // i.e. dot( cross(AB, AC), AD ) > 0 // Otherwise, it can happen that this determinant is negative = -6V !! return (det(p1, p2, p3) - det(p0, p2, p3) + det(p0, p1, p3) - det(p0, p1, p2)) / 6.0; } void Fem3DElementTetrahedron::computeShapeFunctions(const SurgSim::Math::OdeState& state, double* volume, std::array* ai, std::array* bi, std::array* ci, std::array* di) const { // The tetrahedron nodes 3D position {a,b,c,d} Vector3d a = getSubVector(state.getPositions(), m_nodeIds[0], 3); Vector3d b = getSubVector(state.getPositions(), m_nodeIds[1], 3); Vector3d c = getSubVector(state.getPositions(), m_nodeIds[2], 3); Vector3d d = getSubVector(state.getPositions(), m_nodeIds[3], 3); *volume = getVolume(state); // See http://www.colorado.edu/engineering/CAS/courses.d/AFEM.d/AFEM.Ch09.d/AFEM.Ch09.pdf for more details. // Relationship between the notations in this source code and the document mentioned above: // a(x1 y1 z1) b(x2 y2 z2) c(x3 y3 z3) d(x4 y4 z4) // Shape functions link the 3D space (x, y, z) to the natural parametrization (sigmai) of the shape. // (i.e. sigmai are the barycentric coordinates for the respective 4 nodes of the tetrahedon) // (1) ( 1 1 1 1) (sigma1) // (x) = (x1 x2 x3 x4) (sigma2) // (y) (y1 y2 y3 y4) (sigma3) // (z) (z1 z2 z3 z4) (sigma4) // // The shape functions Ni(x, y, z) are given by the inverse relationship: // (sigma1) ( 1 1 1 1)^-1 (1) (a[0] b[0] c[0] d[0]) (1) | 1 1 1 1| // (sigma2) = (x1 x2 x3 x4) (x) = 1/6V (a[1] b[1] c[1] d[1]) (x) where |x1 x2 x3 x4| = 6V // (sigma3) (y1 y2 y3 y4) (y) (a[2] b[2] c[2] d[2]) (y) |y1 y2 y3 y4| // (sigma4) (z1 z2 z3 z4) (z) (a[3] b[3] c[3] d[3]) (z) |z1 z2 z3 z4| // Computes the shape functions parameters m_ai (noted 6V0i in the document mentioned above, eq 9.12) // m_ai[0] = 6V01 = 6V(origin,b,c,d) = x2(y3z4 - y4z3) + x3(y4z2 - y2z4) + x4(y2z3 - y3z2) = |b c d| // m_ai[1] = 6V02 = 6V(origin,c,d,a) = x1(y4z3 - y3z4) + x3(y1z4 - y4z1) + x4(y3z1 - y1z3) = -|a c d| // m_ai[2] = 6V03 = 6V(origin,d,a,b) = x1(y2z4 - y4z2) + x2(y4z1 - y1z4) + x4(y1z2 - y2z1) = |a b d| // m_ai[3] = 6V04 = 6V(origin,a,b,c) = x1(y3z2 - y2z3) + x2(y1z3 - y3z1) + x3(y2z1 - y1z2) = -|a b c| (*ai)[0] = det(b, c, d); (*ai)[1] = -det(a, c, d); (*ai)[2] = det(a, b, d); (*ai)[3] = -det(a, b, c); // Computes the shape function parameters m_bi (noted ai in the document mentioned above, eq 9.11) // m_bi[0] = y42z32 - y32z42 = (y4-y2)(z3-z2) - (y3-y2)(z4-z2) = |1 y2 z2| = |1 by bz| // -|1 y3 z3| -|1 cy cz| // |1 y4 z4| |1 dy dz| // // m_bi[1] = y31z43 - y34z13 = (y3-y1)(z4-z3) - (y3-y4)(z1-z3) = |1 y1 z1| = |1 ay az| // |1 y3 z3| |1 cy cz| // |1 y4 z4| |1 dy dz| // // m_bi[2] = y24z14 - y14z24 = (y2-y4)(z1-z4) - (y1-y4)(z2-z4) = |1 y1 z1| = |1 ay az| // -|1 y2 z2| -|1 by bz| // |1 y4 z4| |1 dy dz| // // m_bi[3] = y13z21 - y12z31 = (y1-y3)(z2-z1) - (y1-y2)(z3-z1) = |1 y1 z1| = |1 ay az| // |1 y2 z2| |1 by bz| // |1 y3 z3| |1 cy cz| { Vector3d atilde(1, a[1], a[2]); Vector3d btilde(1, b[1], b[2]); Vector3d ctilde(1, c[1], c[2]); Vector3d dtilde(1, d[1], d[2]); (*bi)[0] = -det(btilde, ctilde, dtilde); (*bi)[1] = det(atilde, ctilde, dtilde); (*bi)[2] = -det(atilde, btilde, dtilde); (*bi)[3] = det(atilde, btilde, ctilde); } // Computes the shape function parameters m_ci (noted bi in the document mentioned above, eq 9.11) // m_ci[0] = x32z42 - x42z32 = (x3-x2)(z4-z2) - (x4-x2)(z3-z2) = |1 x2 z2| = |1 bx bz| // |1 x3 z3| |1 cx cz| // |1 x4 z4| |1 dx dz| // // m_ci[1] = x43z31 - x13z34 = (x4-x3)(z3-z1) - (x1-x3)(z3-z4) = |1 x1 z1| = |1 ax az| // -|1 x3 z3| -|1 cx cz| // |1 x4 z4| |1 dx dz| // // m_ci[2] = x14z24 - x24z14 = (x1-x4)(z2-z4) - (x2-x4)(z1-z4) = |1 x1 z1| = |1 ax az| // |1 x2 z2| |1 bx bz| // |1 x4 z4| |1 dx dz| // // m_ci[3] = x21z13 - x31z12 = (x2-x1)(z1-z3) - (x3-x1)(z1-z2) = |1 x1 z1| = |1 ax az| // -|1 x2 z2| -|1 bx bz| // |1 x3 z3| |1 cx cz| { Vector3d atilde(1, a[0], a[2]); Vector3d btilde(1, b[0], b[2]); Vector3d ctilde(1, c[0], c[2]); Vector3d dtilde(1, d[0], d[2]); (*ci)[0] = det(btilde, ctilde, dtilde); (*ci)[1] = -det(atilde, ctilde, dtilde); (*ci)[2] = det(atilde, btilde, dtilde); (*ci)[3] = -det(atilde, btilde, ctilde); } // Computes the shape function parameters m_di (noted ci in the document mentioned above, eq 9.11) // m_di[0] = x42y32 - x32y42 = (x4-x2)(y3-y2) - (x3-x2)(y4-y2) = |1 x2 y2| = |1 bx by| // -|1 x3 y3| -|1 cx cy| // |1 x4 y4| |1 dx dy| // // m_di[1] = x31y43 - x34y13 = (x3-x1)(y4-y3) - (x3-x4)(y1-y3) = |1 x1 y1| = |1 ax ay| // |1 x3 y3| |1 cx cy| // |1 x4 y4| |1 dx dy| // // m_di[2] = x24y14 - x14y24 = (x2-x4)(y1-y4) - (x1-x4)(y2-y4) = |1 x1 y1| = |1 ax ay| // -|1 x2 y2| -|1 bx by| // |1 x4 y4| |1 dx dy| // // m_di[3] = x13y21 - x12y31 = (x1-x3)(y2-y1) - (x1-x2)(y3-y1) = |1 x1 y1| = |1 ax ay| // |1 x2 y2| |1 bx by| // |1 x3 y3| |1 cx cy| { Vector3d atilde(1, a[0], a[1]); Vector3d btilde(1, b[0], b[1]); Vector3d ctilde(1, c[0], c[1]); Vector3d dtilde(1, d[0], d[1]); (*di)[0] = -det(btilde, ctilde, dtilde); (*di)[1] = det(atilde, ctilde, dtilde); (*di)[2] = -det(atilde, btilde, dtilde); (*di)[3] = det(atilde, btilde, ctilde); } } SurgSim::Math::Vector Fem3DElementTetrahedron::computeCartesianCoordinate( const SurgSim::Math::OdeState& state, const SurgSim::Math::Vector& naturalCoordinate) const { SURGSIM_ASSERT(isValidCoordinate(naturalCoordinate)) << "naturalCoordinate must be normalized and length 4."; const Vector& x = state.getPositions(); Vector3d p0 = getSubVector(x, m_nodeIds[0], 3); Vector3d p1 = getSubVector(x, m_nodeIds[1], 3); Vector3d p2 = getSubVector(x, m_nodeIds[2], 3); Vector3d p3 = getSubVector(x, m_nodeIds[3], 3); return naturalCoordinate(0) * p0 + naturalCoordinate(1) * p1 + naturalCoordinate(2) * p2 + naturalCoordinate(3) * p3; } SurgSim::Math::Vector Fem3DElementTetrahedron::computeNaturalCoordinate( const SurgSim::Math::OdeState& state, const SurgSim::Math::Vector& cartesianCoordinate) const { SURGSIM_ASSERT(cartesianCoordinate.size() == 3) << "globalCoordinate must be length 3."; double volume; std::array ai; std::array bi; std::array ci; std::array di; computeShapeFunctions(state, &volume, &ai, &bi, &ci, &di); SurgSim::Math::Vector4d result; for (size_t i = 0; i < 4; ++i) { result[i] = ai[i] + bi[i] * cartesianCoordinate[0] + ci[i] * cartesianCoordinate[1] + di[i] * cartesianCoordinate[2]; } result /= 6.0 * volume; return result; } } // namespace Physics } // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/Fem3DElementTetrahedron.h000066400000000000000000000132271277777236100237150ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_FEM3DELEMENTTETRAHEDRON_H #define SURGSIM_PHYSICS_FEM3DELEMENTTETRAHEDRON_H #include #include "SurgSim/Math/Matrix.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/Fem.h" #include "SurgSim/Physics/FemElement.h" namespace SurgSim { namespace Physics { SURGSIM_STATIC_REGISTRATION(Fem3DElementTetrahedron); /// Class for Fem Element 3D based on a tetrahedron volume discretization /// \note The inertia property (mass) of the tetrahedron is derived from /// \note "Theory of Matrix Structural Analysis" from J.S. Przemieniecki /// \note The force and stiffness matrix of the tetrahedron is derived from /// \note http://www.colorado.edu/engineering/CAS/courses.d/AFEM.d/AFEM.Ch09.d/AFEM.Ch09.pdf /// \note The deformation is based on the linear elasticity theory and not on the visco-elasticity theory. /// \note Therefore the element does not have any damping component. /// \note Fem3DElementTetrahedron uses linear elasticity (not visco-elasticity), so it does not give any damping. class Fem3DElementTetrahedron : public FemElement { public: /// Constructor Fem3DElementTetrahedron(); /// Constructor /// \param nodeIds An array of 4 node ids defining this tetrahedron element in a overall mesh /// \note It is required that the triangle ABC is CCW looking from D (i.e. dot(cross(AB, AC), AD) > 0) /// \note This is required from the signed volume calculation method getVolume() /// \note A warning will be logged when the initialize function is called if this condition is not met, but the /// \note simulation will keep running. Behavior will be undefined because of possible negative volume terms. explicit Fem3DElementTetrahedron(std::array nodeIds); /// Constructor for FemElement object factory /// \param elementData A FemElement3D struct defining this tetrahedron element in a overall mesh /// \note It is required that the triangle ABC is CCW looking from D (i.e. dot(cross(AB, AC), AD) > 0) /// \note This is required from the signed volume calculation method getVolume() /// \note A warning will be logged when the initialize function is called if this condition is not met, but the /// \note simulation will keep running. Behavior will be undefined because of possible negative volume terms. /// \exception SurgSim::Framework::AssertionFailure if nodeIds has a size different than 4 explicit Fem3DElementTetrahedron(std::shared_ptr elementData); SURGSIM_CLASSNAME(SurgSim::Physics::Fem3DElementTetrahedron) void initialize(const SurgSim::Math::OdeState& state) override; double getVolume(const SurgSim::Math::OdeState& state) const override; SurgSim::Math::Vector computeCartesianCoordinate(const SurgSim::Math::OdeState& state, const SurgSim::Math::Vector& naturalCoordinate) const override; SurgSim::Math::Vector computeNaturalCoordinate(const SurgSim::Math::OdeState& state, const SurgSim::Math::Vector& cartesianCoordinate) const override; protected: /// Initializes variables needed before Initialize() is called void initializeMembers(); void doUpdateFMDK(const Math::OdeState& state, int options) override; /// Computes the tetrahedron shape functions /// \param state The deformable rest state to compute the shape function from /// \param[out] volume the volume calculated with the given state /// \param[out] ai from the shape function, Ni(x, y, z) = 1/6*volume (ai + bi.x + ci.y + di.z) /// \param[out] bi from the shape function, Ni(x, y, z) = 1/6*volume (ai + bi.x + ci.y + di.z) /// \param[out] ci from the shape function, Ni(x, y, z) = 1/6*volume (ai + bi.x + ci.y + di.z) /// \param[out] di from the shape function, Ni(x, y, z) = 1/6*volume (ai + bi.x + ci.y + di.z) void computeShapeFunctions(const SurgSim::Math::OdeState& state, double* volume, std::array* ai, std::array* bi, std::array* ci, std::array* di) const; /// Computes the tetrahedron stiffness matrix /// \param state The state to compute the stiffness matrix from /// \param[out] k The stiffness matrix to store the result into void computeStiffness(const SurgSim::Math::OdeState& state, SurgSim::Math::Matrix* k); /// Computes the tetrahedron mass matrix /// \param state The state to compute the mass matrix from /// \param[out] m The mass matrix to store the result into void computeMass(const SurgSim::Math::OdeState& state, SurgSim::Math::Matrix* m); /// Shape functions: Tetrahedron rest volume double m_restVolume; /// Shape functions coefficients Ni(x,y,z) = 1/6V ( ai + x.bi + y.ci + z.di ) std::array m_ai, m_bi, m_ci, m_di; /// The tetrahedon rest state Eigen::Matrix m_x0; /// Elasticity material matrix (contains the elastic properties of the material) Eigen::Matrix m_Em; /// Strain matrix Eigen::Matrix m_strain; /// Stress matrix Eigen::Matrix m_stress; }; } // namespace Physics } // namespace SurgSim #endif // SURGSIM_PHYSICS_FEM3DELEMENTTETRAHEDRON_H opensurgsim-0.7.0/SurgSim/Physics/Fem3DLocalization.cpp000066400000000000000000000027571277777236100231150ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Physics/Fem3DLocalization.h" #include "SurgSim/Math/OdeState.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/Fem3DRepresentation.h" #include "SurgSim/Physics/FemElement.h" namespace SurgSim { namespace Physics { Fem3DLocalization::Fem3DLocalization( std::shared_ptr representation, const SurgSim::DataStructures::IndexedLocalCoordinate& localPosition) : FemLocalization(representation, localPosition) { } Fem3DLocalization::~Fem3DLocalization() { } bool Fem3DLocalization::isValidRepresentation(std::shared_ptr representation) { auto femRepresentation = std::dynamic_pointer_cast(representation); // Allows to reset the representation to nullptr ... return (femRepresentation != nullptr || representation == nullptr); } } // namespace Physics } // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/Fem3DLocalization.h000066400000000000000000000042771277777236100225610ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_FEM3DLOCALIZATION_H #define SURGSIM_PHYSICS_FEM3DLOCALIZATION_H #include "SurgSim/DataStructures/IndexedLocalCoordinate.h" #include "SurgSim/Physics/FemLocalization.h" namespace SurgSim { namespace Physics { /// Implementation of Localization for Fem3DRepresentation /// /// Fem3DLocalization tracks the global coordinates of an IndexedLocalCoordinate associated with an /// Fem3DRepresentation. The IndexedLocalCoordinate must be related to an FemElement (the index is an FemElement id and /// the local coordinates are the barycentric coordinates of the nodes in this FemElement). /// It is used, for example, as a helper class for filling out the MlcpPhysicsProblem in /// Fem3DRepresentationContact::doBuild, which constrains the motion of Fem3DRepresentation at a frictionless contact. class Fem3DLocalization : public FemLocalization { public: /// Constructor /// \param representation The representation to assign to this localization. /// \param localPosition The local position to set the localization at. Fem3DLocalization(std::shared_ptr representation, const SurgSim::DataStructures::IndexedLocalCoordinate& localPosition); /// Destructor virtual ~Fem3DLocalization(); /// Query if 'representation' is valid representation. /// \param representation The representation. /// \return true if valid representation, false if not. bool isValidRepresentation(std::shared_ptr representation) override; }; } // namespace Physics } // namespace SurgSim #endif // SURGSIM_PHYSICS_FEM3DLOCALIZATION_H opensurgsim-0.7.0/SurgSim/Physics/Fem3DPlyReaderDelegate.cpp000066400000000000000000000055601277777236100240020ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Math/Valid.h" #include "SurgSim/Physics/Fem3DPlyReaderDelegate.h" using SurgSim::DataStructures::PlyReader; namespace SurgSim { namespace Physics { Fem3DPlyReaderDelegate::Fem3DPlyReaderDelegate() { } Fem3DPlyReaderDelegate::Fem3DPlyReaderDelegate(std::shared_ptr mesh) : m_mesh(mesh) { SURGSIM_ASSERT(mesh != nullptr) << "The mesh cannot be null."; mesh->clear(); } std::string Fem3DPlyReaderDelegate::getElementName() const { return "3d_element"; } bool Fem3DPlyReaderDelegate::fileIsAcceptable(const PlyReader& reader) { bool result = FemPlyReaderDelegate::fileIsAcceptable(reader); SURGSIM_ASSERT(!m_hasRotationDOF) << "Fem3DPlyReaderDelegate does not support rotational DOF, data will be ignored."; return result; } void Fem3DPlyReaderDelegate::endParseFile() { if (!m_hasPerElementMaterial && m_hasMaterial) { for (auto element : m_mesh->getElements()) { element->massDensity = m_materialData.massDensity; element->poissonRatio = m_materialData.poissonRatio; element->youngModulus = m_materialData.youngModulus; } } m_mesh->update(); } void Fem3DPlyReaderDelegate::processVertex(const std::string& elementName) { Fem3D::VertexType vertex(SurgSim::Math::Vector3d(m_vertexData.x, m_vertexData.y, m_vertexData.z)); m_mesh->addVertex(vertex); } void Fem3DPlyReaderDelegate::processFemElement(const std::string& elementName) { SURGSIM_ASSERT(m_elementData.vertexCount == 4 || m_elementData.vertexCount == 8) << "Cannot process 3D Element with " << m_elementData.vertexCount << " vertices."; auto femElement = std::make_shared(); femElement->nodeIds.resize(m_elementData.vertexCount); std::copy(m_elementData.indices, m_elementData.indices + m_elementData.vertexCount, femElement->nodeIds.data()); if (m_hasPerElementMaterial) { femElement->massDensity = m_elementData.massDensity; femElement->poissonRatio = m_elementData.poissonRatio; femElement->youngModulus = m_elementData.youngModulus; } m_mesh->addElement(femElement); } void Fem3DPlyReaderDelegate::processBoundaryCondition(const std::string& elementName) { m_mesh->addBoundaryCondition(static_cast(m_boundaryConditionData)); } } // namespace Physics } // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/Fem3DPlyReaderDelegate.h000066400000000000000000000035341277777236100234460ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_FEM3DPLYREADERDELEGATE_H #define SURGSIM_PHYSICS_FEM3DPLYREADERDELEGATE_H #include #include #include "SurgSim/DataStructures/EmptyData.h" #include "SurgSim/DataStructures/PlyReader.h" #include "SurgSim/Physics/Fem3D.h" #include "SurgSim/Physics/FemPlyReaderDelegate.h" namespace SurgSim { namespace Physics { class Fem3DPlyReaderDelegate : public FemPlyReaderDelegate { public: /// Default constructor. Fem3DPlyReaderDelegate(); /// Constructor. /// \param mesh The mesh to be used, it will be cleared by the constructor. explicit Fem3DPlyReaderDelegate(std::shared_ptr mesh); protected: std::string getElementName() const override; bool fileIsAcceptable(const PlyReader& reader) override; void endParseFile() override; void processVertex(const std::string& elementName) override; void processFemElement(const std::string& elementName) override; void processBoundaryCondition(const std::string& elementName) override; /// End file callback void endFile(); private: /// Fem3D mesh asset to contain the ply file information std::shared_ptr m_mesh; }; } // namespace Physics } // namespace SurgSim #endif // SURGSIM_PHYSICS_FEM3DPLYREADERDELEGATE_H opensurgsim-0.7.0/SurgSim/Physics/Fem3DRepresentation.cpp000066400000000000000000000344571277777236100234710ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/DataStructures/IndexedLocalCoordinate.h" #include "SurgSim/DataStructures/Location.h" #include "SurgSim/Framework/Assert.h" #include "SurgSim/Framework/Asset.h" #include "SurgSim/Math/MeshShape.h" #include "SurgSim/Math/OdeState.h" #include "SurgSim/Math/SparseMatrix.h" #include "SurgSim/Physics/DeformableCollisionRepresentation.h" #include "SurgSim/Physics/Fem3DElementCube.h" #include "SurgSim/Physics/Fem3DElementTetrahedron.h" #include "SurgSim/Physics/Fem3DLocalization.h" #include "SurgSim/Physics/Fem3DRepresentation.h" #include "SurgSim/Physics/FemElement.h" #include "SurgSim/Physics/Localization.h" namespace { void transformVectorByBlockOf3(const SurgSim::Math::RigidTransform3d& transform, SurgSim::Math::Vector* x, bool rotationOnly = false) { typedef SurgSim::Math::Vector::Index IndexType; IndexType numNodes = x->size() / 3; SURGSIM_ASSERT(numNodes * 3 == x->size()) << "Unexpected number of dof in a Fem3D state vector (not a multiple of 3)"; for (IndexType nodeId = 0; nodeId < numNodes; nodeId++) { SurgSim::Math::Vector3d xi = x->segment<3>(3 * nodeId); x->segment<3>(3 * nodeId) = (rotationOnly) ? transform.linear() * xi : transform * xi; } } } namespace SurgSim { namespace Physics { SURGSIM_REGISTER(SurgSim::Framework::Component, SurgSim::Physics::Fem3DRepresentation, Fem3DRepresentation); Fem3DRepresentation::Fem3DRepresentation(const std::string& name) : FemRepresentation(name) { SURGSIM_ADD_SERIALIZABLE_PROPERTY(Fem3DRepresentation, std::shared_ptr, Fem, getFem, setFem); SURGSIM_ADD_SETTER(Fem3DRepresentation, std::string, FemFileName, loadFem) // Reminder: m_numDofPerNode is held by DeformableRepresentation // but needs to be set by all concrete derived classes m_numDofPerNode = 3; m_fem = std::make_shared(); } Fem3DRepresentation::~Fem3DRepresentation() { } void Fem3DRepresentation::loadFem(const std::string& fileName) { auto mesh = std::make_shared(); mesh->load(fileName); setFem(mesh); } void Fem3DRepresentation::setFem(std::shared_ptr mesh) { SURGSIM_ASSERT(!isInitialized()) << "The Fem cannot be set after initialization"; SURGSIM_ASSERT(mesh != nullptr) << "Mesh for Fem3DRepresentation cannot be a nullptr"; auto femMesh = std::dynamic_pointer_cast(mesh); SURGSIM_ASSERT(femMesh != nullptr) << "Mesh for Fem3DRepresentation needs to be a SurgSim::Physics::Fem3D"; m_fem = femMesh; auto state = std::make_shared(); state->setNumDof(getNumDofPerNode(), m_fem->getNumVertices()); for (size_t i = 0; i < m_fem->getNumVertices(); i++) { state->getPositions().segment<3>(getNumDofPerNode() * i) = m_fem->getVertexPosition(i); } for (auto boundaryCondition : m_fem->getBoundaryConditions()) { state->addBoundaryCondition(boundaryCondition); } // If we have elements, ensure that they are all of the same nature if (femMesh->getNumElements() > 0) { const auto& e0 = femMesh->getElement(0); for (auto const& e : femMesh->getElements()) { SURGSIM_ASSERT(e->nodeIds.size() == e0->nodeIds.size()) << "Cannot mix and match elements of different nature." << " Found an element with " << e->nodeIds.size() << " nodes but was expecting " << e0->nodeIds.size(); } // If the FemElement types hasn't been registered yet, let's set a default one if (getFemElementType().empty()) { if (e0->nodeIds.size() == 4) { Fem3DElementTetrahedron tetrahdron; setFemElementType(tetrahdron.getClassName()); } else if (e0->nodeIds.size() == 8) { Fem3DElementCube cube; setFemElementType(cube.getClassName()); } } } setInitialState(state); } std::shared_ptr Fem3DRepresentation::getFem() const { return m_fem; } void Fem3DRepresentation::addExternalGeneralizedForce(std::shared_ptr localization, const Math::Vector& generalizedForce, const Math::Matrix& K, const Math::Matrix& D) { using Math::SparseMatrix; const size_t dofPerNode = getNumDofPerNode(); const Math::Matrix::Index expectedSize = static_cast(dofPerNode); SURGSIM_ASSERT(localization != nullptr) << "Invalid localization (nullptr)"; SURGSIM_ASSERT(generalizedForce.size() == expectedSize) << "Generalized force has an invalid size of " << generalizedForce.size() << ". Expected " << dofPerNode; SURGSIM_ASSERT(K.size() == 0 || (K.rows() == expectedSize && K.cols() == expectedSize)) << "Stiffness matrix K has an invalid size (" << K.rows() << "," << K.cols() << ") was expecting a square matrix of size " << dofPerNode; SURGSIM_ASSERT(D.size() == 0 || (D.rows() == expectedSize && D.cols() == expectedSize)) << "Damping matrix D has an invalid size (" << D.rows() << "," << D.cols() << ") was expecting a square matrix of size " << dofPerNode; std::shared_ptr localization3D = std::dynamic_pointer_cast(localization); SURGSIM_ASSERT(localization3D != nullptr) << "Invalid localization type (not a Fem3DLocalization)"; const size_t elementId = localization3D->getLocalPosition().index; const Math::Vector& coordinate = localization3D->getLocalPosition().coordinate; std::shared_ptr element = getFemElement(elementId); size_t index = 0; for (auto nodeId : element->getNodeIds()) { m_externalGeneralizedForce.segment(dofPerNode * nodeId, dofPerNode) += generalizedForce * coordinate[index]; index++; } if (K.size() != 0 || D.size() != 0) { size_t index1 = 0; for (auto nodeId1 : element->getNodeIds()) { size_t index2 = 0; for (auto nodeId2 : element->getNodeIds()) { if (K.size() != 0) { Math::addSubMatrix(coordinate[index1] * coordinate[index2] * K, static_cast(nodeId1), static_cast(nodeId2), &m_externalGeneralizedStiffness, true); } if (D.size() != 0) { Math::addSubMatrix(coordinate[index1] * coordinate[index2] * D, static_cast(nodeId1), static_cast(nodeId2), &m_externalGeneralizedDamping, true); } index2++; } index1++; } } m_externalGeneralizedStiffness.makeCompressed(); m_externalGeneralizedDamping.makeCompressed(); m_hasExternalGeneralizedForce = true; } std::unordered_map Fem3DRepresentation::createTriangleIdToElementIdMap( std::shared_ptr mesh) { std::unordered_map result; // An Fem3DElementCube/Fem3DElementTetrahedron element has 8/4 nodes. // A triangle has 3 nodes. // If all the nodes of a triangle are present in a Fem3DElement*** node, then a row in the map is created. // The nodes are identified using their ids. // std::includes(...) is used to find whether a given list of triangle node ids are present in the supplied list // of femElement node ids. This function requires the lists of node ids to be sorted. // Get the list of fem elements with their node ids. std::vector> femElements; femElements.reserve(getNumFemElements()); for (size_t i = 0; i < getNumFemElements(); ++i) { auto elementNodeIds = getFemElement(i)->getNodeIds(); std::sort(elementNodeIds.begin(), elementNodeIds.end()); femElements.push_back(elementNodeIds); } std::array triangleSorted; auto doesIncludeTriangle = [&triangleSorted](const std::vector& femElementSorted) { return std::includes(femElementSorted.begin(), femElementSorted.end(), triangleSorted.begin(), triangleSorted.end()); }; auto& meshTriangles = mesh->getTriangles(); for (auto triangle = meshTriangles.cbegin(); triangle != meshTriangles.cend(); ++triangle) { if (! triangle->isValid) { continue; } triangleSorted = triangle->verticesId; std::sort(triangleSorted.begin(), triangleSorted.end()); // Find the femElement that contains all the node ids of this triangle. std::vector>::iterator foundFemElement = std::find_if(femElements.begin(), femElements.end(), doesIncludeTriangle); // Assert to make sure that a triangle doesn't end up not having a femElement mapped to it. SURGSIM_ASSERT(foundFemElement != femElements.end()) << "A triangle in the given mesh of an Fem3DRepresentation does not have a corresponding" << " femElement."; // Add a row to the mapping (triangleId, elementId). // std::distance gives the index of the iterator within the container (by finding the distance // from the beginning of the container). result[std::distance(meshTriangles.begin(), triangle)] = std::distance(femElements.begin(), foundFemElement); } return result; } bool Fem3DRepresentation::doWakeUp() { if (!FemRepresentation::doWakeUp()) { return false; } auto deformableCollision = std::dynamic_pointer_cast(m_collisionRepresentation); if (deformableCollision != nullptr) { auto mesh = std::dynamic_pointer_cast(deformableCollision->getShape()); m_triangleIdToElementIdMap = createTriangleIdToElementIdMap(mesh); } return true; } bool Fem3DRepresentation::doInitialize() { for (auto& element : m_fem->getElements()) { std::shared_ptr femElement; femElement = FemElement::getFactory().create(getFemElementType(), element); m_femElements.push_back(femElement); } return FemRepresentation::doInitialize(); } std::shared_ptr Fem3DRepresentation::createNodeLocalization(size_t nodeId) { DataStructures::IndexedLocalCoordinate coordinate; SURGSIM_ASSERT(nodeId >= 0 && nodeId < getCurrentState()->getNumNodes()) << "Invalid node id"; // Look for any element that contains this node bool foundNodeId = false; for (size_t elementId = 0; elementId < getNumFemElements(); elementId++) { auto element = getFemElement(elementId); auto found = std::find(element->getNodeIds().begin(), element->getNodeIds().end(), nodeId); if (found != element->getNodeIds().end()) { coordinate.index = elementId; coordinate.coordinate.setZero(element->getNumNodes()); coordinate.coordinate[found - element->getNodeIds().begin()] = 1.0; foundNodeId = true; break; } } SURGSIM_ASSERT(foundNodeId) << "Could not find any element containing the node " << nodeId; // Fem3DLocalization will verify the coordinate (2nd parameter) based on // the Fem3DRepresentation passed as 1st parameter. return std::make_shared( std::static_pointer_cast(getSharedPtr()), coordinate); } std::shared_ptr Fem3DRepresentation::createTriangleLocalization( const DataStructures::IndexedLocalCoordinate& location) { DataStructures::IndexedLocalCoordinate coordinate; size_t triangleId = location.index; const Math::Vector& triangleCoord = location.coordinate; auto deformableCollision = std::dynamic_pointer_cast(m_collisionRepresentation); SURGSIM_ASSERT(deformableCollision != nullptr) << "Triangle localization cannot be created if the DeformableCollisionRepresentation is not correctly set."; // Find the vertex ids of the triangle. auto mesh = std::dynamic_pointer_cast(deformableCollision->getShape()); auto triangleVertices = mesh->getTriangle(triangleId).verticesId; // Find the vertex ids of the corresponding FemNode. // Get FemElement id from the triangle id. SURGSIM_ASSERT(m_triangleIdToElementIdMap.count(triangleId) == 1) << "Triangle must be mapped to an fem element."; size_t elementId = m_triangleIdToElementIdMap[triangleId]; std::shared_ptr element = getFemElement(elementId); auto elementVertices = element->getNodeIds(); // Find the mapping between triangleVertices and elementVertices. std::vector indices; indices.reserve(elementVertices.size()); for (size_t i = 0; i < elementVertices.size(); ++i) { indices.push_back(3); for (int j = 0; j < 3; ++j) { if (triangleVertices[j] == elementVertices[i]) { indices[i] = j; break; } } } // Create the natural coordinate. Math::Vector4d barycentricCoordinate(triangleCoord[0], triangleCoord[1], triangleCoord[2], 0.0); coordinate.index = elementId; coordinate.coordinate.resize(elementVertices.size()); for (size_t i = 0; i < elementVertices.size(); ++i) { coordinate.coordinate[i] = barycentricCoordinate[indices[i]]; } // Fem3DLocalization will verify the coordinate (2nd parameter) based on // the Fem3DRepresentation passed as 1st parameter. return std::make_shared( std::static_pointer_cast(getSharedPtr()), coordinate); } std::shared_ptr Fem3DRepresentation::createElementLocalization( const DataStructures::IndexedLocalCoordinate& location) { return std::make_shared( std::static_pointer_cast(getSharedPtr()), location); } std::shared_ptr Fem3DRepresentation::createLocalization(const DataStructures::Location& location) { if (location.index.hasValue()) { return createNodeLocalization(*location.index); } else if (location.triangleMeshLocalCoordinate.hasValue()) { return createTriangleLocalization(*location.triangleMeshLocalCoordinate); } else if (location.elementMeshLocalCoordinate.hasValue()) { return createElementLocalization(*location.elementMeshLocalCoordinate); } SURGSIM_FAILURE() << "Localization cannot be created without a mesh-based location (node, triangle or element)."; return nullptr; } void Fem3DRepresentation::transformState(std::shared_ptr state, const Math::RigidTransform3d& transform) { transformVectorByBlockOf3(transform, &state->getPositions()); transformVectorByBlockOf3(transform, &state->getVelocities(), true); } } // namespace Physics } // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/Fem3DRepresentation.h000066400000000000000000000104401277777236100231200ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_FEM3DREPRESENTATION_H #define SURGSIM_PHYSICS_FEM3DREPRESENTATION_H #include #include #include #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Math/Matrix.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/Fem3D.h" #include "SurgSim/Physics/FemRepresentation.h" namespace SurgSim { namespace DataStructures { struct IndexedLocalCoordinate; struct Location; } namespace Framework { class Asset; } namespace Math { class MeshShape; class OdeState; } namespace Physics { class Localization; SURGSIM_STATIC_REGISTRATION(Fem3DRepresentation); /// Finite Element Model 3D is a fem built with 3D FemElement class Fem3DRepresentation : public FemRepresentation { public: /// Constructor /// \param name The name of the Fem3DRepresentation explicit Fem3DRepresentation(const std::string& name); /// Destructor virtual ~Fem3DRepresentation(); SURGSIM_CLASSNAME(SurgSim::Physics::Fem3DRepresentation); void loadFem(const std::string& fileName) override; /// Sets the fem mesh asset /// \param mesh The fem mesh to assign to this representation /// \exception SurgSim::Framework::AssertionFailure if mesh is nullptr or it's actual type is not Fem3D void setFem(std::shared_ptr mesh); /// \return The fem mesh asset as a Fem3D std::shared_ptr getFem() const; void addExternalGeneralizedForce(std::shared_ptr localization, const SurgSim::Math::Vector& generalizedForce, const SurgSim::Math::Matrix& K = SurgSim::Math::Matrix(), const SurgSim::Math::Matrix& D = SurgSim::Math::Matrix()) override; std::shared_ptr createLocalization(const SurgSim::DataStructures::Location& location) override; protected: bool doWakeUp() override; void transformState(std::shared_ptr state, const SurgSim::Math::RigidTransform3d& transform) override; bool doInitialize() override; private: /// Produces a mapping from the provided mesh's triangle ids to this object's fem element ids. The mesh's vertices /// must be identical to this object's fem element nodes. /// \param mesh The mesh used to produce the mapping. /// \return A map from the mesh's triangle ids to this object's fem elements. std::unordered_map createTriangleIdToElementIdMap( std::shared_ptr mesh); /// Helper method: create a localization for a node /// \param nodeId The node index /// \return Localization of the node for this representation std::shared_ptr createNodeLocalization(size_t nodeId); /// Helper method: create a localization for an triangle-based IndexedLocalCoordinate /// \param location The IndexedLocalCoordinate defining a point on the triangle mesh /// \return Localization of the point for this representation std::shared_ptr createTriangleLocalization( const SurgSim::DataStructures::IndexedLocalCoordinate& location); /// Helper method: create a localization for an element-based IndexedLocalCoordinate (tetrahedron or cube) /// \param location The IndexedLocalCoordinate defining a point on the element mesh /// \return Localization of the point for this representation std::shared_ptr createElementLocalization( const SurgSim::DataStructures::IndexedLocalCoordinate& location); /// Mapping from collision triangle's id to fem element id. std::unordered_map m_triangleIdToElementIdMap; /// The Fem3DRepresentation's asset as a Fem3D std::shared_ptr m_fem; }; } // namespace Physics } // namespace SurgSim #endif // SURGSIM_PHYSICS_FEM3DREPRESENTATION_H opensurgsim-0.7.0/SurgSim/Physics/FemConstraintFixedPoint.cpp000066400000000000000000000101611277777236100244000ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Physics/FemConstraintFixedPoint.h" #include "SurgSim/Physics/FemElement.h" #include "SurgSim/Physics/FemLocalization.h" #include "SurgSim/Physics/FemRepresentation.h" using SurgSim::Math::Vector3d; namespace SurgSim { namespace Physics { FemConstraintFixedPoint::FemConstraintFixedPoint() { } FemConstraintFixedPoint::~FemConstraintFixedPoint() { } void FemConstraintFixedPoint::doBuild(double dt, const ConstraintData& data, const std::shared_ptr& localization, MlcpPhysicsProblem* mlcp, size_t indexOfRepresentation, size_t indexOfConstraint, ConstraintSideSign sign) { std::shared_ptr fem = std::static_pointer_cast(localization->getRepresentation()); const size_t numDofPerNode = fem->getNumDofPerNode(); if (!fem->isActive()) { return; } const double scale = (sign == CONSTRAINT_POSITIVE_SIDE) ? 1.0 : -1.0; const SurgSim::DataStructures::IndexedLocalCoordinate& coord = std::static_pointer_cast(localization)->getLocalPosition(); Vector3d globalPosition = localization->calculatePosition(); // Fixed point constraint in MCLP // p(t) is defined as the point before motion // s is defined as position to be constrained to // u is defined as the displacement needed to enforce the constraint // // The equation is // u + (p(t) - s) = 0 // // Using backward-Euler integration, // u = dt.v(t + dt) // // The constraint (p(t) - s) exists in 3-space, but we must modify the velocity of coordinates in (n * 3) space. The // transform from (n * 3) velocity space -> 3 translational space is denoted by H, which we construct here. // // The constructing principal of FEM is that nodes must be placed close enough such that the value of a function // within an FEM can be linearly interpolated by the values at the nodes of the FEM. The interpolation weights are // given by barycentric coordinates which linearly transform the nodes from (n * 3) -> 3 space (and vice versa): // sum(n_i * b_i) = n_1 * b_1 + n_2 * b_i ... n_n * b_n // where v_i are in 3 space. // // So the transform from node-velocity to constraint space is // dt * sum(v_i * b_i) // // See RigidRepresentationFixedPoint for more implementation details. // Update b with new violation: P(free motion) mlcp->b.segment<3>(indexOfConstraint) += globalPosition * scale; // m_newH is a SparseVector, so resizing is cheap. The object's memory also gets cleared. m_newH.resize(fem->getNumDof()); // m_newH is a member variable, so 'reserve' only needs to allocate memory on the first run. size_t numNodeToConstrain = (coord.coordinate.array() != 0.0).count(); m_newH.reserve(3 * numNodeToConstrain); std::shared_ptr femElement = fem->getFemElement(coord.index); size_t numNodes = femElement->getNumNodes(); for (size_t axis = 0; axis < 3; axis++) { m_newH.setZero(); for (size_t index = 0; index < numNodes; index++) { if (coord.coordinate[index] != 0.0) { size_t nodeIndex = femElement->getNodeId(index); m_newH.insert(numDofPerNode * nodeIndex + axis) = coord.coordinate[index] * (dt * scale); } } mlcp->updateConstraint(m_newH, fem->getComplianceMatrix() * m_newH.transpose(), indexOfRepresentation, indexOfConstraint + axis); } } SurgSim::Physics::ConstraintType FemConstraintFixedPoint::getConstraintType() const { return SurgSim::Physics::FIXED_3DPOINT; } size_t FemConstraintFixedPoint::doGetNumDof() const { return 3; } }; // namespace Physics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/FemConstraintFixedPoint.h000066400000000000000000000030331277777236100240450ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_FEMCONSTRAINTFIXEDPOINT_H #define SURGSIM_PHYSICS_FEMCONSTRAINTFIXEDPOINT_H #include "SurgSim/Physics/ConstraintImplementation.h" namespace SurgSim { namespace Physics { /// Base class for all FemRepresentation fixed point constraint implementation. class FemConstraintFixedPoint : public ConstraintImplementation { public: /// Constructor FemConstraintFixedPoint(); /// Destructor virtual ~FemConstraintFixedPoint(); SurgSim::Physics::ConstraintType getConstraintType() const override; private: size_t doGetNumDof() const override; void doBuild(double dt, const ConstraintData& data, const std::shared_ptr& localization, MlcpPhysicsProblem* mlcp, size_t indexOfRepresentation, size_t indexOfConstraint, ConstraintSideSign sign) override; }; }; // namespace Physics }; // namespace SurgSim #endif // SURGSIM_PHYSICS_FEMCONSTRAINTFIXEDPOINT_H opensurgsim-0.7.0/SurgSim/Physics/FemConstraintFixedRotationVector.cpp000066400000000000000000000112211277777236100262670ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Physics/FemConstraintFixedRotationVector.h" #include "SurgSim/Physics/FemElement.h" #include "SurgSim/Physics/FemLocalization.h" #include "SurgSim/Physics/FemRepresentation.h" using SurgSim::Math::Vector3d; namespace SurgSim { namespace Physics { FemConstraintFixedRotationVector::FemConstraintFixedRotationVector() { } FemConstraintFixedRotationVector::~FemConstraintFixedRotationVector() { } void FemConstraintFixedRotationVector::doBuild(double dt, const ConstraintData& data, const std::shared_ptr& localization, MlcpPhysicsProblem* mlcp, size_t indexOfRepresentation, size_t indexOfConstraint, ConstraintSideSign sign) { std::shared_ptr fem = std::static_pointer_cast(localization->getRepresentation()); const size_t numDofPerNode = fem->getNumDofPerNode(); SURGSIM_ASSERT(numDofPerNode >= 6) << "The rotation vector constraint needs rotational dof (6DOF/node minimum)" << " but " << fem->getFullName() << " only has " << numDofPerNode << " DOF"; if (!fem->isActive()) { return; } const double scale = (sign == CONSTRAINT_POSITIVE_SIDE) ? 1.0 : -1.0; const SurgSim::DataStructures::IndexedLocalCoordinate& coord = std::static_pointer_cast(localization)->getLocalPosition(); auto nodeIds = fem->getFemElement(coord.index)->getNodeIds(); Vector3d currentRotationVector = Vector3d::Zero(); for (size_t i = 0; i < nodeIds.size(); i++) { currentRotationVector += fem->getCurrentState()->getPositions().segment<3>(6 * nodeIds[i] + 3) * coord.coordinate[i]; } // Fixed rotation vector constraint in MCLP // p(t) is defined as the rotation vector before motion // s is defined as the rotation vector to be constrained to // u is defined as the displacement needed to enforce the constraint // // The equation is // u + (p(t) - s) = 0 // // Using backward-Euler integration, // u = dt.v(t + dt) // // The constraint (p(t) - s) exists in 3-space, but we must modify the velocity of coordinates in (n * 3) space. The // transform from (n * 3) velocity space -> 3 translational space is denoted by H, which we construct here. // // The constructing principal of FEM is that nodes must be placed close enough such that the value of a function // within an FEM can be linearly interpolated by the values at the nodes of the FEM. The interpolation weights are // given by barycentric coordinates which linearly transform the nodes from (n * 3) -> 3 space (and vice versa): // sum(n_i * b_i) = n_1 * b_1 + n_2 * b_i ... n_n * b_n // where v_i are in 3 space. // // So the transform from node-velocity to constraint space is // dt * sum(v_i * b_i) // // See RigidRepresentationFixedPoint for more implementation details. // Update b with new violation: P(free motion) mlcp->b.segment<3>(indexOfConstraint) += currentRotationVector * scale; // m_newH is a SparseVector, so resizing is cheap. The object's memory also gets cleared. m_newH.resize(fem->getNumDof()); // m_newH is a member variable, so 'reserve' only needs to allocate memory on the first run. size_t numNodeToConstrain = (coord.coordinate.array() != 0.0).count(); m_newH.reserve(3 * numNodeToConstrain); std::shared_ptr femElement = fem->getFemElement(coord.index); size_t numNodes = femElement->getNumNodes(); for (size_t axis = 0; axis < 3; axis++) { m_newH.setZero(); for (size_t index = 0; index < numNodes; index++) { if (coord.coordinate[index] != 0.0) { size_t nodeIndex = femElement->getNodeId(index); m_newH.insert(numDofPerNode * nodeIndex + axis + 3) = coord.coordinate[index] * (dt * scale); } } mlcp->updateConstraint(m_newH, fem->getComplianceMatrix() * m_newH.transpose(), indexOfRepresentation, indexOfConstraint + axis); } } SurgSim::Physics::ConstraintType FemConstraintFixedRotationVector::getConstraintType() const { return SurgSim::Physics::FIXED_3DROTATION_VECTOR; } size_t FemConstraintFixedRotationVector::doGetNumDof() const { return 3; } }; // namespace Physics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/FemConstraintFixedRotationVector.h000066400000000000000000000040301277777236100257340ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_FEMCONSTRAINTFIXEDROTATIONVECTOR_H #define SURGSIM_PHYSICS_FEMCONSTRAINTFIXEDROTATIONVECTOR_H #include "SurgSim/Physics/ConstraintImplementation.h" namespace SurgSim { namespace Physics { /// Base class for all FemRepresentation fixed rotation vector constraint implementation. class FemConstraintFixedRotationVector : public ConstraintImplementation { public: /// Constructor FemConstraintFixedRotationVector(); /// Destructor virtual ~FemConstraintFixedRotationVector(); SurgSim::Physics::ConstraintType getConstraintType() const override; private: size_t doGetNumDof() const override; /// \note The constraint violation being calculated based on a quaternion interpolation (slerp), and this /// type of interpolation being highly non-linear, the classical way of using the implementation one after the /// other one won't work. /// Therefore, the RotationVectorConstraint will use the vector mlcp->b to retrieve both representation's /// rotation vector, then calculate the proper slerp and set the violation back in mlcp->b void doBuild(double dt, const ConstraintData& data, const std::shared_ptr& localization, MlcpPhysicsProblem* mlcp, size_t indexOfRepresentation, size_t indexOfConstraint, ConstraintSideSign sign) override; }; }; // namespace Physics }; // namespace SurgSim #endif // SURGSIM_PHYSICS_FEMCONSTRAINTFIXEDROTATIONVECTOR_H opensurgsim-0.7.0/SurgSim/Physics/FemConstraintFrictionalSliding.cpp000066400000000000000000000065231277777236100257420ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Physics/FemConstraintFrictionalSliding.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/SlidingConstraintData.h" #include "SurgSim/Physics/FemElement.h" #include "SurgSim/Physics/FemLocalization.h" #include "SurgSim/Physics/FemRepresentation.h" using SurgSim::Math::Vector3d; namespace SurgSim { namespace Physics { FemConstraintFrictionalSliding::FemConstraintFrictionalSliding() { } FemConstraintFrictionalSliding::~FemConstraintFrictionalSliding() { } void FemConstraintFrictionalSliding::doBuild(double dt, const ConstraintData& data, const std::shared_ptr& localization, MlcpPhysicsProblem* mlcp, size_t indexOfRepresentation, size_t indexOfConstraint, ConstraintSideSign sign) { auto fem = std::static_pointer_cast(localization->getRepresentation()); if (!fem->isActive()) { return; } const size_t numDofPerNode = fem->getNumDofPerNode(); const double scale = (sign == CONSTRAINT_POSITIVE_SIDE) ? 1.0 : -1.0; const SlidingConstraintData& constraintData = static_cast(data); std::array directions; directions[0] = constraintData.getNormals()[0]; directions[1] = constraintData.getNormals()[1]; directions[2] = constraintData.getTangent(); const DataStructures::IndexedLocalCoordinate& coord = std::static_pointer_cast(localization)->getLocalPosition(); Vector3d globalPosition = localization->calculatePosition(); m_newH.resize(fem->getNumDof()); auto femElement = fem->getFemElement(coord.index); auto numNodes = fem->getFemElement(coord.index)->getNumNodes(); m_newH.reserve(numNodes * 3); for (size_t i = 0; i < 3; ++i) { // Update b with new violation double violation = directions[i].dot(globalPosition); mlcp->b[indexOfConstraint + i] += violation * scale; // Fill the new H. m_newH.setZero(); for (size_t j = 0; j < numNodes; ++j) { auto nodeId = femElement->getNodeId(j); m_newH.insert(numDofPerNode * nodeId + 0) = coord.coordinate[j] * directions[i][0] * scale * dt; m_newH.insert(numDofPerNode * nodeId + 1) = coord.coordinate[j] * directions[i][1] * scale * dt; m_newH.insert(numDofPerNode * nodeId + 2) = coord.coordinate[j] * directions[i][2] * scale * dt; } mlcp->updateConstraint(m_newH, fem->getComplianceMatrix() * m_newH.transpose(), indexOfRepresentation, indexOfConstraint + i); } mlcp->mu[indexOfConstraint] = constraintData.getFrictionCoefficient(); } SurgSim::Physics::ConstraintType FemConstraintFrictionalSliding::getConstraintType() const { return SurgSim::Physics::FRICTIONAL_SLIDING; } size_t FemConstraintFrictionalSliding::doGetNumDof() const { return 3; } }; // namespace Physics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/FemConstraintFrictionalSliding.h000066400000000000000000000031131277777236100253770ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_FEMCONSTRAINTFRICTIONALSLIDING_H #define SURGSIM_PHYSICS_FEMCONSTRAINTFRICTIONALSLIDING_H #include "SurgSim/Physics/ConstraintImplementation.h" namespace SurgSim { namespace Physics { /// Base class for all FemRepresentation frictional sliding constraint implementation. class FemConstraintFrictionalSliding: public ConstraintImplementation { public: /// Constructor FemConstraintFrictionalSliding(); /// Destructor virtual ~FemConstraintFrictionalSliding(); SurgSim::Physics::ConstraintType getConstraintType() const override; private: size_t doGetNumDof() const override; void doBuild(double dt, const ConstraintData& data, const std::shared_ptr& localization, MlcpPhysicsProblem* mlcp, size_t indexOfRepresentation, size_t indexOfConstraint, ConstraintSideSign sign) override; }; }; // namespace Physics }; // namespace SurgSim #endif // SURGSIM_PHYSICS_FEMCONSTRAINTFRICTIONALSLIDING_H opensurgsim-0.7.0/SurgSim/Physics/FemConstraintFrictionlessContact.cpp000066400000000000000000000076161277777236100263220ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Physics/FemConstraintFrictionlessContact.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Math/SegmentMeshShape.h" #include "SurgSim/Physics/ContactConstraintData.h" #include "SurgSim/Physics/FemElement.h" #include "SurgSim/Physics/FemLocalization.h" #include "SurgSim/Physics/FemRepresentation.h" using SurgSim::Math::Vector3d; namespace SurgSim { namespace Physics { FemConstraintFrictionlessContact::FemConstraintFrictionlessContact(): m_mlcpNumericalPrecision(1.0e-04) { } FemConstraintFrictionlessContact::~FemConstraintFrictionlessContact() { } void FemConstraintFrictionlessContact::doBuild(double dt, const ConstraintData& data, const std::shared_ptr& localization, MlcpPhysicsProblem* mlcp, size_t indexOfRepresentation, size_t indexOfConstraint, ConstraintSideSign sign) { std::shared_ptr fem = std::static_pointer_cast(localization->getRepresentation()); const size_t numDofPerNode = fem->getNumDofPerNode(); if (!fem->isActive()) { return; } const double scale = (sign == CONSTRAINT_POSITIVE_SIDE) ? 1.0 : -1.0; const SurgSim::Math::Vector3d& n = static_cast(data).getNormal(); const SurgSim::DataStructures::IndexedLocalCoordinate& coord = std::static_pointer_cast(localization)->getLocalPosition(); Vector3d globalPosition = localization->calculatePosition(); double radius = 0.0; { auto rep = std::dynamic_pointer_cast(fem->getCollisionRepresentation()); if (rep != nullptr) { auto segmentShape = std::dynamic_pointer_cast(rep->getShape()); if (segmentShape != nullptr) { radius = segmentShape->getRadius(); } } } // Update b with new violation double violation = n.dot(globalPosition); mlcp->b[indexOfConstraint] += violation * scale - radius - m_mlcpNumericalPrecision; // m_newH is a SparseVector, so resizing is cheap. The object's memory also gets cleared. m_newH.resize(fem->getNumDof()); // m_newH is a member variable, so 'reserve' only needs to allocate memory on the first run. std::shared_ptr femElement = fem->getFemElement(coord.index); size_t numNodes = femElement->getNumNodes(); size_t numNodeToConstrain = 0; for (size_t index = 0; index < numNodes; index++) { if (coord.coordinate[index] != 0.0) { numNodeToConstrain++; } } m_newH.reserve(3 * numNodeToConstrain); for (size_t index = 0; index < numNodes; index++) { if (coord.coordinate[index] != 0.0) { size_t nodeIndex = femElement->getNodeId(index); m_newH.insert(numDofPerNode * nodeIndex + 0) = coord.coordinate[index] * n[0] * scale * dt; m_newH.insert(numDofPerNode * nodeIndex + 1) = coord.coordinate[index] * n[1] * scale * dt; m_newH.insert(numDofPerNode * nodeIndex + 2) = coord.coordinate[index] * n[2] * scale * dt; } } mlcp->updateConstraint(m_newH, fem->getComplianceMatrix() * m_newH.transpose(), indexOfRepresentation, indexOfConstraint); } SurgSim::Physics::ConstraintType FemConstraintFrictionlessContact::getConstraintType() const { return SurgSim::Physics::FRICTIONLESS_3DCONTACT; } size_t FemConstraintFrictionlessContact::doGetNumDof() const { return 1; } }; // namespace Physics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/FemConstraintFrictionlessContact.h000066400000000000000000000036031277777236100257570ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_FEMCONSTRAINTFRICTIONLESSCONTACT_H #define SURGSIM_PHYSICS_FEMCONSTRAINTFRICTIONLESSCONTACT_H #include "SurgSim/Physics/ConstraintImplementation.h" namespace SurgSim { namespace Physics { /// Base class for all FemRepresentation frictionless contact constraint implementation. class FemConstraintFrictionlessContact: public ConstraintImplementation { public: /// Constructor FemConstraintFrictionlessContact(); /// Destructor virtual ~FemConstraintFrictionlessContact(); SurgSim::Physics::ConstraintType getConstraintType() const override; private: size_t doGetNumDof() const override; void doBuild(double dt, const ConstraintData& data, const std::shared_ptr& localization, MlcpPhysicsProblem* mlcp, size_t indexOfRepresentation, size_t indexOfConstraint, ConstraintSideSign sign) override; /// \note accounts for the mlcp precision, so that the contact point /// is not floating around the solution plane (with a precision of +-e due to the /// mlcp, but floating above this plane, so the contact is actually verified at the end) double m_mlcpNumericalPrecision; }; }; // namespace Physics }; // namespace SurgSim #endif // SURGSIM_PHYSICS_FEMCONSTRAINTFRICTIONLESSCONTACT_H opensurgsim-0.7.0/SurgSim/Physics/FemConstraintFrictionlessSliding.cpp000066400000000000000000000062071277777236100263130ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Physics/FemConstraintFrictionlessSliding.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/SlidingConstraintData.h" #include "SurgSim/Physics/FemElement.h" #include "SurgSim/Physics/FemLocalization.h" #include "SurgSim/Physics/FemRepresentation.h" using SurgSim::Math::Vector3d; namespace SurgSim { namespace Physics { FemConstraintFrictionlessSliding::FemConstraintFrictionlessSliding() { } FemConstraintFrictionlessSliding::~FemConstraintFrictionlessSliding() { } void FemConstraintFrictionlessSliding::doBuild(double dt, const ConstraintData& data, const std::shared_ptr& localization, MlcpPhysicsProblem* mlcp, size_t indexOfRepresentation, size_t indexOfConstraint, ConstraintSideSign sign) { auto fem = std::static_pointer_cast(localization->getRepresentation()); if (!fem->isActive()) { return; } const size_t numDofPerNode = fem->getNumDofPerNode(); const double scale = (sign == CONSTRAINT_POSITIVE_SIDE) ? 1.0 : -1.0; const SlidingConstraintData& constraintData = static_cast(data); const auto normals = constraintData.getNormals(); const DataStructures::IndexedLocalCoordinate& coord = std::static_pointer_cast(localization)->getLocalPosition(); Vector3d globalPosition = localization->calculatePosition(); m_newH.resize(fem->getNumDof()); auto femElement = fem->getFemElement(coord.index); auto numNodes = fem->getFemElement(coord.index)->getNumNodes(); m_newH.reserve(numNodes * 3); for (size_t i = 0; i < 2; ++i) { // Update b with new violation double violation = normals[i].dot(globalPosition); mlcp->b[indexOfConstraint + i] += violation * scale; // Fill the new H. m_newH.setZero(); for (size_t j = 0; j < numNodes; ++j) { auto nodeId = femElement->getNodeId(j); m_newH.insert(numDofPerNode * nodeId + 0) = coord.coordinate[j] * normals[i][0] * scale * dt; m_newH.insert(numDofPerNode * nodeId + 1) = coord.coordinate[j] * normals[i][1] * scale * dt; m_newH.insert(numDofPerNode * nodeId + 2) = coord.coordinate[j] * normals[i][2] * scale * dt; } mlcp->updateConstraint(m_newH, fem->getComplianceMatrix() * m_newH.transpose(), indexOfRepresentation, indexOfConstraint + i); } } SurgSim::Physics::ConstraintType FemConstraintFrictionlessSliding::getConstraintType() const { return SurgSim::Physics::FRICTIONLESS_SLIDING; } size_t FemConstraintFrictionlessSliding::doGetNumDof() const { return 2; } }; // namespace Physics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/FemConstraintFrictionlessSliding.h000066400000000000000000000031311277777236100257510ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_FEMCONSTRAINTFRICTIONLESSSLIDING_H #define SURGSIM_PHYSICS_FEMCONSTRAINTFRICTIONLESSSLIDING_H #include "SurgSim/Physics/ConstraintImplementation.h" namespace SurgSim { namespace Physics { /// Base class for all FemRepresentation frictionless sliding constraint implementation. class FemConstraintFrictionlessSliding: public ConstraintImplementation { public: /// Constructor FemConstraintFrictionlessSliding(); /// Destructor virtual ~FemConstraintFrictionlessSliding(); SurgSim::Physics::ConstraintType getConstraintType() const override; private: size_t doGetNumDof() const override; void doBuild(double dt, const ConstraintData& data, const std::shared_ptr& localization, MlcpPhysicsProblem* mlcp, size_t indexOfRepresentation, size_t indexOfConstraint, ConstraintSideSign sign) override; }; }; // namespace Physics }; // namespace SurgSim #endif // SURGSIM_PHYSICS_FEMCONSTRAINTFRICTIONLESSSLIDING_H opensurgsim-0.7.0/SurgSim/Physics/FemElement-inl.h000066400000000000000000000033521277777236100221040ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_FEMELEMENT_INL_H #define SURGSIM_PHYSICS_FEMELEMENT_INL_H #include #include "SurgSim/Math/Matrix.h" #include "SurgSim/Math/SparseMatrix.h" namespace SurgSim { namespace Physics { template void FemElement::assembleMatrixBlocks(const DerivedSub& subMatrix, const std::vector blockIds, size_t blockSize, Eigen::SparseMatrix* matrix, bool initialize) const { using SurgSim::Math::addSubMatrix; const Index numBlocks = static_cast(blockIds.size()); for (Index block0 = 0; block0 < numBlocks; block0++) { Index subRow = static_cast(blockSize * block0); for (Index block1 = 0; block1 < numBlocks; block1++) { Index subCol = static_cast(blockSize * block1); addSubMatrix(subMatrix.block(subRow, subCol, blockSize, blockSize), static_cast(blockIds[block0]), static_cast(blockIds[block1]), matrix, initialize); } } } } // namespace Physics } // namespace SurgSim #endif // SURGSIM_PHYSICS_FEMELEMENT_INL_H opensurgsim-0.7.0/SurgSim/Physics/FemElement.cpp000066400000000000000000000126241277777236100216610ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Framework/Assert.h" #include "SurgSim/Math/Geometry.h" #include "SurgSim/Math/OdeState.h" #include "SurgSim/Physics/FemElement.h" namespace SurgSim { namespace Physics { FemElement::FemElement() : m_numDofPerNode(0), m_rho(0.0), m_E(0.0), m_nu(0.0), m_useDamping(false), m_initializedFMDK(false) {} FemElement::~FemElement() {} void FemElement::initialize(const SurgSim::Math::OdeState& state) { initializeFMDK(); SURGSIM_ASSERT(m_rho != 0.0) << "Mass density is not set. Did you call setMassDensity() ?"; SURGSIM_ASSERT(m_nu != 0.0) << "Poisson ratio is not set. Did you call setPoissonRatio() ?"; SURGSIM_ASSERT(m_E != 0.0) << "Young modulus is not set. Did you call setYoungModulus() ?"; SURGSIM_ASSERT(m_rho > 0.0) << "Mass density ("< 0.0 && m_nu < 0.5) << "Poisson ratio ("< 0.0) << "Young modulus ("<& FemElement::getNodeIds() const { return m_nodeIds; } void FemElement::setYoungModulus(double E) { m_E = E; } double FemElement::getYoungModulus() const { return m_E; } void FemElement::setPoissonRatio(double nu) { m_nu = nu; } double FemElement::getPoissonRatio() const { return m_nu; } void FemElement::setMassDensity(double rho) { m_rho = rho; } double FemElement::getMassDensity() const { return m_rho; } double FemElement::getMass(const SurgSim::Math::OdeState& state) const { return getVolume(state) * m_rho; } void FemElement::addForce(SurgSim::Math::Vector* F, double scale) const { Math::addSubVector(m_f * scale, m_nodeIds, m_numDofPerNode, F); } void FemElement::addMass(SurgSim::Math::SparseMatrix* M, double scale) const { assembleMatrixBlocks(m_M * scale, m_nodeIds, static_cast(m_numDofPerNode), M, false); } void FemElement::addDamping(SurgSim::Math::SparseMatrix* D, double scale) const { if (m_useDamping) { assembleMatrixBlocks(m_D * scale, m_nodeIds, static_cast(m_numDofPerNode), D, false); } } void FemElement::addStiffness(SurgSim::Math::SparseMatrix* K, double scale) const { assembleMatrixBlocks(m_K * scale, m_nodeIds, static_cast(m_numDofPerNode), K, false); } void FemElement::addFMDK(SurgSim::Math::Vector* F, SurgSim::Math::SparseMatrix* M, SurgSim::Math::SparseMatrix* D, SurgSim::Math::SparseMatrix* K) const { addForce(F); addMass(M); addDamping(D); addStiffness(K); } void FemElement::addMatVec(double alphaM, double alphaD, double alphaK, const SurgSim::Math::Vector& x, SurgSim::Math::Vector* F) const { using Math::addSubVector; using Math::getSubVector; if (alphaM == 0.0 && (!m_useDamping || alphaD == 0.0) && alphaK == 0.0) { return; } size_t size = getNumNodes() * getNumDofPerNode(); Math::Vector extractedX(size); getSubVector(x, m_nodeIds, getNumDofPerNode(), &extractedX); // Accumulate the mass/damping/stiffness contribution Math::Vector extractedResult; extractedResult.setZero(size); // Adds the mass contribution if (alphaM != 0.0) { extractedResult += alphaM * (m_M * extractedX); } // Adds the damping contribution if (m_useDamping && alphaD != 0.0) { extractedResult += alphaD * (m_D * extractedX); } // Adds the stiffness contribution if (alphaK != 0.0) { extractedResult += alphaK * (m_K * extractedX); } addSubVector(extractedResult, m_nodeIds, m_numDofPerNode, F); } bool FemElement::isValidCoordinate(const SurgSim::Math::Vector& naturalCoordinate) const { return (std::abs(naturalCoordinate.sum() - 1.0) < SurgSim::Math::Geometry::ScalarEpsilon) && (naturalCoordinate.size() >= 0) && (static_cast(naturalCoordinate.size()) == getNumNodes()) && (-SurgSim::Math::Geometry::ScalarEpsilon <= naturalCoordinate.minCoeff() && naturalCoordinate.maxCoeff() <= 1.0 + SurgSim::Math::Geometry::ScalarEpsilon); } void FemElement::updateFMDK(const Math::OdeState& state, int options) { doUpdateFMDK(state, options); } void FemElement::initializeFMDK() { if (!m_initializedFMDK) { m_initializedFMDK = true; doInitializeFMDK(); } } void FemElement::doInitializeFMDK() { size_t size = getNumNodes() * getNumDofPerNode(); m_f.setZero(size); m_M.setZero(size, size); if (m_useDamping) { m_D.setZero(size, size); } m_K.setZero(size, size); } } // namespace Physics } // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/FemElement.h000066400000000000000000000273731277777236100213350ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_FEMELEMENT_H #define SURGSIM_PHYSICS_FEMELEMENT_H #include #include "SurgSim/Framework/ObjectFactory.h" #include "SurgSim/Math/Matrix.h" #include "SurgSim/Math/SparseMatrix.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/Fem.h" namespace SurgSim { namespace Math { class OdeState; }; namespace Physics { /// Base class for all Fem Element (1D, 2D, 3D) /// It handles the node ids to which it is connected and requires all derived classes to compute the element /// mass matrix and the force vector along with the derivatives (the stiffness and damping matrices). /// A extra method also exist to compute all of them at once for performance purposes. /// It holds on to the actual computed values (m_f, m_M, m_D, m_K) as its size is not predefined from outside /// and would requires intensive (de)allocation or a temporary variable anyway. /// It contains the linear elasticity parameter (Young modulus and Poisson ratio) as well as mass density class FemElement { public: /// Constructor FemElement(); /// Virtual destructor virtual ~FemElement(); /// Initialize the FemElement once everything has been set /// \param state The state to initialize the FemElement with virtual void initialize(const SurgSim::Math::OdeState& state); typedef SurgSim::Framework::ObjectFactory1> FactoryType; static FactoryType& getFactory(); /// Gets the number of degree of freedom per node /// \return The number of dof per node size_t getNumDofPerNode() const; /// Gets the number of nodes connected by this element /// \return The number of nodes size_t getNumNodes() const; /// Gets the elementNodeId-th node id /// \return The requested node id size_t getNodeId(size_t elementNodeId) const; /// Gets the node ids for this element /// \return A vector containing the node ids on which the element is defined const std::vector& getNodeIds() const; /// Sets the Young modulus (in N.m-2) /// \param E The Young modulus void setYoungModulus(double E); /// Gets the Young modulus (in N.m-2) /// \return The Young modulus double getYoungModulus() const; /// Sets the Poisson ratio (unitless) /// \param nu The Poisson ratio void setPoissonRatio(double nu); /// Gets the Poisson ratio (unitless) /// \return The Poisson ratio double getPoissonRatio() const; /// Sets the mass density (in Kg.m-3) /// \param rho The mass density void setMassDensity(double rho); /// Gets the mass density (in Kg.m-3) /// \return The mass density double getMassDensity() const; /// Gets the element mass based on the input state (in Kg) /// \param state The state to compute the mass with /// \return The mass of this element (in Kg) double getMass(const SurgSim::Math::OdeState& state) const; /// Gets the element volume based on the input state (in m-3) /// \param state The state to compute the volume with /// \return The volume of this element (in m-3) virtual double getVolume(const SurgSim::Math::OdeState& state) const = 0; /// Adds the element force (computed for a given state) to a complete system force vector F (assembly) /// \param[in,out] F The complete system force vector to add the element force into /// \param scale A factor to scale the added force with /// \note The element force is of size (getNumDofPerNode() x getNumNodes()) /// \note This method supposes that the incoming state contains information with the same number of dof /// \note per node as getNumDofPerNode() virtual void addForce(SurgSim::Math::Vector* F, double scale = 1.0) const; /// Adds the element mass matrix M (computed for a given state) to a complete system mass matrix M (assembly) /// \param[in,out] M The complete system mass matrix to add the element mass-matrix into /// \param scale A factor to scale the added mass matrix with /// \note The element mass matrix is square of size getNumDofPerNode() x getNumNodes() /// \note This method supposes that the incoming state contains information with the same number of /// \note dof per node as getNumDofPerNode() virtual void addMass(SurgSim::Math::SparseMatrix* M, double scale = 1.0) const; /// Adds the element damping matrix D (= -df/dv) (comuted for a given state) /// to a complete system damping matrix D (assembly) /// \param[in,out] D The complete system damping matrix to add the element damping matrix into /// \param scale A factor to scale the added damping matrix with /// \note The element damping matrix is square of size getNumDofPerNode() x getNumNodes() /// \note This method supposes that the incoming state contains information with the same number of /// \note dof per node as getNumDofPerNode() virtual void addDamping(SurgSim::Math::SparseMatrix* D, double scale = 1.0) const; /// Adds the element stiffness matrix K (= -df/dx) (computed for a given state) /// to a complete system stiffness matrix K (assembly) /// \param[in,out] K The complete system stiffness matrix to add the element stiffness matrix into /// \param scale A factor to scale the added stiffness matrix with /// \note The element stiffness matrix is square of size getNumDofPerNode() x getNumNodes() /// \note This method supposes that the incoming state contains information with the same number of /// \note dof per node as getNumDofPerNode() virtual void addStiffness(SurgSim::Math::SparseMatrix* K, double scale = 1.0) const; /// Adds the element force vector, mass, stiffness and damping matrices (computed for a given state) /// into a complete system data structure F, M, D, K (assembly) /// \param[in,out] F The complete system force vector to add the element force into /// \param[in,out] M The complete system mass matrix to add the element mass matrix into /// \param[in,out] D The complete system damping matrix to add the element damping matrix into /// \param[in,out] K The complete system stiffness matrix to add the element stiffness matrix into /// \note This method supposes that the incoming state contains information with the same number of dof /// \note per node as getNumDofPerNode() virtual void addFMDK(SurgSim::Math::Vector* F, SurgSim::Math::SparseMatrix* M, SurgSim::Math::SparseMatrix* D, SurgSim::Math::SparseMatrix* K) const; /// Adds the element matrix-vector contribution F += (alphaM.M + alphaD.D + alphaK.K).x (computed for a given state) /// into a complete system data structure F (assembly) /// \param alphaM The scaling factor for the mass contribution /// \param alphaD The scaling factor for the damping contribution /// \param alphaK The scaling factor for the stiffness contribution /// \param x A complete system vector to be used as the vector in the matrix-vector multiplication /// \param[in,out] F The complete system force vector to add the element matrix-vector contribution into /// \note This method supposes that the incoming state contains information with the same number of dof /// \note per node as getNumDofPerNode() virtual void addMatVec(double alphaM, double alphaD, double alphaK, const SurgSim::Math::Vector& x, SurgSim::Math::Vector* F) const; /// Determines whether a given natural coordinate is valid /// \param naturalCoordinate Coordinate to check /// \return True if valid bool isValidCoordinate(const SurgSim::Math::Vector& naturalCoordinate) const; /// Computes a given natural coordinate in cartesian coordinates /// \param state The state at which to transform coordinates /// \param naturalCoordinate The coordinates to transform /// \return The resultant cartesian coordinates virtual SurgSim::Math::Vector computeCartesianCoordinate( const SurgSim::Math::OdeState& state, const SurgSim::Math::Vector& naturalCoordinate) const = 0; /// Computes a natural coordinate given a global coordinate /// \param state The state at which to transform coordinates /// \param cartesianCoordinate The coordinates to transform /// \return The resultant natural coordinates virtual SurgSim::Math::Vector computeNaturalCoordinate( const SurgSim::Math::OdeState& state, const SurgSim::Math::Vector& cartesianCoordinate) const = 0; /// Helper method to add a sub-matrix made of squared-blocks into a matrix, for the sake of clarity /// \tparam DerivedSub The type of the 'subMatrix' (can usually be inferred). Can be any type, but does not /// support Eigen expression. If it is a Sparse storage type the alignment must be the same /// as the SparseMatrix: Opt. /// Note that no assertion or verification is done on this type. /// \tparam T, Opt, Index Types and option defining the output matrix type SparseMatrix /// \param subMatrix The sub-matrix (containing all the squared-blocks) /// \param blockIds Vector of block indices (for accessing matrix) corresponding to the blocks in sub-matrix /// \param blockSize The blocks size /// \param[out] matrix The matrix to add the sub-matrix blocks into /// \param initialize Optional parameter, default true. If true, the matrix form is assumed to be undefined and is /// initialized when necessary. If false, the matrix form is assumed to be previously defined. template void assembleMatrixBlocks(const DerivedSub& subMatrix, const std::vector blockIds, size_t blockSize, Eigen::SparseMatrix* matrix, bool initialize = true) const; /// Update the FemElement based on the given state. /// \param state \f$(x, v)\f$ the current position and velocity to evaluate the various terms with /// \param options Flag to specify which of the F, M, D, K needs to be updated void updateFMDK(const Math::OdeState& state, int options); protected: /// Sets the number of degrees of freedom per node /// \param numDofPerNode The number of dof per node /// \note Protected to be accessible only to derived classes which should be the only /// \note ones able to set this parameter void setNumDofPerNode(size_t numDofPerNode); /// Update the FemElement based on the given state. /// \param state \f$(x, v)\f$ the current position and velocity to evaluate the various terms with /// \param options Flag to specify which of the F, M, D, K needs to be updated virtual void doUpdateFMDK(const Math::OdeState& state, int options) = 0; /// Initialize f, M, D, K variables. void initializeFMDK(); /// Function to be overridden by the derived classes to initialize the f, M, D, K variables. virtual void doInitializeFMDK(); /// Number of degree of freedom per node for this element size_t m_numDofPerNode; /// Node ids connected by this element std::vector m_nodeIds; /// Mass density (in Kg.m-3) double m_rho; /// Young modulus (in N.m-2) double m_E; /// Poisson ratio (unitless) double m_nu; /// The force vector. SurgSim::Math::Vector m_f; /// The mass matrix. SurgSim::Math::Matrix m_M; /// The damping matrix. SurgSim::Math::Matrix m_D; /// Flag to specify of the damping is used. bool m_useDamping; /// The stiffness matrix. SurgSim::Math::Matrix m_K; private: /// Flag to check in the f, M, D, K variables have been initialized. bool m_initializedFMDK; }; } // namespace Physics } // namespace SurgSim #include "SurgSim/Physics/FemElement-inl.h" #endif // SURGSIM_PHYSICS_FEMELEMENT_H opensurgsim-0.7.0/SurgSim/Physics/FemElementStructs.h000066400000000000000000000046751277777236100227250ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_FEMELEMENTSTRUCTS_H #define SURGSIM_PHYSICS_FEMELEMENTSTRUCTS_H namespace SurgSim { namespace Physics { namespace FemElementStructs { /// RotationVectorData is a structure containing the rotational dof per vertex /// The nature of the rotation depends on the underlying Representation, /// but right now all OSS's representations use rotation vector for rotational dof. struct RotationVectorData { RotationVectorData() : thetaX(0.0), thetaY(0.0), thetaZ(0.0) { } bool operator==(const RotationVectorData& rhs) const { return (thetaX == rhs.thetaX && thetaY == rhs.thetaY && thetaZ == rhs.thetaZ); } double thetaX; double thetaY; double thetaZ; }; /// FemElementParameter is a structure containing the parameters of an fem element following /// the Hooke's law of deformation (linear deformation). struct FemElementParameter { FemElementParameter() : youngModulus(0.0), poissonRatio(0.0), massDensity(0.0) { } virtual ~FemElementParameter(){} std::vector nodeIds; double youngModulus; double poissonRatio; double massDensity; }; /// FemElement1DParameter is a FemElementParameter structure specialized for 1D element. struct FemElement1DParameter : public FemElementParameter { FemElement1DParameter() : radius(0.0), enableShear(false) { } double radius; bool enableShear; }; /// FemElement2DParameter is a FemElementParameter structure specialized for 2D element. struct FemElement2DParameter : public FemElementParameter { FemElement2DParameter() : thickness(0.0) { } double thickness; }; /// FemElement3DParameter is a FemElementParameter structure specialized for 3D element. struct FemElement3DParameter : public FemElementParameter {}; } // namespace FemElementStructs } // namespace Physics } // namespace SurgSim #endif // SURGSIM_PHYSICS_FEMELEMENTSTRUCTS_H opensurgsim-0.7.0/SurgSim/Physics/FemLocalization.cpp000066400000000000000000000103611277777236100227140ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Physics/FemLocalization.h" #include "SurgSim/Math/OdeState.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/FemRepresentation.h" #include "SurgSim/Physics/FemElement.h" namespace SurgSim { namespace Physics { FemLocalization::FemLocalization( std::shared_ptr representation, const SurgSim::DataStructures::IndexedLocalCoordinate& localPosition) : Localization() { setRepresentation(representation); setLocalPosition(localPosition); } FemLocalization::~FemLocalization() { } void FemLocalization::setLocalPosition( const SurgSim::DataStructures::IndexedLocalCoordinate& localPosition) { auto femRepresentation = std::static_pointer_cast(getRepresentation()); SURGSIM_ASSERT(femRepresentation != nullptr) << "FemRepresentation is null, it was probably not" << " initialized"; SURGSIM_ASSERT(femRepresentation->isValidCoordinate(localPosition)) << "IndexedLocalCoordinate is invalid for Representation " << getRepresentation()->getName(); m_position = localPosition; } const SurgSim::DataStructures::IndexedLocalCoordinate& FemLocalization::getLocalPosition() const { return m_position; } SurgSim::Math::Vector3d FemLocalization::doCalculatePosition(double time) const { using SurgSim::Math::Vector3d; auto femRepresentation = std::static_pointer_cast(getRepresentation()); SURGSIM_ASSERT(femRepresentation != nullptr) << "FemRepresentation is null, it was probably not" << " initialized"; Vector3d currentPosition; Vector3d previousPosition; std::shared_ptr femElement = femRepresentation->getFemElement(m_position.index); currentPosition = femElement->computeCartesianCoordinate(*femRepresentation->getCurrentState(), m_position.coordinate); previousPosition = femElement->computeCartesianCoordinate(*femRepresentation->getPreviousState(), m_position.coordinate); if (time <= std::numeric_limits::epsilon()) { return previousPosition; } else if (time >= 1.0 - std::numeric_limits::epsilon()) { return currentPosition; } return Math::interpolate(previousPosition, currentPosition, time); } SurgSim::Math::Vector3d FemLocalization::doCalculateVelocity(double time) const { using SurgSim::Math::Vector3d; auto femRepresentation = std::static_pointer_cast(getRepresentation()); SURGSIM_ASSERT(femRepresentation != nullptr) << "FemRepresentation is null, it was probably not" << " initialized"; Vector3d currentVelocity(0.0, 0.0, 0.0); Vector3d previousVelocity(0.0, 0.0, 0.0); const SurgSim::Math::Vector& naturalCoordinate = m_position.coordinate; std::shared_ptr femElement = femRepresentation->getFemElement(m_position.index); SURGSIM_ASSERT(femElement->isValidCoordinate(naturalCoordinate)) << "Invalid naturalCoordinate (" << naturalCoordinate.transpose() << ")"; const Math::Vector& currentVelocities = femRepresentation->getCurrentState()->getVelocities(); const Math::Vector& previousVelocities = femRepresentation->getPreviousState()->getVelocities(); auto& nodeIds = femElement->getNodeIds(); for (int i = 0; i < 2; i++) { currentVelocity += naturalCoordinate(i) * Math::getSubVector(currentVelocities, nodeIds[i], 6).segment<3>(0); previousVelocity += naturalCoordinate(i) * Math::getSubVector(previousVelocities, nodeIds[i], 6).segment<3>(0); } if (time <= std::numeric_limits::epsilon()) { return previousVelocity; } else if (time >= 1.0 - std::numeric_limits::epsilon()) { return currentVelocity; } return Math::interpolate(previousVelocity, currentVelocity, time); } } // namespace Physics } // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/FemLocalization.h000066400000000000000000000050511277777236100223610ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_FEMLOCALIZATION_H #define SURGSIM_PHYSICS_FEMLOCALIZATION_H #include "SurgSim/DataStructures/IndexedLocalCoordinate.h" #include "SurgSim/Physics/Localization.h" namespace SurgSim { namespace Physics { /// Implementation of Localization for Fem3DRepresentation /// /// FemLocalization tracks the global coordinates of an IndexedLocalCoordinate associated with an /// FemRepresentation. The IndexedLocalCoordinate must be related to an FemElement (the index is an FemElement id and /// the local coordinates are the barycentric coordinates of the nodes in this FemElement). /// It is used, for example, as a helper class for filling out the MlcpPhysicsProblem in /// Fem3DRepresentationContact::doBuild, which constrains the motion of Fem3DRepresentation at a frictionless contact. class FemLocalization : public Localization { public: /// Constructor /// \param representation The representation to assign to this localization. /// \param localPosition The local position to set the localization at. FemLocalization(std::shared_ptr representation, const SurgSim::DataStructures::IndexedLocalCoordinate& localPosition); /// Destructor virtual ~FemLocalization(); /// Sets the local position. /// \param localPosition The local position to set the localization at. void setLocalPosition(const SurgSim::DataStructures::IndexedLocalCoordinate& localPosition); /// Gets the local position. /// \return The local position set for this localization. const SurgSim::DataStructures::IndexedLocalCoordinate& getLocalPosition() const; private: SurgSim::Math::Vector3d doCalculatePosition(double time) const override; SurgSim::Math::Vector3d doCalculateVelocity(double time) const override; /// Barycentric position in local coordinates SurgSim::DataStructures::IndexedLocalCoordinate m_position; }; } // namespace Physics } // namespace SurgSim #endif // SURGSIM_PHYSICS_FEMLOCALIZATION_H opensurgsim-0.7.0/SurgSim/Physics/FemPlyFormat.dox000066400000000000000000000125351277777236100222160ustar00rootroot00000000000000/*! \page femplyformat Fem Ply Format \relates FemPlyReaderDelegate The following documents the capabilities of the ply readers for reading fem structures, all subclasses of `FemPlyReaderDelegate`, i.e. `Fem1DPlyReaderDelegate`, `Fem2DPlyReaderDelegate` and `Fem3DPlyReaderDelgate`. When properties are denoted as "Optional" in the following examples it means that you may use or omit this property in the ply header. Whenever the property is used in the header all elements have to supply values for the property. ### Fem1D ply format ascii 1.0 comment Created by hand element vertex 7 (Verices of the Fem1d) property double x property double y property double z property double thetaX (Optional) property double thetaY (Optional) property double thetaZ (Optional) element 1d_element 7 (Element Definition of the Fem1d) property list uint uint vertex_indices (Each entry starts with the number of nodes in this element i.e. '2', followed by the nodes' indices) property double mass_density (Optional) property double poisson_ratio (Optional) property double young_modulus (Optional) element boundary_condition 3 (Boundary conditions of the Fem1D) property uint vertex_index (Each entry fixes all the degrees of freedom of the given node index) element radius 1 (Radius for all the elements) property double value element material 1 (Physical material properties for all the elements) property double mass_density property double poisson_ratio property double young_modulus end_header The ply file for an Fem1d is mostly marked by the `1d_element` element, the `radius` and `material` properties are applied to all of the `1d_elements`. Please note that the `vertex` element is compatible with the graphics file format and you should be able to load the fem1d file into a common graphics application. Optionally you can assign per element material properties at the `1d_element` level, in this case every element will need to carry material values and the `material` element will be ignored. ### Fem2D ply format ascii 1.0 comment Created by hand element vertex 6 property double x property double y property double z property double thetaX (Optional) property double thetaY (Optional) property double thetaZ (Optional) element 2d_element 3 (Element Definition of the Fem2d) property list uint uint vertex_indices (each entry starts with the number of nodes in this element i.e. '3', followed by the nodes' indices) property double mass_density (Optional) property double poisson_ratio (Optional) property double young_modulus (Optional) element boundary_condition 2 (Boundary conditions of the Fem2D) property uint vertex_index (Each entry fixes all the degrees of freedom of the given node index) element thickness 1 (Thickness for all the elements) property double value element material 1 (Physical material properties for all the elements) property double mass_density property double poisson_ratio property double young_modulus end_header The ply file for an Fem2d is indicated by the `2d_element` element, the `thickness` and `material` properties are applied to all of the `2d_elements`. Please note that the `vertex` element is compatible with the graphics file format and you should be able to load the fem1d file into a common graphics application. Additionally you can add `face` elements to this file to embed a graphics mesh with the fem mesh. Currently the format only supports triangles as elements, this means the 2d_element data must have 3 entries. Optionally you can assign per element material properties at the `2d_element` level, in this case every element will need to carry material values and the `material` element will be ignored. ### Fem3D ply format ascii 1.0 comment Created by hand element vertex 10 property double x property double y property double z element 3d_element 3 (Element Definition of the Fem3d) property list uint uint vertex_indices (Each entry starts with the number of nodes in this element i.e. '4' or '8', followed by the nodes' indices) property double mass_density (Optional) property double poisson_ratio (Optional) property double young_modulus (Optional) element boundary_condition 2 (Boundary conditions of the Fem3D) property uint vertex_index (Each entry fixes all the degrees of freedom of the given node index) element material 1 (Physical material properties for all the elements) property double mass_density property double poisson_ratio property double young_modulus end_header The ply file for an Fem3d is indicated by the `3d_element` element. Please note that the `vertex` element is compatible with the graphics file format and you should be able to load the fem3d file into a common graphics application. Additionally you can add `face` elements to this file to embed a graphics mesh with the fem mesh. Currently the reader supports tehtrahedral and hexahedral elements (4 and 8 nodes respectively), it will depend on the actual representation that is being used whether these elements can be mixed within one mesh. Optionally you can assign per element material properties at the `1d_element` level, in this case every element will need to carry material values and the `material` element will be ignored. */opensurgsim-0.7.0/SurgSim/Physics/FemPlyReaderDelegate.cpp000066400000000000000000000156671277777236100236240ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2014-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/DataStructures/PlyReader.h" #include "SurgSim/Physics/FemElement.h" #include "SurgSim/Physics/FemPlyReaderDelegate.h" using SurgSim::DataStructures::PlyReader; namespace SurgSim { namespace Physics { FemPlyReaderDelegate::FemPlyReaderDelegate() { } bool FemPlyReaderDelegate::registerDelegate(PlyReader* reader) { // Element Processing reader->requestElement( getElementName(), std::bind(&FemPlyReaderDelegate::beginFemElements, this, std::placeholders::_1, std::placeholders::_2), std::bind(&FemPlyReaderDelegate::processFemElement, this, std::placeholders::_1), std::bind(&FemPlyReaderDelegate::endFemElements, this, std::placeholders::_1)); reader->requestListProperty(getElementName(), "vertex_indices", PlyReader::TYPE_UNSIGNED_INT, offsetof(ElementData, indices), PlyReader::TYPE_UNSIGNED_INT, offsetof(ElementData, vertexCount)); // Vertex processing reader->requestElement("vertex", std::bind(&FemPlyReaderDelegate::beginVertices, this, std::placeholders::_1, std::placeholders::_2), std::bind(&FemPlyReaderDelegate::processVertex, this, std::placeholders::_1), std::bind(&FemPlyReaderDelegate::endVertices, this, std::placeholders::_1)); reader->requestScalarProperty("vertex", "x", PlyReader::TYPE_DOUBLE, offsetof(Vertex6DData, x)); reader->requestScalarProperty("vertex", "y", PlyReader::TYPE_DOUBLE, offsetof(Vertex6DData, y)); reader->requestScalarProperty("vertex", "z", PlyReader::TYPE_DOUBLE, offsetof(Vertex6DData, z)); if (m_hasRotationDOF) { reader->requestScalarProperty("vertex", "thetaX", PlyReader::TYPE_DOUBLE, offsetof(Vertex6DData, thetaX)); reader->requestScalarProperty("vertex", "thetaY", PlyReader::TYPE_DOUBLE, offsetof(Vertex6DData, thetaY)); reader->requestScalarProperty("vertex", "thetaZ", PlyReader::TYPE_DOUBLE, offsetof(Vertex6DData, thetaZ)); } // Boundary Condition Processing if (m_hasBoundaryConditions) { reader->requestElement( "boundary_condition", std::bind(&FemPlyReaderDelegate::beginBoundaryConditions, this, std::placeholders::_1, std::placeholders::_2), std::bind(&FemPlyReaderDelegate::processBoundaryCondition, this, std::placeholders::_1), nullptr); reader->requestScalarProperty("boundary_condition", "vertex_index", PlyReader::TYPE_UNSIGNED_INT, 0); } if (m_hasMaterial) { reader->requestElement( "material", std::bind( &FemPlyReaderDelegate::beginMaterials, this, std::placeholders::_1, std::placeholders::_2), nullptr, std::bind(&FemPlyReaderDelegate::endMaterials, this, std::placeholders::_1)); reader->requestScalarProperty( "material", "mass_density", PlyReader::TYPE_DOUBLE, offsetof(MaterialData, massDensity)); reader->requestScalarProperty( "material", "poisson_ratio", PlyReader::TYPE_DOUBLE, offsetof(MaterialData, poissonRatio)); reader->requestScalarProperty( "material", "young_modulus", PlyReader::TYPE_DOUBLE, offsetof(MaterialData, youngModulus)); } else if (m_hasPerElementMaterial) { reader->requestScalarProperty( getElementName(), "mass_density", PlyReader::TYPE_DOUBLE, offsetof(ElementData, massDensity)); reader->requestScalarProperty( getElementName(), "poisson_ratio", PlyReader::TYPE_DOUBLE, offsetof(ElementData, poissonRatio)); reader->requestScalarProperty( getElementName(), "young_modulus", PlyReader::TYPE_DOUBLE, offsetof(ElementData, youngModulus)); } reader->setEndParseFileCallback(std::bind(&FemPlyReaderDelegate::endParseFile, this)); return true; } bool FemPlyReaderDelegate::fileIsAcceptable(const PlyReader& reader) { bool result = true; // Shortcut test if one fails ... result = result && reader.hasElement(getElementName()); result = result && reader.hasProperty("vertex", "x"); result = result && reader.hasProperty("vertex", "y"); result = result && reader.hasProperty("vertex", "z"); // 6DOF processing (this is not supported for all element types) m_hasRotationDOF = reader.hasProperty("vertex", "thetaX") && reader.hasProperty("vertex", "thetaY") && reader.hasProperty("vertex", "thetaZ"); result = result && reader.hasProperty(getElementName(), "vertex_indices"); result = result && !reader.isScalar(getElementName(), "vertex_indices"); // Material: either have a default material for all elements // or have per element material properties m_hasMaterial = reader.hasProperty("material", "mass_density") && reader.hasProperty("material", "poisson_ratio") && reader.hasProperty("material", "young_modulus"); m_hasPerElementMaterial = reader.hasProperty(getElementName(), "mass_density") && reader.hasProperty(getElementName(), "poisson_ratio") && reader.hasProperty(getElementName(), "young_modulus"); m_hasBoundaryConditions = reader.hasProperty("boundary_condition", "vertex_index"); return result; } void* FemPlyReaderDelegate::beginVertices(const std::string& elementName, size_t vertexCount) { m_vertexData.overrun1 = 0l; return &m_vertexData; } void FemPlyReaderDelegate::endVertices(const std::string& elementName) { SURGSIM_ASSERT(m_vertexData.overrun1 == 0l) << "There was an overrun while reading the vertex structures, it is likely that data " << "has become corrupted."; } void* FemPlyReaderDelegate::beginFemElements(const std::string& elementName, size_t elementCount) { m_elementData.overrun1 = 0l; m_elementData.overrun2 = 0l; return &m_elementData; } void FemPlyReaderDelegate::endFemElements(const std::string& elementName) { SURGSIM_ASSERT(m_elementData.overrun1 == 0 && m_elementData.overrun2 == 0) << "There was an overrun while reading the element structures, it is likely that data " << "has become corrupted."; m_elementData.indices = nullptr; } void* FemPlyReaderDelegate::beginMaterials(const std::string& elementName, size_t materialCount) { m_materialData.overrun = 0l; return &m_materialData; } void FemPlyReaderDelegate::endMaterials(const std::string& elementName) { SURGSIM_ASSERT(m_materialData.overrun == 0) << "There was an overrun while reading the material structures, it is likely that data " << "has become corrupted."; } void* FemPlyReaderDelegate::beginBoundaryConditions(const std::string& elementName, size_t boundaryConditionCount) { return &m_boundaryConditionData; } } // namespace SurgSim } // namespace DataStructures opensurgsim-0.7.0/SurgSim/Physics/FemPlyReaderDelegate.h000066400000000000000000000120331277777236100232510ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2014-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_FEMPLYREADERDELEGATE_H #define SURGSIM_PHYSICS_FEMPLYREADERDELEGATE_H #include #include #include "SurgSim/DataStructures/PlyReaderDelegate.h" #include "SurgSim/Physics/Fem.h" namespace SurgSim { namespace Physics { /// Common part of implementation of PlyReaderDelegate for FemRepresentations. /// This is an abstract class and needs to be inherited. /// Methods 'registerDelegate()' and 'fileIsAcceptable()' need to be overridden. class FemPlyReaderDelegate : public SurgSim::DataStructures::PlyReaderDelegate { public: /// Constructor FemPlyReaderDelegate(); protected: // \return Name of the element (1/2/3D), which this delegate processes. virtual std::string getElementName() const = 0; bool registerDelegate(SurgSim::DataStructures::PlyReader* reader) override; bool fileIsAcceptable(const SurgSim::DataStructures::PlyReader& reader) override; /// Callback for end of PlyReader::parseFile. virtual void endParseFile() = 0; /// Callback function, begin the processing of vertices. /// \param elementName Name of the element. /// \param vertexCount Number of vertices. /// \return memory for vertex data to the reader. virtual void* beginVertices(const std::string& elementName, size_t vertexCount); /// Callback function to process one vertex. /// \param elementName Name of the element. virtual void processVertex(const std::string& elementName) = 0; /// Callback function to finalize processing of vertices. /// \param elementName Name of the element. virtual void endVertices(const std::string& elementName); /// Callback function, begin the processing of FemElements. /// \param elementName Name of the element. /// \param elementCount Number of elements. /// \return memory for FemElement data to the reader. void* beginFemElements(const std::string& elementName, size_t elementCount); /// Callback function to process one FemElement. /// \param elementName Name of the element. virtual void processFemElement(const std::string& elementName) = 0; /// Callback function to finalize processing of FemElements. /// \param elementName Name of the element. void endFemElements(const std::string& elementName); /// Callback function, begin the processing of materials. /// \param elementName Name of the element. /// \param materialCount Number of materials. /// \return memory for material data to the reader. void* beginMaterials(const std::string& elementName, size_t materialCount); /// Callback function, end the processing of materials. /// \param elementName Name of the element. void endMaterials(const std::string& elementName); /// Callback function, begin the processing of boundary conditions. /// \param elementName Name of the element. /// \param boundaryConditionCount Number of boundary conditions. /// \return memory for boundary conditions data to the reader. void* beginBoundaryConditions(const std::string& elementName, size_t boundaryConditionCount); /// Callback function to process one boundary condition. /// \param elementName Name of the element. virtual void processBoundaryCondition(const std::string& elementName) = 0; protected: /// Vertex data containing 6 dofs (3 translational and 3 rotational) struct Vertex6DData { double x; double y; double z; int64_t overrun1; ///< Used to check for buffer overruns double thetaX; double thetaY; double thetaZ; int64_t overrun2; ///< Used to check for buffer overruns } m_vertexData; /// Flag indicating if the associated file has boundary conditions bool m_hasBoundaryConditions; /// Internal data to receive the "boundary_condition" element unsigned int m_boundaryConditionData; /// Internal data to receive the "material" data struct MaterialData { double massDensity; double poissonRatio; double youngModulus; int64_t overrun; ///< Used to check for buffer overruns } m_materialData; bool m_hasMaterial; bool m_hasPerElementMaterial; /// Internal data to receive the fem element struct ElementData { unsigned int type; // “LinearBeamâ€, “CorotationalTetrahedronâ€â€¦ int64_t overrun1; ///< Used to check for buffer overruns unsigned int* indices; unsigned int vertexCount; int64_t overrun2; ///< Used to check for buffer overruns double massDensity; double poissonRatio; double youngModulus; } m_elementData; bool m_hasRotationDOF; }; } // namespace Physics } // namespace SurgSim #endif // SURGSIM_PHYSICS_FEMPLYREADERDELEGATE_H opensurgsim-0.7.0/SurgSim/Physics/FemRepresentation.cpp000066400000000000000000000434631277777236100232770ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/DataStructures/IndexedLocalCoordinate.h" #include "SurgSim/DataStructures/PlyReader.h" #include "SurgSim/Framework/Assert.h" #include "SurgSim/Framework/ApplicationData.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Math/Matrix.h" #include "SurgSim/Math/OdeState.h" #include "SurgSim/Math/SparseMatrix.h" #include "SurgSim/Physics/FemElement.h" #include "SurgSim/Physics/FemPlyReaderDelegate.h" #include "SurgSim/Physics/FemRepresentation.h" using SurgSim::Math::Matrix; using SurgSim::Math::OdeState; using SurgSim::Math::SparseMatrix; namespace SurgSim { namespace Physics { FemRepresentation::FemRepresentation(const std::string& name) : DeformableRepresentation(name), m_useComplianceWarping(false), m_isInitialComplianceMatrixComputed(false) { m_rayleighDamping.massCoefficient = 0.0; m_rayleighDamping.stiffnessCoefficient = 0.0; SURGSIM_ADD_SERIALIZABLE_PROPERTY(FemRepresentation, bool, ComplianceWarping, getComplianceWarping, setComplianceWarping); SURGSIM_ADD_SERIALIZABLE_PROPERTY(FemRepresentation, std::string, FemElementType, getFemElementType, setFemElementType); SURGSIM_ADD_SERIALIZABLE_PROPERTY(FemRepresentation, double, RayleighDampingMass, getRayleighDampingMass, setRayleighDampingMass); SURGSIM_ADD_SERIALIZABLE_PROPERTY(FemRepresentation, double, RayleighDampingStiffness, getRayleighDampingStiffness, setRayleighDampingStiffness); } FemRepresentation::~FemRepresentation() { } void FemRepresentation::setFemElementType(const std::string& type) { SURGSIM_ASSERT(!isInitialized()) << "You must set the FemElement type before initializing"; m_femElementType = type; } const std::string& FemRepresentation::getFemElementType() const { return m_femElementType; } bool FemRepresentation::doInitialize() { // DeformableRepresentation::doInitialize will // 1) assert if initial state is not set // 2) transform m_initialState properly with the initial pose // => FemElement::initialize(m_initialState) is using the correct transformed state if (!DeformableRepresentation::doInitialize()) { return false; } // Initialize the FemElements for (auto element = std::begin(m_femElements); element != std::end(m_femElements); element++) { (*element)->initialize(*m_initialState); } // Allocate the vector m_massPerNode if (m_massPerNode.size() == 0 || m_massPerNode.size() < m_initialState->getNumNodes()) { m_massPerNode.resize(m_initialState->getNumNodes()); } // Compute the entries of m_massPerNode from the FemElements mass information for (auto element = std::begin(m_femElements); element != std::end(m_femElements); element++) { double mass = (*element)->getMass(*m_initialState); for (auto nodeId = std::begin((*element)->getNodeIds()); nodeId != std::end((*element)->getNodeIds()); nodeId++) { m_massPerNode[*nodeId] += mass / (*element)->getNumNodes(); } } typedef SparseMatrix::Index Index; // Precompute the sparsity pattern for the global arrays. m_M.resize(static_cast(getNumDof()), static_cast(getNumDof())); m_D.resize(static_cast(getNumDof()), static_cast(getNumDof())); m_K.resize(static_cast(getNumDof()), static_cast(getNumDof())); for (auto femElement = std::begin(m_femElements); femElement != std::end(m_femElements); femElement++) { Math::Matrix block = Math::Matrix::Zero(getNumDofPerNode() * (*femElement)->getNumNodes(), getNumDofPerNode() * (*femElement)->getNumNodes()); (*femElement)->assembleMatrixBlocks(block, (*femElement)->getNodeIds(), getNumDofPerNode(), &m_M, true); } m_M.makeCompressed(); m_D = m_K = m_M; // If we are using compliance warping for this representation, let's pre-allocate the rotation matrix // and pre-define its pattern, so we only access existing elements later on. if (m_useComplianceWarping) { Index numDofPerNode = static_cast(getNumDofPerNode()); Index numDof = static_cast(getNumDof()); // Rotation matrix allocation and creation of the sparse matrix pattern. m_complianceWarpingTransformation.resize(numDof, numDof); // n columns with numDofPerNode non-zero elements each m_complianceWarpingTransformation.reserve( Eigen::Matrix::Constant(numDof, numDofPerNode)); auto logger = SurgSim::Framework::Logger::getLogger("Physics/FemRepresentation"); SURGSIM_LOG_IF(numDofPerNode % 3 != 0, logger, SEVERE) << "Using compliance warping with representation " << getName() << " which has " << numDofPerNode << " dof per node (not a factor of 3)"; // Use a mask of 1 to setup the sparse matrix pattern for (Index nodeId = 0; nodeId < static_cast(m_initialState->getNumNodes()); ++nodeId) { for (Index i = 0; i < numDofPerNode; ++i) { for (Index j = 0; j < numDofPerNode; ++j) { m_complianceWarpingTransformation.insert(nodeId * numDofPerNode + i, nodeId * numDofPerNode + j) = 1.0; } } } m_complianceWarpingTransformation.makeCompressed(); } return true; } void FemRepresentation::addFemElement(const std::shared_ptr femElement) { m_femElements.push_back(femElement); } size_t FemRepresentation::getNumFemElements() const { return m_femElements.size(); } std::shared_ptr FemRepresentation::getFemElement(size_t femElementId) { SURGSIM_ASSERT(femElementId < getNumFemElements()) << "Invalid femElement id"; return m_femElements[femElementId]; } bool FemRepresentation::isValidCoordinate(const SurgSim::DataStructures::IndexedLocalCoordinate& coordinate) const { return (coordinate.index < m_femElements.size()) && m_femElements[coordinate.index]->isValidCoordinate(coordinate.coordinate); } double FemRepresentation::getTotalMass() const { double mass = 0.0; for (auto it = std::begin(m_femElements); it != std::end(m_femElements); it++) { mass += (*it)->getMass(*m_currentState); } return mass; } double FemRepresentation::getRayleighDampingStiffness() const { return m_rayleighDamping.stiffnessCoefficient; } double FemRepresentation::getRayleighDampingMass() const { return m_rayleighDamping.massCoefficient; } void FemRepresentation::setRayleighDampingStiffness(double stiffnessCoef) { m_rayleighDamping.stiffnessCoefficient = stiffnessCoef; } void FemRepresentation::setRayleighDampingMass(double massCoef) { m_rayleighDamping.massCoefficient = massCoef; } void FemRepresentation::beforeUpdate(double dt) { DeformableRepresentation::beforeUpdate(dt); SURGSIM_ASSERT(getNumFemElements()) << "No fem element specified yet, call addFemElement() prior to running the simulation"; SURGSIM_ASSERT(getNumDof()) << "State has not been initialized yet, call setInitialState() prior to running the simulation"; } void FemRepresentation::update(double dt) { if (!isActive()) { return; } SURGSIM_ASSERT(m_odeSolver != nullptr) << "Ode solver has not been set yet. Did you call beforeUpdate() ?"; SURGSIM_ASSERT(m_initialState != nullptr) << "Initial state has not been set yet. Did you call setInitialState() ?"; // Solve the ode and compute the requested compliance matrix if (getComplianceWarping()) { if (!isInitialComplianceMatrixComputed()) { m_odeSolver->computeMatrices(dt, *m_initialState, true); setIsInitialComplianceMatrixComputed(true); } m_odeSolver->solve(dt, *m_currentState, m_newState.get(), false); // Update the compliance matrix updateComplianceMatrix(*m_newState); } else { m_odeSolver->solve(dt, *m_currentState, m_newState.get()); } // Back up the current state into the previous state (by swapping) m_currentState.swap(m_previousState); // Make the new state, the current state (by swapping) m_currentState.swap(m_newState); if (!m_currentState->isValid()) { SURGSIM_LOG(SurgSim::Framework::Logger::getDefaultLogger(), DEBUG) << getName() << " deactivated :" << std::endl << "position=(" << m_currentState->getPositions().transpose() << ")" << std::endl << "velocity=(" << m_currentState->getVelocities().transpose() << ")" << std::endl; setLocalActive(false); } } void FemRepresentation::setComplianceWarping(bool useComplianceWarping) { SURGSIM_ASSERT(!isInitialized()) << "Compliance warping cannot be modified once the component is initialized"; m_useComplianceWarping = useComplianceWarping; } bool FemRepresentation::getComplianceWarping() const { return m_useComplianceWarping; } Math::Matrix FemRepresentation::applyCompliance(const Math::OdeState& state, const Math::Matrix& b) { SURGSIM_ASSERT(m_odeSolver) << "Ode solver not initialized, it should have been initialized on wake-up"; if (m_useComplianceWarping) { // Then, update the compliance matrix using compliance warping return (m_complianceWarpingTransformation * DeformableRepresentation::applyCompliance(state, m_complianceWarpingTransformation.transpose() * b)); } return DeformableRepresentation::applyCompliance(state, b); } const SurgSim::Math::Matrix& FemRepresentation::getComplianceMatrix() const { SURGSIM_ASSERT(m_odeSolver) << "Ode solver not initialized, it should have been initialized on wake-up"; if (m_useComplianceWarping) { return m_complianceWarpingMatrix; } return m_odeSolver->getComplianceMatrix(); } SurgSim::Math::Matrix FemRepresentation::getNodeTransformation(const SurgSim::Math::OdeState& state, size_t nodeId) { SURGSIM_FAILURE() << "Any representation using compliance warping should override this method to provide the " << "proper nodes transformation"; return SurgSim::Math::Matrix(); } void FemRepresentation::updateComplianceMatrix(const SurgSim::Math::OdeState& state) { using SurgSim::Math::assignSubMatrix; // Update the compliance warping transformation using all the nodes' transformation for (size_t nodeId = 0; nodeId < state.getNumNodes(); ++nodeId) { assignSubMatrix(getNodeTransformation(state, nodeId), nodeId, nodeId, &m_complianceWarpingTransformation, false); } // Then, transform the initial compliance matrix to get the current compliance warping matrix m_complianceWarpingMatrix = m_complianceWarpingTransformation * m_odeSolver->getComplianceMatrix() * m_complianceWarpingTransformation.transpose(); } void FemRepresentation::computeF(const SurgSim::Math::OdeState& state) { // Make sure the force vector has been properly allocated and zeroed out m_f.setZero(state.getNumDof()); addGravityForce(&m_f, state); addRayleighDampingForce(&m_f, state); addFemElementsForce(&m_f, state); // Add external generalized force if (m_hasExternalGeneralizedForce) { m_f += m_externalGeneralizedForce; } } void FemRepresentation::computeM(const SurgSim::Math::OdeState& state) { // Make sure the mass matrix has been properly allocated and zeroed out Math::clearMatrix(&m_M); for (auto femElement = std::begin(m_femElements); femElement != std::end(m_femElements); femElement++) { (*femElement)->addMass(&m_M); } } void FemRepresentation::computeD(const SurgSim::Math::OdeState& state) { const double& rayleighStiffness = m_rayleighDamping.stiffnessCoefficient; const double& rayleighMass = m_rayleighDamping.massCoefficient; // Make sure the damping matrix has been properly allocated and zeroed out Math::clearMatrix(&m_D); // D += rayleighMass.M if (rayleighMass != 0.0) { for (auto femElement = std::begin(m_femElements); femElement != std::end(m_femElements); femElement++) { (*femElement)->addMass(&m_D, rayleighMass); } } // D += rayleighStiffness.K if (rayleighStiffness != 0.0) { for (auto femElement = std::begin(m_femElements); femElement != std::end(m_femElements); femElement++) { (*femElement)->addStiffness(&m_D, rayleighStiffness); } } // D += FemElements damping matrix for (auto femElement = std::begin(m_femElements); femElement != std::end(m_femElements); femElement++) { (*femElement)->addDamping(&m_D); } // Add external generalized damping if (m_hasExternalGeneralizedForce) { m_D += m_externalGeneralizedDamping; } } void FemRepresentation::computeK(const SurgSim::Math::OdeState& state) { // Make sure the stiffness matrix has been properly allocated and zeroed out Math::clearMatrix(&m_K); for (auto femElement = std::begin(m_femElements); femElement != std::end(m_femElements); femElement++) { (*femElement)->addStiffness(&m_K); } // Add external generalized stiffness if (m_hasExternalGeneralizedForce) { m_K += m_externalGeneralizedStiffness; } } void FemRepresentation::computeFMDK(const SurgSim::Math::OdeState& state) { // Make sure the force vector has been properly allocated and zeroed out m_f.setZero(state.getNumDof()); // Make sure the mass matrix has been properly allocated and zeroed out Math::clearMatrix(&m_M); // Make sure the damping matrix has been properly allocated and zeroed out Math::clearMatrix(&m_D); // Make sure the stiffness matrix has been properly allocated and zeroed out Math::clearMatrix(&m_K); // Add all the FemElement contribution to f, M, D, K for (auto femElement = std::begin(m_femElements); femElement != std::end(m_femElements); femElement++) { (*femElement)->addFMDK(&m_f, &m_M, &m_D, &m_K); } // Add the Rayleigh damping matrix if (m_rayleighDamping.massCoefficient) { m_D += m_M * m_rayleighDamping.massCoefficient; } if (m_rayleighDamping.stiffnessCoefficient) { m_D += m_K * m_rayleighDamping.stiffnessCoefficient; } // Add the gravity to m_f addGravityForce(&m_f, state); // Add the Rayleigh damping force to m_f addRayleighDampingForce(&m_f, state, true, true); // Add external generalized force, stiffness and damping if (m_previousHasExternalGeneralizedForce != m_hasExternalGeneralizedForce) { setIsInitialComplianceMatrixComputed(false); } if (m_hasExternalGeneralizedForce) { m_f += m_externalGeneralizedForce; m_K += m_externalGeneralizedStiffness; m_D += m_externalGeneralizedDamping; if (!m_previousExternalGeneralizedStiffness.isApprox(m_externalGeneralizedStiffness) || !m_previousExternalGeneralizedDamping.isApprox(m_externalGeneralizedDamping)) { setIsInitialComplianceMatrixComputed(false); } } } void FemRepresentation::updateFMDK(const SurgSim::Math::OdeState& state, int options) { // This function updates the matrices needed to calculate F, M, D, K for each element. // Note that the relevant matrices are updated only for non-linear elements. for (auto femElement = std::begin(m_femElements); femElement != std::end(m_femElements); femElement++) { (*femElement)->updateFMDK(state, options); } OdeEquation::updateFMDK(state, options); } void FemRepresentation::addRayleighDampingForce( SurgSim::Math::Vector* force, const SurgSim::Math::OdeState& state, bool useGlobalStiffnessMatrix, bool useGlobalMassMatrix, double scale) { // Temporary variables for convenience double& rayleighMass = m_rayleighDamping.massCoefficient; double& rayleighStiffness = m_rayleighDamping.stiffnessCoefficient; const SurgSim::Math::Vector& v = state.getVelocities(); // Rayleigh damping mass: F = -rayleighMass.M.v(t) if (rayleighMass != 0.0) { // If we have the mass matrix, we can compute directly F = -rayleighMass.M.v(t) if (useGlobalMassMatrix) { Math::Vector tempForce = (scale * rayleighMass) * (m_M * v); *force -= tempForce; } else { // Otherwise, we loop through each fem element to compute its contribution for (auto femElement = std::begin(m_femElements); femElement != std::end(m_femElements); femElement++) { (*femElement)->addMatVec(- scale * rayleighMass, 0.0, 0.0, v, force); } } } // Rayleigh damping stiffness: F = - rayleighStiffness.K.v(t) // K is not diagonal and links all dof of the N connected nodes if (rayleighStiffness != 0.0) { if (useGlobalStiffnessMatrix) { Math::Vector tempForce = scale * rayleighStiffness * (m_K * v); *force -= tempForce; } else { // Otherwise, we loop through each fem element to compute its contribution for (auto femElement = std::begin(m_femElements); femElement != std::end(m_femElements); femElement++) { (*femElement)->addMatVec(0.0, 0.0, - scale * rayleighStiffness, v, force); } } } } void FemRepresentation::addFemElementsForce(SurgSim::Math::Vector* force, const SurgSim::Math::OdeState& state, double scale) { for (auto femElement = std::begin(m_femElements); femElement != std::end(m_femElements); femElement++) { (*femElement)->addForce(force, scale); } } void FemRepresentation::addGravityForce(SurgSim::Math::Vector* f, const SurgSim::Math::OdeState& state, double scale) { using SurgSim::Math::addSubVector; SURGSIM_ASSERT(m_massPerNode.size() == state.getNumNodes()) << "Mass per node has not been properly allocated. Did you call Initialize() ?"; // Prepare a gravity vector of the proper size SurgSim::Math::Vector gravitynD = SurgSim::Math::Vector::Zero(getNumDofPerNode()); gravitynD.segment(0, 3) = getGravity(); if (isGravityEnabled()) { for (size_t nodeId = 0; nodeId < state.getNumNodes(); nodeId++) { // F = mg addSubVector(gravitynD * (scale * m_massPerNode[nodeId]), nodeId, getNumDofPerNode(), f); } } } bool FemRepresentation::isInitialComplianceMatrixComputed() const { return m_isInitialComplianceMatrixComputed; } void FemRepresentation::setIsInitialComplianceMatrixComputed(bool flag) { m_isInitialComplianceMatrixComputed = flag; } } // namespace Physics } // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/FemRepresentation.h000066400000000000000000000240441277777236100227360ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_FEMREPRESENTATION_H #define SURGSIM_PHYSICS_FEMREPRESENTATION_H #include #include "SurgSim/DataStructures/IndexedLocalCoordinate.h" #include "SurgSim/Math/Matrix.h" #include "SurgSim/Math/SparseMatrix.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/DeformableRepresentation.h" #include "SurgSim/Physics/Fem.h" namespace SurgSim { namespace Physics { class FemElement; class FemPlyReaderDelegate; /// Finite Element Model (a.k.a FEM) is a deformable model (a set of nodes connected by FemElement). /// \note A fem is a DeformableRepresentation (Physics::Representation and Math::OdeEquation), therefore it defines /// a dynamic system \f$M.a=F(x,v)\f$ /// \note + The model handles damping through the Rayleigh damping (it is a combination of mass and stiffness) /// \note + The model handles compliance warping (optional) from the paper: /// \note "Efficient Contact Modeling using Compliance Warping", G Saupin, C Duriez, S Cotin, L Grisoni; /// Computer %Graphics International (CGI), Istanbul, Turkey, june 2008. /// \note To use compliance warping, it needs to be turned on by calling setComplianceWarping(true) and the method /// updateNodesRotations() needs to be overloaded properly. class FemRepresentation : public DeformableRepresentation { public: /// Constructor /// \param name The name of the FemRepresentation explicit FemRepresentation(const std::string& name); /// Destructor virtual ~FemRepresentation(); /// Loads the FEM file into an Fem class data structure /// \param filename The file to load virtual void loadFem(const std::string& filename) = 0; /// Sets the FemElement type pulled from the object factory /// \param type A string of the full registered OSS class name in the factory virtual void setFemElementType(const std::string& type); /// Gets the FemElement type pulled from the object factory /// \return A string of the full registered OSS class name in the factory const std::string& getFemElementType() const; /// Adds a FemElement /// \param element The FemElement to add to the representation void addFemElement(const std::shared_ptr element); /// Gets the number of FemElement /// \return the number of FemElement size_t getNumFemElements() const; /// Retrieves a given FemElement from its id /// \param femElementId The FemElement id for which the FemElement is requested /// \return The FemElement for the given femElementId /// \note The FemElement is returned with read/write access /// \note Out of range femElementId will raise an exception std::shared_ptr getFemElement(size_t femElementId); /// Gets the total mass of the fem /// \return The total mass of the fem (in Kg) double getTotalMass() const; /// Gets the Rayleigh stiffness parameter /// \return The Rayleigh stiffness parameter double getRayleighDampingStiffness() const; /// Gets the Rayleigh mass parameter /// \return The Rayleigh mass parameter double getRayleighDampingMass() const; /// Sets the Rayleigh stiffness parameter /// \param stiffnessCoef The Rayleigh stiffness parameter void setRayleighDampingStiffness(double stiffnessCoef); /// Sets the Rayleigh mass parameter /// \param massCoef The Rayleigh mass parameter void setRayleighDampingMass(double massCoef); /// Determines whether the associated coordinate is valid /// \param coordinate Coordinate to check /// \return True if coordinate is valid bool isValidCoordinate(const SurgSim::DataStructures::IndexedLocalCoordinate& coordinate) const; /// Preprocessing done before the update call /// \param dt The time step (in seconds) void beforeUpdate(double dt) override; void update(double dt) override; /// Set the compliance warping flag /// \param useComplianceWarping True to use compliance warping, False otherwise /// \exception SurgSim::Framework::AssertionFailure If the call is done after initialization /// \note Compliance warping is currently disabled in this version. void setComplianceWarping(bool useComplianceWarping); /// Get the compliance warping flag (default = false) /// \return True if compliance warping is used, False otherwise bool getComplianceWarping() const; /// Calculate the product C.b where C is the compliance matrix with boundary conditions /// \param state \f$(x, v)\f$ the current position and velocity to evaluate the various terms with /// \param b The input matrix b /// \return Returns the matrix \f$C.b\f$ Math::Matrix applyCompliance(const Math::OdeState& state, const Math::Matrix& b) override; const SurgSim::Math::Matrix& getComplianceMatrix() const override; void updateFMDK(const SurgSim::Math::OdeState& state, int options) override; protected: /// Adds the Rayleigh damping forces /// \param[in,out] f The force vector to cumulate the Rayleigh damping force into /// \param state The state vector containing positions and velocities /// \param useGlobalMassMatrix, useGlobalStiffnessMatrix True indicates that the global mass and stiffness matrices /// should be used (F = -c.M.v - d.K.v) /// \param scale A scaling factor to apply on the damping force /// \note Damping matrix D = c.M + d.K (Rayleigh damping definition) /// \note F = - D.v = -c.M.v - d.K.v /// \note If {useGlobalMassMatrix | useGlobalStiffnessMatrix} is True, {M | K} will be used /// \note If {useGlobalMassMatrix | useGlobalStiffnessMatrix} is False /// \note the {mass|stiffness} component will be computed FemElement by FemElement void addRayleighDampingForce(SurgSim::Math::Vector* f, const SurgSim::Math::OdeState& state, bool useGlobalMassMatrix = false, bool useGlobalStiffnessMatrix = false, double scale = 1.0); /// Adds the FemElements forces to f (given a state) /// \param[in,out] f The force vector to cumulate the FemElements forces into /// \param state The state vector containing positions and velocities /// \param scale A scaling factor to scale the FemElements forces with void addFemElementsForce(SurgSim::Math::Vector* f, const SurgSim::Math::OdeState& state, double scale = 1.0); /// Adds the gravity force to f (given a state) /// \param[in,out] f The force vector to cumulate the gravity force into /// \param state The state vector containing positions and velocities /// \param scale A scaling factor to scale the gravity force with /// \note This method does not do anything if gravity is disabled void addGravityForce(SurgSim::Math::Vector* f, const SurgSim::Math::OdeState& state, double scale = 1.0); bool doInitialize() override; /// Updates the compliance matrix using nodes transformation (useful for compliance warping) /// \param state The state to compute the nodes transformation from /// \note This computes the diagonal block matrix m_complianceWarpingTransformation and /// transforms the initial compliance matrix with it. void updateComplianceMatrix(const SurgSim::Math::OdeState& state); /// Retrieves a specific node transformation (useful for compliance warping) /// \param state The state to extract the node transformation from /// \param nodeId The node to update the rotation for /// \return The node transformation. i.e. a numDofPerNode x numDofPerNode matrix virtual SurgSim::Math::Matrix getNodeTransformation(const SurgSim::Math::OdeState& state, size_t nodeId); /// Gets the flag keeping track of the initial compliance matrix calculation (compliance warping case) /// \return True if the initial compliance matrix has been computed, False otherwise bool isInitialComplianceMatrixComputed() const; /// Sets the flag keeping track of the initial compliance matrix calculation (compliance warping case) /// \param flag True if the initial compliance matrix is computed, False otherwise void setIsInitialComplianceMatrixComputed(bool flag); void computeF(const SurgSim::Math::OdeState& state) override; void computeM(const SurgSim::Math::OdeState& state) override; void computeD(const SurgSim::Math::OdeState& state) override; void computeK(const SurgSim::Math::OdeState& state) override; void computeFMDK(const SurgSim::Math::OdeState& state) override; /// Useful information per node std::vector m_massPerNode; ///< Useful in setting up the gravity force F=mg /// FemElements std::vector> m_femElements; /// The FemElement factory parameter invoked in doInitialize() when using a MeshAsset /// either with LoadFem(const std::stirng& filename) or setFem(std::shared_ptr mesh) /// This ensures that when using a mesh Asset, a single FemElement type is used. Therefore we do /// not need to define this type in the ply file, but rather is part of the Representation properties (YAML). std::string m_femElementType; private: /// Rayleigh damping parameters (massCoefficient and stiffnessCoefficient) /// D = massCoefficient.M + stiffnessCoefficient.K /// Matrices: D = damping, M = mass, K = stiffness struct { double massCoefficient; double stiffnessCoefficient; } m_rayleighDamping; bool m_useComplianceWarping; ///< Are we using Compliance Warping or not ? bool m_isInitialComplianceMatrixComputed; ///< For compliance warping: Is the initial compliance matrix computed ? SurgSim::Math::Matrix m_complianceWarpingMatrix; ///< The compliance warping matrix if compliance warping in use /// The system-size transformation matrix. It contains nodes transformation on the diagonal blocks. Eigen::SparseMatrix m_complianceWarpingTransformation; }; } // namespace Physics } // namespace SurgSim #endif // SURGSIM_PHYSICS_FEMREPRESENTATION_H opensurgsim-0.7.0/SurgSim/Physics/FixedConstraintFixedPoint.cpp000066400000000000000000000036321277777236100247350ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Physics/FixedConstraintFixedPoint.h" #include "SurgSim/Physics/FixedRepresentation.h" #include "SurgSim/Physics/Localization.h" using SurgSim::Math::Vector3d; namespace SurgSim { namespace Physics { FixedConstraintFixedPoint::FixedConstraintFixedPoint() { } FixedConstraintFixedPoint::~FixedConstraintFixedPoint() { } void FixedConstraintFixedPoint::doBuild(double dt, const ConstraintData& data, const std::shared_ptr& localization, MlcpPhysicsProblem* mlcp, size_t indexOfRepresentation, size_t indexOfConstraint, ConstraintSideSign sign) { std::shared_ptr representation = localization->getRepresentation(); if (!representation->isActive()) { return; } const double scale = (sign == CONSTRAINT_POSITIVE_SIDE) ? 1.0 : -1.0; Vector3d globalPosition = localization->calculatePosition(); // Fill up b with the constraint equation... mlcp->b.segment<3>(indexOfConstraint) += globalPosition * scale; } SurgSim::Physics::ConstraintType FixedConstraintFixedPoint::getConstraintType() const { return SurgSim::Physics::FIXED_3DPOINT; } size_t FixedConstraintFixedPoint::doGetNumDof() const { return 3; } }; // namespace Physics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/FixedConstraintFixedPoint.h000066400000000000000000000050321277777236100243760ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_FIXEDCONSTRAINTFIXEDPOINT_H #define SURGSIM_PHYSICS_FIXEDCONSTRAINTFIXEDPOINT_H #include "SurgSim/Physics/ConstraintImplementation.h" namespace SurgSim { namespace Physics { /// FixedRepresentation bilateral 3d constraint implementation. /// /// The family of FixedPoint constraints enforce equality between two points. class FixedConstraintFixedPoint : public ConstraintImplementation { public: /// Constructor FixedConstraintFixedPoint(); /// Destructor virtual ~FixedConstraintFixedPoint(); /// Gets the constraint type for this ConstraintImplementation /// \return The constraint type corresponding to this constraint implementation SurgSim::Physics::ConstraintType getConstraintType() const override; private: /// Gets the number of degree of freedom. /// \return 3 A bilateral 3d constraint enforces equality in the x, y, and z dimensions between 2 points. size_t doGetNumDof() const override; /// Builds the subset of an Mlcp physics problem associated to this implementation. /// \param dt The time step. /// \param data The data associated to the constraint. /// \param localization The localization for the representation. /// \param [in, out] mlcp The Mixed LCP physics problem to fill up. /// \param indexOfRepresentation The index of the representation (associated to this implementation) in the mlcp. /// \param indexOfConstraint The index of the constraint in the mlcp. /// \param sign The sign of this implementation in the constraint (positive or negative side). /// \note Empty for a Fixed Representation void doBuild(double dt, const ConstraintData& data, const std::shared_ptr& localization, MlcpPhysicsProblem* mlcp, size_t indexOfRepresentation, size_t indexOfConstraint, ConstraintSideSign sign) override; }; }; // namespace Physics }; // namespace SurgSim #endif // SURGSIM_PHYSICS_FIXEDCONSTRAINTFIXEDPOINT_H opensurgsim-0.7.0/SurgSim/Physics/FixedConstraintFixedRotationVector.cpp000066400000000000000000000042361277777236100266270ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Physics/FixedConstraintFixedRotationVector.h" #include "SurgSim/Physics/FixedRepresentation.h" #include "SurgSim/Physics/Localization.h" #include "SurgSim/Physics/RotationVectorConstraintData.h" using SurgSim::Math::Vector3d; namespace SurgSim { namespace Physics { FixedConstraintFixedRotationVector::FixedConstraintFixedRotationVector() { } FixedConstraintFixedRotationVector::~FixedConstraintFixedRotationVector() { } void FixedConstraintFixedRotationVector::doBuild(double dt, const ConstraintData& data, const std::shared_ptr& localization, MlcpPhysicsProblem* mlcp, size_t indexOfRepresentation, size_t indexOfConstraint, ConstraintSideSign sign) { std::shared_ptr representation = localization->getRepresentation(); if (!representation->isActive()) { return; } const double scale = (sign == CONSTRAINT_POSITIVE_SIDE) ? 1.0 : -1.0; const auto& constRotVecData = static_cast(data); SurgSim::Math::Vector3d rotationVector = constRotVecData.getCurrentRotationVector(); // Fill up b with the constraint equation... mlcp->b.segment<3>(indexOfConstraint) += rotationVector * scale; } SurgSim::Physics::ConstraintType FixedConstraintFixedRotationVector::getConstraintType() const { return SurgSim::Physics::FIXED_3DROTATION_VECTOR; } size_t FixedConstraintFixedRotationVector::doGetNumDof() const { return 3; } }; // namespace Physics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/FixedConstraintFixedRotationVector.h000066400000000000000000000046221277777236100262730ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_FIXEDCONSTRAINTFIXEDROTATIONVECTOR_H #define SURGSIM_PHYSICS_FIXEDCONSTRAINTFIXEDROTATIONVECTOR_H #include "SurgSim/Physics/ConstraintImplementation.h" namespace SurgSim { namespace Physics { /// FixedRepresentation fixed rotation vector constraint /// /// This implementation simply fixes the rotational dof of the constraint, effectively controlling the /// other representation orientation. class FixedConstraintFixedRotationVector : public ConstraintImplementation { public: /// Constructor FixedConstraintFixedRotationVector(); /// Destructor virtual ~FixedConstraintFixedRotationVector(); SurgSim::Physics::ConstraintType getConstraintType() const override; private: size_t doGetNumDof() const override; /// \note This is only setting the mlcp->b violation to the fixed representation rotation vector. /// It means that the fixed won't receive any forces back, it simply will control the other representation's /// orientation in this constraint. /// /// \note The constraint violation being calculated based on a quaternion interpolation (slerp), and this /// type of interpolation being highly non-linear, the classical way of using the implementation one after the /// other one won't work. /// Therefore, the RotationVectorConstraint will use the vector mlcp->b to retrieve both representation's /// rotation vector, then calculate the proper slerp and set the violation back in mlcp->b void doBuild(double dt, const ConstraintData& data, const std::shared_ptr& localization, MlcpPhysicsProblem* mlcp, size_t indexOfRepresentation, size_t indexOfConstraint, ConstraintSideSign sign) override; }; }; // namespace Physics }; // namespace SurgSim #endif // SURGSIM_PHYSICS_FIXEDCONSTRAINTFIXEDROTATIONVECTOR_H opensurgsim-0.7.0/SurgSim/Physics/FixedConstraintFrictionlessContact.cpp000066400000000000000000000051701277777236100266430ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Physics/ContactConstraintData.h" #include "SurgSim/Physics/FixedConstraintFrictionlessContact.h" #include "SurgSim/Physics/FixedRepresentation.h" #include "SurgSim/Physics/Localization.h" #include "SurgSim/Physics/Representation.h" namespace SurgSim { namespace Physics { FixedConstraintFrictionlessContact::FixedConstraintFrictionlessContact() { } FixedConstraintFrictionlessContact::~FixedConstraintFrictionlessContact() { } void FixedConstraintFrictionlessContact::doBuild(double dt, const ConstraintData& data, const std::shared_ptr& localization, MlcpPhysicsProblem* mlcp, size_t indexOfRepresentation, size_t indexOfConstraint, ConstraintSideSign sign) { MlcpPhysicsProblem::Vector& b = mlcp->b; std::shared_ptr representation = localization->getRepresentation(); std::shared_ptr fixed = std::static_pointer_cast(representation); if (! fixed->isActive()) { return; } const double scale = (sign == CONSTRAINT_POSITIVE_SIDE ? 1.0 : -1.0); const ContactConstraintData& contactData = static_cast(data); const SurgSim::Math::Vector3d& n = contactData.getNormal(); // FRICTIONLESS CONTACT in a LCP // (n, d) defines the plane of contact // P(t) the point of contact // b = n.P(t) + d // Since the d term will be added to the constraint for one side of the contact and subtracted from the other, // and because it is not clear which distance should be used, we leave it out. SurgSim::Math::Vector3d globalPosition = localization->calculatePosition(); // Fill up b with the constraint equation... double violation = n.dot(globalPosition); b[indexOfConstraint] += violation * scale; } SurgSim::Physics::ConstraintType FixedConstraintFrictionlessContact::getConstraintType() const { return SurgSim::Physics::FRICTIONLESS_3DCONTACT; } size_t FixedConstraintFrictionlessContact::doGetNumDof() const { return 1; } }; // namespace Physics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/FixedConstraintFrictionlessContact.h000066400000000000000000000050221277777236100263040ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_FIXEDCONSTRAINTFRICTIONLESSCONTACT_H #define SURGSIM_PHYSICS_FIXEDCONSTRAINTFRICTIONLESSCONTACT_H #include "SurgSim/Physics/ConstraintImplementation.h" #include "SurgSim/Math/Vector.h" namespace SurgSim { namespace Physics { /// FixedRepresentation frictionless contact implementation. class FixedConstraintFrictionlessContact : public ConstraintImplementation { public: /// Constructor FixedConstraintFrictionlessContact(); /// Destructor virtual ~FixedConstraintFrictionlessContact(); /// Gets the constraint type for this ConstraintImplementation /// \return The constraint type corresponding to this constraint implementation SurgSim::Physics::ConstraintType getConstraintType() const override; private: /// Gets the number of degree of freedom. /// \return 1 as a frictionless contact is formed of 1 equation of constraint (along the normal direction). size_t doGetNumDof() const override; /// Builds the subset of an Mlcp physics problem associated to this implementation. /// \param dt The time step. /// \param data The data associated to the constraint. /// \param localization The localization for the representation. /// \param [in, out] mlcp The Mixed LCP physics problem to fill up. /// \param indexOfRepresentation The index of the representation (associated to this implementation) in the mlcp. /// \param indexOfConstraint The index of the constraint in the mlcp. /// \param sign The sign of this implementation in the constraint (positive or negative side). /// \note Empty for a Fixed Representation void doBuild(double dt, const ConstraintData& data, const std::shared_ptr& localization, MlcpPhysicsProblem* mlcp, size_t indexOfRepresentation, size_t indexOfConstraint, ConstraintSideSign sign) override; }; }; // namespace Physics }; // namespace SurgSim #endif // SURGSIM_PHYSICS_FIXEDCONSTRAINTFRICTIONLESSCONTACT_H opensurgsim-0.7.0/SurgSim/Physics/FixedRepresentation.cpp000066400000000000000000000023261277777236100236200ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Physics/FixedRepresentation.h" namespace SurgSim { namespace Physics { SURGSIM_REGISTER(SurgSim::Framework::Component, SurgSim::Physics::FixedRepresentation, FixedRepresentation); FixedRepresentation::FixedRepresentation(const std::string& name) : RigidRepresentationBase(name) { } FixedRepresentation::~FixedRepresentation() { } void FixedRepresentation::updateGlobalInertiaMatrices(const RigidState& state) { // Do Nothing it is a fixed object } void FixedRepresentation::update(double dt) { m_currentState.setPose(getPose()); } }; // Physics }; // SurgSimopensurgsim-0.7.0/SurgSim/Physics/FixedRepresentation.h000066400000000000000000000031511277777236100232620ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_FIXEDREPRESENTATION_H #define SURGSIM_PHYSICS_FIXEDREPRESENTATION_H #include "SurgSim/Framework/ObjectFactory.h" #include "SurgSim/Physics/RigidRepresentationBase.h" namespace SurgSim { namespace Physics { class RigidState; typedef RigidLocalization FixedLocalization; SURGSIM_STATIC_REGISTRATION(FixedRepresentation); /// The FixedRepresentation class represents a physics entity without any motion nor /// compliance against which others physics entities can interact class FixedRepresentation : public RigidRepresentationBase { public: /// Constructor /// \param name The fixed representation's name explicit FixedRepresentation(const std::string& name); /// Destructor virtual ~FixedRepresentation(); SURGSIM_CLASSNAME(SurgSim::Physics::FixedRepresentation); void updateGlobalInertiaMatrices(const RigidState& state) override; void update(double dt) override; }; }; // Physics }; // SurgSim #endif // SURGSIM_PHYSICS_FIXEDREPRESENTATION_H opensurgsim-0.7.0/SurgSim/Physics/FreeMotion.cpp000066400000000000000000000035761277777236100217150ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Framework/ThreadPool.h" #include "SurgSim/Physics/FreeMotion.h" #include "SurgSim/Physics/PhysicsManagerState.h" #include "SurgSim/Physics/Representation.h" namespace SurgSim { namespace Physics { FreeMotion::FreeMotion(bool doCopyState) : Computation(doCopyState) { } FreeMotion::~FreeMotion() { } std::shared_ptr FreeMotion::doUpdate(const double& dt, const std::shared_ptr& state) { // Copy state to new state std::shared_ptr result = state; auto threadPool = Framework::Runtime::getThreadPool(); std::vector> tasks; auto& representations = result->getActiveRepresentations(); for (auto& representation : representations) { tasks.push_back(threadPool->enqueue([dt, &representation]() { representation->update(dt); })); } auto& particleRepresentations = result->getActiveParticleRepresentations(); for (auto& representation : particleRepresentations) { tasks.push_back(threadPool->enqueue([dt, &representation]() { representation->update(dt); })); } for (auto& task : tasks) { task.get(); } return result; } }; // Physics }; // SurgSim opensurgsim-0.7.0/SurgSim/Physics/FreeMotion.h000066400000000000000000000027441277777236100213560ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_FREEMOTION_H #define SURGSIM_PHYSICS_FREEMOTION_H #include #include #include "SurgSim/Framework/Macros.h" #include "SurgSim/Physics/Computation.h" namespace SurgSim { namespace Physics { class Representation; /// Apply the FreeMotion calculation to all physics representations class FreeMotion : public Computation { public: /// Constructor /// \param doCopyState Specify if the output state in Computation::Update() is a copy or not of the input state explicit FreeMotion(bool doCopyState = false); SURGSIM_CLASSNAME(SurgSim::Physics::FreeMotion); /// Destructor ~FreeMotion(); protected: /// Override doUpdate from superclass std::shared_ptr doUpdate(const double& dt, const std::shared_ptr& state) override; }; }; // Physics }; // SurgSim #endif opensurgsim-0.7.0/SurgSim/Physics/LinearSpring.cpp000066400000000000000000000246331277777236100222400ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Framework/Log.h" #include "SurgSim/Math/Geometry.h" #include "SurgSim/Math/OdeState.h" #include "SurgSim/Math/SparseMatrix.h" #include "SurgSim/Physics/LinearSpring.h" using SurgSim::Math::Matrix; using SurgSim::Math::Matrix33d; using SurgSim::Math::OdeState; using SurgSim::Math::SparseMatrix; using SurgSim::Math::Vector; using SurgSim::Math::Vector3d; namespace SurgSim { namespace Physics { LinearSpring::LinearSpring(size_t nodeId0, size_t nodeId1) : Spring(), m_restLength(-1.0), m_stiffness(-1.0), m_damping(0.0) { m_nodeIds.push_back(nodeId0); m_nodeIds.push_back(nodeId1); } void LinearSpring::initialize(const OdeState& state) { Spring::initialize(state); SURGSIM_ASSERT(m_restLength >= 0.0) << "Spring rest length was not set, please call setRestLength()"; SURGSIM_ASSERT(m_stiffness >= 0.0) << "Spring stiffness was not set, please call setStiffness()"; } void LinearSpring::setStiffness(double stiffness) { SURGSIM_ASSERT(stiffness >= 0.0) << "Spring stiffness cannot be negative"; m_stiffness = stiffness; } double LinearSpring::getStiffness() const { return m_stiffness; } void LinearSpring::setDamping(double damping) { SURGSIM_ASSERT(damping >= 0.0) << "Spring damping cannot be negative"; m_damping = damping; } double LinearSpring::getDamping() const { return m_damping; } void LinearSpring::setRestLength(double restLength) { SURGSIM_ASSERT(restLength >= 0.0) << "Spring rest length cannot be negative"; m_restLength = restLength; } double LinearSpring::getRestLength() const { return m_restLength; } void LinearSpring::addForce(const OdeState& state, Vector* F, double scale) { const auto& x0 = state.getPositions().segment<3>(3 * m_nodeIds[0]); const auto& x1 = state.getPositions().segment<3>(3 * m_nodeIds[1]); const auto& v0 = state.getVelocities().segment<3>(3 * m_nodeIds[0]); const auto& v1 = state.getVelocities().segment<3>(3 * m_nodeIds[1]); Vector3d u = x1 - x0; double length = u.norm(); if (length < SurgSim::Math::Geometry::DistanceEpsilon) { SURGSIM_LOG_WARNING(SurgSim::Framework::Logger::getDefaultLogger()) << "Spring (initial length = " << m_restLength << ") became degenerated " << "with 0 length => no force generated"; return; } u /= length; double elongationPosition = length - m_restLength; double elongationVelocity = (v1 - v0).dot(u); const Vector3d f = scale * (m_stiffness * elongationPosition + m_damping * elongationVelocity) * u; // Assembly stage in F F->segment<3>(3 * m_nodeIds[0]) += f; F->segment<3>(3 * m_nodeIds[1]) -= f; } void LinearSpring::addDamping(const OdeState& state, Math::SparseMatrix* D, double scale) { Matrix33d De; // The spring has 2 nodes with positions {x1, x2}, velocities {v1, v2} and force {F1, F2=-F1} // Also note from addForce that the positions and velocities play a symmetric role in the force calculation // i.e. dFi/dx1 = -dFi/dx2 and dFi/dv1 = -dFi/dv2 // The damping matrix is D = -dF/dv = (-dF1/dv1 -dF1/dv2) = (-dF1/dv1 dF1/dv1) // (-dF2/dv1 -dF2/dv2) ( dF1/dv1 -dF1/dv1) // Let's compute De = -dF1/dv1 if (!computeDampingAndStiffness(state, &De, nullptr)) { return; } De *= scale; // Assembly stage in D Math::addSubMatrix(De, static_cast(m_nodeIds[0]), static_cast(m_nodeIds[0]), D, false); Matrix33d negativeDe = -De; Math::addSubMatrix(negativeDe, static_cast(m_nodeIds[0]), static_cast(m_nodeIds[1]), D, false); Math::addSubMatrix(negativeDe, static_cast(m_nodeIds[1]), static_cast(m_nodeIds[0]), D, false); Math::addSubMatrix(De, static_cast(m_nodeIds[1]), static_cast(m_nodeIds[1]), D, false); } void LinearSpring::addStiffness(const OdeState& state, Math::SparseMatrix* K, double scale) { Matrix33d Ke; // The spring has 2 nodes with positions {x1, x2}, velocities {v1, v2} and force {F1, F2=-F1} // Also note from addForce that the positions and velocities play a symmetric role in the force calculation // i.e. dFi/dx1 = -dFi/dx2 and dFi/dv1 = -dFi/dv2 // The stiffness matrix is K = -dF/dx = (-dF1/dx1 -dF1/dx2) = (-dF1/dx1 dF1/dx1) // (-dF2/dx1 -dF2/dx2) ( dF1/dx1 -dF1/dx1) // Let's compute Ke = -dF1/dx1 if (!computeDampingAndStiffness(state, nullptr, &Ke)) { return; } Ke *= scale; // Assembly stage in K Math::addSubMatrix(Ke, static_cast(m_nodeIds[0]), static_cast(m_nodeIds[0]), K, false); Matrix33d negativeKe = -Ke; Math::addSubMatrix(negativeKe, static_cast(m_nodeIds[0]), static_cast(m_nodeIds[1]), K, false); Math::addSubMatrix(negativeKe, static_cast(m_nodeIds[1]), static_cast(m_nodeIds[0]), K, false); Math::addSubMatrix(Ke, static_cast(m_nodeIds[1]), static_cast(m_nodeIds[1]), K, false); } void LinearSpring::addFDK(const OdeState& state, Vector* F, Math::SparseMatrix* D, Math::SparseMatrix* K) { Matrix33d De, Ke; // Assembly stage in F. Note that the force calculation does not rely on any matrices. addForce(state, F); // The spring has 2 nodes with positions {x1, x2}, velocities {v1, v2} and force {F1, F2=-F1} // Also note from addForce that the positions and velocities play a symmetric role in the force calculation // i.e. dFi/dx1 = -dFi/dx2 and dFi/dv1 = -dFi/dv2 // The stiffness matrix is K = -dF/dx = (-dF1/dx1 -dF1/dx2) = (-dF1/dx1 dF1/dx1) // (-dF2/dx1 -dF2/dx2) ( dF1/dx1 -dF1/dx1) // The damping matrix is D = -dF/dv = (-dF1/dv1 -dF1/dv2) = (-dF1/dv1 dF1/dv1) // (-dF2/dv1 -dF2/dv2) ( dF1/dv1 -dF1/dv1) // Let's compute De = -dF1/dv1 and Ke = -dF1/dx1 if (!computeDampingAndStiffness(state, &De, &Ke)) { return; } // Assembly stage in K Math::addSubMatrix(Ke, static_cast(m_nodeIds[0]), static_cast(m_nodeIds[0]), K, false); Matrix33d negativeKe = -Ke; Math::addSubMatrix(negativeKe, static_cast(m_nodeIds[0]), static_cast(m_nodeIds[1]), K, false); Math::addSubMatrix(negativeKe, static_cast(m_nodeIds[1]), static_cast(m_nodeIds[0]), K, false); Math::addSubMatrix(Ke, static_cast(m_nodeIds[1]), static_cast(m_nodeIds[1]), K, false); // Assembly stage in D Math::addSubMatrix(De, static_cast(m_nodeIds[0]), static_cast(m_nodeIds[0]), D, false); Matrix33d negativeDe = -De; Math::addSubMatrix(negativeDe, static_cast(m_nodeIds[0]), static_cast(m_nodeIds[1]), D, false); Math::addSubMatrix(negativeDe, static_cast(m_nodeIds[1]), static_cast(m_nodeIds[0]), D, false); Math::addSubMatrix(De, static_cast(m_nodeIds[1]), static_cast(m_nodeIds[1]), D, false); } void LinearSpring::addMatVec(const OdeState& state, double alphaD, double alphaK, const Vector& vector, Vector* F) { // Premature return if both factors are zero if (alphaK == 0.0 && alphaD == 0.0) { return; } Matrix33d De, Ke; if (!computeDampingAndStiffness(state, (alphaD != 0 ? &De : nullptr), (alphaK != 0 ? &Ke : nullptr))) { return; } // Shared data: the 2x 3D vectors to multiply the matrices with const auto& vector1 = vector.segment<3>(3 * m_nodeIds[0]); const auto& vector2 = vector.segment<3>(3 * m_nodeIds[1]); if (alphaD != 0.0) { const Vector3d force = alphaD * (De * (vector1 - vector2)); F->segment<3>(3 * m_nodeIds[0]) += force; F->segment<3>(3 * m_nodeIds[1]) -= force; } if (alphaK != 0.0) { const Vector3d force = alphaK * (Ke * (vector1 - vector2)); F->segment<3>(3 * m_nodeIds[0]) += force; F->segment<3>(3 * m_nodeIds[1]) -= force; } } bool LinearSpring::computeDampingAndStiffness(const OdeState& state, Matrix33d* De, Matrix33d* Ke) { const auto& x0 = state.getPositions().segment<3>(3 * m_nodeIds[0]); const auto& x1 = state.getPositions().segment<3>(3 * m_nodeIds[1]); const auto& v0 = state.getVelocities().segment<3>(3 * m_nodeIds[0]); const auto& v1 = state.getVelocities().segment<3>(3 * m_nodeIds[1]); Vector3d u = x1 - x0; double length = u.norm(); if (length < SurgSim::Math::Geometry::DistanceEpsilon) { SURGSIM_LOG_WARNING(SurgSim::Framework::Logger::getDefaultLogger()) << "Spring (initial length = " << m_restLength << ") became degenerated with 0 length => force derivative degenerated"; return false; } u /= length; double lRatio = (length - m_restLength) / length; double vRatio = (v1 - v0).dot(u) / length; Matrix33d uuT = u * u.transpose(); // Update the stiffness matrix if (Ke != nullptr) { *Ke = Matrix33d::Identity() * (m_stiffness * lRatio + m_damping * vRatio); *Ke -= uuT * (m_stiffness * (lRatio - 1.0) + 2.0 * m_damping * vRatio); *Ke += m_damping * (u * (v1 - v0).transpose()) / length; } // Update the damping matrix if (De != nullptr) { *De = m_damping * uuT; } return true; } bool LinearSpring::operator ==(const Spring& spring) const { const LinearSpring* ls = dynamic_cast(&spring); if (! ls) { return false; } return m_nodeIds == ls->m_nodeIds && m_restLength == ls->m_restLength && m_stiffness == ls->m_stiffness && m_damping == ls->m_damping; } bool LinearSpring::operator !=(const Spring& spring) const { return !((*this) == spring); } } // namespace Physics } // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/LinearSpring.h000066400000000000000000000150131277777236100216750ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_LINEARSPRING_H #define SURGSIM_PHYSICS_LINEARSPRING_H #include "SurgSim/Physics/Spring.h" namespace SurgSim { namespace Physics { /// Linear spring connecting 2 nodes with a viscous term class LinearSpring : public Spring { public: /// Constructor /// \param nodeId0, nodeId1 The node ids on which the spring is attached LinearSpring(size_t nodeId0, size_t nodeId1); void initialize(const SurgSim::Math::OdeState& state) override; /// Sets the spring stiffness parameter /// \param stiffness The stiffness to assign to the spring (in N.m-1) /// \exception SurgSim::Framework::AssertionFailure stiffness cannot be negative void setStiffness(double stiffness); /// Gets the spring stiffness parameter /// \return The stiffness assigned to the spring (in N.m-1) double getStiffness() const; /// Sets the spring damping parameter /// \param damping The damping to assign to the spring (in N.s.m-1) /// \exception SurgSim::Framework::AssertionFailure damping cannot be negative void setDamping(double damping); /// Gets the spring damping parameter /// \return The damping assigned to the spring (in N.s.m-1) double getDamping() const; /// Sets the rest length of the spring /// \param restLength The rest length to assign to the spring (in m) /// \exception SurgSim::Framework::AssertionFailure rest length cannot be negative void setRestLength(double restLength); /// Gets the rest length of the spring /// \return The rest length assigned to the spring (in m) double getRestLength() const; /// Adds the spring force (computed for a given state) to a complete system force vector F (assembly) /// \param state The state to compute the force with /// \param[in,out] F The complete system force vector to add the spring force into /// \param scale A factor to scale the added force with void addForce(const SurgSim::Math::OdeState& state, SurgSim::Math::Vector* F, double scale = 1.0) override; /// Adds the spring damping matrix D (= -df/dv) (computed for a given state) to a complete system damping matrix /// D (assembly) /// \param state The state to compute the damping matrix with /// \param[in,out] D The complete system damping matrix to add the spring damping matrix into /// \param scale A factor to scale the added damping matrix with void addDamping(const SurgSim::Math::OdeState& state, SurgSim::Math::SparseMatrix* D, double scale = 1.0) override; /// Adds the spring stiffness matrix K (= -df/dx) (computed for a given state) to a complete system stiffness /// matrix K (assembly) /// \param state The state to compute the stiffness matrix with /// \param[in,out] K The complete system stiffness matrix to add the spring stiffness matrix into /// \param scale A factor to scale the added stiffness matrix with void addStiffness(const SurgSim::Math::OdeState& state, SurgSim::Math::SparseMatrix* K, double scale = 1.0) override; /// Adds the spring force vector, mass, stiffness and damping matrices (computed for a given state) into a /// complete system data structure F, D, K (assembly) /// \param state The state to compute everything with /// \param[in,out] F The complete system force vector to add the spring force into /// \param[in,out] D The complete system damping matrix to add the spring damping matrix into /// \param[in,out] K The complete system stiffness matrix to add the spring stiffness matrix into void addFDK(const SurgSim::Math::OdeState& state, SurgSim::Math::Vector* F, SurgSim::Math::SparseMatrix* D, SurgSim::Math::SparseMatrix* K) override; /// Adds the spring matrix-vector contribution F += (alphaD.D + alphaK.K).x (computed for a given /// state) into a complete system data structure F (assembly) /// \param state The state to compute everything with /// \param alphaD The scaling factor for the damping contribution /// \param alphaK The scaling factor for the stiffness contribution /// \param vector A complete system vector to use as the vector in the matrix-vector multiplication /// \param[in,out] F The complete system force vector to add the element matrix-vector contribution into void addMatVec(const SurgSim::Math::OdeState& state, double alphaD, double alphaK, const SurgSim::Math::Vector& vector, SurgSim::Math::Vector* F) override; /// Comparison operator (equality) /// \param spring Spring to compare it to /// \return True if the 2 springs contains the same information, false otherwise /// \note Comparison is based on spring type, rest length, stiffness and damping coefficients ONLY bool operator ==(const Spring& spring) const; /// Comparison operator (inequality) /// \param spring Spring to compare it to /// \return False if the 2 springs contains the same information, true otherwise /// \note Comparison is based on spring type, rest length, stiffness and damping coefficients ONLY bool operator !=(const Spring& spring) const; protected: /// Compute the stiffness matrix Ke = -dF1/dx1 and damping matrix De = -dF1/dv1 of this spring for a given state, /// where this spring is defined by its 2 nodes positions {x1, x2}, velocities {v1, v2} and forces {F1, F2=-F1}. /// \param state The state to compute the jacobians from /// \param [out] De, Ke Respectively the damping and stiffness matrices De and Ke /// \return True if the matrices could be computed, False otherwise (current length is null) /// \note This method calculates only the 3x3 parts related to the force applied on the first node, /// \note derived w.r.t. first node. By nature, we have dF2/dx2 = dF1/dx1 = -dF1/dx2 = -dF2/dx1. bool computeDampingAndStiffness(const SurgSim::Math::OdeState& state, SurgSim::Math::Matrix33d* De, SurgSim::Math::Matrix33d* Ke); private: /// Rest length (in m) double m_restLength; /// Stiffness parameters (in N.m-1) double m_stiffness; /// Damping parameters (in N.s.m-1) double m_damping; }; }; // namespace Physics }; // namespace SurgSim #endif // SURGSIM_PHYSICS_LINEARSPRING_H opensurgsim-0.7.0/SurgSim/Physics/Localization.cpp000066400000000000000000000045211277777236100222650ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Physics/Localization.h" #include "SurgSim/DataStructures/Location.h" #include "SurgSim/Physics/Representation.h" namespace SurgSim { namespace Physics { Localization::Localization() { } Localization::Localization(std::shared_ptr representation) : m_representation(representation) { } Localization::~Localization() { } void Localization::setRepresentation(std::shared_ptr representation) { if (isValidRepresentation(representation)) { m_representation = representation; } else { SURGSIM_FAILURE() << "Unexpected representation type" << std::endl; } } std::shared_ptr Localization::getRepresentation() const { return m_representation; } Math::Vector3d Localization::calculatePosition(double time) const { SURGSIM_ASSERT(time >= 0.0 && time <= 1.0) << "Invalid time " << time << " out-of-range [0..1]"; return doCalculatePosition(time); } Math::Vector3d Localization::calculateVelocity(double time) const { SURGSIM_ASSERT(time >= 0.0 && time <= 1.0) << "Invalid time " << time << " out-of-range [0..1]"; return doCalculateVelocity(time); } bool Localization::isValidRepresentation(std::shared_ptr representation) { // Localization base class does not care about the type return true; } Math::RigidTransform3d Localization::getElementPose() { SURGSIM_FAILURE() << "Localization::getElementPose() is not implemented for " << getRepresentation()->getFullName(); return Math::RigidTransform3d(); } bool Localization::moveClosestTo(const Math::Vector3d& point, bool *hasReachedEnd) { SURGSIM_FAILURE() << "Localization::moveClosestTo() is not implemented for " << getRepresentation()->getFullName(); return false; } } } opensurgsim-0.7.0/SurgSim/Physics/Localization.h000066400000000000000000000102251277777236100217300ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_LOCALIZATION_H #define SURGSIM_PHYSICS_LOCALIZATION_H #include #include "SurgSim/Math/Vector.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Framework/Assert.h" namespace SurgSim { namespace DataStructures { struct Location; } namespace Physics { class Representation; /// This class localize a point on a representation (representation specific) class Localization { public: /// Default constructor Localization(); /// Constructor /// \param representation The representation on which the localization is defined explicit Localization(std::shared_ptr representation); /// Destructor virtual ~Localization(); /// Sets the representation /// \param representation The representation on which the localization is defined void setRepresentation(std::shared_ptr representation); /// Gets the representation /// \return The representation on which the localization is defined, nullptr if none has been defined std::shared_ptr getRepresentation() const; /// Calculates the global position of this localization /// \param time The time in [0..1] at which the position should be calculated /// \return The global position of the localization at the requested time /// \note time can useful when dealing with CCD /// \exception SurgSim::Framework::AssertionFailure if time is out-of-range [0..1] SurgSim::Math::Vector3d calculatePosition(double time = 1.0) const; /// Calculates the global velocity of this localization /// \param time The time in [0..1] at which the velocity should be calculated /// \return The global velocity of the localization at the requested time /// \note time can useful when dealing with CCD /// \exception SurgSim::Framework::AssertionFailure if time is out-of-range [0..1] SurgSim::Math::Vector3d calculateVelocity(double time = 1.0) const; virtual bool isValidRepresentation(std::shared_ptr representation); /// Find a pose that the localization is represented with respect to. /// In the case of a rigid representation, the pose of the representation is the pose returned. In case of a fem /// representation, the pose is calculated from the fem element which this localization is a part of. /// \return The pose that the localization is represented with respect to. virtual Math::RigidTransform3d getElementPose(); /// \param point Move this localization closest to this point /// \param hasReachedEnd [out] Flag to set, when the localization reaches the end of the representation. /// \return Whether the localization was moved or not. virtual bool moveClosestTo(const Math::Vector3d& point, bool *hasReachedEnd); private: /// Calculates the global position of this localization /// \param time The time in [0..1] at which the position should be calculated /// \return The global position of the localization at the requested time /// \note time can useful when dealing with CCD virtual SurgSim::Math::Vector3d doCalculatePosition(double time) const = 0; /// Calculates the global velocity of this localization /// \param time The time in [0..1] at which the velocity should be calculated /// \return The global velocity of the localization at the requested time /// \note time can useful when dealing with CCD virtual SurgSim::Math::Vector3d doCalculateVelocity(double time) const = 0; /// The representation on which the localization is defined std::shared_ptr m_representation; }; } // namespace Physics } // namespace SurgSim #endif // SURGSIM_PHYSICS_LOCALIZATION_H opensurgsim-0.7.0/SurgSim/Physics/Mass.h000066400000000000000000000033351277777236100202070ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_MASS_H #define SURGSIM_PHYSICS_MASS_H namespace SurgSim { namespace Physics { // Class to handle a mass of a MassSpring node class Mass { public: /// Constructor /// \param mass The mass (in Kg) default value is 0 explicit Mass(double mass = 0.0) : m_mass(mass) { } /// Sets the mass /// \param mass The mass to be stored (in Kg) void setMass(double mass) { m_mass = mass; } /// Gets the mass /// \return The mass stored (in Kg) double getMass() const { return m_mass; } /// Comparison operator (equality) /// \param m Mass to compare it to /// \return True if the 2 Mass contains the same information, false otherwise bool operator ==(const Mass& m) const { return (m_mass == m.m_mass); } /// Comparison operator (inequality) /// \param m Mass to compare it to /// \return False if the 2 Mass contains the same information, True otherwise bool operator !=(const Mass& m) const { return ! ((*this) == m); } protected: /// Mass (in kg) double m_mass; }; } // namespace Physics } // namespace SurgSim #endif // SURGSIM_PHYSICS_MASS_H opensurgsim-0.7.0/SurgSim/Physics/MassSpringConstraintFixedPoint.cpp000066400000000000000000000105531277777236100257640ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Physics/LinearSpring.h" #include "SurgSim/Physics/Localization.h" #include "SurgSim/Physics/MassSpringConstraintFixedPoint.h" #include "SurgSim/Physics/MassSpringLocalization.h" #include "SurgSim/Physics/MassSpringRepresentation.h" using SurgSim::Math::Vector3d; namespace SurgSim { namespace Physics { MassSpringConstraintFixedPoint::MassSpringConstraintFixedPoint() { } MassSpringConstraintFixedPoint::~MassSpringConstraintFixedPoint() { } void MassSpringConstraintFixedPoint::doBuild(double dt, const ConstraintData& data, const std::shared_ptr& localization, MlcpPhysicsProblem* mlcp, size_t indexOfRepresentation, size_t indexOfConstraint, ConstraintSideSign sign) { std::shared_ptr massSpring = std::static_pointer_cast(localization->getRepresentation()); if (!massSpring->isActive()) { return; } const double scale = (sign == CONSTRAINT_POSITIVE_SIDE) ? 1.0 : -1.0; size_t nodeId = std::static_pointer_cast(localization)->getLocalNode(); Vector3d globalPosition = localization->calculatePosition(); // Fixed point constraint in MCLP // n the number of dof in the Mass-Spring // p is the constrained point before free motion // pfree is the constrained point after free motion // vfree is the constrained point's velocity after free motion // v is the velocity in general // u is the position variation needed to enforce the constraint from the free motion // u' is the velocity variation needed to enforce the constraint from the free motion // target is defined as position to be constrained to (in this method, it corresponds to the other part of the // constraint that we don't have access to) // // The constraint equation is // C: pfree + u - target = 0 (note that the constraint is defined with 3 equations, each along an axis X-Y-Z) // // Using backward-Euler integration, the constraint can be expressed on the velocity level: // pfree = p + dt.vfree -> free motion // pfree + u = p + dt.[vfree + u'] -> free motion + constraint correction // => u = dt.u' // C: pfree - target + dt.u' = 0 // // Noting the system matrix S, the constraint matrix H = dC/dv is expressed on the velocity level as the // general system to solve is on the velocity level: // (S H^T) ( v ) = (Impulse) // (H 0 ) (-lambda) (initial constraint violation) // // H = dC/dv // The matrix H is of size 3xn (3 equations to fix each axis X-Y-Z relating to the n dof of the model) // The constraint only involves the velocity of a single node (the constrained node), so the matrix H // is full of zero except for a 3x3 part corresponding to the constrained node for which we have: // dC/du' = du/du' = dt.Id(3x3) // Update b with new violation: P(free motion) mlcp->b.segment<3>(indexOfConstraint) += globalPosition * scale; // m_newH is a SparseVector, so resizing is cheap. The object's memory also gets cleared. m_newH.resize(massSpring->getNumDof()); // m_newH is a member variable, so 'reserve' only needs to allocate memory on the first run. m_newH.reserve(3); for (size_t axis = 0; axis < 3; axis++) { m_newH.setZero(); m_newH.insert(3 * nodeId + axis) = dt * scale; mlcp->updateConstraint(m_newH, massSpring->getComplianceMatrix() * m_newH.transpose(), indexOfRepresentation, indexOfConstraint + axis); } } SurgSim::Physics::ConstraintType MassSpringConstraintFixedPoint::getConstraintType() const { return SurgSim::Physics::FIXED_3DPOINT; } size_t MassSpringConstraintFixedPoint::doGetNumDof() const { return 3; } }; // namespace Physics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/MassSpringConstraintFixedPoint.h000066400000000000000000000032361277777236100254310ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_MASSSPRINGCONSTRAINTFIXEDPOINT_H #define SURGSIM_PHYSICS_MASSSPRINGCONSTRAINTFIXEDPOINT_H #include "SurgSim/Physics/ConstraintImplementation.h" namespace SurgSim { namespace Physics { /// MassSpringRepresentation bilateral 3d constraint implementation. /// /// The family of FixedPoint constraints enforce equality between two points. class MassSpringConstraintFixedPoint : public ConstraintImplementation { public: /// Constructor MassSpringConstraintFixedPoint(); /// Destructor virtual ~MassSpringConstraintFixedPoint(); SurgSim::Physics::ConstraintType getConstraintType() const override; private: size_t doGetNumDof() const override; void doBuild(double dt, const ConstraintData& data, const std::shared_ptr& localization, MlcpPhysicsProblem* mlcp, size_t indexOfRepresentation, size_t indexOfConstraint, ConstraintSideSign sign) override; }; }; // namespace Physics }; // namespace SurgSim #endif // SURGSIM_PHYSICS_MASSSPRINGCONSTRAINTFIXEDPOINT_H opensurgsim-0.7.0/SurgSim/Physics/MassSpringConstraintFrictionlessContact.cpp000066400000000000000000000064341277777236100276760ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Physics/MassSpringConstraintFrictionlessContact.h" #include "SurgSim/Physics/ContactConstraintData.h" #include "SurgSim/Physics/ConstraintImplementation.h" #include "SurgSim/Physics/Localization.h" #include "SurgSim/Physics/MassSpringLocalization.h" namespace SurgSim { namespace Physics { MassSpringConstraintFrictionlessContact::MassSpringConstraintFrictionlessContact() { } MassSpringConstraintFrictionlessContact::~MassSpringConstraintFrictionlessContact() { } void MassSpringConstraintFrictionlessContact::doBuild(double dt, const ConstraintData& data, const std::shared_ptr& localization, MlcpPhysicsProblem* mlcp, size_t indexOfRepresentation, size_t indexOfConstraint, ConstraintSideSign sign) { using SurgSim::Math::Vector3d; auto massSpring = std::static_pointer_cast(localization->getRepresentation()); if (!massSpring->isActive()) { return; } size_t nodeId = std::static_pointer_cast(localization)->getLocalNode(); const double scale = (sign == CONSTRAINT_POSITIVE_SIDE) ? 1.0 : -1.0; auto& contactData = static_cast(data); const Vector3d& n = contactData.getNormal(); // FRICTIONLESS CONTACT in a LCP // (n, d) defines the plane of contact // p(t) the point of contact (usually after free motion) // // The constraint equation for a plane is // U(t) = n^t.p(t) + d >= 0 // // dU/dt = H.dp/dt // => H = n^t // Since the d term will be added to the constraint for one side of the contact and subtracted from the other, // and because it is not clear which distance should be used, we leave it out. // Update b with new violation U Vector3d globalPosition = localization->calculatePosition(); double violation = n.dot(globalPosition); mlcp->b[indexOfConstraint] += violation * scale; // m_newH is a SparseVector, so resizing is cheap. The object's memory also gets cleared. m_newH.resize(massSpring->getNumDof()); // m_newH is a member variable, so 'reserve' only needs to allocate memory on the first run. m_newH.reserve(3); m_newH.insert(3 * nodeId + 0) = n[0] * scale; m_newH.insert(3 * nodeId + 1) = n[1] * scale; m_newH.insert(3 * nodeId + 2) = n[2] * scale; mlcp->updateConstraint(m_newH, massSpring->getComplianceMatrix() * m_newH.transpose(), indexOfRepresentation, indexOfConstraint); } SurgSim::Physics::ConstraintType MassSpringConstraintFrictionlessContact::getConstraintType() const { return SurgSim::Physics::FRICTIONLESS_3DCONTACT; } size_t MassSpringConstraintFrictionlessContact::doGetNumDof() const { return 1; } }; // namespace Physics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/MassSpringConstraintFrictionlessContact.h000066400000000000000000000057001277777236100273360ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_MASSSPRINGCONSTRAINTFRICTIONLESSCONTACT_H #define SURGSIM_PHYSICS_MASSSPRINGCONSTRAINTFRICTIONLESSCONTACT_H #include "SurgSim/Physics/ConstraintData.h" #include "SurgSim/Physics/ConstraintImplementation.h" #include "SurgSim/Physics/MassSpringRepresentation.h" #include "SurgSim/Physics/Localization.h" namespace SurgSim { namespace Physics { /// MassSpring frictionless contact implementation. /// /// MassSpringConstraintFrictionlessContact implements the frictionless contact constraint for the /// MassSpringRepresentation, which prevents nodes from passing through a surface. /// See MassSpringConstraintFrictionlessContact::doBuild for more information. class MassSpringConstraintFrictionlessContact : public ConstraintImplementation { public: /// Constructor MassSpringConstraintFrictionlessContact(); /// Destructor virtual ~MassSpringConstraintFrictionlessContact(); /// Gets the constraint type for this ConstraintImplementation /// \return The constraint type corresponding to this constraint implementation SurgSim::Physics::ConstraintType getConstraintType() const override; private: /// Gets the number of degrees of freedom for a frictionless contact. /// \return 1, as a frictionless contact only has 1 equation of constraint (along the normal direction). size_t doGetNumDof() const override; /// Adds a mass-spring frictionless contact constraint to an MlcpPhysicsProblem. /// \param dt The time step. /// \param data [ContactConstraintData] Plane defining the constraint. /// \param localization [MassSpringRepresentationLocalization] Location and Representation to be constrained. /// \param [in, out] mlcp The Mixed LCP physics problem to fill up. /// \param indexOfRepresentation The index of the representation (associated to this implementation) in the mlcp. /// \param indexOfConstraint The index of the constraint in the mlcp. /// \param sign The sign of this implementation in the constraint (positive or negative side). void doBuild(double dt, const ConstraintData& data, const std::shared_ptr& localization, MlcpPhysicsProblem* mlcp, size_t indexOfRepresentation, size_t indexOfConstraint, ConstraintSideSign sign) override; }; }; // namespace Physics }; // namespace SurgSim #endif // SURGSIM_PHYSICS_MASSSPRINGCONSTRAINTFRICTIONLESSCONTACT_H opensurgsim-0.7.0/SurgSim/Physics/MassSpringLocalization.cpp000066400000000000000000000067671277777236100243120ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Physics/MassSpringLocalization.h" #include "SurgSim/Math/OdeState.h" #include "SurgSim/Math/Vector.h" namespace SurgSim { namespace Physics { MassSpringLocalization::MassSpringLocalization() { } MassSpringLocalization::MassSpringLocalization( std::shared_ptr representation) : Localization() { setRepresentation(representation); } MassSpringLocalization::~MassSpringLocalization() { } void MassSpringLocalization::setLocalNode(size_t nodeID) { m_nodeID = nodeID; } const size_t& MassSpringLocalization::getLocalNode() const { return m_nodeID; } SurgSim::Math::Vector3d MassSpringLocalization::doCalculatePosition(double time) const { std::shared_ptr massSpringRepresentation = std::static_pointer_cast(getRepresentation()); SURGSIM_ASSERT(massSpringRepresentation != nullptr) << "MassSpringRepresentation is null, it was probably not" << " initialized"; if (time <= std::numeric_limits::epsilon()) { return massSpringRepresentation->getPreviousState()->getPosition(m_nodeID); } else if (time >= 1.0 - std::numeric_limits::epsilon()) { return massSpringRepresentation->getCurrentState()->getPosition(m_nodeID); } const SurgSim::Math::Vector3d& currentPoint = massSpringRepresentation->getCurrentState()->getPosition(m_nodeID); const SurgSim::Math::Vector3d& previousPoint = massSpringRepresentation->getPreviousState()->getPosition(m_nodeID); return SurgSim::Math::interpolate(previousPoint, currentPoint, time); } SurgSim::Math::Vector3d MassSpringLocalization::doCalculateVelocity(double time) const { std::shared_ptr massSpringRepresentation = std::static_pointer_cast(getRepresentation()); SURGSIM_ASSERT(massSpringRepresentation != nullptr) << "MassSpringRepresentation is null, it was probably not" << " initialized"; if (time <= std::numeric_limits::epsilon()) { return massSpringRepresentation->getPreviousState()->getVelocity(m_nodeID); } else if (time >= 1.0 - std::numeric_limits::epsilon()) { return massSpringRepresentation->getCurrentState()->getVelocity(m_nodeID); } const SurgSim::Math::Vector3d& currentPoint = massSpringRepresentation->getCurrentState()->getVelocity(m_nodeID); const SurgSim::Math::Vector3d& previousPoint = massSpringRepresentation->getPreviousState()->getVelocity(m_nodeID); return SurgSim::Math::interpolate(previousPoint, currentPoint, time); } bool MassSpringLocalization::isValidRepresentation(std::shared_ptr representation) { std::shared_ptr massSpringRepresentation = std::dynamic_pointer_cast(representation); // Allows to reset the representation to nullptr ... return (massSpringRepresentation != nullptr || representation == nullptr); } }; // Physics }; // SurgSim opensurgsim-0.7.0/SurgSim/Physics/MassSpringLocalization.h000066400000000000000000000062041277777236100237410ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_MASSSPRINGLOCALIZATION_H #define SURGSIM_PHYSICS_MASSSPRINGLOCALIZATION_H #include "SurgSim/Physics/Localization.h" #include "SurgSim/Physics/MassSpringRepresentation.h" namespace SurgSim { namespace Physics { /// Implementation of Localization for MassSpringRepresentation /// /// MassSpringLocalization tracks the global coordinates of a node contained in an associated /// MassSpringRepresentation. It is used, for example, as a helper class for filling out the MlcpPhysicsProblem in /// MassSpringRepresentationContact::doBuild, which constrains the motion of MassSpringRepresentation at a frictionless /// contact. /// /// MassSpringLocalization stores a pointer to a MassSpringRepresentation in an abstract Representation /// object. It tracks the ID of a node contained within the associated MassSpringRepresentation, and it provides a /// helper function MassSpringLocalization::calculatePosition to find the node's position in global /// coordinates in the current state. class MassSpringLocalization: public Localization { public: /// Default constructor MassSpringLocalization(); /// Constructor /// \param representation The representation to assign to this localization. explicit MassSpringLocalization(std::shared_ptr representation); /// Destructor virtual ~MassSpringLocalization(); /// Sets the local node. /// \param nodeID Node set for this localization. void setLocalNode(size_t nodeID); /// Gets the local node. /// \return Node set for this localization. const size_t& getLocalNode() const; /// Queries whether Representation can be assigned to this class. /// \param representation Representation to check. /// \return true if Representation is valid. bool isValidRepresentation(std::shared_ptr representation) override; private: /// Calculates the global position of this localization. /// \param time Interpolation parameter [0..1] for calcuting position between the previous state (0.0) and current /// state (1.0). /// \return The global position of the localization using an interpolation between the previous and current states. /// \note The time parameter can useful when dealing with Continuous Collision Detection. SurgSim::Math::Vector3d doCalculatePosition(double time) const override; SurgSim::Math::Vector3d doCalculateVelocity(double time) const override; /// Node defining the localization. size_t m_nodeID; }; }; // namespace Physics }; // namespace SurgSim #endif // SURGSIM_PHYSICS_MASSSPRINGLOCALIZATION_H opensurgsim-0.7.0/SurgSim/Physics/MassSpringRepresentation.cpp000066400000000000000000000341101277777236100246430ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Framework/Assert.h" #include "SurgSim/Math/Matrix.h" #include "SurgSim/Math/OdeState.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/DataStructures/Location.h" #include "SurgSim/Physics/MassSpringLocalization.h" #include "SurgSim/Physics/MassSpringRepresentation.h" using SurgSim::DataStructures::Location; using SurgSim::Math::Vector; using SurgSim::Math::Matrix; using SurgSim::Math::SparseMatrix; namespace SurgSim { namespace Physics { MassSpringRepresentation::MassSpringRepresentation(const std::string& name) : DeformableRepresentation(name) { m_rayleighDamping.massCoefficient = 0.0; m_rayleighDamping.stiffnessCoefficient = 0.0; // Reminder: m_numDofPerNode is held by DeformableRepresentation // but needs to be set by all concrete derived classes m_numDofPerNode = 3; } MassSpringRepresentation::~MassSpringRepresentation() { } bool MassSpringRepresentation::doInitialize() { // DeformableRepresentation::doInitialize will // 1) assert if initial state is not set // 2) transform m_initialState properly with the initial pose // => Spring::initialize(m_initialState) is using the correct transformed state if (!DeformableRepresentation::doInitialize()) { return false; } // Initialize the Springs for (auto spring : m_springs) { spring->initialize(*m_initialState); } // Precompute the sparsity pattern for the global arrays. M is diagonal, the // rest need to be calculated. m_M.resize(static_cast(getNumDof()), static_cast(getNumDof())); m_D.resize(static_cast(getNumDof()), static_cast(getNumDof())); m_K.resize(static_cast(getNumDof()), static_cast(getNumDof())); for (auto& spring : m_springs) { Math::Matrix block = Math::Matrix::Zero(getNumDofPerNode(), getNumDofPerNode()); for (auto nodeId1 : spring->getNodeIds()) { for (auto nodeId2 : spring->getNodeIds()) { Math::addSubMatrix(block, static_cast(nodeId1), static_cast(nodeId2), &m_D, true); Math::addSubMatrix(block, static_cast(nodeId1), static_cast(nodeId2), &m_K, true); } } } m_M.setIdentity(); m_M.makeCompressed(); Math::clearMatrix(&m_M); m_D.makeCompressed(); m_K.makeCompressed(); return true; } void MassSpringRepresentation::addMass(const std::shared_ptr mass) { m_masses.push_back(mass); } void MassSpringRepresentation::addSpring(const std::shared_ptr spring) { m_springs.push_back(spring); } size_t MassSpringRepresentation::getNumMasses() const { return m_masses.size(); } size_t MassSpringRepresentation::getNumSprings() const { return m_springs.size(); } std::shared_ptr MassSpringRepresentation::getMass(size_t nodeId) { SURGSIM_ASSERT(nodeId < getNumMasses()) << "Invalid node id to request a mass from"; return m_masses[nodeId]; } std::shared_ptr MassSpringRepresentation::getSpring(size_t springId) { SURGSIM_ASSERT(springId < getNumSprings()) << "Invalid spring id"; return m_springs[springId]; } double MassSpringRepresentation::getTotalMass() const { double mass = 0.0; for (auto it = std::begin(m_masses); it != std::end(m_masses); it++) { mass += (*it)->getMass(); } return mass; } double MassSpringRepresentation::getRayleighDampingStiffness() const { return m_rayleighDamping.stiffnessCoefficient; } double MassSpringRepresentation::getRayleighDampingMass() const { return m_rayleighDamping.massCoefficient; } void MassSpringRepresentation::setRayleighDampingStiffness(double stiffnessCoef) { m_rayleighDamping.stiffnessCoefficient = stiffnessCoef; } void MassSpringRepresentation::setRayleighDampingMass(double massCoef) { m_rayleighDamping.massCoefficient = massCoef; } void MassSpringRepresentation::addExternalGeneralizedForce(std::shared_ptr localization, const SurgSim::Math::Vector& generalizedForce, const SurgSim::Math::Matrix& K, const SurgSim::Math::Matrix& D) { std::shared_ptr localization3D = std::dynamic_pointer_cast(localization); SURGSIM_ASSERT(localization3D != nullptr) << "Invalid localization type (not a MassSpringLocalization)"; const size_t dofPerNode = getNumDofPerNode(); const size_t nodeId = localization3D->getLocalNode(); SURGSIM_ASSERT(nodeId >= 0 && nodeId < getNumMasses()) << "Invalid nodeId " << nodeId << ". Valid range is {0.." << getNumMasses() << "}"; m_externalGeneralizedForce.segment(dofPerNode * nodeId, dofPerNode) += generalizedForce; Math::addSubMatrix(K, static_cast(nodeId), static_cast(nodeId), &m_externalGeneralizedStiffness, true); Math::addSubMatrix(D, static_cast(nodeId), static_cast(nodeId), &m_externalGeneralizedDamping, true); m_hasExternalGeneralizedForce = true; } void MassSpringRepresentation::beforeUpdate(double dt) { // Call the DeformableRepresentation implementation DeformableRepresentation::beforeUpdate(dt); if (! isActive()) { return; } SURGSIM_ASSERT(3 * getNumMasses() == getNumDof()) << "Mismatch between the number of masses (" << getNumMasses() << ") and the number of dof (" << getNumDof() << ")"; SURGSIM_ASSERT(getNumMasses()) << "No masses specified yet, call addMass() prior to running the simulation"; SURGSIM_ASSERT(getNumSprings()) << "No springs specified yet, call addSpring() prior to running the simulation"; SURGSIM_ASSERT(getNumDof()) << "State has not been initialized yet, call setInitialState() " << "prior to running the simulation"; } void MassSpringRepresentation::computeF(const SurgSim::Math::OdeState& state) { // Make sure the force vector has been properly allocated and zeroed out m_f.setZero(state.getNumDof()); addGravityForce(&m_f, state); addRayleighDampingForce(&m_f, state); addSpringsForce(&m_f, state); // Add external generalized force if (m_hasExternalGeneralizedForce) { m_f += m_externalGeneralizedForce; } } void MassSpringRepresentation::computeM(const SurgSim::Math::OdeState& state) { using SurgSim::Math::Vector3d; using SurgSim::Math::setSubVector; // Make sure the mass matrix has been properly allocated Math::clearMatrix(&m_M); for (SparseMatrix::Index massId = 0; massId < static_cast(getNumMasses()); massId++) { m_M.coeffRef(3 * massId, 3 * massId) = getMass(massId)->getMass(); m_M.coeffRef(3 * massId + 1, 3 * massId + 1) = getMass(massId)->getMass(); m_M.coeffRef(3 * massId + 2, 3 * massId + 2) = getMass(massId)->getMass(); } } void MassSpringRepresentation::computeD(const SurgSim::Math::OdeState& state) { using SurgSim::Math::Vector3d; using SurgSim::Math::setSubVector; const double& rayleighStiffness = m_rayleighDamping.stiffnessCoefficient; const double& rayleighMass = m_rayleighDamping.massCoefficient; // Make sure the damping matrix has been properly allocated and zeroed out Math::clearMatrix(&m_D); // D += rayleighMass.M if (rayleighMass != 0.0) { for (SparseMatrix::Index massId = 0; massId < static_cast(getNumMasses()); massId++) { double coef = rayleighMass * getMass(massId)->getMass(); m_D.coeffRef(3 * massId, 3 * massId) = coef; m_D.coeffRef(3 * massId + 1, 3 * massId + 1) = coef; m_D.coeffRef(3 * massId + 2, 3 * massId + 2) = coef; } } // D += rayleighStiffness.K if (rayleighStiffness != 0.0) { for (auto spring = std::begin(m_springs); spring != std::end(m_springs); spring++) { (*spring)->addStiffness(state, &m_D, rayleighStiffness); } } // D += Springs damping matrix for (auto spring = std::begin(m_springs); spring != std::end(m_springs); spring++) { (*spring)->addDamping(state, &m_D); } // Add external generalized damping if (m_hasExternalGeneralizedForce) { m_D += m_externalGeneralizedDamping; } } void MassSpringRepresentation::computeK(const SurgSim::Math::OdeState& state) { // Make sure the stiffness matrix has been properly allocated and zeroed out Math::clearMatrix(&m_K); for (auto spring = std::begin(m_springs); spring != std::end(m_springs); spring++) { (*spring)->addStiffness(state, &m_K); } // Add external generalized stiffness if (m_hasExternalGeneralizedForce) { m_K += m_externalGeneralizedStiffness; } } void MassSpringRepresentation::computeFMDK(const SurgSim::Math::OdeState& state) { using SurgSim::Math::addSubVector; // Make sure the force vector has been properly allocated and zeroed out m_f.setZero(state.getNumDof()); // Make sure the mass matrix has been properly allocated Math::clearMatrix(&m_M); // Make sure the damping matrix has been properly allocated and zeroed out Math::clearMatrix(&m_D); // Make sure the stiffness matrix has been properly allocated and zeroed out Math::clearMatrix(&m_K); // Computes the mass matrix m_M computeM(state); // Computes the stiffness matrix m_K // Add the springs damping matrix to m_D // Add the springs force to m_f for (auto spring = std::begin(m_springs); spring != std::end(m_springs); spring++) { (*spring)->addFDK(state, &m_f, &m_D, &m_K); } // Add the Rayleigh damping matrix if (m_rayleighDamping.massCoefficient) { for (SparseMatrix::Index diagonal = 0; diagonal < static_cast(state.getNumDof()); ++diagonal) { m_D.coeffRef(diagonal, diagonal) += m_M.coeff(diagonal, diagonal) * m_rayleighDamping.massCoefficient; } } if (m_rayleighDamping.stiffnessCoefficient) { m_D += m_K * m_rayleighDamping.stiffnessCoefficient; } // Add the gravity to m_f addGravityForce(&m_f, state); // Add the Rayleigh damping force to m_f (using the damping matrix) addRayleighDampingForce(&m_f, state, true, true); // Add external generalized force, stiffness and damping if (m_hasExternalGeneralizedForce) { m_f += m_externalGeneralizedForce; m_K += m_externalGeneralizedStiffness; m_D += m_externalGeneralizedDamping; } } void MassSpringRepresentation::addRayleighDampingForce(Vector* force, const SurgSim::Math::OdeState& state, bool useGlobalStiffnessMatrix, bool useGlobalMassMatrix, double scale) { using SurgSim::Math::getSubVector; using SurgSim::Math::addSubVector; using SurgSim::Math::getSubMatrix; // Temporary variables for convenience double& rayleighMass = m_rayleighDamping.massCoefficient; double& rayleighStiffness = m_rayleighDamping.stiffnessCoefficient; const Vector& v = state.getVelocities(); // Rayleigh damping mass: F = - rayleighMass.M.v(t) if (rayleighMass != 0.0) { // If we have the mass matrix, we can compute directly F = -rayleighMass.M.v(t) if (useGlobalMassMatrix) { // M is diagonal, take advantage of it... *force -= (scale * rayleighMass) * (m_M.diagonal().cwiseProduct(v)); } else { for (size_t nodeID = 0; nodeID < getNumMasses(); nodeID++) { double mass = getMass(nodeID)->getMass(); SurgSim::Math::Vector3d f = - scale * rayleighMass * mass * getSubVector(v, nodeID, 3); addSubVector(f, nodeID, 3, force); } } } // Rayleigh damping stiffness: F = - rayleighStiffness.K.v(t) if (rayleighStiffness != 0.0) { if (useGlobalStiffnessMatrix) { Math::Vector tempVector = (scale * rayleighStiffness) * (m_K * v); *force -= tempVector; } else { // Otherwise, we loop through each fem element to compute its contribution for (auto spring = std::begin(m_springs); spring != std::end(m_springs); ++spring) { (*spring)->addMatVec(state, 0.0, - scale * rayleighStiffness, v, force); } } } } void MassSpringRepresentation::addSpringsForce(Vector* force, const SurgSim::Math::OdeState& state, double scale) { for (auto spring = std::begin(m_springs); spring != std::end(m_springs); spring++) { (*spring)->addForce(state, force, scale); } } void MassSpringRepresentation::addGravityForce(Vector* f, const SurgSim::Math::OdeState& state, double scale) { using SurgSim::Math::addSubVector; if (isGravityEnabled()) { for (size_t massId = 0; massId < getNumMasses(); massId++) { addSubVector(getGravity() * getMass(massId)->getMass(), massId, 3, f); } } } static void transformVectorByBlockOf3(const SurgSim::Math::RigidTransform3d& transform, Vector* x, bool rotationOnly = false) { size_t numNodes = x->size() / 3; SURGSIM_ASSERT(static_cast(numNodes * 3) == x->size()) << "Unexpected number of dof in a MassSpring state vector (not a multiple of 3)"; for (size_t nodeId = 0; nodeId < numNodes; nodeId++) { SurgSim::Math::Vector3d xi = SurgSim::Math::getSubVector(*x, nodeId, 3); SurgSim::Math::Vector3d xiTransformed; if (rotationOnly) { xiTransformed = transform.linear() * xi; } else { xiTransformed = transform * xi; } SurgSim::Math::setSubVector(xiTransformed, nodeId, 3, x); } } void MassSpringRepresentation::transformState(std::shared_ptr state, const SurgSim::Math::RigidTransform3d& transform) { transformVectorByBlockOf3(transform, &state->getPositions()); transformVectorByBlockOf3(transform, &state->getVelocities(), true); } std::shared_ptr MassSpringRepresentation::createLocalization( const SurgSim::DataStructures::Location& location) { auto result = std::make_shared( std::static_pointer_cast(getSharedPtr())); if (location.index.hasValue()) { result->setLocalNode(*location.index); } else { SURGSIM_FAILURE() << "Invalid location to create a MassSpringLocalization" << std::endl; } return result; } } // namespace Physics } // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/MassSpringRepresentation.h000066400000000000000000000155461277777236100243240ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_MASSSPRINGREPRESENTATION_H #define SURGSIM_PHYSICS_MASSSPRINGREPRESENTATION_H #include #include "SurgSim/Physics/DeformableRepresentation.h" #include "SurgSim/Physics/Mass.h" #include "SurgSim/Physics/Spring.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Math/Matrix.h" namespace SurgSim { namespace Physics { /// MassSpring model is a deformable model (a set of masses connected by springs). /// \note A MassSpring is a DeformableRepresentation (Physics::Representation and Math::OdeEquation) /// \note Therefore, it defines a dynamic system M.a=F(x,v) with the particularity that M is diagonal /// \note The model handles damping through the Rayleigh damping (where damping is a combination of mass and stiffness) class MassSpringRepresentation : public DeformableRepresentation { public: /// Constructor /// \param name The name of the MassSpringRepresentation explicit MassSpringRepresentation(const std::string& name); /// Destructor virtual ~MassSpringRepresentation(); /// Adds a mass /// \param mass The mass to add to the representation /// \note Masses are kept in an ordered list, giving them an index /// \note This mass will be associated with the node of same index in any associated OdeState void addMass(const std::shared_ptr mass); /// Adds a spring /// \param spring The spring to add to the representation void addSpring(const std::shared_ptr spring); /// Gets the number of masses /// \return the number of masses size_t getNumMasses() const; /// Gets the number of springs /// \return the number of springs size_t getNumSprings() const; /// Retrieves the mass of a given node /// \param nodeId The node id for which the mass is requested /// \return the mass attribute of a node /// \note The mass is returned with read/write access /// \note Out of range nodeId will raise an exception std::shared_ptr getMass(size_t nodeId); /// Retrieves a given spring from its id /// \param springId The spring id for which the spring is requested /// \return the spring for the given springId /// \note The spring is returned with read/write access /// \note Out of range springId will raise an exception std::shared_ptr getSpring(size_t springId); /// Gets the total mass of the mass spring /// \return The total mass of the mass spring (in Kg) double getTotalMass() const; /// Gets the Rayleigh stiffness parameter /// \return The Rayleigh stiffness parameter double getRayleighDampingStiffness() const; /// Gets the Rayleigh mass parameter /// \return The Rayleigh mass parameter double getRayleighDampingMass() const; /// Sets the Rayleigh stiffness parameter /// \param stiffnessCoef The Rayleigh stiffness parameter void setRayleighDampingStiffness(double stiffnessCoef); /// Sets the Rayleigh mass parameter /// \param massCoef The Rayleigh mass parameter void setRayleighDampingMass(double massCoef); void addExternalGeneralizedForce(std::shared_ptr localization, const SurgSim::Math::Vector& generalizedForce, const SurgSim::Math::Matrix& K = SurgSim::Math::Matrix(), const SurgSim::Math::Matrix& D = SurgSim::Math::Matrix()) override; /// Preprocessing done before the update call /// \param dt The time step (in seconds) void beforeUpdate(double dt) override; std::shared_ptr createLocalization(const SurgSim::DataStructures::Location& location) override; protected: /// Add the Rayleigh damping forces /// \param[in,out] f The force vector to cumulate the Rayleigh damping force into /// \param state The state vector containing positions and velocities /// \param useGlobalMassMatrix, useGlobalStiffnessMatrix True indicates that the global mass and stiffness matrices /// should be used (F = -c.M.v - d.K.v) /// \param scale A scaling factor to apply on the damping force /// \note Damping matrix D = c.M + d.K (Rayleigh damping definition) /// \note F = - D.v = -c.M.v - d.K.v /// \note If {useGlobalMassMatrix | useGlobalStiffnessMatrix} is True, {M | K} will be used, otherwise /// \note the {mass|stiffness} component will be computed FemElement by FemElement void addRayleighDampingForce(SurgSim::Math::Vector* f, const SurgSim::Math::OdeState& state, bool useGlobalStiffnessMatrix = false, bool useGlobalMassMatrix = false, double scale = 1.0); /// Add the springs force to f (given a state) /// \param[in,out] f The force vector to cumulate the spring forces into /// \param state The state vector containing positions and velocities /// \param scale A scaling factor to scale the spring forces with void addSpringsForce(SurgSim::Math::Vector* f, const SurgSim::Math::OdeState& state, double scale = 1.0); /// Add the gravity force to f (given a state) /// \param[in,out] f The force vector to cumulate the gravity force into /// \param state The state vector containing positions and velocities /// \param scale A scaling factor to scale the gravity force with /// \note This method does not do anything if gravity is disabled void addGravityForce(SurgSim::Math::Vector* f, const SurgSim::Math::OdeState& state, double scale = 1.0); /// Transform a state using a given transformation /// \param[in,out] state The state to be transformed /// \param transform The transformation to apply void transformState(std::shared_ptr state, const SurgSim::Math::RigidTransform3d& transform); bool doInitialize() override; void computeF(const SurgSim::Math::OdeState& state) override; void computeM(const SurgSim::Math::OdeState& state) override; void computeD(const SurgSim::Math::OdeState& state) override; void computeK(const SurgSim::Math::OdeState& state) override; void computeFMDK(const SurgSim::Math::OdeState& state) override; private: /// Masses std::vector> m_masses; /// Springs std::vector> m_springs; /// Rayleigh damping parameters (massCoefficient and stiffnessCoefficient) /// D = massCoefficient.M + stiffnessCoefficient.K /// Matrices: D = damping, M = mass, K = stiffness struct { double massCoefficient; double stiffnessCoefficient; } m_rayleighDamping; }; } // namespace Physics } // namespace SurgSim #endif // SURGSIM_PHYSICS_MASSSPRINGREPRESENTATION_H opensurgsim-0.7.0/SurgSim/Physics/MlcpMapping.h000066400000000000000000000033341277777236100215120ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_MLCPMAPPING_H #define SURGSIM_PHYSICS_MLCPMAPPING_H #include namespace SurgSim { namespace Physics { template class MlcpMapping { public: MlcpMapping(){} /// Clear the mapping void clear() { m_indexMapping.clear(); } /// Sets the key/value (add an entry if the key is not found, change the value otherwise) void setValue(const T* key, size_t value) { typename std::unordered_map::iterator found = m_indexMapping.find(key); if (found == m_indexMapping.end()) { m_indexMapping.insert(std::make_pair(key, value)); } else { (*found).second = value; } } /// Gets the value from a given key ptrdiff_t getValue(const T* key) const { typename std::unordered_map::const_iterator returnValue = m_indexMapping.find(key); return (returnValue == m_indexMapping.end() ? -1 : (*returnValue).second); } private: /// The index mapping data structure std::unordered_map m_indexMapping; }; }; // Physics }; // SurgSim #endif // SURGSIM_PHYSICS_MLCPMAPPING_H opensurgsim-0.7.0/SurgSim/Physics/MlcpPhysicsProblem.cpp000066400000000000000000000044221277777236100234140ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Math/SparseMatrix.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/MlcpPhysicsProblem.h" namespace SurgSim { namespace Physics { MlcpPhysicsProblem::~MlcpPhysicsProblem() { } void MlcpPhysicsProblem::setZero(size_t numDof, size_t numConstraintDof, size_t numConstraints) { MlcpProblem::setZero(numDof, numConstraintDof, numConstraints); H.resize(numConstraintDof, numDof); CHt.setZero(numDof, numConstraintDof); } MlcpPhysicsProblem MlcpPhysicsProblem::Zero(size_t numDof, size_t numConstraintDof, size_t numConstraints) { MlcpPhysicsProblem result; result.setZero(numDof, numConstraintDof, numConstraints); return result; } void MlcpPhysicsProblem::updateConstraint( const Eigen::SparseVector& newSubH, const Vector& newCHt, size_t indexSubC, size_t indexNewSubH) { // Update H, CHt, and HCHt with newSubH, denoted H'. // // Note that updates are linear for H and CHt, but not for HCHt: // (H+H') = H+H' // => H += H'; // // C(H+H')t = CHt + CH't // => CHt += CH't; // // (H+H')C(H+H')t = HCHt + HCH't + H'C(H+H')t // => HCHt += H(CH't) + H'[C(H+H')t]; A.col(indexNewSubH) += H.middleCols(indexSubC, newCHt.rows()) * newCHt; // Calculate: H.block(indexNewSubH, indexSubC, 1, newCHt.rows()) += newSubH; for (Eigen::SparseVector::InnerIterator it(newSubH); it; ++it) { H.coeffRef(indexNewSubH, indexSubC + it.index()) += it.value(); } CHt.block(indexSubC, indexNewSubH, newCHt.rows(), 1) += newCHt; A.row(indexNewSubH) += newSubH * CHt.middleRows(indexSubC, newCHt.rows()); } }; // namespace Physics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/MlcpPhysicsProblem.h000066400000000000000000000105701277777236100230620ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_MLCPPHYSICSPROBLEM_H #define SURGSIM_PHYSICS_MLCPPHYSICSPROBLEM_H #include "SurgSim/Math/MlcpProblem.h" #include "SurgSim/Math/SparseMatrix.h" namespace SurgSim { namespace Physics { /// A description of a physical mixed LCP system to be solved. /// /// This extends \ref SurgSim::Math::MlcpProblem "the pure mathematical MLCP problem" by storing the intermediate /// matrices \ref H and \ref CHt that are necessary to physically interpret the solution. /// /// Note that the matrix \f$\mathbf{A}\f$ used in the MlcpProblem is computed in the physical problem as /// \f$\mathbf{H\;C\;H^T}\f$, where \f$\mathbf{C}\f$ is the compliance matrix. For contact constraints, \f$b\f$ is /// the initial signed displacements between the colliding representations, \f$b_i \lt 0\f$ when the representations /// interpenetrate, \f$x\f$ is the forces to apply at each contact to prevent penetration, and \f$c\f$ is the signed /// displacements after the forces are applied. /// \note The solution to the MLCP will only address the constraints that were provided, and application of \f$x\f$ to /// the representations in the scene may cause new collisions for constraints that were not originally incorporated in /// the MLCP. /// /// \sa SurgSim::Math::MlcpProblem struct MlcpPhysicsProblem : public SurgSim::Math::MlcpProblem { /// Destructor ~MlcpPhysicsProblem() override; /// The matrix \f$\mathbf{H}\f$, which is a matrix of size \f$c\times n\f$ that converts from /// the \f$n\f$ degrees of freedom in the system (i.e., the sum of all the DOF over all the representations in the /// scene), to the /// \f$c\f$ degrees of freedom summed over all the constraints being applied to the system. /// It is used to convert the vector of \f$n\f$ displacements of each degree of freedom of the system to the vector /// of \f$c\f$ displacements of each degree of freedom of the constraints. /// Given a set of constraints \f$\mathbf{G}(t, \mathbf{x})\f$, then /// \f$\mathbf{H} = \frac{d \mathbf{G}}{d \mathbf{x}}\f$ (i.e., the constraints' tangential space). Eigen::SparseMatrix H; /// The matrix \f$\mathbf{C\;H^T}\f$, which is a matrix of size \f$n\times c\f$ that is used to convert the /// vector of \f$c\f$ constraint forces to the \f$n\f$ displacements of each degree of freedom of the system. Matrix CHt; /// Applies a new constraint to a specific Representation /// \param newSubH New constraint to be added to H /// \param newCHt Compliance matrix (system matrix inverse) times newSubH /// \param indexSubC Index of the Representation's compliance matrix /// \param indexNewSubH Index of the new constraint within H void updateConstraint( const Eigen::SparseVector& newSubH, const Vector& newCHt, size_t indexSubC, size_t indexNewSubH); /// Resize an MlcpPhysicsProblem and set to zero. /// \param numDof the total degrees of freedom. /// \param numConstraintDof the total constrained degrees of freedom. /// \param numConstraints the number of constraints. void setZero(size_t numDof, size_t numConstraintDof, size_t numConstraints) override; /// Initialize an MlcpPhysicsProblem with zero values. /// \param numDof the total degrees of freedom for the MlcpPhysicsProblem to be constructed. /// \param numConstraintDof the total constrained degrees of freedom for the MlcpPhysicsProblem to be constructed. /// \param numConstraints the number of constraints for the MlcpPhysicsProblem to be constructed. /// \return An MlcpPhysicsProblem appropriately sized and initialized to zero. static MlcpPhysicsProblem Zero(size_t numDof, size_t numConstraintDof, size_t numConstraints); }; }; // namespace Physics }; // namespace SurgSim #endif // SURGSIM_PHYSICS_MLCPPHYSICSPROBLEM_H opensurgsim-0.7.0/SurgSim/Physics/MlcpPhysicsSolution.h000066400000000000000000000027651277777236100233050ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_MLCPPHYSICSSOLUTION_H #define SURGSIM_PHYSICS_MLCPPHYSICSSOLUTION_H #include "SurgSim/Math/MlcpSolution.h" namespace SurgSim { namespace Physics { /// The description of a solution to a \ref MlcpPhysicsProblem "physical MLCP problem". /// /// The solution consists of a \ref SurgSim::Math::MlcpSolution "mathematical solution for the MLCP" and /// the vector \ref dofCorrection containing the displacements (corrections) for each degree of freedom /// present in the system. /// /// \sa SurgSim::Math::MlcpSolution, MlcpPhysicsProblem, SurgSim::Math::MlcpSolver struct MlcpPhysicsSolution: public SurgSim::Math::MlcpSolution { /// Corrections to all of the degrees of freedom needed to satisfy the system equations. Vector dofCorrection; }; }; // namespace Physics }; // namespace SurgSim #endif // SURGSIM_PHYSICS_MLCPPHYSICSSOLUTION_H opensurgsim-0.7.0/SurgSim/Physics/ParticleCollisionResponse.cpp000066400000000000000000000026071277777236100247760ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include "SurgSim/Particles/Representation.h" #include "SurgSim/Physics/ParticleCollisionResponse.h" #include "SurgSim/Physics/PhysicsManagerState.h" namespace SurgSim { namespace Physics { ParticleCollisionResponse::ParticleCollisionResponse(bool doCopyState) : Computation(doCopyState) { } std::shared_ptr ParticleCollisionResponse::doUpdate(const double& dt, const std::shared_ptr& state) { std::shared_ptr result = state; auto& particleRepresentations = result->getActiveParticleRepresentations(); for (auto& representation : particleRepresentations) { representation->handleCollisions(dt); } return result; } }; // Physics }; // SurgSim opensurgsim-0.7.0/SurgSim/Physics/ParticleCollisionResponse.h000066400000000000000000000027521277777236100244440ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_PARTICLECOLLISIONRESPONSE_H #define SURGSIM_PHYSICS_PARTICLECOLLISIONRESPONSE_H #include #include "SurgSim/Framework/Macros.h" #include "SurgSim/Physics/Computation.h" namespace SurgSim { namespace Physics { /// Allows the Particle Representations to respond to collisions class ParticleCollisionResponse : public Computation { public: /// Constructor /// \param doCopyState Specify if the output state in Computation::Update() is a copy or not of the input state explicit ParticleCollisionResponse(bool doCopyState = false); SURGSIM_CLASSNAME(SurgSim::Physics::ParticleCollisionResponse); protected: std::shared_ptr doUpdate(const double& dt, const std::shared_ptr& state) override; }; }; // Physics }; // SurgSim #endif //SURGSIM_PHYSICS_PARTICLECOLLISIONRESPONSE_H opensurgsim-0.7.0/SurgSim/Physics/PerformanceTests/000077500000000000000000000000001277777236100224135ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Physics/PerformanceTests/CMakeLists.txt000066400000000000000000000023071277777236100251550ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2012-2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. include_directories( ${gtest_SOURCE_DIR}/include ${OPENTHREADS_INCLUDE_DIR} ) set(UNIT_TEST_SOURCES DivisibleCubeRepresentation.cpp Fem3DPerformanceTest.cpp Fem3DSolutionComponentsTest.cpp ) set(UNIT_TEST_HEADERS DivisibleCubeRepresentation.h ) set(LIBS SurgSimInput SurgSimPhysics ) # Configure the path for the data files configure_file( "${CMAKE_CURRENT_SOURCE_DIR}/config.txt.in" "${CMAKE_CURRENT_BINARY_DIR}/config.txt" ) surgsim_add_unit_tests(SurgSimPhysicsPerformanceTest) set_target_properties(SurgSimPhysicsPerformanceTest PROPERTIES FOLDER "Physics") opensurgsim-0.7.0/SurgSim/Physics/PerformanceTests/DivisibleCubeRepresentation.cpp000066400000000000000000000145041277777236100305570ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Framework/Assert.h" #include "SurgSim/Math/OdeState.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/Fem3DElementCube.h" #include "SurgSim/Physics/Fem3DRepresentation.h" #include "SurgSim/Physics/PerformanceTests/DivisibleCubeRepresentation.h" using SurgSim::Math::Vector3d; namespace SurgSim { namespace Physics { DivisibleCubeRepresentation::DivisibleCubeRepresentation(const std::string& name, size_t nodesPerAxis) : Fem3DRepresentation(name), m_numNodesPerAxis(nodesPerAxis) { // Compute the center point of the cube SurgSim::Math::Vector3d center = SurgSim::Math::Vector3d::Zero(); // Compute the cube's corners for the Fem3d simulation double halfLength = static_cast(nodesPerAxis); Vector3d X = Vector3d::UnitX(); Vector3d Y = Vector3d::UnitY(); Vector3d Z = Vector3d::UnitZ(); m_cubeNodes[0] = center - halfLength * X - halfLength * Y - halfLength * Z; m_cubeNodes[1] = center + halfLength * X - halfLength * Y - halfLength * Z; m_cubeNodes[2] = center - halfLength * X + halfLength * Y - halfLength * Z; m_cubeNodes[3] = center + halfLength * X + halfLength * Y - halfLength * Z; m_cubeNodes[4] = center - halfLength * X - halfLength * Y + halfLength * Z; m_cubeNodes[5] = center + halfLength * X - halfLength * Y + halfLength * Z; m_cubeNodes[6] = center - halfLength * X + halfLength * Y + halfLength * Z; m_cubeNodes[7] = center + halfLength * X + halfLength * Y + halfLength * Z; auto initialState = std::make_shared(); fillUpDeformableState(initialState); setInitialState(initialState); addFemCubes(initialState); } bool DivisibleCubeRepresentation::initializeNoWakeUp() { return doInitialize(); } std::shared_ptr DivisibleCubeRepresentation::getOdeSolver() { return m_odeSolver; } /// Convert a node index from a 3d indexing to a 1d indexing /// \param i, j, k Indices along the X, Y and Z axis /// \return Unique index of the corresponding point (to access a linear array for example) size_t DivisibleCubeRepresentation::get1DIndexFrom3D(size_t i, size_t j, size_t k) { return m_numNodesPerAxis * m_numNodesPerAxis * i + m_numNodesPerAxis * j + k; } /// Fills up a given state with the cube's nodes, border nodes, and internal nodes /// \param[in,out] state The state to be filled up void DivisibleCubeRepresentation::fillUpDeformableState(std::shared_ptr state) { SURGSIM_ASSERT(state != nullptr); state->setNumDof(getNumDofPerNode(), m_numNodesPerAxis * m_numNodesPerAxis * m_numNodesPerAxis); SurgSim::Math::Vector& nodePositions = state->getPositions(); for (size_t i = 0; i < m_numNodesPerAxis; i++) { // For a given index i, we intersect the cube with a (Y Z) plane, which defines a square on a (Y Z) plane Vector3d extremitiesX0[4] = {m_cubeNodes[0], m_cubeNodes[2], m_cubeNodes[4], m_cubeNodes[6]}; Vector3d extremitiesX1[4] = {m_cubeNodes[1], m_cubeNodes[3], m_cubeNodes[5], m_cubeNodes[7]}; Vector3d extremitiesXi[4]; double coefI = static_cast(i) / (static_cast(m_numNodesPerAxis) - 1.0); for (size_t index = 0; index < 4; index++) { extremitiesXi[index] = extremitiesX0[index] * (1.0 - coefI) + extremitiesX1[index] * coefI; } for (size_t j = 0; j < m_numNodesPerAxis; j++) { // For a given index j, we intersect the square with a (X Z) plane, which defines a line along (Z) Vector3d extremitiesY0[2] = {extremitiesXi[0], extremitiesXi[2]}; Vector3d extremitiesY1[2] = {extremitiesXi[1], extremitiesXi[3]}; Vector3d extremitiesYi[2]; double coefJ = static_cast(j) / (static_cast(m_numNodesPerAxis) - 1.0); for (size_t index = 0; index < 2; index++) { extremitiesYi[index] = extremitiesY0[index] * (1.0 - coefJ) + extremitiesY1[index] * coefJ; } for (size_t k = 0; k < m_numNodesPerAxis; k++) { // For a given index k, we intersect the line with a (X Y) plane, which defines a 3d point double coefK = static_cast(k) / (static_cast(m_numNodesPerAxis) - 1.0); Vector3d position3d = extremitiesYi[0] * (1.0 - coefK) + extremitiesYi[1] * coefK; SurgSim::Math::setSubVector(position3d, get1DIndexFrom3D(i, j, k), 3, &nodePositions); } } } } /// Adds the Fem3D elements of small cubes /// \param state The state for initialization. void DivisibleCubeRepresentation::addFemCubes(std::shared_ptr state) { for (size_t i = 0; i < m_numNodesPerAxis - 1; i++) { for (size_t j = 0; j < m_numNodesPerAxis - 1; j++) { for (size_t k = 0; k < m_numNodesPerAxis - 1; k++) { std::array cubeNodeIds; cubeNodeIds[0] = get1DIndexFrom3D(i , j , k); cubeNodeIds[1] = get1DIndexFrom3D(i + 1, j , k); cubeNodeIds[2] = get1DIndexFrom3D(i , j + 1, k); cubeNodeIds[3] = get1DIndexFrom3D(i + 1, j + 1, k); cubeNodeIds[4] = get1DIndexFrom3D(i , j , k + 1); cubeNodeIds[5] = get1DIndexFrom3D(i + 1, j , k + 1); cubeNodeIds[6] = get1DIndexFrom3D(i , j + 1, k + 1); cubeNodeIds[7] = get1DIndexFrom3D(i + 1, j + 1, k + 1); std::array cube = {cubeNodeIds[0], cubeNodeIds[1], cubeNodeIds[3], cubeNodeIds[2], cubeNodeIds[4], cubeNodeIds[5], cubeNodeIds[7], cubeNodeIds[6] }; // Add Fem3DElementCube for each cube std::shared_ptr femElement = std::make_shared(cube); femElement->setMassDensity(980.0); // 0.98 g/cm^-3 (2-part silicone rubber a.k.a. RTV6166) femElement->setPoissonRatio(0.499); // From the paper (near 0.5) femElement->setYoungModulus(15.3e3); // 15.3 kPa (From the paper) femElement->initialize(*state); addFemElement(femElement); } } } } } // namespace Physics } // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/PerformanceTests/DivisibleCubeRepresentation.h000066400000000000000000000051001277777236100302140ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_PERFORMANCETESTS_DIVISIBLECUBEREPRESENTATION_H #define SURGSIM_PHYSICS_PERFORMANCETESTS_DIVISIBLECUBEREPRESENTATION_H #include "SurgSim/Framework/Assert.h" #include "SurgSim/Math/OdeState.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/Fem3DElementCube.h" #include "SurgSim/Physics/Fem3DRepresentation.h" using SurgSim::Math::Vector3d; namespace SurgSim { namespace Physics { class DivisibleCubeRepresentation : public Fem3DRepresentation { public: /// Constructor /// \param name The name of the divisible cube representation. /// \param nodesPerAxis The number of nodes per axis DivisibleCubeRepresentation(const std::string& name, size_t nodesPerAxis); /// Initialize without setting up the complete system so that we can separately /// time the component algorithms. /// \return Initialization success or failure bool initializeNoWakeUp(); /// Return a pointer to the OdeSolver component /// \return The ODE solver std::shared_ptr getOdeSolver(); protected: /// Convert a node index from a 3d indexing to a 1d indexing /// \param i, j, k Indices along the X, Y and Z axis /// \return Unique index of the corresponding point (to access a linear array for example) size_t get1DIndexFrom3D(size_t i, size_t j, size_t k); /// Fills up a given state with the cube's nodes, border nodes, and internal nodes /// \param[in,out] state The state to be filled up void fillUpDeformableState(std::shared_ptr state); /// Adds the Fem3D elements of small cubes /// \param state The state for initialization. void addFemCubes(std::shared_ptr state); private: // Number of point per dimensions size_t m_numNodesPerAxis; // Corner nodes of the original cube std::array m_cubeNodes; }; } // namespace Physics } // namespace SurgSim #endif // SURGSIM_PHYSICS_PERFORMANCETESTS_DIVISIBLECUBEREPRESENTATION_H opensurgsim-0.7.0/SurgSim/Physics/PerformanceTests/Fem3DPerformanceTest.cpp000066400000000000000000000224631277777236100270460ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include #include "SurgSim/DataStructures/PlyReader.h" #include "SurgSim/Framework/Assert.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Framework/Timer.h" #include "SurgSim/Math/LinearSparseSolveAndInverse.h" #include "SurgSim/Math/OdeState.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/Fem3DPlyReaderDelegate.h" #include "SurgSim/Physics/Fem3DRepresentation.h" #include "SurgSim/Physics/Fem3DElementCube.h" #include "SurgSim/Physics/PerformanceTests/DivisibleCubeRepresentation.h" #include "SurgSim/Testing/MockPhysicsManager.h" using SurgSim::Math::Vector3d; namespace { static const double dt = 0.001; static const double maxIterationConstant = 0.1; static const double tolerance = 1.0e-03; static const int frameCount = 10; static std::unordered_map> getIntegrationSchemeNames() { std::unordered_map> result; #define FEM3DPERFORMANCETEST_MAP_NAME(map, name) (map)[name] = #name FEM3DPERFORMANCETEST_MAP_NAME(result, SurgSim::Math::INTEGRATIONSCHEME_EULER_EXPLICIT); FEM3DPERFORMANCETEST_MAP_NAME(result, SurgSim::Math::INTEGRATIONSCHEME_LINEAR_EULER_EXPLICIT); FEM3DPERFORMANCETEST_MAP_NAME(result, SurgSim::Math::INTEGRATIONSCHEME_EULER_EXPLICIT_MODIFIED); FEM3DPERFORMANCETEST_MAP_NAME(result, SurgSim::Math::INTEGRATIONSCHEME_LINEAR_EULER_EXPLICIT_MODIFIED); FEM3DPERFORMANCETEST_MAP_NAME(result, SurgSim::Math::INTEGRATIONSCHEME_EULER_IMPLICIT); FEM3DPERFORMANCETEST_MAP_NAME(result, SurgSim::Math::INTEGRATIONSCHEME_LINEAR_EULER_IMPLICIT); FEM3DPERFORMANCETEST_MAP_NAME(result, SurgSim::Math::INTEGRATIONSCHEME_STATIC); FEM3DPERFORMANCETEST_MAP_NAME(result, SurgSim::Math::INTEGRATIONSCHEME_LINEAR_STATIC); FEM3DPERFORMANCETEST_MAP_NAME(result, SurgSim::Math::INTEGRATIONSCHEME_RUNGE_KUTTA_4); FEM3DPERFORMANCETEST_MAP_NAME(result, SurgSim::Math::INTEGRATIONSCHEME_LINEAR_RUNGE_KUTTA_4); #undef FEM3DPERFORMANCETEST_MAP_NAME return result; } static std::unordered_map> getLinearSolverNames() { std::unordered_map> result; #define FEM3DPERFORMANCETEST_MAP_NAME(map, name) (map)[name] = #name FEM3DPERFORMANCETEST_MAP_NAME(result, SurgSim::Math::LINEARSOLVER_LU); FEM3DPERFORMANCETEST_MAP_NAME(result, SurgSim::Math::LINEARSOLVER_CONJUGATEGRADIENT); #undef FEM3DPERFORMANCETEST_MAP_NAME return result; } static std::unordered_map> IntegrationSchemeNames = getIntegrationSchemeNames(); static std::unordered_map> LinearSolverNames = getLinearSolverNames(); } namespace SurgSim { namespace Physics { class Fem3DPerformanceTestBase : public ::testing::Test { public: virtual void SetUp() { m_physicsManager = std::make_shared(); m_physicsManager->doInitialize(); m_physicsManager->doStartUp(); m_runtime = std::make_shared("config.txt"); } void initializeRepresentation(std::shared_ptr fem) { fem->initialize(m_runtime); fem->wakeUp(); std::shared_ptr solver = std::dynamic_pointer_cast( fem->getOdeSolver()->getLinearSolver()); if (solver != nullptr) { solver->setMaxIterations(static_cast( maxIterationConstant * fem->getNumDof())); solver->setTolerance(tolerance); } m_physicsManager->executeAdditions(fem); } void initializeRepresentation(std::shared_ptr fem) { fem->initialize(std::make_shared("config.txt")); fem->wakeUp(); std::shared_ptr solver = std::dynamic_pointer_cast( fem->getOdeSolver()->getLinearSolver()); if (solver != nullptr) { solver->setMaxIterations(static_cast( maxIterationConstant * fem->getNumDof())); solver->setTolerance(tolerance); } m_physicsManager->executeAdditions(fem); } void performTimingTest() { SurgSim::Framework::Timer totalTime; totalTime.beginFrame(); SurgSim::Framework::Timer timer; timer.setMaxNumberOfFrames(frameCount); for (int i = 0; i < frameCount; i++) { timer.beginFrame(); m_physicsManager->doUpdate(dt); timer.endFrame(); } totalTime.endFrame(); RecordProperty("Duration", boost::to_string(totalTime.getCumulativeTime())); RecordProperty("FrameRate", boost::to_string(timer.getAverageFrameRate())); } protected: std::shared_ptr m_physicsManager; std::shared_ptr m_runtime; }; class IntegrationSchemeParamTest : public Fem3DPerformanceTestBase, public ::testing::WithParamInterface> { }; class IntegrationSchemeAndCountParamTest : public Fem3DPerformanceTestBase, public ::testing::WithParamInterface> { }; TEST_P(IntegrationSchemeParamTest, WoundTest) { SurgSim::Math::IntegrationScheme integrationScheme; SurgSim::Math::LinearSolver linearSolver; std::tie(integrationScheme, linearSolver) = GetParam(); RecordProperty("IntegrationScheme", IntegrationSchemeNames[integrationScheme]); RecordProperty("LinearSolver", LinearSolverNames[linearSolver]); auto fem = std::make_shared("wound"); fem->loadFem("Geometry/wound_deformable.ply"); fem->setIntegrationScheme(integrationScheme); fem->setLinearSolver(linearSolver); initializeRepresentation(fem); performTimingTest(); } TEST_P(IntegrationSchemeAndCountParamTest, CubeTest) { int numCubes; SurgSim::Math::IntegrationScheme integrationScheme; SurgSim::Math::LinearSolver linearSolver; std::tie(integrationScheme, linearSolver, numCubes) = GetParam(); RecordProperty("IntegrationScheme", IntegrationSchemeNames[integrationScheme]); RecordProperty("CubeDivisions", boost::to_string(numCubes)); RecordProperty("LinearSolver", LinearSolverNames[linearSolver]); auto fem = std::make_shared("cube", numCubes); // We need to add some boundary conditions for the static solver to not run into a singular matrix std::const_pointer_cast(fem->getInitialState())->addBoundaryCondition(0); std::const_pointer_cast(fem->getInitialState())->addBoundaryCondition(1); std::const_pointer_cast(fem->getInitialState())->addBoundaryCondition(2); fem->setIntegrationScheme(integrationScheme); fem->setLinearSolver(linearSolver); initializeRepresentation(fem); performTimingTest(); } INSTANTIATE_TEST_CASE_P(Fem3DPerformanceTest, IntegrationSchemeParamTest, ::testing::Combine(::testing::Values(SurgSim::Math::INTEGRATIONSCHEME_EULER_EXPLICIT, SurgSim::Math::INTEGRATIONSCHEME_LINEAR_EULER_EXPLICIT, SurgSim::Math::INTEGRATIONSCHEME_EULER_EXPLICIT_MODIFIED, SurgSim::Math::INTEGRATIONSCHEME_LINEAR_EULER_EXPLICIT_MODIFIED, SurgSim::Math::INTEGRATIONSCHEME_EULER_IMPLICIT, SurgSim::Math::INTEGRATIONSCHEME_LINEAR_EULER_IMPLICIT, SurgSim::Math::INTEGRATIONSCHEME_STATIC, SurgSim::Math::INTEGRATIONSCHEME_LINEAR_STATIC, SurgSim::Math::INTEGRATIONSCHEME_RUNGE_KUTTA_4, SurgSim::Math::INTEGRATIONSCHEME_LINEAR_RUNGE_KUTTA_4), ::testing::Values(SurgSim::Math::LINEARSOLVER_LU, SurgSim::Math::LINEARSOLVER_CONJUGATEGRADIENT))); INSTANTIATE_TEST_CASE_P( Fem3DPerformanceTest, IntegrationSchemeAndCountParamTest, ::testing::Combine(::testing::Values(SurgSim::Math::INTEGRATIONSCHEME_EULER_EXPLICIT, SurgSim::Math::INTEGRATIONSCHEME_LINEAR_EULER_EXPLICIT, SurgSim::Math::INTEGRATIONSCHEME_EULER_EXPLICIT_MODIFIED, SurgSim::Math::INTEGRATIONSCHEME_LINEAR_EULER_EXPLICIT_MODIFIED, SurgSim::Math::INTEGRATIONSCHEME_EULER_IMPLICIT, SurgSim::Math::INTEGRATIONSCHEME_LINEAR_EULER_IMPLICIT, SurgSim::Math::INTEGRATIONSCHEME_STATIC, SurgSim::Math::INTEGRATIONSCHEME_LINEAR_STATIC, SurgSim::Math::INTEGRATIONSCHEME_RUNGE_KUTTA_4, SurgSim::Math::INTEGRATIONSCHEME_LINEAR_RUNGE_KUTTA_4), ::testing::Values(SurgSim::Math::LINEARSOLVER_LU, SurgSim::Math::LINEARSOLVER_CONJUGATEGRADIENT), ::testing::Values(2, 3, 4, 5, 6, 7, 8))); } // namespace Physics } // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/PerformanceTests/Fem3DSolutionComponentsTest.cpp000066400000000000000000000331771277777236100304730ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include #include "SurgSim/DataStructures/PlyReader.h" #include "SurgSim/Framework/Assert.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Framework/Timer.h" #include "SurgSim/Math/LinearSparseSolveAndInverse.h" #include "SurgSim/Math/Matrix.h" #include "SurgSim/Math/OdeState.h" #include "SurgSim/Math/SparseMatrix.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/Fem3DPlyReaderDelegate.h" #include "SurgSim/Physics/Fem3DRepresentation.h" #include "SurgSim/Physics/Fem3DElementCube.h" #include "SurgSim/Physics/PerformanceTests/DivisibleCubeRepresentation.h" #include "SurgSim/Testing/MockPhysicsManager.h" using SurgSim::Math::Vector3d; namespace { static const double dt = 0.001; static const double maxIterationConstant = 0.1; static const double tolerance = 1.0e-03; static const int frameCount = 10; static std::unordered_map> getIntegrationSchemeNames() { std::unordered_map> result; #define FEM3DSOLUTIONCOMPONEMENTSTEST_MAP_NAME(map, name) (map)[name] = #name FEM3DSOLUTIONCOMPONEMENTSTEST_MAP_NAME(result, SurgSim::Math::INTEGRATIONSCHEME_EULER_EXPLICIT); FEM3DSOLUTIONCOMPONEMENTSTEST_MAP_NAME(result, SurgSim::Math::INTEGRATIONSCHEME_LINEAR_EULER_EXPLICIT); FEM3DSOLUTIONCOMPONEMENTSTEST_MAP_NAME(result, SurgSim::Math::INTEGRATIONSCHEME_EULER_EXPLICIT_MODIFIED); FEM3DSOLUTIONCOMPONEMENTSTEST_MAP_NAME(result, SurgSim::Math::INTEGRATIONSCHEME_LINEAR_EULER_EXPLICIT_MODIFIED); FEM3DSOLUTIONCOMPONEMENTSTEST_MAP_NAME(result, SurgSim::Math::INTEGRATIONSCHEME_EULER_IMPLICIT); FEM3DSOLUTIONCOMPONEMENTSTEST_MAP_NAME(result, SurgSim::Math::INTEGRATIONSCHEME_LINEAR_EULER_IMPLICIT); FEM3DSOLUTIONCOMPONEMENTSTEST_MAP_NAME(result, SurgSim::Math::INTEGRATIONSCHEME_STATIC); FEM3DSOLUTIONCOMPONEMENTSTEST_MAP_NAME(result, SurgSim::Math::INTEGRATIONSCHEME_LINEAR_STATIC); FEM3DSOLUTIONCOMPONEMENTSTEST_MAP_NAME(result, SurgSim::Math::INTEGRATIONSCHEME_RUNGE_KUTTA_4); FEM3DSOLUTIONCOMPONEMENTSTEST_MAP_NAME(result, SurgSim::Math::INTEGRATIONSCHEME_LINEAR_RUNGE_KUTTA_4); #undef FEM3DSOLUTIONCOMPONEMENTSTEST_MAP_NAME return result; } static std::unordered_map> getLinearSolverNames() { std::unordered_map> result; #define FEM3DSOLUTIONCOMPONENTSTEST_MAP_NAME(map, name) (map)[name] = #name FEM3DSOLUTIONCOMPONENTSTEST_MAP_NAME(result, SurgSim::Math::LINEARSOLVER_LU); FEM3DSOLUTIONCOMPONENTSTEST_MAP_NAME(result, SurgSim::Math::LINEARSOLVER_CONJUGATEGRADIENT); #undef FEM3DSOLUTIONCOMPONENTSTEST_MAP_NAME return result; } static std::unordered_map> IntegrationSchemeNames = getIntegrationSchemeNames(); static std::unordered_map> LinearSolverNames = getLinearSolverNames(); } namespace SurgSim { namespace Physics { class Fem3DSolutionComponentsTestBase : public ::testing::Test { public: virtual void SetUp() { m_physicsManager = std::make_shared(); m_physicsManager->doInitialize(); m_physicsManager->doStartUp(); } void timeInitializeRepresentation(std::shared_ptr fem) { SurgSim::Framework::Timer totalTime; totalTime.beginFrame(); for (int i = 0; i < frameCount; i++) { fem->initializeNoWakeUp(); } totalTime.endFrame(); RecordProperty("Duration", boost::to_string(totalTime.getCumulativeTime())); } void timeMatrixAssembly(std::shared_ptr fem) { SurgSim::Framework::Timer totalTime; totalTime.beginFrame(); for (int i = 0; i < frameCount; i++) { fem->getOdeSolver()->computeMatrices(dt, *(fem->getInitialState()), false); } totalTime.endFrame(); RecordProperty("Duration", boost::to_string(totalTime.getCumulativeTime())); } void timeComputeLinearSystem(std::shared_ptr fem) { fem->getOdeSolver()->computeMatrices(dt, *(fem->getInitialState()), false); SurgSim::Framework::Timer totalTime; totalTime.beginFrame(); for (int i = 0; i < frameCount; i++) { fem->getOdeSolver()->getLinearSolver()->setMatrix(fem->getOdeSolver()->getSystemMatrix()); } totalTime.endFrame(); RecordProperty("Duration", boost::to_string(totalTime.getCumulativeTime())); } void timeSolveSystem(std::shared_ptr fem) { fem->getOdeSolver()->computeMatrices(dt, *(fem->getInitialState()), false); fem->getOdeSolver()->getLinearSolver()->setMatrix(fem->getOdeSolver()->getSystemMatrix()); std::shared_ptr solver = std::dynamic_pointer_cast( fem->getOdeSolver()->getLinearSolver()); if (solver != nullptr) { solver->setMaxIterations(static_cast( maxIterationConstant * fem->getNumDof())); solver->setTolerance(tolerance); } SurgSim::Framework::Timer totalTime; totalTime.beginFrame(); for (int i = 0; i < frameCount; i++) { fem->getOdeSolver()->getLinearSolver()->solve(Math::Vector::Ones(fem->getInitialState()->getNumDof())); } totalTime.endFrame(); RecordProperty("Duration", boost::to_string(totalTime.getCumulativeTime())); } void timeInvertSystem(std::shared_ptr fem) { fem->getOdeSolver()->computeMatrices(dt, *(fem->getInitialState()), false); fem->getOdeSolver()->getLinearSolver()->setMatrix(fem->getOdeSolver()->getSystemMatrix()); std::shared_ptr solver = std::dynamic_pointer_cast( fem->getOdeSolver()->getLinearSolver()); if (solver != nullptr) { solver->setMaxIterations(static_cast( maxIterationConstant * fem->getNumDof())); solver->setTolerance(tolerance); } SurgSim::Framework::Timer totalTime; totalTime.beginFrame(); for (int i = 0; i < frameCount; i++) { fem->getOdeSolver()->getLinearSolver()->getInverse(); } totalTime.endFrame(); RecordProperty("Duration", boost::to_string(totalTime.getCumulativeTime())); } void initializeRepresentation(std::shared_ptr fem) { fem->initialize(std::make_shared()); fem->wakeUp(); m_physicsManager->executeAdditions(fem); } protected: std::shared_ptr m_physicsManager; }; class ComponentIntegrationSchemeAndCountParamTest : public Fem3DSolutionComponentsTestBase, public ::testing::WithParamInterface> { }; TEST_P(ComponentIntegrationSchemeAndCountParamTest, TimeMatrixInitialization) { int numCubes; SurgSim::Math::IntegrationScheme integrationScheme; SurgSim::Math::LinearSolver linearSolver; std::tie(integrationScheme, linearSolver, numCubes) = GetParam(); RecordProperty("IntegrationScheme", IntegrationSchemeNames[integrationScheme]); RecordProperty("LinearSolver", LinearSolverNames[linearSolver]); RecordProperty("CubeDivisions", boost::to_string(numCubes)); auto fem = std::make_shared("cube", numCubes); // We need to add some boundary conditions for the static solver to not run into a singular matrix std::const_pointer_cast(fem->getInitialState())->addBoundaryCondition(0); std::const_pointer_cast(fem->getInitialState())->addBoundaryCondition(1); std::const_pointer_cast(fem->getInitialState())->addBoundaryCondition(2); fem->setIntegrationScheme(integrationScheme); fem->setLinearSolver(linearSolver); timeInitializeRepresentation(fem); } TEST_P(ComponentIntegrationSchemeAndCountParamTest, TimeMatrixAssembly) { int numCubes; SurgSim::Math::IntegrationScheme integrationScheme; SurgSim::Math::LinearSolver linearSolver; std::tie(integrationScheme, linearSolver, numCubes) = GetParam(); RecordProperty("IntegrationScheme", IntegrationSchemeNames[integrationScheme]); RecordProperty("LinearSolver", LinearSolverNames[linearSolver]); RecordProperty("CubeDivisions", boost::to_string(numCubes)); auto fem = std::make_shared("cube", numCubes); fem->setIntegrationScheme(integrationScheme); fem->setLinearSolver(linearSolver); // We need to add some boundary conditions for the static solver to not run into a singular matrix std::const_pointer_cast(fem->getInitialState())->addBoundaryCondition(0); std::const_pointer_cast(fem->getInitialState())->addBoundaryCondition(1); std::const_pointer_cast(fem->getInitialState())->addBoundaryCondition(2); initializeRepresentation(fem); timeMatrixAssembly(fem); } TEST_P(ComponentIntegrationSchemeAndCountParamTest, TimeComputeLinearSystem) { int numCubes; SurgSim::Math::IntegrationScheme integrationScheme; SurgSim::Math::LinearSolver linearSolver; std::tie(integrationScheme, linearSolver, numCubes) = GetParam(); RecordProperty("IntegrationScheme", IntegrationSchemeNames[integrationScheme]); RecordProperty("LinearSolver", LinearSolverNames[linearSolver]); RecordProperty("CubeDivisions", boost::to_string(numCubes)); auto fem = std::make_shared("cube", numCubes); fem->setIntegrationScheme(integrationScheme); fem->setLinearSolver(linearSolver); // We need to add some boundary conditions for the static solver to not run into a singular matrix std::const_pointer_cast(fem->getInitialState())->addBoundaryCondition(0); std::const_pointer_cast(fem->getInitialState())->addBoundaryCondition(1); std::const_pointer_cast(fem->getInitialState())->addBoundaryCondition(2); initializeRepresentation(fem); timeComputeLinearSystem(fem); } TEST_P(ComponentIntegrationSchemeAndCountParamTest, TimeSolveSystem) { int numCubes; SurgSim::Math::IntegrationScheme integrationScheme; SurgSim::Math::LinearSolver linearSolver; std::tie(integrationScheme, linearSolver, numCubes) = GetParam(); RecordProperty("IntegrationScheme", IntegrationSchemeNames[integrationScheme]); RecordProperty("LinearSolver", LinearSolverNames[linearSolver]); RecordProperty("CubeDivisions", boost::to_string(numCubes)); auto fem = std::make_shared("cube", numCubes); fem->setIntegrationScheme(integrationScheme); fem->setLinearSolver(linearSolver); // We need to add some boundary conditions for the static solver to not run into a singular matrix std::const_pointer_cast(fem->getInitialState())->addBoundaryCondition(0); std::const_pointer_cast(fem->getInitialState())->addBoundaryCondition(1); std::const_pointer_cast(fem->getInitialState())->addBoundaryCondition(2); initializeRepresentation(fem); timeSolveSystem(fem); } TEST_P(ComponentIntegrationSchemeAndCountParamTest, TimeInvertSystem) { int numCubes; SurgSim::Math::IntegrationScheme integrationScheme; SurgSim::Math::LinearSolver linearSolver; std::tie(integrationScheme, linearSolver, numCubes) = GetParam(); RecordProperty("IntegrationScheme", IntegrationSchemeNames[integrationScheme]); RecordProperty("LinearSolver", LinearSolverNames[linearSolver]); RecordProperty("CubeDivisions", boost::to_string(numCubes)); auto fem = std::make_shared("cube", numCubes); fem->setIntegrationScheme(integrationScheme); fem->setLinearSolver(linearSolver); // We need to add some boundary conditions for the static solver to not run into a singular matrix std::const_pointer_cast(fem->getInitialState())->addBoundaryCondition(0); std::const_pointer_cast(fem->getInitialState())->addBoundaryCondition(1); std::const_pointer_cast(fem->getInitialState())->addBoundaryCondition(2); initializeRepresentation(fem); timeInvertSystem(fem); } INSTANTIATE_TEST_CASE_P( Fem3DSolutionComponentsTest, ComponentIntegrationSchemeAndCountParamTest, ::testing::Combine(::testing::Values(SurgSim::Math::INTEGRATIONSCHEME_EULER_EXPLICIT, SurgSim::Math::INTEGRATIONSCHEME_LINEAR_EULER_EXPLICIT, SurgSim::Math::INTEGRATIONSCHEME_EULER_EXPLICIT_MODIFIED, SurgSim::Math::INTEGRATIONSCHEME_LINEAR_EULER_EXPLICIT_MODIFIED, SurgSim::Math::INTEGRATIONSCHEME_EULER_IMPLICIT, SurgSim::Math::INTEGRATIONSCHEME_LINEAR_EULER_IMPLICIT, SurgSim::Math::INTEGRATIONSCHEME_STATIC, SurgSim::Math::INTEGRATIONSCHEME_LINEAR_STATIC, SurgSim::Math::INTEGRATIONSCHEME_RUNGE_KUTTA_4, SurgSim::Math::INTEGRATIONSCHEME_LINEAR_RUNGE_KUTTA_4), ::testing::Values(SurgSim::Math::LINEARSOLVER_LU, SurgSim::Math::LINEARSOLVER_CONJUGATEGRADIENT), ::testing::Values(2, 3, 4, 5, 6, 7, 8))); } // namespace Physics } // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/PerformanceTests/config.txt.in000066400000000000000000000000541277777236100250250ustar00rootroot00000000000000${PROJECT_BINARY_DIR}/SurgSim/Testing/Data/ opensurgsim-0.7.0/SurgSim/Physics/PhysicsConvert.cpp000066400000000000000000000023771277777236100226270ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Physics/PhysicsConvert.h" #include "SurgSim/Physics/RigidState.h" namespace YAML { Node convert::encode(const SurgSim::Physics::RigidState& rhs) { YAML::Node data(rhs.encode()); YAML::Node result; result[rhs.getClassName()] = data; return result; } bool convert::decode( const Node& node, SurgSim::Physics::RigidState& rhs) //NOLINT { bool result = false; if (node[rhs.getClassName()].IsDefined()) { YAML::Node data; data = node[rhs.getClassName()]; rhs.decode(data); result = true; } return result; } } // namespace YAML opensurgsim-0.7.0/SurgSim/Physics/PhysicsConvert.h000066400000000000000000000021371277777236100222660ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_PHYSICSCONVERT_H #define SURGSIM_PHYSICS_PHYSICSCONVERT_H #include namespace SurgSim { namespace Physics { class RigidState; } } namespace YAML { template <> struct convert { static Node encode(const SurgSim::Physics::RigidState& rhs); static bool decode(const Node& node, SurgSim::Physics::RigidState& rhs); //NOLINT }; }; // namespace YAML #endif // SURGSIM_PHYSICS_PHYSICSCONVERT_H opensurgsim-0.7.0/SurgSim/Physics/PhysicsManager.cpp000066400000000000000000000171351277777236100225570ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Physics/PhysicsManager.h" #include "SurgSim/Framework/Component.h" #include "SurgSim/Physics/BuildMlcp.h" #include "SurgSim/Physics/CcdCollision.h" #include "SurgSim/Physics/CcdCollisionLoop.h" #include "SurgSim/Physics/ConstraintComponent.h" #include "SurgSim/Physics/ContactConstraintGeneration.h" #include "SurgSim/Physics/ContactFiltering.h" #include "SurgSim/Physics/DcdCollision.h" #include "SurgSim/Physics/FreeMotion.h" #include "SurgSim/Physics/PhysicsManagerState.h" #include "SurgSim/Physics/ParticleCollisionResponse.h" #include "SurgSim/Physics/PostUpdate.h" #include "SurgSim/Physics/PrepareCollisionPairs.h" #include "SurgSim/Physics/PreUpdate.h" #include "SurgSim/Physics/PushResults.h" #include "SurgSim/Physics/Representation.h" #include "SurgSim/Physics/SolveMlcp.h" #include "SurgSim/Physics/UpdateCollisionData.h" #include "SurgSim/Physics/UpdateCollisionRepresentations.h" #include "SurgSim/Physics/UpdateDcdData.h" namespace SurgSim { namespace Physics { PhysicsManager::PhysicsManager() : ComponentManager("Physics Manager") { setRate(1000.0); } PhysicsManager::~PhysicsManager() { } int PhysicsManager::getType() const { return SurgSim::Framework::MANAGER_TYPE_PHYSICS; } bool PhysicsManager::doInitialize() { if (m_computations.size() == 0) { setComputations(createDcdPipeline(false)); } return true; } void PhysicsManager::addComputation(std::shared_ptr computation) { SURGSIM_ASSERT(!isInitialized()) << "Can't reconfigure the physics manager after it has been initialized"; m_computations.push_back(computation); } void PhysicsManager::setComputations(std::vector> computations) { SURGSIM_ASSERT(!isInitialized()) << "Can't reconfigure the physics manager after it has been initialized"; m_computations = computations; } bool PhysicsManager::doStartUp() { return true; } void PhysicsManager::getFinalState(SurgSim::Physics::PhysicsManagerState* s) const { m_finalState.get(s); } bool PhysicsManager::executeAdditions(const std::shared_ptr& component) { std::shared_ptr representation = tryAddComponent(component, &m_representations); std::shared_ptr collisionRep = tryAddComponent(component, &m_collisionRepresentations); std::shared_ptr contactFilter = tryAddComponent(component, &m_contactFilters); std::shared_ptr particles = tryAddComponent(component, &m_particleRepresentations); std::shared_ptr constraintComponent = tryAddComponent(component, &m_constraintComponents); return representation != nullptr || collisionRep != nullptr || contactFilter != nullptr || particles != nullptr || constraintComponent != nullptr; } bool PhysicsManager::executeRemovals(const std::shared_ptr& component) { return tryRemoveComponent(component, &m_representations) || tryRemoveComponent(component, &m_collisionRepresentations) || tryRemoveComponent(component, &m_contactFilters) || tryRemoveComponent(component, &m_constraintComponents) || tryRemoveComponent(component, &m_particleRepresentations); } bool PhysicsManager::doUpdate(double dt) { processBehaviors(dt); processComponents(); auto state = std::make_shared(); std::list> stateList(1, state); state->setRepresentations(m_representations); state->setCollisionRepresentations(m_collisionRepresentations); state->setContactFilters(m_contactFilters); state->setParticleRepresentations(m_particleRepresentations); state->setConstraintComponents(m_constraintComponents); for (const auto& computation : m_computations) { stateList.push_back(computation->update(dt, stateList.back())); } if (m_logger->getThreshold() <= SURGSIM_LOG_LEVEL(DEBUG)) { if (m_computations.front()->getTimer().isBufferFull()) { double totalTime = 0.0; for (const auto& computation : m_computations) { totalTime += computation->getTimer().getAverageFramePeriod(); } const size_t newFrames = static_cast(10.0 / std::max(totalTime, dt)); for (const auto& computation : m_computations) { auto& timer = computation->getTimer(); const double period = timer.getAverageFramePeriod(); SURGSIM_LOG_DEBUG(m_logger) << std::fixed << std::setprecision(0) << computation->getClassName() << " \taverage duration " << 1e6 * period << " us (max " << 1e6 * timer.getMaxFramePeriod() << " us), " << 100.0 * period / totalTime << "% of Physics."; timer.setMaxNumberOfFrames(newFrames); timer.start(); } } } m_finalState.set(*(stateList.back())); return true; } void PhysicsManager::doBeforeStop() { // Empty the physics manager state m_finalState.set(PhysicsManagerState()); // Give all known components a chance to untangle themselves retireComponents(m_representations); retireComponents(m_particleRepresentations); retireComponents(m_collisionRepresentations); retireComponents(m_constraintComponents); // Call up the class hierarchy ComponentManager::doBeforeStop(); } std::vector> createDcdPipeline(bool copyState) { // When updating this don't forget to update the documentation for this function std::vector> result; result.push_back(std::make_shared(copyState)); result.push_back(std::make_shared(copyState)); result.push_back(std::make_shared(copyState)); result.push_back(std::make_shared(copyState)); result.push_back(std::make_shared(copyState)); result.push_back(std::make_shared(copyState)); result.push_back(std::make_shared(copyState)); result.push_back(std::make_shared(copyState)); result.push_back(std::make_shared(copyState)); result.push_back(std::make_shared(copyState)); result.push_back(std::make_shared(copyState)); result.push_back(std::make_shared(copyState)); result.push_back(std::make_shared(copyState)); result.push_back(std::make_shared(copyState)); return result; } std::vector> createCcdPipeline(bool copyState) { // When updating this don't forget to update the documentation for this function std::vector> result; result.push_back(std::make_shared(copyState)); result.push_back(std::make_shared(copyState)); result.push_back(std::make_shared(copyState)); result.push_back(std::make_shared(copyState)); result.push_back(std::make_shared(copyState)); result.push_back(std::make_shared(copyState)); result.push_back(std::make_shared(copyState)); return result; } }; // Physics }; // SurgSim opensurgsim-0.7.0/SurgSim/Physics/PhysicsManager.h000066400000000000000000000107341277777236100222220ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_PHYSICSMANAGER_H #define SURGSIM_PHYSICS_PHYSICSMANAGER_H #include #include #include #include #include "SurgSim/Framework/ComponentManager.h" #include "SurgSim/Framework/LockedContainer.h" #include "SurgSim/Physics/PhysicsManagerState.h" namespace SurgSim { namespace Collision { class CollisionPair; class Representation; class ContactFilter; } namespace Framework { class Component; } namespace Particles { class Representation; } namespace Physics { class Computation; /// PhyicsManager handles the physics and motion calculation, it uses Computations to /// separate the algorithmic steps into smaller pieces. /// The PhysicsManager pipeline can be configured, using the /// addComputation/setComputaton method. class PhysicsManager : public SurgSim::Framework::ComponentManager { public: /// Constructor PhysicsManager(); virtual ~PhysicsManager(); /// Overrides ComponentManager::getType() int getType() const override; friend class PhysicsManagerTest; /// Get the last PhysicsManagerState from the previous PhysicsManager update. /// \param [out] s pointer to an allocated PhysicsManagerState object. /// \warning The state contains many pointers. The objects pointed to are not thread-safe. void getFinalState(SurgSim::Physics::PhysicsManagerState* s) const; /// Add a computation to the list of computations to perform each update /// \note The computations will be run in order they were added. This can't be done after initialization /// \param computation The Computation to add. void addComputation(std::shared_ptr computation); /// Set a group of computations, the computations will be run in the order in the vector /// \note this can't be done after initialization /// \param computations The computations that you want to set on the physics manager void setComputations(std::vector> computations); protected: bool executeAdditions(const std::shared_ptr& component) override; bool executeRemovals(const std::shared_ptr& component) override; /// Initialize the Physics Manager /// Derived class(es) should override this method to have a customized list of computations. /// \note Current default is to only use DCD contacts /// \sa SurgSim::Physics::Computation bool doInitialize() override; bool doStartUp() override; bool doUpdate(double dt) override; void doBeforeStop() override; std::vector> m_representations; std::vector> m_collisionRepresentations; std::vector> m_contactFilters; std::vector> m_particleRepresentations; std::vector> m_constraintComponents; /// A list of computations, to perform the physics update. std::vector> m_computations; /// A thread-safe copy of the last PhysicsManagerState in the previous update. SurgSim::Framework::LockedContainer m_finalState; }; /// Creates default DCD pipeline, this currently does basic DCD without regard to CCD /// \param copyState if true the physics manager will maintain a copy of the Physics manager state for each computation std::vector> createDcdPipeline(bool copyState = false); /// Create default CCD pipeline, this currently does basic CCD without regard to DCD /// \param copyState if true the physics manager will maintain a copy of the Physics manager state for each computation std::vector> createCcdPipeline(bool copyState = false); }; // namespace Physics }; // namespace SurgSim #endif opensurgsim-0.7.0/SurgSim/Physics/PhysicsManagerState.cpp000066400000000000000000000155261277777236100235620ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Physics/Constraint.h" #include "SurgSim/Physics/ConstraintComponent.h" #include "SurgSim/Physics/PhysicsManagerState.h" #include "SurgSim/Physics/Representation.h" #include "SurgSim/Collision/CollisionPair.h" #include "SurgSim/Collision/Representation.h" namespace SurgSim { namespace Physics { PhysicsManagerState::PhysicsManagerState() : m_abortGroup(false), m_timeOfImpact(0) { } PhysicsManagerState::~PhysicsManagerState() { } void PhysicsManagerState::setRepresentations(const std::vector>& val) { m_representations = val; m_collisionsToPhysicsMap.clear(); for (auto it = m_representations.begin(); it != m_representations.end(); it++) { if ((*it)->isActive()) { auto collision = (*it)->getCollisionRepresentation(); if (collision != nullptr) { m_collisionsToPhysicsMap[collision] = (*it); } } } } const std::vector>& PhysicsManagerState::getRepresentations() { return m_representations; } void PhysicsManagerState::setActiveRepresentations( const std::vector>& activeRepresentations) { m_activeRepresentations = activeRepresentations; } const std::vector>& PhysicsManagerState::getActiveRepresentations() const { return m_activeRepresentations; } const std::unordered_map < std::shared_ptr, std::shared_ptr>& PhysicsManagerState::getCollisionToPhysicsMap() const { return m_collisionsToPhysicsMap; } void PhysicsManagerState::setCollisionRepresentations( const std::vector>& val) { m_collisionRepresentations = val; } const std::vector>& PhysicsManagerState::getCollisionRepresentations() { return m_collisionRepresentations; } void PhysicsManagerState::setActiveCollisionRepresentations( const std::vector>& val) { m_activeCollisionRepresentations = val; } const std::vector>& PhysicsManagerState::getActiveCollisionRepresentations() { return m_activeCollisionRepresentations; } void PhysicsManagerState::setParticleRepresentations(const std::vector>& val) { m_particleRepresentations = val; } const std::vector>& PhysicsManagerState::getParticleRepresentations() { return m_particleRepresentations; } void PhysicsManagerState::setActiveParticleRepresentations( const std::vector>& val) { m_activeParticleRepresentations = val; } const std::vector>& PhysicsManagerState::getActiveParticleRepresentations() { return m_activeParticleRepresentations; } void PhysicsManagerState::setConstraintComponents(const std::vector>& val) { m_constraintComponents = val; std::vector>& constraints = m_constraints[CONSTRAINT_GROUP_TYPE_SCENE]; constraints.reserve(m_constraintComponents.size()); constraints.clear(); for (auto it = m_constraintComponents.cbegin(); it != m_constraintComponents.cend(); ++it) { if ((*it)->isActive() && (*it)->getConstraint()->isActive()) { constraints.push_back((*it)->getConstraint()); } } setConstraintGroup(CONSTRAINT_GROUP_TYPE_SCENE, constraints); } const std::vector>& PhysicsManagerState::getConstraintComponents() { return m_constraintComponents; } void PhysicsManagerState::setCollisionPairs(const std::vector>& val) { m_collisionPairs = val; } const std::vector>& PhysicsManagerState::getCollisionPairs() { return m_collisionPairs; } void PhysicsManagerState::setContactFilters(const std::vector>& val) { m_contactFilters = val; } std::vector> PhysicsManagerState::getContactFilters() const { return m_contactFilters; } void PhysicsManagerState::setConstraintGroup( ConstraintGroupType type, const std::vector>& constraints) { m_constraints[type] = constraints; } const std::vector>& PhysicsManagerState::getConstraintGroup(int type) const { if (m_constraints.count(type) > 0) { return m_constraints.at(type); } static std::vector> emptyVector; return emptyVector; } void PhysicsManagerState::setActiveConstraints( const std::vector>& activeConstraints) { m_activeConstraints = activeConstraints; } const std::vector>& PhysicsManagerState::getActiveConstraints() const { return m_activeConstraints; } MlcpPhysicsProblem& PhysicsManagerState::getMlcpProblem() { return m_mlcpPhysicsProblem; } const MlcpPhysicsProblem& PhysicsManagerState::getMlcpProblem() const { return m_mlcpPhysicsProblem; } MlcpPhysicsSolution& PhysicsManagerState::getMlcpSolution() { return m_mlcpPhysicsSolution; } const MlcpPhysicsSolution& PhysicsManagerState::getMlcpSolution() const { return m_mlcpPhysicsSolution; } const MlcpMapping& PhysicsManagerState::getRepresentationsMapping() const { return m_representationsIndexMapping; } void PhysicsManagerState::setRepresentationsMapping(const MlcpMapping& representationsMapping) { m_representationsIndexMapping = representationsMapping; } const MlcpMapping& PhysicsManagerState::getConstraintsMapping() const { return m_constraintsIndexMapping; } void PhysicsManagerState::setConstraintsMapping(const MlcpMapping& constraintsMapping) { m_constraintsIndexMapping = constraintsMapping; } void PhysicsManagerState::setTimeOfImpact(double timeOfImpact) { m_timeOfImpact = timeOfImpact; } double PhysicsManagerState::getTimeOfImpact() { return m_timeOfImpact; } bool PhysicsManagerState::shouldAbortGroup() const { return m_abortGroup; } void PhysicsManagerState::setAbortGroup(bool val) { m_abortGroup = val; } }; // Physics }; // SurgSim opensurgsim-0.7.0/SurgSim/Physics/PhysicsManagerState.h000066400000000000000000000260711277777236100232240ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_PHYSICSMANAGERSTATE_H #define SURGSIM_PHYSICS_PHYSICSMANAGERSTATE_H #include #include #include #include "SurgSim/Collision/CollisionPair.h" #include "SurgSim/Collision/ContactFilter.h" #include "SurgSim/Collision/Representation.h" #include "SurgSim/Particles/Representation.h" #include "SurgSim/Physics/Constraint.h" #include "SurgSim/Physics/MlcpMapping.h" #include "SurgSim/Physics/MlcpPhysicsProblem.h" #include "SurgSim/Physics/MlcpPhysicsSolution.h" #include "SurgSim/Physics/Representation.h" namespace SurgSim { namespace Physics { class ConstraintComponent; enum ConstraintGroupType { CONSTRAINT_GROUP_TYPE_CONTACT = 0, CONSTRAINT_GROUP_TYPE_SCENE, CONSTRAINT_GROUP_TYPE_COUNT }; class PhysicsManagerState { public: /// Constructor PhysicsManagerState(); /// Destructor ~PhysicsManagerState(); /// Sets the physics representations for the state, these are the basis for all the computations. /// \param val The list of representations. void setRepresentations(const std::vector>& val); /// Gets the physics representations. /// \return The physics representations that are known to the state. const std::vector>& getRepresentations(); /// Set the list of representations into the active representations list. /// \param activeRepresentations The active physics representations that are known to the state. void setActiveRepresentations(const std::vector>& activeRepresentations); /// Gets the active physics representations. /// \return The active physics representations that are known to the state. const std::vector>& getActiveRepresentations() const; /// Sets the collision representations for the state. /// \param val collection of all collision representations. void setCollisionRepresentations(const std::vector>& val); /// Gets the collision representations. /// \return The collision representations that are known to the state. const std::vector>& getCollisionRepresentations(); /// Sets the active collision representations for the state. /// \param val collection of all active collision representations. void setActiveCollisionRepresentations(const std::vector>& val); /// Gets the list of active collision representations. /// \return The active collision representations that are known to the state. const std::vector>& getActiveCollisionRepresentations(); /// Sets the particle representations for the state. /// \param val collection of all particle representations. void setParticleRepresentations(const std::vector>& val); /// Gets the particle representations. /// \return The particle representations that are known to the state. const std::vector>& getParticleRepresentations(); /// Sets the active particle representations for the state. /// \param val collection of all active particle representations. void setActiveParticleRepresentations(const std::vector>& val); /// Gets the list of active particle representations. /// \return The active particle representations that are known to the state. const std::vector>& getActiveParticleRepresentations(); /// Sets the list of constraint components /// \param val collection of all constraint components void setConstraintComponents(const std::vector>& val); /// Gets the constraint components /// \return The constraint components known to the state const std::vector>& getConstraintComponents(); /// \return A map that associates collision representations with physics representations where /// map[physicsRep->getCollisionRepresentation] = physicsRep const std::unordered_map, std::shared_ptr>& getCollisionToPhysicsMap() const; /// Sets collision pairs that should be considered, while this is not being verified the collision pairs /// should only be from the list of representations that are in this state. /// \param val The list of collision pairs. void setCollisionPairs(const std::vector>& val); /// Gets collision pairs. /// \return The collision pairs. const std::vector>& getCollisionPairs(); /// Set the list of contact filters /// \param val the list of contact filters void setContactFilters(const std::vector>& val); /// \return the list of contact filters std::vector> getContactFilters() const; /// Sets the group of constraints to a given value, the grouping indicates what type of constraint we are dealing /// with. /// \param type The type of constraint grouping e.g. Contact Constraints. /// \param constraints The constraints. void setConstraintGroup(ConstraintGroupType type, const std::vector>& constraints); /// Gets constraint group. /// \param type The type. /// \return The constraint group. const std::vector>& getConstraintGroup(int type) const; /// Filter the map of constraints into the active constraints list. /// \param activeConstraints The list of active constraints. void setActiveConstraints(const std::vector>& activeConstraints); /// \return The list of all active constraints. const std::vector>& getActiveConstraints() const; /// Gets the Mlcp problem /// \return The Mlcp problem for this physics manager state (read/write access). MlcpPhysicsProblem& getMlcpProblem(); /// Gets the Mlcp problem /// \return The Mlcp problem for this physics manager state (const). const MlcpPhysicsProblem& getMlcpProblem() const; /// Gets the Mlcp solution /// \return The Mlcp solution for this physics manager state (read/write access). MlcpPhysicsSolution& getMlcpSolution(); /// Gets the Mlcp solution /// \return The Mlcp solution for this physics manager state (const). const MlcpPhysicsSolution& getMlcpSolution() const; /// Gets the representations mapping /// \return The representations mapping (mapping between the representation and the mlcp) /// Each representation has an index in the mlcp. This mapping is about this index. const MlcpMapping& getRepresentationsMapping() const; /// Set the representations mapping /// \param representationsMapping The representations mapping (mapping between the representation and the mlcp) void setRepresentationsMapping(const MlcpMapping& representationsMapping); /// Gets the constraints mapping /// \return The constraints mapping (mapping between the constraints and the mlcp) /// Each constraint has an index in the mlcp. This mapping is about this index. const MlcpMapping& getConstraintsMapping() const; /// Set the constraints mapping /// \param constraintsMapping The constraints mapping (mapping between the constraints and the mlcp) void setConstraintsMapping(const MlcpMapping& constraintsMapping); /// Set the time of impact /// \param timeOfImpact the time of impact for CCD void setTimeOfImpact(double timeOfImpact); /// \return the last time of impact when a CCD calculation ran double getTimeOfImpact(); /// \return whether to abort a grouped computation by the calling group bool shouldAbortGroup() const; /// Set whether to abort the current grouped computation /// \param val set to true to signal to an above computation to abort void setAbortGroup(bool val); private: ///@{ /// Local state data structures, please note that the physics state may get copied, these data structures /// should copy their contents on copy. With the caveat that objects contained within those structures might /// not get copied themselves. /// The local list of representations std::vector> m_representations; /// The list of active representations. std::vector> m_activeRepresentations; /// List of all the collision representations known to the state std::vector> m_collisionRepresentations; /// List of all the active collision representations known to the state std::vector> m_activeCollisionRepresentations; /// List of all the collision filters known to the state std::vector > m_contactFilters; /// List of all the particle representations known to the state std::vector> m_particleRepresentations; /// List of all the active particle representations known to the state std::vector> m_activeParticleRepresentations; /// List of the constraint components std::vector> m_constraintComponents; /// Mapping of collision representations to their respective physics representation. std::unordered_map, std::shared_ptr> m_collisionsToPhysicsMap; /// The local list of collision pairs. std::vector> m_collisionPairs; /// The local map of constraints. std::unordered_map>> m_constraints; /// The list of active constraints. std::vector> m_activeConstraints; /// Representation mapping MlcpMapping m_representationsIndexMapping; /// Constraints mapping MlcpMapping m_constraintsIndexMapping; ///@} /// Mlcp problem for this Physics Manager State MlcpPhysicsProblem m_mlcpPhysicsProblem; /// Mlcp solution for this Physics Manager State MlcpPhysicsSolution m_mlcpPhysicsSolution; /// Flag for the abort group case bool m_abortGroup; /// last time of impact for a CCD calculation double m_timeOfImpact; }; }; // Physics }; // SurgSim #endif opensurgsim-0.7.0/SurgSim/Physics/PostUpdate.cpp000066400000000000000000000035351277777236100217310ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include "SurgSim/Physics/PostUpdate.h" #include "SurgSim/Physics/Representation.h" #include "SurgSim/Physics/PhysicsManagerState.h" namespace SurgSim { namespace Physics { PostUpdate::PostUpdate(bool doCopyState) : Computation(doCopyState) { } PostUpdate::~PostUpdate() { } std::shared_ptr PostUpdate::doUpdate( const double& dt, const std::shared_ptr& state) { std::shared_ptr result = state; { const auto& representations = result->getActiveRepresentations(); for (auto& representation : representations) { representation->afterUpdate(dt); } } { // Clear the collisions auto const& representations = result->getCollisionRepresentations(); for (auto& representation : representations) { representation->getCollisions().unsafeGet().clear(); } // Update the representations with the contact data. auto& pairs = result->getCollisionPairs(); for (auto& pair : pairs) { pair->updateRepresentations(); } // Publish Results for (auto& representation : representations) { representation->getCollisions().publish(); } } return result; } }; // Physics }; // SurgSim opensurgsim-0.7.0/SurgSim/Physics/PostUpdate.h000066400000000000000000000027631277777236100214000ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_POSTUPDATE_H #define SURGSIM_PHYSICS_POSTUPDATE_H #include #include "SurgSim/Framework/Macros.h" #include "SurgSim/Physics/Computation.h" namespace SurgSim { namespace Physics { /// Post Update is called prior to anything else at the beginning of each time step class PostUpdate : public Computation { public: /// Constructor /// \param doCopyState Specify if the output state in Computation::Update() is a copy or not of the input state explicit PostUpdate(bool doCopyState = false); SURGSIM_CLASSNAME(SurgSim::Physics::PostUpdate); /// Destructor virtual ~PostUpdate(); protected: /// Override doUpdate from superclass std::shared_ptr doUpdate(const double& dt, const std::shared_ptr& state) override; }; }; // Physics }; // SurgSim #endif // SURGSIM_PHYSICS_POSTUPDATE_H opensurgsim-0.7.0/SurgSim/Physics/PreUpdate.cpp000066400000000000000000000025051277777236100215260ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include "SurgSim/Physics/PreUpdate.h" #include "SurgSim/Physics/Representation.h" #include "SurgSim/Physics/PhysicsManagerState.h" namespace SurgSim { namespace Physics { PreUpdate::PreUpdate(bool doCopyState) : Computation(doCopyState) { } PreUpdate::~PreUpdate() { } std::shared_ptr PreUpdate::doUpdate( const double& dt, const std::shared_ptr& state) { std::shared_ptr result = state; auto& representations = result->getActiveRepresentations(); for (auto& representation : representations) { representation->beforeUpdate(dt); } return result; } }; // Physics }; // SurgSim opensurgsim-0.7.0/SurgSim/Physics/PreUpdate.h000066400000000000000000000027461277777236100212020ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_PREUPDATE_H #define SURGSIM_PHYSICS_PREUPDATE_H #include #include "SurgSim/Framework/Macros.h" #include "SurgSim/Physics/Computation.h" namespace SurgSim { namespace Physics { /// Pre Update is called after everything else is done in the physics time step class PreUpdate : public Computation { public: /// Constructor /// \param doCopyState Specify if the output state in Computation::Update() is a copy or not of the input state explicit PreUpdate(bool doCopyState = false); SURGSIM_CLASSNAME(SurgSim::Physics::PreUpdate); /// Destructor virtual ~PreUpdate(); protected: /// Override doUpdate from superclass std::shared_ptr doUpdate(const double& dt, const std::shared_ptr& state) override; }; }; // Physics }; // SurgSim #endif // SURGSIM_PHYSICS_PREUPDATE_H opensurgsim-0.7.0/SurgSim/Physics/PrepareCollisionPairs.cpp000066400000000000000000000063551277777236100241150ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Collision/CollisionPair.h" #include "SurgSim/Collision/Representation.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Physics/PhysicsManagerState.h" #include "SurgSim/Physics/PrepareCollisionPairs.h" #include "SurgSim/Math/Aabb.h" namespace SurgSim { namespace Physics { PrepareCollisionPairs::PrepareCollisionPairs(bool doCopyState) : Computation(doCopyState), m_timeSinceLog(0.0), m_logger(Framework::Logger::getLogger("Physics/PrepareCollisionPairs")) { } PrepareCollisionPairs::~PrepareCollisionPairs() { } std::shared_ptr PrepareCollisionPairs::doUpdate( const double& dt, const std::shared_ptr& state) { std::shared_ptr result = state; auto& representations = result->getActiveCollisionRepresentations(); std::vector> pairs; auto end = std::end(representations); for (auto first = std::begin(representations); first != end; ++first) { for (auto second = first; second != end; ++second) { if (!(*first)->isIgnoring(*second) && !(*second)->isIgnoring(*first)) { auto pair = std::make_shared(*first, *second); if (pair->getType() != Collision::COLLISION_DETECTION_TYPE_NONE && pair->mayIntersect()) { pairs.push_back(pair); } } } } result->setCollisionPairs(pairs); if (m_logger->getThreshold() <= SURGSIM_LOG_LEVEL(DEBUG)) { m_timeSinceLog += dt; if (m_timeSinceLog > 5.0) { m_timeSinceLog = 0.0; typedef std::tuple PairType; std::vector names; for (const auto& pair : pairs) { std::string first = pair->getFirst()->getFullName(); std::string second = pair->getSecond()->getFullName(); if (first < second) { names.emplace_back(first, second, pair->getType()); } else { names.emplace_back(second, first, pair->getType()); } } std::sort(names.begin(), names.end(), [](const PairType & i, const PairType & j) { return (std::get<0>(i) < std::get<0>(j)) || ((std::get<0>(i) == std::get<0>(j)) && (std::get<1>(i) < std::get<1>(j))); }); std::string message = "All collision pairs for testing:\n"; for (const auto& name : names) { message += "\t" + std::get<0>(name) + " : " + std::get<1>(name) + ( (std::get<2>(name) == SurgSim::Collision::COLLISION_DETECTION_TYPE_CONTINUOUS) ? " CCD" : " DCD" ) + "\n"; } SURGSIM_LOG_DEBUG(m_logger) << message; } } return result; } }; // Physics }; // SurgSim opensurgsim-0.7.0/SurgSim/Physics/PrepareCollisionPairs.h000066400000000000000000000045421277777236100235560ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_PREPARECOLLISIONPAIRS_H #define SURGSIM_PHYSICS_PREPARECOLLISIONPAIRS_H #include #include "SurgSim/Framework/Macros.h" #include "SurgSim/Physics/Computation.h" namespace SurgSim { namespace Collision { class ContactCalculation; } namespace Framework { class Logger; } namespace Physics { class PhysicsManagerState; /// Computation to determine the contacts between a list of CollisionPairs. /// This Computation class takes a list of representations, it will generate a list of collision pairs /// from this list on every frame, for each CollisionPair, it uses a two dimensional table of /// function objects (ContactCalculation) to determine how to calculate a contact between the two /// members of each pair, if no specific function exists a default function will be used. /// will update the collision pairs accordingly. /// \note When a new ContactCalculation type gets implemented, the type needs to be registered with the table /// inside of ContactCalculation class PrepareCollisionPairs : public Computation { public: /// Constructor /// \param doCopyState Specify if the output state in Computation::Update() is a copy or not of the input state explicit PrepareCollisionPairs(bool doCopyState = false); SURGSIM_CLASSNAME(SurgSim::Physics::PrepareCollisionPairs); /// Destructor virtual ~PrepareCollisionPairs(); protected: std::shared_ptr doUpdate(const double& dt, const std::shared_ptr& state) override; private: /// The time since the collision pairs were last logged. double m_timeSinceLog; /// The logger. std::shared_ptr m_logger; }; }; // Physics }; // SurgSim #endif // SURGSIM_PHYSICS_PREPARECOLLISIONPAIRS_H opensurgsim-0.7.0/SurgSim/Physics/PushResults.cpp000066400000000000000000000051631277777236100221410ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Physics/MlcpPhysicsProblem.h" #include "SurgSim/Physics/MlcpPhysicsSolution.h" #include "SurgSim/Physics/PushResults.h" #include "SurgSim/Physics/PhysicsManagerState.h" #include "SurgSim/Physics/Representation.h" namespace SurgSim { namespace Physics { PushResults::PushResults(bool doCopyState) : Computation(doCopyState), m_logger(SurgSim::Framework::Logger::getLogger("Physics/PushResults")) { } PushResults::~PushResults() { } std::shared_ptr PushResults::doUpdate(const double& dt, const std::shared_ptr& state) { std::shared_ptr result = state; // 1st step // Compute the global dof displacement correction from the constraints forces (result of the MLCP) // correction = CHt . lambda const Eigen::VectorXd& lambda = result->getMlcpSolution().x; if (lambda.size() == 0) { return state; } const SurgSim::Math::MlcpProblem::Matrix& CHt = result->getMlcpProblem().CHt; SurgSim::Math::MlcpSolution::Vector& dofCorrection = result->getMlcpSolution().dofCorrection; dofCorrection = CHt * lambda; SURGSIM_LOG_DEBUG(m_logger) << "b:\t" << result->getMlcpProblem().b.transpose(); SURGSIM_LOG_DEBUG(m_logger) << "final:\t" << (result->getMlcpProblem().A * lambda + result->getMlcpProblem().b).transpose(); SURGSIM_LOG_DEBUG(m_logger) << "Lambda:\t" << lambda.transpose(); // 2nd step // Push the dof displacement correction to all representation, using their assigned index auto& representations = result->getActiveRepresentations(); for (auto& representation : representations) { if (representation->isActive()) { ptrdiff_t index = result->getRepresentationsMapping().getValue(representation.get()); SURGSIM_ASSERT(index >= 0) << "Bad index found for representation " << representation->getName() << std::endl; representation->applyCorrection(dt, dofCorrection.segment(index, representation->getNumDof())); } } return result; } }; // namespace Physics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/PushResults.h000066400000000000000000000031211277777236100215760ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_PUSHRESULTS_H #define SURGSIM_PHYSICS_PUSHRESULTS_H #include "SurgSim/Framework/Macros.h" #include "SurgSim/Physics/Computation.h" namespace SurgSim { namespace Framework { class Logger; } namespace Physics { class Representation; /// Propagates the Mlcp result to the representations class PushResults : public Computation { public: /// Constructor /// \param doCopyState Specify if the output state in Computation::Update() is a copy or not of the input state explicit PushResults(bool doCopyState = false); SURGSIM_CLASSNAME(SurgSim::Physics::PushResults); /// Destructor virtual ~PushResults(); protected: /// Override doUpdate from superclass std::shared_ptr doUpdate(const double& dt, const std::shared_ptr& state) override; std::shared_ptr m_logger; }; }; // namespace Physics }; // namespace SurgSim #endif // SURGSIM_PHYSICS_PUSHRESULTS_H opensurgsim-0.7.0/SurgSim/Physics/RenderTests/000077500000000000000000000000001277777236100213715ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Physics/RenderTests/CMakeLists.txt000066400000000000000000000026141277777236100241340ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2012-2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. include_directories( ${gtest_SOURCE_DIR}/include ${OPENTHREADS_INCLUDE_DIR} ) set(UNIT_TEST_SOURCES CompoundCollisionRenderTest.cpp Fem3DMeshRenderTest.cpp Fem3DvsTruthCubeRenderTest.cpp RenderTest.cpp RenderTestCcdSuture.cpp RenderTestFem1D.cpp RenderTestFem2D.cpp RenderTestFem3D.cpp RenderTestFem3DCorotational.cpp RenderTestMassSprings.cpp RenderTestRigidBodies.cpp ) set(UNIT_TEST_HEADERS RenderTest.h ) configure_file( "${CMAKE_CURRENT_SOURCE_DIR}/config.txt.in" "${CMAKE_CURRENT_BINARY_DIR}/config.txt" ) set(LIBS SurgSimBlocks SurgSimGraphics SurgSimPhysics ) file(COPY Data DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) surgsim_add_unit_tests(SurgSimPhysicsRenderTest) set_target_properties(SurgSimPhysicsRenderTest PROPERTIES FOLDER "Physics") opensurgsim-0.7.0/SurgSim/Physics/RenderTests/CompoundCollisionRenderTest.cpp000066400000000000000000000237531277777236100275470ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include "SurgSim/Framework/ApplicationData.h" #include "SurgSim/Framework/BasicSceneElement.h" #include "SurgSim/Graphics/OsgBoxRepresentation.h" #include "SurgSim/Graphics/OsgPlaneRepresentation.h" #include "SurgSim/Graphics/OsgSceneryRepresentation.h" #include "SurgSim/Graphics/OsgSphereRepresentation.h" #include "SurgSim/Graphics/View.h" #include "SurgSim/Graphics/ViewElement.h" #include "SurgSim/Math/BoxShape.h" #include "SurgSim/Math/CompoundShape.h" #include "SurgSim/Math/MeshShape.h" #include "SurgSim/Math/PlaneShape.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/SphereShape.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/FixedRepresentation.h" #include "SurgSim/Physics/RenderTests/RenderTest.h" #include "SurgSim/Physics/RigidCollisionRepresentation.h" #include "SurgSim/Physics/RigidRepresentation.h" using SurgSim::Math::Vector3d; using SurgSim::Math::RigidTransform3d; namespace { std::shared_ptr createSphereObject() { auto result = std::make_shared("Object"); auto physics = std::make_shared("Physics"); physics->setDensity(700.0); // Wood physics->setLinearDamping(0.1); auto sphere = std::make_shared(0.01); // 1cm Sphere auto shape = std::make_shared(); physics->setShape(shape); result->addComponent(physics); std::array offsets = { Vector3d(0.1, 0.0, 0.0), Vector3d(-0.1, 0.0, 0.0), Vector3d(0.0, 0.1, 0.0), Vector3d(0.0, -0.1, 0.0), Vector3d(0.0, 0.0, 0.1), Vector3d(0.0, 0.0, -0.1) }; int i = 0; for (auto offset : offsets) { auto transform = SurgSim::Math::makeRigidTranslation(offset); shape->addShape(sphere, transform); auto graphics = std::make_shared("Graphics-" + std::to_string(i)); graphics->setRadius(sphere->getRadius()); graphics->setLocalPose(transform); result->addComponent(graphics); ++i; } auto rigidCollision = std::make_shared("Collision"); physics->setCollisionRepresentation(rigidCollision); result->addComponent(rigidCollision); auto transform = SurgSim::Math::makeRigidTransform( SurgSim::Math::makeRotationQuaternion(0.01, Vector3d(1.0, 1.0, 1.0)), Vector3d(0.0, 1.0, 0.0)); result->setPose(transform); return result; }; std::shared_ptr createMeshObject( std::shared_ptr* compoundShapeOut = nullptr, std::shared_ptr* leftGraphicsOut = nullptr, std::shared_ptr* rightGraphicsOut = nullptr) { SurgSim::Framework::ApplicationData data("config.txt"); auto result = std::make_shared("Object"); auto physics = std::make_shared("Physics"); physics->setDensity(700.0); // Wood physics->setLinearDamping(0.5); auto subShape = std::make_shared(); subShape->load("bar.ply", data); auto shape = std::make_shared(); if (compoundShapeOut != nullptr) { *compoundShapeOut = shape; } physics->setShape(shape); result->addComponent(physics); auto transform = SurgSim::Math::makeRigidTransform( SurgSim::Math::makeRotationQuaternion(0.2, Vector3d(1.0, 0.0, 0.0)), Vector3d(0.0, 0.0, 0.0)); shape->addShape(subShape, transform); auto graphics = std::make_shared("LeftGraphics"); graphics->setLocalPose(transform); graphics->loadModel("bar.ply"); result->addComponent(graphics); if (leftGraphicsOut != nullptr) { *leftGraphicsOut = graphics; } transform = SurgSim::Math::makeRigidTransform( SurgSim::Math::makeRotationQuaternion(-0.2, Vector3d(1.0, 0.0, 0.0)), Vector3d(0.0, 0.0, 0.0)); shape->addShape(subShape, transform); graphics = std::make_shared("RightGraphics"); graphics->setLocalPose(transform); graphics->loadModel("bar.ply"); result->addComponent(graphics); if (rightGraphicsOut != nullptr) { *rightGraphicsOut = graphics; } auto rigidCollision = std::make_shared("Collision"); physics->setCollisionRepresentation(rigidCollision); result->addComponent(rigidCollision); transform = SurgSim::Math::makeRigidTransform( SurgSim::Math::makeRotationQuaternion(0.3, Vector3d(1.0, 1.0, 1.0)), Vector3d(0.0, 1.0, 0.0)); result->setPose(transform); return result; }; std::vector > makeScenery() { std::vector > result; { // Plane auto shape = std::make_shared(); auto physics = std::make_shared("Physics"); physics->setShape(shape); auto graphics = std::make_shared("Graphics"); auto collision = std::make_shared("Collision"); physics->setCollisionRepresentation(collision); auto element = std::make_shared("Plane"); element->addComponent(physics); element->addComponent(collision); element->addComponent(graphics); result.push_back(element); } { // Sphere auto shape = std::make_shared(2.0); auto physics = std::make_shared("Physics"); physics->setShape(shape); auto graphics = std::make_shared("Graphics"); graphics->setRadius(2.0); auto collision = std::make_shared("Collision"); physics->setCollisionRepresentation(collision); auto element = std::make_shared("BigSphere"); element->addComponent(physics); element->addComponent(collision); element->addComponent(graphics); auto transform = SurgSim::Math::makeRigidTransform( SurgSim::Math::makeRotationQuaternion(0.01, Vector3d(1.0, 1.0, 1.0)), Vector3d(0.0, -2.0, 0.0)); element->setPose(transform); result.push_back(element); } { // Mesh Box auto shape = std::make_shared(); shape->load("collider.ply"); auto physics = std::make_shared("Physics"); physics->setDensity(700.0); // Wood physics->setLinearDamping(0.1); physics->setShape(shape); auto graphics = std::make_shared("Graphics"); graphics->loadModel("collider.ply"); auto collision = std::make_shared("Collision"); physics->setCollisionRepresentation(collision); auto element = std::make_shared("MeshBox"); element->addComponent(physics); element->addComponent(collision); element->addComponent(graphics); result.push_back(element); } return result; } } namespace SurgSim { namespace Physics { TEST_F(RenderTests, CompoundCollisionShapePlane) { scene->addSceneElement(createSphereObject()); scene->addSceneElement(makeScenery()[0]); runTest(Vector3d(0.8, 0.8, 0.8), Vector3d(0.0, 0.0, 0.0), 5000); } TEST_F(RenderTests, CompoundCollisionShapeSphere) { scene->addSceneElement(createSphereObject()); scene->addSceneElement(makeScenery()[1]); runTest(Vector3d(0.8, 0.8, 0.8), Vector3d(0.0, 0.0, 0.0), 5000); } TEST_F(RenderTests, CompoundCollsionMeshPlane) { scene->addSceneElement(createMeshObject()); scene->addSceneElement(makeScenery()[0]); runTest(Vector3d(0.8, 0.8, 0.8), Vector3d(0.0, 0.0, 0.0), 5000); } TEST_F(RenderTests, CompoundCollsionMeshBox) { scene->addSceneElement(createMeshObject()); scene->addSceneElement(makeScenery()[2]); runTest(Vector3d(0.8, 0.8, 0.8), Vector3d(0.0, 0.0, 0.0), 5000); } TEST_F(RenderTests, CompoundCollisionMoving) { std::shared_ptr shape; std::shared_ptr leftGraphics; std::shared_ptr rightGraphics; auto element = createMeshObject(&shape, &leftGraphics, &rightGraphics); auto transform = SurgSim::Math::makeRigidTransform( SurgSim::Math::makeRotationQuaternion(0.0, Vector3d(1.0, 0.0, 0.0)), Vector3d(0.0, 0.5, 0.0)); element->setPose(transform); scene->addSceneElement(element); scene->addSceneElement(makeScenery()[2]); viewElement->enableManipulator(true); viewElement->setManipulatorParameters(Vector3d(0.8, 0.8, 0.8), Vector3d(0.0, 0.0, 0.0)); runtime->start(); boost::this_thread::sleep(boost::posix_time::milliseconds(2000)); for (double angle = 0.2; angle < 0.4; angle += 0.0025) { transform = SurgSim::Math::makeRigidTransform( SurgSim::Math::makeRotationQuaternion(angle, Vector3d(1.0, 0.0, 0.0)), Vector3d(0.0, 0.0, 0.0)); shape->setPose(0, transform); leftGraphics->setLocalPose(transform); transform = SurgSim::Math::makeRigidTransform( SurgSim::Math::makeRotationQuaternion(-angle, Vector3d(1.0, 0.0, 0.0)), Vector3d(0.0, 0.0, 0.0)); shape->setPose(1, transform); rightGraphics->setLocalPose(transform); boost::this_thread::sleep(boost::posix_time::milliseconds(50)); } } } } opensurgsim-0.7.0/SurgSim/Physics/RenderTests/Data/000077500000000000000000000000001277777236100222425ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Physics/RenderTests/Data/bar.ply000066400000000000000000000033311277777236100235340ustar00rootroot00000000000000ply format ascii 1.0 comment Created by Blender 2.75 (sub 0) - www.blender.org, source file: '' element vertex 24 property float x property float y property float z property float nx property float ny property float nz element face 12 property list uchar uint vertex_indices end_header -0.025470 0.035060 0.234386 -1.000000 0.000000 0.000000 -0.025470 0.035060 -0.265614 -1.000000 0.000000 0.000000 -0.025470 -0.014940 -0.265614 -1.000000 0.000000 0.000000 0.024530 0.035060 0.234386 0.000000 1.000000 0.000000 0.024530 0.035060 -0.265614 0.000000 1.000000 0.000000 -0.025470 0.035060 -0.265614 0.000000 1.000000 0.000000 0.024530 -0.014940 0.234386 1.000000 0.000000 -0.000000 0.024530 -0.014940 -0.265614 1.000000 0.000000 -0.000000 0.024530 0.035060 -0.265614 1.000000 0.000000 -0.000000 -0.025470 -0.014940 0.234386 0.000000 -1.000000 0.000000 -0.025470 -0.014940 -0.265614 0.000000 -1.000000 0.000000 0.024530 -0.014940 -0.265614 0.000000 -1.000000 0.000000 -0.025470 0.035060 -0.265614 0.000000 0.000000 -1.000000 0.024530 0.035060 -0.265614 0.000000 0.000000 -1.000000 0.024530 -0.014940 -0.265614 0.000000 0.000000 -1.000000 0.024530 0.035060 0.234386 0.000000 0.000000 1.000000 -0.025470 0.035060 0.234386 0.000000 0.000000 1.000000 -0.025470 -0.014940 0.234386 0.000000 0.000000 1.000000 -0.025470 -0.014940 0.234386 -1.000000 0.000000 0.000000 -0.025470 0.035060 0.234386 0.000000 1.000000 -0.000000 0.024530 0.035060 0.234386 1.000000 0.000000 -0.000000 0.024530 -0.014940 0.234386 0.000000 -1.000000 0.000000 -0.025470 -0.014940 -0.265614 -0.000000 -0.000000 -1.000000 0.024530 -0.014940 0.234386 -0.000000 0.000000 1.000000 3 0 1 2 3 3 4 5 3 6 7 8 3 9 10 11 3 12 13 14 3 15 16 17 3 18 0 2 3 19 3 5 3 20 6 8 3 21 9 11 3 22 12 14 3 23 15 17 opensurgsim-0.7.0/SurgSim/Physics/RenderTests/Data/collider.ply000066400000000000000000000033311277777236100245650ustar00rootroot00000000000000ply format ascii 1.0 comment Created by Blender 2.75 (sub 0) - www.blender.org, source file: '' element vertex 24 property float x property float y property float z property float nx property float ny property float nz element face 12 property list uchar uint vertex_indices end_header -0.500470 0.060060 0.484386 -1.000000 0.000000 0.000000 -0.500470 0.060060 -0.515614 -1.000000 0.000000 0.000000 -0.500470 -0.039940 -0.515614 -1.000000 0.000000 0.000000 0.499530 0.060060 0.484386 0.000000 1.000000 0.000000 0.499530 0.060060 -0.515614 0.000000 1.000000 0.000000 -0.500470 0.060060 -0.515614 0.000000 1.000000 0.000000 0.499530 -0.039940 0.484386 1.000000 0.000000 -0.000000 0.499530 -0.039940 -0.515614 1.000000 0.000000 -0.000000 0.499530 0.060060 -0.515614 1.000000 0.000000 -0.000000 -0.500470 -0.039940 0.484386 0.000000 -1.000000 0.000000 -0.500470 -0.039940 -0.515614 0.000000 -1.000000 0.000000 0.499530 -0.039940 -0.515614 0.000000 -1.000000 0.000000 -0.500470 0.060060 -0.515614 0.000000 0.000000 -1.000000 0.499530 0.060060 -0.515614 0.000000 0.000000 -1.000000 0.499530 -0.039940 -0.515614 0.000000 0.000000 -1.000000 0.499530 0.060060 0.484386 0.000000 0.000000 1.000000 -0.500470 0.060060 0.484386 0.000000 0.000000 1.000000 -0.500470 -0.039940 0.484386 0.000000 0.000000 1.000000 -0.500470 -0.039940 0.484386 -1.000000 0.000000 0.000000 -0.500470 0.060060 0.484386 0.000000 1.000000 -0.000000 0.499530 0.060060 0.484386 1.000000 0.000000 -0.000000 0.499530 -0.039940 0.484386 0.000000 -1.000000 0.000000 -0.500470 -0.039940 -0.515614 -0.000000 -0.000000 -1.000000 0.499530 -0.039940 0.484386 -0.000000 0.000000 1.000000 3 0 1 2 3 3 4 5 3 6 7 8 3 9 10 11 3 12 13 14 3 15 16 17 3 18 0 2 3 19 3 5 3 20 6 8 3 21 9 11 3 22 12 14 3 23 15 17 opensurgsim-0.7.0/SurgSim/Physics/RenderTests/Data/cylinder.ply000066400000000000000000000320421277777236100246020ustar00rootroot00000000000000ply format ascii 1.0 comment Created by Blender 2.75 (sub 0) - www.blender.org, source file: '' element vertex 204 property float x property float y property float z property float nx property float ny property float nz element face 128 property list uchar uint vertex_indices end_header -0.100000 0.000000 0.000000 -1.000000 0.000000 0.000000 -0.100000 0.010000 0.000000 -1.000000 0.000000 0.000000 -0.100000 0.009808 -0.001951 -1.000000 0.000000 0.000000 0.100000 0.000000 -0.000000 1.000000 0.000000 0.000000 0.100000 0.009808 -0.001951 1.000000 0.000000 0.000000 0.100000 0.010000 -0.000000 1.000000 0.000000 0.000000 0.100000 0.010000 -0.000000 -0.000000 0.995185 -0.098017 0.100000 0.009808 -0.001951 -0.000000 0.995185 -0.098017 -0.100000 0.009808 -0.001951 -0.000000 0.995185 -0.098017 -0.100000 0.009239 -0.003827 -1.000000 0.000000 0.000000 0.100000 0.009239 -0.003827 1.000000 0.000000 0.000000 0.100000 0.009808 -0.001951 -0.000000 0.956940 -0.290285 0.100000 0.009239 -0.003827 -0.000000 0.956940 -0.290285 -0.100000 0.009239 -0.003827 -0.000000 0.956940 -0.290285 -0.100000 0.008315 -0.005556 -1.000000 0.000000 0.000000 0.100000 0.008315 -0.005556 1.000000 0.000000 0.000000 0.100000 0.009239 -0.003827 -0.000000 0.881921 -0.471396 0.100000 0.008315 -0.005556 -0.000000 0.881921 -0.471396 -0.100000 0.008315 -0.005556 -0.000000 0.881921 -0.471396 -0.100000 0.007071 -0.007071 -1.000000 0.000000 0.000000 0.100000 0.007071 -0.007071 1.000000 0.000000 0.000000 0.100000 0.008315 -0.005556 -0.000000 0.773010 -0.634394 0.100000 0.007071 -0.007071 -0.000000 0.773010 -0.634394 -0.100000 0.007071 -0.007071 -0.000000 0.773010 -0.634394 -0.100000 0.005556 -0.008315 -1.000000 0.000000 0.000000 0.100000 0.005556 -0.008315 1.000000 0.000000 0.000000 0.100000 0.007071 -0.007071 -0.000000 0.634393 -0.773010 0.100000 0.005556 -0.008315 -0.000000 0.634393 -0.773010 -0.100000 0.005556 -0.008315 -0.000000 0.634393 -0.773010 -0.100000 0.003827 -0.009239 -1.000000 0.000000 0.000000 0.100000 0.003827 -0.009239 1.000000 0.000000 0.000000 0.100000 0.005556 -0.008315 -0.000000 0.471396 -0.881921 0.100000 0.003827 -0.009239 -0.000000 0.471396 -0.881921 -0.100000 0.003827 -0.009239 -0.000000 0.471396 -0.881921 -0.100000 0.001951 -0.009808 -1.000000 0.000000 0.000000 0.100000 0.001951 -0.009808 1.000000 0.000000 0.000000 0.100000 0.003827 -0.009239 -0.000000 0.290285 -0.956940 0.100000 0.001951 -0.009808 -0.000000 0.290285 -0.956940 -0.100000 0.001951 -0.009808 -0.000000 0.290285 -0.956940 -0.100000 0.000000 -0.010000 -1.000000 0.000000 0.000000 0.100000 0.000000 -0.010000 1.000000 0.000000 0.000000 0.100000 0.001951 -0.009808 -0.000000 0.098017 -0.995185 0.100000 0.000000 -0.010000 -0.000000 0.098017 -0.995185 -0.100000 0.000000 -0.010000 -0.000000 0.098017 -0.995185 -0.100000 -0.001951 -0.009808 -1.000000 0.000000 0.000000 0.100000 -0.001951 -0.009808 1.000000 0.000000 -0.000000 0.100000 0.000000 -0.010000 -0.000000 -0.098017 -0.995185 0.100000 -0.001951 -0.009808 -0.000000 -0.098017 -0.995185 -0.100000 -0.001951 -0.009808 -0.000000 -0.098017 -0.995185 -0.100000 -0.003827 -0.009239 -1.000000 0.000000 0.000000 0.100000 -0.003827 -0.009239 1.000000 0.000000 -0.000000 0.100000 -0.001951 -0.009808 -0.000000 -0.290285 -0.956940 0.100000 -0.003827 -0.009239 -0.000000 -0.290285 -0.956940 -0.100000 -0.003827 -0.009239 -0.000000 -0.290285 -0.956940 -0.100000 -0.005556 -0.008315 -1.000000 0.000000 0.000000 0.100000 -0.005556 -0.008315 1.000000 0.000000 -0.000000 0.100000 -0.003827 -0.009239 -0.000000 -0.471396 -0.881921 0.100000 -0.005556 -0.008315 -0.000000 -0.471396 -0.881921 -0.100000 -0.005556 -0.008315 -0.000000 -0.471396 -0.881921 -0.100000 -0.007071 -0.007071 -1.000000 0.000000 0.000000 0.100000 -0.007071 -0.007071 1.000000 0.000000 -0.000000 0.100000 -0.005556 -0.008315 -0.000000 -0.634393 -0.773010 0.100000 -0.007071 -0.007071 -0.000000 -0.634393 -0.773010 -0.100000 -0.007071 -0.007071 -0.000000 -0.634393 -0.773010 -0.100000 -0.008315 -0.005556 -1.000000 0.000000 0.000000 0.100000 -0.008315 -0.005556 1.000000 0.000000 -0.000000 0.100000 -0.007071 -0.007071 -0.000000 -0.773010 -0.634393 0.100000 -0.008315 -0.005556 -0.000000 -0.773010 -0.634393 -0.100000 -0.008315 -0.005556 -0.000000 -0.773010 -0.634393 -0.100000 -0.009239 -0.003827 -1.000000 0.000000 0.000000 0.100000 -0.009239 -0.003827 1.000000 0.000000 -0.000000 0.100000 -0.008315 -0.005556 -0.000000 -0.881921 -0.471397 0.100000 -0.009239 -0.003827 -0.000000 -0.881921 -0.471397 -0.100000 -0.009239 -0.003827 -0.000000 -0.881921 -0.471397 -0.100000 -0.009808 -0.001951 -1.000000 0.000000 0.000000 0.100000 -0.009808 -0.001951 1.000000 0.000000 -0.000000 0.100000 -0.009239 -0.003827 -0.000000 -0.956940 -0.290284 0.100000 -0.009808 -0.001951 -0.000000 -0.956940 -0.290284 -0.100000 -0.009808 -0.001951 -0.000000 -0.956940 -0.290284 -0.100000 -0.010000 0.000000 -1.000000 0.000000 0.000000 0.100000 -0.010000 -0.000000 1.000000 -0.000000 -0.000000 0.100000 -0.009808 -0.001951 -0.000000 -0.995185 -0.098017 0.100000 -0.010000 -0.000000 -0.000000 -0.995185 -0.098017 -0.100000 -0.010000 0.000000 -0.000000 -0.995185 -0.098017 -0.100000 -0.009808 0.001951 -1.000000 0.000000 -0.000000 0.100000 -0.009808 0.001951 1.000000 -0.000000 0.000000 0.100000 -0.010000 -0.000000 0.000000 -0.995185 0.098017 0.100000 -0.009808 0.001951 0.000000 -0.995185 0.098017 -0.100000 -0.009808 0.001951 0.000000 -0.995185 0.098017 -0.100000 -0.009239 0.003827 -1.000000 0.000000 -0.000000 0.100000 -0.009239 0.003827 1.000000 -0.000000 0.000000 0.100000 -0.009808 0.001951 0.000000 -0.956940 0.290286 0.100000 -0.009239 0.003827 0.000000 -0.956940 0.290286 -0.100000 -0.009239 0.003827 0.000000 -0.956940 0.290286 -0.100000 -0.008315 0.005556 -1.000000 0.000000 -0.000000 0.100000 -0.008315 0.005556 1.000000 -0.000000 0.000000 0.100000 -0.009239 0.003827 0.000000 -0.881921 0.471397 0.100000 -0.008315 0.005556 0.000000 -0.881921 0.471397 -0.100000 -0.008315 0.005556 0.000000 -0.881921 0.471397 -0.100000 -0.007071 0.007071 -1.000000 0.000000 -0.000000 0.100000 -0.007071 0.007071 1.000000 -0.000000 0.000000 0.100000 -0.008315 0.005556 0.000000 -0.773010 0.634394 0.100000 -0.007071 0.007071 0.000000 -0.773010 0.634394 -0.100000 -0.007071 0.007071 0.000000 -0.773010 0.634394 -0.100000 -0.005556 0.008315 -1.000000 0.000000 -0.000000 0.100000 -0.005556 0.008315 1.000000 -0.000000 0.000000 0.100000 -0.007071 0.007071 0.000000 -0.634392 0.773011 0.100000 -0.005556 0.008315 0.000000 -0.634392 0.773011 -0.100000 -0.005556 0.008315 0.000000 -0.634392 0.773011 -0.100000 -0.003827 0.009239 -1.000000 0.000000 -0.000000 0.100000 -0.003827 0.009239 1.000000 -0.000000 0.000000 0.100000 -0.005556 0.008315 0.000000 -0.471396 0.881922 0.100000 -0.003827 0.009239 0.000000 -0.471396 0.881922 -0.100000 -0.003827 0.009239 0.000000 -0.471396 0.881922 -0.100000 -0.001951 0.009808 -1.000000 0.000000 -0.000000 0.100000 -0.001951 0.009808 1.000000 -0.000000 0.000000 0.100000 -0.003827 0.009239 0.000000 -0.290284 0.956941 0.100000 -0.001951 0.009808 0.000000 -0.290284 0.956941 -0.100000 -0.001951 0.009808 0.000000 -0.290284 0.956941 -0.100000 0.000000 0.010000 -1.000000 0.000000 -0.000000 0.100000 0.000000 0.010000 1.000000 -0.000000 0.000000 0.100000 -0.001951 0.009808 0.000000 -0.098016 0.995185 0.100000 0.000000 0.010000 0.000000 -0.098016 0.995185 -0.100000 0.000000 0.010000 0.000000 -0.098016 0.995185 -0.100000 0.001951 0.009808 -1.000000 -0.000000 0.000000 0.100000 0.001951 0.009808 1.000000 0.000000 0.000000 0.100000 0.000000 0.010000 0.000000 0.098018 0.995185 0.100000 0.001951 0.009808 0.000000 0.098018 0.995185 -0.100000 0.001951 0.009808 0.000000 0.098018 0.995185 -0.100000 0.003827 0.009239 -1.000000 -0.000000 0.000000 0.100000 0.003827 0.009239 1.000000 0.000000 0.000000 0.100000 0.001951 0.009808 0.000000 0.290286 0.956940 0.100000 0.003827 0.009239 0.000000 0.290286 0.956940 -0.100000 0.003827 0.009239 0.000000 0.290286 0.956940 -0.100000 0.005556 0.008315 -1.000000 -0.000000 0.000000 0.100000 0.005556 0.008315 1.000000 0.000000 0.000000 0.100000 0.003827 0.009239 0.000000 0.471397 0.881921 0.100000 0.005556 0.008315 0.000000 0.471397 0.881921 -0.100000 0.005556 0.008315 0.000000 0.471397 0.881921 -0.100000 0.007071 0.007071 -1.000000 -0.000000 0.000000 0.100000 0.007071 0.007071 1.000000 0.000000 0.000000 0.100000 0.005556 0.008315 0.000000 0.634394 0.773010 0.100000 0.007071 0.007071 0.000000 0.634394 0.773010 -0.100000 0.007071 0.007071 0.000000 0.634394 0.773010 -0.100000 0.008315 0.005556 -1.000000 -0.000000 0.000000 0.100000 0.008315 0.005556 1.000000 0.000000 0.000000 0.100000 0.007071 0.007071 0.000000 0.773011 0.634392 0.100000 0.008315 0.005556 0.000000 0.773011 0.634392 -0.100000 0.008315 0.005556 0.000000 0.773011 0.634392 -0.100000 0.009239 0.003827 -1.000000 -0.000000 0.000000 0.100000 0.009239 0.003827 1.000000 0.000000 0.000000 0.100000 0.008315 0.005556 0.000000 0.881922 0.471395 0.100000 0.009239 0.003827 0.000000 0.881922 0.471395 -0.100000 0.009239 0.003827 0.000000 0.881922 0.471395 -0.100000 0.009808 0.001951 -1.000000 -0.000000 0.000000 0.100000 0.009808 0.001951 1.000000 0.000000 0.000000 0.100000 0.009239 0.003827 0.000000 0.956941 0.290283 0.100000 0.009808 0.001951 0.000000 0.956941 0.290283 -0.100000 0.009808 0.001951 0.000000 0.956941 0.290283 0.100000 0.009808 0.001951 0.000000 0.995185 0.098017 0.100000 0.010000 -0.000000 0.000000 0.995185 0.098017 -0.100000 0.010000 0.000000 0.000000 0.995185 0.098017 -0.100000 0.010000 0.000000 -0.000000 0.995185 -0.098017 -0.100000 0.009808 -0.001951 -0.000000 0.956940 -0.290285 -0.100000 0.009239 -0.003827 -0.000000 0.881921 -0.471396 -0.100000 0.008315 -0.005556 -0.000000 0.773010 -0.634394 -0.100000 0.007071 -0.007071 -0.000000 0.634393 -0.773011 0.100000 0.007071 -0.007071 -0.000000 0.634393 -0.773011 -0.100000 0.005556 -0.008315 -0.000000 0.634393 -0.773011 -0.100000 0.005556 -0.008315 -0.000000 0.471396 -0.881921 -0.100000 0.003827 -0.009239 -0.000000 0.290285 -0.956940 -0.100000 0.001951 -0.009808 -0.000000 0.098017 -0.995185 -0.100000 0.000000 -0.010000 -0.000000 -0.098017 -0.995185 -0.100000 -0.001951 -0.009808 -0.000000 -0.290285 -0.956940 -0.100000 -0.003827 -0.009239 -0.000000 -0.471396 -0.881921 -0.100000 -0.005556 -0.008315 -0.000000 -0.634393 -0.773011 0.100000 -0.005556 -0.008315 -0.000000 -0.634393 -0.773011 -0.100000 -0.007071 -0.007071 -0.000000 -0.634393 -0.773011 -0.100000 -0.007071 -0.007071 -0.000000 -0.773010 -0.634393 -0.100000 -0.008315 -0.005556 -0.000000 -0.881921 -0.471397 -0.100000 -0.009239 -0.003827 -0.000000 -0.956940 -0.290284 -0.100000 -0.009808 -0.001951 -0.000000 -0.995185 -0.098017 -0.100000 -0.010000 0.000000 0.000000 -0.995185 0.098017 -0.100000 -0.009808 0.001951 0.000000 -0.956940 0.290286 -0.100000 -0.009239 0.003827 0.000000 -0.881921 0.471397 -0.100000 -0.008315 0.005556 0.000000 -0.773010 0.634394 -0.100000 -0.007071 0.007071 0.000000 -0.634393 0.773011 0.100000 -0.007071 0.007071 0.000000 -0.634393 0.773011 -0.100000 -0.005556 0.008315 0.000000 -0.634393 0.773011 -0.100000 -0.005556 0.008315 0.000000 -0.471396 0.881922 -0.100000 -0.003827 0.009239 0.000000 -0.290284 0.956941 -0.100000 -0.001951 0.009808 0.000000 -0.098016 0.995185 -0.100000 0.000000 0.010000 0.000000 0.098018 0.995185 -0.100000 0.001951 0.009808 0.000000 0.290286 0.956940 -0.100000 0.003827 0.009239 0.000000 0.471397 0.881921 -0.100000 0.005556 0.008315 0.000000 0.634395 0.773009 0.100000 0.005556 0.008315 0.000000 0.634395 0.773009 -0.100000 0.007071 0.007071 0.000000 0.634395 0.773009 -0.100000 0.007071 0.007071 0.000000 0.773011 0.634392 -0.100000 0.008315 0.005556 0.000000 0.881922 0.471396 0.100000 0.008315 0.005556 0.000000 0.881922 0.471396 -0.100000 0.009239 0.003827 0.000000 0.881922 0.471396 -0.100000 0.009239 0.003827 0.000000 0.956941 0.290283 -0.100000 0.009808 0.001951 0.000000 0.995185 0.098017 3 0 1 2 3 3 4 5 3 6 7 8 3 0 2 9 3 3 10 4 3 11 12 13 3 0 9 14 3 3 15 10 3 16 17 18 3 0 14 19 3 3 20 15 3 21 22 23 3 0 19 24 3 3 25 20 3 26 27 28 3 0 24 29 3 3 30 25 3 31 32 33 3 0 29 34 3 3 35 30 3 36 37 38 3 0 34 39 3 3 40 35 3 41 42 43 3 0 39 44 3 3 45 40 3 46 47 48 3 0 44 49 3 3 50 45 3 51 52 53 3 0 49 54 3 3 55 50 3 56 57 58 3 0 54 59 3 3 60 55 3 61 62 63 3 0 59 64 3 3 65 60 3 66 67 68 3 0 64 69 3 3 70 65 3 71 72 73 3 0 69 74 3 3 75 70 3 76 77 78 3 0 74 79 3 3 80 75 3 81 82 83 3 0 79 84 3 3 85 80 3 86 87 88 3 0 84 89 3 3 90 85 3 91 92 93 3 0 89 94 3 3 95 90 3 96 97 98 3 0 94 99 3 3 100 95 3 101 102 103 3 0 99 104 3 3 105 100 3 106 107 108 3 0 104 109 3 3 110 105 3 111 112 113 3 0 109 114 3 3 115 110 3 116 117 118 3 0 114 119 3 3 120 115 3 121 122 123 3 0 119 124 3 3 125 120 3 126 127 128 3 0 124 129 3 3 130 125 3 131 132 133 3 0 129 134 3 3 135 130 3 136 137 138 3 0 134 139 3 3 140 135 3 141 142 143 3 0 139 144 3 3 145 140 3 146 147 148 3 0 144 149 3 3 150 145 3 151 152 153 3 0 149 154 3 3 155 150 3 156 157 158 3 0 154 1 3 3 5 155 3 159 160 161 3 162 6 8 3 163 11 13 3 164 16 18 3 165 21 23 3 166 167 168 3 169 31 33 3 170 36 38 3 171 41 43 3 172 46 48 3 173 51 53 3 174 56 58 3 175 176 177 3 178 66 68 3 179 71 73 3 180 76 78 3 181 81 83 3 182 86 88 3 183 91 93 3 184 96 98 3 185 101 103 3 186 187 188 3 189 111 113 3 190 116 118 3 191 121 123 3 192 126 128 3 193 131 133 3 194 136 138 3 195 196 197 3 198 146 148 3 199 200 201 3 202 156 158 3 203 159 161 opensurgsim-0.7.0/SurgSim/Physics/RenderTests/Data/half_knot.ply000066400000000000000000000063721277777236100247450ustar00rootroot00000000000000ply format ascii 1.0 comment Prolene 3.0 comment https://en.wikipedia.org/wiki/Prolene comment Prolene is a synthetic, monofilament, nonabsorbable polypropylene suture comment https://en.wikipedia.org/wiki/Surgical_suture comment Surgical suture sizes are often refered in USP unit comment This model is a 3.0 USP (0.2mm diameter) comment https://en.wikipedia.org/wiki/Young's_modulus comment Young modulus for polypropylene is between 1.5-2 GPa comment https://en.wikipedia.org/wiki/Polypropylene comment Mass density for polypropylene is between 855 and 946 Kg.m-3 comment http://www.vinidex.com.au/technical/material-properties/polypropylene-properties/ comment Poisson ratio for polypropylene is 0.45 element vertex 63 property double x property double y property double z element 1d_element 62 property list uint uint vertex_indices element radius 1 property double value element material 1 property double mass_density property double poisson_ratio property double young_modulus element boundary_condition 2 property uint vertex_index end_header -0.063988 0.035971 0.001502 -0.062314 0.035845 0.001502 -0.058927 0.035774 0.001502 -0.054140 0.034099 0.001500 -0.049371 0.032492 0.001508 -0.044793 0.030356 0.001482 -0.040472 0.027735 0.001572 -0.036726 0.024439 0.002441 -0.032934 0.021236 0.003300 -0.028799 0.018268 0.003098 -0.024722 0.015856 0.001294 -0.020714 0.013729 -0.000962 -0.016169 0.011300 -0.001046 -0.011773 0.009644 0.001057 -0.007495 0.010778 0.003732 -0.003107 0.013450 0.004363 0.001183 0.015271 0.002129 0.005421 0.014709 -0.000760 0.009751 0.011748 -0.001268 0.013047 0.008401 0.000717 0.015779 0.004124 0.001146 0.018265 -0.000243 0.001458 0.020098 -0.004962 0.001517 0.021334 -0.009870 0.001496 0.021239 -0.014952 0.001504 0.020081 -0.019876 0.001501 0.018139 -0.024544 0.001502 0.015443 -0.028836 0.001502 0.011752 -0.032312 0.001502 0.007423 -0.034932 0.001502 0.002647 -0.036596 0.001502 -0.002288 -0.037628 0.001502 -0.007369 -0.037620 0.001502 -0.012198 -0.036069 0.001502 -0.016676 -0.033751 0.001502 -0.020932 -0.031026 0.001502 -0.024359 -0.027261 0.001502 -0.026705 -0.022787 0.001502 -0.028472 -0.018039 0.001500 -0.029025 -0.012994 0.001507 -0.028477 -0.007962 0.001431 -0.026953 -0.003131 0.001173 -0.025412 0.001636 0.001012 -0.023105 0.006241 0.000991 -0.020773 0.010135 0.003309 -0.016732 0.013315 0.004273 -0.012269 0.015101 0.002516 -0.007868 0.014977 -0.000180 -0.003604 0.012248 -0.001343 0.000726 0.009916 0.000484 0.004992 0.010415 0.003128 0.009576 0.012768 0.004503 0.013512 0.015055 0.002167 0.017607 0.017447 0.000416 0.021803 0.020336 0.000200 0.025923 0.023100 0.001042 0.030292 0.025627 0.001485 0.035002 0.027418 0.001534 0.039908 0.028661 0.001477 0.044947 0.028927 0.001517 0.049973 0.029365 0.001497 0.053335 0.029135 0.001502 0.055012 0.029068 0.001502 2 0 1 2 1 2 2 2 3 2 3 4 2 4 5 2 5 6 2 6 7 2 7 8 2 8 9 2 9 10 2 10 11 2 11 12 2 12 13 2 13 14 2 14 15 2 15 16 2 16 17 2 17 18 2 18 19 2 19 20 2 20 21 2 21 22 2 22 23 2 23 24 2 24 25 2 25 26 2 26 27 2 27 28 2 28 29 2 29 30 2 30 31 2 31 32 2 32 33 2 33 34 2 34 35 2 35 36 2 36 37 2 37 38 2 38 39 2 39 40 2 40 41 2 41 42 2 42 43 2 43 44 2 44 45 2 45 46 2 46 47 2 47 48 2 48 49 2 49 50 2 50 51 2 51 52 2 52 53 2 53 54 2 54 55 2 55 56 2 56 57 2 57 58 2 58 59 2 59 60 2 60 61 2 61 62 0.0001 900.0 0.48 1.75e7 0 62 opensurgsim-0.7.0/SurgSim/Physics/RenderTests/Data/loop.ply000066400000000000000000000032131277777236100237400ustar00rootroot00000000000000ply format ascii 1.0 comment Created by OpenSurgSim, www.opensurgsim.org element vertex 40 property float x property float y property float z element 1d_element 39 property list uint uint vertex_indices element radius 1 property double value element material 1 property double mass_density property double poisson_ratio property double young_modulus element boundary_condition 2 property uint vertex_index end_header -0.2 0.095 0.2 -0.18192 0.094096 0.18192 -0.16096 0.093048 0.16096 -0.13904 0.091952 0.13904 -0.11808 0.090904 0.11808 -0.1 0.09 0.1 -0.08192 0.089096 0.08192 -0.06096 0.088048 0.06096 -0.03904 0.086952 0.03904 -0.01808 0.085904 0.01808 0 0.085 0 0.02064 0.084096 -0.01808 0.04672 0.083048 -0.03904 0.07248 0.081952 -0.06096 0.09216 0.080904 -0.08192 0.1 0.08 -0.1 0.09216 0.079096 -0.12064 0.07248 0.078048 -0.14672 0.04672 0.076952 -0.17248 0.02064 0.075904 -0.19216 0 0.075 -0.2 -0.02064 0.074096 -0.19216 -0.04672 0.073048 -0.17248 -0.07248 0.071952 -0.14672 -0.09216 0.070904 -0.12064 -0.1 0.07 -0.1 -0.09216 0.069096 -0.08192 -0.07248 0.068048 -0.06096 -0.04672 0.066952 -0.03904 -0.02064 0.065904 -0.01808 0 0.065 0 0.01808 0.064096 0.01808 0.03904 0.063048 0.03904 0.06096 0.061952 0.06096 0.08192 0.060904 0.08192 0.1 0.06 0.1 0.11808 0.059096 0.11808 0.13904 0.058048 0.13904 0.16096 0.056952 0.16096 0.18192 0.055904 0.18192 2 0 1 2 1 2 2 2 3 2 3 4 2 4 5 2 5 6 2 6 7 2 7 8 2 8 9 2 9 10 2 10 11 2 11 12 2 12 13 2 13 14 2 14 15 2 15 16 2 16 17 2 17 18 2 18 19 2 19 20 2 20 21 2 21 22 2 22 23 2 23 24 2 24 25 2 25 26 2 26 27 2 27 28 2 28 29 2 29 30 2 30 31 2 31 32 2 32 33 2 33 34 2 34 35 2 35 36 2 36 37 2 37 38 2 38 39 0.001 900.0 0.45 1.75e8 19 38opensurgsim-0.7.0/SurgSim/Physics/RenderTests/Data/prolene 3.0-fixedExtremity.ply000066400000000000000000000117741277777236100277370ustar00rootroot00000000000000ply format ascii 1.0 comment Prolene 3.0 comment https://en.wikipedia.org/wiki/Prolene comment Prolene is a synthetic, monofilament, nonabsorbable polypropylene suture comment https://en.wikipedia.org/wiki/Surgical_suture comment Surgical suture sizes are often refered in USP unit comment This model is a 3.0 USP (0.2mm diameter) comment https://en.wikipedia.org/wiki/Young's_modulus comment Young modulus for polypropylene is between 1.5-2 GPa comment https://en.wikipedia.org/wiki/Polypropylene comment Mass density for polypropylene is between 855 and 946 Kg.m-3 comment http://www.vinidex.com.au/technical/material-properties/polypropylene-properties/ comment Poisson ratio for polypropylene is 0.45 element vertex 65 property double x property double y property double z element 1d_element 64 property list uint uint vertex_indices property double mass_density property double poisson_ratio property double young_modulus element radius 1 property double value element boundary_condition 1 property uint vertex_index end_header 0 0.01 -0.175 0 0.0155 -0.17 0 0.019 -0.165 0 0.019 -0.16 0 0.0155 -0.155 0 0.01 -0.15 0.0010452846 0.009945219 -0.1449152542 0.0020791169 0.009781476 -0.1398305084 0.0030901699 0.0095105652 -0.1347457626 0.0040673664 0.0091354546 -0.1296610168 0.005 0.008660254 -0.124576271 0.0058778525 0.0080901699 -0.1194915252 0.0066913061 0.0074314483 -0.1144067794 0.0074314483 0.0066913061 -0.1093220336 0.0080901699 0.0058778525 -0.1042372878 0.008660254 0.005 -0.099152542 0.0091354546 0.0040673664 -0.0940677962 0.0095105652 0.0030901699 -0.0889830504 0.009781476 0.0020791169 -0.0838983046 0.009945219 0.0010452846 -0.0788135588 0.01 2.94896168765644E-012 -0.073728813 0.009945219 -0.0010452846 -0.0686440672 0.009781476 -0.0020791169 -0.0635593214 0.0095105652 -0.0030901699 -0.0584745756 0.0091354546 -0.0040673664 -0.0533898298 0.008660254 -0.005 -0.048305084 0.0080901699 -0.0058778525 -0.0432203382 0.0074314483 -0.0066913061 -0.0381355924 0.0066913061 -0.0074314483 -0.0330508466 0.0058778525 -0.0080901699 -0.0279661008 0.005 -0.008660254 -0.022881355 0.0040673664 -0.0091354546 -0.0177966092 0.0030901699 -0.0095105652 -0.0127118634 0.0020791169 -0.009781476 -0.0076271176 0.0010452846 -0.009945219 -0.0025423718 5.89791449352869E-012 -0.01 0.002542374 -0.0010452846 -0.009945219 0.0076271198 -0.0020791169 -0.009781476 0.0127118656 -0.0030901699 -0.0095105652 0.0177966114 -0.0040673664 -0.0091354546 0.0228813572 -0.005 -0.008660254 0.027966103 -0.0058778525 -0.0080901699 0.0330508488 -0.0066913061 -0.0074314483 0.0381355946 -0.0074314482 -0.0066913061 0.0432203404 -0.0080901699 -0.0058778525 0.0483050862 -0.008660254 -0.005 0.053389832 -0.0091354546 -0.0040673664 0.0584745778 -0.0095105652 -0.00309017 0.0635593236 -0.009781476 -0.0020791169 0.0686440694 -0.009945219 -0.0010452846 0.0737288152 -0.01 -8.84689838564563E-012 0.078813561 -0.009945219 0.0010452846 0.0838983068 -0.009781476 0.0020791169 0.0889830526 -0.0095105652 0.0030901699 0.0940677984 -0.0091354546 0.0040673664 0.0991525442 -0.008660254 0.005 0.10423729 -0.0080901699 0.0058778525 0.1093220358 -0.0074314483 0.0066913061 0.1144067816 -0.0066913061 0.0074314482 0.1194915274 -0.0058778525 0.0080901699 0.1245762732 -0.005 0.008660254 0.129661019 -0.0040673664 0.0091354546 0.1347457648 -0.00309017 0.0095105652 0.1398305106 -0.0020791169 0.009781476 0.1449152564 -0.0010452846 0.009945219 0.1500000022 2 0 1 900.0 0.45 200e9 2 1 2 900.0 0.45 200e9 2 2 3 900.0 0.45 200e9 2 3 4 900.0 0.45 200e9 2 4 5 900.0 0.45 200e9 2 5 6 900.0 0.45 25e9 2 6 7 900.0 0.45 12e9 2 7 8 900.0 0.45 6e9 2 8 9 900.0 0.45 3e9 2 9 10 900.0 0.45 1.75e9 2 10 11 900.0 0.45 1.75e9 2 11 12 900.0 0.45 1.75e9 2 12 13 900.0 0.45 1.75e9 2 13 14 900.0 0.45 1.75e9 2 14 15 900.0 0.45 1.75e9 2 15 16 900.0 0.45 1.75e9 2 16 17 900.0 0.45 1.75e9 2 17 18 900.0 0.45 1.75e9 2 18 19 900.0 0.45 1.75e9 2 19 20 900.0 0.45 1.75e9 2 20 21 900.0 0.45 1.75e9 2 21 22 900.0 0.45 1.75e9 2 22 23 900.0 0.45 1.75e9 2 23 24 900.0 0.45 1.75e9 2 24 25 900.0 0.45 1.75e9 2 25 26 900.0 0.45 1.75e9 2 26 27 900.0 0.45 1.75e9 2 27 28 900.0 0.45 1.75e9 2 28 29 900.0 0.45 1.75e9 2 29 30 900.0 0.45 1.75e9 2 30 31 900.0 0.45 1.75e9 2 31 32 900.0 0.45 1.75e9 2 32 33 900.0 0.45 1.75e9 2 33 34 900.0 0.45 1.75e9 2 34 35 900.0 0.45 1.75e9 2 35 36 900.0 0.45 1.75e9 2 36 37 900.0 0.45 1.75e9 2 37 38 900.0 0.45 1.75e9 2 38 39 900.0 0.45 1.75e9 2 39 40 900.0 0.45 1.75e9 2 40 41 900.0 0.45 1.75e9 2 41 42 900.0 0.45 1.75e9 2 42 43 900.0 0.45 1.75e9 2 43 44 900.0 0.45 1.75e9 2 44 45 900.0 0.45 1.75e9 2 45 46 900.0 0.45 1.75e9 2 46 47 900.0 0.45 1.75e9 2 47 48 900.0 0.45 1.75e9 2 48 49 900.0 0.45 1.75e9 2 49 50 900.0 0.45 1.75e9 2 50 51 900.0 0.45 1.75e9 2 51 52 900.0 0.45 1.75e9 2 52 53 900.0 0.45 1.75e9 2 53 54 900.0 0.45 1.75e9 2 54 55 900.0 0.45 1.75e9 2 55 56 900.0 0.45 1.75e9 2 56 57 900.0 0.45 1.75e9 2 57 58 900.0 0.45 1.75e9 2 58 59 900.0 0.45 1.75e9 2 59 60 900.0 0.45 1.75e9 2 60 61 900.0 0.45 1.75e9 2 61 62 900.0 0.45 1.75e9 2 62 63 900.0 0.45 1.75e9 2 63 64 900.0 0.45 1.75e9 0.0001 0opensurgsim-0.7.0/SurgSim/Physics/RenderTests/Data/uniaxial_positions.csv000066400000000000000000000665621277777236100267170ustar00rootroot00000000000000Truth Cube,,,,,,,,,,,,,, Uniaxial Compression Test displacment field data for all 4 strains,,,,,,,,,,,,,, All positions in mm,,,,,,,,,,,,,, 12-Oct-01,,,,,,,,,,,,,, ,,,,,,,,,,,,,, bead nominal location,,,no strain,,,5% strain,,,12.5% strain,,,18.25% strain,, i,j,k,x0,y0,z0,x1,y1,z1,x2,y2,z2,x3,y3,z3 1,1,1,-29.69,-28.86,12.62,-30.33,-29.38,12.96,-31.04,-30.09,13.65,-31.85,-31.08,14.38 1,1,2,-29.07,-27.43,3.33,-29.87,-28.12,4.27,-31.03,-29.37,5.9,-32.29,-30.62,7.05 1,1,3,-28.76,-26.88,-6.49,-29.66,-27.61,-5,-31.17,-29.37,-2.79,-32.62,-30.62,-0.6 1,1,4,-28.91,-27.44,-16.83,-29.87,-28.12,-14.66,-31.36,-29.37,-11.69,-32.84,-30.62,-8.72 1,1,5,-28.95,-26.88,-26.91,-30.06,-26.88,-23.94,-31.41,-28.8,-20.07,-32.89,-30.16,-16.55 1,1,6,-28.76,-26.88,-37.29,-29.87,-26.88,-33.58,-30.99,-28.12,-28.76,-32.47,-29.83,-24.68 1,1,7,-28.76,-26.88,-47.31,-29.91,-26.88,-42.71,-30.62,-28.12,-37.29,-31.7,-29.37,-32.44 1,2,1,-30.16,-18.75,12.43,-30.8,-18.95,12.75,-31.64,-19.37,13.36,-32.56,-19.94,14.04 1,2,2,-29.18,-17.45,3.31,-30.1,-17.76,4.21,-31.4,-18.53,5.44,-32.8,-19.37,6.71 1,2,3,-28.95,-17.5,-6.68,-29.91,-18.12,-5.04,-31.54,-18.75,-2.97,-33.15,-19.83,-0.96 1,2,4,-29.01,-17.4,-16.88,-30.09,-17.49,-14.69,-31.73,-18.12,-11.69,-33.4,-19.37,-8.91 1,2,5,-29.14,-16.88,-26.77,-30.24,-16.88,-23.94,-31.7,-18.12,-20.19,-33.4,-19.37,-16.52 1,2,6,-28.72,-17.45,-37.14,-29.87,-16.88,-33.58,-30.99,-18.12,-28.76,-32.53,-18.61,-24.6 1,2,7,-28.72,-17.33,-47.28,-29.87,-16.88,-42.86,-30.44,-17.37,-37.3,-31.73,-18.12,-32.47 1,3,1,-30.76,-8.13,12.29,-31.53,-8.44,12.73,-32.33,-8.46,13.32,-33.35,-8.75,13.79 1,3,2,-29.22,-6.88,3.07,-30.24,-6.88,3.9,-31.72,-7.39,5.22,-33.17,-7.68,6.53 1,3,3,-29.13,-6.88,-6.87,-30.24,-6.88,-5.38,-31.83,-7.43,-3.2,-33.58,-8.13,-1.3 1,3,4,-29.79,-7.58,-17.02,-31.02,-6.88,-14.69,-32.51,-7.67,-11.73,-34.48,-8.13,-9.05 1,3,5,-28.95,-6.88,-26.91,-29.91,-6.88,-23.97,-31.54,-6.88,-20.22,-33.22,-7.5,-16.7 1,3,6,-28.76,-6.88,-37.29,-29.97,-6.32,-33.7,-30.99,-6.88,-28.95,-32.69,-6.88,-24.72 1,3,7,-28.93,-7.49,-47.15,-29.87,-6.88,-42.86,-30.62,-6.88,-37.29,-31.73,-6.88,-32.47 1,4,1,-30.05,1.33,12.27,-30.75,1.54,12.57,-31.66,1.32,13.16,-32.61,1.31,13.73 1,4,2,-29.5,3.13,3.15,-30.62,3.13,3.9,-31.91,3.13,5.2,-33.39,3.13,6.4 1,4,3,-29.5,3.13,-6.87,-30.62,3.13,-5.38,-32.28,3.13,-3.35,-33.97,3.55,-1.3 1,4,4,-29.1,3.13,-17.22,-30.25,4.38,-14.84,-31.73,4.38,-12.06,-33.54,4.38,-9.24 1,4,5,-29.1,3.13,-26.94,-30.06,3.75,-24.12,-31.53,3.8,-20.36,-33.21,4.38,-16.88 1,4,6,-29.13,3.13,-37.29,-30.22,4.38,-33.92,-31.36,4.38,-29.13,-32.84,4.38,-25.05 1,4,7,-28.87,3.13,-47.5,-29.85,4.38,-43.2,-30.62,4.38,-37.67,-31.73,4.38,-32.84 1,5,1,-30.27,12.52,12.08,-30.95,12.88,12.61,-32.02,13.13,13.1,-32.83,13.44,13.69 1,5,2,-29.74,13.13,3,-30.8,13.75,3.89,-32.14,14.37,5.23,-33.58,14.37,6.49 1,5,3,-29.35,13.13,-6.91,-30.56,13.93,-5.35,-32.13,14.37,-3.19,-33.91,15.05,-1.46 1,5,4,-30.62,13.13,-17.26,-31.73,14.37,-15.03,-33.4,15,-11.87,-35.18,15.62,-9.28 1,5,5,-29.14,13.13,-27.09,-30.24,14.37,-24.31,-31.73,14.87,-20.4,-33.58,15.62,-16.88 1,5,6,-29.08,12.43,-37.47,-30.06,13.82,-33.89,-31.33,14.37,-29.1,-32.84,15.62,-25.05 1,5,7,-28.82,12.57,-47.49,-29.87,14.37,-43.23,-30.56,14.9,-37.71,-31.58,15.62,-32.88 1,6,1,-30.69,23.83,12.29,-31.36,24.37,12.5,-32.3,24.98,13.15,-33.14,25.44,13.74 1,6,2,-30.11,23.12,3,-31.03,23.86,3.95,-32.49,24.81,5.34,-33.96,25.63,6.49 1,6,3,-30.08,22.49,-7.03,-31.17,23.62,-5.39,-32.84,24.37,-3.15,-34.51,25.63,-1.18 1,6,4,-30.24,23.12,-17.26,-31.36,24.37,-15.03,-33.03,25.63,-11.88,-34.74,26.88,-9.24 1,6,5,-29.32,22.63,-27.28,-30.24,24.37,-24.31,-31.84,25.63,-20.41,-33.36,26.88,-16.93 1,6,6,-29.13,23.12,-37.67,-30.24,24.37,-33.96,-31.39,25.63,-29.16,-32.84,26.88,-25.05 1,6,7,-28.72,22.67,-47.65,-29.53,24.37,-43.26,-30.57,25.63,-37.71,-31.73,26.88,-33.21 1,7,1,-30.71,34.08,12.22,-31.29,34.91,12.76,-32.33,35.9,13.3,-33.1,36.51,14.11 1,7,2,-29.89,33.63,3,-30.9,34.79,4.06,-32.25,36.27,5.6,-33.56,37.45,7.15 1,7,3,-29.99,33.13,-7.05,-31.01,34.38,-5.35,-32.66,36.12,-2.79,-34.05,37.56,-0.73 1,7,4,-29.53,33.13,-17.22,-30.68,34.93,-14.85,-32.28,36.87,-11.69,-33.92,38.12,-8.75 1,7,5,-29.5,33.13,-27.28,-30.43,35,-24.12,-31.73,36.87,-20.22,-33.24,38.12,-16.85 1,7,6,-29.5,33.13,-37.67,-30.48,35,-33.81,-31.73,36.87,-29.13,-33.17,38.12,-25.2 1,7,7,-29.32,33.13,-47.69,-30.11,35,-43.38,-31.36,36.87,-37.67,-32.47,38.12,-33.21 2,1,1,-19.25,-29.37,12.58,-19.48,-30.14,12.8,-19.96,-31.14,13.53,-20.28,-32.11,14.23 2,1,2,-19.26,-27.48,3.37,-19.85,-28.12,4.27,-20.56,-29.37,5.6,-21.34,-30.62,6.87 2,1,3,-17.81,-26.88,-6.49,-18.41,-27.46,-5.16,-19.44,-28.91,-3.07,-20.22,-30.62,-0.93 2,1,4,-18.93,-26.88,-16.89,-19.7,-27.56,-14.61,-20.6,-29.37,-11.69,-21.71,-30.62,-8.72 2,1,5,-18.55,-26.88,-26.91,-19.28,-27.49,-23.77,-20.04,-28.88,-19.86,-20.99,-30.62,-16.48 2,1,6,-18.77,-26.88,-36.96,-19.46,-26.88,-33.55,-20.04,-28.12,-28.57,-20.97,-29.37,-24.31 2,1,7,-18.55,-26.88,-47.13,-19.17,-26.32,-42.68,-19.4,-27.38,-37.02,-20.22,-28.12,-32.1 2,2,1,-20.04,-19.37,12.43,-20.4,-19.37,12.71,-20.94,-20,13.21,-21.4,-20.63,13.67 2,2,2,-19.2,-17.62,3.24,-19.73,-18.12,4.05,-20.67,-18.66,5.31,-21.37,-19.37,6.16 2,2,3,-18.62,-16.88,-6.69,-19.14,-16.88,-5.35,-20.22,-18.12,-3.15,-21.34,-19.37,-1.3 2,2,4,-18.77,-18.12,-16.85,-19.48,-18.12,-14.66,-20.45,-18.78,-11.67,-21.62,-19.88,-9 2,2,5,-18.74,-16.88,-26.9,-19.48,-16.88,-23.94,-20.34,-18.12,-20.04,-21.52,-19.37,-16.52 2,2,6,-18.74,-16.88,-37.29,-19.48,-16.88,-33.58,-20.2,-17.33,-28.7,-21.15,-18.12,-24.31 2,2,7,-18.74,-16.88,-46.94,-19.48,-16.88,-42.86,-19.82,-16.88,-36.95,-20.6,-18.12,-32.1 2,3,1,-20.07,-10.05,12.38,-20.49,-10.15,12.61,-21.02,-10.63,13.39,-21.48,-10.63,13.58 2,3,2,-19.2,-6.88,3.24,-19.85,-6.88,3.9,-20.63,-6.88,4.98,-21.67,-7.51,6.14 2,3,3,-19.11,-6.88,-6.87,-19.85,-6.88,-5.38,-20.8,-7.49,-3.36,-21.89,-8.13,-1.55 2,3,4,-19.14,-6.88,-16.92,-19.89,-6.88,-14.69,-21,-6.88,-11.72,-22.26,-7.57,-9.16 2,3,5,-18.74,-6.88,-26.9,-19.49,-6.88,-24.12,-20.25,-6.88,-20.19,-21.67,-7.33,-16.55 2,3,6,-18.93,-6.88,-37.3,-19.6,-6.34,-33.67,-20.22,-6.88,-28.76,-21.34,-6.88,-24.49 2,3,7,-18.73,-7.38,-47.16,-19.31,-6.38,-42.87,-19.83,-6.88,-37.26,-20.41,-6.88,-32.29 2,4,1,-20.78,0.98,12.18,-21.12,1.08,12.52,-21.72,1.11,13.02,-22.27,0.99,13.54 2,4,2,-19.52,3.13,3,-20.2,3.57,3.85,-21.12,3.73,4.86,-22.02,3.75,6.05 2,4,3,-18.77,3.13,-6.83,-19.51,3.13,-5.41,-20.6,3.13,-3.53,-21.68,3.57,-1.71 2,4,4,-19.23,3.13,-17.07,-19.97,3.8,-14.9,-20.99,4.38,-12.03,-22.11,4.38,-9.43 2,4,5,-18.77,3.13,-26.94,-19.67,4.38,-24.31,-20.6,4.38,-20.22,-21.71,4.38,-16.88 2,4,6,-19.11,3.13,-37.29,-19.67,4.38,-33.84,-20.41,4.38,-28.76,-21.52,4.93,-24.75 2,4,7,-19.06,3.59,-47.27,-19.65,4.99,-43.06,-19.85,5.63,-37.29,-20.6,5.63,-32.47 2,5,1,-20.18,11.88,12.38,-20.6,11.88,12.43,-21.23,12.53,13,-21.77,12.65,13.56 2,5,2,-19.85,13.13,3.15,-20.56,14.37,3.87,-21.34,14.37,5.01,-22.27,15,5.94 2,5,3,-19.11,13.13,-6.87,-20.04,14.37,-5.57,-21.14,14.87,-3.53,-22.08,15.62,-1.67 2,5,4,-19.64,13.13,-17.1,-20.41,13.82,-14.96,-21.52,14.37,-12.07,-22.8,15.62,-9.43 2,5,5,-19.11,13.13,-26.9,-19.85,14.37,-24.31,-20.78,15.62,-20.23,-21.89,15.62,-16.89 2,5,6,-19.11,13.13,-37.29,-19.83,14.37,-33.92,-20.41,15.62,-29.14,-21.45,15.62,-24.87 2,5,7,-18.74,13.13,-47.31,-19.46,14.37,-43.2,-19.83,15.62,-37.63,-20.48,15.62,-32.66 2,6,1,-21.15,23.42,12.14,-21.62,23.68,12.66,-22.15,24.37,13.01,-22.75,24.84,13.52 2,6,2,-19.67,23.12,2.97,-20.22,24.37,3.9,-21.28,25.17,4.98,-22.05,25.63,6.09 2,6,3,-19.49,23.12,-7.05,-20.06,24.89,-5.4,-21.16,26.12,-3.53,-22.27,26.88,-1.68 2,6,4,-18.37,23.12,-17.26,-19.11,24.37,-15.03,-20.22,25.63,-12.06,-21.31,26.88,-9.43 2,6,5,-19.09,23.12,-27.24,-19.69,24.89,-24.3,-20.6,26.38,-20.4,-21.7,27.66,-16.92 2,6,6,-19.09,23.12,-37.63,-19.67,24.37,-33.96,-20.43,26.14,-29.15,-21.34,26.88,-25.05 2,6,7,-18.93,22.5,-47.5,-19.51,24.37,-43.26,-20.22,25.63,-37.67,-20.97,26.88,-32.84 2,7,1,-20.73,33.58,12.06,-21.15,34.38,12.52,-21.62,35.31,13.33,-22.14,36.33,14.01 2,7,2,-19.82,33.13,3.12,-20.56,34.38,3.87,-21.34,35.63,5.38,-22.08,37.5,6.68 2,7,3,-19.69,33.74,-7.03,-20.6,35.63,-5.38,-21.68,36.87,-3.12,-22.6,38.77,-1.08 2,7,4,-19.11,33.13,-17.26,-19.86,35.63,-14.84,-20.97,36.87,-11.69,-22.08,38.88,-8.92 2,7,5,-19.46,33.13,-27.24,-19.88,35.63,-24.27,-20.97,36.87,-20.22,-21.92,38.76,-16.72 2,7,6,-19.46,33.13,-37.63,-20.04,34.87,-33.96,-20.94,36.87,-29.1,-21.74,38.12,-25.01 2,7,7,-19.11,33.13,-47.69,-19.72,35,-43.38,-20.38,36.87,-37.63,-20.97,38.12,-32.84 3,1,1,-8.61,-28.92,12.85,-8.73,-29.37,12.99,-8.91,-30.62,13.54,-8.97,-31.39,14.26 3,1,2,-8.78,-26.88,3.58,-9.1,-28.12,4.08,-9.28,-29.37,5.38,-9.6,-30.63,6.52 3,1,3,-8.54,-26.88,-6.61,-8.91,-27.5,-5.2,-9.12,-29.37,-2.82,-9.8,-30.62,-0.96 3,1,4,-8.73,-26.88,-16.7,-8.92,-27.63,-14.66,-9.44,-29.37,-11.65,-9.84,-30.62,-8.91 3,1,5,-8.35,-26.88,-26.9,-8.72,-26.88,-23.94,-8.91,-28.68,-19.92,-9.46,-30.62,-16.51 3,1,6,-8.57,-26.88,-37.09,-8.75,-26.88,-33.24,-9.03,-28.58,-28.42,-9.48,-30.17,-24.27 3,1,7,-8.72,-26.88,-46.94,-9.09,-26.88,-42.49,-8.91,-27.69,-36.79,-9.28,-28.75,-31.91 3,2,1,-8.91,-19.96,12.66,-9.04,-20.13,12.87,-9.24,-20.95,13.29,-9.32,-21.48,13.9 3,2,2,-9.12,-16.88,3.19,-9.43,-17.4,4.04,-9.72,-18.12,5.19,-10.02,-19.37,6.12 3,2,3,-8.69,-16.88,-6.53,-9.07,-16.88,-5.35,-9.46,-18.12,-3.15,-9.83,-19.37,-1.3 3,2,4,-8.93,-17.49,-16.72,-9.32,-17.46,-14.8,-9.81,-18.12,-11.65,-10.21,-19.37,-8.91 3,2,5,-8.69,-16.88,-26.87,-8.91,-16.88,-23.94,-9.24,-17.48,-20.01,-9.82,-18.64,-16.35 3,2,6,-8.73,-16.88,-37.11,-8.81,-16.88,-33.5,-8.94,-17.62,-28.4,-9.47,-18.64,-24.14 3,2,7,-8.72,-16.88,-46.94,-9.01,-16.37,-42.76,-8.91,-16.88,-36.92,-9.24,-17.52,-31.88 3,3,1,-8.58,-8.98,12.6,-8.84,-9.02,12.62,-8.91,-9.38,13.17,-9.24,-9.38,13.59 3,3,2,-9.09,-6.88,3.15,-9.46,-6.88,3.9,-9.81,-7.32,5,-10.21,-8.13,6.12 3,3,3,-8.98,-6.88,-6.69,-9.28,-6.88,-5.39,-9.83,-6.88,-3.53,-10.39,-7.5,-1.67 3,3,4,-9.07,-6.88,-16.85,-9.21,-6.88,-14.85,-9.8,-6.88,-11.72,-10.4,-7.63,-9.1 3,3,5,-8.91,-6.88,-26.91,-9.28,-5.63,-24.12,-9.63,-6.26,-20.06,-10.21,-6.88,-16.51 3,3,6,-9.07,-6.88,-37.26,-9.3,-6.14,-33.59,-9.47,-6.38,-28.58,-10.02,-6.88,-24.31 3,3,7,-8.68,-7.45,-47.1,-9.09,-6.88,-42.86,-9.09,-6.88,-36.92,-9.46,-6.88,-32.1 3,4,1,-10.39,1.88,12.43,-10.43,1.88,12.66,-10.75,1.88,13.08,-11.1,1.88,13.5 3,4,2,-9.31,3.13,3.11,-9.58,3.13,3.71,-10.02,3.13,4.75,-10.54,3.57,5.78 3,4,3,-10.17,4.38,-6.9,-10.58,4.38,-5.57,-10.95,4.38,-3.71,-11.66,4.88,-1.96 3,4,4,-9.09,3.13,-16.88,-9.3,3.69,-14.9,-9.84,4.38,-11.87,-10.55,4.38,-9.43 3,4,5,-8.69,3.13,-26.94,-9.07,4.38,-24.27,-9.28,4.38,-20.23,-9.86,4.38,-16.85 3,4,6,-9.09,3.13,-37.29,-9.41,4.38,-33.77,-9.46,4.38,-28.76,-10.02,4.38,-24.49 3,4,7,-8.87,3.13,-47.17,-9.09,4.38,-43.05,-9.07,4.38,-37.26,-9.44,4.83,-32.16 3,5,1,-10.03,12.65,12.27,-10.21,13.13,12.43,-10.44,13.13,12.95,-10.64,13.47,13.41 3,5,2,-9.46,13.13,3.15,-9.84,13.62,3.72,-10.21,14.37,4.82,-10.58,14.37,5.75 3,5,3,-9.09,13.13,-6.87,-9.46,14.37,-5.57,-10.02,15.62,-3.53,-10.39,15.62,-1.86 3,5,4,-9.44,13.13,-17.22,-9.81,14.37,-14.99,-10.33,14.9,-12.06,-10.95,15.62,-9.46 3,5,5,-9.46,13.88,-27.08,-9.81,15.62,-24.27,-10.04,16.26,-20.39,-10.95,16.88,-16.88 3,5,6,-9.09,13.13,-37.29,-9.44,14.37,-33.92,-9.47,15.62,-28.95,-10.21,15.62,-24.68 3,5,7,-8.72,13.13,-47.31,-8.98,14.37,-43.05,-8.91,15.62,-37.29,-9.31,15.62,-32.51 3,6,1,-10.44,22.78,12.12,-10.76,23.12,12.43,-11.01,23.75,12.98,-11.25,24.37,13.54 3,6,2,-9.44,23.12,2.82,-9.65,24.37,3.9,-10.17,25.63,4.98,-10.39,26.18,6.05 3,6,3,-9.12,23.12,-6.9,-9.47,24.37,-5.57,-10.02,25.63,-3.53,-10.58,26.88,-1.67 3,6,4,-9.46,23.12,-17.26,-9.65,24.37,-15.03,-10.14,26.32,-12.01,-10.76,27.5,-9.28 3,6,5,-9.12,23.12,-27.24,-9.64,24.87,-24.31,-10.01,26.38,-20.22,-10.6,28.12,-16.85 3,6,6,-9.07,23.12,-37.63,-9.28,25,-33.77,-9.49,26.88,-29.1,-10.04,27.51,-24.88 3,6,7,-9.09,23.12,-47.31,-9.48,25.16,-43.18,-9.47,26.37,-37.45,-9.84,26.88,-32.66 3,7,1,-11.04,33.8,12.08,-11.32,34.38,12.62,-11.54,35.63,13.13,-11.77,36.57,13.72 3,7,2,-9.47,33.13,2.97,-9.78,34.38,4.08,-10.21,36.87,5.38,-10.43,38.12,6.53 3,7,3,-9.28,34.38,-6.87,-9.65,35.63,-5.38,-10.02,37.63,-3.15,-10.58,39.38,-0.93 3,7,4,-9.46,33.13,-17.26,-10.02,35,-14.84,-10.54,36.87,-11.72,-11.09,38.85,-9.06 3,7,5,-9.09,33.13,-27.28,-9.47,35.63,-24.12,-9.96,37.42,-20.13,-10.55,39.38,-16.85 3,7,6,-8.72,33.13,-37.67,-8.91,35,-33.77,-9.21,36.87,-28.95,-9.65,38.68,-24.75 3,7,7,-9.42,33.13,-47.53,-9.82,35.2,-43.23,-9.79,36.87,-37.45,-10.21,38.12,-32.66 4,1,1,2.3,-28.71,12.63,2.37,-29.37,12.95,2.37,-30.11,13.5,2.48,-31.18,14.28 4,1,2,0.78,-26.88,3.48,0.93,-28.12,4.27,0.81,-29.37,5.56,0.93,-30.62,6.87 4,1,3,2.04,-26.88,-6.49,2.22,-27.63,-5.01,2.41,-29.37,-2.78,2.44,-30.62,-0.96 4,1,4,1.31,-27.37,-16.65,1.48,-28.12,-14.66,1.67,-29.37,-11.32,1.8,-31.34,-8.76 4,1,5,1.64,-26.88,-26.57,1.67,-27.37,-23.75,2.01,-28.92,-19.79,2.04,-30.62,-16.14 4,1,6,1.48,-26.88,-36.93,1.67,-26.88,-33.21,2.04,-28.12,-28.2,2,-30.18,-23.97 4,1,7,1.48,-26.88,-46.94,1.67,-26.88,-42.49,2.23,-27.5,-36.56,2.23,-28.12,-31.61 4,2,1,2.04,-20,12.62,2.04,-20.63,12.8,2.08,-20.63,13.32,2.23,-21.63,13.91 4,2,2,0.96,-16.88,3.49,1.09,-17.51,4.07,1.27,-18.12,5.35,1.27,-19.37,6.16 4,2,3,2.41,-16.88,-6.49,2.6,-16.88,-5.2,2.78,-18.12,-3.15,2.97,-19.37,-1.3 4,2,4,0.95,-16.88,-16.85,0.95,-16.88,-14.62,1.29,-18.12,-11.5,1.29,-18.88,-8.9 4,2,5,1.64,-16.88,-26.87,1.54,-16.35,-23.95,2.01,-16.88,-19.82,2.01,-18.12,-16.17 4,2,6,1.33,-16.88,-36.95,1.55,-16.88,-33.4,1.85,-17.57,-28.32,1.86,-18.68,-23.87 4,2,7,0.93,-16.88,-46.94,1.11,-16.18,-42.56,1.67,-16.88,-36.55,1.64,-16.88,-31.69 4,3,1,1.3,-9.38,12.43,1.45,-9.38,12.76,1.45,-9.38,13.13,1.66,-10.02,13.67 4,3,2,1.04,-6.88,3.33,1.3,-6.88,3.9,1.27,-6.88,5.04,1.29,-8.13,6.05 4,3,3,2.01,-6.88,-6.83,2.04,-6.88,-5.38,2.23,-6.88,-3.53,2.41,-8.13,-1.67 4,3,4,0.58,-6.88,-16.85,0.59,-6.88,-14.69,0.9,-6.88,-11.72,0.93,-8.13,-9.09 4,3,5,1.3,-6.88,-26.9,1.48,-5.63,-23.94,1.68,-6.14,-20.02,1.67,-6.88,-16.51 4,3,6,1.64,-6.88,-36.96,1.66,-6.13,-33.43,1.97,-6.42,-28.39,2.04,-6.88,-23.94 4,3,7,1.3,-6.88,-46.94,1.29,-5.63,-42.68,1.67,-6.12,-36.75,1.71,-6.3,-31.88 4,4,1,1.39,1.2,12.46,1.45,1.31,12.49,1.48,1.25,12.95,1.58,1.32,13.52 4,4,2,1.15,3.13,3.19,1.26,3.57,3.87,1.12,3.68,4.94,1.35,3.68,5.94 4,4,3,1.33,3.13,-6.83,1.53,3.79,-5.55,1.64,4.38,-3.56,1.7,4.38,-2.01 4,4,4,0.56,3.13,-16.88,0.66,3.8,-14.89,0.74,4.38,-11.95,0.74,4.38,-9.46 4,4,5,1.3,3.13,-26.9,1.27,4.38,-24.27,1.48,4.38,-20.23,1.42,4.92,-16.61 4,4,6,1.27,3.13,-37.26,1.3,4.38,-33.58,1.67,4.38,-28.76,1.67,4.38,-24.31 4,4,7,1.26,3.13,-47.16,1.3,4.38,-42.86,1.67,4.38,-36.92,1.67,4.38,-32.1 4,5,1,1.17,11.88,12.28,1.22,12.28,12.48,1.21,12.45,13.15,1.32,12.59,13.57 4,5,2,0.93,13.13,3.15,0.92,13.66,3.76,0.93,14.37,5.01,0.95,14.37,5.79 4,5,3,1.48,13.13,-6.87,1.48,14.37,-5.57,1.64,15.62,-3.56,1.67,15.62,-1.67 4,5,4,1.27,13.13,-16.92,0.95,14.37,-14.99,1.27,15.62,-12.03,1.3,15.62,-9.46 4,5,5,0.96,13.13,-26.94,1.21,14.38,-24.22,1.3,15.62,-20.22,1.29,16.12,-16.71 4,5,6,1.11,13.13,-37.3,1.13,14.94,-33.73,1.48,15.62,-28.76,1.51,16.88,-24.52 4,5,7,1.06,13.13,-47.16,1.27,14.8,-42.89,1.67,15.62,-37.29,1.67,16.25,-32.29 4,6,1,0.74,23.12,12.25,0.75,23.59,12.47,0.74,24.37,12.8,0.84,24.88,13.45 4,6,2,0.73,23.12,3.04,0.64,24.38,3.81,0.73,25.63,4.89,0.78,26.27,5.97 4,6,3,1.3,23.12,-6.87,1.33,24.37,-5.41,1.48,26.12,-3.53,1.66,27.3,-1.67 4,6,4,0.9,23.12,-16.92,0.93,24.37,-15.03,0.93,26.14,-11.9,0.92,27.37,-9.28 4,6,5,0.92,23.12,-27.09,0.95,25.63,-24.27,1.3,26.88,-20.22,1.27,28.12,-16.85 4,6,6,0.96,23.12,-37.33,1.09,25.01,-33.79,1.3,26.88,-28.76,1.3,28.12,-24.68 4,6,7,0.93,23.12,-47.31,1.11,25,-43.05,1.48,26.88,-37.3,1.48,27.37,-32.48 4,7,1,-0.02,33.86,12.07,-0.15,34.83,12.47,-0.15,36.08,13.11,-0.07,36.88,13.86 4,7,2,0.55,33.62,2.98,0.53,34.87,3.93,0.56,36.87,5.38,0.56,38.12,6.49 4,7,3,0.55,33.13,-7.05,0.56,35.63,-5.38,0.5,37.34,-3.11,0.52,39.38,-0.96 4,7,4,0.93,33.13,-17.26,0.92,34.87,-14.83,0.93,36.87,-11.69,1.11,38.75,-8.91 4,7,5,0.9,33.13,-27.24,0.92,35.63,-24.12,0.99,37.57,-20.05,0.93,39.38,-16.51 4,7,6,0.92,33.13,-37.48,1.11,35,-33.77,1.3,36.87,-28.76,1.26,38.56,-24.68 4,7,7,0.93,33.13,-47.31,0.95,35.63,-43.2,1.3,36.87,-37.29,1.3,38.12,-32.47 5,1,1,12.29,-28.62,12.83,12.48,-29.38,13.02,12.81,-30.18,13.72,13.17,-31.18,14.35 5,1,2,11.69,-26.88,3.53,11.86,-27.63,4.26,12.4,-29.37,5.72,12.8,-30.62,6.87 5,1,3,11.32,-26.88,-6.49,11.88,-28.12,-5.01,12.43,-29.37,-2.78,13.15,-30.62,-0.89 5,1,4,11.32,-26.88,-16.51,11.72,-26.88,-14.32,12.61,-28.88,-11.32,13.21,-30.62,-8.57 5,1,5,11.5,-26.88,-26.54,12.03,-26.88,-23.6,12.84,-28.12,-19.51,13.55,-29.89,-15.98 5,1,6,11.69,-26.88,-36.92,12.25,-26.88,-33.22,13.03,-28.13,-28.05,13.54,-29.37,-23.94 5,1,7,11.69,-26.88,-46.94,12.27,-26.24,-42.32,13.17,-26.88,-36.55,13.54,-28.12,-31.36 5,2,1,12.8,-19.37,12.8,12.99,-19.37,12.99,13.54,-20.63,13.54,13.73,-21.02,13.98 5,2,2,12.03,-16.88,3.49,12.28,-17.48,4.12,12.8,-18.12,5.38,13.51,-19.37,6.46 5,2,3,12.43,-16.88,-6.49,12.79,-17.3,-5.01,13.54,-18.12,-3.15,14.25,-19.37,-1.15 5,2,4,12.03,-16.88,-16.55,12.46,-16.88,-14.62,13.17,-18.12,-11.32,13.94,-19.37,-8.69 5,2,5,11.66,-16.88,-26.57,12.06,-16.88,-23.75,12.99,-17.5,-19.67,13.55,-18.62,-15.97 5,2,6,11.69,-16.88,-36.92,12.25,-16.88,-33.22,13.17,-16.88,-28.02,13.73,-18.12,-23.75 5,2,7,11.66,-16.88,-46.91,12.06,-15.62,-42.49,12.84,-16.42,-36.51,13.17,-16.88,-31.36 5,3,1,12.76,-8.61,12.78,12.94,-8.75,12.95,13.19,-8.95,13.55,13.66,-9.38,13.97 5,3,2,10.99,-6.88,3.37,11.32,-6.88,3.9,11.88,-6.88,5.12,12.42,-7.35,6.13 5,3,3,11.69,-6.88,-6.49,12.06,-6.88,-5.2,12.8,-6.88,-3.15,13.54,-7.5,-1.48 5,3,4,11.29,-6.88,-16.85,11.69,-6.88,-14.66,12.43,-6.88,-11.5,13.18,-7.61,-8.88 5,3,5,11.29,-6.88,-26.87,11.82,-6.3,-23.82,12.78,-6.88,-19.82,13.17,-6.88,-16.14 5,3,6,10.98,-6.88,-36.95,11.68,-5.63,-33.4,12.43,-6.12,-28.2,12.83,-6.88,-23.9 5,3,7,11.5,-6.88,-46.94,12.06,-5.63,-42.49,12.8,-5.63,-36.55,13.17,-5.63,-31.73 5,4,1,11.91,1.88,12.39,12.09,2.41,12.75,12.4,2.41,13.23,12.87,2.43,13.55 5,4,2,10.95,3.13,3.15,11.32,3.13,3.9,11.72,3.59,5.01,12.43,3.62,5.95 5,4,3,11.69,3.13,-6.87,12.25,3.13,-5.39,12.92,3.85,-3.46,13.54,3.88,-1.53 5,4,4,11.32,3.13,-16.88,11.69,3.88,-14.84,12.43,4.38,-11.69,13.17,4.38,-9.09 5,4,5,11.32,3.13,-26.9,11.72,4.38,-23.97,12.62,4.38,-19.86,13.33,4.89,-16.51 5,4,6,11.34,3.13,-37.26,12.03,4.38,-33.55,12.8,4.38,-28.39,13.36,4.38,-24.31 5,4,7,11.08,3.13,-47.16,11.69,4.38,-42.86,12.45,4.91,-36.86,12.8,5,-31.91 5,5,1,11.91,11.88,12.39,12.21,11.88,12.76,12.45,12.45,13.09,12.8,12.65,13.52 5,5,2,10.8,13.13,3.19,11.13,14.37,3.89,11.69,14.37,5.01,12.1,15.05,5.91 5,5,3,11.69,13.13,-6.87,12.06,14.37,-5.38,12.64,15.63,-3.37,13.36,15.62,-1.68 5,5,4,11.17,13.85,-16.92,11.69,15.13,-14.84,12.46,15.62,-11.72,13.17,16.88,-9.09 5,5,5,10.95,13.13,-26.9,11.34,14.89,-24.08,12.09,15.62,-20.19,12.8,16.88,-16.51 5,5,6,10.6,13.13,-37.26,11.13,14.87,-33.59,12.03,15.62,-28.73,12.43,16.88,-24.31 5,5,7,11.5,13.13,-47.13,12.03,14.82,-42.87,12.84,15.62,-36.95,13.17,16.25,-32.29 5,6,1,11.32,23.12,12.06,11.61,23.65,12.5,11.87,24.37,12.99,12.24,24.81,13.41 5,6,2,11.23,23.13,2.87,11.35,24.37,3.87,12.03,25.63,4.98,12.4,26.88,5.98 5,6,3,10.98,23.12,-6.9,11.35,24.37,-5.41,11.95,25.63,-3.34,12.78,26.88,-1.64 5,6,4,10.57,23.12,-17.07,11.13,25,-14.84,11.69,26.88,-11.69,12.43,28.12,-9.09 5,6,5,10.98,23.12,-26.94,11.5,25,-24.12,12.09,26.88,-20.19,12.8,28.12,-16.51 5,6,6,10.38,23.12,-37.41,10.82,24.88,-33.62,11.51,26.32,-28.69,12,27.43,-24.5 5,6,7,10.58,23.12,-47.31,11.13,25,-43.05,12.06,26.88,-37.29,12.34,27.34,-32.43 5,7,1,10.61,33.56,12.06,10.8,34.38,12.39,10.95,35.63,13.17,11.41,36.5,13.71 5,7,2,10.83,33.13,2.97,10.97,34.38,3.93,11.49,36.38,5.38,11.88,38.12,6.61 5,7,3,10.95,33.13,-6.87,11.26,35.07,-5.19,11.87,36.87,-2.97,12.39,38.92,-0.96 5,7,4,10.6,33.13,-17.22,10.95,35.63,-14.66,11.5,37.5,-11.5,12.06,39.38,-8.72 5,7,5,10.94,33.13,-27.09,11.29,35.63,-23.97,11.95,38.12,-19.96,12.43,39.38,-16.51 5,7,6,10.61,33.13,-37.33,11.13,35,-33.77,11.88,36.87,-28.76,12.27,38.74,-24.51 5,7,7,11.32,33.13,-47.31,11.57,35.63,-43.05,12.49,37.57,-37.12,12.78,38.7,-32.39 6,1,1,23.14,-28.59,12.76,23.56,-29.37,13.17,24.11,-30.18,13.76,24.68,-31.25,14.47 6,1,2,21.52,-26.88,3.64,22.14,-27.43,4.45,23.01,-28.75,5.94,24.12,-30.07,7.16 6,1,3,22.27,-26.88,-6.31,23.01,-27.5,-4.82,24.34,-29.37,-2.44,25.45,-30.62,-0.52 6,1,4,21.71,-26.88,-16.51,22.45,-27.33,-14.29,23.76,-28.88,-10.95,25.05,-30.62,-8.35 6,1,5,21.74,-26.88,-26.56,22.82,-26.88,-23.56,24.31,-28.12,-19.48,25.42,-29.87,-15.95 6,1,6,21.59,-26.88,-36.74,22.49,-26.88,-33.06,23.94,-28.12,-28.02,25.01,-29.37,-23.72 6,1,7,21.52,-26.88,-46.76,22.51,-26.18,-42.31,23.75,-26.88,-36.37,24.31,-28.12,-31.36 6,2,1,23.41,-19.96,12.76,23.75,-20.07,13.1,24.46,-20.63,13.59,25.03,-21.41,14.24 6,2,2,21.12,-17.45,3.48,21.71,-18.12,4.27,22.81,-18.64,5.59,23.65,-19.37,6.78 6,2,3,22.43,-17.31,-6.46,23.18,-17.39,-4.85,24.65,-18.12,-2.75,25.76,-19.37,-0.89 6,2,4,21.37,-16.88,-16.54,22.42,-16.88,-14.32,23.75,-18.12,-11.13,25.05,-19.37,-8.35 6,2,5,21.68,-16.88,-26.57,22.45,-16.88,-23.56,23.94,-17.69,-19.46,25.23,-18.68,-15.84 6,2,6,21.71,-16.88,-36.92,22.46,-16.45,-33.21,23.93,-16.88,-27.83,25.05,-18.12,-23.56 6,2,7,21.68,-16.88,-46.91,22.61,-16.24,-42.32,23.68,-16.88,-36.37,24.31,-16.88,-31.36 6,3,1,23.16,-8.58,12.74,23.61,-8.7,13.01,24.28,-8.93,13.56,24.9,-9.38,13.96 6,3,2,21.56,-6.88,3.48,22.11,-6.88,4.24,23.19,-6.88,5.38,24.34,-7.33,6.53 6,3,3,21.87,-6.23,-6.5,22.64,-5.63,-5.01,23.88,-6.32,-2.95,25.3,-6.88,-1.12 6,3,4,21.08,-6.88,-16.71,21.92,-6.26,-14.49,23.54,-6.88,-11.28,24.7,-6.88,-8.69 6,3,5,21.37,-6.88,-26.56,22.23,-5.63,-23.77,23.75,-6.25,-19.67,25.16,-6.88,-15.96 6,3,6,21.37,-6.88,-36.95,22.45,-5.63,-33.21,23.75,-5.63,-28.02,24.86,-6.25,-23.75 6,3,7,21.34,-6.88,-46.94,22.08,-5.63,-42.49,23.34,-5.63,-36.51,23.98,-5.63,-31.51 6,4,1,22.45,1.88,12.43,22.84,2.33,12.81,23.62,2.43,13.37,24.27,2.39,13.87 6,4,2,21.31,3.13,3.19,21.95,3.81,4.02,22.88,3.82,5.19,23.96,3.92,6.18 6,4,3,21.79,3.13,-6.58,22.63,3.68,-5.32,24.12,3.82,-3.09,25.36,3.92,-1.32 6,4,4,21.34,3.13,-16.88,22.08,4.38,-14.66,23.6,4.38,-11.35,25.05,4.38,-8.72 6,4,5,21.52,3.13,-26.91,22.45,4.38,-23.94,23.85,4.96,-19.74,25.21,5.01,-16.31 6,4,6,21.15,3.13,-37.11,22.05,4.38,-33.55,23.38,4.93,-28.32,24.46,5.05,-23.98 6,4,7,21.34,3.13,-46.94,22.07,4.38,-42.68,23.25,5.07,-36.75,23.94,5.63,-31.73 6,5,1,22.09,12.48,12.27,22.45,12.68,12.77,23.19,13.13,13.17,23.79,13.13,13.69 6,5,2,21.31,13.13,3.19,21.71,14.37,3.9,22.82,14.87,5.2,23.94,15.62,6.12 6,5,3,22.27,13.13,-6.87,23.19,14.37,-5.38,24.48,15.13,-3.15,25.79,15.62,-1.3 6,5,4,20.97,13.13,-16.88,21.71,14.37,-14.66,23.17,15.62,-11.65,24.33,15.62,-9.06 6,5,5,21.35,13.59,-26.91,22.12,15.18,-23.96,23.74,16.12,-19.86,24.86,16.88,-16.4 6,5,6,21.36,13.13,-37.26,22.39,14.83,-33.56,23.75,15.62,-28.39,24.69,16.36,-24.15 6,5,7,21.52,13.13,-47.13,22.41,14.83,-42.82,23.56,15.62,-36.92,24.33,16.1,-32.13 6,6,1,22.21,23.12,12.28,22.64,23.82,12.5,23.34,24.37,13.13,23.93,25,13.73 6,6,2,20.94,23.93,3.11,21.55,24.89,3.9,22.45,25.63,5.2,23.56,26.88,6.49 6,6,3,21.71,23.12,-6.87,22.45,24.37,-5.38,23.72,26.19,-3.11,24.89,27.49,-1.13 6,6,4,20.63,23.12,-16.92,21.37,24.81,-14.68,22.81,26.36,-11.53,23.93,27.63,-8.9 6,6,5,21.15,23.75,-27.09,21.89,25.63,-23.94,23.38,26.88,-19.86,24.49,28.12,-16.52 6,6,6,21.34,23.12,-37.29,22.29,25.11,-33.59,23.68,26.88,-28.58,24.68,28.12,-24.31 6,6,7,21.12,23.12,-47.27,22.08,25.63,-42.86,23.37,26.88,-37.04,23.99,27.43,-32.28 6,7,1,21.71,33.95,12.05,22.1,34.92,12.56,22.64,36.03,13.33,23.19,36.87,13.92 6,7,2,20.78,33.53,2.99,21.39,34.93,4.09,22.11,36.87,5.72,23.19,38.12,6.87 6,7,3,21.71,33.13,-6.87,22.45,35.63,-5.01,23.59,36.87,-2.75,24.68,39.38,-0.56 6,7,4,20.56,33.13,-17.04,21.17,35.01,-14.49,22.45,36.87,-11.32,23.56,39.38,-8.53 6,7,5,21.33,33.62,-27.1,22.08,35.63,-23.94,23.29,38.12,-19.77,24.34,39.38,-16.17 6,7,6,20.97,33.13,-37.29,21.71,35.63,-33.58,23.04,37.52,-28.54,23.94,39.38,-24.31 6,7,7,20.97,33.13,-47.31,21.74,35.63,-42.89,23.01,37.5,-37.11,23.76,38.69,-32.24 7,1,1,32.47,-28.12,12.8,33.06,-28.51,13.3,33.96,-29.37,14.1,35.01,-30.63,14.88 7,1,2,31.77,-26.88,3.75,32.81,-26.88,4.67,34.21,-28.12,6.31,35.63,-29.37,7.78 7,1,3,32.22,-26.88,-6.32,33.42,-27.55,-4.6,35.24,-28.88,-2.04,36.92,-30.62,0.19 7,1,4,31.73,-26.88,-16.51,32.84,-26.88,-14.1,34.88,-28.75,-10.76,36.55,-30.62,-7.98 7,1,5,32.29,-26.88,-26.54,33.58,-26.88,-23.56,35.48,-28.12,-19.26,37.29,-29.37,-15.77 7,1,6,31.7,-26.88,-36.89,33.17,-26.88,-32.88,34.95,-28.12,-27.83,36.44,-29.37,-23.75 7,1,7,31.61,-26.88,-46.76,33.03,-26.25,-42.3,34.7,-26.88,-36.18,35.81,-28.12,-31.36 7,2,1,32.69,-19,12.77,33.43,-19.37,13.21,34.48,-19.76,13.89,35.54,-20.33,14.5 7,2,2,31.36,-16.88,3.71,32.47,-16.88,4.64,33.99,-17.68,6.11,35.47,-18.12,7.27 7,2,3,32.59,-16.88,-6.32,33.76,-16.88,-4.75,35.62,-17.5,-2.23,37.48,-18.62,-0.19 7,2,4,31.36,-16.88,-16.51,32.68,-16.88,-14.18,34.67,-18.12,-10.91,36.37,-18.82,-8.05 7,2,5,32.1,-16.88,-26.53,33.4,-16.32,-23.5,35.47,-16.88,-19.14,37.29,-18.12,-15.77 7,2,6,31.73,-16.88,-36.92,33.03,-16.25,-33.03,34.88,-16.88,-27.83,36.54,-17.69,-23.57 7,2,7,31.54,-16.88,-46.83,32.76,-16.13,-42.39,34.33,-16.45,-36.19,35.41,-16.88,-31.39 7,3,1,32.46,-7.7,12.8,33.17,-8.13,13.02,34.14,-8.13,13.92,35.32,-8.13,14.47 7,3,2,31.73,-6.88,3.53,32.81,-6.88,4.61,34.37,-6.88,5.97,36.18,-6.88,7.24 7,3,3,32.28,-6.32,-6.43,33.58,-6.12,-4.84,35.59,-6.37,-2.43,37.41,-6.88,-0.38 7,3,4,31.73,-6.88,-16.51,33.03,-6.18,-14.22,35.07,-6.88,-10.95,37.04,-6.88,-8.17 7,3,5,31.67,-6.32,-26.72,32.99,-5.63,-23.52,35.11,-5.63,-19.33,36.92,-6.25,-15.96 7,3,6,31.54,-6.88,-36.92,32.81,-5.63,-33.18,34.69,-5.63,-27.83,36.47,-6.37,-23.66 7,3,7,31.36,-6.88,-46.94,32.69,-5.63,-42.45,34.33,-5.63,-36.37,35.41,-5.63,-31.39 7,4,1,32.88,3.13,12.65,33.62,3.13,13.02,34.7,3.13,13.73,35.96,3.13,14.25 7,4,2,31.32,3.57,3.49,32.44,3.92,4.31,33.96,4.38,5.75,35.47,4.38,6.9 7,4,3,32.1,3.13,-6.49,33.21,4.38,-5.01,35.4,4.38,-2.63,37.29,4.38,-0.56 7,4,4,31.33,3.13,-16.85,32.5,4.38,-14.32,34.58,4.38,-11.13,36.52,4.38,-8.38 7,4,5,31.34,3.94,-26.87,32.66,5,-23.75,34.7,5.63,-19.48,36.55,5.63,-16.14 7,4,6,31.69,3.13,-37.07,32.84,4.38,-33.21,34.84,4.93,-28.11,36.5,5.09,-23.95 7,4,7,30.99,3.13,-46.94,32.44,4.38,-42.52,33.98,5.19,-36.59,35.07,5.19,-31.76 7,5,1,32.35,12.74,12.59,33.03,13.13,12.92,34.21,13.13,13.6,35.25,13.66,14.28 7,5,2,31.17,13.13,3.34,32.29,13.82,4.34,33.92,14.37,5.72,35.28,14.89,6.87 7,5,3,32.13,14.37,-6.53,33.21,15.62,-5.01,35.25,15.62,-2.79,37.11,16.88,-0.74 7,5,4,30.99,13.13,-16.88,32.36,14.37,-14.47,34.33,15.62,-11.32,36.02,16.24,-8.55 7,5,5,31.7,13.65,-26.83,32.84,15.13,-23.75,34.88,16.25,-19.67,36.74,16.88,-16.14 7,5,6,31.36,13.13,-37.11,32.47,14.37,-33.21,34.44,15.62,-28.21,36.03,16.27,-24.09 7,5,7,31.24,13.13,-47.13,32.47,15.13,-42.68,34.23,16.01,-36.76,35.12,16.42,-32.07 7,6,1,31.88,23.12,12.47,32.74,23.86,12.79,33.54,24.37,13.39,34.61,24.81,14.06 7,6,2,30.96,23.12,3.19,31.98,24.37,4.08,33.21,25.63,5.75,34.72,26.88,6.9 7,6,3,31.91,23.62,-6.87,33.15,24.91,-5,34.88,26.25,-2.6,36.63,27.38,-0.59 7,6,4,31.36,23.12,-16.88,32.48,25.11,-14.5,34.44,26.88,-11.14,36.18,28.12,-8.35 7,6,5,31.32,23.57,-26.94,32.44,25.63,-23.9,34.33,26.88,-19.48,35.96,28.12,-16.18 7,6,6,31.36,23.12,-37.29,32.45,25.17,-33.53,34.33,26.88,-28.39,35.77,27.68,-24.28 7,6,7,31.34,22.66,-47.26,32.47,24.37,-42.86,34.27,26.08,-36.9,35.44,26.88,-32.1 7,7,1,32.1,34.38,12.25,32.84,35.2,12.79,33.65,36.35,13.62,34.6,37.29,14.44 7,7,2,30.8,33.13,3.15,31.73,34.38,4.27,33.03,36.32,6.05,34.33,37.63,7.43 7,7,3,31.73,34.38,-6.87,32.84,35.63,-5.01,34.36,37.68,-2.1,36,39.38,0 7,7,4,30.58,33.13,-16.92,31.73,35.63,-14.29,33.36,37.44,-10.9,34.88,39.38,-8.16 7,7,5,31.24,33.61,-27.17,32.29,35.63,-23.75,33.96,38.12,-19.48,35.47,39.38,-16.11 7,7,6,31.21,33.13,-37.34,32.29,35.63,-33.4,34.14,37.43,-28.32,35.41,38.83,-24.18 7,7,7,31.14,33.13,-47.36,32.36,35.63,-42.68,33.99,37.31,-36.95,35.1,38.12,-32.13 opensurgsim-0.7.0/SurgSim/Physics/RenderTests/Fem3DMeshRenderTest.cpp000066400000000000000000000151261277777236100256150ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include "SurgSim/Blocks/TransferPhysicsToGraphicsMeshBehavior.h" #include "SurgSim/Blocks/TransferPhysicsToPointCloudBehavior.h" #include "SurgSim/Framework/ApplicationData.h" #include "SurgSim/Framework/BasicSceneElement.h" #include "SurgSim/Framework/Behavior.h" #include "SurgSim/Graphics/Mesh.h" #include "SurgSim/Graphics/OsgAxesRepresentation.h" #include "SurgSim/Graphics/OsgMeshRepresentation.h" #include "SurgSim/Graphics/OsgPointCloudRepresentation.h" #include "SurgSim/Graphics/OsgSphereRepresentation.h" #include "SurgSim/Math/MeshShape.h" #include "SurgSim/Math/OdeSolver.h" #include "SurgSim/Math/SphereShape.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/DeformableCollisionRepresentation.h" #include "SurgSim/Physics/Fem3DPlyReaderDelegate.h" #include "SurgSim/Physics/Fem3DRepresentation.h" #include "SurgSim/Physics/RenderTests/RenderTest.h" #include "SurgSim/Physics/RigidCollisionRepresentation.h" #include "SurgSim/Physics/RigidRepresentation.h" using SurgSim::Math::Vector3d; namespace SurgSim { namespace Physics { static std::shared_ptr createFemSceneElement( const std::string& name, const std::string& filename, SurgSim::Math::IntegrationScheme integrationScheme) { // Create a SceneElement that bundles the pieces associated with the finite element model auto sceneElement = std::make_shared(name); // Add the Fem3d component // Note that we only specify the filename that contains the full geometrical and physical description. auto fem = std::make_shared("fem3d"); fem->loadFem(filename); fem->setIntegrationScheme(integrationScheme); sceneElement->addComponent(fem); auto collision = std::make_shared("Collision"); auto shape = std::make_shared(); shape->load(filename); collision->setShape(shape); fem->setCollisionRepresentation(collision); sceneElement->addComponent(collision); // Add the graphics mesh used to display the Fem3d auto graphics = std::make_shared("fem graphics"); graphics->loadMesh(filename); graphics->setDrawAsWireFrame(true); sceneElement->addComponent(graphics); // Create a behavior which transfers the position of the vertices in the FEM to locations in the triangle mesh auto femToMesh = std::make_shared("physics to triangle mesh"); femToMesh->setSource(fem); femToMesh->setTarget(graphics); sceneElement->addComponent(femToMesh); // The point-cloud for visualizing the nodes of the finite element model auto pointCloud = std::make_shared("point cloud"); pointCloud->setColor(SurgSim::Math::Vector4d(0.2, 0.2, 1.0, 1.0)); pointCloud->setPointSize(3.0f); sceneElement->addComponent(pointCloud); // The behavior which transfers the position of the vertices in the FEM to locations in the point cloud auto femToCloud = std::make_shared("fem to point cloud"); femToCloud->setSource(fem); femToCloud->setTarget(pointCloud); sceneElement->addComponent(femToCloud); return sceneElement; } std::shared_ptr createMeshSphere() { SurgSim::Math::RigidTransform3d pose = SurgSim::Math::makeRigidTranslation(SurgSim::Math::Vector3d(0.0, 0.025, 0.0)); auto element = std::make_shared("RigidMesh"); element->setPose(pose); auto shape = std::make_shared(); shape->load("Geometry/sphere0_025.ply"); auto rigid = std::make_shared("Physics"); rigid->setIsGravityEnabled(true); // http://www.engineeringtoolbox.com/wood-density-d_40.html rigid->setDensity(5800.0); // Cedar of Lebanon wood density 5800.0 Kg/m-3 rigid->setShape(shape); element->addComponent(rigid); auto collision = std::make_shared("Collision"); rigid->setCollisionRepresentation(collision); collision->setShape(shape); element->addComponent(collision); std::shared_ptr osgRepresentation = std::make_shared("Graphics"); osgRepresentation->setShape(shape); element->addComponent(osgRepresentation); return element; } std::shared_ptr createShapeSphere() { SurgSim::Math::RigidTransform3d pose = SurgSim::Math::makeRigidTranslation(SurgSim::Math::Vector3d(0.0, 0.05, 0.0)); auto element = std::make_shared("Sphere"); element->setPose(pose); auto physics = std::make_shared("Physics"); physics->setDensity(5800.0); auto shape = std::make_shared(0.025); physics->setShape(shape); element->addComponent(physics); auto collision = std::make_shared("Collision"); physics->setCollisionRepresentation(collision); element->addComponent(collision); auto graphics = std::make_shared("Graphics"); graphics->setRadius(shape->getRadius()); element->addComponent(graphics); return element; } TEST_F(RenderTests, SimulatedWoundRenderTest) { runtime->getScene()->addSceneElement(createFemSceneElement("Fem", "Geometry/wound_deformable.ply", SurgSim::Math::INTEGRATIONSCHEME_LINEAR_EULER_IMPLICIT)); runTest(Vector3d(0.0, 0.0, 0.2), Vector3d::Zero(), 5000.0); } TEST_F(RenderTests, Fem3dMeshCollision) { runtime->getScene()->addSceneElement(createMeshSphere()); runtime->getScene()->addSceneElement(createFemSceneElement("Fem", "Geometry/wound_deformable.ply", SurgSim::Math::INTEGRATIONSCHEME_LINEAR_EULER_IMPLICIT)); runTest(Vector3d(0.0, 0.0, 0.2), Vector3d::Zero(), 5000.0); } } // namespace Physics } // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/RenderTests/Fem3DvsTruthCubeRenderTest.cpp000066400000000000000000000701171277777236100272000ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/DataStructures/Vertices.h" #include "SurgSim/Framework/ApplicationData.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Framework/SceneElement.h" #include "SurgSim/Graphics/OsgAxesRepresentation.h" #include "SurgSim/Graphics/OsgCamera.h" #include "SurgSim/Graphics/OsgManager.h" #include "SurgSim/Graphics/OsgPointCloudRepresentation.h" #include "SurgSim/Graphics/OsgView.h" #include "SurgSim/Graphics/OsgViewElement.h" #include "SurgSim/Graphics/PointCloudRepresentation.h" #include "SurgSim/Math/OdeState.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Physics/Fem3DRepresentation.h" #include "SurgSim/Physics/Fem3DElementCube.h" #include "SurgSim/Physics/PhysicsManager.h" #include "SurgSim/Physics/RenderTests/RenderTest.h" #include "SurgSim/Framework/Logger.h" using SurgSim::DataStructures::Vertices; using SurgSim::Framework::SceneElement; using SurgSim::Graphics::PointCloud; using SurgSim::Graphics::PointCloudRepresentation; using SurgSim::Graphics::OsgAxesRepresentation; using SurgSim::Graphics::OsgPointCloudRepresentation; using SurgSim::Math::makeRigidTransform; using SurgSim::Math::Quaterniond; using SurgSim::Math::RigidTransform3d; using SurgSim::Math::Vector3d; using SurgSim::Math::Vector4d; using SurgSim::Physics::PhysicsManager; using SurgSim::Framework::Logger; namespace SurgSim { namespace Physics { struct TruthCubeData { // Beads positions in uncompressed material std::vector cubeData0; // Beads positions under 5% strain std::vector cubeData1; // Beads positions under 12.5% strain std::vector cubeData2; // Beads positions under 18.25% strain std::vector cubeData3; }; /// Parsing Truth Cube data from an external file /// \param truthCubeData a container of cube data for all strains /// \return True if the Truth Cube Data is successful loaded, otherwise false bool parseTruthCubeData(std::shared_ptr truthCubeData) { const double mm2m = 1000.0; // Conversion constant from millimeter to meter const int numCommentLine = 7; // Number of comment lines to skip before accessing the actual data // Position of uncompressed data, 5% strain, 12.5% strain, 18.25% strain std::array position; std::string line; char comma; int i, j, k; int numLine = 0; const SurgSim::Framework::ApplicationData data("config.txt"); std::string filename = data.findFile("uniaxial_positions.csv"); std::ifstream datafile(filename); if (! datafile.good()) { SURGSIM_LOG_WARNING(Logger::getDefaultLogger()) << "Could not get uniaxial_positions.csv data file"; return false; } while (std::getline(datafile, line)) { if (++numLine > numCommentLine) { std::stringstream strstream(line); strstream >> i >> comma >> j >> comma >> k >> comma >> position[0].x() >> comma >> position[0].y() >> comma >> position[0].z() >> comma >> position[1].x() >> comma >> position[1].y() >> comma >> position[1].z() >> comma >> position[2].x() >> comma >> position[2].y() >> comma >> position[2].z() >> comma >> position[3].x() >> comma >> position[3].y() >> comma >> position[3].z(); // Store strains separately, in meter unit and Y up (rotation 90 alond X) // Apparently, -Z seems to be up in the truth cube data set Quaterniond::AngleAxisType aa(M_PI / 2.0, Vector3d::UnitX()); RigidTransform3d pose(aa); truthCubeData->cubeData0.push_back(pose * (position[0] / mm2m)); truthCubeData->cubeData1.push_back(pose * (position[1] / mm2m)); truthCubeData->cubeData2.push_back(pose * (position[2] / mm2m)); truthCubeData->cubeData3.push_back(pose * (position[3] / mm2m)); } } return true; }; /// Search the node in the state that is the closest to a given 3d point /// This is necessary because the structure of the nodes in the state and in the truth cube is not necessarily matching /// The state is built with a structure aligned on +X +Y +Z, while the truth cube data are defined along +X +Y -Z and /// rotated (PI/2 along X) to match Y up, so 3d indices don't match. size_t searchForClosestNodeInState(std::shared_ptr state, Vector3d p) { size_t res = -1; double minDistance = std::numeric_limits::max(); SurgSim::Math::Vector& x = state->getPositions(); for (size_t nodeId = 0; nodeId < state->getNumNodes(); ++nodeId) { Vector3d diff(SurgSim::Math::getSubVector(x, nodeId, 3) - p); if (diff.norm() < minDistance) { minDistance = diff.norm(); res = nodeId; } } return res; } /// Truth cube representation (extension of a Fem3DRepresentation) /// Defines a subdivided initial cube with cube FemElements class TruthCubeRepresentation : public Fem3DRepresentation { public: /// Constructor /// \param name The name of the truth cube representation. /// \param corners The 8 corners of the truth cube TruthCubeRepresentation(const std::string& name, std::array corners) : Fem3DRepresentation(name) { m_numNodesPerAxis = 9; m_cubeNodes = corners; } /// Convert an node index from a 3d indexing to a 1d indexing /// \param i, j, k Indices along the X, Y and Z axis /// \return Unique index of the corresponding point (to access a linear array for example) size_t get1DIndexFrom3D(size_t i, size_t j, size_t k) { return m_numNodesPerAxis * m_numNodesPerAxis * i + m_numNodesPerAxis * j + k; } /// Convert a node index from a 1d indexing to a 3d indexing /// \param index of the node /// \param[in,out] i, j, k Corresponding indices along the X, Y and Z axis /// \param numNodesPerAxis the number of nodes per axis to be considered in the conversion void get3DIndexFrom1D(size_t index, size_t* i, size_t* j, size_t* k, size_t numNodesPerAxis) { size_t remainingIndex = index; (*i) = remainingIndex / (numNodesPerAxis * numNodesPerAxis); remainingIndex -= (*i) * (numNodesPerAxis * numNodesPerAxis); (*j) = remainingIndex / numNodesPerAxis; remainingIndex -= (*j) * numNodesPerAxis; (*k) = remainingIndex; } /// Gets the number of nodes per axis /// \return The number of nodes per axis. size_t getNumNodesPerAxis() { return m_numNodesPerAxis; } /// Gets the boundary conditions /// \return vector of dof (degrees of freedom) indices representing all boundary conditions std::vector getBoundaryConditions() { return m_boundaryConditions; } /// Gets the boundary conditions displacement values /// \return The vector of displacement for all boundary conditions std::vector getBoundaryConditionsDisplacement() { return m_boundaryConditionsDisplacement; } /// Fills up a given state with the truth cube nodes /// border nodes and internal nodes (i.e. the beads) /// \param[in,out] state The state to be filled up void fillUpDeformableState(std::shared_ptr state) { state->setNumDof(getNumDofPerNode(), m_numNodesPerAxis * m_numNodesPerAxis * m_numNodesPerAxis); SurgSim::Math::Vector& nodePositions = state->getPositions(); for (int i = 0; i < m_numNodesPerAxis; i++) { // For a given index i, we intersect the cube with a (Y Z) plane, which defines a square on a (Y Z) plane Vector3d extremitiesX0[4] = {m_cubeNodes[0], m_cubeNodes[2], m_cubeNodes[4], m_cubeNodes[6]}; Vector3d extremitiesX1[4] = {m_cubeNodes[1], m_cubeNodes[3], m_cubeNodes[5], m_cubeNodes[7]}; Vector3d extremitiesXi[4]; double coefI = static_cast(i) / (static_cast(m_numNodesPerAxis) - 1.0); for (int index = 0; index < 4; index++) { extremitiesXi[index] = extremitiesX0[index] * (1.0 - coefI) + extremitiesX1[index] * coefI; } for (int j = 0; j < m_numNodesPerAxis; j++) { // For a given index j, we intersect the square with a (X Z) plane, which defines a line along (Z) Vector3d extremitiesY0[2] = {extremitiesXi[0], extremitiesXi[2]}; Vector3d extremitiesY1[2] = {extremitiesXi[1], extremitiesXi[3]}; Vector3d extremitiesYi[2]; double coefJ = static_cast(j) / (static_cast(m_numNodesPerAxis) - 1.0); for (int index = 0; index < 2; index++) { extremitiesYi[index] = extremitiesY0[index] * (1.0 - coefJ) + extremitiesY1[index] * coefJ; } for (int k=0; k < m_numNodesPerAxis; k++) { // For a given index k, we intersect the line with a (X Y) plane, which defines a 3d point double coefK = static_cast(k) / (static_cast(m_numNodesPerAxis) - 1.0); Vector3d position3d = extremitiesYi[0] * (1.0 - coefK) + extremitiesYi[1] * coefK; SurgSim::Math::setSubVector(position3d, get1DIndexFrom3D(i, j, k), 3, &nodePositions); } } } } /// Adjust the internal nodes position of the state to match the beads initial position /// \param state The state to adjust /// \param beadsInitialPositions The vector of beads initial position /// \note The ordering between the state and the beads vector might be different /// \note The algorithm will not rely on a matching indexing void adjustInitialBeadsPosition(std::shared_ptr state, std::vector beadsInitialPositions) { SurgSim::Math::Vector& x = state->getPositions(); for (size_t index = 0; index < beadsInitialPositions.size(); ++index) { size_t nodeId = searchForClosestNodeInState(state, beadsInitialPositions[index]); SurgSim::Math::setSubVector(beadsInitialPositions[index], nodeId, 3, &x); } } /// Defines the boundary conditions for the truth cube /// \param displacementForTopLayer The displacement of the boundary conditions for the top layer /// \note The bottom layer is completely fixed (all nodes, all dof) /// \note The top layer is completely fixed and compressed along Y void defineBoundaryCondition(double displacementForTopLayer) { for (int i = 0; i < m_numNodesPerAxis; i++) { for (int k = 0; k < m_numNodesPerAxis; k++) { // Add boundary condition for bottom layer (j = 0) int nodeId = get1DIndexFrom3D(i, 0, k); m_boundaryConditions.push_back(nodeId * 3 + 0); m_boundaryConditions.push_back(nodeId * 3 + 1); m_boundaryConditions.push_back(nodeId * 3 + 2); m_boundaryConditionsDisplacement.push_back(0.0); m_boundaryConditionsDisplacement.push_back(0.0); m_boundaryConditionsDisplacement.push_back(0.0); // Add boundary condition for top layer (j = m_numNodesPerAxis - 1) nodeId = get1DIndexFrom3D(i, m_numNodesPerAxis - 1, k); m_boundaryConditions.push_back(nodeId * 3 + 0); m_boundaryConditions.push_back(nodeId * 3 + 1); m_boundaryConditions.push_back(nodeId * 3 + 2); m_boundaryConditionsDisplacement.push_back(0.0); m_boundaryConditionsDisplacement.push_back(displacementForTopLayer); m_boundaryConditionsDisplacement.push_back(0.0); } } } /// Adds the Fem3D elements of small cubes /// \param state The state for initialization. void addFemCubes(std::shared_ptr state) { for (size_t i = 0; i < static_cast(m_numNodesPerAxis - 1); i++) { for (size_t j = 0; j < static_cast(m_numNodesPerAxis - 1); j++) { for (size_t k = 0; k < static_cast(m_numNodesPerAxis - 1); k++) { std::array cubeNodeIds; cubeNodeIds[0] = get1DIndexFrom3D(i , j , k ); cubeNodeIds[1] = get1DIndexFrom3D(i+1, j , k ); cubeNodeIds[2] = get1DIndexFrom3D(i , j+1, k ); cubeNodeIds[3] = get1DIndexFrom3D(i+1, j+1, k ); cubeNodeIds[4] = get1DIndexFrom3D(i , j , k+1); cubeNodeIds[5] = get1DIndexFrom3D(i+1, j , k+1); cubeNodeIds[6] = get1DIndexFrom3D(i , j+1, k+1); cubeNodeIds[7] = get1DIndexFrom3D(i+1, j+1, k+1); std::array cube = {cubeNodeIds[0], cubeNodeIds[1], cubeNodeIds[3], cubeNodeIds[2], cubeNodeIds[4], cubeNodeIds[5], cubeNodeIds[7], cubeNodeIds[6]}; // Add Fem3DElementCube for each cube std::shared_ptr femElement = std::make_shared(cube); femElement->setMassDensity(980.0); // 0.98 g/cm^-3 (2-part silicone rubber a.k.a. RTV6166) femElement->setPoissonRatio(0.499); // From the paper (near 0.5) femElement->setYoungModulus(15.3e3); // 15.3 kPa (From the paper) femElement->initialize(*state); addFemElement(femElement); } } } } /// Update the current state based on some offset resulting from compressing the cube /// \param offset to apply. void applyDofCorrection(const SurgSim::Math::Vector& offset) { m_currentState->getPositions() += offset; } /// Get beads of the truth cube /// \return coordinate of beads /// \note The beads are all the internal nodes of the cube std::vector>> getBeadsLocation() { std::vector>> beadsLocation; auto positions = m_currentState->getPositions(); beadsLocation.resize(m_numNodesPerAxis - 2); for (int i = 1; i < m_numNodesPerAxis - 1; i++) { beadsLocation[i-1].resize(m_numNodesPerAxis - 2); for (int j = 1; j < m_numNodesPerAxis - 1; j++) { beadsLocation[i-1][j-1].resize(m_numNodesPerAxis - 2); for (int k = 1; k < m_numNodesPerAxis - 1; k++) { beadsLocation[i-1][j-1][k-1] = SurgSim::Math::getSubVector(positions, get1DIndexFrom3D(i, j, k), 3); } } } return beadsLocation; } private: typedef std::array CubeNodesType; // Number of point per dimensions int m_numNodesPerAxis; /// Boundary condition (list of degrees of freedom to be fixed) std::vector m_boundaryConditions; /// Boundary condition displacement (displacement to apply for each boundary condition) std::vector m_boundaryConditionsDisplacement; // Nodes of the original truth cube CubeNodesType m_cubeNodes; }; /// Build the constrained system for a given truth cube representation /// \param truthCubeRepresentation The Fem3D representation of the truth cube /// \param[out] A the system matrix of size (numDof + numConstraint x numDof + numConstraint) /// \param[out] B the system RHS vector of size (numDof + numConstraint) /// \note Each row of the matrix H aims at fixing a node as a boundary condition. /// \note For example, the constraint equation to fix the dof id 1 is in place (no displacement) is: /// \note H(0 1 0 0...0).U(u0 u1 u2 u3...un) = 0 (or desired displacement) void buildConstrainedSystem(std::shared_ptr truthCubeRepresentation, SurgSim::Math::Matrix* A, SurgSim::Math::Vector* B) { // The static system with constraints is defined as follow: // (K H^T).(U ) = (F) // (H 0) (-lambda) (E) size_t numConstraints = truthCubeRepresentation->getBoundaryConditions().size(); size_t numDof = truthCubeRepresentation->getNumDof(); A->resize(numDof + numConstraints, numDof + numConstraints); B->resize(numDof + numConstraints); SurgSim::Math::Matrix H(numConstraints, truthCubeRepresentation->getNumDof()); H.setZero(); B->setZero(); // Build the temporary constraint matrix H along with the RHS vector B for (size_t i = 0; i < numConstraints; i++) { H(i, truthCubeRepresentation->getBoundaryConditions()[i]) = 1.0; (*B)[numDof + i] = truthCubeRepresentation->getBoundaryConditionsDisplacement()[i]; } A->setZero(); // Copy K into A truthCubeRepresentation->updateFMDK(*truthCubeRepresentation->getInitialState(), Math::ODEEQUATIONUPDATE_K); A->block(0,0, numDof, numDof) = truthCubeRepresentation->getK(); // Copy H into A A->block(numDof, 0, numConstraints, numDof) = H; //Copy H^T into A A->block(0, numDof, numDof, numConstraints) = H.transpose(); } /// Using static solver to find the displacement of truth cube /// \param truthCubeRepresentation The Fem3D representation of truth cube /// \return the vector of displacement for each dof (degree of freedom) SurgSim::Math::Vector staticSolver(std::shared_ptr truthCubeRepresentation) { int numDof = truthCubeRepresentation->getNumDof(); // Build the constrained system A.X = B SurgSim::Math::Matrix A; SurgSim::Math::Vector B; buildConstrainedSystem(truthCubeRepresentation, &A, &B); // Solve the constrained system A.X = B SurgSim::Math::Vector X = A.partialPivLu().solve(B); // Extract the dof displacement vector from the solution X return X.segment(0, numDof); } /// Simulate the truth cube statically with the boundary conditions applied /// \param truthCubeData The truth cube data (this is only useful to adjust the initial data) /// \param truthCubeRepresentation The truth cube representation /// \param displacement The displacement to apply along Y on the top layer (compression in meter) void doSimulation(std::shared_ptr truthCubeData, std::shared_ptr truthCubeRepresentation, double displacement) { // Create initial state // Note that the boundary conditions are NOT defined in this test in the state itself // This would simply modify the global stiffness matrix, which is not sufficient for this test // We prefer to keep the boundary conditions in a separate structure // (internal to TruthCubeRepresentation and apply the Lagrange multiplier technique to solve them). std::shared_ptr initialState = std::make_shared(); truthCubeRepresentation->fillUpDeformableState(initialState); truthCubeRepresentation->adjustInitialBeadsPosition(initialState, truthCubeData->cubeData0); truthCubeRepresentation->setInitialState(initialState); // Create Fem3d cubes from the subdivision cubes truthCubeRepresentation->addFemCubes(initialState); // Setup boundary conditions and displacement truthCubeRepresentation->defineBoundaryCondition(displacement); // Wake Up the Representation truthCubeRepresentation->initialize(std::make_shared()); truthCubeRepresentation->wakeUp(); // Call staticSolver to find the offset values SurgSim::Math::Vector offset = staticSolver(truthCubeRepresentation); // Apply the correction to the simulated truth cube current state truthCubeRepresentation->applyDofCorrection(offset); } /// Copy simulation beads data into point cloud /// \param truthCubeRepresentation The simulated truth cube /// \param representation The representation of point cloud void copySimulationBeadsIntoPointCloud(std::shared_ptr truthCubeRepresentation, std::shared_ptr representation) { std::vector>> beads = truthCubeRepresentation->getBeadsLocation(); auto pointCloud = representation->getVertices(); // Add deform to pointCloud for (size_t i = 0; i < beads.size(); i++) { for (size_t j = 0; j < beads[i].size(); j++) { for (size_t k = 0; k < beads[i][j].size(); k++) { pointCloud->addVertex(PointCloud::VertexType(beads[i][j][k])); } } } } // Copy experimental beads data into point cloud /// \param truthCube The experimental data for the truth cube /// \param representation The representation of point cloud void copyExperimentalBeadsIntoPointCloud(std::vector truthCube, std::shared_ptr representation) { auto pointCloudCompressed = representation->getVertices(); /// Loading the Truth Cube data into point cloud for (size_t i = 0; i < truthCube.size(); ++i) { pointCloudCompressed->addVertex(PointCloud::VertexType(truthCube[i])); } } /// Simple error analysis /// \param cubeData The vector of all experimental beads 3d position /// \param state The state of the simulated truth cube /// \return The maximum error measured on each bead (in meter) double analyzeError(std::vector cubeData, std::shared_ptr state) { double maxError = 0.0; for (size_t cubeDataNodeId = 0; cubeDataNodeId < cubeData.size(); ++cubeDataNodeId) { size_t stateNodeId = searchForClosestNodeInState(state, cubeData[cubeDataNodeId]); auto diff = cubeData[cubeDataNodeId] - state->getPosition(stateNodeId); double error = diff.norm(); if (error > maxError) { maxError = error; } } return maxError; } struct Fem3DVSTruthCubeRenderTests : public RenderTests { void addComponent(std::shared_ptr component) { viewElement->addComponent(component); } void SetUp() override { RenderTests::SetUp(); // Load truth cube data truthCubeData = std::make_shared(); parseTruthCubeData(truthCubeData); // Compute the center point of the cube SurgSim::Math::Vector3d center = SurgSim::Math::Vector3d::Zero(); for (size_t nodeId = 0; nodeId < truthCubeData->cubeData0.size(); ++nodeId) { center += truthCubeData->cubeData0[nodeId]; } center /= truthCubeData->cubeData0.size(); // Compute the cube's corners for the Fem3d simulation double halfLength = 0.04; Vector3d X = Vector3d::UnitX(); Vector3d Y = Vector3d::UnitY(); Vector3d Z = Vector3d::UnitZ(); cubeCorners[0] = center - halfLength * X - halfLength * Y - halfLength * Z; cubeCorners[1] = center + halfLength * X - halfLength * Y - halfLength * Z; cubeCorners[2] = center - halfLength * X + halfLength * Y - halfLength * Z; cubeCorners[3] = center + halfLength * X + halfLength * Y - halfLength * Z; cubeCorners[4] = center - halfLength * X - halfLength * Y + halfLength * Z; cubeCorners[5] = center + halfLength * X - halfLength * Y + halfLength * Z; cubeCorners[6] = center - halfLength * X + halfLength * Y + halfLength * Z; cubeCorners[7] = center + halfLength * X + halfLength * Y + halfLength * Z; } /// The truth cube data set std::shared_ptr truthCubeData; /// The 8 corners of the cube defining the truth cube (useful to setup the Fem3D) std::array cubeCorners; }; TEST_F(Fem3DVSTruthCubeRenderTests, rawDataTest) { // Load the truth cube data std::shared_ptr truthCubeData = std::make_shared(); parseTruthCubeData(truthCubeData); auto points0 = std::make_shared("Data0"); points0->setPointSize(4.0); points0->setColor(Vector4d(1.0, 1.0, 1.0, 1.0)); copyExperimentalBeadsIntoPointCloud(truthCubeData->cubeData0, points0); addComponent(points0); auto points1 = std::make_shared("Data1"); points1->setPointSize(4.0); points1->setColor(Vector4d(1.0, 0.0, 0.0, 1.0)); copyExperimentalBeadsIntoPointCloud(truthCubeData->cubeData1, points1); addComponent(points1); auto points2 = std::make_shared("Data2"); points2->setPointSize(4.0); points2->setColor(Vector4d(0.0, 1.0, 0.0, 1.0)); copyExperimentalBeadsIntoPointCloud(truthCubeData->cubeData2, points2); addComponent(points2); auto points3 = std::make_shared("Data3"); points3->setPointSize(4.0); points3->setColor(Vector4d(0.0, 0.0, 1.0, 1.0)); copyExperimentalBeadsIntoPointCloud(truthCubeData->cubeData3, points3); addComponent(points3); runTest(Vector3d(0.0, 0.0, 0.2), Vector3d::Zero(), 3000.0); } /// Simulate truth cube with 5% strain (4mm of displacement). TEST_F(Fem3DVSTruthCubeRenderTests, Test5percentsStrain) { /// Displacement of the top layer for this setup double displacement = -0.004; // Run the simulation std::shared_ptr truthCubeRepresentation; truthCubeRepresentation = std::make_shared ("TruthCube", cubeCorners); doSimulation(truthCubeData, truthCubeRepresentation, displacement); std::shared_ptr simulatedPoints; simulatedPoints = std::make_shared("SimulatedPoints"); copySimulationBeadsIntoPointCloud(truthCubeRepresentation, simulatedPoints); simulatedPoints->setPointSize(4.0); simulatedPoints->setColor(Vector4d(1.0, 0.0, 0.0, 1.0)); addComponent(simulatedPoints); std::shared_ptr experimentalpoints; experimentalpoints = std::make_shared("ExperimentalPoints"); copyExperimentalBeadsIntoPointCloud(truthCubeData->cubeData1, experimentalpoints); experimentalpoints->setPointSize(4.0); experimentalpoints->setColor(Vector4d(1.0, 1.0, 1.0, 1.0)); addComponent(experimentalpoints); double maxError = analyzeError(truthCubeData->cubeData1, truthCubeRepresentation->getCurrentState()); std::cout << "The maximum error between simulated and experimental setup is " << maxError << " m" << std::endl; /// Run the thread runTest(Vector3d(0.0, 0.0, 0.2), Vector3d::Zero(), 3000.0); } /// Simulate truth cube with 12.5% strain (10mm of displacement). TEST_F(Fem3DVSTruthCubeRenderTests, Test12percentsAndHalfStrain) { /// Displacement of the top layer for this setup double displacement = -0.010; // Run the simulation std::shared_ptr truthCubeRepresentation; truthCubeRepresentation = std::make_shared ("TruthCube", cubeCorners); doSimulation(truthCubeData, truthCubeRepresentation, displacement); std::shared_ptr simulatedPoints; simulatedPoints = std::make_shared("SimulatedPoints"); copySimulationBeadsIntoPointCloud(truthCubeRepresentation, simulatedPoints); simulatedPoints->setPointSize(4.0); simulatedPoints->setColor(Vector4d(1.0, 0.0, 0.0, 1.0)); addComponent(simulatedPoints); std::shared_ptr experimentalpoints; experimentalpoints = std::make_shared("ExperimentalPoints"); copyExperimentalBeadsIntoPointCloud(truthCubeData->cubeData2, experimentalpoints); experimentalpoints->setPointSize(4.0); experimentalpoints->setColor(Vector4d(1.0, 1.0, 1.0, 1.0)); addComponent(experimentalpoints); double maxError = analyzeError(truthCubeData->cubeData2, truthCubeRepresentation->getCurrentState()); std::cout << "The maximum error between simulated and experimental setup is " << maxError << " m" << std::endl; /// Run the thread runTest(Vector3d(0.0, 0.0, 0.2), Vector3d::Zero(), 3000.0); } /// Simulate truth cube with 18.25% strain (14.6mm of displacement). TEST_F(Fem3DVSTruthCubeRenderTests, Test18percentsAndQuarterStrain) { /// Displacement of the top layer for this setup double displacement = -0.0146; // Run the simulation std::shared_ptr truthCubeRepresentation; truthCubeRepresentation = std::make_shared ("TruthCube", cubeCorners); doSimulation(truthCubeData, truthCubeRepresentation, displacement); std::shared_ptr simulatedPoints; simulatedPoints = std::make_shared("SimulatedPoints"); copySimulationBeadsIntoPointCloud(truthCubeRepresentation, simulatedPoints); simulatedPoints->setPointSize(4.0); simulatedPoints->setColor(Vector4d(1.0, 0.0, 0.0, 1.0)); addComponent(simulatedPoints); std::shared_ptr experimentalpoints; experimentalpoints = std::make_shared("ExperimentalPoints"); copyExperimentalBeadsIntoPointCloud(truthCubeData->cubeData3, experimentalpoints); experimentalpoints->setPointSize(4.0); experimentalpoints->setColor(Vector4d(1.0, 1.0, 1.0, 1.0)); addComponent(experimentalpoints); double maxError = analyzeError(truthCubeData->cubeData3, truthCubeRepresentation->getCurrentState()); std::cout << "The maximum error between simulated and experimental setup is " << maxError << " m" << std::endl; /// Run the thread runTest(Vector3d(0.0, 0.0, 0.2), Vector3d::Zero(), 3000.0); } }; // namespace Physics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/RenderTests/RenderTest.cpp000066400000000000000000000040361277777236100241570ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Graphics/OsgAxesRepresentation.h" #include "SurgSim/Physics/RenderTests/RenderTest.h" namespace SurgSim { namespace Physics { void RenderTests::SetUp() { runtime = std::make_shared("config.txt"); graphicsManager = std::make_shared(); runtime->addManager(graphicsManager); physicsManager = std::make_shared(); runtime->addManager(physicsManager); behaviorManager = std::make_shared(); runtime->addManager(behaviorManager); scene = runtime->getScene(); viewElement = std::make_shared("Physics Render Scene"); scene->addSceneElement(viewElement); } void RenderTests::TearDown() { runtime->stop(); } void RenderTests::runTest(const SurgSim::Math::Vector3d& cameraPosition, const SurgSim::Math::Vector3d& cameraLookAt, double miliseconds) { using SurgSim::Graphics::OsgAxesRepresentation; viewElement->enableManipulator(true); viewElement->setManipulatorParameters(cameraPosition, cameraLookAt); std::shared_ptr axes = std::make_shared("axes"); axes->setSize(1.0); viewElement->addComponent(axes); /// Run the thread runtime->start(); boost::this_thread::sleep(boost::posix_time::milliseconds(miliseconds)); } }; // namespace Physics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/RenderTests/RenderTest.h000066400000000000000000000034431277777236100236250ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_RENDERTESTS_RENDERTEST_H #define SURGSIM_PHYSICS_RENDERTESTS_RENDERTEST_H #include #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Framework/Scene.h" #include "SurgSim/Framework/BehaviorManager.h" #include "SurgSim/Graphics/OsgManager.h" #include "SurgSim/Graphics/OsgViewElement.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/PhysicsManager.h" namespace SurgSim { namespace Physics { struct RenderTests : public ::testing::Test { public: virtual void SetUp(); virtual void TearDown(); virtual void runTest(const SurgSim::Math::Vector3d& cameraPosition, const SurgSim::Math::Vector3d& cameraLookAt, double miliseconds); std::shared_ptr runtime; std::shared_ptr graphicsManager; std::shared_ptr physicsManager; std::shared_ptr behaviorManager; std::shared_ptr scene; std::shared_ptr viewElement; }; }; // namespace Physics }; // namespace SurgSim #endif //SURGSIM_PHYSICS_RENDERTESTS_RENDERTEST_H opensurgsim-0.7.0/SurgSim/Physics/RenderTests/RenderTestCcdSuture.cpp000066400000000000000000000303031277777236100257750ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. ///\file RenderTestCcdSuture.cpp render test for ccd with Fem1D #include #include "SurgSim/Blocks/CompoundShapeToGraphics.h" #include "SurgSim/Blocks/TransferPhysicsToVerticesBehavior.h" #include "SurgSim/Blocks/VisualizeConstraints.h" #include "SurgSim/Collision/Representation.h" #include "SurgSim/Framework/BasicSceneElement.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Framework/SceneElement.h" #include "SurgSim/Graphics/OsgAxesRepresentation.h" #include "SurgSim/Graphics/OsgCurveRepresentation.h" #include "SurgSim/Graphics/OsgMeshRepresentation.h" #include "SurgSim/Graphics/OsgSceneryRepresentation.h" #include "SurgSim/Math/CompoundShape.h" #include "SurgSim/Math/LinearSparseSolveAndInverse.h" #include "SurgSim/Math/MeshShape.h" #include "SurgSim/Math/OdeSolver.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/SegmentMeshShape.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/DeformableCollisionRepresentation.h" #include "SurgSim/Physics/Fem1DElementBeam.h" #include "SurgSim/Physics/Fem1DRepresentation.h" #include "SurgSim/Physics/PhysicsManager.h" #include "SurgSim/Physics/RenderTests/RenderTest.h" #include "SurgSim/Physics/RigidCollisionRepresentation.h" #include "SurgSim/Physics/RigidRepresentation.h" namespace { std::shared_ptr makeSuture(const std::string& filename) { auto element = std::make_shared("Suture"); // Physics auto physics = std::make_shared("Physics"); physics->setFemElementType("SurgSim::Physics::Fem1DElementBeam"); physics->setLocalPose(SurgSim::Math::RigidTransform3d::Identity()); physics->loadFem(filename); physics->setIntegrationScheme(SurgSim::Math::INTEGRATIONSCHEME_EULER_IMPLICIT); physics->setLinearSolver(SurgSim::Math::LINEARSOLVER_LU); physics->setRayleighDampingMass(5.0); physics->setRayleighDampingStiffness(0.001); physics->setIsGravityEnabled(true); element->addComponent(physics); // Graphics auto gfx = std::make_shared("Graphics"); gfx->setColor(SurgSim::Math::Vector4d(0.0, 0.0, 1.0, 1.0)); gfx->setAntiAliasing(true); gfx->setWidth(0.9); element->addComponent(gfx); auto collision = std::make_shared("Collision"); auto shape = std::make_shared(); shape->load(filename); shape->setRadius(0.001); collision->setShape(shape); collision->setCollisionDetectionType(SurgSim::Collision::COLLISION_DETECTION_TYPE_CONTINUOUS); collision->setSelfCollisionDetectionType(SurgSim::Collision::COLLISION_DETECTION_TYPE_CONTINUOUS); physics->setCollisionRepresentation(collision); element->addComponent(collision); auto copier = std::make_shared("Copier"); copier->setSource(physics); copier->setTarget(gfx); element->addComponent(copier); return element; } std::shared_ptr makeRigid(const std::string& filename) { SurgSim::Math::RigidTransform3d pose = SurgSim::Math::makeRigidTranslation(SurgSim::Math::Vector3d(0.0, -0.1, 0.0)); auto element = std::make_shared("RigidMesh"); element->setPose(pose); auto shape = std::make_shared(); shape->load(filename); auto rigid = std::make_shared("Physics"); rigid->setIsGravityEnabled(false); // http://www.engineeringtoolbox.com/wood-density-d_40.html rigid->setDensity(5800.0); // Cedar of Lebanon wood density 5800.0 Kg/m-3 rigid->setShape(shape); element->addComponent(rigid); auto collision = std::make_shared("Collision"); collision->setCollisionDetectionType(SurgSim::Collision::COLLISION_DETECTION_TYPE_CONTINUOUS); rigid->setCollisionRepresentation(collision); collision->setShape(shape); element->addComponent(collision); auto osgRepresentation = std::make_shared("Graphics"); osgRepresentation->setShape(shape); element->addComponent(osgRepresentation); return element; } std::shared_ptr makeCompound() { auto element = std::make_shared("Compound"); using SurgSim::Math::Vector3d; auto physics = std::make_shared("Physics"); physics->setDensity(700.0); // Wood physics->setLinearDamping(0.5); physics->setIsGravityEnabled(false); auto subShape = std::make_shared(); subShape->load("bar.ply"); auto shape = std::make_shared(); physics->setShape(shape); element->addComponent(physics); auto transform = SurgSim::Math::makeRigidTransform( SurgSim::Math::makeRotationQuaternion(0.2, Vector3d(1.0, 0.0, 0.0)), Vector3d(0.0, 0.0, 0.0)); shape->addShape(subShape, transform); auto copier = std::make_shared("Copier"); copier->setSource(physics); element->addComponent(copier); auto graphics = std::make_shared("LeftGraphics"); graphics->setLocalPose(transform); graphics->loadModel("bar.ply"); element->addComponent(graphics); copier->addTarget(graphics); transform = SurgSim::Math::makeRigidTransform( SurgSim::Math::makeRotationQuaternion(-0.2, Vector3d(1.0, 0.0, 0.0)), Vector3d(0.0, 0.0, 0.0)); shape->addShape(subShape, transform); graphics = std::make_shared("RightGraphics"); graphics->setLocalPose(transform); graphics->loadModel("bar.ply"); element->addComponent(graphics); copier->addTarget(graphics); auto rigidCollision = std::make_shared("Collision"); physics->setCollisionRepresentation(rigidCollision); rigidCollision->setCollisionDetectionType(SurgSim::Collision::COLLISION_DETECTION_TYPE_CONTINUOUS); element->addComponent(rigidCollision); transform = SurgSim::Math::makeRigidTransform( SurgSim::Math::makeRotationQuaternion(M_PI_2, Vector3d(0.0, 1.0, 0.0)), Vector3d(0.0, -0.2, 0.0)); element->setPose(transform); return element; } } class CcdSutureTest : public SurgSim::Physics::RenderTests { public: void SetUp() override { SurgSim::Physics::RenderTests::SetUp(); scene->addSceneElement(std::make_shared()); SurgSim::Framework::Logger::getLoggerManager()->setThreshold(SurgSim::Framework::LOG_LEVEL_DEBUG); physicsManager->setComputations(SurgSim::Physics::createCcdPipeline()); physicsManager->setRate(150.0); } }; TEST_F(CcdSutureTest, SutureVsMeshedCylinder) { scene->addSceneElement(makeSuture("prolene 3.0-fixedExtremity.ply")); scene->addSceneElement(makeRigid("cylinder.ply")); SurgSim::Math::Vector3d cameraPosition(0.25, 0.0, 0.1); SurgSim::Math::Vector3d cameraLookAt(0.0, -0.1, 0.0); physicsManager->setRate(100.0); double milliseconds = 5000.0; runTest(cameraPosition, cameraLookAt, milliseconds); } TEST_F(CcdSutureTest, Fem1DHalfKnot) { scene->addSceneElement(makeSuture("half_knot.ply")); SurgSim::Math::Vector3d cameraPosition(1.0, 0.0, 1.0); SurgSim::Math::Vector3d cameraLookAt(0.0, 0.0, 0.0); physicsManager->setRate(150.0); double milliseconds = 5000.0; runTest(cameraPosition, cameraLookAt, milliseconds); } TEST_F(CcdSutureTest, Fem1DLoop) { scene->addSceneElement(makeSuture("loop.ply")); SurgSim::Math::Vector3d cameraPosition(0.25, 0.0, 0.25); SurgSim::Math::Vector3d cameraLookAt(0.0, 0.0, 0.0); physicsManager->setRate(50.0); double milliseconds = 5000.0; runTest(cameraPosition, cameraLookAt, milliseconds); } TEST_F(CcdSutureTest, Fem1DBlock) { std::shared_ptr element = std::make_shared("Axis"); element->addComponent(std::make_shared("Axis")); scene->addSceneElement(element); element = makeRigid("bar.ply"); auto transform = SurgSim::Math::makeRigidTransform( SurgSim::Math::makeRotationQuaternion(M_PI_2, SurgSim::Math::Vector3d(0.0, 1.0, 0.0)), SurgSim::Math::Vector3d(0.0, -0.2, 0.0)); element->setPose(transform); scene->addSceneElement(element); scene->addSceneElement(makeSuture("prolene 3.0-fixedExtremity.ply")); physicsManager->setRate(100.0); physicsManager->setComputations(SurgSim::Physics::createCcdPipeline()); scene->addSceneElement(std::make_shared()); SurgSim::Math::Vector3d cameraPosition(0.25, 0.0, 0.25); SurgSim::Math::Vector3d cameraLookAt(0.0, -0.1, 0.0); double miliseconds = 5000.0; runTest(cameraPosition, cameraLookAt, miliseconds); } TEST_F(CcdSutureTest, Fem1DCompound) { auto element = std::make_shared("Axis"); element->addComponent(std::make_shared("Axis")); scene->addSceneElement(element); scene->addSceneElement(makeCompound()); scene->addSceneElement(makeSuture("prolene 3.0-fixedExtremity.ply")); physicsManager->setRate(100.0); physicsManager->setComputations(SurgSim::Physics::createCcdPipeline()); scene->addSceneElement(std::make_shared()); SurgSim::Math::Vector3d cameraPosition(0.25, 0.0, 0.25); SurgSim::Math::Vector3d cameraLookAt(0.0, -0.1, 0.0); double miliseconds = 5000.0; runTest(cameraPosition, cameraLookAt, miliseconds); } TEST_F(CcdSutureTest, Fem1DMovingCompound) { using SurgSim::Math::Vector3d; std::shared_ptr element = std::make_shared("Axis"); element->addComponent(std::make_shared("Axis")); scene->addSceneElement(element); element = makeCompound(); auto leftGraphics = std::dynamic_pointer_cast(element->getComponent("LeftGraphics")); auto rightGraphics = std::dynamic_pointer_cast(element->getComponent("RightGraphics")); auto physics = std::dynamic_pointer_cast(element->getComponent("Physics")); ASSERT_NE(nullptr, leftGraphics); ASSERT_NE(nullptr, rightGraphics); ASSERT_NE(nullptr, physics); auto shape = std::dynamic_pointer_cast(physics->getShape()); scene->addSceneElement(element); scene->addSceneElement(makeSuture("prolene 3.0-fixedExtremity.ply")); physicsManager->setRate(300.0); physicsManager->setComputations(SurgSim::Physics::createCcdPipeline()); scene->addSceneElement(std::make_shared()); SurgSim::Math::Vector3d cameraPosition(0.25, 0.0, 0.25); SurgSim::Math::Vector3d cameraLookAt(0.0, -0.1, 0.0); runtime->start(); viewElement->enableManipulator(true); viewElement->setManipulatorParameters(cameraPosition, cameraLookAt); boost::this_thread::sleep(boost::posix_time::milliseconds(1000)); for (double angle = 0.2, offset = -0.05; angle < 1.0; angle += 0.00125, offset += 0.0005) { auto transform = SurgSim::Math::makeRigidTransform( SurgSim::Math::makeRotationQuaternion(angle, Vector3d(1.0, 0.0, 0.0)), Vector3d(0.0, offset, 0.0)); shape->setPose(0, transform); leftGraphics->setLocalPose(transform); transform = SurgSim::Math::makeRigidTransform( SurgSim::Math::makeRotationQuaternion(-angle, Vector3d(1.0, 0.0, 0.0)), Vector3d(0.0, offset, 0.0)); shape->setPose(1, transform); rightGraphics->setLocalPose(transform); boost::this_thread::sleep(boost::posix_time::milliseconds(50)); } } opensurgsim-0.7.0/SurgSim/Physics/RenderTests/RenderTestFem1D.cpp000066400000000000000000000132451277777236100247760ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. ///\file RenderTestFem1D.cpp render test for Fem1D #include #include "SurgSim/Blocks/TransferPhysicsToVerticesBehavior.h" #include "SurgSim/Framework/BasicSceneElement.h" #include "SurgSim/Graphics/OsgCurveRepresentation.h" #include "SurgSim/Math/OdeState.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/Fem1DRepresentation.h" #include "SurgSim/Physics/Fem1DElementBeam.h" #include "SurgSim/Physics/RenderTests/RenderTest.h" using SurgSim::Blocks::TransferPhysicsToVerticesBehavior; using SurgSim::Framework::BasicSceneElement; using SurgSim::Graphics::OsgCurveRepresentation; using SurgSim::Math::Vector3d; using SurgSim::Physics::Fem1DRepresentation; using SurgSim::Physics::Fem1DElementBeam; namespace { void loadModelFem1D(std::shared_ptr physicsRepresentation, size_t numNodes) { std::shared_ptr restState = std::make_shared(); restState->setNumDof(physicsRepresentation->getNumDofPerNode(), numNodes); // Sets the initial state (node positions and boundary conditions) SurgSim::Math::Vector& x = restState->getPositions(); for (size_t nodeId = 0; nodeId < numNodes; nodeId++) { SurgSim::Math::getSubVector(x, nodeId, physicsRepresentation->getNumDofPerNode()).segment<3>(0) = Vector3d(static_cast(nodeId) / static_cast(numNodes - 1) - 0.5, 0.0, 0.0); } // Fix the start and end nodes restState->addBoundaryCondition(0, 0); restState->addBoundaryCondition(0, 1); restState->addBoundaryCondition(0, 2); restState->addBoundaryCondition(numNodes - 1, 0); restState->addBoundaryCondition(numNodes - 1, 1); restState->addBoundaryCondition(numNodes - 1, 2); physicsRepresentation->setInitialState(restState); // Adds all the FemElements for (size_t beamId = 0; beamId < numNodes - 1; beamId++) { std::array beamNodeIds = {{beamId, beamId + 1}}; std::shared_ptr beam = std::make_shared(beamNodeIds); beam->setRadius(0.10); beam->setMassDensity(3000.0); beam->setPoissonRatio(0.45); beam->setYoungModulus(1e6); physicsRepresentation->addFemElement(beam); } } // Generates a 1d fem comprised of adjacent elements along a straight line. The number of fem elements is determined // by loadModelFem1D. std::shared_ptr createFem1D(const std::string& name, const SurgSim::Math::RigidTransform3d& gfxPose, const SurgSim::Math::Vector4d& color, SurgSim::Math::IntegrationScheme integrationScheme) { auto physicsRepresentation = std::make_shared("Physics Representation: " + name); // In this test, the physics representations are not transformed, only the graphics will be transformed loadModelFem1D(physicsRepresentation, 10); physicsRepresentation->setIntegrationScheme(integrationScheme); physicsRepresentation->setRayleighDampingMass(5e-2); physicsRepresentation->setRayleighDampingStiffness(5e-3); auto femSceneElement = std::make_shared(name); femSceneElement->addComponent(physicsRepresentation); auto graphicsRepresentation = std::make_shared("Graphics Representation: " + name); graphicsRepresentation->setLocalPose(gfxPose); graphicsRepresentation->setColor(color); femSceneElement->addComponent(graphicsRepresentation); auto copier = std::make_shared("Copier"); copier->setSource(physicsRepresentation); copier->setTarget(graphicsRepresentation); femSceneElement->addComponent(copier); return femSceneElement; } }; // anonymous namespace namespace SurgSim { namespace Physics { TEST_F(RenderTests, VisualTestFem1D) { using SurgSim::Math::makeRigidTranslation; using SurgSim::Math::Vector4d; scene->addSceneElement( createFem1D("Euler Explicit", // name makeRigidTranslation(Vector3d(0.0, 0.5, 0.0)), // graphics pose Vector4d(1, 0, 0, 1), // color (r, g, b, a) SurgSim::Math::INTEGRATIONSCHEME_LINEAR_EULER_EXPLICIT)); // technique to update object scene->addSceneElement( createFem1D("Modified Euler Explicit", makeRigidTranslation(Vector3d(0.0, 0.25, 0.0)), Vector4d(0.5, 0, 0, 1), SurgSim::Math::INTEGRATIONSCHEME_LINEAR_EULER_EXPLICIT)); scene->addSceneElement( createFem1D("Runge Kutta 4", makeRigidTranslation(Vector3d(0.0, 0.0, 0.0)), Vector4d(0, 1, 0, 1), SurgSim::Math::INTEGRATIONSCHEME_LINEAR_RUNGE_KUTTA_4)); scene->addSceneElement( createFem1D("Euler Implicit", makeRigidTranslation(Vector3d(0.0, -0.25, 0.0)), Vector4d(0, 0, 1, 1), SurgSim::Math::INTEGRATIONSCHEME_LINEAR_EULER_IMPLICIT)); scene->addSceneElement( createFem1D("Static", makeRigidTranslation(Vector3d(0.0, -0.5, 0.0)), Vector4d(1, 1, 1, 1), SurgSim::Math::INTEGRATIONSCHEME_LINEAR_STATIC)); runTest(Vector3d(0.0, 0.0, 2.0), Vector3d::Zero(), 5000.0); } }; // namespace Physics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/RenderTests/RenderTestFem2D.cpp000066400000000000000000000245531277777236100250030ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. ///\file RenderTestFem2D.cpp render test for Fem2D #include #include "SurgSim/Blocks/TransferPhysicsToGraphicsMeshBehavior.h" #include "SurgSim/Blocks/TransferPhysicsToPointCloudBehavior.h" #include "SurgSim/Framework/BasicSceneElement.h" #include "SurgSim/Graphics/Mesh.h" #include "SurgSim/Graphics/OsgMeshRepresentation.h" #include "SurgSim/Graphics/OsgPointCloudRepresentation.h" #include "SurgSim/Math/OdeState.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/Fem2DRepresentation.h" #include "SurgSim/Physics/Fem2DElementTriangle.h" #include "SurgSim/Physics/RenderTests/RenderTest.h" using SurgSim::Blocks::TransferPhysicsToGraphicsMeshBehavior; using SurgSim::Blocks::TransferPhysicsToPointCloudBehavior; using SurgSim::Framework::BasicSceneElement; using SurgSim::Graphics::OsgPointCloudRepresentation; using SurgSim::Math::Vector3d; using SurgSim::Physics::Fem2DRepresentation; using SurgSim::Physics::Fem2DElementTriangle; namespace { /// Create a Fem2D with a cylinder shape /// \note This is defining a cylinder based on cylindrical coordinates M(length, angle) /// \note The cylinder is composed of cross-sections with nodes added radially to each cross-section. /// \note The nodes of 2 consecutives cross-sections are connected to form square-patches which in turn /// \note are decomposed into 2 Fem2DElementTriangle. void createFem2DCylinder(std::shared_ptr physicsRepresentation) { // Mechanical properties const double youngModulus = 1e6; const double poissonRatio = 0.35; const double massDensity = 5000.0; // Geometrical properties const double length = 1.0; const double radius = 8e-2; const double thickness = 3e-2; // Number of cross-sections and their discretization in nodes const size_t numSections = 7; const size_t numNodesOnSection = 8; const size_t numNodes = numSections * numNodesOnSection; // Distance between 2 consecutive cross-section const double deltaL = length / (numSections - 1); // Angle between 2 consecutive nodes on a cross-section const double deltaAngle = 2.0 * M_PI / numNodesOnSection; std::shared_ptr restState = std::make_shared(); restState->setNumDof(physicsRepresentation->getNumDofPerNode(), numNodes); // Sets the initial state (node positions and boundary conditions) SurgSim::Math::Vector& x = restState->getPositions(); size_t numDofPerNode = physicsRepresentation->getNumDofPerNode(); for (size_t sectionId = 0; sectionId < numSections; sectionId++) { for (size_t nodeIdOnSection = 0; nodeIdOnSection < numNodesOnSection; nodeIdOnSection++) { double angle = deltaAngle * nodeIdOnSection; x.segment<3>(numDofPerNode * (sectionId * numNodesOnSection + nodeIdOnSection)) = Vector3d(-length / 2.0 + sectionId * deltaL, radius * cos(angle), radius * sin(angle)); } } // We fix the nodes on the 1st and last cross-sections const size_t section0 = 0; const size_t section1 = numSections - 1; for (size_t nodeId = 0; nodeId < numNodesOnSection; nodeId++) { restState->addBoundaryCondition(nodeId + numNodesOnSection * section0); restState->addBoundaryCondition(nodeId + numNodesOnSection * section1); } physicsRepresentation->setInitialState(restState); // Adds all the FemElements for (size_t sectionId = 0; sectionId < numSections - 1; sectionId++) { // For each cross-section, we connect the nodes of this cross-section to the nodes of the next cross-section for (size_t nodeIdOnSection = 0; nodeIdOnSection < numNodesOnSection; nodeIdOnSection++) { // On a given cross-section, each node will be connected to the next node // The last node is connected to the 1st node via a modulo in the node index calculation std::array, 2> nodeIds = {{ {{ sectionId * numNodesOnSection + nodeIdOnSection, sectionId * numNodesOnSection + (nodeIdOnSection + 1) % numNodesOnSection }} , {{ (sectionId + 1) * numNodesOnSection + nodeIdOnSection, (sectionId + 1) * numNodesOnSection + (nodeIdOnSection + 1) % numNodesOnSection }} }}; std::array triangle1NodeIds = {{nodeIds[0][0], nodeIds[0][1], nodeIds[1][1]}}; std::shared_ptr triangle1 = std::make_shared(triangle1NodeIds); triangle1->setThickness(thickness); triangle1->setMassDensity(massDensity); triangle1->setPoissonRatio(poissonRatio); triangle1->setYoungModulus(youngModulus); physicsRepresentation->addFemElement(triangle1); std::array triangle2NodeIds = {{nodeIds[0][0], nodeIds[1][1], nodeIds[1][0]}}; std::shared_ptr triangle2 = std::make_shared(triangle2NodeIds); triangle2->setThickness(thickness); triangle2->setMassDensity(massDensity); triangle2->setPoissonRatio(poissonRatio); triangle2->setYoungModulus(youngModulus); physicsRepresentation->addFemElement(triangle2); } } } // Generates a 2d fem comprised of a cylinder. The number of fem elements is determined by createFem2DCylinder. std::shared_ptr createFem2D(const std::string& name, const SurgSim::Math::RigidTransform3d& gfxPose, const SurgSim::Math::Vector4d& color, SurgSim::Math::IntegrationScheme integrationScheme) { std::shared_ptr physicsRepresentation = std::make_shared("Physics Representation"); // In this test, the physics representations are not transformed, only the graphics will be transformed createFem2DCylinder(physicsRepresentation); physicsRepresentation->setIntegrationScheme(integrationScheme); physicsRepresentation->setRayleighDampingMass(1e0); physicsRepresentation->setRayleighDampingStiffness(1e-3); std::shared_ptr femSceneElement = std::make_shared(name); femSceneElement->addComponent(physicsRepresentation); // Create a triangle mesh for visualizing the surface of the finite element model std::shared_ptr graphicsTriangleMeshRepresentation = std::make_shared("TriangleMesh Representation"); graphicsTriangleMeshRepresentation->setLocalPose(gfxPose); auto mesh = graphicsTriangleMeshRepresentation->getMesh(); // Create vertices for (size_t vertexId = 0; vertexId < physicsRepresentation->getInitialState()->getNumNodes(); vertexId++) { SurgSim::Graphics::Mesh::VertexType v(physicsRepresentation->getInitialState()->getPosition(vertexId)); mesh->addVertex(v); } // Create triangles for (size_t triangleId = 0; triangleId < physicsRepresentation->getNumFemElements(); triangleId++) { auto nodeIdsVector = physicsRepresentation->getFemElement(triangleId)->getNodeIds(); std::array nodeIds = {{nodeIdsVector[0], nodeIdsVector[1], nodeIdsVector[2]}}; SurgSim::Graphics::Mesh::TriangleType t(nodeIds); mesh->addTriangle(t); } femSceneElement->addComponent(graphicsTriangleMeshRepresentation); // Create a behavior which transfers the position of the vertices in the FEM to locations in the triangle mesh auto physicsToMesh = std::make_shared("physics to triangle mesh"); physicsToMesh->setSource(physicsRepresentation); physicsToMesh->setTarget(graphicsTriangleMeshRepresentation); femSceneElement->addComponent(physicsToMesh); std::shared_ptr graphicsPointCloudRepresentation = std::make_shared("PointCloud Representation"); graphicsPointCloudRepresentation->setLocalPose(gfxPose); graphicsPointCloudRepresentation->setColor(color); graphicsPointCloudRepresentation->setPointSize(3.0f); graphicsPointCloudRepresentation->setLocalActive(true); femSceneElement->addComponent(graphicsPointCloudRepresentation); auto physicsToPointCloud = std::make_shared("Transfer from Physics to Graphics point cloud"); physicsToPointCloud->setSource(physicsRepresentation); physicsToPointCloud->setTarget(graphicsPointCloudRepresentation); femSceneElement->addComponent(physicsToPointCloud); return femSceneElement; } }; // anonymous namespace namespace SurgSim { namespace Physics { TEST_F(RenderTests, VisualTestFem2D) { using SurgSim::Math::makeRigidTransform; using SurgSim::Math::Vector4d; const SurgSim::Math::Quaterniond quaternion(Eigen::AngleAxisd(-M_PI / 6.0, Vector3d(0.0, 1.0, 0.0))); scene->addSceneElement( createFem2D("Euler Explicit", // name makeRigidTransform(quaternion, Vector3d(0.0, 0.6, 0.0)), // graphics pose (rot., trans.) Vector4d(1, 0, 0, 1), // color (r, g, b, a) SurgSim::Math::INTEGRATIONSCHEME_LINEAR_EULER_EXPLICIT)); // technique to update object scene->addSceneElement( createFem2D("Modified Euler Explicit", makeRigidTransform(quaternion, Vector3d(0.0, 0.3, 0.0)), Vector4d(0.5, 0, 0, 1), SurgSim::Math::INTEGRATIONSCHEME_LINEAR_EULER_EXPLICIT_MODIFIED)); scene->addSceneElement( createFem2D("Runge Kutta 4", makeRigidTransform(quaternion, Vector3d(0.0, 0.0, 0.0)), Vector4d(0, 1, 0, 1), SurgSim::Math::INTEGRATIONSCHEME_LINEAR_RUNGE_KUTTA_4)); scene->addSceneElement( createFem2D("Euler Implicit", makeRigidTransform(quaternion, Vector3d(0.0, -0.3, 0.0)), Vector4d(0, 0, 1, 1), SurgSim::Math::INTEGRATIONSCHEME_LINEAR_EULER_IMPLICIT)); scene->addSceneElement( createFem2D("Static", makeRigidTransform(quaternion, Vector3d(0.0, -0.6, 0.0)), Vector4d(1, 1, 1, 1), SurgSim::Math::INTEGRATIONSCHEME_LINEAR_STATIC)); runTest(Vector3d(0.0, 0.0, 2.0), Vector3d::Zero(), 5000.0); } }; // namespace Physics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/RenderTests/RenderTestFem3D.cpp000066400000000000000000000237311277777236100250010ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. ///\file RenderTestFem3D.cpp render test for Fem3D #include #include "SurgSim/Blocks/TransferPhysicsToPointCloudBehavior.h" #include "SurgSim/Framework/BasicSceneElement.h" #include "SurgSim/Graphics/OsgPointCloudRepresentation.h" #include "SurgSim/Math/OdeState.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/Fem3DRepresentation.h" #include "SurgSim/Physics/Fem3DElementCube.h" #include "SurgSim/Physics/Fem3DElementTetrahedron.h" #include "SurgSim/Physics/RenderTests/RenderTest.h" using SurgSim::Blocks::TransferPhysicsToPointCloudBehavior; using SurgSim::Framework::BasicSceneElement; using SurgSim::Graphics::OsgPointCloudRepresentation; using SurgSim::Physics::Fem3DRepresentation; using SurgSim::Physics::FemElement; using SurgSim::Physics::Fem3DElementCube; using SurgSim::Physics::Fem3DElementTetrahedron; using SurgSim::Math::Vector3d; namespace { std::shared_ptr createTetrahedronFem3D(const std::string& name, const SurgSim::Math::RigidTransform3d& pose, SurgSim::Math::Vector4d color, SurgSim::Math::IntegrationScheme integrationScheme) { // Physics Representation std::shared_ptr physicsRepresentation; physicsRepresentation = std::make_shared(name + " Physics"); physicsRepresentation->setIntegrationScheme(integrationScheme); physicsRepresentation->setRayleighDampingMass(5e-2); physicsRepresentation->setRayleighDampingStiffness(5e-3); std::array vertices = {{ Vector3d(-0.5, -0.5, -0.5), Vector3d(0.5, -0.5, -0.5), Vector3d(-0.5, 0.5, -0.5), Vector3d(0.5, 0.5, -0.5), Vector3d(-0.5, -0.5, 0.5), Vector3d(0.5, -0.5, 0.5), Vector3d(-0.5, 0.5, 0.5), Vector3d(0.5, 0.5, 0.5) } }; // Cube decomposition into 5 tetrahedrons // https://www.math.ucdavis.edu/~deloera/CURRENT_INTERESTS/cube.html std::array< std::array, 5> tetrahedrons = {{ {{4, 7, 1, 2}}, // CCW (47)cross(41) . (42) > 0 {{4, 1, 7, 5}}, // CCW (41)cross(47) . (45) > 0 {{4, 2, 1, 0}}, // CCW (42)cross(41) . (40) > 0 {{4, 7, 2, 6}}, // CCW (47)cross(42) . (46) > 0 {{1, 2, 7, 3}} // CCW (12)cross(17) . (13) > 0 } }; std::array boundaryConditionsNodeIdx = {{0, 1, 2, 3}}; std::shared_ptr initialState = std::make_shared(); initialState->setNumDof(physicsRepresentation->getNumDofPerNode(), 8); for (size_t i = 0; i != vertices.size(); i++) { initialState->getPositions().segment(i * 3, 3) = vertices[i]; } for (auto index = boundaryConditionsNodeIdx.cbegin(); index != boundaryConditionsNodeIdx.cend(); ++index) { initialState->addBoundaryCondition(*index); } physicsRepresentation->setInitialState(initialState); for (auto tetrahedron = tetrahedrons.cbegin(); tetrahedron != tetrahedrons.cend(); ++tetrahedron) { std::shared_ptr element = std::make_shared(*tetrahedron); element->setMassDensity(8000.0); element->setPoissonRatio(0.45); element->setYoungModulus(1.0e6); physicsRepresentation->addFemElement(element); } // Graphics Representation std::shared_ptr graphicsRepresentation; graphicsRepresentation = std::make_shared(name + " Graphics object "); graphicsRepresentation->setLocalPose(pose); graphicsRepresentation->setColor(color); graphicsRepresentation->setPointSize(3.0f); graphicsRepresentation->setLocalActive(true); // Scene Element std::shared_ptr femSceneElement = std::make_shared(name); femSceneElement->addComponent(physicsRepresentation); femSceneElement->addComponent(graphicsRepresentation); auto physicsToGraphics = std::make_shared("Physics to Graphics deformable points"); physicsToGraphics->setSource(physicsRepresentation); physicsToGraphics->setTarget(graphicsRepresentation); femSceneElement->addComponent(physicsToGraphics); return femSceneElement; } std::shared_ptr createCubeFem3D(const std::string& name, const SurgSim::Math::RigidTransform3d& pose, SurgSim::Math::Vector4d color, SurgSim::Math::IntegrationScheme integrationScheme) { // Physics Representation std::shared_ptr physicsRepresentation; physicsRepresentation = std::make_shared(name + " Physics"); physicsRepresentation->setIntegrationScheme(integrationScheme); physicsRepresentation->setRayleighDampingMass(5e-2); physicsRepresentation->setRayleighDampingStiffness(5e-3); std::array vertices = {{ Vector3d(-0.5, -0.5, -0.5), Vector3d(0.5, -0.5, -0.5), Vector3d(-0.5, 0.5, -0.5), Vector3d(0.5, 0.5, -0.5), Vector3d(-0.5, -0.5, 0.5), Vector3d(0.5, -0.5, 0.5), Vector3d(-0.5, 0.5, 0.5), Vector3d(0.5, 0.5, 0.5) } }; std::array cube = {{0, 1, 3, 2, 4, 5, 7, 6}}; std::array boundaryConditionsNodeIdx = {{0, 1, 2, 3}}; std::shared_ptr initialState = std::make_shared(); initialState->setNumDof(physicsRepresentation->getNumDofPerNode(), 8); for (size_t i = 0; i != vertices.size(); i++) { initialState->getPositions().segment(i * 3, 3) = vertices[i]; } for (auto index = boundaryConditionsNodeIdx.cbegin(); index != boundaryConditionsNodeIdx.cend(); ++index) { initialState->addBoundaryCondition(*index); } physicsRepresentation->setInitialState(initialState); std::shared_ptr element = std::make_shared(cube); element->setMassDensity(8000.0); element->setPoissonRatio(0.45); element->setYoungModulus(1.0e6); physicsRepresentation->addFemElement(element); // Graphics Representation std::shared_ptr graphicsRepresentation; graphicsRepresentation = std::make_shared(name + " Graphics object "); graphicsRepresentation->setLocalPose(pose); graphicsRepresentation->setColor(color); graphicsRepresentation->setPointSize(3.0f); graphicsRepresentation->setLocalActive(true); // Scene Element std::shared_ptr femSceneElement = std::make_shared(name); femSceneElement->addComponent(physicsRepresentation); femSceneElement->addComponent(graphicsRepresentation); auto physicsToGraphics = std::make_shared("Physics to Graphics deformable points"); physicsToGraphics->setSource(physicsRepresentation); physicsToGraphics->setTarget(graphicsRepresentation); femSceneElement->addComponent(physicsToGraphics); return femSceneElement; } }; // anonymous namespace namespace SurgSim { namespace Physics { TEST_F(RenderTests, VisualTestFem3D) { using SurgSim::Math::makeRigidTranslation; using SurgSim::Math::Vector4d; // Cube with cube FemElement scene->addSceneElement(createCubeFem3D("CubeElement Euler Explicit", makeRigidTranslation(Vector3d(-4.0, 2.0, -2.0)), Vector4d(1, 0, 0, 1), SurgSim::Math::INTEGRATIONSCHEME_LINEAR_EULER_EXPLICIT)); scene->addSceneElement(createCubeFem3D("CubeElement Modified Euler Explicit", makeRigidTranslation(Vector3d(-2.0, 2.0, -2.0)), Vector4d(0.5, 0, 0, 1), SurgSim::Math::INTEGRATIONSCHEME_LINEAR_EULER_EXPLICIT_MODIFIED)); scene->addSceneElement(createCubeFem3D("CubeElement Runge Kutta 4", makeRigidTranslation(Vector3d(0.0, 2.0, -2.0)), Vector4d(0, 1, 0, 1), SurgSim::Math::INTEGRATIONSCHEME_LINEAR_RUNGE_KUTTA_4)); scene->addSceneElement(createCubeFem3D("CubeElement Fem 3D Euler Implicit", makeRigidTranslation(Vector3d(2.0, 2.0, -2.0)), Vector4d(0, 0, 1, 1), SurgSim::Math::INTEGRATIONSCHEME_LINEAR_EULER_IMPLICIT)); scene->addSceneElement(createCubeFem3D("CubeElement Static", makeRigidTranslation(Vector3d(4.0, 2.0, -2.0)), Vector4d(1, 1, 1, 1), SurgSim::Math::INTEGRATIONSCHEME_STATIC)); // Cube with tetrahedron FemElement scene->addSceneElement(createTetrahedronFem3D("TetrahedronElement Euler Explicit", makeRigidTranslation(Vector3d(-4.0, -2.0, -2.0)), Vector4d(1, 0, 0, 1), SurgSim::Math::INTEGRATIONSCHEME_LINEAR_EULER_EXPLICIT)); scene->addSceneElement(createTetrahedronFem3D("TetrahedronElement Modified Euler Explicit", makeRigidTranslation(Vector3d(-2.0, -2.0, -2.0)), Vector4d(0.5, 0, 0, 1), SurgSim::Math::INTEGRATIONSCHEME_LINEAR_EULER_EXPLICIT_MODIFIED)); scene->addSceneElement(createTetrahedronFem3D("TetrahedronElement Runge Kutta 4", makeRigidTranslation(Vector3d(0.0, -2.0, -2.0)), Vector4d(0, 1, 0, 1), SurgSim::Math::INTEGRATIONSCHEME_LINEAR_RUNGE_KUTTA_4)); scene->addSceneElement(createTetrahedronFem3D("TetrahedronElement Fem 3D Euler Implicit", makeRigidTranslation(Vector3d(2.0, -2.0, -2.0)), Vector4d(0, 0, 1, 1), SurgSim::Math::INTEGRATIONSCHEME_LINEAR_EULER_IMPLICIT)); scene->addSceneElement(createTetrahedronFem3D("TetrahedronElement Static", makeRigidTranslation(Vector3d(4.0, -2.0, -2.0)), Vector4d(1, 1, 1, 1), SurgSim::Math::INTEGRATIONSCHEME_LINEAR_STATIC)); runTest(Vector3d(0.0, 0.0, 7.0), Vector3d::Zero(), 5000.0); } }; // namespace Physics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/RenderTests/RenderTestFem3DCorotational.cpp000066400000000000000000000144031277777236100273540ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. ///\file RenderTestFem3DCorotational.cpp render test for Fem3D with corotational elements #include #include "SurgSim/Blocks/TransferPhysicsToPointCloudBehavior.h" #include "SurgSim/Framework/BasicSceneElement.h" #include "SurgSim/Graphics/OsgPointCloudRepresentation.h" #include "SurgSim/Math/OdeState.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/Fem3DRepresentation.h" #include "SurgSim/Physics/Fem3DElementCorotationalTetrahedron.h" #include "SurgSim/Physics/RenderTests/RenderTest.h" using SurgSim::Blocks::TransferPhysicsToPointCloudBehavior; using SurgSim::Framework::BasicSceneElement; using SurgSim::Graphics::OsgPointCloudRepresentation; using SurgSim::Physics::Fem3DRepresentation; using SurgSim::Physics::FemElement; using SurgSim::Physics::Fem3DElementCorotationalTetrahedron; using SurgSim::Math::Vector3d; namespace { std::shared_ptr createTetrahedronFem3D(const std::string& name, const SurgSim::Math::RigidTransform3d& pose, SurgSim::Math::Vector4d color, SurgSim::Math::IntegrationScheme integrationScheme) { // Physics Representation std::shared_ptr physicsRepresentation; physicsRepresentation = std::make_shared(name + " Physics"); physicsRepresentation->setIntegrationScheme(integrationScheme); physicsRepresentation->setRayleighDampingMass(1e-2); physicsRepresentation->setRayleighDampingStiffness(1e-3); std::array vertices = {{ Vector3d(-0.5, -0.5, -0.5), Vector3d(0.5, -0.5, -0.5), Vector3d(-0.5, 0.5, -0.5), Vector3d(0.5, 0.5, -0.5), Vector3d(-0.5, -0.5, 0.5), Vector3d(0.5, -0.5, 0.5), Vector3d(-0.5, 0.5, 0.5), Vector3d(0.5, 0.5, 0.5) } }; // Cube decomposition into 5 tetrahedrons // https://www.math.ucdavis.edu/~deloera/CURRENT_INTERESTS/cube.html std::array< std::array, 5> tetrahedrons = {{ {{4, 7, 1, 2}}, // CCW (47)cross(41) . (42) > 0 {{4, 1, 7, 5}}, // CCW (41)cross(47) . (45) > 0 {{4, 2, 1, 0}}, // CCW (42)cross(41) . (40) > 0 {{4, 7, 2, 6}}, // CCW (47)cross(42) . (46) > 0 {{1, 2, 7, 3}} // CCW (12)cross(17) . (13) > 0 } }; std::array boundaryConditionsNodeIdx = {{0, 1}}; std::shared_ptr initialState = std::make_shared(); initialState->setNumDof(physicsRepresentation->getNumDofPerNode(), 8); for (size_t i = 0; i != vertices.size(); i++) { initialState->getPositions().segment(i * 3, 3) = vertices[i]; } for (auto index = boundaryConditionsNodeIdx.cbegin(); index != boundaryConditionsNodeIdx.cend(); ++index) { initialState->addBoundaryCondition(*index); } physicsRepresentation->setInitialState(initialState); for (auto tetrahedron = tetrahedrons.cbegin(); tetrahedron != tetrahedrons.cend(); ++tetrahedron) { std::shared_ptr element = std::make_shared(*tetrahedron); element->setMassDensity(8000.0); element->setPoissonRatio(0.45); element->setYoungModulus(1.0e6); physicsRepresentation->addFemElement(element); } // Graphics Representation std::shared_ptr graphicsRepresentation; graphicsRepresentation = std::make_shared(name + " Graphics object "); graphicsRepresentation->setLocalPose(pose); graphicsRepresentation->setColor(color); graphicsRepresentation->setPointSize(3.0f); graphicsRepresentation->setLocalActive(true); // Scene Element std::shared_ptr femSceneElement = std::make_shared(name); femSceneElement->addComponent(physicsRepresentation); femSceneElement->addComponent(graphicsRepresentation); auto physicsToGraphics = std::make_shared("Physics to Graphics deformable points"); physicsToGraphics->setSource(physicsRepresentation); physicsToGraphics->setTarget(graphicsRepresentation); femSceneElement->addComponent(physicsToGraphics); return femSceneElement; } }; // anonymous namespace namespace SurgSim { namespace Physics { TEST_F(RenderTests, VisualTestFem3DCorotational) { using SurgSim::Math::makeRigidTranslation; // Cube with corotational tetrahedron FemElement scene->addSceneElement(createTetrahedronFem3D("CorotationalTetrahedronElement Euler Explicit", makeRigidTranslation(Vector3d(-4.0, 1.0, -1.0)), SurgSim::Math::Vector4d(1, 0, 0, 1), SurgSim::Math::INTEGRATIONSCHEME_EULER_EXPLICIT)); scene->addSceneElement(createTetrahedronFem3D("CorotatinoalTetrahedronElement Modified Euler Explicit", makeRigidTranslation(Vector3d(-2.0, 1.0, -1.0)), SurgSim::Math::Vector4d(0.5, 0, 0, 1), SurgSim::Math::INTEGRATIONSCHEME_EULER_EXPLICIT_MODIFIED)); scene->addSceneElement(createTetrahedronFem3D("CorotatinoalTetrahedronElement Runge Kutta 4", makeRigidTranslation(Vector3d(0.0, 1.0, -1.0)), SurgSim::Math::Vector4d(0, 1, 0, 1), SurgSim::Math::INTEGRATIONSCHEME_RUNGE_KUTTA_4)); scene->addSceneElement(createTetrahedronFem3D("CorotatinoalTetrahedronElement Fem 3D Euler Implicit", makeRigidTranslation(Vector3d(2.0, 1.0, -1.0)), SurgSim::Math::Vector4d(0, 0, 1, 1), SurgSim::Math::INTEGRATIONSCHEME_EULER_IMPLICIT)); scene->addSceneElement(createTetrahedronFem3D("CorotatinoalTetrahedronElement Fem 3D Static", makeRigidTranslation(Vector3d(4.0, 1.0, -1.0)), SurgSim::Math::Vector4d(1, 1, 1, 1), SurgSim::Math::INTEGRATIONSCHEME_STATIC)); runTest(Vector3d(0.0, 0.0, 7.0), Vector3d::Zero(), 5000.0); } }; // namespace Physics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/RenderTests/RenderTestMassSprings.cpp000066400000000000000000000350561277777236100263570ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. ///\file RenderTestMassSprings.cpp render test for MassSprings #include #include "SurgSim/Blocks/MassSpring1DRepresentation.h" #include "SurgSim/Blocks/MassSpring2DRepresentation.h" #include "SurgSim/Blocks/MassSpring3DRepresentation.h" #include "SurgSim/Blocks/TransferPhysicsToPointCloudBehavior.h" #include "SurgSim/Framework/BasicSceneElement.h" #include "SurgSim/Graphics/OsgPointCloudRepresentation.h" #include "SurgSim/Math/OdeState.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/RenderTests/RenderTest.h" using SurgSim::Blocks::MassSpring1DRepresentation; using SurgSim::Blocks::MassSpring2DRepresentation; using SurgSim::Blocks::MassSpring3DRepresentation; using SurgSim::Blocks::TransferPhysicsToPointCloudBehavior; using SurgSim::Framework::BasicSceneElement; using SurgSim::Graphics::OsgPointCloudRepresentation; using SurgSim::Math::Vector3d; namespace { std::shared_ptr createMassSpring1D(const std::string& name, const SurgSim::Math::RigidTransform3d& gfxPose, SurgSim::Math::Vector4d color, SurgSim::Math::IntegrationScheme integrationScheme) { std::shared_ptr physicsRepresentation = std::make_shared(name + " Physics"); // In this test, the physics representations are not transformed, // only the graphics one will apply a transform std::vector nodeBoundaryConditions; nodeBoundaryConditions.push_back(0); // Adding in this boundary condition is not necessary for the physics of the system, but it allows us // to better control the condition number for the linear system that the OdeStaticSolver // generates. This results in a more stable and more accurate test. nodeBoundaryConditions.push_back(1); // MassSpring1D with a straight line would define springs only along 1 direction, which would result in // stiffness matrix of rank n/3. The Z axis can be constrained entirely and the simulation // be done in exclusively in 2D (X,Y), but for the 2nd dimension to be defined properly in the stiffness matrix // we need a shape that does not have any straight lines anywhere. This will ensure that the problem is // well defined in 2D. This problem only arise in static resolution (OdeSolverStatic). std::vector nodes; nodes.push_back(Vector3d(-0.5, 0.0, 0)); nodes.push_back(Vector3d(-0.3, -0.5, 0)); nodes.push_back(Vector3d(-0.1, -0.4, 0)); nodes.push_back(Vector3d(0.1, -0.5, 0)); nodes.push_back(Vector3d(0.3, 0.0, 0)); physicsRepresentation->init1D(nodes, nodeBoundaryConditions, 0.1, // total mass (in Kg) 5.0, // Stiffness stretching 0.5, // Damping stretching 3.0, // Stiffness bending 0.5); // Damping bending // MassSpring1D defines springs only on the XY plane, so the stiffness matrix will contains // rows and columns of 0 for all Z axis. Therefore we need to constrain all Z dof to entirely // define the problem (stiffness matrix invertible in static resolution (OdeSolverStatic)). for (size_t nodeId = 1; nodeId < nodes.size(); ++nodeId) { SurgSim::Math::OdeState* state = const_cast(physicsRepresentation->getInitialState().get()); state->addBoundaryCondition(nodeId, 2); } physicsRepresentation->setIntegrationScheme(integrationScheme); physicsRepresentation->setRayleighDampingMass(1e0); physicsRepresentation->setRayleighDampingStiffness(3e-2); std::shared_ptr massSpringElement = std::make_shared(name); massSpringElement->addComponent(physicsRepresentation); std::shared_ptr graphicsRepresentation = std::make_shared("Graphics object"); graphicsRepresentation->setLocalPose(gfxPose); graphicsRepresentation->setColor(color); graphicsRepresentation->setPointSize(3.0f); graphicsRepresentation->setLocalActive(true); massSpringElement->addComponent(graphicsRepresentation); auto physicsToGraphics = std::make_shared("Physics to Graphics deformable points"); physicsToGraphics->setSource(physicsRepresentation); physicsToGraphics->setTarget(graphicsRepresentation); massSpringElement->addComponent(physicsToGraphics); return massSpringElement; } std::shared_ptr createMassSpring2D(const std::string& name, const SurgSim::Math::RigidTransform3d& gfxPose, SurgSim::Math::Vector4d color, SurgSim::Math::IntegrationScheme integrationScheme) { std::shared_ptr physicsRepresentation = std::make_shared(name + " Physics"); // In this test, the physics representations are not transformed, // only the graphics one will apply a transform // The regular structure of the MassSpring2D (in X,Y plane) makes the stiffness matrix close to singular // (Z axis aside) even with 1 fixed node. We run this test with 2 fixed nodes to ensure that a static resolution // will be stable (OdeSolverStatic). std::vector nodeBoundaryConditions; nodeBoundaryConditions.push_back(0); nodeBoundaryConditions.push_back(1); std::array, 2> extremities = { { {{ Vector3d(-0.5, 0.5, 0), Vector3d(0.5, 0.5, 0) }}, {{ Vector3d(-0.5, -0.5, 0), Vector3d(0.5, -0.5, 0) }} } }; size_t numNodesPerDim[2] = {3, 3}; physicsRepresentation->init2D(extremities, numNodesPerDim, nodeBoundaryConditions, 0.1, // total mass (in Kg) 5.0, // Stiffness stretching 0.5, // Damping stretching 1.0, // Stiffness bending 0.5, // Damping bending 1.0, // Stiffness face diagonal 0.5); // Damping face diagonal // MassSpring2D defines springs only on the XY plane, so the stiffness matrix will contains // rows and columns of 0 for all Z axis. Therefore we need to constrain all Z dof to entirely // define the problem (stiffness matrix invertible in static resolution (OdeSolverStatic)). for (size_t nodeId = 2; nodeId < numNodesPerDim[0] * numNodesPerDim[1]; ++nodeId) { SurgSim::Math::OdeState* state = const_cast(physicsRepresentation->getInitialState().get()); state->addBoundaryCondition(nodeId, 2); } physicsRepresentation->setIntegrationScheme(integrationScheme); physicsRepresentation->setRayleighDampingMass(1e0); physicsRepresentation->setRayleighDampingStiffness(3e-2); std::shared_ptr massSpringElement = std::make_shared(name); massSpringElement->addComponent(physicsRepresentation); std::shared_ptr graphicsRepresentation = std::make_shared("Graphics object"); graphicsRepresentation->setLocalPose(gfxPose); graphicsRepresentation->setColor(color); graphicsRepresentation->setPointSize(3.0f); graphicsRepresentation->setLocalActive(true); massSpringElement->addComponent(graphicsRepresentation); auto physicsToGraphics = std::make_shared("Physics to Graphics deformable points"); physicsToGraphics->setSource(physicsRepresentation); physicsToGraphics->setTarget(graphicsRepresentation); massSpringElement->addComponent(physicsToGraphics); return massSpringElement; } std::shared_ptr createMassSpring3D(const std::string& name, const SurgSim::Math::RigidTransform3d& gfxPose, SurgSim::Math::Vector4d color, SurgSim::Math::IntegrationScheme integrationScheme) { std::shared_ptr physicsRepresentation = std::make_shared(name + " Physics"); // In this test, the physics representations are not transformed, // only the graphics one will apply a transform std::vector nodeBoundaryConditions; nodeBoundaryConditions.push_back(0); nodeBoundaryConditions.push_back(1); // Adding in these two boundary conditions is not necessary for the physics of the system, but it allows us // to better control the condition number for the linear system that the OdeStaticSolver // generates. This results in a more stable and more accurate test. nodeBoundaryConditions.push_back(2); nodeBoundaryConditions.push_back(3); std::array, 2>, 2> extremities = { { {{ {{ Vector3d(-0.5, 0.5, 0.5), Vector3d(0.5, 0.5, 0.5) }} , {{ Vector3d(-0.5, -0.5, 0.5), Vector3d(0.5, -0.5, 0.5) }} } } , {{ {{ Vector3d(-0.5, 0.5, -0.5), Vector3d(0.5, 0.5, -0.5) }} , {{ Vector3d(-0.5, -0.5, -0.5), Vector3d(0.5, -0.5, -0.5) }} } }, } }; size_t numNodesPerDim[3] = {3, 3, 3}; physicsRepresentation->init3D(extremities, numNodesPerDim, nodeBoundaryConditions, 0.1, // total mass (in Kg) 5.0, // Stiffness stretching 0.5, // Damping stretching 1.0, // Stiffness bending 0.5, // Damping bending 1.0, // Stiffness face diagonal 0.5, // Damping face diagonal 1.0, // Stiffness volume diagonal 0.5); // Damping volume diagonal // MassSpring 3D defines springs in all directions (X, Y, Z, XY, XZ, YZ, XYZ) so the stiffness matrix // is entirely defined (no rows or columns of 0). // Therefore, setting up one node as boundary condition is sufficient to make the static problem invertible. physicsRepresentation->setIntegrationScheme(integrationScheme); physicsRepresentation->setRayleighDampingMass(1e0); physicsRepresentation->setRayleighDampingStiffness(3e-2); std::shared_ptr massSpringElement = std::make_shared(name); massSpringElement->addComponent(physicsRepresentation); std::shared_ptr graphicsRepresentation = std::make_shared("Graphics object"); graphicsRepresentation->setLocalPose(gfxPose); graphicsRepresentation->setColor(color); graphicsRepresentation->setPointSize(3.0f); graphicsRepresentation->setLocalActive(true); massSpringElement->addComponent(graphicsRepresentation); auto physicsToGraphics = std::make_shared("Physics to Graphics deformable points"); physicsToGraphics->setSource(physicsRepresentation); physicsToGraphics->setTarget(graphicsRepresentation); massSpringElement->addComponent(physicsToGraphics); return massSpringElement; } }; // anonymous namespace namespace SurgSim { namespace Physics { TEST_F(RenderTests, VisualTestMassSprings) { using SurgSim::Math::makeRigidTranslation; using SurgSim::Math::Vector4d; // MassSpring1D { scene->addSceneElement(createMassSpring1D("MassSpring 1D Euler Explicit", makeRigidTranslation(Vector3d(-3.0, 3.0, 0.0)), Vector4d(1, 0, 0, 1), SurgSim::Math::INTEGRATIONSCHEME_EULER_EXPLICIT)); scene->addSceneElement(createMassSpring1D("MassSpring 1D Modified Euler Explicit", makeRigidTranslation(Vector3d(-1.25, 3.0, 0.0)), Vector4d(0.5, 0, 0, 1), SurgSim::Math::INTEGRATIONSCHEME_EULER_EXPLICIT_MODIFIED)); scene->addSceneElement(createMassSpring1D("MassSpring 1D Runge Kutta 4", makeRigidTranslation(Vector3d(0.5, 3.0, 0.0)), Vector4d(0, 1, 0, 1), SurgSim::Math::INTEGRATIONSCHEME_RUNGE_KUTTA_4)); scene->addSceneElement(createMassSpring1D("MassSpring 1D Euler Implicit", makeRigidTranslation(Vector3d(2.25, 3.0, 0.0)), Vector4d(0, 0, 1, 1), SurgSim::Math::INTEGRATIONSCHEME_EULER_IMPLICIT)); scene->addSceneElement(createMassSpring1D("MassSpring 1D Static", makeRigidTranslation(Vector3d(4.0, 3.0, 0.0)), Vector4d(1, 1, 1, 1), SurgSim::Math::INTEGRATIONSCHEME_STATIC)); } // MassSpring2D { scene->addSceneElement(createMassSpring2D("MassSpring 2D Euler Explicit", makeRigidTranslation(Vector3d(-3.0, 0.5, 0.0)), Vector4d(1, 0, 0, 1), SurgSim::Math::INTEGRATIONSCHEME_EULER_EXPLICIT)); scene->addSceneElement(createMassSpring2D("MassSpring 2D Modified Euler Explicit", makeRigidTranslation(Vector3d(-1.25, 0.5, 0.0)), Vector4d(0.5, 0, 0, 1), SurgSim::Math::INTEGRATIONSCHEME_EULER_EXPLICIT_MODIFIED)); scene->addSceneElement(createMassSpring2D("MassSpring 2D Runge Kutta 4", makeRigidTranslation(Vector3d(0.5, 0.5, 0.0)), Vector4d(0, 1, 0, 1), SurgSim::Math::INTEGRATIONSCHEME_RUNGE_KUTTA_4)); scene->addSceneElement(createMassSpring2D("MassSpring 2D Euler Implicit", makeRigidTranslation(Vector3d(2.25, 0.5, 0.0)), Vector4d(0, 0, 1, 1), SurgSim::Math::INTEGRATIONSCHEME_EULER_IMPLICIT)); scene->addSceneElement(createMassSpring2D("MassSpring 2D Static", makeRigidTranslation(Vector3d(4.0, 0.5, 0.0)), Vector4d(1, 1, 1, 1), SurgSim::Math::INTEGRATIONSCHEME_STATIC)); } // MassSpring3D { scene->addSceneElement(createMassSpring3D("MassSpring 3D Euler Explicit", makeRigidTranslation(Vector3d(-3.0, -1.5, 0.0)), Vector4d(1, 0, 0, 1), SurgSim::Math::INTEGRATIONSCHEME_EULER_EXPLICIT)); scene->addSceneElement(createMassSpring3D("MassSpring 3D Modified Euler Explicit", makeRigidTranslation(Vector3d(-1.25, -1.5, 0.0)), Vector4d(0.5, 0, 0, 1), SurgSim::Math::INTEGRATIONSCHEME_EULER_EXPLICIT_MODIFIED)); scene->addSceneElement(createMassSpring3D("MassSpring 3D Runge Kutta 4", makeRigidTranslation(Vector3d(0.5, -1.5, 0.0)), Vector4d(0, 1, 0, 1), SurgSim::Math::INTEGRATIONSCHEME_RUNGE_KUTTA_4)); scene->addSceneElement(createMassSpring3D("MassSpring 3D Euler Implicit", makeRigidTranslation(Vector3d(2.25, -1.5, 0.0)), Vector4d(0, 0, 1, 1), SurgSim::Math::INTEGRATIONSCHEME_EULER_IMPLICIT)); scene->addSceneElement(createMassSpring3D("MassSpring 3D Static", makeRigidTranslation(Vector3d(4.0, -1.5, 0.0)), Vector4d(1, 1, 1, 1), SurgSim::Math::INTEGRATIONSCHEME_STATIC)); } runTest(Vector3d(0.0, 0.0, 8.5), Vector3d::Zero(), 5000.0); } }; // namespace Physics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/RenderTests/RenderTestRigidBodies.cpp000066400000000000000000000461561277777236100262750ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. ///\file RenderTestRigidBodies.cpp render test for RigidRepresentation #include #include "SurgSim/DataStructures/TriangleMesh.h" #include "SurgSim/Framework/ApplicationData.h" #include "SurgSim/Framework/BasicSceneElement.h" #include "SurgSim/Graphics/Mesh.h" #include "SurgSim/Graphics/OsgBoxRepresentation.h" #include "SurgSim/Graphics/OsgMeshRepresentation.h" #include "SurgSim/Graphics/OsgPlaneRepresentation.h" #include "SurgSim/Graphics/OsgSphereRepresentation.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Shapes.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/FixedRepresentation.h" #include "SurgSim/Physics/RigidCollisionRepresentation.h" #include "SurgSim/Physics/RigidRepresentation.h" #include "SurgSim/Physics/RenderTests/RenderTest.h" using SurgSim::Framework::BasicSceneElement; using SurgSim::Graphics::OsgBoxRepresentation; using SurgSim::Graphics::OsgMeshRepresentation; using SurgSim::Graphics::OsgPlaneRepresentation; using SurgSim::Graphics::OsgSphereRepresentation; using SurgSim::Math::BoxShape; using SurgSim::Math::MeshShape; using SurgSim::Math::PlaneShape; using SurgSim::Math::SphereShape; using SurgSim::Math::SurfaceMeshShape; using SurgSim::Math::Vector3d; using SurgSim::Physics::FixedRepresentation; using SurgSim::Physics::RigidCollisionRepresentation; using SurgSim::Physics::RigidRepresentation; namespace { std::shared_ptr createRigidSphereSceneElement(const std::string& name, double radius) { // Physics representation std::shared_ptr physicsRepresentation = std::make_shared("Physics"); std::shared_ptr shape = std::make_shared(radius); physicsRepresentation->setShape(shape); physicsRepresentation->setDensity(750.0); // Average mass density of Oak Wood physicsRepresentation->setLinearDamping(1e-2); physicsRepresentation->setAngularDamping(1e-4); // Collision representation std::shared_ptr collisionRepresentation = std::make_shared("Collision"); physicsRepresentation->setCollisionRepresentation(collisionRepresentation); // Graphic model std::shared_ptr osgRepresentation = std::make_shared("OsgRepresentation"); osgRepresentation->setRadius(radius); std::shared_ptr sceneElement = std::make_shared(name); sceneElement->addComponent(osgRepresentation); sceneElement->addComponent(collisionRepresentation); sceneElement->addComponent(physicsRepresentation); return sceneElement; } std::shared_ptr createRigidBoxSceneElement(const std::string& name, Vector3d size) { // Physics representation std::shared_ptr physicsRepresentation = std::make_shared("Physics"); std::shared_ptr shape = std::make_shared(size[0], size[1], size[2]); physicsRepresentation->setShape(shape); physicsRepresentation->setDensity(750.0); // Average mass density of oak wood physicsRepresentation->setLinearDamping(1e-2); physicsRepresentation->setAngularDamping(1e-4); // Collision representation std::shared_ptr collisionRepresentation = std::make_shared("Collision"); physicsRepresentation->setCollisionRepresentation(collisionRepresentation); // Graphic model std::shared_ptr osgRepresentation = std::make_shared("OsgRepresentation"); osgRepresentation->setSize(size); std::shared_ptr sceneElement = std::make_shared(name); sceneElement->addComponent(osgRepresentation); sceneElement->addComponent(collisionRepresentation); sceneElement->addComponent(physicsRepresentation); return sceneElement; } std::shared_ptr createFixedPlaneSceneElement(const std::string& name) { // Physics representation std::shared_ptr physicsRepresentation = std::make_shared("Physics"); std::shared_ptr shape = std::make_shared(); physicsRepresentation->setShape(shape); // Collision representation std::shared_ptr collisionRepresentation = std::make_shared("Collision"); physicsRepresentation->setCollisionRepresentation(collisionRepresentation); // Graphic model std::shared_ptr osgRepresentation = std::make_shared("OsgRepresentation"); std::shared_ptr sceneElement = std::make_shared(name); sceneElement->addComponent(osgRepresentation); sceneElement->addComponent(collisionRepresentation); sceneElement->addComponent(physicsRepresentation); return sceneElement; } std::shared_ptr createRigidMeshSceneElement( const std::string& name, std::string plyFilename, double scale = 1.0) { auto mesh = std::make_shared(); mesh->load(plyFilename); for (auto& vertex : mesh->getVertices()) { vertex.position *= scale; } // Physics representation std::shared_ptr physicsRepresentation = std::make_shared("Physics"); physicsRepresentation->setShape(mesh); physicsRepresentation->setDensity(750.0); // Average mass density of oak wood physicsRepresentation->setLinearDamping(1e-2); physicsRepresentation->setAngularDamping(1e-4); // Collision representation std::shared_ptr collisionRepresentation = std::make_shared("Collision"); physicsRepresentation->setCollisionRepresentation(collisionRepresentation); // Graphic representation of the physics model std::shared_ptr osgRepresentation = std::make_shared("OsgRepresentation"); osgRepresentation->setShape(mesh); osgRepresentation->setDrawAsWireFrame(true); std::shared_ptr sceneElement = std::make_shared(name); sceneElement->addComponent(osgRepresentation); sceneElement->addComponent(collisionRepresentation); sceneElement->addComponent(physicsRepresentation); return sceneElement; } std::shared_ptr createFixedSurfaceMeshSceneElement( const std::string& name, std::string plyFilename, double scale = 1.0) { auto mesh = std::make_shared(); mesh->load(plyFilename); for (auto& vertex : mesh->getVertices()) { vertex.position *= scale; } // Physics representation std::shared_ptr physicsRepresentation = std::make_shared("Physics"); physicsRepresentation->setShape(mesh); physicsRepresentation->setDensity(750.0); // Average mass density of oak wood // Collision representation std::shared_ptr collisionRepresentation = std::make_shared("Collision"); physicsRepresentation->setCollisionRepresentation(collisionRepresentation); // Graphic representation of the physics model std::shared_ptr osgRepresentation = std::make_shared("OsgRepresentation"); osgRepresentation->setShape(mesh); osgRepresentation->setDrawAsWireFrame(true); std::shared_ptr sceneElement = std::make_shared(name); sceneElement->addComponent(osgRepresentation); sceneElement->addComponent(collisionRepresentation); sceneElement->addComponent(physicsRepresentation); return sceneElement; } }; // anonymous namespace namespace SurgSim { namespace Physics { TEST_F(RenderTests, VisualTestFallingRigidBodies) { using SurgSim::Math::makeRigidTranslation; // Mesh-base objects std::shared_ptr boxMesh = createRigidMeshSceneElement("boxMesh1", "Geometry/box.ply", 1.0); scene->addSceneElement(boxMesh); boxMesh->setPose(makeRigidTranslation(Vector3d(-0.35, 0.3, 0.0))); boxMesh = createRigidMeshSceneElement("boxMesh2", "Geometry/box.ply", 0.5); scene->addSceneElement(boxMesh); boxMesh->setPose(makeRigidTranslation(Vector3d(-0.25, 0.3, 0.0))); std::shared_ptr sphereMesh = createRigidMeshSceneElement("sphereMesh1", "Geometry/sphere.ply", 1.0); scene->addSceneElement(sphereMesh); sphereMesh->setPose(makeRigidTranslation(Vector3d(-0.15, 0.3, 0.0))); sphereMesh = createRigidMeshSceneElement("sphereMesh2", "Geometry/sphere.ply", 0.5); scene->addSceneElement(sphereMesh); sphereMesh->setPose(makeRigidTranslation(Vector3d(-0.05, 0.3, 0.0))); // Shape-base objects std::shared_ptr sphereShape = createRigidSphereSceneElement("sphereShape1", 0.05 * 0.5); scene->addSceneElement(sphereShape); sphereShape->setPose(makeRigidTranslation(Vector3d(0.05, 0.3, 0.0))); sphereShape = createRigidSphereSceneElement("sphereShape2", 0.05 * 1.0); scene->addSceneElement(sphereShape); sphereShape->setPose(makeRigidTranslation(Vector3d(0.15, 0.3, 0.0))); std::shared_ptr boxShape = createRigidBoxSceneElement("boxShape1", Vector3d(0.1, 0.1, 0.1) * 0.5); scene->addSceneElement(boxShape); boxShape->setPose(makeRigidTranslation(Vector3d(0.25, 0.3, 0.0))); boxShape = createRigidBoxSceneElement("boxShape2", Vector3d(0.1, 0.1, 0.1) * 1.0); scene->addSceneElement(boxShape); boxShape->setPose(makeRigidTranslation(Vector3d(0.35, 0.3, 0.0))); runTest(Vector3d(0.0, 0.0, 1.0), Vector3d::Zero(), 2500.0); } TEST_F(RenderTests, VisualTestRigidBodiesSlidingOnPlanes) { using SurgSim::Math::makeRigidTransform; using SurgSim::Math::makeRigidTranslation; Eigen::AngleAxisd aaTiltForward(0.15, Vector3d(1.0, 0.0, 0.0)); Eigen::AngleAxisd aaTiltBackward(-0.15, Vector3d(1.0, 0.0, 0.0)); // Mesh-base objects std::shared_ptr boxMesh = createRigidMeshSceneElement("boxMesh", "Geometry/box.ply"); scene->addSceneElement(boxMesh); boxMesh->setPose(makeRigidTranslation(Vector3d(-0.3, 0.3, 0.0))); std::shared_ptr sphereMesh = createRigidMeshSceneElement("sphereMesh", "Geometry/sphere.ply"); scene->addSceneElement(sphereMesh); sphereMesh->setPose(makeRigidTranslation(Vector3d(-0.15, 0.3, 0.0))); // Shape-base objects std::shared_ptr sphereShape = createRigidSphereSceneElement("sphereShape", 0.05); scene->addSceneElement(sphereShape); sphereShape->setPose(makeRigidTranslation(Vector3d(0.15, 0.3, 0.0))); std::shared_ptr boxShape = createRigidBoxSceneElement("boxShape", Vector3d(0.1, 0.1, 0.1)); scene->addSceneElement(boxShape); boxShape->setPose(makeRigidTranslation(Vector3d(0.3, 0.3, 0.0))); // Floors on which the objects are falling (both tilted) std::shared_ptr floor1 = createFixedPlaneSceneElement("floor1"); scene->addSceneElement(floor1); floor1->setPose(makeRigidTransform(SurgSim::Math::Quaterniond(aaTiltForward), Vector3d(0.0, -0.2, -0.1))); std::shared_ptr floor2 = createFixedPlaneSceneElement("floor2"); scene->addSceneElement(floor2); floor2->setPose(makeRigidTransform(SurgSim::Math::Quaterniond(aaTiltBackward), Vector3d(0.0, -0.2, -0.1))); runTest(Vector3d(0.0, 0.0, 1.0), Vector3d::Zero(), 13000.0); } TEST_F(RenderTests, VisualTestRigidBodiesStacking) { using SurgSim::Math::makeRigidTransform; using SurgSim::Math::makeRigidTranslation; const size_t numBodiesStacked = 3; // Mesh-base objects for (size_t i = 0; i < numBodiesStacked; ++i) { std::stringstream ss; ss << "boxMesh" << i; double scale = 1.0 - static_cast(i) / static_cast(numBodiesStacked); std::shared_ptr boxMesh = createRigidMeshSceneElement(ss.str(), "Geometry/box.ply", scale); scene->addSceneElement(boxMesh); Eigen::AngleAxisd aa(0.15 * i, Vector3d(0.0, 1.0, 0.0)); boxMesh->setPose(makeRigidTransform(SurgSim::Math::Quaterniond(aa), Vector3d(-0.3, 0.3 + 0.15 * i, 0.0))); } for (size_t i = 0; i < numBodiesStacked; ++i) { std::stringstream ss; ss << "sphereMesh" << i; double scale = 1.0 - static_cast(i) / static_cast(numBodiesStacked); std::shared_ptr sphereMesh = createRigidMeshSceneElement(ss.str(), "Geometry/sphere.ply", scale); scene->addSceneElement(sphereMesh); sphereMesh->setPose(makeRigidTranslation(Vector3d(-0.15, 0.3 + 0.15 * i, 0.0))); } // Shape-base objects for (size_t i = 0; i < numBodiesStacked; ++i) { std::stringstream ss; ss << "sphereShape" << i; double scale = 1.0 - static_cast(i) / static_cast(numBodiesStacked); std::shared_ptr sphereShape = createRigidSphereSceneElement(ss.str(), 0.05 * scale); scene->addSceneElement(sphereShape); sphereShape->setPose(makeRigidTranslation(Vector3d(0.15, 0.3 + 0.15 * i, 0.0))); } for (size_t i = 0; i < numBodiesStacked; ++i) { std::stringstream ss; ss << "boxShape" << i; double scale = 1.0 - static_cast(i) / static_cast(numBodiesStacked); std::shared_ptr boxShape = createRigidBoxSceneElement(ss.str(), Vector3d::Ones() * 0.1 * scale); scene->addSceneElement(boxShape); boxShape->setPose(makeRigidTranslation(Vector3d(0.3, 0.3 + 0.15 * i, 0.0))); } // Floor on which the objects are falling std::shared_ptr floor = createFixedPlaneSceneElement("floor"); scene->addSceneElement(floor); floor->setPose(makeRigidTranslation(Vector3d(0.0, -0.2, 0.0))); runTest(Vector3d(0.0, 0.0, 1.0), Vector3d::Zero(), 10000.0); } TEST_F(RenderTests, VisualTestRigidBodiesStackingReversed) { using SurgSim::Math::makeRigidTransform; using SurgSim::Math::makeRigidTranslation; const size_t numBodiesStacked = 3; // Mesh-base objects for (size_t i = 0; i < numBodiesStacked; ++i) { std::stringstream ss; ss << "boxMesh" << i; double scale = 1.0 / static_cast(numBodiesStacked) + static_cast(i) / static_cast(numBodiesStacked); std::shared_ptr boxMesh = createRigidMeshSceneElement(ss.str(), "Geometry/box.ply", scale); scene->addSceneElement(boxMesh); Eigen::AngleAxisd aa(0.15 * i, Vector3d(0.0, 1.0, 0.0)); boxMesh->setPose(makeRigidTransform(SurgSim::Math::Quaterniond(aa), Vector3d(-0.3, 0.3 + 0.15 * i, 0.0))); } for (size_t i = 0; i < numBodiesStacked; ++i) { std::stringstream ss; ss << "sphereMesh" << i; double scale = 1.0 / static_cast(numBodiesStacked) + static_cast(i) / static_cast(numBodiesStacked); std::shared_ptr sphereMesh = createRigidMeshSceneElement(ss.str(), "Geometry/sphere.ply", scale); scene->addSceneElement(sphereMesh); sphereMesh->setPose(makeRigidTranslation(Vector3d(-0.15, 0.3 + 0.15 * i, 0.0))); } // Shape-base objects for (size_t i = 0; i < numBodiesStacked; ++i) { std::stringstream ss; ss << "sphereShape" << i; double scale = 1.0 / static_cast(numBodiesStacked) + static_cast(i) / static_cast(numBodiesStacked); std::shared_ptr sphereShape = createRigidSphereSceneElement(ss.str(), 0.05 * scale); scene->addSceneElement(sphereShape); sphereShape->setPose(makeRigidTranslation(Vector3d(0.15, 0.3 + 0.15 * i, 0.0))); } for (size_t i = 0; i < numBodiesStacked; ++i) { std::stringstream ss; ss << "boxShape" << i; double scale = 1.0 / static_cast(numBodiesStacked) + static_cast(i) / static_cast(numBodiesStacked); std::shared_ptr boxShape = createRigidBoxSceneElement(ss.str(), Vector3d::Ones() * 0.1 * scale); scene->addSceneElement(boxShape); boxShape->setPose(makeRigidTranslation(Vector3d(0.3, 0.3 + 0.15 * i, 0.0))); } // Floor on which the objects are falling std::shared_ptr floor = createFixedPlaneSceneElement("floor"); scene->addSceneElement(floor); floor->setPose(makeRigidTranslation(Vector3d(0.0, -0.2, 0.0))); runTest(Vector3d(0.0, 0.0, 1.0), Vector3d::Zero(), 10000.0); } TEST_F(RenderTests, VisualTestFallingRigidShapesOnPlane) { using SurgSim::Math::makeRigidTransform; using SurgSim::Math::makeRigidTranslation; const size_t numSphere = 10; const double radius = 0.05; const double distanceBetweenSphere = radius / 2.0; // Shape-base objects for (size_t sphere = 0; sphere < numSphere; ++sphere) { std::stringstream ss; ss << "sphereShape " << sphere; std::shared_ptr sphereShape = createRigidSphereSceneElement(ss.str(), radius); scene->addSceneElement(sphereShape); sphereShape->setPose(makeRigidTranslation(Vector3d(0.0, (2.0 * radius + distanceBetweenSphere) * sphere, 0.0))); } // Floor on which the objects are falling std::shared_ptr floor = createFixedPlaneSceneElement("floor"); scene->addSceneElement(floor); floor->setPose(makeRigidTranslation(Vector3d(0.0, -radius - distanceBetweenSphere, 0.0))); runTest(Vector3d(0.0, 0.0, 1.0), Vector3d::Zero(), 10000.0); } TEST_F(RenderTests, VisualTestFallingRigidMeshesOnPlane) { using SurgSim::Math::makeRigidTransform; using SurgSim::Math::makeRigidTranslation; const size_t numSphere = 10; const double radius = 0.05; const double distanceBetweenSphere = radius / 2.0; double xAxis[2] = {-0.26, 0.26}; double xAngle[2] = {-M_PI_2, M_PI_2}; for (int i = 0; i < 2; ++i) { // Mesh-base objects for (size_t sphere = 0; sphere < numSphere; ++sphere) { std::stringstream ss; ss << "sphereShape " << sphere; std::shared_ptr sphereShape = createRigidMeshSceneElement(ss.str(), "Geometry/sphere.ply", 10.0 * radius); scene->addSceneElement(sphereShape); sphereShape->setPose( makeRigidTranslation(Vector3d(xAxis[i], (2.0 * radius + distanceBetweenSphere) * sphere, 0.0))); } // Floor on which the objects are falling { std::shared_ptr planeMesh = createFixedSurfaceMeshSceneElement("floor", "Geometry/plane.ply", 0.25); scene->addSceneElement(planeMesh); Eigen::AngleAxisd aa(xAngle[i], Vector3d(1.0, 0.0, 0.0)); planeMesh->setPose( makeRigidTransform(SurgSim::Math::Quaterniond(aa), Vector3d(xAxis[i], -radius - distanceBetweenSphere, 0.0))); } } runTest(Vector3d(0.0, 0.0, 1.0), Vector3d::Zero(), 10000.0); } }; // namespace Physics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/RenderTests/config.txt.in000066400000000000000000000001201277777236100237750ustar00rootroot00000000000000${CMAKE_CURRENT_SOURCE_DIR}/Data/ ${PROJECT_BINARY_DIR}/SurgSim/Testing/Data/ opensurgsim-0.7.0/SurgSim/Physics/Representation.cpp000066400000000000000000000076021277777236100226420ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Collision/Representation.h" #include "SurgSim/DataStructures/Location.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Framework/PoseComponent.h" #include "SurgSim/Framework/SceneElement.h" #include "SurgSim/Physics/Constraint.h" #include "SurgSim/Physics/ConstraintData.h" #include "SurgSim/Physics/ConstraintImplementation.h" #include "SurgSim/Physics/Localization.h" #include "SurgSim/Physics/Representation.h" namespace SurgSim { namespace Physics { Representation::Representation(const std::string& name) : SurgSim::Framework::Representation(name), m_collisionRepresentation(nullptr), m_gravity(0.0, -9.81, 0.0), m_numDof(0), m_isGravityEnabled(true), m_isDrivingSceneElementPose(true), m_logger(SurgSim::Framework::Logger::getLogger("Physics/Representation")) { SURGSIM_ADD_SERIALIZABLE_PROPERTY(Representation, size_t, NumDof, getNumDof, setNumDof); SURGSIM_ADD_SERIALIZABLE_PROPERTY(Representation, bool, IsGravityEnabled, isGravityEnabled, setIsGravityEnabled); SURGSIM_ADD_SERIALIZABLE_PROPERTY(Representation, bool, IsDrivingSceneElementPose, isDrivingSceneElementPose, setIsDrivingSceneElementPose); } Representation::~Representation() { } void Representation::resetState() { } size_t Representation::getNumDof() const { return m_numDof; } void Representation::setIsGravityEnabled(bool isGravityEnabled) { m_isGravityEnabled = isGravityEnabled; } bool Representation::isGravityEnabled() const { return m_isGravityEnabled; } void Representation::setIsDrivingSceneElementPose(bool isDrivingSceneElementPose) { m_isDrivingSceneElementPose = isDrivingSceneElementPose; } bool Representation::isDrivingSceneElementPose() { return m_isDrivingSceneElementPose; } void Representation::beforeUpdate(double dt) { } void Representation::update(double dt) { } void Representation::afterUpdate(double dt) { } std::shared_ptr Representation::createLocalization(const SurgSim::DataStructures::Location& location) { return nullptr; } void Representation::applyCorrection(double dt, const Eigen::VectorBlock& deltaVelocity) { } void Representation::setNumDof(size_t numDof) { m_numDof = numDof; } const SurgSim::Math::Vector3d& Representation::getGravity() const { return m_gravity; } std::shared_ptr Representation::getCollisionRepresentation() const { return m_collisionRepresentation; } void Representation::setCollisionRepresentation(std::shared_ptr val) { m_collisionRepresentation = val; } std::shared_ptr Representation::getConstraintImplementation( SurgSim::Physics::ConstraintType type) { auto implementation = ConstraintImplementation::getFactory().getImplementation(typeid(*this), type); if (implementation == nullptr) { SURGSIM_LOG_SEVERE(m_logger) << getClassName() << ": Does not support constraint type (" << type << ")."; } return implementation; } void Representation::driveSceneElementPose(const SurgSim::Math::RigidTransform3d& pose) { if (isDrivingSceneElementPose()) { std::shared_ptr sceneElement = getSceneElement(); if (sceneElement != nullptr) { sceneElement->setPose(pose); } } } }; // namespace Physics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/Representation.h000066400000000000000000000142031277777236100223020ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_REPRESENTATION_H #define SURGSIM_PHYSICS_REPRESENTATION_H #include #include #include "SurgSim/Framework/Representation.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/ConstraintType.h" namespace SurgSim { namespace DataStructures { struct Location; } namespace Framework { class Logger; } namespace Collision { class Representation; } namespace Physics { class Constraint; class ConstraintData; class ConstraintImplementation; class Localization; /// The Representation class defines the base class for all physics objects class Representation : public SurgSim::Framework::Representation { public: /// Constructor /// \param name The representation's name explicit Representation(const std::string& name); /// Destructor virtual ~Representation(); /// Reset the representation to its initial/default state virtual void resetState(); /// Query the object number of degrees of freedom /// \return The number of degrees of freedom size_t getNumDof() const; /// Set the gravity enable flag /// \param isGravityEnabled True if gravity enabled, false if not. void setIsGravityEnabled(bool isGravityEnabled); /// Get the gravity enable flag /// \return true if gravity enabled, false if not. bool isGravityEnabled() const; /// Set whether this Representation is controlling the pose of the SceneElement /// that it is part of. /// \param isDrivingSceneElementPose true if this Representation is driving the pose of the SceneElement void setIsDrivingSceneElementPose(bool isDrivingSceneElementPose); /// Query if this Representation is controlling the pose of the SceneElement /// that it is part of. /// \return true if this Representation is controlling the pose of the SceneElement bool isDrivingSceneElementPose(); /// Preprocessing done before the update call /// This needs to be called from the outside usually from a Computation /// \param dt The time step (in seconds) virtual void beforeUpdate(double dt); /// Update the representation state to the current time step /// \param dt The time step (in seconds) virtual void update(double dt); /// Postprocessing done after the update call /// This needs to be called from the outside usually from a Computation /// \param dt The time step (in seconds) virtual void afterUpdate(double dt); /// Computes a localized coordinate w.r.t this representation, given a Location object. /// \param location A location in 3d space. /// \return A localization object for the given location. virtual std::shared_ptr createLocalization(const SurgSim::DataStructures::Location& location); /// Update the Representation's current position and velocity using a time interval, dt, and change in velocity, /// deltaVelocity. /// /// This function typically is called in the physics pipeline (PhysicsManager::doUpdate) after solving the equations /// that enforce constraints when collisions occur. Specifically it is called in the PushResults::doUpdate step. /// \param dt The time step /// \param deltaVelocity The block of a vector containing the correction to be applied to the velocity virtual void applyCorrection(double dt, const Eigen::VectorBlock& deltaVelocity); /// \return the collision representation for this physics representation. std::shared_ptr getCollisionRepresentation() const; /// Set the collision representation for this physics representation, when the collision object /// is involved in a collision, the collision should be resolved inside the dynamics calculation. /// \param representation The appropriate collision representation for this object. virtual void setCollisionRepresentation(std::shared_ptr representation); /// Get a constraint implementation of the given type for this representation. /// \param type The type of constraint. /// \return A contact constraint implementation or nullptr. std::shared_ptr getConstraintImplementation(SurgSim::Physics::ConstraintType type); protected: /// Set the number of degrees of freedom /// \param numDof The number of degrees of freedom /// \note protected so that nobody can change the number of DOF /// \note except daughter classes void setNumDof(size_t numDof); /// Get the gravity used by this Representation /// \return The gravity vector const SurgSim::Math::Vector3d& getGravity() const; /// This entity's collision representation, these are usually very specific to the physics representation std::shared_ptr m_collisionRepresentation; /// This conditionally updates that pose for the scenelement to the given pose /// The update gets exectuded if the representation actually has sceneelement and isDrivingScenElement() is true /// \param pose New pose for the SceneElement void driveSceneElementPose(const SurgSim::Math::RigidTransform3d& pose); private: /// NO copy constructor Representation(const Representation&); /// NO assignment operator Representation& operator =(const Representation&); /// Gravity vector const SurgSim::Math::Vector3d m_gravity; /// Number of degrees of freedom for this representation size_t m_numDof; /// Gravity enabled flag bool m_isGravityEnabled; /// Is this representation driving the sceneElement pose bool m_isDrivingSceneElementPose; /// Logger for this class. std::shared_ptr m_logger; }; }; // namespace Physics }; // namespace SurgSim #endif // SURGSIM_PHYSICS_REPRESENTATION_H opensurgsim-0.7.0/SurgSim/Physics/RigidCollisionRepresentation.cpp000066400000000000000000000113631277777236100254740ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Physics/RigidCollisionRepresentation.h" #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Framework/SceneElement.h" #include "SurgSim/Math/MathConvert.h" #include "SurgSim/Math/MeshShape.h" #include "SurgSim/Math/Shape.h" #include "SurgSim/Physics/RigidRepresentationBase.h" namespace SurgSim { namespace Physics { SURGSIM_REGISTER(SurgSim::Framework::Component, SurgSim::Physics::RigidCollisionRepresentation, RigidCollisionRepresentation); RigidCollisionRepresentation::RigidCollisionRepresentation(const std::string& name): Representation(name) { SURGSIM_ADD_SERIALIZABLE_PROPERTY(RigidCollisionRepresentation, std::shared_ptr, Shape, getShape, setShape); } RigidCollisionRepresentation::~RigidCollisionRepresentation() { } void RigidCollisionRepresentation::setRigidRepresentation( std::shared_ptr representation) { m_physicsRepresentation = representation; } std::shared_ptr RigidCollisionRepresentation::getRigidRepresentation() { return m_physicsRepresentation.lock(); } int RigidCollisionRepresentation::getShapeType() const { return getShape()->getType(); } const std::shared_ptr RigidCollisionRepresentation::getShape() const { if (m_shape != nullptr) { return m_shape; } else { auto physicsRepresentation = m_physicsRepresentation.lock(); SURGSIM_ASSERT(physicsRepresentation != nullptr) << "PhysicsRepresentation went out of scope for Collision Representation " << getName(); return physicsRepresentation->getShape(); } } void RigidCollisionRepresentation::setShape(std::shared_ptr shape) { m_shape = shape; } SurgSim::Math::RigidTransform3d RigidCollisionRepresentation::getPose() const { auto physicsRepresentation = m_physicsRepresentation.lock(); SURGSIM_ASSERT(physicsRepresentation != nullptr) << "PhysicsRepresentation went out of scope for Collision Representation " << getName(); const SurgSim::Math::RigidTransform3d& physicsPose = physicsRepresentation->getCurrentState().getPose(); return physicsPose * physicsRepresentation->getLocalPose().inverse() * getLocalPose(); } void RigidCollisionRepresentation::updateShapeData() { // All we want to do is to transform the shape into the current pose getPosedShape(); } void RigidCollisionRepresentation::updateDcdData() { // HS-2-Mar-2016 // #todo need to trigger the aabb tree build/update here } void RigidCollisionRepresentation::updateCcdData(double timeOfImpact) { using Math::PosedShape; using Math::PosedShapeMotion; using Math::Shape; Math::RigidTransform3d previousPose; Math::RigidTransform3d currentPose; { auto physicsRepresentation = m_physicsRepresentation.lock(); SURGSIM_ASSERT(physicsRepresentation != nullptr) << "PhysicsRepresentation went out of scope for Collision Representation " << getName(); const Math::RigidTransform3d& physicsCurrentPose = physicsRepresentation->getCurrentState().getPose(); const Math::RigidTransform3d& physicsPreviousPose = physicsRepresentation->getPreviousState().getPose(); Math::RigidTransform3d transform = physicsRepresentation->getLocalPose().inverse() * getLocalPose(); previousPose = physicsPreviousPose * transform; currentPose = physicsCurrentPose * transform; } std::shared_ptr previousShape = getShape(); std::shared_ptr currentShape = getShape(); if (getShape()->isTransformable()) { previousShape = getShape()->getTransformed(previousPose); currentShape = getShape()->getTransformed(currentPose); } PosedShape> posedShape1(previousShape, previousPose); PosedShape> posedShape2(currentShape, currentPose); PosedShapeMotion> posedShapeMotion(posedShape1, posedShape2); setPosedShapeMotion(posedShapeMotion); // HS-2-Mar-2016 // #todo Add AABB tree for the posedShapeMotion (i.e. that is the tree where each bounding box consists of the // corresponding elements from posedShape1 and posedShape2 } }; // namespace Collision }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/RigidCollisionRepresentation.h000066400000000000000000000060041277777236100251350ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_RIGIDCOLLISIONREPRESENTATION_H #define SURGSIM_PHYSICS_RIGIDCOLLISIONREPRESENTATION_H #include #include "SurgSim/Collision/Representation.h" #include "SurgSim/Framework/ObjectFactory.h" namespace SurgSim { namespace Physics { class RigidRepresentationBase; SURGSIM_STATIC_REGISTRATION(RigidCollisionRepresentation); /// Collision Representation class that wraps a RigidRepresentation, this can be used to strictly tie the /// Collision Representation to the Rigid, so even if the shape of the rigid changes, the collision representation /// will use the appropriate shape. class RigidCollisionRepresentation : public SurgSim::Collision::Representation { public: /// Constructor /// \param name The name of rigid collision representation explicit RigidCollisionRepresentation(const std::string& name); /// Destructor virtual ~RigidCollisionRepresentation(); SURGSIM_CLASSNAME(SurgSim::Physics::RigidCollisionRepresentation); /// Get the pose of the representation /// \return The pose of this representation SurgSim::Math::RigidTransform3d getPose() const override; /// Get the shape type id /// \return The unique type of the shape, used to determine which calculation to use. int getShapeType() const override; /// Get the shape /// \return The actual shape used for collision. const std::shared_ptr getShape() const override; /// Set the shape /// The default is to use the shape of the Rigid Representation, this /// will override that shape. /// \param shape The actual shape used for collision, if nullptr the Rigid Representation shape will be used. void setShape(std::shared_ptr shape); /// Set rigid representation /// \param representation The rigid representation void setRigidRepresentation(std::shared_ptr representation); /// Gets physics representation. /// \return The physics representation. std::shared_ptr getRigidRepresentation(); void updateShapeData() override; void updateDcdData() override; void updateCcdData(double timeOfImpact) override; private: std::weak_ptr m_physicsRepresentation; std::shared_ptr m_shape; }; }; // namespace Collision }; // namespace SurgSim #endif // SURGSIM_PHYSICS_RIGIDCOLLISIONREPRESENTATION_H opensurgsim-0.7.0/SurgSim/Physics/RigidConstraintFixedPoint.cpp000066400000000000000000000121251277777236100247310ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Physics/Localization.h" #include "SurgSim/Physics/RigidConstraintFixedPoint.h" #include "SurgSim/Physics/RigidRepresentation.h" using SurgSim::Math::Vector3d; namespace SurgSim { namespace Physics { RigidConstraintFixedPoint::RigidConstraintFixedPoint() { } RigidConstraintFixedPoint::~RigidConstraintFixedPoint() { } void RigidConstraintFixedPoint::doBuild(double dt, const ConstraintData& data, const std::shared_ptr& localization, MlcpPhysicsProblem* mlcp, size_t indexOfRepresentation, size_t indexOfConstraint, ConstraintSideSign sign) { std::shared_ptr rigid = std::static_pointer_cast(localization->getRepresentation()); if (!rigid->isActive()) { return; } const double scale = (sign == CONSTRAINT_POSITIVE_SIDE) ? 1.0 : -1.0; Vector3d globalPosition = localization->calculatePosition(); // Fixed point constraint in MCLP // p(t) is defined as the point before motion // s is defined as position to be constrained to [see note 1] // u is defined as the displacement needed to enforce the constraint // The equation is // u + (p(t) - s) = 0 // // Using backward-Euler integration, // u = dt.v(t + dt) // // In rigid body dynamics, the screw vectors are represented as (x, y, z, wx, wy, wz), where the G = (x, y, z) // represents the vector from the origin to the center of mass, and w = (wx, wy, wz) represents angular rotation // about the center of mass. The twist vector in Cartesian space is-- // // dt.v(t+dt) = dt.dG(t+dt) + dt.GP^w(t+dt), where G is the position of the center of mass, // dG is the velocity of the center of mass, // and GP is the vector from the center of mass to the point of interest // = dt.dG(t+dt) + dt.|i j k | // |GPx GPy GPz|, where i, j, k are unit vectors for the x, y, and z directions // |wx wy wz | // = dt.dG(t+dt) + dt.[ GPy.wz - GPz.wy] // [-GPx.wz + GPz.wx] // [ GPx.wy - GPy.wx] // = dt.dG(t+dt) + dt.[ 0 -GPz GPy].w // [ GPz 0 -GPx] // [-GPy GPx 0 ] // // We construct H to transform v(t + dt) into constrained space. Therefore we multiply the translational velocity // by dt, and we must multiply the angular velocity with the skew-symmetric matrix of GP times dt. // // [note 1]: In the physics pipeline, the constraint consists of two implementations and two localizations. The // implementation is processed once for each localization, with the first being processed with scale = 1 and the // second with scale = -1. When applied together in the Mlcp, this effectively takes the difference of the two // constraints. Therefore we can effectively calculate the bilateral constraint using only the position information // of the localization. // Fill up b with the constraint violation mlcp->b.segment<3>(indexOfConstraint) += globalPosition * scale; // Fill up H with the transform from rigid body velocity -> constraint space Vector3d GP = globalPosition - rigid->getCurrentState().getPose() * rigid->getMassCenter(); m_newH.resize(rigid->getNumDof()); m_newH.reserve(3); m_newH.insert(0) = dt * scale; m_newH.insert(3 + 1) = -dt * scale * GP.z(); m_newH.insert(3 + 2) = dt * scale * GP.y(); mlcp->updateConstraint(m_newH, rigid->getComplianceMatrix()*m_newH.transpose(), indexOfRepresentation, indexOfConstraint + 0); m_newH.setZero(); m_newH.insert(1) = dt * scale; m_newH.insert(3 + 0) = dt * scale * GP.z(); m_newH.insert(3 + 2) = -dt * scale * GP.x(); mlcp->updateConstraint(m_newH, rigid->getComplianceMatrix()*m_newH.transpose(), indexOfRepresentation, indexOfConstraint + 1); m_newH.setZero(); m_newH.insert(2) = dt * scale; m_newH.insert(3 + 0) = -dt * scale * GP.y(); m_newH.insert(3 + 1) = dt * scale * GP.x(); mlcp->updateConstraint(m_newH, rigid->getComplianceMatrix()*m_newH.transpose(), indexOfRepresentation, indexOfConstraint + 2); } SurgSim::Physics::ConstraintType RigidConstraintFixedPoint::getConstraintType() const { return SurgSim::Physics::FIXED_3DPOINT; } size_t RigidConstraintFixedPoint::doGetNumDof() const { return 3; } }; // namespace Physics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/RigidConstraintFixedPoint.h000066400000000000000000000050321277777236100243750ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_RIGIDCONSTRAINTFIXEDPOINT_H #define SURGSIM_PHYSICS_RIGIDCONSTRAINTFIXEDPOINT_H #include "SurgSim/Physics/ConstraintImplementation.h" namespace SurgSim { namespace Physics { /// RigidRepresentation bilateral 3d constraint implementation. /// /// The family of FixedPoint constraints enforce equality between two points. class RigidConstraintFixedPoint : public ConstraintImplementation { public: /// Constructor RigidConstraintFixedPoint(); /// Destructor virtual ~RigidConstraintFixedPoint(); /// Gets the constraint type for this ConstraintImplementation /// \return The constraint type corresponding to this constraint implementation SurgSim::Physics::ConstraintType getConstraintType() const override; private: /// Gets the number of degree of freedom. /// \return 3 A bilateral 3d constraint enforces equality in the x, y, and z dimensions between 2 points. size_t doGetNumDof() const override; /// Builds the subset of an Mlcp physics problem associated to this implementation. /// \param dt The time step. /// \param data The data associated to the constraint. /// \param localization The localization for the representation. /// \param [in, out] mlcp The Mixed LCP physics problem to fill up. /// \param indexOfRepresentation The index of the representation (associated to this implementation) in the mlcp. /// \param indexOfConstraint The index of the constraint in the mlcp. /// \param sign The sign of this implementation in the constraint (positive or negative side). /// \note Empty for a Rigid Representation void doBuild(double dt, const ConstraintData& data, const std::shared_ptr& localization, MlcpPhysicsProblem* mlcp, size_t indexOfRepresentation, size_t indexOfConstraint, ConstraintSideSign sign) override; }; }; // namespace Physics }; // namespace SurgSim #endif // SURGSIM_PHYSICS_RIGIDCONSTRAINTFIXEDPOINT_H opensurgsim-0.7.0/SurgSim/Physics/RigidConstraintFixedRotationVector.cpp000066400000000000000000000042641277777236100266270ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Physics/Localization.h" #include "SurgSim/Physics/RigidConstraintFixedRotationVector.h" #include "SurgSim/Physics/RigidRepresentation.h" #include "SurgSim/Physics/RotationVectorConstraintData.h" using SurgSim::Math::Vector3d; namespace SurgSim { namespace Physics { RigidConstraintFixedRotationVector::RigidConstraintFixedRotationVector() { } RigidConstraintFixedRotationVector::~RigidConstraintFixedRotationVector() { } void RigidConstraintFixedRotationVector::doBuild(double dt, const ConstraintData& data, const std::shared_ptr& localization, MlcpPhysicsProblem* mlcp, size_t indexOfRepresentation, size_t indexOfConstraint, ConstraintSideSign sign) { std::shared_ptr rigid = std::static_pointer_cast(localization->getRepresentation()); if (!rigid->isActive()) { return; } const double scale = (sign == CONSTRAINT_POSITIVE_SIDE) ? 1.0 : -1.0; const auto& constRotVecData = static_cast(data); SurgSim::Math::Vector3d rotationVector = constRotVecData.getCurrentRotationVector(); // Fill up b with the constraint violation mlcp->b.segment<3>(indexOfConstraint) += rotationVector * scale; } SurgSim::Physics::ConstraintType RigidConstraintFixedRotationVector::getConstraintType() const { return SurgSim::Physics::FIXED_3DROTATION_VECTOR; } size_t RigidConstraintFixedRotationVector::doGetNumDof() const { return 3; } }; // namespace Physics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/RigidConstraintFixedRotationVector.h000066400000000000000000000046561277777236100263010ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_RIGIDCONSTRAINTFIXEDROTATIONVECTOR_H #define SURGSIM_PHYSICS_RIGIDCONSTRAINTFIXEDROTATIONVECTOR_H #include "SurgSim/Physics/ConstraintImplementation.h" namespace SurgSim { namespace Physics { /// RigidRepresentationBase fixed rotation vector constraint /// /// This implementation simply fixes the rotational dof of the constraint, effectively controlling the /// other representation orientation. class RigidConstraintFixedRotationVector : public ConstraintImplementation { public: /// Constructor RigidConstraintFixedRotationVector(); /// Destructor virtual ~RigidConstraintFixedRotationVector(); SurgSim::Physics::ConstraintType getConstraintType() const override; private: size_t doGetNumDof() const override; /// \note This is only setting the mlcp->b violation to the rigid representation current rotation vector. /// It means that the rigid won't receive any forces back, it simply will control the other representation's /// orientation in this constraint. /// /// \note The rotation vector constraint violation being calculated based on a quaternion interpolation (slerp), /// and this type of interpolation being highly non-linear, the classical way of using the implementation one after /// the other one won't work. /// Therefore, the RotationVectorConstraint will use the vector mlcp->b to retrieve both representation's /// rotation vector, then calculate the proper slerp and set the violation back in mlcp->b void doBuild(double dt, const ConstraintData& data, const std::shared_ptr& localization, MlcpPhysicsProblem* mlcp, size_t indexOfRepresentation, size_t indexOfConstraint, ConstraintSideSign sign) override; }; }; // namespace Physics }; // namespace SurgSim #endif // SURGSIM_PHYSICS_RIGIDCONSTRAINTFIXEDROTATIONVECTOR_H opensurgsim-0.7.0/SurgSim/Physics/RigidConstraintFrictionlessContact.cpp000066400000000000000000000073371277777236100266510ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Physics/RigidConstraintFrictionlessContact.h" #include "SurgSim/Physics/ContactConstraintData.h" #include "SurgSim/Physics/ConstraintImplementation.h" #include "SurgSim/Physics/Localization.h" using SurgSim::Math::Vector3d; namespace SurgSim { namespace Physics { RigidConstraintFrictionlessContact::RigidConstraintFrictionlessContact() { } RigidConstraintFrictionlessContact::~RigidConstraintFrictionlessContact() { } void RigidConstraintFrictionlessContact::doBuild(double dt, const ConstraintData& data, const std::shared_ptr& localization, MlcpPhysicsProblem* mlcp, size_t indexOfRepresentation, size_t indexOfConstraint, ConstraintSideSign sign) { std::shared_ptr representation = localization->getRepresentation(); std::shared_ptr rigid = std::static_pointer_cast(representation); if (! rigid->isActive()) { return; } const double scale = (sign == CONSTRAINT_POSITIVE_SIDE ? 1.0 : -1.0); const Eigen::Matrix& C = rigid->getComplianceMatrix(); const ContactConstraintData& contactData = static_cast(data); const Vector3d& n = contactData.getNormal(); // FRICTIONLESS CONTACT in a LCP // (n, d) defines the plane of contact // P(t) the point of contact (usually after free motion) // The constraint equation is: n.P(t+dt) + d >= 0 // n.[ P(t) + dt.V(t+dt) ] + d >= 0 (using the numerical integration scheme Backward Euler) // n.dt.[dG(t+dt) + w(t+dt)^GP] + n.P(t) + d >= 0 // n.dt.[dGx(t+dt) + (wy(t+dt).GPz-wz(t+dt).GPy)] + n.P(t) + d >= 0 ] // [dGy(t+dt) + (wz(t+dt).GPx-wx(t+dt).GPz)] // [dGz(t+dt) + (wx(t+dt).GPy-wy(t+dt).GPx)] // H.v(t+dt) + b >= 0 // H = dt.[nx ny nz nz.GPy-ny.GPz nx.GPz-nz.GPx ny.GPx-nx.GPy] // b = n.P(t) + d -> P(t) evaluated after free motion // Since the d term will be added to the constraint for one side of the contact and subtracted from the other, // and because it is not clear which distance should be used, we leave it out. Vector3d globalPosition = localization->calculatePosition(); Vector3d GP = globalPosition - rigid->getCurrentState().getPose() * rigid->getMassCenter(); // Fill up b with the constraint equation... double violation = n.dot(globalPosition); mlcp->b[indexOfConstraint] += violation * scale; m_newH.resize(rigid->getNumDof()); m_newH.reserve(6); m_newH.insert(0) = dt * scale * n[0]; m_newH.insert(1) = dt * scale * n[1]; m_newH.insert(2) = dt * scale * n[2]; Eigen::Vector3d rotation = GP.cross(n); m_newH.insert(3) = dt * scale * rotation[0]; m_newH.insert(4) = dt * scale * rotation[1]; m_newH.insert(5) = dt * scale * rotation[2]; mlcp->updateConstraint(m_newH, C * m_newH.transpose(), indexOfRepresentation, indexOfConstraint); } SurgSim::Physics::ConstraintType RigidConstraintFrictionlessContact::getConstraintType() const { return SurgSim::Physics::FRICTIONLESS_3DCONTACT; } size_t RigidConstraintFrictionlessContact::doGetNumDof() const { return 1; } }; // namespace Physics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/RigidConstraintFrictionlessContact.h000066400000000000000000000052101277777236100263020ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_RIGIDCONSTRAINTFRICTIONLESSCONTACT_H #define SURGSIM_PHYSICS_RIGIDCONSTRAINTFRICTIONLESSCONTACT_H #include "SurgSim/Physics/Constraint.h" #include "SurgSim/Physics/ConstraintData.h" #include "SurgSim/Physics/ConstraintImplementation.h" #include "SurgSim/Physics/RigidRepresentation.h" #include "SurgSim/Physics/Localization.h" namespace SurgSim { namespace Physics { /// RigidRepresentation frictionless contact implementation. class RigidConstraintFrictionlessContact : public ConstraintImplementation { public: /// Constructor RigidConstraintFrictionlessContact(); /// Destructor virtual ~RigidConstraintFrictionlessContact(); /// Gets the constraint type for this ConstraintImplementation /// \return The constraint type corresponding to this constraint implementation SurgSim::Physics::ConstraintType getConstraintType() const override; private: /// Gets the number of degree of freedom for a frictionless contact. /// \return 1 as a frictionless contact only has 1 equation of constraint (along the normal direction). size_t doGetNumDof() const override; /// Builds the subset of an Mlcp physics problem associated to this implementation. /// \param dt The time step. /// \param data The data associated to the constraint. /// \param localization The localization for the representation. /// \param [in, out] mlcp The Mixed LCP physics problem to fill up. /// \param indexOfRepresentation The index of the representation (associated to this implementation) in the mlcp. /// \param indexOfConstraint The index of the constraint in the mlcp. /// \param sign The sign of this implementation in the constraint (positive or negative side). void doBuild(double dt, const ConstraintData& data, const std::shared_ptr& localization, MlcpPhysicsProblem* mlcp, size_t indexOfRepresentation, size_t indexOfConstraint, ConstraintSideSign sign) override; }; }; // namespace Physics }; // namespace SurgSim #endif // SURGSIM_PHYSICS_RIGIDCONSTRAINTFRICTIONLESSCONTACT_H opensurgsim-0.7.0/SurgSim/Physics/RigidLocalization.cpp000066400000000000000000000102071277777236100232420ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Physics/RigidLocalization.h" #include "SurgSim/Physics/RigidRepresentationBase.h" namespace SurgSim { namespace Physics { RigidLocalization::RigidLocalization() : Localization() { } RigidLocalization::RigidLocalization(std::shared_ptr representation) : Localization() { setRepresentation(representation); } RigidLocalization::~RigidLocalization() { } void RigidLocalization::setLocalPosition(const SurgSim::Math::Vector3d& p) { m_position = p; } const SurgSim::Math::Vector3d& RigidLocalization::getLocalPosition() const { return m_position; } SurgSim::Math::Vector3d RigidLocalization::doCalculatePosition(double time) const { std::shared_ptr rigidRepresentation = std::static_pointer_cast(getRepresentation()); SURGSIM_ASSERT(rigidRepresentation != nullptr) << "RigidRepresentation is null, it was probably not" << " initialized"; if (time <= std::numeric_limits::epsilon()) { return rigidRepresentation->getPreviousState().getPose() * m_position; } else if (time >= 1.0 - std::numeric_limits::epsilon()) { return rigidRepresentation->getCurrentState().getPose() * m_position; } else if (rigidRepresentation->getCurrentState().getPose(). isApprox(rigidRepresentation->getPreviousState().getPose())) { return rigidRepresentation->getCurrentState().getPose() * m_position; } const SurgSim::Math::RigidTransform3d& currentPose = rigidRepresentation->getCurrentState().getPose(); const SurgSim::Math::RigidTransform3d& previousPose = rigidRepresentation->getPreviousState().getPose(); SurgSim::Math::RigidTransform3d pose = SurgSim::Math::interpolate(previousPose, currentPose, time); return pose * m_position; } SurgSim::Math::Vector3d RigidLocalization::doCalculateVelocity(double time) const { std::shared_ptr rigidRepresentation = std::static_pointer_cast(getRepresentation()); SURGSIM_ASSERT(rigidRepresentation != nullptr) << "RigidRepresentation is null, it was probably not" << " initialized"; auto& previousR = rigidRepresentation->getPreviousState().getPose().linear(); auto& currentR = rigidRepresentation->getCurrentState().getPose().linear(); if (time <= std::numeric_limits::epsilon()) { return rigidRepresentation->getPreviousState().getLinearVelocity() + rigidRepresentation->getPreviousState().getAngularVelocity().cross(previousR * m_position); } else if (time >= 1.0 - std::numeric_limits::epsilon()) { return rigidRepresentation->getCurrentState().getLinearVelocity() + rigidRepresentation->getCurrentState().getAngularVelocity().cross(currentR * m_position); } Math::Vector3d currentVelocity = rigidRepresentation->getCurrentState().getLinearVelocity() + rigidRepresentation->getCurrentState().getAngularVelocity().cross(currentR * m_position); Math::Vector3d previousVelocity = rigidRepresentation->getPreviousState().getLinearVelocity() + rigidRepresentation->getPreviousState().getAngularVelocity().cross(previousR * m_position); return Math::interpolate(previousVelocity, currentVelocity, time); } bool RigidLocalization::isValidRepresentation(std::shared_ptr representation) { std::shared_ptr rigidRepresentation = std::dynamic_pointer_cast(representation); // Allows to reset the representation to nullptr ... return (rigidRepresentation != nullptr || representation == nullptr); } }; // Physics }; // SurgSim opensurgsim-0.7.0/SurgSim/Physics/RigidLocalization.h000066400000000000000000000046211277777236100227120ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_RIGIDLOCALIZATION_H #define SURGSIM_PHYSICS_RIGIDLOCALIZATION_H #include "SurgSim/Physics/Localization.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Vector.h" namespace SurgSim { namespace Physics { /// This class implements the localization on a RigidRepresentationBase, as a local position. class RigidLocalization: public Localization { public: /// Default constructor RigidLocalization(); /// Constructor /// \param representation The representation to assign to this localization. explicit RigidLocalization(std::shared_ptr representation); /// Destructor virtual ~RigidLocalization(); /// Sets the local position. /// \param p The local position to set the localization at. void setLocalPosition(const SurgSim::Math::Vector3d& p); /// Gets the local position. /// \return The local position set for this localization. const SurgSim::Math::Vector3d& getLocalPosition() const; /// Query if 'representation' is valid representation. /// \param representation The representation. /// \return true if valid representation, false if not. bool isValidRepresentation(std::shared_ptr representation) override; private: /// Calculates the global position of this localization. /// \param time The time in [0..1] at which the position should be calculated. /// \return The global position of the localization at the requested time. /// \note time can useful when dealing with CCD. SurgSim::Math::Vector3d doCalculatePosition(double time) const; SurgSim::Math::Vector3d doCalculateVelocity(double time) const; /// 3D position in local coordinates. SurgSim::Math::Vector3d m_position; }; }; // namespace Physics }; // namespace SurgSim #endif // SURGSIM_PHYSICS_RIGIDLOCALIZATION_H opensurgsim-0.7.0/SurgSim/Physics/RigidRepresentation.cpp000066400000000000000000000407141277777236100236220ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Physics/RigidRepresentation.h" #include "SurgSim/DataStructures/BufferedValue.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Math/Shape.h" #include "SurgSim/Math/Valid.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/RigidState.h" namespace { const double rotationVectorEpsilon = 1e-8; }; namespace SurgSim { namespace Physics { SURGSIM_REGISTER(SurgSim::Framework::Component, SurgSim::Physics::RigidRepresentation, RigidRepresentation); RigidRepresentation::RigidRepresentation(const std::string& name) : RigidRepresentationBase(name), m_globalInertia(SurgSim::Math::Matrix33d::Zero()), m_invGlobalInertia(SurgSim::Math::Matrix33d::Zero()), m_force(SurgSim::Math::Vector3d::Zero()), m_torque(SurgSim::Math::Vector3d::Zero()), m_C(SurgSim::Math::Matrix66d::Zero()), m_hasExternalGeneralizedForce(false), m_externalGeneralizedForce(SurgSim::Math::Vector6d::Zero()), m_externalGeneralizedStiffness(SurgSim::Math::Matrix66d::Zero()), m_externalGeneralizedDamping(SurgSim::Math::Matrix66d::Zero()) { // Initialize the number of degrees of freedom // 6 for a rigid body velocity-based (linear and angular velocities are the Dof) setNumDof(6); } RigidRepresentation::~RigidRepresentation() { } void RigidRepresentation::addExternalGeneralizedForce(const SurgSim::Math::Vector6d& generalizedForce, const SurgSim::Math::Matrix66d& K, const SurgSim::Math::Matrix66d& D) { m_externalGeneralizedForce.unsafeGet() += generalizedForce; m_externalGeneralizedStiffness += K; m_externalGeneralizedDamping += D; m_hasExternalGeneralizedForce = true; } void RigidRepresentation::addExternalGeneralizedForce(const SurgSim::DataStructures::Location& location, const SurgSim::Math::Vector6d& generalizedForce, const SurgSim::Math::Matrix66d& K, const SurgSim::Math::Matrix66d& D) { using SurgSim::Math::Matrix33d; using SurgSim::Math::Matrix66d; using SurgSim::Math::Vector3d; using SurgSim::Math::Vector6d; SURGSIM_ASSERT(location.rigidLocalPosition.hasValue()) << "Invalid location (no rigid local position)"; RigidLocalization localization; localization.setRepresentation(std::static_pointer_cast(shared_from_this())); localization.setLocalPosition(location.rigidLocalPosition.getValue()); const Vector3d point = localization.calculatePosition(); const Vector3d massCenter = getCurrentState().getPose() * getMassCenter(); const Vector3d lever = point - massCenter; auto force = generalizedForce.segment<3>(0); const Vector3d torque = lever.cross(force); // add the generalized force m_externalGeneralizedForce.unsafeGet() += generalizedForce; // add the generalized stiffness matrix m_externalGeneralizedStiffness += K; // add the generalized damping matrix m_externalGeneralizedDamping += D; // add the extra torque produced by the lever m_externalGeneralizedForce.unsafeGet().segment<3>(3) += torque; // add the extra terms in the stiffness matrix const Vector3d leverInLocalSpace = getCurrentState().getPose().rotation().inverse() * lever; const Eigen::AngleAxisd angleAxis(getCurrentState().getPose().rotation()); double angle = angleAxis.angle(); const Vector3d axis = angleAxis.axis(); const Vector3d rotationVector = axis * angle; double rotationVectorNorm = rotationVector.norm(); double rotationVectorNormCubic = rotationVectorNorm * rotationVectorNorm * rotationVectorNorm; double sinAngle = sin(angle); double cosAngle = cos(angle); double oneMinusCos = 1.0 - cosAngle; const Matrix33d skewAxis = SurgSim::Math::makeSkewSymmetricMatrix(axis); Matrix33d dRdAxisX; Matrix33d dRdAxisY; Matrix33d dRdAxisZ; Matrix33d dRdAngle = -sinAngle * Matrix33d::Identity() + cosAngle * skewAxis + sinAngle * axis * axis.transpose(); dRdAxisX << oneMinusCos * 2.0 * axis[0], oneMinusCos * axis[1], oneMinusCos * axis[2], oneMinusCos * axis[1], 0.0, -sinAngle, oneMinusCos * axis[2], sinAngle, 0.0; dRdAxisY << 0.0, oneMinusCos * axis[0], sinAngle, oneMinusCos * axis[0], oneMinusCos * 2.0 * axis[1], oneMinusCos * axis[2], -sinAngle, oneMinusCos * axis[2], 0.0; dRdAxisZ << 0.0, -sinAngle, oneMinusCos * axis[0], sinAngle, 0.0, oneMinusCos * axis[1], oneMinusCos * axis[0], oneMinusCos * axis[1], oneMinusCos * 2.0 * axis[2]; Vector3d dAngledRotationVector, dAxisXdRotationVector, dAxisYdRotationVector, dAxisZdRotationVector; if (std::abs(rotationVectorNorm) > rotationVectorEpsilon) { const Vector3d tmp = rotationVector / rotationVectorNormCubic; dAngledRotationVector = rotationVector / rotationVectorNorm; dAxisXdRotationVector = Vector3d::UnitX() / rotationVectorNorm - rotationVector[0] * tmp; dAxisYdRotationVector = Vector3d::UnitY() / rotationVectorNorm - rotationVector[1] * tmp; dAxisZdRotationVector = Vector3d::UnitZ() / rotationVectorNorm - rotationVector[2] * tmp; } else { // Development around theta ~ 0 => sin(theta) ~ theta // We simplify by theta across the products dRdAxis[alpha].dAxis[alpha]dRotationVector[beta] dAngledRotationVector = Vector3d::Zero(); dAxisXdRotationVector = Vector3d::UnitX(); dAxisYdRotationVector = Vector3d::UnitY(); dAxisZdRotationVector = Vector3d::UnitZ(); dRdAxisX << 0.0, 0.0, 0.0, 0.0, 0.0, -1.0, 0.0, 1.0, 0.0; dRdAxisY << 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, -1.0, 0.0, 0.0; dRdAxisZ << 0.0, -1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0; } // add the extra stiffness terms produced by the lever for (size_t column = 0; column < 6; ++column) { m_externalGeneralizedStiffness.block<3, 1>(3, column) += lever.cross(K.block<3, 1>(0, column)); } // add extra term - dCP/dW[alpha] ^ F = - dR.CP(local)/dW[alpha] ^ F = -dR/dW[alpha].CP(local) ^ F // = -[(dR/dangle.dangle/dW[alpha] + dR/daxisX.daxisX/dW[alpha] + // dR/daxisY.daxisY/dW[alpha] + dR/daxisZ.daxisZ/dW[alpha]) . CP(local)] ^ F for (size_t i = 0; i < 3; ++i) { m_externalGeneralizedStiffness.block<3, 1>(3, 3 + i) += -((dRdAngle * dAngledRotationVector[i] + dRdAxisX * dAxisXdRotationVector[i] + dRdAxisY * dAxisYdRotationVector[i] + dRdAxisZ * dAxisZdRotationVector[i]) * leverInLocalSpace).cross(force); } // add the extra damping terms produced by the lever for (size_t column = 0; column < 6; ++column) { m_externalGeneralizedDamping.block<3, 1>(3, column) += lever.cross(D.block<3, 1>(0, column)); } m_hasExternalGeneralizedForce = true; } SurgSim::DataStructures::BufferedValue& RigidRepresentation::getExternalGeneralizedForce() { return m_externalGeneralizedForce; } const SurgSim::Math::Matrix66d& RigidRepresentation::getExternalGeneralizedStiffness() const { return m_externalGeneralizedStiffness; } const SurgSim::Math::Matrix66d& RigidRepresentation::getExternalGeneralizedDamping() const { return m_externalGeneralizedDamping; } void RigidRepresentation::beforeUpdate(double dt) { RigidRepresentationBase::beforeUpdate(dt); SURGSIM_LOG_IF(!m_parametersValid, SurgSim::Framework::Logger::getDefaultLogger(), WARNING) << getFullName() << " deactivated in beforeUpdate because parameters are not valid." << std::endl; if (!m_parametersValid) { setLocalActive(false); return; } } void RigidRepresentation::update(double dt) { using SurgSim::Math::Vector3d; using SurgSim::Math::Matrix33d; using SurgSim::Math::Quaterniond; SURGSIM_LOG_IF(!m_parametersValid, SurgSim::Framework::Logger::getDefaultLogger(), WARNING) << getName() << " deactivated in update because parameters are not valid." << std::endl; if (!m_parametersValid) { setLocalActive(false); return; } // For convenience Vector3d G = m_currentState.getPose() * getMassCenter(); Vector3d dG = m_currentState.getLinearVelocity(); Matrix33d R = m_currentState.getPose().linear(); Quaterniond q = Quaterniond(R); Vector3d w = m_currentState.getAngularVelocity(); Quaterniond dq; double qNorm = q.norm(); // Norm of q before normalization // Rigid body dynamics (using backward Euler numerical integration scheme): // { Id33.m.(v(t+dt) - v(t))/dt = f // { I .(w(t+dt) - w(t))/dt = t - w(t)^(I.w(t)) // // Integrating the Rayleigh damping on the velocity level: // { Id33.m.(1/dt + alphaLinear ).v(t+dt) = Id33.m.v(t)/dt + f // { I .(1/dt + alphaAngular).w(t+dt) = I.w(t)/dt + t - w(t)^(I.w(t)) // Compute external forces/torques m_force.setZero(); m_torque.setZero(); if (m_hasExternalGeneralizedForce) { m_force += m_externalGeneralizedForce.unsafeGet().segment<3>(0); m_torque += m_externalGeneralizedForce.unsafeGet().segment<3>(3); } if (isGravityEnabled()) { m_force += getGravity() * getMass(); } m_torque -= w.cross(m_globalInertia * w); // Add Backward Euler RHS terms m_force += getMass() * dG / dt; m_torque += m_globalInertia * w / dt; // Solve the 6D system on the velocity level { // { Id33.m.(1/dt + alphaLinear ).v(t+dt) = Id33.m.v(t)/dt + f // { I .(1/dt + alphaAngular).w(t+dt) = I.w(t)/dt + t - w(t)^(I.w(t)) dG = (1.0 / getMass()) * m_force / (1.0 / dt + getLinearDamping()); w = m_invGlobalInertia * m_torque / (1.0 / dt + getAngularDamping()); // Compute the quaternion velocity as well: dq = 1/2.(0 w).q dq = Quaterniond(0.0, w[0], w[1], w[2]) * q; dq.coeffs() *= 0.5; } m_currentState.setLinearVelocity(dG); m_currentState.setAngularVelocity(w); // Integrate the velocities to get the rigid representation pose { // G(t+dt) = G(t) + dt. dG(t+dt) G += dG * dt; // q(t+dt) = q(t) + dt. dq(t+dt) Quaterniond dq_dt = dq; dq_dt.coeffs() *= dt; q.coeffs() += dq_dt.coeffs(); // Normalize the quaternion to make sure we do have a rotation q.normalize(); } R = q.matrix(); m_currentState.setPose(SurgSim::Math::makeRigidTransform(R, G - R * getMassCenter())); // Compute the global inertia matrix with the current state updateGlobalInertiaMatrices(m_currentState); // If something went wrong, we deactivate the representation bool condition = SurgSim::Math::isValid(G); condition &= SurgSim::Math::isValid(dG); condition &= SurgSim::Math::isValid(w); condition &= qNorm != 0.0; condition &= SurgSim::Math::isValid(q); condition &= fabs(1.0 - q.norm()) < 1e-3; SURGSIM_LOG_IF(!condition, SurgSim::Framework::Logger::getDefaultLogger(), WARNING) << getName() << " deactivated and reset because:" << std::endl << "G=(" << G[0] << "," << G[1] << "," << G[2] << "), " << "dG=(" << dG[0] << "," << dG[1] << "," << dG[2] << "), " << "w=(" << w[0] << "," << w[1] << "," << w[2] << "), " << "q=(" << q.x() << "," << q.y() << "," << q.z() << "," << q.w() << "), " << "|q| before normalization=" << qNorm << ", and " << "|q| after normalization=" << q.norm() << std::endl; if (!condition) { setLocalActive(false); } // Prepare the compliance matrix computeComplianceMatrix(dt); } void RigidRepresentation::afterUpdate(double dt) { m_externalGeneralizedForce.publish(); RigidRepresentationBase::afterUpdate(dt); SURGSIM_LOG_IF(!m_parametersValid, SurgSim::Framework::Logger::getDefaultLogger(), WARNING) << getName() << " deactivated in afterUpdate because parameters are not valid." << std::endl; if (!m_parametersValid) { setLocalActive(false); return; } if (m_hasExternalGeneralizedForce) { m_hasExternalGeneralizedForce = false; m_externalGeneralizedForce.unsafeGet().setZero(); m_externalGeneralizedStiffness.setZero(); m_externalGeneralizedDamping.setZero(); } } void RigidRepresentation::applyCorrection(double dt, const Eigen::VectorBlock& deltaVelocity) { using SurgSim::Math::Vector3d; using SurgSim::Math::Matrix33d; using SurgSim::Math::Quaterniond; SURGSIM_LOG_IF(!m_parametersValid, SurgSim::Framework::Logger::getDefaultLogger(), WARNING) << getName() << " deactivated in applyCorrection because parameters are not valid." << std::endl; if (!m_parametersValid) { setLocalActive(false); return; } Vector3d G = m_currentState.getPose() * getMassCenter(); Vector3d dG = m_currentState.getLinearVelocity(); Matrix33d R = m_currentState.getPose().linear(); Quaterniond q = Quaterniond(R); Vector3d w = m_currentState.getAngularVelocity(); const Vector3d& delta_dG = deltaVelocity.segment(0, 3); const Vector3d& delta_w = deltaVelocity.segment(3, 3); Quaterniond delta_dq = Quaterniond(0.0, delta_w[0], delta_w[1], delta_w[2]) * q; delta_dq.coeffs() *= 0.5; dG += delta_dG; w += delta_w; m_currentState.setLinearVelocity(dG); m_currentState.setAngularVelocity(w); // Integrate the velocities to get the rigid representation pose { // G(t+dt) = G(t) + dt. delta_dG(t+dt) G += delta_dG * dt; // q(t+dt) = q(t) + dt. delta_dq(t+dt) q.coeffs() += delta_dq.coeffs() * dt; // Normalize the quaternion to make sure we do have a rotation q.normalize(); } R = q.matrix(); m_currentState.setPose(SurgSim::Math::makeRigidTransform(R, G - R * getMassCenter())); // Compute the global inertia matrix with the current state updateGlobalInertiaMatrices(m_currentState); // If something went wrong, we deactivate the representation bool condition = SurgSim::Math::isValid(G); condition &= SurgSim::Math::isValid(q); condition &= fabs(1.0 - q.norm()) < 1e-3; SURGSIM_LOG_IF(!condition, SurgSim::Framework::Logger::getDefaultLogger(), WARNING) << getName() << " deactivated and reset in applyCorrection because:" << std::endl << "G=(" << G[0] << "," << G[1] << "," << G[2] << "), " << "q=(" << q.x() << "," << q.y() << "," << q.z() << "," << q.w() << "), " << "and |q| after normalization=" << q.norm() << std::endl; if (!condition) { setLocalActive(false); } // Prepare the compliance matrix computeComplianceMatrix(dt); } const Eigen::Matrix & SurgSim::Physics::RigidRepresentation::getComplianceMatrix() const { return m_C; } void RigidRepresentation::computeComplianceMatrix(double dt) { SURGSIM_LOG_IF(!m_parametersValid, SurgSim::Framework::Logger::getDefaultLogger(), WARNING) << getName() << " deactivated in computComplianceMatrix because parameters are not valid." << std::endl; if (!m_parametersValid) { setLocalActive(false); return; } SurgSim::Math::Matrix66d systemMatrix; const SurgSim::Math::Matrix33d identity3x3 = SurgSim::Math::Matrix33d::Identity(); systemMatrix.block<3, 3>(0, 0) = identity3x3 * (getMass() / dt + getLinearDamping()); systemMatrix.block<3, 3>(3, 3) = m_globalInertia / dt + getAngularDamping() * identity3x3; if (m_hasExternalGeneralizedForce) { systemMatrix += m_externalGeneralizedDamping + m_externalGeneralizedStiffness * dt; } m_C.setZero(); //Invert systemMatrix //We can use this shortcut because we know the linear and angular terms are independent m_C.block<3, 3>(0, 0) = systemMatrix.block<3, 3>(0, 0).inverse(); m_C.block<3, 3>(3, 3) = systemMatrix.block<3, 3>(3, 3).inverse(); } void RigidRepresentation::updateGlobalInertiaMatrices(const RigidState& state) { if (!m_parametersValid) { // do not setIsActive(false) due to invalid parameters because RigidRepresentationBase::setInitialParameters may // not have been called before RigidRepresentationBase::setInitialState (which calls this function), in which // case the parameters are invalid but we should not deactivate the representation. return; } const SurgSim::Math::Matrix33d& R = state.getPose().linear(); m_globalInertia = R * getLocalInertia() * R.transpose(); m_invGlobalInertia = m_globalInertia.inverse(); } bool RigidRepresentation::doInitialize() { bool result = RigidRepresentationBase::doInitialize(); if (result) { SURGSIM_ASSERT(getShape()->getVolume() > 0.0) << "Cannot use a shape with zero volume for RigidRepresentations"; } return result; } void RigidRepresentation::setLinearVelocity(const SurgSim::Math::Vector3d& linearVelocity) { m_currentState.setLinearVelocity(linearVelocity); } void RigidRepresentation::setAngularVelocity(const SurgSim::Math::Vector3d& angularVelocity) { m_currentState.setAngularVelocity(angularVelocity); } }; // Physics }; // SurgSim opensurgsim-0.7.0/SurgSim/Physics/RigidRepresentation.h000066400000000000000000000141241277777236100232630ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_RIGIDREPRESENTATION_H #define SURGSIM_PHYSICS_RIGIDREPRESENTATION_H #include "SurgSim/DataStructures/BufferedValue.h" #include "SurgSim/Framework/Macros.h" #include "SurgSim/Framework/ObjectFactory.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Math/Matrix.h" #include "SurgSim/Physics/RigidRepresentationBase.h" namespace SurgSim { namespace Physics { class RigidState; class Localization; typedef RigidLocalization RigidLocalization; SURGSIM_STATIC_REGISTRATION(RigidRepresentation); /// \class RigidRepresentation /// The RigidRepresentation class defines the dynamic rigid body representation /// Note that the rigid representation is velocity-based, therefore its degrees of /// freedom are the linear and angular velocities: 6 Dof class RigidRepresentation : public RigidRepresentationBase { public: /// Constructor /// \param name The rigid representation's name explicit RigidRepresentation(const std::string& name); /// Destructor virtual ~RigidRepresentation(); SURGSIM_CLASSNAME(SurgSim::Physics::RigidRepresentation); /// Set the current linear velocity of the rigid representation /// \param linearVelocity The linear velocity void setLinearVelocity(const SurgSim::Math::Vector3d& linearVelocity); /// Set the current angular velocity of the rigid representation /// \param angularVelocity The angular velocity void setAngularVelocity(const SurgSim::Math::Vector3d& angularVelocity); /// Add an external generalized force applied to the rigid representation's mass center. /// \note This force is generalized (i.e. it's a 6D vector, containing both 3D force and 3D torque). /// \note The stiffness and damping are 6x6 matrices with coupling between the translational and rotation dof. /// \note All external generalized forces will be zeroed every afterUpdate call of the rigid representation. /// \param generalizedForce The external generalized force to apply at the mass center /// \param K The stiffness matrix associated with the generalized force (jacobian of the force w.r.t position) /// \param D The damping matrix associated with the generalized force (jacobian of the force w.r.t velocity) void addExternalGeneralizedForce(const SurgSim::Math::Vector6d& generalizedForce, const SurgSim::Math::Matrix66d& K = SurgSim::Math::Matrix66d::Zero(), const SurgSim::Math::Matrix66d& D = SurgSim::Math::Matrix66d::Zero()); /// Add an external generalized force applied to the rigid representation (anywhere). /// \note This force is generalized (i.e. it's a 6D vector, containing both 3D force and 3D torque). /// \note The stiffness and damping are 6x6 matrices with coupling between the translational and rotation dof. /// \note All external generalized forces will be zeroed every afterUpdate call of the rigid representation. /// \param location The application point (must contain a rigid local position) /// \param generalizedForce The external generalized force /// \param K The stiffness matrix associated with generalizedForce (jacobian w.r.t position) /// \param D The damping matrix associated with generalizedForce (jacobian w.r.t velocity) void addExternalGeneralizedForce(const SurgSim::DataStructures::Location& location, const SurgSim::Math::Vector6d& generalizedForce, const SurgSim::Math::Matrix66d& K = SurgSim::Math::Matrix66d::Zero(), const SurgSim::Math::Matrix66d& D = SurgSim::Math::Matrix66d::Zero()); /// \return the current external generalized 6D force SurgSim::DataStructures::BufferedValue& getExternalGeneralizedForce(); /// \return the current external generalized stiffness 6x6 matrix const SurgSim::Math::Matrix66d& getExternalGeneralizedStiffness() const; /// \return the current external generalized damping 6x6 matrix const SurgSim::Math::Matrix66d& getExternalGeneralizedDamping() const; void beforeUpdate(double dt) override; void update(double dt) override; void afterUpdate(double dt) override; void applyCorrection(double dt, const Eigen::VectorBlock& deltaVelocity) override; /// Retrieve the rigid body 6x6 compliance matrix /// \return the 6x6 compliance matrix const SurgSim::Math::Matrix66d& getComplianceMatrix() const; protected: /// Inertia matrices in global coordinates SurgSim::Math::Matrix33d m_globalInertia; /// Inverse of inertia matrix in global coordinates SurgSim::Math::Matrix33d m_invGlobalInertia; /// Current force applied on the rigid representation (in N) SurgSim::Math::Vector3d m_force; /// Current torque applied on the rigid representation (in N.m) SurgSim::Math::Vector3d m_torque; /// Compliance matrix (size of the number of Dof = 6) SurgSim::Math::Matrix66d m_C; /// External generalized force, stiffness and damping applied on the rigid representation /// @{ bool m_hasExternalGeneralizedForce; SurgSim::DataStructures::BufferedValue m_externalGeneralizedForce; SurgSim::Math::Matrix66d m_externalGeneralizedStiffness; SurgSim::Math::Matrix66d m_externalGeneralizedDamping; /// @} private: bool doInitialize() override; /// Compute compliance matrix (internal data structure) /// \param dt The time step in use void computeComplianceMatrix(double dt); /// Update global inertia matrices (internal data structure) /// \param state The state of the rigid representation to use for the update void updateGlobalInertiaMatrices(const RigidState& state) override; }; }; // Physics }; // SurgSim #endif // SURGSIM_PHYSICS_RIGIDREPRESENTATION_H opensurgsim-0.7.0/SurgSim/Physics/RigidRepresentationBase-inl.h000066400000000000000000000026251277777236100246410ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_RIGIDREPRESENTATIONBASE_INL_H #define SURGSIM_PHYSICS_RIGIDREPRESENTATIONBASE_INL_H namespace SurgSim { namespace Physics { template std::shared_ptr RigidRepresentationBase::createTypedLocalization( const SurgSim::DataStructures::Location& location) { // Change when we deal with the meshes as shapes std::shared_ptr result = std::make_shared( std::static_pointer_cast(getSharedPtr())); SURGSIM_ASSERT(location.rigidLocalPosition.hasValue()) << "Tried to create a rigid localization without valid position information"; result->setLocalPosition(location.rigidLocalPosition.getValue()); return std::move(result); } }; // Physics }; // SurgSim #endif // SURGSIM_PHYSICS_RIGIDREPRESENTATIONBASE_INL_H opensurgsim-0.7.0/SurgSim/Physics/RigidRepresentationBase.cpp000066400000000000000000000150031277777236100244060ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Framework/Assert.h" #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Framework/PoseComponent.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Framework/SceneElement.h" #include "SurgSim/Math/MathConvert.h" #include "SurgSim/Math/MeshShape.h" #include "SurgSim/Math/Valid.h" #include "SurgSim/Physics/RigidCollisionRepresentation.h" #include "SurgSim/Physics/RigidRepresentationBase.h" #include "SurgSim/Physics/PhysicsConvert.h" namespace SurgSim { namespace Physics { RigidRepresentationBase::RigidRepresentationBase(const std::string& name) : Representation(name), m_parametersValid(false), m_rho(0.0), m_mass(std::numeric_limits::quiet_NaN()), m_linearDamping(0.0), m_angularDamping(0.0) { m_localInertia.setConstant(std::numeric_limits::quiet_NaN()); m_massCenter.setConstant(std::numeric_limits::quiet_NaN()); SURGSIM_ADD_SERIALIZABLE_PROPERTY(RigidRepresentationBase, RigidState, RigidState, getInitialState, setInitialState); SURGSIM_ADD_SERIALIZABLE_PROPERTY(RigidRepresentationBase, std::shared_ptr, CollisionRepresentation, getCollisionRepresentation, setCollisionRepresentation); SURGSIM_ADD_SERIALIZABLE_PROPERTY(RigidRepresentationBase, double, Density, getDensity, setDensity); SURGSIM_ADD_SERIALIZABLE_PROPERTY(RigidRepresentationBase, double, LinearDamping, getLinearDamping, setLinearDamping); SURGSIM_ADD_SERIALIZABLE_PROPERTY(RigidRepresentationBase, double, AngularDamping, getAngularDamping, setAngularDamping); SURGSIM_ADD_SERIALIZABLE_PROPERTY(RigidRepresentationBase, std::shared_ptr, Shape, getShape, setShape); } RigidRepresentationBase::~RigidRepresentationBase() { } bool RigidRepresentationBase::doInitialize() { if (m_shape != nullptr) { SURGSIM_ASSERT(m_shape->isValid()) << "An invalid shape is used in this RigidRepresentationBase."; updateProperties(); } return true; } bool RigidRepresentationBase::doWakeUp() { m_initialState.setPose(getPose()); m_currentState = m_initialState; m_finalState = m_initialState; m_previousState = m_initialState; updateGlobalInertiaMatrices(m_currentState); return true; } void RigidRepresentationBase::setInitialState(const RigidState& state) { m_initialState = state; m_currentState = state; m_previousState = state; updateGlobalInertiaMatrices(m_currentState); } void RigidRepresentationBase::resetState() { Representation::resetState(); m_currentState = m_initialState; m_previousState = m_initialState; m_finalState = m_initialState; updateGlobalInertiaMatrices(m_currentState); } const RigidState& RigidRepresentationBase::getInitialState() const { return m_initialState; } const RigidState& RigidRepresentationBase::getCurrentState() const { return m_currentState; } const RigidState& RigidRepresentationBase::getPreviousState() const { return m_previousState; } std::shared_ptr RigidRepresentationBase::createLocalization( const SurgSim::DataStructures::Location& location) { return std::move(createTypedLocalization(location)); } void RigidRepresentationBase::setDensity(double rho) { m_rho = rho; updateProperties(); } double RigidRepresentationBase::getDensity() const { return m_rho; } double RigidRepresentationBase::getMass() const { return m_mass; } const SurgSim::Math::Vector3d& RigidRepresentationBase::getMassCenter() const { return m_massCenter; } const SurgSim::Math::Matrix33d& RigidRepresentationBase::getLocalInertia() const { return m_localInertia; } void RigidRepresentationBase::setLinearDamping(double linearDamping) { m_linearDamping = linearDamping; } double RigidRepresentationBase::getLinearDamping() const { return m_linearDamping; } void RigidRepresentationBase::setAngularDamping(double angularDamping) { m_angularDamping = angularDamping; } double RigidRepresentationBase::getAngularDamping() const { return m_angularDamping; } void RigidRepresentationBase::setShape(const std::shared_ptr shape) { m_shape = shape; if (shape != nullptr) { updateProperties(); } } const std::shared_ptr RigidRepresentationBase::getShape() const { return m_shape; } void RigidRepresentationBase::updateProperties() { if (m_shape != nullptr) { SURGSIM_ASSERT(m_shape->isValid()) << "Invalid shape."; m_massCenter = m_shape->getCenter(); if (m_rho > 0.0) { m_mass = m_rho * m_shape->getVolume(); m_localInertia = m_rho * m_shape->getSecondMomentOfVolume(); m_parametersValid = SurgSim::Math::isValid(m_localInertia) && !m_localInertia.isZero() && m_localInertia.diagonal().minCoeff() > 0.0 && SurgSim::Math::isValid(m_mass) && m_mass > 0.0; } } } void SurgSim::Physics::RigidRepresentationBase::beforeUpdate(double dt) { m_previousState = m_currentState; } void SurgSim::Physics::RigidRepresentationBase::afterUpdate(double dt) { m_finalState = m_currentState; driveSceneElementPose(m_finalState.getPose() * getLocalPose().inverse()); } void RigidRepresentationBase::setCollisionRepresentation( std::shared_ptr representation) { if (m_collisionRepresentation != representation) { // If we have an old collision representation clear the dependency auto oldCollisionRep = std::dynamic_pointer_cast(m_collisionRepresentation); if (oldCollisionRep != nullptr) { oldCollisionRep->setRigidRepresentation(nullptr); } Representation::setCollisionRepresentation(representation); // If its a RigidCollisionRepresentation connect with this representation auto newCollisionRep = std::dynamic_pointer_cast(representation); if (newCollisionRep != nullptr) { newCollisionRep->setRigidRepresentation(std::static_pointer_cast(getSharedPtr())); } } } }; // Physics }; // SurgSim opensurgsim-0.7.0/SurgSim/Physics/RigidRepresentationBase.h000066400000000000000000000141721277777236100240610ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_RIGIDREPRESENTATIONBASE_H #define SURGSIM_PHYSICS_RIGIDREPRESENTATIONBASE_H #include "SurgSim/DataStructures/Location.h" #include "SurgSim/Math/Shape.h" #include "SurgSim/Physics/Representation.h" #include "SurgSim/Physics/RigidLocalization.h" #include "SurgSim/Physics/RigidState.h" namespace SurgSim { namespace Collision { class Representation; } namespace Physics { /// The RigidRepresentationBase class defines the base class for /// all rigid motion based representations (fixed, rigid body, rigid body + vtc,...) class RigidRepresentationBase : public Representation { public: /// Constructor /// \param name The rigid representation's name explicit RigidRepresentationBase(const std::string& name); /// Destructor virtual ~RigidRepresentationBase(); /// Set the initial state of the rigid representation /// \param state The initial state (pose + lin/ang velocities) /// This will also set the current/previous states to the initial state void setInitialState(const RigidState& state); void resetState() override; /// Get the initial state of the rigid representation /// \return The initial state (pose + lin/ang velocities) const RigidState& getInitialState() const; /// Get the current state of the rigid representation /// \return The current state (pose + lin/ang velocities) const RigidState& getCurrentState() const; /// Get the previous state of the rigid representation /// \return The previous state (pose + lin/ang velocities) const RigidState& getPreviousState() const; std::shared_ptr createLocalization(const SurgSim::DataStructures::Location& location) override; /// Set the mass density of the rigid representation /// \param rho The density (in Kg.m-3) void setDensity(double rho); /// Get the mass density of the rigid representation /// \return The density if it has been provided, 0 otherwise (in Kg.m-3) double getDensity() const; /// Get the mass of the rigid body /// \return The mass (in Kg) double getMass() const; /// Get the mass center of the rigid body /// \return The mass center (in local coordinate) const SurgSim::Math::Vector3d& getMassCenter() const; /// Get the local inertia 3x3 matrix of the rigid body /// \return The inertia 3x3 matrix of the object const SurgSim::Math::Matrix33d& getLocalInertia() const; /// Set the linear damping parameter /// \param linearDamping The linear damping parameter (in N.s.m-1) void setLinearDamping(double linearDamping); /// Get the linear damping parameter /// \return The linear damping parameter (in N.s.m-1) double getLinearDamping() const; /// Set the angular damping parameter /// \param angularDamping The angular damping parameter (in N.m.s.rad-1) void setAngularDamping(double angularDamping); /// Get the angular damping parameter /// \return The angular damping parameter (in N.m.s.rad-1) double getAngularDamping() const; /// Set the shape to use internally for physical parameters computation /// \param shape The shape to use for the mass/inertia calculation /// \note Also add the shape to the shape list if it has not been added yet void setShape(const std::shared_ptr shape); /// Get the shape used internally for physical parameters computation /// \return The shape used for calculation, nullptr if none exist const std::shared_ptr getShape() const; /// Set the collision representation for this physics representation, when the collision object /// is involved in a collision, the collision should be resolved inside the dynamics calculation. /// Specializes to register this representation in the collision representation if the collision representation /// is a RigidCollisionRepresentation. /// \param representation The collision representation to be used. void setCollisionRepresentation(std::shared_ptr representation) override; void beforeUpdate(double dt) override; void afterUpdate(double dt) override; protected: bool doInitialize() override; bool doWakeUp() override; /// Initial rigid representation state (useful for reset) RigidState m_initialState; /// Previous rigid representation state RigidState m_previousState; /// Current rigid representation state RigidState m_currentState; /// Last valid/final rigid representation state RigidState m_finalState; /// Validity of the parameters bool m_parametersValid; /// Density of the object (in Kg.m-3) double m_rho; /// Total mass of the object (in Kg) double m_mass; /// Linear damping parameter (in N.s.m-1 or Kg.s-1) double m_linearDamping; /// Angular damping parameter (in N.m.s.rad-1) double m_angularDamping; /// Mass-center of the object SurgSim::Math::Vector3d m_massCenter; /// Inertia matrix in local coordinates SurgSim::Math::Matrix33d m_localInertia; /// Shape to be used for the mass/inertia calculation std::shared_ptr m_shape; /// Creates typed localization. /// \tparam T Type of localization to create. /// \param location The location for the localization. /// \return The new Localization; template std::shared_ptr createTypedLocalization(const SurgSim::DataStructures::Location& location); private: /// Updates mass, mass center and inertia when density and/or shape used for mass inertia is updated. void updateProperties(); virtual void updateGlobalInertiaMatrices(const RigidState& state) = 0; }; }; // Physics }; // SurgSim #include "SurgSim/Physics/RigidRepresentationBase-inl.h" #endif // SURGSIM_PHYSICS_RIGIDREPRESENTATIONBASE_H opensurgsim-0.7.0/SurgSim/Physics/RigidRepresentation_addExternalGeneralizedForce.dox000066400000000000000000000120151277777236100312670ustar00rootroot00000000000000/*! \fn void SurgSim::Physics::RigidRepresentation::addExternalGeneralizedForce(const SurgSim::DataStructures::Location &location, const SurgSim::Math::Vector6d &generalizedForce, const SurgSim::Math::Matrix66d &K=SurgSim::Math::Matrix66d::Zero(), const SurgSim::Math::Matrix66d &D=SurgSim::Math::Matrix66d::Zero())
The location produces an extra torque and extra terms in the derivatives (stiffness/damping matrices) coming from this extra torque.
Let's note the position dof (\f$\mathbf{C}\f$,\f$\mathbf{W}\f$) and the velocity dof (\f$\mathbf{v}\f$, \f$\mathbf{w}\f$), and \f$R\f$ the 3x3 rotation matrix dependent on \f$\mathbf{W}\f$. The force (\f$\mathbf{F}\f$) applied on a point (\f$\mathbf{P}\f$) that is not the mass center (\f$\mathbf{C}\f$), produces a torque (\f$\mathbf{T}\f$) and also affect matrix derivatives (\f$K\f$ and \f$D\f$) as follow:
\f[ \mathbf{T} = \mathbf{CP} \wedge \mathbf{F} \f] Note that \f$\mathbf{CP}\f$ does not depend on the velocity (neither \f$\mathbf{v}\f$ nor \f$\mathbf{w}\f$, therefore the damping matrix is affected by the terms: \f[ \displaystyle -\frac{\partial \mathbf{T}}{\partial \mathbf{v}} = -\mathbf{CP} \wedge \frac{\partial \mathbf{F}}{\partial \mathbf{v}} = \mathbf{CP} \wedge D_{3 \times 3}^{(0, 0)} \f] \f[ \displaystyle -\frac{\partial \mathbf{T}}{\partial \mathbf{w}} = -\mathbf{CP} \wedge \frac{\partial \mathbf{F}}{\partial \mathbf{w}} = \mathbf{CP} \wedge D_{3 \times 3}^{(0, 3)} \f] Also note that \f$\mathbf{CP}\f$ does not change if the rigid translate (\f$\mathbf{C}\f$ changes), but it changes if the rotation of the rigid changes (\f$\mathbf{W}\f$ changes => \f$R\f$ changes).
Therefore \f$\mathbf{CP}\f$ is a constant vector in the rigid local space \f$ \mathbf{CP} = R.\mathbf{CP_{local}} \f$ and its derivative w.r.t. \f$\mathbf{C}\f$ is null and we get:
\f[ \displaystyle -\frac{\partial \mathbf{T}}{\partial \mathbf{C}} = -\mathbf{CP} \wedge \frac{\partial \mathbf{F}}{\partial \mathbf{C}} = \mathbf{CP} \wedge K_{3 \times 3}^{(0,0)} \f] \f[ \displaystyle -\frac{\partial \mathbf{T}}{\partial \mathbf{W}} = -\frac{\partial \mathbf{CP}}{\partial \mathbf{W}} \wedge \mathbf{F} - \mathbf{CP} \wedge \frac{\partial \mathbf{F}}{\partial \mathbf{W}} = -\frac{\partial \mathbf{CP}}{\partial \mathbf{W}} \wedge \mathbf{F} + \mathbf{CP} \wedge K_{3 \times 3}^{(0, 3)} \f] To compute \f$\frac{\partial \mathbf{CP}}{\partial \mathbf{W}} = \frac{\partial R}{\partial \mathbf{W}}.\mathbf{CP}_{local}\f$, we operate a variable change, from the rotation vector \f$\mathbf{W}\f$ to angle/axis (\f$\theta\f$, \f$\mathbf{u}\f$) representation (4 dof): \f[ \left\{ \begin{eqnarray*} \theta = |\mathbf{W}| \\ \mathbf{u} = \frac{\mathbf{W}}{|\mathbf{W}|} \end{eqnarray*} \right. \f] In this new coordinate system, we have (see reference http://en.wikipedia.org/wiki/Rotation_matrix): \f[ R(\theta, \mathbf{u}) = cos(\theta).I + sin(\theta).\left[\mathbf{u}\right] + (1-cos(\theta)).\mathbf{u} \otimes \mathbf{u} \f] where \f$\left[\mathbf{u}\right]\f$ denotes the skew symmetric matrix of the vector \f$\mathbf{u}\f$, \f$\left[\mathbf{u}\right] = \left( \begin{array}{ccc} 0 & -u^z & u^y \\ u^z & 0 & -u^x \\ -u^y & u^x & 0 \end{array} \right)\f$ and \f$\mathbf{u} \otimes \mathbf{u}\f$ the tensor product: \f$\left(\mathbf{u} \otimes \mathbf{u}^T\right)_{ij} = u^i * u^j\f$. Applying the chain derivation rule, we get: \f[ \frac{\partial R}{\partial W^{\alpha}} = \frac{\partial R}{\partial \theta}.\frac{\partial \theta}{\partial W^{\alpha}} + \frac{\partial R}{\partial u^x}.\frac{\partial u^x}{\partial W^{\alpha}} + \frac{\partial R}{\partial u^y}.\frac{\partial u^y}{\partial W^{\alpha}} + \frac{\partial R}{\partial u^z}.\frac{\partial u^z}{\partial W^{\alpha}} \f] with \f[ \frac{\partial R}{\partial \theta} = -sin(\theta).I + cos(\theta).\left[\mathbf{u}\right] + sin(\theta).\mathbf{u} \otimes \mathbf{u} \f] \f[ \frac{\partial R}{\partial u^x} = sin(\theta) \left( \begin{array}{ccc} 0 & 0 & 0 \\ 0 & 0 & -1 \\ 0 & 1 & 0 \end{array} \right) + (1 - cos(\theta)) \left( \begin{array}{ccc} 2u^x & u^y & u^z \\ u^y & 0 & 0 \\ u^z & 0 & 0 \end{array} \right) \f] \f[ \frac{\partial R}{\partial u^y} = sin(\theta) \left( \begin{array}{ccc} 0 & 0 & 1 \\ 0 & 0 & 0 \\ -1 & 0 & 0 \end{array} \right) + (1 - cos(\theta)) \left( \begin{array}{ccc} 0 & u^x & 0 \\ u^x & 2u^y & u^z \\ 0 & u^z & 0 \end{array} \right) \f] \f[ \frac{\partial R}{\partial u^z} = sin(\theta) \left( \begin{array}{ccc} 0 & -1 & 0 \\ 1 & 0 & 0 \\ 0 & 0 & 0 \end{array} \right) + (1 - cos(\theta)) \left( \begin{array}{ccc} 0 & 0 & u^x \\ 0 & 0 & u^y \\ u^x & u^y & 2u^z \end{array} \right) \f] and \f[ \frac{\partial \theta}{\partial W^{\alpha}} = \frac{W^{\alpha}}{|\mathbf{W}|} \f] \f[ \frac{\partial u}{\partial W^{\alpha}} = \frac{1}{|\mathbf{W}|} . \left( \left( \begin{array}{c} \delta^{x,\alpha} \\ \delta^{y,\alpha} \\ \delta^{z,\alpha} \end{array} \right) - \frac{W^{\alpha}}{|\mathbf{W}|} \frac{\mathbf{W}}{|\mathbf{W}|} \right) \f] */opensurgsim-0.7.0/SurgSim/Physics/RigidState.cpp000066400000000000000000000050051277777236100216720ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Math/MathConvert.h" #include "SurgSim/Physics/RigidState.h" namespace SurgSim { namespace Physics { RigidState::RigidState() : m_v(SurgSim::Math::Vector3d::Zero()), m_w(SurgSim::Math::Vector3d::Zero()), m_pose(SurgSim::Math::RigidTransform3d::Identity()) { addSerializableProperty(); } RigidState::RigidState(const RigidState& rhs) : m_v(rhs.m_v), m_w(rhs.m_w), m_pose(rhs.m_pose) { addSerializableProperty(); } void RigidState::addSerializableProperty() { SURGSIM_ADD_SERIALIZABLE_PROPERTY(RigidState, SurgSim::Math::Vector3d, LinearVelocity, getLinearVelocity, setLinearVelocity); SURGSIM_ADD_SERIALIZABLE_PROPERTY(RigidState, SurgSim::Math::Vector3d, AngularVelocity, getAngularVelocity, setAngularVelocity); SURGSIM_ADD_SERIALIZABLE_PROPERTY(RigidState, SurgSim::Math::RigidTransform3d, Pose, getPose, setPose); } RigidState& RigidState::operator=(const RigidState& rhs) { m_v = rhs.m_v; m_w = rhs.m_w; m_pose = rhs.m_pose; return *this; } RigidState::~RigidState() { } bool RigidState::operator==(const RigidState& rhs) const { return (m_pose.isApprox(rhs.m_pose) && m_v == rhs.m_v && m_w == rhs.m_w); } bool RigidState::operator!=(const RigidState& rhs) const { return !((*this) == rhs); } void RigidState::reset() { m_v.setZero(); m_w.setZero(); m_pose.setIdentity(); } const SurgSim::Math::Vector3d& RigidState::getLinearVelocity() const { return m_v; } const SurgSim::Math::Vector3d& RigidState::getAngularVelocity() const { return m_w; } void RigidState::setLinearVelocity(const SurgSim::Math::Vector3d &v) { m_v = v; } void RigidState::setAngularVelocity(const SurgSim::Math::Vector3d &w) { m_w = w; } void RigidState::setPose(const SurgSim::Math::RigidTransform3d& pose) { m_pose = pose; } const SurgSim::Math::RigidTransform3d& RigidState::getPose() const { return m_pose; } }; // Physics }; // SurgSimopensurgsim-0.7.0/SurgSim/Physics/RigidState.h000066400000000000000000000063521277777236100213450ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_RIGIDSTATE_H #define SURGSIM_PHYSICS_RIGIDSTATE_H #include "SurgSim/Framework/Accessible.h" #include "SurgSim/Framework/Macros.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Vector.h" namespace SurgSim { namespace Physics { /// The RigidState class describes a state (position and velocity information). class RigidState : public SurgSim::Framework::Accessible { public: /// Default constructor RigidState(); /// Default constructor RigidState(const RigidState& rhs); /// Copy assignment /// \param rhs Right hand side RigidState from which data are copied. /// \note 'm_functors' in base class Accessible is NOT copied. RigidState& operator=(const RigidState& rhs); /// Destructor virtual ~RigidState(); SURGSIM_CLASSNAME(SurgSim::Physics::RigidState); /// Comparison operator /// \param rhs A RigidState to compare it to /// \return True if the 2 states are equals, False otherwise bool operator==(const RigidState& rhs) const; /// Comparison operator /// \param rhs A RigidState to compare it to /// \return False if the 2 states are equals, True otherwise bool operator!=(const RigidState& rhs) const; /// Reset the state to default values /// Vectors will be filled with 0 /// Rotations will be set to identity (quaternion or matrix type) /// If you want to reset to initial values, you need to save them separately /// in another RigidState and assign it to this instance. void reset(); /// Get the linear velocity /// \return the linear velocity const SurgSim::Math::Vector3d& getLinearVelocity() const; /// Get the angular velocity /// \return the angular velocity const SurgSim::Math::Vector3d& getAngularVelocity() const; /// Set the linear velocity /// \param v The linear velocity void setLinearVelocity(const SurgSim::Math::Vector3d &v); /// Set the angular velocity /// \param w The angular velocity void setAngularVelocity(const SurgSim::Math::Vector3d &w); /// Set the rigid representation pose /// \param pose The pose to set the rigid representation to void setPose(const SurgSim::Math::RigidTransform3d& pose); /// Get the rigid representation pose /// \return A constant reference to the pose (read only) const SurgSim::Math::RigidTransform3d& getPose() const; private: /// Register accessors of serializable properties void addSerializableProperty(); /// Linear velocity SurgSim::Math::Vector3d m_v; /// Angular velocity SurgSim::Math::Vector3d m_w; /// Rigid representation pose (translation + rotation) SurgSim::Math::RigidTransform3d m_pose; }; }; // Physics }; // SurgSim #endif // SURGSIM_PHYSICS_RIGIDSTATE_Hopensurgsim-0.7.0/SurgSim/Physics/RotationVectorConstraint.cpp000066400000000000000000000065021277777236100246650ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Physics/RotationVectorConstraint.h" #include "SurgSim/Framework/Assert.h" namespace SurgSim { namespace Physics { RotationVectorConstraint::RotationVectorConstraint(ConstraintType constraintType, std::shared_ptr data, std::shared_ptr representation0, const SurgSim::DataStructures::Location& location0, std::shared_ptr representation1, const SurgSim::DataStructures::Location& location1) : Constraint(constraintType, data, representation0, location0, representation1, location1) { SURGSIM_ASSERT(constraintType == SurgSim::Physics::ConstraintType::FIXED_3DROTATION_VECTOR) << "Invalid constraint type for a rotation vector constraint"; } RotationVectorConstraint::~RotationVectorConstraint() { } void RotationVectorConstraint::doBuild(double dt, const ConstraintData& data, MlcpPhysicsProblem* mlcp, size_t indexOfRepresentation0, size_t indexOfRepresentation1, size_t indexOfConstraint) { m_implementations.first->build( dt, *m_data.get(), m_localizations.first, mlcp, indexOfRepresentation0, indexOfConstraint, CONSTRAINT_POSITIVE_SIDE); // This uses the vector mlcp->b as a temporary vector to retrieve the 1st rotation vector // mlcp->b = rotationVector1 SurgSim::Math::Vector3d rotationVector1 = mlcp->b.segment<3>(indexOfConstraint); SurgSim::Math::Quaterniond q1 = SurgSim::Math::Quaterniond::Identity(); if (rotationVector1.norm() > 1e-8) { q1 = SurgSim::Math::makeRotationQuaternion(rotationVector1.norm(), rotationVector1.normalized()); } m_implementations.second->build( dt, *m_data.get(), m_localizations.second, mlcp, indexOfRepresentation1, indexOfConstraint, CONSTRAINT_NEGATIVE_SIDE); // This uses the vector mlcp->b as a temporary vector to retrieve the 2nd rotation vector // mlcp->b = rotationVector1 - rotationVector2 SurgSim::Math::Vector3d rotationVector2 = rotationVector1 - mlcp->b.segment<3>(indexOfConstraint); SurgSim::Math::Quaterniond q2 = SurgSim::Math::Quaterniond::Identity(); if (rotationVector2.norm() > 1e-8) { q2 = SurgSim::Math::makeRotationQuaternion(rotationVector2.norm(), rotationVector2.normalized()); } // Transform the data to have a rotation vector violation as a rotation vector double angle; SurgSim::Math::Vector3d axis; SurgSim::Math::computeAngleAndAxis((q1 * q2.inverse()).normalized(), &angle, &axis); // Set mlcp->b with the properly calculated rotation vector, using a quaternion interpolation. mlcp->b.segment<3>(indexOfConstraint) = angle * axis; mlcp->constraintTypes.push_back( (m_constraintType != INVALID_CONSTRAINT) ? m_mlcpMap[m_constraintType] : Math::MLCP_INVALID_CONSTRAINT); } }; // namespace Physics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/RotationVectorConstraint.h000066400000000000000000000042231277777236100243300ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_ROTATIONVECTORCONSTRAINT_H #define SURGSIM_PHYSICS_ROTATIONVECTORCONSTRAINT_H #include "SurgSim/Physics/Constraint.h" namespace SurgSim { namespace Physics { /// Specific class for rotation vector constraints. /// It handles the specificity of the rotation vector in the constraint calculation. class RotationVectorConstraint: public Constraint { public: RotationVectorConstraint( ConstraintType constraintType, std::shared_ptr data, std::shared_ptr representation0, const SurgSim::DataStructures::Location& location0, std::shared_ptr representation1, const SurgSim::DataStructures::Location& location1); /// Destructor virtual ~RotationVectorConstraint(); protected: /// \note The rotation vector violation being calculated based on a quaternion interpolation (slerp), and this /// type of interpolation being highly non-linear, the classical way of using the implementation one after the /// other one won't work. /// Therefore, this method temporarily uses the vector mlcpPhysicsProblem->b to retrieve both representation's /// rotation vectors, then calculate the proper slerp and set the violation back in mlcpPhysicsProblem->b void doBuild(double dt, const ConstraintData& data, MlcpPhysicsProblem* mlcpPhysicsProblem, size_t indexOfRepresentation0, size_t indexOfRepresentation1, size_t indexOfConstraint) override; }; }; // namespace Physics }; // namespace SurgSim #endif // SURGSIM_PHYSICS_ROTATIONVECTORCONSTRAINT_H opensurgsim-0.7.0/SurgSim/Physics/RotationVectorConstraintData.h000066400000000000000000000122021277777236100251160ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_ROTATIONVECTORCONSTRAINTDATA_H #define SURGSIM_PHYSICS_ROTATIONVECTORCONSTRAINTDATA_H #include "SurgSim/Collision/CollisionPair.h" #include "SurgSim/Physics/ConstraintData.h" #include "SurgSim/Physics/Fem1DRepresentation.h" #include "SurgSim/Physics/Fem1DElementBeam.h" #include "SurgSim/Physics/RigidRepresentationBase.h" #include "SurgSim/Math/Vector.h" namespace SurgSim { namespace Physics { /// Class for rotation vector constraint data between a rigid/fixed representation and Fem1d beam being controlled. /// /// It considers the Fem1D rotational dof (beamRotationVector) to be the only variable to account for. /// The equation to verify is \f$ R_{rigid} * RAtGrasp_{rigid}^{-1} = R_{beam} * RAtGrasp_{beam}^{-1} \f$ /// where \f$R\f$ denotes the current prefixed object 3x3 rotation matrix /// \f$RAtGrasp\f$ is the 3x3 rotation matrix of the prefixed object at the time of the constraint creation /// and \f$R_{beam}\f$ is decomposed into the initial rotation \f$R0_{beam}\f$ and the current rotation given by the /// rotational dof /// \f$R_{rigid} * RAtGrasp_{rigid}^{-1} = R(beamRotationVector) * R0_{beam} * RAtGrasp_{beam}^{-1}\f$ /// \f$R_{rigid} * RAtGrasp_{rigid}^{-1} * RAtGrasp_{beam} * R0_{beam}^{-1} = R(beamRotationVector)\f$ /// \f$rotationVector(R_{rigid} * RAtGrasp_{rigid}^{-1} * RAtGrasp_{beam} * R0_{beam}^{-1}) = beamRotationVector\f$ class RotationVectorRigidFem1DConstraintData : public ConstraintData { public: /// Default constructor RotationVectorRigidFem1DConstraintData() : ConstraintData() { } /// Destructor virtual ~RotationVectorRigidFem1DConstraintData() { } /// Set the rigid/fixed object part that will control the fem1d /// \param rigid The rigid base representation (either a RigidRepresentation or FixedRepresentation) /// \param rigidRAtGrasp The rigid rotation at the time of the constraint creation void setRigidOrFixedRotation(std::shared_ptr rigid, const SurgSim::Math::Matrix33d& rigidRAtGrasp) { SURGSIM_ASSERT(nullptr != rigid) << "Need a valid rigid/fixed representation"; m_rigidRAtGrasp = rigidRAtGrasp; m_rigid = rigid; } /// Set the fem1d object part /// \param beams The Fem1DRepresentation to be controlled by the rigid/fixed representation orientation /// \param beamId The beam id that is going to be controlled by the rigid/fixed representation orientation void setFem1DRotation(std::shared_ptr beams, size_t beamId) { SURGSIM_ASSERT(nullptr != beams) << "Need a valid fem1D representation"; SURGSIM_ASSERT(beams->getNumFemElements() > beamId) << "The beam id " << beamId << " does not exists, the fem1d has " << beams->getNumFemElements() << " beams"; auto beam = std::dynamic_pointer_cast(beams->getFemElement(beamId)); m_beams = beams; m_beamR0 = beam->getInitialRotation(); const auto& rotVecBeamNode0 = beams->getCurrentState()->getPositions().segment<3>(6 * beam->getNodeId(0) + 3); SurgSim::Math::Matrix33d R = SurgSim::Math::Matrix33d::Identity(); if (!rotVecBeamNode0.isApprox(SurgSim::Math::Vector3d::Zero())) { R = SurgSim::Math::makeRotationMatrix(rotVecBeamNode0.norm(), rotVecBeamNode0.normalized()); } m_beamRAtGrasp = R * m_beamR0; } /// \return The current rotation vector that should correspond to the beam rotation vector /// i.e. \f$ rotationVector(R_{rigid} * RAtGrasp_{rigid}^{-1} * RAtGrasp_{beam} * R0_{beam}^{-1}) \f$ SurgSim::Math::Vector3d getCurrentRotationVector() const { SURGSIM_ASSERT(nullptr != m_rigid) << "Did you call setRigidOrFixedRotation prior to using this class ?"; SURGSIM_ASSERT(nullptr != m_beams) << "Did you call setFem1DRotation prior to using this class ?"; const auto& rigidR = m_rigid->getCurrentState().getPose().linear(); Eigen::AngleAxisd angleAxis(rigidR * m_rigidRAtGrasp.inverse() * m_beamRAtGrasp * m_beamR0.inverse()); return angleAxis.angle() * angleAxis.axis(); } private: /// Rigid/Fixed representation std::shared_ptr m_rigid; /// Rigid/Fixed rotation information at the time of the constraint creation SurgSim::Math::Matrix33d m_rigidRAtGrasp; /// Fem1D representation std::shared_ptr m_beams; /// The beam initial rotation and rotation at the time of the constraint creation SurgSim::Math::Matrix33d m_beamR0, m_beamRAtGrasp; }; }; // namespace Physics }; // namespace SurgSim #endif // SURGSIM_PHYSICS_ROTATIONVECTORCONSTRAINTDATA_H opensurgsim-0.7.0/SurgSim/Physics/SlidingConstraint.cpp000066400000000000000000000053711277777236100232770ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/DataStructures/Location.h" #include "SurgSim/Framework/Assert.h" #include "SurgSim/Math/Geometry.h" #include "SurgSim/Physics/Fem1DLocalization.h" #include "SurgSim/Physics/FemRepresentation.h" #include "SurgSim/Physics/SlidingConstraint.h" #include "SurgSim/Physics/SlidingConstraintData.h" namespace SurgSim { namespace Physics { SlidingConstraint::SlidingConstraint(ConstraintType constraintType, std::shared_ptr data, std::shared_ptr representation0, const DataStructures::Location& location0, std::shared_ptr representation1, const DataStructures::Location& location1, const Math::Vector3d& slidingDirection) : Constraint(constraintType, data, representation0, location0, representation1, location1) { m_slidingConstraintData = std::dynamic_pointer_cast(data); SURGSIM_ASSERT(m_slidingConstraintData != nullptr) << "The data sent in for the sliding constraint is not of type SlidingConstraintData."; Math::Vector3d directionEnd = m_localizations.second->calculatePosition() + slidingDirection; m_directionEnd = m_localizations.second->getElementPose().inverse() * directionEnd; } SlidingConstraint::~SlidingConstraint() { } void SlidingConstraint::doBuild(double dt, const ConstraintData& data, MlcpPhysicsProblem* mlcp, size_t indexOfRepresentation0, size_t indexOfRepresentation1, size_t indexOfConstraint) { // Update the SlidingConstraintData Math::Vector3d pointOfConstraint = m_localizations.second->calculatePosition(); Math::Vector3d slidingDirection = m_localizations.second->getElementPose() * m_directionEnd - pointOfConstraint; m_slidingConstraintData->setSlidingDirection(pointOfConstraint, slidingDirection); // Update the representation0's localization (representation1's remains the same). bool hasReachedEnd = false; m_localizations.first->moveClosestTo(pointOfConstraint, &hasReachedEnd); if (hasReachedEnd) { setActive(false); } Constraint::doBuild(dt, data, mlcp, indexOfRepresentation0, indexOfRepresentation1, indexOfConstraint); } } // namespace Physics } // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/SlidingConstraint.h000066400000000000000000000055011277777236100227370ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_SLIDINGCONSTRAINT_H #define SURGSIM_PHYSICS_SLIDINGCONSTRAINT_H #include "SurgSim/Physics/Constraint.h" #include "SurgSim/Physics/Representation.h" #include "SurgSim/Physics/SlidingConstraintData.h" namespace SurgSim { namespace Physics { /// Sliding constraint between two physics representations. /// The sliding direction vector (direction + origin) needs to be updated each physics time step. This is done by /// transforming the direction and origin into the local coordinates of the physics representations and recalculating /// them every time step. /// representation0 is the one that can 'slide' against Representation1, for example Representation0 could be a suture /// Representation1 tissue. class SlidingConstraint : public Constraint { public: /// Sets all the values for this constraints, does validation on the parameters and will throw if something /// is wrong with the constraint. /// \param constraintType The constraint type. /// \param data The data for this constraint. /// \param representation0 The moving representation e.g. suture. /// \param representation1 The non-moving representation e.g. tissue. /// \param location0, location1 Both locations of the representations involved in this constraint. /// \param slidingDirection The direction of sliding. SlidingConstraint( ConstraintType constraintType, std::shared_ptr data, std::shared_ptr representation0, const SurgSim::DataStructures::Location& location0, std::shared_ptr representation1, const SurgSim::DataStructures::Location& location1, const Math::Vector3d& slidingDirection); /// Destructor virtual ~SlidingConstraint(); private: void doBuild(double dt, const ConstraintData& data, MlcpPhysicsProblem* mlcpPhysicsProblem, size_t indexOfRepresentation0, size_t indexOfRepresentation1, size_t indexOfConstraint) override; /// The sliding constraint data. std::shared_ptr m_slidingConstraintData; /// The end of the sliding direction, local to the representation1. Math::Vector3d m_directionEnd; }; }; // namespace Physics }; // namespace SurgSim #endif // SURGSIM_PHYSICS_SLIDINGCONSTRAINT_H opensurgsim-0.7.0/SurgSim/Physics/SlidingConstraintData.cpp000066400000000000000000000043311277777236100240640ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Physics/SlidingConstraintData.h" #include "SurgSim/Math/Matrix.h" namespace SurgSim { namespace Physics { SlidingConstraintData::SlidingConstraintData() : ConstraintData(), m_mu(0.5) { m_normals[0].setZero(); m_normals[1].setZero(); m_tangent.setZero(); } SlidingConstraintData::SlidingConstraintData(const SurgSim::Math::Vector3d& point, const SurgSim::Math::Vector3d& direction) : ConstraintData(), m_mu(0.5) { setSlidingDirection(point, direction); } SlidingConstraintData::~SlidingConstraintData() { } void SlidingConstraintData::setSlidingDirection(const SurgSim::Math::Vector3d& point, const SurgSim::Math::Vector3d& direction) { m_point = point; m_slidingDirection = direction; Math::buildOrthonormalBasis(&m_slidingDirection, &m_normals[0], &m_normals[1]); m_tangent = direction; m_distanceTangent = -point.dot(m_tangent); } void SlidingConstraintData::setFrictionCoefficient(double mu) { m_mu = mu; } double SlidingConstraintData::getFrictionCoefficient() const { return m_mu; } const Math::RigidTransform3d SlidingConstraintData::getPose() { SurgSim::Math::Matrix33d rotation; rotation << m_slidingDirection, m_normals[0], m_normals[1]; return SurgSim::Math::makeRigidTransform(rotation, m_point); } const std::array& SlidingConstraintData::getNormals() const { return m_normals; } const Math::Vector3d& SlidingConstraintData::getTangent() const { return m_tangent; } const double SlidingConstraintData::getDistanceTangent() const { return m_distanceTangent; } } // namespace Physics } // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/SlidingConstraintData.h000066400000000000000000000060541277777236100235350ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_SLIDINGCONSTRAINTDATA_H #define SURGSIM_PHYSICS_SLIDINGCONSTRAINTDATA_H #include "SurgSim/Physics/ConstraintData.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Math/RigidTransform.h" namespace SurgSim { namespace Physics { /// Class for Frictionless sliding constraint (stores two planes, the intersection of which, is the sliding direction) class SlidingConstraintData : public ConstraintData { public: /// Default constructor SlidingConstraintData(); /// Constructor /// \param point The point through which the sliding direction vector passes. /// \param direction The sliding direction vector. SlidingConstraintData(const SurgSim::Math::Vector3d& point, const SurgSim::Math::Vector3d& direction); /// Destructor virtual ~SlidingConstraintData(); /// Calculate the two plane equations based on the given sliding direction. /// \param point The point through which the sliding direction vector passes. /// \param direction The sliding direction vector. void setSlidingDirection(const SurgSim::Math::Vector3d& point, const SurgSim::Math::Vector3d& direction); /// Set the friction coefficient for a frictional sliding constraint /// \param mu The friction coefficient void setFrictionCoefficient(double mu); /// \return The friction coefficient (default is 0.5) /// \note The friction coefficient is only used for frictional constraint, it is discarded othersise. double getFrictionCoefficient() const; /// \return The normals of the two planes. const std::array& getNormals() const; /// /return The pose of constraint const Math::RigidTransform3d getPose(); /// \return The tangent (direction defined by the two planes). const Math::Vector3d& getTangent() const; /// \return The distance from origin of the planes direction (tangent). const double getDistanceTangent() const; private: /// The normals of the two planes. std::array m_normals; /// The point of constraint. Math::Vector3d m_point; /// The sliding direction (intersection of the two planes). Math::Vector3d m_slidingDirection; /// The tangent of the two planes. Math::Vector3d m_tangent; /// The distance from origin of the tangential plane. double m_distanceTangent; /// Friction coefficient for frictional constraint (unused for frictionless constraint). double m_mu; }; } // namespace Physics } // namespace SurgSim #endif // SURGSIM_PHYSICS_SLIDINGCONSTRAINTDATA_H opensurgsim-0.7.0/SurgSim/Physics/SolveMlcp.cpp000066400000000000000000000055211277777236100215420ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Physics/SolveMlcp.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Physics/Constraint.h" #include "SurgSim/Physics/ContactConstraintData.h" #include "SurgSim/Physics/PhysicsManagerState.h" namespace SurgSim { namespace Physics { SolveMlcp::SolveMlcp(bool doCopyState) : Computation(doCopyState) { } SolveMlcp::~SolveMlcp() {} std::shared_ptr SolveMlcp::doUpdate(const double& dt, const std::shared_ptr& state) { std::shared_ptr result = state; // Solve the Mlcp using a Gauss-Seidel solver m_gaussSeidelSolver.solve(result->getMlcpProblem(), &(result->getMlcpSolution())); // lambda const Eigen::VectorXd& lambda = result->getMlcpSolution().x; if (lambda.size() == 0) { return result; } // Copy constraintForces back to contact auto& constraintsMapping = result->getConstraintsMapping(); const auto& activeConstraints = result->getActiveConstraints(); for (auto& constraint : activeConstraints) { if (constraint->getType() != ConstraintType::FRICTIONLESS_3DCONTACT) { continue; } ptrdiff_t indexConstraint = constraintsMapping.getValue(constraint.get()); SURGSIM_ASSERT(indexConstraint >= 0) << "Index for constraint is invalid: " << indexConstraint << std::endl; auto contactConstraintData = std::dynamic_pointer_cast(constraint->getData()); SURGSIM_ASSERT(contactConstraintData != nullptr) << ""; auto contact = contactConstraintData->getContact(); contact->force = lambda[indexConstraint] * contact->normal; } return result; } void SolveMlcp::setMaxIterations(size_t maxIterations) { m_gaussSeidelSolver.setMaxIterations(maxIterations); } size_t SolveMlcp::getMaxIterations() const { return m_gaussSeidelSolver.getMaxIterations(); } void SolveMlcp::setPrecision(double epsilon) { m_gaussSeidelSolver.setEpsilonConvergence(epsilon); } double SolveMlcp::getPrecision() const { return m_gaussSeidelSolver.getEpsilonConvergence(); } void SolveMlcp::setContactTolerance(double epsilon) { m_gaussSeidelSolver.setContactTolerance(epsilon); } double SolveMlcp::getContactTolerance() const { return m_gaussSeidelSolver.getContactTolerance(); } }; // Physics }; // SurgSim opensurgsim-0.7.0/SurgSim/Physics/SolveMlcp.h000066400000000000000000000050461277777236100212110ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_SOLVEMLCP_H #define SURGSIM_PHYSICS_SOLVEMLCP_H #include #include "SurgSim/Framework/Macros.h" #include "SurgSim/Math/MlcpGaussSeidelSolver.h" #include "SurgSim/Physics/Computation.h" namespace SurgSim { namespace Physics { /// Solve the system Mixed Linear Complementarity Problem (Mlcp) class SolveMlcp : public Computation { public: /// Constructor /// \param doCopyState Specify if the ouput state is a copy or not of the input state in Computation::Update() explicit SolveMlcp(bool doCopyState = false); SURGSIM_CLASSNAME(SurgSim::Physics::SolveMlcp); /// Destructor virtual ~SolveMlcp(); /// Set the maximum number of iterations for the MLCP solver. /// \param maxIterations The maximum number of iterations. void setMaxIterations(size_t maxIterations); /// Get the maximum number of iterations for the MLCP solver. /// \return The maximum number of iterations. size_t getMaxIterations() const; /// Set the precision of the MLCP solver. /// \param epsilon The precision. void setPrecision(double epsilon); /// Get the precision of the MLCP solver. /// \return The precision. double getPrecision() const; /// Set the contact tolerance for the MLCP solver. /// \param epsilon The contact tolerance. void setContactTolerance(double epsilon); /// Get the contact tolerance for the MLCP solver. /// \return The contact tolerance. double getContactTolerance() const; protected: /// Override doUpdate from superclass /// \param dt The time step /// \param state The Physics manager state /// \return The updated physics manager state (input updated or copied updated) std::shared_ptr doUpdate(const double& dt, const std::shared_ptr& state) override; private: /// The Gauss-Seidel Mlcp solver SurgSim::Math::MlcpGaussSeidelSolver m_gaussSeidelSolver; }; }; // Physics }; // SurgSim #endif // SURGSIM_PHYSICS_SOLVEMLCP_H opensurgsim-0.7.0/SurgSim/Physics/Spring.cpp000066400000000000000000000021141277777236100210730ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Physics/Spring.h" namespace SurgSim { namespace Physics { Spring::~Spring() {} void Spring::initialize(const SurgSim::Math::OdeState& state) { } size_t Spring::getNumNodes() const { return m_nodeIds.size(); } size_t Spring::getNodeId(size_t springNodeId) const { return m_nodeIds[springNodeId]; } const std::vector& Spring::getNodeIds() const { return m_nodeIds; } } // namespace Physics } // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/Spring.h000066400000000000000000000116021277777236100205420ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_SPRING_H #define SURGSIM_PHYSICS_SPRING_H #include #include "SurgSim/Math/Matrix.h" #include "SurgSim/Math/SparseMatrix.h" #include "SurgSim/Math/Vector.h" namespace SurgSim { namespace Math { class OdeState; }; namespace Physics { /// Base class for all springs /// It handles the node ids to which it is connected and requires all derived classes /// to compute the force and its derivatives (the stiffness and damping matrices) /// A extra method also exist to compute all of them at once for performance purposes. /// It holds on to the actual computed values (m_f, m_K, m_D) as its size is not predefined from outside /// and would requires intensive (de)allocation or a temporary variable anyway class Spring { public: /// Virtual destructor virtual ~Spring(); /// Initialize the Spring once everything has been set /// \param state The state to initialize the Spring with virtual void initialize(const SurgSim::Math::OdeState& state); /// Gets the number of nodes the spring is connecting /// \return The number of nodes size_t getNumNodes() const; /// Gets the springNodeId-th node id /// \return The requested node id size_t getNodeId(size_t springNodeId) const; /// Gets the node ids for this spring /// \return A vector containing the node ids on which the spring is attached const std::vector& getNodeIds() const; /// Adds the spring force (computed for a given state) to a complete system force vector F (assembly) /// \param state The state to compute the force with /// \param[in,out] F The complete system force vector to add the spring force into /// \param scale A factor to scale the added force with virtual void addForce(const SurgSim::Math::OdeState& state, SurgSim::Math::Vector* F, double scale = 1.0) = 0; /// Adds the spring damping matrix D (= -df/dv) (computed for a given state) to a complete system damping matrix /// D (assembly) /// \param state The state to compute the damping matrix with /// \param[in,out] D The complete system damping matrix to add the spring damping matrix into /// \param scale A factor to scale the added damping matrix with virtual void addDamping(const SurgSim::Math::OdeState& state, SurgSim::Math::SparseMatrix* D, double scale = 1.0) = 0; /// Adds the spring stiffness matrix K (= -df/dx) (computed for a given state) to a complete system stiffness /// matrix K (assembly) /// \param state The state to compute the stiffness matrix with /// \param[in,out] K The complete system stiffness matrix to add the spring stiffness matrix into /// \param scale A factor to scale the added stiffness matrix with virtual void addStiffness(const SurgSim::Math::OdeState& state, SurgSim::Math::SparseMatrix* K, double scale = 1.0) = 0; /// Adds the spring force vector, mass, stiffness and damping matrices (computed for a given state) into a /// complete system data structure F, D, K (assembly) /// \param state The state to compute everything with /// \param[in,out] F The complete system force vector to add the spring force into /// \param[in,out] D The complete system damping matrix to add the spring damping matrix into /// \param[in,out] K The complete system stiffness matrix to add the spring stiffness matrix into virtual void addFDK(const SurgSim::Math::OdeState& state, SurgSim::Math::Vector* F, SurgSim::Math::SparseMatrix* D, SurgSim::Math::SparseMatrix* K) = 0; /// Adds the spring matrix-vector contribution F += (alphaD.D + alphaK.K).x (computed for a given /// state) into a complete system data structure F (assembly) /// \param state The state to compute everything with /// \param alphaD The scaling factor for the damping contribution /// \param alphaK The scaling factor for the stiffness contribution /// \param x A complete system vector to use as the vector in the matrix-vector multiplication /// \param[in,out] F The complete system force vector to add the element matrix-vector contribution into virtual void addMatVec(const SurgSim::Math::OdeState& state, double alphaD, double alphaK, const SurgSim::Math::Vector& x, SurgSim::Math::Vector* F) = 0; protected: /// Node ids connected by this spring std::vector m_nodeIds; }; } // namespace Physics } // namespace SurgSim #endif // SURGSIM_PHYSICS_SPRING_H opensurgsim-0.7.0/SurgSim/Physics/UnitTests/000077500000000000000000000000001277777236100210715ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Physics/UnitTests/BuildMlcpTests.cpp000066400000000000000000000425401277777236100245000ustar00rootroot00000000000000// Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file BuildMlcpTests.cpp /// Simple Test for BuildMlcp calculation #include #include #include #include "SurgSim/Physics/BuildMlcp.h" #include "SurgSim/Physics/UnitTests/CommonTests.h" #include "SurgSim/Physics/UnitTests/MockObjects.h" namespace SurgSim { namespace Physics { /// Redefine class class BuildMlcpTests : public CommonTests { public: void SetUp() { CommonTests::SetUp(); // Create the BuildMlcp computation m_buildMlcpComputation = std::make_shared(); } protected: /// The Build Mlcp computation std::shared_ptr m_buildMlcpComputation; }; TEST_F(BuildMlcpTests, NoRepresentationNoConstraintTest) { // Run the BuildMlcp computation... ASSERT_NO_THROW(m_buildMlcpComputation->update(dt, m_physicsManagerState)); MlcpPhysicsProblem& mlcpProblem = m_physicsManagerState->getMlcpProblem(); MlcpPhysicsSolution& mlcpSolution = m_physicsManagerState->getMlcpSolution(); // Test that the Mlcp is as expected EXPECT_EQ(0, mlcpProblem.getSize()); EXPECT_EQ(0, mlcpProblem.A.rows()); EXPECT_EQ(0, mlcpProblem.A.cols()); EXPECT_EQ(0, mlcpProblem.b.rows()); EXPECT_EQ(0, mlcpProblem.CHt.rows()); EXPECT_EQ(0, mlcpProblem.CHt.cols()); EXPECT_EQ(0, mlcpProblem.H.rows()); EXPECT_EQ(0, mlcpProblem.H.cols()); EXPECT_EQ(0, mlcpProblem.mu.rows()); EXPECT_EQ(0u, mlcpProblem.constraintTypes.size()); EXPECT_TRUE(mlcpProblem.isConsistent()); EXPECT_EQ(0, mlcpSolution.x.rows()); EXPECT_EQ(0, mlcpSolution.dofCorrection.rows()); } TEST_F(BuildMlcpTests, OneRepresentationNoConstraintTest) { // Prep the list of representations: use only 1 representation m_usedRepresentations.push_back(m_allRepresentations[0]); // Set the representation list in the Physics Manager State m_physicsManagerState->setRepresentations(m_usedRepresentations); // Run the BuildMlcp computation... m_buildMlcpComputation->update(dt, m_physicsManagerState); MlcpPhysicsProblem& mlcpProblem = m_physicsManagerState->getMlcpProblem(); MlcpPhysicsSolution& mlcpSolution = m_physicsManagerState->getMlcpSolution(); // Test that the Mlcp is as expected EXPECT_EQ(0, mlcpProblem.getSize()); EXPECT_EQ(0, mlcpProblem.A.rows()); EXPECT_EQ(0, mlcpProblem.A.cols()); EXPECT_EQ(0, mlcpProblem.b.rows()); EXPECT_EQ(6, mlcpProblem.CHt.rows()); EXPECT_EQ(0, mlcpProblem.CHt.cols()); EXPECT_EQ(0, mlcpProblem.H.rows()); EXPECT_EQ(6, mlcpProblem.H.cols()); EXPECT_EQ(0, mlcpProblem.mu.rows()); EXPECT_EQ(0u, mlcpProblem.constraintTypes.size()); EXPECT_TRUE(mlcpProblem.isConsistent()); EXPECT_EQ(0, mlcpSolution.x.rows()); EXPECT_EQ(6, mlcpSolution.dofCorrection.rows()); EXPECT_EQ(0, m_physicsManagerState->getRepresentationsMapping().getValue(m_allRepresentations[0].get())); } TEST_F(BuildMlcpTests, TwoRepresentationsNoConstraintTest) { // Prep the list of representations: use 2 representations m_usedRepresentations.push_back(m_allRepresentations[0]); m_usedRepresentations.push_back(m_allRepresentations[1]); // Set the representation list in the Physics Manager State m_physicsManagerState->setRepresentations(m_usedRepresentations); // Run the BuildMlcp computation... m_buildMlcpComputation->update(dt, m_physicsManagerState); MlcpPhysicsProblem& mlcpProblem = m_physicsManagerState->getMlcpProblem(); MlcpPhysicsSolution& mlcpSolution = m_physicsManagerState->getMlcpSolution(); // Test that the Mlcp is as expected EXPECT_EQ(0, mlcpProblem.getSize()); EXPECT_EQ(0, mlcpProblem.A.rows()); EXPECT_EQ(0, mlcpProblem.A.cols()); EXPECT_EQ(0, mlcpProblem.b.rows()); EXPECT_EQ(12, mlcpProblem.CHt.rows()); EXPECT_EQ(0, mlcpProblem.CHt.cols()); EXPECT_EQ(0, mlcpProblem.H.rows()); EXPECT_EQ(12, mlcpProblem.H.cols()); EXPECT_EQ(0, mlcpProblem.mu.rows()); EXPECT_EQ(0u, mlcpProblem.constraintTypes.size()); EXPECT_TRUE(mlcpProblem.isConsistent()); EXPECT_EQ(0, mlcpSolution.x.rows()); EXPECT_EQ(12, mlcpSolution.dofCorrection.rows()); EXPECT_EQ(0, m_physicsManagerState->getRepresentationsMapping().getValue(m_allRepresentations[0].get())); EXPECT_EQ(m_allRepresentations[0]->getNumDof(), m_physicsManagerState->getRepresentationsMapping().getValue(m_allRepresentations[1].get())); } TEST_F(BuildMlcpTests, OneRepresentationOneConstraintTest) { // Prep the list of representations: use only 1 rigid representation + 1 fixed m_usedRepresentations.push_back(m_allRepresentations[0]); m_usedRepresentations.push_back(m_fixedWorldRepresentation); // Set the representation list in the Physics Manager State m_physicsManagerState->setRepresentations(m_usedRepresentations); // The type of constraint. auto constraintType = SurgSim::Physics::FRICTIONLESS_3DCONTACT; // Prep the list of constraints: use only 1 constraint { // Define the constraint specific data std::shared_ptr data = std::make_shared(); data->setPlaneEquation(SurgSim::Math::Vector3d(0.0, 1.0, 0.0), 0.0); // Set up the constraint std::shared_ptr constraint = std::make_shared(constraintType, data, m_usedRepresentations[0], SurgSim::DataStructures::Location(SurgSim::Math::Vector3d::Zero()), m_fixedWorldRepresentation, SurgSim::DataStructures::Location(SurgSim::Math::Vector3d::Zero())); // Register the constraint in the list of used constraints for this test m_usedConstraints.push_back(constraint); } // Set the constraint list in the Physics Manager State m_physicsManagerState->setConstraintGroup(CONSTRAINT_GROUP_TYPE_CONTACT, m_usedConstraints); // Run the BuildMlcp computation... m_buildMlcpComputation->update(dt, m_physicsManagerState); MlcpPhysicsProblem& mlcpProblem = m_physicsManagerState->getMlcpProblem(); MlcpPhysicsSolution& mlcpSolution = m_physicsManagerState->getMlcpSolution(); // Test that the Mlcp is as expected EXPECT_EQ(1, mlcpProblem.getSize()); EXPECT_EQ(1, mlcpProblem.A.rows()); EXPECT_EQ(1, mlcpProblem.A.cols()); EXPECT_EQ(1, mlcpProblem.b.rows()); EXPECT_EQ(6, mlcpProblem.CHt.rows()); EXPECT_EQ(1, mlcpProblem.CHt.cols()); EXPECT_EQ(1, mlcpProblem.H.rows()); EXPECT_EQ(6, mlcpProblem.H.cols()); EXPECT_EQ(1, mlcpProblem.mu.rows()); EXPECT_EQ(1u, mlcpProblem.constraintTypes.size()); EXPECT_EQ(SurgSim::Math::MLCP_UNILATERAL_3D_FRICTIONLESS_CONSTRAINT, mlcpProblem.constraintTypes[0]); EXPECT_TRUE(mlcpProblem.isConsistent()); EXPECT_EQ(1, mlcpSolution.x.rows()); EXPECT_EQ(6, mlcpSolution.dofCorrection.rows()); EXPECT_EQ(0, m_physicsManagerState->getRepresentationsMapping().getValue(m_allRepresentations[0].get())); EXPECT_EQ(m_allRepresentations[0]->getNumDof(), m_physicsManagerState->getRepresentationsMapping().getValue(m_fixedWorldRepresentation.get())); EXPECT_EQ(0, m_physicsManagerState->getConstraintsMapping().getValue(m_usedConstraints[0].get())); } TEST_F(BuildMlcpTests, TwoRepresentationsOneConstraintSize3Test) { // Prep the list of representations: use only 1 rigid representation + 1 fixed m_usedRepresentations.push_back(m_allRepresentations[0]); m_usedRepresentations.push_back(m_fixedWorldRepresentation); // Set the representation list in the Physics Manager State m_physicsManagerState->setRepresentations(m_usedRepresentations); // The type of constraint. auto constraintType = SurgSim::Physics::FIXED_3DPOINT; // Add constraint to factory. ConstraintImplementation::getFactory().addImplementation( typeid(RigidRepresentation), std::make_shared()); ConstraintImplementation::getFactory().addImplementation( typeid(FixedRepresentation), std::make_shared()); // Prep the list of constraints: use only 1 constraint { auto data = std::make_shared(); // Set up the constraint std::shared_ptr constraint = std::make_shared(constraintType, data, m_usedRepresentations[0], SurgSim::DataStructures::Location(SurgSim::Math::Vector3d::Zero()), m_fixedWorldRepresentation, SurgSim::DataStructures::Location(SurgSim::Math::Vector3d::Zero())); // Register the constraint in the list of used constraints for this test m_usedConstraints.push_back(constraint); } // Set the constraint list in the Physics Manager State m_physicsManagerState->setConstraintGroup(CONSTRAINT_GROUP_TYPE_CONTACT, m_usedConstraints); // Run the BuildMlcp computation... m_buildMlcpComputation->update(dt, m_physicsManagerState); MlcpPhysicsProblem& mlcpProblem = m_physicsManagerState->getMlcpProblem(); MlcpPhysicsSolution& mlcpSolution = m_physicsManagerState->getMlcpSolution(); // Test that the Mlcp is as expected EXPECT_EQ(3, mlcpProblem.getSize()); EXPECT_EQ(3, mlcpProblem.A.rows()); EXPECT_EQ(3, mlcpProblem.A.cols()); EXPECT_EQ(3, mlcpProblem.b.rows()); EXPECT_EQ(6, mlcpProblem.CHt.rows()); EXPECT_EQ(3, mlcpProblem.CHt.cols()); EXPECT_EQ(3, mlcpProblem.H.rows()); EXPECT_EQ(6, mlcpProblem.H.cols()); EXPECT_EQ(3, mlcpProblem.mu.rows()); EXPECT_EQ(1u, mlcpProblem.constraintTypes.size()); EXPECT_EQ(SurgSim::Math::MLCP_BILATERAL_3D_CONSTRAINT, mlcpProblem.constraintTypes[0]); EXPECT_TRUE(mlcpProblem.isConsistent()); EXPECT_EQ(3, mlcpSolution.x.rows()); EXPECT_EQ(6, mlcpSolution.dofCorrection.rows()); EXPECT_EQ(0, m_physicsManagerState->getRepresentationsMapping().getValue(m_allRepresentations[0].get())); EXPECT_EQ(m_allRepresentations[0]->getNumDof(), m_physicsManagerState->getRepresentationsMapping().getValue(m_fixedWorldRepresentation.get())); EXPECT_EQ(0, m_physicsManagerState->getConstraintsMapping().getValue(m_usedConstraints[0].get())); } TEST_F(BuildMlcpTests, OneRepresentationTwoConstraintsTest) { // Prep the list of representations: use only 1 rigid representation + 1 fixed m_usedRepresentations.push_back(m_allRepresentations[0]); m_usedRepresentations.push_back(m_fixedWorldRepresentation); // Set the representation list in the Physics Manager State m_physicsManagerState->setRepresentations(m_usedRepresentations); // The type of constraint. auto constraintType = SurgSim::Physics::FRICTIONLESS_3DCONTACT; // Prep the list of constraints: use 2 constraints { // Define the constraint specific data std::shared_ptr data = std::make_shared(); data->setPlaneEquation(SurgSim::Math::Vector3d(0.0, 1.0, 0.0), 0.0); // Set up the constraint std::shared_ptr constraint = std::make_shared(constraintType, data, m_usedRepresentations[0], SurgSim::DataStructures::Location(SurgSim::Math::Vector3d::Zero()), m_fixedWorldRepresentation, SurgSim::DataStructures::Location(SurgSim::Math::Vector3d::Zero())); // Register the constraint in the list of used constraints for this test m_usedConstraints.push_back(constraint); } { // Define the constraint specific data std::shared_ptr data = std::make_shared(); data->setPlaneEquation(SurgSim::Math::Vector3d(0.0, 1.0, 0.0), 0.0); // Set up the constraint std::shared_ptr constraint = std::make_shared(constraintType, data, m_usedRepresentations[0], SurgSim::DataStructures::Location(SurgSim::Math::Vector3d::Ones()), m_fixedWorldRepresentation, SurgSim::DataStructures::Location(SurgSim::Math::Vector3d::Ones())); // Register the constraint in the list of used constraints for this test m_usedConstraints.push_back(constraint); } // Set the constraint list in the Physics Manager State m_physicsManagerState->setConstraintGroup(CONSTRAINT_GROUP_TYPE_CONTACT, m_usedConstraints); // Run the BuildMlcp computation... m_buildMlcpComputation->update(dt, m_physicsManagerState); MlcpPhysicsProblem& mlcpProblem = m_physicsManagerState->getMlcpProblem(); MlcpPhysicsSolution& mlcpSolution = m_physicsManagerState->getMlcpSolution(); // Test that the Mlcp is as expected EXPECT_EQ(2, mlcpProblem.getSize()); EXPECT_EQ(2, mlcpProblem.A.rows()); EXPECT_EQ(2, mlcpProblem.A.cols()); EXPECT_EQ(2, mlcpProblem.b.rows()); EXPECT_EQ(6, mlcpProblem.CHt.rows()); EXPECT_EQ(2, mlcpProblem.CHt.cols()); EXPECT_EQ(2, mlcpProblem.H.rows()); EXPECT_EQ(6, mlcpProblem.H.cols()); EXPECT_EQ(2, mlcpProblem.mu.rows()); EXPECT_EQ(2u, mlcpProblem.constraintTypes.size()); EXPECT_EQ(SurgSim::Math::MLCP_UNILATERAL_3D_FRICTIONLESS_CONSTRAINT, mlcpProblem.constraintTypes[0]); EXPECT_EQ(SurgSim::Math::MLCP_UNILATERAL_3D_FRICTIONLESS_CONSTRAINT, mlcpProblem.constraintTypes[1]); EXPECT_TRUE(mlcpProblem.isConsistent()); EXPECT_EQ(2, mlcpSolution.x.rows()); EXPECT_EQ(6, mlcpSolution.dofCorrection.rows()); EXPECT_EQ(0, m_physicsManagerState->getRepresentationsMapping().getValue(m_allRepresentations[0].get())); EXPECT_EQ(m_allRepresentations[0]->getNumDof(), m_physicsManagerState->getRepresentationsMapping().getValue(m_fixedWorldRepresentation.get())); EXPECT_EQ(0, m_physicsManagerState->getConstraintsMapping().getValue(m_usedConstraints[0].get())); EXPECT_EQ(m_usedConstraints[0]->getNumDof(), m_physicsManagerState->getConstraintsMapping().getValue(m_usedConstraints[1].get())); } TEST_F(BuildMlcpTests, TwoRepresentationsTwoConstraintsTest) { SurgSim::Math::Vector3d pointOrigin = SurgSim::Math::Vector3d::Zero(); SurgSim::Math::Vector3d planeDirection(0.0, 1.0, 0.0); double planeDistance = 0.0; SurgSim::Math::Vector3d pointOne = planeDirection * 1.0; // Prep the list of representations: use only 1 rigid representation + 1 fixed m_usedRepresentations.push_back(m_allRepresentations[0]); m_usedRepresentations.push_back(m_allRepresentations[1]); // Set the representation list in the Physics Manager State m_physicsManagerState->setRepresentations(m_usedRepresentations); // The type of constraint. auto constraintType = SurgSim::Physics::FRICTIONLESS_3DCONTACT; // Prep the list of constraints: use 2 constraints { // Define the constraint specific data std::shared_ptr data = std::make_shared(); data->setPlaneEquation(planeDirection, planeDistance); // Set up the constraint std::shared_ptr constraint = std::make_shared(constraintType, data, m_usedRepresentations[0], SurgSim::DataStructures::Location(pointOrigin), m_usedRepresentations[1], SurgSim::DataStructures::Location(pointOrigin)); // Register the constraint in the list of used constraints for this test m_usedConstraints.push_back(constraint); } { // Define the constraint specific data std::shared_ptr data = std::make_shared(); data->setPlaneEquation(planeDirection, planeDistance); // Set up the constraint std::shared_ptr constraint = std::make_shared(constraintType, data, m_usedRepresentations[0], SurgSim::DataStructures::Location(pointOrigin), m_usedRepresentations[1], SurgSim::DataStructures::Location(pointOne)); // Register the constraint in the list of used constraints for this test m_usedConstraints.push_back(constraint); } // Set the constraint list in the Physics Manager State m_physicsManagerState->setConstraintGroup(CONSTRAINT_GROUP_TYPE_CONTACT, m_usedConstraints); // Run the BuildMlcp computation... m_buildMlcpComputation->update(dt, m_physicsManagerState); MlcpPhysicsProblem& mlcpProblem = m_physicsManagerState->getMlcpProblem(); MlcpPhysicsSolution& mlcpSolution = m_physicsManagerState->getMlcpSolution(); // Test that the Mlcp is as expected EXPECT_EQ(2, mlcpProblem.getSize()); EXPECT_EQ(2, mlcpProblem.A.rows()); EXPECT_EQ(2, mlcpProblem.A.cols()); EXPECT_EQ(2, mlcpProblem.b.rows()); // One the 1st constraint, both location are the origin (0 0 0), so there is no resulting violation EXPECT_NEAR(0.0, mlcpProblem.b[0], epsilon); // One the 2nd constraint, the constraints points are (0 0 0) and (0 1 0), so the resulting // violation along the normal direction (0 1 0) should be -1.0 EXPECT_NEAR(planeDirection.dot(pointOrigin - pointOne), mlcpProblem.b[1], epsilon); EXPECT_EQ(12, mlcpProblem.CHt.rows()); EXPECT_EQ(2, mlcpProblem.CHt.cols()); EXPECT_EQ(2, mlcpProblem.H.rows()); EXPECT_EQ(12, mlcpProblem.H.cols()); EXPECT_EQ(2, mlcpProblem.mu.rows()); EXPECT_EQ(2u, mlcpProblem.constraintTypes.size()); EXPECT_EQ(SurgSim::Math::MLCP_UNILATERAL_3D_FRICTIONLESS_CONSTRAINT, mlcpProblem.constraintTypes[0]); EXPECT_EQ(SurgSim::Math::MLCP_UNILATERAL_3D_FRICTIONLESS_CONSTRAINT, mlcpProblem.constraintTypes[1]); EXPECT_TRUE(mlcpProblem.isConsistent()); EXPECT_EQ(2, mlcpSolution.x.rows()); EXPECT_EQ(12, mlcpSolution.dofCorrection.rows()); EXPECT_EQ(0, m_physicsManagerState->getRepresentationsMapping().getValue(m_allRepresentations[0].get())); EXPECT_EQ(m_allRepresentations[0]->getNumDof(), m_physicsManagerState->getRepresentationsMapping().getValue(m_allRepresentations[1].get())); EXPECT_EQ(0, m_physicsManagerState->getConstraintsMapping().getValue(m_usedConstraints[0].get())); EXPECT_EQ(m_usedConstraints[0]->getNumDof(), m_physicsManagerState->getConstraintsMapping().getValue(m_usedConstraints[1].get())); } }; // namespace Physics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/UnitTests/CMakeLists.txt000066400000000000000000000076601277777236100236420ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2012-2016, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. include_directories( ${gtest_SOURCE_DIR}/include ${gmock_SOURCE_DIR}/include ) set(UNIT_TEST_SOURCES BuildMlcpTests.cpp CcdCollisionLoopTest.cpp ComputationGroupTest.cpp ComputationTests.cpp ConstraintComponentTests.cpp ConstraintImplementationFactoryTests.cpp ConstraintImplementationTests.cpp ConstraintTests.cpp ContactConstraintDataTests.cpp ContactConstraintGenerationTests.cpp ContactFilteringTest.cpp DcdCollisionTests.cpp DeformableCollisionRepresentationTest.cpp DeformableRepresentationTest.cpp EigenGtestAsserts.cpp Fem1DConstraintFixedPointTests.cpp Fem1DConstraintFixedRotationVectorTests.cpp Fem1DConstraintFrictionalSlidingTests.cpp Fem1DConstraintFrictionlessContactTests.cpp Fem1DConstraintFrictionlessSlidingTests.cpp Fem1DElementBeamTests.cpp Fem1DLocalizationTest.cpp Fem1DMechanicalValidationTests.cpp Fem1DPlyReaderDelegateTests.cpp Fem1DRepresentationTests.cpp Fem2DConstraintFixedPointTests.cpp Fem2DConstraintFrictionalSlidingTests.cpp Fem2DConstraintFrictionlessContactTests.cpp Fem2DConstraintFrictionlessSlidingTests.cpp Fem2DElementTriangleTests.cpp Fem2DLocalizationTest.cpp Fem2DMechanicalValidationTests.cpp Fem2DPlyReaderDelegateTests.cpp Fem2DRepresentationTests.cpp Fem3DConstraintFixedPointTests.cpp Fem3DConstraintFrictionalSlidingTests.cpp Fem3DConstraintFrictionlessContactTests.cpp Fem3DConstraintFrictionlessSlidingTests.cpp Fem3DElementCorotationalTetrahedronTests.cpp Fem3DElementCubeTests.cpp Fem3DElementTetrahedronTests.cpp Fem3DLocalizationTest.cpp Fem3DPlyReaderDelegateTests.cpp Fem3DRepresentationTests.cpp FemElementTests.cpp FemLocalizationTest.cpp FemRepresentationTests.cpp FixedConstraintFixedPointTests.cpp FixedConstraintFixedRotationVectorTests.cpp FixedConstraintFrictionlessContactTests.cpp FixedRepresentationTest.cpp FreeMotionTests.cpp LinearSpringTest.cpp MassSpringConstraintFixedPointTest.cpp MassSpringConstraintFrictionlessContactTest.cpp MassSpringLocalizationTest.cpp MassSpringMechanicalValidationTests.cpp MassSpringRepresentationTests.cpp MassTest.cpp MockObjects.cpp ParticleCollisionResponseTests.cpp PhysicsManagerStateTests.cpp PhysicsManagerTests.cpp PostUpdateTests.cpp PrepareCollisionPairsTests.cpp PreUpdateTests.cpp PushResultsTests.cpp RepresentationTest.cpp RigidCollisionRepresentationTest.cpp RigidConstraintFixedPointTests.cpp RigidConstraintFixedRotationVectorTests.cpp RigidConstraintFrictionlessContactTests.cpp RigidLocalizationTest.cpp RigidRepresentationTest.cpp RigidStateTest.cpp RotationVectorConstraintDataTests.cpp SlidingConstraintDataTests.cpp SolveMlcpTests.cpp UpdateCollisionRepresentationsTest.cpp VirtualToolCouplerTest.cpp ) set(UNIT_TEST_HEADERS CommonTests.h DeformableTestsUtility.h DeformableTestsUtility-inl.h EigenGtestAsserts.h MockObjects.h ) set(LIBS SurgSimBlocks SurgSimGraphics SurgSimInput SurgSimMath SurgSimParticles SurgSimPhysics MlcpTestIO IdentityPoseDevice ) file(COPY ${SURGSIM_SOURCE_DIR}/SurgSim/Math/UnitTests/MlcpTestData DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) file(COPY Data DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) configure_file( "${CMAKE_CURRENT_SOURCE_DIR}/config.txt.in" "${CMAKE_CURRENT_BINARY_DIR}/config.txt" ) surgsim_add_unit_tests(SurgSimPhysicsTest) set_target_properties(SurgSimPhysicsTest PROPERTIES FOLDER "Physics") opensurgsim-0.7.0/SurgSim/Physics/UnitTests/CcdCollisionLoopTest.cpp000066400000000000000000000066271277777236100256470ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Physics/CcdCollisionLoop.h" #include "SurgSim/Collision/CollisionPair.h" #include "SurgSim/Physics/RigidCollisionRepresentation.h" #include #include "SurgSim/Math/Vector.h" #include "SurgSim/DataStructures/Location.h" namespace SurgSim { namespace Physics { TEST(CcdCollisionLoopTest, FilterContacts) { double toi; auto rep1 = std::make_shared("One"); rep1->setSelfCollisionDetectionType(Collision::COLLISION_DETECTION_TYPE_CONTINUOUS); auto pair = std::make_shared(rep1, rep1); auto computation = std::make_shared(false); DataStructures::Location location; std::vector> pairs(1, pair); EXPECT_FALSE(computation->findEarliestContact(pairs, &toi)); // Check that we find the toi correctly pair->addCcdContact(0.0, 0.1, Math::Vector3d::Zero(), Math::Vector3d::Zero(), std::make_pair(location, location)); EXPECT_TRUE(computation->findEarliestContact(pairs, &toi)); EXPECT_DOUBLE_EQ(0.1, toi); computation->filterLaterContacts(&pairs, 0.0, toi); EXPECT_EQ(1u, pair->getContacts().size()); pair->addCcdContact(0.0, 0.2, Math::Vector3d::Zero(), Math::Vector3d::Zero(), std::make_pair(location, location)); pair->addCcdContact(0.0, 0.3, Math::Vector3d::Zero(), Math::Vector3d::Zero(), std::make_pair(location, location)); // Check that we filter everything after the toi toi = 0.0; EXPECT_EQ(3u, pair->getContacts().size()); EXPECT_TRUE(computation->findEarliestContact(pairs, &toi)); computation->filterLaterContacts(&pairs, 0.0, toi); EXPECT_DOUBLE_EQ(0.1, toi); EXPECT_EQ(1u, pair->getContacts().size()); } TEST(CcdCollisionLoopTest, FilterContactsWithEpsilon) { double toi; auto rep1 = std::make_shared("One"); rep1->setSelfCollisionDetectionType(Collision::COLLISION_DETECTION_TYPE_CONTINUOUS); auto pair = std::make_shared(rep1, rep1); auto computation = std::make_shared(false); DataStructures::Location location; std::vector> pairs(1, pair); // Check that we find the toi correctly pair->addCcdContact(0.0, 0.1, Math::Vector3d::Zero(), Math::Vector3d::Zero(), std::make_pair(location, location)); pair->addCcdContact(0.0, 0.2, Math::Vector3d::Zero(), Math::Vector3d::Zero(), std::make_pair(location, location)); pair->addCcdContact(0.0, 0.3, Math::Vector3d::Zero(), Math::Vector3d::Zero(), std::make_pair(location, location)); EXPECT_TRUE(computation->findEarliestContact(pairs, &toi)); computation->filterLaterContacts(&pairs, 0.11, toi); // toi should be 0.1 + 0.11 i.e. toi + epsilon EXPECT_DOUBLE_EQ(0.1, toi); EXPECT_EQ(2u, pair->getContacts().size()); } } } opensurgsim-0.7.0/SurgSim/Physics/UnitTests/CommonTests.h000066400000000000000000000117551277777236100235260ustar00rootroot00000000000000// Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file CommonTests.h /// Common data structure for physics tests #ifndef SURGSIM_PHYSICS_UNITTESTS_COMMONTESTS_H #define SURGSIM_PHYSICS_UNITTESTS_COMMONTESTS_H #include #include #include #include "SurgSim/Math/Shapes.h" #include "SurgSim/Physics/Constraint.h" #include "SurgSim/Physics/ConstraintImplementation.h" #include "SurgSim/Physics/ContactConstraintData.h" #include "SurgSim/Physics/FixedConstraintFrictionlessContact.h" #include "SurgSim/Physics/FixedRepresentation.h" #include "SurgSim/Physics/MlcpPhysicsProblem.h" #include "SurgSim/Physics/MlcpPhysicsSolution.h" #include "SurgSim/Physics/PhysicsManagerState.h" #include "SurgSim/Physics/RigidConstraintFrictionlessContact.h" #include "SurgSim/Physics/RigidRepresentation.h" using SurgSim::Math::BoxShape; using SurgSim::Math::Shape; using SurgSim::Math::SphereShape; namespace { const double epsilon = 1e-10; }; namespace SurgSim { namespace Physics { class CommonTests : public ::testing::Test { public: /// Setup the test case by creating all object void SetUp() { // Set the time step dt = 1e-3; // Create a fixed world to define constraint against it m_fixedWorldRepresentation = std::make_shared("FixedPlane"); m_fixedWorldRepresentation->setIsGravityEnabled(false); { // Simply do 1 time step to make sure things are initialized (compliance matrix...) m_fixedWorldRepresentation->beforeUpdate(dt); m_fixedWorldRepresentation->update(dt); m_fixedWorldRepresentation->afterUpdate(dt); } // Create the physics manager state m_physicsManagerState = std::make_shared(); // Create a Rigid Sphere std::shared_ptr rigidSphereRepresentation; rigidSphereRepresentation = std::make_shared("RigidSphere"); { double radius = 1e-2; std::shared_ptr shape = std::make_shared(radius); rigidSphereRepresentation->setShape(shape); rigidSphereRepresentation->setDensity(1000); rigidSphereRepresentation->setIsGravityEnabled(false); { // Simply do 1 time step to make sure things are initialized (compliance matrix...) rigidSphereRepresentation->beforeUpdate(dt); rigidSphereRepresentation->update(dt); rigidSphereRepresentation->afterUpdate(dt); } m_allRepresentations.push_back(rigidSphereRepresentation); } // Create a Rigid Box std::shared_ptr rigidBoxRepresentation = std::make_shared("RigidBox"); { double size[3]={0.01, 0.02, 0.03}; rigidBoxRepresentation->setDensity(1000); std::shared_ptr shape = std::make_shared(size[0], size[1], size[2]); rigidBoxRepresentation->setShape(shape); rigidBoxRepresentation->setIsGravityEnabled(false); { // Simply do 1 time step to make sure things are initialized (compliance matrix...) rigidBoxRepresentation->beforeUpdate(dt); rigidBoxRepresentation->update(dt); rigidBoxRepresentation->afterUpdate(dt); } m_allRepresentations.push_back(rigidBoxRepresentation); } } void resetMlcpProblem(int nbDof, int nbConstraint) { if (m_physicsManagerState) { m_physicsManagerState->getMlcpProblem().A.setZero(nbConstraint, nbConstraint); m_physicsManagerState->getMlcpProblem().b.setZero(nbConstraint); m_physicsManagerState->getMlcpProblem().CHt.setZero(nbDof, nbConstraint); m_physicsManagerState->getMlcpProblem().H.resize(nbConstraint, nbDof); m_physicsManagerState->getMlcpProblem().mu.setZero(nbConstraint); m_physicsManagerState->getMlcpProblem().constraintTypes.clear(); m_physicsManagerState->getMlcpSolution().x.setZero(nbConstraint); m_physicsManagerState->getMlcpSolution().dofCorrection.setZero(nbDof); } } protected: /// Time step double dt; /// Fixed representation to define constraint in fixed space std::shared_ptr m_fixedWorldRepresentation; /// Vector of all representations std::vector> m_allRepresentations; /// Vector of representations useful for the current test std::vector> m_usedRepresentations; /// Vector of constraints useful for the current test std::vector> m_usedConstraints; /// The unique physics manager state std::shared_ptr m_physicsManagerState; }; }; // namespace Physics }; // namespace SurgSim #endif // SURGSIM_PHYSICS_UNITTESTS_COMMONTESTS_H opensurgsim-0.7.0/SurgSim/Physics/UnitTests/ComputationGroupTest.cpp000066400000000000000000000067461277777236100257710ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Physics/ComputationGroup.h" #include "SurgSim/Physics/Computation.h" #include "SurgSim/Physics/PhysicsManagerState.h" #include #include namespace { typedef std::shared_ptr State; class MockComputation : public SurgSim::Physics::Computation { public: explicit MockComputation(bool val) : Computation(val) { testing::DefaultValue::Set(std::make_shared()); }; SURGSIM_CLASSNAME(MockComputation); MOCK_METHOD2(doUpdate, State(const double&, const State&)); }; class MockGroup : public SurgSim::Physics::ComputationGroup { public: explicit MockGroup(bool val) : ComputationGroup(val) { testing::DefaultValue::Set(std::make_shared()); ON_CALL(*this, endIteration()).WillByDefault(testing::Return(true)); } MOCK_METHOD0(endIteration, bool(void)); }; } namespace SurgSim { namespace Physics { TEST(ComputationGroupTest, Empty) { auto state = std::make_shared(); auto computation = std::make_shared(false); EXPECT_NO_THROW(computation->update(0.0, state)); } TEST(ComputationGroupTest, RunOnce) { using ::testing::_; auto state = std::make_shared(); auto computation = std::make_shared(false); auto mock = std::make_shared(false); computation->addComputation(mock); EXPECT_CALL(*mock, doUpdate(0.0, _)); EXPECT_CALL(*computation, endIteration()); computation->update(0.0, state); } TEST(ComputationGroupTest, MultiplesRunMultiples) { using ::testing::_; using ::testing::Return; auto state = std::make_shared(); auto computation = std::make_shared(false); auto mock = std::make_shared(false); computation->addComputation(mock); computation->addComputation(mock); EXPECT_CALL(*mock, doUpdate(_, _)).Times(4); EXPECT_CALL(*computation, endIteration()).Times(2).WillOnce(Return(false)).WillOnce(Return(true)); computation->update(0.0, state); } TEST(ComputationGroupTest, AbortInTheMiddle) { using ::testing::_; using ::testing::Return; std::vector> computations; auto state = std::make_shared(); auto state2 = std::make_shared(); state2->setAbortGroup(true); auto computation = std::make_shared(false); auto mock = std::make_shared(false); computations.push_back(mock); computations.push_back(mock); computation->setComputations(computations); EXPECT_CALL(*mock, doUpdate(_, _)).Times(3) .WillOnce(Return(state)) .WillOnce(Return(state)) .WillOnce(Return(state2)); EXPECT_CALL(*computation, endIteration()).WillOnce(Return(false)); computation->update(0.0, state); ASSERT_FALSE(state2->shouldAbortGroup()); } } }opensurgsim-0.7.0/SurgSim/Physics/UnitTests/ComputationTests.cpp000066400000000000000000000116331277777236100251260ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Collision/Representation.h" #include "SurgSim/Physics/Constraint.h" #include "SurgSim/Physics/ContactConstraintData.h" #include "SurgSim/Physics/PhysicsManagerState.h" #include "SurgSim/Physics/RigidCollisionRepresentation.h" #include "SurgSim/Physics/RigidConstraintFrictionlessContact.h" #include "SurgSim/Physics/RigidRepresentation.h" #include "SurgSim/Physics/UnitTests/MockObjects.h" namespace SurgSim { namespace Physics { TEST(ComputationTests, InitTest) { EXPECT_NO_THROW({MockComputation c;}); MockComputation c; EXPECT_FALSE(c.isCopyingState()); MockComputation d(true); EXPECT_TRUE(d.isCopyingState()); } TEST(ComputationTests, CopyStateTest) { std::shared_ptr state0 = std::make_shared(); MockComputation c; auto state1 = c.update(1.0, state0); EXPECT_EQ(state0.get(), state1.get()); c.setDoCopyState(true); EXPECT_TRUE(c.isCopyingState()); auto state2 = c.update(1.0, state0); EXPECT_NE(state0.get(), state2.get()); } TEST(ComputationTests, PreparePhysicsState) { auto physicsState = std::make_shared(); EXPECT_EQ(0, physicsState->getActiveConstraints().size()); // Setup the state. std::vector> expectedRepresentations; std::vector> expectedCollisionRepresentations; // Add a representation. auto rigid1 = std::make_shared("rigid1"); expectedRepresentations.push_back(rigid1); // Add a second representation. This one has a collision representation. auto rigid2 = std::make_shared("rigid2"); auto collisionRepresentation = std::make_shared("rigid2 collision"); rigid2->setCollisionRepresentation(collisionRepresentation); expectedRepresentations.push_back(rigid2); expectedCollisionRepresentations.push_back(collisionRepresentation); physicsState->setRepresentations(expectedRepresentations); // Add a constraint. std::vector> expectedConstraints; // Constraint type. auto constraintType = SurgSim::Physics::FRICTIONLESS_3DCONTACT; { // Create first representation. auto rigid1 = std::make_shared("rigid1"); // Create second representation. auto rigid2 = std::make_shared("rigid2"); // Create the constraint specific data. std::shared_ptr data = std::make_shared(); // Create the constraint. expectedConstraints.push_back(std::make_shared(constraintType, data, rigid1, SurgSim::DataStructures::Location(SurgSim::Math::Vector3d::Zero()), rigid2, SurgSim::DataStructures::Location(SurgSim::Math::Vector3d::Zero()))); physicsState->setConstraintGroup(SurgSim::Physics::CONSTRAINT_GROUP_TYPE_CONTACT, expectedConstraints); } // Add a collision representation. auto collisionRepresentation2 = std::make_shared("collision2"); collisionRepresentation2->setLocalActive(false); expectedCollisionRepresentations.push_back(collisionRepresentation2); physicsState->setCollisionRepresentations(expectedCollisionRepresentations); // Call update on Computation. MockComputation c; physicsState = c.update(0.0, physicsState); // Check the active representations list. std::vector> actualRepresentations; actualRepresentations = physicsState->getActiveRepresentations(); ASSERT_EQ(2, actualRepresentations.size()); EXPECT_EQ(rigid1, actualRepresentations.front()); EXPECT_EQ(rigid2, actualRepresentations.back()); // Check the active constraints list. std::vector> actualConstraints; actualConstraints = physicsState->getActiveConstraints(); ASSERT_EQ(1, actualConstraints.size()); EXPECT_EQ(expectedConstraints.front(), actualConstraints.front()); // Check the active collisions list. std::vector> actualCollisionRepresentations; actualCollisionRepresentations = physicsState->getActiveCollisionRepresentations(); ASSERT_EQ(1, actualCollisionRepresentations.size()); EXPECT_EQ(collisionRepresentation, actualCollisionRepresentations.front()); } }; // namespace Physics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/UnitTests/ConstraintComponentTests.cpp000066400000000000000000000030021277777236100266220ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Physics/Constraint.h" #include "SurgSim/Physics/ConstraintComponent.h" #include "SurgSim/Physics/UnitTests/MockObjects.h" namespace SurgSim { namespace Physics { TEST(ConstraintComponentTest, Constructor) { ASSERT_NO_THROW( { ConstraintComponent("component"); }); } TEST(ConstraintComponentTest, GetSetConstraint) { auto component = std::make_shared("component"); EXPECT_EQ(nullptr, component->getConstraint()); auto constraint = makeMockConstraint(std::make_shared(), std::make_shared()); ASSERT_NO_THROW( { component->setConstraint(constraint); }); EXPECT_EQ(constraint, component->getConstraint()); ASSERT_NO_THROW( { component->setConstraint(nullptr); }); EXPECT_EQ(nullptr, component->getConstraint()); } } // namespace Physics } // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/UnitTests/ConstraintImplementationFactoryTests.cpp000066400000000000000000000105331277777236100312040ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Physics/ConstraintImplementationFactory.h" #include "SurgSim/Blocks/MassSpring1DRepresentation.h" #include "SurgSim/Blocks/MassSpring2DRepresentation.h" #include "SurgSim/Blocks/MassSpring3DRepresentation.h" #include "SurgSim/Physics/Fem1DRepresentation.h" #include "SurgSim/Physics/Fem2DRepresentation.h" #include "SurgSim/Physics/Fem3DRepresentation.h" #include "SurgSim/Physics/FixedConstraintFrictionlessContact.h" #include "SurgSim/Physics/FixedRepresentation.h" #include "SurgSim/Physics/MassSpringRepresentation.h" #include "SurgSim/Physics/RigidRepresentation.h" namespace SurgSim { namespace Physics { TEST(ConstraintImplementationFactoryTest, GetImplementationTest) { ConstraintImplementationFactory factory; EXPECT_TRUE(factory.getImplementation(typeid(FixedRepresentation), FRICTIONLESS_3DCONTACT) != nullptr); EXPECT_TRUE(factory.getImplementation(typeid(RigidRepresentation), FRICTIONLESS_3DCONTACT) != nullptr); EXPECT_TRUE(factory.getImplementation(typeid(Fem3DRepresentation), FRICTIONLESS_3DCONTACT) != nullptr); EXPECT_TRUE(factory.getImplementation(typeid(FixedRepresentation), FIXED_3DPOINT) != nullptr); EXPECT_TRUE(factory.getImplementation(typeid(RigidRepresentation), FIXED_3DPOINT) != nullptr); EXPECT_TRUE(factory.getImplementation(typeid(Fem1DRepresentation), FIXED_3DPOINT) != nullptr); EXPECT_TRUE(factory.getImplementation(typeid(Fem2DRepresentation), FIXED_3DPOINT) != nullptr); EXPECT_TRUE(factory.getImplementation(typeid(Fem3DRepresentation), FIXED_3DPOINT) != nullptr); EXPECT_TRUE(factory.getImplementation(typeid(Fem1DRepresentation), FRICTIONLESS_SLIDING) != nullptr); EXPECT_TRUE(factory.getImplementation(typeid(Fem2DRepresentation), FRICTIONLESS_SLIDING) != nullptr); EXPECT_TRUE(factory.getImplementation(typeid(Fem3DRepresentation), FRICTIONLESS_SLIDING) != nullptr); EXPECT_TRUE(factory.getImplementation(typeid(MassSpringRepresentation), FRICTIONLESS_3DCONTACT) != nullptr); EXPECT_TRUE(factory.getImplementation(typeid(SurgSim::Blocks::MassSpring1DRepresentation), FRICTIONLESS_3DCONTACT) != nullptr); EXPECT_TRUE(factory.getImplementation(typeid(SurgSim::Blocks::MassSpring2DRepresentation), FRICTIONLESS_3DCONTACT) != nullptr); EXPECT_TRUE(factory.getImplementation(typeid(SurgSim::Blocks::MassSpring3DRepresentation), FRICTIONLESS_3DCONTACT) != nullptr); EXPECT_TRUE(factory.getImplementation(typeid(MassSpringRepresentation), FIXED_3DPOINT) != nullptr); EXPECT_TRUE(factory.getImplementation(typeid(SurgSim::Blocks::MassSpring1DRepresentation), FIXED_3DPOINT) != nullptr); EXPECT_TRUE(factory.getImplementation(typeid(SurgSim::Blocks::MassSpring2DRepresentation), FIXED_3DPOINT) != nullptr); EXPECT_TRUE(factory.getImplementation(typeid(SurgSim::Blocks::MassSpring3DRepresentation), FIXED_3DPOINT) != nullptr); } TEST(ConstraintImplementationFactoryTest, AddImplementationTest) { class TestRepresentation {}; ConstraintImplementationFactory factory; EXPECT_TRUE(factory.getImplementation(typeid(TestRepresentation), FRICTIONLESS_3DCONTACT) == nullptr); // Add implementation for TestRepresentation. EXPECT_NO_THROW( factory.addImplementation(typeid(TestRepresentation), std::make_shared())); EXPECT_TRUE(factory.getImplementation(typeid(TestRepresentation), FRICTIONLESS_3DCONTACT) != nullptr); // Adding it again to make sure everything works, even if duplicate implementations are added. EXPECT_NO_THROW( factory.addImplementation(typeid(TestRepresentation), std::make_shared())); EXPECT_TRUE(factory.getImplementation(typeid(TestRepresentation), FRICTIONLESS_3DCONTACT) != nullptr); } } // namespace Physics } // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/UnitTests/ConstraintImplementationTests.cpp000066400000000000000000000016451277777236100276600ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Physics/ConstraintImplementation.h" namespace SurgSim { namespace Physics { TEST(ConstraintImplementationTest, FactoryTest) { ASSERT_NO_THROW(ConstraintImplementation::getFactory();); } } // namespace Physics } // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/UnitTests/ConstraintTests.cpp000066400000000000000000000275621277777236100247600ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include "SurgSim/DataStructures/Location.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/SphereShape.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/Constraint.h" #include "SurgSim/Physics/ConstraintData.h" #include "SurgSim/Physics/ContactConstraintData.h" #include "SurgSim/Physics/FixedConstraintFrictionlessContact.h" #include "SurgSim/Physics/FixedRepresentation.h" #include "SurgSim/Physics/MlcpPhysicsProblem.h" #include "SurgSim/Physics/RigidConstraintFrictionlessContact.h" #include "SurgSim/Physics/RigidRepresentation.h" using SurgSim::DataStructures::Location; using SurgSim::Math::SphereShape; using SurgSim::Math::Vector3d; namespace { const double epsilon = 1e-10; }; namespace SurgSim { namespace Physics { class ConstraintTests : public ::testing::Test { protected: /// Fixed plane pose SurgSim::Math::RigidTransform3d m_poseFixed; /// Rigid sphere pose SurgSim::Math::RigidTransform3d m_poseRigid; /// Contact normal direction Vector3d m_n; /// Distance to origin of the contact plane equation double m_d; /// Sphere radius double m_radius; /// Simulation time step double m_dt; /// Mlcp index of the sphere representation size_t m_indexSphereRepresentation; /// Mlcp index of the plane representation size_t m_indexPlaneRepresentation; /// Mlcp index of the constraint (frictionless contact) size_t m_indexConstraint; /// Contact location on the plane (point on the plane with the most penetration) Vector3d m_contactPositionPlane; /// Contact location on the sphere (point on the sphere with the most penetration) Vector3d m_contactPositionSphere; /// Rigid sphere std::shared_ptr m_rigid; /// Fixed plane std::shared_ptr m_fixed; /// Mlcp MlcpPhysicsProblem m_mlcpPhysicsProblem; /// Constraint std::shared_ptr m_constraint; /// Constraint data: frictionless contact std::shared_ptr m_constraintData; /// Location on the fixed plane Location m_locFixedPlane; /// Location on the rigid sphere Location m_locRigidSphere; /// Total number of degrees of freedom in the system (plane + sphere) size_t m_numDof; /// Total number of atomic constraint in the system (1 for a frictionless contact) size_t m_numConstraint; /// Setup the test case by creating all object void SetUp() { m_d = 0.0; m_radius = 0.01; m_dt = 1e-3; m_numDof = 0; m_indexSphereRepresentation = 0; m_indexConstraint = 0; m_numConstraint = 1; m_contactPositionPlane.setZero(); m_contactPositionSphere.setZero(); m_contactPositionSphere[1] = -m_radius; m_poseFixed.setIdentity(); m_poseRigid.setIdentity(); m_rigid = std::make_shared("Rigid"); m_rigid->setLocalActive(true); m_rigid->setIsGravityEnabled(false); m_rigid->setLocalPose(m_poseRigid); { m_rigid->setDensity(1000.0); std::shared_ptr shape = std::make_shared(m_radius); m_rigid->setShape(shape); } m_numDof += m_rigid->getNumDof(); m_indexPlaneRepresentation = m_indexSphereRepresentation + m_rigid->getNumDof(); m_fixed = std::make_shared("Fixed"); m_fixed->setLocalActive(true); m_fixed->setIsGravityEnabled(false); m_fixed->setLocalPose(m_poseFixed); m_numDof += m_fixed->getNumDof(); m_locFixedPlane.rigidLocalPosition = m_contactPositionPlane; m_locRigidSphere.rigidLocalPosition = m_contactPositionSphere; m_constraintData = std::make_shared(); clearMlcpPhysicsProblem(m_numDof, m_numConstraint); } /// Allocate and clear the Mlcp /// \param numDof The number of degrees of freedom in the system /// \param numConstraint The number of atomic constraints in the system void clearMlcpPhysicsProblem(size_t numDof, size_t numConstraint) { // Resize and zero all Eigen types m_mlcpPhysicsProblem.A.setZero(numConstraint, numConstraint); m_mlcpPhysicsProblem.b.setZero(numConstraint); m_mlcpPhysicsProblem.mu.setZero(numConstraint); m_mlcpPhysicsProblem.CHt.setZero(numDof, numConstraint); m_mlcpPhysicsProblem.H.resize(numConstraint, numDof); // Empty all std::vector types m_mlcpPhysicsProblem.constraintTypes.clear(); } }; TEST_F(ConstraintTests, TestConstructor) { auto fixedRep = std::make_shared("fixed"); auto rigidRep = std::make_shared("rigid"); Location fixedLoc(m_contactPositionPlane); Location rigidLoc(m_contactPositionSphere); auto type = SurgSim::Physics::FRICTIONLESS_3DCONTACT; ASSERT_NO_THROW({Constraint c(type, m_constraintData, fixedRep, fixedLoc, rigidRep, rigidLoc);}); EXPECT_THROW( { Constraint c(type, nullptr, nullptr, fixedLoc, nullptr, fixedLoc); }, SurgSim::Framework::AssertionFailure); EXPECT_THROW( { Constraint c(type, m_constraintData, nullptr, fixedLoc, nullptr, fixedLoc); }, SurgSim::Framework::AssertionFailure); EXPECT_THROW( { Constraint c(type, m_constraintData, fixedRep, fixedLoc, nullptr, fixedLoc); }, SurgSim::Framework::AssertionFailure); Constraint c(type, m_constraintData, fixedRep, fixedLoc, rigidRep, rigidLoc); EXPECT_EQ(m_constraintData, c.getData()); EXPECT_EQ(type, c.getImplementations().first->getConstraintType()); EXPECT_EQ(type, c.getImplementations().second->getConstraintType()); EXPECT_EQ(fixedRep, c.getLocalizations().first->getRepresentation()); EXPECT_EQ(rigidRep, c.getLocalizations().second->getRepresentation()); } TEST_F(ConstraintTests, TestGetNumDof) { auto fixedRep = std::make_shared("fixed"); auto rigidRep = std::make_shared("rigid"); Location fixedLoc(m_contactPositionPlane); Location rigidLoc(m_contactPositionSphere); auto type = SurgSim::Physics::FRICTIONLESS_3DCONTACT; { SCOPED_TRACE("1DOF for a frictionless contact"); Constraint c(type, m_constraintData, m_fixed, m_locFixedPlane, m_rigid, m_locRigidSphere); EXPECT_EQ(1u, c.getNumDof()); } { SCOPED_TRACE("1DOF for a frictionless contact between 2 fixed representations"); Constraint c(type, m_constraintData, fixedRep, fixedLoc, fixedRep, fixedLoc); EXPECT_EQ(1u, c.getNumDof()); } { SCOPED_TRACE("1DOF for a frictionless contact between 1 fixed representation and 1 rigid representation"); Constraint c(type, m_constraintData, fixedRep, fixedLoc, rigidRep, rigidLoc); EXPECT_EQ(1u, c.getNumDof()); } } TEST_F(ConstraintTests, SetActive) { auto type = SurgSim::Physics::FRICTIONLESS_3DCONTACT; m_n.setZero(); m_n[1] = -1.0; m_constraintData->setPlaneEquation(m_n, m_d); m_constraint = std::make_shared(type, m_constraintData, m_fixed, m_locFixedPlane, m_rigid, m_locRigidSphere); EXPECT_TRUE(m_constraint->isActive()); m_constraint->setActive(false); EXPECT_FALSE(m_constraint->isActive()); } // Test case: Rigid sphere at (0 0 0) with radius 0.01 colliding with Fixed plane Y=0 // Contact location on the rigid sphere is (0 -0.01 0) // Contact location on the fixed plane is (0 0 0) // Constraint: (Sphere - Plane).n >= 0 with n=(0 1 0) The normal should be the contact normal on the 2nd object TEST_F(ConstraintTests, TestBuildMlcpSpherePlane) { auto type =SurgSim::Physics::FRICTIONLESS_3DCONTACT; auto mlcptype = SurgSim::Math::MLCP_UNILATERAL_3D_FRICTIONLESS_CONSTRAINT; m_n.setZero(); m_n[1] = 1.0; m_constraintData->setPlaneEquation(m_n, m_d); m_constraint = std::make_shared(type, m_constraintData, m_rigid, m_locRigidSphere, m_fixed, m_locFixedPlane); // Simulate 1 time step...to make sure all representation have a valid compliance matrix... { m_fixed->beforeUpdate(m_dt); m_rigid->beforeUpdate(m_dt); m_fixed->update(m_dt); m_rigid->update(m_dt); m_fixed->afterUpdate(m_dt); m_rigid->afterUpdate(m_dt); } // Fill up the Mlcp m_constraint->build(m_dt, &m_mlcpPhysicsProblem, m_indexSphereRepresentation, m_indexPlaneRepresentation, m_indexConstraint); // Violation b should be exactly -radius (the sphere center is on the plane) // This should not depend on the ordering of the object...the violation remains the same no matter what EXPECT_NEAR(-m_radius, m_mlcpPhysicsProblem.b[0], epsilon); // Constraint H should be // H = dt.[nx ny nz nz.GPy-ny.GPz nx.GPz-nz.GPx ny.GPx-nx.GPy] // The rigid sphere being the 1st representation in the pair, it has the positive sign in the constraint ! double sign = 1.0; Vector3d n_GP = m_n.cross(Vector3d(0.0, -m_radius, 0.0)); SurgSim::Math::Matrix H = m_mlcpPhysicsProblem.H; EXPECT_NEAR(sign * m_dt * m_n[0] , H(0, 0), epsilon); EXPECT_NEAR(sign * m_dt * m_n[1] , H(0, 1), epsilon); EXPECT_NEAR(sign * m_dt * m_n[2] , H(0, 2), epsilon); EXPECT_NEAR(sign * m_dt * n_GP[0], H(0, 3), epsilon); EXPECT_NEAR(sign * m_dt * n_GP[1], H(0, 4), epsilon); EXPECT_NEAR(sign * m_dt * n_GP[2], H(0, 5), epsilon); // ConstraintTypes should contain 1 entry SurgSim::Math::MLCP_UNILATERAL_3D_FRICTIONLESS_CONSTRAINT ASSERT_EQ(1u, m_mlcpPhysicsProblem.constraintTypes.size()); EXPECT_EQ(mlcptype, m_mlcpPhysicsProblem.constraintTypes[0]); } // Test case: Rigid sphere at (0 0 0) with radius 0.01 colliding with Fixed plane Y=0 // Contact location on the rigid sphere is (0 -0.01 0) // Contact location on the fixed plane is (0 0 0) // Constraint: (Plane - Sphere).n >= 0 with n=(0 -1 0) The normal should be the contact normal on the 2nd object TEST_F(ConstraintTests, TestBuildMlcpPlaneSphere) { auto type = SurgSim::Physics::FRICTIONLESS_3DCONTACT; auto mlcptype = SurgSim::Math::MLCP_UNILATERAL_3D_FRICTIONLESS_CONSTRAINT; m_n.setZero(); m_n[1] = -1.0; m_constraintData->setPlaneEquation(m_n, m_d); m_constraint = std::make_shared(type, m_constraintData, m_fixed, m_locFixedPlane, m_rigid, m_locRigidSphere); // Simulate 1 time step...to make sure all representation have a valid compliance matrix... { m_fixed->beforeUpdate(m_dt); m_rigid->beforeUpdate(m_dt); m_fixed->update(m_dt); m_rigid->update(m_dt); m_fixed->afterUpdate(m_dt); m_rigid->afterUpdate(m_dt); } // Fill up the Mlcp m_constraint->build(m_dt, &m_mlcpPhysicsProblem, m_indexPlaneRepresentation, m_indexSphereRepresentation, m_indexConstraint); // Violation b should be exactly -radius (the sphere center is on the plane) // This should not depend on the ordering of the object...the violation remains the same no matter what EXPECT_NEAR(-m_radius, m_mlcpPhysicsProblem.b[0], epsilon); // Constraint H should be // H = dt.[nx ny nz nz.GPy-ny.GPz nx.GPz-nz.GPx ny.GPx-nx.GPy] // The rigid sphere being the 2nd representation in the pair, it has the negative sign in the constraint ! double sign = -1.0; Vector3d n_GP = m_n.cross(Vector3d(0.0, -m_radius, 0.0)); SurgSim::Math::Matrix h = m_mlcpPhysicsProblem.H; EXPECT_NEAR(sign * m_dt * m_n[0] , h(0, 0), epsilon); EXPECT_NEAR(sign * m_dt * m_n[1] , h(0, 1), epsilon); EXPECT_NEAR(sign * m_dt * m_n[2] , h(0, 2), epsilon); EXPECT_NEAR(sign * m_dt * n_GP[0], h(0, 3), epsilon); EXPECT_NEAR(sign * m_dt * n_GP[1], h(0, 4), epsilon); EXPECT_NEAR(sign * m_dt * n_GP[2], h(0, 5), epsilon); // ConstraintTypes should contain 1 entry SurgSim::Math::MLCP_UNILATERAL_3D_FRICTIONLESS_CONSTRAINT ASSERT_EQ(1u, m_mlcpPhysicsProblem.constraintTypes.size()); EXPECT_EQ(mlcptype, m_mlcpPhysicsProblem.constraintTypes[0]); } }; // namespace Physics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/UnitTests/ContactConstraintDataTests.cpp000066400000000000000000000035601277777236100270560ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include "SurgSim/Physics/Constraint.h" #include "SurgSim/Physics/ConstraintData.h" #include "SurgSim/Physics/ContactConstraintData.h" using SurgSim::Physics::Constraint; using SurgSim::Physics::ConstraintData; using SurgSim::Physics::ContactConstraintData; #include "SurgSim/Math/Vector.h" using SurgSim::Math::Vector3d; namespace { const double epsilon = 1e-10; }; TEST (ContactConstraintDataTests, TestSetGet) { using SurgSim::Collision::Contact; using SurgSim::DataStructures::Location; ContactConstraintData contactConstraintData; Vector3d n(1.2, 4.5, 6.7); double d = 5.566; n.normalize(); EXPECT_NEAR(0.0 , contactConstraintData.getDistance(), epsilon); EXPECT_TRUE(contactConstraintData.getNormal().isZero()); contactConstraintData.setPlaneEquation(n, d); EXPECT_NEAR(d , contactConstraintData.getDistance(), epsilon); EXPECT_TRUE(contactConstraintData.getNormal().isApprox(n, epsilon)); auto contact0 = std::make_shared(SurgSim::Collision::COLLISION_DETECTION_TYPE_DISCRETE, 0.0, 0.0, Vector3d::Zero(), Vector3d::UnitX(), std::pair()); contactConstraintData.setContact(contact0); EXPECT_TRUE(contactConstraintData.getContact() == contact0); } opensurgsim-0.7.0/SurgSim/Physics/UnitTests/ContactConstraintGenerationTests.cpp000066400000000000000000000160521277777236100303000ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include "SurgSim/Collision/CollisionPair.h" #include "SurgSim/Collision/CcdDcdCollision.h" #include "SurgSim/Collision/Representation.h" #include "SurgSim/Math/DoubleSidedPlaneShape.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/SphereShape.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/Constraint.h" #include "SurgSim/Physics/ContactConstraintGeneration.h" #include "SurgSim/Physics/PhysicsManagerState.h" #include "SurgSim/Physics/RigidCollisionRepresentation.h" #include "SurgSim/Physics/RigidRepresentation.h" using SurgSim::Collision::CollisionPair; using SurgSim::Collision::ContactCalculation; using SurgSim::Math::DoubleSidedPlaneShape; using SurgSim::Math::makeRigidTransform; using SurgSim::Math::Quaterniond; using SurgSim::Math::SphereShape; using SurgSim::Math::Vector3d; namespace SurgSim { namespace Physics { struct ContactConstraintGenerationTests: public ::testing::Test { virtual void SetUp() { rigid0 = std::make_shared("Physics Representation 0"); rigid0->setShape(std::make_shared(2.0)); collision0 = std::make_shared("Collision Representation 0"); rigid0->setCollisionRepresentation(collision0); representations.push_back(rigid0); rigid1 = std::make_shared("Physics Representation 1"); rigid1->setShape(std::make_shared()); collision1 = std::make_shared("Collision Representation 1"); rigid1->setCollisionRepresentation(collision1); representations.push_back(rigid1); state = std::make_shared(); state->setRepresentations(representations); collision0->update(0.0); collision1->update(0.0); } virtual void TearDown() { } std::shared_ptr collision0; std::shared_ptr rigid0; std::shared_ptr collision1; std::shared_ptr rigid1; std::shared_ptr state; std::vector> representations; std::vector> pairs; }; TEST_F(ContactConstraintGenerationTests, BasicTest) { std::shared_ptr pair = std::make_shared(collision0, collision1); // Test case setup, create a pair with a contact and set up the physics state with it SurgSim::Collision::SphereDoubleSidedPlaneContact contactCalculation; contactCalculation.calculateContact(pair); ASSERT_TRUE(pair->hasContacts()); pairs.push_back(pair); state->setCollisionPairs(pairs); ContactConstraintGeneration generator; generator.update(0.1, state); ASSERT_EQ(1u, state->getConstraintGroup(CONSTRAINT_GROUP_TYPE_CONTACT).size()); auto constraints = state->getConstraintGroup(CONSTRAINT_GROUP_TYPE_CONTACT); auto constraint = constraints[0]; auto localizations = constraint->getLocalizations(); auto implementations = constraint->getImplementations(); auto data = constraint->getData(); EXPECT_NE(nullptr, localizations.first); EXPECT_NE(nullptr, localizations.second); EXPECT_NE(nullptr, implementations.first); EXPECT_NE(nullptr, implementations.second); EXPECT_NE(nullptr, data); } TEST_F(ContactConstraintGenerationTests, CountTest) { std::shared_ptr pair; SurgSim::Collision::SphereDoubleSidedPlaneContact contactCalculation; pair = std::make_shared(collision0, collision1); contactCalculation.calculateContact(pair); contactCalculation.calculateContact(pair); pairs.push_back(pair); pair = std::make_shared(collision0, collision1); contactCalculation.calculateContact(pair); pairs.push_back(pair); pair = std::make_shared(collision0, collision1); pairs.push_back(pair); state->setCollisionPairs(pairs); ContactConstraintGeneration generator; generator.update(0.1, state); // 3 Contacts should generate 3 constraints ASSERT_EQ(3u, state->getConstraintGroup(CONSTRAINT_GROUP_TYPE_CONTACT).size()); } TEST_F(ContactConstraintGenerationTests, InactivePhysics) { std::shared_ptr pair = std::make_shared(collision0, collision1); SurgSim::Collision::SphereDoubleSidedPlaneContact contactCalculation; contactCalculation.calculateContact(pair); pairs.push_back(pair); state->setCollisionPairs(pairs); ContactConstraintGeneration generator; rigid0->setLocalActive(false); rigid1->setLocalActive(true); generator.update(0.1, state); ASSERT_EQ(0u, state->getConstraintGroup(CONSTRAINT_GROUP_TYPE_CONTACT).size()); rigid0->setLocalActive(true); rigid1->setLocalActive(false); generator.update(0.1, state); ASSERT_EQ(0u, state->getConstraintGroup(CONSTRAINT_GROUP_TYPE_CONTACT).size()); rigid0->setLocalActive(false); rigid1->setLocalActive(false); generator.update(0.1, state); ASSERT_EQ(0u, state->getConstraintGroup(CONSTRAINT_GROUP_TYPE_CONTACT).size()); rigid0->setLocalActive(true); rigid1->setLocalActive(true); generator.update(0.1, state); ASSERT_EQ(1u, state->getConstraintGroup(CONSTRAINT_GROUP_TYPE_CONTACT).size()); } TEST_F(ContactConstraintGenerationTests, LocalPoses) { //Move the collision representation away from the physics representation for the sphere collision0->setLocalPose(makeRigidTransform(Quaterniond::Identity(), Vector3d(5.0, 0.0, 0.0))); std::shared_ptr pair = std::make_shared(collision0, collision1); SurgSim::Collision::SphereDoubleSidedPlaneContact contactCalculation; contactCalculation.calculateContact(pair); ASSERT_EQ(1u, pair->getContacts().size()); pairs.push_back(pair); state->setCollisionPairs(pairs); ContactConstraintGeneration generator; generator.update(0.1, state); ASSERT_EQ(1u, state->getConstraintGroup(CONSTRAINT_GROUP_TYPE_CONTACT).size()); auto constraint = state->getConstraintGroup(CONSTRAINT_GROUP_TYPE_CONTACT)[0]; auto localization = constraint->getLocalizations().first; auto location = pair->getContacts().front()->penetrationPoints.first; Vector3d localizationGlobalPosition = localization->calculatePosition(); Vector3d locationGlobalPosition = collision0->getPose() * location.rigidLocalPosition.getValue(); EXPECT_TRUE(localizationGlobalPosition.isApprox(locationGlobalPosition)) << "The contact location is not in the same position as the localization produced by constraint generation"; } }; // namespace Physics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/UnitTests/ContactFilteringTest.cpp000066400000000000000000000107141277777236100256770ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Collision/CollisionPair.h" #include "SurgSim/Collision/ContactFilter.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Physics/ContactFiltering.h" #include "SurgSim/Physics/PhysicsManagerState.h" #include "SurgSim/Physics/RigidCollisionRepresentation.h" using ::testing::_; namespace SurgSim { class MockContactFilter : public Collision::ContactFilter { public: explicit MockContactFilter(const std::string& name) : Collision::ContactFilter(name) {} MOCK_METHOD0(doWakeUp, bool()); MOCK_METHOD0(doInitialize, bool()); MOCK_METHOD1(doUpdate, void(double)); MOCK_METHOD2(doFilterContacts, void(const std::shared_ptr& state, const std::shared_ptr& pair)); }; void removeOne(const std::shared_ptr& state, const std::shared_ptr& pair) { pair->getContacts().pop_back(); } namespace Physics { struct ContactFilteringTest : public ::testing::Test { virtual void SetUp() { // Setup Framework runtime = std::make_shared(); state = std::make_shared(); contactFiltering = std::make_shared(false); std::vector> filters; filter = std::make_shared("Filter"); filters.push_back(filter); state->setContactFilters(filters); collision0 = std::make_shared("Collision0"); pairWithContacts = std::make_shared(collision0, collision0); auto contact = std::make_shared(Collision::COLLISION_DETECTION_TYPE_NONE, 0.0, 0.0, Math::Vector3d::Zero(), Math::Vector3d::Zero(), std::make_pair(DataStructures::Location(), DataStructures::Location())); pairWithContacts->addContact(contact); pairWithContacts->addContact(contact); pairWithoutContacts = std::make_shared(collision0, collision0); } std::shared_ptr state; std::shared_ptr contactFiltering; std::shared_ptr runtime; std::shared_ptr filter; std::shared_ptr collision0; std::shared_ptr pairWithContacts; std::shared_ptr pairWithoutContacts; std::vector> pairs; }; TEST_F(ContactFilteringTest, DontProcessWithoutPairs) { EXPECT_CALL(*filter, doFilterContacts(_, _)).Times(0); contactFiltering->update(1.0, state); } TEST_F(ContactFilteringTest, ProcessAllPairsWithContacts) { pairs.push_back(pairWithContacts); pairs.push_back(pairWithContacts); pairs.push_back(pairWithoutContacts); state->setCollisionPairs(pairs); EXPECT_CALL(*filter, doFilterContacts(_, _)).Times(2); contactFiltering->update(1.0, state); } TEST_F(ContactFilteringTest, ModifyContacts) { pairs.push_back(pairWithContacts); state->setCollisionPairs(pairs); EXPECT_CALL(*filter, doFilterContacts(_, _)).WillOnce(testing::Invoke(removeOne)); contactFiltering->update(1.0, state); EXPECT_EQ(1u, pairWithContacts->getContacts().size()); } TEST_F(ContactFilteringTest, ProcessAllFilters) { // Gmock is might not be threadsafe on windows, need separate instances std::vector> filters; auto filter1 = std::make_shared("Filter1"); filters.push_back(filter1); auto filter2 = std::make_shared("Filter2"); filters.push_back(filter2); state->setContactFilters(filters); pairs.push_back(pairWithContacts); state->setCollisionPairs(pairs); EXPECT_CALL(*filter1, doFilterContacts(_, _)).Times(1); EXPECT_CALL(*filter2, doFilterContacts(_, _)).Times(1); contactFiltering->update(1.0, state); } } }opensurgsim-0.7.0/SurgSim/Physics/UnitTests/Data/000077500000000000000000000000001277777236100217425ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Physics/UnitTests/Data/PlyReaderTests/000077500000000000000000000000001277777236100246545ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Physics/UnitTests/Data/PlyReaderTests/Fem1D.ply000066400000000000000000000011751277777236100263020ustar00rootroot00000000000000ply format ascii 1.0 comment Created by hand element vertex 7 property double x property double y property double z element 1d_element 4 property list uint uint vertex_indices element boundary_condition 3 property uint vertex_index element radius 1 property double value element material 1 property double mass_density property double poisson_ratio property double young_modulus end_header 1.100000 1.200000 -1.300000 1.400000 -1.500000 -1.600000 -1.700000 -1.800000 -1.900000 2.000000 2.999999 3.000000 -4.000000 5.000000 6.000000 7.999999 -8.000001 9.000000 9.100000 9.200000 9.300000 2 0 1 2 2 6 2 3 5 2 4 3 2 4 5 0.11 0.21 0.31 0.41 opensurgsim-0.7.0/SurgSim/Physics/UnitTests/Data/PlyReaderTests/Fem1DMaterial.ply000066400000000000000000000012161277777236100277550ustar00rootroot00000000000000ply format ascii 1.0 comment Created by hand element vertex 7 property double x property double y property double z element 1d_element 4 property list uint uint vertex_indices property double mass_density property double poisson_ratio property double young_modulus element boundary_condition 3 property uint vertex_index element radius 1 property double value end_header 1.100000 1.200000 -1.300000 1.400000 -1.500000 -1.600000 -1.700000 -1.800000 -1.900000 2.000000 2.999999 3.000000 -4.000000 5.000000 6.000000 7.999999 -8.000001 9.000000 9.100000 9.200000 9.300000 2 0 1 1.0 2.0 3.0 2 2 6 4.0 5.0 6.0 2 3 5 7.0 8.0 9.0 2 4 3 10.0 11.0 12.0 2 4 5 0.11 opensurgsim-0.7.0/SurgSim/Physics/UnitTests/Data/PlyReaderTests/Fem1DNoMaterial.ply000066400000000000000000000010021277777236100302430ustar00rootroot00000000000000ply format ascii 1.0 comment Created by hand element vertex 7 property double x property double y property double z element 1d_element 4 property list uint uint vertex_indices element boundary_condition 3 property uint vertex_index element radius 1 property double value end_header 1.100000 1.200000 -1.300000 1.400000 -1.500000 -1.600000 -1.700000 -1.800000 -1.900000 2.000000 2.999999 3.000000 -4.000000 5.000000 6.000000 7.999999 -8.000001 9.000000 9.100000 9.200000 9.300000 2 0 1 2 2 6 2 3 5 2 4 3 2 4 5 0.11 opensurgsim-0.7.0/SurgSim/Physics/UnitTests/Data/PlyReaderTests/Fem2D.ply000066400000000000000000000011361277777236100263000ustar00rootroot00000000000000ply format ascii 1.0 comment Created by hand element vertex 6 property double x property double y property double z element 2d_element 3 property list uint uint vertex_indices element boundary_condition 2 property uint vertex_index element thickness 1 property double value element material 1 property double mass_density property double poisson_ratio property double young_modulus end_header 1.000000 1.000000 -1.000000 1.000000 -1.000000 -1.000000 -1.000000 -1.000000 -1.000000 1.000000 0.999999 1.000000 -1.000000 1.000000 1.000000 0.999999 -1.000001 1.000000 3 0 1 2 3 1 2 4 3 3 4 5 3 2 0.1 0.2 0.3 0.4opensurgsim-0.7.0/SurgSim/Physics/UnitTests/Data/PlyReaderTests/Fem2DMaterial.ply000066400000000000000000000011431277777236100277550ustar00rootroot00000000000000ply format ascii 1.0 comment Created by hand element vertex 6 property double x property double y property double z element 2d_element 3 property list uint uint vertex_indices property double mass_density property double poisson_ratio property double young_modulus element boundary_condition 2 property uint vertex_index element thickness 1 property double value end_header 1.000000 1.000000 -1.000000 1.000000 -1.000000 -1.000000 -1.000000 -1.000000 -1.000000 1.000000 0.999999 1.000000 -1.000000 1.000000 1.000000 0.999999 -1.000001 1.000000 3 0 1 2 1.0 2.0 3.0 3 1 2 4 4.0 5.0 6.0 3 3 4 5 7.0 8.0 9.0 3 2 0.1opensurgsim-0.7.0/SurgSim/Physics/UnitTests/Data/PlyReaderTests/Fem2DNoMaterial.ply000066400000000000000000000007461277777236100302620ustar00rootroot00000000000000ply format ascii 1.0 comment Created by hand element vertex 6 property double x property double y property double z element 2d_element 3 property list uint uint vertex_indices element boundary_condition 2 property uint vertex_index element thickness 1 property double value end_header 1.000000 1.000000 -1.000000 1.000000 -1.000000 -1.000000 -1.000000 -1.000000 -1.000000 1.000000 0.999999 1.000000 -1.000000 1.000000 1.000000 0.999999 -1.000001 1.000000 3 0 1 2 3 1 2 4 3 3 4 5 3 2 0.1opensurgsim-0.7.0/SurgSim/Physics/UnitTests/Data/PlyReaderTests/Fem3DCube.ply000066400000000000000000000013011277777236100270720ustar00rootroot00000000000000ply format ascii 1.0 comment Created by hand element vertex 10 property double x property double y property double z element 3d_element 3 property list uint uint vertex_indices element boundary_condition 2 property uint vertex_index element material 1 property double mass_density property double poisson_ratio property double young_modulus end_header 1.000000 1.000000 1.000000 1.000000 1.000000 -1.000000 1.000000 -1.000000 1.000000 1.000000 -1.000000 -1.000000 -1.000000 -1.000000 -1.000000 2.000000 2.000000 2.000000 2.000000 -2.000000 2.000000 2.000000 2.000000 -2.000000 2.000000 -2.000000 -2.000000 -2.000000 -2.000000 -2.000000 8 0 1 2 3 4 5 6 7 8 1 2 4 5 6 7 8 9 8 3 4 5 0 2 6 8 7 9 5 0.2 0.3 0.4opensurgsim-0.7.0/SurgSim/Physics/UnitTests/Data/PlyReaderTests/Fem3DCubeMaterial.ply000066400000000000000000000013111277777236100305520ustar00rootroot00000000000000ply format ascii 1.0 comment Created by hand element vertex 10 property double x property double y property double z element 3d_element 3 property list uint uint vertex_indices property double mass_density property double poisson_ratio property double young_modulus element boundary_condition 2 property uint vertex_index end_header 1.000000 1.000000 1.000000 1.000000 1.000000 -1.000000 1.000000 -1.000000 1.000000 1.000000 -1.000000 -1.000000 -1.000000 -1.000000 -1.000000 2.000000 2.000000 2.000000 2.000000 -2.000000 2.000000 2.000000 2.000000 -2.000000 2.000000 -2.000000 -2.000000 -2.000000 -2.000000 -2.000000 8 0 1 2 3 4 5 6 7 1.0 2.0 3.0 8 1 2 4 5 6 7 8 9 4.0 5.0 6.0 8 3 4 5 0 2 6 8 7 7.0 8.0 9.0 9 5opensurgsim-0.7.0/SurgSim/Physics/UnitTests/Data/PlyReaderTests/Fem3DCubeNoMaterial.ply000066400000000000000000000011111277777236100310450ustar00rootroot00000000000000ply format ascii 1.0 comment Created by hand element vertex 10 property double x property double y property double z element 3d_element 3 property list uint uint vertex_indices element boundary_condition 2 property uint vertex_index end_header 1.000000 1.000000 1.000000 1.000000 1.000000 -1.000000 1.000000 -1.000000 1.000000 1.000000 -1.000000 -1.000000 -1.000000 -1.000000 -1.000000 2.000000 2.000000 2.000000 2.000000 -2.000000 2.000000 2.000000 2.000000 -2.000000 2.000000 -2.000000 -2.000000 -2.000000 -2.000000 -2.000000 8 0 1 2 3 4 5 6 7 8 1 2 4 5 6 7 8 9 8 3 4 5 0 2 6 8 7 9 5opensurgsim-0.7.0/SurgSim/Physics/UnitTests/Data/PlyReaderTests/Tetrahedron.ply000066400000000000000000000023761277777236100276710ustar00rootroot00000000000000ply format ascii 1.0 comment Created by hand element vertex 26 property double x property double y property double z element 3d_element 12 property list uint uint vertex_indices element boundary_condition 8 property uint vertex_index element material 1 property double mass_density property double poisson_ratio property double young_modulus end_header 1.000000 1.000000 -1.000000 1.000000 -1.000000 -1.000000 -1.000000 -1.000000 -1.000000 1.000000 0.999999 1.000000 -1.000000 1.000000 1.000000 0.999999 -1.000001 1.000000 1.000000 1.000000 -1.000000 1.000000 0.999999 1.000000 1.000000 -1.000000 -1.000000 1.000000 -1.000000 -1.000000 0.999999 -1.000001 1.000000 -1.000000 -1.000000 -1.000000 -1.000000 -1.000000 -1.000000 -1.000000 -1.000000 1.000000 -1.000000 1.000000 1.000000 1.000000 0.999999 1.000000 1.000000 1.000000 -1.000000 -1.000000 1.000000 1.000000 -1.000000 1.000000 -1.000000 1.000000 0.999999 1.000000 0.999999 -1.000001 1.000000 1.000000 -1.000000 -1.000000 -1.000000 1.000000 -1.000000 -1.000000 -1.000000 1.000000 -1.000000 1.000000 -1.000000 -1.000000 -1.000000 1.000000 4 0 1 2 3 4 3 4 5 6 4 6 7 8 9 4 9 10 11 12 4 12 13 14 15 4 15 16 17 18 4 18 0 2 4 4 19 20 21 5 4 16 22 17 6 4 4 23 5 7 4 24 12 14 8 4 10 25 11 9 8 5 3 2 7 1 6 11 0.1432 0.224 0.472opensurgsim-0.7.0/SurgSim/Physics/UnitTests/Data/PlyReaderTests/Wrong3DFileWithRotationData.ply000066400000000000000000000011451277777236100326340ustar00rootroot00000000000000ply format ascii 1.0 comment Created by hand element vertex 4 property double x property double y property double z property double thetax property double thetay property double thetaZ element 3d_element 1 property list uint uint vertex_indices element boundary_condition 1 property uint vertex_index element material 1 property double mass_density property double poisson_ratio property double young_modulus end_header 1.000000 1.000000 -1.000000 0.0 0.0 0.0 1.000000 -1.000000 -1.000000 0.0 0.0 0.0 -1.000000 -1.000000 -1.000000 0.0 0.0 0.0 1.000000 0.999999 1.000000 0.0 0.0 0.0 4 0 1 2 3 0 0.1432 0.224 0.472 opensurgsim-0.7.0/SurgSim/Physics/UnitTests/Data/PlyReaderTests/WrongDataTetrahedron.ply000066400000000000000000000024101277777236100314650ustar00rootroot00000000000000ply format ascii 1.0 comment Created by hand element vertex 26 property double x property double y property double z element 3d_element 13 property list uint uint vertex_indices element boundary_condition 8 property uint vertex_index element material 1 property double mass_density property double poisson_ratio property double young_modulus end_header 1.000000 1.000000 -1.000000 1.000000 -1.000000 -1.000000 -1.000000 -1.000000 -1.000000 1.000000 0.999999 1.000000 -1.000000 1.000000 1.000000 0.999999 -1.000001 1.000000 1.000000 1.000000 -1.000000 1.000000 0.999999 1.000000 1.000000 -1.000000 -1.000000 1.000000 -1.000000 -1.000000 0.999999 -1.000001 1.000000 -1.000000 -1.000000 -1.000000 -1.000000 -1.000000 -1.000000 -1.000000 -1.000000 1.000000 -1.000000 1.000000 1.000000 1.000000 0.999999 1.000000 1.000000 1.000000 -1.000000 -1.000000 1.000000 1.000000 -1.000000 1.000000 -1.000000 1.000000 0.999999 1.000000 0.999999 -1.000001 1.000000 1.000000 -1.000000 -1.000000 -1.000000 1.000000 -1.000000 -1.000000 -1.000000 1.000000 -1.000000 1.000000 -1.000000 -1.000000 -1.000000 1.000000 4 0 1 2 3 4 3 4 5 6 4 6 7 8 9 4 9 10 11 12 4 12 13 14 15 4 15 16 17 18 4 18 0 2 4 4 19 20 21 5 3 0 1 2 3 4 16 22 17 6 4 4 23 5 7 4 24 12 14 8 4 10 25 11 9 8 5 3 2 7 1 6 11 0.1432 0.224 0.472opensurgsim-0.7.0/SurgSim/Physics/UnitTests/Data/PlyReaderTests/WrongPlyTetrahedron.ply000066400000000000000000000023771277777236100313740ustar00rootroot00000000000000ply format ascii 1.0 comment Created by hand element vertex 26 property double x property double y property double zi element 3d_element 12 property list uint uint vertex_indices element boundary_condition 8 property uint vertex_index element material 1 property double mass_density property double poisson_ratio property double young_modulus end_header 1.000000 1.000000 -1.000000 1.000000 -1.000000 -1.000000 -1.000000 -1.000000 -1.000000 1.000000 0.999999 1.000000 -1.000000 1.000000 1.000000 0.999999 -1.000001 1.000000 1.000000 1.000000 -1.000000 1.000000 0.999999 1.000000 1.000000 -1.000000 -1.000000 1.000000 -1.000000 -1.000000 0.999999 -1.000001 1.000000 -1.000000 -1.000000 -1.000000 -1.000000 -1.000000 -1.000000 -1.000000 -1.000000 1.000000 -1.000000 1.000000 1.000000 1.000000 0.999999 1.000000 1.000000 1.000000 -1.000000 -1.000000 1.000000 1.000000 -1.000000 1.000000 -1.000000 1.000000 0.999999 1.000000 0.999999 -1.000001 1.000000 1.000000 -1.000000 -1.000000 -1.000000 1.000000 -1.000000 -1.000000 -1.000000 1.000000 -1.000000 1.000000 -1.000000 -1.000000 -1.000000 1.000000 4 0 1 2 3 4 3 4 5 6 4 6 7 8 9 4 9 10 11 12 4 12 13 14 15 4 15 16 17 18 4 18 0 2 4 4 19 20 21 5 4 16 22 17 6 4 4 23 5 7 4 24 12 14 8 4 10 25 11 9 8 5 3 2 7 1 6 11 0.1432 0.224 0.472opensurgsim-0.7.0/SurgSim/Physics/UnitTests/DcdCollisionTests.cpp000066400000000000000000000107021277777236100251660ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file DcdCollisionTests.cpp /// Tests for the DcdCollision Class #include #include #include #include "SurgSim/Blocks/SphereElement.h" #include "SurgSim/Collision/CollisionPair.h" #include "SurgSim/Collision/ShapeCollisionRepresentation.h" #include "SurgSim/Framework/BasicSceneElement.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Framework/Scene.h" #include "SurgSim/Framework/SceneElement.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/SphereShape.h" #include "SurgSim/Physics/DcdCollision.h" #include "SurgSim/Physics/PhysicsManager.h" #include "SurgSim/Physics/PhysicsManagerState.h" #include "SurgSim/Physics/PrepareCollisionPairs.h" using SurgSim::Math::Vector3d; namespace SurgSim { namespace Physics { TEST(DcdCollisionTest, ConstructorTest) { ASSERT_NO_THROW(std::make_shared(false)); ASSERT_NO_THROW(std::make_shared(true)); } TEST(DcdCollisionTest, RigidRigidCollisionTest) { auto sphere1 = std::make_shared("Sphere1"); auto sphere2 = std::make_shared("Sphere2"); sphere2->setPose(Math::makeRigidTransform(Math::Quaterniond::Identity(), Vector3d(0.0, 0.0, 0.5))); auto runtime = std::make_shared(); auto scene = runtime->getScene(); scene->addSceneElement(sphere1); scene->addSceneElement(sphere2); std::vector> physicsRepresentations; physicsRepresentations.push_back(sphere1->getComponents()[0]); physicsRepresentations.push_back(sphere2->getComponents()[0]); auto sphere1Collision = sphere1->getComponents()[0]; auto sphere2Collision = sphere2->getComponents()[0]; sphere1Collision->update(0.0); sphere2Collision->update(0.0); std::vector> collisionRepresentations; collisionRepresentations.push_back(sphere1Collision); collisionRepresentations.push_back(sphere2Collision); auto prepareState = std::make_shared(false); auto stateTmp = std::make_shared(); stateTmp->setRepresentations(physicsRepresentations); stateTmp->setCollisionRepresentations(collisionRepresentations); auto state = prepareState->update(0.0, stateTmp); // This step prepares the collision pairs ASSERT_EQ(1u, state->getCollisionPairs().size()); auto dcdCollision = std::make_shared(false); std::shared_ptr newState = dcdCollision->update(1.0, state); EXPECT_TRUE(newState->getCollisionPairs().at(0)->hasContacts()); } TEST(DcdCollisionTest, Deactivate) { auto runtime = std::make_shared(); auto physicsManager = std::make_shared(); runtime->addManager(physicsManager); auto sphere1 = std::make_shared("Sphere1"); sphere1->setShape(std::make_shared(1.0)); auto sphere2 = std::make_shared("Sphere2"); sphere2->setShape(std::make_shared(1.0)); sphere2->setLocalPose(Math::makeRigidTransform(Math::Quaterniond::Identity(), Vector3d(0.0, 0.0, 0.5))); auto scene = runtime->getScene(); auto element = std::make_shared("Element"); element->addComponent(sphere2); element->addComponent(sphere1); scene->addSceneElement(element); runtime->start(true); runtime->step(); runtime->step(); EXPECT_TRUE(sphere1->collidedWith(sphere2)); EXPECT_TRUE(sphere2->collidedWith(sphere1)); sphere1->setLocalActive(false); runtime->step(); runtime->step(); EXPECT_FALSE(sphere1->collidedWith(sphere2)); EXPECT_FALSE(sphere2->collidedWith(sphere1)); boost::this_thread::sleep(boost::posix_time::milliseconds(100)); runtime->stop(); } }; }; opensurgsim-0.7.0/SurgSim/Physics/UnitTests/DeformableCollisionRepresentationTest.cpp000066400000000000000000000146541277777236100313060ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include "SurgSim/Framework/ApplicationData.h" #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Math/MeshShape.h" #include "SurgSim/Math/OdeSolver.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/DeformableCollisionRepresentation.h" #include "SurgSim/Physics/DeformableRepresentation.h" #include "SurgSim/Physics/Fem3DRepresentation.h" #include "SurgSim/Physics/UnitTests/MockObjects.h" namespace { const double epsilon = 1e-10; } namespace SurgSim { namespace Physics { struct DeformableCollisionRepresentationTest : public ::testing::Test { void SetUp() { m_runtime = std::make_shared("config.txt"); m_filename = std::string("Geometry/wound_deformable.ply"); m_meshShape = std::make_shared(); m_meshShape->load(m_filename); m_deformableRepresentation = std::make_shared("DeformableRepresentation"); m_deformableCollisionRepresentation = std::make_shared("DeformableCollisionRepresentation"); } std::shared_ptr m_runtime; std::string m_filename; std::shared_ptr m_meshShape; std::shared_ptr m_deformableRepresentation; std::shared_ptr m_deformableCollisionRepresentation; }; TEST_F(DeformableCollisionRepresentationTest, InitTest) { EXPECT_NO_THROW(DeformableCollisionRepresentation("TestDeformableCollisionRepresentation")); } TEST_F(DeformableCollisionRepresentationTest, SetGetDeformableRepresentationTest) { ASSERT_NO_THROW(m_deformableCollisionRepresentation->setDeformableRepresentation(m_deformableRepresentation)); EXPECT_EQ(m_deformableRepresentation, m_deformableCollisionRepresentation->getDeformableRepresentation()); } TEST_F(DeformableCollisionRepresentationTest, ShapeTest) { EXPECT_ANY_THROW(m_deformableCollisionRepresentation->getShapeType()); m_deformableCollisionRepresentation->setShape(m_meshShape); EXPECT_EQ(SurgSim::Math::SHAPE_TYPE_MESH, m_deformableCollisionRepresentation->getShapeType()); auto meshShape = std::dynamic_pointer_cast(m_deformableCollisionRepresentation->getShape()); EXPECT_NEAR(m_meshShape->getVolume(), meshShape->getVolume(), epsilon); EXPECT_TRUE(m_meshShape->getCenter().isApprox(meshShape->getCenter())); EXPECT_TRUE(m_meshShape->getSecondMomentOfVolume().isApprox(meshShape->getSecondMomentOfVolume())); } TEST_F(DeformableCollisionRepresentationTest, MeshTest) { m_deformableCollisionRepresentation->setShape(m_meshShape); auto actualShape = std::dynamic_pointer_cast( m_deformableCollisionRepresentation->getShape()); ASSERT_NE(nullptr, actualShape); EXPECT_EQ(m_meshShape->getNumVertices(), actualShape->getNumVertices()); EXPECT_EQ(m_meshShape->getNumEdges(), actualShape->getNumEdges()); EXPECT_EQ(m_meshShape->getNumTriangles(), actualShape->getNumTriangles()); } TEST_F(DeformableCollisionRepresentationTest, SerializationTest) { auto shape = std::dynamic_pointer_cast(m_meshShape); m_deformableCollisionRepresentation->setValue("Shape", shape); YAML::Node node; ASSERT_NO_THROW(node = YAML::convert::encode(*m_deformableCollisionRepresentation)); std::shared_ptr newDeformableCollisionRepresentation; ASSERT_NO_THROW(newDeformableCollisionRepresentation = std::dynamic_pointer_cast (node.as>()) ); auto fem3DRepresentation = std::make_shared("Fem3DRepresentation"); fem3DRepresentation->setCollisionRepresentation(newDeformableCollisionRepresentation); newDeformableCollisionRepresentation->initialize(m_runtime); auto mesh = std::dynamic_pointer_cast(newDeformableCollisionRepresentation->getShape()); EXPECT_NEAR(m_meshShape->getVolume(), mesh->getVolume(), epsilon); EXPECT_TRUE(m_meshShape->getCenter().isApprox(mesh->getCenter())); EXPECT_TRUE(m_meshShape->getSecondMomentOfVolume().isApprox(mesh->getSecondMomentOfVolume())); EXPECT_EQ(m_meshShape->getNumVertices(), mesh->getNumVertices()); EXPECT_EQ(m_meshShape->getNumEdges(), mesh->getNumEdges()); EXPECT_EQ(m_meshShape->getNumTriangles(), mesh->getNumTriangles()); } TEST_F(DeformableCollisionRepresentationTest, UpdateAndInitializationTest) { auto fem3DRepresentation = std::make_shared("Fem3DRepresentation"); fem3DRepresentation->loadFem(m_filename); // Member data 'odeState' will be created while loading. ASSERT_TRUE(fem3DRepresentation->initialize(m_runtime)); // Connect Physics representation with Collision representation. fem3DRepresentation->setCollisionRepresentation(m_deformableCollisionRepresentation); // Set the shape used by Collision representation. m_deformableCollisionRepresentation->setShape(m_meshShape); EXPECT_NO_THROW(m_deformableCollisionRepresentation->initialize(m_runtime)); EXPECT_NO_THROW(m_deformableCollisionRepresentation->wakeUp()); EXPECT_NO_THROW(m_deformableCollisionRepresentation->updateShapeData()); EXPECT_TRUE(m_deformableCollisionRepresentation->isActive()); // The MeshShape fails to update due to the normal calculation, making the collision rep inactive auto state = fem3DRepresentation->getCurrentState(); state->getPositions().setConstant(0.0); fem3DRepresentation->setInitialState(state); EXPECT_NO_THROW(m_deformableCollisionRepresentation->updateShapeData()); EXPECT_FALSE(m_deformableCollisionRepresentation->isActive()); } } // namespace Physics } // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/UnitTests/DeformableRepresentationTest.cpp000066400000000000000000000556561277777236100274410ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include "SurgSim/Collision/Representation.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Math/Matrix.h" #include "SurgSim/Math/SparseMatrix.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Math/OdeSolver.h" // Need access to the enum IntegrationScheme #include "SurgSim/Math/OdeSolverEulerExplicit.h" #include "SurgSim/Math/OdeSolverEulerExplicitModified.h" #include "SurgSim/Math/OdeSolverEulerImplicit.h" #include "SurgSim/Math/OdeSolverLinearEulerExplicit.h" #include "SurgSim/Math/OdeSolverLinearEulerExplicitModified.h" #include "SurgSim/Math/OdeSolverLinearEulerImplicit.h" #include "SurgSim/Math/OdeSolverLinearStatic.h" #include "SurgSim/Math/OdeSolverStatic.h" #include "SurgSim/Physics/DeformableCollisionRepresentation.h" #include "SurgSim/Physics/DeformableRepresentation.h" #include "SurgSim/Physics/UnitTests/MockObjects.h" using SurgSim::Math::Matrix; using SurgSim::Math::SparseMatrix; using SurgSim::Math::Vector3d; using SurgSim::Math::Vector; using SurgSim::Physics::DeformableCollisionRepresentation; using SurgSim::Physics::DeformableRepresentation; using SurgSim::Physics::MockDeformableRepresentation; namespace { const size_t numNodes = 1; const double epsilon = 1e-10; }; // anonymous namespace class DeformableRepresentationTest: public MockDeformableRepresentation, public ::testing::Test { public: DeformableRepresentationTest() : MockDeformableRepresentation() { } virtual ~DeformableRepresentationTest() { } /// Setup the test case void SetUp() override { m_localInitialState = std::make_shared(); m_localInitialState->setNumDof(getNumDofPerNode(), numNodes); m_localInitialState->getPositions().setLinSpaced(0.0, static_cast(getNumDofPerNode() * numNodes - 1)); m_localInitialState->getVelocities().setOnes(); SurgSim::Math::Quaterniond q(0.1, 0.4, 0.5, 0.2); q.normalize(); Vector3d t(1.45, 5.4, 2.42); m_nonIdentityTransform = SurgSim::Math::makeRigidTransform(q, t); m_identityTransform = SurgSim::Math::RigidTransform3d::Identity(); m_localization0 = std::make_shared(); m_localization0->setLocalNode(0); } protected: // Initial state std::shared_ptr m_localInitialState; // Identity and nonIdentity (but still valid) transforms SurgSim::Math::RigidTransform3d m_identityTransform; SurgSim::Math::RigidTransform3d m_nonIdentityTransform; // Localization of node 0, to apply external force std::shared_ptr m_localization0; }; TEST_F(DeformableRepresentationTest, ConstructorTest) { // Test the constructor normally ASSERT_NO_THROW({MockDeformableRepresentation deformable;}); // Test the object creation through the operator new ASSERT_NO_THROW({MockDeformableRepresentation* deformable = new MockDeformableRepresentation; delete deformable;}); // Test the object creation through the operator new [] ASSERT_NO_THROW({MockDeformableRepresentation* deformable = new MockDeformableRepresentation[10]; \ delete [] deformable; }); // Test the object creation through a shared_ptr ASSERT_NO_THROW({std::shared_ptr deformable = \ std::make_shared(); }); } TEST_F(DeformableRepresentationTest, SetGetTest) { // Test setLocalPose/getLocalPose setLocalPose(m_nonIdentityTransform); EXPECT_TRUE(getLocalPose().isApprox(m_nonIdentityTransform, epsilon)); EXPECT_FALSE(getLocalPose().isApprox(m_identityTransform, epsilon)); EXPECT_FALSE(getPose().isApprox(m_identityTransform, epsilon)); setLocalPose(m_identityTransform); EXPECT_FALSE(getLocalPose().isApprox(m_nonIdentityTransform, epsilon)); EXPECT_TRUE(getLocalPose().isApprox(m_identityTransform, epsilon)); EXPECT_TRUE(getPose().isApprox(m_identityTransform, epsilon)); // Test set/get states // Note that the initialState is in OdeEquation but is set in DeformableRepresentation // Its getter is actually in OdeEquation (considered tested here) EXPECT_EQ(0, getExternalGeneralizedForce().size()); EXPECT_EQ(0, getExternalGeneralizedStiffness().rows()); EXPECT_EQ(0, getExternalGeneralizedStiffness().cols()); EXPECT_EQ(0, getExternalGeneralizedDamping().rows()); EXPECT_EQ(0, getExternalGeneralizedDamping().cols()); setInitialState(m_localInitialState); SparseMatrix zeroMatrix(static_cast(getNumDof()), static_cast(getNumDof())); EXPECT_EQ(getNumDof(), getExternalGeneralizedForce().size()); EXPECT_EQ(getNumDof(), getExternalGeneralizedStiffness().rows()); EXPECT_EQ(getNumDof(), getExternalGeneralizedStiffness().cols()); EXPECT_EQ(getNumDof(), getExternalGeneralizedDamping().rows()); EXPECT_EQ(getNumDof(), getExternalGeneralizedDamping().cols()); EXPECT_TRUE(getExternalGeneralizedForce().isZero()); EXPECT_TRUE(getExternalGeneralizedStiffness().isApprox(zeroMatrix)); EXPECT_TRUE(getExternalGeneralizedDamping().isApprox(zeroMatrix)); /// Set/Get the numerical integration scheme for (int integerScheme = 0; integerScheme < SurgSim::Math::MAX_INTEGRATIONSCHEMES; integerScheme++) { auto integrationScheme = static_cast(integerScheme); EXPECT_NO_THROW(setIntegrationScheme(integrationScheme)); EXPECT_EQ(integrationScheme, getIntegrationScheme()); } setIntegrationScheme(SurgSim::Math::INTEGRATIONSCHEME_EULER_EXPLICIT); EXPECT_EQ(nullptr, getOdeSolver()); /// Set/Get the linear solver for (int integerLinearSolver = 0; integerLinearSolver < SurgSim::Math::MAX_LINEARSOLVER; integerLinearSolver++) { auto linearSolver = static_cast(integerLinearSolver); EXPECT_NO_THROW(setLinearSolver(linearSolver)); EXPECT_EQ(linearSolver, getLinearSolver()); } setLinearSolver(SurgSim::Math::LINEARSOLVER_CONJUGATEGRADIENT); initialize(std::make_shared()); EXPECT_NE(nullptr, getOdeSolver()); EXPECT_NE(nullptr, std::dynamic_pointer_cast(getOdeSolver())); EXPECT_NE(nullptr, std::dynamic_pointer_cast(getOdeSolver()->getLinearSolver())); EXPECT_THROW(setIntegrationScheme(SurgSim::Math::INTEGRATIONSCHEME_EULER_EXPLICIT), SurgSim::Framework::AssertionFailure); EXPECT_THROW(setLinearSolver(SurgSim::Math::LINEARSOLVER_LU), SurgSim::Framework::AssertionFailure); wakeUp(); EXPECT_TRUE(*m_initialState == *m_localInitialState); EXPECT_TRUE(*m_currentState == *m_localInitialState); EXPECT_TRUE(*m_previousState == *m_localInitialState); EXPECT_TRUE(*m_finalState == *m_localInitialState); EXPECT_TRUE(*getInitialState() == *m_localInitialState); EXPECT_TRUE(*getPreviousState() == *m_localInitialState); EXPECT_TRUE(*getCurrentState() == *m_localInitialState); EXPECT_TRUE(*getFinalState() == *m_localInitialState); // Test getNumDofPerNode EXPECT_EQ(3, getNumDofPerNode()); // Test getNumDof (needs to be tested after setInitialState has been called) EXPECT_EQ(getNumDofPerNode() * numNodes, getNumDof()); } TEST_F(DeformableRepresentationTest, GetComplianceMatrix) { double dt = 1e-3; EXPECT_NO_THROW(setInitialState(m_localInitialState)); EXPECT_NO_THROW(EXPECT_TRUE(initialize(std::make_shared()))); EXPECT_NO_THROW(EXPECT_TRUE(wakeUp())); // This call solves the Ode equation and computes the compliance matrix using the default ode solver // Explicit Euler => M.a(t+dt) = F(t) <=> M/dt.deltaV = F(t) // So the compliance matrix will be (M/dt)^-1 // In our case, M = Identity, so the compliance matrix will be Identity*dt EXPECT_NO_THROW(update(dt)); EXPECT_NO_THROW(EXPECT_TRUE(applyCompliance(*m_localInitialState, Matrix::Identity(3, 3)).isApprox(Matrix::Identity(3, 3) * dt))); } TEST_F(DeformableRepresentationTest, ResetStateTest) { // setInitialState sets all 4 states (tested in method above !) setInitialState(m_localInitialState); // Initialize and wake-up the deformable component EXPECT_NO_THROW(EXPECT_TRUE(initialize(std::make_shared()))); EXPECT_NO_THROW(EXPECT_TRUE(wakeUp())); // 1st time step beforeUpdate(1e-3); update(1e-3); afterUpdate(1e-3); // 2nd time step beforeUpdate(1e-3); update(1e-3); afterUpdate(1e-3); EXPECT_TRUE(*m_localInitialState == *m_initialState); EXPECT_FALSE(*m_localInitialState == *m_previousState); EXPECT_FALSE(*m_localInitialState == *m_currentState); EXPECT_FALSE(*m_localInitialState == *m_finalState); EXPECT_TRUE(*m_localInitialState == *getInitialState()); EXPECT_FALSE(*m_localInitialState == *getPreviousState()); EXPECT_FALSE(*m_localInitialState == *getCurrentState()); EXPECT_FALSE(*m_localInitialState == *getFinalState()); resetState(); // reset should re-initialized current, previous and final to initial EXPECT_TRUE(*m_localInitialState == *m_initialState); EXPECT_TRUE(*m_localInitialState == *m_previousState); EXPECT_TRUE(*m_localInitialState == *m_currentState); EXPECT_TRUE(*m_localInitialState == *m_finalState); EXPECT_TRUE(*m_localInitialState == *getInitialState()); EXPECT_TRUE(*m_localInitialState == *getPreviousState()); EXPECT_TRUE(*m_localInitialState == *getCurrentState()); EXPECT_TRUE(*m_localInitialState == *getFinalState()); } TEST_F(DeformableRepresentationTest, DeactivateAndResetTest) { // setInitialState sets all 4 states (tested in method above !) setInitialState(m_localInitialState); // Initialize and wake-up the deformable component EXPECT_NO_THROW(EXPECT_TRUE(initialize(std::make_shared()))); EXPECT_NO_THROW(EXPECT_TRUE(wakeUp())); // 1st time step ASSERT_TRUE(isActive()); beforeUpdate(1e-3); update(1e-3); afterUpdate(1e-3); ASSERT_TRUE(isActive()); deactivateAndReset(); ASSERT_FALSE(isActive()); EXPECT_TRUE(*m_localInitialState == *m_initialState); EXPECT_TRUE(*m_localInitialState == *m_previousState); EXPECT_TRUE(*m_localInitialState == *m_currentState); EXPECT_TRUE(*m_localInitialState == *m_finalState); EXPECT_TRUE(*m_localInitialState == *getInitialState()); EXPECT_TRUE(*m_localInitialState == *getPreviousState()); EXPECT_TRUE(*m_localInitialState == *getCurrentState()); EXPECT_TRUE(*m_localInitialState == *getFinalState()); } TEST_F(DeformableRepresentationTest, UpdateTest) { // update assert on m_odeSolver (wakeUp) and m_initialState (setInitialState) EXPECT_THROW(update(1e-3), SurgSim::Framework::AssertionFailure); // setInitialState sets all 4 states (tested in method above !) setInitialState(m_localInitialState); // update assert on m_odeSolver (wakeUp) and m_initialState (setInitialState) EXPECT_THROW(update(1e-3), SurgSim::Framework::AssertionFailure); // Initialize and wake-up the deformable component EXPECT_NO_THROW(EXPECT_TRUE(initialize(std::make_shared()))); EXPECT_NO_THROW(EXPECT_TRUE(wakeUp())); // update should backup current into previous and change current EXPECT_NO_THROW(update(1e-3)); EXPECT_TRUE(*m_localInitialState == *m_initialState); EXPECT_TRUE(*m_localInitialState == *m_previousState); EXPECT_FALSE(*m_localInitialState == *m_currentState); EXPECT_TRUE(*m_localInitialState == *m_finalState); EXPECT_TRUE(*m_localInitialState == *getInitialState()); EXPECT_TRUE(*m_localInitialState == *getPreviousState()); EXPECT_FALSE(*m_localInitialState == *getCurrentState()); EXPECT_TRUE(*m_localInitialState == *getFinalState()); EXPECT_FALSE(*m_previousState == *m_currentState); EXPECT_FALSE(*getCurrentState() == *getPreviousState()); } TEST_F(DeformableRepresentationTest, UpdateResetTest) { m_localInitialState->getVelocities()[0] = std::numeric_limits::infinity(); setInitialState(m_localInitialState); // Initialize and wake-up the deformable component EXPECT_NO_THROW(EXPECT_TRUE(initialize(std::make_shared()))); EXPECT_NO_THROW(EXPECT_TRUE(wakeUp())); // update should backup current into previous and change current EXPECT_TRUE(isActive()); EXPECT_NO_THROW(update(1e-3)); EXPECT_FALSE(isActive()); } TEST_F(DeformableRepresentationTest, AfterUpdateTest) { // setInitialState sets all 4 states (tested in method above !) setInitialState(m_localInitialState); SparseMatrix zeroMatrix(static_cast(getNumDof()), static_cast(getNumDof())); // Initialize and wake-up the deformable component EXPECT_NO_THROW(EXPECT_TRUE(initialize(std::make_shared()))); EXPECT_NO_THROW(EXPECT_TRUE(wakeUp())); // Set external generalized force/stiffness/damping EXPECT_TRUE(getExternalGeneralizedForce().isZero()); EXPECT_TRUE(getExternalGeneralizedStiffness().isApprox(zeroMatrix)); EXPECT_TRUE(getExternalGeneralizedDamping().isApprox(zeroMatrix)); SurgSim::Math::Vector F = SurgSim::Math::Vector::LinSpaced(getNumDofPerNode(), -2.34, 4.41); SurgSim::Math::Matrix K = SurgSim::Math::Matrix::Ones(getNumDofPerNode(), getNumDofPerNode()); SurgSim::Math::Matrix D = 2.3 * K; addExternalGeneralizedForce(m_localization0, F, K, D); EXPECT_FALSE(getExternalGeneralizedForce().isZero()); EXPECT_FALSE(getExternalGeneralizedStiffness().isApprox(zeroMatrix)); EXPECT_FALSE(getExternalGeneralizedDamping().isApprox(zeroMatrix)); EXPECT_TRUE(getExternalGeneralizedForce().isApprox(F)); EXPECT_TRUE(getExternalGeneralizedStiffness().isApprox(K)); EXPECT_TRUE(getExternalGeneralizedDamping().isApprox(D)); // update should backup current into previous and change current EXPECT_NO_THROW(update(1e-3)); // afterUpdate should backup current into final EXPECT_NO_THROW(afterUpdate(1e-3)); // External generalized force/stiffness/damping should have been reset EXPECT_TRUE(getExternalGeneralizedForce().isZero()); EXPECT_TRUE(getExternalGeneralizedStiffness().isApprox(zeroMatrix)); EXPECT_TRUE(getExternalGeneralizedDamping().isApprox(zeroMatrix)); EXPECT_TRUE(*m_localInitialState == *m_initialState); EXPECT_TRUE(*m_localInitialState == *m_previousState); EXPECT_FALSE(*m_localInitialState == *m_currentState); EXPECT_FALSE(*m_localInitialState == *m_finalState); EXPECT_TRUE(*m_localInitialState == *getInitialState()); EXPECT_TRUE(*m_localInitialState == *getPreviousState()); EXPECT_FALSE(*m_localInitialState == *getCurrentState()); EXPECT_FALSE(*m_localInitialState == *getFinalState()); EXPECT_FALSE(*m_currentState == *m_previousState); EXPECT_TRUE(*m_currentState == *m_finalState); EXPECT_FALSE(*getCurrentState() == *getPreviousState()); EXPECT_TRUE(*getCurrentState() == *getFinalState()); } TEST_F(DeformableRepresentationTest, ApplyCorrectionTest) { const double dt = 1e-3; MockDeformableRepresentation object; std::shared_ptr initialState = std::make_shared(); initialState->setNumDof(object.getNumDofPerNode(), 3); object.setInitialState(initialState); SurgSim::Math::Vector dv; dv.resize(object.getNumDof()); for (size_t i = 0; i < object.getNumDof(); i++) { dv(i) = static_cast(i); } Eigen::VectorXd previousX = object.getCurrentState()->getPositions(); Eigen::VectorXd previousV = object.getCurrentState()->getVelocities(); // Test with a valid state object.applyCorrection(dt, dv.segment(0, object.getNumDof())); Eigen::VectorXd nextX = object.getCurrentState()->getPositions(); Eigen::VectorXd nextV = object.getCurrentState()->getVelocities(); EXPECT_TRUE(nextX.isApprox(previousX + dv * dt, epsilon)); EXPECT_TRUE(nextV.isApprox(previousV + dv, epsilon)); // Test with an invalid state dv(0) = std::numeric_limits::infinity(); EXPECT_TRUE(object.isActive()); object.applyCorrection(dt, dv.segment(0, object.getNumDof())); EXPECT_FALSE(object.isActive()); } TEST_F(DeformableRepresentationTest, SetCollisionRepresentationTest) { // setCollisionRepresentation requires the object to be a shared_ptr (using getShared()) std::shared_ptr object = std::make_shared(); auto collisionRep = std::make_shared("DeformableCollisionRepresentation"); EXPECT_NE(nullptr, collisionRep); // Test default collision representation to be nullptr EXPECT_EQ(nullptr, object->getCollisionRepresentation()); // Test setting a valid non null collision rep EXPECT_NO_THROW(object->setCollisionRepresentation(collisionRep)); EXPECT_EQ(collisionRep, object->getCollisionRepresentation()); // Test setting a null collision rep EXPECT_NO_THROW(object->setCollisionRepresentation(nullptr)); EXPECT_EQ(nullptr, object->getCollisionRepresentation()); } TEST_F(DeformableRepresentationTest, DoInitializeFailTest) { // The initial state needs to be set prior to calling initialize EXPECT_THROW(initialize(std::make_shared()), SurgSim::Framework::AssertionFailure); } TEST_F(DeformableRepresentationTest, DoInitializeTest) { // setInitialState sets all 4 states (tested in method above !) EXPECT_NO_THROW(setLocalPose(m_nonIdentityTransform)); setInitialState(m_localInitialState); EXPECT_NO_THROW(EXPECT_TRUE(initialize(std::make_shared()))); EXPECT_THROW(setLocalPose(m_nonIdentityTransform), SurgSim::Framework::AssertionFailure); // Test the initial transformation applied to all the states for (size_t nodeId = 0; nodeId < numNodes; nodeId++) { Vector3d expectedPosition = m_nonIdentityTransform * Vector3d::LinSpaced(static_cast(nodeId) * 3, (static_cast(nodeId) + 1) * 3 - 1); Vector3d expectedVelocity = m_nonIdentityTransform.rotation() * Vector3d::Ones(); EXPECT_TRUE(getInitialState()->getPosition(nodeId).isApprox(expectedPosition)); EXPECT_TRUE(getInitialState()->getVelocity(nodeId).isApprox(expectedVelocity)); } EXPECT_EQ(*getPreviousState(), *getInitialState()); EXPECT_EQ(*getCurrentState(), *getInitialState()); EXPECT_EQ(*getFinalState(), *getInitialState()); } TEST_F(DeformableRepresentationTest, DoWakeUpTest) { using SurgSim::Math::OdeSolverEulerExplicit; using SurgSim::Math::OdeSolverEulerExplicitModified; using SurgSim::Math::OdeSolverEulerImplicit; using SurgSim::Math::OdeSolverStatic; using SurgSim::Math::OdeSolverLinearEulerExplicit; using SurgSim::Math::OdeSolverLinearEulerExplicitModified; using SurgSim::Math::OdeSolverLinearEulerImplicit; using SurgSim::Math::OdeSolverLinearStatic; using SurgSim::Math::LinearSparseSolveAndInverseLU; // setInitialState sets all 4 states (tested in method above !) setLocalPose(m_nonIdentityTransform); setInitialState(m_localInitialState); EXPECT_NO_THROW(EXPECT_TRUE(initialize(std::make_shared()))); EXPECT_NO_THROW(EXPECT_TRUE(wakeUp())); // Test the Ode Solver ASSERT_NE(nullptr, m_odeSolver); ASSERT_NE(nullptr, m_odeSolver->getLinearSolver()); std::shared_ptr expectedLinearSolverType; expectedLinearSolverType = std::dynamic_pointer_cast (m_odeSolver->getLinearSolver()); ASSERT_NE(nullptr, expectedLinearSolverType); typedef OdeSolverEulerExplicit EESolver; EESolver* explicitEuler; explicitEuler = dynamic_cast(m_odeSolver.get()); ASSERT_NE(nullptr, explicitEuler); typedef OdeSolverEulerExplicitModified MEESolver; MEESolver* modifiedExplicitEuler; modifiedExplicitEuler = dynamic_cast(m_odeSolver.get()); ASSERT_EQ(nullptr, modifiedExplicitEuler); typedef OdeSolverEulerImplicit IESolver; IESolver* implicitEuler; implicitEuler = dynamic_cast(m_odeSolver.get()); ASSERT_EQ(nullptr, implicitEuler); typedef OdeSolverStatic StaticSolver; StaticSolver* staticSolver; staticSolver = dynamic_cast(m_odeSolver.get()); ASSERT_EQ(nullptr, staticSolver); typedef OdeSolverLinearEulerExplicit EELinearSolver; EELinearSolver* explicitEulerLinear; explicitEulerLinear = dynamic_cast(m_odeSolver.get()); ASSERT_EQ(nullptr, explicitEulerLinear); typedef OdeSolverLinearEulerExplicitModified MEELinearSolver; MEELinearSolver* modifiedExplicitEulerLinear; modifiedExplicitEulerLinear = dynamic_cast(m_odeSolver.get()); ASSERT_EQ(nullptr, modifiedExplicitEulerLinear); typedef OdeSolverLinearEulerImplicit IELinearSolver; IELinearSolver* implicitEulerLinear; implicitEulerLinear = dynamic_cast(m_odeSolver.get()); ASSERT_EQ(nullptr, implicitEulerLinear); typedef OdeSolverLinearStatic StaticLinearSolver; StaticLinearSolver* staticLinearSolver; staticLinearSolver = dynamic_cast(m_odeSolver.get()); ASSERT_EQ(nullptr, staticLinearSolver); } TEST_F(DeformableRepresentationTest, SerializationTest) { { SCOPED_TRACE("Encode a DeformableRepresentation object with valid DeformableCollisionRepresentation, no throw"); auto deformableRepresentation = std::make_shared("TestRigidRepresentation"); deformableRepresentation->setValue("IntegrationScheme", SurgSim::Math::INTEGRATIONSCHEME_LINEAR_STATIC); std::shared_ptr deformableCollisionRepresentation = std::make_shared("DeformableCollisionRepresentation"); deformableRepresentation->setValue("CollisionRepresentation", deformableCollisionRepresentation); YAML::Node node; ASSERT_NO_THROW(node = YAML::convert::encode(*deformableRepresentation)); EXPECT_TRUE(node.IsMap()); EXPECT_EQ(1u, node.size()); YAML::Node data = node["SurgSim::Physics::MockDeformableRepresentation"]; EXPECT_EQ(10u, data.size()); std::shared_ptr newRepresentation; newRepresentation = std::dynamic_pointer_cast (node.as>()); EXPECT_NE(nullptr, newRepresentation->getCollisionRepresentation()); auto collisionRepresentation = newRepresentation->getValue>("CollisionRepresentation"); auto newDeformableCollisionRepresentation = std::dynamic_pointer_cast(collisionRepresentation); EXPECT_NE(nullptr, newDeformableCollisionRepresentation); EXPECT_EQ("SurgSim::Physics::MockDeformableRepresentation", newRepresentation->getClassName()); EXPECT_EQ(newRepresentation, newDeformableCollisionRepresentation->getDeformableRepresentation()); EXPECT_EQ(SurgSim::Math::INTEGRATIONSCHEME_LINEAR_STATIC, newRepresentation->getValue("IntegrationScheme")); } } opensurgsim-0.7.0/SurgSim/Physics/UnitTests/DeformableTestsUtility-inl.h000066400000000000000000000044131277777236100264730ustar00rootroot00000000000000// Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file DeformableTestsUtility.h /// Common functions for testing deformable compute/update functions. #ifndef SURGSIM_PHYSICS_UNITTESTS_DEFORMABLETESTSUTILITY_INL_H #define SURGSIM_PHYSICS_UNITTESTS_DEFORMABLETESTSUTILITY_INL_H template void SurgSim::Physics::testOdeEquationUpdate(std::shared_ptr rep, const SurgSim::Math::OdeState& state, const SurgSim::Math::Vector& expectedF, const SurgSim::Math::Matrix& expectedM, const SurgSim::Math::Matrix& expectedD, const SurgSim::Math::Matrix& expectedK) { using SurgSim::Math::OdeEquationUpdate; auto odeEquation = std::dynamic_pointer_cast(rep); odeEquation->updateFMDK(state, OdeEquationUpdate::ODEEQUATIONUPDATE_F); EXPECT_NO_THROW(EXPECT_TRUE(odeEquation->getF().isApprox(expectedF))); odeEquation->updateFMDK(state, OdeEquationUpdate::ODEEQUATIONUPDATE_M); EXPECT_NO_THROW(EXPECT_TRUE(odeEquation->getM().isApprox(expectedM))); odeEquation->updateFMDK(state, OdeEquationUpdate::ODEEQUATIONUPDATE_D); EXPECT_NO_THROW(EXPECT_TRUE(odeEquation->getD().isApprox(expectedD))); odeEquation->updateFMDK(state, OdeEquationUpdate::ODEEQUATIONUPDATE_K); EXPECT_NO_THROW(EXPECT_TRUE(odeEquation->getK().isApprox(expectedK))); // Test combo method computeFMDK rep->clearFMDK(); odeEquation->updateFMDK(state, OdeEquationUpdate::ODEEQUATIONUPDATE_FMDK); EXPECT_NO_THROW(EXPECT_TRUE(odeEquation->getF().isApprox(expectedF))); EXPECT_NO_THROW(EXPECT_TRUE(odeEquation->getM().isApprox(expectedM))); EXPECT_NO_THROW(EXPECT_TRUE(odeEquation->getD().isApprox(expectedD))); EXPECT_NO_THROW(EXPECT_TRUE(odeEquation->getK().isApprox(expectedK))); } #endif // SURGSIM_PHYSICS_UNITTESTS_DEFORMABLETESTSUTILITY_INL_H opensurgsim-0.7.0/SurgSim/Physics/UnitTests/DeformableTestsUtility.h000066400000000000000000000026311277777236100257130ustar00rootroot00000000000000// Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file DeformableTestsUtility.h /// Common functions for testing deformable compute/update functions. #ifndef SURGSIM_PHYSICS_UNITTESTS_DEFORMABLETESTSUTILITY_H #define SURGSIM_PHYSICS_UNITTESTS_DEFORMABLETESTSUTILITY_H #include #include "SurgSim/Math/OdeEquation.h" #include "SurgSim/Math/OdeState.h" #include "SurgSim/Math/Matrix.h" #include "SurgSim/Math/Vector.h" namespace SurgSim { namespace Physics { template void testOdeEquationUpdate(std::shared_ptr rep, const SurgSim::Math::OdeState& state, const SurgSim::Math::Vector& expectedF, const SurgSim::Math::Matrix& expectedM, const SurgSim::Math::Matrix& expectedD, const SurgSim::Math::Matrix& expectedK); } } #include "SurgSim/Physics/UnitTests/DeformableTestsUtility-inl.h" #endif // SURGSIM_PHYSICS_UNITTESTS_DEFORMABLETESTSUTILITY_H opensurgsim-0.7.0/SurgSim/Physics/UnitTests/EigenGtestAsserts.cpp000066400000000000000000000050571277777236100252070ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include #include #include "SurgSim/Physics/UnitTests/EigenGtestAsserts.h" namespace SurgSim { namespace Physics { namespace Testing { ::testing::AssertionResult AssertMatricesEqual(const char *expected_expr, const char *actual_expr, const char *abs_err_expr, const Eigen::MatrixXd &expected, const Eigen::MatrixXd &actual, double abs_err) { if ((expected.rows() != actual.rows()) || (expected.cols() != actual.cols())) { return ::testing::AssertionFailure() << "Sizes do not match." << std::endl << "Actual: [" << actual.rows() << ", " << actual.cols() << "]" << std::endl << "Expected: [" << expected.rows() << ", " << expected.cols() << "]" << std::endl; } if (!expected.isApprox(actual, abs_err)) { ::testing::AssertionResult result = ::testing::AssertionFailure() << "Matrices are not within epsilon of each other." << std::endl << "Difference: " << (actual - expected).norm() << std::endl << "Epsilon: " << abs_err << std::endl; if (expected.cols() == 1 || expected.rows() == 1) { typedef std::tuple DifferenceTuple; std::vector differences; for (int index = 0; index < expected.size(); ++index) { if (std::abs(expected(index) - actual(index)) > abs_err) { differences.emplace_back(index, expected(index), actual(index)); } } result << "Total differing values: " << differences.size() << std::endl; for (std::vector::iterator it = std::begin(differences); it != std::end(differences); ++it) { result << "[Index, Expected, Actual]: " << std::get<0>(*it) << ", " << std::get<1>(*it) << ", " << std::get<2>(*it) << std::endl; } } return result; } return ::testing::AssertionSuccess(); } } // namespace Testing } // namespace Physics } // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/UnitTests/EigenGtestAsserts.h000066400000000000000000000030641277777236100246500ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_UNITTESTS_EIGENGTESTASSERTS_H #define SURGSIM_PHYSICS_UNITTESTS_EIGENGTESTASSERTS_H #include #include namespace SurgSim { namespace Physics { namespace Testing { ::testing::AssertionResult AssertMatricesEqual(const char *expected_expr, const char *actual_expr, const char *abs_err_expr, const Eigen::MatrixXd &expected, const Eigen::MatrixXd &actual, double abs_err); } // namespace Testing } // namespace Physics } // namespace SurgSim #define EXPECT_NEAR_EIGEN(expected, actual, abs_err) \ EXPECT_PRED_FORMAT3(SurgSim::Physics::Testing::AssertMatricesEqual, (expected), (actual), (abs_err)) #define ASSERT_NEAR_EIGEN(expected, actual, abs_err) \ ASSERT_PRED_FORMAT3(SurgSim::Physics::Testing::AssertMatricesEqual, (expected), (actual), (abs_err)) #endif // SURGSIM_PHYSICS_UNITTESTS_EIGENGTESTASSERTS_H opensurgsim-0.7.0/SurgSim/Physics/UnitTests/Fem1DConstraintFixedPointTests.cpp000066400000000000000000000211341277777236100275540ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include #include "SurgSim/DataStructures/IndexedLocalCoordinate.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Math/MlcpConstraintType.h" #include "SurgSim/Math/OdeState.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/ConstraintData.h" #include "SurgSim/Physics/Representation.h" #include "SurgSim/Physics/Fem1DElementBeam.h" #include "SurgSim/Physics/Fem1DLocalization.h" #include "SurgSim/Physics/Fem1DRepresentation.h" #include "SurgSim/Physics/FemConstraintFixedPoint.h" #include "SurgSim/Physics/UnitTests/EigenGtestAsserts.h" using SurgSim::Math::Vector2d; using SurgSim::Math::Vector3d; using SurgSim::Math::Vector4d; using SurgSim::Math::Vector6d; namespace { const double epsilon = 1e-10; const double dt = 1e-3; }; namespace SurgSim { namespace Physics { static std::shared_ptr getBeam(size_t node0, size_t node1, double radius, double massDensity, double poissonRatio, double youngModulus) { std::array nodeIds = {node0, node1}; auto element = std::make_shared(nodeIds); element->setMassDensity(massDensity); element->setPoissonRatio(poissonRatio); element->setYoungModulus(youngModulus); element->setRadius(radius); return element; } static std::shared_ptr getFem1d(const std::string &name, double radius = 0.01, double massDensity = 1.0, double poissonRatio = 0.1, double youngModulus = 1.0) { auto fem = std::make_shared(name); auto state = std::make_shared(); state->setNumDof(6, 4); std::array p0 = {{0.11, 0.22, 0.33, 0.44, 0.55, 0.66}}; std::array p1 = {{0.12, -0.23, 0.34, -0.45, 0.56, -0.67}}; std::array p2 = {{-0.10, 0.21, -0.32, 0.43, -0.54, 0.65}}; std::array p3 = {{0.2, 0.2, 0.2, 0.2, 0.2, 0.2}}; state->getPositions().segment<6>(0 * 6) = Vector6d(p0.data()); state->getPositions().segment<6>(1 * 6) = Vector6d(p1.data()); state->getPositions().segment<6>(2 * 6) = Vector6d(p2.data()); state->getPositions().segment<6>(3 * 6) = Vector6d(p3.data()); fem->addFemElement(getBeam(0, 1, radius, massDensity, poissonRatio, youngModulus)); fem->addFemElement(getBeam(1, 2, radius, massDensity, poissonRatio, youngModulus)); fem->addFemElement(getBeam(2, 3, radius, massDensity, poissonRatio, youngModulus)); fem->setInitialState(state); fem->initialize(std::make_shared()); fem->wakeUp(); fem->setIsGravityEnabled(false); fem->beforeUpdate(dt); fem->update(dt); return fem; } TEST(Fem1DConstraintFixedPointTests, Constructor) { ASSERT_NO_THROW({ FemConstraintFixedPoint constraint; }); } TEST(Fem1DConstraintFixedPointTests, Constants) { FemConstraintFixedPoint constraint; EXPECT_EQ(SurgSim::Physics::FIXED_3DPOINT, constraint.getConstraintType()); EXPECT_EQ(3u, constraint.getNumDof()); } TEST(Fem1DConstraintFixedPointTests, BuildMlcpBasic) { // Whitebox test which validates ConstraintImplementation::build's output parameter, MlcpPhysicsProblem. It assumes // CHt and HCHt can be correctly built given H, so it does not necessarily construct the physical parameters // necessary to supply a realistic C. It only checks H and b. FemConstraintFixedPoint constraint; Vector3d actual; // Setup parameters for FemConstraintFixedPoint::build auto localization = std::make_shared(getFem1d("representation"), SurgSim::DataStructures::IndexedLocalCoordinate(2u, Vector2d(1.0, 0.0))); actual = localization->calculatePosition(); MlcpPhysicsProblem mlcpPhysicsProblem = MlcpPhysicsProblem::Zero(24, 3, 1); ConstraintData emptyConstraint; ASSERT_NO_THROW(constraint.build( dt, emptyConstraint, localization, &mlcpPhysicsProblem, 0, 0, SurgSim::Physics::CONSTRAINT_POSITIVE_SIDE)); // Compare results Eigen::Matrix violation = actual; EXPECT_NEAR_EIGEN(violation, mlcpPhysicsProblem.b, epsilon); Eigen::Matrix H = Eigen::Matrix::Zero(); Eigen::Matrix identity = Eigen::Matrix::Identity(); SurgSim::Math::setSubMatrix(1.0 * dt * identity, 0, 4, 3, 3, &H); // This weight is on node 2 (beam 2, nodeId 0) EXPECT_NEAR_EIGEN(H, mlcpPhysicsProblem.H, epsilon); EXPECT_EQ(0u, mlcpPhysicsProblem.constraintTypes.size()); } TEST(Fem1DConstraintFixedPointTests, BuildMlcp) { // Whitebox test which validates ConstraintImplementation::build's output parameter, MlcpPhysicsProblem. It assumes // CHt and HCHt can be correctly built given H, so it does not necessarily construct the physical parameters // necessary to supply a realistic C. It only checks H and b. FemConstraintFixedPoint constraint; Vector3d actual; // Setup parameters for FemConstraintFixedPoint::build auto localization = std::make_shared(getFem1d("representation"), SurgSim::DataStructures::IndexedLocalCoordinate(2u, Vector2d(0.3, 0.7))); actual = localization->calculatePosition(); MlcpPhysicsProblem mlcpPhysicsProblem = MlcpPhysicsProblem::Zero(24, 3, 1); ConstraintData emptyConstraint; ASSERT_NO_THROW(constraint.build( dt, emptyConstraint, localization, &mlcpPhysicsProblem, 0, 0, SurgSim::Physics::CONSTRAINT_POSITIVE_SIDE)); // Compare results Eigen::Matrix violation = actual; EXPECT_NEAR_EIGEN(violation, mlcpPhysicsProblem.b, epsilon); Eigen::Matrix H = Eigen::Matrix::Zero(); Eigen::Matrix identity = Eigen::Matrix::Identity(); SurgSim::Math::setSubMatrix(0.3 * dt * identity, 0, 4, 3, 3, &H); // This weight is on node 2 (beam 2, nodeId 0) SurgSim::Math::setSubMatrix(0.7 * dt * identity, 0, 6, 3, 3, &H); // This weight is on node 3 (beam 2, nodeId 1) EXPECT_NEAR_EIGEN(H, mlcpPhysicsProblem.H, epsilon); EXPECT_EQ(0u, mlcpPhysicsProblem.constraintTypes.size()); } TEST(Fem1DConstraintFixedPointTests, BuildMlcpTwoStep) { // Whitebox test which validates ConstraintImplementation::build's output parameter, MlcpPhysicsProblem. It assumes // CHt and HCHt can be correctly built given H, so it does not necessarily construct the physical parameters // necessary to supply a realistic C. It only checks H and b. FemConstraintFixedPoint constraint; Vector3d actual; Vector3d desired; // Setup parameters for FemConstraintFixedPoint::build MlcpPhysicsProblem mlcpPhysicsProblem = MlcpPhysicsProblem::Zero(24, 3, 1); ConstraintData emptyConstraint; auto localization = std::make_shared(getFem1d("representation"), SurgSim::DataStructures::IndexedLocalCoordinate(2u, Vector2d(0.11, 0.89))); actual = localization->calculatePosition(); ASSERT_NO_THROW(constraint.build( dt, emptyConstraint, localization, &mlcpPhysicsProblem, 0, 0, SurgSim::Physics::CONSTRAINT_POSITIVE_SIDE)); localization->setLocalPosition( SurgSim::DataStructures::IndexedLocalCoordinate(1u, Vector2d(0.32, 0.68))); desired = localization->calculatePosition(); ASSERT_NO_THROW(constraint.build( dt, emptyConstraint, localization, &mlcpPhysicsProblem, 0, 0, SurgSim::Physics::CONSTRAINT_NEGATIVE_SIDE)); // Compare results Eigen::Matrix violation = actual - desired; EXPECT_NEAR_EIGEN(violation, mlcpPhysicsProblem.b, epsilon); Eigen::Matrix H = Eigen::Matrix::Zero(); Eigen::Matrix identity = Eigen::Matrix::Identity(); SurgSim::Math::addSubMatrix( 0.11 * dt * identity, 0, 4, 3, 3, &H); // This weight is on node 2 (beam 2, nodeId 0) SurgSim::Math::addSubMatrix( 0.89 * dt * identity, 0, 6, 3, 3, &H); // This weight is on node 3 (beam 2, nodeId 1) SurgSim::Math::addSubMatrix(-0.32 * dt * identity, 0, 2, 3, 3, &H); // This weight is on node 1 (beam 1, nodeId 0) SurgSim::Math::addSubMatrix(-0.68 * dt * identity, 0, 4, 3, 3, &H); // This weight is on node 2 (beam 1, nodeId 0) EXPECT_NEAR_EIGEN(H, mlcpPhysicsProblem.H, epsilon); } }; // namespace Physics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/UnitTests/Fem1DConstraintFixedRotationVectorTests.cpp000066400000000000000000000245061277777236100314530ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include #include "SurgSim/DataStructures/IndexedLocalCoordinate.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Math/MlcpConstraintType.h" #include "SurgSim/Math/OdeState.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/Fem1DElementBeam.h" #include "SurgSim/Physics/Fem1DLocalization.h" #include "SurgSim/Physics/Fem1DRepresentation.h" #include "SurgSim/Physics/FemConstraintFixedRotationVector.h" #include "SurgSim/Physics/FixedRepresentation.h" #include "SurgSim/Physics/UnitTests/EigenGtestAsserts.h" #include "SurgSim/Physics/Representation.h" #include "SurgSim/Physics/RigidRepresentation.h" #include "SurgSim/Physics/RotationVectorConstraintData.h" using SurgSim::Math::Vector2d; using SurgSim::Math::Vector3d; using SurgSim::Math::Vector4d; using SurgSim::Math::Vector6d; namespace { const double epsilon = 1e-10; const double dt = 1e-3; }; namespace SurgSim { namespace Physics { static std::shared_ptr getBeam(size_t node0, size_t node1, double radius, double massDensity, double poissonRatio, double youngModulus) { std::array nodeIds = {node0, node1}; auto element = std::make_shared(nodeIds); element->setMassDensity(massDensity); element->setPoissonRatio(poissonRatio); element->setYoungModulus(youngModulus); element->setRadius(radius); return element; } static std::shared_ptr getFem1d(const std::string &name, double radius = 0.01, double massDensity = 1.0, double poissonRatio = 0.1, double youngModulus = 1.0) { auto fem = std::make_shared(name); auto state = std::make_shared(); state->setNumDof(6, 4); std::array p0 = {{0.11, 0.22, 0.33, 0.44, 0.55, 0.66}}; std::array p1 = {{0.12, -0.23, 0.34, -0.45, 0.56, -0.67}}; std::array p2 = {{-0.10, 0.21, -0.32, 0.43, -0.54, 0.65}}; std::array p3 = {{0.2, 0.2, 0.2, 0.2, 0.2, 0.2}}; state->getPositions().segment<6>(0 * 6) = Vector6d(p0.data()); state->getPositions().segment<6>(1 * 6) = Vector6d(p1.data()); state->getPositions().segment<6>(2 * 6) = Vector6d(p2.data()); state->getPositions().segment<6>(3 * 6) = Vector6d(p3.data()); fem->addFemElement(getBeam(0, 1, radius, massDensity, poissonRatio, youngModulus)); fem->addFemElement(getBeam(1, 2, radius, massDensity, poissonRatio, youngModulus)); fem->addFemElement(getBeam(2, 3, radius, massDensity, poissonRatio, youngModulus)); fem->setInitialState(state); fem->initialize(std::make_shared()); fem->wakeUp(); fem->setIsGravityEnabled(false); fem->beforeUpdate(dt); fem->update(dt); return fem; } TEST(Fem1DConstraintFixedRotationVectorTests, Constructor) { ASSERT_NO_THROW({ FemConstraintFixedRotationVector constraint; }); } TEST(Fem1DConstraintFixedRotationVectorTests, Constants) { FemConstraintFixedRotationVector constraint; EXPECT_EQ(SurgSim::Physics::FIXED_3DROTATION_VECTOR, constraint.getConstraintType()); EXPECT_EQ(3u, constraint.getNumDof()); } TEST(Fem1DConstraintFixedRotationVectorTests, BuildMlcpBasic) { FemConstraintFixedRotationVector constraint; // Prepare the fem1d representation for this constraint type auto fem1d = getFem1d("representation"); auto localization = std::make_shared(fem1d, SurgSim::DataStructures::IndexedLocalCoordinate(2u, Vector2d(1.0, 0.0))); // Prepare the rigid representation for this constraint type auto rigid = std::make_shared("rigid"); // Prepare the specific constraint data RotationVectorRigidFem1DConstraintData emptyConstraint; emptyConstraint.setFem1DRotation(fem1d, localization->getLocalPosition().index); emptyConstraint.setRigidOrFixedRotation(rigid, rigid->getPose().linear()); MlcpPhysicsProblem mlcpPhysicsProblem = MlcpPhysicsProblem::Zero(24, 3, 1); ASSERT_NO_THROW(constraint.build( dt, emptyConstraint, localization, &mlcpPhysicsProblem, 0, 0, SurgSim::Physics::CONSTRAINT_POSITIVE_SIDE)); // Compare results Vector3d actual = Vector3d::Zero(); auto nodeIds = fem1d->getFemElement(2u)->getNodeIds(); Vector3d rotationVector0 = fem1d->getInitialState()->getPositions().segment<3>(6 * nodeIds[0] + 3); Vector3d rotationVector1 = fem1d->getInitialState()->getPositions().segment<3>(6 * nodeIds[1] + 3); actual = SurgSim::Math::interpolate(rotationVector0, rotationVector1, 0.0); Eigen::Matrix violation = actual; EXPECT_NEAR_EIGEN(violation, mlcpPhysicsProblem.b, epsilon); Eigen::Matrix H = Eigen::Matrix::Zero(); Eigen::Matrix identity = Eigen::Matrix::Identity(); SurgSim::Math::setSubMatrix(1.0 * dt * identity, 0, 5, 3, 3, &H); // This weight is on node 1 (beam 1, nodeId 0) EXPECT_NEAR_EIGEN(H, mlcpPhysicsProblem.H, epsilon); EXPECT_EQ(0u, mlcpPhysicsProblem.constraintTypes.size()); } TEST(Fem1DConstraintFixedRotationVectorTests, BuildMlcp) { FemConstraintFixedRotationVector constraint; // Prepare the fem1d representation for this constraint type auto fem1d = getFem1d("representation"); auto localization = std::make_shared(fem1d, SurgSim::DataStructures::IndexedLocalCoordinate(2u, Vector2d(0.3, 0.7))); // Prepare the rigid representation for this constraint type auto rigid = std::make_shared("rigid"); // Prepare the specific constraint data RotationVectorRigidFem1DConstraintData emptyConstraint; emptyConstraint.setFem1DRotation(fem1d, localization->getLocalPosition().index); emptyConstraint.setRigidOrFixedRotation(rigid, rigid->getPose().linear()); MlcpPhysicsProblem mlcpPhysicsProblem = MlcpPhysicsProblem::Zero(24, 3, 1); ASSERT_NO_THROW(constraint.build( dt, emptyConstraint, localization, &mlcpPhysicsProblem, 0, 0, SurgSim::Physics::CONSTRAINT_POSITIVE_SIDE)); // Compare results Vector3d actual = Vector3d::Zero(); auto nodeIds = fem1d->getFemElement(2u)->getNodeIds(); Vector3d rotationVector0 = fem1d->getInitialState()->getPositions().segment<3>(6 * nodeIds[0] + 3); Vector3d rotationVector1 = fem1d->getInitialState()->getPositions().segment<3>(6 * nodeIds[1] + 3); actual = SurgSim::Math::interpolate(rotationVector0, rotationVector1, 0.7); Eigen::Matrix violation = actual; EXPECT_NEAR_EIGEN(violation, mlcpPhysicsProblem.b, epsilon); Eigen::Matrix H = Eigen::Matrix::Zero(); Eigen::Matrix identity = Eigen::Matrix::Identity(); SurgSim::Math::setSubMatrix(0.3 * dt * identity, 0, 5, 3, 3, &H); // This weight is on node 2 (beam 2, nodeId 0) SurgSim::Math::setSubMatrix(0.7 * dt * identity, 0, 7, 3, 3, &H); // This weight is on node 3 (beam 2, nodeId 1) EXPECT_NEAR_EIGEN(H, mlcpPhysicsProblem.H, epsilon); EXPECT_EQ(0u, mlcpPhysicsProblem.constraintTypes.size()); } TEST(Fem1DConstraintFixedRotationVectorTests, BuildMlcpTwoStep) { FemConstraintFixedRotationVector constraint; // Prepare the fem1d representation for this constraint type auto fem1d = getFem1d("representation"); auto localization = std::make_shared(fem1d, SurgSim::DataStructures::IndexedLocalCoordinate(2u, Vector2d(0.11, 0.89))); // Prepare the rigid representation for this constraint type auto rigid = std::make_shared("rigid"); // Prepare the specific constraint data RotationVectorRigidFem1DConstraintData emptyConstraint; emptyConstraint.setFem1DRotation(fem1d, localization->getLocalPosition().index); emptyConstraint.setRigidOrFixedRotation(rigid, rigid->getPose().linear()); MlcpPhysicsProblem mlcpPhysicsProblem = MlcpPhysicsProblem::Zero(24, 3, 1); ASSERT_NO_THROW(constraint.build( dt, emptyConstraint, localization, &mlcpPhysicsProblem, 0, 0, SurgSim::Physics::CONSTRAINT_POSITIVE_SIDE)); localization->setLocalPosition( SurgSim::DataStructures::IndexedLocalCoordinate(1u, Vector2d(0.32, 0.68))); Vector3d desired = Vector3d::Zero(); { auto nodeIds = fem1d->getFemElement(1u)->getNodeIds(); Vector3d rotationVector0 = fem1d->getInitialState()->getPositions().segment<3>(6 * nodeIds[0] + 3); Vector3d rotationVector1 = fem1d->getInitialState()->getPositions().segment<3>(6 * nodeIds[1] + 3); desired = SurgSim::Math::interpolate(rotationVector0, rotationVector1, 0.68); } ASSERT_NO_THROW(constraint.build( dt, emptyConstraint, localization, &mlcpPhysicsProblem, 0, 0, SurgSim::Physics::CONSTRAINT_NEGATIVE_SIDE)); // Compare results Vector3d actual = Vector3d::Zero(); auto nodeIds = fem1d->getFemElement(2u)->getNodeIds(); Vector3d rotationVector0 = fem1d->getInitialState()->getPositions().segment<3>(6 * nodeIds[0] + 3); Vector3d rotationVector1 = fem1d->getInitialState()->getPositions().segment<3>(6 * nodeIds[1] + 3); actual = SurgSim::Math::interpolate(rotationVector0, rotationVector1, 0.89); Eigen::Matrix violation = actual - desired; EXPECT_NEAR_EIGEN(violation, mlcpPhysicsProblem.b, epsilon); Eigen::Matrix H = Eigen::Matrix::Zero(); Eigen::Matrix identity = Eigen::Matrix::Identity(); SurgSim::Math::addSubMatrix( 0.11 * dt * identity, 0, 5, 3, 3, &H); // This weight is on node 2 (beam 2, nodeId 0) SurgSim::Math::addSubMatrix( 0.89 * dt * identity, 0, 7, 3, 3, &H); // This weight is on node 3 (beam 2, nodeId 1) SurgSim::Math::addSubMatrix(-0.32 * dt * identity, 0, 3, 3, 3, &H); // This weight is on node 1 (beam 1, nodeId 0) SurgSim::Math::addSubMatrix(-0.68 * dt * identity, 0, 5, 3, 3, &H); // This weight is on node 2 (beam 1, nodeId 0) EXPECT_NEAR_EIGEN(H, mlcpPhysicsProblem.H, epsilon); } }; // namespace Physics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/UnitTests/Fem1DConstraintFrictionalSlidingTests.cpp000066400000000000000000000253701277777236100311150ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Math/LinearSparseSolveAndInverse.h" #include "SurgSim/Math/OdeState.h" #include "SurgSim/Math/SparseMatrix.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/Fem1DElementBeam.h" #include "SurgSim/Physics/Fem1DLocalization.h" #include "SurgSim/Physics/Fem1DRepresentation.h" #include "SurgSim/Physics/FemConstraintFrictionalSliding.h" #include "SurgSim/Physics/MlcpPhysicsProblem.h" #include "SurgSim/Physics/SlidingConstraintData.h" #include "SurgSim/Physics/UnitTests/EigenGtestAsserts.h" #include "SurgSim/Physics/UnitTests/MockObjects.h" using SurgSim::DataStructures::IndexedLocalCoordinate; using SurgSim::Framework::Runtime; using SurgSim::Physics::Fem1DRepresentation; using SurgSim::Physics::FemConstraintFrictionalSliding; using SurgSim::Physics::Fem1DLocalization; using SurgSim::Physics::Fem1DElementBeam; using SurgSim::Physics::MlcpPhysicsProblem; using SurgSim::Physics::MockFem1DRepresentation; using SurgSim::Physics::SlidingConstraintData; using SurgSim::Math::Vector3d; using SurgSim::Math::Vector2d; namespace { const double epsilon = 1e-10; const double dt = 1e-3; }; static void addBeam(Fem1DRepresentation* fem, size_t node0, size_t node1, double radius = 0.01, double massDensity = 1.0, double poissonRatio = 0.1, double youngModulus = 1.0) { std::array nodes = {node0, node1}; auto element = std::make_shared(nodes); element->setRadius(radius); element->setMassDensity(massDensity); element->setPoissonRatio(poissonRatio); element->setYoungModulus(youngModulus); fem->addFemElement(element); } class Fem1DConstraintFrictionalSlidingTests : public ::testing::Test { public: void SetUp() { // Define plane with normal 'n' pointing against gravity. m_slidingDirection = Vector3d(0.8539, 0.6289, -0.9978); m_slidingDirection.normalize(); // Create mock FEM m_fem = std::make_shared("Fem1dRepresentation"); auto state = std::make_shared(); state->setNumDof(6, 5); state->getPositions().segment<3>(0 * 6) = Vector3d(0.30, -0.57, 0.40); state->getPositions().segment<3>(1 * 6) = Vector3d(0.06, 0.63, -0.32); state->getPositions().segment<3>(2 * 6) = Vector3d(-0.91, 0.72, 0.72); state->getPositions().segment<3>(3 * 6) = Vector3d(0.35, 0.52, 0.50); state->getPositions().segment<3>(4 * 6) = Vector3d(1.14, 0.66, 0.71); addBeam(m_fem.get(), 0, 1); addBeam(m_fem.get(), 1, 2); addBeam(m_fem.get(), 2, 3); addBeam(m_fem.get(), 3, 4); m_fem->setInitialState(state); m_fem->setIntegrationScheme(SurgSim::Math::IntegrationScheme::INTEGRATIONSCHEME_EULER_EXPLICIT_MODIFIED); m_fem->setLocalActive(true); m_fem->initialize(std::make_shared()); m_fem->wakeUp(); // Update model by one timestep m_fem->beforeUpdate(dt); m_fem->update(dt); } void setSlidingConstraintAt(const IndexedLocalCoordinate& coord) { m_localization = std::make_shared(m_fem, coord); m_constraintData.setSlidingDirection(m_localization->calculatePosition(0.0), m_slidingDirection); } std::shared_ptr m_fem; std::shared_ptr m_localization; Vector3d m_slidingDirection; SlidingConstraintData m_constraintData; }; TEST_F(Fem1DConstraintFrictionalSlidingTests, ConstructorTest) { ASSERT_NO_THROW( { FemConstraintFrictionalSliding femContact; }); } TEST_F(Fem1DConstraintFrictionalSlidingTests, ConstraintConstantsTest) { auto implementation = std::make_shared(); EXPECT_EQ(SurgSim::Physics::FRICTIONAL_SLIDING, implementation->getConstraintType()); EXPECT_EQ(3u, implementation->getNumDof()); } TEST_F(Fem1DConstraintFrictionalSlidingTests, BuildMlcpTest) { // This test verifies the build mlcp function works for a simple case. auto implementation = std::make_shared(); // Initialize MLCP MlcpPhysicsProblem mlcpPhysicsProblem = MlcpPhysicsProblem::Zero(m_fem->getNumDof(), 3, 1); // Apply constraint purely to the first node of the 0th beam. IndexedLocalCoordinate coord(0, Vector2d(1.0, 0.0)); setSlidingConstraintAt(coord); implementation->build(dt, m_constraintData, m_localization, &mlcpPhysicsProblem, 0, 0, SurgSim::Physics::CONSTRAINT_POSITIVE_SIDE); Eigen::Matrix H = Eigen::Matrix::Zero(); H.block<1, 3>(0, 0) = (dt * m_constraintData.getNormals()[0]).eval(); H.block<1, 3>(1, 0) = (dt * m_constraintData.getNormals()[1]).eval(); H.block<1, 3>(2, 0) = (dt * m_slidingDirection).eval(); EXPECT_NEAR_EIGEN(H, mlcpPhysicsProblem.H, epsilon); // C = dt * m^{-1} m_fem->updateFMDK(*(m_fem->getPreviousState()), SurgSim::Math::ODEEQUATIONUPDATE_M); Eigen::Matrix C = dt * m_fem->getM().toDense().inverse(); EXPECT_NEAR_EIGEN(C * H.transpose(), mlcpPhysicsProblem.CHt, epsilon); EXPECT_NEAR_EIGEN(H * C * H.transpose(), mlcpPhysicsProblem.A, epsilon); EXPECT_DOUBLE_EQ(0.5, mlcpPhysicsProblem.mu[0]); EXPECT_EQ(0u, mlcpPhysicsProblem.constraintTypes.size()); } TEST_F(Fem1DConstraintFrictionalSlidingTests, BuildMlcpCoordinateTest) { // This test verifies the build mlcp function works for a more complicated case with different nodes. auto implementation = std::make_shared(); // Initialize MLCP MlcpPhysicsProblem mlcpPhysicsProblem = MlcpPhysicsProblem::Zero(m_fem->getNumDof(), 3, 1); // Apply constraint between the first two nodes of the 0th beam. const Vector2d barycentric = Vector2d(0.24, 0.76); IndexedLocalCoordinate coord(0, barycentric); setSlidingConstraintAt(coord); implementation->build(dt, m_constraintData, m_localization, &mlcpPhysicsProblem, 0, 0, SurgSim::Physics::CONSTRAINT_POSITIVE_SIDE); Eigen::Matrix H = Eigen::Matrix::Zero(); H.block<1, 3>(0, 0) = (barycentric[0] * dt * m_constraintData.getNormals()[0]).eval(); H.block<1, 3>(1, 0) = (barycentric[0] * dt * m_constraintData.getNormals()[1]).eval(); H.block<1, 3>(2, 0) = (barycentric[0] * dt * m_slidingDirection).eval(); H.block<1, 3>(0, 6) = (barycentric[1] * dt * m_constraintData.getNormals()[0]).eval(); H.block<1, 3>(1, 6) = (barycentric[1] * dt * m_constraintData.getNormals()[1]).eval(); H.block<1, 3>(2, 6) = (barycentric[1] * dt * m_slidingDirection).eval(); EXPECT_NEAR_EIGEN(H, mlcpPhysicsProblem.H, epsilon); // C = dt * m^{-1} m_fem->updateFMDK(*(m_fem->getPreviousState()), SurgSim::Math::ODEEQUATIONUPDATE_M); Eigen::Matrix C = dt * m_fem->getM().toDense().inverse(); EXPECT_NEAR_EIGEN(C * H.transpose(), mlcpPhysicsProblem.CHt, epsilon); EXPECT_NEAR_EIGEN(H * C * H.transpose(), mlcpPhysicsProblem.A, epsilon); EXPECT_DOUBLE_EQ(0.5, mlcpPhysicsProblem.mu[0]); EXPECT_EQ(0u, mlcpPhysicsProblem.constraintTypes.size()); } TEST_F(Fem1DConstraintFrictionalSlidingTests, BuildMlcpIndiciesTest) { // This test verifies the build mlcp function works given a hypothetical, preexisting mlcp problem. auto implementation = std::make_shared(); // Initialize MLCP MlcpPhysicsProblem mlcpPhysicsProblem = MlcpPhysicsProblem::Zero(m_fem->getNumDof() + 5, 4, 2); // Suppose 5 dof and 1 constraint are defined elsewhere. Then H, CHt, HCHt, and b are prebuilt. Eigen::SparseVector localH; localH.resize(5); localH.reserve(5); localH.insert(0) = 0.9478; localH.insert(1) = -0.3807; localH.insert(2) = 0.5536; localH.insert(3) = -0.6944; localH.insert(4) = 0.1815; mlcpPhysicsProblem.H.coeffRef(0, 0) += localH.coeff(0); mlcpPhysicsProblem.H.coeffRef(0, 1) += localH.coeff(1); mlcpPhysicsProblem.H.coeffRef(0, 2) += localH.coeff(2); mlcpPhysicsProblem.H.coeffRef(0, 3) += localH.coeff(3); mlcpPhysicsProblem.H.coeffRef(0, 4) += localH.coeff(4); Eigen::Matrix localC; localC << -0.2294, 0.5160, 0.2520, 0.5941, -0.4854, 0.1233, -0.4433, 0.3679, 0.9307, 0.2600, 0.1988, 0.6637, -0.7591, 0.1475, 0.8517, -0.5495, -0.4305, 0.3162, -0.7862, 0.7627, -0.5754, 0.4108, 0.8445, -0.5565, 0.7150; localC = localC * localC.transpose(); // force to be symmetric Eigen::Matrix localCHt = localC * localH.transpose(); mlcpPhysicsProblem.CHt.block<5, 1>(0, 0) = localCHt; mlcpPhysicsProblem.A.block<1, 1>(0, 0) = localH * localCHt; mlcpPhysicsProblem.b.block<1, 1>(0, 0)[0] = 0.6991; // Place the Fem at 5th dof (1 or multiple representations exist before, covering a total of 5 dof) // and the constraint at the index 1 (1 atomic constraint exists before this one) size_t indexOfRepresentation = 5; size_t indexOfConstraint = 1; // Apply constraint between the first two nodes of the fem. const Vector2d barycentric = Vector2d(0.24, 0.76); IndexedLocalCoordinate coord(0, barycentric); setSlidingConstraintAt(coord); implementation->build(dt, m_constraintData, m_localization, &mlcpPhysicsProblem, indexOfRepresentation, indexOfConstraint, SurgSim::Physics::CONSTRAINT_POSITIVE_SIDE); Eigen::Matrix H = Eigen::Matrix::Zero(); H.block<1, 3>(0, 0) = (barycentric[0] * dt * m_constraintData.getNormals()[0]).eval(); H.block<1, 3>(1, 0) = (barycentric[0] * dt * m_constraintData.getNormals()[1]).eval(); H.block<1, 3>(2, 0) = (barycentric[0] * dt * m_slidingDirection).eval(); H.block<1, 3>(0, 6) = (barycentric[1] * dt * m_constraintData.getNormals()[0]).eval(); H.block<1, 3>(1, 6) = (barycentric[1] * dt * m_constraintData.getNormals()[1]).eval(); H.block<1, 3>(2, 6) = (barycentric[1] * dt * m_slidingDirection).eval(); EXPECT_NEAR_EIGEN(H, mlcpPhysicsProblem.H.block(indexOfConstraint, indexOfRepresentation, 3, 30), epsilon); m_fem->updateFMDK(*(m_fem->getPreviousState()), SurgSim::Math::ODEEQUATIONUPDATE_M); Eigen::Matrix C = dt * m_fem->getM().toDense().inverse(); EXPECT_NEAR_EIGEN( C * H.transpose(), mlcpPhysicsProblem.CHt.block(indexOfRepresentation, indexOfConstraint, 30, 3), epsilon); EXPECT_NEAR_EIGEN( H * C * H.transpose(), mlcpPhysicsProblem.A.block(indexOfConstraint, indexOfConstraint, 3, 3), epsilon); EXPECT_DOUBLE_EQ(0.5, mlcpPhysicsProblem.mu[1]); EXPECT_EQ(0u, mlcpPhysicsProblem.constraintTypes.size()); } opensurgsim-0.7.0/SurgSim/Physics/UnitTests/Fem1DConstraintFrictionlessContactTests.cpp000066400000000000000000000267231277777236100314740ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Math/LinearSparseSolveAndInverse.h" #include "SurgSim/Math/OdeState.h" #include "SurgSim/Math/SparseMatrix.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/ContactConstraintData.h" #include "SurgSim/Physics/Fem1DElementBeam.h" #include "SurgSim/Physics/Fem1DLocalization.h" #include "SurgSim/Physics/Fem1DRepresentation.h" #include "SurgSim/Physics/FemConstraintFrictionlessContact.h" #include "SurgSim/Physics/MlcpPhysicsProblem.h" #include "SurgSim/Physics/UnitTests/EigenGtestAsserts.h" #include "SurgSim/Physics/UnitTests/MockObjects.h" using SurgSim::DataStructures::IndexedLocalCoordinate; using SurgSim::Framework::Runtime; using SurgSim::Physics::ContactConstraintData; using SurgSim::Physics::Fem1DRepresentation; using SurgSim::Physics::FemConstraintFrictionlessContact; using SurgSim::Physics::Fem1DLocalization; using SurgSim::Physics::Fem1DElementBeam; using SurgSim::Physics::MlcpPhysicsProblem; using SurgSim::Physics::MockFem1DRepresentation; using SurgSim::Math::Vector3d; using SurgSim::Math::Vector2d; namespace { const double epsilon = 1e-10; const double dt = 1e-3; const double mlcpPrecision = 1e-04; }; static void addBeam(Fem1DRepresentation* fem, size_t node0, size_t node1, double radius = 0.01, double massDensity = 1.0, double poissonRatio = 0.1, double youngModulus = 1.0) { std::array nodes = {node0, node1}; auto element = std::make_shared(nodes); element->setRadius(radius); element->setMassDensity(massDensity); element->setPoissonRatio(poissonRatio); element->setYoungModulus(youngModulus); fem->addFemElement(element); } class Fem1DConstraintFrictionlessContactTests : public ::testing::Test { public: void SetUp() { // Define plane with normal 'n' pointing against gravity. m_n = Vector3d(0.8539, 0.6289, -0.9978); m_n.normalize(); // Create mock FEM m_fem = std::make_shared("Fem1dRepresentation"); auto state = std::make_shared(); state->setNumDof(6, 5); state->getPositions().segment<3>(0 * 6) = Vector3d(0.30, -0.57, 0.40); state->getPositions().segment<3>(1 * 6) = Vector3d(0.06, 0.63, -0.32); state->getPositions().segment<3>(2 * 6) = Vector3d(-0.91, 0.72, 0.72); state->getPositions().segment<3>(3 * 6) = Vector3d(0.35, 0.52, 0.50); state->getPositions().segment<3>(4 * 6) = Vector3d(1.14, 0.66, 0.71); addBeam(m_fem.get(), 0, 1); addBeam(m_fem.get(), 1, 2); addBeam(m_fem.get(), 2, 3); addBeam(m_fem.get(), 3, 4); m_fem->setInitialState(state); m_fem->setIntegrationScheme(SurgSim::Math::IntegrationScheme::INTEGRATIONSCHEME_EULER_EXPLICIT_MODIFIED); m_fem->setLocalActive(true); m_fem->initialize(std::make_shared()); m_fem->wakeUp(); // Update model by one timestep m_fem->beforeUpdate(dt); m_fem->update(dt); } void setContactAt(const IndexedLocalCoordinate& coord) { m_localization = std::make_shared(m_fem, coord); // Calculate position at state before "m_fem->update(dt)" was called. double distance = -m_localization->calculatePosition(0.0).dot(m_n); m_constraintData.setPlaneEquation(m_n, distance); } Vector3d computeNewPosition(const IndexedLocalCoordinate& coord) const { // Solve the system M.a = f // The gravity force should be M.g, but we actually use a mass per node diagonal matrix Md // So the assumption that the violation should be oriented toward the gravity vector is false: // Ma = f = Mg => a = M^-1.f = M^-1.M.g = g // Instead, we have // Ma = f = Md.g => a = M^-1.f = M^-1.Md.g SurgSim::Math::Vector a = m_fem->getM().toDense().inverse() * m_fem->getF(); SurgSim::Math::Vector v = m_fem->getInitialState()->getVelocities() + a * dt; SurgSim::Math::Vector p = m_fem->getInitialState()->getPositions() + v * dt; Vector3d newPosition = Vector3d::Zero(); const auto& nodeIds = m_fem->getFemElement(coord.index)->getNodeIds(); for (size_t node = 0; node < 2; node++) { newPosition += p.segment<3>(6 * nodeIds[node]) * coord.coordinate[node]; } return newPosition; } std::shared_ptr m_fem; std::shared_ptr m_localization; Vector3d m_n; ContactConstraintData m_constraintData; }; TEST_F(Fem1DConstraintFrictionlessContactTests, ConstructorTest) { ASSERT_NO_THROW( { FemConstraintFrictionlessContact femContact; }); } TEST_F(Fem1DConstraintFrictionlessContactTests, ConstraintConstantsTest) { auto implementation = std::make_shared(); EXPECT_EQ(SurgSim::Physics::FRICTIONLESS_3DCONTACT, implementation->getConstraintType()); EXPECT_EQ(1u, implementation->getNumDof()); } TEST_F(Fem1DConstraintFrictionlessContactTests, BuildMlcpTest) { // This test verifies the build mlcp function works for a simple case. auto implementation = std::make_shared(); // Initialize MLCP MlcpPhysicsProblem mlcpPhysicsProblem = MlcpPhysicsProblem::Zero(m_fem->getNumDof(), 1, 1); // Apply constraint purely to the first node of the 0th beam. IndexedLocalCoordinate coord(0, Vector2d(1.0, 0.0)); setContactAt(coord); implementation->build(dt, m_constraintData, m_localization, &mlcpPhysicsProblem, 0, 0, SurgSim::Physics::CONSTRAINT_POSITIVE_SIDE); const Vector3d newPosition = computeNewPosition(coord); EXPECT_NEAR(newPosition.dot(m_n), mlcpPhysicsProblem.b[0] + mlcpPrecision, epsilon); Eigen::Matrix H = Eigen::Matrix::Zero(); H.segment<3>(6 * 0) = dt * m_n; EXPECT_NEAR_EIGEN(H, mlcpPhysicsProblem.H, epsilon); // C = dt * m^{-1} m_fem->updateFMDK(*(m_fem->getPreviousState()), SurgSim::Math::ODEEQUATIONUPDATE_M); Eigen::Matrix C = dt * m_fem->getM().toDense().inverse(); EXPECT_NEAR_EIGEN(C * H.transpose(), mlcpPhysicsProblem.CHt, epsilon); EXPECT_NEAR_EIGEN(H * C * H.transpose(), mlcpPhysicsProblem.A, epsilon); EXPECT_EQ(0u, mlcpPhysicsProblem.constraintTypes.size()); } TEST_F(Fem1DConstraintFrictionlessContactTests, BuildMlcpCoordinateTest) { // This test verifies the build mlcp function works for a more complicated case with different nodes. auto implementation = std::make_shared(); // Initialize MLCP MlcpPhysicsProblem mlcpPhysicsProblem = MlcpPhysicsProblem::Zero(m_fem->getNumDof(), 1, 1); // Apply constraint to all nodes of an fem. const Vector2d barycentric = Vector2d(0.24, 0.76); IndexedLocalCoordinate coord(1, barycentric); setContactAt(coord); implementation->build(dt, m_constraintData, m_localization, &mlcpPhysicsProblem, 0, 0, SurgSim::Physics::CONSTRAINT_POSITIVE_SIDE); const Vector3d newPosition = computeNewPosition(coord); EXPECT_NEAR(newPosition.dot(m_n), mlcpPhysicsProblem.b[0] + mlcpPrecision, epsilon); Eigen::Matrix H = Eigen::Matrix::Zero(); H.segment<3>(6 * 1) = 0.24 * dt * m_n; H.segment<3>(6 * 2) = 0.76 * dt * m_n; EXPECT_NEAR_EIGEN(H, mlcpPhysicsProblem.H, epsilon) << "H = " << H << std::endl << "mlcpH = " << mlcpPhysicsProblem.H << std::endl; // C = dt * m^{-1} SurgSim::Math::Matrix C; SurgSim::Math::SparseMatrix M(30, 30); m_fem->updateFMDK(*(m_fem->getPreviousState()), SurgSim::Math::ODEEQUATIONUPDATE_M); M = m_fem->getM(); SurgSim::Math::LinearSparseSolveAndInverseLU solver; SurgSim::Math::Vector b = SurgSim::Math::Vector::Zero(30); solver.setMatrix(M); C = solver.getInverse(); C *= dt; EXPECT_NEAR_EIGEN(C * H.transpose(), mlcpPhysicsProblem.CHt, epsilon); EXPECT_NEAR_EIGEN(H * C * H.transpose(), mlcpPhysicsProblem.A, epsilon); EXPECT_EQ(0u, mlcpPhysicsProblem.constraintTypes.size()); } TEST_F(Fem1DConstraintFrictionlessContactTests, BuildMlcpIndiciesTest) { // This test verifies the build mlcp function works given a hypothetical, preexisting mlcp problem. auto implementation = std::make_shared(); // Initialize MLCP MlcpPhysicsProblem mlcpPhysicsProblem = MlcpPhysicsProblem::Zero(m_fem->getNumDof() + 5, 2, 1); // Suppose 5 dof and 1 constraint are defined elsewhere. Then H, CHt, HCHt, and b are prebuilt. Eigen::SparseVector localH; localH.resize(5); localH.reserve(5); localH.insert(0) = 0.9478; localH.insert(1) = -0.3807; localH.insert(2) = 0.5536; localH.insert(3) = -0.6944; localH.insert(4) = 0.1815; mlcpPhysicsProblem.H.coeffRef(0, 0) += localH.coeff(0); mlcpPhysicsProblem.H.coeffRef(0, 1) += localH.coeff(1); mlcpPhysicsProblem.H.coeffRef(0, 2) += localH.coeff(2); mlcpPhysicsProblem.H.coeffRef(0, 3) += localH.coeff(3); mlcpPhysicsProblem.H.coeffRef(0, 4) += localH.coeff(4); Eigen::Matrix localC; localC << -0.2294, 0.5160, 0.2520, 0.5941, -0.4854, 0.1233, -0.4433, 0.3679, 0.9307, 0.2600, 0.1988, 0.6637, -0.7591, 0.1475, 0.8517, -0.5495, -0.4305, 0.3162, -0.7862, 0.7627, -0.5754, 0.4108, 0.8445, -0.5565, 0.7150; localC = localC * localC.transpose(); // force to be symmetric Eigen::Matrix localCHt = localC * localH.transpose(); mlcpPhysicsProblem.CHt.block<5, 1>(0, 0) = localCHt; mlcpPhysicsProblem.A.block<1, 1>(0, 0) = localH * localCHt; mlcpPhysicsProblem.b.block<1, 1>(0, 0)[0] = 0.6991; // Place the Fem at 5th dof (1 or multiple representations exist before, covering a total of 5 dof) // and the constraint at the index 1 (1 atomic constraint exists before this one) size_t indexOfRepresentation = 5; size_t indexOfConstraint = 1; // Apply constraint to all nodes of an fem. const Vector2d barycentric = Vector2d(0.24, 0.76); IndexedLocalCoordinate coord(1, barycentric); setContactAt(coord); implementation->build(dt, m_constraintData, m_localization, &mlcpPhysicsProblem, indexOfRepresentation, indexOfConstraint, SurgSim::Physics::CONSTRAINT_POSITIVE_SIDE); const Vector3d newPosition = computeNewPosition(coord); EXPECT_NEAR(newPosition.dot(m_n), mlcpPhysicsProblem.b[indexOfConstraint] + mlcpPrecision, epsilon); Eigen::Matrix H = Eigen::Matrix::Zero(); H.segment<3>(6 * 1) = 0.24 * dt * m_n; H.segment<3>(6 * 2) = 0.76 * dt * m_n; EXPECT_NEAR_EIGEN(H, mlcpPhysicsProblem.H.block(indexOfConstraint, indexOfRepresentation, 1, 30), epsilon); SurgSim::Math::Matrix C; SurgSim::Math::SparseMatrix M(30, 30); m_fem->updateFMDK(*m_fem->getPreviousState(), SurgSim::Math::ODEEQUATIONUPDATE_M); M = m_fem->getM(); SurgSim::Math::LinearSparseSolveAndInverseLU solver; SurgSim::Math::Vector b = SurgSim::Math::Vector::Zero(30); solver.setMatrix(M); C = solver.getInverse(); C *= dt; EXPECT_NEAR_EIGEN( C * H.transpose(), mlcpPhysicsProblem.CHt.block(indexOfRepresentation, indexOfConstraint, 30, 1), epsilon); EXPECT_NEAR_EIGEN( H * C * H.transpose(), mlcpPhysicsProblem.A.block(indexOfConstraint, indexOfConstraint, 1, 1), epsilon); EXPECT_EQ(0u, mlcpPhysicsProblem.constraintTypes.size()); } opensurgsim-0.7.0/SurgSim/Physics/UnitTests/Fem1DConstraintFrictionlessSlidingTests.cpp000066400000000000000000000263401277777236100314650ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Math/LinearSparseSolveAndInverse.h" #include "SurgSim/Math/OdeState.h" #include "SurgSim/Math/SparseMatrix.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/Fem1DElementBeam.h" #include "SurgSim/Physics/Fem1DLocalization.h" #include "SurgSim/Physics/Fem1DRepresentation.h" #include "SurgSim/Physics/FemConstraintFrictionlessSliding.h" #include "SurgSim/Physics/MlcpPhysicsProblem.h" #include "SurgSim/Physics/SlidingConstraintData.h" #include "SurgSim/Physics/UnitTests/EigenGtestAsserts.h" #include "SurgSim/Physics/UnitTests/MockObjects.h" using SurgSim::DataStructures::IndexedLocalCoordinate; using SurgSim::Framework::Runtime; using SurgSim::Physics::Fem1DRepresentation; using SurgSim::Physics::FemConstraintFrictionlessSliding; using SurgSim::Physics::Fem1DLocalization; using SurgSim::Physics::Fem1DElementBeam; using SurgSim::Physics::MlcpPhysicsProblem; using SurgSim::Physics::MockFem1DRepresentation; using SurgSim::Physics::SlidingConstraintData; using SurgSim::Math::Vector3d; using SurgSim::Math::Vector2d; namespace { const double epsilon = 1e-10; const double dt = 1e-3; }; static void addBeam(Fem1DRepresentation* fem, size_t node0, size_t node1, double radius = 0.01, double massDensity = 1.0, double poissonRatio = 0.1, double youngModulus = 1.0) { std::array nodes = {node0, node1}; auto element = std::make_shared(nodes); element->setRadius(radius); element->setMassDensity(massDensity); element->setPoissonRatio(poissonRatio); element->setYoungModulus(youngModulus); fem->addFemElement(element); } class Fem1DConstraintFrictionlessSlidingTests : public ::testing::Test { public: void SetUp() { // Define plane with normal 'n' pointing against gravity. m_slidingDirection = Vector3d(0.8539, 0.6289, -0.9978); m_slidingDirection.normalize(); // Create mock FEM m_fem = std::make_shared("Fem1dRepresentation"); auto state = std::make_shared(); state->setNumDof(6, 5); state->getPositions().segment<3>(0 * 6) = Vector3d(0.30, -0.57, 0.40); state->getPositions().segment<3>(1 * 6) = Vector3d(0.06, 0.63, -0.32); state->getPositions().segment<3>(2 * 6) = Vector3d(-0.91, 0.72, 0.72); state->getPositions().segment<3>(3 * 6) = Vector3d(0.35, 0.52, 0.50); state->getPositions().segment<3>(4 * 6) = Vector3d(1.14, 0.66, 0.71); addBeam(m_fem.get(), 0, 1); addBeam(m_fem.get(), 1, 2); addBeam(m_fem.get(), 2, 3); addBeam(m_fem.get(), 3, 4); m_fem->setInitialState(state); m_fem->setIntegrationScheme(SurgSim::Math::IntegrationScheme::INTEGRATIONSCHEME_EULER_EXPLICIT_MODIFIED); m_fem->setLocalActive(true); m_fem->initialize(std::make_shared()); m_fem->wakeUp(); // Update model by one timestep m_fem->beforeUpdate(dt); m_fem->update(dt); } void setSlidingConstraintAt(const IndexedLocalCoordinate& coord) { m_localization = std::make_shared(m_fem, coord); m_constraintData.setSlidingDirection(m_localization->calculatePosition(0.0), m_slidingDirection); } std::shared_ptr m_fem; std::shared_ptr m_localization; Vector3d m_slidingDirection; SlidingConstraintData m_constraintData; }; TEST_F(Fem1DConstraintFrictionlessSlidingTests, ConstructorTest) { ASSERT_NO_THROW( { FemConstraintFrictionlessSliding femContact; }); } TEST_F(Fem1DConstraintFrictionlessSlidingTests, ConstraintConstantsTest) { auto implementation = std::make_shared(); EXPECT_EQ(SurgSim::Physics::FRICTIONLESS_SLIDING, implementation->getConstraintType()); EXPECT_EQ(2u, implementation->getNumDof()); } TEST_F(Fem1DConstraintFrictionlessSlidingTests, BuildMlcpTest) { // This test verifies the build mlcp function works for a simple case. auto implementation = std::make_shared(); // Initialize MLCP MlcpPhysicsProblem mlcpPhysicsProblem = MlcpPhysicsProblem::Zero(m_fem->getNumDof(), 2, 1); // Apply constraint purely to the first node of the 0th beam. IndexedLocalCoordinate coord(0, Vector2d(1.0, 0.0)); setSlidingConstraintAt(coord); implementation->build(dt, m_constraintData, m_localization, &mlcpPhysicsProblem, 0, 0, SurgSim::Physics::CONSTRAINT_POSITIVE_SIDE); auto pose = m_constraintData.getPose().inverse().rotation(); EXPECT_TRUE((pose * m_slidingDirection).isApprox(Vector3d(1.0, 0.0, 0.0))); EXPECT_TRUE((pose * m_constraintData.getNormals()[0]).isApprox(Vector3d(0.0, 1.0, 0.0))); EXPECT_TRUE((pose * m_constraintData.getNormals()[1]).isApprox(Vector3d(0.0, 0.0, 1.0))); Eigen::Matrix H = Eigen::Matrix::Zero(); H.block<1, 3>(0, 0) = (dt * m_constraintData.getNormals()[0]).eval(); H.block<1, 3>(1, 0) = (dt * m_constraintData.getNormals()[1]).eval(); EXPECT_NEAR_EIGEN(H, mlcpPhysicsProblem.H, epsilon); // C = dt * m^{-1} m_fem->updateFMDK(*(m_fem->getPreviousState()), SurgSim::Math::ODEEQUATIONUPDATE_M); Eigen::Matrix C = dt * m_fem->getM().toDense().inverse(); EXPECT_NEAR_EIGEN(C * H.transpose(), mlcpPhysicsProblem.CHt, epsilon); EXPECT_NEAR_EIGEN(H * C * H.transpose(), mlcpPhysicsProblem.A, epsilon); EXPECT_EQ(0u, mlcpPhysicsProblem.constraintTypes.size()); } TEST_F(Fem1DConstraintFrictionlessSlidingTests, BuildMlcpCoordinateTest) { // This test verifies the build mlcp function works for a more complicated case with different nodes. auto implementation = std::make_shared(); // Initialize MLCP MlcpPhysicsProblem mlcpPhysicsProblem = MlcpPhysicsProblem::Zero(m_fem->getNumDof(), 2, 1); // Apply constraint between the first two nodes of the 0th beam. const Vector2d barycentric = Vector2d(0.24, 0.76); IndexedLocalCoordinate coord(0, barycentric); setSlidingConstraintAt(coord); implementation->build(dt, m_constraintData, m_localization, &mlcpPhysicsProblem, 0, 0, SurgSim::Physics::CONSTRAINT_POSITIVE_SIDE); auto pose = m_constraintData.getPose().inverse().rotation(); EXPECT_TRUE((pose * m_slidingDirection).isApprox(Vector3d(1.0, 0.0, 0.0))); EXPECT_TRUE((pose * m_constraintData.getNormals()[0]).isApprox(Vector3d(0.0, 1.0, 0.0))); EXPECT_TRUE((pose * m_constraintData.getNormals()[1]).isApprox(Vector3d(0.0, 0.0, 1.0))); Eigen::Matrix H = Eigen::Matrix::Zero(); H.block<1, 3>(0, 0) = (barycentric[0] * dt * m_constraintData.getNormals()[0]).eval(); H.block<1, 3>(1, 0) = (barycentric[0] * dt * m_constraintData.getNormals()[1]).eval(); H.block<1, 3>(0, 6) = (barycentric[1] * dt * m_constraintData.getNormals()[0]).eval(); H.block<1, 3>(1, 6) = (barycentric[1] * dt * m_constraintData.getNormals()[1]).eval(); EXPECT_NEAR_EIGEN(H, mlcpPhysicsProblem.H, epsilon); // C = dt * m^{-1} m_fem->updateFMDK(*(m_fem->getPreviousState()), SurgSim::Math::ODEEQUATIONUPDATE_M); Eigen::Matrix C = dt * m_fem->getM().toDense().inverse(); EXPECT_NEAR_EIGEN(C * H.transpose(), mlcpPhysicsProblem.CHt, epsilon); EXPECT_NEAR_EIGEN(H * C * H.transpose(), mlcpPhysicsProblem.A, epsilon); EXPECT_EQ(0u, mlcpPhysicsProblem.constraintTypes.size()); } TEST_F(Fem1DConstraintFrictionlessSlidingTests, BuildMlcpIndiciesTest) { // This test verifies the build mlcp function works given a hypothetical, preexisting mlcp problem. auto implementation = std::make_shared(); // Initialize MLCP MlcpPhysicsProblem mlcpPhysicsProblem = MlcpPhysicsProblem::Zero(m_fem->getNumDof() + 5, 3, 2); // Suppose 5 dof and 1 constraint are defined elsewhere. Then H, CHt, HCHt, and b are prebuilt. Eigen::SparseVector localH; localH.resize(5); localH.reserve(5); localH.insert(0) = 0.9478; localH.insert(1) = -0.3807; localH.insert(2) = 0.5536; localH.insert(3) = -0.6944; localH.insert(4) = 0.1815; mlcpPhysicsProblem.H.coeffRef(0, 0) += localH.coeff(0); mlcpPhysicsProblem.H.coeffRef(0, 1) += localH.coeff(1); mlcpPhysicsProblem.H.coeffRef(0, 2) += localH.coeff(2); mlcpPhysicsProblem.H.coeffRef(0, 3) += localH.coeff(3); mlcpPhysicsProblem.H.coeffRef(0, 4) += localH.coeff(4); Eigen::Matrix localC; localC << -0.2294, 0.5160, 0.2520, 0.5941, -0.4854, 0.1233, -0.4433, 0.3679, 0.9307, 0.2600, 0.1988, 0.6637, -0.7591, 0.1475, 0.8517, -0.5495, -0.4305, 0.3162, -0.7862, 0.7627, -0.5754, 0.4108, 0.8445, -0.5565, 0.7150; localC = localC * localC.transpose(); // force to be symmetric Eigen::Matrix localCHt = localC * localH.transpose(); mlcpPhysicsProblem.CHt.block<5, 1>(0, 0) = localCHt; mlcpPhysicsProblem.A.block<1, 1>(0, 0) = localH * localCHt; mlcpPhysicsProblem.b.block<1, 1>(0, 0)[0] = 0.6991; // Place the Fem at 5th dof (1 or multiple representations exist before, covering a total of 5 dof) // and the constraint at the index 1 (1 atomic constraint exists before this one) size_t indexOfRepresentation = 5; size_t indexOfConstraint = 1; // Apply constraint between the first two nodes of the fem. const Vector2d barycentric = Vector2d(0.24, 0.76); IndexedLocalCoordinate coord(0, barycentric); setSlidingConstraintAt(coord); implementation->build(dt, m_constraintData, m_localization, &mlcpPhysicsProblem, indexOfRepresentation, indexOfConstraint, SurgSim::Physics::CONSTRAINT_POSITIVE_SIDE); auto pose = m_constraintData.getPose().inverse().rotation(); EXPECT_TRUE((pose * m_slidingDirection).isApprox(Vector3d(1.0, 0.0, 0.0))); EXPECT_TRUE((pose * m_constraintData.getNormals()[0]).isApprox(Vector3d(0.0, 1.0, 0.0))); EXPECT_TRUE((pose * m_constraintData.getNormals()[1]).isApprox(Vector3d(0.0, 0.0, 1.0))); Eigen::Matrix H = Eigen::Matrix::Zero(); H.block<1, 3>(0, 0) = (barycentric[0] * dt * m_constraintData.getNormals()[0]).eval(); H.block<1, 3>(1, 0) = (barycentric[0] * dt * m_constraintData.getNormals()[1]).eval(); H.block<1, 3>(0, 6) = (barycentric[1] * dt * m_constraintData.getNormals()[0]).eval(); H.block<1, 3>(1, 6) = (barycentric[1] * dt * m_constraintData.getNormals()[1]).eval(); EXPECT_NEAR_EIGEN(H, mlcpPhysicsProblem.H.block(indexOfConstraint, indexOfRepresentation, 2, 30), epsilon); m_fem->updateFMDK(*(m_fem->getPreviousState()), SurgSim::Math::ODEEQUATIONUPDATE_M); Eigen::Matrix C = dt * m_fem->getM().toDense().inverse(); EXPECT_NEAR_EIGEN( C * H.transpose(), mlcpPhysicsProblem.CHt.block(indexOfRepresentation, indexOfConstraint, 30, 2), epsilon); EXPECT_NEAR_EIGEN( H * C * H.transpose(), mlcpPhysicsProblem.A.block(indexOfConstraint, indexOfConstraint, 2, 2), epsilon); EXPECT_EQ(0u, mlcpPhysicsProblem.constraintTypes.size()); } opensurgsim-0.7.0/SurgSim/Physics/UnitTests/Fem1DElementBeamTests.cpp000066400000000000000000000602101277777236100256120ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include #include "SurgSim/Framework/Assert.h" #include "SurgSim/Math/GaussLegendreQuadrature.h" #include "SurgSim/Math/Matrix.h" #include "SurgSim/Math/OdeEquation.h" #include "SurgSim/Math/OdeState.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/Fem1DElementBeam.h" using SurgSim::Math::Matrix; using SurgSim::Math::Quaterniond; using SurgSim::Math::SparseMatrix; using SurgSim::Math::Vector; using SurgSim::Math::Vector3d; using SurgSim::Physics::Fem1DElementBeam; namespace { const double epsilon = 1e-9; }; class MockFem1DElement : public Fem1DElementBeam { public: explicit MockFem1DElement(std::array nodeIds) : Fem1DElementBeam(nodeIds) { } const Eigen::Matrix& getInitialRotation12x12() const { return m_R0; } double getRestLength() const { return m_restLength; } }; void computeShapeFunction(double xi, double eta, double zeta, double L, Eigen::Ref> N) { // Shape function for beam from "Theory of Matrix Structural Analysis", Przemieniecki. Eqns 11.30. // Note xi = x/l, eta = y/l, zeta = z/l double xi2 = xi * xi; double xi3 = xi2 * xi; // Node 1 N(0, 0) = 1.0 - xi; N(0, 1) = 6.0 * (xi - xi2) * eta; N(0, 2) = 6.0 * (xi - xi2) * zeta; N(0, 3) = 0.0; N(0, 4) = (1.0 - 4.0 * xi + 3.0 * xi2) * L * zeta; N(0, 5) = (-1.0 + 4.0 * xi - 3.0 * xi2) * L * eta; N(1, 0) = 0.0; N(1, 1) = 1.0 - 3.0 * xi2 + 2.0 * xi3; N(1, 2) = 0.0; N(1, 3) = -(1.0 - xi) * L * zeta; N(1, 4) = 0.0; N(1, 5) = (xi - 2.0 * xi2 + xi3) * L; N(2, 0) = 0.0; N(2, 1) = 0.0; N(2, 2) = 1.0 - 3.0 * xi2 + 2.0 * xi3; N(2, 3) = -(1.0 - xi) * L * eta; N(2, 4) = (-xi + 2.0 * xi2 - xi3) * L; N(2, 5) = 0.0; // Node 2 N(0, 6 + 0) = xi; N(0, 6 + 1) = 6.0 * (-xi + xi2) * eta; N(0, 6 + 2) = 6.0 * (-xi + xi2) * zeta; N(0, 6 + 3) = 0.0; N(0, 6 + 4) = (-2.0 * xi + 3.0 * xi2) * L * zeta; N(0, 6 + 5) = (2.0 * xi - 3.0 * xi2) * L * eta; N(1, 6 + 0) = 0.0; N(1, 6 + 1) = 3.0 * xi2 - 2.0 * xi3; N(1, 6 + 2) = 0.0; N(1, 6 + 3) = -L * xi * zeta; N(1, 6 + 4) = 0.0; N(1, 6 + 5) = (-xi2 + xi3) * L; N(2, 6 + 0) = 0.0; N(2, 6 + 1) = 0.0; N(2, 6 + 2) = 3.0 * xi2 - 2.0 * xi3; N(2, 6 + 3) = -L * xi * eta; N(2, 6 + 4) = (xi2 - xi3) * L; N(2, 6 + 5) = 0.0; } class Fem1DElementBeamTests : public ::testing::Test { public: static const int m_numberNodes = 5; std::array m_nodeIds; SurgSim::Math::OdeState m_restState; double m_expectedVolume; double m_rho, m_E, m_nu, m_L; double m_radius; Quaterniond m_orientation; Vector forceVector; SparseMatrix massMatrix; SparseMatrix dampingMatrix; SparseMatrix stiffnessMatrix; void SetUp() override { using SurgSim::Math::getSubVector; m_rho = 1000.0; m_E = 1e6; m_nu = 0.45; m_radius = 0.01; m_L = 1.0; m_expectedVolume = m_L * (M_PI * m_radius * m_radius); // Beam is made of node 3 and 1 in a bigger system containing m_numberNodes nodes (at least 4) m_nodeIds[0] = 3; m_nodeIds[1] = 1; m_restState.setNumDof(6, m_numberNodes); m_orientation.coeffs().setLinSpaced(2.0, 3.0); m_orientation.normalize(); Vector3d firstExtremity(0.1, 1.2, 2.3); Vector3d secondExtremity = firstExtremity + m_orientation._transformVector(Vector3d(m_L, 0.0, 0.0)); Vector& x = m_restState.getPositions(); getSubVector(x, m_nodeIds[0], 6).segment<3>(0) = firstExtremity; getSubVector(x, m_nodeIds[1], 6).segment<3>(0) = secondExtremity; // Initialize the global matrices for calculations. std::vector nodeIdsVectorForm(m_nodeIds.begin(), m_nodeIds.end()); forceVector = Vector::Zero(6 * m_numberNodes); Fem1DElementBeam beam(m_nodeIds); massMatrix.resize(6 * m_numberNodes, 6 * m_numberNodes); beam.assembleMatrixBlocks(SurgSim::Math::Matrix::Zero(12, 12), nodeIdsVectorForm, 6, &massMatrix, true); massMatrix.makeCompressed(); dampingMatrix.resize(6 * m_numberNodes, 6 * m_numberNodes); beam.assembleMatrixBlocks(SurgSim::Math::Matrix::Zero(12, 12), nodeIdsVectorForm, 6, &dampingMatrix, true); dampingMatrix.makeCompressed(); stiffnessMatrix.resize(6 * m_numberNodes, 6 * m_numberNodes); beam.assembleMatrixBlocks(SurgSim::Math::Matrix::Zero(12, 12), nodeIdsVectorForm, 6, &stiffnessMatrix, true); stiffnessMatrix.makeCompressed(); } void getExpectedMassMatrix(Eigen::Ref mass) { double& L = m_L; double L2 = L * L; double A = M_PI * m_radius * m_radius; double Iz = M_PI_4 * m_radius * m_radius * m_radius * m_radius; double Iy = M_PI_4 * m_radius * m_radius * m_radius * m_radius; double I = Iz + Iy; Eigen::Matrix untransformedMass; untransformedMass.col(0) << 1.0 / 3.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0 / 6.0, 0.0, 0.0, 0.0, 0.0, 0.0; untransformedMass.col(1) << 0.0, 13.0 / 35.0 + 6.0 * Iz / (5.0 * A * L2), 0.0, 0.0, 0.0, 11.0 * L / 210.0 + Iz / (10.0 * A * L), 0.0, 9.0 / 70.0 - 6.0 * Iz / (5.0 * A * L2), 0.0, 0.0, 0.0, -13.0 * L / 420.0 + Iz / (10.0 * A * L); untransformedMass.col(2) << 0.0, 0.0, 13.0 / 35.0 + 6.0 * Iy / (5.0 * A * L2), 0.0, -11.0 * L / 210.0 - Iy / (10.0 * A * L), 0.0, 0.0, 0.0, 9.0 / 70.0 - 6.0 * Iy / (5.0 * A * L2), 0.0, 13.0 * L / 420.0 - Iy / (10.0 * A * L), 0.0; untransformedMass.col(3) << 0.0, 0.0, 0.0, I / (3.0 * A), 0.0, 0.0, 0.0, 0.0, 0.0, I / (6.0 * A), 0.0, 0.0; untransformedMass.col(4) << 0.0, 0.0, -11.0 * L / 210.0 - Iy / (10.0 * A * L), 0.0, L2 / 105.0 + 2.0 * Iy / (15.0 * A), 0.0, 0.0, 0.0, -13.0 * L / 420.0 + Iy / (10.0 * A * L), 0.0, -L2 / 140.0 - Iy / (30.0 * A), 0.0; untransformedMass.col(5) << 0.0, 11.0 * L / 210.0 + Iz / (10.0 * A * L), 0.0, 0.0, 0.0, L2 / 105.0 + 2.0 * Iz / (15.0 * A), 0.0, 13.0 * L / 420.0 - Iz / (10.0 * A * L), 0.0, 0.0, 0.0, -L2 / 140.0 - Iz / (30.0 * A); untransformedMass.col(6) << 1.0 / 6.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0 / 3.0, 0.0, 0.0, 0.0, 0.0, 0.0; untransformedMass.col(7) << 0.0, 9.0 / 70.0 - 6.0 * Iz / (5.0 * A * L2), 0.0, 0.0, 0.0, 13.0 * L / 420.0 - Iz / (10.0 * A * L), 0.0, 13.0 / 35.0 + 6.0 * Iz / (5.0 * A * L2), 0.0, 0.0, 0.0, -11.0 * L / 210.0 - Iz / (10.0 * A * L); untransformedMass.col(8) << 0.0, 0.0, 9.0 / 70.0 - 6.0 * Iy / (5.0 * A * L2), 0.0, -13.0 * L / 420.0 + Iy / (10.0 * A * L), 0.0, 0.0, 0.0, 13.0 / 35.0 + 6.0 * Iy / (5.0 * A * L2), 0.0, 11.0 * L / 210.0 + Iy / (10.0 * A * L), 0.0; untransformedMass.col(9) << 0.0, 0.0, 0.0, I / (6.0 * A), 0.0, 0.0, 0.0, 0.0, 0.0, I / (3.0 * A), 0.0, 0.0; untransformedMass.col(10) << 0.0, 0.0, 13.0 * L / 420.0 - Iy / (10.0 * A * L), 0.0, -L2 / 140.0 - Iy / (30.0 * A), 0.0, 0.0, 0.0, 11.0 * L / 210.0 + Iy / (10.0 * A * L), 0.0, L2 / 105.0 + 2 * Iy / (15.0 * A), 0.0; untransformedMass.col(11) << 0.0, -13.0 * L / 420.0 + Iz / (10.0 * A * L), 0.0, 0.0, 0.0, -L2 / 140.0 - Iz / (30.0 * A), 0.0, -11.0 * L / 210.0 - Iz / (10.0 * A * L), 0.0, 0.0, 0.0, L2 / 105.0 + 2 * Iz / (15.0 * A); untransformedMass *= m_rho * m_expectedVolume; mass.setZero(); placeIntoAssembly(untransformedMass, mass); } void getExpectedMassMatrix2(Eigen::Ref mass) { // Kinetic Energy = K = \int_V 1/2 rho v^2 dV, with rho the density and v the velocity of a volume particle // The shape function N transforms local coordinates into global coordinates, x = N q, // N = (N_1^x 0 0 N_2^x 0 0) // ( 0 N_1^y 0 0 N_2^y 0) // ( 0 0 N_1^z 0 0 N_2^z) // // Using Lagrange's equation, we find // d\dt (dK/d\dot{q}_i) = d\dt( 1/2.rho \int_V d/d\dot(q}_i ( \dot{q}^T.N^T.N.\dot{q} ) dV ) // [Note d/dx(ax \cdot ax) = 2 (a \cdot ax)] // = rho d\dt( \int_V N^T.N.\dot{q} dV ) // = rho d\dt( \int_V N^T.N dV \dot{q}) // = rho \int_V N^T.N dV \ddot{q} // // Therefore the mass 'M' is // M = rho \int_V N^T(x,y,z).N(x,y,z) dV // = rho \int_V f(x,y,z) dV // // Integrate over the cylindrical volume of the beam // M = rho \int_0^L dx \int_{-R}^R dy \int_{-\sqrt{R^2-y^2}}^{\sqrt{R^2-y^2}} dz [f(x,y,z)] // // Let // x = l \xi // y = l \eta // z = l \zeta // Then // \int_0^L dx // => \int_0^1 l d\xi // \int_{-R}^R dy // => \int_{-R/l}^{R/l} l d\eta // \int_{-\sqrt{R^2-y^2}}^{\sqrt{R^2-y^2}} dz // => \int_{-\sqrt{(R/l)^2-\eta^2}}^{\sqrt{(R/l)^2-\eta^2}} l d\zeta // // We know 'f' in transformed coordinates, so we can directly calculate // M = \rho l^3 ... // \int_0^1 d\xi ... // \int_{-R/l}^{R/l} d\eta ... // \int_{-\sqrt{(R/l)^2-\eta^2}}^{\sqrt{(R/l)^2-\eta^2}} d\zeta ... // [f(\xi, \eta, \zeta)] using std::pow; using std::sqrt; Eigen::Matrix N; Eigen::Matrix untransformedMass = Eigen::Matrix::Zero(); for (int i = 0; i < 4; i++) { double xi = 0.5 * SurgSim::Math::gaussQuadrature4Points[i].point + 0.5; double hXi = 0.5 * SurgSim::Math::gaussQuadrature4Points[i].weight; for (int j = 0; j < 100; j++) { double eta = m_radius / m_L * SurgSim::Math::gaussQuadrature100Points[j].point; double hEta = m_radius / m_L * SurgSim::Math::gaussQuadrature100Points[j].weight; for (int k = 0; k < 2; k++) { double zeta = sqrt(pow(m_radius / m_L, 2.0) - pow(eta, 2.0)) * SurgSim::Math::gaussQuadrature2Points[k].point; double hZeta = sqrt(pow(m_radius / m_L, 2.0) - pow(eta, 2.0)) * SurgSim::Math::gaussQuadrature2Points[k].weight; computeShapeFunction(xi, eta, zeta, m_L, N); untransformedMass += N.transpose() * N * hZeta * hEta * hXi; } } } untransformedMass *= m_rho * pow(m_L, 3.0); mass.setZero(); placeIntoAssembly(untransformedMass, mass); } void getExpectedStiffnessMatrix(Eigen::Ref stiffness) { double& L = m_L; double L2 = L * L; double L3 = L2 * L; double A = (M_PI * m_radius * m_radius); double Iz = M_PI / 4.0 * (m_radius * m_radius * m_radius * m_radius); double Iy = M_PI / 4.0 * (m_radius * m_radius * m_radius * m_radius); double I = Iz + Iy; double G = m_E / (2.0 * (1.0 + m_nu)); double asy = A * 5. / 6.; double asz = asy; double phi_y = 12.0 * m_E * Iz / (G * asy * L2); double phi_z = 12.0 * m_E * Iy / (G * asz * L2); Eigen::Matrix untransformedStiffness; untransformedStiffness.col(0) << m_E* A / L, 0.0, 0.0, 0.0, 0.0, 0.0, -m_E* A / L, 0.0, 0.0, 0.0, 0.0, 0.0; untransformedStiffness.col(1) << 0.0, 12.0 * m_E* Iz / L3 / (1 + phi_y), 0.0, 0.0, 0.0, 6.0 * m_E* Iz / L2 / (1 + phi_y), 0.0, -12.0 * m_E* Iz / L3 / (1 + phi_y), 0.0, 0.0, 0.0, 6.0 * m_E* Iz / L2 / (1 + phi_y); untransformedStiffness.col(2) << 0.0, 0.0, 12.0 * m_E* Iy / L3 / (1 + phi_z), 0.0, -6.0 * m_E* Iy / L2 / (1 + phi_z), 0.0, 0.0, 0.0, -12.0 * m_E* Iy / L3 / (1 + phi_z), 0.0, -6.0 * m_E* Iy / L2 / (1 + phi_z), 0.0; untransformedStiffness.col(3) << 0.0, 0.0, 0.0, G* I / L, 0.0, 0.0, 0.0, 0.0, 0.0, -G* I / L, 0.0, 0.0; untransformedStiffness.col(4) << 0.0, 0.0, -6.0 * m_E* Iy / L2 / (1 + phi_z), 0.0, (4.0 + phi_z) * m_E* Iy / L / (1 + phi_z), 0.0, 0.0, 0.0, 6.0 * m_E* Iy / L2 / (1 + phi_z), 0.0, (2.0 - phi_z) * m_E* Iy / L / (1 + phi_z), 0.0; untransformedStiffness.col(5) << 0.0, 6.0 * m_E* Iz / L2 / (1 + phi_y), 0.0, 0.0, 0.0, (4.0 + phi_y) * m_E* Iz / L / (1 + phi_y), 0.0, -6.0 * m_E* Iz / L2 / (1 + phi_y), 0.0, 0.0, 0.0, (2.0 - phi_y) * m_E* Iz / L / (1 + phi_y); untransformedStiffness.col(6) << -m_E* A / L, 0.0, 0.0, 0.0, 0.0, 0.0, m_E* A / L, 0.0, 0.0, 0.0, 0.0, 0.0; untransformedStiffness.col(7) << 0.0, -12.0 * m_E* Iz / L3 / (1 + phi_y), 0.0, 0.0, 0.0, -6.0 * m_E* Iz / L2 / (1 + phi_y), 0.0, 12.0 * m_E* Iz / L3 / (1 + phi_y), 0.0, 0.0, 0.0, -6.0 * m_E* Iz / L2 / (1 + phi_y); untransformedStiffness.col(8) << 0.0, 0.0, -12.0 * m_E* Iy / L3 / (1 + phi_z), 0.0, 6.0 * m_E* Iy / L2 / (1 + phi_z), 0.0, 0.0, 0.0, 12.0 * m_E* Iy / L3 / (1 + phi_z), 0.0, 6.0 * m_E* Iy / L2 / (1 + phi_z), 0.0; untransformedStiffness.col(9) << 0.0, 0.0, 0.0, -G* I / L, 0.0, 0.0, 0.0, 0.0, 0.0, G* I / L, 0.0, 0.0; untransformedStiffness.col(10) << 0.0, 0.0, -6.0 * m_E* Iy / L2 / (1 + phi_z), 0.0, (2.0 - phi_z) * m_E* Iy / L / (1 + phi_z), 0.0, 0.0, 0.0, 6.0 * m_E* Iy / L2 / (1 + phi_z), 0.0, (4.0 + phi_z) * m_E* Iy / L / (1 + phi_z), 0.0; untransformedStiffness.col(11) << 0.0, 6.0 * m_E* Iz / L2 / (1 + phi_y), 0.0, 0.0, 0.0, (2.0 - phi_y) * m_E* Iz / L / (1 + phi_y), 0.0, -6.0 * m_E* Iz / L2 / (1 + phi_y), 0.0, 0.0, 0.0, (4.0 + phi_y) * m_E* Iz / L / (1 + phi_y); stiffness.setZero(); placeIntoAssembly(untransformedStiffness, stiffness); } void placeIntoAssembly(const Eigen::Ref& in, Eigen::Ref out) { std::vector nodeIdsVectorForm(m_nodeIds.begin(), m_nodeIds.end()); // Transform into correct coordinates and correct place in matrix std::shared_ptr beam = getBeam(); const Eigen::Matrix& r = beam->getInitialRotation12x12(); SurgSim::Math::addSubMatrix(r * in * r.transpose(), nodeIdsVectorForm, 6, &out); } std::shared_ptr getBeam() { auto beam = std::make_shared(m_nodeIds); beam->setRadius(m_radius); beam->setMassDensity(m_rho); beam->setPoissonRatio(m_nu); beam->setYoungModulus(m_E); beam->initialize(m_restState); return beam; } }; TEST_F(Fem1DElementBeamTests, ConstructorTest) { ASSERT_NO_THROW( { MockFem1DElement beam(m_nodeIds); }); } TEST_F(Fem1DElementBeamTests, NodeIdsTest) { Fem1DElementBeam beam(m_nodeIds); EXPECT_EQ(2u, beam.getNumNodes()); EXPECT_EQ(2u, beam.getNodeIds().size()); for (int i = 0; i < 2; i++) { EXPECT_EQ(m_nodeIds[i], beam.getNodeId(i)); EXPECT_EQ(m_nodeIds[i], beam.getNodeIds()[i]); } } TEST_F(Fem1DElementBeamTests, setGetRadiusTest) { Fem1DElementBeam beam(m_nodeIds); // Default radius = 0 EXPECT_DOUBLE_EQ(0.0, beam.getRadius()); // Set to a valid radius beam.setRadius(1.54); EXPECT_DOUBLE_EQ(1.54, beam.getRadius()); // Set to an invalid radius EXPECT_ANY_THROW(beam.setRadius(0.0)); EXPECT_ANY_THROW(beam.setRadius(-9.4)); } TEST_F(Fem1DElementBeamTests, MaterialParameterTest) { Fem1DElementBeam beam(m_nodeIds); beam.setRadius(m_radius); // Test the various mode of failure related to the physical parameters // This has been already tested in FemElementTests, but this is to make sure this method is called properly // So the same behavior should be expected { // Mass density not set ASSERT_ANY_THROW(beam.initialize(m_restState)); // Poisson Ratio not set beam.setMassDensity(-1234.56); ASSERT_ANY_THROW(beam.initialize(m_restState)); // Young modulus not set beam.setPoissonRatio(0.55); ASSERT_ANY_THROW(beam.initialize(m_restState)); // Invalid mass density beam.setYoungModulus(-4321.33); ASSERT_ANY_THROW(beam.initialize(m_restState)); // Invalid Poisson ratio beam.setMassDensity(m_rho); ASSERT_ANY_THROW(beam.initialize(m_restState)); // Invalid Young modulus beam.setPoissonRatio(m_nu); ASSERT_ANY_THROW(beam.initialize(m_restState)); beam.setYoungModulus(m_E); ASSERT_NO_THROW(beam.initialize(m_restState)); } } TEST_F(Fem1DElementBeamTests, VolumeTest) { std::shared_ptr beam = getBeam(); EXPECT_NEAR(beam->getVolume(m_restState), m_expectedVolume, 1e-10); } TEST_F(Fem1DElementBeamTests, RestLengthTest) { std::shared_ptr beam = getBeam(); EXPECT_NEAR(beam->getRestLength(), m_L, 1e-10); } TEST_F(Fem1DElementBeamTests, InitialRotationTest) { std::shared_ptr beam = getBeam(); // Use a mask to test the structure of the rotation matrix R0 (4 digonal block 3x3 matrix and 0 elsewhere) Eigen::Matrix mask; mask.setOnes(); mask.block<3, 3>(0, 0).setZero(); mask.block<3, 3>(3, 3).setZero(); mask.block<3, 3>(6, 6).setZero(); mask.block<3, 3>(9, 9).setZero(); EXPECT_TRUE(beam->getInitialRotation12x12().cwiseProduct(mask).isZero()); // Only the 1st direction of the frame can be compared as the 2 other ones are randomly // chosen (can be any 2 vectors forming an Orthonormal frame) Vector3d expected_i = m_orientation.matrix().col(0); Vector3d i_0 = beam->getInitialRotation12x12().block<3, 3>(0, 0).col(0); Vector3d i_1 = beam->getInitialRotation12x12().block<3, 3>(3, 3).col(0); Vector3d i_2 = beam->getInitialRotation12x12().block<3, 3>(6, 6).col(0); Vector3d i_3 = beam->getInitialRotation12x12().block<3, 3>(9, 9).col(0); EXPECT_TRUE(i_0.isApprox(expected_i)); EXPECT_TRUE(i_1.isApprox(expected_i)); EXPECT_TRUE(i_2.isApprox(expected_i)); EXPECT_TRUE(i_3.isApprox(expected_i)); EXPECT_TRUE(beam->getInitialRotation().col(0).isApprox(expected_i)); } TEST_F(Fem1DElementBeamTests, CoordinateTests) { Fem1DElementBeam element(m_nodeIds); Vector validNaturalCoordinate(2); Vector validNaturalCoordinate2(2); Vector invalidNaturalCoordinateSumNot1(2); Vector invalidNaturalCoordinateNegativeValue(2); Vector invalidNaturalCoordinateSize1(1), invalidNaturalCoordinateSize3(3); Vector3d expectedA(0.1, 1.2, 2.3); Vector3d expectedB = expectedA + m_orientation._transformVector(Vector3d(m_L, 0.0, 0.0)); validNaturalCoordinate << 0.4, 0.6; validNaturalCoordinate2 << -1e-11, 1 + 1e-11; invalidNaturalCoordinateSumNot1 << 0.5, 0.6; invalidNaturalCoordinateNegativeValue << 1.4, -0.4; invalidNaturalCoordinateSize1 << 1.0; invalidNaturalCoordinateSize3 << 0.2, 0.2, 0.6; EXPECT_TRUE(element.isValidCoordinate(validNaturalCoordinate)); EXPECT_TRUE(element.isValidCoordinate(validNaturalCoordinate2)); EXPECT_FALSE(element.isValidCoordinate(invalidNaturalCoordinateSumNot1)); EXPECT_FALSE(element.isValidCoordinate(invalidNaturalCoordinateNegativeValue)); EXPECT_FALSE(element.isValidCoordinate(invalidNaturalCoordinateSize1)); EXPECT_FALSE(element.isValidCoordinate(invalidNaturalCoordinateSize3)); Vector naturalCoordinateA(2), naturalCoordinateB(2), naturalCoordinateMiddle(2); Vector ptA, ptB, ptMiddle; naturalCoordinateA << 1.0, 0.0; naturalCoordinateB << 0.0, 1.0; naturalCoordinateMiddle << 1.0 / 2.0, 1.0 / 2.0; EXPECT_THROW(ptA = element.computeCartesianCoordinate(m_restState, invalidNaturalCoordinateNegativeValue), \ SurgSim::Framework::AssertionFailure); EXPECT_THROW(ptA = element.computeCartesianCoordinate(m_restState, invalidNaturalCoordinateSize1), \ SurgSim::Framework::AssertionFailure); EXPECT_THROW(ptA = element.computeCartesianCoordinate(m_restState, invalidNaturalCoordinateSize3), \ SurgSim::Framework::AssertionFailure); EXPECT_THROW(ptA = element.computeCartesianCoordinate(m_restState, invalidNaturalCoordinateSumNot1), \ SurgSim::Framework::AssertionFailure); EXPECT_NO_THROW(ptA = element.computeCartesianCoordinate(m_restState, naturalCoordinateA)); EXPECT_NO_THROW(ptB = element.computeCartesianCoordinate(m_restState, naturalCoordinateB)); EXPECT_NO_THROW(ptMiddle = element.computeCartesianCoordinate(m_restState, naturalCoordinateMiddle)); EXPECT_TRUE(ptA.isApprox(expectedA)); EXPECT_TRUE(ptB.isApprox(expectedB)); EXPECT_TRUE(ptMiddle.isApprox((expectedA + expectedB) * 0.5)); Vector3d cartesian(0.1, 1.2, 2.3); EXPECT_THROW(element.computeNaturalCoordinate(m_restState, cartesian), SurgSim::Framework::AssertionFailure); } TEST_F(Fem1DElementBeamTests, ForceAndMatricesTest) { using SurgSim::Math::Matrix; using SurgSim::Math::Vector; using SurgSim::Math::getSubVector; std::shared_ptr beam = getBeam(); Vector vectorOnes = Vector::Ones(6 * m_numberNodes); forceVector.setZero(); SurgSim::Math::clearMatrix(&massMatrix); SurgSim::Math::clearMatrix(&dampingMatrix); SurgSim::Math::clearMatrix(&stiffnessMatrix); Matrix expectedMass(6 * m_numberNodes, 6 * m_numberNodes); Matrix expectedMass2(6 * m_numberNodes, 6 * m_numberNodes); Matrix expectedDamping = Matrix(dampingMatrix); Matrix expectedStiffness(6 * m_numberNodes, 6 * m_numberNodes); getExpectedMassMatrix(expectedMass); getExpectedMassMatrix2(expectedMass2); getExpectedStiffnessMatrix(expectedStiffness); // Update the internal f, M, D, K variables. beam->updateFMDK(m_restState, SurgSim::Math::ODEEQUATIONUPDATE_FMDK); // No force should be produced when in rest state (x = x0) => F = K.(x-x0) = 0 beam->addForce(&forceVector); EXPECT_TRUE(forceVector.isZero()); beam->addMass(&massMatrix); EXPECT_TRUE(massMatrix.isApprox(expectedMass)) << "Expected Mass:" << std::endl << expectedMass << std::endl << "Mass Matrix:" << std::endl << massMatrix << std::endl; EXPECT_TRUE(massMatrix.isApprox(expectedMass2, 1e-6)) << "Expected Mass 2:" << std::endl << expectedMass << std::endl << "Mass Matrix:" << std::endl << massMatrix << std::endl; beam->addDamping(&dampingMatrix); EXPECT_TRUE(dampingMatrix.isApprox(expectedDamping)); beam->addStiffness(&stiffnessMatrix); EXPECT_TRUE(stiffnessMatrix.isApprox(expectedStiffness)); forceVector.setZero(); SurgSim::Math::clearMatrix(&massMatrix); SurgSim::Math::clearMatrix(&dampingMatrix); SurgSim::Math::clearMatrix(&stiffnessMatrix); beam->addFMDK(&forceVector, &massMatrix, &dampingMatrix, &stiffnessMatrix); EXPECT_TRUE(forceVector.isZero()); EXPECT_TRUE(massMatrix.isApprox(expectedMass)); EXPECT_TRUE(massMatrix.isApprox(expectedMass2, 1e-6)); EXPECT_TRUE(dampingMatrix.isApprox(expectedDamping)); EXPECT_TRUE(stiffnessMatrix.isApprox(expectedStiffness)); // Test addMatVec API with Mass component only forceVector.setZero(); beam->addMatVec(1.0, 0.0, 0.0, vectorOnes, &forceVector); for (int rowId = 0; rowId < 6 * m_numberNodes; rowId++) { EXPECT_NEAR(expectedMass.row(rowId).sum(), forceVector[rowId], epsilon); EXPECT_NEAR(expectedMass2.row(rowId).sum(), forceVector[rowId], 1e-6); } // Test addMatVec API with Damping component only forceVector.setZero(); beam->addMatVec(0.0, 1.0, 0.0, vectorOnes, &forceVector); for (int rowId = 0; rowId < 6 * m_numberNodes; rowId++) { EXPECT_NEAR(expectedDamping.row(rowId).sum(), forceVector[rowId], epsilon); } // Test addMatVec API with Stiffness component only forceVector.setZero(); beam->addMatVec(0.0, 0.0, 1.0, vectorOnes, &forceVector); for (int rowId = 0; rowId < 6 * m_numberNodes; rowId++) { EXPECT_NEAR(expectedStiffness.row(rowId).sum(), forceVector[rowId], epsilon); } // Test addMatVec API with mix Mass/Damping/Stiffness components forceVector.setZero(); beam->addMatVec(1.0, 2.0, 3.0, vectorOnes, &forceVector); for (int rowId = 0; rowId < 6 * m_numberNodes; rowId++) { double expectedCoef = 1.0 * expectedMass.row(rowId).sum() + 2.0 * expectedDamping.row(rowId).sum() + 3.0 * expectedStiffness.row(rowId).sum(); EXPECT_NEAR(expectedCoef, forceVector[rowId], epsilon); expectedCoef = 1.0 * expectedMass2.row(rowId).sum() + 2.0 * expectedDamping.row(rowId).sum() + 3.0 * expectedStiffness.row(rowId).sum(); EXPECT_NEAR(expectedCoef, forceVector[rowId], 1e-6); } } opensurgsim-0.7.0/SurgSim/Physics/UnitTests/Fem1DLocalizationTest.cpp000066400000000000000000000143741277777236100257130ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include #include "SurgSim/Math/OdeState.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/Fem1DElementBeam.h" #include "SurgSim/Physics/Fem1DLocalization.h" #include "SurgSim/Physics/Fem1DRepresentation.h" #include "SurgSim/Physics/Fem2DRepresentation.h" #include "SurgSim/Physics/Fem3DRepresentation.h" using SurgSim::DataStructures::IndexedLocalCoordinate; namespace { const double epsilon = 1e-10; }; namespace SurgSim { namespace Physics { void addBeam(Fem1DRepresentation *fem, std::array nodes, const SurgSim::Math::OdeState& state, double radius = 0.01, double massDensity = 1.0, double poissonRatio = 0.1, double youngModulus = 1.0) { auto element = std::make_shared(nodes); element->setRadius(radius); element->setMassDensity(massDensity); element->setPoissonRatio(poissonRatio); element->setYoungModulus(youngModulus); element->initialize(state); fem->addFemElement(element); } class Fem1DLocalizationTest : public ::testing::Test { public: void SetUp() { using SurgSim::Math::Vector3d; using SurgSim::Math::getSubVector; m_fem = std::make_shared("Fem1dRepresentation"); auto state = std::make_shared(); state->setNumDof(6, 3); auto& x = state->getPositions(); getSubVector(x, 0, 6).segment<3>(0) = Vector3d( 0.0, 0.0, 0.0); getSubVector(x, 1, 6).segment<3>(0) = Vector3d( 0.0, 1.0, -1.0); getSubVector(x, 2, 6).segment<3>(0) = Vector3d(-1.0, 1.0, 0.0); // Define Beams { std::array nodes = {{0, 1}}; addBeam(m_fem.get(), nodes, *state); } { std::array nodes = {{1, 2}}; addBeam(m_fem.get(), nodes, *state); } m_fem->setInitialState(state); m_fem->setLocalActive(true); m_validLocalPosition.index = 1; m_validLocalPosition.coordinate = SurgSim::Math::Vector::Zero(2); m_validLocalPosition.coordinate[0] = 0.4; m_validLocalPosition.coordinate[1] = 0.6; m_invalidIndexLocalPosition.index = 3; m_invalidIndexLocalPosition.coordinate = SurgSim::Math::Vector::Zero(2); m_invalidIndexLocalPosition.coordinate[0] = 0.4; m_invalidIndexLocalPosition.coordinate[1] = 0.6; m_invalidCoordinateLocalPosition.index = 1; m_invalidCoordinateLocalPosition.coordinate = SurgSim::Math::Vector::Zero(2); m_invalidCoordinateLocalPosition.coordinate[0] = 0.6; m_invalidCoordinateLocalPosition.coordinate[1] = 0.6; } void TearDown() { } std::shared_ptr m_fem; SurgSim::DataStructures::IndexedLocalCoordinate m_validLocalPosition; SurgSim::DataStructures::IndexedLocalCoordinate m_invalidIndexLocalPosition; SurgSim::DataStructures::IndexedLocalCoordinate m_invalidCoordinateLocalPosition; }; TEST_F(Fem1DLocalizationTest, ConstructorTest) { // IndexedLocalCoordinate pointing to a node (node index + empty coordinate) are invalid. It will failed, // either because the index is out of bound or because the coordinates are the wrong size (empty) // This is tested by m_invalidIndexLocalPosition and m_invalidCoordinateLocalPosition ASSERT_THROW( std::make_shared(m_fem, m_invalidIndexLocalPosition), SurgSim::Framework::AssertionFailure); ASSERT_THROW( std::make_shared(m_fem, m_invalidCoordinateLocalPosition), SurgSim::Framework::AssertionFailure); ASSERT_NO_THROW(std::make_shared(m_fem, m_validLocalPosition);); } TEST_F(Fem1DLocalizationTest, IsValidRepresentation) { Fem1DLocalization localization(m_fem, m_validLocalPosition); ASSERT_TRUE(localization.isValidRepresentation(m_fem)); // nullptr is valid ASSERT_TRUE(localization.isValidRepresentation(nullptr)); ASSERT_FALSE(localization.isValidRepresentation(std::make_shared("fem2d"))); ASSERT_FALSE(localization.isValidRepresentation(std::make_shared("fem3d"))); } TEST_F(Fem1DLocalizationTest, MoveClosestTo) { Fem1DLocalization localization(m_fem, m_validLocalPosition); { SurgSim::DataStructures::IndexedLocalCoordinate testPosition1; testPosition1.index = 1; testPosition1.coordinate = SurgSim::Math::Vector::Zero(2); testPosition1.coordinate[0] = 0.5; testPosition1.coordinate[1] = 0.5; Fem1DLocalization testLocalization1(m_fem, testPosition1); bool hasReachedEnd = false; EXPECT_TRUE(localization.moveClosestTo(testLocalization1.calculatePosition(), &hasReachedEnd)); EXPECT_FALSE(hasReachedEnd); EXPECT_TRUE(localization.calculatePosition().isApprox(testLocalization1.calculatePosition())); } { SurgSim::DataStructures::IndexedLocalCoordinate testPosition1; testPosition1.index = 0; testPosition1.coordinate = SurgSim::Math::Vector::Zero(2); testPosition1.coordinate[0] = 0.1; testPosition1.coordinate[1] = 0.9; Fem1DLocalization testLocalization1(m_fem, testPosition1); bool hasReachedEnd = false; EXPECT_TRUE(localization.moveClosestTo(testLocalization1.calculatePosition(), &hasReachedEnd)); EXPECT_FALSE(hasReachedEnd); EXPECT_TRUE(localization.calculatePosition().isApprox(testLocalization1.calculatePosition())); } { SurgSim::DataStructures::IndexedLocalCoordinate testPosition1; testPosition1.index = 0; testPosition1.coordinate = SurgSim::Math::Vector::Zero(2); testPosition1.coordinate[0] = 1.0; testPosition1.coordinate[1] = 0.0; Fem1DLocalization testLocalization1(m_fem, testPosition1); bool hasReachedEnd = false; EXPECT_TRUE(localization.moveClosestTo(testLocalization1.calculatePosition(), &hasReachedEnd)); EXPECT_TRUE(hasReachedEnd); EXPECT_TRUE(localization.calculatePosition().isApprox(testLocalization1.calculatePosition())); } } } // namespace SurgSim } // namespace Physics opensurgsim-0.7.0/SurgSim/Physics/UnitTests/Fem1DMechanicalValidationTests.cpp000066400000000000000000000310731277777236100275000ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file Fem1DMechanicalValidationTests.cpp /// This file tests the mechanical behavior of the class Fem1DRepresentation. #include #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Math/Matrix.h" #include "SurgSim/Math/OdeState.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/Fem1DRepresentation.h" #include "SurgSim/Physics/Fem1DElementBeam.h" #include "SurgSim/Physics/UnitTests/MockObjects.h" using SurgSim::Math::Matrix; using SurgSim::Math::Vector; using SurgSim::Math::Vector3d; namespace { static const double dt = 1e-3; } namespace SurgSim { namespace Physics { class Fem1DBuilder { public: Fem1DBuilder() : massDensity(0.0), youngModulus(0.0), poissonRatio(0.0), radius(0.0), shearingEnabled(true), initializeElements(false) { } std::shared_ptr build(const std::string& name) { size_t& nodes = nodesPerDimension[0]; SURGSIM_ASSERT(nodes > 0) << "Number of nodes incorrect: " << nodes; auto fem = std::make_shared(name); auto state = std::make_shared(); state->setNumDof(fem->getNumDofPerNode(), nodes); Vector3d delta = (extremities[1] - extremities[0]) / static_cast(nodes - 1); for (size_t nodeId = 0; nodeId < nodes; nodeId++) { state->getPositions().segment<3>(6 * nodeId) = extremities[0] + static_cast(nodeId) * delta; } for (auto boundaryCondition = std::begin(boundaryConditions); boundaryCondition != std::end(boundaryConditions); ++boundaryCondition) { state->addBoundaryCondition(boundaryCondition->first, boundaryCondition->second); } std::array nodeEnds; for (size_t nodeId = 0; nodeId < nodes - 1; nodeId++) { nodeEnds[0] = nodeId; nodeEnds[1] = nodeId + 1; auto element = std::make_shared(nodeEnds); element->setMassDensity(massDensity); element->setYoungModulus(youngModulus); element->setPoissonRatio(poissonRatio); element->setRadius(radius); element->setShearingEnabled(shearingEnabled); if (initializeElements) { element->initialize(*state); } fem->addFemElement(element); } fem->setInitialState(state); fem->doInitialize(); return fem; } void addBoundaryCondition(size_t node, size_t dof) { for (size_t i = 0; i < dof; i++) { boundaryConditions.push_back(std::make_pair(node, i)); } } public: std::array extremities; std::vector> boundaryConditions; // std::array nodesPerDimension; double massDensity; double youngModulus; double poissonRatio; double radius; bool shearingEnabled; bool initializeElements; }; class Fem1DMechanicalValidationTests : public ::testing::Test { public: std::shared_ptr m_fem; SurgSim::Math::RigidTransform3d m_initialPose; std::shared_ptr m_initialState; // Physical properties double m_rho; double m_nu; double m_E; // Geometric properties double m_radius; double m_L; double m_Iz; Vector m_expectedTransformedPositions; Vector m_expectedTransformedVelocities; Fem1DBuilder m_fem1DBuilder; protected: void SetUp() override { using SurgSim::Math::getSubVector; // Physical properties m_rho = 2000.0; m_nu = 0.45; m_E = 1e6; // Geometric properties m_radius = 0.05; m_L = 0.734511; m_Iz = M_PI / 4.0 * (m_radius * m_radius * m_radius * m_radius); // Initial Pose SurgSim::Math::Quaterniond q(1.9, 4.2, 9.3, 2.1); q.normalize(); Vector3d t(0.1, 0.2, 0.3); m_initialPose = SurgSim::Math::makeRigidTransform(q, t); // Define fem m_fem = std::make_shared("name"); // Initial state m_initialState = std::make_shared(); m_initialState->setNumDof(m_fem->getNumDofPerNode(), 2); Vector& x = m_initialState->getPositions(); x << 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, m_L, 0.0, 0.0, 0.0, 0.0, 0.0; Vector& v = m_initialState->getVelocities(); v << 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 2.0, 0.0, 0.0, 0.0, 0.0, 0.0; // Expected transformed values m_expectedTransformedPositions.resize(m_initialState->getNumDof()); m_expectedTransformedVelocities.resize(m_initialState->getNumDof()); getSubVector(m_expectedTransformedPositions, 0, 3) = m_initialPose * Vector3d(getSubVector(x, 0, 3)); getSubVector(m_expectedTransformedPositions, 1, 3) = getSubVector(x, 1, 3); getSubVector(m_expectedTransformedPositions, 2, 3) = m_initialPose * Vector3d(getSubVector(x, 2, 3)); getSubVector(m_expectedTransformedPositions, 3, 3) = getSubVector(x, 3, 3); getSubVector(m_expectedTransformedVelocities, 0, 3) = m_initialPose.linear() * getSubVector(v, 0, 3); getSubVector(m_expectedTransformedVelocities, 1, 3) = getSubVector(v, 1, 3); getSubVector(m_expectedTransformedVelocities, 2, 3) = m_initialPose.linear() * getSubVector(v, 2, 3); getSubVector(m_expectedTransformedVelocities, 3, 3) = getSubVector(v, 3, 3); // Create Fem1DElementBeam std::array nodeIds = {0, 1}; auto element = std::make_shared(nodeIds); element->setMassDensity(m_rho); element->setYoungModulus(m_E); element->setPoissonRatio(m_nu); element->setRadius(m_radius); // Add element to fem m_fem->addFemElement(element); // Setup m_fem1DBuilder m_fem1DBuilder.extremities[0] = Vector3d(0.0, 0.0, 0.0); m_fem1DBuilder.extremities[1] = Vector3d(m_L, 0.0, 0.0); m_fem1DBuilder.massDensity = m_rho; m_fem1DBuilder.youngModulus = m_E; m_fem1DBuilder.poissonRatio = m_nu; m_fem1DBuilder.radius = m_radius; m_fem1DBuilder.shearingEnabled = false; m_fem1DBuilder.initializeElements = true; } }; // Beam tests TEST_F(Fem1DMechanicalValidationTests, CantileverEndLoadedTest) { // Setup FEM size_t nodesPerDim = 2; m_fem1DBuilder.nodesPerDimension[0] = nodesPerDim; m_fem1DBuilder.addBoundaryCondition(0, 6); std::shared_ptr fem = m_fem1DBuilder.build("CantileverEndLoadedTest"); // For last node, apply load to y-direction and calculate deflection double load = 0.7; size_t applyIndex = (nodesPerDim - 1) * 6 + 1; Vector applyForce = Vector::Zero(nodesPerDim * 6); applyForce[applyIndex] = load; fem->updateFMDK(*(m_fem->getInitialState()), Math::ODEEQUATIONUPDATE_K); Matrix stiffness = fem->getK(); // Apply boundary conditions fem->getInitialState()->applyBoundaryConditionsToVector(&applyForce); fem->getInitialState()->applyBoundaryConditionsToMatrix(&stiffness); Vector calculatedDeflection = stiffness.inverse() * applyForce; // Compare theoretical deflection with calculated deflection size_t lookIndex = applyIndex; double deflection = load * (m_L * m_L * m_L) / (3.0 * m_E * m_Iz); EXPECT_NEAR(deflection, calculatedDeflection[lookIndex], 1e-8); } TEST_F(Fem1DMechanicalValidationTests, CantileverPunctualLoadAnywhereTest) { // Setup FEM size_t nodesPerDim = 10; m_fem1DBuilder.nodesPerDimension[0] = nodesPerDim; m_fem1DBuilder.addBoundaryCondition(0, 6); std::shared_ptr fem = m_fem1DBuilder.build("CantileverPunctualLoadAnywhereTest"); for (size_t applyNode = 1; applyNode < nodesPerDim; applyNode++) { // For each node, apply load to y-direction and calculate deflection double load = 0.7; size_t applyIndex = applyNode * 6 + 1; Vector applyForce = Vector::Zero(nodesPerDim * 6); applyForce[applyIndex] = load; fem->updateFMDK(*(m_fem->getInitialState()), Math::ODEEQUATIONUPDATE_K); Matrix stiffness = fem->getK(); // Apply boundary conditions fem->getInitialState()->applyBoundaryConditionsToVector(&applyForce); fem->getInitialState()->applyBoundaryConditionsToMatrix(&stiffness); Vector calculatedDeflection = stiffness.inverse() * applyForce; for (size_t lookNode = 0; lookNode < nodesPerDim; lookNode++) { // For each node, compare theoretical deflection with calculated deflection size_t lookIndex = lookNode * 6 + 1; double a = m_L * applyNode / (nodesPerDim - 1); double x = m_L * lookNode / (nodesPerDim - 1); double deflection = (x < a) ? load * x * x * (3 * a - x) / (6 * m_E * m_Iz) : load * a * a * (3 * x - a) / (6 * m_E * m_Iz); EXPECT_NEAR(deflection, calculatedDeflection[lookIndex], 1e-8); } } } TEST_F(Fem1DMechanicalValidationTests, CantileverEndBentTest) { // Setup FEM size_t nodesPerDim = 5; m_fem1DBuilder.nodesPerDimension[0] = nodesPerDim; m_fem1DBuilder.addBoundaryCondition(0, 6); std::shared_ptr fem = m_fem1DBuilder.build("CantileverEndBentTest"); // For last node, apply moment to z-rotational direction and calculate deflection double moment = 0.7; size_t applyIndex = (nodesPerDim - 1) * 6 + 5; Vector applyForce = Vector::Zero(nodesPerDim * 6); applyForce[applyIndex] = moment; fem->updateFMDK(*(m_fem->getInitialState()), Math::ODEEQUATIONUPDATE_K); Matrix stiffness = fem->getK(); // Apply boundary conditions fem->getInitialState()->applyBoundaryConditionsToVector(&applyForce); fem->getInitialState()->applyBoundaryConditionsToMatrix(&stiffness); Vector calculatedDeflection = stiffness.inverse() * applyForce; for (size_t lookNode = 0; lookNode < nodesPerDim; lookNode++) { // For each node, compare theoretical deflection with calculated deflection size_t lookIndex = lookNode * 6 + 1; double x = m_L * lookNode / (nodesPerDim - 1); double deflection = moment * x * x / (2 * m_E * m_Iz); EXPECT_NEAR(deflection, calculatedDeflection[lookIndex], 1e-8); } } TEST_F(Fem1DMechanicalValidationTests, EndSupportedBeamCenterLoadedTest) { // Setup FEM size_t nodesPerDim = 5; m_fem1DBuilder.nodesPerDimension[0] = nodesPerDim; m_fem1DBuilder.addBoundaryCondition(0, 3); m_fem1DBuilder.addBoundaryCondition(nodesPerDim - 1, 3); std::shared_ptr fem = m_fem1DBuilder.build("EndSupportedBeamCenterLoadedTest"); // For middle node, apply load to y-direction and calculate deflection double load = 0.7; size_t applyIndex = (nodesPerDim / 2) * 6 + 1; Vector applyForce = Vector::Zero(nodesPerDim * 6); applyForce[applyIndex] = load; fem->updateFMDK(*(m_fem->getInitialState()), Math::ODEEQUATIONUPDATE_K); Matrix stiffness = fem->getK(); // Apply boundary conditions fem->getInitialState()->applyBoundaryConditionsToVector(&applyForce); fem->getInitialState()->applyBoundaryConditionsToMatrix(&stiffness); Vector calculatedDeflection = stiffness.inverse() * applyForce; // Compare theoretical deflection with calculated deflection size_t lookIndex = applyIndex; double deflection = load * (m_L * m_L * m_L) / (48.0 * m_E * m_Iz); EXPECT_NEAR(deflection, calculatedDeflection[lookIndex], 1e-8); } TEST_F(Fem1DMechanicalValidationTests, EndSupportedBeamIntermediatelyLoadedTest) { // Setup FEM size_t nodesPerDim = 5; m_fem1DBuilder.nodesPerDimension[0] = nodesPerDim; m_fem1DBuilder.addBoundaryCondition(0, 3); m_fem1DBuilder.addBoundaryCondition(nodesPerDim - 1, 3); std::shared_ptr fem = m_fem1DBuilder.build("EndSupportedBeamIntermediatelyLoadedTest"); for (size_t node = 0; node < nodesPerDim; node++) { // For each node, apply load to y-direction and calculate deflection double load = 0.7; size_t applyIndex = node * 6 + 1; Vector applyForce = Vector::Zero(nodesPerDim * 6); applyForce[applyIndex] = load; fem->updateFMDK(*(m_fem->getInitialState()), Math::ODEEQUATIONUPDATE_K); Matrix stiffness = fem->getK(); // Apply boundary conditions fem->getInitialState()->applyBoundaryConditionsToVector(&applyForce); fem->getInitialState()->applyBoundaryConditionsToMatrix(&stiffness); Vector calculatedDeflection = stiffness.inverse() * applyForce; // Compare theoretical deflection with calculated deflection size_t lookIndex = applyIndex; double a = static_cast(node) / static_cast(nodesPerDim - 1) * m_L; double b = m_L - a; double deflection = load * b * a / (6 * m_L * m_E * m_Iz) * (m_L * m_L - a * a - b * b); EXPECT_NEAR(deflection, calculatedDeflection[lookIndex], 1e-8); } } } // namespace Physics } // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/UnitTests/Fem1DPlyReaderDelegateTests.cpp000066400000000000000000000062141277777236100267620ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Math/OdeState.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/Fem.h" #include "SurgSim/Physics/Fem1DPlyReaderDelegate.h" namespace SurgSim { namespace Physics { using SurgSim::Math::Vector3d; using SurgSim::DataStructures::PlyReader; TEST(Fem1DRepresentationReaderTests, DelegateTest) { auto fem = std::make_shared(); auto runtime = std::make_shared("config.txt"); fem->load("PlyReaderTests/Fem1D.ply"); // Vertices Vector3d vertex0(1.1, 1.2, -1.3); Vector3d vertex6(9.100000, 9.200000, 9.300000); EXPECT_TRUE(vertex0.isApprox(fem->getVertex(0).position)); EXPECT_TRUE(vertex6.isApprox(fem->getVertex(6).position)); // Number of beams ASSERT_EQ(4u, fem->getNumElements()); std::array beam0 = {0, 1}; std::array beam2 = {3, 5}; EXPECT_TRUE(std::equal(std::begin(beam0), std::end(beam0), std::begin(fem->getElement(0)->nodeIds))); EXPECT_TRUE(std::equal(std::begin(beam2), std::end(beam2), std::begin(fem->getElement(2)->nodeIds))); // Boundary conditions ASSERT_EQ(3u, fem->getBoundaryConditions().size()); EXPECT_EQ(2, fem->getBoundaryCondition(0)); EXPECT_EQ(4, fem->getBoundaryCondition(1)); EXPECT_EQ(5, fem->getBoundaryCondition(2)); // Material for (size_t i = 0; i < fem->getNumElements(); ++i) { auto element = fem->getElement(i); EXPECT_DOUBLE_EQ(0.21, element->massDensity); EXPECT_DOUBLE_EQ(0.31, element->poissonRatio); EXPECT_DOUBLE_EQ(0.41, element->youngModulus); } } TEST(Fem1DRepresentationReaderTests, PerElementMaterial) { auto fem = std::make_shared(); auto runtime = std::make_shared("config.txt"); fem->load("PlyReaderTests/Fem1DMaterial.ply"); // Material double value = 1.0; for (size_t i = 0; i < fem->getNumElements(); ++i) { auto element = fem->getElement(i); EXPECT_DOUBLE_EQ(value++, element->massDensity); EXPECT_DOUBLE_EQ(value++, element->poissonRatio); EXPECT_DOUBLE_EQ(value++, element->youngModulus); } } TEST(Fem1DRepresentationReaderTests, NoMaterials) { auto fem = std::make_shared(); auto runtime = std::make_shared("config.txt"); ASSERT_NO_THROW(fem->load("PlyReaderTests/Fem1DNoMaterial.ply")); for (auto element : fem->getElements()) { EXPECT_DOUBLE_EQ(0.0, element->massDensity); EXPECT_DOUBLE_EQ(0.0, element->poissonRatio); EXPECT_DOUBLE_EQ(0.0, element->youngModulus); } } }; // Physics }; // SurgSim opensurgsim-0.7.0/SurgSim/Physics/UnitTests/Fem1DRepresentationTests.cpp000066400000000000000000000442451277777236100264500ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file Fem1DRepresentationTests.cpp /// This file tests the functionalities of the class Fem1DRepresentation. #include #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/DeformableCollisionRepresentation.h" #include "SurgSim/Physics/Fem1DElementBeam.h" #include "SurgSim/Physics/Fem1DLocalization.h" #include "SurgSim/Physics/Fem1DRepresentation.h" #include "SurgSim/Physics/UnitTests/MockObjects.h" namespace SurgSim { namespace Physics { TEST(Fem1DRepresentationTests, ConstructorTest) { ASSERT_NO_THROW({std::shared_ptr fem = std::make_shared("Fem1D");}); } TEST(Fem1DRepresentationTests, GetNumDofPerNodeTest) { std::shared_ptr fem = std::make_shared("Fem1D"); EXPECT_EQ(6u, fem->getNumDofPerNode()); } TEST(Fem1DRepresentationTests, TransformInitialStateTest) { using SurgSim::Math::Vector; std::shared_ptr fem = std::make_shared("Fem1D"); const size_t numNodes = 2; const size_t numDofPerNode = fem->getNumDofPerNode(); const size_t numDof = numDofPerNode * numNodes; SurgSim::Math::RigidTransform3d initialPose; SurgSim::Math::Quaterniond q(1.0, 2.0, 3.0, 4.0); SurgSim::Math::Vector3d t(1.0, 2.0, 3.0); q.normalize(); initialPose = SurgSim::Math::makeRigidTransform(q, t); fem->setLocalPose(initialPose); std::shared_ptr initialState = std::make_shared(); initialState->setNumDof(numDofPerNode, numNodes); Vector x = Vector::LinSpaced(numDof, 1.0, static_cast(numDof)); Vector v = Vector::Ones(numDof); Vector a = Vector::Ones(numDof) * 2.0; initialState->getPositions() = x; initialState->getVelocities() = v; fem->setInitialState(initialState); Vector expectedX = x, expectedV = v, expectedA = a; for (size_t nodeId = 0; nodeId < numNodes; nodeId++) { expectedX.segment<3>(numDofPerNode * nodeId) = initialPose * x.segment<3>(numDofPerNode * nodeId); expectedV.segment<3>(numDofPerNode * nodeId) = initialPose.linear() * v.segment<3>(numDofPerNode * nodeId); expectedA.segment<3>(numDofPerNode * nodeId) = initialPose.linear() * a.segment<3>(numDofPerNode * nodeId); } // Initialize the component ASSERT_TRUE(fem->initialize(std::make_shared())); // Wake-up the component => apply the pose to the initial state ASSERT_TRUE(fem->wakeUp()); EXPECT_TRUE(fem->getInitialState()->getPositions().isApprox(expectedX)); EXPECT_TRUE(fem->getInitialState()->getVelocities().isApprox(expectedV)); } TEST(Fem1DRepresentationTests, DoWakeUpTest) { using SurgSim::Math::LinearSparseSolveAndInverse; using SurgSim::Math::LinearSparseSolveAndInverseLU; std::shared_ptr fem = std::make_shared("Fem1D"); std::shared_ptr initialState = std::make_shared(); initialState->setNumDof(fem->getNumDofPerNode(), 2); fem->setInitialState(initialState); // Initialize the component ASSERT_TRUE(fem->initialize(std::make_shared())); // Wake-up the component => create the proper ode solver with the specialized linear solver ASSERT_TRUE(fem->wakeUp()); // Test that the OdeSolver has the proper linear solver type EXPECT_NE(nullptr, fem->getOdeSolver()); std::shared_ptr linearSolver = fem->getOdeSolver()->getLinearSolver(); EXPECT_NE(nullptr, linearSolver); std::shared_ptr expectedLinearSolverType; expectedLinearSolverType = std::dynamic_pointer_cast(linearSolver); EXPECT_NE(nullptr, expectedLinearSolverType); } TEST(Fem1DRepresentationTests, ExternalForceAPITest) { std::shared_ptr fem = std::make_shared("Fem"); std::shared_ptr initialState = std::make_shared(); initialState->setNumDof(6, 3); // External force vector not initialized until the initial state has been set (it contains the #dof...) EXPECT_EQ(0, fem->getExternalGeneralizedForce().size()); EXPECT_EQ(0, fem->getExternalGeneralizedStiffness().rows()); EXPECT_EQ(0, fem->getExternalGeneralizedStiffness().cols()); EXPECT_EQ(0, fem->getExternalGeneralizedDamping().rows()); EXPECT_EQ(0, fem->getExternalGeneralizedDamping().cols()); fem->setInitialState(initialState); Math::SparseMatrix zeroMat(static_cast(fem->getNumDof()), static_cast(fem->getNumDof())); zeroMat.setZero(); // Vector initialized (properly sized and zeroed) EXPECT_NE(0, fem->getExternalGeneralizedForce().size()); EXPECT_NE(0, fem->getExternalGeneralizedStiffness().rows()); EXPECT_NE(0, fem->getExternalGeneralizedStiffness().cols()); EXPECT_NE(0, fem->getExternalGeneralizedDamping().rows()); EXPECT_NE(0, fem->getExternalGeneralizedDamping().cols()); EXPECT_EQ(fem->getNumDof(), fem->getExternalGeneralizedForce().size()); EXPECT_EQ(fem->getNumDof(), fem->getExternalGeneralizedStiffness().cols()); EXPECT_EQ(fem->getNumDof(), fem->getExternalGeneralizedStiffness().rows()); EXPECT_EQ(fem->getNumDof(), fem->getExternalGeneralizedDamping().cols()); EXPECT_EQ(fem->getNumDof(), fem->getExternalGeneralizedDamping().rows()); EXPECT_TRUE(fem->getExternalGeneralizedForce().isZero()); EXPECT_TRUE(fem->getExternalGeneralizedStiffness().isApprox(zeroMat)); EXPECT_TRUE(fem->getExternalGeneralizedDamping().isApprox(zeroMat)); std::array element1NodeIds = {{0, 1}}; auto element1 = std::make_shared(element1NodeIds); fem->addFemElement(element1); std::array element2NodeIds = {{1, 2}}; auto element2 = std::make_shared(element2NodeIds); fem->addFemElement(element2); SurgSim::DataStructures::IndexedLocalCoordinate femRepCoordinate; femRepCoordinate.index = 0; femRepCoordinate.coordinate = SurgSim::Math::Vector::Zero(2); femRepCoordinate.coordinate[0] = 1.0; auto localization = std::make_shared(fem, femRepCoordinate); auto wrongLocalizationType = std::make_shared(); Vector FLocalWrongSize = Vector::Ones(2 * fem->getNumDofPerNode()); Matrix KLocalWrongSize = Matrix::Ones(3 * fem->getNumDofPerNode(), 3 * fem->getNumDofPerNode()); Matrix DLocalWrongSize = Matrix::Ones(4 * fem->getNumDofPerNode(), 4 * fem->getNumDofPerNode()); Vector Flocal = Vector::LinSpaced(fem->getNumDofPerNode(), -3.12, 4.09); Matrix Klocal = Matrix::Ones(fem->getNumDofPerNode(), fem->getNumDofPerNode()) * 0.34; Matrix Dlocal = Klocal + Matrix::Identity(fem->getNumDofPerNode(), fem->getNumDofPerNode()); Vector F = Vector::Zero(fem->getNumDof()); F.segment(0, fem->getNumDofPerNode()) = Flocal; SparseMatrix K(static_cast(fem->getNumDof()), static_cast(fem->getNumDof())); K.setZero(); Math::addSubMatrix(Klocal, 0, 0, &K, true); K.makeCompressed(); SparseMatrix D(static_cast(fem->getNumDof()), static_cast(fem->getNumDof())); D.setZero(); Math::addSubMatrix(Dlocal, 0, 0, &D, true); D.makeCompressed(); // Test invalid localization nullptr ASSERT_THROW(fem->addExternalGeneralizedForce(nullptr, Flocal), SurgSim::Framework::AssertionFailure); ASSERT_THROW(fem->addExternalGeneralizedForce(nullptr, Flocal, Klocal, Dlocal), SurgSim::Framework::AssertionFailure); // Test invalid localization type ASSERT_THROW(fem->addExternalGeneralizedForce(wrongLocalizationType, Flocal), SurgSim::Framework::AssertionFailure); ASSERT_THROW(fem->addExternalGeneralizedForce(wrongLocalizationType, Flocal, Klocal, Dlocal), SurgSim::Framework::AssertionFailure); // Test invalid force size ASSERT_THROW(fem->addExternalGeneralizedForce(localization, FLocalWrongSize), SurgSim::Framework::AssertionFailure); ASSERT_THROW(fem->addExternalGeneralizedForce(localization, FLocalWrongSize, Klocal, Dlocal), SurgSim::Framework::AssertionFailure); // Test invalid stiffness size ASSERT_THROW(fem->addExternalGeneralizedForce(localization, Flocal, KLocalWrongSize, Dlocal), SurgSim::Framework::AssertionFailure); // Test invalid damping size ASSERT_THROW(fem->addExternalGeneralizedForce(localization, Flocal, Klocal, DLocalWrongSize), SurgSim::Framework::AssertionFailure); // Test valid call to addExternalGeneralizedForce fem->addExternalGeneralizedForce(localization, Flocal, Klocal, Dlocal); SparseMatrix zeroMatrix(K.rows(), K.cols()); zeroMatrix.setZero(); EXPECT_FALSE(fem->getExternalGeneralizedForce().isZero()); EXPECT_FALSE(fem->getExternalGeneralizedStiffness().isApprox(zeroMatrix)); EXPECT_FALSE(fem->getExternalGeneralizedDamping().isApprox(zeroMatrix)); EXPECT_TRUE(fem->getExternalGeneralizedForce().isApprox(F)); EXPECT_TRUE(fem->getExternalGeneralizedStiffness().isApprox(K)); EXPECT_TRUE(fem->getExternalGeneralizedDamping().isApprox(D)); // Test valid call to addExternalGeneralizedForce to add things up fem->addExternalGeneralizedForce(localization, Flocal, Klocal, Dlocal); EXPECT_TRUE(fem->getExternalGeneralizedForce().isApprox(2.0 * F)); EXPECT_TRUE(fem->getExternalGeneralizedStiffness().isApprox(2.0 * K)); EXPECT_TRUE(fem->getExternalGeneralizedDamping().isApprox(2.0 * D)); } TEST(Fem1DRepresentationTests, LoadMeshTest) { auto femRepresentation = std::make_shared("Representation"); auto runtime = std::make_shared("config.txt"); femRepresentation->loadFem("PlyReaderTests/Fem1D.ply"); ASSERT_TRUE(femRepresentation->initialize(runtime)); // Vertices ASSERT_EQ(6u, femRepresentation->getNumDofPerNode()); ASSERT_EQ(6u * 7u, femRepresentation->getNumDof()); Vector3d vertex0(1.1, 1.2, -1.3); Vector3d vertex6(9.100000, 9.200000, 9.300000); EXPECT_TRUE(vertex0.isApprox(femRepresentation->getInitialState()->getPosition(0))); EXPECT_TRUE(vertex6.isApprox(femRepresentation->getInitialState()->getPosition(6))); // Number of beams ASSERT_EQ(4u, femRepresentation->getNumFemElements()); std::array beam0 = {0, 1}; std::array beam2 = {3, 5}; EXPECT_TRUE(std::equal(std::begin(beam0), std::end(beam0), std::begin(femRepresentation->getFemElement(0)->getNodeIds()))); EXPECT_TRUE(std::equal(std::begin(beam2), std::end(beam2), std::begin(femRepresentation->getFemElement(2)->getNodeIds()))); // Boundary conditions ASSERT_EQ(3u * 6u, femRepresentation->getInitialState()->getNumBoundaryConditions()); // Boundary condition 0 is on node 8 size_t boundaryNode0 = 2; size_t boundaryNode2 = 5; EXPECT_EQ(6 * boundaryNode0, femRepresentation->getInitialState()->getBoundaryConditions().at(0)); EXPECT_EQ(6 * boundaryNode0 + 1, femRepresentation->getInitialState()->getBoundaryConditions().at(1)); EXPECT_EQ(6 * boundaryNode0 + 2, femRepresentation->getInitialState()->getBoundaryConditions().at(2)); EXPECT_EQ(6 * boundaryNode2, femRepresentation->getInitialState()->getBoundaryConditions().at(12)); EXPECT_EQ(6 * boundaryNode2 + 1, femRepresentation->getInitialState()->getBoundaryConditions().at(13)); EXPECT_EQ(6 * boundaryNode2 + 2, femRepresentation->getInitialState()->getBoundaryConditions().at(14)); // Material for (size_t i = 0; i < femRepresentation->getNumFemElements(); ++i) { auto fem = femRepresentation->getFemElement(i); EXPECT_DOUBLE_EQ(0.21, fem->getMassDensity()); EXPECT_DOUBLE_EQ(0.31, fem->getPoissonRatio()); EXPECT_DOUBLE_EQ(0.41, fem->getYoungModulus()); auto fem1DBeam = std::dynamic_pointer_cast(fem); ASSERT_NE(nullptr, fem1DBeam); EXPECT_DOUBLE_EQ(0.11, fem1DBeam->getRadius()); } } TEST(Fem1DRepresentationTests, CreateLocalizationTest) { auto fem = std::make_shared("Representation"); auto runtime = std::make_shared("config.txt"); ASSERT_NO_THROW(fem->loadFem("PlyReaderTests/Fem1D.ply")); ASSERT_NO_THROW(ASSERT_TRUE(fem->initialize(runtime))); // Localization on an invalid node { SCOPED_TRACE("Invalid node"); SurgSim::DataStructures::Location location(1000); std::shared_ptr localization; EXPECT_THROW(localization = std::dynamic_pointer_cast( fem->createLocalization(location)), SurgSim::Framework::AssertionFailure); } // Localization on a valid node { SCOPED_TRACE("Valid node"); SurgSim::DataStructures::Location location(0); std::shared_ptr localization; EXPECT_NO_THROW(localization = std::dynamic_pointer_cast(fem->createLocalization(location));); EXPECT_TRUE(localization != nullptr); EXPECT_TRUE(localization->getRepresentation() == fem); SurgSim::Math::Vector3d globalPosition; SurgSim::DataStructures::IndexedLocalCoordinate coordinate = localization->getLocalPosition(); EXPECT_NO_THROW(globalPosition = fem->getCurrentState()->getPosition(coordinate.index);); EXPECT_TRUE(globalPosition.isApprox(localization->calculatePosition())); } // In the 1d case, location of type triangle do not make sense and should raise an exception // Localization on invalid triangle (no triangle exist, so any triangle id would be invalid) { SCOPED_TRACE("Triangle => all invalid"); Vector barycentricCoordinate = Vector::Zero(3); barycentricCoordinate[0] = 1.0; SurgSim::DataStructures::IndexedLocalCoordinate coord(0, barycentricCoordinate); SurgSim::DataStructures::Location location(coord, SurgSim::DataStructures::Location::TRIANGLE); std::shared_ptr localization; EXPECT_THROW(localization = fem->createLocalization(location), SurgSim::Framework::AssertionFailure); } // Localization on an invalid element { SCOPED_TRACE("Invalid element index"); Vector barycentricCoordinate = Vector::Zero(2); barycentricCoordinate[0] = 1.0; SurgSim::DataStructures::IndexedLocalCoordinate coord(10000, barycentricCoordinate); SurgSim::DataStructures::Location location(coord, SurgSim::DataStructures::Location::ELEMENT); std::shared_ptr localization; EXPECT_THROW(localization = fem->createLocalization(location), SurgSim::Framework::AssertionFailure); } // Localization on an valid element but invalid barycentric coordinate size { SCOPED_TRACE("Invalid element barycentric coordinate size"); Vector barycentricCoordinate = Vector::Zero(3); barycentricCoordinate[0] = 1.0; SurgSim::DataStructures::IndexedLocalCoordinate coord(0, barycentricCoordinate); SurgSim::DataStructures::Location location(coord, SurgSim::DataStructures::Location::ELEMENT); std::shared_ptr localization; EXPECT_THROW(localization = fem->createLocalization(location), SurgSim::Framework::AssertionFailure); } // Localization on an valid element but invalid barycentric coordinate { SCOPED_TRACE("Invalid element barycentric coordinate"); Vector barycentricCoordinate = Vector::Zero(2); SurgSim::DataStructures::IndexedLocalCoordinate coord(0, barycentricCoordinate); SurgSim::DataStructures::Location location(coord, SurgSim::DataStructures::Location::ELEMENT); std::shared_ptr localization; EXPECT_THROW(localization = fem->createLocalization(location), SurgSim::Framework::AssertionFailure); } // Localization on a valid element { SCOPED_TRACE("Valid element"); Vector barycentricCoordinate = Vector::Zero(2); barycentricCoordinate.setConstant(1.0 / 2.0); SurgSim::DataStructures::IndexedLocalCoordinate coord(0, barycentricCoordinate); SurgSim::DataStructures::Location location(coord, SurgSim::DataStructures::Location::ELEMENT); std::shared_ptr localization; EXPECT_NO_THROW(localization = std::dynamic_pointer_cast(fem->createLocalization(location))); EXPECT_TRUE(localization != nullptr); EXPECT_TRUE(localization->getRepresentation() == fem); SurgSim::DataStructures::IndexedLocalCoordinate coordinate = localization->getLocalPosition(); auto element = fem->getFemElement(coordinate.index); SurgSim::Math::Vector3d globalPosition = 1.0 / 2.0 * fem->getCurrentState()->getPosition(element->getNodeId(0)) + 1.0 / 2.0 * fem->getCurrentState()->getPosition(element->getNodeId(1)); EXPECT_TRUE(globalPosition.isApprox(localization->calculatePosition())); } } TEST(Fem1DRepresentationTests, SerializationTest) { auto fem1DRepresentation = std::make_shared("Test-Fem1D"); auto runtime = std::make_shared("config.txt"); const std::string filename = "PlyReaderTests/Fem1D.ply"; fem1DRepresentation->loadFem(filename); auto collisionRepresentation = std::make_shared("Collision"); fem1DRepresentation->setCollisionRepresentation(collisionRepresentation); YAML::Node node; ASSERT_NO_THROW(node = YAML::convert::encode(*fem1DRepresentation)); EXPECT_TRUE(node.IsMap()); EXPECT_EQ(1u, node.size()); std::shared_ptr newRepresentation; ASSERT_NO_THROW(newRepresentation = std::dynamic_pointer_cast (node.as>())); ASSERT_NE(nullptr, newRepresentation); EXPECT_EQ("SurgSim::Physics::Fem1DRepresentation", newRepresentation->getClassName()); EXPECT_EQ(filename, newRepresentation->getFem()->getValue("FileName")); } } // namespace Physics } // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/UnitTests/Fem2DConstraintFixedPointTests.cpp000066400000000000000000000222411277777236100275550ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include #include "SurgSim/DataStructures/IndexedLocalCoordinate.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Math/MlcpConstraintType.h" #include "SurgSim/Math/OdeState.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/ConstraintData.h" #include "SurgSim/Physics/Representation.h" #include "SurgSim/Physics/Fem2DElementTriangle.h" #include "SurgSim/Physics/Fem2DLocalization.h" #include "SurgSim/Physics/Fem2DRepresentation.h" #include "SurgSim/Physics/FemConstraintFixedPoint.h" #include "SurgSim/Physics/UnitTests/EigenGtestAsserts.h" using SurgSim::Math::Vector3d; using SurgSim::Math::Vector4d; using SurgSim::Math::Vector6d; namespace { const double epsilon = 1e-10; const double dt = 1e-3; }; namespace SurgSim { namespace Physics { static std::shared_ptr getTriangle(size_t nodeId0, size_t nodeId1, size_t nodeId2, double thickness, double massDensity, double poissonRatio, double youngModulus) { std::array nodeIds = {{nodeId0, nodeId1, nodeId2}}; auto element = std::make_shared(nodeIds); element->setMassDensity(massDensity); element->setPoissonRatio(poissonRatio); element->setYoungModulus(youngModulus); element->setThickness(thickness); return element; } static std::shared_ptr getFem2d(const std::string &name, double thickness = 0.01, double massDensity = 1.0, double poissonRatio = 0.1, double youngModulus = 1.0) { auto fem = std::make_shared(name); auto state = std::make_shared(); state->setNumDof(6, 5); std::array p0 = {{0.11, 0.22, 0.33, 0.44, 0.55, 0.66}}; std::array p1 = {{0.12, -0.23, 0.34, -0.45, 0.56, -0.67}}; std::array p2 = {{-0.10, 0.21, -0.32, 0.43, -0.54, 0.65}}; std::array p3 = {{0.2, 0.2, 0.2, 0.2, 0.2, 0.2}}; std::array p4 = {{-0.1, 0.1, -0.2, 0.2, -0.3, 0.3}}; state->getPositions().segment<6>(0 * 6) = Vector6d(p0.data()); state->getPositions().segment<6>(1 * 6) = Vector6d(p1.data()); state->getPositions().segment<6>(2 * 6) = Vector6d(p2.data()); state->getPositions().segment<6>(3 * 6) = Vector6d(p3.data()); state->getPositions().segment<6>(4 * 6) = Vector6d(p4.data()); fem->addFemElement(getTriangle(0, 1, 2, thickness, massDensity, poissonRatio, youngModulus)); fem->addFemElement(getTriangle(1, 2, 3, thickness, massDensity, poissonRatio, youngModulus)); fem->addFemElement(getTriangle(2, 3, 4, thickness, massDensity, poissonRatio, youngModulus)); fem->setInitialState(state); fem->initialize(std::make_shared()); fem->wakeUp(); fem->setIsGravityEnabled(false); fem->beforeUpdate(dt); fem->update(dt); return fem; } TEST(Fem2DConstraintFixedPointTests, Constructor) { ASSERT_NO_THROW({ FemConstraintFixedPoint constraint; }); } TEST(Fem2DConstraintFixedPointTests, Constants) { FemConstraintFixedPoint constraint; EXPECT_EQ(SurgSim::Physics::FIXED_3DPOINT, constraint.getConstraintType()); EXPECT_EQ(3u, constraint.getNumDof()); } TEST(Fem2DConstraintFixedPointTests, BuildMlcpBasic) { // Whitebox test which validates ConstraintImplementation::build's output parameter, MlcpPhysicsProblem. It assumes // CHt and HCHt can be correctly built given H, so it does not necessarily construct the physical parameters // necessary to supply a realistic C. It only checks H and b. FemConstraintFixedPoint constraint; Vector3d actual; // Setup parameters for FemConstraintFixedPoint::build auto localization = std::make_shared(getFem2d("representation"), SurgSim::DataStructures::IndexedLocalCoordinate(1u, Vector3d(0.0, 0.0, 1.0))); actual = localization->calculatePosition(); MlcpPhysicsProblem mlcpPhysicsProblem = MlcpPhysicsProblem::Zero(30, 3, 1); ConstraintData emptyConstraint; ASSERT_NO_THROW(constraint.build( dt, emptyConstraint, localization, &mlcpPhysicsProblem, 0, 0, SurgSim::Physics::CONSTRAINT_POSITIVE_SIDE)); // Compare results Eigen::Matrix violation = actual; EXPECT_NEAR_EIGEN(violation, mlcpPhysicsProblem.b, epsilon); Eigen::Matrix H = Eigen::Matrix::Zero(); Eigen::Matrix identity = Eigen::Matrix::Identity(); SurgSim::Math::setSubMatrix(1.0 * dt * identity, 0, 6, 3, 3, &H); // This weight is on node 3 (triId 1, nodeId 2) EXPECT_NEAR_EIGEN(H, mlcpPhysicsProblem.H, epsilon); EXPECT_EQ(0u, mlcpPhysicsProblem.constraintTypes.size()); } TEST(Fem2DConstraintFixedPointTests, BuildMlcp) { // Whitebox test which validates ConstraintImplementation::build's output parameter, MlcpPhysicsProblem. It assumes // CHt and HCHt can be correctly built given H, so it does not necessarily construct the physical parameters // necessary to supply a realistic C. It only checks H and b. FemConstraintFixedPoint constraint; Vector3d actual; // Setup parameters for FemConstraintFixedPoint::build auto localization = std::make_shared(getFem2d("representation"), SurgSim::DataStructures::IndexedLocalCoordinate(1u, Vector3d(0.11, 0.02, 0.87))); actual = localization->calculatePosition(); MlcpPhysicsProblem mlcpPhysicsProblem = MlcpPhysicsProblem::Zero(30, 3, 1); ConstraintData emptyConstraint; ASSERT_NO_THROW(constraint.build( dt, emptyConstraint, localization, &mlcpPhysicsProblem, 0, 0, SurgSim::Physics::CONSTRAINT_POSITIVE_SIDE)); // Compare results Eigen::Matrix violation = actual; EXPECT_NEAR_EIGEN(violation, mlcpPhysicsProblem.b, epsilon); Eigen::Matrix H = Eigen::Matrix::Zero(); Eigen::Matrix identity = Eigen::Matrix::Identity(); SurgSim::Math::setSubMatrix(0.11 * dt * identity, 0, 2, 3, 3, &H); // This weight is on node 1 (triId 1, nodeId 0) SurgSim::Math::setSubMatrix(0.02 * dt * identity, 0, 4, 3, 3, &H); // This weight is on node 2 (triId 1, nodeId 1) SurgSim::Math::setSubMatrix(0.87 * dt * identity, 0, 6, 3, 3, &H); // This weight is on node 3 (triId 1, nodeId 2) EXPECT_NEAR_EIGEN(H, mlcpPhysicsProblem.H, epsilon); EXPECT_EQ(0u, mlcpPhysicsProblem.constraintTypes.size()); } TEST(Fem2DConstraintFixedPointTests, BuildMlcpTwoStep) { // Whitebox test which validates ConstraintImplementation::build's output parameter, MlcpPhysicsProblem. It assumes // CHt and HCHt can be correctly built given H, so it does not necessarily construct the physical parameters // necessary to supply a realistic C. It only checks H and b. FemConstraintFixedPoint constraint; Vector3d actual; Vector3d desired; // Setup parameters for FemConstraintFixedPoint::build MlcpPhysicsProblem mlcpPhysicsProblem = MlcpPhysicsProblem::Zero(30, 3, 1); ConstraintData emptyConstraint; auto localization = std::make_shared(getFem2d("representation"), SurgSim::DataStructures::IndexedLocalCoordinate(1u, Vector3d(0.11, 0.02, 0.87))); actual = localization->calculatePosition(); ASSERT_NO_THROW(constraint.build( dt, emptyConstraint, localization, &mlcpPhysicsProblem, 0, 0, SurgSim::Physics::CONSTRAINT_POSITIVE_SIDE)); localization->setLocalPosition( SurgSim::DataStructures::IndexedLocalCoordinate(2u, Vector3d(0.32, 0.5, 0.18))); desired = localization->calculatePosition(); ASSERT_NO_THROW(constraint.build( dt, emptyConstraint, localization, &mlcpPhysicsProblem, 0, 0, SurgSim::Physics::CONSTRAINT_NEGATIVE_SIDE)); // Compare results Eigen::Matrix violation = actual - desired; EXPECT_NEAR_EIGEN(violation, mlcpPhysicsProblem.b, epsilon); Eigen::Matrix H = Eigen::Matrix::Zero(); Eigen::Matrix identity = Eigen::Matrix::Identity(); SurgSim::Math::addSubMatrix( 0.11 * dt * identity, 0, 2, 3, 3, &H); // This weight is on node 1 (triId 1, nodeId 0) SurgSim::Math::addSubMatrix( 0.02 * dt * identity, 0, 4, 3, 3, &H); // This weight is on node 2 (triId 1, nodeId 1) SurgSim::Math::addSubMatrix( 0.87 * dt * identity, 0, 6, 3, 3, &H); // This weight is on node 3 (triId 1, nodeId 2) SurgSim::Math::addSubMatrix(-0.32 * dt * identity, 0, 4, 3, 3, &H); // This weight is on node 2 (triId 2, nodeId 0) SurgSim::Math::addSubMatrix(-0.50 * dt * identity, 0, 6, 3, 3, &H); // This weight is on node 3 (triId 2, nodeId 1) SurgSim::Math::addSubMatrix(-0.18 * dt * identity, 0, 8, 3, 3, &H); // This weight is on node 4 (triId 2, nodeId 2) EXPECT_NEAR_EIGEN(H, mlcpPhysicsProblem.H, epsilon); } }; // namespace Physics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/UnitTests/Fem2DConstraintFrictionalSlidingTests.cpp000066400000000000000000000264231277777236100311160ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Math/LinearSparseSolveAndInverse.h" #include "SurgSim/Math/OdeState.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/SparseMatrix.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/Fem2DElementTriangle.h" #include "SurgSim/Physics/Fem2DLocalization.h" #include "SurgSim/Physics/Fem2DRepresentation.h" #include "SurgSim/Physics/FemConstraintFrictionalSliding.h" #include "SurgSim/Physics/MlcpPhysicsProblem.h" #include "SurgSim/Physics/SlidingConstraintData.h" #include "SurgSim/Physics/UnitTests/EigenGtestAsserts.h" #include "SurgSim/Physics/UnitTests/MockObjects.h" using SurgSim::DataStructures::IndexedLocalCoordinate; using SurgSim::Framework::Runtime; using SurgSim::Physics::Fem2DRepresentation; using SurgSim::Physics::FemConstraintFrictionalSliding; using SurgSim::Physics::Fem2DLocalization; using SurgSim::Physics::Fem2DElementTriangle; using SurgSim::Physics::MlcpPhysicsProblem; using SurgSim::Physics::MockFem2DRepresentation; using SurgSim::Physics::SlidingConstraintData; using SurgSim::Math::Vector3d; namespace { const double epsilon = 1e-10; const double dt = 1e-3; }; static void addTriangle(Fem2DRepresentation* fem, size_t node0, size_t node1, size_t node2, double thickness = 0.01, double massDensity = 1.0, double poissonRatio = 0.1, double youngModulus = 1.0) { std::array nodes = {node0, node1, node2}; auto element = std::make_shared(nodes); element->setThickness(thickness); element->setMassDensity(massDensity); element->setPoissonRatio(poissonRatio); element->setYoungModulus(youngModulus); fem->addFemElement(element); } class Fem2DConstraintFrictionalSlidingTests : public ::testing::Test { public: void SetUp() { // Define plane with normal 'n' pointing against gravity. m_slidingDirection = Vector3d(0.8539, 0.6289, -0.9978); m_slidingDirection.normalize(); // Create mock FEM m_fem = std::make_shared("Fem2dRepresentation"); auto state = std::make_shared(); state->setNumDof(6, 5); state->getPositions().segment<3>(0 * 6) = Vector3d(0.30, -0.57, 0.40); state->getPositions().segment<3>(1 * 6) = Vector3d(0.06, 0.63, -0.32); state->getPositions().segment<3>(2 * 6) = Vector3d(-0.91, 0.72, 0.72); state->getPositions().segment<3>(3 * 6) = Vector3d(0.35, 0.52, 0.50); state->getPositions().segment<3>(4 * 6) = Vector3d(1.14, 0.66, 0.71); addTriangle(m_fem.get(), 0, 1, 2); addTriangle(m_fem.get(), 1, 2, 3); addTriangle(m_fem.get(), 2, 3, 4); m_fem->setInitialState(state); m_fem->setIntegrationScheme(SurgSim::Math::IntegrationScheme::INTEGRATIONSCHEME_EULER_EXPLICIT_MODIFIED); m_fem->setLocalActive(true); m_fem->initialize(std::make_shared()); m_fem->wakeUp(); // Update model by one timestep m_fem->beforeUpdate(dt); m_fem->update(dt); } void setSlidingConstraintAt(const IndexedLocalCoordinate& coord) { m_localization = std::make_shared(m_fem, coord); m_constraintData.setSlidingDirection(m_localization->calculatePosition(0.0), m_slidingDirection); } std::shared_ptr m_fem; std::shared_ptr m_localization; Vector3d m_slidingDirection; SlidingConstraintData m_constraintData; }; TEST_F(Fem2DConstraintFrictionalSlidingTests, ConstructorTest) { ASSERT_NO_THROW( { FemConstraintFrictionalSliding femContact; }); } TEST_F(Fem2DConstraintFrictionalSlidingTests, ConstraintConstantsTest) { auto implementation = std::make_shared(); EXPECT_EQ(SurgSim::Physics::FRICTIONAL_SLIDING, implementation->getConstraintType()); EXPECT_EQ(3u, implementation->getNumDof()); } TEST_F(Fem2DConstraintFrictionalSlidingTests, BuildMlcpTest) { // This test verifies the build mlcp function works for a simple case. auto implementation = std::make_shared(); // Initialize MLCP MlcpPhysicsProblem mlcpPhysicsProblem = MlcpPhysicsProblem::Zero(m_fem->getNumDof(), 3, 1); // Apply constraint purely to the first node of the 0th tetrahedron. IndexedLocalCoordinate coord(0, Vector3d(1.0, 0.0, 0.0)); setSlidingConstraintAt(coord); implementation->build(dt, m_constraintData, m_localization, &mlcpPhysicsProblem, 0, 0, SurgSim::Physics::CONSTRAINT_POSITIVE_SIDE); Eigen::Matrix H = Eigen::Matrix::Zero(); H.block<1, 3>(0, 0) = (dt * m_constraintData.getNormals()[0]).eval(); H.block<1, 3>(1, 0) = (dt * m_constraintData.getNormals()[1]).eval(); H.block<1, 3>(2, 0) = (dt * m_slidingDirection).eval(); EXPECT_NEAR_EIGEN(H, mlcpPhysicsProblem.H, epsilon); // C = dt * m^{-1} m_fem->updateFMDK(*(m_fem->getPreviousState()), SurgSim::Math::ODEEQUATIONUPDATE_M); Eigen::Matrix C = dt * m_fem->getM().toDense().inverse(); EXPECT_NEAR_EIGEN(C * H.transpose(), mlcpPhysicsProblem.CHt, epsilon); EXPECT_NEAR_EIGEN(H * C * H.transpose(), mlcpPhysicsProblem.A, epsilon); EXPECT_DOUBLE_EQ(0.5, mlcpPhysicsProblem.mu[0]); EXPECT_EQ(0u, mlcpPhysicsProblem.constraintTypes.size()); } TEST_F(Fem2DConstraintFrictionalSlidingTests, BuildMlcpCoordinateTest) { // This test verifies the build mlcp function works for a more complicated case with different nodes. auto implementation = std::make_shared(); // Initialize MLCP MlcpPhysicsProblem mlcpPhysicsProblem = MlcpPhysicsProblem::Zero(m_fem->getNumDof(), 3, 1); // Apply constraint to all nodes of an fem. const Vector3d barycentric = Vector3d(0.25, 0.33, 0.42); IndexedLocalCoordinate coord(0, barycentric); setSlidingConstraintAt(coord); implementation->build(dt, m_constraintData, m_localization, &mlcpPhysicsProblem, 0, 0, SurgSim::Physics::CONSTRAINT_POSITIVE_SIDE); Eigen::Matrix H = Eigen::Matrix::Zero(); H.block<1, 3>(0, 0) = (barycentric[0] * dt * m_constraintData.getNormals()[0]).eval(); H.block<1, 3>(1, 0) = (barycentric[0] * dt * m_constraintData.getNormals()[1]).eval(); H.block<1, 3>(2, 0) = (barycentric[0] * dt * m_slidingDirection).eval(); H.block<1, 3>(0, 6) = (barycentric[1] * dt * m_constraintData.getNormals()[0]).eval(); H.block<1, 3>(1, 6) = (barycentric[1] * dt * m_constraintData.getNormals()[1]).eval(); H.block<1, 3>(2, 6) = (barycentric[1] * dt * m_slidingDirection).eval(); H.block<1, 3>(0, 12) = (barycentric[2] * dt * m_constraintData.getNormals()[0]).eval(); H.block<1, 3>(1, 12) = (barycentric[2] * dt * m_constraintData.getNormals()[1]).eval(); H.block<1, 3>(2, 12) = (barycentric[2] * dt * m_slidingDirection).eval(); EXPECT_NEAR_EIGEN(H, mlcpPhysicsProblem.H, epsilon); // C = dt * m^{-1} m_fem->updateFMDK(*(m_fem->getPreviousState()), SurgSim::Math::ODEEQUATIONUPDATE_M); Eigen::Matrix C = dt * m_fem->getM().toDense().inverse(); EXPECT_NEAR_EIGEN(C * H.transpose(), mlcpPhysicsProblem.CHt, epsilon); EXPECT_NEAR_EIGEN(H * C * H.transpose(), mlcpPhysicsProblem.A, epsilon); EXPECT_DOUBLE_EQ(0.5, mlcpPhysicsProblem.mu[0]); EXPECT_EQ(0u, mlcpPhysicsProblem.constraintTypes.size()); } TEST_F(Fem2DConstraintFrictionalSlidingTests, BuildMlcpIndiciesTest) { // This test verifies the build mlcp function works given a hypothetical, preexisting mlcp problem. auto implementation = std::make_shared(); // Initialize MLCP MlcpPhysicsProblem mlcpPhysicsProblem = MlcpPhysicsProblem::Zero(m_fem->getNumDof() + 5, 4, 2); // Suppose 5 dof and 1 constraint are defined elsewhere. Then H, CHt, HCHt, and b are prebuilt. Eigen::SparseVector localH; localH.resize(5); localH.reserve(5); localH.insert(0) = 0.9478; localH.insert(1) = -0.3807; localH.insert(2) = 0.5536; localH.insert(3) = -0.6944; localH.insert(4) = 0.1815; mlcpPhysicsProblem.H.coeffRef(0, 0) += localH.coeff(0); mlcpPhysicsProblem.H.coeffRef(0, 1) += localH.coeff(1); mlcpPhysicsProblem.H.coeffRef(0, 2) += localH.coeff(2); mlcpPhysicsProblem.H.coeffRef(0, 3) += localH.coeff(3); mlcpPhysicsProblem.H.coeffRef(0, 4) += localH.coeff(4); Eigen::Matrix localC; localC << -0.2294, 0.5160, 0.2520, 0.5941, -0.4854, 0.1233, -0.4433, 0.3679, 0.9307, 0.2600, 0.1988, 0.6637, -0.7591, 0.1475, 0.8517, -0.5495, -0.4305, 0.3162, -0.7862, 0.7627, -0.5754, 0.4108, 0.8445, -0.5565, 0.7150; localC = localC * localC.transpose(); // force to be symmetric Eigen::Matrix localCHt = localC * localH.transpose(); mlcpPhysicsProblem.CHt.block<5, 1>(0, 0) = localCHt; mlcpPhysicsProblem.A.block<1, 1>(0, 0) = localH * localCHt; mlcpPhysicsProblem.b.block<1, 1>(0, 0)[0] = 0.6991; // Place the Fem at 5th dof (1 or multiple representations exist before, covering a total of 5 dof) // and the constraint at the index 1 (1 atomic constraint exists before this one) size_t indexOfRepresentation = 5; size_t indexOfConstraint = 1; // Apply constraint to all nodes of an fem. Vector3d barycentric = Vector3d(0.25, 0.33, 0.42); IndexedLocalCoordinate coord(0, barycentric); setSlidingConstraintAt(coord); implementation->build(dt, m_constraintData, m_localization, &mlcpPhysicsProblem, indexOfRepresentation, indexOfConstraint, SurgSim::Physics::CONSTRAINT_POSITIVE_SIDE); Eigen::Matrix H = Eigen::Matrix::Zero(); H.block<1, 3>(0, 0) = (barycentric[0] * dt * m_constraintData.getNormals()[0]).eval(); H.block<1, 3>(1, 0) = (barycentric[0] * dt * m_constraintData.getNormals()[1]).eval(); H.block<1, 3>(2, 0) = (barycentric[0] * dt * m_slidingDirection).eval(); H.block<1, 3>(0, 6) = (barycentric[1] * dt * m_constraintData.getNormals()[0]).eval(); H.block<1, 3>(1, 6) = (barycentric[1] * dt * m_constraintData.getNormals()[1]).eval(); H.block<1, 3>(2, 6) = (barycentric[1] * dt * m_slidingDirection).eval(); H.block<1, 3>(0, 12) = (barycentric[2] * dt * m_constraintData.getNormals()[0]).eval(); H.block<1, 3>(1, 12) = (barycentric[2] * dt * m_constraintData.getNormals()[1]).eval(); H.block<1, 3>(2, 12) = (barycentric[2] * dt * m_slidingDirection).eval(); EXPECT_NEAR_EIGEN(H, mlcpPhysicsProblem.H.block(indexOfConstraint, indexOfRepresentation, 3, 30), epsilon); m_fem->updateFMDK(*(m_fem->getPreviousState()), SurgSim::Math::ODEEQUATIONUPDATE_M); Eigen::Matrix C = dt * m_fem->getM().toDense().inverse(); EXPECT_NEAR_EIGEN( C * H.transpose(), mlcpPhysicsProblem.CHt.block(indexOfRepresentation, indexOfConstraint, 30, 3), epsilon); EXPECT_NEAR_EIGEN( H * C * H.transpose(), mlcpPhysicsProblem.A.block(indexOfConstraint, indexOfConstraint, 3, 3), epsilon); EXPECT_DOUBLE_EQ(0.5, mlcpPhysicsProblem.mu[1]); EXPECT_EQ(0u, mlcpPhysicsProblem.constraintTypes.size()); } opensurgsim-0.7.0/SurgSim/Physics/UnitTests/Fem2DConstraintFrictionlessContactTests.cpp000066400000000000000000000267561277777236100315030ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Math/LinearSparseSolveAndInverse.h" #include "SurgSim/Math/OdeState.h" #include "SurgSim/Math/SparseMatrix.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/ContactConstraintData.h" #include "SurgSim/Physics/Fem2DElementTriangle.h" #include "SurgSim/Physics/Fem2DLocalization.h" #include "SurgSim/Physics/Fem2DRepresentation.h" #include "SurgSim/Physics/FemConstraintFrictionlessContact.h" #include "SurgSim/Physics/MlcpPhysicsProblem.h" #include "SurgSim/Physics/UnitTests/EigenGtestAsserts.h" #include "SurgSim/Physics/UnitTests/MockObjects.h" using SurgSim::DataStructures::IndexedLocalCoordinate; using SurgSim::Framework::Runtime; using SurgSim::Physics::ContactConstraintData; using SurgSim::Physics::Fem2DRepresentation; using SurgSim::Physics::FemConstraintFrictionlessContact; using SurgSim::Physics::Fem2DLocalization; using SurgSim::Physics::Fem2DElementTriangle; using SurgSim::Physics::MlcpPhysicsProblem; using SurgSim::Physics::MockFem2DRepresentation; using SurgSim::Math::Vector3d; namespace { const double epsilon = 1e-10; const double dt = 1e-3; const double mlcpPrecision = 1e-04; }; static void addTriangle(Fem2DRepresentation* fem, size_t node0, size_t node1, size_t node2, double thickness = 0.01, double massDensity = 1.0, double poissonRatio = 0.1, double youngModulus = 1.0) { std::array nodes = {node0, node1, node2}; auto element = std::make_shared(nodes); element->setThickness(thickness); element->setMassDensity(massDensity); element->setPoissonRatio(poissonRatio); element->setYoungModulus(youngModulus); fem->addFemElement(element); } class Fem2DConstraintFrictionlessContactTests : public ::testing::Test { public: void SetUp() { // Define plane with normal 'n' pointing against gravity. m_n = Vector3d(0.8539, 0.6289, -0.9978); m_n.normalize(); // Create mock FEM m_fem = std::make_shared("Fem2dRepresentation"); auto state = std::make_shared(); state->setNumDof(6, 5); state->getPositions().segment<3>(0 * 6) = Vector3d(0.30, -0.57, 0.40); state->getPositions().segment<3>(1 * 6) = Vector3d(0.06, 0.63, -0.32); state->getPositions().segment<3>(2 * 6) = Vector3d(-0.91, 0.72, 0.72); state->getPositions().segment<3>(3 * 6) = Vector3d(0.35, 0.52, 0.50); state->getPositions().segment<3>(4 * 6) = Vector3d(1.14, 0.66, 0.71); addTriangle(m_fem.get(), 0, 1, 2); addTriangle(m_fem.get(), 1, 2, 3); addTriangle(m_fem.get(), 2, 3, 4); m_fem->setInitialState(state); m_fem->setIntegrationScheme(SurgSim::Math::IntegrationScheme::INTEGRATIONSCHEME_EULER_EXPLICIT_MODIFIED); m_fem->setLocalActive(true); m_fem->initialize(std::make_shared()); m_fem->wakeUp(); // Update model by one timestep m_fem->beforeUpdate(dt); m_fem->update(dt); } void setContactAt(const IndexedLocalCoordinate& coord) { m_localization = std::make_shared(m_fem, coord); // Calculate position at state before "m_fem->update(dt)" was called. double distance = -m_localization->calculatePosition(0.0).dot(m_n); m_constraintData.setPlaneEquation(m_n, distance); } Vector3d computeNewPosition(const IndexedLocalCoordinate& coord) const { // Solve the system M.a = f // The gravity force should be M.g, but we actually use a mass per node diagonal matrix Md // So the assumption that the violation should be oriented toward the gravity vector is false: // Ma = f = Mg => a = M^-1.f = M^-1.M.g = g // Instead, we have // Ma = f = Md.g => a = M^-1.f = M^-1.Md.g SurgSim::Math::Vector a = m_fem->getM().toDense().inverse() * m_fem->getF(); SurgSim::Math::Vector v = m_fem->getInitialState()->getVelocities() + a * dt; SurgSim::Math::Vector p = m_fem->getInitialState()->getPositions() + v * dt; Vector3d newPosition = Vector3d::Zero(); const auto& nodeIds = m_fem->getFemElement(coord.index)->getNodeIds(); for (size_t node = 0; node < 3; node++) { newPosition += p.segment<3>(6 * nodeIds[node]) * coord.coordinate[node]; } return newPosition; } std::shared_ptr m_fem; std::shared_ptr m_localization; Vector3d m_n; ContactConstraintData m_constraintData; }; TEST_F(Fem2DConstraintFrictionlessContactTests, ConstructorTest) { ASSERT_NO_THROW( { FemConstraintFrictionlessContact femContact; }); } TEST_F(Fem2DConstraintFrictionlessContactTests, ConstraintConstantsTest) { auto implementation = std::make_shared(); EXPECT_EQ(SurgSim::Physics::FRICTIONLESS_3DCONTACT, implementation->getConstraintType()); EXPECT_EQ(1u, implementation->getNumDof()); } TEST_F(Fem2DConstraintFrictionlessContactTests, BuildMlcpTest) { // This test verifies the build mlcp function works for a simple case. auto implementation = std::make_shared(); // Initialize MLCP MlcpPhysicsProblem mlcpPhysicsProblem = MlcpPhysicsProblem::Zero(m_fem->getNumDof(), 1, 1); // Apply constraint purely to the first node of the 0th tetrahedron. IndexedLocalCoordinate coord(0, Vector3d(1.0, 0.0, 0.0)); setContactAt(coord); implementation->build(dt, m_constraintData, m_localization, &mlcpPhysicsProblem, 0, 0, SurgSim::Physics::CONSTRAINT_POSITIVE_SIDE); const Vector3d newPosition = computeNewPosition(coord); EXPECT_NEAR(newPosition.dot(m_n), mlcpPhysicsProblem.b[0] + mlcpPrecision, epsilon); Eigen::Matrix H = Eigen::Matrix::Zero(); H.segment<3>(6 * 0) = dt * m_n; EXPECT_NEAR_EIGEN(H, mlcpPhysicsProblem.H, epsilon); // C = dt * m^{-1} m_fem->updateFMDK(*(m_fem->getPreviousState()), SurgSim::Math::ODEEQUATIONUPDATE_M); Eigen::Matrix C = dt * m_fem->getM().toDense().inverse(); EXPECT_NEAR_EIGEN(C * H.transpose(), mlcpPhysicsProblem.CHt, epsilon); EXPECT_NEAR_EIGEN(H * C * H.transpose(), mlcpPhysicsProblem.A, epsilon); EXPECT_EQ(0u, mlcpPhysicsProblem.constraintTypes.size()); } TEST_F(Fem2DConstraintFrictionlessContactTests, BuildMlcpCoordinateTest) { // This test verifies the build mlcp function works for a more complicated case with different nodes. auto implementation = std::make_shared(); // Initialize MLCP MlcpPhysicsProblem mlcpPhysicsProblem = MlcpPhysicsProblem::Zero(m_fem->getNumDof(), 1, 1); // Apply constraint to all nodes of an fem. const Vector3d barycentric = Vector3d(0.25, 0.33, 0.42); IndexedLocalCoordinate coord(1, barycentric); setContactAt(coord); implementation->build(dt, m_constraintData, m_localization, &mlcpPhysicsProblem, 0, 0, SurgSim::Physics::CONSTRAINT_POSITIVE_SIDE); const Vector3d newPosition = computeNewPosition(coord); EXPECT_NEAR(newPosition.dot(m_n), mlcpPhysicsProblem.b[0] + mlcpPrecision, epsilon); Eigen::Matrix H = Eigen::Matrix::Zero(); H.segment<3>(6 * 1) = 0.25 * dt * m_n; H.segment<3>(6 * 2) = 0.33 * dt * m_n; H.segment<3>(6 * 3) = 0.42 * dt * m_n; EXPECT_NEAR_EIGEN(H, mlcpPhysicsProblem.H, epsilon); // C = dt * m^{-1} SurgSim::Math::Matrix C; SurgSim::Math::SparseMatrix M(30, 30); m_fem->updateFMDK(*(m_fem->getPreviousState()), SurgSim::Math::ODEEQUATIONUPDATE_M); M = m_fem->getM(); SurgSim::Math::LinearSparseSolveAndInverseLU solver; SurgSim::Math::Vector b = SurgSim::Math::Vector::Zero(30); solver.setMatrix(M); C = solver.getInverse(); C *= dt; EXPECT_NEAR_EIGEN(C * H.transpose(), mlcpPhysicsProblem.CHt, epsilon); EXPECT_NEAR_EIGEN(H * C * H.transpose(), mlcpPhysicsProblem.A, epsilon); EXPECT_EQ(0u, mlcpPhysicsProblem.constraintTypes.size()); } TEST_F(Fem2DConstraintFrictionlessContactTests, BuildMlcpIndiciesTest) { // This test verifies the build mlcp function works given a hypothetical, preexisting mlcp problem. auto implementation = std::make_shared(); // Initialize MLCP MlcpPhysicsProblem mlcpPhysicsProblem = MlcpPhysicsProblem::Zero(m_fem->getNumDof() + 5, 2, 1); // Suppose 5 dof and 1 constraint are defined elsewhere. Then H, CHt, HCHt, and b are prebuilt. Eigen::SparseVector localH; localH.resize(5); localH.reserve(5); localH.insert(0) = 0.9478; localH.insert(1) = -0.3807; localH.insert(2) = 0.5536; localH.insert(3) = -0.6944; localH.insert(4) = 0.1815; mlcpPhysicsProblem.H.coeffRef(0, 0) += localH.coeff(0); mlcpPhysicsProblem.H.coeffRef(0, 1) += localH.coeff(1); mlcpPhysicsProblem.H.coeffRef(0, 2) += localH.coeff(2); mlcpPhysicsProblem.H.coeffRef(0, 3) += localH.coeff(3); mlcpPhysicsProblem.H.coeffRef(0, 4) += localH.coeff(4); Eigen::Matrix localC; localC << -0.2294, 0.5160, 0.2520, 0.5941, -0.4854, 0.1233, -0.4433, 0.3679, 0.9307, 0.2600, 0.1988, 0.6637, -0.7591, 0.1475, 0.8517, -0.5495, -0.4305, 0.3162, -0.7862, 0.7627, -0.5754, 0.4108, 0.8445, -0.5565, 0.7150; localC = localC * localC.transpose(); // force to be symmetric Eigen::Matrix localCHt = localC * localH.transpose(); mlcpPhysicsProblem.CHt.block<5, 1>(0, 0) = localCHt; mlcpPhysicsProblem.A.block<1, 1>(0, 0) = localH * localCHt; mlcpPhysicsProblem.b.block<1, 1>(0, 0)[0] = 0.6991; // Place the Fem at 5th dof (1 or multiple representations exist before, covering a total of 5 dof) // and the constraint at the index 1 (1 atomic constraint exists before this one) size_t indexOfRepresentation = 5; size_t indexOfConstraint = 1; // Apply constraint to all nodes of an fem. Vector3d barycentric = Vector3d(0.25, 0.33, 0.42); IndexedLocalCoordinate coord(1, barycentric); setContactAt(coord); implementation->build(dt, m_constraintData, m_localization, &mlcpPhysicsProblem, indexOfRepresentation, indexOfConstraint, SurgSim::Physics::CONSTRAINT_POSITIVE_SIDE); const Vector3d newPosition = computeNewPosition(coord); EXPECT_NEAR(newPosition.dot(m_n), mlcpPhysicsProblem.b[indexOfConstraint] + mlcpPrecision, epsilon); Eigen::Matrix H = Eigen::Matrix::Zero(); H.segment<3>(6 * 1) = 0.25 * dt * m_n; H.segment<3>(6 * 2) = 0.33 * dt * m_n; H.segment<3>(6 * 3) = 0.42 * dt * m_n; EXPECT_NEAR_EIGEN(H, mlcpPhysicsProblem.H.block(indexOfConstraint, indexOfRepresentation, 1, 30), epsilon); SurgSim::Math::Matrix C; SurgSim::Math::SparseMatrix M(30, 30); m_fem->updateFMDK(*m_fem->getPreviousState(), SurgSim::Math::ODEEQUATIONUPDATE_M); M = m_fem->getM(); SurgSim::Math::LinearSparseSolveAndInverseLU solver; SurgSim::Math::Vector b = SurgSim::Math::Vector::Zero(30); solver.setMatrix(M); C = solver.getInverse(); C *= dt; EXPECT_NEAR_EIGEN( C * H.transpose(), mlcpPhysicsProblem.CHt.block(indexOfRepresentation, indexOfConstraint, 30, 1), epsilon); EXPECT_NEAR_EIGEN( H * C * H.transpose(), mlcpPhysicsProblem.A.block(indexOfConstraint, indexOfConstraint, 1, 1), epsilon); EXPECT_EQ(0u, mlcpPhysicsProblem.constraintTypes.size()); } opensurgsim-0.7.0/SurgSim/Physics/UnitTests/Fem2DConstraintFrictionlessSlidingTests.cpp000066400000000000000000000271451277777236100314720ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Math/LinearSparseSolveAndInverse.h" #include "SurgSim/Math/OdeState.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/SparseMatrix.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/Fem2DElementTriangle.h" #include "SurgSim/Physics/Fem2DLocalization.h" #include "SurgSim/Physics/Fem2DRepresentation.h" #include "SurgSim/Physics/FemConstraintFrictionlessSliding.h" #include "SurgSim/Physics/MlcpPhysicsProblem.h" #include "SurgSim/Physics/SlidingConstraintData.h" #include "SurgSim/Physics/UnitTests/EigenGtestAsserts.h" #include "SurgSim/Physics/UnitTests/MockObjects.h" using SurgSim::DataStructures::IndexedLocalCoordinate; using SurgSim::Framework::Runtime; using SurgSim::Physics::Fem2DRepresentation; using SurgSim::Physics::FemConstraintFrictionlessSliding; using SurgSim::Physics::Fem2DLocalization; using SurgSim::Physics::Fem2DElementTriangle; using SurgSim::Physics::MlcpPhysicsProblem; using SurgSim::Physics::MockFem2DRepresentation; using SurgSim::Physics::SlidingConstraintData; using SurgSim::Math::Vector3d; namespace { const double epsilon = 1e-10; const double dt = 1e-3; }; static void addTriangle(Fem2DRepresentation* fem, size_t node0, size_t node1, size_t node2, double thickness = 0.01, double massDensity = 1.0, double poissonRatio = 0.1, double youngModulus = 1.0) { std::array nodes = {node0, node1, node2}; auto element = std::make_shared(nodes); element->setThickness(thickness); element->setMassDensity(massDensity); element->setPoissonRatio(poissonRatio); element->setYoungModulus(youngModulus); fem->addFemElement(element); } class Fem2DConstraintFrictionlessSlidingTests : public ::testing::Test { public: void SetUp() { // Define plane with normal 'n' pointing against gravity. m_slidingDirection = Vector3d(0.8539, 0.6289, -0.9978); m_slidingDirection.normalize(); // Create mock FEM m_fem = std::make_shared("Fem2dRepresentation"); auto state = std::make_shared(); state->setNumDof(6, 5); state->getPositions().segment<3>(0 * 6) = Vector3d(0.30, -0.57, 0.40); state->getPositions().segment<3>(1 * 6) = Vector3d(0.06, 0.63, -0.32); state->getPositions().segment<3>(2 * 6) = Vector3d(-0.91, 0.72, 0.72); state->getPositions().segment<3>(3 * 6) = Vector3d(0.35, 0.52, 0.50); state->getPositions().segment<3>(4 * 6) = Vector3d(1.14, 0.66, 0.71); addTriangle(m_fem.get(), 0, 1, 2); addTriangle(m_fem.get(), 1, 2, 3); addTriangle(m_fem.get(), 2, 3, 4); m_fem->setInitialState(state); m_fem->setIntegrationScheme(SurgSim::Math::IntegrationScheme::INTEGRATIONSCHEME_EULER_EXPLICIT_MODIFIED); m_fem->setLocalActive(true); m_fem->initialize(std::make_shared()); m_fem->wakeUp(); // Update model by one timestep m_fem->beforeUpdate(dt); m_fem->update(dt); } void setSlidingConstraintAt(const IndexedLocalCoordinate& coord) { m_localization = std::make_shared(m_fem, coord); m_constraintData.setSlidingDirection(m_localization->calculatePosition(0.0), m_slidingDirection); } std::shared_ptr m_fem; std::shared_ptr m_localization; Vector3d m_slidingDirection; SlidingConstraintData m_constraintData; }; TEST_F(Fem2DConstraintFrictionlessSlidingTests, ConstructorTest) { ASSERT_NO_THROW( { FemConstraintFrictionlessSliding femContact; }); } TEST_F(Fem2DConstraintFrictionlessSlidingTests, ConstraintConstantsTest) { auto implementation = std::make_shared(); EXPECT_EQ(SurgSim::Physics::FRICTIONLESS_SLIDING, implementation->getConstraintType()); EXPECT_EQ(2u, implementation->getNumDof()); } TEST_F(Fem2DConstraintFrictionlessSlidingTests, BuildMlcpTest) { // This test verifies the build mlcp function works for a simple case. auto implementation = std::make_shared(); // Initialize MLCP MlcpPhysicsProblem mlcpPhysicsProblem = MlcpPhysicsProblem::Zero(m_fem->getNumDof(), 2, 1); // Apply constraint purely to the first node of the 0th tetrahedron. IndexedLocalCoordinate coord(0, Vector3d(1.0, 0.0, 0.0)); setSlidingConstraintAt(coord); implementation->build(dt, m_constraintData, m_localization, &mlcpPhysicsProblem, 0, 0, SurgSim::Physics::CONSTRAINT_POSITIVE_SIDE); auto pose = m_constraintData.getPose().inverse().rotation(); EXPECT_TRUE((pose * m_slidingDirection).isApprox(Vector3d(1.0, 0.0, 0.0))); EXPECT_TRUE((pose * m_constraintData.getNormals()[0]).isApprox(Vector3d(0.0, 1.0, 0.0))); EXPECT_TRUE((pose * m_constraintData.getNormals()[1]).isApprox(Vector3d(0.0, 0.0, 1.0))); Eigen::Matrix H = Eigen::Matrix::Zero(); H.block<1, 3>(0, 0) = (dt * m_constraintData.getNormals()[0]).eval(); H.block<1, 3>(1, 0) = (dt * m_constraintData.getNormals()[1]).eval(); EXPECT_NEAR_EIGEN(H, mlcpPhysicsProblem.H, epsilon); // C = dt * m^{-1} m_fem->updateFMDK(*(m_fem->getPreviousState()), SurgSim::Math::ODEEQUATIONUPDATE_M); Eigen::Matrix C = dt * m_fem->getM().toDense().inverse(); EXPECT_NEAR_EIGEN(C * H.transpose(), mlcpPhysicsProblem.CHt, epsilon); EXPECT_NEAR_EIGEN(H * C * H.transpose(), mlcpPhysicsProblem.A, epsilon); EXPECT_EQ(0u, mlcpPhysicsProblem.constraintTypes.size()); } TEST_F(Fem2DConstraintFrictionlessSlidingTests, BuildMlcpCoordinateTest) { // This test verifies the build mlcp function works for a more complicated case with different nodes. auto implementation = std::make_shared(); // Initialize MLCP MlcpPhysicsProblem mlcpPhysicsProblem = MlcpPhysicsProblem::Zero(m_fem->getNumDof(), 2, 1); // Apply constraint to all nodes of an fem. const Vector3d barycentric = Vector3d(0.25, 0.33, 0.42); IndexedLocalCoordinate coord(0, barycentric); setSlidingConstraintAt(coord); implementation->build(dt, m_constraintData, m_localization, &mlcpPhysicsProblem, 0, 0, SurgSim::Physics::CONSTRAINT_POSITIVE_SIDE); auto pose = m_constraintData.getPose().inverse().rotation(); EXPECT_TRUE((pose * m_slidingDirection).isApprox(Vector3d(1.0, 0.0, 0.0))); EXPECT_TRUE((pose * m_constraintData.getNormals()[0]).isApprox(Vector3d(0.0, 1.0, 0.0))); EXPECT_TRUE((pose * m_constraintData.getNormals()[1]).isApprox(Vector3d(0.0, 0.0, 1.0))); Eigen::Matrix H = Eigen::Matrix::Zero(); H.block<1, 3>(0, 0) = (barycentric[0] * dt * m_constraintData.getNormals()[0]).eval(); H.block<1, 3>(1, 0) = (barycentric[0] * dt * m_constraintData.getNormals()[1]).eval(); H.block<1, 3>(0, 6) = (barycentric[1] * dt * m_constraintData.getNormals()[0]).eval(); H.block<1, 3>(1, 6) = (barycentric[1] * dt * m_constraintData.getNormals()[1]).eval(); H.block<1, 3>(0, 12) = (barycentric[2] * dt * m_constraintData.getNormals()[0]).eval(); H.block<1, 3>(1, 12) = (barycentric[2] * dt * m_constraintData.getNormals()[1]).eval(); EXPECT_NEAR_EIGEN(H, mlcpPhysicsProblem.H, epsilon); // C = dt * m^{-1} m_fem->updateFMDK(*(m_fem->getPreviousState()), SurgSim::Math::ODEEQUATIONUPDATE_M); Eigen::Matrix C = dt * m_fem->getM().toDense().inverse(); EXPECT_NEAR_EIGEN(C * H.transpose(), mlcpPhysicsProblem.CHt, epsilon); EXPECT_NEAR_EIGEN(H * C * H.transpose(), mlcpPhysicsProblem.A, epsilon); EXPECT_EQ(0u, mlcpPhysicsProblem.constraintTypes.size()); } TEST_F(Fem2DConstraintFrictionlessSlidingTests, BuildMlcpIndiciesTest) { // This test verifies the build mlcp function works given a hypothetical, preexisting mlcp problem. auto implementation = std::make_shared(); // Initialize MLCP MlcpPhysicsProblem mlcpPhysicsProblem = MlcpPhysicsProblem::Zero(m_fem->getNumDof() + 5, 3, 2); // Suppose 5 dof and 1 constraint are defined elsewhere. Then H, CHt, HCHt, and b are prebuilt. Eigen::SparseVector localH; localH.resize(5); localH.reserve(5); localH.insert(0) = 0.9478; localH.insert(1) = -0.3807; localH.insert(2) = 0.5536; localH.insert(3) = -0.6944; localH.insert(4) = 0.1815; mlcpPhysicsProblem.H.coeffRef(0, 0) += localH.coeff(0); mlcpPhysicsProblem.H.coeffRef(0, 1) += localH.coeff(1); mlcpPhysicsProblem.H.coeffRef(0, 2) += localH.coeff(2); mlcpPhysicsProblem.H.coeffRef(0, 3) += localH.coeff(3); mlcpPhysicsProblem.H.coeffRef(0, 4) += localH.coeff(4); Eigen::Matrix localC; localC << -0.2294, 0.5160, 0.2520, 0.5941, -0.4854, 0.1233, -0.4433, 0.3679, 0.9307, 0.2600, 0.1988, 0.6637, -0.7591, 0.1475, 0.8517, -0.5495, -0.4305, 0.3162, -0.7862, 0.7627, -0.5754, 0.4108, 0.8445, -0.5565, 0.7150; localC = localC * localC.transpose(); // force to be symmetric Eigen::Matrix localCHt = localC * localH.transpose(); mlcpPhysicsProblem.CHt.block<5, 1>(0, 0) = localCHt; mlcpPhysicsProblem.A.block<1, 1>(0, 0) = localH * localCHt; mlcpPhysicsProblem.b.block<1, 1>(0, 0)[0] = 0.6991; // Place the Fem at 5th dof (1 or multiple representations exist before, covering a total of 5 dof) // and the constraint at the index 1 (1 atomic constraint exists before this one) size_t indexOfRepresentation = 5; size_t indexOfConstraint = 1; // Apply constraint to all nodes of an fem. Vector3d barycentric = Vector3d(0.25, 0.33, 0.42); IndexedLocalCoordinate coord(0, barycentric); setSlidingConstraintAt(coord); implementation->build(dt, m_constraintData, m_localization, &mlcpPhysicsProblem, indexOfRepresentation, indexOfConstraint, SurgSim::Physics::CONSTRAINT_POSITIVE_SIDE); auto pose = m_constraintData.getPose().inverse().rotation(); EXPECT_TRUE((pose * m_slidingDirection).isApprox(Vector3d(1.0, 0.0, 0.0))); EXPECT_TRUE((pose * m_constraintData.getNormals()[0]).isApprox(Vector3d(0.0, 1.0, 0.0))); EXPECT_TRUE((pose * m_constraintData.getNormals()[1]).isApprox(Vector3d(0.0, 0.0, 1.0))); Eigen::Matrix H = Eigen::Matrix::Zero(); H.block<1, 3>(0, 0) = (barycentric[0] * dt * m_constraintData.getNormals()[0]).eval(); H.block<1, 3>(1, 0) = (barycentric[0] * dt * m_constraintData.getNormals()[1]).eval(); H.block<1, 3>(0, 6) = (barycentric[1] * dt * m_constraintData.getNormals()[0]).eval(); H.block<1, 3>(1, 6) = (barycentric[1] * dt * m_constraintData.getNormals()[1]).eval(); H.block<1, 3>(0, 12) = (barycentric[2] * dt * m_constraintData.getNormals()[0]).eval(); H.block<1, 3>(1, 12) = (barycentric[2] * dt * m_constraintData.getNormals()[1]).eval(); EXPECT_NEAR_EIGEN(H, mlcpPhysicsProblem.H.block(indexOfConstraint, indexOfRepresentation, 2, 30), epsilon); m_fem->updateFMDK(*(m_fem->getPreviousState()), SurgSim::Math::ODEEQUATIONUPDATE_M); Eigen::Matrix C = dt * m_fem->getM().toDense().inverse(); EXPECT_NEAR_EIGEN( C * H.transpose(), mlcpPhysicsProblem.CHt.block(indexOfRepresentation, indexOfConstraint, 30, 2), epsilon); EXPECT_NEAR_EIGEN( H * C * H.transpose(), mlcpPhysicsProblem.A.block(indexOfConstraint, indexOfConstraint, 2, 2), epsilon); EXPECT_EQ(0u, mlcpPhysicsProblem.constraintTypes.size()); } opensurgsim-0.7.0/SurgSim/Physics/UnitTests/Fem2DElementTriangleTests.cpp000066400000000000000000001557141277777236100265320ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include #include "SurgSim/Framework/Assert.h" #include "SurgSim/Math/GaussLegendreQuadrature.h" #include "SurgSim/Math/Matrix.h" #include "SurgSim/Math/OdeEquation.h" #include "SurgSim/Math/OdeState.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/Fem2DElementTriangle.h" using SurgSim::Math::gaussQuadrature2DTriangle6Points; using SurgSim::Math::gaussQuadrature2DTriangle12Points; using SurgSim::Math::clearMatrix; using SurgSim::Math::Matrix; using SurgSim::Math::Matrix33d; using SurgSim::Math::Quaterniond; using SurgSim::Math::SparseMatrix; using SurgSim::Math::Vector; using SurgSim::Math::Vector3d; using SurgSim::Physics::Fem2DElementTriangle; namespace { const double epsilon = 1e-8; }; class MockFem2DElement : public Fem2DElementTriangle { public: explicit MockFem2DElement(std::array nodeIds) : Fem2DElementTriangle(nodeIds) { } const Matrix33d& getInitialRotation() const { return m_initialRotation; } const Eigen::Matrix& getInitialRotationTimes6() { const Matrix33d& R0 = getInitialRotation(); m_initialRotationTimes6.setZero(); SurgSim::Math::setSubMatrix(R0, 0, 0, 3, 3, &m_initialRotationTimes6); SurgSim::Math::setSubMatrix(R0, 1, 1, 3, 3, &m_initialRotationTimes6); SurgSim::Math::setSubMatrix(R0, 2, 2, 3, 3, &m_initialRotationTimes6); SurgSim::Math::setSubMatrix(R0, 3, 3, 3, 3, &m_initialRotationTimes6); SurgSim::Math::setSubMatrix(R0, 4, 4, 3, 3, &m_initialRotationTimes6); SurgSim::Math::setSubMatrix(R0, 5, 5, 3, 3, &m_initialRotationTimes6); return m_initialRotationTimes6; } const double get_xij(size_t i) const { return m_xij[i]; } const double get_yij(size_t i) const { return m_yij[i]; } const Eigen::Matrix getBatozStrainDisplacement(double xi, double eta) const { return batozStrainDisplacement(xi, eta); } const Eigen::Matrix& getLocalStiffnessMatrix() const { return m_KLocal; } const SurgSim::Math::Matrix& getGlobalStiffnessMatrix() const { return m_K; } const Eigen::Matrix& getLocalMassMatrix() const { return m_MLocal; } const SurgSim::Math::Matrix& getGlobalMassMatrix() const { return m_M; } double getRestArea() const { return m_restArea; } const Eigen::Matrix& getInitialPosition() const { return m_x0; } /// Get the Membrane (in-plane) shape functions parameters /// \param i The ith shape function /// \param ai, bi, ci The ith shape function parameters /// \note fi(x,y) = ai + x.bi + y.ci void getMembraneShapeFunction(int i, double* ai, double* bi, double* ci) const { *ai = m_membraneShapeFunctionsParameters(i, 0); *bi = m_membraneShapeFunctionsParameters(i, 1); *ci = m_membraneShapeFunctionsParameters(i, 2); } // The Thin-Plate shape functions (Batoz shape functions) // N1(xi, eta) = 2(1-xi-eta)(0.5-xi-eta) double batozN1(double xi, double eta) const { return 2.0 * (1.0 - xi - eta) * (0.5 - xi - eta); } // N2(xi, eta) = xi(2 xi-1) double batozN2(double xi, double eta) const { return xi * (2.0 * xi - 1.0); } // N3(xi, eta) = eta(2 eta-1) double batozN3(double xi, double eta) const { return eta * (2.0 * eta - 1.0); } // N4(xi, eta) = 4 xi eta double batozN4(double xi, double eta) const { return 4.0 * xi * eta; } // N5(xi, eta) = 4 eta(1-xi-eta) double batozN5(double xi, double eta) const { return 4.0 * eta * (1.0 - xi - eta); } // N6(xi, eta) = 4 xi(1-xi-eta) double batozN6(double xi, double eta) const { return 4.0 * xi * (1.0 - xi - eta); } // dN1/dxi(xi, eta) = 2[(-0.5+xi+eta) + (-1+xi+eta)] = 2(-3/2+2(xi+eta)) = 4(xi+eta) - 3 double batozDN1Dxi(double xi, double eta) const { return 4.0 * (xi + eta) - 3.0; } // dN2/dxi(xi, eta) = (2xi-1) + 2xi = 4xi-1 double batozDN2Dxi(double xi, double eta) const { return 4.0 * xi - 1.0; } // dN3/dxi(xi, eta) = 0 double batozDN3Dxi(double xi, double eta) const { return 0.0; } // dN4/dxi(xi, eta) = 4 eta double batozDN4Dxi(double xi, double eta) const { return 4.0 * eta; } // dN5/dxi(xi,eta) = -4 eta double batozDN5Dxi(double xi, double eta) const { return -4.0 * eta; } // dN6/dxi(xi,eta) = 4(1-xi-eta) -4xi = 4(1-2xi-eta) double batozDN6Dxi(double xi, double eta) const { return 4.0 * (1.0 - 2.0 * xi - eta); } // dN1/deta(xi, eta) = 2[(-0.5+xi+eta) + (-1+xi+eta)] = 2(-3/2 + 2xi + 2eta) = 4(xi+eta) - 3 double batozDN1Deta(double xi, double eta) const { return 4.0 * (xi + eta) - 3.0; } // dN2/deta(xi, eta) = 0 double batozDN2Deta(double xi, double eta) const { return 0.0; } // dN3/deta(xi, eta) = 2eta-1 + 2eta = 4eta-1 double batozDN3Deta(double xi, double eta) const { return 4.0 * eta - 1.0; } // dN4/deta(xi, eta) = 4xi double batozDN4Deta(double xi, double eta) const { return 4.0 * xi; } // dN5/deta(xi, eta) = 4[(1-xi-eta) - eta] = 4(1-xi-2eta) double batozDN5Deta(double xi, double eta) const { return 4.0 * (1.0 - xi - 2.0 * eta); } // dN6/deta(xi, eta) = -4xi double batozDN6Deta(double xi, double eta) const { return -4.0 * xi; } std::array batozHx(double xi, double eta) const { std::array res; // 1.5 (a6N6-a5N5) res[0] = 1.5 * (m_ak[2] * batozN6(xi, eta) - m_ak[1] * batozN5(xi, eta)); // b5N5+b6N6 res[1] = m_bk[1] * batozN5(xi, eta) + m_bk[2] * batozN6(xi, eta); // N1 - c5N5 - c6N6 res[2] = batozN1(xi, eta) - m_ck[1] * batozN5(xi, eta) - m_ck[2] * batozN6(xi, eta); // 1.5 (a4N4-a6N6) res[3] = 1.5 * (m_ak[0] * batozN4(xi, eta) - m_ak[2] * batozN6(xi, eta)); // b6N6+b4N4 res[4] = m_bk[2] * batozN6(xi, eta) + m_bk[0] * batozN4(xi, eta); // N2 - c6N6 - c4N4 res[5] = batozN2(xi, eta) - m_ck[2] * batozN6(xi, eta) - m_ck[0] * batozN4(xi, eta); // 1.5 (a5N5-a4N4) res[6] = 1.5 * (m_ak[1] * batozN5(xi, eta) - m_ak[0] * batozN4(xi, eta)); // b4N4+b5N5 res[7] = m_bk[0] * batozN4(xi, eta) + m_bk[1] * batozN5(xi, eta); // N3 - c4N4 - c5N5 res[8] = batozN3(xi, eta) - m_ck[0] * batozN4(xi, eta) - m_ck[1] * batozN5(xi, eta); return res; } std::array batozDhxDxiAlternative(double xi, double eta) const { std::array res; // 1.5 (a6dN6-a5dN5) res[0] = 1.5 * (m_ak[2] * batozDN6Dxi(xi, eta) - m_ak[1] * batozDN5Dxi(xi, eta)); // b5dN5+b6dN6 res[1] = m_bk[1] * batozDN5Dxi(xi, eta) + m_bk[2] * batozDN6Dxi(xi, eta); // dN1 - c5dN5 - c6dN6 res[2] = batozDN1Dxi(xi, eta) - m_ck[1] * batozDN5Dxi(xi, eta) - m_ck[2] * batozDN6Dxi(xi, eta); // 1.5 (a4dN4-a6dN6) res[3] = 1.5 * (m_ak[0] * batozDN4Dxi(xi, eta) - m_ak[2] * batozDN6Dxi(xi, eta)); // b6dN6+b4dN4 res[4] = m_bk[2] * batozDN6Dxi(xi, eta) + m_bk[0] * batozDN4Dxi(xi, eta); // dN2 - c6dN6 - c4dN4 res[5] = batozDN2Dxi(xi, eta) - m_ck[2] * batozDN6Dxi(xi, eta) - m_ck[0] * batozDN4Dxi(xi, eta); // 1.5 (a5dN5-a4dN4) res[6] = 1.5 * (m_ak[1] * batozDN5Dxi(xi, eta) - m_ak[0] * batozDN4Dxi(xi, eta)); // b4dN4+b5dN5 res[7] = m_bk[0] * batozDN4Dxi(xi, eta) + m_bk[1] * batozDN5Dxi(xi, eta); // dN3 - c4dN4 - c5dN5 res[8] = batozDN3Dxi(xi, eta) - m_ck[0] * batozDN4Dxi(xi, eta) - m_ck[1] * batozDN5Dxi(xi, eta); return res; } std::array batozDhxDetaAlternative(double xi, double eta) const { std::array res; // 1.5 (a6dN6-a5dN5) res[0] = 1.5 * (m_ak[2] * batozDN6Deta(xi, eta) - m_ak[1] * batozDN5Deta(xi, eta)); // b5dN5+b6dN6 res[1] = m_bk[1] * batozDN5Deta(xi, eta) + m_bk[2] * batozDN6Deta(xi, eta); // dN1 - c5dN5 - c6dN6 res[2] = batozDN1Deta(xi, eta) - m_ck[1] * batozDN5Deta(xi, eta) - m_ck[2] * batozDN6Deta(xi, eta); // 1.5 (a4dN4-a6dN6) res[3] = 1.5 * (m_ak[0] * batozDN4Deta(xi, eta) - m_ak[2] * batozDN6Deta(xi, eta)); // b6dN6+b4dN4 res[4] = m_bk[2] * batozDN6Deta(xi, eta) + m_bk[0] * batozDN4Deta(xi, eta); // dN2 - c6dN6 - c4dN4 res[5] = batozDN2Deta(xi, eta) - m_ck[2] * batozDN6Deta(xi, eta) - m_ck[0] * batozDN4Deta(xi, eta); // 1.5 (a5dN5-a4dN4) res[6] = 1.5 * (m_ak[1] * batozDN5Deta(xi, eta) - m_ak[0] * batozDN4Deta(xi, eta)); // b4dN4+b5dN5 res[7] = m_bk[0] * batozDN4Deta(xi, eta) + m_bk[1] * batozDN5Deta(xi, eta); // dN3 - c4dN4 - c5dN5 res[8] = batozDN3Deta(xi, eta) - m_ck[0] * batozDN4Deta(xi, eta) - m_ck[1] * batozDN5Deta(xi, eta); return res; } std::array batozHy(double xi, double eta) const { std::array res; // 1.5 (d6N6-d5N5) res[0] = 1.5 * (m_dk[2] * batozN6(xi, eta) - m_dk[1] * batozN5(xi, eta)); // -N1 + e5N5 + e6N6 res[1] = -batozN1(xi, eta) + m_ek[1] * batozN5(xi, eta) + m_ek[2] * batozN6(xi, eta); // -b5N5-b6N6 res[2] = -m_bk[1] * batozN5(xi, eta) - m_bk[2] * batozN6(xi, eta); // 1.5 (d4N4-d6N6) res[3] = 1.5 * (m_dk[0] * batozN4(xi, eta) - m_dk[2] * batozN6(xi, eta)); // -N2 + e6N6 + e4N4 res[4] = -batozN2(xi, eta) + m_ek[2] * batozN6(xi, eta) + m_ek[0] * batozN4(xi, eta); // -b6N6-b4N4 res[5] = -m_bk[2] * batozN6(xi, eta) - m_bk[0] * batozN4(xi, eta); // 1.5 (d5N5-d4N4) res[6] = 1.5 * (m_dk[1] * batozN5(xi, eta) - m_dk[0] * batozN4(xi, eta)); // -N3 + e4N4 + e5N5 res[7] = -batozN3(xi, eta) + m_ek[0] * batozN4(xi, eta) + m_ek[1] * batozN5(xi, eta); // -b4N4-b5N5 res[8] = -m_bk[0] * batozN4(xi, eta) - m_bk[1] * batozN5(xi, eta); return res; } std::array batozDhyDxiAlternative(double xi, double eta) const { std::array res; // 1.5 (d6dN6-d5dN5) res[0] = 1.5 * (m_dk[2] * batozDN6Dxi(xi, eta) - m_dk[1] * batozDN5Dxi(xi, eta)); // -dN1 + e5dN5 + e6dN6 res[1] = -batozDN1Dxi(xi, eta) + m_ek[1] * batozDN5Dxi(xi, eta) + m_ek[2] * batozDN6Dxi(xi, eta); // -b5dN5-b6dN6 res[2] = -m_bk[1] * batozDN5Dxi(xi, eta) - m_bk[2] * batozDN6Dxi(xi, eta); // 1.5 (d4dN4-d6dN6) res[3] = 1.5 * (m_dk[0] * batozDN4Dxi(xi, eta) - m_dk[2] * batozDN6Dxi(xi, eta)); // -dN2 + e6dN6 + e4dN4 res[4] = -batozDN2Dxi(xi, eta) + m_ek[2] * batozDN6Dxi(xi, eta) + m_ek[0] * batozDN4Dxi(xi, eta); // -b6dN6-b4dN4 res[5] = -m_bk[2] * batozDN6Dxi(xi, eta) - m_bk[0] * batozDN4Dxi(xi, eta); // 1.5 (d5dN5-d4dN4) res[6] = 1.5 * (m_dk[1] * batozDN5Dxi(xi, eta) - m_dk[0] * batozDN4Dxi(xi, eta)); // -dN3 + e4dN4 + e5dN5 res[7] = -batozDN3Dxi(xi, eta) + m_ek[0] * batozDN4Dxi(xi, eta) + m_ek[1] * batozDN5Dxi(xi, eta); // -b4dN4-b5dN5 res[8] = -m_bk[0] * batozDN4Dxi(xi, eta) - m_bk[1] * batozDN5Dxi(xi, eta); return res; } std::array batozDhyDetaAlternative(double xi, double eta) const { std::array res; // 1.5 (d6dN6-d5dN5) res[0] = 1.5 * (m_dk[2] * batozDN6Deta(xi, eta) - m_dk[1] * batozDN5Deta(xi, eta)); // -dN1 + e5dN5 + e6dN6 res[1] = -batozDN1Deta(xi, eta) + m_ek[1] * batozDN5Deta(xi, eta) + m_ek[2] * batozDN6Deta(xi, eta); // -b5dN5-b6dN6 res[2] = -m_bk[1] * batozDN5Deta(xi, eta) - m_bk[2] * batozDN6Deta(xi, eta); // 1.5 (d4dN4-d6dN6) res[3] = 1.5 * (m_dk[0] * batozDN4Deta(xi, eta) - m_dk[2] * batozDN6Deta(xi, eta)); // -dN2 + e6dN6 + e4dN4 res[4] = -batozDN2Deta(xi, eta) + m_ek[2] * batozDN6Deta(xi, eta) + m_ek[0] * batozDN4Deta(xi, eta); // -b6dN6-b4dN4 res[5] = -m_bk[2] * batozDN6Deta(xi, eta) - m_bk[0] * batozDN4Deta(xi, eta); // -dN3 + e4dN4 + e5dN5 res[6] = 1.5 * (m_dk[1] * batozDN5Deta(xi, eta) - m_dk[0] * batozDN4Deta(xi, eta)); // -dN3 + e4dN4 + e5dN5 res[7] = -batozDN3Deta(xi, eta) + m_ek[0] * batozDN4Deta(xi, eta) + m_ek[1] * batozDN5Deta(xi, eta); // -b4dN4-b5dN5 res[8] = -m_bk[0] * batozDN4Deta(xi, eta) - m_bk[1] * batozDN5Deta(xi, eta); return res; } Eigen::Matrix batozStrainDisplacementAlternativeDerivative(double xi, double eta) const { Eigen::Matrix res; std::array dHx_dxi, dHx_deta, dHy_dxi, dHy_deta; double coefficient = 1.0 / (2.0 * m_restArea); dHx_dxi = batozDhxDxiAlternative(xi, eta); dHx_deta = batozDhxDetaAlternative(xi, eta); dHy_dxi = batozDhyDxiAlternative(xi, eta); dHy_deta = batozDhyDetaAlternative(xi, eta); for (size_t i = 0; i < 9; ++i) { // 4 -> mid-edge 12 // 5 -> mid-edge 20 // 6 -> mid-edge 01 res(0, i) = coefficient * (m_yij[1] * dHx_dxi[i] + m_yij[2] * dHx_deta[i]); res(1, i) = coefficient * (-m_xij[1] * dHy_dxi[i] - m_xij[2] * dHy_deta[i]); res(2, i) = coefficient * (-m_xij[1] * dHx_dxi[i] - m_xij[2] * dHx_deta[i] + m_yij[1] * dHy_dxi[i] + m_yij[2] * dHy_deta[i]); } return res; } std::array batozFx(double xi, double eta, double (MockFem2DElement::*f1)(double, double) const, double (MockFem2DElement::*f2)(double, double) const, double (MockFem2DElement::*f3)(double, double) const, double (MockFem2DElement::*f4)(double, double) const, double (MockFem2DElement::*f5)(double, double) const, double (MockFem2DElement::*f6)(double, double) const) const { std::array res; // 1.5 (a6N6-a5N5) res[0] = 1.5 * (m_ak[2] * (this->*f6)(xi, eta) - m_ak[1] * (this->*f5)(xi, eta)); // b5N5+b6N6 res[1] = m_bk[1] * (this->*f5)(xi, eta) + m_bk[2] * (this->*f6)(xi, eta); // N1 - c5N5 - c6N6 res[2] = (this->*f1)(xi, eta) - m_ck[1] * (this->*f5)(xi, eta) - m_ck[2] * (this->*f6)(xi, eta); // 1.5 (a4N4-a6N6) res[3] = 1.5 * (m_ak[0] * (this->*f4)(xi, eta) - m_ak[2] * (this->*f6)(xi, eta)); // b6N6+b4N4 res[4] = m_bk[2] * (this->*f6)(xi, eta) + m_bk[0] * (this->*f4)(xi, eta); // N2 - c6N6 - c4N4 res[5] = (this->*f2)(xi, eta) - m_ck[2] * (this->*f6)(xi, eta) - m_ck[0] * (this->*f4)(xi, eta); // 1.5 (a5N5-a4N4) res[6] = 1.5 * (m_ak[1] * (this->*f5)(xi, eta) - m_ak[0] * (this->*f4)(xi, eta)); // b4N4+b5N5 res[7] = m_bk[0] * (this->*f4)(xi, eta) + m_bk[1] * (this->*f5)(xi, eta); // N3 - c4N4 - c5N5 res[8] = (this->*f3)(xi, eta) - m_ck[0] * (this->*f4)(xi, eta) - m_ck[1] * (this->*f5)(xi, eta); return res; } std::array batozFy(double xi, double eta, double (MockFem2DElement::*f1)(double, double) const, double (MockFem2DElement::*f2)(double, double) const, double (MockFem2DElement::*f3)(double, double) const, double (MockFem2DElement::*f4)(double, double) const, double (MockFem2DElement::*f5)(double, double) const, double (MockFem2DElement::*f6)(double, double) const) const { std::array res; // 1.5 (d6N6-d5N5) res[0] = 1.5 * (m_dk[2] * (this->*f6)(xi, eta) - m_dk[1] * (this->*f5)(xi, eta)); // -N1 + e5N5 + e6N6 res[1] = -(this->*f1)(xi, eta) + m_ek[1] * (this->*f5)(xi, eta) + m_ek[2] * (this->*f6)(xi, eta); // -b5N5-b6N6 res[2] = -m_bk[1] * (this->*f5)(xi, eta) - m_bk[2] * (this->*f6)(xi, eta); // 1.5 (d4N4-d6N6) res[3] = 1.5 * (m_dk[0] * (this->*f4)(xi, eta) - m_dk[2] * (this->*f6)(xi, eta)); // -N2 + e6N6 + e4N4 res[4] = -(this->*f2)(xi, eta) + m_ek[2] * (this->*f6)(xi, eta) + m_ek[0] * (this->*f4)(xi, eta); // -b6N6-b4N4 res[5] = -m_bk[2] * (this->*f6)(xi, eta) - m_bk[0] * (this->*f4)(xi, eta); // 1.5 (d5N5-d4N4) res[6] = 1.5 * (m_dk[1] * (this->*f5)(xi, eta) - m_dk[0] * (this->*f4)(xi, eta)); // -N3 + e4N4 + e5N5 res[7] = -(this->*f3)(xi, eta) + m_ek[0] * (this->*f4)(xi, eta) + m_ek[1] * (this->*f5)(xi, eta); // -b4N4-b5N5 res[8] = -m_bk[0] * (this->*f4)(xi, eta) - m_bk[1] * (this->*f5)(xi, eta); return res; } Eigen::Matrix batozStrainDisplacementNumericalDerivation(double xi, double eta) const { Eigen::Matrix res; std::array dHx_dxi, dHx_deta, dHy_dxi, dHy_deta; double coefficient = 1.0 / (2.0 * m_restArea); dHx_dxi = batozFx(xi, eta, &MockFem2DElement::batozDN1Dxi , &MockFem2DElement::batozDN2Dxi , &MockFem2DElement::batozDN3Dxi , &MockFem2DElement::batozDN4Dxi , &MockFem2DElement::batozDN5Dxi , &MockFem2DElement::batozDN6Dxi); dHx_deta = batozFx(xi, eta, &MockFem2DElement::batozDN1Deta, &MockFem2DElement::batozDN2Deta, &MockFem2DElement::batozDN3Deta, &MockFem2DElement::batozDN4Deta, &MockFem2DElement::batozDN5Deta, &MockFem2DElement::batozDN6Deta); dHy_dxi = batozFy(xi, eta, &MockFem2DElement::batozDN1Dxi, &MockFem2DElement::batozDN2Dxi , &MockFem2DElement::batozDN3Dxi, &MockFem2DElement::batozDN4Dxi, &MockFem2DElement::batozDN5Dxi, &MockFem2DElement::batozDN6Dxi); dHy_deta = batozFy(xi, eta, &MockFem2DElement::batozDN1Deta, &MockFem2DElement::batozDN2Deta, &MockFem2DElement::batozDN3Deta, &MockFem2DElement::batozDN4Deta, &MockFem2DElement::batozDN5Deta, &MockFem2DElement::batozDN6Deta); for (size_t i = 0; i < 9; ++i) { // 4 -> mid-edge 12 // 5 -> mid-edge 20 // 6 -> mid-edge 01 res(0, i) = coefficient * (m_yij[1] * dHx_dxi[i] + m_yij[2] * dHx_deta[i]); res(1, i) = coefficient * (-m_xij[1] * dHy_dxi[i] - m_xij[2] * dHy_deta[i]); res(2, i) = coefficient * (-m_xij[1] * dHx_dxi[i] - m_xij[2] * dHx_deta[i] + m_yij[1] * dHy_dxi[i] + m_yij[2] * dHy_deta[i]); } return res; } private: Eigen::Matrix m_initialRotationTimes6; }; class Fem2DElementTriangleTests : public ::testing::Test { public: static const int m_numberNodes = 6; std::array m_nodeIds; SurgSim::Math::OdeState m_restState; double m_expectedVolume; double m_rho, m_E, m_nu; double m_A; // area double m_thickness; // thickness Quaterniond m_rotation, m_expectedRotation; Eigen::Matrix m_expectedX0; void SetUp() override { using SurgSim::Math::getSubVector; m_rho = 1000.0; m_E = 1e9; m_nu = 0.45; m_thickness = 1e-2; m_A = 1.0 / 2.0; m_expectedVolume = m_A * m_thickness; // Triangle is made of node 3, 1 and 5 in a bigger system containing m_numberNodes nodes (at least 6) m_nodeIds[0] = 3; m_nodeIds[1] = 1; m_nodeIds[2] = 5; m_restState.setNumDof(6, m_numberNodes); m_rotation.coeffs().setRandom(); m_rotation.normalize(); Vector3d A(0.0, 0.0, 0.0); Vector3d B(1.0, 0.0, 0.0); Vector3d C(0.0, 1.0, 0.0); Vector& x = m_restState.getPositions(); getSubVector(x, m_nodeIds[0], 6).segment<3>(0) = m_rotation._transformVector(A); getSubVector(x, m_nodeIds[1], 6).segment<3>(0) = m_rotation._transformVector(B); getSubVector(x, m_nodeIds[2], 6).segment<3>(0) = m_rotation._transformVector(C); for (size_t nodeId = 0; nodeId < 3; ++nodeId) { m_expectedX0.segment(6 * nodeId, 6) = getSubVector(x, m_nodeIds[nodeId], 6); } // The initial rotation of ABC is defined by (i=AB(1 0 0), j=AC(0 1 0), k=AB^AC(0 0 1)) = Identity // Therefore, by applying m_rotation to the triangle, the initial rotation of the element should be m_rotation m_expectedRotation = m_rotation; } // Useful method to numerically evaluate the 9x9 matrix d^T.d on a given point on the triangle Matrix evaluate_dTd_at(const MockFem2DElement& fem2DElement, double xi, double eta) { SurgSim::Math::Vector d(9); // column vector const double xi2 = xi * xi; const double xi3 = xi2 * xi; const double eta2 = eta * eta; const double eta3 = eta2 * eta; const double lambda = 1.0 - xi - eta; const double lambda2 = lambda * lambda; const double lambda3 = lambda2 * lambda; const double xiEtaLambda = xi * eta * lambda; const double N1 = 3.0 * lambda2 - 2.0 * lambda3 + 2.0 * xiEtaLambda; const double N2 = lambda2 * xi + xiEtaLambda / 2.0; const double N3 = lambda2 * eta + xiEtaLambda / 2.0; const double N4 = 3.0 * xi2 - 2.0 * xi3 + 2.0 * xiEtaLambda; const double N5 = xi2 * (xi - 1.0) - xiEtaLambda; const double N6 = xi2 * eta + xiEtaLambda / 2.0; const double N7 = 3.0 * eta2 - 2.0 * eta3 + 2.0 * xiEtaLambda; const double N8 = eta2 * xi + xiEtaLambda / 2.0; const double N9 = eta2 * (eta - 1.0) - xiEtaLambda; // x0 = y0 = y1 = 0.0 const double x1 = -fem2DElement.get_xij(2); // x0 - x1 = -x1 const double x2 = fem2DElement.get_xij(1); // x2 - x0 = x2 const double y2 = fem2DElement.get_yij(1); // y2 - y0 = y2 d << N1, N3* y2, -N2* x1 - N3* x2, N4, N6* y2, -N5* x1 - N6* x2, N7, N9* y2, -N8* x1 - N9* x2; return d * d.transpose(); } // Useful method to numerically evaluate the 9x9 matrix Hx.Hx^T on a given point on the triangle Matrix evaluate_HxHxT_at(const MockFem2DElement& fem2DElement, double xi, double eta) { auto Hx_array = fem2DElement.batozHx(xi, eta); SurgSim::Math::Vector Hx(9); // column vector Hx << Hx_array[0], Hx_array[1], Hx_array[2], Hx_array[3], Hx_array[4], Hx_array[5], Hx_array[6], Hx_array[7], Hx_array[8]; return Hx * Hx.transpose(); } // Useful method to numerically evaluate the 9x9 matrix Hy.Hy^T on a given point on the triangle Matrix evaluate_HyHyT_at(const MockFem2DElement& fem2DElement, double xi, double eta) { auto Hy_array = fem2DElement.batozHy(xi, eta); SurgSim::Math::Vector Hy(9); // column vector Hy << Hy_array[0], Hy_array[1], Hy_array[2], Hy_array[3], Hy_array[4], Hy_array[5], Hy_array[6], Hy_array[7], Hy_array[8]; return Hy * Hy.transpose(); } // Useful method to numerically evaluate the plate mass matrix of an element // This method uses a Gauss quadrature rules on the triangle to numerically evaluate the vaious integral terms. void numericallyEvaluatePlateMassMatrix(const MockFem2DElement& fem2DElement, Eigen::Ref mass) { // M = 2.A.rho.h \int_0^1 \int_0^{1-eta} d^T.d dxi deta // + 2.A.h^3/12.rho \int_0^1 \int_0^{1-eta} Hx.Hx^T dxi deta // + 2.A.h^3/12.rho \int_0^1 \int_0^{1-eta} Hy.Hy^T dxi deta const double A = fem2DElement.getRestArea(); const double rho = fem2DElement.getMassDensity(); const double h = fem2DElement.getThickness(); const double coefUz = 2.0 * A * rho * h; const double coefUtheta = coefUz * h * h / 12.0; // http://math2.uncc.edu/~shaodeng/TEACHING/math5172/Lectures/Lect_15.PDF // "Quadrature Formulas in Two Dimensions" // \int_0^1 \int_0^{1-eta} f(xi, eta) dxi deta = 1/2 sum_i w[i] f(xi[i], eta[i]) const double half = 1.0 / 2.0; // Note that matrix d contains monomial terms up to degree 3, // therefore dT.d contains monomial terms up to degree 6. // Exact integration of such functions over the triangle requires a Gauss-Legendre quadrature with 12 points: for (size_t pointId = 0; pointId < 12; ++pointId) { const double& weight = gaussQuadrature2DTriangle12Points[pointId].weight; const double& xi = gaussQuadrature2DTriangle12Points[pointId].coordinateXi; const double& eta = gaussQuadrature2DTriangle12Points[pointId].coordinateEta; mass += coefUz * (half * weight * evaluate_dTd_at(fem2DElement, xi, eta)); } // Note that Hx and Hy are of degree 2, therefore Hx.Hx^T and Hy.Hy^T are of degree 4. // Exact integration of such functions over the triangle requires a Gauss-Legendre quadrature with 6 points: for (size_t pointId = 0; pointId < 6; ++pointId) { const double& weight = gaussQuadrature2DTriangle6Points[pointId].weight; const double& xi = gaussQuadrature2DTriangle6Points[pointId].coordinateXi; const double& eta = gaussQuadrature2DTriangle6Points[pointId].coordinateEta; mass += coefUtheta * (half * weight * evaluate_HxHxT_at(fem2DElement, xi, eta)); mass += coefUtheta * (half * weight * evaluate_HyHyT_at(fem2DElement, xi, eta)); } } void getExpectedLocalMassMatrix(Eigen::Ref mass) { typedef Eigen::Matrix Matrix99Type; typedef Eigen::Matrix Matrix66Type; Matrix66Type membraneMass = getMembraneLocalMassMatrix(); Matrix99Type plateMass = getPlateLocalMassMatrix(); // Assemble the membrane and plane stiffness mass.setIdentity(); // The drilling dof will have an independent dof of mass 1kg. for (size_t row = 0; row < 3; ++row) { for (size_t column = 0; column < 3; ++column) { // Membrane part mass.block<2, 2>(6 * row, 6 * column) = membraneMass.block<2, 2>(2 * row, 2 * column); // Thin-plate part mass.block<3, 3>(6 * row + 2, 6 * column + 2) = plateMass.block<3, 3>(3 * row, 3 * column); } } } void getExpectedLocalStiffnessMatrix(Eigen::Ref stiffness) { typedef Eigen::Matrix Matrix99Type; typedef Eigen::Matrix Matrix66Type; Matrix66Type membraneStiffness = getMembraneLocalStiffnessMatrix(); Matrix99Type plateStiffness = getPlateLocalStiffnessMatrix(); // Assemble the membrane and plane stiffness stiffness.setIdentity(); for (size_t row = 0; row < 3; ++row) { for (size_t column = 0; column < 3; ++column) { // Membrane part stiffness.block<2, 2>(6 * row, 6 * column) = membraneStiffness.block<2, 2>(2 * row, 2 * column); // Thin-plate part stiffness.block<3, 3>(6 * row + 2, 6 * column + 2) = plateStiffness.block<3, 3>(3 * row, 3 * column); } } } Eigen::Matrix getMembraneLocalStiffnessMatrix() { typedef Eigen::Matrix Matrix36Type; std::shared_ptr element = getElement(); // Membrane theory (using "Theory of Matrix Structural Analysis" - Przemieniecki) // ux = c1.x + c2.y + c3 // uy = c4.x + c5.y + c6 // ux(x1, y1) = u1x = c1.x1 + c2.y1 + c3 (u1x) (x1 y1 1)(c1) // ux(x2, y2) = u2x = c1.x2 + c2.y2 + c3 <=> (u2x)=(x2 y2 1)(c2) // ux(x3, y3) = u3x = c1.x3 + c2.y3 + c3 (u3x) (x3 y3 1)(c3) // <=> (c1) = 1/det( y23 -y13 y12 )(u1x) // (c2) (-x23 x13 -x12 )(u2x) // (c3) ( x2y3-x3y2 -(x1y3-x3y1) x1y2-x2y1)(u3x) // det = (x1y2 + x2y3 + x3y1 - x3y2 - x2y1 - x1y3) // = x21(y3) - y21(x3) +x2(-y1) - y2(-x1) - x1(-y1) - (-y1)(-x1) = x21y31 - y21x31 = 2A > 0 // // and similarily for uy // <=> (c4) = 1/(2A)( y23 -y13 y12 )(u1y) // (c5) (-x23 x13 -x12 )(u2y) // (c6) ( x2y3-x3y2 -(x1y3-x3y1) x1y2-x2y1)(u3y) // // Therefore ux = 1/(2A) [x.(y23.u1x - y13.u2x + y12.u3x) + y.(-x23.u1x + x13.u2x - x12.u3x) + constant] // Exx = dux/dx = 1/(2A) (y23.u1x - y13.u2x + y12.u3x) = b.u // Therefore uy = 1/(2A) [x.(y23.u1y - y13.u2y + y12.u3y) + y.(-x23.u1y + x13.u2y - x12.u3y) + constant] // Eyy = duy/dy = 1/(2A) (-x23.u1y + x13.u2y - x12.u3y) = b.u // Exy = dux/dy + duy/dx = 1/(2A) (-x23.u1x + x13.u2x - x12.u3x + y23.u1y - y13.u2y + y12.u3y) = b.u Vector3d A2D = m_expectedRotation.inverse()._transformVector(m_expectedX0.segment(0, 3)); Vector3d B2D = m_expectedRotation.inverse()._transformVector(m_expectedX0.segment(6, 3)); Vector3d C2D = m_expectedRotation.inverse()._transformVector(m_expectedX0.segment(12, 3)); double x12 = A2D[0] - B2D[0]; double x13 = A2D[0] - C2D[0]; double x23 = B2D[0] - C2D[0]; double y12 = A2D[1] - B2D[1]; double y13 = A2D[1] - C2D[1]; double y23 = B2D[1] - C2D[1]; Matrix36Type b = Matrix36Type::Zero(); b(0, 0) = y23; b(0, 2) = -y13; b(0, 4) = y12; b(1, 1) = -x23; b(1, 3) = x13; b(1, 5) = -x12; b(2, 0) = -x23; b(2, 1) = y23; b(2, 2) = x13; b(2, 3) = -y13; b(2, 4) = -x12; b(2, 5) = y12; b *= 1.0 / (2.0 * m_A); Matrix33d Emembrane; Emembrane << 1.0, m_nu, 0.0, m_nu, 1.0, 0.0, 0.0, 0.0, (1.0 - m_nu) / 2.0; Emembrane *= m_E / (1.0 - m_nu * m_nu); return (m_thickness * m_A) * b.transpose() * Emembrane * b; } Eigen::Matrix getPlateLocalStiffnessMatrix() { typedef Eigen::Matrix Matrix39Type; Eigen::Matrix stiffness; std::shared_ptr element = getElement(); // Thin-plate theory (Batoz) Matrix39Type B0 = element->batozStrainDisplacementNumericalDerivation(0.5, 0.0); Matrix39Type B1 = element->batozStrainDisplacementNumericalDerivation(0.0, 0.5); Matrix39Type B2 = element->batozStrainDisplacementNumericalDerivation(0.5, 0.5); Matrix33d Eplate; Eplate << 1.0, m_nu, 0.0, m_nu, 1.0, 0.0, 0.0, 0.0, (1.0 - m_nu) / 2.0; Eplate *= m_E * m_thickness * m_thickness * m_thickness / (12.0 * (1.0 - m_nu * m_nu)); // Integration using 3 Gauss point on the mid-point of each triangle edge // weight = A/3 for all 3 (A is the area of the parametrized triangle = 0.5) stiffness = (1.0 / 6.0) * B0.transpose() * Eplate * B0; stiffness += (1.0 / 6.0) * B1.transpose() * Eplate * B1; stiffness += (1.0 / 6.0) * B2.transpose() * Eplate * B2; stiffness *= 2.0 * m_A; return stiffness; } Eigen::Matrix getMembraneLocalMassMatrix() { typedef Eigen::Matrix Matrix66Type; Matrix66Type membraneMassMatrix = Matrix66Type::Zero(); double m = m_rho * m_thickness * m_A; membraneMassMatrix.block<2, 2>(0, 0).diagonal().setConstant(m / 6.0); membraneMassMatrix.block<2, 2>(0, 2).diagonal().setConstant(m / 12.0); membraneMassMatrix.block<2, 2>(0, 4).diagonal().setConstant(m / 12.0); membraneMassMatrix.block<2, 2>(2, 0).diagonal().setConstant(m / 12.0); membraneMassMatrix.block<2, 2>(2, 2).diagonal().setConstant(m / 6.0); membraneMassMatrix.block<2, 2>(2, 4).diagonal().setConstant(m / 12.0); membraneMassMatrix.block<2, 2>(4, 0).diagonal().setConstant(m / 12.0); membraneMassMatrix.block<2, 2>(4, 2).diagonal().setConstant(m / 12.0); membraneMassMatrix.block<2, 2>(4, 4).diagonal().setConstant(m / 6.0); return membraneMassMatrix; } Eigen::Matrix getPlateLocalMassMatrix() { typedef Eigen::Matrix Matrix99Type; Matrix99Type plateMassMatrix = Matrix99Type::Zero(); std::shared_ptr element = getElement(); numericallyEvaluatePlateMassMatrix(*element, plateMassMatrix); return plateMassMatrix; } std::shared_ptr getElement() { auto element = std::make_shared(m_nodeIds); element->setThickness(m_thickness); element->setMassDensity(m_rho); element->setPoissonRatio(m_nu); element->setYoungModulus(m_E); element->initialize(m_restState); return element; } }; TEST_F(Fem2DElementTriangleTests, ConstructorTest) { ASSERT_NO_THROW({ MockFem2DElement triangle(m_nodeIds); }); } TEST_F(Fem2DElementTriangleTests, NodeIdsTest) { Fem2DElementTriangle element(m_nodeIds); EXPECT_EQ(3u, element.getNumNodes()); EXPECT_EQ(3u, element.getNodeIds().size()); for (int i = 0; i < 3; i++) { EXPECT_EQ(m_nodeIds[i], element.getNodeId(i)); EXPECT_EQ(m_nodeIds[i], element.getNodeIds()[i]); } } TEST_F(Fem2DElementTriangleTests, setGetThicknessTest) { Fem2DElementTriangle element(m_nodeIds); // Default thickness = 0.0 EXPECT_DOUBLE_EQ(0.0, element.getThickness()); // Set to a valid thickness element.setThickness(1.54); EXPECT_DOUBLE_EQ(1.54, element.getThickness()); // Set to an invalid thickness EXPECT_ANY_THROW(element.setThickness(0.0)); EXPECT_ANY_THROW(element.setThickness(-9.4)); } TEST_F(Fem2DElementTriangleTests, MaterialParameterTest) { Fem2DElementTriangle element(m_nodeIds); element.setThickness(m_thickness); // Test the various mode of failure related to the physical parameters // This has been already tested in FemElementTests, but this is to make sure this method is called properly // So the same behavior should be expected { // Mass density not set ASSERT_ANY_THROW(element.initialize(m_restState)); // Poisson Ratio not set element.setMassDensity(-1234.56); ASSERT_ANY_THROW(element.initialize(m_restState)); // Young modulus not set element.setPoissonRatio(0.55); ASSERT_ANY_THROW(element.initialize(m_restState)); // Invalid mass density element.setYoungModulus(-4321.33); ASSERT_ANY_THROW(element.initialize(m_restState)); // Invalid Poisson ratio element.setMassDensity(m_rho); ASSERT_ANY_THROW(element.initialize(m_restState)); // Invalid Young modulus element.setPoissonRatio(m_nu); ASSERT_ANY_THROW(element.initialize(m_restState)); element.setYoungModulus(m_E); ASSERT_NO_THROW(element.initialize(m_restState)); } } TEST_F(Fem2DElementTriangleTests, VolumeTest) { std::shared_ptr element = getElement(); EXPECT_NEAR(element->getVolume(m_restState), m_expectedVolume, 1e-10); } TEST_F(Fem2DElementTriangleTests, CoordinateTests) { Fem2DElementTriangle element(m_nodeIds); Vector validNaturalCoordinate(3); Vector validNaturalCoordinate2(3); Vector invalidNaturalCoordinateSumNot1(3); Vector invalidNaturalCoordinateNegativeValue(3); Vector invalidNaturalCoordinateBiggerThan1Value(3); Vector invalidNaturalCoordinateSize2(2), invalidNaturalCoordinateSize4(4); validNaturalCoordinate << 0.4, 0.5, 0.1; validNaturalCoordinate2 << -1e-11, 1.0 + 1e-11, 0.0; invalidNaturalCoordinateSumNot1 << 0.4, 0.5, 0.3; invalidNaturalCoordinateNegativeValue << 0.7, 0.7, -0.4; invalidNaturalCoordinateBiggerThan1Value << 1.4, 0.6, -1.0; invalidNaturalCoordinateSize2 << 0.4, 0.6; invalidNaturalCoordinateSize4 << 0.2, 0.2, 0.2, 0.4; EXPECT_TRUE(element.isValidCoordinate(validNaturalCoordinate)); EXPECT_TRUE(element.isValidCoordinate(validNaturalCoordinate2)); EXPECT_FALSE(element.isValidCoordinate(invalidNaturalCoordinateSumNot1)); EXPECT_FALSE(element.isValidCoordinate(invalidNaturalCoordinateNegativeValue)); EXPECT_FALSE(element.isValidCoordinate(invalidNaturalCoordinateBiggerThan1Value)); EXPECT_FALSE(element.isValidCoordinate(invalidNaturalCoordinateSize2)); EXPECT_FALSE(element.isValidCoordinate(invalidNaturalCoordinateSize4)); Vector naturalCoordinateA(3), naturalCoordinateB(3), naturalCoordinateC(3), naturalCoordinateMiddle(3); Vector ptA, ptB, ptC, ptMiddle; naturalCoordinateA << 1.0, 0.0, 0.0; naturalCoordinateB << 0.0, 1.0, 0.0; naturalCoordinateC << 0.0, 0.0, 1.0; naturalCoordinateMiddle << 1.0 / 3.0, 1.0 / 3.0, 1.0 / 3.0; EXPECT_THROW(ptA = element.computeCartesianCoordinate(m_restState, invalidNaturalCoordinateBiggerThan1Value), \ SurgSim::Framework::AssertionFailure); EXPECT_THROW(ptA = element.computeCartesianCoordinate(m_restState, invalidNaturalCoordinateNegativeValue), \ SurgSim::Framework::AssertionFailure); EXPECT_THROW(ptA = element.computeCartesianCoordinate(m_restState, invalidNaturalCoordinateSize2), \ SurgSim::Framework::AssertionFailure); EXPECT_THROW(ptA = element.computeCartesianCoordinate(m_restState, invalidNaturalCoordinateSize4), \ SurgSim::Framework::AssertionFailure); EXPECT_THROW(ptA = element.computeCartesianCoordinate(m_restState, invalidNaturalCoordinateSumNot1), \ SurgSim::Framework::AssertionFailure); EXPECT_NO_THROW(ptA = element.computeCartesianCoordinate(m_restState, naturalCoordinateA)); EXPECT_NO_THROW(ptB = element.computeCartesianCoordinate(m_restState, naturalCoordinateB)); EXPECT_NO_THROW(ptC = element.computeCartesianCoordinate(m_restState, naturalCoordinateC)); EXPECT_NO_THROW(ptMiddle = element.computeCartesianCoordinate(m_restState, naturalCoordinateMiddle)); EXPECT_TRUE(ptA.isApprox(m_rotation._transformVector(Vector3d(0.0, 0.0, 0.0)))); EXPECT_TRUE(ptB.isApprox(m_rotation._transformVector(Vector3d(1.0, 0.0, 0.0)))); EXPECT_TRUE(ptC.isApprox(m_rotation._transformVector(Vector3d(0.0, 1.0, 0.0)))); EXPECT_TRUE(ptMiddle.isApprox(m_rotation._transformVector(Vector3d(1.0 / 3.0, 1.0 / 3.0, 0.0)))); Vector3d cartesian = m_rotation._transformVector(Vector3d(0.0, 0.0, 0.0)); EXPECT_THROW(element.computeNaturalCoordinate(m_restState, cartesian), SurgSim::Framework::AssertionFailure); } TEST_F(Fem2DElementTriangleTests, RestAreaTest) { std::shared_ptr element = getElement(); EXPECT_NEAR(element->getRestArea(), m_A, 1e-10); } TEST_F(Fem2DElementTriangleTests, InitialRotationTest) { std::shared_ptr element = getElement(); // Use a mask to test the structure of the rotation matrix R0 (6 digonal block 3x3 matrix and 0 elsewhere) Eigen::Matrix mask; mask.setOnes(); mask.block<3, 3>(0, 0).setZero(); mask.block<3, 3>(3, 3).setZero(); mask.block<3, 3>(6, 6).setZero(); mask.block<3, 3>(9, 9).setZero(); mask.block<3, 3>(12, 12).setZero(); mask.block<3, 3>(15, 15).setZero(); EXPECT_TRUE(element->getInitialRotationTimes6().cwiseProduct(mask).isZero()); EXPECT_TRUE(element->getInitialRotationTimes6().block(0, 0, 3, 3).isApprox(m_expectedRotation.matrix())); EXPECT_TRUE(element->getInitialRotationTimes6().block(3, 3, 3, 3).isApprox(m_expectedRotation.matrix())); EXPECT_TRUE(element->getInitialRotationTimes6().block(6, 6, 3, 3).isApprox(m_expectedRotation.matrix())); EXPECT_TRUE(element->getInitialRotationTimes6().block(9, 9, 3, 3).isApprox(m_expectedRotation.matrix())); EXPECT_TRUE(element->getInitialRotationTimes6().block(12, 12, 3, 3).isApprox(m_expectedRotation.matrix())); EXPECT_TRUE(element->getInitialRotationTimes6().block(15, 15, 3, 3).isApprox(m_expectedRotation.matrix())); } TEST_F(Fem2DElementTriangleTests, StrainDisplacementPlateAtGaussPointTest) { std::shared_ptr element = getElement(); Eigen::Matrix strainDisplacement[3]; strainDisplacement[0] = element->getBatozStrainDisplacement(0.0, 0.5); strainDisplacement[1] = element->getBatozStrainDisplacement(0.5, 0.0); strainDisplacement[2] = element->getBatozStrainDisplacement(0.5, 0.5); Eigen::Matrix strainDisplacementExpected1[3]; strainDisplacementExpected1[0] = element->batozStrainDisplacementAlternativeDerivative(0.0, 0.5); strainDisplacementExpected1[1] = element->batozStrainDisplacementAlternativeDerivative(0.5, 0.0); strainDisplacementExpected1[2] = element->batozStrainDisplacementAlternativeDerivative(0.5, 0.5); Eigen::Matrix strainDisplacementExpected2[3]; strainDisplacementExpected2[0] = element->batozStrainDisplacementNumericalDerivation(0.0, 0.5); strainDisplacementExpected2[1] = element->batozStrainDisplacementNumericalDerivation(0.5, 0.0); strainDisplacementExpected2[2] = element->batozStrainDisplacementNumericalDerivation(0.5, 0.5); // Validate the alternative technique against the numerical evaluation EXPECT_TRUE(strainDisplacementExpected1[0].isApprox(strainDisplacementExpected2[0])) << strainDisplacementExpected1[0] << std::endl << strainDisplacementExpected2[0] << std::endl; EXPECT_TRUE(strainDisplacementExpected1[1].isApprox(strainDisplacementExpected2[1])) << strainDisplacementExpected1[1] << std::endl << strainDisplacementExpected2[1] << std::endl; EXPECT_TRUE(strainDisplacementExpected1[2].isApprox(strainDisplacementExpected2[2])) << strainDisplacementExpected1[2] << std::endl << strainDisplacementExpected2[2] << std::endl; // Validate the Fem2DElementTriangle internal calculation against both technique EXPECT_TRUE(strainDisplacement[0].isApprox(strainDisplacementExpected1[0])) << strainDisplacement[0] << std::endl << strainDisplacementExpected1[0] << std::endl; EXPECT_TRUE(strainDisplacement[0].isApprox(strainDisplacementExpected2[0])) << strainDisplacement[0] << std::endl << strainDisplacementExpected2[0] << std::endl; EXPECT_TRUE(strainDisplacement[1].isApprox(strainDisplacementExpected1[1])) << strainDisplacement[1] << std::endl << strainDisplacementExpected1[1] << std::endl; EXPECT_TRUE(strainDisplacement[1].isApprox(strainDisplacementExpected2[1])) << strainDisplacement[1] << std::endl << strainDisplacementExpected2[1] << std::endl; EXPECT_TRUE(strainDisplacement[2].isApprox(strainDisplacementExpected1[2])) << strainDisplacement[2] << std::endl << strainDisplacementExpected1[2] << std::endl; EXPECT_TRUE(strainDisplacement[2].isApprox(strainDisplacementExpected2[2])) << strainDisplacement[2] << std::endl << strainDisplacementExpected2[2] << std::endl; } namespace { /// Shape function evaluation Ni(x,y) = ai + bi.x + ci.y /// \param i Defines which shape function to evaluate /// \param ai, bi, ci The shape functions parameters /// \param p The 2D point (x, y) to evaluate the shape function at /// \return The shape function evaluation ai + bi.x + ci.y double N(size_t i, const std::array& ai, const std::array& bi, const std::array& ci, const SurgSim::Math::Vector2d& p) { return ai[i] + bi[i] * p[0] + ci[i] * p[1]; } }; TEST_F(Fem2DElementTriangleTests, MembraneShapeFunctionsTest) { using SurgSim::Math::getSubVector; std::shared_ptr tri = getElement(); EXPECT_TRUE(tri->getInitialPosition().isApprox(m_expectedX0)) << "x0 = " << tri->getInitialPosition().transpose() << std::endl << "x0 expected = " << m_expectedX0.transpose(); // Ni(x,y) = (ai + bi.x + ci.y) std::array ai, bi, ci; for (int i = 0; i < 3; ++i) { tri->getMembraneShapeFunction(i, &(ai[i]), &(bi[i]), &(ci[i])); } // We should (in local frame) have by construction: // { N0(p0) = 1 N1(p0)=N2(p0)=N3(p0)=0 // { N1(p1) = 1 N1(p1)=N2(p1)=N3(p1)=0 // { N2(p2) = 1 N1(p2)=N2(p2)=N3(p2)=0 // { N3(p3) = 1 N1(p3)=N2(p3)=N3(p3)=0 const Vector3d p0 = getSubVector(m_expectedX0, 0, 6).segment(0, 3); const Vector3d p1 = getSubVector(m_expectedX0, 1, 6).segment(0, 3); const Vector3d p2 = getSubVector(m_expectedX0, 2, 6).segment(0, 3); SurgSim::Math::Vector2d p02D = m_expectedRotation.inverse()._transformVector(p0).segment(0, 2); SurgSim::Math::Vector2d p12D = m_expectedRotation.inverse()._transformVector(p1).segment(0, 2); SurgSim::Math::Vector2d p22D = m_expectedRotation.inverse()._transformVector(p2).segment(0, 2); std::array Ni_p0, Ni_p1, Ni_p2; for (int i = 0; i < 3; i++) { Ni_p0[i] = N(i, ai, bi, ci, p02D); Ni_p1[i] = N(i, ai, bi, ci, p12D); Ni_p2[i] = N(i, ai, bi, ci, p22D); } EXPECT_NEAR(Ni_p0[0], 1.0, 1e-12); EXPECT_NEAR(Ni_p0[1], 0.0, 1e-12); EXPECT_NEAR(Ni_p0[2], 0.0, 1e-12); EXPECT_NEAR(Ni_p1[0], 0.0, 1e-12); EXPECT_NEAR(Ni_p1[1], 1.0, 1e-12); EXPECT_NEAR(Ni_p1[2], 0.0, 1e-12); EXPECT_NEAR(Ni_p2[0], 0.0, 1e-12); EXPECT_NEAR(Ni_p2[1], 0.0, 1e-12); EXPECT_NEAR(Ni_p2[2], 1.0, 1e-12); // We should have the relation sum(Ni(x,y) = 1) for all points in the triangle // We verify that relation by sampling the tetrahedron volume for (double sp0p1 = 0; sp0p1 <= 1.0; sp0p1 += 0.1) { for (double sp0p2 = 0; sp0p1 + sp0p2 <= 1.0; sp0p2 += 0.1) { Vector3d p = p0 + sp0p1 * (p1 - p0) + sp0p2 * (p2 - p0); SurgSim::Math::Vector2d p2D = m_expectedRotation.inverse()._transformVector(p).segment(0, 2); std::array Ni_p; for (size_t i = 0; i < 3; ++i) { Ni_p[i] = N(i, ai, bi, ci, p2D); } EXPECT_NEAR(Ni_p[0] + Ni_p[1] + Ni_p[2], 1.0, 1e-10) << " for sp0p1 = " << sp0p1 << ", sp0p2 = " << sp0p2 << std::endl << " N0(x,y,z) = " << Ni_p[0] << " N1(x,y,z) = " << Ni_p[1] << " N2(x,y,z) = " << Ni_p[2]; } } } TEST_F(Fem2DElementTriangleTests, PlateShapeFunctionsTest) { std::shared_ptr tri = getElement(); // Shape function N1 weigth point 0 (parametric coordinate 0 0) EXPECT_DOUBLE_EQ(1.0, tri->batozN1(0.0, 0.0)); EXPECT_DOUBLE_EQ(0.0, tri->batozN1(1.0, 0.0)); EXPECT_DOUBLE_EQ(0.0, tri->batozN1(0.0, 1.0)); EXPECT_DOUBLE_EQ(0.0, tri->batozN1(0.5, 0.5)); EXPECT_DOUBLE_EQ(0.0, tri->batozN1(0.0, 0.5)); EXPECT_DOUBLE_EQ(0.0, tri->batozN1(0.5, 0.0)); // Shape function N2 weigth point 1 (parametric coordinate 1 0) EXPECT_DOUBLE_EQ(0.0, tri->batozN2(0.0, 0.0)); EXPECT_DOUBLE_EQ(1.0, tri->batozN2(1.0, 0.0)); EXPECT_DOUBLE_EQ(0.0, tri->batozN2(0.0, 1.0)); EXPECT_DOUBLE_EQ(0.0, tri->batozN2(0.5, 0.5)); EXPECT_DOUBLE_EQ(0.0, tri->batozN2(0.0, 0.5)); EXPECT_DOUBLE_EQ(0.0, tri->batozN2(0.5, 0.0)); // Shape function N3 weigth point 2 (parametric coordinate 0 1) EXPECT_DOUBLE_EQ(0.0, tri->batozN3(0.0, 0.0)); EXPECT_DOUBLE_EQ(0.0, tri->batozN3(1.0, 0.0)); EXPECT_DOUBLE_EQ(1.0, tri->batozN3(0.0, 1.0)); EXPECT_DOUBLE_EQ(0.0, tri->batozN3(0.5, 0.5)); EXPECT_DOUBLE_EQ(0.0, tri->batozN3(0.0, 0.5)); EXPECT_DOUBLE_EQ(0.0, tri->batozN3(0.5, 0.0)); // Shape function N4 weigth point 4 (mid-point 12) (parametric coordinate 0.5 0.5) EXPECT_DOUBLE_EQ(0.0, tri->batozN4(0.0, 0.0)); EXPECT_DOUBLE_EQ(0.0, tri->batozN4(1.0, 0.0)); EXPECT_DOUBLE_EQ(0.0, tri->batozN4(0.0, 1.0)); EXPECT_DOUBLE_EQ(1.0, tri->batozN4(0.5, 0.5)); EXPECT_DOUBLE_EQ(0.0, tri->batozN4(0.0, 0.5)); EXPECT_DOUBLE_EQ(0.0, tri->batozN4(0.5, 0.0)); // Shape function N5 weigth point 5 (mid-point 20) (parametric coordinate 0.0 0.5) EXPECT_DOUBLE_EQ(0.0, tri->batozN5(0.0, 0.0)); EXPECT_DOUBLE_EQ(0.0, tri->batozN5(1.0, 0.0)); EXPECT_DOUBLE_EQ(0.0, tri->batozN5(0.0, 1.0)); EXPECT_DOUBLE_EQ(0.0, tri->batozN5(0.5, 0.5)); EXPECT_DOUBLE_EQ(1.0, tri->batozN5(0.0, 0.5)); EXPECT_DOUBLE_EQ(0.0, tri->batozN5(0.5, 0.0)); // Shape function N6 weigth point 6 (mid-point 01) (parametric coordinate 0.5 0.0) EXPECT_DOUBLE_EQ(0.0, tri->batozN6(0.0, 0.0)); EXPECT_DOUBLE_EQ(0.0, tri->batozN6(1.0, 0.0)); EXPECT_DOUBLE_EQ(0.0, tri->batozN6(0.0, 1.0)); EXPECT_DOUBLE_EQ(0.0, tri->batozN6(0.5, 0.5)); EXPECT_DOUBLE_EQ(0.0, tri->batozN6(0.0, 0.5)); EXPECT_DOUBLE_EQ(1.0, tri->batozN6(0.5, 0.0)); // We should have the relation sum(Ni(xi, eta) = 1) for all points in the triangle for (double xi = 0.0; xi <= 1.0; xi += 0.1) { for (double eta = 0.0; xi + eta <= 1.0; eta += 0.1) { EXPECT_DOUBLE_EQ(1.0, tri->batozN1(xi, eta) + tri->batozN2(xi, eta) + tri->batozN3(xi, eta) + \ tri->batozN4(xi, eta) + tri->batozN5(xi, eta) + tri->batozN6(xi, eta)) << "For (xi = " << xi << ", eta = " << eta << "), " << std::endl << " N1 = " << tri->batozN1(xi, eta) << std::endl << " N2 = " << tri->batozN2(xi, eta) << std::endl << " N3 = " << tri->batozN3(xi, eta) << std::endl << " N4 = " << tri->batozN4(xi, eta) << std::endl << " N5 = " << tri->batozN5(xi, eta) << std::endl << " N6 = " << tri->batozN6(xi, eta) << std::endl << " N1+N2+N3+N4+N5+N6 = " << tri->batozN1(xi, eta) + tri->batozN2(xi, eta) + tri->batozN3(xi, eta) + tri->batozN4(xi, eta) + tri->batozN5(xi, eta) + tri->batozN6(xi, eta); } } } TEST_F(Fem2DElementTriangleTests, StiffnessMatrixTest) { std::shared_ptr tri = getElement(); Eigen::Matrix expectedLocalStiffness; getExpectedLocalStiffnessMatrix(expectedLocalStiffness); EXPECT_TRUE(tri->getLocalStiffnessMatrix().isApprox(expectedLocalStiffness)) << "KLocal = " << std::endl << tri->getLocalStiffnessMatrix() << std::endl << "KLocal expected = " << std::endl << expectedLocalStiffness << std::endl; Eigen::Matrix R0 = tri->getInitialRotationTimes6(); EXPECT_TRUE(tri->getGlobalStiffnessMatrix().isApprox(R0 * expectedLocalStiffness * R0.transpose())) << "R0 = " << std::endl << R0 << std::endl << "KGlobal = " << std::endl << tri->getLocalStiffnessMatrix() << std::endl << "KGlobal expected = " << std::endl << expectedLocalStiffness << std::endl; } /// Evaluate a given polynomial at the given coordinates (x, y) /// \param degree The degree of the polynomial /// \param coefficients The vector of coefficients for all monomials in order /// [1, x, y,..., x^n, x^{n-1}y^1, ..., x^1y^{n-1}, x^0y^n] /// \param x,y The coordinates to evaluate the polynomial at /// \return the polynomial evaluation at the coordinates (x, y) static double evaluatePolynomial(size_t degree, const SurgSim::Math::Vector& coefficients, double x, double y) { SURGSIM_ASSERT((degree + 1) * (degree + 2) / 2 == static_cast(coefficients.size())) << "Invalid coefficients vector (of size " << coefficients.size() << ") provided for a polynomial of degree " << degree << ". Was expecting " << (degree + 1) * (degree + 2) / 2 << " coefficients"; SurgSim::Math::Vector monomials = SurgSim::Math::Vector::Zero(coefficients.size()); size_t monomialId = 0; for (size_t d = 0; d <= degree; d++) { for (size_t monomialOfDegreed = 0; monomialOfDegreed <= d; monomialOfDegreed++) { monomials[monomialId] = coefficients[monomialId] * pow(x, d - monomialOfDegreed) * pow(y, monomialOfDegreed); monomialId++; } } return monomials.sum(); } TEST_F(Fem2DElementTriangleTests, TriangleIntegrationPolynomialOrder4Test) { // Polynomial of order 4 on 2 variables: // {1, 2x, 3y, 4x^2, 5xy, 6y^2, 7x^3, 8x^2y, 9xy^2, 10y^3, 11x^4, 12x^3y, 13x^2y^2, 14xy^3, 15y^4} // \int_0^1 \int_0^{1-y} P(x, y) dx dy = 1679 / 360 SurgSim::Math::Vector polynomial(15); polynomial.setLinSpaced(1.0, 15.0); // http://math2.uncc.edu/~shaodeng/TEACHING/math5172/Lectures/Lect_15.PDF // "Quadrature Formulas in Two Dimensions" // \int_0^1 \int_0^{1-eta} f(xi, eta) dxi deta = 1/2 sum_i w[i] f(xi[i], eta[i]) const double half = 1.0 / 2.0; // Note that Hx and Hy are of degree 2, therefore Hx.Hx^T and Hy.Hy^T are of degree 4. // Exact integration of such functions over the triangle requires a Gauss-Legendre quadrature with 6 points: double integral = 0.0; for (size_t pointId = 0; pointId < 6; ++pointId) { const double& weight = gaussQuadrature2DTriangle6Points[pointId].weight; const double& xi = gaussQuadrature2DTriangle6Points[pointId].coordinateXi; const double& eta = gaussQuadrature2DTriangle6Points[pointId].coordinateEta; integral += half * weight * evaluatePolynomial(4, polynomial, xi, eta); } EXPECT_NEAR(1679.0 / 360.0, integral, 1e-8); } TEST_F(Fem2DElementTriangleTests, TriangleIntegrationPolynomialOrder6Test) { // Polynomial of order 6 on 2 variables: // {1, 2x, 3y, 4x^2, 5xy, 6y^2, 7x^3, 8x^2y, 9xy^2, 10y^3, 11x^4, 12x^3y, 13x^2y^2, 14xy^3, 15y^4, // 16x^5, 17x^4y, 18x^3y^2, 19x^2y^3, 20xy^4, 21y^5, // 22x^6, 23x^5y, 24x^4y^2, 25x^3y^3, 26x^2y^4, 27xy^5, 28y^6} // \int_0^1 \int_0^{1-y} P(x, y) dx dy = 9983 / 1440 SurgSim::Math::Vector polynomial(28); polynomial.setLinSpaced(1.0, 28.0); // http://math2.uncc.edu/~shaodeng/TEACHING/math5172/Lectures/Lect_15.PDF // "Quadrature Formulas in Two Dimensions" // \int_0^1 \int_0^{1-eta} f(xi, eta) dxi deta = 1/2 sum_i w[i] f(xi[i], eta[i]) const double half = 1.0 / 2.0; // Note that matrix d contains monomial terms up to degree 3, // therefore dT.d contains monomial terms up to degree 6. // Exact integration of such functions over the triangle requires a Gauss-Legendre quadrature with 12 points: double integral = 0.0; for (size_t pointId = 0; pointId < 12; ++pointId) { const double& weight = gaussQuadrature2DTriangle12Points[pointId].weight; const double& xi = gaussQuadrature2DTriangle12Points[pointId].coordinateXi; const double& eta = gaussQuadrature2DTriangle12Points[pointId].coordinateEta; integral += half * weight * evaluatePolynomial(6, polynomial, xi, eta); } EXPECT_NEAR(9983.0 / 1440.0, integral, 1e-6); } TEST_F(Fem2DElementTriangleTests, MassMatrixTest) { std::shared_ptr tri = getElement(); Eigen::Matrix expectedMassMatrix; getExpectedLocalMassMatrix(expectedMassMatrix); EXPECT_TRUE(tri->getLocalMassMatrix().isApprox(expectedMassMatrix)) << "Error = " << std::endl << tri->getLocalMassMatrix() - expectedMassMatrix << std::endl; Eigen::Matrix R0 = tri->getInitialRotationTimes6(); EXPECT_TRUE(tri->getGlobalMassMatrix().isApprox(R0 * expectedMassMatrix * R0.transpose())); } TEST_F(Fem2DElementTriangleTests, ForceAndMatricesAPITest) { using SurgSim::Math::addSubMatrix; std::shared_ptr tri = getElement(); const SparseMatrix::Index numDof = 6 * static_cast(m_restState.getNumNodes()); Vector forceVector(numDof); Vector ones(numDof); SparseMatrix massMatrix(numDof, numDof); SparseMatrix dampingMatrix(numDof, numDof); SparseMatrix stiffnessMatrix(numDof, numDof); SparseMatrix zeroMatrix(numDof, numDof); Matrix expectedMassMatrix(numDof, numDof); Matrix expectedDampingMatrix(numDof, numDof); Matrix expectedStiffnessMatrix(numDof, numDof); Matrix zeros18x18 = SurgSim::Math::Matrix::Zero(18, 18); // Assemble manually the expectedStiffnessMatrix Eigen::Matrix R0 = tri->getInitialRotationTimes6(); Eigen::Matrix expected18x18StiffnessMatrix; getExpectedLocalStiffnessMatrix(expected18x18StiffnessMatrix); expectedStiffnessMatrix.setZero(); addSubMatrix(R0 * expected18x18StiffnessMatrix * R0.transpose(), tri->getNodeIds(), 6, &expectedStiffnessMatrix); // Assemble manually the expectedMassMatrix Eigen::Matrix expected18x18MassMatrix; getExpectedLocalMassMatrix(expected18x18MassMatrix); expectedMassMatrix.setZero(); addSubMatrix(R0 * expected18x18MassMatrix * R0.transpose(), tri->getNodeIds(), 6, &expectedMassMatrix); forceVector.setZero(); massMatrix.setZero(); tri->assembleMatrixBlocks(zeros18x18, tri->getNodeIds(), 6, &massMatrix, true); massMatrix.makeCompressed(); dampingMatrix.setZero(); tri->assembleMatrixBlocks(zeros18x18, tri->getNodeIds(), 6, &dampingMatrix, true); dampingMatrix.makeCompressed(); stiffnessMatrix.setZero(); tri->assembleMatrixBlocks(zeros18x18, tri->getNodeIds(), 6, &stiffnessMatrix, true); stiffnessMatrix.makeCompressed(); zeroMatrix.setZero(); // Update the internal f, M, D, K variables. tri->updateFMDK(m_restState, SurgSim::Math::ODEEQUATIONUPDATE_FMDK); // No force should be produced when in rest state (x = x0) => F = K.(x-x0) = 0 tri->addForce(&forceVector); EXPECT_TRUE(forceVector.isZero()); tri->addMass(&massMatrix); EXPECT_TRUE(massMatrix.isApprox(expectedMassMatrix)) << "MassMatrix = " << std::endl << massMatrix << std::endl << "ExpectedMassMatrix = " << std::endl << expectedMassMatrix << std::endl; tri->addDamping(&dampingMatrix); EXPECT_TRUE(dampingMatrix.isApprox(zeroMatrix)); tri->addStiffness(&stiffnessMatrix); EXPECT_TRUE(stiffnessMatrix.isApprox(expectedStiffnessMatrix)); forceVector.setZero(); clearMatrix(&massMatrix); clearMatrix(&dampingMatrix); clearMatrix(&stiffnessMatrix); tri->addFMDK(&forceVector, &massMatrix, &dampingMatrix, &stiffnessMatrix); EXPECT_TRUE(forceVector.isZero()); EXPECT_TRUE(massMatrix.isApprox(expectedMassMatrix)) << "MassMatrix = " << std::endl << massMatrix << std::endl << "ExpectedMassMatrix = " << std::endl << expectedMassMatrix << std::endl; EXPECT_TRUE(dampingMatrix.isApprox(zeroMatrix)); EXPECT_TRUE(stiffnessMatrix.isApprox(expectedStiffnessMatrix)); // Test addMatVec API with Mass component only forceVector.setZero(); ones.setOnes(); tri->addMatVec(1.0, 0.0, 0.0, ones, &forceVector); for (SparseMatrix::Index rowId = 0; rowId < numDof; rowId++) { SCOPED_TRACE("Test addMatVec API with Mass component only"); EXPECT_NEAR(expectedMassMatrix.row(rowId).sum(), forceVector[rowId], epsilon); } // Test addMatVec API with Damping component only forceVector.setZero(); tri->addMatVec(0.0, 1.0, 0.0, ones, &forceVector); for (SparseMatrix::Index rowId = 0; rowId < numDof; rowId++) { SCOPED_TRACE("Test addMatVec API with Damping component only"); EXPECT_NEAR(0.0, forceVector[rowId], epsilon); } // Test addMatVec API with Stiffness component only forceVector.setZero(); tri->addMatVec(0.0, 0.0, 1.0, ones, &forceVector); for (SparseMatrix::Index rowId = 0; rowId < numDof; rowId++) { SCOPED_TRACE("Test addMatVec API with Stiffness component only"); EXPECT_NEAR(expectedStiffnessMatrix.row(rowId).sum(), forceVector[rowId], epsilon); } // Test addMatVec API with mix Mass/Damping/Stiffness components forceVector.setZero(); tri->addMatVec(1.0, 2.0, 3.0, ones, &forceVector); for (SparseMatrix::Index rowId = 0; rowId < numDof; rowId++) { SCOPED_TRACE("Test addMatVec API with mix Mass/Damping/Stiffness components"); double expectedCoef = 1.0 * expectedMassMatrix.row(rowId).sum() + 3.0 * expectedStiffnessMatrix.row(rowId).sum(); EXPECT_NEAR(expectedCoef, forceVector[rowId], epsilon * 10); } } opensurgsim-0.7.0/SurgSim/Physics/UnitTests/Fem2DLocalizationTest.cpp000066400000000000000000000140611277777236100257050ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include #include "SurgSim/Math/OdeState.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/Fem1DRepresentation.h" #include "SurgSim/Physics/Fem2DElementTriangle.h" #include "SurgSim/Physics/Fem2DLocalization.h" #include "SurgSim/Physics/Fem2DRepresentation.h" #include "SurgSim/Physics/Fem3DRepresentation.h" using SurgSim::DataStructures::IndexedLocalCoordinate; namespace { const double epsilon = 1e-10; }; namespace SurgSim { namespace Physics { void addTriangle(Fem2DRepresentation *fem, std::array nodes, const SurgSim::Math::OdeState& state, double thickness = 0.01, double massDensity = 1.0, double poissonRatio = 0.1, double youngModulus = 1.0) { auto element = std::make_shared(nodes); element->setThickness(thickness); element->setMassDensity(massDensity); element->setPoissonRatio(poissonRatio); element->setYoungModulus(youngModulus); element->initialize(state); fem->addFemElement(element); } class Fem2DLocalizationTest : public ::testing::Test { public: void SetUp() { using SurgSim::Math::Vector3d; using SurgSim::Math::getSubVector; m_fem = std::make_shared("Fem2dRepresentation"); auto state = std::make_shared(); state->setNumDof(6, 4); auto& x = state->getPositions(); getSubVector(x, 0, 6).segment<3>(0) = Vector3d(-1.0, 0.0, 0.0); getSubVector(x, 1, 6).segment<3>(0) = Vector3d( 0.0,-1.0, 0.0); getSubVector(x, 2, 6).segment<3>(0) = Vector3d( 1.0, 0.0, 0.0); getSubVector(x, 3, 6).segment<3>(0) = Vector3d( 0.0, 1.0, 0.0); // Define Triangles { std::array nodes = {{0, 2, 1}}; addTriangle(m_fem.get(), nodes, *state); } { std::array nodes = {{0, 3, 2}}; addTriangle(m_fem.get(), nodes, *state); } m_fem->setInitialState(state); m_fem->setLocalActive(true); m_validLocalPosition.index = 1; m_validLocalPosition.coordinate = SurgSim::Math::Vector::Zero(3); m_validLocalPosition.coordinate[0] = 0.4; m_validLocalPosition.coordinate[1] = 0.6; m_invalidIndexLocalPosition.index = 3; m_invalidIndexLocalPosition.coordinate = SurgSim::Math::Vector::Zero(3); m_invalidIndexLocalPosition.coordinate[0] = 0.4; m_invalidIndexLocalPosition.coordinate[1] = 0.6; m_invalidCoordinateLocalPosition.index = 1; m_invalidCoordinateLocalPosition.coordinate = SurgSim::Math::Vector::Zero(3); m_invalidCoordinateLocalPosition.coordinate[0] = 0.6; m_invalidCoordinateLocalPosition.coordinate[1] = 0.6; } void TearDown() { } std::shared_ptr m_fem; SurgSim::DataStructures::IndexedLocalCoordinate m_validLocalPosition; SurgSim::DataStructures::IndexedLocalCoordinate m_invalidIndexLocalPosition; SurgSim::DataStructures::IndexedLocalCoordinate m_invalidCoordinateLocalPosition; }; TEST_F(Fem2DLocalizationTest, ConstructorTest) { // IndexedLocalCoordinate pointing to a node (node index + empty coordinate) are invalid. It will failed, // either because the index is out of bound or because the coordinates are the wrong size (empty) // This is tested by m_invalidIndexLocalPosition and m_invalidCoordinateLocalPosition ASSERT_THROW(std::make_shared(m_fem, m_invalidIndexLocalPosition), SurgSim::Framework::AssertionFailure); ASSERT_THROW(std::make_shared(m_fem, m_invalidCoordinateLocalPosition), SurgSim::Framework::AssertionFailure); ASSERT_NO_THROW(std::make_shared(m_fem, m_validLocalPosition);); } TEST_F(Fem2DLocalizationTest, IsValidRepresentation) { Fem2DLocalization localization(m_fem, m_validLocalPosition); ASSERT_TRUE(localization.isValidRepresentation(m_fem)); // nullptr is valid ASSERT_TRUE(localization.isValidRepresentation(nullptr)); ASSERT_FALSE(localization.isValidRepresentation(std::make_shared("fem1d"))); ASSERT_FALSE(localization.isValidRepresentation(std::make_shared("fem3d"))); } TEST_F(Fem2DLocalizationTest, ElementPose) { SurgSim::Math::RigidTransform3d pose0, pose1; SurgSim::Math::Vector3d edge0(1.0, 0.0, 0.0); SurgSim::Math::Vector3d edge1 = SurgSim::Math::Vector3d(1.0, 1.0, 0.0).normalized(); SurgSim::Math::Vector3d normal(0.0, 0.0, 1.0); SurgSim::Math::Vector3d binormal0 = edge0.cross(normal); SurgSim::Math::Vector3d binormal1 = edge1.cross(normal); SurgSim::Math::Matrix33d rotation; rotation << edge0, normal, binormal0; pose0 = SurgSim::Math::makeRigidTransform(rotation, SurgSim::Math::Vector3d(0.0, -1.0 / 3.0, 0.0)); rotation << edge1, normal, binormal1; pose1 = SurgSim::Math::makeRigidTransform(rotation, SurgSim::Math::Vector3d(0.0, 1.0 / 3.0, 0.0)); { SurgSim::DataStructures::IndexedLocalCoordinate testPosition1; testPosition1.index = 0; testPosition1.coordinate = SurgSim::Math::Vector::Zero(3); testPosition1.coordinate[0] = 0.5; testPosition1.coordinate[1] = 0.5; Fem2DLocalization testLocalization1(m_fem, testPosition1); auto pose = testLocalization1.getElementPose(); EXPECT_TRUE(pose0.isApprox(pose)); } { SurgSim::DataStructures::IndexedLocalCoordinate testPosition1; testPosition1.index = 1; testPosition1.coordinate = SurgSim::Math::Vector::Zero(3); testPosition1.coordinate[0] = 0.5; testPosition1.coordinate[1] = 0.5; Fem2DLocalization testLocalization1(m_fem, testPosition1); auto pose = testLocalization1.getElementPose(); EXPECT_TRUE(pose1.isApprox(pose)); } } } // namespace SurgSim } // namespace Physics opensurgsim-0.7.0/SurgSim/Physics/UnitTests/Fem2DMechanicalValidationTests.cpp000066400000000000000000000606721277777236100275100ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file Fem2DMechanicalValidationTests.cpp /// This file tests the mechanical behaviors of the Fem2DRepresentation. #include #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Math/Matrix.h" #include "SurgSim/Math/OdeState.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/Fem2DRepresentation.h" #include "SurgSim/Physics/Fem2DElementTriangle.h" using SurgSim::Math::Matrix; using SurgSim::Math::Vector; using SurgSim::Math::Vector3d; namespace { static const double inchToMeter = 0.0254; static const double ksiToPascal = 6894757.293; // Kip.in^-2 -> Pa = N.m^-2 static const double kipToNewton = 4448.221615; // Kip -> N const double epsilonCantilever1 = 1e-8; const double epsilonCantilever2 = 1e-8; const double epsilonPlateWithSemiCirculatHole = 5e-5; const double epsilonPlateBending = 2e-7; } namespace SurgSim { namespace Physics { /// Mechanical validation tests class /// Our validation tests are based on the following Thesis: /// "Development of Membrane, Plate and Flat Shell Elements in Java" /// Kaushalkumar Kansara, May 2004 /// In this thesis, the same formulation has been chosen to simulate the plate bending deformation, /// based on Batoz et al. work. Also, a large section of the thesis is dedicated to mechanical validation with /// all necessary details to reproduce the simulation and comparison have been done against a commercial finite /// element analysis program (SAP 2000). class Fem2DMechanicalValidationTests : public ::testing::Test { private: std::shared_ptr m_fem; // Physical properties double m_nu; double m_E; // Geometric properties double m_thickness; // Force and displacement vectors SurgSim::Math::Vector m_F, m_U; protected: void SetUp() override { m_fem = std::make_shared("Fem2D"); } void applyBoundaryConditions() { auto boundaryConditions = m_fem->getInitialState()->getBoundaryConditions(); for (auto bc = boundaryConditions.begin(); bc != boundaryConditions.end(); bc++) { m_F[*bc] = 0.0; } } public: void setNodePositions(const std::vector& nodes, const std::vector& fixedNodes) { const size_t numDofPerNode = m_fem->getNumDofPerNode(); std::shared_ptr state = std::make_shared(); state->setNumDof(numDofPerNode, nodes.size()); for (size_t nodeId = 0; nodeId < nodes.size(); nodeId++) { state->getPositions().segment<3>(numDofPerNode * nodeId) = nodes[nodeId]; } for (auto fixedNodeId = fixedNodes.begin(); fixedNodeId != fixedNodes.end(); fixedNodeId++) { state->addBoundaryCondition(*fixedNodeId); } m_fem->setInitialState(state); } void addTriangle(const std::array& t, double youngModulus, double poissonRatio, double thickness) { std::shared_ptr triangle = std::make_shared(t); triangle->setYoungModulus(youngModulus); triangle->setPoissonRatio(poissonRatio); triangle->setMassDensity(1.0); // In static mode, the mass density is not used, but it needs to be non null to // pass the initialize validation triangle->setThickness(thickness); m_fem->addFemElement(triangle); } // Make sure you call setNodePositions first to initialize the initialState void addPunctualLoad(size_t nodeId, const Vector3d& f) { // Apply load at extremity if (m_F.size() != static_cast(m_fem->getInitialState()->getNumDof())) { m_F.setZero(m_fem->getInitialState()->getNumDof()); } m_F.segment(m_fem->getNumDofPerNode() * nodeId, 3) = f; } // Make sure you call setNodePositions first to initialize the initialState void addUniformSurfaceLoad(const Vector3d& forceInNewtonPerSquareMeter) { std::vector forces; const size_t numNodes = m_fem->getInitialState()->getNumNodes(); forces.resize(numNodes); for (auto f = std::begin(forces); f != std::end(forces); f++) { (*f).setZero(); } for (size_t triangleId = 0; triangleId < m_fem->getNumFemElements(); triangleId++) { auto triangle = std::static_pointer_cast(m_fem->getFemElement(triangleId)); size_t nodeId0 = triangle->getNodeId(0); size_t nodeId1 = triangle->getNodeId(1); size_t nodeId2 = triangle->getNodeId(2); const Vector3d A = m_fem->getInitialState()->getPosition(nodeId0); const Vector3d B = m_fem->getInitialState()->getPosition(nodeId1); const Vector3d C = m_fem->getInitialState()->getPosition(nodeId2); const double Area = ((B - A).cross(C - A)).norm() / 2.0; Vector3d f = Area * forceInNewtonPerSquareMeter; // Uniform distribution, so the resulting force f is to be applied at the triangle center of mass: forces[nodeId0] += f / 3.0; forces[nodeId1] += f / 3.0; forces[nodeId2] += f / 3.0; } for (size_t nodeId = 0; nodeId < numNodes; nodeId++) { addPunctualLoad(nodeId, forces[nodeId]); } applyBoundaryConditions(); } void solve() { m_fem->initialize(std::make_shared()); m_fem->updateFMDK(*(m_fem->getCurrentState()), Math::ODEEQUATIONUPDATE_K); Matrix K = m_fem->getK(); m_fem->getCurrentState()->applyBoundaryConditionsToMatrix(&K); m_fem->getCurrentState()->applyBoundaryConditionsToVector(&m_F); m_U = K.partialPivLu().solve(m_F); } double getUx(size_t nodeId) const { return m_U[m_fem->getNumDofPerNode() * nodeId]; } double getUy(size_t nodeId) const { return m_U[m_fem->getNumDofPerNode() * nodeId + 1]; } double getUz(size_t nodeId) const { return m_U[m_fem->getNumDofPerNode() * nodeId + 2]; } }; TEST_F(Fem2DMechanicalValidationTests, MembraneCantileverTest1) { const double youngModulus = 30000 * ksiToPascal; const double poissonRatio = 0.25; const double thickness = 1.0 * inchToMeter; const double L = 48.0 * inchToMeter; const double h = 12.0 * inchToMeter; std::vector nodes; nodes.push_back(Vector3d(-L / 2.0, - h / 2.0, 0.0)); nodes.push_back(Vector3d(-L / 4.0, - h / 2.0, 0.0)); nodes.push_back(Vector3d( 0.0, - h / 2.0, 0.0)); nodes.push_back(Vector3d( L / 4.0, - h / 2.0, 0.0)); nodes.push_back(Vector3d( L / 2.0, - h / 2.0, 0.0)); nodes.push_back(Vector3d(-L / 2.0, h / 2.0, 0.0)); nodes.push_back(Vector3d(-L / 4.0, h / 2.0, 0.0)); nodes.push_back(Vector3d( 0.0, h / 2.0, 0.0)); nodes.push_back(Vector3d( L / 4.0, h / 2.0, 0.0)); nodes.push_back(Vector3d( L / 2.0, h / 2.0, 0.0)); std::vector fixedNodes; fixedNodes.push_back(0); fixedNodes.push_back(5); setNodePositions(nodes, fixedNodes); const int numTriangles = 8; const std::array, numTriangles> trianglesNodeIds = {{ {{0, 6, 5}}, {{0, 1, 6}}, {{1, 7, 6}}, {{1, 2, 7}}, {{2, 8, 7}}, {{2, 3, 8}}, {{3, 9, 8}}, {{3, 4, 9}} }}; for (size_t triangleId = 0; triangleId < numTriangles; triangleId++) { addTriangle(trianglesNodeIds[triangleId], youngModulus, poissonRatio, thickness); } addPunctualLoad(4, Vector3d(0, 20.0 * kipToNewton, 0)); addPunctualLoad(9, Vector3d(0, 20.0 * kipToNewton, 0)); solve(); EXPECT_NEAR(-0.014159 * inchToMeter, getUx(9), epsilonCantilever1); EXPECT_NEAR( 0.090347 * inchToMeter, getUy(9), epsilonCantilever1); EXPECT_NEAR(-0.010825 * inchToMeter, getUx(7), epsilonCantilever1); EXPECT_NEAR( 0.030403 * inchToMeter, getUy(7), epsilonCantilever1); } TEST_F(Fem2DMechanicalValidationTests, MembraneCantileverTest2) { const double youngModulus = 30000 * ksiToPascal; const double poissonRatio = 0.25; const double thickness = 1.0 * inchToMeter; const double L = 48.0 * inchToMeter; const double h = 12.0 * inchToMeter; std::vector nodes; nodes.push_back(Vector3d(-L / 2.0, - h / 2.0, 0.0)); // 0 nodes.push_back(Vector3d(-L / 4.0, - h / 2.0, 0.0)); // 1 nodes.push_back(Vector3d( 0.0, - h / 2.0, 0.0)); // 2 nodes.push_back(Vector3d( L / 4.0, - h / 2.0, 0.0)); // 3 nodes.push_back(Vector3d( L / 2.0, - h / 2.0, 0.0)); // 4 nodes.push_back(Vector3d(-L / 2.0, h / 2.0, 0.0)); // 5 nodes.push_back(Vector3d(-L / 4.0, h / 2.0, 0.0)); // 6 nodes.push_back(Vector3d( 0.0, h / 2.0, 0.0)); // 7 nodes.push_back(Vector3d( L / 4.0, h / 2.0, 0.0)); // 8 nodes.push_back(Vector3d( L / 2.0, h / 2.0, 0.0)); // 9 // Subdivision nodes.push_back((nodes[0] + nodes[1]) * 0.5); // 10 nodes.push_back((nodes[0] + nodes[6]) * 0.5); // 11 nodes.push_back((nodes[0] + nodes[5]) * 0.5); // 12 nodes.push_back((nodes[5] + nodes[6]) * 0.5); // 13 nodes.push_back((nodes[1] + nodes[6]) * 0.5); // 14 nodes.push_back((nodes[1] + nodes[2]) * 0.5); // 15 nodes.push_back((nodes[1] + nodes[7]) * 0.5); // 16 nodes.push_back((nodes[6] + nodes[7]) * 0.5); // 17 nodes.push_back(Vector3d::Zero()); // 18 nodes.push_back((nodes[2] + nodes[3]) * 0.5); // 19 nodes.push_back((nodes[2] + nodes[8]) * 0.5); // 20 nodes.push_back((nodes[7] + nodes[8]) * 0.5); // 21 nodes.push_back((nodes[3] + nodes[8]) * 0.5); // 22 nodes.push_back((nodes[3] + nodes[4]) * 0.5); // 23 nodes.push_back((nodes[3] + nodes[9]) * 0.5); // 24 nodes.push_back((nodes[8] + nodes[9]) * 0.5); // 25 nodes.push_back((nodes[4] + nodes[9]) * 0.5); // 26 std::vector fixedNodes; fixedNodes.push_back(0); fixedNodes.push_back(5); fixedNodes.push_back(12); setNodePositions(nodes, fixedNodes); const int numTriangles = 32; const std::array, numTriangles> trianglesNodeIds = {{ {{0, 10, 12}}, {{10, 11, 12}}, {{12, 11, 13}}, {{12, 13, 5}}, {{10, 1, 11}}, {{1, 14, 11}}, {{11, 14, 6}}, {{11, 6, 13}}, {{1, 15, 14}}, {{15, 16, 14}}, {{14, 16, 17}}, {{14, 17, 6}}, {{15, 2, 16}}, {{2, 18, 16}}, {{16, 18, 7}}, {{16, 7, 17}}, {{2, 19, 18}}, {{19, 20, 18}}, {{18, 20, 21}}, {{18, 21, 7}}, {{19, 3, 20}}, {{3, 22, 20}}, {{20, 22, 8}}, {{20, 8, 21}}, {{3, 23, 22}}, {{23, 24, 22}}, {{22, 24, 25}}, {{22, 25, 8}}, {{23, 4, 24}}, {{4, 26, 24}}, {{24, 26, 9}}, {{24, 9, 25}} }}; for (size_t triangleId = 0; triangleId < numTriangles; triangleId++) { addTriangle(trianglesNodeIds[triangleId], youngModulus, poissonRatio, thickness); } addPunctualLoad( 4, Vector3d(0, 6.67 * kipToNewton, 0)); addPunctualLoad( 9, Vector3d(0, 6.67 * kipToNewton, 0)); addPunctualLoad(26, Vector3d(0, 26.67 * kipToNewton, 0)); solve(); EXPECT_NEAR(-0.034271 * inchToMeter, getUx(9), epsilonCantilever2); EXPECT_NEAR( 0.194456 * inchToMeter, getUy(9), epsilonCantilever2); EXPECT_NEAR(-0.025605 * inchToMeter, getUx(7), epsilonCantilever2); EXPECT_NEAR( 0.062971 * inchToMeter, getUy(7), epsilonCantilever2); } /// Generic algorithm to define the triangles in between 2 arrays of consecutive node indices: /// beginIndex2 /// *---1---2---3---4 array2 /// | \ | \ | \ | \ | /// *---1---2---3---4 array1 /// beginIndex1 template void defineTriangleStrips(size_t beginIndex1, size_t beginIndex2, size_t number, std::array, M>* triangleLists, size_t* triangleId) { for (size_t i = 0; i < number - 1; i++) { std::array triangle1 = {{beginIndex1 + i, beginIndex1 + i + 1, beginIndex2 + i}}; std::array triangle2 = {{beginIndex1 + i + 1, beginIndex2 + i + 1, beginIndex2 + i}}; (*triangleLists)[(*triangleId)++] = triangle1; (*triangleLists)[(*triangleId)++] = triangle2; } } /// Helper function to define the nodes of the membrane plate with semi-circular hole test /// In this test, nodes are defined around concentric circles. This function adds the nodes that are along the same /// axis (going from the most interior circle to the most exterior circle) for a given angle. /// \param angle The angle for which the nodes will be computed and added /// \param numNodes The number of nodes to add along this axis (defined by the angle) /// \param L The length of the plate /// \param radius The radius of the most internal circle /// \param [in,out] nodes The list of nodes in which the new nodes will be added /// \note The spacing between 2 consecutive nodes is constant equal to (L / 2.0 - radius) / 5.0 void membranePlateWithSemiCircularHoleAddNodesForAngle(double angle, size_t numNodes, double L, double radius, std::vector* nodes) { for (size_t nodeId = 0; nodeId < numNodes; nodeId++) { double distance = radius + nodeId * (L / 2.0 - radius) / 5.0; (*nodes).push_back(Vector3d(distance * cos(angle), distance * sin(angle), 0.0)); } } TEST_F(Fem2DMechanicalValidationTests, MembranePlateWithSemiCircularHoleTest) { const double youngModulus = 30000 * ksiToPascal; const double poissonRatio = 0.3; const double thickness = 0.45 * inchToMeter; const double radius = 3.0 * inchToMeter; const double L = 16.0 * inchToMeter; const double h = 6.0 * inchToMeter; double startAngle = -M_PI / 2.0; double deltaAngle = M_PI / 12.0; std::vector nodes; double angle, distance; // Node 0..5 angle = startAngle + 0.0 * deltaAngle; membranePlateWithSemiCircularHoleAddNodesForAngle(angle, 6, L, radius, &nodes); // Node 6..10 angle = startAngle + 1.0 * deltaAngle; membranePlateWithSemiCircularHoleAddNodesForAngle(angle, 5, L, radius, &nodes); // Node 11 (we have distance.sin(angle) = -L/2) distance = - L / (2.0 * sin(angle)); nodes.push_back(Vector3d(distance * cos(angle), distance * sin(angle), 0.0)); // 11 // Node 12..17 angle = startAngle + 2.0 * deltaAngle; membranePlateWithSemiCircularHoleAddNodesForAngle(angle, 6, L, radius, &nodes); // Node 18 (we have distance.sin(angle) = -L/2) distance = - L / (2.0 * sin(angle)); nodes.push_back(Vector3d(distance * cos(angle), distance * sin(angle), 0.0)); // 18 // Node 19..23 angle = startAngle + 3.0 * deltaAngle; membranePlateWithSemiCircularHoleAddNodesForAngle(angle, 5, L, radius, &nodes); // Node 24 (we have distance.cos(angle) = h) distance = h / cos(angle); nodes.push_back(Vector3d(distance * cos(angle), distance * sin(angle), 0.0)); // 24 // Node 25 (corner) nodes.push_back(Vector3d(h, -L / 2.0, 0.0)); // 25 // Node 26..29 angle = startAngle + 4.0 * deltaAngle; membranePlateWithSemiCircularHoleAddNodesForAngle(angle, 4, L, radius, &nodes); // Node 30 (we have distance.cos(angle) = h) distance = h / cos(angle); nodes.push_back(Vector3d(distance * cos(angle), distance * sin(angle), 0.0)); // 30 // Node 31..33 angle = startAngle + 5.0 * deltaAngle; membranePlateWithSemiCircularHoleAddNodesForAngle(angle, 3, L, radius, &nodes); // Node 34 (we have distance.cos(angle) = h) distance = h / cos(angle); nodes.push_back(Vector3d(distance * cos(angle), distance * sin(angle), 0.0)); // 34 // Node 35..38 angle = startAngle + 6.0 * deltaAngle; // (=0) membranePlateWithSemiCircularHoleAddNodesForAngle(angle, 4, L, radius, &nodes); // Node 39..41 angle = startAngle + 7.0 * deltaAngle; membranePlateWithSemiCircularHoleAddNodesForAngle(angle, 3, L, radius, &nodes); // Node 42 (we have distance.cos(angle) = h) distance = h / cos(angle); nodes.push_back(Vector3d(distance * cos(angle), distance * sin(angle), 0.0)); // 42 // Node 43..46 angle = startAngle + 8.0 * deltaAngle; membranePlateWithSemiCircularHoleAddNodesForAngle(angle, 4, L, radius, &nodes); // Node 47 (we have distance.cos(angle) = h) distance = h / cos(angle); nodes.push_back(Vector3d(distance * cos(angle), distance * sin(angle), 0.0)); // 47 // Node 48..52 angle = startAngle + 9.0 * deltaAngle; membranePlateWithSemiCircularHoleAddNodesForAngle(angle, 5, L, radius, &nodes); // Node 53 (we have distance.cos(angle) = h) distance = h / cos(angle); nodes.push_back(Vector3d(distance * cos(angle), distance * sin(angle), 0.0)); // 53 // Node 54 (corner) nodes.push_back(Vector3d(h, L / 2.0, 0.0)); // 54 // Node 55..60 angle = startAngle + 10.0 * deltaAngle; membranePlateWithSemiCircularHoleAddNodesForAngle(angle, 6, L, radius, &nodes); // Node 61 (we have distance.sin(angle) = L / 2) distance = L / (2.0 * sin(angle)); nodes.push_back(Vector3d(distance * cos(angle), distance * sin(angle), 0.0)); // 61 // Node 62..66 angle = startAngle + 11.0 * deltaAngle; membranePlateWithSemiCircularHoleAddNodesForAngle(angle, 5, L, radius, &nodes); // Node 67 (we have distance.sin(angle) = L / 2) distance = L / (2.0 * sin(angle)); nodes.push_back(Vector3d(distance * cos(angle), distance * sin(angle), 0.0)); // 67 // Node 69..73 angle = startAngle + 12.0 * deltaAngle; // (= M_PI / 2) membranePlateWithSemiCircularHoleAddNodesForAngle(angle, 6, L, radius, &nodes); std::vector fixedNodes; fixedNodes.push_back(54); fixedNodes.push_back(61); fixedNodes.push_back(67); fixedNodes.push_back(73); setNodePositions(nodes, fixedNodes); const int numTriangles = 110; std::array, numTriangles> trianglesNodeIds; size_t triangleId = 0; defineTriangleStrips(0, 6, 6, &trianglesNodeIds, &triangleId); defineTriangleStrips(6, 12, 6, &trianglesNodeIds, &triangleId); { std::array triangle = {{11, 18, 17}}; trianglesNodeIds[triangleId++] = triangle; } defineTriangleStrips(12, 19, 7, &trianglesNodeIds, &triangleId); defineTriangleStrips(19, 26, 5, &trianglesNodeIds, &triangleId); { std::array triangle = {{23, 24, 30}}; trianglesNodeIds[triangleId++] = triangle; } defineTriangleStrips(26, 31, 4, &trianglesNodeIds, &triangleId); { std::array triangle = {{29, 30, 34}}; trianglesNodeIds[triangleId++] = triangle; } defineTriangleStrips(31, 35, 4, &trianglesNodeIds, &triangleId); defineTriangleStrips(35, 39, 4, &trianglesNodeIds, &triangleId); defineTriangleStrips(39, 43, 4, &trianglesNodeIds, &triangleId); { std::array triangle = {{42, 47, 46}}; trianglesNodeIds[triangleId++] = triangle; } defineTriangleStrips(43, 48, 5, &trianglesNodeIds, &triangleId); { std::array triangle = {{47, 53, 52}}; trianglesNodeIds[triangleId++] = triangle; } defineTriangleStrips(48, 55, 7, &trianglesNodeIds, &triangleId); defineTriangleStrips(55, 62, 6, &trianglesNodeIds, &triangleId); { std::array triangle = {{60, 61, 67}}; trianglesNodeIds[triangleId++] = triangle; } defineTriangleStrips(62, 68, 6, &trianglesNodeIds, &triangleId); for (size_t triangleId = 0; triangleId < numTriangles; triangleId++) { addTriangle(trianglesNodeIds[triangleId], youngModulus, poissonRatio, thickness); } addPunctualLoad( 5, Vector3d(0, -1.0 * kipToNewton, 0)); addPunctualLoad(11, Vector3d(0, -1.0 * kipToNewton, 0)); addPunctualLoad(18, Vector3d(0, -1.0 * kipToNewton, 0)); addPunctualLoad(25, Vector3d(0, -1.0 * kipToNewton, 0)); solve(); EXPECT_NEAR( 0.001545 * inchToMeter, getUx(0), epsilonPlateWithSemiCirculatHole); EXPECT_NEAR(-0.003132 * inchToMeter, getUy(0), epsilonPlateWithSemiCirculatHole); EXPECT_NEAR( 0.004213 * inchToMeter, getUx(5), epsilonPlateWithSemiCirculatHole); EXPECT_NEAR(-0.003355 * inchToMeter, getUy(5), epsilonPlateWithSemiCirculatHole); } TEST_F(Fem2DMechanicalValidationTests, PlateBendingSquarePlateMeshPatternATest) { const double youngModulus = 3600 * ksiToPascal; const double poissonRatio = 0.2; const double thickness = 6.0 * inchToMeter; const double L = 144.0 * inchToMeter; const double deltaL = L / 8.0; std::vector nodes; std::vector fixedNodes; for (size_t Y = 0; Y < 9; Y++) { for (size_t X = 0; X < 9; X++) { nodes.push_back(Vector3d(-L / 2.0 + deltaL * X, - L / 2.0 + deltaL * Y, 0.0)); } } for (size_t i = 0; i < 9; i++) { // 1st edge along X fixedNodes.push_back(i); // Nodes 0..8 // last edge along X fixedNodes.push_back(9 * 8 + i); // Nodes 72..80 } for (size_t i = 1; i < 8; i++) { // 1st edge along Y fixedNodes.push_back(9 * i); // Nodes 9, 18, 27, 36, 45, 54, 63 // last edge along Y fixedNodes.push_back(9 * i + 8); // Nodes 17, 26, 35, 44, 53, 62 } setNodePositions(nodes, fixedNodes); const int numTriangles = 128; std::array, numTriangles> trianglesNodeIds; size_t triangleId = 0; for(size_t Y = 0; Y < 8; Y++) { for(size_t X = 0; X < 8; X++) { std::array triangle1 = {{Y * 9 + X, Y * 9 + (X + 1), (Y + 1) * 9 + (X + 1)}}; trianglesNodeIds[triangleId++] = triangle1; std::array triangle2 = {{Y * 9 + X, (Y + 1) * 9 + (X + 1), (Y + 1) * 9 + X}}; trianglesNodeIds[triangleId++] = triangle2; } } for (size_t triangleId = 0; triangleId < numTriangles; triangleId++) { addTriangle(trianglesNodeIds[triangleId], youngModulus, poissonRatio, thickness); } addUniformSurfaceLoad(Vector3d(0.0, 0.0, -0.1) * ksiToPascal); solve(); EXPECT_NEAR(-0.82920 * inchToMeter, getUz(40), epsilonPlateBending); EXPECT_NEAR(-0.304909 * inchToMeter, getUz(20), epsilonPlateBending); } TEST_F(Fem2DMechanicalValidationTests, PlateBendingSquarePlateMeshPatternBTest) { const double youngModulus = 3600 * ksiToPascal; const double poissonRatio = 0.2; const double thickness = 6.0 * inchToMeter; const double L = 144.0 * inchToMeter; const double deltaL = L / 8.0; std::vector nodes; std::vector fixedNodes; for (size_t Y = 0; Y < 9; Y++) { for (size_t X = 0; X < 9; X++) { nodes.push_back(Vector3d(-L / 2.0 + deltaL * X, - L / 2.0 + deltaL * Y, 0.0)); } } for (size_t i = 0; i < 9; i++) { // 1st edge along X fixedNodes.push_back(i); // Nodes 0..8 // last edge along X fixedNodes.push_back(9 * 8 + i); // Nodes 72..80 } for (size_t i = 1; i < 8; i++) { // 1st edge along Y fixedNodes.push_back(9 * i); // Nodes 9, 18, 27, 36, 45, 54, 63 // last edge along Y fixedNodes.push_back(9 * i + 8); // Nodes 17, 26, 35, 44, 53, 62 } setNodePositions(nodes, fixedNodes); const int numTriangles = 128; std::array, numTriangles> trianglesNodeIds; size_t triangleId = 0; for(size_t Y = 0; Y < 8; Y++) { for(size_t X = 0; X < 8; X++) { std::array triangle1 = {{Y * 9 + X, Y * 9 + (X + 1), (Y + 1) * 9 + X}}; trianglesNodeIds[triangleId++] = triangle1; std::array triangle2 = {{Y * 9 + (X + 1), (Y + 1) * 9 + (X + 1), (Y + 1) * 9 + X}}; trianglesNodeIds[triangleId++] = triangle2; } } for (size_t triangleId = 0; triangleId < numTriangles; triangleId++) { addTriangle(trianglesNodeIds[triangleId], youngModulus, poissonRatio, thickness); } addUniformSurfaceLoad(Vector3d(0.0, 0.0, -0.1) * ksiToPascal); solve(); EXPECT_NEAR(-0.82920 * inchToMeter, getUz(40), epsilonPlateBending); EXPECT_NEAR(-0.30010 * inchToMeter, getUz(20), epsilonPlateBending); } TEST_F(Fem2DMechanicalValidationTests, CantileverPlateTest) { const double youngModulus = 3600 * ksiToPascal; const double poissonRatio = 0.2; const double thickness = 6.0 * inchToMeter; const double L = 96.0 * inchToMeter; const double deltaL = L / 8; std::vector nodes; std::vector fixedNodes; for (size_t Y = 0; Y < 9; Y++) { for (size_t X = 0; X < 9; X++) { nodes.push_back(Vector3d(-L / 2.0 + deltaL * X, - L / 2.0 + deltaL * Y, 0.0)); } } for (size_t i = 0; i < 9; i++) { // 1st edge along X fixedNodes.push_back(i); // Nodes 0..8 } setNodePositions(nodes, fixedNodes); const int numTriangles = 128; std::array, numTriangles> trianglesNodeIds; size_t triangleId = 0; for(size_t Y = 0; Y < 8; Y++) { for(size_t X = 0; X < 8; X++) { std::array triangle1 = {{Y * 9 + X, Y * 9 + (X + 1), (Y + 1) * 9 + X}}; trianglesNodeIds[triangleId++] = triangle1; std::array triangle2 = {{Y * 9 + (X + 1), (Y + 1) * 9 + (X + 1), (Y + 1) * 9 + X}}; trianglesNodeIds[triangleId++] = triangle2; } } for (size_t triangleId = 0; triangleId < numTriangles; triangleId++) { addTriangle(trianglesNodeIds[triangleId], youngModulus, poissonRatio, thickness); } addUniformSurfaceLoad(Vector3d(0.0, 0.0, -0.01) * ksiToPascal); solve(); // Expect 5% error max (in the Thesis, the author gets 4.96% error) const double epsilonNode76 = 1.68787 * inchToMeter * 0.05; EXPECT_NEAR(-1.68787 * inchToMeter, getUz(76), epsilonNode76); // Expect 5% error max (in the Thesis, the author gets 4.98% error) const double epsilonNode40 = 0.599412 * inchToMeter * 0.05; EXPECT_NEAR(-0.599412 * inchToMeter, getUz(40), epsilonNode40); } } // namespace Physics } // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/UnitTests/Fem2DPlyReaderDelegateTests.cpp000066400000000000000000000061721277777236100267660ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Math/OdeState.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/Fem.h" #include "SurgSim/Physics/Fem2DPlyReaderDelegate.h" namespace SurgSim { namespace Physics { using SurgSim::Math::Vector3d; using SurgSim::DataStructures::PlyReader; TEST(Fem2DRepresentationReaderTests, DelegateTest) { auto fem = std::make_shared(); auto runtime = std::make_shared("config.txt"); fem->load("PlyReaderTests/Fem2D.ply"); // Vertices Vector3d vertex0(1.0, 1.0, -1.0); Vector3d vertex5(0.999999, -1.000001, 1.0); EXPECT_TRUE(vertex0.isApprox(fem->getVertex(0).position)); EXPECT_TRUE(vertex5.isApprox(fem->getVertex(5).position)); // Number of triangles ASSERT_EQ(3u, fem->getNumElements()); std::array triangle0 = {0, 1, 2}; std::array triangle2 = {3, 4, 5}; EXPECT_TRUE(std::equal(std::begin(triangle0), std::end(triangle0), std::begin(fem->getElement(0)->nodeIds))); EXPECT_TRUE(std::equal(std::begin(triangle2), std::end(triangle2), std::begin(fem->getElement(2)->nodeIds))); // Boundary conditions ASSERT_EQ(2u, fem->getBoundaryConditions().size()); EXPECT_EQ(3, fem->getBoundaryCondition(0)); EXPECT_EQ(2, fem->getBoundaryCondition(1)); // Material for (size_t i = 0; i < fem->getNumElements(); ++i) { auto element = fem->getElement(i); EXPECT_DOUBLE_EQ(0.2, element->massDensity); EXPECT_DOUBLE_EQ(0.3, element->poissonRatio); EXPECT_DOUBLE_EQ(0.4, element->youngModulus); } } TEST(Fem2DRepresentationReaderTests, PerElementMaterial) { auto fem = std::make_shared(); auto runtime = std::make_shared("config.txt"); fem->load("PlyReaderTests/Fem2DMaterial.ply"); // Material double value = 1.0; for (size_t i = 0; i < fem->getNumElements(); ++i) { auto element = fem->getElement(i); EXPECT_DOUBLE_EQ(value++, element->massDensity); EXPECT_DOUBLE_EQ(value++, element->poissonRatio); EXPECT_DOUBLE_EQ(value++, element->youngModulus); } } TEST(Fem2DRepresentationReaderTests, NoMaterials) { auto fem = std::make_shared(); auto runtime = std::make_shared("config.txt"); ASSERT_NO_THROW(fem->load("PlyReaderTests/Fem2DNoMaterial.ply")); for (auto element : fem->getElements()) { EXPECT_DOUBLE_EQ(0.0, element->massDensity); EXPECT_DOUBLE_EQ(0.0, element->poissonRatio); EXPECT_DOUBLE_EQ(0.0, element->youngModulus); } } }; // Physics }; // SurgSim opensurgsim-0.7.0/SurgSim/Physics/UnitTests/Fem2DRepresentationTests.cpp000066400000000000000000000423711277777236100264470ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file Fem2DRepresentationTests.cpp /// This file tests the functionalities of the class Fem2DRepresentation. #include #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Math/OdeState.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/DeformableCollisionRepresentation.h" #include "SurgSim/Physics/Fem2DElementTriangle.h" #include "SurgSim/Physics/Fem2DLocalization.h" #include "SurgSim/Physics/Fem2DRepresentation.h" #include "SurgSim/Physics/UnitTests/MockObjects.h" namespace SurgSim { namespace Physics { TEST(Fem2DRepresentationTests, ConstructorTest) { ASSERT_NO_THROW({std::shared_ptr fem = std::make_shared("Fem2D");}); } TEST(Fem2DRepresentationTests, GetNumDofPerNodeTest) { std::shared_ptr fem = std::make_shared("Fem2D"); EXPECT_EQ(6u, fem->getNumDofPerNode()); } TEST(Fem2DRepresentationTests, TransformInitialStateTest) { using SurgSim::Math::Vector; std::shared_ptr fem = std::make_shared("Fem2D"); const size_t numNodes = 3; const size_t numDofPerNode = fem->getNumDofPerNode(); const size_t numDof = numDofPerNode * numNodes; SurgSim::Math::RigidTransform3d initialPose; SurgSim::Math::Quaterniond q(1.0, 2.0, 3.0, 4.0); SurgSim::Math::Vector3d t(1.0, 2.0, 3.0); q.normalize(); initialPose = SurgSim::Math::makeRigidTransform(q, t); fem->setLocalPose(initialPose); std::shared_ptr initialState = std::make_shared(); initialState->setNumDof(numDofPerNode, numNodes); Vector x = Vector::LinSpaced(numDof, 1.0, static_cast(numDof)); Vector v = Vector::Ones(numDof); Vector a = Vector::Ones(numDof) * 2.0; initialState->getPositions() = x; initialState->getVelocities() = v; fem->setInitialState(initialState); Vector expectedX = x, expectedV = v, expectedA = a; for (size_t nodeId = 0; nodeId < numNodes; nodeId++) { expectedX.segment<3>(numDofPerNode * nodeId) = initialPose * x.segment<3>(numDofPerNode * nodeId); expectedV.segment<3>(numDofPerNode * nodeId) = initialPose.linear() * v.segment<3>(numDofPerNode * nodeId); expectedA.segment<3>(numDofPerNode * nodeId) = initialPose.linear() * a.segment<3>(numDofPerNode * nodeId); } // Initialize the component ASSERT_TRUE(fem->initialize(std::make_shared())); // Wake-up the component => apply the pose to the initial state ASSERT_TRUE(fem->wakeUp()); EXPECT_TRUE(fem->getInitialState()->getPositions().isApprox(expectedX)); EXPECT_TRUE(fem->getInitialState()->getVelocities().isApprox(expectedV)); } TEST(Fem2DRepresentationTests, ExternalForceAPITest) { std::shared_ptr fem = std::make_shared("Fem"); std::shared_ptr initialState = std::make_shared(); initialState->setNumDof(6, 4); // External force vector not initialized until the initial state has been set (it contains the #dof...) EXPECT_EQ(0, fem->getExternalGeneralizedForce().size()); EXPECT_EQ(0, fem->getExternalGeneralizedStiffness().rows()); EXPECT_EQ(0, fem->getExternalGeneralizedStiffness().cols()); EXPECT_EQ(0, fem->getExternalGeneralizedDamping().rows()); EXPECT_EQ(0, fem->getExternalGeneralizedDamping().cols()); fem->setInitialState(initialState); Math::SparseMatrix zeroMat(static_cast(fem->getNumDof()), static_cast(fem->getNumDof())); zeroMat.setZero(); // Vector initialized (properly sized and zeroed) EXPECT_NE(0, fem->getExternalGeneralizedForce().size()); EXPECT_NE(0, fem->getExternalGeneralizedStiffness().rows()); EXPECT_NE(0, fem->getExternalGeneralizedStiffness().cols()); EXPECT_NE(0, fem->getExternalGeneralizedDamping().rows()); EXPECT_NE(0, fem->getExternalGeneralizedDamping().cols()); EXPECT_EQ(fem->getNumDof(), fem->getExternalGeneralizedForce().size()); EXPECT_EQ(fem->getNumDof(), fem->getExternalGeneralizedStiffness().cols()); EXPECT_EQ(fem->getNumDof(), fem->getExternalGeneralizedStiffness().rows()); EXPECT_EQ(fem->getNumDof(), fem->getExternalGeneralizedDamping().cols()); EXPECT_EQ(fem->getNumDof(), fem->getExternalGeneralizedDamping().rows()); EXPECT_TRUE(fem->getExternalGeneralizedForce().isZero()); EXPECT_TRUE(fem->getExternalGeneralizedStiffness().isApprox(zeroMat)); EXPECT_TRUE(fem->getExternalGeneralizedDamping().isApprox(zeroMat)); std::array element1NodeIds = {{0, 1, 2}}; auto element1 = std::make_shared(element1NodeIds); fem->addFemElement(element1); std::array element2NodeIds = {{1, 2, 3}}; auto element2 = std::make_shared(element2NodeIds); fem->addFemElement(element2); SurgSim::DataStructures::IndexedLocalCoordinate femRepCoordinate; femRepCoordinate.index = 0; femRepCoordinate.coordinate = SurgSim::Math::Vector::Zero(3); femRepCoordinate.coordinate[0] = 1.0; auto localization = std::make_shared(fem, femRepCoordinate); auto wrongLocalizationType = std::make_shared(); Vector FLocalWrongSize = Vector::Ones(2 * fem->getNumDofPerNode()); Matrix KLocalWrongSize = Matrix::Ones(3 * fem->getNumDofPerNode(), 3 * fem->getNumDofPerNode()); Matrix DLocalWrongSize = Matrix::Ones(4 * fem->getNumDofPerNode(), 4 * fem->getNumDofPerNode()); Vector Flocal = Vector::LinSpaced(fem->getNumDofPerNode(), -3.12, 4.09); Matrix Klocal = Matrix::Ones(fem->getNumDofPerNode(), fem->getNumDofPerNode()) * 0.34; Matrix Dlocal = Klocal + Matrix::Identity(fem->getNumDofPerNode(), fem->getNumDofPerNode()); Vector F = Vector::Zero(fem->getNumDof()); F.segment(0, fem->getNumDofPerNode()) = Flocal; SparseMatrix K(static_cast(fem->getNumDof()), static_cast(fem->getNumDof())); K.setZero(); Math::addSubMatrix(Klocal, 0, 0, &K, true); K.makeCompressed(); SparseMatrix D(static_cast(fem->getNumDof()), static_cast(fem->getNumDof())); D.setZero(); Math::addSubMatrix(Dlocal, 0, 0, &D, true); D.makeCompressed(); // Test invalid localization nullptr ASSERT_THROW(fem->addExternalGeneralizedForce(nullptr, Flocal), SurgSim::Framework::AssertionFailure); ASSERT_THROW(fem->addExternalGeneralizedForce(nullptr, Flocal, Klocal, Dlocal), SurgSim::Framework::AssertionFailure); // Test invalid localization type ASSERT_THROW(fem->addExternalGeneralizedForce(wrongLocalizationType, Flocal), SurgSim::Framework::AssertionFailure); ASSERT_THROW(fem->addExternalGeneralizedForce(wrongLocalizationType, Flocal, Klocal, Dlocal), SurgSim::Framework::AssertionFailure); // Test invalid force size ASSERT_THROW(fem->addExternalGeneralizedForce(localization, FLocalWrongSize), SurgSim::Framework::AssertionFailure); ASSERT_THROW(fem->addExternalGeneralizedForce(localization, FLocalWrongSize, Klocal, Dlocal), SurgSim::Framework::AssertionFailure); // Test invalid stiffness size ASSERT_THROW(fem->addExternalGeneralizedForce(localization, Flocal, KLocalWrongSize, Dlocal), SurgSim::Framework::AssertionFailure); // Test invalid damping size ASSERT_THROW(fem->addExternalGeneralizedForce(localization, Flocal, Klocal, DLocalWrongSize), SurgSim::Framework::AssertionFailure); // Test valid call to addExternalGeneralizedForce Math::SparseMatrix zeroMatrix(static_cast(fem->getNumDof()), static_cast(fem->getNumDof())); zeroMatrix.setZero(); fem->addExternalGeneralizedForce(localization, Flocal, Klocal, Dlocal); EXPECT_FALSE(fem->getExternalGeneralizedForce().isZero()); EXPECT_FALSE(fem->getExternalGeneralizedStiffness().isApprox(zeroMatrix)); EXPECT_FALSE(fem->getExternalGeneralizedDamping().isApprox(zeroMatrix)); EXPECT_TRUE(fem->getExternalGeneralizedForce().isApprox(F)); EXPECT_TRUE(fem->getExternalGeneralizedStiffness().isApprox(K)); EXPECT_TRUE(fem->getExternalGeneralizedDamping().isApprox(D)); // Test valid call to addExternalGeneralizedForce to add things up fem->addExternalGeneralizedForce(localization, Flocal, Klocal, Dlocal); EXPECT_TRUE(fem->getExternalGeneralizedForce().isApprox(2.0 * F)); EXPECT_TRUE(fem->getExternalGeneralizedStiffness().isApprox(2.0 * K)); EXPECT_TRUE(fem->getExternalGeneralizedDamping().isApprox(2.0 * D)); } TEST(Fem2DRepresentationTests, LoadMeshTest) { auto femRepresentation = std::make_shared("Representation"); auto runtime = std::make_shared("config.txt"); femRepresentation->loadFem("PlyReaderTests/Fem2D.ply"); ASSERT_TRUE(femRepresentation->initialize(runtime)); // Vertices ASSERT_EQ(6u, femRepresentation->getNumDofPerNode()); ASSERT_EQ(6u * 6u, femRepresentation->getNumDof()); Vector3d vertex0(1.0, 1.0, -1.0); Vector3d vertex5(0.999999, -1.000001, 1.0); EXPECT_TRUE(vertex0.isApprox(femRepresentation->getInitialState()->getPosition(0))); EXPECT_TRUE(vertex5.isApprox(femRepresentation->getInitialState()->getPosition(5))); // Number of triangles ASSERT_EQ(3u, femRepresentation->getNumFemElements()); std::array triangle0 = {0, 1, 2}; std::array triangle2 = {3, 4, 5}; EXPECT_TRUE(std::equal(std::begin(triangle0), std::end(triangle0), std::begin(femRepresentation->getFemElement(0)->getNodeIds()))); EXPECT_TRUE(std::equal(std::begin(triangle2), std::end(triangle2), std::begin(femRepresentation->getFemElement(2)->getNodeIds()))); // Boundary conditions ASSERT_EQ(2u * 6u, femRepresentation->getInitialState()->getNumBoundaryConditions()); // Boundary condition 0 is on node 8 size_t boundaryNode0 = 3; size_t boundaryNode1 = 2; EXPECT_EQ(6 * boundaryNode0, femRepresentation->getInitialState()->getBoundaryConditions().at(0)); EXPECT_EQ(6 * boundaryNode0 + 1, femRepresentation->getInitialState()->getBoundaryConditions().at(1)); EXPECT_EQ(6 * boundaryNode0 + 2, femRepresentation->getInitialState()->getBoundaryConditions().at(2)); EXPECT_EQ(6 * boundaryNode1, femRepresentation->getInitialState()->getBoundaryConditions().at(6)); EXPECT_EQ(6 * boundaryNode1 + 1, femRepresentation->getInitialState()->getBoundaryConditions().at(7)); EXPECT_EQ(6 * boundaryNode1 + 2, femRepresentation->getInitialState()->getBoundaryConditions().at(8)); // Material for (size_t i = 0; i < femRepresentation->getNumFemElements(); ++i) { auto fem = femRepresentation->getFemElement(i); EXPECT_DOUBLE_EQ(0.2, fem->getMassDensity()); EXPECT_DOUBLE_EQ(0.3, fem->getPoissonRatio()); EXPECT_DOUBLE_EQ(0.4, fem->getYoungModulus()); auto fem2DTriganle = std::dynamic_pointer_cast(fem); ASSERT_NE(nullptr, fem2DTriganle); EXPECT_DOUBLE_EQ(0.1, fem2DTriganle->getThickness()); } } TEST(Fem2DRepresentationTests, CreateLocalizationTest) { auto fem = std::make_shared("Representation"); auto runtime = std::make_shared("config.txt"); ASSERT_NO_THROW(fem->loadFem("PlyReaderTests/Fem2D.ply")); ASSERT_NO_THROW(ASSERT_TRUE(fem->initialize(runtime))); // Localization on an invalid node { SCOPED_TRACE("Invalid node"); SurgSim::DataStructures::Location location(1000); std::shared_ptr localization; EXPECT_THROW(localization = fem->createLocalization(location), SurgSim::Framework::AssertionFailure); } // Localization on a valid node { SCOPED_TRACE("Valid node"); SurgSim::DataStructures::Location location(0); std::shared_ptr localization; EXPECT_NO_THROW(localization = std::dynamic_pointer_cast(fem->createLocalization(location));); EXPECT_TRUE(localization != nullptr); EXPECT_TRUE(localization->getRepresentation() == fem); SurgSim::Math::Vector3d globalPosition; SurgSim::DataStructures::IndexedLocalCoordinate coordinate = localization->getLocalPosition(); EXPECT_NO_THROW(globalPosition = fem->getCurrentState()->getPosition(coordinate.index);); EXPECT_TRUE(globalPosition.isApprox(localization->calculatePosition())); } // In the 2d case, location of type triangle and element are the same and should behave the same. // Hence, we are testing both but factorizing the code. std::vector> locationTypesToTest; locationTypesToTest.push_back(std::make_pair(SurgSim::DataStructures::Location::TRIANGLE, "triangle")); locationTypesToTest.push_back(std::make_pair(SurgSim::DataStructures::Location::ELEMENT, "element")); for (auto const& locationPairTypeString : locationTypesToTest) { auto const& locationType = locationPairTypeString.first; SCOPED_TRACE("Location of type " + locationPairTypeString.second); // Localization on an invalid triangle/element { SCOPED_TRACE("Invalid triangle/element index"); Vector barycentricCoordinates = Vector::Zero(3); barycentricCoordinates[0] = 1.0; SurgSim::DataStructures::IndexedLocalCoordinate coord(10000, barycentricCoordinates); SurgSim::DataStructures::Location location(coord, locationType); std::shared_ptr localization; EXPECT_THROW(localization = fem->createLocalization(location), SurgSim::Framework::AssertionFailure); } // Localization on an valid triangle/element but invalid barycentric coordinate size { SCOPED_TRACE("Invalid triangle/element barycentric coordinate size"); Vector barycentricCoordinates = Vector::Zero(4); barycentricCoordinates[0] = 1.0; SurgSim::DataStructures::IndexedLocalCoordinate coord(0, barycentricCoordinates); SurgSim::DataStructures::Location location(coord, locationType); std::shared_ptr localization; EXPECT_THROW(localization = fem->createLocalization(location), SurgSim::Framework::AssertionFailure); } // Localization on an valid triangle/element but invalid barycentric coordinate { SCOPED_TRACE("Invalid triangle/element barycentric coordinate"); Vector barycentricCoordinates = Vector::Ones(3); SurgSim::DataStructures::IndexedLocalCoordinate coord(0, barycentricCoordinates); SurgSim::DataStructures::Location location(coord, locationType); std::shared_ptr localization; EXPECT_THROW(localization = fem->createLocalization(location), SurgSim::Framework::AssertionFailure); } // Localization on a valid triangle/element { SCOPED_TRACE("Valid triangle/element"); Vector barycentricCoordinates = Vector::Zero(3); barycentricCoordinates.setConstant(1.0 / 3.0); SurgSim::DataStructures::IndexedLocalCoordinate coord(0, barycentricCoordinates); SurgSim::DataStructures::Location location(coord, locationType); std::shared_ptr localization; EXPECT_NO_THROW(localization = std::dynamic_pointer_cast( fem->createLocalization(location))); EXPECT_TRUE(localization != nullptr); EXPECT_TRUE(localization->getRepresentation() == fem); SurgSim::DataStructures::IndexedLocalCoordinate coordinate = localization->getLocalPosition(); auto element = fem->getFemElement(coordinate.index); SurgSim::Math::Vector3d globalPosition = 1.0 / 3.0 * fem->getCurrentState()->getPosition(element->getNodeId(0)) + 1.0 / 3.0 * fem->getCurrentState()->getPosition(element->getNodeId(1)) + 1.0 / 3.0 * fem->getCurrentState()->getPosition(element->getNodeId(2)); EXPECT_TRUE(globalPosition.isApprox(localization->calculatePosition())); } } } TEST(Fem2DRepresentationTests, SerializationTest) { auto fem2DRepresentation = std::make_shared("Test-Fem2D"); auto runtime = std::make_shared("config.txt"); const std::string filename = "PlyReaderTests/Fem2D.ply"; fem2DRepresentation->loadFem(filename); auto collisionRepresentation = std::make_shared("Collision"); fem2DRepresentation->setCollisionRepresentation(collisionRepresentation); YAML::Node node; ASSERT_NO_THROW(node = YAML::convert::encode(*fem2DRepresentation)); EXPECT_TRUE(node.IsMap()); EXPECT_EQ(1u, node.size()); std::shared_ptr newRepresentation; ASSERT_NO_THROW(newRepresentation = std::dynamic_pointer_cast (node.as>())); ASSERT_NE(nullptr, newRepresentation); EXPECT_EQ("SurgSim::Physics::Fem2DRepresentation", newRepresentation->getClassName()); EXPECT_EQ(filename, newRepresentation->getFem()->getValue("FileName")); } } // namespace Physics } // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/UnitTests/Fem3DConstraintFixedPointTests.cpp000066400000000000000000000223531277777236100275620ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include #include "SurgSim/DataStructures/IndexedLocalCoordinate.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Math/MlcpConstraintType.h" #include "SurgSim/Math/OdeState.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/ConstraintData.h" #include "SurgSim/Physics/Representation.h" #include "SurgSim/Physics/Fem3DElementTetrahedron.h" #include "SurgSim/Physics/Fem3DLocalization.h" #include "SurgSim/Physics/Fem3DRepresentation.h" #include "SurgSim/Physics/FemConstraintFixedPoint.h" #include "SurgSim/Physics/UnitTests/EigenGtestAsserts.h" using SurgSim::Math::Vector3d; using SurgSim::Math::Vector4d; namespace { const double epsilon = 1e-10; const double dt = 1e-3; }; namespace SurgSim { namespace Physics { static std::shared_ptr getTetrahedron(size_t nodeId0, size_t nodeId1, size_t nodeId2, size_t nodeId3, double massDensity, double poissonRatio, double youngModulus) { std::array nodeIds = {{nodeId0, nodeId1, nodeId2, nodeId3}}; auto element = std::make_shared(nodeIds); element->setMassDensity(massDensity); element->setPoissonRatio(poissonRatio); element->setYoungModulus(youngModulus); return element; } static std::shared_ptr getFem3d(const std::string &name, double massDensity = 1.0, double poissonRatio = 0.1, double youngModulus = 1.0) { auto fem = std::make_shared(name); auto state = std::make_shared(); state->setNumDof(3, 6); state->getPositions().segment<3>(0 * 3) = Vector3d( 0.30, -0.57, 0.40); state->getPositions().segment<3>(1 * 3) = Vector3d( 0.06, 0.63, -0.32); state->getPositions().segment<3>(2 * 3) = Vector3d(-0.91, 0.72, 0.72); state->getPositions().segment<3>(3 * 3) = Vector3d( 0.35, 0.52, 0.50); state->getPositions().segment<3>(4 * 3) = Vector3d( 1.14, 0.66, 0.71); state->getPositions().segment<3>(5 * 3) = Vector3d( 1.02, -0.31, -0.54); fem->addFemElement(getTetrahedron(0, 1, 2, 3, massDensity, poissonRatio, youngModulus)); fem->addFemElement(getTetrahedron(0, 1, 3, 4, massDensity, poissonRatio, youngModulus)); fem->addFemElement(getTetrahedron(0, 1, 4, 5, massDensity, poissonRatio, youngModulus)); fem->setInitialState(state); fem->initialize(std::make_shared()); fem->wakeUp(); fem->setIsGravityEnabled(false); fem->beforeUpdate(dt); fem->update(dt); return fem; } TEST(Fem3DConstraintFixedPointTests, Constructor) { ASSERT_NO_THROW( { FemConstraintFixedPoint constraint; }); } TEST(Fem3DConstraintFixedPointTests, Constants) { FemConstraintFixedPoint constraint; EXPECT_EQ(SurgSim::Physics::FIXED_3DPOINT, constraint.getConstraintType()); EXPECT_EQ(3u, constraint.getNumDof()); } TEST(Fem3DConstraintFixedPointTests, BuildMlcpBasic) { // Whitebox test which validates ConstraintImplementation::build's output parameter, MlcpPhysicsProblem. It assumes // CHt and HCHt can be correctly built given H, so it does not necessarily construct the physical parameters // necessary to supply a realistic C. It only checks H and b. FemConstraintFixedPoint constraint; Vector3d actual; // Setup parameters for FemConstraintFixedPoint::build auto localization = std::make_shared(getFem3d("representation"), SurgSim::DataStructures::IndexedLocalCoordinate(2u, Vector4d(0.0, 0.0, 1.0, 0.0))); actual = localization->calculatePosition(); MlcpPhysicsProblem mlcpPhysicsProblem = MlcpPhysicsProblem::Zero(18, 3, 1); ConstraintData emptyConstraint; ASSERT_NO_THROW(constraint.build( dt, emptyConstraint, localization, &mlcpPhysicsProblem, 0, 0, SurgSim::Physics::CONSTRAINT_POSITIVE_SIDE)); // Compare results Eigen::Matrix violation = actual; EXPECT_NEAR_EIGEN(violation, mlcpPhysicsProblem.b, epsilon); Eigen::Matrix H = Eigen::Matrix::Zero(); Eigen::Matrix identity = Eigen::Matrix::Identity(); SurgSim::Math::setSubMatrix(1.0 * dt * identity, 0, 4, 3, 3, &H); // This weight is on node 4 (tetId 2, nodeId 2) EXPECT_NEAR_EIGEN(H, mlcpPhysicsProblem.H, epsilon); EXPECT_EQ(0u, mlcpPhysicsProblem.constraintTypes.size()); } TEST(Fem3DConstraintFixedPointTests, BuildMlcp) { // Whitebox test which validates ConstraintImplementation::build's output parameter, MlcpPhysicsProblem. It assumes // CHt and HCHt can be correctly built given H, so it does not necessarily construct the physical parameters // necessary to supply a realistic C. It only checks H and b. FemConstraintFixedPoint constraint; Vector3d actual; // Setup parameters for FemConstraintFixedPoint::build auto localization = std::make_shared(getFem3d("representation"), SurgSim::DataStructures::IndexedLocalCoordinate(2u, Vector4d(0.11, 0.02, 0.33, 0.54))); actual = localization->calculatePosition(); MlcpPhysicsProblem mlcpPhysicsProblem = MlcpPhysicsProblem::Zero(18, 3, 1); ConstraintData emptyConstraint; ASSERT_NO_THROW(constraint.build( dt, emptyConstraint, localization, &mlcpPhysicsProblem, 0, 0, SurgSim::Physics::CONSTRAINT_POSITIVE_SIDE)); // Compare results Eigen::Matrix violation = actual; EXPECT_NEAR_EIGEN(violation, mlcpPhysicsProblem.b, epsilon); Eigen::Matrix H = Eigen::Matrix::Zero(); Eigen::Matrix identity = Eigen::Matrix::Identity(); SurgSim::Math::setSubMatrix(0.11 * dt * identity, 0, 0, 3, 3, &H); // This weight is on node 0 (tetId 2, nodeId 0) SurgSim::Math::setSubMatrix(0.02 * dt * identity, 0, 1, 3, 3, &H); // This weight is on node 1 (tetId 2, nodeId 1) SurgSim::Math::setSubMatrix(0.33 * dt * identity, 0, 4, 3, 3, &H); // This weight is on node 4 (tetId 2, nodeId 2) SurgSim::Math::setSubMatrix(0.54 * dt * identity, 0, 5, 3, 3, &H); // This weight is on node 5 (tetId 2, nodeId 3) EXPECT_NEAR_EIGEN(H, mlcpPhysicsProblem.H, epsilon); EXPECT_EQ(0u, mlcpPhysicsProblem.constraintTypes.size()); } TEST(Fem3DConstraintFixedPointTests, BuildMlcpTwoStep) { // Whitebox test which validates ConstraintImplementation::build's output parameter, MlcpPhysicsProblem. It assumes // CHt and HCHt can be correctly built given H, so it does not necessarily construct the physical parameters // necessary to supply a realistic C. It only checks H and b. FemConstraintFixedPoint constraint; Vector3d actual; Vector3d desired; // Setup parameters for FemConstraintFixedPoint::build MlcpPhysicsProblem mlcpPhysicsProblem = MlcpPhysicsProblem::Zero(18, 3, 1); ConstraintData emptyConstraint; auto localization = std::make_shared(getFem3d("representation"), SurgSim::DataStructures::IndexedLocalCoordinate(2u, Vector4d(0.11, 0.02, 0.33, 0.54))); actual = localization->calculatePosition(); ASSERT_NO_THROW(constraint.build( dt, emptyConstraint, localization, &mlcpPhysicsProblem, 0, 0, SurgSim::Physics::CONSTRAINT_POSITIVE_SIDE)); localization->setLocalPosition( SurgSim::DataStructures::IndexedLocalCoordinate(1u, Vector4d(0.32, 0.05, 0.14, 0.49))); desired = localization->calculatePosition(); ASSERT_NO_THROW(constraint.build( dt, emptyConstraint, localization, &mlcpPhysicsProblem, 0, 0, SurgSim::Physics::CONSTRAINT_NEGATIVE_SIDE)); // Compare results Eigen::Matrix violation = actual - desired; EXPECT_NEAR_EIGEN(violation, mlcpPhysicsProblem.b, epsilon); Eigen::Matrix H = Eigen::Matrix::Zero(); Eigen::Matrix identity = Eigen::Matrix::Identity(); SurgSim::Math::addSubMatrix( 0.11 * dt * identity, 0, 0, 3, 3, &H); // This weight is on node 0 (tetId 2, nodeId 0) SurgSim::Math::addSubMatrix( 0.02 * dt * identity, 0, 1, 3, 3, &H); // This weight is on node 1 (tetId 2, nodeId 1) SurgSim::Math::addSubMatrix( 0.33 * dt * identity, 0, 4, 3, 3, &H); // This weight is on node 4 (tetId 2, nodeId 2) SurgSim::Math::addSubMatrix( 0.54 * dt * identity, 0, 5, 3, 3, &H); // This weight is on node 5 (tetId 2, nodeId 3) SurgSim::Math::addSubMatrix(-0.32 * dt * identity, 0, 0, 3, 3, &H); // This weight is on node 0 (tetId 1, nodeId 0) SurgSim::Math::addSubMatrix(-0.05 * dt * identity, 0, 1, 3, 3, &H); // This weight is on node 1 (tetId 1, nodeId 1) SurgSim::Math::addSubMatrix(-0.14 * dt * identity, 0, 3, 3, 3, &H); // This weight is on node 3 (tetId 1, nodeId 2) SurgSim::Math::addSubMatrix(-0.49 * dt * identity, 0, 4, 3, 3, &H); // This weight is on node 4 (tetId 1, nodeId 3) EXPECT_NEAR_EIGEN(H, mlcpPhysicsProblem.H, epsilon); } }; // namespace Physics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/UnitTests/Fem3DConstraintFrictionalSlidingTests.cpp000066400000000000000000000305231277777236100311130ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Math/LinearSparseSolveAndInverse.h" #include "SurgSim/Math/OdeState.h" #include "SurgSim/Math/SparseMatrix.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/Fem3DElementTetrahedron.h" #include "SurgSim/Physics/Fem3DLocalization.h" #include "SurgSim/Physics/Fem3DRepresentation.h" #include "SurgSim/Physics/FemConstraintFrictionalSliding.h" #include "SurgSim/Physics/MlcpPhysicsProblem.h" #include "SurgSim/Physics/SlidingConstraintData.h" #include "SurgSim/Physics/UnitTests/EigenGtestAsserts.h" using SurgSim::DataStructures::IndexedLocalCoordinate; using SurgSim::Framework::Runtime; using SurgSim::Physics::Fem3DRepresentation; using SurgSim::Physics::FemConstraintFrictionalSliding; using SurgSim::Physics::Fem3DLocalization; using SurgSim::Physics::Fem3DElementTetrahedron; using SurgSim::Physics::MlcpPhysicsProblem; using SurgSim::Physics::SlidingConstraintData; using SurgSim::Math::Vector3d; using SurgSim::Math::Vector4d; namespace { const double epsilon = 1e-10; const double dt = 1e-3; }; static void addTetrahedron(Fem3DRepresentation* fem, size_t node0, size_t node1, size_t node2, size_t node3, double massDensity = 1.0, double poissonRatio = 0.1, double youngModulus = 1.0) { std::array nodes = {node0, node1, node2, node3}; auto element = std::make_shared(nodes); element->setMassDensity(massDensity); element->setPoissonRatio(poissonRatio); element->setYoungModulus(youngModulus); fem->addFemElement(element); } class Fem3DConstraintFrictionalSlidingTests : public ::testing::Test { public: void SetUp() { // Define plane with normal 'n' pointing against gravity. m_slidingDirection = Vector3d(0.8539, 0.6289, -0.9978); m_slidingDirection.normalize(); // Create mock FEM m_fem = std::make_shared("Fem2dRepresentation"); auto state = std::make_shared(); state->setNumDof(3, 6); // Place coordinates at // ( 0.00, 0.00, 0.00) + (0.24, -0.43, 0.55) + ( 0.06, -0.14, -0.15) = ( 0.30, -0.57, 0.40) // ( 0.00, 1.00, -1.00) + (0.24, -0.43, 0.55) + (-0.18, 0.06, 0.13) = ( 0.06, 0.63, -0.32) // (-1.00, 1.00, 0.00) + (0.24, -0.43, 0.55) + (-0.15, 0.15, 0.17) = (-0.91, 0.72, 0.72) // ( 0.00, 1.00, 0.00) + (0.24, -0.43, 0.55) + ( 0.11, -0.05, -0.05) = ( 0.35, 0.52, 0.50) // ( 1.00, 1.00, 0.00) + (0.24, -0.43, 0.55) + (-0.10, 0.09, 0.16) = ( 1.14, 0.66, 0.71) // ( 1.00, 0.00, -1.00) + (0.24, -0.43, 0.55) + (-0.22, 0.12, -0.09) = ( 1.02, -0.31, -0.54) state->getPositions().segment<3>(0 * 3) = Vector3d(0.30, -0.57, 0.40); state->getPositions().segment<3>(1 * 3) = Vector3d(0.06, 0.63, -0.32); state->getPositions().segment<3>(2 * 3) = Vector3d(-0.91, 0.72, 0.72); state->getPositions().segment<3>(3 * 3) = Vector3d(0.35, 0.52, 0.50); state->getPositions().segment<3>(4 * 3) = Vector3d(1.14, 0.66, 0.71); state->getPositions().segment<3>(5 * 3) = Vector3d(1.02, -0.31, -0.54); addTetrahedron(m_fem.get(), 0, 1, 2, 3); addTetrahedron(m_fem.get(), 0, 1, 3, 4); addTetrahedron(m_fem.get(), 0, 1, 4, 5); m_fem->setInitialState(state); m_fem->setIntegrationScheme(SurgSim::Math::IntegrationScheme::INTEGRATIONSCHEME_EULER_EXPLICIT_MODIFIED); m_fem->setLocalActive(true); m_fem->initialize(std::make_shared()); m_fem->wakeUp(); // Update model by one timestep m_fem->beforeUpdate(dt); m_fem->update(dt); } void setSlidingConstraintAt(const IndexedLocalCoordinate& coord) { m_localization = std::make_shared(m_fem, coord); m_constraintData.setSlidingDirection(m_localization->calculatePosition(0.0), m_slidingDirection); } std::shared_ptr m_fem; std::shared_ptr m_localization; Vector3d m_slidingDirection; SlidingConstraintData m_constraintData; }; TEST_F(Fem3DConstraintFrictionalSlidingTests, ConstructorTest) { ASSERT_NO_THROW( { FemConstraintFrictionalSliding femContact; }); } TEST_F(Fem3DConstraintFrictionalSlidingTests, ConstraintConstantsTest) { auto implementation = std::make_shared(); EXPECT_EQ(SurgSim::Physics::FRICTIONAL_SLIDING, implementation->getConstraintType()); EXPECT_EQ(3u, implementation->getNumDof()); } TEST_F(Fem3DConstraintFrictionalSlidingTests, BuildMlcpTest) { // This test verifies the build mlcp function works for a simple case. auto implementation = std::make_shared(); // Initialize MLCP MlcpPhysicsProblem mlcpPhysicsProblem = MlcpPhysicsProblem::Zero(m_fem->getNumDof(), 3, 1); // Apply constraint purely to the first node of the 0th tetrahedron. IndexedLocalCoordinate coord(0, Vector4d(1.0, 0.0, 0.0, 0.0)); setSlidingConstraintAt(coord); implementation->build(dt, m_constraintData, m_localization, &mlcpPhysicsProblem, 0, 0, SurgSim::Physics::CONSTRAINT_POSITIVE_SIDE); Eigen::Matrix H = Eigen::Matrix::Zero(); H.block<1, 3>(0, 0) = (dt * m_constraintData.getNormals()[0]).eval(); H.block<1, 3>(1, 0) = (dt * m_constraintData.getNormals()[1]).eval(); H.block<1, 3>(2, 0) = (dt * m_slidingDirection).eval(); EXPECT_NEAR_EIGEN(H, mlcpPhysicsProblem.H, epsilon); // C = dt * m^{-1} m_fem->updateFMDK(*(m_fem->getPreviousState()), SurgSim::Math::ODEEQUATIONUPDATE_M); Eigen::Matrix C = dt * m_fem->getM().toDense().inverse(); EXPECT_NEAR_EIGEN(C * H.transpose(), mlcpPhysicsProblem.CHt, epsilon); EXPECT_NEAR_EIGEN(H * C * H.transpose(), mlcpPhysicsProblem.A, epsilon); EXPECT_DOUBLE_EQ(0.5, mlcpPhysicsProblem.mu[0]); EXPECT_EQ(0u, mlcpPhysicsProblem.constraintTypes.size()); } TEST_F(Fem3DConstraintFrictionalSlidingTests, BuildMlcpCoordinateTest) { // This test verifies the build mlcp function works for a more complicated case with different nodes. auto implementation = std::make_shared(); // Initialize MLCP MlcpPhysicsProblem mlcpPhysicsProblem = MlcpPhysicsProblem::Zero(m_fem->getNumDof(), 3, 1); // Apply constraint to the four nodes of the 0th tetrahedron. auto barycentric = Vector4d(0.25, 0.33, 0.28, 0.14); IndexedLocalCoordinate coord(0, barycentric); setSlidingConstraintAt(coord); implementation->build(dt, m_constraintData, m_localization, &mlcpPhysicsProblem, 0, 0, SurgSim::Physics::CONSTRAINT_POSITIVE_SIDE); Eigen::Matrix H = Eigen::Matrix::Zero(); H.block<1, 3>(0, 0) = (barycentric[0] * dt * m_constraintData.getNormals()[0]).eval(); H.block<1, 3>(1, 0) = (barycentric[0] * dt * m_constraintData.getNormals()[1]).eval(); H.block<1, 3>(2, 0) = (barycentric[0] * dt * m_slidingDirection).eval(); H.block<1, 3>(0, 3) = (barycentric[1] * dt * m_constraintData.getNormals()[0]).eval(); H.block<1, 3>(1, 3) = (barycentric[1] * dt * m_constraintData.getNormals()[1]).eval(); H.block<1, 3>(2, 3) = (barycentric[1] * dt * m_slidingDirection).eval(); H.block<1, 3>(0, 6) = (barycentric[2] * dt * m_constraintData.getNormals()[0]).eval(); H.block<1, 3>(1, 6) = (barycentric[2] * dt * m_constraintData.getNormals()[1]).eval(); H.block<1, 3>(2, 6) = (barycentric[2] * dt * m_slidingDirection).eval(); H.block<1, 3>(0, 9) = (barycentric[3] * dt * m_constraintData.getNormals()[0]).eval(); H.block<1, 3>(1, 9) = (barycentric[3] * dt * m_constraintData.getNormals()[1]).eval(); H.block<1, 3>(2, 9) = (barycentric[3] * dt * m_slidingDirection).eval(); EXPECT_NEAR_EIGEN(H, mlcpPhysicsProblem.H, epsilon); // C = dt * m^{-1} m_fem->updateFMDK(*(m_fem->getPreviousState()), SurgSim::Math::ODEEQUATIONUPDATE_M); Eigen::Matrix C = dt * m_fem->getM().toDense().inverse(); EXPECT_NEAR_EIGEN(C * H.transpose(), mlcpPhysicsProblem.CHt, epsilon); EXPECT_NEAR_EIGEN(H * C * H.transpose(), mlcpPhysicsProblem.A, epsilon); EXPECT_DOUBLE_EQ(0.5, mlcpPhysicsProblem.mu[0]); EXPECT_EQ(0u, mlcpPhysicsProblem.constraintTypes.size()); } TEST_F(Fem3DConstraintFrictionalSlidingTests, BuildMlcpIndiciesTest) { // This test verifies the build mlcp function works given a hypothetical, preexisting mlcp problem. auto implementation = std::make_shared(); // Initialize MLCP MlcpPhysicsProblem mlcpPhysicsProblem = MlcpPhysicsProblem::Zero(m_fem->getNumDof() + 5, 4, 2); // Suppose 5 dof and 1 constraint are defined elsewhere. Then H, CHt, HCHt, and b are prebuilt. Eigen::SparseVector localH; localH.resize(5); localH.reserve(5); localH.insert(0) = 0.9478; localH.insert(1) = -0.3807; localH.insert(2) = 0.5536; localH.insert(3) = -0.6944; localH.insert(4) = 0.1815; mlcpPhysicsProblem.H.coeffRef(0, 0) += localH.coeff(0); mlcpPhysicsProblem.H.coeffRef(0, 1) += localH.coeff(1); mlcpPhysicsProblem.H.coeffRef(0, 2) += localH.coeff(2); mlcpPhysicsProblem.H.coeffRef(0, 3) += localH.coeff(3); mlcpPhysicsProblem.H.coeffRef(0, 4) += localH.coeff(4); Eigen::Matrix localC; localC << -0.2294, 0.5160, 0.2520, 0.5941, -0.4854, 0.1233, -0.4433, 0.3679, 0.9307, 0.2600, 0.1988, 0.6637, -0.7591, 0.1475, 0.8517, -0.5495, -0.4305, 0.3162, -0.7862, 0.7627, -0.5754, 0.4108, 0.8445, -0.5565, 0.7150; localC = localC * localC.transpose(); // force to be symmetric Eigen::Matrix localCHt = localC * localH.transpose(); mlcpPhysicsProblem.CHt.block<5, 1>(0, 0) = localCHt; mlcpPhysicsProblem.A.block<1, 1>(0, 0) = localH * localCHt; mlcpPhysicsProblem.b.block<1, 1>(0, 0)[0] = 0.6991; // Place the Fem at 5th dof (1 or multiple representations exist before, covering a total of 5 dof) // and the constraint at the index 1 (1 atomic constraint exists before this one) size_t indexOfRepresentation = 5; size_t indexOfConstraint = 1; // Apply constraint to the four nodes of the 0th tetrahedron auto barycentric = Vector4d(0.25, 0.33, 0.28, 0.14); IndexedLocalCoordinate coord(0, barycentric); setSlidingConstraintAt(coord); implementation->build(dt, m_constraintData, m_localization, &mlcpPhysicsProblem, indexOfRepresentation, indexOfConstraint, SurgSim::Physics::CONSTRAINT_POSITIVE_SIDE); Eigen::Matrix H = Eigen::Matrix::Zero(); H.block<1, 3>(0, 0) = (barycentric[0] * dt * m_constraintData.getNormals()[0]).eval(); H.block<1, 3>(1, 0) = (barycentric[0] * dt * m_constraintData.getNormals()[1]).eval(); H.block<1, 3>(2, 0) = (barycentric[0] * dt * m_slidingDirection).eval(); H.block<1, 3>(0, 3) = (barycentric[1] * dt * m_constraintData.getNormals()[0]).eval(); H.block<1, 3>(1, 3) = (barycentric[1] * dt * m_constraintData.getNormals()[1]).eval(); H.block<1, 3>(2, 3) = (barycentric[1] * dt * m_slidingDirection).eval(); H.block<1, 3>(0, 6) = (barycentric[2] * dt * m_constraintData.getNormals()[0]).eval(); H.block<1, 3>(1, 6) = (barycentric[2] * dt * m_constraintData.getNormals()[1]).eval(); H.block<1, 3>(2, 6) = (barycentric[2] * dt * m_slidingDirection).eval(); H.block<1, 3>(0, 9) = (barycentric[3] * dt * m_constraintData.getNormals()[0]).eval(); H.block<1, 3>(1, 9) = (barycentric[3] * dt * m_constraintData.getNormals()[1]).eval(); H.block<1, 3>(2, 9) = (barycentric[3] * dt * m_slidingDirection).eval(); EXPECT_NEAR_EIGEN(H, mlcpPhysicsProblem.H.block(indexOfConstraint, indexOfRepresentation, 3, 18), epsilon); m_fem->updateFMDK(*(m_fem->getPreviousState()), SurgSim::Math::ODEEQUATIONUPDATE_M); Eigen::Matrix C = dt * m_fem->getM().toDense().inverse(); EXPECT_NEAR_EIGEN( C * H.transpose(), mlcpPhysicsProblem.CHt.block(indexOfRepresentation, indexOfConstraint, 18, 3), epsilon); EXPECT_NEAR_EIGEN( H * C * H.transpose(), mlcpPhysicsProblem.A.block(indexOfConstraint, indexOfConstraint, 3, 3), epsilon); EXPECT_DOUBLE_EQ(0.5, mlcpPhysicsProblem.mu[1]); EXPECT_EQ(0u, mlcpPhysicsProblem.constraintTypes.size()); } opensurgsim-0.7.0/SurgSim/Physics/UnitTests/Fem3DConstraintFrictionlessContactTests.cpp000066400000000000000000000300521277777236100314640ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Math/LinearSparseSolveAndInverse.h" #include "SurgSim/Math/OdeState.h" #include "SurgSim/Math/SparseMatrix.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/ContactConstraintData.h" #include "SurgSim/Physics/Fem3DElementTetrahedron.h" #include "SurgSim/Physics/Fem3DLocalization.h" #include "SurgSim/Physics/Fem3DRepresentation.h" #include "SurgSim/Physics/FemConstraintFrictionlessContact.h" #include "SurgSim/Physics/MlcpPhysicsProblem.h" #include "SurgSim/Physics/UnitTests/EigenGtestAsserts.h" using SurgSim::DataStructures::IndexedLocalCoordinate; using SurgSim::Framework::Runtime; using SurgSim::Physics::ContactConstraintData; using SurgSim::Physics::Fem3DRepresentation; using SurgSim::Physics::FemConstraintFrictionlessContact; using SurgSim::Physics::Fem3DLocalization; using SurgSim::Physics::Fem3DElementTetrahedron; using SurgSim::Physics::MlcpPhysicsProblem; using SurgSim::Math::Vector3d; using SurgSim::Math::Vector4d; namespace { const double epsilon = 1e-10; const double dt = 1e-3; const double mlcpPrecision = 1e-04; }; static void addTetraheadron(Fem3DRepresentation* fem, size_t node0, size_t node1, size_t node2, size_t node3, double massDensity = 1.0, double poissonRatio = 0.1, double youngModulus = 1.0) { std::array nodes = {node0, node1, node2, node3}; auto element = std::make_shared(nodes); element->setMassDensity(massDensity); element->setPoissonRatio(poissonRatio); element->setYoungModulus(youngModulus); fem->addFemElement(element); } class Fem3DConstraintFrictionlessContactTests : public ::testing::Test { public: void SetUp() { // Define plane with normal 'n' pointing against gravity. m_n = Vector3d(0.8539, 0.6289, -0.9978); m_n.normalize(); // Create mock FEM m_fem = std::make_shared("Fem3dRepresentation"); auto state = std::make_shared(); state->setNumDof(3, 6); // Place coordinates at // ( 0.00, 0.00, 0.00) + (0.24, -0.43, 0.55) + ( 0.06, -0.14, -0.15) = ( 0.30, -0.57, 0.40) // ( 0.00, 1.00, -1.00) + (0.24, -0.43, 0.55) + (-0.18, 0.06, 0.13) = ( 0.06, 0.63, -0.32) // (-1.00, 1.00, 0.00) + (0.24, -0.43, 0.55) + (-0.15, 0.15, 0.17) = (-0.91, 0.72, 0.72) // ( 0.00, 1.00, 0.00) + (0.24, -0.43, 0.55) + ( 0.11, -0.05, -0.05) = ( 0.35, 0.52, 0.50) // ( 1.00, 1.00, 0.00) + (0.24, -0.43, 0.55) + (-0.10, 0.09, 0.16) = ( 1.14, 0.66, 0.71) // ( 1.00, 0.00, -1.00) + (0.24, -0.43, 0.55) + (-0.22, 0.12, -0.09) = ( 1.02, -0.31, -0.54) state->getPositions().segment<3>(0 * 3) = Vector3d(0.30, -0.57, 0.40); state->getPositions().segment<3>(1 * 3) = Vector3d(0.06, 0.63, -0.32); state->getPositions().segment<3>(2 * 3) = Vector3d(-0.91, 0.72, 0.72); state->getPositions().segment<3>(3 * 3) = Vector3d(0.35, 0.52, 0.50); state->getPositions().segment<3>(4 * 3) = Vector3d(1.14, 0.66, 0.71); state->getPositions().segment<3>(5 * 3) = Vector3d(1.02, -0.31, -0.54); addTetraheadron(m_fem.get(), 0, 1, 2, 3); addTetraheadron(m_fem.get(), 0, 1, 3, 4); addTetraheadron(m_fem.get(), 0, 1, 4, 5); m_fem->setInitialState(state); m_fem->setIntegrationScheme(SurgSim::Math::IntegrationScheme::INTEGRATIONSCHEME_EULER_EXPLICIT_MODIFIED); m_fem->setLocalActive(true); m_fem->initialize(std::make_shared()); m_fem->wakeUp(); // Update model by one timestep m_fem->beforeUpdate(dt); m_fem->update(dt); } void setContactAt(const IndexedLocalCoordinate& coord) { m_coord = coord; m_localization = std::make_shared(m_fem, m_coord); // Calculate position at state before "m_fem->update(dt)" was called. double distance = -m_localization->calculatePosition(0.0).dot(m_n); m_constraintData.setPlaneEquation(m_n, distance); } std::shared_ptr m_fem; std::shared_ptr m_localization; IndexedLocalCoordinate m_coord; Vector3d m_n; ContactConstraintData m_constraintData; }; TEST_F(Fem3DConstraintFrictionlessContactTests, ConstructorTest) { ASSERT_NO_THROW( { FemConstraintFrictionlessContact femContact; }); } TEST_F(Fem3DConstraintFrictionlessContactTests, ConstraintConstantsTest) { auto implementation = std::make_shared(); EXPECT_EQ(SurgSim::Physics::FRICTIONLESS_3DCONTACT, implementation->getConstraintType()); EXPECT_EQ(1u, implementation->getNumDof()); } TEST_F(Fem3DConstraintFrictionlessContactTests, BuildMlcpTest) { // This test verifies the build mlcp function works for a simple case. auto implementation = std::make_shared(); // Initialize MLCP MlcpPhysicsProblem mlcpPhysicsProblem = MlcpPhysicsProblem::Zero(m_fem->getNumDof(), 1, 1); // Apply constraint purely to the first node of the 0th tetrahedron. IndexedLocalCoordinate coord(0, Vector4d(1.0, 0.0, 0.0, 0.0)); setContactAt(coord); implementation->build(dt, m_constraintData, m_localization, &mlcpPhysicsProblem, 0, 0, SurgSim::Physics::CONSTRAINT_POSITIVE_SIDE); const Vector3d newPosition = Vector3d(0.30, -0.57, 0.40) - Vector3d::UnitY() * 9.81 * dt * dt; EXPECT_NEAR(newPosition.dot(m_n), mlcpPhysicsProblem.b[0] + mlcpPrecision, epsilon); Eigen::Matrix H = Eigen::Matrix::Zero(); SurgSim::Math::setSubVector(dt * m_n, 0, 3, &H); EXPECT_NEAR_EIGEN(H, mlcpPhysicsProblem.H, epsilon); // C = dt * m^{-1} m_fem->updateFMDK(*(m_fem->getPreviousState()), SurgSim::Math::ODEEQUATIONUPDATE_M); Eigen::Matrix denseMat = m_fem->getM(); Eigen::Matrix C = dt * denseMat.inverse(); EXPECT_NEAR_EIGEN(C * H.transpose(), mlcpPhysicsProblem.CHt, epsilon); EXPECT_NEAR_EIGEN(H * C * H.transpose(), mlcpPhysicsProblem.A, epsilon); EXPECT_EQ(0u, mlcpPhysicsProblem.constraintTypes.size()); } TEST_F(Fem3DConstraintFrictionlessContactTests, BuildMlcpCoordinateTest) { // This test verifies the build mlcp function works for a more complicated case with different nodes. auto implementation = std::make_shared(); // Initialize MLCP MlcpPhysicsProblem mlcpPhysicsProblem = MlcpPhysicsProblem::Zero(m_fem->getNumDof(), 1, 1); // Apply constraint to all nodes of an fem. const Vector4d barycentric = Vector4d(0.25, 0.33, 0.28, 0.14); IndexedLocalCoordinate coord(1, barycentric); setContactAt(coord); implementation->build(dt, m_constraintData, m_localization, &mlcpPhysicsProblem, 0, 0, SurgSim::Physics::CONSTRAINT_POSITIVE_SIDE); const Vector3d newPosition = (Vector3d(0.30, -0.57, 0.40) * barycentric[0] + Vector3d(0.06, 0.63, -0.32) * barycentric[1] + Vector3d(0.35, 0.52, 0.50) * barycentric[2] + Vector3d(1.14, 0.66, 0.71) * barycentric[3]) - Vector3d::UnitY() * 9.81 * dt * dt; EXPECT_NEAR(newPosition.dot(m_n), mlcpPhysicsProblem.b[0] + mlcpPrecision, epsilon); Eigen::Matrix H = Eigen::Matrix::Zero(); SurgSim::Math::setSubVector(0.25 * dt * m_n, 0, 3, &H); SurgSim::Math::setSubVector(0.33 * dt * m_n, 1, 3, &H); SurgSim::Math::setSubVector(0.28 * dt * m_n, 3, 3, &H); SurgSim::Math::setSubVector(0.14 * dt * m_n, 4, 3, &H); EXPECT_NEAR_EIGEN(H, mlcpPhysicsProblem.H, epsilon); // C = dt * m^{-1} SurgSim::Math::Matrix C; SurgSim::Math::SparseMatrix M(18, 18); m_fem->updateFMDK(*(m_fem->getPreviousState()), SurgSim::Math::ODEEQUATIONUPDATE_M); M = m_fem->getM(); SurgSim::Math::LinearSparseSolveAndInverseLU solver; SurgSim::Math::Vector b = SurgSim::Math::Vector::Zero(18); solver.setMatrix(M); C = solver.getInverse(); C *= dt; EXPECT_NEAR_EIGEN(C * H.transpose(), mlcpPhysicsProblem.CHt, epsilon); EXPECT_NEAR_EIGEN(H * C * H.transpose(), mlcpPhysicsProblem.A, epsilon); EXPECT_EQ(0u, mlcpPhysicsProblem.constraintTypes.size()); } TEST_F(Fem3DConstraintFrictionlessContactTests, BuildMlcpIndiciesTest) { // This test verifies the build mlcp function works given a hypothetical, preexisting mlcp problem. auto implementation = std::make_shared(); // Initialize MLCP MlcpPhysicsProblem mlcpPhysicsProblem = MlcpPhysicsProblem::Zero(m_fem->getNumDof() + 5, 2, 1); // Suppose 5 dof and 1 constraint are defined elsewhere. Then H, CHt, HCHt, and b are prebuilt. Eigen::SparseVector localH; localH.resize(5); localH.reserve(5); localH.insert(0) = 0.9478; localH.insert(1) = -0.3807; localH.insert(2) = 0.5536; localH.insert(3) = -0.6944; localH.insert(4) = 0.1815; mlcpPhysicsProblem.H.coeffRef(0, 0) += localH.coeff(0); mlcpPhysicsProblem.H.coeffRef(0, 1) += localH.coeff(1); mlcpPhysicsProblem.H.coeffRef(0, 2) += localH.coeff(2); mlcpPhysicsProblem.H.coeffRef(0, 3) += localH.coeff(3); mlcpPhysicsProblem.H.coeffRef(0, 4) += localH.coeff(4); Eigen::Matrix localC; localC << -0.2294, 0.5160, 0.2520, 0.5941, -0.4854, 0.1233, -0.4433, 0.3679, 0.9307, 0.2600, 0.1988, 0.6637, -0.7591, 0.1475, 0.8517, -0.5495, -0.4305, 0.3162, -0.7862, 0.7627, -0.5754, 0.4108, 0.8445, -0.5565, 0.7150; localC = localC * localC.transpose(); // force to be symmetric Eigen::Matrix localCHt = localC * localH.transpose(); mlcpPhysicsProblem.CHt.block<5, 1>(0, 0) = localCHt; mlcpPhysicsProblem.A.block<1, 1>(0, 0) = localH * localCHt; mlcpPhysicsProblem.b.block<1, 1>(0, 0)[0] = 0.6991; // Place the Fem at 5th dof (1 or multiple representations exist before, covering a total of 5 dof) // and the constraint at the index 1 (1 atomic constraint exists before this one) size_t indexOfRepresentation = 5; size_t indexOfConstraint = 1; // Apply constraint to all nodes of an fem. const Vector4d barycentric = Vector4d(0.25, 0.33, 0.28, 0.14); IndexedLocalCoordinate coord(1, barycentric); setContactAt(coord); implementation->build(dt, m_constraintData, m_localization, &mlcpPhysicsProblem, indexOfRepresentation, indexOfConstraint, SurgSim::Physics::CONSTRAINT_POSITIVE_SIDE); const Vector3d newPosition = (Vector3d(0.30, -0.57, 0.40) * barycentric[0] + Vector3d(0.06, 0.63, -0.32) * barycentric[1] + Vector3d(0.35, 0.52, 0.50) * barycentric[2] + Vector3d(1.14, 0.66, 0.71) * barycentric[3]) - Vector3d::UnitY() * 9.81 * dt * dt; EXPECT_NEAR(newPosition.dot(m_n), mlcpPhysicsProblem.b[indexOfConstraint] + mlcpPrecision, epsilon); Eigen::Matrix H = Eigen::Matrix::Zero(); SurgSim::Math::setSubVector(0.25 * dt * m_n, 0, 3, &H); SurgSim::Math::setSubVector(0.33 * dt * m_n, 1, 3, &H); SurgSim::Math::setSubVector(0.28 * dt * m_n, 3, 3, &H); SurgSim::Math::setSubVector(0.14 * dt * m_n, 4, 3, &H); EXPECT_NEAR_EIGEN(H, mlcpPhysicsProblem.H.block(indexOfConstraint, indexOfRepresentation, 1, 18), epsilon); SurgSim::Math::Matrix C; SurgSim::Math::SparseMatrix M(18, 18); m_fem->updateFMDK(*m_fem->getPreviousState(), SurgSim::Math::ODEEQUATIONUPDATE_M); M = m_fem->getM(); SurgSim::Math::LinearSparseSolveAndInverseLU solver; SurgSim::Math::Vector b = SurgSim::Math::Vector::Zero(18); solver.setMatrix(M); C = solver.getInverse(); C *= dt; EXPECT_NEAR_EIGEN( C * H.transpose(), mlcpPhysicsProblem.CHt.block(indexOfRepresentation, indexOfConstraint, 18, 1), epsilon); EXPECT_NEAR_EIGEN( H * C * H.transpose(), mlcpPhysicsProblem.A.block(indexOfConstraint, indexOfConstraint, 1, 1), epsilon); EXPECT_EQ(0u, mlcpPhysicsProblem.constraintTypes.size()); } opensurgsim-0.7.0/SurgSim/Physics/UnitTests/Fem3DConstraintFrictionlessSlidingTests.cpp000066400000000000000000000310231277777236100314610ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Math/LinearSparseSolveAndInverse.h" #include "SurgSim/Math/OdeState.h" #include "SurgSim/Math/SparseMatrix.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/Fem3DElementTetrahedron.h" #include "SurgSim/Physics/Fem3DLocalization.h" #include "SurgSim/Physics/Fem3DRepresentation.h" #include "SurgSim/Physics/FemConstraintFrictionlessSliding.h" #include "SurgSim/Physics/MlcpPhysicsProblem.h" #include "SurgSim/Physics/SlidingConstraintData.h" #include "SurgSim/Physics/UnitTests/EigenGtestAsserts.h" using SurgSim::DataStructures::IndexedLocalCoordinate; using SurgSim::Framework::Runtime; using SurgSim::Physics::Fem3DRepresentation; using SurgSim::Physics::FemConstraintFrictionlessSliding; using SurgSim::Physics::Fem3DLocalization; using SurgSim::Physics::Fem3DElementTetrahedron; using SurgSim::Physics::MlcpPhysicsProblem; using SurgSim::Physics::SlidingConstraintData; using SurgSim::Math::Vector3d; using SurgSim::Math::Vector4d; namespace { const double epsilon = 1e-10; const double dt = 1e-3; }; static void addTetrahedron(Fem3DRepresentation* fem, size_t node0, size_t node1, size_t node2, size_t node3, double massDensity = 1.0, double poissonRatio = 0.1, double youngModulus = 1.0) { std::array nodes = {node0, node1, node2, node3}; auto element = std::make_shared(nodes); element->setMassDensity(massDensity); element->setPoissonRatio(poissonRatio); element->setYoungModulus(youngModulus); fem->addFemElement(element); } class Fem3DConstraintFrictionlessSlidingTests : public ::testing::Test { public: void SetUp() { // Define plane with normal 'n' pointing against gravity. m_slidingDirection = Vector3d(0.8539, 0.6289, -0.9978); m_slidingDirection.normalize(); // Create mock FEM m_fem = std::make_shared("Fem2dRepresentation"); auto state = std::make_shared(); state->setNumDof(3, 6); // Place coordinates at // ( 0.00, 0.00, 0.00) + (0.24, -0.43, 0.55) + ( 0.06, -0.14, -0.15) = ( 0.30, -0.57, 0.40) // ( 0.00, 1.00, -1.00) + (0.24, -0.43, 0.55) + (-0.18, 0.06, 0.13) = ( 0.06, 0.63, -0.32) // (-1.00, 1.00, 0.00) + (0.24, -0.43, 0.55) + (-0.15, 0.15, 0.17) = (-0.91, 0.72, 0.72) // ( 0.00, 1.00, 0.00) + (0.24, -0.43, 0.55) + ( 0.11, -0.05, -0.05) = ( 0.35, 0.52, 0.50) // ( 1.00, 1.00, 0.00) + (0.24, -0.43, 0.55) + (-0.10, 0.09, 0.16) = ( 1.14, 0.66, 0.71) // ( 1.00, 0.00, -1.00) + (0.24, -0.43, 0.55) + (-0.22, 0.12, -0.09) = ( 1.02, -0.31, -0.54) state->getPositions().segment<3>(0 * 3) = Vector3d(0.30, -0.57, 0.40); state->getPositions().segment<3>(1 * 3) = Vector3d(0.06, 0.63, -0.32); state->getPositions().segment<3>(2 * 3) = Vector3d(-0.91, 0.72, 0.72); state->getPositions().segment<3>(3 * 3) = Vector3d(0.35, 0.52, 0.50); state->getPositions().segment<3>(4 * 3) = Vector3d(1.14, 0.66, 0.71); state->getPositions().segment<3>(5 * 3) = Vector3d(1.02, -0.31, -0.54); addTetrahedron(m_fem.get(), 0, 1, 2, 3); addTetrahedron(m_fem.get(), 0, 1, 3, 4); addTetrahedron(m_fem.get(), 0, 1, 4, 5); m_fem->setInitialState(state); m_fem->setIntegrationScheme(SurgSim::Math::IntegrationScheme::INTEGRATIONSCHEME_EULER_EXPLICIT_MODIFIED); m_fem->setLocalActive(true); m_fem->initialize(std::make_shared()); m_fem->wakeUp(); // Update model by one timestep m_fem->beforeUpdate(dt); m_fem->update(dt); } void setSlidingConstraintAt(const IndexedLocalCoordinate& coord) { m_localization = std::make_shared(m_fem, coord); m_constraintData.setSlidingDirection(m_localization->calculatePosition(0.0), m_slidingDirection); } std::shared_ptr m_fem; std::shared_ptr m_localization; Vector3d m_slidingDirection; SlidingConstraintData m_constraintData; }; TEST_F(Fem3DConstraintFrictionlessSlidingTests, ConstructorTest) { ASSERT_NO_THROW( { FemConstraintFrictionlessSliding femContact; }); } TEST_F(Fem3DConstraintFrictionlessSlidingTests, ConstraintConstantsTest) { auto implementation = std::make_shared(); EXPECT_EQ(SurgSim::Physics::FRICTIONLESS_SLIDING, implementation->getConstraintType()); EXPECT_EQ(2u, implementation->getNumDof()); } TEST_F(Fem3DConstraintFrictionlessSlidingTests, BuildMlcpTest) { // This test verifies the build mlcp function works for a simple case. auto implementation = std::make_shared(); // Initialize MLCP MlcpPhysicsProblem mlcpPhysicsProblem = MlcpPhysicsProblem::Zero(m_fem->getNumDof(), 2, 1); // Apply constraint purely to the first node of the 0th tetrahedron. IndexedLocalCoordinate coord(0, Vector4d(1.0, 0.0, 0.0, 0.0)); setSlidingConstraintAt(coord); implementation->build(dt, m_constraintData, m_localization, &mlcpPhysicsProblem, 0, 0, SurgSim::Physics::CONSTRAINT_POSITIVE_SIDE); auto pose = m_constraintData.getPose().inverse().rotation(); EXPECT_TRUE((pose * m_slidingDirection).isApprox(Vector3d(1.0, 0.0, 0.0))); EXPECT_TRUE((pose * m_constraintData.getNormals()[0]).isApprox(Vector3d(0.0, 1.0, 0.0))); EXPECT_TRUE((pose * m_constraintData.getNormals()[1]).isApprox(Vector3d(0.0, 0.0, 1.0))); Eigen::Matrix H = Eigen::Matrix::Zero(); H.block<1, 3>(0, 0) = (dt * m_constraintData.getNormals()[0]).eval(); H.block<1, 3>(1, 0) = (dt * m_constraintData.getNormals()[1]).eval(); EXPECT_NEAR_EIGEN(H, mlcpPhysicsProblem.H, epsilon); // C = dt * m^{-1} m_fem->updateFMDK(*(m_fem->getPreviousState()), SurgSim::Math::ODEEQUATIONUPDATE_M); Eigen::Matrix C = dt * m_fem->getM().toDense().inverse(); EXPECT_NEAR_EIGEN(C * H.transpose(), mlcpPhysicsProblem.CHt, epsilon); EXPECT_NEAR_EIGEN(H * C * H.transpose(), mlcpPhysicsProblem.A, epsilon); EXPECT_EQ(0u, mlcpPhysicsProblem.constraintTypes.size()); } TEST_F(Fem3DConstraintFrictionlessSlidingTests, BuildMlcpCoordinateTest) { // This test verifies the build mlcp function works for a more complicated case with different nodes. auto implementation = std::make_shared(); // Initialize MLCP MlcpPhysicsProblem mlcpPhysicsProblem = MlcpPhysicsProblem::Zero(m_fem->getNumDof(), 2, 1); // Apply constraint to the four nodes of the 0th tetrahedron. auto barycentric = Vector4d(0.25, 0.33, 0.28, 0.14); IndexedLocalCoordinate coord(0, barycentric); setSlidingConstraintAt(coord); implementation->build(dt, m_constraintData, m_localization, &mlcpPhysicsProblem, 0, 0, SurgSim::Physics::CONSTRAINT_POSITIVE_SIDE); auto pose = m_constraintData.getPose().inverse().rotation(); EXPECT_TRUE((pose * m_slidingDirection).isApprox(Vector3d(1.0, 0.0, 0.0))); EXPECT_TRUE((pose * m_constraintData.getNormals()[0]).isApprox(Vector3d(0.0, 1.0, 0.0))); EXPECT_TRUE((pose * m_constraintData.getNormals()[1]).isApprox(Vector3d(0.0, 0.0, 1.0))); Eigen::Matrix H = Eigen::Matrix::Zero(); H.block<1, 3>(0, 0) = (barycentric[0] * dt * m_constraintData.getNormals()[0]).eval(); H.block<1, 3>(1, 0) = (barycentric[0] * dt * m_constraintData.getNormals()[1]).eval(); H.block<1, 3>(0, 3) = (barycentric[1] * dt * m_constraintData.getNormals()[0]).eval(); H.block<1, 3>(1, 3) = (barycentric[1] * dt * m_constraintData.getNormals()[1]).eval(); H.block<1, 3>(0, 6) = (barycentric[2] * dt * m_constraintData.getNormals()[0]).eval(); H.block<1, 3>(1, 6) = (barycentric[2] * dt * m_constraintData.getNormals()[1]).eval(); H.block<1, 3>(0, 9) = (barycentric[3] * dt * m_constraintData.getNormals()[0]).eval(); H.block<1, 3>(1, 9) = (barycentric[3] * dt * m_constraintData.getNormals()[1]).eval(); EXPECT_NEAR_EIGEN(H, mlcpPhysicsProblem.H, epsilon); // C = dt * m^{-1} m_fem->updateFMDK(*(m_fem->getPreviousState()), SurgSim::Math::ODEEQUATIONUPDATE_M); Eigen::Matrix C = dt * m_fem->getM().toDense().inverse(); EXPECT_NEAR_EIGEN(C * H.transpose(), mlcpPhysicsProblem.CHt, epsilon); EXPECT_NEAR_EIGEN(H * C * H.transpose(), mlcpPhysicsProblem.A, epsilon); EXPECT_EQ(0u, mlcpPhysicsProblem.constraintTypes.size()); } TEST_F(Fem3DConstraintFrictionlessSlidingTests, BuildMlcpIndiciesTest) { // This test verifies the build mlcp function works given a hypothetical, preexisting mlcp problem. auto implementation = std::make_shared(); // Initialize MLCP MlcpPhysicsProblem mlcpPhysicsProblem = MlcpPhysicsProblem::Zero(m_fem->getNumDof() + 5, 3, 2); // Suppose 5 dof and 1 constraint are defined elsewhere. Then H, CHt, HCHt, and b are prebuilt. Eigen::SparseVector localH; localH.resize(5); localH.reserve(5); localH.insert(0) = 0.9478; localH.insert(1) = -0.3807; localH.insert(2) = 0.5536; localH.insert(3) = -0.6944; localH.insert(4) = 0.1815; mlcpPhysicsProblem.H.coeffRef(0, 0) += localH.coeff(0); mlcpPhysicsProblem.H.coeffRef(0, 1) += localH.coeff(1); mlcpPhysicsProblem.H.coeffRef(0, 2) += localH.coeff(2); mlcpPhysicsProblem.H.coeffRef(0, 3) += localH.coeff(3); mlcpPhysicsProblem.H.coeffRef(0, 4) += localH.coeff(4); Eigen::Matrix localC; localC << -0.2294, 0.5160, 0.2520, 0.5941, -0.4854, 0.1233, -0.4433, 0.3679, 0.9307, 0.2600, 0.1988, 0.6637, -0.7591, 0.1475, 0.8517, -0.5495, -0.4305, 0.3162, -0.7862, 0.7627, -0.5754, 0.4108, 0.8445, -0.5565, 0.7150; localC = localC * localC.transpose(); // force to be symmetric Eigen::Matrix localCHt = localC * localH.transpose(); mlcpPhysicsProblem.CHt.block<5, 1>(0, 0) = localCHt; mlcpPhysicsProblem.A.block<1, 1>(0, 0) = localH * localCHt; mlcpPhysicsProblem.b.block<1, 1>(0, 0)[0] = 0.6991; // Place the Fem at 5th dof (1 or multiple representations exist before, covering a total of 5 dof) // and the constraint at the index 1 (1 atomic constraint exists before this one) size_t indexOfRepresentation = 5; size_t indexOfConstraint = 1; // Apply constraint to the four nodes of the 0th tetrahedron auto barycentric = Vector4d(0.25, 0.33, 0.28, 0.14); IndexedLocalCoordinate coord(0, barycentric); setSlidingConstraintAt(coord); implementation->build(dt, m_constraintData, m_localization, &mlcpPhysicsProblem, indexOfRepresentation, indexOfConstraint, SurgSim::Physics::CONSTRAINT_POSITIVE_SIDE); auto pose = m_constraintData.getPose().inverse().rotation(); EXPECT_TRUE((pose * m_slidingDirection).isApprox(Vector3d(1.0, 0.0, 0.0))); EXPECT_TRUE((pose * m_constraintData.getNormals()[0]).isApprox(Vector3d(0.0, 1.0, 0.0))); EXPECT_TRUE((pose * m_constraintData.getNormals()[1]).isApprox(Vector3d(0.0, 0.0, 1.0))); Eigen::Matrix H = Eigen::Matrix::Zero(); H.block<1, 3>(0, 0) = (barycentric[0] * dt * m_constraintData.getNormals()[0]).eval(); H.block<1, 3>(1, 0) = (barycentric[0] * dt * m_constraintData.getNormals()[1]).eval(); H.block<1, 3>(0, 3) = (barycentric[1] * dt * m_constraintData.getNormals()[0]).eval(); H.block<1, 3>(1, 3) = (barycentric[1] * dt * m_constraintData.getNormals()[1]).eval(); H.block<1, 3>(0, 6) = (barycentric[2] * dt * m_constraintData.getNormals()[0]).eval(); H.block<1, 3>(1, 6) = (barycentric[2] * dt * m_constraintData.getNormals()[1]).eval(); H.block<1, 3>(0, 9) = (barycentric[3] * dt * m_constraintData.getNormals()[0]).eval(); H.block<1, 3>(1, 9) = (barycentric[3] * dt * m_constraintData.getNormals()[1]).eval(); EXPECT_NEAR_EIGEN(H, mlcpPhysicsProblem.H.block(indexOfConstraint, indexOfRepresentation, 2, 18), epsilon); m_fem->updateFMDK(*(m_fem->getPreviousState()), SurgSim::Math::ODEEQUATIONUPDATE_M); Eigen::Matrix C = dt * m_fem->getM().toDense().inverse(); EXPECT_NEAR_EIGEN( C * H.transpose(), mlcpPhysicsProblem.CHt.block(indexOfRepresentation, indexOfConstraint, 18, 2), epsilon); EXPECT_NEAR_EIGEN( H * C * H.transpose(), mlcpPhysicsProblem.A.block(indexOfConstraint, indexOfConstraint, 2, 2), epsilon); EXPECT_EQ(0u, mlcpPhysicsProblem.constraintTypes.size()); } opensurgsim-0.7.0/SurgSim/Physics/UnitTests/Fem3DElementCorotationalTetrahedronTests.cpp000066400000000000000000000601411277777236100316110ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include #include "SurgSim/Math/Matrix.h" #include "SurgSim/Math/OdeEquation.h" #include "SurgSim/Math/OdeState.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/Fem3DElementCorotationalTetrahedron.h" using SurgSim::Physics::Fem3DElementCorotationalTetrahedron; using SurgSim::Math::Vector; using SurgSim::Math::Vector3d; using SurgSim::Math::Matrix; using SurgSim::Math::Matrix33d; using SurgSim::Math::SparseMatrix; namespace { const double epsilonAddForce = 1e-8; const double epsilonAddMatVec = 1e-10; }; class MockFem3DElementCorotationalTet : public Fem3DElementCorotationalTetrahedron { public: explicit MockFem3DElementCorotationalTet(std::array nodeIds) : Fem3DElementCorotationalTetrahedron(nodeIds) { } const Eigen::Matrix& getInitialPosition() const { return m_x0; } const Eigen::Matrix& getNonRotatedMassMatrix() const { return m_MLinear; } const Eigen::Matrix& getNonRotatedStiffnessMatrix() const { return m_KLinear; } const SurgSim::Math::Matrix getRotatedStiffnessMatrix(const SurgSim::Math::OdeState& state) const { return m_K; } const SurgSim::Math::Matrix getRotatedMassMatrix(const SurgSim::Math::OdeState& state) const { return m_M; } /// Compute the rotation, mass and stiffness matrices of the element from the given state /// \param state The state to compute the rotation and jacobians from /// \param [out] R rotation matrix of the element in the given state (can be nullptr if not needed) /// \param [out] Me, Ke Respectively the mass and stiffness matrices (Me and/or Ke be nullptr if not needed) /// \note The model is not viscoelastic but purely elastic, so there is no damping matrix here. void computeRotationMassAndStiffness(const SurgSim::Math::OdeState& state, SurgSim::Math::Matrix33d* R, SurgSim::Math::Matrix* Me, SurgSim::Math::Matrix* Ke) const { Fem3DElementCorotationalTetrahedron::computeRotationMassAndStiffness(state, R, Me, Ke); } const SurgSim::Math::Matrix33d getRotation(const SurgSim::Math::OdeState& state) const { return m_R; } const SurgSim::Math::Matrix44d getVInverse() const { return m_Vinverse; } void setupInitialParams(const SurgSim::Math::OdeState& state, double massDensity, double poissonRatio, double youngModulus) { setMassDensity(massDensity); setPoissonRatio(poissonRatio); setYoungModulus(youngModulus); initialize(state); } }; class Fem3DElementCorotationalTetrahedronTests : public ::testing::Test { public: std::array m_nodeIds; std::vector m_nodeIdsAsVector; SurgSim::Math::OdeState m_restState, m_invalidState, m_state; double m_rho, m_E, m_nu; SurgSim::Math::Matrix33d m_rotation; Eigen::Matrix m_R12x12; Vector3d m_translation; void SetUp() override { m_nodeIds[0] = 3; m_nodeIds[1] = 1; m_nodeIds[2] = 14; m_nodeIds[3] = 9; m_nodeIdsAsVector.assign(m_nodeIds.cbegin(), m_nodeIds.cend()); m_restState.setNumDof(3, 15); m_invalidState.setNumDof(3, 15); Vector& x0 = m_restState.getPositions(); Vector& invalidx0 = m_invalidState.getPositions(); std::array points = {{ Vector3d(0.0, 0.0, 0.0), Vector3d(1.0, 0.0, 0.0), Vector3d(0.0, 1.0, 0.0), Vector3d(0.0, 0.0, 1.0) } }; // Tet is aligned with the axis (X,Y,Z), centered on (0.0, 0.0, 0.0), embedded in a cube of size 1 for (size_t nodeId = 0; nodeId < 4; ++nodeId) { SurgSim::Math::getSubVector(x0, m_nodeIds[nodeId], 3) = points[nodeId]; SurgSim::Math::getSubVector(invalidx0, m_nodeIds[nodeId], 3) = points[nodeId]; } // In the invalid state, the tetrahedron is degenerated to a triangle (last 2 points are equal) SurgSim::Math::getSubVector(invalidx0, m_nodeIds[3], 3) = points[2]; m_rho = 1000.0; m_E = 1e6; m_nu = 0.45; Vector3d axis(1.0, 0.2, -0.3); axis.normalize(); m_rotation = SurgSim::Math::makeRotationMatrix(4.1415, axis); m_R12x12 = Eigen::Matrix::Zero(); for (size_t nodeId = 0; nodeId < 4; ++nodeId) { m_R12x12.block<3, 3>(3 * nodeId, 3 * nodeId) = m_rotation; } m_translation = Vector3d(1.2, 2.3, 3.4); } }; namespace { template void defineCurrentState(const SurgSim::Math::OdeState& x0, SurgSim::Math::OdeState* x, const Eigen::Transform& t, bool addSmallDeformation) { std::array delta = {{ Vector3d(0.01, -0.02, 0.005), Vector3d(-0.01, -0.01, -0.03), Vector3d(0.0, -0.015, 0.03) } }; *x = x0; for (size_t nodeId = 0; nodeId < x0.getNumNodes(); ++nodeId) { (*x).getPositions().segment<3>(3 * nodeId) = t * x0.getPositions().segment<3>(3 * nodeId); if (addSmallDeformation) { (*x).getPositions().segment<3>(3 * nodeId) += delta[nodeId % 3]; } } } // Duplicates 4 times a 3x3 matrix on the diagonal blocks Eigen::Matrix make12x12(const Eigen::Matrix& R) { Eigen::Matrix res = Eigen::Matrix::Zero(); for (size_t nodeId = 0; nodeId < 4; nodeId++) { res.block<3, 3>(3 * nodeId, 3 * nodeId) = R; } return res; } }; // anonymous namespace TEST_F(Fem3DElementCorotationalTetrahedronTests, ConstructorTest) { ASSERT_NO_THROW({MockFem3DElementCorotationalTet tet(m_nodeIds);}); ASSERT_NO_THROW({MockFem3DElementCorotationalTet* tet = new MockFem3DElementCorotationalTet(m_nodeIds); delete tet; }); ASSERT_NO_THROW({std::shared_ptr tet = std::make_shared(m_nodeIds); }); } TEST_F(Fem3DElementCorotationalTetrahedronTests, InitializeTest) { MockFem3DElementCorotationalTet tet(m_nodeIds); ASSERT_NO_THROW(tet.setupInitialParams(m_restState, m_rho, m_nu, m_E)); EXPECT_TRUE(tet.getRotation(m_restState).isIdentity()); EXPECT_TRUE(tet.getRotatedStiffnessMatrix(m_restState).isApprox(tet.getNonRotatedStiffnessMatrix())); EXPECT_TRUE(tet.getRotatedMassMatrix(m_restState).isApprox(tet.getNonRotatedMassMatrix())); // V^1 = (a b c d)^-1 // (1 1 1 1) SurgSim::Math::Matrix44d expectedV = SurgSim::Math::Matrix44d::Ones(); for (size_t axis = 0; axis < 3; ++axis) { expectedV(axis, 0) = m_restState.getPosition(m_nodeIds[0])(axis); expectedV(axis, 1) = m_restState.getPosition(m_nodeIds[1])(axis); expectedV(axis, 2) = m_restState.getPosition(m_nodeIds[2])(axis); expectedV(axis, 3) = m_restState.getPosition(m_nodeIds[3])(axis); } EXPECT_TRUE(tet.getVInverse().isApprox(expectedV.inverse())); MockFem3DElementCorotationalTet invalidTet(m_nodeIds); ASSERT_THROW(invalidTet.setupInitialParams(m_invalidState, m_rho, m_nu, m_E), SurgSim::Framework::AssertionFailure); } TEST_F(Fem3DElementCorotationalTetrahedronTests, ComputeRotationMassAndStiffnessTest) { using SurgSim::Math::skew; using SurgSim::Math::makeSkewSymmetricMatrix; Eigen::Transform transformation; SurgSim::Math::Matrix33d R; SurgSim::Math::Matrix M, K; { SCOPED_TRACE("No rotation, no translation"); transformation.linear().setIdentity(); transformation.translation().setZero(); defineCurrentState(m_restState, &m_state, transformation, false); MockFem3DElementCorotationalTet tet(m_nodeIds); tet.setupInitialParams(m_restState, m_rho, m_nu, m_E); ASSERT_NO_THROW(tet.computeRotationMassAndStiffness(m_state, &R, &M, &K)); EXPECT_TRUE(R.isIdentity()); EXPECT_TRUE(K.isApprox(tet.getNonRotatedStiffnessMatrix())) << std::endl << "K:" << std::endl << K << std::endl << "NonRotatedStiffnessMatrix:" << std::endl << tet.getNonRotatedStiffnessMatrix() << std::endl; EXPECT_TRUE(M.isApprox(tet.getNonRotatedMassMatrix())); } { SCOPED_TRACE("Pure translation"); transformation.linear().setIdentity(); transformation.translation() = m_translation; defineCurrentState(m_restState, &m_state, transformation, false); MockFem3DElementCorotationalTet tet(m_nodeIds); tet.setupInitialParams(m_restState, m_rho, m_nu, m_E); ASSERT_NO_THROW(tet.computeRotationMassAndStiffness(m_state, &R, &M, &K)); EXPECT_TRUE(R.isIdentity()); EXPECT_TRUE(K.isApprox(tet.getNonRotatedStiffnessMatrix())); EXPECT_TRUE(M.isApprox(tet.getNonRotatedMassMatrix())); } { SCOPED_TRACE("Pure rotation"); transformation.linear() = m_rotation; transformation.translation().setZero(); defineCurrentState(m_restState, &m_state, transformation, false); MockFem3DElementCorotationalTet tet(m_nodeIds); tet.setupInitialParams(m_restState, m_rho, m_nu, m_E); ASSERT_NO_THROW(tet.computeRotationMassAndStiffness(m_state, &R, &M, &K)); EXPECT_TRUE(R.isApprox(m_rotation)); // The corotational stiffness has more terms than R.K0.R^t // But, these terms are in the order of epsilon is no scaling is involved in the transformation. // They seem to account for the deformation part of the transformation and not the rigid transformation. // A pure transformation (rotation + translation) is fully taken into account by the term R.K0.R^t EXPECT_TRUE(K.isApprox(m_R12x12 * tet.getNonRotatedStiffnessMatrix() * m_R12x12.transpose())) << std::endl << "K:" << std::endl << K << std::endl << "NonRotatedStiffnessMatrix:" << std::endl << (m_R12x12 * tet.getNonRotatedStiffnessMatrix() * m_R12x12.transpose()) << std::endl; EXPECT_FALSE(K.isApprox(tet.getNonRotatedStiffnessMatrix())); EXPECT_TRUE(M.isApprox(m_R12x12 * tet.getNonRotatedMassMatrix() * m_R12x12.transpose())); } { SCOPED_TRACE("Translation + Pure Rotation"); transformation.linear() = m_rotation; transformation.translation() = m_translation; defineCurrentState(m_restState, &m_state, transformation, false); MockFem3DElementCorotationalTet tet(m_nodeIds); tet.setupInitialParams(m_restState, m_rho, m_nu, m_E); ASSERT_NO_THROW(tet.computeRotationMassAndStiffness(m_state, &R, &M, &K)); EXPECT_TRUE(R.isApprox(m_rotation)); // The corotational stiffness has more terms than R.K0.R^t // But, these terms are in the order of epsilon is no scaling is involved in the transformation. // They seem to account for the deformation part of the transformation and not the rigid transformation. // A pure transformation (rotation + translation) is fully taken into account by the term R.K0.R^t EXPECT_TRUE(K.isApprox(m_R12x12 * tet.getNonRotatedStiffnessMatrix() * m_R12x12.transpose())); EXPECT_FALSE(K.isApprox(tet.getNonRotatedStiffnessMatrix())); EXPECT_TRUE(M.isApprox(m_R12x12 * tet.getNonRotatedMassMatrix() * m_R12x12.transpose())); } { SCOPED_TRACE("Affine transform : Translation + rotation * scaling"); Eigen::UniformScaling S = Eigen::Scaling(45.3); transformation.linear() = m_rotation * S; transformation.translation() = m_translation; defineCurrentState(m_restState, &m_state, transformation, false); MockFem3DElementCorotationalTet tet(m_nodeIds); tet.setupInitialParams(m_restState, m_rho, m_nu, m_E); ASSERT_NO_THROW(tet.computeRotationMassAndStiffness(m_state, &R, &M, &K)); EXPECT_TRUE(R.isApprox(m_rotation)); // The corotational stiffness has more terms than R.K0.R^t // But, these terms are in the order of epsilon is no scaling is involved in the transformation. // They seem to account for the deformation part of the transformation and not the rigid transformation. // A pure transformation (rotation + translation) is fully taken into account by the term R.K0.R^t EXPECT_FALSE(K.isApprox(m_R12x12 * tet.getNonRotatedStiffnessMatrix() * m_R12x12.transpose())); EXPECT_FALSE(K.isApprox(tet.getNonRotatedStiffnessMatrix())); EXPECT_TRUE(M.isApprox(m_R12x12 * tet.getNonRotatedMassMatrix() * m_R12x12.transpose())); } } namespace { void testAddStiffness(MockFem3DElementCorotationalTet* tet, const SurgSim::Math::OdeState& state0, const SurgSim::Math::RigidTransform3d& t, double scale) { SurgSim::Math::OdeState state; defineCurrentState(state0, &state, t, false); tet->updateFMDK(state, SurgSim::Math::ODEEQUATIONUPDATE_K); Matrix expectedK = Matrix::Zero(state.getNumDof(), state.getNumDof()); SurgSim::Math::addSubMatrix(scale * tet->getRotatedStiffnessMatrix(state), tet->getNodeIds(), 3, &expectedK); SparseMatrix K(static_cast(state.getNumDof()), static_cast(state.getNumDof())); K.setZero(); Matrix zeroMatrix = Matrix::Zero(tet->getNumDofPerNode() * tet->getNumNodes(), tet->getNumDofPerNode() * tet->getNumNodes()); tet->assembleMatrixBlocks(zeroMatrix, tet->getNodeIds(), static_cast(tet->getNumDofPerNode()), &K, true); K.makeCompressed(); tet->addStiffness(&K, scale); EXPECT_TRUE(K.isApprox(expectedK)); } void testAddMass(MockFem3DElementCorotationalTet* tet, const SurgSim::Math::OdeState& state0, const SurgSim::Math::RigidTransform3d& t, double scale) { SurgSim::Math::OdeState state; defineCurrentState(state0, &state, t, false); tet->updateFMDK(state, SurgSim::Math::ODEEQUATIONUPDATE_M); Eigen::Matrix M0 = tet->getNonRotatedMassMatrix(); Matrix33d R = tet->getRotation(state); Eigen::Matrix R12x12 = make12x12(Eigen::Matrix(R)); Matrix expectedM = Matrix::Zero(state.getNumDof(), state.getNumDof()); SurgSim::Math::addSubMatrix(scale * R12x12 * M0 * R12x12.transpose(), tet->getNodeIds(), 3, &expectedM); SparseMatrix M(static_cast(state.getNumDof()), static_cast(state.getNumDof())); M.setZero(); Matrix zeroMatrix = Matrix::Zero(tet->getNumDofPerNode() * tet->getNumNodes(), tet->getNumDofPerNode() * tet->getNumNodes()); tet->assembleMatrixBlocks(zeroMatrix, tet->getNodeIds(), static_cast(tet->getNumDofPerNode()), &M, true); M.makeCompressed(); tet->addMass(&M, scale); EXPECT_TRUE(M.isApprox(expectedM)); } void testAddFMDK(MockFem3DElementCorotationalTet* tet, const SurgSim::Math::OdeState& state0, const SurgSim::Math::RigidTransform3d& t) { SurgSim::Math::OdeState state; defineCurrentState(state0, &state, t, false); tet->updateFMDK(state, SurgSim::Math::ODEEQUATIONUPDATE_FMDK); Eigen::Matrix K0 = tet->getNonRotatedStiffnessMatrix(); Eigen::Matrix M0 = tet->getNonRotatedMassMatrix(); Matrix33d R = tet->getRotation(state); Eigen::Matrix R12x12 = make12x12(Eigen::Matrix(R)); Vector expectedF = Vector::Zero(state.getNumDof()); Matrix expectedM = Matrix::Zero(state.getNumDof(), state.getNumDof()); Matrix expectedK = Matrix::Zero(state.getNumDof(), state.getNumDof()); SurgSim::Math::addSubMatrix(tet->getRotatedStiffnessMatrix(state), tet->getNodeIds(), 3, &expectedK); SurgSim::Math::addSubMatrix(R12x12 * M0 * R12x12.transpose(), tet->getNodeIds(), 3, &expectedM); Eigen::Matrix x; SurgSim::Math::getSubVector(state.getPositions(), tet->getNodeIds(), 3, &x); Eigen::Matrix f = - R12x12 * K0 * R12x12.transpose() * (x - (R12x12 * tet->getInitialPosition())); SurgSim::Math::addSubVector(f, tet->getNodeIds(), 3, &expectedF); Vector F = Vector::Zero(state.getNumDof()); SparseMatrix M(static_cast(state.getNumDof()), static_cast(state.getNumDof())); SparseMatrix D(static_cast(state.getNumDof()), static_cast(state.getNumDof())); SparseMatrix K(static_cast(state.getNumDof()), static_cast(state.getNumDof())); SparseMatrix zeroMatrix(static_cast(state.getNumDof()), static_cast(state.getNumDof())); Matrix zeroElementMatrix = Matrix::Zero(tet->getNumDofPerNode() * tet->getNumNodes(), tet->getNumDofPerNode() * tet->getNumNodes()); M.setZero(); tet->assembleMatrixBlocks(zeroElementMatrix, tet->getNodeIds(), static_cast(tet->getNumDofPerNode()), &M, true); M.makeCompressed(); D.setZero(); tet->assembleMatrixBlocks(zeroElementMatrix, tet->getNodeIds(), static_cast(tet->getNumDofPerNode()), &D, true); D.makeCompressed(); K.setZero(); tet->assembleMatrixBlocks(zeroElementMatrix, tet->getNodeIds(), static_cast(tet->getNumDofPerNode()), &K, true); K.makeCompressed(); zeroMatrix.setZero(); tet->addFMDK(&F, &M, &D, &K); EXPECT_TRUE(F.isApprox(expectedF)); EXPECT_TRUE(M.isApprox(expectedM)); EXPECT_TRUE(D.isApprox(zeroMatrix)); EXPECT_TRUE(K.isApprox(expectedK)); } }; // anonymous namespace TEST_F(Fem3DElementCorotationalTetrahedronTests, AddStiffnessTest) { using SurgSim::Math::makeRigidTransform; using SurgSim::Math::RigidTransform3d; MockFem3DElementCorotationalTet tet(m_nodeIds); tet.setupInitialParams(m_restState, m_rho, m_nu, m_E); { SCOPED_TRACE("Without rotation, scale 1.0"); testAddStiffness(&tet, m_restState, RigidTransform3d::Identity(), 1.0); } { SCOPED_TRACE("Without rotation, scale 0.4"); testAddStiffness(&tet, m_restState, RigidTransform3d::Identity(), 0.4); } { SCOPED_TRACE("With rotation, scale 1.0"); testAddStiffness(&tet, m_restState, makeRigidTransform(m_rotation, Vector3d::Zero()), 1.0); } { SCOPED_TRACE("With rotation, scale 0.4"); testAddStiffness(&tet, m_restState, makeRigidTransform(m_rotation, Vector3d::Zero()), 0.4); } } TEST_F(Fem3DElementCorotationalTetrahedronTests, AddMassTest) { using SurgSim::Math::makeRigidTransform; using SurgSim::Math::RigidTransform3d; MockFem3DElementCorotationalTet tet(m_nodeIds); tet.setupInitialParams(m_restState, m_rho, m_nu, m_E); { SCOPED_TRACE("Without rotation, scale 1.0"); testAddMass(&tet, m_restState, RigidTransform3d::Identity(), 1.0); } { SCOPED_TRACE("Without rotation, scale 0.4"); testAddMass(&tet, m_restState, RigidTransform3d::Identity(), 0.4); } { SCOPED_TRACE("With rotation, scale 1.0"); testAddMass(&tet, m_restState, makeRigidTransform(m_rotation, Vector3d::Zero()), 1.0); } { SCOPED_TRACE("With rotation, scale 0.4"); testAddMass(&tet, m_restState, makeRigidTransform(m_rotation, Vector3d::Zero()), 0.4); } } TEST_F(Fem3DElementCorotationalTetrahedronTests, AddFMDKTest) { using SurgSim::Math::makeRigidTransform; using SurgSim::Math::RigidTransform3d; MockFem3DElementCorotationalTet tet(m_nodeIds); tet.setupInitialParams(m_restState, m_rho, m_nu, m_E); { SCOPED_TRACE("Without rotation"); testAddFMDK(&tet, m_restState, RigidTransform3d::Identity()); } { SCOPED_TRACE("With rotation"); testAddFMDK(&tet, m_restState, makeRigidTransform(m_rotation, Vector3d::Zero())); } } namespace { void testAddForce(MockFem3DElementCorotationalTet* tet, const SurgSim::Math::OdeState& state0, const SurgSim::Math::RigidTransform3d& t, bool addLocalDeformation) { SurgSim::Math::OdeState statet; SurgSim::Math::Matrix K = tet->getNonRotatedStiffnessMatrix(); // F = -RK(R^t.x - x0) Eigen::Matrix x, x0; SurgSim::Math::getSubVector(state0.getPositions(), tet->getNodeIds(), 3, &x0); defineCurrentState(state0, &statet, t, addLocalDeformation); tet->updateFMDK(statet, SurgSim::Math::ODEEQUATIONUPDATE_F); SurgSim::Math::getSubVector(statet.getPositions(), tet->getNodeIds(), 3, &x); // Note that the element rotation is not necessarily the RigidTransform rotation // If addDeformation is true, it will add pseudo-random variation that will affect the rigid motion slightly SurgSim::Math::Matrix33d R = tet->getRotation(statet); Eigen::Matrix R12x12 = Eigen::Matrix::Zero(); for (size_t nodeId = 0; nodeId < 4; ++nodeId) { R12x12.block<3, 3>(3 * nodeId, 3 * nodeId) = R; } SurgSim::Math::Vector expectedF; expectedF.setZero(statet.getNumDof()); Eigen::Matrix f = - R12x12 * K * R12x12.transpose() * (x - (R12x12 * x0)); SurgSim::Math::addSubVector(f, tet->getNodeIds(), 3, &expectedF); EXPECT_TRUE(tet->getRotation(statet).isApprox(R)); EXPECT_TRUE(tet->getNonRotatedStiffnessMatrix().isApprox(K)); EXPECT_TRUE(tet->getInitialPosition().isApprox(x0)); { SCOPED_TRACE("Scale 1.0"); SurgSim::Math::Vector F; F.setZero(statet.getNumDof()); tet->addForce(&F); EXPECT_LT((F - expectedF).norm(), epsilonAddForce); if (!addLocalDeformation) { EXPECT_TRUE(F.isZero(epsilonAddForce)); } } { SCOPED_TRACE("Scale 0.4"); SurgSim::Math::Vector F; F.setZero(statet.getNumDof()); tet->addForce(&F, 0.4); EXPECT_LT((F - 0.4 * expectedF).norm(), epsilonAddForce); if (!addLocalDeformation) { EXPECT_TRUE(F.isZero(epsilonAddForce)); } } } }; // anonymous namespace TEST_F(Fem3DElementCorotationalTetrahedronTests, AddForceTest) { MockFem3DElementCorotationalTet tet(m_nodeIds); tet.setupInitialParams(m_restState, m_rho, m_nu, m_E); SurgSim::Math::RigidTransform3d transformation; transformation.linear() = m_rotation; transformation.translation() = m_translation; { SCOPED_TRACE("No deformation, no rigid transformation"); testAddForce(&tet, m_restState, SurgSim::Math::RigidTransform3d::Identity(), false); } { SCOPED_TRACE("No deformation, rigid transformation"); testAddForce(&tet, m_restState, transformation, false); } { SCOPED_TRACE("Deformation, no rigid transformation"); testAddForce(&tet, m_restState, SurgSim::Math::RigidTransform3d::Identity(), true); } { SCOPED_TRACE("Deformation, rigid transformation"); testAddForce(&tet, m_restState, transformation, true); } } TEST_F(Fem3DElementCorotationalTetrahedronTests, AddMatVecTest) { using SurgSim::Math::OdeEquationUpdate; MockFem3DElementCorotationalTet tet(m_nodeIds); tet.setupInitialParams(m_restState, m_rho, m_nu, m_E); SurgSim::Math::RigidTransform3d transformation; transformation.linear() = m_rotation; transformation.translation() = m_translation; SurgSim::Math::OdeState state; defineCurrentState(m_restState, &state, transformation, true); tet.updateFMDK(state, OdeEquationUpdate::ODEEQUATIONUPDATE_M | OdeEquationUpdate::ODEEQUATIONUPDATE_D | OdeEquationUpdate::ODEEQUATIONUPDATE_K); SurgSim::Math::Matrix M = tet.getRotatedMassMatrix(state); SurgSim::Math::Matrix K = tet.getRotatedStiffnessMatrix(state); SurgSim::Math::Vector ones = SurgSim::Math::Vector::Ones(state.getNumDof()); { SCOPED_TRACE("Mass only"); SurgSim::Math::Vector result = SurgSim::Math::Vector::Zero(state.getNumDof()); tet.addMatVec(1.4, 0.0, 0.0, ones, &result); SurgSim::Math::Vector expectedResult = SurgSim::Math::Vector::Zero(state.getNumDof()); Eigen::Matrix f = 1.4 * M * SurgSim::Math::Vector::Ones(12); SurgSim::Math::addSubVector(f, m_nodeIdsAsVector, 3, &expectedResult); EXPECT_TRUE(result.isApprox(expectedResult)); } { SCOPED_TRACE("Damping only"); SurgSim::Math::Vector result = SurgSim::Math::Vector::Zero(state.getNumDof()); tet.addMatVec(0.0, 1.5, 0.0, ones, &result); EXPECT_TRUE(result.isZero()); } { SCOPED_TRACE("Stiffness only"); SurgSim::Math::Vector result = SurgSim::Math::Vector::Zero(state.getNumDof()); tet.addMatVec(0.0, 0.0, 1.6, ones, &result); SurgSim::Math::Vector expectedResult = SurgSim::Math::Vector::Zero(state.getNumDof()); Eigen::Matrix f = 1.6 * K * SurgSim::Math::Vector::Ones(12); SurgSim::Math::addSubVector(f, m_nodeIdsAsVector, 3, &expectedResult); EXPECT_TRUE(result.isApprox(expectedResult)); } { SCOPED_TRACE("Mass/Damping/Stiffness"); SurgSim::Math::Vector result = SurgSim::Math::Vector::Zero(state.getNumDof()); tet.addMatVec(1.4, 1.5, 1.6, ones, &result); SurgSim::Math::Vector expectedResult = SurgSim::Math::Vector::Zero(state.getNumDof()); Eigen::Matrix f = (1.4 * M + 1.6 * K) * SurgSim::Math::Vector::Ones(12); SurgSim::Math::addSubVector(f, m_nodeIdsAsVector, 3, &expectedResult); EXPECT_TRUE(result.isApprox(expectedResult, epsilonAddMatVec)); } } opensurgsim-0.7.0/SurgSim/Physics/UnitTests/Fem3DElementCubeTests.cpp000066400000000000000000000774471277777236100256520ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include #include "SurgSim/Framework/Assert.h" #include "SurgSim/Math/Matrix.h" #include "SurgSim/Math/OdeEquation.h" #include "SurgSim/Math/OdeState.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/Fem3DElementCube.h" using SurgSim::Math::clearMatrix; using SurgSim::Math::Matrix; using SurgSim::Math::SparseMatrix; using SurgSim::Math::Vector; using SurgSim::Math::Vector3d; using SurgSim::Physics::Fem3DElementCube; namespace { /// Epsilon used in this unit test, resulting from a trial and error test. const double epsilon = 3.6e-9; }; class MockFem3DElementCube : public Fem3DElementCube { public: explicit MockFem3DElementCube(std::array nodeIds) : Fem3DElementCube(nodeIds) { } double getRestVolume() const { return m_restVolume; } double evaluateN(int i, double epsilon, double eta, double mu) const { return shapeFunction(i, epsilon, eta, mu); } double evaluatedNidEpsilon(int i, double epsilon, double eta, double mu) const { return dShapeFunctiondepsilon(i, epsilon, eta, mu); } double evaluatedNidEta(int i, double epsilon, double eta, double mu) const { return dShapeFunctiondeta(i, epsilon, eta, mu); } double evaluatedNidMu(int i, double epsilon, double eta, double mu) const { return dShapeFunctiondmu(i, epsilon, eta, mu); } const Eigen::Matrix& getInitialPosition() const { return m_elementRestPosition; } }; class Fem3DElementCubeTests : public ::testing::Test { public: std::array m_nodeIds; SurgSim::Math::OdeState m_restState; double m_expectedVolume; Eigen::Matrix m_expectedX0; double m_rho, m_E, m_nu; SurgSim::Math::Matrix m_expectedMassMatrix, m_expectedDampingMatrix, m_expectedStiffnessMatrix; SurgSim::Math::Vector m_vectorOnes; std::shared_ptr getCubeElement(const std::array& nodeIds) { std::shared_ptr element; element = std::make_shared(nodeIds); element->setYoungModulus(m_E); element->setPoissonRatio(m_nu); element->setMassDensity(m_rho); return element; } void computeExpectedStiffnessMatrix(std::vector nodeIdsVectorForm) { using SurgSim::Math::getSubMatrix; using SurgSim::Math::addSubMatrix; Eigen::Matrix K = Eigen::Matrix::Zero(); { // Expected stiffness matrix given in // "Physically-Based Simulation of Objects Represented by Surface Meshes" // Muller, Techner, Gross, CGI 2004 // NOTE a bug in the paper, the sub matrix K44 should have a diagonal of 'd' double h = 1.0; double a = h * m_E * (1.0 - m_nu) / ((1.0 + m_nu) * (1.0 - 2.0 * m_nu)); double b = h * m_E * (m_nu) / ((1.0 + m_nu) * (1.0 - 2.0 * m_nu)); double c = h * m_E / (2.0 * (1.0 + m_nu)); double d = (a + 2.0 * c) / 9.0; double e = (b + c) / 12.0; double n = -e; // Fill up the diagonal sub-matrices (3x3) getSubMatrix(K, 0, 0, 3, 3).setConstant(e); getSubMatrix(K, 0, 0, 3, 3).diagonal().setConstant(d); getSubMatrix(K, 1, 1, 3, 3).setConstant(n); getSubMatrix(K, 1, 1, 3, 3).diagonal().setConstant(d); getSubMatrix(K, 1, 1, 3, 3)(1, 2) = e; getSubMatrix(K, 1, 1, 3, 3)(2, 1) = e; getSubMatrix(K, 2, 2, 3, 3).setConstant(n); getSubMatrix(K, 2, 2, 3, 3).diagonal().setConstant(d); getSubMatrix(K, 2, 2, 3, 3)(0, 1) = e; getSubMatrix(K, 2, 2, 3, 3)(1, 0) = e; getSubMatrix(K, 3, 3, 3, 3).setConstant(n); getSubMatrix(K, 3, 3, 3, 3).diagonal().setConstant(d); getSubMatrix(K, 3, 3, 3, 3)(0, 2) = e; getSubMatrix(K, 3, 3, 3, 3)(2, 0) = e; getSubMatrix(K, 4, 4, 3, 3).setConstant(n); getSubMatrix(K, 4, 4, 3, 3).diagonal().setConstant(d); //getSubMatrix(K, 4, 4, 3, 3)(0,0) = e; // BUG IN THE PAPER !!! getSubMatrix(K, 4, 4, 3, 3)(0, 1) = e; getSubMatrix(K, 4, 4, 3, 3)(1, 0) = e; getSubMatrix(K, 5, 5, 3, 3).setConstant(n); getSubMatrix(K, 5, 5, 3, 3).diagonal().setConstant(d); getSubMatrix(K, 5, 5, 3, 3)(0, 2) = e; getSubMatrix(K, 5, 5, 3, 3)(2, 0) = e; getSubMatrix(K, 6, 6, 3, 3).setConstant(e); getSubMatrix(K, 6, 6, 3, 3).diagonal().setConstant(d); getSubMatrix(K, 7, 7, 3, 3).setConstant(n); getSubMatrix(K, 7, 7, 3, 3).diagonal().setConstant(d); getSubMatrix(K, 7, 7, 3, 3)(1, 2) = e; getSubMatrix(K, 7, 7, 3, 3)(2, 1) = e; // Edges { double d1 = (-a + c) / 9.0; double d2 = (a - c) / 18.0; double e1 = (b - c) / 12.0; double e2 = (b + c) / 24.0; double n1 = -e1; double n2 = -e2; // Edge in x-direction getSubMatrix(K, 0, 1, 3, 3)(0, 0) = d1; getSubMatrix(K, 0, 1, 3, 3)(0, 1) = e1; getSubMatrix(K, 0, 1, 3, 3)(0, 2) = e1; getSubMatrix(K, 0, 1, 3, 3)(1, 0) = n1; getSubMatrix(K, 0, 1, 3, 3)(1, 1) = d2; getSubMatrix(K, 0, 1, 3, 3)(1, 2) = e2; getSubMatrix(K, 0, 1, 3, 3)(2, 0) = n1; getSubMatrix(K, 0, 1, 3, 3)(2, 1) = e2; getSubMatrix(K, 0, 1, 3, 3)(2, 2) = d2; getSubMatrix(K, 2, 3, 3, 3) = getSubMatrix(K, 0, 1, 3, 3); getSubMatrix(K, 2, 3, 3, 3)(0, 2) = n1; getSubMatrix(K, 2, 3, 3, 3)(1, 2) = n2; getSubMatrix(K, 2, 3, 3, 3)(2, 0) = e1; getSubMatrix(K, 2, 3, 3, 3)(2, 1) = n2; getSubMatrix(K, 4, 5, 3, 3) = getSubMatrix(K, 2, 3, 3, 3); getSubMatrix(K, 6, 7, 3, 3) = getSubMatrix(K, 0, 1, 3, 3); // Edge in y-direction getSubMatrix(K, 0, 3, 3, 3)(0, 0) = d2; getSubMatrix(K, 0, 3, 3, 3)(0, 1) = n1; getSubMatrix(K, 0, 3, 3, 3)(0, 2) = e2; getSubMatrix(K, 0, 3, 3, 3)(1, 0) = e1; getSubMatrix(K, 0, 3, 3, 3)(1, 1) = d1; getSubMatrix(K, 0, 3, 3, 3)(1, 2) = e1; getSubMatrix(K, 0, 3, 3, 3)(2, 0) = e2; getSubMatrix(K, 0, 3, 3, 3)(2, 1) = n1; getSubMatrix(K, 0, 3, 3, 3)(2, 2) = d2; getSubMatrix(K, 1, 2, 3, 3) = getSubMatrix(K, 0, 3, 3, 3); getSubMatrix(K, 1, 2, 3, 3)(0, 1) = e1; getSubMatrix(K, 1, 2, 3, 3)(0, 2) = n2; getSubMatrix(K, 1, 2, 3, 3)(1, 0) = n1; getSubMatrix(K, 1, 2, 3, 3)(2, 0) = n2; getSubMatrix(K, 4, 7, 3, 3) = getSubMatrix(K, 1, 2, 3, 3); getSubMatrix(K, 4, 7, 3, 3)(0, 1) = n1; getSubMatrix(K, 4, 7, 3, 3)(1, 0) = e1; getSubMatrix(K, 4, 7, 3, 3)(1, 2) = n1; getSubMatrix(K, 4, 7, 3, 3)(2, 1) = e1; getSubMatrix(K, 5, 6, 3, 3) = getSubMatrix(K, 0, 3, 3, 3); getSubMatrix(K, 5, 6, 3, 3)(0, 1) = e1; getSubMatrix(K, 5, 6, 3, 3)(1, 0) = n1; getSubMatrix(K, 5, 6, 3, 3)(1, 2) = n1; getSubMatrix(K, 5, 6, 3, 3)(2, 1) = e1; // Edge in z-direction getSubMatrix(K, 0, 4, 3, 3)(0, 0) = d2; getSubMatrix(K, 0, 4, 3, 3)(0, 1) = e2; getSubMatrix(K, 0, 4, 3, 3)(0, 2) = n1; getSubMatrix(K, 0, 4, 3, 3)(1, 0) = e2; getSubMatrix(K, 0, 4, 3, 3)(1, 1) = d2; getSubMatrix(K, 0, 4, 3, 3)(1, 2) = n1; getSubMatrix(K, 0, 4, 3, 3)(2, 0) = e1; getSubMatrix(K, 0, 4, 3, 3)(2, 1) = e1; getSubMatrix(K, 0, 4, 3, 3)(2, 2) = d1; getSubMatrix(K, 1, 5, 3, 3) = getSubMatrix(K, 0, 4, 3, 3); getSubMatrix(K, 1, 5, 3, 3)(0, 1) = n2; getSubMatrix(K, 1, 5, 3, 3)(0, 2) = e1; getSubMatrix(K, 1, 5, 3, 3)(1, 0) = n2; getSubMatrix(K, 1, 5, 3, 3)(2, 0) = n1; getSubMatrix(K, 2, 6, 3, 3) = getSubMatrix(K, 0, 4, 3, 3); getSubMatrix(K, 2, 6, 3, 3)(0, 2) = e1; getSubMatrix(K, 2, 6, 3, 3)(1, 2) = e1; getSubMatrix(K, 2, 6, 3, 3)(2, 0) = n1; getSubMatrix(K, 2, 6, 3, 3)(2, 1) = n1; getSubMatrix(K, 3, 7, 3, 3) = getSubMatrix(K, 0, 4, 3, 3); getSubMatrix(K, 3, 7, 3, 3)(0, 1) = n2; getSubMatrix(K, 3, 7, 3, 3)(1, 0) = n2; getSubMatrix(K, 3, 7, 3, 3)(1, 2) = e1; getSubMatrix(K, 3, 7, 3, 3)(2, 1) = n1; } // Faces diagonals { double d1 = (-2.0 * a - c) / 36.0; double d2 = (a - 4.0 * c) / 36.0; double e1 = (b + c) / 12.0; double e2 = (b - c) / 24.0; double n1 = -e1; double n2 = -e2; getSubMatrix(K, 0, 5, 3, 3)(0, 0) = d1; getSubMatrix(K, 0, 5, 3, 3)(0, 1) = e2; getSubMatrix(K, 0, 5, 3, 3)(0, 2) = n1; getSubMatrix(K, 0, 5, 3, 3)(1, 0) = n2; getSubMatrix(K, 0, 5, 3, 3)(1, 1) = d2; getSubMatrix(K, 0, 5, 3, 3)(1, 2) = n2; getSubMatrix(K, 0, 5, 3, 3)(2, 0) = n1; getSubMatrix(K, 0, 5, 3, 3)(2, 1) = e2; getSubMatrix(K, 0, 5, 3, 3)(2, 2) = d1; getSubMatrix(K, 1, 4, 3, 3) = getSubMatrix(K, 0, 5, 3, 3); getSubMatrix(K, 1, 4, 3, 3)(0, 1) = n2; getSubMatrix(K, 1, 4, 3, 3)(0, 2) = e1; getSubMatrix(K, 1, 4, 3, 3)(1, 0) = e2; getSubMatrix(K, 1, 4, 3, 3)(2, 0) = e1; getSubMatrix(K, 2, 7, 3, 3) = getSubMatrix(K, 0, 5, 3, 3); getSubMatrix(K, 2, 7, 3, 3)(0, 2) = e1; getSubMatrix(K, 2, 7, 3, 3)(1, 2) = e2; getSubMatrix(K, 2, 7, 3, 3)(2, 0) = e1; getSubMatrix(K, 2, 7, 3, 3)(2, 1) = n2; getSubMatrix(K, 3, 6, 3, 3) = getSubMatrix(K, 0, 5, 3, 3); getSubMatrix(K, 3, 6, 3, 3)(0, 1) = n2; getSubMatrix(K, 3, 6, 3, 3)(1, 0) = e2; getSubMatrix(K, 3, 6, 3, 3)(1, 2) = e2; getSubMatrix(K, 3, 6, 3, 3)(2, 1) = n2; getSubMatrix(K, 1, 6, 3, 3)(0, 0) = d2; getSubMatrix(K, 1, 6, 3, 3)(0, 1) = e2; getSubMatrix(K, 1, 6, 3, 3)(0, 2) = e2; getSubMatrix(K, 1, 6, 3, 3)(1, 0) = n2; getSubMatrix(K, 1, 6, 3, 3)(1, 1) = d1; getSubMatrix(K, 1, 6, 3, 3)(1, 2) = n1; getSubMatrix(K, 1, 6, 3, 3)(2, 0) = n2; getSubMatrix(K, 1, 6, 3, 3)(2, 1) = n1; getSubMatrix(K, 1, 6, 3, 3)(2, 2) = d1; getSubMatrix(K, 2, 5, 3, 3) = getSubMatrix(K, 1, 6, 3, 3); getSubMatrix(K, 2, 5, 3, 3)(0, 1) = n2; getSubMatrix(K, 2, 5, 3, 3)(1, 0) = e2; getSubMatrix(K, 2, 5, 3, 3)(1, 2) = e1; getSubMatrix(K, 2, 5, 3, 3)(2, 1) = e1; getSubMatrix(K, 0, 7, 3, 3) = getSubMatrix(K, 1, 6, 3, 3); getSubMatrix(K, 0, 7, 3, 3)(0, 1) = n2; getSubMatrix(K, 0, 7, 3, 3)(0, 2) = n2; getSubMatrix(K, 0, 7, 3, 3)(1, 0) = e2; getSubMatrix(K, 0, 7, 3, 3)(2, 0) = e2; getSubMatrix(K, 3, 4, 3, 3) = getSubMatrix(K, 1, 6, 3, 3); getSubMatrix(K, 3, 4, 3, 3)(0, 2) = n2; getSubMatrix(K, 3, 4, 3, 3)(1, 2) = e1; getSubMatrix(K, 3, 4, 3, 3)(2, 0) = e2; getSubMatrix(K, 3, 4, 3, 3)(2, 1) = e1; getSubMatrix(K, 0, 2, 3, 3)(0, 0) = d1; getSubMatrix(K, 0, 2, 3, 3)(0, 1) = n1; getSubMatrix(K, 0, 2, 3, 3)(0, 2) = e2; getSubMatrix(K, 0, 2, 3, 3)(1, 0) = n1; getSubMatrix(K, 0, 2, 3, 3)(1, 1) = d1; getSubMatrix(K, 0, 2, 3, 3)(1, 2) = e2; getSubMatrix(K, 0, 2, 3, 3)(2, 0) = n2; getSubMatrix(K, 0, 2, 3, 3)(2, 1) = n2; getSubMatrix(K, 0, 2, 3, 3)(2, 2) = d2; getSubMatrix(K, 1, 3, 3, 3) = getSubMatrix(K, 0, 2, 3, 3); getSubMatrix(K, 1, 3, 3, 3)(0, 1) = e1; getSubMatrix(K, 1, 3, 3, 3)(0, 2) = n2; getSubMatrix(K, 1, 3, 3, 3)(1, 0) = e1; getSubMatrix(K, 1, 3, 3, 3)(2, 0) = e2; getSubMatrix(K, 4, 6, 3, 3) = getSubMatrix(K, 0, 2, 3, 3); getSubMatrix(K, 4, 6, 3, 3)(0, 2) = n2; getSubMatrix(K, 4, 6, 3, 3)(1, 2) = n2; getSubMatrix(K, 4, 6, 3, 3)(2, 0) = e2; getSubMatrix(K, 4, 6, 3, 3)(2, 1) = e2; getSubMatrix(K, 5, 7, 3, 3) = getSubMatrix(K, 0, 2, 3, 3); getSubMatrix(K, 5, 7, 3, 3)(0, 1) = e1; getSubMatrix(K, 5, 7, 3, 3)(1, 0) = e1; getSubMatrix(K, 5, 7, 3, 3)(1, 2) = n2; getSubMatrix(K, 5, 7, 3, 3)(2, 1) = e2; } // Cube diagonals { double d = (-a - 2.0 * c) / 36.0; double e = (b + c) / 24.0; double n = -e; getSubMatrix(K, 0, 6, 3, 3).setConstant(n); getSubMatrix(K, 0, 6, 3, 3).diagonal().setConstant(d); getSubMatrix(K, 1, 7, 3, 3).setConstant(e); getSubMatrix(K, 1, 7, 3, 3).diagonal().setConstant(d); getSubMatrix(K, 1, 7, 3, 3)(1, 2) = n; getSubMatrix(K, 1, 7, 3, 3)(2, 1) = n; getSubMatrix(K, 2, 4, 3, 3).setConstant(e); getSubMatrix(K, 2, 4, 3, 3).diagonal().setConstant(d); getSubMatrix(K, 2, 4, 3, 3)(0, 1) = n; getSubMatrix(K, 2, 4, 3, 3)(1, 0) = n; getSubMatrix(K, 3, 5, 3, 3).setConstant(e); getSubMatrix(K, 3, 5, 3, 3).diagonal().setConstant(d); getSubMatrix(K, 3, 5, 3, 3)(0, 2) = n; getSubMatrix(K, 3, 5, 3, 3)(2, 0) = n; } // Use symmetry to complete the triangular inferior part of K K.triangularView().setZero(); K += K.triangularView().adjoint(); } addSubMatrix(K, nodeIdsVectorForm, 3 , &m_expectedStiffnessMatrix); } void computeExpectedMassMatrix(std::vector nodeIdsVectorForm) { using SurgSim::Math::addSubMatrix; Eigen::Matrix M = Eigen::Matrix::Zero(); // "Physically-Based Simulation of Objects Represented by Surface Meshes" // Muller, Techner, Gross, CGI 2004 // Given the shape functions they defined on Appendix A for the cube we are testing // We can derive the mass matrix M = \int_V rho N^T.N dV // N being a matrix (3x24) of shape functions // cf documentation double a = 1.0 / 27.0; double b = a / 2.0; double c = a / 4.0; double d = a / 8.0; M.diagonal().setConstant(a); M.block(0, 3, 21, 21).diagonal().setConstant(b); M.block(3 * 3, 3 * 4, 3, 3).diagonal().setConstant(c); // block (3, 4) M.block(0, 6, 18, 18).diagonal().setConstant(c); M.block(3 * 2, 3 * 4, 6, 6).diagonal().setConstant(d); // block (2, 4) and block (3, 5) M.block(0, 9, 15, 15).diagonal().setConstant(c); M.block(3 * 0, 3 * 3, 3, 3).diagonal().setConstant(b); // block (0, 3) M.block(3 * 4, 3 * 7, 3, 3).diagonal().setConstant(b); // block (4, 7) M.block(0, 12, 12, 12).diagonal().setConstant(b); M.block(0, 15, 9, 9).diagonal().setConstant(c); M.block(0, 18, 6, 6).diagonal().setConstant(d); M.block(0, 21, 3, 3).diagonal().setConstant(c); // Symmetry for (size_t row = 0; row < 24; ++row) { for (size_t col = row + 1; col < 24; ++col) { M(col, row) = M(row, col); } } M *= m_rho; addSubMatrix(M, nodeIdsVectorForm, 3 , &m_expectedMassMatrix); } void SetUp() override { using SurgSim::Math::getSubVector; using SurgSim::Math::getSubMatrix; m_restState.setNumDof(3, 8); Vector& x0 = m_restState.getPositions(); // Cube is aligned with the axis (X,Y,Z), centered on (0.0, 0.0, 0.0), of size 1 // 2*-----------*3 // / /| // 6*-----------*7 | ^ y // | | | | // | 0 | *1 *->x // | | / / // 4*-----------*5 z getSubVector(x0, 0, 3) = Vector3d(-0.5, -0.5, -0.5); getSubVector(x0, 1, 3) = Vector3d(0.5, -0.5, -0.5); getSubVector(x0, 2, 3) = Vector3d(-0.5, 0.5, -0.5); getSubVector(x0, 3, 3) = Vector3d(0.5, 0.5, -0.5); getSubVector(x0, 4, 3) = Vector3d(-0.5, -0.5, 0.5); getSubVector(x0, 5, 3) = Vector3d(0.5, -0.5, 0.5); getSubVector(x0, 6, 3) = Vector3d(-0.5, 0.5, 0.5); getSubVector(x0, 7, 3) = Vector3d(0.5, 0.5, 0.5); // Ordering following the description in // "Physically-Based Simulation of Objects Represented by Surface Meshes" // Muller, Techner, Gross, CGI 2004 std::array tmpNodeIds = {{0, 1, 3, 2, 4, 5, 7, 6}}; m_nodeIds = tmpNodeIds; // Useful for assembly helper function std::vector nodeIdsVectorForm(tmpNodeIds.begin(), tmpNodeIds.end()); // Build the expected x0 vector for (size_t i = 0; i < 8; i++) { getSubVector(m_expectedX0, i, 3) = getSubVector(x0, m_nodeIds[i], 3); } // The cube has a size of 1, so its volume is 1m^3 m_expectedVolume = 1.0; m_rho = 1000.0; m_E = 1e6; m_nu = 0.45; m_expectedMassMatrix.setZero(3 * 8, 3 * 8); m_expectedDampingMatrix.setZero(3 * 8, 3 * 8); m_expectedStiffnessMatrix.setZero(3 * 8, 3 * 8); m_vectorOnes.setOnes(3 * 8); computeExpectedMassMatrix(nodeIdsVectorForm); computeExpectedStiffnessMatrix(nodeIdsVectorForm); } // This method tests all node permutations for both face definition (2 groups of 4 indices) // keeping their ordering intact (CW or CCW) void testNodeOrderingAllPermutations(const SurgSim::Math::OdeState& m_restState, size_t id0, size_t id1, size_t id2, size_t id3, size_t id4, size_t id5, size_t id6, size_t id7, bool expectThrow) { std::array face1 = {{id0, id1, id2, id3}}; std::array face2 = {{id4, id5, id6, id7}}; // Shuffle the faces to create all the possible permutations for (size_t face1Permutation = 0; face1Permutation < 4; face1Permutation++) { for (size_t face2Permutation = 0; face2Permutation < 4; face2Permutation++) { std::array ids; for (size_t index = 0; index < 4; index++) { ids[ index] = face1[(index + face1Permutation) % 4]; ids[4 + index] = face2[(index + face2Permutation) % 4]; } // Test this permutation if (expectThrow) { EXPECT_ANY_THROW({auto cube = getCubeElement(ids); cube->initialize(m_restState);}); } else { EXPECT_NO_THROW({auto cube = getCubeElement(ids); cube->initialize(m_restState);}); } } } } }; extern void testSize(const Vector& v, int expectedSize); extern void testSize(const Matrix& m, int expectedRows, int expectedCols); TEST_F(Fem3DElementCubeTests, ConstructorTest) { ASSERT_NO_THROW({MockFem3DElementCube cube(m_nodeIds);}); ASSERT_NO_THROW({MockFem3DElementCube* cube = new MockFem3DElementCube(m_nodeIds); delete cube;}); ASSERT_NO_THROW({std::shared_ptr cube = std::make_shared(m_nodeIds); }); } TEST_F(Fem3DElementCubeTests, InitializeTest) { { SCOPED_TRACE("Invalid node ids"); std::array invalidNodeIds = {{0, 1, 2, 3, 4, 10, 9, 8}}; ASSERT_NO_THROW({auto cube = getCubeElement(invalidNodeIds);}); auto cube = getCubeElement(invalidNodeIds); ASSERT_THROW(cube->initialize(m_restState), SurgSim::Framework::AssertionFailure); } { SCOPED_TRACE("Valid node ids"); ASSERT_NO_THROW({auto cube = getCubeElement(m_nodeIds);}); auto cube = getCubeElement(m_nodeIds); ASSERT_NO_THROW(cube->initialize(m_restState)); } } TEST_F(Fem3DElementCubeTests, NodeIdsTest) { Fem3DElementCube cube(m_nodeIds); EXPECT_EQ(8u, cube.getNumNodes()); EXPECT_EQ(8u, cube.getNodeIds().size()); for (int i = 0; i < 8; i++) { EXPECT_EQ(m_nodeIds[i], cube.getNodeId(i)); EXPECT_EQ(m_nodeIds[i], cube.getNodeIds()[i]); } } TEST_F(Fem3DElementCubeTests, VolumeTest) { { SCOPED_TRACE("Volume valid and positive"); auto cube = getCubeElement(m_nodeIds); cube->initialize(m_restState); // rest volume is computed by the initialize method EXPECT_NEAR(cube->getRestVolume(), m_expectedVolume, 1e-10); EXPECT_NEAR(cube->getVolume(m_restState), m_expectedVolume, 1e-10); } { SCOPED_TRACE("Volume valid but negative"); std::array nodeIds = {{0, 1, 3, 2, 4, 6, 7, 5}}; auto cube = getCubeElement(nodeIds); ASSERT_THROW(cube->initialize(m_restState), SurgSim::Framework::AssertionFailure); } { SCOPED_TRACE("Volume invalid, degenerated cube"); // Copy the 1st 4 points over the 4 following points, so the cube degenerate to a square m_restState.getPositions().segment<3 * 4>(12) = m_restState.getPositions().segment<3 * 4>(0); auto cube = getCubeElement(m_nodeIds); ASSERT_THROW(cube->initialize(m_restState), SurgSim::Framework::AssertionFailure); } } TEST_F(Fem3DElementCubeTests, NodeOrderingTest) { // Any definition starting with a 1st face defined CW // followed by the opposite face defined CCW is valid. // Front face CW, opposite face CCW testNodeOrderingAllPermutations(m_restState, 6, 7, 5, 4, 2, 3, 1, 0, false); // Front face CW, opposite face CW testNodeOrderingAllPermutations(m_restState, 6, 7, 5, 4, 2, 0, 1, 3, true); // Front face CCW, opposite face CCW testNodeOrderingAllPermutations(m_restState, 6, 4, 5, 7, 2, 3, 1, 0, true); // Front face CCW, opposite face CW testNodeOrderingAllPermutations(m_restState, 6, 4, 5, 7, 2, 0, 1, 3, true); // Back face CW, opposite face CCW testNodeOrderingAllPermutations(m_restState, 0, 1, 3, 2, 4, 5, 7, 6, false); // Back face CW, opposite face CW testNodeOrderingAllPermutations(m_restState, 0, 1, 3, 2, 4, 6, 7, 5, true); // Back face CCW, opposite face CCW testNodeOrderingAllPermutations(m_restState, 0, 2, 3, 1, 4, 5, 7, 6, true); // Back face CCW, opposite face CW testNodeOrderingAllPermutations(m_restState, 0, 2, 3, 1, 4, 6, 7, 5, true); // Top face CW, opposite face CCW testNodeOrderingAllPermutations(m_restState, 2, 3, 7, 6, 0, 1, 5, 4, false); // Top face CW, opposite face CW testNodeOrderingAllPermutations(m_restState, 2, 3, 7, 6, 0, 4, 5, 1, true); // Top face CCW, opposite face CCW testNodeOrderingAllPermutations(m_restState, 2, 6, 7, 3, 0, 1, 5, 4, true); // Top face CCW, opposite face CW testNodeOrderingAllPermutations(m_restState, 2, 6, 7, 3, 0, 4, 5, 1, true); // Bottom face CW, opposite face CCW testNodeOrderingAllPermutations(m_restState, 0, 4, 5, 1, 6, 7, 3, 2, false); // Bottom face CW, opposite face CW testNodeOrderingAllPermutations(m_restState, 0, 4, 5, 1, 6, 2, 3, 7, true); // Bottom face CCW, opposite face CCW testNodeOrderingAllPermutations(m_restState, 0, 1, 5, 4, 6, 7, 3, 2, true); // Bottom face CCW, opposite face CW testNodeOrderingAllPermutations(m_restState, 0, 1, 5, 4, 6, 2, 3, 7, true); // Right face CW, opposite face CCW testNodeOrderingAllPermutations(m_restState, 3, 1, 5, 7, 2, 0, 4, 6, false); // Right face CW, opposite face CW testNodeOrderingAllPermutations(m_restState, 3, 1, 5, 7, 2, 6, 4, 0, true); // Right face CCW, opposite face CCW testNodeOrderingAllPermutations(m_restState, 3, 7, 5, 1, 2, 0, 4, 6, true); // Right face CCW, opposite face CW testNodeOrderingAllPermutations(m_restState, 3, 7, 5, 1, 2, 6, 4, 0, true); // Left face CW, opposite face CCW testNodeOrderingAllPermutations(m_restState, 0, 2, 6, 4, 1, 3, 7, 5, false); // Left face CW, opposite face CW testNodeOrderingAllPermutations(m_restState, 0, 2, 6, 4, 1, 5, 7, 3, true); // Left face CCW, opposite face CCW testNodeOrderingAllPermutations(m_restState, 0, 4, 6, 2, 1, 3, 7, 5, true); // Left face CCW, opposite face CW testNodeOrderingAllPermutations(m_restState, 0, 4, 6, 2, 1, 5, 7, 3, true); } TEST_F(Fem3DElementCubeTests, ShapeFunctionsTest) { using SurgSim::Math::getSubVector; auto cube = getCubeElement(m_nodeIds); cube->initialize(m_restState); EXPECT_TRUE(cube->getInitialPosition().isApprox(m_expectedX0)) << "x0 = " << cube->getInitialPosition().transpose() << std::endl << "x0 expected = " << m_expectedX0.transpose(); // We should have by construction: // { N0(p0) = 1 N1(p0)=N2(p0)=N3(p0)=0 // { N1(p1) = 1 N1(p1)=N2(p1)=N3(p1)=0 // { N2(p2) = 1 N1(p2)=N2(p2)=N3(p2)=0 // { N3(p3) = 1 N1(p3)=N2(p3)=N3(p3)=0 Vector3d p[8]; for (size_t nodeId = 0; nodeId < 8; ++nodeId) { // retrieving the points from expectedX0 with indices 0..7 // which is equivalent to // retrieving the points from m_restState with indices m_nodeIds[0]..m_nodeIds[7] p[nodeId] = getSubVector(m_expectedX0, nodeId, 3); } double Ni_p0[8], Ni_p1[8], Ni_p2[8], Ni_p3[8], Ni_p4[8], Ni_p5[8], Ni_p6[8], Ni_p7[8]; for (int i = 0; i < 8; i++) { Ni_p0[i] = cube->evaluateN(i, -1.0, -1.0, -1.0); Ni_p1[i] = cube->evaluateN(i, +1.0, -1.0, -1.0); Ni_p2[i] = cube->evaluateN(i, +1.0, +1.0, -1.0); Ni_p3[i] = cube->evaluateN(i, -1.0, +1.0, -1.0); Ni_p4[i] = cube->evaluateN(i, -1.0, -1.0, +1.0); Ni_p5[i] = cube->evaluateN(i, +1.0, -1.0, +1.0); Ni_p6[i] = cube->evaluateN(i, +1.0, +1.0, +1.0); Ni_p7[i] = cube->evaluateN(i, -1.0, +1.0, +1.0); } EXPECT_NEAR(Ni_p0[0], 1.0, 1e-12); for (size_t i = 0; i < 8; ++i) { if (i == 0) { continue; } EXPECT_NEAR(Ni_p0[i], 0.0, 1e-12); } EXPECT_NEAR(Ni_p1[1], 1.0, 1e-12); for (size_t i = 0; i < 8; ++i) { if (i == 1) { continue; } EXPECT_NEAR(Ni_p1[i], 0.0, 1e-12); } EXPECT_NEAR(Ni_p2[2], 1.0, 1e-12); for (size_t i = 0; i < 8; ++i) { if (i == 2) { continue; } EXPECT_NEAR(Ni_p2[i], 0.0, 1e-12); } EXPECT_NEAR(Ni_p3[3], 1.0, 1e-12); for (size_t i = 0; i < 8; ++i) { if (i == 3) { continue; } EXPECT_NEAR(Ni_p3[i], 0.0, 1e-12); } EXPECT_NEAR(Ni_p4[4], 1.0, 1e-12); for (size_t i = 0; i < 8; ++i) { if (i == 4) { continue; } EXPECT_NEAR(Ni_p4[i], 0.0, 1e-12); } EXPECT_NEAR(Ni_p5[5], 1.0, 1e-12); for (size_t i = 0; i < 8; ++i) { if (i == 5) { continue; } EXPECT_NEAR(Ni_p5[i], 0.0, 1e-12); } EXPECT_NEAR(Ni_p6[6], 1.0, 1e-12); for (size_t i = 0; i < 8; ++i) { if (i == 6) { continue; } EXPECT_NEAR(Ni_p6[i], 0.0, 1e-12); } EXPECT_NEAR(Ni_p7[7], 1.0, 1e-12); for (size_t i = 0; i < 8; ++i) { if (i == 7) { continue; } EXPECT_NEAR(Ni_p7[i], 0.0, 1e-12); } // We should have the relation sum(Ni(x,y,z) = 1) for all points in the volume // We verify that relation by sampling the tetrahedron volume for (double epsilon = -1.0; epsilon <= 1.0; epsilon += 0.1) { for (double eta = -1.0; eta <= 1.0; eta += 0.1) { for (double mu = -1.0; mu <= 1.0; mu += 0.1) { double Ni_p[8]; double sum = 0.0; for (int i = 0; i < 8; i++) { Ni_p[i] = cube->evaluateN(i, epsilon, eta, mu); sum += Ni_p[i]; } EXPECT_NEAR(sum, 1.0, 1e-10) << " for epsilon = " << epsilon << ", eta = " << eta << ", mu = " << mu << std::endl << " N0(epsilon,eta,mu) = " << Ni_p[0] << " N1(epsilon,eta,mu) = " << Ni_p[1] << " N2(epsilon,eta,mu) = " << Ni_p[2] << " N3(epsilon,eta,mu) = " << Ni_p[3] << " N4(epsilon,eta,mu) = " << Ni_p[4] << " N5(epsilon,eta,mu) = " << Ni_p[5] << " N6(epsilon,eta,mu) = " << Ni_p[6] << " N7(epsilon,eta,mu) = " << Ni_p[7]; } } } } TEST_F(Fem3DElementCubeTests, CoordinateTests) { auto cube = getCubeElement(m_nodeIds); cube->initialize(m_restState); { // Non-normalize node SurgSim::Math::Vector nodePositions(8); nodePositions << 0.7, 0.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0; EXPECT_FALSE(cube->isValidCoordinate(nodePositions)); // Node with point which is outside of the cube nodePositions << 1.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0; EXPECT_FALSE(cube->isValidCoordinate(nodePositions)); // Normal node nodePositions << 0.5, 0.25, 0.25, 0.0, 0.0, 0.0, 0.0, 0.0; EXPECT_TRUE(cube->isValidCoordinate(nodePositions)); } { // Node with more than 8 coordinate points SurgSim::Math::Vector nodePositions(9); nodePositions << 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0; EXPECT_FALSE(cube->isValidCoordinate(nodePositions)); } { // Node with some coordinates less than 0 but greater than epsilon and // some greater than 1 and less than (1 + epsilon). SurgSim::Math::Vector nodePositions(8); nodePositions << -1e-11, 1.0 + 1e-11, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0; EXPECT_TRUE(cube->isValidCoordinate(nodePositions)); } // Test computeCartesianCoordinate. { // Compute central point of the cube SurgSim::Math::Vector nodePositions(8); nodePositions << 0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125; EXPECT_TRUE(cube->isValidCoordinate(nodePositions)); EXPECT_TRUE(SurgSim::Math::Vector3d(0.0, 0.0, 0.0).isApprox( cube->computeCartesianCoordinate(m_restState, nodePositions), epsilon)); } { SurgSim::Math::Vector nodePositions(8); nodePositions << 0.01, 0.07, 0.11, 0.05, 0.0, 0.23, 0.13, 0.4; EXPECT_TRUE(cube->isValidCoordinate(nodePositions)); EXPECT_TRUE(SurgSim::Math::Vector3d(0.04, 0.19, 0.26).isApprox( cube->computeCartesianCoordinate(m_restState, nodePositions), epsilon)); // 0.01 * (-0.5,-0.5,-0.5) => (-0.005, -0.005, -0.005) // 0.07 * ( 0.5,-0.5,-0.5) => ( 0.035, -0.035, -0.035) // 0.11 * ( 0.5, 0.5,-0.5) => ( 0.055, 0.055, -0.055) // 0.05 * (-0.5, 0.5,-0.5) => (-0.025, 0.025, -0.025) // 0.0 * (-0.5,-0.5, 0.5) => (-0.00, -0.00, 0.00) // 0.23 * ( 0.5,-0.5, 0.5) => ( 0.115, -0.115, 0.115) // 0.13 * ( 0.5, 0.5, 0.5) => ( 0.065, 0.065, 0.065) // 0.4 * (-0.5, 0.5, 0.5) => (-0.20, 0.20, 0.20) // = ( 0.04, 0.19, 0.26) } // Test computeNaturalCoordinate. EXPECT_THROW(cube->computeNaturalCoordinate(m_restState, SurgSim::Math::Vector3d(0.0, 0.0, 0.0)), SurgSim::Framework::AssertionFailure); } TEST_F(Fem3DElementCubeTests, ForceAndMatricesTest) { using SurgSim::Math::getSubVector; auto cube = getCubeElement(m_nodeIds); cube->initialize(m_restState); Vector forceVector = Vector::Zero(3 * 8); SparseMatrix massMatrix(3 * 8, 3 * 8); SparseMatrix dampingMatrix(3 * 8, 3 * 8); SparseMatrix stiffnessMatrix(3 * 8, 3 * 8); Matrix zeroMatrix = Matrix::Zero(cube->getNumDofPerNode() * cube->getNumNodes(), cube->getNumDofPerNode() * cube->getNumNodes()); massMatrix.setZero(); cube->assembleMatrixBlocks(zeroMatrix, cube->getNodeIds(), static_cast(cube->getNumDofPerNode()), &massMatrix, true); massMatrix.makeCompressed(); dampingMatrix.setZero(); cube->assembleMatrixBlocks(zeroMatrix, cube->getNodeIds(), static_cast(cube->getNumDofPerNode()), &dampingMatrix, true); dampingMatrix.makeCompressed(); stiffnessMatrix.setZero(); cube->assembleMatrixBlocks(zeroMatrix, cube->getNodeIds(), static_cast(cube->getNumDofPerNode()), &stiffnessMatrix, true); stiffnessMatrix.makeCompressed(); // Update the internal f, M, D, K variables. cube->updateFMDK(m_restState, SurgSim::Math::ODEEQUATIONUPDATE_FMDK); // No force should be produced when in rest state (x = x0) => F = K.(x-x0) = 0 cube->addForce(&forceVector); EXPECT_TRUE(forceVector.isZero()); cube->addMass(&massMatrix); EXPECT_TRUE(massMatrix.isApprox(m_expectedMassMatrix)) << "Expected mass matrix :" << std::endl << m_expectedMassMatrix << std::endl << std::endl << "Mass matrix :" << std::endl << massMatrix << std::endl; cube->addDamping(&dampingMatrix); EXPECT_TRUE(dampingMatrix.isApprox(m_expectedDampingMatrix)); cube->addStiffness(&stiffnessMatrix); EXPECT_TRUE(stiffnessMatrix.isApprox(m_expectedStiffnessMatrix)) << "Expected stiffness matrix :" << std::endl << m_expectedStiffnessMatrix << std::endl << std::endl << "Stiffness matrix :" << std::endl << stiffnessMatrix << std::endl; forceVector.setZero(); clearMatrix(&massMatrix); clearMatrix(&dampingMatrix); clearMatrix(&stiffnessMatrix); cube->addFMDK(&forceVector, &massMatrix, &dampingMatrix, &stiffnessMatrix); EXPECT_TRUE(forceVector.isZero()); EXPECT_TRUE(massMatrix.isApprox(m_expectedMassMatrix)); EXPECT_TRUE(dampingMatrix.isApprox(m_expectedDampingMatrix)); EXPECT_TRUE(stiffnessMatrix.isApprox(m_expectedStiffnessMatrix)); // Test addMatVec API with Mass component only forceVector.setZero(); cube->addMatVec(1.0, 0.0, 0.0, m_vectorOnes, &forceVector); for (int rowId = 0; rowId < 3 * 8; rowId++) { EXPECT_NEAR(m_expectedMassMatrix.row(rowId).sum(), forceVector[rowId], epsilon); } // Test addMatVec API with Damping component only forceVector.setZero(); cube->addMatVec(0.0, 1.0, 0.0, m_vectorOnes, &forceVector); for (int rowId = 0; rowId < 3 * 8; rowId++) { EXPECT_NEAR(m_expectedDampingMatrix.row(rowId).sum(), forceVector[rowId], epsilon); } // Test addMatVec API with Stiffness component only forceVector.setZero(); cube->addMatVec(0.0, 0.0, 1.0, m_vectorOnes, &forceVector); for (int rowId = 0; rowId < 3 * 8; rowId++) { EXPECT_NEAR(m_expectedStiffnessMatrix.row(rowId).sum(), forceVector[rowId], epsilon); } // Test addMatVec API with mix Mass/Damping/Stiffness components forceVector.setZero(); cube->addMatVec(1.0, 2.0, 3.0, m_vectorOnes, &forceVector); for (int rowId = 0; rowId < 3 * 8; rowId++) { double expectedCoef = 1.0 * m_expectedMassMatrix.row(rowId).sum() + 2.0 * m_expectedDampingMatrix.row(rowId).sum() + 3.0 * m_expectedStiffnessMatrix.row(rowId).sum(); EXPECT_NEAR(expectedCoef, forceVector[rowId], epsilon); } } opensurgsim-0.7.0/SurgSim/Physics/UnitTests/Fem3DElementTetrahedronTests.cpp000066400000000000000000000504661277777236100272430ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include #include "SurgSim/Framework/Assert.h" #include "SurgSim/Math/Matrix.h" #include "SurgSim/Math/OdeEquation.h" #include "SurgSim/Math/OdeState.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/Fem3DElementTetrahedron.h" using SurgSim::Physics::Fem3DElementTetrahedron; using SurgSim::Math::clearMatrix; using SurgSim::Math::Vector3d; using SurgSim::Math::Vector; using SurgSim::Math::Matrix; using SurgSim::Math::SparseMatrix; namespace { /// Useful function to compute a shape function /// \param i ith shape function /// \param ai, bi, ci, di The shape functions parameters /// \param p The point to evaluate the shape function at /// \return Ni(p) = 1/6V . (ai + bi.px + ci.py + di.pz) double N(size_t i, double V, double* ai, double* bi, double* ci, double* di, const Vector3d& p) { double inv6V = 1.0 / (6.0 * V); return inv6V * (ai[i] + bi[i] * p[0] + ci[i] * p[1] + di[i] * p[2]); } const double epsilon = 1e-8; }; class MockFem3DElementTet : public Fem3DElementTetrahedron { public: explicit MockFem3DElementTet(std::array nodeIds) : Fem3DElementTetrahedron(nodeIds) { } double getRestVolume() const { return m_restVolume; } void getShapeFunction(int i, double* ai, double* bi, double* ci, double* di) const { *ai = m_ai[i]; *bi = m_bi[i]; *ci = m_ci[i]; *di = m_di[i]; } const Eigen::Matrix& getInitialPosition() const { return m_x0; } void setupInitialParams(const SurgSim::Math::OdeState& state, double massDensity, double poissonRatio, double youngModulus) { setMassDensity(massDensity); setPoissonRatio(poissonRatio); setYoungModulus(youngModulus); initialize(state); } }; class Fem3DElementTetrahedronTests : public ::testing::Test { public: std::array m_nodeIds; SurgSim::Math::OdeState m_restState; double m_expectedVolume; Eigen::Matrix m_expectedX0; double m_rho, m_E, m_nu; SurgSim::Math::Matrix m_expectedMassMatrix, m_expectedDampingMatrix; SurgSim::Math::Matrix m_expectedStiffnessMatrix, m_expectedStiffnessMatrix2; SurgSim::Math::Vector m_vectorOnes; void SetUp() override { using SurgSim::Math::getSubVector; using SurgSim::Math::getSubMatrix; using SurgSim::Math::addSubMatrix; m_nodeIds[0] = 3; m_nodeIds[1] = 1; m_nodeIds[2] = 14; m_nodeIds[3] = 9; std::vector m_nodeIdsVectorForm; // Useful for assembly helper function m_nodeIdsVectorForm.push_back(m_nodeIds[0]); m_nodeIdsVectorForm.push_back(m_nodeIds[1]); m_nodeIdsVectorForm.push_back(m_nodeIds[2]); m_nodeIdsVectorForm.push_back(m_nodeIds[3]); m_restState.setNumDof(3, 15); Vector& x0 = m_restState.getPositions(); // Tet is aligned with the axis (X,Y,Z), centered on (0.1, 1.2, 2.3), embedded in a cube of size 1 getSubVector(m_expectedX0, 0, 3) = getSubVector(x0, m_nodeIds[0], 3) = Vector3d(0.1, 1.2, 2.3); getSubVector(m_expectedX0, 1, 3) = getSubVector(x0, m_nodeIds[1], 3) = Vector3d(1.1, 1.2, 2.3); getSubVector(m_expectedX0, 2, 3) = getSubVector(x0, m_nodeIds[2], 3) = Vector3d(0.1, 2.2, 2.3); getSubVector(m_expectedX0, 3, 3) = getSubVector(x0, m_nodeIds[3], 3) = Vector3d(0.1, 1.2, 3.3); // The tet is part of a cube of size 1x1x1 (it occupies 1/6 of the cube's volume) m_expectedVolume = 1.0 / 6.0; m_rho = 1000.0; m_E = 1e6; m_nu = 0.45; m_expectedMassMatrix.setZero(3 * 15, 3 * 15); m_expectedDampingMatrix.setZero(3 * 15, 3 * 15); m_expectedStiffnessMatrix.setZero(3 * 15, 3 * 15); m_expectedStiffnessMatrix2.setZero(3 * 15, 3 * 15); m_vectorOnes.setOnes(3 * 15); Eigen::Matrix M = Eigen::Matrix::Zero(); { M.diagonal().setConstant(2.0); M.block(0, 3, 9, 9).diagonal().setConstant(1.0); M.block(0, 6, 6, 6).diagonal().setConstant(1.0); M.block(0, 9, 3, 3).diagonal().setConstant(1.0); M.block(3, 0, 9, 9).diagonal().setConstant(1.0); M.block(6, 0, 6, 6).diagonal().setConstant(1.0); M.block(9, 0, 3, 3).diagonal().setConstant(1.0); } M *= m_rho * m_expectedVolume / 20.0; addSubMatrix(M, m_nodeIdsVectorForm, 3 , &m_expectedMassMatrix); Eigen::Matrix K = Eigen::Matrix::Zero(); { // Calculation done by hand from // http://www.colorado.edu/engineering/CAS/courses.d/AFEM.d/AFEM.Ch09.d/AFEM.Ch09.pdf // ai = {} // bi = {-1 1 0 0} // ci = {-1 0 1 0} // di = {-1 0 0 1} Eigen::Matrix B = Eigen::Matrix::Zero(); Eigen::Matrix E = Eigen::Matrix::Zero(); B(0, 0) = -1; B(0, 3) = 1; B(1, 1) = -1; B(1, 7) = 1; B(2, 2) = -1; B(2, 11) = 1; B(3, 0) = -1; B(3, 1) = -1; B(3, 4) = 1; B(3, 6) = 1; B(4, 1) = -1; B(4, 2) = -1; B(4, 8) = 1; B(4, 10) = 1; B(5, 0) = -1; B(5, 2) = -1; B(5, 5) = 1; B(5, 9) = 1; B *= 1.0 / (6.0 * m_expectedVolume); E.block(0, 0, 3, 3).setConstant(m_nu); E.block(0, 0, 3, 3).diagonal().setConstant(1.0 - m_nu); E.block(3, 3, 3, 3).diagonal().setConstant(0.5 - m_nu); E *= m_E / ((1.0 + m_nu) * (1.0 - 2.0 * m_nu)); K = m_expectedVolume * B.transpose() * E * B; } addSubMatrix(K, m_nodeIdsVectorForm, 3 , &m_expectedStiffnessMatrix); // Expecte stiffness matrix given for our case in: // http://www.colorado.edu/engineering/CAS/courses.d/AFEM.d/AFEM.Ch09.d/AFEM.Ch09.pdf double E = m_E / (12.0 * (1.0 - 2.0 * m_nu) * (1.0 + m_nu)); double n0 = 1.0 - 2.0 * m_nu; double n1 = 1.0 - m_nu; K.setZero(); // Fill up the upper triangle part first (without diagonal elements) K(0, 1) = K(0, 2) = K(1, 2) = 1.0; K(0, 3) = -2.0 * n1; K(0, 4) = -n0; K(0, 5) = -n0; K(1, 3) = -2.0 * m_nu; K(1, 4) = -n0; K(2, 3) = -2.0 * m_nu; K(2, 5) = -n0; K(0, 6) = - n0; K(0, 7) = -2.0 * m_nu; K(1, 6) = - n0; K(1, 7) = -2.0 * n1; K(1, 8) = - n0; K(2, 7) = - 2.0 * m_nu; K(2, 8) = -n0; K(0, 9) = - n0; K(0, 11) = -2.0 * m_nu; K(1, 10) = - n0; K(1, 11) = -2.0 * m_nu; K(2, 9) = - n0; K(2, 10) = - n0; K(2, 11) = -2.0 * n1; K(3, 7) = K(3, 11) = 2.0 * m_nu; K(4, 6) = n0; K(5, 9) = n0; K(7, 11) = 2.0 * m_nu; K(8, 10) = n0; K += K.transpose().eval(); // symmetric part (do not forget the .eval() !) K.block(0, 0, 3, 3).diagonal().setConstant(4.0 - 6.0 * m_nu); // diagonal elements K.block(3, 3, 9, 9).diagonal().setConstant(n0); // diagonal elements K(3, 3) = K(7, 7) = K(11, 11) = 2.0 * n1; // diagonal elements K *= E; addSubMatrix(K, m_nodeIdsVectorForm, 3 , &m_expectedStiffnessMatrix2); } }; extern void testSize(const Vector& v, int expectedSize); extern void testSize(const Matrix& m, int expectedRows, int expectedCols); TEST_F(Fem3DElementTetrahedronTests, ConstructorTest) { ASSERT_NO_THROW({MockFem3DElementTet tet(m_nodeIds);}); ASSERT_NO_THROW({MockFem3DElementTet* tet = new MockFem3DElementTet(m_nodeIds); delete tet;}); ASSERT_NO_THROW({std::shared_ptr tet = std::make_shared(m_nodeIds); }); } TEST_F(Fem3DElementTetrahedronTests, NodeIdsTest) { Fem3DElementTetrahedron tet(m_nodeIds); EXPECT_EQ(4u, tet.getNumNodes()); EXPECT_EQ(4u, tet.getNodeIds().size()); for (int i = 0; i < 4; i++) { EXPECT_EQ(m_nodeIds[i], tet.getNodeId(i)); EXPECT_EQ(m_nodeIds[i], tet.getNodeIds()[i]); } } TEST_F(Fem3DElementTetrahedronTests, VolumeTest) { MockFem3DElementTet tet(m_nodeIds); tet.setupInitialParams(m_restState, m_rho, m_nu, m_E); EXPECT_NEAR(tet.getRestVolume(), m_expectedVolume, 1e-10); EXPECT_NEAR(tet.getVolume(m_restState), m_expectedVolume, 1e-10); } TEST_F(Fem3DElementTetrahedronTests, CoordinateTests) { Fem3DElementTetrahedron element(m_nodeIds); Vector3d expectedA(0.1, 1.2, 2.3); Vector3d expectedB(1.1, 1.2, 2.3); Vector3d expectedC(0.1, 2.2, 2.3); Vector3d expectedD(0.1, 1.2, 3.3); Vector validNaturalCoordinate(4); Vector validNaturalCoordinate2(4); Vector invalidNaturalCoordinateSumNot1(4); Vector invalidNaturalCoordinateNegativeValue(4); Vector invalidNaturalCoordinateBiggerThan1Value(4); Vector invalidNaturalCoordinateSize3(3), invalidNaturalCoordinateSize5(5); validNaturalCoordinate << 0.4, 0.3, 0.2, 0.1; validNaturalCoordinate2 << -1e-11, 1.0 + 1e-11, 0.0, 0.0; invalidNaturalCoordinateSumNot1 << 0.1, 0.1, 0.1, 0.1; invalidNaturalCoordinateNegativeValue << 0.7, 0.7, -0.5, 0.1; invalidNaturalCoordinateBiggerThan1Value << 1.4, 0.6, -1.2, 0.2; invalidNaturalCoordinateSize3 << 0.4, 0.4, 0.2; invalidNaturalCoordinateSize5 << 0.2, 0.2, 0.2, 0.2, 0.2; EXPECT_TRUE(element.isValidCoordinate(validNaturalCoordinate)); EXPECT_TRUE(element.isValidCoordinate(validNaturalCoordinate2)); EXPECT_FALSE(element.isValidCoordinate(invalidNaturalCoordinateSumNot1)); EXPECT_FALSE(element.isValidCoordinate(invalidNaturalCoordinateNegativeValue)); EXPECT_FALSE(element.isValidCoordinate(invalidNaturalCoordinateBiggerThan1Value)); EXPECT_FALSE(element.isValidCoordinate(invalidNaturalCoordinateSize3)); EXPECT_FALSE(element.isValidCoordinate(invalidNaturalCoordinateSize5)); Vector naturalCoordinateA(4), naturalCoordinateB(4), naturalCoordinateC(4), naturalCoordinateD(4); Vector naturalCoordinateMiddle(4); Vector ptA, ptB, ptC, ptD, ptMiddle; naturalCoordinateA << 1.0, 0.0, 0.0, 0.0; naturalCoordinateB << 0.0, 1.0, 0.0, 0.0; naturalCoordinateC << 0.0, 0.0, 1.0, 0.0; naturalCoordinateD << 0.0, 0.0, 0.0, 1.0; naturalCoordinateMiddle << 1.0 / 4.0, 1.0 / 4.0, 1.0 / 4.0, 1 / 4.0; EXPECT_THROW(ptA = element.computeCartesianCoordinate(m_restState, invalidNaturalCoordinateBiggerThan1Value), \ SurgSim::Framework::AssertionFailure); EXPECT_THROW(ptA = element.computeCartesianCoordinate(m_restState, invalidNaturalCoordinateNegativeValue), \ SurgSim::Framework::AssertionFailure); EXPECT_THROW(ptA = element.computeCartesianCoordinate(m_restState, invalidNaturalCoordinateSize3), \ SurgSim::Framework::AssertionFailure); EXPECT_THROW(ptA = element.computeCartesianCoordinate(m_restState, invalidNaturalCoordinateSize5), \ SurgSim::Framework::AssertionFailure); EXPECT_THROW(ptA = element.computeCartesianCoordinate(m_restState, invalidNaturalCoordinateSumNot1), \ SurgSim::Framework::AssertionFailure); EXPECT_NO_THROW(ptA = element.computeCartesianCoordinate(m_restState, naturalCoordinateA)); EXPECT_NO_THROW(ptB = element.computeCartesianCoordinate(m_restState, naturalCoordinateB)); EXPECT_NO_THROW(ptC = element.computeCartesianCoordinate(m_restState, naturalCoordinateC)); EXPECT_NO_THROW(ptD = element.computeCartesianCoordinate(m_restState, naturalCoordinateD)); EXPECT_NO_THROW(ptMiddle = element.computeCartesianCoordinate(m_restState, naturalCoordinateMiddle)); EXPECT_TRUE(ptA.isApprox(expectedA)); EXPECT_TRUE(ptB.isApprox(expectedB)); EXPECT_TRUE(ptC.isApprox(expectedC)); EXPECT_TRUE(ptD.isApprox(expectedD)); EXPECT_TRUE(ptMiddle.isApprox((expectedA + expectedB + expectedC + expectedD) / 4.0)); // Test computeNaturalCoordinate. SurgSim::Math::Vector2d cartesian2d(1, 0); SurgSim::Math::Vector4d cartesian4d(1, 0, 0, 0); EXPECT_THROW(element.computeNaturalCoordinate(m_restState, cartesian2d), SurgSim::Framework::AssertionFailure); EXPECT_THROW(element.computeNaturalCoordinate(m_restState, cartesian4d), SurgSim::Framework::AssertionFailure); std::vector listOfNaturalCoordinates; listOfNaturalCoordinates.push_back(SurgSim::Math::Vector4d(1, 0, 0, 0)); listOfNaturalCoordinates.push_back(SurgSim::Math::Vector4d(0, 1, 0, 0)); listOfNaturalCoordinates.push_back(SurgSim::Math::Vector4d(0, 0, 1, 0)); listOfNaturalCoordinates.push_back(SurgSim::Math::Vector4d(0, 0, 0, 1)); listOfNaturalCoordinates.push_back(SurgSim::Math::Vector4d(0.354623, 0.768423, 0.12457, 0.327683)); listOfNaturalCoordinates.push_back(SurgSim::Math::Vector4d(1.354623, 2.768423, 3.12457, 4.327683)); listOfNaturalCoordinates.push_back(SurgSim::Math::Vector4d(0.546323, 2.435323, -69.3422, 345.423)); listOfNaturalCoordinates.push_back(SurgSim::Math::Vector4d(0.352346, 3.3424, 9.325324, 5.32432)); listOfNaturalCoordinates.push_back(SurgSim::Math::Vector4d(0.623543, 9.2345, 2.45346, 1.645745)); listOfNaturalCoordinates.push_back(SurgSim::Math::Vector4d(0.356234, 435.234, 32545.234, 9534.2123)); SurgSim::Math::Vector4d input, calculated(0, 0, 0, 0); Vector cartesian; for (auto testCase = listOfNaturalCoordinates.begin(); testCase != listOfNaturalCoordinates.end(); ++testCase) { input = (*testCase).cwiseAbs(); input /= input.sum(); EXPECT_NO_THROW(cartesian = element.computeCartesianCoordinate(m_restState, input)); EXPECT_NO_THROW(calculated = element.computeNaturalCoordinate(m_restState, cartesian);); EXPECT_TRUE(input.isApprox(calculated)); } } TEST_F(Fem3DElementTetrahedronTests, ShapeFunctionsTest) { using SurgSim::Math::getSubVector; MockFem3DElementTet tet(m_nodeIds); tet.setupInitialParams(m_restState, m_rho, m_nu, m_E); EXPECT_TRUE(tet.getInitialPosition().isApprox(m_expectedX0)) << "x0 = " << tet.getInitialPosition().transpose() << std::endl << "x0 expected = " << m_expectedX0.transpose(); double ai[4], bi[4], ci[4], di[4]; double sumAi = 0.0; for (int i = 0; i < 4; i++) { tet.getShapeFunction(i, &(ai[i]), &(bi[i]), &(ci[i]), &(di[i])); sumAi += ai[i]; } EXPECT_DOUBLE_EQ(6.0 * m_expectedVolume, sumAi); // Ni(x,y,z) = 1/6V . (ai + bi.x + ci.y + di.z) // We should have by construction: // { N0(p0) = 1 N1(p0)=N2(p0)=N3(p0)=0 // { N1(p1) = 1 N1(p1)=N2(p1)=N3(p1)=0 // { N2(p2) = 1 N1(p2)=N2(p2)=N3(p2)=0 // { N3(p3) = 1 N1(p3)=N2(p3)=N3(p3)=0 const Vector3d p0 = getSubVector(m_expectedX0, 0, 3); const Vector3d p1 = getSubVector(m_expectedX0, 1, 3); const Vector3d p2 = getSubVector(m_expectedX0, 2, 3); const Vector3d p3 = getSubVector(m_expectedX0, 3, 3); double Ni_p0[4], Ni_p1[4], Ni_p2[4], Ni_p3[4]; for (int i = 0; i < 4; i++) { Ni_p0[i] = N(i, m_expectedVolume, ai, bi, ci, di, p0); Ni_p1[i] = N(i, m_expectedVolume, ai, bi, ci, di, p1); Ni_p2[i] = N(i, m_expectedVolume, ai, bi, ci, di, p2); Ni_p3[i] = N(i, m_expectedVolume, ai, bi, ci, di, p3); } EXPECT_NEAR(Ni_p0[0], 1.0, 1e-12); EXPECT_NEAR(Ni_p0[1], 0.0, 1e-12); EXPECT_NEAR(Ni_p0[2], 0.0, 1e-12); EXPECT_NEAR(Ni_p0[3], 0.0, 1e-12); EXPECT_NEAR(Ni_p1[0], 0.0, 1e-12); EXPECT_NEAR(Ni_p1[1], 1.0, 1e-12); EXPECT_NEAR(Ni_p1[2], 0.0, 1e-12); EXPECT_NEAR(Ni_p1[3], 0.0, 1e-12); EXPECT_NEAR(Ni_p2[0], 0.0, 1e-12); EXPECT_NEAR(Ni_p2[1], 0.0, 1e-12); EXPECT_NEAR(Ni_p2[2], 1.0, 1e-12); EXPECT_NEAR(Ni_p2[3], 0.0, 1e-12); EXPECT_NEAR(Ni_p3[0], 0.0, 1e-12); EXPECT_NEAR(Ni_p3[1], 0.0, 1e-12); EXPECT_NEAR(Ni_p3[2], 0.0, 1e-12); EXPECT_NEAR(Ni_p3[3], 1.0, 1e-12); // We should have the relation sum(Ni(x,y,z) = 1) for all points in the volume // We verify that relation by sampling the tetrahedron volume for (double sp0p1 = 0; sp0p1 <= 1.0; sp0p1 += 0.1) { for (double sp0p2 = 0; sp0p1 + sp0p2 <= 1.0; sp0p2 += 0.1) { for (double sp0p3 = 0; sp0p1 + sp0p2 + sp0p3 <= 1.0; sp0p3 += 0.1) { Vector3d p = p0 + sp0p1 * (p1 - p0) + sp0p2 * (p2 - p0) + sp0p3 * (p3 - p0); double Ni_p[4]; for (int i = 0; i < 4; i++) { Ni_p[i] = N(i, m_expectedVolume, ai, bi, ci, di, p); } EXPECT_NEAR(Ni_p[0] + Ni_p[1] + Ni_p[2] + Ni_p[3], 1.0, 1e-10) << " for sp0p1 = " << sp0p1 << ", sp0p2 = " << sp0p2 << ", sp0p3 = " << sp0p3 << std::endl << " N0(x,y,z) = " << Ni_p[0] << " N1(x,y,z) = " << Ni_p[1] << " N2(x,y,z) = " << Ni_p[2] << " N3(x,y,z) = " << Ni_p[3]; } } } } TEST_F(Fem3DElementTetrahedronTests, ForceAndMatricesTest) { using SurgSim::Math::getSubVector; MockFem3DElementTet tet(m_nodeIds); // Test the various mode of failure related to the physical parameters // This has been already tested in FemElementTests, but this is to make sure this method is called properly // So the same behavior should be expected { // Mass density not set ASSERT_ANY_THROW(tet.initialize(m_restState)); // Poisson Ratio not set tet.setMassDensity(-1234.56); ASSERT_ANY_THROW(tet.initialize(m_restState)); // Young modulus not set tet.setPoissonRatio(0.55); ASSERT_ANY_THROW(tet.initialize(m_restState)); // Invalid mass density tet.setYoungModulus(-4321.33); ASSERT_ANY_THROW(tet.initialize(m_restState)); // Invalid Poisson ratio tet.setMassDensity(m_rho); ASSERT_ANY_THROW(tet.initialize(m_restState)); // Invalid Young modulus tet.setPoissonRatio(m_nu); ASSERT_ANY_THROW(tet.initialize(m_restState)); tet.setYoungModulus(m_E); ASSERT_NO_THROW(tet.initialize(m_restState)); } Vector forceVector = Vector::Zero(3 * 15); SparseMatrix massMatrix(3 * 15, 3 * 15); SparseMatrix dampingMatrix(3 * 15, 3 * 15); SparseMatrix stiffnessMatrix(3 * 15, 3 * 15); Matrix zeroMatrix = Matrix::Zero(tet.getNumDofPerNode() * tet.getNumNodes(), tet.getNumDofPerNode() * tet.getNumNodes()); massMatrix.setZero(); tet.assembleMatrixBlocks(zeroMatrix, tet.getNodeIds(), static_cast(tet.getNumDofPerNode()), &massMatrix, true); massMatrix.makeCompressed(); dampingMatrix.setZero(); tet.assembleMatrixBlocks(zeroMatrix, tet.getNodeIds(), static_cast(tet.getNumDofPerNode()), &dampingMatrix, true); dampingMatrix.makeCompressed(); stiffnessMatrix.setZero(); tet.assembleMatrixBlocks(zeroMatrix, tet.getNodeIds(), static_cast(tet.getNumDofPerNode()), &stiffnessMatrix, true); stiffnessMatrix.makeCompressed(); // Make sure that the 2 ways of computing the expected stiffness matrix gives the same result EXPECT_TRUE(m_expectedStiffnessMatrix.isApprox(m_expectedStiffnessMatrix2)); // Update the internal f, M, D, K variables. tet.updateFMDK(m_restState, SurgSim::Math::ODEEQUATIONUPDATE_FMDK); // No force should be produced when in rest state (x = x0) => F = K.(x-x0) = 0 tet.addForce(&forceVector); EXPECT_TRUE(forceVector.isZero()); tet.addMass(&massMatrix); EXPECT_TRUE(massMatrix.isApprox(m_expectedMassMatrix)); tet.addDamping(&dampingMatrix); EXPECT_TRUE(dampingMatrix.isApprox(m_expectedDampingMatrix)); tet.addStiffness(&stiffnessMatrix); EXPECT_TRUE(stiffnessMatrix.isApprox(m_expectedStiffnessMatrix)); EXPECT_TRUE(stiffnessMatrix.isApprox(m_expectedStiffnessMatrix2)); forceVector.setZero(); clearMatrix(&massMatrix); clearMatrix(&dampingMatrix); clearMatrix(&stiffnessMatrix); tet.addFMDK(&forceVector, &massMatrix, &dampingMatrix, &stiffnessMatrix); EXPECT_TRUE(forceVector.isZero()); EXPECT_TRUE(massMatrix.isApprox(m_expectedMassMatrix)); EXPECT_TRUE(dampingMatrix.isApprox(m_expectedDampingMatrix)); EXPECT_TRUE(stiffnessMatrix.isApprox(m_expectedStiffnessMatrix)); EXPECT_TRUE(stiffnessMatrix.isApprox(m_expectedStiffnessMatrix2)); // Test addMatVec API with Mass component only forceVector.setZero(); tet.addMatVec(1.0, 0.0, 0.0, m_vectorOnes, &forceVector); for (int rowId = 0; rowId < 3 * 15; rowId++) { EXPECT_NEAR(m_expectedMassMatrix.row(rowId).sum(), forceVector[rowId], epsilon); } // Test addMatVec API with Damping component only forceVector.setZero(); tet.addMatVec(0.0, 1.0, 0.0, m_vectorOnes, &forceVector); for (int rowId = 0; rowId < 3 * 15; rowId++) { EXPECT_NEAR(m_expectedDampingMatrix.row(rowId).sum(), forceVector[rowId], epsilon); } // Test addMatVec API with Stiffness component only forceVector.setZero(); tet.addMatVec(0.0, 0.0, 1.0, m_vectorOnes, &forceVector); for (int rowId = 0; rowId < 3 * 15; rowId++) { EXPECT_NEAR(m_expectedStiffnessMatrix.row(rowId).sum(), forceVector[rowId], epsilon); } // Test addMatVec API with mix Mass/Damping/Stiffness components forceVector.setZero(); tet.addMatVec(1.0, 2.0, 3.0, m_vectorOnes, &forceVector); for (int rowId = 0; rowId < 3 * 15; rowId++) { double expectedCoef = 1.0 * m_expectedMassMatrix.row(rowId).sum() + 2.0 * m_expectedDampingMatrix.row(rowId).sum() + 3.0 * m_expectedStiffnessMatrix.row(rowId).sum(); EXPECT_NEAR(expectedCoef, forceVector[rowId], epsilon); } } opensurgsim-0.7.0/SurgSim/Physics/UnitTests/Fem3DLocalizationTest.cpp000066400000000000000000000146421277777236100257130ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include #include "SurgSim/Math/OdeState.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/Fem1DRepresentation.h" #include "SurgSim/Physics/Fem2DRepresentation.h" #include "SurgSim/Physics/Fem3DElementCube.h" #include "SurgSim/Physics/Fem3DElementTetrahedron.h" #include "SurgSim/Physics/Fem3DLocalization.h" #include "SurgSim/Physics/Fem3DRepresentation.h" using SurgSim::DataStructures::IndexedLocalCoordinate; using SurgSim::Math::getSubVector; namespace { const double epsilon = 1e-10; }; namespace SurgSim { namespace Physics { void addTetraheadron(Fem3DRepresentation *fem, std::array nodes, const SurgSim::Math::OdeState& state, double massDensity = 1.0, double poissonRatio = 0.1, double youngModulus = 1.0) { auto element = std::make_shared(nodes); element->setMassDensity(massDensity); element->setPoissonRatio(poissonRatio); element->setYoungModulus(youngModulus); element->initialize(state); fem->addFemElement(element); } class Fem3DLocalizationTest : public ::testing::Test { public: void SetUp() { using SurgSim::Math::Vector3d; m_fem = std::make_shared("Fem3dRepresentation"); auto state = std::make_shared(); state->setNumDof(3, 6); auto& x = state->getPositions(); getSubVector(x, 0, 3) = Vector3d( 0.0, 0.0, 0.0); getSubVector(x, 1, 3) = Vector3d( 0.0, 1.0, -1.0); getSubVector(x, 2, 3) = Vector3d(-1.0, 1.0, 0.0); getSubVector(x, 3, 3) = Vector3d( 0.0, 1.0, 0.0); getSubVector(x, 4, 3) = Vector3d( 1.0, 1.0, 0.0); getSubVector(x, 5, 3) = Vector3d( 1.0, 0.0, -1.0); // Define Tetrahedrons { std::array nodes = {{0, 1, 2, 3}}; addTetraheadron(m_fem.get(), nodes, *state); } { std::array nodes = {{0, 1, 3, 4}}; addTetraheadron(m_fem.get(), nodes, *state); } { std::array nodes = {{0, 1, 4, 5}}; addTetraheadron(m_fem.get(), nodes, *state); } m_fem->setInitialState(state); m_fem->setLocalActive(true); // FEMRepresentation for Fem3DElementCube m_fem3DCube = std::make_shared("Fem3dCubeRepresentation"); auto restState = std::make_shared(); restState->setNumDof(3, 8); auto& x0 = restState->getPositions(); getSubVector(x0, 0, 3) = Vector3d(-1.0,-1.0,-1.0); getSubVector(x0, 1, 3) = Vector3d( 1.0,-1.0,-1.0); getSubVector(x0, 2, 3) = Vector3d(-1.0, 1.0,-1.0); getSubVector(x0, 3, 3) = Vector3d( 1.0, 1.0,-1.0); getSubVector(x0, 4, 3) = Vector3d(-1.0,-1.0, 1.0); getSubVector(x0, 5, 3) = Vector3d( 1.0,-1.0, 1.0); getSubVector(x0, 6, 3) = Vector3d(-1.0, 1.0, 1.0); getSubVector(x0, 7, 3) = Vector3d( 1.0, 1.0, 1.0); // Define Cube { std::array node0 = {{0, 1, 3, 2, 4, 5, 7, 6}}; std::shared_ptr femElement = std::make_shared(node0); femElement->setMassDensity(1.0); femElement->setPoissonRatio(0.1); femElement->setYoungModulus(1.0); m_fem3DCube->addFemElement(femElement); } m_fem3DCube->setInitialState(restState); m_fem3DCube->setLocalActive(true); m_validLocalPosition.index = 1; m_validLocalPosition.coordinate = SurgSim::Math::Vector::Zero(4); m_validLocalPosition.coordinate[0] = 0.4; m_validLocalPosition.coordinate[1] = 0.6; m_validLocalPositionForCube.index = 0; m_validLocalPositionForCube.coordinate = SurgSim::Math::Vector::Zero(8); m_validLocalPositionForCube.coordinate[0] = 0.4; m_validLocalPositionForCube.coordinate[1] = 0.6; m_invalidIndexLocalPosition.index = 3; m_invalidIndexLocalPosition.coordinate = SurgSim::Math::Vector::Zero(4); m_invalidIndexLocalPosition.coordinate[0] = 0.4; m_invalidIndexLocalPosition.coordinate[1] = 0.6; m_invalidCoordinateLocalPosition.index = 1; m_invalidCoordinateLocalPosition.coordinate = SurgSim::Math::Vector::Zero(4); m_invalidCoordinateLocalPosition.coordinate[0] = 0.6; m_invalidCoordinateLocalPosition.coordinate[1] = 0.6; } void TearDown() { } std::shared_ptr m_fem; std::shared_ptr m_fem3DCube; SurgSim::DataStructures::IndexedLocalCoordinate m_validLocalPosition; SurgSim::DataStructures::IndexedLocalCoordinate m_invalidIndexLocalPosition; SurgSim::DataStructures::IndexedLocalCoordinate m_invalidCoordinateLocalPosition; SurgSim::DataStructures::IndexedLocalCoordinate m_validLocalPositionForCube; }; TEST_F(Fem3DLocalizationTest, ConstructorTest) { // IndexedLocalCoordinate pointing to a node (node index + empty coordinate) or a triangle // (triangleID + coordinate of size 2) are invalid. Both will failed, either because the index is out of bound, // or because the coordinates are the wrong size (empty or of size 2 do not correspond to any valid 3d FemElements) // This is tested by m_invalidIndexLocalPosition and m_invalidCoordinateLocalPosition ASSERT_THROW(std::make_shared(m_fem, m_invalidIndexLocalPosition), SurgSim::Framework::AssertionFailure); ASSERT_THROW(std::make_shared(m_fem, m_invalidCoordinateLocalPosition), SurgSim::Framework::AssertionFailure); ASSERT_NO_THROW(std::make_shared(m_fem, m_validLocalPosition);); ASSERT_NO_THROW(std::make_shared(m_fem3DCube, m_validLocalPositionForCube);); } TEST_F(Fem3DLocalizationTest, IsValidRepresentation) { Fem3DLocalization localization(m_fem, m_validLocalPosition); ASSERT_TRUE(localization.isValidRepresentation(m_fem)); // nullptr is valid ASSERT_TRUE(localization.isValidRepresentation(nullptr)); ASSERT_FALSE(localization.isValidRepresentation(std::make_shared("fem1d"))); ASSERT_FALSE(localization.isValidRepresentation(std::make_shared("fem2d"))); } } // namespace SurgSim } // namespace Physics opensurgsim-0.7.0/SurgSim/Physics/UnitTests/Fem3DPlyReaderDelegateTests.cpp000066400000000000000000000122421277777236100267620ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/DataStructures/PlyReader.h" #include "SurgSim/Framework/ApplicationData.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Math/OdeState.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/Fem.h" #include "SurgSim/Physics/Fem3DPlyReaderDelegate.h" using SurgSim::Math::Vector3d; using SurgSim::DataStructures::PlyReader; namespace SurgSim { namespace Physics { TEST(Fem3DRepresentationReaderTests, TetrahedronMeshDelegateTest) { auto fem = std::make_shared(); auto runtime = std::make_shared("config.txt"); fem->load("PlyReaderTests/Tetrahedron.ply"); // Vertices Vector3d vertex0(1.0, 1.0, -1.0); Vector3d vertex25(-1.0, -1.0, 1.0); EXPECT_TRUE(vertex0.isApprox(fem->getVertex(0).position)); EXPECT_TRUE(vertex25.isApprox(fem->getVertex(25).position)); // Tetrahedrons ASSERT_EQ(12u, fem->getNumElements()); std::array tetrahedron0 = {0, 1, 2, 3}; std::array tetrahedron2 = {10, 25, 11, 9}; EXPECT_TRUE(std::equal(std::begin(tetrahedron0), std::end(tetrahedron0), std::begin(fem->getElement(0)->nodeIds))); EXPECT_TRUE(std::equal(std::begin(tetrahedron2), std::end(tetrahedron2), std::begin(fem->getElement(11)->nodeIds))); // Boundary conditions ASSERT_EQ(8u, fem->getBoundaryConditions().size()); EXPECT_EQ(8, fem->getBoundaryCondition(0)); EXPECT_EQ(5, fem->getBoundaryCondition(1)); EXPECT_EQ(3, fem->getBoundaryCondition(2)); EXPECT_EQ(2, fem->getBoundaryCondition(3)); EXPECT_EQ(7, fem->getBoundaryCondition(4)); EXPECT_EQ(1, fem->getBoundaryCondition(5)); EXPECT_EQ(6, fem->getBoundaryCondition(6)); EXPECT_EQ(11, fem->getBoundaryCondition(7)); // Material auto fem2 = fem->getElement(2); EXPECT_DOUBLE_EQ(0.1432, fem2->massDensity); EXPECT_DOUBLE_EQ(0.224, fem2->poissonRatio); EXPECT_DOUBLE_EQ(0.472, fem2->youngModulus); auto fem8 = fem->getElement(8); EXPECT_DOUBLE_EQ(0.1432, fem8->massDensity); EXPECT_DOUBLE_EQ(0.224, fem8->poissonRatio); EXPECT_DOUBLE_EQ(0.472, fem8->youngModulus); } TEST(Fem3DRepresentationReaderTests, CubeMeshDelegateTest) { auto fem = std::make_shared(); auto runtime = std::make_shared("config.txt"); fem->load("PlyReaderTests/Fem3DCube.ply"); // Vertices Vector3d vertex0(1.0, 1.0, 1.0); Vector3d vertex5(2.0, 2.0, 2.0); EXPECT_TRUE(vertex0.isApprox(fem->getVertex(0).position)); EXPECT_TRUE(vertex5.isApprox(fem->getVertex(5).position)); // Cubes ASSERT_EQ(3u, fem->getNumElements()); std::array cube0 = {0, 1, 2, 3, 4, 5, 6, 7}; std::array cube2 = {3, 4, 5, 0, 2, 6, 8, 7}; EXPECT_TRUE(std::equal(std::begin(cube0), std::end(cube0), std::begin(fem->getElement(0)->nodeIds))); EXPECT_TRUE(std::equal(std::begin(cube2), std::end(cube2), std::begin(fem->getElement(2)->nodeIds))); // Boundary conditions ASSERT_EQ(2u, fem->getBoundaryConditions().size()); EXPECT_EQ(9, fem->getBoundaryCondition(0)); EXPECT_EQ(5, fem->getBoundaryCondition(1)); // Material auto fem2 = fem->getElement(2); EXPECT_DOUBLE_EQ(0.2, fem2->massDensity); EXPECT_DOUBLE_EQ(0.3, fem2->poissonRatio); EXPECT_DOUBLE_EQ(0.4, fem2->youngModulus); auto fem1 = fem->getElement(1); EXPECT_DOUBLE_EQ(0.2, fem1->massDensity); EXPECT_DOUBLE_EQ(0.3, fem1->poissonRatio); EXPECT_DOUBLE_EQ(0.4, fem1->youngModulus); } TEST(Fem3DRepresentationReaderTests, WrongPlyWithRotationDof) { auto fem = std::make_shared(); auto runtime = std::make_shared("config.txt"); ASSERT_NO_THROW(fem->load("PlyReaderTests/Wrong3DFileWithRotationData.ply")); } TEST(Fem3DRepresentationReaderTests, PerElementMaterial) { auto fem = std::make_shared(); auto runtime = std::make_shared("config.txt"); fem->load("PlyReaderTests/Fem3DCubeMaterial.ply"); // Material double value = 1.0; for (size_t i = 0; i < fem->getNumElements(); ++i) { auto element = fem->getElement(i); EXPECT_DOUBLE_EQ(value++, element->massDensity); EXPECT_DOUBLE_EQ(value++, element->poissonRatio); EXPECT_DOUBLE_EQ(value++, element->youngModulus); } } TEST(Fem3DRepresentationReaderTests, NoMaterials) { auto fem = std::make_shared(); auto runtime = std::make_shared("config.txt"); ASSERT_NO_THROW(fem->load("PlyReaderTests/Fem3DCubeNoMaterial.ply")); for (auto element : fem->getElements()) { EXPECT_DOUBLE_EQ(0.0, element->massDensity); EXPECT_DOUBLE_EQ(0.0, element->poissonRatio); EXPECT_DOUBLE_EQ(0.0, element->youngModulus); } } } // Physics } // SurgSim opensurgsim-0.7.0/SurgSim/Physics/UnitTests/Fem3DRepresentationTests.cpp000066400000000000000000000505111277777236100264430ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file Fem3DRepresentationTests.cpp /// This file tests the non-abstract functionalities of the base class fem3DRepresentation #include #include "SurgSim/DataStructures/Location.h" #include "SurgSim/Framework/ApplicationData.h" #include "SurgSim/Framework/Runtime.h" ///< Used to initialize the Component Fem3DRepresentation #include "SurgSim/Math/MeshShape.h" #include "SurgSim/Math/OdeState.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/DeformableCollisionRepresentation.h" #include "SurgSim/Physics/Fem3DElementTetrahedron.h" #include "SurgSim/Physics/Fem3DLocalization.h" #include "SurgSim/Physics/Fem3DRepresentation.h" #include "SurgSim/Physics/UnitTests/MockObjects.h" namespace SurgSim { namespace Physics { class Fem3DRepresentationTests : public ::testing::Test { public: void SetUp() override { m_numNodes = 10; } void createFem() { m_fem = std::make_shared("Fem3d"); m_initialState = std::make_shared(); m_initialState->setNumDof(m_fem->getNumDofPerNode(), m_numNodes); m_initialState->getPositions().setLinSpaced(1.23, 9.43); m_initialState->getVelocities().setLinSpaced(-0.94, 1.09); SurgSim::Math::Quaterniond q(1.0, 2.0, 3.0, 4.0); SurgSim::Math::Vector3d t(1.0, 2.0, 3.0); q.normalize(); m_initialPose = SurgSim::Math::makeRigidTransform(q, t); } void addFemElement() { std::array elementNodeIds = {{0, 1, 2, 3}}; std::shared_ptr element = std::make_shared(elementNodeIds); element->setYoungModulus(1e9); element->setPoissonRatio(0.45); element->setMassDensity(1000.0); m_fem->addFemElement(element); } void createLocalization() { SurgSim::DataStructures::IndexedLocalCoordinate femRepCoordinate; femRepCoordinate.index = 0; femRepCoordinate.coordinate = SurgSim::Math::Vector::Zero(4); femRepCoordinate.coordinate[0] = 1.0; m_localization = std::make_shared(m_fem, femRepCoordinate); m_wrongLocalizationType = std::make_shared(); m_wrongLocalizationType->setRepresentation(m_fem); } protected: size_t m_numNodes; std::shared_ptr m_fem; std::shared_ptr m_initialState; SurgSim::Math::RigidTransform3d m_initialPose; std::shared_ptr m_localization; std::shared_ptr m_wrongLocalizationType; }; TEST_F(Fem3DRepresentationTests, ConstructorTest) { ASSERT_NO_THROW(std::shared_ptr fem = std::make_shared("Fem3D")); } TEST_F(Fem3DRepresentationTests, GetNumDofPerNodeTest) { createFem(); EXPECT_EQ(3u, m_fem->getNumDofPerNode()); } TEST_F(Fem3DRepresentationTests, TransformInitialStateTest) { using SurgSim::Math::Vector; createFem(); m_fem->setLocalPose(m_initialPose); m_fem->setInitialState(m_initialState); Vector expectedX = Vector::Zero(m_fem->getNumDof()), expectedV = Vector::Zero(m_fem->getNumDof()); for (size_t nodeId = 0; nodeId < m_numNodes; nodeId++) { expectedX.segment<3>(m_fem->getNumDofPerNode() * nodeId) = m_initialPose * m_initialState->getPosition(nodeId); expectedV.segment<3>(m_fem->getNumDofPerNode() * nodeId) = m_initialPose.linear() * m_initialState->getVelocity(nodeId); } // Initialize the component ASSERT_TRUE(m_fem->initialize(std::make_shared())); // Wake-up the component => apply the pose to the initial state ASSERT_TRUE(m_fem->wakeUp()); EXPECT_TRUE(m_fem->getInitialState()->getPositions().isApprox(expectedX)); EXPECT_TRUE(m_fem->getInitialState()->getVelocities().isApprox(expectedV)); } TEST_F(Fem3DRepresentationTests, DoInitializeTest) { auto runtime = std::make_shared("config.txt"); { SCOPED_TRACE("Initialize with a valid file name"); createFem(); m_fem->loadFem("PlyReaderTests/Tetrahedron.ply"); // Fem3DRepresentation::initialize() will call Fem3DRepresentation::doInitialize(), which should load the file. ASSERT_NO_THROW(ASSERT_TRUE(m_fem->initialize(runtime))); EXPECT_EQ(3u, m_fem->getNumDofPerNode()); EXPECT_EQ(3u * 26u, m_fem->getNumDof()); EXPECT_EQ(24u, m_fem->getInitialState()->getNumBoundaryConditions()); } { SCOPED_TRACE("Initialize with an invalid file name"); createFem(); EXPECT_ANY_THROW(m_fem->loadFem("Non existent fake name")); } { SCOPED_TRACE("Initialize with file name not set"); createFem(); // Fem3DRepresentation will not try to load file, but fem3DRepresentation::doInitialize() will throw. EXPECT_ANY_THROW(m_fem->initialize(runtime)); } { SCOPED_TRACE("Loading file with incorrect PLY format"); createFem(); EXPECT_ANY_THROW(m_fem->loadFem("PlyReaderTests/WrongPlyTetrahedron.ply")); } { SCOPED_TRACE("Loading file with incorrect data"); createFem(); EXPECT_ANY_THROW(m_fem->loadFem("PlyReaderTests/WrongDataTetrahedron.ply");); } } TEST_F(Fem3DRepresentationTests, CreateLocalizationTest) { auto runtime = std::make_shared("config.txt"); ASSERT_NO_THROW(createFem()); ASSERT_NO_THROW(m_fem->loadFem("Geometry/wound_deformable.ply")); auto triangleMesh = std::make_shared(); triangleMesh->load("Geometry/wound_deformable.ply"); // Create the collision mesh for the surface of the finite element model auto collisionRepresentation = std::make_shared("Collision"); collisionRepresentation->setShape(triangleMesh); m_fem->setCollisionRepresentation(collisionRepresentation); bool wokeUp = false; ASSERT_TRUE(m_fem->initialize(runtime)); EXPECT_NO_THROW(wokeUp = m_fem->wakeUp();); EXPECT_TRUE(wokeUp); auto& meshTriangles = triangleMesh->getTriangles(); size_t triangleId = 0; SurgSim::Math::Vector3d centroid; for (auto triangle = meshTriangles.cbegin(); triangle != meshTriangles.cend(); ++triangle, ++triangleId) { std::array triangleNodeIds = triangle->verticesId; centroid = triangleMesh->getVertexPosition(triangleNodeIds[0]); centroid += triangleMesh->getVertexPosition(triangleNodeIds[1]); centroid += triangleMesh->getVertexPosition(triangleNodeIds[2]); centroid /= 3.0; // Test the localization with each of the triangle vertices and the triangle centroid. std::array points = {centroid, triangleMesh->getVertexPosition(triangleNodeIds[0]), triangleMesh->getVertexPosition(triangleNodeIds[1]), triangleMesh->getVertexPosition(triangleNodeIds[2]) }; std::array barycentricCoordinates = {SurgSim::Math::Vector3d::Ones() / 3.0, SurgSim::Math::Vector3d::UnitX(), SurgSim::Math::Vector3d::UnitY(), SurgSim::Math::Vector3d::UnitZ() }; auto barycentricCoordinate = barycentricCoordinates.cbegin(); for (auto point = points.cbegin(); point != points.cend(); ++point, ++barycentricCoordinate) { SurgSim::DataStructures::IndexedLocalCoordinate triangleLocalPosition(triangleId, *barycentricCoordinate); SurgSim::DataStructures::Location location(triangleLocalPosition, SurgSim::DataStructures::Location::TRIANGLE); std::shared_ptr localization; EXPECT_NO_THROW(localization = std::dynamic_pointer_cast(m_fem->createLocalization(location));); EXPECT_TRUE(localization != nullptr); EXPECT_TRUE(localization->getRepresentation() == m_fem); SurgSim::Math::Vector globalPosition; SurgSim::DataStructures::IndexedLocalCoordinate coordinate = localization->getLocalPosition(); EXPECT_NO_THROW(globalPosition = m_fem->getFemElement(coordinate.index)->computeCartesianCoordinate( *m_fem->getCurrentState(), coordinate.coordinate);); EXPECT_EQ(3, globalPosition.size()); EXPECT_TRUE(globalPosition.isApprox(*point)); } } // Localization on an invalid node { SCOPED_TRACE("Invalid node"); SurgSim::DataStructures::Location location(1000); std::shared_ptr localization; EXPECT_THROW(localization = m_fem->createLocalization(location), SurgSim::Framework::AssertionFailure); } // Localization on a valid node { SCOPED_TRACE("Valid node"); SurgSim::DataStructures::Location location(0); std::shared_ptr localization; EXPECT_NO_THROW(localization = std::dynamic_pointer_cast( m_fem->createLocalization(location));); EXPECT_TRUE(localization != nullptr); EXPECT_TRUE(localization->getRepresentation() == m_fem); SurgSim::Math::Vector3d globalPosition; SurgSim::DataStructures::IndexedLocalCoordinate coordinate = localization->getLocalPosition(); EXPECT_NO_THROW(globalPosition = m_fem->getCurrentState()->getPosition(coordinate.index);); EXPECT_TRUE(globalPosition.isApprox(localization->calculatePosition())); } // Localization on an invalid tetrahedron { SCOPED_TRACE("Invalid tetrahedron index"); Vector barycentricCoordinates = Vector::Zero(4); barycentricCoordinates[0] = 1.0; SurgSim::DataStructures::IndexedLocalCoordinate coord(10000, barycentricCoordinates); SurgSim::DataStructures::Location location(coord, SurgSim::DataStructures::Location::ELEMENT); std::shared_ptr localization; EXPECT_THROW(localization = m_fem->createLocalization(location), SurgSim::Framework::AssertionFailure); } // Localization on an valid tetrahedron but invalid barycentric coordinate size { SCOPED_TRACE("Invalid tetrahedron barycentric coordinate size"); Vector barycentricCoordinates = Vector::Zero(5); barycentricCoordinates[0] = 1.0; SurgSim::DataStructures::IndexedLocalCoordinate coord(0, barycentricCoordinates); SurgSim::DataStructures::Location location(coord, SurgSim::DataStructures::Location::ELEMENT); std::shared_ptr localization; EXPECT_THROW(localization = m_fem->createLocalization(location), SurgSim::Framework::AssertionFailure); } // Localization on an valid tetrahedron but invalid barycentric coordinate { SCOPED_TRACE("Invalid tetrahedron barycentric coordinate"); Vector barycentricCoordinates = Vector::Ones(4); SurgSim::DataStructures::IndexedLocalCoordinate coord(0, barycentricCoordinates); SurgSim::DataStructures::Location location(coord, SurgSim::DataStructures::Location::ELEMENT); std::shared_ptr localization; EXPECT_THROW(localization = m_fem->createLocalization(location), SurgSim::Framework::AssertionFailure); } // Localization on a valid tetrahedron { SCOPED_TRACE("Valid tetrahedron"); Vector barycentricCoordinates = Vector::Zero(4); barycentricCoordinates.setConstant(1.0 / 4.0); SurgSim::DataStructures::IndexedLocalCoordinate coord(0, barycentricCoordinates); SurgSim::DataStructures::Location location(coord, SurgSim::DataStructures::Location::ELEMENT); std::shared_ptr localization; EXPECT_NO_THROW(localization = std::dynamic_pointer_cast(m_fem->createLocalization(location))); EXPECT_TRUE(localization != nullptr); EXPECT_TRUE(localization->getRepresentation() == m_fem); SurgSim::DataStructures::IndexedLocalCoordinate coordinate = localization->getLocalPosition(); auto element = m_fem->getFemElement(coordinate.index); SurgSim::Math::Vector3d globalPosition = 1.0 / 4.0 * m_fem->getCurrentState()->getPosition(element->getNodeId(0)) + 1.0 / 4.0 * m_fem->getCurrentState()->getPosition(element->getNodeId(1)) + 1.0 / 4.0 * m_fem->getCurrentState()->getPosition(element->getNodeId(2)) + 1.0 / 4.0 * m_fem->getCurrentState()->getPosition(element->getNodeId(3)); EXPECT_TRUE(globalPosition.isApprox(localization->calculatePosition())); } } TEST_F(Fem3DRepresentationTests, ExternalForceAPITest) { createFem(); // External force vector not initialized until the initial state has been set (it contains the #dof...) EXPECT_EQ(0, m_fem->getExternalGeneralizedForce().size()); EXPECT_EQ(0, m_fem->getExternalGeneralizedStiffness().rows()); EXPECT_EQ(0, m_fem->getExternalGeneralizedStiffness().cols()); EXPECT_EQ(0, m_fem->getExternalGeneralizedDamping().rows()); EXPECT_EQ(0, m_fem->getExternalGeneralizedDamping().cols()); m_fem->setInitialState(m_initialState); // Vector initialized (properly sized and zeroed) Math::SparseMatrix zeroMatrix(static_cast(m_fem->getNumDof()), static_cast(m_fem->getNumDof())); zeroMatrix.setZero(); EXPECT_NE(0, m_fem->getExternalGeneralizedForce().size()); EXPECT_NE(0, m_fem->getExternalGeneralizedStiffness().rows()); EXPECT_NE(0, m_fem->getExternalGeneralizedStiffness().cols()); EXPECT_NE(0, m_fem->getExternalGeneralizedDamping().rows()); EXPECT_NE(0, m_fem->getExternalGeneralizedDamping().cols()); EXPECT_EQ(m_fem->getNumDof(), m_fem->getExternalGeneralizedForce().size()); EXPECT_EQ(m_fem->getNumDof(), m_fem->getExternalGeneralizedStiffness().cols()); EXPECT_EQ(m_fem->getNumDof(), m_fem->getExternalGeneralizedStiffness().rows()); EXPECT_EQ(m_fem->getNumDof(), m_fem->getExternalGeneralizedDamping().cols()); EXPECT_EQ(m_fem->getNumDof(), m_fem->getExternalGeneralizedDamping().rows()); EXPECT_TRUE(m_fem->getExternalGeneralizedForce().isZero()); EXPECT_TRUE(m_fem->getExternalGeneralizedStiffness().isApprox(zeroMatrix)); EXPECT_TRUE(m_fem->getExternalGeneralizedDamping().isApprox(zeroMatrix)); addFemElement(); createLocalization(); Vector FLocalWrongSize = Vector::Ones(2 * m_fem->getNumDofPerNode()); Matrix KLocalWrongSize = Matrix::Ones(3 * m_fem->getNumDofPerNode(), 3 * m_fem->getNumDofPerNode()); Matrix DLocalWrongSize = Matrix::Ones(4 * m_fem->getNumDofPerNode(), 4 * m_fem->getNumDofPerNode()); Vector Flocal = Vector::LinSpaced(m_fem->getNumDofPerNode(), -3.12, 4.09); Matrix Klocal = Matrix::Ones(m_fem->getNumDofPerNode(), m_fem->getNumDofPerNode()) * 0.34; Matrix Dlocal = Klocal + Matrix::Identity(m_fem->getNumDofPerNode(), m_fem->getNumDofPerNode()); Vector F = Vector::Zero(m_fem->getNumDof()); F.segment(0, m_fem->getNumDofPerNode()) = Flocal; Matrix K = Matrix::Zero(m_fem->getNumDof(), m_fem->getNumDof()); K.block(0, 0, m_fem->getNumDofPerNode(), m_fem->getNumDofPerNode()) = Klocal; Matrix D = Matrix::Zero(m_fem->getNumDof(), m_fem->getNumDof()); D.block(0, 0, m_fem->getNumDofPerNode(), m_fem->getNumDofPerNode()) = Dlocal; // Test invalid localization nullptr ASSERT_THROW(m_fem->addExternalGeneralizedForce(nullptr, Flocal), SurgSim::Framework::AssertionFailure); ASSERT_THROW(m_fem->addExternalGeneralizedForce(nullptr, Flocal, Klocal, Dlocal), SurgSim::Framework::AssertionFailure); // Test invalid localization type ASSERT_THROW(m_fem->addExternalGeneralizedForce(m_wrongLocalizationType, Flocal), SurgSim::Framework::AssertionFailure); ASSERT_THROW(m_fem->addExternalGeneralizedForce(m_wrongLocalizationType, Flocal, Klocal, Dlocal), SurgSim::Framework::AssertionFailure); // Test invalid force size ASSERT_THROW(m_fem->addExternalGeneralizedForce(m_localization, FLocalWrongSize), SurgSim::Framework::AssertionFailure); ASSERT_THROW(m_fem->addExternalGeneralizedForce(m_localization, FLocalWrongSize, Klocal, Dlocal), SurgSim::Framework::AssertionFailure); // Test invalid stiffness size ASSERT_THROW(m_fem->addExternalGeneralizedForce(m_localization, Flocal, KLocalWrongSize, Dlocal), SurgSim::Framework::AssertionFailure); // Test invalid damping size ASSERT_THROW(m_fem->addExternalGeneralizedForce(m_localization, Flocal, Klocal, DLocalWrongSize), SurgSim::Framework::AssertionFailure); // Test valid call to addExternalGeneralizedForce m_fem->addExternalGeneralizedForce(m_localization, Flocal, Klocal, Dlocal); EXPECT_FALSE(m_fem->getExternalGeneralizedForce().isZero()); EXPECT_FALSE(m_fem->getExternalGeneralizedStiffness().isApprox(zeroMatrix)); EXPECT_FALSE(m_fem->getExternalGeneralizedDamping().isApprox(zeroMatrix)); EXPECT_TRUE(m_fem->getExternalGeneralizedForce().isApprox(F)); EXPECT_TRUE(m_fem->getExternalGeneralizedStiffness().isApprox(K)); EXPECT_TRUE(m_fem->getExternalGeneralizedDamping().isApprox(D)); // Test valid call to addExternalGeneralizedForce to add things up m_fem->addExternalGeneralizedForce(m_localization, Flocal, Klocal, Dlocal); EXPECT_TRUE(m_fem->getExternalGeneralizedForce().isApprox(2.0 * F)); EXPECT_TRUE(m_fem->getExternalGeneralizedStiffness().isApprox(2.0 * K)); EXPECT_TRUE(m_fem->getExternalGeneralizedDamping().isApprox(2.0 * D)); } TEST_F(Fem3DRepresentationTests, LoadMeshTest) { auto fem = std::make_shared("Representation"); auto runtime = std::make_shared("config.txt"); fem->loadFem("PlyReaderTests/Tetrahedron.ply"); fem->initialize(runtime); // Vertices ASSERT_EQ(3u, fem->getNumDofPerNode()); ASSERT_EQ(3u * 26u, fem->getNumDof()); Vector3d vertex0(1.0, 1.0, -1.0); Vector3d vertex25(-1.0, -1.0, 1.0); EXPECT_TRUE(vertex0.isApprox(fem->getInitialState()->getPosition(0))); EXPECT_TRUE(vertex25.isApprox(fem->getInitialState()->getPosition(25))); // Tetrahedrons ASSERT_EQ(12u, fem->getNumFemElements()); std::array tetrahedron0 = {0, 1, 2, 3}; std::array tetrahedron2 = {10, 25, 11, 9}; EXPECT_TRUE(std::equal(std::begin(tetrahedron0), std::end(tetrahedron0), std::begin(fem->getFemElement(0)->getNodeIds()))); EXPECT_TRUE(std::equal(std::begin(tetrahedron2), std::end(tetrahedron2), std::begin(fem->getFemElement(11)->getNodeIds()))); // Boundary conditions ASSERT_EQ(24u, fem->getInitialState()->getNumBoundaryConditions()); // Boundary condition 0 is on node 8 size_t boundaryNode0 = 8; size_t boundaryNode7 = 11; EXPECT_EQ(3 * boundaryNode0, fem->getInitialState()->getBoundaryConditions().at(0)); EXPECT_EQ(3 * boundaryNode0 + 1, fem->getInitialState()->getBoundaryConditions().at(1)); EXPECT_EQ(3 * boundaryNode0 + 2, fem->getInitialState()->getBoundaryConditions().at(2)); EXPECT_EQ(3 * boundaryNode7, fem->getInitialState()->getBoundaryConditions().at(21)); EXPECT_EQ(3 * boundaryNode7 + 1, fem->getInitialState()->getBoundaryConditions().at(22)); EXPECT_EQ(3 * boundaryNode7 + 2, fem->getInitialState()->getBoundaryConditions().at(23)); // Material auto fem2 = fem->getFemElement(2); EXPECT_DOUBLE_EQ(0.1432, fem2->getMassDensity()); EXPECT_DOUBLE_EQ(0.224, fem2->getPoissonRatio()); EXPECT_DOUBLE_EQ(0.472, fem2->getYoungModulus()); auto fem8 = fem->getFemElement(8); EXPECT_DOUBLE_EQ(0.1432, fem8->getMassDensity()); EXPECT_DOUBLE_EQ(0.224, fem8->getPoissonRatio()); EXPECT_DOUBLE_EQ(0.472, fem8->getYoungModulus()); } TEST_F(Fem3DRepresentationTests, SerializationTest) { auto fem3DRepresentation = std::make_shared("Test-Fem3D"); auto runtime = std::make_shared("config.txt"); const std::string filename = "PlyReaderTests/Fem3DCube.ply"; fem3DRepresentation->loadFem(filename); auto collisionRepresentation = std::make_shared("Collision"); fem3DRepresentation->setCollisionRepresentation(collisionRepresentation); YAML::Node node; ASSERT_NO_THROW(node = YAML::convert::encode(*fem3DRepresentation)); EXPECT_TRUE(node.IsMap()); EXPECT_EQ(1u, node.size()); std::shared_ptr newRepresentation; ASSERT_NO_THROW(newRepresentation = std::dynamic_pointer_cast( node.as>())); ASSERT_NE(nullptr, newRepresentation); EXPECT_EQ("SurgSim::Physics::Fem3DRepresentation", newRepresentation->getClassName()); EXPECT_EQ(filename, newRepresentation->getFem()->getValue("FileName")); } } // namespace Physics } // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/UnitTests/FemElementTests.cpp000066400000000000000000000260371277777236100246510ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include "SurgSim/Physics/FemElement.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Math/Matrix.h" #include "SurgSim/Physics/Fem1DElementBeam.h" #include "SurgSim/Physics/Fem2DElementTriangle.h" #include "SurgSim/Physics/Fem3DElementCorotationalTetrahedron.h" #include "SurgSim/Physics/Fem3DElementCube.h" #include "SurgSim/Physics/Fem3DElementTetrahedron.h" #include "SurgSim/Physics/UnitTests/MockObjects.h" using SurgSim::Physics::FemElement; using SurgSim::Math::Vector; using SurgSim::Math::Matrix; void testSize(const Vector& v, size_t expectedSize) { EXPECT_EQ(expectedSize, v.size()); } void testSize(const Matrix& m, size_t expectedRows, size_t expectedCols) { EXPECT_EQ(expectedRows, m.rows()); EXPECT_EQ(expectedCols, m.cols()); } namespace SurgSim { namespace Physics { TEST(FemElementTests, GetSetAddMethods) { MockFemElement femElement; // Initial setup (numDofPerNode set), no nodes defined yet, density = 0 EXPECT_EQ(3u, femElement.getNumDofPerNode()); EXPECT_EQ(0u, femElement.getNumNodes()); EXPECT_EQ(0, femElement.getNodeIds().size()); EXPECT_DOUBLE_EQ(0.0, femElement.getMassDensity()); EXPECT_DOUBLE_EQ(0.0, femElement.getYoungModulus()); EXPECT_DOUBLE_EQ(0.0, femElement.getPoissonRatio()); // Test Set/Get Young modulus femElement.setYoungModulus(4455.33); EXPECT_DOUBLE_EQ(4455.33, femElement.getYoungModulus()); femElement.setYoungModulus(0.0); EXPECT_DOUBLE_EQ(0.0, femElement.getYoungModulus()); // Test Set/Get Poisson ratio femElement.setPoissonRatio(0.45); EXPECT_DOUBLE_EQ(0.45, femElement.getPoissonRatio()); femElement.setPoissonRatio(0.0); EXPECT_DOUBLE_EQ(0.0, femElement.getPoissonRatio()); // Test Set/Get mass density femElement.setMassDensity(2343.13); EXPECT_DOUBLE_EQ(2343.13, femElement.getMassDensity()); femElement.setMassDensity(0.0); EXPECT_DOUBLE_EQ(0.0, femElement.getMassDensity()); // Test GetMass SurgSim::Math::OdeState fakeState; femElement.setMassDensity(0.0); EXPECT_DOUBLE_EQ(0.0, femElement.getMass(fakeState)); femElement.setMassDensity(1.14); EXPECT_DOUBLE_EQ(1.14, femElement.getMass(fakeState)); femElement.setMassDensity(434.55); EXPECT_DOUBLE_EQ(434.55, femElement.getMass(fakeState)); // Add 1 node femElement.addNode(0); EXPECT_EQ(3u, femElement.getNumDofPerNode()); EXPECT_EQ(1u, femElement.getNumNodes()); EXPECT_EQ(1, femElement.getNodeIds().size()); EXPECT_EQ(0, femElement.getNodeIds()[0]); EXPECT_EQ(0, femElement.getNodeId(0)); // Add 1 more node femElement.addNode(9); EXPECT_EQ(3u, femElement.getNumDofPerNode()); EXPECT_EQ(2u, femElement.getNumNodes()); EXPECT_EQ(2, femElement.getNodeIds().size()); EXPECT_EQ(0, femElement.getNodeIds()[0]); EXPECT_EQ(0, femElement.getNodeId(0)); EXPECT_EQ(9, femElement.getNodeIds()[1]); EXPECT_EQ(9, femElement.getNodeId(1)); } TEST(FemElementTests, InitializeMethods) { MockFemElement femElement; SurgSim::Math::OdeState fakeState; // Mass density not set ASSERT_ANY_THROW(femElement.initialize(fakeState)); // Poisson Ratio not set femElement.setMassDensity(-1234.56); ASSERT_ANY_THROW(femElement.initialize(fakeState)); // Young modulus not set femElement.setPoissonRatio(0.55); ASSERT_ANY_THROW(femElement.initialize(fakeState)); // Invalid mass density femElement.setYoungModulus(-4321.33); ASSERT_ANY_THROW(femElement.initialize(fakeState)); // Invalid Poisson ratio femElement.setMassDensity(1234.56); ASSERT_ANY_THROW(femElement.initialize(fakeState)); // Invalid Young modulus femElement.setPoissonRatio(0.499); ASSERT_ANY_THROW(femElement.initialize(fakeState)); femElement.setYoungModulus(4321.33); ASSERT_NO_THROW(femElement.initialize(fakeState)); } void checkValidCoordinate(const MockFemElement& femElement, double v0, bool expected) { Vector naturalCoordinate(1); naturalCoordinate << v0; EXPECT_EQ(expected, femElement.isValidCoordinate(naturalCoordinate)); } void checkValidCoordinate(const MockFemElement& femElement, double v0, double v1, bool expected) { Vector naturalCoordinate(2); naturalCoordinate << v0, v1; EXPECT_EQ(expected, femElement.isValidCoordinate(naturalCoordinate)); } void checkValidCoordinate(const MockFemElement& femElement, double v0, double v1, double v2, bool expected) { Vector naturalCoordinate(3); naturalCoordinate << v0, v1, v2; EXPECT_EQ(expected, femElement.isValidCoordinate(naturalCoordinate)); } void checkValidCoordinate(const MockFemElement& femElement, double v0, double v1, double v2, double v3, bool expected) { Vector naturalCoordinate(4); naturalCoordinate << v0, v1, v2, v3; EXPECT_EQ(expected, femElement.isValidCoordinate(naturalCoordinate)); } TEST(FemElementTests, IsValidCoordinate) { MockFemElement femElement; femElement.addNode(0); double e = 1e-11; checkValidCoordinate(femElement, 1.0, true); checkValidCoordinate(femElement, 1.0 + e, true); checkValidCoordinate(femElement, 1.0 - e, true); checkValidCoordinate(femElement, 1.01, false); checkValidCoordinate(femElement, -1.01, false); checkValidCoordinate(femElement, 0.7, false); femElement.addNode(1); checkValidCoordinate(femElement, 1.0, 0.0, true); checkValidCoordinate(femElement, 1.0 + e, 0.0, true); checkValidCoordinate(femElement, 1.0 + e, 0.0 - e, true); checkValidCoordinate(femElement, 1.0 - e, 0.0 + e, true); checkValidCoordinate(femElement, 0.5, 0.5, true); checkValidCoordinate(femElement, 0.5 + e, 0.5 + e, true); checkValidCoordinate(femElement, 0.5, 0.51, false); checkValidCoordinate(femElement, 1.0, false); checkValidCoordinate(femElement, -0.01, 1.01, false); femElement.addNode(2); checkValidCoordinate(femElement, 1.0, 0.0, 0.0, true); checkValidCoordinate(femElement, 1.0 + e, 0.0, 0.0, true); checkValidCoordinate(femElement, 1.0 + e, 0.0 - e, 0.0, true); checkValidCoordinate(femElement, 1.0 - e, 0.0 + e, e, true); checkValidCoordinate(femElement, 0.5, 0.5, e, true); checkValidCoordinate(femElement, 0.5 + e, 0.5 + e, -e, true); checkValidCoordinate(femElement, 0.5, 0.41, 0.1, false); checkValidCoordinate(femElement, 1.0, 0.0, false); checkValidCoordinate(femElement, -0.01, 1.01, e, false); femElement.addNode(3); checkValidCoordinate(femElement, 1.0, 0.0, 0.0, 0.0, true); checkValidCoordinate(femElement, 1.0 + e, 0.0, 0.0, 0.0, true); checkValidCoordinate(femElement, 1.0 + e, 0.0 - e, 0.0, 0.0, true); checkValidCoordinate(femElement, 1.0 - e, 0.0 + e, e, 0.0, true); checkValidCoordinate(femElement, 0.5, 0.5, e, 0.0, true); checkValidCoordinate(femElement, 0.5 + e, 0.5 + e, 0.0, -e, true); checkValidCoordinate(femElement, 0.5, 0.0, 0.41, 0.1, false); checkValidCoordinate(femElement, 0.0, 1.0, 0.0, false); checkValidCoordinate(femElement, -0.01, 0.0, 1.01, e, false); } TEST(FemElementTests, FactoryTest) { auto mockElement = std::make_shared(); mockElement->nodeIds.push_back(2); FemElement::getFactory().registerClass("MockFemElement"); // Test with a mock FemElement auto mockFem = FemElement::getFactory().create("MockFemElement", mockElement); EXPECT_NE(nullptr, mockFem); EXPECT_NE(nullptr, std::dynamic_pointer_cast(mockFem)); // Test with a 1D beam auto beamElement = std::make_shared(); beamElement->nodeIds.push_back(1); beamElement->nodeIds.push_back(2); beamElement->radius = 0.4; beamElement->enableShear = false; beamElement->massDensity = 0.4; beamElement->poissonRatio = 0.4; beamElement->youngModulus = 0.4; static SurgSim::Physics::Fem1DElementBeam beam; auto beamFem = FemElement::getFactory().create(beam.getClassName(), beamElement); EXPECT_NE(nullptr, beamFem); EXPECT_NE(nullptr, std::dynamic_pointer_cast(beamFem)); ASSERT_ANY_THROW(FemElement::getFactory().create("SurgSim::Physics::Fem1DElementBeam", mockElement)); // Test with a 2D triangle auto triElement = std::make_shared(); triElement->nodeIds.push_back(1); triElement->nodeIds.push_back(2); triElement->nodeIds.push_back(3); triElement->thickness = 0.4; triElement->massDensity = 0.4; triElement->poissonRatio = 0.4; triElement->youngModulus = 0.4; static SurgSim::Physics::Fem2DElementTriangle triangle; auto triFem = FemElement::getFactory().create(triangle.getClassName(), triElement); EXPECT_NE(nullptr, triFem); EXPECT_NE(nullptr, std::dynamic_pointer_cast(triFem)); ASSERT_ANY_THROW(FemElement::getFactory().create("SurgSim::Physics::Fem2DElementTriangle", beamElement)); // Test with a 3D corotational tetrahedron auto tetElement = std::make_shared(); tetElement->nodeIds.push_back(1); tetElement->nodeIds.push_back(2); tetElement->nodeIds.push_back(3); tetElement->nodeIds.push_back(1); tetElement->massDensity = 0.4; tetElement->poissonRatio = 0.4; tetElement->youngModulus = 0.4; static SurgSim::Physics::Fem3DElementCorotationalTetrahedron corotationalTetrahedron; auto coTetFem = FemElement::getFactory().create( corotationalTetrahedron.getClassName(), tetElement); EXPECT_NE(nullptr, coTetFem); EXPECT_NE(nullptr, std::dynamic_pointer_cast(coTetFem)); ASSERT_ANY_THROW(FemElement::getFactory().create( "SurgSim::Physics::Fem3DElementCorotationalTetrahedron", triElement)); // Test with a 3D cube auto cubeElement = std::make_shared(); cubeElement->nodeIds.push_back(1); cubeElement->nodeIds.push_back(2); cubeElement->nodeIds.push_back(3); cubeElement->nodeIds.push_back(4); cubeElement->nodeIds.push_back(5); cubeElement->nodeIds.push_back(6); cubeElement->nodeIds.push_back(7); cubeElement->nodeIds.push_back(8); cubeElement->massDensity = 0.4; cubeElement->poissonRatio = 0.4; cubeElement->youngModulus = 0.4; static SurgSim::Physics::Fem3DElementCube cube; auto cubeFem = FemElement::getFactory().create(cube.getClassName(), cubeElement); EXPECT_NE(nullptr, cubeFem); EXPECT_NE(nullptr, std::dynamic_pointer_cast(cubeFem)); ASSERT_ANY_THROW(FemElement::getFactory().create(cube.getClassName(), tetElement)); // Test with a 3D tetrahedron static SurgSim::Physics::Fem3DElementTetrahedron tetrahedron; auto tetFem = FemElement::getFactory().create(tetrahedron.getClassName(), tetElement); EXPECT_NE(nullptr, tetFem); EXPECT_NE(nullptr, std::dynamic_pointer_cast(tetFem)); ASSERT_ANY_THROW(FemElement::getFactory().create(tetrahedron.getClassName(), cubeElement)); } } // namespace Physics } // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/UnitTests/FemLocalizationTest.cpp000066400000000000000000000252431277777236100255230ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include #include "SurgSim/Math/OdeState.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/UnitTests/MockObjects.h" #include "SurgSim/Physics/FemLocalization.h" #include "SurgSim/Physics/FemRepresentation.h" using SurgSim::DataStructures::IndexedLocalCoordinate; namespace { const double epsilon = 1e-10; }; namespace SurgSim { namespace Physics { std::shared_ptr createFemElement(std::array nodes) { auto element = std::make_shared(); for (const auto& node : nodes) element->addNode(node); element->setMassDensity(1000.0); element->setPoissonRatio(0.45); element->setYoungModulus(1e6); return element; } class FemLocalizationTest : public ::testing::Test { public: void SetUp() { using SurgSim::Math::Vector3d; using SurgSim::Math::getSubVector; m_fem = std::make_shared("MockFemRepresentation"); auto state = std::make_shared(); state->setNumDof(6, 3); auto& x = state->getPositions(); getSubVector(x, 0, 6).segment<3>(0) = Vector3d( 0.0, 0.0, 0.0); getSubVector(x, 1, 6).segment<3>(0) = Vector3d( 0.0, 1.0, -1.0); getSubVector(x, 2, 6).segment<3>(0) = Vector3d(-1.0, 1.0, 0.0); auto& v = state->getVelocities(); getSubVector(v, 0, 6).segment<3>(0) = Vector3d(0.0, 0.0, 0.0); getSubVector(v, 1, 6).segment<3>(0) = Vector3d(0.0, 1.0, -1.0); getSubVector(v, 2, 6).segment<3>(0) = Vector3d(-1.0, 1.0, 0.0); // Define Beams { std::array nodes = {{0, 1}}; m_fem->addFemElement(createFemElement(nodes)); } { std::array nodes = {{1, 2}}; m_fem->addFemElement(createFemElement(nodes)); } m_fem->setInitialState(state); m_fem->setLocalActive(true); m_validLocalPosition.index = 1; m_validLocalPosition.coordinate = SurgSim::Math::Vector::Zero(2); m_validLocalPosition.coordinate[0] = 0.4; m_validLocalPosition.coordinate[1] = 0.6; m_invalidIndexLocalPosition.index = 3; m_invalidIndexLocalPosition.coordinate = SurgSim::Math::Vector::Zero(2); m_invalidIndexLocalPosition.coordinate[0] = 0.4; m_invalidIndexLocalPosition.coordinate[1] = 0.6; m_invalidCoordinateLocalPosition.index = 1; m_invalidCoordinateLocalPosition.coordinate = SurgSim::Math::Vector::Zero(2); m_invalidCoordinateLocalPosition.coordinate[0] = 0.6; m_invalidCoordinateLocalPosition.coordinate[1] = 0.6; } void TearDown() { } std::shared_ptr m_fem; SurgSim::DataStructures::IndexedLocalCoordinate m_validLocalPosition; SurgSim::DataStructures::IndexedLocalCoordinate m_invalidIndexLocalPosition; SurgSim::DataStructures::IndexedLocalCoordinate m_invalidCoordinateLocalPosition; }; TEST_F(FemLocalizationTest, ConstructorTest) { // IndexedLocalCoordinate pointing to a node (node index + empty coordinate) are invalid. It will failed, // either because the index is out of bound or because the coordinates are the wrong size (empty) // This is tested by m_invalidIndexLocalPosition and m_invalidCoordinateLocalPosition ASSERT_THROW( std::make_shared(m_fem, m_invalidIndexLocalPosition), SurgSim::Framework::AssertionFailure); ASSERT_THROW( std::make_shared(m_fem, m_invalidCoordinateLocalPosition), SurgSim::Framework::AssertionFailure); ASSERT_NO_THROW(std::make_shared(m_fem, m_validLocalPosition);); } TEST_F(FemLocalizationTest, SetGetRepresentation) { FemLocalization localization(m_fem, m_validLocalPosition); EXPECT_NE(nullptr, localization.getRepresentation()); EXPECT_EQ(m_fem, localization.getRepresentation()); EXPECT_EQ(1u, localization.getLocalPosition().index); EXPECT_TRUE(localization.getLocalPosition().coordinate.isApprox(m_validLocalPosition.coordinate)); localization.setRepresentation(nullptr); EXPECT_EQ(nullptr, localization.getRepresentation()); localization.setRepresentation(m_fem); EXPECT_EQ(m_fem, localization.getRepresentation()); SurgSim::DataStructures::IndexedLocalCoordinate m_otherValidLocalPosition; m_otherValidLocalPosition.index = 0; m_otherValidLocalPosition.coordinate = SurgSim::Math::Vector::Zero(2); m_otherValidLocalPosition.coordinate[1] = 1.0; localization.setLocalPosition(m_otherValidLocalPosition); EXPECT_EQ(m_otherValidLocalPosition.index, localization.getLocalPosition().index); EXPECT_TRUE(localization.getLocalPosition().coordinate.isApprox(m_otherValidLocalPosition.coordinate)); } TEST_F(FemLocalizationTest, SetGetLocalization) { using SurgSim::Math::Vector2d; using SurgSim::Math::Vector3d; { SCOPED_TRACE("Uninitialized Representation"); // Uninitialized Representation EXPECT_THROW(std::make_shared(nullptr, m_validLocalPosition), SurgSim::Framework::AssertionFailure); } { SCOPED_TRACE("Incorrectly formed natural coordinate"); // Incorrectly formed natural coordinate auto localization = std::make_shared(m_fem, m_validLocalPosition); EXPECT_THROW(localization->setLocalPosition(IndexedLocalCoordinate(0u, Vector2d(0.89, 0.54))), SurgSim::Framework::AssertionFailure); EXPECT_THROW(localization->setLocalPosition(IndexedLocalCoordinate(0u, Vector3d(1.0, 0.0, 0.0))), SurgSim::Framework::AssertionFailure); } { SCOPED_TRACE("Out of bounds element Id"); // Out of bounds element Id auto localization = std::make_shared(m_fem, m_validLocalPosition); EXPECT_THROW(localization->setLocalPosition(IndexedLocalCoordinate(6u, Vector2d(1.0, 0.0))), SurgSim::Framework::AssertionFailure); } { SCOPED_TRACE("valid"); auto localization = std::make_shared(m_fem, m_validLocalPosition); EXPECT_NO_THROW(localization->setLocalPosition(IndexedLocalCoordinate(1u, Vector2d(0.2, 0.8)))); EXPECT_EQ(1u, localization->getLocalPosition().index); EXPECT_TRUE(Vector2d(0.2, 0.8).isApprox(localization->getLocalPosition().coordinate)); } } TEST_F(FemLocalizationTest, CalculatePositionTest) { using SurgSim::Math::Vector; using SurgSim::Math::Vector3d; using SurgSim::Math::Vector2d; auto localization = std::make_shared(m_fem, m_validLocalPosition); // Test beam 1: nodes 0, 1 localization->setLocalPosition(IndexedLocalCoordinate(0u, Vector2d(1.0, 0.0))); EXPECT_TRUE(Vector3d(0.0, 0.0, 0.0).isApprox(localization->calculatePosition(), epsilon)); localization->setLocalPosition(IndexedLocalCoordinate(0u, Vector2d(0.0, 1.0))); EXPECT_TRUE(Vector3d(0.0, 1.0, -1.0).isApprox(localization->calculatePosition(), epsilon)); // Test beam 2: nodes 0, 1 localization->setLocalPosition(IndexedLocalCoordinate(1u, Vector2d(1.0, 0.0))); EXPECT_TRUE(Vector3d(0.0, 1.0, -1.0).isApprox(localization->calculatePosition(), epsilon)); localization->setLocalPosition(IndexedLocalCoordinate(1u, Vector2d(0.0, 1.0))); EXPECT_TRUE(Vector3d(-1.0, 1.0, 0.0).isApprox(localization->calculatePosition(), epsilon)); // Advanced tests localization->setLocalPosition(IndexedLocalCoordinate(0u, Vector2d(0.31, 0.69))); // 0.31 * ( 0.0, 0.0, 0.0) => ( 0.0, 0.0, 0.0 ) // + 0.69 * ( 0.0, 1.0,-1.0) => ( 0.0, 0.69,-0.69) // = ( 0.0, 0.69,-0.69) EXPECT_TRUE(Vector3d(0.0, 0.69, -0.69).isApprox(localization->calculatePosition(), epsilon)); localization->setLocalPosition(IndexedLocalCoordinate(1u, Vector2d(0.95, 0.05))); // 0.95 * ( 0.0, 1.0,-1.0) => ( 0.0, 0.95,-0.95) // + 0.05 * (-1.0, 1.0, 0.0) => (-0.05, 0.05, 0.0 ) // = (-0.05, 1.0, -0.95) EXPECT_TRUE(Vector3d(-0.05, 1.0, -0.95).isApprox(localization->calculatePosition(), epsilon)); // Out-Of-Range assertions EXPECT_THROW(localization->calculatePosition(-0.01), SurgSim::Framework::AssertionFailure); EXPECT_THROW(localization->calculatePosition(1.01), SurgSim::Framework::AssertionFailure); } TEST_F(FemLocalizationTest, CalculateVelocityTest) { using SurgSim::Math::Vector; using SurgSim::Math::Vector3d; using SurgSim::Math::Vector2d; auto localization = std::make_shared(m_fem, m_validLocalPosition); // Test beam 1: nodes 0, 1 localization->setLocalPosition(IndexedLocalCoordinate(0u, Vector2d(1.0, 0.0))); EXPECT_TRUE(Vector3d(0.0, 0.0, 0.0).isApprox(localization->calculateVelocity(), epsilon)); localization->setLocalPosition(IndexedLocalCoordinate(0u, Vector2d(0.0, 1.0))); EXPECT_TRUE(Vector3d(0.0, 1.0, -1.0).isApprox(localization->calculateVelocity(), epsilon)); // Test beam 2: nodes 0, 1 localization->setLocalPosition(IndexedLocalCoordinate(1u, Vector2d(1.0, 0.0))); EXPECT_TRUE(Vector3d(0.0, 1.0, -1.0).isApprox(localization->calculateVelocity(), epsilon)); localization->setLocalPosition(IndexedLocalCoordinate(1u, Vector2d(0.0, 1.0))); EXPECT_TRUE(Vector3d(-1.0, 1.0, 0.0).isApprox(localization->calculateVelocity(), epsilon)); // Advanced tests localization->setLocalPosition(IndexedLocalCoordinate(0u, Vector2d(0.31, 0.69))); // 0.31 * ( 0.0, 0.0, 0.0) => ( 0.0, 0.0, 0.0 ) // + 0.69 * ( 0.0, 1.0,-1.0) => ( 0.0, 0.69,-0.69) // = ( 0.0, 0.69,-0.69) EXPECT_TRUE(Vector3d(0.0, 0.69, -0.69).isApprox(localization->calculateVelocity(), epsilon)); localization->setLocalPosition(IndexedLocalCoordinate(1u, Vector2d(0.95, 0.05))); // 0.95 * ( 0.0, 1.0,-1.0) => ( 0.0, 0.95,-0.95) // + 0.05 * (-1.0, 1.0, 0.0) => (-0.05, 0.05, 0.0 ) // = (-0.05, 1.0, -0.95) EXPECT_TRUE(Vector3d(-0.05, 1.0, -0.95).isApprox(localization->calculateVelocity(), epsilon)); // Out-Of-Range assertions EXPECT_THROW(localization->calculateVelocity(-0.01), SurgSim::Framework::AssertionFailure); EXPECT_THROW(localization->calculateVelocity(1.01), SurgSim::Framework::AssertionFailure); } TEST_F(FemLocalizationTest, ElementPose) { FemLocalization localization(m_fem, m_validLocalPosition); EXPECT_THROW(localization.getElementPose(), SurgSim::Framework::AssertionFailure); } TEST_F(FemLocalizationTest, MoveClosestTo) { FemLocalization localization(m_fem, m_validLocalPosition); bool flag = false; EXPECT_THROW(localization.moveClosestTo(SurgSim::Math::Vector3d::Zero(), &flag), SurgSim::Framework::AssertionFailure); } } // namespace SurgSim } // namespace Physics opensurgsim-0.7.0/SurgSim/Physics/UnitTests/FemRepresentationTests.cpp000066400000000000000000000517441277777236100262650ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file FemRepresentationTests.cpp /// This file tests the non-abstract functionalities of the base class FemRepresentation #include #include "SurgSim/DataStructures/IndexedLocalCoordinate.h" #include "SurgSim/Framework/Runtime.h" ///< Used to initialize the Component Fem3DRepresentation #include "SurgSim/Physics/UnitTests/DeformableTestsUtility.h" #include "SurgSim/Physics/UnitTests/MockObjects.h" using SurgSim::Math::OdeEquationUpdate; namespace SurgSim { namespace Physics { class FemRepresentationTests : public ::testing::Test { public: double m_rho; double m_nu; double m_E; double m_dt; double m_rayleighDampingMassParameter; double m_rayleighDampingStiffnessParameter; Vector m_expectedFemElementsForce; Vector m_expectedRayleighDampingForce; Vector m_expectedGravityForce; Matrix m_expectedMass; Matrix m_expectedDamping; Matrix m_expectedRayleighDamping; Matrix m_expectedStiffness; std::shared_ptr m_fem; std::shared_ptr m_initialState; protected: void SetUp() override { m_rho = 2000.0; m_nu = 0.45; m_E = 1e6; m_dt = 1e-3; m_rayleighDampingMassParameter = 0.452; m_rayleighDampingStiffnessParameter = 0.242; m_fem = std::make_shared("MockFem"); m_initialState = std::make_shared(); m_initialState->setNumDof(m_fem->getNumDofPerNode(), 3); m_initialState->getVelocities().setOnes(); // v = (1...1) to test damping m_fem->setInitialState(m_initialState); std::shared_ptr element01 = std::make_shared(); element01->setMassDensity(m_rho); element01->setPoissonRatio(m_nu); element01->setYoungModulus(m_E); element01->addNode(0); element01->addNode(1); m_fem->addFemElement(element01); std::shared_ptr element12 = std::make_shared(); element12->setMassDensity(m_rho); element12->setPoissonRatio(m_nu); element12->setYoungModulus(m_E); element12->addNode(1); element12->addNode(2); m_fem->addFemElement(element12); // Mass should be a diagonal matrix with diagonal (1 1 1 2 2 2 1 1 1) m_expectedMass = Matrix::Zero(9, 9); m_expectedMass.diagonal() << 1.0, 1.0, 1.0, 2.0, 2.0, 2.0, 1.0, 1.0, 1.0; // Damping should be a diagonal matrix with diagonal (2 2 2 4 4 4 2 2 2) m_expectedDamping = Matrix::Zero(9, 9); m_expectedDamping.diagonal() << 2.0, 2.0, 2.0, 4.0, 4.0, 4.0, 2.0, 2.0, 2.0; // Stiffness should be a diagonal matrix with diagonal (3 3 3 6 6 6 3 3 3) m_expectedStiffness = Matrix::Zero(9, 9); m_expectedStiffness.diagonal() << 3.0, 3.0, 3.0, 6.0, 6.0, 6.0, 3.0, 3.0, 3.0; // Rayleigh damping = alpha.M + beta.K M and K are diagonals, so the resulting matrix is too m_expectedRayleighDamping = m_expectedMass * m_rayleighDampingMassParameter; m_expectedRayleighDamping += m_expectedStiffness * m_rayleighDampingStiffnessParameter; // FemElements force should be (1 2 3 4 5 6 0 0 0) + (0 0 0 1 2 3 4 5 6) = (1 2 3 5 7 9 4 5 6) m_expectedFemElementsForce.resize(9); m_expectedFemElementsForce << 1.0, 2.0, 3.0, 5.0, 7.0, 9.0, 4.0, 5.0, 6.0; // Gravity force should be m.gravity for each node of each element m_expectedGravityForce = Vector::Zero(9); SurgSim::Math::Vector3d g(0.0, -9.81, 0.0); m_expectedGravityForce.segment<3>(0) += g * element01->getMass(*m_initialState) / 2.0; m_expectedGravityForce.segment<3>(3) += g * element01->getMass(*m_initialState) / 2.0; m_expectedGravityForce.segment<3>(3) += g * element12->getMass(*m_initialState) / 2.0; m_expectedGravityForce.segment<3>(6) += g * element12->getMass(*m_initialState) / 2.0; // Rayleigh damping force should be -(alpha.M + beta.K).(1...1)^t // with (alpha.M + beta.K) a diagonal matrix m_expectedRayleighDampingForce = -m_expectedRayleighDamping.diagonal(); } }; TEST_F(FemRepresentationTests, ConstructorTest) { ASSERT_NO_THROW({MockFemRepresentation fem("name");}); ASSERT_NO_THROW({MockFemRepresentation* fem = new MockFemRepresentation("name"); delete fem;}); ASSERT_NO_THROW({std::shared_ptr fem = std::make_shared("name");}); } TEST_F(FemRepresentationTests, AddSetGetTest) { MockFemRepresentation fem("name"); /// Add/Get FemElement EXPECT_EQ(0u, fem.getNumFemElements()); ASSERT_ANY_THROW(fem.getFemElement(0)); ASSERT_ANY_THROW(fem.getFemElement(1)); std::shared_ptr element = std::make_shared(); element->setMassDensity(m_rho); element->setPoissonRatio(m_nu); element->setYoungModulus(m_E); ASSERT_NO_THROW(fem.addFemElement(element)); EXPECT_EQ(1u, fem.getNumFemElements()); EXPECT_NE(nullptr, fem.getFemElement(0)); ASSERT_ANY_THROW(fem.getFemElement(1)); element = std::make_shared(); element->setMassDensity(m_rho); element->setPoissonRatio(m_nu); element->setYoungModulus(m_E); ASSERT_NO_THROW(fem.addFemElement(element)); EXPECT_EQ(2u, fem.getNumFemElements()); EXPECT_NE(nullptr, fem.getFemElement(0)); EXPECT_NE(nullptr, fem.getFemElement(1)); /// Test gets the total mass of the fem (Each MockFemElement has a fixed volume of 1m^3) EXPECT_DOUBLE_EQ(2.0 * m_rho, fem.getTotalMass()); /// Test sets/gets the Rayleigh stiffness parameter EXPECT_DOUBLE_EQ(0.0, fem.getRayleighDampingStiffness()); fem.setRayleighDampingStiffness(13.45); EXPECT_DOUBLE_EQ(13.45, fem.getRayleighDampingStiffness()); /// Test sets/gets the Rayleigh mass parameter EXPECT_DOUBLE_EQ(0.0, fem.getRayleighDampingMass()); fem.setRayleighDampingMass(43.99); EXPECT_DOUBLE_EQ(43.99, fem.getRayleighDampingMass()); } TEST_F(FemRepresentationTests, IsValidCoordinateTest) { using SurgSim::DataStructures::IndexedLocalCoordinate; MockFemRepresentation fem("name"); std::shared_ptr element = std::make_shared(); element->setMassDensity(m_rho); element->setPoissonRatio(m_nu); element->setYoungModulus(m_E); ASSERT_NO_THROW(fem.addFemElement(element)); // Set up the fem element to have a valid natural coordinate. element->addNode(0); element->addNode(1); Vector validNaturalCoordinate(2); validNaturalCoordinate << 1.0, 0.0; // Only the elementId is tested (by passing a valid natural coordinate). // The validation of the natural coordinate is tested in the respective FemElement's UnitTest. IndexedLocalCoordinate invalidCoordinates(1, validNaturalCoordinate); EXPECT_FALSE(fem.isValidCoordinate(invalidCoordinates)); IndexedLocalCoordinate validCoordinates(0, validNaturalCoordinate); EXPECT_TRUE(fem.isValidCoordinate(validCoordinates)); } TEST_F(FemRepresentationTests, BeforeUpdateTest) { MockFemRepresentation fem("name"); // Throw exception (no FemElement) ASSERT_ANY_THROW(fem.beforeUpdate(m_dt)); std::shared_ptr element = std::make_shared(); element->setMassDensity(m_rho); element->setPoissonRatio(m_nu); element->setYoungModulus(m_E); fem.addFemElement(element); // Throw exception (no initialState setup yet) ASSERT_ANY_THROW(fem.beforeUpdate(m_dt)); std::shared_ptr initialState = std::make_shared(); initialState->setNumDof(fem.getNumDofPerNode(), 8); fem.setInitialState(initialState); ASSERT_NO_THROW(fem.beforeUpdate(m_dt)); } TEST_F(FemRepresentationTests, AfterUpdateTest) { m_fem->initialize(std::make_shared()); m_fem->wakeUp(); ASSERT_TRUE(m_fem->isActive()); ASSERT_NO_THROW(m_fem->beforeUpdate(m_dt)); ASSERT_TRUE(m_fem->isActive()); ASSERT_NO_THROW(m_fem->update(m_dt)); ASSERT_TRUE(m_fem->isActive()); // After update should backup the currentState into finalState and update all FemElement ASSERT_NO_THROW(m_fem->afterUpdate(m_dt)); ASSERT_FALSE(*m_fem->getFinalState() == *m_fem->getInitialState()); ASSERT_TRUE(*m_fem->getFinalState() == *m_fem->getCurrentState()); ASSERT_TRUE(m_fem->isActive()); } TEST_F(FemRepresentationTests, ComputesWithNoGravityAndNoDampingTest) { using SurgSim::Math::Vector3d; // No gravity, no Rayleigh damping // computeF tests addFemElementsForce m_fem->setIsGravityEnabled(false); m_fem->initialize(std::make_shared()); m_fem->wakeUp(); Vector expectedF = m_expectedFemElementsForce; { SCOPED_TRACE("Without external force"); testOdeEquationUpdate(m_fem, *m_initialState, expectedF, m_expectedMass, m_expectedDamping, m_expectedStiffness); } { SCOPED_TRACE("With external force"); std::shared_ptr localization = std::make_shared(); localization->setRepresentation(m_fem); localization->setLocalNode(0); Vector FextLocal = Vector::Ones(m_fem->getNumDofPerNode()); Matrix KextLocal = Matrix::Ones(m_fem->getNumDofPerNode(), m_fem->getNumDofPerNode()); Matrix DextLocal = KextLocal + Matrix::Identity(m_fem->getNumDofPerNode(), m_fem->getNumDofPerNode()); Vector Fext = Vector::Zero(m_fem->getNumDof()); Fext.segment(0, m_fem->getNumDofPerNode()) = FextLocal; Matrix Kext = Matrix::Zero(m_fem->getNumDof(), m_fem->getNumDof()); Kext.block(0, 0, m_fem->getNumDofPerNode(), m_fem->getNumDofPerNode()) = KextLocal; Matrix Dext = Matrix::Zero(m_fem->getNumDof(), m_fem->getNumDof()); Dext.block(0, 0, m_fem->getNumDofPerNode(), m_fem->getNumDofPerNode()) = DextLocal; m_fem->addExternalGeneralizedForce(localization, FextLocal, KextLocal, DextLocal); testOdeEquationUpdate(m_fem, *m_initialState, expectedF + Fext, m_expectedMass, m_expectedDamping + Dext, m_expectedStiffness + Kext); } } TEST_F(FemRepresentationTests, ComputesWithNoGravityAndDampingTest) { using SurgSim::Math::Vector3d; // No gravity, Rayleigh damping // computeF tests addFemElementsForce and addRayleighDampingForce m_fem->setIsGravityEnabled(false); m_fem->setRayleighDampingMass(m_rayleighDampingMassParameter); m_fem->setRayleighDampingStiffness(m_rayleighDampingStiffnessParameter); m_fem->initialize(std::make_shared()); m_fem->wakeUp(); SurgSim::Math::Vector expectedF = m_expectedFemElementsForce + m_expectedRayleighDampingForce; { SCOPED_TRACE("Without external force"); testOdeEquationUpdate(m_fem, *m_initialState, expectedF, m_expectedMass, m_expectedDamping + m_expectedRayleighDamping, m_expectedStiffness); } { SCOPED_TRACE("With external force"); std::shared_ptr localization = std::make_shared(); localization->setRepresentation(m_fem); localization->setLocalNode(0); Vector FextLocal = Vector::Ones(m_fem->getNumDofPerNode()); Matrix KextLocal = Matrix::Ones(m_fem->getNumDofPerNode(), m_fem->getNumDofPerNode()); Matrix DextLocal = KextLocal + Matrix::Identity(m_fem->getNumDofPerNode(), m_fem->getNumDofPerNode()); Vector Fext = Vector::Zero(m_fem->getNumDof()); Fext.segment(0, m_fem->getNumDofPerNode()) = FextLocal; Matrix Kext = Matrix::Zero(m_fem->getNumDof(), m_fem->getNumDof()); Kext.block(0, 0, m_fem->getNumDofPerNode(), m_fem->getNumDofPerNode()) = KextLocal; Matrix Dext = Matrix::Zero(m_fem->getNumDof(), m_fem->getNumDof()); Dext.block(0, 0, m_fem->getNumDofPerNode(), m_fem->getNumDofPerNode()) = DextLocal; m_fem->addExternalGeneralizedForce(localization, FextLocal, KextLocal, DextLocal); testOdeEquationUpdate(m_fem, *m_initialState, expectedF + Fext, m_expectedMass, m_expectedDamping + m_expectedRayleighDamping + Dext, m_expectedStiffness + Kext); } } TEST_F(FemRepresentationTests, ComputesWithGravityAndNoDampingTest) { using SurgSim::Math::Vector3d; using SurgSim::Math::SparseMatrix; // Gravity, no Rayleigh damping // computeF tests addFemElementsForce and addGravityForce m_fem->setIsGravityEnabled(true); m_fem->initialize(std::make_shared()); m_fem->wakeUp(); SurgSim::Math::Vector expectedF = m_expectedFemElementsForce + m_expectedGravityForce; { SCOPED_TRACE("Without external force"); testOdeEquationUpdate(m_fem, *m_initialState, expectedF, m_expectedMass, m_expectedDamping, m_expectedStiffness); } { SCOPED_TRACE("With external force"); std::shared_ptr localization = std::make_shared(); localization->setRepresentation(m_fem); localization->setLocalNode(0); Vector FextLocal = Vector::Ones(m_fem->getNumDofPerNode()); Matrix KextLocal = Matrix::Ones(m_fem->getNumDofPerNode(), m_fem->getNumDofPerNode()); Matrix DextLocal = KextLocal + Matrix::Identity(m_fem->getNumDofPerNode(), m_fem->getNumDofPerNode()); Vector Fext = Vector::Zero(m_fem->getNumDof()); Fext.segment(0, m_fem->getNumDofPerNode()) = FextLocal; Matrix Kext = Matrix::Zero(m_fem->getNumDof(), m_fem->getNumDof()); Kext.block(0, 0, m_fem->getNumDofPerNode(), m_fem->getNumDofPerNode()) = KextLocal; Matrix Dext = Matrix::Zero(m_fem->getNumDof(), m_fem->getNumDof()); Dext.block(0, 0, m_fem->getNumDofPerNode(), m_fem->getNumDofPerNode()) = DextLocal; m_fem->addExternalGeneralizedForce(localization, FextLocal, KextLocal, DextLocal); testOdeEquationUpdate(m_fem, *m_initialState, expectedF + Fext, m_expectedMass, m_expectedDamping + Dext, m_expectedStiffness + Kext); } } TEST_F(FemRepresentationTests, ComputesWithGravityAndDampingTest) { using SurgSim::Math::Vector3d; using SurgSim::Math::SparseMatrix; // Gravity, Rayleigh damping // computeF tests addFemElementsForce, addRayleighDampingForce and addGravityForce m_fem->setIsGravityEnabled(true); m_fem->setRayleighDampingMass(m_rayleighDampingMassParameter); m_fem->setRayleighDampingStiffness(m_rayleighDampingStiffnessParameter); m_fem->initialize(std::make_shared()); m_fem->wakeUp(); SurgSim::Math::Vector expectedF = m_expectedFemElementsForce + m_expectedRayleighDampingForce + m_expectedGravityForce; { SCOPED_TRACE("Without external force"); testOdeEquationUpdate(m_fem, *m_initialState, expectedF, m_expectedMass, m_expectedDamping + m_expectedRayleighDamping, m_expectedStiffness); } { SCOPED_TRACE("With external force"); std::shared_ptr localization = std::make_shared(); localization->setRepresentation(m_fem); localization->setLocalNode(0); Vector FextLocal = Vector::Ones(m_fem->getNumDofPerNode()); Matrix KextLocal = Matrix::Ones(m_fem->getNumDofPerNode(), m_fem->getNumDofPerNode()); Matrix DextLocal = KextLocal + Matrix::Identity(m_fem->getNumDofPerNode(), m_fem->getNumDofPerNode()); Vector Fext = Vector::Zero(m_fem->getNumDof()); Fext.segment(0, m_fem->getNumDofPerNode()) = FextLocal; Matrix Kext = Matrix::Zero(m_fem->getNumDof(), m_fem->getNumDof()); Kext.block(0, 0, m_fem->getNumDofPerNode(), m_fem->getNumDofPerNode()) = KextLocal; Matrix Dext = Matrix::Zero(m_fem->getNumDof(), m_fem->getNumDof()); Dext.block(0, 0, m_fem->getNumDofPerNode(), m_fem->getNumDofPerNode()) = DextLocal; m_fem->addExternalGeneralizedForce(localization, FextLocal, KextLocal, DextLocal); testOdeEquationUpdate(m_fem, *m_initialState, expectedF + Fext, m_expectedMass, m_expectedDamping + m_expectedRayleighDamping + Dext, m_expectedStiffness + Kext); } } TEST_F(FemRepresentationTests, DoInitializeTest) { using SurgSim::Framework::Runtime; MockFemRepresentation fem("name"); // Setup the initial state std::shared_ptr initialState = std::make_shared(); initialState->setNumDof(fem.getNumDofPerNode(), 8); fem.setInitialState(initialState); // Add one element std::shared_ptr element = std::make_shared(); element->setMassDensity(m_rho); element->setPoissonRatio(m_nu); element->setYoungModulus(m_E); element->addNode(0); element->addNode(1); element->addNode(2); fem.addFemElement(element); // Initialize the component, this will call FemRepresentation::doInitialize fem.initialize(std::make_shared()); // At this point, all FemElement and m_massPerNode should have been initialized // We have 8 nodes, 1 element connecting nodes (0 1 2) // The mass should be evenly distributed on the 3 first nodes, and 0 for all others. std::shared_ptr femElement; ASSERT_NO_THROW(femElement = std::static_pointer_cast(fem.getFemElement(0))); ASSERT_TRUE(femElement->isInitialized()); ASSERT_EQ(8u, fem.getMassPerNode().size()); ASSERT_EQ(m_rho, fem.getTotalMass()); for (size_t nodeId = 0; nodeId < 3; ++nodeId) { ASSERT_EQ(m_rho / 3.0, fem.getMassPerNode()[nodeId]); } for (size_t nodeId = 3; nodeId < 8; ++nodeId) { ASSERT_EQ(0u, fem.getMassPerNode()[nodeId]); } } TEST_F(FemRepresentationTests, ComplianceWarpingTest) { { SCOPED_TRACE("MockFemRepresentation incomplete for compliance warping"); auto fem = std::make_shared("fem"); EXPECT_NO_THROW(EXPECT_FALSE(fem->getComplianceWarping())); EXPECT_NO_THROW(fem->setComplianceWarping(true)); EXPECT_NO_THROW(EXPECT_TRUE(fem->getComplianceWarping())); // Setup the initial state auto initialState = std::make_shared(); initialState->setNumDof(fem->getNumDofPerNode(), 3); fem->setInitialState(initialState); // Add one element std::shared_ptr element = std::make_shared(); element->setMassDensity(m_rho); element->setPoissonRatio(m_nu); element->setYoungModulus(m_E); element->addNode(0); element->addNode(1); element->addNode(2); fem->addFemElement(element); fem->initialize(std::make_shared()); fem->wakeUp(); EXPECT_NO_THROW(EXPECT_TRUE(fem->getComplianceWarping())); EXPECT_THROW(fem->setComplianceWarping(false), SurgSim::Framework::AssertionFailure); EXPECT_THROW(fem->setComplianceWarping(true), SurgSim::Framework::AssertionFailure); // update() will call updateNodesRotations() which will raise an exception in this case. // This method has not been overridden. EXPECT_THROW(fem->update(1e-3), SurgSim::Framework::AssertionFailure); } { SCOPED_TRACE("MockFemRepresentation complete for compliance warping"); auto fem = std::make_shared("fem"); EXPECT_NO_THROW(EXPECT_FALSE(fem->getComplianceWarping())); EXPECT_NO_THROW(fem->setComplianceWarping(true)); EXPECT_NO_THROW(EXPECT_TRUE(fem->getComplianceWarping())); // Setup the initial state auto initialState = std::make_shared(); initialState->setNumDof(fem->getNumDofPerNode(), 3); fem->setInitialState(initialState); // Add one element std::shared_ptr element = std::make_shared(); element->setMassDensity(m_rho); element->setPoissonRatio(m_nu); element->setYoungModulus(m_E); element->addNode(0); element->addNode(1); element->addNode(2); fem->addFemElement(element); fem->initialize(std::make_shared()); fem->wakeUp(); EXPECT_NO_THROW(EXPECT_TRUE(fem->getComplianceWarping())); EXPECT_THROW(fem->setComplianceWarping(false), SurgSim::Framework::AssertionFailure); EXPECT_THROW(fem->setComplianceWarping(true), SurgSim::Framework::AssertionFailure); // update() will call updateNodesRotations() which will not raise an exception in this case. // This method has been overridden. EXPECT_NO_THROW(fem->update(1e-3)); EXPECT_NO_THROW(EXPECT_TRUE((fem->applyCompliance(*initialState, Matrix::Identity(initialState->getNumDof(), initialState->getNumDof())) / 1e-3).isIdentity())); } } TEST_F(FemRepresentationTests, SerializationTest) { auto fem = std::make_shared("Test-Fem"); EXPECT_NO_THROW(fem->setValue("ComplianceWarping", true)); EXPECT_TRUE(fem->getComplianceWarping()); EXPECT_TRUE(fem->getValue("ComplianceWarping")); EXPECT_NO_THROW(fem->setValue("ComplianceWarping", false)); EXPECT_FALSE(fem->getComplianceWarping()); EXPECT_FALSE(fem->getValue("ComplianceWarping")); EXPECT_NO_THROW(fem->setValue("RayleighDampingMass", 1.1)); EXPECT_NO_THROW(fem->getValue("RayleighDampingMass")); EXPECT_DOUBLE_EQ(1.1, fem->getValue("RayleighDampingMass")); EXPECT_NO_THROW(fem->setValue("RayleighDampingStiffness", 2.2)); EXPECT_NO_THROW(fem->getValue("RayleighDampingStiffness")); EXPECT_DOUBLE_EQ(2.2, fem->getValue("RayleighDampingStiffness")); } TEST_F(FemRepresentationTests, SetInitialStateTest) { auto fem = std::make_shared("Test-Fem"); EXPECT_FALSE(fem->hasSetInitialStateBeenCalled()); fem->setInitialState(m_initialState); EXPECT_TRUE(fem->hasSetInitialStateBeenCalled()); } } // namespace Physics } // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/UnitTests/FixedConstraintFixedPointTests.cpp000066400000000000000000000075331277777236100277260ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include "SurgSim/Math/MlcpConstraintType.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/ConstraintData.h" #include "SurgSim/Physics/Representation.h" #include "SurgSim/Physics/FixedConstraintFixedPoint.h" #include "SurgSim/Physics/FixedRepresentation.h" #include "SurgSim/Physics/UnitTests/EigenGtestAsserts.h" using SurgSim::Math::Vector3d; namespace { const double epsilon = 1e-10; const double dt = 1e-3; }; namespace SurgSim { namespace Physics { TEST(FixedConstraintFixedPointTests, Constructor) { ASSERT_NO_THROW( { FixedConstraintFixedPoint constraint; }); } TEST(FixedConstraintFixedPointTests, Constants) { FixedConstraintFixedPoint constraint; EXPECT_EQ(SurgSim::Physics::FIXED_3DPOINT, constraint.getConstraintType()); EXPECT_EQ(3u, constraint.getNumDof()); } TEST(FixedConstraintFixedPointTests, BuildMlcp) { // Whitebox test which validates ConstraintImplementation::build's output parameter, MlcpPhysicsProblem. It assumes // CHt and HCHt can be correctly built given H, so it does not necessarily construct the physical parameters // necessary to supply a realistic C. It only checks H and b. FixedConstraintFixedPoint constraint; Vector3d actual = Vector3d(8.0, 6.4, 3.5); // Setup parameters for FixedConstraintFixedPoint::build auto localization = std::make_shared( std::make_shared("representation")); localization->setLocalPosition(actual); MlcpPhysicsProblem mlcpPhysicsProblem = MlcpPhysicsProblem::Zero(0, 3, 1); ConstraintData emptyConstraint; ASSERT_NO_THROW(constraint.build( dt, emptyConstraint, localization, &mlcpPhysicsProblem, 0, 0, SurgSim::Physics::CONSTRAINT_POSITIVE_SIDE)); // Compare results Eigen::Matrix violation = actual; EXPECT_NEAR_EIGEN(violation, mlcpPhysicsProblem.b, epsilon); EXPECT_EQ(0u, mlcpPhysicsProblem.constraintTypes.size()); } TEST(FixedConstraintFixedPointTests, BuildMlcpTwoStep) { // Whitebox test which validates ConstraintImplementation::build's output parameter, MlcpPhysicsProblem. It assumes // CHt and HCHt can be correctly built given H, so it does not necessarily construct the physical parameters // necessary to supply a realistic C. It only checks H and b. FixedConstraintFixedPoint constraint; Vector3d actual = Vector3d(8.0, 6.4, 3.5); Vector3d desired = Vector3d(3.0, 7.7, 0.0); // Setup parameters for FixedConstraintFixedPoint::build MlcpPhysicsProblem mlcpPhysicsProblem = MlcpPhysicsProblem::Zero(0, 3, 1); ConstraintData emptyConstraint; auto localization = std::make_shared( std::make_shared("representation")); localization->setLocalPosition(actual); ASSERT_NO_THROW(constraint.build( dt, emptyConstraint, localization, &mlcpPhysicsProblem, 0, 0, SurgSim::Physics::CONSTRAINT_POSITIVE_SIDE)); localization->setLocalPosition(desired); ASSERT_NO_THROW(constraint.build( dt, emptyConstraint, localization, &mlcpPhysicsProblem, 0, 0, SurgSim::Physics::CONSTRAINT_NEGATIVE_SIDE)); // Compare results Eigen::Matrix violation = actual - desired; EXPECT_NEAR_EIGEN(violation, mlcpPhysicsProblem.b, epsilon); } }; // namespace Physics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/UnitTests/FixedConstraintFixedRotationVectorTests.cpp000066400000000000000000000073431277777236100316160ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Math/MlcpConstraintType.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/RotationVectorConstraintData.h" #include "SurgSim/Physics/Representation.h" #include "SurgSim/Physics/FixedConstraintFixedRotationVector.h" #include "SurgSim/Physics/FixedRepresentation.h" #include "SurgSim/Physics/UnitTests/EigenGtestAsserts.h" #include "SurgSim/Physics/UnitTests/MockObjects.h" using SurgSim::Math::Vector3d; namespace { const double epsilon = 1e-10; const double dt = 1e-3; }; namespace SurgSim { namespace Physics { TEST(FixedConstraintFixedRotationVectorTests, Constructor) { ASSERT_NO_THROW( { FixedConstraintFixedRotationVector constraint; }); } TEST(FixedConstraintFixedRotationVectorTests, Constants) { FixedConstraintFixedRotationVector constraint; EXPECT_EQ(SurgSim::Physics::FIXED_3DROTATION_VECTOR, constraint.getConstraintType()); EXPECT_EQ(3u, constraint.getNumDof()); } TEST(FixedConstraintFixedRotationVectorTests, BuildMlcp) { using SurgSim::Framework::Runtime; FixedConstraintFixedRotationVector constraint; // Prepare the fem1d representation for this constraint type auto fem1d = std::make_shared("fem1d"); auto initialState = std::make_shared(); initialState->setNumDof(6, 2); initialState->getPositions().setZero(); initialState->getPositions().segment<3>(6) = SurgSim::Math::Vector3d(1.0, 0.0, 0.0); fem1d->setInitialState(initialState); std::array nodeIds = { {0, 1} }; auto beam = std::make_shared(nodeIds); beam->setMassDensity(900); beam->setPoissonRatio(0.4); beam->setRadius(0.1); beam->setShearingEnabled(false); beam->setYoungModulus(1e6); fem1d->addFemElement(beam); fem1d->initialize(std::make_shared()); // Initializes the beams initial rotation matrix // Prepare the fixed representation for this constraint type auto fixed = std::make_shared(); Vector3d centerOfMass = Vector3d(3.0, 2.42, 9.54); SurgSim::Math::Quaterniond objectRotation = SurgSim::Math::Quaterniond(0.1, 0.35, 4.2, 5.0).normalized(); SurgSim::Math::RigidTransform3d objectPose = SurgSim::Math::makeRigidTransform(objectRotation, centerOfMass); fixed->getCurrentState().setPose(objectPose); auto localization = std::make_shared(fixed); // Prepare the specific constraint data RotationVectorRigidFem1DConstraintData constraintData; constraintData.setFem1DRotation(fem1d, 0); constraintData.setRigidOrFixedRotation(fixed, fixed->getPose().linear()); MlcpPhysicsProblem mlcpPhysicsProblem = MlcpPhysicsProblem::Zero(0, 3, 1); ASSERT_NO_THROW(constraint.build( dt, constraintData, localization, &mlcpPhysicsProblem, 0, 0, SurgSim::Physics::CONSTRAINT_POSITIVE_SIDE)); // Compare results Eigen::AngleAxisd aa(objectPose.linear()); Eigen::Matrix violation = aa.angle() * aa.axis(); EXPECT_NEAR_EIGEN(violation, mlcpPhysicsProblem.b, epsilon); EXPECT_EQ(0u, mlcpPhysicsProblem.constraintTypes.size()); } }; // namespace Physics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/UnitTests/FixedConstraintFrictionlessContactTests.cpp000066400000000000000000000057241277777236100316350ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include "SurgSim/Physics/Constraint.h" #include "SurgSim/Physics/ConstraintData.h" #include "SurgSim/Physics/ContactConstraintData.h" #include "SurgSim/Physics/FixedConstraintFrictionlessContact.h" #include "SurgSim/Physics/FixedRepresentation.h" #include "SurgSim/Physics/MlcpPhysicsProblem.h" #include "SurgSim/Physics/RigidConstraintFrictionlessContact.h" #include "SurgSim/Physics/RigidRepresentation.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/SphereShape.h" #include "SurgSim/Math/Vector.h" namespace { const double epsilon = 1e-10; }; namespace SurgSim { namespace Physics { TEST (FixedConstraintFrictionlessContactTests, SetGet_BuildMlcp_Test) { SurgSim::Math::Vector3d n(0.0, 1.0, 0.0); double d = 0.0; double violation = -0.01; SurgSim::Math::Vector3d contactPosition = -n * (d - violation); SurgSim::Math::RigidTransform3d poseFixed; poseFixed.setIdentity(); std::shared_ptr fixed = std::make_shared("Fixed"); fixed->setLocalActive(true); fixed->setIsGravityEnabled(false); fixed->setLocalPose(poseFixed); auto loc = std::make_shared(fixed); loc->setLocalPosition(contactPosition); std::shared_ptr implementation = std::make_shared(); EXPECT_EQ(SurgSim::Physics::FRICTIONLESS_3DCONTACT, implementation->getConstraintType()); EXPECT_EQ(1u, implementation->getNumDof()); ContactConstraintData constraintData; constraintData.setPlaneEquation(n, d); MlcpPhysicsProblem mlcpPhysicsProblem = MlcpPhysicsProblem::Zero(fixed->getNumDof(), 1, 1); // Fill up the Mlcp double dt = 1e-3; implementation->build(dt, constraintData, loc, &mlcpPhysicsProblem, 0, 0, SurgSim::Physics::CONSTRAINT_POSITIVE_SIDE); // b should be exactly the violation EXPECT_NEAR(violation, mlcpPhysicsProblem.b[0], epsilon); // Constraint H should be [] (a fixed representation has no dof !) // ConstraintTypes should contain 0 entry as it is setup by the constraint and not the ConstraintImplementation // This way, the constraint can verify that both ConstraintImplementation are the same type ASSERT_EQ(0u, mlcpPhysicsProblem.constraintTypes.size()); } }; // namespace Physics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/UnitTests/FixedRepresentationTest.cpp000066400000000000000000000227121277777236100264230ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include "SurgSim/Framework/BasicSceneElement.h" #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Framework/Scene.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/SphereShape.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/FixedRepresentation.h" #include "SurgSim/Physics/RigidCollisionRepresentation.h" #include "SurgSim/Physics/RigidState.h" using SurgSim::Framework::BasicSceneElement; using SurgSim::Math::Vector3d; using SurgSim::Math::Quaterniond; using SurgSim::Math::RigidTransform3d; using SurgSim::Math::SphereShape; using SurgSim::Physics::Representation; using SurgSim::Physics::FixedRepresentation; using SurgSim::Physics::RigidCollisionRepresentation; using SurgSim::Physics::RigidState; class FixedRepresentationTest : public ::testing::Test { public: void SetUp() { Quaterniond q; Vector3d t; q.coeffs().setRandom(); q.normalize(); t.setRandom(); m_initialTransformation = SurgSim::Math::makeRigidTransform(q, t); do { q.coeffs().setRandom(); q.normalize(); t.setRandom(); m_currentTransformation = SurgSim::Math::makeRigidTransform(q, t); } while (m_initialTransformation.isApprox(m_currentTransformation)); m_identityTransformation.setIdentity(); m_fixedRepresentation = std::make_shared("FixedRepresentation"); m_element = std::make_shared("element"); m_element->addComponent(m_fixedRepresentation); m_runtime = std::make_shared(); m_scene = m_runtime->getScene(); m_scene->addSceneElement(m_element); } std::shared_ptr m_runtime; std::shared_ptr m_scene; std::shared_ptr m_fixedRepresentation; std::shared_ptr m_element; // Fixed representation initialization pose RigidTransform3d m_initialTransformation; // Fixed representation current pose RigidTransform3d m_currentTransformation; // Identity pose (no translation/rotation) RigidTransform3d m_identityTransformation; }; TEST_F(FixedRepresentationTest, ConstructorTest) { ASSERT_NO_THROW(FixedRepresentation fixedRepresentation("FixedRepresentation")); } TEST_F(FixedRepresentationTest, ResetStateTest) { m_fixedRepresentation->setLocalActive(false); m_fixedRepresentation->setIsGravityEnabled(false); m_fixedRepresentation->setLocalPose(m_initialTransformation); m_fixedRepresentation->wakeUp(); // Initial = Current = Previous = m_initialTransformation EXPECT_TRUE(m_fixedRepresentation->getInitialState().getPose().isApprox(m_initialTransformation)); EXPECT_TRUE(m_fixedRepresentation->getCurrentState() == m_fixedRepresentation->getInitialState()); EXPECT_TRUE(m_fixedRepresentation->getPreviousState() == m_fixedRepresentation->getInitialState()); m_fixedRepresentation->setLocalPose(m_currentTransformation); m_fixedRepresentation->beforeUpdate(1.0); m_fixedRepresentation->update(1.0); m_fixedRepresentation->afterUpdate(1.0); // update is supposed to backup current in previous and set current // Therefore it should not affect initial // Initial = Previous = m_initialTransformation // Current = m_currentTransformation EXPECT_TRUE(m_fixedRepresentation->getCurrentState() != m_fixedRepresentation->getInitialState()); EXPECT_TRUE(m_fixedRepresentation->getPreviousState() == m_fixedRepresentation->getInitialState()); EXPECT_TRUE(m_fixedRepresentation->getPreviousState() != m_fixedRepresentation->getCurrentState()); EXPECT_TRUE(m_fixedRepresentation->getCurrentState().getPose().isApprox(m_currentTransformation)); m_fixedRepresentation->setLocalPose(m_currentTransformation); m_fixedRepresentation->beforeUpdate(1.0); m_fixedRepresentation->update(1.0); m_fixedRepresentation->afterUpdate(1.0); // update is supposed to backup current in previous and set current // Therefore it should not affect initial // Initial = m_initialTransformation // Previous = Current = m_currentTransformation EXPECT_TRUE(m_fixedRepresentation->getCurrentState() != m_fixedRepresentation->getInitialState()); EXPECT_TRUE(m_fixedRepresentation->getPreviousState() != m_fixedRepresentation->getInitialState()); EXPECT_TRUE(m_fixedRepresentation->getPreviousState() == m_fixedRepresentation->getCurrentState()); EXPECT_TRUE(m_fixedRepresentation->getCurrentState().getPose().isApprox(m_currentTransformation)); std::shared_ptr representation = m_fixedRepresentation; // reset the representation (NOT THE FIXED REPRESENTATION, test polymorphism) representation->resetState(); // isActive flag unchanged EXPECT_FALSE(m_fixedRepresentation->isActive()); // isGravityEnable flag unchanged EXPECT_FALSE(m_fixedRepresentation->isGravityEnabled()); // The current rigid state should be exactly the initial rigid state EXPECT_TRUE(m_fixedRepresentation->getCurrentState() == m_fixedRepresentation->getInitialState()); EXPECT_TRUE(m_fixedRepresentation->getCurrentState().getPose().isApprox(m_initialTransformation)); EXPECT_TRUE(m_fixedRepresentation->getInitialState().getPose().isApprox(m_initialTransformation)); // The previous rigid state should be exactly the initial rigid state EXPECT_TRUE(m_fixedRepresentation->getPreviousState() == m_fixedRepresentation->getInitialState()); } TEST_F(FixedRepresentationTest, SetGetAndDefaultValueTest) { // Get/Set active flag [default = true] EXPECT_TRUE(m_fixedRepresentation->isActive()); m_fixedRepresentation->setLocalActive(false); ASSERT_FALSE(m_fixedRepresentation->isActive()); m_fixedRepresentation->setLocalActive(true); ASSERT_TRUE(m_fixedRepresentation->isActive()); // Get numDof = 0 ASSERT_EQ(0u, m_fixedRepresentation->getNumDof()); // Set/Get isGravityEnabled [default = true] EXPECT_TRUE(m_fixedRepresentation->isGravityEnabled()); m_fixedRepresentation->setIsGravityEnabled(false); ASSERT_FALSE(m_fixedRepresentation->isGravityEnabled()); m_fixedRepresentation->setIsGravityEnabled(true); ASSERT_TRUE(m_fixedRepresentation->isGravityEnabled()); } TEST_F(FixedRepresentationTest, UpdateTest) { double dt = 1.0; m_fixedRepresentation->setLocalPose(m_initialTransformation); m_fixedRepresentation->wakeUp(); m_fixedRepresentation->setLocalPose(m_currentTransformation); m_fixedRepresentation->beforeUpdate(dt); m_fixedRepresentation->update(dt); m_fixedRepresentation->afterUpdate(dt); EXPECT_TRUE(m_fixedRepresentation->getCurrentState() != m_fixedRepresentation->getPreviousState()); EXPECT_TRUE(m_fixedRepresentation->getCurrentState() != m_fixedRepresentation->getInitialState()); EXPECT_TRUE(m_fixedRepresentation->getPreviousState() == m_fixedRepresentation->getInitialState()); } TEST_F(FixedRepresentationTest, SerializationTest) { { SCOPED_TRACE("Encode/Decode as shared_ptr<>, should be OK"); auto rigidRepresentation = std::make_shared("TestFixedRepresentation"); YAML::Node node; ASSERT_NO_THROW(node = YAML::convert>::encode(rigidRepresentation)); std::shared_ptr newRepresentation; EXPECT_NO_THROW(newRepresentation = std::dynamic_pointer_cast(node.as>())); EXPECT_NE(nullptr, newRepresentation); } { SCOPED_TRACE("Encode a FixedRepresentation object without a shape, should throw."); auto rigidRepresentation = std::make_shared("TestFixedRepresentation"); auto rigidCollisionRepresentation = std::make_shared("RigidCollisionRepresentation"); rigidRepresentation->setCollisionRepresentation(rigidCollisionRepresentation); EXPECT_ANY_THROW(YAML::convert::encode(*rigidRepresentation)); } { SCOPED_TRACE("Encode a FixedRepresentation object with valid RigidCollisionRepresentation and shape, no throw"); auto rigidRepresentation = std::make_shared("TestFixedRepresentation"); auto rigidCollisionRepresentation = std::make_shared("RigidCollisionRepresentation"); rigidRepresentation->setCollisionRepresentation(rigidCollisionRepresentation); rigidRepresentation->setShape(std::make_shared(0.1)); YAML::Node node; EXPECT_NO_THROW(node = YAML::convert::encode(*rigidRepresentation)); std::shared_ptr newRepresentation; newRepresentation = std::dynamic_pointer_cast(node.as>()); EXPECT_NE(nullptr, newRepresentation->getCollisionRepresentation()); auto newCollisionRepresentation = std::dynamic_pointer_cast(newRepresentation->getCollisionRepresentation()); EXPECT_EQ(newRepresentation, newCollisionRepresentation->getRigidRepresentation()); } } opensurgsim-0.7.0/SurgSim/Physics/UnitTests/FreeMotionTests.cpp000066400000000000000000000046671277777236100247040ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file FreeMotionTests.cpp /// Simple Test for FreeMotion calculation #include #include #include #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/SphereShape.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/PhysicsManager.h" #include "SurgSim/Physics/FixedRepresentation.h" #include "SurgSim/Physics/RigidRepresentation.h" #include "SurgSim/Physics/FreeMotion.h" #include "SurgSim/Physics/PhysicsManagerState.h" using SurgSim::Math::SphereShape; using SurgSim::Math::Vector3d; using SurgSim::Physics::Representation; using SurgSim::Physics::RigidRepresentation; using SurgSim::Physics::FreeMotion; using SurgSim::Physics::PhysicsManagerState; TEST(FreeMotionTest, RunTest) { std::vector> representations = std::vector>(); std::shared_ptr representation = std::make_shared("TestSphere"); representation->setDensity(700.0); // Wood std::shared_ptr shape = std::make_shared(0.01); // 1cm Sphere representation->setShape(shape); representations.push_back(representation); std::shared_ptr state = std::make_shared(); state->setRepresentations(representations); FreeMotion computation; representation->setIsGravityEnabled(false); EXPECT_TRUE(representation->getCurrentState().getPose().translation().isZero()); state = computation.update(1.0,state); EXPECT_TRUE(representation->getCurrentState().getPose().translation().isZero()); representation->setIsGravityEnabled(true); state = computation.update(1.0,state); EXPECT_FALSE(representation->getCurrentState().getPose().translation().isZero()); } opensurgsim-0.7.0/SurgSim/Physics/UnitTests/LinearSpringTest.cpp000066400000000000000000000451721277777236100250430ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include "SurgSim/Math/Matrix.h" #include "SurgSim/Math/OdeState.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/LinearSpring.h" using SurgSim::Math::Matrix; using SurgSim::Math::Matrix33d; using SurgSim::Math::Matrix66d; using SurgSim::Math::SparseMatrix; using SurgSim::Math::Vector; using SurgSim::Math::Vector3d; using SurgSim::Math::Vector6d; using SurgSim::Physics::LinearSpring; namespace { const double epsilon = 1e-10; const double epsilonNumericalEvaluation = 1e-8; const double epsilonTestAgainstNumericalApproximation = 1e-7; Matrix66d KFormal(const Vector3d p0, const Vector3d p1, const Vector3d v0, const Vector3d v1, double l0, double stiffness, double damping) { Vector3d u = p1 - p0; double m_l = u.norm(); u /= m_l; double lRatio = (m_l - l0) / m_l; double vRatio = (v1 - v0).dot(u) / m_l; Matrix33d K00 = Matrix33d::Identity() * (stiffness * lRatio + damping * vRatio); K00 -= (u * u.transpose()) * (stiffness * (lRatio - 1.0) + 2.0 * damping * vRatio); K00 += damping * (u * (v1 - v0).transpose()) / m_l; Matrix66d K = Matrix66d::Zero(); // Assembly stage in K SurgSim::Math::addSubMatrix(K00, 0, 0, 3, 3, &K); SurgSim::Math::addSubMatrix(-K00, 0, 1, 3, 3, &K); SurgSim::Math::addSubMatrix(-K00, 1, 0, 3, 3, &K); SurgSim::Math::addSubMatrix(K00, 1, 1, 3, 3, &K); return K; } Matrix66d DFormal(const Vector3d p0, const Vector3d p1, const Vector3d v0, const Vector3d v1, double l0, double stiffness, double damping) { Vector3d u = p1 - p0; u.normalize(); Matrix33d D00 = damping * (u * u.transpose()); // Assembly stage in D Matrix66d D = Matrix66d::Zero(); SurgSim::Math::addSubMatrix(D00, 0, 0, 3, 3, &D); SurgSim::Math::addSubMatrix(-D00, 0, 1, 3, 3, &D); SurgSim::Math::addSubMatrix(-D00, 1, 0, 3, 3, &D); SurgSim::Math::addSubMatrix(D00, 1, 1, 3, 3, &D); return D; } double f(size_t axis, const Vector3d p0, const Vector3d p1, const Vector3d v0, const Vector3d v1, double l0, double stiffness, double damping) { Vector3d u = p1 - p0; double m_l = u.norm(); u /= m_l; double elongationPosition = m_l - l0; double elongationVelocity = (v1 - v0).dot(u); if (axis <= 2) { return (stiffness * elongationPosition + damping * elongationVelocity) * u[axis]; } else { return -(stiffness * elongationPosition + damping * elongationVelocity) * u[axis - 3]; } } Matrix66d KNumerical(const Vector3d p0, const Vector3d p1, const Vector3d v0, const Vector3d v1, double l0, double stiffness, double damping) { Matrix66d dfdx; for (size_t row = 0; row < 6; row++) { for (size_t col = 0; col < 6; col++) { // dfrow/dxcol // (1) f(x+delta) = f(x) + df/dx.delta + o(delta^2) // (2) f(x-delta) = f(x) - df/dx.delta + o(delta^2) // (1) - (2) f(x+delta) - f(x-delta) = 2df/dx.delta // df/dx = (f(x+delta) - f(x-delta)) / 2delta Vector6d delta6D = Vector6d::Zero(); delta6D[col] = epsilonNumericalEvaluation; double f_plus_delta = f(row, p0 + delta6D.segment(0, 3), p1 + delta6D.segment(3, 3), v0, v1, l0, stiffness, damping); double f_minus_delta = f(row, p0 - delta6D.segment(0, 3), p1 - delta6D.segment(3, 3), v0, v1, l0, stiffness, damping); dfdx(row, col) = (f_plus_delta - f_minus_delta) / (2.0 * epsilonNumericalEvaluation); } } return - dfdx; } Matrix66d DNumerical(const Vector3d p0, const Vector3d p1, const Vector3d v0, const Vector3d v1, double l0, double stiffness, double damping) { Matrix66d dfdv; for (size_t row = 0; row < 6; row++) { for (size_t col = 0; col < 6; col++) { // dfrow/dxcol // (1) f(x+delta) = f(x) + df/dx.delta + o(delta^2) // (2) f(x-delta) = f(x) - df/dx.delta + o(delta^2) // (1) - (2) f(x+delta) - f(x-delta) = 2df/dx.delta // df/dx = (f(x+delta) - f(x-delta)) / 2delta Vector6d delta6D = Vector6d::Zero(); delta6D[col] = epsilonNumericalEvaluation; double f_plus_delta = f(row, p0, p1, v0 + delta6D.segment(0, 3), v1 + delta6D.segment(3, 3), l0, stiffness, damping); double f_moins_delta = f(row, p0, p1, v0 - delta6D.segment(0, 3), v1 - delta6D.segment(3, 3), l0, stiffness, damping); dfdv(row, col) = (f_plus_delta - f_moins_delta) / (2.0 * epsilonNumericalEvaluation); } } return - dfdv; } }; TEST(LinearSpringTests, Constructor) { ASSERT_NO_THROW({LinearSpring ls(0, 1);}); ASSERT_NO_THROW({LinearSpring* ls = new LinearSpring(0, 1); delete ls;}); ASSERT_NO_THROW({std::shared_ptr ls = std::make_shared(0, 1);}); } TEST(LinearSpringTests, SetGetMethods) { LinearSpring ls(0, 1); // Stiffness getter/setter ASSERT_THROW(ls.setStiffness(-0.34), SurgSim::Framework::AssertionFailure); ASSERT_NO_THROW(ls.setStiffness(0.0)); ASSERT_DOUBLE_EQ(0.0, ls.getStiffness()); ASSERT_NO_THROW(ls.setStiffness(0.34)); ASSERT_DOUBLE_EQ(0.34, ls.getStiffness()); // Damping getter/setter ASSERT_THROW(ls.setDamping(-0.45), SurgSim::Framework::AssertionFailure); ASSERT_NO_THROW(ls.setDamping(0.0)); ASSERT_DOUBLE_EQ(0.0, ls.getDamping()); ASSERT_NO_THROW(ls.setDamping(0.45)); ASSERT_DOUBLE_EQ(0.45, ls.getDamping()); // Rest length getter/setter ASSERT_THROW(ls.setRestLength(-1.23), SurgSim::Framework::AssertionFailure); ASSERT_NO_THROW(ls.setRestLength(0.0)); ASSERT_DOUBLE_EQ(0.0, ls.getRestLength()); ASSERT_NO_THROW(ls.setRestLength(1.23)); ASSERT_DOUBLE_EQ(1.23, ls.getRestLength()); // Operator ==/!= (with same node Ids) LinearSpring ls2(0, 1); ASSERT_TRUE(ls != ls2); ls2.setStiffness(ls.getStiffness()); ASSERT_TRUE(ls != ls2); ls2.setDamping(ls.getDamping()); ASSERT_TRUE(ls != ls2); ls2.setRestLength(ls.getRestLength()); ASSERT_TRUE(ls == ls2); ls2.setDamping(ls.getDamping() + 0.55); ASSERT_TRUE(ls != ls2); ls2.setDamping(ls.getDamping()); ls2.setStiffness(ls.getStiffness() + 0.23); ASSERT_TRUE(ls != ls2); // Operator ==/!= (with different node Ids) LinearSpring ls3(0, 2); ASSERT_TRUE(ls != ls3); ls3.setStiffness(ls.getStiffness()); ASSERT_TRUE(ls != ls3); ls3.setDamping(ls.getDamping()); ASSERT_TRUE(ls != ls3); ls3.setRestLength(ls.getRestLength()); ASSERT_TRUE(ls != ls3); } namespace { void initializeTest(bool setStiffness, bool setDamping, bool setRestLength, bool expectException) { LinearSpring ls(0, 1); SurgSim::Math::OdeState state; std::string scopeTrace; state.setNumDof(3, 2); if (setStiffness) { ls.setStiffness(1.23); scopeTrace += "Stiffness set; "; } else { scopeTrace += "Stiffness unset; "; } if (setDamping) { ls.setDamping(1.23); scopeTrace += "Damping set; "; } else { scopeTrace += "Damping unset; "; } if (setRestLength) { ls.setRestLength(1.23); scopeTrace += "Rest length set; "; } else { scopeTrace += "Rest length unset; "; } SCOPED_TRACE(scopeTrace); if (expectException) { EXPECT_THROW(ls.initialize(state), SurgSim::Framework::AssertionFailure); } else { EXPECT_NO_THROW(ls.initialize(state)); } } }; TEST(LinearSpringTests, initializeTest) { // (stiff damp restL| expectException) initializeTest(false, false, false, true); initializeTest(true, false, false, true); initializeTest(false, true, false, true); initializeTest(false, false, true, true); initializeTest(true, true, false, true); initializeTest(true, false, true, false); initializeTest(false, true, true, true); initializeTest(true, true, true, false); } TEST(LinearSpringTests, computeMethods) { using SurgSim::Math::setSubVector; using SurgSim::Math::setSubMatrix; // Setup the spring LinearSpring ls(0, 1); ls.setStiffness(0.34); ls.setDamping(0.45); ls.setRestLength(1.23); // Setup the state SurgSim::Math::OdeState state; state.setNumDof(3u, 2u); setSubVector(Vector3d(0.0, 0.0, 0.0), 0, 3, &state.getPositions()); setSubVector(Vector3d(2.3, 4.1, 1.2), 1, 3, &state.getPositions()); setSubVector(Vector3d(0.1, 0.2, 0.5), 0, 3, &state.getVelocities()); setSubVector(Vector3d(-0.3, -0.14, 0.0), 1, 3, &state.getVelocities()); // Calculating spring force Vector3d expectedF3D(0.45563016177577925, 0.81221028838291076, 0.23772008440475439); Vector6d expectedF; setSubVector(expectedF3D, 0, 3, &expectedF); setSubVector(-expectedF3D, 1, 3, &expectedF); Vector f(6); f.setZero(); ls.addForce(state, &f); EXPECT_TRUE(f.isApprox(expectedF)) << " F = " << f.transpose() << std::endl << "expectedF = " << expectedF.transpose() << std::endl; // Calculate stiffness matrix Matrix33d expectedStiffness33; expectedStiffness33 << 0.224919570941728960, 0.064210544149390564, 0.0011847965179350647, 0.047808674990512064, 0.312562344690556770, 0.0021120285754494608, 0.013992782924052311, 0.033501153469247251, 0.1987182250423049600; Matrix66d expectedK; setSubMatrix(expectedStiffness33, 0, 0, 3, 3, &expectedK); setSubMatrix(-expectedStiffness33, 0, 1, 3, 3, &expectedK); setSubMatrix(-expectedStiffness33, 1, 0, 3, 3, &expectedK); setSubMatrix(expectedStiffness33, 1, 1, 3, 3, &expectedK); Matrix zeroBlock = Matrix::Zero(6, 6); SparseMatrix K(6, 6); K.setZero(); SurgSim::Math::addSubMatrix(zeroBlock, 0, 0, &K, true); K.makeCompressed(); ls.addStiffness(state, &K); EXPECT_TRUE(K.isApprox(expectedK)) << " K = " << std::endl << K << std::endl << "expectedK = " << std::endl << expectedK << std::endl; // Calculate damping matrix Matrix33d expectedDamping33; expectedDamping33 << 0.101125743415463040, 0.180267629566694950, 0.052761257434154628, 0.180267629566694950, 0.321346644010195360, 0.094052676295666937, 0.052761257434154628, 0.094052676295666937, 0.027527612574341543; Matrix66d expectedD; setSubMatrix(expectedDamping33, 0, 0, 3, 3, &expectedD); setSubMatrix(-expectedDamping33, 0, 1, 3, 3, &expectedD); setSubMatrix(-expectedDamping33, 1, 0, 3, 3, &expectedD); setSubMatrix(expectedDamping33, 1, 1, 3, 3, &expectedD); SparseMatrix D(6, 6); D.setZero(); SurgSim::Math::addSubMatrix(zeroBlock, 0, 0, &D, true); D.makeCompressed(); ls.addDamping(state, &D); EXPECT_TRUE(D.isApprox(expectedD)) << " D = " << std::endl << D << std::endl << "expectedD = " << std::endl << expectedD << std::endl; // Compute all together { SCOPED_TRACE("Testing addFDK method call"); Vector f = Vector::Zero(6); SurgSim::Math::clearMatrix(&K); SurgSim::Math::clearMatrix(&D); ls.addFDK(state, &f, &D, &K); EXPECT_TRUE(f.isApprox(expectedF)) << " F = " << f.transpose() << std::endl << "expectedF = " << expectedF.transpose() << std::endl; EXPECT_TRUE(K.isApprox(expectedK)) << " K = " << std::endl << K << std::endl << "expectedK = " << std::endl << expectedK << std::endl; EXPECT_TRUE(D.isApprox(expectedD)) << " D = " << std::endl << D << std::endl << "expectedD = " << std::endl << expectedD << std::endl; } // Test addMatVec method Vector ones = Vector::Ones(6); Vector oneToSix = Vector::LinSpaced(6, 1.0, 6.0); f.setZero(); ls.addMatVec(state, 1.0, 0.0, ones, &f); { SCOPED_TRACE("addMatVec(..., dampingFactor=1, stiffnessFactor=0, (1 1 1 1 1 1),...)"); for (size_t row = 0; row < 6; ++row) { EXPECT_NEAR(expectedD.row(row).sum(), f[row], epsilon) << "f[" << row << "] = " << f[row] << " expectedValue = " << expectedD.row(row).sum(); } } f.setZero(); ls.addMatVec(state, 1.0, 0.0, oneToSix, &f); { SCOPED_TRACE("addMatVec(..., dampingFactor=1, stiffnessFactor=0, (1 2 3 4 5 6),...)"); for (size_t row = 0; row < 6; ++row) { EXPECT_NEAR(expectedD.row(row).dot(oneToSix), f[row], epsilon) << "f[" << row << "] = " << f[row] << " expectedValue = " << expectedD.row(row).dot(oneToSix); } } f.setZero(); ls.addMatVec(state, 0.0, 1.0, ones, &f); { SCOPED_TRACE("addMatVec(..., dampingFactor=0, stiffnessFactor=1, (1 1 1 1 1 1),...)"); for (size_t row = 0; row < 6; ++row) { EXPECT_NEAR(expectedK.row(row).sum(), f[row], epsilon) << "f[" << row << "] = " << f[row] << " expectedValue = " << expectedK.row(row).sum(); } } f.setZero(); ls.addMatVec(state, 0.0, 1.0, oneToSix, &f); { SCOPED_TRACE("addMatVec(..., dampingFactor=0, stiffnessFactor=1, (1 2 3 4 5 6),...)"); for (size_t row = 0; row < 6; ++row) { EXPECT_NEAR(expectedK.row(row).dot(oneToSix), f[row], epsilon) << "f[" << row << "] = " << f[row] << " expectedValue = " << expectedK.row(row).dot(oneToSix); } } f.setZero(); ls.addMatVec(state, 1.4, 4.1, ones, &f); { SCOPED_TRACE("addMatVec(..., dampingFactor=1.4, stiffnessFactor=4.1, (1 1 1 1 1 1),...)"); for (size_t row = 0; row < 6; ++row) { EXPECT_NEAR(1.4 * expectedD.row(row).sum() + 4.1 * expectedK.row(row).sum(), f[row], epsilon) << "f[" << row << "] = " << f[row] << " expectedValue = " << 1.4 * expectedD.row(row).sum() + 4.1 * expectedK.row(row).sum(); } } f.setZero(); ls.addMatVec(state, 1.4, 4.1, oneToSix, &f); { SCOPED_TRACE("addMatVec(..., dampingFactor=1.4, stiffnessFactor=4.1, (1 2 3 4 5 6),...)"); for (size_t row = 0; row < 6; ++row) { EXPECT_NEAR(\ 1.4 * expectedD.row(row).dot(oneToSix) + 4.1 * expectedK.row(row).dot(oneToSix), f[row], epsilon) << "f[" << row << "] = " << f[row] << " expectedValue = " << 1.4 * expectedD.row(row).dot(oneToSix) + 4.1 * expectedK.row(row).dot(oneToSix); } } } TEST(LinearSpringTests, addStiffnessNumericalTest) { Vector3d x0(0.1, 0.2, 0.3), x1(1.3, 1.2, 1.45), v0(0.1, 0.2, 0.3), v1(-0.1, 0.12, -0.45); double restLength = 1.0, stiffness = 5.0, damping = 2.0; // Setup the spring LinearSpring ls(0, 1); ls.setStiffness(stiffness); ls.setDamping(damping); ls.setRestLength(restLength); // Setup the state SurgSim::Math::OdeState state; state.setNumDof(3, 2); // 2 nodes of 3DOF each state.getPositions().segment(0, 3) = x0; state.getPositions().segment(3, 3) = x1; state.getVelocities().segment(0, 3) = v0; state.getVelocities().segment(3, 3) = v1; Matrix zeroBlock = Matrix::Zero(6, 6); SparseMatrix K(6, 6); K.setZero(); SurgSim::Math::addSubMatrix(zeroBlock, 0, 0, &K, true); K.makeCompressed(); ls.addStiffness(state, &K); Eigen::Matrix Knumeric = KNumerical(x0, x1, v0, v1, restLength, stiffness, damping); Eigen::Matrix Kformal = KFormal(x0, x1, v0, v1, restLength, stiffness, damping); EXPECT_TRUE(Kformal.isApprox(Knumeric, epsilonTestAgainstNumericalApproximation)) << std::endl << "Kformal = " << std::endl << Kformal << std::endl << "Knumeric = " << std::endl << Knumeric << std::endl << "Kformal - Knumeric= " << std::endl << Kformal - Knumeric << std::endl; EXPECT_TRUE(K.isApprox(Kformal)) << std::endl << "K = " << std::endl << K << std::endl << "Knumeric = " << std::endl << Knumeric << std::endl; } TEST(LinearSpringTests, addDampingNumericalTest) { Vector3d x0(0.1, 0.2, 0.3), x1(1.3, 1.2, 1.45), v0(0.1, 0.2, 0.3), v1(-0.1, 0.12, -0.45); double restLength = 1.0, stiffness = 5.0, damping = 2.0; // Setup the spring LinearSpring ls(0, 1); ls.setStiffness(stiffness); ls.setDamping(damping); ls.setRestLength(restLength); // Setup the state SurgSim::Math::OdeState state; state.setNumDof(3, 2); // 2 nodes of 3DOF each state.getPositions().segment(0, 3) = x0; state.getPositions().segment(3, 3) = x1; state.getVelocities().segment(0, 3) = v0; state.getVelocities().segment(3, 3) = v1; Matrix zeroBlock = Matrix::Zero(6, 6); SparseMatrix D(6, 6); D.setZero(); SurgSim::Math::addSubMatrix(zeroBlock, 0, 0, &D, true); D.makeCompressed(); ls.addDamping(state, &D); Eigen::Matrix Dnumeric = DNumerical(x0, x1, v0, v1, restLength, stiffness, damping); Eigen::Matrix Dformal = DFormal(x0, x1, v0, v1, restLength, stiffness, damping); EXPECT_TRUE(Dformal.isApprox(Dnumeric, epsilonTestAgainstNumericalApproximation)) << std::endl << "Dformal = " << std::endl << Dformal << std::endl << "Dnumeric = " << std::endl << Dnumeric << std::endl; EXPECT_TRUE(D.isApprox(Dformal)) << std::endl << "D = " << std::endl << D << std::endl << "Dnumeric = " << std::endl << Dnumeric << std::endl; } TEST(LinearSpringTests, addFDKNumericalTest) { Vector3d x0(0.1, 0.2, 0.3), x1(1.3, 1.2, 1.45), v0(0.1, 0.2, 0.3), v1(-0.1, 0.12, -0.45); double restLength = 1.0, stiffness = 5.0, damping = 2.0; // Setup the spring LinearSpring ls(0, 1); ls.setStiffness(stiffness); ls.setDamping(damping); ls.setRestLength(restLength); // Setup the state SurgSim::Math::OdeState state; state.setNumDof(3, 2); // 2 nodes of 3DOF each state.getPositions().segment(0, 3) = x0; state.getPositions().segment(3, 3) = x1; state.getVelocities().segment(0, 3) = v0; state.getVelocities().segment(3, 3) = v1; Vector F = Vector::Zero(6); Matrix zeroBlock = Matrix::Zero(6, 6); SparseMatrix K(6, 6); K.setZero(); SurgSim::Math::addSubMatrix(zeroBlock, 0, 0, &K, true); K.makeCompressed(); SparseMatrix D(6, 6); D.setZero(); SurgSim::Math::addSubMatrix(zeroBlock, 0, 0, &D, true); D.makeCompressed(); ls.addFDK(state, &F, &D, &K); Eigen::Matrix Knumeric = KNumerical(x0, x1, v0, v1, restLength, stiffness, damping); Eigen::Matrix Kformal = KFormal(x0, x1, v0, v1, restLength, stiffness, damping); EXPECT_TRUE(Kformal.isApprox(Knumeric, epsilonTestAgainstNumericalApproximation)) << std::endl << "Kformal = " << std::endl << Kformal << std::endl << "Knumeric = " << std::endl << Knumeric << std::endl << "Kformal - Knumeric= " << std::endl << Kformal - Knumeric << std::endl; EXPECT_TRUE(K.isApprox(Kformal)) << std::endl << "K = " << std::endl << K << std::endl << "Knumeric = " << std::endl << Knumeric << std::endl; Eigen::Matrix Dnumeric = DNumerical(x0, x1, v0, v1, restLength, stiffness, damping); Eigen::Matrix Dformal = DFormal(x0, x1, v0, v1, restLength, stiffness, damping); EXPECT_TRUE(Dformal.isApprox(Dnumeric, epsilonTestAgainstNumericalApproximation)) << std::endl << "Dformal = " << std::endl << Dformal << std::endl << "Dnumeric = " << std::endl << Dnumeric << std::endl << "Dformal - Dnumeric= " << std::endl << Dformal - Dnumeric << std::endl; EXPECT_TRUE(D.isApprox(Dformal)) << std::endl << "D = " << std::endl << D << std::endl << "Dnumeric = " << std::endl << Dnumeric << std::endl; } opensurgsim-0.7.0/SurgSim/Physics/UnitTests/MassSpringConstraintFixedPointTest.cpp000066400000000000000000000220501277777236100305610ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include "SurgSim/Blocks/MassSpring1DRepresentation.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/SparseMatrix.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/MassSpringConstraintFixedPoint.h" #include "SurgSim/Physics/MassSpringLocalization.h" #include "SurgSim/Physics/MlcpPhysicsProblem.h" namespace { const double epsilon = 1e-10; const double dt = 1e-3; }; namespace SurgSim { namespace Physics { using SurgSim::Math::Vector3d; class MassSpringConstraintFixedPointTest : public ::testing::Test { public: void SetUp() { // Place spring at random location. m_extremities.push_back(Vector3d(0.8799, -0.0871, 0.7468)); m_extremities.push_back(Vector3d(0.9040, -0.7074, 0.6783)); // Define physics representation of mass-spring using 1d helper function. m_massSpring = std::make_shared("MassSpring"); size_t numNodesPerDim[1] = {2}; m_massPerNode = 0.137; std::vector boundaryConditions; m_massSpring->init1D( m_extremities, boundaryConditions, numNodesPerDim[0] * m_massPerNode, // total mass (in Kg) 100.0, // Stiffness stretching 0.0, // Damping stretching 10.0, // Stiffness bending 0.0); // Damping bending // Update position in only 1 timestep // Forward Euler for velocity, backward Euler for position m_massSpring->setIntegrationScheme(SurgSim::Math::IntegrationScheme::INTEGRATIONSCHEME_EULER_EXPLICIT_MODIFIED); m_massSpring->initialize(std::make_shared()); m_massSpring->wakeUp(); // Update model by one timestep m_massSpring->beforeUpdate(dt); m_massSpring->update(dt); // Create localization helper class m_localization = std::make_shared(m_massSpring); } void setConstraintAtNode(size_t nodeId) { m_nodeId = nodeId; m_localization->setLocalNode(nodeId); } ConstraintData m_constraintData; size_t m_nodeId; std::shared_ptr m_massSpring; double m_massPerNode; std::vector m_extremities; std::shared_ptr m_localization; }; TEST_F(MassSpringConstraintFixedPointTest, ConstructorTest) { ASSERT_NO_THROW({ MassSpringConstraintFixedPoint constraint; }); ASSERT_NE(nullptr, std::make_shared()); } TEST_F(MassSpringConstraintFixedPointTest, ConstraintConstantsTest) { auto implementation = std::make_shared(); EXPECT_EQ(SurgSim::Physics::FIXED_3DPOINT, implementation->getConstraintType()); EXPECT_EQ(3u, implementation->getNumDof()); } TEST_F(MassSpringConstraintFixedPointTest, BuildMlcpTest) { // Define constraint (frictionless non-penetration) auto implementation = std::make_shared(); // Initialize MLCP MlcpPhysicsProblem mlcpPhysicsProblem = MlcpPhysicsProblem::Zero(m_massSpring->getNumDof(), 3, 1); // Build MLCP for 0th node setConstraintAtNode(0); implementation->build(dt, m_constraintData, m_localization, &mlcpPhysicsProblem, 0, 0, SurgSim::Physics::CONSTRAINT_POSITIVE_SIDE); // Expected results. // At the initial time-step, the only force is gravity. // // F(0) = m * a(0) // => a(0) = 1/m * F(0) // = (0, -g, 0) // // Modified Explicit Euler: // v(1) = v(0) + dv/dt|(t=0)*dt // = v(0) + a(0)*dt // = (0, -g*dt, 0) // // p(1) = p(0) + dp/dt|(t=1)*dt // = p(0) + v(1)*dt // = p(0) + (0, -g*dt^2, 0) // // The constraint violation is the new position. The constraint is // U(t) = p(t) = 0 // U(1) = p(1) Vector3d expectedViolation = m_extremities[0] - Vector3d::UnitY() * 9.81 * dt * dt; EXPECT_TRUE(mlcpPhysicsProblem.b.isApprox(expectedViolation)) << "b = " << mlcpPhysicsProblem.b.transpose() << " expected = " << (-Vector3d::UnitY() * 9.81 * dt * dt).transpose(); // By definition, H = dU/dv. // U(t+dt) = p(t+dt) = p(t) + dt.v(t) [using Backward Euler integration scheme for approximation] // // dU/dv = dt.Id(3x3) // => H = dt.Id(3x3) for the constrained node and Zero(3x3) for all other nodes SurgSim::Math::Matrix H = mlcpPhysicsProblem.H; SurgSim::Math::Matrix expectedH = SurgSim::Math::Matrix::Zero(3, 6); expectedH.block<3, 3>(0, 0) = SurgSim::Math::Matrix33d::Identity() * dt; EXPECT_TRUE((H.isApprox(expectedH))); // We define C as the matrix which transforms F -> v (which differs from treatments which define it as F -> p) // v(1) = v(0) + a(0)*dt // = v(0) + 1/m*F(0)*dt // => (v(1) - v(0)) = [dt/m].Id(3x3) * F(0) // // Therefore C = dt/m.Id(6x6) for the entire system // and // CH^T = dt/m.(Id(3x3) 0 )* (dt.Id(3x3)) = dt^2/m (Id(3x3)) // ( 0 Id(3x3)) ( 0 ) ( 0 ) SurgSim::Math::Matrix expectedCHt = SurgSim::Math::Matrix::Zero(6, 3); expectedCHt.block<3, 3>(0, 0) = SurgSim::Math::Matrix33d::Identity() * dt * dt / m_massPerNode; EXPECT_TRUE(mlcpPhysicsProblem.CHt.isApprox(expectedCHt)); // And finally, // HCHt = H * (dt/m).Id(6x6) * H^T = (dt.Id(3x3) 0) (dt^2/m.Id(3x3)) = dt^3/m.Id(3x3) // ( 0 ) EXPECT_TRUE(mlcpPhysicsProblem.A.isApprox(dt * dt * dt / m_massPerNode * SurgSim::Math::Matrix33d::Identity())); // ConstraintTypes should contain 0 entry as it is setup by the constraint and not the ConstraintImplementation // This way, the constraint can verify that both ConstraintImplementation are the same type EXPECT_EQ(0u, mlcpPhysicsProblem.constraintTypes.size()); } TEST_F(MassSpringConstraintFixedPointTest, BuildMlcpIndiciesTest) { auto implementation = std::make_shared(); MlcpPhysicsProblem mlcpPhysicsProblem = MlcpPhysicsProblem::Zero(11, 6, 3); // Suppose 5 dof and 1 constraint are defined elsewhere. Then H, CHt, HCHt, and b are prebuilt. Eigen::SparseVector localH; localH.resize(5); localH.reserve(5); localH.insert(0) = 0.9478; localH.insert(1) = -0.3807; localH.insert(2) = 0.5536; localH.insert(3) = -0.6944; localH.insert(4) = 0.1815; mlcpPhysicsProblem.H.coeffRef(0, 0) += localH.coeff(0); mlcpPhysicsProblem.H.coeffRef(0, 1) += localH.coeff(1); mlcpPhysicsProblem.H.coeffRef(0, 2) += localH.coeff(2); mlcpPhysicsProblem.H.coeffRef(0, 3) += localH.coeff(3); mlcpPhysicsProblem.H.coeffRef(0, 4) += localH.coeff(4); Eigen::Matrix localC; localC << -0.2294, 0.5160, 0.2520, 0.5941, -0.4854, 0.1233, -0.4433, 0.3679, 0.9307, 0.2600, 0.1988, 0.6637, -0.7591, 0.1475, 0.8517, -0.5495, -0.4305, 0.3162, -0.7862, 0.7627, -0.5754, 0.4108, 0.8445, -0.5565, 0.7150; localC = localC * localC.transpose(); // force to be symmetric Eigen::Matrix localCHt = localC * localH.transpose(); mlcpPhysicsProblem.CHt.block<5, 1>(0, 0) = localCHt; mlcpPhysicsProblem.A.block<1, 1>(0, 0) = localH * localCHt; mlcpPhysicsProblem.b.block<1, 1>(0, 0)[0] = 0.6991; // Place mass-spring at 5th dof and 1th constraint (0-based). size_t indexOfRepresentation = 5; size_t indexOfConstraint = 1; setConstraintAtNode(1); implementation->build(dt, m_constraintData, m_localization, &mlcpPhysicsProblem, indexOfRepresentation, indexOfConstraint, SurgSim::Physics::CONSTRAINT_POSITIVE_SIDE); // b -> E -> [#constraints, 1] const Vector3d newPosition = m_extremities[1] - Vector3d::UnitY() * 9.81 * dt * dt; EXPECT_TRUE(mlcpPhysicsProblem.b.segment<3>(indexOfConstraint).isApprox(newPosition)); // H -> [#constraints, #dof] SurgSim::Math::Matrix H = mlcpPhysicsProblem.H; SurgSim::Math::Matrix expectedH = SurgSim::Math::Matrix::Zero(3, 6); expectedH.block<3, 3>(0, 3) = SurgSim::Math::Matrix33d::Identity() * dt; EXPECT_TRUE((H.block<3, 6>(indexOfConstraint, indexOfRepresentation).isApprox(expectedH))) << H; // C -> [#dof, #dof] // CHt -> [#dof, #constraints] SurgSim::Math::Matrix CHt = mlcpPhysicsProblem.CHt; SurgSim::Math::Matrix expectedCHt = SurgSim::Math::Matrix::Zero(6, 3); expectedCHt.block<3, 3>(3, 0) = SurgSim::Math::Matrix33d::Identity() * dt * dt / m_massPerNode; EXPECT_TRUE((CHt.block(indexOfRepresentation, indexOfConstraint, 6, 3).isApprox(expectedCHt))) << CHt; // A -> HCHt -> [#constraints, #constraints] SurgSim::Math::Matrix expectedA = dt * dt * dt / m_massPerNode * SurgSim::Math::Matrix33d::Identity(); EXPECT_TRUE(mlcpPhysicsProblem.A.block(1, 1, 3, 3).isApprox(expectedA)); } }; // namespace Physics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/UnitTests/MassSpringConstraintFrictionlessContactTest.cpp000066400000000000000000000230071277777236100324730ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include "SurgSim/Blocks/MassSpring1DRepresentation.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/SparseMatrix.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/ContactConstraintData.h" #include "SurgSim/Physics/MassSpringConstraintFrictionlessContact.h" #include "SurgSim/Physics/MassSpringLocalization.h" #include "SurgSim/Physics/MlcpPhysicsProblem.h" namespace { const double epsilon = 1e-10; const double dt = 1e-3; }; namespace SurgSim { namespace Physics { using SurgSim::Math::Vector3d; class MassSpringConstraintFrictionlessContactTest : public ::testing::Test { public: void SetUp() { // Define plane normal m_n = Vector3d(0.8539, 0.6289, -0.9978); m_n.normalize(); // Place spring at random location. m_extremities.push_back(Vector3d(0.8799, -0.0871, 0.7468)); m_extremities.push_back(Vector3d(0.9040, -0.7074, 0.6783)); // Define physics representation of mass-spring using 1d helper function. m_massSpring = std::make_shared("MassSpring"); size_t numNodesPerDim[1] = {2}; m_massPerNode = 0.137; std::vector boundaryConditions; m_massSpring->init1D( m_extremities, boundaryConditions, numNodesPerDim[0] * m_massPerNode, // total mass (in Kg) 100.0, // Stiffness stretching 0.0, // Damping stretching 10.0, // Stiffness bending 0.0); // Damping bending // Update position in only 1 timestep // Forward Euler for velocity, backward Euler for position m_massSpring->setIntegrationScheme(SurgSim::Math::IntegrationScheme::INTEGRATIONSCHEME_EULER_EXPLICIT_MODIFIED); m_massSpring->initialize(std::make_shared()); m_massSpring->wakeUp(); // Update model by one timestep m_massSpring->beforeUpdate(dt); m_massSpring->update(dt); // Create localization helper class m_localization = std::make_shared(m_massSpring); } void setContactAtNode(size_t nodeId) { m_nodeId = nodeId; m_localization->setLocalNode(nodeId); // Place plane at nodeId double distance = -m_extremities[nodeId].dot(m_n); m_constraintData.setPlaneEquation(m_n, distance); } Vector3d m_n; ContactConstraintData m_constraintData; size_t m_nodeId; std::shared_ptr m_massSpring; double m_massPerNode; std::vector m_extremities; std::shared_ptr m_localization; }; TEST_F(MassSpringConstraintFrictionlessContactTest, ConstructorTest) { ASSERT_NO_THROW({ MassSpringConstraintFrictionlessContact massSpring; }); ASSERT_NE(nullptr, std::make_shared()); } TEST_F(MassSpringConstraintFrictionlessContactTest, ConstraintConstantsTest) { auto implementation = std::make_shared(); EXPECT_EQ(SurgSim::Physics::FRICTIONLESS_3DCONTACT, implementation->getConstraintType()); EXPECT_EQ(1u, implementation->getNumDof()); } TEST_F(MassSpringConstraintFrictionlessContactTest, BuildMlcpTest) { // Define constraint (frictionless non-penetration) auto implementation = std::make_shared(); // Initialize MLCP MlcpPhysicsProblem mlcpPhysicsProblem = MlcpPhysicsProblem::Zero(m_massSpring->getNumDof(), 1, 1); // Build MLCP for 0th node setContactAtNode(0); implementation->build(dt, m_constraintData, m_localization, &mlcpPhysicsProblem, 0, 0, SurgSim::Physics::CONSTRAINT_POSITIVE_SIDE); // Expected results. // At the initial time-step, the only force is gravity. // // F(0) = m * a(0) // => a(0) = 1/m * F(0) // = (0, -g, 0) // // Modified Explicit Euler: // v(1) = v(0) + dv/dt|(t=0)*dt // = v(0) + a(0)*dt // = (0, -g*dt, 0) // // p(1) = p(0) + dp/dt|(t=1)*dt // = p(0) + v(1)*dt // = p(0) + (0, -g*dt^2, 0) // // The constraint violation is the projection of the new position onto the constraint normal. Note, we have // defined the plane to intersect with p(0). The constraint is // U(t) = n^t.p(t) >= 0 // U(1) = n^t.p(1) const Vector3d newPosition = m_extremities[0] - Vector3d::UnitY() * 9.81 * dt * dt; EXPECT_NEAR(newPosition.dot(m_n), mlcpPhysicsProblem.b[0], epsilon); // By definition, H = dU/dp. // // dU/dt = (dU/dp).(dp/dt) // = H.(dp/dt) // // dp = p(1) - p(0) // => dp/dt = (p(1) - p(0)) / dt // // dU/dt = (U(1) - U(0)) / dt [Note U(0) = 0] // = n^t.(p(1) - p(0)) / dt // = n^t.(dp/dt) // => H = n^t SurgSim::Math::Matrix h = mlcpPhysicsProblem.H; EXPECT_NEAR(m_n[0], h(0, 0), epsilon); EXPECT_NEAR(m_n[1], h(0, 1), epsilon); EXPECT_NEAR(m_n[2], h(0, 2), epsilon); // We define C as the matrix which transforms F -> v (which differs from treatments which define it as F -> p) // v(1) = v(0) + a(0)*dt // = v(0) + 1/m*F(0)*dt // => (v(1) - v(0)) = [dt/m] * F(0) // // Therefore C = dt/m // // We can directly calculate // CHt = C * H^t // = (dt/m) * (nx, ny, nz) EXPECT_NEAR(dt / m_massPerNode * m_n[0], mlcpPhysicsProblem.CHt(0, 0), epsilon); EXPECT_NEAR(dt / m_massPerNode * m_n[1], mlcpPhysicsProblem.CHt(1, 0), epsilon); EXPECT_NEAR(dt / m_massPerNode * m_n[2], mlcpPhysicsProblem.CHt(2, 0), epsilon); // And finally, // HCHt = [nx ny nz] * (dt/m) * (nx, ny, nz) // = (dt/m) * (nx*nx + ny*ny + nz*nz) double calculatedA = mlcpPhysicsProblem.A.block<1, 1>(0, 0)[0]; // VS intellisense error workaround EXPECT_NEAR(dt / m_massPerNode * (m_n[0] * m_n[0] + m_n[1] * m_n[1] + m_n[2] * m_n[2]), calculatedA, epsilon); // ConstraintTypes should contain 0 entry as it is setup by the constraint and not the ConstraintImplementation // This way, the constraint can verify that both ConstraintImplementation are the same type EXPECT_EQ(0u, mlcpPhysicsProblem.constraintTypes.size()); } TEST_F(MassSpringConstraintFrictionlessContactTest, BuildMlcpIndiciesTest) { auto implementation = std::make_shared(); MlcpPhysicsProblem mlcpPhysicsProblem = MlcpPhysicsProblem::Zero(11, 2, 2); // Suppose 5 dof and 1 constraint are defined elsewhere. Then H, CHt, HCHt, and b are prebuilt. Eigen::SparseVector localH; localH.resize(5); localH.reserve(5); localH.insert(0) = 0.9478; localH.insert(1) = -0.3807; localH.insert(2) = 0.5536; localH.insert(3) = -0.6944; localH.insert(4) = 0.1815; mlcpPhysicsProblem.H.coeffRef(0, 0) += localH.coeff(0); mlcpPhysicsProblem.H.coeffRef(0, 1) += localH.coeff(1); mlcpPhysicsProblem.H.coeffRef(0, 2) += localH.coeff(2); mlcpPhysicsProblem.H.coeffRef(0, 3) += localH.coeff(3); mlcpPhysicsProblem.H.coeffRef(0, 4) += localH.coeff(4); Eigen::Matrix localC; localC << -0.2294, 0.5160, 0.2520, 0.5941, -0.4854, 0.1233, -0.4433, 0.3679, 0.9307, 0.2600, 0.1988, 0.6637, -0.7591, 0.1475, 0.8517, -0.5495, -0.4305, 0.3162, -0.7862, 0.7627, -0.5754, 0.4108, 0.8445, -0.5565, 0.7150; localC = localC * localC.transpose(); // force to be symmetric Eigen::Matrix localCHt = localC * localH.transpose(); mlcpPhysicsProblem.CHt.block<5, 1>(0, 0) = localCHt; mlcpPhysicsProblem.A.block<1, 1>(0, 0) = localH * localCHt; mlcpPhysicsProblem.b.block<1, 1>(0, 0)[0] = 0.6991; // Place mass-spring at 5th dof and 1th constraint. size_t indexOfRepresentation = 5; size_t indexOfConstraint = 1; setContactAtNode(1); implementation->build(dt, m_constraintData, m_localization, &mlcpPhysicsProblem, indexOfRepresentation, indexOfConstraint, SurgSim::Physics::CONSTRAINT_POSITIVE_SIDE); // b -> E -> [#constraints, 1] const Vector3d newPosition = m_extremities[1] - Vector3d::UnitY() * 9.81 * dt * dt; EXPECT_NEAR(newPosition.dot(m_n), mlcpPhysicsProblem.b[indexOfConstraint], epsilon); // H -> [#constraints, #dof] SurgSim::Math::Matrix h = mlcpPhysicsProblem.H; EXPECT_NEAR(m_n[0], h(indexOfConstraint, indexOfRepresentation + 3 * m_nodeId + 0), epsilon); EXPECT_NEAR(m_n[1], h(indexOfConstraint, indexOfRepresentation + 3 * m_nodeId + 1), epsilon); EXPECT_NEAR(m_n[2], h(indexOfConstraint, indexOfRepresentation + 3 * m_nodeId + 2), epsilon); // C -> [#dof, #dof] // CHt -> [#dof, #constraints] EXPECT_NEAR(dt / m_massPerNode * m_n[0], mlcpPhysicsProblem.CHt(indexOfRepresentation + 3 * m_nodeId + 0, indexOfConstraint), epsilon); EXPECT_NEAR(dt / m_massPerNode * m_n[1], mlcpPhysicsProblem.CHt(indexOfRepresentation + 3 * m_nodeId + 1, indexOfConstraint), epsilon); EXPECT_NEAR(dt / m_massPerNode * m_n[2], mlcpPhysicsProblem.CHt(indexOfRepresentation + 3 * m_nodeId + 2, indexOfConstraint), epsilon); // A -> HCHt -> [#constraints, #constraints] double calculatedA = mlcpPhysicsProblem.A.block<1, 1>(indexOfConstraint, indexOfConstraint)[0]; EXPECT_NEAR(dt / m_massPerNode * (m_n[0] * m_n[0] + m_n[1] * m_n[1] + m_n[2] * m_n[2]), calculatedA, epsilon); } }; // namespace Physics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/UnitTests/MassSpringLocalizationTest.cpp000066400000000000000000000117411277777236100271000ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include #include "SurgSim/Blocks/MassSpring1DRepresentation.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/MassSpringLocalization.h" #include "SurgSim/Physics/MassSpringRepresentation.h" #include "SurgSim/Physics/RigidRepresentation.h" #include "SurgSim/Physics/UnitTests/MockObjects.h" namespace { const double epsilon = 1e-10; }; namespace SurgSim { namespace Physics { TEST (MassSpringLocalizationTest, ConstructorTest) { ASSERT_NO_THROW( {MassSpringLocalization localization;}); ASSERT_NO_THROW( { auto massSpring = std::make_shared("MassSpringRepresentation"); MassSpringLocalization localization(massSpring); }); } TEST (MassSpringLocalizationTest, SetGetRepresentationTest) { MassSpringLocalization localization; auto massSpring = std::make_shared("MassSpringRepresentation"); EXPECT_EQ(nullptr, localization.getRepresentation()); localization.setRepresentation(massSpring); EXPECT_EQ(massSpring, localization.getRepresentation()); localization.setRepresentation(nullptr); EXPECT_EQ(nullptr, localization.getRepresentation()); } TEST (MassSpringLocalizationTest, CalculatePositionTest) { using SurgSim::Math::Vector3d; // Create the mass spring auto massSpring = std::make_shared("MassSpring"); std::vector extremities; extremities.push_back(Vector3d(0,0,0)); extremities.push_back(Vector3d(1,0,0)); std::vector boundaryConditions; massSpring->init1D( extremities, boundaryConditions, 0.1, // total mass (in Kg) 100.0, // Stiffness stretching 0.0, // Damping stretching 10.0, // Stiffness bending 0.0); // Damping bending MassSpringLocalization localization = MassSpringLocalization(massSpring); localization.setLocalNode(0); ASSERT_EQ(0u, localization.getLocalNode()); ASSERT_TRUE(localization.calculatePosition().isZero(epsilon)); localization.setLocalNode(1); ASSERT_EQ(1u, localization.getLocalNode()); ASSERT_TRUE(localization.calculatePosition().isApprox(Vector3d(1.0, 0.0, 0.0), epsilon)); // Out-Of-Range assertions EXPECT_THROW(localization.calculatePosition(-0.01), SurgSim::Framework::AssertionFailure); EXPECT_THROW(localization.calculatePosition(1.01), SurgSim::Framework::AssertionFailure); } TEST(MassSpringLocalizationTest, CalculateVelocityTest) { using SurgSim::Math::Vector3d; // Create the mass spring auto massSpring = std::make_shared("MassSpring"); std::vector extremities; extremities.push_back(Vector3d(0, 0, 0)); extremities.push_back(Vector3d(1, 0, 0)); std::vector boundaryConditions; massSpring->init1D( extremities, boundaryConditions, 0.1, // total mass (in Kg) 100.0, // Stiffness stretching 0.0, // Damping stretching 10.0, // Stiffness bending 0.0); // Damping bending auto state = std::make_shared(*massSpring->getInitialState()); state->getVelocities().segment<3>(0) = Vector3d(0, 0, 0); state->getVelocities().segment<3>(3) = Vector3d(1, 0, 0); massSpring->setInitialState(state); MassSpringLocalization localization = MassSpringLocalization(massSpring); localization.setLocalNode(0); ASSERT_EQ(0u, localization.getLocalNode()); ASSERT_TRUE(localization.calculateVelocity().isZero(epsilon)); localization.setLocalNode(1); ASSERT_EQ(1u, localization.getLocalNode()); ASSERT_TRUE(localization.calculateVelocity().isApprox(Vector3d(1.0, 0.0, 0.0), epsilon)); // Out-Of-Range assertions EXPECT_THROW(localization.calculateVelocity(-0.01), SurgSim::Framework::AssertionFailure); EXPECT_THROW(localization.calculateVelocity(1.01), SurgSim::Framework::AssertionFailure); } TEST (MassSpringLocalizationTest, IsValidRepresentationTest) { MassSpringLocalization localization; EXPECT_TRUE(localization.isValidRepresentation(nullptr)); EXPECT_TRUE(localization.isValidRepresentation(std::make_shared("massSpring"))); EXPECT_TRUE(localization.isValidRepresentation( std::make_shared>("descendent"))); EXPECT_FALSE(localization.isValidRepresentation(std::make_shared())); EXPECT_FALSE(localization.isValidRepresentation(std::make_shared("rigidRepresentation"))); } }; // namespace Physics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/UnitTests/MassSpringMechanicalValidationTests.cpp000066400000000000000000000260711277777236100306740ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/LinearSpring.h" #include "SurgSim/Physics/MassSpringRepresentation.h" #include "SurgSim/Physics/UnitTests/MockObjects.h" using SurgSim::Math::Quaterniond; using SurgSim::Math::RigidTransform3d; using SurgSim::Math::Vector; using SurgSim::Math::Vector3d; using SurgSim::Physics::LinearSpring; using SurgSim::Physics::MassSpringRepresentation; using SurgSim::Physics::MockMassSpring; namespace { const double epsilon = 1e-10; }; class MassSpringMechanicalValidationTests : public ::testing::Test { public: void SetUp() override { // Initialization values for the simulation m_dt = 1e-3; m_numNodes = 10; m_totalMass = 0.1; m_springStiffness = 1.0; m_springDamping = 0.1; m_rayleighDampingMass = 1e0; m_rayleighDampingStiffness = 1e-3; m_nodeBoundaryConditions.push_back(0); // Poses m_poseIdentity.setIdentity(); Quaterniond q; q.coeffs().setRandom(); q.normalize(); Vector3d t; t.setRandom(); m_poseRandom = SurgSim::Math::makeRigidTransform(q, t); } /// Run the energy test on a spring /// \param scheme The numerical integration scheme to be used /// \param expectedBehavior -1 if the energy should decrease, 1 if it should increase, 0 if stable void runEnergyTest(SurgSim::Math::IntegrationScheme scheme, int expectedBehavior) { m_dt = 1e-3; // 2 nodes, the 1st node fixed, no Rayleigh damping and no spring damping // A spring oscillating, only subject to mass and stiffness m_numNodes = 2; m_totalMass = 0.1; m_springStiffness = 1.0; m_springDamping = 0.0; m_rayleighDampingMass = 0.0; m_rayleighDampingStiffness = 0.0; m_nodeBoundaryConditions.clear(); m_nodeBoundaryConditions.push_back(0); MockMassSpring m("MassSpring", m_poseRandom, m_numNodes, m_nodeBoundaryConditions, m_totalMass, m_rayleighDampingMass, m_rayleighDampingStiffness, m_springStiffness, m_springDamping, scheme); m.initialize(std::make_shared()); m.wakeUp(); // Pull on the free mass, by simply making the initial length shorter (creating an extension right away) std::static_pointer_cast(m.getSpring(0))->setRestLength(0.0); m.setIsGravityEnabled(false); Vector3d initialDelta = m.getCurrentState()->getPosition(1) - m.getCurrentState()->getPosition(0); double initialEk = 0.5 * (m_totalMass/2.0) * m.getCurrentState()->getVelocity(1).squaredNorm(); double initialEs = 0.5 * m_springStiffness * initialDelta.squaredNorm(); double initialEnergy = initialEk + initialEs; // Simulate 2 seconds of virtual time double time = 0.0; while(time < 2.0) { m.beforeUpdate(m_dt); m.update(m_dt); m.afterUpdate(m_dt); Vector3d previousDelta = m.getPreviousState()->getPosition(1) - m.getPreviousState()->getPosition(0); Vector3d currentDelta = m.getCurrentState()->getPosition(1) - m.getCurrentState()->getPosition(0); // Calculate previous/current system energy (kinetic energy + spring energy) double previousEk = 0.5 * (m_totalMass/2.0) * m.getPreviousState()->getVelocity(1).squaredNorm(); double previousEs = 0.5 * m_springStiffness * previousDelta.squaredNorm(); double previousEnergy = previousEk + previousEs; double currentEk = 0.5 * (m_totalMass/2.0) * m.getCurrentState()->getVelocity(1).squaredNorm(); double currentEs = 0.5 * m_springStiffness * currentDelta.squaredNorm(); double currentEnergy = currentEk + currentEs; if (expectedBehavior < 0) { EXPECT_LT(currentEnergy, previousEnergy); } else if (expectedBehavior > 0) { EXPECT_GT(currentEnergy, previousEnergy); } else { EXPECT_NEAR(currentEnergy, previousEnergy, 2.6e-6); EXPECT_NEAR(currentEnergy, initialEnergy, 3e-4); } time += m_dt; } } protected: /// Simulation parameters double m_dt; /// Number of nodes size_t m_numNodes; /// NodeIds boundary conditions std::vector m_nodeBoundaryConditions; /// Total mass (in Kg) double m_totalMass; /// Spring stiffness and damping double m_springStiffness, m_springDamping; /// Rayleigh damping (mass and stiffness coefs) double m_rayleighDampingMass, m_rayleighDampingStiffness; /// IdentityPose and random pose SurgSim::Math::RigidTransform3d m_poseIdentity, m_poseRandom; }; TEST_F(MassSpringMechanicalValidationTests, NoGravityTest) { // Note the use of identity pose to avoid small variation between the spring rest length and current length MockMassSpring m("MassSpring", m_poseIdentity, m_numNodes, m_nodeBoundaryConditions, m_totalMass, m_rayleighDampingMass, m_rayleighDampingStiffness, m_springStiffness, m_springDamping, SurgSim::Math::INTEGRATIONSCHEME_EULER_EXPLICIT); m.setIsGravityEnabled(false); m.initialize(std::make_shared()); m.wakeUp(); m.beforeUpdate(m_dt); m.update(m_dt); m.afterUpdate(m_dt); EXPECT_EQ(*m.getInitialState(), *m.getFinalState()); EXPECT_EQ(*m.getInitialState(), *m.getCurrentState()); EXPECT_EQ(*m.getInitialState(), *m.getPreviousState()); } TEST_F(MassSpringMechanicalValidationTests, OneSpringFrequencyTest) { m_numNodes = 2; m_totalMass = 0.1; m_springStiffness = 1.0; m_springDamping = 0.0; m_rayleighDampingMass = 0.0; m_rayleighDampingStiffness = 0.0; m_nodeBoundaryConditions.clear(); m_nodeBoundaryConditions.push_back(0); // Only the Modified Euler Explicit integration conserves the energy exactly // (explicit adds energy to the system, implicit removes energy to the system) MockMassSpring m("MassSpring", m_poseRandom, m_numNodes, m_nodeBoundaryConditions, m_totalMass, m_rayleighDampingMass, m_rayleighDampingStiffness, m_springStiffness, m_springDamping, SurgSim::Math::INTEGRATIONSCHEME_EULER_EXPLICIT_MODIFIED); // Pull on the free mass, by simply making the initial length shorter (creating an extension right away) std::static_pointer_cast(m.getSpring(0))->setRestLength(0.0); m.setIsGravityEnabled(false); m.initialize(std::make_shared()); m.wakeUp(); // Frequency = 1/(2PI) sqrt(k / m) double f = 1.0/(2.0 * M_PI) * sqrt(m_springStiffness / (m_totalMass/2.0)); // Period = 1/f double period = 1.0 / f; // Let's look for a time step, factor of period, small enough for stability of Explicit Euler (~1Khz) m_dt = period; while(m_dt > 1e-3) m_dt *= 0.5; // Simulate a single mass connected to a spring at the same time for comparison purpose Vector3d x0 = SurgSim::Math::getSubVector(m.getInitialState()->getPositions(), 1, 3); Vector3d x = x0; Vector3d v = Vector3d::Zero(); double time = 0.0; // Let's do all iterations (except the last 2) testing that the mass is NOT back yet to its original position while(time < period - 2.0 * m_dt) { m.beforeUpdate(m_dt); m.update(m_dt); m.afterUpdate(m_dt); // Manually simulate a single mass connected to a spring Vector3d anchor = SurgSim::Math::getSubVector(m.getInitialState()->getPositions(), 0, 3); Vector3d f = (m_springStiffness * (anchor - x)) / (m_totalMass/2.0); v += f * m_dt; x += v * m_dt; const Vector3d& finalPosition = SurgSim::Math::getSubVector(m.getFinalState()->getPositions(), 1, 3); const Vector3d& finalVelocity = SurgSim::Math::getSubVector(m.getFinalState()->getVelocities(), 1, 3); const Vector3d& currentPosition = SurgSim::Math::getSubVector(m.getCurrentState()->getPositions(), 1, 3); EXPECT_TRUE(finalPosition.isApprox(currentPosition)); EXPECT_TRUE(finalPosition.isApprox(x, 1e-8)); EXPECT_TRUE(finalVelocity.isApprox(v, 1e-8)); Vector3d deltaCompare = finalPosition - x0; EXPECT_FALSE(deltaCompare.isZero(1e-11)) << "Error is " << deltaCompare.norm(); deltaCompare = currentPosition - x0; EXPECT_FALSE(deltaCompare.isZero(1e-11)) << "Error is " << deltaCompare.norm(); time += m_dt; } // Let's do the last 2 iterations without testing as we are getting close enough to the solution // that the test might become true before reaching the very last iteration while(time < period) { m.beforeUpdate(m_dt); m.update(m_dt); m.afterUpdate(m_dt); time += m_dt; } const Vector3d& finalPosition = SurgSim::Math::getSubVector(m.getFinalState()->getPositions(), 1, 3); const Vector3d& currentPosition = SurgSim::Math::getSubVector(m.getCurrentState()->getPositions(), 1, 3); Vector3d deltaCompare = finalPosition - x0; EXPECT_TRUE(deltaCompare.isZero(2e-9)) << "Error is " << deltaCompare.norm(); deltaCompare = currentPosition - x0; EXPECT_TRUE(deltaCompare.isZero(2e-9)) << "Error is " << deltaCompare.norm(); } TEST_F(MassSpringMechanicalValidationTests, FallingTest) { // No boundary conditions to let the model fall m_nodeBoundaryConditions.clear(); MockMassSpring m("MassSpring", m_poseRandom, m_numNodes, m_nodeBoundaryConditions, m_totalMass, m_rayleighDampingMass, m_rayleighDampingStiffness, m_springStiffness, m_springDamping, SurgSim::Math::INTEGRATIONSCHEME_EULER_EXPLICIT); m.initialize(std::make_shared()); m.wakeUp(); // run few iterations of simulation... for (int i = 0; i< 5; i++) { m.beforeUpdate(m_dt); m.update(m_dt); m.afterUpdate(m_dt); const Vector& v = m.getFinalState()->getVelocities(); // Making sure that each mass has a velocity directed toward the gravity vector direction // with no orthogonal components for (size_t nodeId = 0; nodeId < m.getNumMasses(); nodeId++) { const Vector3d& vi = SurgSim::Math::getSubVector(v, nodeId, 3); double vi_dot_g = vi.dot(m.getGravityVector()); EXPECT_GE(vi_dot_g, 0.0) << "v = " << vi.transpose() << " ; g = " << m.getGravityVector().transpose(); const Vector3d vi_cross_g = vi.cross(m.getGravityVector()); EXPECT_TRUE(vi_cross_g.isZero()) << "v = " << vi.transpose() << " ; g = " << m.getGravityVector().transpose() << " vi^g = " << vi_cross_g.transpose(); } } } TEST_F(MassSpringMechanicalValidationTests, EnergyTest) { { SCOPED_TRACE("Testing energy increase for Euler explicit"); // For Euler explicit, the energy should increase runEnergyTest(SurgSim::Math::INTEGRATIONSCHEME_EULER_EXPLICIT, 1); } { SCOPED_TRACE("Testing energy decrease for Euler implicit"); // For Euler implicit, the energy should decrease runEnergyTest(SurgSim::Math::INTEGRATIONSCHEME_EULER_IMPLICIT, -1); } { SCOPED_TRACE("Testing energy stability for Modified Euler explicit"); // For modified Euler explicit , the energy should be stable runEnergyTest(SurgSim::Math::INTEGRATIONSCHEME_EULER_EXPLICIT_MODIFIED, 0); } } opensurgsim-0.7.0/SurgSim/Physics/UnitTests/MassSpringRepresentationTests.cpp000066400000000000000000000516251277777236100276420ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/MassSpringLocalization.h" #include "SurgSim/Physics/MassSpringRepresentation.h" #include "SurgSim/Physics/UnitTests/DeformableTestsUtility.h" #include "SurgSim/Physics/UnitTests/MockObjects.h" using SurgSim::Math::Vector; using SurgSim::Math::Matrix; using SurgSim::Physics::MassSpringLocalization; using SurgSim::Physics::MassSpringRepresentation; using SurgSim::Physics::MockLocalization; using SurgSim::Physics::MockMassSpring; using SurgSim::Physics::MockSpring; namespace { const double epsilon = 1e-10; }; class MassSpringRepresentationTests : public ::testing::Test { protected: double m_dt; double m_rayleighDampingMassParameter; double m_rayleighDampingStiffnessParameter; Vector m_expectedSpringsForce; Vector m_expectedRayleighDampingForce; Vector m_expectedGravityForce; Matrix m_expectedMass; Matrix m_expectedDamping; Matrix m_expectedRayleighDamping; Matrix m_expectedStiffness; std::shared_ptr m_massSpring; std::shared_ptr m_initialState; std::shared_ptr m_localization; void SetUp() override { m_massSpring = std::make_shared(); m_dt = 1e-3; m_rayleighDampingMassParameter = 0.452; m_rayleighDampingStiffnessParameter = 0.242; m_initialState = std::make_shared(); m_initialState->setNumDof(m_massSpring->getNumDofPerNode(), 3); m_initialState->getVelocities().setOnes(); // v = (1...1) to test damping m_massSpring->setInitialState(m_initialState); // Mass should be a identity matrix (all masses are 1) m_expectedMass = Matrix::Identity(9, 9); // Damping should be a diagonal matrix with diagonal (2 2 2 4 4 4 2 2 2) m_expectedDamping = Matrix::Zero(9, 9); m_expectedDamping.diagonal() << 2.0, 2.0, 2.0, 4.0, 4.0, 4.0, 2.0, 2.0, 2.0; // Stiffness should be a diagonal matrix with diagonal (3 3 3 6 6 6 3 3 3) m_expectedStiffness = Matrix::Zero(9, 9); m_expectedStiffness.diagonal() << 3.0, 3.0, 3.0, 6.0, 6.0, 6.0, 3.0, 3.0, 3.0; // Rayleigh damping = alpha.M + beta.K with M and K are diagonals, so the resulting matrix is too m_expectedRayleighDamping = m_expectedMass * m_rayleighDampingMassParameter; m_expectedRayleighDamping += m_expectedStiffness * m_rayleighDampingStiffnessParameter; // FemElements force should be (1 2 3 4 5 6 0 0 0) + (0 0 0 1 2 3 4 5 6) = (1 2 3 5 7 9 4 5 6) m_expectedSpringsForce.resize(9); m_expectedSpringsForce << 1.0, 2.0, 3.0, 5.0, 7.0, 9.0, 4.0, 5.0, 6.0; // Gravity force should be m.gravity for each node of each element m_expectedGravityForce = Vector::Zero(9); SurgSim::Math::Vector3d g(0.0, -9.81, 0.0); m_expectedGravityForce .segment<3>(0) += g; // Mass = 1 for each node m_expectedGravityForce .segment<3>(3) += g; // Mass = 1 for each node m_expectedGravityForce .segment<3>(6) += g; // Mass = 1 for each node // Rayleigh damping force should be -(alpha.M + beta.K).(1...1)^t // with (alpha.M + beta.K) a diagonal matrix m_expectedRayleighDampingForce = -m_expectedRayleighDamping.diagonal(); } void addSprings() { std::shared_ptr element01 = std::make_shared(); element01->addNode(0); element01->addNode(1); m_massSpring->addSpring(element01); std::shared_ptr element12 = std::make_shared(); element12->addNode(1); element12->addNode(2); m_massSpring->addSpring(element12); } void addMasses() { m_massSpring->addMass(std::make_shared(1.0)); m_massSpring->addMass(std::make_shared(1.0)); m_massSpring->addMass(std::make_shared(1.0)); } void createLocalization() { m_localization = std::make_shared(); m_localization->setRepresentation(m_massSpring); m_localization->setLocalNode(0); } }; TEST_F(MassSpringRepresentationTests, Constructor) { ASSERT_NO_THROW({MassSpringRepresentation m("MassSpring");}); ASSERT_NO_THROW({MassSpringRepresentation* m = new MassSpringRepresentation("MassSpring"); delete m;}); ASSERT_NO_THROW({std::shared_ptr m = std::make_shared("MassSpring"); }); } TEST_F(MassSpringRepresentationTests, SetGetMethods) { using SurgSim::Math::setSubVector; using SurgSim::Physics::Mass; using SurgSim::Physics::LinearSpring; std::shared_ptr massSpring = std::make_shared("MassSpring"); // set/get InitialPose SurgSim::Math::RigidTransform3d poseRandom; SurgSim::Math::Quaterniond q(1.0, 2.0, 3.0, 4.0); SurgSim::Math::Vector3d t(1.0, 2.0, 3.0); q.normalize(); poseRandom = SurgSim::Math::makeRigidTransform(q, t); massSpring->setLocalPose(poseRandom); EXPECT_TRUE(massSpring->getLocalPose().isApprox(poseRandom)); EXPECT_TRUE(massSpring->getPose().isApprox(poseRandom)); // get{NumDof | NumMasses | NumSprings} initial value is 0 EXPECT_EQ(0u, massSpring->getNumDof()); EXPECT_EQ(0u, massSpring->getNumMasses()); EXPECT_EQ(0u, massSpring->getNumSprings()); // setInitialState is part of DeformableRepresentation...already tested ! std::shared_ptr state = std::make_shared(); state->setNumDof(3, 2); state->getPositions().setRandom(); massSpring->setInitialState(state); // addMass/getNumMasses/getMass std::shared_ptr mass0 = std::make_shared(1.0); massSpring->addMass(mass0); std::shared_ptr mass1 = std::make_shared(1.1); massSpring->addMass(mass1); EXPECT_EQ(2u, massSpring->getNumMasses()); EXPECT_EQ(mass0, massSpring->getMass(0)); EXPECT_EQ(*mass0, *massSpring->getMass(0)); EXPECT_EQ(mass1, massSpring->getMass(1)); EXPECT_EQ(*mass1, *massSpring->getMass(1)); // addSpring/getNumSprings/getSpring std::shared_ptr spring0 = std::make_shared(0, 1); spring0->setStiffness(1.0); spring0->setDamping(1.0); spring0->setRestLength(1.0); massSpring->addSpring(spring0); EXPECT_EQ(1u, massSpring->getNumSprings()); EXPECT_EQ(spring0, massSpring->getSpring(0)); EXPECT_EQ(*spring0, *massSpring->getSpring(0)); // getTotalMass EXPECT_DOUBLE_EQ(1.0 + 1.1, massSpring->getTotalMass()); // set/get RayleighDamping{Mass|Stiffness} massSpring->setRayleighDampingMass(5.5); EXPECT_DOUBLE_EQ(5.5, massSpring->getRayleighDampingMass()); massSpring->setRayleighDampingStiffness(5.4); EXPECT_DOUBLE_EQ(5.4, massSpring->getRayleighDampingStiffness()); } TEST_F(MassSpringRepresentationTests, BeforeUpdateTest) { const double dt = 1e-3; std::shared_ptr massSpring = std::make_shared("MassSpring"); // Missing initial state, masses and springs EXPECT_THROW(massSpring->beforeUpdate(dt), SurgSim::Framework::AssertionFailure); std::shared_ptr initialState = std::make_shared(); initialState->setNumDof(massSpring->getNumDofPerNode(), 3); massSpring->setInitialState(initialState); // Missing springs and 2 masses EXPECT_THROW(massSpring->beforeUpdate(dt), SurgSim::Framework::AssertionFailure); massSpring->addSpring(std::make_shared(0, 1)); // Missing 3 masses EXPECT_THROW(massSpring->beforeUpdate(dt), SurgSim::Framework::AssertionFailure); massSpring->addMass(std::make_shared(1.2)); // Missing 2 masses EXPECT_THROW(massSpring->beforeUpdate(dt), SurgSim::Framework::AssertionFailure); massSpring->addMass(std::make_shared(1.2)); // Missing 1 mass EXPECT_THROW(massSpring->beforeUpdate(dt), SurgSim::Framework::AssertionFailure); massSpring->addMass(std::make_shared(1.2)); EXPECT_NO_THROW(massSpring->beforeUpdate(dt)); } TEST_F(MassSpringRepresentationTests, TransformInitialStateTest) { using SurgSim::Math::Vector; const size_t numNodes = 2; const size_t numDofPerNode = m_massSpring->getNumDofPerNode(); const size_t numDof = numDofPerNode * numNodes; SurgSim::Math::RigidTransform3d initialPose; SurgSim::Math::Quaterniond q(1.0, 2.0, 3.0, 4.0); SurgSim::Math::Vector3d t(1.0, 2.0, 3.0); q.normalize(); initialPose = SurgSim::Math::makeRigidTransform(q, t); m_massSpring->setLocalPose(initialPose); std::shared_ptr initialState = std::make_shared(); initialState->setNumDof(numDofPerNode, numNodes); Vector x = Vector::LinSpaced(numDof, 1.0, static_cast(numDof)); Vector v = Vector::Ones(numDof); initialState->getPositions() = x; initialState->getVelocities() = v; m_massSpring->setInitialState(initialState); Vector expectedX = x, expectedV = v; for (size_t nodeId = 0; nodeId < numNodes; nodeId++) { expectedX.segment<3>(numDofPerNode * nodeId) = initialPose * x.segment<3>(numDofPerNode * nodeId); expectedV.segment<3>(numDofPerNode * nodeId) = initialPose.linear() * v.segment<3>(numDofPerNode * nodeId); } // Initialize the component => apply the pose to the initial state ASSERT_TRUE(m_massSpring->initialize(std::make_shared())); EXPECT_TRUE(m_massSpring->getInitialState()->getPositions().isApprox(expectedX)); EXPECT_TRUE(m_massSpring->getInitialState()->getVelocities().isApprox(expectedV)); } TEST_F(MassSpringRepresentationTests, ExternalForceAPITest) { using SurgSim::Math::Vector; using SurgSim::Math::SparseMatrix; std::shared_ptr massSpring = std::make_shared(); std::shared_ptr localization = std::make_shared(); std::shared_ptr wrongLocalizationType = std::make_shared(); // External force vector not initialized until the initial state has been set (it contains the #dof...) EXPECT_EQ(0, massSpring->getExternalForce().size()); EXPECT_EQ(0, massSpring->getExternalStiffness().size()); EXPECT_EQ(0, massSpring->getExternalDamping().size()); massSpring->setInitialState(m_initialState); massSpring->addMass(std::make_shared(1.0)); massSpring->addMass(std::make_shared(1.0)); massSpring->addSpring(std::make_shared(0, 1)); // Vector initialized (properly sized and zeroed) SparseMatrix zeroMatrix(static_cast(massSpring->getNumDof()), static_cast(massSpring->getNumDof())); zeroMatrix.setZero(); EXPECT_NE(0, massSpring->getExternalForce().size()); EXPECT_NE(0, massSpring->getExternalStiffness().size()); EXPECT_NE(0, massSpring->getExternalDamping().size()); EXPECT_EQ(massSpring->getNumDof(), massSpring->getExternalForce().size()); EXPECT_EQ(massSpring->getNumDof(), massSpring->getExternalStiffness().cols()); EXPECT_EQ(massSpring->getNumDof(), massSpring->getExternalStiffness().rows()); EXPECT_EQ(massSpring->getNumDof(), massSpring->getExternalDamping().cols()); EXPECT_EQ(massSpring->getNumDof(), massSpring->getExternalDamping().rows()); EXPECT_TRUE(massSpring->getExternalForce().isZero()); EXPECT_TRUE(massSpring->getExternalStiffness().isApprox(zeroMatrix)); EXPECT_TRUE(massSpring->getExternalDamping().isApprox(zeroMatrix)); localization->setRepresentation(massSpring); localization->setLocalNode(0); wrongLocalizationType->setRepresentation(massSpring); Vector F = Vector::LinSpaced(massSpring->getNumDofPerNode(), -3.12, 4.09); Matrix K = Matrix::Ones(massSpring->getNumDofPerNode(), massSpring->getNumDofPerNode()) * 0.34; Matrix D = K + Matrix::Identity(massSpring->getNumDofPerNode(), massSpring->getNumDofPerNode()); Vector expectedF = Vector::Zero(massSpring->getNumDof()); expectedF.segment(0, massSpring->getNumDofPerNode()) = F; Matrix expectedK = Matrix::Zero(massSpring->getNumDof(), massSpring->getNumDof()); expectedK.block(0, 0, massSpring->getNumDofPerNode(), massSpring->getNumDofPerNode()) = K; Matrix expectedD = Matrix::Zero(massSpring->getNumDof(), massSpring->getNumDof()); expectedD.block(0, 0, massSpring->getNumDofPerNode(), massSpring->getNumDofPerNode()) = D; ASSERT_THROW(massSpring->addExternalGeneralizedForce(nullptr, F, K, D), SurgSim::Framework::AssertionFailure); ASSERT_THROW(massSpring->addExternalGeneralizedForce(wrongLocalizationType, F, K, D), SurgSim::Framework::AssertionFailure); massSpring->addExternalGeneralizedForce(localization, F, K, D); EXPECT_FALSE(massSpring->getExternalForce().isZero()); EXPECT_FALSE(massSpring->getExternalStiffness().isApprox(zeroMatrix)); EXPECT_FALSE(massSpring->getExternalDamping().isApprox(zeroMatrix)); EXPECT_TRUE(massSpring->getExternalForce().isApprox(expectedF)); EXPECT_TRUE(massSpring->getExternalStiffness().isApprox(expectedK)); EXPECT_TRUE(massSpring->getExternalDamping().isApprox(expectedD)); massSpring->addExternalGeneralizedForce(localization, F, K, D); EXPECT_TRUE(massSpring->getExternalForce().isApprox(2.0 * expectedF)); EXPECT_TRUE(massSpring->getExternalStiffness().isApprox(2.0 * expectedK)); EXPECT_TRUE(massSpring->getExternalDamping().isApprox(2.0 * expectedD)); } TEST_F(MassSpringRepresentationTests, ComputesWithNoGravityAndNoDampingTest) { using SurgSim::Math::Vector3d; using SurgSim::Math::SparseMatrix; addMasses(); addSprings(); createLocalization(); // No gravity, no Rayleigh damping // computeF tests addFemElementsForce m_massSpring->setIsGravityEnabled(false); m_massSpring->initialize(std::make_shared()); m_massSpring->wakeUp(); { SCOPED_TRACE("Without external force"); testOdeEquationUpdate(m_massSpring, *m_initialState, m_expectedSpringsForce, m_expectedMass, m_expectedDamping, m_expectedStiffness); } size_t numDofPerNode = m_massSpring->getNumDofPerNode(); size_t numDof = m_massSpring->getNumDof(); { SCOPED_TRACE("With external force"); Vector externalLocalForce = Vector::LinSpaced(numDofPerNode, 1.1, 4.56); Matrix externalLocalK = Matrix::Ones(numDofPerNode, numDofPerNode); Matrix externalLocalD = 3.1 * externalLocalK + Matrix::Identity(numDofPerNode, numDofPerNode); Vector externalForce = Vector::Zero(numDof); Matrix externalK = Matrix::Zero(numDof, numDof); Matrix externalD = Matrix::Zero(numDof, numDof); externalForce.segment(0, numDofPerNode) = externalLocalForce; externalK.block(0, 0, numDofPerNode, numDofPerNode) = externalLocalK; externalD.block(0, 0, numDofPerNode, numDofPerNode) = externalLocalD; m_massSpring->addExternalGeneralizedForce(m_localization, externalLocalForce, externalLocalK, externalLocalD); testOdeEquationUpdate(m_massSpring, *m_initialState, m_expectedSpringsForce + externalForce, m_expectedMass, m_expectedDamping + externalD, m_expectedStiffness + externalK); } } TEST_F(MassSpringRepresentationTests, ComputesWithNoGravityAndDampingTest) { using SurgSim::Math::Vector3d; using SurgSim::Math::SparseMatrix; addMasses(); addSprings(); createLocalization(); // No gravity, Rayleigh damping // computeF tests addFemElementsForce and addRayleighDampingForce m_massSpring->setIsGravityEnabled(false); m_massSpring->setRayleighDampingMass(m_rayleighDampingMassParameter); m_massSpring->setRayleighDampingStiffness(m_rayleighDampingStiffnessParameter); m_massSpring->initialize(std::make_shared()); m_massSpring->wakeUp(); SurgSim::Math::Vector expectedForce = m_expectedSpringsForce + m_expectedRayleighDampingForce; { SCOPED_TRACE("Without external force"); testOdeEquationUpdate(m_massSpring, *m_initialState, expectedForce, m_expectedMass, m_expectedDamping + m_expectedRayleighDamping, m_expectedStiffness); } size_t numDofPerNode = m_massSpring->getNumDofPerNode(); size_t numDof = m_massSpring->getNumDof(); { SCOPED_TRACE("With external force"); Vector externalLocalForce = Vector::LinSpaced(numDofPerNode, 1.1, 4.56); Matrix externalLocalK = Matrix::Ones(numDofPerNode, numDofPerNode); Matrix externalLocalD = 3.1 * externalLocalK + Matrix::Identity(numDofPerNode, numDofPerNode); Vector externalForce = Vector::Zero(numDof); Matrix externalK = Matrix::Zero(numDof, numDof); Matrix externalD = Matrix::Zero(numDof, numDof); externalForce.segment(0, numDofPerNode) = externalLocalForce; externalK.block(0, 0, numDofPerNode, numDofPerNode) = externalLocalK; externalD.block(0, 0, numDofPerNode, numDofPerNode) = externalLocalD; m_massSpring->addExternalGeneralizedForce(m_localization, externalLocalForce, externalLocalK, externalLocalD); testOdeEquationUpdate(m_massSpring, *m_initialState, expectedForce + externalForce, m_expectedMass, m_expectedDamping + m_expectedRayleighDamping + externalD, m_expectedStiffness + externalK); } } TEST_F(MassSpringRepresentationTests, ComputesWithGravityAndNoDampingTest) { using SurgSim::Math::Vector3d; using SurgSim::Math::SparseMatrix; addMasses(); addSprings(); createLocalization(); // Gravity, no Rayleigh damping // computeF tests addFemElementsForce and addGravityForce m_massSpring->setIsGravityEnabled(true); m_massSpring->initialize(std::make_shared()); m_massSpring->wakeUp(); SurgSim::Math::Vector expectedForce = m_expectedSpringsForce + m_expectedGravityForce; { SCOPED_TRACE("Without external force"); testOdeEquationUpdate(m_massSpring, *m_initialState, expectedForce, m_expectedMass, m_expectedDamping, m_expectedStiffness); } size_t numDofPerNode = m_massSpring->getNumDofPerNode(); size_t numDof = m_massSpring->getNumDof(); { SCOPED_TRACE("With external force"); Vector externalLocalForce = Vector::LinSpaced(numDofPerNode, 1.1, 4.56); Matrix externalLocalK = Matrix::Ones(numDofPerNode, numDofPerNode); Matrix externalLocalD = 3.1 * externalLocalK + Matrix::Identity(numDofPerNode, numDofPerNode); Vector externalForce = Vector::Zero(numDof); Matrix externalK = Matrix::Zero(numDof, numDof); Matrix externalD = Matrix::Zero(numDof, numDof); externalForce.segment(0, numDofPerNode) = externalLocalForce; externalK.block(0, 0, numDofPerNode, numDofPerNode) = externalLocalK; externalD.block(0, 0, numDofPerNode, numDofPerNode) = externalLocalD; m_massSpring->addExternalGeneralizedForce(m_localization, externalLocalForce, externalLocalK, externalLocalD); testOdeEquationUpdate(m_massSpring, *m_initialState, expectedForce + externalForce, m_expectedMass, m_expectedDamping + externalD, m_expectedStiffness + externalK); } } TEST_F(MassSpringRepresentationTests, ComputesWithGravityAndDampingTest) { using SurgSim::Math::Vector3d; using SurgSim::Math::SparseMatrix; addMasses(); addSprings(); createLocalization(); // Gravity, Rayleigh damping // computeF tests addFemElementsForce, addRayleighDampingForce and addGravityForce m_massSpring->setIsGravityEnabled(true); m_massSpring->setRayleighDampingMass(m_rayleighDampingMassParameter); m_massSpring->setRayleighDampingStiffness(m_rayleighDampingStiffnessParameter); m_massSpring->initialize(std::make_shared()); m_massSpring->wakeUp(); SurgSim::Math::Vector expectedForce = m_expectedSpringsForce + m_expectedRayleighDampingForce + m_expectedGravityForce; { SCOPED_TRACE("Without external force"); testOdeEquationUpdate(m_massSpring, *m_initialState, expectedForce, m_expectedMass, m_expectedDamping + m_expectedRayleighDamping, m_expectedStiffness); } size_t numDofPerNode = m_massSpring->getNumDofPerNode(); size_t numDof = m_massSpring->getNumDof(); { SCOPED_TRACE("With external force"); Vector externalLocalForce = Vector::LinSpaced(numDofPerNode, 1.1, 4.56); Matrix externalLocalK = Matrix::Ones(numDofPerNode, numDofPerNode); Matrix externalLocalD = 3.1 * externalLocalK + Matrix::Identity(numDofPerNode, numDofPerNode); Vector externalForce = Vector::Zero(numDof); Matrix externalK = Matrix::Zero(numDof, numDof); Matrix externalD = Matrix::Zero(numDof, numDof); externalForce.segment(0, numDofPerNode) = externalLocalForce; externalK.block(0, 0, numDofPerNode, numDofPerNode) = externalLocalK; externalD.block(0, 0, numDofPerNode, numDofPerNode) = externalLocalD; m_massSpring->addExternalGeneralizedForce(m_localization, externalLocalForce, externalLocalK, externalLocalD); testOdeEquationUpdate(m_massSpring, *m_initialState, expectedForce + externalForce, m_expectedMass, m_expectedDamping + m_expectedRayleighDamping + externalD, m_expectedStiffness + externalK); } } opensurgsim-0.7.0/SurgSim/Physics/UnitTests/MassTest.cpp000066400000000000000000000031241277777236100233400ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include "SurgSim/Physics/Mass.h" #include "SurgSim/Math/Vector.h" using SurgSim::Physics::Mass; using SurgSim::Math::Vector3d; TEST(MassTests, Constructor) { ASSERT_NO_THROW({Mass m(1.3);}); ASSERT_NO_THROW({Mass* m = new Mass(1.3); delete m;}); ASSERT_NO_THROW({std::shared_ptr m = std::make_shared(0.3);}); } TEST(MassTests, SetGetMethodsTest) { Mass m(1.3); EXPECT_DOUBLE_EQ(1.3, m.getMass()); m.setMass(0.0); EXPECT_DOUBLE_EQ(0.0, m.getMass()); m.setMass(-1.1); EXPECT_DOUBLE_EQ(-1.1, m.getMass()); m.setMass(13.45); EXPECT_DOUBLE_EQ(13.45, m.getMass()); } TEST(MassTests, ComparisonTests) { Mass m1(1.3), m2, m3(1.3); EXPECT_FALSE(m1 == m2); EXPECT_TRUE(m1 == m3); EXPECT_FALSE(m2 == m3); m2 = m1; EXPECT_TRUE(m1 == m2); EXPECT_TRUE(m1 == m3); EXPECT_TRUE(m2 == m3); m3.setMass(m3.getMass() + 3.4); EXPECT_TRUE(m1 == m2); EXPECT_FALSE(m1 == m3); EXPECT_FALSE(m2 == m3); } opensurgsim-0.7.0/SurgSim/Physics/UnitTests/MockObjects.cpp000066400000000000000000000434461277777236100240130ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Physics/UnitTests/MockObjects.h" #include "SurgSim/Math/Shape.h" #include "SurgSim/Physics/FemPlyReaderDelegate.h" namespace SurgSim { namespace Physics { SURGSIM_REGISTER(SurgSim::Framework::Component, SurgSim::Physics::MockRepresentation, MockRepresentation); SURGSIM_REGISTER(SurgSim::Framework::Component, SurgSim::Physics::MockDeformableRepresentation, MockDeformableRepresentation); MockRepresentation::MockRepresentation(const std::string& name) : Representation(name), m_preUpdateCount(0), m_updateCount(0), m_postUpdateCount(0) { } MockRepresentation::~MockRepresentation() { } void MockRepresentation::beforeUpdate(double dt) { m_preUpdateCount++; } void MockRepresentation::update(double dt) { m_updateCount++; } void MockRepresentation::afterUpdate(double dt) { m_postUpdateCount++; } int MockRepresentation::getPreUpdateCount() const { return m_preUpdateCount; } int MockRepresentation::getUpdateCount() const { return m_updateCount; } int MockRepresentation::getPostUpdateCount() const { return m_postUpdateCount; } std::shared_ptr MockRepresentation::createLocalization( const SurgSim::DataStructures::Location& location) { return std::make_shared(); } MockRigidRepresentation::MockRigidRepresentation() : RigidRepresentation("MockRigidRepresentation") { } RigidState& MockRigidRepresentation::getInitialState() { return m_initialState; } RigidState& MockRigidRepresentation::getCurrentState() { return m_currentState; } RigidState& MockRigidRepresentation::getPreviousState() { return m_previousState; } MockFixedRepresentation::MockFixedRepresentation() : FixedRepresentation("MockFixedRepresentation") { } RigidState& MockFixedRepresentation::getInitialState() { return m_initialState; } RigidState& MockFixedRepresentation::getCurrentState() { return m_currentState; } RigidState& MockFixedRepresentation::getPreviousState() { return m_previousState; } MockDeformableRepresentation::MockDeformableRepresentation(const std::string& name) : SurgSim::Physics::DeformableRepresentation(name) { this->m_numDofPerNode = 3; m_f = Vector::LinSpaced(3, 1.0, 3.0); m_M.resize(3, 3); m_M.setIdentity(); m_D.resize(3, 3); m_D.setIdentity(); m_K.resize(3, 3); m_K.setIdentity(); } void MockDeformableRepresentation::addExternalGeneralizedForce(std::shared_ptr localization, const Math::Vector& generalizedForce, const Math::Matrix& K, const Math::Matrix& D) { std::shared_ptr loc = std::dynamic_pointer_cast(localization); m_externalGeneralizedForce.segment<3>(3 * loc->getLocalNode()) += generalizedForce; Math::addSubMatrix(K, static_cast(loc->getLocalNode()), static_cast(loc->getLocalNode()), &m_externalGeneralizedStiffness, true); Math::addSubMatrix(D, static_cast(loc->getLocalNode()), static_cast(loc->getLocalNode()), &m_externalGeneralizedDamping, true); m_hasExternalGeneralizedForce = true; } void MockDeformableRepresentation::computeF(const OdeState& state) { } void MockDeformableRepresentation::computeM(const OdeState& state) { } void MockDeformableRepresentation::computeD(const OdeState& state) { } void MockDeformableRepresentation::computeK(const OdeState& state) { } void MockDeformableRepresentation::computeFMDK(const OdeState& state) { } void MockDeformableRepresentation::transformState(std::shared_ptr state, const RigidTransform3d& transform) { using SurgSim::Math::setSubVector; using SurgSim::Math::getSubVector; Vector& x = state->getPositions(); Vector& v = state->getVelocities(); for (size_t nodeId = 0; nodeId < state->getNumNodes(); nodeId++) { Vector3d xi = getSubVector(x, nodeId, 3); Vector3d xiTransformed = transform * xi; setSubVector(xiTransformed, nodeId, 3, &x); Vector3d vi = getSubVector(v, nodeId, 3); Vector3d viTransformed = transform.linear() * vi; setSubVector(viTransformed, nodeId, 3, &v); } } MockSpring::MockSpring() : SurgSim::Physics::Spring() { m_F = Vector::LinSpaced(6, 1.0, 6.0); m_D.resize(6, 6); m_D.setIdentity(); m_D *= 2.0; m_K.resize(6, 6); m_K.setIdentity(); m_K *= 3.0; } void MockSpring::addNode(size_t nodeId) { this->m_nodeIds.push_back(nodeId); } void MockSpring::addForce(const OdeState& state, Vector* F, double scale) { SurgSim::Math::addSubVector(scale * m_F, m_nodeIds, 3, F); } void MockSpring::addDamping(const OdeState& state, SparseMatrix* D, double scale) { Matrix scaledDense(m_D.rows(), m_D.cols()); scaledDense = scale * m_D; int index1 = 0; for (auto nodeId1 : m_nodeIds) { int index2 = 0; for (auto nodeId2 : m_nodeIds) { Math::addSubMatrix(scaledDense.block(3 * index1, 3 * index2, 3, 3), static_cast(nodeId1), static_cast(nodeId2), D, false); ++index2; } ++index1; } } void MockSpring::addStiffness(const SurgSim::Math::OdeState& state, SurgSim::Math::SparseMatrix* K, double scale) { Matrix scaledDense(m_K.rows(), m_K.cols()); scaledDense = scale * m_K; int index1 = 0; for (auto nodeId1 : m_nodeIds) { int index2 = 0; for (auto nodeId2 : m_nodeIds) { Math::addSubMatrix(scaledDense.block(3 * index1, 3 * index2, 3, 3), static_cast(nodeId1), static_cast(nodeId2), K, false); ++index2; } ++index1; } } void MockSpring::addFDK(const OdeState& state, Vector* f, SparseMatrix* D, SparseMatrix* K) { addForce(state, f); addDamping(state, D); addStiffness(state, K); } void MockSpring::addMatVec(const OdeState& state, double alphaD, double alphaK, const Vector& x, Vector* F) { Vector xLocal(3 * m_nodeIds.size()), fLocal; SurgSim::Math::getSubVector(x, m_nodeIds, 3, &xLocal); fLocal = (alphaD * m_D + alphaK * m_K) * xLocal; SurgSim::Math::addSubVector(fLocal, m_nodeIds, 3, F); } MockMassSpring::MockMassSpring(const std::string& name, const SurgSim::Math::RigidTransform3d& pose, size_t numNodes, std::vector nodeBoundaryConditions, double totalMass, double rayleighDampingMass, double rayleighDampingStiffness, double springStiffness, double springDamping, SurgSim::Math::IntegrationScheme integrationScheme) : SurgSim::Physics::MassSpringRepresentation(name) { using SurgSim::Math::getSubVector; using SurgSim::Math::setSubVector; using SurgSim::Physics::Mass; using SurgSim::Physics::LinearSpring; // Note: setLocalPose MUST be called before WakeUp to be effective ! setLocalPose(pose); std::shared_ptr state; state = std::make_shared(); state->setNumDof(3, numNodes); for (size_t i = 0; i < numNodes; i++) { Vector3d p(static_cast(i) / static_cast(numNodes), 0, 0); setSubVector(p, i, 3, &state->getPositions()); addMass(std::make_shared(totalMass / numNodes)); } for (auto bc = std::begin(nodeBoundaryConditions); bc != std::end(nodeBoundaryConditions); bc++) { state->addBoundaryCondition(*bc); } for (size_t i = 0; i < numNodes - 1; i++) { std::shared_ptr spring = std::make_shared(i, i + 1); spring->setDamping(springDamping); spring->setStiffness(springStiffness); const Vector3d& xi = getSubVector(state->getPositions(), i, 3); const Vector3d& xj = getSubVector(state->getPositions(), i + 1, 3); spring->setRestLength((xj - xi).norm()); addSpring(spring); } setInitialState(state); setIntegrationScheme(integrationScheme); setRayleighDampingMass(rayleighDampingMass); setRayleighDampingStiffness(rayleighDampingStiffness); } MockMassSpring::~MockMassSpring() { } const Vector3d& MockMassSpring::getGravityVector() const { return getGravity(); } void MockMassSpring::clearFMDK() { m_f.setZero(); SurgSim::Math::clearMatrix(&m_M); SurgSim::Math::clearMatrix(&m_D); SurgSim::Math::clearMatrix(&m_K); } MockFemElement::MockFemElement() : FemElement() { initializeMembers(); } MockFemElement::MockFemElement(std::shared_ptr elementData) : FemElement() { initializeMembers(); m_nodeIds.assign(elementData->nodeIds.begin(), elementData->nodeIds.end()); } void MockFemElement::addNode(size_t nodeId) { this->m_nodeIds.push_back(nodeId); } double MockFemElement::getVolume(const OdeState& state) const { return 1; } Vector MockFemElement::computeCartesianCoordinate(const OdeState& state, const Vector& barycentricCoordinate) const { SURGSIM_ASSERT(getNumNodes() == static_cast(barycentricCoordinate.size())); Vector result = Vector::Zero(3); for (size_t node = 0; node < getNumNodes(); node++) { result += state.getPosition(getNodeId(node)) * barycentricCoordinate[node]; } return result; } Vector MockFemElement::computeNaturalCoordinate(const OdeState& state, const Vector& globalCoordinate) const { return SurgSim::Math::Vector3d::Zero(); } void MockFemElement::initializeMembers() { m_isInitialized = false; m_useDamping = true; setNumDofPerNode(3); } void MockFemElement::doUpdateFMDK(const Math::OdeState& state, int options) { } void MockFemElement::initialize(const OdeState& state) { FemElement::initialize(state); const size_t numDof = 3 * m_nodeIds.size(); m_f = Vector::LinSpaced(numDof, 1.0, static_cast(numDof)); m_M.setIdentity(); m_D.setIdentity(); m_D *= 2.0; m_K.setIdentity(); m_K *= 3.0; m_isInitialized = true; } bool MockFemElement::isInitialized() const { return m_isInitialized; } MockFemRepresentation::MockFemRepresentation(const std::string& name) : FemRepresentation(name), m_setInitialStateCalled(false) { this->m_numDofPerNode = 3; } MockFemRepresentation::~MockFemRepresentation() { } void MockFemRepresentation::setInitialState(std::shared_ptr initialState) { FemRepresentation::setInitialState(initialState); m_setInitialStateCalled = true; } void MockFemRepresentation::loadFem(const std::string &filename) { } void MockFemRepresentation::addExternalGeneralizedForce(std::shared_ptr localization, const SurgSim::Math::Vector& generalizedForce, const SurgSim::Math::Matrix& K, const SurgSim::Math::Matrix& D) { std::shared_ptr loc = std::dynamic_pointer_cast(localization); size_t numDofPerNode = getNumDofPerNode(); m_externalGeneralizedForce.segment(numDofPerNode * loc->getLocalNode(), numDofPerNode) += generalizedForce; SurgSim::Math::addSubMatrix(K, static_cast(loc->getLocalNode()), static_cast(loc->getLocalNode()), &m_externalGeneralizedStiffness, true); SurgSim::Math::addSubMatrix(D, static_cast(loc->getLocalNode()), static_cast(loc->getLocalNode()), &m_externalGeneralizedDamping, true); m_hasExternalGeneralizedForce = true; } std::shared_ptr MockFemRepresentation::getDelegate() { return nullptr; } const std::vector& MockFemRepresentation::getMassPerNode() const { return m_massPerNode; } void MockFemRepresentation::clearFMDK() { m_f.setZero(); SurgSim::Math::clearMatrix(&m_M); SurgSim::Math::clearMatrix(&m_D); SurgSim::Math::clearMatrix(&m_K); } void MockFemRepresentation::transformState(std::shared_ptr state, const RigidTransform3d& transform) { } bool MockFemRepresentation::hasSetInitialStateBeenCalled() { return m_setInitialStateCalled; } SurgSim::Math::Matrix MockFemRepresentationValidComplianceWarping::getNodeTransformation(const SurgSim::Math::OdeState& state, size_t nodeId) { return SurgSim::Math::Matrix::Identity(getNumDofPerNode(), getNumDofPerNode()); } MockFem1DRepresentation::MockFem1DRepresentation(const std::string& name) : SurgSim::Physics::Fem1DRepresentation(name) { } bool MockFem1DRepresentation::doInitialize() { return Fem1DRepresentation::doInitialize(); } double MockFem1DRepresentation::getMassPerNode(size_t nodeId) { return m_massPerNode[nodeId]; } MockFem2DRepresentation::MockFem2DRepresentation(const std::string& name) : SurgSim::Physics::Fem2DRepresentation(name) { } double MockFem2DRepresentation::getMassPerNode(size_t nodeId) { return m_massPerNode[nodeId]; } MockFixedConstraintFixedPoint::MockFixedConstraintFixedPoint() : ConstraintImplementation() { } MockFixedConstraintFixedPoint::~MockFixedConstraintFixedPoint() { } SurgSim::Physics::ConstraintType MockFixedConstraintFixedPoint::getConstraintType() const { return SurgSim::Physics::FIXED_3DPOINT; } size_t MockFixedConstraintFixedPoint::doGetNumDof() const { return 3; } void MockFixedConstraintFixedPoint::doBuild(double dt, const ConstraintData& data, const std::shared_ptr& localization, MlcpPhysicsProblem* mlcp, size_t indexOfRepresentation, size_t indexOfConstraint, ConstraintSideSign sign) { } MockRigidConstraintFixedPoint::MockRigidConstraintFixedPoint() : ConstraintImplementation() { } MockRigidConstraintFixedPoint::~MockRigidConstraintFixedPoint() { } SurgSim::Physics::ConstraintType MockRigidConstraintFixedPoint::getConstraintType() const { return SurgSim::Physics::FIXED_3DPOINT; } size_t MockRigidConstraintFixedPoint::doGetNumDof() const { return 3; } void MockRigidConstraintFixedPoint::doBuild(double dt, const ConstraintData& data, const std::shared_ptr& localization, MlcpPhysicsProblem* mlcp, size_t indexOfRepresentation, size_t indexOfConstraint, ConstraintSideSign sign) { } MockLocalization::MockLocalization() : Localization() { } MockLocalization::MockLocalization(std::shared_ptr representation) : Localization(representation) { } Vector3d MockLocalization::doCalculatePosition(double time) const { return SurgSim::Math::Vector3d::Zero(); } Vector3d MockLocalization::doCalculateVelocity(double time) const { return SurgSim::Math::Vector3d::Zero(); } SurgSim::Physics::ConstraintType MockConstraintImplementation::getConstraintType() const { return SurgSim::Physics::FIXED_3DPOINT; } size_t MockConstraintImplementation::doGetNumDof() const { return 1; } void MockConstraintImplementation::doBuild(double dt, const ConstraintData& data, const std::shared_ptr& localization, MlcpPhysicsProblem* mlcp, size_t indexOfRepresentation, size_t indexOfConstraint, ConstraintSideSign sign) { } MockVirtualToolCoupler::MockVirtualToolCoupler() : VirtualToolCoupler("Mock Virtual Tool Coupler") { } const SurgSim::DataStructures::OptionalValue& MockVirtualToolCoupler::getOptionalLinearStiffness() const { return VirtualToolCoupler::getOptionalLinearStiffness(); } const SurgSim::DataStructures::OptionalValue& MockVirtualToolCoupler::getOptionalLinearDamping() const { return VirtualToolCoupler::getOptionalLinearDamping(); } const SurgSim::DataStructures::OptionalValue& MockVirtualToolCoupler::getOptionalAngularStiffness() const { return VirtualToolCoupler::getOptionalAngularStiffness(); } const SurgSim::DataStructures::OptionalValue& MockVirtualToolCoupler::getOptionalAngularDamping() const { return VirtualToolCoupler::getOptionalAngularDamping(); } const SurgSim::DataStructures::OptionalValue& MockVirtualToolCoupler::getOptionalAttachmentPoint() const { return VirtualToolCoupler::getOptionalAttachmentPoint(); } void MockVirtualToolCoupler::setOptionalLinearStiffness(const SurgSim::DataStructures::OptionalValue& val) { VirtualToolCoupler::setOptionalLinearStiffness(val); } void MockVirtualToolCoupler::setOptionalLinearDamping(const SurgSim::DataStructures::OptionalValue& val) { VirtualToolCoupler::setOptionalLinearDamping(val); } void MockVirtualToolCoupler::setOptionalAngularStiffness(const SurgSim::DataStructures::OptionalValue& val) { VirtualToolCoupler::setOptionalAngularStiffness(val); } void MockVirtualToolCoupler::setOptionalAngularDamping(const SurgSim::DataStructures::OptionalValue& val) { VirtualToolCoupler::setOptionalAngularDamping(val); } void MockVirtualToolCoupler::setOptionalAttachmentPoint( const SurgSim::DataStructures::OptionalValue& val) { VirtualToolCoupler::setOptionalAttachmentPoint(val); } const SurgSim::DataStructures::DataGroup& MockVirtualToolCoupler::getOutputData() const { return m_outputData; } MockCollisionRepresentation::MockCollisionRepresentation(const std::string& name) : SurgSim::Collision::Representation(name), m_numberOfTimesUpdateCalled(0) {} int MockCollisionRepresentation::getShapeType() const { return -1; } const std::shared_ptr MockCollisionRepresentation::getShape() const { return nullptr; } void MockCollisionRepresentation::update(const double& dt) { ++m_numberOfTimesUpdateCalled; } /// \return The number of times update method has been invoked. int MockCollisionRepresentation::getNumberOfTimesUpdateCalled() const { return m_numberOfTimesUpdateCalled; } MockComputation::MockComputation(bool doCopyState) : Computation(doCopyState) { } std::shared_ptr MockComputation::doUpdate(const double& dt, const std::shared_ptr& state) { return state; } }; // Physics }; // SurgSim opensurgsim-0.7.0/SurgSim/Physics/UnitTests/MockObjects.h000066400000000000000000000373741277777236100234630ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_UNITTESTS_MOCKOBJECTS_H #define SURGSIM_PHYSICS_UNITTESTS_MOCKOBJECTS_H #include "SurgSim/Collision/Representation.h" #include "SurgSim/Framework/ObjectFactory.h" #include "SurgSim/Framework/Macros.h" #include "SurgSim/Math/Matrix.h" #include "SurgSim/Math/OdeSolver.h" #include "SurgSim/Math/OdeState.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/Constraint.h" #include "SurgSim/Physics/ConstraintImplementation.h" #include "SurgSim/Physics/Computation.h" #include "SurgSim/Physics/DeformableRepresentation.h" #include "SurgSim/Physics/Fem1DRepresentation.h" #include "SurgSim/Physics/Fem2DRepresentation.h" #include "SurgSim/Physics/Fem3DRepresentation.h" #include "SurgSim/Physics/FemElement.h" #include "SurgSim/Physics/FemRepresentation.h" #include "SurgSim/Physics/FixedRepresentation.h" #include "SurgSim/Physics/LinearSpring.h" #include "SurgSim/Physics/Localization.h" #include "SurgSim/Physics/Mass.h" #include "SurgSim/Physics/MassSpringLocalization.h" #include "SurgSim/Physics/MassSpringRepresentation.h" #include "SurgSim/Physics/Representation.h" #include "SurgSim/Physics/RigidRepresentation.h" #include "SurgSim/Physics/VirtualToolCoupler.h" namespace SurgSim { namespace Physics { using SurgSim::Math::Matrix; using SurgSim::Math::OdeSolver; using SurgSim::Math::OdeState; using SurgSim::Math::RigidTransform3d; using SurgSim::Math::SparseMatrix; using SurgSim::Math::Vector; using SurgSim::Math::Vector3d; class MockRepresentation : public Representation { protected: int m_preUpdateCount; int m_updateCount; int m_postUpdateCount; public: explicit MockRepresentation(const std::string& name = "MockRepresention"); virtual ~MockRepresentation(); SURGSIM_CLASSNAME(SurgSim::Physics::MockRepresentation); /// Preprocessing done before the update call /// \param dt The time step (in seconds) void beforeUpdate(double dt) override; /// Update the representation state to the current time step /// \param dt The time step (in seconds) void update(double dt) override; /// Postprocessing done after the update call /// \param dt The time step (in seconds) void afterUpdate(double dt) override; int getPreUpdateCount() const; int getUpdateCount() const; int getPostUpdateCount() const; std::shared_ptr createLocalization(const SurgSim::DataStructures::Location& location) override; }; class MockRigidRepresentation : public RigidRepresentation { public: MockRigidRepresentation(); // Non constant access to the states RigidState& getInitialState(); RigidState& getCurrentState(); RigidState& getPreviousState(); }; class MockFixedRepresentation : public FixedRepresentation { public: MockFixedRepresentation(); // Non constant access to the states RigidState& getInitialState(); RigidState& getCurrentState(); RigidState& getPreviousState(); }; class MockDeformableLocalization : public SurgSim::Physics::Localization { public: MockDeformableLocalization(){} explicit MockDeformableLocalization(std::shared_ptr representation) : Localization() { setRepresentation(representation); } virtual ~MockDeformableLocalization(){} void setLocalNode(size_t nodeID) { m_nodeID = nodeID; } const size_t& getLocalNode() const { return m_nodeID; } bool isValidRepresentation(std::shared_ptr representation) override { std::shared_ptr defRepresentation = std::dynamic_pointer_cast(representation); // Allows to reset the representation to nullptr ... return (defRepresentation != nullptr || representation == nullptr); } private: SurgSim::Math::Vector3d doCalculatePosition(double time) const override { std::shared_ptr defRepresentation = std::static_pointer_cast(getRepresentation()); SURGSIM_ASSERT(defRepresentation != nullptr) << "Deformable Representation is null, it was probably not" << " initialized"; SURGSIM_ASSERT((0.0 <= time) && (time <= 1.0)) << "Time must be between 0.0 and 1.0 inclusive"; const SurgSim::Math::Vector3d& currentPoint = defRepresentation->getCurrentState()->getPosition(m_nodeID); const SurgSim::Math::Vector3d& previousPoint = defRepresentation->getPreviousState()->getPosition(m_nodeID); return SurgSim::Math::interpolate(previousPoint, currentPoint, time); } SurgSim::Math::Vector3d doCalculateVelocity(double time) const override { std::shared_ptr defRepresentation = std::static_pointer_cast(getRepresentation()); SURGSIM_ASSERT(defRepresentation != nullptr) << "Deformable Representation is null, it was probably not" << " initialized"; SURGSIM_ASSERT((0.0 <= time) && (time <= 1.0)) << "Time must be between 0.0 and 1.0 inclusive"; const SurgSim::Math::Vector3d& currentVelocity = defRepresentation->getCurrentState()->getVelocity(m_nodeID); const SurgSim::Math::Vector3d& previousVelocity = defRepresentation->getPreviousState()->getVelocity(m_nodeID); return SurgSim::Math::interpolate(previousVelocity, currentVelocity, time); } size_t m_nodeID; }; class MockDeformableRepresentation : public SurgSim::Physics::DeformableRepresentation { public: explicit MockDeformableRepresentation(const std::string& name = "MockDeformableRepresentation"); SURGSIM_CLASSNAME(SurgSim::Physics::MockDeformableRepresentation); void addExternalGeneralizedForce(std::shared_ptr localization, const SurgSim::Math::Vector& generalizedForce, const SurgSim::Math::Matrix& K, const SurgSim::Math::Matrix& D) override; protected: void transformState(std::shared_ptr state, const SurgSim::Math::RigidTransform3d& transform) override; void computeF(const OdeState& state) override; void computeM(const OdeState& state) override; void computeD(const OdeState& state) override; void computeK(const OdeState& state) override; void computeFMDK(const OdeState& state) override; }; class MockSpring : public SurgSim::Physics::Spring { public: MockSpring(); void addNode(size_t nodeId); void addForce(const OdeState& state, Vector* F, double scale = 1.0) override; void addDamping(const OdeState& state, SparseMatrix* D, double scale = 1.0) override; void addStiffness(const SurgSim::Math::OdeState& state, SurgSim::Math::SparseMatrix* K, double scale = 1.0) override; void addFDK(const OdeState& state, Vector* f, SparseMatrix* D, SparseMatrix* K) override; void addMatVec(const OdeState& state, double alphaD, double alphaK, const Vector& x, Vector* F) override; private: Vector m_F; SparseMatrix m_D, m_K; }; class MockMassSpring : public SurgSim::Physics::MassSpringRepresentation { public: MockMassSpring() : MassSpringRepresentation("MassSpring") { } MockMassSpring(const std::string& name, const SurgSim::Math::RigidTransform3d& pose, size_t numNodes, std::vector nodeBoundaryConditions, double totalMass, double rayleighDampingMass, double rayleighDampingStiffness, double springStiffness, double springDamping, SurgSim::Math::IntegrationScheme integrationScheme); virtual ~MockMassSpring(); const Vector3d& getGravityVector() const; const SurgSim::Math::Vector& getExternalForce() const { return m_externalGeneralizedForce; } const SurgSim::Math::SparseMatrix& getExternalStiffness() const { return m_externalGeneralizedStiffness; } const SurgSim::Math::SparseMatrix& getExternalDamping() const { return m_externalGeneralizedDamping; } void clearFMDK(); }; class MockFemElement : public FemElement { public: MockFemElement(); explicit MockFemElement(std::shared_ptr elementData); void addNode(size_t nodeId); double getVolume(const OdeState& state) const override; Vector computeCartesianCoordinate(const OdeState& state, const Vector& barycentricCoordinate) const override; Vector computeNaturalCoordinate(const SurgSim::Math::OdeState& state, const Vector& globalCoordinate) const override; void initialize(const SurgSim::Math::OdeState& state) override; bool isInitialized() const; private: void initializeMembers(); void doUpdateFMDK(const Math::OdeState& state, int options) override; bool m_isInitialized; }; // Concrete class for testing class MockFemRepresentation : public FemRepresentation { public: /// Constructor /// \param name The name of the FemRepresentation explicit MockFemRepresentation(const std::string& name); /// Destructor virtual ~MockFemRepresentation(); void setInitialState(std::shared_ptr initialState) override; void loadFem(const std::string& filename) override; void addExternalGeneralizedForce(std::shared_ptr localization, const SurgSim::Math::Vector& generalizedForce, const SurgSim::Math::Matrix& K, const SurgSim::Math::Matrix& D) override; std::shared_ptr getDelegate(); const std::vector& getMassPerNode() const; void clearFMDK(); bool hasSetInitialStateBeenCalled(); protected: /// Transform a state using a given transformation /// \param[in,out] state The state to be transformed /// \param transform The transformation to apply void transformState(std::shared_ptr state, const RigidTransform3d& transform) override; // Flag to be set when setInitialState of this class is called. bool m_setInitialStateCalled; }; class MockFemRepresentationValidComplianceWarping : public MockFemRepresentation { public: explicit MockFemRepresentationValidComplianceWarping(const std::string& name) : MockFemRepresentation(name) {} protected: SurgSim::Math::Matrix getNodeTransformation(const SurgSim::Math::OdeState& state, size_t nodeId) override; }; class MockFem1DRepresentation : public SurgSim::Physics::Fem1DRepresentation { public: explicit MockFem1DRepresentation(const std::string& name); bool doInitialize() override; double getMassPerNode(size_t nodeId); }; class MockFem2DRepresentation : public SurgSim::Physics::Fem2DRepresentation { public: explicit MockFem2DRepresentation(const std::string& name); double getMassPerNode(size_t nodeId); }; class MockFixedConstraintFixedPoint : public ConstraintImplementation { public: MockFixedConstraintFixedPoint(); virtual ~MockFixedConstraintFixedPoint(); SurgSim::Physics::ConstraintType getConstraintType() const override; private: size_t doGetNumDof() const override; void doBuild(double dt, const ConstraintData& data, const std::shared_ptr& localization, MlcpPhysicsProblem* mlcp, size_t indexOfRepresentation, size_t indexOfConstraint, ConstraintSideSign sign) override; }; class MockRigidConstraintFixedPoint : public ConstraintImplementation { public: MockRigidConstraintFixedPoint(); virtual ~MockRigidConstraintFixedPoint(); SurgSim::Physics::ConstraintType getConstraintType() const override; private: size_t doGetNumDof() const override; void doBuild(double dt, const ConstraintData& data, const std::shared_ptr& localization, MlcpPhysicsProblem* mlcp, size_t indexOfRepresentation, size_t indexOfConstraint, ConstraintSideSign sign) override; }; template class MockDescendent : public Base { public: MockDescendent() : Base() {} explicit MockDescendent(const std::string& name) : Base(name) {} }; class MockLocalization : public Localization { public: MockLocalization(); explicit MockLocalization(std::shared_ptr representation); private: /// Calculates the global position of this localization /// \param time The time in [0..1] at which the position should be calculated /// \return The global position of the localization at the requested time /// \note time can useful when dealing with CCD SurgSim::Math::Vector3d doCalculatePosition(double time) const override; SurgSim::Math::Vector3d doCalculateVelocity(double time) const override; }; class MockConstraintImplementation : public ConstraintImplementation { public: SurgSim::Physics::ConstraintType getConstraintType() const override; private: size_t doGetNumDof() const override; virtual void doBuild(double dt, const ConstraintData& data, const std::shared_ptr& localization, MlcpPhysicsProblem* mlcp, size_t indexOfRepresentation, size_t indexOfConstraint, ConstraintSideSign sign); }; class MockVirtualToolCoupler : public VirtualToolCoupler { public: MockVirtualToolCoupler(); const SurgSim::DataStructures::OptionalValue& getOptionalLinearStiffness() const; const SurgSim::DataStructures::OptionalValue& getOptionalLinearDamping() const; const SurgSim::DataStructures::OptionalValue& getOptionalAngularStiffness() const; const SurgSim::DataStructures::OptionalValue& getOptionalAngularDamping() const; const SurgSim::DataStructures::OptionalValue& getOptionalAttachmentPoint() const; void setOptionalLinearStiffness(const SurgSim::DataStructures::OptionalValue& val); void setOptionalLinearDamping(const SurgSim::DataStructures::OptionalValue& val); void setOptionalAngularStiffness(const SurgSim::DataStructures::OptionalValue& val); void setOptionalAngularDamping(const SurgSim::DataStructures::OptionalValue& val); void setOptionalAttachmentPoint(const SurgSim::DataStructures::OptionalValue& val); const SurgSim::DataStructures::DataGroup& getOutputData() const; }; inline std::shared_ptr makeMockConstraint(std::shared_ptr firstRepresentation, std::shared_ptr secondRepresentation) { using SurgSim::DataStructures::Location; static auto type = MockConstraintImplementation().getConstraintType(); if (firstRepresentation->getConstraintImplementation(type) == nullptr) { ConstraintImplementation::getFactory().addImplementation(typeid(MockRepresentation), std::make_shared()); } return std::make_shared(type, std::make_shared(), firstRepresentation, Location(), secondRepresentation, Location()); } /// Class to represent a mock collision representation to test if update gets called from the Computation. class MockCollisionRepresentation : public SurgSim::Collision::Representation { public: /// Default constructor /// \param name The name of the collision representation. explicit MockCollisionRepresentation(const std::string& name); int getShapeType() const override; const std::shared_ptr getShape() const override; void update(const double& dt) override; /// \return The number of times update method has been invoked. int getNumberOfTimesUpdateCalled() const; private: /// Number of times update method has been invoked. int m_numberOfTimesUpdateCalled; }; class MockComputation : public Computation { public: explicit MockComputation(bool doCopyState = false); SURGSIM_CLASSNAME(SurgSim::Physics::MockComputation); protected: std::shared_ptr doUpdate(const double& dt, const std::shared_ptr& state) override; }; }; // Physics }; // SurgSim #endif // SURGSIM_PHYSICS_UNITTESTS_MOCKOBJECTS_H opensurgsim-0.7.0/SurgSim/Physics/UnitTests/ParticleCollisionResponseTests.cpp000066400000000000000000000052271277777236100277640ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include "SurgSim/Particles/ParticlesCollisionRepresentation.h" #include "SurgSim/Particles/Representation.h" #include "SurgSim/Physics/ParticleCollisionResponse.h" #include "SurgSim/Physics/PhysicsManagerState.h" #include "SurgSim/Physics/Representation.h" namespace SurgSim { namespace Physics { class MockParticleSystem : public SurgSim::Particles::Representation { public: explicit MockParticleSystem(const std::string& name) : SurgSim::Particles::Representation(name), handleCollisionsCount(0) { } int handleCollisionsCount; private: bool doUpdate(double dt) override { return true; } bool doHandleCollisions(double dt, const SurgSim::Collision::ContactMapType& collisions) override { handleCollisionsCount++; return true; } }; TEST(ParticleCollisionResponseTest, UpdateCallTest) { auto mockRepresentation = std::make_shared("particles"); auto physicsManagerState = std::make_shared(); std::vector> allRepresentations; allRepresentations.push_back(mockRepresentation); physicsManagerState->setParticleRepresentations(allRepresentations); double dt = 1e-3; auto computation = std::make_shared(); EXPECT_EQ(0, mockRepresentation->handleCollisionsCount); computation->update(dt, physicsManagerState); EXPECT_EQ(0, mockRepresentation->handleCollisionsCount) << "Particle Representation without a Collision Representation should not handle collisions."; auto collisionRepresentation = std::make_shared("collision"); mockRepresentation->setCollisionRepresentation(collisionRepresentation); computation->update(dt, physicsManagerState); EXPECT_EQ(1, mockRepresentation->handleCollisionsCount); computation->update(dt, physicsManagerState); EXPECT_EQ(2, mockRepresentation->handleCollisionsCount); computation->update(dt, physicsManagerState); EXPECT_EQ(3, mockRepresentation->handleCollisionsCount); } }; }; opensurgsim-0.7.0/SurgSim/Physics/UnitTests/PhysicsManagerStateTests.cpp000066400000000000000000000363551277777236100265520ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the PhysicsManagerState class. #include #include #include #include #include #include "SurgSim/Collision/CollisionPair.h" #include "SurgSim/Collision/Representation.h" #include "SurgSim/Physics/Constraint.h" #include "SurgSim/Physics/ContactConstraintData.h" #include "SurgSim/Physics/MlcpMapping.h" #include "SurgSim/Physics/PhysicsManagerState.h" #include "SurgSim/Physics/RigidCollisionRepresentation.h" #include "SurgSim/Physics/RigidConstraintFrictionlessContact.h" #include "SurgSim/Physics/RigidRepresentation.h" using SurgSim::Physics::Constraint; using SurgSim::Physics::ContactConstraintData; using SurgSim::Physics::Localization; using SurgSim::Physics::MlcpMapping; using SurgSim::Physics::PhysicsManagerState; using SurgSim::Physics::Representation; using SurgSim::Physics::RigidCollisionRepresentation; using SurgSim::Physics::RigidConstraintFrictionlessContact; using SurgSim::Physics::RigidLocalization; using SurgSim::Physics::RigidRepresentation; TEST(PhysicsManagerStateTest, SetGetRigidRepresentations) { auto physicsState = std::make_shared(); std::vector> expectedRepresentations; std::vector> actualRepresentations; std::unordered_map, std::shared_ptr> actualCollisionsToPhysicsMap; // Add a representation. auto rigid1 = std::make_shared("rigid1"); expectedRepresentations.push_back(rigid1); physicsState->setRepresentations(expectedRepresentations); actualRepresentations = physicsState->getRepresentations(); ASSERT_EQ(1, actualRepresentations.size()); EXPECT_EQ(rigid1, actualRepresentations.back()); actualCollisionsToPhysicsMap = physicsState->getCollisionToPhysicsMap(); EXPECT_EQ(0, actualCollisionsToPhysicsMap.size()); // Add a second representation. This one has a collision representation. auto rigid2 = std::make_shared("rigid2"); auto collisionRepresentation = std::make_shared("rigid2 collision"); rigid2->setCollisionRepresentation(collisionRepresentation); expectedRepresentations.push_back(rigid2); physicsState->setRepresentations(expectedRepresentations); actualRepresentations = physicsState->getRepresentations(); ASSERT_EQ(2, actualRepresentations.size()); EXPECT_EQ(rigid2, actualRepresentations.back()); // check the collisionsToPhysicsMap actualCollisionsToPhysicsMap = physicsState->getCollisionToPhysicsMap(); ASSERT_EQ(1, actualCollisionsToPhysicsMap.size()); EXPECT_EQ(rigid2, actualCollisionsToPhysicsMap[collisionRepresentation]); } TEST(PhysicsManagerStateTest, SetGetRepresentationsMapping) { auto physicsState = std::make_shared(); MlcpMapping expectedRepresentationsIndexMapping; MlcpMapping actualRepresentationsIndexMapping; // Add a representation. auto rigid1 = std::make_shared("rigid1"); expectedRepresentationsIndexMapping.setValue(rigid1.get(), 13); physicsState->setRepresentationsMapping(expectedRepresentationsIndexMapping); actualRepresentationsIndexMapping = physicsState->getRepresentationsMapping(); std::shared_ptr rigid1AsRepresentation = rigid1; EXPECT_EQ(13, actualRepresentationsIndexMapping.getValue(rigid1AsRepresentation.get())); // Add a second representation. This one has a collision representation. auto rigid2 = std::make_shared("rigid2"); auto collisionRepresentation = std::make_shared("rigid2 collision"); rigid2->setCollisionRepresentation(collisionRepresentation); expectedRepresentationsIndexMapping.setValue(rigid2.get(), 17); physicsState->setRepresentationsMapping(expectedRepresentationsIndexMapping); actualRepresentationsIndexMapping = physicsState->getRepresentationsMapping(); std::shared_ptr rigid2AsRepresentation = rigid2; EXPECT_EQ(17, actualRepresentationsIndexMapping.getValue(rigid2AsRepresentation.get())); } TEST(PhysicsManagerStateTest, SetGetActiveRepresentations) { auto physicsState = std::make_shared(); std::vector> expectedRepresentations; std::vector> actualRepresentations; // Add a representation. auto rigid1 = std::make_shared("rigid1"); expectedRepresentations.push_back(rigid1); physicsState->setActiveRepresentations(expectedRepresentations); // Filter the active representations and test. actualRepresentations = physicsState->getActiveRepresentations(); ASSERT_EQ(1, actualRepresentations.size()); EXPECT_EQ(rigid1, actualRepresentations.back()); // Add a second representation. This one has a collision representation. auto rigid2 = std::make_shared("rigid2"); auto collisionRepresentation = std::make_shared("rigid2 collision"); rigid2->setCollisionRepresentation(collisionRepresentation); expectedRepresentations.push_back(rigid2); physicsState->setActiveRepresentations(expectedRepresentations); // Filter the active representations and test. actualRepresentations = physicsState->getActiveRepresentations(); ASSERT_EQ(2, actualRepresentations.size()); EXPECT_EQ(rigid2, actualRepresentations.back()); } TEST(PhysicsManagerStateTest, SetGetCollisionRepresentations) { auto physicsState = std::make_shared(); std::vector> expectedRepresentations; std::vector> actualRepresentations; // Add a collision representation. std::shared_ptr collision1 = std::make_shared("collision1"); expectedRepresentations.push_back(collision1); physicsState->setCollisionRepresentations(expectedRepresentations); actualRepresentations = physicsState->getCollisionRepresentations(); ASSERT_EQ(1, actualRepresentations.size()); EXPECT_EQ(collision1, actualRepresentations.back()); // Add a second collision representation. std::shared_ptr collision2 = std::make_shared("collision2"); expectedRepresentations.push_back(collision2); physicsState->setCollisionRepresentations(expectedRepresentations); actualRepresentations = physicsState->getCollisionRepresentations(); ASSERT_EQ(2, actualRepresentations.size()); EXPECT_EQ(collision2, actualRepresentations.back()); } TEST(PhysicsManagerStateTest, SetGetActiveCollisionRepresentations) { auto physicsState = std::make_shared(); std::vector> expectedRepresentations; std::vector> actualRepresentations; // Add a collision representation. std::shared_ptr collision1 = std::make_shared("collision1"); expectedRepresentations.push_back(collision1); physicsState->setActiveCollisionRepresentations(expectedRepresentations); actualRepresentations = physicsState->getActiveCollisionRepresentations(); ASSERT_EQ(1, actualRepresentations.size()); EXPECT_EQ(collision1, actualRepresentations.back()); // Add a second collision representation. std::shared_ptr collision2 = std::make_shared("collision2"); expectedRepresentations.push_back(collision2); physicsState->setActiveCollisionRepresentations(expectedRepresentations); actualRepresentations = physicsState->getActiveCollisionRepresentations(); ASSERT_EQ(2, actualRepresentations.size()); EXPECT_EQ(collision2, actualRepresentations.back()); } TEST(PhysicsManagerStateTest, SetGetCollisionPairs) { auto physicsState = std::make_shared(); std::vector> expectedPairs; std::vector> actualPairs; // Add a collision pair. auto pair1 = std::make_shared(); expectedPairs.push_back(pair1); physicsState->setCollisionPairs(expectedPairs); actualPairs = physicsState->getCollisionPairs(); ASSERT_EQ(1, actualPairs.size()); EXPECT_EQ(pair1, actualPairs.back()); // Add a second collision representation. auto pair2 = std::make_shared(); expectedPairs.push_back(pair2); physicsState->setCollisionPairs(expectedPairs); actualPairs = physicsState->getCollisionPairs(); ASSERT_EQ(2, actualPairs.size()); EXPECT_EQ(pair2, actualPairs.back()); } TEST(PhysicsManagerStateTest, SetGetConstraintGroup) { auto physicsState = std::make_shared(); std::vector> expectedConstraints; std::vector> actualConstraints; auto constraintType = SurgSim::Physics::FRICTIONLESS_3DCONTACT; // We need a populated constraint to check the constraintsIndexMapping. // Create the representations for the constraint. auto rigid1 = std::make_shared("rigid1"); auto rigid2 = std::make_shared("rigid2"); // Create the constraint specific data. std::shared_ptr data = std::make_shared(); // Create the constraint. auto constraint1 = std::make_shared(constraintType, data, rigid1, SurgSim::DataStructures::Location(SurgSim::Math::Vector3d::Zero()), rigid2, SurgSim::DataStructures::Location(SurgSim::Math::Vector3d::Zero())); // Check the constraintGroup. expectedConstraints.push_back(constraint1); physicsState->setConstraintGroup(SurgSim::Physics::CONSTRAINT_GROUP_TYPE_CONTACT, expectedConstraints); actualConstraints = physicsState->getConstraintGroup(SurgSim::Physics::CONSTRAINT_GROUP_TYPE_CONTACT); ASSERT_EQ(1, actualConstraints.size()); EXPECT_EQ(constraint1, actualConstraints.back()); // Create a second constraint. auto constraint2 = std::make_shared(constraintType, data, rigid1, SurgSim::DataStructures::Location(SurgSim::Math::Vector3d::Zero()), rigid2, SurgSim::DataStructures::Location(SurgSim::Math::Vector3d::Zero())); // Check the constraintGroup. expectedConstraints.push_back(constraint2); physicsState->setConstraintGroup(SurgSim::Physics::CONSTRAINT_GROUP_TYPE_CONTACT, expectedConstraints); actualConstraints = physicsState->getConstraintGroup(SurgSim::Physics::CONSTRAINT_GROUP_TYPE_CONTACT); ASSERT_EQ(2, actualConstraints.size()); EXPECT_EQ(constraint2, actualConstraints.back()); } TEST(PhysicsManagerStateTest, SetGetConstraintsMapping) { auto physicsState = std::make_shared(); MlcpMapping expectedConstraintsIndexMapping; MlcpMapping actualConstraintsIndexMapping; auto constraintType = SurgSim::Physics::FRICTIONLESS_3DCONTACT; // We need a populated constraint to check the constraintsIndexMapping. // Create the representations for the constraint. auto rigid1 = std::make_shared("rigid1"); auto rigid2 = std::make_shared("rigid2"); // Create the constraint specific data. std::shared_ptr data = std::make_shared(); // Create the constraint. auto constraint1 = std::make_shared(constraintType, data, rigid1, SurgSim::DataStructures::Location(SurgSim::Math::Vector3d::Zero()), rigid2, SurgSim::DataStructures::Location(SurgSim::Math::Vector3d::Zero())); // Check the constraintGroup. expectedConstraintsIndexMapping.setValue(constraint1.get(), 5); physicsState->setConstraintsMapping(expectedConstraintsIndexMapping); actualConstraintsIndexMapping = physicsState->getConstraintsMapping(); std::shared_ptr constraint1AsConstraint = constraint1; ASSERT_EQ(5, actualConstraintsIndexMapping.getValue(constraint1AsConstraint.get())); } TEST(PhysicsManagerStateTest, SetGetActiveConstraints) { auto physicsState = std::make_shared(); std::vector> expectedConstraints; std::vector> actualConstraints; auto constraintType = SurgSim::Physics::FRICTIONLESS_3DCONTACT; // Create first side of a constraint. // Create the representations for the constraint. auto rigid1 = std::make_shared("rigid1"); auto rigid2 = std::make_shared("rigid2"); // Create the constraint specific data. std::shared_ptr data = std::make_shared(); // Create the constraint. auto constraint1 = std::make_shared(constraintType, data, rigid1, SurgSim::DataStructures::Location(SurgSim::Math::Vector3d::Zero()), rigid2, SurgSim::DataStructures::Location(SurgSim::Math::Vector3d::Zero())); // Check the active constraints. expectedConstraints.push_back(constraint1); physicsState->setActiveConstraints(expectedConstraints); actualConstraints = physicsState->getActiveConstraints(); ASSERT_EQ(1, actualConstraints.size()); EXPECT_EQ(constraint1, actualConstraints.back()); // Create a second constraint. auto constraint2 = std::make_shared(constraintType, data, rigid1, SurgSim::DataStructures::Location(SurgSim::Math::Vector3d::Zero()), rigid2, SurgSim::DataStructures::Location(SurgSim::Math::Vector3d::Zero())); // Check the active constraints. expectedConstraints.push_back(constraint2); physicsState->setActiveConstraints(expectedConstraints); actualConstraints = physicsState->getActiveConstraints(); ASSERT_EQ(2, actualConstraints.size()); EXPECT_EQ(constraint1, actualConstraints.front()); EXPECT_EQ(constraint2, actualConstraints.back()); } TEST(PhysicsManagerStateTest, GetMlcpProblem) { auto physicsState = std::make_shared(); // Check non-const getter. EXPECT_NO_THROW(physicsState->getMlcpProblem().A.resize(21, 8)); EXPECT_EQ(21, physicsState->getMlcpProblem().A.rows()); EXPECT_EQ(8, physicsState->getMlcpProblem().A.cols()); // Check const getter. std::shared_ptr constPhysicsState = std::make_shared(); EXPECT_NO_THROW(constPhysicsState->getMlcpProblem()); } TEST(PhysicsManagerStateTest, GetMlcpSolution) { auto physicsState = std::make_shared(); // Check non-const getter. EXPECT_NO_THROW(physicsState->getMlcpSolution().x.resize(23)); EXPECT_EQ(23, physicsState->getMlcpSolution().x.size()); // Check const getter. std::shared_ptr constPhysicsState = std::make_shared(); EXPECT_NO_THROW(constPhysicsState->getMlcpSolution()); } opensurgsim-0.7.0/SurgSim/Physics/UnitTests/PhysicsManagerTests.cpp000066400000000000000000000153461277777236100255460ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file /// Tests for the PhysicsManager class. Note that PhysicsManagerTest, the test fixture /// is declared as a friend class in PhysicsManager to make it easier to test the /// add and removal of components, for this to work correctly PhysicsManagerTest is required /// to be in the SurgSim::Physics namespace. #include #include #include #include "SurgSim/Collision/ShapeCollisionRepresentation.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Particles/SphRepresentation.h" #include "SurgSim/Physics/ConstraintComponent.h" #include "SurgSim/Physics/DeformableCollisionRepresentation.h" #include "SurgSim/Physics/PhysicsManager.h" #include "SurgSim/Physics/Representation.h" #include "SurgSim/Physics/FixedRepresentation.h" #include "SurgSim/Physics/UnitTests/MockObjects.h" #include "SurgSim/Math/Vector.h" using SurgSim::Framework::Runtime; using SurgSim::Framework::Component; using SurgSim::Physics::FixedRepresentation; using SurgSim::Physics::PhysicsManager; using SurgSim::Math::Vector3d; namespace SurgSim { namespace Collision { class MockContactFilter : public Collision::ContactFilter { public: explicit MockContactFilter(const std::string& name) : ContactFilter(name) {} MOCK_METHOD0(doWakeUp, bool()); MOCK_METHOD0(doInitialize, bool()); MOCK_METHOD1(doUpdate, void(double)); MOCK_METHOD2(doFilterContacts, void(const std::shared_ptr& state, const std::shared_ptr& pairs)); }; } namespace Physics { class PhysicsManagerTest : public ::testing::Test { public: virtual void SetUp() { physicsManager = std::make_shared(); } virtual void TearDown() { } bool testDoAddComponent(const std::shared_ptr& component) { return physicsManager->executeAdditions(component); } bool testDoRemoveComponent(const std::shared_ptr& component) { return physicsManager->executeRemovals(component); } std::shared_ptr physicsManager; }; TEST_F(PhysicsManagerTest, InitTest) { std::shared_ptr runtime = std::make_shared(); runtime->addManager(physicsManager); EXPECT_NO_THROW(runtime->start()); EXPECT_NO_THROW(runtime->stop()); } TEST_F(PhysicsManagerTest, AddRemoveRepresentation) { std::shared_ptr representation1 = std::make_shared("Rep1"); std::shared_ptr representation2 = std::make_shared("Rep2"); EXPECT_TRUE(testDoAddComponent(representation1)); EXPECT_TRUE(testDoAddComponent(representation2)); EXPECT_FALSE(testDoAddComponent(representation1)); EXPECT_TRUE(testDoRemoveComponent(representation1)); EXPECT_FALSE(testDoRemoveComponent(representation1)); EXPECT_TRUE(testDoRemoveComponent(representation2)); } TEST_F(PhysicsManagerTest, AddRemoveCollisionRepresentation) { auto representation1 = std::make_shared("Rep1"); auto representation2 = std::make_shared("Rep2"); EXPECT_TRUE(testDoAddComponent(representation1)); EXPECT_TRUE(testDoAddComponent(representation2)); EXPECT_FALSE(testDoAddComponent(representation1)); EXPECT_TRUE(testDoRemoveComponent(representation1)); EXPECT_FALSE(testDoRemoveComponent(representation1)); EXPECT_TRUE(testDoRemoveComponent(representation2)); } TEST_F(PhysicsManagerTest, AddRemoveContactFilter) { auto filter1 = std::make_shared("filter1"); auto filter2 = std::make_shared("filter2"); EXPECT_TRUE(testDoAddComponent(filter1)); EXPECT_TRUE(testDoAddComponent(filter2)); EXPECT_FALSE(testDoAddComponent(filter1)); EXPECT_TRUE(testDoRemoveComponent(filter1)); EXPECT_FALSE(testDoRemoveComponent(filter1)); EXPECT_TRUE(testDoRemoveComponent(filter2)); } TEST_F(PhysicsManagerTest, AddRemoveConstraintComponent) { auto constraintComponent1 = std::make_shared("component1"); auto constraintComponent2 = std::make_shared("component2"); constraintComponent1->setConstraint( makeMockConstraint(std::make_shared(), std::make_shared())); constraintComponent2->setConstraint( makeMockConstraint(std::make_shared(), std::make_shared())); EXPECT_TRUE(testDoAddComponent(constraintComponent1)); EXPECT_TRUE(testDoAddComponent(constraintComponent2)); EXPECT_FALSE(testDoAddComponent(constraintComponent1)); EXPECT_TRUE(testDoRemoveComponent(constraintComponent1)); EXPECT_FALSE(testDoRemoveComponent(constraintComponent1)); EXPECT_TRUE(testDoRemoveComponent(constraintComponent2)); } TEST_F(PhysicsManagerTest, AddRemoveParticleRepresentation) { auto representation1 = std::make_shared("Rep1"); auto representation2 = std::make_shared("Rep2"); EXPECT_TRUE(testDoAddComponent(representation1)); EXPECT_TRUE(testDoAddComponent(representation2)); EXPECT_FALSE(testDoAddComponent(representation1)); EXPECT_TRUE(testDoRemoveComponent(representation1)); EXPECT_FALSE(testDoRemoveComponent(representation1)); EXPECT_TRUE(testDoRemoveComponent(representation2)); } TEST_F(PhysicsManagerTest, SetComputations) { std::shared_ptr runtime = std::make_shared(); runtime->addManager(physicsManager); EXPECT_NO_THROW(physicsManager->setComputations(createDcdPipeline())); EXPECT_NO_THROW(runtime->start()); EXPECT_ANY_THROW(physicsManager->setComputations(createDcdPipeline())); } TEST_F(PhysicsManagerTest, RunCcd) { std::shared_ptr runtime = std::make_shared(); runtime->addManager(physicsManager); EXPECT_NO_THROW(physicsManager->setComputations(createCcdPipeline())); EXPECT_NO_THROW(runtime->start()); EXPECT_NO_THROW(runtime->stop()); } TEST_F(PhysicsManagerTest, RunDcd) { std::shared_ptr runtime = std::make_shared(); runtime->addManager(physicsManager); EXPECT_NO_THROW(physicsManager->setComputations(createDcdPipeline())); EXPECT_NO_THROW(runtime->start()); EXPECT_NO_THROW(runtime->stop()); } }; // namespace Physics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/UnitTests/PostUpdateTests.cpp000066400000000000000000000045741277777236100247220ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file PostUpdateTests.cpp /// Simple Test for PostUpdate calculation #include #include #include #include "SurgSim/Physics/PhysicsManagerState.h" #include "SurgSim/Physics/PostUpdate.h" #include "SurgSim/Physics/Representation.h" #include "SurgSim/Physics/UnitTests/MockObjects.h" namespace SurgSim { namespace Physics { TEST(PostUpdateTest, UpdateCallTest) { std::shared_ptr mockRepresentation = std::make_shared(); std::shared_ptr physicsManagerState = std::make_shared(); std::vector> allRepresentations; allRepresentations.push_back(mockRepresentation); physicsManagerState->setRepresentations(allRepresentations); double dt = 1e-3; std::shared_ptr postUpdateComputation = std::make_shared(); EXPECT_EQ(0, mockRepresentation->getPreUpdateCount()); EXPECT_EQ(0, mockRepresentation->getUpdateCount()); EXPECT_EQ(0, mockRepresentation->getPostUpdateCount()); postUpdateComputation->update(dt, physicsManagerState); EXPECT_EQ(0, mockRepresentation->getPreUpdateCount()); EXPECT_EQ(0, mockRepresentation->getUpdateCount()); EXPECT_EQ(1, mockRepresentation->getPostUpdateCount()); postUpdateComputation->update(dt, physicsManagerState); EXPECT_EQ(0, mockRepresentation->getPreUpdateCount()); EXPECT_EQ(0, mockRepresentation->getUpdateCount()); EXPECT_EQ(2, mockRepresentation->getPostUpdateCount()); postUpdateComputation->update(dt, physicsManagerState); EXPECT_EQ(0, mockRepresentation->getPreUpdateCount()); EXPECT_EQ(0, mockRepresentation->getUpdateCount()); EXPECT_EQ(3, mockRepresentation->getPostUpdateCount()); } }; // namespace Physics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/UnitTests/PreUpdateTests.cpp000066400000000000000000000045621277777236100245200ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file PreUpdateTests.cpp /// Simple Test for PreUpdate calculation #include #include #include #include "SurgSim/Physics/PhysicsManagerState.h" #include "SurgSim/Physics/PreUpdate.h" #include "SurgSim/Physics/Representation.h" #include "SurgSim/Physics/UnitTests/MockObjects.h" namespace SurgSim { namespace Physics { TEST(PreUpdateTest, UpdateCallTest) { std::shared_ptr mockRepresentation = std::make_shared(); std::shared_ptr physicsManagerState = std::make_shared(); std::vector> allRepresentations; allRepresentations.push_back(mockRepresentation); physicsManagerState->setRepresentations(allRepresentations); double dt = 1e-3; std::shared_ptr preUpdateComputation = std::make_shared(); EXPECT_EQ(0, mockRepresentation->getPreUpdateCount()); EXPECT_EQ(0, mockRepresentation->getUpdateCount()); EXPECT_EQ(0, mockRepresentation->getPostUpdateCount()); preUpdateComputation->update(dt, physicsManagerState); EXPECT_EQ(1, mockRepresentation->getPreUpdateCount()); EXPECT_EQ(0, mockRepresentation->getUpdateCount()); EXPECT_EQ(0, mockRepresentation->getPostUpdateCount()); preUpdateComputation->update(dt, physicsManagerState); EXPECT_EQ(2, mockRepresentation->getPreUpdateCount()); EXPECT_EQ(0, mockRepresentation->getUpdateCount()); EXPECT_EQ(0, mockRepresentation->getPostUpdateCount()); preUpdateComputation->update(dt, physicsManagerState); EXPECT_EQ(3, mockRepresentation->getPreUpdateCount()); EXPECT_EQ(0, mockRepresentation->getUpdateCount()); EXPECT_EQ(0, mockRepresentation->getPostUpdateCount()); } }; // namespace Physics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/UnitTests/PrepareCollisionPairsTests.cpp000066400000000000000000000171671277777236100271050ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file PrepareCollisionPairsTests.cpp /// Tests for the PrepareCollisionPairs Class #include #include #include #include "SurgSim/Blocks/SphereElement.h" #include "SurgSim/Collision/CollisionPair.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Framework/Scene.h" #include "SurgSim/Framework/SceneElement.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Physics/PhysicsManagerState.h" #include "SurgSim/Physics/PrepareCollisionPairs.h" using SurgSim::Math::Vector3d; class PrepareCollisionPairsTest : public ::testing::Test { public: virtual void SetUp() { sphere1 = std::make_shared("Sphere1"); sphere2 = std::make_shared("Sphere2"); runtime = std::make_shared(); auto scene = runtime->getScene(); scene->addSceneElement(sphere1); scene->addSceneElement(sphere2); physicsRepresentations.push_back(sphere1->getComponents()[0]); physicsRepresentations.push_back(sphere2->getComponents()[0]); sphere1Collision = sphere1->getComponents()[0]; sphere2Collision = sphere2->getComponents()[0]; sphere1Collision->update(0.0); sphere2Collision->update(0.0); collisionRepresentations.push_back(sphere1Collision); collisionRepresentations.push_back(sphere2Collision); computation = std::make_shared(false); } void prepareState() { auto stateTmp = std::make_shared(); stateTmp->setRepresentations(physicsRepresentations); stateTmp->setCollisionRepresentations(collisionRepresentations); state = computation->update(0.0, stateTmp); // This step prepares the collision pairs } virtual void TearDown() { } std::vector> physicsRepresentations; std::vector> collisionRepresentations; std::shared_ptr sphere1; std::shared_ptr sphere1Collision; std::shared_ptr sphere2; std::shared_ptr sphere2Collision; std::shared_ptr state; std::shared_ptr computation; std::shared_ptr runtime; }; namespace SurgSim { namespace Physics { TEST_F(PrepareCollisionPairsTest, RigidRigidCollisionTest) { sphere2->setPose(Math::makeRigidTransform(Math::Quaterniond::Identity(), Vector3d(0.0, 0.0, 0.5))); prepareState(); std::shared_ptr newState = computation->update(1.0, state); ASSERT_EQ(1u, newState->getCollisionPairs().size()); } TEST_F(PrepareCollisionPairsTest, InactiveTest1) { sphere1->setActive(false); sphere2->setPose(Math::makeRigidTransform(Math::Quaterniond::Identity(), Vector3d(0.0, 0.0, 0.5))); prepareState(); std::shared_ptr newState = computation->update(1.0, state); ASSERT_EQ(0u, newState->getCollisionPairs().size()); } TEST_F(PrepareCollisionPairsTest, InactiveTest2) { sphere2->setActive(false); sphere2->setPose(Math::makeRigidTransform(Math::Quaterniond::Identity(), Vector3d(0.0, 0.0, 0.5))); prepareState(); std::shared_ptr newState = computation->update(1.0, state); ASSERT_EQ(0u, newState->getCollisionPairs().size()); } TEST_F(PrepareCollisionPairsTest, InactiveTest3) { sphere1->setActive(false); sphere2->setActive(false); sphere2->setPose(Math::makeRigidTransform(Math::Quaterniond::Identity(), Vector3d(0.0, 0.0, 0.5))); prepareState(); std::shared_ptr newState = computation->update(1.0, state); ASSERT_EQ(0u, newState->getCollisionPairs().size()); } TEST_F(PrepareCollisionPairsTest, ExlcudeCollisionsTest1) { sphere1Collision->ignore("Sphere2/Sphere Collision Representation"); sphere2->setPose(Math::makeRigidTransform(Math::Quaterniond::Identity(), Vector3d(0.0, 0.0, 0.5))); prepareState(); std::shared_ptr newState = computation->update(1.0, state); ASSERT_EQ(0u, newState->getCollisionPairs().size()); } TEST_F(PrepareCollisionPairsTest, ExlcudeCollisionsTest2) { sphere2Collision->ignore("Sphere1/Sphere Collision Representation"); sphere2->setPose(Math::makeRigidTransform(Math::Quaterniond::Identity(), Vector3d(0.0, 0.0, 0.5))); prepareState(); std::shared_ptr newState = computation->update(1.0, state); ASSERT_EQ(0u, newState->getCollisionPairs().size()); } TEST_F(PrepareCollisionPairsTest, ExlcudeCollisionsTest3) { sphere1Collision->ignore("Sphere2/Sphere Collision Representation"); sphere2Collision->ignore("Sphere1/Sphere Collision Representation"); sphere2->setPose(Math::makeRigidTransform(Math::Quaterniond::Identity(), Vector3d(0.0, 0.0, 0.5))); prepareState(); std::shared_ptr newState = computation->update(1.0, state); ASSERT_EQ(0u, newState->getCollisionPairs().size()); } TEST_F(PrepareCollisionPairsTest, IgnoreContinuousTypeCollisions) { sphere1Collision->setCollisionDetectionType(Collision::COLLISION_DETECTION_TYPE_CONTINUOUS); sphere2Collision->setCollisionDetectionType(Collision::COLLISION_DETECTION_TYPE_CONTINUOUS); sphere2->setPose(Math::makeRigidTransform(Math::Quaterniond::Identity(), Vector3d(0.0, 0.0, 0.5))); prepareState(); std::shared_ptr newState = computation->update(1.0, state); ASSERT_EQ(1u, newState->getCollisionPairs().size()); } TEST_F(PrepareCollisionPairsTest, IgnoreNoneTypeCollisions) { sphere2Collision->setCollisionDetectionType(Collision::COLLISION_DETECTION_TYPE_NONE); sphere2->setPose(Math::makeRigidTransform(Math::Quaterniond::Identity(), Vector3d(0.0, 0.0, 0.5))); prepareState(); std::shared_ptr newState = computation->update(1.0, state); ASSERT_EQ(0u, newState->getCollisionPairs().size()); } TEST_F(PrepareCollisionPairsTest, SelfCollisionPair) { sphere2->setPose(Math::makeRigidTransform(Math::Quaterniond::Identity(), Vector3d(0.0, 0.0, 0.5))); sphere2Collision->setSelfCollisionDetectionType(Collision::COLLISION_DETECTION_TYPE_DISCRETE); prepareState(); std::shared_ptr newState = computation->update(1.0, state); ASSERT_EQ(2u, newState->getCollisionPairs().size()); } // Check for a bug fix in PrepareCollisionPairs where Scenes with 1 representation did not check for self collision TEST_F(PrepareCollisionPairsTest, SingleSelfCollisionPair) { physicsRepresentations.pop_back(); collisionRepresentations.pop_back(); sphere1->setPose(Math::makeRigidTransform(Math::Quaterniond::Identity(), Vector3d(0.0, 0.0, 0.5))); sphere1Collision->setSelfCollisionDetectionType(Collision::COLLISION_DETECTION_TYPE_DISCRETE); prepareState(); std::shared_ptr newState = computation->update(1.0, state); ASSERT_EQ(1u, newState->getCollisionPairs().size()); } }; }; opensurgsim-0.7.0/SurgSim/Physics/UnitTests/PushResultsTests.cpp000066400000000000000000000411261277777236100251250ustar00rootroot00000000000000// Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file PushResultsTests.cpp /// Simple Test for PushResults calculation #include #include #include #include "SurgSim/Physics/UnitTests/CommonTests.h" #include "SurgSim/Physics/BuildMlcp.h" #include "SurgSim/Physics/PushResults.h" namespace SurgSim { namespace Physics { class PushResultsTests : public CommonTests { public: void SetUp() { CommonTests::SetUp(); // Create the BuildMlcp computation m_pushResultsComputation = std::make_shared(); } protected: /// The Push Results computation std::shared_ptr m_pushResultsComputation; }; void updateRepresentationsMapping(std::shared_ptr state) { // The BuildMlcp computation build the representations mapping. So it is called. auto buildMlcpComputation = std::make_shared(); buildMlcpComputation->update(0.0, state); } TEST_F(PushResultsTests, NoRepresentationNoConstraint) { // Run the BuildMlcp computation... ASSERT_NO_THROW(m_pushResultsComputation->update(dt, m_physicsManagerState)); } TEST_F(PushResultsTests, OneRepresentationNoConstraintTest) { // Prep the list of representations: use only 1 representation m_usedRepresentations.push_back(m_allRepresentations[0]); // Set the representation list in the Physics Manager State m_physicsManagerState->setRepresentations(m_usedRepresentations); // Run the BuildMlcp computation... ASSERT_NO_THROW(m_pushResultsComputation->update(dt, m_physicsManagerState)); } TEST_F(PushResultsTests, TwoRepresentationsNoConstraintTest) { // Prep the list of representations: use 2 representations m_usedRepresentations.push_back(m_allRepresentations[0]); m_usedRepresentations.push_back(m_allRepresentations[1]); // Set the representation list in the Physics Manager State m_physicsManagerState->setRepresentations(m_usedRepresentations); // Run the BuildMlcp computation... ASSERT_NO_THROW(m_pushResultsComputation->update(dt, m_physicsManagerState)); } TEST_F(PushResultsTests, OneRepresentationOneConstraintTest) { // Prep the list of representations: use only 1 rigid representation + 1 fixed m_usedRepresentations.push_back(m_allRepresentations[0]); m_usedRepresentations.push_back(m_fixedWorldRepresentation); // Set the representation list in the Physics Manager State m_physicsManagerState->setRepresentations(m_usedRepresentations); // The type of constraint. auto constraintType = SurgSim::Physics::FRICTIONLESS_3DCONTACT; // Prep the list of constraints: use only 1 constraint { // Define the constraint specific data std::shared_ptr data = std::make_shared(); data->setPlaneEquation(SurgSim::Math::Vector3d(0.0, 1.0, 0.0), 0.0); // Set up the constraint std::shared_ptr constraint = std::make_shared(constraintType, data, m_usedRepresentations[0], SurgSim::DataStructures::Location(SurgSim::Math::Vector3d::Zero()), m_fixedWorldRepresentation, SurgSim::DataStructures::Location(SurgSim::Math::Vector3d::Zero())); // Register the constraint in the list of used constraints for this test m_usedConstraints.push_back(constraint); } // Set the constraint list in the Physics Manager State m_physicsManagerState->setConstraintGroup(CONSTRAINT_GROUP_TYPE_CONTACT, m_usedConstraints); // Update the Representations mapping. updateRepresentationsMapping(m_physicsManagerState); // Fill up the Mlcp problem and clear up the Mlcp solution resetMlcpProblem(6, 1); MlcpPhysicsProblem& mlcpProblem = m_physicsManagerState->getMlcpProblem(); MlcpPhysicsSolution& mlcpSolution = m_physicsManagerState->getMlcpSolution(); { mlcpProblem.CHt(0, 0) = 0.0; mlcpProblem.CHt(1, 0) = 1.0; mlcpProblem.CHt(2, 0) = 2.0; mlcpProblem.CHt(3, 0) = 3.0; mlcpProblem.CHt(4, 0) = 4.0; mlcpProblem.CHt(5, 0) = 5.0; mlcpSolution.x(0) = 1.3; } // Run the BuildMlcp computation... ASSERT_NO_THROW(m_pushResultsComputation->update(dt, m_physicsManagerState)); // Test that the Mlcp is as expected EXPECT_EQ(1, mlcpSolution.x.rows()); EXPECT_NEAR(1.3, mlcpSolution.x(0), epsilon); EXPECT_EQ(6, mlcpSolution.dofCorrection.rows()); EXPECT_NEAR(1.3 * 0.0, mlcpSolution.dofCorrection(0), epsilon); EXPECT_NEAR(1.3 * 1.0, mlcpSolution.dofCorrection(1), epsilon); EXPECT_NEAR(1.3 * 2.0, mlcpSolution.dofCorrection(2), epsilon); EXPECT_NEAR(1.3 * 3.0, mlcpSolution.dofCorrection(3), epsilon); EXPECT_NEAR(1.3 * 4.0, mlcpSolution.dofCorrection(4), epsilon); EXPECT_NEAR(1.3 * 5.0, mlcpSolution.dofCorrection(5), epsilon); std::shared_ptr rigid; rigid = std::static_pointer_cast(m_usedRepresentations[0]); const SurgSim::Math::Vector3d& linVel = rigid->getCurrentState().getLinearVelocity(); const SurgSim::Math::Vector3d& angVel = rigid->getCurrentState().getAngularVelocity(); EXPECT_NEAR(1.3 * 0.0, linVel[0], epsilon); EXPECT_NEAR(1.3 * 1.0, linVel[1], epsilon); EXPECT_NEAR(1.3 * 2.0, linVel[2], epsilon); EXPECT_NEAR(1.3 * 3.0, angVel[0], epsilon); EXPECT_NEAR(1.3 * 4.0, angVel[1], epsilon); EXPECT_NEAR(1.3 * 5.0, angVel[2], epsilon); const SurgSim::Math::RigidTransform3d& pose = rigid->getCurrentState().getPose(); EXPECT_NEAR(1.3 * 0.0 * dt, pose.translation()[0], epsilon); EXPECT_NEAR(1.3 * 1.0 * dt, pose.translation()[1], epsilon); EXPECT_NEAR(1.3 * 2.0 * dt, pose.translation()[2], epsilon); } TEST_F(PushResultsTests, OneRepresentationTwoConstraintsTest) { // Prep the list of representations: use only 1 rigid representation + 1 fixed m_usedRepresentations.push_back(m_allRepresentations[0]); m_usedRepresentations.push_back(m_fixedWorldRepresentation); // Set the representation list in the Physics Manager State m_physicsManagerState->setRepresentations(m_usedRepresentations); // The type of constraint. auto constraintType = SurgSim::Physics::FRICTIONLESS_3DCONTACT; // Prep the list of constraints: use 2 constraints { // Define the constraint specific data std::shared_ptr data = std::make_shared(); data->setPlaneEquation(SurgSim::Math::Vector3d(0.0, 1.0, 0.0), 0.0); // Set up the constraint std::shared_ptr constraint = std::make_shared(constraintType, data, m_usedRepresentations[0], SurgSim::DataStructures::Location(SurgSim::Math::Vector3d::Zero()), m_fixedWorldRepresentation, SurgSim::DataStructures::Location(SurgSim::Math::Vector3d::Zero())); // Register the constraint in the list of used constraints for this test m_usedConstraints.push_back(constraint); } { // Define the constraint specific data std::shared_ptr data = std::make_shared(); data->setPlaneEquation(SurgSim::Math::Vector3d(0.0, 1.0, 0.0), 0.0); // Set up the constraint std::shared_ptr constraint = std::make_shared(constraintType, data, m_usedRepresentations[0], SurgSim::DataStructures::Location(SurgSim::Math::Vector3d::Ones()), m_fixedWorldRepresentation, SurgSim::DataStructures::Location(SurgSim::Math::Vector3d::Ones())); // Register the constraint in the list of used constraints for this test m_usedConstraints.push_back(constraint); } // Set the constraint list in the Physics Manager State m_physicsManagerState->setConstraintGroup(CONSTRAINT_GROUP_TYPE_CONTACT, m_usedConstraints); // Update the Representations mapping. updateRepresentationsMapping(m_physicsManagerState); // Fill up the Mlcp problem and clear up the Mlcp solution resetMlcpProblem(6, 2); MlcpPhysicsProblem& mlcpProblem = m_physicsManagerState->getMlcpProblem(); MlcpPhysicsSolution& mlcpSolution = m_physicsManagerState->getMlcpSolution(); { for (int dofId = 0; dofId < 6; dofId++) { mlcpProblem.CHt(dofId, 0) = static_cast(dofId); mlcpProblem.CHt(dofId, 1) = static_cast(dofId + 1); } mlcpSolution.x(0) = 1.3; mlcpSolution.x(1) =-0.9; } // Run the BuildMlcp computation... ASSERT_NO_THROW(m_pushResultsComputation->update(dt, m_physicsManagerState)); // Test that the Mlcp is as expected EXPECT_EQ(2, mlcpSolution.x.rows()); EXPECT_NEAR( 1.3, mlcpSolution.x(0), epsilon); EXPECT_NEAR(-0.9, mlcpSolution.x(1), epsilon); // dofCorrection = CHt .x = (0 1) . ( 1.3) // (1 2) (-0.9) // (2 3) // (3 4) // (4 5) // (5 6) EXPECT_EQ(6, mlcpSolution.dofCorrection.rows()); EXPECT_NEAR(1.3 * 0.0 - 0.9 * 1.0, mlcpSolution.dofCorrection(0), epsilon); EXPECT_NEAR(1.3 * 1.0 - 0.9 * 2.0, mlcpSolution.dofCorrection(1), epsilon); EXPECT_NEAR(1.3 * 2.0 - 0.9 * 3.0, mlcpSolution.dofCorrection(2), epsilon); EXPECT_NEAR(1.3 * 3.0 - 0.9 * 4.0, mlcpSolution.dofCorrection(3), epsilon); EXPECT_NEAR(1.3 * 4.0 - 0.9 * 5.0, mlcpSolution.dofCorrection(4), epsilon); EXPECT_NEAR(1.3 * 5.0 - 0.9 * 6.0, mlcpSolution.dofCorrection(5), epsilon); std::shared_ptr rigid; rigid = std::static_pointer_cast(m_usedRepresentations[0]); const SurgSim::Math::Vector3d& linVel = rigid->getCurrentState().getLinearVelocity(); const SurgSim::Math::Vector3d& angVel = rigid->getCurrentState().getAngularVelocity(); EXPECT_NEAR(1.3 * 0.0 - 0.9 * 1.0, linVel[0], epsilon); EXPECT_NEAR(1.3 * 1.0 - 0.9 * 2.0, linVel[1], epsilon); EXPECT_NEAR(1.3 * 2.0 - 0.9 * 3.0, linVel[2], epsilon); EXPECT_NEAR(1.3 * 3.0 - 0.9 * 4.0, angVel[0], epsilon); EXPECT_NEAR(1.3 * 4.0 - 0.9 * 5.0, angVel[1], epsilon); EXPECT_NEAR(1.3 * 5.0 - 0.9 * 6.0, angVel[2], epsilon); const SurgSim::Math::RigidTransform3d& pose = rigid->getCurrentState().getPose(); EXPECT_NEAR((1.3 * 0.0 - 0.9 * 1.0) * dt, pose.translation()[0], epsilon); EXPECT_NEAR((1.3 * 1.0 - 0.9 * 2.0) * dt, pose.translation()[1], epsilon); EXPECT_NEAR((1.3 * 2.0 - 0.9 * 3.0) * dt, pose.translation()[2], epsilon); } TEST_F(PushResultsTests, TwoRepresentationsTwoConstraintsTest) { SurgSim::Math::Vector3d pointOrigin = SurgSim::Math::Vector3d::Zero(); SurgSim::Math::Vector3d planeDirection(0.0, 1.0, 0.0); double planeDistance = 0.0; SurgSim::Math::Vector3d pointOne = planeDirection * 1.0; // Prep the list of representations: use only 1 rigid representation + 1 fixed m_usedRepresentations.push_back(m_allRepresentations[0]); m_usedRepresentations.push_back(m_allRepresentations[1]); // Set the representation list in the Physics Manager State m_physicsManagerState->setRepresentations(m_usedRepresentations); // The type of constraint. auto constraintType = SurgSim::Physics::FRICTIONLESS_3DCONTACT; // Prep the list of constraints: use 2 constraints { // Define the constraint specific data std::shared_ptr data = std::make_shared(); data->setPlaneEquation(planeDirection, planeDistance); // Set up the constraint std::shared_ptr constraint = std::make_shared(constraintType, data, m_usedRepresentations[0], SurgSim::DataStructures::Location(pointOrigin), m_usedRepresentations[1], SurgSim::DataStructures::Location(pointOrigin)); // Register the constraint in the list of used constraints for this test m_usedConstraints.push_back(constraint); } { // Define the constraint specific data std::shared_ptr data = std::make_shared(); data->setPlaneEquation(planeDirection, planeDistance); // Set up the constraint std::shared_ptr constraint = std::make_shared(constraintType, data, m_usedRepresentations[0], SurgSim::DataStructures::Location(pointOrigin), m_usedRepresentations[1], SurgSim::DataStructures::Location(pointOne)); // Register the constraint in the list of used constraints for this test m_usedConstraints.push_back(constraint); } // Set the constraint list in the Physics Manager State m_physicsManagerState->setConstraintGroup(CONSTRAINT_GROUP_TYPE_CONTACT, m_usedConstraints); // Update the Representations mapping. updateRepresentationsMapping(m_physicsManagerState); // Fill up the Mlcp problem and clear up the Mlcp solution resetMlcpProblem(12, 2); MlcpPhysicsProblem& mlcpProblem = m_physicsManagerState->getMlcpProblem(); MlcpPhysicsSolution& mlcpSolution = m_physicsManagerState->getMlcpSolution(); { for (int dofId = 0; dofId < 12; dofId++) { mlcpProblem.CHt(dofId, 0) = static_cast(dofId); mlcpProblem.CHt(dofId, 1) = static_cast(dofId + 1); } mlcpSolution.x(0) = 1.3; mlcpSolution.x(1) =-0.9; } // Run the BuildMlcp computation... ASSERT_NO_THROW(m_pushResultsComputation->update(dt, m_physicsManagerState)); // Test that the Mlcp is as expected EXPECT_EQ(2, mlcpSolution.x.rows()); EXPECT_NEAR( 1.3, mlcpSolution.x(0), epsilon); EXPECT_NEAR(-0.9, mlcpSolution.x(1), epsilon); // dofCorrection = CHt .x = ( 0 1) . ( 1.3) // ( 1 2) (-0.9) // ( 2 3) // ( 3 4) // ( 4 5) // ( 5 6) // ( 6 7) // ( 7 8) // ( 8 9) // ( 9 10) // (10 11) // (11 12) EXPECT_EQ(12, mlcpSolution.dofCorrection.rows()); EXPECT_NEAR(1.3 * 0.0 - 0.9 * 1.0, mlcpSolution.dofCorrection(0), epsilon); EXPECT_NEAR(1.3 * 1.0 - 0.9 * 2.0, mlcpSolution.dofCorrection(1), epsilon); EXPECT_NEAR(1.3 * 2.0 - 0.9 * 3.0, mlcpSolution.dofCorrection(2), epsilon); EXPECT_NEAR(1.3 * 3.0 - 0.9 * 4.0, mlcpSolution.dofCorrection(3), epsilon); EXPECT_NEAR(1.3 * 4.0 - 0.9 * 5.0, mlcpSolution.dofCorrection(4), epsilon); EXPECT_NEAR(1.3 * 5.0 - 0.9 * 6.0, mlcpSolution.dofCorrection(5), epsilon); EXPECT_NEAR(1.3 * 6.0 - 0.9 * 7.0, mlcpSolution.dofCorrection(6), epsilon); EXPECT_NEAR(1.3 * 7.0 - 0.9 * 8.0, mlcpSolution.dofCorrection(7), epsilon); EXPECT_NEAR(1.3 * 8.0 - 0.9 * 9.0, mlcpSolution.dofCorrection(8), epsilon); EXPECT_NEAR(1.3 * 9.0 - 0.9 * 10.0, mlcpSolution.dofCorrection(9), epsilon); EXPECT_NEAR(1.3 * 10.0 - 0.9 * 11.0, mlcpSolution.dofCorrection(10), epsilon); EXPECT_NEAR(1.3 * 11.0 - 0.9 * 12.0, mlcpSolution.dofCorrection(11), epsilon); { std::shared_ptr rigid; rigid = std::static_pointer_cast(m_usedRepresentations[0]); const SurgSim::Math::Vector3d& linVel = rigid->getCurrentState().getLinearVelocity(); const SurgSim::Math::Vector3d& angVel = rigid->getCurrentState().getAngularVelocity(); EXPECT_NEAR(1.3 * 0.0 - 0.9 * 1.0, linVel[0], epsilon); EXPECT_NEAR(1.3 * 1.0 - 0.9 * 2.0, linVel[1], epsilon); EXPECT_NEAR(1.3 * 2.0 - 0.9 * 3.0, linVel[2], epsilon); EXPECT_NEAR(1.3 * 3.0 - 0.9 * 4.0, angVel[0], epsilon); EXPECT_NEAR(1.3 * 4.0 - 0.9 * 5.0, angVel[1], epsilon); EXPECT_NEAR(1.3 * 5.0 - 0.9 * 6.0, angVel[2], epsilon); const SurgSim::Math::RigidTransform3d& pose = rigid->getCurrentState().getPose(); EXPECT_NEAR((1.3 * 0.0 - 0.9 * 1.0) * dt, pose.translation()[0], epsilon); EXPECT_NEAR((1.3 * 1.0 - 0.9 * 2.0) * dt, pose.translation()[1], epsilon); EXPECT_NEAR((1.3 * 2.0 - 0.9 * 3.0) * dt, pose.translation()[2], epsilon); } { std::shared_ptr rigid; rigid = std::static_pointer_cast(m_usedRepresentations[1]); const SurgSim::Math::Vector3d& linVel = rigid->getCurrentState().getLinearVelocity(); const SurgSim::Math::Vector3d& angVel = rigid->getCurrentState().getAngularVelocity(); EXPECT_NEAR(1.3 * 6.0 - 0.9 * 7.0, linVel[0], epsilon); EXPECT_NEAR(1.3 * 7.0 - 0.9 * 8.0, linVel[1], epsilon); EXPECT_NEAR(1.3 * 8.0 - 0.9 * 9.0, linVel[2], epsilon); EXPECT_NEAR(1.3 * 9.0 - 0.9 * 10.0, angVel[0], epsilon); EXPECT_NEAR(1.3 * 10.0 - 0.9 * 11.0, angVel[1], epsilon); EXPECT_NEAR(1.3 * 11.0 - 0.9 * 12.0, angVel[2], epsilon); const SurgSim::Math::RigidTransform3d& pose = rigid->getCurrentState().getPose(); EXPECT_NEAR((1.3 * 6.0 - 0.9 * 7.0) * dt, pose.translation()[0], epsilon); EXPECT_NEAR((1.3 * 7.0 - 0.9 * 8.0) * dt, pose.translation()[1], epsilon); EXPECT_NEAR((1.3 * 8.0 - 0.9 * 9.0) * dt, pose.translation()[2], epsilon); } } }; // namespace Physics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/UnitTests/RepresentationTest.cpp000066400000000000000000000224531277777236100254450ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/RigidCollisionRepresentation.h" #include "SurgSim/Physics/Representation.h" #include "SurgSim/Physics/UnitTests/MockObjects.h" using SurgSim::Physics::MockRepresentation; using SurgSim::Physics::Representation; using SurgSim::Math::Quaterniond; using SurgSim::Math::RigidTransform3d; using SurgSim::Math::Vector3d; using SurgSim::Physics::RigidCollisionRepresentation; using SurgSim::Physics::MockRepresentation; TEST(RepresentationTest, ConstructorTest) { ASSERT_NO_THROW({MockRepresentation representation;}); } TEST(RepresentationTest, SetGetAndDefaultValueTest) { /// Create the representation std::shared_ptr representation = std::make_shared(); /// Get/Set active flag [default = true] EXPECT_TRUE(representation->isActive()); representation->setLocalActive(false); ASSERT_FALSE(representation->isLocalActive()); ASSERT_FALSE(representation->isActive()); representation->setLocalActive(true); ASSERT_TRUE(representation->isLocalActive()); ASSERT_TRUE(representation->isActive()); /// Get numDof = 0 ASSERT_EQ(0u, representation->getNumDof()); /// Set/Get isGravityEnabled [default = true] EXPECT_TRUE(representation->isGravityEnabled()); representation->setIsGravityEnabled(false); ASSERT_FALSE(representation->isGravityEnabled()); representation->setIsGravityEnabled(true); ASSERT_TRUE(representation->isGravityEnabled()); /// Set/Get isDrivingSceneElementPose [default = true] EXPECT_TRUE(representation->isDrivingSceneElementPose()); representation->setIsDrivingSceneElementPose(false); ASSERT_FALSE(representation->isDrivingSceneElementPose()); representation->setIsDrivingSceneElementPose(true); ASSERT_TRUE(representation->isDrivingSceneElementPose()); } TEST(RepresentationTest, SetGetCollisionRepresentationTest) { std::shared_ptr physicsRepresentation = std::make_shared("MockRepresentation"); auto collisionRepresentation = std::make_shared("CollisionRepresentatoin"); EXPECT_NO_THROW(physicsRepresentation->setCollisionRepresentation(collisionRepresentation)); EXPECT_EQ(collisionRepresentation, physicsRepresentation->getCollisionRepresentation()); } TEST(RepresentationTest, SerializationTest) { { SCOPED_TRACE("Encode instance, decoded as shared_ptr<>"); std::shared_ptr representation = std::make_shared("MockRepresentation"); size_t numDof = 1; representation->setValue("NumDof", numDof); YAML::Node node; ASSERT_NO_THROW(node = YAML::convert::encode(*representation)); EXPECT_TRUE(node.IsMap()); EXPECT_EQ(1u, node.size()); YAML::Node data = node["SurgSim::Physics::MockRepresentation"]; EXPECT_EQ(7u, data.size()); std::shared_ptr newRepresentation; ASSERT_NO_THROW(newRepresentation = std::dynamic_pointer_cast(node.as>())); EXPECT_EQ(representation->getName(), newRepresentation->getName()); EXPECT_EQ("SurgSim::Physics::MockRepresentation", newRepresentation->getClassName()); EXPECT_TRUE(newRepresentation->getValue("IsLocalActive")); EXPECT_TRUE(newRepresentation->getValue("IsGravityEnabled")); EXPECT_TRUE(newRepresentation->getValue("IsDrivingSceneElementPose")); EXPECT_EQ(1u, newRepresentation->getValue("NumDof")); } { SCOPED_TRACE("Encode shared_ptr<>, decoded as shared_ptr<>"); std::shared_ptr representation = std::make_shared("MockRepresentation"); YAML::Node node; ASSERT_NO_THROW(node = YAML::convert>::encode(representation)); EXPECT_TRUE(node.IsMap()); EXPECT_EQ(1u, node.size()); YAML::Node data = node["SurgSim::Physics::MockRepresentation"]; EXPECT_EQ(2u, data.size()); std::shared_ptr newRepresentation; ASSERT_NO_THROW(newRepresentation = std::dynamic_pointer_cast(node.as>())); EXPECT_NE(nullptr, newRepresentation); } { SCOPED_TRACE("Test serialization for accesible boolean properties"); std::shared_ptr representation1 = std::make_shared("MockRepresentation1"); std::shared_ptr representation2 = std::make_shared("MockRepresentation2"); std::shared_ptr representation3 = std::make_shared("MockRepresentation3"); std::shared_ptr representation4 = std::make_shared("MockRepresentation4"); representation1->setValue("IsLocalActive", false); representation2->setValue("IsGravityEnabled", false); representation3->setValue("IsDrivingSceneElementPose", false); representation4->setValue("IsLocalActive", false); representation4->setValue("IsGravityEnabled", false); representation4->setValue("IsDrivingSceneElementPose", false); YAML::Node node; ASSERT_NO_THROW(node.push_back(YAML::convert::encode(*representation1))); ASSERT_NO_THROW(node.push_back(YAML::convert::encode(*representation2))); ASSERT_NO_THROW(node.push_back(YAML::convert::encode(*representation3))); ASSERT_NO_THROW(node.push_back(YAML::convert::encode(*representation4))); std::shared_ptr newRepresentation1; ASSERT_NO_THROW(newRepresentation1 = std::dynamic_pointer_cast(node[0].as>())); std::shared_ptr newRepresentation2; ASSERT_NO_THROW(newRepresentation2 = std::dynamic_pointer_cast(node[1].as>())); std::shared_ptr newRepresentation3; ASSERT_NO_THROW(newRepresentation3 = std::dynamic_pointer_cast(node[2].as>())); std::shared_ptr newRepresentation4; ASSERT_NO_THROW(newRepresentation4 = std::dynamic_pointer_cast(node[3].as>())); EXPECT_EQ(representation1->getName(), newRepresentation1->getName()); EXPECT_EQ(representation2->getName(), newRepresentation2->getName()); EXPECT_EQ(representation3->getName(), newRepresentation3->getName()); EXPECT_EQ(representation4->getName(), newRepresentation4->getName()); EXPECT_FALSE(newRepresentation1->getValue("IsLocalActive")); EXPECT_TRUE(newRepresentation1->getValue("IsGravityEnabled")); EXPECT_TRUE(newRepresentation1->getValue("IsDrivingSceneElementPose")); EXPECT_TRUE(newRepresentation2->getValue("IsLocalActive")); EXPECT_FALSE(newRepresentation2->getValue("IsGravityEnabled")); EXPECT_TRUE(newRepresentation2->getValue("IsDrivingSceneElementPose")); EXPECT_TRUE(newRepresentation3->getValue("IsLocalActive")); EXPECT_TRUE(newRepresentation3->getValue("IsGravityEnabled")); EXPECT_FALSE(newRepresentation3->getValue("IsDrivingSceneElementPose")); EXPECT_FALSE(newRepresentation4->getValue("IsLocalActive")); EXPECT_FALSE(newRepresentation4->getValue("IsGravityEnabled")); EXPECT_FALSE(newRepresentation4->getValue("IsDrivingSceneElementPose")); } } // Local class to test constraint registration. class MockRigidRepresentation : public SurgSim::Physics::RigidRepresentation { public: explicit MockRigidRepresentation(const std::string& name) : RigidRepresentation(name) {} std::shared_ptr getConstraintImplementation(SurgSim::Physics::ConstraintType type) { return RigidRepresentation::getConstraintImplementation(type); } }; TEST(RepresentationTest, ConstraintTest) { using SurgSim::Physics::ConstraintImplementation; using SurgSim::Physics::MockConstraintImplementation; auto implementation = std::make_shared(); auto representation = std::make_shared("rep"); // Test the getConstraintImplementation EXPECT_TRUE(representation->getConstraintImplementation(implementation->getConstraintType()) == nullptr); // Add the constraint implementation. ConstraintImplementation::getFactory().addImplementation(typeid(MockRigidRepresentation), implementation); // Test the getConstraintImplementation EXPECT_TRUE(representation->getConstraintImplementation(implementation->getConstraintType()) != nullptr); } opensurgsim-0.7.0/SurgSim/Physics/UnitTests/RigidCollisionRepresentationTest.cpp000066400000000000000000000224411277777236100302750ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2015, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include "SurgSim/Framework/ApplicationData.h" #include "SurgSim/Framework/BasicSceneElement.h" #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Math/MeshShape.h" #include "SurgSim/Math/BoxShape.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Math/SphereShape.h" #include "SurgSim/Physics/RigidCollisionRepresentation.h" #include "SurgSim/Physics/RigidRepresentation.h" #include "SurgSim/Framework/Runtime.h" using SurgSim::Math::RigidTransform3d; using SurgSim::Math::Vector3d; namespace { static const double dt = 0.001; const double epsilon = 1e-10; }; namespace SurgSim { namespace Physics { struct RigidCollisionRepresentationTest : public ::testing::Test { void SetUp() { m_sphereShape = std::make_shared(1.0); m_rigidRepresentation = std::make_shared("RigidRepresentation"); m_rigidRepresentation->setShape(m_sphereShape); } std::shared_ptr m_sphereShape; std::shared_ptr m_rigidCollisionRepresentation; std::shared_ptr m_rigidRepresentation; }; TEST_F(RigidCollisionRepresentationTest, InitTest) { EXPECT_NO_THROW(RigidCollisionRepresentation("TestRigidCollisionRepresentation")); EXPECT_NO_THROW(m_rigidCollisionRepresentation = std::make_shared("RigidCollisionRepresentation") ); } TEST_F(RigidCollisionRepresentationTest, SetGetRigidRepresentationTest) { m_rigidCollisionRepresentation = std::make_shared("RigidCollisionRepresentation"); ASSERT_NO_THROW(m_rigidCollisionRepresentation->setRigidRepresentation(m_rigidRepresentation)); EXPECT_EQ(m_rigidRepresentation, m_rigidCollisionRepresentation->getRigidRepresentation()); } TEST_F(RigidCollisionRepresentationTest, ShapeTest) { m_rigidCollisionRepresentation = std::make_shared("RigidCollisionRepresentation"); ASSERT_ANY_THROW(m_rigidCollisionRepresentation->getShape()); m_rigidCollisionRepresentation->setRigidRepresentation(m_rigidRepresentation); EXPECT_EQ(m_sphereShape, m_rigidCollisionRepresentation->getShape()); EXPECT_EQ(SurgSim::Math::SHAPE_TYPE_SPHERE, m_rigidCollisionRepresentation->getShapeType()); std::shared_ptr boxShape = std::make_shared(1.0, 1.0, 1.0); m_rigidCollisionRepresentation->setShape(boxShape); EXPECT_EQ(boxShape, m_rigidCollisionRepresentation->getShape()); EXPECT_EQ(SurgSim::Math::SHAPE_TYPE_BOX, m_rigidCollisionRepresentation->getShapeType()); } TEST_F(RigidCollisionRepresentationTest, PoseTest) { m_rigidCollisionRepresentation = std::make_shared("RigidCollisionRepresentation"); m_rigidCollisionRepresentation->setRigidRepresentation(m_rigidRepresentation); SurgSim::Math::Quaterniond rotation(1.0, 2.0, 3.0, 4.0); SurgSim::Math::Vector3d translation(11.0, 12.0, 13.0); SurgSim::Math::RigidTransform3d pose = SurgSim::Math::makeRigidTransform(rotation, translation); m_rigidCollisionRepresentation->setLocalPose(pose); EXPECT_TRUE(pose.isApprox(m_rigidCollisionRepresentation->getPose())); } TEST_F(RigidCollisionRepresentationTest, SerializationTest) { { SCOPED_TRACE("RigidCollisionRepresenation must have a shape."); auto rigidCollisionRepresentation = std::make_shared("CollisionRepresentation"); YAML::Node node; // Same as call YAML::convert::encode(rigidCollisionRepresentation); // Encode RigidCollisionRepresentation as reference has no problem. ASSERT_NO_THROW(node = rigidCollisionRepresentation); // Encode RigidCollisionRepresentation as concrete object will throw. // It's because RigidCollisionRepresentation::getShape() will throw // if no shape is assigned and no PhysicsRepresentation is connected. ASSERT_ANY_THROW(node = YAML::convert::encode(*rigidCollisionRepresentation)); } { SCOPED_TRACE("RigidCollisionRepresenation uses a shape directly."); auto rigidCollisionRepresentation = std::make_shared("CollisionRepresentation"); std::shared_ptr shape = std::make_shared(0.1, 0.1, 0.1); rigidCollisionRepresentation->setValue("Shape", shape); YAML::Node node; ASSERT_NO_THROW(node = YAML::convert::encode(*rigidCollisionRepresentation)); std::shared_ptr newRepresentation; ASSERT_NO_THROW(newRepresentation = std::dynamic_pointer_cast( node.as>()) ); EXPECT_EQ("SurgSim::Physics::RigidCollisionRepresentation", newRepresentation->getClassName()); auto boxShape = std::dynamic_pointer_cast(shape); auto newBoxShape = std::dynamic_pointer_cast( newRepresentation->getValue>("Shape")); ASSERT_NE(nullptr, newBoxShape); EXPECT_EQ(boxShape->getType(), newRepresentation->getShapeType()); EXPECT_TRUE(boxShape->getSize().isApprox(newBoxShape->getSize())); EXPECT_TRUE(boxShape->getCenter().isApprox(newBoxShape->getCenter())); EXPECT_TRUE(boxShape->getSecondMomentOfVolume().isApprox(newBoxShape->getSecondMomentOfVolume())); EXPECT_DOUBLE_EQ(boxShape->getVolume(), newBoxShape->getVolume()); } { SCOPED_TRACE("RigidCollisionRepresenation uses the shape in PhysicsRepresentation."); auto rigidCollisionRepresentation = std::make_shared("CollisionRepresentation"); m_rigidRepresentation->setCollisionRepresentation(rigidCollisionRepresentation); YAML::Node node; ASSERT_NO_THROW(node = YAML::convert::encode(*rigidCollisionRepresentation)); std::shared_ptr newRepresentation; ASSERT_NO_THROW(newRepresentation = std::dynamic_pointer_cast( node.as>()) ); EXPECT_EQ("SurgSim::Physics::RigidCollisionRepresentation", newRepresentation->getClassName()); EXPECT_EQ(m_sphereShape->getType(), newRepresentation->getShapeType()); auto newShpereShape = std::dynamic_pointer_cast( newRepresentation->getValue>("Shape")); ASSERT_NE(nullptr, newShpereShape); EXPECT_TRUE(m_sphereShape->getCenter().isApprox(newShpereShape->getCenter())); EXPECT_TRUE(m_sphereShape->getSecondMomentOfVolume().isApprox(newShpereShape->getSecondMomentOfVolume())); EXPECT_DOUBLE_EQ(m_sphereShape->getVolume(), newShpereShape->getVolume()); EXPECT_DOUBLE_EQ(m_sphereShape->getRadius(), newShpereShape->getRadius()); } } TEST_F(RigidCollisionRepresentationTest, GetPosedShape) { auto runtime = std::make_shared("config.txt"); const std::string fileName = "Geometry/staple_collision.ply"; auto mesh = std::make_shared(); EXPECT_NO_THROW(mesh->load(fileName)); auto originalMesh = std::make_shared(*mesh); auto expectedMesh = std::make_shared(*mesh); auto collisionRepresentation = std::make_shared("Collision"); auto physicsRepresentation = std::make_shared("Physics"); physicsRepresentation->setDensity(8050); // Stainless steel (in Kg.m-3) physicsRepresentation->setShape(originalMesh); physicsRepresentation->setCollisionRepresentation(collisionRepresentation); collisionRepresentation->update(dt); auto actualMesh = std::static_pointer_cast(collisionRepresentation->getPosedShape()); EXPECT_EQ(expectedMesh->getVertices(), actualMesh->getVertices()); EXPECT_EQ(expectedMesh->getTriangles(), actualMesh->getTriangles()); RigidTransform3d transform = SurgSim::Math::makeRigidTransform(Vector3d(4.3, 2.1, 6.5), Vector3d(-1.5, 7.5, -2.5), Vector3d(8.7, -4.7, -3.1)); collisionRepresentation->setLocalPose(transform); collisionRepresentation->update(dt); actualMesh = std::static_pointer_cast(collisionRepresentation->getPosedShape()); expectedMesh->transform(transform); expectedMesh->update(); EXPECT_EQ(expectedMesh->getVertices(), actualMesh->getVertices()); EXPECT_EQ(expectedMesh->getTriangles(), actualMesh->getTriangles()); } } // namespace Physics } // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/UnitTests/RigidConstraintFixedPointTests.cpp000066400000000000000000000144671277777236100277310ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Math/Matrix.h" #include "SurgSim/Math/MlcpConstraintType.h" #include "SurgSim/Math/SphereShape.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/ConstraintData.h" #include "SurgSim/Physics/Representation.h" #include "SurgSim/Physics/RigidConstraintFixedPoint.h" #include "SurgSim/Physics/RigidRepresentation.h" #include "SurgSim/Physics/UnitTests/EigenGtestAsserts.h" #include "SurgSim/Physics/UnitTests/MockObjects.h" using SurgSim::Math::makeSkewSymmetricMatrix; using SurgSim::Math::makeRigidTransform; using SurgSim::Math::Quaterniond; using SurgSim::Math::RigidTransform3d; using SurgSim::Math::Vector3d; namespace { const double epsilon = 1e-10; const double dt = 1e-3; }; namespace SurgSim { namespace Physics { TEST(RigidConstraintFixedPointTests, Constructor) { ASSERT_NO_THROW( { RigidConstraintFixedPoint constraint; }); } TEST(RigidConstraintFixedPointTests, Constants) { RigidConstraintFixedPoint constraint; EXPECT_EQ(SurgSim::Physics::FIXED_3DPOINT, constraint.getConstraintType()); EXPECT_EQ(3u, constraint.getNumDof()); } TEST(RigidConstraintFixedPointTests, BuildMlcp) { // Whitebox test which validates ConstraintImplementation::build's output parameter, MlcpPhysicsProblem. It assumes // CHt and HCHt can be correctly built given H, so it does not neccessarily construct the physical parameters // neccessary to supply a realistic C. It only checks H and b. RigidConstraintFixedPoint constraint; Vector3d centerOfMass = Vector3d(3.0, 2.42, 9.54); Quaterniond objectRotation = Quaterniond(0.1, 0.35, 4.2, 5.0).normalized(); RigidTransform3d objectPose = makeRigidTransform(objectRotation, centerOfMass); Vector3d constraintPoint = Vector3d(8.0, 6.4, 3.5); // Setup parameters for RigidConstraintFixedPoint::build auto representation = std::make_shared(); representation->setShape(std::make_shared(1.0)); auto localization = std::make_shared(representation); localization->setLocalPosition(objectPose.inverse() * constraintPoint); representation->getCurrentState().setPose(objectPose); MlcpPhysicsProblem mlcpPhysicsProblem = MlcpPhysicsProblem::Zero(6, 3, 1); ConstraintData emptyConstraint; ASSERT_NO_THROW(constraint.build( dt, emptyConstraint, localization, &mlcpPhysicsProblem, 0, 0, SurgSim::Physics::CONSTRAINT_POSITIVE_SIDE)); // Compare results Eigen::Matrix violation = constraintPoint; EXPECT_NEAR_EIGEN(violation, mlcpPhysicsProblem.b, epsilon); Eigen::Matrix H = Eigen::Matrix::Zero(); Eigen::Matrix identity = Eigen::Matrix::Identity(); SurgSim::Math::setSubMatrix(dt * identity, 0, 0, 3, 3, &H); SurgSim::Math::setSubMatrix(makeSkewSymmetricMatrix((dt * (constraintPoint - centerOfMass)).eval()), 0, 1, 3, 3, &H); EXPECT_NEAR_EIGEN(H, mlcpPhysicsProblem.H, epsilon); EXPECT_EQ(0u, mlcpPhysicsProblem.constraintTypes.size()); } TEST(RigidConstraintFixedPointTests, BuildMlcpTwoStep) { // Whitebox test which validates ConstraintImplementation::build's output parameter, MlcpPhysicsProblem. It assumes // CHt and HCHt can be correctly built given H, so it does not neccessarily construct the physical parameters // neccessary to supply a realistic C. It only checks H and b. RigidConstraintFixedPoint constraint; Vector3d centerOfMassLhs = Vector3d(3.0, 2.42, 9.54); Vector3d centerOfMassRhs = Vector3d(1.0, 24.52, 8.00); Quaterniond objectRotationLhs = Quaterniond(0.1, 0.35, 4.2, 5.0).normalized(); Quaterniond objectRotationRhs = Quaterniond(1.43, 6.21, 7.11, 0.55).normalized(); RigidTransform3d objectPoseLhs = makeRigidTransform(objectRotationLhs, centerOfMassLhs); RigidTransform3d objectPoseRhs = makeRigidTransform(objectRotationRhs, centerOfMassRhs); Vector3d constraintPointLhs = Vector3d(8.0, 6.4, 3.5); Vector3d constraintPointRhs = Vector3d(3.0, 7.7, 0.0); // Setup parameters for RigidConstraintFixedPoint::build MlcpPhysicsProblem mlcpPhysicsProblem = MlcpPhysicsProblem::Zero(12, 3, 1); ConstraintData emptyConstraint; auto representation = std::make_shared(); representation->setShape(std::make_shared(1.0)); auto localization = std::make_shared(representation); localization->setLocalPosition(objectPoseLhs.inverse() * constraintPointLhs); representation->getCurrentState().setPose(objectPoseLhs); ASSERT_NO_THROW(constraint.build( dt, emptyConstraint, localization, &mlcpPhysicsProblem, 0, 0, SurgSim::Physics::CONSTRAINT_POSITIVE_SIDE)); localization->setLocalPosition(objectPoseRhs.inverse() * constraintPointRhs); representation->getCurrentState().setPose(objectPoseRhs); ASSERT_NO_THROW(constraint.build( dt, emptyConstraint, localization, &mlcpPhysicsProblem, 6, 0, SurgSim::Physics::CONSTRAINT_NEGATIVE_SIDE)); // Compare results Eigen::Matrix violation = constraintPointLhs - constraintPointRhs; EXPECT_NEAR_EIGEN(violation, mlcpPhysicsProblem.b, epsilon); Eigen::Matrix H = Eigen::Matrix::Zero(); Eigen::Matrix identity = Eigen::Matrix::Identity(); SurgSim::Math::setSubMatrix(dt * identity, 0, 0, 3, 3, &H); SurgSim::Math::setSubMatrix(makeSkewSymmetricMatrix((dt * (constraintPointLhs - centerOfMassLhs)).eval()), 0, 1, 3, 3, &H); SurgSim::Math::setSubMatrix(-dt * identity, 0, 2, 3, 3, &H); SurgSim::Math::setSubMatrix(makeSkewSymmetricMatrix((-dt * (constraintPointRhs - centerOfMassRhs)).eval()), 0, 3, 3, 3, &H); EXPECT_NEAR_EIGEN(H, mlcpPhysicsProblem.H, epsilon); } }; // namespace Physics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/UnitTests/RigidConstraintFixedRotationVectorTests.cpp000066400000000000000000000103251277777236100316070ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Math/Matrix.h" #include "SurgSim/Math/MlcpConstraintType.h" #include "SurgSim/Math/SphereShape.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/RotationVectorConstraintData.h" #include "SurgSim/Physics/Representation.h" #include "SurgSim/Physics/RigidConstraintFixedRotationVector.h" #include "SurgSim/Physics/RigidRepresentation.h" #include "SurgSim/Physics/UnitTests/EigenGtestAsserts.h" #include "SurgSim/Physics/UnitTests/MockObjects.h" using SurgSim::Math::makeSkewSymmetricMatrix; using SurgSim::Math::makeRigidTransform; using SurgSim::Math::Quaterniond; using SurgSim::Math::RigidTransform3d; using SurgSim::Math::Vector3d; namespace { const double epsilon = 1e-10; const double dt = 1e-3; }; namespace SurgSim { namespace Physics { TEST(RigidConstraintFixedRotationVectorTests, Constructor) { ASSERT_NO_THROW( { RigidConstraintFixedRotationVector constraint; }); } TEST(RigidConstraintFixedRotationVectorTests, Constants) { RigidConstraintFixedRotationVector constraint; EXPECT_EQ(SurgSim::Physics::FIXED_3DROTATION_VECTOR, constraint.getConstraintType()); EXPECT_EQ(3u, constraint.getNumDof()); } TEST(RigidConstraintFixedRotationVectorTests, BuildMlcp) { using SurgSim::Framework::Runtime; RigidConstraintFixedRotationVector constraint; // Prepare the fem1d representation for this constraint type auto fem1d = std::make_shared("fem1d"); auto initialState = std::make_shared(); initialState->setNumDof(6, 2); initialState->getPositions().setZero(); initialState->getPositions().segment<3>(6) = SurgSim::Math::Vector3d(1.0, 0.0, 0.0); fem1d->setInitialState(initialState); std::array nodeIds = { { 0, 1 } }; auto beam = std::make_shared(nodeIds); beam->setMassDensity(900); beam->setPoissonRatio(0.4); beam->setRadius(0.1); beam->setShearingEnabled(false); beam->setYoungModulus(1e6); fem1d->addFemElement(beam); fem1d->initialize(std::make_shared()); // Initializes the beams initial rotation matrix // Prepare the rigid representation for this constraint type auto representation = std::make_shared(); representation->setShape(std::make_shared(1.0)); Vector3d centerOfMass = Vector3d(3.0, 2.42, 9.54); Quaterniond objectRotation = Quaterniond(0.1, 0.35, 4.2, 5.0).normalized(); RigidTransform3d objectPose = makeRigidTransform(objectRotation, centerOfMass); representation->getCurrentState().setPose(objectPose); auto localization = std::make_shared(representation); localization->setLocalPosition(objectPose.inverse() * Vector3d(8.0, 6.4, 3.5)); // Prepare the specific constraint data RotationVectorRigidFem1DConstraintData constraintData; constraintData.setFem1DRotation(fem1d, 0); constraintData.setRigidOrFixedRotation(representation, representation->getPose().linear()); MlcpPhysicsProblem mlcpPhysicsProblem = MlcpPhysicsProblem::Zero(6, 3, 1); ASSERT_NO_THROW(constraint.build( dt, constraintData, localization, &mlcpPhysicsProblem, 0, 0, SurgSim::Physics::CONSTRAINT_POSITIVE_SIDE)); // Compare results Eigen::AngleAxisd aa(objectRotation); Eigen::Matrix violation = aa.axis() * aa.angle(); EXPECT_NEAR_EIGEN(violation, mlcpPhysicsProblem.b, epsilon); Eigen::Matrix H = Eigen::Matrix::Zero(); EXPECT_NEAR_EIGEN(H, mlcpPhysicsProblem.H, epsilon); EXPECT_EQ(0u, mlcpPhysicsProblem.constraintTypes.size()); } }; // namespace Physics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/UnitTests/RigidConstraintFrictionlessContactTests.cpp000066400000000000000000000066701277777236100316350ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include "SurgSim/Physics/Constraint.h" #include "SurgSim/Physics/ConstraintData.h" #include "SurgSim/Physics/ContactConstraintData.h" #include "SurgSim/Physics/MlcpPhysicsProblem.h" #include "SurgSim/Physics/RigidConstraintFrictionlessContact.h" #include "SurgSim/Physics/RigidRepresentation.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/SphereShape.h" #include "SurgSim/Math/Vector.h" using SurgSim::Math::SphereShape; using SurgSim::Math::Vector3d; namespace { const double epsilon = 1e-10; }; namespace SurgSim { namespace Physics { TEST (RigidConstraintFrictionlessContactTests, SetGet_BuildMlcp_Test) { Vector3d n(0.0, 1.0, 0.0); double d = 0.0; double radius = 0.01; double violation = -radius; Vector3d contactPosition = -n * (d - violation); SurgSim::Math::RigidTransform3d poseRigid; poseRigid.setIdentity(); std::shared_ptr rigid = std::make_shared("Rigid"); rigid->setLocalActive(true); rigid->setIsGravityEnabled(false); rigid->setLocalPose(poseRigid); rigid->setDensity(1000.0); rigid->setShape(std::make_shared(radius)); auto loc = std::make_shared(rigid); loc->setLocalPosition(contactPosition); std::shared_ptr implementation = std::make_shared(); EXPECT_EQ(SurgSim::Physics::FRICTIONLESS_3DCONTACT, implementation->getConstraintType()); EXPECT_EQ(1u, implementation->getNumDof()); ContactConstraintData constraintData; constraintData.setPlaneEquation(n, d); MlcpPhysicsProblem mlcpPhysicsProblem = MlcpPhysicsProblem::Zero(rigid->getNumDof(), 1, 1); // Fill up the Mlcp double dt = 1e-3; implementation->build(dt, constraintData, loc, &mlcpPhysicsProblem, 0, 0, SurgSim::Physics::CONSTRAINT_POSITIVE_SIDE); // Violation b should be exactly violation = -radius (the sphere center is on the plane) EXPECT_NEAR(violation, mlcpPhysicsProblem.b[0], epsilon); // Constraint H should be // H = dt.[nx ny nz nz.GPy-ny.GPz nx.GPz-nz.GPx ny.GPx-nx.GPy] Vector3d n_GP = n.cross(Vector3d(0.0, 0.0, 0.0)); SurgSim::Math::Matrix h = mlcpPhysicsProblem.H; EXPECT_NEAR(dt * n[0] , h(0, 0), epsilon); EXPECT_NEAR(dt * n[1] , h(0, 1), epsilon); EXPECT_NEAR(dt * n[2] , h(0, 2), epsilon); EXPECT_NEAR(dt * n_GP[0], h(0, 3), epsilon); EXPECT_NEAR(dt * n_GP[1], h(0, 4), epsilon); EXPECT_NEAR(dt * n_GP[2], h(0, 5), epsilon); // ConstraintTypes should contain 0 entry as it is setup by the constraint and not the ConstraintImplementation // This way, the constraint can verify that both ConstraintImplementation are the same type ASSERT_EQ(0u, mlcpPhysicsProblem.constraintTypes.size()); } }; // namespace Physics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/UnitTests/RigidLocalizationTest.cpp000066400000000000000000000146551277777236100260570ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include #include "SurgSim/Math/Vector.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Physics/FixedRepresentation.h" #include "SurgSim/Physics/RigidLocalization.h" #include "SurgSim/Physics/RigidRepresentation.h" #include "SurgSim/Physics/UnitTests/MockObjects.h" using SurgSim::Physics::MockFixedRepresentation; using SurgSim::Physics::MockRigidRepresentation; using SurgSim::Physics::RigidRepresentation; using SurgSim::Physics::RigidLocalization; namespace { const double epsilon = 1e-10; }; class RigidLocalizationTest : public ::testing::Test { public: void SetUp() { SurgSim::Math::Quaterniond q; SurgSim::Math::Vector3d t; q.coeffs().setRandom(); q.normalize(); t.setRandom(); m_initialTransformation = SurgSim::Math::makeRigidTransform(q, t); do { q.coeffs().setRandom(); q.normalize(); t.setRandom(); m_currentTransformation = SurgSim::Math::makeRigidTransform(q, t); } while (m_initialTransformation.isApprox(m_currentTransformation)); m_identityTransformation.setIdentity(); } void TearDown() { } // Fixed representation initialization pose SurgSim::Math::RigidTransform3d m_initialTransformation; // Fixed representation current pose SurgSim::Math::RigidTransform3d m_currentTransformation; // Identity pose (no translation/rotation) SurgSim::Math::RigidTransform3d m_identityTransformation; }; TEST_F(RigidLocalizationTest, ConstructorTest) { ASSERT_NO_THROW( {RigidLocalization rigidRepresentationLoc;}); ASSERT_NO_THROW( { std::shared_ptr rigid = std::make_shared("RigidRepresentation"); RigidLocalization rigidRepresentationLoc(rigid); }); } TEST_F(RigidLocalizationTest, SetGetRepresentation) { RigidLocalization rigidRepresentationLoc; std::shared_ptr rigid = std::make_shared("RigidRepresentation"); EXPECT_EQ(nullptr, rigidRepresentationLoc.getRepresentation()); rigidRepresentationLoc.setRepresentation(rigid); EXPECT_EQ(rigid, rigidRepresentationLoc.getRepresentation()); rigidRepresentationLoc.setRepresentation(nullptr); EXPECT_EQ(nullptr, rigidRepresentationLoc.getRepresentation()); } TEST_F(RigidLocalizationTest, CalculatePosition) { // Create the rigid body std::shared_ptr rigidRepresentation = std::make_shared(); // Activate the rigid body and setup its initial pose rigidRepresentation->setLocalActive(true); rigidRepresentation->getCurrentState().setPose(m_initialTransformation); RigidLocalization localization = RigidLocalization(rigidRepresentation); ASSERT_EQ(rigidRepresentation, localization.getRepresentation()); SurgSim::Math::Vector3d origin = m_initialTransformation.translation(); SurgSim::Math::Vector3d zero = SurgSim::Math::Vector3d::Zero(); localization.setLocalPosition(zero); EXPECT_TRUE(localization.getLocalPosition().isZero(epsilon)); EXPECT_TRUE(localization.calculatePosition().isApprox(origin, epsilon)); SurgSim::Math::Vector3d position = SurgSim::Math::Vector3d::Random(); localization.setLocalPosition(position); EXPECT_TRUE(localization.getLocalPosition().isApprox(position, epsilon)); EXPECT_FALSE(localization.calculatePosition().isApprox(origin, epsilon)); // Out-Of-Range assertions EXPECT_THROW(localization.calculatePosition(-0.01), SurgSim::Framework::AssertionFailure); EXPECT_THROW(localization.calculatePosition(1.01), SurgSim::Framework::AssertionFailure); } TEST_F(RigidLocalizationTest, CalculateVelocity) { // Create the rigid body std::shared_ptr rigidRepresentation = std::make_shared(); // Activate the rigid body and setup its initial pose rigidRepresentation->setLocalActive(true); rigidRepresentation->getCurrentState().setPose(m_initialTransformation); RigidLocalization localization = RigidLocalization(rigidRepresentation); ASSERT_EQ(rigidRepresentation, localization.getRepresentation()); SurgSim::Math::Vector3d origin = m_initialTransformation.translation(); SurgSim::Math::Vector3d zero = SurgSim::Math::Vector3d::Zero(); localization.setLocalPosition(zero); EXPECT_TRUE(localization.getLocalPosition().isZero(epsilon)); EXPECT_TRUE(localization.calculatePosition().isApprox(origin, epsilon)); SurgSim::Math::Vector3d position = SurgSim::Math::Vector3d::Random(); localization.setLocalPosition(position); EXPECT_TRUE(localization.getLocalPosition().isApprox(position, epsilon)); EXPECT_FALSE(localization.calculatePosition().isApprox(origin, epsilon)); // Out-Of-Range assertions EXPECT_THROW(localization.calculateVelocity(-0.01), SurgSim::Framework::AssertionFailure); EXPECT_THROW(localization.calculateVelocity(1.01), SurgSim::Framework::AssertionFailure); } TEST_F(RigidLocalizationTest, FixedRepresentation) { // Create the rigid body auto fixedRepresentation = std::make_shared(); // Activate the rigid body and setup its initial pose fixedRepresentation->setLocalActive(true); fixedRepresentation->getCurrentState().setPose(m_initialTransformation); RigidLocalization localization = RigidLocalization(fixedRepresentation); ASSERT_EQ(fixedRepresentation, localization.getRepresentation()); SurgSim::Math::Vector3d origin = m_initialTransformation.translation(); SurgSim::Math::Vector3d zero = SurgSim::Math::Vector3d::Zero(); localization.setLocalPosition(zero); EXPECT_TRUE(localization.getLocalPosition().isZero(epsilon)); EXPECT_TRUE(localization.calculatePosition().isApprox(origin, epsilon)); SurgSim::Math::Vector3d position = SurgSim::Math::Vector3d::Random(); localization.setLocalPosition(position); EXPECT_TRUE(localization.getLocalPosition().isApprox(position, epsilon)); EXPECT_FALSE(localization.calculatePosition().isApprox(origin, epsilon)); } opensurgsim-0.7.0/SurgSim/Physics/UnitTests/RigidRepresentationTest.cpp000066400000000000000000001235301277777236100264220ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include "SurgSim/DataStructures/Location.h" #include "SurgSim/DataStructures/BufferedValue.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Math/Matrix.h" #include "SurgSim/Math/MeshShape.h" #include "SurgSim/Math/OdeState.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/PlaneShape.h" #include "SurgSim/Math/Shape.h" #include "SurgSim/Math/SphereShape.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Math/Valid.h" #include "SurgSim/Physics/Localization.h" #include "SurgSim/Physics/RigidCollisionRepresentation.h" #include "SurgSim/Physics/RigidRepresentation.h" using SurgSim::DataStructures::Location; using SurgSim::Framework::Component; using SurgSim::Framework::Runtime; using SurgSim::Math::Matrix33d; using SurgSim::Math::Matrix66d; using SurgSim::Math::makeRigidTransform; using SurgSim::Math::Quaterniond; using SurgSim::Math::PlaneShape; using SurgSim::Math::RigidTransform3d; using SurgSim::Math::Shape; using SurgSim::Math::SphereShape; using SurgSim::Math::Vector3d; using SurgSim::Math::Vector6d; namespace { const double epsilon = 1e-10; } namespace SurgSim { namespace Physics { class RigidRepresentationTest : public ::testing::Test { public: void SetUp() { m_dt = 1e-3; m_radius = 0.1; m_density = 9000.0; m_mass = 4.0 / 3.0 * M_PI * m_radius * m_radius * m_radius * m_density; double coef = 2.0 / 5.0 * m_mass * m_radius * m_radius; m_inertia << coef, 0.0, 0.0, 0.0, coef, 0.0, 0.0, 0.0, coef; m_id33.setIdentity(); m_zero33.setZero(); m_invalidInertia.setRandom(); m_invalidInertia = m_invalidInertia + m_invalidInertia.transpose().eval(); // make symmetric m_invalidInertia(0, 0) = -12.3; // Negative value on hte diagonal (invalid) m_sphere = std::make_shared(m_radius); Quaterniond q(0.5, 0.4, 0.3, 0.2); q.normalize(); Vector3d t(1.2, 2.1, 12.21); m_state.setAngularVelocity(Vector3d(1, 2, 3)); m_state.setLinearVelocity(Vector3d(3, 2, 1)); m_state.setPose(SurgSim::Math::makeRigidTransform(q, t)); m_maxNumSimulationStepTest = 100; } void TearDown() { } // Time step double m_dt; // Sphere radius (in m) double m_radius; // Sphere density (in Kg.m-3) double m_density; // Sphere mass (in Kg) double m_mass; // Sphere inertia matrix SurgSim::Math::Matrix33d m_inertia; // Identity matrix 3x3 (for convenience) SurgSim::Math::Matrix33d m_id33; // Zero matrix 3x3 (for convenience) SurgSim::Math::Matrix33d m_zero33; // Invalid inertia matrix SurgSim::Math::Matrix33d m_invalidInertia; // SphereShape std::shared_ptr m_sphere; // Rigid representation state RigidState m_state; // Rigid representation default state RigidState m_defaultState; // Max number of simulation step for testing int m_maxNumSimulationStepTest; }; TEST_F(RigidRepresentationTest, ConstructorTest) { ASSERT_NO_THROW(RigidRepresentation rigidBody("Rigid")); } TEST_F(RigidRepresentationTest, ResetTest) { // Create the rigid body std::shared_ptr rigidBody = std::make_shared("Rigid"); rigidBody->setInitialState(m_state); rigidBody->setLocalActive(false); rigidBody->setIsGravityEnabled(false); rigidBody->setLocalPose(RigidTransform3d::Identity()); // reset the representation state rigidBody->resetState(); // isActive unchanged EXPECT_FALSE(rigidBody->isActive()); // isGravityEnable flag unchanged EXPECT_FALSE(rigidBody->isGravityEnabled()); // current state = initial state EXPECT_TRUE(rigidBody->getInitialState() == rigidBody->getCurrentState()); // previous state = initial state EXPECT_TRUE(rigidBody->getInitialState() == rigidBody->getPreviousState()); } TEST_F(RigidRepresentationTest, SetGetAndDefaultValueTest) { // Create the rigid body std::shared_ptr rigidBody = std::make_shared("Rigid"); // Get state (current, initial) EXPECT_TRUE(m_defaultState == rigidBody->getCurrentState()); EXPECT_TRUE(m_defaultState == rigidBody->getPreviousState()); EXPECT_TRUE(m_defaultState == rigidBody->getInitialState()); rigidBody->setInitialState(m_state); EXPECT_TRUE(m_state == rigidBody->getInitialState()); EXPECT_TRUE(m_state == rigidBody->getCurrentState()); EXPECT_TRUE(m_state == rigidBody->getPreviousState()); // Mass density [default = 0] EXPECT_NEAR(0.0, rigidBody->getDensity(), epsilon); // Mass [default = qNaA] EXPECT_FALSE(SurgSim::Math::isValid(rigidBody->getMass())); // Inertia 3x3 symmetric matrix [default = qNaN values] EXPECT_FALSE(SurgSim::Math::isValid(rigidBody->getLocalInertia())); // Linear damping [default = 0] EXPECT_NEAR(0.0, rigidBody->getLinearDamping(), epsilon); // Angular damping [default = 0] EXPECT_NEAR(0.0, rigidBody->getAngularDamping(), epsilon); // Shape [default = nullptr] EXPECT_EQ(nullptr, rigidBody->getShape()); // Mass density rigidBody->setDensity(m_density); EXPECT_NEAR(m_density, rigidBody->getDensity(), epsilon); rigidBody->setDensity(0.0); EXPECT_NEAR(0.0, rigidBody->getDensity(), epsilon); // Linear damping rigidBody->setLinearDamping(5.5); EXPECT_NEAR(5.5, rigidBody->getLinearDamping(), epsilon); rigidBody->setLinearDamping(0.0); EXPECT_NEAR(0.0, rigidBody->getLinearDamping(), epsilon); // Angular damping rigidBody->setAngularDamping(5.5); EXPECT_NEAR(5.5, rigidBody->getAngularDamping(), epsilon); rigidBody->setAngularDamping(0.0); EXPECT_NEAR(0.0, rigidBody->getAngularDamping(), epsilon); // Shape rigidBody->setShape(m_sphere); EXPECT_EQ(m_sphere, rigidBody->getShape()); rigidBody->setShape(nullptr); EXPECT_EQ(nullptr, rigidBody->getShape()); // Get/Set active flag [default = true] EXPECT_TRUE(rigidBody->isActive()); EXPECT_TRUE(rigidBody->isLocalActive()); rigidBody->setLocalActive(false); ASSERT_FALSE(rigidBody->isActive()); ASSERT_FALSE(rigidBody->isLocalActive()); rigidBody->setLocalActive(true); ASSERT_TRUE(rigidBody->isActive()); ASSERT_TRUE(rigidBody->isLocalActive()); // Get numDof = 6 ASSERT_EQ(6u, rigidBody->getNumDof()); // Set/Get isGravityEnabled [default = true] EXPECT_TRUE(rigidBody->isGravityEnabled()); rigidBody->setIsGravityEnabled(false); ASSERT_FALSE(rigidBody->isGravityEnabled()); rigidBody->setIsGravityEnabled(true); ASSERT_TRUE(rigidBody->isGravityEnabled()); } TEST_F(RigidRepresentationTest, AddExternalGeneralizedForceOnMassCenterTest) { std::shared_ptr rigidBody = std::make_shared("Rigid"); rigidBody->setShape(m_sphere); Vector6d F = 6.4 * Vector6d::Ones(); Matrix66d K = 0.4 * Matrix66d::Ones() + 8.3 * Matrix66d::Identity(); Matrix66d D = -0.6 * Matrix66d::Ones() + 4.1 * Matrix66d::Identity(); rigidBody->addExternalGeneralizedForce(F, K, D); EXPECT_TRUE(rigidBody->getExternalGeneralizedForce().unsafeGet().isApprox(F)); EXPECT_TRUE(rigidBody->getExternalGeneralizedStiffness().isApprox(K)); EXPECT_TRUE(rigidBody->getExternalGeneralizedDamping().isApprox(D)); } namespace { // Extra force/torque that should be added Vector6d computeExtraTorque(const Vector6d& inputForce, const Vector3d& anchorLocalPoint, const Vector6d& dofPosition, const Vector6d& dofVelocity) { Vector6d f = inputForce; auto C = dofPosition.segment<3>(0); // Mass center auto rotVector = dofPosition.segment<3>(3); // Rotation vector double angle; Vector3d axis = rotVector; angle = axis.norm(); if (std::abs(angle) < 1e-8) { axis.setZero(); } else { axis.normalize(); } Matrix33d R = SurgSim::Math::makeRotationMatrix(angle, axis); Vector3d anchorPoint = C + R * anchorLocalPoint; Vector3d lever = anchorPoint - C; f.segment<3>(3) += lever.cross(f.segment<3>(0)); return f; } Matrix66d computeExtraStiffness(const Vector6d& inputForce, const Vector3d& anchorLocalPoint, const Vector6d& dofPosition, const Vector6d& dofVelocity) { Matrix66d K = Matrix66d::Zero(); const double epsilon = 1e-8; for (size_t column = 0; column < 6; ++column) { Vector6d dofX = dofPosition; dofX[column] += 2.0 * epsilon; Vector6d fXPlus2H = computeExtraTorque(inputForce, anchorLocalPoint, dofX, dofVelocity); dofX = dofPosition; dofX[column] += epsilon; Vector6d fXPlusH = computeExtraTorque(inputForce, anchorLocalPoint, dofX, dofVelocity); dofX = dofPosition; dofX[column] -= epsilon; Vector6d fXMinusH = computeExtraTorque(inputForce, anchorLocalPoint, dofX, dofVelocity); dofX = dofPosition; dofX[column] -= 2.0 * epsilon; Vector6d fXMinus2H = computeExtraTorque(inputForce, anchorLocalPoint, dofX, dofVelocity); K.col(column) = - (-fXPlus2H + 8.0 * fXPlusH - 8.0 * fXMinusH + fXMinus2H) / (12.0 * epsilon); } return K; } Matrix66d computeExtraDamping(const Vector6d& inputForce, const Vector3d& anchorLocalPoint, const Vector6d& dofPosition, const Vector6d& dofVelocity) { Matrix66d D = Matrix66d::Zero(); const double epsilon = 1e-8; for (size_t column = 0; column < 6; ++column) { Vector6d dofV = dofVelocity; dofV[column] += 2.0 * epsilon; Vector6d fXPlus2H = computeExtraTorque(inputForce, anchorLocalPoint, dofPosition, dofV); dofV = dofVelocity; dofV[column] += epsilon; Vector6d fXPlusH = computeExtraTorque(inputForce, anchorLocalPoint, dofPosition, dofV); dofV = dofVelocity; dofV[column] -= epsilon; Vector6d fXMinusH = computeExtraTorque(inputForce, anchorLocalPoint, dofPosition, dofV); dofV = dofVelocity; dofV[column] -= 2.0 * epsilon; Vector6d fXMinus2H = computeExtraTorque(inputForce, anchorLocalPoint, dofPosition, dofV); D.col(column) = - (-fXPlus2H + 8.0 * fXPlusH - 8.0 * fXMinusH + fXMinus2H) / (12.0 * epsilon); } return D; } }; // namespace anonymous TEST_F(RigidRepresentationTest, AddExternalGeneralizedForceExtraTermsTest) { { SCOPED_TRACE("Non identity pose"); Eigen::AngleAxisd angleAxis(0.34512, Vector3d(1.1, -1.4, 3.23).normalized()); Vector3d t(1.1, 2.2, 3.3); RigidTransform3d transform = makeRigidTransform(Quaterniond(angleAxis), t); Vector6d inputForce = Vector6d::LinSpaced(1.1, 6.6); Vector6d dofX = Vector6d::Zero(); dofX.segment<3>(0) = transform.translation(); Eigen::AngleAxisd angleAxis2(transform.rotation()); dofX.segment<3>(3) = angleAxis2.axis() * angleAxis2.angle(); Vector6d dofV = Vector6d::Zero(); Vector3d anchorLocalPoint = Vector3d::Ones(); std::shared_ptr rigidBody = std::make_shared("Rigid"); rigidBody->setShape(m_sphere); SurgSim::Physics::RigidState initialState; initialState.setPose(transform); rigidBody->setInitialState(initialState); SurgSim::DataStructures::Location location(anchorLocalPoint); Vector6d Fnumeric = computeExtraTorque(inputForce, anchorLocalPoint, dofX, dofV); Matrix66d Knumeric = computeExtraStiffness(inputForce, anchorLocalPoint, dofX, dofV); Matrix66d Dnumeric = computeExtraDamping(inputForce, anchorLocalPoint, dofX, dofV); Vector6d F = inputForce; Matrix66d K = Matrix66d::Zero(), D = Matrix66d::Zero(); rigidBody->addExternalGeneralizedForce(location, F, K, D); F = rigidBody->getExternalGeneralizedForce().unsafeGet(); K = rigidBody->getExternalGeneralizedStiffness(); D = rigidBody->getExternalGeneralizedDamping(); EXPECT_LE((F - Fnumeric).cwiseAbs().maxCoeff(), 2e-7); EXPECT_LE((K - Knumeric).cwiseAbs().maxCoeff(), 2e-7); EXPECT_LE((D - Dnumeric).cwiseAbs().maxCoeff(), 2e-7); } { SCOPED_TRACE("Exactly Identity pose"); Vector6d inputForce = Vector6d::LinSpaced(1.1, 6.6); Vector6d dofX = Vector6d::Zero(); Vector6d dofV = Vector6d::Zero(); Vector3d anchorLocalPoint = Vector3d::Ones(); std::shared_ptr rigidBody = std::make_shared("Rigid"); rigidBody->setShape(m_sphere); SurgSim::DataStructures::Location location(anchorLocalPoint); Vector6d Fnumeric = computeExtraTorque(inputForce, anchorLocalPoint, dofX, dofV); Matrix66d Knumeric = computeExtraStiffness(inputForce, anchorLocalPoint, dofX, dofV); Matrix66d Dnumeric = computeExtraDamping(inputForce, anchorLocalPoint, dofX, dofV); Vector6d F = inputForce; Matrix66d K = Matrix66d::Zero(), D = Matrix66d::Zero(); rigidBody->addExternalGeneralizedForce(location, F, K, D); F = rigidBody->getExternalGeneralizedForce().unsafeGet(); K = rigidBody->getExternalGeneralizedStiffness(); D = rigidBody->getExternalGeneralizedDamping(); EXPECT_LE((F - Fnumeric).cwiseAbs().maxCoeff(), 2e-7); EXPECT_LE((K - Knumeric).cwiseAbs().maxCoeff(), 2e-7); EXPECT_LE((D - Dnumeric).cwiseAbs().maxCoeff(), 2e-7); } { SCOPED_TRACE("Almost Identity pose, limitted development not used yet"); Eigen::AngleAxisd angleAxis(5e-8, Vector3d(1.1, -1.4, 3.23).normalized()); Vector3d t(1.1, 2.2, 3.3); RigidTransform3d transform = makeRigidTransform(Quaterniond(angleAxis), t); Vector6d inputForce = Vector6d::LinSpaced(1.1, 6.6); Vector6d dofX = Vector6d::Zero(); dofX.segment<3>(0) = transform.translation(); Eigen::AngleAxisd angleAxis2(transform.rotation()); dofX.segment<3>(3) = angleAxis2.angle() * angleAxis2.axis(); Vector6d dofV = Vector6d::Zero(); Vector3d anchorLocalPoint = Vector3d::Ones(); std::shared_ptr rigidBody = std::make_shared("Rigid"); rigidBody->setShape(m_sphere); SurgSim::Physics::RigidState initialState; initialState.setPose(transform); rigidBody->setInitialState(initialState); SurgSim::DataStructures::Location location(anchorLocalPoint); Vector6d Fnumeric = computeExtraTorque(inputForce, anchorLocalPoint, dofX, dofV); Matrix66d Knumeric = computeExtraStiffness(inputForce, anchorLocalPoint, dofX, dofV); Matrix66d Dnumeric = computeExtraDamping(inputForce, anchorLocalPoint, dofX, dofV); Vector6d F = inputForce; Matrix66d K = Matrix66d::Zero(), D = Matrix66d::Zero(); rigidBody->addExternalGeneralizedForce(location, F, K, D); F = rigidBody->getExternalGeneralizedForce().unsafeGet(); K = rigidBody->getExternalGeneralizedStiffness(); D = rigidBody->getExternalGeneralizedDamping(); EXPECT_LE((F - Fnumeric).cwiseAbs().maxCoeff(), 2e-7); EXPECT_LE((K - Knumeric).cwiseAbs().maxCoeff(), 2.2e-7); // Epsilon set by trial and error EXPECT_LE((D - Dnumeric).cwiseAbs().maxCoeff(), 2e-7); } { SCOPED_TRACE("Almost Identity pose, limitted development in use"); Eigen::AngleAxisd angleAxis(5e-8, Vector3d(1.1, -1.4, 3.23).normalized()); Vector3d t(1.1, 2.2, 3.3); RigidTransform3d transform = makeRigidTransform(Quaterniond(angleAxis), t); Vector6d inputForce = Vector6d::LinSpaced(1.1, 6.6); Vector6d dofX = Vector6d::Zero(); dofX.segment<3>(0) = transform.translation(); Eigen::AngleAxisd angleAxis2(transform.rotation()); dofX.segment<3>(3) = angleAxis2.angle() * angleAxis2.axis(); Vector6d dofV = Vector6d::Zero(); Vector3d anchorLocalPoint = Vector3d::Ones(); std::shared_ptr rigidBody = std::make_shared("Rigid"); rigidBody->setShape(m_sphere); SurgSim::Physics::RigidState initialState; initialState.setPose(transform); rigidBody->setInitialState(initialState); SurgSim::DataStructures::Location location(anchorLocalPoint); Vector6d Fnumeric = computeExtraTorque(inputForce, anchorLocalPoint, dofX, dofV); Matrix66d Knumeric = computeExtraStiffness(inputForce, anchorLocalPoint, dofX, dofV); Matrix66d Dnumeric = computeExtraDamping(inputForce, anchorLocalPoint, dofX, dofV); Vector6d F = inputForce; Matrix66d K = Matrix66d::Zero(), D = Matrix66d::Zero(); rigidBody->addExternalGeneralizedForce(location, F, K, D); F = rigidBody->getExternalGeneralizedForce().unsafeGet(); K = rigidBody->getExternalGeneralizedStiffness(); D = rigidBody->getExternalGeneralizedDamping(); EXPECT_LE((F - Fnumeric).cwiseAbs().maxCoeff(), 2e-7); EXPECT_LE((K - Knumeric).cwiseAbs().maxCoeff(), 2e-7); EXPECT_LE((D - Dnumeric).cwiseAbs().maxCoeff(), 2e-7); } } namespace { Vector6d computeSpringForce(double linearStiffness, double linearDamping, double angularStiffness, double angularDamping, Vector3d targetPosition, Vector3d targetLinearVelocity, Vector3d targetRotationVector, Vector3d targetAngularVelocity, Vector6d dofX, Vector6d dofV, bool doComputeExtraTorque = false, Vector3d localApplicationPoint = Vector3d::Zero()) { Vector6d f = Vector6d::Zero(); f.segment<3>(0) += linearStiffness * (targetPosition - dofX.segment<3>(0)); f.segment<3>(0) += linearDamping * (targetLinearVelocity - dofV.segment<3>(0)); f.segment<3>(3) += angularStiffness * (targetRotationVector - dofX.segment<3>(3)); f.segment<3>(3) += angularDamping * (targetAngularVelocity - dofV.segment<3>(3)); if (doComputeExtraTorque) { Vector3d rotationVector = dofX.segment<3>(3); Matrix33d R; double angle = rotationVector.norm(); if (std::abs(angle) < 1e-8) { R.setIdentity(); } else { Vector3d axis = rotationVector / angle; R = cos(angle) * Matrix33d::Identity() + sin(angle) * SurgSim::Math::makeSkewSymmetricMatrix(axis) + (1.0 - cos(angle)) * axis * axis.transpose(); } Vector3d applicationPoint = dofX.segment<3>(0) + R * localApplicationPoint; Vector3d lever = applicationPoint - dofX.segment<3>(0); f.segment<3>(3) += lever.cross(f.segment<3>(0)); } return f; } Matrix66d computeSpringStiffness(double linearStiffness, double linearDamping, double angularStiffness, double angularDamping, Vector3d targetPosition, Vector3d targetLinearVelocity, Vector3d targetRotationVector, Vector3d targetAngularVelocity, Vector6d dofPosition, Vector6d dofVelocity, bool doComputeExtraTorque = false, Vector3d localApplicationPoint = Vector3d::Zero()) { Matrix66d K = Matrix66d::Zero(); const double epsilon = 1e-8; for (size_t column = 0; column < 6; ++column) { Vector6d dofX = dofPosition; dofX[column] += 2.0 * epsilon; Vector6d fXPlus2H = computeSpringForce(linearStiffness, linearDamping, angularStiffness, angularDamping, targetPosition, targetLinearVelocity, targetRotationVector, targetAngularVelocity, dofX, dofVelocity, doComputeExtraTorque, localApplicationPoint); dofX = dofPosition; dofX[column] += epsilon; Vector6d fXPlusH = computeSpringForce(linearStiffness, linearDamping, angularStiffness, angularDamping, targetPosition, targetLinearVelocity, targetRotationVector, targetAngularVelocity, dofX, dofVelocity, doComputeExtraTorque, localApplicationPoint); dofX = dofPosition; dofX[column] -= epsilon; Vector6d fXMinusH = computeSpringForce(linearStiffness, linearDamping, angularStiffness, angularDamping, targetPosition, targetLinearVelocity, targetRotationVector, targetAngularVelocity, dofX, dofVelocity, doComputeExtraTorque, localApplicationPoint); dofX = dofPosition; dofX[column] -= 2.0 * epsilon; Vector6d fXMinus2H = computeSpringForce(linearStiffness, linearDamping, angularStiffness, angularDamping, targetPosition, targetLinearVelocity, targetRotationVector, targetAngularVelocity, dofX, dofVelocity, doComputeExtraTorque, localApplicationPoint); K.col(column) = - (-fXPlus2H + 8.0 * fXPlusH - 8.0 * fXMinusH + fXMinus2H) / (12.0 * epsilon); } return K; } Matrix66d computeSpringDamping(double linearStiffness, double linearDamping, double angularStiffness, double angularDamping, Vector3d targetPosition, Vector3d targetLinearVelocity, Vector3d targetRotationVector, Vector3d targetAngularVelocity, Vector6d dofPosition, Vector6d dofVelocity, bool doComputeExtraTorque = false, Vector3d localApplicationPoint = Vector3d::Zero()) { Matrix66d D = Matrix66d::Zero(); const double epsilon = 1e-8; for (size_t column = 0; column < 6; ++column) { Vector6d dofV = dofVelocity; dofV[column] += 2.0 * epsilon; Vector6d fXPlus2H = computeSpringForce(linearStiffness, linearDamping, angularStiffness, angularDamping, targetPosition, targetLinearVelocity, targetRotationVector, targetAngularVelocity, dofPosition, dofV, doComputeExtraTorque, localApplicationPoint); dofV = dofVelocity; dofV[column] += epsilon; Vector6d fXPlusH = computeSpringForce(linearStiffness, linearDamping, angularStiffness, angularDamping, targetPosition, targetLinearVelocity, targetRotationVector, targetAngularVelocity, dofPosition, dofV, doComputeExtraTorque, localApplicationPoint); dofV = dofVelocity; dofV[column] -= epsilon; Vector6d fXMinusH = computeSpringForce(linearStiffness, linearDamping, angularStiffness, angularDamping, targetPosition, targetLinearVelocity, targetRotationVector, targetAngularVelocity, dofPosition, dofV, doComputeExtraTorque, localApplicationPoint); dofV = dofVelocity; dofV[column] -= 2.0 * epsilon; Vector6d fXMinus2H = computeSpringForce(linearStiffness, linearDamping, angularStiffness, angularDamping, targetPosition, targetLinearVelocity, targetRotationVector, targetAngularVelocity, dofPosition, dofV, doComputeExtraTorque, localApplicationPoint); D.col(column) = - (-fXPlus2H + 8.0 * fXPlusH - 8.0 * fXMinusH + fXMinus2H) / (12.0 * epsilon); } return D; } }; // namespace anonymous TEST_F(RigidRepresentationTest, AddExternalGeneralizedForceTest) { double linearStiffness = 1.1; double linearDamping = 1.2; double angularStiffness = 1.3; double angularDamping = 1.4; Vector3d targetPosition = Vector3d::Ones(); Vector3d targetLinearVelocity = Vector3d::Ones() / 100.0; double angle = 1.2354; Vector3d axis = Vector3d(1.2, 0.4, 5.2).normalized(); Vector3d targetRotationVector = axis * angle; Vector3d targetAngularVelocity = Vector3d::Ones() / 200.0; Vector3d localAnchorPoint = Vector3d::Ones(); { SCOPED_TRACE("With stiffness, with damping"); Eigen::AngleAxisd angleAxis(0.34512, Vector3d(1.1, -1.4, 3.23).normalized()); Vector3d t(1.1, 0.9, 1.02); RigidTransform3d transform = makeRigidTransform(Quaterniond(angleAxis), t); Vector6d dofX = Vector6d::Zero(); dofX.segment<3>(0) = transform.translation(); Eigen::AngleAxisd angleAxis2(transform.rotation()); dofX.segment<3>(3) = angleAxis2.axis() * angleAxis2.angle(); Vector6d dofV = Vector6d::Zero(); Vector6d FWithoutExtraTorque = computeSpringForce(linearStiffness, linearDamping, angularStiffness, angularDamping, targetPosition, targetLinearVelocity, targetRotationVector, targetAngularVelocity, dofX, dofV); Matrix66d KWithoutExtraTorque = computeSpringStiffness(linearStiffness, linearDamping, angularStiffness, angularDamping, targetPosition, targetLinearVelocity, targetRotationVector, targetAngularVelocity, dofX, dofV); Matrix66d DWithoutExtraTorque = computeSpringDamping(linearStiffness, linearDamping, angularStiffness, angularDamping, targetPosition, targetLinearVelocity, targetRotationVector, targetAngularVelocity, dofX, dofV); Vector6d FWithExtraTorque = computeSpringForce(linearStiffness, linearDamping, angularStiffness, angularDamping, targetPosition, targetLinearVelocity, targetRotationVector, targetAngularVelocity, dofX, dofV, true, localAnchorPoint); Matrix66d KWithExtraTorque = computeSpringStiffness(linearStiffness, linearDamping, angularStiffness, angularDamping, targetPosition, targetLinearVelocity, targetRotationVector, targetAngularVelocity, dofX, dofV, true, localAnchorPoint); Matrix66d DWithExtraTorque = computeSpringDamping(linearStiffness, linearDamping, angularStiffness, angularDamping, targetPosition, targetLinearVelocity, targetRotationVector, targetAngularVelocity, dofX, dofV, true, localAnchorPoint); std::shared_ptr rigidBody = std::make_shared("Rigid"); rigidBody->setShape(m_sphere); SurgSim::Physics::RigidState initialState; initialState.setPose(transform); rigidBody->setInitialState(initialState); SurgSim::DataStructures::Location location(localAnchorPoint); Vector6d F = FWithoutExtraTorque; Matrix66d K = KWithoutExtraTorque, D = DWithoutExtraTorque; rigidBody->addExternalGeneralizedForce(location, F, K, D); F = rigidBody->getExternalGeneralizedForce().unsafeGet(); K = rigidBody->getExternalGeneralizedStiffness(); D = rigidBody->getExternalGeneralizedDamping(); EXPECT_LE((F - FWithExtraTorque).cwiseAbs().maxCoeff(), 1e-7); EXPECT_LE((K - KWithExtraTorque).cwiseAbs().maxCoeff(), 1e-7); EXPECT_LE((D - DWithExtraTorque).cwiseAbs().maxCoeff(), 1e-7); } { SCOPED_TRACE("With stiffness, without damping"); Eigen::AngleAxisd angleAxis(0.34512, Vector3d(1.1, -1.4, 3.23).normalized()); Vector3d t(1.1, 0.9, 1.02); RigidTransform3d transform = makeRigidTransform(Quaterniond(angleAxis), t); Vector6d dofX = Vector6d::Zero(); dofX.segment<3>(0) = transform.translation(); Eigen::AngleAxisd angleAxis2(transform.rotation()); dofX.segment<3>(3) = angleAxis2.axis() * angleAxis2.angle(); Vector6d dofV = Vector6d::Zero(); Vector6d FWithoutExtraTorque = computeSpringForce(linearStiffness, linearDamping, angularStiffness, angularDamping, targetPosition, targetLinearVelocity, targetRotationVector, targetAngularVelocity, dofX, dofV); Matrix66d KWithoutExtraTorque = computeSpringStiffness(linearStiffness, linearDamping, angularStiffness, angularDamping, targetPosition, targetLinearVelocity, targetRotationVector, targetAngularVelocity, dofX, dofV); Vector6d FWithExtraTorque = computeSpringForce(linearStiffness, linearDamping, angularStiffness, angularDamping, targetPosition, targetLinearVelocity, targetRotationVector, targetAngularVelocity, dofX, dofV, true, localAnchorPoint); Matrix66d KWithExtraTorque = computeSpringStiffness(linearStiffness, linearDamping, angularStiffness, angularDamping, targetPosition, targetLinearVelocity, targetRotationVector, targetAngularVelocity, dofX, dofV, true, localAnchorPoint); std::shared_ptr rigidBody = std::make_shared("Rigid"); rigidBody->setShape(m_sphere); SurgSim::Physics::RigidState initialState; initialState.setPose(transform); rigidBody->setInitialState(initialState); SurgSim::DataStructures::Location location(localAnchorPoint); Vector6d F = FWithoutExtraTorque; Matrix66d K = KWithoutExtraTorque; rigidBody->addExternalGeneralizedForce(location, F, K); F = rigidBody->getExternalGeneralizedForce().unsafeGet(); K = rigidBody->getExternalGeneralizedStiffness(); EXPECT_LE((F - FWithExtraTorque).cwiseAbs().maxCoeff(), 1e-7); EXPECT_LE((K - KWithExtraTorque).cwiseAbs().maxCoeff(), 1e-7); } { SCOPED_TRACE("Without stiffness, without damping"); Eigen::AngleAxisd angleAxis(0.34512, Vector3d(1.1, -1.4, 3.23).normalized()); Vector3d t(1.1, 0.9, 1.02); RigidTransform3d transform = makeRigidTransform(Quaterniond(angleAxis), t); Vector6d dofX = Vector6d::Zero(); dofX.segment<3>(0) = transform.translation(); Eigen::AngleAxisd angleAxis2(transform.rotation()); dofX.segment<3>(3) = angleAxis2.axis() * angleAxis2.angle(); Vector6d dofV = Vector6d::Zero(); Vector6d FWithoutExtraTorque = computeSpringForce(linearStiffness, linearDamping, angularStiffness, angularDamping, targetPosition, targetLinearVelocity, targetRotationVector, targetAngularVelocity, dofX, dofV); Vector6d FWithExtraTorque = computeSpringForce(linearStiffness, linearDamping, angularStiffness, angularDamping, targetPosition, targetLinearVelocity, targetRotationVector, targetAngularVelocity, dofX, dofV, true, localAnchorPoint); std::shared_ptr rigidBody = std::make_shared("Rigid"); rigidBody->setShape(m_sphere); SurgSim::Physics::RigidState initialState; initialState.setPose(transform); rigidBody->setInitialState(initialState); SurgSim::DataStructures::Location location(localAnchorPoint); Vector6d F = FWithoutExtraTorque; rigidBody->addExternalGeneralizedForce(location, F); F = rigidBody->getExternalGeneralizedForce().unsafeGet(); EXPECT_LE((F - FWithExtraTorque).cwiseAbs().maxCoeff(), 1e-7); } } TEST_F(RigidRepresentationTest, NoForceTorqueTest) { // Create the rigid body std::shared_ptr rigidBody = std::make_shared("Rigid"); // Setup phase rigidBody->setLocalActive(true); rigidBody->setIsGravityEnabled(false); rigidBody->setDensity(m_density); rigidBody->setShape(m_sphere); // Run few time steps for (int timeStep = 0; timeStep < m_maxNumSimulationStepTest; timeStep++) { rigidBody->beforeUpdate(m_dt); rigidBody->update(m_dt); rigidBody->afterUpdate(m_dt); } const Vector3d G = rigidBody->getCurrentState().getPose().translation(); const Matrix33d& R = rigidBody->getCurrentState().getPose().linear(); const Quaterniond q = Quaterniond(R); const Vector3d v = rigidBody->getCurrentState().getLinearVelocity(); const Vector3d w = rigidBody->getCurrentState().getAngularVelocity(); ASSERT_EQ(Vector3d::Zero(), G); ASSERT_TRUE(q.isApprox(Quaterniond::Identity())); ASSERT_EQ(Vector3d::Zero(), v); ASSERT_EQ(Vector3d::Zero(), w); } TEST_F(RigidRepresentationTest, GravityTest) { // Create the rigid body std::shared_ptr rigidBody = std::make_shared("Rigid"); Vector3d gravity(0.0, -9.81, 0.0); // Setup phase rigidBody->setLocalActive(true); rigidBody->setIsGravityEnabled(true); rigidBody->setDensity(m_density); rigidBody->setShape(m_sphere); // Run few time steps for (int timeStep = 0; timeStep < m_maxNumSimulationStepTest; timeStep++) { rigidBody->beforeUpdate(m_dt); rigidBody->update(m_dt); rigidBody->afterUpdate(m_dt); const Vector3d G = rigidBody->getCurrentState().getPose().translation(); const Matrix33d& R = rigidBody->getCurrentState().getPose().linear(); const Quaterniond q = Quaterniond(R); const Vector3d v = rigidBody->getCurrentState().getLinearVelocity(); const Vector3d w = rigidBody->getCurrentState().getAngularVelocity(); const Vector3d Gprev = rigidBody->getPreviousState().getPose().translation(); const Vector3d vprev = rigidBody->getPreviousState().getLinearVelocity(); // Implicit numerical integration gives v(t+dt) = v(t) + dt.a(t+dt) = v(t) + dt.g // p(t+dt) = p(t) + dt.v(t+dt) = p(t) + dt.v(t) + dt^2.g Vector3d tmpV = vprev + gravity * m_dt; double diffV = (v - tmpV).norm(); Vector3d tmpG = Gprev + tmpV * m_dt; double diffG = (G - tmpG).norm(); ASSERT_NEAR(0.0, diffG, epsilon); ASSERT_TRUE(q.isApprox(Quaterniond::Identity())); ASSERT_NEAR(0.0, diffV, epsilon); ASSERT_EQ(Vector3d::Zero(), w); } } TEST_F(RigidRepresentationTest, PreviousStateDifferentFromCurrentTest) { // Create the rigid body std::shared_ptr rigidBody = std::make_shared("Rigid"); Vector3d gravity(0.0, -9.81, 0.0); // Setup phase rigidBody->setLocalActive(true); rigidBody->setIsGravityEnabled(true); rigidBody->setDensity(m_density); rigidBody->setShape(m_sphere); // Run few time steps for (int timeStep = 0; timeStep < m_maxNumSimulationStepTest; timeStep++) { rigidBody->beforeUpdate(m_dt); rigidBody->update(m_dt); rigidBody->afterUpdate(m_dt); ASSERT_NE(rigidBody->getPreviousState(), rigidBody->getCurrentState()); } } void disableWhenDivergeTest(std::shared_ptr rigidBody, const RigidState& state, double dt) { // Setup phase rigidBody->setLocalActive(true); rigidBody->setIsGravityEnabled(true); rigidBody->setInitialState(state); // Run 1 time step and make sure that the rigid body has been disabled // The rotation explode under the angular velocity too strong ! { ASSERT_TRUE(rigidBody->isActive()); rigidBody->beforeUpdate(dt); rigidBody->update(dt); rigidBody->afterUpdate(dt); ASSERT_FALSE(rigidBody->isActive()); } } TEST_F(RigidRepresentationTest, DisableWhenDivergeTest) { Quaterniond q = Quaterniond::Identity(); Vector3d vZero = Vector3d::Zero(); Vector3d vMax = Vector3d::Constant(std::numeric_limits::max()); // Test linear failure (with Signaling Nan) { // Create the rigid body std::shared_ptr rigidBody = std::make_shared("Rigid"); rigidBody->setDensity(m_density); rigidBody->setShape(m_sphere); // Sets the state m_state.reset(); m_state.setPose(SurgSim::Math::makeRigidTransform(q, vMax)); m_state.setLinearVelocity(Vector3d::Constant(std::numeric_limits::signaling_NaN())); SCOPED_TRACE("Testing linear with Signaling Nan"); disableWhenDivergeTest(rigidBody, m_state, m_dt); } // Test linear failure (with quiet Nan) { // Create the rigid body std::shared_ptr rigidBody = std::make_shared("Rigid"); rigidBody->setDensity(m_density); rigidBody->setShape(m_sphere); // Sets the state m_state.reset(); m_state.setPose(makeRigidTransform(q, vMax)); m_state.setLinearVelocity(Vector3d::Constant(std::numeric_limits::quiet_NaN())); SCOPED_TRACE("Testing linear with Quiet Nan"); disableWhenDivergeTest(rigidBody, m_state, m_dt); } // Test linear failure (with numerical maximum value) { // Create the rigid body std::shared_ptr rigidBody = std::make_shared("Rigid"); rigidBody->setDensity(m_density); rigidBody->setShape(m_sphere); // Sets the state m_state.reset(); m_state.setPose(makeRigidTransform(q, vMax)); m_state.setLinearVelocity(Vector3d::Constant(std::numeric_limits::max())); SCOPED_TRACE("Testing linear with double max"); disableWhenDivergeTest(rigidBody, m_state, m_dt); } // Test angular failure (with Signaling Nan) { // Create the rigid body std::shared_ptr rigidBody = std::make_shared("Rigid"); rigidBody->setDensity(m_density); rigidBody->setShape(m_sphere); // Sets the state m_state.reset(); m_state.setPose(makeRigidTransform(q, vZero)); m_state.setAngularVelocity(Vector3d::Constant(std::numeric_limits::signaling_NaN())); SCOPED_TRACE("Testing angular with Signaling Nan"); disableWhenDivergeTest(rigidBody, m_state, m_dt); } // Test angular failure (with quiet Nan) { // Create the rigid body std::shared_ptr rigidBody = std::make_shared("Rigid"); rigidBody->setDensity(m_density); rigidBody->setShape(m_sphere); // Sets the state m_state.reset(); m_state.setPose(makeRigidTransform(q, vZero)); m_state.setAngularVelocity(Vector3d::Constant(std::numeric_limits::quiet_NaN())); SCOPED_TRACE("Testing angular with Quiet Nan"); disableWhenDivergeTest(rigidBody, m_state, m_dt); } // Test angular failure (with numerical maximum value) { // Create the rigid body std::shared_ptr rigidBody = std::make_shared("Rigid"); rigidBody->setDensity(m_density); rigidBody->setShape(m_sphere); // Sets the state m_state.reset(); m_state.setPose(makeRigidTransform(q, vZero)); m_state.setAngularVelocity(Vector3d::Constant(std::numeric_limits::max())); SCOPED_TRACE("Testing angular with double max"); disableWhenDivergeTest(rigidBody, m_state, m_dt); } } TEST_F(RigidRepresentationTest, LocalizationCreation) { std::shared_ptr rigidBody = std::make_shared("Rigid"); Location loc(Vector3d(3.0, 2.0, 1.0)); std::shared_ptr localization = rigidBody->createLocalization(loc); EXPECT_TRUE(localization->getRepresentation() == rigidBody); Vector3d globalPos = rigidBody->getCurrentState().getPose() * loc.rigidLocalPosition.getValue(); EXPECT_TRUE(globalPos.isApprox(localization->calculatePosition(0.0))); EXPECT_TRUE(globalPos.isApprox(localization->calculatePosition(1.0))); } TEST_F(RigidRepresentationTest, InvalidShapes) { std::shared_ptr shapeWithNoVolume = std::make_shared(); std::shared_ptr runtime = std::make_shared(); { std::shared_ptr rigidBody = std::make_shared("Rigid"); rigidBody->setShape(shapeWithNoVolume); std::shared_ptr component = rigidBody; EXPECT_THROW(component->initialize(runtime), SurgSim::Framework::AssertionFailure); } } TEST_F(RigidRepresentationTest, WithMeshShape) { std::shared_ptr runtime = std::make_shared("config.txt"); std::shared_ptr shape = std::make_shared(); shape->load("Geometry/staple_collision.ply"); EXPECT_TRUE(shape->isValid()); std::shared_ptr rigidBody = std::make_shared("Rigid"); rigidBody->setShape(shape); EXPECT_NO_THROW(rigidBody->initialize(runtime)); EXPECT_TRUE(shape->isValid()); std::shared_ptr rigidBody2 = std::make_shared("Rigid2"); rigidBody2->setShape(shape); EXPECT_NO_THROW(rigidBody2->initialize(runtime)); } TEST_F(RigidRepresentationTest, CollisionRepresentationTest) { auto rigidBody(std::make_shared("Rigid")); auto collision1(std::make_shared("collision1")); auto collision2(std::make_shared("collision2")); EXPECT_EQ(nullptr, rigidBody->getCollisionRepresentation()); EXPECT_NO_THROW(rigidBody->setCollisionRepresentation(collision1)); EXPECT_EQ(collision1, rigidBody->getCollisionRepresentation()); EXPECT_EQ(rigidBody, collision1->getRigidRepresentation()); // Change the collision object EXPECT_NO_THROW(rigidBody->setCollisionRepresentation(collision2)); EXPECT_EQ(collision2, rigidBody->getCollisionRepresentation()); EXPECT_EQ(rigidBody, collision2->getRigidRepresentation()); EXPECT_EQ(nullptr, collision1->getRigidRepresentation()); // Clear the collision representation EXPECT_NO_THROW(rigidBody->setCollisionRepresentation(nullptr)); EXPECT_EQ(nullptr, rigidBody->getCollisionRepresentation()); EXPECT_EQ(nullptr, collision1->getRigidRepresentation()); EXPECT_EQ(nullptr, collision2->getRigidRepresentation()); } TEST_F(RigidRepresentationTest, DensityWithSphereShapeTest) { std::shared_ptr rigidBody = std::make_shared("Rigid"); // Mass density rigidBody->setDensity(m_density); // Shape rigidBody->setShape(m_sphere); // Test inertia EXPECT_TRUE(rigidBody->getLocalInertia().isApprox(m_inertia)); // Test mass EXPECT_EQ(m_mass, rigidBody->getMass()); // Test mass center EXPECT_TRUE(rigidBody->getMassCenter().isZero()); } TEST_F(RigidRepresentationTest, SerializationTest) { { SCOPED_TRACE("Encode/Decode as shared_ptr<>, should be OK"); auto rigidRepresentation = std::make_shared("TestRigidRepresentation"); YAML::Node node; ASSERT_NO_THROW( node = YAML::convert>::encode(rigidRepresentation)); std::shared_ptr newRepresentation; EXPECT_NO_THROW(newRepresentation = std::dynamic_pointer_cast (node.as>())); } { SCOPED_TRACE("Encode a RigidRepresentation object without a shape, should throw."); auto rigidRepresentation = std::make_shared("TestRigidRepresentation"); auto rigidCollisionRepresentation = std::make_shared("RigidCollisionRepresentation"); rigidRepresentation->setCollisionRepresentation(rigidCollisionRepresentation); EXPECT_ANY_THROW(YAML::convert::encode(*rigidRepresentation)); } { SCOPED_TRACE("Encode a RigidRepresentation object with valid RigidCollisionRepresentation and shape, no throw"); auto rigidRepresentation = std::make_shared("TestRigidRepresentation"); auto rigidCollisionRepresentation = std::make_shared("RigidCollisionRepresentation"); rigidRepresentation->setCollisionRepresentation(rigidCollisionRepresentation); rigidRepresentation->setDensity(0.1); rigidRepresentation->setLinearDamping(0.2); rigidRepresentation->setAngularDamping(0.3); rigidRepresentation->setShape(m_sphere); YAML::Node node; EXPECT_NO_THROW(node = YAML::convert::encode(*rigidRepresentation)); std::shared_ptr newRepresentation; newRepresentation = std::dynamic_pointer_cast(node.as>()); EXPECT_NE(nullptr, newRepresentation->getCollisionRepresentation()); EXPECT_NEAR(0.1, newRepresentation->getValue("Density"), epsilon); EXPECT_NEAR(0.2, newRepresentation->getValue("LinearDamping"), epsilon); EXPECT_NEAR(0.3, newRepresentation->getValue("AngularDamping"), epsilon); // Shape is encoded/decoded as concrete object instead of reference/shared_ptr<>. EXPECT_NE(m_sphere, newRepresentation->getValue>("Shape")); auto decodedShape = newRepresentation->getValue>("Shape"); EXPECT_EQ(m_sphere->getClassName(), decodedShape->getClassName()); EXPECT_NEAR(m_sphere->getVolume(), decodedShape->getVolume(), epsilon); auto newCollisionRepresentation = std::dynamic_pointer_cast(newRepresentation->getCollisionRepresentation()); EXPECT_EQ(newRepresentation, newCollisionRepresentation->getRigidRepresentation()); } } }; // namespace Physics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/UnitTests/RigidStateTest.cpp000066400000000000000000000121571277777236100245020ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/PhysicsConvert.h" #include "SurgSim/Physics/RigidState.h" struct RigidStateTest : public ::testing::Test { void SetUp() { quaterniond = SurgSim::Math::Quaterniond(0.5, 0.4, 0.3, 0.2); quaterniond.normalize(); translation = SurgSim::Math::Vector3d(5.2, -6.13, 4.12356); pose = SurgSim::Math::makeRigidTransform(quaterniond, translation); linearVelocity = SurgSim::Math::Vector3d(2, -3.1, -2.75); angularVelocity = SurgSim::Math::Vector3d (5, -10, 21.5); id4x4 = SurgSim::Math::RigidTransform3d::Identity(); } SurgSim::Math::Quaterniond quaterniond; SurgSim::Math::Vector3d translation; SurgSim::Math::RigidTransform3d pose; SurgSim::Math::Vector3d linearVelocity; SurgSim::Math::Vector3d angularVelocity; SurgSim::Math::RigidTransform3d id4x4; }; TEST_F(RigidStateTest, ConstructorTest) { ASSERT_NO_THROW(SurgSim::Physics::RigidState rigidRepresentationState); } TEST_F(RigidStateTest, DefaultValueTest) { // Create the base rigid representation state std::shared_ptr rigidRepresentationState; rigidRepresentationState = std::make_shared(); // Linear velocity [default = (0 0 0)] EXPECT_TRUE(rigidRepresentationState->getLinearVelocity().isZero()); // Angular velocity [default = (0 0 0)] EXPECT_TRUE(rigidRepresentationState->getAngularVelocity().isZero()); // Pose [default = Identity] EXPECT_TRUE(rigidRepresentationState->getPose().isApprox(id4x4)); } TEST_F(RigidStateTest, ResetTest) { // Create the base rigid representation state std::shared_ptr rigidRepresentationState; rigidRepresentationState = std::make_shared(); rigidRepresentationState->setLinearVelocity(linearVelocity); rigidRepresentationState->setAngularVelocity(angularVelocity); rigidRepresentationState->setPose(pose); // Reset the rigid representation state to default values rigidRepresentationState->reset(); // Test Linear velocity has been reset to (0 0 0) EXPECT_TRUE(rigidRepresentationState->getLinearVelocity().isZero()); // Test Angular velocity has been reset to (0 0 0) EXPECT_TRUE(rigidRepresentationState->getAngularVelocity().isZero()); // Test pose has been reset to Identity EXPECT_TRUE(rigidRepresentationState->getPose().isApprox(id4x4)); } TEST_F(RigidStateTest, SetGetTest) { // Create the base rigid representation state std::shared_ptr rigidRepresentationState; rigidRepresentationState = std::make_shared(); // Get/Set linear velocity rigidRepresentationState->setLinearVelocity(linearVelocity); EXPECT_TRUE(linearVelocity.isApprox(rigidRepresentationState->getLinearVelocity())); rigidRepresentationState->setLinearVelocity(SurgSim::Math::Vector3d::Zero()); EXPECT_TRUE(rigidRepresentationState->getLinearVelocity().isZero()); // Get/Set angular velocity rigidRepresentationState->setAngularVelocity(angularVelocity); EXPECT_TRUE(angularVelocity.isApprox(rigidRepresentationState->getAngularVelocity())); rigidRepresentationState->setAngularVelocity(SurgSim::Math::Vector3d::Zero()); EXPECT_TRUE(rigidRepresentationState->getAngularVelocity().isZero()); // Get/Set pose rigidRepresentationState->setPose(pose); EXPECT_TRUE(rigidRepresentationState->getPose().isApprox(pose)); rigidRepresentationState->setPose(id4x4); EXPECT_TRUE(rigidRepresentationState->getPose().isApprox(id4x4)); } TEST_F(RigidStateTest, SerializationTest) { SurgSim::Physics::RigidState rigidRepresentationState; rigidRepresentationState.setValue("Pose", pose); rigidRepresentationState.setValue("LinearVelocity", linearVelocity); rigidRepresentationState.setValue("AngularVelocity", angularVelocity); YAML::Node node; ASSERT_NO_THROW(node = YAML::convert::encode(rigidRepresentationState)); EXPECT_EQ(1u, node.size()); SurgSim::Physics::RigidState newRigidRepresentationState; ASSERT_NO_THROW(newRigidRepresentationState = node.as()); EXPECT_TRUE(pose.isApprox(newRigidRepresentationState.getValue("Pose"))); EXPECT_TRUE(linearVelocity.isApprox( newRigidRepresentationState.getValue("LinearVelocity"))); EXPECT_TRUE(angularVelocity.isApprox( newRigidRepresentationState.getValue("AngularVelocity"))); }opensurgsim-0.7.0/SurgSim/Physics/UnitTests/RotationVectorConstraintDataTests.cpp000066400000000000000000000057211277777236100304460ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include "SurgSim/Physics/RotationVectorConstraintData.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Physics/Fem1DElementBeam.h" #include "SurgSim/Physics/Fem1DRepresentation.h" #include "SurgSim/Physics/RigidRepresentation.h" using SurgSim::Physics::Fem1DElementBeam; using SurgSim::Physics::Fem1DRepresentation; using SurgSim::Physics::RigidRepresentation; using SurgSim::Physics::RotationVectorRigidFem1DConstraintData; TEST (RotationVectorConstraintDataTests, TestSetGet) { using SurgSim::Framework::AssertionFailure; RotationVectorRigidFem1DConstraintData rotationVectorConstraintData; auto Id = SurgSim::Math::Matrix33d::Identity(); EXPECT_THROW(rotationVectorConstraintData.getCurrentRotationVector(), AssertionFailure); auto rigid = std::make_shared("rigid"); auto rigidRAtGrasp = rigid->getPose().linear(); EXPECT_THROW(rotationVectorConstraintData.setRigidOrFixedRotation(nullptr, Id), AssertionFailure); rotationVectorConstraintData.setRigidOrFixedRotation(rigid, rigidRAtGrasp); EXPECT_THROW(rotationVectorConstraintData.getCurrentRotationVector(), AssertionFailure); EXPECT_THROW(rotationVectorConstraintData.setFem1DRotation(nullptr, 0), AssertionFailure); auto fem1d = std::make_shared("fem1d"); EXPECT_THROW(rotationVectorConstraintData.setFem1DRotation(fem1d, 0), AssertionFailure); auto initialState = std::make_shared(); initialState->setNumDof(6, 2); initialState->getPositions().setZero(); initialState->getPositions().segment<3>(6) = SurgSim::Math::Vector3d(1.0, 0.0, 0.0); fem1d->setInitialState(initialState); auto elementData = std::make_shared(); elementData->enableShear = false; elementData->massDensity = 950; elementData->nodeIds.push_back(0); elementData->nodeIds.push_back(1); elementData->poissonRatio = 0.35; elementData->radius = 0.01; elementData->youngModulus = 1e6; fem1d->addFemElement(std::make_shared(elementData)); fem1d->initialize(std::make_shared()); EXPECT_NO_THROW(rotationVectorConstraintData.setFem1DRotation(fem1d, 0)); EXPECT_NO_THROW(rotationVectorConstraintData.getCurrentRotationVector()); } opensurgsim-0.7.0/SurgSim/Physics/UnitTests/SlidingConstraintDataTests.cpp000066400000000000000000000044621277777236100270560ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include "SurgSim/Physics/Constraint.h" #include "SurgSim/Physics/ConstraintData.h" #include "SurgSim/Physics/SlidingConstraintData.h" using SurgSim::Physics::Constraint; using SurgSim::Physics::ConstraintData; using SurgSim::Physics::SlidingConstraintData; #include "SurgSim/Math/Vector.h" using SurgSim::Math::Vector3d; namespace { const double epsilon = 1e-10; }; TEST(SlidingConstraintDataTests, TestSetGet) { using SurgSim::DataStructures::Location; Vector3d point(1.2, 3.4, 5.6), direction(7.8, 9.8, 7.6); direction.normalize(); SlidingConstraintData slidingConstraintData; slidingConstraintData.setSlidingDirection(point, direction); const auto normals = slidingConstraintData.getNormals(); EXPECT_TRUE(point.isApprox(slidingConstraintData.getPose().translation())); auto pose = slidingConstraintData.getPose().inverse().rotation(); EXPECT_TRUE((pose * direction).isApprox(Vector3d(1.0, 0.0, 0.0))); EXPECT_TRUE((pose * normals[0]).isApprox(Vector3d(0.0, 1.0, 0.0))); EXPECT_TRUE((pose * normals[1]).isApprox(Vector3d(0.0, 0.0, 1.0))); EXPECT_NEAR(0.0, direction.dot(normals[0]), epsilon); EXPECT_NEAR(0.0, direction.dot(normals[1]), epsilon); const auto tangent = slidingConstraintData.getTangent(); const auto distanceTangent = slidingConstraintData.getDistanceTangent(); EXPECT_NEAR(0.0, point.dot(tangent) + distanceTangent, epsilon); EXPECT_TRUE(direction.isApprox(tangent)); // Friction coefficient EXPECT_DOUBLE_EQ(0.5, slidingConstraintData.getFrictionCoefficient()); EXPECT_NO_THROW(slidingConstraintData.setFrictionCoefficient(0.1)); EXPECT_DOUBLE_EQ(0.1, slidingConstraintData.getFrictionCoefficient()); } opensurgsim-0.7.0/SurgSim/Physics/UnitTests/SolveMlcpTests.cpp000066400000000000000000000065201277777236100245270ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file SolveMlcpTests.cpp /// Simple Test for SolveMlcp computation #include #include #include #include "SurgSim/Physics/PhysicsManagerState.h" #include "SurgSim/Physics/SolveMlcp.h" #include "SurgSim/Testing/MlcpIO/MlcpTestData.h" #include "SurgSim/Testing/MlcpIO/ReadText.h" using SurgSim::Physics::PhysicsManagerState; using SurgSim::Physics::SolveMlcp; namespace { const double epsilon = 1e-10; }; TEST(SolveMlcpTest, CanConstruct) { ASSERT_NO_THROW({std::shared_ptr solveMlcpComputation = std::make_shared();}); } static void testMlcp(const std::string& filename, double contactTolerance, double solverPrecision, size_t maxIteration) { std::shared_ptr data = loadTestData(filename); ASSERT_NE(nullptr, data) << "Could not load data file 'mlcpOriginalTest.txt'"; std::shared_ptr state = std::make_shared(); // default parameter explicitly marked just to be clear, we are working in 1 instance of the state, no copy. std::shared_ptr solveMlcpComputation = std::make_shared(false); double dt = 1e-3; solveMlcpComputation->setContactTolerance(contactTolerance); EXPECT_NEAR(contactTolerance, solveMlcpComputation->getContactTolerance(), 1e-10); solveMlcpComputation->setPrecision(solverPrecision); EXPECT_NEAR(solverPrecision, solveMlcpComputation->getPrecision(), 1e-10); solveMlcpComputation->setMaxIterations(maxIteration); EXPECT_EQ(maxIteration, solveMlcpComputation->getMaxIterations()); // Copy the MlcpProblem data over into the input state state->getMlcpProblem().A = data->problem.A; state->getMlcpProblem().b = data->problem.b; state->getMlcpProblem().constraintTypes = data->problem.constraintTypes; state->getMlcpProblem().mu = data->problem.mu; // Allocate the MlcpSolution to store the output state->getMlcpSolution().x.resize(state->getMlcpProblem().b.size()); state->getMlcpSolution().x.setZero(); // Solve the mlcp problem and store the solution in the output state state = solveMlcpComputation->update(dt, state); // Compare the mlcp solution with the expected one EXPECT_TRUE(state->getMlcpSolution().x.isApprox(data->expectedLambda, epsilon)) << "lambda:" << std::endl << state->getMlcpSolution().x.transpose() << std::endl << "expected:" << std::endl << data->expectedLambda.transpose() << std::endl; } TEST(SolveMlcpTest, TestOriginalMlcp) { testMlcp("mlcpOriginalTest.txt", 2e-4, 1e-4, 30); } TEST(SolveMlcpTest, TestSequenceMlcps) { for (int i = 0; i <= 9; ++i) { std::ostringstream scopeName; scopeName << "Testing Mlcp " << i; SCOPED_TRACE(scopeName.str()); testMlcp(getTestFileName("mlcpTest", i, ".txt"), 1e-9, 1e-9, 100); } } opensurgsim-0.7.0/SurgSim/Physics/UnitTests/UpdateCollisionRepresentationsTest.cpp000066400000000000000000000051061277777236100306430ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// \file UpdateCollisionRepresentationsTest.cpp /// Tests for the UpdateCollisionRepresentations Class #include #include #include #include "SurgSim/Collision/Representation.h" #include "SurgSim/Math/Shape.h" #include "SurgSim/Physics/UnitTests/MockObjects.h" #include "SurgSim/Physics/PhysicsManagerState.h" #include "SurgSim/Physics/UpdateCollisionRepresentations.h" using SurgSim::Physics::MockCollisionRepresentation; using SurgSim::Physics::PhysicsManagerState; using SurgSim::Physics::UpdateCollisionRepresentations; TEST(UpdateCollisionRepresentationsTest, Construction) { EXPECT_NO_THROW(UpdateCollisionRepresentations computation(true);); EXPECT_NO_THROW(UpdateCollisionRepresentations computation(false);); } TEST(UpdateCollisionRepresentationsTest, Update) { std::shared_ptr state = std::make_shared(); // Create two collision representations. auto collision1 = std::make_shared("Collision1"); auto collision2 = std::make_shared("Collision2"); // Setup the state. std::vector> collisions; collisions.push_back(collision1); collisions.push_back(collision2); state->setCollisionRepresentations(collisions); // Test the m_numberOfTimesUpdateCalled before calling update(). EXPECT_EQ(0, collision1->getNumberOfTimesUpdateCalled()); EXPECT_EQ(0, collision2->getNumberOfTimesUpdateCalled()); // Set the local active flags. collision1->setLocalActive(true); collision2->setLocalActive(false); // Test compuation.update() SurgSim::Physics::UpdateCollisionRepresentations computation(false); std::shared_ptr newState = computation.update(1.0, state); // Test the m_numberOfTimesUpdateCalled before calling update(). EXPECT_EQ(1, collision1->getNumberOfTimesUpdateCalled()); EXPECT_EQ(0, collision2->getNumberOfTimesUpdateCalled()); }opensurgsim-0.7.0/SurgSim/Physics/UnitTests/VirtualToolCouplerTest.cpp000066400000000000000000000667131277777236100262700ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include #include "SurgSim/Collision/CollisionPair.h" #include "SurgSim/DataStructures/Location.h" #include "SurgSim/Devices/IdentityPoseDevice/IdentityPoseDevice.h" #include "SurgSim/Input/InputComponent.h" #include "SurgSim/Input/OutputComponent.h" #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Math/Matrix.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/SphereShape.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/RigidCollisionRepresentation.h" #include "SurgSim/Physics/RigidRepresentation.h" #include "SurgSim/Physics/RigidState.h" #include "SurgSim/Physics/UnitTests/MockObjects.h" #include "SurgSim/Physics/VirtualToolCoupler.h" #include "SurgSim/Testing/MockInputComponent.h" using SurgSim::Devices::IdentityPoseDevice; using SurgSim::Input::InputComponent; using SurgSim::Framework::Runtime; using SurgSim::Math::makeRigidTranslation; using SurgSim::Math::Matrix33d; using SurgSim::Math::Quaterniond; using SurgSim::Math::RigidTransform3d; using SurgSim::Math::SphereShape; using SurgSim::Math::Vector3d; namespace SurgSim { namespace Physics { const double epsilon = 1e-4; struct VirtualToolCouplerTest : public ::testing::Test { virtual void SetUp() { representationName = "Rigid Representation"; inputDeviceName = "Device"; rigidBody = std::make_shared(representationName); rigidBody->setDensity(700.0); rigidBody->setAngularDamping(0.0); rigidBody->setLinearDamping(0.0); rigidBody->setShape(std::make_shared(0.1)); RigidState state; state.setAngularVelocity(Vector3d::Zero()); state.setLinearVelocity(Vector3d::Zero()); state.setPose(RigidTransform3d::Identity()); rigidBody->setInitialState(state); input = std::make_shared("Input"); input->setDeviceName(inputDeviceName); device = std::make_shared(inputDeviceName); device->addInputConsumer(input); virtualToolCoupler = std::make_shared(); virtualToolCoupler->setInput(input); virtualToolCoupler->setRepresentation(rigidBody); } virtual void TearDown() { } std::shared_ptr rigidBody; std::shared_ptr virtualToolCoupler; std::shared_ptr input; std::shared_ptr device; protected: void runSystem(const int numSteps, const double dt = 0.001) { for (int step = 0; step < numSteps; step++) { virtualToolCoupler->update(dt); rigidBody->beforeUpdate(dt); rigidBody->update(dt); rigidBody->afterUpdate(dt); } } void checkLinearIsCriticallyDamped() { RigidTransform3d initialPose = RigidTransform3d::Identity(); initialPose.translation() = Vector3d(0.1, 0.0, 0.0); rigidBody->setLocalPose(initialPose); rigidBody->setIsGravityEnabled(false); std::shared_ptr runtime = std::make_shared(); virtualToolCoupler->initialize(runtime); rigidBody->initialize(runtime); virtualToolCoupler->wakeUp(); rigidBody->wakeUp(); // Critically damped mass-damper systems settle to within 5% of their // equilibrium when: // t = 4.744 * naturalFrequency; // we will run the system to this point, and then check that the // final position is 5.1% of its initial position double mass = rigidBody->getMass(); double stiffness = virtualToolCoupler->getLinearStiffness(); double naturalFrequency = sqrt(stiffness / mass); double expectedSettlingTime = 4.744 / naturalFrequency; const int NUM_STEPS = 1000; double dt = expectedSettlingTime / NUM_STEPS; Vector3d previousPosition = initialPose.translation(); Vector3d currentPosition; for (int step = 0; step < NUM_STEPS; step++) { virtualToolCoupler->update(dt); rigidBody->beforeUpdate(dt); rigidBody->update(dt); rigidBody->afterUpdate(dt); currentPosition = rigidBody->getCurrentState().getPose().translation(); // Check for exponential behavior. The position should monotonically decrease and not oscillate. ASSERT_TRUE((previousPosition.array() >= currentPosition.array()).all()); previousPosition = currentPosition; } Vector3d expectedPosition = 0.051 * initialPose.translation(); EXPECT_TRUE((expectedPosition.array() >= currentPosition.array()).all()); } void checkAngularIsCriticallyDamped() { double initialAngle = M_PI_4; RigidTransform3d initialPose = RigidTransform3d::Identity(); initialPose.linear() = Matrix33d(Eigen::AngleAxisd(initialAngle, Vector3d::UnitY())); rigidBody->setLocalPose(initialPose); rigidBody->setIsGravityEnabled(false); std::shared_ptr runtime = std::make_shared(); virtualToolCoupler->initialize(runtime); rigidBody->initialize(runtime); virtualToolCoupler->wakeUp(); rigidBody->wakeUp(); // Critically damped mass-damper systems settle to within 5% of their // equilibrium when: // t = 4.744 * naturalFrequency; // we will run the system to this point, and then check that the // final position is 5.1% of its initial position double inertia = rigidBody->getLocalInertia()(1, 1); double stiffness = virtualToolCoupler->getAngularStiffness(); double naturalFrequency = sqrt(stiffness / inertia); double expectedSettlingTime = 4.744 / naturalFrequency; const int NUM_STEPS = 500; double dt = expectedSettlingTime / NUM_STEPS; double previousAngle = initialAngle; double currentAngle; for (int step = 0; step < NUM_STEPS; step++) { virtualToolCoupler->update(dt); rigidBody->beforeUpdate(dt); rigidBody->update(dt); rigidBody->afterUpdate(dt); RigidTransform3d currentPose = rigidBody->getCurrentState().getPose(); currentAngle = atan2(-currentPose(2, 0), currentPose(0, 0)); // Check for exponential behavior. The angle should monotonically decrease and not oscillate. ASSERT_GT(previousAngle, currentAngle); previousAngle = currentAngle; } EXPECT_GT(0.051 * initialAngle, currentAngle); } std::string representationName; std::string inputDeviceName; }; TEST_F(VirtualToolCouplerTest, LinearDisplacement) { const double mass = rigidBody->getMass(); virtualToolCoupler->overrideAngularDamping(mass * 1.0); virtualToolCoupler->overrideAngularStiffness(mass * 200); virtualToolCoupler->overrideLinearDamping(mass * 50); virtualToolCoupler->overrideLinearStiffness(mass * 200); RigidTransform3d initialPose = RigidTransform3d::Identity(); initialPose.translation() = Vector3d(0.1, 0.0, 0.0); rigidBody->setLocalPose(initialPose); rigidBody->setIsGravityEnabled(false); std::shared_ptr runtime = std::make_shared(); virtualToolCoupler->initialize(runtime); rigidBody->initialize(runtime); virtualToolCoupler->wakeUp(); rigidBody->wakeUp(); EXPECT_FALSE(rigidBody->getCurrentState().getPose().translation().isZero(epsilon)); EXPECT_TRUE(rigidBody->isActive()); runSystem(2); EXPECT_TRUE(rigidBody->isActive()); EXPECT_FALSE(rigidBody->getCurrentState().getLinearVelocity().isZero(epsilon)); EXPECT_TRUE(rigidBody->getCurrentState().getAngularVelocity().isZero(epsilon)); runSystem(2000); EXPECT_TRUE(rigidBody->isActive()); RigidState state = rigidBody->getCurrentState(); EXPECT_TRUE(state.getLinearVelocity().isZero(epsilon)); EXPECT_TRUE(state.getAngularVelocity().isZero(epsilon)); EXPECT_TRUE(state.getPose().translation().isZero(epsilon)); Eigen::AngleAxisd angleAxis = Eigen::AngleAxisd(state.getPose().linear()); EXPECT_NEAR(0.0, angleAxis.angle(), epsilon); } TEST_F(VirtualToolCouplerTest, LinearDisplacementWithOffset) { const double mass = rigidBody->getMass(); virtualToolCoupler->overrideAngularDamping(mass * 1.0); virtualToolCoupler->overrideAngularStiffness(mass * 200); virtualToolCoupler->overrideLinearDamping(mass * 50); virtualToolCoupler->overrideLinearStiffness(mass * 200); rigidBody->setIsGravityEnabled(false); auto device = std::make_shared("IdentityPoseDevice"); auto inputComponent = std::make_shared("InputComponent"); device->addInputConsumer(inputComponent); virtualToolCoupler->setInput(inputComponent); RigidTransform3d inputOffset = makeRigidTranslation(Vector3d(0.1, 0.0, 0.0)); inputComponent->setLocalPose(inputOffset); std::shared_ptr runtime = std::make_shared(); virtualToolCoupler->initialize(runtime); rigidBody->initialize(runtime); virtualToolCoupler->wakeUp(); rigidBody->wakeUp(); runSystem(2500); EXPECT_TRUE(rigidBody->isActive()); RigidState state = rigidBody->getCurrentState(); EXPECT_TRUE(state.getLinearVelocity().isZero(epsilon)); EXPECT_TRUE(state.getAngularVelocity().isZero(epsilon)); EXPECT_TRUE(state.getPose().translation().isApprox(inputOffset.translation(), epsilon)) << "Rigid Body Position is incorrect" << std::endl << " Actual: " << state.getPose().translation().transpose() << std::endl << "Expected: " << inputOffset.translation().transpose() << std::endl; } TEST_F(VirtualToolCouplerTest, LinearDisplacementWithInertialTorques) { const double mass = rigidBody->getMass(); virtualToolCoupler->overrideAngularDamping(mass * 2); virtualToolCoupler->overrideAngularStiffness(mass * 20); virtualToolCoupler->overrideLinearDamping(mass * 5); virtualToolCoupler->overrideLinearStiffness(mass * 20); const Vector3d attachmentPoint = Vector3d::UnitY(); virtualToolCoupler->overrideAttachmentPoint(attachmentPoint); virtualToolCoupler->setCalculateInertialTorques(true); RigidTransform3d expectedFinalPose = RigidTransform3d::Identity(); expectedFinalPose.translation() = -attachmentPoint; RigidTransform3d initialPose = RigidTransform3d::Identity(); initialPose.translation() = Vector3d(0.01, 0.0, 0.0) + expectedFinalPose.translation(); rigidBody->setLocalPose(initialPose); rigidBody->setIsGravityEnabled(false); std::shared_ptr runtime = std::make_shared(); virtualToolCoupler->initialize(runtime); rigidBody->initialize(runtime); virtualToolCoupler->wakeUp(); rigidBody->wakeUp(); RigidState state = rigidBody->getCurrentState(); EXPECT_TRUE(state.getAngularVelocity().isZero(epsilon)); Eigen::AngleAxisd angleAxis = Eigen::AngleAxisd(state.getPose().linear()); EXPECT_NEAR(0.0, angleAxis.angle(), epsilon); EXPECT_TRUE(rigidBody->isActive()); runSystem(2); EXPECT_TRUE(rigidBody->isActive()); EXPECT_FALSE(rigidBody->getCurrentState().getAngularVelocity().isZero(epsilon)); runSystem(6000); EXPECT_TRUE(rigidBody->isActive()); state = rigidBody->getCurrentState(); EXPECT_TRUE(state.getLinearVelocity().isZero(epsilon)); EXPECT_TRUE(state.getAngularVelocity().isZero(epsilon)); EXPECT_TRUE(state.getPose().isApprox(expectedFinalPose, epsilon)); } TEST_F(VirtualToolCouplerTest, AngularDisplacement) { const double mass = rigidBody->getMass(); virtualToolCoupler->overrideAngularDamping(mass * 1.0); virtualToolCoupler->overrideAngularStiffness(mass * 200); virtualToolCoupler->overrideLinearDamping(mass * 50); virtualToolCoupler->overrideLinearStiffness(mass * 200); RigidTransform3d initialPose = RigidTransform3d::Identity(); initialPose.linear() = Matrix33d(Eigen::AngleAxisd(M_PI / 4.0, Vector3d::UnitY())); rigidBody->setLocalPose(initialPose); rigidBody->setIsGravityEnabled(false); std::shared_ptr runtime = std::make_shared(); virtualToolCoupler->initialize(runtime); rigidBody->initialize(runtime); virtualToolCoupler->wakeUp(); rigidBody->wakeUp(); Eigen::AngleAxisd angleAxis = Eigen::AngleAxisd(rigidBody->getCurrentState().getPose().linear()); EXPECT_NEAR(M_PI_4, angleAxis.angle(), epsilon); EXPECT_TRUE(rigidBody->isActive()); runSystem(2); EXPECT_TRUE(rigidBody->isActive()); EXPECT_FALSE(rigidBody->getCurrentState().getAngularVelocity().isZero(epsilon)); runSystem(2000); EXPECT_TRUE(rigidBody->isActive()); RigidState state = rigidBody->getCurrentState(); EXPECT_TRUE(state.getLinearVelocity().isZero(epsilon)); EXPECT_TRUE(state.getAngularVelocity().isZero(epsilon)); EXPECT_TRUE(state.getPose().translation().isZero(epsilon)); angleAxis = Eigen::AngleAxisd(state.getPose().linear()); EXPECT_NEAR(0.0, angleAxis.angle(), epsilon); } TEST_F(VirtualToolCouplerTest, WithGravity) { const double mass = rigidBody->getMass(); virtualToolCoupler->overrideAngularDamping(mass * 1.0); virtualToolCoupler->overrideAngularStiffness(mass * 200); virtualToolCoupler->overrideLinearDamping(mass * 50); virtualToolCoupler->overrideLinearStiffness(mass * 200); RigidTransform3d initialPose = RigidTransform3d::Identity(); initialPose.translation() = Vector3d(0.0, 0.0, 0.0); rigidBody->setLocalPose(initialPose); rigidBody->setIsGravityEnabled(true); const double stiffness = 1000; virtualToolCoupler->overrideLinearStiffness(stiffness); std::shared_ptr runtime = std::make_shared(); virtualToolCoupler->initialize(runtime); rigidBody->initialize(runtime); virtualToolCoupler->wakeUp(); rigidBody->wakeUp(); EXPECT_TRUE(rigidBody->getCurrentState().getPose().translation().isApprox(Vector3d::Zero(), epsilon)); EXPECT_TRUE(rigidBody->isActive()); runSystem(2000); EXPECT_TRUE(rigidBody->isActive()); RigidState state = rigidBody->getCurrentState(); EXPECT_TRUE(state.getLinearVelocity().isZero(epsilon)); EXPECT_TRUE(state.getAngularVelocity().isZero(epsilon)); Vector3d g = Vector3d(0.0, -9.81, 0.0); Vector3d expectedPosition = rigidBody->getMass() * g / stiffness; EXPECT_TRUE(state.getPose().translation().isApprox(expectedPosition, epsilon)); Eigen::AngleAxisd angleAxis = Eigen::AngleAxisd(state.getPose().linear()); EXPECT_NEAR(0.0, angleAxis.angle(), epsilon); } TEST_F(VirtualToolCouplerTest, DefaultLinearParameters) { SCOPED_TRACE("Default Linear Parameters"); checkLinearIsCriticallyDamped(); } TEST_F(VirtualToolCouplerTest, SetLinearStiffness) { SCOPED_TRACE("Set Linear Stiffness"); virtualToolCoupler->overrideLinearStiffness(1.234); checkLinearIsCriticallyDamped(); } TEST_F(VirtualToolCouplerTest, SetLinearDamping) { SCOPED_TRACE("Set Linear Damping"); virtualToolCoupler->overrideLinearDamping(500.2); checkLinearIsCriticallyDamped(); } TEST_F(VirtualToolCouplerTest, DefaultAngularParameters) { SCOPED_TRACE("Default Linear Parameters"); checkAngularIsCriticallyDamped(); } TEST_F(VirtualToolCouplerTest, SetAngularStiffness) { SCOPED_TRACE("Set Angular Stiffness"); virtualToolCoupler->overrideAngularStiffness(1234.6); checkAngularIsCriticallyDamped(); } TEST_F(VirtualToolCouplerTest, SetAngularDamping) { SCOPED_TRACE("Set Angular Damping"); virtualToolCoupler->overrideAngularDamping(0.1235); checkAngularIsCriticallyDamped(); } TEST_F(VirtualToolCouplerTest, SetHapticOutputOnlyWhenColliding) { RigidTransform3d initialPose = Math::makeRigidTransform(Math::makeRotationQuaternion(10.0, Vector3d::UnitX().eval()), Vector3d(0.1, 0.0, 0.0)); rigidBody->setLocalPose(initialPose); rigidBody->setIsGravityEnabled(false); auto input = std::make_shared("input"); DataStructures::DataGroupBuilder builder; builder.addPose(DataStructures::Names::POSE); // The VTC only provides the Jacobians if it gets input velocities. builder.addVector(DataStructures::Names::LINEAR_VELOCITY); builder.addVector(DataStructures::Names::ANGULAR_VELOCITY); DataStructures::DataGroup inputData = builder.createData(); inputData.poses().set(DataStructures::Names::POSE, RigidTransform3d::Identity()); inputData.vectors().set(DataStructures::Names::LINEAR_VELOCITY, Vector3d::Identity()); inputData.vectors().set(DataStructures::Names::ANGULAR_VELOCITY, Vector3d::Identity()); input->setData(inputData); virtualToolCoupler->setInput(input); auto output = std::make_shared("output"); std::shared_ptr runtime = std::make_shared(); virtualToolCoupler->initialize(runtime); rigidBody->initialize(runtime); input->initialize(runtime); output->initialize(runtime); virtualToolCoupler->wakeUp(); rigidBody->wakeUp(); input->wakeUp(); output->wakeUp(); EXPECT_FALSE(virtualToolCoupler->isHapticOutputOnlyWhenColliding()); virtualToolCoupler->setHapticOutputOnlyWhenColliding(true); EXPECT_TRUE(virtualToolCoupler->isHapticOutputOnlyWhenColliding()); // no OutputComponent virtualToolCoupler->update(0.1); DataStructures::DataGroup data = virtualToolCoupler->getOutputData(); ASSERT_TRUE(data.vectors().hasEntry(DataStructures::Names::FORCE)); EXPECT_FALSE(data.vectors().hasData(DataStructures::Names::FORCE)); ASSERT_TRUE(data.vectors().hasEntry(DataStructures::Names::TORQUE)); EXPECT_FALSE(data.vectors().hasData(DataStructures::Names::TORQUE)); ASSERT_TRUE(data.matrices().hasEntry(DataStructures::Names::DAMPER_JACOBIAN)); EXPECT_FALSE(data.matrices().hasData(DataStructures::Names::DAMPER_JACOBIAN)); ASSERT_TRUE(data.matrices().hasEntry(DataStructures::Names::SPRING_JACOBIAN)); EXPECT_FALSE(data.matrices().hasData(DataStructures::Names::SPRING_JACOBIAN)); // no collision representation virtualToolCoupler->setOutput(output); virtualToolCoupler->update(0.1); data = virtualToolCoupler->getOutputData(); Vector3d force; Vector3d torque; ASSERT_TRUE(data.vectors().get(DataStructures::Names::FORCE, &force)); EXPECT_GT(force.norm(), 0.0); ASSERT_TRUE(data.vectors().get(DataStructures::Names::TORQUE, &torque)); EXPECT_GT(torque.norm(), 0.0); EXPECT_TRUE(data.matrices().hasData(SurgSim::DataStructures::Names::DAMPER_JACOBIAN)); EXPECT_TRUE(data.matrices().hasData(SurgSim::DataStructures::Names::SPRING_JACOBIAN)); // forces disabled in free motion auto collision = std::make_shared("collision"); rigidBody->setCollisionRepresentation(collision); virtualToolCoupler->update(0.1); data = virtualToolCoupler->getOutputData(); ASSERT_TRUE(data.vectors().get(DataStructures::Names::FORCE, &force)); EXPECT_EQ(force, Vector3d::Zero()); ASSERT_TRUE(data.vectors().get(DataStructures::Names::TORQUE, &torque)); EXPECT_EQ(torque, Vector3d::Zero()); EXPECT_FALSE(data.matrices().hasData(DataStructures::Names::DAMPER_JACOBIAN)); EXPECT_FALSE(data.matrices().hasData(DataStructures::Names::SPRING_JACOBIAN)); // no flag virtualToolCoupler->setHapticOutputOnlyWhenColliding(false); virtualToolCoupler->update(0.1); data = virtualToolCoupler->getOutputData(); ASSERT_TRUE(data.vectors().get(DataStructures::Names::FORCE, &force)); EXPECT_GT(force.norm(), 0.0); ASSERT_TRUE(data.vectors().get(DataStructures::Names::TORQUE, &torque)); EXPECT_GT(torque.norm(), 0.0); EXPECT_TRUE(data.matrices().hasData(DataStructures::Names::DAMPER_JACOBIAN)); EXPECT_TRUE(data.matrices().hasData(DataStructures::Names::SPRING_JACOBIAN)); // forces enabled if any collisions virtualToolCoupler->setHapticOutputOnlyWhenColliding(true); auto& collisions = collision->getCollisions().unsafeGet(); collisions[std::make_shared("collision2")].push_back( std::make_shared( Collision::COLLISION_DETECTION_TYPE_DISCRETE, 0.1, 1.0, Vector3d::UnitX().eval(), Vector3d::UnitY().eval(), std::make_pair(DataStructures::Location(), DataStructures::Location()))); virtualToolCoupler->update(0.1); data = virtualToolCoupler->getOutputData(); ASSERT_TRUE(data.vectors().get(DataStructures::Names::FORCE, &force)); EXPECT_GT(force.norm(), 0.0); ASSERT_TRUE(data.vectors().get(DataStructures::Names::TORQUE, &torque)); EXPECT_GT(torque.norm(), 0.0); EXPECT_TRUE(data.matrices().hasData(DataStructures::Names::DAMPER_JACOBIAN)); EXPECT_TRUE(data.matrices().hasData(DataStructures::Names::SPRING_JACOBIAN)); } TEST_F(VirtualToolCouplerTest, GetInput) { EXPECT_EQ(input, virtualToolCoupler->getInput()); } TEST_F(VirtualToolCouplerTest, GetPoseName) { EXPECT_EQ(SurgSim::DataStructures::Names::POSE, virtualToolCoupler->getPoseName()); } TEST_F(VirtualToolCouplerTest, GetRigid) { EXPECT_EQ(rigidBody, virtualToolCoupler->getRepresentation()); } typedef SurgSim::DataStructures::OptionalValue OptionalValued; typedef SurgSim::DataStructures::OptionalValue OptionalValueVec3; TEST_F(VirtualToolCouplerTest, OptionalParams) { double num = 2.56527676; Vector3d vec(1.0, 2.0, 3.0); { SCOPED_TRACE("Getters"); EXPECT_FALSE(virtualToolCoupler->getOptionalLinearStiffness().hasValue()); virtualToolCoupler->overrideLinearStiffness(num); const OptionalValued& linearStiffness = virtualToolCoupler->getOptionalLinearStiffness(); EXPECT_TRUE(linearStiffness.hasValue()); EXPECT_EQ(num, linearStiffness.getValue()); EXPECT_FALSE(virtualToolCoupler->getOptionalLinearDamping().hasValue()); virtualToolCoupler->overrideLinearDamping(num); const OptionalValued& linearDamping = virtualToolCoupler->getOptionalLinearDamping(); EXPECT_TRUE(linearDamping.hasValue()); EXPECT_EQ(num, linearDamping.getValue()); EXPECT_FALSE(virtualToolCoupler->getOptionalAngularStiffness().hasValue()); virtualToolCoupler->overrideAngularStiffness(num); const OptionalValued& angularStiffness = virtualToolCoupler->getOptionalAngularStiffness(); EXPECT_TRUE(angularStiffness.hasValue()); EXPECT_EQ(num, angularStiffness.getValue()); EXPECT_FALSE(virtualToolCoupler->getOptionalAngularDamping().hasValue()); virtualToolCoupler->overrideAngularDamping(num); const OptionalValued& angularDamping = virtualToolCoupler->getOptionalAngularDamping(); EXPECT_TRUE(angularDamping.hasValue()); EXPECT_EQ(num, angularDamping.getValue()); EXPECT_FALSE(virtualToolCoupler->getOptionalAttachmentPoint().hasValue()); virtualToolCoupler->overrideAttachmentPoint(vec); const OptionalValueVec3& attachmentPoint = virtualToolCoupler->getOptionalAttachmentPoint(); EXPECT_TRUE(attachmentPoint.hasValue()); EXPECT_TRUE(vec.isApprox(attachmentPoint.getValue())); } { SCOPED_TRACE("Setters"); OptionalValued optionalNum; optionalNum.setValue(num); OptionalValueVec3 optionalVec; optionalVec.setValue(vec); virtualToolCoupler->overrideLinearStiffness(0.0); EXPECT_NEAR(0.0, virtualToolCoupler->getOptionalLinearStiffness().getValue(), 1e-9); virtualToolCoupler->setOptionalLinearStiffness(optionalNum); const OptionalValued& linearStiffness = virtualToolCoupler->getOptionalLinearStiffness(); EXPECT_EQ(num, linearStiffness.getValue()); virtualToolCoupler->overrideLinearDamping(0.0); EXPECT_NEAR(0.0, virtualToolCoupler->getOptionalLinearDamping().getValue(), 1e-9); virtualToolCoupler->setOptionalLinearDamping(optionalNum); const OptionalValued& linearDamping = virtualToolCoupler->getOptionalLinearDamping(); EXPECT_TRUE(linearDamping.hasValue()); EXPECT_EQ(num, linearDamping.getValue()); virtualToolCoupler->overrideAngularStiffness(0.0); EXPECT_NEAR(0.0, virtualToolCoupler->getOptionalAngularStiffness().getValue(), 1e-9); virtualToolCoupler->setOptionalAngularStiffness(optionalNum); const OptionalValued& angularStiffness = virtualToolCoupler->getOptionalAngularStiffness(); EXPECT_TRUE(angularStiffness.hasValue()); EXPECT_EQ(num, angularStiffness.getValue()); virtualToolCoupler->overrideAngularDamping(0.0); EXPECT_NEAR(0.0, virtualToolCoupler->getOptionalAngularDamping().getValue(), 1e-9); virtualToolCoupler->setOptionalAngularDamping(optionalNum); const OptionalValued& angularDamping = virtualToolCoupler->getOptionalAngularDamping(); EXPECT_TRUE(angularDamping.hasValue()); EXPECT_EQ(num, angularDamping.getValue()); virtualToolCoupler->overrideAttachmentPoint(Vector3d::Zero()); EXPECT_TRUE(virtualToolCoupler->getOptionalAttachmentPoint().getValue().isApprox(Vector3d::Zero())); virtualToolCoupler->setOptionalAttachmentPoint(optionalVec); const OptionalValueVec3& attachmentPoint = virtualToolCoupler->getOptionalAttachmentPoint(); EXPECT_TRUE(attachmentPoint.hasValue()); EXPECT_TRUE(vec.isApprox(attachmentPoint.getValue())); } } TEST_F(VirtualToolCouplerTest, Serialization) { double num = 3.6415; Vector3d vec(28.4, -37.2, 91.8); OptionalValued optionalNum; optionalNum.setValue(num); OptionalValueVec3 optionalVec; optionalVec.setValue(vec); virtualToolCoupler->setOptionalLinearStiffness(optionalNum); virtualToolCoupler->setOptionalLinearDamping(optionalNum); virtualToolCoupler->setOptionalAngularStiffness(optionalNum); virtualToolCoupler->setOptionalAngularDamping(optionalNum); virtualToolCoupler->setOptionalAttachmentPoint(optionalVec); virtualToolCoupler->setCalculateInertialTorques(true); virtualToolCoupler->setHapticOutputOnlyWhenColliding(true); // Encode YAML::Node node; EXPECT_NO_THROW(node = YAML::convert::encode(*virtualToolCoupler);); // Decode std::shared_ptr newVirtualToolCoupler; EXPECT_NO_THROW(newVirtualToolCoupler = std::dynamic_pointer_cast( node.as>())); // Verify newVirtualToolCoupler->initialize(std::make_shared()); newVirtualToolCoupler->wakeUp(); EXPECT_EQ(num, newVirtualToolCoupler->getLinearStiffness()); EXPECT_EQ(num, newVirtualToolCoupler->getLinearDamping()); EXPECT_EQ(num, newVirtualToolCoupler->getAngularStiffness()); EXPECT_EQ(num, newVirtualToolCoupler->getAngularDamping()); EXPECT_TRUE(vec.isApprox(newVirtualToolCoupler->getAttachmentPoint())); EXPECT_TRUE(newVirtualToolCoupler->getCalculateInertialTorques()); EXPECT_TRUE(virtualToolCoupler->isHapticOutputOnlyWhenColliding()); EXPECT_NE(nullptr, newVirtualToolCoupler->getInput()); EXPECT_NE(nullptr, newVirtualToolCoupler->getRepresentation()); EXPECT_EQ(nullptr, newVirtualToolCoupler->getOutput()); YAML::Node inputNode; EXPECT_NO_THROW(inputNode = YAML::convert::encode(*input);); YAML::Node representationNode; EXPECT_NO_THROW(representationNode = YAML::convert::encode(*rigidBody);); EXPECT_EQ(inputNode[input->getClassName()]["Id"].as(), node[virtualToolCoupler->getClassName()] [input->getName()][input->getClassName()]["Id"].as()); } TEST_F(VirtualToolCouplerTest, OutputDataEntries) { std::shared_ptr runtime = std::make_shared(); ASSERT_TRUE(virtualToolCoupler->initialize(runtime)); auto data = virtualToolCoupler->getOutputData(); EXPECT_EQ(1, data.poses().getNumEntries()); EXPECT_TRUE(data.poses().hasEntry(SurgSim::DataStructures::Names::INPUT_POSE)); EXPECT_EQ(4, data.vectors().getNumEntries()); EXPECT_TRUE(data.vectors().hasEntry(SurgSim::DataStructures::Names::FORCE)); EXPECT_TRUE(data.vectors().hasEntry(SurgSim::DataStructures::Names::TORQUE)); EXPECT_TRUE(data.vectors().hasEntry(SurgSim::DataStructures::Names::INPUT_LINEAR_VELOCITY)); EXPECT_TRUE(data.vectors().hasEntry(SurgSim::DataStructures::Names::INPUT_ANGULAR_VELOCITY)); EXPECT_EQ(2, data.matrices().getNumEntries()); EXPECT_TRUE(data.matrices().hasEntry(SurgSim::DataStructures::Names::SPRING_JACOBIAN)); EXPECT_TRUE(data.matrices().hasEntry(SurgSim::DataStructures::Names::DAMPER_JACOBIAN)); EXPECT_EQ(0, data.scalars().getNumEntries()); EXPECT_EQ(0, data.integers().getNumEntries()); EXPECT_EQ(0, data.booleans().getNumEntries()); EXPECT_EQ(0, data.strings().getNumEntries()); EXPECT_EQ(0, data.customData().getNumEntries()); } }; // namespace Physics }; // namespace SurgSim opensurgsim-0.7.0/SurgSim/Physics/UnitTests/config.txt.in000066400000000000000000000001201277777236100234750ustar00rootroot00000000000000${CMAKE_CURRENT_BINARY_DIR}/Data/ ${PROJECT_BINARY_DIR}/SurgSim/Testing/Data/ opensurgsim-0.7.0/SurgSim/Physics/UpdateCcdData.cpp000066400000000000000000000036411277777236100222650ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Physics/UpdateCcdData.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Framework/ThreadPool.h" #include "SurgSim/Physics/PhysicsManagerState.h" #include "SurgSim/Collision/Representation.h" #include namespace SurgSim { namespace Physics { UpdateCcdData::UpdateCcdData(bool copyState): Computation(copyState) { } UpdateCcdData::~UpdateCcdData() { } std::shared_ptr UpdateCcdData::doUpdate( const double& interval, const std::shared_ptr& state) { std::shared_ptr result = state; auto threadPool = Framework::Runtime::getThreadPool(); std::vector> tasks; const auto& pairs = result->getCollisionPairs(); std::unordered_set representations; for (const auto& pair : pairs) { if (pair->getType() == SurgSim::Collision::COLLISION_DETECTION_TYPE_CONTINUOUS) { representations.insert(pair->getFirst().get()); representations.insert(pair->getSecond().get()); } } for (auto& representation : representations) { tasks.push_back(threadPool->enqueue([interval, &representation]() { representation->updateCcdData(interval); })); } for (auto& task : tasks) { task.get(); } return result; } } }opensurgsim-0.7.0/SurgSim/Physics/UpdateCcdData.h000066400000000000000000000032721277777236100217320ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_UPDATECCDDATA_H #define SURGSIM_PHYSICS_UPDATECCDDATA_H #include "SurgSim/Framework/Macros.h" #include "SurgSim/Physics/Computation.h" namespace SurgSim { namespace Physics { class UpdateCcdData : public Computation { public: /// Constructor explicit UpdateCcdData(bool copyState); SURGSIM_CLASSNAME(SurgSim::Physics::UpdateCcdData); /// Destructor ~UpdateCcdData(); /// Change of behavior, the value transported is not the complete 'interval' but is the percentage /// of the last interval where the previous impact was found, this is to trigger the /// correct interpolation of the state from the previous state to the interpolated state. This /// value is relative to the last interval to match the behavior of the rest of the system /// \param interval Parameter to be used to interpolate the previousPhysicsState /// \param state normal PhysicsManagerState std::shared_ptr doUpdate(const double& interval, const std::shared_ptr& state) override; private: }; } } #endif opensurgsim-0.7.0/SurgSim/Physics/UpdateCollisionData.cpp000066400000000000000000000032021277777236100235200ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Physics/UpdateCollisionData.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Framework/ThreadPool.h" #include "SurgSim/Physics/PhysicsManagerState.h" #include "SurgSim/Collision/Representation.h" namespace SurgSim { namespace Physics { UpdateCollisionData::UpdateCollisionData(bool copyState) : Computation(copyState) { } UpdateCollisionData::~UpdateCollisionData() { } std::shared_ptr UpdateCollisionData::doUpdate( const double& dt, const std::shared_ptr& state) { std::shared_ptr result = state; auto threadPool = Framework::Runtime::getThreadPool(); std::vector> tasks; auto& representations = result->getActiveCollisionRepresentations(); for (auto& representation : representations) { tasks.push_back(threadPool->enqueue([dt, &representation]() { representation->updateShapeData(); })); } for (auto& task : tasks) { task.get(); } return result; } } }opensurgsim-0.7.0/SurgSim/Physics/UpdateCollisionData.h000066400000000000000000000023431277777236100231720ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_UPDATECOLLISIONDATA_H #define SURGSIM_PHYSICS_UPDATECOLLISIONDATA_H #include "SurgSim/Framework/Macros.h" #include "SurgSim/Physics/Computation.h" namespace SurgSim { namespace Physics { class UpdateCollisionData : public Computation { public: /// Constructor explicit UpdateCollisionData(bool copyState); SURGSIM_CLASSNAME(SurgSim::Physics::UpdateCollisionData); /// Destructor ~UpdateCollisionData(); std::shared_ptr doUpdate(const double& dt, const std::shared_ptr& state) override; private: }; } } #endif opensurgsim-0.7.0/SurgSim/Physics/UpdateCollisionRepresentations.cpp000066400000000000000000000033041277777236100260370ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Framework/ThreadPool.h" #include "SurgSim/Physics/UpdateCollisionRepresentations.h" #include "SurgSim/Physics/PhysicsManagerState.h" #include "SurgSim/Collision/Representation.h" namespace SurgSim { namespace Physics { UpdateCollisionRepresentations::UpdateCollisionRepresentations(bool doCopyState) : Computation(doCopyState) { } UpdateCollisionRepresentations::~UpdateCollisionRepresentations() { } std::shared_ptr SurgSim::Physics::UpdateCollisionRepresentations::doUpdate(const double& dt, const std::shared_ptr& state) { std::shared_ptr result = state; auto threadPool = Framework::Runtime::getThreadPool(); std::vector> tasks; auto& representations = result->getActiveCollisionRepresentations(); for (auto& representation : representations) { tasks.push_back(threadPool->enqueue([dt, &representation]() { representation->update(dt); })); } for (auto& task : tasks) { task.get(); } return result; } } } opensurgsim-0.7.0/SurgSim/Physics/UpdateCollisionRepresentations.h000066400000000000000000000026641277777236100255140ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_UPDATECOLLISIONREPRESENTATIONS_H #define SURGSIM_PHYSICS_UPDATECOLLISIONREPRESENTATIONS_H #include "SurgSim/Framework/Macros.h" #include "SurgSim/Physics/Computation.h" namespace SurgSim { namespace Physics { /// Computation that calls the CollisionRepresentations update() function class UpdateCollisionRepresentations : public Computation { public: /// Constructor /// \param doCopyState whether to copy the PhysicsManagerState on update explicit UpdateCollisionRepresentations(bool doCopyState); SURGSIM_CLASSNAME(SurgSim::Physics::UpdateCollisionRepresentations); /// Destructor virtual ~UpdateCollisionRepresentations(); std::shared_ptr doUpdate(const double& dt, const std::shared_ptr& state) override; }; } } #endif opensurgsim-0.7.0/SurgSim/Physics/UpdateDcdData.cpp000066400000000000000000000036111277777236100222630ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Physics/UpdateDcdData.h" #include "SurgSim/Framework/Runtime.h" #include "SurgSim/Framework/ThreadPool.h" #include "SurgSim/Physics/PhysicsManagerState.h" #include "SurgSim/Collision/Representation.h" #include namespace SurgSim { namespace Physics { UpdateDcdData::UpdateDcdData(bool copyState): Computation(copyState) { } UpdateDcdData::~UpdateDcdData() { } std::shared_ptr UpdateDcdData::doUpdate( const double& dt, const std::shared_ptr& state) { std::shared_ptr result = state; auto threadPool = Framework::Runtime::getThreadPool(); std::vector> tasks; const auto& pairs = result->getCollisionPairs(); std::unordered_set representations; for (const auto& pair : pairs) { if (pair->getType() == SurgSim::Collision::COLLISION_DETECTION_TYPE_DISCRETE) { representations.insert(pair->getFirst().get()); representations.insert(pair->getSecond().get()); } } for (auto representation : representations) { tasks.push_back(threadPool->enqueue([dt, representation]() { representation->updateDcdData(); })); } for (auto& task : tasks) { task.get(); } return result; } } }opensurgsim-0.7.0/SurgSim/Physics/UpdateDcdData.h000066400000000000000000000022771277777236100217370ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_UPDATEDCDDATA_H #define SURGSIM_PHYSICS_UPDATEDCDDATA_H #include "SurgSim/Framework/Macros.h" #include "SurgSim/Physics/Computation.h" namespace SurgSim { namespace Physics { class UpdateDcdData : public Computation { public: /// Constructor explicit UpdateDcdData(bool copyState); SURGSIM_CLASSNAME(SurgSim::Physics::UpdateDcdData); /// Destructor ~UpdateDcdData(); std::shared_ptr doUpdate(const double& dt, const std::shared_ptr& state) override; private: }; } } #endif opensurgsim-0.7.0/SurgSim/Physics/VirtualToolCoupler.cpp000066400000000000000000000473221277777236100234610ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Collision/CollisionPair.h" #include "SurgSim/Collision/Representation.h" #include "SurgSim/DataStructures/DataGroupBuilder.h" #include "SurgSim/DataStructures/DataStructuresConvert.h" #include "SurgSim/Framework/FrameworkConvert.h" #include "SurgSim/Input/InputComponent.h" #include "SurgSim/Input/OutputComponent.h" #include "SurgSim/Math/MathConvert.h" #include "SurgSim/Math/Matrix.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Physics/RigidRepresentation.h" #include "SurgSim/Physics/VirtualToolCoupler.h" using SurgSim::Math::makeSkewSymmetricMatrix; using SurgSim::Math::Vector3d; using SurgSim::Math::Vector6d; using SurgSim::Math::Matrix33d; using SurgSim::Math::Matrix66d; using SurgSim::Math::RigidTransform3d; using SurgSim::Math::Quaterniond; using SurgSim::Framework::checkAndConvert; namespace SurgSim { namespace Physics { SURGSIM_REGISTER(SurgSim::Framework::Component, SurgSim::Physics::VirtualToolCoupler, VirtualToolCoupler); VirtualToolCoupler::VirtualToolCoupler(const std::string& name) : SurgSim::Framework::Behavior(name), m_poseName(SurgSim::DataStructures::Names::POSE), m_linearStiffness(std::numeric_limits::quiet_NaN()), m_linearDamping(std::numeric_limits::quiet_NaN()), m_angularStiffness(std::numeric_limits::quiet_NaN()), m_angularDamping(std::numeric_limits::quiet_NaN()), m_localAttachmentPoint(Vector3d(std::numeric_limits::quiet_NaN(), std::numeric_limits::quiet_NaN(), std::numeric_limits::quiet_NaN())), m_calculateInertialTorques(false), m_logger(SurgSim::Framework::Logger::getLogger("Physics/VirtualToolCoupler")), m_hapticOutputOnlyWhenColliding(false), m_previousInputPose(Math::RigidTransform3d::Identity()), m_poseIndex(-1), m_linearVelocityIndex(-1), m_angularVelocityIndex(-1), m_forceIndex(-1), m_torqueIndex(-1), m_inputLinearVelocityIndex(-1), m_inputAngularVelocityIndex(-1), m_inputPoseIndex(-1), m_springJacobianIndex(-1), m_damperJacobianIndex(-1) { SURGSIM_ADD_SERIALIZABLE_PROPERTY(VirtualToolCoupler, SurgSim::DataStructures::OptionalValue, LinearStiffness, getOptionalLinearStiffness, setOptionalLinearStiffness); SURGSIM_ADD_SERIALIZABLE_PROPERTY(VirtualToolCoupler, SurgSim::DataStructures::OptionalValue, LinearDamping, getOptionalLinearDamping, setOptionalLinearDamping); SURGSIM_ADD_SERIALIZABLE_PROPERTY(VirtualToolCoupler, SurgSim::DataStructures::OptionalValue, AngularStiffness, getOptionalAngularStiffness, setOptionalAngularStiffness); SURGSIM_ADD_SERIALIZABLE_PROPERTY(VirtualToolCoupler, SurgSim::DataStructures::OptionalValue, AngularDamping, getOptionalAngularDamping, setOptionalAngularDamping); SURGSIM_ADD_SERIALIZABLE_PROPERTY(VirtualToolCoupler, SurgSim::DataStructures::OptionalValue, AttachmentPoint, getOptionalAttachmentPoint, setOptionalAttachmentPoint); SURGSIM_ADD_SERIALIZABLE_PROPERTY(VirtualToolCoupler, bool, CalculateInertialTorques, getCalculateInertialTorques, setCalculateInertialTorques); SURGSIM_ADD_SERIALIZABLE_PROPERTY(VirtualToolCoupler, bool, HapticOutputOnlyWhenColliding, isHapticOutputOnlyWhenColliding, setHapticOutputOnlyWhenColliding); SURGSIM_ADD_SERIALIZABLE_PROPERTY(VirtualToolCoupler, std::shared_ptr, Input, getInput, setInput); SURGSIM_ADD_SERIALIZABLE_PROPERTY(VirtualToolCoupler, std::shared_ptr, Output, getOutput, setOutput); SURGSIM_ADD_SERIALIZABLE_PROPERTY(VirtualToolCoupler, std::shared_ptr, Representation, getRepresentation, setRepresentation); } VirtualToolCoupler::~VirtualToolCoupler() { } const std::shared_ptr VirtualToolCoupler::getInput() { return m_input; } void VirtualToolCoupler::setInput(const std::shared_ptr input) { m_input = checkAndConvert(input, "SurgSim::Input::InputComponent"); } const std::shared_ptr VirtualToolCoupler::getOutput() { return m_output; } void VirtualToolCoupler::setOutput(const std::shared_ptr output) { m_output = checkAndConvert(output, "SurgSim::Input::OutputComponent"); } const std::shared_ptr VirtualToolCoupler::getRepresentation() { return m_rigid; } void VirtualToolCoupler::setRepresentation(const std::shared_ptr rigid) { m_rigid = std::dynamic_pointer_cast(rigid); } const std::string& VirtualToolCoupler::getPoseName() { return m_poseName; } void VirtualToolCoupler::setPoseName(const std::string& poseName) { m_poseName = poseName; } void VirtualToolCoupler::update(double dt) { DataStructures::DataGroup inputData; m_input->getData(&inputData); inputData.poses().cacheIndex(m_poseName, &m_poseIndex); inputData.vectors().cacheIndex(DataStructures::Names::LINEAR_VELOCITY, &m_linearVelocityIndex); if (m_linearVelocityIndex < 0) { SURGSIM_LOG_ONCE(m_logger, WARNING) << getFullName() << " is receiving an input DataGroup that does not " << "contain a linear velocity vector named " << DataStructures::Names::LINEAR_VELOCITY << ", so it will be estimated."; } inputData.vectors().cacheIndex(DataStructures::Names::ANGULAR_VELOCITY, &m_angularVelocityIndex); if (m_angularVelocityIndex < 0) { SURGSIM_LOG_ONCE(m_logger, WARNING) << getFullName() << " is receiving an input DataGroup that does not " << "contain an angular velocity vector named " << DataStructures::Names::ANGULAR_VELOCITY << ") so it will be estimated."; } RigidTransform3d inputPose; if (inputData.poses().get(m_poseIndex, &inputPose)) { Vector3d inputLinearVelocity(Vector3d::Zero()); const bool gotInputLinearVelocity = inputData.vectors().get(m_linearVelocityIndex, &inputLinearVelocity); if (!gotInputLinearVelocity) { inputLinearVelocity = (inputPose.translation() - m_previousInputPose.translation()) / dt; } Vector3d inputAngularVelocity(Vector3d::Zero()); const bool gotInputAngularVelocity = inputData.vectors().get(m_angularVelocityIndex, &inputAngularVelocity); if (!gotInputAngularVelocity) { Math::computeRotationVector(inputPose, m_previousInputPose, &inputAngularVelocity); inputAngularVelocity /= dt; } m_previousInputPose = inputPose; RigidTransform3d inputAlignment = m_input->getLocalPose(); inputPose = inputAlignment * inputPose; inputLinearVelocity = inputAlignment.linear() * inputLinearVelocity; inputAngularVelocity = inputAlignment.rotation() * inputAngularVelocity; RigidState objectState(m_rigid->getCurrentState()); RigidTransform3d objectPose(objectState.getPose()); Vector3d objectPosition = objectPose * m_rigid->getMassCenter(); Vector3d attachmentPoint = objectPose * m_localAttachmentPoint; Vector3d leverArm = attachmentPoint - objectPosition; Vector3d attachmentPointVelocity = objectState.getLinearVelocity(); attachmentPointVelocity += objectState.getAngularVelocity().cross(leverArm); Vector3d force = m_linearStiffness * (inputPose.translation() - attachmentPoint); force += m_linearDamping * (inputLinearVelocity - attachmentPointVelocity); Vector3d rotationVector; SurgSim::Math::computeRotationVector(inputPose, objectPose, &rotationVector); Vector3d torque = m_angularStiffness * rotationVector; torque += m_angularDamping * (inputAngularVelocity - objectState.getAngularVelocity()); Vector6d generalizedForce; generalizedForce << force, torque; const Matrix33d identity3x3 = Matrix33d::Identity(); const Matrix33d zero3x3 = Matrix33d::Zero(); Matrix66d generalizedStiffness; generalizedStiffness << m_linearStiffness * identity3x3, zero3x3, zero3x3 , m_angularStiffness * identity3x3; Matrix66d generalizedDamping; generalizedDamping << m_linearDamping * identity3x3, zero3x3, zero3x3 , m_angularDamping * identity3x3; if (m_calculateInertialTorques) { SurgSim::DataStructures::Location location; location.rigidLocalPosition.setValue(m_localAttachmentPoint); m_rigid->addExternalGeneralizedForce(location, generalizedForce, generalizedStiffness, generalizedDamping); } else { m_rigid->addExternalGeneralizedForce(generalizedForce, generalizedStiffness, generalizedDamping); } if (m_output != nullptr) { RigidTransform3d outputAlignment = m_output->getLocalPose().inverse(); Matrix33d outputAlignmentUnScaled = outputAlignment.rotation(); bool output = true; if (m_hapticOutputOnlyWhenColliding) { auto collision = m_rigid->getCollisionRepresentation(); output = (collision == nullptr) || (collision->getCollisions().unsafeGet().size() > 0); } if (output) { m_outputData.vectors().set(m_forceIndex, outputAlignmentUnScaled * (-force)); m_outputData.vectors().set(m_torqueIndex, outputAlignmentUnScaled * (-torque)); if (gotInputLinearVelocity && gotInputAngularVelocity) { m_outputData.matrices().set(m_springJacobianIndex, -generalizedStiffness); m_outputData.matrices().set(m_damperJacobianIndex, -generalizedDamping); } else { m_outputData.matrices().reset(m_springJacobianIndex); m_outputData.matrices().reset(m_damperJacobianIndex); } } else { m_outputData.vectors().set(m_forceIndex, Vector3d::Zero()); m_outputData.vectors().set(m_torqueIndex, Vector3d::Zero()); m_outputData.matrices().reset(m_springJacobianIndex); m_outputData.matrices().reset(m_damperJacobianIndex); } if (gotInputLinearVelocity) { m_outputData.vectors().set(m_inputLinearVelocityIndex, outputAlignment.linear() * inputLinearVelocity); } else { m_outputData.vectors().reset(m_inputLinearVelocityIndex); } if (gotInputAngularVelocity) { m_outputData.vectors().set(m_inputAngularVelocityIndex, outputAlignmentUnScaled * inputAngularVelocity); } else { m_outputData.vectors().reset(m_inputAngularVelocityIndex); } m_outputData.poses().set(m_inputPoseIndex, outputAlignment * inputPose); m_output->setData(m_outputData); } } } bool VirtualToolCoupler::doInitialize() { m_outputData = buildOutputData(); m_forceIndex = m_outputData.vectors().getIndex(SurgSim::DataStructures::Names::FORCE); m_torqueIndex = m_outputData.vectors().getIndex(SurgSim::DataStructures::Names::TORQUE); m_inputLinearVelocityIndex = m_outputData.vectors().getIndex(SurgSim::DataStructures::Names::INPUT_LINEAR_VELOCITY); m_inputAngularVelocityIndex = m_outputData.vectors().getIndex(SurgSim::DataStructures::Names::INPUT_ANGULAR_VELOCITY); m_inputPoseIndex = m_outputData.poses().getIndex(SurgSim::DataStructures::Names::INPUT_POSE); m_springJacobianIndex = m_outputData.matrices().getIndex(SurgSim::DataStructures::Names::SPRING_JACOBIAN); m_damperJacobianIndex = m_outputData.matrices().getIndex(SurgSim::DataStructures::Names::DAMPER_JACOBIAN); return true; } SurgSim::DataStructures::DataGroup VirtualToolCoupler::buildOutputData() { SurgSim::DataStructures::DataGroupBuilder builder; builder.addVector(SurgSim::DataStructures::Names::FORCE); builder.addVector(SurgSim::DataStructures::Names::TORQUE); builder.addMatrix(SurgSim::DataStructures::Names::SPRING_JACOBIAN); builder.addPose(SurgSim::DataStructures::Names::INPUT_POSE); builder.addMatrix(SurgSim::DataStructures::Names::DAMPER_JACOBIAN); builder.addVector(SurgSim::DataStructures::Names::INPUT_LINEAR_VELOCITY); builder.addVector(SurgSim::DataStructures::Names::INPUT_ANGULAR_VELOCITY); return builder.createData(); } bool VirtualToolCoupler::doWakeUp() { if (m_input == nullptr) { SURGSIM_LOG_SEVERE(m_logger) << "VirtualToolCoupler named " << getName() << " does not have an Input Component."; return false; } if (m_rigid == nullptr) { SURGSIM_LOG_SEVERE(m_logger) << "VirtualToolCoupler named " << getName() << " does not have a Representation."; return false; } if (m_optionalAttachmentPoint.hasValue()) { m_localAttachmentPoint = m_optionalAttachmentPoint.getValue(); } else { m_localAttachmentPoint = m_rigid->getMassCenter(); } // Provide sensible defaults based on the rigid representation. // If one or both of the stiffness and damping are not provided, they are // calculated to provide a critically damped system (dampingRatio-1.0). // For a mass-spring system, the damping ratio is defined as: // // dampingRatio = (damping) / (2 * sqrt(mass * stiffness)) // double dampingRatio = 1.0; double mass = m_rigid->getMass(); if (!m_optionalLinearDamping.hasValue()) { if (m_optionalLinearStiffness.hasValue()) { m_linearStiffness = m_optionalLinearStiffness.getValue(); } else { m_linearStiffness = mass * 100.0; } m_linearDamping = 2.0 * dampingRatio * sqrt(mass * m_linearStiffness); } else { m_linearDamping = m_optionalLinearDamping.getValue(); if (m_optionalLinearStiffness.hasValue()) { m_linearStiffness = m_optionalLinearStiffness.getValue(); } else { m_linearStiffness = pow(m_linearDamping / dampingRatio, 2) / (4.0 * mass); } } Matrix33d leverArmMatrix = makeSkewSymmetricMatrix((m_localAttachmentPoint - m_rigid->getMassCenter()).eval()); const Matrix33d& inertia = m_rigid->getLocalInertia() + mass * leverArmMatrix * leverArmMatrix; double maxInertia = inertia.eigenvalues().real().maxCoeff(); if (!m_optionalAngularDamping.hasValue()) { if (m_optionalAngularStiffness.hasValue()) { m_angularStiffness = m_optionalAngularStiffness.getValue(); } else { m_angularStiffness = maxInertia * 1000.0; } m_angularDamping = 2.0 * dampingRatio * sqrt(maxInertia * m_angularStiffness); } else { m_angularDamping = m_optionalAngularDamping.getValue(); if (m_optionalAngularStiffness.hasValue()) { m_angularStiffness = m_optionalAngularStiffness.getValue(); } else { m_angularStiffness = pow(m_angularDamping / dampingRatio, 2) / (4.0 * maxInertia); } } SURGSIM_LOG_INFO(m_logger) << "VirtualToolCoupler named '" << getName() << "' has linear stiffness " << m_linearStiffness << ", linear damping " << m_linearDamping << ", angular stiffness " << m_angularStiffness << ", and angular damping " << m_angularDamping << ". Its Physics Representation has mass " << m_rigid->getMass(); return true; } int VirtualToolCoupler::getTargetManagerType() const { return SurgSim::Framework::MANAGER_TYPE_PHYSICS; } void VirtualToolCoupler::overrideLinearStiffness(double linearStiffness) { SURGSIM_ASSERT(!isInitialized()) << "Cannot override vtc parameter after it has initialized"; m_optionalLinearStiffness.setValue(linearStiffness); m_linearStiffness = linearStiffness; } double VirtualToolCoupler::getLinearStiffness() { SURGSIM_ASSERT(isAwake() || m_optionalLinearStiffness.hasValue()) << "Vtc parameter has not been initialized"; return m_linearStiffness; } void VirtualToolCoupler::overrideLinearDamping(double linearDamping) { SURGSIM_ASSERT(!isInitialized()) << "Cannot override vtc parameter after it has initialized"; m_optionalLinearDamping.setValue(linearDamping); m_linearDamping = linearDamping; } double VirtualToolCoupler::getLinearDamping() { SURGSIM_ASSERT(isAwake() || m_optionalLinearDamping.hasValue()) << "Vtc parameter has not been initialized"; return m_linearDamping; } void VirtualToolCoupler::overrideAngularStiffness(double angularStiffness) { SURGSIM_ASSERT(!isInitialized()) << "Cannot override vtc parameter after it has initialized"; m_optionalAngularStiffness.setValue(angularStiffness); m_angularStiffness = angularStiffness; } double VirtualToolCoupler::getAngularStiffness() { SURGSIM_ASSERT(isAwake() || m_optionalAngularStiffness.hasValue()) << "Vtc parameter has not been initialized"; return m_angularStiffness; } void VirtualToolCoupler::overrideAngularDamping(double angularDamping) { SURGSIM_ASSERT(!isInitialized()) << "Cannot override vtc parameter after it has initialized"; m_optionalAngularDamping.setValue(angularDamping); m_angularDamping = angularDamping; } double VirtualToolCoupler::getAngularDamping() { SURGSIM_ASSERT(isAwake() || m_optionalAngularDamping.hasValue()) << "Vtc parameter has not been initialized"; return m_angularDamping; } void VirtualToolCoupler::overrideAttachmentPoint(const SurgSim::Math::Vector3d& attachment) { SURGSIM_ASSERT(!isInitialized()) << "Cannot override vtc parameter after it has initialized"; m_optionalAttachmentPoint.setValue(attachment); m_localAttachmentPoint = attachment; } const SurgSim::Math::Vector3d& VirtualToolCoupler::getAttachmentPoint() { SURGSIM_ASSERT(isAwake() || m_optionalAttachmentPoint.hasValue()) << "Vtc parameter has not been initialized"; return m_localAttachmentPoint; } void VirtualToolCoupler::setOptionalLinearStiffness( const SurgSim::DataStructures::OptionalValue& linearStiffness) { m_optionalLinearStiffness = linearStiffness; } const SurgSim::DataStructures::OptionalValue& VirtualToolCoupler::getOptionalLinearStiffness() const { return m_optionalLinearStiffness; } void VirtualToolCoupler::setOptionalLinearDamping(const SurgSim::DataStructures::OptionalValue& linearDamping) { m_optionalLinearDamping = linearDamping; } const SurgSim::DataStructures::OptionalValue& VirtualToolCoupler::getOptionalLinearDamping() const { return m_optionalLinearDamping; } void VirtualToolCoupler::setOptionalAngularStiffness( const SurgSim::DataStructures::OptionalValue& angularStiffness) { m_optionalAngularStiffness = angularStiffness; } const SurgSim::DataStructures::OptionalValue& VirtualToolCoupler::getOptionalAngularStiffness() const { return m_optionalAngularStiffness; } void VirtualToolCoupler::setOptionalAngularDamping( const SurgSim::DataStructures::OptionalValue& angularDamping) { m_optionalAngularDamping = angularDamping; } const SurgSim::DataStructures::OptionalValue& VirtualToolCoupler::getOptionalAngularDamping() const { return m_optionalAngularDamping; } void VirtualToolCoupler::setOptionalAttachmentPoint( const SurgSim::DataStructures::OptionalValue& attachmentPoint) { m_optionalAttachmentPoint = attachmentPoint; } const SurgSim::DataStructures::OptionalValue& VirtualToolCoupler::getOptionalAttachmentPoint() const { return m_optionalAttachmentPoint; } void VirtualToolCoupler::setCalculateInertialTorques(bool calculateInertialTorques) { m_calculateInertialTorques = calculateInertialTorques; } bool VirtualToolCoupler::getCalculateInertialTorques() const { return m_calculateInertialTorques; } void VirtualToolCoupler::doRetire() { m_outputData.resetAll(); Behavior::doRetire(); } void VirtualToolCoupler::setLocalActive(bool val) { m_outputData.resetAll(); Behavior::setLocalActive(val); } bool VirtualToolCoupler::isHapticOutputOnlyWhenColliding() const { return m_hapticOutputOnlyWhenColliding; } void VirtualToolCoupler::setHapticOutputOnlyWhenColliding(bool hapticOutputOnlyWhenColliding) { m_hapticOutputOnlyWhenColliding = hapticOutputOnlyWhenColliding; } }; /// Physics }; /// SurgSim opensurgsim-0.7.0/SurgSim/Physics/VirtualToolCoupler.h000066400000000000000000000310351277777236100231200ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_PHYSICS_VIRTUALTOOLCOUPLER_H #define SURGSIM_PHYSICS_VIRTUALTOOLCOUPLER_H #include #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/DataStructures/DataGroupBuilder.h" #include "SurgSim/DataStructures/OptionalValue.h" #include "SurgSim/Framework/Behavior.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Framework/ObjectFactory.h" namespace SurgSim { namespace Input { class InputComponent; class OutputComponent; } namespace Physics { class RigidRepresentation; SURGSIM_STATIC_REGISTRATION(VirtualToolCoupler); /// The VirtualToolCoupler couples a rigid object to an input/output device through a spring and damper. /// The object will follow the pose provided by the device. If an Output is connected, it is provided /// forces and torques that will push the device towards matching the object's pose and velocity. /// This "virtual coupling" or "god-object" paradigm is common for haptic applications utilizing a device that /// may update significantly faster than the physics computation thread. /// /// For an overview of haptics see: /// Salisbury, Kenneth, Francois Conti, and Federico Barbagli. "Haptic rendering: introductory concepts." /// Computer Graphics and Applications, IEEE 24.2 (2004): 24-32. /// /// For an introduction to virtual coupling see: /// Colgate, J. Edward, Michael C. Stanley, and J. Michael Brown. "Issues in the haptic display of tool use." /// Intelligent Robots and Systems 95.'Human Robot Interaction and Cooperative Robots', /// Proceedings. 1995 IEEE/RSJ International Conference on. Vol. 3. IEEE, 1995. class VirtualToolCoupler : public Framework::Behavior { public: /// Constructor /// \param name Name of the behavior explicit VirtualToolCoupler(const std::string& name); ~VirtualToolCoupler(); SURGSIM_CLASSNAME(SurgSim::Physics::VirtualToolCoupler); /// \return Input Component to get the pose from const std::shared_ptr getInput(); /// Set the Input Component. /// The force calculations rely upon pose and velocity. If the input DataGroup does not contain a pose, no forces /// will be calculated. If the input DataGroup does not contain linear velocity or angular velocity, they will /// be estimated. /// \param input Input Component to get the pose from void setInput(const std::shared_ptr input); /// \return Output Component to send forces and torques const std::shared_ptr getOutput(); /// Set the Output Component (if any) /// \param output Output Component to send forces and torques void setOutput(const std::shared_ptr output); /// \return Rigid Representation that provides state and receives external forces and torques const std::shared_ptr getRepresentation(); /// Set the Physics Representation which follows the input /// \param rigid Rigid Representation that provides state and receives external forces and torques void setRepresentation(const std::shared_ptr rigid); /// Get whether or not the haptic forces should be provided only during collisions. /// \return false if the VTC forces and torques are sent to the output device (if any) at all times. true if /// zeros are sent for the forces and torques unless the tool is colliding. bool isHapticOutputOnlyWhenColliding() const; /// Set whether or not the haptic forces should be provided only during collisions. /// \param haptic false to send the VTC forces and torques to the output device (if any) at all times. true to /// send zeros for the forces and torques unless the tool is colliding. void setHapticOutputOnlyWhenColliding(bool haptic); /// \return Name of the pose data in the input to transfer const std::string& getPoseName(); /// Set the name of the pose entry in the input DataGroup /// \param poseName Name of the pose data in the input to transfer void setPoseName(const std::string& poseName = DataStructures::Names::POSE); void update(double dt) override; /// Override the linear stiffness connecting the input device and the physics representation /// If this value is not provided, the stiffness will be automatically tuned using /// the properties of the Representation /// \param linearStiffness The stiffness of the vtc in linear mode (in N·m-1) void overrideLinearStiffness(double linearStiffness); /// \return The stiffness of the vtc in linear mode (in N·m-1) double getLinearStiffness(); /// Override the linear damping connecting the input device and the physics representation /// If this value is not provided, the damping will be automatically tuned using /// the properties of the Representation /// \param linearDamping The damping of the vtc in linear mode (in N·s·m-1 or Kg·s-1) void overrideLinearDamping(double linearDamping); /// \return The damping of the vtc in linear mode (in N·s·m-1 or Kg·s-1) double getLinearDamping(); /// Override the angular stiffness connecting the input device and the physics representation /// If this value is not provided, the stiffness will be automatically tuned using /// the properties of the Representation /// \param angularStiffness The stiffness of the vtc in angular mode (in N·m rad-1) void overrideAngularStiffness(double angularStiffness); /// \return The stiffness of the vtc in angular mode (in N·m rad-1) double getAngularStiffness(); /// Override the angular damping connecting the input device and the physics representation /// If this value is not provided, the damping will be automatically tuned using /// the properties of the Representation /// \param angularDamping The damping of the vtc in angular mode (in N·m·s·rad-1) void overrideAngularDamping(double angularDamping); /// \return The damping of the vtc in angular mode (in N·m·s·rad-1) double getAngularDamping(); /// Override the point of attachment to the Representation /// If this value is not provided, the point of attachment will be automatically /// set to the Representation's center of mass. /// \param attachment The attachment point in the Representations local coordinate frame void overrideAttachmentPoint(const Math::Vector3d& attachment); /// Get the point of attachment on the Representation /// \return The attachment point in the Representations local coordinate frame const Math::Vector3d& getAttachmentPoint(); /// Enable/disable torques that simulate inertia. This setting only has an effect if the attachment point is not /// the mass center. /// \sa overrideAttachmentPoint /// \param calculateInertialTorques true to simulate inertia. void setCalculateInertialTorques(bool calculateInertialTorques); /// Get whether the calculated torques will simulate inertia. This setting only has an effect if the attachment /// point is not the mass center. /// \sa overrideAttachmentPoint /// \return true if inertia is being simulated. bool getCalculateInertialTorques() const; void doRetire() override; void setLocalActive(bool val) override; protected: bool doInitialize() override; bool doWakeUp() override; int getTargetManagerType() const override; /// \return The DataGroup to be sent to the device via the OutputComponent. virtual DataStructures::DataGroup buildOutputData(); /// Used for Serialization. /// \param linearStiffness The OptionalValue object containing the stiffness of the vtc in linear mode (in N·m-1) void setOptionalLinearStiffness(const DataStructures::OptionalValue& linearStiffness); /// Used for Serialization. /// \return The OptionalValue object containing the stiffness of the vtc in linear mode (in N·m-1) const DataStructures::OptionalValue& getOptionalLinearStiffness() const; /// Used for Serialization. /// \param linearDamping The OptionalValue object containing the damping of the vtc in linear /// mode (in N·s·m-1 or Kg·s-1) void setOptionalLinearDamping(const DataStructures::OptionalValue& linearDamping); /// Used for Serialization. /// \return The OptionalValue object containing the damping of the vtc in linear mode (in N·s·m-1 or Kg·s-1) const DataStructures::OptionalValue& getOptionalLinearDamping() const; /// Used for Serialization. /// \param angularStiffness The OptionalValue object containing the stiffness of the vtc in angular /// mode (in N·m rad-1) void setOptionalAngularStiffness(const DataStructures::OptionalValue& angularStiffness); /// Used for Serialization. /// \return The OptionalValue object containing the stiffness of the vtc in angular mode (in N·m rad-1) const DataStructures::OptionalValue& getOptionalAngularStiffness() const; /// Used for Serialization. /// \param angularDamping The OptionalValue object containing the damping of the vtc in angular /// mode (in N·m·s·rad-1) void setOptionalAngularDamping(const DataStructures::OptionalValue& angularDamping); /// Used for Serialization. /// \return The OptionalValue object containing the damping of the vtc in angular mode (in N·m·s·rad-1) const DataStructures::OptionalValue& getOptionalAngularDamping() const; /// Used for Serialization. /// \param attachmentPoint The OptionalValue object containing the attachment point. void setOptionalAttachmentPoint(const DataStructures::OptionalValue& attachmentPoint); /// Used for Serialization. /// \return The OptionalValue object containing the attachment point. const DataStructures::OptionalValue& getOptionalAttachmentPoint() const; /// User supplied Vtc stiffness parameter in linear mode (in N·m-1) DataStructures::OptionalValue m_optionalLinearStiffness; /// User supplied Vtc damping parameter in linear mode (in N·s·m-1 or Kg·s-1) DataStructures::OptionalValue m_optionalLinearDamping; /// User supplied Vtc stiffness parameter in angular mode (in N·m rad-1) DataStructures::OptionalValue m_optionalAngularStiffness; /// User supplied Vtc damping parameter in angular mode (in N·m·s·rad-1) DataStructures::OptionalValue m_optionalAngularDamping; /// User supplied attachment point DataStructures::OptionalValue m_optionalAttachmentPoint; /// The DataGroup to output DataStructures::DataGroup m_outputData; /// The input component. std::shared_ptr m_input; /// The output component. std::shared_ptr m_output; private: std::shared_ptr m_rigid; std::string m_poseName; /// Used Vtc stiffness parameter in linear mode (in N·m-1) double m_linearStiffness; /// Used Vtc damping parameter in linear mode (in N·s·m-1 or Kg·s-1) double m_linearDamping; /// Used Vtc stiffness parameter in angular mode (in N·m rad-1) double m_angularStiffness; /// Used Vtc damping parameter in angular mode (in N·m·s·rad-1) double m_angularDamping; /// Scaling factor for the forces sent to the OutputComponent double m_outputForceScaling; /// Scaling factor for the torques sent to the OutputComponent double m_outputTorqueScaling; /// The input's point of attachment in the local frame, i.e., the same frame in which the mass center is defined. Math::Vector3d m_localAttachmentPoint; /// Whether or not the calculated torques will simulate inertia. This setting only has an effect if the device /// input point is not the mass center. bool m_calculateInertialTorques; /// The logger. std::shared_ptr m_logger; /// Whether or not the VTC sends forces and torques to the output device (if any) only when the tool is colliding. bool m_hapticOutputOnlyWhenColliding; /// The previous input pose. Math::RigidTransform3d m_previousInputPose; ///@{ /// Cached DataGroup indices. int m_poseIndex; int m_linearVelocityIndex; int m_angularVelocityIndex; int m_forceIndex; int m_torqueIndex; int m_inputLinearVelocityIndex; int m_inputAngularVelocityIndex; int m_inputPoseIndex; int m_springJacobianIndex; int m_damperJacobianIndex; ///@} }; }; // Physics }; // SurgSim #endif // SURGSIM_PHYSICS_VIRTUALTOOLCOUPLER_H opensurgsim-0.7.0/SurgSim/Serialize/000077500000000000000000000000001277777236100174345ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Serialize/CMakeLists.txt000066400000000000000000000023411277777236100221740ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2012-2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. include_directories( ) set(SURGSIM_SERIALIZE_SOURCES GraphicsConvert.cpp ShapesFactory.cpp ) set(SURGSIM_SERIALIZE_HEADERS GraphicsConvert.h ShapesFactory.h ShapesFactory-inl.h ) surgsim_create_library_header(Serialize.h "${SURGSIM_SERIALIZE_HEADERS}") surgsim_add_library( SurgSimSerialize "${SURGSIM_SERIALIZE_SOURCES}" "${SURGSIM_SERIALIZE_HEADERS}" ) set(LIBS ) target_link_libraries(SurgSimSerialize ${LIBS} ) if(BUILD_TESTING) add_subdirectory(UnitTests) endif() # Put SurgSimSerialize into folder "Serialize" set_target_properties(SurgSimSerialize PROPERTIES FOLDER "Serialize") opensurgsim-0.7.0/SurgSim/Serialize/GraphicsConvert.cpp000066400000000000000000000041701277777236100232430ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Serialize/GraphicsConvert.h" namespace YAML { /// Specialize of YAML::convert<> template Presensation class. Node convert::encode(const SurgSim::Graphics::Representation& rhs) { Node node; node = convert::encode(rhs); node["initialPose"] = rhs.getInitialPose(); node["pose"] = rhs.getPose(); return node; } bool convert::decode(const Node& node, std::shared_ptr rhs) { if (! node.IsMap()) { return false; } convert::decode(node, rhs); rhs->setInitialPose(node["initialPose"].as()); rhs->setPose(node["pose"].as()); return true; } /// Specialize of YAML::convert<> template SpherePresensation class. Node convert::encode(const SurgSim::Graphics::SphereRepresentation& rhs) { Node node; node = convert::encode(rhs); node["class"] = "SphereRepresentation"; node["radius"] = rhs.getRadius(); return node; } bool convert::decode(const Node& node, std::shared_ptr rhs) { if (! node.IsMap()) { return false; } convert::decode(node, rhs); rhs->setRadius(node["radius"].as()); return true; } }opensurgsim-0.7.0/SurgSim/Serialize/GraphicsConvert.h000066400000000000000000000031671277777236100227150ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_SERIALIZE_GRAPHICSCONVERT_H #define SURGSIM_SERIALIZE_GRAPHICSCONVERT_H #include "SurgSim/Serialize/Convert.h" #include "SurgSim/Serialize/FrameworkConvert.h" #include "SurgSim/Serialize/MathConvert.h" #include "SurgSim/Graphics/Representation.h" #include "SurgSim/Graphics/SphereRepresentation.h" namespace YAML { /// Specialize of YAML::convert<> template Represensation class. template <> struct convert { static Node encode(const SurgSim::Graphics::Representation& rhs); static bool decode(const Node& node, std::shared_ptr rhs); }; /// Specialize of YAML::convert<> template SphereRepresensation class. template <> struct convert { static Node encode(const SurgSim::Graphics::SphereRepresentation& rhs); static bool decode(const Node& node, std::shared_ptr rhs); }; }; #endif // SURGSIM_SERIALIZE_GRAPHICSCONVERT_H opensurgsim-0.7.0/SurgSim/Serialize/ShapesFactory-inl.h000066400000000000000000000021341277777236100231400ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_SERIALIZE_SHAPESFACTORY_INL_H #define SURGSIM_SERIALIZE_SHAPESFACTORY_INL_H namespace SurgSim { namespace Serialize { template void SurgSim::Serialize::ShapesFactory::registerShape(const std::string& className) { if (m_registerDirectory.find(className) == m_registerDirectory.end()) { m_registerDirectory[className] = boost::factory>(); }; }; }; }; #endif // SURGSIM_SERIALIZE_SHAPESFACTORY_INL_Hopensurgsim-0.7.0/SurgSim/Serialize/ShapesFactory.cpp000066400000000000000000000023541277777236100227170ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Serialize/ShapesFactory.h" namespace SurgSim { namespace Serialize { /// Constructor SurgSim::Serialize::ShapesFactory::ShapesFactory() { } /// Destructor SurgSim::Serialize::ShapesFactory::~ShapesFactory() { } std::shared_ptr SurgSim::Serialize::ShapesFactory:: createShape(const std::string& className) { auto it = m_registerDirectory.find(className); /// Return a nullptr if the class name has not been registered before. if (it == m_registerDirectory.end()) { return nullptr; } return (it->second)(); }; }; };opensurgsim-0.7.0/SurgSim/Serialize/ShapesFactory.h000066400000000000000000000036321277777236100223640ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_SERIALIZE_SHAPESFACTORY_H #define SURGSIM_SERIALIZE_SHAPESFACTORY_H #include "SurgSim/Math/Shape.h" #include #include namespace SurgSim { namespace Serialize { /// A factory implementation for shapes class ShapesFactory { public: /// Constructor ShapesFactory(); /// Destructor virtual ~ShapesFactory(); /// Template version to register a shape into the internal directory. /// \tparam T The specific type of the shape to be registered. /// \param className The identifier name to be used. template void registerShape(const std::string& className); /// Create an instance of derived rigid shape based on the specific class name. /// \param className The identifier name to be used. /// \return a pointer to the object of derived rigid shape, or nullptr otherwise. std::shared_ptr createShape(const std::string& className); private: /// A wrapper of function object typedef boost::function ()> ShapesFactoryFunction; /// Look up table for shapes factory. std::map m_registerDirectory; }; } } #include "SurgSim/Serialize/ShapesFactory-inl.h" #endif // SURGSIM_SERIALIZE_SHAPESFACTORY_Hopensurgsim-0.7.0/SurgSim/Serialize/UnitTests/000077500000000000000000000000001277777236100213765ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Serialize/UnitTests/CMakeLists.txt000066400000000000000000000021661277777236100241430ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2012-2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. include_directories( ${gtest_SOURCE_DIR}/include ) set(UNIT_TEST_SOURCES GraphicsConvertTest.cpp ShapesConvertTest.cpp ShapesFactoryTest.cpp ) set(UNIT_TEST_HEADERS ) set(LIBS SurgSimSerialize SurgSimPhysics SurgSimMath SurgSimFramework SurgSimGraphics gmock gtest ${YAML_CPP_LIBRARIES}} ${Boost_LIBRARIES} ) surgsim_add_unit_tests(SurgSimSerializeTest) # Put SurgSimSerializeTest into folder "Serialize" set_target_properties(SurgSimSerializeTest PROPERTIES FOLDER "Serialize") opensurgsim-0.7.0/SurgSim/Serialize/UnitTests/GraphicsConvertTest.cpp000066400000000000000000000050011277777236100260370ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include "SurgSim/Serialize/GraphicsConvert.h" #include "SurgSim/Graphics/SphereRepresentation.h" #include "SurgSim/Graphics/OsgSphereRepresentation.h" class GraphicsConvertTest : public ::testing::Test { protected: // Setup out stream file void SetUp() { datafile = "convertertest.yaml"; fout.open(datafile); } // Remove the config testing file void TearDown() { remove(datafile.c_str()); } // Stream file std::ofstream fout; // Datafile name std::string datafile; }; TEST_F(GraphicsConvertTest, ConvertSphereRepresentationTest) { YAML::Node node; YAML::Emitter outnode(fout); std::shared_ptr sphereRepresentation = std::make_shared("Sphere_Obj"); double sphereRadius = 5.0; sphereRepresentation->setRadius(sphereRadius); SurgSim::Math::RigidTransform3d spherePose = SurgSim::Math::makeRigidTransform( SurgSim::Math::Quaterniond(SurgSim::Math::Vector4d::Identity()).normalized(), SurgSim::Math::Vector3d::Identity()); sphereRepresentation->setPose(spherePose); /// Encoding sphere representation node = YAML::convert::encode(*sphereRepresentation); outnode << node; fout.close(); /// Decoding sphere representation YAML::Node innode = YAML::LoadFile(datafile); std::shared_ptr actualSphere = std::make_shared("ImageSphere"); YAML::convert::decode(innode, actualSphere); EXPECT_EQ(sphereRepresentation->getRadius(), actualSphere->getRadius()); EXPECT_TRUE(actualSphere->getInitialPose().matrix().isApprox(sphereRepresentation->getInitialPose().matrix())); EXPECT_TRUE(actualSphere->getPose().matrix().isApprox(sphereRepresentation->getPose().matrix())); }opensurgsim-0.7.0/SurgSim/Serialize/UnitTests/ShapesConvertTest.cpp000066400000000000000000000172701277777236100255350ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include "SurgSim/Math/BoxShape.h" #include "SurgSim/Math/CapsuleShape.h" #include "SurgSim/Math/CylinderShape.h" #include "SurgSim/Math/DoubleSidedPlaneShape.h" #include "SurgSim/Math/PlaneShape.h" #include "SurgSim/Math/SphereShape.h" #include "SurgSim/Math/Shape.h" #include "SurgSim/Framework/Convert.h" #include "SurgSim/Serialize/ShapesFactory.h" class ShapesConvertTest : public ::testing::Test { protected: // Setup out stream file void SetUp() { datafile = "ShapesConvertTest.yaml"; fout.open(datafile); } // Remove the config testing file void TearDown() { remove(datafile.c_str()); } // Stream file std::ofstream fout; // Datafile name std::string datafile; }; TEST_F(ShapesConvertTest, BoxConvertTest) { YAML::Node node; YAML::Emitter emitter(fout); std::shared_ptr shape = std::make_shared(1.0, 2.0, 3.0); /// Registering classes std::shared_ptr rigidShapesFactory= std::make_shared(); rigidShapesFactory->registerShape(shape->getClassName()); /// Encoding box shape node = shape->encode(); emitter << node; fout.close(); /// Decoding box shape YAML::Node innode = YAML::LoadFile(datafile); std::string className = innode["ClassName"].as(); /// Instantiate derived objected from class name. std::shared_ptr actualShape = rigidShapesFactory->createShape(className); actualShape->decode(innode); EXPECT_EQ(SurgSim::Math::SHAPE_TYPE_BOX, actualShape->getType()); EXPECT_EQ(shape->getSizeX(), std::static_pointer_cast(actualShape)->getSizeX()); EXPECT_EQ(shape->getSizeY(), std::static_pointer_cast(actualShape)->getSizeY()); EXPECT_EQ(shape->getSizeZ(), std::static_pointer_cast(actualShape)->getSizeZ()); } TEST_F(ShapesConvertTest, CapsuleConvertTest) { YAML::Node node; YAML::Emitter emitter(fout); std::shared_ptr shape = std::make_shared(1.0, 0.5); /// Registering classes std::shared_ptr rigidShapesFactory= std::make_shared(); rigidShapesFactory->registerShape(shape->getClassName()); /// Encoding box shape node = shape->encode(); emitter << node; fout.close(); /// Decoding box shape YAML::Node innode = YAML::LoadFile(datafile); std::string className = innode["ClassName"].as(); /// Instantiate derived objected from class name. std::shared_ptr actualShape = rigidShapesFactory->createShape(className); actualShape->decode(innode); EXPECT_EQ(SurgSim::Math::SHAPE_TYPE_CAPSULE, actualShape->getType()); EXPECT_EQ(shape->getLength(), std::static_pointer_cast(actualShape)->getLength()); EXPECT_EQ(shape->getRadius(), std::static_pointer_cast(actualShape)->getRadius()); } TEST_F(ShapesConvertTest, CylinderConvertTest) { YAML::Node node; YAML::Emitter emitter(fout); std::shared_ptr shape = std::make_shared(1.0, 0.5); /// Registering classes std::shared_ptr rigidShapesFactory= std::make_shared(); rigidShapesFactory->registerShape(shape->getClassName()); /// Encoding box shape node = shape->encode(); emitter << node; fout.close(); /// Decoding box shape YAML::Node innode = YAML::LoadFile(datafile); std::string className = innode["ClassName"].as(); /// Instantiate derived objected from class name. std::shared_ptr actualShape = rigidShapesFactory->createShape(className); actualShape->decode(innode); EXPECT_EQ(SurgSim::Math::SHAPE_TYPE_CYLINDER, actualShape->getType()); EXPECT_EQ(shape->getLength(), std::static_pointer_cast(actualShape)->getLength()); EXPECT_EQ(shape->getRadius(), std::static_pointer_cast(actualShape)->getRadius()); } TEST_F(ShapesConvertTest, SphereConvertTest) { YAML::Node node; YAML::Emitter emitter(fout); std::shared_ptr shape = std::make_shared(2.0); /// Registering classes std::shared_ptr rigidShapesFactory= std::make_shared(); rigidShapesFactory->registerShape(shape->getClassName()); /// Encoding box shape node = shape->encode(); emitter << node; fout.close(); /// Decoding box shape YAML::Node innode = YAML::LoadFile(datafile); std::string className = innode["ClassName"].as(); /// Instantiate derived objected from class name. std::shared_ptr actualShape = rigidShapesFactory->createShape(className); actualShape->decode(innode); EXPECT_EQ(SurgSim::Math::SHAPE_TYPE_SPHERE, actualShape->getType()); EXPECT_EQ(shape->getRadius(), std::static_pointer_cast(actualShape)->getRadius()); } TEST_F(ShapesConvertTest, DoubleSidedPlaneShapeTest) { YAML::Node node; YAML::Emitter emitter(fout); std::shared_ptr shape = std::make_shared(); /// Registering classes std::shared_ptr rigidShapesFactory= std::make_shared(); rigidShapesFactory->registerShape(shape->getClassName()); /// Encoding box shape node = shape->encode(); emitter << node; fout.close(); /// Decoding box shape YAML::Node innode = YAML::LoadFile(datafile); std::string className = innode["ClassName"].as(); /// Instantiate derived objected from class name. std::shared_ptr actualShape = rigidShapesFactory->createShape(className); actualShape->decode(innode); EXPECT_EQ(SurgSim::Math::SHAPE_TYPE_DOUBLESIDEDPLANE, actualShape->getType()); } TEST_F(ShapesConvertTest, PlaneConvertTest) { YAML::Node node; YAML::Emitter emitter(fout); std::shared_ptr shape = std::make_shared(); /// Registering classes std::shared_ptr rigidShapesFactory= std::make_shared(); rigidShapesFactory->registerShape(shape->getClassName()); /// Encoding box shape node = shape->encode(); emitter << node; fout.close(); /// Decoding box shape YAML::Node innode = YAML::LoadFile(datafile); std::string className = innode["ClassName"].as(); /// Instantiate derived objected from class name. std::shared_ptr actualShape = rigidShapesFactory->createShape(className); actualShape->decode(innode); EXPECT_EQ(SurgSim::Math::SHAPE_TYPE_PLANE, actualShape->getType()); }opensurgsim-0.7.0/SurgSim/Serialize/UnitTests/ShapesFactoryTest.cpp000066400000000000000000000140731277777236100255220ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Math/BoxShape.h" #include "SurgSim/Math/CapsuleShape.h" #include "SurgSim/Math/CylinderShape.h" #include "SurgSim/Math/DoubleSidedPlaneShape.h" #include "SurgSim/Math/PlaneShape.h" #include "SurgSim/Math/SphereShape.h" #include "SurgSim/Math/Shape.h" #include "SurgSim/Serialize/ShapesFactory.h" TEST(ShapesFactoryTest, InitTest) { ASSERT_NO_THROW({std::shared_ptr rigidShapesFactory = std::make_shared();}); } TEST(ShapesFactoryTest, CreateShapeInstancesTest) { std::shared_ptr rigidShapesFactory = std::make_shared(); std::string boxName = "SurgSim::Physics::BoxShape"; /// Register derived object classes rigidShapesFactory->registerShape(boxName); /// Instantiate derived objects from class name. std::shared_ptr boxShape1 = rigidShapesFactory->createShape(boxName); std::shared_ptr boxShape2 = rigidShapesFactory->createShape(boxName); // Expect all derived objects from the same class are not the same! EXPECT_NE(boxShape1, boxShape2); } TEST(ShapesFactoryTest, CreateShapesTest) { std::shared_ptr rigidShapesFactory = std::make_shared(); std::string boxName = "SurgSim::Physics::BoxShape"; std::string capsuleName = "SurgSim::Physics::CapsuleShape"; std::string cylinderName = "SurgSim::Physics::CylinderShape"; std::string doublesideplaneName = "SurgSim::Physics::DoubleSidedPlaneShape"; std::string planeName = "SurgSim::Physics::PlaneShape"; std::string sphereName = "SurgSim::Physics::SphereShape"; /// Register derived object classes rigidShapesFactory->registerShape(boxName); rigidShapesFactory->registerShape(capsuleName); rigidShapesFactory->registerShape(cylinderName); rigidShapesFactory->registerShape(doublesideplaneName); rigidShapesFactory->registerShape(planeName); rigidShapesFactory->registerShape(sphereName); /// Instantiate derived objected from class name. std::shared_ptr boxShape = rigidShapesFactory->createShape(boxName); std::shared_ptr capsuleShape = rigidShapesFactory->createShape(capsuleName); std::shared_ptr cylinderShape = rigidShapesFactory->createShape(cylinderName); std::shared_ptr doublesidedplaneShape = rigidShapesFactory->createShape(doublesideplaneName); std::shared_ptr planeShape = rigidShapesFactory->createShape(planeName); std::shared_ptr sphereShape = rigidShapesFactory->createShape(sphereName); EXPECT_EQ(SurgSim::Math::SHAPE_TYPE_BOX, boxShape->getType()); EXPECT_EQ(SurgSim::Math::SHAPE_TYPE_CAPSULE, capsuleShape->getType()); EXPECT_EQ(SurgSim::Math::SHAPE_TYPE_CYLINDER, cylinderShape->getType()); EXPECT_EQ(SurgSim::Math::SHAPE_TYPE_DOUBLESIDEDPLANE, doublesidedplaneShape->getType()); EXPECT_EQ(SurgSim::Math::SHAPE_TYPE_PLANE, planeShape->getType()); EXPECT_EQ(SurgSim::Math::SHAPE_TYPE_SPHERE, sphereShape->getType()); } TEST(ShapesFactoryTest, NonRegisterTest) { std::shared_ptr rigidShapesFactory = std::make_shared(); std::string boxName = "SurgSim::Physics::BoxShape"; std::string capsuleName = "SurgSim::Physics::CapsuleShape"; std::string cylinderName = "SurgSim::Physics::CylinderShape"; std::string doublesideplaneName = "SurgSim::Physics::DoubleSidedPlaneShape"; std::string planeName = "SurgSim::Physics::PlaneShape"; std::string sphereName = "SurgSim::Physics::SphereShape"; /// Not register any derived object classes /// Instantiate derived objected from class name. std::shared_ptr boxShape = rigidShapesFactory->createShape(boxName); std::shared_ptr capsuleShape = rigidShapesFactory->createShape(capsuleName); std::shared_ptr cylinderShape = rigidShapesFactory->createShape(cylinderName); std::shared_ptr doublesidedplaneShape = rigidShapesFactory->createShape(doublesideplaneName); std::shared_ptr planeShape = rigidShapesFactory->createShape(planeName); std::shared_ptr sphereShape = rigidShapesFactory->createShape(sphereName); /// Expect a null pointer form the Shape objects EXPECT_EQ(nullptr, boxShape); EXPECT_EQ(nullptr, capsuleShape); EXPECT_EQ(nullptr, cylinderShape); EXPECT_EQ(nullptr, doublesidedplaneShape); EXPECT_EQ(nullptr, planeShape); EXPECT_EQ(nullptr, sphereShape); } opensurgsim-0.7.0/SurgSim/Testing/000077500000000000000000000000001277777236100171225ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Testing/CMakeLists.txt000066400000000000000000000031531277777236100216640ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2013-2015, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. include_directories( ${gmock_SOURCE_DIR}/include ${gtest_SOURCE_DIR}/include ) set(SURGSIM_TESTING_SOURCES MathUtilities.cpp MockInputComponent.cpp MockInputOutput.cpp SerializationMockComponent.cpp TestCube.cpp TestingMain.cpp ) set(SURGSIM_TESTING_HEADERS MathUtilities.h MockInputComponent.h MockInputOutput.h MockPhysicsManager.h SerializationMockComponent.h TestCube.h Utilities.h ) surgsim_create_library_header(Testing.h "${SURGSIM_TESTING_HEADERS}") add_library( SurgSimTesting ${SURGSIM_TESTING_SOURCES} ${SURGSIM_TESTING_HEADERS} ) set(LIBS SurgSimDataStructures SurgSimFramework SurgSimInput SurgSimMath SurgSimPhysics ) target_link_libraries(SurgSimTesting ${LIBS}) add_subdirectory(MlcpIO) if(GLUT_FOUND) add_subdirectory(VisualTestCommon) endif(GLUT_FOUND) # Copy all shared data which can be used by other component's unit tests file(COPY Data DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) set_target_properties(SurgSimTesting PROPERTIES FOLDER "Testing") opensurgsim-0.7.0/SurgSim/Testing/Data/000077500000000000000000000000001277777236100177735ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Testing/Data/Geometry/000077500000000000000000000000001277777236100215665ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Testing/Data/Geometry/Cube.ply000066400000000000000000000035321277777236100231750ustar00rootroot00000000000000ply format ascii 1.0 comment Created by Blender 2.69 (sub 0) - www.blender.org, source file: '' element vertex 26 property float x property float y property float z property float nx property float ny property float nz element face 12 property list uchar uint vertex_indices end_header 1.000000 1.000000 -1.000000 0.000000 0.000000 -1.000000 1.000000 -1.000000 -1.000000 0.000000 0.000000 -1.000000 -1.000000 -1.000000 -1.000000 0.000000 0.000000 -1.000000 1.000000 0.999999 1.000000 -0.000000 -0.000000 1.000000 -1.000000 1.000000 1.000000 -0.000000 -0.000000 1.000000 0.999999 -1.000001 1.000000 -0.000000 -0.000000 1.000000 1.000000 1.000000 -1.000000 1.000000 0.000000 -0.000000 1.000000 0.999999 1.000000 1.000000 0.000000 -0.000000 1.000000 -1.000000 -1.000000 1.000000 0.000000 -0.000000 1.000000 -1.000000 -1.000000 -0.000000 -1.000000 -0.000000 0.999999 -1.000001 1.000000 -0.000000 -1.000000 -0.000000 -1.000000 -1.000000 -1.000000 -0.000000 -1.000000 -0.000000 -1.000000 -1.000000 -1.000000 -1.000000 0.000000 -0.000000 -1.000000 -1.000000 1.000000 -1.000000 0.000000 -0.000000 -1.000000 1.000000 1.000000 -1.000000 0.000000 -0.000000 1.000000 0.999999 1.000000 0.000000 1.000000 0.000000 1.000000 1.000000 -1.000000 0.000000 1.000000 0.000000 -1.000000 1.000000 1.000000 0.000000 1.000000 0.000000 -1.000000 1.000000 -1.000000 0.000000 0.000000 -1.000000 1.000000 0.999999 1.000000 1.000000 -0.000001 0.000000 0.999999 -1.000001 1.000000 1.000000 -0.000001 0.000000 1.000000 -1.000000 -1.000000 1.000000 -0.000001 0.000000 -1.000000 1.000000 -1.000000 0.000000 1.000000 0.000000 -1.000000 -1.000000 1.000000 0.000000 -0.000000 1.000000 -1.000000 1.000000 -1.000000 -1.000000 0.000000 -0.000000 -1.000000 -1.000000 1.000000 -0.000000 -1.000000 0.000000 3 0 1 2 3 3 4 5 3 6 7 8 3 9 10 11 3 12 13 14 3 15 16 17 3 18 0 2 3 19 20 21 3 16 22 17 3 4 23 5 3 24 12 14 3 10 25 11 opensurgsim-0.7.0/SurgSim/Testing/Data/Geometry/Cube_with_texture.ply000066400000000000000000000045201277777236100260060ustar00rootroot00000000000000ply format ascii 1.0 comment Created by Blender 2.69 (sub 0) - www.blender.org, source file: '' element vertex 26 property float x property float y property float z property float nx property float ny property float nz property float s property float t element face 12 property list uchar uint vertex_indices end_header 1.000000 1.000000 -1.000000 0.000000 0.000000 -1.000000 0.000000 0.500000 1.000000 -1.000000 -1.000000 0.000000 0.000000 -1.000000 0.010000 0.510000 -1.000000 -1.000000 -1.000000 0.000000 0.000000 -1.000000 0.020000 0.520000 1.000000 0.999999 1.000000 -0.000000 -0.000000 1.000000 0.030000 0.530000 -1.000000 1.000000 1.000000 -0.000000 -0.000000 1.000000 0.040000 0.540000 0.999999 -1.000001 1.000000 -0.000000 -0.000000 1.000000 0.050000 0.550000 1.000000 1.000000 -1.000000 1.000000 0.000000 -0.000000 0.060000 0.560000 1.000000 0.999999 1.000000 1.000000 0.000000 -0.000000 0.070000 0.570000 1.000000 -1.000000 -1.000000 1.000000 0.000000 -0.000000 0.080000 0.580000 1.000000 -1.000000 -1.000000 -0.000000 -1.000000 -0.000000 0.090000 0.590000 0.999999 -1.000001 1.000000 -0.000000 -1.000000 -0.000000 0.100000 0.600000 -1.000000 -1.000000 -1.000000 -0.000000 -1.000000 -0.000000 0.110000 0.610000 -1.000000 -1.000000 -1.000000 -1.000000 0.000000 -0.000000 0.120000 0.620000 -1.000000 -1.000000 1.000000 -1.000000 0.000000 -0.000000 0.130000 0.630000 -1.000000 1.000000 1.000000 -1.000000 0.000000 -0.000000 0.140000 0.640000 1.000000 0.999999 1.000000 0.000000 1.000000 0.000000 0.150000 0.650000 1.000000 1.000000 -1.000000 0.000000 1.000000 0.000000 0.160000 0.660000 -1.000000 1.000000 1.000000 0.000000 1.000000 0.000000 0.170000 0.670000 -1.000000 1.000000 -1.000000 0.000000 0.000000 -1.000000 0.180000 0.680000 1.000000 0.999999 1.000000 1.000000 -0.000001 0.000000 0.190000 0.690000 0.999999 -1.000001 1.000000 1.000000 -0.000001 0.000000 0.200000 0.700000 1.000000 -1.000000 -1.000000 1.000000 -0.000001 0.000000 0.210000 0.710000 -1.000000 1.000000 -1.000000 0.000000 1.000000 0.000000 0.220000 0.720000 -1.000000 -1.000000 1.000000 0.000000 -0.000000 1.000000 0.230000 0.730000 -1.000000 1.000000 -1.000000 -1.000000 0.000000 -0.000000 0.240000 0.740000 -1.000000 -1.000000 1.000000 -0.000000 -1.000000 0.000000 0.250000 0.750000 3 0 1 2 3 3 4 5 3 6 7 8 3 9 10 11 3 12 13 14 3 15 16 17 3 18 0 2 3 19 20 21 3 16 22 17 3 4 23 5 3 24 12 14 3 10 25 11 opensurgsim-0.7.0/SurgSim/Testing/Data/Geometry/InvalidMesh.ply000066400000000000000000000004341277777236100245200ustar00rootroot00000000000000ply format ascii 1.0 comment Created by Blender 2.69 (sub 0) - www.blender.org, source file: '' element vertex 1 property float x property float y property float z property float nx property float ny property float nz end_header 0.004801 0.000394 0.002520 0.934616 0.000000 -0.355657 opensurgsim-0.7.0/SurgSim/Testing/Data/Geometry/Torus.mtl000066400000000000000000000003121277777236100234140ustar00rootroot00000000000000# Blender MTL File: 'None' # Material Count: 1 newmtl Material.001 Ns 96.078431 Ka 0.000000 0.000000 0.000000 Kd 0.060738 0.205554 0.640000 Ks 0.700000 0.700000 0.700000 Ni 1.000000 d 1.000000 illum 2 opensurgsim-0.7.0/SurgSim/Testing/Data/Geometry/Torus.obj000066400000000000000000002341711277777236100234060ustar00rootroot00000000000000# Blender v2.66 (sub 1) OBJ File: '' # www.blender.org mtllib Torus.mtl o Torus v 1.000000 0.000000 0.000000 v 0.978386 0.101684 0.000000 v 0.917283 0.185786 0.000000 v 0.827254 0.237764 0.000000 v 0.723868 0.248630 0.000000 v 0.625000 0.216506 0.000000 v 0.547746 0.146946 0.000000 v 0.505463 0.051978 0.000000 v 0.505463 -0.051978 0.000000 v 0.547746 -0.146946 0.000000 v 0.625000 -0.216506 0.000000 v 0.723868 -0.248630 0.000000 v 0.827254 -0.237764 0.000000 v 0.917283 -0.185786 0.000000 v 0.978386 -0.101684 0.000000 v 0.987688 0.000000 -0.156435 v 0.966341 0.101684 -0.153053 v 0.905989 0.185786 -0.143495 v 0.817069 0.237764 -0.129411 v 0.714956 0.248630 -0.113238 v 0.617305 0.216506 -0.097772 v 0.541002 0.146946 -0.085686 v 0.499240 0.051978 -0.079072 v 0.499240 -0.051978 -0.079072 v 0.541002 -0.146946 -0.085686 v 0.617305 -0.216506 -0.097772 v 0.714956 -0.248630 -0.113238 v 0.817069 -0.237764 -0.129411 v 0.905989 -0.185786 -0.143495 v 0.966341 -0.101684 -0.153053 v 0.951057 0.000000 -0.309017 v 0.930501 0.101684 -0.302338 v 0.872388 0.185786 -0.283456 v 0.786766 0.237764 -0.255636 v 0.688439 0.248630 -0.223687 v 0.594410 0.216506 -0.193136 v 0.520937 0.146946 -0.169263 v 0.480724 0.051978 -0.156197 v 0.480724 -0.051978 -0.156197 v 0.520937 -0.146946 -0.169263 v 0.594410 -0.216506 -0.193136 v 0.688439 -0.248630 -0.223687 v 0.786766 -0.237764 -0.255636 v 0.872388 -0.185786 -0.283456 v 0.930501 -0.101684 -0.302338 v 0.891007 0.000000 -0.453990 v 0.871749 0.101684 -0.444178 v 0.817305 0.185786 -0.416438 v 0.737089 0.237764 -0.375566 v 0.644971 0.248630 -0.328629 v 0.556879 0.216506 -0.283744 v 0.488045 0.146946 -0.248671 v 0.450371 0.051978 -0.229475 v 0.450371 -0.051978 -0.229475 v 0.488045 -0.146946 -0.248671 v 0.556879 -0.216506 -0.283744 v 0.644971 -0.248630 -0.328629 v 0.737089 -0.237764 -0.375566 v 0.817305 -0.185786 -0.416438 v 0.871749 -0.101684 -0.444178 v 0.809017 0.000000 -0.587785 v 0.791531 0.101684 -0.575081 v 0.742097 0.185786 -0.539165 v 0.669263 0.237764 -0.486248 v 0.585621 0.248630 -0.425479 v 0.505636 0.216506 -0.367366 v 0.443136 0.146946 -0.321957 v 0.408928 0.051978 -0.297104 v 0.408928 -0.051978 -0.297104 v 0.443136 -0.146946 -0.321957 v 0.505636 -0.216506 -0.367366 v 0.585621 -0.248630 -0.425479 v 0.669263 -0.237764 -0.486248 v 0.742097 -0.185786 -0.539165 v 0.791531 -0.101684 -0.575081 v 0.707107 0.000000 -0.707107 v 0.691824 0.101684 -0.691824 v 0.648617 0.185786 -0.648617 v 0.584957 0.237764 -0.584957 v 0.511852 0.248630 -0.511852 v 0.441942 0.216506 -0.441942 v 0.387315 0.146946 -0.387315 v 0.357416 0.051978 -0.357416 v 0.357416 -0.051978 -0.357416 v 0.387315 -0.146946 -0.387315 v 0.441942 -0.216506 -0.441942 v 0.511852 -0.248630 -0.511852 v 0.584957 -0.237764 -0.584957 v 0.648617 -0.185786 -0.648617 v 0.691824 -0.101684 -0.691824 v 0.587785 0.000000 -0.809017 v 0.575081 0.101684 -0.791531 v 0.539165 0.185786 -0.742097 v 0.486248 0.237764 -0.669263 v 0.425479 0.248630 -0.585621 v 0.367366 0.216506 -0.505636 v 0.321957 0.146946 -0.443136 v 0.297104 0.051978 -0.408928 v 0.297104 -0.051978 -0.408928 v 0.321957 -0.146946 -0.443136 v 0.367366 -0.216506 -0.505636 v 0.425479 -0.248630 -0.585621 v 0.486248 -0.237764 -0.669263 v 0.539165 -0.185786 -0.742097 v 0.575081 -0.101684 -0.791531 v 0.453991 0.000000 -0.891006 v 0.444178 0.101684 -0.871748 v 0.416438 0.185786 -0.817305 v 0.375566 0.237764 -0.737089 v 0.328629 0.248630 -0.644971 v 0.283744 0.216506 -0.556879 v 0.248672 0.146946 -0.488045 v 0.229476 0.051978 -0.450371 v 0.229476 -0.051978 -0.450371 v 0.248672 -0.146946 -0.488045 v 0.283744 -0.216506 -0.556879 v 0.328629 -0.248630 -0.644971 v 0.375566 -0.237764 -0.737089 v 0.416438 -0.185786 -0.817305 v 0.444178 -0.101684 -0.871748 v 0.309017 0.000000 -0.951056 v 0.302338 0.101684 -0.930501 v 0.283456 0.185786 -0.872388 v 0.255636 0.237764 -0.786765 v 0.223688 0.248630 -0.688439 v 0.193136 0.216506 -0.594410 v 0.169263 0.146946 -0.520937 v 0.156197 0.051978 -0.480724 v 0.156197 -0.051978 -0.480724 v 0.169263 -0.146946 -0.520937 v 0.193136 -0.216506 -0.594410 v 0.223688 -0.248630 -0.688439 v 0.255636 -0.237764 -0.786765 v 0.283456 -0.185786 -0.872388 v 0.302338 -0.101684 -0.930501 v 0.156435 0.000000 -0.987688 v 0.153053 0.101684 -0.966341 v 0.143495 0.185786 -0.905989 v 0.129411 0.237764 -0.817069 v 0.113238 0.248630 -0.714956 v 0.097772 0.216506 -0.617305 v 0.085686 0.146946 -0.541002 v 0.079072 0.051978 -0.499240 v 0.079072 -0.051978 -0.499240 v 0.085686 -0.146946 -0.541002 v 0.097772 -0.216506 -0.617305 v 0.113238 -0.248630 -0.714956 v 0.129411 -0.237764 -0.817069 v 0.143495 -0.185786 -0.905989 v 0.153053 -0.101684 -0.966341 v 0.000000 0.000000 -1.000000 v 0.000000 0.101684 -0.978386 v 0.000000 0.185786 -0.917283 v 0.000000 0.237764 -0.827254 v 0.000000 0.248630 -0.723868 v 0.000000 0.216506 -0.625000 v 0.000000 0.146946 -0.547746 v 0.000000 0.051978 -0.505463 v 0.000000 -0.051978 -0.505463 v 0.000000 -0.146946 -0.547746 v 0.000000 -0.216506 -0.625000 v 0.000000 -0.248630 -0.723868 v 0.000000 -0.237764 -0.827254 v 0.000000 -0.185786 -0.917283 v 0.000000 -0.101684 -0.978386 v -0.156434 0.000000 -0.987688 v -0.153053 0.101684 -0.966341 v -0.143495 0.185786 -0.905989 v -0.129411 0.237764 -0.817069 v -0.113238 0.248630 -0.714956 v -0.097772 0.216506 -0.617305 v -0.085686 0.146946 -0.541002 v -0.079072 0.051978 -0.499240 v -0.079072 -0.051978 -0.499240 v -0.085686 -0.146946 -0.541002 v -0.097772 -0.216506 -0.617305 v -0.113238 -0.248630 -0.714956 v -0.129411 -0.237764 -0.817069 v -0.143495 -0.185786 -0.905989 v -0.153053 -0.101684 -0.966341 v -0.309017 0.000000 -0.951057 v -0.302338 0.101684 -0.930501 v -0.283456 0.185786 -0.872388 v -0.255636 0.237764 -0.786766 v -0.223687 0.248630 -0.688439 v -0.193136 0.216506 -0.594410 v -0.169263 0.146946 -0.520937 v -0.156197 0.051978 -0.480724 v -0.156197 -0.051978 -0.480724 v -0.169263 -0.146946 -0.520937 v -0.193136 -0.216506 -0.594410 v -0.223687 -0.248630 -0.688439 v -0.255636 -0.237764 -0.786766 v -0.283456 -0.185786 -0.872388 v -0.302338 -0.101684 -0.930501 v -0.453991 0.000000 -0.891006 v -0.444178 0.101684 -0.871749 v -0.416438 0.185786 -0.817305 v -0.375566 0.237764 -0.737089 v -0.328629 0.248630 -0.644971 v -0.283744 0.216506 -0.556879 v -0.248671 0.146946 -0.488045 v -0.229476 0.051978 -0.450371 v -0.229476 -0.051978 -0.450371 v -0.248671 -0.146946 -0.488045 v -0.283744 -0.216506 -0.556879 v -0.328629 -0.248630 -0.644971 v -0.375566 -0.237764 -0.737089 v -0.416438 -0.185786 -0.817305 v -0.444178 -0.101684 -0.871749 v -0.587785 0.000000 -0.809017 v -0.575081 0.101684 -0.791531 v -0.539165 0.185786 -0.742097 v -0.486248 0.237764 -0.669263 v -0.425479 0.248630 -0.585621 v -0.367366 0.216506 -0.505636 v -0.321957 0.146946 -0.443136 v -0.297104 0.051978 -0.408928 v -0.297104 -0.051978 -0.408928 v -0.321957 -0.146946 -0.443136 v -0.367366 -0.216506 -0.505636 v -0.425479 -0.248630 -0.585621 v -0.486248 -0.237764 -0.669263 v -0.539165 -0.185786 -0.742097 v -0.575081 -0.101684 -0.791531 v -0.707107 0.000000 -0.707107 v -0.691824 0.101684 -0.691823 v -0.648617 0.185786 -0.648617 v -0.584957 0.237764 -0.584957 v -0.511852 0.248630 -0.511852 v -0.441942 0.216506 -0.441942 v -0.387315 0.146946 -0.387315 v -0.357416 0.051978 -0.357416 v -0.357416 -0.051978 -0.357416 v -0.387315 -0.146946 -0.387315 v -0.441942 -0.216506 -0.441942 v -0.511852 -0.248630 -0.511852 v -0.584957 -0.237764 -0.584957 v -0.648617 -0.185786 -0.648617 v -0.691824 -0.101684 -0.691823 v -0.809017 0.000000 -0.587785 v -0.791531 0.101684 -0.575081 v -0.742097 0.185786 -0.539165 v -0.669263 0.237764 -0.486248 v -0.585622 0.248630 -0.425479 v -0.505636 0.216506 -0.367366 v -0.443136 0.146946 -0.321957 v -0.408928 0.051978 -0.297104 v -0.408928 -0.051978 -0.297104 v -0.443136 -0.146946 -0.321957 v -0.505636 -0.216506 -0.367366 v -0.585622 -0.248630 -0.425479 v -0.669263 -0.237764 -0.486248 v -0.742097 -0.185786 -0.539165 v -0.791531 -0.101684 -0.575081 v -0.891006 0.000000 -0.453991 v -0.871749 0.101684 -0.444178 v -0.817305 0.185786 -0.416438 v -0.737089 0.237764 -0.375566 v -0.644971 0.248630 -0.328629 v -0.556879 0.216506 -0.283744 v -0.488045 0.146946 -0.248671 v -0.450371 0.051978 -0.229475 v -0.450371 -0.051978 -0.229475 v -0.488045 -0.146946 -0.248671 v -0.556879 -0.216506 -0.283744 v -0.644971 -0.248630 -0.328629 v -0.737089 -0.237764 -0.375566 v -0.817305 -0.185786 -0.416438 v -0.871749 -0.101684 -0.444178 v -0.951057 0.000000 -0.309017 v -0.930501 0.101684 -0.302338 v -0.872388 0.185786 -0.283456 v -0.786766 0.237764 -0.255636 v -0.688439 0.248631 -0.223688 v -0.594410 0.216506 -0.193136 v -0.520937 0.146946 -0.169263 v -0.480724 0.051978 -0.156197 v -0.480724 -0.051978 -0.156197 v -0.520937 -0.146946 -0.169263 v -0.594410 -0.216506 -0.193136 v -0.688439 -0.248631 -0.223688 v -0.786766 -0.237764 -0.255636 v -0.872388 -0.185786 -0.283456 v -0.930501 -0.101684 -0.302338 v -0.987688 0.000000 -0.156434 v -0.966341 0.101684 -0.153053 v -0.905989 0.185786 -0.143495 v -0.817069 0.237764 -0.129411 v -0.714956 0.248630 -0.113238 v -0.617305 0.216506 -0.097772 v -0.541002 0.146946 -0.085686 v -0.499240 0.051978 -0.079072 v -0.499240 -0.051978 -0.079072 v -0.541002 -0.146946 -0.085686 v -0.617305 -0.216506 -0.097772 v -0.714956 -0.248630 -0.113238 v -0.817069 -0.237764 -0.129411 v -0.905989 -0.185786 -0.143495 v -0.966341 -0.101684 -0.153053 v -1.000000 0.000000 -0.000000 v -0.978386 0.101684 -0.000000 v -0.917283 0.185786 -0.000000 v -0.827254 0.237764 -0.000000 v -0.723868 0.248630 -0.000000 v -0.625000 0.216506 -0.000000 v -0.547746 0.146946 -0.000000 v -0.505463 0.051978 -0.000000 v -0.505463 -0.051978 -0.000000 v -0.547746 -0.146946 -0.000000 v -0.625000 -0.216506 -0.000000 v -0.723868 -0.248630 -0.000000 v -0.827254 -0.237764 -0.000000 v -0.917283 -0.185786 -0.000000 v -0.978386 -0.101684 -0.000000 v -0.987688 0.000000 0.156434 v -0.966341 0.101684 0.153053 v -0.905989 0.185786 0.143494 v -0.817069 0.237764 0.129411 v -0.714956 0.248630 0.113238 v -0.617305 0.216506 0.097771 v -0.541002 0.146946 0.085686 v -0.499240 0.051978 0.079072 v -0.499240 -0.051978 0.079072 v -0.541002 -0.146946 0.085686 v -0.617305 -0.216506 0.097771 v -0.714956 -0.248630 0.113238 v -0.817069 -0.237764 0.129411 v -0.905989 -0.185786 0.143494 v -0.966341 -0.101684 0.153053 v -0.951057 0.000000 0.309017 v -0.930501 0.101684 0.302338 v -0.872388 0.185786 0.283456 v -0.786766 0.237764 0.255635 v -0.688439 0.248630 0.223687 v -0.594410 0.216506 0.193135 v -0.520937 0.146946 0.169263 v -0.480724 0.051978 0.156196 v -0.480724 -0.051978 0.156196 v -0.520937 -0.146946 0.169263 v -0.594410 -0.216506 0.193135 v -0.688439 -0.248630 0.223687 v -0.786766 -0.237764 0.255635 v -0.872388 -0.185786 0.283456 v -0.930501 -0.101684 0.302338 v -0.891007 0.000000 0.453990 v -0.871749 0.101684 0.444178 v -0.817305 0.185786 0.416437 v -0.737089 0.237764 0.375565 v -0.644971 0.248630 0.328629 v -0.556879 0.216506 0.283744 v -0.488045 0.146946 0.248671 v -0.450371 0.051978 0.229475 v -0.450371 -0.051978 0.229475 v -0.488045 -0.146946 0.248671 v -0.556879 -0.216506 0.283744 v -0.644971 -0.248630 0.328629 v -0.737089 -0.237764 0.375565 v -0.817305 -0.185786 0.416437 v -0.871749 -0.101684 0.444178 v -0.809017 0.000000 0.587785 v -0.791531 0.101684 0.575081 v -0.742097 0.185786 0.539165 v -0.669263 0.237764 0.486248 v -0.585622 0.248630 0.425479 v -0.505636 0.216506 0.367366 v -0.443136 0.146946 0.321957 v -0.408928 0.051978 0.297104 v -0.408928 -0.051978 0.297104 v -0.443136 -0.146946 0.321957 v -0.505636 -0.216506 0.367366 v -0.585622 -0.248630 0.425479 v -0.669263 -0.237764 0.486248 v -0.742097 -0.185786 0.539165 v -0.791531 -0.101684 0.575081 v -0.707107 0.000000 0.707107 v -0.691824 0.101684 0.691823 v -0.648617 0.185786 0.648617 v -0.584957 0.237764 0.584957 v -0.511852 0.248630 0.511852 v -0.441942 0.216506 0.441942 v -0.387315 0.146946 0.387315 v -0.357416 0.051978 0.357416 v -0.357416 -0.051978 0.357416 v -0.387315 -0.146946 0.387315 v -0.441942 -0.216506 0.441942 v -0.511852 -0.248630 0.511852 v -0.584957 -0.237764 0.584957 v -0.648617 -0.185786 0.648617 v -0.691824 -0.101684 0.691823 v -0.587785 0.000000 0.809017 v -0.575081 0.101684 0.791531 v -0.539165 0.185786 0.742097 v -0.486248 0.237764 0.669263 v -0.425479 0.248630 0.585621 v -0.367366 0.216506 0.505636 v -0.321957 0.146946 0.443136 v -0.297104 0.051978 0.408928 v -0.297104 -0.051978 0.408928 v -0.321957 -0.146946 0.443136 v -0.367366 -0.216506 0.505636 v -0.425479 -0.248630 0.585621 v -0.486248 -0.237764 0.669263 v -0.539165 -0.185786 0.742097 v -0.575081 -0.101684 0.791531 v -0.453991 0.000000 0.891006 v -0.444178 0.101684 0.871749 v -0.416438 0.185786 0.817305 v -0.375566 0.237764 0.737089 v -0.328629 0.248630 0.644971 v -0.283744 0.216506 0.556879 v -0.248671 0.146946 0.488045 v -0.229476 0.051978 0.450371 v -0.229476 -0.051978 0.450371 v -0.248671 -0.146946 0.488045 v -0.283744 -0.216506 0.556879 v -0.328629 -0.248630 0.644971 v -0.375566 -0.237764 0.737089 v -0.416438 -0.185786 0.817305 v -0.444178 -0.101684 0.871749 v -0.309017 0.000000 0.951057 v -0.302338 0.101684 0.930501 v -0.283456 0.185786 0.872388 v -0.255636 0.237764 0.786766 v -0.223687 0.248630 0.688439 v -0.193136 0.216506 0.594410 v -0.169263 0.146946 0.520937 v -0.156197 0.051978 0.480724 v -0.156197 -0.051978 0.480724 v -0.169263 -0.146946 0.520937 v -0.193136 -0.216506 0.594410 v -0.223687 -0.248630 0.688439 v -0.255636 -0.237764 0.786766 v -0.283456 -0.185786 0.872388 v -0.302338 -0.101684 0.930501 v -0.156434 0.000000 0.987688 v -0.153053 0.101684 0.966341 v -0.143495 0.185786 0.905989 v -0.129411 0.237764 0.817069 v -0.113238 0.248630 0.714956 v -0.097772 0.216506 0.617305 v -0.085686 0.146946 0.541002 v -0.079072 0.051978 0.499240 v -0.079072 -0.051978 0.499240 v -0.085686 -0.146946 0.541002 v -0.097772 -0.216506 0.617305 v -0.113238 -0.248630 0.714956 v -0.129411 -0.237764 0.817069 v -0.143495 -0.185786 0.905989 v -0.153053 -0.101684 0.966341 v 0.000000 0.000000 1.000000 v 0.000000 0.101684 0.978386 v 0.000000 0.185786 0.917283 v 0.000000 0.237764 0.827254 v 0.000000 0.248630 0.723868 v 0.000000 0.216506 0.625000 v 0.000000 0.146946 0.547746 v 0.000000 0.051978 0.505463 v 0.000000 -0.051978 0.505463 v 0.000000 -0.146946 0.547746 v 0.000000 -0.216506 0.625000 v 0.000000 -0.248630 0.723868 v 0.000000 -0.237764 0.827254 v 0.000000 -0.185786 0.917283 v 0.000000 -0.101684 0.978386 v 0.156435 0.000000 0.987688 v 0.153053 0.101684 0.966341 v 0.143495 0.185786 0.905989 v 0.129411 0.237764 0.817069 v 0.113238 0.248630 0.714956 v 0.097772 0.216506 0.617305 v 0.085686 0.146946 0.541002 v 0.079072 0.051978 0.499240 v 0.079072 -0.051978 0.499240 v 0.085686 -0.146946 0.541002 v 0.097772 -0.216506 0.617305 v 0.113238 -0.248630 0.714956 v 0.129411 -0.237764 0.817069 v 0.143495 -0.185786 0.905989 v 0.153053 -0.101684 0.966341 v 0.309017 0.000000 0.951056 v 0.302338 0.101684 0.930501 v 0.283456 0.185786 0.872388 v 0.255636 0.237764 0.786765 v 0.223688 0.248630 0.688439 v 0.193136 0.216506 0.594410 v 0.169263 0.146946 0.520937 v 0.156197 0.051978 0.480724 v 0.156197 -0.051978 0.480724 v 0.169263 -0.146946 0.520937 v 0.193136 -0.216506 0.594410 v 0.223688 -0.248630 0.688439 v 0.255636 -0.237764 0.786765 v 0.283456 -0.185786 0.872388 v 0.302338 -0.101684 0.930501 v 0.453991 0.000000 0.891006 v 0.444178 0.101684 0.871748 v 0.416438 0.185786 0.817305 v 0.375566 0.237764 0.737089 v 0.328629 0.248630 0.644971 v 0.283744 0.216506 0.556879 v 0.248672 0.146946 0.488045 v 0.229476 0.051978 0.450371 v 0.229476 -0.051978 0.450371 v 0.248672 -0.146946 0.488045 v 0.283744 -0.216506 0.556879 v 0.328629 -0.248630 0.644971 v 0.375566 -0.237764 0.737089 v 0.416438 -0.185786 0.817305 v 0.444178 -0.101684 0.871748 v 0.587785 0.000000 0.809017 v 0.575081 0.101684 0.791532 v 0.539165 0.185786 0.742098 v 0.486247 0.237764 0.669263 v 0.425479 0.248630 0.585622 v 0.367365 0.216506 0.505636 v 0.321957 0.146946 0.443136 v 0.297104 0.051978 0.408928 v 0.297104 -0.051978 0.408928 v 0.321957 -0.146946 0.443136 v 0.367365 -0.216506 0.505636 v 0.425479 -0.248630 0.585622 v 0.486247 -0.237764 0.669263 v 0.539165 -0.185786 0.742098 v 0.575081 -0.101684 0.791532 v 0.707106 0.000000 0.707107 v 0.691823 0.101684 0.691824 v 0.648616 0.185786 0.648617 v 0.584957 0.237764 0.584957 v 0.511852 0.248630 0.511852 v 0.441941 0.216506 0.441942 v 0.387315 0.146946 0.387315 v 0.357416 0.051978 0.357417 v 0.357416 -0.051978 0.357417 v 0.387315 -0.146946 0.387315 v 0.441941 -0.216506 0.441942 v 0.511852 -0.248630 0.511852 v 0.584957 -0.237764 0.584957 v 0.648616 -0.185786 0.648617 v 0.691823 -0.101684 0.691824 v 0.809017 0.000000 0.587786 v 0.791531 0.101684 0.575081 v 0.742097 0.185786 0.539166 v 0.669262 0.237764 0.486248 v 0.585621 0.248630 0.425479 v 0.505635 0.216506 0.367366 v 0.443135 0.146946 0.321957 v 0.408928 0.051978 0.297104 v 0.408928 -0.051978 0.297104 v 0.443135 -0.146946 0.321957 v 0.505635 -0.216506 0.367366 v 0.585621 -0.248630 0.425479 v 0.669262 -0.237764 0.486248 v 0.742097 -0.185786 0.539166 v 0.791531 -0.101684 0.575081 v 0.891006 0.000000 0.453991 v 0.871748 0.101684 0.444178 v 0.817305 0.185786 0.416438 v 0.737089 0.237764 0.375566 v 0.644971 0.248630 0.328629 v 0.556879 0.216506 0.283744 v 0.488045 0.146946 0.248672 v 0.450371 0.051978 0.229476 v 0.450371 -0.051978 0.229476 v 0.488045 -0.146946 0.248672 v 0.556879 -0.216506 0.283744 v 0.644971 -0.248630 0.328629 v 0.737089 -0.237764 0.375566 v 0.817305 -0.185786 0.416438 v 0.871748 -0.101684 0.444178 v 0.951056 0.000000 0.309017 v 0.930501 0.101684 0.302338 v 0.872388 0.185786 0.283456 v 0.786765 0.237764 0.255636 v 0.688439 0.248630 0.223688 v 0.594410 0.216506 0.193136 v 0.520937 0.146946 0.169263 v 0.480724 0.051978 0.156197 v 0.480724 -0.051978 0.156197 v 0.520937 -0.146946 0.169263 v 0.594410 -0.216506 0.193136 v 0.688439 -0.248630 0.223688 v 0.786765 -0.237764 0.255636 v 0.872388 -0.185786 0.283456 v 0.930501 -0.101684 0.302338 v 0.987688 0.000000 0.156435 v 0.966341 0.101684 0.153054 v 0.905989 0.185786 0.143495 v 0.817069 0.237764 0.129411 v 0.714956 0.248630 0.113238 v 0.617305 0.216506 0.097772 v 0.541002 0.146946 0.085686 v 0.499240 0.051978 0.079072 v 0.499240 -0.051978 0.079072 v 0.541002 -0.146946 0.085686 v 0.617305 -0.216506 0.097772 v 0.714956 -0.248630 0.113238 v 0.817069 -0.237764 0.129411 v 0.905989 -0.185786 0.143495 v 0.966341 -0.101684 0.153054 vn 0.975262 0.207298 -0.076755 vn 0.807382 0.586598 -0.063543 vn 0.499613 0.865356 -0.039321 vn 0.104525 0.994488 -0.008226 vn -0.308926 0.950775 0.024313 vn -0.668205 0.742116 0.052589 vn -0.911193 0.405689 0.071713 vn -0.996917 0.000000 0.078459 vn -0.911193 -0.405689 0.071712 vn -0.668205 -0.742116 0.052589 vn -0.308926 -0.950775 0.024313 vn 0.104525 -0.994488 -0.008226 vn 0.499613 -0.865356 -0.039321 vn 0.807382 -0.586598 -0.063543 vn 0.975262 -0.207299 -0.076755 vn 0.951248 0.207299 -0.228373 vn 0.787502 0.586597 -0.189063 vn 0.487311 0.865356 -0.116992 vn 0.101951 0.994488 -0.024476 vn -0.301319 0.950775 0.072341 vn -0.651751 0.742116 0.156471 vn -0.888757 0.405689 0.213372 vn -0.972370 0.000000 0.233445 vn -0.888757 -0.405689 0.213372 vn -0.651751 -0.742117 0.156472 vn -0.301319 -0.950775 0.072340 vn 0.101951 -0.994488 -0.024476 vn 0.487311 -0.865356 -0.116993 vn 0.787502 -0.586597 -0.189062 vn 0.951248 -0.207299 -0.228374 vn 0.903811 0.207299 -0.374371 vn 0.748230 0.586597 -0.309927 vn 0.463010 0.865356 -0.191785 vn 0.096867 0.994488 -0.040124 vn -0.286293 0.950775 0.118586 vn -0.619249 0.742117 0.256501 vn -0.844436 0.405689 0.349777 vn -0.923879 0.000000 0.382684 vn -0.844436 -0.405689 0.349777 vn -0.619249 -0.742117 0.256501 vn -0.286293 -0.950775 0.118586 vn 0.096867 -0.994488 -0.040124 vn 0.463010 -0.865356 -0.191785 vn 0.748230 -0.586597 -0.309928 vn 0.903811 -0.207299 -0.374371 vn 0.834119 0.207298 -0.511148 vn 0.690535 0.586597 -0.423160 vn 0.427308 0.865356 -0.261854 vn 0.089398 0.994488 -0.054783 vn -0.264217 0.950775 0.161912 vn -0.571500 0.742117 0.350215 vn -0.779323 0.405689 0.477569 vn -0.852640 0.000000 0.522498 vn -0.779323 -0.405689 0.477569 vn -0.571500 -0.742117 0.350215 vn -0.264217 -0.950775 0.161912 vn 0.089398 -0.994488 -0.054783 vn 0.427308 -0.865356 -0.261854 vn 0.690535 -0.586597 -0.423160 vn 0.834119 -0.207298 -0.511148 vn 0.743888 0.207299 -0.635341 vn 0.615836 0.586597 -0.525975 vn 0.381084 0.865356 -0.325477 vn 0.079727 0.994488 -0.068094 vn -0.235635 0.950775 0.201252 vn -0.509678 0.742117 0.435306 vn -0.695019 0.405689 0.593603 vn -0.760406 0.000000 0.649449 vn -0.695019 -0.405689 0.593603 vn -0.509678 -0.742117 0.435306 vn -0.235635 -0.950775 0.201252 vn 0.079727 -0.994488 -0.068094 vn 0.381084 -0.865355 -0.325477 vn 0.615836 -0.586597 -0.525975 vn 0.743888 -0.207299 -0.635341 vn 0.635340 0.207298 -0.743888 vn 0.525974 0.586597 -0.615837 vn 0.325476 0.865356 -0.381083 vn 0.068093 0.994488 -0.079727 vn -0.201251 0.950775 0.235635 vn -0.435306 0.742117 0.509678 vn -0.593603 0.405689 0.695019 vn -0.649448 0.000000 0.760406 vn -0.593603 -0.405689 0.695020 vn -0.435306 -0.742117 0.509678 vn -0.201252 -0.950775 0.235635 vn 0.068093 -0.994488 -0.079727 vn 0.325476 -0.865356 -0.381084 vn 0.525974 -0.586597 -0.615837 vn 0.635341 -0.207298 -0.743888 vn 0.511149 0.207298 -0.834119 vn 0.423160 0.586597 -0.690535 vn 0.261854 0.865356 -0.427308 vn 0.054783 0.994488 -0.089398 vn -0.161912 0.950775 0.264217 vn -0.350215 0.742116 0.571500 vn -0.477570 0.405689 0.779322 vn -0.522499 0.000000 0.852640 vn -0.477569 -0.405689 0.779323 vn -0.350216 -0.742117 0.571500 vn -0.161912 -0.950775 0.264217 vn 0.054783 -0.994488 -0.089398 vn 0.261854 -0.865356 -0.427308 vn 0.423160 -0.586597 -0.690535 vn 0.511149 -0.207298 -0.834119 vn 0.374371 0.207298 -0.903811 vn 0.309928 0.586597 -0.748230 vn 0.191785 0.865356 -0.463009 vn 0.040124 0.994488 -0.096867 vn -0.118586 0.950775 0.286293 vn -0.256502 0.742116 0.619250 vn -0.349777 0.405690 0.844436 vn -0.382684 0.000000 0.923879 vn -0.349777 -0.405690 0.844436 vn -0.256502 -0.742116 0.619250 vn -0.118587 -0.950775 0.286293 vn 0.040124 -0.994488 -0.096867 vn 0.191785 -0.865356 -0.463009 vn 0.309928 -0.586597 -0.748230 vn 0.374372 -0.207298 -0.903811 vn 0.228374 0.207298 -0.951248 vn 0.189062 0.586598 -0.787502 vn 0.116993 0.865356 -0.487311 vn 0.024476 0.994488 -0.101951 vn -0.072340 0.950775 0.301319 vn -0.156471 0.742117 0.651751 vn -0.213372 0.405689 0.888757 vn -0.233446 0.000000 0.972370 vn -0.213372 -0.405689 0.888757 vn -0.156472 -0.742117 0.651751 vn -0.072340 -0.950775 0.301319 vn 0.024476 -0.994488 -0.101951 vn 0.116993 -0.865356 -0.487311 vn 0.189062 -0.586598 -0.787502 vn 0.228374 -0.207298 -0.951248 vn 0.076755 0.207298 -0.975262 vn 0.063543 0.586597 -0.807382 vn 0.039321 0.865356 -0.499613 vn 0.008227 0.994488 -0.104525 vn -0.024313 0.950775 0.308926 vn -0.052589 0.742116 0.668205 vn -0.071713 0.405689 0.911193 vn -0.078459 0.000000 0.996917 vn -0.071712 -0.405689 0.911193 vn -0.052589 -0.742116 0.668205 vn -0.024313 -0.950775 0.308926 vn 0.008227 -0.994488 -0.104525 vn 0.039321 -0.865356 -0.499613 vn 0.063543 -0.586597 -0.807382 vn 0.076755 -0.207298 -0.975262 vn -0.076755 0.207298 -0.975262 vn -0.063543 0.586598 -0.807382 vn -0.039321 0.865356 -0.499613 vn -0.008227 0.994488 -0.104525 vn 0.024313 0.950775 0.308926 vn 0.052590 0.742116 0.668205 vn 0.071713 0.405689 0.911193 vn 0.078459 -0.000000 0.996917 vn 0.071712 -0.405689 0.911194 vn 0.052589 -0.742116 0.668205 vn 0.024313 -0.950775 0.308925 vn -0.008227 -0.994488 -0.104525 vn -0.039321 -0.865356 -0.499613 vn -0.063543 -0.586597 -0.807382 vn -0.076755 -0.207298 -0.975262 vn -0.228374 0.207298 -0.951248 vn -0.189062 0.586598 -0.787501 vn -0.116993 0.865356 -0.487311 vn -0.024476 0.994488 -0.101951 vn 0.072340 0.950775 0.301319 vn 0.156471 0.742116 0.651752 vn 0.213371 0.405690 0.888757 vn 0.233446 -0.000000 0.972370 vn 0.213372 -0.405690 0.888757 vn 0.156471 -0.742116 0.651752 vn 0.072340 -0.950775 0.301319 vn -0.024476 -0.994488 -0.101951 vn -0.116993 -0.865355 -0.487312 vn -0.189062 -0.586598 -0.787501 vn -0.228374 -0.207298 -0.951248 vn -0.374371 0.207299 -0.903811 vn -0.309927 0.586598 -0.748230 vn -0.191785 0.865355 -0.463010 vn -0.040124 0.994488 -0.096867 vn 0.118586 0.950775 0.286293 vn 0.256501 0.742117 0.619250 vn 0.349778 0.405689 0.844436 vn 0.382683 -0.000000 0.923880 vn 0.349777 -0.405689 0.844436 vn 0.256502 -0.742117 0.619249 vn 0.118586 -0.950775 0.286293 vn -0.040124 -0.994488 -0.096867 vn -0.191785 -0.865356 -0.463010 vn -0.309927 -0.586598 -0.748230 vn -0.374371 -0.207298 -0.903811 vn -0.511149 0.207299 -0.834119 vn -0.423160 0.586597 -0.690535 vn -0.261855 0.865356 -0.427308 vn -0.054783 0.994488 -0.089398 vn 0.161912 0.950775 0.264217 vn 0.350216 0.742116 0.571500 vn 0.477569 0.405690 0.779323 vn 0.522499 -0.000000 0.852640 vn 0.477570 -0.405690 0.779322 vn 0.350215 -0.742116 0.571500 vn 0.161912 -0.950775 0.264217 vn -0.054783 -0.994488 -0.089398 vn -0.261854 -0.865356 -0.427308 vn -0.423161 -0.586597 -0.690535 vn -0.511148 -0.207299 -0.834119 vn -0.635341 0.207298 -0.743888 vn -0.525974 0.586598 -0.615836 vn -0.325477 0.865355 -0.381084 vn -0.068094 0.994488 -0.079727 vn 0.201252 0.950775 0.235635 vn 0.435307 0.742116 0.509678 vn 0.593604 0.405689 0.695019 vn 0.649448 -0.000000 0.760406 vn 0.593603 -0.405689 0.695019 vn 0.435307 -0.742116 0.509678 vn 0.201252 -0.950775 0.235635 vn -0.068094 -0.994488 -0.079727 vn -0.325477 -0.865355 -0.381084 vn -0.525974 -0.586598 -0.615836 vn -0.635341 -0.207298 -0.743888 vn -0.743888 0.207299 -0.635340 vn -0.615837 0.586598 -0.525974 vn -0.381084 0.865356 -0.325476 vn -0.079727 0.994488 -0.068093 vn 0.235635 0.950775 0.201252 vn 0.509678 0.742117 0.435306 vn 0.695019 0.405689 0.593603 vn 0.760406 -0.000000 0.649448 vn 0.695020 -0.405690 0.593602 vn 0.509678 -0.742117 0.435306 vn 0.235635 -0.950775 0.201252 vn -0.079727 -0.994488 -0.068093 vn -0.381084 -0.865356 -0.325476 vn -0.615837 -0.586598 -0.525974 vn -0.743888 -0.207299 -0.635340 vn -0.834119 0.207298 -0.511149 vn -0.690535 0.586597 -0.423160 vn -0.427308 0.865355 -0.261855 vn -0.089398 0.994488 -0.054783 vn 0.264217 0.950775 0.161912 vn 0.571500 0.742117 0.350216 vn 0.779322 0.405690 0.477570 vn 0.852640 -0.000000 0.522499 vn 0.779322 -0.405690 0.477570 vn 0.571500 -0.742117 0.350216 vn 0.264217 -0.950775 0.161912 vn -0.089398 -0.994488 -0.054783 vn -0.427308 -0.865356 -0.261855 vn -0.690535 -0.586598 -0.423161 vn -0.834119 -0.207298 -0.511149 vn -0.903811 0.207299 -0.374371 vn -0.748230 0.586597 -0.309928 vn -0.463010 0.865356 -0.191785 vn -0.096867 0.994488 -0.040124 vn 0.286293 0.950775 0.118586 vn 0.619249 0.742117 0.256501 vn 0.844436 0.405689 0.349777 vn 0.923879 -0.000000 0.382684 vn 0.844436 -0.405689 0.349777 vn 0.619249 -0.742117 0.256501 vn 0.286293 -0.950775 0.118586 vn -0.096867 -0.994488 -0.040124 vn -0.463010 -0.865356 -0.191785 vn -0.748230 -0.586597 -0.309927 vn -0.903811 -0.207299 -0.374371 vn -0.951248 0.207299 -0.228374 vn -0.787502 0.586597 -0.189062 vn -0.487311 0.865356 -0.116993 vn -0.101951 0.994488 -0.024476 vn 0.301319 0.950775 0.072341 vn 0.651751 0.742117 0.156471 vn 0.888757 0.405689 0.213371 vn 0.972370 -0.000000 0.233445 vn 0.888757 -0.405689 0.213372 vn 0.651751 -0.742117 0.156472 vn 0.301319 -0.950775 0.072340 vn -0.101951 -0.994488 -0.024476 vn -0.487312 -0.865355 -0.116992 vn -0.787502 -0.586597 -0.189062 vn -0.951248 -0.207299 -0.228374 vn -0.975262 0.207298 -0.076755 vn -0.807382 0.586598 -0.063542 vn -0.499613 0.865356 -0.039321 vn -0.104525 0.994488 -0.008226 vn 0.308926 0.950775 0.024313 vn 0.668205 0.742116 0.052589 vn 0.911193 0.405689 0.071713 vn 0.996917 -0.000000 0.078459 vn 0.911193 -0.405689 0.071712 vn 0.668205 -0.742117 0.052589 vn 0.308926 -0.950775 0.024313 vn -0.104525 -0.994488 -0.008226 vn -0.499613 -0.865356 -0.039321 vn -0.807382 -0.586598 -0.063543 vn -0.975262 -0.207298 -0.076755 vn -0.975262 0.207299 0.076754 vn -0.807382 0.586597 0.063542 vn -0.499613 0.865356 0.039320 vn -0.104525 0.994488 0.008226 vn 0.308926 0.950775 -0.024313 vn 0.668205 0.742116 -0.052589 vn 0.911193 0.405689 -0.071712 vn 0.996917 0.000000 -0.078459 vn 0.911193 -0.405689 -0.071712 vn 0.668205 -0.742117 -0.052589 vn 0.308926 -0.950775 -0.024313 vn -0.104525 -0.994488 0.008226 vn -0.499613 -0.865356 0.039320 vn -0.807382 -0.586597 0.063542 vn -0.975262 -0.207299 0.076754 vn -0.951248 0.207298 0.228374 vn -0.787502 0.586597 0.189063 vn -0.487311 0.865356 0.116993 vn -0.101951 0.994488 0.024476 vn 0.301319 0.950775 -0.072340 vn 0.651751 0.742117 -0.156471 vn 0.888757 0.405689 -0.213372 vn 0.972370 0.000000 -0.233445 vn 0.888757 -0.405689 -0.213371 vn 0.651751 -0.742117 -0.156472 vn 0.301319 -0.950775 -0.072340 vn -0.101951 -0.994488 0.024476 vn -0.487311 -0.865356 0.116993 vn -0.787502 -0.586597 0.189063 vn -0.951248 -0.207298 0.228375 vn -0.903811 0.207299 0.374370 vn -0.748231 0.586597 0.309927 vn -0.463010 0.865356 0.191785 vn -0.096867 0.994488 0.040124 vn 0.286293 0.950775 -0.118586 vn 0.619250 0.742116 -0.256502 vn 0.844436 0.405689 -0.349776 vn 0.923880 0.000000 -0.382683 vn 0.844436 -0.405689 -0.349776 vn 0.619250 -0.742116 -0.256501 vn 0.286292 -0.950775 -0.118586 vn -0.096867 -0.994488 0.040124 vn -0.463010 -0.865356 0.191785 vn -0.748231 -0.586597 0.309927 vn -0.903811 -0.207299 0.374370 vn -0.834119 0.207299 0.511149 vn -0.690535 0.586597 0.423160 vn -0.427308 0.865356 0.261855 vn -0.089398 0.994488 0.054783 vn 0.264217 0.950775 -0.161912 vn 0.571500 0.742117 -0.350215 vn 0.779322 0.405690 -0.477569 vn 0.852640 0.000000 -0.522499 vn 0.779322 -0.405690 -0.477570 vn 0.571500 -0.742117 -0.350216 vn 0.264217 -0.950775 -0.161912 vn -0.089398 -0.994488 0.054783 vn -0.427308 -0.865356 0.261855 vn -0.690535 -0.586597 0.423161 vn -0.834119 -0.207299 0.511148 vn -0.743888 0.207298 0.635340 vn -0.615837 0.586597 0.525974 vn -0.381084 0.865355 0.325476 vn -0.079727 0.994488 0.068093 vn 0.235635 0.950775 -0.201251 vn 0.509678 0.742116 -0.435307 vn 0.695019 0.405689 -0.593603 vn 0.760406 0.000000 -0.649448 vn 0.695020 -0.405689 -0.593602 vn 0.509678 -0.742116 -0.435306 vn 0.235635 -0.950775 -0.201252 vn -0.079727 -0.994488 0.068093 vn -0.381084 -0.865355 0.325476 vn -0.615837 -0.586598 0.525974 vn -0.743888 -0.207298 0.635340 vn -0.635341 0.207299 0.743888 vn -0.525975 0.586598 0.615836 vn -0.325477 0.865355 0.381084 vn -0.068094 0.994488 0.079727 vn 0.201252 0.950775 -0.235635 vn 0.435307 0.742116 -0.509678 vn 0.593603 0.405690 -0.695019 vn 0.649449 0.000000 -0.760406 vn 0.593603 -0.405690 -0.695019 vn 0.435307 -0.742116 -0.509678 vn 0.201252 -0.950775 -0.235635 vn -0.068094 -0.994488 0.079727 vn -0.325477 -0.865355 0.381084 vn -0.525974 -0.586598 0.615836 vn -0.635341 -0.207299 0.743888 vn -0.511149 0.207298 0.834119 vn -0.423160 0.586598 0.690535 vn -0.261855 0.865356 0.427308 vn -0.054783 0.994488 0.089398 vn 0.161912 0.950775 -0.264217 vn 0.350216 0.742117 -0.571500 vn 0.477569 0.405689 -0.779323 vn 0.522499 0.000000 -0.852640 vn 0.477570 -0.405689 -0.779323 vn 0.350215 -0.742117 -0.571500 vn 0.161913 -0.950775 -0.264217 vn -0.054783 -0.994488 0.089398 vn -0.261854 -0.865356 0.427308 vn -0.423160 -0.586598 0.690535 vn -0.511148 -0.207298 0.834119 vn -0.374371 0.207299 0.903811 vn -0.309928 0.586597 0.748230 vn -0.191785 0.865356 0.463010 vn -0.040124 0.994488 0.096867 vn 0.118586 0.950775 -0.286293 vn 0.256501 0.742116 -0.619250 vn 0.349777 0.405690 -0.844436 vn 0.382683 0.000000 -0.923880 vn 0.349777 -0.405690 -0.844436 vn 0.256502 -0.742116 -0.619250 vn 0.118586 -0.950775 -0.286293 vn -0.040124 -0.994488 0.096867 vn -0.191785 -0.865356 0.463010 vn -0.309927 -0.586597 0.748230 vn -0.374371 -0.207299 0.903811 vn -0.228374 0.207298 0.951248 vn -0.189062 0.586597 0.787502 vn -0.116993 0.865356 0.487311 vn -0.024476 0.994488 0.101951 vn 0.072340 0.950775 -0.301319 vn 0.156471 0.742116 -0.651752 vn 0.213371 0.405689 -0.888757 vn 0.233446 0.000000 -0.972370 vn 0.213372 -0.405689 -0.888757 vn 0.156471 -0.742116 -0.651752 vn 0.072340 -0.950776 -0.301319 vn -0.024476 -0.994488 0.101951 vn -0.116993 -0.865355 0.487312 vn -0.189062 -0.586597 0.787502 vn -0.228374 -0.207298 0.951248 vn -0.076755 0.207298 0.975262 vn -0.063543 0.586598 0.807382 vn -0.039321 0.865356 0.499613 vn -0.008227 0.994488 0.104525 vn 0.024313 0.950775 -0.308926 vn 0.052590 0.742117 -0.668204 vn 0.071713 0.405689 -0.911193 vn 0.078459 0.000000 -0.996917 vn 0.071712 -0.405689 -0.911193 vn 0.052589 -0.742117 -0.668205 vn 0.024313 -0.950775 -0.308925 vn -0.008227 -0.994488 0.104525 vn -0.039321 -0.865356 0.499613 vn -0.063543 -0.586597 0.807382 vn -0.076755 -0.207298 0.975262 vn 0.076755 0.207298 0.975262 vn 0.063543 0.586598 0.807382 vn 0.039321 0.865356 0.499613 vn 0.008226 0.994488 0.104525 vn -0.024313 0.950775 -0.308926 vn -0.052589 0.742117 -0.668205 vn -0.071713 0.405689 -0.911193 vn -0.078459 0.000000 -0.996917 vn -0.071712 -0.405689 -0.911193 vn -0.052589 -0.742117 -0.668205 vn -0.024313 -0.950775 -0.308926 vn 0.008227 -0.994488 0.104525 vn 0.039321 -0.865356 0.499613 vn 0.063543 -0.586598 0.807382 vn 0.076755 -0.207298 0.975262 vn 0.228374 0.207298 0.951248 vn 0.189062 0.586597 0.787502 vn 0.116993 0.865356 0.487311 vn 0.024476 0.994488 0.101951 vn -0.072340 0.950775 -0.301319 vn -0.156472 0.742116 -0.651752 vn -0.213372 0.405689 -0.888757 vn -0.233446 0.000000 -0.972370 vn -0.213372 -0.405689 -0.888757 vn -0.156472 -0.742116 -0.651751 vn -0.072340 -0.950775 -0.301319 vn 0.024476 -0.994488 0.101951 vn 0.116993 -0.865356 0.487311 vn 0.189062 -0.586597 0.787502 vn 0.228374 -0.207298 0.951248 vn 0.374371 0.207298 0.903811 vn 0.309928 0.586597 0.748230 vn 0.191785 0.865356 0.463009 vn 0.040124 0.994488 0.096867 vn -0.118586 0.950775 -0.286293 vn -0.256502 0.742117 -0.619249 vn -0.349777 0.405689 -0.844436 vn -0.382684 0.000000 -0.923879 vn -0.349777 -0.405689 -0.844436 vn -0.256501 -0.742117 -0.619249 vn -0.118587 -0.950775 -0.286293 vn 0.040124 -0.994488 0.096867 vn 0.191785 -0.865356 0.463010 vn 0.309928 -0.586597 0.748230 vn 0.374371 -0.207298 0.903811 vn 0.511148 0.207299 0.834119 vn 0.423160 0.586597 0.690535 vn 0.261854 0.865356 0.427308 vn 0.054783 0.994488 0.089398 vn -0.161912 0.950775 -0.264217 vn -0.350215 0.742116 -0.571500 vn -0.477569 0.405690 -0.779323 vn -0.522498 0.000000 -0.852641 vn -0.477569 -0.405690 -0.779323 vn -0.350216 -0.742116 -0.571500 vn -0.161912 -0.950775 -0.264217 vn 0.054783 -0.994488 0.089398 vn 0.261854 -0.865356 0.427308 vn 0.423160 -0.586597 0.690535 vn 0.511148 -0.207299 0.834119 vn 0.635341 0.207299 0.743888 vn 0.525974 0.586597 0.615837 vn 0.325476 0.865356 0.381084 vn 0.068093 0.994488 0.079727 vn -0.201251 0.950775 -0.235635 vn -0.435306 0.742116 -0.509678 vn -0.593602 0.405689 -0.695020 vn -0.649448 0.000000 -0.760406 vn -0.593603 -0.405689 -0.695020 vn -0.435306 -0.742117 -0.509678 vn -0.201251 -0.950775 -0.235635 vn 0.068093 -0.994488 0.079727 vn 0.325476 -0.865356 0.381084 vn 0.525974 -0.586597 0.615837 vn 0.635340 -0.207299 0.743888 vn 0.743888 0.207298 0.635341 vn 0.615836 0.586598 0.525974 vn 0.381084 0.865355 0.325476 vn 0.079727 0.994488 0.068093 vn -0.235635 0.950775 -0.201251 vn -0.509678 0.742116 -0.435306 vn -0.695019 0.405689 -0.593603 vn -0.760406 0.000000 -0.649448 vn -0.695019 -0.405690 -0.593603 vn -0.509678 -0.742116 -0.435306 vn -0.235635 -0.950775 -0.201251 vn 0.079727 -0.994488 0.068093 vn 0.381084 -0.865355 0.325476 vn 0.615836 -0.586598 0.525974 vn 0.743888 -0.207298 0.635341 vn 0.834119 0.207299 0.511149 vn 0.690535 0.586597 0.423160 vn 0.427308 0.865356 0.261855 vn 0.089398 0.994488 0.054783 vn -0.264217 0.950776 -0.161912 vn -0.571500 0.742116 -0.350216 vn -0.779322 0.405689 -0.477570 vn -0.852640 0.000000 -0.522499 vn -0.779322 -0.405689 -0.477570 vn -0.571500 -0.742116 -0.350216 vn -0.264216 -0.950775 -0.161913 vn 0.089398 -0.994488 0.054783 vn 0.427308 -0.865356 0.261855 vn 0.690535 -0.586597 0.423161 vn 0.834119 -0.207299 0.511148 vn 0.903811 0.207298 0.374371 vn 0.748230 0.586597 0.309928 vn 0.463010 0.865356 0.191785 vn 0.096867 0.994488 0.040124 vn -0.286293 0.950775 -0.118587 vn -0.619250 0.742116 -0.256502 vn -0.844436 0.405689 -0.349778 vn -0.923879 0.000000 -0.382684 vn -0.844436 -0.405689 -0.349777 vn -0.619249 -0.742116 -0.256502 vn -0.286293 -0.950776 -0.118586 vn 0.096867 -0.994488 0.040124 vn 0.463010 -0.865356 0.191785 vn 0.748230 -0.586597 0.309928 vn 0.903811 -0.207298 0.374371 vn 0.951248 0.207298 0.228375 vn 0.787501 0.586598 0.189063 vn 0.487311 0.865356 0.116993 vn 0.101951 0.994488 0.024476 vn -0.301319 0.950775 -0.072340 vn -0.651752 0.742116 -0.156472 vn -0.888757 0.405690 -0.213371 vn -0.972370 0.000000 -0.233446 vn -0.888757 -0.405690 -0.213372 vn -0.651752 -0.742116 -0.156471 vn -0.301319 -0.950775 -0.072340 vn 0.101951 -0.994488 0.024476 vn 0.487311 -0.865356 0.116993 vn 0.787502 -0.586598 0.189063 vn 0.951248 -0.207298 0.228375 vn 0.975262 0.207299 0.076755 vn 0.807382 0.586597 0.063543 vn 0.499613 0.865356 0.039321 vn 0.104525 0.994488 0.008226 vn -0.308926 0.950775 -0.024313 vn -0.668205 0.742117 -0.052589 vn -0.911194 0.405689 -0.071713 vn -0.996917 0.000000 -0.078459 vn -0.911194 -0.405689 -0.071713 vn -0.668205 -0.742117 -0.052589 vn -0.308926 -0.950775 -0.024313 vn 0.104525 -0.994488 0.008226 vn 0.499613 -0.865356 0.039321 vn 0.807382 -0.586597 0.063543 vn 0.975262 -0.207299 0.076755 vn 0.975262 0.207299 -0.076755 vn 0.807382 0.586597 -0.063543 vn -0.668205 0.742117 0.052589 vn -0.911194 0.405689 0.071712 vn -0.911194 -0.405689 0.071713 vn -0.668205 -0.742117 0.052589 vn 0.807382 -0.586597 -0.063543 vn 0.975262 -0.207298 -0.076755 vn 0.951248 0.207298 -0.228374 vn 0.787502 0.586598 -0.189062 vn 0.487311 0.865356 -0.116993 vn -0.301319 0.950775 0.072340 vn -0.651751 0.742117 0.156472 vn -0.651751 -0.742117 0.156471 vn -0.301319 -0.950775 0.072341 vn 0.487311 -0.865356 -0.116992 vn 0.787502 -0.586598 -0.189062 vn 0.951248 -0.207298 -0.228374 vn 0.748231 0.586597 -0.309928 vn -0.619250 0.742117 0.256501 vn -0.619250 -0.742117 0.256502 vn 0.748231 -0.586597 -0.309927 vn 0.903810 -0.207299 -0.374371 vn 0.834119 0.207299 -0.511148 vn 0.834119 -0.207299 -0.511148 vn 0.743888 0.207298 -0.635341 vn 0.381084 0.865356 -0.325476 vn -0.509678 0.742117 0.435307 vn 0.381083 -0.865356 -0.325477 vn 0.615836 -0.586597 -0.525974 vn 0.743888 -0.207298 -0.635341 vn 0.635341 0.207299 -0.743888 vn 0.525974 0.586597 -0.615836 vn 0.325476 0.865356 -0.381084 vn -0.201252 0.950775 0.235635 vn -0.593603 0.405689 0.695020 vn -0.593603 -0.405689 0.695019 vn -0.435306 -0.742116 0.509678 vn -0.201251 -0.950775 0.235635 vn 0.325476 -0.865355 -0.381084 vn 0.635340 -0.207299 -0.743888 vn 0.261854 0.865356 -0.427307 vn -0.350216 0.742116 0.571500 vn -0.477569 0.405690 0.779322 vn -0.477570 -0.405689 0.779322 vn -0.350215 -0.742116 0.571500 vn -0.161912 -0.950776 0.264217 vn 0.261854 -0.865356 -0.427307 vn 0.191785 0.865356 -0.463010 vn -0.118587 0.950775 0.286293 vn -0.256501 0.742117 0.619250 vn -0.349777 0.405689 0.844436 vn -0.349777 -0.405689 0.844436 vn -0.256502 -0.742117 0.619249 vn -0.118586 -0.950775 0.286293 vn 0.374371 -0.207298 -0.903811 vn 0.189062 0.586597 -0.787502 vn -0.156472 0.742116 0.651751 vn -0.156472 -0.742116 0.651752 vn 0.189062 -0.586597 -0.787502 vn 0.063543 0.586598 -0.807382 vn -0.052589 0.742117 0.668205 vn -0.071712 0.405689 0.911193 vn -0.071713 -0.405689 0.911193 vn -0.052589 -0.742117 0.668205 vn 0.063543 -0.586598 -0.807382 vn -0.063543 0.586597 -0.807382 vn 0.024313 0.950775 0.308925 vn 0.052589 0.742117 0.668205 vn 0.071712 0.405689 0.911193 vn 0.071713 -0.405689 0.911193 vn 0.052590 -0.742117 0.668204 vn 0.024313 -0.950775 0.308926 vn -0.063543 -0.586598 -0.807382 vn -0.189062 0.586597 -0.787502 vn -0.116993 0.865355 -0.487312 vn 0.072340 0.950776 0.301319 vn 0.213372 0.405689 0.888757 vn 0.213371 -0.405689 0.888757 vn -0.116993 -0.865356 -0.487311 vn -0.189062 -0.586598 -0.787502 vn -0.309927 0.586597 -0.748230 vn -0.191785 0.865356 -0.463010 vn 0.256502 0.742116 0.619250 vn 0.349777 0.405690 0.844436 vn 0.349777 -0.405690 0.844436 vn 0.256501 -0.742116 0.619250 vn -0.309928 -0.586597 -0.748230 vn -0.374371 -0.207299 -0.903811 vn -0.511148 0.207298 -0.834119 vn -0.423160 0.586598 -0.690535 vn -0.261854 0.865355 -0.427308 vn 0.161913 0.950775 0.264217 vn 0.350215 0.742117 0.571500 vn 0.477570 0.405689 0.779323 vn 0.477569 -0.405689 0.779323 vn 0.350216 -0.742117 0.571500 vn -0.261855 -0.865355 -0.427308 vn -0.423160 -0.586598 -0.690535 vn -0.511149 -0.207298 -0.834119 vn -0.635341 0.207299 -0.743888 vn 0.593603 0.405690 0.695019 vn 0.649449 0.000000 0.760406 vn 0.593603 -0.405690 0.695019 vn -0.525975 -0.586598 -0.615836 vn -0.635341 -0.207299 -0.743888 vn -0.743888 0.207298 -0.635340 vn -0.615837 0.586597 -0.525974 vn -0.381084 0.865355 -0.325476 vn 0.509678 0.742116 0.435306 vn 0.695020 0.405689 0.593602 vn 0.695019 -0.405689 0.593603 vn 0.509678 -0.742116 0.435307 vn 0.235635 -0.950775 0.201251 vn -0.381084 -0.865355 -0.325476 vn -0.615837 -0.586597 -0.525974 vn -0.743888 -0.207298 -0.635340 vn -0.834119 0.207299 -0.511149 vn -0.690535 0.586597 -0.423161 vn -0.427308 0.865356 -0.261854 vn -0.690535 -0.586597 -0.423161 vn -0.834119 -0.207299 -0.511149 vn -0.748230 0.586597 -0.309927 vn 0.619250 0.742117 0.256501 vn 0.844436 0.405690 0.349777 vn 0.844436 -0.405690 0.349777 vn -0.748230 -0.586597 -0.309928 vn -0.951248 0.207298 -0.228374 vn -0.787501 0.586598 -0.189062 vn -0.487312 0.865355 -0.116992 vn 0.301319 0.950775 0.072340 vn 0.651751 0.742117 0.156472 vn 0.888757 0.405689 0.213372 vn 0.888757 -0.405689 0.213371 vn 0.651751 -0.742117 0.156471 vn 0.301319 -0.950775 0.072341 vn -0.487311 -0.865356 -0.116993 vn -0.787501 -0.586598 -0.189062 vn -0.951248 -0.207298 -0.228374 vn -0.975262 0.207299 -0.076755 vn -0.807382 0.586597 -0.063543 vn 0.668205 0.742117 0.052589 vn 0.911194 0.405689 0.071712 vn 0.911194 -0.405689 0.071713 vn 0.668205 -0.742116 0.052589 vn -0.807382 -0.586597 -0.063542 vn -0.975262 -0.207299 -0.076755 vn -0.975262 0.207298 0.076754 vn -0.975262 -0.207298 0.076754 vn -0.951248 0.207299 0.228375 vn 0.651751 0.742117 -0.156472 vn 0.888757 0.405689 -0.213371 vn 0.888757 -0.405689 -0.213372 vn 0.651751 -0.742117 -0.156471 vn -0.487311 -0.865355 0.116993 vn -0.951248 -0.207299 0.228374 vn 0.286293 0.950775 -0.118587 vn 0.619250 0.742117 -0.256501 vn 0.844437 -0.405689 -0.349776 vn 0.619249 -0.742117 -0.256502 vn 0.286293 -0.950775 -0.118586 vn -0.834119 0.207298 0.511148 vn -0.427308 0.865355 0.261855 vn 0.571500 0.742116 -0.350216 vn 0.779322 0.405689 -0.477570 vn 0.779322 -0.405689 -0.477569 vn 0.571500 -0.742116 -0.350215 vn -0.427308 -0.865355 0.261855 vn -0.690535 -0.586597 0.423160 vn -0.834119 -0.207298 0.511149 vn -0.743888 0.207299 0.635340 vn -0.615837 0.586598 0.525974 vn -0.381084 0.865356 0.325476 vn 0.235635 0.950775 -0.201252 vn 0.509678 0.742117 -0.435306 vn 0.695020 0.405690 -0.593602 vn 0.695019 -0.405689 -0.593603 vn 0.509678 -0.742117 -0.435306 vn -0.381084 -0.865356 0.325476 vn -0.743888 -0.207299 0.635340 vn -0.635341 0.207298 0.743888 vn -0.525974 0.586598 0.615836 vn 0.593603 0.405689 -0.695019 vn 0.649448 0.000000 -0.760406 vn 0.593603 -0.405689 -0.695019 vn -0.635341 -0.207298 0.743888 vn -0.511148 0.207299 0.834119 vn -0.423161 0.586597 0.690535 vn -0.261854 0.865356 0.427308 vn 0.350215 0.742116 -0.571500 vn 0.477570 0.405690 -0.779322 vn 0.477569 -0.405690 -0.779323 vn 0.350216 -0.742116 -0.571500 vn 0.161912 -0.950775 -0.264217 vn -0.423160 -0.586597 0.690535 vn -0.511149 -0.207299 0.834119 vn -0.374371 0.207298 0.903811 vn -0.309927 0.586598 0.748230 vn -0.191785 0.865355 0.463010 vn 0.256502 0.742117 -0.619249 vn 0.349777 0.405689 -0.844436 vn 0.349777 -0.405689 -0.844436 vn 0.256501 -0.742117 -0.619250 vn -0.191785 -0.865355 0.463010 vn -0.309927 -0.586598 0.748230 vn -0.374371 -0.207298 0.903811 vn -0.189062 0.586598 0.787501 vn -0.116993 0.865355 0.487312 vn 0.213372 0.405690 -0.888757 vn 0.213371 -0.405690 -0.888757 vn 0.072340 -0.950775 -0.301319 vn -0.116993 -0.865356 0.487311 vn -0.189062 -0.586598 0.787501 vn -0.063543 0.586597 0.807382 vn 0.024313 0.950775 -0.308925 vn 0.052589 0.742116 -0.668205 vn 0.071712 0.405689 -0.911193 vn 0.071713 -0.405689 -0.911193 vn 0.052590 -0.742116 -0.668205 vn 0.024313 -0.950775 -0.308926 vn -0.063543 -0.586598 0.807382 vn 0.063543 0.586597 0.807382 vn 0.008227 0.994488 0.104525 vn -0.052589 0.742116 -0.668205 vn -0.071712 0.405689 -0.911193 vn -0.071713 -0.405689 -0.911193 vn -0.052589 -0.742116 -0.668205 vn 0.008226 -0.994488 0.104525 vn 0.063543 -0.586597 0.807382 vn 0.189062 0.586598 0.787502 vn -0.156472 0.742117 -0.651751 vn -0.156471 -0.742117 -0.651751 vn 0.189062 -0.586598 0.787502 vn 0.374372 0.207298 0.903811 vn -0.118587 0.950775 -0.286293 vn -0.256502 0.742116 -0.619250 vn -0.349777 0.405690 -0.844436 vn -0.349777 -0.405690 -0.844436 vn -0.256502 -0.742116 -0.619250 vn -0.118586 -0.950775 -0.286293 vn 0.191785 -0.865356 0.463009 vn 0.511148 0.207298 0.834119 vn -0.350216 0.742116 -0.571500 vn -0.477569 0.405689 -0.779323 vn -0.477569 -0.405689 -0.779323 vn -0.350215 -0.742116 -0.571500 vn 0.511148 -0.207298 0.834119 vn 0.635340 0.207299 0.743888 vn 0.068094 0.994488 0.079727 vn -0.593602 0.405690 -0.695019 vn -0.593602 -0.405690 -0.695020 vn -0.435306 -0.742116 -0.509678 vn 0.743888 0.207299 0.635341 vn 0.615837 0.586597 0.525974 vn 0.381084 0.865356 0.325476 vn -0.695019 -0.405689 -0.593603 vn 0.381084 -0.865356 0.325476 vn 0.615836 -0.586597 0.525974 vn 0.743888 -0.207299 0.635341 vn 0.834119 0.207298 0.511149 vn 0.690534 0.586598 0.423161 vn 0.427308 0.865355 0.261855 vn -0.264217 0.950775 -0.161913 vn -0.264217 -0.950775 -0.161912 vn 0.427308 -0.865355 0.261855 vn 0.690535 -0.586598 0.423160 vn 0.834119 -0.207298 0.511149 vn 0.903810 0.207299 0.374371 vn -0.286293 0.950776 -0.118586 vn -0.844436 0.405690 -0.349777 vn -0.844436 -0.405690 -0.349778 vn -0.619250 -0.742116 -0.256502 vn -0.286293 -0.950775 -0.118587 vn 0.903811 -0.207299 0.374371 vn 0.787502 0.586597 0.189063 vn -0.301319 0.950775 -0.072341 vn -0.651751 0.742117 -0.156471 vn -0.888757 0.405689 -0.213372 vn -0.888757 -0.405689 -0.213371 vn -0.651751 -0.742116 -0.156472 vn 0.787502 -0.586597 0.189063 vn 0.975262 0.207298 0.076755 vn 0.807382 0.586598 0.063543 vn -0.668205 0.742116 -0.052589 vn -0.911193 0.405689 -0.071713 vn -0.911193 -0.405689 -0.071713 vn -0.668205 -0.742116 -0.052589 vn 0.975262 -0.207298 0.076755 usemtl Material.001 s off f 1//1 16//1 17//1 f 2//2 17//2 18//2 f 3//3 18//3 19//3 f 4//4 19//4 20//4 f 5//5 20//5 6//5 f 6//6 21//6 7//6 f 7//7 22//7 8//7 f 8//8 23//8 9//8 f 9//9 24//9 10//9 f 10//10 25//10 11//10 f 11//11 26//11 12//11 f 12//12 27//12 28//12 f 13//13 28//13 29//13 f 14//14 29//14 30//14 f 1//15 15//15 30//15 f 16//16 31//16 32//16 f 17//17 32//17 33//17 f 18//18 33//18 34//18 f 19//19 34//19 35//19 f 20//20 35//20 21//20 f 21//21 36//21 22//21 f 22//22 37//22 23//22 f 23//23 38//23 24//23 f 24//24 39//24 25//24 f 25//25 40//25 26//25 f 26//26 41//26 27//26 f 27//27 42//27 43//27 f 28//28 43//28 44//28 f 29//29 44//29 45//29 f 30//30 45//30 31//30 f 31//31 46//31 47//31 f 32//32 47//32 48//32 f 33//33 48//33 49//33 f 34//34 49//34 50//34 f 35//35 50//35 36//35 f 36//36 51//36 37//36 f 37//37 52//37 38//37 f 38//38 53//38 39//38 f 39//39 54//39 40//39 f 40//40 55//40 41//40 f 41//41 56//41 42//41 f 42//42 57//42 58//42 f 43//43 58//43 59//43 f 44//44 59//44 60//44 f 45//45 60//45 46//45 f 46//46 61//46 62//46 f 47//47 62//47 63//47 f 48//48 63//48 64//48 f 49//49 64//49 65//49 f 50//50 65//50 51//50 f 51//51 66//51 52//51 f 52//52 67//52 53//52 f 53//53 68//53 54//53 f 54//54 69//54 55//54 f 55//55 70//55 56//55 f 56//56 71//56 72//56 f 57//57 72//57 73//57 f 58//58 73//58 59//58 f 59//59 74//59 75//59 f 60//60 75//60 61//60 f 61//61 76//61 77//61 f 62//62 77//62 78//62 f 63//63 78//63 79//63 f 64//64 79//64 80//64 f 65//65 80//65 66//65 f 66//66 81//66 82//66 f 67//67 82//67 68//67 f 68//68 83//68 69//68 f 69//69 84//69 70//69 f 70//70 85//70 71//70 f 71//71 86//71 72//71 f 72//72 87//72 88//72 f 73//73 88//73 89//73 f 74//74 89//74 90//74 f 75//75 90//75 76//75 f 76//76 91//76 92//76 f 77//77 92//77 93//77 f 78//78 93//78 94//78 f 79//79 94//79 95//79 f 80//80 95//80 81//80 f 81//81 96//81 82//81 f 82//82 97//82 83//82 f 83//83 98//83 84//83 f 84//84 99//84 85//84 f 85//85 100//85 86//85 f 86//86 101//86 87//86 f 87//87 102//87 103//87 f 88//88 103//88 104//88 f 89//89 104//89 105//89 f 90//90 105//90 91//90 f 91//91 106//91 107//91 f 92//92 107//92 108//92 f 93//93 108//93 109//93 f 94//94 109//94 110//94 f 95//95 110//95 96//95 f 96//96 111//96 97//96 f 97//97 112//97 98//97 f 98//98 113//98 99//98 f 99//99 114//99 100//99 f 100//100 115//100 101//100 f 101//101 116//101 102//101 f 102//102 117//102 118//102 f 103//103 118//103 119//103 f 104//104 119//104 120//104 f 105//105 120//105 106//105 f 106//106 121//106 122//106 f 107//107 122//107 123//107 f 108//108 123//108 124//108 f 109//109 124//109 125//109 f 110//110 125//110 111//110 f 111//111 126//111 112//111 f 112//112 127//112 113//112 f 113//113 128//113 114//113 f 114//114 129//114 115//114 f 115//115 130//115 116//115 f 116//116 131//116 132//116 f 117//117 132//117 133//117 f 118//118 133//118 134//118 f 119//119 134//119 135//119 f 120//120 135//120 121//120 f 121//121 136//121 137//121 f 122//122 137//122 138//122 f 123//123 138//123 139//123 f 124//124 139//124 140//124 f 125//125 140//125 141//125 f 126//126 141//126 127//126 f 127//127 142//127 128//127 f 128//128 143//128 129//128 f 129//129 144//129 130//129 f 130//130 145//130 131//130 f 131//131 146//131 132//131 f 132//132 147//132 148//132 f 133//133 148//133 149//133 f 134//134 149//134 150//134 f 135//135 150//135 136//135 f 136//136 151//136 152//136 f 137//137 152//137 153//137 f 138//138 153//138 154//138 f 139//139 154//139 155//139 f 140//140 155//140 141//140 f 141//141 156//141 142//141 f 142//142 157//142 143//142 f 143//143 158//143 144//143 f 144//144 159//144 145//144 f 145//145 160//145 146//145 f 146//146 161//146 162//146 f 147//147 162//147 163//147 f 148//148 163//148 149//148 f 149//149 164//149 165//149 f 150//150 165//150 151//150 f 151//151 166//151 152//151 f 152//152 167//152 168//152 f 153//153 168//153 154//153 f 154//154 169//154 170//154 f 155//155 170//155 156//155 f 156//156 171//156 172//156 f 157//157 172//157 173//157 f 158//158 173//158 174//158 f 159//159 174//159 175//159 f 160//160 175//160 176//160 f 161//161 176//161 177//161 f 162//162 177//162 163//162 f 163//163 178//163 164//163 f 164//164 179//164 165//164 f 165//165 180//165 151//165 f 166//166 181//166 167//166 f 167//167 182//167 168//167 f 168//168 183//168 169//168 f 169//169 184//169 170//169 f 170//170 185//170 186//170 f 171//171 186//171 187//171 f 172//172 187//172 188//172 f 173//173 188//173 189//173 f 174//174 189//174 190//174 f 175//175 190//175 191//175 f 176//176 191//176 192//176 f 177//177 192//177 193//177 f 178//178 193//178 194//178 f 179//179 194//179 180//179 f 180//180 195//180 166//180 f 181//181 196//181 182//181 f 182//182 197//182 183//182 f 183//183 198//183 184//183 f 184//184 199//184 185//184 f 185//185 200//185 201//185 f 186//186 201//186 202//186 f 187//187 202//187 203//187 f 188//188 203//188 204//188 f 189//189 204//189 205//189 f 190//190 205//190 206//190 f 191//191 206//191 207//191 f 192//192 207//192 193//192 f 193//193 208//193 194//193 f 194//194 209//194 195//194 f 195//195 210//195 181//195 f 196//196 211//196 197//196 f 197//197 212//197 198//197 f 198//198 213//198 199//198 f 199//199 214//199 200//199 f 200//200 215//200 216//200 f 201//201 216//201 217//201 f 202//202 217//202 218//202 f 203//203 218//203 219//203 f 204//204 219//204 220//204 f 205//205 220//205 221//205 f 206//206 221//206 222//206 f 207//207 222//207 223//207 f 208//208 223//208 209//208 f 209//209 224//209 210//209 f 210//210 225//210 196//210 f 211//211 226//211 212//211 f 212//212 227//212 213//212 f 213//213 228//213 214//213 f 214//214 229//214 215//214 f 215//215 230//215 216//215 f 216//216 231//216 217//216 f 217//217 232//217 233//217 f 218//218 233//218 234//218 f 219//219 234//219 235//219 f 220//220 235//220 236//220 f 221//221 236//221 237//221 f 222//222 237//222 223//222 f 223//223 238//223 224//223 f 224//224 239//224 225//224 f 225//225 240//225 211//225 f 226//226 241//226 227//226 f 227//227 242//227 228//227 f 228//228 243//228 229//228 f 229//229 244//229 230//229 f 230//230 245//230 246//230 f 231//231 246//231 247//231 f 232//232 247//232 248//232 f 233//233 248//233 249//233 f 234//234 249//234 250//234 f 235//235 250//235 251//235 f 236//236 251//236 252//236 f 237//237 252//237 238//237 f 238//238 253//238 239//238 f 239//239 254//239 240//239 f 240//240 255//240 226//240 f 241//241 256//241 242//241 f 242//242 257//242 243//242 f 243//243 258//243 244//243 f 244//244 259//244 245//244 f 245//245 260//245 261//245 f 246//246 261//246 262//246 f 247//247 262//247 263//247 f 248//248 263//248 264//248 f 249//249 264//249 265//249 f 250//250 265//250 266//250 f 251//251 266//251 252//251 f 252//252 267//252 253//252 f 253//253 268//253 254//253 f 254//254 269//254 255//254 f 255//255 270//255 241//255 f 256//256 271//256 257//256 f 257//257 272//257 258//257 f 258//258 273//258 259//258 f 259//259 274//259 260//259 f 260//260 275//260 276//260 f 261//261 276//261 277//261 f 262//262 277//262 278//262 f 263//263 278//263 279//263 f 264//264 279//264 280//264 f 265//265 280//265 281//265 f 266//266 281//266 282//266 f 267//267 282//267 268//267 f 268//268 283//268 269//268 f 269//269 284//269 270//269 f 270//270 285//270 256//270 f 271//271 286//271 272//271 f 272//272 287//272 273//272 f 273//273 288//273 289//273 f 274//274 289//274 290//274 f 275//275 290//275 276//275 f 276//276 291//276 277//276 f 277//277 292//277 293//277 f 278//278 293//278 294//278 f 279//279 294//279 295//279 f 280//280 295//280 296//280 f 281//281 296//281 297//281 f 282//282 297//282 283//282 f 283//283 298//283 284//283 f 284//284 299//284 285//284 f 285//285 300//285 271//285 f 286//286 301//286 287//286 f 287//287 302//287 288//287 f 288//288 303//288 289//288 f 289//289 304//289 290//289 f 290//290 305//290 306//290 f 291//291 306//291 307//291 f 292//292 307//292 308//292 f 293//293 308//293 309//293 f 294//294 309//294 310//294 f 295//295 310//295 296//295 f 296//296 311//296 312//296 f 297//297 312//297 298//297 f 298//298 313//298 299//298 f 299//299 314//299 300//299 f 300//300 315//300 286//300 f 301//301 316//301 302//301 f 302//302 317//302 303//302 f 303//303 318//303 304//303 f 304//304 319//304 305//304 f 305//305 320//305 321//305 f 306//306 321//306 322//306 f 307//307 322//307 323//307 f 308//308 323//308 324//308 f 309//309 324//309 325//309 f 310//310 325//310 326//310 f 311//311 326//311 327//311 f 312//312 327//312 313//312 f 313//313 328//313 314//313 f 314//314 329//314 315//314 f 315//315 330//315 301//315 f 316//316 331//316 317//316 f 317//317 332//317 318//317 f 318//318 333//318 319//318 f 319//319 334//319 335//319 f 320//320 335//320 336//320 f 321//321 336//321 337//321 f 322//322 337//322 338//322 f 323//323 338//323 339//323 f 324//324 339//324 340//324 f 325//325 340//325 341//325 f 326//326 341//326 342//326 f 327//327 342//327 328//327 f 328//328 343//328 329//328 f 329//329 344//329 330//329 f 330//330 345//330 316//330 f 331//331 346//331 332//331 f 332//332 347//332 333//332 f 333//333 348//333 334//333 f 334//334 349//334 335//334 f 335//335 350//335 351//335 f 336//336 351//336 352//336 f 337//337 352//337 353//337 f 338//338 353//338 354//338 f 339//339 354//339 355//339 f 340//340 355//340 356//340 f 341//341 356//341 357//341 f 342//342 357//342 343//342 f 343//343 358//343 344//343 f 344//344 359//344 345//344 f 345//345 360//345 331//345 f 346//346 361//346 347//346 f 347//347 362//347 348//347 f 348//348 363//348 349//348 f 349//349 364//349 350//349 f 350//350 365//350 366//350 f 351//351 366//351 367//351 f 352//352 367//352 368//352 f 353//353 368//353 369//353 f 354//354 369//354 370//354 f 355//355 370//355 371//355 f 356//356 371//356 372//356 f 357//357 372//357 358//357 f 358//358 373//358 359//358 f 359//359 374//359 360//359 f 360//360 375//360 346//360 f 361//361 376//361 362//361 f 362//362 377//362 363//362 f 363//363 378//363 364//363 f 364//364 379//364 365//364 f 365//365 380//365 381//365 f 366//366 381//366 382//366 f 367//367 382//367 383//367 f 368//368 383//368 384//368 f 369//369 384//369 385//369 f 370//370 385//370 386//370 f 371//371 386//371 387//371 f 372//372 387//372 373//372 f 373//373 388//373 374//373 f 374//374 389//374 375//374 f 375//375 390//375 361//375 f 376//376 391//376 377//376 f 377//377 392//377 378//377 f 378//378 393//378 379//378 f 379//379 394//379 380//379 f 380//380 395//380 396//380 f 381//381 396//381 397//381 f 382//382 397//382 398//382 f 383//383 398//383 399//383 f 384//384 399//384 400//384 f 385//385 400//385 386//385 f 386//386 401//386 387//386 f 387//387 402//387 388//387 f 388//388 403//388 389//388 f 389//389 404//389 390//389 f 390//390 405//390 376//390 f 391//391 406//391 392//391 f 392//392 407//392 393//392 f 393//393 408//393 394//393 f 394//394 409//394 410//394 f 395//395 410//395 411//395 f 396//396 411//396 412//396 f 397//397 412//397 413//397 f 398//398 413//398 414//398 f 399//399 414//399 415//399 f 400//400 415//400 416//400 f 401//401 416//401 417//401 f 402//402 417//402 403//402 f 403//403 418//403 404//403 f 404//404 419//404 405//404 f 405//405 420//405 391//405 f 406//406 421//406 407//406 f 407//407 422//407 408//407 f 408//408 423//408 409//408 f 409//409 424//409 410//409 f 410//410 425//410 426//410 f 411//411 426//411 427//411 f 412//412 427//412 428//412 f 413//413 428//413 429//413 f 414//414 429//414 430//414 f 415//415 430//415 431//415 f 416//416 431//416 432//416 f 417//417 432//417 418//417 f 418//418 433//418 419//418 f 419//419 434//419 420//419 f 420//420 435//420 406//420 f 421//421 436//421 422//421 f 422//422 437//422 423//422 f 423//423 438//423 439//423 f 424//424 439//424 440//424 f 425//425 440//425 441//425 f 426//426 441//426 442//426 f 427//427 442//427 443//427 f 428//428 443//428 444//428 f 429//429 444//429 445//429 f 430//430 445//430 446//430 f 431//431 446//431 447//431 f 432//432 447//432 433//432 f 433//433 448//433 434//433 f 434//434 449//434 435//434 f 435//435 450//435 421//435 f 436//436 451//436 437//436 f 437//437 452//437 438//437 f 438//438 453//438 439//438 f 439//439 454//439 440//439 f 440//440 455//440 456//440 f 441//441 456//441 457//441 f 442//442 457//442 458//442 f 443//443 458//443 459//443 f 444//444 459//444 460//444 f 445//445 460//445 461//445 f 446//446 461//446 447//446 f 447//447 462//447 463//447 f 448//448 463//448 449//448 f 449//449 464//449 465//449 f 450//450 465//450 436//450 f 451//451 466//451 467//451 f 452//452 467//452 468//452 f 453//453 468//453 454//453 f 454//454 469//454 470//454 f 455//455 470//455 471//455 f 456//456 471//456 457//456 f 457//457 472//457 458//457 f 458//458 473//458 459//458 f 459//459 474//459 460//459 f 460//460 475//460 461//460 f 461//461 476//461 462//461 f 462//462 477//462 478//462 f 463//463 478//463 479//463 f 464//464 479//464 480//464 f 465//465 480//465 466//465 f 466//466 481//466 482//466 f 467//467 482//467 483//467 f 468//468 483//468 484//468 f 469//469 484//469 485//469 f 470//470 485//470 471//470 f 471//471 486//471 472//471 f 472//472 487//472 473//472 f 473//473 488//473 474//473 f 474//474 489//474 475//474 f 475//475 490//475 476//475 f 476//476 491//476 492//476 f 477//477 492//477 493//477 f 478//478 493//478 494//478 f 479//479 494//479 495//479 f 480//480 495//480 481//480 f 481//481 496//481 497//481 f 482//482 497//482 498//482 f 483//483 498//483 499//483 f 484//484 499//484 500//484 f 485//485 500//485 501//485 f 486//486 501//486 487//486 f 487//487 502//487 488//487 f 488//488 503//488 489//488 f 489//489 504//489 490//489 f 490//490 505//490 491//490 f 491//491 506//491 492//491 f 492//492 507//492 508//492 f 493//493 508//493 509//493 f 494//494 509//494 510//494 f 495//495 510//495 496//495 f 496//496 511//496 512//496 f 497//497 512//497 513//497 f 498//498 513//498 514//498 f 499//499 514//499 515//499 f 500//500 515//500 501//500 f 501//501 516//501 502//501 f 502//502 517//502 503//502 f 503//503 518//503 504//503 f 504//504 519//504 505//504 f 505//505 520//505 521//505 f 506//506 521//506 522//506 f 507//507 522//507 508//507 f 508//508 523//508 524//508 f 509//509 524//509 525//509 f 510//510 525//510 511//510 f 511//511 526//511 527//511 f 512//512 527//512 528//512 f 513//513 528//513 529//513 f 514//514 529//514 530//514 f 515//515 530//515 516//515 f 516//516 531//516 517//516 f 517//517 532//517 518//517 f 518//518 533//518 519//518 f 519//519 534//519 520//519 f 520//520 535//520 521//520 f 521//521 536//521 522//521 f 522//522 537//522 538//522 f 523//523 538//523 539//523 f 524//524 539//524 540//524 f 525//525 540//525 526//525 f 526//526 541//526 542//526 f 527//527 542//527 543//527 f 528//528 543//528 544//528 f 529//529 544//529 530//529 f 530//530 545//530 546//530 f 531//531 546//531 547//531 f 532//532 547//532 533//532 f 533//533 548//533 534//533 f 534//534 549//534 535//534 f 535//535 550//535 536//535 f 536//536 551//536 537//536 f 537//537 552//537 553//537 f 538//538 553//538 554//538 f 539//539 554//539 555//539 f 540//540 555//540 541//540 f 541//541 556//541 557//541 f 542//542 557//542 558//542 f 543//543 558//543 559//543 f 544//544 559//544 560//544 f 545//545 560//545 546//545 f 546//546 561//546 547//546 f 547//547 562//547 548//547 f 548//548 563//548 549//548 f 549//549 564//549 550//549 f 550//550 565//550 551//550 f 551//551 566//551 552//551 f 552//552 567//552 568//552 f 553//553 568//553 569//553 f 554//554 569//554 570//554 f 555//555 570//555 556//555 f 556//556 571//556 572//556 f 557//557 572//557 573//557 f 558//558 573//558 574//558 f 559//559 574//559 575//559 f 560//560 575//560 561//560 f 561//561 576//561 562//561 f 562//562 577//562 563//562 f 563//563 578//563 564//563 f 564//564 579//564 565//564 f 565//565 580//565 566//565 f 566//566 581//566 582//566 f 567//567 582//567 583//567 f 568//568 583//568 584//568 f 569//569 584//569 585//569 f 570//570 585//570 571//570 f 571//571 586//571 587//571 f 572//572 587//572 588//572 f 573//573 588//573 589//573 f 574//574 589//574 590//574 f 575//575 590//575 576//575 f 576//576 591//576 577//576 f 577//577 592//577 578//577 f 578//578 593//578 579//578 f 579//579 594//579 580//579 f 580//580 595//580 581//580 f 581//581 596//581 582//581 f 582//582 597//582 598//582 f 583//583 598//583 599//583 f 584//584 599//584 600//584 f 585//585 600//585 586//585 f 586//586 1//586 2//586 f 587//587 2//587 3//587 f 588//588 3//588 4//588 f 589//589 4//589 5//589 f 590//590 5//590 591//590 f 591//591 6//591 592//591 f 592//592 7//592 593//592 f 593//593 8//593 594//593 f 594//594 9//594 595//594 f 595//595 10//595 596//595 f 596//596 11//596 597//596 f 597//597 12//597 13//597 f 598//598 13//598 14//598 f 599//599 14//599 15//599 f 600//600 15//600 1//600 f 2//601 1//601 17//601 f 3//602 2//602 18//602 f 4//3 3//3 19//3 f 5//4 4//4 20//4 f 20//5 21//5 6//5 f 21//603 22//603 7//603 f 22//604 23//604 8//604 f 23//8 24//8 9//8 f 24//605 25//605 10//605 f 25//606 26//606 11//606 f 26//11 27//11 12//11 f 13//12 12//12 28//12 f 14//13 13//13 29//13 f 15//607 14//607 30//607 f 16//608 1//608 30//608 f 17//609 16//609 32//609 f 18//610 17//610 33//610 f 19//611 18//611 34//611 f 20//19 19//19 35//19 f 35//612 36//612 21//612 f 36//613 37//613 22//613 f 37//22 38//22 23//22 f 38//23 39//23 24//23 f 39//24 40//24 25//24 f 40//614 41//614 26//614 f 41//615 42//615 27//615 f 28//27 27//27 43//27 f 29//616 28//616 44//616 f 30//617 29//617 45//617 f 16//618 30//618 31//618 f 32//31 31//31 47//31 f 33//619 32//619 48//619 f 34//33 33//33 49//33 f 35//34 34//34 50//34 f 50//35 51//35 36//35 f 51//620 52//620 37//620 f 52//37 53//37 38//37 f 53//38 54//38 39//38 f 54//39 55//39 40//39 f 55//621 56//621 41//621 f 56//41 57//41 42//41 f 43//42 42//42 58//42 f 44//43 43//43 59//43 f 45//622 44//622 60//622 f 31//623 45//623 46//623 f 47//624 46//624 62//624 f 48//47 47//47 63//47 f 49//48 48//48 64//48 f 50//49 49//49 65//49 f 65//50 66//50 51//50 f 66//51 67//51 52//51 f 67//52 68//52 53//52 f 68//53 69//53 54//53 f 69//54 70//54 55//54 f 70//55 71//55 56//55 f 57//56 56//56 72//56 f 58//57 57//57 73//57 f 73//58 74//58 59//58 f 60//59 59//59 75//59 f 46//625 60//625 61//625 f 62//626 61//626 77//626 f 63//62 62//62 78//62 f 64//627 63//627 79//627 f 65//64 64//64 80//64 f 80//65 81//65 66//65 f 67//628 66//628 82//628 f 82//67 83//67 68//67 f 83//68 84//68 69//68 f 84//69 85//69 70//69 f 85//70 86//70 71//70 f 86//71 87//71 72//71 f 73//72 72//72 88//72 f 74//629 73//629 89//629 f 75//630 74//630 90//630 f 61//631 75//631 76//631 f 77//632 76//632 92//632 f 78//633 77//633 93//633 f 79//634 78//634 94//634 f 80//79 79//79 95//79 f 95//635 96//635 81//635 f 96//81 97//81 82//81 f 97//636 98//636 83//636 f 98//83 99//83 84//83 f 99//637 100//637 85//637 f 100//638 101//638 86//638 f 101//639 102//639 87//639 f 88//87 87//87 103//87 f 89//640 88//640 104//640 f 90//89 89//89 105//89 f 76//641 90//641 91//641 f 92//91 91//91 107//91 f 93//92 92//92 108//92 f 94//642 93//642 109//642 f 95//94 94//94 110//94 f 110//95 111//95 96//95 f 111//643 112//643 97//643 f 112//644 113//644 98//644 f 113//98 114//98 99//98 f 114//645 115//645 100//645 f 115//646 116//646 101//646 f 116//647 117//647 102//647 f 103//102 102//102 118//102 f 104//648 103//648 119//648 f 105//104 104//104 120//104 f 91//105 105//105 106//105 f 107//106 106//106 122//106 f 108//107 107//107 123//107 f 109//649 108//649 124//649 f 110//109 109//109 125//109 f 125//650 126//650 111//650 f 126//651 127//651 112//651 f 127//652 128//652 113//652 f 128//113 129//113 114//113 f 129//653 130//653 115//653 f 130//654 131//654 116//654 f 117//655 116//655 132//655 f 118//117 117//117 133//117 f 119//118 118//118 134//118 f 120//119 119//119 135//119 f 106//656 120//656 121//656 f 122//121 121//121 137//121 f 123//657 122//657 138//657 f 124//123 123//123 139//123 f 125//124 124//124 140//124 f 126//125 125//125 141//125 f 141//658 142//658 127//658 f 142//127 143//127 128//127 f 143//128 144//128 129//128 f 144//129 145//129 130//129 f 145//659 146//659 131//659 f 146//131 147//131 132//131 f 133//132 132//132 148//132 f 134//133 133//133 149//133 f 135//660 134//660 150//660 f 121//135 135//135 136//135 f 137//136 136//136 152//136 f 138//661 137//661 153//661 f 139//138 138//138 154//138 f 140//139 139//139 155//139 f 155//140 156//140 141//140 f 156//662 157//662 142//662 f 157//663 158//663 143//663 f 158//143 159//143 144//143 f 159//664 160//664 145//664 f 160//665 161//665 146//665 f 147//146 146//146 162//146 f 148//147 147//147 163//147 f 163//148 164//148 149//148 f 150//666 149//666 165//666 f 136//150 150//150 151//150 f 166//151 167//151 152//151 f 153//667 152//667 168//667 f 168//153 169//153 154//153 f 155//154 154//154 170//154 f 170//668 171//668 156//668 f 157//669 156//669 172//669 f 158//670 157//670 173//670 f 159//158 158//158 174//158 f 160//671 159//671 175//671 f 161//672 160//672 176//672 f 162//673 161//673 177//673 f 177//162 178//162 163//162 f 178//163 179//163 164//163 f 179//674 180//674 165//674 f 180//165 166//165 151//165 f 181//166 182//166 167//166 f 182//675 183//675 168//675 f 183//676 184//676 169//676 f 184//169 185//169 170//169 f 171//677 170//677 186//677 f 172//171 171//171 187//171 f 173//678 172//678 188//678 f 174//173 173//173 189//173 f 175//679 174//679 190//679 f 176//175 175//175 191//175 f 177//176 176//176 192//176 f 178//177 177//177 193//177 f 179//680 178//680 194//680 f 194//681 195//681 180//681 f 195//180 181//180 166//180 f 196//181 197//181 182//181 f 197//682 198//682 183//682 f 198//683 199//683 184//683 f 199//184 200//184 185//184 f 186//185 185//185 201//185 f 187//684 186//684 202//684 f 188//685 187//685 203//685 f 189//188 188//188 204//188 f 190//686 189//686 205//686 f 191//687 190//687 206//687 f 192//191 191//191 207//191 f 207//192 208//192 193//192 f 208//193 209//193 194//193 f 209//688 210//688 195//688 f 210//689 196//689 181//689 f 211//690 212//690 197//690 f 212//691 213//691 198//691 f 213//692 214//692 199//692 f 214//199 215//199 200//199 f 201//693 200//693 216//693 f 202//694 201//694 217//694 f 203//695 202//695 218//695 f 204//203 203//203 219//203 f 205//696 204//696 220//696 f 206//697 205//697 221//697 f 207//206 206//206 222//206 f 208//207 207//207 223//207 f 223//698 224//698 209//698 f 224//699 225//699 210//699 f 225//700 211//700 196//700 f 226//701 227//701 212//701 f 227//212 228//212 213//212 f 228//213 229//213 214//213 f 229//214 230//214 215//214 f 230//215 231//215 216//215 f 231//216 232//216 217//216 f 218//702 217//702 233//702 f 219//703 218//703 234//703 f 220//704 219//704 235//704 f 221//220 220//220 236//220 f 222//221 221//221 237//221 f 237//222 238//222 223//222 f 238//223 239//223 224//223 f 239//705 240//705 225//705 f 240//706 226//706 211//706 f 241//707 242//707 227//707 f 242//708 243//708 228//708 f 243//709 244//709 229//709 f 244//229 245//229 230//229 f 231//230 230//230 246//230 f 232//710 231//710 247//710 f 233//711 232//711 248//711 f 234//233 233//233 249//233 f 235//712 234//712 250//712 f 236//713 235//713 251//713 f 237//714 236//714 252//714 f 252//237 253//237 238//237 f 253//715 254//715 239//715 f 254//716 255//716 240//716 f 255//717 241//717 226//717 f 256//718 257//718 242//718 f 257//719 258//719 243//719 f 258//720 259//720 244//720 f 259//244 260//244 245//244 f 246//245 245//245 261//245 f 247//246 246//246 262//246 f 248//247 247//247 263//247 f 249//248 248//248 264//248 f 250//249 249//249 265//249 f 251//250 250//250 266//250 f 266//251 267//251 252//251 f 267//252 268//252 253//252 f 268//253 269//253 254//253 f 269//721 270//721 255//721 f 270//722 256//722 241//722 f 271//256 272//256 257//256 f 272//723 273//723 258//723 f 273//258 274//258 259//258 f 274//259 275//259 260//259 f 261//260 260//260 276//260 f 262//724 261//724 277//724 f 263//725 262//725 278//725 f 264//263 263//263 279//263 f 265//726 264//726 280//726 f 266//265 265//265 281//265 f 267//266 266//266 282//266 f 282//267 283//267 268//267 f 283//268 284//268 269//268 f 284//727 285//727 270//727 f 285//270 271//270 256//270 f 286//728 287//728 272//728 f 287//729 288//729 273//729 f 274//730 273//730 289//730 f 275//274 274//274 290//274 f 290//731 291//731 276//731 f 291//732 292//732 277//732 f 278//733 277//733 293//733 f 279//278 278//278 294//278 f 280//734 279//734 295//734 f 281//735 280//735 296//735 f 282//736 281//736 297//736 f 297//282 298//282 283//282 f 298//737 299//737 284//737 f 299//738 300//738 285//738 f 300//739 286//739 271//739 f 301//740 302//740 287//740 f 302//741 303//741 288//741 f 303//288 304//288 289//288 f 304//289 305//289 290//289 f 291//290 290//290 306//290 f 292//742 291//742 307//742 f 293//743 292//743 308//743 f 294//293 293//293 309//293 f 295//744 294//744 310//744 f 310//745 311//745 296//745 f 297//296 296//296 312//296 f 312//297 313//297 298//297 f 313//298 314//298 299//298 f 314//746 315//746 300//746 f 315//747 301//747 286//747 f 316//748 317//748 302//748 f 317//302 318//302 303//302 f 318//303 319//303 304//303 f 319//304 320//304 305//304 f 306//305 305//305 321//305 f 307//306 306//306 322//306 f 308//307 307//307 323//307 f 309//308 308//308 324//308 f 310//309 309//309 325//309 f 311//310 310//310 326//310 f 312//311 311//311 327//311 f 327//312 328//312 313//312 f 328//313 329//313 314//313 f 329//314 330//314 315//314 f 330//749 316//749 301//749 f 331//750 332//750 317//750 f 332//317 333//317 318//317 f 333//318 334//318 319//318 f 320//319 319//319 335//319 f 321//320 320//320 336//320 f 322//751 321//751 337//751 f 323//752 322//752 338//752 f 324//323 323//323 339//323 f 325//753 324//753 340//753 f 326//754 325//754 341//754 f 327//326 326//326 342//326 f 342//327 343//327 328//327 f 343//755 344//755 329//755 f 344//329 345//329 330//329 f 345//756 331//756 316//756 f 346//331 347//331 332//331 f 347//332 348//332 333//332 f 348//333 349//333 334//333 f 349//334 350//334 335//334 f 336//757 335//757 351//757 f 337//758 336//758 352//758 f 338//337 337//337 353//337 f 339//338 338//338 354//338 f 340//759 339//759 355//759 f 341//760 340//760 356//760 f 342//761 341//761 357//761 f 357//342 358//342 343//342 f 358//343 359//343 344//343 f 359//344 360//344 345//344 f 360//345 346//345 331//345 f 361//762 362//762 347//762 f 362//347 363//347 348//347 f 363//763 364//763 349//763 f 364//349 365//349 350//349 f 351//350 350//350 366//350 f 352//764 351//764 367//764 f 353//765 352//765 368//765 f 354//353 353//353 369//353 f 355//766 354//766 370//766 f 356//767 355//767 371//767 f 357//356 356//356 372//356 f 372//357 373//357 358//357 f 373//768 374//768 359//768 f 374//769 375//769 360//769 f 375//770 361//770 346//770 f 376//771 377//771 362//771 f 377//772 378//772 363//772 f 378//773 379//773 364//773 f 379//364 380//364 365//364 f 366//774 365//774 381//774 f 367//775 366//775 382//775 f 368//776 367//776 383//776 f 369//368 368//368 384//368 f 370//777 369//777 385//777 f 371//778 370//778 386//778 f 372//371 371//371 387//371 f 387//372 388//372 373//372 f 388//779 389//779 374//779 f 389//374 390//374 375//374 f 390//780 376//780 361//780 f 391//781 392//781 377//781 f 392//782 393//782 378//782 f 393//378 394//378 379//378 f 394//379 395//379 380//379 f 381//380 380//380 396//380 f 382//381 381//381 397//381 f 383//783 382//783 398//783 f 384//784 383//784 399//784 f 385//785 384//785 400//785 f 400//385 401//385 386//385 f 401//386 402//386 387//386 f 402//387 403//387 388//387 f 403//388 404//388 389//388 f 404//389 405//389 390//389 f 405//786 391//786 376//786 f 406//787 407//787 392//787 f 407//788 408//788 393//788 f 408//789 409//789 394//789 f 395//394 394//394 410//394 f 396//395 395//395 411//395 f 397//790 396//790 412//790 f 398//791 397//791 413//791 f 399//398 398//398 414//398 f 400//792 399//792 415//792 f 401//793 400//793 416//793 f 402//794 401//794 417//794 f 417//402 418//402 403//402 f 418//403 419//403 404//403 f 419//795 420//795 405//795 f 420//796 406//796 391//796 f 421//797 422//797 407//797 f 422//798 423//798 408//798 f 423//799 424//799 409//799 f 424//409 425//409 410//409 f 411//410 410//410 426//410 f 412//800 411//800 427//800 f 413//801 412//801 428//801 f 414//413 413//413 429//413 f 415//802 414//802 430//802 f 416//803 415//803 431//803 f 417//416 416//416 432//416 f 432//417 433//417 418//417 f 433//804 434//804 419//804 f 434//805 435//805 420//805 f 435//806 421//806 406//806 f 436//421 437//421 422//421 f 437//807 438//807 423//807 f 424//808 423//808 439//808 f 425//424 424//424 440//424 f 426//425 425//425 441//425 f 427//426 426//426 442//426 f 428//809 427//809 443//809 f 429//428 428//428 444//428 f 430//810 429//810 445//810 f 431//430 430//430 446//430 f 432//811 431//811 447//811 f 447//432 448//432 433//432 f 448//812 449//812 434//812 f 449//813 450//813 435//813 f 450//435 436//435 421//435 f 451//436 452//436 437//436 f 452//814 453//814 438//814 f 453//438 454//438 439//438 f 454//439 455//439 440//439 f 441//815 440//815 456//815 f 442//816 441//816 457//816 f 443//817 442//817 458//817 f 444//443 443//443 459//443 f 445//818 444//818 460//818 f 446//819 445//819 461//819 f 461//820 462//820 447//820 f 448//447 447//447 463//447 f 463//448 464//448 449//448 f 450//821 449//821 465//821 f 465//450 451//450 436//450 f 452//451 451//451 467//451 f 453//822 452//822 468//822 f 468//453 469//453 454//453 f 455//823 454//823 470//823 f 456//455 455//455 471//455 f 471//824 472//824 457//824 f 472//825 473//825 458//825 f 473//458 474//458 459//458 f 474//826 475//826 460//826 f 475//827 476//827 461//827 f 476//461 477//461 462//461 f 463//828 462//828 478//828 f 464//463 463//463 479//463 f 465//829 464//829 480//829 f 451//465 465//465 466//465 f 467//466 466//466 482//466 f 468//830 467//830 483//830 f 469//468 468//468 484//468 f 470//469 469//469 485//469 f 485//470 486//470 471//470 f 486//831 487//831 472//831 f 487//472 488//472 473//472 f 488//473 489//473 474//473 f 489//474 490//474 475//474 f 490//832 491//832 476//832 f 477//476 476//476 492//476 f 478//477 477//477 493//477 f 479//478 478//478 494//478 f 480//833 479//833 495//833 f 466//480 480//480 481//480 f 482//834 481//834 497//834 f 483//482 482//482 498//482 f 484//483 483//483 499//483 f 485//484 484//484 500//484 f 486//835 485//835 501//835 f 501//836 502//836 487//836 f 502//837 503//837 488//837 f 503//488 504//488 489//488 f 504//838 505//838 490//838 f 505//839 506//839 491//839 f 506//840 507//840 492//840 f 493//492 492//492 508//492 f 494//841 493//841 509//841 f 495//494 494//494 510//494 f 481//495 495//495 496//495 f 497//842 496//842 512//842 f 498//497 497//497 513//497 f 499//498 498//498 514//498 f 500//499 499//499 515//499 f 515//500 516//500 501//500 f 516//843 517//843 502//843 f 517//844 518//844 503//844 f 518//503 519//503 504//503 f 519//845 520//845 505//845 f 506//846 505//846 521//846 f 507//506 506//506 522//506 f 522//507 523//507 508//507 f 509//508 508//508 524//508 f 510//509 509//509 525//509 f 496//847 510//847 511//847 f 512//848 511//848 527//848 f 513//512 512//512 528//512 f 514//513 513//513 529//513 f 515//849 514//849 530//849 f 530//515 531//515 516//515 f 531//516 532//516 517//516 f 532//850 533//850 518//850 f 533//518 534//518 519//518 f 534//851 535//851 520//851 f 535//852 536//852 521//852 f 536//521 537//521 522//521 f 523//522 522//522 538//522 f 524//523 523//523 539//523 f 525//524 524//524 540//524 f 511//525 525//525 526//525 f 527//853 526//853 542//853 f 528//854 527//854 543//854 f 529//855 528//855 544//855 f 544//529 545//529 530//529 f 531//530 530//530 546//530 f 532//531 531//531 547//531 f 547//532 548//532 533//532 f 548//533 549//533 534//533 f 549//856 550//856 535//856 f 550//535 551//535 536//535 f 551//536 552//536 537//536 f 538//537 537//537 553//537 f 539//857 538//857 554//857 f 540//858 539//858 555//858 f 526//859 540//859 541//859 f 542//860 541//860 557//860 f 543//861 542//861 558//861 f 544//862 543//862 559//862 f 545//544 544//544 560//544 f 560//863 561//863 546//863 f 561//546 562//546 547//546 f 562//547 563//547 548//547 f 563//548 564//548 549//548 f 564//549 565//549 550//549 f 565//550 566//550 551//550 f 566//864 567//864 552//864 f 553//552 552//552 568//552 f 554//865 553//865 569//865 f 555//866 554//866 570//866 f 541//867 555//867 556//867 f 557//868 556//868 572//868 f 558//557 557//557 573//557 f 559//558 558//558 574//558 f 560//559 559//559 575//559 f 575//869 576//869 561//869 f 576//561 577//561 562//561 f 577//870 578//870 563//870 f 578//563 579//563 564//563 f 579//871 580//871 565//871 f 580//872 581//872 566//872 f 567//873 566//873 582//873 f 568//567 567//567 583//567 f 569//568 568//568 584//568 f 570//569 569//569 585//569 f 556//874 570//874 571//874 f 572//571 571//571 587//571 f 573//875 572//875 588//875 f 574//573 573//573 589//573 f 575//574 574//574 590//574 f 590//876 591//876 576//876 f 591//877 592//877 577//877 f 592//878 593//878 578//878 f 593//578 594//578 579//578 f 594//879 595//879 580//879 f 595//880 596//880 581//880 f 596//581 597//581 582//581 f 583//582 582//582 598//582 f 584//583 583//583 599//583 f 585//881 584//881 600//881 f 571//585 585//585 586//585 f 587//882 586//882 2//882 f 588//883 587//883 3//883 f 589//588 588//588 4//588 f 590//589 589//589 5//589 f 5//590 6//590 591//590 f 6//884 7//884 592//884 f 7//885 8//885 593//885 f 8//593 9//593 594//593 f 9//886 10//886 595//886 f 10//887 11//887 596//887 f 11//596 12//596 597//596 f 598//597 597//597 13//597 f 599//598 598//598 14//598 f 600//599 599//599 15//599 f 586//888 600//888 1//888 opensurgsim-0.7.0/SurgSim/Testing/Data/Geometry/Torus.osgb000066400000000000000000002443021277777236100235630ustar00rootroot00000000000000¡‘lEEûd0 osg::Group›H torus.objÿÿÿÿqH osg::Geode_HTorusÿÿÿÿ9H osg::Geometry$H osg::StateSetûÎ osg::Materialµ Material.001€?€?iÈx=¿|R> ×#?€?iÈx=¿|R> ×#?€?333?333?333?€?333?333?333?€?€?€?¦›DA¦›DA95 þÿý÷ 5 O õ÷ö5 š üþý5 mnlJ 5 ©ª¨b 5 ûÿþý5 ¥¦§g 5 îïðò5 06875 › ÿ5 ÌÍË'5 ¾ ¦¨§5 ™ ûúù5 Ž_ 5 j $#"5 i ! 5 5  5 œ 5 lmnT5 „ FHG5 ~ ÒÔÓ5 012 5 ÙÚØ‚ 5 a ¥§¦5 ab`N5 ÒÓÔ†5 © €5 `abB 5  µ´³5 ‹ŒŠN 5 µ¶´j 5 8 hgf5 × ÇÉÈ5 opq; 5 æ äãâ5 î ðïî5 í ëíì5 ø 5 …†„L 5 ü 5 œ› 5  3545 lmn: 5  6875 decO5 ª«¬5 ]^_A 5 µ —™˜5 Ö×Õ‡5 ŽŒ5 V ˜—–5 Š‹‰5  5 u ÅÄÃ5 %&$ 5 çèé‹ 5 vwuQ 5 ’ òñð5 ÿ5 U 5 ¸¹·y5 òóñï 5 JZ\[5 Uqpo5 Zzyx5 ž Ÿ5 k›š™5 ÑÒÐÜ 5 > âáà5 q­¬«5 àáßí5 ÙÚÛë5 „ÎÍÌ5 ï qsr5 Š àßÞ5 ß [ZY5 n¤£¢5 ÿþL5 ´5 ¦ 5 ¢ø÷ö5 º5 ¹º¸Î5 P5 kljž 5 ÖDFE5 h ª©¨5 °±¯Ç5 STRŒ 5 ðhji5 LMNˆ 5 ötvu5 R zyx5 ¦§¥o5 NOM× 5 C ced5 S }|{5 _`aã 5 ’“‘³5 …†‡©5 <èçæ5 ;åäã5 @îíì5 ] 5 óóòñ5 <=;Ñ5 ñëíì5 V5 nopî 5 œ› 5 ÕÖÔ6 5 vBA@5 _`^5 "#!5 †TSR5 ¶·¸ 5 îâäã5 Æ®­¬5 –—˜j5 9:8Ð5 ïåçæ5 ]5 ðèêé5 ƒ„…û 5 Añðï5 ;<:t5 1×ÙØ5 d 5 e 5 !¿ÁÀ5 •–”´5 š›œ¶5 CDEƒ 5 ] ‰ˆ‡5 û~}5 c ™›š5  5 ,-.º 5 r º¼»5 † ÚÙØ5 !" ² 5 z{y§ 5 • óõô5 ¢  5   5 ’“‘³ 5 ¹ )+*5 øùúH5 çèé 5 }½¿¾5 ð tvu5 רÖÞ 5 ÂÃÁÓ 5 ÐÑÏ 5 ÇÈÆz 5 ÔÕÓÝ 5 5 ·¸¹q 5 . ÊÉÈ5 = ÝßÞ5 £¤¢f 5 Q ûýü5 —˜–b 5 ”•“a 5 Š‹Œ^ 5  5 3 ]_^5 ¹º»5   5 š fed5 <=> 5 ¯ Œ‹5 ´ ”–•5  DCB5 Ø ÊÌË5 ÏÐÑ…5 !#"5 HJI5 ß ÛÚÙ5 ijk9 5 ¿ ©«ª5 ÆÇÈ‚5 ­ ‡†…5 $&%5 f ®°¯5  ?>=5  5 €‚ü5 Phgf5 [{}|5 h’‘5 \~€5 opnô5 ÝÞÜì5 ·¸¶5 ª 5 äåæŒ 5 ¯°®r5 }~|¨ 5 tus£ 5 ‚ ÔÓÒ5 s ½¿¾5 e Ÿ¡ 5 ìbdc5 žòñð5 ž Ÿ5 &ÊÉÈ5 ¹5 ‚ƒ„¨5  5 T   5 675Ï5 [\]“ 5 ÌÍË/ 5 —gih5 ¦~}|5 ¨©§ 5 u?>=5 ‰Š‹ý 5 01/Ë5 ?@A75 klmí 5 231m5 £¢¡5 ABCÍ 5 ^5  °5  U5 ¬5 ¡ 5 ’”“5 †‡ˆü 5 áâã‹ 5 åæäŠ 5 rsqõ5 ' ?A@5 ` ’‘5 p ¶µ´5 ÂÃÄ"5 5  5 @NPO5 ÌÍÎ| 5 —˜™µ5  5 ~ :<;5 ð ôöõ5 vwu? 5 É ·¶µ5  5 †‡ˆ5 P øúù5 7 edc5 i•”“5 ÀÁÂ~5 §€5 £¤¢` 5 } ÏÑÐ5 ê\^]5 ÉÊ˃5  )('5 WXVÞ 5 þ ŽŒ5 €‚ú 5 f(*)5 ” ðòñ5 M ‡‰ˆ5 « 5 žœd 5 `a_ë5 Á%$#5 R ’‘5 PQRà5   5 Žg5  GFE5 ý   5 Y  5 1 MLK5 ˜jlk5 ¢ prq5 ® Љˆ5 –—•5 H îíì5 ¹ Ÿž5 ôõöô5 z{|ú5 !"# 5 lžœ5 ÿŸ 5 ‰ áãâ5 šêìë5 ©ª¨p5 %&'e5 ‹ŒŠf5 9GFE5 t .0/5 8DCB5 k ·¹¸5 i ­¬«5 9:; 5 ´µ³5 µ5 m¡ Ÿ5    5 453 5 ØÆÅÄ5 ¥{zy5 Ò>@?5 Vtsr5 ¤¥£½ 5À„ '()*+,-./0123459:;<=>HIJKLMQRSTUVWXY]^_ijkuvw‚ƒ„…†‡ˆ‰±²³´µ¶º»¼ÃÄÅØÙÚÛÜÝÞßàáâãäåæçèéíîïóôõùúûüýþÿ    !"&'()*+,-.234ABCGHIJKLMNOSTUVWXYZ[efgklmwxyƒ„…‘˜™š¤¥¦§¨©­®¯°±²¼½¾ÅÆÇÎÏÐÑÒÓÔÕÖÚÛÜÝÞßàáâéêëòóôõö÷ûüý  !"#$+,-./0456789CDEFGHIJKLMNOPQUVWXYZ[\]abcdefmnopqrstuvwxˆ‰Š‹ŒŽžŸ ¡¢£¤¥¦§¨©ª«²³´µ¶·»¼½¾¿ÀÁÂÃÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖר÷øùúûü  $%&*+,-./0126789:;<=>BCDEFGHIJNOPQRSTUVWXYZ[\fghijkopqrst~€‚ƒ„…†®¯°±²³ÀÁÂÃÄÅÉÊËÌÍÎÕÖ×ÛÜÝêëìíîïö÷øùúûüýþ   #$%&'(/0123456789:;<=>?@DEFGHIJKLPQRSTU\]^bcdefghijwxyz{|}~‘’“”•–—˜™š¡¢£¤¥¦ª«¬­®¯°±²¹º»¼½¾¿ÀÁÂÃÄÅÆÇÎÏÐÑÒÓרÙÚÛÜãäåæçèéêëïðñòóôþÿ   %&'()*+,-123456789@ABIJKOPQUVWXYZ^_`abcghimnovwx‚ƒ„Žš›œ ¡¢¬­®¯°±²³´¸¹º»¼½¾¿ÀÄÅÆÍÎÏÜÝÞßàáåæçèéê÷øùúûü  '()*+,-./?@AKLMNOPQRSTUVWXYZ[\`abrstxyz{|}~€‚ƒŽ“”•™š›œžŸ ¡«¬­±²³º»¼½¾¿ÀÁÂÆÇÈÉÊËÕÖ×ÛÜÝÞßàêëìíîïóôõö÷ø     !"#$%&'()*+,-./123456:;<=>?ABCDEFGHIKLMQRSWXY]^_`abcdestuvwxz{|€ˆ‰Š‹ŒŽ‘’“”•–—˜™›œŸ ¡£¤¥¦§¨©ª«­®¯±²³¶·¸»¼½¾¿ÀÂÃÄÅÆÇÈÉÊÌÍÎÓÔÕרÙÚÛÜÝÞßáâãäåæçèéíîïñòó÷øùýþÿ   #$%()*+,-./023456789:=>?BCDEFGIJKMNOQRSWXYZ[\_`abcdghijklnopqrswxyz{|}~€‚ƒ„…‡ˆ‰Š‹ŒŽ‘’“”•–™š›œžŸ ¡¢£¤ª«¬­®¯°±²·¸¹º»¼½¾¿ÀÁÂÃÄÅÈÉÊËÌÍÏÐÑÒÓÔÕÖ×ÙÚÛÜÝÞßàáâãäåæçèéêõö÷øùúüýþ                    ! " # $ % & ( ) * + , - . / 0 2 3 4 5 6 7 8 9 : ; < = > ? @ D E F G H I K L M N O P T U V W X Y Z [ \ j k l m n o t u v w x y { | } ~  € ƒ „ … ‡ ˆ ‰ Ž ‘ ’ “ – — ˜ ™ š › œ ž £ ¤ ¥ § ¨ © ¬ ­ ® ¯ ° ± ³ ´ µ ¶ · ¸ » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Î Ï Ð Ñ Ò Ó Ô Õ Ö Ø Ù Ú Û Ü Ý à á â ä å æ ç è é ê ë ì ñ ò ó ô õ ö ÷ ø ù ÿ                        ! " # $ % & ' ( ) * + , - 0 1 2 3 4 5 7 8 9 : ; < ? @ A B C D E F G I J K L M N R S T V W X Z [ \ ^ _ ` a b c f g h k l m n o p q r s u v w x y z { | } € ‚ … † ‡ ‰ Š ‹ Ž ‘ ’ ” • – — ˜ ™ › œ Ÿ   ¡ ¤ ¥ ¦ ª « ¬ ° ± ² ¶ · ¸ º » ¼ À Á Â Ã Ä Å Æ Ç È Ê Ë Ì Í Î Ï Ð Ñ Ò Ô Õ Ö Ù Ú Û à á â ã ä å ç è é ê ë ì ñ ò ó ô õ ö ù ú û þ ÿ                  ! " # $ % & ' ( ) * + , - . / 0 1 2 4 5 6 < = > @ A B C D E F G H I J K O P Q S T U W X Y Z [ \ ] ^ _ c d e g h i l m n o p q r s t v w x y z {  € ƒ „ … † ‡ ˆ Œ Ž ‘ “ ” • – — ˜ ž Ÿ ž‹  „‹€?€Ù|?0 > bw?í¹>³?Ð=wz?€³?Ð= bw?í¹>³?Ð=åîg?Zð>¯>>>Ój?€¯>>>åîg?Zð>¯>>>o+Q?Q„>hxs>ëÆS?€hxs>o+Q?Q„>hxs>[7?Séç=ݘ~>jO9?€Ý˜~>[7?Séç=ݘ~> ?€À³]> ?€À³]>³?°<È=À³]>9 ?€y>9 ?€y> ?$|¯=y>f?€âæT=f?€âæT=cœÿ>€ð¡=âæT=f?€âæT½f?€âæT½cœÿ>€ð¡=âæT½9 ?€y¾9 ?€y¾ ?$|¯=y¾ ?€À³]¾ ?€À³]¾³?°<È=À³]¾jO9?€Ý˜~¾jO9?€Ý˜~¾[7?Séç=ݘ~¾o+Q?Q„>hxs¾ëÆS?€hxs¾o+Q?Q„>hxs¾åîg?Zð>¯>>¾Ój?€¯>>¾åîg?Zð>¯>>¾ bw?í¹>³?н€?€wz?€³?н bw?í¹>³?нÙ|?0 >yxs?z7ž>P5n? Ìš>³?Ð= bw?í¹>³?Ð=P5n? Ìš>³?Ð=ÒT_?%!‘>¯>>>åîg?Zð>¯>>>ÒT_?%!‘>¯>>>iI?¹â‚>hxs>o+Q?Q„>hxs>iI?¹â‚>hxs>Š=0?4e>ݘ~>[7?Séç=ݘ~>Š=0?4e>ݘ~>³?°<È=À³]>³?°<È=À³]>A+?rÅE>À³]> ?$|¯=y> ?$|¯=y>!\?HS->y>cœÿ>€ð¡=âæT=cœÿ>€ð¡=âæT=u!ö>ò>âæT=cœÿ>€ð¡=âæT½cœÿ>€ð¡=âæT½u!ö>ò>âæT½ ?$|¯=y¾ ?$|¯=y¾!\?HS->y¾³?°<È=À³]¾³?°<È=À³]¾A+?rÅE>À³]¾[7?Séç=ݘ~¾[7?Séç=ݘ~¾Š=0?4e>ݘ~¾iI?¹â‚>hxs¾o+Q?Q„>hxs¾iI?¹â‚>hxs¾ÒT_?%!‘>¯>>¾åîg?Zð>¯>>¾ÒT_?%!‘>¯>>¾P5n? Ìš>³?н bw?í¹>³?нP5n? Ìš>³?нyxs?z7ž>yxs?z7ž> d?aqè>ñ*_?Lkã>³?Ð=P5n? Ìš>³?Ð=ñ*_?Lkã>³?Ð=ç:Q?]7Õ>¯>>>ÒT_?%!‘>¯>>>ç:Q?]7Õ>¯>>>ݱhxs>iI?¹â‚>hxs>ݱhxs>Ò%?B¨>ݘ~>Š=0?4e>ݘ~>Ò%?B¨>ݘ~>A+?rÅE>À³]>A+?rÅE>À³]>Ÿ?åF‘>À³]>!\?HS->y>!\?HS->y> áù>œ£~>y>u!ö>ò>âæT=u!ö>ò>âæT=—æ>ûj>âæT=u!ö>ò>âæT½u!ö>ò>âæT½—æ>ûj>âæT½!\?HS->y¾!\?HS->y¾ áù>œ£~>y¾A+?rÅE>À³]¾A+?rÅE>À³]¾Ÿ?åF‘>À³]¾Š=0?4e>ݘ~¾Š=0?4e>ݘ~¾Ò%?B¨>ݘ~¾Ý±hxs¾iI?¹â‚>hxs¾Ý±hxs¾ç:Q?]7Õ>¯>>¾ÒT_?%!‘>¯>>¾ç:Q?]7Õ>¯>>¾ñ*_?Lkã>³?нP5n? Ìš>³?нñ*_?Lkã>³?н d?aqè> d?aqè>½O?y?Ç¡J?‚8?³?Ð=ñ*_?Lkã>³?Ð=Ç¡J?‚8?³?Ð=ú=?¸ ?¯>>>ç:Q?]7Õ>¯>>>ú=?¸ ?¯>>>ÒT+?õø>hxs>ݱhxs>ÒT+?õø>hxs>Bë?bØÙ>ݘ~>Ò%?B¨>ݘ~>Bë?bØÙ>ݘ~>Ÿ?åF‘>À³]>Ÿ?åF‘>À³]>\q?e¼>À³]> áù>œ£~>y> áù>œ£~>y>¹ââ>Œ×¤>y>—æ>ûj>âæT=—æ>ûj>âæT=_Ñ>˜>âæT=—æ>ûj>âæT½—æ>ûj>âæT½_Ñ>˜>âæT½ áù>œ£~>y¾ áù>œ£~>y¾¹ââ>Œ×¤>y¾Ÿ?åF‘>À³]¾Ÿ?åF‘>À³]¾\q?e¼>À³]¾Bë?bØÙ>ݘ~¾Ò%?B¨>ݘ~¾Bë?bØÙ>ݘ~¾ÒT+?õø>hxs¾Ý±hxs¾ÒT+?õø>hxs¾ç:Q?]7Õ>¯>>¾ç:Q?]7Õ>¯>>¾ú=?¸ ?¯>>¾Ç¡J?‚8?³?нñ*_?Lkã>³?нǡJ?‚8?³?н½O?y?½O?y?÷5?÷5?a1?a1?³?Ð=Ç¡J?‚8?³?Ð=a1?a1?³?Ð=Ä &?Ä &?¯>>>ú=?¸ ?¯>>>Ä &?Ä &?¯>>>¾¿?¾¿?hxs>ÒT+?õø>hxs>¾¿?¾¿?hxs>¼?¼?ݘ~>Bë?bØÙ>ݘ~>¼?¼?ݘ~>\q?e¼>À³]>\q?e¼>À³]>9Fâ>9Fâ>À³]>'NÆ>'NÆ>y>¹ââ>Œ×¤>y>'NÆ>'NÆ>y>_Ñ>˜>âæT=_Ñ>˜>âæT=;ÿ¶>;ÿ¶>âæT=_Ñ>˜>âæT½_Ñ>˜>âæT½;ÿ¶>;ÿ¶>âæT½¹ââ>Œ×¤>y¾¹ââ>Œ×¤>y¾'NÆ>'NÆ>y¾\q?e¼>À³]¾\q?e¼>À³]¾9Fâ>9Fâ>À³]¾Bë?bØÙ>ݘ~¾Bë?bØÙ>ݘ~¾¼?¼?ݘ~¾¾¿?¾¿?hxs¾ÒT+?õø>hxs¾¾¿?¾¿?hxs¾Ä &?Ä &?¯>>¾ú=?¸ ?¯>>¾Ä &?Ä &?¯>>¾a1?a1?³?нǡJ?‚8?³?нa1?a1?³?н÷5?÷5?÷5?÷5?y?½O?‚8?Ç¡J?³?Ð=a1?a1?³?Ð=‚8?Ç¡J?³?Ð=¸ ?ú=?¯>>>Ä &?Ä &?¯>>>¸ ?ú=?¯>>>õø>ÒT+?hxs>¾¿?¾¿?hxs>õø>ÒT+?hxs>bØÙ>Bë?ݘ~>¼?¼?ݘ~>bØÙ>Bë?ݘ~>9Fâ>9Fâ>À³]>9Fâ>9Fâ>À³]>e¼>\q?À³]>'NÆ>'NÆ>y>'NÆ>'NÆ>y>Œ×¤>¹ââ>y>;ÿ¶>;ÿ¶>âæT=;ÿ¶>;ÿ¶>âæT=˜>_Ñ>âæT=;ÿ¶>;ÿ¶>âæT½;ÿ¶>;ÿ¶>âæT½˜>_Ñ>âæT½'NÆ>'NÆ>y¾'NÆ>'NÆ>y¾Œ×¤>¹ââ>y¾9Fâ>9Fâ>À³]¾9Fâ>9Fâ>À³]¾e¼>\q?À³]¾¼?¼?ݘ~¾¼?¼?ݘ~¾bØÙ>Bë?ݘ~¾õø>ÒT+?hxs¾¾¿?¾¿?hxs¾õø>ÒT+?hxs¾¸ ?ú=?¯>>¾Ä &?Ä &?¯>>¾¸ ?ú=?¯>>¾‚8?Ç¡J?³?нa1?a1?³?н‚8?Ç¡J?³?нy?½O?y?½O?‚qè>ød?Lkã>à*_?³?Ð=‚8?Ç¡J?³?Ð=Lkã>à*_?³?Ð=]7Õ>ç:Q?¯>>>¸ ?ú=?¯>>>]7Õ>ç:Q?¯>>>0JÀ>ݱõø>ÒT+?hxs>0JÀ>ݱB¨>Ò%?ݘ~>bØÙ>Bë?ݘ~>B¨>Ò%?ݘ~>e¼>\q?À³]>e¼>\q?À³]>åF‘>Ÿ?À³]>Œ×¤>¹ââ>y>Œ×¤>¹ââ>y>ߣ~> áù>y>˜>_Ñ>âæT=˜>_Ñ>âæT=Âûj>—æ>âæT=˜>_Ñ>âæT½˜>_Ñ>âæT½Âûj>—æ>âæT½Œ×¤>¹ââ>y¾Œ×¤>¹ââ>y¾ß£~> áù>y¾e¼>\q?À³]¾e¼>\q?À³]¾åF‘>Ÿ?À³]¾bØÙ>Bë?ݘ~¾bØÙ>Bë?ݘ~¾B¨>Ò%?ݘ~¾0JÀ>ݱÒT+?hxs¾0JÀ>ݱç:Q?¯>>¾¸ ?ú=?¯>>¾]7Õ>ç:Q?¯>>¾Lkã>à*_?³?н‚8?Ç¡J?³?нLkã>à*_?³?н‚qè>ød?‚qè>ød?z7ž>hxs? Ìš>P5n?³?Ð=Lkã>à*_?³?Ð= Ìš>P5n?³?Ð=%!‘>ÒT_?¯>>>]7Õ>ç:Q?¯>>>%!‘>ÒT_?¯>>>¹â‚>niI?hxs>0JÀ>ݱ¹â‚>niI?hxs>xe>Š=0?ݘ~>B¨>Ò%?ݘ~>xe>Š=0?ݘ~>åF‘>Ÿ?À³]>åF‘>Ÿ?À³]>rÅE>A+?À³]>ߣ~> áù>y>ߣ~> áù>y>HS->!\?y>Âûj>—æ>âæT=Âûj>—æ>âæT=ò>u!ö>âæT=Âûj>—æ>âæT½Âûj>—æ>âæT½ò>u!ö>âæT½ß£~> áù>y¾ß£~> áù>y¾HS->!\?y¾åF‘>Ÿ?À³]¾åF‘>Ÿ?À³]¾rÅE>A+?À³]¾xe>Š=0?ݘ~¾B¨>Ò%?ݘ~¾xe>Š=0?ݘ~¾¹â‚>niI?hxs¾0JÀ>ݱniI?hxs¾%!‘>ÒT_?¯>>¾]7Õ>ç:Q?¯>>¾%!‘>ÒT_?¯>>¾ Ìš>P5n?³?нLkã>à*_?³?н Ìš>P5n?³?нz7ž>hxs?z7ž>hxs?0 >Ù|?í¹> bw?³?Ð= Ìš>P5n?³?Ð=í¹> bw?³?Ð=Zð>åîg?¯>>>%!‘>ÒT_?¯>>>Zð>åîg?¯>>>Q„>o+Q?hxs>¹â‚>niI?hxs>Q„>o+Q?hxs>Séç=[7?ݘ~>xe>Š=0?ݘ~>Séç=[7?ݘ~>°<È=³?À³]>rÅE>A+?À³]>°<È=³?À³]>HS->!\?y>HS->!\?y>$|¯= ?y>ò>u!ö>âæT=ò>u!ö>âæT=€ð¡=cœÿ>âæT=ò>u!ö>âæT½ò>u!ö>âæT½€ð¡=cœÿ>âæT½HS->!\?y¾HS->!\?y¾$|¯= ?y¾rÅE>A+?À³]¾rÅE>A+?À³]¾°<È=³?À³]¾xe>Š=0?ݘ~¾xe>Š=0?ݘ~¾Séç=[7?ݘ~¾Q„>o+Q?hxs¾¹â‚>niI?hxs¾Q„>o+Q?hxs¾Zð>åîg?¯>>¾%!‘>ÒT_?¯>>¾Zð>åîg?¯>>¾í¹> bw?³?н Ìš>P5n?³?нí¹> bw?³?н0 >Ù|?0 >Ù|?€?wz?³?Ð=í¹> bw?³?Ð=wz?³?Ð=Ój?¯>>>Zð>åîg?¯>>>Ój?¯>>>ëÆS?hxs>Q„>o+Q?hxs>ëÆS?hxs>jO9?ݘ~>Séç=[7?ݘ~>jO9?ݘ~>°<È=³?À³]>°<È=³?À³]> ?À³]>$|¯= ?y>$|¯= ?y>9 ?y>€ð¡=cœÿ>âæT=€ð¡=cœÿ>âæT=f?âæT=€ð¡=cœÿ>âæT½€ð¡=cœÿ>âæT½f?âæT½$|¯= ?y¾$|¯= ?y¾9 ?y¾°<È=³?À³]¾°<È=³?À³]¾ ?À³]¾jO9?ݘ~¾Séç=[7?ݘ~¾jO9?ݘ~¾ëÆS?hxs¾Q„>o+Q?hxs¾ëÆS?hxs¾Zð>åîg?¯>>¾Zð>åîg?¯>>¾Ój?¯>>¾wz?³?нí¹> bw?³?нwz?³?н€?€?<0 ¾Ù|?wz?³?Ð=wz?³?Ð=í¹¾ bw?³?Ð=Zð¾åîg?¯>>>Ój?¯>>>Zð¾åîg?¯>>>ëÆS?hxs>ëÆS?hxs>Q„¾o+Q?hxs>Séç½[7?ݘ~>jO9?ݘ~>Séç½[7?ݘ~> ?À³]> ?À³]>°<Ƚ³?À³]>$|¯½ ?y>9 ?y>$|¯½ ?y>€ð¡½cœÿ>âæT=f?âæT=€ð¡½cœÿ>âæT=€ð¡½cœÿ>âæT½f?âæT½€ð¡½cœÿ>âæT½$|¯½ ?y¾9 ?y¾$|¯½ ?y¾°<Ƚ³?À³]¾ ?À³]¾°<Ƚ³?À³]¾Séç½[7?ݘ~¾jO9?ݘ~¾Séç½[7?ݘ~¾ëÆS?hxs¾ëÆS?hxs¾Q„¾o+Q?hxs¾Ój?¯>>¾Ój?¯>>¾Zð¾åîg?¯>>¾wz?³?нwz?³?нí¹¾ bw?³?н€?<0 ¾Ù|?z7ž¾yxs?í¹¾ bw?³?Ð=í¹¾ bw?³?Ð= Ìš¾P5n?³?Ð=Zð¾åîg?¯>>>Zð¾åîg?¯>>>%!‘¾ÒT_?¯>>>Q„¾o+Q?hxs>Q„¾o+Q?hxs>¹â‚¾iI?hxs>Séç½[7?ݘ~>Séç½[7?ݘ~>4e¾Š=0?ݘ~>rÅE¾A+?À³]>°<Ƚ³?À³]>rÅE¾A+?À³]>HS-¾!\?y>$|¯½ ?y>HS-¾!\?y>ò¾u!ö>âæT=€ð¡½cœÿ>âæT=ò¾u!ö>âæT=ò¾u!ö>âæT½€ð¡½cœÿ>âæT½ò¾u!ö>âæT½HS-¾!\?y¾$|¯½ ?y¾HS-¾!\?y¾rÅE¾A+?À³]¾°<Ƚ³?À³]¾rÅE¾A+?À³]¾4e¾Š=0?ݘ~¾Séç½[7?ݘ~¾4e¾Š=0?ݘ~¾¹â‚¾iI?hxs¾Q„¾o+Q?hxs¾¹â‚¾iI?hxs¾%!‘¾ÒT_?¯>>¾Zð¾åîg?¯>>¾%!‘¾ÒT_?¯>>¾í¹¾ bw?³?нí¹¾ bw?³?н Ìš¾P5n?³?н<0 ¾Ù|?z7ž¾yxs?‚qè¾ød? Ìš¾P5n?³?Ð= Ìš¾P5n?³?Ð=Lkã¾ñ*_?³?Ð=%!‘¾ÒT_?¯>>>%!‘¾ÒT_?¯>>>]7Õ¾ç:Q?¯>>>¹â‚¾iI?hxs>¹â‚¾iI?hxs>0JÀ¾Ý±4e¾Š=0?ݘ~>4e¾Š=0?ݘ~>B¨¾Ò%?ݘ~>åF‘¾Ÿ?À³]>rÅE¾A+?À³]>åF‘¾Ÿ?À³]>œ£~¾ áù>y>HS-¾!\?y>œ£~¾ áù>y>Âûj¾—æ>âæT=ò¾u!ö>âæT=Âûj¾—æ>âæT=Âûj¾—æ>âæT½ò¾u!ö>âæT½Âûj¾—æ>âæT½œ£~¾ áù>y¾HS-¾!\?y¾œ£~¾ áù>y¾åF‘¾Ÿ?À³]¾rÅE¾A+?À³]¾åF‘¾Ÿ?À³]¾B¨¾Ò%?ݘ~¾4e¾Š=0?ݘ~¾B¨¾Ò%?ݘ~¾¹â‚¾iI?hxs¾¹â‚¾iI?hxs¾0JÀ¾Ý±>¾%!‘¾ÒT_?¯>>¾]7Õ¾ç:Q?¯>>¾ Ìš¾P5n?³?н Ìš¾P5n?³?нLkã¾ñ*_?³?нz7ž¾yxs?‚qè¾ød?y¿½O?Lkã¾ñ*_?³?Ð=Lkã¾ñ*_?³?Ð=‚8¿Ç¡J?³?Ð=]7Õ¾ç:Q?¯>>>]7Õ¾ç:Q?¯>>>¸ ¿ú=?¯>>>0JÀ¾Ý±0JÀ¾Ý±õø¾ÒT+?hxs>B¨¾Ò%?ݘ~>B¨¾Ò%?ݘ~>bØÙ¾Bë?ݘ~>e¼¾\q?À³]>åF‘¾Ÿ?À³]>e¼¾\q?À³]>Œ×¤¾¹ââ>y>œ£~¾ áù>y>Œ×¤¾¹ââ>y>˜¾_Ñ>âæT=Âûj¾—æ>âæT=˜¾_Ñ>âæT=˜¾_Ñ>âæT½Âûj¾—æ>âæT½˜¾_Ñ>âæT½Œ×¤¾¹ââ>y¾œ£~¾ áù>y¾Œ×¤¾¹ââ>y¾e¼¾\q?À³]¾åF‘¾Ÿ?À³]¾e¼¾\q?À³]¾bØÙ¾Bë?ݘ~¾B¨¾Ò%?ݘ~¾bØÙ¾Bë?ݘ~¾õø¾ÒT+?hxs¾0JÀ¾Ý±>¾]7Õ¾ç:Q?¯>>¾¸ ¿ú=?¯>>¾Lkã¾ñ*_?³?нLkã¾ñ*_?³?н‚8¿Ç¡J?³?н‚qè¾ød?y¿½O?÷5¿÷5?‚8¿Ç¡J?³?Ð=‚8¿Ç¡J?³?Ð=a1¿P1?³?Ð=¸ ¿ú=?¯>>>¸ ¿ú=?¯>>>Ä &¿Ä &?¯>>>õø¾ÒT+?hxs>õø¾ÒT+?hxs>¾¿¿¾¿?hxs>bØÙ¾Bë?ݘ~>bØÙ¾Bë?ݘ~>¼¿¼?ݘ~>e¼¾\q?À³]>e¼¾\q?À³]>9Fâ¾9Fâ>À³]>Œ×¤¾¹ââ>y>Œ×¤¾¹ââ>y>'Nƾ'NÆ>y>;ÿ¶¾;ÿ¶>âæT=˜¾_Ñ>âæT=;ÿ¶¾;ÿ¶>âæT=;ÿ¶¾;ÿ¶>âæT½˜¾_Ñ>âæT½;ÿ¶¾;ÿ¶>âæT½'Nƾ'NÆ>y¾Œ×¤¾¹ââ>y¾'Nƾ'NÆ>y¾9Fâ¾9Fâ>À³]¾e¼¾\q?À³]¾9Fâ¾9Fâ>À³]¾¼¿¼?ݘ~¾bØÙ¾Bë?ݘ~¾¼¿¼?ݘ~¾õø¾ÒT+?hxs¾õø¾ÒT+?hxs¾¾¿¿¾¿?hxs¾¸ ¿ú=?¯>>¾¸ ¿ú=?¯>>¾Ä &¿Ä &?¯>>¾‚8¿Ç¡J?³?н‚8¿Ç¡J?³?нa1¿P1?³?нy¿½O?÷5¿÷5?½O¿y?a1¿P1?³?Ð=a1¿P1?³?Ð=Ç¡J¿‚8?³?Ð=Ä &¿Ä &?¯>>>Ä &¿Ä &?¯>>>ú=¿¸ ?¯>>>¾¿¿¾¿?hxs>¾¿¿¾¿?hxs>ÒT+¿õø>hxs>¼¿¼?ݘ~>¼¿¼?ݘ~>Së¿bØÙ>ݘ~>\q¿e¼>À³]>9Fâ¾9Fâ>À³]>\q¿e¼>À³]>¹â⾌פ>y>'Nƾ'NÆ>y>¹â⾌פ>y>_Ѿ˜>âæT=;ÿ¶¾;ÿ¶>âæT=_Ѿ˜>âæT=_Ѿ˜>âæT½;ÿ¶¾;ÿ¶>âæT½_Ѿ˜>âæT½¹â⾌פ>y¾'Nƾ'NÆ>y¾¹â⾌פ>y¾\q¿e¼>À³]¾9Fâ¾9Fâ>À³]¾\q¿e¼>À³]¾Së¿bØÙ>ݘ~¾¼¿¼?ݘ~¾Së¿bØÙ>ݘ~¾¾¿¿¾¿?hxs¾¾¿¿¾¿?hxs¾ÒT+¿õø>hxs¾Ä &¿Ä &?¯>>¾Ä &¿Ä &?¯>>¾ú=¿¸ ?¯>>¾a1¿P1?³?нa1¿P1?³?нǡJ¿‚8?³?н÷5¿÷5?½O¿y?ød¿‚qè>Ç¡J¿‚8?³?Ð=Ç¡J¿‚8?³?Ð=ñ*_¿Lkã>³?Ð=ú=¿¸ ?¯>>>ú=¿¸ ?¯>>>ç:Q¿]7Õ>¯>>>ÒT+¿õø>hxs>ÒT+¿õø>hxs>ݱ<¿0JÀ>hxs>Së¿bØÙ>ݘ~>Së¿bØÙ>ݘ~>Ò%¿B¨>ݘ~>Ÿ¿åF‘>À³]>\q¿e¼>À³]>Ÿ¿åF‘>À³]> áù¾œ£~>y>¹â⾌פ>y> áù¾œ£~>y>—æ¾ûj>âæT=_Ѿ˜>âæT=—æ¾ûj>âæT=—æ¾ûj>âæT½_Ѿ˜>âæT½—æ¾ûj>âæT½ áù¾œ£~>y¾¹â⾌פ>y¾ áù¾œ£~>y¾Ÿ¿åF‘>À³]¾\q¿e¼>À³]¾Ÿ¿åF‘>À³]¾Së¿bØÙ>ݘ~¾Së¿bØÙ>ݘ~¾Ò%¿B¨>ݘ~¾ÒT+¿õø>hxs¾ÒT+¿õø>hxs¾Ý±<¿0JÀ>hxs¾ú=¿¸ ?¯>>¾ú=¿¸ ?¯>>¾ç:Q¿]7Õ>¯>>¾Ç¡J¿‚8?³?нǡJ¿‚8?³?нñ*_¿Lkã>³?н½O¿y?ød¿‚qè>yxs¿z7ž>ñ*_¿Lkã>³?Ð=ñ*_¿Lkã>³?Ð=P5n¿ Ìš>³?Ð=ç:Q¿]7Õ>¯>>>ç:Q¿]7Õ>¯>>>ÒT_¿%!‘>¯>>>ݱ<¿0JÀ>hxs>ݱ<¿0JÀ>hxs>iI¿¹â‚>hxs>Ò%¿B¨>ݘ~>Ò%¿B¨>ݘ~>Š=0¿xe> ™~>A+¿rÅE>À³]>Ÿ¿åF‘>À³]>A+¿rÅE>À³]>!\¿HS->y> áù¾œ£~>y>!\¿HS->y>u!ö¾ò>âæT=—æ¾ûj>âæT=u!ö¾ò>âæT=u!ö¾ò>âæT½—æ¾ûj>âæT½u!ö¾ò>âæT½!\¿HS->y¾ áù¾œ£~>y¾!\¿HS->y¾A+¿rÅE>À³]¾Ÿ¿åF‘>À³]¾A+¿rÅE>À³]¾Š=0¿xe> ™~¾Ò%¿B¨>ݘ~¾Š=0¿xe> ™~¾Ý±<¿0JÀ>hxs¾Ý±<¿0JÀ>hxs¾iI¿¹â‚>hxs¾ç:Q¿]7Õ>¯>>¾ç:Q¿]7Õ>¯>>¾ÒT_¿%!‘>¯>>¾ñ*_¿Lkã>³?нñ*_¿Lkã>³?нP5n¿ Ìš>³?нød¿‚qè>yxs¿z7ž>Ù|¿<0 >P5n¿ Ìš>³?Ð=P5n¿ Ìš>³?Ð= bw¿í¹>³?Ð=ÒT_¿%!‘>¯>>>ÒT_¿%!‘>¯>>>åîg¿Zð>¯>>>o+Q¿Q„>hxs>iI¿¹â‚>hxs>o+Q¿Q„>hxs>[7¿Séç=ݘ~>Š=0¿xe> ™~>[7¿Séç=ݘ~>A+¿rÅE>À³]>A+¿rÅE>À³]>³¿°<È=À³]>!\¿HS->y>!\¿HS->y> ¿$|¯=y>cœÿ¾€ð¡=âæT=u!ö¾ò>âæT=cœÿ¾€ð¡=âæT=cœÿ¾€ð¡=âæT½u!ö¾ò>âæT½cœÿ¾€ð¡=âæT½ ¿$|¯=y¾!\¿HS->y¾ ¿$|¯=y¾³¿°<È=À³]¾A+¿rÅE>À³]¾³¿°<È=À³]¾[7¿Séç=ݘ~¾Š=0¿xe> ™~¾[7¿Séç=ݘ~¾iI¿¹â‚>hxs¾iI¿¹â‚>hxs¾o+Q¿Q„>hxs¾ÒT_¿%!‘>¯>>¾ÒT_¿%!‘>¯>>¾åîg¿Zð>¯>>¾P5n¿ Ìš>³?нP5n¿ Ìš>³?н bw¿í¹>³?нyxs¿z7ž>Ù|¿<0 >€¿ bw¿í¹>³?Ð= bw¿í¹>³?Ð=wz¿³?Ð=åîg¿Zð>¯>>>åîg¿Zð>¯>>>Ój¿¯>>>o+Q¿Q„>hxs>o+Q¿Q„>hxs>ëÆS¿hxs>[7¿Séç=ݘ~>[7¿Séç=ݘ~>jO9¿Ý˜~> ¿À³]>³¿°<È=À³]> ¿À³]>9 ¿y> ¿$|¯=y>9 ¿y>f¿âæT=cœÿ¾€ð¡=âæT=f¿âæT=f¿âæT½cœÿ¾€ð¡=âæT½f¿âæT½9 ¿y¾ ¿$|¯=y¾9 ¿y¾³¿°<È=À³]¾³¿°<È=À³]¾ ¿À³]¾jO9¿Ý˜~¾[7¿Séç=ݘ~¾jO9¿Ý˜~¾o+Q¿Q„>hxs¾o+Q¿Q„>hxs¾ëÆS¿hxs¾åîg¿Zð>¯>>¾åîg¿Zð>¯>>¾Ój¿¯>>¾ bw¿í¹>³?н bw¿í¹>³?нwz¿³?нÙ|¿<0 >€¿Ù|¿<0 ¾wz¿³?Ð=wz¿³?Ð= bw¿í¹¾³?Ð=Ój¿¯>>>Ój¿¯>>>åîg¿ð¾¯>>>ëÆS¿hxs>ëÆS¿hxs>o+Q¿Q„¾hxs>jO9¿Ý˜~>jO9¿Ý˜~>[7¿Séç½Ý˜~>³¿)<ȽÀ³]> ¿À³]>³¿)<ȽÀ³]> ¿$|¯½y>9 ¿y> ¿$|¯½y>cœÿ¾€ð¡½âæT=f¿âæT=cœÿ¾€ð¡½âæT=cœÿ¾€ð¡½âæT½f¿âæT½cœÿ¾€ð¡½âæT½ ¿$|¯½y¾9 ¿y¾ ¿$|¯½y¾³¿)<ȽÀ³]¾ ¿À³]¾³¿)<ȽÀ³]¾[7¿Séç½Ý˜~¾jO9¿Ý˜~¾[7¿Séç½Ý˜~¾ëÆS¿hxs¾ëÆS¿hxs¾o+Q¿Q„¾hxs¾Ój¿¯>>¾Ój¿¯>>¾åîg¿ð¾¯>>¾wz¿³?нwz¿³?н bw¿í¹¾³?н€¿Ù|¿<0 ¾yxs¿z7ž¾ bw¿í¹¾³?Ð= bw¿í¹¾³?Ð=P5n¿ Ìš¾³?Ð=åîg¿ð¾¯>>>åîg¿ð¾¯>>>ÒT_¿%!‘¾¯>>>o+Q¿Q„¾hxs>o+Q¿Q„¾hxs>iI¿—₾hxs>Š=0¿4e¾Ý˜~>[7¿Séç½Ý˜~>Š=0¿4e¾Ý˜~>A+¿.ÅE¾À³]>³¿)<ȽÀ³]>A+¿.ÅE¾À³]>!\¿HS-¾y> ¿$|¯½y>!\¿HS-¾y>u!ö¾Øñ¾âæT=cœÿ¾€ð¡½âæT=u!ö¾Øñ¾âæT=u!ö¾Øñ¾âæT½cœÿ¾€ð¡½âæT½u!ö¾Øñ¾âæT½!\¿HS-¾y¾ ¿$|¯½y¾!\¿HS-¾y¾A+¿.ÅE¾À³]¾³¿)<ȽÀ³]¾A+¿.ÅE¾À³]¾Š=0¿4e¾Ý˜~¾[7¿Séç½Ý˜~¾Š=0¿4e¾Ý˜~¾o+Q¿Q„¾hxs¾o+Q¿Q„¾hxs¾iI¿—₾hxs¾åîg¿ð¾¯>>¾åîg¿ð¾¯>>¾ÒT_¿%!‘¾¯>>¾ bw¿í¹¾³?н bw¿í¹¾³?нP5n¿ Ìš¾³?нÙ|¿<0 ¾yxs¿z7ž¾ d¿aqè¾P5n¿ Ìš¾³?Ð=P5n¿ Ìš¾³?Ð=ñ*_¿Lkã¾³?Ð=ÒT_¿%!‘¾¯>>>ÒT_¿%!‘¾¯>>>ç:Q¿;7Õ¾¯>>>iI¿—₾hxs>iI¿—₾hxs>ݱ<¿JÀ¾hxs>Š=0¿4e¾Ý˜~>Š=0¿4e¾Ý˜~>Ò%¿B¨¾Ý˜~>Ÿ¿åF‘¾À³]>A+¿.ÅE¾À³]>Ÿ¿åF‘¾À³]> áù¾œ£~¾y>!\¿HS-¾y> áù¾œ£~¾y>—æ¾ûj¾âæT=u!ö¾Øñ¾âæT=—æ¾ûj¾âæT=—æ¾ûj¾âæT½u!ö¾Øñ¾âæT½—æ¾ûj¾âæT½ áù¾œ£~¾y¾!\¿HS-¾y¾ áù¾œ£~¾y¾Ÿ¿åF‘¾À³]¾A+¿.ÅE¾À³]¾Ÿ¿åF‘¾À³]¾Ò%¿B¨¾Ý˜~¾Š=0¿4e¾Ý˜~¾Ò%¿B¨¾Ý˜~¾iI¿—₾hxs¾iI¿—₾hxs¾Ý±<¿JÀ¾hxs¾ÒT_¿%!‘¾¯>>¾ÒT_¿%!‘¾¯>>¾ç:Q¿;7Õ¾¯>>¾P5n¿ Ìš¾³?нP5n¿ Ìš¾³?нñ*_¿Lkã¾³?нyxs¿z7ž¾ d¿aqè¾½O¿y¿ñ*_¿Lkã¾³?Ð=ñ*_¿Lkã¾³?Ð=Ç¡J¿‚8¿³?Ð=ç:Q¿;7Õ¾¯>>>ç:Q¿;7Õ¾¯>>>ú=¿¸ ¿¯>>>ݱ<¿JÀ¾hxs>ݱ<¿JÀ¾hxs>ÒT+¿õø¾hxs>Ò%¿B¨¾Ý˜~>Ò%¿B¨¾Ý˜~>Së¿bØÙ¾Ý˜~>\q¿e¼¾À³]>Ÿ¿åF‘¾À³]>\q¿e¼¾À³]>¹â⾌פ¾y> áù¾œ£~¾y>¹â⾌פ¾y>_Ѿ˜¾âæT=—æ¾ûj¾âæT=_Ѿ˜¾âæT=_Ѿ˜¾âæT½—æ¾ûj¾âæT½_Ѿ˜¾âæT½¹â⾌פ¾y¾ áù¾œ£~¾y¾¹â⾌פ¾y¾\q¿e¼¾À³]¾Ÿ¿åF‘¾À³]¾\q¿e¼¾À³]¾Së¿bØÙ¾Ý˜~¾Ò%¿B¨¾Ý˜~¾Së¿bØÙ¾Ý˜~¾Ý±<¿JÀ¾hxs¾Ý±<¿JÀ¾hxs¾ÒT+¿õø¾hxs¾ç:Q¿;7Õ¾¯>>¾ç:Q¿;7Õ¾¯>>¾ú=¿¸ ¿¯>>¾ñ*_¿Lkã¾³?нñ*_¿Lkã¾³?нǡJ¿‚8¿³?н d¿aqè¾½O¿y¿÷5¿÷5¿Ç¡J¿‚8¿³?Ð=Ç¡J¿‚8¿³?Ð=a1¿P1¿³?Ð=ú=¿¸ ¿¯>>>ú=¿¸ ¿¯>>>Ä &¿Ä &¿¯>>>ÒT+¿õø¾hxs>ÒT+¿õø¾hxs>¾¿¿¾¿¿hxs>Së¿bØÙ¾Ý˜~>Së¿bØÙ¾Ý˜~>¼¿¼¿Ý˜~>9Fâ¾9Fâ¾À³]>\q¿e¼¾À³]>9Fâ¾9Fâ¾À³]>'Nƾ'Nƾy>¹â⾌פ¾y>'Nƾ'Nƾy>;ÿ¶¾;ÿ¶¾âæT=_Ѿ˜¾âæT=;ÿ¶¾;ÿ¶¾âæT=;ÿ¶¾;ÿ¶¾âæT½_Ѿ˜¾âæT½;ÿ¶¾;ÿ¶¾âæT½'Nƾ'Nƾy¾¹â⾌פ¾y¾'Nƾ'Nƾy¾9Fâ¾9Fâ¾À³]¾\q¿e¼¾À³]¾9Fâ¾9Fâ¾À³]¾¼¿¼¿Ý˜~¾Së¿bØÙ¾Ý˜~¾¼¿¼¿Ý˜~¾ÒT+¿õø¾hxs¾ÒT+¿õø¾hxs¾¾¿¿¾¿¿hxs¾ú=¿¸ ¿¯>>¾ú=¿¸ ¿¯>>¾Ä &¿Ä &¿¯>>¾Ç¡J¿‚8¿³?нǡJ¿‚8¿³?нa1¿P1¿³?н½O¿y¿÷5¿÷5¿y¿½O¿a1¿P1¿³?Ð=a1¿P1¿³?Ð=‚8¿Ç¡J¿³?Ð=Ä &¿Ä &¿¯>>>Ä &¿Ä &¿¯>>>¸ ¿ú=¿¯>>>¾¿¿¾¿¿hxs>¾¿¿¾¿¿hxs>õø¾ÒT+¿hxs>¼¿¼¿Ý˜~>¼¿¼¿Ý˜~>bØÙ¾Bë¿Ý˜~>e¼¾\q¿À³]>9Fâ¾9Fâ¾À³]>e¼¾\q¿À³]>Œ×¤¾¹ââ¾y>'Nƾ'Nƾy>Œ×¤¾¹ââ¾y>˜¾_ѾâæT=;ÿ¶¾;ÿ¶¾âæT=˜¾_ѾâæT=˜¾_ѾâæT½;ÿ¶¾;ÿ¶¾âæT½˜¾_ѾâæT½Œ×¤¾¹ââ¾y¾'Nƾ'Nƾy¾Œ×¤¾¹ââ¾y¾9Fâ¾9Fâ¾À³]¾9Fâ¾9Fâ¾À³]¾e¼¾\q¿À³]¾¼¿¼¿Ý˜~¾¼¿¼¿Ý˜~¾bØÙ¾Bë¿Ý˜~¾¾¿¿¾¿¿hxs¾¾¿¿¾¿¿hxs¾õø¾ÒT+¿hxs¾Ä &¿Ä &¿¯>>¾Ä &¿Ä &¿¯>>¾¸ ¿ú=¿¯>>¾a1¿P1¿³?нa1¿P1¿³?н‚8¿Ç¡J¿³?н÷5¿÷5¿y¿½O¿‚qè¾ød¿‚8¿Ç¡J¿³?Ð=‚8¿Ç¡J¿³?Ð=Lkã¾ñ*_¿³?Ð=¸ ¿ú=¿¯>>>¸ ¿ú=¿¯>>>]7Õ¾ç:Q¿¯>>>õø¾ÒT+¿hxs>õø¾ÒT+¿hxs>0JÀ¾Ý±<¿hxs>B¨¾Ò%¿Ý˜~>bØÙ¾Bë¿Ý˜~>B¨¾Ò%¿Ý˜~>åF‘¾Ÿ¿À³]>e¼¾\q¿À³]>åF‘¾Ÿ¿À³]>œ£~¾ áù¾y>Œ×¤¾¹ââ¾y>œ£~¾ áù¾y>Âûj¾—æ¾âæT=˜¾_ѾâæT=Âûj¾—æ¾âæT=Âûj¾—æ¾âæT½˜¾_ѾâæT½Âûj¾—æ¾âæT½œ£~¾ áù¾y¾Œ×¤¾¹ââ¾y¾œ£~¾ áù¾y¾åF‘¾Ÿ¿À³]¾e¼¾\q¿À³]¾åF‘¾Ÿ¿À³]¾B¨¾Ò%¿Ý˜~¾bØÙ¾Bë¿Ý˜~¾B¨¾Ò%¿Ý˜~¾õø¾ÒT+¿hxs¾õø¾ÒT+¿hxs¾0JÀ¾Ý±<¿hxs¾¸ ¿ú=¿¯>>¾¸ ¿ú=¿¯>>¾]7Õ¾ç:Q¿¯>>¾‚8¿Ç¡J¿³?н‚8¿Ç¡J¿³?нLkã¾ñ*_¿³?нy¿½O¿‚qè¾ød¿z7ž¾yxs¿Lkã¾ñ*_¿³?Ð=Lkã¾ñ*_¿³?Ð= Ìš¾P5n¿³?Ð=]7Õ¾ç:Q¿¯>>>]7Õ¾ç:Q¿¯>>>%!‘¾ÒT_¿¯>>>0JÀ¾Ý±<¿hxs>0JÀ¾Ý±<¿hxs>¹â‚¾iI¿hxs>B¨¾Ò%¿Ý˜~>B¨¾Ò%¿Ý˜~>4e¾Š=0¿Ý˜~>rÅE¾A+¿À³]>åF‘¾Ÿ¿À³]>rÅE¾A+¿À³]>HS-¾!\¿y>œ£~¾ áù¾y>HS-¾!\¿y>ò¾u!ö¾âæT=Âûj¾—æ¾âæT=ò¾u!ö¾âæT=ò¾u!ö¾âæT½Âûj¾—æ¾âæT½ò¾u!ö¾âæT½HS-¾!\¿y¾œ£~¾ áù¾y¾HS-¾!\¿y¾rÅE¾A+¿À³]¾åF‘¾Ÿ¿À³]¾rÅE¾A+¿À³]¾4e¾Š=0¿Ý˜~¾B¨¾Ò%¿Ý˜~¾4e¾Š=0¿Ý˜~¾0JÀ¾Ý±<¿hxs¾0JÀ¾Ý±<¿hxs¾¹â‚¾iI¿hxs¾]7Õ¾ç:Q¿¯>>¾]7Õ¾ç:Q¿¯>>¾%!‘¾ÒT_¿¯>>¾Lkã¾ñ*_¿³?нLkã¾ñ*_¿³?н Ìš¾P5n¿³?н‚qè¾ød¿z7ž¾yxs¿<0 ¾Ù|¿ Ìš¾P5n¿³?Ð= Ìš¾P5n¿³?Ð=í¹¾ bw¿³?Ð=%!‘¾ÒT_¿¯>>>%!‘¾ÒT_¿¯>>>Zð¾åîg¿¯>>>Q„¾o+Q¿hxs>¹â‚¾iI¿hxs>Q„¾o+Q¿hxs>Séç½[7¿Ý˜~>4e¾Š=0¿Ý˜~>Séç½[7¿Ý˜~>°<Ƚ³¿À³]>rÅE¾A+¿À³]>°<Ƚ³¿À³]>$|¯½ ¿y>HS-¾!\¿y>$|¯½ ¿y>€ð¡½cœÿ¾âæT=ò¾u!ö¾âæT=€ð¡½cœÿ¾âæT=€ð¡½cœÿ¾âæT½ò¾u!ö¾âæT½€ð¡½cœÿ¾âæT½$|¯½ ¿y¾HS-¾!\¿y¾$|¯½ ¿y¾°<Ƚ³¿À³]¾rÅE¾A+¿À³]¾°<Ƚ³¿À³]¾Séç½[7¿Ý˜~¾4e¾Š=0¿Ý˜~¾Séç½[7¿Ý˜~¾¹â‚¾iI¿hxs¾¹â‚¾iI¿hxs¾Q„¾o+Q¿hxs¾%!‘¾ÒT_¿¯>>¾%!‘¾ÒT_¿¯>>¾Zð¾åîg¿¯>>¾ Ìš¾P5n¿³?н Ìš¾P5n¿³?нí¹¾ bw¿³?нz7ž¾yxs¿<0 ¾Ù|¿€¿í¹¾ bw¿³?Ð=í¹¾ bw¿³?Ð=wz¿³?Ð=Zð¾åîg¿¯>>>Zð¾åîg¿¯>>>Ój¿¯>>>Q„¾o+Q¿hxs>Q„¾o+Q¿hxs>ëÆS¿hxs>Séç½[7¿Ý˜~>Séç½[7¿Ý˜~>jO9¿Ý˜~> ¿À³]>°<Ƚ³¿À³]> ¿À³]>9 ¿y>$|¯½ ¿y>9 ¿y>f¿âæT=€ð¡½cœÿ¾âæT=f¿âæT=f¿âæT½€ð¡½cœÿ¾âæT½f¿âæT½9 ¿y¾$|¯½ ¿y¾9 ¿y¾ ¿À³]¾°<Ƚ³¿À³]¾ ¿À³]¾Séç½[7¿Ý˜~¾Séç½[7¿Ý˜~¾jO9¿Ý˜~¾ëÆS¿hxs¾Q„¾o+Q¿hxs¾ëÆS¿hxs¾Zð¾åîg¿¯>>¾Zð¾åîg¿¯>>¾Ój¿¯>>¾wz¿³?нí¹¾ bw¿³?нwz¿³?н<0 ¾Ù|¿€¿0 >Ù|¿í¹> bw¿³?Ð=wz¿³?Ð=í¹> bw¿³?Ð=Zð>åîg¿¯>>>Ój¿¯>>>Zð>åîg¿¯>>>ëÆS¿hxs>ëÆS¿hxs>Q„>o+Q¿hxs>Séç=[7¿Ý˜~>jO9¿Ý˜~>Séç=[7¿Ý˜~>°<È=³¿À³]> ¿À³]>°<È=³¿À³]>9 ¿y>9 ¿y>$|¯= ¿y>f¿âæT=f¿âæT=€ð¡=cœÿ¾âæT=f¿âæT½f¿âæT½€ð¡=cœÿ¾âæT½9 ¿y¾9 ¿y¾$|¯= ¿y¾ ¿À³]¾ ¿À³]¾°<È=³¿À³]¾jO9¿Ý˜~¾jO9¿Ý˜~¾Séç=[7¿Ý˜~¾Q„>o+Q¿hxs¾ëÆS¿hxs¾Q„>o+Q¿hxs¾Zð>åîg¿¯>>¾Ój¿¯>>¾Zð>åîg¿¯>>¾í¹> bw¿³?нwz¿³?нí¹> bw¿³?н0 >Ù|¿0 >Ù|¿z7ž>hxs¿ Ìš>P5n¿³?Ð=í¹> bw¿³?Ð= Ìš>P5n¿³?Ð=%!‘>ÒT_¿¯>>>Zð>åîg¿¯>>>%!‘>ÒT_¿¯>>>¹â‚>niI¿hxs>Q„>o+Q¿hxs>¹â‚>niI¿hxs>xe>Š=0¿Ý˜~>Séç=[7¿Ý˜~>xe>Š=0¿Ý˜~>°<È=³¿À³]>°<È=³¿À³]>rÅE>A+¿À³]>$|¯= ¿y>$|¯= ¿y>HS->!\¿y>€ð¡=cœÿ¾âæT=€ð¡=cœÿ¾âæT=ò>u!ö¾âæT=€ð¡=cœÿ¾âæT½€ð¡=cœÿ¾âæT½ò>u!ö¾âæT½$|¯= ¿y¾$|¯= ¿y¾HS->!\¿y¾°<È=³¿À³]¾°<È=³¿À³]¾rÅE>A+¿À³]¾xe>Š=0¿Ý˜~¾Séç=[7¿Ý˜~¾xe>Š=0¿Ý˜~¾¹â‚>niI¿hxs¾Q„>o+Q¿hxs¾¹â‚>niI¿hxs¾%!‘>ÒT_¿¯>>¾Zð>åîg¿¯>>¾%!‘>ÒT_¿¯>>¾ Ìš>P5n¿³?нí¹> bw¿³?н Ìš>P5n¿³?нz7ž>hxs¿z7ž>hxs¿‚qè>ød¿Lkã>à*_¿³?Ð= Ìš>P5n¿³?Ð=Lkã>à*_¿³?Ð=]7Õ>ç:Q¿¯>>>%!‘>ÒT_¿¯>>>]7Õ>ç:Q¿¯>>>0JÀ>ݱ<¿hxs>¹â‚>niI¿hxs>0JÀ>ݱ<¿hxs>B¨>Ò%¿Ý˜~>xe>Š=0¿Ý˜~>B¨>Ò%¿Ý˜~>åF‘>Ÿ¿À³]>rÅE>A+¿À³]>åF‘>Ÿ¿À³]>HS->!\¿y>HS->!\¿y>ߣ~> áù¾y>ò>u!ö¾âæT=ò>u!ö¾âæT=Âûj>—æ¾âæT=ò>u!ö¾âæT½ò>u!ö¾âæT½Âûj>—æ¾âæT½HS->!\¿y¾HS->!\¿y¾ß£~> áù¾y¾rÅE>A+¿À³]¾rÅE>A+¿À³]¾åF‘>Ÿ¿À³]¾xe>Š=0¿Ý˜~¾xe>Š=0¿Ý˜~¾B¨>Ò%¿Ý˜~¾0JÀ>ݱ<¿hxs¾¹â‚>niI¿hxs¾0JÀ>ݱ<¿hxs¾]7Õ>ç:Q¿¯>>¾%!‘>ÒT_¿¯>>¾]7Õ>ç:Q¿¯>>¾Lkã>à*_¿³?н Ìš>P5n¿³?нLkã>à*_¿³?н‚qè>ød¿‚qè>ød¿y?½O¿‚8?סJ¿³?Ð=Lkã>à*_¿³?Ð=‚8?סJ¿³?Ð=¸ ?"ú=¿¯>>>]7Õ>ç:Q¿¯>>>¸ ?"ú=¿¯>>>^õø>ÒT+¿hxs>0JÀ>ݱ<¿hxs>^õø>ÒT+¿hxs>bØÙ>Së¿Ý˜~>B¨>Ò%¿Ý˜~>bØÙ>Së¿Ý˜~>åF‘>Ÿ¿À³]>åF‘>Ÿ¿À³]>D¼>\q¿À³]>ߣ~> áù¾y>ߣ~> áù¾y>Œ×¤>¹ââ¾y>Âûj>—æ¾âæT=Âûj>—æ¾âæT=˜>_ѾâæT=Âûj>—æ¾âæT½Âûj>—æ¾âæT½˜>_ѾâæT½ß£~> áù¾y¾ß£~> áù¾y¾Œ×¤>¹ââ¾y¾D¼>\q¿À³]¾åF‘>Ÿ¿À³]¾D¼>\q¿À³]¾bØÙ>Së¿Ý˜~¾B¨>Ò%¿Ý˜~¾bØÙ>Së¿Ý˜~¾0JÀ>ݱ<¿hxs¾0JÀ>ݱ<¿hxs¾^õø>ÒT+¿hxs¾¸ ?"ú=¿¯>>¾]7Õ>ç:Q¿¯>>¾¸ ?"ú=¿¯>>¾‚8?סJ¿³?нLkã>à*_¿³?н‚8?סJ¿³?нy?½O¿y?½O¿æ5?÷5¿P1?a1¿³?Ð=‚8?סJ¿³?Ð=P1?a1¿³?Ð=³ &?Ä &¿¯>>>¸ ?"ú=¿¯>>>³ &?Ä &¿¯>>>¾¿?¾¿¿hxs>^õø>ÒT+¿hxs>¾¿?¾¿¿hxs>¼?¼¿Ý˜~>bØÙ>Së¿Ý˜~>¼?¼¿Ý˜~>D¼>\q¿À³]>D¼>\q¿À³]>Fâ>9Fâ¾À³]>Œ×¤>¹ââ¾y>Œ×¤>¹ââ¾y>'NÆ>'Nƾy>˜>_ѾâæT=˜>_ѾâæT=;ÿ¶>\ÿ¶¾âæT=˜>_ѾâæT½˜>_ѾâæT½;ÿ¶>\ÿ¶¾âæT½Œ×¤>¹ââ¾y¾Œ×¤>¹ââ¾y¾'NÆ>'Nƾy¾D¼>\q¿À³]¾D¼>\q¿À³]¾Fâ>9Fâ¾À³]¾bØÙ>Së¿Ý˜~¾bØÙ>Së¿Ý˜~¾¼?¼¿Ý˜~¾¾¿?¾¿¿hxs¾^õø>ÒT+¿hxs¾¾¿?¾¿¿hxs¾³ &?Ä &¿¯>>¾¸ ?"ú=¿¯>>¾³ &?Ä &¿¯>>¾P1?a1¿³?н‚8?סJ¿³?нP1?a1¿³?нæ5?÷5¿æ5?÷5¿½O?%y¿Ç¡J?‚8¿³?Ð=P1?a1¿³?Ð=Ç¡J?‚8¿³?Ð=ú=?È ¿¯>>>³ &?Ä &¿¯>>>ú=?È ¿¯>>>ÁT+?õø¾hxs>¾¿?¾¿¿hxs>ÁT+?õø¾hxs>¼?¼¿Ý˜~>¼?¼¿Ý˜~>Bë?bØÙ¾Ý˜~>Lq?e¼¾À³]>Fâ>9Fâ¾À³]>Lq?e¼¾À³]>—ââ>Œ×¤¾y>'NÆ>'Nƾy>—ââ>Œ×¤¾y>;ÿ¶>\ÿ¶¾âæT=;ÿ¶>\ÿ¶¾âæT=_Ñ>˜¾âæT=;ÿ¶>\ÿ¶¾âæT½;ÿ¶>\ÿ¶¾âæT½_Ñ>˜¾âæT½'NÆ>'Nƾy¾'NÆ>'Nƾy¾—ââ>Œ×¤¾y¾Fâ>9Fâ¾À³]¾Fâ>9Fâ¾À³]¾Lq?e¼¾À³]¾¼?¼¿Ý˜~¾¼?¼¿Ý˜~¾Bë?bØÙ¾Ý˜~¾ÁT+?õø¾hxs¾¾¿?¾¿¿hxs¾ÁT+?õø¾hxs¾ú=?È ¿¯>>¾³ &?Ä &¿¯>>¾ú=?È ¿¯>>¾Ç¡J?‚8¿³?нP1?a1¿³?нǡJ?‚8¿³?н½O?%y¿½O?%y¿ød?‚qè¾à*_?Lkã¾³?Ð=Ç¡J?‚8¿³?Ð=à*_?Lkã¾³?Ð=ç:Q?]7Õ¾¯>>>ú=?È ¿¯>>>ç:Q?]7Õ¾¯>>>ݱÁT+?õø¾hxs>ݱÒ%?B¨¾Ý˜~>Bë?bØÙ¾Ý˜~>Ò%?B¨¾Ý˜~>Lq?e¼¾À³]>Lq?e¼¾À³]>Ÿ?åF‘¾À³]>—ââ>Œ×¤¾y>—ââ>Œ×¤¾y> áù>ߣ~¾y>_Ñ>˜¾âæT=_Ñ>˜¾âæT=—æ>Âûj¾âæT=_Ñ>˜¾âæT½_Ñ>˜¾âæT½—æ>Âûj¾âæT½—ââ>Œ×¤¾y¾—ââ>Œ×¤¾y¾ áù>ߣ~¾y¾Lq?e¼¾À³]¾Lq?e¼¾À³]¾Ÿ?åF‘¾À³]¾Bë?bØÙ¾Ý˜~¾Bë?bØÙ¾Ý˜~¾Ò%?B¨¾Ý˜~¾Ý±>¾ú=?È ¿¯>>¾ç:Q?]7Õ¾¯>>¾à*_?Lkã¾³?нǡJ?‚8¿³?нà*_?Lkã¾³?нød?‚qè¾ød?‚qè¾hxs?z7ž¾P5n? Ìš¾³?Ð=à*_?Lkã¾³?Ð=P5n? Ìš¾³?Ð=ÒT_?%!‘¾¯>>>ç:Q?]7Õ¾¯>>>ÒT_?%!‘¾¯>>>niI?¹â‚¾hxs>ݱniI?¹â‚¾hxs>Š=0?xe¾Ý˜~>Ò%?B¨¾Ý˜~>Š=0?xe¾Ý˜~>Ÿ?åF‘¾À³]>Ÿ?åF‘¾À³]>A+?rÅE¾À³]> áù>ߣ~¾y> áù>ߣ~¾y>!\?HS-¾y>—æ>Âûj¾âæT=—æ>Âûj¾âæT=u!ö>ò¾âæT=—æ>Âûj¾âæT½—æ>Âûj¾âæT½u!ö>ò¾âæT½ áù>ߣ~¾y¾ áù>ߣ~¾y¾!\?HS-¾y¾Ÿ?åF‘¾À³]¾Ÿ?åF‘¾À³]¾A+?rÅE¾À³]¾Š=0?xe¾Ý˜~¾Ò%?B¨¾Ý˜~¾Š=0?xe¾Ý˜~¾niI?¹â‚¾hxs¾Ý±>¾ç:Q?]7Õ¾¯>>¾ÒT_?%!‘¾¯>>¾P5n? Ìš¾³?нà*_?Lkã¾³?нP5n? Ìš¾³?нhxs?z7ž¾hxs?z7ž¾Ù|?0 ¾ bw?0º¾³?Ð=P5n? Ìš¾³?Ð= bw?0º¾³?Ð=åîg?Zð¾¯>>>ÒT_?%!‘¾¯>>>åîg?Zð¾¯>>>o+Q?Q„¾hxs>niI?¹â‚¾hxs>o+Q?Q„¾hxs>[7?Séç½Ý˜~>Š=0?xe¾Ý˜~>[7?Séç½Ý˜~>A+?rÅE¾À³]>A+?rÅE¾À³]>³?°<ȽÀ³]>!\?HS-¾y>!\?HS-¾y> ?$|¯½y>u!ö>ò¾âæT=u!ö>ò¾âæT=cœÿ>€ð¡½âæT=u!ö>ò¾âæT½u!ö>ò¾âæT½cœÿ>€ð¡½âæT½!\?HS-¾y¾!\?HS-¾y¾ ?$|¯½y¾A+?rÅE¾À³]¾A+?rÅE¾À³]¾³?°<ȽÀ³]¾Š=0?xe¾Ý˜~¾Š=0?xe¾Ý˜~¾[7?Séç½Ý˜~¾o+Q?Q„¾hxs¾niI?¹â‚¾hxs¾o+Q?Q„¾hxs¾åîg?Zð¾¯>>¾ÒT_?%!‘¾¯>>¾åîg?Zð¾¯>>¾ bw?0º¾³?нP5n? Ìš¾³?н bw?0º¾³?нÙ|?0 ¾Ù|?0 ¾€?€wz?€³?Ð= bw?0º¾³?Ð=wz?€³?Ð=Ój?€¯>>>åîg?Zð¾¯>>>Ój?€¯>>>ëÆS?€hxs>o+Q?Q„¾hxs>ëÆS?€hxs>jO9?€Ý˜~>[7?Séç½Ý˜~>jO9?€Ý˜~>³?°<ȽÀ³]>³?°<ȽÀ³]> ?€À³]> ?$|¯½y> ?$|¯½y>9 ?€y>cœÿ>€ð¡½âæT=cœÿ>€ð¡½âæT=f?€âæT=cœÿ>€ð¡½âæT½cœÿ>€ð¡½âæT½f?€âæT½ ?$|¯½y¾ ?$|¯½y¾9 ?€y¾³?°<ȽÀ³]¾³?°<ȽÀ³]¾ ?€À³]¾[7?Séç½Ý˜~¾[7?Séç½Ý˜~¾jO9?€Ý˜~¾ëÆS?€hxs¾o+Q?Q„¾hxs¾ëÆS?€hxs¾Ój?€¯>>¾åîg?Zð¾¯>>¾Ój?€¯>>¾wz?€³?н bw?0º¾³?нwz?€³?н€?€wz?€³?Ð=€?€ bw?í¹>³?Ð=Ój?€¯>>>wz?€³?Ð=åîg?Zð>¯>>>ëÆS?€hxs>jO9?€Ý˜~>³?°<È=À³]>³?°<È=À³]> ?$|¯=y>9 ?€y> ?$|¯=y>cœÿ>€ð¡=âæT=f?€âæT=cœÿ>€ð¡=âæT½cœÿ>€ð¡=âæT½ ?$|¯=y¾9 ?€y¾ ?$|¯=y¾³?°<È=À³]¾ ?€À³]¾[7?Séç=ݘ~¾ëÆS?€hxs¾Ój?€¯>>¾wz?€³?нÓj?€¯>>¾ bw?í¹>³?нÙ|?0 >€?€ bw?í¹>³?н bw?í¹>³?Ð=Ù|?0 >P5n? Ìš>³?Ð=åîg?Zð>¯>>> bw?í¹>³?Ð=ÒT_?%!‘>¯>>>o+Q?Q„>hxs>åîg?Zð>¯>>>iI?¹â‚>hxs>[7?Séç=ݘ~>Š=0?4e>ݘ~>A+?rÅE>À³]>³?°<È=À³]>A+?rÅE>À³]>!\?HS->y> ?$|¯=y>u!ö>ò>âæT=u!ö>ò>âæT½!\?HS->y¾!\?HS->y¾A+?rÅE>À³]¾³?°<È=À³]¾A+?rÅE>À³]¾Š=0?4e>ݘ~¾[7?Séç=ݘ~¾o+Q?Q„>hxs¾åîg?Zð>¯>>¾o+Q?Q„>hxs¾ÒT_?%!‘>¯>>¾ bw?í¹>³?нåîg?Zð>¯>>¾P5n? Ìš>³?нÙ|?0 > bw?í¹>³?нyxs?z7ž>P5n? Ìš>³?Ð=ÒT_?%!‘>¯>>>P5n? Ìš>³?Ð=ç:Q?]7Õ>¯>>>iI?¹â‚>hxs>Š=0?4e>ݘ~>Ÿ?åF‘>À³]>Ÿ?åF‘>À³]> áù>œ£~>y>!\?HS->y>—æ>ûj>âæT=—æ>ûj>âæT½ áù>œ£~>y¾ áù>œ£~>y¾Ÿ?åF‘>À³]¾A+?rÅE>À³]¾Ò%?B¨>ݘ~¾iI?¹â‚>hxs¾ÒT_?%!‘>¯>>¾P5n? Ìš>³?нÒT_?%!‘>¯>>¾ñ*_?Lkã>³?нyxs?z7ž>P5n? Ìš>³?н d?aqè>ñ*_?Lkã>³?Ð= d?aqè>Ç¡J?‚8?³?Ð=ç:Q?]7Õ>¯>>>ݱhxs>Ò%?B¨>ݘ~>\q?e¼>À³]>¹ââ>Œ×¤>y>_Ñ>˜>âæT=_Ñ>˜>âæT½¹ââ>Œ×¤>y¾\q?e¼>À³]¾Ò%?B¨>ݘ~¾Ý±hxs¾ú=?¸ ?¯>>¾ñ*_?Lkã>³?н d?aqè>ñ*_?Lkã>³?н½O?y?Ç¡J?‚8?³?Ð=½O?y?a1?a1?³?Ð=ú=?¸ ?¯>>>ÒT+?õø>hxs>ú=?¸ ?¯>>>¾¿?¾¿?hxs>Bë?bØÙ>ݘ~>9Fâ>9Fâ>À³]>¹ââ>Œ×¤>y>\q?e¼>À³]>'NÆ>'NÆ>y>;ÿ¶>;ÿ¶>âæT=;ÿ¶>;ÿ¶>âæT½'NÆ>'NÆ>y¾9Fâ>9Fâ>À³]¾¼?¼?ݘ~¾ÒT+?õø>hxs¾ú=?¸ ?¯>>¾ÒT+?õø>hxs¾Ä &?Ä &?¯>>¾Ç¡J?‚8?³?нú=?¸ ?¯>>¾a1?a1?³?н½O?y?Ç¡J?‚8?³?н÷5?÷5?a1?a1?³?Ð=÷5?÷5?‚8?Ç¡J?³?Ð=Ä &?Ä &?¯>>>a1?a1?³?Ð=¸ ?ú=?¯>>>¾¿?¾¿?hxs>Ä &?Ä &?¯>>>õø>ÒT+?hxs>¼?¼?ݘ~>bØÙ>Bë?ݘ~>e¼>\q?À³]>9Fâ>9Fâ>À³]>Œ×¤>¹ââ>y>Œ×¤>¹ââ>y>˜>_Ñ>âæT=;ÿ¶>;ÿ¶>âæT=˜>_Ñ>âæT½˜>_Ñ>âæT½Œ×¤>¹ââ>y¾'NÆ>'NÆ>y¾Œ×¤>¹ââ>y¾e¼>\q?À³]¾9Fâ>9Fâ>À³]¾e¼>\q?À³]¾bØÙ>Bë?ݘ~¾¼?¼?ݘ~¾¾¿?¾¿?hxs¾Ä &?Ä &?¯>>¾¾¿?¾¿?hxs¾¸ ?ú=?¯>>¾a1?a1?³?н÷5?÷5?a1?a1?³?нy?½O?‚8?Ç¡J?³?Ð=¸ ?ú=?¯>>>õø>ÒT+?hxs>¸ ?ú=?¯>>>0JÀ>ݱbØÙ>Bë?ݘ~>åF‘>Ÿ?À³]>åF‘>Ÿ?À³]>ߣ~> áù>y>Œ×¤>¹ââ>y>ߣ~> áù>y>Âûj>—æ>âæT=˜>_Ñ>âæT=Âûj>—æ>âæT½Âûj>—æ>âæT½ß£~> áù>y¾Œ×¤>¹ââ>y¾ß£~> áù>y¾åF‘>Ÿ?À³]¾e¼>\q?À³]¾åF‘>Ÿ?À³]¾B¨>Ò%?ݘ~¾bØÙ>Bë?ݘ~¾õø>ÒT+?hxs¾¸ ?ú=?¯>>¾õø>ÒT+?hxs¾]7Õ>ç:Q?¯>>¾‚8?Ç¡J?³?нy?½O?Lkã>à*_?³?Ð=]7Õ>ç:Q?¯>>>0JÀ>ݱ]7Õ>ç:Q?¯>>>¹â‚>niI?hxs>B¨>Ò%?ݘ~>xe>Š=0?ݘ~>rÅE>A+?À³]>åF‘>Ÿ?À³]>rÅE>A+?À³]>HS->!\?y>ߣ~> áù>y>HS->!\?y>ò>u!ö>âæT=Âûj>—æ>âæT=ò>u!ö>âæT½ò>u!ö>âæT½HS->!\?y¾ß£~> áù>y¾HS->!\?y¾rÅE>A+?À³]¾åF‘>Ÿ?À³]¾B¨>Ò%?ݘ~¾åF‘>Ÿ?À³]¾xe>Š=0?ݘ~¾0JÀ>ݱç:Q?¯>>¾Lkã>à*_?³?н‚qè>ød?Lkã>à*_?³?нz7ž>hxs? Ìš>P5n?³?Ð=%!‘>ÒT_?¯>>> Ìš>P5n?³?Ð=Zð>åîg?¯>>>¹â‚>niI?hxs>xe>Š=0?ݘ~>rÅE>A+?À³]>°<È=³?À³]>$|¯= ?y>HS->!\?y>€ð¡=cœÿ>âæT=€ð¡=cœÿ>âæT½$|¯= ?y¾$|¯= ?y¾°<È=³?À³]¾rÅE>A+?À³]¾Séç=[7?ݘ~¾¹â‚>niI?hxs¾%!‘>ÒT_?¯>>¾ Ìš>P5n?³?н%!‘>ÒT_?¯>>¾í¹> bw?³?нz7ž>hxs?í¹> bw?³?Ð=Zð>åîg?¯>>>í¹> bw?³?Ð=Ój?¯>>>Q„>o+Q?hxs>Séç=[7?ݘ~> ?À³]> ?À³]>9 ?y>$|¯= ?y>9 ?y>f?âæT=€ð¡=cœÿ>âæT=f?âæT½f?âæT½9 ?y¾$|¯= ?y¾9 ?y¾ ?À³]¾°<È=³?À³]¾Séç=[7?ݘ~¾Q„>o+Q?hxs¾Ój?¯>>¾í¹> bw?³?нZð>åîg?¯>>¾wz?³?н0 >Ù|?í¹¾ bw?³?Ð=Ój?¯>>>wz?³?Ð=Zð¾åîg?¯>>>Q„¾o+Q?hxs>jO9?ݘ~>Séç½[7?ݘ~>°<Ƚ³?À³]> ?À³]>9 ?y> ?À³]>$|¯½ ?y>f?âæT=9 ?y>€ð¡½cœÿ>âæT=f?âæT½9 ?y¾f?âæT½$|¯½ ?y¾ ?À³]¾9 ?y¾°<Ƚ³?À³]¾jO9?ݘ~¾ ?À³]¾Séç½[7?ݘ~¾Q„¾o+Q?hxs¾Zð¾åîg?¯>>¾Zð¾åîg?¯>>¾í¹¾ bw?³?нwz?³?н<0 ¾Ù|? Ìš¾P5n?³?Ð= Ìš¾P5n?³?Ð=%!‘¾ÒT_?¯>>>Zð¾åîg?¯>>>%!‘¾ÒT_?¯>>>¹â‚¾iI?hxs>Q„¾o+Q?hxs>4e¾Š=0?ݘ~>°<Ƚ³?À³]>Séç½[7?ݘ~>rÅE¾A+?À³]>$|¯½ ?y>€ð¡½cœÿ>âæT=$|¯½ ?y>ò¾u!ö>âæT=€ð¡½cœÿ>âæT½$|¯½ ?y¾€ð¡½cœÿ>âæT½HS-¾!\?y¾°<Ƚ³?À³]¾Séç½[7?ݘ~¾Q„¾o+Q?hxs¾Zð¾åîg?¯>>¾Q„¾o+Q?hxs¾%!‘¾ÒT_?¯>>¾%!‘¾ÒT_?¯>>¾ Ìš¾P5n?³?нí¹¾ bw?³?нz7ž¾yxs?Lkã¾ñ*_?³?Ð=Lkã¾ñ*_?³?Ð=]7Õ¾ç:Q?¯>>>%!‘¾ÒT_?¯>>>]7Õ¾ç:Q?¯>>>0JÀ¾Ý±¹â‚¾iI?hxs>B¨¾Ò%?ݘ~>rÅE¾A+?À³]>HS-¾!\?y>rÅE¾A+?À³]>œ£~¾ áù>y>ò¾u!ö>âæT=HS-¾!\?y>Âûj¾—æ>âæT=ò¾u!ö>âæT½HS-¾!\?y¾ò¾u!ö>âæT½œ£~¾ áù>y¾rÅE¾A+?À³]¾HS-¾!\?y¾åF‘¾Ÿ?À³]¾4e¾Š=0?ݘ~¾0JÀ¾Ý±>¾]7Õ¾ç:Q?¯>>¾Lkã¾ñ*_?³?н Ìš¾P5n?³?нLkã¾ñ*_?³?н‚qè¾ød?z7ž¾yxs?y¿½O?‚8¿Ç¡J?³?Ð=Lkã¾ñ*_?³?Ð=‚8¿Ç¡J?³?Ð=¸ ¿ú=?¯>>>]7Õ¾ç:Q?¯>>>¸ ¿ú=?¯>>>õø¾ÒT+?hxs>0JÀ¾Ý±bØÙ¾Bë?ݘ~>åF‘¾Ÿ?À³]>B¨¾Ò%?ݘ~>e¼¾\q?À³]>œ£~¾ áù>y>åF‘¾Ÿ?À³]>Œ×¤¾¹ââ>y>Âûj¾—æ>âæT=œ£~¾ áù>y>˜¾_Ñ>âæT=Âûj¾—æ>âæT½œ£~¾ áù>y¾Âûj¾—æ>âæT½Œ×¤¾¹ââ>y¾åF‘¾Ÿ?À³]¾œ£~¾ áù>y¾e¼¾\q?À³]¾B¨¾Ò%?ݘ~¾0JÀ¾Ý±>¾]7Õ¾ç:Q?¯>>¾¸ ¿ú=?¯>>¾‚8¿Ç¡J?³?нLkã¾ñ*_?³?н‚8¿Ç¡J?³?нy¿½O?‚qè¾ød?÷5¿÷5?a1¿P1?³?Ð=‚8¿Ç¡J?³?Ð=Ä &¿Ä &?¯>>>¾¿¿¾¿?hxs>¼¿¼?ݘ~>9Fâ¾9Fâ>À³]>'Nƾ'NÆ>y>˜¾_Ñ>âæT=Œ×¤¾¹ââ>y>;ÿ¶¾;ÿ¶>âæT=˜¾_Ñ>âæT½˜¾_Ñ>âæT=;ÿ¶¾;ÿ¶>âæT½Œ×¤¾¹ââ>y¾˜¾_Ñ>âæT½'Nƾ'NÆ>y¾e¼¾\q?À³]¾bØÙ¾Bë?ݘ~¾¾¿¿¾¿?hxs¾Ä &¿Ä &?¯>>¾Ä &¿Ä &?¯>>¾a1¿P1?³?н‚8¿Ç¡J?³?нa1¿P1?³?н÷5¿÷5?y¿½O?½O¿y?Ç¡J¿‚8?³?Ð=a1¿P1?³?Ð=Ç¡J¿‚8?³?Ð=ú=¿¸ ?¯>>>Ä &¿Ä &?¯>>>ú=¿¸ ?¯>>>ÒT+¿õø>hxs>¾¿¿¾¿?hxs>Së¿bØÙ>ݘ~>9Fâ¾9Fâ>À³]>'Nƾ'NÆ>y>9Fâ¾9Fâ>À³]>¹â⾌פ>y>;ÿ¶¾;ÿ¶>âæT='Nƾ'NÆ>y>_Ѿ˜>âæT=;ÿ¶¾;ÿ¶>âæT½'Nƾ'NÆ>y¾;ÿ¶¾;ÿ¶>âæT½¹â⾌פ>y¾9Fâ¾9Fâ>À³]¾'Nƾ'NÆ>y¾\q¿e¼>À³]¾¼¿¼?ݘ~¾9Fâ¾9Fâ>À³]¾Së¿bØÙ>ݘ~¾ÒT+¿õø>hxs¾ÒT+¿õø>hxs¾ú=¿¸ ?¯>>¾Ä &¿Ä &?¯>>¾ú=¿¸ ?¯>>¾Ç¡J¿‚8?³?нa1¿P1?³?нǡJ¿‚8?³?н½O¿y?÷5¿÷5?ød¿‚qè>ñ*_¿Lkã>³?Ð=Ç¡J¿‚8?³?Ð=ñ*_¿Lkã>³?Ð=ç:Q¿]7Õ>¯>>>ú=¿¸ ?¯>>>ç:Q¿]7Õ>¯>>>ݱ<¿0JÀ>hxs>ÒT+¿õø>hxs>Ò%¿B¨>ݘ~>\q¿e¼>À³]>¹â⾌פ>y>_Ѿ˜>âæT=_Ѿ˜>âæT½¹â⾌פ>y¾\q¿e¼>À³]¾Ò%¿B¨>ݘ~¾Ý±<¿0JÀ>hxs¾ç:Q¿]7Õ>¯>>¾ç:Q¿]7Õ>¯>>¾ñ*_¿Lkã>³?нǡJ¿‚8?³?нñ*_¿Lkã>³?нød¿‚qè>½O¿y?P5n¿ Ìš>³?Ð=P5n¿ Ìš>³?Ð=ÒT_¿%!‘>¯>>>ç:Q¿]7Õ>¯>>>iI¿¹â‚>hxs>Š=0¿xe> ™~>Ÿ¿åF‘>À³]> áù¾œ£~>y>Ÿ¿åF‘>À³]>!\¿HS->y>—æ¾ûj>âæT= áù¾œ£~>y>u!ö¾ò>âæT=—æ¾ûj>âæT½ áù¾œ£~>y¾—æ¾ûj>âæT½!\¿HS->y¾Ÿ¿åF‘>À³]¾Ò%¿B¨>ݘ~¾iI¿¹â‚>hxs¾ÒT_¿%!‘>¯>>¾ÒT_¿%!‘>¯>>¾P5n¿ Ìš>³?нñ*_¿Lkã>³?нyxs¿z7ž>Ù|¿<0 > bw¿í¹>³?Ð=P5n¿ Ìš>³?Ð= bw¿í¹>³?Ð=åîg¿Zð>¯>>>ÒT_¿%!‘>¯>>>iI¿¹â‚>hxs>ÒT_¿%!‘>¯>>>o+Q¿Q„>hxs>Š=0¿xe> ™~>[7¿Séç=ݘ~>³¿°<È=À³]>A+¿rÅE>À³]>³¿°<È=À³]> ¿$|¯=y>!\¿HS->y>u!ö¾ò>âæT=!\¿HS->y>cœÿ¾€ð¡=âæT=u!ö¾ò>âæT½!\¿HS->y¾u!ö¾ò>âæT½ ¿$|¯=y¾A+¿rÅE>À³]¾!\¿HS->y¾³¿°<È=À³]¾Š=0¿xe> ™~¾A+¿rÅE>À³]¾[7¿Séç=ݘ~¾o+Q¿Q„>hxs¾o+Q¿Q„>hxs¾åîg¿Zð>¯>>¾ÒT_¿%!‘>¯>>¾åîg¿Zð>¯>>¾ bw¿í¹>³?нP5n¿ Ìš>³?н bw¿í¹>³?нÙ|¿<0 >yxs¿z7ž>€¿wz¿³?Ð= bw¿í¹>³?Ð=wz¿³?Ð=Ój¿¯>>>åîg¿Zð>¯>>>ëÆS¿hxs>jO9¿Ý˜~>³¿°<È=À³]> ¿$|¯=y>³¿°<È=À³]>9 ¿y>cœÿ¾€ð¡=âæT= ¿$|¯=y>f¿âæT=cœÿ¾€ð¡=âæT½ ¿$|¯=y¾cœÿ¾€ð¡=âæT½9 ¿y¾9 ¿y¾ ¿À³]¾³¿°<È=À³]¾[7¿Séç=ݘ~¾ëÆS¿hxs¾Ój¿¯>>¾Ój¿¯>>¾wz¿³?н bw¿í¹>³?нwz¿³?н€¿Ù|¿<0 >Ù|¿<0 ¾ bw¿í¹¾³?Ð=wz¿³?Ð=åîg¿ð¾¯>>>o+Q¿Q„¾hxs>[7¿Séç½Ý˜~> ¿À³]>9 ¿y>f¿âæT=f¿âæT½9 ¿y¾ ¿À³]¾jO9¿Ý˜~¾o+Q¿Q„¾hxs¾åîg¿ð¾¯>>¾ bw¿í¹¾³?н bw¿í¹¾³?нÙ|¿<0 ¾€¿yxs¿z7ž¾P5n¿ Ìš¾³?Ð= bw¿í¹¾³?Ð=ÒT_¿%!‘¾¯>>>iI¿—₾hxs>[7¿Séç½Ý˜~>³¿)<ȽÀ³]> ¿$|¯½y>³¿)<ȽÀ³]>!\¿HS-¾y>cœÿ¾€ð¡½âæT= ¿$|¯½y>u!ö¾Øñ¾âæT=cœÿ¾€ð¡½âæT½ ¿$|¯½y¾cœÿ¾€ð¡½âæT½!\¿HS-¾y¾³¿)<ȽÀ³]¾ ¿$|¯½y¾A+¿.ÅE¾À³]¾[7¿Séç½Ý˜~¾iI¿—₾hxs¾iI¿—₾hxs¾ÒT_¿%!‘¾¯>>¾åîg¿ð¾¯>>¾P5n¿ Ìš¾³?нP5n¿ Ìš¾³?нyxs¿z7ž¾Ù|¿<0 ¾ñ*_¿Lkã¾³?Ð=ç:Q¿;7Õ¾¯>>>ݱ<¿JÀ¾hxs>Ò%¿B¨¾Ý˜~>A+¿.ÅE¾À³]>Š=0¿4e¾Ý˜~>Ÿ¿åF‘¾À³]>!\¿HS-¾y>A+¿.ÅE¾À³]> áù¾œ£~¾y>u!ö¾Øñ¾âæT=u!ö¾Øñ¾âæT½!\¿HS-¾y¾u!ö¾Øñ¾âæT½ áù¾œ£~¾y¾A+¿.ÅE¾À³]¾!\¿HS-¾y¾Ÿ¿åF‘¾À³]¾Š=0¿4e¾Ý˜~¾A+¿.ÅE¾À³]¾Ò%¿B¨¾Ý˜~¾Ý±<¿JÀ¾hxs¾ç:Q¿;7Õ¾¯>>¾ñ*_¿Lkã¾³?н d¿aqè¾½O¿y¿Ç¡J¿‚8¿³?Ð=ñ*_¿Lkã¾³?Ð=ú=¿¸ ¿¯>>>ú=¿¸ ¿¯>>>ÒT+¿õø¾hxs>ݱ<¿JÀ¾hxs>Së¿bØÙ¾Ý˜~>Ÿ¿åF‘¾À³]> áù¾œ£~¾y>Ÿ¿åF‘¾À³]>¹â⾌פ¾y>—æ¾ûj¾âæT= áù¾œ£~¾y>_Ѿ˜¾âæT=—æ¾ûj¾âæT½ áù¾œ£~¾y¾—æ¾ûj¾âæT½¹â⾌פ¾y¾Ÿ¿åF‘¾À³]¾ áù¾œ£~¾y¾\q¿e¼¾À³]¾Ò%¿B¨¾Ý˜~¾ÒT+¿õø¾hxs¾ÒT+¿õø¾hxs¾ú=¿¸ ¿¯>>¾ç:Q¿;7Õ¾¯>>¾ú=¿¸ ¿¯>>¾Ç¡J¿‚8¿³?нñ*_¿Lkã¾³?нǡJ¿‚8¿³?н½O¿y¿ d¿aqè¾÷5¿÷5¿a1¿P1¿³?Ð=Ç¡J¿‚8¿³?Ð=a1¿P1¿³?Ð=Ä &¿Ä &¿¯>>>ú=¿¸ ¿¯>>>Ä &¿Ä &¿¯>>>¾¿¿¾¿¿hxs>ÒT+¿õø¾hxs>¼¿¼¿Ý˜~>\q¿e¼¾À³]>Së¿bØÙ¾Ý˜~>9Fâ¾9Fâ¾À³]>¹â⾌פ¾y>\q¿e¼¾À³]>'Nƾ'Nƾy>_Ѿ˜¾âæT=¹â⾌פ¾y>;ÿ¶¾;ÿ¶¾âæT=_Ѿ˜¾âæT½¹â⾌פ¾y¾_Ѿ˜¾âæT½'Nƾ'Nƾy¾\q¿e¼¾À³]¾¹â⾌פ¾y¾9Fâ¾9Fâ¾À³]¾Së¿bØÙ¾Ý˜~¾¾¿¿¾¿¿hxs¾¾¿¿¾¿¿hxs¾Ä &¿Ä &¿¯>>¾ú=¿¸ ¿¯>>¾a1¿P1¿³?нa1¿P1¿³?н÷5¿÷5¿½O¿y¿y¿½O¿‚8¿Ç¡J¿³?Ð=a1¿P1¿³?Ð=‚8¿Ç¡J¿³?Ð=¸ ¿ú=¿¯>>>Ä &¿Ä &¿¯>>>õø¾ÒT+¿hxs>bØÙ¾Bë¿Ý˜~>9Fâ¾9Fâ¾À³]>'Nƾ'Nƾy>;ÿ¶¾;ÿ¶¾âæT='Nƾ'Nƾy>˜¾_ѾâæT=;ÿ¶¾;ÿ¶¾âæT½;ÿ¶¾;ÿ¶¾âæT=˜¾_ѾâæT½'Nƾ'Nƾy¾;ÿ¶¾;ÿ¶¾âæT½Œ×¤¾¹ââ¾y¾e¼¾\q¿À³]¾bØÙ¾Bë¿Ý˜~¾õø¾ÒT+¿hxs¾¸ ¿ú=¿¯>>¾‚8¿Ç¡J¿³?н‚8¿Ç¡J¿³?нy¿½O¿÷5¿÷5¿‚qè¾ød¿Lkã¾ñ*_¿³?Ð=‚8¿Ç¡J¿³?Ð=Lkã¾ñ*_¿³?Ð=]7Õ¾ç:Q¿¯>>>¸ ¿ú=¿¯>>>]7Õ¾ç:Q¿¯>>>0JÀ¾Ý±<¿hxs>õø¾ÒT+¿hxs>bØÙ¾Bë¿Ý˜~>e¼¾\q¿À³]>Œ×¤¾¹ââ¾y>e¼¾\q¿À³]>œ£~¾ áù¾y>˜¾_ѾâæT=Œ×¤¾¹ââ¾y>Âûj¾—æ¾âæT=˜¾_ѾâæT½Œ×¤¾¹ââ¾y¾˜¾_ѾâæT½œ£~¾ áù¾y¾e¼¾\q¿À³]¾Œ×¤¾¹ââ¾y¾åF‘¾Ÿ¿À³]¾bØÙ¾Bë¿Ý˜~¾e¼¾\q¿À³]¾B¨¾Ò%¿Ý˜~¾0JÀ¾Ý±<¿hxs¾]7Õ¾ç:Q¿¯>>¾]7Õ¾ç:Q¿¯>>¾Lkã¾ñ*_¿³?н‚8¿Ç¡J¿³?нLkã¾ñ*_¿³?н‚qè¾ød¿y¿½O¿z7ž¾yxs¿ Ìš¾P5n¿³?Ð=Lkã¾ñ*_¿³?Ð= Ìš¾P5n¿³?Ð=%!‘¾ÒT_¿¯>>>]7Õ¾ç:Q¿¯>>>%!‘¾ÒT_¿¯>>>¹â‚¾iI¿hxs>0JÀ¾Ý±<¿hxs>4e¾Š=0¿Ý˜~>åF‘¾Ÿ¿À³]>œ£~¾ áù¾y>åF‘¾Ÿ¿À³]>HS-¾!\¿y>Âûj¾—æ¾âæT=œ£~¾ áù¾y>ò¾u!ö¾âæT=Âûj¾—æ¾âæT½œ£~¾ áù¾y¾Âûj¾—æ¾âæT½HS-¾!\¿y¾åF‘¾Ÿ¿À³]¾œ£~¾ áù¾y¾rÅE¾A+¿À³]¾B¨¾Ò%¿Ý˜~¾¹â‚¾iI¿hxs¾¹â‚¾iI¿hxs¾%!‘¾ÒT_¿¯>>¾]7Õ¾ç:Q¿¯>>¾%!‘¾ÒT_¿¯>>¾ Ìš¾P5n¿³?нLkã¾ñ*_¿³?н Ìš¾P5n¿³?нz7ž¾yxs¿‚qè¾ød¿í¹¾ bw¿³?Ð=í¹¾ bw¿³?Ð=Zð¾åîg¿¯>>>%!‘¾ÒT_¿¯>>>¹â‚¾iI¿hxs>%!‘¾ÒT_¿¯>>>Q„¾o+Q¿hxs>4e¾Š=0¿Ý˜~>rÅE¾A+¿À³]>HS-¾!\¿y>ò¾u!ö¾âæT=HS-¾!\¿y>€ð¡½cœÿ¾âæT=ò¾u!ö¾âæT½HS-¾!\¿y¾ò¾u!ö¾âæT½$|¯½ ¿y¾rÅE¾A+¿À³]¾4e¾Š=0¿Ý˜~¾rÅE¾A+¿À³]¾Séç½[7¿Ý˜~¾Q„¾o+Q¿hxs¾Q„¾o+Q¿hxs¾Zð¾åîg¿¯>>¾%!‘¾ÒT_¿¯>>¾Zð¾åîg¿¯>>¾í¹¾ bw¿³?н Ìš¾P5n¿³?н<0 ¾Ù|¿wz¿³?Ð=wz¿³?Ð=Ój¿¯>>>Zð¾åîg¿¯>>>ëÆS¿hxs>jO9¿Ý˜~>°<Ƚ³¿À³]>Séç½[7¿Ý˜~> ¿À³]>$|¯½ ¿y>°<Ƚ³¿À³]>9 ¿y>€ð¡½cœÿ¾âæT=$|¯½ ¿y>f¿âæT=€ð¡½cœÿ¾âæT½$|¯½ ¿y¾€ð¡½cœÿ¾âæT½9 ¿y¾°<Ƚ³¿À³]¾$|¯½ ¿y¾ ¿À³]¾ ¿À³]¾jO9¿Ý˜~¾Séç½[7¿Ý˜~¾Q„¾o+Q¿hxs¾Ój¿¯>>¾í¹¾ bw¿³?нZð¾åîg¿¯>>¾wz¿³?н€¿wz¿³?Ð=Ój¿¯>>>wz¿³?Ð=Zð>åîg¿¯>>>Q„>o+Q¿hxs>jO9¿Ý˜~>ëÆS¿hxs>Séç=[7¿Ý˜~> ¿À³]>°<È=³¿À³]>$|¯= ¿y>9 ¿y>$|¯= ¿y>€ð¡=cœÿ¾âæT=f¿âæT=€ð¡=cœÿ¾âæT½€ð¡=cœÿ¾âæT½$|¯= ¿y¾9 ¿y¾$|¯= ¿y¾°<È=³¿À³]¾ ¿À³]¾Séç=[7¿Ý˜~¾ëÆS¿hxs¾jO9¿Ý˜~¾Q„>o+Q¿hxs¾Ój¿¯>>¾wz¿³?нÓj¿¯>>¾í¹> bw¿³?н€¿í¹> bw¿³?Ð=Zð>åîg¿¯>>>í¹> bw¿³?Ð=%!‘>ÒT_¿¯>>>Q„>o+Q¿hxs>Séç=[7¿Ý˜~>rÅE>A+¿À³]>rÅE>A+¿À³]>HS->!\¿y>$|¯= ¿y>ò>u!ö¾âæT=ò>u!ö¾âæT½HS->!\¿y¾HS->!\¿y¾rÅE>A+¿À³]¾°<È=³¿À³]¾Séç=[7¿Ý˜~¾Q„>o+Q¿hxs¾Zð>åîg¿¯>>¾í¹> bw¿³?нZð>åîg¿¯>>¾ Ìš>P5n¿³?н0 >Ù|¿ Ìš>P5n¿³?Ð=z7ž>hxs¿Lkã>à*_¿³?Ð=%!‘>ÒT_¿¯>>>¹â‚>niI¿hxs>xe>Š=0¿Ý˜~>rÅE>A+¿À³]>xe>Š=0¿Ý˜~>åF‘>Ÿ¿À³]>åF‘>Ÿ¿À³]>ߣ~> áù¾y>HS->!\¿y>ߣ~> áù¾y>Âûj>—æ¾âæT=ò>u!ö¾âæT=Âûj>—æ¾âæT½Âûj>—æ¾âæT½ß£~> áù¾y¾HS->!\¿y¾ß£~> áù¾y¾åF‘>Ÿ¿À³]¾rÅE>A+¿À³]¾åF‘>Ÿ¿À³]¾B¨>Ò%¿Ý˜~¾xe>Š=0¿Ý˜~¾¹â‚>niI¿hxs¾%!‘>ÒT_¿¯>>¾¹â‚>niI¿hxs¾]7Õ>ç:Q¿¯>>¾ Ìš>P5n¿³?нz7ž>hxs¿Lkã>à*_¿³?Ð=‚qè>ød¿‚8?סJ¿³?Ð=]7Õ>ç:Q¿¯>>>0JÀ>ݱ<¿hxs>B¨>Ò%¿Ý˜~>D¼>\q¿À³]>D¼>\q¿À³]>Œ×¤>¹ââ¾y>ߣ~> áù¾y>Œ×¤>¹ââ¾y>˜>_ѾâæT=Âûj>—æ¾âæT=˜>_ѾâæT½˜>_ѾâæT½Œ×¤>¹ââ¾y¾ß£~> áù¾y¾åF‘>Ÿ¿À³]¾ß£~> áù¾y¾D¼>\q¿À³]¾B¨>Ò%¿Ý˜~¾^õø>ÒT+¿hxs¾]7Õ>ç:Q¿¯>>¾Lkã>à*_¿³?н‚qè>ød¿Lkã>à*_¿³?нy?½O¿‚8?סJ¿³?Ð=y?½O¿P1?a1¿³?Ð=¸ ?"ú=¿¯>>>^õø>ÒT+¿hxs>bØÙ>Së¿Ý˜~>^õø>ÒT+¿hxs>¼?¼¿Ý˜~>Fâ>9Fâ¾À³]>'NÆ>'Nƾy>'NÆ>'Nƾy>;ÿ¶>\ÿ¶¾âæT=˜>_ѾâæT=;ÿ¶>\ÿ¶¾âæT½;ÿ¶>\ÿ¶¾âæT½'NÆ>'Nƾy¾Œ×¤>¹ââ¾y¾'NÆ>'Nƾy¾Fâ>9Fâ¾À³]¾D¼>\q¿À³]¾¼?¼¿Ý˜~¾^õø>ÒT+¿hxs¾¸ ?"ú=¿¯>>¾‚8?סJ¿³?нy?½O¿P1?a1¿³?Ð=æ5?÷5¿Ç¡J?‚8¿³?Ð=³ &?Ä &¿¯>>>P1?a1¿³?Ð=ú=?È ¿¯>>>¾¿?¾¿¿hxs>³ &?Ä &¿¯>>>ÁT+?õø¾hxs>Bë?bØÙ¾Ý˜~>Fâ>9Fâ¾À³]>'NÆ>'Nƾy>_Ñ>˜¾âæT=_Ñ>˜¾âæT½_Ñ>˜¾âæT½—ââ>Œ×¤¾y¾'NÆ>'Nƾy¾Lq?e¼¾À³]¾Bë?bØÙ¾Ý˜~¾¾¿?¾¿¿hxs¾³ &?Ä &¿¯>>¾¾¿?¾¿¿hxs¾ú=?È ¿¯>>¾P1?a1¿³?н³ &?Ä &¿¯>>¾Ç¡J?‚8¿³?нæ5?÷5¿P1?a1¿³?н½O?%y¿Ç¡J?‚8¿³?Ð=½O?%y¿à*_?Lkã¾³?Ð=ú=?È ¿¯>>>Ç¡J?‚8¿³?Ð=ç:Q?]7Õ¾¯>>>ÁT+?õø¾hxs>ú=?È ¿¯>>>ݱBë?bØÙ¾Ý˜~>Ò%?B¨¾Ý˜~>Ÿ?åF‘¾À³]>Lq?e¼¾À³]> áù>ߣ~¾y>—æ>Âûj¾âæT=—æ>Âûj¾âæT½ áù>ߣ~¾y¾Ÿ?åF‘¾À³]¾Ÿ?åF‘¾À³]¾Ò%?B¨¾Ý˜~¾Bë?bØÙ¾Ý˜~¾ÁT+?õø¾hxs¾ú=?È ¿¯>>¾ÁT+?õø¾hxs¾ç:Q?]7Õ¾¯>>¾Ç¡J?‚8¿³?нú=?È ¿¯>>¾à*_?Lkã¾³?н½O?%y¿Ç¡J?‚8¿³?нød?‚qè¾à*_?Lkã¾³?Ð=ød?‚qè¾P5n? Ìš¾³?Ð=ç:Q?]7Õ¾¯>>>ݱÒ%?B¨¾Ý˜~>Š=0?xe¾Ý˜~>A+?rÅE¾À³]>Ÿ?åF‘¾À³]>!\?HS-¾y>!\?HS-¾y>u!ö>ò¾âæT=—æ>Âûj¾âæT=u!ö>ò¾âæT½u!ö>ò¾âæT½!\?HS-¾y¾ áù>ߣ~¾y¾!\?HS-¾y¾A+?rÅE¾À³]¾Ÿ?åF‘¾À³]¾Ò%?B¨¾Ý˜~¾Ÿ?åF‘¾À³]¾Š=0?xe¾Ý˜~¾Ý±>¾à*_?Lkã¾³?нød?‚qè¾à*_?Lkã¾³?нhxs?z7ž¾P5n? Ìš¾³?Ð=ÒT_?%!‘¾¯>>>P5n? Ìš¾³?Ð=åîg?Zð¾¯>>>niI?¹â‚¾hxs>Š=0?xe¾Ý˜~>[7?Séç½Ý˜~>³?°<ȽÀ³]>A+?rÅE¾À³]>³?°<ȽÀ³]> ?$|¯½y>!\?HS-¾y> ?$|¯½y>cœÿ>€ð¡½âæT=u!ö>ò¾âæT=cœÿ>€ð¡½âæT½cœÿ>€ð¡½âæT½ ?$|¯½y¾!\?HS-¾y¾ ?$|¯½y¾³?°<ȽÀ³]¾A+?rÅE¾À³]¾[7?Séç½Ý˜~¾niI?¹â‚¾hxs¾ÒT_?%!‘¾¯>>¾P5n? Ìš¾³?нÒT_?%!‘¾¯>>¾ bw?0º¾³?нhxs?z7ž¾ bw?0º¾³?Ð=Ù|?0 ¾wz?€³?Ð=åîg?Zð¾¯>>> bw?0º¾³?Ð=Ój?€¯>>>o+Q?Q„¾hxs>[7?Séç½Ý˜~> ?€À³]> ?€À³]>9 ?€y> ?$|¯½y>9 ?€y>f?€âæT=cœÿ>€ð¡½âæT=f?€âæT½f?€âæT½9 ?€y¾ ?$|¯½y¾9 ?€y¾ ?€À³]¾³?°<ȽÀ³]¾jO9?€Ý˜~¾o+Q?Q„¾hxs¾åîg?Zð¾¯>>¾ bw?0º¾³?нÙ|?0 ¾ bw?0º¾³?н€?€ž‹  „‹Åªy?º1=íET>Ūy?º1=íET>Ūy?º1=íET>–°N?Õ"‚=I+?–°N?Õ"‚=I+?–°N?Õ"‚=I+?FÍÿ>!=ù‡]?FÍÿ>!=ù‡]?FÍÿ>!=ù‡]?4Ö=XÆ<Ä–~?4Ö=XÆ<Ä–~?4Ö=XÆ<Ä–~?Œ+ž¾,Ǽþes?Œ+ž¾,Ǽþes?Œ+ž¾,Ǽþes?|+¿gW½Pû=?|+¿gW½Pû=?|+¿gW½Pû=?òCi¿DÞ’½x¶Ï>òCi¿DÞ’½x¶Ï>òCi¿DÞ’½x¶Ï>ô5¿¯ ½ô5¿¯ ½ô5¿¯ ½òCi¿¾Ý’½x¶Ï¾òCi¿¾Ý’½x¶Ï¾òCi¿¾Ý’½x¶Ï¾|+¿gW½Pû=¿|+¿gW½Pû=¿|+¿gW½Pû=¿Œ+ž¾,Ǽþes¿Œ+ž¾,Ǽþes¿Œ+ž¾,Ǽþes¿4Ö=XÆ<Ä–~¿4Ö=XÆ<Ä–~¿4Ö=XÆ<Ä–~¿FÍÿ>!=ù‡]¿FÍÿ>!=ù‡]¿FÍÿ>!=ù‡]¿–°N?Õ"‚=I+¿–°N?Õ"‚=I+¿–°N?Õ"‚=I+¿Åªy?º1=0FT¾Åªy?º1=0FT¾Åªy?º1=0FT¾ý„s?Úi>0FT>ý„s?Úi>0FT>ý„s?Úi>0FT>»™I?»™A>9+?»™I?»™A>9+?»™I?»™A>9+?Ô€ù>€™ï=ù‡]?Ô€ù>€™ï=ù‡]?Ô€ù>€™ï=ù‡]?°ËÐ=äÈ<Ä–~?°ËÐ=äÈ<Ä–~?°ËÐ=äÈ<Ä–~?|Fš¾…'”½þes?|Fš¾…'”½þes?|Fš¾…'”½þes?'Ù&¿ï9 ¾Pû=?'Ù&¿ï9 ¾Pû=?'Ù&¿ï9 ¾Pû=?”…c¿1~Z¾x¶Ï>”…c¿1~Z¾x¶Ï>”…c¿1~Z¾x¶Ï>>íx¿5 o¾>íx¿5 o¾>íx¿5 o¾”…c¿1~Z¾x¶Ï¾”…c¿1~Z¾x¶Ï¾”…c¿1~Z¾x¶Ï¾'Ù&¿2: ¾aû=¿'Ù&¿2: ¾aû=¿'Ù&¿2: ¾aû=¿|Fš¾þ&”½þes¿|Fš¾þ&”½þes¿|Fš¾þ&”½þes¿°ËÐ=äÈ<Ä–~¿°ËÐ=äÈ<Ä–~¿°ËÐ=äÈ<Ä–~¿Ô€ù>šï=ù‡]¿Ô€ù>šï=ù‡]¿Ô€ù>šï=ù‡]¿»™I?x™A>9+¿»™I?x™A>9+¿»™I?x™A>9+¿ý„s?àÚi>0FT¾ý„s?àÚi>0FT¾ý„s?àÚi>0FT¾(`g?Ž­¿>0FT>(`g?Ž­¿>0FT>(`g?Ž­¿>0FT>Œ??À®ž>9+?Œ??À®ž>9+?Œ??À®ž>9+?¦í>IcD>ù‡]?¦í>IcD>ù‡]?¦í>IcD>ù‡]?5bÆ=Y$=Ä–~?5bÆ=Y$=Ä–~?5bÆ=Y$=Ä–~?ÿ”’¾7Ýò½þes?ÿ”’¾7Ýò½þes?ÿ”’¾7Ýò½þes?‡¿Tƒ¾aû=?‡¿Tƒ¾aû=?‡¿Tƒ¾aû=?õ,X¿ù³¾x¶Ï>õ,X¿ù³¾x¶Ï>õ,X¿ù³¾x¶Ï>Vƒl¿(ïþVƒl¿(ïþVƒl¿(ïþõ,X¿ù³¾x¶Ï¾õ,X¿ù³¾x¶Ï¾õ,X¿ù³¾x¶Ï¾‡¿Tƒ¾aû=¿‡¿Tƒ¾aû=¿‡¿Tƒ¾aû=¿ÿ”’¾7Ýò½þes¿ÿ”’¾7Ýò½þes¿ÿ”’¾7Ýò½þes¿5bÆ=Y$=Ä–~¿5bÆ=Y$=Ä–~¿5bÆ=Y$=Ä–~¿¦í>IcD>ù‡]¿¦í>IcD>ù‡]¿¦í>IcD>ù‡]¿Œ??⮞>9+¿Œ??⮞>9+¿Œ??⮞>9+¿(`g?Ž­¿>0FT¾(`g?Ž­¿>0FT¾(`g?Ž­¿>0FT¾ÓˆU?˜Ú?íET>ÓˆU?˜Ú?íET>ÓˆU?˜Ú?íET>çÆ0?m¨Ø>9+?çÆ0?m¨Ø>9+?çÆ0?m¨Ø>9+?ÈÚ>º†>ù‡]?ÈÚ>º†>ù‡]?ÈÚ>º†>ù‡]?L·=$d`=Ä–~?L·=$d`=Ä–~?L·=$d`=Ä–~?sG‡¾BÌ%¾þes?sG‡¾BÌ%¾þes?sG‡¾BÌ%¾þes?ÓM¿aO³¾aû=?ÓM¿aO³¾aû=?ÓM¿aO³¾aû=?¶G¿íƒô¾x¶Ï>¶G¿íƒô¾x¶Ï>¶G¿íƒô¾x¶Ï>FZ¿n¿FZ¿n¿FZ¿n¿¶G¿íƒô¾x¶Ï¾¶G¿íƒô¾x¶Ï¾¶G¿íƒô¾x¶Ï¾ÓM¿aO³¾aû=¿ÓM¿aO³¾aû=¿ÓM¿aO³¾aû=¿sG‡¾BÌ%¾þes¿sG‡¾BÌ%¾þes¿sG‡¾BÌ%¾þes¿L·=$d`=Ä–~¿L·=$d`=Ä–~¿L·=$d`=Ä–~¿ÈÚ>º†>ù‡]¿ÈÚ>º†>ù‡]¿ÈÚ>º†>ù‡]¿çÆ0?m¨Ø>9+¿çÆ0?m¨Ø>9+¿çÆ0?m¨Ø>9+¿ÓˆU?˜Ú?íET¾ÓˆU?˜Ú?íET¾ÓˆU?˜Ú?íET¾ro>?µ¥"?0FT>ro>?µ¥"?0FT>ro>?µ¥"?0FT>n§?L¦?9+?n§?L¦?9+?n§?L¦?9+?qÃ>줦>ù‡]?qÃ>줦>ù‡]?qÃ>줦>ù‡]?éG£=Þt‹=Ä–~?éG£=Þt‹=Ä–~?éG£=Þt‹=Ä–~?MJq¾N¾þes?MJq¾N¾þes?MJq¾N¾þes?Bz¿nàÞ¾aû=?Bz¿nàÞ¾aû=?Bz¿nàÞ¾aû=?Äì1¿^ö¿x¶Ï>Äì1¿^ö¿x¶Ï>Äì1¿^ö¿x¶Ï>ø©B¿JB&¿ø©B¿JB&¿ø©B¿JB&¿Äì1¿^ö¿x¶Ï¾Äì1¿^ö¿x¶Ï¾Äì1¿^ö¿x¶Ï¾Bz¿nàÞ¾aû=¿Bz¿nàÞ¾aû=¿Bz¿nàÞ¾aû=¿MJq¾N¾þes¿MJq¾N¾þes¿MJq¾N¾þes¿éG£=Þt‹=Ä–~¿éG£=Þt‹=Ä–~¿éG£=Þt‹=Ä–~¿qÃ>줦>è‡]¿qÃ>줦>è‡]¿qÃ>줦>è‡]¿n§?L¦?9+¿n§?L¦?9+¿n§?L¦?9+¿ro>?µ¥"?0FT¾ro>?µ¥"?0FT¾ro>?µ¥"?0FT¾¤¥"?ro>?íET>¤¥"?ro>?íET>¤¥"?ro>?íET>;¦?~§?9+?;¦?~§?9+?;¦?~§?9+?ʤ¦>PÃ>ù‡]?ʤ¦>PÃ>ù‡]?ʤ¦>PÃ>ù‡]?Xt‹=éG£=Ä–~?Xt‹=éG£=Ä–~?Xt‹=éG£=Ä–~?¾N¾MJq¾þes?¾N¾MJq¾þes?¾N¾MJq¾þes?nàÞ¾Bz¿aû=?nàÞ¾Bz¿aû=?nàÞ¾Bz¿aû=?^ö¿Äì1¿x¶Ï>^ö¿Äì1¿x¶Ï>^ö¿Äì1¿x¶Ï>9B&¿ø©B¿9B&¿ø©B¿9B&¿ø©B¿^ö¿Õì1¿x¶Ï¾^ö¿Õì1¿x¶Ï¾^ö¿Õì1¿x¶Ï¾nàÞ¾Bz¿aû=¿nàÞ¾Bz¿aû=¿nàÞ¾Bz¿aû=¿N¾MJq¾þes¿N¾MJq¾þes¿N¾MJq¾þes¿Xt‹=éG£=Ä–~¿Xt‹=éG£=Ä–~¿Xt‹=éG£=Ä–~¿Ê¤¦>qÃ>ù‡]¿Ê¤¦>qÃ>ù‡]¿Ê¤¦>qÃ>ù‡]¿;¦?~§?9+¿;¦?~§?9+¿;¦?~§?9+¿µ¥"?ro>?íET¾µ¥"?ro>?íET¾µ¥"?ro>?íET¾©Ú?ÓˆU?íET>©Ú?ÓˆU?íET>©Ú?ÓˆU?íET>m¨Ø>çÆ0?9+?m¨Ø>çÆ0?9+?m¨Ø>çÆ0?9+?º†>ÈÚ>ù‡]?º†>ÈÚ>ù‡]?º†>ÈÚ>ù‡]?$d`=L·=Ä–~?$d`=L·=Ä–~?$d`=L·=Ä–~?BÌ%¾sG‡¾þes?BÌ%¾sG‡¾þes?BÌ%¾sG‡¾þes?aO³¾ÓM¿Pû=?aO³¾ÓM¿Pû=?aO³¾ÓM¿Pû=?„ô¾¦G¿x¶Ï>„ô¾¦G¿x¶Ï>„ô¾¦G¿x¶Ï>¿FZ¿Â¿FZ¿Â¿FZ¿íƒô¾¶G¿x¶Ï¾íƒô¾¶G¿x¶Ï¾íƒô¾¶G¿x¶Ï¾ƒO³¾ÓM¿aû=¿ƒO³¾ÓM¿aû=¿ƒO³¾ÓM¿aû=¿BÌ%¾sG‡¾þes¿BÌ%¾sG‡¾þes¿BÌ%¾sG‡¾þes¿$d`=L·=Ä–~¿$d`=L·=Ä–~¿$d`=L·=Ä–~¿º†>ÈÚ>ù‡]¿º†>ÈÚ>ù‡]¿º†>ÈÚ>ù‡]¿m¨Ø>çÆ0?9+¿m¨Ø>çÆ0?9+¿m¨Ø>çÆ0?9+¿©Ú?ÓˆU?íET¾©Ú?ÓˆU?íET¾©Ú?ÓˆU?íET¾Ž­¿>(`g?íET>Ž­¿>(`g?íET>Ž­¿>(`g?íET>⮞>Œ??9+?⮞>Œ??9+?⮞>Œ??9+?IcD>„í>ù‡]?IcD>„í>ù‡]?IcD>„í>ù‡]?Y$=5bÆ=Ä–~?Y$=5bÆ=Ä–~?Y$=5bÆ=Ä–~?7Ýò½ÿ”’¾þes?7Ýò½ÿ”’¾þes?7Ýò½ÿ”’¾þes?;Tƒ¾+‡¿Pû=?;Tƒ¾+‡¿Pû=?;Tƒ¾+‡¿Pû=?ù³¾õ,X¿š¶Ï>ù³¾õ,X¿š¶Ï>ù³¾õ,X¿š¶Ï>(ïþVƒl¿(ïþVƒl¿(ïþVƒl¿ù³¾õ,X¿š¶Ï¾ù³¾õ,X¿š¶Ï¾ù³¾õ,X¿š¶Ï¾;Tƒ¾+‡¿Pû=¿;Tƒ¾+‡¿Pû=¿;Tƒ¾+‡¿Pû=¿¾Ýò½ÿ”’¾þes¿¾Ýò½ÿ”’¾þes¿¾Ýò½ÿ”’¾þes¿Y$=5bÆ=Ä–~¿Y$=5bÆ=Ä–~¿Y$=5bÆ=Ä–~¿IcD>„í>ù‡]¿IcD>„í>ù‡]¿IcD>„í>ù‡]¿â®ž>Œ??9+¿â®ž>Œ??9+¿â®ž>Œ??9+¿°­¿>(`g?íET¾°­¿>(`g?íET¾°­¿>(`g?íET¾àÚi>ý„s?íET>àÚi>ý„s?íET>àÚi>ý„s?íET>x™A>»™I?I+?x™A>»™I?I+?x™A>»™I?I+?šï=Ô€ù>ù‡]?šï=Ô€ù>ù‡]?šï=Ô€ù>ù‡]?äÈ<°ËÐ=Ä–~?äÈ<°ËÐ=Ä–~?äÈ<°ËÐ=Ä–~?þ&”½|Fš¾þes?þ&”½|Fš¾þes?þ&”½|Fš¾þes?ï9 ¾'Ù&¿aû=?ï9 ¾'Ù&¿aû=?ï9 ¾'Ù&¿aû=?1~Z¾”…c¿x¶Ï>1~Z¾”…c¿x¶Ï>1~Z¾”…c¿x¶Ï>x o¾>íx¿x o¾>íx¿x o¾>íx¿1~Z¾”…c¿x¶Ï¾1~Z¾”…c¿x¶Ï¾1~Z¾”…c¿x¶Ï¾2: ¾'Ù&¿aû=¿2: ¾'Ù&¿aû=¿2: ¾'Ù&¿aû=¿þ&”½|Fš¾þes¿þ&”½|Fš¾þes¿þ&”½|Fš¾þes¿äÈ<°ËÐ=Ä–~¿äÈ<°ËÐ=Ä–~¿äÈ<°ËÐ=Ä–~¿šï=Ô€ù>ù‡]¿šï=Ô€ù>ù‡]¿šï=Ô€ù>ù‡]¿x™A>»™I?I+¿x™A>»™I?I+¿x™A>»™I?I+¿àÚi>ý„s?íET¾àÚi>ý„s?íET¾àÚi>ý„s?íET¾º1=Ūy?íET>º1=Ūy?íET>º1=Ūy?íET>Õ"‚=–°N?9+?Õ"‚=–°N?9+?Õ"‚=–°N?9+?!=FÍÿ>ù‡]?!=FÍÿ>ù‡]?!=FÍÿ>ù‡]?ŠÊ<4Ö=Ä–~?ŠÊ<4Ö=Ä–~?ŠÊ<4Ö=Ä–~?,ǼŒ+ž¾þes?,ǼŒ+ž¾þes?,ǼŒ+ž¾þes?gW½|+¿Pû=?gW½|+¿Pû=?gW½|+¿Pû=?DÞ’½òCi¿x¶Ï>DÞ’½òCi¿x¶Ï>DÞ’½òCi¿x¶Ï>¯ ½ô5¿¯ ½ô5¿¯ ½ô5¿¾Ý’½òCi¿x¶Ï¾¾Ý’½òCi¿x¶Ï¾¾Ý’½òCi¿x¶Ï¾gW½|+¿Pû=¿gW½|+¿Pû=¿gW½|+¿Pû=¿,ǼŒ+ž¾þes¿,ǼŒ+ž¾þes¿,ǼŒ+ž¾þes¿ŠÊ<4Ö=Ä–~¿ŠÊ<4Ö=Ä–~¿ŠÊ<4Ö=Ä–~¿!=FÍÿ>ù‡]¿!=FÍÿ>ù‡]¿!=FÍÿ>ù‡]¿Õ"‚=–°N?9+¿Õ"‚=–°N?9+¿Õ"‚=–°N?9+¿º1=Ūy?íET¾º1=Ūy?íET¾º1=Ūy?íET¾º1½Åªy?íET>º1½Åªy?íET>º1½Åªy?íET>Õ"‚½–°N?I+?Õ"‚½–°N?I+?Õ"‚½–°N?I+?!½FÍÿ>ù‡]?!½FÍÿ>ù‡]?!½FÍÿ>ù‡]?ŠÊ¼4Ö=Ä–~?ŠÊ¼4Ö=Ä–~?ŠÊ¼4Ö=Ä–~?,Ç<Œ+ž¾þes?,Ç<Œ+ž¾þes?,Ç<Œ+ž¾þes?hW=|+¿Pû=?hW=|+¿Pû=?hW=|+¿Pû=?DÞ’=òCi¿x¶Ï>DÞ’=òCi¿x¶Ï>DÞ’=òCi¿x¶Ï>¯ =ô5¿€¯ =ô5¿€¯ =ô5¿€¾Ý’=Di¿x¶Ï¾¾Ý’=Di¿x¶Ï¾¾Ý’=Di¿x¶Ï¾gW=|+¿Pû=¿gW=|+¿Pû=¿gW=|+¿Pû=¿,Çù‡]¿!½FÍÿ>ù‡]¿!½FÍÿ>ù‡]¿Õ"‚½–°N?9+¿Õ"‚½–°N?9+¿Õ"‚½–°N?9+¿º1½Åªy?íET¾º1½Åªy?íET¾º1½Åªy?íET¾àÚi¾ý„s?íET>àÚi¾ý„s?íET>àÚi¾ý„s?íET>x™A¾ª™I?I+?x™A¾ª™I?I+?x™A¾ª™I?I+?šï½Ô€ù>ù‡]?šï½Ô€ù>ù‡]?šï½Ô€ù>ù‡]?äȼ°ËÐ=Ä–~?äȼ°ËÐ=Ä–~?äȼ°ËÐ=Ä–~?þ&”=|Fš¾þes?þ&”=|Fš¾þes?þ&”=|Fš¾þes?ï9 >8Ù&¿Pû=?ï9 >8Ù&¿Pû=?ï9 >8Ù&¿Pû=?í}Z>”…c¿š¶Ï>í}Z>”…c¿š¶Ï>í}Z>”…c¿š¶Ï>x o>>íx¿€x o>>íx¿€x o>>íx¿€1~Z>”…c¿š¶Ï¾1~Z>”…c¿š¶Ï¾1~Z>”…c¿š¶Ï¾ï9 >8Ù&¿Pû=¿ï9 >8Ù&¿Pû=¿ï9 >8Ù&¿Pû=¿þ&”=|Fš¾þes¿þ&”=|Fš¾þes¿þ&”=|Fš¾þes¿äȼ°ËÐ=Ä–~¿äȼ°ËÐ=Ä–~¿äȼ°ËÐ=Ä–~¿šï½õ€ù>è‡]¿šï½õ€ù>è‡]¿šï½õ€ù>è‡]¿x™A¾ª™I?I+¿x™A¾ª™I?I+¿x™A¾ª™I?I+¿àÚi¾ý„s?íET¾àÚi¾ý„s?íET¾àÚi¾ý„s?íET¾Ž­¿¾(`g?0FT>Ž­¿¾(`g?0FT>Ž­¿¾(`g?0FT>À®ž¾Œ??I+?À®ž¾Œ??I+?À®ž¾Œ??I+?IcD¾¦í>è‡]?IcD¾¦í>è‡]?IcD¾¦í>è‡]?Y$½5bÆ=Ä–~?Y$½5bÆ=Ä–~?Y$½5bÆ=Ä–~?7Ýò=ÿ”’¾þes?7Ýò=ÿ”’¾þes?7Ýò=ÿ”’¾þes?Tƒ>+‡¿aû=?Tƒ>+‡¿aû=?Tƒ>+‡¿aû=?³>õ,X¿x¶Ï>³>õ,X¿x¶Ï>³>õ,X¿x¶Ï>ïÃ>fƒl¿€ïÃ>fƒl¿€ïÃ>fƒl¿€ù³>õ,X¿x¶Ï¾ù³>õ,X¿x¶Ï¾ù³>õ,X¿x¶Ï¾;Tƒ>‡¿aû=¿;Tƒ>‡¿aû=¿;Tƒ>‡¿aû=¿7Ýò=ÿ”’¾þes¿7Ýò=ÿ”’¾þes¿7Ýò=ÿ”’¾þes¿Y$½5bÆ=Ä–~¿Y$½5bÆ=Ä–~¿Y$½5bÆ=Ä–~¿IcD¾¦í>ù‡]¿IcD¾¦í>ù‡]¿IcD¾¦í>ù‡]¿À®ž¾Œ??I+¿À®ž¾Œ??I+¿À®ž¾Œ??I+¿Ž­¿¾(`g?íET¾Ž­¿¾(`g?íET¾Ž­¿¾(`g?íET¾©Ú¿ÓˆU?0FT>©Ú¿ÓˆU?0FT>©Ú¿ÓˆU?0FT>m¨Ø¾çÆ0?9+?m¨Ø¾çÆ0?9+?m¨Ø¾çÆ0?9+?܆¾ÈÚ>ù‡]?܆¾ÈÚ>ù‡]?܆¾ÈÚ>ù‡]?$d`½L·=Ä–~?$d`½L·=Ä–~?$d`½L·=Ä–~?BÌ%>sG‡¾þes?BÌ%>sG‡¾þes?BÌ%>sG‡¾þes?ƒO³>ÓM¿Pû=?ƒO³>ÓM¿Pû=?ƒO³>ÓM¿Pû=?íƒô>¶G¿š¶Ï>íƒô>¶G¿š¶Ï>íƒô>¶G¿š¶Ï>Â?FZ¿€Â?FZ¿€Â?FZ¿€„ô>¦G¿š¶Ï¾„ô>¦G¿š¶Ï¾„ô>¦G¿š¶Ï¾aO³>ÓM¿Pû=¿aO³>ÓM¿Pû=¿aO³>ÓM¿Pû=¿BÌ%>sG‡¾þes¿BÌ%>sG‡¾þes¿BÌ%>sG‡¾þes¿$d`½L·=Ä–~¿$d`½L·=Ä–~¿$d`½L·=Ä–~¿º†¾ÈÚ>ù‡]¿º†¾ÈÚ>ù‡]¿º†¾ÈÚ>ù‡]¿¨Ø¾çÆ0?9+¿¨Ø¾çÆ0?9+¿¨Ø¾çÆ0?9+¿˜Ú¿ÓˆU?0FT¾˜Ú¿ÓˆU?0FT¾˜Ú¿ÓˆU?0FT¾µ¥"¿ro>?íET>µ¥"¿ro>?íET>µ¥"¿ro>?íET>;¦¿n§?I+?;¦¿n§?I+?;¦¿n§?I+?줦¾qÃ>è‡]?줦¾qÃ>è‡]?줦¾qÃ>è‡]?Þt‹½éG£=Ä–~?Þt‹½éG£=Ä–~?Þt‹½éG£=Ä–~?N>MJq¾þes?N>MJq¾þes?N>MJq¾þes?àÞ>Bz¿Pû=?àÞ>Bz¿Pû=?àÞ>Bz¿Pû=?oö?Äì1¿x¶Ï>oö?Äì1¿x¶Ï>oö?Äì1¿x¶Ï>9B&?ø©B¿€9B&?ø©B¿€9B&?ø©B¿€^ö?Äì1¿x¶Ï¾^ö?Äì1¿x¶Ï¾^ö?Äì1¿x¶Ï¾àÞ>Bz¿Pû=¿àÞ>Bz¿Pû=¿àÞ>Bz¿Pû=¿N>MJq¾þes¿N>MJq¾þes¿N>MJq¾þes¿Þt‹½éG£=Ä–~¿Þt‹½éG£=Ä–~¿Þt‹½éG£=Ä–~¿ì¤¦¾qÃ>è‡]¿ì¤¦¾qÃ>è‡]¿ì¤¦¾qÃ>è‡]¿;¦¿n§?I+¿;¦¿n§?I+¿;¦¿n§?I+¿µ¥"¿ro>?íET¾µ¥"¿ro>?íET¾µ¥"¿ro>?íET¾ro>¿¤¥"?0FT>ro>¿¤¥"?0FT>ro>¿¤¥"?0FT>~§¿;¦?I+?~§¿;¦?I+?~§¿;¦?I+?qþʤ¦>ù‡]?qþʤ¦>ù‡]?qþʤ¦>ù‡]?éG£½Xt‹=Ä–~?éG£½Xt‹=Ä–~?éG£½Xt‹=Ä–~?MJq>N¾þes?MJq>N¾þes?MJq>N¾þes?Bz?nàÞ¾aû=?Bz?nàÞ¾aû=?Bz?nàÞ¾aû=?Äì1?^ö¿x¶Ï>Äì1?^ö¿x¶Ï>Äì1?^ö¿x¶Ï>ø©B?9B&¿€ø©B?9B&¿€ø©B?9B&¿€Õì1?Mö¿š¶Ï¾Õì1?Mö¿š¶Ï¾Õì1?Mö¿š¶Ï¾Bz?nàÞ¾aû=¿Bz?nàÞ¾aû=¿Bz?nàÞ¾aû=¿MJq>N¾þes¿MJq>N¾þes¿MJq>N¾þes¿éG£½Xt‹=Ä–~¿éG£½Xt‹=Ä–~¿éG£½Xt‹=Ä–~¿qþʤ¦>ù‡]¿qþʤ¦>ù‡]¿qþʤ¦>ù‡]¿~§¿;¦?I+¿~§¿;¦?I+¿~§¿;¦?I+¿ro>¿¤¥"?0FT¾ro>¿¤¥"?0FT¾ro>¿¤¥"?0FT¾ÓˆU¿©Ú?íET>ÓˆU¿©Ú?íET>ÓˆU¿©Ú?íET>çÆ0¿m¨Ø>9+?çÆ0¿m¨Ø>9+?çÆ0¿m¨Ø>9+?Èھ܆>è‡]?Èھ܆>è‡]?Èھ܆>è‡]?L·½$d`=Ä–~?L·½$d`=Ä–~?L·½$d`=Ä–~?sG‡>BÌ%¾þes?sG‡>BÌ%¾þes?sG‡>BÌ%¾þes?ÓM?ƒO³¾aû=?ÓM?ƒO³¾aû=?ÓM?ƒO³¾aû=?¦G?„ô¾š¶Ï>¦G?„ô¾š¶Ï>¦G?„ô¾š¶Ï>FZ?¿€FZ?¿€FZ?¿€¦G?„ô¾š¶Ï¾¦G?„ô¾š¶Ï¾¦G?„ô¾š¶Ï¾ÓM?ƒO³¾aû=¿ÓM?ƒO³¾aû=¿ÓM?ƒO³¾aû=¿sG‡>BÌ%¾þes¿sG‡>BÌ%¾þes¿sG‡>BÌ%¾þes¿L·½$d`=Ä–~¿L·½$d`=Ä–~¿L·½$d`=Ä–~¿Èھ܆>ù‡]¿Èھ܆>ù‡]¿Èھ܆>ù‡]¿çÆ0¿¨Ø>I+¿çÆ0¿¨Ø>I+¿çÆ0¿¨Ø>I+¿ÓˆU¿©Ú?íET¾ÓˆU¿©Ú?íET¾ÓˆU¿©Ú?íET¾(`g¿Ž­¿>0FT>(`g¿Ž­¿>0FT>(`g¿Ž­¿>0FT>Œ?¿â®ž>9+?Œ?¿â®ž>9+?Œ?¿â®ž>9+?¦í¾IcD>ù‡]?¦í¾IcD>ù‡]?¦í¾IcD>ù‡]?5bƽY$=Ä–~?5bƽY$=Ä–~?5bƽY$=Ä–~?ÿ”’>7Ýò½þes?ÿ”’>7Ýò½þes?ÿ”’>7Ýò½þes?‡?Tƒ¾aû=?‡?Tƒ¾aû=?‡?Tƒ¾aû=?õ,X?ù³¾x¶Ï>õ,X?ù³¾x¶Ï>õ,X?ù³¾x¶Ï>Vƒl?(ïþ€Vƒl?(ïþ€Vƒl?(ïþ€õ,X?ù³¾x¶Ï¾õ,X?ù³¾x¶Ï¾õ,X?ù³¾x¶Ï¾‡?Tƒ¾aû=¿‡?Tƒ¾aû=¿‡?Tƒ¾aû=¿ÿ”’>7Ýò½þes¿ÿ”’>7Ýò½þes¿ÿ”’>7Ýò½þes¿5bƽY$=Ä–~¿5bƽY$=Ä–~¿5bƽY$=Ä–~¿¦í¾IcD>ù‡]¿¦í¾IcD>ù‡]¿¦í¾IcD>ù‡]¿Œ?¿À®ž>9+¿Œ?¿À®ž>9+¿Œ?¿À®ž>9+¿(`g¿Ž­¿>0FT¾(`g¿Ž­¿>0FT¾(`g¿Ž­¿>0FT¾ý„s¿àÚi>0FT>ý„s¿àÚi>0FT>ý„s¿àÚi>0FT>»™I¿x™A>9+?»™I¿x™A>9+?»™I¿x™A>9+?Ô€ù¾šï=ù‡]?Ô€ù¾šï=ù‡]?Ô€ù¾šï=ù‡]?°ËнäÈ<Ä–~?°ËнäÈ<Ä–~?°ËнäÈ<Ä–~?|Fš>…'”½þes?|Fš>…'”½þes?|Fš>…'”½þes?'Ù&?ï9 ¾aû=?'Ù&?ï9 ¾aû=?'Ù&?ï9 ¾aû=?”…c?í}Z¾x¶Ï>”…c?í}Z¾x¶Ï>”…c?í}Z¾x¶Ï>>íx?5 o¾€>íx?5 o¾€>íx?5 o¾€”…c?1~Z¾x¶Ï¾”…c?1~Z¾x¶Ï¾”…c?1~Z¾x¶Ï¾'Ù&?2: ¾aû=¿'Ù&?2: ¾aû=¿'Ù&?2: ¾aû=¿|Fš>þ&”½þes¿|Fš>þ&”½þes¿|Fš>þ&”½þes¿°ËнäÈ<Ä–~¿°ËнäÈ<Ä–~¿°ËнäÈ<Ä–~¿õ€ù¾€™ï=è‡]¿õ€ù¾€™ï=è‡]¿õ€ù¾€™ï=è‡]¿»™I¿x™A>9+¿»™I¿x™A>9+¿»™I¿x™A>9+¿ý„s¿àÚi>0FT¾ý„s¿àÚi>0FT¾ý„s¿àÚi>0FT¾Åªy¿º1=íET>Ūy¿º1=íET>Ūy¿º1=íET>–°N¿O"‚=I+?–°N¿O"‚=I+?–°N¿O"‚=I+?FÍÿ¾!=ù‡]?FÍÿ¾!=ù‡]?FÍÿ¾!=ù‡]?4Ö½XÆ<Ä–~?4Ö½XÆ<Ä–~?4Ö½XÆ<Ä–~?Œ+ž>,Ǽþes?Œ+ž>,Ǽþes?Œ+ž>,Ǽþes?|+?gW½Pû=?|+?gW½Pû=?|+?gW½Pû=?òCi?DÞ’½x¶Ï>òCi?DÞ’½x¶Ï>òCi?DÞ’½x¶Ï>ô5?¯ ½€ô5?¯ ½€ô5?¯ ½€òCi?¾Ý’½x¶Ï¾òCi?¾Ý’½x¶Ï¾òCi?¾Ý’½x¶Ï¾|+?gW½aû=¿|+?gW½aû=¿|+?gW½aû=¿Œ+ž>,Ǽþes¿Œ+ž>,Ǽþes¿Œ+ž>,Ǽþes¿4Ö½XÆ<Ä–~¿4Ö½XÆ<Ä–~¿4Ö½XÆ<Ä–~¿FÍÿ¾!=ù‡]¿FÍÿ¾!=ù‡]¿FÍÿ¾!=ù‡]¿–°N¿Õ"‚=I+¿–°N¿Õ"‚=I+¿–°N¿Õ"‚=I+¿Åªy¿º1=íET¾Åªy¿º1=íET¾Åªy¿º1=íET¾Åªy¿31½0FT>Ūy¿31½0FT>Ūy¿31½0FT>–°N¿O"‚½9+?–°N¿O"‚½9+?–°N¿O"‚½9+?FÍÿ¾!½ù‡]?FÍÿ¾!½ù‡]?FÍÿ¾!½ù‡]?4Ö½XƼĖ~?4Ö½XƼĖ~?4Ö½XƼĖ~?Œ+ž>,Ç<þes?Œ+ž>,Ç<þes?Œ+ž>,Ç<þes?|+?gW=Pû=?|+?gW=Pû=?|+?gW=Pû=?òCi?¾Ý’=x¶Ï>òCi?¾Ý’=x¶Ï>òCi?¾Ý’=x¶Ï>ô5?¯ =ô5?¯ =ô5?¯ =òCi?¾Ý’=x¶Ï¾òCi?¾Ý’=x¶Ï¾òCi?¾Ý’=x¶Ï¾|+?gW=aû=¿|+?gW=aû=¿|+?gW=aû=¿Œ+ž>,Ç<þes¿Œ+ž>,Ç<þes¿Œ+ž>,Ç<þes¿4Ö½XƼĖ~¿4Ö½XƼĖ~¿4Ö½XƼĖ~¿FÍÿ¾!½ù‡]¿FÍÿ¾!½ù‡]¿FÍÿ¾!½ù‡]¿–°N¿O"‚½9+¿–°N¿O"‚½9+¿–°N¿O"‚½9+¿Åªy¿31½0FT¾Åªy¿31½0FT¾Åªy¿31½0FT¾ý„s¿àÚi¾íET>ý„s¿àÚi¾íET>ý„s¿àÚi¾íET>»™I¿»™A¾9+?»™I¿»™A¾9+?»™I¿»™A¾9+?Ô€ù¾šï½ù‡]?Ô€ù¾šï½ù‡]?Ô€ù¾šï½ù‡]?°ËнäȼĖ~?°ËнäȼĖ~?°ËнäȼĖ~?|Fš>þ&”=þes?|Fš>þ&”=þes?|Fš>þ&”=þes?'Ù&?ï9 >aû=?'Ù&?ï9 >aû=?'Ù&?ï9 >aû=?”…c?1~Z>x¶Ï>”…c?1~Z>x¶Ï>”…c?1~Z>x¶Ï>>íx?5 o>>íx?5 o>>íx?5 o>”…c?í}Z>x¶Ï¾”…c?í}Z>x¶Ï¾”…c?í}Z>x¶Ï¾'Ù&?2: >aû=¿'Ù&?2: >aû=¿'Ù&?2: >aû=¿|Fš>þ&”=þes¿|Fš>þ&”=þes¿|Fš>þ&”=þes¿°ËнäȼĖ~¿°ËнäȼĖ~¿°ËнäȼĖ~¿Ô€ù¾šï½ù‡]¿Ô€ù¾šï½ù‡]¿Ô€ù¾šï½ù‡]¿»™I¿»™A¾9+¿»™I¿»™A¾9+¿»™I¿»™A¾9+¿ý„s¿#Ûi¾íET¾ý„s¿#Ûi¾íET¾ý„s¿#Ûi¾íET¾(`g¿m­¿¾0FT>(`g¿m­¿¾0FT>(`g¿m­¿¾0FT>Œ?¿À®ž¾9+?Œ?¿À®ž¾9+?Œ?¿À®ž¾9+?¦í¾IcD¾ù‡]?¦í¾IcD¾ù‡]?¦í¾IcD¾ù‡]?5bƽY$½Ä–~?5bƽY$½Ä–~?5bƽY$½Ä–~?ÿ”’>7Ýò=þes?ÿ”’>7Ýò=þes?ÿ”’>7Ýò=þes?+‡?;Tƒ>Pû=?+‡?;Tƒ>Pû=?+‡?;Tƒ>Pû=?õ,X?׳>x¶Ï>õ,X?׳>x¶Ï>õ,X?׳>x¶Ï>fƒl?ïÃ>fƒl?ïÃ>fƒl?ïÃ>õ,X?׳>x¶Ï¾õ,X?׳>x¶Ï¾õ,X?׳>x¶Ï¾+‡?Tƒ>Pû=¿+‡?Tƒ>Pû=¿+‡?Tƒ>Pû=¿Ý”’>7Ýò=þes¿Ý”’>7Ýò=þes¿Ý”’>7Ýò=þes¿5bƽY$½Ä–~¿5bƽY$½Ä–~¿5bƽY$½Ä–~¿¦í¾IcD¾ù‡]¿¦í¾IcD¾ù‡]¿¦í¾IcD¾ù‡]¿Œ?¿À®ž¾9+¿Œ?¿À®ž¾9+¿Œ?¿À®ž¾9+¿(`g¿m­¿¾0FT¾(`g¿m­¿¾0FT¾(`g¿m­¿¾0FT¾ÓˆU¿©Ú¿0FT>ÓˆU¿©Ú¿0FT>ÓˆU¿©Ú¿0FT>çÆ0¿m¨Ø¾9+?çÆ0¿m¨Ø¾9+?çÆ0¿m¨Ø¾9+?Èھ܆¾ù‡]?Èھ܆¾ù‡]?Èھ܆¾ù‡]?L·½$d`½Ä–~?L·½$d`½Ä–~?L·½$d`½Ä–~?sG‡>BÌ%>þes?sG‡>BÌ%>þes?sG‡>BÌ%>þes?ÓM?aO³>aû=?ÓM?aO³>aû=?ÓM?aO³>aû=?¦G?íƒô>š¶Ï>¦G?íƒô>š¶Ï>¦G?íƒô>š¶Ï>FZ?Â?FZ?Â?FZ?Â?¦G?„ô>š¶Ï¾¦G?„ô>š¶Ï¾¦G?„ô>š¶Ï¾ÓM?ƒO³>aû=¿ÓM?ƒO³>aû=¿ÓM?ƒO³>aû=¿sG‡>BÌ%>þes¿sG‡>BÌ%>þes¿sG‡>BÌ%>þes¿L·½$d`½Ä–~¿L·½$d`½Ä–~¿L·½$d`½Ä–~¿Èھ܆¾ù‡]¿Èھ܆¾ù‡]¿Èھ܆¾ù‡]¿çÆ0¿¨Ø¾9+¿çÆ0¿¨Ø¾9+¿çÆ0¿¨Ø¾9+¿ÓˆU¿˜Ú¿0FT¾ÓˆU¿˜Ú¿0FT¾ÓˆU¿˜Ú¿0FT¾ro>¿¤¥"¿íET>ro>¿¤¥"¿íET>ro>¿¤¥"¿íET>~§¿;¦¿9+?~§¿;¦¿9+?~§¿;¦¿9+?qþʤ¦¾è‡]?qþʤ¦¾è‡]?qþʤ¦¾è‡]?éG£½Xt‹½Ä–~?éG£½Xt‹½Ä–~?éG£½Xt‹½Ä–~?MJq>¾N>þes?MJq>¾N>þes?MJq>¾N>þes?Bz?àÞ>Pû=?Bz?àÞ>Pû=?Bz?àÞ>Pû=?Äì1?^ö?x¶Ï>Äì1?^ö?x¶Ï>Äì1?^ö?x¶Ï>ø©B?9B&?ø©B?9B&?ø©B?9B&?Õì1?Mö?x¶Ï¾Õì1?Mö?x¶Ï¾Õì1?Mö?x¶Ï¾Bz?nàÞ>Pû=¿Bz?nàÞ>Pû=¿Bz?nàÞ>Pû=¿MJq>N>þes¿MJq>N>þes¿MJq>N>þes¿éG£½Xt‹½Ä–~¿éG£½Xt‹½Ä–~¿éG£½Xt‹½Ä–~¿qþʤ¦¾è‡]¿qþʤ¦¾è‡]¿qþʤ¦¾è‡]¿~§¿;¦¿I+¿~§¿;¦¿I+¿~§¿;¦¿I+¿ro>¿¤¥"¿íET¾ro>¿¤¥"¿íET¾ro>¿¤¥"¿íET¾µ¥"¿ro>¿0FT>µ¥"¿ro>¿0FT>µ¥"¿ro>¿0FT>L¦¿n§¿I+?L¦¿n§¿I+?L¦¿n§¿I+?줦¾qþè‡]?줦¾qþè‡]?줦¾qþè‡]?Þt‹½éG£½Ä–~?Þt‹½éG£½Ä–~?Þt‹½éG£½Ä–~?N>MJq>þes?N>MJq>þes?N>MJq>þes?àÞ>Bz?Pû=?àÞ>Bz?Pû=?àÞ>Bz?Pû=?^ö?Äì1?š¶Ï>^ö?Äì1?š¶Ï>^ö?Äì1?š¶Ï>JB&?ø©B?JB&?ø©B?JB&?ø©B?^ö?Äì1?š¶Ï¾^ö?Äì1?š¶Ï¾^ö?Äì1?š¶Ï¾àÞ>Bz?Pû=¿àÞ>Bz?Pû=¿àÞ>Bz?Pû=¿N>MJq>þes¿N>MJq>þes¿N>MJq>þes¿Þt‹½éG£½Ä–~¿Þt‹½éG£½Ä–~¿Þt‹½éG£½Ä–~¿ì¤¦¾qþè‡]¿ì¤¦¾qþè‡]¿ì¤¦¾qþè‡]¿;¦¿n§¿I+¿;¦¿n§¿I+¿;¦¿n§¿I+¿µ¥"¿ro>¿0FT¾µ¥"¿ro>¿0FT¾µ¥"¿ro>¿0FT¾©Ú¿ÓˆU¿íET>©Ú¿ÓˆU¿íET>©Ú¿ÓˆU¿íET>m¨Ø¾çÆ0¿I+?m¨Ø¾çÆ0¿I+?m¨Ø¾çÆ0¿I+?܆¾ÈÚ¾ù‡]?܆¾ÈÚ¾ù‡]?܆¾ÈÚ¾ù‡]?$d`½L·½Ä–~?$d`½L·½Ä–~?$d`½L·½Ä–~?BÌ%>sG‡>þes?BÌ%>sG‡>þes?BÌ%>sG‡>þes?ƒO³>ÓM?aû=?ƒO³>ÓM?aû=?ƒO³>ÓM?aû=?íƒô>¶G?x¶Ï>íƒô>¶G?x¶Ï>íƒô>¶G?x¶Ï>Â?FZ?Â?FZ?Â?FZ?„ô>¶G?x¶Ï¾„ô>¶G?x¶Ï¾„ô>¶G?x¶Ï¾aO³>ÓM?aû=¿aO³>ÓM?aû=¿aO³>ÓM?aû=¿…Ì%>sG‡>þes¿…Ì%>sG‡>þes¿…Ì%>sG‡>þes¿$d`½L·½Ä–~¿$d`½L·½Ä–~¿$d`½L·½Ä–~¿º†¾ÈÚ¾ù‡]¿º†¾ÈÚ¾ù‡]¿º†¾ÈÚ¾ù‡]¿m¨Ø¾çÆ0¿I+¿m¨Ø¾çÆ0¿I+¿m¨Ø¾çÆ0¿I+¿˜Ú¿ÓˆU¿íET¾˜Ú¿ÓˆU¿íET¾˜Ú¿ÓˆU¿íET¾Ž­¿¾(`g¿0FT>Ž­¿¾(`g¿0FT>Ž­¿¾(`g¿0FT>⮞¾Œ?¿9+?⮞¾Œ?¿9+?⮞¾Œ?¿9+?IcD¾¦í¾ù‡]?IcD¾¦í¾ù‡]?IcD¾¦í¾ù‡]?Y$½5bƽĖ~?Y$½5bƽĖ~?Y$½5bƽĖ~?7Ýò=ÿ”’>þes?7Ýò=ÿ”’>þes?7Ýò=ÿ”’>þes?Tƒ>+‡?Pû=?Tƒ>+‡?Pû=?Tƒ>+‡?Pû=?ù³>õ,X?š¶Ï>ù³>õ,X?š¶Ï>ù³>õ,X?š¶Ï>ïÃ>fƒl?ïÃ>fƒl?ïÃ>fƒl?ù³>õ,X?š¶Ï¾ù³>õ,X?š¶Ï¾ù³>õ,X?š¶Ï¾;Tƒ>+‡?Pû=¿;Tƒ>+‡?Pû=¿;Tƒ>+‡?Pû=¿7Ýò=ÿ”’>þes¿7Ýò=ÿ”’>þes¿7Ýò=ÿ”’>þes¿Y$½5bƽĖ~¿Y$½5bƽĖ~¿Y$½5bƽĖ~¿IcD¾¦í¾ù‡]¿IcD¾¦í¾ù‡]¿IcD¾¦í¾ù‡]¿À®ž¾Œ?¿9+¿À®ž¾Œ?¿9+¿À®ž¾Œ?¿9+¿Ž­¿¾(`g¿0FT¾Ž­¿¾(`g¿0FT¾Ž­¿¾(`g¿0FT¾àÚi¾ý„s¿íET>àÚi¾ý„s¿íET>àÚi¾ý„s¿íET>x™A¾»™I¿9+?x™A¾»™I¿9+?x™A¾»™I¿9+?šï½Ô€ù¾ù‡]?šï½Ô€ù¾ù‡]?šï½Ô€ù¾ù‡]?äȼ°ËнĖ~?äȼ°ËнĖ~?äȼ°ËнĖ~?þ&”=|Fš>þes?þ&”=|Fš>þes?þ&”=|Fš>þes?ï9 >8Ù&?Pû=?ï9 >8Ù&?Pû=?ï9 >8Ù&?Pû=?í}Z>”…c?x¶Ï>í}Z>”…c?x¶Ï>í}Z>”…c?x¶Ï>x o>>íx?x o>>íx?x o>>íx?1~Z>”…c?x¶Ï¾1~Z>”…c?x¶Ï¾1~Z>”…c?x¶Ï¾ï9 >8Ù&?Pû=¿ï9 >8Ù&?Pû=¿ï9 >8Ù&?Pû=¿þ&”=|Fš>fs¿þ&”=|Fš>fs¿þ&”=|Fš>fs¿äȼ°ËнĖ~¿äȼ°ËнĖ~¿äȼ°ËнĖ~¿šï½õ€ù¾è‡]¿šï½õ€ù¾è‡]¿šï½õ€ù¾è‡]¿x™A¾»™I¿9+¿x™A¾»™I¿9+¿x™A¾»™I¿9+¿àÚi¾ý„s¿íET¾àÚi¾ý„s¿íET¾àÚi¾ý„s¿íET¾º1½Åªy¿íET>º1½Åªy¿íET>º1½Åªy¿íET>Õ"‚½–°N¿I+?Õ"‚½–°N¿I+?Õ"‚½–°N¿I+?!½FÍÿ¾ù‡]?!½FÍÿ¾ù‡]?!½FÍÿ¾ù‡]?ŠÊ¼4ֽĖ~?ŠÊ¼4ֽĖ~?ŠÊ¼4ֽĖ~?,Ç<Œ+ž>þes?,Ç<Œ+ž>þes?,Ç<Œ+ž>þes?hW=k+?aû=?hW=k+?aû=?hW=k+?aû=?DÞ’=òCi?x¶Ï>DÞ’=òCi?x¶Ï>DÞ’=òCi?x¶Ï>¯ =ô5?¯ =ô5?¯ =ô5?¾Ý’=òCi?x¶Ï¾¾Ý’=òCi?x¶Ï¾¾Ý’=òCi?x¶Ï¾gW=|+?aû=¿gW=|+?aû=¿gW=|+?aû=¿,Çþes¿,Çþes¿,Çþes¿ŠÊ¼4ֽĖ~¿ŠÊ¼4ֽĖ~¿ŠÊ¼4ֽĖ~¿!½FÍÿ¾ù‡]¿!½FÍÿ¾ù‡]¿!½FÍÿ¾ù‡]¿Õ"‚½–°N¿9+¿Õ"‚½–°N¿9+¿Õ"‚½–°N¿9+¿º1½Åªy¿íET¾º1½Åªy¿íET¾º1½Åªy¿íET¾º1=Ūy¿íET>º1=Ūy¿íET>º1=Ūy¿íET>Õ"‚=–°N¿I+?Õ"‚=–°N¿I+?Õ"‚=–°N¿I+?!=FÍÿ¾ù‡]?!=FÍÿ¾ù‡]?!=FÍÿ¾ù‡]?XÆ<4ֽĖ~?XÆ<4ֽĖ~?XÆ<4ֽĖ~?,ǼŒ+ž>þes?,ǼŒ+ž>þes?,ǼŒ+ž>þes?gW½|+?aû=?gW½|+?aû=?gW½|+?aû=?DÞ’½òCi?x¶Ï>DÞ’½òCi?x¶Ï>DÞ’½òCi?x¶Ï>¯ ½ô5?¯ ½ô5?¯ ½ô5?¾Ý’½òCi?x¶Ï¾¾Ý’½òCi?x¶Ï¾¾Ý’½òCi?x¶Ï¾gW½|+?aû=¿gW½|+?aû=¿gW½|+?aû=¿,ǼŒ+ž>þes¿,ǼŒ+ž>þes¿,ǼŒ+ž>þes¿ŠÊ<4ֽĖ~¿ŠÊ<4ֽĖ~¿ŠÊ<4ֽĖ~¿!=FÍÿ¾ù‡]¿!=FÍÿ¾ù‡]¿!=FÍÿ¾ù‡]¿Õ"‚=–°N¿I+¿Õ"‚=–°N¿I+¿Õ"‚=–°N¿I+¿º1=Ūy¿íET¾º1=Ūy¿íET¾º1=Ūy¿íET¾àÚi>ý„s¿íET>àÚi>ý„s¿íET>àÚi>ý„s¿íET>x™A>»™I¿9+?x™A>»™I¿9+?x™A>»™I¿9+?šï=Ô€ù¾ù‡]?šï=Ô€ù¾ù‡]?šï=Ô€ù¾ù‡]?äÈ<°ËнĖ~?äÈ<°ËнĖ~?äÈ<°ËнĖ~?þ&”½|Fš>þes?þ&”½|Fš>þes?þ&”½|Fš>þes?2: ¾8Ù&?Pû=?2: ¾8Ù&?Pû=?2: ¾8Ù&?Pû=?1~Z¾”…c?x¶Ï>1~Z¾”…c?x¶Ï>1~Z¾”…c?x¶Ï>x o¾>íx?x o¾>íx?x o¾>íx?1~Z¾”…c?x¶Ï¾1~Z¾”…c?x¶Ï¾1~Z¾”…c?x¶Ï¾2: ¾'Ù&?Pû=¿2: ¾'Ù&?Pû=¿2: ¾'Ù&?Pû=¿þ&”½|Fš>þes¿þ&”½|Fš>þes¿þ&”½|Fš>þes¿äÈ<°ËнĖ~¿äÈ<°ËнĖ~¿äÈ<°ËнĖ~¿šï=Ô€ù¾ù‡]¿šï=Ô€ù¾ù‡]¿šï=Ô€ù¾ù‡]¿x™A>»™I¿9+¿x™A>»™I¿9+¿x™A>»™I¿9+¿àÚi>ý„s¿íET¾àÚi>ý„s¿íET¾àÚi>ý„s¿íET¾Ž­¿>(`g¿íET>Ž­¿>(`g¿íET>Ž­¿>(`g¿íET>⮞>Œ?¿9+?⮞>Œ?¿9+?⮞>Œ?¿9+?IcD>„í¾ù‡]?IcD>„í¾ù‡]?IcD>„í¾ù‡]?Y$=5bƽĖ~?Y$=5bƽĖ~?Y$=5bƽĖ~?7Ýò½ÿ”’>þes?7Ýò½ÿ”’>þes?7Ýò½ÿ”’>þes?;Tƒ¾‡?aû=?;Tƒ¾‡?aû=?;Tƒ¾‡?aû=?ù³¾õ,X?x¶Ï>ù³¾õ,X?x¶Ï>ù³¾õ,X?x¶Ï>(ïþVƒl?(ïþVƒl?(ïþVƒl?ù³¾õ,X?x¶Ï¾ù³¾õ,X?x¶Ï¾ù³¾õ,X?x¶Ï¾Tƒ¾‡?aû=¿Tƒ¾‡?aû=¿Tƒ¾‡?aû=¿¾Ýò½ÿ”’>þes¿¾Ýò½ÿ”’>þes¿¾Ýò½ÿ”’>þes¿Y$=5bƽĖ~¿Y$=5bƽĖ~¿Y$=5bƽĖ~¿IcD>¦í¾ù‡]¿IcD>¦í¾ù‡]¿IcD>¦í¾ù‡]¿â®ž>Œ?¿9+¿â®ž>Œ?¿9+¿â®ž>Œ?¿9+¿Ž­¿>(`g¿íET¾Ž­¿>(`g¿íET¾Ž­¿>(`g¿íET¾˜Ú?ÓˆU¿0FT>˜Ú?ÓˆU¿0FT>˜Ú?ÓˆU¿0FT>m¨Ø>çÆ0¿9+?m¨Ø>çÆ0¿9+?m¨Ø>çÆ0¿9+?º†>ÈÚ¾ù‡]?º†>ÈÚ¾ù‡]?º†>ÈÚ¾ù‡]?$d`=L·½Ä–~?$d`=L·½Ä–~?$d`=L·½Ä–~?BÌ%¾sG‡>þes?BÌ%¾sG‡>þes?BÌ%¾sG‡>þes?aO³¾ÓM?Pû=?aO³¾ÓM?Pû=?aO³¾ÓM?Pû=?íƒô¾¶G?š¶Ï>íƒô¾¶G?š¶Ï>íƒô¾¶G?š¶Ï>n¿®FZ?n¿®FZ?n¿®FZ?íƒô¾¶G?š¶Ï¾íƒô¾¶G?š¶Ï¾íƒô¾¶G?š¶Ï¾ƒO³¾ÓM?Pû=¿ƒO³¾ÓM?Pû=¿ƒO³¾ÓM?Pû=¿BÌ%¾sG‡>þes¿BÌ%¾sG‡>þes¿BÌ%¾sG‡>þes¿$d`=L·½Ä–~¿$d`=L·½Ä–~¿$d`=L·½Ä–~¿º†>ÈÚ¾ù‡]¿º†>ÈÚ¾ù‡]¿º†>ÈÚ¾ù‡]¿m¨Ø>çÆ0¿9+¿m¨Ø>çÆ0¿9+¿m¨Ø>çÆ0¿9+¿˜Ú?ÓˆU¿0FT¾˜Ú?ÓˆU¿0FT¾˜Ú?ÓˆU¿0FT¾µ¥"?ro>¿0FT>µ¥"?ro>¿0FT>µ¥"?ro>¿0FT>;¦?~§¿9+?;¦?~§¿9+?;¦?~§¿9+?ʤ¦>qþù‡]?ʤ¦>qþù‡]?ʤ¦>qþù‡]?Xt‹=éG£½Ä–~?Xt‹=éG£½Ä–~?Xt‹=éG£½Ä–~?¾N¾MJq>þes?¾N¾MJq>þes?¾N¾MJq>þes?nàÞ¾Bz?Pû=?nàÞ¾Bz?Pû=?nàÞ¾Bz?Pû=?Mö¿Õì1?x¶Ï>Mö¿Õì1?x¶Ï>Mö¿Õì1?x¶Ï>9B&¿ø©B?9B&¿ø©B?9B&¿ø©B?^ö¿Õì1?x¶Ï¾^ö¿Õì1?x¶Ï¾^ö¿Õì1?x¶Ï¾nàÞ¾Bz?aû=¿nàÞ¾Bz?aû=¿nàÞ¾Bz?aû=¿¾N¾MJq>þes¿¾N¾MJq>þes¿¾N¾MJq>þes¿Xt‹=éG£½Ä–~¿Xt‹=éG£½Ä–~¿Xt‹=éG£½Ä–~¿Ê¤¦>qþù‡]¿Ê¤¦>qþù‡]¿Ê¤¦>qþù‡]¿;¦?~§¿9+¿;¦?~§¿9+¿;¦?~§¿9+¿¤¥"?ro>¿0FT¾¤¥"?ro>¿0FT¾¤¥"?ro>¿0FT¾ro>?µ¥"¿íET>ro>?µ¥"¿íET>ro>?µ¥"¿íET>n§?;¦¿I+?n§?;¦¿I+?n§?;¦¿I+?qÃ>ʤ¦¾è‡]?qÃ>ʤ¦¾è‡]?qÃ>ʤ¦¾è‡]?éG£=Xt‹½Ä–~?éG£=Xt‹½Ä–~?éG£=Xt‹½Ä–~?MJq¾¾N>þes?MJq¾¾N>þes?MJq¾¾N>þes?Bz¿nàÞ>Pû=?Bz¿nàÞ>Pû=?Bz¿nàÞ>Pû=?Äì1¿^ö?x¶Ï>Äì1¿^ö?x¶Ï>Äì1¿^ö?x¶Ï>ø©B¿9B&?ø©B¿9B&?ø©B¿9B&?Äì1¿^ö?š¶Ï¾Äì1¿^ö?š¶Ï¾Äì1¿^ö?š¶Ï¾Bz¿nàÞ>Pû=¿Bz¿nàÞ>Pû=¿Bz¿nàÞ>Pû=¿MJq¾¾N>þes¿MJq¾¾N>þes¿MJq¾¾N>þes¿éG£=Xt‹½Ä–~¿éG£=Xt‹½Ä–~¿éG£=Xt‹½Ä–~¿qÃ>ʤ¦¾è‡]¿qÃ>ʤ¦¾è‡]¿qÃ>ʤ¦¾è‡]¿n§?;¦¿I+¿n§?;¦¿I+¿n§?;¦¿I+¿ro>?µ¥"¿íET¾ro>?µ¥"¿íET¾ro>?µ¥"¿íET¾ÓˆU?©Ú¿0FT>ÓˆU?©Ú¿0FT>ÓˆU?©Ú¿0FT>çÆ0?m¨Ø¾9+?çÆ0?m¨Ø¾9+?çÆ0?m¨Ø¾9+?ÈÚ>܆¾ù‡]?ÈÚ>܆¾ù‡]?ÈÚ>܆¾ù‡]?L·=$d`½Ä–~?L·=$d`½Ä–~?L·=$d`½Ä–~?sG‡¾BÌ%>fs?sG‡¾BÌ%>fs?sG‡¾BÌ%>fs?ÓM¿ƒO³>Pû=?ÓM¿ƒO³>Pû=?ÓM¿ƒO³>Pû=?¦G¿„ô>x¶Ï>¦G¿„ô>x¶Ï>¦G¿„ô>x¶Ï>FZ¿Â?FZ¿Â?FZ¿Â?¦G¿„ô>x¶Ï¾¦G¿„ô>x¶Ï¾¦G¿„ô>x¶Ï¾ÓM¿ƒO³>Pû=¿ÓM¿ƒO³>Pû=¿ÓM¿ƒO³>Pû=¿RG‡¾…Ì%>þes¿RG‡¾…Ì%>þes¿RG‡¾…Ì%>þes¿L·=$d`½Ä–~¿L·=$d`½Ä–~¿L·=$d`½Ä–~¿ÈÚ>܆¾ù‡]¿ÈÚ>܆¾ù‡]¿ÈÚ>܆¾ù‡]¿çÆ0?¨Ø¾9+¿çÆ0?¨Ø¾9+¿çÆ0?¨Ø¾9+¿ÓˆU?˜Ú¿0FT¾ÓˆU?˜Ú¿0FT¾ÓˆU?˜Ú¿0FT¾(`g?Ž­¿¾íET>(`g?Ž­¿¾íET>(`g?Ž­¿¾íET>Œ??⮞¾9+?Œ??⮞¾9+?Œ??⮞¾9+?¦í>IcD¾ù‡]?¦í>IcD¾ù‡]?¦í>IcD¾ù‡]?5bÆ=Y$½Ä–~?5bÆ=Y$½Ä–~?5bÆ=Y$½Ä–~?ÿ”’¾¾Ýò=þes?ÿ”’¾¾Ýò=þes?ÿ”’¾¾Ýò=þes?+‡¿;Tƒ>Pû=?+‡¿;Tƒ>Pû=?+‡¿;Tƒ>Pû=?õ,X¿³>x¶Ï>õ,X¿³>x¶Ï>õ,X¿³>x¶Ï>Vƒl¿(ïÃ>Vƒl¿(ïÃ>Vƒl¿(ïÃ>õ,X¿ù³>x¶Ï¾õ,X¿ù³>x¶Ï¾õ,X¿ù³>x¶Ï¾‡¿;Tƒ>Pû=¿‡¿;Tƒ>Pû=¿‡¿;Tƒ>Pû=¿ÿ”’¾7Ýò=fs¿ÿ”’¾7Ýò=fs¿ÿ”’¾7Ýò=fs¿5bÆ=Y$½Ä–~¿5bÆ=Y$½Ä–~¿5bÆ=Y$½Ä–~¿¦í>IcD¾ù‡]¿¦í>IcD¾ù‡]¿¦í>IcD¾ù‡]¿Œ??⮞¾9+¿Œ??⮞¾9+¿Œ??⮞¾9+¿(`g?Ž­¿¾íET¾(`g?Ž­¿¾íET¾(`g?Ž­¿¾íET¾ý„s?#Ûi¾íET>ý„s?#Ûi¾íET>ý„s?#Ûi¾íET>ª™I?»™A¾I+?ª™I?»™A¾I+?ª™I?»™A¾I+?Ô€ù>šï½ù‡]?Ô€ù>šï½ù‡]?Ô€ù>šï½ù‡]?°ËÐ=äȼĖ~?°ËÐ=äȼĖ~?°ËÐ=äȼĖ~?|Fš¾þ&”=þes?|Fš¾þ&”=þes?|Fš¾þ&”=þes?8Ù&¿2: >Pû=?8Ù&¿2: >Pû=?8Ù&¿2: >Pû=?”…c¿í}Z>š¶Ï>”…c¿í}Z>š¶Ï>”…c¿í}Z>š¶Ï>>íx¿x o>>íx¿x o>>íx¿x o>”…c¿1~Z>š¶Ï¾”…c¿1~Z>š¶Ï¾”…c¿1~Z>š¶Ï¾8Ù&¿ï9 >Pû=¿8Ù&¿ï9 >Pû=¿8Ù&¿ï9 >Pû=¿|Fš¾þ&”=þes¿|Fš¾þ&”=þes¿|Fš¾þ&”=þes¿°ËÐ=äȼĖ~¿°ËÐ=äȼĖ~¿°ËÐ=äȼĖ~¿Ô€ù>šï½ù‡]¿Ô€ù>šï½ù‡]¿Ô€ù>šï½ù‡]¿»™I?»™A¾I+¿»™I?»™A¾I+¿»™I?»™A¾I+¿ý„s?#Ûi¾íET¾ý„s?#Ûi¾íET¾ý„s?#Ûi¾íET¾Åªy?º1½0FT>Ūy?º1½0FT>Ūy?º1½0FT>–°N?Õ"‚½9+?–°N?Õ"‚½9+?–°N?Õ"‚½9+?FÍÿ>!½ù‡]?FÍÿ>!½ù‡]?FÍÿ>!½ù‡]?4Ö=XƼĖ~?4Ö=XƼĖ~?4Ö=XƼĖ~?Œ+ž¾,Ç<þes?Œ+ž¾,Ç<þes?Œ+ž¾,Ç<þes?|+¿gW=aû=?|+¿gW=aû=?|+¿gW=aû=?Di¿DÞ’=x¶Ï>Di¿DÞ’=x¶Ï>Di¿DÞ’=x¶Ï>ô5¿¯ =ô5¿¯ =ô5¿¯ =Di¿DÞ’=x¶Ï¾Di¿DÞ’=x¶Ï¾Di¿DÞ’=x¶Ï¾|+¿gW=aû=¿|+¿gW=aû=¿|+¿gW=aû=¿Œ+ž¾,Ç<þes¿Œ+ž¾,Ç<þes¿Œ+ž¾,Ç<þes¿4Ö=XƼĖ~¿4Ö=XƼĖ~¿4Ö=XƼĖ~¿FÍÿ>!½ù‡]¿FÍÿ>!½ù‡]¿FÍÿ>!½ù‡]¿–°N?Õ"‚½9+¿–°N?Õ"‚½9+¿–°N?Õ"‚½9+¿Åªy?º1½0FT¾Åªy?º1½0FT¾Åªy?º1½0FT¾Åªy?º1=0FT>Ūy?º1=0FT>Ūy?º1=0FT>–°N?Õ"‚=9+?–°N?Õ"‚=9+?–°N?Õ"‚=9+?FÍÿ>!=ù‡]?4Ö=XÆ<Ä–~?Œ+ž¾,Ǽþes?|+¿gW½aû=?|+¿gW½aû=?|+¿gW½aû=?Di¿¾Ý’½x¶Ï>Di¿¾Ý’½x¶Ï>Di¿¾Ý’½x¶Ï>ô5¿¯ ½Di¿DÞ’½x¶Ï¾Di¿DÞ’½x¶Ï¾Di¿DÞ’½x¶Ï¾|+¿gW½aû=¿|+¿gW½aû=¿|+¿gW½aû=¿Œ+ž¾,Ǽþes¿4Ö=XÆ<Ä–~¿FÍÿ>!=ù‡]¿–°N?Õ"‚=9+¿–°N?Õ"‚=9+¿–°N?Õ"‚=9+¿Åªy?º1=íET¾Åªy?º1=íET¾Åªy?º1=íET¾ý„s?àÚi>íET>ý„s?àÚi>íET>ý„s?àÚi>íET>»™I?x™A>I+?»™I?x™A>I+?»™I?x™A>I+?Ô€ù>šï=ù‡]?Ô€ù>šï=ù‡]?Ô€ù>šï=ù‡]?°ËÐ=äÈ<Ä–~?|Fš¾þ&”½þes?|Fš¾þ&”½þes?|Fš¾þ&”½þes?'Ù&¿2: ¾aû=?'Ù&¿2: ¾aû=?'Ù&¿2: ¾aû=?”…c¿1~Z¾x¶Ï>>íx¿5 o¾”…c¿1~Z¾x¶Ï¾'Ù&¿ï9 ¾aû=¿'Ù&¿ï9 ¾aû=¿'Ù&¿ï9 ¾aû=¿|Fš¾…'”½þes¿|Fš¾…'”½þes¿|Fš¾…'”½þes¿°ËÐ=äÈ<Ä–~¿Ô€ù>€™ï=ù‡]¿Ô€ù>€™ï=ù‡]¿Ô€ù>€™ï=ù‡]¿»™I?x™A>I+¿»™I?x™A>I+¿»™I?x™A>I+¿ý„s?àÚi>íET¾ý„s?àÚi>íET¾ý„s?àÚi>íET¾(`g?Ž­¿>0FT>Œ??⮞>9+?Œ??⮞>9+?Œ??⮞>9+?¦í>IcD>ù‡]?5bÆ=Y$=Ä–~?ÿ”’¾7Ýò½þes?+‡¿Tƒ¾aû=?+‡¿Tƒ¾aû=?+‡¿Tƒ¾aû=?õ,X¿ù³¾x¶Ï>Vƒl¿(ïþõ,X¿ù³¾x¶Ï¾+‡¿;Tƒ¾aû=¿+‡¿;Tƒ¾aû=¿+‡¿;Tƒ¾aû=¿ÿ”’¾7Ýò½þes¿5bÆ=Y$=Ä–~¿¦í>IcD>ù‡]¿Œ??À®ž>9+¿Œ??À®ž>9+¿Œ??À®ž>9+¿`g?Ž­¿>0FT¾`g?Ž­¿>0FT¾`g?Ž­¿>0FT¾ÓˆU?˜Ú?0FT>ÓˆU?˜Ú?0FT>ÓˆU?˜Ú?0FT>çÆ0?m¨Ø>9+?ÈÚ>º†>ù‡]?L·=$d`=Ä–~?sG‡¾BÌ%¾þes?ÓM¿aO³¾aû=?¶G¿íƒô¾x¶Ï>FZ¿n¿¶G¿íƒô¾x¶Ï¾ÓM¿aO³¾aû=¿sG‡¾BÌ%¾þes¿L·=$d`=Ä–~¿ÈÚ>º†>ù‡]¿çÆ0?m¨Ø>9+¿ÓˆU?˜Ú?0FT¾ÓˆU?˜Ú?0FT¾ÓˆU?˜Ú?0FT¾ro>?µ¥"?íET>ro>?µ¥"?íET>ro>?µ¥"?íET>n§?L¦?9+?qÃ>ʤ¦>ù‡]?qÃ>ʤ¦>ù‡]?qÃ>ʤ¦>ù‡]?éG£=Þt‹=Ä–~?MJq¾N¾þes?Bz¿àÞ¾aû=?Bz¿àÞ¾aû=?Bz¿àÞ¾aû=?Äì1¿^ö¿x¶Ï>ø©B¿JB&¿Äì1¿^ö¿x¶Ï¾Bz¿nàÞ¾aû=¿MJq¾N¾þes¿éG£=Þt‹=Ä–~¿PÃ>줦>ù‡]¿PÃ>줦>ù‡]¿PÃ>줦>ù‡]¿n§?;¦?9+¿n§?;¦?9+¿n§?;¦?9+¿ro>?µ¥"?íET¾ro>?µ¥"?íET¾ro>?µ¥"?íET¾µ¥"?ro>?0FT>µ¥"?ro>?0FT>µ¥"?ro>?0FT>;¦?n§?9+?;¦?n§?9+?;¦?n§?9+?ʤ¦>qÃ>ù‡]?ʤ¦>qÃ>ù‡]?ʤ¦>qÃ>ù‡]?Xt‹=éG£=Ä–~?N¾MJq¾þes?N¾MJq¾þes?N¾MJq¾þes?nàÞ¾Bz¿aû=?^ö¿Õì1¿x¶Ï>^ö¿Õì1¿x¶Ï>^ö¿Õì1¿x¶Ï>9B&¿ø©B¿^ö¿Äì1¿x¶Ï¾^ö¿Äì1¿x¶Ï¾^ö¿Äì1¿x¶Ï¾nàÞ¾Bz¿Pû=¿nàÞ¾Bz¿Pû=¿nàÞ¾Bz¿Pû=¿¾N¾MJq¾þes¿¾N¾MJq¾þes¿¾N¾MJq¾þes¿Xt‹=éG£=Ä–~¿Ê¤¦>qÃ>è‡]¿Ê¤¦>qÃ>è‡]¿Ê¤¦>qÃ>è‡]¿;¦?~§?9+¿¤¥"?ro>?0FT¾¤¥"?ro>?0FT¾¤¥"?ro>?0FT¾©Ú?ÓˆU?íET>m¨Ø>çÆ0?9+?º†>üÇÚ>ù‡]?º†>üÇÚ>ù‡]?º†>üÇÚ>ù‡]?$d`=L·=Ä–~?BÌ%¾sG‡¾þes?ƒO³¾ÓM¿Pû=?ƒO³¾ÓM¿Pû=?ƒO³¾ÓM¿Pû=?íƒô¾¦G¿š¶Ï>íƒô¾¦G¿š¶Ï>íƒô¾¦G¿š¶Ï>¿FZ¿„ô¾¦G¿x¶Ï¾„ô¾¦G¿x¶Ï¾„ô¾¦G¿x¶Ï¾aO³¾ÓM¿Pû=¿aO³¾ÓM¿Pû=¿aO³¾ÓM¿Pû=¿BÌ%¾sG‡¾fs¿BÌ%¾sG‡¾fs¿BÌ%¾sG‡¾fs¿$d`=L·=Ä–~¿º†>üÇÚ>ù‡]¿º†>üÇÚ>ù‡]¿º†>üÇÚ>ù‡]¿m¨Ø>çÆ0?9+¿©Ú?ÓˆU?íET¾Ž­¿>(`g?íET>⮞>Œ??9+?IcD>¦í>ù‡]?IcD>¦í>ù‡]?IcD>¦í>ù‡]?Y$=5bÆ=Ä–~?¾Ýò½ÿ”’¾þes?¾Ýò½ÿ”’¾þes?¾Ýò½ÿ”’¾þes?Tƒ¾+‡¿aû=?Tƒ¾+‡¿aû=?Tƒ¾+‡¿aû=?ù³¾õ,X¿x¶Ï>ù³¾õ,X¿x¶Ï>ù³¾õ,X¿x¶Ï>(ïþVƒl¿ù³¾õ,X¿x¶Ï¾ù³¾õ,X¿x¶Ï¾ù³¾õ,X¿x¶Ï¾;Tƒ¾‡¿aû=¿;Tƒ¾‡¿aû=¿;Tƒ¾‡¿aû=¿7Ýò½ÿ”’¾þes¿7Ýò½ÿ”’¾þes¿7Ýò½ÿ”’¾þes¿Y$=5bÆ=Ä–~¿IcD>„í>ù‡]¿â®ž>Œ??9+¿Ž­¿>(`g?íET¾Ž­¿>(`g?íET¾Ž­¿>(`g?íET¾àÚi>ý„s?íET>x™A>»™I?9+?x™A>»™I?9+?x™A>»™I?9+?šï=Ô€ù>ù‡]?äÈ<°ËÐ=Ä–~?þ&”½|Fš¾þes?2: ¾'Ù&¿Pû=?2: ¾'Ù&¿Pû=?2: ¾'Ù&¿Pû=?1~Z¾”…c¿x¶Ï>x o¾>íx¿1~Z¾”…c¿x¶Ï¾2: ¾8Ù&¿Pû=¿2: ¾8Ù&¿Pû=¿2: ¾8Ù&¿Pû=¿þ&”½|Fš¾þes¿äÈ<°ËÐ=Ä–~¿šï=Ô€ù>ù‡]¿x™A>»™I?9+¿x™A>»™I?9+¿x™A>»™I?9+¿àÚi>ý„s?íET¾º1=Ūy?íET>Õ"‚=–°N?I+?Õ"‚=–°N?I+?Õ"‚=–°N?I+?!=FÍÿ>ù‡]?ŠÊ<4Ö=Ä–~?,ǼŒ+ž¾þes?gW½|+¿aû=?gW½|+¿aû=?gW½|+¿aû=?¾Ý’½òCi¿x¶Ï>¾Ý’½òCi¿x¶Ï>¾Ý’½òCi¿x¶Ï>¯ ½ô5¿DÞ’½òCi¿x¶Ï¾DÞ’½òCi¿x¶Ï¾DÞ’½òCi¿x¶Ï¾gW½|+¿aû=¿gW½|+¿aû=¿gW½|+¿aû=¿,ǼŒ+ž¾þes¿ŠÊ<4Ö=Ä–~¿!=FÍÿ>ù‡]¿Õ"‚=–°N?I+¿Õ"‚=–°N?I+¿Õ"‚=–°N?I+¿º1=Ūy?íET¾º1½Åªy?íET>Õ"‚½–°N?9+?Õ"‚½–°N?9+?Õ"‚½–°N?9+?!½FÍÿ>ù‡]?ŠÊ¼4Ö=Ä–~?,Ǿݒ=òCi¿x¶Ï>¾Ý’=òCi¿x¶Ï>¯ =ô5¿€DÞ’=òCi¿x¶Ï¾DÞ’=òCi¿x¶Ï¾DÞ’=òCi¿x¶Ï¾hW=k+¿aû=¿hW=k+¿aû=¿hW=k+¿aû=¿,Ç<Œ+ž¾þes¿,Ç<Œ+ž¾þes¿,Ç<Œ+ž¾þes¿ŠÊ¼4Ö=Ä–~¿!½FÍÿ>ù‡]¿Õ"‚½–°N?I+¿Õ"‚½–°N?I+¿Õ"‚½–°N?I+¿º1½Åªy?íET¾àÚi¾ý„s?íET>x™A¾»™I?9+?x™A¾»™I?9+?x™A¾»™I?9+?šï½õ€ù>è‡]?šï½õ€ù>è‡]?šï½õ€ù>è‡]?äȼ°ËÐ=Ä–~?þ&”=|Fš¾fs?þ&”=|Fš¾fs?þ&”=|Fš¾fs?ï9 >8Ù&¿Pû=?1~Z>”…c¿x¶Ï>1~Z>”…c¿x¶Ï>1~Z>”…c¿x¶Ï>x o>>íx¿€í}Z>”…c¿x¶Ï¾í}Z>”…c¿x¶Ï¾í}Z>”…c¿x¶Ï¾ï9 >8Ù&¿Pû=¿þ&”=|Fš¾þes¿äȼ°ËÐ=Ä–~¿šï½Ô€ù>ù‡]¿šï½Ô€ù>ù‡]¿šï½Ô€ù>ù‡]¿x™A¾»™I?I+¿x™A¾»™I?I+¿x™A¾»™I?I+¿àÚi¾ý„s?íET¾Ž­¿¾(`g?0FT>À®ž¾Œ??9+?À®ž¾Œ??9+?À®ž¾Œ??9+?IcD¾¦í>ù‡]?IcD¾¦í>ù‡]?IcD¾¦í>ù‡]?Y$½5bÆ=Ä–~?7Ýò=ÿ”’¾þes?;Tƒ>+‡¿Pû=?;Tƒ>+‡¿Pû=?;Tƒ>+‡¿Pû=?ù³>õ,X¿š¶Ï>ù³>õ,X¿š¶Ï>ù³>õ,X¿š¶Ï>ïÃ>fƒl¿€ù³>õ,X¿š¶Ï¾ù³>õ,X¿š¶Ï¾ù³>õ,X¿š¶Ï¾Tƒ>+‡¿Pû=¿Tƒ>+‡¿Pû=¿Tƒ>+‡¿Pû=¿7Ýò=ÿ”’¾þes¿Y$½5bÆ=Ä–~¿IcD¾¦í>ù‡]¿â®ž¾Œ??9+¿â®ž¾Œ??9+¿â®ž¾Œ??9+¿Ž­¿¾(`g?0FT¾Ž­¿¾(`g?0FT¾Ž­¿¾(`g?0FT¾˜Ú¿ÓˆU?íET>˜Ú¿ÓˆU?íET>˜Ú¿ÓˆU?íET>m¨Ø¾çÆ0?I+?m¨Ø¾çÆ0?I+?m¨Ø¾çÆ0?I+?º†¾ÈÚ>è‡]?º†¾ÈÚ>è‡]?º†¾ÈÚ>è‡]?$d`½L·=Ä–~?…Ì%>sG‡¾þes?…Ì%>sG‡¾þes?…Ì%>sG‡¾þes?aO³>ÓM¿aû=?aO³>ÓM¿aû=?aO³>ÓM¿aû=?„ô>¶G¿x¶Ï>„ô>¶G¿x¶Ï>„ô>¶G¿x¶Ï>Â?FZ¿€íƒô>¶G¿x¶Ï¾íƒô>¶G¿x¶Ï¾íƒô>¶G¿x¶Ï¾ƒO³>ÓM¿aû=¿ƒO³>ÓM¿aû=¿ƒO³>ÓM¿aû=¿BÌ%>sG‡¾þes¿$d`½L·=Ä–~¿Ü†¾ÈÚ>è‡]¿Ü†¾ÈÚ>è‡]¿Ü†¾ÈÚ>è‡]¿m¨Ø¾çÆ0?I+¿m¨Ø¾çÆ0?I+¿m¨Ø¾çÆ0?I+¿©Ú¿ÓˆU?íET¾©Ú¿ÓˆU?íET¾©Ú¿ÓˆU?íET¾µ¥"¿ro>?0FT>µ¥"¿ro>?0FT>µ¥"¿ro>?0FT>;¦¿n§?I+?줦¾qÃ>è‡]?Þt‹½éG£=Ä–~?N>MJq¾þes?àÞ>Bz¿Pû=?^ö?Äì1¿š¶Ï>^ö?Äì1¿š¶Ï>^ö?Äì1¿š¶Ï>JB&?ø©B¿JB&?ø©B¿JB&?ø©B¿^ö?Äì1¿š¶Ï¾^ö?Äì1¿š¶Ï¾^ö?Äì1¿š¶Ï¾àÞ>Bz¿Pû=¿N>MJq¾þes¿Þt‹½éG£=Ä–~¿ì¤¦¾qÃ>è‡]¿L¦¿n§?I+¿L¦¿n§?I+¿L¦¿n§?I+¿µ¥"¿ro>?0FT¾µ¥"¿ro>?0FT¾µ¥"¿ro>?0FT¾ro>¿¤¥"?íET>ro>¿¤¥"?íET>ro>¿¤¥"?íET>~§¿;¦?9+?~§¿;¦?9+?~§¿;¦?9+?qþʤ¦>è‡]?qþʤ¦>è‡]?qþʤ¦>è‡]?éG£½Xt‹=Ä–~?MJq>N¾þes?Bz?nàÞ¾Pû=?Bz?nàÞ¾Pû=?Bz?nàÞ¾Pû=?Õì1?Mö¿x¶Ï>Õì1?Mö¿x¶Ï>Õì1?Mö¿x¶Ï>ø©B?9B&¿€Äì1?^ö¿x¶Ï¾Äì1?^ö¿x¶Ï¾Äì1?^ö¿x¶Ï¾Bz?àÞ¾Pû=¿Bz?àÞ¾Pû=¿Bz?àÞ¾Pû=¿MJq>¾N¾þes¿MJq>¾N¾þes¿MJq>¾N¾þes¿éG£½Xt‹=Ä–~¿qþʤ¦>è‡]¿qþʤ¦>è‡]¿qþʤ¦>è‡]¿~§¿;¦?9+¿~§¿;¦?9+¿~§¿;¦?9+¿ro>¿¤¥"?íET¾ro>¿¤¥"?íET¾ro>¿¤¥"?íET¾ÓˆU¿©Ú?0FT>ÓˆU¿©Ú?0FT>ÓˆU¿©Ú?0FT>çÆ0¿¨Ø>9+?çÆ0¿¨Ø>9+?çÆ0¿¨Ø>9+?ÈÚ¾º†>ù‡]?ÈÚ¾º†>ù‡]?ÈÚ¾º†>ù‡]?L·½$d`=Ä–~?sG‡>BÌ%¾þes?ÓM?ƒO³¾aû=?¦G?„ô¾š¶Ï>FZ?¿€¦G?„ô¾š¶Ï¾ÓM?ƒO³¾aû=¿sG‡>BÌ%¾þes¿L·½$d`=Ä–~¿Èھ܆>ù‡]¿çÆ0¿¨Ø>9+¿çÆ0¿¨Ø>9+¿çÆ0¿¨Ø>9+¿ÓˆU¿©Ú?0FT¾ÓˆU¿©Ú?0FT¾ÓˆU¿©Ú?0FT¾(`g¿Ž­¿>0FT>Œ?¿À®ž>9+?Œ?¿À®ž>9+?Œ?¿À®ž>9+?¦í¾IcD>ù‡]?5bƽY$=Ä–~?ÿ”’>7Ýò½þes?+‡?Tƒ¾aû=?+‡?Tƒ¾aû=?+‡?Tƒ¾aû=?õ,X?ù³¾š¶Ï>õ,X?ù³¾š¶Ï>õ,X?ù³¾š¶Ï>Vƒl?(ïþ€õ,X?ù³¾š¶Ï¾õ,X?ù³¾š¶Ï¾õ,X?ù³¾š¶Ï¾‡?Tƒ¾aû=¿ÿ”’>7Ýò½þes¿5bƽY$=Ä–~¿¦í¾IcD>ù‡]¿Œ?¿â®ž>9+¿Œ?¿â®ž>9+¿Œ?¿â®ž>9+¿(`g¿Ž­¿>0FT¾ý„s¿àÚi>íET>ý„s¿àÚi>íET>ý„s¿àÚi>íET>ª™I¿x™A>I+?ª™I¿x™A>I+?ª™I¿x™A>I+?õ€ù¾€™ï=è‡]?õ€ù¾€™ï=è‡]?õ€ù¾€™ï=è‡]?°ËнäÈ<Ä–~?|Fš>þ&”½þes?|Fš>þ&”½þes?|Fš>þ&”½þes?'Ù&?2: ¾aû=?'Ù&?2: ¾aû=?'Ù&?2: ¾aû=?”…c?1~Z¾x¶Ï>”…c?1~Z¾x¶Ï>”…c?1~Z¾x¶Ï>>íx?5 o¾€”…c?í}Z¾x¶Ï¾”…c?í}Z¾x¶Ï¾”…c?í}Z¾x¶Ï¾'Ù&?ï9 ¾aû=¿'Ù&?ï9 ¾aû=¿'Ù&?ï9 ¾aû=¿|Fš>…'”½þes¿|Fš>…'”½þes¿|Fš>…'”½þes¿°ËнäÈ<Ä–~¿Ô€ù¾šï=ù‡]¿Ô€ù¾šï=ù‡]¿Ô€ù¾šï=ù‡]¿ª™I¿x™A>I+¿ª™I¿x™A>I+¿ª™I¿x™A>I+¿ý„s¿àÚi>íET¾ý„s¿àÚi>íET¾ý„s¿àÚi>íET¾Åªy¿º1=0FT>Ūy¿º1=0FT>Ūy¿º1=0FT>–°N¿Õ"‚=9+?–°N¿Õ"‚=9+?–°N¿Õ"‚=9+?FÍÿ¾!=ù‡]?4Ö½XÆ<Ä–~?Œ+ž>,Ǽþes?|+?gW½aû=?|+?gW½aû=?|+?gW½aû=?Di?¾Ý’½x¶Ï>Di?¾Ý’½x¶Ï>Di?¾Ý’½x¶Ï>ô5?¯ ½€Di?DÞ’½x¶Ï¾Di?DÞ’½x¶Ï¾Di?DÞ’½x¶Ï¾|+?gW½Pû=¿|+?gW½Pû=¿|+?gW½Pû=¿Œ+ž>,Ǽþes¿4Ö½XÆ<Ä–~¿FÍÿ¾!=ù‡]¿–°N¿O"‚=9+¿–°N¿O"‚=9+¿–°N¿O"‚=9+¿Åªy¿º1=0FT¾Åªy¿º1=0FT¾Åªy¿º1=0FT¾Åªy¿31½íET>Ūy¿31½íET>Ūy¿31½íET>–°N¿O"‚½9+?FÍÿ¾!½ù‡]?4Ö½XƼĖ~?Œ+ž>,Ç<þes?|+?gW=Pû=?òCi?¾Ý’=x¶Ï>ô5?¯ =òCi?¾Ý’=x¶Ï¾|+?gW=aû=¿Œ+ž>,Ç<þes¿4Ö½XƼĖ~¿FÍÿ¾!½ù‡]¿–°N¿O"‚½9+¿Åªy¿31½íET¾Åªy¿31½íET¾Åªy¿31½íET¾ý„s¿#Ûi¾0FT>ý„s¿#Ûi¾0FT>ý„s¿#Ûi¾0FT>»™I¿»™A¾9+?Ô€ù¾šï½ù‡]?°ËнäȼĖ~?|Fš>þ&”=þes?'Ù&?2: >aû=?'Ù&?2: >aû=?'Ù&?2: >aû=?”…c?í}Z>x¶Ï>”…c?í}Z>x¶Ï>”…c?í}Z>x¶Ï>>íx?5 o>”…c?1~Z>x¶Ï¾”…c?1~Z>x¶Ï¾”…c?1~Z>x¶Ï¾'Ù&?ï9 >aû=¿'Ù&?ï9 >aû=¿'Ù&?ï9 >aû=¿|Fš>þ&”=þes¿°ËнäȼĖ~¿Ô€ù¾šï½è‡]¿Ô€ù¾šï½è‡]¿Ô€ù¾šï½è‡]¿»™I¿»™A¾9+¿ý„s¿àÚi¾0FT¾ý„s¿àÚi¾0FT¾ý„s¿àÚi¾0FT¾(`g¿m­¿¾0FT>Œ?¿À®ž¾9+?¦í¾IcD¾ù‡]?5bƽY$½Ä–~?ÿ”’>¾Ýò=þes?ÿ”’>¾Ýò=þes?ÿ”’>¾Ýò=þes?+‡?Tƒ>aû=?+‡?Tƒ>aû=?+‡?Tƒ>aû=?õ,X?׳>x¶Ï>fƒl?ïÃ>-X?׳>x¶Ï¾-X?׳>x¶Ï¾-X?׳>x¶Ï¾‡?;Tƒ>aû=¿‡?;Tƒ>aû=¿‡?;Tƒ>aû=¿ÿ”’>7Ýò=þes¿ÿ”’>7Ýò=þes¿ÿ”’>7Ýò=þes¿5bƽY$½Ä–~¿¦í¾IcD¾ù‡]¿Œ?¿À®ž¾9+¿(`g¿m­¿¾0FT¾ÓˆU¿˜Ú¿íET>ÓˆU¿˜Ú¿íET>ÓˆU¿˜Ú¿íET>çÆ0¿m¨Ø¾9+?Èھ܆¾è‡]?Èھ܆¾è‡]?Èھ܆¾è‡]?L·½$d`½Ä–~?sG‡>BÌ%>þes?ÓM?ƒO³>Pû=?ÓM?ƒO³>Pû=?ÓM?ƒO³>Pû=?¦G?„ô>x¶Ï>¦G?„ô>x¶Ï>¦G?„ô>x¶Ï>FZ?Â?¦G?íƒô>x¶Ï¾¦G?íƒô>x¶Ï¾¦G?íƒô>x¶Ï¾ÓM?aO³>Pû=¿ÓM?aO³>Pû=¿ÓM?aO³>Pû=¿sG‡>BÌ%>þes¿L·½$d`½Ä–~¿Èھ܆¾è‡]¿Èھ܆¾è‡]¿Èھ܆¾è‡]¿çÆ0¿m¨Ø¾9+¿çÆ0¿m¨Ø¾9+¿çÆ0¿m¨Ø¾9+¿ÓˆU¿©Ú¿íET¾ÓˆU¿©Ú¿íET¾ÓˆU¿©Ú¿íET¾ro>¿¤¥"¿0FT>ro>¿¤¥"¿0FT>ro>¿¤¥"¿0FT>~§¿;¦¿I+?~§¿;¦¿I+?~§¿;¦¿I+?qþʤ¦¾ù‡]?qþʤ¦¾ù‡]?qþʤ¦¾ù‡]?éG£½Xt‹½Ä–~?MJq>N>þes?MJq>N>þes?MJq>N>þes?Bz?nàÞ>aû=?Bz?nàÞ>aû=?Bz?nàÞ>aû=?Õì1?Mö?š¶Ï>Õì1?Mö?š¶Ï>Õì1?Mö?š¶Ï>ø©B?9B&?Äì1?^ö?x¶Ï¾Äì1?^ö?x¶Ï¾Äì1?^ö?x¶Ï¾Bz?nàÞ>aû=¿Bz?nàÞ>aû=¿Bz?nàÞ>aû=¿MJq>N>þes¿éG£½Xt‹½Ä–~¿qþʤ¦¾ù‡]¿qþʤ¦¾ù‡]¿qþʤ¦¾ù‡]¿~§¿;¦¿I+¿ro>¿¤¥"¿0FT¾ro>¿¤¥"¿0FT¾ro>¿¤¥"¿0FT¾µ¥"¿ro>¿íET>µ¥"¿ro>¿íET>µ¥"¿ro>¿íET>;¦¿n§¿I+?;¦¿n§¿I+?;¦¿n§¿I+?줦¾qþè‡]?Þt‹½éG£½Ä–~?N>MJq>þes?àÞ>Bz?Pû=?^ö?Äì1?x¶Ï>^ö?Äì1?x¶Ï>^ö?Äì1?x¶Ï>9B&?ø©B?9B&?ø©B?9B&?ø©B?^ö?Äì1?x¶Ï¾^ö?Äì1?x¶Ï¾^ö?Äì1?x¶Ï¾àÞ>Bz?Pû=¿N>MJq>þes¿Þt‹½éG£½Ä–~¿ì¤¦¾qþè‡]¿;¦¿n§¿I+¿µ¥"¿ro>¿íET¾µ¥"¿ro>¿íET¾µ¥"¿ro>¿íET¾˜Ú¿ÓˆU¿0FT>˜Ú¿ÓˆU¿0FT>˜Ú¿ÓˆU¿0FT>¨Ø¾çÆ0¿9+?¨Ø¾çÆ0¿9+?¨Ø¾çÆ0¿9+?º†¾ÈÚ¾ù‡]?º†¾ÈÚ¾ù‡]?º†¾ÈÚ¾ù‡]?$d`½L·½Ä–~?BÌ%>sG‡>þes?aO³>ÓM?Pû=?aO³>ÓM?Pû=?aO³>ÓM?Pû=?„ô>¦G?š¶Ï>„ô>¦G?š¶Ï>„ô>¦G?š¶Ï>Â?FZ?íƒô>¶G?š¶Ï¾íƒô>¶G?š¶Ï¾íƒô>¶G?š¶Ï¾ƒO³>ÓM?Pû=¿ƒO³>ÓM?Pû=¿ƒO³>ÓM?Pû=¿BÌ%>sG‡>þes¿BÌ%>sG‡>þes¿BÌ%>sG‡>þes¿$d`½L·½Ä–~¿º†¾ÈÚ¾ù‡]¿m¨Ø¾çÆ0¿9+¿m¨Ø¾çÆ0¿9+¿m¨Ø¾çÆ0¿9+¿©Ú¿ÓˆU¿0FT¾©Ú¿ÓˆU¿0FT¾©Ú¿ÓˆU¿0FT¾Ž­¿¾(`g¿íET>Ž­¿¾(`g¿íET>Ž­¿¾(`g¿íET>À®ž¾Œ?¿I+?À®ž¾Œ?¿I+?À®ž¾Œ?¿I+?IcD¾¦í¾è‡]?IcD¾¦í¾è‡]?IcD¾¦í¾è‡]?Y$½5bƽĖ~?7Ýò=ÿ”’>þes?;Tƒ>‡?aû=?;Tƒ>‡?aû=?;Tƒ>‡?aû=?ù³>õ,X?x¶Ï>ù³>õ,X?x¶Ï>ù³>õ,X?x¶Ï>ïÃ>fƒl?ù³>õ,X?x¶Ï¾ù³>õ,X?x¶Ï¾ù³>õ,X?x¶Ï¾Tƒ>+‡?aû=¿Tƒ>+‡?aû=¿Tƒ>+‡?aû=¿7Ýò=ÿ”’>þes¿Y$½5bƽĖ~¿IcD¾¦í¾è‡]¿IcD¾¦í¾è‡]¿IcD¾¦í¾è‡]¿À®ž¾Œ?¿I+¿À®ž¾Œ?¿I+¿À®ž¾Œ?¿I+¿Ž­¿¾(`g¿íET¾Ž­¿¾(`g¿íET¾Ž­¿¾(`g¿íET¾àÚi¾ý„s¿íET>x™A¾ª™I¿I+?x™A¾ª™I¿I+?x™A¾ª™I¿I+?šï½õ€ù¾è‡]?šï½õ€ù¾è‡]?šï½õ€ù¾è‡]?äȼ°ËнĖ~?þ&”=|Fš>þes?ï9 >8Ù&?Pû=?1~Z>”…c?š¶Ï>1~Z>”…c?š¶Ï>1~Z>”…c?š¶Ï>x o>>íx?í}Z>”…c?š¶Ï¾í}Z>”…c?š¶Ï¾í}Z>”…c?š¶Ï¾ï9 >8Ù&?Pû=¿þ&”=|Fš>þes¿þ&”=|Fš>þes¿þ&”=|Fš>þes¿äȼ°ËнĖ~¿šï½Ô€ù¾ù‡]¿šï½Ô€ù¾ù‡]¿šï½Ô€ù¾ù‡]¿x™A¾ª™I¿I+¿x™A¾ª™I¿I+¿x™A¾ª™I¿I+¿àÚi¾ý„s¿íET¾º1½Åªy¿íET>Õ"‚½–°N¿9+?Õ"‚½–°N¿9+?Õ"‚½–°N¿9+?!½FÍÿ¾ù‡]?ŠÊ¼4ֽĖ~?,Çþes?,Çþes?,Çþes?gW=|+?Pû=?gW=|+?Pû=?gW=|+?Pû=?¾Ý’=òCi?x¶Ï>¾Ý’=òCi?x¶Ï>¾Ý’=òCi?x¶Ï>¯ =ô5?DÞ’=òCi?x¶Ï¾DÞ’=òCi?x¶Ï¾DÞ’=òCi?x¶Ï¾hW=|+?Pû=¿hW=|+?Pû=¿hW=|+?Pû=¿,Ç<Œ+ž>þes¿,Ç<Œ+ž>þes¿,Ç<Œ+ž>þes¿ŠÊ¼4ֽĖ~¿!½FÍÿ¾ù‡]¿Õ"‚½–°N¿I+¿Õ"‚½–°N¿I+¿Õ"‚½–°N¿I+¿º1½Åªy¿íET¾º1=Ūy¿íET>Õ"‚=–°N¿9+?Õ"‚=–°N¿9+?Õ"‚=–°N¿9+?!=FÍÿ¾ù‡]?ŠÊ<4ֽĖ~?ŠÊ<4ֽĖ~?ŠÊ<4ֽĖ~?,ǼŒ+ž>þes?gW½|+?Pû=?gW½|+?Pû=?gW½|+?Pû=?¾Ý’½òCi?x¶Ï>¾Ý’½òCi?x¶Ï>¾Ý’½òCi?x¶Ï>¯ ½ô5?DÞ’½òCi?x¶Ï¾DÞ’½òCi?x¶Ï¾DÞ’½òCi?x¶Ï¾gW½|+?Pû=¿gW½|+?Pû=¿gW½|+?Pû=¿,ǼŒ+ž>þes¿XÆ<4ֽĖ~¿XÆ<4ֽĖ~¿XÆ<4ֽĖ~¿!=FÍÿ¾ù‡]¿Õ"‚=–°N¿9+¿Õ"‚=–°N¿9+¿Õ"‚=–°N¿9+¿º1=Ūy¿íET¾àÚi>ý„s¿íET>x™A>»™I¿I+?x™A>»™I¿I+?x™A>»™I¿I+?šï=Ô€ù¾ù‡]?äÈ<°ËнĖ~?þ&”½|Fš>þes?2: ¾'Ù&?aû=?2: ¾'Ù&?aû=?2: ¾'Ù&?aû=?1~Z¾”…c?x¶Ï>x o¾>íx?1~Z¾”…c?x¶Ï¾ï9 ¾'Ù&?aû=¿ï9 ¾'Ù&?aû=¿ï9 ¾'Ù&?aû=¿þ&”½|Fš>þes¿äÈ<°ËнĖ~¿šï=Ô€ù¾ù‡]¿x™A>»™I¿I+¿x™A>»™I¿I+¿x™A>»™I¿I+¿àÚi>ý„s¿íET¾°­¿>(`g¿íET>°­¿>(`g¿íET>°­¿>(`g¿íET>⮞>Œ?¿9+?IcD>„í¾ù‡]?Y$=5bƽĖ~?¾Ýò½ÿ”’>þes?¾Ýò½ÿ”’>þes?¾Ýò½ÿ”’>þes?;Tƒ¾+‡?Pû=?;Tƒ¾+‡?Pû=?;Tƒ¾+‡?Pû=?ù³¾õ,X?š¶Ï>ù³¾õ,X?š¶Ï>ù³¾õ,X?š¶Ï>(ïþVƒl?ù³¾õ,X?š¶Ï¾ù³¾õ,X?š¶Ï¾ù³¾õ,X?š¶Ï¾;Tƒ¾+‡?Pû=¿;Tƒ¾+‡?Pû=¿;Tƒ¾+‡?Pû=¿7Ýò½ÿ”’>þes¿7Ýò½ÿ”’>þes¿7Ýò½ÿ”’>þes¿Y$=5bƽĖ~¿IcD>„í¾ù‡]¿IcD>„í¾ù‡]¿IcD>„í¾ù‡]¿â®ž>Œ?¿9+¿Ž­¿>(`g¿íET¾˜Ú?ÓˆU¿íET>˜Ú?ÓˆU¿íET>˜Ú?ÓˆU¿íET>m¨Ø>çÆ0¿9+?º†>ÈÚ¾ù‡]?$d`=L·½Ä–~?BÌ%¾sG‡>þes?ƒO³¾ÓM?Pû=?ƒO³¾ÓM?Pû=?ƒO³¾ÓM?Pû=?íƒô¾¶G?x¶Ï>íƒô¾¶G?x¶Ï>íƒô¾¶G?x¶Ï>n¿®FZ?íƒô¾¶G?x¶Ï¾íƒô¾¶G?x¶Ï¾íƒô¾¶G?x¶Ï¾aO³¾ÓM?Pû=¿aO³¾ÓM?Pû=¿aO³¾ÓM?Pû=¿BÌ%¾sG‡>þes¿$d`=L·½Ä–~¿º†>ÈÚ¾ù‡]¿m¨Ø>çÆ0¿9+¿˜Ú?ÓˆU¿íET¾˜Ú?ÓˆU¿íET¾˜Ú?ÓˆU¿íET¾¤¥"?ro>¿0FT>¤¥"?ro>¿0FT>¤¥"?ro>¿0FT>;¦?~§¿9+?ʤ¦>qþù‡]?Þt‹=éG£½Ä–~?Þt‹=éG£½Ä–~?Þt‹=éG£½Ä–~?¾N¾MJq>þes?nàÞ¾Bz?Pû=?Mö¿Äì1?š¶Ï>Mö¿Äì1?š¶Ï>Mö¿Äì1?š¶Ï>9B&¿ø©B?Mö¿Õì1?š¶Ï¾Mö¿Õì1?š¶Ï¾Mö¿Õì1?š¶Ï¾nàÞ¾Bz?Pû=¿nàÞ¾Bz?Pû=¿nàÞ¾Bz?Pû=¿¾N¾MJq>þes¿Xt‹=éG£½Ä–~¿Ê¤¦>qþù‡]¿;¦?~§¿9+¿¤¥"?ro>¿0FT¾ro>?µ¥"¿0FT>ro>?µ¥"¿0FT>ro>?µ¥"¿0FT>~§?;¦¿9+?~§?;¦¿9+?~§?;¦¿9+?qÃ>ʤ¦¾ù‡]?qÃ>ʤ¦¾ù‡]?qÃ>ʤ¦¾ù‡]?éG£=Xt‹½Ä–~?MJq¾¾N>þes?Bz¿nàÞ>Pû=?Äì1¿^ö?x¶Ï>ø©B¿9B&?Äì1¿^ö?x¶Ï¾Äì1¿^ö?x¶Ï¾Äì1¿^ö?x¶Ï¾Bz¿nàÞ>Pû=¿MJq¾¾N>þes¿éG£=Xt‹½Ä–~¿qÃ>ʤ¦¾ù‡]¿qÃ>ʤ¦¾ù‡]¿qÃ>ʤ¦¾ù‡]¿n§?;¦¿9+¿n§?;¦¿9+¿n§?;¦¿9+¿ro>?µ¥"¿0FT¾ro>?µ¥"¿0FT¾ro>?µ¥"¿0FT¾ÓˆU?©Ú¿íET>ÓˆU?©Ú¿íET>ÓˆU?©Ú¿íET>ÖÆ0?¨Ø¾I+?ÖÆ0?¨Ø¾I+?ÖÆ0?¨Ø¾I+?ÈÚ>܆¾è‡]?ÈÚ>܆¾è‡]?ÈÚ>܆¾è‡]?L·=$d`½Ä–~?sG‡¾…Ì%>þes?sG‡¾…Ì%>þes?sG‡¾…Ì%>þes?ÓM¿ƒO³>Pû=?¦G¿„ô>x¶Ï>FZ¿Â?¦G¿„ô>x¶Ï¾ÓM¿ƒO³>Pû=¿sG‡¾BÌ%>þes¿sG‡¾BÌ%>þes¿sG‡¾BÌ%>þes¿L·=$d`½Ä–~¿ÈÚ>܆¾è‡]¿ÈÚ>܆¾è‡]¿ÈÚ>܆¾è‡]¿çÆ0?m¨Ø¾I+¿çÆ0?m¨Ø¾I+¿çÆ0?m¨Ø¾I+¿ÓˆU?©Ú¿íET¾ÓˆU?©Ú¿íET¾ÓˆU?©Ú¿íET¾`g?Ž­¿¾0FT>`g?Ž­¿¾0FT>`g?Ž­¿¾0FT>Œ??⮞¾9+?¦í>IcD¾ù‡]?5bÆ=Y$½Ä–~?ÿ”’¾7Ýò=fs?ÿ”’¾7Ýò=fs?ÿ”’¾7Ýò=fs?+‡¿;Tƒ>Pû=?õ,X¿ù³>š¶Ï>õ,X¿ù³>š¶Ï>õ,X¿ù³>š¶Ï>Vƒl¿(ïÃ>õ,X¿³>š¶Ï¾õ,X¿³>š¶Ï¾õ,X¿³>š¶Ï¾+‡¿;Tƒ>Pû=¿+‡¿;Tƒ>Pû=¿+‡¿;Tƒ>Pû=¿ÿ”’¾¾Ýò=þes¿ÿ”’¾¾Ýò=þes¿ÿ”’¾¾Ýò=þes¿5bÆ=Y$½Ä–~¿¦í>IcD¾ù‡]¿Œ??⮞¾9+¿(`g?Ž­¿¾0FT¾(`g?Ž­¿¾0FT¾(`g?Ž­¿¾0FT¾ý„s?#Ûi¾íET>»™I?»™A¾9+?»™I?»™A¾9+?»™I?»™A¾9+?Ô€ù>šï½ù‡]?°ËÐ=äȼĖ~?|Fš¾…'”=þes?|Fš¾…'”=þes?|Fš¾…'”=þes?'Ù&¿ï9 >aû=?'Ù&¿ï9 >aû=?'Ù&¿ï9 >aû=?”…c¿1~Z>x¶Ï>”…c¿1~Z>x¶Ï>”…c¿1~Z>x¶Ï>>íx¿x o>”…c¿í}Z>x¶Ï¾”…c¿í}Z>x¶Ï¾”…c¿í}Z>x¶Ï¾'Ù&¿2: >Pû=¿'Ù&¿2: >Pû=¿'Ù&¿2: >Pû=¿|Fš¾þ&”=þes¿°ËÐ=äȼĖ~¿Ô€ù>šï½ù‡]¿»™I?»™A¾9+¿»™I?»™A¾9+¿»™I?»™A¾9+¿ý„s?#Ûi¾íET¾Åªy?º1½íET>Ūy?º1½íET>Ūy?º1½íET>–°N?Õ"‚½I+?–°N?Õ"‚½I+?–°N?Õ"‚½I+?FÍÿ>!½ù‡]?4Ö=XƼĖ~?Œ+ž¾,Ç<þes?|+¿gW=Pû=?|+¿gW=Pû=?|+¿gW=Pû=?òCi¿DÞ’=x¶Ï>òCi¿DÞ’=x¶Ï>òCi¿DÞ’=x¶Ï>ô5¿¯ =òCi¿DÞ’=x¶Ï¾òCi¿DÞ’=x¶Ï¾òCi¿DÞ’=x¶Ï¾|+¿gW=Pû=¿|+¿gW=Pû=¿|+¿gW=Pû=¿Œ+ž¾,Ç<þes¿4Ö=XƼĖ~¿FÍÿ>!½ù‡]¿–°N?Õ"‚½9+¿Åªy?º1½íET¾Åªy?º1½íET¾Åªy?º1½íET¾opensurgsim-0.7.0/SurgSim/Testing/Data/Geometry/arm_collision.ply000066400000000000000000003661021277777236100251560ustar00rootroot00000000000000ply format ascii 1.0 comment Created by Blender 2.69 (sub 0) - www.blender.org, source file: '' element vertex 1582 property float x property float y property float z property float nx property float ny property float nz property float s property float t element face 528 property list uchar uint vertex_indices end_header -0.034406 -0.085027 -0.138728 0.463145 -0.829541 -0.312024 0.135340 0.509730 -0.095526 -0.117518 -0.143070 0.463145 -0.829541 -0.312024 0.282049 0.406200 -0.073474 -0.097069 -0.164703 0.463145 -0.829541 -0.312024 0.259420 0.472470 -0.095526 -0.117518 -0.143070 -0.477746 -0.729957 0.488795 0.282049 0.406200 -0.089139 -0.098688 -0.108707 -0.477746 -0.729957 0.488795 0.188060 0.358130 -0.129650 -0.099186 -0.149046 -0.477746 -0.729957 0.488795 0.350790 0.366940 -0.129650 -0.099186 -0.149046 -0.496761 -0.707815 0.502222 0.350790 0.366940 -0.133343 -0.079854 -0.125453 -0.496761 -0.707815 0.502222 0.293109 0.318900 -0.158610 -0.087944 -0.161847 -0.496761 -0.707815 0.502222 0.443599 0.357970 -0.133343 -0.079854 -0.125453 -0.732850 -0.346174 0.585742 0.293109 0.318900 -0.147506 -0.066233 -0.135123 -0.732850 -0.346174 0.585742 0.342009 0.305170 -0.158610 -0.087944 -0.161847 -0.732850 -0.346174 0.585742 0.443599 0.357970 -0.140091 -0.047694 -0.134212 -0.313873 0.817137 0.483498 0.319526 0.270466 -0.112058 -0.031450 -0.143467 -0.313873 0.817137 0.483498 0.278074 0.212619 -0.137006 -0.024205 -0.171907 -0.313873 0.817137 0.483498 0.365560 0.214520 -0.147506 -0.066233 -0.135123 -0.903873 0.349389 0.246860 0.342009 0.305170 -0.127485 -0.041471 -0.096863 -0.903873 0.349389 0.246860 0.207157 0.259402 -0.140091 -0.047694 -0.134212 -0.903873 0.349389 0.246860 0.319526 0.270466 -0.127485 -0.041471 -0.096863 -0.715701 0.686737 0.127140 0.207157 0.259402 -0.107972 -0.020968 -0.097765 -0.715701 0.686737 0.127140 0.188810 0.220410 -0.140091 -0.047694 -0.134212 -0.715701 0.686737 0.127140 0.319526 0.270466 -0.140091 -0.047694 -0.134212 -0.531301 0.834859 -0.143978 0.319526 0.270466 -0.107972 -0.020968 -0.097765 -0.531301 0.834859 -0.143978 0.188810 0.220410 -0.112058 -0.031450 -0.143467 -0.531301 0.834859 -0.143978 0.278074 0.212619 -0.127485 -0.041471 -0.096863 -0.718029 0.687994 0.105349 0.207157 0.259402 -0.100711 -0.017457 -0.071205 -0.718029 0.687994 0.105349 0.153949 0.220629 -0.107972 -0.020968 -0.097765 -0.718029 0.687994 0.105349 0.188810 0.220410 -0.100711 -0.017457 -0.071205 -0.795001 0.438312 0.419352 0.153949 0.220629 -0.127485 -0.041471 -0.096863 -0.795001 0.438312 0.419352 0.207157 0.259402 -0.094869 -0.027848 -0.049269 -0.795001 0.438312 0.419352 0.131870 0.234050 -0.094869 -0.027848 -0.049269 -0.834640 0.121010 0.537339 0.131870 0.234050 -0.127485 -0.041471 -0.096863 -0.834640 0.121010 0.537339 0.207157 0.259402 -0.117000 -0.054747 -0.077587 -0.834640 0.121010 0.537339 0.163450 0.270300 -0.117000 -0.054747 -0.077587 -0.650931 -0.557859 0.514861 0.163450 0.270300 -0.133343 -0.079854 -0.125453 -0.650931 -0.557859 0.514861 0.293109 0.318900 -0.095276 -0.068078 -0.064566 -0.650931 -0.557859 0.514861 0.130968 0.286588 -0.127485 -0.041471 -0.096863 -0.882285 -0.013640 0.470517 0.207157 0.259402 -0.147506 -0.066233 -0.135123 -0.882285 -0.013640 0.470517 0.342009 0.305170 -0.117000 -0.054747 -0.077587 -0.882285 -0.013640 0.470517 0.163450 0.270300 -0.147506 -0.066233 -0.135123 -0.754814 -0.438572 0.487761 0.342009 0.305170 -0.133343 -0.079854 -0.125453 -0.754814 -0.438572 0.487761 0.293109 0.318900 -0.117000 -0.054747 -0.077587 -0.754814 -0.438572 0.487761 0.163450 0.270300 -0.113704 -0.014641 -0.177831 0.106434 0.895194 0.432782 0.354810 0.871980 -0.112058 -0.031450 -0.143467 0.106434 0.895194 0.432782 0.296340 0.934129 -0.089934 -0.029127 -0.153713 0.106434 0.895194 0.432782 0.266570 0.800189 -0.089934 -0.029127 -0.153713 -0.118744 0.992428 -0.031396 0.266570 0.800189 -0.112058 -0.031450 -0.143467 -0.118744 0.992428 -0.031396 0.296340 0.934129 -0.079289 -0.027650 -0.147286 -0.118744 0.992428 -0.031396 0.236930 0.764110 -0.137006 -0.024205 -0.171907 -0.244844 0.866271 0.435461 0.366090 0.965530 -0.112058 -0.031450 -0.143467 -0.244844 0.866271 0.435461 0.296340 0.934129 -0.113704 -0.014641 -0.177831 -0.244844 0.866271 0.435461 0.354810 0.871980 -0.079289 -0.027650 -0.147286 0.201966 0.942022 -0.267964 0.236930 0.764110 -0.082414 -0.008469 -0.082211 0.201966 0.942022 -0.267964 0.147348 0.905596 -0.051717 -0.030921 -0.138004 0.201966 0.942022 -0.267964 0.172420 0.668253 -0.082414 -0.008469 -0.082211 0.000804 0.927855 -0.372941 0.147348 0.905596 -0.025528 -0.015002 -0.098342 0.000804 0.927855 -0.372941 0.106645 0.656621 -0.051717 -0.030921 -0.138004 0.000804 0.927855 -0.372941 0.172420 0.668253 -0.112058 -0.031450 -0.143467 -0.136721 0.968133 -0.209823 0.296340 0.934129 -0.107972 -0.020968 -0.097765 -0.136721 0.968133 -0.209823 0.209280 0.974420 -0.079289 -0.027650 -0.147286 -0.136721 0.968133 -0.209823 0.236930 0.764110 -0.107972 -0.020968 -0.097765 -0.276259 0.918193 -0.283906 0.209280 0.974420 -0.082414 -0.008469 -0.082211 -0.276259 0.918193 -0.283906 0.147348 0.905596 -0.079289 -0.027650 -0.147286 -0.276259 0.918193 -0.283906 0.236930 0.764110 -0.142783 -0.123768 -0.254342 0.665454 -0.706442 -0.241061 0.656300 0.541330 -0.101305 -0.091627 -0.234032 0.665454 -0.706442 -0.241061 0.553391 0.588060 -0.102843 -0.103309 -0.204043 0.665454 -0.706442 -0.241061 0.405861 0.510860 -0.102843 -0.103309 -0.204043 0.696247 -0.680205 -0.229262 0.405861 0.510860 -0.101305 -0.091627 -0.234032 0.696247 -0.680205 -0.229262 0.553391 0.588060 -0.072018 -0.074296 -0.196510 0.696247 -0.680205 -0.229262 0.356783 0.579623 -0.142783 -0.123768 -0.254342 0.627018 -0.777378 -0.050307 0.656300 0.541330 -0.142754 -0.121434 -0.290047 0.627018 -0.777378 -0.050307 0.750953 0.583825 -0.101305 -0.091627 -0.234032 0.627018 -0.777378 -0.050307 0.553391 0.588060 -0.118145 -0.075826 -0.291408 0.815307 -0.450766 -0.363433 0.807090 0.695700 -0.101305 -0.091627 -0.234032 0.815307 -0.450766 -0.363433 0.553391 0.588060 -0.142754 -0.121434 -0.290047 0.815307 -0.450766 -0.363433 0.750953 0.583825 -0.094587 -0.070190 -0.237734 0.811379 -0.336776 -0.477751 0.571026 0.654340 -0.072018 -0.074296 -0.196510 0.811379 -0.336776 -0.477751 0.356783 0.579623 -0.101305 -0.091627 -0.234032 0.811379 -0.336776 -0.477751 0.553391 0.588060 -0.101305 -0.091627 -0.234032 0.875332 -0.334594 -0.349057 0.553391 0.588060 -0.118145 -0.075826 -0.291408 0.875332 -0.334594 -0.349057 0.807090 0.695700 -0.094587 -0.070190 -0.237734 0.875332 -0.334594 -0.349057 0.571026 0.654340 -0.118145 -0.075826 -0.291408 0.910991 0.067262 -0.406905 0.807090 0.695700 -0.107834 -0.057088 -0.265226 0.910991 0.067262 -0.406905 0.726160 0.731651 -0.094587 -0.070190 -0.237734 0.910991 0.067262 -0.406905 0.571026 0.654340 -0.100382 -0.018451 -0.205285 0.630584 0.461830 -0.623760 0.411672 0.797526 -0.071727 -0.047559 -0.197868 0.630584 0.461830 -0.623760 0.379059 0.666993 -0.094587 -0.070190 -0.237734 0.630584 0.461830 -0.623760 0.571026 0.654340 -0.107834 -0.057088 -0.265226 0.908900 0.289840 -0.299822 0.726160 0.731651 -0.100382 -0.018451 -0.205285 0.908900 0.289840 -0.299822 0.411672 0.797526 -0.094587 -0.070190 -0.237734 0.908900 0.289840 -0.299822 0.571026 0.654340 -0.100382 -0.018451 -0.205285 0.872117 0.354694 -0.337053 0.411672 0.797526 -0.107834 -0.057088 -0.265226 0.872117 0.354694 -0.337053 0.726160 0.731651 -0.117261 -0.018451 -0.248959 0.872117 0.354694 -0.337053 0.595351 0.822090 -0.100382 -0.018451 -0.205285 0.712515 0.701656 0.000902 0.411672 0.797526 -0.089934 -0.029127 -0.153713 0.712515 0.701656 0.000902 0.266570 0.800189 -0.071727 -0.047559 -0.197868 0.712515 0.701656 0.000902 0.379059 0.666993 -0.089934 -0.029127 -0.153713 0.084482 0.931430 -0.353979 0.266570 0.800189 -0.079289 -0.027650 -0.147286 0.084482 0.931430 -0.353979 0.236930 0.764110 -0.071727 -0.047559 -0.197868 0.084482 0.931430 -0.353979 0.379059 0.666993 -0.137698 -0.007571 -0.242054 0.278313 0.960489 0.001757 0.534770 0.882390 -0.113704 -0.014641 -0.177831 0.278313 0.960489 0.001757 0.354810 0.871980 -0.100382 -0.018451 -0.205285 0.278313 0.960489 0.001757 0.411672 0.797526 -0.113704 -0.014641 -0.177831 0.447186 0.889536 0.093549 0.354810 0.871980 -0.089934 -0.029127 -0.153713 0.447186 0.889536 0.093549 0.266570 0.800189 -0.100382 -0.018451 -0.205285 0.447186 0.889536 0.093549 0.411672 0.797526 -0.137698 -0.007571 -0.242054 0.420355 0.892698 -0.162457 0.534770 0.882390 -0.100382 -0.018451 -0.205285 0.420355 0.892698 -0.162457 0.411672 0.797526 -0.117261 -0.018451 -0.248959 0.420355 0.892698 -0.162457 0.595351 0.822090 -0.169827 -0.013664 -0.222033 -0.096689 0.984765 0.144531 0.462741 0.950520 -0.113704 -0.014641 -0.177831 -0.096689 0.984765 0.144531 0.354810 0.871980 -0.137698 -0.007571 -0.242054 -0.096689 0.984765 0.144531 0.534770 0.882390 -0.072018 -0.074296 -0.196510 0.276017 -0.787433 -0.551147 0.356783 0.579623 -0.054913 -0.089177 -0.166683 0.276017 -0.787433 -0.551147 0.228820 0.514750 -0.073474 -0.097069 -0.164703 0.276017 -0.787433 -0.551147 0.255890 0.486160 -0.072018 -0.074296 -0.196510 0.708039 -0.379637 -0.595447 0.356783 0.579623 -0.053999 -0.068243 -0.178943 0.708039 -0.379637 -0.595447 0.256240 0.570673 -0.054913 -0.089177 -0.166683 0.708039 -0.379637 -0.595447 0.228820 0.514750 -0.094587 -0.070190 -0.237734 0.875211 -0.034034 -0.482543 0.571026 0.654340 -0.071727 -0.047559 -0.197868 0.875211 -0.034034 -0.482543 0.379059 0.666993 -0.072018 -0.074296 -0.196510 0.875211 -0.034034 -0.482543 0.356783 0.579623 -0.071727 -0.047559 -0.197868 0.769087 -0.040767 -0.637842 0.379059 0.666993 -0.056141 -0.053097 -0.178721 0.769087 -0.040767 -0.637842 0.263661 0.612951 -0.072018 -0.074296 -0.196510 0.769087 -0.040767 -0.637842 0.356783 0.579623 -0.072018 -0.074296 -0.196510 0.675592 0.106238 -0.729581 0.356783 0.579623 -0.056141 -0.053097 -0.178721 0.675592 0.106238 -0.729581 0.263661 0.612951 -0.053999 -0.068243 -0.178943 0.675592 0.106238 -0.729581 0.256240 0.570673 -0.056141 -0.053097 -0.178721 0.744189 0.114890 -0.658015 0.263661 0.612951 -0.040966 -0.049422 -0.160917 0.744189 0.114890 -0.658015 0.191410 0.590020 -0.053999 -0.068243 -0.178943 0.744189 0.114890 -0.658015 0.256240 0.570673 -0.056141 -0.053097 -0.178721 0.318008 0.837714 -0.443966 0.263661 0.612951 -0.079289 -0.027650 -0.147286 0.318008 0.837714 -0.443966 0.236930 0.764110 -0.040966 -0.049422 -0.160917 0.318008 0.837714 -0.443966 0.191410 0.590020 -0.040966 -0.049422 -0.160917 0.272144 0.807082 -0.523982 0.191410 0.590020 -0.079289 -0.027650 -0.147286 0.272144 0.807082 -0.523982 0.236930 0.764110 -0.051717 -0.030921 -0.138004 0.272144 0.807082 -0.523982 0.172420 0.668253 -0.051717 -0.030921 -0.138004 0.476749 0.660592 -0.579939 0.172420 0.668253 -0.025528 -0.015002 -0.098342 0.476749 0.660592 -0.579939 0.106645 0.656621 -0.024684 -0.048566 -0.135880 0.476749 0.660592 -0.579939 0.122524 0.566469 -0.071727 -0.047559 -0.197868 0.562916 0.794306 -0.228482 0.379059 0.666993 -0.079289 -0.027650 -0.147286 0.562916 0.794306 -0.228482 0.236930 0.764110 -0.056141 -0.053097 -0.178721 0.562916 0.794306 -0.228482 0.263661 0.612951 -0.053999 -0.068243 -0.178943 0.785684 0.046741 -0.616860 0.256240 0.570673 -0.040966 -0.049422 -0.160917 0.785684 0.046741 -0.616860 0.191410 0.590020 -0.032947 -0.077119 -0.152802 0.785684 0.046741 -0.616860 0.169058 0.522833 -0.040966 -0.049422 -0.160917 0.834235 0.081761 -0.545313 0.191410 0.590020 -0.024684 -0.048566 -0.135880 0.834235 0.081761 -0.545313 0.122524 0.566469 -0.032947 -0.077119 -0.152802 0.834235 0.081761 -0.545313 0.169058 0.522833 -0.040966 -0.049422 -0.160917 0.528082 0.764562 -0.369561 0.191410 0.590020 -0.051717 -0.030921 -0.138004 0.528082 0.764562 -0.369561 0.172420 0.668253 -0.024684 -0.048566 -0.135880 0.528082 0.764562 -0.369561 0.122524 0.566469 -0.034406 -0.085027 -0.138728 0.608441 -0.717136 -0.339875 0.133570 0.514180 -0.054913 -0.089177 -0.166683 0.608441 -0.717136 -0.339875 0.228820 0.514750 -0.032947 -0.077119 -0.152802 0.608441 -0.717136 -0.339875 0.169058 0.522833 -0.054913 -0.089177 -0.166683 0.637355 -0.409948 -0.652473 0.228820 0.514750 -0.053999 -0.068243 -0.178943 0.637355 -0.409948 -0.652473 0.256240 0.570673 -0.032947 -0.077119 -0.152802 0.637355 -0.409948 -0.652473 0.169058 0.522833 -0.034406 -0.085027 -0.138728 0.374905 -0.916591 -0.138950 0.133570 0.514180 -0.073474 -0.097069 -0.164703 0.374905 -0.916591 -0.138950 0.255890 0.486160 -0.054913 -0.089177 -0.166683 0.374905 -0.916591 -0.138950 0.228820 0.514750 -0.095526 -0.117518 -0.143070 0.512856 -0.820429 -0.252735 0.282049 0.406200 -0.102843 -0.103309 -0.204043 0.512856 -0.820429 -0.252735 0.415881 0.497320 -0.073474 -0.097069 -0.164703 0.512856 -0.820429 -0.252735 0.259420 0.472470 -0.073474 -0.097069 -0.164703 0.676644 -0.612992 -0.407913 0.259420 0.472470 -0.102843 -0.103309 -0.204043 0.676644 -0.612992 -0.407913 0.415881 0.497320 -0.072018 -0.074296 -0.196510 0.676644 -0.612992 -0.407913 0.361480 0.499110 -0.095526 -0.117518 -0.143070 0.236883 -0.939518 -0.247370 0.282049 0.406200 -0.124310 -0.115529 -0.178188 0.236883 -0.939518 -0.247370 0.421920 0.440600 -0.102843 -0.103309 -0.204043 0.236883 -0.939518 -0.247370 0.415881 0.497320 -0.102843 -0.103309 -0.204043 0.424966 -0.904694 0.030537 0.415881 0.497320 -0.151491 -0.126917 -0.226451 0.424966 -0.904694 0.030537 0.608100 0.477680 -0.142783 -0.123768 -0.254342 0.424966 -0.904694 0.030537 0.645660 0.519570 -0.168455 -0.131316 -0.250414 0.272706 -0.960063 -0.062537 0.689931 0.491150 -0.142754 -0.121434 -0.290047 0.272706 -0.960063 -0.062537 0.754360 0.554610 -0.142783 -0.123768 -0.254342 0.272706 -0.960063 -0.062537 0.645660 0.519570 -0.162641 -0.121335 -0.214932 -0.169057 -0.941215 0.292463 0.600580 0.452870 -0.168455 -0.131316 -0.250414 -0.169057 -0.941215 0.292463 0.689931 0.491150 -0.151491 -0.126917 -0.226451 -0.169057 -0.941215 0.292463 0.608100 0.477680 -0.168455 -0.131316 -0.250414 -0.250108 -0.920587 0.299941 0.689931 0.491150 -0.162641 -0.121335 -0.214932 -0.250108 -0.920587 0.299941 0.600580 0.452870 -0.192548 -0.119802 -0.235165 -0.250108 -0.920587 0.299941 0.712841 0.454750 -0.192548 -0.119802 -0.235165 -0.575113 -0.594797 0.561660 0.712841 0.454750 -0.175871 -0.092860 -0.189557 -0.575113 -0.594797 0.561660 0.559241 0.386500 -0.205504 -0.102593 -0.230207 -0.575113 -0.594797 0.561660 0.730051 0.431070 -0.205504 -0.102593 -0.230207 -0.813566 -0.099523 0.572892 0.730051 0.431070 -0.180305 -0.073818 -0.189423 -0.813566 -0.099523 0.572892 0.576059 0.350370 -0.204769 -0.059822 -0.221733 -0.813566 -0.099523 0.572892 0.717807 0.342718 -0.162641 -0.121335 -0.214932 -0.386754 -0.765893 0.513643 0.600580 0.452870 -0.161023 -0.105518 -0.190129 -0.386754 -0.765893 0.513643 0.528620 0.411331 -0.192548 -0.119802 -0.235165 -0.386754 -0.765893 0.513643 0.712841 0.454750 -0.161023 -0.105518 -0.190129 -0.521526 -0.637389 0.567226 0.528620 0.411331 -0.175871 -0.092860 -0.189557 -0.521526 -0.637389 0.567226 0.559241 0.386500 -0.192548 -0.119802 -0.235165 -0.521526 -0.637389 0.567226 0.712841 0.454750 -0.175871 -0.092860 -0.189557 -0.772734 -0.184209 0.607413 0.559241 0.386500 -0.180305 -0.073818 -0.189423 -0.772734 -0.184209 0.607413 0.576059 0.350370 -0.205504 -0.102593 -0.230207 -0.772734 -0.184209 0.607413 0.730051 0.431070 -0.180305 -0.073818 -0.189423 -0.797283 -0.000158 0.603606 0.576059 0.350370 -0.164097 -0.053186 -0.168009 -0.797283 -0.000158 0.603606 0.473341 0.291050 -0.204769 -0.059822 -0.221733 -0.797283 -0.000158 0.603606 0.717807 0.342718 -0.161023 -0.105518 -0.190129 -0.561833 -0.680306 0.470667 0.528620 0.411331 -0.158610 -0.087944 -0.161847 -0.561833 -0.680306 0.470667 0.443599 0.357970 -0.175871 -0.092860 -0.189557 -0.561833 -0.680306 0.470667 0.559241 0.386500 -0.175871 -0.092860 -0.189557 -0.816845 -0.194029 0.543248 0.559241 0.386500 -0.158610 -0.087944 -0.161847 -0.816845 -0.194029 0.543248 0.443599 0.357970 -0.180305 -0.073818 -0.189423 -0.816845 -0.194029 0.543248 0.576059 0.350370 -0.161023 -0.105518 -0.190129 -0.494924 -0.718494 0.488688 0.528620 0.411331 -0.129650 -0.099186 -0.149046 -0.494924 -0.718494 0.488688 0.350790 0.366940 -0.158610 -0.087944 -0.161847 -0.494924 -0.718494 0.488688 0.443599 0.357970 -0.158610 -0.087944 -0.161847 -0.818624 -0.229412 0.526522 0.443599 0.357970 -0.147506 -0.066233 -0.135123 -0.818624 -0.229412 0.526522 0.342009 0.305170 -0.180305 -0.073818 -0.189423 -0.818624 -0.229412 0.526522 0.576059 0.350370 -0.180305 -0.073818 -0.189423 -0.854780 0.158605 0.494161 0.576059 0.350370 -0.147506 -0.066233 -0.135123 -0.854780 0.158605 0.494161 0.342009 0.305170 -0.164097 -0.053186 -0.168009 -0.854780 0.158605 0.494161 0.473341 0.291050 -0.147506 -0.066233 -0.135123 -0.801007 0.294772 0.521054 0.342009 0.305170 -0.140091 -0.047694 -0.134212 -0.801007 0.294772 0.521054 0.319526 0.270466 -0.164097 -0.053186 -0.168009 -0.801007 0.294772 0.521054 0.473341 0.291050 -0.140091 -0.047694 -0.134212 -0.624110 0.709123 0.328073 0.319526 0.270466 -0.147443 -0.045298 -0.153377 -0.624110 0.709123 0.328073 0.381480 0.262520 -0.164097 -0.053186 -0.168009 -0.624110 0.709123 0.328073 0.473341 0.291050 -0.175397 -0.029894 -0.208187 -0.687990 0.526958 0.498984 0.596889 0.253480 -0.164097 -0.053186 -0.168009 -0.687990 0.526958 0.498984 0.473341 0.291050 -0.147443 -0.045298 -0.153377 -0.687990 0.526958 0.498984 0.381480 0.262520 -0.164097 -0.053186 -0.168009 -0.723318 0.489391 0.487142 0.473341 0.291050 -0.175397 -0.029894 -0.208187 -0.723318 0.489391 0.487142 0.596889 0.253480 -0.204769 -0.059822 -0.221733 -0.723318 0.489391 0.487142 0.717807 0.342718 -0.175397 -0.029894 -0.208187 -0.741902 0.563983 0.362636 0.596889 0.253480 -0.169827 -0.013664 -0.222033 -0.741902 0.563983 0.362636 0.587758 0.225680 -0.204769 -0.059822 -0.221733 -0.741902 0.563983 0.362636 0.717807 0.342718 -0.102843 -0.103309 -0.204043 0.519801 -0.853827 0.028033 0.415881 0.497320 -0.124310 -0.115529 -0.178188 0.519801 -0.853827 0.028033 0.421920 0.440600 -0.123395 -0.115491 -0.193997 0.519801 -0.853827 0.028033 0.457371 0.460770 -0.102843 -0.103309 -0.204043 0.471050 -0.876510 -0.099206 0.415881 0.497320 -0.123395 -0.115491 -0.193997 0.471050 -0.876510 -0.099206 0.457371 0.460770 -0.151491 -0.126917 -0.226451 0.471050 -0.876510 -0.099206 0.608100 0.477680 -0.124310 -0.115529 -0.178188 -0.059584 -0.998206 -0.005848 0.421920 0.440600 -0.139576 -0.114521 -0.194705 -0.059584 -0.998206 -0.005848 0.499065 0.446365 -0.123395 -0.115491 -0.193997 -0.059584 -0.998206 -0.005848 0.457371 0.460770 -0.123395 -0.115491 -0.193997 -0.072024 -0.919631 0.386125 0.457371 0.460770 -0.139576 -0.114521 -0.194705 -0.072024 -0.919631 0.386125 0.499065 0.446365 -0.151491 -0.126917 -0.226451 -0.072024 -0.919631 0.386125 0.608100 0.477680 -0.139576 -0.114521 -0.194705 -0.064537 -0.921118 0.383896 0.499065 0.446365 -0.162641 -0.121335 -0.214932 -0.064537 -0.921118 0.383896 0.600580 0.452870 -0.151491 -0.126917 -0.226451 -0.064537 -0.921118 0.383896 0.608100 0.477680 -0.139576 -0.114521 -0.194705 -0.227822 -0.814171 0.534063 0.499065 0.446365 -0.161023 -0.105518 -0.190129 -0.227822 -0.814171 0.534063 0.528620 0.411331 -0.162641 -0.121335 -0.214932 -0.227822 -0.814171 0.534063 0.600580 0.452870 -0.129650 -0.099186 -0.149046 -0.294368 -0.884819 0.361169 0.350790 0.366940 -0.161023 -0.105518 -0.190129 -0.294368 -0.884819 0.361169 0.528620 0.411331 -0.139576 -0.114521 -0.194705 -0.294368 -0.884819 0.361169 0.499065 0.446365 -0.095526 -0.117518 -0.143070 -0.489842 -0.795621 0.356430 0.282049 0.406200 -0.129650 -0.099186 -0.149046 -0.489842 -0.795621 0.356430 0.350790 0.366940 -0.124310 -0.115529 -0.178188 -0.489842 -0.795621 0.356430 0.421920 0.440600 -0.168455 -0.131316 -0.250414 0.279015 -0.960051 -0.021281 0.689931 0.491150 -0.142783 -0.123768 -0.254342 0.279015 -0.960051 -0.021281 0.645660 0.519570 -0.151491 -0.126917 -0.226451 0.279015 -0.960051 -0.021281 0.608100 0.477680 -0.175397 -0.029894 -0.208187 -0.578082 0.635273 0.512102 0.596889 0.253480 -0.137006 -0.024205 -0.171907 -0.578082 0.635273 0.512102 0.365560 0.214520 -0.169827 -0.013664 -0.222033 -0.578082 0.635273 0.512102 0.587758 0.225680 -0.169827 -0.013664 -0.222033 -0.272387 0.890056 0.365521 0.587758 0.225680 -0.137006 -0.024205 -0.171907 -0.272387 0.890056 0.365521 0.365560 0.214520 -0.113704 -0.014641 -0.177831 -0.272387 0.890056 0.365521 0.380571 0.208017 -0.175397 -0.029894 -0.208187 -0.549633 0.688114 0.473712 0.596889 0.253480 -0.147443 -0.045298 -0.153377 -0.549633 0.688114 0.473712 0.381480 0.262520 -0.137006 -0.024205 -0.171907 -0.549633 0.688114 0.473712 0.365560 0.214520 -0.147443 -0.045298 -0.153377 -0.686218 0.641229 0.343410 0.381480 0.262520 -0.140091 -0.047694 -0.134212 -0.686218 0.641229 0.343410 0.319526 0.270466 -0.137006 -0.024205 -0.171907 -0.686218 0.641229 0.343410 0.365560 0.214520 -0.095276 -0.068078 -0.064566 -0.488904 -0.747201 0.450181 0.130968 0.286588 -0.133343 -0.079854 -0.125453 -0.488904 -0.747201 0.450181 0.293109 0.318900 -0.089139 -0.098688 -0.108707 -0.488904 -0.747201 0.450181 0.188060 0.358130 -0.133343 -0.079854 -0.125453 -0.493067 -0.709186 0.503924 0.293109 0.318900 -0.129650 -0.099186 -0.149046 -0.493067 -0.709186 0.503924 0.350790 0.366940 -0.089139 -0.098688 -0.108707 -0.493067 -0.709186 0.503924 0.188060 0.358130 -0.029661 -0.072947 -0.026017 -0.402720 -0.693022 0.597944 0.040560 0.331810 -0.016507 -0.053189 0.005742 -0.402720 -0.693022 0.597944 0.082710 0.266979 -0.095276 -0.068078 -0.064566 -0.402720 -0.693022 0.597944 0.130968 0.286588 -0.095276 -0.068078 -0.064566 -0.529318 -0.485446 0.695819 0.130968 0.286588 -0.016507 -0.053189 0.005742 -0.529318 -0.485446 0.695819 0.082710 0.266979 -0.077178 -0.040515 -0.031569 -0.529318 -0.485446 0.695819 0.101726 0.254639 -0.095276 -0.068078 -0.064566 -0.636433 -0.383377 0.669309 0.130968 0.286588 -0.077178 -0.040515 -0.031569 -0.636433 -0.383377 0.669309 0.101726 0.254639 -0.117000 -0.054747 -0.077587 -0.636433 -0.383377 0.669309 0.163450 0.270300 -0.117000 -0.054747 -0.077587 -0.737679 -0.096543 0.668213 0.163450 0.270300 -0.077178 -0.040515 -0.031569 -0.737679 -0.096543 0.668213 0.101726 0.254639 -0.094869 -0.027848 -0.049269 -0.737679 -0.096543 0.668213 0.131870 0.234050 -0.029661 -0.072947 -0.026017 0.012096 -0.951483 0.307463 0.040560 0.331810 -0.069241 -0.093206 -0.087154 0.012096 -0.951483 0.307463 0.131630 0.354850 -0.012845 -0.075192 -0.033626 0.012096 -0.951483 0.307463 0.064239 0.351802 -0.069241 -0.093206 -0.087154 -0.000226 -0.917027 0.398825 0.131630 0.354850 -0.095526 -0.117518 -0.143070 -0.000226 -0.917027 0.398825 0.282049 0.406200 -0.047403 -0.100711 -0.104398 -0.000226 -0.917027 0.398825 0.159656 0.410770 -0.095276 -0.068078 -0.064566 -0.329351 -0.796728 0.506708 0.130968 0.286588 -0.089139 -0.098688 -0.108707 -0.329351 -0.796728 0.506708 0.188060 0.358130 -0.069241 -0.093206 -0.087154 -0.329351 -0.796728 0.506708 0.131630 0.354850 -0.069241 -0.093206 -0.087154 -0.320327 -0.804401 0.500329 0.131630 0.354850 -0.089139 -0.098688 -0.108707 -0.320327 -0.804401 0.500329 0.188060 0.358130 -0.095526 -0.117518 -0.143070 -0.320327 -0.804401 0.500329 0.282049 0.406200 -0.029661 -0.072947 -0.026017 -0.347068 -0.799819 0.489728 0.040560 0.331810 -0.095276 -0.068078 -0.064566 -0.347068 -0.799819 0.489728 0.130968 0.286588 -0.069241 -0.093206 -0.087154 -0.347068 -0.799819 0.489728 0.131630 0.354850 -0.129650 -0.099186 -0.149046 -0.454677 -0.809791 0.370820 0.350790 0.366940 -0.139576 -0.114521 -0.194705 -0.454677 -0.809791 0.370820 0.499065 0.446365 -0.124310 -0.115529 -0.178188 -0.454677 -0.809791 0.370820 0.421920 0.440600 -0.100711 -0.017457 -0.071205 -0.440118 0.897938 0.001620 0.143802 0.982094 -0.082414 -0.008469 -0.082211 -0.440118 0.897938 0.001620 0.147348 0.905596 -0.107972 -0.020968 -0.097765 -0.440118 0.897938 0.001620 0.209280 0.974420 -0.045772 -0.006289 -0.019566 -0.515516 0.712087 0.476629 0.000000 0.000000 -0.070686 -0.013774 -0.035330 -0.515516 0.712087 0.476629 1.000000 1.000000 -0.060966 -0.016531 -0.020698 -0.515516 0.712087 0.476629 1.000000 0.000000 -0.045772 -0.006289 -0.019566 -0.515529 0.712052 0.476667 0.000000 0.000000 -0.080407 -0.011017 -0.049962 -0.515529 0.712052 0.476667 1.000000 0.000000 -0.070686 -0.013774 -0.035330 -0.515529 0.712052 0.476667 1.000000 1.000000 -0.042958 -0.003989 -0.023216 -0.365347 0.888354 0.278117 0.000000 0.000000 -0.080407 -0.011017 -0.049962 -0.365347 0.888354 0.278117 1.000000 1.000000 -0.045772 -0.006289 -0.019566 -0.365347 0.888354 0.278117 1.000000 0.000000 -0.042958 -0.003989 -0.023216 -0.264898 0.956846 0.119474 0.000000 0.000000 -0.064116 -0.005870 -0.055063 -0.264898 0.956846 0.119474 1.000000 1.000000 -0.080407 -0.011017 -0.049962 -0.264898 0.956846 0.119474 1.000000 0.000000 -0.045772 -0.006289 -0.019566 -0.536799 0.754638 0.377317 0.000000 0.000000 -0.060966 -0.016531 -0.020698 -0.536799 0.754638 0.377317 1.000000 1.000000 -0.041213 -0.007368 -0.010922 -0.536799 0.754638 0.377317 1.000000 0.000000 -0.041213 -0.007368 -0.010922 -0.561355 0.562765 0.606775 0.000000 0.000000 -0.060966 -0.016531 -0.020698 -0.561355 0.562765 0.606775 1.000000 0.000000 -0.045510 -0.018062 -0.004979 -0.561355 0.562765 0.606775 1.000000 1.000000 -0.038985 -0.007852 -0.007374 -0.673320 0.546990 0.497435 0.000000 0.000000 -0.041213 -0.007368 -0.010922 -0.673320 0.546990 0.497435 1.000000 0.000000 -0.045510 -0.018062 -0.004979 -0.673320 0.546990 0.497435 1.000000 1.000000 -0.038985 -0.007852 -0.007374 -0.640237 0.537824 0.548491 0.000000 0.000000 -0.045510 -0.018062 -0.004979 -0.640237 0.537824 0.548491 1.000000 1.000000 -0.031328 -0.009383 0.003065 -0.640237 0.537824 0.548491 1.000000 0.000000 -0.031328 -0.009383 0.003065 -0.627779 0.416148 0.657810 0.000000 0.000000 -0.045510 -0.018062 -0.004979 -0.627779 0.416148 0.657810 1.000000 1.000000 -0.030055 -0.019593 0.010739 -0.627779 0.416148 0.657810 1.000000 0.000000 -0.031328 -0.009383 0.003065 -0.541170 0.461086 0.703232 0.000000 0.000000 -0.030055 -0.019593 0.010739 -0.541170 0.461086 0.703232 1.000000 1.000000 -0.024969 -0.006524 0.006084 -0.541170 0.461086 0.703232 1.000000 0.000000 0.005457 0.003922 0.021488 -0.480042 0.796582 0.367447 0.000000 0.000000 -0.003050 0.001094 0.016505 -0.480042 0.796582 0.367447 1.000000 0.000000 -0.003552 -0.007667 0.034842 -0.480042 0.796582 0.367447 1.000000 1.000000 0.005457 0.003922 0.021488 -0.615744 0.751523 0.236795 0.000000 0.000000 -0.003552 -0.007667 0.034842 -0.615744 0.751523 0.236795 1.000000 0.000000 0.012243 0.001958 0.045367 -0.615744 0.751523 0.236795 1.000000 1.000000 0.005457 0.003922 0.021488 -0.318409 0.933086 0.167231 0.000000 0.000000 0.012243 0.001958 0.045367 -0.318409 0.933086 0.167231 1.000000 1.000000 0.017288 0.006507 0.029591 -0.318409 0.933086 0.167231 1.000000 0.000000 0.025400 0.008882 0.035581 -0.374675 0.915863 0.144271 0.000000 0.000000 0.017288 0.006507 0.029591 -0.374675 0.915863 0.144271 1.000000 0.000000 0.012243 0.001958 0.045367 -0.374675 0.915863 0.144271 1.000000 1.000000 0.025400 0.008882 0.035581 -0.494629 0.867597 -0.051154 0.000000 0.000000 0.012243 0.001958 0.045367 -0.494629 0.867597 -0.051154 1.000000 1.000000 0.028037 0.011583 0.055893 -0.494629 0.867597 -0.051154 1.000000 0.000000 0.025400 0.008882 0.035581 -0.265878 0.959503 -0.093073 0.000000 0.000000 0.028037 0.011583 0.055893 -0.265878 0.959503 -0.093073 1.000000 1.000000 0.028559 0.009976 0.037835 -0.265878 0.959503 -0.093073 1.000000 0.000000 0.028559 0.009976 0.037835 -0.116648 0.988960 -0.091381 0.000000 0.000000 0.028037 0.011583 0.055893 -0.116648 0.988960 -0.091381 1.000000 0.000000 0.036877 0.011536 0.044100 -0.116648 0.988960 -0.091381 1.000000 1.000000 0.028559 0.009976 0.037835 -0.087429 0.987671 -0.129854 0.000000 0.000000 0.036877 0.011536 0.044100 -0.087429 0.987671 -0.129854 1.000000 1.000000 0.031086 0.009975 0.036126 -0.087429 0.987671 -0.129854 1.000000 0.000000 0.037350 0.010384 0.030379 -0.110824 0.990030 -0.086942 0.000000 0.000000 0.036877 0.011536 0.044100 -0.110824 0.990030 -0.086942 1.000000 1.000000 0.045717 0.011490 0.032308 -0.110824 0.990030 -0.086942 1.000000 0.000000 0.031086 0.009975 0.036126 -0.144849 0.985556 -0.087740 0.000000 0.000000 0.036877 0.011536 0.044100 -0.144849 0.985556 -0.087740 1.000000 1.000000 0.037350 0.010384 0.030379 -0.144849 0.985556 -0.087740 1.000000 0.000000 0.040411 0.009454 0.028108 -0.026287 0.912167 -0.408975 0.000000 0.000000 0.037350 0.010384 0.030379 -0.026287 0.912167 -0.408975 1.000000 0.000000 0.045717 0.011490 0.032308 -0.026287 0.912167 -0.408975 1.000000 1.000000 0.048486 0.003959 0.022397 0.143885 0.806883 -0.572920 0.000000 0.000000 0.040411 0.009454 0.028108 0.143885 0.806883 -0.572920 1.000000 0.000000 0.045717 0.011490 0.032308 0.143885 0.806883 -0.572920 1.000000 1.000000 0.055057 -0.002370 0.018595 0.420243 0.711610 -0.563034 0.000000 0.000000 0.052980 -0.000209 0.019776 0.420243 0.711610 -0.563034 1.000000 0.000000 0.063030 -0.001161 0.026074 0.420243 0.711610 -0.563034 1.000000 1.000000 0.055057 -0.002370 0.018595 0.368501 0.772161 -0.517663 0.000000 0.000000 0.063030 -0.001161 0.026074 0.368501 0.772161 -0.517663 1.000000 0.000000 0.050502 -0.009120 0.005284 0.368501 0.772161 -0.517663 1.000000 1.000000 0.055057 -0.002370 0.018595 0.709834 0.499780 -0.496342 0.000000 0.000000 0.050502 -0.009120 0.005284 0.709834 0.499780 -0.496342 1.000000 1.000000 0.050963 -0.002376 0.012734 0.709834 0.499780 -0.496342 1.000000 0.000000 0.050963 -0.002376 0.012734 0.698510 0.508482 -0.503519 0.000000 0.000000 0.050502 -0.009120 0.005284 0.698510 0.508482 -0.503519 1.000000 1.000000 0.042826 -0.002162 0.001662 0.698510 0.508482 -0.503519 1.000000 0.000000 0.042826 -0.002162 0.001662 0.700957 0.518210 -0.490018 0.000000 0.000000 0.050502 -0.009120 0.005284 0.700957 0.518210 -0.490018 1.000000 0.000000 0.040124 -0.009825 -0.010307 0.700957 0.518210 -0.490018 1.000000 1.000000 0.037686 -0.002161 -0.005301 0.676497 0.541338 -0.499304 0.000000 0.000000 0.042826 -0.002162 0.001662 0.676497 0.541338 -0.499304 1.000000 0.000000 0.040124 -0.009825 -0.010307 0.676497 0.541338 -0.499304 1.000000 1.000000 0.037686 -0.002161 -0.005301 0.691229 0.536271 -0.484372 0.000000 0.000000 0.040124 -0.009825 -0.010307 0.691229 0.536271 -0.484372 1.000000 1.000000 0.029745 -0.010530 -0.025899 0.691229 0.536271 -0.484372 1.000000 0.000000 0.037686 -0.002161 -0.005301 0.544411 0.682763 -0.487290 0.000000 0.000000 0.029745 -0.010530 -0.025899 0.544411 0.682763 -0.487290 1.000000 1.000000 0.026633 -0.001955 -0.017361 0.544411 0.682763 -0.487290 1.000000 0.000000 0.026633 -0.001955 -0.017361 0.612689 0.658097 -0.437631 0.000000 0.000000 0.029745 -0.010530 -0.025899 0.612689 0.658097 -0.437631 1.000000 0.000000 0.019367 -0.011236 -0.041490 0.612689 0.658097 -0.437631 1.000000 1.000000 0.026633 -0.001955 -0.017361 0.419944 0.797484 -0.433204 0.000000 0.000000 0.019367 -0.011236 -0.041490 0.419944 0.797484 -0.433204 1.000000 1.000000 0.018301 -0.002420 -0.026294 0.419944 0.797484 -0.433204 1.000000 0.000000 0.018301 -0.002420 -0.026294 0.310508 0.831512 -0.460622 0.000000 0.000000 0.019367 -0.011236 -0.041490 0.310508 0.831512 -0.460622 1.000000 1.000000 0.010551 -0.002935 -0.032448 0.310508 0.831512 -0.460622 1.000000 0.000000 0.010551 -0.002935 -0.032448 0.442964 0.832609 -0.332483 0.000000 0.000000 0.019367 -0.011236 -0.041490 0.442964 0.832609 -0.332483 1.000000 1.000000 0.008989 -0.011941 -0.057082 0.442964 0.832609 -0.332483 1.000000 0.000000 0.010551 -0.002935 -0.032448 0.230950 0.908997 -0.346967 0.000000 0.000000 0.008989 -0.011941 -0.057082 0.230950 0.908997 -0.346967 1.000000 1.000000 0.002911 -0.002986 -0.037667 0.230950 0.908997 -0.346967 1.000000 0.000000 0.002911 -0.002986 -0.037667 0.251867 0.906368 -0.339205 0.000000 0.000000 0.008989 -0.011941 -0.057082 0.251867 0.906368 -0.339205 1.000000 1.000000 -0.004764 -0.002641 -0.042444 0.251867 0.906368 -0.339205 1.000000 0.000000 -0.004764 -0.002641 -0.042444 0.286681 0.907444 -0.307180 0.000000 0.000000 0.008989 -0.011941 -0.057082 0.286681 0.907444 -0.307180 1.000000 0.000000 -0.008270 -0.013472 -0.077712 0.286681 0.907444 -0.307180 1.000000 1.000000 -0.014017 -0.001829 -0.047775 0.257267 0.916287 -0.306972 0.000000 0.000000 -0.004764 -0.002641 -0.042444 0.257267 0.916287 -0.306972 1.000000 0.000000 -0.008270 -0.013472 -0.077712 0.257267 0.916287 -0.306972 1.000000 1.000000 -0.014017 -0.001829 -0.047775 0.279052 0.911860 -0.301068 0.000000 0.000000 -0.008270 -0.013472 -0.077712 0.279052 0.911860 -0.301068 1.000000 1.000000 -0.025528 -0.015002 -0.098342 0.279052 0.911860 -0.301068 1.000000 0.000000 -0.014017 -0.001829 -0.047775 0.106410 0.959588 -0.260514 0.000000 0.000000 -0.036677 -0.007862 -0.079253 0.106410 0.959588 -0.260514 1.000000 1.000000 -0.020227 0.000071 -0.043313 0.106410 0.959588 -0.260514 1.000000 0.000000 -0.014017 -0.001829 -0.047775 0.133057 0.951290 -0.278106 0.000000 0.000000 -0.025528 -0.015002 -0.098342 0.133057 0.951290 -0.278106 1.000000 0.000000 -0.036677 -0.007862 -0.079253 0.133057 0.951290 -0.278106 1.000000 1.000000 -0.020227 0.000071 -0.043313 0.140005 0.951457 -0.274096 0.000000 0.000000 -0.036677 -0.007862 -0.079253 0.140005 0.951457 -0.274096 1.000000 1.000000 -0.047826 -0.000722 -0.060163 0.140005 0.951457 -0.274096 1.000000 0.000000 -0.026591 0.001059 -0.038391 0.051904 0.989943 -0.131603 0.000000 0.000000 -0.020227 0.000071 -0.043313 0.051904 0.989943 -0.131603 1.000000 0.000000 -0.047826 -0.000722 -0.060163 0.051904 0.989943 -0.131603 1.000000 1.000000 -0.026591 0.001059 -0.038391 -0.038404 0.998284 -0.044205 0.000000 0.000000 -0.047826 -0.000722 -0.060163 -0.038404 0.998284 -0.044205 1.000000 1.000000 -0.030314 0.001072 -0.034863 -0.038404 0.998284 -0.044205 1.000000 0.000000 -0.034613 -0.000049 -0.031344 -0.212069 0.975881 0.051798 0.000000 0.000000 -0.030314 0.001072 -0.034863 -0.212069 0.975881 0.051798 1.000000 0.000000 -0.055971 -0.003296 -0.057613 -0.212069 0.975881 0.051798 1.000000 1.000000 -0.030314 0.001072 -0.034863 -0.266010 0.956932 0.116270 0.000000 0.000000 -0.047826 -0.000722 -0.060163 -0.266010 0.956932 0.116270 1.000000 0.000000 -0.055971 -0.003296 -0.057613 -0.266010 0.956932 0.116270 1.000000 1.000000 -0.038250 -0.001447 -0.027644 -0.267589 0.958424 0.099096 0.000000 0.000000 -0.034613 -0.000049 -0.031344 -0.267589 0.958424 0.099096 1.000000 0.000000 -0.055971 -0.003296 -0.057613 -0.267589 0.958424 0.099096 1.000000 1.000000 -0.038250 -0.001447 -0.027644 -0.270871 0.957291 0.101107 0.000000 0.000000 -0.055971 -0.003296 -0.057613 -0.270871 0.957291 0.101107 1.000000 1.000000 -0.064116 -0.005870 -0.055063 -0.270871 0.957291 0.101107 1.000000 0.000000 -0.038250 -0.001447 -0.027644 -0.339058 0.925165 0.170615 0.000000 0.000000 -0.064116 -0.005870 -0.055063 -0.339058 0.925165 0.170615 1.000000 1.000000 -0.042958 -0.003989 -0.023216 -0.339058 0.925165 0.170615 1.000000 0.000000 -0.024969 -0.006524 0.006084 -0.700964 0.465309 0.540497 0.000000 0.000000 -0.030055 -0.019593 0.010739 -0.700964 0.465309 0.540497 1.000000 0.000000 -0.023429 -0.016611 0.016765 -0.700964 0.465309 0.540497 1.000000 1.000000 -0.019299 -0.004036 0.008727 -0.539148 0.572132 0.618049 0.000000 0.000000 -0.024969 -0.006524 0.006084 -0.539148 0.572132 0.618049 1.000000 0.000000 -0.023429 -0.016611 0.016765 -0.539148 0.572132 0.618049 1.000000 1.000000 -0.012031 -0.001713 0.012042 -0.484270 0.578566 0.656311 0.000000 0.000000 -0.019299 -0.004036 0.008727 -0.484270 0.578566 0.656311 1.000000 0.000000 -0.023429 -0.016611 0.016765 -0.484270 0.578566 0.656311 1.000000 1.000000 -0.012031 -0.001713 0.012042 -0.657173 0.632668 0.409701 0.000000 0.000000 -0.023429 -0.016611 0.016765 -0.657173 0.632668 0.409701 1.000000 1.000000 -0.016803 -0.013630 0.022790 -0.657173 0.632668 0.409701 1.000000 0.000000 -0.006243 0.000018 0.014676 -0.460670 0.689048 0.559460 0.000000 0.000000 -0.012031 -0.001713 0.012042 -0.460670 0.689048 0.559460 1.000000 0.000000 -0.016803 -0.013630 0.022790 -0.460670 0.689048 0.559460 1.000000 1.000000 -0.006243 0.000018 0.014676 -0.629542 0.694363 0.348620 0.000000 0.000000 -0.016803 -0.013630 0.022790 -0.629542 0.694363 0.348620 1.000000 1.000000 -0.003552 -0.007667 0.034842 -0.629542 0.694363 0.348620 1.000000 0.000000 -0.006243 0.000018 0.014676 -0.479183 0.796996 0.367668 0.000000 0.000000 -0.003552 -0.007667 0.034842 -0.479183 0.796996 0.367668 1.000000 1.000000 -0.003050 0.001094 0.016505 -0.479183 0.796996 0.367668 1.000000 0.000000 0.052980 -0.000209 0.019776 0.444707 0.768639 -0.459815 0.000000 0.000000 0.048486 0.003959 0.022397 0.444707 0.768639 -0.459815 1.000000 0.000000 0.045717 0.011490 0.032308 0.444707 0.768639 -0.459815 1.000000 1.000000 0.052980 -0.000209 0.019776 0.386545 0.775200 -0.499648 0.000000 0.000000 0.045717 0.011490 0.032308 0.386545 0.775200 -0.499648 1.000000 0.000000 0.063030 -0.001161 0.026074 0.386545 0.775200 -0.499648 1.000000 1.000000 0.053360 0.088072 0.187479 -0.745121 -0.286945 0.602044 0.322451 0.094662 0.048824 0.075798 0.176015 -0.745121 -0.286945 0.602044 0.338641 0.110258 0.060302 0.081476 0.192927 -0.745121 -0.286945 0.602044 0.310308 0.088773 0.048824 0.075798 0.176015 -0.916966 0.394495 -0.059550 0.338641 0.110258 0.053360 0.088072 0.187479 -0.916966 0.394495 -0.059550 0.322451 0.094662 0.053192 0.085858 0.175399 -0.916966 0.394495 -0.059550 0.335220 0.101700 -0.100711 -0.017457 -0.071205 -0.665292 0.590463 0.456881 0.966166 0.212554 -0.094869 -0.027848 -0.049269 -0.665292 0.590463 0.456881 0.952723 0.231841 -0.080407 -0.011017 -0.049962 -0.665292 0.590463 0.456881 0.934786 0.219472 -0.080407 -0.011017 -0.049962 -0.629837 0.563209 0.534884 0.934786 0.219472 -0.094869 -0.027848 -0.049269 -0.629837 0.563209 0.534884 0.952723 0.231841 -0.071377 -0.019477 -0.030421 -0.629837 0.563209 0.534884 0.889548 0.226645 -0.094869 -0.027848 -0.049269 -0.649287 0.138224 0.747877 0.952723 0.231841 -0.077178 -0.040515 -0.031569 -0.649287 0.138224 0.747877 0.899208 0.251069 -0.071377 -0.019477 -0.030421 -0.649287 0.138224 0.747877 0.889548 0.226645 -0.071377 -0.019477 -0.030421 -0.697333 0.154085 0.699989 0.889548 0.226645 -0.077178 -0.040515 -0.031569 -0.697333 0.154085 0.699989 0.899208 0.251069 -0.060966 -0.016531 -0.020698 -0.697333 0.154085 0.699989 0.847640 0.236770 -0.077178 -0.040515 -0.031569 -0.673515 0.125054 0.728518 0.899208 0.251069 -0.030500 -0.033141 0.010319 -0.673515 0.125054 0.728518 0.740681 0.264800 -0.060966 -0.016531 -0.020698 -0.673515 0.125054 0.728518 0.847640 0.236770 -0.030500 -0.033141 0.010319 -0.613359 -0.556141 0.560800 0.740681 0.264800 -0.016507 -0.053189 0.005742 -0.613359 -0.556141 0.560800 0.718071 0.309760 -0.001950 -0.040273 0.034472 -0.613359 -0.556141 0.560800 0.643033 0.298300 -0.077178 -0.040515 -0.031569 -0.523697 -0.519646 0.675062 0.899208 0.251069 -0.016507 -0.053189 0.005742 -0.523697 -0.519646 0.675062 0.718071 0.309760 -0.030500 -0.033141 0.010319 -0.523697 -0.519646 0.675062 0.740681 0.264800 0.009464 -0.061640 0.000422 -0.181614 -0.859215 0.478294 0.670646 0.372138 -0.001950 -0.040273 0.034472 -0.181614 -0.859215 0.478294 0.643033 0.298300 -0.016507 -0.053189 0.005742 -0.181614 -0.859215 0.478294 0.718071 0.309760 0.009464 -0.061640 0.000422 -0.227359 -0.857354 0.461792 0.670646 0.372138 0.031230 -0.028204 0.073215 -0.227359 -0.857354 0.461792 0.513823 0.299301 -0.001950 -0.040273 0.034472 -0.227359 -0.857354 0.461792 0.643033 0.298300 -0.001950 -0.040273 0.034472 -0.691545 -0.419585 0.587975 0.643033 0.298300 -0.001327 -0.021202 0.048814 -0.691545 -0.419585 0.587975 0.618682 0.273535 -0.023862 -0.025303 0.019383 -0.691545 -0.419585 0.587975 0.712310 0.264110 -0.001327 -0.021202 0.048814 -0.750619 0.410812 0.517497 0.618682 0.273535 -0.003552 -0.007667 0.034842 -0.750619 0.410812 0.517497 0.647650 0.255020 -0.023862 -0.025303 0.019383 -0.750619 0.410812 0.517497 0.712310 0.264110 -0.001327 -0.021202 0.048814 -0.839834 0.316908 0.440737 0.618682 0.273535 0.016955 -0.004583 0.071701 -0.839834 0.316908 0.440737 0.548534 0.263306 -0.003552 -0.007667 0.034842 -0.839834 0.316908 0.440737 0.647650 0.255020 0.016955 -0.004583 0.071701 -0.726514 0.460848 0.509702 0.548534 0.263306 0.029876 -0.001883 0.087677 -0.726514 0.460848 0.509702 0.498770 0.268030 0.034158 0.013303 0.080050 -0.726514 0.460848 0.509702 0.513733 0.250058 0.043933 -0.002318 0.113530 -0.668360 -0.655072 0.352384 0.426570 0.255980 0.034355 0.014456 0.126546 -0.668360 -0.655072 0.352384 0.427820 0.215940 0.029876 -0.001883 0.087677 -0.668360 -0.655072 0.352384 0.498770 0.268030 0.029876 -0.001883 0.087677 -0.838913 -0.460432 0.290218 0.498770 0.268030 0.034355 0.014456 0.126546 -0.838913 -0.460432 0.290218 0.427820 0.215940 0.027702 0.029101 0.130549 -0.838913 -0.460432 0.290218 0.434330 0.198350 0.027702 0.029101 0.130549 -0.991845 -0.023218 -0.125317 0.434330 0.198350 0.027156 0.044410 0.132034 -0.991845 -0.023218 -0.125317 0.437699 0.188555 0.030087 0.039882 0.109675 -0.991845 -0.023218 -0.125317 0.470850 0.222740 0.034355 0.014456 0.126546 -0.785511 -0.467636 0.405326 0.427820 0.215940 0.033561 0.031491 0.144661 -0.785511 -0.467636 0.405326 0.402106 0.187773 0.027702 0.029101 0.130549 -0.785511 -0.467636 0.405326 0.434330 0.198350 0.033561 0.031491 0.144661 -0.916944 -0.070794 0.392685 0.402106 0.187773 0.027156 0.044410 0.132034 -0.916944 -0.070794 0.392685 0.437699 0.188555 0.027702 0.029101 0.130549 -0.916944 -0.070794 0.392685 0.434330 0.198350 0.033561 0.031491 0.144661 -0.940232 -0.189813 0.282727 0.402106 0.187773 0.031436 0.049052 0.149384 -0.940232 -0.189813 0.282727 0.399565 0.167196 0.027156 0.044410 0.132034 -0.940232 -0.189813 0.282727 0.437699 0.188555 0.027156 0.044410 0.132034 -0.864752 0.495672 0.080705 0.437699 0.188555 0.031436 0.049052 0.149384 -0.864752 0.495672 0.080705 0.399565 0.167196 0.042691 0.068252 0.152059 -0.864752 0.495672 0.080705 0.431340 0.169670 0.031436 0.049052 0.149384 -0.828294 0.515973 -0.218405 0.399565 0.167196 0.036733 0.065820 0.168909 -0.828294 0.515973 -0.218405 0.369148 0.127941 0.042691 0.068252 0.152059 -0.828294 0.515973 -0.218405 0.395810 0.143320 0.031436 0.049052 0.149384 -0.720002 -0.417785 0.554124 0.399565 0.167196 0.041507 0.041081 0.156460 -0.720002 -0.417785 0.554124 0.365580 0.162280 0.036733 0.065820 0.168909 -0.720002 -0.417785 0.554124 0.369148 0.127941 0.036733 0.065820 0.168909 -0.470592 -0.467407 0.748380 0.369148 0.127941 0.041507 0.041081 0.156460 -0.470592 -0.467407 0.748380 0.365580 0.162280 0.053331 0.064539 0.178546 -0.470592 -0.467407 0.748380 0.324280 0.113570 0.054500 0.046985 0.157414 0.334482 -0.813087 0.476457 0.327890 0.162200 0.057856 0.057044 0.172224 0.334482 -0.813087 0.476457 0.313070 0.128910 0.041507 0.041081 0.156460 0.334482 -0.813087 0.476457 0.365580 0.162280 0.041507 0.041081 0.156460 -0.065725 -0.666251 0.742826 0.365580 0.162280 0.057856 0.057044 0.172224 -0.065725 -0.666251 0.742826 0.313070 0.128910 0.053331 0.064539 0.178546 -0.065725 -0.666251 0.742826 0.324280 0.113570 0.057856 0.057044 0.172224 -0.004204 -0.646233 0.763129 0.313070 0.128910 0.060302 0.081476 0.192927 -0.004204 -0.646233 0.763129 0.299460 0.087742 0.053331 0.064539 0.178546 -0.004204 -0.646233 0.763129 0.309980 0.099810 0.057856 0.057044 0.172224 0.038133 -0.648233 0.760487 0.313070 0.128910 0.072808 0.072316 0.184492 0.038133 -0.648233 0.760487 0.284679 0.109697 0.060302 0.081476 0.192927 0.038133 -0.648233 0.760487 0.299460 0.087742 0.053331 0.064539 0.178546 -0.502495 -0.006800 0.864553 0.324280 0.113570 0.048824 0.075798 0.176015 -0.502495 -0.006800 0.864553 0.344190 0.112360 0.036733 0.065820 0.168909 -0.502495 -0.006800 0.864553 0.369148 0.127941 0.048824 0.075798 0.176015 -0.598940 0.794892 -0.097051 0.378837 0.128303 0.042691 0.068252 0.152059 -0.598940 0.794892 -0.097051 0.395810 0.143320 0.036733 0.065820 0.168909 -0.598940 0.794892 -0.097051 0.369148 0.127941 0.042691 0.068252 0.152059 -0.909661 0.401486 0.106418 0.384310 0.126990 0.048824 0.075798 0.176015 -0.909661 0.401486 0.106418 0.344190 0.112360 0.053192 0.085858 0.175399 -0.909661 0.401486 0.106418 0.347560 0.104090 -0.001950 -0.040273 0.034472 -0.660818 -0.256176 0.705474 0.643033 0.298300 -0.023862 -0.025303 0.019383 -0.660818 -0.256176 0.705474 0.712310 0.264110 -0.030500 -0.033141 0.010319 -0.660818 -0.256176 0.705474 0.740681 0.264800 -0.023862 -0.025303 0.019383 -0.810222 0.008444 0.586062 0.712310 0.264110 -0.030055 -0.019593 0.010739 -0.810222 0.008444 0.586062 0.733560 0.250650 -0.030500 -0.033141 0.010319 -0.810222 0.008444 0.586062 0.740681 0.264800 0.053331 0.064539 0.178546 -0.784552 -0.180721 0.593142 0.325550 0.108270 0.060302 0.081476 0.192927 -0.784552 -0.180721 0.593142 0.310308 0.088773 0.048824 0.075798 0.176015 -0.784552 -0.180721 0.593142 0.338641 0.110258 0.057856 0.057044 0.172224 0.804863 -0.559570 0.197677 0.313070 0.128910 0.054500 0.046985 0.157414 0.804863 -0.559570 0.197677 0.327890 0.162200 0.062351 0.052413 0.140813 0.804863 -0.559570 0.197677 0.316680 0.182090 0.030087 0.039882 0.109675 -0.956082 0.140357 -0.257308 0.470850 0.222740 0.034158 0.013303 0.080050 -0.956082 0.140357 -0.257308 0.513733 0.250058 0.029876 -0.001883 0.087677 -0.956082 0.140357 -0.257308 0.498770 0.268030 0.030087 0.039882 0.109675 -0.994873 0.051019 -0.087321 0.470850 0.222740 0.029876 -0.001883 0.087677 -0.994873 0.051019 -0.087321 0.498770 0.268030 0.027702 0.029101 0.130549 -0.994873 0.051019 -0.087321 0.434330 0.198350 0.054500 0.046985 0.157414 0.801033 -0.566444 0.193618 0.327890 0.162200 0.044423 0.031511 0.153834 0.801033 -0.566444 0.193618 0.364836 0.180676 0.062351 0.052413 0.140813 0.801033 -0.566444 0.193618 0.316680 0.182090 0.044423 0.031511 0.153834 -0.492545 -0.644665 0.584642 0.364836 0.180676 0.033561 0.031491 0.144661 -0.492545 -0.644665 0.584642 0.402106 0.187773 0.034355 0.014456 0.126546 -0.492545 -0.644665 0.584642 0.427820 0.215940 0.041507 0.041081 0.156460 -0.597367 -0.376343 0.708179 0.365580 0.162280 0.033561 0.031491 0.144661 -0.597367 -0.376343 0.708179 0.402106 0.187773 0.044423 0.031511 0.153834 -0.597367 -0.376343 0.708179 0.364836 0.180676 0.041507 0.041081 0.156460 -0.685984 -0.265235 0.677552 0.365580 0.162280 0.031436 0.049052 0.149384 -0.685984 -0.265235 0.677552 0.399565 0.167196 0.033561 0.031491 0.144661 -0.685984 -0.265235 0.677552 0.402106 0.187773 0.044423 0.031511 0.153834 0.043531 -0.252010 0.966745 0.364836 0.180676 0.054500 0.046985 0.157414 0.043531 -0.252010 0.966745 0.327890 0.162200 0.041507 0.041081 0.156460 0.043531 -0.252010 0.966745 0.365580 0.162280 0.044423 0.031511 0.153834 -0.616245 -0.362089 0.699380 0.364836 0.180676 0.077645 0.019022 0.176641 -0.616245 -0.362089 0.699380 0.260121 0.223980 0.062326 0.031884 0.169802 -0.616245 -0.362089 0.699380 0.301326 0.204647 0.077645 0.019022 0.176641 -0.093862 -0.853624 0.512363 0.260121 0.223980 0.089982 -0.007425 0.134839 -0.093862 -0.853624 0.512363 0.295650 0.315700 0.090978 0.012292 0.167871 -0.093862 -0.853624 0.512363 0.243450 0.264540 0.089982 -0.007425 0.134839 -0.198069 -0.839011 0.506783 0.295650 0.315700 0.104416 0.007223 0.164731 -0.198069 -0.839011 0.506783 0.220810 0.296310 0.090978 0.012292 0.167871 -0.198069 -0.839011 0.506783 0.243450 0.264540 0.089982 -0.007425 0.134839 0.157287 -0.945881 0.283847 0.295650 0.315700 0.071473 -0.024618 0.087802 0.157287 -0.945881 0.283847 0.405190 0.354640 0.099112 -0.012738 0.112075 0.157287 -0.945881 0.283847 0.310110 0.370450 0.089982 -0.007425 0.134839 -0.003403 -0.938786 0.344485 0.295650 0.315700 0.056200 -0.017740 0.106395 -0.003403 -0.938786 0.344485 0.410687 0.294059 0.071473 -0.024618 0.087802 -0.003403 -0.938786 0.344485 0.405190 0.354640 0.071473 -0.024618 0.087802 -0.048886 -0.930285 0.363565 0.405190 0.354640 0.031230 -0.028204 0.073215 -0.048886 -0.930285 0.363565 0.513823 0.299301 0.048578 -0.040054 0.045226 -0.048886 -0.930285 0.363565 0.518630 0.377680 0.031230 -0.028204 0.073215 -0.842235 -0.292242 0.453029 0.513823 0.299301 0.043933 -0.002318 0.113530 -0.842235 -0.292242 0.453029 0.426570 0.255980 0.029876 -0.001883 0.087677 -0.842235 -0.292242 0.453029 0.498770 0.268030 0.029876 -0.001883 0.087677 -0.688296 -0.376206 0.620257 0.498770 0.268030 0.016955 -0.004583 0.071701 -0.688296 -0.376206 0.620257 0.548534 0.263306 0.031230 -0.028204 0.073215 -0.688296 -0.376206 0.620257 0.513823 0.299301 0.031230 -0.028204 0.073215 -0.611092 -0.322985 0.722667 0.513823 0.299301 0.016955 -0.004583 0.071701 -0.611092 -0.322985 0.722667 0.548534 0.263306 -0.001327 -0.021202 0.048814 -0.611092 -0.322985 0.722667 0.618682 0.273535 0.056200 -0.017740 0.106395 -0.539644 -0.666945 0.513779 0.410687 0.294059 0.077645 0.019022 0.176641 -0.539644 -0.666945 0.513779 0.260121 0.223980 0.043933 -0.002318 0.113530 -0.539644 -0.666945 0.513779 0.426570 0.255980 0.043933 -0.002318 0.113530 -0.489524 -0.655452 0.575108 0.426570 0.255980 0.031230 -0.028204 0.073215 -0.489524 -0.655452 0.575108 0.513823 0.299301 0.056200 -0.017740 0.106395 -0.489524 -0.655452 0.575108 0.410687 0.294059 0.056200 -0.017740 0.106395 -0.032782 -0.945844 0.322962 0.410687 0.294059 0.031230 -0.028204 0.073215 -0.032782 -0.945844 0.322962 0.513823 0.299301 0.071473 -0.024618 0.087802 -0.032782 -0.945844 0.322962 0.405190 0.354640 -0.001327 -0.021202 0.048814 -0.591435 -0.472219 0.653616 0.618682 0.273535 -0.001950 -0.040273 0.034472 -0.591435 -0.472219 0.653616 0.643033 0.298300 0.031230 -0.028204 0.073215 -0.591435 -0.472219 0.653616 0.513823 0.299301 0.048578 -0.040054 0.045226 0.522461 -0.851548 0.043590 0.518630 0.377680 0.038577 -0.048319 0.003636 0.522461 -0.851548 0.043590 0.601120 0.425850 0.069661 -0.026788 0.051686 0.522461 -0.851548 0.043590 0.462860 0.409610 0.031230 -0.028204 0.073215 0.035688 -0.912147 0.408305 0.513823 0.299301 0.009464 -0.061640 0.000422 0.035688 -0.912147 0.408305 0.670646 0.372138 0.048578 -0.040054 0.045226 0.035688 -0.912147 0.408305 0.518630 0.377680 0.048578 -0.040054 0.045226 0.407063 -0.909632 0.082882 0.518630 0.377680 0.009464 -0.061640 0.000422 0.407063 -0.909632 0.082882 0.670646 0.372138 0.038577 -0.048319 0.003636 0.407063 -0.909632 0.082882 0.601120 0.425850 0.009464 -0.061640 0.000422 0.405337 -0.909086 0.096254 0.670646 0.372138 -0.012845 -0.075192 -0.033626 0.405337 -0.909086 0.096254 0.768420 0.382030 0.038577 -0.048319 0.003636 0.405337 -0.909086 0.096254 0.601120 0.425850 0.038577 -0.048319 0.003636 0.511382 -0.854700 -0.089312 0.601120 0.425850 -0.012845 -0.075192 -0.033626 0.511382 -0.854700 -0.089312 0.768420 0.382030 0.022281 -0.052876 -0.046062 0.511382 -0.854700 -0.089312 0.714108 0.468367 -0.012845 -0.075192 -0.033626 0.567700 -0.809188 0.151432 0.768420 0.382030 -0.012438 -0.080839 -0.065327 0.567700 -0.809188 0.151432 0.815400 0.434250 0.022281 -0.052876 -0.046062 0.567700 -0.809188 0.151432 0.714108 0.468367 -0.012438 -0.080839 -0.065327 0.645768 -0.735881 -0.203625 0.815400 0.434250 -0.047403 -0.100711 -0.104398 0.645768 -0.735881 -0.203625 0.951641 0.425704 0.007882 -0.060295 -0.075129 0.645768 -0.735881 -0.203625 0.786970 0.489360 -0.095526 -0.117518 -0.143070 0.470368 -0.856341 -0.213151 0.981023 0.456908 -0.034406 -0.085027 -0.138728 0.470368 -0.856341 -0.213151 0.961750 0.509730 -0.047403 -0.100711 -0.104398 0.470368 -0.856341 -0.213151 0.951641 0.425704 -0.047403 -0.100711 -0.104398 0.625410 -0.771661 -0.115767 0.951641 0.425704 -0.034406 -0.085027 -0.138728 0.625410 -0.771661 -0.115767 0.961750 0.509730 0.007882 -0.060295 -0.075129 0.625410 -0.771661 -0.115767 0.786970 0.489360 0.044423 0.031511 0.153834 -0.601876 -0.558302 0.571003 0.364836 0.180676 0.034355 0.014456 0.126546 -0.601876 -0.558302 0.571003 0.427820 0.215940 0.077645 0.019022 0.176641 -0.601876 -0.558302 0.571003 0.260121 0.223980 0.034355 0.014456 0.126546 -0.515910 -0.689282 0.508653 0.427820 0.215940 0.043933 -0.002318 0.113530 -0.515910 -0.689282 0.508653 0.426570 0.255980 0.077645 0.019022 0.176641 -0.515910 -0.689282 0.508653 0.260121 0.223980 0.089982 -0.007425 0.134839 -0.155682 -0.854882 0.494914 0.295650 0.315700 0.077645 0.019022 0.176641 -0.155682 -0.854882 0.494914 0.260121 0.223980 0.056200 -0.017740 0.106395 -0.155682 -0.854882 0.494914 0.410687 0.294059 0.086777 -0.007718 0.051774 0.768201 -0.481981 -0.421381 0.428198 0.444416 0.099099 0.007341 0.057013 0.768201 -0.481981 -0.421381 0.395210 0.454600 0.116055 -0.004211 0.101138 0.768201 -0.481981 -0.421381 0.289090 0.422220 0.099099 0.007341 0.057013 0.499735 -0.771389 -0.393985 0.395210 0.454600 0.117596 0.011385 0.072557 0.499735 -0.771389 -0.393985 0.326990 0.473156 0.116055 -0.004211 0.101138 0.499735 -0.771389 -0.393985 0.289090 0.422220 0.117596 0.011385 0.072557 0.726269 -0.619128 -0.298686 0.326990 0.473156 0.135593 0.023447 0.091315 0.726269 -0.619128 -0.298686 0.260220 0.478520 0.116055 -0.004211 0.101138 0.726269 -0.619128 -0.298686 0.289090 0.422220 0.153810 0.036576 0.117798 0.769282 -0.594302 -0.234544 0.196867 0.467708 0.140320 0.014932 0.128395 0.769282 -0.594302 -0.234544 0.195960 0.427720 0.135593 0.023447 0.091315 0.769282 -0.594302 -0.234544 0.260220 0.478520 0.140320 0.014932 0.128395 0.872224 -0.425780 0.240700 0.195960 0.427720 0.153810 0.036576 0.117798 0.872224 -0.425780 0.240700 0.196867 0.467708 0.142930 0.026574 0.139531 0.872224 -0.425780 0.240700 0.174691 0.414974 0.135350 0.021139 0.160543 0.247142 -0.851050 0.463287 0.158440 0.365650 0.115943 0.014365 0.158452 0.247142 -0.851050 0.463287 0.203120 0.329410 0.111779 0.000945 0.136021 0.247142 -0.851050 0.463287 0.245470 0.357710 0.119415 0.029098 0.161260 -0.044159 -0.176988 0.983222 0.188520 0.331390 0.115943 0.014365 0.158452 -0.044159 -0.176988 0.983222 0.203120 0.329410 0.135350 0.021139 0.160543 -0.044159 -0.176988 0.983222 0.158440 0.365650 0.119415 0.029098 0.161260 0.969037 -0.201043 -0.143350 0.188520 0.331390 0.120143 0.026107 0.170376 0.969037 -0.201043 -0.143350 0.178018 0.316824 0.115943 0.014365 0.158452 0.969037 -0.201043 -0.143350 0.203120 0.329410 0.104416 0.007223 0.164731 0.618089 -0.719833 0.315921 0.220810 0.296310 0.111779 0.000945 0.136021 0.618089 -0.719833 0.315921 0.245470 0.357710 0.115943 0.014365 0.158452 0.618089 -0.719833 0.315921 0.203120 0.329410 0.089982 -0.007425 0.134839 0.321758 -0.885320 0.335677 0.295650 0.315700 0.099112 -0.012738 0.112075 0.321758 -0.885320 0.335677 0.310110 0.370450 0.111779 0.000945 0.136021 0.321758 -0.885320 0.335677 0.245470 0.357710 0.099112 -0.012738 0.112075 0.535414 -0.823546 0.187359 0.310110 0.370450 0.116055 -0.004211 0.101138 0.535414 -0.823546 0.187359 0.289090 0.422220 0.111779 0.000945 0.136021 0.535414 -0.823546 0.187359 0.245470 0.357710 0.099112 -0.012738 0.112075 0.445046 -0.895465 -0.008706 0.310110 0.370450 0.069661 -0.026788 0.051686 0.445046 -0.895465 -0.008706 0.462860 0.409610 0.116055 -0.004211 0.101138 0.445046 -0.895465 -0.008706 0.289090 0.422220 0.135593 0.023447 0.091315 0.751786 -0.615293 -0.237134 0.260220 0.478520 0.140320 0.014932 0.128395 0.751786 -0.615293 -0.237134 0.195960 0.427720 0.116055 -0.004211 0.101138 0.751786 -0.615293 -0.237134 0.289090 0.422220 0.071473 -0.024618 0.087802 0.526997 -0.849511 0.024602 0.405190 0.354640 0.048578 -0.040054 0.045226 0.526997 -0.849511 0.024602 0.518630 0.377680 0.069661 -0.026788 0.051686 0.526997 -0.849511 0.024602 0.462860 0.409610 0.143992 0.050780 0.185383 -0.796384 0.373403 0.475754 0.102570 0.343770 0.124638 0.045934 0.156789 -0.796384 0.373403 0.475754 0.172400 0.336930 0.119415 0.029098 0.161260 -0.796384 0.373403 0.475754 0.188520 0.331390 0.143992 0.050780 0.185383 -0.892768 0.217083 0.394766 0.102570 0.343770 0.149787 0.066389 0.189905 -0.892768 0.217083 0.394766 0.078462 0.341776 0.142136 0.060030 0.176099 -0.892768 0.217083 0.394766 0.112540 0.336640 0.158948 0.073733 0.201971 0.079730 -0.617483 0.782533 0.082315 0.372172 0.143992 0.050780 0.185383 0.079730 -0.617483 0.782533 0.102570 0.343770 0.156843 0.044757 0.179321 0.079730 -0.617483 0.782533 0.082094 0.377823 0.143992 0.050780 0.185383 0.052633 -0.650386 0.757779 0.102570 0.343770 0.135350 0.021139 0.160543 0.052633 -0.650386 0.757779 0.158440 0.365650 0.156843 0.044757 0.179321 0.052633 -0.650386 0.757779 0.087780 0.372400 0.111779 0.000945 0.136021 0.519729 -0.833631 0.186927 0.245470 0.357710 0.116055 -0.004211 0.101138 0.519729 -0.833631 0.186927 0.289090 0.422220 0.135350 0.021139 0.160543 0.519729 -0.833631 0.186927 0.158440 0.365650 0.116055 -0.004211 0.101138 0.425900 -0.873837 0.234560 0.289090 0.422220 0.140320 0.014932 0.128395 0.425900 -0.873837 0.234560 0.195960 0.427720 0.135350 0.021139 0.160543 0.425900 -0.873837 0.234560 0.158440 0.365650 0.143992 0.050780 0.185383 -0.829621 0.152396 0.537126 0.102570 0.343770 0.158948 0.073733 0.201971 -0.829621 0.152396 0.537126 0.045070 0.346890 0.149787 0.066389 0.189905 -0.829621 0.152396 0.537126 0.078462 0.341776 0.164352 0.057553 0.175030 0.869006 -0.491847 0.053994 0.073840 0.398740 0.174433 0.077625 0.195623 0.869006 -0.491847 0.053994 0.020480 0.387770 0.156843 0.044757 0.179321 0.869006 -0.491847 0.053994 0.078100 0.382990 0.156843 0.044757 0.179321 0.429872 -0.575227 0.695934 0.078100 0.382990 0.174433 0.077625 0.195623 0.429872 -0.575227 0.695934 0.020480 0.387770 0.158948 0.073733 0.201971 0.429872 -0.575227 0.695934 0.045070 0.346890 0.164352 0.057553 0.175030 0.654188 -0.676188 0.338833 0.073840 0.398740 0.173943 0.072128 0.185599 0.654188 -0.676188 0.338833 0.037193 0.399844 0.174433 0.077625 0.195623 0.654188 -0.676188 0.338833 0.020480 0.387770 0.069661 -0.026788 0.051686 0.709077 -0.635008 -0.306553 0.462860 0.409610 0.068895 -0.018779 0.033324 0.709077 -0.635008 -0.306553 0.491740 0.437240 0.086777 -0.007718 0.051774 0.709077 -0.635008 -0.306553 0.428198 0.444416 0.069661 -0.026788 0.051686 0.366670 -0.929597 0.037458 0.462860 0.409610 0.099112 -0.012738 0.112075 0.366670 -0.929597 0.037458 0.310110 0.370450 0.071473 -0.024618 0.087802 0.366670 -0.929597 0.037458 0.405190 0.354640 0.038577 -0.048319 0.003636 0.800629 -0.529312 -0.280752 0.601120 0.425850 0.053625 -0.028163 0.008548 0.800629 -0.529312 -0.280752 0.561610 0.440210 0.069661 -0.026788 0.051686 0.800629 -0.529312 -0.280752 0.462860 0.409610 0.069661 -0.026788 0.051686 0.785880 -0.554125 -0.274478 0.462860 0.409610 0.053625 -0.028163 0.008548 0.785880 -0.554125 -0.274478 0.561610 0.440210 0.068895 -0.018779 0.033324 0.785880 -0.554125 -0.274478 0.491740 0.437240 0.053625 -0.028163 0.008548 0.807024 -0.550314 -0.214163 0.561610 0.440210 0.038577 -0.048319 0.003636 0.807024 -0.550314 -0.214163 0.601120 0.425850 0.022281 -0.052876 -0.046062 0.807024 -0.550314 -0.214163 0.714108 0.468367 0.022281 -0.052876 -0.046062 0.668114 -0.729858 -0.144678 0.714108 0.468367 -0.012438 -0.080839 -0.065327 0.668114 -0.729858 -0.144678 0.815400 0.434250 0.007882 -0.060295 -0.075129 0.668114 -0.729858 -0.144678 0.786970 0.489360 0.069661 -0.026788 0.051686 0.693113 -0.620400 -0.367013 0.462860 0.409610 0.086777 -0.007718 0.051774 0.693113 -0.620400 -0.367013 0.428198 0.444416 0.116055 -0.004211 0.101138 0.693113 -0.620400 -0.367013 0.289090 0.422220 0.143992 0.050780 0.185383 -0.253221 -0.576939 0.776544 0.102570 0.343770 0.119415 0.029098 0.161260 -0.253221 -0.576939 0.776544 0.188520 0.331390 0.135350 0.021139 0.160543 -0.253221 -0.576939 0.776544 0.158440 0.365650 0.077645 0.019022 0.176641 0.042084 -0.760703 0.647735 0.260121 0.223980 0.090978 0.012292 0.167871 0.042084 -0.760703 0.647735 0.243450 0.264540 0.085054 0.021891 0.179529 0.042084 -0.760703 0.647735 0.240270 0.232350 0.085054 0.021891 0.179529 -0.531019 -0.632109 0.564320 0.240270 0.232350 0.087669 0.033440 0.194926 -0.531019 -0.632109 0.564320 0.211122 0.213362 0.075763 0.037689 0.188482 -0.531019 -0.632109 0.564320 0.246170 0.197800 0.075763 0.037689 0.188482 -0.879984 0.084000 0.467517 0.246170 0.197800 0.086585 0.059950 0.204852 -0.879984 0.084000 0.467517 0.187156 0.190790 0.071425 0.047528 0.178549 -0.879984 0.084000 0.467517 0.267450 0.197950 0.075763 0.037689 0.188482 -0.948637 -0.124740 0.290736 0.246170 0.197800 0.071425 0.047528 0.178549 -0.948637 -0.124740 0.290736 0.267450 0.197950 0.073688 0.029712 0.178289 -0.948637 -0.124740 0.290736 0.265743 0.210273 0.071425 0.047528 0.178549 -0.606906 -0.088616 0.789818 0.267450 0.197950 0.062326 0.031884 0.169802 -0.606906 -0.088616 0.789818 0.301326 0.204647 0.073688 0.029712 0.178289 -0.606906 -0.088616 0.789818 0.265743 0.210273 0.073688 0.029712 0.178289 -0.604123 -0.335083 0.723017 0.265743 0.210273 0.062326 0.031884 0.169802 -0.604123 -0.335083 0.723017 0.301326 0.204647 0.077645 0.019022 0.176641 -0.604123 -0.335083 0.723017 0.260121 0.223980 0.085054 0.021891 0.179529 -0.269053 -0.243256 0.931899 0.240270 0.232350 0.073688 0.029712 0.178289 -0.269053 -0.243256 0.931899 0.265743 0.210273 0.077645 0.019022 0.176641 -0.269053 -0.243256 0.931899 0.260121 0.223980 0.085054 0.021891 0.179529 -0.498692 -0.630416 0.594880 0.240270 0.232350 0.075763 0.037689 0.188482 -0.498692 -0.630416 0.594880 0.246170 0.197800 0.073688 0.029712 0.178289 -0.498692 -0.630416 0.594880 0.265743 0.210273 0.062326 0.031884 0.169802 -0.849376 0.227831 0.476081 0.301326 0.204647 0.071425 0.047528 0.178549 -0.849376 0.227831 0.476081 0.267450 0.197950 0.061518 0.042216 0.163416 -0.849376 0.227831 0.476081 0.310410 0.197450 0.062326 0.031884 0.169802 -0.621038 0.376365 0.687504 0.301326 0.204647 0.061518 0.042216 0.163416 -0.621038 0.376365 0.687504 0.310410 0.197450 0.044423 0.031511 0.153834 -0.621038 0.376365 0.687504 0.364836 0.180676 0.090978 0.012292 0.167871 0.033077 -0.461478 0.886535 0.243450 0.264540 0.104416 0.007223 0.164731 0.033077 -0.461478 0.886535 0.220810 0.296310 0.095701 0.027930 0.175835 0.033077 -0.461478 0.886535 0.220030 0.259690 0.095701 0.027930 0.175835 -0.373817 -0.555589 0.742685 0.220030 0.259690 0.104416 0.007223 0.164731 -0.373817 -0.555589 0.742685 0.220810 0.296310 0.109910 0.024071 0.180100 -0.373817 -0.555589 0.742685 0.186271 0.283171 0.104416 0.007223 0.164731 0.592484 -0.639773 0.489543 0.220810 0.296310 0.120143 0.026107 0.170376 0.592484 -0.639773 0.489543 0.178018 0.316824 0.109910 0.024071 0.180100 0.592484 -0.639773 0.489543 0.186271 0.283171 0.109910 0.024071 0.180100 0.472250 -0.819184 0.325450 0.186271 0.283171 0.120143 0.026107 0.170376 0.472250 -0.819184 0.325450 0.178018 0.316824 0.141667 0.052178 0.204766 0.472250 -0.819184 0.325450 0.098020 0.295780 0.120143 0.026107 0.170376 0.568638 -0.786656 0.240464 0.178018 0.316824 0.141560 0.048534 0.193098 0.568638 -0.786656 0.240464 0.098520 0.321330 0.141667 0.052178 0.204766 0.568638 -0.786656 0.240464 0.098020 0.295780 0.123196 0.044287 0.202612 -0.491871 -0.233698 0.838718 0.092590 0.280640 0.141494 0.076623 0.222353 -0.491871 -0.233698 0.838718 0.059790 0.277920 0.123289 0.059764 0.206979 -0.491871 -0.233698 0.838718 0.112692 0.264495 0.141667 0.052178 0.204766 0.999135 -0.041404 0.003769 0.081990 0.304590 0.141560 0.048534 0.193098 0.999135 -0.041404 0.003769 0.098520 0.321330 0.142189 0.063498 0.190741 0.999135 -0.041404 0.003769 0.087940 0.327060 0.141560 0.048534 0.193098 0.828272 -0.120991 -0.547108 0.098520 0.321330 0.135284 0.055424 0.182073 0.828272 -0.120991 -0.547108 0.107730 0.328780 0.142189 0.063498 0.190741 0.828272 -0.120991 -0.547108 0.087940 0.327060 0.141560 0.048534 0.193098 0.799768 -0.185219 -0.571021 0.098520 0.321330 0.120143 0.026107 0.170376 0.799768 -0.185219 -0.571021 0.178018 0.316824 0.135284 0.055424 0.182073 0.799768 -0.185219 -0.571021 0.107730 0.328780 0.135284 0.055424 0.182073 0.867247 -0.285024 -0.408221 0.107730 0.328780 0.120143 0.026107 0.170376 0.867247 -0.285024 -0.408221 0.178018 0.316824 0.119302 0.038419 0.159993 0.867247 -0.285024 -0.408221 0.180790 0.332860 0.120143 0.026107 0.170376 0.996860 0.001323 -0.079174 0.178018 0.316824 0.119415 0.029098 0.161260 0.996860 0.001323 -0.079174 0.188520 0.331390 0.119302 0.038419 0.159993 0.996860 0.001323 -0.079174 0.180790 0.332860 0.090978 0.012292 0.167871 0.524756 -0.506802 0.683946 0.243450 0.264540 0.095701 0.027930 0.175835 0.524756 -0.506802 0.683946 0.220030 0.259690 0.085054 0.021891 0.179529 0.524756 -0.506802 0.683946 0.240270 0.232350 0.100002 0.036926 0.190618 0.964968 -0.215553 -0.149578 0.190200 0.243860 0.095701 0.027930 0.175835 0.964968 -0.215553 -0.149578 0.220030 0.259690 0.097660 0.038978 0.172552 0.964968 -0.215553 -0.149578 0.211300 0.262970 0.100002 0.036926 0.190618 0.548370 -0.775661 0.312474 0.190200 0.243860 0.085054 0.021891 0.179529 0.548370 -0.775661 0.312474 0.240270 0.232350 0.095701 0.027930 0.175835 0.548370 -0.775661 0.312474 0.220030 0.259690 0.107389 0.046282 0.210566 0.668609 -0.737112 0.098125 0.147990 0.226080 0.085054 0.021891 0.179529 0.668609 -0.737112 0.098125 0.240270 0.232350 0.100002 0.036926 0.190618 0.668609 -0.737112 0.098125 0.190200 0.243860 0.107389 0.046282 0.210566 0.052277 -0.803117 0.593524 0.147990 0.226080 0.087669 0.033440 0.194926 0.052277 -0.803117 0.593524 0.211122 0.213362 0.085054 0.021891 0.179529 0.052277 -0.803117 0.593524 0.240270 0.232350 0.108825 0.043741 0.199336 0.924372 -0.026921 -0.380540 0.159984 0.245722 0.097660 0.038978 0.172552 0.924372 -0.026921 -0.380540 0.211300 0.262970 0.108636 0.055260 0.198062 0.924372 -0.026921 -0.380540 0.155020 0.252040 0.108636 0.055260 0.198062 0.727876 0.391428 -0.563011 0.155020 0.252040 0.097660 0.038978 0.172552 0.727876 0.391428 -0.563011 0.211300 0.262970 0.088707 0.052685 0.170507 0.727876 0.391428 -0.563011 0.200790 0.261530 0.131489 0.078973 0.229080 0.754704 -0.639453 0.146699 0.069787 0.240614 0.118713 0.062923 0.224846 0.754704 -0.639453 0.146699 0.104782 0.225075 0.107389 0.046282 0.210566 0.754704 -0.639453 0.146699 0.147990 0.226080 0.118713 0.062923 0.224846 0.059877 -0.673205 0.737028 0.104782 0.225075 0.107296 0.067456 0.229914 0.059877 -0.673205 0.737028 0.116859 0.196548 0.107389 0.046282 0.210566 0.059877 -0.673205 0.737028 0.147990 0.226080 0.107389 0.046282 0.210566 -0.085449 -0.672296 0.735334 0.147990 0.226080 0.107296 0.067456 0.229914 -0.085449 -0.672296 0.735334 0.116859 0.196548 0.093507 0.047680 0.210231 -0.085449 -0.672296 0.735334 0.175260 0.199050 0.107296 0.067456 0.229914 -0.744129 -0.132778 0.654708 0.116859 0.196548 0.086585 0.059950 0.204852 -0.744129 -0.132778 0.654708 0.187156 0.190790 0.093507 0.047680 0.210231 -0.744129 -0.132778 0.654708 0.175260 0.199050 0.108825 0.043741 0.199336 0.821736 -0.049308 -0.567731 0.159984 0.245722 0.108636 0.055260 0.198062 0.821736 -0.049308 -0.567731 0.155020 0.252040 0.131489 0.078973 0.229080 0.821736 -0.049308 -0.567731 0.069787 0.240614 0.142987 0.029221 0.148360 0.853671 -0.470722 0.222860 0.161963 0.397901 0.135350 0.021139 0.160543 0.853671 -0.470722 0.222860 0.158440 0.365650 0.140320 0.014932 0.128395 0.853671 -0.470722 0.222860 0.195960 0.427720 0.150255 0.033474 0.161588 0.605924 -0.753726 0.254467 0.126154 0.391636 0.156843 0.044757 0.179321 0.605924 -0.753726 0.254467 0.089596 0.378162 0.135350 0.021139 0.160543 0.605924 -0.753726 0.254467 0.158440 0.365650 0.142987 0.029221 0.148360 0.885699 -0.170473 -0.431829 0.161963 0.397901 0.150595 0.051764 0.155065 0.885699 -0.170473 -0.431829 0.121890 0.403040 0.150255 0.033474 0.161588 0.885699 -0.170473 -0.431829 0.126154 0.391636 0.150595 0.051764 0.155065 0.832961 -0.199547 -0.516097 0.121890 0.403040 0.164352 0.057553 0.175030 0.832961 -0.199547 -0.516097 0.073840 0.398740 0.150255 0.033474 0.161588 0.832961 -0.199547 -0.516097 0.126154 0.391636 0.150255 0.033474 0.161588 0.862659 -0.505784 0.001328 0.126154 0.391636 0.164352 0.057553 0.175030 0.862659 -0.505784 0.001328 0.073840 0.398740 0.156843 0.044757 0.179321 0.862659 -0.505784 0.001328 0.089596 0.378162 0.100002 0.036926 0.190618 0.424000 -0.870155 0.251107 0.190200 0.243860 0.108825 0.043741 0.199336 0.424000 -0.870155 0.251107 0.159984 0.245722 0.107389 0.046282 0.210566 0.424000 -0.870155 0.251107 0.147990 0.226080 0.108825 0.043741 0.199336 0.701902 -0.691795 -0.169568 0.159984 0.245722 0.100002 0.036926 0.190618 0.701902 -0.691795 -0.169568 0.190200 0.243860 0.097660 0.038978 0.172552 0.701902 -0.691795 -0.169568 0.211300 0.262970 0.089982 -0.007425 0.134839 0.330601 -0.900733 0.281749 0.295650 0.315700 0.111779 0.000945 0.136021 0.330601 -0.900733 0.281749 0.245470 0.357710 0.104416 0.007223 0.164731 0.330601 -0.900733 0.281749 0.220810 0.296310 0.104416 0.007223 0.164731 0.632117 -0.651732 0.419134 0.220810 0.296310 0.115943 0.014365 0.158452 0.632117 -0.651732 0.419134 0.203120 0.329410 0.120143 0.026107 0.170376 0.632117 -0.651732 0.419134 0.178018 0.316824 -0.047403 -0.100711 -0.104398 0.030618 -0.901724 0.431227 0.951641 0.425704 -0.012438 -0.080839 -0.065327 0.030618 -0.901724 0.431227 0.815400 0.434250 -0.069241 -0.093206 -0.087154 0.030618 -0.901724 0.431227 0.914152 0.365852 -0.069241 -0.093206 -0.087154 0.144648 -0.973826 0.175328 0.914152 0.365852 -0.012438 -0.080839 -0.065327 0.144648 -0.973826 0.175328 0.815400 0.434250 -0.012845 -0.075192 -0.033626 0.144648 -0.973826 0.175328 0.768420 0.382030 -0.012845 -0.075192 -0.033626 0.033640 -0.935960 0.350495 0.768420 0.382030 0.009464 -0.061640 0.000422 0.033640 -0.935960 0.350495 0.670646 0.372138 -0.029661 -0.072947 -0.026017 0.033640 -0.935960 0.350495 0.793950 0.336740 0.009464 -0.061640 0.000422 -0.148008 -0.811083 0.565896 0.670646 0.372138 -0.016507 -0.053189 0.005742 -0.148008 -0.811083 0.565896 0.718071 0.309760 -0.029661 -0.072947 -0.026017 -0.148008 -0.811083 0.565896 0.790105 0.328337 0.174312 0.080673 0.176682 -0.036027 -0.475138 0.879174 0.042770 0.427560 0.168610 0.067224 0.169180 -0.036027 -0.475138 0.879174 0.058830 0.426820 0.182614 0.078900 0.176064 -0.036027 -0.475138 0.879174 0.042790 0.429381 0.168610 0.067224 0.169180 0.299846 -0.725121 0.619913 0.062340 0.427740 0.179213 0.068282 0.165289 0.299846 -0.725121 0.619913 0.055790 0.445457 0.182614 0.078900 0.176064 0.299846 -0.725121 0.619913 0.042790 0.429381 -0.034406 -0.085027 -0.138728 0.750296 -0.606529 -0.263020 0.959968 0.514181 -0.032947 -0.077119 -0.152802 0.750296 -0.606529 -0.263020 0.958829 0.529430 0.007882 -0.060295 -0.075129 0.750296 -0.606529 -0.263020 0.932195 0.522238 -0.032947 -0.077119 -0.152802 0.888469 -0.143330 -0.435981 0.958829 0.529430 0.003153 -0.046601 -0.089268 0.888469 -0.143330 -0.435981 0.824771 0.564740 0.007882 -0.060295 -0.075129 0.888469 -0.143330 -0.435981 0.787970 0.551140 0.007882 -0.060295 -0.075129 0.901465 -0.118530 -0.416308 0.787970 0.551140 0.003153 -0.046601 -0.089268 0.901465 -0.118530 -0.416308 0.824771 0.564740 0.022281 -0.052876 -0.046062 0.901465 -0.118530 -0.416308 0.707390 0.565900 0.003153 -0.046601 -0.089268 0.889847 -0.178533 -0.419879 0.824771 0.564740 0.029309 -0.029773 -0.040991 0.889847 -0.178533 -0.419879 0.694998 0.593245 0.022281 -0.052876 -0.046062 0.889847 -0.178533 -0.419879 0.707390 0.565900 0.003153 -0.046601 -0.089268 0.831577 0.197122 -0.519251 0.824771 0.564740 -0.004285 -0.027983 -0.094112 0.831577 0.197122 -0.519251 0.848720 0.590070 0.029309 -0.029773 -0.040991 0.831577 0.197122 -0.519251 0.694998 0.593245 -0.004285 -0.027983 -0.094112 0.762594 0.447416 -0.467192 0.848720 0.590070 0.008989 -0.011941 -0.057082 0.762594 0.447416 -0.467192 0.757109 0.626270 0.029309 -0.029773 -0.040991 0.762594 0.447416 -0.467192 0.694998 0.593245 -0.025528 -0.015002 -0.098342 0.508655 0.647474 -0.567492 0.894100 0.654540 -0.004285 -0.027983 -0.094112 0.508655 0.647474 -0.567492 0.848720 0.590070 -0.024684 -0.048566 -0.135880 0.508655 0.647474 -0.567492 0.936076 0.565704 -0.004285 -0.027983 -0.094112 0.837053 0.202129 -0.508415 0.848720 0.590070 0.003153 -0.046601 -0.089268 0.837053 0.202129 -0.508415 0.824771 0.564740 -0.024684 -0.048566 -0.135880 0.837053 0.202129 -0.508415 0.936076 0.565704 0.087669 0.033440 0.194926 -0.521755 -0.206783 0.827655 0.211122 0.213362 0.107389 0.046282 0.210566 -0.521755 -0.206783 0.827655 0.147990 0.226080 0.075763 0.037689 0.188482 -0.521755 -0.206783 0.827655 0.246170 0.197800 0.075763 0.037689 0.188482 -0.099325 -0.870994 0.481149 0.246170 0.197800 0.107389 0.046282 0.210566 -0.099325 -0.870994 0.481149 0.147990 0.226080 0.093507 0.047680 0.210231 -0.099325 -0.870994 0.481149 0.175260 0.199050 -0.082414 -0.008469 -0.082211 -0.391394 0.915132 0.096663 0.963945 0.892963 -0.100711 -0.017457 -0.071205 -0.391394 0.915132 0.096663 0.970203 0.982094 -0.080407 -0.011017 -0.049962 -0.391394 0.915132 0.096663 0.928039 0.969549 0.029309 -0.029773 -0.040991 0.894507 0.071045 -0.441373 0.694998 0.593245 0.050502 -0.009120 0.005284 0.894507 0.071045 -0.441373 0.573141 0.624110 0.053625 -0.028163 0.008548 0.894507 0.071045 -0.441373 0.563770 0.587680 0.086777 -0.007718 0.051774 0.681626 0.542006 -0.491543 0.435511 0.601870 0.063030 -0.001161 0.026074 0.681626 0.542006 -0.491543 0.516921 0.625450 0.073622 0.006154 0.048828 0.681626 0.542006 -0.491543 0.455920 0.622257 0.063030 -0.001161 0.026074 0.451598 0.766511 -0.456639 0.516921 0.625450 0.062588 0.018440 0.058539 0.451598 0.766511 -0.456639 0.462180 0.663670 0.073622 0.006154 0.048828 0.451598 0.766511 -0.456639 0.455920 0.622257 0.063030 -0.001161 0.026074 0.405018 0.785142 -0.468522 0.516921 0.625450 0.045717 0.011490 0.032308 0.405018 0.785142 -0.468522 0.534848 0.690702 0.062588 0.018440 0.058539 0.405018 0.785142 -0.468522 0.462180 0.663670 0.062588 0.018440 0.058539 -0.173223 0.959148 -0.223672 0.462180 0.663670 0.028037 0.011583 0.055893 -0.173223 0.959148 -0.223672 0.537360 0.785940 0.046779 0.017207 0.065495 -0.173223 0.959148 -0.223672 0.484460 0.711190 0.063030 -0.001161 0.026074 0.844207 0.061935 -0.532427 0.516921 0.625450 0.068895 -0.018779 0.033324 0.844207 0.061935 -0.532427 0.497300 0.593550 0.050502 -0.009120 0.005284 0.844207 0.061935 -0.532427 0.573141 0.624110 0.068895 -0.018779 0.033324 0.842489 0.046169 -0.536731 0.497300 0.593550 0.053625 -0.028163 0.008548 0.842489 0.046169 -0.536731 0.563770 0.587680 0.050502 -0.009120 0.005284 0.842489 0.046169 -0.536731 0.573141 0.624110 0.068895 -0.018779 0.033324 0.728993 -0.038560 -0.683434 0.497300 0.593550 0.063030 -0.001161 0.026074 0.728993 -0.038560 -0.683434 0.516921 0.625450 0.086777 -0.007718 0.051774 0.728993 -0.038560 -0.683434 0.435511 0.601870 0.046779 0.017207 0.065495 -0.289907 0.957040 0.005316 0.484460 0.711190 0.028037 0.011583 0.055893 -0.289907 0.957040 0.005316 0.537360 0.785940 0.034158 0.013303 0.080050 -0.289907 0.957040 0.005316 0.491340 0.772430 0.028037 0.011583 0.055893 -0.745791 0.650730 0.142639 0.537360 0.785940 0.016955 -0.004583 0.071701 -0.745791 0.650730 0.142639 0.536530 0.818012 0.034158 0.013303 0.080050 -0.745791 0.650730 0.142639 0.491340 0.772430 0.030087 0.039882 0.109675 -0.467734 0.624982 -0.624997 0.442490 0.810560 0.052997 0.025909 0.078557 -0.467734 0.624982 -0.624997 0.450460 0.714650 0.034158 0.013303 0.080050 -0.467734 0.624982 -0.624997 0.491340 0.772430 0.052997 0.025909 0.078557 -0.335140 0.742402 -0.580103 0.450460 0.714650 0.030087 0.039882 0.109675 -0.335140 0.742402 -0.580103 0.442490 0.810560 0.037569 0.053938 0.123341 -0.335140 0.742402 -0.580103 0.410010 0.816830 0.037569 0.053938 0.123341 0.007768 0.894407 -0.447187 0.410010 0.816830 0.042691 0.068252 0.152059 0.007768 0.894407 -0.447187 0.349380 0.855820 0.047565 0.058833 0.133305 0.007768 0.894407 -0.447187 0.373890 0.809190 0.047565 0.058833 0.133305 0.498963 0.819491 -0.281905 0.373890 0.809190 0.042691 0.068252 0.152059 0.498963 0.819491 -0.281905 0.349380 0.855820 0.062351 0.052413 0.140813 0.498963 0.819491 -0.281905 0.331610 0.786970 0.058327 0.063550 0.158191 0.977882 0.175297 0.114093 0.307721 0.837801 0.057856 0.057044 0.172224 0.977882 0.175297 0.114093 0.297906 0.831523 0.062351 0.052413 0.140813 0.977882 0.175297 0.114093 0.331610 0.786970 0.042691 0.068252 0.152059 0.409099 0.808356 -0.423319 0.349380 0.855820 0.058327 0.063550 0.158191 0.409099 0.808356 -0.423319 0.307721 0.837801 0.062351 0.052413 0.140813 0.409099 0.808356 -0.423319 0.331610 0.786970 0.042691 0.068252 0.152059 0.405169 0.177834 -0.896780 0.319714 0.849451 0.056886 0.077181 0.160243 0.405169 0.177834 -0.896780 0.302102 0.842047 0.058327 0.063550 0.158191 0.405169 0.177834 -0.896780 0.307721 0.837801 0.058327 0.063550 0.158191 0.782993 -0.573945 -0.239813 0.286889 0.843306 0.072808 0.072316 0.184492 0.782993 -0.573945 -0.239813 0.257003 0.877169 0.057856 0.057044 0.172224 0.782993 -0.573945 -0.239813 0.297906 0.831523 0.058327 0.063550 0.158191 0.839232 0.166641 -0.517611 0.286889 0.843306 0.056886 0.077181 0.160243 0.839232 0.166641 -0.517611 0.305477 0.856494 0.072808 0.072316 0.184492 0.839232 0.166641 -0.517611 0.257003 0.877169 0.056886 0.077181 0.160243 0.808889 0.370093 -0.456869 0.305477 0.856494 0.063223 0.090410 0.182179 0.808889 0.370093 -0.456869 0.270710 0.887400 0.072808 0.072316 0.184492 0.808889 0.370093 -0.456869 0.257003 0.877169 0.056886 0.077181 0.160243 -0.049432 0.861534 -0.505288 0.305477 0.856494 0.053192 0.085858 0.175399 -0.049432 0.861534 -0.505288 0.298639 0.885778 0.063223 0.090410 0.182179 -0.049432 0.861534 -0.505288 0.270710 0.887400 0.042691 0.068252 0.152059 -0.215916 0.823748 -0.524232 0.336759 0.863565 0.053192 0.085858 0.175399 -0.215916 0.823748 -0.524232 0.298639 0.885778 0.056886 0.077181 0.160243 -0.215916 0.823748 -0.524232 0.305477 0.856494 0.042691 0.068252 0.152059 -0.743626 0.641830 -0.187280 0.349380 0.855820 0.037569 0.053938 0.123341 -0.743626 0.641830 -0.187280 0.410010 0.816830 0.027156 0.044410 0.132034 -0.743626 0.641830 -0.187280 0.415793 0.851809 0.053360 0.088072 0.187479 0.179671 0.731949 0.657243 0.282632 0.904939 0.060302 0.081476 0.192927 0.179671 0.731949 0.657243 0.268112 0.906565 0.063223 0.090410 0.182179 0.179671 0.731949 0.657243 0.270710 0.887400 0.063223 0.090410 0.182179 0.701219 0.442880 0.558703 0.270710 0.887400 0.060302 0.081476 0.192927 0.701219 0.442880 0.558703 0.268112 0.906565 0.072808 0.072316 0.184492 0.701219 0.442880 0.558703 0.257003 0.877169 0.047565 0.058833 0.133305 0.347701 0.930974 0.111313 0.373890 0.809190 0.062351 0.052413 0.140813 0.347701 0.930974 0.111313 0.329190 0.784830 0.068440 0.051968 0.125515 0.347701 0.930974 0.111313 0.344030 0.750640 0.062351 0.052413 0.140813 0.438217 0.886495 0.148635 0.329190 0.784830 0.084341 0.041774 0.139434 0.438217 0.886495 0.148635 0.288930 0.734470 0.068440 0.051968 0.125515 0.438217 0.886495 0.148635 0.344030 0.750640 0.062351 0.052413 0.140813 0.421293 0.820772 0.385805 0.329190 0.784830 0.061518 0.042216 0.163416 0.421293 0.820772 0.385805 0.295840 0.820350 0.084341 0.041774 0.139434 0.421293 0.820772 0.385805 0.288930 0.734470 0.061518 0.042216 0.163416 -0.485820 0.873986 0.011261 0.295840 0.820350 0.071425 0.047528 0.178549 -0.485820 0.873986 0.011261 0.250100 0.818029 0.075682 0.050078 0.164293 -0.485820 0.873986 0.011261 0.266450 0.791830 0.075682 0.050078 0.164293 -0.421508 0.805782 -0.415988 0.273470 0.776000 0.084341 0.041774 0.139434 -0.421508 0.805782 -0.415988 0.288930 0.734470 0.061518 0.042216 0.163416 -0.421508 0.805782 -0.415988 0.295840 0.820350 0.084341 0.041774 0.139434 0.594443 0.798600 -0.094210 0.288930 0.734470 0.071762 0.046670 0.101566 0.594443 0.798600 -0.094210 0.374767 0.709924 0.068440 0.051968 0.125515 0.594443 0.798600 -0.094210 0.344030 0.750640 0.084341 0.041774 0.139434 0.428511 0.903175 -0.025570 0.288930 0.734470 0.092476 0.037228 0.115191 0.428511 0.903175 -0.025570 0.311310 0.679780 0.071762 0.046670 0.101566 0.428511 0.903175 -0.025570 0.374767 0.709924 0.092476 0.037228 0.115191 0.585187 0.704593 -0.401380 0.311310 0.679780 0.081658 0.033262 0.092457 0.585187 0.704593 -0.401380 0.369880 0.669890 0.071762 0.046670 0.101566 0.585187 0.704593 -0.401380 0.374767 0.709924 0.081658 0.033262 0.092457 -0.056815 0.926175 -0.372790 0.369880 0.669890 0.062588 0.018440 0.058539 -0.056815 0.926175 -0.372790 0.462180 0.663670 0.052997 0.025909 0.078557 -0.056815 0.926175 -0.372790 0.450460 0.714650 0.111719 0.044626 0.093231 -0.336433 0.907171 -0.252691 0.306530 0.603540 0.101997 0.035315 0.072748 -0.336433 0.907171 -0.252691 0.357290 0.597774 0.081658 0.033262 0.092457 -0.336433 0.907171 -0.252691 0.369880 0.669890 0.081658 0.033262 0.092457 -0.313049 0.922211 -0.226993 0.369880 0.669890 0.101997 0.035315 0.072748 -0.313049 0.922211 -0.226993 0.357290 0.597774 0.062588 0.018440 0.058539 -0.313049 0.922211 -0.226993 0.462180 0.663670 0.062588 0.018440 0.058539 -0.070025 0.733132 -0.676471 0.462180 0.663670 0.101997 0.035315 0.072748 -0.070025 0.733132 -0.676471 0.357290 0.597774 0.082305 0.017903 0.055916 -0.070025 0.733132 -0.676471 0.424935 0.616345 0.101997 0.035315 0.072748 0.329360 0.436749 -0.837121 0.357290 0.597774 0.099099 0.007341 0.057013 0.329360 0.436749 -0.837121 0.392743 0.582936 0.082305 0.017903 0.055916 0.329360 0.436749 -0.837121 0.424935 0.616345 0.111719 0.044626 0.093231 0.077988 0.893121 -0.443004 0.306530 0.603540 0.121015 0.040796 0.087146 0.077988 0.893121 -0.443004 0.297580 0.574370 0.101997 0.035315 0.072748 0.077988 0.893121 -0.443004 0.357290 0.597774 0.121015 0.040796 0.087146 0.425958 0.501006 -0.753361 0.297580 0.574370 0.123985 0.028751 0.080815 0.425958 0.501006 -0.753361 0.301840 0.556970 0.101997 0.035315 0.072748 0.425958 0.501006 -0.753361 0.357290 0.597774 0.123985 0.028751 0.080815 0.419674 0.411575 -0.809000 0.301840 0.556970 0.099099 0.007341 0.057013 0.419674 0.411575 -0.809000 0.392743 0.582936 0.101997 0.035315 0.072748 0.419674 0.411575 -0.809000 0.357290 0.597774 0.123985 0.028751 0.080815 0.618935 0.139825 -0.772896 0.301840 0.556970 0.117596 0.011385 0.072557 0.618935 0.139825 -0.772896 0.329168 0.559598 0.099099 0.007341 0.057013 0.618935 0.139825 -0.772896 0.392743 0.582936 0.117596 0.011385 0.072557 0.690001 0.087795 -0.718464 0.329168 0.559598 0.123985 0.028751 0.080815 0.690001 0.087795 -0.718464 0.301840 0.556970 0.135593 0.023447 0.091315 0.690001 0.087795 -0.718464 0.261680 0.547960 0.123985 0.028751 0.080815 0.711784 0.322511 -0.623980 0.301840 0.556970 0.138591 0.044894 0.105820 0.711784 0.322511 -0.623980 0.231540 0.563650 0.135593 0.023447 0.091315 0.711784 0.322511 -0.623980 0.261680 0.547960 0.123985 0.028751 0.080815 0.580459 0.486386 -0.653066 0.301840 0.556970 0.121015 0.040796 0.087146 0.580459 0.486386 -0.653066 0.297580 0.574370 0.138591 0.044894 0.105820 0.580459 0.486386 -0.653066 0.231540 0.563650 0.111719 0.044626 0.093231 0.183978 0.933850 -0.306719 0.306530 0.603540 0.127937 0.047717 0.112370 0.183978 0.933850 -0.306719 0.243160 0.595480 0.121015 0.040796 0.087146 0.183978 0.933850 -0.306719 0.297580 0.574370 0.092476 0.037228 0.115191 -0.353719 0.935337 0.005146 0.311310 0.679780 0.111719 0.044626 0.093231 -0.353719 0.935337 0.005146 0.306530 0.603540 0.081658 0.033262 0.092457 -0.353719 0.935337 0.005146 0.369880 0.669890 0.037569 0.053938 0.123341 -0.056134 0.917262 -0.394308 0.410010 0.816830 0.047565 0.058833 0.133305 -0.056134 0.917262 -0.394308 0.373890 0.809190 0.071762 0.046670 0.101566 -0.056134 0.917262 -0.394308 0.374767 0.709924 0.047565 0.058833 0.133305 0.247467 0.952698 -0.176429 0.373890 0.809190 0.068440 0.051968 0.125515 0.247467 0.952698 -0.176429 0.344030 0.750640 0.071762 0.046670 0.101566 0.247467 0.952698 -0.176429 0.374767 0.709924 0.052997 0.025909 0.078557 -0.550643 0.791501 -0.265177 0.450460 0.714650 0.046779 0.017207 0.065495 -0.550643 0.791501 -0.265177 0.484460 0.711190 0.034158 0.013303 0.080050 -0.550643 0.791501 -0.265177 0.491340 0.772430 0.052997 0.025909 0.078557 -0.262672 0.856016 -0.445242 0.450460 0.714650 0.062588 0.018440 0.058539 -0.262672 0.856016 -0.445242 0.462180 0.663670 0.046779 0.017207 0.065495 -0.262672 0.856016 -0.445242 0.484460 0.711190 0.062588 0.018440 0.058539 -0.093763 0.564177 -0.820313 0.462180 0.663670 0.082305 0.017903 0.055916 -0.093763 0.564177 -0.820313 0.424935 0.616345 0.073622 0.006154 0.048828 -0.093763 0.564177 -0.820313 0.455920 0.622257 0.082305 0.017903 0.055916 0.424912 0.216272 -0.879020 0.424935 0.616345 0.086777 -0.007718 0.051774 0.424912 0.216272 -0.879020 0.435511 0.601870 0.073622 0.006154 0.048828 0.424912 0.216272 -0.879020 0.455920 0.622257 0.082305 0.017903 0.055916 0.181094 0.187678 -0.965392 0.424935 0.616345 0.099099 0.007341 0.057013 0.181094 0.187678 -0.965392 0.392743 0.582936 0.086777 -0.007718 0.051774 0.181094 0.187678 -0.965392 0.435511 0.601870 0.105390 0.048647 0.164927 0.052283 0.952515 -0.299970 0.259600 0.732880 0.084341 0.041774 0.139434 0.052283 0.952515 -0.299970 0.288930 0.734470 0.075682 0.050078 0.164293 0.052283 0.952515 -0.299970 0.266450 0.791830 0.037569 0.053938 0.123341 -0.753064 0.618642 -0.224001 0.410010 0.816830 0.030087 0.039882 0.109675 -0.753064 0.618642 -0.224001 0.442490 0.810560 0.027156 0.044410 0.132034 -0.753064 0.618642 -0.224001 0.415793 0.851809 0.037569 0.053938 0.123341 -0.190908 0.801157 -0.567188 0.410010 0.816830 0.071762 0.046670 0.101566 -0.190908 0.801157 -0.567188 0.374767 0.709924 0.052997 0.025909 0.078557 -0.190908 0.801157 -0.567188 0.450460 0.714650 0.062351 0.052413 0.140813 -0.621950 0.722121 0.302853 0.318930 0.812548 0.044423 0.031511 0.153834 -0.621950 0.722121 0.302853 0.301720 0.824680 0.061518 0.042216 0.163416 -0.621950 0.722121 0.302853 0.316160 0.818176 0.135593 0.023447 0.091315 0.689132 0.337391 -0.641299 0.261680 0.547960 0.138591 0.044894 0.105820 0.689132 0.337391 -0.641299 0.231540 0.563650 0.153810 0.036576 0.117798 0.689132 0.337391 -0.641299 0.204756 0.548310 0.121015 0.040796 0.087146 0.078730 0.955641 -0.283816 0.297580 0.574370 0.127937 0.047717 0.112370 0.078730 0.955641 -0.283816 0.243160 0.595480 0.138591 0.044894 0.105820 0.078730 0.955641 -0.283816 0.231540 0.563650 0.127937 0.047717 0.112370 -0.079966 0.992494 -0.092529 0.243160 0.595480 0.111719 0.044626 0.093231 -0.079966 0.992494 -0.092529 0.306530 0.603540 0.124840 0.048888 0.127607 -0.079966 0.992494 -0.092529 0.225220 0.625490 0.111719 0.044626 0.093231 -0.343962 0.938866 0.014885 0.306530 0.603540 0.092476 0.037228 0.115191 -0.343962 0.938866 0.014885 0.262670 0.665250 0.124840 0.048888 0.127607 -0.343962 0.938866 0.014885 0.225220 0.625490 0.124840 0.048888 0.127607 -0.287104 0.947413 -0.141349 0.225220 0.625490 0.092476 0.037228 0.115191 -0.287104 0.947413 -0.141349 0.262670 0.665250 0.117201 0.050385 0.153157 -0.287104 0.947413 -0.141349 0.200900 0.681330 0.153810 0.036576 0.117798 0.682750 0.273587 -0.677498 0.204756 0.548310 0.138591 0.044894 0.105820 0.682750 0.273587 -0.677498 0.231540 0.563650 0.161981 0.058897 0.135046 0.682750 0.273587 -0.677498 0.205510 0.554570 0.138591 0.044894 0.105820 -0.026246 0.901799 -0.431359 0.231540 0.563650 0.127937 0.047717 0.112370 -0.026246 0.901799 -0.431359 0.243160 0.595480 0.143106 0.052573 0.121599 -0.026246 0.901799 -0.431359 0.196590 0.574980 0.127937 0.047717 0.112370 -0.234628 0.964423 -0.121808 0.243160 0.595480 0.124840 0.048888 0.127607 -0.234628 0.964423 -0.121808 0.225220 0.625490 0.143106 0.052573 0.121599 -0.234628 0.964423 -0.121808 0.196590 0.574980 0.124840 0.048888 0.127607 0.072311 0.996704 -0.036778 0.225220 0.625490 0.117201 0.050385 0.153157 0.072311 0.996704 -0.036778 0.200900 0.681330 0.130922 0.049236 0.148996 0.072311 0.996704 -0.036778 0.179280 0.644260 0.161981 0.058897 0.135046 0.013148 0.897611 -0.440593 0.205510 0.554570 0.138591 0.044894 0.105820 0.013148 0.897611 -0.440593 0.231540 0.563650 0.143106 0.052573 0.121599 0.013148 0.897611 -0.440593 0.196590 0.574980 0.124840 0.048888 0.127607 0.163404 0.984578 -0.062483 0.225220 0.625490 0.130922 0.049236 0.148996 0.163404 0.984578 -0.062483 0.179280 0.644260 0.136199 0.047431 0.134354 0.163404 0.984578 -0.062483 0.190281 0.610355 0.143992 0.050780 0.185383 -0.806753 0.330047 0.490120 0.151250 0.671000 0.142136 0.060030 0.176099 -0.806753 0.330047 0.490120 0.111570 0.658070 0.124638 0.045934 0.156789 -0.806753 0.330047 0.490120 0.178405 0.669185 0.124638 0.045934 0.156789 -0.555997 0.825311 -0.098641 0.178405 0.669185 0.142136 0.060030 0.176099 -0.555997 0.825311 -0.098641 0.111570 0.658070 0.130922 0.049236 0.148996 -0.555997 0.825311 -0.098641 0.179280 0.644260 0.142136 0.060030 0.176099 -0.445050 0.879929 -0.166298 0.111570 0.658070 0.158775 0.066912 0.167984 -0.445050 0.879929 -0.166298 0.089401 0.614255 0.130922 0.049236 0.148996 -0.445050 0.879929 -0.166298 0.179280 0.644260 0.158775 0.066912 0.167984 -0.538539 0.565618 -0.624542 0.089401 0.614255 0.142136 0.060030 0.176099 -0.538539 0.565618 -0.624542 0.111570 0.658070 0.159528 0.087068 0.185589 -0.538539 0.565618 -0.624542 0.063021 0.631922 0.142136 0.060030 0.176099 -0.850902 0.455459 0.261769 0.111570 0.658070 0.149787 0.066389 0.189905 -0.850902 0.455459 0.261769 0.077689 0.659309 0.159528 0.087068 0.185589 -0.850902 0.455459 0.261769 0.063021 0.631922 0.149787 0.066389 0.189905 -0.903421 0.428521 0.014169 0.077689 0.659309 0.159469 0.086296 0.205175 -0.903421 0.428521 0.014169 0.032164 0.653374 0.159528 0.087068 0.185589 -0.903421 0.428521 0.014169 0.063021 0.631922 0.169176 0.083665 0.181754 0.897506 0.249696 -0.363503 0.047225 0.608980 0.176435 0.092959 0.206061 0.897506 0.249696 -0.363503 0.007966 0.628355 0.173943 0.072128 0.185599 0.897506 0.249696 -0.363503 0.042490 0.600000 0.169176 0.083665 0.181754 0.953574 0.036913 -0.298888 0.047225 0.608980 0.172181 0.094044 0.192623 0.953574 0.036913 -0.298888 0.024866 0.619390 0.176435 0.092959 0.206061 0.953574 0.036913 -0.298888 0.007966 0.628355 0.159528 0.087068 0.185589 -0.017556 0.725530 -0.687967 0.058333 0.632730 0.172181 0.094044 0.192623 -0.017556 0.725530 -0.687967 0.024866 0.619390 0.169176 0.083665 0.181754 -0.017556 0.725530 -0.687967 0.047225 0.608980 0.172181 0.094044 0.192623 0.283248 0.958969 -0.012238 0.024866 0.619390 0.165030 0.096221 0.197703 0.283248 0.958969 -0.012238 0.028538 0.636841 0.176435 0.092959 0.206061 0.283248 0.958969 -0.012238 0.007966 0.628355 0.159528 0.087068 0.185589 -0.144013 0.819906 -0.554089 0.058333 0.632730 0.165030 0.096221 0.197703 -0.144013 0.819906 -0.554089 0.028538 0.636841 0.172181 0.094044 0.192623 -0.144013 0.819906 -0.554089 0.024866 0.619390 0.165030 0.096221 0.197703 -0.866743 0.498464 0.017036 0.028538 0.636841 0.159528 0.087068 0.185589 -0.866743 0.498464 0.017036 0.063021 0.631922 0.159469 0.086296 0.205175 -0.866743 0.498464 0.017036 0.032164 0.653374 0.159469 0.086296 0.205175 -0.300410 0.675374 0.673516 0.032164 0.653374 0.176435 0.092959 0.206061 -0.300410 0.675374 0.673516 0.007966 0.628355 0.165030 0.096221 0.197703 -0.300410 0.675374 0.673516 0.028538 0.636841 0.130922 0.049236 0.148996 0.229247 0.816022 0.530616 0.179280 0.644260 0.117201 0.050385 0.153157 0.229247 0.816022 0.530616 0.200900 0.681330 0.124638 0.045934 0.156789 0.229247 0.816022 0.530616 0.181247 0.669140 0.124638 0.045934 0.156789 -0.142384 0.472025 0.870011 0.178405 0.669185 0.117201 0.050385 0.153157 -0.142384 0.472025 0.870011 0.200900 0.681330 0.119302 0.038419 0.159993 -0.142384 0.472025 0.870011 0.182900 0.687000 0.117201 0.050385 0.153157 0.791086 0.402199 0.460890 0.200900 0.681330 0.113399 0.048360 0.161450 0.791086 0.402199 0.460890 0.194766 0.703056 0.119302 0.038419 0.159993 0.791086 0.402199 0.460890 0.182900 0.687000 0.105390 0.048647 0.164927 0.052436 0.876901 -0.477802 0.205070 0.725670 0.075682 0.050078 0.164293 0.052436 0.876901 -0.477802 0.266450 0.791830 0.088707 0.052685 0.170507 0.052436 0.876901 -0.477802 0.230999 0.772807 0.071425 0.047528 0.178549 -0.241205 0.965243 0.100629 0.250100 0.818029 0.088707 0.052685 0.170507 -0.241205 0.965243 0.100629 0.230999 0.772807 0.075682 0.050078 0.164293 -0.241205 0.965243 0.100629 0.266450 0.791830 0.105390 0.048647 0.164927 -0.221711 0.971910 -0.078968 0.205070 0.725670 0.117201 0.050385 0.153157 -0.221711 0.971910 -0.078968 0.200900 0.681330 0.084341 0.041774 0.139434 -0.221711 0.971910 -0.078968 0.260430 0.698770 0.117201 0.050385 0.153157 -0.154762 0.960323 -0.232010 0.200900 0.681330 0.092476 0.037228 0.115191 -0.154762 0.960323 -0.232010 0.262670 0.665250 0.084341 0.041774 0.139434 -0.154762 0.960323 -0.232010 0.260430 0.698770 0.088707 0.052685 0.170507 0.637007 0.574152 -0.514366 0.230999 0.772807 0.098148 0.065280 0.196258 0.637007 0.574152 -0.514366 0.169760 0.791210 0.108636 0.055260 0.198062 0.637007 0.574152 -0.514366 0.148075 0.768006 0.088707 0.052685 0.170507 -0.532034 0.821139 -0.206567 0.230999 0.772807 0.086585 0.059950 0.204852 -0.532034 0.821139 -0.206567 0.176753 0.823046 0.098148 0.065280 0.196258 -0.532034 0.821139 -0.206567 0.169760 0.791210 0.098148 0.065280 0.196258 0.484165 0.363483 -0.795905 0.169760 0.791210 0.119937 0.077291 0.214998 0.484165 0.363483 -0.795905 0.094384 0.772592 0.108636 0.055260 0.198062 0.484165 0.363483 -0.795905 0.148075 0.768006 0.086585 0.059950 0.204852 -0.569170 0.770049 -0.288219 0.172969 0.822403 0.104757 0.078397 0.218252 -0.569170 0.770049 -0.288219 0.119475 0.806425 0.098148 0.065280 0.196258 -0.569170 0.770049 -0.288219 0.167530 0.791000 0.104757 0.078397 0.218252 -0.044623 0.863844 -0.501779 0.119475 0.806425 0.119937 0.077291 0.214998 -0.044623 0.863844 -0.501779 0.094384 0.772592 0.098148 0.065280 0.196258 -0.044623 0.863844 -0.501779 0.167530 0.791000 0.118628 0.093343 0.233243 0.366299 0.919435 0.143053 0.068000 0.797370 0.128282 0.088243 0.241302 0.366299 0.919435 0.143053 0.043946 0.784224 0.128568 0.090583 0.225530 0.366299 0.919435 0.143053 0.062010 0.771769 0.128568 0.090583 0.225530 0.964069 0.259680 0.056009 0.062010 0.771769 0.128282 0.088243 0.241302 0.964069 0.259680 0.056009 0.043946 0.784224 0.131489 0.078973 0.229080 0.964069 0.259680 0.056009 0.057647 0.763215 0.128282 0.088243 0.241302 -0.172738 0.725585 0.666099 0.043946 0.784224 0.118628 0.093343 0.233243 -0.172738 0.725585 0.666099 0.068000 0.797370 0.113825 0.086887 0.239030 -0.172738 0.725585 0.666099 0.071740 0.814150 0.086585 0.059950 0.204852 -0.369460 0.904245 -0.214102 0.176753 0.823046 0.088707 0.052685 0.170507 -0.369460 0.904245 -0.214102 0.230999 0.772807 0.071425 0.047528 0.178549 -0.369460 0.904245 -0.214102 0.250100 0.818029 0.104757 0.078397 0.218252 -0.767031 0.637287 0.074351 0.113396 0.806480 0.113825 0.086887 0.239030 -0.767031 0.637287 0.074351 0.071740 0.814150 0.118628 0.093343 0.233243 -0.767031 0.637287 0.074351 0.068000 0.797370 0.104757 0.078397 0.218252 -0.724534 0.688353 0.034938 0.113396 0.806480 0.086585 0.059950 0.204852 -0.724534 0.688353 0.034938 0.172969 0.822403 0.113825 0.086887 0.239030 -0.724534 0.688353 0.034938 0.071740 0.814150 0.108636 0.055260 0.198062 0.763522 0.098921 -0.638161 0.148075 0.768006 0.119937 0.077291 0.214998 0.763522 0.098921 -0.638161 0.094384 0.772592 0.131489 0.078973 0.229080 0.763522 0.098921 -0.638161 0.057647 0.763215 0.128568 0.090583 0.225530 0.773107 0.000565 -0.634276 0.062010 0.771769 0.131489 0.078973 0.229080 0.773107 0.000565 -0.634276 0.057647 0.763215 0.119937 0.077291 0.214998 0.773107 0.000565 -0.634276 0.094384 0.772592 0.117201 0.050385 0.153157 0.166062 0.937727 0.305108 0.200900 0.681330 0.105390 0.048647 0.164927 0.166062 0.937727 0.305108 0.205070 0.725670 0.113399 0.048360 0.161450 0.166062 0.937727 0.305108 0.194766 0.703056 0.105390 0.048647 0.164927 -0.154431 0.889921 -0.429176 0.205070 0.725670 0.126783 0.063450 0.187924 -0.154431 0.889921 -0.429176 0.123640 0.711560 0.113399 0.048360 0.161450 -0.154431 0.889921 -0.429176 0.194766 0.703056 0.097660 0.038978 0.172552 -0.748673 0.658556 0.076109 0.207600 0.751920 0.114482 0.056148 0.189459 -0.748673 0.658556 0.076109 0.147190 0.741800 0.105390 0.048647 0.164927 -0.748673 0.658556 0.076109 0.205070 0.725670 0.105390 0.048647 0.164927 -0.515642 0.853940 -0.069998 0.205070 0.725670 0.114482 0.056148 0.189459 -0.515642 0.853940 -0.069998 0.147190 0.741800 0.126783 0.063450 0.187924 -0.515642 0.853940 -0.069998 0.123640 0.711560 0.097660 0.038978 0.172552 -0.819569 0.385936 0.423509 0.207600 0.751920 0.107971 0.041337 0.190356 -0.819569 0.385936 0.423509 0.161290 0.754120 0.114482 0.056148 0.189459 -0.819569 0.385936 0.423509 0.147190 0.741800 0.107971 0.041337 0.190356 -0.850928 0.395041 0.346213 0.161290 0.754120 0.123289 0.059764 0.206979 -0.850928 0.395041 0.346213 0.100160 0.745330 0.114482 0.056148 0.189459 -0.850928 0.395041 0.346213 0.147190 0.741800 0.114482 0.056148 0.189459 -0.843830 0.416628 0.338189 0.147190 0.741800 0.123289 0.059764 0.206979 -0.843830 0.416628 0.338189 0.100160 0.745330 0.127109 0.070575 0.203192 -0.843830 0.416628 0.338189 0.099430 0.733770 0.114482 0.056148 0.189459 -0.509573 0.783824 -0.354901 0.147190 0.741800 0.127109 0.070575 0.203192 -0.509573 0.783824 -0.354901 0.099430 0.733770 0.126783 0.063450 0.187924 -0.509573 0.783824 -0.354901 0.123640 0.711560 0.142189 0.063498 0.190741 0.131333 0.671051 -0.729686 0.092348 0.685197 0.135284 0.055424 0.182073 0.131333 0.671051 -0.729686 0.119930 0.686806 0.126783 0.063450 0.187924 0.131333 0.671051 -0.729686 0.123640 0.711560 0.126783 0.063450 0.187924 0.307594 0.751384 -0.583788 0.123640 0.711560 0.135284 0.055424 0.182073 0.307594 0.751384 -0.583788 0.119930 0.686806 0.113399 0.048360 0.161450 0.307594 0.751384 -0.583788 0.194766 0.703056 0.135284 0.055424 0.182073 0.542714 0.428171 -0.722586 0.119930 0.686806 0.119302 0.038419 0.159993 0.542714 0.428171 -0.722586 0.182900 0.687000 0.113399 0.048360 0.161450 0.542714 0.428171 -0.722586 0.194766 0.703056 0.127109 0.070575 0.203192 -0.875533 0.402820 0.266792 0.099430 0.733770 0.123289 0.059764 0.206979 -0.875533 0.402820 0.266792 0.100160 0.745330 0.148253 0.104663 0.221112 -0.875533 0.402820 0.266792 0.025313 0.709884 0.123289 0.059764 0.206979 -0.877269 0.408353 0.252284 0.100160 0.745330 0.144382 0.092417 0.227473 -0.877269 0.408353 0.252284 0.026020 0.727900 0.148253 0.104663 0.221112 -0.877269 0.408353 0.252284 0.025313 0.709884 0.148253 0.104663 0.221112 -0.750055 0.605322 -0.266465 0.025313 0.709884 0.126783 0.063450 0.187924 -0.750055 0.605322 -0.266465 0.123640 0.711560 0.127109 0.070575 0.203192 -0.750055 0.605322 -0.266465 0.099430 0.733770 0.160456 0.093784 0.213636 0.150116 0.536996 -0.830121 0.020110 0.678290 0.142189 0.063498 0.190741 0.150116 0.536996 -0.830121 0.092348 0.685197 0.126783 0.063450 0.187924 0.150116 0.536996 -0.830121 0.123640 0.711560 0.154832 0.073607 0.208689 0.839615 -0.103280 -0.533273 0.052320 0.675130 0.142189 0.063498 0.190741 0.839615 -0.103280 -0.533273 0.092348 0.685197 0.160456 0.093784 0.213636 0.839615 -0.103280 -0.533273 0.020110 0.678290 0.126783 0.063450 0.187924 0.056925 0.608025 -0.791874 0.123640 0.711560 0.148253 0.104663 0.221112 0.056925 0.608025 -0.791874 0.025313 0.709884 0.160456 0.093784 0.213636 0.056925 0.608025 -0.791874 0.020110 0.678290 0.144382 0.092417 0.227473 -0.238748 0.505996 0.828835 0.026020 0.727900 0.156812 0.096983 0.228266 -0.238748 0.505996 0.828835 0.004768 0.704040 0.148253 0.104663 0.221112 -0.238748 0.505996 0.828835 0.025313 0.709884 0.160456 0.093784 0.213636 0.666468 0.745528 0.002985 0.020110 0.678290 0.148253 0.104663 0.221112 0.666468 0.745528 0.002985 0.025313 0.709884 0.156812 0.096983 0.228266 0.666468 0.745528 0.002985 0.004768 0.704040 0.053625 -0.028163 0.008548 0.886028 -0.175324 -0.429205 0.563770 0.587680 0.022281 -0.052876 -0.046062 0.886028 -0.175324 -0.429205 0.707390 0.565900 0.029309 -0.029773 -0.040991 0.886028 -0.175324 -0.429205 0.694998 0.593245 0.142987 0.029221 0.148360 0.933907 -0.344071 0.097126 0.162840 0.613160 0.142930 0.026574 0.139531 0.933907 -0.344071 0.097126 0.168030 0.609880 0.150595 0.051764 0.155065 0.933907 -0.344071 0.097126 0.128281 0.611740 0.142930 0.026574 0.139531 0.205114 0.467758 -0.859728 0.168030 0.609880 0.130922 0.049236 0.148996 0.205114 0.467758 -0.859728 0.177100 0.643890 0.150595 0.051764 0.155065 0.205114 0.467758 -0.859728 0.128281 0.611740 0.136199 0.047431 0.134354 -0.626252 0.779220 -0.024993 0.190281 0.610355 0.151269 0.059879 0.144841 -0.626252 0.779220 -0.024993 0.146100 0.591670 0.143106 0.052573 0.121599 -0.626252 0.779220 -0.024993 0.196590 0.574980 0.142930 0.026574 0.139531 -0.722055 -0.061990 0.689053 0.168030 0.609880 0.159537 0.060161 0.159955 -0.722055 -0.061990 0.689053 0.117383 0.597700 0.136199 0.047431 0.134354 -0.722055 -0.061990 0.689053 0.190281 0.610355 0.136199 0.047431 0.134354 -0.732416 0.557915 0.390253 0.190281 0.610355 0.159537 0.060161 0.159955 -0.732416 0.557915 0.390253 0.117383 0.597700 0.151269 0.059879 0.144841 -0.732416 0.557915 0.390253 0.146100 0.591670 0.143106 0.052573 0.121599 -0.141877 0.957493 -0.251153 0.196590 0.574980 0.151269 0.059879 0.144841 -0.141877 0.957493 -0.251153 0.146100 0.591670 0.161981 0.058897 0.135046 -0.141877 0.957493 -0.251153 0.137991 0.550913 0.130922 0.049236 0.148996 0.892027 0.356758 0.277508 0.177100 0.643890 0.142930 0.026574 0.139531 0.892027 0.356758 0.277508 0.168030 0.609880 0.136199 0.047431 0.134354 0.892027 0.356758 0.277508 0.170267 0.618432 0.150595 0.051764 0.155065 0.815290 0.051619 -0.576748 0.128281 0.611740 0.158775 0.066912 0.167984 0.815290 0.051619 -0.576748 0.089401 0.614255 0.164352 0.057553 0.175030 0.815290 0.051619 -0.576748 0.075400 0.602490 0.150595 0.051764 0.155065 0.169529 0.584917 -0.793178 0.128281 0.611740 0.130922 0.049236 0.148996 0.169529 0.584917 -0.793178 0.177100 0.643890 0.158775 0.066912 0.167984 0.169529 0.584917 -0.793178 0.089401 0.614255 0.159537 0.060161 0.159955 -0.596094 -0.180948 0.782259 0.117383 0.597700 0.142930 0.026574 0.139531 -0.596094 -0.180948 0.782259 0.168030 0.609880 0.156379 0.044803 0.153996 -0.596094 -0.180948 0.782259 0.124200 0.603440 0.164352 0.057553 0.175030 0.762134 -0.032642 -0.646596 0.075400 0.602490 0.158775 0.066912 0.167984 0.762134 -0.032642 -0.646596 0.089401 0.614255 0.173943 0.072128 0.185599 0.762134 -0.032642 -0.646596 0.042490 0.600000 0.158775 0.066912 0.167984 0.742392 0.085284 -0.664515 0.089401 0.614255 0.169176 0.083665 0.181754 0.742392 0.085284 -0.664515 0.055650 0.607740 0.173943 0.072128 0.185599 0.742392 0.085284 -0.664515 0.042490 0.600000 0.158775 0.066912 0.167984 -0.066216 0.657796 -0.750280 0.089401 0.614255 0.159528 0.087068 0.185589 -0.066216 0.657796 -0.750280 0.063021 0.631922 0.169176 0.083665 0.181754 -0.066216 0.657796 -0.750280 0.055650 0.607740 0.136199 0.047431 0.134354 -0.078967 0.938671 0.335651 0.190281 0.610355 0.143106 0.052573 0.121599 -0.078967 0.938671 0.335651 0.196590 0.574980 0.124840 0.048888 0.127607 -0.078967 0.938671 0.335651 0.225220 0.625490 0.156379 0.044803 0.153996 -0.639687 -0.160153 0.751766 0.116410 0.602830 0.168610 0.067224 0.169180 -0.639687 -0.160153 0.751766 0.071290 0.596710 0.159537 0.060161 0.159955 -0.639687 -0.160153 0.751766 0.117383 0.597700 0.159537 0.060161 0.159955 -0.649562 -0.141322 0.747060 0.117383 0.597700 0.168610 0.067224 0.169180 -0.649562 -0.141322 0.747060 0.071290 0.596710 0.174312 0.080673 0.176682 -0.649562 -0.141322 0.747060 0.046580 0.584910 0.159537 0.060161 0.159955 -0.854005 0.237795 0.462740 0.102401 0.594698 0.174312 0.080673 0.176682 -0.854005 0.237795 0.462740 0.046580 0.584910 0.151269 0.059879 0.144841 -0.854005 0.237795 0.462740 0.134250 0.589370 0.151269 0.059879 0.144841 -0.855175 0.294363 0.426645 0.134250 0.589370 0.174312 0.080673 0.176682 -0.855175 0.294363 0.426645 0.046580 0.584910 0.172340 0.088145 0.167574 -0.855175 0.294363 0.426645 0.061920 0.574880 0.161018 0.070392 0.147527 -0.684546 0.692765 -0.226877 0.119270 0.573250 0.151269 0.059879 0.144841 -0.684546 0.692765 -0.226877 0.134250 0.589370 0.172340 0.088145 0.167574 -0.684546 0.692765 -0.226877 0.061920 0.574880 0.172340 0.088145 0.167574 -0.217964 0.788476 -0.575150 0.061920 0.574880 0.177914 0.078618 0.152401 -0.217964 0.788476 -0.575150 0.076558 0.550459 0.161018 0.070392 0.147527 -0.217964 0.788476 -0.575150 0.119270 0.573250 0.161981 0.058897 0.135046 -0.155900 0.720547 -0.675653 0.137991 0.550913 0.161018 0.070392 0.147527 -0.155900 0.720547 -0.675653 0.119270 0.573250 0.177914 0.078618 0.152401 -0.155900 0.720547 -0.675653 0.076558 0.550459 0.161981 0.058897 0.135046 -0.498954 0.617936 -0.607618 0.137991 0.550913 0.151269 0.059879 0.144841 -0.498954 0.617936 -0.607618 0.134250 0.589370 0.161018 0.070392 0.147527 -0.498954 0.617936 -0.607618 0.119270 0.573250 0.177914 0.078618 0.152401 0.491377 0.807443 -0.326473 0.076558 0.550459 0.172340 0.088145 0.167574 0.491377 0.807443 -0.326473 0.061920 0.574880 0.184018 0.079932 0.164838 0.491377 0.807443 -0.326473 0.046470 0.549800 0.104757 0.078397 0.218252 -0.087544 0.744781 -0.661541 0.119475 0.806425 0.118628 0.093343 0.233243 -0.087544 0.744781 -0.661541 0.068000 0.797370 0.119937 0.077291 0.214998 -0.087544 0.744781 -0.661541 0.094384 0.772592 0.119937 0.077291 0.214998 -0.302290 0.704802 -0.641775 0.094384 0.772592 0.118628 0.093343 0.233243 -0.302290 0.704802 -0.641775 0.068000 0.797370 0.128568 0.090583 0.225530 -0.302290 0.704802 -0.641775 0.062010 0.771769 0.086585 0.059950 0.204852 -0.739178 -0.127042 0.661420 0.187156 0.190790 0.075763 0.037689 0.188482 -0.739178 -0.127042 0.661420 0.246170 0.197800 0.093507 0.047680 0.210231 -0.739178 -0.127042 0.661420 0.175260 0.199050 0.097660 0.038978 0.172552 -0.194770 0.310967 0.930250 0.210540 0.264840 0.095701 0.027930 0.175835 -0.194770 0.310967 0.930250 0.220030 0.259690 0.109910 0.024071 0.180100 -0.194770 0.310967 0.930250 0.186271 0.283171 0.109910 0.024071 0.180100 -0.489258 -0.485360 0.724605 0.186271 0.283171 0.123196 0.044287 0.202612 -0.489258 -0.485360 0.724605 0.122720 0.274200 0.107971 0.041337 0.190356 -0.489258 -0.485360 0.724605 0.166593 0.267539 0.123289 0.059764 0.206979 -0.586337 -0.216715 0.780540 0.112692 0.264495 0.107971 0.041337 0.190356 -0.586337 -0.216715 0.780540 0.166593 0.267539 0.123196 0.044287 0.202612 -0.586337 -0.216715 0.780540 0.122720 0.274200 0.109910 0.024071 0.180100 0.273703 -0.790311 0.548174 0.186271 0.283171 0.141667 0.052178 0.204766 0.273703 -0.790311 0.548174 0.098020 0.295780 0.123196 0.044287 0.202612 0.273703 -0.790311 0.548174 0.122720 0.274200 0.109910 0.024071 0.180100 -0.775908 -0.384301 0.500279 0.186271 0.283171 0.107971 0.041337 0.190356 -0.775908 -0.384301 0.500279 0.166593 0.267539 0.097660 0.038978 0.172552 -0.775908 -0.384301 0.500279 0.210540 0.264840 0.123289 0.059764 0.206979 -0.540231 -0.168491 0.824476 0.112692 0.264495 0.141494 0.076623 0.222353 -0.540231 -0.168491 0.824476 0.059790 0.277920 0.144382 0.092417 0.227473 -0.540231 -0.168491 0.824476 0.036651 0.275151 0.141494 0.076623 0.222353 0.056107 -0.317159 0.946711 0.053758 0.278100 0.156812 0.096983 0.228266 0.056107 -0.317159 0.946711 0.033925 0.290432 0.144382 0.092417 0.227473 0.056107 -0.317159 0.946711 0.036651 0.275151 0.141667 0.052178 0.204766 0.417494 -0.528731 0.739015 0.043468 0.298260 0.156812 0.096983 0.228266 0.417494 -0.528731 0.739015 0.033925 0.290432 0.141494 0.076623 0.222353 0.417494 -0.528731 0.739015 0.053758 0.278100 0.141667 0.052178 0.204766 0.668676 -0.509881 0.541197 0.043468 0.298260 0.154832 0.073607 0.208689 0.668676 -0.509881 0.541197 0.049561 0.321938 0.156812 0.096983 0.228266 0.668676 -0.509881 0.541197 0.033925 0.290432 0.154832 0.073607 0.208689 0.899394 -0.322928 0.294630 0.049561 0.321938 0.160456 0.093784 0.213636 0.899394 -0.322928 0.294630 0.025280 0.326291 0.156812 0.096983 0.228266 0.899394 -0.322928 0.294630 0.010440 0.305130 0.154832 0.073607 0.208689 0.829718 -0.449044 -0.331555 0.048226 0.322009 0.141667 0.052178 0.204766 0.829718 -0.449044 -0.331555 0.081990 0.304590 0.142189 0.063498 0.190741 0.829718 -0.449044 -0.331555 0.087940 0.327060 0.184018 0.079932 0.164838 0.591821 0.792575 0.146878 0.044750 0.458050 0.172340 0.088145 0.167574 0.591821 0.792575 0.146878 0.035060 0.447515 0.182614 0.078900 0.176064 0.591821 0.792575 0.146878 0.036999 0.436733 0.141494 0.076623 0.222353 0.152655 -0.576454 0.802743 0.059790 0.277920 0.123196 0.044287 0.202612 0.152655 -0.576454 0.802743 0.092590 0.280640 0.141667 0.052178 0.204766 0.152655 -0.576454 0.802743 0.081990 0.304590 0.172340 0.088145 0.167574 0.210187 0.777679 0.592483 0.036470 0.432090 0.174312 0.080673 0.176682 0.210187 0.777679 0.592483 0.043260 0.424780 0.182614 0.078900 0.176064 0.210187 0.777679 0.592483 0.036999 0.436733 0.168610 0.067224 0.169180 0.319246 -0.644602 0.694673 0.067350 0.424040 0.156379 0.044803 0.153996 0.319246 -0.644602 0.694673 0.116650 0.420010 0.179213 0.068282 0.165289 0.319246 -0.644602 0.694673 0.085250 0.429680 0.177914 0.078618 0.152401 0.739921 -0.005832 -0.672668 0.075080 0.466000 0.172189 0.056197 0.146298 0.739921 -0.005832 -0.672668 0.098560 0.464290 0.161981 0.058897 0.135046 0.739921 -0.005832 -0.672668 0.116410 0.468430 0.172189 0.056197 0.146298 0.748595 0.211528 -0.628380 0.098560 0.464290 0.153810 0.036576 0.117798 0.748595 0.211528 -0.628380 0.173706 0.466822 0.161981 0.058897 0.135046 0.748595 0.211528 -0.628380 0.116410 0.468430 0.156379 0.044803 0.153996 0.620950 -0.772732 0.131555 0.128690 0.429070 0.153810 0.036576 0.117798 0.620950 -0.772732 0.131555 0.173706 0.466822 0.172189 0.056197 0.146298 0.620950 -0.772732 0.131555 0.098560 0.464290 0.142930 0.026574 0.139531 0.765804 -0.636695 0.090357 0.174691 0.414974 0.153810 0.036576 0.117798 0.765804 -0.636695 0.090357 0.173706 0.466822 0.156379 0.044803 0.153996 0.765804 -0.636695 0.090357 0.128690 0.429070 0.172189 0.056197 0.146298 0.918839 -0.382700 -0.096309 0.098560 0.464290 0.184018 0.079932 0.164838 0.918839 -0.382700 -0.096309 0.044750 0.458050 0.179213 0.068282 0.165289 0.918839 -0.382700 -0.096309 0.058440 0.452240 0.172189 0.056197 0.146298 0.896665 -0.112398 -0.428203 0.098560 0.464290 0.177914 0.078618 0.152401 0.896665 -0.112398 -0.428203 0.075080 0.466000 0.184018 0.079932 0.164838 0.896665 -0.112398 -0.428203 0.044750 0.458050 0.179213 0.068282 0.165289 0.640173 -0.733080 0.229724 0.085250 0.429680 0.156379 0.044803 0.153996 0.640173 -0.733080 0.229724 0.116650 0.420010 0.172189 0.056197 0.146298 0.640173 -0.733080 0.229724 0.098560 0.464290 0.003153 -0.046601 -0.089268 0.856116 0.056674 -0.513667 0.824771 0.564740 -0.032947 -0.077119 -0.152802 0.856116 0.056674 -0.513667 0.958829 0.529430 -0.024684 -0.048566 -0.135880 0.856116 0.056674 -0.513667 0.936076 0.565704 0.097660 0.038978 0.172552 0.374096 0.371146 0.849884 0.207600 0.751920 0.105390 0.048647 0.164927 0.374096 0.371146 0.849884 0.205070 0.725670 0.088707 0.052685 0.170507 0.374096 0.371146 0.849884 0.230999 0.772807 0.179213 0.068282 0.165289 0.922539 -0.377374 0.080688 0.055790 0.445457 0.184018 0.079932 0.164838 0.922539 -0.377374 0.080688 0.049275 0.450166 0.182614 0.078900 0.176064 0.922539 -0.377374 0.080688 0.039630 0.437958 0.118713 0.062923 0.224846 0.130581 -0.574499 0.808022 0.104782 0.225075 0.128282 0.088243 0.241302 0.130581 -0.574499 0.808022 0.086230 0.212680 0.107296 0.067456 0.229914 0.130581 -0.574499 0.808022 0.116859 0.196548 0.118713 0.062923 0.224846 0.546977 -0.591640 0.592265 0.102323 0.225356 0.131489 0.078973 0.229080 0.546977 -0.591640 0.592265 0.069787 0.240614 0.128282 0.088243 0.241302 0.546977 -0.591640 0.592265 0.086230 0.212680 0.128282 0.088243 0.241302 -0.106723 -0.392687 0.913459 0.086230 0.212680 0.113825 0.086887 0.239030 -0.106723 -0.392687 0.913459 0.085630 0.194932 0.107296 0.067456 0.229914 -0.106723 -0.392687 0.913459 0.116859 0.196548 0.158948 0.073733 0.201971 -0.747981 -0.134729 0.649902 0.045070 0.346890 0.159469 0.086296 0.205175 -0.747981 -0.134729 0.649902 0.036382 0.346078 0.149787 0.066389 0.189905 -0.747981 -0.134729 0.649902 0.078462 0.341776 0.173943 0.072128 0.185599 0.987532 -0.153296 0.035792 0.037193 0.399844 0.176435 0.092959 0.206061 0.987532 -0.153296 0.035792 0.016240 0.393960 0.174433 0.077625 0.195623 0.987532 -0.153296 0.035792 0.020480 0.387770 0.176435 0.092959 0.206061 0.047143 -0.248685 0.967436 0.007915 0.371467 0.159469 0.086296 0.205175 0.047143 -0.248685 0.967436 0.021672 0.354337 0.158948 0.073733 0.201971 0.047143 -0.248685 0.967436 0.030040 0.353640 0.158948 0.073733 0.201971 0.431624 -0.545427 0.718477 0.030040 0.353640 0.174433 0.077625 0.195623 0.431624 -0.545427 0.718477 0.019210 0.387510 0.176435 0.092959 0.206061 0.431624 -0.545427 0.718477 0.007915 0.371467 0.113825 0.086887 0.239030 -0.763241 -0.045901 0.644482 0.085630 0.194932 0.086585 0.059950 0.204852 -0.763241 -0.045901 0.644482 0.187156 0.190790 0.107296 0.067456 0.229914 -0.763241 -0.045901 0.644482 0.116859 0.196548 0.142987 0.029221 0.148360 0.638381 -0.762440 -0.105617 0.161963 0.397901 0.150255 0.033474 0.161588 0.638381 -0.762440 -0.105617 0.126154 0.391636 0.135350 0.021139 0.160543 0.638381 -0.762440 -0.105617 0.158440 0.365650 0.119302 0.038419 0.159993 0.369961 0.129537 0.919972 0.182860 0.335000 0.119415 0.029098 0.161260 0.369961 0.129537 0.919972 0.188520 0.331390 0.124638 0.045934 0.156789 0.369961 0.129537 0.919972 0.172400 0.336930 0.142930 0.026574 0.139531 0.953163 -0.291356 0.081197 0.174691 0.414974 0.142987 0.029221 0.148360 0.953163 -0.291356 0.081197 0.161963 0.397901 0.140320 0.014932 0.128395 0.953163 -0.291356 0.081197 0.195960 0.427720 0.131489 0.078973 0.229080 0.711285 -0.660514 0.240407 0.069787 0.240614 0.107389 0.046282 0.210566 0.711285 -0.660514 0.240407 0.147990 0.226080 0.108825 0.043741 0.199336 0.711285 -0.660514 0.240407 0.159984 0.245722 0.053360 0.088072 0.187479 -0.311539 0.935424 -0.167110 0.282632 0.904939 0.063223 0.090410 0.182179 -0.311539 0.935424 -0.167110 0.270710 0.887400 0.053192 0.085858 0.175399 -0.311539 0.935424 -0.167110 0.298639 0.885778 0.052997 0.025909 0.078557 0.193159 0.644918 -0.739440 0.450460 0.714650 0.071762 0.046670 0.101566 0.193159 0.644918 -0.739440 0.374767 0.709924 0.081658 0.033262 0.092457 0.193159 0.644918 -0.739440 0.369880 0.669890 -0.060966 -0.016531 -0.020698 -0.651389 0.538782 0.534235 0.841232 0.965642 -0.070686 -0.013774 -0.035330 -0.651389 0.538782 0.534235 0.884636 0.967596 -0.071377 -0.019477 -0.030421 -0.651389 0.538782 0.534235 0.879123 0.988764 -0.070686 -0.013774 -0.035330 -0.651354 0.538799 0.534260 0.884636 0.967596 -0.080407 -0.011017 -0.049962 -0.651354 0.538799 0.534260 0.928039 0.969549 -0.071377 -0.019477 -0.030421 -0.651354 0.538799 0.534260 0.879123 0.988764 -0.030055 -0.019593 0.010739 -0.712964 0.001680 0.701198 0.733560 0.250650 -0.045510 -0.018062 -0.004979 -0.712964 0.001680 0.701198 0.790600 0.243710 -0.030500 -0.033141 0.010319 -0.712964 0.001680 0.701198 0.740681 0.264800 -0.045510 -0.018062 -0.004979 -0.712964 0.001681 0.701199 0.790600 0.243710 -0.060966 -0.016531 -0.020698 -0.712964 0.001681 0.701199 0.847640 0.236770 -0.030500 -0.033141 0.010319 -0.712964 0.001681 0.701199 0.740681 0.264800 -0.003552 -0.007667 0.034842 -0.709785 0.235454 0.663902 0.647650 0.255020 -0.016803 -0.013630 0.022790 -0.709785 0.235454 0.663902 0.690605 0.252835 -0.023862 -0.025303 0.019383 -0.709785 0.235454 0.663902 0.712310 0.264110 -0.025528 -0.015002 -0.098342 0.523553 0.697209 -0.489685 0.894100 0.654540 -0.008270 -0.013472 -0.077712 0.523553 0.697209 -0.489685 0.825605 0.640405 -0.004285 -0.027983 -0.094112 0.523553 0.697209 -0.489685 0.848720 0.590070 -0.008270 -0.013472 -0.077712 0.523510 0.697224 -0.489709 0.825605 0.640405 0.008989 -0.011941 -0.057082 0.523510 0.697224 -0.489709 0.757109 0.626270 -0.004285 -0.027983 -0.094112 0.523510 0.697224 -0.489709 0.848720 0.590070 -0.047826 -0.000722 -0.060163 0.009873 0.938464 -0.345236 0.877380 0.822860 -0.036677 -0.007862 -0.079253 0.009873 0.938464 -0.345236 0.885739 0.738700 -0.082414 -0.008469 -0.082211 0.009873 0.938464 -0.345236 0.963945 0.892963 -0.036677 -0.007862 -0.079253 0.009874 0.938458 -0.345252 0.885739 0.738700 -0.025528 -0.015002 -0.098342 0.009874 0.938458 -0.345252 0.894100 0.654540 -0.082414 -0.008469 -0.082211 0.009874 0.938458 -0.345252 0.963945 0.892963 -0.080407 -0.011017 -0.049962 -0.273470 0.957407 0.092664 0.928039 0.969549 -0.064116 -0.005870 -0.055063 -0.273470 0.957407 0.092664 0.902709 0.896205 -0.082414 -0.008469 -0.082211 -0.273470 0.957407 0.092664 0.963945 0.892963 0.045717 0.011490 0.032308 -0.182390 0.973132 -0.140527 0.534848 0.690702 0.036877 0.011536 0.044100 -0.182390 0.973132 -0.140527 0.536104 0.738321 0.062588 0.018440 0.058539 -0.182390 0.973132 -0.140527 0.462180 0.663670 0.036877 0.011536 0.044100 -0.182362 0.973130 -0.140576 0.536104 0.738321 0.028037 0.011583 0.055893 -0.182362 0.973130 -0.140576 0.537360 0.785940 0.062588 0.018440 0.058539 -0.182362 0.973130 -0.140576 0.462180 0.663670 0.028037 0.011583 0.055893 -0.631896 0.718168 0.291449 0.537360 0.785940 0.012243 0.001958 0.045367 -0.631896 0.718168 0.291449 0.575925 0.816265 0.016955 -0.004583 0.071701 -0.631896 0.718168 0.291449 0.536530 0.818012 0.012243 0.001958 0.045367 -0.631858 0.718200 0.291451 0.575925 0.816265 -0.003552 -0.007667 0.034842 -0.631858 0.718200 0.291451 0.614490 0.846590 0.016955 -0.004583 0.071701 -0.631858 0.718200 0.291451 0.536530 0.818012 0.029745 -0.010530 -0.025899 0.757465 0.392194 -0.521949 0.708175 0.630170 0.040124 -0.009825 -0.010307 0.757465 0.392194 -0.521949 0.683707 0.632120 0.029309 -0.029773 -0.040991 0.757465 0.392194 -0.521949 0.694998 0.593245 0.040124 -0.009825 -0.010307 0.757479 0.392177 -0.521942 0.683707 0.632120 0.050502 -0.009120 0.005284 0.757479 0.392177 -0.521942 0.659240 0.634070 0.029309 -0.029773 -0.040991 0.757479 0.392177 -0.521942 0.694998 0.593245 0.008989 -0.011941 -0.057082 0.757481 0.392213 -0.521912 0.757109 0.626270 0.019367 -0.011236 -0.041490 0.757481 0.392213 -0.521912 0.732642 0.628220 0.029309 -0.029773 -0.040991 0.757481 0.392213 -0.521912 0.694998 0.593245 0.019367 -0.011236 -0.041490 0.757458 0.392199 -0.521955 0.732642 0.628220 0.029745 -0.010530 -0.025899 0.757458 0.392199 -0.521955 0.708175 0.630170 0.029309 -0.029773 -0.040991 0.757458 0.392199 -0.521955 0.694998 0.593245 -0.064116 -0.005870 -0.055063 -0.273531 0.957385 0.092707 0.902709 0.896205 -0.055971 -0.003296 -0.057613 -0.273531 0.957385 0.092707 0.890044 0.859532 -0.082414 -0.008469 -0.082211 -0.273531 0.957385 0.092707 0.963945 0.892963 -0.047826 -0.000722 -0.060163 -0.273531 0.957385 0.092707 0.877380 0.822860 -0.016803 -0.013630 0.022790 -0.709692 0.235359 0.664036 0.690605 0.252835 -0.023429 -0.016611 0.016765 -0.709692 0.235359 0.664036 0.712083 0.251742 -0.023862 -0.025303 0.019383 -0.709692 0.235359 0.664036 0.712310 0.264110 -0.023429 -0.016611 0.016765 -0.709760 0.235342 0.663969 0.712083 0.251742 -0.030055 -0.019593 0.010739 -0.709760 0.235342 0.663969 0.733560 0.250650 -0.023862 -0.025303 0.019383 -0.709760 0.235342 0.663969 0.712310 0.264110 3 0 1 2 3 3 4 5 3 6 7 8 3 9 10 11 3 12 13 14 3 15 16 17 3 18 19 20 3 21 22 23 3 24 25 26 3 27 28 29 3 30 31 32 3 33 34 35 3 36 37 38 3 39 40 41 3 42 43 44 3 45 46 47 3 48 49 50 3 51 52 53 3 54 55 56 3 57 58 59 3 60 61 62 3 63 64 65 3 66 67 68 3 69 70 71 3 72 73 74 3 75 76 77 3 78 79 80 3 81 82 83 3 84 85 86 3 87 88 89 3 90 91 92 3 93 94 95 3 96 97 98 3 99 100 101 3 102 103 104 3 105 106 107 3 108 109 110 3 111 112 113 3 114 115 116 3 117 118 119 3 120 121 122 3 123 124 125 3 126 127 128 3 129 130 131 3 132 133 134 3 135 136 137 3 138 139 140 3 141 142 143 3 144 145 146 3 147 148 149 3 150 151 152 3 153 154 155 3 156 157 158 3 159 160 161 3 162 163 164 3 165 166 167 3 168 169 170 3 171 172 173 3 174 175 176 3 177 178 179 3 180 181 182 3 183 184 185 3 186 187 188 3 189 190 191 3 192 193 194 3 195 196 197 3 198 199 200 3 201 202 203 3 204 205 206 3 207 208 209 3 210 211 212 3 213 214 215 3 216 217 218 3 219 220 221 3 222 223 224 3 225 226 227 3 228 229 230 3 231 232 233 3 234 235 236 3 237 238 239 3 240 241 242 3 243 244 245 3 246 247 248 3 249 250 251 3 252 253 254 3 255 256 257 3 258 259 260 3 261 262 263 3 264 265 266 3 267 268 269 3 270 271 272 3 273 274 275 3 276 277 278 3 279 280 281 3 282 283 284 3 285 286 287 3 288 289 290 3 291 292 293 3 294 295 296 3 297 298 299 3 300 301 302 3 303 304 305 3 306 307 308 3 309 310 311 3 312 313 314 3 315 316 317 3 318 319 320 3 321 322 323 3 324 325 326 3 327 328 329 3 330 331 332 3 333 334 335 3 336 337 338 3 339 340 341 3 342 343 344 3 345 346 347 3 348 349 350 3 351 352 353 3 354 355 356 3 357 358 359 3 360 361 362 3 363 364 365 3 366 367 368 3 369 370 371 3 372 373 374 3 375 376 377 3 378 379 380 3 381 382 383 3 384 385 386 3 387 388 389 3 390 391 392 3 393 394 395 3 396 397 398 3 399 400 401 3 402 403 404 3 405 406 407 3 408 409 410 3 411 412 413 3 414 415 416 3 417 418 419 3 420 421 422 3 423 424 425 3 426 427 428 3 429 430 431 3 432 433 434 3 435 436 437 3 438 439 440 3 441 442 443 3 444 445 446 3 447 448 449 3 450 451 452 3 453 454 455 3 456 457 458 3 459 460 461 3 462 463 464 3 465 466 467 3 468 469 470 3 471 472 473 3 474 475 476 3 477 478 479 3 480 481 482 3 483 484 485 3 486 487 488 3 489 490 491 3 492 493 494 3 495 496 497 3 498 499 500 3 501 502 503 3 504 505 506 3 507 508 509 3 510 511 512 3 513 514 515 3 516 517 518 3 519 520 521 3 522 523 524 3 525 526 527 3 528 529 530 3 531 532 533 3 534 535 536 3 537 538 539 3 540 541 542 3 543 544 545 3 546 547 548 3 549 550 551 3 552 553 554 3 555 556 557 3 558 559 560 3 561 562 563 3 564 565 566 3 567 568 569 3 570 571 572 3 573 574 575 3 576 577 578 3 579 580 581 3 582 583 584 3 585 586 587 3 588 589 590 3 591 592 593 3 594 595 596 3 597 598 599 3 600 601 602 3 603 604 605 3 606 607 608 3 609 610 611 3 612 613 614 3 615 616 617 3 618 619 620 3 621 622 623 3 624 625 626 3 627 628 629 3 630 631 632 3 633 634 635 3 636 637 638 3 639 640 641 3 642 643 644 3 645 646 647 3 648 649 650 3 651 652 653 3 654 655 656 3 657 658 659 3 660 661 662 3 663 664 665 3 666 667 668 3 669 670 671 3 672 673 674 3 675 676 677 3 678 679 680 3 681 682 683 3 684 685 686 3 687 688 689 3 690 691 692 3 693 694 695 3 696 697 698 3 699 700 701 3 702 703 704 3 705 706 707 3 708 709 710 3 711 712 713 3 714 715 716 3 717 718 719 3 720 721 722 3 723 724 725 3 726 727 728 3 729 730 731 3 732 733 734 3 735 736 737 3 738 739 740 3 741 742 743 3 744 745 746 3 747 748 749 3 750 751 752 3 753 754 755 3 756 757 758 3 759 760 761 3 762 763 764 3 765 766 767 3 768 769 770 3 771 772 773 3 774 775 776 3 777 778 779 3 780 781 782 3 783 784 785 3 786 787 788 3 789 790 791 3 792 793 794 3 795 796 797 3 798 799 800 3 801 802 803 3 804 805 806 3 807 808 809 3 810 811 812 3 813 814 815 3 816 817 818 3 819 820 821 3 822 823 824 3 825 826 827 3 828 829 830 3 831 832 833 3 834 835 836 3 837 838 839 3 840 841 842 3 843 844 845 3 846 847 848 3 849 850 851 3 852 853 854 3 855 856 857 3 858 859 860 3 861 862 863 3 864 865 866 3 867 868 869 3 870 871 872 3 873 874 875 3 876 877 878 3 879 880 881 3 882 883 884 3 885 886 887 3 888 889 890 3 891 892 893 3 894 895 896 3 897 898 899 3 900 901 902 3 903 904 905 3 906 907 908 3 909 910 911 3 912 913 914 3 915 916 917 3 918 919 920 3 921 922 923 3 924 925 926 3 927 928 929 3 930 931 932 3 933 934 935 3 936 937 938 3 939 940 941 3 942 943 944 3 945 946 947 3 948 949 950 3 951 952 953 3 954 955 956 3 957 958 959 3 960 961 962 3 963 964 965 3 966 967 968 3 969 970 971 3 972 973 974 3 975 976 977 3 978 979 980 3 981 982 983 3 984 985 986 3 987 988 989 3 990 991 992 3 993 994 995 3 996 997 998 3 999 1000 1001 3 1002 1003 1004 3 1005 1006 1007 3 1008 1009 1010 3 1011 1012 1013 3 1014 1015 1016 3 1017 1018 1019 3 1020 1021 1022 3 1023 1024 1025 3 1026 1027 1028 3 1029 1030 1031 3 1032 1033 1034 3 1035 1036 1037 3 1038 1039 1040 3 1041 1042 1043 3 1044 1045 1046 3 1047 1048 1049 3 1050 1051 1052 3 1053 1054 1055 3 1056 1057 1058 3 1059 1060 1061 3 1062 1063 1064 3 1065 1066 1067 3 1068 1069 1070 3 1071 1072 1073 3 1074 1075 1076 3 1077 1078 1079 3 1080 1081 1082 3 1083 1084 1085 3 1086 1087 1088 3 1089 1090 1091 3 1092 1093 1094 3 1095 1096 1097 3 1098 1099 1100 3 1101 1102 1103 3 1104 1105 1106 3 1107 1108 1109 3 1110 1111 1112 3 1113 1114 1115 3 1116 1117 1118 3 1119 1120 1121 3 1122 1123 1124 3 1125 1126 1127 3 1128 1129 1130 3 1131 1132 1133 3 1134 1135 1136 3 1137 1138 1139 3 1140 1141 1142 3 1143 1144 1145 3 1146 1147 1148 3 1149 1150 1151 3 1152 1153 1154 3 1155 1156 1157 3 1158 1159 1160 3 1161 1162 1163 3 1164 1165 1166 3 1167 1168 1169 3 1170 1171 1172 3 1173 1174 1175 3 1176 1177 1178 3 1179 1180 1181 3 1182 1183 1184 3 1185 1186 1187 3 1188 1189 1190 3 1191 1192 1193 3 1194 1195 1196 3 1197 1198 1199 3 1200 1201 1202 3 1203 1204 1205 3 1206 1207 1208 3 1209 1210 1211 3 1212 1213 1214 3 1215 1216 1217 3 1218 1219 1220 3 1221 1222 1223 3 1224 1225 1226 3 1227 1228 1229 3 1230 1231 1232 3 1233 1234 1235 3 1236 1237 1238 3 1239 1240 1241 3 1242 1243 1244 3 1245 1246 1247 3 1248 1249 1250 3 1251 1252 1253 3 1254 1255 1256 3 1257 1258 1259 3 1260 1261 1262 3 1263 1264 1265 3 1266 1267 1268 3 1269 1270 1271 3 1272 1273 1274 3 1275 1276 1277 3 1278 1279 1280 3 1281 1282 1283 3 1284 1285 1286 3 1287 1288 1289 3 1290 1291 1292 3 1293 1294 1295 3 1296 1297 1298 3 1299 1300 1301 3 1302 1303 1304 3 1305 1306 1307 3 1308 1309 1310 3 1311 1312 1313 3 1314 1315 1316 3 1317 1318 1319 3 1320 1321 1322 3 1323 1324 1325 3 1326 1327 1328 3 1329 1330 1331 3 1332 1333 1334 3 1335 1336 1337 3 1338 1339 1340 3 1341 1342 1343 3 1344 1345 1346 3 1347 1348 1349 3 1350 1351 1352 3 1353 1354 1355 3 1356 1357 1358 3 1359 1360 1361 3 1362 1363 1364 3 1365 1366 1367 3 1368 1369 1370 3 1371 1372 1373 3 1374 1375 1376 3 1377 1378 1379 3 1380 1381 1382 3 1383 1384 1385 3 1386 1387 1388 3 1389 1390 1391 3 1392 1393 1394 3 1395 1396 1397 3 1398 1399 1400 3 1401 1402 1403 3 1404 1405 1406 3 1407 1408 1409 3 1410 1411 1412 3 1413 1414 1415 3 1416 1417 1418 3 1419 1420 1421 3 1422 1423 1424 3 1425 1426 1427 3 1428 1429 1430 3 1431 1432 1433 3 1434 1435 1436 3 1437 1438 1439 3 1440 1441 1442 3 1443 1444 1445 3 1446 1447 1448 3 1449 1450 1451 3 1452 1453 1454 3 1455 1456 1457 3 1458 1459 1460 3 1461 1462 1463 3 1464 1465 1466 3 1467 1468 1469 3 1470 1471 1472 3 1473 1474 1475 3 1476 1477 1478 3 1479 1480 1481 3 1482 1483 1484 3 1485 1486 1487 3 1488 1489 1490 3 1491 1492 1493 3 1494 1495 1496 3 1497 1498 1499 3 1500 1501 1502 3 1503 1504 1505 3 1506 1507 1508 3 1509 1510 1511 3 1512 1513 1514 3 1515 1516 1517 3 1518 1519 1520 3 1521 1522 1523 3 1524 1525 1526 3 1527 1528 1529 3 1530 1531 1532 3 1533 1534 1535 3 1536 1537 1538 3 1539 1540 1541 3 1542 1543 1544 3 1545 1546 1547 3 1548 1549 1550 3 1551 1552 1553 3 1554 1555 1556 3 1557 1558 1559 3 1560 1561 1562 3 1563 1564 1565 3 1566 1567 1568 3 1569 1570 1571 3 1572 1573 1574 3 1573 1575 1574 3 1576 1577 1578 3 1579 1580 1581 opensurgsim-0.7.0/SurgSim/Testing/Data/Geometry/box.ply000066400000000000000000000010531277777236100231030ustar00rootroot00000000000000ply format ascii 1.0 comment Created by Blender 2.69 (sub 0) - www.blender.org, source file: '' element vertex 8 property float x property float y property float z element face 12 property list uchar uint vertex_indices end_header -0.050000 -0.050000 0.050000 -0.050000 0.050000 0.050000 -0.050000 0.050000 -0.050000 0.050000 0.050000 0.050000 0.050000 0.050000 -0.050000 0.050000 -0.050000 0.050000 0.050000 -0.050000 -0.050000 -0.050000 -0.050000 -0.050000 3 0 1 2 3 1 3 4 3 3 5 6 3 0 7 5 3 7 2 4 3 5 3 1 3 7 0 2 3 2 1 4 3 4 3 6 3 5 7 6 3 6 7 4 3 0 5 1 opensurgsim-0.7.0/SurgSim/Testing/Data/Geometry/cube.osgt000066400000000000000000000104611277777236100234040ustar00rootroot00000000000000#Ascii Scene #Version 100 #Generator OpenSceneGraph 3.2.1 osg::Group { UniqueID 1 Name "cube.obj" Children 1 { osg::Geode { UniqueID 2 Name "Cube" Drawables 1 { osg::Geometry { UniqueID 3 DataVariance STATIC StateSet TRUE { osg::StateSet { UniqueID 4 DataVariance STATIC AttributeList 1 { osg::Material { UniqueID 5 Name "Material" Ambient TRUE Front 0 0 0 1 Back 0 0 0 1 Diffuse TRUE Front 0.64 0.64 0.64 1 Back 0.64 0.64 0.64 1 Specular TRUE Front 0.5 0.5 0.5 1 Back 0.5 0.5 0.5 1 Emission TRUE Front 0 0 0 1 Back 0 0 0 1 Shininess TRUE Front 12.288 Back 12.288 } Value OFF } } } PrimitiveSetList 6 { DrawElementsUShort GL_TRIANGLE_STRIP 0 4 { 1 2 0 3 } DrawElementsUShort GL_TRIANGLE_STRIP 0 4 { 7 4 6 5 } DrawElementsUShort GL_TRIANGLE_STRIP 0 4 { 23 20 22 21 } DrawElementsUShort GL_TRIANGLE_STRIP 0 4 { 19 16 18 17 } DrawElementsUShort GL_TRIANGLE_STRIP 0 4 { 13 14 12 15 } DrawElementsUShort GL_TRIANGLE_STRIP 0 4 { 9 10 8 11 } } VertexData { Array TRUE ArrayID 1 Vec3fArray 24 { 0.1 0.1 -0.1 0.1 -0.1 -0.1 -0.1 -0.1 -0.1 -0.1 0.1 -0.1 0.1 0.0999999 0.1 -0.1 0.1 0.1 -0.1 -0.1 0.1 0.0999999 -0.1 0.1 0.1 0.1 -0.1 0.1 0.0999999 0.1 0.0999999 -0.1 0.1 0.1 -0.1 -0.1 0.1 -0.1 -0.1 0.0999999 -0.1 0.1 -0.1 -0.1 0.1 -0.1 -0.1 -0.1 -0.1 -0.1 -0.1 -0.1 -0.1 0.1 -0.1 0.1 0.1 -0.1 0.1 -0.1 0.1 0.0999999 0.1 0.1 0.1 -0.1 -0.1 0.1 -0.1 -0.1 0.1 0.1 } Indices FALSE Binding BIND_PER_VERTEX Normalize 0 } NormalData { Array TRUE ArrayID 2 Vec3fArray 24 { 0 -0 -1 0 -0 -1 0 -0 -1 0 -0 -1 0 -0 1 0 -0 1 0 -0 1 0 -0 1 1 -0 0 1 -0 0 1 -0 0 1 -0 0 -0 -1 -0 -0 -1 -0 -0 -1 -0 -0 -1 -0 -1 0 -0 -1 0 -0 -1 0 -0 -1 0 -0 0 1 0 0 1 0 0 1 0 0 1 0 } Indices FALSE Binding BIND_PER_VERTEX Normalize 0 } ColorData { Array TRUE ArrayID 3 Vec4fArray 1 { 1 1 1 1 } Indices FALSE Binding BIND_OVERALL Normalize 0 } TexCoordData 1 { Data { Array TRUE ArrayID 4 Vec2fArray 24 { 0.9999 0.9999 0.0001 0.9999 0.0001 0.0001 0.9999 0.0001 0.9999 0.9999 0.0001 0.9999 0.0001 0.0001 0.9999 0.0001 0.9999 0.0001 0.9999 0.9999 0.0001 0.9999 0.0001 0.0001 0.9999 0.0001 0.9999 0.9999 0.0001 0.9999 0.0001 0.0001 0.0001 0.9999 0.0001 0.0001 0.9999 0.0001 0.9999 0.9999 0.9999 0.0001 0.9999 0.9999 0.0001 0.9999 0.0001 0.0001 } Indices FALSE Binding BIND_PER_VERTEX Normalize 0 } } } } } } } opensurgsim-0.7.0/SurgSim/Testing/Data/Geometry/invalid-staple.ply000066400000000000000000000025161277777236100252340ustar00rootroot000000000000007 11 1 -0.001 -0.001 -0.001 0.00532899983227 -0.000403999991249 0.000403999991249 -0.00207699998282 0.00480100000277 -0.00532899983227 -0.000576999982819 -0.00482899983227 9.60000087507e-05 0.000423000017181 -0.00482899983227 9.60000087507e-05 0.00142300001718 -0.00482899983227 9.60000087507e-05 0.00242300001718 -0.00482899983227 9.60000087507e-05 0.00342300001718 -0.00482899983227 9.60000087507e-05 -0.00157699998282 -0.00382899983227 9.60000087507e-05 0.00442300001718 -0.00382899983227 9.60000087507e-05 -0.00157699998282 -0.00282899983227 9.60000087507e-05 0.00442300001718 -0.00282899983227 9.60000087507e-05 -0.00157699998282 -0.00182899983227 9.60000087507e-05 0.00442300001718 -0.00182899983227 9.60000087507e-05 -0.00157699998282 -0.000828999832273 9.60000087507e-05 -0.00157699998282 0.000171000167727 9.60000087507e-05 -0.00157699998282 0.00117100016773 9.60000087507e-05 -0.00157699998282 0.00217100016773 9.60000087507e-05 0.00442300001718 0.00217100016773 9.60000087507e-05 -0.00157699998282 0.00317100016773 9.60000087507e-05 0.00442300001718 0.00317100016773 9.60000087507e-05 -0.00157699998282 0.00417100016773 9.60000087507e-05 0.00442300001718 0.00417100016773 9.60000087507e-05 0.000423000017181 0.00517100016773 9.60000087507e-05 0.00142300001718 0.00517100016773 9.60000087507e-05 0.00242300001718 0.00517100016773 9.60000087507e-05 opensurgsim-0.7.0/SurgSim/Testing/Data/Geometry/plane.ply000066400000000000000000000036721277777236100234230ustar00rootroot00000000000000ply format ascii 1.0 comment Created by Blender 2.71 (sub 0) - www.blender.org, source file: '' element vertex 25 property float x property float y property float z property float nx property float ny property float nz element face 32 property list uchar uint vertex_indices end_header 1.000000 0.000000 0.000000 -0.000000 0.000000 1.000000 1.000000 0.500000 0.000000 -0.000000 0.000000 1.000000 0.500000 0.500000 0.000000 -0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 -0.000000 0.000000 1.000000 0.000000 0.500000 0.000000 -0.000000 0.000000 1.000000 -0.500000 0.500000 0.000000 -0.000000 0.000000 1.000000 0.000000 -1.000000 0.000000 -0.000000 0.000000 1.000000 0.000000 -0.500000 0.000000 -0.000000 0.000000 1.000000 -0.500000 -0.500000 0.000000 -0.000000 0.000000 1.000000 1.000000 -1.000000 0.000000 -0.000000 0.000000 1.000000 1.000000 -0.500000 0.000000 -0.000000 0.000000 1.000000 0.500000 -0.500000 0.000000 -0.000000 0.000000 1.000000 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 -1.000000 0.500000 0.000000 0.000000 0.000000 1.000000 -1.000000 -1.000000 0.000000 0.000000 0.000000 1.000000 -0.500000 -1.000000 0.000000 0.000000 0.000000 1.000000 -1.000000 -0.500000 0.000000 0.000000 0.000000 1.000000 0.500000 -1.000000 0.000000 0.000000 0.000000 1.000000 0.500000 1.000000 0.000000 -0.000000 0.000000 1.000000 0.000000 1.000000 0.000000 -0.000000 0.000000 1.000000 1.000000 1.000000 0.000000 -0.000000 0.000000 1.000000 -0.500000 1.000000 0.000000 -0.000000 0.000000 1.000000 -1.000000 1.000000 0.000000 -0.000000 0.000000 1.000000 3 0 1 2 3 3 4 5 3 6 7 8 3 9 10 11 3 3 12 4 3 13 14 15 3 16 17 18 3 6 19 7 3 2 20 21 3 2 1 20 3 1 22 20 3 5 23 24 3 5 4 23 3 4 21 23 3 8 14 13 3 8 7 14 3 7 3 14 3 11 12 3 3 11 10 12 3 10 0 12 3 4 2 21 3 4 12 2 3 12 0 2 3 15 5 24 3 15 14 5 3 14 3 5 3 18 8 13 3 18 17 8 3 17 6 8 3 7 11 3 3 7 19 11 3 19 9 11 opensurgsim-0.7.0/SurgSim/Testing/Data/Geometry/sphere.ply000066400000000000000000001057301277777236100236100ustar00rootroot00000000000000ply format ascii 1.0 comment Created by Blender 2.69 (sub 0) - www.blender.org, source file: '' element vertex 642 property float x property float y property float z element face 1280 property list uchar uint vertex_indices end_header 0.000000 0.000000 -0.050000 0.004824 -0.003504 -0.049643 -0.001842 -0.005670 -0.049643 0.036180 -0.026286 -0.022361 0.033765 -0.024531 -0.027534 0.038589 -0.021027 -0.023849 -0.005962 0.000000 -0.049643 -0.001842 0.005670 -0.049643 0.004824 0.003504 -0.049643 0.039727 -0.024531 -0.017887 -0.013819 -0.042532 -0.022361 -0.008073 -0.043198 -0.023849 -0.011054 -0.045364 -0.017887 -0.044721 0.000000 -0.022361 -0.043578 -0.005670 -0.023849 -0.046559 -0.003504 -0.017887 -0.013819 0.042532 -0.022361 -0.018859 0.039693 -0.023849 -0.017720 0.043198 -0.017887 0.036180 0.026286 -0.022361 0.031923 0.030202 -0.023849 0.035608 0.030202 -0.017887 0.035608 -0.030202 -0.017887 -0.017720 -0.043198 -0.017887 -0.046559 0.003504 -0.017887 -0.011054 0.045364 -0.017887 0.039727 0.024531 -0.017887 0.013819 -0.042532 0.022361 0.018859 -0.039693 0.023849 0.012897 -0.039693 0.027534 -0.036180 -0.026286 0.022361 -0.031923 -0.030202 0.023849 -0.033765 -0.024531 0.027534 -0.036180 0.026286 0.022361 -0.038589 0.021027 0.023849 -0.033765 0.024531 0.027534 0.013819 0.042532 0.022361 0.008073 0.043198 0.023849 0.012897 0.039693 0.027534 0.044721 0.000000 0.022361 0.043578 0.005670 0.023849 0.041736 0.000000 0.027534 -0.012897 -0.039693 -0.027534 -0.011641 -0.035828 -0.032876 -0.006634 -0.039956 -0.029317 -0.010034 -0.030883 -0.038020 -0.004896 -0.035539 -0.034828 -0.008123 -0.025000 -0.042533 -0.002912 -0.029955 -0.039928 -0.006021 -0.018530 -0.046048 -0.000805 -0.023468 -0.044143 -0.003880 -0.011943 -0.048397 0.001270 -0.016561 -0.047160 0.003174 -0.009769 -0.048934 -0.001482 -0.043209 -0.025115 0.000485 -0.039449 -0.030717 0.005728 -0.042336 -0.025979 0.002640 -0.034409 -0.036181 0.008123 -0.037973 -0.031497 0.013143 -0.040451 -0.026287 0.004839 -0.028212 -0.040996 0.010504 -0.032329 -0.036668 0.015749 -0.035495 -0.031497 0.020250 -0.037617 -0.025979 0.006910 -0.021266 -0.044721 0.012668 -0.025668 -0.040996 0.018090 -0.029389 -0.036181 0.022795 -0.032200 -0.030717 0.026597 -0.034086 -0.025115 0.008707 -0.014145 -0.047160 0.014446 -0.018513 -0.044143 0.019964 -0.022522 -0.039928 0.024851 -0.025874 -0.034828 0.028853 -0.028426 -0.029317 0.031923 -0.030202 -0.023849 0.010159 -0.007381 -0.048397 0.015763 -0.011452 -0.046048 0.021266 -0.015451 -0.042533 0.026271 -0.019087 -0.038020 0.030477 -0.022143 -0.032876 0.038589 0.021027 -0.023849 0.033765 0.024531 -0.027534 0.040636 0.014762 -0.025115 0.035951 0.018657 -0.029317 0.042034 0.007635 -0.025979 0.037668 0.011729 -0.030717 0.042532 -0.000000 -0.026287 0.038625 0.004009 -0.031497 0.042034 -0.007635 -0.025979 0.038625 -0.004009 -0.031497 0.040636 -0.014762 -0.025115 0.037668 -0.011729 -0.030717 0.035951 -0.018657 -0.029317 0.030477 0.022143 -0.032876 0.032287 0.015638 -0.034828 0.026271 0.019087 -0.038020 0.033541 0.008123 -0.036181 0.027589 0.012027 -0.039928 0.021266 0.015451 -0.042533 0.033992 -0.000000 -0.036668 0.028327 0.004116 -0.040996 0.022071 0.008018 -0.044143 0.015763 0.011452 -0.046048 0.033541 -0.008123 -0.036180 0.028327 -0.004116 -0.040996 0.022361 -0.000000 -0.044721 0.016143 0.003910 -0.047160 0.010159 0.007381 -0.048397 0.032287 -0.015638 -0.034828 0.027589 -0.012027 -0.039927 0.022071 -0.008018 -0.044143 0.016143 -0.003910 -0.047160 0.010272 -0.000000 -0.048934 -0.041736 0.000000 -0.027534 -0.037672 0.000000 -0.032876 -0.040051 -0.006037 -0.029317 -0.032473 0.000000 -0.038020 -0.035313 -0.006326 -0.034828 -0.026286 0.000000 -0.042533 -0.029389 -0.006487 -0.039927 -0.019484 0.000000 -0.046048 -0.022569 -0.006487 -0.044143 -0.012557 0.000000 -0.048397 -0.015358 -0.006326 -0.047160 -0.008310 -0.006038 -0.048934 -0.041553 -0.011943 -0.025115 -0.037368 -0.012652 -0.030717 -0.038494 -0.018530 -0.025979 -0.031910 -0.013143 -0.036180 -0.033604 -0.019460 -0.031497 -0.034409 -0.025000 -0.026287 -0.025336 -0.013320 -0.040996 -0.027500 -0.019980 -0.036668 -0.028892 -0.025946 -0.031497 -0.029518 -0.030883 -0.025979 -0.018090 -0.013143 -0.044721 -0.020498 -0.019980 -0.040996 -0.022361 -0.026286 -0.036181 -0.023580 -0.031630 -0.030717 -0.024199 -0.035828 -0.025115 -0.010762 -0.012652 -0.047160 -0.013143 -0.019460 -0.044143 -0.015251 -0.025946 -0.039928 -0.016928 -0.031630 -0.034828 -0.018118 -0.036225 -0.029317 -0.018859 -0.039693 -0.023849 -0.012897 0.039693 -0.027534 -0.011641 0.035828 -0.032876 -0.018118 0.036225 -0.029317 -0.010034 0.030883 -0.038020 -0.016928 0.031630 -0.034828 -0.008123 0.025000 -0.042533 -0.015251 0.025946 -0.039928 -0.006021 0.018530 -0.046048 -0.013143 0.019460 -0.044143 -0.003880 0.011943 -0.048397 -0.010762 0.012652 -0.047160 -0.008310 0.006037 -0.048934 -0.024199 0.035828 -0.025115 -0.023580 0.031630 -0.030717 -0.029518 0.030883 -0.025979 -0.022361 0.026286 -0.036181 -0.028892 0.025946 -0.031497 -0.034409 0.025000 -0.026287 -0.020498 0.019980 -0.040996 -0.027500 0.019980 -0.036668 -0.033604 0.019460 -0.031497 -0.038494 0.018530 -0.025979 -0.018090 0.013143 -0.044721 -0.025336 0.013320 -0.040996 -0.031910 0.013143 -0.036180 -0.037368 0.012652 -0.030717 -0.041553 0.011943 -0.025115 -0.015358 0.006326 -0.047160 -0.022569 0.006487 -0.044143 -0.029389 0.006487 -0.039927 -0.035313 0.006326 -0.034828 -0.040051 0.006037 -0.029317 -0.043578 0.005670 -0.023849 0.028853 0.028426 -0.029317 0.024850 0.025874 -0.034828 0.019964 0.022522 -0.039928 0.014446 0.018513 -0.044143 0.008707 0.014145 -0.047160 0.003174 0.009769 -0.048934 0.026597 0.034086 -0.025115 0.022795 0.032200 -0.030717 0.020250 0.037617 -0.025979 0.018090 0.029389 -0.036181 0.015749 0.035495 -0.031497 0.013143 0.040451 -0.026287 0.012668 0.025669 -0.040996 0.010504 0.032329 -0.036668 0.008123 0.037973 -0.031497 0.005728 0.042336 -0.025979 0.006910 0.021266 -0.044721 0.004839 0.028212 -0.040996 0.002639 0.034409 -0.036181 0.000485 0.039449 -0.030717 -0.001482 0.043209 -0.025115 0.001270 0.016561 -0.047160 -0.000805 0.023469 -0.044143 -0.002913 0.029955 -0.039928 -0.004896 0.035539 -0.034828 -0.006634 0.039956 -0.029317 -0.008073 0.043198 -0.023849 0.046559 -0.003504 0.017887 0.046559 0.003504 0.017887 0.047831 -0.007381 0.012557 0.048361 0.000000 0.012697 0.048236 -0.011452 0.006495 0.049401 -0.003910 0.006652 0.047553 -0.015451 0.000000 0.049353 -0.008018 0.000000 0.045755 -0.019087 -0.006495 0.048050 -0.012027 -0.006820 0.043035 -0.022143 -0.012558 0.045590 -0.015638 -0.013303 0.042299 -0.018657 -0.019045 0.047831 0.007381 0.012557 0.049401 0.003910 0.006652 0.048236 0.011452 0.006495 0.050000 -0.000000 0.000000 0.049353 0.008018 -0.000000 0.047553 0.015451 -0.000000 0.049336 -0.004116 -0.007003 0.049336 0.004116 -0.007003 0.048050 0.012027 -0.006820 0.045755 0.019087 -0.006495 0.047361 -0.008123 -0.013820 0.047998 -0.000000 -0.014006 0.047361 0.008123 -0.013820 0.045590 0.015638 -0.013303 0.043035 0.022143 -0.012558 0.044320 -0.011729 -0.019955 0.045445 -0.004009 -0.020461 0.045445 0.004009 -0.020461 0.044320 0.011729 -0.019955 0.042299 0.018657 -0.019045 0.011054 -0.045364 0.017887 0.017720 -0.043198 0.017887 0.007761 -0.047771 0.012558 0.014944 -0.045994 0.012697 0.004014 -0.049414 0.006495 0.011547 -0.048191 0.006652 0.000000 -0.050000 0.000000 0.007625 -0.049415 0.000000 -0.004014 -0.049414 -0.006495 0.003410 -0.049415 -0.006821 -0.007761 -0.047771 -0.012558 -0.000785 -0.048191 -0.013303 -0.004673 -0.045994 -0.019045 0.021800 -0.043209 0.012558 0.018984 -0.045775 0.006652 0.025797 -0.042336 0.006495 0.015451 -0.047553 -0.000000 0.022876 -0.044460 -0.000000 0.029389 -0.040451 -0.000000 0.011331 -0.048193 -0.007003 0.019160 -0.045649 -0.007003 0.026287 -0.041982 -0.006821 0.032292 -0.037617 -0.006495 0.006910 -0.047553 -0.013820 0.014832 -0.045649 -0.014006 0.022361 -0.042532 -0.013820 0.028961 -0.038526 -0.013303 0.034358 -0.034086 -0.012558 0.002541 -0.045775 -0.019955 0.010231 -0.044460 -0.020462 0.017856 -0.041982 -0.020462 0.024851 -0.038526 -0.019955 0.030815 -0.034463 -0.019045 -0.039727 -0.024531 0.017887 -0.035608 -0.030202 0.017887 -0.043035 -0.022143 0.012558 -0.039125 -0.028426 0.012697 -0.045755 -0.019087 0.006495 -0.042264 -0.025874 0.006652 -0.047553 -0.015451 0.000000 -0.044640 -0.022522 0.000000 -0.048236 -0.011452 -0.006495 -0.045943 -0.018513 -0.006820 -0.047831 -0.007381 -0.012557 -0.046075 -0.014145 -0.013303 -0.045187 -0.009769 -0.019045 -0.034358 -0.034086 0.012558 -0.037668 -0.032200 0.006652 -0.032292 -0.037617 0.006495 -0.040451 -0.029389 -0.000000 -0.035215 -0.035495 -0.000000 -0.029389 -0.040451 -0.000000 -0.042333 -0.025669 -0.007003 -0.037494 -0.032329 -0.007003 -0.031804 -0.037973 -0.006821 -0.025797 -0.042336 -0.006495 -0.043090 -0.021266 -0.013820 -0.038831 -0.028213 -0.014006 -0.033541 -0.034410 -0.013820 -0.027691 -0.039449 -0.013303 -0.021800 -0.043209 -0.012558 -0.042750 -0.016562 -0.019955 -0.039122 -0.023469 -0.020461 -0.034409 -0.029955 -0.020461 -0.028961 -0.035539 -0.019955 -0.023254 -0.039957 -0.019045 -0.035608 0.030202 0.017887 -0.039727 0.024531 0.017887 -0.034358 0.034086 0.012558 -0.039125 0.028426 0.012697 -0.032292 0.037617 0.006495 -0.037668 0.032200 0.006652 -0.029389 0.040451 0.000000 -0.035215 0.035495 0.000000 -0.025797 0.042336 -0.006495 -0.031804 0.037973 -0.006821 -0.021800 0.043209 -0.012558 -0.027691 0.039449 -0.013303 -0.023254 0.039957 -0.019045 -0.043035 0.022143 0.012558 -0.042264 0.025874 0.006652 -0.045755 0.019087 0.006495 -0.040451 0.029389 0.000000 -0.044640 0.022522 -0.000000 -0.047553 0.015451 -0.000000 -0.037494 0.032329 -0.007003 -0.042333 0.025669 -0.007003 -0.045943 0.018513 -0.006820 -0.048236 0.011452 -0.006495 -0.033541 0.034410 -0.013820 -0.038831 0.028213 -0.014006 -0.043090 0.021266 -0.013820 -0.046075 0.014145 -0.013303 -0.047831 0.007381 -0.012557 -0.028961 0.035539 -0.019955 -0.034409 0.029955 -0.020461 -0.039122 0.023469 -0.020461 -0.042750 0.016562 -0.019955 -0.045187 0.009769 -0.019045 0.017720 0.043198 0.017887 0.011054 0.045364 0.017887 0.021800 0.043209 0.012558 0.014944 0.045994 0.012697 0.025797 0.042336 0.006495 0.018984 0.045775 0.006652 0.029389 0.040451 0.000000 0.022876 0.044460 0.000000 0.032292 0.037617 -0.006495 0.026287 0.041982 -0.006821 0.034358 0.034086 -0.012558 0.028961 0.038526 -0.013303 0.030815 0.034463 -0.019045 0.007761 0.047771 0.012558 0.011547 0.048191 0.006652 0.004014 0.049414 0.006495 0.015451 0.047553 0.000000 0.007625 0.049415 -0.000000 -0.000000 0.050000 -0.000000 0.019160 0.045649 -0.007003 0.011331 0.048193 -0.007003 0.003410 0.049415 -0.006821 -0.004014 0.049414 -0.006495 0.022361 0.042532 -0.013820 0.014832 0.045649 -0.014006 0.006910 0.047553 -0.013820 -0.000785 0.048191 -0.013303 -0.007761 0.047771 -0.012558 0.024851 0.038526 -0.019955 0.017856 0.041982 -0.020462 0.010231 0.044460 -0.020462 0.002541 0.045775 -0.019955 -0.004673 0.045994 -0.019045 0.023254 -0.039957 0.019045 0.027691 -0.039449 0.013303 0.031804 -0.037973 0.006820 0.035215 -0.035495 -0.000000 0.037668 -0.032200 -0.006652 0.039125 -0.028426 -0.012697 0.024199 -0.035828 0.025115 0.028961 -0.035539 0.019955 0.029518 -0.030883 0.025979 0.033541 -0.034409 0.013820 0.034410 -0.029955 0.020461 0.034409 -0.025000 0.026287 0.037494 -0.032329 0.007003 0.038831 -0.028213 0.014006 0.039122 -0.023469 0.020461 0.038494 -0.018530 0.025979 0.040451 -0.029389 -0.000000 0.042333 -0.025669 0.007003 0.043090 -0.021266 0.013820 0.042750 -0.016561 0.019955 0.041553 -0.011943 0.025115 0.042264 -0.025874 -0.006652 0.044640 -0.022522 -0.000000 0.045943 -0.018513 0.006820 0.046075 -0.014145 0.013303 0.045187 -0.009769 0.019045 0.043578 -0.005670 0.023849 -0.030815 -0.034463 0.019045 -0.028961 -0.038526 0.013303 -0.026287 -0.041982 0.006820 -0.022876 -0.044460 -0.000000 -0.018984 -0.045775 -0.006652 -0.014944 -0.045994 -0.012697 -0.026597 -0.034086 0.025115 -0.024851 -0.038526 0.019955 -0.020250 -0.037617 0.025979 -0.022361 -0.042532 0.013820 -0.017856 -0.041982 0.020461 -0.013143 -0.040451 0.026287 -0.019160 -0.045649 0.007003 -0.014832 -0.045649 0.014006 -0.010231 -0.044460 0.020461 -0.005728 -0.042336 0.025979 -0.015451 -0.047553 -0.000000 -0.011331 -0.048193 0.007003 -0.006910 -0.047553 0.013820 -0.002541 -0.045775 0.019955 0.001482 -0.043209 0.025115 -0.011547 -0.048191 -0.006652 -0.007625 -0.049415 -0.000000 -0.003410 -0.049415 0.006820 0.000785 -0.048191 0.013303 0.004673 -0.045994 0.019045 0.008073 -0.043198 0.023849 -0.042299 0.018657 0.019045 -0.045590 0.015638 0.013303 -0.048050 0.012027 0.006820 -0.049353 0.008018 0.000000 -0.049401 0.003910 -0.006652 -0.048361 -0.000000 -0.012697 -0.040636 0.014762 0.025115 -0.044320 0.011729 0.019955 -0.042034 0.007635 0.025979 -0.047361 0.008123 0.013820 -0.045445 0.004009 0.020461 -0.042532 0.000000 0.026287 -0.049336 0.004116 0.007003 -0.047998 -0.000000 0.014006 -0.045445 -0.004009 0.020461 -0.042034 -0.007635 0.025979 -0.050000 -0.000000 0.000000 -0.049336 -0.004116 0.007003 -0.047361 -0.008123 0.013820 -0.044320 -0.011729 0.019955 -0.040636 -0.014762 0.025115 -0.049401 -0.003910 -0.006652 -0.049353 -0.008018 0.000000 -0.048050 -0.012027 0.006821 -0.045590 -0.015638 0.013303 -0.042299 -0.018657 0.019045 -0.038589 -0.021027 0.023849 0.004673 0.045994 0.019045 0.000785 0.048191 0.013303 -0.003410 0.049415 0.006821 -0.007625 0.049415 -0.000000 -0.011547 0.048191 -0.006652 -0.014944 0.045994 -0.012697 0.001482 0.043209 0.025115 -0.002541 0.045775 0.019955 -0.005728 0.042336 0.025979 -0.006910 0.047553 0.013820 -0.010231 0.044460 0.020462 -0.013143 0.040451 0.026287 -0.011331 0.048193 0.007003 -0.014832 0.045649 0.014006 -0.017856 0.041982 0.020462 -0.020250 0.037617 0.025979 -0.015451 0.047553 -0.000000 -0.019160 0.045649 0.007003 -0.022361 0.042532 0.013820 -0.024851 0.038526 0.019955 -0.026597 0.034086 0.025115 -0.018984 0.045775 -0.006652 -0.022876 0.044460 -0.000000 -0.026287 0.041982 0.006821 -0.028961 0.038526 0.013303 -0.030815 0.034463 0.019045 -0.031923 0.030202 0.023849 0.045187 0.009769 0.019045 0.046075 0.014145 0.013303 0.045943 0.018513 0.006820 0.044640 0.022522 -0.000000 0.042265 0.025874 -0.006652 0.039125 0.028426 -0.012697 0.041553 0.011943 0.025115 0.042750 0.016561 0.019955 0.038494 0.018530 0.025979 0.043090 0.021266 0.013820 0.039122 0.023469 0.020461 0.034409 0.025000 0.026287 0.042333 0.025669 0.007003 0.038832 0.028213 0.014006 0.034410 0.029955 0.020461 0.029518 0.030883 0.025979 0.040451 0.029389 -0.000000 0.037494 0.032329 0.007003 0.033541 0.034409 0.013820 0.028961 0.035539 0.019955 0.024199 0.035828 0.025115 0.037668 0.032200 -0.006652 0.035215 0.035495 0.000000 0.031804 0.037973 0.006821 0.027691 0.039449 0.013303 0.023254 0.039957 0.019045 0.018859 0.039693 0.023849 0.001842 -0.005670 0.049643 0.005962 0.000000 0.049643 0.000000 0.000000 0.050000 0.003880 -0.011943 0.048397 0.008310 -0.006037 0.048934 0.006021 -0.018530 0.046048 0.010762 -0.012652 0.047160 0.008123 -0.025000 0.042533 0.013143 -0.019460 0.044143 0.010034 -0.030883 0.038020 0.015251 -0.025946 0.039928 0.011641 -0.035828 0.032876 0.016928 -0.031630 0.034828 0.018118 -0.036225 0.029317 0.012557 0.000000 0.048397 0.015358 -0.006326 0.047160 0.019484 0.000000 0.046048 0.018090 -0.013143 0.044721 0.022569 -0.006487 0.044143 0.026286 0.000000 0.042533 0.020498 -0.019980 0.040996 0.025336 -0.013320 0.040996 0.029389 -0.006487 0.039927 0.032473 0.000000 0.038020 0.022360 -0.026286 0.036181 0.027500 -0.019980 0.036668 0.031910 -0.013143 0.036181 0.035313 -0.006326 0.034828 0.037672 0.000000 0.032876 0.023580 -0.031630 0.030717 0.028892 -0.025946 0.031497 0.033604 -0.019460 0.031497 0.037368 -0.012652 0.030717 0.040051 -0.006038 0.029317 -0.004824 -0.003504 0.049643 -0.010159 -0.007381 0.048397 -0.003174 -0.009769 0.048934 -0.015763 -0.011452 0.046048 -0.008707 -0.014145 0.047160 -0.021266 -0.015451 0.042533 -0.014446 -0.018513 0.044143 -0.026271 -0.019087 0.038020 -0.019964 -0.022522 0.039928 -0.030477 -0.022143 0.032876 -0.024850 -0.025874 0.034828 -0.028853 -0.028426 0.029317 -0.001270 -0.016561 0.047160 -0.006910 -0.021266 0.044721 0.000805 -0.023468 0.044143 -0.012668 -0.025668 0.040996 -0.004839 -0.028212 0.040996 0.002912 -0.029955 0.039928 -0.018090 -0.029389 0.036181 -0.010504 -0.032329 0.036668 -0.002639 -0.034409 0.036181 0.004896 -0.035539 0.034828 -0.022795 -0.032200 0.030717 -0.015749 -0.035495 0.031497 -0.008123 -0.037973 0.031497 -0.000485 -0.039449 0.030717 0.006634 -0.039956 0.029317 -0.004824 0.003504 0.049643 -0.010159 0.007381 0.048397 -0.010272 0.000000 0.048934 -0.015763 0.011452 0.046048 -0.016143 0.003910 0.047160 -0.021266 0.015451 0.042533 -0.022071 0.008018 0.044143 -0.026271 0.019087 0.038020 -0.027589 0.012027 0.039928 -0.030477 0.022143 0.032876 -0.032287 0.015638 0.034828 -0.035951 0.018657 0.029317 -0.016143 -0.003910 0.047160 -0.022360 0.000000 0.044721 -0.022071 -0.008018 0.044143 -0.028327 0.004116 0.040996 -0.028327 -0.004116 0.040996 -0.027589 -0.012027 0.039928 -0.033541 0.008123 0.036181 -0.033992 0.000000 0.036668 -0.033541 -0.008123 0.036181 -0.032287 -0.015638 0.034828 -0.037668 0.011729 0.030717 -0.038625 0.004009 0.031497 -0.038625 -0.004009 0.031497 -0.037668 -0.011729 0.030717 -0.035951 -0.018657 0.029317 0.001842 0.005670 0.049643 0.003880 0.011943 0.048397 -0.003174 0.009769 0.048934 0.006021 0.018530 0.046048 -0.001270 0.016561 0.047160 0.008123 0.025000 0.042533 0.000805 0.023468 0.044143 0.010034 0.030883 0.038020 0.002912 0.029955 0.039928 0.011641 0.035828 0.032876 0.004896 0.035539 0.034828 0.006634 0.039956 0.029317 -0.008707 0.014145 0.047160 -0.006910 0.021266 0.044721 -0.014446 0.018513 0.044143 -0.004839 0.028212 0.040996 -0.012668 0.025668 0.040996 -0.019964 0.022522 0.039928 -0.002639 0.034409 0.036181 -0.010504 0.032329 0.036668 -0.018090 0.029389 0.036181 -0.024850 0.025874 0.034828 -0.000485 0.039449 0.030717 -0.008123 0.037973 0.031497 -0.015749 0.035495 0.031497 -0.022795 0.032200 0.030717 -0.028853 0.028426 0.029317 0.008310 0.006037 0.048934 0.015358 0.006326 0.047160 0.022569 0.006487 0.044143 0.029389 0.006487 0.039927 0.035313 0.006326 0.034828 0.040051 0.006038 0.029317 0.010762 0.012652 0.047160 0.018090 0.013143 0.044721 0.013143 0.019460 0.044143 0.025336 0.013320 0.040996 0.020498 0.019980 0.040996 0.015251 0.025946 0.039928 0.031910 0.013143 0.036181 0.027500 0.019980 0.036668 0.022360 0.026286 0.036181 0.016928 0.031630 0.034828 0.037368 0.012652 0.030717 0.033604 0.019460 0.031497 0.028892 0.025946 0.031497 0.023580 0.031630 0.030717 0.018118 0.036225 0.029317 3 0 1 2 3 3 4 5 3 0 2 6 3 0 6 7 3 0 7 8 3 3 5 9 3 10 11 12 3 13 14 15 3 16 17 18 3 19 20 21 3 3 9 22 3 10 12 23 3 13 15 24 3 16 18 25 3 19 21 26 3 27 28 29 3 30 31 32 3 33 34 35 3 36 37 38 3 39 40 41 3 42 11 10 3 43 44 42 3 45 46 43 3 47 48 45 3 49 50 47 3 51 52 49 3 2 53 51 3 42 44 11 3 44 54 11 3 43 46 44 3 46 55 44 3 44 55 54 3 55 56 54 3 45 48 46 3 48 57 46 3 46 57 55 3 57 58 55 3 55 58 56 3 58 59 56 3 47 50 48 3 50 60 48 3 48 60 57 3 60 61 57 3 57 61 58 3 61 62 58 3 58 62 59 3 62 63 59 3 49 52 50 3 52 64 50 3 50 64 60 3 64 65 60 3 60 65 61 3 65 66 61 3 61 66 62 3 66 67 62 3 62 67 63 3 67 68 63 3 51 53 52 3 53 69 52 3 52 69 64 3 69 70 64 3 64 70 65 3 70 71 65 3 65 71 66 3 71 72 66 3 66 72 67 3 72 73 67 3 67 73 68 3 73 74 68 3 2 1 53 3 1 75 53 3 53 75 69 3 75 76 69 3 69 76 70 3 76 77 70 3 70 77 71 3 77 78 71 3 71 78 72 3 78 79 72 3 72 79 73 3 79 4 73 3 73 4 74 3 4 3 74 3 80 81 19 3 82 83 80 3 84 85 82 3 86 87 84 3 88 89 86 3 90 91 88 3 5 92 90 3 80 83 81 3 83 93 81 3 82 85 83 3 85 94 83 3 83 94 93 3 94 95 93 3 84 87 85 3 87 96 85 3 85 96 94 3 96 97 94 3 94 97 95 3 97 98 95 3 86 89 87 3 89 99 87 3 87 99 96 3 99 100 96 3 96 100 97 3 100 101 97 3 97 101 98 3 101 102 98 3 88 91 89 3 91 103 89 3 89 103 99 3 103 104 99 3 99 104 100 3 104 105 100 3 100 105 101 3 105 106 101 3 101 106 102 3 106 107 102 3 90 92 91 3 92 108 91 3 91 108 103 3 108 109 103 3 103 109 104 3 109 110 104 3 104 110 105 3 110 111 105 3 105 111 106 3 111 112 106 3 106 112 107 3 112 8 107 3 5 4 92 3 4 79 92 3 92 79 108 3 79 78 108 3 108 78 109 3 78 77 109 3 109 77 110 3 77 76 110 3 110 76 111 3 76 75 111 3 111 75 112 3 75 1 112 3 112 1 8 3 1 0 8 3 113 14 13 3 114 115 113 3 116 117 114 3 118 119 116 3 120 121 118 3 122 123 120 3 6 124 122 3 113 115 14 3 115 125 14 3 114 117 115 3 117 126 115 3 115 126 125 3 126 127 125 3 116 119 117 3 119 128 117 3 117 128 126 3 128 129 126 3 126 129 127 3 129 130 127 3 118 121 119 3 121 131 119 3 119 131 128 3 131 132 128 3 128 132 129 3 132 133 129 3 129 133 130 3 133 134 130 3 120 123 121 3 123 135 121 3 121 135 131 3 135 136 131 3 131 136 132 3 136 137 132 3 132 137 133 3 137 138 133 3 133 138 134 3 138 139 134 3 122 124 123 3 124 140 123 3 123 140 135 3 140 141 135 3 135 141 136 3 141 142 136 3 136 142 137 3 142 143 137 3 137 143 138 3 143 144 138 3 138 144 139 3 144 145 139 3 6 2 124 3 2 51 124 3 124 51 140 3 51 49 140 3 140 49 141 3 49 47 141 3 141 47 142 3 47 45 142 3 142 45 143 3 45 43 143 3 143 43 144 3 43 42 144 3 144 42 145 3 42 10 145 3 146 17 16 3 147 148 146 3 149 150 147 3 151 152 149 3 153 154 151 3 155 156 153 3 7 157 155 3 146 148 17 3 148 158 17 3 147 150 148 3 150 159 148 3 148 159 158 3 159 160 158 3 149 152 150 3 152 161 150 3 150 161 159 3 161 162 159 3 159 162 160 3 162 163 160 3 151 154 152 3 154 164 152 3 152 164 161 3 164 165 161 3 161 165 162 3 165 166 162 3 162 166 163 3 166 167 163 3 153 156 154 3 156 168 154 3 154 168 164 3 168 169 164 3 164 169 165 3 169 170 165 3 165 170 166 3 170 171 166 3 166 171 167 3 171 172 167 3 155 157 156 3 157 173 156 3 156 173 168 3 173 174 168 3 168 174 169 3 174 175 169 3 169 175 170 3 175 176 170 3 170 176 171 3 176 177 171 3 171 177 172 3 177 178 172 3 7 6 157 3 6 122 157 3 157 122 173 3 122 120 173 3 173 120 174 3 120 118 174 3 174 118 175 3 118 116 175 3 175 116 176 3 116 114 176 3 176 114 177 3 114 113 177 3 177 113 178 3 113 13 178 3 81 20 19 3 93 179 81 3 95 180 93 3 98 181 95 3 102 182 98 3 107 183 102 3 8 184 107 3 81 179 20 3 179 185 20 3 93 180 179 3 180 186 179 3 179 186 185 3 186 187 185 3 95 181 180 3 181 188 180 3 180 188 186 3 188 189 186 3 186 189 187 3 189 190 187 3 98 182 181 3 182 191 181 3 181 191 188 3 191 192 188 3 188 192 189 3 192 193 189 3 189 193 190 3 193 194 190 3 102 183 182 3 183 195 182 3 182 195 191 3 195 196 191 3 191 196 192 3 196 197 192 3 192 197 193 3 197 198 193 3 193 198 194 3 198 199 194 3 107 184 183 3 184 200 183 3 183 200 195 3 200 201 195 3 195 201 196 3 201 202 196 3 196 202 197 3 202 203 197 3 197 203 198 3 203 204 198 3 198 204 199 3 204 205 199 3 8 7 184 3 7 155 184 3 184 155 200 3 155 153 200 3 200 153 201 3 153 151 201 3 201 151 202 3 151 149 202 3 202 149 203 3 149 147 203 3 203 147 204 3 147 146 204 3 204 146 205 3 146 16 205 3 206 207 39 3 208 209 206 3 210 211 208 3 212 213 210 3 214 215 212 3 216 217 214 3 9 218 216 3 206 209 207 3 209 219 207 3 208 211 209 3 211 220 209 3 209 220 219 3 220 221 219 3 210 213 211 3 213 222 211 3 211 222 220 3 222 223 220 3 220 223 221 3 223 224 221 3 212 215 213 3 215 225 213 3 213 225 222 3 225 226 222 3 222 226 223 3 226 227 223 3 223 227 224 3 227 228 224 3 214 217 215 3 217 229 215 3 215 229 225 3 229 230 225 3 225 230 226 3 230 231 226 3 226 231 227 3 231 232 227 3 227 232 228 3 232 233 228 3 216 218 217 3 218 234 217 3 217 234 229 3 234 235 229 3 229 235 230 3 235 236 230 3 230 236 231 3 236 237 231 3 231 237 232 3 237 238 232 3 232 238 233 3 238 26 233 3 9 5 218 3 5 90 218 3 218 90 234 3 90 88 234 3 234 88 235 3 88 86 235 3 235 86 236 3 86 84 236 3 236 84 237 3 84 82 237 3 237 82 238 3 82 80 238 3 238 80 26 3 80 19 26 3 239 240 27 3 241 242 239 3 243 244 241 3 245 246 243 3 247 248 245 3 249 250 247 3 12 251 249 3 239 242 240 3 242 252 240 3 241 244 242 3 244 253 242 3 242 253 252 3 253 254 252 3 243 246 244 3 246 255 244 3 244 255 253 3 255 256 253 3 253 256 254 3 256 257 254 3 245 248 246 3 248 258 246 3 246 258 255 3 258 259 255 3 255 259 256 3 259 260 256 3 256 260 257 3 260 261 257 3 247 250 248 3 250 262 248 3 248 262 258 3 262 263 258 3 258 263 259 3 263 264 259 3 259 264 260 3 264 265 260 3 260 265 261 3 265 266 261 3 249 251 250 3 251 267 250 3 250 267 262 3 267 268 262 3 262 268 263 3 268 269 263 3 263 269 264 3 269 270 264 3 264 270 265 3 270 271 265 3 265 271 266 3 271 22 266 3 12 11 251 3 11 54 251 3 251 54 267 3 54 56 267 3 267 56 268 3 56 59 268 3 268 59 269 3 59 63 269 3 269 63 270 3 63 68 270 3 270 68 271 3 68 74 271 3 271 74 22 3 74 3 22 3 272 273 30 3 274 275 272 3 276 277 274 3 278 279 276 3 280 281 278 3 282 283 280 3 15 284 282 3 272 275 273 3 275 285 273 3 274 277 275 3 277 286 275 3 275 286 285 3 286 287 285 3 276 279 277 3 279 288 277 3 277 288 286 3 288 289 286 3 286 289 287 3 289 290 287 3 278 281 279 3 281 291 279 3 279 291 288 3 291 292 288 3 288 292 289 3 292 293 289 3 289 293 290 3 293 294 290 3 280 283 281 3 283 295 281 3 281 295 291 3 295 296 291 3 291 296 292 3 296 297 292 3 292 297 293 3 297 298 293 3 293 298 294 3 298 299 294 3 282 284 283 3 284 300 283 3 283 300 295 3 300 301 295 3 295 301 296 3 301 302 296 3 296 302 297 3 302 303 297 3 297 303 298 3 303 304 298 3 298 304 299 3 304 23 299 3 15 14 284 3 14 125 284 3 284 125 300 3 125 127 300 3 300 127 301 3 127 130 301 3 301 130 302 3 130 134 302 3 302 134 303 3 134 139 303 3 303 139 304 3 139 145 304 3 304 145 23 3 145 10 23 3 305 306 33 3 307 308 305 3 309 310 307 3 311 312 309 3 313 314 311 3 315 316 313 3 18 317 315 3 305 308 306 3 308 318 306 3 307 310 308 3 310 319 308 3 308 319 318 3 319 320 318 3 309 312 310 3 312 321 310 3 310 321 319 3 321 322 319 3 319 322 320 3 322 323 320 3 311 314 312 3 314 324 312 3 312 324 321 3 324 325 321 3 321 325 322 3 325 326 322 3 322 326 323 3 326 327 323 3 313 316 314 3 316 328 314 3 314 328 324 3 328 329 324 3 324 329 325 3 329 330 325 3 325 330 326 3 330 331 326 3 326 331 327 3 331 332 327 3 315 317 316 3 317 333 316 3 316 333 328 3 333 334 328 3 328 334 329 3 334 335 329 3 329 335 330 3 335 336 330 3 330 336 331 3 336 337 331 3 331 337 332 3 337 24 332 3 18 17 317 3 17 158 317 3 317 158 333 3 158 160 333 3 333 160 334 3 160 163 334 3 334 163 335 3 163 167 335 3 335 167 336 3 167 172 336 3 336 172 337 3 172 178 337 3 337 178 24 3 178 13 24 3 338 339 36 3 340 341 338 3 342 343 340 3 344 345 342 3 346 347 344 3 348 349 346 3 21 350 348 3 338 341 339 3 341 351 339 3 340 343 341 3 343 352 341 3 341 352 351 3 352 353 351 3 342 345 343 3 345 354 343 3 343 354 352 3 354 355 352 3 352 355 353 3 355 356 353 3 344 347 345 3 347 357 345 3 345 357 354 3 357 358 354 3 354 358 355 3 358 359 355 3 355 359 356 3 359 360 356 3 346 349 347 3 349 361 347 3 347 361 357 3 361 362 357 3 357 362 358 3 362 363 358 3 358 363 359 3 363 364 359 3 359 364 360 3 364 365 360 3 348 350 349 3 350 366 349 3 349 366 361 3 366 367 361 3 361 367 362 3 367 368 362 3 362 368 363 3 368 369 363 3 363 369 364 3 369 370 364 3 364 370 365 3 370 25 365 3 21 20 350 3 20 185 350 3 350 185 366 3 185 187 366 3 366 187 367 3 187 190 367 3 367 190 368 3 190 194 368 3 368 194 369 3 194 199 369 3 369 199 370 3 199 205 370 3 370 205 25 3 205 16 25 3 240 28 27 3 252 371 240 3 254 372 252 3 257 373 254 3 261 374 257 3 266 375 261 3 22 376 266 3 240 371 28 3 371 377 28 3 252 372 371 3 372 378 371 3 371 378 377 3 378 379 377 3 254 373 372 3 373 380 372 3 372 380 378 3 380 381 378 3 378 381 379 3 381 382 379 3 257 374 373 3 374 383 373 3 373 383 380 3 383 384 380 3 380 384 381 3 384 385 381 3 381 385 382 3 385 386 382 3 261 375 374 3 375 387 374 3 374 387 383 3 387 388 383 3 383 388 384 3 388 389 384 3 384 389 385 3 389 390 385 3 385 390 386 3 390 391 386 3 266 376 375 3 376 392 375 3 375 392 387 3 392 393 387 3 387 393 388 3 393 394 388 3 388 394 389 3 394 395 389 3 389 395 390 3 395 396 390 3 390 396 391 3 396 397 391 3 22 9 376 3 9 216 376 3 376 216 392 3 216 214 392 3 392 214 393 3 214 212 393 3 393 212 394 3 212 210 394 3 394 210 395 3 210 208 395 3 395 208 396 3 208 206 396 3 396 206 397 3 206 39 397 3 273 31 30 3 285 398 273 3 287 399 285 3 290 400 287 3 294 401 290 3 299 402 294 3 23 403 299 3 273 398 31 3 398 404 31 3 285 399 398 3 399 405 398 3 398 405 404 3 405 406 404 3 287 400 399 3 400 407 399 3 399 407 405 3 407 408 405 3 405 408 406 3 408 409 406 3 290 401 400 3 401 410 400 3 400 410 407 3 410 411 407 3 407 411 408 3 411 412 408 3 408 412 409 3 412 413 409 3 294 402 401 3 402 414 401 3 401 414 410 3 414 415 410 3 410 415 411 3 415 416 411 3 411 416 412 3 416 417 412 3 412 417 413 3 417 418 413 3 299 403 402 3 403 419 402 3 402 419 414 3 419 420 414 3 414 420 415 3 420 421 415 3 415 421 416 3 421 422 416 3 416 422 417 3 422 423 417 3 417 423 418 3 423 424 418 3 23 12 403 3 12 249 403 3 403 249 419 3 249 247 419 3 419 247 420 3 247 245 420 3 420 245 421 3 245 243 421 3 421 243 422 3 243 241 422 3 422 241 423 3 241 239 423 3 423 239 424 3 239 27 424 3 306 34 33 3 318 425 306 3 320 426 318 3 323 427 320 3 327 428 323 3 332 429 327 3 24 430 332 3 306 425 34 3 425 431 34 3 318 426 425 3 426 432 425 3 425 432 431 3 432 433 431 3 320 427 426 3 427 434 426 3 426 434 432 3 434 435 432 3 432 435 433 3 435 436 433 3 323 428 427 3 428 437 427 3 427 437 434 3 437 438 434 3 434 438 435 3 438 439 435 3 435 439 436 3 439 440 436 3 327 429 428 3 429 441 428 3 428 441 437 3 441 442 437 3 437 442 438 3 442 443 438 3 438 443 439 3 443 444 439 3 439 444 440 3 444 445 440 3 332 430 429 3 430 446 429 3 429 446 441 3 446 447 441 3 441 447 442 3 447 448 442 3 442 448 443 3 448 449 443 3 443 449 444 3 449 450 444 3 444 450 445 3 450 451 445 3 24 15 430 3 15 282 430 3 430 282 446 3 282 280 446 3 446 280 447 3 280 278 447 3 447 278 448 3 278 276 448 3 448 276 449 3 276 274 449 3 449 274 450 3 274 272 450 3 450 272 451 3 272 30 451 3 339 37 36 3 351 452 339 3 353 453 351 3 356 454 353 3 360 455 356 3 365 456 360 3 25 457 365 3 339 452 37 3 452 458 37 3 351 453 452 3 453 459 452 3 452 459 458 3 459 460 458 3 353 454 453 3 454 461 453 3 453 461 459 3 461 462 459 3 459 462 460 3 462 463 460 3 356 455 454 3 455 464 454 3 454 464 461 3 464 465 461 3 461 465 462 3 465 466 462 3 462 466 463 3 466 467 463 3 360 456 455 3 456 468 455 3 455 468 464 3 468 469 464 3 464 469 465 3 469 470 465 3 465 470 466 3 470 471 466 3 466 471 467 3 471 472 467 3 365 457 456 3 457 473 456 3 456 473 468 3 473 474 468 3 468 474 469 3 474 475 469 3 469 475 470 3 475 476 470 3 470 476 471 3 476 477 471 3 471 477 472 3 477 478 472 3 25 18 457 3 18 315 457 3 457 315 473 3 315 313 473 3 473 313 474 3 313 311 474 3 474 311 475 3 311 309 475 3 475 309 476 3 309 307 476 3 476 307 477 3 307 305 477 3 477 305 478 3 305 33 478 3 207 40 39 3 219 479 207 3 221 480 219 3 224 481 221 3 228 482 224 3 233 483 228 3 26 484 233 3 207 479 40 3 479 485 40 3 219 480 479 3 480 486 479 3 479 486 485 3 486 487 485 3 221 481 480 3 481 488 480 3 480 488 486 3 488 489 486 3 486 489 487 3 489 490 487 3 224 482 481 3 482 491 481 3 481 491 488 3 491 492 488 3 488 492 489 3 492 493 489 3 489 493 490 3 493 494 490 3 228 483 482 3 483 495 482 3 482 495 491 3 495 496 491 3 491 496 492 3 496 497 492 3 492 497 493 3 497 498 493 3 493 498 494 3 498 499 494 3 233 484 483 3 484 500 483 3 483 500 495 3 500 501 495 3 495 501 496 3 501 502 496 3 496 502 497 3 502 503 497 3 497 503 498 3 503 504 498 3 498 504 499 3 504 505 499 3 26 21 484 3 21 348 484 3 484 348 500 3 348 346 500 3 500 346 501 3 346 344 501 3 501 344 502 3 344 342 502 3 502 342 503 3 342 340 503 3 503 340 504 3 340 338 504 3 504 338 505 3 338 36 505 3 506 507 508 3 509 510 506 3 511 512 509 3 513 514 511 3 515 516 513 3 517 518 515 3 29 519 517 3 506 510 507 3 510 520 507 3 509 512 510 3 512 521 510 3 510 521 520 3 521 522 520 3 511 514 512 3 514 523 512 3 512 523 521 3 523 524 521 3 521 524 522 3 524 525 522 3 513 516 514 3 516 526 514 3 514 526 523 3 526 527 523 3 523 527 524 3 527 528 524 3 524 528 525 3 528 529 525 3 515 518 516 3 518 530 516 3 516 530 526 3 530 531 526 3 526 531 527 3 531 532 527 3 527 532 528 3 532 533 528 3 528 533 529 3 533 534 529 3 517 519 518 3 519 535 518 3 518 535 530 3 535 536 530 3 530 536 531 3 536 537 531 3 531 537 532 3 537 538 532 3 532 538 533 3 538 539 533 3 533 539 534 3 539 41 534 3 29 28 519 3 28 377 519 3 519 377 535 3 377 379 535 3 535 379 536 3 379 382 536 3 536 382 537 3 382 386 537 3 537 386 538 3 386 391 538 3 538 391 539 3 391 397 539 3 539 397 41 3 397 39 41 3 540 506 508 3 541 542 540 3 543 544 541 3 545 546 543 3 547 548 545 3 549 550 547 3 32 551 549 3 540 542 506 3 542 509 506 3 541 544 542 3 544 552 542 3 542 552 509 3 552 511 509 3 543 546 544 3 546 553 544 3 544 553 552 3 553 554 552 3 552 554 511 3 554 513 511 3 545 548 546 3 548 555 546 3 546 555 553 3 555 556 553 3 553 556 554 3 556 557 554 3 554 557 513 3 557 515 513 3 547 550 548 3 550 558 548 3 548 558 555 3 558 559 555 3 555 559 556 3 559 560 556 3 556 560 557 3 560 561 557 3 557 561 515 3 561 517 515 3 549 551 550 3 551 562 550 3 550 562 558 3 562 563 558 3 558 563 559 3 563 564 559 3 559 564 560 3 564 565 560 3 560 565 561 3 565 566 561 3 561 566 517 3 566 29 517 3 32 31 551 3 31 404 551 3 551 404 562 3 404 406 562 3 562 406 563 3 406 409 563 3 563 409 564 3 409 413 564 3 564 413 565 3 413 418 565 3 565 418 566 3 418 424 566 3 566 424 29 3 424 27 29 3 567 540 508 3 568 569 567 3 570 571 568 3 572 573 570 3 574 575 572 3 576 577 574 3 35 578 576 3 567 569 540 3 569 541 540 3 568 571 569 3 571 579 569 3 569 579 541 3 579 543 541 3 570 573 571 3 573 580 571 3 571 580 579 3 580 581 579 3 579 581 543 3 581 545 543 3 572 575 573 3 575 582 573 3 573 582 580 3 582 583 580 3 580 583 581 3 583 584 581 3 581 584 545 3 584 547 545 3 574 577 575 3 577 585 575 3 575 585 582 3 585 586 582 3 582 586 583 3 586 587 583 3 583 587 584 3 587 588 584 3 584 588 547 3 588 549 547 3 576 578 577 3 578 589 577 3 577 589 585 3 589 590 585 3 585 590 586 3 590 591 586 3 586 591 587 3 591 592 587 3 587 592 588 3 592 593 588 3 588 593 549 3 593 32 549 3 35 34 578 3 34 431 578 3 578 431 589 3 431 433 589 3 589 433 590 3 433 436 590 3 590 436 591 3 436 440 591 3 591 440 592 3 440 445 592 3 592 445 593 3 445 451 593 3 593 451 32 3 451 30 32 3 594 567 508 3 595 596 594 3 597 598 595 3 599 600 597 3 601 602 599 3 603 604 601 3 38 605 603 3 594 596 567 3 596 568 567 3 595 598 596 3 598 606 596 3 596 606 568 3 606 570 568 3 597 600 598 3 600 607 598 3 598 607 606 3 607 608 606 3 606 608 570 3 608 572 570 3 599 602 600 3 602 609 600 3 600 609 607 3 609 610 607 3 607 610 608 3 610 611 608 3 608 611 572 3 611 574 572 3 601 604 602 3 604 612 602 3 602 612 609 3 612 613 609 3 609 613 610 3 613 614 610 3 610 614 611 3 614 615 611 3 611 615 574 3 615 576 574 3 603 605 604 3 605 616 604 3 604 616 612 3 616 617 612 3 612 617 613 3 617 618 613 3 613 618 614 3 618 619 614 3 614 619 615 3 619 620 615 3 615 620 576 3 620 35 576 3 38 37 605 3 37 458 605 3 605 458 616 3 458 460 616 3 616 460 617 3 460 463 617 3 617 463 618 3 463 467 618 3 618 467 619 3 467 472 619 3 619 472 620 3 472 478 620 3 620 478 35 3 478 33 35 3 507 594 508 3 520 621 507 3 522 622 520 3 525 623 522 3 529 624 525 3 534 625 529 3 41 626 534 3 507 621 594 3 621 595 594 3 520 622 621 3 622 627 621 3 621 627 595 3 627 597 595 3 522 623 622 3 623 628 622 3 622 628 627 3 628 629 627 3 627 629 597 3 629 599 597 3 525 624 623 3 624 630 623 3 623 630 628 3 630 631 628 3 628 631 629 3 631 632 629 3 629 632 599 3 632 601 599 3 529 625 624 3 625 633 624 3 624 633 630 3 633 634 630 3 630 634 631 3 634 635 631 3 631 635 632 3 635 636 632 3 632 636 601 3 636 603 601 3 534 626 625 3 626 637 625 3 625 637 633 3 637 638 633 3 633 638 634 3 638 639 634 3 634 639 635 3 639 640 635 3 635 640 636 3 640 641 636 3 636 641 603 3 641 38 603 3 41 40 626 3 40 485 626 3 626 485 637 3 485 487 637 3 637 487 638 3 487 490 638 3 638 490 639 3 490 494 639 3 639 494 640 3 494 499 640 3 640 499 641 3 499 505 641 3 641 505 38 3 505 36 38 opensurgsim-0.7.0/SurgSim/Testing/Data/Geometry/sphere0_025.ply000066400000000000000000000207501277777236100242540ustar00rootroot00000000000000ply format ascii 1.0 comment Created by Blender 2.76 (sub 0) - www.blender.org, source file: '' element vertex 162 property float x property float y property float z element face 320 property list uchar uint vertex_indices end_header 0.000000 0.000000 -0.025000 0.005080 -0.003690 -0.024199 -0.001940 -0.005971 -0.024199 0.018090 -0.013143 -0.011180 0.015239 -0.011071 -0.016438 0.020318 -0.007381 -0.012558 -0.006279 0.000000 -0.024199 -0.001940 0.005971 -0.024199 0.005080 0.003690 -0.024199 0.021517 -0.011071 -0.006279 -0.006910 -0.021266 -0.011180 -0.000741 -0.021605 -0.012558 -0.003880 -0.023886 -0.006279 -0.022361 0.000000 -0.011180 -0.020776 -0.005971 -0.012557 -0.023916 -0.003690 -0.006279 -0.006910 0.021266 -0.011180 -0.012099 0.017914 -0.012558 -0.010900 0.021605 -0.006279 0.018090 0.013143 -0.011180 0.013299 0.017043 -0.012558 0.017179 0.017043 -0.006279 0.017179 -0.017043 -0.006279 -0.010900 -0.021605 -0.006279 -0.023916 0.003690 -0.006279 -0.003880 0.023886 -0.006279 0.021517 0.011071 -0.006279 0.006910 -0.021266 0.011180 0.012099 -0.017914 0.012558 0.005821 -0.017914 0.016438 -0.018090 -0.013143 0.011180 -0.013299 -0.017043 0.012558 -0.015239 -0.011071 0.016438 -0.018090 0.013143 0.011180 -0.020318 0.007381 0.012558 -0.015239 0.011071 0.016438 0.006910 0.021266 0.011180 0.000741 0.021605 0.012558 0.005821 0.017914 0.016438 0.022361 0.000000 0.011180 0.020776 0.005971 0.012557 0.018836 0.000000 0.016438 0.006279 0.000000 0.024199 0.001940 0.005971 0.024199 0.000000 0.000000 0.025000 0.013143 0.000000 0.021266 0.009045 0.006572 0.022361 0.015955 0.006572 0.018090 0.004061 0.012500 0.021266 0.011180 0.013143 0.018090 0.017205 0.012500 0.013143 0.012099 0.017914 0.012558 -0.005080 0.003690 0.024199 -0.003455 0.010633 0.022361 -0.001320 0.017205 0.018090 -0.010633 0.007725 0.021266 -0.009045 0.014694 0.018090 -0.006572 0.020225 0.013143 -0.013299 0.017043 0.012558 -0.005080 -0.003690 0.024199 -0.011180 0.000000 0.022361 -0.016770 0.004061 0.018090 -0.010633 -0.007725 0.021266 -0.016770 -0.004061 0.018090 -0.021266 0.000000 0.013143 -0.020318 -0.007381 0.012558 0.001940 -0.005971 0.024199 -0.003455 -0.010633 0.022361 -0.009045 -0.014694 0.018090 0.004061 -0.012500 0.021266 -0.001320 -0.017205 0.018090 -0.006572 -0.020225 0.013143 0.000741 -0.021605 0.012558 0.009045 -0.006572 0.022361 0.011180 -0.013143 0.018090 0.015955 -0.006572 0.018090 0.017205 -0.012500 0.013143 0.020776 -0.005971 0.012557 0.023916 0.003690 0.006279 0.023776 0.007725 0.000000 0.021545 0.010633 0.006910 0.020225 0.014695 -0.000000 0.016771 0.017205 0.006910 0.014695 0.020225 -0.000000 0.010900 0.021605 0.006279 0.003880 0.023886 0.006279 0.000000 0.025000 0.000000 -0.003455 0.023776 0.006910 -0.007725 0.023776 -0.000000 -0.011180 0.021266 0.006910 -0.014695 0.020225 -0.000000 -0.017179 0.017043 0.006279 -0.021517 0.011071 0.006279 -0.023776 0.007725 0.000000 -0.023680 0.004061 0.006910 -0.025000 -0.000000 0.000000 -0.023680 -0.004061 0.006910 -0.023776 -0.007725 -0.000000 -0.021517 -0.011071 0.006279 -0.017179 -0.017043 0.006279 -0.014695 -0.020225 0.000000 -0.011180 -0.021266 0.006910 -0.007725 -0.023776 -0.000000 -0.003455 -0.023776 0.006910 0.000000 -0.025000 -0.000000 0.003880 -0.023886 0.006279 0.010900 -0.021605 0.006279 0.014695 -0.020225 0.000000 0.016771 -0.017205 0.006910 0.020225 -0.014695 -0.000000 0.021545 -0.010633 0.006910 0.023776 -0.007725 -0.000000 0.023916 -0.003690 0.006279 0.007725 0.023776 -0.000000 0.011180 0.021266 -0.006910 0.003455 0.023776 -0.006910 0.006572 0.020225 -0.013143 -0.000741 0.021605 -0.012558 -0.020225 0.014695 -0.000000 -0.016770 0.017205 -0.006910 -0.021545 0.010633 -0.006910 -0.017205 0.012500 -0.013143 -0.020776 0.005971 -0.012557 -0.020225 -0.014695 0.000000 -0.021545 -0.010633 -0.006910 -0.016770 -0.017205 -0.006910 -0.017205 -0.012500 -0.013143 -0.012099 -0.017914 -0.012558 0.007725 -0.023776 0.000000 0.003455 -0.023776 -0.006910 0.011180 -0.021266 -0.006910 0.006572 -0.020225 -0.013143 0.013299 -0.017043 -0.012558 0.025000 -0.000000 0.000000 0.023680 -0.004061 -0.006910 0.023680 0.004061 -0.006910 0.021266 -0.000000 -0.013143 0.020318 0.007381 -0.012558 0.015239 0.011071 -0.016438 0.010633 0.007725 -0.021266 0.009045 0.014694 -0.018090 0.003455 0.010633 -0.022361 0.001320 0.017205 -0.018090 -0.004061 0.012500 -0.021266 -0.005821 0.017914 -0.016438 -0.011180 0.013143 -0.018090 -0.009045 0.006572 -0.022361 -0.015955 0.006572 -0.018090 -0.013143 0.000000 -0.021266 -0.018836 0.000000 -0.016438 -0.015955 -0.006572 -0.018090 -0.009045 -0.006572 -0.022361 -0.011180 -0.013143 -0.018090 -0.004061 -0.012500 -0.021266 -0.005821 -0.017914 -0.016438 0.016770 0.004061 -0.018090 0.016770 -0.004061 -0.018090 0.011180 -0.000000 -0.022361 0.010633 -0.007725 -0.021266 0.001320 -0.017205 -0.018090 0.003455 -0.010633 -0.022361 0.009045 -0.014694 -0.018090 3 0 1 2 3 3 4 5 3 0 2 6 3 0 6 7 3 0 7 8 3 3 5 9 3 10 11 12 3 13 14 15 3 16 17 18 3 19 20 21 3 3 9 22 3 10 12 23 3 13 15 24 3 16 18 25 3 19 21 26 3 27 28 29 3 30 31 32 3 33 34 35 3 36 37 38 3 39 40 41 3 42 43 44 3 45 46 42 3 41 47 45 3 42 46 43 3 46 48 43 3 45 47 46 3 47 49 46 3 46 49 48 3 49 38 48 3 41 40 47 3 40 50 47 3 47 50 49 3 50 51 49 3 49 51 38 3 51 36 38 3 43 52 44 3 48 53 43 3 38 54 48 3 43 53 52 3 53 55 52 3 48 54 53 3 54 56 53 3 53 56 55 3 56 35 55 3 38 37 54 3 37 57 54 3 54 57 56 3 57 58 56 3 56 58 35 3 58 33 35 3 52 59 44 3 55 60 52 3 35 61 55 3 52 60 59 3 60 62 59 3 55 61 60 3 61 63 60 3 60 63 62 3 63 32 62 3 35 34 61 3 34 64 61 3 61 64 63 3 64 65 63 3 63 65 32 3 65 30 32 3 59 66 44 3 62 67 59 3 32 68 62 3 59 67 66 3 67 69 66 3 62 68 67 3 68 70 67 3 67 70 69 3 70 29 69 3 32 31 68 3 31 71 68 3 68 71 70 3 71 72 70 3 70 72 29 3 72 27 29 3 66 42 44 3 69 73 66 3 29 74 69 3 66 73 42 3 73 45 42 3 69 74 73 3 74 75 73 3 73 75 45 3 75 41 45 3 29 28 74 3 28 76 74 3 74 76 75 3 76 77 75 3 75 77 41 3 77 39 41 3 78 40 39 3 79 80 78 3 26 81 79 3 78 80 40 3 80 50 40 3 79 81 80 3 81 82 80 3 80 82 50 3 82 51 50 3 26 21 81 3 21 83 81 3 81 83 82 3 83 84 82 3 82 84 51 3 84 36 51 3 85 37 36 3 86 87 85 3 25 88 86 3 85 87 37 3 87 57 37 3 86 88 87 3 88 89 87 3 87 89 57 3 89 58 57 3 25 18 88 3 18 90 88 3 88 90 89 3 90 91 89 3 89 91 58 3 91 33 58 3 92 34 33 3 93 94 92 3 24 95 93 3 92 94 34 3 94 64 34 3 93 95 94 3 95 96 94 3 94 96 64 3 96 65 64 3 24 15 95 3 15 97 95 3 95 97 96 3 97 98 96 3 96 98 65 3 98 30 65 3 99 31 30 3 100 101 99 3 23 102 100 3 99 101 31 3 101 71 31 3 100 102 101 3 102 103 101 3 101 103 71 3 103 72 71 3 23 12 102 3 12 104 102 3 102 104 103 3 104 105 103 3 103 105 72 3 105 27 72 3 106 28 27 3 107 108 106 3 22 109 107 3 106 108 28 3 108 76 28 3 107 109 108 3 109 110 108 3 108 110 76 3 110 77 76 3 22 9 109 3 9 111 109 3 109 111 110 3 111 112 110 3 110 112 77 3 112 39 77 3 84 85 36 3 83 113 84 3 21 114 83 3 84 113 85 3 113 86 85 3 83 114 113 3 114 115 113 3 113 115 86 3 115 25 86 3 21 20 114 3 20 116 114 3 114 116 115 3 116 117 115 3 115 117 25 3 117 16 25 3 91 92 33 3 90 118 91 3 18 119 90 3 91 118 92 3 118 93 92 3 90 119 118 3 119 120 118 3 118 120 93 3 120 24 93 3 18 17 119 3 17 121 119 3 119 121 120 3 121 122 120 3 120 122 24 3 122 13 24 3 98 99 30 3 97 123 98 3 15 124 97 3 98 123 99 3 123 100 99 3 97 124 123 3 124 125 123 3 123 125 100 3 125 23 100 3 15 14 124 3 14 126 124 3 124 126 125 3 126 127 125 3 125 127 23 3 127 10 23 3 105 106 27 3 104 128 105 3 12 129 104 3 105 128 106 3 128 107 106 3 104 129 128 3 129 130 128 3 128 130 107 3 130 22 107 3 12 11 129 3 11 131 129 3 129 131 130 3 131 132 130 3 130 132 22 3 132 3 22 3 112 78 39 3 111 133 112 3 9 134 111 3 112 133 78 3 133 79 78 3 111 134 133 3 134 135 133 3 133 135 79 3 135 26 79 3 9 5 134 3 5 136 134 3 134 136 135 3 136 137 135 3 135 137 26 3 137 19 26 3 138 20 19 3 139 140 138 3 8 141 139 3 138 140 20 3 140 116 20 3 139 141 140 3 141 142 140 3 140 142 116 3 142 117 116 3 8 7 141 3 7 143 141 3 141 143 142 3 143 144 142 3 142 144 117 3 144 16 117 3 144 17 16 3 143 145 144 3 7 146 143 3 144 145 17 3 145 121 17 3 143 146 145 3 146 147 145 3 145 147 121 3 147 122 121 3 7 6 146 3 6 148 146 3 146 148 147 3 148 149 147 3 147 149 122 3 149 13 122 3 149 14 13 3 148 150 149 3 6 151 148 3 149 150 14 3 150 126 14 3 148 151 150 3 151 152 150 3 150 152 126 3 152 127 126 3 6 2 151 3 2 153 151 3 151 153 152 3 153 154 152 3 152 154 127 3 154 10 127 3 137 138 19 3 136 155 137 3 5 156 136 3 137 155 138 3 155 139 138 3 136 156 155 3 156 157 155 3 155 157 139 3 157 8 139 3 5 4 156 3 4 158 156 3 156 158 157 3 158 1 157 3 157 1 8 3 1 0 8 3 154 11 10 3 153 159 154 3 2 160 153 3 154 159 11 3 159 131 11 3 153 160 159 3 160 161 159 3 159 161 131 3 161 132 131 3 2 1 160 3 1 158 160 3 160 158 161 3 158 4 161 3 161 4 132 3 4 3 132 opensurgsim-0.7.0/SurgSim/Testing/Data/Geometry/sphere0_5.mtl000066400000000000000000000002111277777236100240700ustar00rootroot00000000000000# Blender MTL File: 'None' # Material Count: 1 newmtl None Ns 0 Ka 0.000000 0.000000 0.000000 Kd 0.8 0.8 0.8 Ks 0.8 0.8 0.8 d 1 illum 2 opensurgsim-0.7.0/SurgSim/Testing/Data/Geometry/sphere0_5.obj000066400000000000000000001251321277777236100240600ustar00rootroot00000000000000# Blender v2.73 (sub 0) OBJ File: '' # www.blender.org mtllib sphere0_5.mtl o Sphere v -0.114861 0.492527 -0.001202 v -0.208658 0.464074 -0.001202 v -0.295101 0.417869 -0.001202 v -0.370869 0.355688 -0.001202 v -0.433051 0.279919 -0.001202 v -0.479256 0.193476 -0.001202 v -0.507709 0.099680 -0.001202 v -0.517316 0.002134 -0.001202 v -0.507709 -0.095411 -0.001202 v -0.479256 -0.189207 -0.001202 v -0.433051 -0.275651 -0.001202 v -0.370869 -0.351419 -0.001202 v -0.295101 -0.413600 -0.001202 v -0.208658 -0.459805 -0.001202 v -0.114861 -0.488258 -0.001202 v -0.112987 0.492527 -0.020232 v -0.204981 0.464074 -0.038531 v -0.289764 0.417869 -0.055395 v -0.364076 0.355688 -0.070177 v -0.425063 0.279919 -0.082308 v -0.470380 0.193476 -0.091322 v -0.498286 0.099680 -0.096873 v -0.507709 0.002134 -0.098747 v -0.498286 -0.095411 -0.096873 v -0.470380 -0.189207 -0.091322 v -0.425063 -0.275651 -0.082308 v -0.364076 -0.351419 -0.070177 v -0.289764 -0.413600 -0.055395 v -0.204981 -0.459805 -0.038531 v -0.112987 -0.488258 -0.020232 v -0.107436 0.492527 -0.038531 v -0.194093 0.464074 -0.074425 v -0.273956 0.417869 -0.107505 v -0.343957 0.355688 -0.136501 v -0.401405 0.279919 -0.160297 v -0.444093 0.193476 -0.177978 v -0.470380 0.099680 -0.188867 v -0.479256 0.002134 -0.192543 v -0.470380 -0.095411 -0.188867 v -0.444093 -0.189207 -0.177978 v -0.401405 -0.275651 -0.160297 v -0.343957 -0.351419 -0.136501 v -0.273956 -0.413600 -0.107505 v -0.194093 -0.459805 -0.074425 v -0.107436 -0.488258 -0.038531 v -0.098422 0.492527 -0.055395 v -0.176411 0.464074 -0.107505 v -0.248286 0.417869 -0.155531 v -0.311285 0.355688 -0.197625 v -0.362987 0.279919 -0.232172 v -0.401405 0.193476 -0.257842 v -0.425063 0.099680 -0.273649 v -0.433051 0.002134 -0.278987 v -0.425063 -0.095411 -0.273649 v -0.401405 -0.189207 -0.257842 v -0.362987 -0.275651 -0.232172 v -0.311285 -0.351419 -0.197625 v -0.248286 -0.413600 -0.155531 v -0.176411 -0.459805 -0.107505 v -0.098422 -0.488258 -0.055395 v -0.086291 0.492527 -0.070177 v -0.152615 0.464074 -0.136501 v -0.213740 0.417869 -0.197625 v -0.267316 0.355688 -0.251202 v -0.311285 0.279919 -0.295171 v -0.343957 0.193476 -0.327842 v -0.364076 0.099680 -0.347962 v -0.370869 0.002134 -0.354755 v -0.364076 -0.095411 -0.347962 v -0.343957 -0.189207 -0.327842 v -0.311285 -0.275651 -0.295171 v -0.267316 -0.351419 -0.251202 v -0.213740 -0.413600 -0.197625 v -0.152615 -0.459805 -0.136501 v -0.086291 -0.488258 -0.070176 v -0.071509 0.492527 -0.082308 v -0.123620 0.464074 -0.160297 v -0.171645 0.417869 -0.232172 v -0.213740 0.355688 -0.295171 v -0.248286 0.279919 -0.346873 v -0.273956 0.193476 -0.385291 v -0.289764 0.099680 -0.408948 v -0.295101 0.002134 -0.416937 v -0.289764 -0.095411 -0.408948 v -0.273956 -0.189207 -0.385291 v -0.248286 -0.275651 -0.346873 v -0.213740 -0.351419 -0.295171 v -0.171645 -0.413600 -0.232172 v -0.123620 -0.459805 -0.160297 v -0.071509 -0.488258 -0.082307 v -0.054645 0.492527 -0.091322 v -0.090539 0.464074 -0.177978 v -0.123620 0.417869 -0.257842 v -0.152615 0.355688 -0.327842 v -0.176411 0.279919 -0.385291 v -0.194093 0.193476 -0.427978 v -0.204981 0.099680 -0.454265 v -0.208658 0.002134 -0.463142 v -0.204981 -0.095411 -0.454265 v -0.194093 -0.189207 -0.427978 v -0.176411 -0.275651 -0.385291 v -0.152615 -0.351419 -0.327842 v -0.123620 -0.413600 -0.257842 v -0.090539 -0.459805 -0.177978 v -0.054645 -0.488258 -0.091322 v -0.036346 0.492527 -0.096873 v -0.054645 0.464074 -0.188867 v -0.071509 0.417869 -0.273649 v -0.086291 0.355688 -0.347962 v -0.098422 0.279919 -0.408948 v -0.107436 0.193476 -0.454265 v -0.112987 0.099680 -0.482172 v -0.114861 0.002134 -0.491594 v -0.112987 -0.095411 -0.482172 v -0.107436 -0.189207 -0.454265 v -0.098422 -0.275651 -0.408948 v -0.086291 -0.351419 -0.347962 v -0.071509 -0.413600 -0.273649 v -0.054645 -0.459805 -0.188867 v -0.036346 -0.488258 -0.096873 v -0.017316 0.492527 -0.098747 v -0.017316 0.464074 -0.192543 v -0.017316 0.417869 -0.278987 v -0.017316 0.355688 -0.354755 v -0.017316 0.279919 -0.416937 v -0.017316 0.193476 -0.463141 v -0.017316 0.099680 -0.491594 v -0.017316 0.002134 -0.501202 v -0.017316 -0.095411 -0.491594 v -0.017316 -0.189207 -0.463141 v -0.017316 -0.275651 -0.416937 v -0.017316 -0.351419 -0.354755 v -0.017316 -0.413600 -0.278987 v -0.017316 -0.459805 -0.192543 v -0.017316 -0.488258 -0.098747 v 0.001714 0.492527 -0.096873 v 0.020013 0.464074 -0.188867 v 0.036877 0.417869 -0.273649 v 0.051659 0.355688 -0.347962 v 0.063790 0.279919 -0.408948 v 0.072804 0.193476 -0.454265 v 0.078355 0.099680 -0.482171 v 0.080229 0.002134 -0.491594 v 0.078355 -0.095411 -0.482171 v 0.072804 -0.189207 -0.454265 v 0.063790 -0.275651 -0.408948 v 0.051659 -0.351419 -0.347962 v 0.036877 -0.413600 -0.273649 v 0.020013 -0.459805 -0.188867 v 0.001714 -0.488258 -0.096873 v 0.020013 0.492527 -0.091322 v 0.055907 0.464074 -0.177978 v 0.088988 0.417869 -0.257842 v 0.117983 0.355688 -0.327842 v 0.141779 0.279919 -0.385291 v 0.159461 0.193476 -0.427978 v 0.170349 0.099680 -0.454265 v 0.174026 0.002134 -0.463141 v 0.170349 -0.095411 -0.454265 v 0.159461 -0.189207 -0.427978 v 0.141779 -0.275651 -0.385291 v 0.117983 -0.351419 -0.327842 v 0.088988 -0.413600 -0.257842 v 0.055907 -0.459805 -0.177978 v 0.020013 -0.488258 -0.091322 v 0.036877 0.492527 -0.082308 v 0.088988 0.464074 -0.160297 v 0.137013 0.417869 -0.232172 v 0.179108 0.355688 -0.295171 v 0.213654 0.279919 -0.346873 v 0.239324 0.193476 -0.385291 v 0.255131 0.099680 -0.408948 v 0.260469 0.002134 -0.416936 v 0.255131 -0.095411 -0.408948 v 0.239324 -0.189207 -0.385291 v 0.213654 -0.275651 -0.346873 v 0.179108 -0.351419 -0.295171 v 0.137013 -0.413600 -0.232172 v 0.088988 -0.459805 -0.160296 v 0.036877 -0.488258 -0.082307 v 0.051659 0.492527 -0.070177 v 0.117983 0.464074 -0.136501 v 0.179108 0.417869 -0.197625 v 0.232684 0.355688 -0.251202 v 0.276653 0.279919 -0.295171 v 0.309325 0.193476 -0.327842 v 0.329444 0.099680 -0.347962 v 0.336237 0.002134 -0.354755 v 0.329444 -0.095411 -0.347962 v 0.309325 -0.189207 -0.327842 v 0.276653 -0.275651 -0.295171 v 0.232684 -0.351419 -0.251202 v 0.179108 -0.413600 -0.197625 v 0.117983 -0.459805 -0.136501 v 0.051659 -0.488258 -0.070176 v 0.063790 0.492527 -0.055395 v 0.141779 0.464074 -0.107505 v 0.213654 0.417869 -0.155531 v 0.276653 0.355688 -0.197625 v 0.328355 0.279919 -0.232171 v 0.366773 0.193476 -0.257842 v 0.390430 0.099680 -0.273649 v 0.398419 0.002134 -0.278987 v 0.390430 -0.095411 -0.273649 v 0.366773 -0.189207 -0.257842 v 0.328355 -0.275651 -0.232171 v 0.276653 -0.351419 -0.197625 v 0.213654 -0.413600 -0.155531 v 0.141779 -0.459805 -0.107505 v 0.063790 -0.488258 -0.055395 v 0.072804 0.492527 -0.038531 v 0.159461 0.464074 -0.074425 v 0.239324 0.417869 -0.107505 v 0.309325 0.355688 -0.136501 v 0.366773 0.279919 -0.160296 v 0.409461 0.193476 -0.177978 v 0.435748 0.099680 -0.188867 v 0.444624 0.002134 -0.192543 v 0.435748 -0.095411 -0.188867 v 0.409461 -0.189207 -0.177978 v 0.366773 -0.275651 -0.160296 v 0.309325 -0.351419 -0.136501 v 0.239324 -0.413600 -0.107505 v 0.159461 -0.459805 -0.074425 v 0.072804 -0.488258 -0.038531 v 0.078355 0.492527 -0.020232 v 0.170349 0.464074 -0.038531 v 0.255132 0.417869 -0.055395 v 0.329444 0.355688 -0.070176 v 0.390430 0.279919 -0.082307 v 0.435748 0.193476 -0.091322 v 0.463654 0.099680 -0.096872 v 0.473077 0.002134 -0.098747 v 0.463654 -0.095411 -0.096872 v 0.435748 -0.189207 -0.091322 v 0.390430 -0.275651 -0.082307 v 0.329444 -0.351419 -0.070176 v 0.255131 -0.413600 -0.055395 v 0.170349 -0.459805 -0.038531 v 0.078355 -0.488258 -0.020232 v 0.080229 0.492527 -0.001202 v 0.174026 0.464074 -0.001202 v 0.260469 0.417869 -0.001202 v 0.336237 0.355688 -0.001202 v 0.398419 0.279919 -0.001202 v 0.444624 0.193476 -0.001202 v 0.473076 0.099680 -0.001202 v 0.482684 0.002134 -0.001202 v 0.473076 -0.095411 -0.001202 v 0.444624 -0.189207 -0.001202 v 0.398419 -0.275651 -0.001202 v 0.336237 -0.351419 -0.001202 v 0.260469 -0.413600 -0.001202 v 0.174026 -0.459805 -0.001202 v 0.080229 -0.488258 -0.001202 v 0.078355 0.492527 0.017829 v 0.170349 0.464074 0.036127 v 0.255132 0.417869 0.052992 v 0.329444 0.355688 0.067773 v 0.390430 0.279919 0.079904 v 0.435748 0.193476 0.088918 v 0.463654 0.099680 0.094469 v 0.473077 0.002134 0.096344 v 0.463654 -0.095411 0.094469 v 0.435748 -0.189207 0.088918 v 0.390430 -0.275651 0.079904 v 0.329444 -0.351419 0.067773 v 0.255131 -0.413600 0.052992 v 0.170349 -0.459805 0.036127 v 0.078355 -0.488258 0.017828 v 0.072804 0.492527 0.036127 v 0.159461 0.464074 0.072022 v 0.239324 0.417869 0.105102 v 0.309325 0.355688 0.134097 v 0.366773 0.279919 0.157893 v 0.409461 0.193476 0.175575 v 0.435747 0.099680 0.186464 v 0.444624 0.002134 0.190140 v 0.435747 -0.095411 0.186464 v 0.409461 -0.189207 0.175575 v 0.366773 -0.275651 0.157893 v 0.309325 -0.351419 0.134097 v 0.239324 -0.413600 0.105102 v 0.159461 -0.459805 0.072022 v 0.072804 -0.488258 0.036127 v 0.063790 0.492527 0.052992 v 0.141779 0.464074 0.105102 v 0.213654 0.417869 0.153128 v 0.276653 0.355688 0.195222 v 0.328355 0.279919 0.229768 v 0.366773 0.193476 0.255438 v 0.390430 0.099680 0.271246 v 0.398419 0.002134 0.276584 v 0.390430 -0.095411 0.271246 v 0.366773 -0.189207 0.255438 v 0.328355 -0.275651 0.229768 v 0.276653 -0.351419 0.195222 v 0.213654 -0.413600 0.153127 v 0.141779 -0.459805 0.105102 v 0.063790 -0.488258 0.052992 v 0.051659 0.492527 0.067773 v 0.117983 0.464074 0.134097 v 0.179108 0.417869 0.195222 v 0.232684 0.355688 0.248798 v 0.276653 0.279919 0.292767 v 0.309325 0.193476 0.325439 v 0.329444 0.099680 0.345558 v 0.336237 0.002134 0.352352 v 0.329444 -0.095411 0.345558 v 0.309325 -0.189207 0.325439 v 0.276653 -0.275651 0.292767 v 0.232684 -0.351419 0.248798 v 0.179108 -0.413600 0.195222 v 0.117983 -0.459805 0.134097 v 0.051659 -0.488258 0.067773 v 0.036877 0.492527 0.079904 v 0.088988 0.464074 0.157893 v 0.137013 0.417869 0.229768 v 0.179108 0.355688 0.292767 v 0.213654 0.279919 0.344469 v 0.239324 0.193476 0.382887 v 0.255131 0.099680 0.406545 v 0.260469 0.002134 0.414533 v 0.255131 -0.095411 0.406545 v 0.239324 -0.189207 0.382887 v 0.213654 -0.275651 0.344469 v 0.179108 -0.351419 0.292767 v 0.137013 -0.413600 0.229768 v 0.088988 -0.459805 0.157893 v 0.036877 -0.488258 0.079904 v -0.017316 -0.497866 -0.001202 v 0.020013 0.492527 0.088918 v 0.055907 0.464074 0.175575 v 0.088988 0.417869 0.255438 v 0.117983 0.355688 0.325439 v 0.141779 0.279919 0.382887 v 0.159461 0.193476 0.425575 v 0.170349 0.099680 0.451862 v 0.174026 0.002134 0.460738 v 0.170349 -0.095411 0.451862 v 0.159461 -0.189207 0.425575 v 0.141779 -0.275651 0.382887 v 0.117983 -0.351419 0.325439 v 0.088988 -0.413600 0.255438 v 0.055907 -0.459805 0.175575 v 0.020013 -0.488258 0.088918 v 0.001714 0.492527 0.094469 v 0.020013 0.464074 0.186463 v 0.036877 0.417869 0.271246 v 0.051659 0.355688 0.345558 v 0.063790 0.279919 0.406545 v 0.072804 0.193476 0.451862 v 0.078355 0.099680 0.479768 v 0.080229 0.002134 0.489191 v 0.078355 -0.095411 0.479768 v 0.072804 -0.189207 0.451862 v 0.063790 -0.275651 0.406545 v 0.051659 -0.351419 0.345558 v 0.036877 -0.413600 0.271246 v 0.020013 -0.459805 0.186463 v 0.001714 -0.488258 0.094469 v -0.017316 0.492527 0.096344 v -0.017316 0.464074 0.190140 v -0.017316 0.417869 0.276583 v -0.017316 0.355688 0.352352 v -0.017316 0.279919 0.414533 v -0.017316 0.193476 0.460738 v -0.017316 0.099680 0.489191 v -0.017316 0.002134 0.498798 v -0.017316 -0.095411 0.489191 v -0.017316 -0.189207 0.460738 v -0.017316 -0.275651 0.414533 v -0.017316 -0.351419 0.352352 v -0.017316 -0.413600 0.276583 v -0.017316 -0.459805 0.190140 v -0.017316 -0.488258 0.096343 v -0.036346 0.492527 0.094469 v -0.054645 0.464074 0.186463 v -0.071509 0.417869 0.271246 v -0.086291 0.355688 0.345558 v -0.098422 0.279919 0.406545 v -0.107436 0.193476 0.451862 v -0.112987 0.099680 0.479768 v -0.114861 0.002134 0.489191 v -0.112987 -0.095411 0.479768 v -0.107436 -0.189207 0.451862 v -0.098422 -0.275651 0.406545 v -0.086291 -0.351419 0.345558 v -0.071509 -0.413600 0.271246 v -0.054645 -0.459805 0.186463 v -0.036346 -0.488258 0.094469 v -0.054645 0.492527 0.088918 v -0.090539 0.464074 0.175575 v -0.123620 0.417869 0.255438 v -0.152615 0.355688 0.325439 v -0.176411 0.279919 0.382887 v -0.194093 0.193476 0.425575 v -0.204981 0.099680 0.451862 v -0.208658 0.002134 0.460738 v -0.204981 -0.095411 0.451862 v -0.194093 -0.189207 0.425575 v -0.176411 -0.275651 0.382887 v -0.152615 -0.351419 0.325439 v -0.123620 -0.413600 0.255438 v -0.090539 -0.459805 0.175575 v -0.054645 -0.488258 0.088918 v -0.071509 0.492527 0.079904 v -0.123620 0.464074 0.157893 v -0.171645 0.417869 0.229768 v -0.213740 0.355688 0.292767 v -0.248286 0.279919 0.344469 v -0.273956 0.193476 0.382887 v -0.289763 0.099680 0.406545 v -0.295101 0.002134 0.414533 v -0.289763 -0.095411 0.406545 v -0.273956 -0.189207 0.382887 v -0.248286 -0.275651 0.344469 v -0.213740 -0.351419 0.292767 v -0.171645 -0.413600 0.229768 v -0.123620 -0.459805 0.157893 v -0.071509 -0.488258 0.079904 v -0.086291 0.492527 0.067773 v -0.152615 0.464074 0.134097 v -0.213740 0.417869 0.195222 v -0.267316 0.355688 0.248798 v -0.311285 0.279919 0.292767 v -0.343957 0.193476 0.325439 v -0.364076 0.099680 0.345558 v -0.370869 0.002134 0.352352 v -0.364076 -0.095411 0.345558 v -0.343957 -0.189207 0.325439 v -0.311285 -0.275651 0.292767 v -0.267316 -0.351419 0.248798 v -0.213740 -0.413600 0.195222 v -0.152615 -0.459805 0.134097 v -0.086291 -0.488258 0.067773 v -0.098422 0.492527 0.052992 v -0.176411 0.464074 0.105102 v -0.248286 0.417869 0.153127 v -0.311285 0.355688 0.195222 v -0.362987 0.279919 0.229768 v -0.401405 0.193476 0.255438 v -0.425062 0.099680 0.271246 v -0.433051 0.002134 0.276583 v -0.425062 -0.095411 0.271246 v -0.401405 -0.189207 0.255438 v -0.362987 -0.275651 0.229768 v -0.311285 -0.351419 0.195222 v -0.248286 -0.413600 0.153127 v -0.176411 -0.459805 0.105102 v -0.098422 -0.488258 0.052992 v -0.017316 0.502134 -0.001202 v -0.107436 0.492527 0.036127 v -0.194093 0.464074 0.072022 v -0.273956 0.417869 0.105102 v -0.343957 0.355688 0.134097 v -0.401405 0.279919 0.157893 v -0.444093 0.193476 0.175575 v -0.470379 0.099680 0.186463 v -0.479255 0.002134 0.190140 v -0.470379 -0.095411 0.186463 v -0.444093 -0.189207 0.175575 v -0.401405 -0.275651 0.157893 v -0.343957 -0.351419 0.134097 v -0.273956 -0.413600 0.105102 v -0.194093 -0.459805 0.072022 v -0.107436 -0.488258 0.036127 v -0.112987 0.492527 0.017828 v -0.204981 0.464074 0.036127 v -0.289763 0.417869 0.052991 v -0.364076 0.355688 0.067773 v -0.425062 0.279919 0.079904 v -0.470380 0.193476 0.088918 v -0.498285 0.099680 0.094469 v -0.507708 0.002134 0.096343 v -0.498285 -0.095411 0.094469 v -0.470380 -0.189207 0.088918 v -0.425062 -0.275651 0.079904 v -0.364076 -0.351419 0.067773 v -0.289763 -0.413600 0.052991 v -0.204981 -0.459805 0.036127 v -0.112987 -0.488258 0.017828 vt 0.586802 0.532921 vt 0.576820 0.575078 vt 0.543690 0.553854 vt 0.558627 0.514871 vt 0.563996 0.624009 vt 0.548822 0.677835 vt 0.509743 0.652799 vt 0.527184 0.600426 vt 0.531882 0.734486 vt 0.513827 0.791785 vt 0.474747 0.766750 vt 0.492037 0.708960 vt 0.495350 0.847531 vt 0.477161 0.899581 vt 0.444031 0.878357 vt 0.458538 0.823948 vt 0.459960 0.945936 vt 0.444408 0.984812 vt 0.422271 0.970631 vt 0.431785 0.927886 vt 0.785658 0.829096 vt 0.744146 0.818344 vt 0.747401 0.795647 vt 0.787317 0.817525 vt 0.921632 0.150742 vt 0.880121 0.151334 vt 0.878462 0.139763 vt 0.918378 0.128044 vt 0.705890 0.804868 vt 0.672357 0.789185 vt 0.678370 0.747245 vt 0.710614 0.771916 vt 0.959889 0.153763 vt 0.955164 0.120810 vt 0.422110 0.801871 vt 0.436076 0.743313 vt 0.403905 0.910989 vt 0.411247 0.858488 vt 0.911994 0.106663 vt 0.945897 0.089770 vt 0.719881 0.740876 vt 0.753784 0.774266 vt 0.510906 0.533985 vt 0.530746 0.497974 vt 0.471071 0.629362 vt 0.490756 0.578349 vt 0.452608 0.685064 vt 0.400365 0.957355 vt 0.790571 0.806625 vt 0.875208 0.128863 vt 0.690165 0.707739 vt 0.387466 0.782147 vt 0.399298 0.722374 vt 0.377390 0.895893 vt 0.380068 0.840738 vt 0.902727 0.087421 vt 0.932443 0.061835 vt 0.733335 0.712940 vt 0.763051 0.755023 vt 0.665778 0.676127 vt 0.685914 0.634319 vt 0.707289 0.672183 vt 0.434293 0.608424 vt 0.456112 0.558626 vt 0.415110 0.663715 vt 0.379532 0.945494 vt 0.795295 0.796815 vt 0.870483 0.119054 vt 0.479727 0.516234 vt 0.355938 0.765536 vt 0.365828 0.704739 vt 0.353259 0.883179 vt 0.351694 0.825787 vt 0.890932 0.071056 vt 0.915319 0.038078 vt 0.750459 0.689183 vt 0.774846 0.738659 vt 0.711541 0.598764 vt 0.729084 0.641946 vt 0.400823 0.590789 vt 0.424584 0.542014 vt 0.380984 0.645734 vt 0.958489 0.043280 vt 0.936695 0.013043 vt 0.801308 0.788473 vt 0.864470 0.110711 vt 0.451352 0.501284 vt 0.000000 0.230779 vt 0.012533 0.170911 vt 0.040381 0.186029 vt 0.029563 0.246828 vt 0.031050 0.113931 vt 0.054840 0.062028 vt 0.076154 0.073599 vt 0.056113 0.127536 vt 0.877062 0.058199 vt 0.895184 0.019412 vt 0.770595 0.670517 vt 0.788716 0.725802 vt 0.741676 0.570828 vt 0.754711 0.618189 vt 0.371946 0.577135 vt 0.397382 0.529152 vt 0.336951 0.691085 vt 0.351541 0.631813 vt 0.082988 0.017198 vt 0.099734 0.026289 vt 0.808379 0.781918 vt 0.857399 0.104157 vt 0.698506 0.561295 vt 0.731990 0.530255 vt 0.073348 0.198961 vt 0.064560 0.260557 vt 0.101385 0.083497 vt 0.085782 0.139175 vt 0.861651 0.049343 vt 0.872810 0.006555 vt 0.792968 0.657660 vt 0.804127 0.716946 vt 0.775160 0.551586 vt 0.783187 0.601825 vt 0.029717 0.419799 vt 0.024127 0.366003 vt 0.059124 0.379732 vt 0.062684 0.432731 vt 0.024075 0.307598 vt 0.059758 0.321596 vt 0.119558 0.034066 vt 0.816235 0.777404 vt 0.849543 0.099642 vt 0.769195 0.508874 vt 0.110166 0.209212 vt 0.103647 0.271439 vt 0.129565 0.091343 vt 0.118918 0.148401 vt 0.845291 0.044828 vt 0.849059 0.000000 vt 0.816719 0.651105 vt 0.820487 0.712431 vt 0.810706 0.541776 vt 0.813416 0.593482 vt 0.098210 0.390614 vt 0.099502 0.442982 vt 0.099609 0.332692 vt 0.141699 0.040230 vt 0.824576 0.775102 vt 0.841203 0.097340 vt 0.808692 0.497974 vt 0.149421 0.216387 vt 0.145320 0.279057 vt 0.159610 0.096834 vt 0.154246 0.154858 vt 0.828610 0.044828 vt 0.824842 0.000000 vt 0.840936 0.651105 vt 0.837168 0.712431 vt 0.846949 0.541776 vt 0.844238 0.593482 vt 0.139883 0.398232 vt 0.138758 0.450157 vt 0.142099 0.340458 vt 0.165305 0.044545 vt 0.833079 0.775102 vt 0.832699 0.097340 vt 0.848963 0.497974 vt 0.189605 0.220211 vt 0.187978 0.283116 vt 0.190365 0.099761 vt 0.190411 0.158300 vt 0.171113 0.000000 vt 0.187757 0.001584 vt 0.189469 0.046844 vt 0.864687 0.657660 vt 0.853528 0.716946 vt 0.882495 0.551586 vt 0.874468 0.601825 vt 0.182542 0.402291 vt 0.178941 0.453981 vt 0.185594 0.344597 vt 0.841420 0.777404 vt 0.824358 0.099642 vt 0.812250 0.049343 vt 0.138765 0.494240 vt 0.174929 0.497681 vt 0.229173 0.220536 vt 0.229983 0.283461 vt 0.220649 0.100010 vt 0.226021 0.158592 vt 0.801091 0.006555 vt 0.796839 0.058199 vt 0.778718 0.019412 vt 0.887060 0.670517 vt 0.868939 0.725802 vt 0.915979 0.570828 vt 0.902944 0.618189 vt 0.224547 0.402636 vt 0.218509 0.454306 vt 0.228421 0.344949 vt 0.213263 0.047040 vt 0.849276 0.781918 vt 0.816502 0.104157 vt 0.210539 0.497974 vt 0.266604 0.217351 vt 0.269720 0.280079 vt 0.249297 0.097572 vt 0.259708 0.155725 vt 0.782970 0.071056 vt 0.758582 0.038078 vt 0.907196 0.689183 vt 0.882809 0.738659 vt 0.946114 0.598764 vt 0.928571 0.641946 vt 0.264284 0.399254 vt 0.255940 0.451121 vt 0.268937 0.341501 vt 0.235772 0.045124 vt 0.856347 0.788473 vt 0.809431 0.110711 vt 0.925665 0.530255 vt 0.959149 0.561295 vt 0.300461 0.210777 vt 0.305662 0.273100 vt 0.275210 0.092540 vt 0.290178 0.149809 vt 0.771175 0.087421 vt 0.741459 0.061835 vt 0.924320 0.712940 vt 0.894604 0.755023 vt 0.971741 0.634319 vt 0.950366 0.672183 vt 0.300226 0.392275 vt 0.289797 0.444547 vt 0.305583 0.334385 vt 0.256131 0.041171 vt 0.862360 0.796815 vt 0.803418 0.119054 vt 0.987625 0.600802 vt 0.329441 0.201067 vt 0.336427 0.262792 vt 0.297391 0.085108 vt 0.316260 0.141070 vt 0.761907 0.106663 vt 0.728005 0.089770 vt 0.937774 0.740876 vt 0.903871 0.774266 vt 0.991877 0.676127 vt 0.967490 0.707738 vt 0.282103 0.559315 vt 0.308199 0.609448 vt 0.281809 0.631199 vt 0.257244 0.579804 vt 0.336951 0.323875 vt 0.273559 0.035332 vt 0.867084 0.806625 vt 0.798694 0.128863 vt 0.251541 0.516380 vt 0.229168 0.534820 vt 0.328827 0.664852 vt 0.301920 0.687030 vt 0.316805 0.745150 vt 0.325890 0.803326 vt 0.296202 0.825931 vt 0.285288 0.769147 vt 0.314987 0.075562 vt 0.336951 0.129845 vt 0.755524 0.128044 vt 0.718737 0.120811 vt 0.947041 0.771916 vt 0.910254 0.795646 vt 0.198662 0.497974 vt 0.202450 0.555164 vt 0.175940 0.515275 vt 0.250293 0.655197 vt 0.227556 0.602409 vt 0.269787 0.711497 vt 0.328827 0.859323 vt 0.302109 0.879667 vt 0.698289 0.078835 vt 0.686494 0.118342 vt 0.870339 0.817525 vt 0.795440 0.139763 vt 0.979285 0.747245 vt 0.262826 0.849783 vt 0.249857 0.794468 vt 0.302782 0.928290 vt 0.277237 0.946545 vt 0.272071 0.901133 vt 0.752270 0.150742 vt 0.714013 0.153763 vt 0.951765 0.804868 vt 0.913509 0.818344 vt 0.172413 0.576629 vt 0.150395 0.533530 vt 0.214861 0.680517 vt 0.194180 0.626261 vt 0.233661 0.737314 vt 0.680481 0.160282 vt 0.871998 0.829096 vt 0.793781 0.151334 vt 0.985298 0.789185 vt 0.227045 0.873965 vt 0.211871 0.820139 vt 0.249851 0.965053 vt 0.239869 0.922896 vt 0.752270 0.173884 vt 0.714013 0.187360 vt 0.951765 0.838466 vt 0.913509 0.841487 vt 0.140210 0.598393 vt 0.123009 0.552038 vt 0.176876 0.706189 vt 0.158399 0.650443 vt 0.194931 0.763488 vt 0.680481 0.203043 vt 0.871998 0.840894 vt 0.793781 0.163132 vt 0.985298 0.831947 vt 0.190233 0.897548 vt 0.172792 0.845175 vt 0.221676 0.983103 vt 0.206739 0.944120 vt 0.755524 0.196582 vt 0.718737 0.220312 vt 0.947041 0.871418 vt 0.910254 0.864185 vt 0.107080 0.619617 vt 0.094834 0.570088 vt 0.137796 0.731224 vt 0.121587 0.674026 vt 0.155086 0.789014 vt 0.686494 0.244983 vt 0.870339 0.852465 vt 0.795440 0.174704 vt 0.107457 0.513162 vt 0.085320 0.527343 vt 0.153805 0.919625 vt 0.134120 0.868612 vt 0.193795 1.000000 vt 0.173955 0.963989 vt 0.761907 0.217963 vt 0.728005 0.251353 vt 0.937774 0.902458 vt 0.903871 0.885565 vt 0.074296 0.639486 vt 0.066954 0.586985 vt 0.099125 0.754661 vt 0.085159 0.696103 vt 0.115657 0.812911 vt 0.698289 0.284490 vt 0.867084 0.863365 vt 0.798694 0.185603 vt 0.063414 0.540619 vt 0.119161 0.939349 vt 0.097343 0.889550 vt 0.673902 0.316101 vt 0.715413 0.320045 vt 0.694037 0.357910 vt 0.771175 0.237205 vt 0.741459 0.279288 vt 0.924320 0.930393 vt 0.894604 0.904808 vt 0.043117 0.657236 vt 0.040439 0.602081 vt 0.062347 0.775600 vt 0.050515 0.715827 vt 0.078159 0.834259 vt 0.142776 0.981740 vt 0.862360 0.873175 vt 0.803418 0.195413 vt 0.042581 0.552480 vt 0.087633 0.955960 vt 0.063872 0.907185 vt 0.737207 0.350282 vt 0.719665 0.393465 vt 0.782970 0.253569 vt 0.758582 0.303045 vt 0.907196 0.954151 vt 0.882809 0.921172 vt 0.014743 0.672187 vt 0.016308 0.614795 vt 0.028877 0.793235 vt 0.018987 0.732438 vt 0.044033 0.852240 vt 0.114402 0.996690 vt 0.856347 0.881517 vt 0.809431 0.203755 vt 0.950366 0.948949 vt 0.928571 0.979186 vt 0.060432 0.968822 vt 0.034995 0.920839 vt 0.762834 0.374039 vt 0.749799 0.421400 vt 0.796839 0.266426 vt 0.778718 0.321711 vt 0.887060 0.972816 vt 0.868939 0.934029 vt 0.391791 0.435945 vt 0.368001 0.384043 vt 0.393064 0.370438 vt 0.413105 0.424375 vt 0.349484 0.327063 vt 0.336951 0.267195 vt 0.366514 0.251146 vt 0.377332 0.311945 vt 0.014590 0.866161 vt 0.706629 0.430933 vt 0.740113 0.461974 vt 0.849276 0.888072 vt 0.816502 0.210310 vt 0.419939 0.480776 vt 0.436685 0.471685 vt 0.000000 0.806889 vt 0.361078 0.131971 vt 0.366668 0.078175 vt 0.399635 0.065243 vt 0.396075 0.118242 vt 0.791310 0.390403 vt 0.783283 0.440642 vt 0.812250 0.275283 vt 0.801091 0.334568 vt 0.864687 0.985674 vt 0.853528 0.942885 vt 0.422733 0.358799 vt 0.438336 0.414477 vt 0.401511 0.237417 vt 0.410298 0.299013 vt 0.361026 0.190376 vt 0.396708 0.176378 vt 0.777318 0.483354 vt 0.841420 0.892587 vt 0.824359 0.214825 vt 0.456509 0.463908 vt 0.436453 0.054992 vt 0.435161 0.107360 vt 0.821540 0.398746 vt 0.818829 0.450452 vt 0.828610 0.279797 vt 0.824842 0.341123 vt 0.840936 0.992228 vt 0.837168 0.947400 vt 0.455868 0.349573 vt 0.466516 0.406631 vt 0.440597 0.226535 vt 0.447117 0.288762 vt 0.436560 0.165282 vt 0.816815 0.494254 vt 0.833079 0.894888 vt 0.832699 0.217127 vt 0.478650 0.457744 vt 0.475708 0.047817 vt 0.476834 0.099743 vt 0.852362 0.398746 vt 0.855072 0.450452 vt 0.845291 0.279797 vt 0.849059 0.341123 vt 0.816719 0.992228 vt 0.820487 0.947400 vt 0.491197 0.343116 vt 0.496560 0.401140 vt 0.482270 0.218917 vt 0.486372 0.281587 vt 0.479050 0.157516 vt 0.857086 0.494254 vt 0.824576 0.894888 vt 0.841203 0.217127 vt 0.502255 0.453429 vt 0.515892 0.043993 vt 0.519493 0.095683 vt 0.882591 0.390403 vt 0.890619 0.440642 vt 0.861651 0.275283 vt 0.872810 0.334568 vt 0.508064 0.497974 vt 0.526420 0.451130 vt 0.524708 0.496390 vt 0.527362 0.339674 vt 0.527316 0.398213 vt 0.524929 0.214858 vt 0.526556 0.277763 vt 0.522544 0.153377 vt 0.475716 0.003734 vt 0.511880 0.000293 vt 0.804127 0.942885 vt 0.816235 0.892587 vt 0.849543 0.214825 vt 0.555460 0.043668 vt 0.561498 0.095338 vt 0.911067 0.374039 vt 0.924102 0.421400 vt 0.877062 0.266426 vt 0.895184 0.321711 vt 0.792968 0.985674 vt 0.770595 0.972816 vt 0.788716 0.934029 vt 0.562972 0.339382 vt 0.557599 0.397964 vt 0.566934 0.214513 vt 0.566123 0.277438 vt 0.565372 0.153025 vt 0.547490 0.000000 vt 0.808379 0.888072 vt 0.857399 0.210310 vt 0.550214 0.450934 vt 0.592891 0.046853 vt 0.601235 0.098720 vt 0.936695 0.350282 vt 0.954237 0.393464 vt 0.890932 0.253569 vt 0.915319 0.303045 vt 0.750459 0.954151 vt 0.774847 0.921172 vt 0.596659 0.342249 vt 0.586248 0.400402 vt 0.606671 0.217895 vt 0.603555 0.280623 vt 0.605888 0.156473 vt 0.933789 0.461973 vt 0.967272 0.430933 vt 0.801308 0.881517 vt 0.864470 0.203755 vt 0.572723 0.452850 vt 0.626747 0.053427 vt 0.637176 0.105699 vt 0.958489 0.320045 vt 0.979865 0.357909 vt 0.902727 0.237205 vt 0.932443 0.279288 vt 0.733336 0.930394 vt 0.763052 0.904808 vt 0.627129 0.348165 vt 0.612161 0.405434 vt 0.642613 0.224874 vt 0.637411 0.287197 vt 0.642533 0.163589 vt 0.995748 0.391427 vt 0.795295 0.873175 vt 0.870483 0.195413 vt 0.593082 0.456803 vt 0.645150 0.888526 vt 0.619054 0.938659 vt 0.594195 0.918170 vt 0.618760 0.866775 vt 0.975613 0.284490 vt 1.000000 0.316101 vt 0.911994 0.217963 vt 0.945897 0.251353 vt 0.719882 0.902458 vt 0.753784 0.885566 vt 0.653211 0.356904 vt 0.634341 0.412865 vt 0.673378 0.235182 vt 0.666392 0.296907 vt 0.665778 0.833122 vt 0.638871 0.810944 vt 0.588492 0.981594 vt 0.566119 0.963154 vt 0.790571 0.863365 vt 0.875208 0.185603 vt 0.610509 0.462642 vt 0.673902 0.174099 vt 0.564507 0.895565 vt 0.587244 0.842777 vt 0.535613 1.000000 vt 0.512891 0.982699 vt 0.539401 0.942810 vt 0.918378 0.196582 vt 0.955164 0.220312 vt 0.710614 0.871418 vt 0.747401 0.864185 vt 0.673902 0.368129 vt 0.651938 0.422412 vt 0.662841 0.694648 vt 0.653755 0.752824 vt 0.622239 0.728827 vt 0.633153 0.672043 vt 0.606737 0.786477 vt 0.987408 0.244983 vt 0.787317 0.852465 vt 0.878462 0.174703 vt 0.690166 0.913394 vt 0.678371 0.873887 vt 0.665778 0.638651 vt 0.639060 0.618307 vt 0.531131 0.871713 vt 0.551812 0.817457 vt 0.487346 0.964444 vt 0.509364 0.921345 vt 0.921632 0.173884 vt 0.959888 0.187360 vt 0.705890 0.838466 vt 0.744147 0.841487 vt 0.639733 0.569684 vt 0.609022 0.596841 vt 0.614188 0.551429 vt 0.586807 0.703506 vt 0.599777 0.648191 vt 0.570612 0.760660 vt 0.993421 0.203043 vt 0.785658 0.840894 vt 0.880121 0.163132 vt 0.672357 0.831947 vt 0.836951 0.155518 vt 0.828828 0.836710 vt 0.993421 0.160281 usemtl None s off f 12/1 11/2 26/3 27/4 f 10/5 9/6 24/7 25/8 f 8/9 7/10 22/11 23/12 f 6/13 5/14 20/15 21/16 f 4/17 3/18 18/19 19/20 f 15/21 14/22 29/23 30/24 f 2/25 1/26 16/27 17/28 f 13/29 12/30 27/31 28/32 f 11/2 10/5 25/8 26/3 f 9/6 8/9 23/12 24/7 f 7/10 6/13 21/16 22/11 f 5/14 4/17 19/20 20/15 f 3/33 2/25 17/28 18/34 f 14/22 13/29 28/32 29/23 f 22/11 21/16 36/35 37/36 f 20/15 19/20 34/37 35/38 f 18/34 17/28 32/39 33/40 f 29/23 28/32 43/41 44/42 f 27/4 26/3 41/43 42/44 f 25/8 24/7 39/45 40/46 f 23/12 22/11 37/36 38/47 f 21/16 20/15 35/38 36/35 f 19/20 18/19 33/48 34/37 f 30/24 29/23 44/42 45/49 f 17/28 16/27 31/50 32/39 f 28/32 27/31 42/51 43/41 f 26/3 25/8 40/46 41/43 f 24/7 23/12 38/47 39/45 f 37/36 36/35 51/52 52/53 f 35/38 34/37 49/54 50/55 f 33/40 32/39 47/56 48/57 f 44/42 43/41 58/58 59/59 f 42/51 41/60 56/61 57/62 f 40/46 39/45 54/63 55/64 f 38/47 37/36 52/53 53/65 f 36/35 35/38 50/55 51/52 f 34/37 33/48 48/66 49/54 f 45/49 44/42 59/59 60/67 f 32/39 31/50 46/68 47/56 f 43/41 42/51 57/62 58/58 f 41/43 40/46 55/64 56/69 f 39/45 38/47 53/65 54/63 f 52/53 51/52 66/70 67/71 f 50/55 49/54 64/72 65/73 f 48/57 47/56 62/74 63/75 f 59/59 58/58 73/76 74/77 f 57/62 56/61 71/78 72/79 f 55/64 54/63 69/80 70/81 f 53/65 52/53 67/71 68/82 f 51/52 50/55 65/73 66/70 f 49/83 48/57 63/75 64/84 f 60/67 59/59 74/77 75/85 f 47/56 46/68 61/86 62/74 f 58/58 57/62 72/79 73/76 f 56/69 55/64 70/81 71/87 f 54/63 53/65 68/82 69/80 f 67/88 66/89 81/90 82/91 f 65/92 64/93 79/94 80/95 f 63/75 62/74 77/96 78/97 f 74/77 73/76 88/98 89/99 f 72/79 71/78 86/100 87/101 f 70/81 69/80 84/102 85/103 f 68/82 67/71 82/104 83/105 f 66/89 65/92 80/95 81/90 f 64/93 63/106 78/107 79/94 f 75/85 74/77 89/99 90/108 f 62/74 61/86 76/109 77/96 f 73/76 72/79 87/101 88/98 f 71/78 70/110 85/111 86/100 f 69/80 68/82 83/105 84/102 f 82/91 81/90 96/112 97/113 f 80/95 79/94 94/114 95/115 f 78/97 77/96 92/116 93/117 f 89/99 88/98 103/118 104/119 f 87/101 86/100 101/120 102/121 f 85/122 84/123 99/124 100/125 f 83/126 82/91 97/113 98/127 f 81/90 80/95 95/115 96/112 f 79/94 78/107 93/128 94/114 f 90/108 89/99 104/119 105/129 f 77/96 76/109 91/130 92/116 f 88/98 87/101 102/121 103/118 f 86/100 85/111 100/131 101/120 f 84/123 83/126 98/127 99/124 f 97/113 96/112 111/132 112/133 f 95/115 94/114 109/134 110/135 f 93/117 92/116 107/136 108/137 f 104/119 103/118 118/138 119/139 f 102/121 101/120 116/140 117/141 f 100/125 99/124 114/142 115/143 f 98/127 97/113 112/133 113/144 f 96/112 95/115 110/135 111/132 f 94/114 93/128 108/145 109/134 f 105/129 104/119 119/139 120/146 f 92/116 91/130 106/147 107/136 f 103/118 102/121 117/141 118/138 f 101/120 100/131 115/148 116/140 f 99/124 98/127 113/144 114/142 f 112/133 111/132 126/149 127/150 f 110/135 109/134 124/151 125/152 f 108/137 107/136 122/153 123/154 f 119/139 118/138 133/155 134/156 f 117/141 116/140 131/157 132/158 f 115/143 114/142 129/159 130/160 f 113/144 112/133 127/150 128/161 f 111/132 110/135 125/152 126/149 f 109/134 108/145 123/162 124/151 f 120/146 119/139 134/156 135/163 f 107/136 106/147 121/164 122/153 f 118/138 117/141 132/158 133/155 f 116/140 115/148 130/165 131/157 f 114/142 113/144 128/161 129/159 f 127/150 126/149 141/166 142/167 f 125/152 124/151 139/168 140/169 f 123/162 122/170 137/171 138/172 f 134/156 133/155 148/173 149/174 f 132/158 131/157 146/175 147/176 f 130/160 129/159 144/177 145/178 f 128/161 127/150 142/167 143/179 f 126/149 125/152 140/169 141/166 f 124/151 123/162 138/172 139/168 f 135/163 134/156 149/174 150/180 f 122/153 121/164 136/181 137/182 f 133/155 132/158 147/176 148/173 f 131/183 130/160 145/178 146/184 f 129/159 128/161 143/179 144/177 f 142/167 141/166 156/185 157/186 f 140/169 139/168 154/187 155/188 f 138/189 137/182 152/190 153/191 f 149/174 148/173 163/192 164/193 f 147/176 146/175 161/194 162/195 f 145/178 144/177 159/196 160/197 f 143/179 142/167 157/186 158/198 f 141/166 140/169 155/188 156/185 f 139/168 138/172 153/199 154/187 f 150/180 149/174 164/193 165/200 f 137/182 136/181 151/201 152/190 f 148/173 147/176 162/195 163/192 f 146/184 145/178 160/197 161/202 f 144/177 143/179 158/198 159/196 f 157/186 156/185 171/203 172/204 f 155/188 154/187 169/205 170/206 f 153/191 152/190 167/207 168/208 f 164/193 163/192 178/209 179/210 f 162/195 161/194 176/211 177/212 f 160/197 159/196 174/213 175/214 f 158/198 157/186 172/204 173/215 f 156/185 155/188 170/206 171/203 f 154/187 153/199 168/216 169/205 f 165/200 164/193 179/210 180/217 f 152/190 151/201 166/218 167/207 f 163/192 162/195 177/212 178/209 f 161/194 160/219 175/220 176/211 f 159/196 158/198 173/215 174/213 f 172/204 171/203 186/221 187/222 f 170/206 169/205 184/223 185/224 f 168/208 167/207 182/225 183/226 f 179/210 178/209 193/227 194/228 f 177/212 176/211 191/229 192/230 f 175/214 174/213 189/231 190/232 f 173/215 172/204 187/222 188/233 f 171/203 170/206 185/224 186/221 f 169/205 168/216 183/234 184/223 f 180/217 179/210 194/228 195/235 f 167/207 166/218 181/236 182/225 f 178/209 177/212 192/230 193/227 f 176/211 175/220 190/237 191/229 f 174/213 173/215 188/233 189/231 f 187/222 186/221 201/238 202/239 f 185/224 184/223 199/240 200/241 f 183/226 182/225 197/242 198/243 f 194/228 193/227 208/244 209/245 f 192/230 191/229 206/246 207/247 f 190/248 189/249 204/250 205/251 f 188/233 187/222 202/239 203/252 f 186/221 185/224 200/241 201/238 f 184/223 183/234 198/253 199/240 f 195/235 194/228 209/245 210/254 f 182/225 181/236 196/255 197/242 f 193/227 192/230 207/247 208/244 f 191/256 190/248 205/251 206/257 f 189/249 188/258 203/259 204/250 f 202/260 201/261 216/262 217/263 f 200/241 199/240 214/264 215/265 f 198/243 197/242 212/266 213/267 f 209/245 208/244 223/268 224/269 f 207/270 206/257 221/271 222/272 f 205/251 204/250 219/273 220/274 f 203/259 202/260 217/263 218/275 f 201/261 200/276 215/277 216/262 f 199/278 198/243 213/267 214/279 f 210/254 209/245 224/269 225/280 f 197/242 196/255 211/281 212/266 f 208/244 207/247 222/282 223/268 f 206/257 205/251 220/274 221/271 f 204/250 203/259 218/275 219/273 f 217/263 216/262 231/283 232/284 f 215/277 214/285 229/286 230/287 f 213/267 212/266 227/288 228/289 f 224/269 223/268 238/290 239/291 f 222/272 221/271 236/292 237/293 f 220/274 219/273 234/294 235/295 f 218/275 217/263 232/284 233/296 f 216/262 215/277 230/287 231/283 f 214/279 213/267 228/289 229/297 f 225/280 224/269 239/291 240/298 f 212/266 211/281 226/299 227/288 f 223/268 222/282 237/300 238/290 f 221/271 220/274 235/295 236/292 f 219/273 218/275 233/296 234/294 f 232/284 231/283 246/301 247/302 f 230/287 229/286 244/303 245/304 f 228/289 227/288 242/305 243/306 f 239/291 238/290 253/307 254/308 f 237/293 236/292 251/309 252/310 f 235/295 234/294 249/311 250/312 f 233/296 232/284 247/302 248/313 f 231/283 230/287 245/304 246/301 f 229/297 228/289 243/306 244/314 f 240/298 239/291 254/308 255/315 f 227/288 226/299 241/316 242/305 f 238/290 237/300 252/317 253/307 f 236/292 235/295 250/312 251/309 f 234/294 233/296 248/313 249/311 f 247/302 246/301 261/318 262/319 f 245/304 244/303 259/320 260/321 f 243/306 242/305 257/322 258/323 f 254/308 253/307 268/324 269/325 f 252/310 251/309 266/326 267/327 f 250/312 249/311 264/328 265/329 f 248/313 247/302 262/319 263/330 f 246/301 245/304 260/321 261/318 f 244/314 243/306 258/323 259/331 f 255/315 254/308 269/325 270/332 f 242/305 241/316 256/333 257/322 f 253/334 252/310 267/327 268/335 f 251/309 250/312 265/329 266/326 f 249/311 248/313 263/330 264/328 f 262/319 261/318 276/336 277/337 f 260/321 259/320 274/338 275/339 f 258/323 257/322 272/340 273/341 f 269/325 268/324 283/342 284/343 f 267/327 266/326 281/344 282/345 f 265/329 264/328 279/346 280/347 f 263/330 262/319 277/337 278/348 f 261/318 260/321 275/339 276/336 f 259/331 258/323 273/341 274/349 f 270/332 269/325 284/343 285/350 f 257/322 256/333 271/351 272/340 f 268/335 267/327 282/345 283/352 f 266/326 265/329 280/347 281/344 f 264/328 263/330 278/348 279/346 f 277/337 276/336 291/353 292/354 f 275/355 274/349 289/356 290/357 f 273/341 272/340 287/358 288/359 f 284/343 283/342 298/360 299/361 f 282/345 281/344 296/362 297/363 f 280/347 279/346 294/364 295/365 f 278/348 277/337 292/354 293/366 f 276/336 275/339 290/367 291/353 f 274/349 273/341 288/359 289/356 f 285/350 284/343 299/361 300/368 f 272/340 271/351 286/369 287/358 f 283/352 282/345 297/363 298/370 f 281/344 280/347 295/365 296/362 f 279/346 278/348 293/366 294/364 f 292/354 291/353 306/371 307/372 f 290/357 289/356 304/373 305/374 f 288/359 287/358 302/375 303/376 f 299/361 298/360 313/377 314/378 f 297/363 296/362 311/379 312/380 f 295/365 294/364 309/381 310/382 f 293/366 292/354 307/372 308/383 f 291/353 290/367 305/384 306/371 f 289/356 288/359 303/376 304/373 f 300/368 299/361 314/378 315/385 f 287/358 286/369 301/386 302/375 f 298/360 297/387 312/388 313/377 f 296/362 295/365 310/382 311/379 f 294/364 293/366 308/383 309/381 f 307/372 306/371 321/389 322/390 f 305/374 304/373 319/391 320/392 f 303/376 302/375 317/393 318/394 f 314/378 313/377 328/395 329/396 f 312/397 311/398 326/399 327/400 f 310/401 309/402 324/403 325/404 f 308/383 307/372 322/390 323/405 f 306/406 305/374 320/392 321/407 f 304/373 303/376 318/394 319/391 f 315/385 314/378 329/396 330/408 f 302/375 301/386 316/409 317/393 f 313/410 312/397 327/400 328/411 f 311/398 310/401 325/404 326/399 f 309/381 308/383 323/405 324/412 f 322/413 321/414 337/415 338/416 f 320/392 319/391 335/417 336/418 f 318/394 317/393 333/419 334/420 f 329/396 328/395 344/421 345/422 f 327/400 326/399 342/423 343/424 f 325/404 324/403 340/425 341/426 f 323/427 322/413 338/416 339/428 f 321/407 320/392 336/418 337/429 f 319/391 318/394 334/420 335/417 f 330/408 329/396 345/422 346/430 f 317/393 316/409 332/431 333/419 f 328/411 327/400 343/424 344/432 f 326/399 325/404 341/426 342/423 f 324/403 323/427 339/428 340/425 f 338/416 337/415 352/433 353/434 f 336/418 335/417 350/435 351/436 f 334/420 333/419 348/437 349/438 f 345/422 344/421 359/439 360/440 f 343/424 342/423 357/441 358/442 f 341/426 340/425 355/443 356/444 f 339/428 338/416 353/434 354/445 f 337/429 336/418 351/436 352/446 f 335/417 334/420 349/438 350/435 f 346/430 345/422 360/440 361/447 f 333/419 332/431 347/448 348/437 f 344/432 343/424 358/442 359/449 f 342/423 341/426 356/444 357/441 f 340/425 339/428 354/445 355/443 f 353/434 352/433 367/450 368/451 f 351/436 350/435 365/452 366/453 f 349/438 348/437 363/454 364/455 f 360/440 359/439 374/456 375/457 f 358/442 357/441 372/458 373/459 f 356/444 355/443 370/460 371/461 f 354/445 353/434 368/451 369/462 f 352/446 351/436 366/453 367/463 f 350/435 349/438 364/455 365/452 f 361/447 360/440 375/457 376/464 f 348/437 347/448 362/465 363/454 f 359/449 358/442 373/459 374/466 f 357/441 356/444 371/461 372/458 f 355/443 354/445 369/462 370/460 f 368/451 367/450 382/467 383/468 f 366/453 365/452 380/469 381/470 f 364/455 363/454 378/471 379/472 f 375/473 374/466 389/474 390/475 f 373/459 372/458 387/476 388/477 f 371/461 370/460 385/478 386/479 f 369/462 368/451 383/468 384/480 f 367/450 366/481 381/482 382/467 f 365/452 364/455 379/472 380/469 f 376/464 375/457 390/483 391/484 f 363/454 362/465 377/485 378/471 f 374/466 373/459 388/477 389/474 f 372/458 371/461 386/479 387/476 f 370/460 369/462 384/480 385/478 f 383/468 382/467 397/486 398/487 f 381/470 380/469 395/488 396/489 f 379/472 378/471 393/490 394/491 f 390/483 389/492 404/493 405/494 f 388/477 387/476 402/495 403/496 f 386/479 385/478 400/497 401/498 f 384/480 383/468 398/487 399/499 f 382/467 381/482 396/500 397/486 f 380/469 379/472 394/491 395/488 f 391/484 390/483 405/494 406/501 f 378/471 377/485 392/502 393/490 f 389/474 388/477 403/496 404/503 f 387/476 386/479 401/498 402/495 f 385/478 384/480 399/499 400/497 f 398/487 397/486 412/504 413/505 f 396/489 395/488 410/506 411/507 f 394/491 393/490 408/508 409/509 f 405/494 404/493 419/510 420/511 f 403/496 402/495 417/512 418/513 f 401/498 400/497 415/514 416/515 f 399/499 398/487 413/505 414/516 f 397/517 396/489 411/507 412/518 f 395/488 394/491 409/509 410/506 f 406/501 405/494 420/511 421/519 f 393/490 392/502 407/520 408/508 f 404/503 403/496 418/513 419/521 f 402/495 401/498 416/515 417/512 f 400/497 399/499 414/516 415/514 f 413/505 412/504 427/522 428/523 f 411/507 410/506 425/524 426/525 f 409/509 408/508 423/526 424/527 f 420/511 419/510 434/528 435/529 f 418/513 417/512 432/530 433/531 f 416/515 415/514 430/532 431/533 f 414/516 413/505 428/523 429/534 f 412/518 411/507 426/525 427/535 f 410/506 409/509 424/527 425/524 f 421/519 420/511 435/529 436/536 f 408/508 407/520 422/537 423/526 f 419/521 418/513 433/531 434/538 f 417/512 416/515 431/533 432/530 f 415/514 414/516 429/534 430/532 f 428/539 427/540 442/541 443/542 f 426/525 425/524 440/543 441/544 f 424/527 423/526 438/545 439/546 f 435/529 434/528 449/547 450/548 f 433/531 432/530 447/549 448/550 f 431/533 430/532 445/551 446/552 f 429/553 428/539 443/542 444/554 f 427/540 426/555 441/556 442/541 f 425/524 424/527 439/546 440/543 f 436/536 435/529 450/548 451/557 f 423/526 422/537 437/558 438/545 f 434/538 433/531 448/550 449/559 f 432/530 431/533 446/552 447/549 f 430/532 429/534 444/560 445/551 f 443/542 442/541 458/561 459/562 f 441/556 440/563 456/564 457/565 f 439/546 438/545 454/566 455/567 f 450/548 449/547 465/568 466/569 f 448/550 447/549 463/570 464/571 f 446/572 445/573 461/574 462/575 f 444/554 443/542 459/562 460/576 f 442/541 441/556 457/565 458/561 f 440/543 439/546 455/567 456/577 f 451/557 450/548 466/569 467/578 f 438/545 437/558 453/579 454/566 f 449/547 448/580 464/581 465/568 f 447/582 446/572 462/575 463/583 f 445/573 444/554 460/576 461/574 f 459/562 458/561 473/584 474/585 f 457/565 456/564 471/586 472/587 f 455/567 454/566 469/588 470/589 f 466/569 465/568 480/590 481/591 f 464/592 463/583 478/593 479/594 f 462/575 461/574 476/595 477/596 f 460/576 459/562 474/585 475/597 f 458/561 457/565 472/587 473/584 f 456/577 455/567 470/589 471/598 f 467/578 466/569 481/591 482/599 f 454/566 453/579 468/600 469/588 f 465/568 464/581 479/601 480/590 f 463/583 462/575 477/596 478/593 f 461/574 460/576 475/597 476/595 f 1/26 452/602 16/27 f 331/603 15/21 30/24 f 331/603 30/24 45/49 f 16/27 452/602 31/50 f 331/603 45/49 60/67 f 31/50 452/602 46/68 f 331/603 60/67 75/85 f 46/68 452/602 61/86 f 331/603 75/85 90/108 f 61/86 452/602 76/109 f 331/603 90/108 105/129 f 76/109 452/602 91/130 f 331/603 105/129 120/146 f 91/130 452/602 106/147 f 331/603 120/146 135/163 f 106/147 452/602 121/164 f 331/603 135/163 150/180 f 121/164 452/602 136/181 f 331/603 150/180 165/200 f 136/181 452/602 151/201 f 331/603 165/200 180/217 f 151/201 452/602 166/218 f 331/603 180/217 195/235 f 166/218 452/602 181/236 f 331/603 195/235 210/254 f 181/236 452/602 196/255 f 331/603 210/254 225/280 f 196/255 452/602 211/281 f 331/603 225/280 240/298 f 211/281 452/602 226/299 f 331/603 240/298 255/315 f 226/299 452/602 241/316 f 331/603 255/315 270/332 f 241/316 452/602 256/333 f 331/603 270/332 285/350 f 256/333 452/602 271/351 f 331/603 285/350 300/368 f 271/351 452/602 286/369 f 331/603 300/368 315/385 f 286/369 452/602 301/386 f 331/603 315/385 330/408 f 301/386 452/602 316/409 f 331/603 330/408 346/430 f 316/409 452/602 332/431 f 331/603 346/430 361/447 f 332/431 452/602 347/448 f 331/603 361/447 376/464 f 347/448 452/602 362/465 f 331/603 376/464 391/484 f 362/465 452/602 377/485 f 331/603 391/484 406/501 f 377/485 452/602 392/502 f 331/603 406/501 421/519 f 392/502 452/602 407/520 f 331/603 421/519 436/536 f 407/520 452/602 422/537 f 331/603 436/536 451/557 f 422/537 452/602 437/558 f 331/603 451/557 467/578 f 437/558 452/602 453/579 f 331/603 467/578 482/599 f 453/579 452/602 468/600 f 474/585 473/584 6/13 7/10 f 472/587 471/586 4/17 5/14 f 331/603 482/599 15/21 f 470/589 469/588 2/25 3/33 f 481/591 480/590 13/29 14/22 f 468/600 452/602 1/26 f 479/594 478/593 11/2 12/1 f 477/596 476/595 9/6 10/5 f 475/597 474/585 7/10 8/9 f 473/584 472/587 5/14 6/13 f 471/598 470/589 3/33 4/604 f 482/599 481/591 14/22 15/21 f 469/588 468/600 1/26 2/25 f 480/590 479/601 12/30 13/29 f 478/593 477/596 10/5 11/2 f 476/595 475/597 8/9 9/6 opensurgsim-0.7.0/SurgSim/Testing/Data/Geometry/staple.ply000066400000000000000000000033451277777236100236110ustar00rootroot00000000000000ply format ascii 1.0 comment Created by hand element dimension 1 property uint x property uint y property uint z element spacing 1 property double x property double y property double z element bounds 1 property double xMin property double xMax property double yMin property double yMax property double zMin property double zMax element voxel 23 property double x property double y property double z end_header 7 11 1 0.001 0.001 0.001 -0.00207699998282 0.00480100000277 -0.00532899983227 0.00532899983227 -0.000403999991249 0.000403999991249 -0.000576999982819 -0.00482899983227 9.60000087507e-05 0.000423000017181 -0.00482899983227 9.60000087507e-05 0.00142300001718 -0.00482899983227 9.60000087507e-05 0.00242300001718 -0.00482899983227 9.60000087507e-05 0.00342300001718 -0.00482899983227 9.60000087507e-05 -0.00157699998282 -0.00382899983227 9.60000087507e-05 0.00442300001718 -0.00382899983227 9.60000087507e-05 -0.00157699998282 -0.00282899983227 9.60000087507e-05 0.00442300001718 -0.00282899983227 9.60000087507e-05 -0.00157699998282 -0.00182899983227 9.60000087507e-05 0.00442300001718 -0.00182899983227 9.60000087507e-05 -0.00157699998282 -0.000828999832273 9.60000087507e-05 -0.00157699998282 0.000171000167727 9.60000087507e-05 -0.00157699998282 0.00117100016773 9.60000087507e-05 -0.00157699998282 0.00217100016773 9.60000087507e-05 0.00442300001718 0.00217100016773 9.60000087507e-05 -0.00157699998282 0.00317100016773 9.60000087507e-05 0.00442300001718 0.00317100016773 9.60000087507e-05 -0.00157699998282 0.00417100016773 9.60000087507e-05 0.00442300001718 0.00417100016773 9.60000087507e-05 0.000423000017181 0.00517100016773 9.60000087507e-05 0.00142300001718 0.00517100016773 9.60000087507e-05 0.00242300001718 0.00517100016773 9.60000087507e-05 opensurgsim-0.7.0/SurgSim/Testing/Data/Geometry/staple_collision.ply000066400000000000000000000760741277777236100256750ustar00rootroot00000000000000ply format ascii 1.0 comment Created by Blender 2.69 (sub 0) - www.blender.org, source file: '' element vertex 504 property float x property float y property float z property float nx property float ny property float nz element face 224 property list uchar uint vertex_indices end_header 0.004801 0.000394 0.002520 0.934616 0.000000 -0.355657 0.004801 -0.000394 0.002520 0.934616 0.000000 -0.355657 0.003882 0.000000 0.000105 0.934616 0.000000 -0.355657 0.003892 0.000391 0.003619 -0.833198 0.000000 -0.552975 0.003892 -0.000391 0.003619 -0.833198 0.000000 -0.552975 0.003596 -0.000404 0.004065 -0.833198 0.000000 -0.552975 0.003596 0.000404 0.004065 -0.833198 -0.000000 -0.552975 0.004153 0.000404 0.004621 0.826688 -0.000000 0.562660 0.004153 -0.000404 0.004621 0.826688 -0.000000 0.562660 0.004592 -0.000391 0.003976 0.826688 -0.000000 0.562660 0.004592 0.000391 0.003976 0.826688 0.000000 0.562660 0.003596 0.000404 0.004065 -0.579143 0.000000 -0.815226 0.003596 -0.000404 0.004065 -0.579143 0.000000 -0.815226 0.003154 -0.000391 0.004379 -0.579143 0.000000 -0.815226 0.003154 0.000391 0.004379 -0.579143 -0.000000 -0.815226 0.004002 0.000391 0.003100 -0.978269 0.000000 -0.207340 0.004002 -0.000391 0.003100 -0.978269 0.000000 -0.207340 0.003892 -0.000391 0.003619 -0.978269 0.000000 -0.207340 0.003892 0.000391 0.003619 -0.978269 -0.000000 -0.207340 0.003154 0.000391 0.004379 -0.276560 0.000000 -0.960997 0.003154 -0.000391 0.004379 -0.276560 0.000000 -0.960997 0.002671 -0.000394 0.004518 -0.276560 0.000000 -0.960997 0.002671 0.000394 0.004518 -0.276560 -0.000000 -0.960997 0.003468 0.000391 0.005101 0.573863 -0.000000 0.818951 0.003468 -0.000391 0.005101 0.573863 -0.000000 0.818951 0.004153 -0.000404 0.004621 0.573863 -0.000000 0.818951 0.004153 0.000404 0.004621 0.573863 0.000000 0.818951 0.002757 0.000394 0.005300 0.269529 -0.000000 0.962992 0.002757 -0.000394 0.005300 0.269529 -0.000000 0.962992 0.003468 -0.000391 0.005101 0.269529 -0.000000 0.962992 0.003468 0.000391 0.005101 0.269529 0.000000 0.962992 0.004783 0.000391 0.003198 0.971162 -0.000000 0.238421 0.004592 0.000391 0.003976 0.971162 -0.000000 0.238421 0.004592 -0.000391 0.003976 0.971162 -0.000000 0.238421 0.004783 -0.000391 0.003198 0.971162 0.000000 0.238421 0.004013 0.000394 0.002520 -0.999820 0.000000 -0.018962 0.004013 -0.000394 0.002520 -0.999820 0.000000 -0.018962 0.004002 -0.000391 0.003100 -0.999820 0.000000 -0.018962 0.004002 0.000391 0.003100 -0.999820 -0.000000 -0.018962 0.004783 0.000391 0.003198 -0.000000 1.000000 0.000000 0.004002 0.000391 0.003100 -0.000000 1.000000 0.000000 0.003892 0.000391 0.003619 -0.000000 1.000000 0.000000 0.004592 0.000391 0.003976 0.000000 1.000000 0.000000 0.003596 0.000404 0.004065 0.011978 0.999856 -0.012000 0.004153 0.000404 0.004621 0.011978 0.999856 -0.012000 0.004592 0.000391 0.003976 0.011978 0.999856 -0.012000 0.003596 0.000404 0.004065 0.011103 0.999701 -0.021770 0.004592 0.000391 0.003976 0.011103 0.999701 -0.021770 0.003892 0.000391 0.003619 0.011103 0.999701 -0.021770 0.003154 0.000391 0.004379 -0.014544 0.999874 0.006325 0.003468 0.000391 0.005101 -0.014544 0.999874 0.006325 0.004153 0.000404 0.004621 -0.014544 0.999874 0.006325 0.003154 0.000391 0.004379 -0.017178 0.999704 0.017209 0.004153 0.000404 0.004621 -0.017178 0.999704 0.017209 0.003596 0.000404 0.004065 -0.017178 0.999704 0.017209 0.002671 0.000394 0.004518 0.004093 0.999992 -0.000450 0.002757 0.000394 0.005300 0.004093 0.999992 -0.000450 0.003468 0.000391 0.005101 0.004093 0.999992 -0.000450 0.002671 0.000394 0.004518 0.005520 0.999982 -0.002401 0.003468 0.000391 0.005101 0.005520 0.999982 -0.002401 0.003154 0.000391 0.004379 0.005520 0.999982 -0.002401 0.002757 -0.000394 0.005300 0.006021 -0.999982 -0.000662 0.002671 -0.000394 0.004518 0.006021 -0.999982 -0.000662 0.003154 -0.000391 0.004379 0.006021 -0.999982 -0.000662 0.002757 -0.000394 0.005300 0.003762 -0.999992 -0.001636 0.003154 -0.000391 0.004379 0.003762 -0.999992 -0.001636 0.003468 -0.000391 0.005101 0.003762 -0.999992 -0.001636 0.003596 -0.000404 0.004065 -0.011149 -0.999875 0.011169 0.004153 -0.000404 0.004621 -0.011149 -0.999875 0.011169 0.003468 -0.000391 0.005101 -0.011149 -0.999875 0.011169 0.003596 -0.000404 0.004065 -0.022463 -0.999700 0.009769 0.003468 -0.000391 0.005101 -0.022463 -0.999700 0.009769 0.003154 -0.000391 0.004379 -0.022463 -0.999700 0.009769 0.003892 -0.000391 0.003619 0.007629 -0.999859 -0.014959 0.004592 -0.000391 0.003976 0.007629 -0.999859 -0.014959 0.004153 -0.000404 0.004621 0.007629 -0.999859 -0.014959 0.003892 -0.000391 0.003619 0.017496 -0.999693 -0.017527 0.004153 -0.000404 0.004621 0.017496 -0.999693 -0.017527 0.003596 -0.000404 0.004065 0.017496 -0.999693 -0.017527 0.004002 -0.000391 0.003100 0.000000 -1.000000 -0.000000 0.004783 -0.000391 0.003198 0.000000 -1.000000 -0.000000 0.004592 -0.000391 0.003976 0.000000 -1.000000 -0.000000 0.003892 -0.000391 0.003619 0.000000 -1.000000 -0.000000 -0.001127 0.000391 -0.003682 -0.017168 0.999705 0.017168 -0.000813 0.000404 -0.004125 -0.017168 0.999705 0.017168 -0.001369 0.000404 -0.004681 -0.017168 0.999705 0.017168 -0.001127 0.000391 -0.003682 -0.006315 0.999874 0.014541 -0.001369 0.000404 -0.004681 -0.006315 0.999874 0.014541 -0.001850 0.000391 -0.003996 -0.006315 0.999874 0.014541 -0.000813 0.000404 -0.004125 0.021782 0.999701 -0.011124 -0.000367 0.000391 -0.004420 0.021782 0.999701 -0.011124 -0.000725 0.000391 -0.005121 0.021782 0.999701 -0.011124 -0.000813 0.000404 -0.004125 0.011991 0.999856 -0.011991 -0.000725 0.000391 -0.005121 0.011991 0.999856 -0.011991 -0.001369 0.000404 -0.004681 0.011991 0.999856 -0.011991 0.000053 0.000391 -0.005311 0.000000 1.000000 0.000000 -0.000725 0.000391 -0.005121 0.000000 1.000000 0.000000 -0.000367 0.000391 -0.004420 0.000000 1.000000 0.000000 0.000152 0.000391 -0.004530 0.000000 1.000000 0.000000 -0.000367 0.000391 -0.004420 0.551676 -0.000000 0.834059 -0.000813 0.000404 -0.004125 0.551676 -0.000000 0.834059 -0.000813 -0.000404 -0.004125 0.551676 -0.000000 0.834059 -0.000367 -0.000391 -0.004420 0.551676 0.000000 0.834059 -0.001369 0.000404 -0.004681 -0.564132 0.000000 -0.825684 -0.000725 0.000391 -0.005121 -0.564132 0.000000 -0.825684 -0.000725 -0.000391 -0.005121 -0.564132 0.000000 -0.825684 -0.001369 -0.000404 -0.004681 -0.564132 0.000000 -0.825684 -0.000813 0.000404 -0.004125 0.815843 -0.000000 0.578273 -0.001127 0.000391 -0.003682 0.815843 -0.000000 0.578273 -0.001127 -0.000391 -0.003682 0.815843 -0.000000 0.578273 -0.000813 -0.000404 -0.004125 0.815843 0.000000 0.578273 0.000152 0.000391 -0.004530 0.207340 -0.000000 0.978269 -0.000367 0.000391 -0.004420 0.207340 -0.000000 0.978269 -0.000367 -0.000391 -0.004420 0.207340 -0.000000 0.978269 0.000152 -0.000391 -0.004530 0.207340 0.000000 0.978269 -0.001127 0.000391 -0.003682 0.960844 -0.000000 0.277090 -0.001266 0.000394 -0.003200 0.960844 -0.000000 0.277090 -0.001266 -0.000394 -0.003200 0.960844 -0.000000 0.277090 -0.001127 -0.000391 -0.003682 0.960844 0.000000 0.277090 -0.001850 0.000391 -0.003996 -0.818389 0.000000 -0.574665 -0.001369 0.000404 -0.004681 -0.818389 0.000000 -0.574665 -0.001369 -0.000404 -0.004681 -0.818389 0.000000 -0.574665 -0.001850 -0.000391 -0.003996 -0.818389 0.000000 -0.574665 -0.002048 0.000394 -0.003285 -0.963343 0.000000 -0.268273 -0.001850 0.000391 -0.003996 -0.963343 0.000000 -0.268273 -0.001850 -0.000391 -0.003996 -0.963343 0.000000 -0.268273 -0.002048 -0.000394 -0.003285 -0.963343 0.000000 -0.268273 0.000053 0.000391 -0.005311 -0.237244 0.000000 -0.971450 0.000053 -0.000391 -0.005311 -0.237244 0.000000 -0.971450 -0.000725 -0.000391 -0.005121 -0.237244 0.000000 -0.971450 -0.000725 0.000391 -0.005121 -0.237244 -0.000000 -0.971450 -0.001266 0.000394 -0.003200 0.002402 0.999982 -0.005531 -0.001127 0.000391 -0.003682 0.002402 0.999982 -0.005531 -0.001850 0.000391 -0.003996 0.002402 0.999982 -0.005531 -0.001266 0.000394 -0.003200 0.000445 0.999992 -0.004095 -0.001850 0.000391 -0.003996 0.000445 0.999992 -0.004095 -0.002048 0.000394 -0.003285 0.000445 0.999992 -0.004095 -0.002048 -0.000394 -0.003285 0.001635 -0.999992 -0.003764 -0.001850 -0.000391 -0.003996 0.001635 -0.999992 -0.003764 -0.001127 -0.000391 -0.003682 0.001635 -0.999992 -0.003764 -0.002048 -0.000394 -0.003285 0.000656 -0.999982 -0.006035 -0.001127 -0.000391 -0.003682 0.000656 -0.999982 -0.006035 -0.001266 -0.000394 -0.003200 0.000656 -0.999982 -0.006035 -0.000813 -0.000404 -0.004125 -0.009742 -0.999701 0.022431 -0.001127 -0.000391 -0.003682 -0.009742 -0.999701 0.022431 -0.001850 -0.000391 -0.003996 -0.009742 -0.999701 0.022431 -0.000813 -0.000404 -0.004125 -0.011148 -0.999876 0.011148 -0.001850 -0.000391 -0.003996 -0.011148 -0.999876 0.011148 -0.001369 -0.000404 -0.004681 -0.011148 -0.999876 0.011148 -0.000367 -0.000391 -0.004420 0.017538 -0.999692 -0.017538 -0.000813 -0.000404 -0.004125 0.017538 -0.999692 -0.017538 -0.001369 -0.000404 -0.004681 0.017538 -0.999692 -0.017538 -0.000367 -0.000391 -0.004420 0.014963 -0.999859 -0.007641 -0.001369 -0.000404 -0.004681 0.014963 -0.999859 -0.007641 -0.000725 -0.000391 -0.005121 0.014963 -0.999859 -0.007641 0.000152 -0.000391 -0.004530 0.000000 -1.000000 0.000000 -0.000367 -0.000391 -0.004420 0.000000 -1.000000 0.000000 -0.000725 -0.000391 -0.005121 0.000000 -1.000000 0.000000 0.000053 -0.000391 -0.005311 0.000000 -1.000000 0.000000 -0.002077 0.000394 0.002660 -0.998925 0.000000 0.046350 -0.002077 -0.000394 0.002660 -0.998925 0.000000 0.046350 -0.002048 -0.000394 0.003285 -0.998925 0.000000 0.046350 -0.002048 0.000394 0.003285 -0.998925 0.000000 0.046350 0.000053 0.000391 0.005311 -0.237244 0.000000 0.971450 -0.000725 0.000391 0.005121 -0.237244 0.000000 0.971450 -0.000725 -0.000391 0.005121 -0.237244 0.000000 0.971450 0.000053 -0.000391 0.005311 -0.237244 0.000000 0.971450 -0.002048 0.000394 0.003285 -0.963343 0.000000 0.268273 -0.002048 -0.000394 0.003285 -0.963343 0.000000 0.268273 -0.001850 -0.000391 0.003996 -0.963343 0.000000 0.268273 -0.001850 0.000391 0.003996 -0.963343 0.000000 0.268273 -0.001850 0.000391 0.003996 -0.818389 0.000000 0.574665 -0.001850 -0.000391 0.003996 -0.818389 0.000000 0.574665 -0.001369 -0.000404 0.004681 -0.818389 0.000000 0.574665 -0.001369 0.000404 0.004681 -0.818389 0.000000 0.574665 -0.001127 0.000391 0.003682 0.960844 0.000000 -0.277090 -0.001127 -0.000391 0.003682 0.960844 0.000000 -0.277090 -0.001266 -0.000394 0.003200 0.960844 0.000000 -0.277090 -0.001266 0.000394 0.003200 0.960844 0.000000 -0.277090 -0.001289 0.000394 -0.002660 1.000000 -0.000000 0.000000 -0.001289 0.000394 0.002660 1.000000 -0.000000 0.000000 -0.001289 -0.000394 0.002660 1.000000 -0.000000 0.000000 -0.001289 -0.000394 -0.002660 1.000000 -0.000000 0.000000 -0.002077 0.000394 0.002660 -1.000000 0.000000 0.000000 -0.002077 0.000394 -0.002660 -1.000000 0.000000 0.000000 -0.002077 -0.000394 -0.002660 -1.000000 0.000000 0.000000 -0.002077 -0.000394 0.002660 -1.000000 0.000000 0.000000 -0.001289 -0.000394 -0.002660 0.000000 -1.000000 0.000000 -0.001289 -0.000394 0.002660 0.000000 -1.000000 0.000000 -0.002077 -0.000394 0.002660 0.000000 -1.000000 0.000000 -0.002077 -0.000394 -0.002660 0.000000 -1.000000 0.000000 -0.002077 0.000394 -0.002660 0.000000 1.000000 0.000000 -0.002077 0.000394 0.002660 0.000000 1.000000 0.000000 -0.001289 0.000394 0.002660 0.000000 1.000000 0.000000 -0.001289 0.000394 -0.002660 0.000000 1.000000 -0.000000 0.000152 0.000391 0.004530 0.207340 0.000000 -0.978269 0.000152 -0.000391 0.004530 0.207340 0.000000 -0.978269 -0.000367 -0.000391 0.004420 0.207340 0.000000 -0.978269 -0.000367 0.000391 0.004420 0.207340 0.000000 -0.978269 -0.000813 0.000404 0.004125 0.815843 0.000000 -0.578273 -0.000813 -0.000404 0.004125 0.815843 0.000000 -0.578273 -0.001127 -0.000391 0.003682 0.815843 0.000000 -0.578273 -0.001127 0.000391 0.003682 0.815843 0.000000 -0.578273 -0.001369 0.000404 0.004681 -0.564132 0.000000 0.825684 -0.001369 -0.000404 0.004681 -0.564132 0.000000 0.825684 -0.000725 -0.000391 0.005121 -0.564132 0.000000 0.825684 -0.000725 0.000391 0.005121 -0.564132 0.000000 0.825684 -0.000367 0.000391 0.004420 0.551676 0.000000 -0.834059 -0.000367 -0.000391 0.004420 0.551676 0.000000 -0.834059 -0.000813 -0.000404 0.004125 0.551676 0.000000 -0.834059 -0.000813 0.000404 0.004125 0.551676 0.000000 -0.834059 -0.001266 0.000394 0.003200 0.999094 0.000000 -0.042554 -0.001266 -0.000394 0.003200 0.999094 0.000000 -0.042554 -0.001289 -0.000394 0.002660 0.999094 0.000000 -0.042554 -0.001289 0.000394 0.002660 0.999094 0.000000 -0.042554 0.000053 0.000391 0.005311 0.000000 1.000000 -0.000000 0.000152 0.000391 0.004530 0.000000 1.000000 -0.000000 -0.000367 0.000391 0.004420 0.000000 1.000000 -0.000000 -0.000725 0.000391 0.005121 -0.000000 1.000000 0.000000 -0.000813 0.000404 0.004125 0.011991 0.999856 0.011991 -0.001369 0.000404 0.004681 0.011991 0.999856 0.011991 -0.000725 0.000391 0.005121 0.011991 0.999856 0.011991 -0.000813 0.000404 0.004125 0.021782 0.999701 0.011124 -0.000725 0.000391 0.005121 0.021782 0.999701 0.011124 -0.000367 0.000391 0.004420 0.021782 0.999701 0.011124 -0.001127 0.000391 0.003682 -0.006315 0.999874 -0.014541 -0.001850 0.000391 0.003996 -0.006315 0.999874 -0.014541 -0.001369 0.000404 0.004681 -0.006315 0.999874 -0.014541 -0.001127 0.000391 0.003682 -0.017168 0.999705 -0.017168 -0.001369 0.000404 0.004681 -0.017168 0.999705 -0.017168 -0.000813 0.000404 0.004125 -0.017168 0.999705 -0.017168 -0.001266 0.000394 0.003200 0.000445 0.999992 0.004095 -0.002048 0.000394 0.003285 0.000445 0.999992 0.004095 -0.001850 0.000391 0.003996 0.000445 0.999992 0.004095 -0.001266 0.000394 0.003200 0.002402 0.999982 0.005531 -0.001850 0.000391 0.003996 0.002402 0.999982 0.005531 -0.001127 0.000391 0.003682 0.002402 0.999982 0.005531 -0.001266 0.000394 0.003200 0.000000 1.000000 0.000000 -0.002048 0.000394 0.003285 -0.000000 1.000000 0.000000 -0.002048 -0.000394 0.003285 0.000000 -1.000000 0.000000 -0.001266 -0.000394 0.003200 -0.000000 -1.000000 0.000000 -0.002048 -0.000394 0.003285 0.000656 -0.999982 0.006035 -0.001266 -0.000394 0.003200 0.000656 -0.999982 0.006035 -0.001127 -0.000391 0.003682 0.000656 -0.999982 0.006035 -0.002048 -0.000394 0.003285 0.001635 -0.999992 0.003764 -0.001127 -0.000391 0.003682 0.001635 -0.999992 0.003764 -0.001850 -0.000391 0.003996 0.001635 -0.999992 0.003764 -0.000813 -0.000404 0.004125 -0.011148 -0.999876 -0.011148 -0.001369 -0.000404 0.004681 -0.011148 -0.999876 -0.011148 -0.001850 -0.000391 0.003996 -0.011148 -0.999876 -0.011148 -0.000813 -0.000404 0.004125 -0.009742 -0.999701 -0.022431 -0.001850 -0.000391 0.003996 -0.009742 -0.999701 -0.022431 -0.001127 -0.000391 0.003682 -0.009742 -0.999701 -0.022431 -0.000367 -0.000391 0.004420 0.014963 -0.999859 0.007641 -0.000725 -0.000391 0.005121 0.014963 -0.999859 0.007641 -0.001369 -0.000404 0.004681 0.014963 -0.999859 0.007641 -0.000367 -0.000391 0.004420 0.017538 -0.999692 0.017538 -0.001369 -0.000404 0.004681 0.017538 -0.999692 0.017538 -0.000813 -0.000404 0.004125 0.017538 -0.999692 0.017538 0.000152 -0.000391 0.004530 0.000000 -1.000000 0.000000 0.000053 -0.000391 0.005311 0.000000 -1.000000 0.000000 -0.000725 -0.000391 0.005121 0.000000 -1.000000 0.000000 -0.000367 -0.000391 0.004420 0.000000 -1.000000 0.000000 -0.001266 0.000394 -0.003200 0.999094 -0.000000 0.042554 -0.001289 0.000394 -0.002660 0.999094 -0.000000 0.042554 -0.001289 -0.000394 -0.002660 0.999094 -0.000000 0.042554 -0.001266 -0.000394 -0.003200 0.999094 0.000000 0.042554 -0.001266 0.000394 -0.003200 -0.000000 1.000000 0.000000 -0.002048 0.000394 -0.003285 -0.000000 1.000000 0.000000 -0.002048 -0.000394 -0.003285 0.000000 -1.000000 -0.000000 -0.001266 -0.000394 -0.003200 0.000000 -1.000000 -0.000000 -0.002077 0.000394 -0.002660 -0.998925 0.000000 -0.046350 -0.002048 0.000394 -0.003285 -0.998925 0.000000 -0.046350 -0.002048 -0.000394 -0.003285 -0.998925 0.000000 -0.046350 -0.002077 -0.000394 -0.002660 -0.998925 0.000000 -0.046350 0.003892 0.000391 -0.003619 -0.833198 0.000000 0.552975 0.003596 0.000404 -0.004065 -0.833198 0.000000 0.552975 0.003596 -0.000404 -0.004065 -0.833198 0.000000 0.552975 0.003892 -0.000391 -0.003619 -0.833198 0.000000 0.552975 0.004153 0.000404 -0.004621 0.826688 0.000000 -0.562660 0.004592 0.000391 -0.003976 0.826688 0.000000 -0.562660 0.004592 -0.000391 -0.003976 0.826688 0.000000 -0.562660 0.004153 -0.000404 -0.004621 0.826688 0.000000 -0.562660 0.003596 0.000404 -0.004065 -0.579143 0.000000 0.815226 0.003154 0.000391 -0.004379 -0.579143 0.000000 0.815226 0.003154 -0.000391 -0.004379 -0.579143 0.000000 0.815226 0.003596 -0.000404 -0.004065 -0.579143 0.000000 0.815226 0.004002 0.000391 -0.003100 -0.978269 0.000000 0.207340 0.003892 0.000391 -0.003619 -0.978269 0.000000 0.207340 0.003892 -0.000391 -0.003619 -0.978269 0.000000 0.207340 0.004002 -0.000391 -0.003100 -0.978269 0.000000 0.207340 0.003154 0.000391 -0.004379 -0.276560 0.000000 0.960997 0.002671 0.000394 -0.004518 -0.276560 0.000000 0.960997 0.002671 -0.000394 -0.004518 -0.276560 0.000000 0.960997 0.003154 -0.000391 -0.004379 -0.276560 0.000000 0.960997 0.003468 0.000391 -0.005101 0.573863 0.000000 -0.818951 0.004153 0.000404 -0.004621 0.573863 0.000000 -0.818951 0.004153 -0.000404 -0.004621 0.573863 0.000000 -0.818951 0.003468 -0.000391 -0.005101 0.573863 0.000000 -0.818951 0.002757 0.000394 -0.005300 0.269529 0.000000 -0.962992 0.003468 0.000391 -0.005101 0.269529 0.000000 -0.962992 0.003468 -0.000391 -0.005101 0.269529 0.000000 -0.962992 0.002757 -0.000394 -0.005300 0.269529 0.000000 -0.962992 0.004783 0.000391 -0.003198 0.971162 0.000000 -0.238421 0.004783 -0.000391 -0.003198 0.971162 0.000000 -0.238421 0.004592 -0.000391 -0.003976 0.971162 0.000000 -0.238421 0.004592 0.000391 -0.003976 0.971162 0.000000 -0.238421 0.004783 0.000391 -0.003198 -0.000000 1.000000 0.000000 0.004592 0.000391 -0.003976 -0.000000 1.000000 0.000000 0.003892 0.000391 -0.003619 -0.000000 1.000000 0.000000 0.004002 0.000391 -0.003100 -0.000000 1.000000 0.000000 0.003596 0.000404 -0.004065 0.011103 0.999701 0.021770 0.003892 0.000391 -0.003619 0.011103 0.999701 0.021770 0.004592 0.000391 -0.003976 0.011103 0.999701 0.021770 0.003596 0.000404 -0.004065 0.011978 0.999856 0.012000 0.004592 0.000391 -0.003976 0.011978 0.999856 0.012000 0.004153 0.000404 -0.004621 0.011978 0.999856 0.012000 0.003154 0.000391 -0.004379 -0.017178 0.999704 -0.017209 0.003596 0.000404 -0.004065 -0.017178 0.999704 -0.017209 0.004153 0.000404 -0.004621 -0.017178 0.999704 -0.017209 0.003154 0.000391 -0.004379 -0.014544 0.999874 -0.006325 0.004153 0.000404 -0.004621 -0.014544 0.999874 -0.006325 0.003468 0.000391 -0.005101 -0.014544 0.999874 -0.006325 0.002671 0.000394 -0.004518 0.005520 0.999982 0.002401 0.003154 0.000391 -0.004379 0.005520 0.999982 0.002401 0.003468 0.000391 -0.005101 0.005520 0.999982 0.002401 0.002671 0.000394 -0.004518 0.004093 0.999992 0.000450 0.003468 0.000391 -0.005101 0.004093 0.999992 0.000450 0.002757 0.000394 -0.005300 0.004093 0.999992 0.000450 0.002757 -0.000394 -0.005300 0.003761 -0.999992 0.001636 0.003468 -0.000391 -0.005101 0.003761 -0.999992 0.001636 0.003154 -0.000391 -0.004379 0.003761 -0.999992 0.001636 0.002757 -0.000394 -0.005300 0.006021 -0.999982 0.000662 0.003154 -0.000391 -0.004379 0.006021 -0.999982 0.000662 0.002671 -0.000394 -0.004518 0.006021 -0.999982 0.000662 0.003596 -0.000404 -0.004065 -0.022463 -0.999700 -0.009769 0.003154 -0.000391 -0.004379 -0.022463 -0.999700 -0.009769 0.003468 -0.000391 -0.005101 -0.022463 -0.999700 -0.009769 0.003596 -0.000404 -0.004065 -0.011149 -0.999875 -0.011169 0.003468 -0.000391 -0.005101 -0.011149 -0.999875 -0.011169 0.004153 -0.000404 -0.004621 -0.011149 -0.999875 -0.011169 0.003892 -0.000391 -0.003619 0.017496 -0.999693 0.017527 0.003596 -0.000404 -0.004065 0.017496 -0.999693 0.017527 0.004153 -0.000404 -0.004621 0.017496 -0.999693 0.017527 0.003892 -0.000391 -0.003619 0.007629 -0.999859 0.014959 0.004153 -0.000404 -0.004621 0.007629 -0.999859 0.014959 0.004592 -0.000391 -0.003976 0.007629 -0.999859 0.014959 0.004002 -0.000391 -0.003100 0.000000 -1.000000 0.000000 0.003892 -0.000391 -0.003619 0.000000 -1.000000 0.000000 0.004592 -0.000391 -0.003976 0.000000 -1.000000 0.000000 0.004783 -0.000391 -0.003198 -0.000000 -1.000000 0.000000 0.000732 0.000394 -0.004541 0.000000 1.000000 -0.000000 0.002132 0.000394 -0.004541 0.000000 1.000000 -0.000000 0.002132 0.000394 -0.005329 0.000000 1.000000 -0.000000 0.000732 0.000394 -0.005329 0.000000 1.000000 -0.000000 0.002132 0.000394 -0.004541 0.000000 0.000000 1.000000 0.000732 0.000394 -0.004541 0.000000 0.000000 1.000000 0.000732 -0.000394 -0.004541 0.000000 0.000000 1.000000 0.002132 -0.000394 -0.004541 0.000000 -0.000000 1.000000 0.002132 -0.000394 -0.004541 0.000000 -1.000000 0.000000 0.000732 -0.000394 -0.004541 0.000000 -1.000000 0.000000 0.000732 -0.000394 -0.005329 0.000000 -1.000000 0.000000 0.002132 -0.000394 -0.005329 0.000000 -1.000000 0.000000 0.000732 0.000394 -0.005329 0.000000 0.000000 -1.000000 0.002132 0.000394 -0.005329 0.000000 0.000000 -1.000000 0.002132 -0.000394 -0.005329 0.000000 0.000000 -1.000000 0.000732 -0.000394 -0.005329 0.000000 0.000000 -1.000000 0.004013 0.000394 0.002520 0.000000 0.986951 -0.161018 0.004801 0.000394 0.002520 0.000000 0.986951 -0.161018 0.003882 0.000000 0.000105 0.000000 0.986951 -0.161018 0.003882 0.000000 0.000105 -0.998532 0.000000 0.054165 0.004013 -0.000394 0.002520 -0.998532 0.000000 0.054165 0.004013 0.000394 0.002520 -0.998532 0.000000 0.054165 0.003882 0.000000 0.000105 0.000000 -0.986951 -0.161018 0.004801 -0.000394 0.002520 0.000000 -0.986951 -0.161018 0.004013 -0.000394 0.002520 0.000000 -0.986951 -0.161018 0.002671 0.000394 0.004518 -0.042633 0.000000 -0.999091 0.002671 -0.000394 0.004518 -0.042633 0.000000 -0.999091 0.002132 -0.000394 0.004541 -0.042633 0.000000 -0.999091 0.002132 0.000394 0.004541 -0.042633 -0.000000 -0.999091 0.004801 0.000394 0.002520 0.999648 -0.000000 0.026540 0.004783 0.000391 0.003198 0.999648 -0.000000 0.026540 0.004783 -0.000391 0.003198 0.999648 -0.000000 0.026540 0.004801 -0.000394 0.002520 0.999648 0.000000 0.026540 0.002132 0.000394 0.005329 0.046350 -0.000000 0.998925 0.002132 -0.000394 0.005329 0.046350 -0.000000 0.998925 0.002757 -0.000394 0.005300 0.046350 -0.000000 0.998925 0.002757 0.000394 0.005300 0.046350 0.000000 0.998925 0.004801 0.000394 0.002520 -0.000000 0.999987 0.005172 0.004013 0.000394 0.002520 -0.000000 0.999987 0.005172 0.004002 0.000391 0.003100 -0.000000 0.999987 0.005172 0.004801 0.000394 0.002520 -0.000553 0.999990 0.004410 0.004002 0.000391 0.003100 -0.000553 0.999990 0.004410 0.004783 0.000391 0.003198 -0.000553 0.999990 0.004410 0.002671 0.000394 0.004518 0.000000 1.000000 0.000000 0.002132 0.000394 0.004541 0.000000 1.000000 0.000000 0.002132 0.000394 0.005329 0.000000 1.000000 0.000000 0.002757 0.000394 0.005300 0.000000 1.000000 0.000000 0.002757 -0.000394 0.005300 0.000000 -1.000000 0.000000 0.002132 -0.000394 0.005329 0.000000 -1.000000 0.000000 0.002132 -0.000394 0.004541 0.000000 -1.000000 0.000000 0.002671 -0.000394 0.004518 0.000000 -1.000000 0.000000 0.004013 -0.000394 0.002520 0.000000 -0.999990 0.004425 0.004801 -0.000394 0.002520 0.000000 -0.999990 0.004425 0.004783 -0.000391 0.003198 0.000000 -0.999990 0.004425 0.004013 -0.000394 0.002520 -0.000647 -0.999986 0.005160 0.004783 -0.000391 0.003198 -0.000647 -0.999986 0.005160 0.004002 -0.000391 0.003100 -0.000647 -0.999986 0.005160 0.000732 0.000394 0.004541 0.000000 1.000000 0.000000 0.000732 0.000394 0.005329 0.000000 1.000000 0.000000 0.002132 0.000394 0.004541 0.000000 0.000000 -1.000000 0.002132 -0.000394 0.004541 0.000000 0.000000 -1.000000 0.000732 -0.000394 0.004541 0.000000 0.000000 -1.000000 0.000732 0.000394 0.004541 0.000000 0.000000 -1.000000 0.000732 -0.000394 0.005329 0.000000 -1.000000 0.000000 0.000732 -0.000394 0.004541 0.000000 -1.000000 0.000000 0.000732 0.000394 0.005329 0.000000 -0.000000 1.000000 0.000732 -0.000394 0.005329 0.000000 -0.000000 1.000000 0.002132 -0.000394 0.005329 0.000000 -0.000000 1.000000 0.002132 0.000394 0.005329 0.000000 0.000000 1.000000 0.000732 0.000394 -0.004541 0.018962 -0.000000 0.999820 0.000152 0.000391 -0.004530 0.018962 -0.000000 0.999820 0.000152 -0.000391 -0.004530 0.018962 -0.000000 0.999820 0.000732 -0.000394 -0.004541 0.018962 0.000000 0.999820 0.000152 0.000391 -0.004530 -0.005172 0.999987 0.000000 0.000732 0.000394 -0.004541 -0.005172 0.999987 0.000000 0.000732 0.000394 -0.005329 -0.005172 0.999987 0.000000 0.000152 0.000391 -0.004530 -0.004403 0.999990 0.000558 0.000732 0.000394 -0.005329 -0.004403 0.999990 0.000558 0.000053 0.000391 -0.005311 -0.004403 0.999990 0.000558 0.000732 0.000394 -0.005329 -0.026500 0.000000 -0.999649 0.000732 -0.000394 -0.005329 -0.026500 0.000000 -0.999649 0.000053 -0.000391 -0.005311 -0.026500 0.000000 -0.999649 0.000053 0.000391 -0.005311 -0.026500 -0.000000 -0.999649 0.000053 -0.000391 -0.005311 -0.004418 -0.999990 -0.000000 0.000732 -0.000394 -0.005329 -0.004418 -0.999990 -0.000000 0.000732 -0.000394 -0.004541 -0.004418 -0.999990 -0.000000 0.000053 -0.000391 -0.005311 -0.005160 -0.999986 0.000654 0.000732 -0.000394 -0.004541 -0.005160 -0.999986 0.000654 0.000152 -0.000391 -0.004530 -0.005160 -0.999986 0.000654 0.000732 0.000394 0.004541 0.018962 0.000000 -0.999820 0.000732 -0.000394 0.004541 0.018962 0.000000 -0.999820 0.000152 -0.000391 0.004530 0.018962 0.000000 -0.999820 0.000152 0.000391 0.004530 0.018962 0.000000 -0.999820 0.000732 0.000394 0.005329 -0.026500 0.000000 0.999649 0.000053 0.000391 0.005311 -0.026500 0.000000 0.999649 0.000053 -0.000391 0.005311 -0.026500 0.000000 0.999649 0.000732 -0.000394 0.005329 -0.026500 0.000000 0.999649 0.000152 0.000391 0.004530 -0.004403 0.999990 -0.000558 0.000053 0.000391 0.005311 -0.004403 0.999990 -0.000558 0.000732 0.000394 0.005329 -0.004403 0.999990 -0.000558 0.000152 0.000391 0.004530 -0.005172 0.999987 0.000000 0.000732 0.000394 0.005329 -0.005172 0.999987 0.000000 0.000732 0.000394 0.004541 -0.005172 0.999987 0.000000 0.000053 -0.000391 0.005311 -0.005160 -0.999986 -0.000654 0.000152 -0.000391 0.004530 -0.005160 -0.999986 -0.000654 0.000732 -0.000394 0.004541 -0.005160 -0.999986 -0.000654 0.000053 -0.000391 0.005311 -0.004418 -0.999990 -0.000000 0.000732 -0.000394 0.004541 -0.004418 -0.999990 -0.000000 0.000732 -0.000394 0.005329 -0.004418 -0.999990 -0.000000 0.002671 0.000394 -0.004518 -0.042633 0.000000 0.999091 0.002132 0.000394 -0.004541 -0.042633 0.000000 0.999091 0.002132 -0.000394 -0.004541 -0.042633 0.000000 0.999091 0.002671 -0.000394 -0.004518 -0.042633 0.000000 0.999091 0.004801 0.000394 -0.002520 0.999648 0.000000 -0.026540 0.004801 -0.000394 -0.002520 0.999648 0.000000 -0.026540 0.004783 -0.000391 -0.003198 0.999648 0.000000 -0.026540 0.004783 0.000391 -0.003198 0.999648 0.000000 -0.026540 0.002132 0.000394 -0.005329 0.046350 0.000000 -0.998925 0.002757 0.000394 -0.005300 0.046350 0.000000 -0.998925 0.002757 -0.000394 -0.005300 0.046350 0.000000 -0.998925 0.002132 -0.000394 -0.005329 0.046350 0.000000 -0.998925 0.004002 0.000391 -0.003100 0.000000 0.999987 -0.005172 0.004013 0.000394 -0.002520 0.000000 0.999987 -0.005172 0.004801 0.000394 -0.002520 0.000000 0.999987 -0.005172 0.004002 0.000391 -0.003100 -0.000553 0.999990 -0.004410 0.004801 0.000394 -0.002520 -0.000553 0.999990 -0.004410 0.004783 0.000391 -0.003198 -0.000553 0.999990 -0.004410 0.002671 0.000394 -0.004518 0.000000 1.000000 -0.000000 0.002757 0.000394 -0.005300 0.000000 1.000000 -0.000000 0.002757 -0.000394 -0.005300 0.000000 -1.000000 0.000000 0.002671 -0.000394 -0.004518 0.000000 -1.000000 0.000000 0.003882 0.000000 -0.000105 -0.000000 0.986951 0.161018 0.004801 0.000394 -0.002520 -0.000000 0.986951 0.161018 0.004013 0.000394 -0.002520 -0.000000 0.986951 0.161018 0.003882 0.000000 -0.000105 -0.998532 0.000000 -0.054165 0.004013 0.000394 -0.002520 -0.998532 0.000000 -0.054165 0.004013 -0.000394 -0.002520 -0.998532 0.000000 -0.054165 0.004013 -0.000394 -0.002520 0.000000 -0.986951 0.161018 0.004801 -0.000394 -0.002520 0.000000 -0.986951 0.161018 0.003882 0.000000 -0.000105 0.000000 -0.986951 0.161018 0.004801 -0.000394 -0.002520 0.934616 0.000000 0.355657 0.004801 0.000394 -0.002520 0.934616 0.000000 0.355657 0.003882 0.000000 -0.000105 0.934616 0.000000 0.355657 0.004013 0.000394 -0.002520 -0.999820 0.000000 0.018962 0.004002 0.000391 -0.003100 -0.999820 0.000000 0.018962 0.004002 -0.000391 -0.003100 -0.999820 0.000000 0.018962 0.004013 -0.000394 -0.002520 -0.999820 0.000000 0.018962 0.004783 -0.000391 -0.003198 0.000000 -0.999990 -0.004425 0.004801 -0.000394 -0.002520 0.000000 -0.999990 -0.004425 0.004013 -0.000394 -0.002520 0.000000 -0.999990 -0.004425 0.004783 -0.000391 -0.003198 -0.000647 -0.999986 -0.005160 0.004013 -0.000394 -0.002520 -0.000647 -0.999986 -0.005160 0.004002 -0.000391 -0.003100 -0.000647 -0.999986 -0.005160 3 0 1 2 3 3 4 5 3 3 5 6 3 7 8 9 3 7 9 10 3 11 12 13 3 11 13 14 3 15 16 17 3 15 17 18 3 19 20 21 3 19 21 22 3 23 24 25 3 23 25 26 3 27 28 29 3 27 29 30 3 31 32 33 3 31 33 34 3 35 36 37 3 35 37 38 3 39 40 41 3 39 41 42 3 43 44 45 3 46 47 48 3 49 50 51 3 52 53 54 3 55 56 57 3 58 59 60 3 61 62 63 3 64 65 66 3 67 68 69 3 70 71 72 3 73 74 75 3 76 77 78 3 79 80 81 3 79 81 82 3 83 84 85 3 86 87 88 3 89 90 91 3 92 93 94 3 95 96 97 3 95 97 98 3 99 100 101 3 99 101 102 3 103 104 105 3 103 105 106 3 107 108 109 3 107 109 110 3 111 112 113 3 111 113 114 3 115 116 117 3 115 117 118 3 119 120 121 3 119 121 122 3 123 124 125 3 123 125 126 3 127 128 129 3 127 129 130 3 131 132 133 3 134 135 136 3 137 138 139 3 140 141 142 3 143 144 145 3 146 147 148 3 149 150 151 3 152 153 154 3 155 156 157 3 155 157 158 3 159 160 161 3 159 161 162 3 163 164 165 3 163 165 166 3 167 168 169 3 167 169 170 3 171 172 173 3 171 173 174 3 175 176 177 3 175 177 178 3 179 180 181 3 179 181 182 3 183 184 185 3 183 185 186 3 187 188 189 3 187 189 190 3 191 192 193 3 191 193 194 3 195 196 197 3 195 197 198 3 199 200 201 3 199 201 202 3 203 204 205 3 203 205 206 3 207 208 209 3 207 209 210 3 211 212 213 3 211 213 214 3 215 216 217 3 215 217 218 3 219 220 221 3 222 223 224 3 225 226 227 3 228 229 230 3 231 232 233 3 234 235 236 3 237 193 192 3 237 192 238 3 239 189 188 3 239 188 240 3 241 242 243 3 244 245 246 3 247 248 249 3 250 251 252 3 253 254 255 3 256 257 258 3 259 260 261 3 259 261 262 3 263 264 265 3 263 265 266 3 267 268 191 3 267 191 194 3 269 270 187 3 269 187 190 3 271 272 273 3 271 273 274 3 275 276 277 3 275 277 278 3 279 280 281 3 279 281 282 3 283 284 285 3 283 285 286 3 287 288 289 3 287 289 290 3 291 292 293 3 291 293 294 3 295 296 297 3 295 297 298 3 299 300 301 3 299 301 302 3 303 304 305 3 303 305 306 3 307 308 309 3 307 309 310 3 311 312 313 3 314 315 316 3 317 318 319 3 320 321 322 3 323 324 325 3 326 327 328 3 329 330 331 3 332 333 334 3 335 336 337 3 338 339 340 3 341 342 343 3 344 345 346 3 347 348 349 3 347 349 350 3 351 352 353 3 351 353 354 3 355 356 357 3 355 357 358 3 359 360 361 3 359 361 362 3 363 364 365 3 363 365 366 3 367 368 369 3 370 371 372 3 373 374 375 3 376 377 378 3 376 378 379 3 380 381 382 3 380 382 383 3 384 385 386 3 384 386 387 3 388 389 390 3 391 392 393 3 394 395 396 3 394 396 397 3 398 399 400 3 398 400 401 3 402 403 404 3 405 406 407 3 408 409 396 3 408 396 395 3 410 411 412 3 410 412 413 3 400 399 414 3 400 414 415 3 416 417 418 3 416 418 419 3 420 421 422 3 420 422 423 3 424 425 426 3 427 428 429 3 430 431 432 3 430 432 433 3 434 435 436 3 437 438 439 3 440 441 442 3 440 442 443 3 444 445 446 3 444 446 447 3 448 449 450 3 451 452 453 3 454 455 456 3 457 458 459 3 460 461 462 3 460 462 463 3 464 465 466 3 464 466 467 3 468 469 470 3 468 470 471 3 472 473 474 3 475 476 477 3 478 479 353 3 478 353 352 3 480 481 359 3 480 359 362 3 482 483 484 3 485 486 487 3 488 489 490 3 491 492 493 3 494 495 496 3 494 496 497 3 498 499 500 3 501 502 503 opensurgsim-0.7.0/SurgSim/Testing/Data/Geometry/stapler_collision.ply000066400000000000000000000740201277777236100260440ustar00rootroot00000000000000ply format ascii 1.0 comment Created by Blender 2.69 (sub 0) - www.blender.org, source file: '' element vertex 490 property float x property float y property float z property float nx property float ny property float nz element face 176 property list uchar uint vertex_indices end_header -0.047435 0.068225 -0.013055 -0.006463 0.004409 -0.999969 -0.084014 0.069053 -0.012815 -0.006463 0.004409 -0.999969 -0.051680 0.081963 -0.012967 -0.006463 0.004409 -0.999969 -0.090172 0.076305 -0.011796 -0.633821 0.000961 -0.773479 -0.093381 0.075029 -0.009168 -0.633821 0.000961 -0.773479 -0.093242 0.208561 -0.009116 -0.633821 0.000961 -0.773479 -0.037628 0.055414 -0.005132 0.819461 0.573135 -0.000001 -0.000021 0.001644 -0.005132 0.819461 0.573135 -0.000001 -0.000021 0.001644 -0.012973 0.819461 0.573135 -0.000001 -0.096996 0.074745 -0.002479 -0.985645 -0.168814 -0.002360 -0.096686 0.072935 -0.002479 -0.985645 -0.168814 -0.002360 -0.097007 0.074745 0.002114 -0.985645 -0.168814 -0.002360 -0.095624 0.072915 0.005665 -0.944198 -0.166653 0.284106 -0.095947 0.074745 0.005665 -0.944198 -0.166653 0.284106 -0.096695 0.072931 0.002115 -0.944198 -0.166653 0.284106 -0.000021 -0.001946 -0.012973 -0.000001 0.000000 -1.000000 -0.000906 -0.002426 -0.012973 -0.000001 0.000000 -1.000000 -0.001383 -0.001003 -0.012973 -0.000001 0.000000 -1.000000 -0.053247 0.095488 -0.000274 0.999942 0.008032 0.007209 -0.053158 0.095489 -0.012618 0.999942 0.008032 0.007209 -0.053770 0.171623 -0.012553 0.999942 0.008032 0.007209 -0.096317 0.208811 0.002055 0.000680 1.000000 -0.000203 -0.095269 0.208811 0.005558 0.000680 1.000000 -0.000203 -0.092877 0.208810 0.008646 0.000680 1.000000 -0.000203 -0.000021 0.001644 0.004864 1.000000 0.000000 -0.000001 -0.000021 0.001644 0.012973 1.000000 0.000000 -0.000001 -0.000021 -0.001946 0.012973 1.000000 0.000000 -0.000001 -0.041745 0.055505 0.006777 0.019748 0.999804 0.001563 -0.041857 0.055498 0.012671 0.019748 0.999804 0.001563 -0.037628 0.055414 0.012973 0.019748 0.999804 0.001563 -0.040193 0.003943 0.002075 -0.118445 -0.992961 -0.000095 -0.040181 0.003942 -0.002438 -0.118445 -0.992961 -0.000095 -0.031077 0.002857 -0.012547 -0.118445 -0.992961 -0.000095 -0.089963 0.208561 -0.011666 -0.392806 0.001038 -0.919621 -0.087273 0.208561 -0.012815 -0.392806 0.001038 -0.919621 -0.087618 0.078007 -0.012815 -0.392806 0.001038 -0.919621 -0.000021 -0.001946 0.012973 0.000001 -0.000000 1.000000 -0.001383 -0.001003 0.012973 0.000001 -0.000000 1.000000 -0.000906 -0.002426 0.012973 0.000001 -0.000000 1.000000 -0.000021 -0.001946 -0.005132 0.476763 -0.879032 -0.000001 -0.000906 -0.002426 -0.005132 0.476763 -0.879032 -0.000001 -0.000906 -0.002426 -0.012973 0.476763 -0.879032 -0.000001 -0.002554 0.000370 -0.005132 0.843460 0.537193 -0.000001 -0.002554 0.000370 0.004864 0.843460 0.537193 -0.000001 -0.001677 -0.001007 0.004864 0.843460 0.537193 -0.000001 -0.047435 0.068225 -0.013055 -0.006462 0.004444 -0.999969 -0.042150 0.055658 -0.013145 -0.006462 0.004444 -0.999969 -0.084014 0.069053 -0.012815 -0.006462 0.004444 -0.999969 -0.041773 0.200249 0.012553 0.920621 -0.390458 -0.000001 -0.053914 0.171623 -0.000315 0.920621 -0.390458 -0.000001 -0.041773 0.200249 -0.012553 0.920621 -0.390458 -0.000001 -0.000021 0.001644 0.004864 0.819461 0.573135 -0.000001 -0.037628 0.055414 0.004864 0.819461 0.573135 -0.000001 -0.037628 0.055414 0.012973 0.819461 0.573135 -0.000001 -0.000021 -0.001946 0.004864 -0.000001 -0.000000 -1.000000 -0.000906 -0.002426 0.004864 -0.000001 -0.000000 -1.000000 -0.001677 -0.001007 0.004864 -0.000001 -0.000000 -1.000000 -0.000021 -0.001946 -0.005132 0.000001 0.000000 1.000000 -0.001677 -0.001007 -0.005132 0.000001 0.000000 1.000000 -0.000906 -0.002426 -0.005132 0.000001 0.000000 1.000000 -0.000021 -0.001946 0.012973 0.476763 -0.879032 -0.000001 -0.000906 -0.002426 0.012973 0.476763 -0.879032 -0.000001 -0.000906 -0.002426 0.004864 0.476763 -0.879032 -0.000001 -0.041745 0.055505 0.006777 0.022098 0.999756 -0.000000 -0.037628 0.055414 0.004864 0.022098 0.999756 -0.000000 -0.041745 0.055505 -0.007044 0.022098 0.999756 -0.000000 -0.031072 0.002857 0.012547 -0.115579 -0.993289 -0.004287 -0.033488 0.003143 0.011418 -0.115579 -0.993289 -0.004287 -0.036794 0.003539 0.008797 -0.115579 -0.993289 -0.004287 -0.040193 0.003943 0.002075 -0.119150 -0.992876 0.000576 -0.036794 0.003539 0.008797 -0.119150 -0.992876 0.000576 -0.039168 0.003822 0.005534 -0.119150 -0.992876 0.000576 -0.092877 0.208810 0.008646 -0.000436 0.999998 0.001671 -0.089739 0.208807 0.011257 -0.000436 0.999998 0.001671 -0.087126 0.208806 0.012545 -0.000436 0.999998 0.001671 -0.039181 0.003824 -0.005801 -0.119055 -0.992887 -0.000563 -0.036639 0.003521 -0.008986 -0.119055 -0.992887 -0.000563 -0.040181 0.003942 -0.002438 -0.119055 -0.992887 -0.000563 -0.093381 0.075029 -0.009168 -0.782036 0.001951 -0.623230 -0.095959 0.074745 -0.005934 -0.782036 0.001951 -0.623230 -0.095606 0.208561 -0.005958 -0.782036 0.001951 -0.623230 -0.090172 0.076305 -0.011796 -0.617603 -0.061639 -0.784071 -0.089830 0.072891 -0.011797 -0.617603 -0.061639 -0.784071 -0.093381 0.075029 -0.009168 -0.617603 -0.061639 -0.784071 -0.093225 0.072915 0.008919 -0.802974 -0.069129 0.591992 -0.093407 0.075029 0.008919 -0.802974 -0.069129 0.591992 -0.095624 0.072915 0.005665 -0.802974 -0.069129 0.591992 -0.092240 0.071213 0.008919 -0.728036 -0.421338 0.540775 -0.093225 0.072915 0.008919 -0.728036 -0.421338 0.540775 -0.094701 0.071289 0.005665 -0.728036 -0.421338 0.540775 -0.094701 0.071289 0.005665 -0.841292 -0.477560 0.253306 -0.095624 0.072915 0.005665 -0.841292 -0.477560 0.253306 -0.095792 0.071328 0.002115 -0.841292 -0.477560 0.253306 -0.096686 0.072935 -0.002479 -0.871226 -0.490877 -0.002170 -0.095780 0.071327 -0.002479 -0.871226 -0.490877 -0.002170 -0.095792 0.071328 0.002115 -0.871226 -0.490877 -0.002170 -0.089830 0.072891 -0.011797 -0.577254 -0.341760 -0.741605 -0.088766 0.071096 -0.011798 -0.577254 -0.341760 -0.741605 -0.092211 0.071210 -0.009169 -0.577254 -0.341760 -0.741605 -0.087259 0.072864 0.012815 -0.415129 -0.028977 0.909301 -0.087618 0.078007 0.012815 -0.415129 -0.028977 0.909301 -0.090235 0.076305 0.011566 -0.415129 -0.028977 0.909301 -0.084028 0.069070 0.012815 -0.358101 -0.304962 0.882475 -0.087259 0.072864 0.012815 -0.358101 -0.304962 0.882475 -0.088845 0.071115 0.011567 -0.358101 -0.304962 0.882475 -0.088766 0.071096 -0.011798 -0.361377 -0.213704 -0.907600 -0.089830 0.072891 -0.011797 -0.361377 -0.213704 -0.907600 -0.087252 0.072855 -0.012815 -0.361377 -0.213704 -0.907600 -0.089830 0.072891 -0.011797 -0.367478 -0.036540 -0.929314 -0.090172 0.076305 -0.011796 -0.367478 -0.036540 -0.929314 -0.087252 0.072855 -0.012815 -0.367478 -0.036540 -0.929314 -0.095647 0.072931 -0.005934 -0.769381 -0.132330 -0.624934 -0.095959 0.074745 -0.005934 -0.769381 -0.132330 -0.624934 -0.093381 0.075029 -0.009168 -0.769381 -0.132330 -0.624934 -0.094712 0.071288 -0.005934 -0.726665 -0.413532 -0.548588 -0.095647 0.072931 -0.005934 -0.726665 -0.413532 -0.548588 -0.093182 0.072891 -0.009169 -0.726665 -0.413532 -0.548588 -0.095959 0.074745 -0.005934 -0.944955 -0.162528 -0.283979 -0.095647 0.072931 -0.005934 -0.944955 -0.162528 -0.283979 -0.096686 0.072935 -0.002479 -0.944955 -0.162528 -0.283979 -0.095647 0.072931 -0.005934 -0.840521 -0.478325 -0.254419 -0.094712 0.071288 -0.005934 -0.840521 -0.478325 -0.254419 -0.095780 0.071327 -0.002479 -0.840521 -0.478325 -0.254419 -0.093225 0.072915 0.008919 -0.586744 -0.339568 0.735136 -0.092240 0.071213 0.008919 -0.586744 -0.339568 0.735136 -0.089894 0.072892 0.011567 -0.586744 -0.339568 0.735136 -0.093407 0.075029 0.008919 -0.621618 -0.053516 0.781490 -0.093225 0.072915 0.008919 -0.621618 -0.053516 0.781490 -0.089894 0.072892 0.011567 -0.621618 -0.053516 0.781490 -0.000021 0.001644 -0.005132 1.000000 0.000000 -0.000001 -0.000021 -0.001946 -0.005132 1.000000 0.000000 -0.000001 -0.000021 -0.001946 -0.012973 1.000000 0.000000 -0.000001 -0.000021 0.001644 0.004864 -0.000001 0.000000 -1.000000 -0.002554 0.000370 -0.005132 0.000001 0.000000 1.000000 -0.000021 0.001644 -0.005132 0.000001 0.000000 1.000000 -0.000021 0.001644 0.012973 0.000001 0.000000 1.000000 -0.047135 0.068208 -0.000183 0.954222 0.298299 -0.021847 -0.047435 0.068225 -0.013055 0.954222 0.298299 -0.021847 -0.051432 0.081950 -0.000232 0.954222 0.298299 -0.021847 -0.088845 0.071115 0.011567 -0.353471 -0.289821 0.889417 -0.033488 0.003143 0.011418 -0.353471 -0.289821 0.889417 -0.084028 0.069070 0.012815 -0.353471 -0.289821 0.889417 -0.087259 0.072864 0.012815 0.003594 0.000251 0.999994 -0.051441 0.082047 0.012684 0.003594 0.000251 0.999994 -0.087618 0.078007 0.012815 0.003594 0.000251 0.999994 -0.087273 0.208561 -0.012815 0.007796 -0.000021 -0.999970 -0.053770 0.171623 -0.012553 0.007796 -0.000021 -0.999970 -0.087618 0.078007 -0.012815 0.007796 -0.000021 -0.999970 -0.087126 0.208806 0.012545 0.002054 0.002056 0.999996 -0.087618 0.078007 0.012815 0.002054 0.002056 0.999996 -0.053770 0.171623 0.012553 0.002054 0.002056 0.999996 -0.089739 0.208807 0.011257 -0.432689 0.003722 0.901535 -0.090235 0.076305 0.011566 -0.432689 0.003722 0.901535 -0.087618 0.078007 0.012815 -0.432689 0.003722 0.901535 -0.087273 0.208561 -0.012815 0.005347 -0.002242 -0.999983 -0.041773 0.200249 -0.012553 0.005347 -0.002242 -0.999983 -0.053770 0.171623 -0.012553 0.005347 -0.002242 -0.999983 -0.097007 0.074745 0.002114 -0.958206 0.005057 0.286034 -0.095947 0.074745 0.005665 -0.958206 0.005057 0.286034 -0.096317 0.208811 0.002055 -0.958206 0.005057 0.286034 -0.047135 0.068208 -0.000183 0.954420 0.298450 0.003133 -0.051432 0.081950 -0.000232 0.954420 0.298450 0.003133 -0.047180 0.068216 0.012760 0.954420 0.298450 0.003133 -0.088766 0.071096 -0.011798 -0.302794 -0.245934 -0.920778 -0.084014 0.069053 -0.012815 -0.302794 -0.245934 -0.920778 -0.033735 0.003342 -0.011798 -0.302794 -0.245934 -0.920778 -0.040193 0.003943 0.002075 -0.755943 -0.622619 0.202228 -0.039168 0.003822 0.005534 -0.755943 -0.622619 0.202228 -0.094701 0.071289 0.005665 -0.755943 -0.622619 0.202228 -0.031077 0.002857 -0.012547 -0.130308 -0.991474 0.000000 -0.001677 -0.001007 -0.005132 -0.130308 -0.991474 0.000000 -0.001677 -0.001007 0.004864 -0.130308 -0.991474 0.000000 -0.095959 0.074745 -0.005934 -0.957786 0.002475 -0.287473 -0.096996 0.074745 -0.002479 -0.957786 0.002475 -0.287473 -0.095606 0.208561 -0.005958 -0.957786 0.002475 -0.287473 -0.001677 -0.001007 0.004864 -0.878223 -0.477174 0.032077 -0.000906 -0.002426 0.004864 -0.878223 -0.477174 0.032077 -0.001383 -0.001003 0.012973 -0.878223 -0.477174 0.032077 -0.001383 -0.001003 -0.012973 -0.948149 -0.317826 0.000001 -0.000906 -0.002426 -0.012973 -0.948149 -0.317826 0.000001 -0.000906 -0.002426 -0.005132 -0.948149 -0.317826 0.000001 -0.095780 0.071327 -0.002479 -0.751442 -0.620148 -0.225282 -0.094712 0.071288 -0.005934 -0.751442 -0.620148 -0.225282 -0.040181 0.003942 -0.002438 -0.751442 -0.620148 -0.225282 -0.096996 0.074745 -0.002479 -0.999984 0.005146 -0.002394 -0.097007 0.074745 0.002114 -0.999984 0.005146 -0.002394 -0.096317 0.208811 0.002055 -0.999984 0.005146 -0.002394 -0.036794 0.003539 0.008797 -0.581021 -0.474638 0.661161 -0.033488 0.003143 0.011418 -0.581021 -0.474638 0.661161 -0.088845 0.071115 0.011567 -0.581021 -0.474638 0.661161 -0.036639 0.003521 -0.008986 -0.222806 -0.960106 -0.168978 -0.033735 0.003342 -0.011798 -0.222806 -0.960106 -0.168978 -0.031077 0.002857 -0.012547 -0.222806 -0.960106 -0.168978 -0.039168 0.003822 0.005534 -0.689399 -0.565648 0.452516 -0.036794 0.003539 0.008797 -0.689399 -0.565648 0.452516 -0.092240 0.071213 0.008919 -0.689399 -0.565648 0.452516 -0.087273 0.208561 -0.012815 0.027754 0.999615 0.000074 -0.096305 0.208811 -0.002418 0.027754 0.999615 0.000074 -0.096317 0.208811 0.002055 0.027754 0.999615 0.000074 -0.093242 0.208561 -0.009116 -0.126530 0.987430 -0.094717 -0.095606 0.208561 -0.005958 -0.126530 0.987430 -0.094717 -0.096305 0.208811 -0.002418 -0.126530 0.987430 -0.094717 -0.095792 0.071328 0.002115 -0.771337 -0.636425 -0.001877 -0.095780 0.071327 -0.002479 -0.771337 -0.636425 -0.001877 -0.040193 0.003943 0.002075 -0.771337 -0.636425 -0.001877 -0.087259 0.072864 0.012815 0.003003 0.002556 0.999992 -0.084028 0.069070 0.012815 0.003003 0.002556 0.999992 -0.051441 0.082047 0.012684 0.003003 0.002556 0.999992 -0.041773 0.200249 0.012553 0.922231 -0.386502 -0.010322 -0.053770 0.171623 0.012553 0.922231 -0.386502 -0.010322 -0.053914 0.171623 -0.000315 0.922231 -0.386502 -0.010322 -0.053247 0.095488 -0.000274 0.991104 0.132897 0.007155 -0.051432 0.081950 -0.000232 0.991104 0.132897 0.007155 -0.053158 0.095489 -0.012618 0.991104 0.132897 0.007155 -0.087252 0.072855 -0.012815 -0.004198 -0.000298 -0.999991 -0.087618 0.078007 -0.012815 -0.004198 -0.000298 -0.999991 -0.051680 0.081963 -0.012967 -0.004198 -0.000298 -0.999991 -0.087273 0.208561 -0.012815 0.179756 0.983655 -0.010545 -0.087126 0.208806 0.012545 0.179756 0.983655 -0.010545 -0.041773 0.200249 -0.012553 0.179756 0.983655 -0.010545 -0.041745 0.055505 -0.007044 0.022098 0.999756 -0.000000 -0.037628 0.055414 -0.005132 0.022098 0.999756 -0.000000 -0.037628 0.055414 -0.012973 0.022098 0.999756 -0.000000 -0.047135 0.068208 -0.000183 0.920560 0.390602 -0.000001 -0.041745 0.055505 0.006777 0.920560 0.390602 -0.000001 -0.041745 0.055505 -0.007044 0.920560 0.390602 -0.000001 -0.087126 0.208806 0.012545 -0.000162 0.000069 1.000000 -0.053770 0.171623 0.012553 -0.000162 0.000069 1.000000 -0.041773 0.200249 0.012553 -0.000162 0.000069 1.000000 -0.051432 0.081950 -0.000232 0.991112 0.132854 -0.006854 -0.053247 0.095488 -0.000274 0.991112 0.132854 -0.006854 -0.053158 0.095489 0.012618 0.991112 0.132854 -0.006854 -0.033735 0.003342 -0.011798 -0.617557 -0.501590 -0.605831 -0.036639 0.003521 -0.008986 -0.617557 -0.501590 -0.605831 -0.088766 0.071096 -0.011798 -0.617557 -0.501590 -0.605831 -0.042150 0.055658 -0.013145 0.039357 0.025286 -0.998905 -0.037628 0.055414 -0.012973 0.039357 0.025286 -0.998905 -0.001383 -0.001003 -0.012973 0.039357 0.025286 -0.998905 -0.000021 0.001644 -0.012973 -0.000001 0.000000 -1.000000 -0.002554 0.000370 -0.005132 0.843342 0.537377 -0.000001 -0.037628 0.055414 -0.005132 0.843342 0.537377 -0.000001 -0.037628 0.055414 0.004864 0.843342 0.537377 -0.000001 -0.002554 0.000370 0.004864 -0.000001 0.000000 -1.000000 -0.037628 0.055414 0.004864 -0.000001 0.000000 -1.000000 -0.037628 0.055414 -0.005132 0.000001 -0.000000 1.000000 -0.047135 0.068208 -0.000183 0.919972 0.391972 0.002955 -0.047180 0.068216 0.012760 0.919972 0.391972 0.002955 -0.041745 0.055505 0.006777 0.919972 0.391972 0.002955 -0.053914 0.171623 -0.000315 0.999899 0.008754 -0.011191 -0.053770 0.171623 0.012553 0.999899 0.008754 -0.011191 -0.053247 0.095488 -0.000274 0.999899 0.008754 -0.011191 -0.095947 0.074745 0.005665 -0.788462 0.004478 0.615067 -0.093407 0.075029 0.008919 -0.788462 0.004478 0.615067 -0.095269 0.208811 0.005558 -0.788462 0.004478 0.615067 -0.053914 0.171623 -0.000315 0.922226 -0.386500 0.010850 -0.053770 0.171623 -0.012553 0.922226 -0.386500 0.010850 -0.041773 0.200249 -0.012553 0.922226 -0.386500 0.010850 -0.084028 0.069070 0.012815 0.001345 -0.006436 0.999978 -0.041857 0.055498 0.012671 0.001345 -0.006436 0.999978 -0.047180 0.068216 0.012760 0.001345 -0.006436 0.999978 -0.087273 0.208561 -0.012815 0.000000 1.000000 0.000000 -0.089963 0.208561 -0.011666 0.000000 1.000000 0.000000 -0.093242 0.208561 -0.009116 0.000000 1.000000 0.000000 -0.031072 0.002857 0.012547 -0.129001 -0.991631 0.005166 -0.001677 -0.001007 0.004864 -0.129001 -0.991631 0.005166 -0.001383 -0.001003 0.012973 -0.129001 -0.991631 0.005166 -0.031077 0.002857 -0.012547 -0.128982 -0.991633 -0.005342 -0.001383 -0.001003 -0.012973 -0.128982 -0.991633 -0.005342 -0.001677 -0.001007 -0.005132 -0.128982 -0.991633 -0.005342 -0.093407 0.075029 0.008919 -0.641676 0.004107 0.766965 -0.090235 0.076305 0.011566 -0.641676 0.004107 0.766965 -0.092877 0.208810 0.008646 -0.641676 0.004107 0.766965 -0.036639 0.003521 -0.008986 -0.674910 -0.555408 -0.485818 -0.039181 0.003824 -0.005801 -0.674910 -0.555408 -0.485818 -0.092211 0.071210 -0.009169 -0.674910 -0.555408 -0.485818 -0.084028 0.069070 0.012815 0.002845 -0.001773 0.999994 -0.031072 0.002857 0.012547 0.002845 -0.001773 0.999994 -0.041857 0.055498 0.012671 0.002845 -0.001773 0.999994 -0.001383 -0.001003 -0.012973 -0.016259 -0.014732 -0.999759 -0.031077 0.002857 -0.012547 -0.016259 -0.014732 -0.999759 -0.042150 0.055658 -0.013145 -0.016259 -0.014732 -0.999759 -0.041745 0.055505 -0.007044 0.916266 0.400029 -0.020828 -0.047435 0.068225 -0.013055 0.916266 0.400029 -0.020828 -0.047135 0.068208 -0.000183 0.916266 0.400029 -0.020828 -0.037628 0.055414 0.012973 0.000001 0.000000 1.000000 -0.084014 0.069053 -0.012815 -0.003509 -0.002988 -0.999989 -0.087252 0.072855 -0.012815 -0.003509 -0.002988 -0.999989 -0.051680 0.081963 -0.012967 -0.003509 -0.002988 -0.999989 -0.089963 0.208561 -0.011666 -0.613890 0.001746 -0.789389 -0.090172 0.076305 -0.011796 -0.613890 0.001746 -0.789389 -0.093242 0.208561 -0.009116 -0.613890 0.001746 -0.789389 -0.037628 0.055414 -0.012973 0.819461 0.573135 -0.000001 -0.096686 0.072935 -0.002479 -0.985527 -0.169508 -0.002078 -0.096695 0.072931 0.002115 -0.985527 -0.169508 -0.002078 -0.097007 0.074745 0.002114 -0.985527 -0.169508 -0.002078 -0.095947 0.074745 0.005665 -0.945488 -0.162464 0.282238 -0.097007 0.074745 0.002114 -0.945488 -0.162464 0.282238 -0.096695 0.072931 0.002115 -0.945488 -0.162464 0.282238 -0.053914 0.171623 -0.000315 0.999892 0.008766 0.011764 -0.053247 0.095488 -0.000274 0.999892 0.008766 0.011764 -0.053770 0.171623 -0.012553 0.999892 0.008766 0.011764 -0.000021 -0.001946 0.004864 1.000000 0.000000 -0.000001 -0.037628 0.055414 0.012973 0.022098 0.999756 -0.000000 -0.031072 0.002857 0.012547 -0.118257 -0.992983 0.000024 -0.040193 0.003943 0.002075 -0.118257 -0.992983 0.000024 -0.031077 0.002857 -0.012547 -0.118257 -0.992983 0.000024 -0.090172 0.076305 -0.011796 -0.371438 0.001500 -0.928457 -0.089963 0.208561 -0.011666 -0.371438 0.001500 -0.928457 -0.087618 0.078007 -0.012815 -0.371438 0.001500 -0.928457 -0.000021 -0.001946 -0.012973 0.476763 -0.879032 -0.000001 -0.001677 -0.001007 -0.005132 0.843460 0.537193 -0.000001 -0.000021 0.001644 0.012973 0.819461 0.573135 -0.000001 -0.000021 -0.001946 0.004864 0.476763 -0.879032 -0.000001 -0.037628 0.055414 0.004864 0.022098 0.999756 -0.000000 -0.040193 0.003943 0.002075 -0.118512 -0.992953 0.000248 -0.031072 0.002857 0.012547 -0.118512 -0.992953 0.000248 -0.036794 0.003539 0.008797 -0.118512 -0.992953 0.000248 -0.096317 0.208811 0.002055 0.000920 1.000000 -0.000329 -0.092877 0.208810 0.008646 0.000920 1.000000 -0.000329 -0.087126 0.208806 0.012545 0.000920 1.000000 -0.000329 -0.093242 0.208561 -0.009116 -0.800548 0.001067 -0.599268 -0.093381 0.075029 -0.009168 -0.800548 0.001067 -0.599268 -0.095606 0.208561 -0.005958 -0.800548 0.001067 -0.599268 -0.089830 0.072891 -0.011797 -0.615991 -0.056968 -0.785691 -0.093182 0.072891 -0.009169 -0.615991 -0.056968 -0.785691 -0.093381 0.075029 -0.009168 -0.615991 -0.056968 -0.785691 -0.093407 0.075029 0.008919 -0.775043 -0.136797 0.616923 -0.095947 0.074745 0.005665 -0.775043 -0.136797 0.616923 -0.095624 0.072915 0.005665 -0.775043 -0.136797 0.616923 -0.093225 0.072915 0.008919 -0.732102 -0.415579 0.539741 -0.095624 0.072915 0.005665 -0.732102 -0.415579 0.539741 -0.094701 0.071289 0.005665 -0.732102 -0.415579 0.539741 -0.095624 0.072915 0.005665 -0.843104 -0.474934 0.252218 -0.096695 0.072931 0.002115 -0.843104 -0.474934 0.252218 -0.095792 0.071328 0.002115 -0.843104 -0.474934 0.252218 -0.096695 0.072931 0.002115 -0.871270 -0.490800 -0.002134 -0.096686 0.072935 -0.002479 -0.871270 -0.490800 -0.002134 -0.095792 0.071328 0.002115 -0.871270 -0.490800 -0.002134 -0.093182 0.072891 -0.009169 -0.581186 -0.335710 -0.741297 -0.089830 0.072891 -0.011797 -0.581186 -0.335710 -0.741297 -0.092211 0.071210 -0.009169 -0.581186 -0.335710 -0.741297 -0.089894 0.072892 0.011567 -0.428024 -0.042501 0.902768 -0.087259 0.072864 0.012815 -0.428024 -0.042501 0.902768 -0.090235 0.076305 0.011566 -0.428024 -0.042501 0.902768 -0.087259 0.072864 0.012815 -0.417005 -0.246167 0.874934 -0.089894 0.072892 0.011567 -0.417005 -0.246167 0.874934 -0.088845 0.071115 0.011567 -0.417005 -0.246167 0.874934 -0.084014 0.069053 -0.012815 -0.308650 -0.262863 -0.914132 -0.088766 0.071096 -0.011798 -0.308650 -0.262863 -0.914132 -0.087252 0.072855 -0.012815 -0.308650 -0.262863 -0.914132 -0.090172 0.076305 -0.011796 -0.355878 -0.025282 -0.934190 -0.087618 0.078007 -0.012815 -0.355878 -0.025282 -0.934190 -0.087252 0.072855 -0.012815 -0.355878 -0.025282 -0.934190 -0.093182 0.072891 -0.009169 -0.793686 -0.073593 -0.603860 -0.095647 0.072931 -0.005934 -0.793686 -0.073593 -0.603860 -0.093381 0.075029 -0.009168 -0.793686 -0.073593 -0.603860 -0.092211 0.071210 -0.009169 -0.723574 -0.417958 -0.549319 -0.094712 0.071288 -0.005934 -0.723574 -0.417958 -0.549319 -0.093182 0.072891 -0.009169 -0.723574 -0.417958 -0.549319 -0.096996 0.074745 -0.002479 -0.945156 -0.161879 -0.283682 -0.095959 0.074745 -0.005934 -0.945156 -0.161879 -0.283682 -0.096686 0.072935 -0.002479 -0.945156 -0.161879 -0.283682 -0.096686 0.072935 -0.002479 -0.842901 -0.474917 -0.252928 -0.095647 0.072931 -0.005934 -0.842901 -0.474917 -0.252928 -0.095780 0.071327 -0.002479 -0.842901 -0.474917 -0.252928 -0.092240 0.071213 0.008919 -0.583538 -0.344474 0.735406 -0.088845 0.071115 0.011567 -0.583538 -0.344474 0.735406 -0.089894 0.072892 0.011567 -0.583538 -0.344474 0.735406 -0.090235 0.076305 0.011566 -0.624605 -0.062178 0.778462 -0.093407 0.075029 0.008919 -0.624605 -0.062178 0.778462 -0.089894 0.072892 0.011567 -0.624605 -0.062178 0.778462 -0.000021 0.001644 -0.012973 1.000000 0.000000 -0.000001 -0.051432 0.081950 -0.000232 0.955235 0.295282 -0.018302 -0.047435 0.068225 -0.013055 0.955235 0.295282 -0.018302 -0.051680 0.081963 -0.012967 0.955235 0.295282 -0.018302 -0.033488 0.003143 0.011418 -0.430415 -0.347611 0.833012 -0.031072 0.002857 0.012547 -0.430415 -0.347611 0.833012 -0.084028 0.069070 0.012815 -0.430415 -0.347611 0.833012 -0.051441 0.082047 0.012684 0.003031 0.005297 0.999981 -0.053158 0.095489 0.012618 0.003031 0.005297 0.999981 -0.087618 0.078007 0.012815 0.003031 0.005297 0.999981 -0.053770 0.171623 -0.012553 0.005261 0.000896 -0.999986 -0.053158 0.095489 -0.012618 0.005261 0.000896 -0.999986 -0.087618 0.078007 -0.012815 0.005261 0.000896 -0.999986 -0.087618 0.078007 0.012815 0.005263 0.000896 0.999986 -0.053158 0.095489 0.012618 0.005263 0.000896 0.999986 -0.053770 0.171623 0.012553 0.005263 0.000896 0.999986 -0.087126 0.208806 0.012545 -0.442121 0.003515 0.896948 -0.089739 0.208807 0.011257 -0.442121 0.003515 0.896948 -0.087618 0.078007 0.012815 -0.442121 0.003515 0.896948 -0.095947 0.074745 0.005665 -0.958031 0.005074 0.286618 -0.095269 0.208811 0.005558 -0.958031 0.005074 0.286618 -0.096317 0.208811 0.002055 -0.958031 0.005074 0.286618 -0.051432 0.081950 -0.000232 0.955677 0.294413 -0.001546 -0.051441 0.082047 0.012684 0.955677 0.294413 -0.001546 -0.047180 0.068216 0.012760 0.955677 0.294413 -0.001546 -0.084014 0.069053 -0.012815 -0.304325 -0.247093 -0.919963 -0.031077 0.002857 -0.012547 -0.304325 -0.247093 -0.919963 -0.033735 0.003342 -0.011798 -0.304325 -0.247093 -0.919963 -0.095792 0.071328 0.002115 -0.751639 -0.620306 0.224186 -0.040193 0.003943 0.002075 -0.751639 -0.620306 0.224186 -0.094701 0.071289 0.005665 -0.751639 -0.620306 0.224186 -0.031072 0.002857 0.012547 -0.130323 -0.991472 0.000026 -0.031077 0.002857 -0.012547 -0.130323 -0.991472 0.000026 -0.001677 -0.001007 0.004864 -0.130323 -0.991472 0.000026 -0.096996 0.074745 -0.002479 -0.980976 0.005144 -0.194062 -0.096305 0.208811 -0.002418 -0.980976 0.005144 -0.194062 -0.095606 0.208561 -0.005958 -0.980976 0.005144 -0.194062 -0.000906 -0.002426 0.004864 -0.948149 -0.317826 0.000001 -0.000906 -0.002426 0.012973 -0.948149 -0.317826 0.000001 -0.001383 -0.001003 0.012973 -0.948149 -0.317826 0.000001 -0.001677 -0.001007 -0.005132 -0.878192 -0.477157 -0.033170 -0.001383 -0.001003 -0.012973 -0.878192 -0.477157 -0.033170 -0.000906 -0.002426 -0.005132 -0.878192 -0.477157 -0.033170 -0.094712 0.071288 -0.005934 -0.755829 -0.622538 -0.202904 -0.039181 0.003824 -0.005801 -0.755829 -0.622538 -0.202904 -0.040181 0.003942 -0.002438 -0.755829 -0.622538 -0.202904 -0.096305 0.208811 -0.002418 -0.999983 0.005155 -0.002683 -0.096996 0.074745 -0.002479 -0.999983 0.005155 -0.002683 -0.096317 0.208811 0.002055 -0.999983 0.005155 -0.002683 -0.092240 0.071213 0.008919 -0.555408 -0.456306 0.695203 -0.036794 0.003539 0.008797 -0.555408 -0.456306 0.695203 -0.088845 0.071115 0.011567 -0.555408 -0.456306 0.695203 -0.040181 0.003942 -0.002438 -0.118811 -0.992917 -0.000429 -0.036639 0.003521 -0.008986 -0.118811 -0.992917 -0.000429 -0.031077 0.002857 -0.012547 -0.118811 -0.992917 -0.000429 -0.094701 0.071289 0.005665 -0.670687 -0.553011 0.494326 -0.039168 0.003822 0.005534 -0.670687 -0.553011 0.494326 -0.092240 0.071213 0.008919 -0.670687 -0.553011 0.494326 -0.087126 0.208806 0.012545 0.011646 0.999885 -0.009727 -0.087273 0.208561 -0.012815 0.011646 0.999885 -0.009727 -0.096317 0.208811 0.002055 0.011646 0.999885 -0.009727 -0.095780 0.071327 -0.002479 -0.771336 -0.636426 -0.001909 -0.040181 0.003942 -0.002438 -0.771336 -0.636426 -0.001909 -0.040193 0.003943 0.002075 -0.771336 -0.636426 -0.001909 -0.084028 0.069070 0.012815 0.001633 0.005997 0.999981 -0.047180 0.068216 0.012760 0.001633 0.005997 0.999981 -0.051441 0.082047 0.012684 0.001633 0.005997 0.999981 -0.051432 0.081950 -0.000232 0.993845 0.109095 -0.019244 -0.051680 0.081963 -0.012967 0.993845 0.109095 -0.019244 -0.053158 0.095489 -0.012618 0.993845 0.109095 -0.019244 -0.087618 0.078007 -0.012815 -0.006985 0.025030 -0.999662 -0.053158 0.095489 -0.012618 -0.006985 0.025030 -0.999662 -0.051680 0.081963 -0.012967 -0.006985 0.025030 -0.999662 -0.087126 0.208806 0.012545 0.185404 0.982662 -0.000000 -0.041773 0.200249 0.012553 0.185404 0.982662 -0.000000 -0.041773 0.200249 -0.012553 0.185404 0.982662 -0.000000 -0.042150 0.055658 -0.013145 0.053052 0.998360 0.021515 -0.041745 0.055505 -0.007044 0.053052 0.998360 0.021515 -0.037628 0.055414 -0.012973 0.053052 0.998360 0.021515 -0.051441 0.082047 0.012684 0.991941 0.126703 -0.000262 -0.051432 0.081950 -0.000232 0.991941 0.126703 -0.000262 -0.053158 0.095489 0.012618 0.991941 0.126703 -0.000262 -0.036639 0.003521 -0.008986 -0.550116 -0.453535 -0.701197 -0.092211 0.071210 -0.009169 -0.550116 -0.453535 -0.701197 -0.088766 0.071096 -0.011798 -0.550116 -0.453535 -0.701197 -0.037628 0.055414 -0.012973 -0.000001 -0.000000 -1.000000 -0.002554 0.000370 0.004864 0.843342 0.537377 -0.000001 -0.002554 0.000370 -0.005132 0.843342 0.537377 -0.000001 -0.037628 0.055414 0.004864 0.843342 0.537377 -0.000001 -0.047180 0.068216 0.012760 0.922358 0.385918 0.017984 -0.041857 0.055498 0.012671 0.922358 0.385918 0.017984 -0.041745 0.055505 0.006777 0.922358 0.385918 0.017984 -0.053770 0.171623 0.012553 0.999944 0.008032 -0.006905 -0.053158 0.095489 0.012618 0.999944 0.008032 -0.006905 -0.053247 0.095488 -0.000274 0.999944 0.008032 -0.006905 -0.093407 0.075029 0.008919 -0.790554 0.004382 0.612377 -0.092877 0.208810 0.008646 -0.790554 0.004382 0.612377 -0.095269 0.208811 0.005558 -0.790554 0.004382 0.612377 -0.096305 0.208811 -0.002418 -0.032216 0.998128 -0.051987 -0.087273 0.208561 -0.012815 -0.032216 0.998128 -0.051987 -0.093242 0.208561 -0.009116 -0.032216 0.998128 -0.051987 -0.090235 0.076305 0.011566 -0.639598 0.004187 0.768699 -0.089739 0.208807 0.011257 -0.639598 0.004187 0.768699 -0.092877 0.208810 0.008646 -0.639598 0.004187 0.768699 -0.039181 0.003824 -0.005801 -0.667065 -0.550065 -0.502447 -0.094712 0.071288 -0.005934 -0.667065 -0.550065 -0.502447 -0.092211 0.071210 -0.009169 -0.667065 -0.550065 -0.502447 -0.031072 0.002857 0.012547 -0.015053 -0.005440 0.999872 -0.001383 -0.001003 0.012973 -0.015053 -0.005440 0.999872 -0.041857 0.055498 0.012671 -0.015053 -0.005440 0.999872 -0.031077 0.002857 -0.012547 -0.012333 -0.013910 -0.999827 -0.084014 0.069053 -0.012815 -0.012333 -0.013910 -0.999827 -0.042150 0.055658 -0.013145 -0.012333 -0.013910 -0.999827 -0.042150 0.055658 -0.013145 0.920453 0.387461 -0.051386 -0.047435 0.068225 -0.013055 0.920453 0.387461 -0.051386 -0.041745 0.055505 -0.007044 0.920453 0.387461 -0.051386 -0.041857 0.055498 0.012671 -0.072067 -0.046300 0.996325 -0.001383 -0.001003 0.012973 -0.072067 -0.046300 0.996325 -0.037628 0.055414 0.012973 -0.072067 -0.046300 0.996325 3 0 1 2 3 3 4 5 3 6 7 8 3 9 10 11 3 12 13 14 3 15 16 17 3 18 19 20 3 21 22 23 3 24 25 26 3 27 28 29 3 30 31 32 3 33 34 35 3 36 37 38 3 39 40 41 3 42 43 44 3 45 46 47 3 48 49 50 3 51 52 53 3 54 55 56 3 57 58 59 3 60 61 62 3 63 64 65 3 66 67 68 3 69 70 71 3 72 73 74 3 75 76 77 3 78 79 80 3 81 82 83 3 84 85 86 3 87 88 89 3 90 91 92 3 93 94 95 3 96 97 98 3 99 100 101 3 102 103 104 3 105 106 107 3 108 109 110 3 111 112 113 3 114 115 116 3 117 118 119 3 120 121 122 3 123 124 125 3 126 127 128 3 129 130 131 3 54 56 132 3 133 58 134 3 36 135 37 3 136 137 138 3 139 140 141 3 142 143 144 3 145 146 147 3 148 149 150 3 151 152 153 3 154 155 156 3 157 158 159 3 160 161 162 3 163 164 165 3 166 167 168 3 169 170 171 3 172 173 174 3 175 176 177 3 178 179 180 3 181 182 183 3 184 185 186 3 187 188 189 3 190 191 192 3 193 194 195 3 196 197 198 3 199 200 201 3 202 203 204 3 205 206 207 3 208 209 210 3 211 212 213 3 214 215 216 3 217 218 219 3 220 221 222 3 223 224 225 3 226 227 228 3 229 230 231 3 232 233 234 3 235 236 237 3 17 238 15 3 239 240 241 3 242 243 132 3 133 134 244 3 245 246 247 3 248 249 250 3 251 252 253 3 254 255 256 3 257 258 259 3 260 261 262 3 263 264 265 3 266 267 268 3 269 270 271 3 272 273 274 3 275 276 277 3 278 279 280 3 281 282 283 3 37 135 284 3 285 286 287 3 288 289 290 3 291 6 8 3 292 293 294 3 295 296 297 3 298 299 300 3 301 24 26 3 64 63 302 3 303 304 305 3 306 307 308 3 309 39 41 3 310 42 44 3 311 51 53 3 312 60 62 3 313 221 220 3 314 315 316 3 317 318 319 3 320 321 322 3 323 324 325 3 326 327 328 3 329 330 331 3 332 333 334 3 335 336 337 3 338 339 340 3 341 342 343 3 344 345 346 3 347 348 349 3 350 351 352 3 353 354 355 3 356 357 358 3 359 360 361 3 362 363 364 3 365 366 367 3 368 369 370 3 371 129 131 3 56 242 132 3 58 57 134 3 372 373 374 3 375 376 377 3 378 379 380 3 381 382 383 3 384 385 386 3 387 388 389 3 390 391 392 3 393 394 395 3 396 397 398 3 399 400 401 3 402 403 404 3 405 406 407 3 408 409 410 3 411 412 413 3 414 415 416 3 417 418 419 3 420 421 422 3 423 424 425 3 426 427 428 3 429 430 431 3 432 433 434 3 435 436 437 3 438 439 440 3 441 442 443 3 444 445 446 3 447 448 449 3 450 451 452 3 453 454 455 3 456 238 17 3 457 458 459 3 460 461 462 3 463 464 465 3 466 467 468 3 469 470 471 3 472 473 474 3 475 476 477 3 478 479 480 3 481 482 483 3 484 485 486 3 487 488 489 opensurgsim-0.7.0/SurgSim/Testing/Data/Geometry/wound_deformable.ply000066400000000000000000001232461277777236100256400ustar00rootroot00000000000000ply format ascii 1.0 comment This file is a part of the OpenSurgSim project. comment Copyright 2013, SimQuest Solutions Inc. comment comment Licensed under the Apache License, Version 2.0 (the "License"); comment you may not use this file except in compliance with the License. comment You may obtain a copy of the License at comment comment http://www.apache.org/licenses/LICENSE-2.0 comment comment Unless required by applicable law or agreed to in writing, software comment distributed under the License is distributed on an "AS IS" BASIS, comment WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. comment See the License for the specific language governing permissions and comment limitations under the License. comment comment This file provides the geometry which describes a tetrahedral volume comment mesh and triangular surface mesh of an arm wound. comment element vertex 391 property double x property double y property double z element face 407 property list uint uint vertex_indices element 3d_element 1476 property list uint uint vertex_indices element boundary_condition 79 property uint vertex_index element material 1 property double mass_density property double poisson_ratio property double young_modulus end_header -0.017638 0.001427 -0.012363 -0.018984 0.002069 -0.016867 -0.014913 -0.001358 -0.015090 -0.018090 -0.001832 -0.017359 0.012643 -0.002455 0.001226 0.009376 -0.006324 0.003409 0.015479 -0.002289 0.003265 0.014119 -0.002367 0.007046 -0.000236 -0.006438 -0.015323 -0.003732 -0.004010 -0.013609 0.002155 -0.000546 -0.013612 0.001262 -0.001523 -0.018049 0.019667 -0.017785 0.008674 0.029299 -0.005262 0.004546 0.046990 -0.020879 0.007375 0.037332 -0.020768 -0.005328 0.033586 -0.016523 0.018450 0.034101 -0.002031 0.016309 0.033392 -0.002474 0.009623 0.025349 -0.003774 0.014192 0.019145 0.004850 0.012264 0.020216 0.004879 0.011113 0.020968 0.001399 0.010219 0.018687 0.001314 0.008476 -0.007352 0.001018 0.005860 -0.007333 -0.005722 0.014291 -0.013652 -0.000173 0.002866 -0.007113 -0.008223 -0.002577 -0.006477 -0.004144 -0.015932 -0.010957 -0.004967 -0.018490 -0.007629 -0.006377 -0.018801 -0.009906 -0.007928 -0.014976 0.014105 -0.020914 -0.009294 0.009112 -0.006286 -0.008604 0.006268 -0.009189 -0.014543 0.002300 -0.008261 -0.009596 0.006635 0.000026 -0.006193 0.010115 -0.000309 -0.007852 0.005102 -0.004418 -0.008996 -0.006609 0.001420 -0.025080 -0.011057 -0.007486 -0.026293 -0.008811 0.000184 -0.034044 -0.005338 -0.005470 -0.024596 0.001259 0.002603 0.004418 0.000123 0.002377 -0.000362 0.002998 0.002713 0.001375 0.002769 -0.002124 0.003090 -0.020005 -0.002711 -0.020006 -0.021803 0.001971 -0.019803 -0.021059 0.001058 -0.014582 0.014631 0.000524 0.027783 0.022184 -0.002620 0.021520 0.018739 -0.011699 0.030717 0.015337 -0.003630 0.015467 0.016049 0.003671 -0.002811 0.018898 0.003898 -0.000351 0.014287 0.000683 -0.000350 0.019319 -0.000205 -0.003032 0.046990 -0.007619 0.007375 0.040075 -0.002131 -0.002012 0.037332 -0.007509 -0.005328 -0.011140 0.001039 -0.002776 -0.014033 -0.006140 -0.001762 -0.016684 0.000633 -0.005670 -0.011809 -0.002190 -0.009170 0.024204 0.005929 0.015670 0.026606 0.006410 0.017058 0.023576 0.006924 0.019679 0.024566 0.001831 0.017759 0.013743 0.004124 0.008547 0.011935 0.004109 0.005502 0.014670 0.004333 0.007344 0.012704 0.000753 0.008033 -0.003034 -0.009956 -0.020825 -0.006038 -0.007999 -0.012282 0.014736 0.003042 -0.006304 0.014286 -0.003192 -0.009813 0.014065 0.002151 -0.010793 0.019818 -0.002939 -0.008113 0.036755 0.006575 0.019271 0.036907 0.001084 0.018946 0.033263 0.001097 0.023070 0.033376 0.002597 0.017918 0.022543 0.001069 0.006601 0.020245 -0.001947 0.007184 0.019727 0.001041 0.004292 0.023642 -0.002413 0.005541 0.029219 0.001517 -0.003210 0.022506 -0.007309 -0.002980 0.013584 0.001132 0.004599 0.015737 0.001218 0.006218 0.015374 -0.005687 -0.005108 0.019027 -0.006775 -0.014839 0.030475 0.001257 0.015552 0.027297 -0.001544 0.019319 -0.006877 -0.002740 -0.012407 -0.009683 -0.005474 -0.007552 -0.008963 -0.000571 -0.011342 -0.009123 -0.005772 -0.011405 0.006753 0.004254 0.022359 0.010408 0.004267 0.016270 0.015903 0.005679 0.020105 0.017492 0.000471 0.018668 -0.018916 -0.006283 -0.013171 -0.013552 -0.004660 -0.011679 -0.015191 -0.008193 -0.008642 -0.014454 -0.008852 -0.015804 0.016241 0.004334 0.010184 0.017210 0.004543 0.009049 0.012207 0.000507 -0.002006 0.015357 0.000245 -0.003791 0.007154 -0.001854 0.005752 0.011373 -0.002515 0.009976 0.009600 -0.002702 0.003200 0.022251 -0.002063 0.015960 0.021468 -0.001789 0.012242 0.017030 0.000365 0.013057 0.020308 0.001792 0.013974 0.013639 -0.003166 -0.002562 0.011924 -0.003711 -0.006304 -0.014146 -0.020429 -0.047689 -0.014146 -0.007170 -0.047689 -0.024140 -0.017967 -0.040188 -0.012259 -0.006676 -0.033836 0.002537 -0.008403 -0.037874 -0.001499 -0.000057 -0.029561 -0.000610 -0.002936 -0.039936 0.031048 0.003384 0.005728 0.031021 0.004616 0.009841 0.029058 -0.002228 0.009819 -0.017817 -0.005609 -0.020805 -0.021077 -0.009144 -0.020053 -0.019782 -0.005521 -0.017072 -0.021431 -0.005952 -0.022335 0.028581 0.004545 0.037841 0.022848 0.002598 0.033651 0.026518 0.008415 0.028378 -0.008942 -0.024739 -0.008176 -0.020167 -0.001455 -0.000035 -0.019937 -0.006669 -0.033633 -0.011533 -0.022757 -0.029013 0.025681 0.001454 0.013298 0.021352 0.005330 0.013823 0.022555 0.005159 0.012575 -0.018697 -0.003565 -0.023866 -0.003741 -0.007976 -0.007476 -0.004960 -0.004029 -0.006795 0.035352 0.005531 0.016102 0.033038 0.004995 0.012719 0.036201 0.003833 0.011247 -0.014781 0.002213 -0.020373 -0.016880 -0.002824 -0.021921 -0.016398 0.001977 -0.024375 -0.013707 -0.002037 -0.021513 -0.001967 0.002359 -0.017593 -0.005030 0.002252 -0.019030 -0.000406 0.001476 -0.021158 -0.003015 -0.003057 -0.018944 0.005527 0.000425 -0.000868 0.005663 0.003045 0.003152 0.003921 0.003399 0.000160 -0.015527 -0.005152 -0.022539 -0.015560 -0.006666 -0.026900 -0.014996 -0.002896 -0.024296 -0.013917 -0.007956 -0.024021 0.004887 -0.021029 0.001820 0.002057 -0.006870 -0.003212 0.022552 -0.001675 0.009108 -0.024489 0.000741 -0.016918 -0.024391 0.001936 -0.022406 -0.024601 -0.004739 -0.018778 0.006850 -0.006797 -0.004277 0.004032 -0.004089 -0.000551 0.012333 0.004106 0.011509 0.005130 0.003275 0.012820 0.007317 0.003436 0.008224 -0.004058 0.001878 0.001264 -0.014203 0.001575 -0.029189 -0.010570 -0.002455 -0.021860 -0.012199 0.002106 -0.022621 -0.025827 -0.009187 -0.021112 -0.021601 -0.004637 -0.026044 -0.017290 -0.008529 -0.023047 -0.013967 -0.002130 -0.018341 -0.014398 -0.004396 -0.019489 -0.016250 -0.002623 -0.019238 0.002921 -0.006003 -0.021793 0.009600 0.002834 -0.010048 0.012195 0.002939 -0.008156 0.014492 -0.021349 -0.029300 0.026117 -0.020765 -0.017965 0.014492 -0.008090 -0.029300 0.002621 -0.007830 -0.029082 0.008423 0.000639 0.001153 0.030678 0.007333 0.019744 0.026656 0.007758 0.022058 0.020949 0.007122 0.023900 0.024451 0.002704 0.023354 -0.023157 -0.024020 -0.019768 0.029177 0.003608 0.018712 0.012003 0.005360 0.025917 0.004293 -0.015189 0.020860 0.002537 -0.021663 -0.037874 0.017564 -0.002515 -0.026912 0.011421 -0.002833 -0.031689 0.011215 0.000322 -0.020415 0.002635 0.003021 -0.012333 0.001235 0.002490 -0.015739 0.004272 0.002632 -0.013690 -0.002997 0.002057 -0.002458 -0.002614 -0.004314 -0.002919 0.003125 -0.022994 -0.021280 -0.005395 -0.000823 -0.013764 -0.008954 -0.001258 -0.015629 -0.003834 0.002652 -0.016057 -0.007047 -0.000971 -0.018908 0.010433 -0.002408 -0.000327 0.007502 -0.002301 -0.002415 0.009372 0.000321 -0.004108 0.025152 0.001195 0.009053 0.016960 0.000956 0.001995 0.019875 -0.003369 -0.000014 0.030751 0.008190 0.022981 0.006170 -0.006701 0.007879 0.004293 -0.001930 0.020860 -0.000653 -0.004919 0.008637 -0.014173 -0.021266 0.011121 -0.017277 -0.006019 -0.017796 0.023544 -0.000939 0.002037 -0.009768 -0.009134 -0.022027 -0.009580 -0.002948 -0.014062 -0.011797 -0.001691 -0.017176 -0.010204 0.002309 -0.009891 -0.011598 0.001574 -0.008061 -0.008708 0.001627 -0.006285 0.034635 0.001794 0.002947 0.039472 0.002062 0.008665 -0.015907 -0.007981 -0.018944 -0.020598 0.001813 -0.025718 -0.045621 -0.006163 -0.019740 -0.040582 -0.008149 -0.025424 -0.042936 -0.004004 -0.023210 -0.038274 -0.003561 -0.017712 -0.025030 -0.004697 -0.013625 -0.023215 -0.000003 -0.009663 -0.021118 -0.002997 -0.014161 -0.004112 0.000695 0.015891 -0.016389 -0.004557 -0.019826 -0.003547 -0.002715 -0.010257 -0.001840 -0.000524 -0.011726 -0.000903 -0.002832 -0.008443 -0.001161 -0.006198 -0.011121 0.026165 -0.000632 0.016453 0.025651 0.005503 0.014190 -0.045621 -0.011579 -0.019740 -0.040582 -0.021408 -0.025424 -0.032217 -0.008366 -0.016728 0.000124 -0.006312 0.001727 0.017517 -0.002166 0.004909 0.011949 -0.006639 -0.000263 0.023286 0.001530 0.011808 -0.013427 -0.006320 -0.020900 0.005159 0.001722 -0.017378 0.006008 -0.003221 -0.013176 0.044680 -0.002154 0.004195 -0.000907 0.002148 0.009167 0.018182 0.005343 0.015586 0.043927 0.001725 0.025605 -0.012854 0.002261 -0.012050 -0.014517 0.001574 -0.010230 -0.011668 -0.001006 -0.012914 -0.008316 0.002150 -0.020675 -0.010664 0.002390 -0.018678 -0.021013 -0.010291 0.007951 -0.014146 -0.001754 -0.047689 -0.008422 -0.002312 -0.044596 -0.015684 0.000035 -0.039467 -0.034331 -0.001228 -0.022520 -0.031662 -0.007124 -0.023091 -0.031224 -0.014703 0.002956 -0.022628 -0.011995 -0.002126 -0.025924 -0.004114 -0.023568 0.027872 -0.000761 0.013734 -0.034591 -0.000064 -0.031338 -0.029145 0.000494 -0.024321 -0.028017 -0.005001 -0.028032 0.027902 0.001681 0.011326 0.025087 -0.001165 0.011230 -0.021752 0.000419 -0.042010 -0.026528 0.000997 -0.038365 -0.024140 -0.004708 -0.040188 -0.020978 0.001288 -0.033343 -0.040551 -0.026143 -0.010199 -0.023197 -0.010713 -0.012877 -0.040551 -0.012883 -0.010199 0.004485 -0.000007 -0.025484 0.010626 0.000849 0.002651 -0.028255 0.000295 -0.019377 0.013332 0.003514 -0.005048 0.012798 0.000333 -0.005951 -0.015803 0.002187 -0.014369 -0.013341 -0.003209 -0.016395 0.004675 -0.002400 -0.004481 0.002779 0.000374 -0.003048 0.026117 -0.007505 -0.017965 0.028859 -0.001994 -0.015040 -0.018952 -0.009957 -0.016014 -0.017184 -0.003861 -0.014796 0.020301 0.003439 -0.001538 0.046716 -0.013576 0.023724 0.055055 -0.021059 0.018567 0.055055 -0.007800 0.018567 -0.007396 0.002390 -0.007873 0.001875 -0.002670 -0.006494 0.038019 -0.008659 0.029998 -0.008029 -0.002626 -0.003881 -0.005500 -0.000144 -0.009081 -0.016373 -0.003539 -0.018074 -0.010554 -0.001307 0.012690 0.049300 -0.002253 0.010554 0.038759 -0.002166 0.014632 0.005684 -0.003039 -0.035812 0.038019 0.004600 0.029998 0.038019 0.010016 0.029998 -0.026286 -0.002491 -0.003954 0.017414 0.003222 -0.004081 0.044485 0.002423 0.015009 0.040181 0.004389 0.016007 -0.000017 0.000235 -0.005153 -0.033970 -0.003806 -0.010656 0.009082 0.001920 -0.014465 0.017757 0.000902 -0.014705 -0.030192 -0.001153 -0.014581 0.025315 0.003889 0.003730 0.024009 0.004399 0.004815 -0.000443 0.002808 -0.014194 0.005274 0.003135 -0.010676 0.006826 0.002728 -0.011961 0.008126 0.003261 -0.008819 0.003879 -0.000228 -0.008173 0.032342 0.006310 0.016942 0.023610 0.001317 -0.009141 0.028043 0.004252 0.006706 0.028016 -0.000536 0.005381 0.017259 0.006519 0.029649 -0.032441 -0.018179 -0.033098 0.022512 0.003646 0.000819 0.027741 0.001325 0.014450 0.028451 0.005830 0.015287 -0.017863 -0.003577 0.009446 0.021215 0.004148 0.001990 0.025358 0.002875 -0.000357 -0.025580 0.001252 -0.027579 -0.032441 -0.004919 -0.033098 -0.038228 -0.001462 -0.027638 -0.019666 0.002058 -0.021535 0.028581 -0.008715 0.037841 0.010757 0.003389 -0.006914 0.019618 0.002475 -0.006065 -0.031224 -0.009287 0.002956 -0.031224 -0.027962 0.002956 0.034589 -0.002055 -0.008644 -0.002831 -0.000029 -0.007070 -0.005830 0.001763 -0.004361 -0.038103 -0.007971 -0.006212 0.031060 0.005869 0.013961 -0.030292 0.001057 -0.034857 -0.024162 -0.006173 0.006457 -0.042999 -0.006964 -0.014187 0.001834 0.002718 0.019362 0.049505 -0.002359 0.021843 0.011040 0.003784 0.006750 -0.001834 0.002801 -0.003863 0.001083 0.003102 -0.001764 0.022848 0.008014 0.033651 0.023375 -0.002185 -0.020891 0.028581 0.009961 0.037841 0.006652 0.003669 0.002024 0.009164 0.003881 0.003676 0.008207 0.003356 0.004901 0.049505 0.003057 0.021843 0.055055 -0.002384 0.018567 0.001013 -0.000353 -0.009972 0.029329 0.005348 0.010717 -0.004550 0.002514 -0.005831 -0.007071 0.002482 -0.017312 0.046366 0.005522 0.023902 -0.045621 -0.024839 -0.019740 0.041488 0.008760 0.027307 0.033206 0.010046 0.034162 0.026563 0.004882 0.007661 3 43 45 44 3 65 67 66 3 69 71 70 3 99 101 100 3 61 63 138 3 65 143 142 3 147 149 148 3 154 156 155 3 159 160 45 3 168 48 169 3 173 175 174 3 43 44 176 3 187 188 77 3 67 196 195 3 66 67 195 3 150 179 152 3 203 204 205 3 206 208 207 3 176 44 209 3 232 233 234 3 235 127 236 3 48 49 1 3 239 242 241 3 253 143 65 3 87 235 59 3 152 179 177 3 41 39 125 3 179 272 271 3 274 276 275 3 283 277 284 3 266 107 173 3 288 289 291 3 48 168 49 3 208 262 207 3 156 262 295 3 297 169 284 3 142 67 65 3 188 298 75 3 268 300 269 3 300 0 269 3 312 232 234 3 1 49 0 3 236 127 149 3 233 63 61 3 265 24 318 3 319 264 236 3 321 126 125 3 79 222 323 3 276 288 291 3 107 71 69 3 149 327 326 3 269 63 233 3 49 244 0 3 77 331 330 3 332 168 297 3 268 269 233 3 142 20 266 3 325 54 55 3 262 330 205 3 0 244 63 3 195 136 222 3 336 338 337 3 79 340 194 3 246 174 265 3 195 222 194 3 26 138 349 3 333 346 350 3 351 333 127 3 169 352 284 3 325 55 308 3 244 332 324 3 241 242 277 3 354 241 277 3 39 271 155 3 59 235 264 3 169 355 238 3 205 204 295 3 20 108 107 3 335 154 214 3 87 341 358 3 358 351 87 3 107 69 173 3 359 324 329 3 41 177 39 3 326 319 236 3 100 173 174 3 359 329 364 3 214 154 155 3 154 335 207 3 283 354 277 3 142 143 21 3 289 366 291 3 348 253 66 3 138 367 349 3 368 329 242 3 361 305 341 3 77 341 331 3 232 268 233 3 338 187 337 3 174 369 100 3 100 369 99 3 43 265 174 3 265 43 176 3 127 333 342 3 154 207 156 3 196 200 344 3 188 187 357 3 188 75 77 3 173 371 175 3 340 348 194 3 372 44 373 3 147 340 79 3 333 350 334 3 126 41 125 3 330 262 208 3 291 366 352 3 374 376 136 3 351 346 333 3 377 379 378 3 331 375 205 3 355 152 238 3 380 381 326 3 234 233 61 3 367 324 359 3 196 101 200 3 342 128 127 3 188 357 298 3 379 371 378 3 358 325 308 3 383 148 128 3 177 291 238 3 138 324 367 3 136 344 374 3 173 101 266 3 168 169 297 3 149 326 236 3 209 372 384 3 108 71 107 3 337 187 330 3 149 127 128 3 357 187 338 3 373 45 160 3 173 100 101 3 265 318 246 3 101 99 200 3 21 108 20 3 24 265 176 3 55 346 308 3 371 70 378 3 152 177 238 3 351 127 235 3 168 244 49 3 26 61 138 3 305 375 331 3 266 101 196 3 156 295 125 3 168 332 244 3 308 346 351 3 366 283 284 3 329 332 242 3 244 138 63 3 177 179 39 3 136 196 344 3 361 87 59 3 77 358 341 3 373 44 45 3 327 79 386 3 207 262 156 3 148 149 128 3 55 350 346 3 222 79 194 3 332 297 277 3 39 155 156 3 147 148 365 3 242 332 277 3 187 77 330 3 1 0 300 3 372 209 44 3 246 369 174 3 26 349 318 3 26 318 24 3 332 329 324 3 155 271 385 3 156 125 39 3 271 272 385 3 364 329 368 3 175 379 159 3 348 66 194 3 383 365 148 3 136 389 222 3 342 390 383 3 326 327 386 3 126 275 41 3 323 222 389 3 277 297 284 3 142 266 67 3 173 69 371 3 75 298 54 3 380 326 386 3 381 319 326 3 388 79 323 3 308 351 358 3 352 169 238 3 386 79 388 3 136 376 389 3 239 368 242 3 208 337 330 3 358 75 325 3 77 75 358 3 253 65 66 3 0 63 269 3 361 341 87 3 204 321 295 3 266 20 107 3 147 365 340 3 43 174 175 3 75 54 325 3 128 342 383 3 150 272 179 3 266 196 67 3 175 159 43 3 312 363 384 3 351 235 87 3 355 150 152 3 206 336 208 3 214 155 385 3 147 79 327 3 208 336 337 3 291 177 41 3 363 234 61 3 363 312 234 3 371 69 70 3 274 288 276 3 159 377 160 3 66 195 194 3 330 331 205 3 321 125 295 3 342 334 390 3 176 363 61 3 26 176 61 3 375 203 205 3 379 175 371 3 341 305 331 3 291 41 276 3 24 176 26 3 262 205 295 3 209 363 176 3 276 41 275 3 159 45 43 3 335 206 207 3 20 142 21 3 366 284 352 3 147 327 149 3 39 179 271 3 209 384 363 3 379 377 159 3 264 235 236 3 333 334 342 3 195 196 136 3 244 324 138 3 291 352 238 3 1 2 3 3 21 22 23 3 47 48 3 3 108 23 90 3 48 1 3 3 253 141 143 3 268 270 2 3 2 300 268 3 97 232 312 3 97 312 316 3 23 22 167 3 48 47 169 3 6 90 258 3 317 47 3 3 193 4 216 3 95 97 316 3 4 193 296 3 4 89 6 3 282 347 93 3 348 347 253 3 316 250 248 3 89 90 6 3 372 373 303 3 2 230 301 3 143 141 260 3 70 89 296 3 377 378 296 3 301 317 2 3 282 141 347 3 328 302 313 3 141 253 347 3 71 90 89 3 328 384 372 3 108 90 71 3 328 303 302 3 217 158 216 3 373 160 158 3 21 23 108 3 378 70 296 3 22 287 167 3 312 362 316 3 89 4 296 3 143 260 21 3 328 313 362 3 1 300 2 3 270 268 232 3 22 260 287 3 316 362 250 3 84 90 23 3 71 89 70 3 141 282 287 3 230 2 270 3 193 216 158 3 362 313 250 3 270 232 97 3 348 340 93 3 84 258 90 3 312 384 362 3 377 296 193 3 193 158 160 3 373 158 303 3 377 193 160 3 317 3 2 3 95 230 97 3 230 270 97 3 372 303 328 3 217 303 158 3 328 362 384 3 248 95 316 3 217 302 303 3 84 23 167 3 260 22 21 3 260 141 287 3 347 348 93 3 54 56 55 3 83 85 84 3 56 54 109 3 212 214 213 3 216 218 217 3 219 83 167 3 230 213 231 3 248 250 249 3 56 220 55 3 286 219 287 3 85 220 258 3 185 317 183 3 150 183 272 3 83 334 85 3 336 339 338 3 301 230 231 3 95 248 212 3 183 301 231 3 109 216 4 3 282 286 287 3 169 47 355 3 338 339 36 3 335 214 212 3 4 220 56 3 339 313 302 3 85 334 350 3 47 317 185 3 357 36 218 3 382 206 335 3 250 313 382 3 334 83 219 3 231 213 272 3 218 36 217 3 219 286 383 3 220 4 6 3 286 282 93 3 183 317 301 3 213 214 385 3 167 83 84 3 357 109 298 3 36 357 338 3 272 213 385 3 55 85 350 3 85 258 84 3 336 382 339 3 336 206 382 3 249 250 382 3 230 95 213 3 47 185 355 3 340 365 93 3 248 249 212 3 383 286 365 3 219 383 390 3 249 382 335 3 218 216 109 3 219 167 287 3 286 93 365 3 217 36 302 3 54 298 109 3 357 218 109 3 185 150 355 3 183 231 272 3 36 339 302 3 313 339 382 3 334 219 390 3 185 183 150 3 85 55 220 3 213 95 212 3 258 220 6 3 56 109 4 3 335 212 249 3 14 310 309 4 0 1 2 3 4 4 5 6 7 4 8 9 10 11 4 12 13 14 15 4 16 17 18 19 4 20 21 22 23 4 24 25 26 27 4 28 29 30 31 4 32 33 34 35 4 36 37 33 38 4 39 40 41 42 4 43 44 45 46 4 47 3 48 49 4 50 51 52 53 4 54 55 56 57 4 58 59 60 13 4 61 62 63 64 4 65 66 67 68 4 69 70 71 72 4 73 8 30 74 4 75 76 77 78 4 79 80 81 82 4 83 84 85 86 4 87 88 60 13 4 89 7 90 72 4 91 78 88 92 4 93 82 94 17 4 95 96 97 98 4 99 100 101 102 4 103 104 105 106 4 107 108 23 90 4 56 109 54 110 4 111 7 112 113 4 114 115 116 117 4 91 118 110 119 4 120 121 122 123 4 124 125 126 123 4 127 18 128 129 4 130 131 132 133 4 134 135 136 81 4 105 27 137 74 4 61 138 63 62 4 122 139 140 123 4 65 141 142 143 4 47 144 130 133 4 27 145 96 146 4 147 148 149 82 4 150 151 152 153 4 154 155 156 157 4 158 159 160 45 4 161 162 163 164 4 165 145 27 166 4 167 12 84 86 4 168 169 48 170 4 5 171 166 172 4 173 174 175 112 4 43 176 44 46 4 177 178 179 163 4 180 181 182 139 4 183 184 185 153 4 8 186 157 11 4 187 77 188 37 4 173 116 112 72 4 189 190 191 92 4 192 186 125 42 4 159 158 193 46 4 79 81 194 82 4 67 195 196 197 4 122 198 140 182 4 66 195 67 199 4 150 152 179 153 4 200 50 99 102 4 12 201 52 53 4 15 14 58 13 4 202 120 140 123 4 191 203 204 205 4 152 151 163 153 4 206 207 208 10 4 176 209 44 210 4 137 35 211 74 4 212 213 214 215 4 216 217 218 119 4 219 167 83 86 4 118 220 221 56 4 195 199 222 197 4 174 223 224 225 4 137 226 165 27 4 47 132 130 227 4 88 228 221 86 4 131 170 132 133 4 106 31 137 229 4 230 231 213 29 4 232 233 97 234 4 235 236 127 18 4 48 3 1 49 4 214 154 212 157 4 130 237 182 161 4 114 68 141 117 4 125 123 192 42 4 238 181 177 144 4 239 240 241 242 4 103 243 244 245 4 193 111 159 46 4 246 224 25 225 4 184 161 247 151 4 248 249 250 251 4 94 199 93 252 4 253 141 65 143 4 254 255 240 256 4 257 210 176 46 4 258 221 12 259 4 22 115 260 117 4 260 115 114 117 4 94 82 81 17 4 96 146 145 98 4 178 163 261 153 4 262 263 208 10 4 264 13 58 18 4 24 265 25 225 4 87 235 60 59 4 152 177 179 163 4 116 101 102 266 4 34 35 33 38 4 24 257 176 225 4 41 125 39 42 4 261 164 40 229 4 94 17 16 19 4 267 81 79 80 4 268 269 2 270 4 95 74 248 98 4 179 271 272 178 4 178 184 261 29 4 25 27 273 62 4 274 121 275 276 4 277 256 242 278 4 273 226 279 280 4 210 145 250 166 4 181 133 47 281 4 282 17 94 19 4 56 55 220 57 4 283 284 277 285 4 182 162 161 164 4 286 287 219 129 4 266 173 107 116 4 174 224 246 225 4 282 18 93 17 4 51 114 94 19 4 288 289 290 291 4 223 257 165 225 4 205 34 191 92 4 47 48 168 49 4 292 293 256 294 4 208 207 262 10 4 156 295 262 11 4 149 80 147 82 4 223 46 257 225 4 296 111 193 113 4 165 257 223 5 4 297 284 169 281 4 117 142 67 65 4 188 75 298 299 4 85 258 220 221 4 170 133 180 281 4 178 215 30 42 4 270 104 230 64 4 2 268 300 269 4 184 106 301 227 4 302 210 172 303 4 106 237 261 229 4 221 118 91 259 4 300 0 2 269 4 304 88 305 78 4 182 131 198 306 4 3 307 49 245 4 55 308 220 57 4 132 243 103 245 4 14 309 310 311 4 145 74 96 98 4 178 29 183 153 4 44 210 303 172 4 97 312 232 234 4 302 166 313 38 4 1 49 3 0 4 174 111 223 225 4 94 81 314 17 4 73 31 30 229 4 177 139 291 123 4 140 198 137 106 4 211 192 73 186 4 236 149 127 18 4 100 224 174 112 4 176 210 24 315 4 261 29 184 237 4 269 104 270 64 4 292 294 280 293 4 97 316 312 234 4 250 145 248 251 4 23 167 22 115 4 135 51 50 197 4 61 315 26 62 4 48 169 47 170 4 234 315 61 64 4 178 229 40 42 4 137 145 165 35 4 233 61 63 64 4 185 183 317 184 4 46 113 5 172 4 177 181 291 139 4 6 258 90 7 4 135 81 51 197 4 265 24 25 318 4 319 236 264 320 4 181 162 177 144 4 321 126 124 125 4 8 10 263 11 4 322 79 222 323 4 244 103 324 243 4 54 110 325 57 4 73 34 211 186 4 114 116 53 102 4 189 211 191 192 4 51 68 94 252 4 317 3 47 132 4 290 276 288 291 4 282 94 93 252 4 106 227 237 306 4 91 299 110 76 4 261 247 184 161 4 294 292 280 279 4 179 178 272 153 4 150 272 183 153 4 193 216 4 113 4 107 90 69 71 4 12 53 84 7 4 33 171 302 38 4 198 293 137 306 4 149 326 327 320 4 269 233 63 64 4 49 0 244 245 4 6 221 258 259 4 166 171 35 38 4 47 247 317 227 4 291 139 276 123 4 44 209 328 210 4 168 170 47 245 4 191 190 304 92 4 181 285 291 139 4 329 243 293 256 4 95 316 97 96 4 96 62 315 64 4 60 88 15 13 4 77 330 331 76 4 293 103 105 306 4 182 181 180 133 4 137 27 165 145 4 50 197 51 102 4 332 297 168 170 4 106 29 301 31 4 34 76 33 92 4 40 162 140 164 4 320 80 149 17 4 137 106 198 306 4 30 157 73 42 4 140 182 198 306 4 268 233 269 64 4 106 307 301 227 4 142 266 20 117 4 83 333 85 334 4 47 170 169 281 4 313 166 35 38 4 325 55 54 57 4 30 8 73 157 4 262 205 330 263 4 0 63 244 103 4 125 186 156 42 4 3 132 317 307 4 12 112 53 7 4 250 35 313 166 4 94 114 51 252 4 195 222 136 197 4 335 10 249 11 4 18 17 129 19 4 111 46 223 225 4 336 337 338 339 4 266 68 101 102 4 156 186 157 42 4 13 86 12 19 4 18 129 16 19 4 294 255 254 256 4 293 243 180 256 4 137 73 140 229 4 4 296 193 113 4 79 194 340 82 4 295 186 262 11 4 305 78 341 92 4 157 9 8 11 4 342 286 219 343 4 140 306 106 229 4 196 135 344 197 4 93 199 94 82 4 198 182 345 180 4 329 293 294 256 4 5 46 111 113 4 163 161 261 153 4 242 254 240 256 4 293 131 180 170 4 216 259 4 113 4 346 333 85 228 4 207 10 335 11 4 40 164 140 229 4 246 265 174 225 4 195 194 222 199 4 66 347 348 199 4 26 349 138 62 4 333 346 85 350 4 301 231 230 29 4 347 199 68 252 4 351 127 333 343 4 95 212 248 9 4 140 164 182 229 4 73 192 40 42 4 240 242 239 254 4 114 68 51 252 4 213 29 231 215 4 248 145 250 146 4 182 237 261 161 4 52 51 12 53 4 2 270 269 104 4 258 6 5 7 4 184 151 185 153 4 81 199 94 197 4 219 129 287 86 4 97 96 316 64 4 248 74 95 9 4 183 231 301 29 4 169 284 352 281 4 314 80 320 17 4 104 64 96 98 4 217 5 216 172 4 286 343 127 129 4 292 198 255 256 4 33 37 36 119 4 121 276 290 139 4 290 285 353 139 4 130 131 237 227 4 349 273 138 62 4 169 181 238 144 4 325 308 55 57 4 33 76 37 119 4 152 163 179 153 4 111 46 193 113 4 8 263 34 186 4 244 324 332 243 4 104 106 103 307 4 109 4 216 118 4 295 192 204 186 4 241 242 240 277 4 240 354 241 277 4 204 192 191 186 4 39 155 271 215 4 36 37 218 119 4 110 118 91 57 4 353 122 290 139 4 88 78 304 92 4 282 287 286 129 4 303 158 45 46 4 314 322 267 81 4 201 223 165 225 4 230 31 28 98 4 84 12 258 86 4 28 29 213 215 4 59 264 235 18 4 4 6 89 7 4 132 170 47 133 4 51 197 68 102 4 169 355 47 238 4 141 68 114 252 4 356 314 52 51 4 35 251 8 74 4 93 18 282 129 4 218 37 357 299 4 191 205 204 295 4 20 23 107 108 4 149 18 236 320 4 39 215 178 42 4 267 309 314 320 4 47 181 169 144 4 47 170 132 245 4 338 337 36 339 4 216 5 217 259 4 335 154 212 214 4 212 157 249 9 4 173 112 175 72 4 20 116 22 117 4 87 358 341 57 4 2 269 0 104 4 358 87 351 57 4 107 173 69 72 4 217 113 158 172 4 25 226 273 27 4 359 329 324 280 4 41 39 177 40 4 360 226 137 280 4 112 7 5 113 4 4 220 118 56 4 60 87 361 88 4 257 5 165 166 4 224 50 52 53 4 326 236 319 320 4 249 251 248 9 4 218 299 109 118 4 305 304 361 88 4 47 133 170 281 4 100 174 173 112 4 121 139 122 123 4 198 293 292 280 4 316 362 363 146 4 32 34 211 35 4 226 280 273 62 4 294 359 329 364 4 85 228 83 86 4 244 105 324 103 4 40 178 177 163 4 214 155 154 157 4 161 151 184 153 4 169 181 47 281 4 302 33 36 171 4 154 207 335 11 4 302 171 217 172 4 20 23 22 116 4 293 103 324 280 4 283 277 354 285 4 255 180 345 278 4 339 302 313 38 4 154 249 212 157 4 27 145 210 166 4 365 93 148 82 4 28 31 74 98 4 282 93 347 252 4 121 275 276 123 4 261 178 40 164 4 53 112 173 116 4 142 21 143 117 4 81 82 80 17 4 289 291 366 285 4 140 137 211 73 4 360 137 198 280 4 348 66 253 347 4 137 27 105 280 4 101 68 196 102 4 138 349 367 273 4 316 248 250 146 4 51 81 94 197 4 53 116 100 102 4 140 73 211 192 4 368 242 329 256 4 63 104 269 64 4 361 341 305 88 4 182 164 237 229 4 337 37 339 263 4 180 243 293 170 4 77 331 341 78 4 140 162 182 164 4 154 157 156 11 4 44 46 210 172 4 232 233 268 64 4 263 10 262 11 4 51 68 114 102 4 363 315 316 146 4 66 68 347 199 4 140 162 40 123 4 338 337 187 37 4 327 320 326 80 4 174 224 100 369 4 100 224 99 369 4 339 37 36 38 4 43 111 174 265 4 250 145 210 146 4 265 176 43 225 4 180 281 285 278 4 127 342 333 343 4 154 156 207 11 4 69 71 90 72 4 196 344 200 50 4 209 210 176 315 4 140 40 73 192 4 165 5 12 259 4 223 112 12 5 4 220 118 221 6 4 188 357 187 37 4 188 77 75 299 4 304 60 361 88 4 220 228 221 57 4 272 178 231 153 4 182 161 261 164 4 327 326 267 80 4 319 58 370 320 4 58 309 14 311 4 211 34 73 35 4 259 171 217 119 4 238 163 152 144 4 173 175 371 72 4 12 53 51 19 4 89 6 90 7 4 83 343 219 86 4 159 111 43 46 4 182 180 198 131 4 340 194 348 199 4 177 162 181 139 4 88 13 87 228 4 303 46 44 172 4 137 106 105 31 4 69 90 107 72 4 74 31 105 98 4 372 303 373 44 4 329 293 324 280 4 258 12 84 7 4 224 53 100 102 4 47 238 355 144 4 47 49 168 245 4 314 51 356 81 4 304 78 305 92 4 136 134 374 135 4 141 114 287 19 4 165 27 226 257 4 2 301 230 104 4 90 7 23 72 4 27 145 137 74 4 263 186 8 11 4 147 79 340 82 4 359 273 279 280 4 375 304 305 92 4 5 7 4 113 4 223 53 12 112 4 137 105 293 280 4 333 85 334 350 4 148 93 149 17 4 137 31 73 229 4 34 33 32 92 4 91 118 221 57 4 126 125 41 123 4 143 260 141 117 4 330 208 262 263 4 370 309 267 320 4 47 185 317 247 4 83 228 343 86 4 304 203 191 92 4 317 307 132 227 4 30 29 178 229 4 291 352 366 285 4 91 57 221 78 4 184 247 261 237 4 374 134 136 376 4 294 254 368 256 4 371 70 89 296 4 261 237 247 161 4 357 218 36 37 4 347 68 141 252 4 59 13 264 18 4 351 333 346 228 4 124 120 202 123 4 231 178 272 215 4 316 315 96 146 4 36 339 337 37 4 152 144 163 151 4 377 296 378 379 4 255 198 345 180 4 251 74 248 9 4 324 103 105 280 4 88 57 341 78 4 354 277 240 278 4 13 228 88 86 4 192 123 40 42 4 105 104 96 98 4 100 53 173 116 4 331 205 375 92 4 352 181 169 281 4 240 255 345 278 4 355 238 152 144 4 370 380 381 326 4 234 61 233 64 4 105 62 96 64 4 30 229 178 42 4 67 117 68 266 4 63 103 0 104 4 93 199 347 252 4 301 2 317 307 4 132 227 103 306 4 110 57 91 78 4 367 359 324 280 4 293 243 132 170 4 258 221 85 228 4 332 256 297 170 4 382 335 206 10 4 250 382 313 38 4 178 29 30 215 4 333 334 83 219 4 65 141 253 68 4 53 116 114 115 4 97 234 233 64 4 237 164 261 229 4 282 347 141 252 4 326 320 267 80 4 341 88 87 57 4 210 328 302 313 4 169 238 47 144 4 34 263 8 35 4 32 88 190 92 4 40 162 177 123 4 290 276 291 139 4 231 272 213 215 4 25 201 226 225 4 196 200 101 50 4 96 315 27 146 4 342 286 127 128 4 4 118 6 259 4 317 247 184 227 4 12 13 88 86 4 188 298 357 299 4 141 347 253 68 4 290 274 276 121 4 379 378 371 296 4 63 62 105 64 4 110 118 299 119 4 166 171 302 172 4 290 289 353 285 4 358 308 325 57 4 103 106 105 306 4 193 46 158 113 4 165 201 12 223 4 383 148 286 128 4 106 29 261 237 4 12 5 112 7 4 67 199 195 197 4 177 238 291 181 4 58 13 16 18 4 138 367 324 280 4 26 315 27 62 4 37 263 330 76 4 136 374 344 135 4 116 173 101 266 4 237 131 182 306 4 35 251 250 38 4 77 76 331 78 4 168 297 169 170 4 149 236 326 320 4 71 89 90 72 4 105 103 293 280 4 209 328 384 372 4 279 226 360 280 4 354 285 277 278 4 87 228 351 57 4 68 199 94 252 4 93 18 149 17 4 368 254 242 256 4 108 90 107 71 4 196 50 101 102 4 337 330 187 37 4 328 210 302 303 4 265 111 174 225 4 341 78 331 92 4 217 216 158 113 4 345 285 180 139 4 149 128 127 18 4 226 257 27 225 4 249 10 382 251 4 105 106 137 306 4 357 338 187 37 4 130 144 47 151 4 249 9 157 11 4 373 158 160 45 4 10 9 249 11 4 114 115 287 19 4 222 322 136 81 4 173 116 101 100 4 132 131 293 170 4 165 223 12 5 4 331 78 76 92 4 345 182 122 139 4 261 29 106 229 4 265 25 246 318 4 88 221 12 86 4 101 200 99 102 4 145 146 248 74 4 32 33 91 92 4 211 35 73 74 4 177 162 163 144 4 157 186 156 11 4 218 217 36 119 4 287 19 86 129 4 145 35 137 74 4 63 105 244 103 4 6 118 221 259 4 21 23 20 108 4 321 125 124 192 4 24 176 265 225 4 283 354 353 285 4 149 93 148 18 4 165 166 5 171 4 73 35 8 74 4 25 27 24 225 4 55 346 85 308 4 36 171 33 119 4 217 171 36 119 4 103 307 132 245 4 219 342 383 286 4 371 378 70 296 4 316 315 234 64 4 152 238 177 163 4 168 243 332 170 4 138 280 105 62 4 34 190 92 32 4 223 5 257 172 4 33 35 32 171 4 18 343 13 129 4 351 235 127 343 4 13 12 14 16 4 371 296 89 72 4 97 233 232 64 4 220 4 118 6 4 16 14 58 309 4 5 113 216 172 4 73 229 30 42 4 168 49 244 245 4 26 138 61 62 4 96 145 27 74 4 210 145 27 146 4 80 82 149 17 4 305 331 375 92 4 346 85 308 228 4 0 307 103 245 4 230 64 104 98 4 266 196 101 68 4 333 343 83 228 4 226 27 25 225 4 286 93 282 129 4 116 53 84 115 4 161 144 130 151 4 6 258 5 259 4 198 131 293 306 4 50 224 99 102 4 162 139 177 123 4 220 221 56 57 4 181 285 180 281 4 168 48 47 170 4 356 51 135 81 4 103 227 106 306 4 147 80 79 82 4 76 78 91 92 4 221 57 88 78 4 156 125 295 186 4 224 201 25 225 4 183 301 317 184 4 173 53 100 112 4 226 201 165 225 4 58 319 264 320 4 250 35 145 251 4 198 180 255 256 4 230 104 301 31 4 184 29 106 237 4 208 263 337 10 4 168 244 332 243 4 236 18 264 320 4 182 306 140 229 4 283 353 366 285 4 182 237 130 131 4 284 285 352 281 4 178 163 40 164 4 181 144 47 133 4 266 117 68 102 4 308 351 346 228 4 213 28 230 29 4 261 237 182 164 4 122 182 140 139 4 22 167 287 115 4 213 385 214 215 4 267 380 370 326 4 379 296 371 72 4 297 281 170 278 4 366 285 284 283 4 210 46 257 172 4 218 118 216 119 4 146 74 145 98 4 312 363 316 362 4 260 114 141 117 4 141 114 260 115 4 329 242 332 256 4 105 244 138 63 4 262 186 263 11 4 177 39 179 178 4 94 199 68 197 4 325 110 358 57 4 167 84 83 86 4 163 162 40 164 4 136 344 196 135 4 132 307 3 245 4 263 251 382 10 4 361 87 60 59 4 60 235 87 13 4 375 203 304 92 4 321 124 191 192 4 267 320 314 80 4 47 132 3 245 4 222 199 81 197 4 176 210 44 46 4 177 163 238 144 4 299 357 109 298 4 110 76 75 78 4 77 341 358 78 4 357 37 188 299 4 224 223 201 225 4 91 171 259 119 4 34 263 33 76 4 157 28 8 9 4 36 338 357 37 4 344 135 50 197 4 271 178 39 215 4 373 45 44 303 4 105 31 104 98 4 58 309 370 320 4 250 210 362 146 4 267 327 79 386 4 211 34 190 189 4 293 131 132 306 4 8 35 263 251 4 207 156 262 11 4 40 192 140 123 4 189 124 211 192 4 105 104 63 64 4 264 18 58 320 4 272 385 213 215 4 142 143 141 117 4 205 295 191 186 4 50 53 224 102 4 148 128 149 18 4 99 224 100 102 4 261 184 178 153 4 180 285 345 278 4 4 7 89 113 4 231 178 183 153 4 55 346 350 85 4 104 31 230 98 4 222 194 79 81 4 269 270 268 64 4 258 5 12 7 4 110 299 75 76 4 5 166 257 172 4 3 49 47 245 4 93 94 282 17 4 16 13 12 19 4 292 255 294 256 4 27 210 257 166 4 337 263 336 10 4 16 320 18 17 4 332 277 297 256 4 105 106 104 31 4 41 40 177 123 4 39 156 155 157 4 161 162 182 144 4 16 18 13 129 4 131 227 132 306 4 73 8 34 186 4 89 296 4 113 4 210 315 363 146 4 132 307 103 227 4 147 82 365 148 4 339 263 382 10 4 32 211 165 35 4 345 180 182 139 4 289 285 290 139 4 106 306 237 229 4 104 106 301 31 4 242 277 332 256 4 85 84 258 86 4 103 132 293 243 4 224 223 174 112 4 143 21 260 117 4 109 110 56 118 4 336 339 382 10 4 187 330 77 37 4 328 362 313 210 4 196 68 67 197 4 58 311 370 309 4 298 110 109 299 4 1 0 2 300 4 336 382 206 10 4 372 44 209 328 4 137 74 73 31 4 272 178 271 215 4 293 105 137 306 4 145 35 250 166 4 26 27 25 62 4 301 106 184 29 4 240 277 242 278 4 263 251 35 38 4 34 211 190 32 4 249 382 250 251 4 176 46 43 225 4 294 293 329 280 4 148 18 286 128 4 39 178 40 42 4 122 121 290 139 4 261 161 163 164 4 230 213 95 28 4 12 223 201 53 4 36 337 338 37 4 75 299 77 76 4 363 210 209 315 4 216 118 4 259 4 379 193 296 111 4 163 144 161 151 4 270 232 268 64 4 335 249 154 11 4 249 157 154 11 4 130 237 247 227 4 230 29 28 31 4 294 255 292 387 4 285 281 284 278 4 263 10 8 251 4 287 114 141 115 4 282 252 141 19 4 246 224 174 369 4 47 247 130 151 4 26 349 25 318 4 26 25 24 318 4 316 234 97 64 4 182 162 181 144 4 243 170 168 245 4 279 329 359 280 4 286 18 93 129 4 84 12 167 115 4 8 28 30 74 4 32 15 190 88 4 5 259 165 171 4 22 287 260 115 4 190 34 92 189 4 221 228 88 57 4 23 116 107 72 4 353 354 240 278 4 138 273 367 280 4 222 81 136 197 4 258 228 85 86 4 107 116 173 72 4 27 257 165 166 4 254 255 294 387 4 332 324 329 243 4 230 28 95 98 4 244 243 168 245 4 47 355 185 151 4 316 250 362 146 4 40 163 177 162 4 155 385 271 215 4 180 256 243 170 4 156 39 125 42 4 248 146 95 98 4 271 385 272 215 4 84 23 90 7 4 221 118 56 57 4 364 368 329 294 4 8 157 30 28 4 175 159 379 111 4 136 81 135 197 4 204 321 191 192 4 243 256 332 170 4 217 259 5 171 4 340 93 365 82 4 180 285 181 139 4 71 70 89 72 4 84 53 12 115 4 222 79 322 81 4 58 14 16 13 4 141 287 282 19 4 303 45 44 46 4 230 270 2 104 4 33 263 37 76 4 100 53 224 112 4 112 116 53 7 4 2 0 3 307 4 105 280 27 62 4 319 370 311 381 4 35 171 33 38 4 216 259 217 119 4 337 339 336 263 4 33 76 91 92 4 188 37 77 299 4 132 170 243 245 4 248 212 249 9 4 140 120 122 123 4 181 162 182 139 4 382 263 339 38 4 22 116 23 115 4 267 79 322 388 4 41 123 125 42 4 308 85 220 228 4 284 281 297 278 4 279 360 292 280 4 175 112 174 111 4 348 194 66 199 4 18 320 149 17 4 165 257 226 225 4 77 299 37 76 4 137 293 198 280 4 51 53 50 102 4 351 228 308 57 4 32 165 12 259 4 101 50 200 102 4 184 29 178 153 4 49 307 0 245 4 97 64 230 98 4 211 34 191 186 4 282 129 18 17 4 29 31 106 229 4 136 135 196 197 4 111 43 225 265 4 205 263 34 76 4 79 327 267 80 4 291 181 352 285 4 40 123 41 42 4 67 68 66 199 4 34 8 73 35 4 352 285 181 281 4 40 178 261 229 4 43 111 225 46 4 329 294 368 256 4 383 365 286 148 4 103 307 106 227 4 193 158 216 113 4 191 34 189 92 4 293 132 103 306 4 358 57 110 78 4 140 106 137 229 4 30 31 29 229 4 301 106 104 307 4 358 110 75 78 4 52 201 224 53 4 136 322 222 389 4 342 219 383 390 4 277 285 284 278 4 16 51 314 94 4 267 326 327 386 4 23 7 116 72 4 94 252 282 19 4 356 135 134 81 4 130 144 182 133 4 126 41 275 123 4 112 5 111 113 4 134 322 136 389 4 261 163 178 164 4 203 205 191 92 4 296 113 89 72 4 53 114 51 19 4 322 323 222 389 4 257 166 210 172 4 297 170 256 278 4 105 74 137 31 4 343 129 219 86 4 0 103 244 245 4 301 29 230 31 4 88 228 87 57 4 277 284 297 278 4 81 199 194 82 4 125 192 295 186 4 142 117 67 266 4 91 76 33 119 4 173 371 69 72 4 75 54 298 110 4 166 302 210 172 4 351 343 333 228 4 183 29 184 153 4 25 265 246 225 4 324 105 138 280 4 331 76 205 92 4 53 116 84 7 4 249 335 382 10 4 380 326 267 386 4 209 362 328 210 4 370 381 319 326 4 91 76 110 78 4 218 109 216 118 4 322 388 79 323 4 13 343 87 228 4 15 88 12 13 4 353 285 354 278 4 219 287 167 86 4 240 256 255 278 4 262 10 207 11 4 308 358 351 57 4 32 91 88 92 4 170 281 180 278 4 158 46 303 172 4 352 238 169 181 4 191 34 205 186 4 27 96 105 62 4 191 295 204 186 4 267 386 79 388 4 322 79 267 81 4 73 74 30 31 4 367 273 359 280 4 324 103 293 243 4 114 252 94 19 4 136 376 134 389 4 315 62 61 64 4 8 74 251 9 4 261 161 184 153 4 198 180 293 131 4 326 319 370 320 4 214 157 212 215 4 333 83 85 228 4 33 171 91 119 4 85 221 220 228 4 159 193 379 111 4 73 186 192 42 4 353 289 366 285 4 286 148 365 93 4 10 251 249 9 4 169 170 297 281 4 95 146 96 98 4 182 144 181 133 4 182 131 130 133 4 129 86 13 19 4 141 252 114 19 4 130 132 47 133 4 148 82 93 17 4 127 128 286 129 4 128 18 286 129 4 12 51 16 19 4 314 320 16 17 4 12 86 167 19 4 140 192 124 123 4 8 251 10 9 4 239 242 368 254 4 333 219 83 343 4 217 302 36 171 4 13 18 235 343 4 208 330 337 263 4 257 46 176 225 4 118 259 216 119 4 12 5 258 259 4 304 190 60 88 4 358 325 75 110 4 116 7 112 72 4 23 116 84 115 4 32 35 165 171 4 135 52 50 51 4 51 114 53 102 4 77 358 75 78 4 27 315 96 62 4 326 370 267 320 4 253 66 65 68 4 255 256 180 278 4 209 363 362 210 4 212 28 157 9 4 16 129 13 19 4 32 91 171 259 4 149 320 327 80 4 263 35 34 38 4 0 269 63 104 4 355 144 152 151 4 361 87 341 88 4 75 110 298 299 4 290 291 289 139 4 204 295 321 192 4 297 256 277 278 4 256 170 180 278 4 223 111 112 5 4 266 107 20 116 4 28 74 95 98 4 141 65 142 117 4 362 250 313 210 4 177 40 39 178 4 211 137 165 35 4 82 147 365 340 4 191 211 189 34 4 190 15 60 88 4 111 43 174 175 4 89 70 371 72 4 163 151 161 153 4 37 76 299 119 4 330 37 337 263 4 13 129 343 86 4 54 109 298 110 4 75 325 54 110 4 356 52 135 51 4 180 170 131 133 4 273 27 226 62 4 127 343 18 129 4 27 257 24 225 4 35 166 165 171 4 52 314 16 51 4 39 157 155 215 4 345 285 353 278 4 12 52 16 51 4 198 106 140 306 4 12 221 258 86 4 251 263 382 38 4 308 228 220 57 4 286 128 342 383 4 117 67 68 65 4 73 157 8 186 4 28 74 8 9 4 3 0 49 307 4 68 197 196 102 4 293 292 256 198 4 357 299 109 218 4 179 163 178 153 4 150 179 272 153 4 257 46 223 172 4 176 257 24 210 4 266 67 196 68 4 175 43 159 111 4 235 13 59 18 4 270 97 232 64 4 124 121 120 123 4 299 76 91 119 4 348 93 340 199 4 84 90 258 7 4 91 259 118 119 4 185 355 150 151 4 313 35 250 38 4 37 263 33 38 4 301 184 183 29 4 339 263 37 38 4 231 29 178 215 4 136 322 134 81 4 312 362 384 363 4 293 180 198 256 4 68 117 114 102 4 24 210 27 315 4 158 113 46 172 4 12 115 53 19 4 53 115 114 19 4 30 74 28 31 4 185 184 317 247 4 351 87 235 343 4 124 192 125 123 4 355 152 150 151 4 301 104 2 307 4 12 221 88 259 4 212 28 213 215 4 345 198 122 182 4 211 73 137 74 4 292 360 198 280 4 138 105 63 62 4 219 343 286 129 4 206 208 336 10 4 4 259 5 113 4 377 296 379 193 4 214 385 155 215 4 12 15 32 88 4 147 327 79 80 4 217 171 5 172 4 208 337 336 10 4 183 272 231 153 4 291 41 177 123 4 73 40 140 229 4 363 61 234 315 4 36 302 339 38 4 89 113 7 72 4 30 215 157 42 4 194 199 340 82 4 193 160 158 159 4 91 32 171 33 4 60 59 235 13 4 273 280 138 62 4 363 234 312 316 4 24 257 27 210 4 235 18 127 343 4 373 158 45 303 4 16 309 58 320 4 105 103 63 104 4 287 115 167 19 4 353 345 122 139 4 247 161 130 151 4 291 285 289 139 4 313 210 250 166 4 116 115 22 117 4 0 104 103 307 4 134 322 314 81 4 248 251 145 74 4 94 68 51 197 4 60 15 58 13 4 371 70 69 72 4 248 74 146 98 4 156 186 295 11 4 330 263 205 76 4 36 33 302 38 4 18 148 286 93 4 130 161 182 144 4 94 199 81 82 4 155 157 214 215 4 129 17 282 19 4 189 140 124 202 4 290 274 288 276 4 159 377 193 160 4 182 162 140 139 4 194 81 222 199 4 22 21 20 117 4 58 264 59 13 4 379 111 296 72 4 116 117 266 102 4 66 194 195 199 4 330 205 331 76 4 16 94 314 17 4 253 347 66 68 4 185 247 47 151 4 30 28 157 215 4 2 104 0 307 4 101 116 102 100 4 88 91 32 259 4 124 202 140 123 4 84 116 23 7 4 317 2 3 307 4 321 295 125 192 4 27 280 226 62 4 313 382 339 38 4 96 104 105 64 4 342 334 219 390 4 176 61 363 315 4 26 61 176 315 4 165 259 32 171 4 47 144 355 151 4 30 29 28 215 4 95 97 230 98 4 6 5 4 259 4 157 186 73 42 4 156 157 39 42 4 149 82 148 17 4 191 192 211 186 4 185 151 150 153 4 185 150 183 153 4 96 315 316 64 4 180 133 181 281 4 230 97 270 64 4 40 229 73 42 4 157 28 212 215 4 112 111 175 72 4 88 221 91 259 4 184 237 106 227 4 353 285 345 139 4 105 96 27 74 4 301 307 317 227 4 85 55 308 220 4 77 37 330 76 4 226 27 137 280 4 247 237 130 161 4 174 112 223 111 4 126 275 124 123 4 111 113 296 72 4 329 279 294 280 4 276 139 121 123 4 12 88 32 259 4 112 7 111 72 4 110 299 91 119 4 145 251 35 74 4 332 243 329 256 4 124 275 121 123 4 375 205 203 92 4 178 29 261 229 4 379 175 72 371 4 33 263 34 38 4 56 110 54 57 4 372 303 44 328 4 302 166 210 313 4 250 251 382 38 4 341 331 305 92 4 5 259 216 113 4 68 199 67 197 4 107 90 23 72 4 7 113 111 72 4 172 217 303 158 4 184 247 185 151 4 291 276 41 123 4 141 68 65 117 4 56 118 110 57 4 24 26 176 315 4 87 13 235 343 4 262 295 205 186 4 134 314 356 81 4 279 294 359 329 4 328 209 384 362 4 165 35 145 166 4 237 227 131 306 4 24 27 26 315 4 209 176 363 315 4 27 315 210 146 4 276 275 41 123 4 266 116 20 117 4 248 316 95 146 4 340 199 93 82 4 25 349 26 62 4 96 74 105 98 4 190 88 304 92 4 58 18 16 320 4 316 96 95 146 4 159 43 45 46 4 336 263 339 10 4 217 172 303 302 4 240 345 353 278 4 213 212 95 28 4 309 16 314 320 4 84 167 23 115 4 335 207 206 10 4 159 45 158 46 4 20 21 142 117 4 314 94 51 81 4 196 197 50 102 4 285 366 284 352 4 343 228 13 86 4 34 263 205 186 4 96 64 97 98 4 260 21 22 117 4 258 6 220 221 4 333 342 219 343 4 114 117 116 102 4 180 131 182 133 4 305 88 341 78 4 56 4 109 118 4 107 23 20 116 4 247 237 184 227 4 370 58 319 311 4 147 149 327 80 4 362 210 363 146 4 260 287 141 115 4 303 44 328 210 4 335 212 154 249 4 81 80 314 17 4 39 271 179 178 4 191 124 189 192 4 209 362 363 384 4 19 287 86 167 4 91 221 88 78 4 347 93 348 199 4 205 263 262 186 4 316 363 234 315 4 237 306 182 229 4 342 127 286 343 4 317 132 47 227 4 193 379 377 159 4 221 228 258 86 4 167 115 12 19 4 140 139 162 123 4 344 50 196 197 4 242 256 240 278 4 25 273 349 62 4 341 57 358 78 4 205 76 34 92 4 216 113 217 172 4 95 28 212 9 4 189 140 211 124 4 264 236 235 18 4 183 178 231 29 4 175 379 72 111 4 132 131 130 227 4 302 171 166 38 4 317 184 301 227 4 111 5 223 46 4 333 334 219 342 4 195 136 196 197 4 109 299 110 118 4 157 215 39 42 4 130 247 47 227 4 201 223 224 53 4 244 105 138 324 4 299 118 218 119 4 224 53 223 112 4 163 162 161 144 4 287 129 282 19 4 87 343 351 228 4 124 140 211 192 4 51 94 16 19 4 324 293 329 243 4 314 81 267 80 4 95 74 28 9 4 223 46 5 172 4 291 238 352 181 4 37 299 218 119 389 323 388 386 380 368 364 359 274 366 283 241 239 367 349 318 369 99 200 344 374 381 319 264 59 361 305 375 204 321 126 275 203 322 267 246 309 289 288 354 376 314 370 294 279 121 353 240 254 273 25 224 50 135 311 58 60 304 191 124 290 134 292 360 120 345 255 387 226 201 52 310 14 15 190 189 202 122 356 1000.0 0.45 7.5e4 opensurgsim-0.7.0/SurgSim/Testing/Data/Geometry/wound_deformable_with_texture.ply000066400000000000000000001356701277777236100304570ustar00rootroot00000000000000ply format ascii 1.0 comment This file is a part of the OpenSurgSim project. comment Copyright 2013, SimQuest Solutions Inc. comment comment Licensed under the Apache License, Version 2.0 (the "License"); comment you may not use this file except in compliance with the License. comment You may obtain a copy of the License at comment comment http://www.apache.org/licenses/LICENSE-2.0 comment comment Unless required by applicable law or agreed to in writing, software comment distributed under the License is distributed on an "AS IS" BASIS, comment WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. comment See the License for the specific language governing permissions and comment limitations under the License. comment comment This file provides the geometry which describes a tetrahedral volume comment mesh and triangular surface mesh of an arm wound. comment element vertex 391 property double x property double y property double z property double s property double t element face 407 property list uint uint vertex_indices element 3d_element 1476 property list uint uint vertex_indices element boundary_condition 79 property uint vertex_index element material 1 property double mass_density property double poisson_ratio property double young_modulus end_header -0.017638 0.001427 -0.012363 0.707716 0.681378 -0.018984 0.002069 -0.016867 0.736310 0.634209 -0.014913 -0.001358 -0.015090 0.680908 0.590891 -0.018090 -0.001832 -0.017359 0.707848 0.596931 0.012643 -0.002455 0.001226 0.403742 0.411127 0.009376 -0.006324 0.003409 0.0 0.0 0.015479 -0.002289 0.003265 0.375952 0.394412 0.014119 -0.002367 0.007046 0.0 0.0 -0.000236 -0.006438 -0.015323 0.0 0.0 -0.003732 -0.004010 -0.013609 0.0 0.0 0.002155 -0.000546 -0.013612 0.0 0.0 0.001262 -0.001523 -0.018049 0.0 0.0 0.019667 -0.017785 0.008674 0.0 0.0 0.029299 -0.005262 0.004546 0.0 0.0 0.046990 -0.020879 0.007375 0.0 0.0 0.037332 -0.020768 -0.005328 0.0 0.0 0.033586 -0.016523 0.018450 0.0 0.0 0.034101 -0.002031 0.016309 0.0 0.0 0.033392 -0.002474 0.009623 0.0 0.0 0.025349 -0.003774 0.014192 0.0 0.0 0.019145 0.004850 0.012264 0.307965 0.463751 0.020216 0.004879 0.011113 0.302951 0.437069 0.020968 0.001399 0.010219 0.315752 0.400181 0.018687 0.001314 0.008476 0.333716 0.411611 -0.007352 0.001018 0.005860 0.538316 0.697416 -0.007333 -0.005722 0.014291 0.0 0.0 -0.013652 -0.000173 0.002866 0.599904 0.744518 -0.007113 -0.008223 -0.002577 0.0 0.0 -0.006477 -0.004144 -0.015932 0.0 0.0 -0.010957 -0.004967 -0.018490 0.0 0.0 -0.007629 -0.006377 -0.018801 0.0 0.0 -0.009906 -0.007928 -0.014976 0.0 0.0 0.014105 -0.020914 -0.009294 0.0 0.0 0.009112 -0.006286 -0.008604 0.0 0.0 0.006268 -0.009189 -0.014543 0.0 0.0 0.002300 -0.008261 -0.009596 0.0 0.0 0.006635 0.000026 -0.006193 0.478446 0.422446 0.010115 -0.000309 -0.007852 0.0 0.0 0.005102 -0.004418 -0.008996 0.0 0.0 -0.006609 0.001420 -0.025080 0.683895 0.418703 -0.011057 -0.007486 -0.026293 0.0 0.0 -0.008811 0.000184 -0.034044 0.750872 0.396926 -0.005338 -0.005470 -0.024596 0.0 0.0 0.001259 0.002603 0.004418 0.477874 0.590676 0.000123 0.002377 -0.000362 0.508779 0.579936 0.002998 0.002713 0.001375 0.478745 0.561899 0.002769 -0.002124 0.003090 0.0 0.0 -0.020005 -0.002711 -0.020006 0.725914 0.579430 -0.021803 0.001971 -0.019803 0.769228 0.624707 -0.021059 0.001058 -0.014582 0.742789 0.686283 0.014631 0.000524 0.027783 0.0 0.0 0.022184 -0.002620 0.021520 0.0 0.0 0.018739 -0.011699 0.030717 0.0 0.0 0.015337 -0.003630 0.015467 0.0 0.0 0.016049 0.003671 -0.002811 0.385336 0.303910 0.018898 0.003898 -0.000351 0.355721 0.293064 0.014287 0.000683 -0.000350 0.398533 0.377274 0.019319 -0.000205 -0.003032 0.0 0.0 0.046990 -0.007619 0.007375 0.0 0.0 0.040075 -0.002131 -0.002012 0.275562 0.097586 0.037332 -0.007509 -0.005328 0.0 0.0 -0.011140 0.001039 -0.002776 0.605865 0.671648 -0.014033 -0.006140 -0.001762 0.0 0.0 -0.016684 0.000633 -0.005670 0.664721 0.711067 -0.011809 -0.002190 -0.009170 0.0 0.0 0.024204 0.005929 0.015670 0.261423 0.435611 0.026606 0.006410 0.017058 0.241027 0.413001 0.023576 0.006924 0.019679 0.249385 0.456824 0.024566 0.001831 0.017759 0.0 0.0 0.013743 0.004124 0.008547 0.363455 0.496876 0.011935 0.004109 0.005502 0.386672 0.485966 0.014670 0.004333 0.007344 0.356430 0.470987 0.012704 0.000753 0.008033 0.0 0.0 -0.003034 -0.009956 -0.020825 0.0 0.0 -0.006038 -0.007999 -0.012282 0.0 0.0 0.014736 0.003042 -0.006304 0.410541 0.288505 0.014286 -0.003192 -0.009813 0.0 0.0 0.014065 0.002151 -0.010793 0.441123 0.277848 0.019818 -0.002939 -0.008113 0.0 0.0 0.036755 0.006575 0.019271 0.171882 0.285622 0.036907 0.001084 0.018946 0.0 0.0 0.033263 0.001097 0.023070 0.0 0.0 0.033376 0.002597 0.017918 0.0 0.0 0.022543 0.001069 0.006601 0.319550 0.337176 0.020245 -0.001947 0.007184 0.330922 0.370668 0.019727 0.001041 0.004292 0.343634 0.348013 0.023642 -0.002413 0.005541 0.0 0.0 0.029219 0.001517 -0.003210 0.316280 0.186932 0.022506 -0.007309 -0.002980 0.0 0.0 0.013584 0.001132 0.004599 0.380549 0.438335 0.015737 0.001218 0.006218 0.360614 0.429612 0.015374 -0.005687 -0.005108 0.0 0.0 0.019027 -0.006775 -0.014839 0.0 0.0 0.030475 0.001257 0.015552 0.262159 0.346781 0.027297 -0.001544 0.019319 0.0 0.0 -0.006877 -0.002740 -0.012407 0.607383 0.519549 -0.009683 -0.005474 -0.007552 0.0 0.0 -0.008963 -0.000571 -0.011342 0.619375 0.564274 -0.009123 -0.005772 -0.011405 0.0 0.0 0.006753 0.004254 0.022359 0.380109 0.683747 0.010408 0.004267 0.016270 0.359520 0.575078 0.015903 0.005679 0.020105 0.304442 0.542677 0.017492 0.000471 0.018668 0.0 0.0 -0.018916 -0.006283 -0.013171 0.0 0.0 -0.013552 -0.004660 -0.011679 0.0 0.0 -0.015191 -0.008193 -0.008642 0.0 0.0 -0.014454 -0.008852 -0.015804 0.0 0.0 0.016241 0.004334 0.010184 0.336917 0.483939 0.017210 0.004543 0.009049 0.332410 0.456022 0.012207 0.000507 -0.002006 0.420299 0.390013 0.015357 0.000245 -0.003791 0.0 0.0 0.007154 -0.001854 0.005752 0.0 0.0 0.011373 -0.002515 0.009976 0.0 0.0 0.009600 -0.002702 0.003200 0.0 0.0 0.022251 -0.002063 0.015960 0.0 0.0 0.021468 -0.001789 0.012242 0.0 0.0 0.017030 0.000365 0.013057 0.0 0.0 0.020308 0.001792 0.013974 0.0 0.0 0.013639 -0.003166 -0.002562 0.0 0.0 0.011924 -0.003711 -0.006304 0.0 0.0 -0.014146 -0.020429 -0.047689 0.0 0.0 -0.014146 -0.007170 -0.047689 0.0 0.0 -0.024140 -0.017967 -0.040188 0.0 0.0 -0.012259 -0.006676 -0.033836 0.0 0.0 0.002537 -0.008403 -0.037874 0.0 0.0 -0.001499 -0.000057 -0.029561 0.672858 0.347281 -0.000610 -0.002936 -0.039936 0.735672 0.277619 0.031048 0.003384 0.005728 0.258962 0.227713 0.031021 0.004616 0.009841 0.239710 0.251763 0.029058 -0.002228 0.009819 0.0 0.0 -0.017817 -0.005609 -0.020805 0.0 0.0 -0.021077 -0.009144 -0.020053 0.0 0.0 -0.019782 -0.005521 -0.017072 0.0 0.0 -0.021431 -0.005952 -0.022335 0.0 0.0 0.028581 0.004545 0.037841 0.0 0.0 0.022848 0.002598 0.033651 0.0 0.0 0.026518 0.008415 0.028378 0.199337 0.482877 -0.008942 -0.024739 -0.008176 0.0 0.0 -0.020167 -0.001455 -0.000035 0.663670 0.794459 -0.019937 -0.006669 -0.033633 0.0 0.0 -0.011533 -0.022757 -0.029013 0.0 0.0 0.025681 0.001454 0.013298 0.276295 0.369130 0.021352 0.005330 0.013823 0.286985 0.451165 0.022555 0.005159 0.012575 0.281559 0.420259 -0.018697 -0.003565 -0.023866 0.0 0.0 -0.003741 -0.007976 -0.007476 0.0 0.0 -0.004960 -0.004029 -0.006795 0.0 0.0 0.035352 0.005531 0.016102 0.190755 0.270198 0.033038 0.004995 0.012719 0.216780 0.264971 0.036201 0.003833 0.011247 0.209145 0.220919 -0.014781 0.002213 -0.020373 0.719005 0.520347 -0.016880 -0.002824 -0.021921 0.0 0.0 -0.016398 0.001977 -0.024375 0.754476 0.519638 -0.013707 -0.002037 -0.021513 0.0 0.0 -0.001967 0.002359 -0.017593 0.600145 0.399436 -0.005030 0.002252 -0.019030 0.632366 0.420192 -0.000406 0.001476 -0.021158 0.610992 0.370987 -0.003015 -0.003057 -0.018944 0.0 0.0 0.005527 0.000425 -0.000868 0.462746 0.487855 0.005663 0.003045 0.003152 0.449655 0.544815 0.003921 0.003399 0.000160 0.473347 0.534593 -0.015527 -0.005152 -0.022539 0.0 0.0 -0.015560 -0.006666 -0.026900 0.0 0.0 -0.014996 -0.002896 -0.024296 0.0 0.0 -0.013917 -0.007956 -0.024021 0.0 0.0 0.004887 -0.021029 0.001820 0.0 0.0 0.002057 -0.006870 -0.003212 0.0 0.0 0.022552 -0.001675 0.009108 0.314427 0.363307 -0.024489 0.000741 -0.016918 0.777588 0.684517 -0.024391 0.001936 -0.022406 0.801319 0.612368 -0.024601 -0.004739 -0.018778 0.0 0.0 0.006850 -0.006797 -0.004277 0.0 0.0 0.004032 -0.004089 -0.000551 0.0 0.0 0.012333 0.004106 0.011509 0.361086 0.521100 0.005130 0.003275 0.012820 0.411354 0.608085 0.007317 0.003436 0.008224 0.411549 0.550627 -0.004058 0.001878 0.001264 0.531496 0.626286 -0.014203 0.001575 -0.029189 0.762778 0.468814 -0.010570 -0.002455 -0.021860 0.0 0.0 -0.012199 0.002106 -0.022621 0.713800 0.485157 -0.025827 -0.009187 -0.021112 0.0 0.0 -0.021601 -0.004637 -0.026044 0.0 0.0 -0.017290 -0.008529 -0.023047 0.0 0.0 -0.013967 -0.002130 -0.018341 0.682695 0.540233 -0.014398 -0.004396 -0.019489 0.0 0.0 -0.016250 -0.002623 -0.019238 0.704893 0.552676 0.002921 -0.006003 -0.021793 0.0 0.0 0.009600 0.002834 -0.010048 0.466575 0.318768 0.012195 0.002939 -0.008156 0.437269 0.303618 0.014492 -0.021349 -0.029300 0.0 0.0 0.026117 -0.020765 -0.017965 0.0 0.0 0.014492 -0.008090 -0.029300 0.0 0.0 0.002621 -0.007830 -0.029082 0.0 0.0 0.008423 0.000639 0.001153 0.432663 0.470788 0.030678 0.007333 0.019744 0.205235 0.378927 0.026656 0.007758 0.022058 0.221464 0.439517 0.020949 0.007122 0.023900 0.253990 0.513600 0.024451 0.002704 0.023354 0.0 0.0 -0.023157 -0.024020 -0.019768 0.0 0.0 0.029177 0.003608 0.018712 0.0 0.0 0.012003 0.005360 0.025917 0.328309 0.649173 0.004293 -0.015189 0.020860 0.0 0.0 0.002537 -0.021663 -0.037874 0.0 0.0 0.017564 -0.002515 -0.026912 0.535047 0.158602 0.011421 -0.002833 -0.031689 0.602351 0.194529 0.011215 0.000322 -0.020415 0.517135 0.253575 0.002635 0.003021 -0.012333 0.529341 0.378660 0.001235 0.002490 -0.015739 0.562597 0.374265 0.004272 0.002632 -0.013690 0.525222 0.350674 -0.002997 0.002057 -0.002458 0.541143 0.598152 -0.002614 -0.004314 -0.002919 0.0 0.0 0.003125 -0.022994 -0.021280 0.0 0.0 -0.005395 -0.000823 -0.013764 0.605695 0.495888 -0.008954 -0.001258 -0.015629 0.641873 0.519288 -0.003834 0.002652 -0.016057 0.603320 0.424604 -0.007047 -0.000971 -0.018908 0.0 0.0 0.010433 -0.002408 -0.000327 0.425311 0.423985 0.007502 -0.002301 -0.002415 0.454583 0.442237 0.009372 0.000321 -0.004108 0.449153 0.405214 0.025152 0.001195 0.009053 0.296717 0.330843 0.016960 0.000956 0.001995 0.370882 0.360310 0.019875 -0.003369 -0.000014 0.0 0.0 0.030751 0.008190 0.022981 0.192338 0.395364 0.006170 -0.006701 0.007879 0.0 0.0 0.004293 -0.001930 0.020860 0.0 0.0 -0.000653 -0.004919 0.008637 0.0 0.0 -0.014173 -0.021266 0.011121 0.0 0.0 -0.017277 -0.006019 -0.017796 0.0 0.0 0.023544 -0.000939 0.002037 0.0 0.0 -0.009768 -0.009134 -0.022027 0.0 0.0 -0.009580 -0.002948 -0.014062 0.636321 0.535441 -0.011797 -0.001691 -0.017176 0.666623 0.531485 -0.010204 0.002309 -0.009891 0.632801 0.615829 -0.011598 0.001574 -0.008061 0.635984 0.649988 -0.008708 0.001627 -0.006285 0.605513 0.633471 0.034635 0.001794 0.002947 0.257173 0.179657 0.039472 0.002062 0.008665 0.205123 0.177019 -0.015907 -0.007981 -0.018944 0.0 0.0 -0.020598 0.001813 -0.025718 0.792131 0.555168 -0.045621 -0.006163 -0.019740 0.935849 0.983660 -0.040582 -0.008149 -0.025424 0.0 0.0 -0.042936 -0.004004 -0.023210 0.932866 0.916952 -0.038274 -0.003561 -0.017712 0.876293 0.872123 -0.025030 -0.004697 -0.013625 0.0 0.0 -0.023215 -0.000003 -0.009663 0.733754 0.749496 -0.021118 -0.002997 -0.014161 0.0 0.0 -0.004112 0.000695 0.015891 0.483989 0.762601 -0.016389 -0.004557 -0.019826 0.0 0.0 -0.003547 -0.002715 -0.010257 0.571529 0.501819 -0.001840 -0.000524 -0.011726 0.569397 0.474849 -0.000903 -0.002832 -0.008443 0.541931 0.487581 -0.001161 -0.006198 -0.011121 0.0 0.0 0.026165 -0.000632 0.016453 0.0 0.0 0.025651 0.005503 0.014190 0.255812 0.397905 -0.045621 -0.011579 -0.019740 0.0 0.0 -0.040582 -0.021408 -0.025424 0.0 0.0 -0.032217 -0.008366 -0.016728 0.0 0.0 0.000124 -0.006312 0.001727 0.0 0.0 0.017517 -0.002166 0.004909 0.355779 0.383708 0.011949 -0.006639 -0.000263 0.0 0.0 0.023286 0.001530 0.011808 0.299493 0.388218 -0.013427 -0.006320 -0.020900 0.0 0.0 0.005159 0.001722 -0.017378 0.541972 0.328988 0.006008 -0.003221 -0.013176 0.0 0.0 0.044680 -0.002154 0.004195 0.212358 0.092100 -0.000907 0.002148 0.009167 0.474108 0.650299 0.018182 0.005343 0.015586 0.301651 0.485315 0.043927 0.001725 0.025605 0.0 0.0 -0.012854 0.002261 -0.012050 0.666436 0.627285 -0.014517 0.001574 -0.010230 0.670831 0.667926 -0.011668 -0.001006 -0.012914 0.648374 0.577399 -0.008316 0.002150 -0.020675 0.670180 0.448525 -0.010664 0.002390 -0.018678 0.676647 0.483901 -0.021013 -0.010291 0.007951 0.0 0.0 -0.014146 -0.001754 -0.047689 0.871625 0.380651 -0.008422 -0.002312 -0.044596 0.811809 0.335078 -0.015684 0.000035 -0.039467 0.823954 0.423325 -0.034331 -0.001228 -0.022520 0.867926 0.743772 -0.031662 -0.007124 -0.023091 0.0 0.0 -0.031224 -0.014703 0.002956 0.0 0.0 -0.022628 -0.011995 -0.002126 0.0 0.0 -0.025924 -0.004114 -0.023568 0.0 0.0 0.027872 -0.000761 0.013734 0.287809 0.354222 -0.034591 -0.000064 -0.031338 0.914569 0.689654 -0.029145 0.000494 -0.024321 0.845319 0.655410 -0.028017 -0.005001 -0.028032 0.0 0.0 0.027902 0.001681 0.011326 0.276857 0.326315 0.025087 -0.001165 0.011230 0.300071 0.358218 -0.021752 0.000419 -0.042010 0.892791 0.514352 -0.026528 0.000997 -0.038365 0.897612 0.549181 -0.024140 -0.004708 -0.040188 0.0 0.0 -0.020978 0.001288 -0.033343 0.828966 0.502825 -0.040551 -0.026143 -0.010199 0.0 0.0 -0.023197 -0.010713 -0.012877 0.0 0.0 -0.040551 -0.012883 -0.010199 0.0 0.0 0.004485 -0.000007 -0.025484 0.601465 0.304044 0.010626 0.000849 0.002651 0.410322 0.457472 -0.028255 0.000295 -0.019377 0.812070 0.694379 0.013332 0.003514 -0.005048 0.413228 0.317771 0.012798 0.000333 -0.005951 0.0 0.0 -0.015803 0.002187 -0.014369 0.700775 0.636061 -0.013341 -0.003209 -0.016395 0.673887 0.556538 0.004675 -0.002400 -0.004481 0.483440 0.456956 0.002779 0.000374 -0.003048 0.492235 0.501557 0.026117 -0.007505 -0.017965 0.0 0.0 0.028859 -0.001994 -0.015040 0.401776 0.121209 -0.018952 -0.009957 -0.016014 0.0 0.0 -0.017184 -0.003861 -0.014796 0.0 0.0 0.020301 0.003439 -0.001538 0.351704 0.269778 0.046716 -0.013576 0.023724 0.0 0.0 0.055055 -0.021059 0.018567 0.0 0.0 0.055055 -0.007800 0.018567 0.0 0.0 -0.007396 0.002390 -0.007873 0.599971 0.601408 0.001875 -0.002670 -0.006494 0.512456 0.471953 0.038019 -0.008659 0.029998 0.0 0.0 -0.008029 -0.002626 -0.003881 0.0 0.0 -0.005500 -0.000144 -0.009081 0.582441 0.547991 -0.016373 -0.003539 -0.018074 0.693376 0.563980 -0.010554 -0.001307 0.012690 0.542110 0.813150 0.049300 -0.002253 0.010554 0.156641 0.074718 0.038759 -0.002166 0.014632 0.0 0.0 0.005684 -0.003039 -0.035812 0.664057 0.231011 0.038019 0.004600 0.029998 0.0 0.0 0.038019 0.010016 0.029998 0.114875 0.333565 -0.026286 -0.002491 -0.003954 0.729150 0.852638 0.017414 0.003222 -0.004081 0.382513 0.280278 0.044485 0.002423 0.015009 0.154850 0.173882 0.040181 0.004389 0.016007 0.169553 0.218078 -0.000017 0.000235 -0.005153 0.522576 0.519037 -0.033970 -0.003806 -0.010656 0.813819 0.897478 0.009082 0.001920 -0.014465 0.496261 0.303552 0.017757 0.000902 -0.014705 0.442129 0.218874 -0.030192 -0.001153 -0.014581 0.804471 0.778885 0.025315 0.003889 0.003730 0.298239 0.254431 0.024009 0.004399 0.004815 0.299684 0.276964 -0.000443 0.002808 -0.014194 0.567019 0.401750 0.005274 0.003135 -0.010676 0.501002 0.361565 0.006826 0.002728 -0.011961 0.497165 0.333554 0.008126 0.003261 -0.008819 0.469528 0.344355 0.003879 -0.000228 -0.008173 0.508530 0.439124 0.032342 0.006310 0.016942 0.206620 0.322798 0.023610 0.001317 -0.009141 0.378376 0.199234 0.028043 0.004252 0.006706 0.268835 0.252118 0.028016 -0.000536 0.005381 0.0 0.0 0.017259 0.006519 0.029649 0.274881 0.613415 -0.032441 -0.018179 -0.033098 0.0 0.0 0.022512 0.003646 0.000819 0.327614 0.262242 0.027741 0.001325 0.014450 0.267345 0.359882 0.028451 0.005830 0.015287 0.234742 0.367594 -0.017863 -0.003577 0.009446 0.606336 0.873144 0.021215 0.004148 0.001990 0.329253 0.284285 0.025358 0.002875 -0.000357 0.319055 0.238054 -0.025580 0.001252 -0.027579 0.834418 0.591281 -0.032441 -0.004919 -0.033098 0.0 0.0 -0.038228 -0.001462 -0.027638 0.921967 0.762041 -0.019666 0.002058 -0.021535 0.760948 0.564549 0.028581 -0.008715 0.037841 0.0 0.0 0.010757 0.003389 -0.006914 0.440443 0.329599 0.019618 0.002475 -0.006065 0.380279 0.255089 -0.031224 -0.009287 0.002956 0.726653 0.983908 -0.031224 -0.027962 0.002956 0.0 0.0 0.034589 -0.002055 -0.008644 0.340553 0.106507 -0.002831 -0.000029 -0.007070 0.552248 0.532828 -0.005830 0.001763 -0.004361 0.571170 0.614866 -0.038103 -0.007971 -0.006212 0.816889 0.989345 0.031060 0.005869 0.013961 0.222658 0.302436 -0.030292 0.001057 -0.034857 0.906371 0.609867 -0.024162 -0.006173 0.006457 0.662433 0.924856 -0.042999 -0.006964 -0.014187 0.888500 0.981682 0.001834 0.002718 0.019362 0.427865 0.719550 0.049505 -0.002359 0.021843 0.0 0.0 0.011040 0.003784 0.006750 0.391457 0.513336 -0.001834 0.002801 -0.003863 0.535555 0.568767 0.001083 0.003102 -0.001764 0.503470 0.551983 0.022848 0.008014 0.033651 0.219229 0.581941 0.023375 -0.002185 -0.020891 0.468122 0.139723 0.028581 0.009961 0.037841 0.135591 0.524833 0.006652 0.003669 0.002024 0.444507 0.517603 0.009164 0.003881 0.003676 0.417615 0.501784 0.008207 0.003356 0.004901 0.421793 0.528731 0.049505 0.003057 0.021843 0.084272 0.136500 0.055055 -0.002384 0.018567 0.061146 0.038651 0.001013 -0.000353 -0.009972 0.538504 0.457627 0.029329 0.005348 0.010717 0.244768 0.281415 -0.004550 0.002514 -0.005831 0.565049 0.584900 -0.007071 0.002482 -0.017312 0.640794 0.454937 0.046366 0.005522 0.023902 0.092927 0.186502 -0.045621 -0.024839 -0.019740 0.0 0.0 0.041488 0.008760 0.027307 0.105299 0.272334 0.033206 0.010046 0.034162 0.125908 0.426442 0.026563 0.004882 0.007661 0.273634 0.279815 3 43 45 44 3 65 67 66 3 69 71 70 3 99 101 100 3 61 63 138 3 65 143 142 3 147 149 148 3 154 156 155 3 159 160 45 3 168 48 169 3 173 175 174 3 43 44 176 3 187 188 77 3 67 196 195 3 66 67 195 3 150 179 152 3 203 204 205 3 206 208 207 3 176 44 209 3 232 233 234 3 235 127 236 3 48 49 1 3 239 242 241 3 253 143 65 3 87 235 59 3 152 179 177 3 41 39 125 3 179 272 271 3 274 276 275 3 283 277 284 3 266 107 173 3 288 289 291 3 48 168 49 3 208 262 207 3 156 262 295 3 297 169 284 3 142 67 65 3 188 298 75 3 268 300 269 3 300 0 269 3 312 232 234 3 1 49 0 3 236 127 149 3 233 63 61 3 265 24 318 3 319 264 236 3 321 126 125 3 79 222 323 3 276 288 291 3 107 71 69 3 149 327 326 3 269 63 233 3 49 244 0 3 77 331 330 3 332 168 297 3 268 269 233 3 142 20 266 3 325 54 55 3 262 330 205 3 0 244 63 3 195 136 222 3 336 338 337 3 79 340 194 3 246 174 265 3 195 222 194 3 26 138 349 3 333 346 350 3 351 333 127 3 169 352 284 3 325 55 308 3 244 332 324 3 241 242 277 3 354 241 277 3 39 271 155 3 59 235 264 3 169 355 238 3 205 204 295 3 20 108 107 3 335 154 214 3 87 341 358 3 358 351 87 3 107 69 173 3 359 324 329 3 41 177 39 3 326 319 236 3 100 173 174 3 359 329 364 3 214 154 155 3 154 335 207 3 283 354 277 3 142 143 21 3 289 366 291 3 348 253 66 3 138 367 349 3 368 329 242 3 361 305 341 3 77 341 331 3 232 268 233 3 338 187 337 3 174 369 100 3 100 369 99 3 43 265 174 3 265 43 176 3 127 333 342 3 154 207 156 3 196 200 344 3 188 187 357 3 188 75 77 3 173 371 175 3 340 348 194 3 372 44 373 3 147 340 79 3 333 350 334 3 126 41 125 3 330 262 208 3 291 366 352 3 374 376 136 3 351 346 333 3 377 379 378 3 331 375 205 3 355 152 238 3 380 381 326 3 234 233 61 3 367 324 359 3 196 101 200 3 342 128 127 3 188 357 298 3 379 371 378 3 358 325 308 3 383 148 128 3 177 291 238 3 138 324 367 3 136 344 374 3 173 101 266 3 168 169 297 3 149 326 236 3 209 372 384 3 108 71 107 3 337 187 330 3 149 127 128 3 357 187 338 3 373 45 160 3 173 100 101 3 265 318 246 3 101 99 200 3 21 108 20 3 24 265 176 3 55 346 308 3 371 70 378 3 152 177 238 3 351 127 235 3 168 244 49 3 26 61 138 3 305 375 331 3 266 101 196 3 156 295 125 3 168 332 244 3 308 346 351 3 366 283 284 3 329 332 242 3 244 138 63 3 177 179 39 3 136 196 344 3 361 87 59 3 77 358 341 3 373 44 45 3 327 79 386 3 207 262 156 3 148 149 128 3 55 350 346 3 222 79 194 3 332 297 277 3 39 155 156 3 147 148 365 3 242 332 277 3 187 77 330 3 1 0 300 3 372 209 44 3 246 369 174 3 26 349 318 3 26 318 24 3 332 329 324 3 155 271 385 3 156 125 39 3 271 272 385 3 364 329 368 3 175 379 159 3 348 66 194 3 383 365 148 3 136 389 222 3 342 390 383 3 326 327 386 3 126 275 41 3 323 222 389 3 277 297 284 3 142 266 67 3 173 69 371 3 75 298 54 3 380 326 386 3 381 319 326 3 388 79 323 3 308 351 358 3 352 169 238 3 386 79 388 3 136 376 389 3 239 368 242 3 208 337 330 3 358 75 325 3 77 75 358 3 253 65 66 3 0 63 269 3 361 341 87 3 204 321 295 3 266 20 107 3 147 365 340 3 43 174 175 3 75 54 325 3 128 342 383 3 150 272 179 3 266 196 67 3 175 159 43 3 312 363 384 3 351 235 87 3 355 150 152 3 206 336 208 3 214 155 385 3 147 79 327 3 208 336 337 3 291 177 41 3 363 234 61 3 363 312 234 3 371 69 70 3 274 288 276 3 159 377 160 3 66 195 194 3 330 331 205 3 321 125 295 3 342 334 390 3 176 363 61 3 26 176 61 3 375 203 205 3 379 175 371 3 341 305 331 3 291 41 276 3 24 176 26 3 262 205 295 3 209 363 176 3 276 41 275 3 159 45 43 3 335 206 207 3 20 142 21 3 366 284 352 3 147 327 149 3 39 179 271 3 209 384 363 3 379 377 159 3 264 235 236 3 333 334 342 3 195 196 136 3 244 324 138 3 291 352 238 3 1 2 3 3 21 22 23 3 47 48 3 3 108 23 90 3 48 1 3 3 253 141 143 3 268 270 2 3 2 300 268 3 97 232 312 3 97 312 316 3 23 22 167 3 48 47 169 3 6 90 258 3 317 47 3 3 193 4 216 3 95 97 316 3 4 193 296 3 4 89 6 3 282 347 93 3 348 347 253 3 316 250 248 3 89 90 6 3 372 373 303 3 2 230 301 3 143 141 260 3 70 89 296 3 377 378 296 3 301 317 2 3 282 141 347 3 328 302 313 3 141 253 347 3 71 90 89 3 328 384 372 3 108 90 71 3 328 303 302 3 217 158 216 3 373 160 158 3 21 23 108 3 378 70 296 3 22 287 167 3 312 362 316 3 89 4 296 3 143 260 21 3 328 313 362 3 1 300 2 3 270 268 232 3 22 260 287 3 316 362 250 3 84 90 23 3 71 89 70 3 141 282 287 3 230 2 270 3 193 216 158 3 362 313 250 3 270 232 97 3 348 340 93 3 84 258 90 3 312 384 362 3 377 296 193 3 193 158 160 3 373 158 303 3 377 193 160 3 317 3 2 3 95 230 97 3 230 270 97 3 372 303 328 3 217 303 158 3 328 362 384 3 248 95 316 3 217 302 303 3 84 23 167 3 260 22 21 3 260 141 287 3 347 348 93 3 54 56 55 3 83 85 84 3 56 54 109 3 212 214 213 3 216 218 217 3 219 83 167 3 230 213 231 3 248 250 249 3 56 220 55 3 286 219 287 3 85 220 258 3 185 317 183 3 150 183 272 3 83 334 85 3 336 339 338 3 301 230 231 3 95 248 212 3 183 301 231 3 109 216 4 3 282 286 287 3 169 47 355 3 338 339 36 3 335 214 212 3 4 220 56 3 339 313 302 3 85 334 350 3 47 317 185 3 357 36 218 3 382 206 335 3 250 313 382 3 334 83 219 3 231 213 272 3 218 36 217 3 219 286 383 3 220 4 6 3 286 282 93 3 183 317 301 3 213 214 385 3 167 83 84 3 357 109 298 3 36 357 338 3 272 213 385 3 55 85 350 3 85 258 84 3 336 382 339 3 336 206 382 3 249 250 382 3 230 95 213 3 47 185 355 3 340 365 93 3 248 249 212 3 383 286 365 3 219 383 390 3 249 382 335 3 218 216 109 3 219 167 287 3 286 93 365 3 217 36 302 3 54 298 109 3 357 218 109 3 185 150 355 3 183 231 272 3 36 339 302 3 313 339 382 3 334 219 390 3 185 183 150 3 85 55 220 3 213 95 212 3 258 220 6 3 56 109 4 3 335 212 249 3 14 310 309 4 0 1 2 3 4 4 5 6 7 4 8 9 10 11 4 12 13 14 15 4 16 17 18 19 4 20 21 22 23 4 24 25 26 27 4 28 29 30 31 4 32 33 34 35 4 36 37 33 38 4 39 40 41 42 4 43 44 45 46 4 47 3 48 49 4 50 51 52 53 4 54 55 56 57 4 58 59 60 13 4 61 62 63 64 4 65 66 67 68 4 69 70 71 72 4 73 8 30 74 4 75 76 77 78 4 79 80 81 82 4 83 84 85 86 4 87 88 60 13 4 89 7 90 72 4 91 78 88 92 4 93 82 94 17 4 95 96 97 98 4 99 100 101 102 4 103 104 105 106 4 107 108 23 90 4 56 109 54 110 4 111 7 112 113 4 114 115 116 117 4 91 118 110 119 4 120 121 122 123 4 124 125 126 123 4 127 18 128 129 4 130 131 132 133 4 134 135 136 81 4 105 27 137 74 4 61 138 63 62 4 122 139 140 123 4 65 141 142 143 4 47 144 130 133 4 27 145 96 146 4 147 148 149 82 4 150 151 152 153 4 154 155 156 157 4 158 159 160 45 4 161 162 163 164 4 165 145 27 166 4 167 12 84 86 4 168 169 48 170 4 5 171 166 172 4 173 174 175 112 4 43 176 44 46 4 177 178 179 163 4 180 181 182 139 4 183 184 185 153 4 8 186 157 11 4 187 77 188 37 4 173 116 112 72 4 189 190 191 92 4 192 186 125 42 4 159 158 193 46 4 79 81 194 82 4 67 195 196 197 4 122 198 140 182 4 66 195 67 199 4 150 152 179 153 4 200 50 99 102 4 12 201 52 53 4 15 14 58 13 4 202 120 140 123 4 191 203 204 205 4 152 151 163 153 4 206 207 208 10 4 176 209 44 210 4 137 35 211 74 4 212 213 214 215 4 216 217 218 119 4 219 167 83 86 4 118 220 221 56 4 195 199 222 197 4 174 223 224 225 4 137 226 165 27 4 47 132 130 227 4 88 228 221 86 4 131 170 132 133 4 106 31 137 229 4 230 231 213 29 4 232 233 97 234 4 235 236 127 18 4 48 3 1 49 4 214 154 212 157 4 130 237 182 161 4 114 68 141 117 4 125 123 192 42 4 238 181 177 144 4 239 240 241 242 4 103 243 244 245 4 193 111 159 46 4 246 224 25 225 4 184 161 247 151 4 248 249 250 251 4 94 199 93 252 4 253 141 65 143 4 254 255 240 256 4 257 210 176 46 4 258 221 12 259 4 22 115 260 117 4 260 115 114 117 4 94 82 81 17 4 96 146 145 98 4 178 163 261 153 4 262 263 208 10 4 264 13 58 18 4 24 265 25 225 4 87 235 60 59 4 152 177 179 163 4 116 101 102 266 4 34 35 33 38 4 24 257 176 225 4 41 125 39 42 4 261 164 40 229 4 94 17 16 19 4 267 81 79 80 4 268 269 2 270 4 95 74 248 98 4 179 271 272 178 4 178 184 261 29 4 25 27 273 62 4 274 121 275 276 4 277 256 242 278 4 273 226 279 280 4 210 145 250 166 4 181 133 47 281 4 282 17 94 19 4 56 55 220 57 4 283 284 277 285 4 182 162 161 164 4 286 287 219 129 4 266 173 107 116 4 174 224 246 225 4 282 18 93 17 4 51 114 94 19 4 288 289 290 291 4 223 257 165 225 4 205 34 191 92 4 47 48 168 49 4 292 293 256 294 4 208 207 262 10 4 156 295 262 11 4 149 80 147 82 4 223 46 257 225 4 296 111 193 113 4 165 257 223 5 4 297 284 169 281 4 117 142 67 65 4 188 75 298 299 4 85 258 220 221 4 170 133 180 281 4 178 215 30 42 4 270 104 230 64 4 2 268 300 269 4 184 106 301 227 4 302 210 172 303 4 106 237 261 229 4 221 118 91 259 4 300 0 2 269 4 304 88 305 78 4 182 131 198 306 4 3 307 49 245 4 55 308 220 57 4 132 243 103 245 4 14 309 310 311 4 145 74 96 98 4 178 29 183 153 4 44 210 303 172 4 97 312 232 234 4 302 166 313 38 4 1 49 3 0 4 174 111 223 225 4 94 81 314 17 4 73 31 30 229 4 177 139 291 123 4 140 198 137 106 4 211 192 73 186 4 236 149 127 18 4 100 224 174 112 4 176 210 24 315 4 261 29 184 237 4 269 104 270 64 4 292 294 280 293 4 97 316 312 234 4 250 145 248 251 4 23 167 22 115 4 135 51 50 197 4 61 315 26 62 4 48 169 47 170 4 234 315 61 64 4 178 229 40 42 4 137 145 165 35 4 233 61 63 64 4 185 183 317 184 4 46 113 5 172 4 177 181 291 139 4 6 258 90 7 4 135 81 51 197 4 265 24 25 318 4 319 236 264 320 4 181 162 177 144 4 321 126 124 125 4 8 10 263 11 4 322 79 222 323 4 244 103 324 243 4 54 110 325 57 4 73 34 211 186 4 114 116 53 102 4 189 211 191 192 4 51 68 94 252 4 317 3 47 132 4 290 276 288 291 4 282 94 93 252 4 106 227 237 306 4 91 299 110 76 4 261 247 184 161 4 294 292 280 279 4 179 178 272 153 4 150 272 183 153 4 193 216 4 113 4 107 90 69 71 4 12 53 84 7 4 33 171 302 38 4 198 293 137 306 4 149 326 327 320 4 269 233 63 64 4 49 0 244 245 4 6 221 258 259 4 166 171 35 38 4 47 247 317 227 4 291 139 276 123 4 44 209 328 210 4 168 170 47 245 4 191 190 304 92 4 181 285 291 139 4 329 243 293 256 4 95 316 97 96 4 96 62 315 64 4 60 88 15 13 4 77 330 331 76 4 293 103 105 306 4 182 181 180 133 4 137 27 165 145 4 50 197 51 102 4 332 297 168 170 4 106 29 301 31 4 34 76 33 92 4 40 162 140 164 4 320 80 149 17 4 137 106 198 306 4 30 157 73 42 4 140 182 198 306 4 268 233 269 64 4 106 307 301 227 4 142 266 20 117 4 83 333 85 334 4 47 170 169 281 4 313 166 35 38 4 325 55 54 57 4 30 8 73 157 4 262 205 330 263 4 0 63 244 103 4 125 186 156 42 4 3 132 317 307 4 12 112 53 7 4 250 35 313 166 4 94 114 51 252 4 195 222 136 197 4 335 10 249 11 4 18 17 129 19 4 111 46 223 225 4 336 337 338 339 4 266 68 101 102 4 156 186 157 42 4 13 86 12 19 4 18 129 16 19 4 294 255 254 256 4 293 243 180 256 4 137 73 140 229 4 4 296 193 113 4 79 194 340 82 4 295 186 262 11 4 305 78 341 92 4 157 9 8 11 4 342 286 219 343 4 140 306 106 229 4 196 135 344 197 4 93 199 94 82 4 198 182 345 180 4 329 293 294 256 4 5 46 111 113 4 163 161 261 153 4 242 254 240 256 4 293 131 180 170 4 216 259 4 113 4 346 333 85 228 4 207 10 335 11 4 40 164 140 229 4 246 265 174 225 4 195 194 222 199 4 66 347 348 199 4 26 349 138 62 4 333 346 85 350 4 301 231 230 29 4 347 199 68 252 4 351 127 333 343 4 95 212 248 9 4 140 164 182 229 4 73 192 40 42 4 240 242 239 254 4 114 68 51 252 4 213 29 231 215 4 248 145 250 146 4 182 237 261 161 4 52 51 12 53 4 2 270 269 104 4 258 6 5 7 4 184 151 185 153 4 81 199 94 197 4 219 129 287 86 4 97 96 316 64 4 248 74 95 9 4 183 231 301 29 4 169 284 352 281 4 314 80 320 17 4 104 64 96 98 4 217 5 216 172 4 286 343 127 129 4 292 198 255 256 4 33 37 36 119 4 121 276 290 139 4 290 285 353 139 4 130 131 237 227 4 349 273 138 62 4 169 181 238 144 4 325 308 55 57 4 33 76 37 119 4 152 163 179 153 4 111 46 193 113 4 8 263 34 186 4 244 324 332 243 4 104 106 103 307 4 109 4 216 118 4 295 192 204 186 4 241 242 240 277 4 240 354 241 277 4 204 192 191 186 4 39 155 271 215 4 36 37 218 119 4 110 118 91 57 4 353 122 290 139 4 88 78 304 92 4 282 287 286 129 4 303 158 45 46 4 314 322 267 81 4 201 223 165 225 4 230 31 28 98 4 84 12 258 86 4 28 29 213 215 4 59 264 235 18 4 4 6 89 7 4 132 170 47 133 4 51 197 68 102 4 169 355 47 238 4 141 68 114 252 4 356 314 52 51 4 35 251 8 74 4 93 18 282 129 4 218 37 357 299 4 191 205 204 295 4 20 23 107 108 4 149 18 236 320 4 39 215 178 42 4 267 309 314 320 4 47 181 169 144 4 47 170 132 245 4 338 337 36 339 4 216 5 217 259 4 335 154 212 214 4 212 157 249 9 4 173 112 175 72 4 20 116 22 117 4 87 358 341 57 4 2 269 0 104 4 358 87 351 57 4 107 173 69 72 4 217 113 158 172 4 25 226 273 27 4 359 329 324 280 4 41 39 177 40 4 360 226 137 280 4 112 7 5 113 4 4 220 118 56 4 60 87 361 88 4 257 5 165 166 4 224 50 52 53 4 326 236 319 320 4 249 251 248 9 4 218 299 109 118 4 305 304 361 88 4 47 133 170 281 4 100 174 173 112 4 121 139 122 123 4 198 293 292 280 4 316 362 363 146 4 32 34 211 35 4 226 280 273 62 4 294 359 329 364 4 85 228 83 86 4 244 105 324 103 4 40 178 177 163 4 214 155 154 157 4 161 151 184 153 4 169 181 47 281 4 302 33 36 171 4 154 207 335 11 4 302 171 217 172 4 20 23 22 116 4 293 103 324 280 4 283 277 354 285 4 255 180 345 278 4 339 302 313 38 4 154 249 212 157 4 27 145 210 166 4 365 93 148 82 4 28 31 74 98 4 282 93 347 252 4 121 275 276 123 4 261 178 40 164 4 53 112 173 116 4 142 21 143 117 4 81 82 80 17 4 289 291 366 285 4 140 137 211 73 4 360 137 198 280 4 348 66 253 347 4 137 27 105 280 4 101 68 196 102 4 138 349 367 273 4 316 248 250 146 4 51 81 94 197 4 53 116 100 102 4 140 73 211 192 4 368 242 329 256 4 63 104 269 64 4 361 341 305 88 4 182 164 237 229 4 337 37 339 263 4 180 243 293 170 4 77 331 341 78 4 140 162 182 164 4 154 157 156 11 4 44 46 210 172 4 232 233 268 64 4 263 10 262 11 4 51 68 114 102 4 363 315 316 146 4 66 68 347 199 4 140 162 40 123 4 338 337 187 37 4 327 320 326 80 4 174 224 100 369 4 100 224 99 369 4 339 37 36 38 4 43 111 174 265 4 250 145 210 146 4 265 176 43 225 4 180 281 285 278 4 127 342 333 343 4 154 156 207 11 4 69 71 90 72 4 196 344 200 50 4 209 210 176 315 4 140 40 73 192 4 165 5 12 259 4 223 112 12 5 4 220 118 221 6 4 188 357 187 37 4 188 77 75 299 4 304 60 361 88 4 220 228 221 57 4 272 178 231 153 4 182 161 261 164 4 327 326 267 80 4 319 58 370 320 4 58 309 14 311 4 211 34 73 35 4 259 171 217 119 4 238 163 152 144 4 173 175 371 72 4 12 53 51 19 4 89 6 90 7 4 83 343 219 86 4 159 111 43 46 4 182 180 198 131 4 340 194 348 199 4 177 162 181 139 4 88 13 87 228 4 303 46 44 172 4 137 106 105 31 4 69 90 107 72 4 74 31 105 98 4 372 303 373 44 4 329 293 324 280 4 258 12 84 7 4 224 53 100 102 4 47 238 355 144 4 47 49 168 245 4 314 51 356 81 4 304 78 305 92 4 136 134 374 135 4 141 114 287 19 4 165 27 226 257 4 2 301 230 104 4 90 7 23 72 4 27 145 137 74 4 263 186 8 11 4 147 79 340 82 4 359 273 279 280 4 375 304 305 92 4 5 7 4 113 4 223 53 12 112 4 137 105 293 280 4 333 85 334 350 4 148 93 149 17 4 137 31 73 229 4 34 33 32 92 4 91 118 221 57 4 126 125 41 123 4 143 260 141 117 4 330 208 262 263 4 370 309 267 320 4 47 185 317 247 4 83 228 343 86 4 304 203 191 92 4 317 307 132 227 4 30 29 178 229 4 291 352 366 285 4 91 57 221 78 4 184 247 261 237 4 374 134 136 376 4 294 254 368 256 4 371 70 89 296 4 261 237 247 161 4 357 218 36 37 4 347 68 141 252 4 59 13 264 18 4 351 333 346 228 4 124 120 202 123 4 231 178 272 215 4 316 315 96 146 4 36 339 337 37 4 152 144 163 151 4 377 296 378 379 4 255 198 345 180 4 251 74 248 9 4 324 103 105 280 4 88 57 341 78 4 354 277 240 278 4 13 228 88 86 4 192 123 40 42 4 105 104 96 98 4 100 53 173 116 4 331 205 375 92 4 352 181 169 281 4 240 255 345 278 4 355 238 152 144 4 370 380 381 326 4 234 61 233 64 4 105 62 96 64 4 30 229 178 42 4 67 117 68 266 4 63 103 0 104 4 93 199 347 252 4 301 2 317 307 4 132 227 103 306 4 110 57 91 78 4 367 359 324 280 4 293 243 132 170 4 258 221 85 228 4 332 256 297 170 4 382 335 206 10 4 250 382 313 38 4 178 29 30 215 4 333 334 83 219 4 65 141 253 68 4 53 116 114 115 4 97 234 233 64 4 237 164 261 229 4 282 347 141 252 4 326 320 267 80 4 341 88 87 57 4 210 328 302 313 4 169 238 47 144 4 34 263 8 35 4 32 88 190 92 4 40 162 177 123 4 290 276 291 139 4 231 272 213 215 4 25 201 226 225 4 196 200 101 50 4 96 315 27 146 4 342 286 127 128 4 4 118 6 259 4 317 247 184 227 4 12 13 88 86 4 188 298 357 299 4 141 347 253 68 4 290 274 276 121 4 379 378 371 296 4 63 62 105 64 4 110 118 299 119 4 166 171 302 172 4 290 289 353 285 4 358 308 325 57 4 103 106 105 306 4 193 46 158 113 4 165 201 12 223 4 383 148 286 128 4 106 29 261 237 4 12 5 112 7 4 67 199 195 197 4 177 238 291 181 4 58 13 16 18 4 138 367 324 280 4 26 315 27 62 4 37 263 330 76 4 136 374 344 135 4 116 173 101 266 4 237 131 182 306 4 35 251 250 38 4 77 76 331 78 4 168 297 169 170 4 149 236 326 320 4 71 89 90 72 4 105 103 293 280 4 209 328 384 372 4 279 226 360 280 4 354 285 277 278 4 87 228 351 57 4 68 199 94 252 4 93 18 149 17 4 368 254 242 256 4 108 90 107 71 4 196 50 101 102 4 337 330 187 37 4 328 210 302 303 4 265 111 174 225 4 341 78 331 92 4 217 216 158 113 4 345 285 180 139 4 149 128 127 18 4 226 257 27 225 4 249 10 382 251 4 105 106 137 306 4 357 338 187 37 4 130 144 47 151 4 249 9 157 11 4 373 158 160 45 4 10 9 249 11 4 114 115 287 19 4 222 322 136 81 4 173 116 101 100 4 132 131 293 170 4 165 223 12 5 4 331 78 76 92 4 345 182 122 139 4 261 29 106 229 4 265 25 246 318 4 88 221 12 86 4 101 200 99 102 4 145 146 248 74 4 32 33 91 92 4 211 35 73 74 4 177 162 163 144 4 157 186 156 11 4 218 217 36 119 4 287 19 86 129 4 145 35 137 74 4 63 105 244 103 4 6 118 221 259 4 21 23 20 108 4 321 125 124 192 4 24 176 265 225 4 283 354 353 285 4 149 93 148 18 4 165 166 5 171 4 73 35 8 74 4 25 27 24 225 4 55 346 85 308 4 36 171 33 119 4 217 171 36 119 4 103 307 132 245 4 219 342 383 286 4 371 378 70 296 4 316 315 234 64 4 152 238 177 163 4 168 243 332 170 4 138 280 105 62 4 34 190 92 32 4 223 5 257 172 4 33 35 32 171 4 18 343 13 129 4 351 235 127 343 4 13 12 14 16 4 371 296 89 72 4 97 233 232 64 4 220 4 118 6 4 16 14 58 309 4 5 113 216 172 4 73 229 30 42 4 168 49 244 245 4 26 138 61 62 4 96 145 27 74 4 210 145 27 146 4 80 82 149 17 4 305 331 375 92 4 346 85 308 228 4 0 307 103 245 4 230 64 104 98 4 266 196 101 68 4 333 343 83 228 4 226 27 25 225 4 286 93 282 129 4 116 53 84 115 4 161 144 130 151 4 6 258 5 259 4 198 131 293 306 4 50 224 99 102 4 162 139 177 123 4 220 221 56 57 4 181 285 180 281 4 168 48 47 170 4 356 51 135 81 4 103 227 106 306 4 147 80 79 82 4 76 78 91 92 4 221 57 88 78 4 156 125 295 186 4 224 201 25 225 4 183 301 317 184 4 173 53 100 112 4 226 201 165 225 4 58 319 264 320 4 250 35 145 251 4 198 180 255 256 4 230 104 301 31 4 184 29 106 237 4 208 263 337 10 4 168 244 332 243 4 236 18 264 320 4 182 306 140 229 4 283 353 366 285 4 182 237 130 131 4 284 285 352 281 4 178 163 40 164 4 181 144 47 133 4 266 117 68 102 4 308 351 346 228 4 213 28 230 29 4 261 237 182 164 4 122 182 140 139 4 22 167 287 115 4 213 385 214 215 4 267 380 370 326 4 379 296 371 72 4 297 281 170 278 4 366 285 284 283 4 210 46 257 172 4 218 118 216 119 4 146 74 145 98 4 312 363 316 362 4 260 114 141 117 4 141 114 260 115 4 329 242 332 256 4 105 244 138 63 4 262 186 263 11 4 177 39 179 178 4 94 199 68 197 4 325 110 358 57 4 167 84 83 86 4 163 162 40 164 4 136 344 196 135 4 132 307 3 245 4 263 251 382 10 4 361 87 60 59 4 60 235 87 13 4 375 203 304 92 4 321 124 191 192 4 267 320 314 80 4 47 132 3 245 4 222 199 81 197 4 176 210 44 46 4 177 163 238 144 4 299 357 109 298 4 110 76 75 78 4 77 341 358 78 4 357 37 188 299 4 224 223 201 225 4 91 171 259 119 4 34 263 33 76 4 157 28 8 9 4 36 338 357 37 4 344 135 50 197 4 271 178 39 215 4 373 45 44 303 4 105 31 104 98 4 58 309 370 320 4 250 210 362 146 4 267 327 79 386 4 211 34 190 189 4 293 131 132 306 4 8 35 263 251 4 207 156 262 11 4 40 192 140 123 4 189 124 211 192 4 105 104 63 64 4 264 18 58 320 4 272 385 213 215 4 142 143 141 117 4 205 295 191 186 4 50 53 224 102 4 148 128 149 18 4 99 224 100 102 4 261 184 178 153 4 180 285 345 278 4 4 7 89 113 4 231 178 183 153 4 55 346 350 85 4 104 31 230 98 4 222 194 79 81 4 269 270 268 64 4 258 5 12 7 4 110 299 75 76 4 5 166 257 172 4 3 49 47 245 4 93 94 282 17 4 16 13 12 19 4 292 255 294 256 4 27 210 257 166 4 337 263 336 10 4 16 320 18 17 4 332 277 297 256 4 105 106 104 31 4 41 40 177 123 4 39 156 155 157 4 161 162 182 144 4 16 18 13 129 4 131 227 132 306 4 73 8 34 186 4 89 296 4 113 4 210 315 363 146 4 132 307 103 227 4 147 82 365 148 4 339 263 382 10 4 32 211 165 35 4 345 180 182 139 4 289 285 290 139 4 106 306 237 229 4 104 106 301 31 4 242 277 332 256 4 85 84 258 86 4 103 132 293 243 4 224 223 174 112 4 143 21 260 117 4 109 110 56 118 4 336 339 382 10 4 187 330 77 37 4 328 362 313 210 4 196 68 67 197 4 58 311 370 309 4 298 110 109 299 4 1 0 2 300 4 336 382 206 10 4 372 44 209 328 4 137 74 73 31 4 272 178 271 215 4 293 105 137 306 4 145 35 250 166 4 26 27 25 62 4 301 106 184 29 4 240 277 242 278 4 263 251 35 38 4 34 211 190 32 4 249 382 250 251 4 176 46 43 225 4 294 293 329 280 4 148 18 286 128 4 39 178 40 42 4 122 121 290 139 4 261 161 163 164 4 230 213 95 28 4 12 223 201 53 4 36 337 338 37 4 75 299 77 76 4 363 210 209 315 4 216 118 4 259 4 379 193 296 111 4 163 144 161 151 4 270 232 268 64 4 335 249 154 11 4 249 157 154 11 4 130 237 247 227 4 230 29 28 31 4 294 255 292 387 4 285 281 284 278 4 263 10 8 251 4 287 114 141 115 4 282 252 141 19 4 246 224 174 369 4 47 247 130 151 4 26 349 25 318 4 26 25 24 318 4 316 234 97 64 4 182 162 181 144 4 243 170 168 245 4 279 329 359 280 4 286 18 93 129 4 84 12 167 115 4 8 28 30 74 4 32 15 190 88 4 5 259 165 171 4 22 287 260 115 4 190 34 92 189 4 221 228 88 57 4 23 116 107 72 4 353 354 240 278 4 138 273 367 280 4 222 81 136 197 4 258 228 85 86 4 107 116 173 72 4 27 257 165 166 4 254 255 294 387 4 332 324 329 243 4 230 28 95 98 4 244 243 168 245 4 47 355 185 151 4 316 250 362 146 4 40 163 177 162 4 155 385 271 215 4 180 256 243 170 4 156 39 125 42 4 248 146 95 98 4 271 385 272 215 4 84 23 90 7 4 221 118 56 57 4 364 368 329 294 4 8 157 30 28 4 175 159 379 111 4 136 81 135 197 4 204 321 191 192 4 243 256 332 170 4 217 259 5 171 4 340 93 365 82 4 180 285 181 139 4 71 70 89 72 4 84 53 12 115 4 222 79 322 81 4 58 14 16 13 4 141 287 282 19 4 303 45 44 46 4 230 270 2 104 4 33 263 37 76 4 100 53 224 112 4 112 116 53 7 4 2 0 3 307 4 105 280 27 62 4 319 370 311 381 4 35 171 33 38 4 216 259 217 119 4 337 339 336 263 4 33 76 91 92 4 188 37 77 299 4 132 170 243 245 4 248 212 249 9 4 140 120 122 123 4 181 162 182 139 4 382 263 339 38 4 22 116 23 115 4 267 79 322 388 4 41 123 125 42 4 308 85 220 228 4 284 281 297 278 4 279 360 292 280 4 175 112 174 111 4 348 194 66 199 4 18 320 149 17 4 165 257 226 225 4 77 299 37 76 4 137 293 198 280 4 51 53 50 102 4 351 228 308 57 4 32 165 12 259 4 101 50 200 102 4 184 29 178 153 4 49 307 0 245 4 97 64 230 98 4 211 34 191 186 4 282 129 18 17 4 29 31 106 229 4 136 135 196 197 4 111 43 225 265 4 205 263 34 76 4 79 327 267 80 4 291 181 352 285 4 40 123 41 42 4 67 68 66 199 4 34 8 73 35 4 352 285 181 281 4 40 178 261 229 4 43 111 225 46 4 329 294 368 256 4 383 365 286 148 4 103 307 106 227 4 193 158 216 113 4 191 34 189 92 4 293 132 103 306 4 358 57 110 78 4 140 106 137 229 4 30 31 29 229 4 301 106 104 307 4 358 110 75 78 4 52 201 224 53 4 136 322 222 389 4 342 219 383 390 4 277 285 284 278 4 16 51 314 94 4 267 326 327 386 4 23 7 116 72 4 94 252 282 19 4 356 135 134 81 4 130 144 182 133 4 126 41 275 123 4 112 5 111 113 4 134 322 136 389 4 261 163 178 164 4 203 205 191 92 4 296 113 89 72 4 53 114 51 19 4 322 323 222 389 4 257 166 210 172 4 297 170 256 278 4 105 74 137 31 4 343 129 219 86 4 0 103 244 245 4 301 29 230 31 4 88 228 87 57 4 277 284 297 278 4 81 199 194 82 4 125 192 295 186 4 142 117 67 266 4 91 76 33 119 4 173 371 69 72 4 75 54 298 110 4 166 302 210 172 4 351 343 333 228 4 183 29 184 153 4 25 265 246 225 4 324 105 138 280 4 331 76 205 92 4 53 116 84 7 4 249 335 382 10 4 380 326 267 386 4 209 362 328 210 4 370 381 319 326 4 91 76 110 78 4 218 109 216 118 4 322 388 79 323 4 13 343 87 228 4 15 88 12 13 4 353 285 354 278 4 219 287 167 86 4 240 256 255 278 4 262 10 207 11 4 308 358 351 57 4 32 91 88 92 4 170 281 180 278 4 158 46 303 172 4 352 238 169 181 4 191 34 205 186 4 27 96 105 62 4 191 295 204 186 4 267 386 79 388 4 322 79 267 81 4 73 74 30 31 4 367 273 359 280 4 324 103 293 243 4 114 252 94 19 4 136 376 134 389 4 315 62 61 64 4 8 74 251 9 4 261 161 184 153 4 198 180 293 131 4 326 319 370 320 4 214 157 212 215 4 333 83 85 228 4 33 171 91 119 4 85 221 220 228 4 159 193 379 111 4 73 186 192 42 4 353 289 366 285 4 286 148 365 93 4 10 251 249 9 4 169 170 297 281 4 95 146 96 98 4 182 144 181 133 4 182 131 130 133 4 129 86 13 19 4 141 252 114 19 4 130 132 47 133 4 148 82 93 17 4 127 128 286 129 4 128 18 286 129 4 12 51 16 19 4 314 320 16 17 4 12 86 167 19 4 140 192 124 123 4 8 251 10 9 4 239 242 368 254 4 333 219 83 343 4 217 302 36 171 4 13 18 235 343 4 208 330 337 263 4 257 46 176 225 4 118 259 216 119 4 12 5 258 259 4 304 190 60 88 4 358 325 75 110 4 116 7 112 72 4 23 116 84 115 4 32 35 165 171 4 135 52 50 51 4 51 114 53 102 4 77 358 75 78 4 27 315 96 62 4 326 370 267 320 4 253 66 65 68 4 255 256 180 278 4 209 363 362 210 4 212 28 157 9 4 16 129 13 19 4 32 91 171 259 4 149 320 327 80 4 263 35 34 38 4 0 269 63 104 4 355 144 152 151 4 361 87 341 88 4 75 110 298 299 4 290 291 289 139 4 204 295 321 192 4 297 256 277 278 4 256 170 180 278 4 223 111 112 5 4 266 107 20 116 4 28 74 95 98 4 141 65 142 117 4 362 250 313 210 4 177 40 39 178 4 211 137 165 35 4 82 147 365 340 4 191 211 189 34 4 190 15 60 88 4 111 43 174 175 4 89 70 371 72 4 163 151 161 153 4 37 76 299 119 4 330 37 337 263 4 13 129 343 86 4 54 109 298 110 4 75 325 54 110 4 356 52 135 51 4 180 170 131 133 4 273 27 226 62 4 127 343 18 129 4 27 257 24 225 4 35 166 165 171 4 52 314 16 51 4 39 157 155 215 4 345 285 353 278 4 12 52 16 51 4 198 106 140 306 4 12 221 258 86 4 251 263 382 38 4 308 228 220 57 4 286 128 342 383 4 117 67 68 65 4 73 157 8 186 4 28 74 8 9 4 3 0 49 307 4 68 197 196 102 4 293 292 256 198 4 357 299 109 218 4 179 163 178 153 4 150 179 272 153 4 257 46 223 172 4 176 257 24 210 4 266 67 196 68 4 175 43 159 111 4 235 13 59 18 4 270 97 232 64 4 124 121 120 123 4 299 76 91 119 4 348 93 340 199 4 84 90 258 7 4 91 259 118 119 4 185 355 150 151 4 313 35 250 38 4 37 263 33 38 4 301 184 183 29 4 339 263 37 38 4 231 29 178 215 4 136 322 134 81 4 312 362 384 363 4 293 180 198 256 4 68 117 114 102 4 24 210 27 315 4 158 113 46 172 4 12 115 53 19 4 53 115 114 19 4 30 74 28 31 4 185 184 317 247 4 351 87 235 343 4 124 192 125 123 4 355 152 150 151 4 301 104 2 307 4 12 221 88 259 4 212 28 213 215 4 345 198 122 182 4 211 73 137 74 4 292 360 198 280 4 138 105 63 62 4 219 343 286 129 4 206 208 336 10 4 4 259 5 113 4 377 296 379 193 4 214 385 155 215 4 12 15 32 88 4 147 327 79 80 4 217 171 5 172 4 208 337 336 10 4 183 272 231 153 4 291 41 177 123 4 73 40 140 229 4 363 61 234 315 4 36 302 339 38 4 89 113 7 72 4 30 215 157 42 4 194 199 340 82 4 193 160 158 159 4 91 32 171 33 4 60 59 235 13 4 273 280 138 62 4 363 234 312 316 4 24 257 27 210 4 235 18 127 343 4 373 158 45 303 4 16 309 58 320 4 105 103 63 104 4 287 115 167 19 4 353 345 122 139 4 247 161 130 151 4 291 285 289 139 4 313 210 250 166 4 116 115 22 117 4 0 104 103 307 4 134 322 314 81 4 248 251 145 74 4 94 68 51 197 4 60 15 58 13 4 371 70 69 72 4 248 74 146 98 4 156 186 295 11 4 330 263 205 76 4 36 33 302 38 4 18 148 286 93 4 130 161 182 144 4 94 199 81 82 4 155 157 214 215 4 129 17 282 19 4 189 140 124 202 4 290 274 288 276 4 159 377 193 160 4 182 162 140 139 4 194 81 222 199 4 22 21 20 117 4 58 264 59 13 4 379 111 296 72 4 116 117 266 102 4 66 194 195 199 4 330 205 331 76 4 16 94 314 17 4 253 347 66 68 4 185 247 47 151 4 30 28 157 215 4 2 104 0 307 4 101 116 102 100 4 88 91 32 259 4 124 202 140 123 4 84 116 23 7 4 317 2 3 307 4 321 295 125 192 4 27 280 226 62 4 313 382 339 38 4 96 104 105 64 4 342 334 219 390 4 176 61 363 315 4 26 61 176 315 4 165 259 32 171 4 47 144 355 151 4 30 29 28 215 4 95 97 230 98 4 6 5 4 259 4 157 186 73 42 4 156 157 39 42 4 149 82 148 17 4 191 192 211 186 4 185 151 150 153 4 185 150 183 153 4 96 315 316 64 4 180 133 181 281 4 230 97 270 64 4 40 229 73 42 4 157 28 212 215 4 112 111 175 72 4 88 221 91 259 4 184 237 106 227 4 353 285 345 139 4 105 96 27 74 4 301 307 317 227 4 85 55 308 220 4 77 37 330 76 4 226 27 137 280 4 247 237 130 161 4 174 112 223 111 4 126 275 124 123 4 111 113 296 72 4 329 279 294 280 4 276 139 121 123 4 12 88 32 259 4 112 7 111 72 4 110 299 91 119 4 145 251 35 74 4 332 243 329 256 4 124 275 121 123 4 375 205 203 92 4 178 29 261 229 4 379 175 72 371 4 33 263 34 38 4 56 110 54 57 4 372 303 44 328 4 302 166 210 313 4 250 251 382 38 4 341 331 305 92 4 5 259 216 113 4 68 199 67 197 4 107 90 23 72 4 7 113 111 72 4 172 217 303 158 4 184 247 185 151 4 291 276 41 123 4 141 68 65 117 4 56 118 110 57 4 24 26 176 315 4 87 13 235 343 4 262 295 205 186 4 134 314 356 81 4 279 294 359 329 4 328 209 384 362 4 165 35 145 166 4 237 227 131 306 4 24 27 26 315 4 209 176 363 315 4 27 315 210 146 4 276 275 41 123 4 266 116 20 117 4 248 316 95 146 4 340 199 93 82 4 25 349 26 62 4 96 74 105 98 4 190 88 304 92 4 58 18 16 320 4 316 96 95 146 4 159 43 45 46 4 336 263 339 10 4 217 172 303 302 4 240 345 353 278 4 213 212 95 28 4 309 16 314 320 4 84 167 23 115 4 335 207 206 10 4 159 45 158 46 4 20 21 142 117 4 314 94 51 81 4 196 197 50 102 4 285 366 284 352 4 343 228 13 86 4 34 263 205 186 4 96 64 97 98 4 260 21 22 117 4 258 6 220 221 4 333 342 219 343 4 114 117 116 102 4 180 131 182 133 4 305 88 341 78 4 56 4 109 118 4 107 23 20 116 4 247 237 184 227 4 370 58 319 311 4 147 149 327 80 4 362 210 363 146 4 260 287 141 115 4 303 44 328 210 4 335 212 154 249 4 81 80 314 17 4 39 271 179 178 4 191 124 189 192 4 209 362 363 384 4 19 287 86 167 4 91 221 88 78 4 347 93 348 199 4 205 263 262 186 4 316 363 234 315 4 237 306 182 229 4 342 127 286 343 4 317 132 47 227 4 193 379 377 159 4 221 228 258 86 4 167 115 12 19 4 140 139 162 123 4 344 50 196 197 4 242 256 240 278 4 25 273 349 62 4 341 57 358 78 4 205 76 34 92 4 216 113 217 172 4 95 28 212 9 4 189 140 211 124 4 264 236 235 18 4 183 178 231 29 4 175 379 72 111 4 132 131 130 227 4 302 171 166 38 4 317 184 301 227 4 111 5 223 46 4 333 334 219 342 4 195 136 196 197 4 109 299 110 118 4 157 215 39 42 4 130 247 47 227 4 201 223 224 53 4 244 105 138 324 4 299 118 218 119 4 224 53 223 112 4 163 162 161 144 4 287 129 282 19 4 87 343 351 228 4 124 140 211 192 4 51 94 16 19 4 324 293 329 243 4 314 81 267 80 4 95 74 28 9 4 223 46 5 172 4 291 238 352 181 4 37 299 218 119 389 323 388 386 380 368 364 359 274 366 283 241 239 367 349 318 369 99 200 344 374 381 319 264 59 361 305 375 204 321 126 275 203 322 267 246 309 289 288 354 376 314 370 294 279 121 353 240 254 273 25 224 50 135 311 58 60 304 191 124 290 134 292 360 120 345 255 387 226 201 52 310 14 15 190 189 202 122 356 1000.0 0.45 7.5e4 opensurgsim-0.7.0/SurgSim/Testing/Data/Textures/000077500000000000000000000000001277777236100216165ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Testing/Data/Textures/Brdf0.png000066400000000000000000000033101277777236100232560ustar00rootroot00000000000000‰PNG  IHDRÓ?1sRGB®Îé pHYs  šœtIMEÝ‚iTXtCommentCreated with GIMPd.e1IDATxÚíÝÛŽ›0PÍÿÿ2}@EÈÂÕ쵪‘š& d×>ÛŸnâóù$?/ý9ü°ôsò²ñ£®ëú¾ŸþÃéÓ×Ï?=ùáûýfßés§¼åõŸœì›LgøÛï÷;¾xïq.}îá÷_:«Ù÷?ö>K×eËõM¾HóëuÕ÷0ù¬o Zõ÷ƃž÷éA 5×[ ÷2‰ÿ?>íÚ_Uu¹Ñýcï3¿‚w_)-º@ P¹r÷–æû|>+ï9þ;9 ·®½¬ÉåxËé}e Kº@ °¸©œÐ B Ak€ìº@å?w}½ 8’£:|ºî¾ïqÕ|-ĪŒ»£€¶j€Kø?öqÑj›¾ï³ ç¿]r]æ›þeµè€`­ìZh¥x£•ýw›ªg¢ý¾+3Æ J>{¦@Ôõ ³sv]´ ÐN†Q°ÂO£øñ¥¼¯S>ÿ®¯ÜtÀøðQ_¨AÙùɺFó•ñOÞèønÿ‚ö}äeû €5€þZh«¸ÄSûðjIý™ýÚŒS”©Zt@@@@@ rÍþæ+ ÕsÇÙþy†­ DÍÿ×Ä™O" Ðr @1‘ç^kÐ5À¢ Y-j€×(ù¬Z.gÙÉVj€ תlü~¾¥qWï.ió_jœ*°k-@½bNôþ^«¹9ÁKÿ¹>;è~ßÓMÉ8zó?=˜dÈ?».ÐÒm-€?j¢×]ÑpÒ  º@p“Èsþ‚œ AñÖ& ÜýûNæWúúaOø7àÕ5´PXç-´U\^Hl©%ìp‰é}†7žO-º@ P¹­÷ÆEÜïsr>ÀÞqý½÷ X?ëó¶œöìþ!Z€á ï[ÀÃÝ(t@ ` Pl^)h X À}TÿZДm½üñ`^:9aï|€¥WƒìÓå¡Êœ -ZTjÐÀuWg6UŠ] ê)ë+ß`eÿ×*/FòggÆ¿³ïPM#°q™¦ò­Ÿ.PˆÑã€j¸Ïe÷æ·%Ÿê>vÀgÁOJrãö¼ñ SòÙ!-º@  xSg±L-¨žg߀õØÉñû§æ“hЀÊY‹Söî°ò>»Öš¾¸;qÓ@ €.T®Ü}€h+€'ÇSëì‚û"oœ'°k] ä5‡¡Ò  j¸^ä9ÜZt@@ P¢#8ô¿-pr®µw] ó@^P\Þ_ÜÒS-è@‹5@´ùÁ%ç?ûÐKÅŸ|\~ËqŽtò­]ëi@@@@@@`“@Ï%À'-½Õ8®\ÙþOí°qŸàŸóšn¬NU7ó@ j€]ýuê`>è@£5@áŽ~22m¤uéü9ž½ûh@@ ªè²Ón|ïÑ‚V0>3èù º.Ðúãã5íöÔýЧælïúf'l\~~tÐ5ÀkúÍn €†jÚ‘Ì[¸üö…] ¨\µû¼ÅÏ} ¨¿ŸlsÕÑ€vj€šæø¢5@,ÑÖÃñûî:~ë.ìóâûÉüìròÙÕµôÄÑÝ¿ïtœþü3]Én Ýlÿ`ëuùè@“5€ùh@@à5ÀÝkþ,í³»ñþ‡O{—¿?üV¿0ã‹OˆkÐ5Àïîû}è±ïØàÚ -ˆ|ßF €.4臡Þq!Y?šIEND®B`‚opensurgsim-0.7.0/SurgSim/Testing/Data/Textures/Brdf1.png000066400000000000000000000356451277777236100232770ustar00rootroot00000000000000‰PNG  IHDRÓ?1sRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÝ1ù{ÈpiTXtCommentCreated with GIMPd.e IDATxÚí]Ûv"É®LCížµ÷Wœÿÿ·Ù«gÚçAnµI‘YEݰ©/Œ1Æ ¥¤P(ôôÿ÷ÿý÷ÓÓS)år¹l6›Óé´Ýn/—K‰.y¤¿²Ç÷}ž¾WöüÙÕ÷õõ:§¾¦xÂÇÀª¾?òýª¿þt}N§Íf³Ùlä‘zû|>o6›ív+_·Ûm×uò£®ëöûýn·ëºn·Û=??ïv»Ëå"·÷ûý~¿yyy}}•oÿóŸÿ¼¼¼ü÷¿ÿ}}}•OOOÝår9ŸÏò"Îçs)E¾ÍÞPyŒ¿6›Í¤ØR†²ÔëëÿºåÀ²¿«Gd_»\.öyÔNÀöû½˜¸|»ù}½¼¼¨é‹õw]·Ýn___ÅÄúw»ÝËË‹ºÁóïK`¿ß¿¾¾þõ×_»ÝîÇò ûýþx‡Ÿ?~Æë‘RŽdoPN§Óþ@m@RyŸÕdæ®Y4½¤:Zãêo \µ{r[ ]àõõÕ:€½dér[‚†>`³Ù(ÌóññQJ9W ?+ï[gŽñp€y®ìuÞZd }è>Õñ‰¾@7zÔj~¯e@w}m·Û——ˆÏÏÏrÌÛHkE$hÍ ïƒdÿÇãñíííŸþùüK6â qä~Ñ’¯zez_ÐNúÌÄN¼H¾m|¬ˆ¹ÛüGL_‹`ýVj€óù,´Õ³Ø³þËÇãñr¹|||¼¿¿wòZÅEÄAµ(YÕ‰þÍS‘¾¹».ÿ8†þ–½ßÚº–Çïõ˜×€ðØôF-UQ…87›¦16Rtg.ûŽ>úüU ÷Æç©> ìÛFkèÿá²r›Íões}€}ÄÐ!ó±÷@Ú£>c#ƒ-yµ‹eÿ–¾¥6ùÑÚW¾Jð'º=L4¾jPêûG"}«°öÖoÃ;Ö çÑÄ£êbÍ‚ëƒ5W‹`µx½_²/ÏcA.4èÕikŒSÂÙýYãæ^`Ó¬#Û·¥Ï'º´q2Ó÷íÛ,xꎅ>!ÕñŒøÖ&èâ6á±7”¢¬¹6¢Y}ϳîì{…ïétz{{“çó¹ó€nÍãc¥ks€±Nú°QÒrÂXÈøja°à&$?àš·„ /`(Ø!¬é+ˆ9¶Sa›ýûK*àÏ"XžQaPL×üWK$$ð¥E{BöŽoi?Ø.R)ŠZ[tzN›½ áe#€5t½ß;€}6 ùwCoý¶ëŸ#+9Ç¢aßKhüÃÁ+û ú“¾8s8e³jåÈx°c+6×·–j@Xžó£vo“"M™Ààìß=Ȭõ þ8@˜H­¼¨½w¶æàÇgžAŸ„ÁÙNØáÊ&¶`nËn˜y°)”0àghÀèÅÛm d#€vä:Nçóy±ðÝct X'Xt¨š¡õWÀÛ«–¼¡ˆ{@°‰o™i—‚›Euå*׬{ü«\Eý—VR|·>À€Ç7Žá†Fä6Huà;¥nS kÙÞàkŸ…¿oñf‰_xðÛ¦ïÑ]R U9À£P}<™U÷§¾Ì²?Ír}À|ôG¿„g9Gl óö­76ÂÍö:Õ®Nþ7…¹\.Bí+sò¸Æõ‡F³wHrlcÇ@cö™O†öxÓ÷Y{Æù ¯Ü!=ªo—ü’Ó‹ꯙÞ¢7›MÖ¾2ÜÌ}ê¡ÎqÏÐôýl®ÏþC‹÷ëè~‹|i‹Ý0e²œ9Kì©—ëKŽv8þÅì=":ëÉ’ÅÇ5g”qײÇ@N¦:¤ÏE ÓçÔ<3hÏû@“DÈø[Þ7Mý¡ú§­†?Q À½°¥rýŒ­Ù˜îƒ„ê ¶$ð<~oô™€ÛŸ8@˜o´ãÏP{ð«‰ú Ö¹\>‹`UG,Fô¢Åî€ü'” ò]yBp3eôì»üäÇ¡;U"†_ˆýÛS_S å;X£‡¨”ÒÙ³Á2Eð!^æ–œÄCÞÖú³A–áoáäö`Y=¡¨­uxrŸ{÷²~¹Àà²ÁA~½{ʯ‡Q®§ ™žD˜p}?ÅâçÖ½Ñ{Fg†Ù“$€µÇÿ0hÁ:€òþy꯾r€ Y{\‹Ô„Î:€×eȆwmvD¸=aã ½Ñ|®oo 69À €V€mÈËåògx^_Ç£h/t¬ ®OðÍ ù¢6ãñëì8tvÁ|ŽîÉ@Uð](-´®ýS°¨¿®öD—“Þ6lÇ÷t:Y (yn·Û޼¿£ÄR†8ÖóÌIb sýì²gy&@ëõKó ‘ló·C²š÷™lhfÊâõŽÂ^/€¡á¥¡àO T¨ç1ô©ÿîˆ#ˆáý47«‰r†X˜Çy p´Ïä±hOV@  ŒÎëLù-ßä’ j_ƒtañ‘Mú:@Èa´Úb;ÀqðŒ¡‰_‡°&Ä(YÕ;6=/ õø!¯ÐâÃã?ˆhÄ“þàß(äø·p§×, éÍÄH :@Ø <þ°O–ÿHðwª'ÈoÙwûá ¤d-Ì’çdàUz”ìàÙÜ iÀ—Y NB‚jÃ(F¦æúò÷¿>aÊ+'žÚàÖ6\ßw—VÕ22O¶zÆÕì ýS†…/)ÃÕFêñUlß79œôõ9ÉþÁ .—Koè»Ç£Á=/À:#@xÒ[=~¯Ø )?Ñ-Ô»AVBØWR}ëzqÏ<ã߃ýa|°Öÿ§€žyy°Aû8ïÛ“b·¥ä%“\~˜]Ïo+eå!N¿ =£] í^K gb4|÷WOŽ< ~ûb‰¸=Âéu¿zè Ï'$½…)“íL”<“žq€laà&h@È $>ÐÊ-×ß°±ßJ‹À Àœ ‘¡õ? F¾r©[N?É‚Bz\X7RB)ÐÔ@˜ô¢[è!µ!sÀàÃPô J<44uŘ™xc¬2Œí ±týIÈ[¤S;–dpgfèpüÑB;¹á!Nß‹TѪҞaå¨éŸîˆQÀ¾¸0óå©ÿ¶h–ÃÝâ?A€7ºqªc ÝeƒUu†½Ú“uv˵Ž©åàWUgN’q{,4z®oß(5_ŸÌølbB%²3ô3Se8}¯ÇÚÔ2nçõvýuVÉ<%¡4ÃüЛA0„8-دÂR eå9ý„ïIÐ!ûlíB…}?µ~/kåÅ­B³>2ÀƒÔµÃØóœè+Au;@æíÉt{Bå¶ ã÷’œa)Pzö•-ü¹xð¼ÿ°öÍ*„° ü§ðçâ£nìTáÎbVÂænIHodiæÄ™e2Ü|ÔÉ'rÏùÄ&£¾Y´'£K´ÁK¸KѪGt€°ã›Á%_TAN}+ßÉ5|H ”¡@€–z¤_­ŠÂ·ïÙoÝÀã?!MÈ~i<=xêÜ¥Šò ²†Þ î a~ê‡äȧ@P.W¿‰z^>ûçó¾½S ¾Eð½£@ã.¦n—.ÌP à25-™ðÑÞÁ(„š,ÁŸý„ôZ¹ê½y£OQ ¾}€µ¥:ã¢:Ò­½±U’iÆl1uÆíXš_“ñÈO8Îôyôþý~oÿºçlOùˆÎO,õäß| PJHÿ€?æ"fmw÷7 ³·!-">)ÙE¨æîå ULB–v¨û8)§ Ž›î‡Ï懼|uKXŸàÔ·-0ø(»LrlmBW³í;Î6µð$§8å6Piö3%H±Ë÷õúÙEŸAÀϵLa 𜡴IÖ `(‹ñ¯¡«rß0„rœaC—[?®"ÚžíNfy𳼡œg5—éÁán‹0ÑÏà œbVŸ£¤KE€5ãý-²%!Ú狲QF|çË/ª¨êù„ÌM¯Ôª¸…ý¸5€}ªà!‡ƒ¾Afý÷–BŸ߇j ”mj Ñ}{ùœÇÎÝfò ¥Ç÷²ƒoºäÓ–¼·`ÿîé§À  F€rÿ2'ƒÿîàéÞíN¯Ü ŠoîZ¨óF>É5Ñ'â—»xÀ'‚ÉØ>!ÞÏ™‹©B¬<”AC^¤È4:³½¼Àè w·MO^3€úR‡N¨tB¦~Ã<n—D"³«Ž뻎UëÛáCåL²æ®fùX Wö˜’çú  ô5,{ÔSЦhoÁë•ìÅEmÕ”ýª yñÇãÑ‚ž: +J)² [îéÊ·¼÷ò’æ¯õl6:í·—Ë%”-ñÆ‘22œöþy<;é[ ~Cîa »HºïhZ^^:ü ÑžêfvÏîä[³…\ÖÊïUEPìfUµ p}‚†0³ø ±þ,ã÷ÊaöŸ!?$ìǺ@~&øÞÝ ¯šC_VO‹na:„@Èm!ÍÁ‹Ú†»G¡Ë›©ÕΟúŸ.‰fó¾ä"ŸûwT…¨îê²·3v§÷l-iÖöÒ®SËŠRNs° /„«ü#~èa9aÉÉ>·ñs-ÕŒÈÛ74ƒ«§Þ—U…ÆâlD{l;Ì»a ”Q²(£<„²ÌÐÒ ¿ìÁï9¹íÔveã/ÙÁï3Xø÷5@%â/Obã)P¨Û"?}À¯%¼(£µMüȸ=¼àP%>„}€ ¨VßĪúð0²€šleôÔ†âT®²t¨ºÒ+T†_ÜÏàv&‹Ô¯ÚC*ÐÚ›KÅ‹ãŽÞ˜šõ9l)7÷0W‘PM¬‹czVÙö¶ç÷·Plì÷Ù¥tó7A¾ÚO¸å%Ó<”;Væ_ üÌ u]¹fén6›?5ÀÌmוÔ½À"¿™=´ø^âµð#^d}1ð/Žd€0¨ÑIz½ê-¿¿ïf>¬ø† ¯êN´P´Ù—¹¡X¹•sóz>¾Qåõy¼xèÓË”¾ð­^€ñ7òœ½W´[EJ‡ž™Sw¨‘ê¦@YÇ7:}a`Ém¾;k£ß×Kú~ªk=HF¦í܈öd1H ëÛÙTŒ“־˾$~˜„ à–—°öìÀÜ[ŒÞ_+ ¿òç O¸Ì‚üJ¸ö¢1”ê@ÌR8ý Ep#ú™M¯ûÕ¼¾¨…ŠV§}rÁÅ®w•Ñ _¼½ÕÒý%Žá)@YFÁök÷Ýš¾šžPGf¶½êû\ÞüÉM"@ ÚŠú –ó_dgŸräG¾5÷°Dn¬‰ƒ>ÀD°S ^S޼û Z¶Çd²¹^¿Ä—ü„1²mkp€*fO[±ÆÐâ«IDfؾYB͵ÒéwqÆ“…ã<Õ áéù€"l–߇ê̈́럥L!5Úk>“‰–9¡óùlß=/ÅìÉÏU›uÿ$áïêðVhkì|>Ë«CÄ3Ãõ«¥°_T>23\Ø[æK™ð[¶ìz ç”!¯sÙ†—­\‰ÊâÝ®°íU"õO8ûífò/U”ž„ŸF(NÊ 2Ÿl-i&@[u€j  e·+i÷ª¸O2aŸPï F7”wßë+iX¨¢­Ox@,–Œ¿¥]Uh/‚×sðW} 1jµõ„Ж·‚èꥈ>‡ÞX[õ||DƒÇ‡,¨‰㇖–Ðõ¡=6>TOôP B&¼àyóYj²±\ëúÛÔŸ1† ù`¤Dý+À‘¶à‡€¡ Û–bO{;—Ë¥ûzç½?û«›Z8þ“ýÃ-DÈ?ëàfÅñÌ>}?‚PÕÙëuf¨Nß«¸)¶Qþî^òŸ¾¦ŸýÞ`˜½*f˜<á6é^ {[ÞZõìo)p[Ü£\“=ÃÉ÷^ŽqE†» 5”2s‹„,^ø†$^øV³ ê@ÌÚàN‹{†e¶½”s~¸Þgü·[¼µ 휤0è½#ž™dxæ%R6'Ý.~–‡EmÖ%P¶éÚÊ0r†ß†Æj;gîD(Ÿ-Š™m‹²¿^"D"ÐÚ|µÑ·5†°° XÛçBþUÁþlÏW¦ý°’­qCDèCúú5Ô»áÆvRø–ß<þ¾x¿ÇïÃÚ ›Xçç’ðÕJ„€8ØO漸 ¬îº Ö²tÈ;·$?\ÒK7‡5€OúW’—ÂÁ¬øcFû S ˜O ³Rÿv² W>cÙ/ ˆéªlZ«–l¡oq¬µðëét²J†À«ñc_öüyÜâÓ†ÅÂùIþ±ÍßxñªÎYœu‚A fÁZÔ²}G½†€á”ïîåø¯YçXœ˜³Uf „}8 ÄÏû,G*nwÆÚÞp8éy”-ºã&®‚VÞ¹%ËoŒìªÔ€{pº˜:sH„,ºÂ•û«œŸ^z>V¶ÄSš×ãðþ«96vy3aŸ—)ºÊzœü„¿ØÍ¹m”b·…ÃÃ7¸øÍE6yÅlE£vg¸¬®Eµ|f𤒰Ø% L³¼(Tu¶åDUí¹—¡gDhû?®” Ñ+„’¦Õ…ÕUîCµêå’†Õ‘.ýõÕÂÐÖô³¨ªbÒ¸¿šÌ û³¿%· 5QRȲ¥—­†E_þ–\Ë$¤7‡t¿¿±e‰Þ Öfú„ê“Er?—t§Ú«, 97Œ«Nðªj€¾ e}]hú(œt©æýœûêx®–ãb>-x¿-Èæw…ZàÑÒG÷³w pG=¯^(P†¶8T¨-G~•õÊ£‡äþõÈz‚ ïïòÕí|™;áü|v˜Ñc `=ÞÆ¾¾‡Ó-[‹€nVì‚î{&è™ÁšÑMaûpàÝï_©Ò~”ߊ×Îoôd_2 õáwOæVåüÃju¾ÛmÕÈÁÌ]Øv™‘èõ‡ÂEfD¾äBðÏZx”`ü|νJz[å6|%dh=yzu|ÿÉjâÏþö«ËXbK}¤PÝÌ^ëó©ùâàs}®Þ ‘Á“5“¯Â^o#ÕG¸¬8é|eú‡\ès\¸B²É©¾!õÆ\¿ºÈŽðŒÂ¾d]icÿ+Ãþù k w®ñÔ†WUƇ÷}«màF¹+bW7èvÇ·ànÀG[`Ò—Œt…é¡d9aö· B«Åû3›kÖŒô– †¿ï'€¹CâŠwÓe%ݬŸ”-Kì|Þïáîþ€÷å/á÷¯ÜúCXS3x¢ôV]eg›-+a «Zÿ¸Î°Šy€ö .pä[”3lñ‚ÄÉò3È”ª2¼ßö%V’â‡ð+9à³´§‘ç²;KmÉ{¶ök¬ 8³sl„ÍO‡»]¥6øÂ‰À[‹¼,´«’Ûî ïWn…G;irq:7o\ò~»¥ÁÆì®Š™¿h|QñÚ’kWUŸŒ°¦FdeËšñþ°ÛEª^Ò ®*?Wùý0ýH„O@¡1 âû§½ÉÝY Ðk?»— ›»Šß‡ug:@Ãkå<k—§æ+ä÷‡ßÚÍH~Þ7cw–Dög¦ —uÎì $>X.PU°¿e[#Ÿx$ÕB–Œ­ï‡s’ŸP³-“zæ^XâBbBÉçß[Üx\ëJ4?z*Æ'¼àþöÎnòy¹O‡ Wå÷û vu­ ïó8›Éô-Éàý°˜…5­F¢¯\í jئ öèK­þTž?Öš9×ï5Š™uy}Xhl¯nt$š(«Åû³ÖiXg'=ÑÿÉæz³jÛŸ°£˜òÝôzê–?˜¸—nyÎá*Ò°¨µØ3È?í]·+Ôßlçödë[€ÜÖ>Ú[Æf¶ÝM#Œ¬4土ÐÄÉÊÞöÓgüíy…ü~‚÷ƒž3T«ÕÅa€,(¼‘Á>Y¾=Š Üz :éRrš§‡öÃE!ù¹]ݶºÞ”W½Ëâý¾×ïDç§:ö t Pé¤Dĸ–„g7Xi :@Øáª¸ðFžíœ©ÛÞÞ¯6jÕW·IBoÎ$Ή è"A`½5@Ég«,·¬Õ?¡3ø¹^ð5çýt’à‰þk,ÂÒö ž™³ÕÕ… ]\¨Eöp˜˜¡¯Bq‡âýðÃrt"U[Mõþý¡¾xÂ8€Ý,Ÿ¢0§o_@Àñþ°ÆU¨/##í~µh¦d˜ÉüC'8œðZxæxÙh¯WéiÜT&6°"©q¥;Ïs,¿?„Jot݃¡}†5î †ÆSIäÎù`WÖè­ÞOšÇ+Tsð¯§ÊóÉÆÕ[æÜCÞÿýÚªÏæ+‚Û‹]þ„g|ÆâÌäITÑÔ¸°­QIΫÍûýpVU£“P ý~?7ò|ª·^ÅîW@Zô:ÑÏPÆÜ£Åú3CHìý«BxÞ_ÝÑKè=¼hiuµ8ßü5˜)âe.¤7v¬Äö}ÃT¼½Úa$ZmæTûª8Oßb7dP‡|!²ï¨%,býeq:t{ D8ý@Skó«²ýpü¯îôJ¦º¸ð _åBøý|¦=|¯ ¬hKÛÞÒpEi&ÏO,H>a¬¸¼ßƒ÷ªÏ-0IèC. ^ÊÓ—SÔS@ëj„e¨ÿ-x&ô5²e½30}ñ~.ÆF¤~ˆÌ?Q·ÕõjiUß·ù¡®\ñ•Ž?EaÞXõVñþ™ zú“>[\ç¥xõlx?Xa;©2BTñœ÷Ìvé+„c^ÀøFsw…‚Ê•R„È(­€nÄ?Ów¶8ÌyP³OÏØðIDATÙ8®Ÿí¶ð?õxÿNúóá©?ÏéÁ½òœRã5¬ïÏþz7–‡õÚeTrê¿ÅsüÖ:¾¯×'9ÊçÏï_sÏ‹çý>›'}O„&ÚX½XþÕJwY¼?û+]núJÏ‘P`¥3rg>smçÌú«ˆŠ»#=ŸL̇Àü°ñ—^º9œñmÑõoÄû§ö}?áua¢9–QØB }ø?¥m$`ØÐcÈm¾#¼ßצ!ͳ‘ä“ͳ{t?=mMÚ÷ðþ0\.—^Ð-Yo‹Ô3ÉÈJw~ü7âý_ƒßß(æS-‚¡$°9R8á•Å„’ÈZ­ ïÏâ@gO;?] À!NÒŽ%‹Xzáý÷Îïã¶k¹²z «w55Ê{y¸Œ¾P]·;¨2½ŠÑ âlÅ 8C‹´£@á #Îï_¡õ—HÔ-ÔôÌVöú€äBá·VMäv5$BW}€ÁÅ_V6p±E{léI&z³e½~£€úó ;¾á^Ê =Ãû!ù¶¦ÞãÇ»ŽÇ£=à½*$÷òxŸýë΋l±i&teÏ`ëÙŸ¡ùÄ%ˆ]ÍÀÞé[^k&éLj€â8?^Á3T:Éš»DÂvµpgÈï·}¨ê2ÆŒúÎ;~G]xT‡º&YÕÛøÌ|üû·›ÂÈV¯RÓ÷ Uš­–¿:íÁïñ~_-€¬ÐJjBëÏøýÊí ÷¹C^d•@­G…‹{Ã]íaê_Ÿ•ðœý¡ó'÷íäÞ%‚V!.™‰[…]°Ð7|Ð :ækÃû3:gXà6¢Ÿ<Øå.DϹEç§jú :ÃÈ:îÇ!G<}Âã½¥Eџ̳û2ÚG¤?‰ ïÏ{Bˆ³J…hcWs÷ ýaÓ7cÅUGàÈß‚ýÇ0k·7ÂB±·^«K3Š?)8ÞoYnã­¦Àû«ô}ósàß/ðª*[…»}ÎcäÛ®ay9:e({¼¯o?dØx,H$cÂ=5\ÙêŠjÂcËUs° PÕ3¼ ¼ßnÛµx¿?ø9öïup­dØ¿ŸðRj ø¿× w¬mä¬Ñ+Ú³ÍøxÿªP ¼ÿã㈜DØÇ Wy4Ô +Ï:YY†Ó·!Ðòà±"@ÚP²š°¥Å­Ä;Ùû@ˆn6Ù ôf/ÔcEj§Ýá¤'Í`@N×0ÛBøz;”]ð'ºâ÷vÚËW¡v§McäDi7¹_| rÒüÊøý·)oÉNû>~’‰°ýþìÔ'ë[2ñ’ðß^±°ß¦ãö¨æ+‰hÙf{ªý…’4×£l~c¤ýãÀƒè ìTÓžFMOŸÐ·|B•ÏP̹¬i[£=û½Š[•߀óûml±¶îÅ=C1ç¬Ã5,Ë_›ót$Õk?ÃàYP¨çÓw_K&ìÓksãJŽ¢Æm„êãŸGÂïÓ›¬¼BãßpDFA÷34\i`üXüV»Á…,ëåM.¢qB`ÍÍ,‰t÷Ÿ<ðÈ;Jp€·'{¹GKëݚ« ,ÂÈNW…uZžïì’8@º¿ —οg°,"Ûï &¯ªC cÕÂeçªÄ•´ZUÞoóo1VdBe‡ û÷<Ьg2 øgøŽ5@û‹k1&â-ôæFAŽÁ§µBPãkQq«®plQvhq€’¯oÉP Ef|Ç ]ö?ÀÒ(s$3Y>à© ` öeÿÙX ¸DãK]ï·é¸¾QD‘“Ð|ê}>§b{ÿÂ÷Ç?¼~ɦ¸¡¯Ùè埕S2å3N ºÄ%ìøfI¯îYZ'ÞPL#ÞO¨íD·0dNBržò¯n˜'õJ÷ÃEŽ>ƒD½U¼å‹{ÉZŠïÏf¾2¼Ÿo­ƒ‡Am³ž×-ÔÎ5:À(PUê§ñtç¤NŽ÷¯\ÉYוö%6{'áx?}|^ÔKèªPþÏ¥@ jQ Æ 1d“ì–¨sûe]Âr“V‹÷{¶&Çû[–V„?‚È&®3¾~êE¶Ò<ÅrGn_»[þ®`Nf|³5GdUcU}U{\J¤2¦:™d)PËŽk›ó”ë1 ±ñÙ®ÒÆ½¯N0Ü^pu“’¬÷ÊT ;¼Þ¿6º[†÷{ò¦:@ˆ÷gœ‚÷‡9O8Ñâ}ò£a`Íúªõà–Öocð%«B€×µw‘夒‡p¼ß«Û’eu0ïì6ªý¬GípðgÔ *o¨Þ€=ÁDÓÊBÚÀà—ØqNRÛÙ.ù‘ûûö馾 fõÜ}¾ÂˆLºhn ó©¼í„iqÕ¦EýW«µQÌËM}€Pò$ìø¶T±ºë} !®êôÛ8à{!æS•¹%JÎeвºêxû×è t7fÕ̧Öjw.в¿×Ó¶‡+×é‡ü¾B¸n—hQdUŸÓÚZtmïÝ ºì$kÙäÇ «¢¶Ùf»ªêmH‹XO»×«9„AÀ»~Æ—°>¹ÎOqZ-J>_3•‡ÈeÍ ÐÕP|/UˆŒîï[¿2¢ºª°~;bÂiÌÐ+í!&Nd­ÚS ¾ëÖßPkjs×·Ëѯnóã…>ƒ¶§@úø,ã‡ù÷*Þc p/pçø5@åô5@†úW‡}-ȳ׀rªu*“'Ãõáþò›Mè `[£Ÿ÷ÍPÿG 0Z @à ¿åe D.ýs ¾ûÐp…éÎã©Z>ã›5¼8AÚ£þ|ÆeÀë»K~B“î6›Íáp°e€ÕjÜãë^vý…zBø_”ím~~æ‰øü5dä\½9ëìÊq÷ «ëïÛ‹Û$à)%Òí!Ã.^}4¼’ÌNÄÛ§#v£à³õŠ–žK˜d}ßU•PŰ;¹Bï²A£}˜+]/ù¢®F~ÿlxÿ²ŠÐþ¯w>LUyœçÓÈÞ©Ö»a °8ÞëÃ,aÉ›©ØÊïŠ/i€\?Œ ™® ©Úú¯×êâ~ص°>ø>‹–EŽ\̇ÅÛ¼YÄÓæßÜâ« «=ªÓ(è­*ʈŸÂÓ®Ü?Ì V˜…:¾|[Ü:£ax?q’PÔm x¿ŸDáÐ2àB×yÐÜv÷7{PÝÝÒ¢é0EX»ÃÐ^´/¹¨šxc.´žùF¾™Ý¸º´”K˜X4„8ÃPÜ£ŸtñIQ– f¼Ýo À"@V„g¡²æÛ‘®•è9ÛóžÈ2·8O ÅÊú\YªCºÂ¥yaõ×®üù~«4b5çé‹ùÇe}ÀÚ¨7p~øoè¶uµhpȘm>µ§åÉï¢|á’·ä2×ã2k hÜZ¤?ä{Z¼?ô®ëüŠÕ)Æ\—½\óæÃÙÜì¤ÏtÌí>w€Aáoe#]þ["ì\®¹@¥¦oUóúÊ^t™XƒÞ¸Á… ý0â8õ©O&èÙÆ)=UÏL×ߪôÀýîÌ^·H~1¥“^Ý€Ž´‹[ö™fvœñ|üäÆœ L‰õ+Ú“q{²û³¼È‚¡dmµmûeu’/ù ä7Â_ÕôÿÔ¼ Ð(z5 ¶´^±,îéWÊeh¹¿…ßOö¶gÊýÄæª²'÷•Ï4ŽRþÚ·(M   dûÎÓLÇ*ɬD—È’Š“rÖMÖñÍîÏ´}ª´þF¸Ó»A˜àúÆüç WÆiȬ­]ÙáFàÁ†—ï¤BÁJ:»½:¾™Xf?h†)Pfè@z#ÌîY¸wOH#@ö¿eâæÃÌ=KýÉ>‹yNÔŒìvDïdx?w€l/ïÇÇG¹¦6(6Z(å$<ƒóŸÒ‘õŒY$·«ƒ¿ÕMá·vÝl>`^kˆÜ2®[f÷¡v§]Z‘Ñ›Ë5åöve$®ë'žðMÈpW(l9 9{,ßÎvm·[]*l9ÊíÝïKQÝn§ ÞöBP]LûàùíI©½-(ȈcˆA€ŠÖï¸×ù,| <ÌÂF¯œåªÿ3¸=2ìñc}Ž}Ÿ¿º*¨®Zþr„%f_=WS¦0 K^ØÐhÏfrØ·çúá`;',dôæ’Sùɺ®²´jÃÚž? zéL°ßq]Åyü6;Rõª´ÛÌy¿WpSNhÕ>_fê+ÝL¹ÍÇhÉU÷Õ•†uF³âÚ"@ÉÈpªP¤L¡q _ÿSë£NÜ ôãËðÉÆØI.¯†6¼BñZ¢fÕ¢àÙ¾[ÈJή‹ óŸöœõqÁîÉO§f;Ã3Û´JXpkÜÕ>mÕ2íΖ5%ßVM¬ŸäÄå;]é@ y›²ÁH~2Ó[Ïýç9-´’[ËÂÁ²ªˆìëõàû™dU/ixÍæR‘IŸŸ©i( ®±ù;-å„Ó) Ó(·¹DåÁº×îôE0×u³0(éjµo^ìV"@#üߢ•A!|4s Z­^gA“rdˬ™÷w¹õ“õŒ|Ž‘<`)è~#Äø\?dù~–}Œoîf³/3üt†Ð>H‚c„' ÊõæÓ°á®dô L2Œpýv%Ãƒí½§R¬f>UÞHí¬î¹˜SßÛY+—6•˜ŒØæHáU~ÏòÂôºÕtð3¾Ù0{¹Ö6|8Àè7¥B@ÈÖÝù./áú‡Œy ÛMø”h1µv|¹d^YÂê—@È>šµím¯»ÛW7éó°(ƒ>³Ýu|Ãix§µþy’~oÐbúÇã±W gè@f&úý…ŽtµèôU˜§æßs$Ã…»½È/ž÷Û,hRÒ›_Îå)k€°3Ò`;¡Ø­ŒáÂêÒ@zëkô#FÚ©Ýi,ˆü¿ýæ²=¾ÕÅ^¡ÐƒõŸæÏhÉÕ„ž @0̲æàK {X¾áUèž"Ò>D€^üɵå¯Ú¨Ø+ ¬x£×‘€§§§ý~¾ñ¹ƒ©ë¦þßÂy\=×áFˆoBİ)PIÔ›ý‚/àã1M(vÉÌ®¿!P¦ë?€ÿÝj=†äm”=]õ¢êì#Æ ý]^¹ò‰žêÀ £pÒÅ š—fõæÒ°««1õœ÷ûÞú3…Mè}Þ|8ûÓÿ)÷Ì…ð\×o["€÷%»Ó’ŸÁªò¡sA«=þ°þá}aCë'úýÖü²£q#€×-ôlM߸ ›Y-(>F ÊÙ²Á¥ºÊ¥êeQÒÛ—AJ8ٸ騺ú€ÿé°Î­iOt€;«PËò ¯°ÕeYœ¡¦§?‡ %ód©ÎÃúÇO¼?Û^âž^çg"sýŒ¶Ð7ø0a–¸T×Vó1ööÔÿácö R³Ïé¡àÕž!פ‡.áíØ M1ðPå÷E€å6¯Ò<`‡×ˆˆç½/¸­ðï _õEÒ!ýv Æ›g4dDeoèÕ%ví`ZrÝžð¹µÜl60fÀš~8½güv»Ýï÷ûý^$€ï™1:5§Ïî?v’ v[€cØ‘HèvyÙ~Òâ]bßYJÃì¾:?}ñòµ ¸ŒÙâ‰0ù¾².#ýûéÇqC•È"9ðõ³bW#Lµ{e8äCÒßËHXUfÿUÕ"2šI§ !ó„×kí)`~hNANŸÝ™q~|A¬_‹ÛY 2*>"çMÕÉÌl5ÁІƖ¯q³¶@ßä‡È”gR ÄÐáF‹xí—ß`à8ô-'ý`mBW#F]YÌÔTzXò´,¹¶Ó7Óíñú„-p§w€ãñ˜¥@Ù¯â¸6E¼Ù~®lSË-¶®‘ä‘ ÃQô#8áO°5€WøiÉ|‹‚UAk«Ø,Ãñ÷«èÁo[¾³«Epˆô«Çfã²m%y¼è‘&•ÉçØ…³/$õ\È»A_¢¿zˆÍ:]E®Ãá»bè¼ù¸À6®ãñhߚМÇËö—\º°±V{8À ðÉVn~çsö*„‚>GWǸӞô¡ÑN(D•Ϙ´G¶,ë ·”„ß?¢œÉã"ðåré$kÞívÏÏÏ»ÝîééI¥ô²]^›))ÚëCŸñ›w}`èVÔ6üÝPû xÿáÉ–ùä'›äʨ>YîÞ7§ÿ2«Šfvìl³NçgÞ[ÿYêß·"ñp>ØÔCZÀÞOİÂUE™nOFn«òø3mŸGJ³`‘ )P)¥ó…oû¿EáÙîä"3»§×ή> Êù´ÇsúC*[6ÈâBöζô¹¾­,Â²í“ žúÙ´{(ïÜRì–ë9©Ìà¤ç ,|á 4 BèQN²7´~‚î?NúeÞŽD>==]DzÏ ú´ó¾É·þl\"0||È2þŒä y#™™7¼Jÿ ÆGXªP¨ÆÿÎ/¼àÄ?ïÒùßF€ðì·m¬î´¡ ”/Ï6³gºÐ™¡+:TÚÔúîÙ}D†Ùj?¹\:-ê±°OØèËùñeèår±lMkÐjè6Ë·^Pø‰ÞŒÇß× ]@Ý8ÉõÀõW®F"³ S~&k}9Úˈ k8¾Æ%à©qnOxÒ“¶nË Ëã˜_ïÁGü¹'X¡çççççgaüƒ„Àüçó¹ë:¯ñæ³ /®†+wŠ¡[A›A'8smt ߺÒKþq"èp£­u"ŽÅï¿—¿;¬`S Ï>€g¿‘MùøíÖ¶ï“õbóÿããCÏ~u ¿“Ë;w¯ÚáýÅu¦!"̶Òsº¥ý›?™zPf¬¿{cø¤¬^pù ÄÓC´ÒÈõm9k¿ÈhÌ™xà?\ˆTÜμl‹†¸l)]¯†W%»Ñ¦6б"ÃRµA˜ÿ|F_{üö&ù§l¸ûž½žôPò†}.HÂõÔ³–k½h¾€:£1[°&>–@ÕXèÐR#ŽKýÝŽöÂ:i£‡S?äñ‡+x=LiSawj± Uoµ€NB¸§¨$Ô"ÒÖÂaÇXy¥;uʱ6x—¿Û×/ÊR°•@ÖóÊ0œž5­Ä>>>Ä PC÷ã,0nk Å™á¤Ï†ÙCàÀNXû.ÅÖ\ê$ÎRµ¥Š`¾&À½óù|¥õ))á¼K¹fÈøÆ­«¥0pð}¯Y’9@˜ô‡©N&Qز¢¥ê«˜:E™Ú‘ÖVHÀC]&ç­¶¼xÊ@¶%74ôìþã,sÛØÊ4:Kmd±…½35Ì?V`;Þ ççOú–b®—\ó—L¾ðu:®@ _’ùØZlÎóbâ’ÒXë‹÷ ì?==y9rßßÕÂ×/ æÖœÁ…YXëä{8ÌJR>t€Ýn÷ãÇý~_~h1q1\æz· õ«üèp8ˆœN'[Û Gî5:½\O1£‰^¬¡Ôfµ»a¶âq­áìK³iN÷ãÇ——Ys]®' Ý—“^TÅÊ5çùøøø÷ßå1jýžõiS­<ÜΪ[éB¾„+¤1ëýÓ­.~\ëw+‹+éC§_Ûâ-¥| '½8€½ÿýý]ÀVÀí §x³ ì!¹DžŒÄƒ;ZÎöݰ’Õ GºG(×ÑÝ?lly—z¢‹•Ë ‘èyWtju =[•æï%ÈÕ}KMtŸ+Ñêˆãü¨ÎãZI@§ã?瞟Ÿms÷ííML\rý··7±o¹-yˆÜ~{{¯ÐØ 5ƒÎþú©Åíñì=‰3 ~n ð€¾›Çõe.=dÕŽÇã§(Ä)àŒØýûûû¯_¿´¨‹—C]`@±Q;äÌ~{ÒK0U+~pѦU Ζº/iìQ™p:¶Û­-‚ßÞÞº××W›ñÿúõK*Úþùçíííßÿ•ƒÿp8üúõK _¹ÓÖ6×·/•휓;mU¨Ž}õ%£Í¶-ùûû¦@ø×f³Q“ÓðññÑI2ó÷ß‹Ñÿïÿ;?þ|WÐðþþ¾Ùlæ·®l»º4Ÿ}Ë’Lí¤lšP+Ô™L`n‚ŸóV? ýk\Ùçøÿ%ˆí(àùIEND®B`‚opensurgsim-0.7.0/SurgSim/Testing/Data/Textures/CheckerBoard.png000066400000000000000000000076511277777236100246510ustar00rootroot00000000000000‰PNG  IHDRôxÔúsRGB®ÎébKGDÿÿÿ ½§“ pHYs  ÒÝ~ütIMEÝ ²jÒ)IDATxÚíÝ1ªI…Ѫ¡=´-Dë×B´&«¡=A1覾¾¾¾¾~]ß3€0À€ñï¸Ç©¯¯¯¯¯ß×·€Í€™‰zÏY_____¿¯o‹Ýçœ79è=g}}}}}ý¾¾ ,à=g}}}}}ý¾¾ lÞ¤ÝÃÔ×××××ïëÛÀb0ÀÐ"¾Dè§¾¾¾¾¾~_ß6ožç‰zÏY_____¿¯o‹Ý3ó&½ç¬¯¯¯¯¯ß×·€Åâo¼ç¬¯¯¯¯¯ß×·€Í€ø {˜úúúúúúu}XÌÀ`ZĿ৾¾¾¾¾~_ß6of&:è=g}}}}}ý¾¾ ,vŸsÞä ÷œõõõõõõûú6°Xü €÷œõõõõõõûú6°ytS_____¿¯o‹À` @‹ø¡{œúúúúúú}}ؼxž':è=g}}}}}ý¾¾ ,vÏÌ›ôž³¾¾¾¾¾~_ß‹¿ðž³¾¾¾¾¾~_ß6oâƒîaêëëëëë×õm`1` €hÿ€{œúúúúúú}}ؼ˜™è ÷œõõõõõõûú6°Ø}Îy“ƒÞsÖ×××××ïëÛÀbñ7ÞsÖ×××××ïëÛÀæ @zÐ=L}}}}}ý¾¾ ,f` €0-âK„îqêëëëëë÷õm`óàyžè ÷œõõõõõõûú6°Ø=3orÐ{Îúúúúúú}}X,þÀ{Îúúúúúú}}ؼˆº‡©¯¯¯¯¯_×·€Å ` €0 Eü;îqêëëëëë÷õm`ó`f¢ƒÞsÖ×××××ïëÛÀb÷9çMzÏY_____¿¯o‹ÅßxÏY_____¿¯o›7éA÷0õõõõõõûú6°˜ €0À´ˆ/ºÇ©¯¯¯¯¯ß×·€Í€çy¢ƒÞsÖ×××××ïëÛÀb÷̼ÉAï9ëëëëëë÷õm`±øï9ëëëëëë÷õm`ó >覾¾¾¾¾~]ß3€0À€ñï¸Ç©¯¯¯¯¯ß×·€Í€™‰zÏY_____¿¯o‹Ýçœ79è=g}}}}}ý¾¾ ,à=g}}}}}ý¾¾ lÞ¤ÝÃÔ×××××ïëÛÀb0ÀÐ"¾Dè§¾¾¾¾¾~_ß6ožç‰zÏY_____¿¯o‹Ý3ó&½ç¬¯¯¯¯¯ß×·€Åâo¼ç¬¯¯¯¯¯ß×·€Í€ø {˜úúúúúúu}XÌÀ`ZĿ৾¾¾¾¾~_ß6of&:è=g}}}}}ý¾¾ ,vŸsÞä ÷œõõõõõõûú6°Xü €÷œõõõõõõûú6°ytS_____¿¯o‹À` @‹ø¡{œúúúúúú}}ؼxž':è=g}}}}}ý¾¾ ,vÏÌ›ôž³¾¾¾¾¾~_ß‹¿ðž³¾¾¾¾¾~_ß6oâƒîaêëëëëë×õm`1` €hÿ€{œúúúúúú}}ؼ˜™è ÷œõõõõõõûú6°Ø}Îy“ƒÞsÖ×××××ïëÛÀbñ7ÞsÖ×××××ïëÛÀæ @zÐ=L}}}}}ý¾¾ ,f` €0-âK„îqêëëëëë÷õm`óàyžè ÷œõõõõõõûú6°Ø=3orÐ{Îúúúúúú}}X,þÀ{Îúúúúúú}}ؼˆº‡©¯¯¯¯¯_×·€Å ` €0 Eü;îqêëëëëë÷õm`ó`f¢ƒÞsÖ×××××ïëÛÀb÷9çMzÏY_____¿¯o‹ÅßxÏY_____¿¯o›7éA÷0õõõõõõûú6°˜ €0À´ˆ/ºÇ©¯¯¯¯¯ß×·€Í€çy¢ƒÞsÖ×××××ïëÛÀb÷̼ÉAï9ëëëëëë÷õm`±øï9ëëëëëë÷õm`ó >覾¾¾¾¾~]ß3€0À€ñï¸Ç©¯¯¯¯¯ß×·€Í€™‰zÏY_____¿¯o‹Ýçœ79è=g}}}}}ý¾¾ ,à=g}}}}}ý¾¾ lÞ¤ÝÃÔ×××××ïëÛÀb0ÀÐ"¾Dè§¾¾¾¾¾~_ß6ožç‰zÏY_____¿¯o‹Ý3ó&½ç¬¯¯¯¯¯ß×·€Åâo¼ç¬¯¯¯¯¯ß×·€Í€ø {˜úúúúúúu}XÌÀ`ZĿ৾¾¾¾¾~_ß6of&:è=g}}}}}ý¾¾ ,vŸsÞä ÷œõõõõõõûú6°Xü €÷œõõõõõõûú6°ytS_____¿¯o‹À` @‹ø¡{œúúúúúú}}ؼxž':è=g}}}}}ý¾¾ ,vÏÌ›ôž³¾¾¾¾¾~_ß‹¿ðž³¾¾¾¾¾~_ß6oâƒîaêëëëëë×õm`1` €hÿ€{œúúúúúú}}ؼ˜™è ÷œõõõõõõûú6°Ø}Îy“ƒÞsÖ×××××ïëÛÀbñ7ÞsÖ×××××ïëÛÀæ @zÐ=L}}}}}ý¾¾ ,f` €0-âK„îqêëëëëë÷õm`óàyžè ÷œõõõõõõûú6°Ø=3orÐ{Îúúúúúú}}X,þÀ{Îúúúúúú}}ؼˆº‡©¯¯¯¯¯_×·€Å ` €0 Eü;îqêëëëëë÷õm`ó`f¢ƒÞsÖ×××××ïëÛÀb÷9çMzÏY_____¿¯o‹ÅßxÏY_____¿¯o›7éA÷0õõõõõõûú6°˜ €0À´ˆ/ºÇ©¯¯¯¯¯ß×·€Í€çy¢ƒÞsÖ×××××ïëÛÀb÷̼ÉAï9ëëëëëë÷õm`±øï9ëëëëëë÷õm`ó >覾¾¾¾¾~]ß3€0À€ñï¸Ç©¯¯¯¯¯ß×·€Í€™‰zÏY_____¿¯o‹Ýçœ79è=g}}}}}ý¾¾ ,à=g}}}}}ý¾¾ lÞ¤ÝÃÔ×××××ïëÛÀb0ÀÐ"¾Dè§¾¾¾¾¾~_ß6ožç‰zÏY_____¿¯o‹Ý3ó&½ç¬¯¯¯¯¯ß×·€Åâo¼ç¬¯¯¯¯¯ß×·€Í€ø {˜úúúúúúu}XÌÀ`ZĿ৾¾¾¾¾~_ß6of&:è=g}}}}}ý¾¾ ,vŸsÞä ÷œõõõõõõûú6°Xü €÷œõõõõõõûú6°ytS_____¿¯o‹À` €0Àü›þ uYò¯2IEND®B`‚opensurgsim-0.7.0/SurgSim/Testing/Data/Textures/CubeMap_axes.png000066400000000000000000000476101277777236100246700ustar00rootroot00000000000000‰PNG  IHDRV&> CiCCPICC profilexÚSwX“÷>ß÷eVBØð±—l"#¬ÈY¢’a„@Å…ˆ VœHUÄ‚Õ Hˆâ (¸gAŠˆZ‹U\8îܧµ}zïííû×û¼çœçüÎyÏ€&‘æ¢j9R…<:ØOHÄɽ€Hà æËÂgÅðyx~t°?ü¯opÕ.$ÇáÿƒºP&W ‘à"ç RÈ.TÈȰS³d ”ly|B"ª ìôI>Ø©“ÜØ¢©™(G$@»`UR,À ¬@".À®€Y¶2G€½vŽX@`€™B,Ì 8CÍ L 0Ò¿à©_p…¸HÀ˕͗KÒ3¸•Ðwòðàâ!âÂl±Ba)f ä"œ—›#HçLÎ ùÑÁþ8?çæäáæfçlïôÅ¢þkðo">!ñßþ¼ŒNÏïÚ_ååÖpǰu¿k©[ÚVhßù]3Û  Z Ðzù‹y8ü@ž¡PÈ< í%b¡½0ã‹>ÿ3áoà‹~öü@þÛzðqš@™­À£ƒýqanv®RŽçËB1n÷ç#þÇ…ýŽ)Ñâ4±\,ŠñX‰¸P"MÇy¹R‘D!É•âé2ñ–ý “w ¬†OÀN¶µËlÀ~î‹XÒv@~ó-Œ ‘g42y÷“¿ù@+Í—¤ã¼è\¨”LÆD *°A Á¬ÀœÁ¼ÀaD@ $À<Bä€ ¡–ATÀ:ص° šá´Á18 çà\ëp`žÂ¼† AÈa!:ˆbŽØ"ΙŽ"aH4’€¤ éˆQ"ÅÈr¤©Bj‘]H#ò-r9\@úÛÈ 2ŠüмG1”²QÔu@¹¨ŠÆ sÑt4]€–¢kÑ´=€¶¢§ÑKèut}ŠŽc€Ñ1fŒÙa\Œ‡E`‰X&ÇcåX5V5cX7vÀžaï$‹€ì^„Âl‚GXLXC¨%ì#´ºW ƒ„1Â'"“¨O´%zùÄxb:±XF¬&î!!ž%^'_“H$É’äN !%2I IkHÛH-¤S¤>ÒiœL&ëmÉÞä²€¬ —‘·O’ûÉÃä·:ňâL ¢$R¤”J5e?奟2B™ ªQÍ©žÔªˆ:ŸZIm vP/S‡©4uš%Í›Cˤ-£ÕКigi÷h/étº ݃E—ЗÒkèéçéƒôw † ƒÇHb(k{§·/™L¦Ó—™ÈT0×2™g˜˜oUX*ö*|‘Ê•:•V•~•çªTUsU?Õyª T«U«^V}¦FU³Pã© Ô«Õ©U»©6®ÎRwRPÏQ_£¾_ý‚úc ²†…F †H£Tc·Æ!Æ2eñXBÖrVë,k˜Mb[²ùìLvûv/{LSCsªf¬f‘fæqÍƱàð9ÙœJÎ!Î Î{--?-±Öj­f­~­7ÚzÚ¾ÚbírííëÚïup@,õ:m:÷u º6ºQº…ºÛuÏê>Ócëyé õÊõéÝÑGõmô£õêïÖïÑ7046l18cðÌcèk˜i¸Ñð„á¨Ëhº‘Äh£ÑI£'¸&î‡gã5x>f¬ob¬4ÞeÜkVyVõV׬IÖ\ë,ëmÖWlPW› ›:›Ë¶¨­›­Äv›mßâ)Ò)õSnÚ1ìüì ìšìí9öaö%ömöÏÌÖ;t;|rtuÌvlp¼ë¤á4éĩÃéWgg¡só5¦KË—v—Sm§Š§nŸzË•åîºÒµÓõ£›»›Ü­ÙmÔÝÌ=Å}«ûM.›É]Ã=ïAôð÷XâqÌã§›§Âóç/^v^Y^û½O³œ&žÖ0mÈÛÄ[à½Ë{`:>=eúÎé>Æ>ŸzŸ‡¾¦¾"ß=¾#~Ö~™~üžû;úËýø¿áyòñN`Áå½³k™¥5»/ >B Yr“oÀòùc3Üg,šÑÊZú0Ì&LÖކÏß~o¦ùLé̶ˆàGlˆ¸i™ù})*2ª.êQ´Stqt÷,Ö¬äYûg½Žñ©Œ¹;Ûj¶rvg¬jlRlc웸€¸ª¸x‡øEñ—t$ í‰äÄØÄ=‰ãsçlš3œäšT–tc®åÜ¢¹æéÎËžwç|þü/÷„óû€9%bKGDÿÿÿ ½§“ pHYs  ÒÝ~ütIMEÝ,Á5±8 IDATxÚìÝw˜eÙ?üswÓ!@€$4Ó7 HDÐGiJQi>)iJIè$@ %ÐBÐ;PTšBPD„ôM—’BH $¤ìîýþñüàE!dw¯¹7ÙÌçs󇑽fî™kfÏïœsÏ–DD!€|röC~•ØW¥v€€€€€      €€€€€€     €€€€€€     €€€€€     PG/ìùBJ IKuiuô×k­~ŽÞc{GuiuògyaÏL @`ý5hÈ ä1J %qáå®ÕÏqÑeEI¡$yœ— 4)€õ^IDìÈ)g?ñ§ïý)öúó^IcT—VGω=cJ·)õ¾ý=&õˆñÛÒêÒäýðý翟¯ È%€œË¢ PZ]†X+Ûáå&ÿY퀆’ÿÝ„¼röóÿ<·÷sÉw¿+UFש]cfÇ™õ¶Ý§wŽ)ݦDYUYòçßçÙ}òW¹¤@&w¿U6Š ®¸ ^·»ÿ°þÉÅVŸ !å÷!¯œý|Î3û>“||e“•ÑiF§xgëwо½íæ´‹i]¦EãU“?÷~Oï—Ï È%""›»àMV6‰ó†ŸW/Û{þ•ç'ÿY}n€†–ÿÝ„¼röó_þðÃ?Äþøƒ¤1>iþIt˜Õ!æ·™_´íÜò½-cF§Ñly³äÏû£ßÿ(¿K:|fðàÁÉc4ÿ¤yœ}ÍÙEÝÎs¯:7¹øÏêó4Äüï 䕳Ÿ/ñÔþO%ß_ÒrI´ŸÝ>µZ”ùöµ^Ð:fu˜-–µHþœ9U6Jg×WvWwyõ³ÿ½÷s{dzû<›4fe£Êè6¥[Ìè4Ãd\Sä’µ6½óô¸÷Ø{“Çùïgý/¾ôâä1ï9îÅ?Àò¿{€WÎþâìÖt"":ÌêS»NÆ«'í«ÞÜ!Æõ»½´Û—~' 6V5^]§vYf™ˆ5©€\Ò Nfu˜wÿìî´´PòÙ3ÿY<û×ñw)þjÿÝ„¼rög·æ¤Ñ~vû¨(¯HêT—VGŸ;û$‡‰•MVFyEyÌi7Ç$¬iä’u6»ý츳Ïi¿ˆªK㎟ߑ¼-wö¹SñPÃüï 䕳¿8»5G€ˆˆvsÚEEyE4YÙd­mÃÊ&+£Ë´.ñï¯ýÛ¬Mä’Iæ´›“Éü·Ÿp»â ùß=@È+gqvkÎ:Û¼½MLë2-š®hZïë^ÑtEtžÞ9ÞÙú“¯¶K:${{›·ã¶o[+ëuÒ(Å?@-ó¿{€WÎþâìÖv""¶zw«˜Þyz4[Þ¬ÞÖ¹¼Ùòè<½s¼»Õ»&^]* —tÈÄ»[½£NU¯ë¼õä[ÿuÈÿîB^åðì¯ëÝùõæ¢_ä.Öïm3:ͨ—.À'Í?‰N3:ÅÜ-æ:—ëZ¹¤@fÞÛò½¸å”[êe]·œr‹â Žù_òJ ýzøžAÛymcF§ÑbY‹¢­cY‹eÑiF§˜×vžó8¥rI€LÍk;/nþÅÍE]ǯ~ù+Å?@Bþ×€¼ÒÈßE¿žÞ4Ôf~›˜ÙqfQºK7XgvŒ­8‡S+ —tÈÜü6óã¦So*ÊØ7z“â 1ÿë@^éäï¢_k õ‚Ö1³ãÌØ`é™ùñ†GÇ™ãýÍßwþfQ¹¤@Q,h½ n<íÆLǼñ´ÿäÈ+€ü]ôëù¯ o¶p³˜Ùqf´\Ò2y¬%-—DÇ™cáf »YU@.éP4 7[7œ~C&cØôçm– € ¬«û}mm»¬o<°>jdyR‘Ôõq¸Pt@@@@@@`ýÖÈ.ÈVI¡ÄN`¥ Ð0”DDÁn€œröC¾+ —t@@@@@@@@@@@@@@@@@@@@@@@hxE¡`/@^•ØWÈ-@@@@@@@@@@@@@@@@@@@@2öÃ?ü!J …:/eUUñÆŽ;Öûv¿¾ÓNQZ]´í?üÃòí?øAJJ’–s®¾z­lû¹W]•¼íüÁLrçڳΊƫVÕùç«KK£ßˆõ¾ÝýFŒˆBII¾ñªUqÝ™gæò˜—D¡P0õ‰ˆè1iRŒëÕ+UVÖyŒÅ›låñþæ›×Ûv·^° *ÊËcã?¬ó•E¯qãbRy»Àj ù˜ %%ùü5Xpàsμîºѯ_Ò~x6zt½lï¯ò“8âᇓD^€Ÿ™Ô£GÜü‹_$±ÉâÅ1dРzÝîK/¾8©øˆ¸å”SòWüÀÿ3hÈØüý÷“Æ8oøðXÑ´iÑ·uy³fqþ•W&±ùûïÇ !Cr{¼þÃàÁƒãƒM7Mã¤Q£¢çĉõ²½Û'Ü~{Ò‹ZµÊõE6Y¼8.»è¢¤1fuèמuVÑ·õêsΉÙíÛ'qÉÀ±ÉâŹ=Þâ N»ñƸáôÓ“Æxz¿ýâücÑ·õÙ}ö‰½Ÿ{.iŒ~#FÄõ}ûæõ «å õüøºð_ªKKcÇ7Þˆ±½{×yŒ–K–ÄÔ®]c‹¹s‹²ïnµUt:5–n°AÇØþ­·â__ÿz”UUåöXëð·œrJLìÙ3iŒýž~:ö}晢nçþO=•\üOéÖ-n:õT€Ü+­®N¾!¶¤e˸ðòË‹¶ý‡ K*þ#"Fôë—ëâ?B€ÕØ÷™gâéýöKc¶ÛFï±c£ª¬,óíkTYã·Û.ºM™’"~ÿ£åù «¥°ž_Vã°Ñ£ãÑCM ÿüÆ7âëÿúW¦ÛõÚÎ;Ç.¯¾šô柃<~ûã {¦9_æ™}÷M.Œ·0!N5ª(ÛwêM7%ÿÏî³O¾‹øWŸsN4[¾¼Î?_]Zg^w]æÛÕ÷ú듊ÿ¦+VÄÕçœã |•³¯¹&V5nœ4ÆAƒ’ßÐóß6ýàƒä/íV••ÅY×^ë Ài?{vòßõ³ûîñØ!‡d¶Mydüý[ßJ£ßˆÑyútXà«dñ||ë â¢Ë.Ët» ­-JãÖ“OŽ Ûnë À—¸àŠ+bëwÞI#«×‚~Ò¼yòk?ÛΛWÔï&¬W† ”üG½N¿á†è4cF&ÛÓmÊ”øå¯~•4ÆâM6‰—\âàÀjl°ti\yþùIcÌèÔ)ù‹ED\uî¹ñï¯}-iŒ¡DË%KX€šË©Û4]±"†Ÿw^&ÛsÍÙg'ý¥âˆÿ{÷ïÂÍ6spà+ýÀñ­¿ÿ=¹ðžß¦Mþím¶I";¾ñFüìî»ÐÏñ Ö¨¬ª*ÞÜa‡Ønüø¤qv{饸Ëw¿[çŸßû¹çâÙ}öIÚ†©]»ÆvãÇ'·a=ºÀjy Ðz~|]¨,Þ¼sÂí·Çm'žX§Ÿýéý÷ÇGôþòÝïÆwþúWóstX£¬¾0{Ý™gFIófYUU&]𜫯Vü@ íüÚkqì½÷&qgŸ>uúãb¯î²KÚ\,Y.'ßrKòÄ»÷˜cj´®ßüøÇÉë:ûê«7@hàK¿~×e:ûO=õFóÔÄê°|ïùç“ξ>üð+o$ÎùÚ× Í—-KZÇ®ÿ{¡º¤Ä\,Y.e••…qÛoŸ4ñªKJ ßxíµ¯\Ïî/¾˜<Á+ºt)4Y±Âq€¼të6¹°lYóÌfþþðûÕ@¨ãòÖvÛÊ*+“Γn½uµãùàƒIc—TW^ÙeóP°cÙëOJž|/}÷»«¿´ªªðÆ×¿ž¼ŽƒÜñ€¼”•U^}õ›™Íúùó[Ú¶kߺ Ë©7ÞX”‰/ë[Égù1÷Þk –b.¿=øàä xèèÑ_:vŸ;îHûO{íå8 @_.ºèÒLgýþ¸ðÎV[™ƒ€¥˜K_Ðѱc¡éòåÿ1î†K–ÞÝrˤq+ËÊ ½ÆŽuœ /;ìð¯ÂÊ•3›ñ7ß|Šý*-7œvZòYùøA}6Þ=Ç›<Þe^hþ –úXjòmþ5-ç]yåŒyù€ÉcÞzÒIŽ 4à¥I“…qã¶Ïl¶OšÔ½Ð¢ÅRûV2Z*ËÊ ÛŽŸtf–OZXÙ¸qáã 6(lõÎ;IcµŸ5«ðI³fæ_ —’ÿ»@ÝlôÑGQQ^mæÏ¯ón¼q”WTĂ֭£Ýœ91¥[·h¶|yÇûh£¢¼¢"æ·iã­‰?‚Z¤?¯R·[Rârü©aÃúÇ\‘ÉX«V5Ž]w}%ÞxcG;öóóÔ x—Ö:”V)ñvmyþûß½Ÿ{.iŒ«Ï9'o²I\vÑEIãõò·¿ÿó·¿Õ˺~wÐAqàO˜lu¤@æÅø€¡Cëu—_x¡â¨Í6[£F”ÙxÆõWüÃZòí—_Ž£|°èëùþóÏ+þSCª™§ÊêêxmçcÇ7Þ(úºftê='N\kß=X®@Íýú×?‰Ã$“±þñoÆÿüÏߢ²²‘IX“yêP¼KkN;oo³Mt›2%–µhQ”ñ˪ªblïÞ±í„ &ZJ­fµ,^ ZSç ®ø‡êˆ#άø_ºtƒ8úèÿ°–móöÛqÁWmüSn¹EñŸEHÕ XŠýg¹_Úm·Ø}Ì;:í @è¬Ù–[¾ãÇo›núA&ãpÂíqÇ?7ùj3O]ŠwiÍq "by³fÑ}òä˜Ý¾}¦ã¶Z´(*ÊËc³… M²D:ÍyÇÇòfÍŠ2v}v€ìÝ~û ™ÿ¿ýíÿ°i¶|y\uî¹™;xð`Å¿ÀºnV‡qíYgeì{Ž;.ÞØqG; N¸=~øÃ?d2Ö{ïm'žx› ë˜ÃFŽÝ^z)³ñzLš¿üÕ¯ìØŒxˆ¢Úðãcj×®±å{ïe6æÇnåõþ×Ó+Eà ÕëÐaVŒ×+Z¶\’É~Þwßgâ¹çö6éê²ÿ\ŠwiÍù#@Ÿzs‡b§×_êÒôûÍOï·_ìûÌ3&WFt(ª7Ü0óׂëß_ñ ±(*)Ä]wŸIñqýõ}ÿ°ÛáÍ7ãø»îJg¿§ŸVüg}=֠蓬Pˆ|ó›™ü…ÀY:DI“ŠöÝ‚^(€/×·ïõ1bD6-ü­·¶w~-V¬ð°:ÏÓ_JrXú¬­Ãwÿò—øëw¾“4F·)Sâ­í·Æ«V9q3¢@½\tξæšLÆ0t¨â nݦİaý3kùòfqÔQ*þa÷àQG%ÿSºu‹‘gœa‡ 44ÛŸÉ8ÞýKr -”}Y·-EYYUÜsÏqѼù'™ŒwÁWÄøñ̰ۙ[ºÁqÞðá™wÉÀ1¯m[;VX …CIÉ:µ4­-ŠKÌd¬³¯¹&ÚÏžm2BrÁWÄ.»¼šÉXÏ>»OŒéN ¬ë†ïl½ufã}´ÑF™§0Ï| –`:x äÐ<ãŒ8ý†2ïÑC-êËÙ çq!ß_|¨ïïôî=6þñoF“&+“ÇzÿýÍ£W¯qñÞ{[:w³8|@ S$3:uŠž'ÆŠ¦M3?nY}§0ït(ªž'Æ/n¾9Ó1}ôÑLß- G“&+ãÞ{ͤøˆ8ñÄÛÿМuíµ™ÿŸ†˜¾×_o ¬ë®;óÌhTY™ù¸×÷í¥ÕÕv0¬Ã½zËd¬Ûn;1ü`;ÖqÏí½wüî ƒŠ6þËßþvñDQ/'·x¢‰™vÈßyì zYÏ®»¾ýëw¢¬¬*y¬ŠŠòøú×ÿK—nàœÍò\ð&c•E¯qãbRE]ÏÖï¼Sºu‹ –.u"בEÑdåʸæì³‹ºŽË.º(6þðC;Ö1Í›÷Üs\&Åee£8úèÿÐÜxÚiE/þ#"ÞÙzë:`€.°®é7bDt™6­¨ëh3~\|é¥v6¬c®¼òüèÚuj&c <8^{mg;Öq Z·ŽÁƒ×Ûú®9ûì˜Ñ©“_GªÕÌsçÆÔ®]£å’%E_תÆcÛ ¢¢¼Ü­Û ç±G€Š:þž{¾úÓ÷2YÏ_þòÝØc£ºÚ½ª¢œ RÃdèÄÛn‹ÛO8¡^?ÓÁ?¿ýñÌuàªJæ†õï_/ÅDDãU«âڳβÓaв咸ë®ã3)þ?üpã8æ˜ûÿм¾ÓNqgŸ>õ¾ÞÇ>8þô½ï9kÛ7þùÏ8îž{êuû?õTìóì³v>¬e#Fô‹öí³ùC}§žzSÌžÝÞN…àŒ‘#£ºtí””}¯¿>*5rÖ¦ëûö]+­Õb½n¨aßÿ©èÓçÎLÆzè¡#ã¼æâ)””uY_¶©&îÿéOãåo{­Ë Ûn7ÿâ&u-ù@-OÎuêà­c‡îèˆûúÓµ¶8h¥ø IDATþ¾×_#Ï8ÃD­Ý ç±ïd>æf›-Œñã·‹-¶˜›<Öœ9í¢wï±±xñ&ÎÏbŸ Qb'¬C¿Ÿ×µ£&>ÞpÃè6eJ¼»ÕVu¿~,\+š67ܰÎc´Z´(*ÊËc³… M¾Ò -–-‹+.¸`­nÃàÁƒü°üêW¿Ì¤ø¯®.c޹Oñ Äå^˜TüGD\zñÅ1`èФ1µj]v™R»ÈY(Xj¶"Ö©e]Ú7—^tQòç©*-Mã¦_þÒ\­Í–b,u=" ñ³þä'g6#‡íoþÔç<µÖ©ßÏ í3NëܹÐtùò¤³~»·Þ*T–•–7mZè8cFÒXe••…7{÷6ÿj¸x¨·çÖ•G€ÚÏž“»wfË—×yŒ•MšÄQ>~x”VW×yœª²²ØáÍ7cüvÛ™°5šDvAqî«ÔmÇÖ×_éÍÊ[Ì ¶M7ý y¬×_ß)¾õ­¿ÇªUM úš§.ëÔïç†öÐO<Op@ÒÏí½w|ÿùç#"â±C‰C}4i¼ÝÇŒ‰÷ØÃ¬‘ìêsÎI*þ#"FžqFúÅ?4Ïì»orñàO|VüGDòØc±û˜1IcŽÙ}÷}ØaPÍ"§Ç <T÷e^Hþó[·.l¼xq! …BÛ¹s µl™<æA?nÎzÈ#@E\~þóÛ3›‰'Ÿ|‹yã 5϶²qãB÷I“’ÎúÆ+W¦–—aì7{÷.”VU%Ýnöì²æÍÍÃ5,:µlé­KËZoUWLj~ý’ÇxÉ%ñáÆGDļ¶mãò /̤+ÑdåJ“Š }ûÙqíµÙü¾'ž80n½õd;ˆN?=&wïž4Æ#GFyEÅþ½÷رqÂí·'=§]»~ÞyÔšjZß ®N¹å–äwïŽßn»ØáÍ7£ª¬ì³kºbELìÙ3:͘‘4öùW^é"°æ+E°> ¤¤úÓ÷bÏ=_HkîÜ-¢W¯q±`Ak“fmÌS€â'ëéwæ·i]§Nýì¦]]´^° *ÊËcã?üÒÿAëÖQ^Q‘´ŽæŸ|“»wvs昌«¡@l²xq\zñÅÉãœuíµÿQüGD¬hÚ4Î>ÞpÃè:uj¼·å–u£ÉÊ•1±gÏè<}z­~nbÏžÑ{ìØ¨lÔ¨ÎëÞüý÷£¢¼<6Y¼ØÄüju_{Vú/îÁƒרøˆ˜»Å1¬ÿäu?ï¼hþÉ'"Ôö¼o²2î½÷ØLŠÿçŸÿ~\w?Ô É¥_œTüGDô1¢ÖÅDDωã”[nIZ÷û›oƒ† q ¿9}ÒR³åÜáÓ¿t2©{÷B£U«jµÞ¦Ë—ft옼îC†8޾ìKÀµ\.¿|@&³máÂM [oý¶ùáKÀ¾Ü€¾\Ñ¥K¡ÉŠIg›yó n´Q·aᦛ6]¸0i­ZU˜Ð³§¹ùù9ª²Ôdi;wnÒ üéòÃßÿ¾Në?tôèäu/mÑ¢°Í¿ÿíx @ —]vy¥PYY–Él;äGÍ @h`àGO=•|ößv ÉÛqÃi§%oÇÞÏ>kn –Ú.wôé“<ÙžÙgŸµþ:¯Ž:Êñ€,Í›/+LžÜ-“™vçÇ›€ÐÀÀ~ðƒä³‡ý«PUZš¼-«5*ôœ0!y{?è óÓk@©©ßx#^Ûyç¤×hU••Eï±cc¶ۮÕ툈øöË/Çß¿õ-6—€‹ödeÃÿðˆý¢oßëós*”äïW¡/q>5ð/×äUÝ5ñâ{ÄîcÆd²MÏî³OìûÌ3Ictž>=&l»m4]±"÷sÔ—€Y£ëûöM.ºGtRRññÆŽ;Æ=Ç—Éç)‘{á+qÆH;rü{?µø?ä±Ç2+þ#"öyöÙØÿ©§’Ƙ޹s&/3Y/Bª_åȇŠ:*iŒ7Þ8ºL›ïo¾yòöl1wnT”—džœ4ÎÏî¾;“0±\(‚õ¡P×ÏÐ`O²œO ¸0w‹-¢Û”)ñÑFÕyŒ¦+VĤ=¢ãÌ™™n[Eyyl;aB¬jܸÎcløñÇ1¥[·ØêÝws=GuX­˖ŕ矟<Î¥_œIñÿé…)‹×‚ëß?9DÀú¦ÿ°aIÅDÄ™×]—yñQ^QgŒLëN~¼á†qþ•W ©:¬ÎAƒbà%—$1­K—Øv„XÙ¤IfÛÕlùò˜Ô£Gt˜5+9 :4ïWŠ@ ž :d9ŸhàßüfìúÊ+IÛ’Õð\7Þ8Ê+*bAëÖIÇçåo;v}å•ÜÎQ¾T»9sâÜ«®JçÜ«®Ê´øˆXÞ¬Y&éý¬k¯-Ê hp°¤$N¿á†ä rù…­øˆØøÃ㲋.Jþ¬gŒ¹Îþõe€µæêsÎIþ˹/ì¹g<~ðÁEÙ¾G?<þúï$ÑtÅŠ¸úœsl2/¦k»¬m÷w\üã›ßLcÇ7ÞˆŸÝ}wÑ·õ„ÛoÞcÇ&ñÚÎ;ÇÝ?ûYnç¨G€ø‚Ý^z)Æì¾{ÒÕ¥¥±ãoÄØÞ½‹¶;½þz¼¶óÎÉoôÙëÏŽöÜ3¯WŠñËß#@ ïTð9¶¤eËè:ujÌÝb‹¤q^Úm·øî_þR/Û“Åk""†P/ÅDÄ{[nW\pAò8—^|ql²x±I@fÅd]€úvæu×%ÿÿ÷Rú.þ#":Μg]{mÒ«7Ž3¯».¿§tøÔµg•|ÌêÐ!ºOžœ”ÆërçaJ·nÑnΜ¤qFôë—¿‹€€¬†@ޱ ä–@DDt›2%ÞÚ~ûh¼jUÒ8‡?òHŒ>ì°zßþ#~8:òÈä»Û¿õVòŸ?X—yˆˆˆ¸îÌ3“‹ÿ¿~ç;k¥øˆxøˆ#âoÿó?Ic4^µ*®;óL“X¯é@¾¯ð¥trpŒ] ·Ù(ˆòÃ#@      €€€€€€     €€€€€      €€€€€      €Àz£$" väSÁé9.JìÈ)@@@@@@@@@@@@@@@@@@@@@ ®ö|aÏ()”$-¥Õ¥1®×¸µú9Æö¥Õ¥ÉŸeÏö4)€õ×AC’Ç(”âò /_«Ÿã²‹.‹BI!yœK^bRë½’ˆ(Ø O§?ñ½?}/þ¼×Ÿ“Æ(­.‰='F·)Ýê}û'õ˜Ûß.ªK«“÷Ãóß>G@‰É9¥sYtªK«c耡keû/¿ðòäâ?«ýÐ0nè@né𩽟Û;ùîw£ÊF1µëÔè8³c½m÷ôÎÓ£Û”nQUV•üùŸÝçÙœ:W:dr÷»²Qe\qÁõºÝÃúK.þ³úü ç€ä–Ÿ·ï3û&ßo²²IÌè4#¶~gë¢oïœvs¢Ë´.±ªñªäÏýô~Oç°Ð€¼Ò "²¹ ¾²ÉÊ~ÞðzÙÞ+Ï¿2¹øÏês4¬:[:ü·þá‡ñÇü1iŒæŸ4YfE›ùmжïmù^tšÑ)–7[žüyÿ£ßç´Ð€¼Òà3ƒNã“æŸÄ5g_SÔí¼êÜ«’‹ÿ¬>/@û ¹¥À—Ùÿ©ý“\Ò2f·Ÿ­µÊ|û´^fuˆe-–%Î'x2Ç€ä•ÿ!‹»âKZ.‰ëû^_”í»ö¬k“‹ÿ¬>'@ü ¹¥ÀêøÄÉwÇ[-j³ÛÏŽ–KZf¶]‹Z-г:ÄG}”üù~wÐïr^è@^éðY¼gQ«EqÓ©7eº]#Ï™\ü—J¼ùÈù È-¾ÊûãxüàÇ“Æh3¿MÌì83Z,k‘¼=KZ.‰ö³ÛÇ¢V‹’?×oþ÷7 È-¾ÔàÁƒ£¤V$Îo3?F4*“í¹éÔ›’‹ÿ’BI 2ÈÁr~@rK€59ä±C’ï–oýÎÖ1½óôhº¢iÇXÖbYt˜Õ!´^üy=ôQ6t ÏtX­AC%wÞÙú¸ëø»’Ƹõä[“‹wÿ>½ ¹¥@M6ú°ä»æfuˆŠòŠhTÙ¨Ö?»¢éŠè4£S¼»Õ»ÉŸã‘Ãq@?+t ¯tøJƒŽÒê´_³:ÌŠûz~öŽŸß‘\ü—V—zï?€@Ml;aÛ8lôaÉã\qÁQ]Z]«ŸYÕxU ?oxòºäðè9±§ƒ P/˜Ü˜ÒmJŒ>lt­~æ¾cî‹Ùíg§ý¢«.— tjªçÄžñ“_ÿ$yœ¡†F¡¤fß=©*«Šaý‡%¯óˆ‡ˆ“z8ˆµ‘E`\¯qñÄOÔè¿}øˆ‡cZ—iIë+«*s÷@ .ºOîG>tdò8—_xùÿ›BI!†š¼®#:2ºMéæà|Ž×€BŽy (µ5µëÔè9±gT•U%óô~OǾÏì»ÚÿÿÑCMþâqYUYLê1)Ê+ʸ/-¼òJ€ë:µkýÀÑÉ㬩 P“.ÁšüôþŸ*þ¾ô€ä–u1­Ë´è>¹{ràÅ=^ŒÝÇìþ…jÿ§â€'H»Qe£˜Ü}rtžÞÙ[m y¥@­t™Ö%޹ï˜äq.»è²Zý{msß1Š€ÕÞЀÜÒ ®¦wžÝ'wÊF•Iã¼²ë+±Ë«»|ö¿ŸÛû¹ØçÙ}’ÆlTÙ(¦t›ftr ¾²Ð€¼Ò Ö:OïÇÞ{lò8ÿý¬ÿ¥_š<æq÷§øøÊ:[:¤˜ÕaVtÚ5V5^U÷_B…’xs‡7£×¸^ñÒn/}éwj£ñªÆ1µëÔè0«ƒ´Æ@òJ€:é0«Cüì…Ð’ÂgÏügñìÿñw¯øXã È-RÍn?;Ê+Ê“º¥Õ¥qgŸ;“ÃD“•M¢¢¼"ÚÍiçÀԨЀ¼Ò ÎÚÏn}îì“4FuiuüüŽŸ'oKŸ;û(þjt@rK€,Ìi7'Ê+Êce“•kmš¬lÓºL‹¯ýûkH È+’´›Ó.“;ø)N¸ýÅ?@oè@né•··y;ºLë+š®¨÷u7]Ñ4¦wž[¿³µQ«@òJ€dÛ¼½MœxÛ‰keÝ':IñP«:[:déÝ­ÞÎÓ;ÇòfËëmÍ–7‹é§ÇVïnåԺЀ¼Ò [½»Uœ4ê¤z]çÉ·ž¬ø¨õ È-²öÞ–ïE§ê¥ Ðü“æ1£ÓŒØbîv| È+2³å{[Æ)·œR/ë:å–Sÿuº ¹¥P‹‹eaݺ[Z(Ywݼ¶ó¢ÓŒN±¬Å²¢­£Å²1£ÓŒh;¯­ÉYç@òJ€Lµ×6~qó/ŠºŽ_þê—Š€:ßЀÜÒ¨ÅÅR Væ·™gv,J`ƒ¥ÄÌŽ3£õ‚Ö&fR y¥@æÚÌo§ÞtjQÆ>õ¦SÿI7t ·tjq±Ô¨µ­DÇ™céK3sÃ7Œ™gÆæïonR&:W:Eë­ã´OËtÌÓn„È,7ô´iÓÞŽM²VEECìØ11zõúÚÆ^Ìà  ;½õÖObúô7“¬Õ¿ÿ±o߸¸öÚØX\€'@t»£G‡ÆÜ¹+’­WW7ßð ÈWs欎'&Yëᇳg¯±©É È0O€è «WωêêUIÖ:ôh´´”Æ AÇmlgO€@ºÚ¡C#¢¬¬9Nº"ÁÛ|ðƒ¸÷ÞßÛXt‚'@tSpDUÕÚ$ÃDÄüùu†€Kùn Ù= ûÔÕÍššeIÖ*-m‰ÆÆòèÓç+{©€€€®²ÿ¨?~o´¶–ä¼Vß¾_FccyŒó‰À%ð€.ÕÞ^••ë’ ÿ >oøä«… ŸÝ»oN²Ö}÷}O?½Ü¦äÀ È0O€:ñcYБgw—Çû¦¦±QQÑmmÅ9¯uõÕÿŠææ²:ô¨™äLÛÈ*7t‰¶¶â˜5k}’á?"bÕªjÃ?€ _-X° š›Ë’¬U]½*zè·6 O€ Ã<êÄ¥'@²k×-1iÒÇÑÞ^”óZ#GŒ½{ÇGÿþ_8ˆIÏ´=€¬r@R­­%QY¹Àì‘®IDAT.Éðß«××±aà Ã?€ _ÕÖ.Š®K²Ö‚ ¢¼¼Ñ¦$ä d˜'@ø±ôè¢lÝzWL™òQ’ÿ¾ÛoÿSlÛvgžu»äLÛ€@äàÔ©+¢´´%žóZW]õïhjÇvø˜'@$QS³,Éð±bÅ\Ã?@W}7Yn:ñcéà;mÞü@<øà¦$kMŸþfÔ×?æÐuù™¶ €¸ÇŠ1c>‰cdžä¼Ö°aG¢©il ð¹C'€.â 9yê©_$þ ÏÆoÌ4üòÕÛoO‹M²Vmí¢¸ãŽ?ÚT€.æ d˜'@ø±ôè[Ž7Üð·8qb`ÎkM˜°'vî¼5z÷>ã°uÛ™¶Un¸$ÕÕ«’ ÿýúŽ fþùjÍšÙ±yóIÖZºô™5j¿Mè&žA†yÔ‰KO€¾qøðð(+kŽ“'¯Ìy­©Sß‹wßý‘Ö#gÚ€\DxL™òQlÝzWÎk r,š›ËbðàÏl¬º‘'@\´W_—døˆX»¶ÊðРd–:ãÀëbܸ}ÑÚZ’óZóæ½Ë—?mS{rpp>ííE1iÒDZk×-9¯5zô§±gÏ„èÛ÷K+€à ´hQm’á¿OŸ¯¢¾þ1Ã?@O~7Yn¸ÍÍeQ^ÞmmÅ9¯µdɳñÌ3Kmj> n@ÎÕÖV ÑÔ46çµî¹çñá‡÷åÝÿRUYã çõÒK/&þ<¯¿þSÃ?@>|7Ynø.»wß'îˆöö¢œ×zçÇ#üÚ¦æÓà2Ë ßÒÚZ••ë’ ÿUUk ÿùô Ü@f¹à|jj–E]Ýü ý[ÈÞçp7 ß(,<›©¡X™ú·ˆ @€ ø¾êe 8WGGMøžr€ @€@€ @€ @€ @€ @ @€ @€ @€ @€ @ àòómÞCmHIEND®B`‚opensurgsim-0.7.0/SurgSim/Testing/Data/Textures/CubeMap_reflection_diffuse.png000066400000000000000000002256141277777236100275710ustar00rootroot00000000000000‰PNG  IHDRÙD©W CiCCPICC profilexÚSwX“÷>ß÷eVBØð±—l"#¬ÈY¢’a„@Å…ˆ VœHUÄ‚Õ Hˆâ (¸gAŠˆZ‹U\8îܧµ}zïííû×û¼çœçüÎyÏ€&‘æ¢j9R…<:ØOHÄɽ€Hà æËÂgÅðyx~t°?ü¯opÕ.$ÇáÿƒºP&W ‘à"ç RÈ.TÈȰS³d ”ly|B"ª ìôI>Ø©“ÜØ¢©™(G$@»`UR,À ¬@".À®€Y¶2G€½vŽX@`€™B,Ì 8CÍ L 0Ò¿à©_p…¸HÀ˕͗KÒ3¸•Ðwòðàâ!âÂl±Ba)f ä"œ—›#HçLÎ ùÑÁþ8?çæäáæfçlïôÅ¢þkðo">!ñßþ¼ŒNÏïÚ_ååÖpǰu¿k©[ÚVhßù]3Û  Z Ðzù‹y8ü@ž¡PÈ< í%b¡½0ã‹>ÿ3áoà‹~öü@þÛzðqš@™­À£ƒýqanv®RŽçËB1n÷ç#þÇ…ýŽ)Ñâ4±\,ŠñX‰¸P"MÇy¹R‘D!É•âé2ñ–ý “w ¬†OÀN¶µËlÀ~î‹XÒv@~ó-Œ ‘g42y÷“¿ù@+Í—¤ã¼è\¨”LÆD *°A Á¬ÀœÁ¼ÀaD@ $À<Bä€ ¡–ATÀ:ص° šá´Á18 çà\ëp`žÂ¼† AÈa!:ˆbŽØ"ΙŽ"aH4’€¤ éˆQ"ÅÈr¤©Bj‘]H#ò-r9\@úÛÈ 2ŠüмG1”²QÔu@¹¨ŠÆ sÑt4]€–¢kÑ´=€¶¢§ÑKèut}ŠŽc€Ñ1fŒÙa\Œ‡E`‰X&ÇcåX5V5cX7vÀžaï$‹€ì^„Âl‚GXLXC¨%ì#´ºW ƒ„1Â'"“¨O´%zùÄxb:±XF¬&î!!ž%^'_“H$É’äN !%2I IkHÛH-¤S¤>ÒiœL&ëmÉÞä²€¬ —‘·O’ûÉÃä·:ňâL ¢$R¤”J5e?奟2B™ ªQÍ©žÔªˆ:ŸZIm vP/S‡©4uš%Í›Cˤ-£ÕКigi÷h/étº ݃E—ЗÒkèéçéƒôw † ƒÇHb(k{§·/™L¦Ó—™ÈT0×2™g˜˜oUX*ö*|‘Ê•:•V•~•çªTUsU?Õyª T«U«^V}¦FU³Pã© Ô«Õ©U»©6®ÎRwRPÏQ_£¾_ý‚úc ²†…F †H£Tc·Æ!Æ2eñXBÖrVë,k˜Mb[²ùìLvûv/{LSCsªf¬f‘fæqÍƱàð9ÙœJÎ!Î Î{--?-±Öj­f­~­7ÚzÚ¾ÚbírííëÚïup@,õ:m:÷u º6ºQº…ºÛuÏê>Ócëyé õÊõéÝÑGõmô£õêïÖïÑ7046l18cðÌcèk˜i¸Ñð„á¨Ëhº‘Äh£ÑI£'¸&î‡gã5x>f¬ob¬4ÞeÜkVyVõV׬IÖ\ë,ëmÖWlPW› ›:›Ë¶¨­›­Äv›mßâ)Ò)õSnÚ1ìüì ìšìí9öaö%ömöÏÌÖ;t;|rtuÌvlp¼ë¤á4éĩÃéWgg¡só5¦KË—v—Sm§Š§nŸzË•åîºÒµÓõ£›»›Ü­ÙmÔÝÌ=Å}«ûM.›É]Ã=ïAôð÷XâqÌã§›§Âóç/^v^Y^û½O³œ&žÖ0mÈÛÄ[à½Ë{`:>=eúÎé>Æ>ŸzŸ‡¾¦¾"ß=¾#~Ö~™~üžû;úËýø¿áyòñN`Áå½³k™¥5»/ >B Yr“oÀòùc3Üg,šÑÊZú0Ì&LÖކÏß~o¦ùLé̶ˆàGlˆ¸i™ù})*2ª.êQ´Stqt÷,Ö¬äYûg½Žñ©Œ¹;Ûj¶rvg¬jlRlc웸€¸ª¸x‡øEñ—t$ í‰äÄØÄ=‰ãsçlš3œäšT–tc®åÜ¢¹æéÎËžwç|þü/÷„óû€9% pHYs  ÒÝ~ütIMEÛ Ó´f1 IDATxÚì}I–ì:²½N¬N#-@Kû;ÐXÛ+ÓàfF°Aã@0Òì”ôß$Aônpx#Aüaü¿ÿû?çŸDºoIñ_Rúc³1¼'ýŸeÿ/٠Ͱ6Ùö›§]ËÃJAî÷qø¿§×þ×ÿþ?܈?‹ÿ° " Ú¬ò[¼"ùÉ…<—Ì<±¹bz\ÖADKˆ¥ú¡ü+[J4 LáX Aäž?# gdPMIv¦A˜Ôçà A õâGþr¿qîÌ*P8PAD£7H†þL_ÖÈszå Ç{u3žfáû"9A„™ýÔ’RÍ¹Ž…Ë—ãÿnï[k"Ó?BD¿x± "&‘(yD‚õ—¹& ²¹¬“—?‹±_“ý ²m8þBÔD–\ö·rR‹G¤o³D;M¾r\M Kê…ÉZAê‚ ‚È”rÛ—'~ø VKRm±ûEzÌU£™ËÚj'Ñjͨ"H€Ø1™U N"¤ðO¬ïˆ4mÊôFz­„ëOyœ"ƒG¹XAüEð Œ çmÔ¤––)Hλò$½•w3Äè.WƒgCçRþÉQ‚§Ÿ0 3yóE$@gbyrúòë³,™‘;ªxñð’mQD9^™…'åNÆw/™ A„À+0‚„Ç&JPÕù¸¥˜»ÓNw[ÒèVé•ÐÿF}äOîî˜b×Mª·Ÿï ‚ Ìœ(Ê~Þw5~Üœ¢Ôcö³e„’ì{¾×žaŠõ¨Þ6s ò‚ø^D\&8ÙÏ 5™Žˆ·É´I"S§y*§ü#Õ €¤‡ H€b/‚ìG4+GB¥%^0rD™5_0¥dPŸŒ2ˆ& ‚øÛð9Æ ÑK\uûIöuÂ8–,îZäu” A¸8ÐÞìY“Õ¹Ÿÿê ßî—­’¯ì%‚ "ˆõ‰ÏEüHäSæHЈÈX îÅmÜÆ$« ¼¾b D‚ "ˆ:1Q¸ F+"6í÷lj°É\d)ê#éåÉóeçÙA„˜¥H’\—5j2¬2’2;/ˆì‡ H€b¢ *]^‰¹ÐAB±.Î×ï2ä1£çͦËEz7J)…ì‡ H€â* `yO“ cH>Ë'ÒÆÑÔ F†dIšÏØËÐP”G 4¢& ‚ˆˆkñR£Q ñô…‡w]P‰ªH `³<’›{ò#Ÿ! ‚˜*sȈ^•Tú²ŒéùÆqñ›ø4tErç,µp ¹»ÒADËáÃ? ¬æ-D€´8@¸ÊĨúOÄo¦ð5”‘z ‚ "ˆ1lhÔqo Ïð2(÷W!Ì%SLÉ8i‚ˆ šÒÁ.¥lJ +(c„ìb¼%Z²L×ÍÈ=´ƒJ ‚ "· ±É¢MNrdªlÌ^Q-ŸÜ*­o¤“mØmaŒD$@ÑO0²ŸŽPÛ×s„û²æÌCƒÊ­99[ˆì‡ H€""f|®B±ïÂðÔf"a’ÛÊ•›'·}šì‡ H€¢Ã|ÔáåD-ÛÄr¢p‡{sò>^ù” ?C“ñTDÊý&#P›*•ì‡ H€bˆt@ôÔŸæI„ýC+jH8–iVŽáÖ÷ AÄeMç2!ÖY!nðn;­›{SX.måÈ H=€ýÐ ô# ‚hI{µO;züÁ'£odd?ƒÏý‹äoËvS*'#®ëÉòt!" ‚È–žˆJV(_—H-W ,M ˬÉHzC$@”)ZîÐ âcóŽ×é4•³ÊBQþ%Lª²„ô³„½ÜÛ2#‚ "­¤@@Ô«bJù%¸¨T€É‰žý,Í'Çà›Nžž¡uâ)–¢e?Ч´eX1ë»,Z 'C£*‚ˆ ,ò¶Ç·ŽEòÖO†ƒ ’ŠBHc(3ˆ.KTÑbq÷¼%‚ˆ †‰“ºøƒ·H%!¡ŠKŸèYì§Zx<Ã…Éù…¦å•@ADUÙ…´’<„U;P—>š‡<ýÜÆ½kÏFò]€Š#‚ˆ ˆT©›W­mš\d3ÜmY®Óþ 0xœÒtOʳÔò =G5GŠÓ‰#N$@ñçiÖÁ­M×Cód¢£ADº€2¨ŒF:e;îÍ ’³»Çî¸àþîšÃñ¾/eÊõ Siª‚ˆ æÉ4/gRs ‹æç†Ð|õ¢²e®Ü7ÒöN‚©+]ñ„ì‡ H€"_¾þZ‘ZU@žï9mÝ.$#B½t×èÜÉ‹.O©½ï;Føö"´z& ‚Èm¿'êAÈ/Û!ó8txâ=!Ö"TÚ뱟xj\ÄZçµû9OS‚ H€"Yî©ÓXŠ­lص/ÿR®v,˜5ßW;ÖÓ‘û‰¨1¦ ~BÄD¤MàÝÉA„EÊÂúÂQ®×"´â#šd¢Œk÷ú¼7gØÝ¹Ý3ù r+B$@ñ…b/${$ë!e|Bi}EHRúÌ‘–En›Ã;¨ÜÌÀÍvì¿×AD:J“ÐhxŽ«"ªì¥ÅÔ ŒOqûèg¹Ym[†§z”ýl¿oSD$@áã@}A/ S·Q*47/K/qdˆ…ó‰³%™=îÞ²âæÆ)ñ~0ª…ADßɼyÔí’JµL!‡Pä@…˦(2’,8ÖA3çÂÛI­”xÓêu$‚ˆ ”bÍÄi," ›:ýú1CY3UâÄPit.‡ºYÛÏvHbnÖÙ|§™oøÛ)×sA“gò%‚ˆ ˆªˆ€Ãâf”2À’¼Ëüõu!ò}òá$AêSg¹¶{?ld@Ä_Ç‹]@Qk˜eÕÝÖÖ5*–3«~©RþÇû?¥_A(ÛÐã4Ír¤WýIÌ2ž†B Öy)ô¯+þmQd?ÄŸ5@‘)$O"ݰ;†H?V¹¸e¹y»–VµåF5\5fÉ~  NöC$@a€V1Â,çë§–t´dZ½Ü¤ _“Êc05硜Ö\§|/¥6³Çˆ¶ADƒÅæŒ2¡º “„zBÏýd*MÎ~BܵŒÛä!¨yH&OI‚ "ˆ§CkÐ3§!×3ØŠ0:í÷Í‹¾@ÐÖ“‡À] ƒü©©Ïí³— ž A„A YM¡ßïJô[êÏ¡ø†¿UgiйÌk¢ÉŠC\ù¾¢|j$Äž ã! ‚!#Eœ/$¾7Ev£ FFÿ.æTú"Yddk?yØ/]jÄ(ÚL›H”ˆ¿ ^„Yä(b‰VDɸjê^øõðþïxã%¤Õ;¹†È«Rý¨?g]í쇹⠂ ‚°I6íEPÎ'«ššïþ«~NIŸ.®h°°1Ñ …â Æý.yAD#DoµÔ¤#L¸Dÿ@óVÊÄ‚¬ná…²Üyy•MT¹Â~È… ‚ BÂ/&¨;dêó—Âe—+ftÍ®‹¿ŠÂj;™÷l Y½¶GYü÷ AÜC˜\â½v÷V16ú—¾#À™J4èâïå@ÕwŽ4HaGc±8̽¬kµqTû•u&Í%­©ADŽD ¡ÍÁO˜éR‘JmTª ¨ã.šh|„¼\j‚Ë Gvöƒ_Fƒà4ÙA$@‘BG¤ÃR9Χ0Io]Ç®?ù§—™å°Žùu´ó ûè€@ÃbÔgÓõP÷C$@¡ä1* /’‘jËk.ìcÝ»îð†…¢%¹¹ÅèŽúî@ZÿÊÃ@‹÷ AÜ«Òg½`ÈýÖý«³tZ2òН¦’¿¯õé„fž¥®"û!5‘ LÜÇÑJwà0‰µ£ÜFW„«}—þëõ{HÆ|tÙL9bS$ÝéEöC]PDw“$c90åã¸\]”38ÿYTõÁîYÙ—$_0‚ŠÄ²0t¼u¤p&‚ ΠˆøÛ€):œL2½(<UÐfÖLH»ÿþ;üöiöŒèhæ`šS†I¨{÷hŒÄ?á5@QP‚žœÙ@/|óf׃Üb”è¿öVÉcõ@qçqÄ^°)•pLÖJúC$@‘Åðö¡*Šôlôs·µ²EÄ™FËm;]n¡ ±Dƒ¶mˆÈ“†}—¹þ‚1j4ÿyAÄ8ÑèŠøÃiš< B<°éÙC míDW Ù¶”ðAC´cu}ãXn¬ºÿÒôëažADÃiS^–ÛÚPWâ ¿r?\îJaÄÌkÒîÕ$3žóž‹¡©AÄd!Ñ—e¹ŠÕŠJ)ô73~›.G"ƒíŸÔ–=Hý‹ž YØyAă8Óö+釾•¨ÂùU.4̱áhoþßJÍ¥P/Cð¤ôBn±® Œ¸ð"›"H€‚˜'Î2½ÃÜZýÂÕ~åHƒt &×Í ß<_0)0€ûÐxˆ H€Â)?š²W&}§þìx^”×–_UÐ,>9”éœ/¹L…Ô‡ H€"AlÊ(êS•Èâ}q»&¯‡­â{ë“•üÛƒŒ*†ÌÇhÓh iAÄ Ù+¦·ÄûE ÔVâ”Êÿ6:“ölÌÓN ¡Órœ Êâ*¤ÚpA$@‘¿¸ŽÙ÷HêG•¼ã­A«IûÔfVPä~z¯ý»¡—Ä'‘ ADƒCðfß=–œ¤š)^´(ÈŒW´Ê¹¤-ý.ðô9ý7àùÂTösÕADyæ?µâÊw߃+±’0óM\‹a§â‘jíQæqR¥uäÇó³åóž&F$@ñ'ØOŽ]²«A,éˆØÍ—æ(8Iƒ‚1 £Ëj³‚ˆ ¾;Õ‰56N–l—¾ì’t;£:‰Ù$–·‘Æë&ä°Ì›Hj?Û5-3tLä=ADó¸LŸßø>fxK¢_Ûœó·ïoÛlŒf SñƒuÚºÇ"Î* ækU1b€š[[ˆlòÉKÑÂè±,Ä$”SÖÁxª1ŒÎìo$æßH÷#‚ˆ ¬ìáš³¼óCáD®Là…Fd¢òÆîp;“³ÝϽ2÷5øü7j(Øñxk–Þê«ã§öÿ<ÝÔ]«‰zNõÉ“- k(ikBW“+$@AhøGž[- Tî#ûݵ@ǯ½Ud9d!’<Ͱû²íb3î¾m›ÈÏ\“QT‰Ž×™«N†³>ÿwò‚ "ˆ0ò|zï·zo[£)⚬/{ÇG$Ô!°üÞJ•&àK: ([pó÷ ‚ˆ ¾œÓH|èn‹”<ÜE)YËG dVÁT’˜žþ íØä×–XJlNS£<–ig£hTÄ©òÁT‚BÒC$@aá=[;<óî‡ è[ÁˆþQy§rµ·glo¼`‘m¯*…Cô´¶î¸–KyÞz¥Ÿ&hÙËL¨¨©A„Nœ¨ƒ†Ó{xÛEÌ[Õ³ç€mûРv<‡\ó—Û5³Üoé¡ýôžÎðß‹Ê'dZãTÿ$X AD%ÈæŽ˜¿ædh"áÐCG‹fˆ†Û¹‚&^\®N¾Y7-”è£ø»ª¬ºæ"Û1™Ÿ‹ºS?õ€–ñ86‰ñäÐ!ò&‚ˆ þ.öþäqý vC¹¼­-Ó Ui×÷³ß"ñqQ­éÄíÅ)¿XÛãm$N$oOq~}ÅÞŒŸ—®5û¯?°@â„ ½ÛjN$@ñ÷Ô¦çp$Š€=ì’•uÉÚöÐÉâ gJ´Ã[ÿ>uJѱ7d®èxNõÑ;ܬZï¯cÀ$Ý! ‚R˜`ÄçÜjA63ˆ…Tì%*=Й0å:áòÀÕ0¹˜‡ GÂÒ`®ö_WX étB]mž5,4Ë”(>…çy ެGD A|3Pa­\ Jªâ¯‘êònw=$Wº¡¸3fLuÆýˆ CÚöj©ÝUáJ-9¬á,m‰AD¦Pi\ЈºË‹jNCΊ¶ÙЉ½Óº×ù‚±Uúk¹ÓþVTºeÃíÔÔÝÇözÔùä4ƃð‚ "ˆ¸¼Ô¼d-ªyë%#[|bÿPfEÑÁJ pɶó9?ßJý#H8\kV¢EŸr¢–î³NüÈ™WsquYçQr#‚ "ˆQ4"ÎdNmŠ4«&RÒ¼5+’9µôèð€äv®4mp¤9Ø® à-ØÝm)AÓ–Û]}by„ž ÛAÄ|>ô“—ܔŭÛÅõN~VnT•â¥ä£RrCK øƒÝw¤JÔ°Axäg‡B.˜jÞc1w.ì.ŽX=ˆõA$@¡‚/_{ÿ‰ ™é™CU•–ɨüƯ>ED” »¶fh]-ÆKø5™:©sPõØ»Ò3/øÕ²HÑe,›•îÆHˆ‚ˆ Æ&» 2ØJ+"n!u‹‹•$0Þñ÷Œå\þáNŽêª„¢2b#þIºCvü‡]@üe`âœñúÐ9çïSmôsc"©Ðäwø š©-,lpùŸª§OO“ý„Ôä@gÔí‰%ü­rÊÕ ?¯ƒ¹ô^“ ×@6‰^]úž•åç”øÍ1æÆL¹S?]Í‘`/‡  ‚‰Â(Q¨d‚hp £‰´£»rñm S`EŸò0)ä Ë5Ëõø”ì–Σ°c7"¥> ·ûbm„~?][js'‚ˆ î‡Ênú"¸¥ñ7=9+\…¬‹Þ™Ý«FEjö5^ŸTËÍvöÿµ|>q’EôéÔZ_Ãéï@cl’  ‚0È­R‘-í¶%ÐÖHÌpa$ÀÕà¡(Éx»›K›Ît9Î.C¼„:ŠVáB×PbD®ƒŒdÝñzÿ¼ë!Å! ‚¸]X‘ŒÏØUÓnˆâIg¥Î¼à\j[Q»_ºPUç¡ôÉòÕÚÄ©Ï%4=Ð#ˆýC¤;ADˆ^‰óüÿ#bq5ÂvÒá84 ?I"LA«5F)@ÒÕ6g¿Å¿(N#—Um}ò‚ êC‚ "¢$Ã¥*ÈB”§÷J9µè/:q„2ˆnU«èzY£êLݸØÒE†jÌñì^" ‚øSLÊ„¹³ IDAT£ “ܹ;\•šV1®~ MʬHj¥v o°Z+›ÆO…ÖÞplÿ¦6œ  ‚Èg?EÁˆ\%PÌÃë׿Ù÷SWbt&•äæle--)݇f»¶fRv}Ðh¨(ÜÛcˆAÄ. û±È”»T$'´õÔ?oKèÓc¬è×ô§ráqb£±û.>S´ðÞ*‘·*aúd;ûü|í M²‚ "ˆeÎÐâ~*_ Tsû»°’ÉÒÞmê¨þù1&ªñžë?÷?Rµ/°Þ_»Š(B*+œÅ€SÊ )]>…ýADF4“Æ£õÔ¥ )¸Â»¼ðѹ±k¸¸ËÎÛ¬AƒJÄëL†ìâü¶Zà *Fâ5Øî÷’·Ü‡Á]4=Ö¯@wŠyHȧ‚ˆ ìòDÁnújѧZù¾HDN«%”iÖûÑG“ÀÚYˆK$;&Svü~yã±Ó€§,üˆ¡ta¶/<©AÄ}%qjzYùb–8ÐÖÌ3U¡ý‰ã¥0ÎääÜ}(Ç:§Üt?Ƹ‡Túa3!Ý! ‚pHŠ„ØÊ5)ëŠü±ŸÑºÈƒ’Íõ€ßGAê¡c‹ƒQ3§Í!‘ø}Ò‚ "ˆ?ËÏ®™* ÍÕ%6±Š5"ý`À“®*˜Â"ý“d?‘ÿ° B!½Dýäð„OØÎæ9?NXø8sm%'Xk€¿%w‹]„Kg`š½|Ã6‚]Ä‚ âÏ“~b10P}"t¼½ÂVðð’£KÖÖ ˆ\üóï}QõÆRVš2¿ºáÞ>0*O†£ÔsˆÜ‡ H€r ¶LG(:Mm!­¸+{¹—S\Ò˜œÄËAŠöO˦¤Ì¼†ú¸Ô›Ÿ+M†¥ŒE=’Nc—# ‚ø£$êüK-|Œ7®Ñi¥ºÆ?Õ<ñ?¡y¤Öe>ddEVÛ$Ûbf90Fr,åÉpv>1š  A¤3†-Ñ!l Gæ·èMItï‡cÆö“ýB~‘¶4ŒÒ ¹°qšv§€Et;)GvëH–‚ˆ ó65iÜìø3iì<ß³ ‘ƒa;šdû‚\’ÞŽ¯´¯®jßnÞ¥µ3—I¤ADŽ0?‹£šÙJÙ)6[öròi”Ç=Ô("éÈߦÝ<òÝ –^£D«†GAL"AD2¶ÌÒ6U¾mÛpä@v5Òü»À’2;Únrö‚ú1Ù”=U6B?¥™^y]E‚ "ˆUÕ #ü—ÆœÃߨë÷Tóíú—'KŽo*6”!o°zE•­Ñ·í“µ^;4SX<3Á(™AD·Þ !ê'…z›Òï²×÷œR`µiîëµI·®ºœnÈåy1‚ "ˆÇ’Rºd=åhDë÷fš+ ªß½»J&ŒŒÞ%¾{å57“Ø]ÓÙSš H€‚Ê ¶'2¹ÞïÒÅÃÞ#XÉ1ýBö³Q…E¡9ç°±Üou­wobpF·÷}J÷1õ!:\™  ‚ˆ°Übê2´±²à¡vĤ9E‚ "ˆ8ûI8m§fKK©œºÝhý—YŽ:LJ H€"@MPCóo¦ŠÈOf’hPYÞî ×ç2¥ˆ®ÓkìþKcSF6‚ "ˆ˜(×±‘’à…MŠ_õ³±¡<\¾|ƈî÷º:§Ær”Yä¥Î~‚ "HniZŒD™ãb³'i(Š@üd"½D…næk›ºA+ߎͫñæ-½|]¥WÊCPüýÄ Q4‹  ‚(ʉ¢ü*K»n^Jˆí]p!dRRJÕ£ÿ‰ž'Ýs[eôóGM¼ ”t0W*‰#Ѭ©mö!”6ÕïX YAÄ4 -Ú¿Y#:¤zŠ ‘N5Ä^á´¤ðh}ZšÜåÄÕ¤ù€œÊi¼Ž eAG‰˜5Êd?AD‰ ¼Ð'!ŸÖzR+ô.´/_¤O±B"%rSèTâ\£-šDƒ H€‚8+àÆ0†š@È2Ö¼ZÂèá™Ðpö5ëÆ­y·]ßzRüXF3N’–¦YT A˜4 íØ…[ÓaZ2ëµõž»îÐ×î.ëêÈ=š°:7 Œã»)<à5Tê'É‚ˆ ƬÓ?2ÚlMº¥ôñR:Õòe¼CiüÀkÈøQú|®ñUUì2¨;ú~bô;;š H€B˺ϗéчGœ5G;1 5‰;oCÝ ‘ ЍK`‹´NVY`÷Ú¦QߪO ´‹ê£6is”öu[K;'‡Œ*T  At8P[,•ó È»(\þaM•a©®ÈÓ¨Û•æŸß£ò~híCÊÌrÿVC;åd«4¸P²¬6Å‚ˆ –gEm¡‡½ AÊ£¤èf^Y¦2}*ã‹Ð•ŒÊÓÅ‹5±N"T^ÿýõM¼¤Tbù¯ÕæÑ$ˆ H€¢AwD§C8Óé›%Kû˜nTtÜE— ä“çútoŽ»EÍUj;ûéyŽ <_º­€ˆ H€Â'!Qü—¨T>K£ÅûG¨»Jî²èö'(\g™þs K$@AE£ôNñ:NÓHömz% âìö­oaÑÓ ¯˜ ÑŒ ""—ý(OñÖÈ4šWÖa°2ÊãI 0‚ "ˆ¾öD!*$ôív¨¡Íh3´1ÿᡦADW*˜,s¢ìGÿž3i ïe‚ ˆ›ðvAœx¦±Ÿ8IjW<ïA„‚i¤‡ìX3\*O«°B ‚ æ‚W`áÀMä l6$µgÐ:|üùb %¾ªõ{J“›dŒ  ‚ û)²„ŽküïŸÏ™NE©$ÖFÂô',Û³A±°ŒÞYþÈ Nÿ%å,T(·FJLi“AD‡ý(ó*´\ãw\æDøLs:餺Y®ng…Ÿ*A$@Aöcèm~#6rQI’¦JÛ‰H%õmKÑSa‚è>¦îgÑ=L^E$@Aö“CtºYÍ‘û½F›,t`¶îjž'}²o·iŠ%I" ‚ ûQÉÔ­á9¿VÊcÃ幌#U¸”Žz£ ¾ãs$2!‚ˆ þûi°(í |T>âiÆšärG@€ÊUš¨I•¶^ºÛI"1" ‚øCìg/üpwÅzLHñØúb fYä@J.ó¯ØfoÃ6ñŽŒ H€â¯PŸ¾$¾ýÔjùõ‚º«Ç¶3^S±cyäFADO¢>øÊVÿ2õcba4ºÏJ‰MmM#2$‚ "ˆ;ÏìçVÙÇËXúÇY F¨4ú¦/»Ã$ ‚XšRü ê³)Ä/Q›Þë&i0¤­G’À‘"H€Øñ穘å5ic® ‹$” ;I"‚ˆ $=9ìÇ!dqi¦!43á˜=á)¬5c ‚ˆ È~–©mSÈŠF@—ùÒ9Ûž[5] û“ H€âQÑÔGŸ ´¤kÑ­"ì ”Ìq‘GO2©¤A¡WAÄ÷2Oݦ¿ˆßã_R)ˆâ6 Ã:S1ó³y&I"ˆëNõÿþïÿL^ÔŒò·‰"VOö‘¯£ýCùÈ>èykÓQ7Kzv_YË;s«ƒ}±Æ”ñ2Óˆ¿š¨KÇ8ª*/µ"Dó-é?)ŠŸT­ÛñãÜ·{Ö+™sXn[ Ðv;T»´&ìþk~³pWN/ _„ê ~ËÊ~0ò¼'L¡džŒÊˤ^u¦¨b°9gä3lr| î%óû’ú¤uRàsΓ©Ý.öj&®±ÏR÷u°¦‘Wèë›{fu&ét½;V;÷.Œ «Ö_²&çñ1Iê:>ýŒá8®Ed•mà ê›Š­†ãʯ|mç–´AR öIZÅ0›<êž³¾îoÙÐÏã¶ ãö¹åT‡R%©ZkíÌÓ°Òô*Úµ-´Òð ˜ VSZ°Ílá^•ÔbÐmVétÇgu v÷[úÊO8 û¼ðø>=K:/¨ö¼O0Ï!@K°Ÿ¯>3#ƒ##e]&îøº™ÒÛIߣ¶§AP^~gÂ#?ŽoêI]ÿk™`E#!ûÞ×""7’`œí<%RÔ¨úÃÀ«Æ/­×—Ìí·!ä(?‚Ÿ~ö.\¼Ù}#–tÉiy©”X¬ö…¯¡A‘Õp‡¾ÆJ=Î+y@n׉}¸êÖIu_–ÑFë-˜é»Á^WéÞ Z"¶ôY›ÿËwÂlû`bîÌÆiàì齟úa`›ß¥ ×ÓÏÝ{ùeÕýB7ýúKE<“®ÎAÂ:Ræb1& zÉU…ßð=| VÖnäç{9®DeJÈ›©<÷–à—°[O†Üu>“èíTƒŒ+5–Ó<ÓËœC“C ² ª´‘œJËÛ¢¾½œÄå'qŠùôYôüP¥>•'_ý~V®ÿ†• X$WFwQadgÄå…wªc^ÅlNKäöοöRzqžošd(8ôÖ M>³f•C T×û… åkp ê†Ë'‘»#&‰Î"8¨F·šíPÃO1ç" å[¬ÔŽB '1iÊ%,T N ¿qÄÒ‡EA]m”—ÙGÝ•ÃÌKì›HßL õÀ½ýv[¨!¹sghªsÆÙáö©~<ùWOjãáÌm{~&.(ƒçèv¥­»+÷Ä2qJD¿ô®.t2«‡”p¨|8/[GÄÊ ¬7Š ´þ˜1œe:hZ"}\{àq}.Då®=Ù.>+ iÃM Cë}›¬s7hܳ“yßÐä¾y¯£3hkƒ±Î ™¤'1õlñº:O›_S§NR¢¤´(oŠ)—àN…]W>J„äYíÌp6Ú 3èîäܳQG¬•·dîGdć0@ “´ €ÝBº“ýÔÌãÔ}V[$i‚4H#Ó„¨î=¿)tè“ùEEoàDÀóú”?¢¦>WpÙ ^ÉKjm!…Æ9('=­¦QÒ…áÑ¥C^œÆM³âf=îB—ãßÀÒoíd•p9D>1×ÞÐSê ’ûÛ2…ÞLQn¢î`ã\âW»®¤¸€–·¡? p"º<öZsÑNýÌäH0@J$ºèR6—~š0õÁwN©Æ§$«ä¸ÿ9F·_–ãÝú"uú¬¦BΖQm¬HÒ4ñ*T®|Š"œyàà4'ÿÈû|c®Š»ò=}Å8ýÔÇu@-´Úx­¶Ûޱ@%ᕱPÏžr~ª3…á¾êã™S·Rø^kÙpõz¢ºbõ=goýŽÁ*$0ƒEëë|ÔùX%“¡‹ßréÉA¨>)ôCßÜV Æ£H¿¹‹Íð8Ú ãiêl8kzP³ ‹! £>=Ó½œt!*3¿8ÍöȈ§fù<OÑ=ØlßÑRë¡NdàGCJ³iLm'çÀ[z,·£ú‘ÓÇp/í'¼¾]45Όۧ1¹6±Ëž) o2´›; æ±I/Š[÷S|UZsØ%ÙûÇý_÷«rMÍÐã6"¹d¿ÓÞÿp ±#iµ†2ˆèņ—Œ…T}xïÙ ô¼]wPªûƒýfRä|b8ÉÀéè´0ƒÄÔ2ePù.Ã}¹¡¯eÔ×—3öÜÑåz\övÌòfK5eT ÎËßð:Wkm~ e¶†Þs,¼ãaëcw¿§É#Zp>œú¼ ™Üì—¶(f&¬Ú¥"» ðÛáÄ?6}0ŒV³/¿00ÿׄË&Xþ¹œÍ•?ÒA:û`³4Å1Í=_´››>Ÿñ‹¯VE=ƒQhd’¯ÒqvØÆù*ŸÖ|úOã%üûÿJ¬‡ÇÞ]KÍ•¡:juP••6”á²ßá1çJP=àÓâ–ì§2N÷c©À¾ßiúó8“àç5δ& ‚)Dn®úùøy½´Í¸â¡`­ù‰i“ãrd¯v`ñO¨”ˆD¯NòíWO ño';i¬¯hTŒÊÜÒ(‹[QµdÞÂaÖìù3%éËÈå‡.jö4ÕØyN•ÜÅCzAÒ:p%ìRœ“+Ùm2/ÔÞ8ÑöY€âȼçí$%Ã'‰ó"l¤´j{¤Õë³Éèç"FÌïN¯½4Œå—ÝãÇùVô€(Ön'ÀukÑß=†n~ŸqÜÄø¢¶bò°±Ë©í¤Ó²L_I—vH.›Z{Òˆk†eØlc,QÉDñak[% à´„]Åš<²T¯WRb:V÷cÝ uÇü<ùúL œdG½¶ÝÉ„†ÚFáKªõu©ÖC©9æUÜjcŽßÍh–[ãÌ0‰½b=+3©À ìg¸Éódö“14’ÿÕËa©S~ŠåIáÐ_së+‡ÔÅ@NÓ̶Úá'7cÛ &X,ŠêLÞ”*œ€Óêpqhë‘dì5rÅRèú¼M.Å" ve=aùÕ eÄ͙ߛ’qÑ‚ÞÅ~žÂ{ÉÕc‰žAfIUˆ„8ЉßÔîËjnöÕ^¾¤kMgxn'#ý·‡»†©}ã5z )Sèj(&TîÕX¹ÆÝqoµLnÏ£ä•Pr1Ž%2úËkÑãûpÃçƒv‰up}]¨Î× òT5rßÿ¶lò}9Zàm×tó¡w>ÑdôôIz=“Þy~ËxlËJu½ÆJD§/UD¥¶©òÚ¢4¸¿í:k†0¡_+Ã5½aù3B&qÀš>G˜ZiyĆfÕHy ‡Å'Ë©bÆ(pÇ”L±}Y›2ŠâÇD™mzMÅBå@ý¿›|ãSÞ’¿Ñ÷Á¢•¨úbS‘¶/Õ»¦ë.·_O¢Ùº*´y›”+ÈÜ.:uBxcw«fï˜ÌrçÒ °¬¾-XzÑrê ?šÏèÖ¿ kÐ ¥–3&ʤ´RYåêe§mÕÓD˜#XmÎð:Os½A³©&&§øm”Ùüµ­¢¨¶D¥þÁ£&Ý€rró0Ɔ§Tt¾j%ƒÂ<â2­èó"ºÆ˜¶çχ¦ÐÃßC=¤¸BÉ2Ê( œÐE˜/HÓÉ€[ݨø q€Š´Æzé5;]†;Í\m•ï3ºk‚Ü5¡u–Aü~!ö3aƒUs £<–ŸZâTŽÊÜÊm”ž Õ=ä1~ðûO"÷*͘ ìêRmQÔ[ë ©Ó;IÏt¡²Z Ĭþâçõ¶òÆZ‰ZuùÞñ°-Žæúþêr¶VŠggYQÔÊœµ$ÕÖ×+ν¡®I‘uÒŒ`&/w_ˆ WV¯­N>(°UøVH£éÈóe‘°$õ ß:Nõ˜²ê%‰ýlÙG—þÈü¶ ê‹‡²Ÿ;^Ý 2¥o•š¸¯ÞA‘™°ï?Œ!W÷¨˜ÝÐû›è’£JFÕŸBC†ˆ£úK1ÍtF1VQãeˆNsKb›Àø­ãUø’Xªµ@ ]סãK  ,„½–6©׿mAXmcþk7_ÆÚ.J}6+¬4E;nS—"HCö4Õ'EÉ­‘¾xëEz¤ À0¢òûÝ‹…t…<% Ǧ¿XНÐÙ Ž2çÄ}Μÿ¯‹it *’«oxäÑRš5Á^ e«‚F»•˜=+ôŽ|c¾0–p…EßZ˜ž {—åŽÕÇ º›‚Yt "šùTßtæ`&ƒº¸aÔ¾ó>Óš!©.~ëÑóö­&*±š­0ó±×• U"C-ÝÏÉ·Iü{~˜8cKº¤Ã‡}[Q‹@úu÷¨ÉŽçgóÎ3Þè%¹zXŸ°439P“-kÓÈ—$ŒT>©µö9Æú¨Œ—ÈU·á ™Ï?•Oâ{´H`­n[â»ÛªZ¬¿Wv\,¥¤ÉQgæ[U«„2[n™p)S_׈ÚÉð±¡þ¹è7)Q¦lpg»Ün Þó¤AXrtøš¦ýÒß`î IZ ²1iS?|ŸbÅC‘Õtº®¾GC²ªi“Ûˆ}+úå™*>KųFRyv‚z7úž€Fd£š WUŸD= Å~',¼Û&R;‡Y)ŸÎ*L¡Õ1¤‹E?–˜EjéØc?ä=˜×–“Æ+•:®iÍë4Em"î4Övzròu}7ºìeÔJñhóMAA×YÒ$ Eq•ÃT,²ú„â}q°qMd̦۰² Ðï–fÖS¼ú-†yJ¡ö®”¸ êÊšó»Œ'íV%ýƒrë@û‡¡w¿¹ìçI4èo°ŸE9ë7§11¦€ÇfË]Ux×Møü7 ¦n-…‘´Îî…ŠÆ–jí+¡—Ríý¾7Ú‘ä:Þ³´á=p #ÃkOº‘±  Rk¸6ýݦÒà8-+™6_âŸ[.ö#Æç*'ó ™æ™ g•¦íÂióÑ 9lt£8—êV=ëW²” S¡[\ó&]zãgñ~é¹ëñÝrËr(Jþ'Ë÷~³ÇK—êUc]¼€b»qûhH§¼z½RÚš3M­–oGd€³È™™9<æ!gël Ñi"û¹+iüŒïÚYòdG±úÝÈ#¢8·ÏÇyasíÉ$Ï0ì€g}uð{?Tk‘9¥FÝ3~ÁÅÔ›ñ C8=uV8óÛŒM·¹Z$hû1ÁÛ¿˜Sïb¤1éð¾î9g\£Fz½Mc?·‡T¾EÀ®l^½ùìõrë,+‹ò*ǤŠýjS õ ®{½G×®Ba%ªe´hìÅgÕšÂØ¡¡ÝÐXáèM$ C®£ˆÅ¸ñ­ˆax=*vWšm»w{1fݪYBÆ qÜïlœh¼Ÿý¬zÈÒ„õ‹ÛÚ8èv¬J¦b7#ɽ'™FÎZ‰RWÚ§ÞÚ/éÇ€²ÂJ]FðºJ“^i´é¼P2 ª4öÃ.á‹Rc€Àg<Þ(…[ wúÑ@fF‹o&´gŒÔ¶µò”Mærw=%«3Õ[“d¨g\cÍy¥ Î?ö^ ·ÛX¨?çaÐq‘±ÞšÞaº‹¶A€Æw¦ø ©“Ä5'kjœ@~¥–°qí¼kd÷Á?„bjd×ü„»„+É_Ï<ï1ìÅ<à!ÝLÞC3Ç7ýh”@úÌÚ#hJBáhi"–X¡ýú(EB5ëZØ„üÛp†~Qe‹ú%ÐfÉ Væ6½ÊõÃÅ9lor¦Yã9V¯ qÜó¡“žL*³ªUBúIÝ¢D©úØ(Z]è¼*ÁÙ=™²óo²Ÿ­9ËÃݸÐÅô@ÝdøFÐ+às/6,|Î}§D^ðDê;Ò=IÒc2,e2jœÖgC˜Kþ,¹ýÃÜÛhrD´N×I.öC<<]¡ºqBÜ”º@Ô”4^øê*upŽÀµm\™]T\>Þð!Æe~™FY–ÒÜümö3h ä‹Ú2xòåÙ!cä•Ç{OÕXPÈ‹;ªOhÇr\¤÷¿èôF×ñ– Î3—‡¼úNTFNy ^눬]KøPC*×O­—-NßU»ƒ3¡i‚kãäêª)õ…dnwáb ƒ[_'ûaÌä@Ûl”Ó¦Þ5dG´þ±¥èR•‰’YC×à u=íÏ»¤žXã'-î’tô_mËæü«Û.Céi8_»øÜå_úåRàAè¯9)+o®Ñ——nJ„ç,Î.iÄáR;Õ£³ÀxX‚ÇÛ:q¿È]ßXyzŸDt?|UR9ÐimËMiKE×?ˆêWF޼‹¡)t R&’CÄì!²³¶”9„ÉÖÞªÂf ÷¨¦®5ÃÒiÚ§+elTÑ…Wä.!1ו=àâýw¡D£´nÈ€Öý!Ü'ôôY¶í+Hô‘dýJ’ýd±ŸMd®æ³ÕBÁ1jø¢»ÒIš6)Œi»-æ÷2«ßjUšMˆâoRW\HoÝ+o÷`’ð?¨þñtΗîT mßš#QòL{iºÞê Dí“;#FcgWÃ̃–=ÚÐr™ø"½ä,Á¸.ûá-ç]JǘŠúdŒL¤›@‡ùB쮩?~Ï/w‘íf JeZ–¨Ö5^°žÖ»‡õno»÷¼†~Éå\óaXÖ㎥c^¯#EV–g¹÷än—r]™Yƒ++O¤?‰aÅå0—©Bsäîå@¸TSŸ`<$²=øCí}.´u“ƒ€éѹV¿HvŸ[:“7‘+i¼Ø&AQ$"wyŽ^]<ÆíÇ®øM}¤ÿÀqü)ì'1–·,зN6Ø{_±C,<+£.Œæ@H É„ëŠ8j‹Ò‰‚¥HÿC†DßFê3\ôùCJV¥çó~¯«1lg1åhyó- Ü{SÆÒy¦±<Ñ÷k¤¼n¯ñ…ÌYÖVÿÌaÁ἞”•»é̳'álÛ·{nCO(³†V²ÀÃPg˜ì›=ÄuóÝ™1w-v4Ʊ|Ϧ ›£táI1¿ØnÙcÝw8»r½:5toe}± Ùo†_ø7­Û Â÷w³›ö¬L¥KñHZ­5ÌÃV–ñÍNÕé9­óƒ1¾n]T: ý—s|ÓP˜ƒþ\];µþ.U|U•QUàç…„6~ŠmÈœ@N&$çåuª¢ÑýÃ+eAh›â¦*á%®ô•À;íâàÙ›éz ƒþtñ|ö#©­Ibô/бùÝ„b0VQÔ¼jöqà[Ã÷Ñî¡Å¦åÅe$Ýjg¿·‰e•«Z#ò[>R5ö\7º?‚í¹â•¼.3-rŒŽ‘»L6W†äs\DuFùWdA”)ŒVÂ×ùéKEÓßÖ51Çlj4Xb5¢¸Ü";Í÷²ŸÇÇ Dò»2àsÖ0£XA÷cå@£Sƒ]¤òÀŠëí^^"Ÿ;wo@Ïeb)¤§N"¤.6 DG,”Á© ׺Á˜ÙTh³9ÑüõË0‚’·¨´|£ðg5·oרY꘳³Î¶d?‹u¦(í&&ò©\O¯Ò×5'Ÿ‘kîÏaÕyE²GešÌö,¿´/xÅ}[L¹QÃÙ*ªÉêcó°§Ñ#™‘îºDÏ©*§†-'Ìqék±*3ÇT?<—6 YZ`£Ûñ–±¿3Êß<ö&· Dƒ«›D˜É´ÿá¯û=S^clø#eÄ_áó5”BÕÌXÅ`<‚Iu:vs ´˜Œs@Ñ Ä7£Jz‹q3ù¥%Ý®¯Ù‹µ‡D¥dÑÌ ´ê|‚€cZEw Œ¹ïxû™TÏ1 Jep!2§÷ÐWŸ“§p qçÃøt…‘]ʰi•"§:JFߢB’z[rPÙó‘ÔµÓô>²b¯ëeü´Å”"à*±B*97Ió!;ާ”—µŒxÎ…A½óp}%¤¡Ÿwäǰ:º#O{1<ÜdzØÏ°J®øgÙ{@éžT—›1¥Ã2VíeSTXÊÜ]ž!VµŽ¸ü\|‰‚Ý&«)s{†òŠÐ>ÞózxûwidºÙ2ònuCÛÈ+åk®NÍ__JÌ%iç¨-½ßíÎÖ*,¸Cò¨ÈÈYöìyEe•€šÄ^ª«Rºmº„H•bJøí9À:ÓÙð"^7Ó0B,Æ´Ts¡ ׌ƒ§­2ÕºaÄzñª \Ãzð DFå_Om¸ 3ˆQê Vvas櫯û¦¸žè¦}ñÙ©efZ%C=Qõß¼…VE0¼R¶µÇ¯·zÚ¡4F†ª†äm;è–l¬¡¨ˆ;Šçb¥qŒ4'M' „-žŠ9K!FÞÚW^Ñc²Z]§‚öM²(÷-p甖̱°¿uAwÍé"ƒnqM}¡=õP$Rñ)~°ÆÊ´Ì!¿(!G Xu¯e —–„²ŸÊ¤+Ï.$ïI"¢¤`?þê‚ÛŸm!:jž·Ëeá ¥>eˆeIyÅW¸s=\Ivf›$ðÎpd¤’¨‰-)ÏØkÌJ˜&  Š‘€bTlžIùæ–Ò¬ôÛÝðJóô–Ü>‘ò"¾db ­ä®¡4Û;4¤²âä'O%ýs²6” LYZÙ$$s¤™„Dt%(NÇþ©TM¶Úæõž¡bŸµûçjD‘(Wc"xb®8 ì¦Ð4mÊäìÆ*=œXjKÕ³Üò‡íf³ãWc¡Ý ×à˜Ü ‘18ðLœ3qº C¼ë”~d¦ bæíêdXÅ:·2jîr‰/ŒÓ1Oç¾­ÞÂK1äÍ „ŸŠ§¢Ä¨)_¹äÆ…½Žœ»¹ðGF ÝRÒµ¥ sÖ “Ç&Á$èE+•ò,©²H¡ªáûÂìG>{·=ÑLûÙb*ÉuÈ“¤_ꊱ“³òó ¥¸‘"¼lUøJ4öçFJt-9kËP¦#§¸>6U¢k‚Ûªòä˜,~ _4‰èûë¸y¼ o¡·Ñ¥æßɬMDjzÇÃèK¦9݇¡óp¸ÝOÿUïÛ)?1Ó®ÇË¡1î²×ÆÐŽŒQHËÀjRí§EÊéÏD›$ è=è9—Õ%¶’•›ñ…ë ³û7ÑÕ¸QPïb›ŠŽw¨­vÅeÕØƒ®¥¯ÌÂ8zûÄêL:Ø0¨³ì͇¾ždPØ‘Üû¥½Ÿ ºÁO Í¢´Ú'ú[x¯kÁK4I‡úÇ¡:š7[ÍJ®)R¸™æÑY?=„1ý{¨i´äÓ%À»\é3s·Å×Ü…£Xò7ë‹#^±¾…¬ ž°:»ŠçüN_4°uÉ´Ý99ý yjö“ãü%µˆ7ÝÐ!›JÎà¥]AªÂ޺ʢlXv;¬•àÊÒ9cÔŽJ×.C;ªÐ铺ÐAv½HÉJc\sC»™\¿ÃÀÈ=wʯm-í$&•‹a¤4óR;ÉÃþEI1~˜yþì&Ñ.2©Úc”ÒQÝOJí*‡p4Wûúê÷ ˆYýD Ô"Ò\ñbžŒ‘–Ýþ`kûü²nEuüʾjäŠ=¦©†AæöšŸ.Þ£4vÌNgÞÜ ï~é7¾ûô2ºàYíÆ$)Ã}°få¿%Í…h#´.ÖH ¬krÓî¾×¹ !ñ-uÖì$ÿˆž–AºuXÝéß‚U—¼C€QCIµÞ4F»Ðü£¼å€ûêš(áSZ¿ô³w¶<¼Šqaç§ÚJ÷ð¦éc’8÷ÉéÇG`¨+VÚWpI yánêóS¡Ûî¬;•D{» ÚGgóéºð„œ™Â¥ö é|ÛUQ†œÛ]z³7ís #BþònÛ/TÂÁ<"f„œõ›N•r=½/ÚÒ$ëœô†@ß³s°+´^ê¶ûõ‚€k}Ü+ÆÃé,&·i‚ú'ÁŠ*WŸ*–b%³;fÉ¢ qØÃ¦õˆZC[¼](ÚW8üKB\›Åø%ÖäÐ Îáa¯‹±Xñ%¼„dH¦²1$'ô%´ãšúJý›ìçq±ükßzí…ÇôÚhõŒx ”ñÔIçò¸ÑÇ™rø«S¸4íÅP@Q%¥–XŒ9 î0®ŒcÁ1‚Ž%cÖtõ ]ÅM—·dMou—´Ò«­Éð;kì·§Yœ[ঠ#úî*ìg¡4nš<èéH¹ XzÕª•Ȉ”)=YM|(*£€¶.>R©½íPiói$ÌZJ•{’¹CÛéiúkÀÂRtÇ ü›¾v4+нBF>åò”¦ôCšK2—>ˆQ­Ÿçk@='±¸CìMUp²²“nöü¸ë«γ®÷~¬cá+§»¿¿‘T÷Ϫ»~MÊ‘qU/¶Äæë'v?Ðs£ªRƒ¬0ÅWý»Üàû&I½¡Œ³‘B×ø ªŠhãz®5´lúfÛgôµ§û™ÞX±k§Åº c³õñ}½²q'^¢í»[‚cβžÐRïï‚"è<5>m2Éž1Ò–;¹TÌÛªâ#«Å²NÂÒŸC÷qÞpˆæœGÂ\ŘŒ‚í§d“â+}Ðþýk¯»©Ïxö3èæ ã;7}~ʤ¯áƶ&¦þÐD0Ó10(\âkõGàt Q?·RÎ8ÃÖ€Û&Iᥕ{ëp Û{Æ6Ýe74–úy¡­2 ¡+b*Ãm¯Û€ý~}ö“Š“g è‘ì ÏÍÇƈ#x_kÒzy“J«òq¦Ó;ÂQ÷ûVlɸÖ™Þˆ¶¬2ٮDz×¶#Rå”þ eåµ ÈLvúK?P|K‘ùý“ah—ñØñZy’MAF̤)´wûÁ£*¿Žrb\)ƒˤ«»aKÆÐ¢yFÒxØ.Û‹â]z§IK÷N¾íªØe—,æ>Ha!ÁܘÅâO¹/>òãeØ&ŸðPšô¤æÏ˜K™y-4Ik–d D냬JbF' N" w0#,…Ì«„Ó0ë¤Yù+iAÖ-ë°kÚKõ× JŸLEð.Ö•ý¯ϵ–NUÞø(brV,x$Öó8ÍávÀ-IÁ®NÕ“.lWûWÙÖ M·¢Gr Ñ=¤Ù›î]Õô6{³o œÏ‹½ ì-Në£]·£íöï×nÆ¥$pÞ]Ü—{,!˜Ìôú†R¬„Mž¾Sh­˜á³*—ŽŽg{uõH殓»¥á¶Ô·ýÜ~ëDöSùÛp „^ÄŒ‘’_ÀfSÜ9)î/î%ÝP¶•®óöGUÎäÜ”ùÙ êš^Ÿüq4ÕõÃøn‘˜v!ï†+ìÉ•SOh9Р µà¯a?+Ü<Îðhn|ðÇr NŠñ#RþwøK IDATÂûù¢Ïìñ@áÇÏÿÍÔ©³¿$u_ϸ­3º…—lß&dÀ=ýÅp6VkŸÓyˆ…~Ð|Ì ûqóè|ƒÁš§Mx8ûqdÿ€IÁ]gk¢rH¸àw!hêfäü«ÅB¨îŠ¥Ì+s&LŠåjl¾Š¾cÇs 9JÝ×ÝWבÐ8ŠÔä~Ý`Ð]Ù©‰U)D¶©à¹ïRŠ !^ Ç%QÕyæ±cš½30½Jûɼoµ¹¨·–œ ðž:9¹_é6OZs‹äá̪>¯¢ÙGQ}^*©j•×t2לn$>e”Ñ>´)3"Él;µÿÞk?LQµ/Õæ7Éä?˜«uBb|d®Ä{#óžK76‘·=‘ýä5ÄÁ~fÓŒµÙOjàŸ¡üÉHX ã2î詤è&z{ä´ÐG#³Ad––I“vJøïa˳”“ lEÀÈàb†›/ôˆ|õ™ äi·¶«bçËœ » ûIºù’âF˜bhæÎÏeͦšÈEíó\â‡5#RI !†Zϧ^ZÝ>%0…¹ñzBoJ)Lº¢ÃTNc:·Gé:úIN»=ì• ø|m¿¼Ùç ŠN=Gq LYvóŒ~î¾ùÊ’ÂЬmä7ð6)ŒÕ6ÍëB·.õ†b:oíãr‘Þ©YŸ°-, BµýŸŸ±]Á2R6ÙæÏJŸ™^’Äð#ÜàMþ›Ç~¤»3o?³@…m@§Š¹rLk3Ø#—Sn€7­@Ï@ò‡ÆÙý$±ŸehÙÏê£[é[ÛŸÜô­†×GÖ_oàbZ(†çgݦ٢#Zc)^Œ¢°eŸ)ѤAz²ø”8@Cua)htNÖþŸ1 C¼ÀúæM˜2èfSQ/ ¬y¾˜ÖèMe?2%õò­ìç®ÏÝÍ~zo%Szwt| =sM „O¬¬ÌasÅüwäõªä ÂëÖ5ŽìïQ»‘³ô¨­/¬Æž†MÑØ‰ÆË…—Ÿ™ÅÔñ¸Ã6Ì1¶,£V,Ð|…SÖH†h¶J]¤¿,F´ã2”M^¦C–ÕóÈ|΂ⲩvAV;˜¢ç}á‰p¸“]Š;A©:jÝÌ;u²’šÝç£à·³¡¢P‡{TùGMZ¾ð~aÓf쎿Òoyž‘b/wë¡u7Ì9{¨ä—*æJL >£o¾f†RD|^iD4 ˆC©tæ‹ê”ñ\‰ý@)ëMý+¥Óªîá_!i$æ ,èW“øÏkÐw÷v i]f=ÚýHsqfӨɨù*u”¶ IcÄ+Ë´Â Ø›Rß6³Š6jÜ”-ã/©¾ŒK(|(.V\2wñ’Id¢|-ÍÆÅç›âñ>8—ÅhöÓ«;¦L–(AZÏ‹±›YE¥Ù á͹†ÀÍŽS¨´’b§ÅNqŠ÷³(ä¯dÔàê,à)—§ÄŪ–ëaÓæö‘I6ú¸‚Ûž-CKI4ïßûo½ù¡ûÊ~fJÞÜa¬íW“wÝ|öã²(-ò^ˆÅvu¤Ÿ°6×-Ù‡”,[ýZuõˆ‡…•±gt5µªq}íÉåÞHÐïvlt½µ9©sÔCÍÚ¦qjY7Ôásá7‡ÃBù§R$ùùLâö-È~FZœýd²œeØÏ¨áw}×­±´«ïe­µ³AùÖF#QEÇEl^Ák&ØýÞq¹MM½-£žj…ø²»Ý ¬í´(®b`N?R£Èb¬¼ö¯(ÅOÏs1[ „–.R«(X«I–ÍMU¶˜@ÃàѼËã}-ö3‰€Ïa?sꉫ©‰ÞìM2Ûßä!îS„¢ïœ–/bæEërGÞ“ãÆ_6¿v†u³TcÙ@ˆâ™ŠT| ëD&FâÒwïҠ͸R8Þåp˜¡._ýL0au®1zˆÕZ‚!C€ü9„Ñ“ C(&7LÙ3™k;˜Â\À¤Hw;¹j‚(êã]È™w`¶Ó»¾'ý$üÈtuÞh}ƒE#_ kù{• 0,îò䏨>JǨHwŒ•;˜¾p("l›ê_óƒ¿s¶p¬ Õ©ÿˆåÙD ›6,5èP„q¯Ž§;|`È÷°Ý9iªv2Cµ‹vt)3¶V+¤ö™ÒŸÝî¸Ïb+;êK¥QÐ}µ@dk™CP¶+%J§ãD5oÞ?¿Ð¯Ó-* õΑ làãä@=µÓ¬gðb7«zû4¥–ýTÈ¢ÖZ#ÿÍÝÁ\ËÁCiÆéVˆLv§^ý`Ù„å×GÆÜ)kTú\ÄT GDSÀÚHâkE„oÀÚ󻨱k±÷©ÞLNiQ8ü{ê¥ë}$D_ÄÖax*k¬þÕ˜Ñj9|YVÓÔZõFýz‰X ÅÙŠ:­êcÞ.Wlƒ^LŽ'°_æùS»•4^t¹_e?Ñù-n8sB˜Bßš#?)–t÷úkh¾Uýd„Õ‚Çî¯dOÑ2§—͸¤×ˆ“iÑqNzQüZKu{õ~©[I8M6W¶v×ÒtÒùq•‰AÁ{\•Uõü³Ò}¬ÇHJCó$tp ߆¤dÆ ¦-1-åýø²‰ÁÔ$¸†Áp³«×nY'´jz=z«>"7Ìw(f”!¹©ëÉúÛ¦Ùµ82èÎvi’ Gj5Ÿ†´º`—%Ó/*–¤ºTˆmÌ`[oÛ´yݵ=eô1Úd¤üWÔ7Kq%‚ªùH^ƒý Õ¨;вð™3)"ô“çÙÄ!_þÀÍ×*ìã{!vF€±‡Øñ§˜ôÖÿÖ¾iÀœùˆB U3ÝYNa¹‡eªœîEEHzQˆ$a¥–‰µâlþºC¬õô@¶×÷.ë1gòô ÊšKÿZôª ¾Û15ênþc¬s¢)gî´·Ôjdຑ7_ZW¯°{†´?!›cgšãZæÈ¸ë0ú1ïmE’¢&–ÕÖní”-)Øä@o×õ ºBC¢ÂÕ5M’v£|0=êõŽY,7hõÉEí¸³‡ÿ·b}ö¼›8”.|uR=š¡á— ©e"Ñ€zʹ⋤† ’Qx†”9â/3F"ÿNm˜†ÎÉ~àžkúibÙ "[êßW®”M:%V­¤ZɾöKêT±nÄÏð<[y{ˆ•è‡:t“ †ÿ*€Ðq4뎫{Ü”µ_±Ï¶A·cÐ.¢LuLF4 ÌúMNðÃH¥/æ›/{,·¼›¯ê@d°Ÿ9ÊÊËØÚV#yÕ´,W+²kùÎcÎåGch"Ñ®h?ƒÄ9Tõ ’ÓîW.­M× þ¨ä4Hí ¸­@=šo½¦Ì’ÑpeFb^BªÍxF ¤˜õ8’¸éç\¾ÓfÑ‘‹!“êè,CÙäo$rs C‘·dE…ÙìYLÛö­v?˜Ü™y7qViðøDÙÏ Zé Õp·¢ˆ\CÇÈ–µnüno8ËEdS(ÒQºmWCëR=’ôÒvÙbWVa۾Ρ³¤í©ä~W°.ér ´E¾ñ¢­Ê%ŠwahNpgßy’d’œ²ÓWì÷êUÔ±ý!ìgˆ ‚Û—Þ®^ e9frðGçœDR,fßbQ0šÓZÙf–§©Fì)„j%-¦Ñ®dM³k¿î°Ý Ï#݈’Àös@ÄLTæ*I1™ÐŒÂðÒ}ª¯?’œ(„;ÍÚ•ÚŽvB'‰( A͉ õ(‹ ¤:³ÔDu%‹®“± ")»x‰ÓCºâ˜h¾ô™˜Ú4í‹p~å¢^šÎ~Õ)‰j(„^•ô¢ç±[eêgÜ¡Yâ}n_h^ïj²`õµ«»lU•²UÔ‰XCÙ3Ouú­£‹Rì‡"¹+¨B€à)ßtI^7G0[îêý PT^É÷ (5¦Œ8_ò:œ κÐÕx£öÉÛ"1®]OË1s Ù¿è•“Îêa…Y“ž%,lÀݵJ‘º ›¾ÑÐxøl¨’Ù P‚î<žÒQ®æë,Ñ7¸îSié ŠDU¶~gZö.ŸB&/0t6qdÜ´¥½ºÞõÉU8ôRÏŠz@p)ßSinDkô¢“65L'ŒC1I ×k7¦˜°Œé~l¡M_LKë ÷#®(ªÎÄÛ®Z#´6`X7¸¬}ƵÜ~ÔÅŠGÞ騶N¶ŠQD¦õЭxÙp•Ì£M!PŠ) £é•·’MI1Ñ8áXä;ŠAäý²²¡“­½~SŒóåZ·zg(pÔº>c—¤ÓÚ9®é5$„ DÊXmL7?GiËɾ¶*½ ¦&Z®5‚ý {x6q“ÇTrÊqTa™ðf±¸ìN›8zžÒZ%è „:NúCÙŸñkUi¨‘à0 IŒ&[—a Í<°o™<3"ì­ðp Ý›-«©‚WÈÀ¤êÝ%Âá–ײ›6²«øÒ½<º¤=ÇÄ'gâZ›/-ÆÖ1ê7Ô¶ÊH`lƒ£óçh˜´¢xlJ0½¿»‚7Éå7w_Ç€zu]âaÕ³è(©&4,”Ó@Â]nÛ°Ñ> _Ê”âÒ—.³™õ6V„ÙÒŒ ¨ºvÔ6ýÕÚ[·t[xå²Öd챘+&uIÝc—ñ{¹ÚŒtLT´øŸ{lИÓVF22¡Ãç‹)®^ ©>a?8ÕD<âÓ®5šÀPf—cL%+,%‘Z]î*ÎßnGx¼W.÷*f¥K.l’xèÜÓ#Ùú4ÌáIðJ_^c22I×g¸¬±ie€o $(’¢œh–ãrM9aöæRq§x-ÚÞá/öú äbì§Óãpo\ö^ † e6 NH…6µé*obÐ »£P(ÛôHòMå 6¼óWt̲ZÉÈs\ŠÝ!ÝçÝA§ß¥} È;žo-•2Nœ¬òÙr#^éÙ-Â0¤Ô–CØoØšZ .§(Ò,$L¼îç®?º<(äRì¸HBÝ;·¥t?>ßíbü°yŠë”ýão;ÆÑ9i43ØZœsÛã.a~V´µÙQ¡>Ðn¦«wghQºFPž¶.é[F9‹ô=‚ýjå2•„è‹mfjJîÕí?'´× §©¯Ds$ ˆ”3­œíÓ‡e¤fóOêâíØXÿù’"»xºhÛƒ‡ ›TºsÉêå¡rßw"R Ÿqéê½a#áó ÓÚë&›1m7¸ãÊG‡Ti6TÃ…­ô¾íÐ!»;µKWذΫQJis9nE­”éJh窬â )“ŠQ%dðìÚC(ƒ278#ó6SD¡B\éÌyþÙÈ•9:Ú?Úm¡R OûæÒóÏöù§ãTö6â^På£.'¨î¹›ý¨- ±­¹¼%\º!zI%®PO„£öÅ™ßÍNµ6âÕ€‡ÛÅŒ9gzÔø¶Chañ¦ÓB‰¬”®"Ä*YûˆAk/ƒù5;žš­\Ï>7@8k;6«ý„HÒ…—¾o i_åØUÈñ¬®s Di´R…¥4·÷á}Œgȵ&õ̽ì'WÔ"q€ÍIbr;¦UÇÝTšÛšçæë¸Í¡w@8ÿØ4r×Tª6"!Ãptï[s·ê€ãwÂå„p¹U; ŸZa{‘J¢clÆT2î^,ÅÍ®“’8Pÿ=» i”´T,ºMÿc!„hµVƒÒ¼û7øLdzøãPÝÏÖ· œJ!gêð„ÝmMe‚Ñ qö ú|¦m œ´R^c0Z¬·# ™ÙOÔceNü›7²y¶ÔOba…öȨ¾ÎeÁ«Â8w¼DiöWêè—fVMš•>_¹>õòú Íõv!•q¶o×eàMŠ(›&´PÐ>7„Ï9Ȇ}Ñ"gó\â+r® œŸi 9b5…Q^* ÏÍYûÙ†¦ã(~[°!=ÌP·°Ó Í5c™ŠËRa$¨wØÿèT½ h¨R“Íh‰P[^EyPz²Cß·ÕE¯A'>Eè½¼Ã7Ϊ—ÖF#ZjÞ¾?×7Ž$h8¥•OOª,©:¯öIrBØ*Wj !CŒx!V[xÛèËPï­¸?ST…†ÊY;ƒ¯xšTµ“X)Ðì‘qÀÔȤ»j‘A¥€ÖD?hJ$)J|xæ¤Ø5’ªd¨í8(;¬Àä–\$F"Už[õVÉžYw ‘‚¹JxõB§ÊˆrÀée¥˜Áƒq:¨”mçX ˆ‰Ü«”µ¨à^šâˆpxú‹éu(íYQýPB\Y U€aHqMJ”UB1vûª,Ü3]ÙîÖýœýIÌB5H#5CHΫí9"ȦòvËÉ»¾5‚­ç.ÿ|£‹¶)e¦cö‰‘ Z@õŸ‰ß2´ÏÍÕPÑiwa­v‚ÍoK*¿>Òçîi›Nó‚9÷¬Pû±”0ó­‰Òúu·:Ö©Õ8,N…®î×Û03gŒžeˆŒGä*+îsóMT´ïš G8‰ßh^T$ªÔÜŠc=JŠèÅ ª 5ðtÜX€K`Cõ€ÿÚ—†¯)I#§„FÕ™#ÑioQZ´BEJ‹iôwmÓ±ö¼Ó+“Z½C†–âKñÂÚáB¯œü çº^Ú|Ë4æÇ&üUmÖÕ%Øe`àçŽ#¿ÖKãwÜ"‡GƒÆÈÂk”8µÓ¼SãU¿ùŒg>M}a_φ"ÔŒ´¤§W¤Kkwq-’ êÇLq¸”´õõo'÷‘ EÑë0˜Åj8ýËp,{´©^ô) Š“=:›éàÓW–Èοz‹IŽKÔ*éÚW·G´†IíöIrÒè±)ß²ÆÇLò²·šÒq„ÝÓ¶ãŠý;ðód‰ášøChÚùÌ£eÚ:±ÿWÒ§ ÂJ006¥Wa7ÇÆüàÝä4ô/!Ê[§x(9PƒA¢~H؇Š6 (x·åç@õä4öÌqâh@e}Föšnï›”™^臯Ãi‹ÝøKÓr#Û…4öÉаŸa©D0`v¸»-ñÑV׳AVxWA»nÝI݇{™¥êÝÐÕu ûÃÖëÅ“NKŠWœÒ^5g± 1Õnƒ: ìûƹÌjaÑœµä(Œƒ‡ö…—zì8ЛsŠénëß@hò c>yÝí:tÑÁÀ«!·¶Ù²Io1òèÃUÇÙ0lfUÓ\“â™-Âì'ZYœÎSØŠÑÖüÚ¬œ5M·™À@V×={»O-Ú.\½ÔÒÙt[g ?;*$°`Nò^:ÁËt9æKðH¯@eÇçY4Ô< Jôµ™”ÈÉo.ÃÊç9« ´]ƒsáï"®¦b8ѸØ!ic6–x´žíì¢V,P/ЀÓ;6«ISd+¼àN60ý *Q%Y1†}±ãͶ<*û†eâDpïPzÙ­ÅË~¶èZG'¦¤Ž·jY™rÝ4 MTïÜÅêåÖéôõüõ à YXsV¥À¨ë~pY²i\~›”hÓP¢7xÃYî²»Š_cËÆd67©•,…(ØšÂ3a‡`Ö!¤"Qçþ×Ä·}HŸüËâ1 Ê"çæ‘ä€ÚÇàý.tSù×g± …OéØˆ“¢Cäyº´ë#4[ú‡ÎSè@¤5)ѤqÉ•¹Åt‹hW…«ƒzqK²Œ‰„6±¨²%) 2ê4CÚ»Î'¢N‡é5a‚bZ”¢ƒË|/Q¢L亟¼p CJ®{.*nP fØ-*åÊ)ûúªf ¦(Ç/ .±œÄe`lèxW¸éˆo4-q²%¥"ë²%›ÿ„Ä rú­Ã‚™RaËMIÑÉõ‘žšÄÌÐÚ¹ãu·å€nXPa1¢í¸‚ tTópèíltòÒ©R¥.(ZsaE¨au¢CO‰Ð!9…ˆ|¹gyŽŸpmÃ/ã·Þ¶¶NGe„Êý@+IÕž™.zl~Ý>óµÂ —pIþðgfÙ›IdbÞdÿ,ÃWôy9tQž¯”߯Oí 4Œrº!„£Þä(ÿkÂa®§R›ÚÓd žª4t:¥ã_~:pÁD~ÔNd¿>-ŽÖ2©váe¸ð“2/´YÝV:Hd¿ÿC̨02Wí’+îK‰Y‚½¼K}9¶¿Ô³.I“ë/s{‹2éB-—îìÑÉÌ«æ@VýÓYvº'ƒ#ô´kzÂmb¢±~@ÎܵÇÅö©BB)ºÐ=µ…×h˜·„2 e —„¥–áûŒƒÊ`耡©÷ñeŸE™oX ŸÑ8¡e#F»­*µLc"M¥–þ€T5W(í/ý¿oh_²Î‡«Oœ•Ñ{^Õ¦›„Rb ”¶3‘½¢H´]«_˜Òª¤”|ãËwahfeH4a‰ñ#ô:?Tß=zµ¦_O;}®†-iˆ‡I Ìa‚îCˆžë[™Sgtò¿™1Kò¸€÷¸w¥tF. ¨ž=õOèZްNÍ®@ñq µ5Íaa×Á•Ó”›f>±Ü‹¬¨[t1) .zW0p\‹’ ª*ûÔ uŒgÛä9ÇZVÚMdp/òvWâê}ãÏWg*×éJ,é­ºx·e3NÂ…Ab¦*×m©˜è£u‡¦»fjùüMFÙ]uæœ[€–ºåÜ%:G{LÀ¼žú¦U‰Ñ«(©r÷\öòÖŽ¶_#ØjDSwTJP>ln˜lM»%ãš;jbö¨”ÚIPV ZFÍ5®£Š¨´3•øÐKçq:DÃã=ÔV9Ú¾O>;â_z)©ùŸÓÃJÿv·TugÆ’¯þ;“«+‘†ßCMÿ9pĦ˜t¶®jü“áÔÓ‹Â'ž”¡¸‚©ãÌ~@~ïeÙqG8º~½¹Gk£ìÓý8¹*ì'à†ÇÏ~ü­Cy‰(ú†YˆæÂƒ½Àý>Wôü*MÔH`Tþ?³.æbZ$»l©â‹auRµøf&âeixw°ÓÅ_tSF†ùjQ‹Òú§Ë8¨Ìà¼î¸qAÆ`aË863i„Gϱ˜M>O7Ïþê›(»GÁ~šf7°O}LAb=lAsÙÚYÇÝÚtĸ±3a0öÏd©±sÔuEbÓ\®•í¯pÑ+‰c«WfZ¼,miê«#±7³m š“I|†ËP\QYÚg0¾{pÊêu³7xN;šŸÒ]ÝLÃÓU>ÃÉ[žr Ñ•¯£z*QäÒ‹Yt?^¦bí—2§Qå±jì<º#6ˆý.̰-Òê¬p.L¯ÄCâ¶¡70òÚaj¦jÄÈQí4 /–6Ú¼'ߊF×°—KhÅ.šô4뱫Ëváñ¥ÅP´à®'šõ[R!–@|¼ðTñâ 6Ûûþoîäöï 5 šïŸ¾¨ghÉú`š‹S·ßf:D—Σz†7+Î~iS ”„¢Xw¢.MÆ„!w„fv1 œ@¥8z*WáV˜©¡(ôQâêöÏ»çê¾9Ê9ë’ï—:‰hºóh$t6¬vð¡Òéþµ9ÖÀø,žc =2&í*h9WhŽ·ƒ TÓµ:OäJŠòL«êQÆÝ)þÉYz³Ç‡,Ê¡×]-Íilwë„ÂAÈ1ª,p‘‹¤&*§þP©F„Ÿ)”)­kµ1‚!·£Xþ:™¥«Š&Ãûbé†ÙÏ)hZÇ"ä]d?¨¹Ø« éÈþª«h<›TƒÛ„/yáïO„–Ü™ýÀXÝJ=õÍ‘UýcÕ*lmÕ]Ù0õ–kó%sFˆZ\àtefW ìùÐ96c³_/ ÀÒ„´Ž_\¶nœ‚–BE÷•-°{Y>Z<þKUKЊg}quT¹½‡hÉðý³(½zê·=§‘%–3ƒ¢6÷m8 ×<ïC¦!ÅxTW„ìæÛ¬õ°ê/ãiYüýÞ”Œá ôlà^ ÁÙƒ¢ ݱr0ꄜ•ö ´ð>?¡ºã–êëö©Ýû}è ÖÅ„È|¡t29h_–½J¤Ç}N i),S¾@I°uÓâZëSh¬Ÿeû’ë*®û1 e«Ò-{¦ª‚nÎ|­TYöªë’&×$‚çJ1l´î·‰v§³Î4?š º]$e4­—a§T—›ˆA°«§Å êT_ζhãªÈ«E•ö¯Zì‡&ù®-¼öTHÉÃ|mO±øp‹ó‰•CÞ÷Ò]Æê;§—°"gîè#äö tì§¿v]Ðs íF„Œâ¬"٨ˇÌ9ôÐ >Š”¾ÕžP^ã>wt£Ç 2 Pu§•ìµØC·&tj,¶úbžØ‰å§î.˜rn=ähÆ}OGŠ~uÔq™l´¼©FðPâà ·p…Ä%e½‡ú6ôhçÅÚx‡b{å,­÷6‡+¸}¼šëGšk`eþéOáàNs P;?ƒ…Ö±‹åš‹–ut¦¹ï0›šçªþ’1®MZÓ‹ý-Æ1º°vP‡·$(£W±¸Ør¦ßEë܇üÙõÔ´©Äx0ûvé}¤ÜíÜš* Ì =/í¿ª{¬ƒS³ƒØNi–âÝvœ¥îÂÕ­ÈL †~n¿ýàÐÉòÛrA.—_úäð2oÆ<|vü2³¤ ÅÄÒÉUù)—Âý%†W}êü4Åuƒª5:Jª—ÆlϬùDÌeË“š¸˜Ïš©:TþK½lQj}û#½Ú¸š6\¬p,fæã‘QÁ}NœJ¶ýIîÆbÖsÓ¢ŸÊI¶@?»9CKÔâW».b…A þ$ÎÅþ69y/­5ì€ ô½Çyµ¦ÕHr†îͨüÔþþsÍ,`ÈrßëÏe £í=í¯&lôûN”Iôégçtÿ4ܸ•ÈÖªäö½ð63Û÷r[ªôdÕïtŒQà»ڇéÕÄÁ%† sµ"ýì'2'WWåzŸíÏj…30ó@gYרõ}?ålÛT0Šƒgob +ΰ«‹Gzü\ß®iúÙùåइ%¦žßù:“¸ÂyYYöõ®Ç ìyÏ-C‘_åCÕ8ÿ°6è±o¾‰æGã&KTwïKs)vCŠþøL™ §z©™9oëMl»¹ëJTóÂ2ÖØÊcé8œ°É¸L,ªÌ¦<±E˜>Ù yúÝ3›Ïƒ––âTÂ'®Ýº{&shÇÎéÅÌE,t õÿK§žy6±4! UÊ,¸"d$ƒúep,\fÔËw8›‡!r…üØñÃÜqþ!^xÆžlÙEž"-æ[¼Ào¹|ÙZvÕ± ?®ßÝcÄ8î0Ñ¢72‰ÖÅâ­è=’«?L?„íHÑ]”756·èBòP~€H‚Ǫgg~¨á̯|]Kølúœ¬Ì*Ò?‡¾ _î+pÍV""æ[_1 °Lƒìï¼1ÆÄyK G; ê2|®ØäëÿÒÜx͸kd8L6îÊQLÝÌwDÄÄr€c?ìâ"òò½ëš8sXëøAœ·uZj0P¹êA—?³ù7‰-¾’Œ;~ÚPòƒžƒ0[­9²íŸ¢Ù ŸË Ci±§³=^`l2 ¨ûÔ‚„9úIþpˆÏø¥§¨…!èÔê×vFIe§ác\ îD°ÖBºÍ곈Îóñ|=îàR}‘öf2í%š vLyg1e®aX»ÎЮý¡4 -¡Ý+XäÐãxnÌë!€ †ÏK\`¾÷ÜffÓá³ÅºžhŽá\îà²î¦]MÏ@Õ5å‘lÆü\ÓI_K!_MçõK†.ËP1µ×F '§NM Öjîwü”m¶O"&Ù"ƒ3gœät¾ÁrßÎÖ‡SIp6ÿ´Á:Z;úê*ëäžû)B@5ƒ­7‡Av ‚ ï·_àmL殮à†0àÖ³µ €ï{zo5p% ¿›¯A0Ñ"Ú†ê=LTÓö6!„èå“3þñúyN`W·X»£åÜ™JXéë¾ÂÜp36è9/TõñŒ “F¿yŒFrö‰’LŸÀÆðLEœ€þe£}kûôƒU_I- Þ5܉ͼêc‰pv_Ð~¡†À¹xè×ù¡ì“øçúFh3<œ/0:vøµä•HE’„a^y–€‡³€w/mZë8yçÖ`†E¥ù7ú¬Ù+c²q%Yö*ptËYÙTítp¿þ›ûà¡¶i?ñ-0Ä1<–mD|C?ÙôÔ¨—>b'm§QO¯Ý_×[1xÓú7‚Å×›»M´; SÇç^­x£Vþüuõ%ju‘´$_­#õïPódó0D¹z‚¾JeõK¸n¡?“ïG®õC9…ƒ©¶×ŽêN¸É|†ŸHåºö-[x¤’Ä}[BÄÙKk,ðœþp­á€Ù?"oÉ2ã§Ä+†]èz±˜¼u=âo;fž-ÞУ|ÒPcÍ•ÅÖbÿ±^ $¨i&Ç6½T6¼žg²¹ûÑ3þ„7NòÙ¨aЯšù¹R@¯ÙÀ˜ûB.y(³f¢ C½hž8ñÏ&~Æf¦íÜ …5Ã'ò—øtõ=Ò®$Ìf¡×‰M¶S1(Ì;Ö<;?ß§ä¬K0w©9¯t2¸u‡Hºuf ô¾f³jSYH§I5êbÿ…N¹ †šÇÜÇ@¸}K?SzgÊ2µ·#o«³ãç[€5O>[Ñç–pgv_Ì!Òü›WaÝYêGͰO'4çÀŒ‰GŠ»¼¦o·ÑÔ ‹O±15^8s­ˆÎžžúA{ý X )nÀ^3¤[ ý3‘÷ã\lú}pŒªµ1lö/¸¨$qAyl|+9oÝÅÆ;,Ü¢0¤s0‘§f-2ÉŸèÑqþ)ï 󗋉Š,¾V=a\@Û$´Lö\ûýô}\[ÀmvágCûŸ´¼Þ6ööš~ðæÜù*‡+?Eåx)"ÚKÚØYô¹ñFg*ÚtùþÏø»¬^¿·½«liˆh[‘º…Ò, ·p‰„þ ËÉ~`Oá\¶sÌÍŸQ6(Ë[d tÏŽc¢è!˜ìÞ´‚=ÁzãÐF Ðj1å,œ» e`ªê5ûgdËO£q¼µbù3ø…-Û¬äˆ|ÊŠ8Æœ ÝqW4Ñë6õˆçîj|Ëá7r›ò}q·n[¢^aùy³$,lšùîýEÈ{ñ„»=~f åJ;‚eÓwäikšm+nn!ò{¹KB8lm*zÏ?C‹ˆôá/sÉVmS½ö²¦Ú^¶Ê ÙÏVi¡2…ïs“Oû†À3Ð84Îãå>åÓ:–‡FóYÆä°±rã± ?‰ƒZ(ÄÔ¢!áqh–‹Æ6;ºÉ¡6³Šw¼iÝ64=KÙ&5£Ì²3C?߀yÄððßÒáL7‘͘kâ C§_þI±FË€ ¦Ð"ð§~=|›™ƒ#&7›N㉧¢:.ëGÓée½o÷÷ÇgÆ@wE—S#“p&š¢°ôº[æ±£Bš6ÓPü·æ´ YUr—ûç©@õÿDýåìÛdƒf×°¦êùí-¨ìíD.…‘“^¬?yþhÖê4a); Ù“¸ø| l¡D’Çqz‘ÿN?¶ü¡KUÞá§¥¶`躅jl„<·3iF㜟ää {!¨.æÓŸú YÎ9'C2p{΂s|‡KìÐ*ÕÄÌk ÛVyÃÆDmCw—3"XÝNBµÝî(­Š-œC¿asYl*U²áé^yÿ3v/ý ´ô-3§¶GÇc…擱û3Ù'Ê^úiü™³ =·ÓëZåÍ=°ã±f\ qÇÁýµ›´zöþÐò·+óÂr Í.ùcù³Á¾w –írÆt8 w©ds’ 'Nڕ߃¦¯qÖ|ì»Cŵ²­ÝóÞS›Ø[,v‹ ñ}Ëêû[‘¢· ÙýEÛãßäĤuÝûÓÝ6Ê|,<…AĆ÷Õ Ó#ãoÐÏs¾tÓÝzo§ô;œ¥f-þd3²½¿u£´ÍúÏí¢~8­ì”[è].®ê-Æš%!ÿ‡>Å=íÌ5Ih•­‹“Þ/7Ë8ëÄY—úþvv¬÷I8öû¸T–}‹Û¨i‡xòVEÝcð/»8¥×;¡Þ¨ H(|[nö©ì⢳ÛàØm¹w/~‘›ìªRt€¨KD??Ó§ÀŽ05À ú™ý™]¢C4[âúÓoõn™ Ò‚ÃYd@rb?5q°pEãðÊÏH. M“ñg[Ôឤ2X?|§³Rdýt'°å¿£ŸƒÈ×BŽIniZ»Ám4f¼t^øq½ç¤_ޫɉËñ) ÇÇ?Û~ €xUÌù µ‹ß% ‘ï×_ärKJtïbm6¬²íÎX¢l}§°÷aÆ“±z}6M­“E7¢GË9×åX®ê# "ü`:ÌéK˜@ÒMv±|Ö;Z C'7÷-ì®[iÜHhŠ¢t W”Øþª?ÏýÝp^”Ë\ù‰bw Aë³øæœhX3@åãy3ÐÍH[bçOVÍ+Ù|6ô/™oê”Ú¿Á¸B…ô.Á³ƒÀgãuXòÙã¿ß7ʶ·‰\w$k¢Ÿñ ù–\9r`élþ$ØCõ\9íðEú™•µØŒPL¤PÍUzÂzv_Ë!…¢V]\#sq!ÿ8¥^áE6]:9øp[$¹/èc§/P$º;XIB¸~ÿ©ãf6ï¨@öH^‹ ù•QlúϺb C•dÃAÙ×å:Ø¥ôÌ ×ÁCtq±ÊŸc/Kügè¶¢?ºy@œ/x"ƒ!ñÉ­Ú¬Ôz:µ>8t}™_ÛºÔ†®­LŠ3 Mt³>® YôÀæ¼ ´NBÞ†xuƒlvŽNÊÿ¨ßX›ø“ºíž† óuDÇ¥ÉY®÷© w½¡¼\(«œAS…†Þc´:1íjd[K—3îòNy Úå©=]†™ðÜ쉶ù°Ž‚ï—Þ.÷O'ÃÆJ÷ Яø. n¨L»ŽbãeúÁÚ³FtØ@IýM2>”[ŸÀäSØxFëÕnïîíØ‹Bàô ªà››LV’Ð¥†%wýÖ.´J¹Sý%Ö¾ÙÅ¡ `Ü®z4k÷l" ^"÷Ë ÍA*KèuVU;Ìp ·2QvO•gý:¾[ˆø[°Vgü[³‡ZôtÒúcCëàV"d*aê:'X"¯Â°òUBÄÒ¥;ñì|ízëòc%8®@Чä|?UTP˳rÝF‡~6˜nz’pû~pÿEÑI†¼ŠË\,£CBðHȺ$ôþ|L›d¿Þ‰(o÷e½”G[û³FáÄS®]ÿNïëk¥•åªVÅ#fÍê·¼wÚç@xÔV[wåöÇçþµi¬½è*—!fsnÛÌ…|l¶r‚ ªÔ6njÜNºónL?˜îº>ïMûE';àú¥><½@5Çd|GŸW ·‡FÖ<AúØ•„NÖéúÅù©¾c€Z$¿õÏ‹žW Ó…W%ÆLvñ}Üì>2Bh„(ËÇaɭܹsmÅ×öww[û°ÚØêaér´®ëOBÛ‘,OþÇ Q#S ½Fm/’SÚ±~¬†v“ážýyŠiÈæ.]÷Oíú¨Ü™´†‹¨þú9L ï¶jÑÿ q›We.˜mÃé“I\ª/šofþ|è3!«faÙ¼SNš¤E“|§=Ë<;“²ê.—ûšW]j+õF³éAµ/áü/1Ð8V;ªáuµ¾_·ýmñK$Þ^öù¡—ú®sQ>— ƒEƲ֎Ë]¶zíÛ&,k F>h9>úO<›ýG5ÖSõ]˜§ßõ¢ëþAd.Ù;<’×/Î÷‘â¡KåS]ÝóiÏ„™ÎK˜V| ÿ„bß—6œþnƒÔÓ9p¬ô÷\ýi !hg¯` =ôÎO|ŠÁ¸“Ye‚ˆdÛàŠJ‹~1vú*€6n@Æwø:%ú²žb±¬` Ñ =Î_¡g&y¶3›yà±þøÃcšùüËC|ïfïœG³Ys*Pë/9@< |Ô Iµhò=0zãå*Á@çZèÛ;›•†ú:V\¯»ÏNñÉåïÕ-4²’áèZÌIèµ´a–ìx3tv¿;:!v‡†³ÈTK&:ÃÃ}CWÑ®ÆÇÊòF?#Ìy¸léÁö S?z¥:@ñÙ5c¹²HI[9ð;wù ÖdYE \¯Àrt×Ì=˜ë•³UoÕoT÷{Äüuµj(‚~XÀr{•`×e34œ0[è‡Íù_tÈgÌRNÅa‹“äì5Ï Ü âª,È1w óaèüè÷§ƒ¸Ê ‡ Ï»ú8›ÏLÇ v7ƒßà7Úµñ%£ÓlL®Ùýܘ~ {¸ÎŠ„ª¿ |• ­ƒk*G›q·5àßmOÅR5ê™’øËÁ´O5Šù€ípu•&øèF™†º0B€Ø¨€Ëpæ†ZÿépôÃT8,£Ø•»„F€âåñ÷<{lS€â±ºNž¶ŸxÜ* sC6‹_£níšëxNú3õëCèi§ƒíй‰v8nÀÅ»ˆæ¥1W½yÉ{Á™ŒsJƒ)Ó½;ÐÃMª°²ïÍt=XÕ7€1üªûòÂ;kê N!Ù2 ž9l߃yvN­ÑŸÓKê-¦ [é'ùÀ½ÿ¼îWÌz”Ø›Üê,K>BµTOÙ!I!ÀmOto¬ò’1EÝKk¦·Í¬³o™Ü}|­„¤·áÂ¥ÿ¸U›é¸õªMúJ&j¢¸ƒ<<Õ–ÒÆXl¹ðÕ5øYV²É}ì.ëG…LYgV't¹úóù¢â‚-ÌŸ4Ùm£&ß5_ÈÆ$|÷;äS|¼ûÄá|¯·Ç4.-óò_ýTC˜w¢`ëÍÃ#•Äî_õ\¡ã‹y qvÿáðÆo¿~œèVœ":™) > á¾ëüR/×8ìCèóŸðŸ³Un^0èЮ9‰&!ùà¿ÿÛ‹ù*«úC0ï‹#îÛWûén^:³ºã+ki?ñÎ1OWïö(o»ìoi6QùÍ÷™KËÞµS¹šV®nÒUrÿëµM—Äù"óaký ‚Á9UæÀ ÎßšwjX6m3ÿ¤°îÐÁAÈ΄Ôw4µJhf¡›=aãómuì+Î1ëzåÓÁ¬#?f%¼‹#5Ë?`ãVÜ>àbfï<áN,ªðLþá«í…þžpmê²v³‡%Ρ›xA2q˜j”ƒ†û)'ÐÜ%¿±Ï⤵t`{ »ÎßKvåÁ¯}³µ3 P-Êg£ûE7pnùøŒ·+K „óù9ƒŽ kuÏðÌ­B㯲åéý´:ô\]åá±;öù“÷-ÁnsÜ|N0õ.{çp±÷Œ ýü"!Kשo¡?{>fíîéY¢Ë6Õ΢·G·.ðÓàüWáìr«®’9®ODXHiú]>‘ Suœ—*îú‹·kY$ömiÊq2ñ‡ÛwGÿJÂÔFK5¿:KûÁ—šH¶|UáKý]×ÜoÖsÝÿ{•TXº¾±`éë†ðñT4ßpýlËO:VÒcÃ_áâñÇÿ±ê=—>Tð¾q9ÛF?¬ä†xaÐH]&‡ÐŸGné ¢sȈÞoàW>$ÈfÅ!á:ðU‰jºŠ¥œ(aÆ»U°ËKÍêFØÕDŒŽÊRk¶{4æ3ðwÿ‘b¢,ðßY­ÂCï§f¯ÆkîWŸ×ÅÌoY ÃÁŒðR<ñ®ÙšíûûÏêþè4gz)ÓuzáÙ3z‡$ú~õ6ª•#«Òà[ c߃käl÷×%A2ÐÅí_™íkxp«Ëù£›n)Øü6̲âZùñ­€óiÞh¶ƒ÷DùÌ`‚UwŸéføL<û¾ßëþÙ3¢n Uëƒ[@³Ýr‰îÚP–cœlo6Ûy‘M\â DYV ¬xœßµˆeaS¸ÑDôìPF>~aS†Aw.ôúj½ŸSÛñìu+%¾+N©,¹CèÏúÀ=”¦ 걺 Ôg¢Zš³†{myËïÕ¹|¯B™‹DÇhîUûØóëàòU#éϲ÷TwëxÖ¯=j etºj³þ2èzý¿–Ú€ï ýä6í¯ñʱš¿o3e’ÚILÈy‚µé«Ul|9‰ÁS…ÜjúyÜÙ‰zqæièv…Å,{öÊF—Ÿ”ÿ)\5Za(§IB°CÎVÉøù&Ÿuý™ïˆ¢0a¹eጩh±åér,ñ‹Ž™GÒóqÜm°9“û Þ•8ùÔ :²au]öÞP¬®0¶5Þek‚)»¯èÕÚҋΩANÙíííÍ9™Ï¥¶ŒÜñÞ`C1é°Ÿœg:žª¹´ÅõF?"m¯8ZFþæ4¢Û£øʈ(l½›hÿÓåËp~ob˜r+ õÚÊ¡øn=žå‹„,.øŽ÷1¢ŒxÇ!tØìÏÄõšC«N}cp*|G–ÈiœÆ_CCÑž­W„‹R÷4~ÃLós-è¥Àïûmjð—Òà°eÇÓÒ¾ð¨±è–ZÝ_oK®Ä%z¡ý£Óì »¬ÕNÏêÁãƒO3Nš>^?4ý&9ÿÐôÈ£åÈç¹r[ú¥Ð4p=ð¼%Ÿ‰ÚË_Ñ EX¬SçYìíŽ ÆâÇkSW·1Öá…Ÿò²Y¢ñ©ï£ÙŸÖĶaš%Ø‚‡¬¡ºÛ‹ÊµµÑŽþݨË|p‰PQ"N¬Ñ}{ݰänõNŒnó˜§Þ‡ío•î)ðàßû~Ûq}½¨í*s˜ùøû爰øoöJמ.Š~0µÊ êëa[Ó…²@«EƒÐy£¹Ñ$¡ï¼æpß«C¨  _¿¥³°â?³/ô%‹ŽÚzŸ+Ð×Þ8jvh~¢‘€Ÿª êÙÞù!ËLŽÐ/‡Ý6~dž—ÈyåË}ÒC±ZGqP=PÁ—±þ¬}.Ûr'#YnøÃ!l€{"“¹ž±-Sûw;Øv÷ÙšŒÖ»…õ¢þÒùPe‰Yú™Éýï&‘3ó…{ !xh„$¹†O×°¼Ì 06&´n ý¬ã5c2@%| ôîbÊçw®yLC¬¶Ä£²Ö'JÕŸw ØD˜:·àøZ9E^Ö’/ÐPñk}îï𘈑˜϶ FëCâ}èïçG<õlPÕô«µÍ.>õ¤ˆHl°àDCÈj”SÓÕ„qìsO…S{2N9AýdÙ°â÷g’×»u‹aAðÍÿç옘H‰èµdLäÕÑ 4eËx±«ƒÊ潓 ðÑÐ8aùÚUtãÏËí±«)n¥#£kÑc‡ÉHÌ}ºwsãAÓÞü%Böm‚OïùBvýìø ÇÌÆ÷AÆe£øÝ±JŒ9Çü¸j©Ëþ0'Ãý€ôæLtuîuýšeݬ3I復‘çµX š¡­À»ØîÎ?ç²Ù$awõ+ö¸UȧJøòdOüϾڇi-Ú0®© µYé³1å=šöÿy7ñŸ£‘GÀÖØ&tæp[ ]·Bà_ x9wÂØÑ~Ïê²Ô”ØŒW`õ¯9Üt}jduÚá0˜ŠÝ°˜•RJøgêÎDmÛ˜©:z¼+µ×'²biÌZ¯¿ƒÍ߈Aïá¹4øâoôâóÌ #N|Ó§ƒô÷[…‚Ϙkf÷²1jÓS'G¯€óÕ˜­¦…c²"%Ký›…þŸœâFk&çác/\ð¾v;LaÕôAòM½àçS?ª ËÜ.%±Ó¥®•ªØpþt9òeÖ®ûç™–¨à&h.V¥q3Ü*†K!z]ìÜ<•ŠoýÓÌ·ê6¸Õ£˜…‡ÊäÔÆ·…¾óKÌÂüm;mõèJŸ÷GéäRÜø:m­> öCBäÞUy‚6¾œÄ¶8ÛýûÕ(?é’Ií»-œ¨¿ßíí‡íÿßÿ¬Æ±#®cÿ0õö_a8ë»ÂÞG€D ªlï†Å–h>Lu¼^üð³‰îsýL:cQ zk^¤þºØ·}·â©^êÇ´\ý ÕðíGØþ*‡÷wÊÙæ“›Šo2ì¾ Të1Â#Àûá„ëmAq ˜06ÄÚ^¥Å0vòKÁ–Ž|?>îï[ü¼j8‡ÀV¦^j…±ï…ϯAõšYZ<Ï3î »÷åæsüA>À Ì*pW'ž©øTÜM<1ý\9ÝžÏjª¥I£-ëìŸ(÷·¬ŠÒ-½lN¿Ö–ÿˆ+çMY¬ËüÃá‡n¬z«ô§¦ê$¤U/ ›Â¥©ŽaaÄplQZhá…Ì ¼zwu­¯Q=PoŒå 4ë2±ÑkõóÎ6ý>ó[Rú{Þ %ÿqC÷´ª8|æ°~³½Ÿ¡3[áùJÍxÂm4õÞG‚7uÙý]ìÔXCñÑ\rk`FïÎ÷Z@ û;Cã/eᑟ ÷ƒ‡èÌ&p…»ÉØòûÙlãëcÂ!ô®t©2 …*×é»4®ÿwð‡òåø‹ö˜ÒtïÙJ¢E|댮„nÌÞŠ*öüL÷aý°Èy„¥Ÿ£ýâ³ú- b«YL©äðѶê³hl5õïõÂ>Ûcc-K‹í™CèØ<èý)`HªQ#> î'×rÒÎÏa›š_J¥;­´ã¶XNµˆGß ¯ÊThñ)æpt¼>›<‹Ûd”»ãuqÅŸà&4‹1^¥±ÞmåA¤ Vžb‚ÛOÈ£ÀžMõÞòÇù¾û®g–>Š¥.Ô÷;&}` ýFMßÏÒy&N{Ò‹´ãose+_ùŹmyOEÁ}—ê÷ŸÙ[£1\"y{älöŽëùsþsLù`j +Y’A7 fñꆂÌU ú' ^Ñ"Ÿ¹9´q).TZéK_ÖùGvâŽÛÎ{Ó‰<•5ÉX\rÏ2¤1ز˜¼öÏ=Í‹û®%i5{òòég¢®cÄçî ‚‚Í4´ªfökqcôpÿƣͽìñ>ñfÝFv‡å¿4<ÇEž6ÿí)³.6Ìü,°¼QD;Üáž›^|`Çûǵ¼ Ö…0‡|Þ¥NZd•^àäQJW Ú+ ì«Ù¦×ÄÔá _Ë=f{2€»g§¿¬´õ úä«m­Ý€û挩=D?{RçÂÀ0ýhV‘2Ôùš‹u{Í¿‹ûøÜó¿)eãÐo}ÖÎõ/ÖÅ Á¤Íªq§m»Žg´¸¬¬òŒQôëZ‡¤¥( úö&Ñü#_ a ñU Ë?|»‘•!|*h×(À:T(Û_€*¯ [š«æSo¢ïaçÙç)ãü-ÕioËJ}+»:}px±,[€z© Éø¿ã[¢‰1àdäše•¨!NÕ•º&haÇd£é³ºþŽmÞ–ÿÐIäÅÕÑB.ËR([++#¨ò7F»úâKfßOD“vÌ<õ˜œ.Ù¿íÌòîQÚ³aI1G3*žê«{[e£uKý†+ƒ:é˜öd o}’3¡ÿ7°PëòiÜ@zî¡å¼‰}äLž™«Êºµ·;ðÁ½F¹×AŸAÕc&ég1AØ >½rVÑO×¢Ýî•OB¨ ´ßX~ÊgM`ПîL1CHnÄ'ê=Ô×mTƒ–ÿ¡¬¤7ù±¼¹'Fø |šI;‚ª5Ç öú¼ÈŸº~«ŒåZ ó%H¬úâü`ghçè—»øG¢¡37ª‚ÝCŸ«3‹2ËÅŸ¡Ÿ²'ïn -°k\·Ð=VO7ÁØöªXL.œ7õUuêŠnÍC.‘õ x~_rƒþÔ>Øæ´ÃÅuw.¤¼úo5¢‚Oz¿yµÕHõ$˜8̵®ZUxEvf.€5öÓ5¢³ºå6W‹ÝëZ Ú8Æ{¼éd@Å”]ÎÜ/Þ}ïO×+Áy2²W þ!ÇÏ-¸p\…´† $[d†W¦;±»ª‚öäæ-5>âÍY¶é0œˆ [t^ …Cü§vÒ ÏÍ™g0èÔþP—Ùæ2niÖä_ ŠOôðì¸÷+hÙÞë⫺ñÞ¢Éǹ©úi¡Ñe­eGk·“ûb²±ìDãTÿ™#Çÿd°òíKõäÁÄ‹­ø$çóËâA'ê|âM‰=ìy˜9.W¥¶õ—Df°ªv3«(øDä§•!Dï™bÌ*ýNçÿÔð¯ú1?éµê„à’ª?_®É“Ø’7Ã…A¸<6$éëÿùþßÚ±Ï)‚+ë„æÝûèݺ”2Æ¢"ìÓr¦}3(É;»yïS`éŠ×(ÇÿØgüÒE¹ÿûÿú?õ~­þh $©úµ»MÁ–ƒß¿¸úAêú°vTòÖS‚ø¿¨æ¿—8^M^_Ÿx&®–ñüShÌéPmAÄÕàÍ…¹þBÕ–^C¥U¯6Y‹°r›Xë#¯7E<ƒ¸,Áh ?¾kêÏT’@’ôýŸñ;lf„2Ü\Iß°Þ­êÕÔÚÚH?â\˜©·R߬-<—æç'>¡^t‹îÓ½›„â$I$IÏà£eµ-å®z¦ý^ÙÁ­ÍÚx4LjÂÖf¹yø ¾·|fVïä1Ð~Æ n,ÆÝ`ºظ •$I$I‹ùmV6ÑÏűø'w[1‚YµÆ8òÖöÌ&Ë7NËwïÍc˜ÒdÍø´0¨[lÏBú ~ÀÜoð¨4z%Ð$I$IR;4&_z¢°!ñ ÐG¨Ü#¸ÁÓhwMÅ®;0»w¾’R$ÙDâREq±yÓ¶òSb IIÒcØ¥ØÝd§NNµå­u¸)IÖ®' qæ¸Ñq’¤²cáwªÊoæõ[..p¬°®^ávGn_:sÿøÆƒ’$’¤ÿ¼68'ë‹ ‚äG*÷[ÊÓê~f«ó8SºÉ%»%ÔÐ(ì6²õé§:þƪÐxô—H’@’ôÀ6k}tá³cZÞíÈäq¶6÷·‹;õyp8ŠÙt¯·¿yS?‹S’$’¤ÿqª±10Ø2ìK¶®¿a¶¬âgŒþÖ‰ãÓµïD½8˜2ãc·Ÿ¹¯_È $ €$éwPf,;¦iOq`ìhȺsû”åÅÎ󠽡Mö}YþŽI~!I$I¿œ~ .éÒõló=#=kœ€&«}¢¬!‚‘NŸ-¹D¶K&2̽¬F~h±á‘ú(J’@’ô»¹ˆJeÄßrsyúý ŒD·å"Ï›÷ý`j/~C#α˜½\ó¯j=AlË#(f’@’$õ쟋3a=•­6}®Àç¶¢D0¼‘7°ðþ<~jÒè ¼ufç*@8 [bŒæ ðRŽÀva¯$ €$Iä[L²t“jéš—3$ W"8\túhÌn¹µW›ˆ-wC,¹ÿF² õ]þ€reÞ<;_Pîd-ô‘$$•Ê{L´`뛦*÷]ˆ¸£a™Qž8@dˆÀ¦.Þs¹}í¶«¸@)Nk`çmP3÷ù:ß@kO¨ˆG’@’ô!_E±ñDhVõ¶Õh´ÚØŠ;;O»²¸Ô…rE0OÜ…â\nˆç#Ⱦ‡Ûÿ6¹¾ÝŦ$I$I¿RÖ¯é‡Ð©@dÝÿµÐØg²¡šÉä(nE°æ®->}¯ ‚{ì8@•G®Áuƒ“gçøð€¨”pŸ Õø‘$$= ™fß„2†ÝîëAÀ5þ‰ÉØ]±î ¤MÝ™$ Ñ N[Ê%"Œ?lãž÷u'š(w8Y ~b IIÒ”=·2Z]¼æ˜ÈÈ}ÐÆ ‡[)àùéom¹Z…ÀN·gÖzñ 츲ԛì*…íš,Æ„©—>/1$ €$iÖ¨6KÖ5:c]—1à1 à;8,e,{dBæhã™ǨOVÄɜ榃SW÷ämÄ<»Yt-ñ5‹$I$I¥Q]jØŽî/®>~ÿSlÉÍž‹¾6^¬Ô<å?ä®» º2ŽŠ”!&I IЬ±í¥ŸÆ‹ª\y+7g›˜qOÓ?ñìõÖå‹›P\v8~ö¶¼˜,\3ÐG’@’TóKé8yˆ~@»Ò-ÓFc¸à l»Üvßõ:ïÍ]ÕºùxöRö=[»K I IýÔ¿ôȺYè¶àRº÷úš´Ÿ˜ã—m>ìÝØó ¹þœ ‰^PÛoŠhªßf=:Ä=’$’¤e›6‚Ðé‰8ôÙî¡ÀxØbbëYÐa ßÏ‰(å¬%n)4ûîEö:r]ÞH’@’$úilk¯xd‡p¯ù³hç±åz¸ò5»zPðGº±@ÕqÍñlàsDv œkï¯oHJæÆ/.ès‘$ÿE w+¬p)Eù‡\’@’$µÙäb‰§è«Ck s‡÷xdf¤ñQ-¿,Œ¥HÇ—‚kÕ e‘òÙíÉøjiêÖÀâSâ%Ф+II’4a¬ª“WµKÛȼ"Ku±s 0?[ó÷£Xa\?-.̼"NUw~²Š>ýr>xðÉ–$$IÓ¦…òD„ë-m¶ú½ ÆRŽ–ñÉqÛl.oÆøstzX ¾'Î"¬ùúçtˆ4µžiÜr–ˆF’@’ô Ÿóo€×,èÜçÿ±Ø­ %ü­¹½TÌŽ»€UÅ OÇ|…ï|yz"§³>™T vß“$ €$)64½¯þ40™ì¹šQT±¿ã6üòˆ—îL·Í¥„³Fß4YuæÌ;œáÉ\¦zoŠÕ´:L<8ÍGSè#I IÚÏ@wÙâþ£×lÇÀ¬ÝRK¶úÊO¢œí‚?ÓEf€Ö…¢3¼ùƾ鶴³Nž¦µÁßdVeó¯y‰DE’H’¤+þ¼Ÿ-³6¸¸ˆ‰SЄ|“£¯¦Ñ’¾ºšþ‘ž°¨ÔYH?˜˜Æ©åä íÖè¤Ó†­µò04II’臱-Á ýôU…<#¹šF‹ÖmDR6cGãN¬FmïþâÃ~mõÜá8¸F1oyVЇQÁ@’$’¤»Å°ÊÖžHÄœbÎ ô48Ïé$6õùf¶í<榞ÛÀMoBŽ]˜˜trïúÈ–"q¶|öØC.I’H’nÈ€Ì46ûbV›[„ Ǻ.Èhf¡æó޽°Ô, ÓÛ^fÍÒM2ÀºÉnàV7«ö!%Ùì¶i^å’$$¹æ|%îÍ5«¼†¾G?«èƒÜæ3§A JuIÅíÒ°ë^ŸÑ1N±}ÌŒš¹H’@’ô JùÖÞñ.ØÑé„S ,,£ŸÐ†#ßà7vZ’©l.½¤‡æö!ƒÙÔ¾Uä KIRN‚×;âüèµ³ëö¨ÁV‚Ës)x’$’¤ßÅ,3&ë›ãŽvøà[ËÀDƒ°®GcZûr^ êò°cQn)üæ¼3Í‘RkIÄWx±“†7¹$„™—Ú>Ì*LÎIIÒßf&Š4Ú–> '~d¯¸ +­ìÍ׳+×­1kTW­¤:ð/ׇçd{>©,l*géö™éþûvo ¡”$’¤_Í1wûM13¸BJnžW–‰~Nº,7xÆR“[­…Pq¸åeQ‘u jÐIòÞ=V‡>pD>°Æ"ÍËY9š$I$IRm¬ˆ"þ¦A?+]½ÆB½ç2qË“Sf\ð°Îâjt¢ ­4]‚Õ7>T3‡õ é{¨v¿K‡r˜’$ €$i8QQÓ‚R¹Ù'²ÃúèS‚J5¸xEÐø“¹U Ž@s¿:yK.ÀØÖ¥»ç=¾nö?(b’$I$IMº»B*J²´pkäþ,’PÞ˜,TS#ÙiùÑ:bV;ï¾iß„:%+Fž›èš|Ú: Hv¯J’H’$†Ð‘‰âŠpmä>’.™æ…| u¢:\Ý·Î+v‚Q°–¤uúצ–·ñã£#`&º}…ŒýœèÕiíÝ_`pd™[óÝìq •$$ý6Z1fˆ<*WF9w0Åqe漕ðÊ+j¥•†W\5q)“¦Ì¿ìÈFVy°îaË·$õËñGŒœgÊ»²Îõا3';í °ç0"à Œ%IIÒ¿(Œ¥E'¶¼ ΀ë±@Ælh{7ŠB>éa³CçbÓð0ubzNPa—ÉJ’º‡‘„î@—ÅËÝú Úë‘2ŸWp›K–uI I’&˜¦I?dÒ;Æè4Ùê5 CzÆå+Ÿê‰êï€Øp×)^~ ‰Nõ°áÐj·Ç—÷CÿcÉ €*~«OñÐ’$’¤®{„Úcé >§f…®’ ò`Ɠ˷àCnÍå+ZXä·#G›ÏFùŠ×yxvª)úi@bÊüH’H’vcÑzÀ/c’š¾ŸGéIâæ1?<ßká¯ú9R_|sî¨y·6i[QŒWbv·´ -ÈÙE ¸å’$$QæyÔ^3'aÊÆ-4¡¶Ð˜FY—SY‘AÿlÜrœÇ‹ò½® Jo ·gïç€qV×(yÜë 0‚¸F’@’´Ûñá'n–lnŽù=¦}MšS ùµ2È% ®~ÄÂð»W×{»”àaW…à#Ø«R“uuÏÓݹ,U<õ–L’H’¤i¿ËíLÁhÇG108BÞËO·Ÿ`±!ߘpª „¨)ùÄê”ãJÁp€áÍ¥#A÷ðÜÁ)TÙq¹¸î˜­DëùY¶³Ñ `IaB’H’„?ëßë•‹Àn®Q-çe«»ë…ó£Õ6•jfRÕä¬#¥ŸYĉÁͼfN••˜±ûNýbóYE@’H’Ä?•Œicµpúz¹èžÚÝV%9”WŽV±ÄÃlÓÅÁµsü ×<«ÓÛ^–še.À™‹²äG¨\Ê“$$5lYî ƒé!`>ݼÑ3QNÀ_çΦéØq°WÖ®]Ú’ªÚ¨Rßý üŸs]ù fö,vdÕ‘n4§èIIæ¶ëxC|cþã(¨›T¦Þ”"¹ ”áôrvd¸yçØ6ã[±àÐ+d˜y4´?„3Ç8Ë\±™éC¯|´ü=’$’$:Vh¦^‹ç.Ç1 &a¿[ÖqPz?°­MâÅ>~‘îø{|Ž· àÏl/B:¯Çܨº æF‚-ê³Ôê%I$Iÿ-þišÚS0˜BÉwãç4·²( ÷›qa›óf@毰ׂžïÂÊÛ¦Ö³VLlc ¥kãëRwiE­UðM>}ðrÿ>´J%Ç$’$!PÓàôÊ<ƒ_';  NçoƒQu®:F‡ð‹=Ŭ”E}˜†hžSèp` »\MÝ}—,"ìßÉþ;I’H’þ{$¸“©e1T5uÆÅ7ãº|îk<_c­W}"&K{cبY½?ØŠô™ª†lyMÇ•G·ŸïH’H’þ5ŠÂ ™êпðã•Æwaä —X^ªŽÞŒRSóΑ÷ü¦MsùOç©gj\ÚÌdÌO¨û.,’$$eÖÜ _v;¥ß2–ÐIõBÎnåDe®‹a¸^ÜAÁü+jŒŸ*ì{¡q24Î~ïIœ.´²–@¸aÅ•ŠðÔ“í-)I[Ã:?Kãx‚((\k>'°^]ƒ&NZm{ÚÅ@’$’¤9Ñ1Ç…Mìt >&†ñ™½LCy¬MM>µðø~çØM5­3ŽKˆ¯Æ&-|þH’H’Ö¬¡Ñnwƒî™­l±Ž¬öPà™`1á8ƒœá°ÂMœ¹3ÿã¥JàhÛƒ² æècÒIn aª-I IJÌž82—E>¦×`Ð:à«cÆËÓã-• S¬cá‘é½õqÃ-¬üyLFwO6¹Ý©fys;šmT%I$IÒ$•€ûuµøu ƾV}>ov ·°èK¿°t8ežòñ/Õ6v IDATO6Jrh÷©Îi½ûýÔƒUüc˜ßH¬}‘’$’¤_ 4Œ‚õa\Ðdœó³¸a…fý«sêµIRÃYåqŸœ %Å¿Âæ;ã´©w†964İO5ÇpùCþIIÒ_! »ec#¦ƒipô~‰î¸1s%滑¸#òh¯"DFÍd<â9–ñ‰+©s˜¶«çï€Í=»ðbŒäÞ‘$$q1t-l¢ñ`½—ÂFÞ­xvþ˜#+޵ ÁÉÐmxQmrYØ’ÐÜš¸#Φ%M|èѳǞå!>’$$±æc‡õĶ͛±Õeýßk„3¿,FF){¶³StqÛØOœ²«"£gçÞþZXÌ6dñÐSéð’$’¤¿âàšoÒfxÉýS2Îù§ôpü,‡9¶!x o††×u‹¿ƒ{ð>*²yìß–Ï·q?¦†Ys´vœá $¹åGI’H’–¬_?Å}c;õŽÕÃh kOH*îÐQA‚„ÀǸ³U‚>òø„%¤í²2hö±ï[ùðVSÕ•!ÄÇ”=.,I…­4aæá´¯äö™'øéSI’H’þ³´Õ.žÅŸ £Î âôƒüyMVO°bÎfÛ_mÏNþ7Ó¾Þ'´¹ÛkÙØmöTrI’H’¶ÖûoŸ¿ä6õZñà+~ÈÆaåëEkàøƒt;DŠr aËŒÚú³;åø_7zÓ¤eÓè͹Ùç{II’8)ù5öýŽí1þ¿Còu–ÊuÀx¶û1¶ã±ËG" I$I" ¥­0iY·Fé–YîALŽ]òín1/ÑýýÎ+²z îˆ0ØStX9*ˆÂàÉãÅ%IIÒf@jVÌ#“Ñþ?V€PE’$’$ߌaiž2·þ6¹‘k$C!¤¥ø´7C{m¯›^ó®qK¾Ø¾›slkh?î‚!I$I¿~:^äŸÿÝ”øÅ/xx‚Æ¥¯û 0n•¦‡ãUbý2¸…¹ÑÔ‘~òu)ÜØ…,&n{nG©ÔLIÒ¯' 1i²`KP7Èð:®¯›ý©¥´ÙÀu͆cÃaÌ]‡j”qSÓ§Rº@Æ/猯LN7@•ÓG’@’['ögsöe¶²M[D0yåÔäê °åVÎŽrk]mÇEÜggƒ”>/I IbIg!ô…]G÷TøÀŒUoØy(ìZ¿é"?ò¼eš÷2Ö>ü0I’H’þC8´{š•(ÃÜ +VÀ eœ–Â,Î,c¢—»\fÿ+Öü¡E(ÿ°Zñ’$$MC#Œy>ž$ª·Ã¢]ÄnØ:{,”\3×ÐÚ{ ]ÿ[²å#’$$í &®¹×i“fM•_ÐÉhlMÇ4p‰šB¸4YFíþÏRÅ_óËÈ!$I Išµ®3ô³\ø¦ ;›Åcã<šcmÃo´CõÓ×§ðÀu_å²§B‚&o„$ €$Iò­ØžF¦ÕAr˜6"Þ¶Ãyñßרèeú™,bIÜP{nqmgk›FÃî¡CIIÒýli•Ö'A NæÏˆõ™èí‰Ï>öüCVŸ«ï¹Ñz—$ €$iÖ0íȯ.»lmë$¿Öу‚ ì›Û5^Ü r„2jßá]\#I IÚþ->oY9T@‹{ð·§fǪÜzËŠ¿…>‘„²s’—.N’$$­Q±·ºÞ¢cëˆÉ-¹5¦v° »Ÿ¾ó?Ú磿¢%w‘$ €$i£¬»wõ΄§|ÃÞ#c+>˜½ <5 ›”oÀ°§BÛu81$ €$iž{°z„ÖÖ“ñ¾õ ·ðVr$ ¤Î$ÿÉjÏN3 ÛöXÚÞç[$$I IÚH?åñ¾y€š–Üæ‚¬›èÔÆAû) ´qíí/=H¶>NóŽ9[¢ÈA*IIÒ¯ã£Ø ¶œÀ¼ùÆÍ4]Š7F#~Ênûþ'_l¼Á•†VÖÚ IIÒ«ŠÕbÐØ?Æž­VDZýZ±½R~´=by”ƒæèz8B”$$-Ú’ŒH·ß±þÓX c‚šÀ] ÆWfÈs×aØvøgôß­œ=µæ¸ÿЪ 2;v=¨6¿·\?’$’¤ôyå²ÍtæüýÏÊlÂ>4@üß8p†} . GŽ#¹‹D%s ÚÀÃŽò:…9’$’¤mV¦cõ/Iî†öN±ÈZž9fõµHhg"@&¯m^?>“ 0Ó´ÄSKàaQðyÚ…£@IIR_‡³DsŒ9ý:Ö¥›ª¿g´Xggܳ×ôƒ«•>L.‡¬VêìE?ÿ¶‹ãk³íG$Ÿ»½ƒÔŠ—$ €$iÙ†ñ,V`Åa †˜ºB±C«k¥1’Ži/ÏÍÈ pê$S|ÿ †ãnM_#]€+Îø–Zãšlë…K’H’~9ëTV¸Sm’¬íÌumôãêÎÁÉZ!ÚÀ~yxppý¬áäýÀ¦ûk>M<œÑî#±çO,2’@’$ôim»¾ô‚¢¨Z‰Î Tè22¬xÞ^|ãÈÿWÌ J—bJ³ï)°(®ÜúKb×y¾l+XŽ)DŠÙÖK’H’D?)› ³°•ñHv ¶åØaZí]AÌ 98äY!wEð,öéG?Wþ‘6Zú‡¯£­m¥¦‘ùdm¢ IIÒ`R%~a¥ÜbŸ p[¿;ÙÈ—Gç½S±(Ƨ‹#Žëi^Ìßo†QSCYͯÙs3Ëexª‡«$ €$鿆>-æ˜ «™;.yQ±MÎ=Ðçû8·Èh.ªÎç:EâØ-ÞaŸv‡Ó‡¤×°Ú«R÷uC;0™õ!$ÒH¢ÆÞX7Â9þ1áeq~5Z·,ÇõÄ ¹ê*ÑÝY#£uhzš¹‡üË¿\7ÓFƒoµ1µ€ïgÙ…˜´yÁ7ÙÔ®b I$Iëºàñ©{T Æ,†ÕO G?èž96°xãPqí ßô½þ›:‡ö°ˆˆF’@’Ô’uB|N?~¶ÞÏZp1œHéçpqKUy®ûמ’ä­F6ݵÎd…|O“_å¸7Ù†T­Ì94VÃI’H’~7ÿ‹`–$‡+-1SµÜÇ5¦{ xÿ“žÄ%^m!y•çIŽ[›ç°Ž6âs"˜ $tA>û¾t[?Ï:Rá°¿y„(2’$$ÍFÝô¡Úk:†õq‘.i%!0IE„,’‘½ãfÁÔrDˆ`ÖAWKÑsEiŒá×E¬ ŽÝíÙ¿£šì\èÙV»Ê*n:½˜G’@’Dû'à¢Iуs¯d %Þ?¶2ЗYZâV·P´=3cÕiÈܳ÷˜*ŸF}c.£c;1Ûõ]Ë÷«Qh“„C’HS I±Ù™(üÌÓBö ábÎÙ\¬Š~xwŽ»Üõ"øüÑ l¼™ ÚF ²_Œ¦m½Fè“$$I,ý+_Yfø÷1ÉF¦D¨²! Ävk@ýH·ôx}¥zw]žâሟ–©Ìð GBTDkîåEICå%$ýzY»‹}Ìsˆ$±Ïögîq€¹‘Jh]N¼[#äÙu*ÓVÑ/x”˜ðè'Ëî÷ñã© ÓíŒkXRÈêóZ|%I$I¿EyØIRv0[>Â,jž ÿ—àŒjl:é”íåÐa·ê5jë?,ú}­s½C¬+%æ´†0¨ìHòüH’H’ÎÖƒ,ÙÜ‹žXªëa }ªBÏù„¥±Á,ØYsö@ÿñœÛd<2Õ¥Ë6?{_m—u~*ÃM’@’ô_‡Æ.ÛŽõ#º2 rÍô%égvu î`vÜØs¯ÃK]/œ%<Ú“`ªË©`H’@’´ÅV¿sBŒížKEå´ƒu«G³ûŽFŸE’@’ô›”‡ÛØÍÊû E†ó€0Æý ({¶g¾ÇМ\YúGË­0“‡Ã®¯šC˜]0"Ÿ¯ã[ŸZ~öëÖ>Ô$U’@’ôúq*YÅg\ s|g»Ìúߎ֤Ÿû‚Û³ÔѹåB¾åG!É…â¾>@“#Ä,FœêDÛäjʘH’@’´€Bƒép•nÆðq{8áÿÌ“¸)‚¿P”@ᦛr¶æy? ^4ñbz¼ôÅï>‚¸éïáY½ûõ¬:b IIR•)æÇ42ÌÅVp¶xE-q2]™ðÚ~”MÑfï%ó ®äqYÚ³ÞÀÌ=õ¤§±÷?\WËh˜0H’@’t0·‰ÅÍðd¼Ôéú}ø¬Ýi;ªúv´ª‹)Qº?ôc,ñ 9Ý#)6½áN˜"ë¡,¼Ú8µ> ›¹ÀxðÊ“$$ÑVäú#Xš E¶ÔJ¬}Y §wöÛoÀâMýS¾ƒ;Æ£u瑨ذSAgºR"›Û¢h˜Ñu ‰Œ$I$I,*ö£ƒ~‡÷ý°QA?¿é•H0Q (ŒB7>Õ >ƒY‹ŒÅtr†À„ÿÀg{B 21$ €$‰ðbà#GCrñáT¨£Kðüœ¢×¢£Y”¯5­}Šv]á(ƒ ·(þIÅC •CÖª%{N×¢NOjQI’H’¤SíÌ—ßÉ6˃yÀ•q¦ÇîqÓDñíD’Ñ.Ïμ9y¼Ñ>*v¯1ˆgÛ6iê/ €$IºûtÀ2ÅðCXrr½ÓX«Cº'Ð庤E¶«ÏÈc‘îæ|ÚGr¾þvmž¯Æ¶¡¨IÁ÷9»Ã”sG’@’´à-ˆö@ëWýä±;…ÛÆKL›hc¨­ÜsoE-ßqNoBÝÖ¹´Sùç“Ù*5 I_Óµ€B½µ^¯šFͽ&—í$I$I¿ˆ~NyÞ™¥Û@ ^ï²{K¯Ð!ƒborTüúÉxcŒa)>ÞcˆŒïüÄb$jqÂDX bþ£0ȺðdÿSc„‚II’ï;¡Â†GèúÁÞ|1Œí†”~ª#ÜÎ’9°ìÔ}ÂY³ôÔ»"N@ü÷HÀõŠÈhÆê}çb•žÞ ª(I IJ©À†!ÌYW¯uZKã…î?°F—ÔA‚«tŸO„Ü$Òm¿WÁÏqŽ×¦ýCˆŠ%¶Z‹]ƒd§3k;Ÿ,1ÿKI’@’4Ò˜â2`˜^¢JêrÀ*÷Ìá ëEý¸ôóÎ?8ÆhÜ)ÎТ!ëÍjû’[M$0Êô-䕦[•ÄŠÆŠwJ’þãú?4’è'°\¨Ìc¢a³ÈÇnîQµb¿ ôþ~PîÔÅ~ðpfõ´³ ·â3„8Q‡ ä!/¼Ô”šPEÝx9ê I/‰ú+~…¤Rb·3¨{„7a¹m]³#¯³7YÚÇ úlH’H’þƒ,„Šôð}0”G§2ó”÷ææþ WÕBÜÉ:”=OAÖ‹»^l 1šµqqqçâ«/žšÎVmí­31$ €$éˆ1®…™êÅ„†¢°OÞãUjϹ <îÑ…—Ö<ೆ¶™6½FöZm³a¯ì8²µ–U(s¾‰½úÎèx¶LŒ#I IŠM…•µË0Ùí íyI?puÝš†þBŠŽÛæ68,Í1¶u06QBð´ÃíÛe|ݰT¡jă%©€hI$IRnϦ[md˜Hµw´t4î 0ç)VÌö¯ªÀ jˆÒ<éÔ]†¬¢ˆKÛ ¢©9Î'+h³ËÆüÙ{êVIÒÿœ”/I{*ˆô66‹HF‘Í¥<{Ü Ëp3¸—s¨éÉ5ÆR¾z…_õŠpŒ‰™>„ÿìþÏ]^Ó:£ ž+Á}&IÿEÉ$ýnÕjâ‘Í·¬háà&ƒ™¥>y>ò0#2þºd¦‘†D×g0v ‰\ú×0æ=(~|Þo}J„.Ó‰6N¹9c""IIRf²“‰¤^ž_ §Û¢=Æ;ÒÍ\Ùͼ¤6ã:´ïFÒÂÆß§Ë«HàšU9ð­‚=κT¹v+D\‘$I Ir¬IÙ>O»a@§_”•ÇÑ=Ò¨+ˆWØw FaÛtÜ«7hÕåñŠ0²”"òæóï]Ø‚‰6ûàRéiÊ“¤«$‰~Îtpÿ'Üí>ñÖ£ŸÃ¨à2V|FćòÏodW¯)‹ÈÂZïhçÝmL4ÏÊòÝææÎ¸b v~nã-•ó%I IrlÎM¿sžàª>#ñ $ c™¡HCM#úÏ«§ÇR\¨xQŸÏŒ¶Íö e®Pë·#µÛšG˜ ñÀùöˆv5n–¬œ+p”¤_)-IRØ|ûõ*âMëxž¸ö¹&£¶cNÊ«î™o{­Zt(¿êN…e€Ø<ùûü]ÑêEVu(S0$$$yœìn¬¥ÇeÛúóýb~ƒê>Éq¬@ Ì`Ø‹N’&žFh“fõaq÷ÁÀ¾3Òç–„À ¼‰åƒèÁè.b:(¿€¹’$’¤ÿ¦H¿Kø3&^™ ».…Ä«0%¿µbPfŠÙŒ¬ &í+ø-0QjÈfÖ"“PŽ@»` shËï‰?XŸnIIÒ/–z†§‚˜J¼ê…8ZÊüãž·ôq½éÓI»þ‰+‚Á ¶­-ï‹;ž­,8*=xÈ€Ø1UrÛK”I’H’†̼0Q{ ²£{—…§¨ÎND•á1„áA;ùf5JÔ2šAã¼%¼r¤e?4LÄ?›­_‹H’@’è'¢[†¹~À*cãÆ|9æÎ¢à$I’@’´‡{hsˆ8º"ùÕÁIßpž½Bnþ}¾šeï± _v‰t†»3oQVvߎ5ãïõ}ãvÑä„ag/—Úý1ÌgÏÄJ’$’¤¦…´Œ~æ ñ=|Õ<£XNaZã]L\o+†×Ìæï€Ø{»§·Ÿ¥´ï«°Õáá™k”$$ý™oÏ‚r̹™1Wчº»°²;¬u¦°Þô4§Þgl_=+ì±Û½8ik÷Â#9sÙ&Ô —‹$I IÊŒ.g#‘ÒO’øcœQvžæ5#ÉŽ&zÚ·;xM÷{o0P²ÕÝE´tß»QA½°*ÿ¦ŸÓlq’"v’$I$IÍOv£é§wd×ZbÏÀ¥örg -"ÏÙgïW¿ +&w¼Ø2«;`ÎÆ®²ŠGHýÛwD’@’ôß!²¥C”Ûžù`TlÚÜ&qÈ*sÜ ñ±ÆÁ˜Ñ+À¸Œ>FvdË~†Îå‚Ù`[õlIú¯è¦@úí¸tà˜¢/3r+4ˆŠ7úf‡®ùŒ…ëNŽ`ëdv³Éfï҈‚ðɇ¡}ŸìzãvÂ1êÞÝï¼o¶ñÊ$éH I äâ)cR¢Pp쿘àÀ|Y ãoí¡áý;ÆyÇEÚµØÒ¯;ô#'$ €$i‚%ýÍ-ŒÚàñVë<@š7lÂ~Û_¹pÏô‰Îâfµà.°ìWgVÑšÁK’H’k”'4;KY·ªA1Ǭ !^´S ÓDv߯ZÌΧÇÖϽɯeËŽŸeßÙ‡n’$ýפ IZ°~ ·±0¬q\òaiöb©8¬ög€æ§®U'0—æ,$ž÷pgcƒlïý·ùÜ}ªð3‚©@\$I é— k›XžX† ºc‰o±ƒ,¸Zš5^ënH§,ª Èõh·±·±PRð¯Ó$Ic -IO>TO÷wå*ÅTó¯“-4®â"Uù¸¾*öª½œ×;²-ì\õ‰Y[–>ýàÙ¹–$$ýO+®þ“TîñMoã;Ó 4(¼ù^’±É«-H¨ö¡»uo)a‡²Ð| 9o6ˆÊÎÓhy8:ÏâhO¿èG’@’Ú„yë$*M#G‚7œå2{ÌÄÝ?k† dQ/ ¢†™„¾5­$\™@œi¾±Á\’@’$u&ió¬n à´(jñë)Sô?Ñ›½5Vë€fkãÆ {]ײ[ä-Ž¡ql¹$I$I¡@ 7I·ƒëòÚȸ¢pÌÆþâ·³à`ÞÿÛµ|CŒ=è3èe¯€^ý›IúïHY`’ä¿"7ëþöº JzÙ{ÕG#yHAëwǰĪ`çÙ‚ÑcXÚñcÞñ-Õy$òýHRWòI’c*ص°^³ËÔ˜}ìòÁÝ|$iEÛ|öÿ>ÛígÂ’·yãD?’$’$Ò0Á@eä,£e³#Ì…Ê:WmÜI^±¢!†ý{“Qz-)++¥€×_»š H’@’´Ÿ,1;SösœaìVïöU­”xûûÔ²¿ü´Ü? tŽ~†èG’@’ôר8ÆwtÉ@dt. +Ö)Ó!¡ µ¢•WÁl§Ⱦ³ç>o•vé¤aÜ »E†­„´„ óäÚÖ£šþ"x<½ը̈Ödf˜i{öþ î¨%7$’$1Ð> KÐ#LbÐó׿ç‚‚yâ+­2&û^Aý³å²Y‹éqW¾D?’$’¤Ìº‚ÿ­‡çàZƒÊF¿W»úm¿2cŒÍãþxÈuÛïòåÑAµ SdÊȰ#~,ú‘¤³THôŸ¯oL¹u¼¹ôÎe}’xÆÂªX },ÿ-ˆQUècíK’H’¤æ Ñçµ  Ä Ã˯S/z™¨­[DµµÒÌÆšo¨M1F¶‹ã’°óN?Ë=9˜‹_Áñ-põXïÄb!IIRŽ!çâͧ¨›ˆ[ÌlŒƒÞ(ôÆšÂ-R8xn~˜ ísè<…†? »QPͦ÷»1s&ëS‘eÿ&ªÌugIIÒï$ ßÝËQaÐE¦0ÈÞAï!K’H’ZVξe¤QÒvljlºûí°æÂà <=v¬ÊÓé§eÖìÖ§ · l¶ul÷¼}›¹ –ÞÜŽ"{GX—½46¡ÀHIÒ¯…œÂW½ÀÎëbÈUÜ:uÙ¨ò9iÛPfëØæ@¶1èãBöðóûqQ@C“6ŽÜL¡>’$’$ú„·d³qhuQíå6U|ŽY#úÚ–Œ#”Û¿:$55í‘Ð9£%lº„6³™©Þ$‡>ÍÕ.…I I’ îåº0"çp´û²Õ+> ]+ ‘ž –¼ðŸƒÁDƒÁÖÁ‰t6 K>D?@ÊÈ£œ-¬ºyÛ}-I IÚdªßæ ¾p5íPm‘è¸znÃA¤Ê$Î_àÍÒb{ÑiàiV•Mß¾4OÞZ;1Ëô1êAš½!Ë4%I Iú}ÔÇápN x£S°PXsÑŽ¹gn«1g•ªÝ l\ÓøÙ”¯è7£Š ñC¶Ør«'¹‡{¨e‘D ,#ô‘$$U¨2µ ¹ù«åDÒ7ì’‚oqûÒÓNh.ŒÝWã°oãpoWîêU^((8BjæN7É=ÑæíêÌZí’$$=‚@Q? 6è-ˆíRV(ú€AD¡Ä³ûà¦S$ÂáþÖà æzjmÉ;8örÏÙu…¼íW†>Í0› }$I$I•± \'d–]ÃybÅ• IÈ~ÒÊpñ“€À¸·iŸZ‚z™pú¢×)èñ=]ºp‚{ˆèæ‰Aµ9I‚òI IÃŽÓt÷SM眹Ɣ¶‘{“¾WV‹¾×ü›¬”XzJ*^Ä?p_W÷aÜ39£ÜK*±ÍÚ­u5ÔjYrH’@’ôK1¨Zjz÷YÄ·åT9u±'qóŒªZt€3­˜î:¼éü3:&ÉÖ}HK,Ê·7ÚRåŽÑØÑm^A•\>’$’¤Üòª:ÔE”ã®a£êŸ:âªõ‰ƒŠÒÖYô²ƒõ&—ýh™×{{­y”Šª„³qÅL¤µÑÓÕ‹Qå£ß›J’$’$ÞÒp;„nýSË¥±KPÒ!·ð© "Éíïµ½V>Þ½â)à‡¹Î±Zåy¨zÐæ{Íí$(’@’ô«1§L鲟ÀÊ!CÌ'ú¡%·5F€/‡¸h”ôöÞä,x…‚6ІE®~XÑÏDÛä'R©zK]äÆ ?Nº-î‘$$½bŒ™#ûA&lØö8·þt±Ÿúˆ8t¡Ï†c¯QØÏzaÌg€*[uüõ›XýniÇ´ñÖÇO39Zé²öÉÍ»PIIÒïe Q÷ž8âÒO´rêé8à‚OB/ÀUKðtÈSi £tõâ}Àd1ˆp;åóÙò_³b|aårcößk>øÙ%­M_fäàIì>V^©$ €$IŠ?¤‡Ð­lsbÕïÅí]Èg’„®Ž¦ó2æhã€WYžüͪ¬´/ó–ÞF?ojvUɬÿ ’ôsº ¡$ €$)Å2úËÈRE—˘­¼ÖÀªÖï_$t/OTºLÎÑ hÊÍÑ1GÔ¿9Çà(Ö|_¹œ,gK£ k?m\åf£]ºf³‡o›$ €$é‹„,‡•;°ÐIåf呆ðUM‘*ý• 6NDvØ£Ìï? ê'·ß‚š"Ÿ%æXîÉf^ÍTÕè§Õ¹®ŠLýº vA?vZà“HI’tƒ•‘ôCÅÝðµöK:]-¢‚Ñ£¬Øø^S;:@Æûä×ó!9YTÍC~·Š7ÛŠ;0ÙȳXK¬Œm:9‘:'I IúôcD½<»}ålò F¿Xâ5@ÙY¡³a Ý+NÛÙ±…ÿÙhØÑË£ôw©™ËëhVƒÚP÷/IIÒª½Z½,þÇâʆ·]Ï•ãÖöê%Oö9µÃ©^»ßýÝ‚èé‹EÅ?Øl.ß;϶âÛO0ÜssE5Zg7†áÙÚI’H’þsŒÃ9:ÛÍ»†ª‰Ø=LDz,õ·i}G k¦™ñÂÎ õ`Ç Û¼{wcÙl´‚šÇŠ;WËr÷¸”mnŠƒ–@’$ÅA6~‡.Öõa§Fœå®g£¹¢V»¦~0ê¼¾·©ü¡?²|9­á]9‘Õâ™r†´¡çpz‘ÓSÜ3òRC #I’H’~- Ñ™`õ:—g´,¯ílÉÔ 2{oÈ5r¿ÁÝ/Ìuà̃K h™§_ù¾Õ^î±à.nážË’Üi8rÿH’H’b3ÃùlR{â÷¢8„AÖüÄ@A×°Û~ïÑB‡ÈzF9å{AÿÜKw΢Žd»Oyˆªî_KÜã/ð“’$’¤ß‡: H(O]ï1“cöÒ†_'oPØ“ó¼çÏvz× ‚aÔdw$À'üC…çu—Q›:á\§÷‰U¥b™k÷¨Þ$ €$)„0±ÍDÄ+35pÈÌîÝÃñްPÐÈòä½ê8—b…,ÔØ!ÀÇÛ'è’ž8Ìì²?_ÁyzlÉ2çìI±ÇöqO9,S¢¼$’¤ßÌ?c ãÛB¼|6›ŒîT?ÌGsçŠ ¹\ É©¨}:¢—$?òŽdî1Ûí·lâ˜4“Ô kýsÝÓ×÷z{ܱgü=IIÒÉ:Åáñ=é²ï´cªÆô=yÌÒôø¯E´kpëw‡±(OÞŽVGèÁi}é$Z6g„º4U-ÛhÒ¢±Çb§u¼¸G’@’´Á†¢î`X8Ž„p ¤=¬ &£oGq áaüOç6b‡3e±FOÆ5G¡H„3„`£êtÒ†Ô“ÁŽmçSΗ$ €$©aÅæH|²”×ó+É?šJ†p§ÃAÌü[/¥ÍÒ}z†×bœÉVoÑÏiSÞiÓ£ž;÷ÔuˆÌg%£Çª$ €$és.C= ßwØŒ°£jXÂi®xè 1oèYÓ ;_QàcIšÉG¦Ôx&ñ©{€} :ÓkCÌ[¾²eÑÃsÅ$’ SùIIRbËÊáHèÜ(ÁŽ­L #|Mé"§óvé翟'7·Ý±¥ûð£Ùô‰ÜN¤LéE£u{ÜÖ¹'zl(*HIÒïæž3f˜ýü€!! ˆz€Ž›çÀ )]k"®/Ö;9qDNŽ˜{X½Ò­`M=gÏýgÖÀ¥1ŸÆ®ôwIIÒÉìà])—â0ˆ©ÆA‹ Ù襉æh•i~»È„?_ø?¨¼bP yc0®]½\/þÊÝ‹´sžk†&ºÐ3Úý/ö` "J’H’j³tÉ)g]w/£*tÊÍó5Ø:Êõú©ìã,Æyò'ûT6Ä}–j¸â¨`,—:¼T‹ÞD<þTœEût©Ms¯ Sè$ €$©°˜?ææ› înÆqsÿ©°æè2€‘ÑÖö.ýsØE’üòä_Wbv&X$‚"kÇvÜåf=òDOjµ³ç84›¸v7¸Ç}tå’@’ô»™gP½ÅÑM>fc ËòÌ"óUeÔߺxØw½E¸Ða•Gë깟ß\¢a“Åìó7צO==¶=cÙÙCŸF$ €$I:a\FxÿÛ8¸C‡ÎA÷JµÃÊ›‡oçaßbºOyò1‘ÚŽÁíÿñjÑD…žf|súc#OîäjQa=‘Š-h4“É%î‘$$Åæ7Ø59qç <ãêGzï½VGyŽ;j%bE¬Ï›%aݶï–\~°É·ôÞ2ê¨rÛáݹiv¥Ñ‚IIg5àEÇþޏŅ•õtW1ŸÁŒ:ç=•ýç§³¥ÀŽÃî¾± ²™¸øyžâA%!ž¸}é艆®8-î‘$$õM©×ë] ùÔÛŘýÆÃòB~@Í)É΄þRÍìpB„ç8ÖqĶÞÃ5Ö9nn×ÿL5É"ôŒ4šYÐ#I IZ6ŸÊ\?ïq¬˜|ªSXÁ•‹]ç‚ALxMVáù+øçV ™‹áÀj~‹Š7‚^…z(<è«5Vͼ¬d݃öÀŽ|_ó¦ào`¨$ €$邎=µÊ á¸nÕ;ÊF4{½F»û5UÞ¾9,G;–AŠrüÍ‹ª>:)Ch3œdž³cÚ¢[Ñ~´]nð;gÝÚ#éGéXŠCÕŽßÿG•$I$Igº)íñ±¿ú-ÅŠ;ˆk!†gœ4tFwi}qØMÞÐ[˲[fYâ—HçhKAÍ4ëÜ©ÊZ=9n!@üÎÐcs­Êù#I IrÌ:_ÔØN,â q—Œ×Ï~¼'\÷°—!ÆpK^š˜ïŒkJ›ÅزqÆwÐ+‰GS[Žf%?XÁKݵ´(™óX s$I$IÓæ—oY‘¸ZD…c×QÒ9óò)¼[·#f úô^Ò;àcÓ*œ Ùíš:žŽìmÝÝO“:5€@{±âIIR×t¦9[I³0ÏòÑ6vdEÂÖ±˜1¨bˆoŽ0œSåddl<Ñ¥F1òv áàèIíîÄ̃ÐÞÝÖ²’ÀeçÿÓ¹8IIÒï…ŸƒÙÇÉŠ€êßåd®aÃã~–KV5؃?Š©€èõí8„“àìÀ±‚ãå°ªP7ºéÖÚ6¤ŠÿäÔ/‚4Ëj7è¡gñÐ^LAÐ’$’A‡ÿ=úfÎÿ¦íÙ1ˆÇñ€Øpy«U>ñÇ–ÝV»î;•HïeXùbÓ!;3;N"‚ǘ(}h³ø’x¦lþ µ>C þòþH’H’ºþ/ÃC§*<ƒª¾¸*îç¶Úuà +ÒÑBgÏ)2ûè*"Ë*a§A®Z»ÛÌ!-¡N’×XtóŒ9×—ÙŽi•$$ †¾ æàÆa`ègyÍ.ݳNËlqÀ‘NÍwBMh”&ÖèxṌFÜ ,#i‚û1CGõfNê”õËóØ4{-@Y×Ë#4’@šé·S¸ÍNIOçòбå¿7»¯~t{¥eÅ¥ƒüpÏ+a—e=SÒÊÚHîÆ˜5¿¶…~à|÷u‚x¦Ž0ád3­à%IIÒÅö€*G|[Ñ:/–€öµaç@fb(ÞÊÖ;¤Ú0íͱq޽4Ò°Nc³Ãâ:îˆÍ»]K°²‰xFϧ5øó’$’¤ßËBaêºÏ w+ç u7øïMá¥Á§pW0Dg‘Óêõ_gÕÿßÞ¹m·®ãZP³ÿÿŸÑ{%±%^”¸êáœ^‰DQ—=XABO‡œOuçJg“š5ýÍbÐý´wR¸Ïj¿íÐW™óÈõ¹ @ÐýÁ†@£_Ƚ®¼¹áÏñŸº<ë„~&Õ6Ô±¡É21Å–½uN‹WürV{M‡Íç§ä»;o}Œî¸·J¬x–yž=~Õñ·Ð]ÖÝTúrðÏä¯öpØ5˜aÍ6B«xœ9­X²¹¯Ÿ(e:]ƒ6o°Üxg A@gX—ÏPšŽr\ƒ@óÁ°µ©ô°•ë²lϦˆÍ¢`ê”üzHŒnyW\Ë_›÷ÇŠÎJ3J—é(6ž#VIÞÒ}@€þ˜= ýña¼!4v*pêXAuJB~(baÓ­©óD¾Î¨:áO‰÷ç Yã«x/çPU®o³™š|œ‹TöþS¸aƒÉ²òÀGø‡÷˜ʈÚñ\qã˜î£Ø:åk¹úC9ÿ'‡Ù¿§¯Šª¦¥ã£;éä†ô•[µ,òŠÐÑÐÊÿ ãy|ã°0˜™ÅW€?n&}øö•>m7ø¯RÆ)‡ÇÎCš]Újæ:·†V›/»WSåõœ€´–:ÝGLe*†ùY­N+çÿEö° CÏQo4庌²oÎ>t1]&ÚÕ/þµåÛèt_m’yv½®ð¤ÄDU¯æ×è°Åžüq"O:ž¹ô5t=lÔP¤±tèÜÄO…"ú IDATH{"ºë¢†ÇØKêÏÊð·ŸfÒ´ÖrçL¥r€FÅÀtƒñôzD4pò “Iûé*$)°ŸXƒÍêJ?ò˜ë6ÛÐäŠË;Mcq ;†wÆ ;ìØâFêKgH̘Êó]Öiò< Ûº™iXAÕ3ˆ¯ØO[® W¨Ò–’½•Y²ÖÖO±@€¼ãWÑjy R÷ºÿmøl—i5/˜åx0“’V_ŠœÉ@ŽØÉ9T¯ëœÅÈœTôü ô¨ÄŠÂÛƒ§¸ÖŸG–rÕ,øêÔ«}“A ö#ÿ¢6Õ<Ø^ÓTB@€­fiÃâ[(2@Ë¥jZ«iïè j^RØ~¼#ï –Ôܵ*»@|°²jŠ]K;Ãô2”W Bع}«óïê±Ö~Óòîô’8 óSÀ{È9È…U÷iþSÛ·óªaድ1>–µ+o Ž"û9•o·O ¢c€œ%]ÔâhèÆ8”à“+í½"Íj09‚S*yIÅ®¤ñ?òÞPºÎñÝ"7@õ3ù™5~oc÷Yšn[²‚z½¡7æý¤û*ðâD)%QK¯³@€þ¶'—uRcÏÑñòé­á,\k¢Gk-‡Ä x‰è:/U=A»j§6=Ÿcïã@€þ²ÂØM×™«Ò‘©ù8g·<¹êäïñY*{𣃴Ðüzn³ ?¯ñ/ÿöâdFÛØ k†üýW®»ù²JZö-½ÑììRÞŽ6}Šªøš©(€ì·¥#l ÖºˆíînÃ^þ’ö>µ`/7^´`7ÇZ¹Cj €?!LVÐF©†.-«y*~Ž{íÇ›{ÔrCmüZ¶ªð ZbïÕ•v1‡`'-1BškdM×KÛc?kÇÏ~­|”ír‘ ’ G9ç ²aŒQøÙÃ-ì‚rlϸµ6–Ï)6„êíGÛ¾íúD €p£åÑË"GèÎxT6¤è#ئA/³¯¥ªöU)ñ¡ @€ÞP¡Žõ•Ó6ýw¸EJߪý(×öjvpn=» ®!÷É÷n‚€ü}Gyë1E^I1GK¶÷iªú¥8Îè†OÖÒŒï)¡ªàÁÖx•äE @î‚eÆ¢”=ÜãUrúMÍnÎZn¡¶›ª½ú›™yÛÔ}ÝP;:ÇN n9ø·î~7 QzU‰Ælá2†ö @/ú‹xž™³-_u–½kKOÌBϲ:Ç—c¥Š¯@¯ýÌ´´‡ @Y³R]Zêš”…4«è%  ¼BI^´ þÆFTØHS¯´ŸÊå÷Ä €¿é@û‡µöc®“TwÕ;í')|µÜðàãu¨¹ã°U_%rz`ŸžúPP]ƒRm‡léFpû™Žz§Nî´”_a?Ë7‚ý @ï:bþæþ¿bEú;ÛÏžrfÙôì¸× ô›ú^»mѤ5»i´Ör“/š\SU‡°à^ÿÑo¿mös×hýn»ƒ]¥‘€_ÊÿxŸe?k­é¶nè}Þ!öð!ð‡°òü›ÁÌÍʆ·l ¼»þ†ó¢%â{@€>sÐM×¹õΤ7yº©±Foõ¢ÿJ9€Ûa àïÙÏßpK½SgÞç*«ÉH@à—|á…W!©ðRºéY7oØïüD(xû‘ë¨Ä%Uß×Ìéºçº§vâ Í#ñ¹›DÆÊ @€Ê¼@/ýkÿµW¯ºª^û®nì[úÊDTÆ® Ù¢L @\}ôÛÒ'*‡«¸þÈÐÚ•­ö±ÈÙöKÞh$œÓ¯™JrðÛ '´áŽ¢­¯éCn!”R×r[Wýãvk˜ÕÜÒ‚ð;}çH)Ï=öSj-¾ÿ †—ÔÞ–á@ÀïÑ—W ð7nIØnå¼CÎô"vÿ—ÚÏýo5Ó«}ÚüŒKÅCãÞ‘vûQNè”èû¿ ßMËã2­e‹²ÕÝïV(R€ €÷µ9ц†ÅÜè?0®g•‡Z0yð›FÌ‚R ÚßK÷Q;ºõ_c{R[ô^_CÚ7Og“6!œãƒ´ñ"7Ú&c±œm¤‡U—zÝ5Ího²mŽz Óy„ ûÅ™üT7_?sæØf¢m+Ý·º`7&YimÛ³=ŸFÅêzÍMøDzáßÁ:+‡üÞX}Å~Ê:aúËQ[˜Të@[@€ &!3X/…¡ÚÅÓ±«Š–iýñwud¤*›„ir;µ- @€~“Ù첃€1 ²‹”º€n¸¿íL[ïyWdóg+¸Sq~]^O €ðŸíw{•wè”ã—u6#w_«X¾…«‡úWíÛ²ö/|{ Y¡©xžö?I"+x¥ýhô#E›©Ýº Í|Õ”Ý;Áõ*Vø6<]>wÉ"·éHû*M¯VÁÓöãvòÙÏXY4ècl±öj;Í 5äG÷ôdõ*øô¬¨)@€ÊìÇ;ªV¯«jØëò –ûww¡´42e1"%ÓÆÇÚ]Õ× €’Ÿª¢› 림§»ò\\W›\siÿÃÑYÓ)!;ì°•Ü¢ÒUÓ›·üÕÝZ3?‰.`2æìØï¢ý~*Šù~tÒ¾D–÷³–óÉm½[,,·%Õ›JÒ6Còˆ ðÉÚ³sžFG0þ“Ñßv>ÑPzçY-¢CþÕcW[*Ë»ž½¤=zd{>uàƒ]ªýí¹ÀqMêî_"¦dǪö=t ßKÍùõÒÝa"–S1Ü„ö-¼8‡?eg¾RJóTtÓÁÖ›¶òOb–g#«£¹1·€¤F• ë¢ú—LåÙx#5ž­_–¼ÙOIÃ¥û*»zlÊ&Õ…T>)+4.àoJOm(§ñº–ûÚî¹ÊQK‰JýäÝíÇð³C\ŒÂV¯lžŽÙêÛ=ÏøÍ”9b(Û'8Þ=ÿŸ•GãŸy;V÷~\ý­J«äy- =ú¶“QÉ m#@€ªŠ$íGÞÁU%™µ>Y•xjûìçˆà ·í}Ë\´&F”>@€r^” Ä6nFu¤µn"5J†…^S£ }WZóé6­ª‡O·*IØiækÙZ›À'ÙϘ´%tË+I*ÏmjŸ¶-+ÈéЮOÀ}‹‹¹Ô(böðƒu1êÚÿ¡ðá¶S9b+~É`&Jïc´ÆËÙ1í{3œgU¦’ì´%[õEGÑú.R¢â$­- síû¬”Þ̪ÀWlô*û îÉ ^òn·|N–:ÑÚJj¿¸Cø €O²UMåœ mÉs^p£åk'Y»êwÛ÷| EôG¬ønÏ Êy+j¤)Ùõx|p -‹Ø5üQÐ~4=¯7±¦ ÏJѧ¹é-Ùö‘}P"wÅÛXªÕXÀŠ„ª2V„ @S—Pêô±Þ„òƒ4s —‚È[6T.È?Ðm/êèÍÿ4±â¨Õ³ÙEŒRϨmE+;SÛÃk¾%- ø•N”Øöð*;áEâó„ Úúª^{‡Í'ËÌ쾞¤ŸÙ·)ý¶æî¢Ð¡€•aSÁeS‡ô¢/ÙÅé^ïʬVË ÀÑíUÚì¿‹š¤~•öóãþŽˆL„ @.3wH—ï×ÿš§õt[z§-Ç»7(R¾ùÑäo`R‹ôG´[  öt¶tã×'2Ù€yPÄ/6áƒ[ö\Sµr§sÁ¹o!ض{4#mºè‘OC"JS³=OÞ]ž”H§y8$ à=Ód2M¥…‰/ãH©¶}{F§%FÙæ”º¾*xÏùÁIHuÜ(ßinìl‰.ŸÜ%˜ýp6ù?€ñbÃYd²F­XDÔ*:*4¶²Š2ùü¯î‚ó=v <ÛÑ6Îê¼ë‹ÅÖª÷e&£D Â| ×_íÊF:æ EÉÄ—À2±@*MW}Â1íof衃Ø0Ž —F¢í'Zè|Ø[-üª…‘UùS¼Y6‹z%·Ìýí¬øj § @ =ÍÑçíÿÜücÜ{FëjþVÕ‡%'TQëû™žn;yÙwö!‹šŒÎÓÈ0ðx,…ÏÖÚðÌŽI ÷*‡eã^û™¶xnß‹³Û¶OËBÝ4Ok&³# øSä<1$Zí²rý]ÞÃZÎ#v˜íyãç*uV 5¥‚C££‡—g'h°Ÿœ¨,oísdÃ?RäΔëqHˆ2ÝËIŸCв œúVP¢³Åä#6—3g>Óz,‘s D(p´#àá·×´—ëP)܉ù…£b‡ï}=£.XÕuþÏO”Ȏس:ž«TädH‘‡¾þçÎy>àïxOnñ·V®¯Å.'o!ÐÐêæÖwÊéãi¶©'òøÐô{ÉøÂg>~bÈjC‹Ü5óˆÏ¨ªî©’û/zç{Þ‚½Óç¢\ñùGŠÉPöÌ‹  @xO|nwäQõ§1%È©cQÅÅ¿²ëï|•/^“êûàCî=žKeÈê>zà3Õ'}iÄrË˯?³W¾s7@µ·–û®7{N ºWˆ”Iü9+EoZþ(ƒÑ3»±áÝý&sÁàjü@¹Ó‰Ûâ£mŸªpíW¢…]¡Ÿ”4¦4Ï›A#C€çöШœ›Ä™.¿Wen+Þûl{´Ï³B^v›5žOlÒÊbdÙK @Ÿã=;†÷:9š«LB§.žº¥]éRháËXý bš÷Òa(rnïã»O48âU\ÇÇv˜vÖôrnܸîûvt.~eƒ¾Ù‚Íû2)@ƒs|íÉ£SÀÇÛÏê §æfÂñN±ÃGz6ŸÉ’÷¥ž¨²';Fÿu¯Í6µâC™y¨çY/¥*ÃÀ~ü!n&YMTi·Äìפ‰¨hù§;üEÕª´êCÑ%féüŸoû2¿ée ø ”ÚØ0QKLG|I¹ÜQ¥@‘w•>«h®xK—¥m4uÓçóOF‚C{eȾ¿KÖ[E†âÞ“luÃ<ãrì$Í9.-ßWØ6ÞOÚ‚m™íú–ìü}$eÈÜKî4t0€”—•jqä'iû©ÏVžôJKϱ>&Ñ ÿÈkEf›?¯  s}ò' @0]¼q•^V‹‡Â?©,mÒÁ+˜£·ÏŽe%²³"r­œ·îCd#h`9¦Pd?±ðÏ$9Y%÷’ˆ0,{‘ö½(Ïñ—ôiÙE©”®Õí·lÓ%´¯ià{ÏÆ³¼È”úõ¿‹W€wš– F5ÜÆ­X@JÏ…Ü|è'Ž™§ ÎéÂBÙ Ðé—d> @ #Ƀ®ER{s’‘^íå\Ñ¥÷É›hšõÑ¢ÞŽC×øÐ2dß'¶ÞQLøPûñ»P…÷øÖºûë´ºú«¹ST=W½ôejµ5»ü[™µî^ú׸iÁmØH‹]ñTë U‹®uôCîN ˆŠRÏUu/È z¼°MeHáêñЦÇwJR„(y€ÄF¿L²³†ÖÔmÆðrãÖÀú¤™îí°ÛWÎÛõd¦–‚)>O&t8÷ úþÿ¬ @€v Ù~¡‘[m†mNBSJõ5¾Ås·ùJûyÕçpX«7öøk5MèØyùþ`"å7¾?lLHyϬè°îSâ~¶¦ÕgúG>†1ø4g~ÔÚ:/LX¦«ì'>ð÷Ã?3ûQÊ~ä½q¥FówÙ Ò[ Òc‘ù™š2O–¼¼y¾¢”  @¬@5G%Â?Zê­RÝÓj1/EºæÉ3_³¬h%öJzˆÐè±?6mài-paŸ Ý@€V”ÅQèxïvųÜ] ÝRà—ÎM7¾¹fí+ÒƒÂØóÏmî+?G¨~ÙWuz¦¹ €J/:[ŠïxÅÚ¯ÓµsL¤ã _¡nQ¢ÇíO‹Ï}&¤§³+MÈs€÷„l";˜tòÖ {^j¥ysi)œ|ù‹š(Ñ&R/Ç•8­¼ Yãdž  @eêã~<ɉs^I—U!Ëe‡VÌß+åù¥âm^ÃÑtž,$8¼8`Õ~2á-w¸`¿ŸöBw>¶Oøtlé¸R°ÆÅXs˜ñ@€6ã{jCܲߊÁ¼…æró°c¹þÂ퀎ήŒáVøg^|˿ߖïH©kÜ1yºU½PÕ4Íeå§ÀE`’líÁ €BÒÎ&«öûY½zùZ²ŸÞ™«õ­Öd¨pöê«©a@(^7@€òCc¼Æ…'ü#ÏQÙý~†k¾2•Ñß4ñ纆¯«Dr>3…¬*¼¶j(+_zó”!tôLÈ €œ•oô™K$Cª¼òuÚÓÒb1¢ä$Y¼0é脽y y‹f°àXDó!Ÿ™à¸v;ÔcwBõX‹õë]T4qŽžbDf®çýh1·IšKƒõö–žU#€”«Ï±i·ÃsA³ÿYgáôêÁ!VkhzËÞÖÚú÷`ÛÏ¿Æv"óbü ©Š¢Á"_n¥ÿPߥtÄ™z~©óUk_±·m=ÏÒ¸|Å6§p¤3?.ó÷N”&@€>U}j®Û£ymåÙ¢ýDÖë_˜-tgåùn¨óÕi¸Uþð„¥É €ÏSWø'ºn«z¸kt>ÛÏ.£íïlùr*ð—m!oà ú÷/öòõ ©ËÚ˜ÜíÐ+.¡ïe¹MoíHµÝ+,TQÔ u“…€@nHðËE*º´>N-효ÍOoim×k>ŽøÊ®ÊåWÿ½M;,ÝW¢ €[ÏðęޕðOú`ÝoqËß>¡MohOˆ'µ¯¢»ÿ%BÛü¡½‹F @¿CRfc†w_aÏ^A:™EB³s¤ÓMWÓþ[‰Çi‚ScʬºŸõV?;F[QG ìg0²OwöQ# à¥âäã°±Ößü ‚²9ç;õÝŠŠº>N°¡A@bÌ«]•^|µ,!ò9Ù.©Ñ†–õº¯b¯ ­kÐÏz.sj€„?ÞšÙÁ[Åñår˜É ©0¡û5(Ðm4¸JõIËKîl-·WŸØ-ÿªðO2¸Õéa7j[é_3!ZóhÑam *²tf‹æë…¢59îMþ]ÒÓì™åîÆŠõ7A´ #+)ÀÙzì¥!%:>”(BÒxRMP Øm?ƒj¶\N/„_U¤¿<ò};pIDATçåÐŒ…›3ç¡ÅÑ øæ<€:ûIGFÙõGÁðÊ T~fΟ©ªYÞ À#D€ªÇ4…j§ûWÉGK²ÿÆ-ôYßK¼ªFí±NQ•rœ’ž+æ¿~ÿ–?N]êí0£A$\ù?Û}ãà+ÈIEND®B`‚opensurgsim-0.7.0/SurgSim/Testing/Data/Textures/CubeMap_reflection_specular.png000066400000000000000000005746521277777236100277730ustar00rootroot00000000000000‰PNG  IHDRÙD©W CiCCPICC profilexÚSwX“÷>ß÷eVBØð±—l"#¬ÈY¢’a„@Å…ˆ VœHUÄ‚Õ Hˆâ (¸gAŠˆZ‹U\8îܧµ}zïííû×û¼çœçüÎyÏ€&‘æ¢j9R…<:ØOHÄɽ€Hà æËÂgÅðyx~t°?ü¯opÕ.$ÇáÿƒºP&W ‘à"ç RÈ.TÈȰS³d ”ly|B"ª ìôI>Ø©“ÜØ¢©™(G$@»`UR,À ¬@".À®€Y¶2G€½vŽX@`€™B,Ì 8CÍ L 0Ò¿à©_p…¸HÀ˕͗KÒ3¸•Ðwòðàâ!âÂl±Ba)f ä"œ—›#HçLÎ ùÑÁþ8?çæäáæfçlïôÅ¢þkðo">!ñßþ¼ŒNÏïÚ_ååÖpǰu¿k©[ÚVhßù]3Û  Z Ðzù‹y8ü@ž¡PÈ< í%b¡½0ã‹>ÿ3áoà‹~öü@þÛzðqš@™­À£ƒýqanv®RŽçËB1n÷ç#þÇ…ýŽ)Ñâ4±\,ŠñX‰¸P"MÇy¹R‘D!É•âé2ñ–ý “w ¬†OÀN¶µËlÀ~î‹XÒv@~ó-Œ ‘g42y÷“¿ù@+Í—¤ã¼è\¨”LÆD *°A Á¬ÀœÁ¼ÀaD@ $À<Bä€ ¡–ATÀ:ص° šá´Á18 çà\ëp`žÂ¼† AÈa!:ˆbŽØ"ΙŽ"aH4’€¤ éˆQ"ÅÈr¤©Bj‘]H#ò-r9\@úÛÈ 2ŠüмG1”²QÔu@¹¨ŠÆ sÑt4]€–¢kÑ´=€¶¢§ÑKèut}ŠŽc€Ñ1fŒÙa\Œ‡E`‰X&ÇcåX5V5cX7vÀžaï$‹€ì^„Âl‚GXLXC¨%ì#´ºW ƒ„1Â'"“¨O´%zùÄxb:±XF¬&î!!ž%^'_“H$É’äN !%2I IkHÛH-¤S¤>ÒiœL&ëmÉÞä²€¬ —‘·O’ûÉÃä·:ňâL ¢$R¤”J5e?奟2B™ ªQÍ©žÔªˆ:ŸZIm vP/S‡©4uš%Í›Cˤ-£ÕКigi÷h/étº ݃E—ЗÒkèéçéƒôw † ƒÇHb(k{§·/™L¦Ó—™ÈT0×2™g˜˜oUX*ö*|‘Ê•:•V•~•çªTUsU?Õyª T«U«^V}¦FU³Pã© Ô«Õ©U»©6®ÎRwRPÏQ_£¾_ý‚úc ²†…F †H£Tc·Æ!Æ2eñXBÖrVë,k˜Mb[²ùìLvûv/{LSCsªf¬f‘fæqÍƱàð9ÙœJÎ!Î Î{--?-±Öj­f­~­7ÚzÚ¾ÚbírííëÚïup@,õ:m:÷u º6ºQº…ºÛuÏê>Ócëyé õÊõéÝÑGõmô£õêïÖïÑ7046l18cðÌcèk˜i¸Ñð„á¨Ëhº‘Äh£ÑI£'¸&î‡gã5x>f¬ob¬4ÞeÜkVyVõV׬IÖ\ë,ëmÖWlPW› ›:›Ë¶¨­›­Äv›mßâ)Ò)õSnÚ1ìüì ìšìí9öaö%ömöÏÌÖ;t;|rtuÌvlp¼ë¤á4éĩÃéWgg¡só5¦KË—v—Sm§Š§nŸzË•åîºÒµÓõ£›»›Ü­ÙmÔÝÌ=Å}«ûM.›É]Ã=ïAôð÷XâqÌã§›§Âóç/^v^Y^û½O³œ&žÖ0mÈÛÄ[à½Ë{`:>=eúÎé>Æ>ŸzŸ‡¾¦¾"ß=¾#~Ö~™~üžû;úËýø¿áyòñN`Áå½³k™¥5»/ >B Yr“oÀòùc3Üg,šÑÊZú0Ì&LÖކÏß~o¦ùLé̶ˆàGlˆ¸i™ù})*2ª.êQ´Stqt÷,Ö¬äYûg½Žñ©Œ¹;Ûj¶rvg¬jlRlc웸€¸ª¸x‡øEñ—t$ í‰äÄØÄ=‰ãsçlš3œäšT–tc®åÜ¢¹æéÎËžwç|þü/÷„óû€9% pHYs  ÒÝ~ütIMEÛ ½¨gæ IDATxÚì½Ëš$·¤ £úq{=›Ù;9i³à AºGV©¿n ©*3îá‘çøŸ ’•õÅõ¿þ¿ÿ©¾ƒþáå—Âå–xýŠ·~}_†ï)~p¾~©ŸÝ úe¨÷2¾naþÓ.ÁüC0ÿj_«kû—h—Ï›õÿæíC÷¦.¼¾ çè_‘œWœP]+BrÞ`ÜØ7n&ú×U²þ`ð²î ì÷£ð?ÿŸÿ7ÿO ëkëä!ÈúîÒ§|ÚSKtùý‘„Ry‡[¶“bp(„!šP½'DgÊvÆÅöfy=>½q3臂bÍ!¤BPBоI`þe^¿„9Jí„@Úƒ²ŸöÉ‘AgÈx\’þÀ¤´ €ù¨$×›oN?]û¾¿ýnÕ+ƒÙÿ@øÂb(ÅXñŒ|YY @YYÿmüap¢'Ò‰æ\BuÅú²ßi¾ÖNú™‡— E‡‰>öÔ§D’ï'ÚCs(ìSÛ£«‘¥ÓÊ@HÃÀ•…*Œh¯@½!ôw!‡iO‡*…WîÁxµÜ„²U‚ñŠ×ÖAï¢sÜ@¸öê= ž),ºîþðêAÊÊJÊÊúZâxÑË>úcÒÈ>0M° [£åiaH%NXÑg})ýé¡4z€;U@ÜKÝ0pP:رP#5 Ç9Sò‘¡még¥QÜûZ)"„ÕûO¢×uéXù?ú¬¬ ¬¬@ÓxÄþæÁÿüö”×}´øfÔR•V¿ VpR’Êù¥Wa>W’<ÌÇu/Ä’Ã&„)i²K—2–„)Ù´®Ôx‘˜Ý%Ñ­¦##à Š˜ ¼ŽAª6_ýxÕ³§g ÇôÀf›ïÕGªá% q<¡Ïve²PVPVÖ7£OûEþát@¡Õ0>¾Å”»¸Ã»þƒÈ$¤î£;~0htÏxW‘`Ρ¶6ïÜ„%óª°…2 †ücì>غhÐÇÁJKݧ÷ê¶#®¯V‚Îb—ªEmÓŒ’c™È‹@Ÿ övéêÏÁáLè 'µ ¬¬ ¬Nš†»%o°Â7ÏógrŸ»_Mž˜çDî¡ Y ›x¼À… 1ërhumÃÐV“hëA¡?Dï ñI„;ÄÜjõÐàlÂØ›6/³3…îyÃV—{oÎ|ïoÿÙâü‰ô,7Ö²²€²²¾†>¼2ÔLŽLŧ_õùôDƒ=³ˆï¤ð³C³Ÿ†y¹õ©·“ƒºXne§©,=Eµ·Œzáô°éÈ&–(è¤XÜÁa¬jŸ¡å­ýrƒFãc4»êuøÑÀ„H\èÇ¡Ïq\  ee%ee}+õM¾<Üy9Ù…#Ø‹øš´xhŠ<Ýkƒ­¨§e§²ynvý‚çÝÇ“ûᯩu# d™¡5:ˆÚJ€ý ÂÈ@cÞÿìçÁP`èpÊÐy¥­ô–jäáà™¢úd|‡Õ5숃% WÕg>}“$ ¬ ¬¬/ƾ¹(Ö@Þ«5¡ÐšÒ~»ÑD¡ûÝÿ®^‘7þ{ѾÃ;d\·€{iË@l,<²¸Çi*fþ€2Àl©u»‘,Oζ:(”v ý ÏA\@·«;kÏßö£?,X%‹ô«FsÏË[û'˜] 'ôñ/\T¢¬¬ ¬¬/ÖƒbváƒèÁÚÒ»5¾Û-7¢=­>Ú«Ïz“i«<—ãA8õò¨/ýúªpÝÌŽQíã‘Ã.iR-\|¨òËp÷õà¸~Óz‰Á‘„YÿÈû [+)ѸÚ~ûê§Øö„Ðù,¾–••”••ìÛB¢ŸæÊO|ƒSÏøµUÕ6š›&´CÃ3ÚìÛ·[C¿ôÅ@û2Ÿn!}Ï]-Y1‡õôŠ!Œ»ò¾üXz„¤Çdxîqý°m&ì…m†P>0.œéÌB›ùGs“¹ËváÁÉlmLĠ󀬬 ¬¬oƒŸÛˆ/7;#ËQsÙ—%òIO²wâYìQ¨ï³ïó;<À'ôCu n¥´Ÿ1>µšD•§mÈ ‰²E™Qt/‡nI¤ÜHsCÀ=*{Lµû»¨»˜,ñDDÍfTÃ^r÷_ÝdPðZmúZ²OVVPVÖÉž¡öÊyžêŒAó[<ŸèøPÜãǶ‡›wD :/y#!\™ï²*hOm ‚©}¹¡Í¨€H™PàI o9^Il/¨g¦Š¥ C‘-úª˜ØíÔº£5gZÈq¡#²¿C}«¡)1zçVÖêåɆ>óÿ²€²²¾.HÄØÌÃsêE¼XÚŸö61ˆ|`"‹lܼ‘Þ½™w@±Àš½7¿\zì4µœp®Ìé KÑV!ý¨$e§Ÿaˆ›úgP¼³âá—Z¢èÇÉ?û8X@¦áå@Æ—ôDçj¶ÖÊ7Î s‚ô7;ÓíyFà}NtVP‚¬¤ŸuÒá£U™|"^e#wÿÝ Úoãñƒ¯æô_N±µ(–óZú|Ôìfg¥ÞMM(4ôµãÎ!=#ò¢f‰(WI< “hcÇ»Vƒk^l´!øî—p=ˆÚò.趯ƒqÀ—?nLr>++(+KŸÍµî Q`1Ò1¢O„õ¨ñPŸýF%»è­ öÊ4†Þí~¡@’øÑ씎ańå“G·TÑ%ƒ83ðh|é¹whùç€ÌFÇÜS¿Ãñúøô7ºO¸aõ¾AŽSdOt† #uŸ¬¬ ¬¬ýdl'_4±xbšÞäŸHø ›p¶Âm#ϲÊͨtd>†ï²ÄöÀj,ü¾‡ñN!-¬è¨w ? ·!ªÇ5úbÐ¥QhÏ\?í–'óFõZõa%hÞD½÷íG0ËW >nd Ù!†©¨±N”0”•”•õµ²3ÿÆ;8PBú 6.G«„±Šî˜E+FÆãhwKó`å¹Ph÷ Ñcªì,AH;æ” RúÞŽv :Óbœæ!^Èéò¯De±y ,¨8³‚Ê¡ÇÚs­Æ¸º`5–ÎÀŒÅ7Ýö<²yUSLôþC¨}ØëK„Ò”U¿Ž€”••”•õŤÂ;)×”®Ø*d@$u¸|ÑAÈ¥KÄR1Šô¨&†,ÊhåÛMB¡ÃéÍ÷„¿.Ùûuà¿€ƒÔ¿Ó´î4íA‚p¦c­ -Zb÷IõÞ Sݾ)p‰J A¨úùè(ó+†Gë(! z¨k——×Çm|nD4±hàŽs uÉkðÖ¸Åq{OZ÷ä謬 ¬,u*^¿¾kî™^ŽÍ+$—v¶0˜£¾áaJž44r°âD³úŠ´?ñ.eE«Šy †åEOúÌ"DÏ1Ý(Ó§Æü—–ŽâÝÏÝã<ÇŒ¼ã ü 0D˶Hv£ ÷€izž/_«ŠÝ$[ý.³ÉýÄ-7èÇcGûsROVVPV–莃Z¾;ױخ«sðÐë²pÄÀ¡LnîizP$ýhº,òaÐ)ã J›‡øûãí5"(ëP{hHÞ9ýuN9Ý­ñØnæËÎxõ*O´-C¼ìMÆxñðCQJØäŸÛ:ô2=}!$L+Í2\ˆý`¥8’á’…²²€²²úïí!Ûk]kºˆë[L$’Ƚ{@ îºG¥ygƒ£¨×fG/WT?PÇžg®º ô¡¬¥01b¢À%ìT™›E-8Œ]„ŠÕ‡ÄOÁcM•E ±»©EùÉuݧ[¸eýX›Ð¦…)h=£Ï>ºŸi`YY @YYê´Áqâ…hÛ­^aŒ™êà\Nß™¿¸Ó / ö ©k AšWÒ·”-FU‡‚…bÔoä3áw<Ô­žŸo@›~øhŸµ(ÕG’r¼z}Q6)ÈíJtôŒ¯éu4#¦c2Ðü^9 Çåa÷W®{Ù# #•ygXB¹* ¬¬ ¬¬©æ¬éí1†L=x­]©k}÷4'å¡ñ­,\],j$ñ×ûz2b xÛáyactý9oHÁ.`¿mr˜edÃùœ Ú§0¦áh=;c—¾Wq_)»´Ù­Œ@ŠI09rÊ@Ýyß^½,¢›ï°ÁÝeE»nò Ù Zù'Z´)W¹(++(+k`ô¹ú‹™Ü9Í« ™ *åà.†„Žs´›Ç÷¶$JØ`äˆ>„Ï{Xy@‘˜$A*}$NèÃ2\¿=åKw›]ž11%à 휷åPŸe%žúy÷!ü”õgÜsþçÝ ­>å £ç-dD4=Ïºíµ¼>"¢yHË?<¨7¢Eø ¯0Å>É'++(+ËýBlŸ.TN'Œž…:§µ¾{ª7Äìýµ‰û2erëžqÓz¢†˜¨Ñ²³´$Ç{ù×€P«:¤ƒà°_ëo½D`J'X“P'ÿÌÈ㸠ר0öÆ®æ¡Óèý†WûO™ÿ}aÿVô|¼ÃžÅBž(&"ŒÎB6~(Lç«¿UZΞo]C´5ÐÇ#N4ï@ ' ÏÊJÊÊú*Rëû ¹˜­ `O3 õSX¿Jûti˜ˆvãD þ‰W)FŠh¢8Ì‹ñÍ­r7ÒÖ/¼-Ò]yHfæƒN€ðôsûø–*$fááißÏò>G2ÐŒ sãð"‘ ȸ¹6ûè^—̽Ϙ·é*¢ÑWZˆÒ½T¼<¬ :ô8Çè³çÀG÷ÍÊJÊÊú>Z „¹gO-ÜÝÑæ8Hêg5.jÚÄ’J|ß £Ý 4Øè¾kÚ]¬þ ÷JÇãñ¡¨Ûë?o‹T¢™IIW° Í3»Ù¹¼ëŸ¶;wÜ)ã¯e|ŽéǬ ŒºÑüAÄtÑw¡gìø1 Ò1¦~ôÞg­‘ÉZ©Ÿ4 ÁØZ`vÀ¢OVVPVÖ85L  z©ÓuG­õžØRæ0=)Ht,¦øsúAø`'Ïõ+»ä0¸ ã´0õñòÐ3Â-_NŸ¡£^¸6L’ÎÜU“q¶æ[õÞŸÈë\6ÕÇÑOÀAš~\ºXÄ=ÒÑœëÄõ¿²‰u1¨ÿÈÌ û…y• È^GÕ^à<Ð~VVVPÖwŠfAókŽsÜЇþ¨…u#í{†&ýhâ¹[¤¡ÂÏc6Yƒé·A1lQó<å­J¸ôÐGz­[\H5rÈý}õ6áJígkµ+ðh}Þ>µ¹³PDY€´ŠjépÆ~Dv.Û¯:ê讉eˆ‘“ùYµwææg¹mÿ1/CBƒ–TöþWÀ@1D,êÔÚß<& k«Ô@›ñÓ£;bKQóÍDqă“üGHñȘýD³ –•”•õµTŠ>õIí¥©/F£C! Åþ>¯Â>-',·Ð8ÿ/ š®‘(0* "ÿ›ûn`VÆ rC2ÆnWLÐŒWU+*bHZ°&™vÚ¯Ô]ÐæÍAmÿŽd“xa2,T“K9 \¬‡?¥Í‹·épu/³¬ÖfÕóš_+Ô H¥î)úUøÏ2Žø ðèìÙ†¥¢Ô~²²€²¾» °L£Qpì6¤ÎvjP8ú z’Š~–z{æ¼·^µ‘áS2YCcæl¹ÅÉG®þÇ.ü„èã†È ï¹'P‡Ô¥jŠ m«"G:„¡@¨½Já©3 ÌŒ½¯eÐfåaQ_–¢fÂÊÜ mm@rƒ\Þ(• ÓÔ¼T¦©«€–Z¯I5PFÍ2æ#R}“Ó›ŽÊUBPVP‚¬/W€À¥Ä¸õ<­œ&Ô]AQêÔ„Æ_­õA´›©l }Š¿÷Ï@p}"s~´wv6¡õGó7÷k¹'Îï8¤[dýq܌Ԙÿ–i“Vžª±3{8€öį­×c²FL‚@eÄéÔ÷Ò,?Í÷£tŸ Ì‹Ý0ä¿Nþ$ª­>êýÎ(Œq˜´ zÕ8Æa†±Ž;vÈ@-ŠÑáE3aYY @YYߥýCìTXûZ™Q§†¦cº}-BA‘¥µIî@¤*†0AßœâÉ ôƒm0þ¼ÕP|ï‹^Ϲ  >a˜R˜0hÐJøZ¸¬ÃÊ{åxÓ8–WG‚/÷åŽ7:l5À¶uAíkÍ{7«}V2˜’º”Æ8×!úÐSI§ ‹kýa l°ˆGè17Hù'++(ëë 顜è'³ùgkh‘Š,g4 aˆ¡D $k…’€E=Ñ.ÏG?Þqi[$fFla¯Btc_{à)ýévjWÐ ÐpLjþcìºm¸Ñ_0#9ü){ØÔ”ØÌJ]¶iÙÚ_KjúÌ3Ÿ8 u,¼¦ŠLQ€æC,ëÓBŸµO{Ó{ÄG„Lãº_»‰ רµ¬¬ ¬¬ÿºTJÿ%¾u¬¨ EBCb¿Õ¸:ç{ŒQ)D ‰šázÈ@–0ìIÖŠ@óLxã2ç² ±µ¦ž·&†ÜC„³ÓBÈôz÷Ãiz;Ý:r…Ëò´|´†µ¢°"§A06a¥ÝÅåaÈÈžŸBPŒ@CòÓ¦fQ)g\C¦¤Ç¾”ñy0£Ò{öDŒm@²œƒ£êÕÆÑÌÿÈJÊÊú^R=/鞟Á8Š„u¦ÑM°)­öy±˜–ð:îæUšÙ sƒ¹9/õ©HÓëÚ÷íèË šûLþð=›I:ñhëú˜®öŸ’¿Ä„}‰þÊ_t„o¸DÅÏñxŸˆº%­Ê¶ŽqP †ÿinž©®ÚdÃ96wDÅãZø‘¨6Äø°±1ÏmòËR¦(++(+¨”1/N™ŒÖ×"!Ú^X³8³ íÿBX­ðs/+ Í!y}"Û¶5Û3nž´âZò³{¢åÒs_r;ÑŽÑ%¬ ´Ù%Úßæh= ½q*‡-EÈ®1T{~ì¥KAe£Ÿm¢,(V`_‹¨”·yáHÇPŒ£ÓV”1Ú’µê;ox¸ä!ðx† ñ9++(+ëkhÙ€ÚJöaò¡ i¥g‡)ÁG‡*)……õˆA§Ít{2é0‹K(ów¡sy‡VÓ±úÐ& Ù;o¯vìœ2HóøªX-w t0LHfÐc•Yþg³ (NƒwÛž·EÑc´˜ Ô%Åè¥ÓŒµŽj½UÞ;ôhh‰\ZCëi‰rOý ü‰{x€¡ÍÒj³²€²²¾¶€Ð?¹=‡c*¬ïýáør|År îØ_¯[Ï«JiTk$nÔ ntÌsíÚ¨ìåO»+Èý5ÇxFŸÐ|N˯€¯ËÙ#Ò¢­/È ±+?×ø½=š~Êæ*‘9º˜P°ysñ«€Ž#`+­K©>z’OÖ>'½Óz¥ÍæG( °8jè9e¼#:~K£Z»³²€²R¿²S÷¾úù{˜~0 É:UMá)[ ¬Z *…ž‚жFSgŒêsíÖ¶0É£kmô> ¿·±ÜhüFQr˜æ$ÆçÛ=3z:ÛVí}6ŠØ4ý¨ƒhBO£FX¤˜ÜФš¥ (+(AÖWÐ?E¨ú^còk¹‚ IHAφA³;ÖÙ§Ö¡ú°He™TDXJÓ€ A6Bc‡Y8ø@æ…[Np6LHPK€ôà–C™ua™Îg¿7HÖ´<ŽWõu7ì¤kJØ:!%´<¶ ª‡â¥ 6o3`:±'++(+k¿K¼ IDAT(@ÑDRlø-UJ©ŒÐ@ƒ¡*Yªp´Àje)2õ²™€JEE)¥J•*¥H­DT}»»JÀyb^ñ»-Èž¢»èö–ã™(<ŒÛ%sî¥F¸’ßÇFè[/s´ª9 /JÏQj¥Ÿ£Ø#€”"2…!«1¤Ç.ÁA¬Ç…3õs9¡ý˜/ü@Ùácš‘c~-E ¬ ¬¬ï ÓDQâŽv9 Q……uÌã² Y¬‹¨}šëy2Hç¡~QA©¥JE¤®¿DãŽJŽ–€1·ÀE…E°²„F‘5ñ‰{Ü©Öñ|fkÛþë(ºS:aîÒ» aåYÚJöBš:â¾ô>éñ¤ÞA˜üuZÔ••”•õM¤!Ú@°(nßÏØÝ8еE^ȘòjM1)ÒœÐu†ðÓ'áÇXÙï‹0šÞƒ-þ«' 6«s[ëCa-µt+´HeEE_õ\€Z dðO©¨]ù1EPþp‰@ì'óñªÖ…\Q ƒÂ ø *xrÅrÑ›%Ýl~¯R¸.˜[øf†ì²ÙŽ—|,U ~6HT{ ¹ŒãÁ=( ÖÅ+ \^ ÍÞX ÖÞÒ”•”‡ ë« ”1”cí? †„gmŠPJ—Füˆýª¥J[rXdÌzQŠ JAàÑY×S]TÀŸN=Ыi:ú̵Ê*:j²yxSÄùs'mý/7IO>Ñ#å§ï¶Û=Ú3ÈYëõKæuò‚°Ö7ôc™…ôŸlt[^æm€ÁÍH`¢>™– cå†ÊYY @YYÿ}=· 0(Ò%!çûÙcPkeéIï}̽4)h0Póþ -<ôK†ñÇlåkÒÏÂ@hHû~À:1.ÒqSD”ê~Š׊º;dïšÇÆa þ™{烒wâùp ;\oâ_j§•×»ràGÝuôú¼Î¥})20 Ô¥¬\ Kþ=ÑITË‚4¾ì«òÿ²€²²¾Xj–MÓB³° UªˆH‘îqîû¥ÖÞð’>È%¥ JÔ"¨"Êë¬&ã`ľ˜‘ ­á51¨‡É:•1Àúóc°)û½hOâ»?úUÑëO]÷6-#âŽþ1øâ•« Äm~jr£–Ø[&Âöï:’@÷Ëì­ -üãnÀ“}8·ËÔx^VVPVÖ*@£Ýµ|?7ØöÍóÞýjΟfý ªµešŽh‹nþ)¨Ô®÷”R¤6OO©ÃçSà§Ù¢éXëˆMQˆƒ‡ ö!6´×O⤪ \à“1B}è‰]üÔµtòSð&Ùãé)Žû‹Ö_±œG¹ŠŒFÝ—2¥zu÷yµG˜Xú =Ðø|Óþ4—‰ÂXÊÒ.Î)ôáüéÑc©e%ee}µ„±D¢ëôùò¹ê‡¢Ä •l*µ‘¡ý”"U¤™œ×fš1Fo°@…¶Zèc^º3F®„Nˆ–‚V˜¥ 8ØÇ§@ñ‚Á¥ü\ö]Ðä¥dãõ sÂi­@Ô>%.•jÜ‘NœzÄñ°ªíf6XmÛÝbÞ·X¯,›OˆÂ—Ê/Ô„Í´ÓöHyøÇ°JÚBŸ¹:~Ò”•”•õÅ Ø +?ÖZcš\”‚ZE¤ˆÔ Vgÿ«u¼Š ¯ùÎçfªu¨9m÷O7®›ÔÐ1XóBš~´z¼|Å*LóZÌrl#ì=÷xõ§9©¶,°i;®n¢-mïÀ¨G:ÂmÑŽ¨]mÒ¯éQsó“r‘7ò™;¢ûÏA©s´k½bðî_þð=JH¸Ý˜JûqiZÆáQòÏD ¬¬ ¬¬o …6z«Í™†îü6Ö8K©MIªýá¦ú£âÝj=Ïœ»‰µÆ3××p9 9/çØÍ§6 ps:€‘QRÙá}fê¯$Ÿ9â~¶B7ÙÎøì!$ët>M?kìûQÔcHiNé Õ}'OB3°FëY\¬ÖýpŽùSü˜×:<°o™3%l„k‚E¬ M©iŸÕ‡Ñ‚¸œLþeXVPVÖ7D›#ô&$ÞëèÎNUÌÎ``À‘RÆÀ—ø‰¯ÉA2yè^•Ö ¼oÅg¹¸¢qâ}~c€ærâØÆ“9Ù{LéX3EœÅ?£+i¨g±Ðšf3û-¥¯¸ÄÌ’%ZJ‰q5 3›Ec–ª=™†Ü3Å"nºóÅy*TVçõüz°y(@Ø÷ôîÓÏŠ„pñðpNø*¸ó (\V ñ$þ(GΞh‘ÈÓ3[[êÚÅ:s:ËL(ÚHȹI-MjmRÊ|……”RÔÓúOÀ|pÓïÀ6¯Û’}A·èÌ nbï2±É4ËD-ðÁYû±V¤r—M*ù'+(+ë›ñgq 1ÖË ¾ ̆ˆÌYù9=­6º¼ l3ìb–Žäq·ße# {‚Sm0Fh¾bßD¡Í„C0†rÊ!9Â``ešq¯´n£HYyÄ´³l>mé_Uöh6¢²büÙ—7I)…¤Ôʶ³©m+hœZÔ ‡j«uú\¨Æ´4x¦ãŽÐvÄHcµß¨;ªç§{Zá®}rí.½í) (+(+ë{ h8ˆÛ”{ŠFleÿŽó7ñ>àƒáÐhƒ\ŠVÛ‹TC7PÜC;ÁŒd>0(d Pæ¬îDZÍ>,tMºÀÃ<<"õÇ`K‡wòC¼2]0Q$ÎÁ¼):{¹Y@²ÖÚè°Ê*,#ѤÃOÛÈTDweôæØÉØj€CËbï} Ù'_×f¬­Kiˆn ‚Ã09MËÇ+ªÕ¥}³?5ÉÊJÊÊúñO?Ãuùfü>ß¿p±SÞ£&††}VúòfÎÓ£›ÎšôaûökÛ$³gè«¢ó2±ÂDŸú“óÅ'}V$<3gèa­ZYœþh­Mk½©g}Ù¿¨•(µ4ÇO€ˆÊÚfõ©}AAßÜ-©Íj…®ññwÎîÕæéV96‚ x@QLÅbd¡Ñ³Ý37Æþâ“€è!Êæˬ¬ ¬¬ÿ:¹%@ƽªw÷_ηfå³1Z·Àvá•$…äà\*/$¢g¨™oÛvYÞæŒ=XŸu/¬ÃMÓR}.5H?½ßUk­¥7¾*jËwC%P›*×q¨°’ÂZúæn€(ÓåÎÅ@]Ä“9äÅ5í5saÎè¶öpbQRB/óѵ¾dAÌ {ØüäM´h~ͤŸ¬ <YYýüŽƒ*²ZFk°æƒ ñ@8ÆD>Vºð‡±ÞøD;\ô³Að4&¦ßッ?Ê¢õ ë)¨ZCjq 4'¹jiøRÿ4ª(e4¾Pµ€J R¤B¤ŠPä ~*Qвõ­à ƒ¦4¨Ü7–/Q‚!¦qg.ZCìëhðÓ6fÛ(›tí4z–‚¬ôH=Ÿ”••”•õrã_\±Åãs+ìâû’žœ?v Ž+ñÖ%öKÝ£3ëbp6OßD Pþ‘a„žcNkyȦüù)>ƒ‹jÅT€z7¬öfVU˜Y •"µUì¦Ê^µ‘4¨é„31hÄg4]ˆ:R”˜pL§sïr.62áîÍ5vüÁÓZY°ë9øÌ~©H¢KPKÊJÊÊÊçøh¯à#1j9Ì/ž!‰*À|¿S‹ït¼ã"®Dç`ÅšAx^¤†ž[#ÍèUŸ»guþúvš>ÐM±{ˆ…¬~ÚßX§Ô©ÃÍÓÙ@(#Ä¥ÝxÑ–eêé(ÍÄ.Ó›<ÛaÖè.£ÅIÅB³ï%Ë/½¯†¹z¶Ýª«…Äh™Âd4qý Å„‹$e%å!ÈJòÙeåRÑ„Œ¯Kü]Ì/ÕH4áø96¤‹¿Zg­ðþrÎF—™ŒZà[^|e«ýPX COµ ¯¶mrJ>j±¡¸XeÿO1JEÝãfôhZG,RÐÃE褒ÆBŠcÆrï.î¬ eͱC ÊsMö­?2Ö+´8“þ:¦œÄsÛE±ŽAT[Ç•/zY‘Öí«§iÏŸá$ ¬¬ ¬äŸI #‹ÍoŒ©B-"^©V+£AÝo8ˆžh²#ß:ëÊ A½£ZèˆxÆ€­—÷3ìÚ|Ìgè~\Ã}ÆÚŒ4}1Ú¤¥Ÿ9ãNb»òSksð4þ™ÿ©A®j’Þúa/,R„dA£ : -v’~ùy~ ¨•‡XÒNÝ2€]*0Ž maæh¢©FÚ4 kõçd„Ïé`þ Ï #J(++(+ËÚnÅŽ_+Z‘ /#bVõé +4‘æ&QÕî©£M'à&„ˆÐBÓ ƒý20 é›ìJ.ëƒ.šÏ/‚RC%hˆ tÑKûAEéï­ÏÕþB­ ƺíg®ýù`ú‘cé3J,jaw)c~°Žš}É Ž1†ú­sêúªL!ˆµYj…ÍϽš2p¬¦RË”­×á}¶ŸsÓKÊJÊÊú^"µ0¢G,¹8åGsUtF•#—í{ÝbÓ̳z`[jåÊ3à‚&ñê]Ó‹Q&Âúf-4â ŒwpÇͳ7áFü(ÑV©rýÝý<,άàl5á§ÎV—rª¬¡;Lú!I–R(,(  4 Po?! Ÿ‘×6¡¥ ‰b£ÑÞZ7P¶è@3M®»Ÿ!+4®÷Ù8aªq’:ZMm¢Þ8D¿A<èe’F ’Á²²€²²¾Orض”± ¡ ã4#™PdÌÕmÄ;‹Ôó,üñ½3£#™W»ð$Øê,ç x;ïo¿¢õgQg_WÜ­ÎÿÌ!µ€rÂq_Q¦µ²­¢¿×¡úT,ï2ªŒÜQˆT!K{¸RŠÂÒ^HÛÔL? ƒÆ`X×l–-Z‘—…–OÈÐx>Ù>¯mëÞX™*CêK¦UF 0öO¢>ˆ‹gôùnÔ«šaÉ?Y @YY_N@¤ ¿}/LZ׊¿¥LË5–Ó=äÌï¢K6_],¥ê¨ßâ§ã¶Ä9JÄ8íÔé8®€VÏŒCR|·½aÐE…² K ÷*ü©uª> €~ækÂÜÕ\ »D¶Az”R(ÃÍ) ‰š·@3þœh#¾Uæn u9†Ž3²Pš×zÁV0ëñ¤Þ-Ê4ZgÔ+‚ˆôuŸ4£0²€òd}5ÿ,úÐËgäŒ.Õüe¿®›$$ÛÝÖ\³c“Ž–GižÜT›ƒrðM+rZ}¨;@b°AèÎ@ÉnãÐÕ ¢õÁà—A7ÜYÿͧ¶‰wÁÏÏÂeVÎçy0KAo‚MFLÔCM’9Q¶[‚öK ëLMHï¨z†&Ô;dúŽj¥øxwM RdT7žÐ÷o’²€²²¾€ªæŸ½V­Š` Í+*kà©’Uä…(4ÇÁUû‹z¬^¦q{ý©§×¨wGù(y§Î—÷ì³-zk¦KsÅá¼ é P÷¼€•ì5þDËüjK «jZ?{ÈÎñQdvÁÀF?*ÌÎÁ‹ýKuÅ|çK+BýÌ€[}Q%«)¦¸gõÔDÄvß´$n·NR’~TXÒOVP‚¬T€"ºÓ“jÿ§ÕoRk­µNîYTk¤E6ñŽ#%Ù™vk rÓû»þ"ò¬‰C ÿ쀛×[ Ç›áïHõR“îsòýG‘°òçÑ,¤ 4º*sR½ ™ö—¡ÉVšVŒ Nû7PWϦD}k=C£ÍwE,ÓÏZ8´M ÷G]ÿœ¼ÝRž••”•õŸ Z‡ëÇø ãØ C“¸øg°Ï¦Zù¦Äy¥/hqJÄLàOüá¾71Šñ€_̳ÔX­Î>„$Æ í(l.^˜Æ@ÓùÜD =¯`@ýé=/ü Bè^™ióU-M݄¹Q'Á;íGíRÞ…&X-·¥òh²qf õxbíÓ2©J •­±2Õÿ2þgìÚ^úhm~%bVVPVÖwV=8 {TSå™Ä³Zcƒ’j]¼Ô0è% móbzä^¯‹Öèqv31*jCµµFâf”üá'À+¢¶éÛY%XÉsAàX8¨}.³ïU›ù§Û~ªX^ÑCQ½›eJ`K³S·°x¢´±sË?³•&z$Þû`ZVÐj»F+GFRÂi„©y@â/®­ˆP MB/Ý4¼¤(+(+ë› èãÜÐâ˜ç ÿÔ:™§ª.Wí0+…0T¯SbfAâÜÚ¸ˆ*é@VƒLÇ£Zë+Çìñ6 ;$&%ö@k&çs6«æ^ ÊX4ÖRúºgÔJH•Ù ’"?šú&ʲ?“,m¨¬ ô¡ C]dMÐ!Ðezz^ùz4ékV”†8±IéL~´^-bTäc÷-Ḩ[mÜ<%¦de%ee}Tk úu ª<@Õ\0ð§ê¨Ó®®£ÔC™z¥‰]R­×KS…‰-ãà0"þlQôbLÈÅ‘…N ikpfn¨îØw5¨y¢+=ýBÔndx!K/h`iÿéø°ã˜ Äñ7àB³<Ñz¥½ZÛûô™Ž7ÛYhÝŠ?IÊJÊÊúb¨FÃïÑzâ«ÒúÏüFýÁ. +ô„vƒôYj7™2ÐÐ~8ÇÂÌyFb¸üP ?|Á;^YØš`Aë‚B}ÓWK3&ÕmBìi`ãÜŠºfÞGLV¶˜OÁœ/Ù¥ƒ€½Ñá΀€ƒïN ²|£5!#(©§p ´ú\¶ç·3PüÙ‰~KþÉJÊÊúnH·•èNÛÖ —‘†htÂæ$XU­°¡ Ù¦W=ÿ»  -ÑJÖTÐÂÂJ”Rj[‚X[#lŠ?ž[\k Ö£ҎƧÈᣆ¿´ÓZ·Â‚‹Æ =Ag¢’†àÌ=öûËÊJÊúv²ÄsÊÓkm#ÌL…í°@‹„&éiyKBZ3¥Æµ¡ÌÎÔaöñyO÷ªúžg=ÎŽ-#õ5½#"Z ´¢5¼Yë »Zˆ6ÎÖþuÝp`³²ÌÐ…=N£%_p¸ŸËŒ‚§ÃÛ¿ÚAfÝJ´ Ú´´`º\Û¨—\T"qéó.eLYͽúxgúÉñ¯¬¬ ¬¬¶È«)rʪVªnl}é¨GOˆ­«ô±„üîÅ:%*“Ø:¥QÖœÆÖæc”³õ‡,!ürzõCÈ‹TxEBÍ0Àž™g.˜Ì :^š¨ ?E´önèæ~n+ ´º™‰ÊÔ{JØÿŠÜ@føKœC(°Ùæ—»Ï>h&ž‡Ü¾˜xúy ñ:$³À²²€²RªaGéEF5¾Ç8öŸ¥ ™1ºæ×úv ÎW§D‰kÓI'.±OÔ}.ž’P/ ´IGˆ7.î ¨Z  ™IT 9« Ë|û•µ4¤ÖÞ S't ‹”þîÛè{%ÿa‘BJ!YÂ2„Ÿéýè=Ó6u瘃v˜7E‹Ü|@¼ëwYY @YYß¡ýpH;áô—‹åòŽlWXä9`MÎXƒ ýTkú¹„¤ŠKC*á‡Ç3œÓpâ/Œ®èlé3À>=‘ò„EÃ=ãEz6X»WsCWJi® ®UV)ul…6ê !­óU:qºýøÔZ¢'yqçmˆá–!ó¤´ k’­7}É>YY @Y©=¸ ë–†6ÂBk~ìâh"¦/Œ°G”î3ÍΣ÷E³ògýÓ¡bü馳–ˆ/-?þ0RÊÃs=AiÔÒíÑ#3¬][)…B©µ¶!÷Zk)VŠÔ*()¥J]Òè‡u1O_]ÚþCgÿá6Æ(ÖkYz$Z dhø!2·*û˜XÿÓ~´ $²³PVVVPVV@} þF=ǵБÚc¿Ò¢j'Ætœ|µs^v4m®ýÑ1ï ƒ´ÙG3b/ãÀïæI޹ñÐ` ?Ìk¯¤%ÀwÝ ³9·@ ê¯éŒnþŸÖ"RkT)µ g•!–T42ó_˜¡¨fÌokÞöól©ïУï{füÙúŒHð .Û2ö†Øý“ÍÊJÊÊúºúY{€ª*?¡OÔ”ŠAÈí ò¹ñ._µÖ=qÕÄ\)hØ~õ¯-Exsða2ÂvñÉô×òQGL<•³Ñ¹háR•&±VD ËX „R¥ B"µTHçžÆFmÿNûWMƒÍ.±dßWzÏr8ÝÕ‘NÈ@1÷À-C\ôs°“gVVPVÖ·*@?õ¸úg¦PT¡ÔMªTßè'Tœ]Úx‹n¥\Ïj)âŠØŒÏÛü×^ \ÏϼÅorã„ðv’)©zM⺠)UXÚµ¬UPjaiéµJ ªHí~éY#¬ ÑQ[·<„!¡5QærÚZ¸-.Üu/ôÄÙñˆÜЯLÐYYY @YY»d“¶n!¨[&ü…~¢ 烎uŸQï“Zu¼²ö¬¥Ðc þ¹§e}1ìŠáº8ÆŠ3¿”}쩨s.~~Ï]cš¤–Öš ´t Á¥@„U EðùÈ,챃`\6 …D}bž>O¦€IBî1:ÎÚ‚([F PwíÇ-:MŸH( ¬ ¬¬/W€^Á‹Î÷CaQëÊçea‡N\ª[(«Ø wÎ]>ƒzÜ ÍlúQöæßº•Ÿ4žîÖÁŸŽþ×D!Y44Îâæç«Â"U*¤J•†""‚ZUáï"u<Üò­•èÃ1+?ñ…‹Rè^ò¦¡Ñãšæº9¥­Ú@ý([´Ý /¬!ù'++(+Ë*@"ω`µn»O® iŽÃõ‡uÏ«ñ¥¥íÿÑ^±ðãè²ß€WƹÞào1ЃºhÀ曄úr¾c´ÁxˆU¤ô0áø¢ ‡¡uÄhãOzQK?½)6–$¶uA´ƒ\\ìNJK&ò,Z°‘}Ž>Jÿ²wÙ¬Ï!à1”È“••”•5 ZùË’SN|Ý0§^ƒÆj¸â9Ц—!ûPåœÆÖg>@Ft¡ßî#ÑrD¹d½ÿ%ZbOïu¡Ï‰)=Kmeœ/½5Äú2 §×s)¬2bHÍ¿ìË&öôõˆÄˆOû‹’Ahó¢Ñ £ì†ž@Ú‘8 Þ"fÚÑÇE~éÉ/—Ÿ•••”•5èY`Þæü4ƒóþÔ®Û¥¬=]ï1_¨'­õD$Ãá`»û¿£K´[4üÙóôî|ItïcƒôŵîÂ&7a  ºázšizx<‡~£¾¶¾XûF°øIôŸv3£({µ¬žšh‘'.è£s/´/:Á'++(++ªŸZePŠDø"òN³©ç«BæÅ_cÝ?ZòYÆg·äPÊiì‹'`y+ÊàqxWTD<)Ó=c5 ¨ª•+zDRHo‘ ²jòMéßöËú“Jòéªñ4ÖY£aƒ… îô« î2½Óãog 2âOÔûZT»øÇÈ>{FN„ee%eeyèe LÈJ©O7ŠO\xE¨É@¢Z_“~L@ÖøÃz€nœòûîÔIú« Ù4˜ñõx¯ú\?QÊ墟u€ækÞ›b£&uLµ?¦ #‚E?+œ£mGšTDýåÀ Õ/4 Bªֿ㼌ƒyhóßÅQP°üp Jµ6õ ¬¬ ¬, @??|a~è[E¬c&Ø)·GXÄcý>vL¬ßGý¡þ³ÌA» úµEú«Çš>1îÀÃ;Ô¯9ü Ÿ£M{•þÕ ë‡~Ô (0´šº¦&ÅDõ¿Ö^k퀲…šïÚp â¶—í}õûkÒ¹ë@rÙ ••”•õmõ3Ù{Q·Ò×}.‰{[ÖÛ¼K>Ê÷${iúQ±§Ü Hžv!:åæV(¯… ŠF°c§ïTO ÖÔIÿª’ÛËý`CFn=|¨_ƒi£Ãe¼AsuÑli5-JVS¬}¤Ã7-˜8ïÄBíaeØg5!ÑBõ´ „H˜ËÿÑge%eeõ,095£Þºv4ž÷lè3H&öP±ºÑF?gSðK‡"¯ÐæÓµÏ½§Å—§Ýˆ{æY~\l~éþdÛÆFT´…ÑâDŸàùÜ-ý˜f×4Dë˜ÓŠsmôÈ8“%õ…Ûsàž‹{dqÏhŒqrO5›dc,áPb.‚Ï”r&>++(ëë¨îø"—&—¿*ö÷H°VZÜzÙînQå]ˆ±9˶îÇÂË‚!þŸt’ÃÚaø¡œ8b‘mZŒúÑeäi0Ô»¯¡°Çžéܯ¤;ƒhTs3A3UÊi@•C^S2ùì±Ä¼m”1Ø43x6%>‰ïñA­ä¬w;…†ÚÃË+„±g+PZ9¥Tj̬}§9c¬–À94¿ãð-ª¡y¿}fͤ§é`µ¬¬¬ ¬ ZkŽ¿@¢™„žhE8’ ÙhµG%z-î¡aE?Öòóèqþ?îl÷Gþ“}(LLB†¶Aà âH†b$£Yd¥6mæ#‹F Vì– «aÿ¶¹÷sÁcw÷Lo·i’­Ù'ô³ EÃÔ~fæœi†Nö¡½(ÿ‡Ÿ••”•T· 0߯²ƒ\bo#çü {+æn`rÝÅÏxQÑžöþ»˜ó©Ïùó;|(ÿè¡/†¢¨©,û(+C^íKžZG¢›m›Ücž¸ßÐöš lXÝ£³¦ÉÌzEÅAªŸ7šbT®EÔâéµDHÖÆñ“°ºf+„f¤âØ' ÐYY @YY€ÂN–ÑgW€dÇ#7ݵcPt‰„¦ 3-0þ- ùØð?ËÛd8 ¯ëíÎ0ޱ/~ÒjÁðP}”[˜+:‚&}lŠC\˜¤²Éf‹j°Í®H(iÛûThÅ%ìÌ™7ÑšRŸ“¹rq†°Žísë÷™¨Øð³M(+(AÖW«˜&—ø¿ˆcÚ]Û"ÙÚW¯«_âIHV´û_ogý;¿ñÿš=R`°QÃíÉì º˜…qLÇÌÏŠ=ÛÊê ;íèÌ­ñTc@]Ýyo¨võFÛ. Ö0®÷¨é0LIK“5AoÍað„õ‡"++(+ëÿŽêíuGDgV‡Œ‘Ù9š­Þ£,>ë‹}³3½Ðc,>Zþ¡ÿB‚}ƒ§A­?9û½52ó³ûLÆN,Ñô`q‚sUµ'hÃ\ƬœÓP˜4ç»”è3Ý7KáQ_¨]×ÖJ-4²OèXÉmQh«7¶¼BSüR?!™#Ι†³²€²²þ/S€jå.Û¸^ØŽCñ —“|vßèè.ÆéfTÇõ»ÜÒÃ}ÞœÞ~s üÃÙk´Âþt³m„5Þg¨f©Øð°ùhÆ>cE¡µ9Gæ:gìY ¦¦EeéGüCêõÓ«%Æ­)ÉÃP¾å‡ñÉô]‹@k]!¢o!(++(+ë;ÈPŽïW9ϹíeûYéYy‡³ZðòŽó¬?|BÙi ¼þ/”ñ,ûK¢wAD»tNB‘U…æˆùlž (Ø”ÊxÔîžM1½?¢È<q¬&”5».Ó—´0Ȩ0øü`OhòÐަÍÎÇÀ/:!((+(+ë‹Ke–Úv•™“-›¡ƒGѓ㟠ÏeÆÞ“K´å‡ÊŽ^ÿòá¶B7:õš„¢Ó¸¦–}|/t y;Ó;êá‘?ì¶E59ûÍàøÞ$›tæ+›Ë‡ïYOΛ­<§/D¤A™“Ö•ˆ ^Xk”í8iéÇ(EZø¢Ù  öÝt;&e%ee}±TëîÔ1M¬)öxHÚȯóqc\»ÓÙu²ÌjÆ;ùD?o.ýè!>{´@ÞáñìÐetí `X ™W:©Ì9vÌ=Ìj›¡…¤ibf4ò>•¡E3n!ÏZÛ¬®’áPõ0ÐŒr©[:4ìKÎ\d¶ õmB gà¥ÂÓxÝÇ?YY @YYÿ-(”DEÛ }‚—wtŽ)÷¸®ÈÉlº_fèýrš„¤M‚9Ýñ³@®“´Ã#»È&füò“‰ö nO´ Y­¹±JÚé;*í²M×2±í3|”>„UÛŽL{L‘{ã ¡ŽÍ"[Û [cŽ]ÌlV<3 ö»ù—’••”•õÍtÚL±Ÿ…ÝíÚ÷8‹wùúÂ}ø‹ô§-^ƒ÷©¯$œSø£•@n§ò2ðŒ”ôy'ãèôÑ Õ]AÓÖ Ñ›îØ?Ó -Óß3·®I11þ¡ Í/ÆĬ¯%rkÁZyxÊ÷¢<°n*@Y @YYß[•5XWƳ—Î?Œ©Ç0(›Ï¶Ç9Üwx¢pèÓ(°wrQ0E-O§ÕE¦³´0ÀÉ)jEÎ"!m¼iÒù§ÅfA)/:xK÷Âtlé°9w1f*>*ACO8Bøu ›ÂÇo!3Þí-$Âë—WGSëÉÊJÊÊÚNÕÉ?1ôÈ–PX›‰¡nŒãRMå 1¾™¼p=Åe<ªEïAæ•Wû=þQh‡#e±¢²ŒÑýcèC…ÄJAê³PˆÓU×%ÓëOH‰Ä©D&‡« æ{÷1¬2¤×õ'ŸË«?<‚)ñde%ee Æ2ϾªGâ0/…!n¸]Ä›£õ>A÷„{¾éIâ•z>¬è;µÁä_í¦  Që“ÇÁƒ‡ 9Ö-?X¢}ÓK•q‚øù/åû‘¾!hÆNXY±¦Bq¹aÐIúÓ9cë[ESW”ÑÇá˜fee%ee‰ê’-š”^Ô¹€‘p—ð'ˆÇ^—ÜûWxP]xÅ—;ß<3 þòÉ•± f­oòϦþ¨ñxN§³¬i÷¹ûǹr&âÐuÊVüèTŒÄìr7Þ`æ’Qt#l¼á™cf.âÏîrí¯](û#Á-++(+ëkèºÑG˜Ò}~¡ÊýÎùnU 4vC>ª@ªoÞ%üf2Ñ©Á)~‰9bB#¦_¹i4Xm¯Þ|â´5ÏbgPš¦æÉ^Ã÷#jÛs×yæVFO0Æ7ÔQæsëÕOÖ|˜VÃÃó(ë¥2”••”•µ‰?qŸËÊ8‘ð#÷×UŠ¡ÅIA7Á†‡­;<¡ŸlÊäÄÈ« Ò¸ï@¾ ÎÝ<`E3ÐPxºËǬH\–Ÿ~ùð1S¹¥×Öhÿ²5÷ˆJŘæ`üPjÀ¥ó,Ug\¹}Xno˜®¦ýô¦8„è¨S¶V¦+(++(+ë@aÿ+’$tölÊŽ™c'OÓìšlx„ÖÝžÆØ_ßøpÝ“ûùÙÝþÝ©×Ë[çK&ÕØ.׊V·÷w2 §ëg8¤Û}µÑœ]úÚåÅ-“~°.áÌ¡››84Ž܇ ·»{…Ùþ]\¦Àh“PʬA°‘OÁåžÓ_p³ñ‡c;#ðE.s+˜Žë]±ÃYhËÊJÊÊún’{D×NEã; &¼¸Ímsðgúñ'OF@ux?ÉEÿF€<ñ<~ÿ)áø­Z¬ h¿èEôöÄÅ-“º“gø‰dD‡õ0E9Cwˆ2ô0f×ü˜™yí°¶ ã$½?:úqÁyd0++(+ë‹(€—`ìËî,Ü÷ZyHvyÈ‚¸;Ÿwu†·Ôw>ºŸ(ç ˜¼{ðû¾àŽ?„ן \'¬{”udjß­¿^ 4hgÜOu·Ö„üä=Û> Ï jÖ–ãCÃdCg•=hšÅÊm6OYˆÞ`J0¥ ¬¬ ¬,—ÙneŠ×„vˆ;‘iç~Ü­Üc=nd~Á)ü”lø›ˆGÜBtÆ«‡Â&ñ¸,j#ô8’X$4fÁt;ìÎ@:#~HD# c lzĦ£:ÌȘ;†XR‘Ù{8"ëÕàæóÃuˆQô˜ày,¥ ¬¬ ¬ÄŸ0¡}ó8Gü³ºû¶ÔÆFŒe³¹ç…'ùH/’5þýüí[z+ô¹ùesãé3ã•zMÅËÚØßðèz­à =/v&ùˆÊ@µëÖÜÙR‰4¡Vh=§\Æ…/bÛYÐ' 鑦ñâ §+(++(+Ë0ÐÖü’8 4^és ŸwXýêÁ Ä»ºsÃ!^S¼$¾W˜Né㟟u·É.—:m?u¦óGuú—G¦Ùy‡uͧÏr%Óät1¯ÛšI.ÓÁå}š¢:œ'YH,²yÚBÁ¬}ȬÂ1盳²€²²¾‘~B…ç´Ú'Ô‡ýP‚͇ç6WpQìzK?òkú‘¿A?‡P‹ðL€,Þö ýØÝy”c+ŒWô‘ß7³ìýlíƒ1uðûõ~Ãô:Ä>ùnȧÎ!.N×ÏÌO7\Yªs të­­x ø4¦XCÃGæRû í†CbŸ¡ðÂ#<¸9–••”•e-ÐêÔÄ õ¼é‡Û#ÇÚÌ[ú æÜqš§ü²óõ1ýðùíü•Së>êî.Ô©Vò ¶%ŠÎ=+µ¶j‚}Œ–Oß³ï… Y!•‡:®]-@îBa­ÔZr>išx1#üÄcs‡O5±'++(++tâŒÒØôÑÏ«œ#¨áaTý°·gÛWc^ŸÌÉ¿„ åDêÞ ¶óº!F}Ÿu͘ ÓächDÆcv—FW+$× ›ŸÓCœ¯„ä àÜè †â.˜XZ’g‘-Û_YY @YY7ôù”~x±öl3VFðЈð‰ï\ÏVᇽ¾â%>?ÌùûÏNÌZä µŸõ±ôÑ÷ŸaªÃÝ_F÷A>רÛìzaæk´5aeýôWc¿TéCÓUÍIÓ }ÈlW !¡ Š–¢%Q$]e`ËÜÀ¿¬¬¬ ¬DŸP’“©gøâÉ–ÌbÌy¢Ÿ“íù2'âëM„¿’uþN¬ÿÒ‰zòŒîCÍé-¿Cº_Gsåá iŸÎèaV"Õ„%•b1,Dž‡´VÄí=C¼ez|§­ÍÀÆ:îûpwVVVPVV@9Û²ŸTNtâÛU¼â /TnDüÀ`óH?xnm}vºÄÓøëLj@A,†Úîã®ð"‘“š‚þÚF#fZL·Ò&žpS—¸ŒŸM+C;ŠÙH Q‡„YÃyö>{5*É'++(+ëÄ>·åαú¤yâIœ9û~u#¹u¾ø©ðóBõÁo†Å~«åü ¨¡ ΑþÛ ˜™NZ$ ¹U@ðO»ÅºÚ1/Ñ©*;É–û¬K4"“'¡ÉÖø*+++(ëÛÑÇ¡ˆY§6¹xåâ`Žôsà¾ó‡¿ÜŸw }¢ÉðAãáaë0¢Ç ?[ËHîWßnå:QF‚Û–—%=ø…D‰£ Óº‹C–„Œ-‰t3cNò¨í¬C§·­Aæ~†²€²²¾´ Csú ²!¢ì C?G{òëà‹71¼fnMR¹oëá»üøM.Yëž±½„7² Ïáyðñ ©ž_ܙӚO —€#ÑÍ’gò£ÐtÕ4mŒ8¦èíEF"Xqø²#eoÙ7»bY @YY_®]Ä Gú‘H1ºÈ츛~Ýô8(Æ?~hý(|~W$« ?’wâ]‡Ú4cP½4ôš¡Vš$Ø£Œ ›¹i{5rĤsÁ u¼vAÈcÍÚ¼&ŽU3†y²²€²².cÐÑßÊ@9Ë@æ$ÄaM4/½­3ýð“®~ž<ˆ}.àùõýâ:÷Ív@±4ÔþZ 1D¨ãu&;Ho2ßMv¬ýPZf 0È,ºæ†Aã'f“w¯}†8þÄå'.û_YY @YI?ê|Ígñ ­|6ê·­ŽÔÂ;Bœ³»x–sŽèÐíLJºz[F˜ò‚{6^ˆëmᚥoâ¬ÐAòj,IÁ½‘>8R×Óxä…Ûé=ƹ—…ødÿ++(+ë«ñ'_Žè£çv†|#|’kø„8"à}bý“Üû¢ÿúû€×RÐþ54_lj2!€#{HïNþØVWÓ7ÌXÈy&ÄŸ8¶CKIðÉÊJÊÊ:ëÞñ³ F½<6ÅT!×Ô¯øtõYîôó‡À_κãñLªß0ža…çv‰}°`Ö{qÜsÎ;¬+üÀ¯ò=¨ÍRöÕfß ÿd28¬wæéŽ9ßzYY @YY߀?gú ÞèÀsøù¼Ž™O|³]‰@ôJÁ‰iž’0pOGDW~ž¸?Χæð‰/c¿ örÇ:ú诰;ªwq|êÖñÙkƒÐ%½‘PÐäy³/¨sÓ¬¬ ¬¬o" CàWÌ$¾Ä[¡:‹Ö¯¤šûÏLó:ÐÔ0Ð>în§ÃpÆ6Ü5žëçâ»®n.œÂ,ÒX½& Ø™½­šõz ì8öô²ÇDpȰßH‚ýÕáCóú´©e%ee%yí&]ANY ÆÈ¶sÎKÕG]6£Ó<¦Ÿ·ÇJ0ä µö!ýPú¼TîªÏå#Ãû6?! eÿ+++(+ëv9ðÊ‹A÷'‘†ÛL΋dSìÙaäŸ>^E¯“ð­å9¼/îÂD+øåˆÁ×ð°C?°JÍ#ý`ç— †â÷ ¿ú§hŽ~Šô‹Ÿ™¬¬ ¬¬/àÿí}Ð=èx.ŸežúÈ“Ÿz¹-yyŸqá[cK8oŠðúÌ‹èzÀM!PcFÞñH?Ø|ÓoÖŽå‹A /9:@.Õ IDATòƒë‡A‰?YY @YY×ÓÁ!•Ý6¶"9'²õÐ(.äG¯dŠ@o0f¹yðpj»Ù¨ñŽlN¸sĦ³Œßꧦ’v+[H·±¼¹nA¢¾…øû„ß¿yGüßÙqzóÓ–ý¯¬¬ ¬DœHÞˆ7±fÃNQÑæ¡§ßÛíÏÁK4e ÞýF‡å.½õñ[|)R¨‡ƒOe÷ïN\÷Jy-äQj¬d؛ﯚ_ø¼ÓÐþíûÄ ¬ <Y_O@Gô‘ÇY­W±[xÞèŸò¾±uä wŒvÎ/ ÕçÄ:Gq9j±ñoÀìkvCá#ëÝá,]èvÌæT„ãf†kÂ,ÿQú…Óx÷3úoýìge%ee}+ñp²Þ.·cS‘†w¾ys-^ðÍÓFCwl„ƒMÀ¹Éõp9xåµú€§+”˜ccOÇì;ôšŸÙ ƒ…G?N’­)öj2+zÑ'ù_4Zeee%eeýâ÷àËøúkÕç:îŽ}-"_ÿF~œ\ÆÛͼ̇3ïÅ„wçì¬ÓìÅñ]0YÜãCðµ™êræh¹¶À¶^˜Äë@¯†Õããöv[$~:’–²²€²²> >$|‰ŸHÇóRc>°ÔGg§‡w@Ži¦8 ‚°¨?›~ä°Gº%g)E‡ÇfÙé‹­·u¡¾Ÿp;ÐÓÜ‘Ì~.—ÕÙüˆfðÇHš••”•õ…t% º`trîpáVéL½|yÎ:[Œ°Ý&êsÍ'2jýÙ7v=ž_M™Ñ‹~ļKÇÉ=¾YâŒgÅ~èÇHL8Mƒ½o„‘!=†|ÐÞñw(“‚PVVPVÖKžx¦üЮK|Õý´Ê‡g‡ïpõ¹B°@Ô3;š°Ãf_ L¬6½ ÿ2Æaì!훇E‡Ñwìbê™p…ÅLûOƆ:|·V:ÂdøtAbPVVPVÖýì±I×øÒ×—ð“eÍAÆ6Ú¬Äv‹Gy1úŽÃ}¹*®°õ> þ~3 2.ú ƒ ëÂÎ%Æ!= Ñzùa0# î›7(‚Ë#„Ùu´ ³ rH ÊÊJÊÊzO?Û%çT/hÄYx¡ŸãØødµÆE¼¹Æ=½lܜǾâÓñz>ÊIÝÞï>Ó|!N¤iJÌ·{8‹ÏÉ}À ;œ`ç¶àÒ!›£mMíçÄ"cËÉG JÊÊJÊÊŠtšGQ‡Á¢(çS‚xŠçSÖqÊýwuÂ¥ñ³øËWâwžß»|L¼Ùý¼‡º;à9¯FŒžZïf”(’Þ‡ºÅ±õB>âˆ]œ¨ß7-ú©€TËŸü- ge%eeý·á‡ÏÈr¹ÁèóoØ‡ÞØÓZŒk1мz÷AöV?ßz|øK›‡7Â6íÕÙFû¢3ûe.?Õ+@rsÝpìŒp¶Q¨7>cVÉý³´ Òmp,@¥óÅYY @YY_Œ>ò`^Üðèù·÷wÜ»“/b¼ÔH;85Ïì µ·0úþª!7x‰¸ÿ=ñl©îû–gѯCÊý³@b.?ÜÆÝÃÅÐA<ê±YÐ3KyºÝn›c|û€àéã"ߎÄñCÊÊJÊÊJú9žÊ^ì|æ˜pO|ºDð›ü«´Ë—úB%b ã}j‡îð(+Ó/峂'`"O´‰sÍ.åƒÖ¤m’=<Ÿ ‚¬qx¡ÝYŠåè&ãñ473O<—§ø˜æÕn¨Õ¹*)(+(+ë» èáïAî xÌ*5‘ƒ™fŽw­S9£Õ2¾Í´ “…ã]ûb?nRP¤Ã˜sòÅW‹Ç”úÃûÊ3#]rØ „=z«÷È ù˜T ð&"ò -f‚¿Tç!8RÞùjÙŸáÔY7´ óÒ”•”••\ñá|ϽÏú·ðwË£,q§™_ôwÊÂvÎ|É!0Z„ú #’סªï®éhi,š]°«@ø±‰ð–ç0#x%Zï:æV(vÄÜûÍ–Rè’Xé¸Ö={äO_•à“••”•ÄiÙóË#мõ·\Í:Z¢ˆGà7os»¯kþÐ.˜†@ù=®y§×au„~ 8}ù?gÂwÇÍÙ€à^F ü6Ú?°,%fÄã`8kV§°5l\2Èf»j" s1­™ú²òΩY)8çpde%ee}=KA×;3d¾K½ÅTàŽ±Ñ§Ã üy:š "#­É`÷×z’ƒôI~¾Qyxà.˜—Ì zÍw~ %ø`•÷rÑ~6‚†÷oõ0~¾¼Q!ôhZ‚hôÁº?ß7ßý ÜBH ÊÊJÊÊ 7/¿¤A¤w¸BèØžNôÄñKÓÓ±›}dÛñj9›ãg³÷l>èh"¢W€ v'¦Ûï¨xHLŠ­‰¡‡ôàÝ~ AÿsÁƒ²²€²²¾µø›kßÍ5—ϳ½AXèe×ënû3Ü p|Íw¯Z¨Á~v'ã 3GÊótÜgòϾóç|ð<mͯXZcðSøA(ù8¿©³§|ã4£Àì<GJÈÙÚa†„†ãyW† ÂRüÉÊJÊJúêÈ›„Ñ‹\ñö¶‘惨¯„Ð5ÙŸAùà%`íLqö`E.jӺͽŸ6 ÝóS½ýxc·Ñc‘ƒ!lyan¢VŠÄ¥‚Ŧ à¹kŒÇ™ÁC„^Ɉ¬ÖXÜtV5îಳұQvßr‡‹WΌżTågÇÂ}‹î~—‰°ƒ¡&ðG#óTv4öˆ¥3Ýë©aŠ®ì µ"¨e¡¹`‘åRÊJÊÊÊúœ°/V^sÎy×ßì6™[´èu%4FæžÕ´É(§ ÐÖ\œÄ™³¥ù窳˜êßpàbVèƒ/Ã<Æý,Ä]¢1Þ½s½“¶¦–á%Ý[¯b¦ÃhI¨´™>Zû3‘`©e%eeey¤°ÖòÅ }œRöUs·¡èM/ $Îæj/QèçëßíW(‚¶ ‚á¡ [==+|Sè]ð*Bâ€ìºÎ>Òµ&Æ6SÂ<ÍB49ks=åö ‡˜Jüq£ZSÛ$réFJ©µ"íµ¹TÈ™ˆ¨¡*“Q³€²²¾{ž˜&[⛾qÔl­¡}á>0Y#ö?ï/ø!îjl ;â(ßP°ìgWSÔ}<ý^íò.ð,í¸á\ø¼¸àÁccºmqôF?þ3Œ_— G³L‹IΘ…©)hÛèo>>-çZ$´;‡²²€²²’†ø|“Û)mt¢Ü½ŽÓðGðØÎªªÁ…3Cкšè»F ¸Ûx|®E,où¶+À#NwÁQù9Rhd–¨Wåe!;CvZr·À6úÙß'^ cx\Û¤<ѰápZþr`$§ Ý¬¬ ¬¬d píòIÉa(ÀD'EÞ[Õu.»h;@ûd9HªbØ=ÃAR’±p\r¸\µìöZûy¯~I!½npF$ ù냙2ßxÛéÇûºœAÜw$/ÒOÙ?MÚñ±«ãåüÒjо( ¬ ¬¬oæH[8ê ç›Úõ†×ÞžÐj]¹ŽPs~3§FÙ2=£ˆ‹)?§€áƒ V9ï_\ÒO°ô'ZœˆØÂ¼A ݆\Y²’!ÏÒ,¦dd™ÈþR”£ˆnòkÞ’ PVPVVÖF¸Yz6lµwtú†÷+0–D«Ñ2yšæü|c¦ýi•‘‰é]²™‡¡íö/D7F¶J8o°äh‹}\Àµd¿bLs[n²ž”‚£);:lνÃ, âz6eêsòü凑••”•õ¯²m¬7*Ðvf ÇÓ­£ÝBÙÔ¡äƒSÅïe=ÆÎ‹´÷lîþÛ³…“o¼@¼Ä%kZÆtºì Ã#èl>è€r´õ'UïùÔk'C8=˜¤Õžg•þ:óä(åb°:++(+ë;‘'8#ò¿_·ªRáMèPFbÚ‘fK\½÷®VBk˜Àª?î"….< ?ØpgÖ–÷ÙÑaßÄ$Lj¢¦Bµá{í2”5rQ%7Ag%å!ÈúnÒI£7e“düÉã£ß¦ýðòvÅæ+ºeuEÃa§q+ÇG8^û´ÓG÷#Û8ÿê§„#AM‚c\¸.’¾ÀðJˆò\%ñ¡Ø.¥ yiZ–SB]Ô‰_X9~Tô0YVVPVÖ7k@•„g£ø~ô÷ÞÏÖ<$£ŸÎ@<)%‡ÁåÛoò8tß–Ÿ$x]jLlwþ0ðHá[)çãh‹v&ímë$½db­åìòž)ÍSsxÄ ªznUŒ³¬æú•˜NiŠYå­ÅL je%eeeÎo<—`ÌrŒ:Ù‹yÜ‚Y̧e<ÊòJŸ¥)ÖOr~åZ2:¡6UÄ7ó>¤Q{hèd0„`£&µx@Ì8•"‚Yüã‡~šÍr2L–ÏH ÃtOC=ßåî9Ð.‰îÝ0N¬Ê-@Y @y²¾›vÂóup^²=‹§p‹á¬÷ì¨ÃãBBáŽMGÈeÑžê=¯”rŽˆß7½ÖmDö„ø)]WUË‹@ñ ˜92WM÷‘ûïÞÒð  ñvúŠÃ ÙÈÍ#­>»hó¡Šãvשּׁ ¬¬/F!+Ê/1óŒ´"µÜìÎó3ß[™Åë„æÃÝÉ)ßT©”S¼Y&#Ÿûžx‡‚‡CliG^‘(Ð4öŽ[µÐ"²…ˆÝ™án —ï”'Ò §Ô1±iÌÏú'xîsÀJI\ö\fe%ee}3mgÙx]ï“€‡á/ªÓVø ´ëœîK¢w23RÒm˳eH.¿Yýâ&!ÄìKžé=ó°¿{…>·×íMP›F7 õzh÷‘Ãz–Ü JêPÃà“WÜ3mÔk”2 %e%ee}-ïà¤Ö¶{. £âq?µÇ;“ñ;¯¢¢Â×ì_.õiÇçUÞE¸Ìx) |~sxj(þ‚~¼×9ÂBQo '®fwDªÌñN'û{ƒ>\دŠaH‡ºûeÜ« 6—+.5H}²üͦ‡¬¬ ¬¬ÿ& ùSÂ1PݶEN}ÆÊ£®‡Rž"¦ap[sN%¯$×YoÞhDÍ‹ñåóØâZËw¿#Î|OBÿ?{o·æ¸®ä F°ëqç)æ~¹s!’Ä$×Ú}Î÷õ’öÚU™N—3Ó–E@jQ[ºv¿}ˆ_¦ïu30WI¯Å Ö8|+Ÿ—·Ž÷˘\nwA ãÙ‰,ŠÉÇ}Çw|è;¾£YoÖ8{ýhýŒW1<_<@T¼îr[4Ú:r§˜=üÈvnM ’¾É32úÑÔkp¢ìÎI IU G;*ˆènÔˆmûäK@Ô¿Æ÷_8h¥­ØÀB1A¶¬bU0è{óÇ€¾ã;þµ¬O\™ì)Ðø1͸ ש–*ÿ®•¨kMµ»ßÅÌšðåÊû“)’æX­[Aôg¬ø›jõ´,ÞE{Dªûs„ =º><]5n•òi‡“€-I[‚ݱqÞ1™DoÙW…úßñ ïø·C fIÊAÏöríThHà¦üKénAŸ0^í™õ\ŠêÃô–ªÖÞŸççî½ê—׃©—0®=[þgåk¶¾N£À(7‰ÒÚ>Â-úéP€Xªä2×ÌF~.˜Ð 0H¿I°ïøÐw|LJÚ¿ôÖB}íaJ÷½)ÜPêŽÒ¶eb­wÝ(ó®j§ÊîFåñ¼EB±&ì?Ã¥ªõ²â=̪ھŠQQ¸– ŽÞ:~ +´mÚiZÛƒc%•¢BžíêøÚkîPMÕ©ZY¤¿.°ïøÐw|Ç¿ÿ”ÙN zó`nµŒâÐsRW´OìÍ«„#÷ÃõšŠ¦Š#"¡wu¥Å'ïK2T[¨%úDÿ4 G3îÐd²ç¨Æ¬•!8•h«Ò™0GÁF¾žók˜#èÀý‘7è;¾ã@ßñß¡Ëð^q´sÓ˜ÖTÈ‹Y·FS’O±u¤yUœÇ}ÿûq<—´+#ýó§÷ÅCwÙÔ£z„¼ìt~Õv ÃÖ ­Ý¼Ö-¿Ë…¶²Ž ™.²ÕàJå â}ôÏw|è;¾ãß yô)µ¹™Ë†¡cZ¸úy/ç{: Ó*hÛ˜ÓÒ9YÒÒL=ƒ›·¾Ÿcú 0¤¿|=¥ dñ *Á¸ñKµüóÅwŽ$“ê]‰Å'è]ôƒ}ž ó bb/ɨ =ï«úBCŠ‚þÒÏößñ ïøŽÿý`¨]Ÿì~Å´»)ð?Vy¿(”¥ôßñ]–KBÆnÔßįPénŠÉ?¸èQÁEiz§q¼YP+&BÿQ“ø{ôsó3“×Ù™¿'îÿ_Q‚ARj`zƒªï¼GÚ àÊÏö+$´¸BóTWÄþÐ~Çw|è;¾ãôv•öйmeî—k+Œr,|s« ­y®9<”æ‚0ë~äÇç@ŸWÓfEÿ ý„~RšNEèAs“ØoÑÏi0¬,–§Ÿ&'½B?µ½i#!­ð u/ÚÆ\n½Æ}Ç€¾§à;>ÚGR'¨½Y¥í÷£ᇔ­q–«.B8úW‘rWÂ{ ƒx)}“Ø“ëcíôÑûOúŒè 3z€ˆ-*zOÓ¿ Lók®÷¸ð µè‡hmOÀ{â§ûª¦……à?ôúž‚ïø °®Þ­ü&Ö-€ûÉÄOdwì BŠÍeX¡žF0(tH¼¢k`)ý…?©A@xfìúHrkxò¸{ñ"’¦2è¡Sn—'-,ž(Õ7xPÁðµ}óŒê ÿ $¤ª!EA?è;>ô=ßñ¯g€TÞ["ФÚ3VÁ‡A‹ºQk¯@åìæ‹žr‚\"«a,įU+½[…ÿê©ÖǤAIXƒ¤È¬dˆœ@šI ­~òü;#&ð»É´Lox—þÓÕžt©øUs`œ© ïøŽ}Çwüë ç ¥„?TfVÔ°ÜxHæ ÷D‘¥’§'$ÜpÇðØë’¯TØð÷`³û¼é@­å"ýj'ÛUË xÀd ­dU*j‘ø1ù•ùýESÕ ©j ‚ä.Só;¾ã@ßñÿ&ÈÞÝ5H^a†«d†²ò¤!þ0ë_4b–Fvtßè8Êò¬™¾ö>7KªvO‘BöÛýwèG³ §r×O 9,@yŽŒy¤óXÚ`¬†ê©T°|nTÏÁ óÖZ(›Ü·ñìAßñ ïøŽ7Ô‡÷ÉÍW‚Bt3—¿l¦ÍÂÄéU-Q'i6½¡ÓsæaWýú:2³GuzrÌ?WZæxÏrÖÒ}#Á?)u1å(ŸSž%¤wTPóº9#_ ÃÄ f2}ñ}Çw|è;¾ã1¤-¬Éˆ§§„ç´"gbiièö¶ª÷¢§‚BÕe®xF~Þ'ýü¥6Òª=ö†\jþµÖð}±÷œ¾A?9!ZªX!zèä¦nÕfÐìái/8¡â ƒ—ÑÞ“B‡‚RøûùŽïøÐw|¨_®ofÞƒ[ÕKÚÚ„SåUJn!N˜-ƒD—ÛTF}[Qd ÿFäxD£5ÿ´° WãUªñE 'ÞUg `p’¯}@|ÿžø‘¥ÓNoÐcÕcaò èƒAßñúŽïªà`¯*vƒ”, [)b Ly†¦’°0®1¤6ïÌò€´;÷σ“¶IüëÁЫ\ÃŽôiÖöSz°é¨6€†0KÂFe·{ø‡åàWŽƒ†{=úúT'ax+üV YccŒÔ†ÂCyßñúŽïø_ ´ç~0f7– Òâvd¯Òâz¶ÚZÇK1§“gÊœ Ò^T²¶X¡BföÖR!}…ï]¡Ÿ4ùNäý4&èÚͰA£/šD2úÖì¥ÉIRop†Þ?…ç{XÅ© 5ž†OBô]¾ã@ßñÿZþ§ ,­3Q(Óº…"ú‡Ì—@ƒåçÂ8=@ôˆZÈaokœôÀyÊžRõæ¶>ç R)*H +t%r•¤PÊEäO¥nK¾f-&ÃT‹§äÙP²&4J#:·Fά‘} Ðw|è{ ¾ã_Ž€²s8ìÈ‹¦°'7žÙòòªÑ­!ÚP×? d`eIf‹—²_ú<þÞþœ³°-¶yHÙÛ•g4‹ùɹˆ‰~j ¤‰’¤ý}¤õýÆŽe†ÒGd„`¨]Ïß„¢yjPô£¾ã@ßSðÿv¨û²H3Èx»ïj–þ$°xoçQ/É Hp!|ó.Òù¬Ò7“Òšy“÷ Ù¼YçïÑO8:¬S`Nx’ÿ±JW”!ÕšæŸ*Û¶õxö µÉ:ONDôßñ¯F@¾†hÏ’k…Œ© ßKS´’í£ :l¤@‘¢VÎsiãŽF¡Ñïei~nø2zn${‚ô- âÐ¥qr4ô@HO“m˜Œ>ÁëÜ&æ‚n }b{´û…L‹F5n§gµDB¶ŠrøïøŽ}ÇwükñÏÙ+# g„·›'Ü…@ÀO»y r¢÷ÐØÉB$äcĘhN>l¸ £yÀx¡Dt§õ3ðÒ’ÁP{ 4ô‰JÆgzÎKô¾0Pis&t3)&R bøUM‰Õüe+žÇ–ª°d}RƒsíxÛŒ]ûfÀ¾ã;>ôÿr¤•þ•rp,€!TÌÌ! €#h³8–k…1d"tÔ k54e5žEQMÚwHHŸ© ‡Ý]ìÑ„ºRÆ:u¯ŒŠáöP Ÿ |ðnì†þÑòG—NÛ¢ÄDKO˜Â«oõÍBzâ=ˆëL ÉÐ)•á;¾ã@ßñÿ:Ä(·ÇšqO±”À:ï½@¼\~ ÇB¶¨ ¶i5¥³Æäï§ßK{t ƒ~`ÅŸÐm—” z¢~þ Wb¾& [ê@(; ”Õ_jfá`P`µn9Iæ}4¡ô]gAdùœá·( /ñ;>ô=ßñ¯Æ?i2+#’¡#E.¿i+\¨9)$o‹Ž’h­Wî‹ 6#Û·ZAüü ƒôw·–6ŸE^C;¤"ƒê±¯BŒ"dÒdùDú1RÈh^þ UEé·är§´€Û/s†: Q˜C ¤×§z ÛüŽïøÐw|Çÿ>áÆ"ÇÄ E˜dètKº-Çw¸9[Ò‚ÎèÔüUAžMÑW)$å)¬£ïñáYYoàNsjj£Ï Ô<ö•j)B–ÏøÕ‚U-ð¡ý«ðå)| 0é™â¹%â©fߑ󑿵¹-ÿbµ&0;*ŒïøŽ}Çw$¶Ã0´ŒC IDATÄTU¢­w!çZüNJfý‹s÷íÃX<‘ˆ#ÄAg4¸ 1º7Y¡Ýsíˤ>Àoɨ½>ÏS×´ó7oʯzH .G¼Êj®`[–;èÜk/8ôÇ?¬Â¥èÈHEñ]ñ…>ðj$ÀJÑ2› E0ä'-L%g@ Ðw|Ç€¾ã;Z(MÂã€áŠfæ¡>Š.Ó¨|™);ŨÀy3%Oë¬hĈnôNüjý>9«ò`Š6´gF(«|ÑgÄK–pHCü„±u§g´kPPAÿ@Å{’Ö¢ƒ1PÝúæwÕîÙÙê•¥'«`„ˆÔ‚°Û‚vÌnm•ÌÑôúŽïøÐ1*S&œP9š~׳ɶ³ðìž Ãádò6Ÿi¯CÒœˆg깆…¦Ð9_{€ÊôÅr!M„|¹ªH°rì‹>Ñžá0é*ÒS‹hF?mI;Ì…Åéwtö6Ô²TãÌ»Hç6ºD7ÕH¼Jû ê#ìÔ’“³ï)J"ùŽòêà=ÄBÇw|è;¾ã_ €„T@½ŠZ%HÄvæ®ÙþA‹Å.ûÂ^° £veô½î‘ø•bïã¡ÝR«^Jæ»Y´“ V»‚;¤ÅüWÕúîhFn‰ûRÎŽÖpkTÁŠðgžG«§À:2è) Q{œêjã)=1žÕóüM†êtã>óöynö@ßñ ïøŽ"ãN¬v/ü¤ºgm\j0ƒ¬CûÚi„Pæ±Ð ÁÌ{AódÐcª»ž#þ°Úëóff)¯æþËVCQ7èGà|ðôÜ` nïzP¾$̺§û—•ßDÆè0âUb ¹‹»náu3`T2%»ôN£R‡MæHhsŸößñ ïøð07œµâ!¡-.\niñÄ#z‰£™~ˆÆSãF ŸèQÃÉx¯ÂÐÞ„ÄRƒQÌ4“:Ú7Œ„Ft•‰é ,%‹/äøÁŽ æx»¤”çÂÔxœU»ðCeËR´8UJ>Qáù®@=á‘îµÝ< Ú†‚ ;è>^gë§}Ç€¾§à;þÕíΠ XØâõ[()|¬]ÍN¸gЭ};€6'´ÓžC½~ª—îYmFÀ´lÉ耎Þ04§OÔP–À á‹+G‹lCé +ÇS²@0ù•ë¿Bðó=â‰=¬eWŸoåëc *ÅÜ9í5Ê2™æ¦µûP¿ã;þÍ×ÿÿïÿýöÅt]QýÂ.±–63þ–W!3¢®IŠ¡×ÿUUÇz}:öÿÆúsüר‡*|ú_ô¥ëãpÿu =&~ß뛪v”´ïõ›š™˜MÛǼþ˜6mÎió:ößsÎÿ¾þ¸þ7çÿ÷õçúð¿éK|×s×7šfs^ß{ž€(33“õÈúÃ×pûK þ0·/¼Ö†´;\#MnVÏs{LÄMûýÒÊZfù†»ÕµÝgÓlíð}}€çgµ3«·àR<9N¶¬OW€[‡Ÿñø`–Ÿ|‹ï:úJzðúâíâ–òƒx­µŠÒκ¢– bé¯ý•_ÿ{t1Òµo¯¡Ot=3‡ÄPëq÷ªf¤Åÿ卑楹ý ¿nùÌã÷o>{ã‡û=.üçuE‰o€pæšXqÑðï“þ”o=ï+üµúuìþ)ÔŒCãÁ†ç[3ôOuŸKçâëXëÐ^ÇY«ö‚6Òª¶W¿ëcü×þ—ßñúøÜ²–Q]‹¦î?ÆXK0üh|=Ô½šósæ'À~-÷ b{ºÎ’iÓ&¬£ÓÿÚËšíåmÚZܦyνìÍý• á4þÄêÕò|'\;w:?ÙŸËWpQè—ÅÀXײNbáxâîßÿ^ÿÚ÷êµK†§oç³›ÉZÃá+ëcå[×-8³öâéÇS)6jgg¿ž…¸‡]µMCuæS{¨š¦6ôúÿ¾5Þ|Ý(ôþ 7‰^quªª×fíz26©maÄõ™=K/–†Ñ¡b=s îCòæz’n¹Ýk¹¦ªÄæÉ8ï#8%D.Vú審ã¡öÌ%¼>¡ëwµèQå ÄÜ"v„°ëSsl…Dkºóæœ4¸×²P¥=(TÀV/£Öoñêq´Ð‚ö±HZK`^è ÒäV¦u( j@ [1‘dwP’¸8± ~ôoÐO;o˜Ì°ÛT s TÜê#! L¿ä]B­Ú:wö5a±’èól‡þú X“9Öz»¿ ©üSêÊý†súçþçÙi¼æ?Ï*}öአ¶2¾Ü9\mјH~Ì1‰™Ù”¼©Ÿ|à _fðbi&K2ôÙ g_1üÒ¡;ÀÁîÞýs:_¯ëO{³4ô÷HèymHà¦x—ûÛÝÀAh,&ë?ÄIšõäg>KŸ²×{Ñò7úbN‡† ÜÄQ%fä(òM ¯¬O6CsÈ¢óe‚B3¡D•ð×$Ò? m¬sRØ…Ð’ÛRE4‘ÚiSÂ`9ÛFP3Ýðñ` á§R+út¾³Ú…Šì$øš©¾šµÀŒßpò‡®¥- äHæºaŒëÑ¿‚côЪ¢¶±šÚõ²”W@®|uñUâŸl&i7uÏ[.myƒû§½¤x³H ª4(WÇ,Ž-´ #ˆ~Î?²³bÄ}•éqÍÔ×EN‡<¿s2™†ðDSÿ`… ‰‘‘Ã'˜ Çœ6F–ÚÂ…¯]-}w©7­[èVK¯´Ö §úÔÂV|ÑÛVR |i„®YBe¢…ÄÕˆa7”Ú›•Z(‰NÃsšç$Ðâsö 0èd-8ô˜>T8`ˆ‘ØS‰û¤…¼'?À˜Îý$È“™ž~ƒÏäƒÑãs.†¨òŒ…Ê_áiÇ6_!­àÏÖ`7 ;bÍô/ýL3`wò|I`dý-³@9™&ª(Ÿc‘™\#"ýÙïè3ßbæGÕ"V×G•rSx§"‡¸uè³~œ…`¦û£ ØI…~Öéeû${€>Z]¸d뀰l-DŒ×Ï¡*CeQ3¦€† Sƒ¾0o’D›/yL6üѵønzZawG¸]¡þ "Ô òÜÔ¯/.¿Ü1¬…×¾I ¨l–:äͰàºC?ºßúÅÂ`ŒüI¨P&$Ó)7dJ=õ§?U7ÀHæáBK“+&í)ß1‰Ø‘¦Êø„¡^ŠTÁZ}ø‚jÃå /ì.eæ»,²ëKî'B?i(šb“/$ø•ÔÅd¿?4 ˜H,¨VŠë.Ï=MsÛl»¾mÙlÑŠÃH …O¢B¹Ìÿ´<×ÿ ™¿ÅÎË[½óîQ:0Ó½’á÷X]j¯˜ _Î6æ¬ Ä}uù”Utpÿã˜EBbÝ8ƒþU@š)Ù0:ñ6âJslý露F‹ž Ç´f¾8÷²(Ϭíë¿„Žš»¦îk[7êòãÙþO´ü¶·ÌZp†šöÇf ()FË«ªÈòÙõÇ5Ç#Û€M0i¨šD5Lôz\ѽroÐ àŽ-Ø,¥ Ûµ-Ÿ½¾â„$½(¦Tr‡u~`z™ìÉæé0L¼9Þ·F?¢Á¨(Áô£aC¹´—6;2„–w 0ha£üç4,檙/ÚV<­·¶Kûb­¼õ”^ùl*¾e€’Ù½ûª‰Ÿ[Ù+º<ÐOÃn:/B»«þ“5XVÒi…´"¢fOúeHpOµ Gátò¨ ßH][&{éÐy©kýOÐ>ˆ"²ß¯Pµ‚Œ/2½öp¤ˆ cÝ'&´£ÒžœB¸[¸ýõíÈšN>#äW"b€Ðˆn4is–j1›Ëý#³6ÁŠlî_FXsþÅÜŸI¬QAUN )\ÏýX6#Ð"ö±à²#ka'õ$©£E²ÇÎ…Û¹bH t`ºïŸ-[Ç0 Ãÿ•%K‹V*à‰Ðrù[á"·^ßï8rEÙt½KÿZ',4&°Ö’+U­äm|ð“Ph©Öû}I¬¶,‚sSÉw¸²LÎ<ÿÐŒE×9¼ •ÍY+ù~§ˆ )x’÷9ßÙ)…®ƒÇú{Ÿð,—+{h)’,Cž<eM!4$?¯C|O~Š™ø’J3[sÛ™¾ôKR(µÊkv—+Yv)‰H‹~ä.Lò·¥<ÚñƒûŒ´TA+ýIåt#ôQsm+^¾ :‚FFÈ@ñŠñŸ$éÑnØŸêêõD¥q40<ìm%+ˆý³€fé2²-–íÌU‹ÖÿÕŸI7œ£&WýNF×ñAÖ šütÝ’–àÒÒ<£‡€ŽÞeM@ˆT)isQmvRëkÐ?§£úar†³rB-ÊÆïX8»«àn]4O)x=¢a}ì¼Â¶xÈ>µØ´CUõ4$g6K6™3†Îp•ÌP0 }"4HÜϪd ÚR€ÚQ†·4ÞË«ŠF'ü-CÝ2¶…½‡¿”|Ð6EÊçWôƒÿbŸ8wëÔ WòÆJp3@Ù¬mrvõ‡0J«Ô#‚hÁs„DŒóYFBzÿ³·Gésç¬ÃŽ*­ËÊ#îåË"×€S¨ö àÏ· %M$Nâ‡OêìCf¹Ô¯»‘K[‹îÂJ¥+äs?èG²½•wᡌÕëyaôO¤ŠnÈáÆì¼#ˆ‚ ÷Àö4@ýv,j[o¦ÀeÖ}»`•Õÿè,™A8BX†Mçéý…y˜…~ô±Ò I4ìÌ„{hF=º‚f¬æ-ýCwN ©§Ë½•þƒ{ÖÛÃévÊTñð‹ì¸:-·­ºm=º°ŒÚ<@Hé—Ñ MXºÎ#6¨mï} c·¯%Çæz¡’µéûcƒ †ŠÇ8ëñÞã/FÈC úAŒ†©¿PË¿ñ\*ŸÎižÖ‡@•¤/šmy-åƒVgTIêGz¶…İLoöä˜S>ZÑêÏüx”{³eÞÙ{l/pôž´çü¡úÉš—Lï¼ú(—= š˜j†ÿÒ ð¨Â¸0])ìõ*|B˜X¸5Û¤CõE–À2¨ìºo6v2¢%K1ž&ñPB‡3 þBè„¡ ¨¨7MÍ…â'áý ú™:‹¾ä.Q2¹s*÷˜ÂDPƵ,“hÚ’Ê=å³w(ï~Ù}ifa",J¶OƒuBps<éNÈ‚A¦Fñj\àŒ™¸ŸÉ¸gVi=áŸ[õpˆjÍà†.]Øg,Ìþ@B{ب¹æCyG̤o2{;åõ^ã^dˆn=Û›êiø!qL\Ëó=¸‘ÑÄö…B™z¾Ö˜u™òWä{àYwØìÑ¥|í” uãZÃè°c¿RUÂ;œgX{b7ÕÚ œZëþýuëÆúYäЕØP½”ÒS›}$pkm Íô A–°²ð@m ™7¤5¾éÇm‰ºÄö®³‘7£úÐÚšœ) +^&õ ßýj¢±t¼­õ|C©jwc9»Gr•9ÉpM }ν@î í»Ã„=?ªÃÅ^îç•:g¥ÃCá¨TJ‰%å‹Ð³SBÇà ¸¹ÕÈ#–Þ×]JÆJ {þbuzãG°þžÅ¡H—*Ò+ÈHR¥ÁÂ3…/‡Ü›»Œ…k{Ö¨Crq¬òA€焎_Ô§*8mórMËI}Vú{Œ†Üú™ÝzwÈØSQ>³¶KÏ09_isÐ$éœ8JˆP7ÍS_ðx>-¥´ËA¶7(îûQ9|Ï< AñˆÜ©dêaì†Þ3 ¥ñ-]™Ž~ݲÏÕsÌ  ‡8`R1¶œÏg ÜÐ!¦òT"ò››¤)óõVô*ÚçÍ…ìÅ}T%¯‘¥ H¥`´±);«äînìBàýëbj¢uNøìþ…w Ì$·‚Òxl=…Û1Jð8¾o£lEŽî ¡‰¸„†[ —tÝZFÝ„U;9BÌá“‘+‡XJ˜æ£”Sä“P>+Â2µ9-áÄ­ûMïršYé*«Bv¼Øz†H²“½ÖƒN)Òdnn¦dd/º4þÀÿ‡ÑÐ Nè×oϺ ¤¿É1â-JlÌßVw8ú¿äÝ ÒåC 6é_)þü{hiˆsé¶ \†Ìú=ø• @’ª"ÐgR:sˆþ™3ÁœYj^Æ.!Ny®?.Ð{€ RïУ8A°søš[}Õµ&ÊÓ¼Þ£&ôÎ\˜e¡uÍK¹¦U:â,ŒCjÛdq²ÝÜD~v\QG'y¡ ªH ”B‘õ ì}uØñ- ôa…“r‹w z-såÓùXL{SÖÎÕ¥P…º^M‹¨:‘V9ƒÍ0í.ê6‡>aé{ˆž rUº’œD¹üD¡• ýÆÿW^ºàöú˜Ú|™¢SÇý—Öð4|Amdï3€T‹W6B‹qîfWF%)¶ @„ƒÈI£|H Îçð+äÂW-òx[ó›ŸU¡o®%WoBŠz'"eF?r½ü åGB¹ \ýà…ìˆiÐOéT-¬½ø†&äRÿíì©^€¹/d6Ýý°‘M¯8F"Z³v÷$Ð4S0GÐG ´7Ë ~ßIq½ÄwÞï LP«=̹C+3P“òjíÑ/êAå;K»`uëÖl)Zf ÿèG x¤©¡ØGG?ºrÃbª÷*%ŽÕé“eý´j?¸Ë}eò|Ø&K9(Ã#|•¼—M×:-' ²Æ!ÁêÎ*È œt~ R`yB?…WºìTGÈ=΄~®Œ\9)±{²šø†C1M¨ B{¶ø]+ÝOÚ@:«P¦Enƒ†«õy•É> –[:7–ñd}Ø©ÛqÆ8Àû‚á¼a©~Žùi=EõØO€çöÞ7á…EZO5¾þÛüè܆…@ûr­m¨[B8ìüÊç´+,‚rä9Ýl|A½Ñ–ô*ýæ±ÑpÌÑÍ ffôqÎO¥ŽE³tx\kFɘëÉn$O‚VtåÎ{MZïHž^óB$LD$D8Ÿütê˜?Ò2m IB‚¤t³c¡>´•ž|º`'¸…>ëC«"•Ä\Jnh23y E{±SÁž­®£Ùëé;@a”Ø?å´ \ù­˜à+õS'dýy;­Lü&í©N¡qgrן`%û!ÀDã¬ÄY©œ„DЇû¹ˆáë¬÷gT:¿Êê‰>­QÑún¶ˆÖ4|°;è½Bî-¯µŽj2§ „)3g—$˜€bÂ&?I5 öäü/H7MiÜ1¬;„¯WAêo#gA¼X8 AÇSH¤'l‘N`¸|¼ã‘¢f,šNþƒÜ½»fY9ÉCZ$òÈ`$t»eqgBæôîI°à- d‰£ŽîkqUgÑJ>1qI†&¤‚8¯ÌÃoŒ‰†ëÜCV¨cøÕbx©£èj@®Õ­°‹ÈIs(M…ÁqØCí’:e}‹rK" 4—[úº}ž©ùiSLG½Íй+XÖD¡l©.~¶ëÚùb[ _-ÍC©Ðdõ„%ù¬âASî;°8äÀè'Ž“öxæNíú¡×ç®Á/Ù©b©(3>¨S`¯»û ¹ üôÑ] vÐ+ÁHPëƒUÉ©U3Q:»_? ì7Ç“˜½0ÍyF›Åá×ùš4U(*®Z??=oÄ•Y)M?’*Ì©1°_ÉéÒJDV0ŽƒeY5~4Úè[Ë5°Õ`—þ$ŽÖ`»CIákf?-íõxù[õñûJ²¯fØ.W†Â—*Øÿ1‘êï¬Í7Òv¼‡:¿ôdóbÓÍ ‰K(ckF lYþÚÅNûÚc¤p…?ÍÝ98 ´ °‹róÊ2¸”©"&3G& ~±4-W©ûœã{¦ÍX{: èÌPV â i‡a|,hl3¤ûØÍÚ[ûãIè[pÁ×χE´¤ü N[ ¦_£êô”_sš›0v댇Öóh•ú™oåü~×ÙI 8€}:JM∶©ÊªIµPÓáE% ]sá®ó 8½W¶:¿q|4ë"@b“d´ˆh(oŠ1x8ýÓSh7èg!ÊÅÍÇÂ¥“Š3YrZôD|rsw—Ím]ó~XPN²§ '•[ŠŠe`§yÏ¢s]roÃ¥žµN)û)ú»$tQ©À¤Ê®ù;¤Š þŸœ“I>ë¨Ð¦zúçÙ¯ÒT0»ÂÄØ¢Êµ¶·ï;5vPgÊð@¸x¯Ý-Æq©™ôùÏ‚RC(5$ü‡°Éóó(×I[ÊØêN Y¥NkIñq;û3þáÍcèÊYÎd€!€Akã^èd>,‚Žˆ 2ƒîw1™ÜI¬Æ4À•Y›-lÍàÊ)ߘ’£3úISô9DçëçA{Lx ‰NÄ}¼ˆÃšÀ»”³56dÚM“±]å ˆmI º…Q‘B>Ô£‚ÄM €ðÜç¬9ôP7ª5ñúÂî“Ј$uÍŒ1о† Äø PÈÞ”LÝÝ+W»»8³ÊUý´Jjë å9•ÇY‚k#öš–ªä#ôÑ14¬ß¹]Ot9Ù¯p¡Øö0QÖ'LZ¬cö¨Tóž ÃŽÖS †c—FÌÓÉzMßOén?hZè>ýÿ‰œßfñ:ôCo*f}¶%HûlÑ mgE“?:€¸58¢åÍØõäYJ¨Ð}VÁZ$ šQÇéTi¶ é, Ó¼§HUÅ:‡‘ÇïÏéf þÙÿ‡Ù#yáòýq5µ™*`#‘:œÄc·vÚ€x»£z¯~€vŒxXc†1aJSÀ°´tƒfÌ8œjyp-¾PS)ýy©RÄ÷lH"Áï†äÉDÓòýTI‰}†P‡~ö7øƒãQÌì÷$¦ jwá,=ïgã²<šlPB˜rÀPxî†ÂV§ª?¼ïî¢Ô‹IôH šØýþ׺¹¦»N¿×ª7õ¹¯ë#‹=`¬ŽI]Öà™@„¨¤$®ÙÚ\@ñ2ªòŸI4»Ê‘Ð<åPÙvŠÞ W­>ÊN‘_ÑÏ›MˆåM¼ƒ«Ú–KÏrýDÎ.‹¤Ÿ„+á«r 8}Œô –΄É3H“b÷Qò\šK§¥ÆnH£œ\ ì8æ0CÁ4K4£d€4Ýg„HhÏ8)#Чë+«RQßþÖé×pF˜I†§ß˜tñO(‡\ÊvÌ‹à†fI¨Z@ Dß‹HÖ©á!Üü/Ô0{éúù’d/,5oE±ºûý9¡%(1E¸Ä¬Œ;ÝÖMaˆfœñsJh÷Vöe$ñfLb.XJ­¤ÁgÍú—¥ÅY~‘Ð{Õ*ð÷PNsÙ}:‹0¡„„fѯÙ§ˆ´h@{€`άÀiäØ<OGÅ r ‰¹¹–ëy1fƒª0&X|¦M'=ÚÓ¶GúÐB„ŠÖoä8Áê¡ÉÞh4ȃákóÍ×w—¡Ös¬¶O‡nZÙQû‚}\X³‹Ö'䲡ã@*nìôÎÿq{íKEHèe•¬YÑõ#쨴ÐG>J}xÍ|ˆïÕ3¤±Àò0ù IDAT䋳xaèŽxxÄÆ@‚“§0>ƒïH*·´å~\f²áÚ ÎxRL‚éU`7âj[ó²Za€© QÕÝF±‡ aŠHŽx®Ã»é56ª oÄ>ÁÄ?e4ÿÆýéÒwK)mæ}°ô, ¸$ì47³)gÛ=áUb2o; çÀ"î):1ôGMê ŽØ_©¿€[…Ë>€âá@Õ– ¢3À4ª+Ž2€Ÿ’ê @ëOÙ«æ~$Ý{IkSl\?Ìig\œC†‰ÔÀmÖi–سjcx3ïâ ÏÂ|´UÏÚú3g~ªà RÇþðD,{˜úÕ?¢¢N 䇡ÒKçÁB×Ï>.£³(£œI·¸=(B>0hvR¬­¿¨AoÀfºÖÓpžœ˜å,uXÓÅ…jT!às…Ê ÄWŒÒ;ÉÊ[é½±@–4Ò-úÑ0æÅd*'‰ý¡¨gr:Ü—H½@±Ì%³ŠøÙ‹ã¸ô½5¯B«è r9C9×ÇS™ëåJ:'ÐÎ{Ü–sçç–'¾"qÉ×à3,†qÔ 8ºað#g›>{‚¨ñ´„DüÊ“ï¿E?ìë%á–;ôC Grn4™€bPKW‡¶ä\ú\ÁÓ€ Z¡ eêÕŒÂ:¶‡Œì+t»NVÄÅf]C'd˜Ãâ”ØGñ8ÝhôxÂ=ö2 òŸieí8]݆ÔZ,«¨$€sÛ™ÂJƒœÛq¤fF \Áþ ægrèxœž nø˜vm+«ôù³$Ãô;È^"iô … j'’å9CžoÏ“bLêôè´·'ôC ²bH •ú[šÙ”YWo%1l¶Ð'ø{Š)²ZÏš‰äáɯy}fd€€ø,H ÊÏoOßn0œ;Ün'Øvw©™Í©ã°…Àý¨^Ò˜\ŠØ¼ö—¸Z~…5-em­SaÔB»&óCÐ b$\IOÇC ÐëCh׺šÂĽý0‡À0TûvÌ«¥°ß’@jÖX}´[%ÂR˜§ºÕ ±>’Á"é'M€ æ:ôCOî‡HC0ýÛIÝø#ËëCSêûK½]hR%|"6 ŸjOÁ†Ì‚ 2b€0ýEL8ëÜ@³GyG-Ã^%Èy#1LÄŸ²)ÑÏH@v‡‡P¨·yåá¯D PÖ QEnõ?w€h1ȳ¿Å9A;$°QöšÞ”òö’©_^õ«Î¾wž›– BwÀÛ$èG¬§ìï`P£ÂtYô¹ˆí›s€Â÷HŠql˜_Æœe 1®¿ñEqšC‘ó£…Š¡\÷b*²…°KÛñeê)Eà(SL?ÜÆ¡2úYrÔ²Ì*o0·€Í™‹ã©uÆF0†G Ÿ²Êï\¦þ)¨~j–®wñI-H P¡ë» ƒ`2UÆ‘0µÝbë_Ó¦Ìë-9àQÀ@È¢YÚ‰¢7¼Âß>‰¥Ø|«M?/Àœ´¡Mÿ¬pèxeLïø¢Æü?Ü~Joì[K(ϸ'‚ECØ.Ái)ÇnÑèç’SZè[íO}ƒ(›Bô£‡t±¨i˜Ñs]ûL1¡óîlÓCÑrq³Ü@ZÕÞ]`p7Úm®*ê¡h¨×¸ ©d7»Ôu§5úW˜û¼\¬ U&üšÑÏè`Ðꘔù@Jy⪅離²}ê‰í–á"N`éS°ÓÂD¸Î]{dd°"lûœÏékFÊ?g!t/VÎ}…ñ漬-É&Žt²—½ñóü–¨}§-&8 Ú ‘J£òámC[¦4Æé$й¦À6ÎqÐÍV¾öèT ˆ…º¬;«Ù{î2g€@Í 8KØÿ,qæëp Ó¤ìŸ`|ÂzUCêÌÒ»C}ñçáSäsS—a\ðl‹Žs.gãÈsÍ01oB¡÷¼ƒìH¦8¦87þšj²áÎT½è qìdC{Žb –i ó€ÔóŒVáDDKtq@ÞŽê_¿·’_ÄM¯PTëöHIm4?!¢Ww_.Жˆ~Êí¤}£’n(•Ñ%’È ™ä…¥5_æ hpwJ_û§óçYÑ<¬1Й 3 VÓôñ¹y#¤ y„(·ƒÊÜæÁѦÉìUïTåŠëât³ÑGB¬˜Àô» )1lüðz Gx)½”ýC1íƒ; éŠèR„¹>“µÂ¢ ]ôG®€ÞEaGt?´RèO©Ø‚{X¥C'F´zr*‘üÝ̻݊Uñ~9 ÖnX­™¦âÓ-„mÂ73@P‰„bI ”…ÏfU‰J·ÿ £=‘Ó+ØÏ—úW€AÄÊ&7ôÙIØVÏÍdž×c;Û/°àçœêpG.ˆK髤VlŒ9¨gR¼õk'6´$rX[‹AXfHöB_ÍÍð€+ŽÏšS¹…‚ÊW®$„þ÷£¤Oâ ´ÞHƒãG(HˆÒ‘ñ‰©0i}DÞ PÃBË÷ã}4ËHÆÒ—G±š‡!ª<¾]>[¡ïô|B>˜3š:¼áx¯µJ‘Q 4gŠ>™¿TÛ*Œàvª3•2"<Œ~È =t°FV££L Qq6­À^ ¡:[y(@š¹hJA76˜©™øÌh $©z,g)ïÊ:úß(POpÅì³X©Zý¢ŠÙ»Ñ²®WöPÂźS…Hð&±isÈcýQv½÷LÏ* FJO9†± s}½ÄÒh,É…VRÙT·l¬n‹àº×¿’¦äŒ¢ÊLç~€f°7¹ÀÆ'˜†Q0ñà6pCcÿí5´GÁÐfsÚ9EeexOQ›#b c[tê’_Sf:M^0íE´6Cûd˜ë ¡ÆBõqLÊK4(hÄj˜*…Q`>¥8ä:oàÎ/Yšƒï´šã’í£“`îü,ݘ³<¦ýŒÂ 2Âò©m˹Ā3ô€Á.à°ÛoöîiI_ËÛï&|â$šk¯·Çäïô‡ò:Îí3»oÆ|ÎL€Â³jwzVKf·øÊggv£þU!þòÅt|3š=/"qy6å`èà}ÎÕè;¬öœQÁ4¿U©ØÊŽ©?ÜÜß·À,-žO®d~Îîm_¥!ð—ëƒÝá+¤±—þéÀ9½ÿy,Sº¹£rCKa‚†RwÇYpD£^Fƒ`NóœIø4‚õFˆë^Ó‡ÿ=ņÉÓ3Ï>¤ ñ\‹¡)™çáçÌXÀ?3Ô¢é@3±F ôÉó\3àª{æô™ôÔý ׬3B˼++¿‡çmÍ@C‚OØú.úä?-:æ<ýs#"N ËXz͆éá„T·=è²HO“aÇLý_"f6u®¿3“@Æ!Ç ´£«µÂJ%«È‡ÆD.c¤$ж]£×J–æáσ)Ý=Þ F® Ô6¨HŸ¨©Fª$Ô›²Èu Qç¿{L4š‰÷\“¤ÌÝó¦ Òî'ÜÐðÁ†þaºC÷'à”£"WTƒ£Ú1&åËDf\waä .éöë‰/O´é¥¿ßÙ¿ïÈ¿NÃÌË󲊇ZŠr¤ÓúoD7»à3ö«7Fð ‡| )ˆ ØE§•£¿Ê9l߀E±Û–¦€v1³ÙÎÑŒSqg!WÈ}.ƒi¿úEdJÎ?ϹbÚJH?³'þçÿX†ú*Qk‰'ƒ€‡ f«!y1(ǰ±Á7ˆm©z™€0­¯æçXײ%½ÅŒˆÍ)c˜Èõ÷4ðfˆUf"Œ k €v‡ÖL?Dœ°šqþ†Ýµ[.rÈ!|2­ô%\VŸ'LðË–ÀîG+‹PÀûõÒZñàp†ãØ` ýð×_wŠdК‰ßCaóÚj. $2‡.‹ô ¤èå³Þ9q'–Œ¯Y{Tn3Ù'«Ð—ò_ÈŸ“ëÕH"åçNSšŽ¥Ù;™Rÿ½¶9A…1–n‰ÍÚ¡ÎÁ…°púÈã¨{Ãý ­¤“‘mÕõ/E܇rõ®^Û:ûšÌ8«€UÑkí6èÙ_:ªïéótl ”—%t¿z7ý *Ò-÷Â|.ŠöÃ‚ÖÆÀ x%ò~ˆ1ܯ#˜ž‘R¸oîÍX…Å7UQÿ’;l|·ö™`bŸU*5>¥fABÅ×÷€)ùÜ·?—vø£K–ÿ+oñ;—ØG³Ý2G…ö`¿Í£iåIVЂ ªî_rá8Ëc´QŸP°5ÿ®‡¢ðß³31-m°44ðïk—4æœC‡èœ:4ì“–)L÷%&<>ü%¡ýôj øgΪ¾¹ËÔÜLÞ3gD0sæ/e4%$ÈÉÌÍs› w>³ÕÆ·W¶ØWÙUÇà§AÿŠÍº…°i66ãYÐ×* :lN©è˜-ªSιbÔ+ I)`QŠo '‚ÖÛ"X¡ÅÂ`K @LyAñ~ž_ #St(XèNè6ô¹%þMyûBkYŠ©=[‘@?& Á·Mãò×(R‚ÃðûH´BXåôi¶'i®MÐ~ä®3¶mÐý=[ »@ÐLïÈÁVhò'`ÿƒmHÑÍ™ˆ¸â>{\ÒØW…0ჼ Ô4Ÿ×3 ¡ÃEoP+„iÙgÀbbU€4)Ì|‘:Ûœ*Æéîq³Ø—]ðÌÅ_¸v±×W¡QqÒpŽ›5ÕÉ}Ï„5À$ºu,ó@φë‡ÈJFèæþöä²l€Hó_¡ ŸrjÔ£hÒã€>ß嘠•˜!Œ œõ\@ ý,Ü3¦È˜2U†ÊTH­3M¦z£0Æ8‡ÍƒöúÉ–_¤”ÀêäžJGË­«¥ï™n–´Ù&X“i¾˜—}i޳æJª'>em‰ÜˆŒ¯Æ¶-!l®Ü¨©&6Ç«lná¢ÖôøEÿ\Ûœó¢…&ŽŸ‘øi6”¢hV¦X5¡#ëu¸av¹/ZZ4ŒF!¼Ê±Î™Ý¡Þï¿LÓh¯´Yì§Ã$Q>© Cɤz/oý`qÔk°ùy¯šX&ÕS³øb8Ø|í%w_'¨t {Ú½n¸ÏÅ5qA좠Ïשáôî³…—Zm˜‰x’¬òšê“^µ€nþeTï™{°u3=Œ~†s?ŽnÑOŒBXð%]=*ùå #Ä=Qعõ&x%j hž}9ˆl‰œÀ—¹¯ÃdùDƘ2uŽ¡StˆNYs甆;þç,÷šž« €v¿˜4z›4¸"k5tQ=¸UÝ!á2 • çú¨Úê7£1?ÿ–û))J4˜ #ŸhRLÎð–Œi&—ýG–ÛJ…;À(èB;¦çc1¦ëæUÚ&cIbSdx͉S´Ÿb #!¶\¶1h×T-=ã/ÂÁlaH¸Ó¤úXgNíî^°w&Âç ° …°‰“|rÎ!&üX ²dx[ƒÊ3A(¢€rrÏ•û  ¯#0o½;xÇ© õOÂÅ„U°x½ówßuÅ›·pÄ=ç ¤h›ƒü[V§H~˜è“”òLðˆ°d(³yC/²g,ñk¹}΋ˆâæ†ì˜ËÙŒö? $: Ÿã„Æ”9Åæ6;½)©ë挑˜EIÃ?£µw.ç9ÿ9^ãþAþóB½ùǼ—7‘ÒÐ9¯â­7þ$Û"Žëa.b.“„ŠœÝI…5ôChДjKv:ái¼$Ì1eʃn³ д¡:ÏUÐNî–+œéùAq ‡ØA¬û’CfŒf3:?ó#ÞEûÌÄf¤ûCìT£îÅ@3iOƳ‚:Éý4ՙܿ¬`:§ 5›r µo‰`^êd-Ęã¡CÊœãƒsXލôSD4höt?Ï«úØ:%áNpxè‡G+•æU r,ÿÓ‡eYšAÛ°Réà§‚Ö•ˆ îŒ8ýÎ!@<äKä {æÄF½Yï÷wõã={H:|@çò¢B·¡E4àŒm BÐs("[x(­‡ Ô”K¿š£Û®-.Ë€Ï 8xÜ%sûQ±™tÄ$hÏúº0Ðæ…Æ4"´}@P¾¢Í çm@¯ùƹb†F´ÈAȇéÑ ‡‰pj}1iÖl4+˜ñ‹{Aë¢ç1{F*d ýSàò#³Wè°á³Ô‰‘àeasæ as.°•= ÑæŽ>Ýí§vj1 *ŒÎºvÿ Ûr¡ŸËü&ל¼Ô!F´ g¶Ÿ¼å)cü8_ ÚŽ=•ÅÐ\WøehŸ"¢ëÕ6Ó±Ô­KéºØ ‹èQQ—Æ.í,'æø¢¼”‡. Ð']dó±NXs1&/ I“X¾°ÏÞ¯ŸTjÁK *¨!Ð3¤lDéÅ D=q %¬¡q¯àNJÿ©²®= ]± ‡!#4®Ðà¼ÚÑ'Ö-ô”ÿqts„A>ƒn÷ï {y•sƒøn¾ˆÌÍ`Ææ(¦Ã¸ëM Êî ê4\%Ý|?ÔJ!·Šñ=û•Ú¯ãbƒ€ £Ê ‚(ÄQ† ÙDå7þ'].cƒ ÜÆÂT!~˜š4…B››p 4ÀçÚÙµ›k÷_Çý”K«XA²]ÈìYÏJÞ-ÚÝ¢tÆ¢úÎ}L@ðdÍÀ‚n0¿¬@îÿÓÍþ¨D¿óíÜŒ1æ¸Õyº»MU’ “†ÀŒfà©mC¸tìÍûÛÝ™ì–AÍͰX£Ø]}{NMº”Ä?ùPœ(öòÝÐI»æiÏ0› å`&Œà ²<퇕›bc­—=âØ€Ä¦Îë×9ã`›š‹'ZãcÓtDROhÂy HI#êaÍö¡i|žInU0)Fbœôp@Ö‰N/›bŸTƒOõ™¾“Úµ™øÔÏGœ¦æ=v%{á³Ãè÷xPÐÓÔ#³ï k·ÞËMëc¯ÛRîq5z:ýÂÛ"á]¹î´í%$­øe?]NÙîÃRWá*]ØÙD®Ð²¾ºP÷[^Ý‹¤Ï Ãñ>Â}mü羌1lÎya Cüàô $¯s_¯%ðjÔƒQN‹¼@óÌ'¼Rù̾ØëÙô“.¸ÎËor?þB'éKJȬ=Óv)%¢n«©×,ØÊvºZ,æÜ®h½¼<ëý=wHôR¾Tuš8-¤Û$tüC¿¤cÚàöëd¹œÊ–U§åëüy¡±?Ï6DYÜy]û¯€ï)óø!†ˆã‰ÖEÎk ¥—R¦ºÜÐÓt-Ë&b:vˆÂ™8ƒ–ûÝêí¥3 žôx}¶ò…éŸn¬ë¾$T‡j¶Ë$‡"µ6ü³‚ä¿ä„î E5í©±ÙTž¦Þ%ðfR ]EGÅp<ׄ…! é­êí@”A¸FþbH}~òŽo΋ø‘9eÈ°áÆ¿ öoÉÏ̯,,«1pû묤ÔaôýèƒZ“?ÍS¥Å9YÞþ¦Rh}U¦^ç…{XÓ¨… bødÍÕ§b Aô þÖâ“C൳ãhÀ§ÂS£/‡AoÞ‰¬¾:©@GAî-1ÀÈöoðä¶1vð`±£µLQD$¯aP|P³ü#ÔîéâgÖ¸]ÔÌ¥( ¬…Q˜Ð–Ô ÔVÐÂ̸µ[qÔY¼Ëû²Ë´!ëBáú×Ðkþ}úâb;YΰêE ÑúÈ•øœ?R‚©Ù–Ì M¬£Ì̓·h>*jó‘ø ž¦?…§Îš3)"Zcu+3µŒFw$a 7—a’§sO“±Ò½×«¾wÀªbSLeîöºUeÇévÅ‹&ÈTlÊå±–±1ַĪ¥Cxv*ôòå:Ÿ}0:|÷„äD®id稨`zõüÎýÜ™ ©IRþÑèÿh°–¿$¡œF7˜ReÆðSf¡CRœ&Ç&­’4oÞ ŸÛ ‡ Ö˜˜ ›*{OtƒŒq¬2Và‡K`º±¶L¬bþÞ¶Zf#Hm…Ö»9£d‚F+A i`Òš¸Æ¿Á³¡ Ÿ €NÝí­– C·Ú4h•òšo ¹χ:=¸ü¼ k?:ý âôÞ3’MQì{e _¯qs5ÖMW».çóò;N®3ßõ/-„°kD0O¬…ç–ø2wæFøÔV$Lô [9"Ž )Èra6þ¸žýÿ3´ï†¤¨r³ 8ôY}³vt~c×ózf)ë™Ãðïß“†ƒ$îò:[ĤÚ7èrüuãÓx“íÁ‚ìùú! ÈìßóâgÌFkþùÌ~˜ãžš|ë†ÆÊ™ò’i †ôìè¢1 ,‚ å¶wOb÷Ï>óœî{c£®’òJé•K3 IDATm@ø9ÄÚQÐG…JbLâ|4 ßP9¥£èÉJw”X › %g'CüÀ˜z„Ð&¬¸å#±IÉs¹%v §ÛÌuy¿¨YöpK9¸ 1ÎÜûYiMt¢?eù…6 ’Õª1TlªŽi6D¦Í!ƒq m ;ƒ¨ûsüb¯!v?õ[±²ãl¼*¶©ë½)óopÏcœÁ[ Ôb3B­cð΋§ô¯‡\%tûÈà@h^Gp@CûZ˜Tz/ÄJ^0»ýY1qa_í&Åÿœ‚;§÷â„Ý9–6ņڔéh†QЯ¹ßhnó¡P´•À#ÕÚ„»§s€ZÀ ìV¨f»âï^_Q AÇt^F@?Ý å’^Ôiõ†ê™Ä30õ(_Kg¤¸Cf€Øeúï]:ÛÈu<Ðã¶)õ‡ „¾È?½7ciè|«UƒÂjf½Ý§ø9ÌjËs£p½F?y}êÜÐjÒtãH—€À$‹ªÁ4²*c#\KàåÔ¡W̺7AjžMïB‰.V&~|h5‘@rWÄ*7P§‡>òÈÍŸ§Ëº¹wútã?îú¶Zé Ð'œÃHkf;ÕÍûdS0gÔÜ3t%n‹Îmhˆ–q•e˜Ì9D.3Цy6Sñ—ò¥Wo˜L]¶iÓ±Ce¬l ™zõÄûeýTv~N@wsÇâã‡nÀØ" ØE ÒA¼JÑSòŸÐ¿ì-¤¹•ÛOÓêXx¢©ìkÁh„Ž!2êUS(#q$hð‚8* /ÉõÌ©Üjü$ì%Í@;ÿÐOm—_†wè ö8±ŸSlŒ5ù±YŸëŒs ÒDyÑN®2Ž.ñÖ#vC»Ñ,úN„ê[6P£•‹/üdHÑPÏ„Ÿ5'Kƒ±—$P4%SqvÞq‚Â1=Ïë™Ã”ŠõZ ù—ýuGâE\¡ÑÌåÓz4_í]qŽýhäX$VùžÖØ»t·b“ûè®>…hÖ9&îȤÊkqÏOvèÇj+UÚ4ܸ¡Á­éKwß@&œ,DuCô±!lšŒyízÆœëýÿ½\@¸´X¼š©ôÊ#¨õªƒI©l¦™A¸Ûýëò–*¿Í/rWƒ„ˆü1>»ÜÞûÔÌbö[0¼þŸ¢ŽÅç@q+z:Fá]=U¼U§,’FdÈÑÂvÀÏfçÞØ-ô#Û t! ]c›]ó„êÊCæ4ô¡Ø$4pÕ•Xð"/ZŒ9ÅÛŽQF0ç ‹\צ/ç=»þVÓ»›¢›ìÍ á0øec”ô²Wa ­§:R>4ý)¢ÃL¶ѼBî%ÉéöÅDy¸1d.óWð¡Ù\Øg^a2tÎ…xTD†è× -±mmÙpÚ'¡wv‘Ë15’Vߪ½Îk:Î 8? –°–%©Ó ¡1„ŠØõ±„_xþ+·aÜÙœ–ƒ±iÅÁV×;i²c«ûÛÿœ€Ý½Ï–²Åö˜é;ò%îÔ°¸H«pdœE7'ö WàÛMa&« 5­1¤åŠ+RÕorX€²¨h¤· veíQå…ºêaÐÅ|YpÉv>f § )dįMÿ¸z1M†Lô£S%Œ¾/ï3 fPÍv€Ò´"Ï"AÉ’7ú—<܇¢ç|ÖÔd_SKñËÿâùì¶£„4£‰@QZ@õVs›¥kmo=ÏØ»¬ >~ý‹ƒ¦\>hW.Š _Fѧ»&Âæ ›k*~Í‹M=vé¹ÐÒ8Canª×á hŸú£ûiQÝ-ñØk¡,þTS`4ú$áÄu¡¨#~%ÌGèóR³ŒÓ|M"£+œð@"!’`ì‰N÷D©æ¼ÆhRe§ …'H+Ÿ/±ÇDˆÐÀ9mª &9ÖùíCO¯³,Ýë¿ÌÆ”-‚é´1Æœ¦ù³”/]´©`”;ˆèÃ¥wÍ*;ÿ)Åø4{´’:½Ì±ç‰@^ŒP¢6ºW]4%øÑpÖÆ_mÁgÙÛ`F÷3I–r`ŽÏ3nl+|ðü(N[‹`•4+“ µêcA˜•Æg¸‚Ã@X@$VÂë÷¾I@¸OݧñF‹¿MLµùÉì¤,iuÊgH…fÿu;D*ÉÛ:[;âø ú@oÕÙ#@2‡ˆÌa:Etê ôçTø‚—Øú †Àd°LÉn‘2,±*T-Õ Å#Ü<|5ø¸jÿœó[ÌÛ†þ·h£7–½Ì’„(}7K8·w„é!—SÍleÎ?^f [vP—̼ó]lR,7oBêåºò¶òvÇ»ìr—mK_yôÔgÃû¼ˆãÁ‡ð‘’-É|ðvI4»…>öÎd%ÿñŽ Š®Šr…9戚…«LI”`õ \Q¤†R$Ì–i"TÐXÕr¯RlÍùÏ]‰ÑÓÈ2çöú\ˆLce`Í!ø?ä·LÕ@™Ë]ç“AÞ^½¼(ØÕh |ƒJÊDE àÀ×F£YRa‡C¡—QKà§+K#–=ôÑ-{{0†/â”loèùP/‚—úãHØCÝy|Maòh¥TburqÉ*Y®¢cÆ"åŸM;g]ˆv³*!ª2(ß‘=Ïf š²8uc?Ú¨ï@Ñ ­ûÅ$c"õ‹~ Ú“jOn©FCô™²Ã?xΞýZÓés\~ëjp}v¥?ëp÷OîÈ’n~ÎæP ˜ÄDÉ`FÊœh ÿ¿Ðæ*©˜ó…iZ^Ý&ÑÄpÁ Äî§Hû$E,šw%1>Q¬æ×e°å oÂÄ;Âö Ø‹¯V0áaŽëÄç4˜«èb)=ªÙ\Š!ƈ€F¶}¹ÚðvK¬BÎÒ`½ªåæõ·é‘ÖãÌׯ×Rì&Êuf¿œð9˜¤È4ò/1±P²ÊuÀªlጠDZ%Œb¤ÈB„åµ0Ú[Ù2ÃVYghêßèç œ«âGÆTÃdΩ2ä"¾7 ¤²cQ ä%\ÑåÆéYZO)äÒ„³ëÕ`ÙKœš"%€@ ®6ge "JºT6 ûŒð¦ª­~§ÛhþËG”Yr½Ê©ø)Ý{(¯L›»yCW¡<ˆUð¹(zižº2±ÆGb KŠÙ¯Žý)cÇKO´Õsd–¬EÖ{ºõÂ~gë4QÀ°•ÆêC+ åzJ%Ý  ܶ<¯µèÜ0M‡ ™rq?8úe’ÒT$Ä:œDbâ0„àE¤2˜!i@ˆ´æi¹·‰½!+Hªô#ŠLr¡ BC‰ñ&ðNƒÝ §¡f¹éã3–úäX[“ZÞ6ÇJÅUHHY A.³×ÿ&Žù,û¨êJŸ“+1ñbV.‰ííák™…S»"‚b•gãfˆ#[±¾ÌL»sVW {û€Ú­~DVi|2¢ï9¸…4΂¹+D<Ñô±Uk8¤-t¾;aŸÂÌ[ A ÛvéH ü€:¿L†AàÊ»XžK[1èsÇ`]ä¤èªÿU•!Wéá‘gr©¹qK†¯Ð›KxzñµÛÌ<ü£ô2³õ«ónÃ19äÛ‚@€9Ú—^pü£€DŠ!~M[zÿÇåÁ^pIáú©•=ÄÄPªhiüÓ±ÕÙÆ@ã³Ì+Þuý!sŠêcÊ”©ª"Cõ¢b˜Q(º6Ú{ÐÖUœz¤HIHFL "Û,„hŒb ,ÕÁ£7~MÔ—E¨”ÅÈñ¸È¸Ž.µâìK\îÒGòlÌúH¸¢¼vçêÍâ‘‘ßÙ+/i¿š€lƒ-6·g"ǘMÈ#`–ÇÈT0ÊYi%{{òý4Á‹1B›‰0®¾(ÿT­.”&Nª,;¼©‹Ë´à©^íã¦ó_9a׊8ÑúcX|qÕ¦™þÉË1#Q,²¬}Á¹SµéA}ä.ªðAãÌ’yáû);Šr÷’ûè„7v@[¨I,h<=-„èx‚û²:S,GÍ.rÜwOê4×`ŒíÜÃ…\\@Ì»o/´ßÿrRO‘1ôð@‹iä&«üÞÊH«wƒ BÑäÚP ”Õÿ xåTû «•›"{À<Ö‡6?ø~ ÐÃò‡ð84JRM0¿Æ=£ày’Gˆ0b}$¨!% äØj93_}®×e@Àýbzv¾ù"4Ç&~d;æ¼Â>æT]“ç [ŒÐ¹ê9ÎØuÞ—C¹©4 òÒ­úišSÛ 4#ßÙ굎ýüG‡ò)}ÕùE VªÔh‰€'ø€ÂC×àϪ•‡CÏ•ËôÑQR(7šÎ^#ÕG½(ÅGŸgšRU‘A 3Ïöˆ -¶ 2÷6ó/R”)ni³n¿ZÒ?VI~µ‹éw‡¤¾ô ¥ ó³Q‘5ˆŠÍ@f`»6ˆ>™Ñk8GdˆÉ%zÏC‘zö¡­02“E‹Sð€ð„D Wᇠ•ù Bɪ™£&Q1+^rSñU:²¥*%ò_ûO#Α"æ`Ç%êA%0^` i*QÅ«‹m»˜ìOÒ=ù!DÆ”µ?jnÚžhW "&¼õthìû •køø(a®±zcÍÇa  çܾ§©ôÕjS¿ý­¶Þ–)Ë‹Y°þ’@cã±ä•¯Òÿã ¡ AËjÊBlx I hsO‘»þµøÃ‰Ü …Á¤`ÅeÀ@‹Kv¸³4zÂýžô˜cŠ,ºç:OøýzŠ\£áA‹QOìó@ÁY¢½Ž(2@DÿÀ^˜ !4$oŒÝF›Nea¶‚ÈŒN £»¹^ÝX©íæÂû÷”`[ÒÊ©`7vt}Ùª×3`o†•&×Ê¢² ШƒøO:/Eã´­¢fÕolêÚ˜-L3ã9ëçœkÅļT¡Ï±ŽK¤ˆKUªÒs@‘Š ŽÿSOð3®:Y`Ī €•úmùÖ }Äcg6\;"14^)>îÂ@6e $Ëʳ*߇­ThÉ ¤äþÑ®ù¼y2Ö¥/dä˜o&Ö'ÏhreÖj}ž¼(:ç;ïOL×ÐfKkd­{â~ÀüMSüPJ 7$:’¬@(iÔ4‘䌌€~Ò8|F@}.b(›d§|f† *uUœî0ò¹Û-.ˆs‘>cêÔ£ˆÍéx²3õAå§>ry$æ-Ï2ËÚG"þGŠæ(à€¼…úàÂÔýâåÆ8@Q_nñÙ³HUžU#.lîP&ôÃÃvûzeÎ-™ÕÜÅ#SðW¦ú½H À‡b\‚±Ã a3D4û_Ÿg+lœ’ƒþIRÀÉ´ŒÕ–&"Wçºÿ®Fþ΋zgæÏ±@ }ÂEEÏ›Æð=¯M¿ãž¶°urq‡ŽÞ©Ù’¾V¹·ŠsÂ] ÐÉ ·“›ÐÎ1¶Q|ð z`üqQŠ(µýùÉ+]œZüBº)c±Ly 3@bÉÉ-ŒŠhÀMèQ3á0¶P@ïw<ÕhÊÙT†—h^·mHÜ±Ö $Ù ,ÇÇ4¦Ìµ²}•×íÔèVfú—#V]¹€Þs?­àhõeR~ZÇ|ð·Ú×<Û¢•4>ÀA,Éé,TF¹Ø îÉ-OÉCÖÁ6²€~4irš¬ÐšG›„KÖ_ !=Uð«ÝP6é¸ï<îœ%rZCÇÿÒµú:´Ó@ô:mž"¸‰Ý¿v—/õJxþ•;Ø•¡&ÀTÑÜŽKèF#`îTÒü*KÔ— Š¹^¯Š=ƒöÆ{ÿS¨)ÕKÔ¬Ês£je±®Â`Ì„Ë?¬@~-ß{üp1N0Aûð—óû–bà,Ê]·ÕŒOÝ“QU|™•{µ‚ ²76 x¨:ÛËæSIªn´;W@¿rdçc„U¨ÒUrɱþ8ÿcb:—÷YÖ›^NùÜÉKðsTƒtæøá!R†ê$Šˆ‹ãSfPJNLÞyý’ª#¥¡Š×doþI?Hah‚(  þ|¸^¬´ú3eg¹ xÈ—ÐLÅ)Ǹ`}°ºP.ÎFÆ}WîÇ.tšs žlcñ8dÈ冾ܧ›Ú>¥D±¤·®ÝÝ aª"ú&¦¹7@ùŸá"Ö™›´xš¬PºõÀik™æT$ Z„oýq§O+`€A’>”b•<4| eÕ7aÅMª•2ÿ~Î8‹Y}î}5C® þ™!à`ðË=}YZLUe˜N]†ÇýëÚÂG}Æxa}¨;B^š^œ£ú !e7$¡#Xõ;+mÎ$tk›$£ü©µÝFøå5O¿”èɬ œŠÓ)é N“°gO†ö ¾† ‚=†áÚÚ,Ý´Xqg‘ÑKŠÇ½H§âœ:ßþ,•M&*w!4ÇCH­tßÞøb(r_{rô%¿gmÚg»‚™LÓkWm“A#Ý &v†m d{£]¼­«\‚¨<º`JOâwãTf©8âìFÖ«³ÅvýtC ÛÏ0\hï1(‘˜Ø›¢¢™h”._MÍZÈò|LHOYEHŠ˜Ä÷ʸ¤°«ßk¨NWÁt—~]?Çuö ¹¶~&Cu¶ëªéÖ¼NÂ!”ÙQÛ»æ‰0|fnù;¼2ˆýL(qÓ’s ºŠ,`°çî‡^:Í´«Æ%ÍwöÍ…)äõ ÒšÀ>Ö$ Êê£+AÚò«º….¿h,ŽÁ‡U¬¹˜ô¨þ J`eöO5°ÚJ_=ú±w¾ËçvPÄ‚ÍYÿ]j{O­.„0¾mYÛêÈâwŦH›dA»bÁœ*C™ZAÞE¤ˆ®¼5™û‘&@±„CRÅý4¸‡W·ÈþY¸ü KxRÓL*ÁºYqòY$åNÂW ™ ‘MQ½Q®1»´ªÍ5MÌŒÎÞæÙ‡ß7$ŽK›*ª°»nmÓ8GÛ2Gk½pU¿cÉkí{¿`éÊËOº*Ü…X “2CjÎRT4&´CÀ¡•J„ÖõØ~!ͬÚ‰ÀdÂë¦Òbšì°¡CEbdž6NÊ› l9T®“Ðùê¬ËÓ,Çñ=×ÇC7d'ýE1O¿D0[`H°Þìî'ôn y^ê/ ÷šÏ$Bˆ‰¶óOT‹“HK[]•t™mm70PóÀjŽÀYÜLuYu5Á?ƒê >æY (?”HAøDV¨„lE¬œÅE Í~dÌ’…8N7–uä¡uFçÇ x‹š¤¾Cwîæ×;çÕ7ùs(Ùâ×blå¤jÊCÎÛ"€¡bÓíU>5Ïì°‘ÁIÛ‹N¥•GR—†uE©"½½§è]mc~¢Ý_ºq ?;|QV»¤åa¦§)«ýKbë;|fP(¬XîµÌ†öªTµÕ‡rÕGNÂ@Mááà7¿³ö?1Ñ1ÆjžÛC'¬#¬ã- —&Ì:KN*aãt±ã*ì¾Bv»r…ÓüKóK§ÖMÕ¨)ý3)M’ãGò<ÖʰðîùË\¡^±j<ü“gR´<Ó Œ õlœ`Üj`$þ$q¨Ê<Œ%¤%JçŠð‘²Z,M¹?Ïâ ¦À¤¶? ß¡@É¡×GT¨‘šÝ«]˜ùò;û‰‹ tBµNÐø$®nÎ\ì…ëÇÞÑûÅüÔn8úÛ`«5 lC#ö3*m¤®(7©:ìúõ©P$Wß ší0a«œÉ÷;Ú\8Y,Iø†¦›dâ=û`kÌ¡ÄE¼B gÚ´õ_Ûœ$VíÀä¦G;Xˆ kN»øD8”¡Ð ‡Tøs«=šÝž›ÿý¼!ïîuw™Ì›+ˆò¤R—FNá˜_´OԳرäk;Ñ_ºÎøM•ÉÆ!@ æ¡b÷—´É?e/F•³hÙâ+Ê *â~îÏ—?WØbÂ@©õµWÁ²ÞÆ×ô‡Éî7×Ù uP{:™+À§sý”¸;Ÿ™ŽqV»f•¶ÕÑÙåb]x*cæ¦êòîlþ‘r¢Âò@h@š´õZ*,o5°Ú„°†£ %Ø…„Ž3Y” oœ:ÿè(ùð5tNU¹š ¤´ªG€ˆÒ÷õÜŒ1®ï1†îyÕ!§¶ÒÍãžíÚ­IºÒ‘ø>È= q+$]vWŸL³J[¨ò*‹-Ö®?Íz¾!ÕbߺfE,Πsð‹`æ]êRÈ>X-éý¬±üIo`vº°q04ºJÀnŒæ•0;È߉l6ƒ„†öCöÈ6<óv¢N<¬?vò݉µƒ/·µ – ²AèUSd KÍ çàõ:WUISJ«nÖ[GÎCË™nú *B„ÑRq !g<ûšè ü3M‚¶Õa¤ivfl _\Ò½g†æÆÀî+8ÿrò+û@Æ:uHt›^ö€…ìÿè©}úÈ”ÒEÖœt y#öue9»«Õh£àÈ<ÍÆÎBGÌ¥Uqg•¹F…Îav\2ýs€Ê~y¹+Ñh¯ý$ Lï ‘21c’Л~Ãåô„í7çBO–wÀ.ñÉÏpˆ¢Ï˜?¶àÅ´àsª®) Wxõ·‰ºÍÎçw@ !nO$Î¥«ÀsÈlB‚—”0ü6Ip}2ÀkºPQƒ>lõØÙvIö¤<V'Fó°UNlGšÖߺ ¥¡8‰¿QºÂ9¨JCî¨LïÞˆ¬l„íÊlr%ËÿB]ÌûP½Þeãü„+—P}€T}I°êòÒ_šêe4O³²áZ>ƒe‡?¸® ³€-R¤9£ÿgÿ«#ºg`4ƒW£C?qÖ,̽òqLj4EÛº* ãŸàýGÈßW_V-¿Ôf(jCñd¥_ ޼² Ì_µj¦Án ¯Ruº=˜ Ãh!ŸF¥·„ØcªÏ]ãX2i÷Šj5TEþÌ9™ÖJ‘F!:uÅ’#±Ï5ÝZ»ýIÍ]åj[cçEúË"¢s®Ù¡Ž{žý‘vÅ,‚ÑÆ—#èÂAªªz… Ã6 ôÎ9'pÕ3å\²h:™6ÁzŸ‘x!GVå4PO µs?Â"Å«Yx‹ŠW‘6PÄ®°¯'D²HšÏÿ€K,ëtK¾(äñŒ7öe|"/ärŽyÍh:_#)wy§fjÅ:ä?ë€K{Õʔ÷¬˜»ü‹¥¢g¨³MØžC÷¯Ä)IáP¿ºFÑÊà´µ=Úf3h÷8¿õÞWÃ*cÏ\I‚©M8¬8#u1’[6;3¸ÌYc }ù8w×±YŸó%¸²Ìž5‚o˜³ê²u>{Çiž‚gŠº$q8 Dj¾;íþjzì +¤õçä}nÌl´%“幨ÏnŒ!7­þ=UÓG­Ë³äó9`¶æ%QCêyÄêK1Q$—q³a)¶ñü”Ͻž$hãŒ#K±Òñê™ÆµÃäÐ~R-¡ê{ÆvÈAVZ“¥zÍé5cÊÔÝzV°"M4r°â‘qt0jfC©`ºÚ%!=7 ´®dášæ ÇG؎„Ѩ,›"H;”uqí /‘U%{† šoMÅq1!qÊ <<æŠUŽ]ƒ³Æ[¤O Â0Ô—^hnRœÍ­­OÂÎAÍá,Vu´e¸ÔkhÏÈEãmðŸúg×aØêµ{öþDÿÌb!¹:‚í$ÎÓJ¼ʺdCÄ–ü5ÅÆ”©§ÃO68<ùA»‰{¿Âˆ@™qÀi.@fF02 9"èC¸!Òœ3Ilð ç¡ªqŒ:s—q§H wit‡h~°âü)Yì©ÃÂìE¶ÏïPæÕ̯ÖÀ›÷†Þ?7 ½Ç)ã6?ëÑ–U“ÓÈ(ŽVŠ!‚˜ŸÂu9î¹äx„{ëº@C+Ô¨`¬eƒÒ Œ¾T.Ý¸ÑæLßµÌýDe0‘—šS¦â®ùð÷A!©!5W·L1=Z˜\èçŠ2ÜPKÓØ«YÍ ›ºž‚aceŒáÇPäÞ¶F|Ͼ‚¡ 6­àª¥ô¿û™Ø Xå†Éã©1¿Ò*(˜ö%E?΋¹Ï”úCÌOôë ÎňG`$BÃéO²/Ÿ¦iËÛšN†ànîEÉ o=åZjZ»6­çNr{má¨ëÎýCU8Fïó¬øÜîZn׌XWp¸]7 t‘4˜>…›ÊÅzšiâ5†L»ZÔ®a…9Ç8xfЧ—¢:DzIW iwÝg·$æö— Öflÿ¬ÿmô3öa =èé×GÎ"Í Šñ'³tYŽú½E?è–,UQ>'²íÖªs¢kgI}ÏùT_U îÀú)-W͈Äc ¹?§ƒ±±½¡Ë”f¼PÕ‰…öç7s9Xªk±B} ?JåâOˆ'í…Ó³I»b ÑÏõæÿ3g¦Lâ0Û¾qéôðs+®ñd3-v†i×¥©6Õê‹­wž?‡«`ë¿a»Gé4f›|àvøÀlº¿K/è³îp}>†™Ù¸¡u(G a"pU‚-Þu•›HZ‹Å6 …Â9„rY-u%ZÈðŒÎé´`Ö„#Ƕ}?»p¯¢´ñýH¶'Wþe(œÈÜ> ¦B•ÒxÎL̰ÌAä‹ï2Ÿà [=Û-ŦÊçíK'!Ð) —øŽ²íÈ·Æû§ÐCŸ¸áiÐ8i7A?ùÿOÜ»m9®ì:¢„Gþÿ±,E$(É5WŸ®5wí¬LçÍ–"Ä8£td‚bµ¾fŸ_[MdD~ÎøÄ'â8ðù|Nàõß…¹šbc½¼o¨s—;!A…U$h†‡ã‚o¤‚‹bÖg£Ÿn®õâBDûPµ\ÐÇÁv"Gÿ Ò˜± ::+zô³ñTn¡òAžîüŸ!Vz’y=úñâÉ–zÓÙ¢:³ze˜o~ /êú›-¶Ì¬ÁAÞNUEŒÛ›(>NûÞ5 Kò]D¥p¦¸Œhù ½ËÝH`âËööcàV§DDà¬ÂPôÓcêy ûI1e(xÛ!Ç㹡èjvqöû{‹8„_8p ð‰ã½ãC·è‡Ù“/Ä¡ôŸÌÈO~N |òsE³0 I ªúÔð‹vŒ¯…úãb–Ë×öU¹RkxJ^”žÝà­sº†¥ÐÊ%4Ô ]^< öмa}Xî:C÷`x»s®l²ÚÚmÏ™d]2'[ÛT“‘7CG²åê–£÷ú{†aóŸí¤o. ì1ˆïü×rË$8ôjÿãëå¡‘ñ/ô‰õ÷M|ÖÝõù 8>Ç'>yñAÆ‘ŸÓ‡q¦víDºä…}*ö Ö¥³@1Ïy‘¾uÐ>¹Ï:@ü@ÂJ‡Ržþ¹Á?bú±gq7k£ PÔ¸yË0?··çÄ@ûT“ïÔ®éü†;ÇÞ}a4múvP,}É^Š©Kl÷e\†hÂÜì’ጢz±gMHä¹ ZÌòà ªR«ä¡g›Áo ‚]F}-zEˆ~@I³"EøÎàèí§òcÚµ8³ÂYºØ Ùš¼¹™ï7»<·ãwN¬Ž ä ${•2óâxR#FòC÷Ï)„ ”(^8Ïm³2‹²>¬ÑÛÓ”Ì6#è|¡ÑÀ¬ÁiK-MçðaÿˆÇ‡_d=jËa©^Œþì%‚WÜ@Ÿ9²ž®€(óØÁ¿¤ÏDÔ†…k`ů|’”zÖ³A?ÞÇ[F{än–0L’ªb^ûì6ôK¥Õxu`ÛÅ79tŠaÉgÆZòyªÄPÍk½ç„KÇñù|ò8Žˆ>ßœŽSþÿvŠöy\I칸¼í—rÈ 8)0¨ZoæÛñúÀèçP ³Ù ‹~*ñSß+ò×Ñ[ Â5nÌ=ø§•ÚG\þ³Âu™‹ÖÓ’Oè¦!™7ÃkCѤ‚ § ÉG¬Y×>‹ å`s\&GHdš­ Ú'ÉÆ5ïlÙÈÂõÌçP=T„¸°M©®k`7¸¡/ ¤?¢5zÒ^Цj†Û²«›1¸îByÃcoÄÇ·G›ü³×Oÿù’?*š8Ÿë%¼þñÉÌÄ™Ÿ»ç€€6¸yèGJc9í¾ŠæUxÊ0‰Aæ5¯Màò ¯,T·¬dhÉ]Ô­.+ñÍWWFJ»G?ô¬E"GÍÙãðPMy¨Óé4bƒÃ½·BÑú!‹±ýÑEæ+2Ö7ù$WMØÇ÷_@ŸÀñ•PÏÕ—!hÁ׬ZŸÌò“ŸÏçf›GžƒðÀ*.×§½ž@;ÓãØ&F’ë£& µ“C÷HŒ#Ë9øʉ6¤ ¾órõnú!Ì™ÚBƒxî0ÐÕ,¡‚Š»~/j€2 ŒpXU@óÌe”Aßœ„’¹A¡:Ä¢Àe!†¢¯ŠàŸ-µ=YÔ¯¨‡óHf5 ћD}³¡£`qÇ®•ø:~$2ËõŒ8>Ÿ8òs¥Ïçóͽ¸R¯?ZËä6¡{ØòæeÍé­î±¡9êÿªhŸšô׊1h^èçNÛ’= ‚x~¨Içú ÷Ü6B*Ú' …Ìô¾8†7ºIL)óƒÿùrä•Sz¸_sDŸ¤½µþ„Uµ GþŸ™ú¼ƒA×% ÖP(hÎ&CK¸ù½ÙŽlÙO‰âz\‹”Ž„äý%Ò„Tôs¾ëï8l¦sÖ:´à°ÏÎéŠQ,þ§Y= 'àöè>±ãI œýb- b•gÇò9#üÄç¸~žÏ'XË=ðÅ+ói¸D~¾äôåéhÀGÅra RhØ"`£š¢™`³Ïš¢x‡…n½??¹‹ÃUŸ’Î(-%«wÙ…ÓÉ(/˜Œ&—_‚£)ޜᅚ!¥‹^¡ ìCÔd:JIݤ]€Gþöç,­…⬛X¿g@'Ú¬6ý#ÏSêZ~1@ ´.ÛKöÂwìë;Ãu’@y2@Ç÷u<â“‘Ÿ8¾&Á«¬Ÿ‹üÉ󆿎'±ÞÐUE Á-šn0°6âÌí+‹ë¹Ñ: £cTC?Ê4?°?5ò¶Ÿx³[C:ÙãÍ›ÿdjîÑŸ™E¡v]’H–Ï5Tƒš V•ò>âúÖçs‚>#曆5Ûìþð°gð8Fà ǡb—ÞZÄÂ>¥÷®¤†ñ5†ò¨U »ûe86Æ0Ú£œ&è–ìü„‡¢6OE'JÐÅì…æ®ìÊÒVèm9-­÷7Ö±ÆÁ–3:â ƒòÀ…o>ç\Ù~¾ºØ¹^–軸æviC¹0‡Ñ2ìÅàhÌ@dxn2æZ˜ZÒj·Ç¨jüƒÿ€Xú\þÍúFÊçNÝQ…òK`ºó/A’×±ÿbø[ŒmŠ ¦<ÐúœÃ_G™Çq8ŽDäã;ðÇ9þþù~£ŒÏ‘‘Ÿïy¶õ}œ²¤~íJ]A?xt ¦›ê¾E?®¹ôH‘ÀÛ´i´P3ôO»ˆê%mÂÙºšƒlFêûÌøïèÇïq×»Òa ˜øÝdls%ëf α·’OEÂFt’mü]{è_²ð¿© ‘«¼‘ì¥.ŒfÉHYæ3»^ˆÅSr#{5BO;µƒË´ñ BüVêE 1„0Âײ*³']ª%$ ºÙP—€MM¡ùZ°´¶ŽÏš_?Ôqì´½OÆñ¹öº¯õç³=@k,§öÁ'Ïsfn’=* Tsk ÄCaGÌG3Éб9Ðí³â‡Ãþo¦ËwÏ`û»Ø¢1è_áHÁÂÆxú'»¨®sGÕƒƒò°Íkgåè ¿V ”±†O%سY [~— 3'ui>Žt{_$Q²Ä˜ Ý”8fÌ3ž¯Áì.޳›u¿Í„îB?G^„Ð €mÂqdà@FŸ“úaý ñùÆ?¾ÿ€OÒ]yÒ¾ú ¼ŠX¨“Ý#eÒóüS‡¯j|óB:‡":ŽG>0*_ÍpíèºÕL^E¯QnoˆŸüUö2 @Ò-2à íyO. ¾Ù€5)¢V/C§Ü«FITë$¦¼â~öŽÝ:1ÄúsÇ1½ù“Ã:V“7'o=­ï8Ä>â±ß`Ãb„ZžË…ôcÌ HÁº×«øw‡&Âè%¤ˆŸê&B;m)CjöÚÉ+œ E˜?äðw;ëÉü>yÆã¯ªÔ2?ù9r¹‚NOôÉ@Ÿ«sñ’À¾m`Äqgg]'‡ƒ[|* Úã1gj5Qü?ú3…Míå®uò½ßt‚«×ëÑÙ6Ïù¿\žX! Iå컘äOÂ#Ó­¤N0‘¡c³IJÔƒýN»û ¨ÅD™.†¸ÇüFDALÝ)–[Ö^ì[æÿF¹yí¹~ør‰ÈÈãœî=«Úôˆ q|®›#âÛkó9I ¯ ‰Ï'—áyéÒäΓΚ@áÆú_Ò†Án%0¸2«.gŸô}޼Ëÿñfî¸Á@åTž.Uu¨$øÙ+¹æ`Cˆ$(þS]q¯žYCÑ8ìjsF¥Pd/¼_ôVß)nå-üçÕüÍ«d"t›*)cÉ4k>.í'Ú–÷„~ø¹ík%_l L#{løàŸ¨Ã²a®=Á7 Õ¤¯ç­ / (s^t4uã<ß_[ÜçƒÕö‰+9ñ[ ûi‡Ffæñõ@gJЃjÔŸ˜Üòw¢6•5+d`p0£Ý>6ÂלNéY_Ç@"wë•^ü¢#U9²tË^±“/܉`ZjÁb’JR¼;\¢‚=FÎ#èºh:õ'ß¹”íôŽY»Ié "®%R;TŠË ZÛ÷Îyç®'^Œ\;âÓÕVŽ®ë¾Æõê@/L¬#ϖöú }"<ß¾Óäs½¾è;èþ•½¾$Pž/ÊW žÎT‹Ÿàå˜ø¸‰Ⱦ ¶UŠqª‡‹AϋٌÌ[è#ó£„ÚÐq;ëÞ܆nì÷áøñç«Ý*°k÷rºë*3vóaà(Ó¤À véÃx€¦ºf!¹'uh²¹:˜ô*HæÝŸ|‚¤ …™oøê6 PH3”›—>ïæ1ââ„bÞ Ïÿþ¾|¬Ð›ä/Ðæ,í Cýû~@‰ã p ³X1êɾGß¾þè“0öiåÉÙÄwÐäÊHüÎÆ#2‘Ÿ+)q_|Ä'V tgÆ>k~bwb¬— ^vVz"¶«^âÿÙ*{¿B?¾ÎUÖV ‹Û7ï ÇÛÓµ“®* wâßx·lÍ_0„«Dåj<ýâÛŒËlP Ðõ åð¸S6eªà¸Á@†h9â-õEAtˆ‘Œ·Œ0Vc@Ú–‘Äe„›{­ Š¥8•¯}=ƒN§"v"#œ¶è3úœöúŠÕÀ‚A ú$ðM'ýŸ?—ê¥ ¥iѧýÕŒw¸é//‡}_èÃÅ!æe*úi7ƒd}ÜÞD«vô{ TbŸ£—[éoç²Åž–)Î] 6û\˜ò#*ú1´`[Q–8g„C÷G·yO<®ÇH3I P÷­ï_õ7ÜO¾ÂHÙ#Ç6I5J·^‹ÂogÊGäç¿`/Ð÷¿¯¨”"°@gë/n°YGûöŽzwk”C¤¼òëÜ-t×n]ºâWûÅçRy`¥‚ ±9uA?ç›8Á>8×[b‚öA£žu=”=9<ŽXX­ñê;QÖ)m£ÀÜ€Y‡â"†w¸ö3>.V 7°iô}ñ4ÇñÙ*PT?IxžæŸÜÁáû•UÍ+®Drh{æÅ¶UAfËÍÖœëÐíƒK1˧ƣ‰šVžlÚè6BU¾LÝÉ&„ÿº m§ð¼CC¾OŽŒÏú×! ñ9 øÂ ï¸{~®W,÷üW®0 ódô”kÓ¼Œ¥Z¦¾¢Ý#©ñ!Ïã|Ã+}ÔÆTº‡Ç<¾ëÔ¹äG4a ƒÿd+}ü3ßïí±.|!"Ï\‹M˜ð×òKLp꘻“D-Fn.ÆÂßT:gM¿ã¦ÃÇ6ãÂMIblÛð§fz¢ó m–¼§z€ìÛÙ¼‘Qr;"~ËO€›ù !~”ÚUÍ¥`®zø¡>Â0¢íæù•Çí¹á»7Éóš L«¤~1÷qõ­4ÄóÿŸoJPÆyz̸˜õÏÆCÇ7  Tþ‹œ¨`çÿ·gv9îè(á|òÎ ÖX`²˜ PóùC ó¹¡Â.ŸÝÚ6÷W\™S}‹A—Õl¿|«š4«\Ö4ŠƒXl3@çø’ì%/†©à¹8ZŠÝé.¿åë"ƒ•ǥˌÐ.Æì©â‡§•¤F%å8“=¨%Çb°Zîs×¢R,ë=‘[mÄŽžÈ8°s/ÛÏwB!ÇVñe€ßALà{”Y‡‘\ÆgÎþÙT¸' Jw`­Çûl˜¬Ÿó›xÕ®6T"ÂÈ ý*1!ÒίÙásûРÏ;Úág&“:ˆs %ïÑÎÆÀfÝ^ÏÃ'Ù{ˆ2ÇZp MC®1œRÁ@O>4®ÅÛùŸ|4D¿WäØ9ä©Èu!áÏÒÔãKKžËðuNF^zaýÑWh7J^ûÒÊ-¾<@µW#ÝÐcVß[Ô¤tv³fç1JDÜê˜OaÃrØ÷wëëâzQ±ÐO|"ŽŒÄñâßl|¾TÐ 9'mcy€Î%÷ÃÓ&R÷¹Å»e ±˜jŸÌ?hïˆMÞ‹ë¬ÄŽÊU v‰\§ï9¹ß )h˜ä˜võ–ÐZ„Q0ÐÚà¦ì|+PÁ8Ef!D²ée)z~ZFÊÕ.ZÓ-Ác[Ë…‡Ëtd|®ŸâÈÜîŒ#c[ôÎ}ðó9Îv/Äv'Z'@(rïjl÷¼uÁDy•ëÁ¼½AƾsØ=»››Ó¹åײ¯ŽêÑÂ?Þïü¸SÝn·Ó!¢Ü×¢XÑÚ¾ãM#&ÚNmÈK“f»tÖ•¡tŠ9»÷|1¹ÇÍ üXôŠ;ÓçîÉJψJÔé-èæKVIé­#Ðì IDATl°w@?D m+ôÚ¯T,·iøžfúiS: ‰l`9×X>´}©Ùg“>…¶[IYZÙíŸ-y†G.f=Îa÷Ï'qÆ­å2„p b¬ÀYí"ª×¥ó\jבr˜êkƒ˜‹ÕY/y–Ð5µôUÏ/Û‹”G¤Æ} r_I‹ë²Tä…&…6è]±.Fjžxä’^z¥ÅsÛÊò¤Ày<1·%åï:÷Ì$س’½§ñè¬CÆÕ3Û+.šˆUbʵ¸ÉŽ£Œý$µÞí.Òwèǽ­HGþ–muŸ¯Wç1K;IŸ8Ξ¾8¸H ÄgÓvçaEØ| ¬BWôÑçÙ´YëMêIÐc öO³ñ]°<ª<C­ê”þ€{š³³¢šRç|¾á??`òw¨)W‡ÎèVÙJ;d¡ú¹¡aì%Qµú,ئ郤±éÈç®Å66ô¢íñ+¤ÀÔ#}©-/#ù#ÒxJÝÔ¶§QÛV—l™§lá bâÙ˜ÈÊþ—gXhÀO“½ŒÎ$¢Þe‹ ½¨·ÒdÑŠ%uØ 90+“çí¿„Ð'®Ö°o&bñ…5GŸïüØç¿ø翃Ö`=tvf˜9žkE:ŠHß*GJç¥ÐäNC• ŒÌšè¾ÇÆW”àÙOR S;‚§ÁÆþ¡U`oHÑ>w”ÿw!nrT¢59PF~‚0M]ìÞŒØÁ…ÛG ú×Y׃¬T—lùÿªÅP¸ô¤ g¼ªú0ñ/Aÿк r×5èý( º"lkêX^gÞµð¯«ã›t|dø9çÝñ=˜|ây’@gL7¾o'Q×äâ*7«I°MÌx B ¹a€ê?#ND.÷â8¤wèGzå(Ó·¼OÖæ2Fœ“ù¿t¼åªFdÙ1Ka¶Kfc]CX«’jéáe ~̃V ³+Q¥ ã>í÷_ê¨L@"†ù"S›\6þ2!™‘Ž¢@Tƒvšùò·‚nUå 2AÇr®þ]Í‚’×f N¡zûÝõùP9P"eb‘ýæC|Å5Œ|ÖWÂz=ÌÁ vH繂ŸgÞý\xßÙ°¯†Ót®ºÛyù•ÉöÉ“\ ½ JUö[ȪZê…G¼´Óî.Xq|Ëç`É*g¯ˆc­PÜy%´G%è:¢ ½»m<(>Aè‘=Z^AÛ±ãLþÌŠgÒW/Ýf’Yÿ"Ë®í¹ ý+ë—áêÀ"ê$Ø0¬<ŠE+£C'£Xy Ð¯Ï#WLq£É–‰§¼’BÓ¿šQŒ†Â¶=(Ïøí¸ z×my|i¹ŒëýaèdÆWè³w.4IÂå1t†à!H.ì³6fTy,î‹rÃI]éO‡>u¤k–¤~ ~OÈÍÉÇ~¸ôÌäãN‰ƒ’IÎír2á 3?7„:OŸ’œ^ª0n1ù/È“ÔîI*Kr€,W ‹Äˆ-¿FJ*4—ÃSPæ„o ½„Ö|‹—{¾e8-‹øËãHkgºå{L}zÍϹf)T–8ùÓ/óKîn¡ØlÆ¥ë\ÿ¸’3Ñw»…¡j*×¦Æ ¯°ÛŸÓUpzƒ°ª¦³£@zÀ$-§El³ó¹]{;ý¢9®pb\.R5íe}¡+båȉ«¨Ùrè)"ùé‹hëAÆŒ}F7Ç6ÙTK-i$)WÛì$ˆëz*m«ie?‰rëc9±Aõâ-Ò gîGo©ÍBØJ¿I[ñ <Ї^LB¹µUÙ<›øUª–Vô’AÜ2ŒòG÷H²sœoŸ4läõv^Ú×bñuO.ûÖ>ßQàýˆ0R¬ÝƒŸT0—˜Ë$A;jùŠÂêÄÌðø‘² úÄ»ºÓú¼êðÊv'ËúÿDaP^qxw0Ëm¾h®÷i0‹›¡º0òK²¤Ÿ¼°Iãw5lj-IgLNfjÉ{Þ³ª/°N> Ÿ¨Á‡rêÙ›dôáÑïí¦{×ì‹fm‰—Ò×0‰Rô\ï\ÉZ| ¾ÅŸqš¹\­ò!K=噽\ÒÀ=Á#·tE@%o¶ÖºwÍîlIK nh{Ú~NÆ+8pòy†“S1ߦL*lVÉ»ò;ðyÐ×ÃHcOšÙ‡ê”:ÿØö\¨çû×µ dŽ&³í:˜Øºß%x-m[ž ö‚M®º¸ô‚µ^%O¼‘Á®Fõ\¨(ŽhÐ'ià‹Zœ¥â=ø­²–R…õ1ß…@Šþ¡àï˜{Dó„A¹æ<¡ÏU\ùžíÍ7UÜpðî­p4PN6 m³À§yê ï%Qç&š>½Ê1ŒåÙ¬ýƒXñ爵ˆŸ_Ày ž)Ø÷;¿ 4à¥o£%)¼_)5aR æ1мbûA÷—£b¿¡Ï®%wX´7Âô &ÿ'ý_æ"|C&4]¥ì¿¨LòìÝçܤÿS4Ÿa©^Ç—ºÚh…äÛq‘2!ªóÂCÐ`ß«kiåðnéâ ÖÔÙAèñ¸ýë!ËJ¬N“umà“pdMŠÚ¼fFÁîÝhM:©MBÛ.ö͇£COnPœöÑ2² { ™˜í ÙçŒlÑÍ%‡6žÿ'^hSAûí wjÐv5¬CE£ ­ƒz9cÍÄéQò¼*±„p#=Þa¤Ö£9iæžíæ ±É-Ž8S3OüÌò‰!³…)ýÞ)kÙ±ÝÞ½ëˆ5¬ñÙáUÜï LÕ“ä×ïôAPRÅr~¿åúçuwÖŒe:Eoõv ‘Y\©¶aÆ´ò¿èâ“fÔýÑ Žéž&Ãîñf1ÀþÁñó¸ëZÓóäÌÙÌGü7ÞeÓäFšˆ×j‘ï£^–Üìóð“ôDn¡ž ýBízˆÿù ô»—n빎ߟ4ô.bYé˜ir€:î©@°Æù UãÓv³dá/¯ Y·³ºvïô¯6l¨áž{›Ñ2<…rrØööœµ^¬t1Š+pñ\ÖqõY²‡fSA©wIëfaƒÚ·N>uòÃ×RI¡=àvÖ¹§é ­{y€ßOü+™xä>­£çýI²+Æ“etãPÀжnï5ˆG4A6¡[;­ñ_n‹Ú(Íråt óËî8p€À&0Rõª—±\>áÈRÚn¤ôXYŒa|Y÷È6Ü®^Aò~Ž ¤2=Š¥êú‘;z6UØÊ’mp¡œ\ô2 šÎ±(UI óì!qàÌk_ÓØiºyÚ /ƒ<ÜnôýÚvävw‡1Ù©`éÈqe€vœRÇ;16‘ÎkÐ3MyÙlÃ}Ì|å? Ÿw9ïþ°> rõâ ÓW&¾EóÉhM©•bì )L—Y‰ï¬á’Ý„šRª1>÷xtÝ ¨kû@aw2‹ô«ã`ƒèŠ2*ô¹ñrÝ\C¨Mnͽ^]šÞñ—™ú P”î>HÒ'ë/ìU•šÎs6d€jQs5ÞIx±ÈaÍíC<ÏÙs"¯ ÅJz9G@œJ6¯ÑN޾–ßÕ°ø)1B‘+x¹KF/ž‚HÙ. ÁѪk3Ûúžcœé¢}ñ‘­KˆØÝBÿš¡OÜû§Ê›è¯šD‹¾·T—Abç`HºM°—Ù>TiÌF)Ï' Lx ïfD:¬r¶ì½(_¡ ²~1wMÖÅ‹†Aˆø•-ÒŸ‹­ëßL DQÑe°§]G®¯˜+Èr{¢|˜ûñ:ËOßd™o] ôB Ñß•'l¥œI@’"ݵÑ{îàÎÐç 4Q-¿ ¼à(pëUé;\*{9 ¾'@ð„ÎJvžÐáb°N ”$צ¯ÄX’?œcá)ô9î˜&w Ì“2ȽéHn^ŠÑGÖ™cgNhˆ„J½ýƒÛ¢ÛwÈ’A·lüMþ2Ó©À‘†ãÖ ß£sXWæJŠ £rÕ:`_óM—ÓcÓ?­’pi[•kGÅCk¡¶Ã:ütÚ™}¶© T0ÐvEïÚr\FØ“hIàXÖ·À¬÷Šv’@æ&.íŠRÌKâ1»Q/JâÒ{ž›â÷…„ …5_ÉÛ›[¼Ú—ÐŽkOgµ¼ÚÉC‚šš¶‰FÂV§q0ª¤öâWF#—aIÙÒ!åž~8(îàÑÙ¨AÐgìhýïû”œ Û]âªÛÄÔ÷#ÿü=ò•™Ù ÑëÂÆ. î¯} Z?±˜ÆEÚ$ÿ-RÄÃÓcœ_ËsêLPDdV3Piºuíìñ@õV¿@?o¡ÏKýë4|ÁñØŠ5Àp/w‘”“#Ò‘nŠP…嫯£iä`~ÝyùLœkÁ²WýÐÃßb Û4–TPÉù÷?侞;$ÅLúM 4ÑI-oÌ^ïú»éÇÒ~ƒövô§Í?}ûˆ2ooŒiMÙSè_VgYyÖÈz¨Û°¼æ‘so@¸†¶i‚(YBœú’Ë%s!««Œ0Ð¥f ïS¨BR¤‰¢$¡ÒúR 8,Á¡Çq…<6· †e.³»—¯åƒ8è GD|>UŸÑP€Ó •=pÞ Éð‰ÇÉ`¡ÆŸÚ¦“°ë¼ò^… °)þ5™Xš.x¥¯+î¦#sçóej¸‚žõšSRÊ W¬»‘H#vÓë°'Ä ôˆCèûåBüìîww¿ ýÉ*°g‘¨ÎŽ èÕ¸~V!UΡ¢N«j7æ…sqÎunTD’H6$ïtXúÍ~Ð{L;zŸ­Bç 2šM­'–Ès<÷„K¬õ¯Ð÷¿E?˜Œ6³V„Ñw÷sj>áˆö0a]W%Š&»X]ú^Á—eäˆËÞzÿ‹.IeðMåÈynŸÍ¢¾'ãݤFŸ’¦m”Ý’éî¦D“¹z{Í9ÃøROê%]–ˆ¸$0kúïîæ‡SQ4D,ÎÞù7Ñ]¥Š=²©l&˜"×GP¹žª—®™ ó{lžqÐË.'Rž-ÖÏP»ôl”ç©q>ÖÄGvñ“Kö7#ÒM-|bc Ïu©ÃÍÖ=õ[¬lˆéÄn„&L’&J¨š¬LW©üÊë•Ì yÚõõ¦S®Ýžº¢Ž—ão–9˲‘)ºñ‡Ö€ij±ý„‹ }XL5ß<âNæ’ÚXljkžŽ†°üÄÝ^Wòg ð‰ †D+åzTæ~@A½ºîbäyÚôÈëA Ù¬f8h-b˜dý;TwlŠÈ`ݤèdjÏͽ¶õXæ5CŸ˜ê½þíÏ;è÷‰4}«ÂËñ-?Ä—e7zÅ67cðúð{t";%‡¢¸é÷ñW««=-ˆÜ(uÓ(>¡†Ü DéŸ ãqn£©†!EE=ZYG¯Å)µ±ÃóU‚ÙƒQ1 ?~Ê2X\ÃÚ4¾´ê¿NÍiï¾ËÀšÚ"ºr Dt*²(q3äÝJ8ml µFkq…‹þQß!Ê˜ÖÆ»ÝíÙÈ–’Éy!:Ù¶¿-ößÐo¦èØH‘y x¹BN’sצ.pÖãO‘¾Ñ© òv‡:ÁùS•"˜˜Ú Äî"˜²U ×½IÓ¢týEOgÈ¢@#TöŒ-Ì`™Ô,²U å Nà#¥ƒÇ‚dö«wVhÈïö ѧ‰“·¾Uœ"ÛÙ9•ŒudÍJÐåÅ]¯gG?… ÕrXƒ’ýC®Éò ­JÛ½¤²IÂ:Œ~ò:80Jåëâ~¿^/i±E]'M4å,Å-î‰Ò4À‰æégÒÛÞ†´à…‡Fpƒ'7ð>©»R98ˆn£¢ÄÖŸ FØ*ØuþZïçéwGÎðúFÚm&\r‡ñ†CÅãÈ’Æ¢ÒŽ¸•k /¹e–"Ф^Êß7î¡*±¼¡þ ‡÷ˆzûªZ™á/ëŽi`Ìý{V8‘2™Û–Áxörçð8ûÅÐ}K$û ’2¤ÂämD˜"ùaÈ*´=ÚÔ>Á6ž¾é“â«ÉÔäÞÇ]h—œ4ðûˆOÆ¡/ò'ã8¡”Oð¸ÝÎϹ2‘FzGURyªPP: d¬ÄÞv]öø¸4ÎäÆʳŒõ‚P æÆ>é¤Û¬›¤XzaŸ¬žÊöã²¢zŸ9÷9Äîºs´›¢Ê_µ4Μƒ<ëÞWœÌ.ç1ôFå ©?býiÞ =†i¾Äs¶ "zy;ŸŸ)^Ÿµº/|ÕD¬|˹¾çe—¸rFQdÛ`çŠz—¯ËëÜãžWÐÇ2bø— éÁ`ð;—w?Œ=`´Á„*_ßyŠ`°š­snº ìèâ<ë|Puþ°¨/HG槯!32Œ¢¨©ÄÒ›ûˆÖ†A-õ§CY'Li¬ƒ 8ú™þ¹EñŠ6,—â_èäÑ[|m†#ï/Æ08¤E ‹ûB„„úàípwÎ0¢áÙ.Ýh¡5Ê–å%0—/¶§"·ÙûŽBÎïH¢aK€.Ëó:ùùl ôý)7]DÄÒúiúÐD:ßFŒ‹èÆÄy‰Bù F°V‚®XØ×y(öS";Šê]/„/a1E™ž Çúô£ÝòXSß—.~…Ò;‘) sfÆ€¢Hø+ ’1®Äà„Y4I&ï7úTèÓ„0 "´Óv ‰§X¤©¼¹_§MÄî…š¡ÅêØU‡“d1bgºó#ý£jǨ厴™m=ù“UáÛ'ãŸSôîS]#2nÕ4ÌH¨R‡7U†šu•h’ÔF3;W¢sž=¤NF§q]à…vè8ˆ.ü“º¼…†tqûÕ¼|n3™ƒ…YE®³±¸ö`ì °4ˆäžNSv‘Ń–žþz­a„ãk ûË~.ÇÞ²‰LÙõÿw ÿmšG§²Åñã=è¿s“c6Úsc&ÄH¦² íÈÁ¢_È>.çŒu7[1[%p Îe‹ødÚc÷Å@%Eûóµ¸Õù¶ ØUþØôÌ!$Zz1vAF´HìP4`5YHôÕaÁn¨³¤ÙÕ¡´ŽÏTíyšöbsè;g,7ÇxîOåTüj‘wÑ,´Cô´Ú¢«]ª»m ^OZòÛƒMq´†PæáB?úDºŠ:Ýr[\抅”ÙI¡©Á¡ë=yŸ?$^Ìô~„¬‹±ˆM>7ìaÒÒòqÎ<ÛX†Ü'²ç'ð“ù%¯QtxøÊÙï =d‰D+À,4'ž{J¡",cj´f‹ÛðÅyÏb¡ôÚoâ ÑØ*³¨ (×z%yêãÙó{ jÈæZžêå®Ê®ð¡9½ü4ä¹XqðëpG ý=>Ò ˆ›Ö‚ü·½®/Ó¾ó6kÓ'jµ‹ùìm×!÷tTª~ÑŒYAönCêýÕyeY)±qÛ£Ægà³-Ï­1©ƒ,]K¢#¾—ÓKÿ ‡mv;¸‚¶*¥ÕWÁC9^m|M•úE0v¹Uu ÞCŸ,‡‚ºûiÝé^M.Ó@Qîª 2~¬]çÈ®£X@û‡¬3_4íU†®ð‚oÓÝ~4û' ý4iƨkþ mƒ’i!GPNäш~ŠvìLìúl»B-{×E¬˜£ñž Øì§Én‘½PÙæŠhp8Jéʱ-:sážtÖ5E„Ѽ ÷“ES»ÀV–*({çä/<±øDõ—Ê…¿1›á•"÷O,ÌÿâÏÝwGI;†½¬]ºzmï“w¢ >:Àó¨VÀ¢ýIà!âÈd[燮¿eyÎÍýœ*YÅ@Á•[½¾¢C3‚µ1p gGÈBÏìÝ%;Jضù€W;êš Ï}VùrèSvÄù`ŒHŠégÍgIò]4#s•‚“b°û¤ûG•—I!c9zÌ\tÔéFÌQ`På~²drgé2‘ BB–ên6$tÈ ÷ü§£eÍZæè¬Õ@9ƒh7Òò‚ªy@¿ìêÿˆ{^þÕF3ÐOÿ6I|×؃»·ÇäãN“zŽu¯†”€‘»]A¬ñµã®ßC.–v9~ TGœ÷8˜[#õþÊ®é³E’rÂt¸:ÿ;nx ’ Juuû³/ÿÛÖ›Ì0@¼yƒ`.ÂFDÞð–Àý-í»1=¼™0{ªÃüs Ãcò^Ñ›‰šÇî}6ús5cüƒa_|ŸæD ™,# DbôøTt°øåþ·E±Ðiù0ÈåÙs2Âéð[C¯Öù~L‡™Ð +/—/|ÉÎ$e™h ÓOé¤tög‰q^fGñ ý^HSFV`ª÷xu¹dP‚7'RaMçB@õ™¿(èç¦@®ArœÂFÈÙ´—ð/ý“_ʧb#‡"¯l©âSîÅn#îIwnÍ_`ÿrLþ÷üÎÅDN®ÜÐÇû:ñso ÂÝm¹2n@â©8Ý=keáŽ%À²>Æšà¶_"!ç:ý>‘@Ê›cå|ôŠNM—h‹_ØKP(ŠYµ«£"=†ÎA*û3Ý;ÿ ¾î¶û+þÕå¯x›4 ;pNïíp®àýMà·"ÁÊ5‡Fü”ž˜{ùhÀ¤ždù—¬Ïzµ~ÉØ@—5íGRaq½õÙdO^cí[ â7ñ ;Ç:eƒB•I“›fGyܳÏ—£F1EˆZVx¤¶¶ŠÙ/®Â§RZÂ×X¾Úlz EÏú쓲=±Ô‘@’yMSªFMù ³÷½ÿ•þݵÞ}áJoëñ¯.·P-©5˜Õ³È1²¼Q-­˜Ÿ˜‚Mk¤á±¤÷ò¨u÷XæU¨´Óõdb™·% ã«ÕÐó=*Ù³¹Ÿûþ–”ENY$eè`(z«= ïÊŸ¬¿—Cãp¼‘¢à8–^7.i ïLD¼ú…b¨‘¦Û%õ³½©) ¬{¹Ã ñˆ–|@ù,A æž^Íf±„ L,ÿëÃv>)y-5«è¥{‰þ5  Š1LK±*·´@Mú’‘-`¢g úéƒÎ͸³½1ŒÞ”/"è§n¨'j³5êS.Òûdñ!Ïà^SöGAÙ†ÕÒ¸(ñ´Uˆ«c;êl’¸èíØ…cW1ÞŸê9¨³vV¦°°5U•âfWu}_OèÁcrq–ÃÝ*´y£Ê/™R¢ôKuŸ Ê'ø¦;h{IA{Îüïž‚ôÜzZÔ… % §ájpÖ.Ú©3*"ÎÛsõüPÓ„Q‰½ÙÇP…Ž–îéŇ_°Ì]ƒ7èõÁo¨õgÇ©7J@‘†"ìPîçÈ*‡9 ,ƒÌT¼SâX‡àõn|F?g Vi]À j¶°>aÚ5[Ð0Â/´‰æ¥DÕ“ *NÙ·ëAĹ‚øÖÕ0ÀevÙÄ­«…×4í ‹p£ÃÔœj$°'œ¼‡é“ô#Ø Ž[úG kyB¡¯„Üj)øSr~Èï¥÷pMl°×prU-+uÚòNGãÅ2Û³]°“Î0q{iÙ>ÖŠ7»p8úg‰7ð«ƒÈ+ÄwÇÚ’õ'wTgqõ\ˆå4ýÉÂè=yXgt\䧪ýY,‰íïÈ'ïÂóö:ú¸=æO_û._O®7iêXuªºŠ,íóšÎškÔT3GAëb×"Öµdùª*õ¬€J±‚{2ªCÜ0%“ͯöäUg__rmÌ%‚èž Ä,vI­/ì³ÝÞ9d>:cUjÀ6_D…ÖF·kÑY‰ßÍâðMA™nÈŠhû!]LgãIÀjHÆàÍÙ{ÉßìþÈyëøû¹êÕ€6NÒï³GÃkØÈмk€ÜQ?ÅzÌãê­Ø,|$@I#‰ãÄ@B Qn¹ IDATtˆ XaW#ó†³Ç„~`3,VÕ.vÆÃ—eHP©ºûÏ)#[ÝzwО»&<ÜùÝ»¡Ò&`hõv‹gëOûSxÆL0ýWôó¨…QÔj (žžýÏT…’‚L¹€¡J`¢L™É¯îø±èçh~ pý7›W+‹@yczbn^ÈdÅy׬fFjç­l¹‹nre/DBaS)Qs†ùÊ_=CFqe[.‚yº»Å)b›Ÿ"à³…ú‹±‚ú²¹04¤D™‘ÎÔB0@e1zQÛ %MÅn¯+},a-€°Ù”þÑwª~[ÊÝ1L dv„š¨«[WfÕ³âfâ] Ôõ‹ˆå¹•bjFÅ@[ÞJS+hHö®)ˆ(<²ð¬ßE5"Îæ;¶”¯¼qI4`$U³¨K8MåªQcõù°˜Ÿ¬Ìk“Jʃ&±áhLàê³Wž—ó-6MyC1k×®y;u´Ç÷¯r‡{¤kÍ/Z5šÎ¶CÚäÃ~CjøžŸüÒK7ú^ßÏ$P-¬¨ˆBqƒ‡î)]§úëÔ,’³Xè„;çZy)_u*­'TΠ©I¢9/|òl•ÖD … 7/·Þ8ÒB[üÚ*Øf€ŽjÒÜ –Fçêê­¸ÊLN›nÌ%y—(«¯x±Šo6ôñ¸)bEÅÿô"fÿ¦å·N‰ †ôƒÑÖó“²—NÀÈñ‘7\î’p }Ê’ÒŽºZ°ã@ÔfQµ°èa™Ù 1ßPјa–æuÄœ TÊ¿8t%+?íI÷FMþ¿üñ±5ë?yÎÚÅ;W`†+Yd†ßËS'‹Š‰‡-8œ¯¥S9~Dw¨”äb¾f9¬z‘tZ pµè!ýŸ¨#1ûg[œ›X%4™Òy‰ŒƒøNí¦ÜöÉí©K³Šf÷T+{{ú’…>wg€f¹ZõptŸ#—³M§³5soW4¢hž{W9-™ÔÓ%*^/A9Q´­–6FH/1>¯•îb‘u <™µYŸql=q«]n”Þ–î0Oy™ÃÒ±v…;­dü[þòÆ ‰Ä½¦âC+ò2;U8\”¨‰½·¦ ýdC°1\qç£y,op?ïû²|I9—¨³01¢1ÑòþWÎY{…´P0Œ‚ñHqý7å«K:U ›Š@o¬D$j:dVŒÇ&(Bk¡Ÿ¯ï' ÞTAOÊt} (Þ¥ûBÇ7Åï`Ðß ^• ñVäjƒKcÖŽºlŠË§š‚ºþ²û€ý'K\2êe””mUqúÍ7Á3ŽBn?ïøÿ¡ú¨=4:ú©ëÈêß(c‘»˜s‚ZÁvR'L¢ú2ÜÁ(Gd’ îž6CüÄ} Y.íªÍppëJ€æùÇ´öÊè§Ž0”±/§v×°æ4±âÈh$µþp‘÷œ]†ƒ.'PàÑ¡t Ñ(ç—‹y“ñ¹©+Æéûóäí¡y”ÅŒÑô?'&IKˆþMÿ5SÔä..e}«ÛI÷Ý=¹U oF_<ʹ9‰Ö¥ÏPˆñ(ч'DM*¯‡8™“AÇÓ6}Þky‡{t6t2¡¢¬Æ‚ q®ƒY éM¹Uëßy’z7ŒŽKA´|À@ÓÎFKåÖ1¼]ÙÙ€£å5Æ•yÅ:Üsl³m  “ˆéçU¼x´{i¼¹'§Ì„­Ç>K’‡o2 …±¶„’¯Þ ‰ûc îì©æÂjùn߉Á$úˆ~`&ÑLðkšçëµè7b£[åëyråÆÎ¤ØË4QÖñ`³Yý½š&bã&þ'3Žcl<-j~Vc¦}†yø&'9ròBßc °&hf9&)¨qBŽ«¸ý,ß;jQE'j6»Â(§xƒÊÐø“ôãêªD®ƒÍ¼ É€ŽÖû©Œ=ΞÒÀ@øôª Œâ¼˜’­!X½¥ékµg©A3¦e£'b£ˆšòÂÙ*·dÜ>NíâÚÐ?ÙB}žìÏcAzšã™E9×vég¦£Œñ¨B¦ûQÜx;³„]â~¹½ÐN7´N#´ñtñ媦nY¬D{jø—ŽPKo¢˜Èã’¿ÜÓ ¡hÝi)Ú$­ÒŒÑWhÑJíœ× ƒ³ÍUhÖ£_aƒ~d€Œ×' «³FK»?&_CŸv:r0nPÞ{€0¢Ÿ›)ø÷3žJ1Æ'oH WèÇqŠ%îIfkbI ±G? †ñ ޏç…ì%Ó^ÙÆ¾Ú ?2ªO‚× {å‹y°Nš {ö3àlpODì‘év鸨˜h£¦cµÊMåÕ´ô‘Õ¤ù˜ ÃWcð˜ï¼êŒµœ³ þÌaÛopw7‚&!U׊Õ´û.ÇåÀü8E¹G³uͶ1›R¾ùœõÀõ=q3ùÕ£«W2ž’ ”ÃGûËøÀí´ÈDà[…g:0JH èJ0“ðAM©iÏrA†ÂªZTªæ×AùY3æK;\Ë6F9å-5®TÅ#Ò¸•±e½“A±†9’¿ãe× žgÆy‹|Ù3¡þÕóœîÑke”¡ÏD Y.ÇÙ2úš‚Ñ2èñöj†›Qß= =nÈõá 'mH$ÜOAÕ˜úz#$‡ò¢˜B3u³Ô·—’¬ ѹtw_zIŽÔÌÃWŽz®÷œÒ˜¨`£ûGøù”rø(!@eX ÔæmÛ–Q ¦€[àóYˆßèªC™ p¯¡O½Ú¦¿&-«m:ÿ3ôÓVƧ¯ñý$nVX[›7ôU~¶w €–‰¾ËPiÅýóÀî£÷9¬÷Ù²™âyÖ0«ê¯çô¡ zŠVß3«®|«O~[CútXé«ÈÊↄnŠî6 õõÌͬF?¦›“KOe4T4Ù€”º®ñEø¶Œ{ÐòEðÙû-ÓûÃ…4ô¡Š7r~…> u4ˆWG Ôøœ1¹žÍ\L·S"ïÎh fòXâá~UT°u-í/HþØùMÂ(€Î2¸2„7/¨k£Ø€|:Sý*IëŸ×>¯ks2§ƒ´åÌg«µØ¸ú(ỄŽ{+tËâF°Hn†·É˜Í™CðÔ梘ÓÛ,­Kn˜Ê7cá8¬úã]öLÿWV9ϤÅ:1±=QR÷uÝŒ*Í>¥Fÿïþܯÿ/ÐOã ³b›\‚·Äºå´ïÆGÃýH£Eî'‡ÜçÐwÊÜBW»êS’ÓO‘,·OìKèS¶‹êLšû^›oÆÁ­ØÛ€JÁEÜ%7þÀσꉈ ýˆš±=øˆm§±Â&@—;¸¦áØ8Ÿ±MkT‘™•ô–%ɺæ]fWºfº¢0Êc.â@Ovùýtq+ÛOÛâ•ÓÓ?3J­R**˜k„EíækKƒ) Ãb ÙqšnE±7:1EëÖé“įës­âý\oëÇÍKKUnÑbŽÖuF (’þ‹•ú¼=@Q|?i^‡G?â+²‡ÔQ¸(O|Æè„Ô¿%²ƒÐNè˜Fˆ´óêS­òíd¸_3²›iÚ¶¬Žä ¯á­øôçz5š¨x<{~â“§wÿÄ1äkºb^SóÕþÒè(³yŸûÞÀ\ÎÈeW¾lÙÅ®4¤‰ƒŠ*!t_Æ#p¥Êà'ú§üë¾õ B4ƒ_Cž²-?@«ÅPæ‚ö™KÒ% No!Œ—5þÔ>êÆéŸ^1—O+kP˜9y•P¥þ'ØšÜgŒÌ†»š’CfšÏ¥›‹ë¢“wê};„Ã)h6Ÿwêy7úŒ%£]ð.ïÂà‹Œ•.ß5;0èo[á"2zǶFgS›#:ë³þ‰âk¿Žƒd…þ"‘ýuM2òM‹ÎqFN£Yqs`„FV’˜r¼"¹ð¢ a}",{î3Cå,Üg6#½ª^rÍ%6F¤§ª>JãŸQ{sÚˆ«Šaý¬‰y$}à†³1@òÎÌçƒyç&LãŒPÓra~rüŽçþB?y§ßä<úžÖ8~;ÜìÚéWm@Üúu½NYCä÷HÊóQ&&oãžÉÝì˜xßßQÌ¿½ô7 ºÃþ5Yªá Ч­¦M/sXWOÜL=(xà‹'ÂZÔ3$ˆ?Út4ýÒD.…›ÈŸÎÿÈJÃj >¶ç§pºp½è²šCSÂÝÍ{›}ßwÛÎl¯Õ*„ô ¯¬ªÉT½5¨`£²ÊóBŽÎâdÿ½2l)º=YßSg1}ËeSXÎe“³¤qsØÙ±¡L’I%í,¬¹©##¥æ‚‰©ìÇÒP›s‡¶=ã1KǬóÍ‚íÈçMéáV€Ö—î'=|ÕàaÛG„q.W­‹³1v‚„¼ŽjPtì3nÉŸn â RþÔ,:÷\WV¯·¢!ŒÍÿ«?ÿ—¸ŸÑÎl·íÑÏÌ…$K%E‰m»;*÷sCüDŸu?ï­chz§Mm¤9¿Pù¸ý  ÅÅÅXä]˜žûÇèc̱èx«=Xƒ–£7btô!­/(Iƒ0ƒ`ýÔ‡FÈýæ¦ëªK¼©®:þíË–÷A¾ÇjIÓ¶°YK>p³‚‘œƒÌ§}À]<>½ãŸ–©:ŸUÑO%£>‘9ûpi„ýÀ=;TÀÀ_Ù%’y —cVðMÊàVv2O¥%¾“ðtóªÁKk§ÉLX‘ß>eÂ>›/"gI M¯H£€BHuZ’C}?gÙű뽺裏Kûœí{ƒH”%ŒƒÆŠ³ÒsSw =—ºg¶Æ”„›Pâ³í¸=69ä“ÓàgH}aÉfÈü.)ãùðxÇċ½ ë}‹~ž´°÷è'oçëa‚ŠòjM .@Ïé¹ÞÈCÚö²ÊaúžíÇ#MÍyŸwãFÅ|6Æo=/‚£ÛÂú‡Òéè :ŸËÝOœÙ6ø 騤ý°U¨d@¯®ø–„Vs÷%aŠqp/ £ÂAmðqå§»âKnJU\5¨“ámA!sâÈX¶x¢*œü#ôéxe08Oè'ó'èótò. pxc :J‚>jëi·*úi²Ûjö§ r’rµ?yà ­÷JSeÓ%°ÎmŒjÆJaˆqãÌ‘ð«ÒW{­Ù¡¼›ß©×â Tt¬˜ÄÈúÑ(ªòƒä?›Ý³Òvî²BÕ7–÷Yü‰ÕÐhÑ3@ÏÙ8¤åµ€¨„ZÞ¯g–1Näiäò’8ë0s3/NO¯ƒ©ž?7<ܧC׉¼Ï|¤Þ,¨“7ö‹ R¦üª>]0(Ÿ¢}r|ËhéFkSïñôƂߤ­øó†ž“ËQþo˜ùòbÖàªBªzèƒ1¨µݹ‚æávÁF<šÕþ¬ ë6rcÊ¢À=Ä‘*»Ôn»´;×ô"ZÛd4=(#Ñ'wƒ ;cþØ(h£¤ Ë ×¨a˜ˆŠFáù–žÏ_ƒ;‹!úýxùšõr“Í>½2„õ{p´ !ÝèŸvlÝ`mtW„2,Vxô³ÓûòÍ>_Ú-µç/'o¦¾±/4ü\#ñqÕš:ô£WJ>nTÊôá˜ߖеßÐðS°Ñ'è\Æ$/Q|ƒçèï{ÐËäŒj’ÖúMñ=@WèÝÕƒj5XUZÛó°ò“ˆþý”÷Ãï×è„£ÿc Ñ}¿ÂäèçÙdŽ29£žDÞ Ÿø'ô3F܈sÚô^H uÿ€¼Ï9~OD)®ÁÂy‘1äü“ŽëÁ#dâD2ùwÏzôÓGƒ86¦4îÃK­§g}õ>vÀKbPzDZðDM—–C\„íx†2¡Þ0Ï|üÜ1vWóòõþ+ùîê1È3æ7ÓBŠ/‘QD½„…ñ ž‰IÒ†“ÁDI×8¶+ãCðmÞŸZ2ë¦ØB}ôxQB½¢îʆìq²×}ðXžS§†®n’»´ŠÚ•1Réù¶k¶Ñ@(«¼|Œ1.w'ëTkVš$Oü(Ó¹ÓFæPĈÍýhÕ—F?‡êüÁÓ¯‰3÷˜Ÿ6‰ò eªÕ¹ükI`‚~Š Ö¦aÃ: ÕôÉLóõw¦c@Ê΋0ÞöIC?+´ô0÷<ßA F9æï$Pý(ÚB=OmG•>ÌÞù“š‡Mª^yÙ³ÿ”L­"OÐ:úB@O„-Ê«0(LÃLMQßç ÿdWñ¿£ÿ~ XvÒs6¯¡Úùe×F³·Ë‡ÇCyÂ÷³º_¨æœœV¬ úì3·È·`Ádš m˜Qw7Ö7¾OP0”1Ëñò±a¨ s’e  =Ø6:—^=%*Å7›âYóÒ(ü[U k™Ð1ô†Ö]¶K5ù}ö߸­T”žo`ˆA=y*ØÓâáÍœXÍ5 Å ÉWk5/l¹y»¼Á;ÿ–Mw†Œæôêo o_ÇŒDf&¨¯ Ã„‰Fh_X¡¢×~E_¬õÂúOÂÖ­xæèŒ¾JìvÛþÍ÷—ah&E¬AŸAÄr×½­ú3ßúø„o7-ÀHЋìáÓ¯_õbÿ†‚þÿY_"Š6 ¡ãDÕÒ°ÝüÜûÈØG¸MÙå«UâE=ˆkþèãÖΩ~ŸtìòØf* ãøÉ'CϤݠ§!!˜ÖÇÁ®rTK5ÎÞ*MÞwÕµ =ж 8ç¤#¢¬X×eùê%•®Ã9q*³YÕi²D‘P›áJ’zÏkùˆ¬ _âY ¾÷ú²êC·³ðéÜæÔïÌ1ÒÁŒðµ½ac±Ú’è³î¤’ÅF¢`Áöž&ÅÂÈA5lwùÍ7´ñ{\¼an<ù’N ¬Âk“±ÚPlã‹ÐøÅîcF8;YÍhB¯ûà>”Ã!­£ ôœoY&Âx ¬*b4s°þ9˜~ÒŸ{âzþÙTõmSÛ‚Ø&t€Ÿ<@m$\»¬+ÚLÃðHÄàÏñ¸§èjhÙŒ%úD²Ÿog0'¡~„>W„\è&HQZTê™=–Yk¡°Ð4c£ò×F0<º¨§âdt-D"CqÝ ±cgòâ§P£hL¨T67oXª¡NleŒ,Ž¿j¾ÛäD)#Ûë)˜FzC5—ó™é^5áaSêƒ]ÔRg·2j’BòØÖé¤Oq-c<šÇN¢Š¢Ip(×ü«}És;Qø  Ä]¥5zEFÄUþÕÑÏ=™/ì¨(ÐuòŠä`ÌûsHq3ÏËk¨Vjn0P y¸sôLªÄ´cMÀk¬?õ0èRÿ‡ºu«±À}Ð^Ò»|Íi°’ˈË7êï,ƒ‚¿lðsª¥ê¸í&’ůý÷ZÿY‹È8¼ ()Û9÷YcI !Å2’ TØ´q½È®›ã_ÁN›ÉÙ a™!*CÕ9+gÚ7t Óa5@íaúTú§?rðÁÓAÑK”Ë'9ò˜6.¼‡>öVÛc3{ª yí+¬w«Nç7½¨ ŒY3`;Q¸ÙF9Ùj[¢]Ī„ŽÖD÷@äòÿ\­qµâšLÑu²‰YŽÎWw³dF”õ´m2×Ó™C1EZjÇD´ÖÏWĪ3 †Â-èá)ºrŒÎl‚BPÇúI°@±^¯,«Â’Î*@+xŒúì#ë™·îÙN€=ª;KØ¡Žz¢¾vXìëW“{Êó6;ßÄðÇ•¬M¿*s‡ÓFQí„’s¨É‡š ´¥±ð1ÐCXu@;fð”µçBuô2ªÝ“OS\¢ó0½ØiÿYÏM^ôþ4·”³¨· ”U­<¥åGœ“A|~žj(^v™×Í¥#éï ãó>ýJN\1UüCSÙË.2ýk”››3ùzÐýökí³zj2H>ÿù‡"f™âÖïÐ;#œI¨ð¶%4¨Ç‡µoïßß}Oðd~u&ÉØ~ûr­áYÄáòþ×,’ UÙPqìbÜ-¿«¬…«,dÐPˆÄIÙ,bw¼,A¬ ºà IDATn¨èeŽ Ê!ÕÜ&ýÖg\ú`M?ÙÞp¦4—O_k¸Ç`²µª_›ïOµi6`—@hfãøE!K/Ùõ”\ÈѵõSpªœ¨tá}¾ŠzÕ³é•Nî,¸ ¬'EÏî”g5™5:ܨ®¿Áû =ç,3ð¬yñ{6¶6QÜãBëØܒª‚Ño˜5Ô9ëqŤÞà ”B{¢Åy¼´Ñ‰ù¨Ý}h·5ï„®ÞY™Á]8ÁRÕH¡©ÈØÐOØ=Ra=­v[;.mêtZl Dú×÷í°ÆçKÿÔ̓ï8ÿDº¾¦Ù´ù¿R¼ò>OÈòbú&A×Y+W†:¤EOó\²1¡ù‘•aŠ’¬…xãÔU,×áNòw¶¿»P‰TcÁ:‰SsèÖ*†R6¼"[íßÜöz=ßS8ÇÊxmÀf‘d?ÒBñD!ÞÍÅä¾µ²íÍÊ ³Ûcû¹Mx—O=ÛBv õ+ |Ê=*ÛìÐÐDAÐW¡éÆCn!YR%S:· @¸geD_ˆ©¡ ú¬Ëââ*ÅBþ*X|¾_V…ÚÑGÝ›G#evLô‰2ŠÂNgž )tt•'W]Çõ¦Ô{•¹÷‚rx¬ÍÎË_[kãï&:7@û~=k“Äiçá;»™ŽTq’n˜ýXv¡m[¬‚ï ƒFÇÛ¼§Å“U“^`3ºVx[tHÍohB C¦{Ò“¾Õ>#àZøq3ö0*Ŧt†ê|—g2·#:üìÃä}žS—^š|Ìûkì5ÏÑ…a¶BÿÝ ¢ûè÷jíÙ½N;‹ÛJy”‚Ñqx¾!4t³Fèñ\Ãzkøé/ÿŒõ§ÛÜ+Õf8ÜBtl8­Îç–…Í­„’["HŽÌîþÉ: Ãï  EfJx\hI`ëäxŠªˆYNÑ:u‡U%‰êS„9¿[~Å[’S‚ªÈ©ã¨f¨Ú‹(<Ü1Iw”õŠxúÖ|-žX%Å$¸±ù¸z¿”¡£Ëf·«ž àé­Ç²>¤$ ùAâ´Ü\1+‹ø¥éFõÕÜo-ëÊ=Y¡ODQÇx]¦f<g>C3ÀÊRשèžûÓÆ½Šá‡'ä¹ L›› ».ËÝ0g *ÞÿÔBþâqw¨ROü¾§½ Ð éôÌ¥|Q»ü¢ö{¤ê—4{3½ÞdÖÀ ÷¥J·P›cè#+lÖÍA·Ü­xà~ÐHŸ¨Õ_;hÍÆßÔ`ôï?ý_ôÒªY*C@ùŒ¢ÞÿyJ5L½}¼A ìêšc?2 ¢‰YÞžH‘`~EÄÙ7Ásm÷Ë@‡ÔØNq1R' {ÆÚâs“@¹L?TÛn“~¢€ˆÿ¹‡2‚ g§•†Æ­ ò/`;%ÀÎ=¶41¸6Î ÿþAö ÿÑpó‡n¦âas¡ŒSóÑjž+½îéXWnM/VdcåkmT'?—)Åà1áLJûI™ 1¤KWb.þ íÏaÆ ßb ¡ü+';ʾº›ÔõÄú8MªêVé Øâƒj{mÖŸb—v³ñÔNî¥3éBÞÁ;}ÌÛœÐ&SVUQ³B’¦T\2Ù"ì“™¸y€«l®8ÚtmiFÑF* luFíâ0Ûõ¤ÇzgéE›wwÁñ–û±Ðaæßƒæ¾ ÖŸhoØ5°+-°ç6´1±>&ê0§]åýs“è3€,’ýÅ{ƒ)a§Ö¥Ü“Œº *’,œ/÷gà%DGG^AÌììõÕø²5Z ìt'LD qîý_Ç~@uWb‡VÚ˜o·zä(ÏóÍÌW¾2½ÀJYƒ?=«S¹Óɵ1ø»Öw˜³Ñ`ðq·ð€~£<~ïññp#=h 5eNþÙX aæÀG97_¡÷ÂÅù ,~Áó}NY'¤ùŠ&(“-OÖĩժЖIðÅÀf,µöŠ?µµꥩ£zâÙÐGÜbÒïíþ‰ÇŸÁïJ»³â2\ð)ø²5_žøÈ¤ÔܵL{®°:úÊbÒìC¦ tPÉ¡a ¬våŠYnÁb5” J¥sZ[jé{QrŸÁ-4^3/ ÿ ~Ñ;¡¸&šæ4/Ö"ZÍiH3cd§Žäî͹èb²­Œ·½YÕÒþ M Ý ‰¹)™”Tá²3EË’uŸ^_mŽè…’&:£ËBæJƒå6åvè‹øµÏë†>ó֋܃ÇàCRS¢j_út—Jå¯ï½"¦îÍUo9ŸÆOf¹–ïÐC{§_œoüµ´Á&Ýxwú‰Ý+!ÓpsœŠfPŽÞµCà%§Ü5ûÜ2ú &Õ¦rÅ8vÀ7‚#K#pkCÝl˜´Œ*„)C¹íÏ1ÿ„$ÀØdc]«fâóÆJ•–Q+ÃFP…ÐR/ÓX{{Ï ý7Xèþ‚þé qE,}:sOàUñ‹uB„ Cô‘TЙ¬¬VÄúd¥rÜn\½1«)ÃøzÒq“‹Ø €˜Š’i”n%uB.ZAG•Ee·™Ê2Ù ED¨×'ŠI(ÂÍuÔz¥Í^Û‰¶ˆÉ3üª}4ßåÑÝhÍoÃpDÖ‡¦A²^#Ù0ëýžª(}2±iÂ@hp4Å{vѬQáéÄ:R1¯oy”•åì™rŸ MïA('Ú˜˜+Ös«ºs¨ñYæ+Oq=æ(u¿AvÅVŒD5é§å ÷y÷qXñ*¸Í`B?\×i—êæ·My§C?*µ‘ LÑõPß¿s´Î¯û‚þi0O ³©rØúTM<„zFȱÞMγ£BzÒ3t¸”…kPŸÖ³áУðÈ´REN7Çfäs A³léYæ´$Á†tÎÆlú¹¡dzYN EVx ßÛÃ7¯¾órG/'[›à ¡UƒÍ™L¡|2¹4ZéŸB5¼¯ÛiXÛdÔéÆFÔò(L7j†!’Ö/:By»6N‡¼É†Ã*•¼_Î<\Wš×G> ÃeG™j5ÕÓØ. }½Bj lOo×yUb™1VMè+ï, Õ›&Lœ|šÍ–Ô>'Vh¾°Ñ\â{›”ó^]ÆwwâžÍ*ˆ£na¦ývª¸Ú!ëÍ$Qøó_6ûó6‰Râž1dÓ骓œ‹ü—‰÷=xl>=›“ñx{×úvà&€o˜ž~ Í Ïê—YÌ®”ôvÔˆ®|a¶‰Õì‰êm|¶„e8ôÀyð¼gA-¦Ï\s€,€GZ67HÝ2â¬Ða>o=L6ªXnÝ}IáælX|e»äj¦°ˆ^ÒÓ(TIp¦iñâ cÜÓ1P¼ÐäQa“>Mì–‡óW[óYø6WÆ™îsUÑ¢lË17 ÷#å…®ÂNØŸl3cb¾wºGV)¹¹†nPCÏñy¾uš[?Y#–‰ûA³è,T¤Õ4ú¾?¿ç%º÷HæX«hÊP¾©˜ æ}àÜoÑtˆ­µ7e‰Æ_'¬ÊV°#0HìºDɧ·­,ìl^½[;x¢WÁï”ù¤þèj7¿ˆA•Pš‚ZÂ[¢DCŠy…ïût yŸ5)W1NÏ%5Q ô”[Ÿ¿ó`¿ûÉè£H9aô,zØ”ÌÒíeÆ„>ïÏÆ7Ç}7ªúðª 8õ”‚«ØâáŒuî[Ã`±î†+·½¸Ñ=+µ–=º±³` NÌù3øê+ÆÊábö‘½‹¬§üÛoˆê¤÷YdYmkÜZv·µŸÜ/­¶¬”_:'~ñ;ÚTtì ðŠX£‚¦}4ËÃȵ‘6©éÚ¡alz!¡Tôcê±ÔM,Å[Ýê¥A ³á£l7Jv§ùÅšV8£ U¸V˜ÜÝëJ,ÞTÀEՕίÊ*4ÏÂKýÁdé%óÆP «Ù‚…èºôpÂìk²å=7\jtüªoA÷,Z„£}pjcé *+Žê¤Í¥‚¸*Ó¤£ê)]^=sÍ¡O†A¿ºIŠ?¤Bg•â‚ö2º(©#; -fÿŸóÕÑ]9K]ù‡ù‚ò)¢¡ø7 $Z-ðI4]þ=Ý8žz$M?:ƒ=Éæ©ÕúçaEL×5œeP¥;Ô™ÒXÊ)-»kCãM;TÌKGzé><†Ô¶9ƒ‰ÚZŽ7ö€):#s,eî¨Nᥛü2¦™KOKók£à¡îðÓEkpG  üDý<ú5ê(¾Â›WÓ®ùö•áµO¯zEÄP6®$0=b%>§k¬O”ªR”Z†WѰ@ƒ–¦*å±CMùªeðëÕÇ"ƸÕÂ2$M¡éˆD  …uÐSý°Ð 0TíëMƒz3•Ãæ0Õù.Ä® ÅÄ(;ù|¬ªƒ ¯³žû¸Ûê᪂“!%Ò¶#¬‚¸Ü0H«3µTŠ$°ï+žKnÙ¾éè¥ÑèŸÿÃA¦ÕA(E+ƒ]gWfä!õÁO“t ‡ÉG­tl*7“ó2”oÑÏÄœ7J‘>®ékC"$Jšš=ÕÍ¿0 è1 `ç 9S´Éeî„®|*úÎeSÂ+ºÃi®x ï8[‰ÅÆà0½²¹:.²ò£B’,nÀ2Õø9´Í%üœ…iâ0æuÜ=Iïx {´;l³œß‹†Ô‡kMøåwY‘?(~0bt*cABBù°Ï#h·«? ô"Z϶Êa g$§£òÅÐæâÏ¢’x¯ü”a¯½qÙ†Y½A›XTÍiòAkL¤Œ—h ÌÿCëç”]KaÚ\¼-%$MV  ßsÈLѪ0b‡Á 6YW†¼ «<1@hkÛ Îèf: eÜÅ€]€L4¯m¸â«Šlµ³ˆ;îÑÄ {tVJ¤J¬uUçe2W=ôÊ=†Êq©õðŽ …êEÀ1Pe/ÚÖpC6ͳnC™¨©?™‡«Ûi*!={ô *_ñ‚칇D¿ !¸ ç<"V7 Í^/ÌeÖŠÕõýwzŒèŽg)–TL›4—'¦| êÅç !yRe¤ jFbY:¢¦"R¬ ¢„§»KÀä¥ÇÓ{›Ê¾j¤"÷k,Šçbocˆ<Æäd1äm†ˆ%n›ò…[VÎýâ']¤Nuÿ ;ð†ò©xH÷Âö„ˆo_b.O·ñux” wx#s3³ØC ̶ÐL†¢Tº¹®IçJ“eM ›Ð+ŽÊ{k[ŸåÑ>Z¤/ôé —‰Ú|ÏÂFPvF{Oùêj"½RP -Yöv}¶¬¾ÎÅ?ZóE;…=äN. ǽ(é/ŽH5™Uê€JÔ}”êÍC+sLJf·ô„è_2@Tì²Êb~â  F?ÒÀ³¿•.†XI™[e ÏzV9ã\è'cÀ@¡û»;Ò3¶þµ,SŽº÷e µÏÅ̵•т2w?X¶d-ïÞ£Æê”pGšòì¥yuK€UvÏo]ÿåæ*¦Ÿ´T½îd¸½"!Š3x:ôÎXgÏ|UŸ‡Û•…$œ¥‡ c[?A>?díÏ}v\ø‘9 &ëçQÐÕª“ä¿5²ÖÈõuëOX´×áö>ÜJ>"sÂ@zÓç.£‚+/¯‹FQ¨£‡xÚIvÿ ¤áqÆó±Ý‘é´ÿ e?¾¿a[ôƒ7÷8=Áªþæµ±cÇZùäC]ÚjÑs@Ec ÄÃaŽ•æ›vmŸ§¹Âülm%BI(×½VŠ~šC•|HcHRõïhC@A?1aKRZ¨Qgˆþ%À¶ß¼x¸mÌX— “BDNñ­§×•H¯à…†þfúç}Dµ¡~™ñ,,êÆóJŠ»GB7nÜ,ä[p¢ÊÈl§«žš›¸ BçuU„]o8ý¨yC-9 # Y1VŒ´,I ÄOþKŒvÏÍËjF,e2æç,?sZèch›"§Btgôš+ÐG×,—•sÓäkÝ_Þø‹•=}bza”Ò$u$µÓ? zý”ñê ¢­¨7-õâ÷¦rf¤gÓÈzéXÔ˜õ/{¯â:}ˆ²èÁRòŸ £^ô6—±$¶±Jqm«ûa#šñºÅò‡iÛ¿¢?6bpT¼ZŽágèmU4Ôžº[ïvÓÕC#²M7•ÒI4¦0´œ0¢×ãÃ8t™ç+³ÆÛÏ—³¼çÝåúð` ùÀÊÐÉõeêð0Êgf™^×’€Ì<*çË“ðôõĤì-´0 ¦×Äœ‹ÕÖ«éæÐ’-%“FÀ²ƒIÕE=@a÷WF+`( køû¸yB/9I ÿ;Ü3‘77Ú̯ §=r/ßpsÁkô9D°lwǵ`uÎÜ9ZW¥·ëMÊ‘ô;É-,ðG{û`¬ ²Gø:63'_RßïNå“ (aRtË`˜¢sÁx™¬ÑY89lëe@¸¯­£Œ}A@œÌ•Pỿ…±¿§Œ¼ŽRD À¬æáÔ!¯då«¿rßa­óJ—ÐìÂw‹õ'½Û]0R:y'×ÙÍ#ö™'Ëô0O¢µQ¨¾5¨eÞ^„Ž\uœs:H BAÓõúO¬_4°Aü×÷ç(â&Џ™É¡‚º}m¤ÉDµýÒ5ŸÞן%6Svt¡…B1ËK´µwü#\¨ìôÐ~A϶Aôô#ÉhŸT ¼°3kªXˆ†Ò\¼QI’å/9ưµœ~MÐlb;i-)æ‘Ð÷C?œ6Òµ-âºÇÛyLó¶P96‡.‹XF/ã>sòï7è1â• S‹Xœ«‚ž·ò¡*.›ýê+ÀKúç ÷Äù5³B³Gº•zøß©Ac@QÀЕ-/šHz“f£H®ut€e”c$Zœv eÇ螺i>-z†±ÐfL‰q¡ÝÙË êò[…Èa¼Ï0éâhæñþŒ^$ß6ý™ÛEË`­¶0¤*§{ìOMË54¯±˜oJ"HvùÔz†,Oúz¸?šäNoX’o¯³:qC›kÀM0ïS A *æè2ÞØÊW˜pÍ!Qs#¿ìЇéÚmdpe³å4¾ûYT  ¹ ›’!½òzÏþsDeƒB…°Žzš?ÊÍ¥ªž´ÎEíµ îçˆ:,˜rõHôàêO— Ñó‡8mP"ÐßÌw¦oÉko˜ àëû-vƒÓú8€¬ÚÌù2â™þa,P=wTVߦnþI4p)B¾ÐÏÕÕ˜Ã3 ‰rfRĦZ±®û×á—>ñ¦á®(¨:û¢n/ìb™]kÙ£ú5Z:Šç~$â9ßð@j9ÊØARï™eƒN?Úêl;§ÀÄ„½z‚È¡£7”]¸×7¦ÄGäö*QvbåÚ䩸M‹Ì9#>¢¸”xv/±~  ],ó™*—F)E&ô³¼ õ\fèýÜÁ4ÁNï)òdãÀ ¦Ñ˜CAM]sLüc1 Ñä W6 €íÝ^Fäjs½ÃhÂö¬é¯¢Ê°c G³Ð¥#ˬÍwÑÜ´K€Oñ³SÎB§½ UÄ/¹ziœ>(H²ÑÔiö40ôÕ–OÇE#§a|¾pÕ·ÄŒ\0ÐÕšîìwæàëé(u>¬óù¨ÿ¡ öfHÎ óüù•?·òÅ×âˆøœ{ÀžÌZ†¡%¬øÒhsÀË~Ñ­ó‰ö,Ê;ÖgãøÖ‹ì½Šp3‹ÕkiPâMI¶=îì<ç•6<ÎÉö E·ùþâg·WÄÀö}9EE+¨¥9f¿k³\”’ ‰ ô‰Éì|qùö}ÎP…4#±v”âØÇ}pòÈ1!ã% ðÓܘ 0ž©BEùº84¾²òÆÒ-I×Iìòm(jŒlïdëvK Tm:¶–Å^K¼æWÿÊV…š9u/Ùˆ¨äߣÊÒ(6ï‡?Çù0<8õ}€t¡ÎJ w-dc6[F¤À@üÜšÍ0½½-!›R”.RŸÖTµÚ3A lø(Ö|?8Cër ‰Ïp¿¶—Ï-¨$×HáEEð„a`=§«®~:3÷ã-Öö>–N´õPd3r¤7ܳ>{ÐÁ‘IµO®ÌeX_H;T‡N/î±3¥VuN»qJ*w®cÍÀË]{õIöâþîz$´í€FóŠíÀ˜„0E?âA°Nühÿ¦ž–ÉÒMõ†¹·v§RÚÎõâU]Kñ7!lšTÌBÄÏzÅÎ÷!m¥pè'š'ÞíÍevÝšY²Ê 2¹l¸Ã·~õ ’-:p/¹ŽwÆLU–Ñ0‡¢Ä,è×GÛñL鯍ÐÊÖžÊyf™Y·¦r·d¿ÎwX_Dø¡÷ðèçø’@´…á¢/»ÒÞº¶÷9"pDâËýDŸŒ#âóý„k_ûn\'‰/…Sw“ÔÒÑV&9¿ÝÈ\ÍútìwTPR jJµWå2ZzVJY,U¸Ý¡7ˆpsïE¥±òY ÐVÔ•ä¹ì*Xpâyqf¦ŽÁÛ‰²õÄ4¶1Ð@Z¥p _$c j‹[nùÜ­H SѳûŠþ1ÜsšÓ[÷¡ô±¬ÙÜ[ =%\ï;äB=ô"!Ô6tkmÚܘ‰Ž sÃ…³6ú‘57ê±?‘c-,é®þb˜—ÎΊʯŽÛ'ºáÕ‚\‰ô/ê»PË38ö°j%·OJÛt7@ܹÜãy÷"¿³ÖŸcžJêxTºõáLÏIôš?p”O¦;¼þS–$äT{>ÍÞôåVˆeT¾¤˜  >E <F¼¾e¯vVÓO ÎË¿$zÅÐÌÄýG’â4ìXIÁ‚ň¥è'íÙ?% œy7àm „’?C3­ÖõtžÅ·"~ÅçÒ¿VYá5»’ß,”Ôߎ~îÄ–fNj¹6hg!Àò? íé*Œ/+Ò?s®m#Íu¢PÁdÿðS0ØGs¶•©µVfŠ8ë(tŸ]HæÏz“gY}hÝÍÆ~Kj‰ë2ˆöÉ‘šü¹ ?­œ=C&ÒPOª(¢X®þbN„h6˜ÂßöF¾²þ ž õ5Lé¡a¾Ægsøð£Ív*Í IDAT¢‚ábï•á—¯`sEdÊåîlÈα‰Yë;nŠ¡#Ë%/b„Ù›§âw—E„–mk·eí~rèqƒÏŠ–%öÇÀìk=ånÒ=¤µéw“îŸ*%Í˲ÅÇÔJåÚ‚¨&²{®W?Ñ]#úœs€~†Öf«~ö÷ÂZPùôo ’Ñ7uˆuzÙ«êꀊ_ ŒvÐ{mÜ…{JðñÓ|ÿþGŽe¸=¢ä=ðax]…D¬i‡!ª@ïÆ‹XDÐA-·aõ AE4ù]!¾w*ÍRË¥¤\ìv~Û— dÍáÛ Ê²¢l²NÄ%2xß·Ó¼*tœV膹$6|# Ó8[E’dƒåËAwëØ8å(Ù-}õ¼\‚¦dk›u Ä+g/"â褒(µ¶ÎéÑûe:CluGçyû-x±6&ðGbR(!œ8h[w܈§Õ›ýbÂìÜ”yÜÝ`Ï&Ï" 6I„8H¹e‡¬†BR¸°gÐëídžù‘tçI!½”3´odCªzÏýH–¤—Ô¿\mg’¿£}4êcêË^7 !ñßY^ׇž·¦uññ, Ä~ Þ9Lø@s:un³ÚE§©u±dÂ^ý&(âÿ÷µëô¸ŽdžÜÿ%û#–€¤ªÒóîîœ9=éÄÄv•ø(W~¦ÇÁ£öçQxŸƒ,.»¹MÝ-©îeëí«Ò\é>©n+fö]ômò–¿!Þ›ÞÄQþ“£rX°Ò'8´¶ÀœÂ–gõ¼S›!Íwî§°"??¡=ª{×KºEòÃÁÿBŸÏ«ñ‘¯Èe¤Þ m¿ó¯ß߇çyp,¿«êÕ.{l=³ª-â ¦t~~ðóóócš§Ÿ§~ª$Ú³.p‹÷ã©1Í}v§IÊúl¸µã× XU² ®¼˜ÑÂ%I¡ãÖ¼ë´ -ÍÍ·ŽcÎÛ!Êø„—¨ OeC Rø¢Ü© ±_]-¯çaM”ÚŸÎXfCúðƒ¯ŒÀ;é6_¾Â@Ñ*¥!%Ãû¯‘áM ¥°‚ °ôœx÷mÍŽòok[ æ³£O±yXªã™ ÷ؾ››t^°²Ÿe7€¨:Œ!¥#¤t+Y+úÉb3‹Á"Ü\m“çÃÂÀŽÈ›V¢Ô8G?p‘rÜáäs‚§ty/©™ó@7mÉÞ|¬â|3ÉËÿЕžU½› P2a2ŽÙÍȶ5¬Œ½ò‚È£ÌÔâšcßmCóf&zÞç™ïÉ ¢a•:ÓxkFö½-š|ã{¸ >j«z5tÂTÛ0·ÏG>S/;ž­¿ lÇîGóüþÏï sÝ€ëô¶ÇÔ)O­B#ï=©À¶ Þáç#zlĬV8ÑfÁOÜÞîd¥“Äûmšž{QP<¿Çž_Ý÷/ôÙOûG^œ6ÅQ Ø]¥¡5Z ›ØI* Ã2 ê0.”#ÊšUZ\qÜ]Å…ó«u/ž©lÄ·¾k‚LhlT.tày37Ss^§Äɸ9á[ó"Ð=‘¢¨¡KÆbé×(G§Î†­+;„Û½*rÊn$iû£À:’sÝG ˜Ê"…ÎüL?Îm1ú* ²Ý#³Ù3»-«ˆÇž#:·WôuQ%(¯M8“)»6vÞcºÃ¹#ìÕsjG‹ŸBý_y; _ιù0 »5êMÔ<,Eíž«¢ M"¸sÆ^4ÿJ»â›¯«žB'›#)ן tBŽ¡§“ùß–U õP 6€{¶P@Áp§vAüü mÈŠà¡=®ÖáuzY‡È_@³%¿~¯õ#NÂ&„~á!öÞˆ™(“âíZXGþRe=ä:f铲ØM€"¹—tEr¢zZwÖ…h+<:¢4â®QýðêK(ßöÛâ˜ÓmvŒîAÈx ¾Äór~æÊ§Á®·å0Ðm C/‡?ªHˆ5@5Ÿ±¦BÌÙÇMÅÛƒ¸ãÄha^6==ËI}ÔöWá‰uý™f7"è“%W$‡S6:nÒ+ 0·4úÙ3·š*x›¶Ì^fI%òzF¼š\U¢¨¨–ú ÕôÖWMZã~'¾RTÑÔcÑÎlôòÈ%°@Ï™ìà È=Ÿÿ5'ä'é¾€äD;ÑÊåú­åã9p¬GÎv˜Féì½`‘s ¡W±F!–6ùƒ [/H(æ&í¿¼òWˆ“3Fo6òÜ‚™šgUò£´¥|AUuÁ-Ç0ubýD]'†Wa€œ#@#ZZ?åó¤~AÎçoÈmµ$Ô›ÚÜÈülm–L@zF[Ä6ùj ‚Xü³ÑW…Íê63-Í.{Aoíº2[¬K±“£9 á’diHà¶ñûd˜BéÑßg~kÝGàMãÜ1O2Z53Î\Œ’£?âè=ÀŠ#–Þn ˆBm_ <ä]J°°BZþ…èy Gy›æŸœ¥µ±öÜFFôx1šeszøì‚A»£q_ÙµÉáºÛdp°IhÑ@w5žÂ•Ñ ÀKå)[¸/+Åyþ…‹æ¤Mj‰‡íªjd¿szíƒd+¬¢¥3¯—Lû )‘\jª=^*žqº¼È”g¸rà ÀH [ý<ª;§éJPôRÌ“ó8‘År¾„ƒ€t?Ö•w´Ç@\knTPÒ46Ÿê3„­Ñ]gáðã¡&©Wp´ Å?Óšˆ§ÝwþFBÜø»ké¸ô%œÐn;·‹R@"‚–CAW¢èX^¿ßRiìAØgŠA?nå`Gâ?_ñÕs¼û(h9׋áYªÂ:…úH¡–è§dbÓ+éÐ$6+¬û¦.¨ú#J±û™¡e¸|±ŽÑ „ŒÐ­ ðŠÅÍ«t’™µt-Tæ*‚ŽÆÝ8‰–$èsñdA¯H—õ䄿š•Y“*8ï§ô "£^Óˆ(vÁ®%çO¢1¹ãß‚!Ÿ3èqsÍco_L·5mÇ;-/ÒTN[Ožº?ö¯Ÿa­C’»0%¨¸h€0 0@/dVúÇðínfƒ*Á#3DñÇáE]s#fòÃU¨@%Ï ÓPï3ç5W_•?×}¥ ’æÀ²ƒRºÊhÙjrÓ.â|7ÙÊ·{p{± ¼8®¾1¹ÓŠøÀ@ñâ¡•\QÕf<ðgæ%½Ñ"½š™ËŒîH¨›¨?¹âíöòõýPF] „ýQW©²>Š$ˆ$Ñ O¼N…j†?tš\=ŒA¢þýF耞>›ýƒÀ<ÁÚ±×Aß³˜ÿùÙãŒÀ–Ê™¸ŸƒŠÖ|ì§ÍGä) 쬹vWõ˜ÛÀ¢|vd°‡)¼Zô¢±þ —Y´‚–½³–R&_d7?„ ¾ i´åy«¹fKtÄ©ÔË??Ÿ7xUnÜC¿8£ŸavW –ņ“¬Ö6&X×"ÿð Ë: uFþÞ=£»{Åä`u8`{¼coCA1ºÙyúøJ㪷غ'£yÐÃ"„¬æL’À}ɧR¨ ž)»/þ·Í¸œ§ŸÃ [ôªšv”­Ó"áƒþÏá…ê‰ÙjÜ[ÜCwlbR;t›ªó=Qô2Ù&X’MSýïr”ú‰§¶ÈÉÜ4Òƒê­ò&Ùaô“EôH 9ôQ®3cè®¿ä‚øijª *)¢o§cx€H˜ä,:ó–VS”‹™”nÊ­™ÅûMèŸüPØ>¸¿‚ÔAè}ÇÙãEïŒÃý$ †>h)?™B?ÌÔ¯h~}€Óª¹~¾‘É—…ý8kÔ•¢9ç!jƒ\ªãšcw q"P?ºÏ dC„|…~®0DŸgj§D<ÿú½Í¾Ë@´r¦™í´0C\|™’{ËI±ë·ì33xö1$.èà¶ŽF]\UÒ-ý3ÌËî6øÓóôhÓE˶XïŸgí³:†PB}²ú’´;ótEQÓxãɾåéÓ\,)†+ÞjEóqßÅ•ê¼ÝªP7Ç@ 1ÊñÎ ¶¸KƒEÚeSàž'_\Ÿ³æúź—mÙnÊ&í¥p½ d¦Ã‹ŒÙ}ÑѧüËK·½‡‹Û |^¡l†bi*©JÅiÌ.nª5…¥è RM¨g€»¯)CþnÂÛ?pì›Eð’o±Í_ÞÌÃß}j9¤3ÐÕ›B”Ëçew¤Ä’„Åc3~ŒýÆi~U¶HË}>>¯e€÷ºU”ñËçØ1›P>4)×ùI|~HêLÊhl¨“±†J„ti¢ õ_kòa–¼¤“™ÅÈ,¨\·m€÷ZðPG 6—U¸ŸÕÇùqÝ.íl4JAɰ`ñXž,祳s?¡6Ç=³E«G?öIZº(‚<½€>ÜJVF^nÉB6÷µug+l/ƒ!``ŠkÛÕQ³@2æzŒÆ“&*ðxãÛÀÙhÕ7›¢kh! iÍHT¸ÚöwÂ÷脆@v<Ióc}rFBù§•=_˜qü¼Ûâ!JIr%»¹È©ˆö×í¥L¾àJgñÀ7¶Jâp!¬BÙQÔ²â`AzÓô‘æ©Èìåf YéÙcáLþIúMIv<%ÿ$ZÊ/Õ}%¸9ÉÙ[“À gÉÒH mGlò´Ûõìyø%÷ Ý{y‡öï ,v^¨ x€’ó‹ïšÑͦK}šl @§uŸ"ŽRˆòû ÄN;?½—çúJ¢Î,Hú³ýð±;ïe öSò§„U_™Î÷=ÿÚ.¯Í&_ç‹] v˜¾¤ë@· P¦MÍÃ× „ÿÅhËì’슭î”ACYÚ§s›„Y1“ÇY~ó™u~·CÝÖáùFʹwÙÇO†¹m7o¼k€Bk1rÚüK“Çi¹.0´x]}-êy»"ÌíãYÖkàù02[¸2›þ‡”áW-±Â¸%%·¯Ø!/ÊùoŠÜ·jÌ@ç=¼o,òÇõ`ÍëUná4¦6D€bø-ú†Nõ öùî]”Ý,ùd’jh.pSXݧá:* ¦P“oÖúÞÉ ïÙŠx4  89”•û™Â7{zÀ ¥u¨|š »h=ÅwŽG®?|dFÿ°Búqw>ì¢ÊÌÞû›š1mÅJtrÕ²ë‚"zv›ät°CsÐòèÑÿk® Gáe€r-ØàŽÐ…n½Xztý¥GH*»ÙÕwµô¨¼äîl阓tƒ½~‰yTFŸ§òS>¯P<’Wª-«¶|,è€`¢Ÿ ƒÖÿµ£¯Ó„¦*,lK~`” =Nª‰Â;¦È}Z P.Œô÷ëvÓšIäR§R¬õùÛÈmröeå"Î -ÝRb.9G4UA–O(ë ªî‹î'³àˆ¦IÞzŸÖB„‹Ò`£ؤ7I nêZÖ±£¶£˜¡à€~&¾½mŠìDÐ÷¬ÏæúÈ®‚`ÞÊŽz!†zŒ£“û>´Ã|qôRå!ŒRåìçŸ$Ô Þªå¥Ó ;ÚÙàýìú ¿ÇxæE0ˆ×ÿûȢ蚓H€¶‡«0ªÌòœ+DÚ%NVäiµÞ4kÚJ ïߘ@&¤÷>R~Xn%4ïú4Xå°êf€Š~Œñ²†Ôx‘Aëj-µfe›sÖ32Ls=¼ŒõÊèhÏYýˆž¤“ê:¯Ý¥EêTWí3`§Ò/d#쟎ôæ“e­@GΧœ¢JiÕQ÷n1Ðçç%VÐÒ9¯ßì(ÿ~âç _¡ú˜OŒETVËÝ7ésÐÏ*¼øˆŸÏàÌ_j ØB «,Üeî/Ó?äÙ1_PÙWÁÌüd—6Ñe%)8rg ô;&úޱ Ä­a¨ÚÞ,Ž 0œN\°û¾N—wDèÔñ¨Ï±43>ÃÇhl_ˆÞ8‚Ï²Ç ñ ܶÄfE!§ ŠL~ó1Î.pΦÆAsõQ·"r»Cúê!Šöý à6¥¢wF5„SêkÒwâ| *ã!±³>N¸ÖHÐ2@O©b»y /·òÊÀ½î”oKŸ9nX ù¹ýãC’Æ[ÜQ”¯çzHsܹxˆß9ã$yÞçI3±TL•·ˆhcÖ ‚š’çpæ²âxödš~ª rÙŸ,Ÿ-EñV”±.ÕÔÉz™Õ+îÊ,3_“2JqI€ yMÑõ;YîrGÔ@5€Ò¼uÑdj:è)üÜÅZ&â[؉S!0WeÊjNõ^0¡ô¢…~wõ)n³h¹²ý75HV6†Nbt‚ †ÉÐg ^O›È™¥xãÛ-¸(Æ O&õ#$ÅÅä’ao¶$DÁ™…¥%Ùy)«<)}¸Aa5Ñ ¢IbÚt14eš›4Ò¾°…œ !ËtÊ+˜–§‹IÇÖ·‹Ü”Òp (¬tTÓËÙÑêë´Ä7(¸XEXM*é`êôÀ­E†©}§ž‹@#È™S¶3j¹¼è€—ù|EœÙ×ÏOdþFhæJz ^ÚéWö™ÕOüp Ør±óÇ>ïÏFÈ7 ÿ{­B§å§’uz¦‡Ì«Ô*Ï«:ž@ó …Þ ëÿ$Vãl#×ügn‰ùö€E½ÆVÃóéEÍu“?ï)KLòÈ`Ó ¥©a‚ÿ]DWYÞ ‹7PvJ—FŒyéÿ·b ‚}€zu}3Îýð}¬ßÔ«J‹+ˆõ»ú­æ“ÐíJDó4è<u'ïÒ-®¹²y蛯â=ÿdÔê€FjÝk‚ diÚ'àô²^®’áLRµÞNƒ‰ñ¨î"­°${ÑšÜv€8ÁÛeÄÏþR*0Z€HdA]•îšÜI¼Ãè°Ã¦’”&§} —Àlmס)³¦»*wf@—®È:ÂN@âQ:åòg`ù¤Îó£ŸDaÏã°£²¾ ~ð4b­þßYDH\¹0@k»#ª6s±tÁ(ÌŠ?ûÛö†IëÐG¸ƒ%Vµƒö•G(ã'ðõy“ÞJÂðVD–,ï,ÄJ€ä³Ó ÷SËA %ö‹¶ž,êJqǧš¶i m$û¦¯…eó=éO„“XÝ1Bu%"ÛY¹gûßèqWÊ¥íq¹¡:ËFR$Œ¥§}~»Ç”gÍ£i ÕÀäÉè.C-SñìäLš¢ij Ïu æÑé63jˆ–ª,’tƒ¨xÝŸxƒWËvÒ•;¶<kcMŒ…#ïI!6ÃN;Ö)5 Ê(‹Æ Ÿ®ždäÇsÔâ~gâçûC¤…yABå:ÒPiÝ?eï±Zý=~•fÇçB9@Çœ¥Äùì .* õ6­Tg– õð Æ(CJ×\fðM-´ÿªh‘>ò—&"¨ÈŸá7Ñçÿr혟V‘\DB.ÐÇ„±Ar7ÑÉ0—Ãh$þ&–»b æ³Z†ôF¹’ºj®Å†Ý©¢¨¾ò蟊¡»§Ùª•¶uÜeK¸oPeøÄ)€Ö?%M^¤ âQxtdå’?Ñ„wéåUùLúiZZÂê—u*‘ákþÀtŒÂuÛµ µè˜Ü¥ƒ-ï?·üC ƒ [)|ÈÊ«£¸Dƒ£²ê ‹ÇÝá=Ÿ,C .O}*ܪ7²[0È Û$Œn>š˜hëgrƵaØ=rœIIÿ£P(Q]ÃWX!ú0 Á& td7âl2¦䌀Œ;ªª· kéFë9LN·ºÁÑ%,vŠM4jèýô¢®ýÖ’µbsÊ8g;ð²;¼ˆdÂs€`ST™ \Þ§Ó„S“‹S}ÒhÌËõâÅU¬±‡¼þ¶öÃvÓ"ǃÐ| %ïG&¢dCÕç€ ©ƒPÚ<ÅÒE¦§=ÞÊ¥}^pç—ãWè“)S‰ôØûU.‘Í„’°!צùq$çÚQ“$©Ù2U´07X-bd“_˜FYê *êUÝZAñL®T«1 †$×QrNfkëBÎî±@}8>/x’€ ‚;îQ$D@_ï"˜4޼¶ÞâÅýñW6ˆ—d#…¡ŠPѰýýdûfaÓÉO³'€ÊꡟU;Û£œüÚÎ8Ö“Cá9 v5*¥Áµ—·šÞèÀëpå¥S¼ µb î-èïYÏÂ;´ì)ƒ*Èü닎îåó׬ïD[ZÔ†½ô8‰ –M¯2¨k¶:f¨¿è¥¿pÚ«w­åéû¹Ei™<³ÒBCÁ§üN{ch8uYð4'á‡1™åë)°L9S+Š£×4@”(%ëû±>î8©òÁ&…nÚݩˬEW}}7 ?Žw]«ý àmòn‘?§æ1)p\½¤föš ×÷ð,uCŸóÁùkd~- ëcŠ…hƒŒB£bæ'W LRBž*¦Ï¸¥¨>ÿÚèó3­M„ñ|=Cˇ“† 5.ò¬ý É••«ju=¼ý¹péÜ ªZhªØéºeëBIþC·ž `©êˆ9à)ÐGsEÀ7J@ì^g¦)Ëëʼøýd-–ʉ’l2ÉÖÛ!ÒIÌ~O!luë¦]ô¤$µ¥¿ÕfÉÎç>ûsƃ‰²bÎþñ4st›/O[‹¿VµÕ(3cR^y\¢ù‰ „ªs—„ÿŸß÷ ÇßF­ìãpãÔ¾C¶ëì‚ÚÒršf³Š=ðçŽç„Eùçó/ðÊJÒ¦äáÁA?(‡|¾é^%©Ó~V Щ»Kž–žŸ<É"ÿ =ç”›’õ€%±~˜“–Ú;û*ôàbë?Ô«Àm2Í>À'}È*WT™aË¥ iå>!¸'”ÝI¡y6ý“6ûüÿ×Rþ°J:n#0%6÷“k{XÀæp?¹¬É‡ûYÝkþ¢÷jÒÚ%œ^ɦ;8²£S#»„s‰"R k° ´ÇíÅo%Õ﹃©vµ/ÇÓSÓwÚ¯A'`2û¥bÀR¯8±ò@r´CMõ­…)wøÓ×µ=fY2F@Pô±4=¡ý´SQOzCÿD¨ÈF`0©s‚UõOÑ&©RÿvÐÊÙÎ6 㾞}݈ˆi6Ó± ¾u¢caxràÝÙ8'Ž!MùÃy}U5Þ š[ÉU䨭=9ÛËñf7âqAÏx…æH\Ú7Ñèòžq`á-š’s÷ã;[UªQ5MY~álמ÷ÝæÙHÎD£¼ÉçýÄ¡yê!K#¦hÐôÕ(j¹¼$)ð•올ؚ%^³’-FŠvò管ÞÃiÔ IDAT´{ä| vºx]õEÊÝÏ·$nèG“d¢×{!ˆêr*¤ƒ­¯dúçóÁW~23¿È¶]ô ú\…¥{À°8žÄû±¾oº ø1=Їõù|ð{´p(ƒ•ˆ¿ÙÙ£Ím À%R²ÝËéo ±¨b ‹÷MWP¤£«òƒþÄš{æåÒ#!Ã1ÖO m+—ÐgA*+LH±»Ÿ(\1ð@åUž:øá58zXNA—Á%(xÌ)´1,»ç‡zÁ~z¸uôEcß‚~x‹J% šô@Ò•¹Ks܈^ò÷$ªóÝ8‹jÅØ20ëSéþúí1šwýÚ‰3ljDh‹j#·ÜbƒTúSy L=‹ÈúóL6 Ò±š;›ç •¹–¨MiX£Æ£zÅ@4ß Ó'm‹Ö>OÁºpä­tÎs±(¾µöà 0›(¢‹"¥Ð»tq›VÑcë2òÈûS¤<,÷ñYXgŒÉ]´5B@ G–qN M5„WbˆBy¡7nœñ€»o‰NåÆÊž ÌTÝO¬s OôÉŠ¾T ÝÅ$öçím‚\n¯_Ä÷,0th!ê&0ôCC±6…ôúÂò2f™ˆ¹˜:+³›‹A¹ŸÆÞšiñ?J‡ÁxD·ÑúÛ¡pÍ\³,ôj•!9¯†hdZz7£E@j“p”ÔbþgUFÍ$|îµ?Ï(#/ðÌÛ$‹U HÆ;ð :J$¥º?l­h<]?³Í ¨¶°÷7‰‡Úª "Ê?ÏÞ*ªbÖà?+s\_’ºnØùÁ’EWÜéíõÓÙT(þ j‹U{±ï¤fN‹p‰ìÛ­âéúòçãk¦ª7c0yx›Y×ûš6ñÚ4ÑD ˜ÜG=_âö2 S?8 G¾1ã»MæxîÉ-ýA?Œ" "ù3"¼öU¶‹Ü?̪­RD³ùBJº)ÇsÂEßú.mjàè~ÄCb•ÓkæöäìÚàÜÈŠ˜ªfK4f¿?ugÃÒ’èTi€¤Ž=¼ø…®wœŽ0xB”¢ø§#‚çgžæwµËàwaõ~Z¥€åJìž‹Š$Vw ÓL™h°yE¦íæ¯>û‡·…òœ›À‰7A>^ÛÝD ¶M¼··ñÅžº2˜x”@Eî§u‹Ýåñí/Ëex:´ÅI.\Jèà sö8ѱçåÜpÏ'Y¡’@msªRsÂ0oi¦ØŒùàÃ:]H3ó²ÏX7ÿÂAyýÝËU;¼³Îsvgù’ô!ìWçÊ¥c‰—<d­ƒ›Q«[j|æ­rÐä× 4P”pâf mjV2é#jw,µ>"¸Ým al\<®½€öU7,â·}h%Œþ©–ønØÕ˜Þ3Žƒ©´d›HúvcnPŽÍÈ?I—‰ÌT ^"Tí°lBÔºC—jMòñ‘7à w¦Z‰š®ðÐDðöKùLEwµEÉ-õ_F<ÀÔƒÑAŸRÀgl³%Xsik$E )šÌaN8OÁZôîïhä©ýJ|ƪÕÅT•ÚJÃMz&r)•å8êuõÈ`‹…öÈËEpÞŒqÎ=P‡}ºB@:LJ2Thgµ9Q)œ£\ì°—ó½GSóa>Ï;y=…'pr0;h@Nó|¬óõµ)ŸÂåIJ«Pmˆ…¬ªBŸeމO(]P!SàçP‘l€OÔøas—3!9âË$—’ ÔR©ì•šhçi– €ClårcÝO˜örß#)²Øø41Pw°n>9ëPÛ£žÍÀÜ`r•P7¤ÆòMc ëÓ´ñfFœY%ßI¸'‹“¯Ã@¢TpC¦Õµ}Ú'ZW˜®j.qŽH¹dçZ¹%4ç_0~V;³“÷ÚŒ—¡?èd¢î>jÎP{íãrxµÁ¯6x£;ñ¤GúÜÉT•¶zßÇ·Ÿ.©6Æ’â{ÿ0T-¯ª½ë¡½L4¤â»O1TPÓ~Ñ b•þ‘¼6ÏÑCa½†=³íò—îi~˜u¥#⥳"m*c£‚EÑN¡h€¬ãøÚ÷0—†T8y Ìî°†üP>ª ó4 –^ö·†þ F›æ¹l–0­s¾²µ‚èz‚߇Û;1¶RŠ÷Îö Q|R®ÚÝ¿|þõ¡˜ûùʯCüÈ\ÌÃ"¡ƒË÷þC.ôÉ:†lb£¢üय3;,OÊÈñ\z‰[Á¬GƒO0è ŸÜ1f©«ê æëK}aigó±Ó5H¿:H’-  ä´!NÉ ¸ ÉšÐPÿžÌAjÿÓÖ ¡4’Åæ_–.vøh«yº]ÚÊ5ÙŠcw”*ïR˜¡¶ýž–œt!¢()` / Äi‹1Ä­ü…r dš¢!”½[Pˆ:'ãKÓ¥¾Úà»ÖU9Ýêiq²–ÉÖ¸Ý$ è3 žöýÚ !»¹Ø³ýn¸É§: ¡Q)Ì')´“Ø  $ d¦Ë+ÖÉ*¹­ôG”f0N½‚EmSÃs膹ù Ÿ6hÀxÌ‘2tUõGí?=[¯Á°å<¯\ö8ðȦÇ*œTn:Ñ.&*jJAý"…Ç!xy:ôKæv«iý9÷]e€dþµI›%Ïå¬??Ÿùð@αU>Üf:Ã`…o¶C™á5‚ˆuÛnêD\|#ã{Š"/×>Bqé0PIõ…0FrL„Zuß”­Õ^÷sZ‹2‹ º¨ˆG3óW§?ƒ˜›Õ»±’ ùŒ"/,dnÇÜù3wjºbk\q.Z¼À=%ßœg¶…¥P'NqIRò¯4Ì*/<þGXí¢þ1¼ €~e#¹’¤CC¦ÎoDøSz¾n‘?Ýðëëmú‡QQ# ²lh=xsžÍ.7%ÜY´ÍW_«z÷ëÈ€_ñûA|-3üW"~Bc<²jðdòê·næU”u»ØÍ<´¶e¬Ébð÷°=Gø¯¿šóVª¦ŠÏO–³2bòþ5)÷Ó†!qºQUÏà¬ýP÷×›¡WlûãæÃ2¥Ãô0õýÍôò ¼íù(áÛ (ïW]ίÙjªªo”¸±b— tm£M»Ð(eèò2Ÿ¯ñ»–h]„Ð1r1Äàw3Ûìßp9+D_mƒo¸Î2'q•¾ZÍwz„˜•W¶Òèä_!‡tÖw”Ü>ï××Ê $Ù?U ¸G!2.)¾åï$h‡ûX㙇¯œP>ˆÏ2ʯƒ6|ú¡_‡­Æ'™ ehhÄuAût6ã<ŸÈj ¦äHJ|ްRI Ë­@ì„@rH\´Rç_0"Ðâÿ% Îsé ¯cæÞ_]M\LO|,ú糡7C?UtÚ¾ØÐ5ê ý,aÐ×@ô wŸ¼)0NÐ߀3×çIÿD|…gm~øžóÁgìõÛÉùûO€ß8Å<2 pz9CÿD6Y[ˆ¼œ›eö·w°$Jõ‹LÁ,ª§Ã7©v,‰ü)Ÿä\ùz2h<â  ”N‰×J¶È‡Ë(:ùWÕlž@Lï3 Âp¥÷}á÷£dÖö”rÿ–.&†ýc£®¯EúNH¸Ÿ/š‚Å£»dì+¾hÛW÷¹÷Ëó°ižŸŸÈˆŸ/ÄOf¾~‡dan9ð0û£À _¨3Zâ}Aî¯y÷uúi¦(ôµ«¤‘œeÌx¨ŒÀ"J¿_ד۬þ˜6$ Z TE$å> ³lƒ×âvêÖõ´Ê*ç9² {IÝsaihÑO¶Š ÙgKFêvOx.bj¹Ð8Ëäe‹Mô6ÒÛ€yÁÀm–Í®ü÷AÙÝè1Ðmëí†í®”íƒj1J×µVÜ"‚»ÀÐkB'v™pëc¯"ª¼*Íý0• Q—õú¤W6cÖ¥nKp³­%]“%º)X‘ ÕtŒn‰¨=ÜFD'‰\Hîq8³Ö5E‡YeÓ¡f¸W<šŸÃýÍú5•Ã2“H<…nD¸¥Ì]•(HÎ%̽9èiß1´*/¸ŽKÎUÓ7°DÃ]ùIXšàeÎ_áU©xµIñÞ§þ4$H¦™¥°ûÅBŸ£F9—?Mûì §Ê¢·†:·ú‡x B³¤º·²\\› Z~}~â+_ÀúŠèªI¦”ß’’G‘¶¤vô ÕÞo¾2Þ9=õ³»ÑTÄ:‚U.5ÍX’åFe ºDOŒ‹—`œë¾K¶¡«¾ìë¡.§ ÁºSÖsÏÅÎã û[v/AŽØ§[(mÛÓ'âïÙy?ÞΞŸÍá‘!žÔ€Nµ¸h%L4Œ|MÕ˜èaôpÉšæ`c*3k¨Ï¥Ÿe×0IÐΊnºÀT^dɱ’«RÚ÷ò?slêg9ä3é‰JËžln¸ž!ú™Ÿ]N¸ž'Îî%|«¡oaÍ›Çó‰O·–O!±«/–8)X§Ô¶Ô(ÏG¥-T1 oÃØŸ í0÷ÓiéköfF~˵yàõ;äÊ´Øúà!¾ra v½BiܱYG]Ð俬­(sÃg)åõ3G¶‡æagH9I§ÿä×å­$Ôi¢*åÕ0³7…oëÕ4 ŠJÝ•?КSÒηEsX¼¼g—2˜”ÛÕ Tñ7Ê ‰qr*ÑîA}9Q…>úø\Eãrð€uÞú¯{P<¼Z´pd— ÌŽú†¬øjßhßÀÄ7iª±9+ÔR@`ÎRèœ-ø‰0ý¥€ ’ ({^qPÚeEv‚ÑOƒuÂø ôi®êaÖÉMnE YƶZSþñúr£ð’µCŸ¸xï¯8µöCM¸Å÷ÞJXÒ‚Œ)42鄨¥éI6©ÄÊÊÁ ð²‚k&ÐZ#Øh—G¿¸ãË÷Ĩ-k²"*;Ô /bÐУï! 1qÁÏÐ:pî5žß”zÆ8Ãd·¾¯/‹$h«‚‚pO,¿XÄWQDqˆ'A1òd!ÊJ°c ä¶O}^œþ9?S­M¸|!~BRMëI>+Ÿb^Uø Ê­bxØx‡ë™©Í^#ו¡6—µÃ䘾 ‚N0%3õ¶åøL¿Ž'J*ªˆRB¡E­)²ºã&½=Þ !ŽSÚô( &“¡a¶ÊŒÌP`ÃNS¥ÈÔ\þ 2¢UNÜO‚g@»§»#¼»Þ¸j½Ždâ'šqîä?“è6)ûAØXÙ«0Öq•= ôÝ"þ(-óYºÏþž@™ÈÎØ…’Ä"KHZÛwŽï/„ºI-R…+¸ªò‘µ7Â-ÈUA.R¨wf^b¦¿ç9 ë÷)}ÇýdMÑ‚~F<†{g#P [@{¸:½ü™cä©…ß0r®o¼¾P‘Ì ¤ >y‹Ž«¨«»ï`ši|4—Z+0ÐYã …ÔQà©Ìpä³N\Æ1Œ#ïȌ/þ¼<žÿ_ K¤-ªyüöJhø a>7Çó‹¾FÜÙw¾""$³Ap[­å›ó¡pg­ã|ê¸ÿ2m€SvTMN‰¹-WT뾆™V·9uÖmhÐ5ÿÍA@gp^3“ßA´&MºÏù€à2ºÁD>‘?z´¶xŽ<>RŽù¯“°:ÿòfTý …>ÖþÖ*^Of\ÿ‰HºïQ¼ª€žº¹.ÚÖ®  ÿ5¾ ð’£UÌZP£…®˜GŽT$M‹Iãs}3’Cç…ŸèŸæ_n Ã…Nö!÷êZíWÓ‰1ÆÙ(%WZ…AÄÒg{.í!+SaG¢%#uƤ™~,ÞË«¡ú…øI>´uÁ‰ñb Ï–÷}ÙmMÏn4à±yÝãàž¤âo šÛó¯ ÈX~òŠ.)|‘Ö²39üš&8½<¼™;²v^SÒáÉCälÏF”¾Âí ZûºAýúüK[0Ô÷^ÑOfÙe¬Ýz©‹³b›š¶¾eà‹<ð”…]ؼÜV~AgüGi]Gkãu‘+^®ë”Þ¢lòŒõŒn–]op‘TÄ”û3gûÄÐüÛ;³`R?¢6H¼«Õº½ãžƒ~ ÿùÜë¤È‚AålU ®è½ˆ¸Ói¡žm(]g3!fô ¡c‰JñÈ,IÃ]õÕÝzuKÍçeÿ&ˆ~fs^´³·Ô¡§«´— Çõ×ï1°OgÕ{‚Lð$qtË-Y${»69”ÙÎÜß8¼q3€•ûªc&ý '…Ѭ ï#4È®D;ŸöØõ¸‚ûžÄ{âpT[š6»zŒ~rM–`~5Ñq"}jþàV“÷‹­Ü°r<-o°Œ½Îu¼^çãà:˜H‰ GÒa»\^Ïlf­<QÓY Dªè°ò´Rè<\¶Ú›Ü”µ$¼]ÄJ÷ûÎæ9³­uëÑlŸ?â<.(D1‰É=‰ÏÉâ"·›e³»€F Ml ÕJl\¼Õm¡‹7!Ó¥#9&€k ²_”3ªÈƶ¡Žå`Wu?ÑÆÇö –˜ ËnÎ7¢Y°<÷g’Ù hîGåÏ¥CƒÏ5ñæ¬,’ö§Ãó1LÍ«*iD¬ºhßJòÏÓŽΰ:žeO-5%uâ­¨1§Ÿ´€Ρe WÈ«ïzØDÿÖ=õßþçÃ{v•mvò_ èã˜ÔE·% ~s¢¦¯µŠg¶Ð'“¤B½Ÿ“V2¤ò"EÊSkƒéc”c¡ ë눈Xc"‡ 0M›d@=ðHyi-$D,—`ÃréSš•TŠÒh€X‰¡¡åLT/€=ãõåö²G¸ ÕZéwKT)…^Á‡þá¼8‹Î$ŸqÞçY/ e­È´õå±Á£sPdtY þîW(_/G÷µ#À-;jx…ç6 WÊ ªæTaðm™r“¥Ì²•õá¿ïöY&º%—íÜß„àÛا~Ø.þ¬G/ÉŒ¢ˆ~’ä>|–<ƒ²8†‘b”ÏF­õzl‰šß~vh˜šT¯ÕâÅÜ“;>5 DêŽP:Y¹SVâ“üÅÀ]$m®·cë¶£gµnðê“•]3 >Ò\ÇjÇW>3Ô¿T¹Ç „¬¸À.B$ý”MQŒ0ó2+1ܪRÔa–é¿íðZ;k}î†_z§t{å.xøe +‚‚3{ö† -„):¡¹™ò—møŠTƒ¹ÀN$”Ú+í¶oRàÔ¾‚*‰ÓBÜØ=_É?ÝÜ#»F®L¢%¸cVØÉ0åmøU„:­i‹$ ~®—«ªý/‚\¾sZdm7 {§Wï–-LYá{8Úi@}f)Êå–þ¤3à©5ÇÌ´}àX»_hrP¬Ôî“ùg'MHêHQÓ9ý“VV‚zùÔW?•É·ï_1æpú¦×ÝERÐçNUÙ6øÐ ,¶±æaNª«ýSV('9„Ò,”èÏcARoÿê‡%Nϼ‚'V{¶ wv%9¶Âîtu‹,èd˜ž3Œ ®»Úm‹NÙ2­ ‡Ä u†Xëßkwž^ Ž*µì‡x¢Klou͉!Û‚Ãi{)?=\Ï,ú *ß·êÊÃÐ?lðý¦Ç $Xƒ“4¡Š!¶ïI‹)AÍŠ ØÃ Ë ÁvŠ=JÔ>ƒŠ’¹¶|ÔWx$XrÃah¶e^ †½Ç¦dÂçW÷< ›ü¿€{†Ñ+þøï§â€±Y#Kðµ¡ä·Á€|pîGclH™ÿ¿zG²¿ä8HvC'ÍÁˆ;'=HG”ŠÈùm—]´¼š%>£™9I˜& 53ÃNG…á0¥ÏÖÐØLRHNÃ,@ú­8Ä §£- G ™c”Û¯:ú)âœÜ*ã¤ÏÐn>ß÷ h¾ODõnèJ“‘r<§8or‡=ÆkkMâ‹‘ZÏ(é9žtä:BH¼‰Dj6š¢÷‚ê™Ï·ÉÚô£Ì ©âcf†¤>¥¤yëØÉý!Rj’™^­e='eÃ=hšçM]s¿# º 9Øccc4Z€Ý°RChr ¥šžZœÛ“ó ÇV’¼= uWí3¸dÁ ¾0×=–tÙH„ …Å3½¤z +½µÅTŸ³‰˜¿“PI´\žx¦> p†î±ÉÁÝ7¿~fP½!.[ºzH<ˆ, ôY26ßñ=ÿñ€lE5(çKB %XŒ~w‚ï!5ɇeé«¥¯,òÉ}| ÐÁ:¢ J*G #†D0 ¿HÔÓFqwÚÞò(¤]”뎕ͪJöE3t>›r°‰roõ[çz–5Ä‘ÖýJ¡ñ››rVs¬*À°#'îy§Is­ë ì-)ôŠåý²özÉÞ¤ì ~P‘¶Ö¡Dñs¤Ô¿Ã6„I—Pzßà®ÐјPÞݺðyKÄîzJ¨·’*}Z Pj5¶Ô§öE–é8Kú¢E¯¢T|BOV¾akܵœ)ŽÄk·_‰P5"EÎqNì'^tñME€´Òb&ü<ÖàüŠ{"à¡{/˜!JP…FïÓ¦¸öÀ¾\¢;DD‡~œòà€µ?ó·Jç6Ô*vÑ]ëþM¾ßÕÏÀâkíËq¡ÍyÅ¡Ó3 äÈ‹:ÎЈôÔóÄ( ®“ /½=#Òõà8hhC icQé$œ…FõXqÏ@£RèÕ•þÊô»–Ÿ4yÃ̃d›±.ì~ ·DÀ’ªK ^È`È/$‘2ùôAF§Þ²áÕ¦™çË¿´GGç'^´Éªÿ›ÖøOºü%Ô¨§Ñ&Þk"ÑMrS®Ðîá ìáùf¿ˆíBšÆ]wt–È4ÓJs0PŠ.š~Ë2ÓR«^B t/0ª¡½ØBõž†«ƒ* ªÊè ƒ,0]M'žV†_'šGJÈà bbµ‰q¸,1\”Š„r:Ž¢¨Ñ0Í’ºt§ÛVÏVé^–tZÛ”NQO…G†] ' IDAT~=Ê™g#•kÄF¨–‡Èg;ø«x1üâ!q?É®YÙ‘n&JMYWgeÑ÷iJe²ŠæU’ù».Æ6Àùnu€$6‚l3ï@xö¼£àmq+ˆ>ÿ:hÚÌœÁFMÚ6=ï§e*ËhSt&´äð3=žÁëmeß<ÂùV¨_|ò˜g²W‰t(ýÙPerA•x\vÕfÓ¶$P4Ý Í[ Ä³^.ÏíÙ{•œž±—ï`÷JÉdê¯ktùÜºÕ {Úÿœ3õ|êJúŸÿÔ×}¨è±KYOfþ&Açû –BŠpY¤’:kÃñ•"r(8?ä(¢3ÕJ¢ò#×2¼xaTY´ž›2ÿ²™$ ë Ýß3@Pg9[‚BÙÌ"2ç5-Xküç¬^¤bˆ=­Î;Ž<—ì^ÊìRËNR‘í-Šö¼Ÿ78ðŽh°.‰Õ÷æÔh擯Ø-þ65#ˆNqìîh½ÕÖû¶á¨x)ê¶ß2ââ¾­ìd?9³Y³ÆhûŽ×¹4‚léÔS†ÑkoîQ<øÉ|Ž`oÁúlB9вÀmç³fGÊIúß³-Üì$)ñÈs`ÜG E^œˆ¨è²ž»Ú¼¶wBõ|ØEO‰k34â°ÔcúÞÑ9M¡3ޡ岤&”Ã]Rf-‚y göçΜ5 šYÑö'(ÿêçùOðìi†ÑŸècî=äwô‰»AÑ7JebX&~t Ç̱$ð MÙš|e†ÏºÊBü?ñˆp¿úÐjÐäàŽBéá§ìo3äÎEën8!(Rä—k²þ‘Bÿš±b…q‘ÖóTŒhÒÄw<¹‘@uÿA{¶ôÑXÔž>lÅG4· ʦÛ»i¬g[¹Ç ËùC"èS‹@R£“°¤Ä{ÞïLøäÔl´ÙÑg?¢¢,mwTÏòw‹}ÓáÐ §cÒ…‡lɲ/&½Ñç×L§áwkêQ柈$.J[A½™Ì!Hæ¢C‚ÕΓÚq[žË­ËŒx0¿£Á5›]Ô4q?š"&žb)ÚJáššqîh³iqO]3Ãu=Ö[10Ÿ ôfhÌg5‚u—R+¶ª³Fe€VÖ}’þ Mèô•Â%¨™LÜÆÏäɘù|ù_”š6ûÚŸþáó„+®brÓ…¥e­øîNtB¹HŠYá’$-¤r9Çíůhþʳ3BG)íÄ^ÚW¢çöJi.¬Âø 1&ÃNKJöéžÃ*]¥î¼÷|Ü/Î ¿¸ØLÊè‰Ïä°f )v Ïm]?¬ÚLÚ«Z‘£L º2·DWmfñÁž!~1Ä¡Î+)¥#6ÝH\ÚÙ²˜2(JiXÄ„u0èT褤Ì&!·g*‰èÔèØTÊêoµìï7hÆNx–ÓîvÛéͰü¿ ¸Èð´)wþ³)™ÉèÏÉߪ(èçÐ@É_?ŒO°â§ñ|ñÀ+ˆâ‰X°é‹Œbš¼¯TIÞ¿ØÝPj‹ðÐSñ•çñWE+<£‡ù¡5¨YêºñZÎËøUüè!ü7:Wµãb€èHph°hƒ2RŒªx¸™p…D(ÃY›2F_@PCA‹{ÎËS($ ,Ç Ñ#„”ÉwÔéGˆRá”èY׬0…¥›b(Ía $šÌ+Ž.ëGñ  ¤Þ†æ}H–Àä\R fE 3Î%’`vdT3P-Ø‹æ8(iŠðŽá}@ùÛ@yÑ=é4j΀Úo[¹AYÇóÉ÷g„` ìíÏ%Ìc9ï]Ѹ9,! E˜ w60¢™Q¸‚g”ó_ÐCð‘Jt~Y‰›ÚâÚ“koý „ñÐÑå3)úAÑÇä^¨aŠZrçÊñØ[Y»9¡Ñÿbj&«•5+g$!J`kjϱ=2ÿ¢.ÄKò!ÏË‚¼îUöl ë°3²Ûô,ý#úé^Q4”k\=P’ÊÏ¢¶“ûUíË=¹‘Ç_™¤Ç;rÐ胫¾„Lp"m=±Kç7Óµ˜Í†Û%ðsÆãœÃµDß :õúY N™9l“>«Äô¤5xp¶0É]ï^7–C\Ÿý ÁÐaß«­÷bKÍ’20g~éív×)‹ ËåäOÆ×¡ß>/ù¹³¡Â Ü#4e ”IjQ v@A‹ ‚qö*Ç="‰a?¸)Ù!xî%ºŸ’{ëƒ;©ôÆõ­MUãÔ.ÍDcyö Û]ÕË¢énÍfã—Eµ“K¤;ä»ÑÞòœx8ÀwîÝîëÀ¿âžWº4 Ba@ü"ÎÒ$Qì£këÂùÇx`|Pˆ:xï§Ķ'ȆBëçñR¾Â7we0üWŠ(]À#{ÌwYì´•bO¨Xš\‰Ÿ úh"'A;}ă6RµlOF’—‘ ÊL4@”¡4 LjÁà®ÂªR31MÂRèCûƉ™Po¢¼Óp *œ’Ô¤®Xp¹ï%çíã+‹&‹KÀX ?L»O§(ËQpO*:Ì[Lë£Á Øt1¹VߎÐ/ ?­Ì eßοÆ3Ímø¥í§Ï”ÿô™ÌÞšíÃ.tç 8‘—?+¿œ€€vÓ¶÷Óæ‚(IMïAèEÍ8ˆG`‡…Äy‰O û>h(šRÍP™ä&º®YäF¾ýMvÍ ¨rEþÖ”%<‚¢Næ²Øðòš¡?ºË~è÷²*ô¹ð7¾füÜþN~2id=ѵ3Ä!ß1ù"ñ½DTìSü9 #t×É1†n [öSJ_eìÕeC¾¡„^½Ð“ßñ‚²%uFôý·p?ªyNâP¢±=1áS=§+ 8á'чӚO2ÔÝb*ÖIO5®³lµQ87‚g/‚G*fÒ8çìÔ©ÁñÌ÷ì&>ÂI±šPOöæjÑv_;Ï8нðT¬ÞÅ$г¥pLñb…’ /.·ìƒZ×~¨Ömi:ò½çqúvxY9-Õx7öïÌúþ„Œz\ëb©²¤¨€æŒ·ÎµâÍäùw3SóÈd`Âõº†W> [´A;*Òl˜7"çV-d¿@kÃ]ó%²ݳ0Üí|-½Hø¶¿Ý”Ñ=2¨D ßîÞC{Ò!…ÄŸçž÷VÔ‘²£äÓõ èØã‰¶þ’@ è ûHHäͱòŠz(ÁÀ‹/0e׉?"hG?T¿~ZÚ£ª™%¹UÌ}˜cbhM™åüC¶ÖÏ"†¸ ÚÚ+¨ò…S­ F–?—CPðì1®y§ÐÑ}ø\2J:Ü=ÖØ)€ŸŠxM¶¹d6±ž}YoõM”°Æy åÏíú2ï"ëVÌÍegŸ{ö´Ž ú„Å™‚qA3ý9&F®iïiNts×ã_DÐñ(£çò2ú7Œc*>c ô¯E©M6m×Z®ƒ*÷ ô,™ÙárP§,ÀS°öp³y ‚d$Å×%%† Ù6hýFn¿%¾€  Ãõô¤©WXÓ½ÿ©3R9N à!™àÍ,QtµªûÄTó&K‘P €a|a;å £¹¥7 ½e?:<¹(*ü|Ðýòèì^ŒFÁ{H¡©‡m`æy1”Ìúkdfÿ >p²çyÑê¶öÏ>ÕñJÆåõíô@ BzßýxîsÐ(Ê¢}”ø‰8?‘\pêHˆÔôÍ™ʲfËÐã¬Z•ð`O’†k]ÖaÛNÄR~IüňTùj\ǃ ·‚å|üÛ–’Já$~4ñŠi`c¢Mÿ:W±³‰ZR„gqŠéPVi#’fÃæ!ÄuˆBç~µ¬MÁ‘ÝYÆÈk´÷1*Ö‹«É·‚í?ò<_ù9±·D$!‚ƒ= —¾zŽÑä&'«¹#-`Þ$qnP!SößÂhÀÁCx£ØªJ$0´ÌŠ[×Ìvw.mMz¹xb%ÀÍЊŽ#ª6K§åQ5ˆÅ@¢ÚOâEôCëh¤?ÞIÏÄOZM¨Þ–£O ?ã>þ&¼Ã+úGe5ûZæi°hÞXÚ#d7¯ß] Ü®21¾~ÐB6øÎ¶Mw¡–ÿJÐþ®?kmï’§¯¡#7Âe<|¾6ÜM<—ÅËÈl£¶}eF§67䎸à£c{Äææ¯…‡\ûü§¸¥iøå1-¨pZ#žM3T›/Ú/u¼nEBÄ[ ˆ=LpYÙD¬yÎxñ<ÛÀB9Çü½4*Ð(tÏÅRÔ–ô¹<ãÊLå<5fBxÉRÔï2*Îÿ{ŠÍéɈ´ÏÙ{•$áκ{~1P(ø§[¾~Õãe#áxÔþÜ^¶2íâøŸØò`&9èymU³øÞ‰'úýDZªç'£ßÙŽHÐÔßÒàÊ}úbLìfYäqìŸ[gOOÃ}là­WLJtG ¥2¬Ç_ŸMÊ¿ú8Z}ÖiM(Úö0ÙOÂÒ¿9¥ìx£ëAÏé ÆÊàŽkíÑOÄ\#ÕÆÎ*m.¡Œ š3 &J¶=¾uƒ© ÝikÒ#^°EòM´QÅ踟4¡ÐîŽ'ƒWR·ëCÉC´# rÄchxqœY¦Af6T†©¥‚ÎðKjá´û³fÆ$cÇ ÔwYÛc êRL9!c!†,­/B–»Ë‡j‡_ˆÒ &xVuQמÑÈ®žÝàS5e„uiô×dflÁc/ §€“ó³$)V쨡æN0ž8GD‹ôßÚøuYTjZ:+Ô6¨ŸCµ< }HfÙŒÀ’zÀú‹öb)¦šŒŸÂÑØëÛåú–£½}mÈ|ie¯ÈöÌÃú\2‡m²2ÏHf›áwÏ'uZ§žËæ9(/€Œ’BmY¯6­Õ^<}žfæ~ղťEt:ÁaÏÒ$“ÿ Ú/Ws£‚ûÒ.«hOÃNêCLÄ7?*Ò‡ß÷¡ahÓd,£ÊÑé?Oá5£¾Lˆ 6u.r¶BκÆóYCE?°Aؾ·ìxR'bÛS'³Û„Ñ0 óñqÁÓ‘µŽvßаV✥áøüÐÆZ›H3°uÈweqö¨º=íd!èÚ!×;bsz jÂ烥áĘ^3;0k -¤`ÂCY§¿ÍñÐÙaŒ÷$oX ´¡«ñ<‘@3ü£Ø¹³h¹‡ÛÛ¼:Óœ%¶Í)AíT1nŠŸwøgXø¹)ã[’xÎÌ+¼¢Œº"*ú)å¨úì˜DN’‘[»ÎgBA9]2݉a(ãÃz´ù,Êé™åøç›ì»áìâ퀻uÈ&¦|rÝú ƒ^×)MŸ[ý;((Žú8IæfñÓά»¿·“~Ï…–ˆû„ï¬ãsîòí³ø7£›!©8ãjÄúA<_duh'Æ}™Ÿ+Ü##j´Ô”bÛŽÃn¯kÍoÉl,&xÍ52œ¤çÄIŽå‘²/"9ÁjåˆgrœyÊ?º¯vž D®£éï7Õª¬Šð¢4Ò„7ô Ë’^§`šŽhï#%n%€n¢Dg¼< Ì h&4 &Ïm0Ñ?(¥)UPkH MG‡dÿÐN ýT=ÞŒM¨Ñ/Û˜¦ÒñÍÙ¹t70÷ƒ2d OwÉšÇuÉ¥-ѧA× úÈ[™œÑŸn–-è(„)"Å4$ï$³€Èo‡ì½oè°h9IÁ?Eæ?j S°?ÎÀ‡Ê< 蔎 ™ƒª.ƒ?ÑH¤Ójâ}F?ÍëNMõ“ã"_M´uÔç.Zªô6µ™Šð÷'Z1§¼57í-ŠšhÔªƒœ³ÿ]‡wµ9ó@U7VøiȈèå­{{<Þ| Ï™xíðAPâÜ6ßìB%t»3F*(5(ño

3'¢°T±ö¹ì0D6÷°b4ƒº÷@ï'THt;G¯õ»i*ñÝ”N?åôýaÏí嘿û)Ÿ&>?—¿ú¾ZÀ¨ÉÙ\Eú|ÒwKY Ï{Wq?ëynÈT¡þÿŸþÃjî‡ÏÿÖ¿ûo¯à–1ZµšOs7Æßþ—Û"ŒµÁå.:ý í”çsǹ­è•RÞ«z|^ƒ—àf|è}„rëGº{:Ý|·õÌ_"Néî.Ÿ ¸o£î]ôÍ•¬ôzh·èÖÞibÿ\©Mh{@Ö¬êæ¶ìvšžn¯_ÿ½mï¥lüöú¹©ƒÏaJxÜ{ o6 \Ѿå[¦+úé¹|åöç׊[í^vNøàz0E:»Þ¶˜oürÚÚë]èÛä©ó¥/'.=¶±ÞŠQ×TÞ=RèöÎÜ ’­³÷[æÏ:¿z¼‰™ÚÈW‹3{ùé[ÂÏÍ¡ñÖ_úæÔªòˆïôÎÅö›x>ïìm×s|ÿHËs =Y·Å‹*gâÍå ßÚXòÕ´¿(ý²XqÜhô™ì(ÿzߩԽf==” ‰Ú›ÕðL¶Ð6íCÞïʯµá­|£6”îÇ.ÚP[µUýôž…sW¢‹¹o¤¿^}öûÁýL­¾.a·³`ó&ës=l1ÿz-‰ò¥yC¾Åãyåy£]€ñzœ}Ù&g®ˆ_³œ¼ì|­Iínvé랥Þv±Þ™È|çW»žQwsù± y¡ŸðþQtxŸÄÛ®›ŸáîW¼ßàW´c$±¹@^, xÍ×Y£Ÿw¶W]Р²L׉mÔcîæ›o×Ã}ûà"ó.Ÿôp£}Ðͺ%`b?³ÅkëõØðp6¦ gdÞM„Š+©Áÿ*Ûý`ëÜY¹Ì Þ¤œ÷×îOnœï8¯á+«‹¾>¹ä'‰w`·Èï-—øµ5‡kr–fÜ]gÆYÿøÃ§Óqþ»õ¯SB&ÍŒ¤{´Éܬ–ò<ÁÌȈÈÞ5ˆ´b=z‹äг •½cXK˜Q édºõJ §ÙaÀ¨LK?·t7£º2¸Y*qìúá…n¡„;‹ŸJ)}†‘ÌÎHTïÙñ?þ¿¼Gï­Ï§˜³+AÑçY6l82 ¢ êö”7‡âcg3.Ú" †µ)¸ˆbX`‰síö’ñ)Èî±Õ>tRçŸÀXó1 dpC®¬ž¡¸bqÇ)„ñ;nææÑg§ZÂà(™aæýÔç–^Œ^diÃOÓŒ¹·•¯®´IféVšû\Y8M‡!ì[­µ·t+ã{‹1ûÓÇJG@ˆ<ÔçÏíSôH% ó|:Ôéyª§9 ,ŘFdçž‘#šðtÄ °c.ÎÆ Ðáf0k©Þøù‡Rˆ9zöaf-Jª´§Ãà?Σ¦;Ç>ñPœ¦ê˜K-qŠ!·Ö¼³CTHžÁ™š. 3RDì‰ ŠçȰ†/›h!ŒnÀb‘ª"B˜ÅaÀL[ö%†üž4üžOBÈJp–zÊ€gC„E4`)×Tê” :LœNTêô¢SF!@:mVϰ‚FGu: P™S¡eƨžqì"ûS)u2O™=ÈÌPŠ"2MÃŒÚÍç¹W¢:Ê´g/‘P|u‹Iщ4=Z¶å…%3€P'‰@F­”¦ã€L-Þ ^‘LT[àòÄRõs¥?–º{?cè3,‰YºŒÙbè=yw”ÄÅ`I99X\ ¸ƒ2"²!:˜ 3ÇŸ €^a21»LÃ6àkÀ$#ÌxÈ e3¼šÁÂÈžŸ²xùHMìiIDO4ª›¡Ë":clr™rôiåË& ëêŠì‹Í/úâµ -¢? öÅäœ\Ò–2xYxb2ŒÓÌÍÊÉð N¤•ÃS¦ÌkskaS¡zï^R©YH3+ÆjL|*Þ>‹,FËœ2~ÒËé8±”¿>p2R™ Jÿô9Üóã¡þö;ÿþûˆ˜<†‹"BúüÒŸžð\¼™¥$Ð|`–3…hÑ[ËŒTêŸüGÿ”æÓÓáðü<âÇ\#(ž‰Îo˜®X˜¯U‚¼uf½*¿©ÒÜ)F×E‰Ø) ¹ƒldÁð,{¼Iª¸ýK~}¬ò(>»¯ÝÕú¿TÿÂWÁmxW¦hÿµÊcÞýÞž_ÏL|}Hù(ÜÆ¾¼þÑð|¯;yímý¹>jSbu…aÝýЇY‡ë3ݾ£›o¬'îÏÎܾáÜ|ÏÄ]”e^{®åG7¸2ž{ï)åæn¼’t¹qZ}tÞýÇ)/=’¯¯çWtåý)pUéõgýzϳ[_z·dTä'`¿(õë»!¡Wýåõ—×_^ÿ ^t>úÌÌÌŸÓvG.B+{P¾9V½WU?à½Ã_^æ¯[Gœ‡ÇHí4ÿ›ÿõ_)E7¯u +/%3ªt+Ó™VÌ'†a!){D^Ü‹“t·”Ü `ô®Þ%ˆHš»ÕZ¢3PD©^Yœ™Ù]ttµ´ìqL›ŠULÿø#ˆz K´Ho½Eƒµ²UËCùá¿ý¯=3#²…Ú\¬dôY³"zd†Œ ”y&6ä òº»±`èÃ#-_ƒs- *íl×nFY:DÔiQü# „•«Ä{b‘Ï2ÑGÍ»†èËSi€¥W𠆌äZŸ™Ê.ų?Ï}Žl‡‰&ï½75+ÈD*3bš¦Þç¹Í£éÂ(SéV”Èâl/­T#Ðc.æÃ÷²·yšj ©f4gaagë£?ÀËÜúéÔ2D‡Þˆè30ÕJ 3_ŽÇH´6š=²82‘}Á¯]5G³GÇCj¥+ÅkA?õHƒ9îÕ«N½;‰Ãa:¾D& šd…ï>~è=_Ž­A&Ù™qlh© QÙ˜a–4¢Q]Œ«Š ¹ ƒY%„ð" Ôb‰ž\ü]‰„zи ]EíÄYpêPÕ;Cðà¨xN!˜«)»l˜áþ”J *èB¤` sL¦Hû‚Ùàõ¸¡ HÕ•(‡Üôc¨:î-5g'YÍ2åС¸‘sÀ¨j42„â-2ÇŒÌ"FÙ}:Hjª4·&ö”:iôéØ8ÒÃC‘OI(’=e’ÀrreÒ,ùf ÀD˜¡;üÌÀµxŸV+…F‹¡.”K%þècÞ%D€zX>Ò6ŽÌ#E—«ñœƒÓ¥sCãjõ! xÌ9¬ˆ‘ 8Ìk\›3†ŸÈbL$‘mš ²ê¥TЙ„•RžI¯‡ïÜ>ôY‰ô© %†UÖé9Òøôì®—ßýsZ*”2%ÒL–1¨%ïDRèBt##×%—?»ÖKo{¢€è\|¹B`°²$íà „•âþÚ9“Y!)yD# óÒe­Eâ“3Ó_Ž`kO¥¸hO¥þU©ß=y2N)„æ¡8žžÛÜÁ"¥|J1#{Kýö{+% Äó«žäÜ›ÑÊ4æ3IJDïѺ枽#òŸüÇÿ‰›—C}úøá»¿þ>31ìßy¶HÕ?˜¨ÊÌò/¡Ó_^yý¹Nð¿Ü‚?ÍÃ܆ò¸ ã‹äˆ÷Déaóöh¹Ïµ¸î¸·e•. mI8_t¹¯$ùvÜ€7×vÝÔw}éwïwéŸԿ^£B®Þó¦Ìó•šgÛÎÍ,ظ\ýŽ(Þ•ï~ƒ«¶„ÛN°WÛ¨Wæ¥Wr·Íà¼s÷ %¯¾Ô÷Õ;ý–·V {e ·$¢×®gŸA£›k;·êBÚ­i¿–êæË¯ñ~ö®èŽu›ÿæúñÚ]{Çr©€¸ïÏÐf ¿ifõêx{õŠD½³Xo¼å# ·¡ûoÞÝöOÝ¿u!6·öç­Ò¸sYºÆÆoŠõqÓô¾·¿­%×EgÊòç·“™û6Ý ¯‹”öÊóoÛ·ÿóu.Üvß¼ÿªÿ1ÍöY_Weð¦øã•jÝíý¤mÀJ;¥%›wî°º†Öðµq=þ³dÞ{ØkÇòíËðg·1 v\³õîßL¾~þì·nz/p±‘_ ´¶Mð=k7Ä ˜ìýNÙZý+µà«8ÆìvðlKiþçÿçÿ§Ï  ;Ëa*Å“”dîÕ0="‚„O•ÑK­$ç6+G-°±f‘J£Ñ()#Ç`³ñŸE(NpÉ‹”ÙÙÜžŒ9ü9çÞ¸RùÃKdhªÅ©œJ#*ȧª|yù—ÿÓi>RéHÌ/Çb%#£¿ˆŠHF•îW!Ì(±ØŸD,Ò˜!m÷Ï `¹Ø¢¦v$”p_~2rU4mÇ|’A4À#¶LŽ4´3\LG‡¯f¹„¦'x*Ï™8Æ‹2‡ñ€[-^2`Åb²’µkn½)ØÓác)¥µ!½Ljóó‡i=zk­7L¥–C¢‰Îâf 2Â'3#Ž4³Z xùéØZÕ£—CfDö€O^>†’Dq;ͧPJ %ÅVЊ€Mˆ†ÊwÐ åzsr‰JÌÌŒ}î€=-JñÞ”Ín†Ì™°âåÇrš{ÖÝdµ–ÈÊVq`í­©§›·¢áµ0Ð+F°€bIÀQŒ&hBà«T*H“™ØÍM f±'žNE|,‚Â1–5vøÛ¦#š:Pœc˜Í©™Ƀ/’F!JD<áÆ`@±Ì\šO´c.zô*€¯¨8#…‰n´OÑ35LædLÈ’T…”áDÄheÑœéF_ˆi°ÄÁÌ@ˆJÍ=I<×Ò{*•D)nЬ02BPOå@ê’“’rÐrÄ©DPÚ–3ó2þ›dÔÐî'ªjz Š\‹÷wÞ|BŒ°„¨‹ë†aIŒEÖí²óeÂbåÉ›y!¥(†´K ¤¼@2–I=Vr/0,,¡KOÏøÅD;Â+¼"´&c† ŒþbV<`ô2·2•±,«‘Íd‰†'ãdNEÊrHØyìé ÷ãQYÍd†Lö£üiªO_~÷3Ò#©e8'<AÙ–ýùÀ|ŒPÊŠ5`"ÈŽñBë…k3A…U„ Nc… PɺH!«cšl'*¬*½+J9öèsH6}p„E8à ªò¯Jæï?M^ü{¢@’?0²ÀòcøÔ?÷ 'NìÉß|d±ž@Ÿ&Ì$™`DHŠÈTªÏ-ZÏ9þÉøOé^j™žõP?üõov`'ÜÇIêa¤Ž›øÎ™éáA㤠×PÀKÇò–LyMÙ꺩Oß^á&<Þ· ~]uºþ Üâ=õ®ã‹ÞÈy³\ý•£á+¤š{œˆ6i]—vrK2]—¸ííÕC ¼Öjò÷â‰Ý盿¿FÝ n¶˜¿Ò}þ­„Â7?L€o>üþ¹¿Ó\Wï>¾ÞŽó»Gõž#ßùP'Ýuâ¯Sã*bÌÞyíý7ÿ¼³ð¸à^€z´Œ=^ˆþd¡óûëÕõà ë¥C¯.*½ÒFÞŸ÷/ãÜ(vÇn:Ó_Vå㘰û^é±xS°øâi~oc~s›ÆxÌýWò›ÕüPYÐ2‰b‡vôʤÖýˆ×© |]f¾VÉïítµ\¾.Ó_F›o··Vm‡ßaá ¯…Ÿû¨>¾M›/'="ápÞ¿ªþÈ3ž\[¥r‹Oº‹ôöõÜ=ª­§÷ª¾*êîåtÎøÜÞæKǾì´ÃßÚÑÿÏïx¯J_V ;NÎg#hO³ç{Dm¾²RóÁßä×\÷Þí~Ô¶8fCpâú_wB!ï>h 9ot÷;EQw’äæ‚öæÁuÒƒ—·Û鼯:Þ¤„øð†]šf·˜}èll¡ó x°üJ‘vo»\ÊEDçmïv­ÚøÐßwœê>”á¾ÉõœYý¸¤n·ƒ`{Ï7ô+nGëp£W`™›ŒÏ6¨Ù$¯v‡+^=]dÕm3ÚÝ;\ àîÎaUÿ3S¯†È›µ{ó3ë`¹Ç] Ÿ»$G\¼eÎwáüÛëN»m&=ï3â¼v9ZkãÕÓ£dé½zþÂÊWç$¾O¿¿>èŠ\´Ôoëõeóòµß"Ìm·hìð²ø¨zàÊ„cSãðð tž?nøßî€çLèòÅ ]èü‰&oÂÜÿåü—í4g V§ÃÓÅÌK*Í\ŠZ§y>‘Vj wî¥÷J3Fëч7337J2 ÷N·âî^Ù32Ü-2ØÓ 7«¦Ž,•< fÖÑY ÛÜÛ± Î:”Ù{(äµÔS÷¹Åÿòÿm½zOŸz?1½MvÈè4{Ït¯ÙÂlQä½ 9p€ªm9jbÀ:†Xo cTòŽüèKÙç`õtH _{ˆû.°ò2À;À!” >Ô4@B4ÀávYJ¿ÐQ`.ÄŒhÈúâDú¶Áj)©.FôÌð>”bŸ~xÁGMG…›3£a޳èùùs³©û$3N)Íœplé%†(}næþô—lø· 8<L­”¤ÇT‹±F q*õÃqþ!c­˜#æE ÍXÊË*]bS/$ ™±Œü®Ä‰ Ü¬õ® .4ž<ž^²£V›êÄáåË4E~øðt<Í‘Ùz/nmƧŸŽ'/“ÕòTÛ|Š^XI%eÊ’…d3 4ÿl*Ý|e%”A•L—yöÆ‹ƒY"™€F (tDÀÀbèRd4g2;a ¤è¦bÉÞ§lŸ~R#½˜uõ„ÁV9Ò…”˪…8Ÿ­–DŸC«õ’æ´‚á2¡@r198oKf`,^SE°HÑEs‘ÑÃ&÷È’mŽ ²´;Ð>ÖÞ2:ÊÁŒ%Ãk:OD$~cö›g?LÑÄÔówìãÁì0241]µÚ÷‹×#“n¥T™éø?~Âw8𠣉Þ;ÀˆŒ¹©G´½ÿÿÁ(ršêÓw~óÿjn-zø7ZšBF^ó§âµïŽpgq‹gÜ”z\Ÿ÷^Áá¾&h½ÚK™ä9ô×>;eÁQow>^|P{£·$×;~øÅ=‹Ø±óy[¶÷¶º 6oþm(ø¦"¹-âÙõCzý jÕ×§{M»ä뜢{TÑCIn7ѲKÑ9‘Ýgö@ Ô#qðJ'~Ud?Èe«Mï”¶ÏBâ&ƒrñ¸ùœ7 ·×öNYs”Èlsìd´òÍ•ðFÉóëõ¾pÅíåXxý*¯¥óþ¤¸@˜v=þHù…°}ý/n?ÆúOá/¯?õÿøèóßWBó>¤þa]G·¿êÌþN©ËÛÛù•eëp•ëë]¡Ï^ÛÖnà]ïÆ­cðUà Ù+?Ë_lzþåõ‹o“çS7…S²Íÿîïÿù÷?Í/'õLÂÍÊTmª ¼z±BðR§-¥aÆÞ»‘LYŽŠÐé^6CR›c Msw_L­irš­`›QL§~PsSCZ4w A™íØ ¸™·žè½ô1ñ2?!§—ù/•=ú<çÖ^,Tí hBNN¨÷Ììm6OA9tÄÁíÙR É0Ħ;i‘ò H”ºhdK¿VÕ—²îKùððµ²píK]À#@hB$Œ¨‡µ²8A $ÛÒ!&"qøˆ2e¢ÀÀõ„N‘ ¡µ™†§ÃDqêÞsýH£(77cë­L„éØNþÔé(Å•ŽÁôñ§$À(ž¿û¤Ÿ"ÕŽöôÝäšÚT«2Ië‘=zk0B8”ùÓ§{d)V';ÍŸéJ(Zœ 21$ÇR °vr²eÈž§Bœ²¡H6Â2µ˜º$7zD˜™§|‚[•xz € ²ÚÓót8ˆbÖl­Gàp(­ÅKβ(‘©¨Nè@‘%¬Ðf3Q@LVÊl™5)-î½)›ØÂ]4 –'YÅá‰jlPKÙâè{ÈŽÌaE– â"Æ–l!@Å­P]ÊEÅ£S&ѶÞpè ôáÞšLS¥E¨ºÔ†·6â»ê¤½Ýl”[TÉ® ˜¡T"S“yWB fV‘JΙ.Ò̪{gLÎÌ42 ÙRÏq ‹¦oK KújÅ÷SK|– —rs•‚pø„Ã2$À `!Ï §hËEd/¶ÌPúj¸}ˆAmZôË‹F³KÏÁÙ{ €†ë†VoÛ1¤‡†ý†/Þ¿¥ ŸÀ JŒ¯6V­U}²#Ço l‘C†>c²û…\~ /b@w²ò¹Òž JK37aXQ Ôã”k-VL †‚@öx9õœÝcNp1ÞpO´Ž”ý3²Ã "‡ÿöò¥:0˜O Ul5ZXº¹}ižÈ2 ,0¢8B-q*håØ8•b~ˆ!š)ͧ¤I©:¹üørŠÖÁ ©GªuÒëá©ê‡ï>"ˆÎêEÍ Ó¥âÔùüA0OÙë¡ ½çôñù¥÷0ËjýØÕÌó”˜*ÿú7¹VÚôÜ=2"ZÄ<+òßùwÿ½ÕŸ¾ûð›ü×9ZWxQvÏ¡ðŸ‚ÒpgA¨¯©ÿÄNE?ã‚ÿ4ê—ßq~æÙÍ+üGÂýþ#?×Sp?SÉâ·Ÿ2õøðéñE õæ ¥_!÷íìkøk>V¿ÊvYŒvŵ–ô•À%íò äôZ½ô¦ÊîÝJ³´‹< v™ —´¯v®e‰ÍÇYææ^Ê¡ú¡xõÈÌÔt˜  §zhÑ{„ûD²µyÔÜF§qiL.E4H½«{ñQ6:B—BZtDTz/ÅŒT-Š8O­å‡‡ú$E¶N°|š¦òá Ÿ^Ú©ÍÿòòŽìêÙ8‡¢[D‰a=lîn^ „²N•JFÐ-•èr[¤y ÆQU L_ÍH·OÒ£\«õî:¨Í±øÍ\†}ÔP/ÊÚÐÎ Äø³cá¶­\jr§Ð¨ŸÅÂ7‡Æ´\œN§g˜-Ò¿9œV˳€—ùÅaO‘ùçzj9ôy¿1Ÿæ§Ã¥¦²øä^`‰€ ™µzyj§8”çÓOŸž¦"3 î8<Õh٦Ȝ~<ÍŸ§ŠúüôñÔ^`i²iz:Ž^ åü2[I®-©#{‘¹ø" á„f€Aˆ:¡[ïP»G1±ç9hŠYŸž'ÂæÓ hš*ÉynVês!§C™ç.áóO§N§H?òÎøð}i§9ò(B',b0…«ˆ‘(@£ 0¥Á]ì  ™ ˜Ìž|›¦¨P'dRiœ„N±ÀªJ7 §Åì6Žpdʳ:Z¨ 3CBHh" 20÷†c‡‘O–£~œŠÔÁ•¤Mnnž!AÅ Vz†W£›z°‹@G:é«wd¨nF¶&ºYf*i两. éÆPÌ‘p—Áæ¶èì$0‡lÝôÔH’D!†ùôp3ÖQ¥¨~¸JI8u   ½€Å"Ö›#nkÎXïÎY´uõtkr.ùEÔ†P&À¡¾4÷Œ+Èd[ƒ–c‚M€ÐNðwÄ÷W´€ìhr€xB­ÞÝn°4;Ž®>æxŠÀd­†z" ÜÝ?€ª™¤Áг”h‘щ’øw¾¶Ì=Ãà/¢ Øåðên Ôæ¼YÎÊÓeÍ)ºì¿qâº}ù£Ú(;‘H22•anÒZA¶IZjѳhPYŸsÀë Öဴõ/´Ÿñ—ãmúC+"܈̋’ÃnÔÁ¯P[ʇë(eáü°Â¸ÂFÖ2äzXàæH3f§þ2†rž!£Y¶“{MÅT¦Þ[MÍäÍZFÖ¹•©¼¸S®wÔò•åƒ\¥~°ZžÊÓtúôÓœs( ûñÓéÇ'¥ú©1>ÔßL‡çãqîáæ[ò—ð7ÕWïb±îù&N€¾È‰d¡äÜÃ@%Zë@"pŠÄ€FóÁñØ>~x*6‘ƒªÏÖôûß¿¨µ¸[=Ô9Nð8To1Ï YR4. CR„:‘ðI ÊL-3¤i–úÌšN ‹]¦ZPŠêãÝLµ"îzþ€S‡÷a‹ÌQÅíYi,ùé ‡BÀ2³TegJ^T&Z°DÔ±˜$LTÇa'Ä”&Àh!Ós-ǹ#h(n̤yD4uÉLaP !T‡œ(†bì5\sê‚Æ¢€ZÐS–h"]1ÿf^Ø¡N!&_ ÜÙC=–î–4Tž ó¡,˜¾‡MH“X G2ÐNË„%$ÒáËÔ¸h¼ÇJ§RKÛD®s|‰í«ðŸÐ‰èPÀ'€Èy6ú®àjàDÓ3JYkä±: K  >/8 Ñ4ö$²€ô5–ZR‰/ðRʇ„MåCÄš•©Ô‰î§O™’ ˆ`*"ÍÍÌÔ#22;s65 P€ŽìÝ4ÆÃ)-‡¡¶ }…ü ÅrÍÃâÚqùúã&+Á ýláà‰ÅÏ|äŸP–‰Ó §ß³|—LÁš•2UÒŠ :„ìÇFŠ®Ã‡Ú›NÇaYìO^¼<‰î¥Àøü¾ï‚2çgO8œµv¹;8M¥>¹¹Rñ騿 YduBͰ""ÒŒ"•RD÷¬µl©ÿŸü/åé»ýïü##{„™/‡è%<:K«jxgFbGmxIM¡y]a]\¢ô³OõEºô†mñpòfØ¢kï~]ÌNT¢ëúG}µ‹Ù;‚š+¡ƒû¥ë|ðP [7?¶Šr 6º©závl,G±PÒWvÅý]ûžbôµÂé­Zef7™×?èžJt“ey]2¾þË›6mΩ·o[ò…;;ÝéWºæ°_A…¸¡|_赓Zˆõô|ûtnÍ+$^óY7ßw+€èçýšƒÝ~¢ko ×Dœ8Ðù;ýçæÆ­Ü®¢åƒ{µ¾ÞÒÄùZŠõ­´®KÅ~¯ŒÔÍpsC{íu7ß§ü1z´î:ö@Áßàþ\u<Ú¡y‘g¨ÝT¿ñ#ûê$×v>éáÚôÞ0@HyýÙ¿ô ¦ï·º þA¿µp×ÌpÿÍöÅÃMÀý¢òØ…êµJo~Uéq¦ûzk½u*úêgý…h|Ñú¢ ­õÞŸêÍ#Ü—¿9¾1:÷ÜZ¾èm¿xÄ/|܇çÓK…ÖNÝno_Àûõ¥·Í©éœõ-~øáÇÏ¿ÿ±½Ìmn½GfZq¯Åkõ©Z1: ”â"%Dï${/Å͇i|Ž™g&Í,‘™™©!î·1(Ëä0Êͬ {bn, õ®A» õ™ú cŸç~ìÊRìPó؃ÐsÍÿùtC-vŠèìáÑ-5y½ÏJs1BÍäfÑâÅ µ "s¤»W÷`|K`Yï¡>£¯hÈEo0ý°UùB"ŠUÚ[¥­Ô‘ó[YYþrQܶz„ö†Rv):È„08¡†¾”;”¤H/v4(”9ç YÌ(p·½ØtøX¬öžŸO?|*OÕ="Nùùó¬òŒÃwÓñÇðŠ,dv’ ͧÔ²NÊVÄé©~@žŽŸ~zúÞ{dZÿ<ÿÀ˜B-?ç' ‘Ià¨Ïgæ pA£ªZ‘LB¥jxpTÜ}!’3U`ÆšDô6ô‡éitœ›¤Cͧ6Ÿ¢µ.qšž•øôÓ‹óZÌðr:– ?æ6Ëf"ã Ó³E 2Õ§2Ÿ:rXû‚G†k<¦0Y#Ƶæ<¥”#‰MAQIC)ôPÙ%sãéÑXk¦  ’] ©8Œ &ˆ-`d¤MR¤$Zš¨SÀH‡z¢CN–O@Ê?gÒXHƒ˜ª+ŒH‰’ƒ’ùì¥ ÓP’@‹‹p ÑPz‡¤›©9ÒÍ*ñDw‘‚A”"e„%•Êj¡!œZ~ž[<8LFQ h]ƒ5nZŒlÕÆÀtGýü^>£M¤Ã€˜DyB©è'ø+Ë(¢¡a„;†U¸ú‚ð"‡­Â²ŠF¬¥XÃc¥ù™…Ô§Eaɾè,^ë#p_KãGn/5|†Û"÷¦¥Ý§ÍPùª#Ç\ž«pòas†ÔÎRžúq.Óæî.5OR-¤t+$©@E¦Ì̲g{16©As?¡½PGcP="ˆXŠúS(r´çæ bÍYæšbt˜” ˜KF†}'D(0ÔªÑF2ÌL@o™9×ÉyjÂbít8ЪG›ja=ÔéûHg‡Ñ§¨Ÿ2B‡ß<ýÕoS¿{¶ñûO™´ß~8!¥ @-x>t$Üh…hž;{˜ÑÌ$7Ù{ï‘¡Þz¶P §épøîÃoÿÿÖˆL2sž¤­§Ó‡GÔ_ãqTo$¾Eìô3Îp¿ÌýºóýúÊ€wÆeäƒ/ȯ7EK_×ðõúé«ïóþòÿ7Î_…ÿŠcáöÖ½"LëUGf>6Æ}]jÿ¢¾„½³‘øåOH_z{ñgß]¸.çþeJíot—Óð/ŸJïërym}“5Df÷öýÏEˆïQËÙo…_yFþš]î¦øYÐŽ*ÿêröû¹”Ü”ëêaàJß#¡‡ÉuÑïÚú†Wå,¾w.ñ]ÿkm›¸c²s7þÚ4ä¯:Éõž™ðæÕϽŠ×îáÞ„Ò,øüƘ´›gþN¶ÆE¿\×]9}ƒëâ·ÿéGµ3¼VüïiW£„\{ýçÖÉ{úõÀÃFƯ¤9ÝôF{°ïßÁ/09¸7;”Oÿ႒案O§k ­;(ÌTIBÖž–0¹‘˜’ ®ì ÓÙ thý H—./«fçK ¾ÞQëèk¬WÐACÄ"/á^Ã>€¡Td_@"gò™("‰2Ñ¡¶\ƒ`mP":$.ÌÀÏih§ˆ¹Kíð-Oi4rLtšÉùéØz&Šc¾´wd¢Ç讟 ©,¥„¬`w<ÿõ{ôýgd ÕÞÁ²RÓÓóÆÅKhK¡ÑÈD.X›³-‡qéMY ;kò`[¥ wd_È62ø °ò•4šZ–Æ -o˜KÚ¯ÔÕ,7­Ü&dFØ †u¸c"B§8‘‡"?DÒJ%*«/n½¥š•h©6„ueÄ‹ØKu:šZÄ'æ'Ø™­tœŽ° ,ÌÔèvÊþ>+¦”™–”ƪa™ƒ\†ùAÌkÕ¿ƒHÄ ( (è(ÅáÁN÷ZªY,-]Q*…ÑzÌyLVáû:Õß<Á«{}*åå4Ç4ñCf)Ó‡bÏOŸŸÚ|ÒS-ÓÔ_ŽæBÏã§#?~„SU¤’eîý©f!˜ÑŒ$k‰¹ELeföÔªþÓøOÿÓÿܪøëß47#{ïA;[dòumèöXÊ/Í¿BjÑnµòã““ôÕÐò¯.З*ôÿgïÏšdI’,Mìf5s¿™Y½àiú¡ÌÒSCxôÿÿà „¦3h¢Â »ª2#îu3UæƒQ3WÛÜýÞ¸¹VZ&Ef¸››©ŠÊz˜ù;r%{÷]7&¦« ¯‡îîÞ·ûð·åo]áf©’©¦É¿½qÿèŸ<¢öž7Û×ïiãýf¼ê‘ˆGÆÔ·)Y´t¾êVºw…×…Æ[ÿíSQÂ׆¬.~çÄ~nü®/þJøð{¿ßçIý…@ç·oØâº×>ðEçz2¹­ÈÞèÉz€¸{ò½-d9 é›êö„«p·næ.Û ÷ªjî ¨M óvŒm?Ó̰­má‰ÿÕ78ã5ÿªœäHmÞ•œ?¦íß ìÓ’GÙ¿ Ŭ•]Ô¼Ìõ¤ó 4à)Èw]»ƒû²ë:§ØözÎMh\{±ÖøÁeZ¥N‚³6 Ï{«„Þºbð䆸çµpãbǸNZ¼d¥œH CÅ?­©ÜÐø¯€oì^Á4wF›:I¾Ü›kófc´Ù"öÑ#lÍneëGsðЉ\ÿð^}ÆM.S¾æ»Bm‹T.(ëW;Zmtû –õ%kBÛpI9ÒuEŒNG¢;ƒãJÖ}Þö¦Äöië~ÚöÜâD.Bò<ß Öz¼BZx1!\óùpQªÅM|¼£ÕÙüýº3ñ\AvQµ{?@ÁÄ“¯@ÜRÉ.ñ º3;m÷µç]Å¥¹Æë<öFñ)®Ó_.zþò¤óÑõ:=¦y^8®½åîÍ×õPú¿‚«éDƒßa±emJ‰¥;Xù‹Ùm `ûÀ1ëÑÖð6kéjU¾T…ïN¼§ŸB·†îä»ñ'ò›âºn-Ü"€Ä1í-Þ<èÞIÌÑ#p]pÜ®ÚD0Õeå'±ïÝ6äö¿7“Ƨu.¡ß ­Sƒ5ªWøäÖ„Gwö¹a s~÷»ßw±|9ö¥·eÉ¥Yŧ np³ZëTÌè´uj2º›•R2Bв,Ý}Ee†›kõ©Œ‡è%Ëîn„9˜ÒÖ# œòxà2(>°bzÈ–^3 zùÇÃô¼CSDÇ´o½k_ñ¿ý':DZæ¥fF›‰L6wô@N¬çâNPKäX ¬"c¥`›ùºH¬YÀ±Ê—²Wsàóî/õŠ÷Y}G¹ú_Í×Õ)aD,h XQ&¸#c%†›€@™ D.H½V$œ‰"ÃwTŒrîÊÓ§'ƒÍ/‡h½oÑŽ‘°ó‚̰ÌÌÖæžvOSÝyÁq>F.t,-ÀìÇ´©:Yàš ™?ýÝ—Ö»Oá˜:Z¢§"æ>ýE4x‹€PQͽqéZýBÏIK–Èe-°Ð ô#è¯n¢…¯Ëcæš” F˜-‹"BË’ÀRŠ›U%ªSÆÝ´Ÿ*¼ø—χtLÏ¥”òòò¦Opcëj}¦%˜´R÷Ñ-Íuìs23ˆ/xÑ~åë9ÀFcY(¢£5;UDK˜&a0ô U ªƒ0U‡'甀{’ÄJXåˆ!‘ˆàÈ`B¥Èd=©Ón9’"[À  Ó$)† ¨‡]@„hb¡ö Bçš­Z¬xQï–Ø{N¼‰qÇ*$¤ðwÕ¢+3EÖzo9Œ`D á8w©t'4 9 @KRÉ<1/bøk{‚¡Ò°ûÊX 6”àkäÌ€,§êaÚƒ†è0¢/§Üy!;¢ŸÂo9ÀF+Ó_Jx9ñ$¨“ùÇÙÄð $z[›…D4¡Ž×ÃaéŒì Ö‹ññ PÀ÷k¹Àðñ­2­‡`†È‚~@ñô+ó§]hߟ˜;úylTl$èÓ ¸ë„©8ZDæ1ÕŸ3Ronˆ¡È 0LϤ™¤Þ ‚à\ ™b uíKõˆìK†üÒVÏ’Á=K:r4jŸÖª‹¹Ù´óŽFTZ‘Ø{ÒÒ,n pÑ@ ¯-êäÏ>ùnŸabQ™Ì”KÞ[~zbvX–çépluWÔ=ZúÓþH7Z̽“´¹ñØè´buWvMRFôÌl±ô–=³õìÀkù×ÿíWw»§ßühdq7·WŒ÷é"J~<û[z=`Ü죮Ç|n˜ _C¸Øª\Ï^m߸9S¬æ†Û á…@zb‰òâ8¶u#û©ýêLô ÷,‰žT¡·Ää+Ý[ÌM}kQðv¹ÃbOMúJÄ|•?åËoäŠ]s÷¦¾6Ïè®Ú¸ùíÝ“üujÝ#ŽÐ£ {õX»éÜŒ“»ç›³|yíÔÉ‹¾}4·xØ-^éZ²?KZÚ2µ=æŸ ß¸Áa} ŽÂG™ÊÌeü‹Î_ÝùS5Çì´Wš­®ÅÉ‘xMH%ÝHåÛù7>+ÿ„+þ$¢KÒÕˆCCÙdh^¥þoµoé{çGÔ¢ûÞ¹ßVpëŒûfßGø\ÅOyk½ûûŸP>¾_ù¾áÈó–ç] ;šÜ·Tü’Aÿ{y>ïU¼“Œ¡?\_ûªŠ9]ÿÙU”æâÆîâÏžàº?ÿê=ÍÛóÑ;~M_Óô¸^öÂS_½OyˆåÑûÖÍÛ%ó÷7Xoûç/(°å¦à²m¾µ@îûÞ—öïÒ™Þ=ö÷ŒÌ^‹OÕ á–€L=–)¹Øz“è¥DRJË¥àn¤Eon>Ζ¶:EÈ(ƒŒ,¶ÞSè`O´Ñlfº=O µŸ^2ÂRéè/KG–©@Ñû‚2‘ì­¿ü§ÿèÆ¡ DJy<ÎÙæ ™ê¢€ÈÀb„#Ñ‘žÔ0cõ:Ð!Á ,+Ô›ZSì­®¿Û¸mæÊÄ VÅpgt˜ã5£Vði-ð$¨AÄÈŒ÷Ýk²°û 0É@Ù­|s÷“‡ðÉE€vÊAJ£Ù®–:ygë³Z¯îÏûçCÇ’ÙŽQеÞw»)"[k¥Tƒ‘8._ õÓôãχŸ—Þ§©¨Ûóói°”÷2A]­ÔÚ»dQ‹?‡Díùô›©æŸþ!ü›i‰Ö2)CzX çdiu ,R™ÍsÚ‰»2¢·ðìQ9±‚Ô 4x#¢e*§]Íi¡±N^§RÓ¢£ÖÒZ§ÊÒ’tÛUû´Û5 3 š#—*>ÑZ[²îl7í–yé(¢#3ØÈ@4a(û‚:àAd’!,@rro`rš¤d ¸4!0¹ÜD#CuÑ­gȰç® ™Á‹Š1ºRp0;Ðe ªT—ÍÁ ¨EXJ²~âÈ’Ï9A‰É}±CD,B!I˜d^ø\§9:Á9£õ0@d´$Ñ-‘©4’fâŸZ³%B¢ÁéÇ%„b¶«už[Ë4®¾Çq‰X8Û˜@¤¬(?€{•Šî'×Ù¡Ò' Ðf<}ˆ²„LØ Ã50Aç2¢P#z”}}s­ÅY©í#¢vr¬Í±§ È:ë1ásµî3ÀÚ½ÖåtÀP|f1;\h¯‰&k6ä}±¦Ï[EÙÁwð RƒMkôZ™Ñˆb,ÌÁ)’eFë„¡8"Žê3úQñÂhhF®m˜‚»ØB Àö³VÝ»’i))›¢¡¬ k –93ÒʉZf«jAJäq]{3Ô§!O”Z*m}¸©0 «Fö¥²NÞ[îJI*P~¬“É-§üéh¿žÂ¬“ž˜z§OO¿Ú/=K¯»jn,¬?>ÛÒ3BÕ[ }@èö{ÛOtÏÈ\ šAšçKGföˆ¥+À¿ú7ÿöÓo~õü›_EomYÌÌÌ A²×µNÿ5ˆÊë]¹n‘Ô¿DjÑ %gÙï¸Õù~¼Þ }ÞóGtÆ7D¯‚|ÛÿxÀÆxìU\Å]ÞøÌ_^ðqøÒÇUãG¾ßvÁ¯Ü÷<¾¿ç^å÷ ¥³Ãðñã7Ÿù+7þR ó÷ÔñÛ ~@J¿µL¸?·?®x%Ë}äãŸÎ«|koЕèüáçc«§þÀkívSAÝ“Eôµ+Ò×b¼ÞÄø‘¸ñàÑMÓþÞÿ‡ÓЯ+<øgyß´àÙü*¥ë®ÛÍè;÷ófÉ­îíüõ ]n·z¤Cã‚t뿺éMžÝcº®I,_“Üþõ€_ žóNd3Í\o·dµ_¼oùÔ9Ýõïý“ÚHmÊ~ù`>slˆ;ðï?ߤ¯¾¤ï¹¹É+ùþOð¢XçìÍõ5·û»ßþtœg7s÷Ú˼DöÞcéq²F,Õm*0ÈnÕH’©‘Ï8¬ekfFFå4H Cë/n§¤²ìÕ JpÂFZ¤’df`n¶+$¦_íÑ*‰ø]ÏùT="Ž-æ„ÙÒ:J±RãÐ㇬µ¼üÇÿ¨ˆp;„Ý\Œý¸´YM”à1œïô,f ´¬ÙÈ’2ÊÒËërp.ª‚ k%rD¾J]ƒœ²’J´æ(@ôS­"2WGP+ #$Ðá¶(Qž×¨@qÄ‚8ÙÿŽ íô!í$—‘1 ”íª:Zt£OõIÊ—ãËpoxšö ¶œ³Ó´óå¸(ùü›Of¥weÊl*½u¯™ÉØMu·¯æöyîö¼{ÖÓËï~¹IŽÄ¤/¿‘Ë-ÛðT)A”bFäÊa÷& ˺C”Ý2A¢wd€„Mkšöˆ¾ë_ ˆ„h­wöLÁ j)™BftÍóÒ;ŠO ¯}îbÿôãtx9†~îèeÂq9î¦}©»%û²ÄþW6•ÚzÈãaN¤&`X:îJ(&¦+ (ÖÁZ7(P`\B(šŒ Û/ÒO³d®ÂÁdš»"P“­I¬5÷ž —¹![Ò7§’ IL!E*ÍhdeR!x@¸¡¬ñvÐÊÈàŒ p(àV!„LeOÝKöîÆB3a*åK´˜[gîh™©Ò¥(f¥˜4 Sád( 42¡€ŒŠd)6Ó=Ø!…–¹·H ÔáEŠ2Bc"PÆ¿údÉØàVÑô\ª}š|^^~w8fôôâË(RyYøôCžZ¤•’‘431N9+Ñ»R$­8"¢¥ŒÌÞ²ÅPÿÿ›ýov?“6 ò:kè·X°¿òVâ¥QñzkFâÝ(Á=ñ‚¸°!}4á…e:ÎØ²~âtƒÔkNÌU'ô8&s rxÅ¡ ³”3‡èõΠ•“òwïó¯°,6§çR+b“0~;¼ë÷rkÜÞï=2Ã6ÉËYaÛº•°Ny§ªB×eÚêȼ”¬…­ úmŒ·y+÷g¼b݃p7ÿãŠÉqº¤×[áfSu©ýŠÚ¦˜­ˆql*@OŸÎ°5êrˆœ|Et"ºß«ØD xÁ™ÚY®Æ¸þçò¡]Gžïš]¤œÄ!Ñ^ëý®½õZ4{¹¦è•\¢7¶!kPA:«ŒÚ0ÇnÁ,w×ÚÍL{#ÐoÄ×àˆž.Ò©;<œ›š§ÑRz âk„´yì›ÿ(­Ä¹Í,r;C\a‚ÎMIM+èî¶i/×Á«bðØ Cg^ñày µÜöÏQ¡Ír3ÆßÛÇ\53y§Ó¾y·W=ý e½œÍùp õ‘ÍÝJõ;¿Úl&xfØÝ ¥ÞþÂ×UgÃü»X÷.?O}-.>ð•~¸ý'.@dÜpÖäÓìZ €ÿ_þ^Zÿæðùe9Ìk*oDˆ´êÓÓžÅÍŒn‚h4zd¨µD$ ÌÈèÊà^¤ÌJ™áC×I¶ƒø?æÈz²RÊ,PZªcî43w‘½eœŽ¢4ËÞòKË`ýͧå·ÿ5~jm°«I¦È€RËÒç%[cD¬ÆÉ‹„DX@ypyÏ`y÷ "úÙ#qmÛL Ê0À~¡kÆëxÛð½!ûúüz‡Fòò™€Õ™s 6($QâkjþòÅmÿ´«™9°ûžŸvÙm7=}~ùÜæœP~øÕ¡Ù »Ý“c×ú¡÷C¢F¤±ÔR2sé­úTêä…‡ö¹°ìê§úé‡ùwŸ—9ŒŠ„›;ÊñïgÏÜÿ°cµd™'ÛdßÁ*Ì †‘hìÕÔ3ófH€b(ªÃ6kûœc rX2˜™×è-züÑ1Õ:Ô²L“þòr$1}*VûÀ1ÉFhÊæ¥õÀ´›œuáüóá „6§ÖT÷Ì",HWÒä 2i“#ú2Â9ÃCÕM*ažG¢­`2ÙFd'l=FpV."aÕxOÌ­ ¡Ú+S¡d1ÄX+Õ3"-B‡UÒ i4çà*eÀ¡Òœ9J*U³®4©ÀÌÍ€6¦œžÅÝJi$2bW¼÷qp·ÀñD&TÌC¦z¦\õIµr> s)Z£ Z€2b†Zm ò´ZjÏ94dÕA*ƒÃ°xLš«+GA)¯C5†«¶@öñ”O²¯ø~LÈQ¯# ã4x…äiauÞ^i6z%†¨¯«Ö(F1 }+ÔÁ•«8Èá ýŠùr‚~…ÍÈÙ: §\VÃ[¸Ã„bàP€hçøâd¼4T߉“a”1æÎ¤ºÐs‹/óá'ä±´¬‚Ñ„© îkùÂkqF¢…q zBîð¢Á7×g–H¸Bt,3J…M§]—€ 8¢Q*î…f€l8Z¸±«£\Œ¤›4=íJÚôÃsþ|œÂ³u3S±——Ùwõ×ÿâ‹O¿zŠñl>írÚ—n‘eªt[Z„!{ºf…–=¥”§*ªìTöÈ¥çÒzï ù¯þí¿>=ýøÏÀŒî“Ñzo2壘 ñú â†r>£œjXO ã3ÀòaŽéõÎíù;è]!嬩=ÜØlöóÌxùPªÊÚVW.¬ÃüçŽâ¶nÓïïüx>| ¸$"L™ý%Bä«\r©˜jãY¹…ü»ã½sæZvPL^éÝ>Ã×T6ç:¡?jÜw«?~at1¿«r¾û·ÔçV·_>ß­óæV©áµ„-Ð|KBc\:‘ï„1®Fú»l«i^™ H×銺‘’.ƒn¼´Ô»W²5ôº ãá¦KÿyCç·RØ9HyþÕÇLÔß*Ü׿$x+ÑW–og€}dãG ^õà{DRßtÄþ†É¶¼òÑÛZÊEë¿éñ‹·²th_™zÉß@½®ó–7å7^º#l¿žu/…à]öÝkÖµËðUøå½x7ðȰ¸^ö¿é å\[ßýx¸ë{'èÛÿ@›•íF(ýÈé­¦ø€Ãý}âø/º½‡ƒõaÀå¢(=ðUx„϶zÏ žÄÁ ÷îo«¸œ !·n*Îòþ)’ñ±íï}Ñ«n|†ùàLýfyïw‹?_pB/æîs w*ÞzŒ_±”¾9ÁðM¤­÷í}2Ûõ’¯ËHÙ×´¡ôím{ó¸õMã•ÛàêEiö÷«x{ÐWNëïFïMøß·@'Ý^»îå"œößãÿñ¿þCëaF¥|ùÝ—\Z´^KÍHwÂYk­ûÉŠ»›„„tÂwp£­”×!R¹âDÁhtÏžf Ñ”9ÌnW?ÖÑÓJÁÒÔOuY:–ÅÝ4G›iSµâd¡¥‹Š——"åÏÇ—Ï¿ÃÒ ¹´ áõPFö%úÑ ^-ý`®-ci0Ÿ,Q¨æn‡\,•Ýà' Çj x ŸÀ\“…qÇ‚`„•‘~¹^fùÑWê}yBt´¥À ™ˆ†ê«I©=VkÍ‚aš  Ïa ›äõÌÅiÉè)È ¬-¨§§i™—” 擽,/ÇùX v;+E/?{ÆTséóq>¤ºWîv¥·ùxìVj1›Û¡€¶<íž>é¶[þáËOÿóHS*sŸS¹{¶ÝS9´/VZ]LkAtd¢Øª½ÂaÄT+–ò2Ï=rš,"% #Ê ù°—ÞVpʨÀ¯*-„P¦•Ì,”©¾´ì³-½Ã,ÏOþéǽ”»]éŽÝ~Šeòò$£Ç2Õ©çÜ{ªƒ\ÅeLȼ>A6jL˜™&38Ø]ê(4tt¢A;SíÞ¨“A;P!AŠŽ Ø‰áGxC²C– Tœ‚§f!3Z5ïMiKFZðÕ7A²˜H©.¥F§‰e5fƒ èÁäB!teO"ˆR I&·§Z"ë—ù õH“ÜñTýóÒer Eo¡:Y5[2¨™ÃÜò™B¥7Œ²’qzG-&e&Ïõ–Iøp†>Åçó4a™Ã'`ª6ª­3Û™”5˜3 @èVa F°#}ÓZ§ è×"l༰„ôZ´|Ší p(OžñjŒ\õ}Œk”b\ثȨKH :Ž  ‚²ƒDƒ%0ƒö“¿HIÃ^Öi…ÅÁÌè#zR¼”jÃF!{ゥ/4-Ë—ÃçÈÞëV1Aƒi‚£’&àHdƒ@ëì— ^7³™†Á8 SdEgK(\ ÒKÂ÷0æ`v€ÑË>û~ØÅ¯ê2šÊXeŠOòh€Ûô\ü ”²Ô¢¹‰¾ó¢ŠCF­”Ó¾,íÓŽ¿zF-2³©Ln9à£àÅÌeÞGoƒvS1óÈè½K¢!D,ǹ/-«ÌÀbÓóîÇþ€¥”Þ.µH%éînv=©ëCÕý}€nOÃÄ €ñ¾9%Zß´i¿ Ï|gò[?æ+rA¾oÀ7æ•o3¡ÞÔÁñ'ÿºµ‹Øòëõ1‘ôná›}wÇߣ'õíýá½?”t©ëú,ß•_/µ×³X}QzïÄw+ÛT|HþkÀ/Q$î6¬Þ¬ :ޏš<âÏh~ø¿Þ <èCߟùý1 ×½–ô5Êñ/Ãçüiкô¶Àâ›þ‚_ÒD¶?µ–âïA•Ö/þ¨-ßãMÒÐ&Qþ¬÷ëTÅû®èwà?ü–&û±¬o§”ü“Ř ~o{æûzí;{~̾þ±'ØÆ¾Oå ¿…ͺ½ŒXÇiô#3éïïaœ½ô•½öp8JšÇÑbî.CûéE-²‡€aÈYŠ™;ˆÝÓnÚï$I™Ãép÷Öû`qg&͵ÖÌ}¸ý0ó¾,ú®öžn(æŠäš¾Ë€¥¼PR.1ü³7,Ý$s3#z"dD¾Œ.ÅKO¨—fʤP,Ö¤9sQ&iiš2E(êȬ.eÝ*KŸÛœ(Ê‘§oÙ z©ýç£ÁY ì€öæÄ(?1‚†þe´Õ/ôð[øû'´8Á!º ^@ M°ÓShó+öd|ûzdYà´}y†áK{1ªwPvqn&Ù<÷Rjq?–ùx4âéiªÓt<,­+{°LŸž~h½‘p3:õTËÒ jýäfýø2Ss(wSÁ‰4G‹%‹A–­Æí`ÌnX)õ à°jD ÝàÏf6E,@Âa´!÷æ=‡÷ïZ-r6O^¥Õ¤ÁÌŠWô–™Øí§%3ÏÏ“»õì­/°Le¦™ãð²XEô¨î¥–y™y£ÈêÚÎ… Y#&p‚ æs²À‚jAö5_˜;ºÉªJƒÁ–@ÓTÈÀQ@€bœ S/O&9fÌ'g: §<•b’T2I‘Ì'GI6…d "TXAÖ5÷a)'Ì,¡—T¡”1 èd…{¥D7¾+•@{ V«$ByhË—è»âûb“ÙÒ{HµÁ!€É >·4ZtEf*r€‹r¸}p_ËË¡¹ÈOEº¹fÉKÂð$©Še§tôD)§ÚšôÓá«Cg/_GÝ#ÛêÊ«XÉZµ 8 ¸#G j ÌašM0AÀ퉶×\¨Q⮊¿Fì*×8õ( 2 ÏPÇ á«SÅHœ]³›Nµú8ÂuLŽd°QDÒ€QîCXY=½³Á ¬2O«f´áfÓ$MÊðbðìmAMÙ•ê­¶˜‹uTxÁñg0P]ààÿŒ ‡b Ôe‡Ù×BŠá^@®•ÃY¾Z"W*—Êjç0Êwè(O'ü‘aDxŒ`)Vª™yñe^ꮎj§C4¸¡Š ™Ñ¼î¦jØÓç¥õ„Ùþ×ûßütˆÏ}ñeWͨòÃSÙw£³³äçÖ\½‰»}jåeMSQ®©9ÂÏôŒ­gëÙS!eš›Oå_ýÛ÷Ã?ÿ›âÞ##ÂÌÖ¿"Š9i›œY}Ï­éI¿ýe€ï¥ÂýÙïåÿÓ x‰ìø~mõK„V>º†?ñôþóÝ?ÿµ°ÿ¯¯?̹ƒZzS›~$½Aúàð8ÏEWá±7"d·¾ŽÛ·1û3Ã×ôêwÇBYù¥+Ëœ¼åï_ï¨hº“ewªZÃØÎÖ-ü#÷¸n:GUÅKŠn;¼H2¼ÔûðŽ(Àkeb|/îã¡siw´µÍ¼¥¥? Ênh-Ú–UðUF'XÄ[éšÜ:¡b½§Õ[¯]þ,‘Þ¹?½^¤ˆó.&äŸK‘W›Lí;D=²Ñ½â¸?Tu7— m´n VWÙÿz½YÜòx´-_ûØ^â–ÖÿáEŒúÊwø|î‹j>Ú8ašÎÖ­ÐxQ÷óZ-öú«+Õ¹bfÛÃ×zËËìvnÞ}.>M¾†; l7·½ˆÛ&>Zs+ ^˜õ¾µ;^o̯àÜ>¼Ím+Øx§ŸŸk‹Î£SNÄW˜ë!þJè×¹ùo·7IÒfnØÂÎA€S¤Î9¼œÀ7W{yû¯÷ºÆåµëNä¦xs[tÈÓB{g¶ÓÉø¯“î~jýíi©þÊÍ®Wnw¯wñZ=|F{(œó…ׇÏ×éöÞÞýwçw<ׯ›hÁíbýfï^¿?³Ótá-þºéüÛñóó\A~ì›qzýj¾`ÚüÙq>Ž‹ûíýGe*³õ$‘™Ù’@)…F«%%¯N²ºÉ 6X½õžîôK@Fm5ˡࡓ£¸@½ )Ê Œ$G^®èÄL"r°9G1+ûI‡EsT"CQL˜Ít‡e罩9¦t¥ÉªzëÉž6[ïý=CHfÂÔ®‚P„œ.¤,‰nV¬ø.8<|—}Žž ›"Û‚ ”É ´!c92ÖÖ Ú°=«ÿgŸwpVHˆ@©pC; µrKŒk6ñÀ í÷€¡w˜¯ñ€Ä orr1e"gȰÞgj9Î΄Áf•é‘ÍŠE­ìw»L,óB îÊÓþ‡Þ{ë½úÔ‚…ŨRÊqyYúò %Âbô¦Þ²-së ¤ý4…Jzµ]ÝÍó|B)7³*AL í¾T  :|øÏFÒÂK¥êþ_.‡ãâG 1MÕÝ—eÉže²©ìyÄ(Á†<—+2FB4(²©ed&è¡ÃQ û¼´X Úù´ --ëΞžw-ºyiÑÓSgß–Ia°¤KÀ“d0w)p×  F¤%:µP@-"F‡È?3`‰JÅ yÑ"µ\ã exG›šPÒc,`©±‹­!ƒ‹z¦U# }hÉ "…TRF˜ÑErèˆì`&ªšUæ1Q™¤Lš# n¦B‡Ñ"çhsæ±ßí"âØ#-*mç^és†ÃÜ4LŠXZp ÿS1|ÀPöT×vZçcÌ Ë@ËÀF‰­ÆÛl$'S‚i x&ÂuŠÅ)É:V(ÿHWb= \€¾þk1d_±Zrˆò‰Éû')‰08׸Ûi·Ä5Ú—ZëQο:… Öƒ[Ù”ck­5;‡Q¹2b™õ€•×µºr° N¯6}^½F9g]‹ùTà•¨ÊÔ²A3ºµ%Ž-—.ÍÊC? )ÀD;®þ½ËËÚnåTB\Ý’1\¸ƒÜe'*à°6+šŸRì"`#úŒlP_k)2`„U°®¶É^Öj*ZP `±Œ"–LÒK)Õ¬ºsãäÑÈ\:– QOS9ôJ7òi· gÛz1ÉóÄú'R=å¿ù±µž‰4óâ=5t™£FF”Z_‘K´eQV7»ú?ý/ÿá6Évì²ÌÝÝIšÙ†¤qý¸à ¾¢>x±qÜn ùÑ=Ì·qÏ}Ôy_Ë ƒ~ïì?7ä àëòyuyÆÞï/Sn‡r}Ö®2ù¸ ùá{‘/²©¥>).÷à¥çƒÆ]=ëV5»+ W'ß­âÊÛôͦWÔþ¶MzUŠúæÉèNïÚPIïœ.2¦ÉÜ(ß Ý]¾F¯|¨Enn…¸©ÄÝ^ÃmàmÍT_Ÿåtïé¼5„? ÿ¹«~®î¸Ô+õöÞ·¼6Þ¦ÞÊß{[þK…Îß@>ÐkÞ⯞ÂÙ-zm•Æ3°ùL'à*ȧá›ã²ô¾3ÓÞ°˜Þ7$ƒ2uÞy•WAY¼~àz¬¿Þ È<êœQ~kjíUiž./î ?DÞeG__ß+tZw¯B"+÷ú,Q¼/IÜEµßþ™nƒ_9x/…®7/çcœ¥“©÷B5î­Oç·ÎGÔý÷F ½‰wßÏ7¶2wΘ×ÓÆU6Æ;ç“Ëv¹\T¿~Óp±_Ü,VzØçyn‡ã/?ùüÓç¾ôqÈ3‚Ò«[)îdõb6Í¥V‘ö"IÅÍ̲Ǹ€yéÑÝK*¤¾ú+Jm1Ê”èÍ2 +²Sá`¶Ì¹sï4fDû¼X5úÊé?½(²ÔRÿæy0âñóÜÛÑ'—É­õ@ë½7+jޱsK¶¾,T¤”ÄjR,"FÛ?—Z}‰)«–=ÍÒ§`Ö§§:/Ër˜¸¨®šÍrÚÙÓóÓápˆ–‘pÁ㔜¹’jÔ`Æ5í] :”H‚¹rEŒ'’øÙAk,!H,تdkÊmö7 2Qv1·£*ë3Ü'_–9Õaåónâj\º)™=%|úôÜ{¯“òç/?-ËqÕ%Í <¶Co™‚Ùq7í»9º!œ¯=»z[™Œ†ìi^Ë䡦·5Â;üŠ•èw˜# Mô‹ƒó—ÒfLµ”}Àl™#2E`Á°‰XåZÀÈ5ùzŒŸˆ5“9ÔëKÎ/ÇhIG˹ÄîùiÂKd$'›JMJlsÌÉ5І÷ÀqÄ“è'À”ZÈ™XŒžLR¹#:˜ƒ‘Òà²ÂS’õhÐ)A^0%39g(%2Vè=¥š€ªnÁoBBI1×Ló9•’M ¸'  ‹•ë©¢I…2¡R¤%'3z@£Ï=úä¥xucDZ$+ž‹«"¥t£¯Sç#’jž4Z¨ÏMÜ4(:…”RfHè»ê/6 ¡ròÈh€ÉVël‡2Çê"[F ìÍÅ)[Ú¯Yÿ£©GÑÉJÊõmÑ`#lÐÐ…Œ×ÐW¸¢gd 3d ¬œ´r¾êþë¡ lbÛsÖÄù¡¿Uàì@c6,‘u>cžQwëȧu*`…QS£ì‘Æê=¼ýÈX´,†.}–E;ž\ ôáŠZÝ­‡—øÈÓ÷úª¼É£j'VÐÿˆ‚Œv‹¾ÎE#fÙsý4Fär†ÛZf!ÁŠ‘EA$”A3÷@qó©z­°R'·ð­AŠ> öy9ÎÝÿÅzšès›öµüðÏÈÌxYZƒ—*K•²ì§êæ¶k)2ãÈæÉH),‡Ë}ë±ôLóZþÍ¿ÿ[šÕÞRÎùþpw33³K“¢mZÕ=¦ê=c³‹‚?~ÖíCÇ®{R#ß?â}øþh¤‹=úÝÙ<©ïÕ ÷îk^_!cÜIçÀÝÖx;eçcöWßÒ$uø¦ë∉·Nßó†ÚþvpåQÏïÜöÓ}¾ª…·¾ë•’~ñxù`¿-"xîo£ÇDùoäeýÓ„ÎËT{k™p©¿nO¯œâÛ°Ï_«6îþP¯ï_ƥﶢý¾ø!Íí¯¯¿¾þ)¿ É­ÙõyððkÿBGÙû Äß÷,¦¢’ÆîöO”úZ^ð{>ÈnNÖwÜ«*þÁ«Ùÿ€WÚš÷½¹ý˜ó©Ðqèþ_¢w¤2¡LæÅDH¯Åkñꥺ{±õNã)Ó_Ì\ÊÁCÀð­$Rš[·Èýng£—f”Z3:3|èÙL¦ˆbD3}¸nνKýËbÅÊó®/Ý!N™½Çrh¥8[D;á¡ Rý‡TŒP³--{K,Ñ·@Ff*E¹Î…pˆ2Éi½õ(+Ó.8K0÷yéÜK)(6µÖJñ˜;-݇Å*)f‡5”º†Ýrs²ðºfôKíR×â$8݃Ó2ü{ Ô57v|8‡UOø Sœ@#7ÙGj'ö#l‚yw4L“?=ï3ñ%g3ÐrªE!^æCÙ—ÊRkI(²õNVLÙÐzôf Ûä»–s6 a†åДØÕ‰1ýKyª;›"»e‘™egV-£VFšÉÒŒ 1,PòÄé-[ôèAšçeyiþL‡½³ LÀa>F&Ç °[äIÍXã.Z³ª­ú´¼,«mCE6/xª“­Ç—ÃË®Úþ©Ì=zK¹$‰¤£»Ð`FR˜” ¼‘ÉWà“´^È6ƒ;¡#ÛPQ)ß–è ™Üt, ¥h¡&ÉH’iE{c o`*—1Ê4ž»µ&GV³.v ™•R&v,]i)KHî`‘ŠVª„ðD’l`¥ b8N¡»–™‰B©‡‘Í­€Fzûí|,®ÝdntÚTIÂHK¶ÈÖÑ• ¸+æ2gØ ðÁ¯Í}µÏ?«€sÏ# C/K[´†½Æf%ˆ –S;È€ê„ç'Dƒr/8b“é:›ýöeÍ4W¬ÖµîPEn¼ÍV—áA¨Wƒ\>Á¯ð“U¼jgrÊî-ýÜx¹êTÀ‘ÍZ´}*XY9E#´0êWüD*ëÊf‰v€Wüð7Рà uBÑ «%ª;Séýóa·ßÑ[k³šŠKZ8)—ŸF ލŸüòèë>| –œuÚEýˆµ¸¯³\ä)°' @ƒ ÙA;å3" ã¡ä)ÈÁ‡eî ÕY¥Â#V¦eñ v^áøÒsûõs}ªýxÚ¡ÿí¡N“ZºÌâyÏÏGupWìÓs­5Í—žXk£þ (晡žþ³Ì ™­+ÿÕûßퟟ>ýͯ¶5èka›²G’\w}ýõõ××ïùXñòæIäôoV¯Iÿúú 9ÿeÞù¾6\ñ{p|Gä*]ñã³AÑ)½ó6^}›U}/þ¼á”lòQo§“» š·ü>~·w&cÜùåõÿÛ°#Ö,Úmÿ6f~¶á¾WwsQ†Á÷”Þš‹ë-rͶÄ啸óú@¸eelü™Ö×yýž^©»&/YFÛHÛUqùî·³ãyýzÇ]’w* n–®[]òTlpeí¬Ë§EÜI.yåI𦙶Mq}YÚ”Y¼–œhwr¿öàN÷¸Éâ½ÛU^?æ5ò|çÙÞ:¤ðv¼3±]\<µ›|ÿGiÞw2Âï~Þ>çÓ”t5q›Ú¯O¸Û¯åÈ×͸žå.‰#º×ûN~\ÚN‘wJPÏê”6pY pN×ß¶Ò½J–sÿº™;xï+µq1ÞXˆŸ&>ÊÓy%ÛD¾{]å”ãÇ‹¾§ Wìr|¾k>Ëm€®-pïep¿ÞLJ¤íSÎVßt´·Í˜xÎC¸%úÝ+¹=Cd_g™»9ÛÙY|tý¯žöçtûËÔ:m6ú£ç–@ª×î÷–Qð6/ãQÅ;Ô³íö¦œ{ÃáÂ[(¼Ç Ív"¯ÇšÛ'y~óñxüé%¢gèåó¥”Íhn^‹›Ã9è¿ænî"K±2Mf&Á]Êé“™’²¸K&­NÚ)0ËKE[º@¥iá-hF ‹h/›[ýaBëöT£K¡è»Éž&ôˆèÌL‚sÏHÔädÚÇh‰côÞrö®ì=—c$"=³g¦:3EÕ‘z\ù ‰Lßišvëáe9.³¤2€R aó|ìÏOÄÜõ&ÁÍxùù@¦¢Á/¦ÈøXµ­š¾ÎV†h'áL+[‰²[ÙÙµ¬6›gÑIgŸa¬Žè+;~à5z[M8WI¬„ w˜[-;…Z,µúTö¥8„ÍŒû'/>ÍÇ #¼2#{CÅ&ÅÌ,eŠè©Ès)Ø=íŽÇ93Q ƱYѳ `‚²QIÄ–mž Ðh^S‘£Hìý ÂóÌ€„:Uc™ S‹Ý®«K[Ò:ÛïŸhmÎLÈRéVœ%ce"ãs¦\DjÙç…ÄîyZÚ"Oqˆ#•“‘ÌÞ³«±¢ԙдƒ•B@¬ èF{‚fô&,-…<Á¢l@EJüÙs¦U—@Q½C{ÁXL‘¤+J8(K3SxD »h0‘é$çLd¦T@6GÜ™MsÎÈ"¡¥ŠX EdbG°žVM!ÃÀ¨äÞ• ¾Dt©#äá@C,vZFKñÊäÎc„Rsv£XzôÌzªþ¹©g*F• ªÕþå¿ÐôIÿøÿÍêbJC.´%†M,*„²r°Ð¤“•šgÔ=0 :Ê„̬Ó(+xŠ™NíTasž ê§å$V+`&¿°SŠX/býmw¶„ SxÀÖÈ Œu€¯åà¶V¨ø0ÿ8™`#ˆ+¬yýyš+:À^‰|Y1ú Ã6cD)ÔÐ_¬>³ Ó™õÉz;ôÃ?”É•™ó’Bc¦BGPÏi³Ã¾ÞË0ïµ§h€€FÈd̜éx\ª••Qf¾F%×­†ÖˆÂ`½VÝŽÅ+ò 1jyXÀ̲¸ªE­õ©Z7¥³Ìl_§Z1÷®ÖçÉ~—â>Ǿ⇧úÏ~àTp쾟Ø3jÉŸô½OSëQv»$™I®ìþL!³·žÙ–†H iF/^¦úôã§O¿ùÕ)Rôzûa©b¼A^žqt¹ÝH¾µ Ð÷Ȭ¸«Ùü+Oè‰Û„ë[…á—‹D|p€ÒMfôé9 ¥«Šdðý¯º&?8\Ýr&/IØ·§ô¯JT¿{E§³Çž˜“w(@¿k«ûŒ—3êήø6-ýêÿß$ÍëVåÔ]ß6M½=ã\¾ÿú¨à]èÖÅ—nÏõ«Âè7*¼ó}U÷n)ÀÑŽG´¥[‚ÓU;ýòÜÿÇ¿ú3ƒÎÿÂq÷È%{U}¯¤5^j·•f¯Ÿ [©õ÷kg·í»Ï=ê;NDºÒåGsÝ´[žÍ|.l_ÅœÝÏØw$Ö75–{åhº+v¼jzDÓ–ˆÛgyO˜Ð¥w¥Í­¢Œ®ºýwëK üUæzŒ¼øÈ£ßܰ…¤_pȉ{ŒK>Ôõz­7EhÞ F\ót *¿Çy²e¸j¢cê1?侸ó“sŽ¼Ûšx¬ëÍ‘n÷·B—„o½ÙÖo„t‡Q±¹ò›ZÐ7·u_Á|yWPÓ6޲éÎÚF!ÎÊ´¶gWúî>ˆm¼†·ôú¹~>G>Ûƒ‘Þ™µ¥Þ>wnû7W£Û0£E=/⇺žMtq—ÚJªwÖÜMSlÓ»?Àc¿¬ûðê²E±n”ÙÓsi3"]ËôðwÿÆpB‹žälÞºÁÜ–Üž×»ÛíÂýõ˜|oáÙn8.Bº|޽fÝÝñã†øy—ûÿÖIò6`~²W¡.·¶güá ¹rÛDw7…W(Ãmgy=G_tß}à¡y1ï6?X:x=Ùk¤NÐÈsw>.‡Ÿ¿ÄÒ#B=>þ¬\ïÀ̽3ÂÌݬs³âRr³Rk y1%eË ánC7R°ˆÌL„î!ýŸ¤’„"³î`OôÅ‘4PÁžŠvø²ì`¥pyi–Œ™s€]ÅÁ]‰/Qé>Y@ù÷?GwK2{winõÞŽ_Ž‹hýpì]Ñ!eJê d'Ñ@0‡le¸Ó°§ýsX–æVÔ© ­Zm9»YfìvušÊáxèÇÆ†JÛíŸ@KëI-K©»]Yæ9F%AG`e­13Ì,|ú ˜ÈáŸik¶ržº”UÍ>·æý5–”B.8AÈW ú€×?RÊ"Ô{TË4„<íªe'²’Ü呂Rïí83«LsHÀ{ïIG=[ƒ4‹‰·ZPŽ}^ù2@ûÒ9†¬Pë°A‹;MÙáÂrhÆ1f²7d 5+YB}9ÆÓ”€Ou_&{ùé°:ˆ Ÿ—…†§O;ˆµLó2Ë<÷Þ3OàÍQ€DŽ”ù´@ÂÐûB&„âu·+½-*r0ƒØ‰É8Àw`ÕÐj³Ã9(Z«2¡R‰Ÿ „?‰|¶<ЪrÊLZ‡‹D ]<9{³%… Xjr€ö¹J÷Ä’°4+NB‘Ùl–d*FÑåDÌ*E¶ @Ñ5dh!S,R ,`9²³Ò 68ù23¤ä´ $Óe’ÃÜ Üv¥8J({F,fOpA¤AZ¢;¸sï© Ò²… 9ɪS@%–„¥¢T~âù»‘JÅØZÁÉZ,©Öe\yúgMµI)jrvÊw(;”„,P*XB Ü—˜ §E‡P‡:´¬Øý5Ö«Ù/b-层bh]|ý­¬ñŠ3_%ì•i3 >t²°õm#j=h9c?ǼŠS@kâüjAÜÖÙ'mO'ôÿ°¸0 Š4(֑ǔ碥Íu*óñ¢Ê´ Ô¿B6(ÀaZ€Sâ`õñõS"×Ye´‰¼‰L¤`€[H,Ÿá¾ u‡rD2´Z¯‡¡ž)«]0 6Ù *Ng™g©f^PªJµReHcuÔbS%Æ%ЂÓîöãÓô\ó·Çü´ë†:U…òÐ`®–Øíâ‡çÈp@bWdݺRFõlKCf¶ÈècÝ4£OeÚOûþÃfÛ|J’8Éä$½” ÌÍîàV@པ¹Wôç£MÀ/U>²Ïù#f€ž³w®Ž…w¯HŸ»7ò¡=ÝÓýͶ™xL ÿŽj»^=õæ9úPÉz½ÿßœG.OmCì»Á÷~¬ÝEŠ?RáY¼­ƒß‹:\¹”½S¹ûÛëCÄ ÓWŠ©<<ÝÞã7KÌo² ³Ÿ£ƒ²Cû~fÎ Ðù_2Kó¾:µyÛ8Õ-x™äùüOðUþÚ}ýv2m‚¿ˆ'ȿ؛“¾óÚö^Jù'J<úÓaÚ|•ïîëªþ‡òÉ´][ÁóΑ€°,‹”/¿ýùwÿð»èAîFGADˆF7˜y-^|¨ÿ¤iˆ_`)ÅFᘊ†s@bü䩊@îfç*µÓ6Ô •QaÓÚ¹­-Ížj™JÍüòŸÿ.ŒÅL@;Ì#3…èGöìËìè ×"t#-rvCšH‘è¼õ$á2Á<¶/™ùü<½¼,]mO¯»º´yv»Zm¿´X ±ÒxZôh9í&Ó4^–b¥õžƒiÕæ±&:| {Œ˜žVÃR7$^VªÏS¯ü5¤ÓOµBöU|ô‘}€àeµ]#fô’‘S”j}6ÖôAL\¸Ñs²=êÒ{7³yY†´àDCôqU €²b¥-]Jú*˜Žv¨w_}‰ DfDd‡üåÁWf"Ñ@˜:ˬÌ|‰Å¬h=¸€ç§O¹Ì aÙ)C´œû’ÊÕä>ÐãÕxyhoKϵ6"Ó'ÐmWkÌ-•¶ƒN CÌ„Á«8Pì陳?Š6¡Ð~¦7˜QPPֈ߹aè¿Âl˜D•Zc;BÌ4â· ž@JØÀ€@TÔ’¬+à²|rö ‹dd9…à[¦DI†É È V%¡Ê0kø°Kî,„ŸœÉº4Q#w9$A aW¼Ò:sÚMé%¨÷~l‹¹Ó˜D­®Ä¼´¤æž“[Ï|éñCõªº@$ðÉkJ‡Ö›@ÃÜðù¨¡jãä¶DöˆHZH€™rdëSFºh¶†¡½Ò'Á S©—Áʉ³šÈå” ?4zG0ÖèûÚU¬Ÿ¤ð1Ž·×IÌ|µב»î£ò“Ö¯S áô¯kéNå8|µ{GŽXÞ:?œ“~i«ªœ*x*äøUByBçF˜ À´Ž}µÖ?ÁŒè£¬ –h32Wá~%#B¯éù¶VNŒk@±F,$ôeýjhG°¬¥:; s”Îbî¹ jÄ]¬À'´@¬˜±»©Vq2”"›êä»§"¯æ–Αf/s/Æ&‰»â?<µCk¿ûâÏ;{ž´óé‡'7GªµN0½¨P"þ¥£TßULõÌÔ°{Îh]-Ã& Åk-uWÿýÿü?o=Â>ädö××__‰ûÌóæ¾§þø®þ^ï98üõõ×ןÞÑþ]êÃw’%~IãxÏŸMèö^Ê=•öv}çuãn-á/Ò$ߕѴ¥lŸ?ãd+ÿµõ}—ñÍwâu+öªm>rà¼øÜÂ)N±i¨÷võšfN\A. 4Ô2G Øõs{ Âgóöíóe³?tÞÐ-¿càànáäDzIXEoÕß±Vð^$þë’óþSà›%5³ŠçF¥?³mÄ·+¼ÝÃÜ{FÚŽÝybçñË[Y=ü^> 3\¦ðþŸêÁsã{µÛxQý³ø§,íSPùRT¼2¾˜‰n«buiFz3=RôÎlqÊi~4»ÝïÛ¾Ê\i7ç½Ás‰ô:6ÙÜß'âùžx¯Ç¼å¯~ëøt¿JT7eb\g;éCûi ×éÿ»ámâÿà íçlêÞ¸áóšË×ZŒ7¾ÎÀ¼ÛJoíN¤+¦ÜSíÚÛ×<¨k“´»£ùò—7$€ÓïzàµìèT*tæ+mïKê½E÷§ßýtüéK¶PO 4Ìv­•r¥:ë4ÕR##¡ÈÞ›”1¬p3wläÓ„™”îŽK¤ùÚ{3‡+GÑz¸iW­@ ’rþùð´ßM;Ç®Ðɤ–6b –VŠCýó±€ùißç…¦’÷ŸS™¡”eJ-{[ÂæºÇ’?g—1 wKkBƒ!²ÁEs·4C&&?<=A8.øÈ‡­‰ÙÙÂzÆÎwæõåxX–Ù ¡>•ýTvÇ—¦Ä´«ñ« ðËO_H[ã-BJ®í°ö’<ÍÕãprô±{B;‚BV0a^'î¿ùi£r"ۼ⣆=@žDÏa«K”i­Èt¤²÷¬S1Së³›ÕRÍ8ÌN3£§j)«%©p˜_ÜÆe^†£ÃØw¥­ÌîRmˆÅ`¶˜{$ ÜV-•†H€È^Nr¡kŽÆè|Keæ#ÍíÉMÀjñýnß#ç—9£ܬ¤:‘­G(Pk[›YªažW-u̬y’tO+ wÕä! #çÃLf ݹÚ-Tªàˆ€;<ˆ> 1DÓ0Z`Aˆ ¨3%-ÈŠbâ› G,Ïb%,.=)LÏöäÜÙb¬¹rƒÍ HŠÆ“!‚Š0¥ª"猱Ëy6ˆ<²ÿÍð[ÝIIY’e*a †»¯3Rä0Œ’nY"œ0G'i¥ì¦Ú²QŒÌZ\Ý)í‹j= ©Ÿ—^ŒFÌ™a¤.‡í+Ê:”Ê”ŒP-Ó3† úڱ箩’¬jµÓÅŠ·Â&ùtDV–½­Á¶RÎÅ|€DÁ †BYÓíÙN[X_Z­«Õ­e:AãdæKÔÝiÊÎÀuNÌ×Éív€€ÄuX‘ð‚ÞN£`ÜEœ¢N¤ÖÂÚú_ vZlÆ}­’} èÀ~ÍzbÊbÈc¸@¡÷u™Ycx‰~@t°„ ƒk¾îœÆÚãXó÷•ð «k­C8ØÌa„† I‡Rˆ¶ÿØZÞ˜ãå,cJdgq3£š›UçΟŸê~W›|ܬÇ`›%Øó.òÐë“§·Âl÷Þ´˜ÜºúçÅv~³§yV Ví7%Ý"5z%¤²§"ré­uEP`1÷É‹›ûÓ¯žÿÝÿð·NG{ë ?Ý/áÖÝýâà´~OâTõ{¯¦_·@žh.D¦|›|ôˆ|ìÛîás·Oò Qß÷øýH«¾ ×ãܦHW¿¸_?óí{”‚ý6nåÝf¼@kê«‘2ç?ÙPoi0WÇ¥»_´ýœ«œñ»Wõ‘«Õ‰”ûÞ§é›óåß®¸Ûo?’.¶Å¢Ž;ÝXãÝÀÉUõ#§ï¿lèüGt‚»(Zò\ÞÍíß\›nFáø¬>µ-Ùá®Lø¨p窉®è»¿ðqën{;ˆÞ¶ƒ.Žð{|]ÄÔ-`›¡»bªy‰UßyΛ[¨Ûö¼nƒÚ°áx)^ÝE}]>Bmq‚ÆjRuú!O€ò¤^ƒ]çõfàü~ÝSüðJ&Ò 0…³¢Nr>æïâ`x£î^¤Ižßõ5 'ÐøåcÔ-[j»ï8‹Ë7_~£›?ó| ,ñ¾öÿàÞPùuóøÖ½×'ͳ¶öñÍG'Îߤ÷¯”7ñ4Þ¼™7„«Í¿ê¡÷¢C!ºù®§HœÏŸ£þ›×þzcÇzÛc¶#ãm–%/Õ%ÐŒ¯“ƒLÜ'jʺ¿åþˆ[%·óàÝy·4I­ÜÞ~þ›©+”Ò%æ|š¶´®+õK‡@ϼÚÚê<Ë]ÅÏ~ŠGœÿˆÙ¸Žþž6S|&Þ›pîRß9AlB]¼qµá%4ç–’ù0nzo0º_}$`°…ô9E«pË­o¤>2anü$/¹Y¯pË Ún0#‚—ö?ÿwÿ¥--[ +^jдßGŒ¥”Ì€™¹åšåψV¬ÔR¢EVPl½ŠôÓÌ%d&@M­×8¼©W\MsH¤‹d.iÊhméK?v‘±tÞÐTÑS°Ì”Y Q ±ý¯ÿ¯æðbÊÔ†±´¹YQ[TÌ’ÓÒ[‹ÔÒ{u¯µŠ2 ÙÙÕ~÷ÓÁ+¼æj³I«SéÑC¡Ìiª¿þá×’}y9š™¯û}&>Ï_ íÓón*Oóñ`àËËÜ–Vw“{msËH7Ë Ç`<Ž<%R FvpEy˜£7xE øuY Æóöòºò÷V·'…q|~¾ô5ë?Ðû ð¯_vЊàó¼DK ÓT–cÔ™cÎF¹»CìÑ[7§kns´ÌH^WK S­°¨u—˜3†Dq0Ê•ì‘ <@†^à^×n§<è¨cŽd";¢A‰9 °`WŸÔ °hs-uI•2µ¥µ%­Nö——#“;ª§ÏË’=W–úIÍ$\±ïÓ“í?M‡ãŒL¯0…;Ó…„ HxNî4?LôNtÔBPypLÉN#àÐÑ„™¶Ð8)Ê#ÙI(€hò ¼“®>KŒ""X“™TÒ}ävCPk0³D.BM#)&e“0c±DÌ'ó©âkø’-aɲB¹P@ öSÆw‹ñ~Uc*CœŠI9÷‘€Sù²t/¾sß™[û›ý¾˜-ÑDµÌž9™'SÀÊ Nn¥ÁîÇÉ/…üT}îÙ¥BK¦›-‘-2ˆHì\FHÌ.ùšMß%5Ð1VòRV-{8ôޅކìÈSMÀ‘lkÖ|ÆŠ¦ûÇê·avjšØ*0­ºRa9b z½!;È‹?ŠxÌ€¾ÎÎ,#ÔO³ú©¬ç"€²F ¯4@ãItÐZ+ÓkLb„ýbÀy–Lið‚ ŠÁ€ d¢5´DöaéÙË:‡¨ Ë54¢\ùþ2׌/P‡^× #N˜²qÌul°1¹ÙëÉm…¢ž(g˜¨;”Œ U³TÓn÷äQJçä¥îŠUå±›±G°÷ÕÒò¸H/‹ui_séÇÿßÏ1·ü›­Vÿá)?Ïú阻O{¹¦2h‚hD¨+2{ÏÖ3B‘¼zÙïv?>Åëÿø?üí–gy±é¸>X\í4À°[jäÕ¹X—†=xµHzÃ\åÝʰo+P·Âè·ë_Xäo$ïý 绢<·PçÃ÷]Ë6ÞÛO}ì¿MÄà‡Ø[ÞyNœÔÕX!¿¯›ß›@Á/¡®ßÕÃ?¢b_Ÿî„oåøGr·+>ê$_…«ºRÿ? òntí yú6Nð~'º±g{㦾-pÕï¶$ïÅ$®B)÷Ä\l2úôq¾Ó_6t–Lº=zç3onÿ¢¹N_£5뙼3»­˜W¼*Ú¼q˜å7L_×PÂwߨ þü_÷Š>ÆéçŸÈoZ|GX¿+Äüðþâ ËøO·½¾Ïr¢¯Oÿ3ïÆÕ•w³®oéíßçWõ?.`èÛÖiþÂÝÃõîümp¤ÏK˜þkÀïuÓóñvý_r¢ülGÖe¸œ"â\2#éóO??¿dKEfDôðJºMS­û)ëÓ„ÖÝÝÌÈ©õÊlÂŒÓ~2˜›wµIÊž4c¬;]NFÀ̶—lë?E 0ke¡9¤L’È4a"ûÒTŠÈtñðåàæK¢O^ú²¤Ùá?ÿ§çO{ ÷û"Á&õH"{ïÑ—ƒšsa)eѾԣ˜ÕJZ˜…Kä²$è}I¯(Ëu²LÌm6Kó²x±ã20Ç~÷‰²§Ý§ãò2©°›Meë]//Ñ)áðr$Q¬Ô©ÖRæÃÜObtž>'Àq ewRÄÙ)çsZs{%Xåª*ŽRUû;%Ç©‚”„û*U0‘8ѽ}:˜ÌT„6{vOv<ôio©8º9GòxšÜܪ›qé20-Íà^ ë¢Èi7MµŽ_Ží@‚eÍNX’³'j_ñëCΊ¬`ú„æÃ=•è Fì©–i>Df`ÉC?ÔRœ;ffN£íwOÅÊvlÙP§Ò޽å=[ )9tX¬ÁŸ@€ ZQ(^¾àœBCˆ¡ SìÃý]z!÷2jä¤Þ¥+1G põ[ƒÍ丅ª:x@€Tü ÁeQ ¾Dîɉ4™–éZR¿2X"€.U/ FV™¤PˆH)sAØš„¤dÙ%_Õ&¹p !Á*ÕŪ¡€N dІiãK#'`ot%ÍRrKób‚»hîY­D•ÇÖ&³Ck$–È­E7#”¹w— T‹LBPK¹±8lÒç 0g&×:€¡µš£Ÿ¦°$˜ðT‚’ 7qxO°³Ó£•ÌÄe:XV9{-79%ƒÈKp@·y„`9‰Š†aIë†2­Éø~*è!Q'$+§ú êëèw”‚ÈÕßÛ}¥y9I¾vÊ‘d0®Òù˜Ä3¡†R‘@z í>Âq:ù'Ø1÷°‚ Z[}G|D‘¿‚i({(±Nñ†S•Ù9fNÈ@o+ËkÇ +[i…FÓùp÷µõklCÈ‘YV1VV(9­Z­^¦R'æS­Óô¼GØ$/‡t†¦’¿~*ÕËïæøÇ—žš zh{*zšb”Š)’è¿ýRþÅoʯÔç9+{~úâ¿þÁ&K!Ç2ʱ´h=–ž‘¼zÝïö¿þàßýû¿ÅUfÏÒ?ßE læ÷÷Áº0CÛ¦DñÍZп¾þøåo«øóÔŽÞ äüÑI¤g øôÿ?bëýéô߯ªøëëû´ð>¯j Š®™ÒßÚÓ>8~•ü»ëÛãëFÊùú€.õê·ÅŸ÷†î‰Úe§Çöª—á¨ožàtQ@»½ëóŒ]áp©K| fæÁÍð½ ðm“ó­ãýøÁw“ŸïBÆÞp›%òA(È þò ­ûå×_,$~%Rï};ð{yŠš“¸ñÊ&ÞõùHBûÅ0æ«dÇÛr`^Z óÑŒ›r¼U:zó3nyC|¯yø]»È9üO&yïân]§¾aeÝb…ß%/ 9¾¥qßÞš|b^é:z_‚çýl/Ü5Ýz7tp¯aùÖZÁ¤ëý6)Ng›²oý¿¹p~cÐt[ÒðuOäÈKÕY8yžo‰œJ,Ž?¿|ùùsôž‘ÙC!š™Y©¬û¤1ÑZ±Ü]i$RJi^ZF–bœinKfš;IÍ€©°Ñhƒ>4¨2óò)´_1S’»ÊÊÉ{·ÎjrWÃ|îÉž%µ5Ó~:ø§=«‚>ùÞ†ªÙ""ô©Vd7¦²)óÐ[ä¬Ò’f¤’JÕŠÓ“ÇTZÉ¡5”ɪžX<( òOÏϵúqž{_J™ê½ÀÍY¼*sšöjÈœI”Rzï½ÏƒŸ¤×Õ-3GÝàÇ8¸­½Þ"LçZ xY;í@ù[*¢Á„ÈuÆV7à!wZ9¬ :â„η^!½/ aÚ¨Êæ¥{/¦zü2OûòücÉŽ‘„ÊT²…ÝT[k,i°êå8×(y±ˆ¼`b\9a†¾À=GÚ9|‡ãgDCõj,ÑæQf[2-vÓ”Âáp(îTµ,ûj0 ëqnµÔÖæLUw£÷¥»—¾DÆ{ OjìxÄÑa€%O‰.K$6ÒÀ"& 2ö…Ù ´@ÝÉž•B¾X›ÉI%0zQkБž0B{-RXB·ÒRQT¤žlLB)ÐT'jÁèDêГ!IQÒœ¢TÀ~HÄɽØn˜‘;ZJ!9S×0Ú°CF:Bëßœ&+ªªºe@)…’»R½çîħºÛÕR&Û¢°”–ˆ¹ôn$Å©øQ†8I³CF U'ÄE馽Y À´s[2N%RRB9,±á†êˆ¾F¼Ö¨$(:ÜÖXõlq(á3Øà_í€:(cXqu„^ÙýDJ€ÄTÑ'ØrrÏÆš€_¦Õó6„Ràõ´^ñÃgpN>·«€¯“`ô V¡DÆ)»ßV°¾ÕÕÀ`<Ö•„µfƒS'¨Î üäâ:'C!":Œ˜vX¾`>À bÔ(Øj3@ NŽÄ"Ìшå4fO¥£Fa8‡çiB7Cœ ̇q±V ŽÊ„<ÅH8ê– HÀð(zÀ÷ðdkD¥5²V`…%ÞÊ”¶‘niåùÙ딇93sQ†•ÝÎþå„©Ä˱'õ¼·J[2w?<õ¦>ÏÝ+~ø”n‹Ÿ*æ¥ÔêŸ&Ö I¤)¢·Þæ¥/-{ ûR½>íö¿úôßüë·ÛM×GO} UU§*ú³?ã}õÿŒxÝ^ðæXø=Ždïäcò#¡?–”É3SÝ%ÿ"T½¶<'ÞÝÞÍ8þ³à™\n¦·^=ƒ\uà»Guw„ß80}¤¯.æ]øÏ]Æé¥š©oPïJ–%ŽþB÷kš//ï]ªÕ¼eûÃÛ³ÞWMÿt ó߬|o³þúœãJæ¡2ïvÈ´3/ëzã~ß&ѽ1\U­Ýz€ßŽèí<¬3 buF>ýÏ©tlΞ7ª²¶?Ñù?§_j-²xåŒkK¾Û5ož‡ˆË½YyæÜ„ï6È»Òèc˜à¦tåUž[Ck3ðœöð€(òJãØÞ¯.oJÈûÿÌ,Ù€DÖt¹òl-¸I‚¼'µÞH·ºÝíè óÁÒ¦³Kè•å£WÕv»¦ˆ|¨n­à^êó¼¡lf¼{{1\±o¶ -ñ¡BÝü'un+¼òu¦•®Åò ºýEú­ÎÿzQñ·Ï´ulŸë_ÁÖÔàT¿uæfñîS¹ä}l»ÐeAÙ噿‚ ³ Dq»Úº4á%@儱?ýêaðúb/‚Ãå1)ïbÔpÍÂåeÀX—G…Ç+.¯Çü‡›ô*SC—tØ‹ÅsÞÝð=|목Û@ëíÝ9ÝŠôW³òEê>ÛçÁæãê¹½®ï²S¯oœgàßýxßóÚ™_£'þÒf¦×[†)—?Ê¡Õé|5™:£ÿW˜ôòÓ—Ÿÿá·HIˆÞÍ÷Öú¼Ã!/SvJžÞ†%¬¥µšðÁª‚–¯„ŠÌK½ðP µ<±šæ>??=µ^"3"]¦`ÕsDCÄK´©ìƽש¦Ô޽îËòÙš²Uý'a@q¼¬ú]n«g諵o©`‡Ó¦V|6 Âʪý4ç‰Ü €èíˆ ” /kð@B[ D¶´'”bŽÒæÖ‘€=?Ue(¥ö#ôÞ$ÑXÜÛѳXÉ`yyœ‰dyåì‹'sT`ù ÓhËšÔœ¹^0_þ6A²ìÞÑ€´]‹íˆ 1;L]©yžAì§»õxXæ¥øá¸1xGÌã$¿BÕ$Y\tHæ2‘dçd!¦ÑšàtJ Ó±+J7¹–Žé“ ¡·a¡«jh‰9䂃YËÞ‘Ý:q0í]ÓOÔ'„”†õò$SRÈcf€Ït³l™]èR!, ƒU!ˆ¬ˆ®\`©,Âì´D¡VVB!lp؇ÌŠeÏ$3Ù36ö^ªnÊôÉq²˜õñèŒ9G°·²÷Òi’LJƒw¼D_K>¬#$ì ‹Yw¹ÆTÀYYÏö}e4ÉÖò>JJFØlÄÉRŠ@Ù'ý(ÐÉeÚO½‘ Ávëχ)4Ÿ  -`"Fß0°C‰R¡@q¨ wX]óÍÁ/ë`¾Á#–p®na"µªðëf36™Ý§> Á§µ‚†àê!ì„V:O겯E-f0bÝqÔ +è -à¾Â‚æŸÖ*„eò5Î1b k D40_^ &be-FX…aE')eÔ+(fïðá–Q"O®XSþ ôIJ€N ™´‰SõjUÓÞÊÞ}'sz|_JOð§½%rI¤¢ü³gûÍ'™EtWfÐ ¨8-ZƯ?éŸÿ€¦VJ_zÝy™ª{åqÎ1­e*•ƒqÖzöPÏÌ$Yj)ûééWŸþõÿï[kÚdeq£ÎŸ7Úkk¾âh^S¹ÖýŠ^…}Vç¼ÏíVóâÈñ ²°5dzCÅcW€+µúæ£ÎËíYívúH¾ù*ZËY߸½Ø-Dé‚4ɯN!_ww¿éÑ¡_”õÕ¬Šogál[æ­¤ŸmÞ§îžÏÞQ">.+oÛü ¥H7¤ðàoõÿÎz_õØuymtò÷º¬¾rL}µ}æ·×|èü%3Ä'òs þL^Š–/rÎïá­ïU|4õœÕ/êÑi€W|Ø<œßûBÿ_o,3o'ï0€þþáÔT|íý‘`ýÑ €‡­Âot$…g¿vµÝ„‘^Ï×/š×v_Ó°§Ãô·Uœb¤g§¡“ãˆ^kNɇß}þÝý‡lÈsYñBX±ZªC^|Úí£v¸ËK˜J ™’=Ð"§ê$‹×Z2³/mÄØK£Ühk'É ŽÚí‘àJý‡FJ«Rj J9ü©[FÏ$õó1_–]õ(¾Û¡:'c,©êóÿþÿ|ú´w·yî´T ûgÄœÇÒȦÉ-ˬ̱&šµe.¨ º»£Ô©D.‰äHéÍt‡z{•){mu ©ÊÇÏð‚˜‘4(1< ÐmIߥ£z©Ë²‹Ñê®ô–„iŽ6'-Ÿ?}Zz›s*@%ûÓÁ„išæ¶¼|YzOÜ!Y_s›QjmÙrèØŠÜ g§?Á ]È*øsi`Á€í•I¾p%éLड ϳŠQD†(t¡™&¡7fªw–E1tÈ:õ4É×0±ž‰%I—¹<9…5e ÀDOëÊÙ‘¡Z°/K) mŒ"ȇìl4Ѩ2RNÖY«ó*ЀúºŽ«š5‰© &qr‘A˜BHÊ4³@&uˆ>Ñ ¬õì5wVçèŸûRá;c((LB p¢VCuÓrÒP‡³!:ܸŒÓ¬½&Œô>Dp)ö^@‡O(´×ìõµîÝRà2Á‚²;yÕ æ«È^*zƒ'l‡:„îppDwƒCÆÊÔU5kp+m-ß>ŽX™W£y=WjãZ3æÄQÖ3„FÃÐÜ×9>¡á7ÀuÆ0ÛˆžÞ<"î !"®qD%¦‚¾ Ç”`_ƒ몑P_kF,ÁlÐ¥¬u˜£QW5)®!Ìhx½Ž µ¬!„èàÙ ˜'æ1<'ì*QH§ÌÌÌ¢3ù®f1wO»§ýôü"K4(¥ô©dŠGäK³n c'E—EŸŸó™Jeñ&"‘?ôã“j‰¥ó°Ä¯žùÃ> ŒÈHŠÑ3ZÄÒ£/îµÖ]ÝýðôoþûÿÀ4ÊsNù]gYoÚõm7*'~ÕkÀÖçóÞYê”Sÿg•œþ}Tïq»×‡@Þ¤×ü4Ô»=d«×¿}Œº›B¤Ë×wéÌïže®’…¿{çÿHÀï™ê«broHê·÷õÀ4îÛ+¾¹åÿ, óÛ3­¾þ¯Þ7»WëB~Kßx¸ƒ¢øˆôwyÜß÷U¾F ¼0ïyOùäe„ä{Ό˿æ»t;ݵ¡_‚™º6l¼\¿I<úÅ |NUÿ(kñ¯>•@üAºùkeÁ÷W™õV˜ƒ'çª?>åÇ›_¥X}/êÌÍ̼Ñã¾",qSj ‡¿¼º“ÍîT—?tù¼ˆp3-܉$\Î6_×Lo)ý)¬ ooÚî̽—zó»Ïü®¾2éãîÏßu'¾Ý;¼qX}«€œ_ÝæË,>6?(Cþ`<åm㲯™t¿²êÊfMß8³Ëò`\K‡Çç¦-¾üýO?ÿö'„hÀŠ›Õi¿‹ˆ!pXÊÜ'GëÚ”"EEu¸QànG6)Íbô¥ˆÌ$aæ½7Ü­‚€â6nÏ,#²‡×BÀ ƒŒÒ¿in2ëìZþñºß­qóæv<ôL³É¦ãl|jÌüßþWº X2J¡UZá2÷%ÛñeQ„u6+ˆ\bñšÓ«ö–t–Èž™ÄÊ‹aP`†²G"›ú®Næ8Ì—ìöå‰{ëKÖâÒ²,–]Š0‹ï²ÙTëÏ?ÿ”ÊRë¡-ÇŸg Ï£>!¡xí­Y >A¶²AÖDÒ‚Ô+7ÄÀ$™@råÀÀâŠ, `¬·ÀXa÷¥žÒoÑ×z‚XÖé{ÔÝ*‰ÒÒ »]©µfïÊr‰£Ù^i4ÉÒ Åm†õžL(Ñ'ãБ§ìkׄ%Ô ¥ LO­n¢èèk²õ–æ£Y›çjfî ™•l0Y[zô¡w÷¹Íóq9—ã¡—ZžŸöŸžöY¬†¡å­»ý$,½¥ÑŸöS›ÛêË*Ð`€MÐNihë”AMHº)ñ•4°ÌFÅ „€.7._XˆÖSÜ€d ±XyB jBŽÙ°0'ðøúä84Êõ3Ú“=ÕÕÉY:&¥Ã˜8B)³"€Ö‰–0müøÊ(2!S°ÁÂÊõY[øJ° sDz˜#þG¡HRû(õh»ùΧÏóñˆ(îæxŒ¾ôÞ"œl#à"8ÁÅ’™ÔÕÝÕ”0º1,ËñäÜt•þ{ŒÁY/î+JÞʈiB±%/ðÓO†oöèö,‡U¾C#µÀêɮ֠D›WákÀlL>5?A~òŒ÷qØ)`2ÌFøm¤Þ¯æ'Óon@@ê·_´-`ºww×µ#ïÖšüc3¯Õð·ÔKÙ«ÜVFèžÄ{Zôõ îoÀpz$e¼.ܺ\dï\×ôrws; ®¾èƒžou¸³øš® MqãÙøèŒÇx%nÜsRKÍЯgºß>çäIQo~Á=eþ|‘Ú|й³Ÿn@Û ¹Sª³ýÔóØÖ©Ðf“iºÒ€6Õ”Ð^x6n'â+”Ïý]‹¶ík§Ñõ¿k{µü€¶È‹­ÕóÕú›µ„œ:•CnÑX<;OÞy¥eBlÚ•¾4»Ý®Ç,õãñè¶k1zæ ‰4lè§üheb+@G4ø02MÔºú< $H´#H£ˆŒ!×*Ý:”¥Nó²ôÞ!+´eéѳ–IÙ3óËÏÇÝn:„§§i·//_–eYÒ32Ÿžü¸D´¤ãxX"“†lùòóqÝó$*W?jTPFüË;ùŽË£r†À%"LhÖ_`2ÿ1<ÑFãDvADc. ïÆÀޤ¡S1C&F*Û:͹¥R plxI ì5†$¯â)`»FAOš”‘=¿"wCÁO™¡&­ÅE:Ï€C̶³p®%³iLà´–F¹Àº2Мû©~Yò¸äTI"“Û1ò¹N?N»ÃþûºoÖªzÓ²þ<SÂw°i €!€Š©B¹:C(90p4ãs>8]œˆŒ“_.[;VÎþê´$¯<£çG®ÁųĿÆL§’Œ™èÞœé©êÓÎËD›&1Qø?û?ä—Ù[/K‹ZlWí‡ð¼çÏþj½ÇÜ™D•RêÔSpf_¬‡¬7Ún2Á««G‡”=£‡zFï}éÑzFà„ýùÛÿå?lwYº@®r¸M`³ÿÙ‚r®Î[䯾R®ºÐ\$³uûÂ[§ÀËÜÌoÌ,ÁÕn•k2ï±Ht‰(~Ov¿‚á¼Ë ÿšt½v2Ýkº;{‚ÁÁ5©Fw•Á«Gy+}U5Àm÷¸jº7²pn1§¸—¡üA¡ÿq×Õö´¤æçG>ÿm¨Î]rÑ/y¸WÙKN· ¤»  »Ïúóћӎîqtÿ’¡ó§ÁþNu””nì­düÛgt#œ›K52×à5Ì·ïu|D 9·ÇÛÁŒoŽûn§©ïQ+Cļ 7émóÛBº“á÷vÀ=tÇ×…Ùߨ4èmY]3ãÅ÷+î_wz0ßÑ(’\ß €ók2¾µøà—ÈuÝšÈþò²ˆ7~ó à˜ñÁ U¸·ŒšõMr»‰Ó×´%o]w>ôq€.F•>ðäoö gL9îœ1tGÀÄ·<îQù^G;†Rto6nïðÓçvœ¿üôsFjiXš•B³â6=íÊT­”RK„e„ÌrM–¹»""h^ç…­¡ÖYê= Ø~SIj_ H#32"Æßfˆ`¥lßgõ¿@¦´SøÑ%tçÓmŽ.ƒ&·ˆPèù7?hž{ÇÓ¯Ÿ\Ñþ?ÿ÷çýÞŒn~\c¶H:§1C½L–h)änÉ K´.%)³ž‰2!¶`8ŠrB!È@_Ö‡['«»]b2(¥ŸæÖ#çç§Ý®î–%¾|ùRÌž÷?ütüùx\ž÷{Ì\––%…œ¦"Ùáe–0f1irY ü”žo…„[M!’%‚îÂlw‚S ÕW ©=TZïMˆ†:Y.Ê: W7ôeMï¤ÞaCÚ (;8в<#{ïYë”Ù†èÕ ¥ 9DóÞVöȪ‡Ž]VùR€pⓌØyFˆ#‡g?=ÙÎ?¿|RfÌŠ[éÑë=¥xYæei]eßO“ËÒ3áf=“t¥·Ö/ËÎr·Ÿæ¥÷%½XÝM˼ŒL¡˜+'Ëð:Ü»`.6³féÒ^‘bW(¢3‹°pa1zýHÑbwæBë ±…vÕ‘3­c2˜©ƒ/ ½i"*Ñ-aU"˜lB äÀ3Õà§JÖ‘F Ìì‰bˆ4š—)‰‚AIŽWjd‡Ë€XÏ™ #ÏÞÃïw˜ÒH Ò ™Cµê…ƒ|ƒL‘¬NA‘ªF•%"Zf7ËX–Þh4Gˬî;„¼—/\ž½ìÜ-ó ”9J¡WXÁd¶ÓÔR)™1:ZW2Bp ­>>~:–ùôzìó ÏGìHspôê|µÕ-Ï­ŽÅQêš¼?íÖø…ÝÔÐJY7怯pªÞmu É€q…ä !û*½e|ø ʵpáœU6dô²ƒôec\?@:ÛÜ;Müøö˜ÚÊî7Cžp:ÙNç/C ê(PVƒajrŽ"¬Õ6æç“0m+½pX¯-i  5ʱ:£xYÁ'FÙ© Öû@§Ø(À<…Fâ?Œfp—g™fsÖ¬¥bgÓfÕ+þå¿ÊjrX4zÞ•žøi–µX)(ÏOËÜsYôe ©?ïc?ibzÁäKkìÝKµÉ‹»zà§|Ú‹ŒÞûÒ¢…"”2’µXñ²«ÿ§ÿëÿERÞífË´‚×>ºÓÖ$ì§ÿwT§w¥®o;?}°@_¹÷ÿ† €«J懽+ýÿòó÷C1ñ/¨àí0ÒׯÞIHúmþ Ïk·êç÷Â}õ‰ì{òï£àûÞø»Ð_tþ;T|ÝÀÙ„©@³ë í×ꯊQýÇ7L\xºá¥4|‘|õ£_Ô8ß·3$ØrVíïÛëÆô;«´çýãc°Ô/ Œß¶x] ÀßãÍýAÈ?¼ÿõõ5ÛÞt }ÿæþN}ñv÷öÑkåFJäW›ï;…ŸÆõ‡mMf…ïü•ß’»ôËJü}æ/ÿo/=G=øq^ÏM1Þƒ€¤íþgÃôx¨#¿nž?ÿ]Dö•‹Ðן?uãÊû1rÔœ|Ì ÃO_–Ãüù§Ÿ´tDv«Åw“‹»O…‚z—À֬ؼ4[Ún7J©%S±,B8ĺ»rä#g“ÈLïÊvH¯^j%™‘¥T¥hìK³âëCý÷L.RBeWÁA‚¤ìR¢“}ª>w{Û—Ù%LKÄÿþÿ¶Ãn1MµÎs ÏàO¿.-ûñóÒÛ¼ß/S±¥3´€”̆—ÁbÈ€W$¡¶¦tHæšý:Œv½ÌÔ™ LÅÂs‰Ö3Ü<ÔKo­9vOÓ“4HÓQ -rî­céVJ´(^Œm·ßõ6ÇÉ +.Ün ]’Ôjœ²Ô_)áCp£rô#2Ñ– –—҄ň• a@æK)­÷Œl-MöT÷Íó1d"˜Ëq©“U/ÇC/>¥-­…´8K¦ÍȉVw%Ðû’Í–ˆÌ@Å¢E#y "21ˆ2œ¬˜5U•'6È?* È+³'^¤†(QÓÔ¸üÿÙû·fÉ’$;[KÕl»Ÿ‘YÕ M €8_ù?øÄÇÿ2|¡PÈŽPLÏ ».î{›©.>Øöû%N\*+«º\RR2Ïñã¾/f¶Õ–ª~«A“d©¤íwì¡wf‚¯˜#i. Ò°Pƒ¤_LS l ìèž3A±€*) D€ XªÅԤ͊úAˆ T… ÑA¥júÏY­…áNùJ€·…Cµ•FÙ¡4Ašˆа¡ [™JæH´h¤öÙ7î›MmK†2Éb–Kllm5_RsfnLÏj,ÝVB~𣺓L~’ö¡h(3¾˜ÿ¾w^à{?¨ü„µövh¨°!ø¨”/kò©L0‚ùÚã‚D,0ÃÜV îaª10AnëNxŸc½Ÿí és¼ gàÞV0/ƒq‚çJ:²ŠdrXåøQMå«AÊÚµ£ƒ_1‰ìë™Á Zu»¶×ÐP„¬‡–‚DôÃ3–‡ŽÔDjµ/ãAâ'ìEH¬IpúÍNÏv%2à¶üJU:t-À@!ûêµ°žˆ!É4¬LKwŸ µLfÓ”ði—>Må¯ÿý4ã§^ªÞMöºÅÒ³u“dd)U»}î»õd1½¯²Ä~‰¥£V›ƒ›Âê‘É”H$zvù~›ŠlKË¥GìA3¯å?ü÷ÿqûãûwý뵕éRØ>Úûâ+]{Κ&¿ÓFÿ_¸ÿOàuðþâµ@©7rr~9€oÿó'î Vú—j‰ñÝàÄ—¾ß¿aö/:qøyYp¬‹ÿšÄþM˯!Î n‘Ó¨8Al.ž¼WŸò@çÙ=¼jê>g^Ó™n: ®.çyps»s;kþ½su¶ôéü€.Îè¬Å…gu9ÖèØ*ƒc43"”õ'˜?|ê­øý¥)EÀIs·âæô2™T7Õ¦©/-"Ѓ­#ŠÜ’–­q?£Ôt.µt4—hff‚2R­‰´qÔS-DïÅÍmÜŽìaŕ饎RŠ÷?‹dJkÞSiˆmYµÉ=Ì"z,áC@2DñH´ÿùÿñ±g™bû²-Û´PöÀ_ß«†9ï}Zˆ¾´ýÜö½gôäP°L4±})sïÑám†õSYn =W+ÎzPßè«–‘Ñ1m¬ú&æY™rø4µ&µ˜¥r·ìô1£uƒ-˲)ÓvÚ|üð)æx-“;öó¢Ì¥ÍC$c°~ €â :bÉi«2)#ÔNÏéº]5¸, nÑc-Ñ:£•õ‘7¨å)”‚(V+ÎQè}0ì…m` À`B¦¿þzÓvÉ…p{}_ºšWk˜½öA '7÷¡õÛ}u==’ Ô ësÈüà¼z œ mš&Ê{ï(VJ™öË2ï—Œ4Úòq!+\&ÀL»××L 2s·ûäfŧº”sÿ #Aô%W䑯\t±›V~#“H¤À:Sô„0)ƒl ï*XeÝ"h «’¥–N‰"æd6- ­È„}¨ôbÜŠ‘êB¶ES.6ˆ"øª¤»J€aó@=^@:”BÝÙ_NŒ¤FdB]ædQŽÐdÄžÐßÉ”B,&§-P@Isޝv 6,=cÍz”ÏÙÝìu*ƒ)”™ÑºÜœöZ‹Ëzä"ñ«i#åÇl›Éþv*NfQ‡æže^×ÍÖ0§ŠOóš–ÜGá• Õ 6:W ‡EÒÖ”ØHç ‰™Cå?HÏ£½f”ᯉ(!†p9€ø‰âp—`-íG†´ ”ƒ@#é~”ÆÇ!Òºù!'Ñ—u¤ S_Œ~žYþªÊ­€y .íhîéÈhµD*kmfÚnÖZOZy™d¦”WJ=ºT'70"²G´ˆ%¢õý÷bÿñ?ý§_ÿÃߙۈu»ÄîV¼à«žw­ÞñX¼Øÿ¯ ‘µ`D1wñ OªƒÎTâžåIhzHë–„¨,Yg{ùG;ÀóŸÜ‚x•9ßÝ õ/¢åu¿~D– ¢¼C":‡Bž†Åó÷.0O}Ó<è ×`ç㇬ ÈQ=º©šZÏ)3I]hõ¯ñýa…¯Åh|Vþ{t¹îÒ`ð€ÎqÁE¹'%ßpõÎ'ÛÉG¬’o£ïåçÎmÝt(Bpßöòì·_Öâp·ìI'\ß·Š×·(§Û›ûd/‰{¸|Î+øÉ®üÏ:Óô¯{ëÝ™¼¹ßwŽg­z59#Oš‹.DÜ(…ŸY žöÇð»\·Ï>ÈÞ ´Üj¸Ä<¥B®vãº×pl»ì¸ºÞøß)K”¾ \_øË»#þ¡”ÿ…9^I_½¬ê­oz™çGrtè~ê W.\XàÆeá©àõtﺼ1W÷•WX_Ûð çßð¨ýÃA’®!Rüò몫LÄE\«{Ú¢.²ÏÏ–cXË»™‹‹ƒç[/$ïD‡ø¢€3"ÏçÏ[ƒ™óÌÇ›nçEÏR)¨Bóg'¯-À/‰®Þ\Ïr‘fzîÊûEáo·MOƒ›+NÜÕ¾îš\ôEçv…º©C¸·k>øÖÁ'üòþ ôýë ÿ°à±ïôÛ;Þx›töܹ9±+FÔ*y¹™>í¤O‡ß}üÍO¿û§VäñÓÌÍR«c&÷A"w‚f®ÌÍ2e¶VŠÀ²t}é"ŒÌ¡thê))Á@¢xë¡N›6ÕÝyPÿד1ÒÖÂôå­?O¯ÆâDA JѺ‡•’–©º² Ûò?ýÈ zZŸ6ï§Í&¥2Ð=%~øÐXP7 Ò‹ml³ÌêÖZ]”¯RÒÍݧå§^6œ¶Jœ¨kÝ:ÖZZìGP<Êí­ µTŸ¡Àk4èÂÄÕo0¢7²”2/­- ï^ÞeGD~üé£òÔÊd Ô€i'ôµ¨`p+±ä<«¥á¦›'ÿ" îÐø¨ãJ<RŽcæâŸ $P&ø„aA¼ì‘Bdù§V¬¼nÞÔÚ5a éE›ì³Yz±m}™ÛNJ²Õÿóõ=æß¯…ÉÃÐ&ÚêP:MÀ ¦ÌŒ°Âj¹ÉìFݾf °mÝ~lŸ¶eSK5c‹èóRÜLè=³/­-z÷òòúÃËîãH¥µÌÈ=™tÀS ÀOËvÀsgÀ„Á8®’ØBhô‚J®HÃXõ'&L`QºÐ¹,’©8­3„ ›©"˜!¤ÞYi"2É–0Áˆ}æk5t$‰‰Lhî¯ÀŽJCOU!Ä|!Í”!f+ ¾¥B,àöØ%$Ø%«Ñ¡äŠ2  †Ô­ÉšÕÃ’Õbê4@iîʰ„›» Œ‹…СÎÆ8Y‘³¬SÞpªJ· ~¨š² J¯Ìâ΄¬(2C;6LJ2ú”Œ¡nd‚ÔÆ Z(C–rÛLÕll|Õ¡š{ä‹W§µÌ%²û°_hÝÁ$º¢ƒ„&")wLð%TÈæÌšÜ>D,©êØ äÇŒ9„ÊÄm)»6š%@;€€E5ôqøaÛ©:~ä¥@l_‘XyAŽS3°60_)]G¹jßGÑ7Gá_M}Õ€XgÖñq“‚„lCt†f>ìÌvûÄý?d`ó ûÁ^X§FÞq^V=™`®ù (Öߎë3¨;$òÐ]wVw¾ÎýÓÿõ5 y4‹p—{]…†¸]œVïž°iíNˆ† ”„98­ÿ˜uÌIš£ SM²n^^­[ìˆwnûÍm̳˜IÜ*s;U)[×n¯©èÇõW?r[sŽüaÖ~QëùiÖûWkcþê}Hinn–ÊlF‚Ù{뙽ÇÒIò¿ûûÿ]}ݾüê‡÷ûkÐiv&µœ—ÿüzýøŸt•øKüý'³!ù…áežkýo‹Ÿ×¡âgøü l±ÉïxM~Nß‚?Òžè»­½ßx×¾;tþgßxë+„q2óüvŒ:ª³ÐrqÊÜ^±o_ýž7$Ýv&½±ÁŽÏ‡rÉSUð‰ ò›8Ë๜÷Û¼ý…gœ†£bs»¼Þ½»¼þÝ%çæ†æ¢çjæÃn¬S ®JÞ¥‹£ù"ÇCÄpX¯JZŽ×óBZ[q1W ‡RT^\óê¼l8ó\'ýÏz<®k®¯(O©‡? ïh?)Ù¾n9ÑÍ7žغpU½s×OÓã <6g?DçjÛmIµ.ŽóØú|yHùn<ÝpÝm=…—g*ßeÌÜó¨å5´Fw¦Ññ uÁ™ººÉºèbÑ›Ö0 ‹ÎFîu' ŸæXo;ßpß õ>ÓC镸â¡Ý¾Q7ëÜøÜž%íÖ!º{T×S†××þ³ú¶n–uÝ]؉_ 3åù-‘Ù[®/ .TîÚàP½vÓB®Ãvôlxó¶ànkçú¼3ß/&üq×”÷§Ÿ1«„{e>×!×¾­c—׿À:¬ù¼|†œ!ÅÞj\‘<•«š²ý ÓL¼8Nœ?”…³'­Ž£[ÇÞ‚HÒ€üÿýט[öÈÖ˜»O#P¼øŒ`ň¢FòÎü¸ÇëÆe?Ûf²j©Ö[qCÙŒ¢‰NX-.h7ÃhÄ4Õ>p@˾l‹2ûœÔ)ÉkÉ›ÿÓÿ%–^¦ÈH3È•A$()ôÖ‘0“,SíŸþËòûFø&IDcϬ“ƒ^6•,óÜ?ícóÎ_6ÜNþ K!'·[ÿÜÏ™ÆP*3¼ÔÍôKìã Xʼ—-@sZ*S᪦Çï€o 5«íaVàik¬šl€y}àuìæ–S"c—; }¯SY>Σ¤·œX+‚q`õ ‰4PWLÇi˜ üw"}CÚÅÅG@¹(Ààsô°®žž+üÇ ;߉t´QCîY4l^}ûWÛØ-ûß<Ã{2äÑÚ’l,Õz²úñLìÛNÊV‡Á`mÉ2è%¹æDôyM¨ ½•p5NÝë*lZ‘”¤¹9+‹»™íæ]_âe»µi ÙþS3·×Í6õx·­S)é¹(‰ÀŽ=s¸CD²Ã¥€¯(D¬pÿ¡Ý{Ù0½®1~¶µŠ?Á¿ñ¸7Y ÿ×ÇëÈÃ5 ¿‰è«‹À@­}ÀlEë¬)®ò·ãÆJ” €Ãt;äF[À1±îEú Ä¿ú2Øú  ŒÕÛ`¸äðÑ]O?úŠrG٢ǡi>xœH®/âñÌC¿ÖΆRV€’Ö©a -¢21º Êt@¥ÄšÈ¨ï€v0"ƺH¥ÙäVKÝVy­Û©c*›/ ¨øÆøkè§²-j‘D™»óÓf#÷ µyÁï?ô÷/n‚Ð2ôÓGmJÊòåEï˜`–)š¹D§ #ŠÈèÈh=[ôÞ•ú‡û流—÷/?þ«¿¶Zl˜™ÜÀù/vOŸƒ?Ñî•ÿ_°Gãº&­á"ÏŽcåm}Ä9éøªV”okXcªÏHDGÛ¥5g´^›-κíOáªFã:Œ½þ ^nºô†€üñÿž¨>ïuùÉe8v=ÖË(œ;=28·Otuœ3µ”¹|EÄ#`ÎUŠè®œúÈšÏʲØåOz oMw;¾Ñˆõ|(ž×ž_ÍÐG'¸­_.§Ou¹;KÄ-1éíòèg5è»ßx5ݧò>èvã÷ö=ùÛÛoùó‚Î븙Õ%¾ú®ëIzþœ¸/mðF«]»²y.s^}Â;1\Ü‘ÛÖüs=áÉ"p…Y~#ËîÑ"v»˜\ÜèKÐí«ÜÍ?j¾¹î%ùïŽT<,Á¯F_›;?ïà]ùüÿž{hè±$¬ë#¼­ÎäýϺ§FbŸëóΘ‹úì©ó\×ü|ÀéÒÇ$ê=qôN¾‡$%}VøÄ}ºßöÂuvàù}çó¢®#>Üu·Áô!Go†Ï2XzBÑyÓ§é(@Þ¥?Ýzо4ùFzççrpzjrúøfŸVe>ÈfžÏåÇzæ=¨‘.—–G)Ù‡‹9?“£þ<¬ìÙÂË3 ]+Ý_].ñYæó)»n*ôøà=jN¢;Ï%~n³à~ qc/sf9óè9õ ¼Óç nx½ý:tÓ_$‰u¹Y½r-zò«O"Š/HÚ}ÓKwrħÈs U8ºTÜ›¼¿ýÍ?/v}nméFš•RŒ$kµÉ«™¬¸=4wzHD1´©œ»RüûË@XWï½[kÚϱÙf[­Á,#ŒÞÁaÛ’óR%ó¢2.èóB#éÌJD²ŽšÔ4Ê F]))¥Ñã·¿]Ô…aE[b×Mžj2nßOÓäJo3Ó€©Û&Ý™ÆædWª©«¨è­½¼n6Ó$xt-KT/lnVÉM}¡rÁè °i>Q‰ÞàECÈ[É@­(›8ž‡ÌAd×L`c›¹Í]Y RñáãN‘L0Xµ²Ì½+mZEÀU‹ÏÕásTâç¨M° è+v|­PŽƒCW0QIŒ® ¨¯ /Ðh@E&ļÊîçþLiˆ„詼l·å§ßïçŸv}ée S%Ü e²`8«³îwK² m³yQ¢÷eyF¤«óÐÒ—äü£<¹›j5 °íôÊÃz¦ ºÓ(‘¥” AùÃïhþûßý®·¾Ý¾l7/î¾ß·i*ûe¡×e^êT¶›Í Ed).¥”Ÿ~š#r$H†úo¾&MW Sò“ 8®-b…A!ÅDNi m¦ˆ0¸B4ÀW¥Ëº@äl;*OH“0Kp"‘"á#¥  )¹oê㨻‡2ä±Ð­Mè ï=dJn:d)Æ<â§Ï´*£Õ£œ¹'#· ‰"$3Ddfk•¶’p¢¬þYê%S4°Ð©I¢w,Mfüq;1D²Ö2†ù«W3_²C9ÁÕn¶eÐ,3 «W¹/îŸ"[f0›B®bÑ‘:n²'aDÚ Ì7XM £x…Mð²»CÀæt ÑV…zøN“è%ð,g.IZËüë(ãà$TÑõø%±öbסîŽT®ãâm§*þáÅ=}‘ˆùg¸éŠQØ©ûg¸¯=‰ô¤‚Pá ™(ÊsD?ذ½£ÏEe8øC§zà`B£r¿®W©”Ã#kX£û 2ª†Z¹öÖHC Cn yì` £»—ɬÔ,[rªeš^^ÈRjbû+F`[UŠ™Ù¯hsÏ¥wÎÍ®Eïø›¿ÂôR~ø1æ­õºU¨×¦MÔ‚øíÇþ:iªNצ™Œˆž™­gì=#ÿîßü[ºm6Óöõ凿ý+Ò`&NPߣ ³îãOªž…²oÜ®_Ê8¯ ¼Íãä“ ]Šk$ß´)zé¦ïs…hÑÉçYõwý“—ß¾­ûjÍ÷qîU7žù0Ýš<½Ï$>žmÂrlÞ\_ÿµ2ÄSÉì-ùƒ¯ø¢;Ð’¯=ø»‚òsèÐ[ ´·o{ò'7Z9Ï=>¿H£ã=^ëÝ«w6B®÷…O0Mo‡5½qL¾¥ªýïòó þ'¿#'Ý“û¾Ö%[Ït>PWÀ¯ZioòÏÏ‚¾à/¯¿¼þòúËë/¯¿¼¾9¸¸ØŒ ¿¿L÷}^Wn6¿„¦ÑƒCàHÒ N÷ ¬pñ¾óôaކŒd•î$¥R‚4Pë=’™sÐ%€ßÿþwæŸvm?÷„Xª—Zª‹¬Su'2ÑJ2UL‰è n¾©j™UL)2 ³§ÅL3“¢g¥¸)zhnQG报 †„–ý¼›Û4mfän·|ú´ƒÙvÚn§º)%3—¶xqZk™ "zŽ‹âø’¯nÕÃÊØêÁxà`R²ŽêÁ>ÊC‘¡!úš¨½¯ëÃxÚÛ8‘ÕOàÄ÷0mA?ù¬‰G,°3T_ó Ç‹0ú|B);\Ò@Ûÿ¦‰4wwMµl75+»—÷›ÚLÆèfn¯ÿêoâÓbvhîÛVÛNøí'Tw3‹ì‰%àŵݰNËÒʇ¦ºí?¼Ê˜uR¦h¬­Ã=‡7b&ÑcÙ͙ʊø‡øw4ó©LÛió²}÷«q¨çDÝ)X«-ÿü¤Ž¿¼þòz*‰~™ ØôÊ_Èz£ÁvßcveŠðÕsþç–«ÔŸ7tþÏìu~t—syg¯’|gèˆ;ɪGuŒçé««it½øð3#¨œ÷ÝOLKG¯Ë£°B1NêÊgKþo+FÁƒLÏCiç^ÿ±%íÔWv<8^wÜix\Ä{[ñ¤è󯍼pJíÍlûà §:63ã~U2ÙZ©›á…f«s©Zö¹/™,¦Ø•­«§ædO1ÔeRqµ4/›Á˲‹T[è&GFO2*²Å."h^ŒQ°̶)˜P§-˜êE¤Ý ËvJ´Yñ²Ì•¤¿b1|åz«£ÇZEž}M (૘?¦ÌYæ¹§°Ùn–>/ó€^¤˜!z N`^šsr¥~ÔÂh#õêqxYYÿ ”-ÐX;˜EÕ3Úh&^[4ÁËz:›[&‰@b3!ò@9O(s-6¸%}LYfp±@saËw´œûÉØS†ž )XAÉU9´b^}Bb‰½W+r4Cx‹žÌâær£Ïsos‡<ºMÛ Xo}S'+î4©×b!íç>ò:˜»eæPÿÍKd/ :d‚Ž2Êeo½"! H’fZí´*¶–lE£ú”<¨ìIsMHµ•ÖsN5áÕÀD£4Ú<¤Eœ„è$Ðn$ؤ4UgO)Ð?v@.m s&‡Ð…-)©&8YÁ«äDr`ËÀëoˆ½@ÓͨXÔñ¯$­èœQÁÌ‘,°YÑðqC"lଔîFCHa*BS’T¢+˜ˆÂ¡1C t©œ|1ïW¼ϺÉö»\R)™ÃÂÝFþfŸKZ*`†´ý ߬˜û•7•˜¶h3–uƒÌ5“fBöSþÔåJÜÊXgßð‰>b'¢ÌȪγœ{±úmõ*ISÏÔyúÛpÐýÇé ï…‘ÒÓ9TO‡¾‚$¬bšvå##\×v"ªÃ*2Ë(³ˆR ŽÈõRŸO®}Eëö­£ÉVDB(/(†ì(/§˜*ið >!…Xj8U`e޹|c¡ÂëT6›Ó¦NÛMÝHÎͦ|lÁ’A›^û¾÷OKª]/¿záÛüë÷{+[ >í—R‚?íÒ&”—¶™ðÓû¦©àoÜhª%~eŒ$ Ñf–ÊÑC©¾´ìùwÿæß&Pjyùáýÿêׇ–C^ô‰ß„D׸~>nx@ЏŽïQ­-\o3å÷RþšNþÖ6=·¤Ô¯’‹(íÎÃéG_ÆæÛÚ?ÃÕá:ܼÿÔ¼z± :ß‘x·•ùÍ•õ_Ñ[‚çñ9X½ç Ræî¯>í.÷㸵y»ßÀssì»üœ7‚Dn‘2ß.¦Ÿ³^Ïg÷ÕÜÌ}ãÝ‹ü€þp]zÛ(ÂãÒï/íxËüÏ:¯‡‹8¿põ<¿Îoéû¤ÚžÇß…zrµð>//|Ôzr·‹â+V¹Kiõr”žË ˜xå`´§·—7tïkbØ¥(pîæ¨KÍâHt¥ žåõdîâP>ßÕu®ß}a—ÙÙ伄]ܶ3¤Ã%^ãpûÍ e;ëN œ‘Ïað:i™G‚ç•f¸^Âúa­ß¥À_´é|Yûã]tù!ûr@çóìðøl"¿[#]%t7<»é0=ûŽkx=ßæx ¦¿Ÿ¸8¾ÓÑ^ø(œ~sàbP¸uÚ î$Eî-¦zH Ï;þžDžzx}xùž+–þCYžO“¸X^Ž­#àêìF>»ƒwÝ(îgk/Æùµ®~¹„êØ7ýÆ'è“ȳÜñn‰¶þéÙv°Ÿ38¯†øãƒ¹rú¸zª½-evÿèÈ:‘×ïE&àÁcI÷¯›¯z„â»5“¸×xT¥Ïÿ›õá–E^2Ûø7wÛ8ͳc>»iÇtÄÕ>ñþ±ó*‰r–!x}6Ãx生e.¦úŽü3áÿ˜ ÖZ÷¿º\Ý# Ò ~ÿa|êòqßös›§:•©²¸y-n¦L–¢Ô€4+‘´è ÍÊ€OnŠ‘µÛG‡ª™W(5· ›[L•FÐzDîMSdÒ,¡ÉÐ[¤PjA&²GFLÓT¨4¢w3ÀX¾Ÿi P©ŽJ-Ùv å½÷¦ ¶lsÏlBl6GO„@sŸä@ŸG|ôýÖ #'ÙœÝ}š‘Œy-…+ØÚB,¶)/éV¤†lÑ ÂÊ+a©¡_f¤7(Ûÿ½B[/È¡f@"Ðzö2)b·ì²Ü H˜Cš/k®ùˆè ÌQÊ ¢¯Ââ`ƒ´¶jyôäGkÁ@u#ѬbÚ NØP ¹ÿ#P+z[ƒmàM3¤ù ¢Œh7!‡Ó^Þ¿XÅ;º­ø6#[[æè”mYºû¹G JD_zf7-($Ì Ìƒ—B*YJ1z›{N#Ü`»™6›IB‹„Ð#«AÂþck=ÌJ5fä>gA^1M>y™gÎóŽdñ½Ed«µFoRz±íkÝÍ&`¾çXkÌ!F@A ºèQdäs 3(ØH*ŠR°µK‡iêTkØHY:`deVXƒzœ‚”9"ÕØR&’@ƒI Z@ÍX¸‚ÀÚ˜þЫ‘© VbOôÐèH!á½ÆPü‘d Áyt¦I$dë)j 'Üehnž2e+àñi6ò³´¥KšˆN6 ‚»ÁØ3,Â>zI¸™`4v6s #  ZW'&ÚÖÌ î|q W˜öJƒDüPª µX“1£ZÙLS©ÈßúD l`ŽXYý«‡‘†8CpL¯­<ýè¯I¯³-Äà} OmPûÝ žèÌ×|̶/¯c·lÂú]ÌÓ+°N|úKÖ¼`e…ó fŽåÿ`‹=2‘0GqÈW¿ÈÓ±V !Ï­ðeè :n‹À&ôý!å µáÀÙÚa/ Ð$FÂr¤Ç¬€ãMP|M"ÊYªùÖû>û>˦wdªw‚êÁA$Œ'nµ”ZŠkƒi2N˜¦êÅ_6.·wûÛ¿Å~IB-Zköò‚Ý"(§’¥ôÈüðQ›‰„Õ"XV¹ù~ÉÞ)#ãCL…‘åÓ'ýð*[#§LD*[Öô‘ÿúïþM™Êöe3½¾þø·¿æEaï\˜qí(u»Ó¸!EÜEV>ÆdŸþ9c‹K©«§ Ñs3öô‰Yç}æAtQE6Ü›ÞÇóºêãRS¿°Ø»~ßñb7q uU^¾Q'z›§—”jï;gìJŠâɤñì>žo‘ž¹/¼Eï^w:7U€wÕóçˆö+ÑùI©ÓýÉþ"nø#´:ow’_·y¼7Å1vn çŸñ?»G¸œ¡÷ÿš—3tív6ËÌçyŽóíϵF÷ýý–‡þí:ø—úzÞ½éoQºÿ óOL,æ”öXtØ;ëQîùX×HaáLøvÓå:ÿMSÞ8áÿTL·ù§ó÷,[¿Çèðóù¿¼þòúËëçz ½a<™¼>“¨¿óJýËmŸ¼LQð©gú½É/»õ•´S¾ƒ—»ËQý¯S‚˜ÀÇ•Irþ°‹ÈlÒ2/’J)î>½l}rA¢ÑàΠÓ)eM²[¦º“(¥´î^^¶X<¢ÇØòïöt/ÕFoýe™@'Ð{Ï Ð^7"!©F¥–t£’Bu’(N£9`ÆòZA©§# -b÷1zJÑ•‰.6eWöT˜9²n^ÜèC¸NZ¥)»Ø{äÒUÍ­¼¢øNXšÁk±B#½’È–V«™)Af×bNE(³íŸ`eóG©i¸#/ʵÒÿä}Èáðiˆƒp(áPf©èÐfL/«3°—•²mu… ÊôŽ!Žõ4°â"ÿ=0âCâOÔ kÅ®bEÿ° 4¬Mµân,!F!0Ñ àH„€Ë~È”#q°$µ:æØ ŸÕMÙ’æÅ"—â%–,6uõÌì½3?ì‘tw.奖eZú’€¡ÍCÖ4Ks/{è£ÒßËÛMÙnJ*ÛÒ¨ÓD:„ý®|÷úbddà¥H@²¸ )õei¥T%Š{4…‡ËÒzOb.mü02uZëšEÁ‚ ÕJZ c‚H@BR‚Žüd‚¬H„‡Dªf0,{ÃPˆÒ…E"1";‚‘M)BRœ0ƒ™´°jªÍzBP“&ÀA*i@LTɽrä$ ,D—‚à€ËpÂlõ"¦Å™(D/¨„уٙN&29tiܸ/¤’Šì™YL“ù¦:¡Az0§j ÒÉÀŒthiÝ FgC2g¨Ž&ãK14ª)[ʨ8éJ( “ƒ·–Ë~IÕ­gŽ»iéß·(uEl 8ֻà ‚×µ.dÌë•©u ü ³QÎàóÈ‹2»—M?LüðwïmóãòÏŸ4Ï‘™G×\®ôp@kšmp¨Æ—Žïu÷v ŒõQ ÐÓÝ×:UÈ×u€µ" |3Qêhå€ ½­¨+uƒÞ‡Vjÿ(ê_ð°©&Ø#%¦ XsJv`ú'䜑­¹CßÀ9‘úƸ-5jYFoDø¦@MeaÉÞ3ŒÅº¬Àɧê/ÛɫÜ`¬%CÖÓ^&Ωm1È6®Í6_64ƼHZæÀ†2Düö÷x÷¢÷/*Fº~xá®±E¼Û²¸I-ºRÈ̽õ\zôž=ÿá¿û÷4›^^~ý÷Sj} (œJ¿¸–ýqƒ þr6®ºð;û—FCzPMÅŸ GòúÔ÷Oõ»?ûp>ïvÌüåõ(ðE‰‡?׫ñ8ý·ºÜÞ‹«ÜÉ·tÌ<úóÀ[ªK‰óÏèÌ+wâ~À¥ ÍëÔÞYþ'Ÿ±?Ô’ÿ]bò®2¥/€Ðð‘œ~ªqæÛFÀÜp'y¥›z½’_Ø+ƒ 'Þ»g{QÊÁ/¼?×Ù5Nås¦“_vùŸ|’ðDläÃa|ñ—7ì ³ši^¬Þºb¼5v¹µ¹Õ›¦ok=½<‘3ËØÓw{5žÙã>^Muu#È»ùð«ût5äˋs[TsÞ®ñ5×-*ºÌÝK¡Ë“$ H%3–æmQšœ)ÀÌJ™Æë‘›í„nˆL²ÏËd°Ö0Õ^kû´G†oj’tC1¶ÎÖ×úÊHA¨‡”Fz¡GB(uQiÈÁÐ0£Š+B˜i‡!j½)[´…-Ô{¬ aZ¡ƒH$¢ÍÖ˜!‚=‘¾©Sus+›.öp•b°õ §©4ÌV%Ýú2ƒ!=½”ú²R}?†¼—z_ÇK f+Dûß¡à¯ËŽÝút0kAýæ, ÀI°®Œ³œ@Â&d¬Øã‰ÿq|þD œ}YõÄñj¹. L[(À§uœe$¢Cqîźx¬¢äÚŒtࢬV}êÑ{ddFìÍ˦MÍ&0ɼl]™™±ôh(VzôùÓJ£ê=ûòÄO¯n¥”LE­O?¨nÍYܽ¸õÔÒ:€Z«jKH¹™êè~)æÝ=¢+"#{ï?îÚÒ[ 7Ë®Ì,´:Õ¾ïf+…ÌC—/ƒÙ“ h«Ú ÁˆôPõq7W{— £¨ÖÉI0hA—>¤<ùâÌd'“èR!%F(”$¢F¥DH«¨ŽÙ@#¡,àRYw)×Eeö$0bÂ,å¡ÐËHÒðÌü ¨!„4Œi«‹”ÃÒB&–&‰)AÝ3R-”4d†Pt¬Êf­,ŒH3»9­ÀK1Im 96é»L£’•ÆÍàÞh K#÷ˆRì½9RYÍ6ÅäœÚXݵ¥«¨¥NµÌZ„h ^1½¬¨.LÈŽ@[…òÑP `0Gv´OkÚ GÖðÚíz}¨t;âþ-.G2/À mðØ@qâU|ÏqÎ;!Ÿh«gÏt]Hóø,°âóê÷uãØÍAœq®¹íºÖeI¼‘Òª”N„sòÎ?Åg‡¶"6Lew°æWQÕ o4VÞÀó%ÝœŒxûöS6âœ7)|–Jxb:´u/°ãűò\c=}«N®¼ ÷X@gïc–ö©SלÎ÷Û5Qo‹oxžÕ9D%ºù¸›vÉ‹ãÑUŽèa§ <^Uº)ïàùü1χÏ3]ã¿x™Ñ¹Ñ7ï¨ô D¿3Ôx¼¸èZãa*é0ÏðýO.þòü¿:gòÂâî†7™Á§x]Óf>÷Ô:ÖZÏó%åò¿¿c‚‡oœÝ㛾»<·¶<¤¦ÿT@ßí|^–}ƒ=â—Oô·‡'q陇|s½û/饇հüþwîÏú¥?¿Ó~ârÀï1Dvüãþ¿‚_¥Vøí^v|óãóéÛ¾ßÓáM5vw~r™[å÷8”?örp:¨CÉì"þÓýǶ[¢÷QïOƒ¹™»¹y)¥s‡™HšU·ˆ¥2DÙ3 „´4´ÎiB1)))–Ùj1 ?Í…ÄäCbŸ¶Õˆž1µ»Ùj­îé „LN53*nm?×R3³}ø¤ÌØÍmY^|™¦"ÂIí[ö0KÀćŸ”È û~àOr*ÈŒž]ê¹êpa$EÁQ „EFÏÙ 4³êÓÆ¬XÙ c€µ{Jd™ HÒè%c2L‰Œe)VÊT m,‹@+¤˜J1"vŠçnZ‡RË!HÎÊÞID[›¼®„îž P*ÄUÁ?šjª fÔC )GÏ•§aGv` 5ÀÀºr½y¦Hf¬9q/ ÈDuL/ˆJüîQ Àp 0ÐÀcféP¼¦Q_V¢:0Û/Ý<‡|Œî]átS~üØÔPKÍ™Š², ¢%Û²Ó²Q Äáê-3$l_UªÊ ¬ —âÅÁ!ªD)…à²4‚½‘ Ñ•Fн¸ç)¥B@ë=ú‚D_"2?~Ø¡›NHÅ` bßlQ°•Ec’TÊdÌ5­­ ×d­EI¡#$Ô‘Ò&hb8Te7Nb&[dž|-R`OÁX ;©å Ã ¤£,Y0,˜Ò º‹¢™žT*…aC½Ê"@“ ž‡çè\°ŒsŠNøE£ÉÈT\…‡æ:£‘IµPBÆ$`ΖÄÈs$†Ò¤©Ö%'•άî e_XÍ™RRKfÂ6àš<£Ü‰¢É¹PV1§ì]´ŽJk°¹ç¯£îjüÆvAYÁ;Ÿôm©;-sôÁׯ¬¢·äÆ Ÿ`¼bû)ôÝš±;"wÖ=0÷¹xÚ)VqL§ÙañÒ|"ùª¶ûKÉ×k­£m@?CÁkýœÑâ3~’¹Õãk”çÛš¦ (ÈÑH´ö€qµ IÇûº判Q¾m¹Ý¸ý(ªoøÊ;O'é>ëè¢FüÁºû9´·”ðœ·><nbåó>€çŸui¾t½8Aî'ô›Ÿ òÎ;bž/§!À—8¶1¬ê¿®úÖ6,î>|Øýî㲟³/V¦J£¹ÓèÅËfãf’r‚Fe檑B!;€H¯&y ¤PD¯^éìRÚT6›)æÞ—Qðªå§=¶SôÅÈN²õø¸£›¿:—žÆü´g*_7ýã\«#bó~ò•Kä†`kóO;ú¼Äoþ—÷?¾Öí”î ” bîÙ; µÞ2#Z¬µ"kkÑ"³çT ˜©ìi-…¨îS­3÷:1)³¬ s@ Q27ƒBÑ[§fÙ»²›R‘½GôFIddv`ZŒÆ±!”íb­Ü4ôX¹êhS]ÑÛs[Kzkê$Üà:‡…˜¶è ˆÕ×~Và¹Ç¼[]C3WtÏ•ŒÊO3dƒ ØÈ±5±ÿ€åÊ ”Í*Ž’Úš®À±ÚG—q“­¢dÚúEÅl*u¿´eÎ>Ž›Z¥œ{+t§¹ùn¿£`ª½·ÔmÇÂdmð÷ ¥”Ý'GÙ¬½ºOEº•iSzË>7f6Ú3JÆTŒ´ t-¦¬›²@mîË®õÞ#kJ#i(SÉ6Á*þʵ&?†J¹!;âàÁ¡0v„!C ºAÁEb’tÐ0%zQëe+Št†“Ê$’l“"U€n„Ð8ô¦qØ«ÎÈ ÌT–œ‡:/xbÙ€Øð€YÐDPÃô`*­“4 úSâêÇ9æ½@ˆ2ÑE}­DQN“q¥ÖÐQÊšs ¤TúÚeÆ1Vó$v½o…‡R‰¶Ò-ChÌJk=)2ÙÇw‰ÛbM™žªdÑäPbÊè›-ߣ.™¹ ·Š"3ã‹{Wÿû^ë´™Ê^sÏl;€°tx SQàŸ¿°Î”Ö¡XA[ã=LD[ùûÈGÉ @ ŽV]‹úøvd jªïnÈ<¤*¹6 ñ0•xìû‰h”¾zŒií0ñí¢ÁNÈ` F›f$ R«Y±æç5ÃtWK€#àkX€¬vÇ<¸‘'ÊfÍh¦£N áÝÜ r!KO=ÌêÆ7ïa•æêP 8’™£ªÚ€b„²õÑñ›ÉÍf5NÀw/B|Œ æÆr¡ èKÑÜnkœ©9H-i4+ÎÍÄ©æFš¦tó—×åç v„KnÆÍ$#ÌÜÍôY›ÚbIÊÈh]-²÷èÁ«oß¿N/Ûí¯ÞE+åó±ö(Öð,ê²Õ÷º \çß§6Ž_oœkŸ«Ù¿ tÖ*úíµO9™yŠÏIí?G ~nÂùµ»$Ýn//ÂÃèÆÐéJž:7¨ºN|ùAÙN?kZåí"Ýw|ÿÛÅës’þüQñò­ð×oî•B?'¤ß%ýéV?Ÿ}_1fþœ ó_Úðü²|Ûl:™ßmè>Œ¤@n¬ÏîÕÕØ¾{ñïNŸ»8¦»ù†ã$:&®|§Ût4Þ÷pIe %šç†³çì©«íêwÊ÷ wë)xi*}=Ân¤2‚Ÿ‚ïøhëY‹F[Ü•f| |xaº Œ²¤»g~!æž‹'wOæº=ò¹Ñ¹:|¸Gࡃ8=FoÒ:»¹‡c8¡!ÏÙúL2DWjõ•f­ëº|žÝÇó±z˜Òm|zð9Ÿ ¤Ä3æ“®†Ž¤`^ÝSž²OrLwÚj½'"ØÍô<Û c~h{=c@]nn‰G™]·gšòi`sm9cñÑ0»¼­·Ì¤{$Áuu¹¨?Ÿt—íµOI/wwz³¿A˜> ‚ë:T¨žó¬N¸^5]é¿wèó7E‡‘uíÖqì(>?IÔÕ|;­‘GyüÉ.äLX犢çó ‹[æUø¨ƒ<£Ç›´:מo·'½8½KعÚ~ü®'s½ßxã“èúÍgåçÏû»‘îþñàq~©NÞO%_ø“„Ãê¤ÛL€p»ÅÒÍä¿ÚÎ?hOöòŒx¹¿½ nÆ»ì†wWøôÓO»ßŒ¥)ÂÜ}ªe;¹›¹g&Œ£ ‡¥'H£’&ë™l߀7ZgO¢ïçRÝK)ÅzÈK!åuC±}ÜYжuûú¾í>¦™õÞ2³ºKFyÁ‡O(Î¥»‘dL%æ¹ý´7“hQ2©$ìe;etüö“Eöì–nŽØ+ö=™°d2d4# «ì£à7²I|·[ŒîîmF¦O“Ó½øT2Rʤ›YQ,«j´ÈhµÑ€ìƒÎ.µÔžØGß©‡ùZ“‹Q8¯U8æaûªÂ;mŽhÈ@$èk9?FcXhúAy'àˆŽLxY%Ý_›&¨£þºÒùW~‹`ƒ¯0pä:2WûßÔAÇ(Ù0.ÛÀ•¬0 @!h­Ív f(¬ ì(uÂ2ç’ %ˆ½q0Õ3¦–Nø;Ûl¦mD:…ynŠDÂͼÔPÒÌ6µJ„UXÁ€ØkðI2)š9eóÇÈQmN‹H:•%ݹª®L&DS2;–O=æ4w¦]ÊR&woû°Šâ”`U–Ȥ5ŽÞ‹Èr@6²­– –`gÚÈýÈEtæ@$™ײ(’r‡9m e¦¤aŸ|)(EÞYVTœ-ª æ2²HIˆ¡ý‡"y°‘ä9àÚt² xtòcf£^iª°5,È1èm\0ʈ6Œ*Dc<‰«ÒA(HÐ&§5&%Û¤ ÑMÂDTC¬i%²õ¤)¯n;äÇÞ‹KìK¨ˆ4ªbS&P`sÜapZ©ëÈŒ`¾öÚÜJµHeÉ 6r¤úܳ{¥ʆÌf uðEtöþu³‹OC÷ÇazŽt×ÚdˆÖ¡¢ ~l˜^Äêy‹ÃŒûGtÒjøœh vØ„J”#cÐÖ¤Ê`y ‰1¹Ô!'ö¢Á€è«Åwë(:‘ßkÎh&XÖI-¢ÍИ­Âðr m}Šx ÚŒ 8Wµ2lMoˆë²À «ƒ„† ɰ/ð²¦××pÃH/eûž¶ ^á…V!  ¸UĪ›ØÛ=”¢[yÙ0¡H›6V2Sæt£B(E)xD3yÎ%¶Åëû_3…ÖQ7x¿Yþ~ kصºÙô]ßËYë´ÝDbÙnªÑö-÷‹ÿêmʼtdT·¶[ô»ö«÷n„ Ô þÇÒ3Wõÿ¿ÿÏÿùWû×2ó~EÁ•”z¨;…¡:ªêºØVv6:k‡½ÒêÏõ;ñù=ƒÜÉÑ_S Ç€ê´ 9ƒÎ*E®(£gBÄ)<¿çAua_TioTVŸ¤xËä=©ã`|v°Ðƒ(þƒâ±êz» <æÇ|Ó›*;­›õ ñÿ`ºؤk§Öq…¤™í^ICºŒyÏ '\s¾‡Ûþ3ˆÅ¼Ø?ñYó\X¿{GînLÞ¾U¹ ¦¿+¯?}û¥»*?ª“çKRüÃò©óÛ»âæ/Sî~ao©îç¤7ÞÜ? è<ÏrÆÂWul<’kx¦ÞB¨oV×u9¸˜¸ƒ¾b¾$pä‰Ë…]÷.8ÝêVYÉEZܼ˜Y¦˜ñ`bŽÖ»ÄR Èe K±ÑŒf–Ñ$»ôIzï˨‘òªè0ãæoÿ>—¶|œñ²ñ'*aÁeÙN›TB˜^k´ÓÄâ›Í¤Osºs?/[ØÒÝ@ʺ­YÙ£µŽÈìúŸ¬úø?þçÿæ¯A,Vx[J”mN-z¼áô™.ë·n—¾ªàñþæ^MÉÍë·Y"]–üÿYDôT%8UžSïÄ GÓãû_ C?¨u¿ €?Êvà¹CÀ—ng¾¹¤ú~Àóbç+ÑùP¼¬ï% ÿ±Rˆ€'‚?èüÏ+â*Ñü퉟{W‰ß}û‚sžxò¶ÂŸï–ñOefKÃÿÊ"ñ–r̳áW_Ô§67u¢ú…Oäïü…ú™›M_rÑ?#§2×RÜ™]Ó¥3ñ÷J]½žÿ^oºFã¸õwFßqzã*EÞßð<{ÔÜ(º·6®¾éâ¢üb×Qâ9Uz8¬/mÔß Œú–ÀYéü³˜ì³ñßw¼vÏ~Ë‹ò±/ÿZ~Ã’u±xøÚÁqqä|þ Àïû[ó‡]_Z_zöàÕ­“P-Éž1•Ñ{Fº›³ 2 ÑÜYÈŽÎH%Í-"Z­l·5kauAé´í¦–iŠ,³.-{_‰p£;÷}Ó ú´ÃÒX Ìê%-±‹ºñíT—Ý~™gƒ•j~÷O?)õþ¯^ñá¿ÂÌ̲wI6°¶±ö12Z„Ì8ŒD!e&•]KVe>AÉÌÃ7V7Ó¼ÏÈX©ŽdŸ»ËÒÌŠ Iž µß/;µ‚ÙÖê6eS1Qè-–¸KÍÒzBBöCwgú8°Êîô•ø¿¾kÙlÙÀl-ÿP7„YE¨lŠ^¸žÒh\5Bf¦"±Àºà¢ÐLpPæ m†,Wáï4̸R;@DÀl`K4fµ?ÅWbà+T„ú ˆò:2C̘ÞÀ݇4oe“ÑafÅ„:,•miÙ2–l5aîÑC–ts–yî^Q¦%I÷µEe(‡½K=.RÁ½èf½g*!Ò:–‘ ¯”£¸­¥š×”åjf°º&‰ÑÓEÖ"EôT’™K„²eviæÞ(Xv–]ömÙ¼V‹lP›þ¦.MûñÅ>ÍmSÃJªÑÓïÔ¯¯‘ÁžÃž=›Š—(¥8A¤Ó FÈT‹¨ÎÖ:zªõh‘½g&ÁQûÿþoþêI§¬Îƒ¦µNû:ž8"~õÖ*þQ"Ñ[”Á—n®b¿HázWvеÏÛ°õXï/UÏøZ½øÂ4“GCð7艷 €7è¡?ßÞæëB÷Ÿ_­~Ôvü €?Ð%½kü=(.wNÿ-í/¿η_Ø?'èü·\ˆ¯ZËÎÀu|Ó€y„EºñR>þ\ßKϼm:ŸD¸×Bw÷¾ó4ǧØÝEXRÁÁ)þ®)öEgß±Ýëæ³ÏF=Ó nòÉ—Ùö+’ÇÛêpÁ¨y$µÜ©¯<‡~u¤m §ÂÓkÚù‰™rѤ»:ûý‘ÇóPìQvìÐ{„É>ze]~Åùuã[b„n.äÍûαº€ÑÜ$+ζä5¡‰ÐCYôP|v<·R÷5¡òRƒ¼BÑí€B¼7än/Åõ(âm&‡—ã}mjÔƒkz‰é¸½é7˜áN ù‘Ÿy{./Ä¥„nú·éÖ7‡¦SËðõ <®‘RGRï˜"Ü1U=ŸÁºòá½wø×-ÆwóhkýuËK¥0CººZ9›;7ŸÓtõ†SkñÑ@ƒçÕ2w°<ÎѵGâ¡GG[ã àŽÊ~ÜÞÝ%9ñ\r{ð<¹Ó¹|KYÒý¥T‹g-Þ:oô~Kèây~.6?íp<'bx û:î|žÇ ·ÔÝXáyžàTŒwgÛ~–íèžF½§ƒ==ŽŸX¡óz#vký–-ÚùùþöŸs<ÎýO»ùÓ>[O ݬŸê°ü]MSS™Ù#h& µ›™ÑI§L.A-z¤zÏuC¨z)CÆémq7sË6(§çT‹YŸ÷ÑCñéò›MŠq’©²É(S_ºæÆbè‘­5H[Ú ÍûÅÜ¢¥Ûÿ—ÿWIM[¸ÌÖË.7î6¨:zDKKìÅØ´9€Ù’eÒ³ÇPh—9ÚÒ}"’ó~±Rè–¤R© …鈙ícæL0zŠ¢O!2æè‹¸Ï¾(s 5ê<ÈÀbd :Ê„¾ûÊͰ&hüÕÔ“0À,St ß׃ I@>¥DÊ”‚H‰ePøèè=]Ž0€„ µ®ʇ‰ Pk òPÇ+QÏêñ d¬…Æ+ÜÐ;p@¼ ™¨åUP¨¾ÚŠ– e*1ÕŠdëA2zÎ}Þøôú²ÍŒˆ¨Vmbfd&¼×íŠ:±‚êè ðÑ¡ ‘$¢uE*QkA"¨Öºn_­7ÍŸ"fÕ­è‚­ËPPd`´HeôïyÙ'Ò“O˜Ì`ÆEB“ƒæm«›µèØl¤€’64\•Výq1À^²¹ø¢bTÂñ‹©CæÑ>FnÓ¢I™4 B„[¦Àä>3 ÅÁŽ]ÂWÎ<ö‰˜D" I ˆ$}tˆnp± nª£Ã„š ÉçRÒRHjX0¢A]”Ãl;4&73*Öq `ðÀ³'MŬÐ" `G*Lô w.]™áÁɼ¸MÁ…D“Õj&¨hó‚¬Á€K¼mÌÜf!Á‚Ÿ´dÈ‘¦ÊÐg,=Þ½ ÝÔa´b¶ïŠPÙ3cž?‚@©+z+ûabvD®ù°aû–çν‰4ä‚\FJÌU+mV}úÁëKFŸú©µÝfûBûÉøÓˆF…þ±êß]Aà ئC¡½¯\þÞVÖ›=,ÄG eõ°­@A_ÖB~ÙjG¼&û mA,kQÿñÙϯl}–ÄH6­íJãÃGRdýCC V€X— /!ƒ[‘*²$Il³B3[‰@&A^IÀ”0#]SÍ Ë,%hF°‡¸ ,ÙÜkñ6•@°øË¦,Û ¿›íïþaûÓÎ?. `2+ÛBÞSSáËK™Ê²Á'e™ªöÛ)hÊlŠÅ ¾“•sF³\z¡G´Þ羴楖ÿ¿ÿÞÿõ¯ˆäˆq¹ÿ< ZîIGZðiqˆ¨KÞãÙ&ó¦àŠS—{¶ã?| žgxþ—k¤.ޚǃí㺧B^ð'?ϼšîˆûW«OŒ¾»ÈxC^Å™Ï5â Ø’n5±»Å&úL¡Öq?q¨þ?3 ÒH=Q¬tGîÐÕ®÷ÊEî‹dßÛ?¹âÕ|©ô%y}EÊ}@îcMönMý¹|[}mQvïÛÏÁ»_}õíÇ™òíBö—ÊýÇswœ?ó6Ïtj¿%¼ß–½ûÌ=ÿº+JÒ]ùõù÷þ Bçu_=¾ùÞã—fæí$ºÓºÎZàÞ8ðøæYÌ/Í£¼qðmžò4žé/€òsò›’xß5»«Ç?ûŠòH~¾ÔáM]Ÿ¿ eÕû¢ë7.?pÕiF! ˜ç%úlÖÝa¬Kv–ÃG•†š%³l+¤fÙbƒöÆV0)%‹Ðji)ÉâÉÌ$míЛ¥†ˆAÐ “® c÷ ¥®¬•ô•ão¾Ïæ(òéðA*›lEíd% QÌ”D:AXJFËÌD$sä{Ö£2A;ì´XVÝð° #Úl5WìÏ:Æb”¡SîuMá¬+6¤wh¿j‹c1¾ö:ÐP&wmvŸ–ˆ4ùv³që #{dCss’ƒ»²ÝNK›³ i3’æ@ -@påù´ŒÌ”Ü<ŠÈ!G÷\¸|ŠH¹c*2ržû@G¤=sô],ÑÅD®9áò@#VûêC`Éf(Ž&. o”h!ÄJ|Ð!s™LÉR‘•8©®NžNÖ•‚ž{ìePs‚±kO5‚ƒá@@fª%Œ4µ>˜€QÉ=4嵚F)2e°6¨(Vrö%CÜ…X«ÏM0Dj|bRœŠñp1e®¾ÓÉ„0ü‚è¹úʤ$K@áx&á€GVØ©”z¢í; †ˆ‚Fu¡ˆ­çÄÕœ ]KnÍ6“¥ë“ú§}ZŸ¬í [ù;ŸÞ—Í?Û§X\™aš¶,t…”Ügï=še†ú‚HXÚ¾çðâ•øcrŒ¢û< ãl0Ct~®t~ tOÓk¡MéxA©BéVBq*ʯ´ö‚\ ±Sö¡øŸ¤BGâä>Ì-¦ †51ËG(P_Nè †[m}€ØcxÄg äÀhî1`âð ‘«¥ðIƒÔÚ½´v<$x—•w4RGm,ÀÈšØÚNd4Â^áB…d6“n e3Ú$ÝÜ0Ü]f橌„we¦B4té/ÅPlV2«91º‹¡òwÿðòncSɺc-åe*I¸Í»¹šs×Õ£…øþ…)xÉOZÏt0?í0Mîãqš2Õ#œ`Fo­Eëá W/S)S}ÿ·¿µLGoäs;ïK=ÆwªòÎKDpYWFò^t¦ÕéìÛp'Ž=¤'¾ºŠùʲèVW}(êé6FÂ/Åúåþ»'›§c†å ñª¹Bâ›;Èï\nüíøRöË“º¥¯æÿYMí<»«F Ài%- 3•|"„®ˆ ÕVõßa[¯ûhYr”Œ]œ‰|†k­§G¨­m= ¤¨¤Áê/(/!c)t8P脽8 ÏX6à ùÓhjqµù>wlx@ñJ7NÅõ&áÙQ·ðŠeÚ ô_ …ë¢DÂn ƒâ¬@% ¿a_|(›À è«gÉði¹À+RÈ‘ãiä!±0Àÿ.(3¤äJ"{ÝTs¤ºPôhHE)ŒÈ)¬S¢†Û‰°â^Ù~·dköZý¯ÿ¾šùnÆfÊõÞº¬Ô˜—B˜¨©bßséòB£-‘U2#àfÊ Ò)Qˆ”“J°ß·ÞZ¶°Èˆ P&¯ÛÍ˯Þý»ÿô?œᮞ³°µÛçü±=\T¯i‹¿à]àRôC!Ì)K¡/;ø§2«žË‹W“俈œpx\›u1º¾ÝàšøzÝ&¨þˆ›¯V9¿Ô{öO{ÖÜ«Áÿ¡úO :ÿ ]Ñ[zôñ ðm‡Êí'lÊ£Ž»}9Oüœ)ºg_zLäÞ_Û•{ú?» ß¶¡}Í-ç%zEŽ€Ÿ™$¼"ŸU’óL­âÅ_žE x{ ÷Ícã $_"CtÍLçó ³ßß°¥nD˜C/H9ⱸïªâS+ŽåB«ùÌÓü¶KðnÚàx„‡Ïæ-/æÜ¯ûâ\.1F7Ôé³Ó8 ‡‡g­ \ƒ_žHS\Ÿq‘¸äá˜t$‹ÞÁõŸnÍÙ%»í&ºí~= ;Î9C<ÝÙ³Av=°ø0C£³Öˆ›Î'ºCc?ƒäyEyì¾ýØãpº×S| ºb£é²‡Òpž(.É4«­50Î ré±Éá1Ýíüît¾^]¨ã ½·šñj7p¨Áj˜‡ÛÛq‡@E ØÑ±Ž­ÔÇ/Zç¶Ž#öØëyïJö?}úÍoþY)Hæ}0‹€×R¦jÕafÅi4ƒYi½Gv)S+‡‹J¤ÜJ-…‚%¡ dj·ì«©xq1s2&b döZ<ÒݸÙö¶Æb@,s²€Þ{ìï'ÛV,õþu»ƒ¼Öe¿h2mnêùñwŸ0Õò»ÿ‰¹ùê©Ù‹-¥Gʲ˜X»ÂsV™\Ñ’lËÞ¨dÌË.ØÜ„ÆH¹m0¹²d’,fd‘§e2{kÑLÕG1½¥²Kg¦ï}˜v+F€æ‚3´Ë¶¨kT¤ª!g˜¯æºyœg‚ùŠá.[€èË`¹À ö4¸m¶Z5VÒB½‚”"f.qT¹“CwdÑ%³!§X†)³¯”ɶ4DBí c h'¸9ãj€}2gf£q}Íà`o dùøŽL0±ìQ*z;”Õ‡jnJö¾DvCQÇËË+ió~é-L¤¬õîÅ(¸ûi9x›”SæZ‘Ý‘á ‰EDš»Ñ̌٠Ȟ餭©®áìHIp ÓEÒƒ2AÁQîmEtYg-@U4&±šéCŒRE4šE C“6Ž4v‹{óÈÌþ. +´Ÿ9î$;kÊ*rxÆvΆè‰Éàâh:@¤\K¹IÊ‚Vj¿˜ÄäcÉ#“häÚ¤±¸,–.ZÚÚ4ÎædÆÒ|·DÑÌO­ÑÒFW‡¯Uð6}“)I#”ŠU±at·ZÍ*mJ:Tlª€E¤O¤H«¾™0®'™A«[š¸,©YXä£cËsLdmåÑd‡ ÀìlÑ>A 4Lïõ5 P^Ð÷˜?Á ðiErÙmÊ|d ø Œõc£!û˜¤£Ç¢Ã:¹öîŒq<¨eà Àü à~`F²ÒÜ ™-å°L&B4B±Ì3©„úÒÝ™,Ãfžd–N¸Õâ“ü#i­Ç¾·Þ5·Íÿö¡Ø;ÿû¿B”ž—­˜6UDŠæ´òus2ÐR¦Ó'{ٸѴ>ÿ”j½3r鈈P(§©Ö—ÍËïþýú?w6Ç ŽñÈQÕ¡‰‹gÕ0²>â.O(—·ñ¸Ï¹Ž—õ´ÄCwUóK@Î÷wû_G›U>°<çê ”V°Dwyì1¢ˆ<ìU ­(´ôuJŽ¥²ŒÉŠcšF?(%f´i¦³šrze©´JzdÔ§])T†×j¬±„`f ƒ àÄ¡·OðuÜef˜§ ¹³ƒ ٱ̈́€àó–ndbÚ!òXõÍÛcØz³¾¤™´J‰HÐa#OP·ŠM>|‚ùæY‚á·q–,Ôø­Qs5‡ãðüL!.ešhF{Vp&\ÆâSÏU±À²­=2Q¸.*áœ*T™NsO ³Ê>zªÏ°¹àÇE™¾ûÞͲg_#÷k{^¹ïþÝœrgH!ÛM¢µ–&hm¶›éÌO¿ùøŸÿå_ÛcioA¤½”VÛüÈ뼋ÕûuUDté9¬Kæëâ]‘ºØÓJCŸ>¥¾´Vã Êq ÉÌWÅ”³½‡Úÿ K?K Æ—ëãzeG.œ«´/µiº÷¥ç•§çeN_zH·j?9¿åŠð—î5¯4â×…Î/=Ô[…T÷ktîë§·¥Ç_¤Ÿýa¤ät^ÎüæÞÍ ¼{2è•*«¯v_ø ˆ7Ó$·ŸüþÏŸtþ}÷×›éë󺪙ûÊ›èçjCE?çÆ?ÕÇþ¨á‹~}ýúúõõëë×××E©¿¾~¦œÃ¯¯?¬~cGzÜBWj¼˜h§þÝ¿ù›¾¶X[ô”TzZJ©¹–©Íj)î(fDO‰ŒÈH¹[-eCÛ&&/Ù{ïQ¼¨•ŒPô\dÈÙ»>|ÿ1m޽š'fëJј=;úd³±@qIm=¨Öú቟—d®¤zfëñãa¿4'vîå‡u¥ØõçC{nëšµúÿ¯ÿñ»ÉÌu‘^ ´èk—Ðj²°:ÓzOBˆE¤„†èuWÌ0{·ÜI±’ŠÈðN)VjFÁ¡DËŽØ}tš';­Z_W3˜‹Jª›Š®P†R‰.$úŠX¡€qÓú3a^P‡*'ø8:@#Ì2¾sÎRªTÍiuÊ­$à¡R˜Fú씑= Üôî,ÊÌÖ³G®={WtZô½àð„ìÈŽX¡¥€†~Ø>Á—¤ªl0IìÝ{(ƒÃRx˜£‚ˆqÊH¤C ÔЉ%ÃYH(z[[®È®R\4Å}¿?@Ô,@æÅ'/„-KH™ÊyW3¢–š™¥âùy‰Hî=Gµ²¹e¦3#m <“ Ì·ô+¬²µuÙ/K¤B²QˆIA¾©Ç55ŠÁœr¡ãùwDAZC„>É¡”Ѓ"R¨I§§Œ UÈ ]N»^g¦°H­ƒ»:Ã|>´®šh fè©Ì” A(8SYeÅѺºbË:-±>€ÐêªÄNœABÁ,2˜Šh9ò5"š„á,@tÑŠ˜p±D5!(%ÂDAH#K€Éð”krŸÌ 4KÂé*°DF 4cŸ2ÖAô.y·âeø –ˆT@4D•› X3eˆ"'­h2w'ɆDº#vQ€^Z„²èª”¦’‘+Ù«£[·v *,´ÉØûHŒ‰âÕ8go*‰2s´NORнÓQ‰RI˜±Òg· V}W%$™ ó:Ñ,פ™[µ2‘(£IYž~S'¶ÿmOC´"¯(2Áá¯ûÒé ±^(2D‡UÐ+¢zƒ^ ãïºo€ ÔÝ<¥ny…‚cæÏ·œn›'ùÖâ\ÑÎ-pr>šDo½Ay4ØŽ#™HˆN¯Ã|Û‘<Ä'™`ƒõoF7y±RʤôH«t¦eh1ˆðÈï'ôí»iþþÇš:,p >>5˜=¯«`¥>í¦hß=‰©lɳzÐíü)k$ ½g¦Š‘¡ÞzöÞ[W¤ÜŒÅGíÿñWÿbóKßjö¹U7òÌ|¥“øD‹äãK-ÌÏÁø5rýõõSmþØGðµŠÿ›BêèÎüºûÿÑ€€þ×÷§RÿñBçn@ïWæ˜i†Ráº(÷ÕF–wÞhWy²oÉ×­SÞI/­ùòåEç(‹›Gñ+4«‹–„±.Ü;óÎïáŽT‹;GpÞ⻜¾ëåV?ï6›Ö[îȶæåª]×Aðviiwš46€Ê…KîËÑ<î П]ÝaÄWè¬Eñì°t9ÎÄ¥éŒö"\Öâ_}ãÝê{·Ók\š‡Ó;¸)^éKŠ™8[^êùG5=oµ/¦†î”<]ÏóW–*\uÜ9ý­¹Z·³ïü¿«Õò~kÂv Þ0ѽ…ÏÜ”™¿ çyÿôÙµþâ­ÏÕÝý²~7+Öˆiœ5/—²K<™ÎíË/§òèÕ§õÀÓH¿ ¯t3êop½^?*bº~tâñ-›eV_º7=[àȇ7=¼´wOj¨ØCÑ1zø·ÿúߴêÖE‡›¹™“ØMå ˜«×j‰4cdr7·lNÂ-#3²¸pw/½çñ‰H¢÷5Zcæ9Xͽe¤ÙäŽÌÕXDrðšzzDGŠZ—¤Ìh¡5ê‡N- ™AHèmc‹÷céõ{Ì»ˆ£ç§@‡O ÐWж“œ}è0‡•ÛTAA,ЂÐLϾM€…rú# g€d;D_²Öi=DDÔ©h•R¾ûþ©­«n6Õ’‰å°ok"„€™»—D‹6ÞP×Ö`2Ø(/¥0ˆÞm*Vª,QóóúKJjr3Ìy–mµp0!Q,@“i@ûÑAk":"¹®[SD6ˆvb‘@¶`@µª5µÈÖ·è åK_Ù*D,è4HüÉ.ÔBšhè‚;&ÐÚ4ÁbhTœØæ´&U@¶Ád$(w” 6êí“I™‹Œ›15K†Á’˜@§Üè2§«*"ÍH0””ê…nIV³%ÃÜ'/J5oFCÉTºfôJ!…¥¡¤ag@·µ&30=Çó<ÅžZRó”çr`³îµ•5:™ýáÊ–`檥çú wšåA²Œ–’°®™Œ0Ùðäèd5¹¥Ï™bŠ¾Ð»²÷5@ÒH˜T¬LÆ9#a¥ìv„!—aVËEìçÿv’=öÝ^QDÞ§‰Üå𬂛¯Ë ÷~ý–t¿œö2*?íZô u™ï–оðWoƒd=8TáZÁC!èòWÎ!Oï¹Fg¼Ù7ëV­»%ù<e¼WNýÂêøãîéì0N»º«šý¯Pu½çêÄuцÎGСó»ïõ/½<—ûm çw¯Â-¸é ò¾lÁË–äü¬q~¾BÉ}祹úÞWäÐÛ“½Âéü¹BçÏÊôɼo?nn6¨w´ŽËaÔâñ;]¬o?êQ2â­à !îvóè­®½³<‡ÎÌÜu{åøïoŒÅ ¢{©ŸKd÷;ó¥¼QïñÈ?óâ7r¡À}sNê¾<Ãë¿\êÿ|39¬ ©æ2^úÂC晼¬¿¬×E¤/¬Åxoê›7ÿ÷ÞUÓ;?[W*;ï#vØm£^û­ûg¦/ÓdOΉ9zýúóØxîlq¥¾;­Ï²=âíñܵiÀc†úû&Å{ßÌwÜ”÷UøwåèëÖ×–à{ëÞË­u†Ny€=èOÔ}A˜'>.ïùuç£ùà!:Ȳï(^Übg¿É³-ÁÝùMæèêÁDñ§+«Ñ¹óÓV~ÝrùM3ï+¾ýu샡໎—ý†Ñ2©¿ý·Ó÷«RnÅ,¬X-FƒÊnr!><Ñ -`æRITÌFö…Æ”ÖF‰L?b€œTÂÌÍØ­P…&2b¶6Ôb«¯X×µ+f%kJ™×¥÷e5·u‰ŽfB;t õµGJ…Ü™èÑ)1ÿú‚÷K*{„Õ=”ͲÃÒÌ§ÖØÛ:HKöbÕ‚ÙSlqXëäîì}=ÌO© 9¥9äÐhõ)[· ëv çðÂ]ÀêVûO‡Ñ7é%ú wðhû1Ø5§òk œ`Jºvä ½Á*ܱûž”EdJHx1AJÄáádâ±´Á6×´a‘Bdlmi4¢wóZJ `Ò”Û’kWÙ•tŠpçÚm¿bþMüþ9çê?|×ws©€iòžèÈÞ¢{áwO¨%ÅPæ<¹Ýß±+S™Ù#Z‹j!%Á2y™ç¿ýx®8Ÿ•Þÿ9䛸?èüûv··~ ï9Ãoä}kÜÕ\}kѾ¿ç½ýó›)™oìøfqú᥹Ó€__¿¾~}ýúúõõó¿ø@üþ㯿„>Õ__J3wómà¶Ôßþ›¿éK“F£“4ÛM“—Œ(nÕœµ”iâTš-X;¦šNž¶å½Ébž>Q•32"FA¯Sˆ˜jq#Riðb4« ³Q>l“À쇾: ¥ÿàùãççþ¹‘‘‰ÏË즙h¥¨—(JlÿÏÿ±wÎÕzëkëfjfª³Q¨ÌF¬=úZ&·h‡H±ç"°p7ÕšÑ:Í3û(匞Ø ë’jÝ1Òªµu)ËÏ{ÉXjfÍD°Ò²§‚fÞè$ÅѨÃq4ÀÚûëV뚣|~èk„€XaÜ!“)’uªOÔ U+3KQr X5¿3 š±ÌEæ*Š®\!Å(eľ#‚ŽõÓ™{FƳ `6 ù<`ÿŒèˆ#’°£,2þpžÄÖÑØëFÕµÀ ¶¿ð&‘NG.È í,[ô& þD7e@c¯ˆ­XÀÝŠ*zïktܪWb]¢µ¨¥J2óALʌ²웢ћ»Ïó¤"ÅpzT)h"Z6173Òe¨¢~(ÓÇ¢šMÙØÙPmÆlöêºß/pqé”+M(àðpNô„P£ËA"–ŽCÀ%ï–‰žáTúÆÁ†pÂ!²9.¨óð̧ÒLËžxèè+˜Ã U)D‡ŠA“òØO\\Õh¹¡W:Ű™Ãø€pT°ŠR´ ¿5>……'LNTL€ÌUÙ©n„<ƒ2? (EYÅ ATÀ¤" ]Ã%+»9™›Û°ˆ°0±S²2K¤Ü‡† J Úd÷l™._"­]Õ8 jM÷™àS:Í0òq`€.(wÅk墶.J[é2pŸØ¯L Õ Ð”åsk½Kì½aßs«Óq8+Ú˜1Í0 k×n3z À=3äîær'ͤÖU:¦jS5/V ½$‹¡ôÝTÝ¢¥y13+æSÕ°XY‡6™m®ÙŸd¿QtãÈ¥‰rn}6©-Ð nÈ‚›âŸ#õepƒÙVkOƒbãf1”°‘Ù` d“é­Àt‚†äŇoD¤Pa‘€ ÀLÉTœüb•‚axí`niÅ<Á…ÈX©$›Y¡[eq©Ð‹£Ú4!-:öŸ€‚§…% L¥Nµ ¢šŒøþr*ôi PeѺªP=’l» dî>Êé}ixš©ÿ­÷µÇÚ£÷áÝëµ”yúðÃGÿì_ü7›ËñIU>uR’¯sü_C³àö+zç×ׯ¯Ÿ8d· ¦Ÿ J~Ê1üJÀ}ç+3Ýýgº¸ŠÐùol|]=÷)±‘™ç6Ú¯g^yx=JŒ<}Ë= ¯Z"^׋î]¦û¦ x©ÿ¿~O9ëx؆v GyÃYñôK—ýt/áÉ+Iê×Zc¾mbÑç׈ëÍå‰àÀW,-†^œb·‰}ÖgyÖË€‡cÎ×ÿþÅÖ¸8‘»së=UÙ$õîË!}áA^¥ßåVóÁûõ^Mô½Ý#¯y˜ÞV8Ÿã“te¸ËR^ar?„Kñ—ö ž¥ó¶ßc²×¾ô¦±@_~é.oùÛ*ú·Nåõµâ.‡ç•OàÛ×óÔðö%îc—Ýa÷‹)nº¡ok¸O£túų%ùõ9ª—º¸+õѾªG¶Bw®”îNísÚÓ©õK[+úÙƒçâÜOÿ=|ÒŸ!€¾8_¡{(›‡õïçmËßG½û~¸ÿ0}³óûŒ×³ç=kï¸ß©c³ÿ+¶ïlc#èÃd’ÊlkHšžff¢u¸±¸ÚJ¤¡dvuÙ<õÖ¢­J”+z ÿø4Í» ²%ªZZ(ónš·Ø?SZ?íÿ×ÿ,æŠC€¹»Åh)í ™¥ ­h µ`²¡@*"ZÇTì©Z;ô– ¹×ê•´ )8×êFrêëš®Š´Ì.¶ DD4&;$&"bÐlЊÐIɈLÈÃ!DC6dG_¶êÚ2Ã+úa+B·« áÓ&´•>UŸŒ•¬bMUY5N61‘ˆÌaJ‚2 |§[¬«"Ì,±®ê]d,K®‡ŒÃÒWöV‰´nÁt(aD$¢#;˜à¶e&äg”ëo# ›h¨„ˆ:1ˆÞ£c€(²£'ŒP#U`©UàN†°åÇp—º—ÞûÀåøÀxëÒÍèÅ‹D 벺U @v¤ÑHŸªIX{oKÔZ>||Ê®Ì ¬mÍbµ­Ý VLæÓäi‡ƒÂdV†:Óai½¥z& lzBξ*÷*p›J‹…%ÒC)™te‘,`M¨°¢Ã–˜„$Z‡º%®ž¬bˆ1äú„€âì©4ÏHög[CûU6Š•;SRBú¶­Äȼ¸!%'ŠÁ“ B +$;ÓÆµÂΰ— Ñ¤f" UJ#TT3½ˆÁVUÉákQwœtTœS’HKOZAQ´n‰­™ ÊFwLÚFDq؇iZ#ÂÒÝÓ5¥™[ƒ±2IëJd¢»uê ‰ #¦Q(Ÿ,´æ‰Ô:|T ”L'iÊÈ}Ó0Ñ5§øÜzWh°òK´U^`É ª™4() a;Ð`b“Úˆ:Ð CÙd“,Ó‹Á#{uRÏ¥ž¾ÿ¡LŸ›ÂjQ ¸•iê=Ýœô4dë^±F£‰*t5‚åƒÍ™‡¦ø=!Ð`!4Jˬl˜á÷»aJmKèˆâÞC…Ï‘O2Û’[‹´ u V‡€áÅ3i8¢¢”˜ð4Mc']Ãd {õü$3iÔÑsxä¨BS š™ Ùi€ÇâLŸ¦ á^¦Ø3áîæ ó¾A+f{ê?ý§j«ÿÝ'­µjér÷ZI£™õ]ÍÝ=cm¥…vsÒFºÇÜu¯U©3õ¿EVJ™Š×êf ÿå¿øoŽA˜m›zØ'òâKs(/ºýô L×ëõ]–&´Et_P¼yU‘zÎÄxùÝ‹òþ—Hì¿âQøýv覂×9Lâ|à£:Û²èA¼vLÞ`ž( ¼9þŸ£4Gç°Îóû^ày¼L7âÔ­›ôñj½¿èøî 9—ä.UªŸ1—õUÅwOóú¤ïaCÎ}²y.c¾§àܳú=êèUIþëŸ7GãrÇÊ«,îÁm®Z|®l·_Ùì|©Añ7ú Ü%´|»~uî·ø ?[è<Þç)ÿÖ‘<¼F_²E¿º °³.–¸«{íª à”h9þüšŸsuE®ú?.mç/¦Çë®È·‰™³_ѵªËgåŤË^.–³Fºë5—|•Þ~«W^¬)| xçפ/Fì.%DW)†;*Ï+ýz/¾B_cð².^Xè]êÍ˃öEõ½ÍîIå÷Ú·\ñ61ûÍXJwþ?ÂgxÆtîJVaܶF^ñq^øñ:t6S,Þô_”¯{óRFôlšœx(¼;©/㺻†g(MI»Ç»ý ˜ô(ÛÆÇ"¦@rj><Ý«!Ü3º±[Ý÷ô™s~Œôæ„<õ4ŸË¿—‰9½’˜:«ˆºbñÜÉ<êÎÕ½àd=&¯=Ú}ðê«ÇJ|–?³õʘH·$÷c1ö=ÊÞÝÅòÜ6Mw–à“uñyÕ±|‘‚{ùeÞyDpëH?»>çÿ½XÉònæâe]Ç®L/Sûn8þ…á”îíî¾Õ÷®¤âWnŠnÒAgóZ§ð•$ç1ËÂëe'ÁôWáÑñÏ0™’ð·ó·m¿"UK#ÝlªaÅÍ=Ì<3CFèó!|Íïž¡ˆp“»™idé‰R†š‹`@}š¹›3Z,Ku‹Öc]•i$²W÷ò4E—ZÇæ®C_ÚgNY"zô~¨eÍaš«B´¶þßþÂÖÞhˆÞÅZT"QzᙽP,XV1I¡ F)2V¼0s]ñTÍ¡4¬‡æÕŠ[‰Koµƒ-Kk¶›ëã©4ʪWP©È.L¨²NHv€ =TÈ!£wôH°‚2ü6$ʯQv#¸nf>¥vôj>[Ùeá^VXŒ€ËeU",ÇÔÈž° öž½2óhÙ«S}}Îõ“ÔÐû´ 4¼!„€€@róìÅÀˆ#„uŸÃtãJ%hÈÄ©n}¬Øé„N¤ €'H"8RÂ2Ez)òJôÅP'fŒÔ $ºû kg‹ZiF ^jñš‘î½k]×åpp+Ó4e×þs#•‘d)/Ä"—%ÒÕW1øôôDºM¦ÓTÒΞHuzŽQªÚyLrÁá>; ëÚMå7èL­mÞ%£££/´… ÌU ºX]!ô„“ZsùàŸpÜ£@"ÉdBæÇ›Ø†@nd`ù¬HÔI”z²w©Á&<@P•“ %`4SOÀð‚‰!ÂCFf']ÏDD6‘])¨ÁÉIçÁVS’T)Ô &aKƒiÊPè¢ÈØæ|zbô]%4Ì”\ôâ-;IÔ”÷T†‘¢è*¢2¢1!kˆCª!³+¤h"89­ -”Ë–Tƒ#’…šÈÒ¸,È9†¡A²Ú^Ù2¢ƒ@5Z:¼¢7D|ŽÁYmÊi(ÇX#y64÷†X`'L ¡ÎòIMÍžÈÒ‡ÛÓÓGóŠ€ïf¯…pG5š in4’D—ÆrL'  Ü]]*t£"#zhgöÙMa‰tý ›#"rËOuØA€?>–AD£îË̾Ù9EiôÇÄѰD«$$÷„ÉRµ*¶¬´ïJy*æ5{f &±¯¹vz™Û’¥"ƒÙrÚ)ñÑÈBÇ t)¡$d¥XÊH³Z€Cé½fÐǼ˜Hg©^çjU(•ó?ÈO~Ú»‘e²fþð1ÿþvÅö»½=ÉóÑŠÝ ðáÉ„0†’£ÓlWÏåÈ%Ù[µõµg¯^wóÓüõ_óHô6EáÌ.N§ñÞöŸ¼PòÞ¶GÛfIVÒ/{ËK›%^yî½yx«vó±v#v\}Þñd®BK^Vµ êZ®bÎö©·0“ËPöFe7%¼Þ5†»ÝÒ>r\|¯ÜðuRäiØ_˜¯[<¶yÙ·ó*1s.‘ÜÀ»oNø£æK g ÏuqÒ­À€û=ñÿ›%À_´¸å€¿º+¹Œã¿’ ƒÇ•L׻ůNÏܪ™KɽíLy›"úªózRÿöfúWÀDï(>Š-á6;°öEÊÖŒ©¹˜¢Gjž&’`4´eucq+Åš§ ƒÑÛ>8ÏEÁvXµZDÖ>ƒGDP²âZ#ÂDƒà€Þ‘õ{£ØpÏn(´Gfp?²¶^ wó™ÎäS™?X-™Ãvcÿ\@—H§:¨#gÝD@K¤ô¼çrȶ<Çóï-"Ô`ÞAŽ\@td Tä4 ÌÇ~ž ̆«-ÌCò¨>Ø ÁpÛÄ;h[úzßZP0ßÔF#3’&B–mZ†¸„º¤M$‘JÐJ±emháænäÚ{1# dtdW)®¹BŒÈÈ,¦â%;z?LS-ð2 ]ñT&w.ì‘£Ö¸(Õ«8ÉöVçâtÚ‡’ÄA6ŸvE… S¢C}O/$™)¦?¡5xgÒРBPÒ ‚›¾ºÑØGk ‡Y“ŽÖ™ÒÒTM)qØùÖQÀ M€49*¹&Âࣇ„´TuzgcšeÃŒ°‚¾åñ½±B “8w#! 5éÉ0HR‘;Ði‰E˜«õô Š” È+Ke54ÃÞe[çF¯#ÌY‹EªÈdJÇ7T™ï™ 8\EÒh€§5ŠBKUòɬ»Öì>jË zW@LöP]ªfOSq7ù)Wµ.×È9¹Ã&%»I=ÔC[ã‚£äÉ€€÷-¯n€( 7ZŽH$0 ”M ï“Oà¬9÷2wèK©E4+B±bJQf9tÒ  ©O^6+mbdæ2{ÏŽ ›ì7š-ì¡­X•‰F¶gX¿ ?|K!Ûè[·9Ç„áÖÜ3¼½G ÁfC2™c{ F*ÁÂq#Ë\-c "éHq=€ÙSiµÊ<:³q]ºí澪¯k¬Päæ\@BBµ²ÇQôLJT·žNwÊe…u(Ô¹ÎY-½& ÷Rk$Ûÿ©›ÕŒøî ûîý»bI0¡©"Rß}À§C>/ýì>"¡ZÂ}N‡Î¾ÁœŽTõ”$EFë£ü¨ÿV½>ÍO¿ùà?ÿ¯þZÇ’„SéýQŽ=Hˆ_b¸÷zýÍâ©HæÛÔ‡oÒº¿¤÷××;/ö‹`÷âþuýÛÀüÚð'¶÷äÛÝ¿¾~&iõ+ZþÌ ó¿@TÔUãÎ×%^Qÿ_i¤xsªÜÍ}Å,}Üðí/bÎöá^õô;ì ¾îÈîp‡ô΋ð† â·‰S÷Ê7AmâX6~á“ðˆ º´šÕ¹ˆ÷uÖ·ÂKý’Û×®߈1¾èDôöÀ\LÍËPJïŸÕÄOW‡m"opŒøÖɽÙ}½±Ôê^§2©ÞuGðlÈ¿}.=ê‘<}_Û‹ÝË®¿ágváðÌ;¾ƒz—írœÕæŸ/Ÿ« gøâ}ùRöªåýHáÑ’|¢Ïé삼ÏèÕwýÑò W=ƒ¨$Ôé!­³Î”1•l˜ žžë/£G25Ú ˜ù»Ãóòù°>Öµ©ͼš×â=@¢:hâ ï¤EæÓaÌP"¹öaÕXJ Xdºm"^Ffäº_¬:Í0„äzhZ×§¹zz¤ÑŠEïÕ NÔʦ”¬˜"$"éRºYõ,­å²,ûÿá_íæ‘‡5 T¸±˜¯ÊÙSò˜jº¥o¥ÚJ0:(¦Ö– é$3Šû‡§ÚÈÞ×Öbšf’ÊÙ¨ìN¶^]R±ÝPù2L¾#4*Ñ?gºXè(«2£Dïm/'”›J¨„”øIÅFk¨êÜ  ÁË`§Ðë^Ð ²ô5•‡ù7Í 0³È$FïæžI¢¤‰9°îݸ"z[>£?«}ÎÞµæðãµD æXèŸQ ¢#t´uã}ÃaǦ«G-nˆtØ@ÿJ˜!¾çŸÁ ÜÀ¸ LsQ"Õá‚!4Ö‰¢l@ED›á…Jeq'ÁM' º¹y™§%0»¦™JAŠÈ§R¦iZÑ;`u®€2bž§}7Õ'íÐÖ¥÷yWž¾sóoX›gxîSÃÌ" c§XÄD?°X  "c,»ò}=‹'Í"WN´ÝÀ*§~Ø›·¨½5e"+`Á'à™H(žL„0)‰6êÖMDnýS)*`¦ö¢£T‘œ™”©ˆW`…@´„ép1 ¶¤NZ·¬L–Q˜ŒiŸ #¤P(ê&¤èâÈ9u"ǧ´¤»‚ª{ ƒ9°‚Mè 7ó"&¶zeC&¦ôuI:½€"Ó"2=^Â-pP˜žS¸‚Jf[óýFEjíÚq¸°3ÃTÌŠPÉL¶Ì.Ø‘ZÓ %Œªä;ôM¹1•B$̱{âB j€d€ lÇÕ7QŽ ,%LðK0QΠ¢!Ü fè öeB–«×6Í?ø4×§ë12{F*Ê åž á*j«—‰^Aƒ ìèÍ‹™—ºû|úô÷‡@ÝÍjj EX”(`èv2G)ß\O'õ?3#³õh=Öž‘¬ú´ÛÔÿÿìŸýånä‹¶ù"žÀŸb9>Ú’ð~¾Õuãyìéä£ò~u÷)†ÐÛ1õUtj=å9î 1ºä½+Žú«àKFÇ{6[|gyÅúJc'ž/»Ü·FŽËòí³qÐeÛøKÀO¦œÞT‹oÃrùã‹)ð“ŒÛW;Á¾Y–û³Š°_ñÙ¯$¾ðP_voZ ~Ö¸Aäòª½æ§ÝR}]ÃÄBË»æÏŸtþ\7¤¾ýNy„îáû¬€ïžÔ±îšÿóÊ:w ~ýŠ|Ý9¾2UΉo.Ã׫s•éÀ r647=Jº~¶Ÿý]Ó^øâH„3Uû £{x½c!ÖųV×òÞ=ÖÉ}ºø¥L—ÓÅQŸ#Lî!®.ž­/t—*ü¹õ5[ãt¼ÚïhÕçÇuu$wþ—ῧÍ^—ßW÷^º"u2>Ïcàð¾lÈÝ©|…É“èô%/û¢íOg{.q‹/0 {y+Þ<½¹¿«ÉJ¼¼ÛOdÇ‹ôÂõ”äñÔKe£î'$xu`/3þÎ1ëìËzC¼XKlp&ÞfŽ' \±ƒôš’j/=åšt5Wu/ä?»zzÙrèê.ç}Âù%î¤BóL8~üĹ$‰ÝÏ=¤¹o÷ÅÅùÒ9}'(9»,7TÓëGæcŠ:§ìœw/ßÒîu‰5ÅÕ\á)¯rÙ.Î;3ÿâþÒÖRÞ™w/7çkœG^ ú§‡ÜñçÇŒ^v,·¦— ÒéËØÜ{Hóuß;¶ ¯=¡¥»1ýÛñÖå…ä£ô"…[ âÄvZ†lÃIϼÏgËó±ëS_2S]Ѻ"”Z|ª4:+ 9U3o˺fN‘SBÏK«¦‚ÂÒÕ—ž)ºé°`*tW¦Ü‘½G뵺)Z 2‰Ö @¥ÁjõR)°¯4€m OE¤.·–eÑ•œ¾âTW°4-ÿÇU¤åÓçhJÂ!˹8hzèM ö¡ÝÔC è€úŠRbðq±Û‘í°Ì { 7Öb¥rþP!YKˆå°NS¡Yd®ë:ïjšêTÖC‹–ìØg‡„ UµuÍTôÖ—£tNXA¿6Ý0,·7øn˨;lž4 6MÕw•¦èP2;•;C¤Qв&'Í žÑ \Zÿ½Ú³±Ç}/Ù:š6ßìà±þ—ÂÆû¶¡LùÑü3 óüh(ÓÐ*à n(!ŒÜ„ÁfPõZÌ]! Q "ÍŠÐ3[2 éÅHöž‚•2rÙú0#€–JõACk d)E,¹†¤äBÕÇ|>¦Zuˆdwikï™Ðw?Ì¿c/^XP§º,« ëH±¸ª›5&cÐðìüèþÁú¾ÈåVmF²«[Z¡Ñž“a2"Ühé nÚT*:tƒ™zàH;‡’2%‘©>²5ƒhB鸞®i êvîšÉˆ˜eã‚.®aM¸`Ä ˜é;#“£‡£TµSgæYÅ!“º)©D œÄ :Ë${±@ºo’tÌi£ûÙA‘V‰(0¥U™!• l鬨î6d‘)¹fHÜ¡ôDö4³E½7UX’Jådè -ä¢ÕM°* ¤Øc3æR€@m*úP©Jô6Hò‚y·ùokœžs5¶Hl‚LÄ@`éXŸÛ @m5YvÜBä&ûÂŽ`‚ ¼X~ßžk™&*‡£”±Œ®23SÃ|šfWH‘dŽE™jÙ•åÇç¶d™mš¿_™}ùVººú 'DL÷6Rظ7ñ)ŽÄäxt{Ùš¶aŒðŠh€! ÇfaÔ°ëûx¾E&æUÇ6€Ñ¹ ­±u càXdiYÈIŃS±êå€@²LVŒ“¬=ÒŒîÅGŽRÕÓˆTq÷ÿÍÿvtÓì[ær(‡õ»ø¾û Û÷–öyEïriOµ|ÿ¿Be[‰ °ÿðªpm;H¤ÈL ‘-¢µh­S?«ýÿ§ÿì/µ-÷ǘðyêጶ¾®Eó¦ë |ú<ðœÛx]Ùse‘v Qáƒ=ÓWç%0» Éx ÇÏež[N‹.0Æ[tÈ«Ðê(¤Ë¬îÁànÉÎøáyl~4ž÷ñÞöς䇮^-Lz§„ôUìr]íÄÏ$Õã6þªÀM®¯Šé§N\©jwãçKYùjs «:žó7©P{W¿U ±þ²±Ë²·7˜-7^iÂ=fÈqpòº¯†ëåVô<:z>ÌÁ¼Â³=ñLô…ä–Ëa¹–ÎÒZߔ xý¦;ǽ®ÏþyCçdŠïíí̼MB\ Ú݃¹j[ÅÄ_‚Ãz% @â•ÞŒ«;ë+rïïxÜpÄù½#Gþՠ뀙þwg÷~‚Å÷W€þËÆSü5â— ¦á^ þq/»ðååèü ¯&¿ð#~æ‰ÍHþ_νÃ/$Þ5/¾êÔãÍŠÿ¾ëÀG×å+.éIlçƒÜÆîr<îxxAÞ×ð§ðâæ#u™]Ðó#BøÅÃecˆ‡ßîk‹µ÷ý’ëºW ‡^š›—ÉÝÜ|ªC ïî)Uxqçn¶µAê >ìb*‚z&3rª™€2ÑÕ¡e¿ÔâJ%²ÖR‹AAÝbiˆ¾›k¬míAèÙSäaiŠM/˧çõǽ»«°`bÈ ^K_×ýçeÿÿø¿~÷)>rRIY¯…jpC8M¶®*ne"Bô5û²Ê ŶªàuŽÑ­Z!yø¼*•Ó\ܼ÷ £„AMóGƒ!š""z[Wyu©NwWïË$FÁ=$”y ¿á^aبÙ=`ŽR=0’ÜepF€6R5ðn^Ý«•/èÏANÀ@2b“9zFo«UÖZ¢2Vqø”qPëJDß’í°ì›C ­a˜ÇŽáP6å$_Ð+°‚ÁF÷£Áï0 ‚2±­tÃÕ€$Ê¢CŽÌcŽ8i d4‰bô”¬Ü]¡L‘tZˆPº T©žÒÚ``H¥¢õ¦Lói*ÕÔÙiÆÖ§*3ÒhY¼ø~ÙשúÄéÉ•ÆÝ®ôŸ¬GFv÷Rd½Ç’-{˜¥qL‡t„©wÒµÉxîQœpWS“|ÎÖ¼RÌ,+¢ÏSNÎ µ…f«A˜£utV шP„ÉH4©c«Ÿˆ°1—QM >8( °À;S²$‰BÄ$#Ø© Ò¥ –eKºi*à®j6>KHVn ¦ÄÁHÐ(S²CmÓͨd””ÑiFöL˜(¦iÌ¥Í"x$.!:e:DßòF4/2šé9 8¼20PS-µvÕÃ×ÈPN$?VY$!š¸„ ÜQÄ€ŠQ@vXòãDzfxŸÁ±H«¡Eˆz)K7ˆ'$x†é DT‡aûÉé±ngêg‹íö™?PlÝûaÿ÷ßÖ%½Ðm /}ª^”2c™ŒîCf_º¼ 3•"m˜Šd©E}MYa‰²sÏÌ}F¦6s‘±:‰ mnÞÃ"8µîP?é `:"`ܺ—HPÈ„¸Ã ` +»´¢ŒÜäm‘iÊ@"“2#[f?0½! Á´]) †C¬ÅŒEîŠ&C­Q­{Ÿ+§âsq/hjkOAbùá/ìi²««w3LnþÛ(UDLÕ>/Úøqg'[Z>}0˜O–ß}°Lì—˜ª— )•™9ì’€”™Ê>,{ô> Æ¥–²›ž~óñŸü—uô;ª©)yÓŽ‚}kœ¾=Šxÿ~ä¬öÿý¤éûmŸwÕ=þôq¾bÏôn8 ÿ,Á”<+ä»H½WIÕòÃÌ—m¾Jÿy·´¿„Kù<È?|À/H+Ð×—ºÿÇÿ©ùK K·É¿/:›«dØ{èLwó(_t]ÞóÇy—KC—ÇBàW&xÎÖ¸/<轄”? ‘ýÖ?ˆ¦þ'MºÓ«“à«üšwéë?÷,nÖ·Ì®·/-ÿ4n“ŸáÖçÏt7ú¸nIÈWÈ?#½Û†öó.3ïqÄÂyù·'xVpþ €·L“þD¹–wûeÏêw¾yÞò¦§‹ƒ Bž¯›M8Ï{z¹ôüw¿_ž}iê=×¶G˜½ÑÍܽ¸ióø™»¹%XçÙ—¶†Z¥ºT%ë-49Œ %ɶ²|ßûÉ(üù„Ýû§'Ý{ËÂý­jóK¨MúªJÿ¯ÙðÔ´“ä]±çÛú/ÎÃ|­ˆø2þ6wKªßÌ]Åö`_±O:;Š;é³×z¯ß«x^t\É”7—òÂþKkÿžÞûüï¾ñë~r™ûu®Î{*ÐùÛsùÉ×ùŸd.ñòÓîÎäÇWäEÉyeÙ)ŸïÝŸ×èüxÕZ€Hg—ã6nÝЧ®µãúÍrÔ~ô*á rmKuèxùÅc“È(Oe g+9o*Y/Ë îÍ0ñ‹¯€—?ëSãÕÂ}Ù:uϪ'ü.*¸mCî¤bt)ÄÆ‡Û†ó¥ñœýqöœŠ8ŽVN<ÿúûÁÝ9ïá¢lCw„H]>môÊÓF7ƒ¼n=8‡Ý\A6ÎY;— ÓçÏ¿ñ‚µHÜ–:_Ì]­Œçð”ÿËåÇò uÿÆëBç Ïe4ð„ÏøL/'puSŸL—xÎé¾}œüxfôR¯q‚véªçà %\R?p­A^"µt³\PûuqKâárgaáŸã­u>qxûõš¿îG>•ˆáïDݹ¸/gÆ—'o#µ›n8âö¶»ßÃx/ŽÛ¬é¥vk½¼Ot½¶u@oØäëãб±ÜÎJ}îéÓ·¹è;M|gÕ[ÿûÒöàôïÉÞãŽ2õéav•ó×Ù¥y³øâ.êçõÙø>ÚÏýéêYñf?à-¤è¾¥ÎÅðÞ›ÓxáÏm£e<NrD6x< l[åÇ<ùôï·>ïûa͵!ó€ôâŒÌÞÝ«IN²xËHÐJ*óó~qîꔇ¤¬d-óÓ’ûuEt@R3n\gpªÖáëóZŒ(´tô¦ÔT‹)é@ß/PúTÛa!4Ë`b𢷵UƒÍe$¨4 ëßÿ;¶èŸô®Þ#£{bU´¦H”ÒlÔK{#s*ÜG¸© ½ï¸žÙø^ÏlsxöŒuŸ^Š™ƒI1H7w^ YèQÜ3¢µÂ,Öe‹»|R –¶Cú÷¦AQÊüQïjmuô0” 4ŒÚùí°ÙÀ2WågÓ9G ¢¸ï2™Ã7 "Z´åsê`¾ŸÒ@oXÖ­‘‚™èÏ("À£|ï‡Oõɇ½j”d aàǰNkk‡§³?ïËô”ÑZÏõh½±™g„¬©££¤$+éX;‚p@É „6ÞBd²s ö ‚m«¯hH@Åñ1Eg´š,Ðc0:ºé4‚ƒ+Á’¿¡ˆ•0• ªˆäºŠ‹P¡b²¢†Ü% ˜èP‡Ì Ý*®ÅT(-nÝ>Ì,3]”ŒÞ<‰2ÌìD,[£ÃÚs9`þ/PCz‡,B’á Z&=zh¼¡)]¶†Rh)ˆÅT¹•¥P ©Ø%œpgRãö·‘Ècu¦€y §Îݹa(É"ëÌèÀ@, GŠ ›ú¯Ü¦ë°DoÇzÿ¶umAÎv¸ÀÖa ”(ö9?åZg›g¯…‘&'&XÉôš&˜Ù ïsãÉ7‚,T(Õ˜™Jª1å^X}A½†ò„ºƒ„¶ŒKóÚãØÙ³þxÊmÜ«õÖ;v^xbþöŸtïõhäÿcÎUÞñö«¯–âó¹ôHC³FðYãÍÒ½³qÖ£«Ï{¯×“açKñÉÎá=\©¯8…‹”ä7tÜJ`J¥ÿcëø‚ä»Þaœú¾`ã$!ówèŸÚKïLç}í,Ò\¸÷vðÕÓøEv|Ûö3ö_辫¿õ˾âl¯3¼Ùxà±›ÆýlðÕSßxï~EÀ·/u_Ôð!¿½³ìö,¹{ì_VuòVÀy´a°ËI:ï/y¯mË'øô÷¿_>ïû~Qï Ó n^v3{ÀÍw³zW‘H:- çÙ¦’èèÊXäTÒÍ’0#SÝ2˜ÉŽ^l+Ïu´eµâ4ÐXQ”«: eôeßJµ]µØ/pCjY£¯}ªÕf.y¶Œ5d0s!A#¤ôÖý¯³­ê sA´ÈHIPE™–,E@ A;ô¡ÝçTµ•¦v ƒ€¬ ÑkÂèSa –&¯^­F%¡º´FÒëȬ@-»šÑ€tGocsÖN&|«ÙVÞ0 .áÛ¥©lˆ!èwèh09›ü#ƒÈ­~u™ûX÷Ѭ†§¶f¤A.„bÉ|#{*•±¢5hP}rõ  e‚hè+´‚ ü¨õ›#…ì0ßþu3|Bö#ùG[á©nn-{¦œ (rȰväßmÃHÐÁ"HÕ¹ÿ2F¤Ï2iÓ»“V !Ú˜í‚!cSÍ-C–!ˆfa)zar#«‰’ÙTk";Ú÷ó®~xêhmí©lËj‰òÝl%çùÉÍÏ-”p+Å??ï{ÆîãLXkîeÎPËÒ}r-iC};P-@ÙJ~<(£G¢Âkè¹w ŒÌ"JVw]¦è¨„ \WF‡ %ÙI) Ê„¬‰)8adà*Æá £UŤ‚‘‚ƒ½¡A™Hg1ô”:L¬dqöC² ›s·i* !Œ™ª)+Èfs“Ü T3’ eÊÙ‘Â’­BâÏBÑåîy€§ùr-¦½5KÔP"dzµs¸ËFG¤š&; ‹H‚a2™-Ô»˜tÙ¡åš)bm´%1SH©8‰-Ç6»÷LA¥—ìo„9PÀÑ M ·ØÒƒÓo&„̦qQ˜}»hPßjûÿ?%`À)P¸È×Y_Lä²Ý"´Fúg‹Û' {úàÙtÅ: éͪº è½ - vŒÌÈ ²dôõs©aU,uý´j¤wˆHäÎýØcB¤¶ƒØ\ÊÇz2òyH$DvXÙ(@§óaëìø‹v, Iĺ}ò‰ìžѶ\£FP"Ü©fÑ%J“¹S!U>”B¯Ë<¡Lœi’"dÕü©ÖðŸÔïwñ¹ jµÈ½·(s¥—…%aý¹u£},^JÒðT@+¥öç} –@ÛMÈè$"ŒL)AyôûUdFäðûíqýÿ«ù/Ï”îÍôwKm’·qÙ£8í:+_¹‘‘Ï — /Œˆô@‚}«Ì“¯{ý»‹‡e°wu~‰yïiòÇ!ÞˆSù`X¢`˜góçO ànUï{Fã^À—µ2ß½ËÞÓ4ü•LxµàQåø·w„¼~9Þ߀o°&þÆrøW6þöÐùŸuÍü¥¹ü&çáw^”«€÷L¶¯Ë±•o[©ê¢Õß rŒCà)×{G¼äO¯Å_Üx¸¨Aæ—ÜÃLÑ/>òK=RÝ¿ìú–½ÈvüIguþ “á*'£_Ö„¼FÁüAÆn+ç/ïÖ’þœ'öy\*ýtóñT@téÝ<Â#/\ê·}!=ÿîsöž¡ŒÞkõè•µÌ ™¡˜¡²~x‚¡?G¤è†žÅlîjI 2w–„µê±ä<*.#Ñ{ß`ä]²„3·eë^Jö´B:™Þ×P´¾|ÞÏsa/ЍSiKÏ.‚}m–Ù³c•MVæÒ+Z·¹šQ"f;üþ¿}YÔÑ÷Ò`CnV4oÓ Á Š­:sÞåTU ÜÁ„*›Ú¾4`À¬ežL(…©®0uEF)¥'á`ôˆµIBÉ2yë™)sº—ŒžGCQKyn‚> ÜÑ”‚¶‡:6 Š„øV ûÒ' …ó±éb)®T)À{)Ù#Õ?+Ø[ö¥C9€@C—Œ€ˆ¾ / mœÙ±u$Ú0ç 0Ûl~ýcø|ÓÊÁ#:Õ‹ùò:RÇc5MffÉ7WkÏV” :Ûªe?†)3dO¯ˆ”R¥X5^ŒRŽ€Û¤•ÉLÑÌ@d*ÈÌhÈPDQ¡·L8Ÿfo —5––ÓdµT:ý»êŽÈÏ~®¥V›2òùyÙ•R¬ì—Ö…]¡fJϽ¾Û}ðد{‚³×¥«÷lH+^Ëú¼ ”¨QRØC5ú,ZXHk‰´2-³[F­ÊÞsM#hj öPcOq¡uôˆ JˆÎ.$P‰5å@‚krížÈ ù¬nè‰)Y‰yBûŒ'ãç¢I¨Ée"õ#jP=Gå} è&Q€Y,‚`aLW_àuިꢻ<=89 ƒ›ÕÝì•]‘4 °@Dïu-ͺMŠ‚¶ëÖåcvlXiÑŽÓRFi?6 sdli¿¸Ã :æVáÈÜr'›¹6ôYbA` ¶sn+ú‚ÞQÊfHÐ7ãÂ`C% ÒÜDûÀ¥é ¥Z1ÖR'«S–ÂnÞÁ'÷ž]ó‡ZþâÇóÚ×hÏa^¦ºûîãúyÍ –²€h|šæn¶_õÁY=s®ŒP¤ý¸×w³J133K$R efoÞ‡Ñ="u„þÿÓ¿úëïÿâ·—›1>ßcÝhÐÔ[ݲ/;oÕÝýÜMàZ|*té+ø­Zô¸^êÎYê-±_£¶¼öK|ñaÐûªq~a{‹oüöŠôÙhü3_–¹yÿ†â¼¢ö= €oÛªü5²ï™ïªò¿Tö<®N_\wü“‹]¯œõ]Ãᯛ ïÜ¥~EçK'ðŸtžß4WšUûõ‰|Ív»sùÌì^¥æKÏUwË›—òý·Ìm>æîÕyôÃëë ËÝJe^Htï™Dܵ„>vmòiåù•ÓÊ£eòŽ^rÝã#’/J8+ܧ˜â&á5èò£W§¢.*€H6m™ôãóD—œ¤ 4tü¢s†Ée=1¯ƒ!m`#.á¼}ï R^-¢×R2/&Îc7&}ùe yl廂/éöQw‰ü¹è„8Cç\¯º9nžÍV]jìWñš®†ïÞ Ó‘|È×4¶ó 1Þ<úkO%JAôË´tZ|nà/W´˜cë åÅ—vëËËw¿ˆçÿÌ«³>›ÕâåÍ÷‚Ϻgu7bá Ç z¼îßéÅãã-Ä nêÎûy—uι:!ÏqÅÚÚêt±°]!•®,Lx3ìïKÊ= ÏŽõ¿¦³s<±`ÓÅ“'éùÜ:ÈoŒƒO“ý¥ÊìALªùþêÖO—öÂx¡Ñ¼¬&ç¶WÚ÷tê!¿‡ zOÒâÊéªxä¾t^3Ôò׌×åw»)/MÏÎGéL¼!<¸Q^ÂD.ÑQ@81tÓ1»|ÞÇÚ{ïý°d )ISõ8¸j™¦¹fë¤Ñ€¥ç¸$=èѦI½Ef/îFZ-j‚yñn¥f™j×`ƒrÒ=hŽ£T˜§õ4Ø6¡“Ù€ï¦v8@Yë5˜•ê…U-­8Ÿÿý²¬ëÚ2–hû8ìÕ–ì-#ݤDïXC¨²R`wÓ4 ZŸg¹o†–HXˆQ™G枀òèF›‚K²øö(kû5ܧ¹ÖÉ{4’)ÐÍ9 Y.Åé¡!± VX:¨@ô†ðmu¯IÔyÛ“Y?ÎØ 6,Ü i×5Ý$´nɆ‘ظÛCª#²¡NÛôX¡\a˜[J¶±¿ùgàé·zzl'ÅÍÜx{zd¾<òi™aæf` [DnTq#Œ³Ái) ¡L™"a¤¸“äzè„™™9S ¦™ ‡lÑ)¢PŒd´Í@é(Ni*†DF˜³ä¨Oý½h­³BÅ>|¬óG+%iSQýPgól¹dzqh©¶<§\»ê`QdD/VÖhk܇'ª#вJ¤'«&P¼€wÕ‘«¤2ÚÖÙÉhÎæ2T'eާ 0Zhvnë«:”‚€dº\dƒI 3Q G&W"S“É%°3²þA…ŠFKÀ„šœ$Q ¨„#\ì L“ܱ›PBÅÉ9Òû¤‘´„I§«–=ÓŽä¨#mŸ0F0RÑQN ZZ[*pÚs Ö¥ª£çÖ% ‘± ¾J,ÈÍ®–“!MÇÜèŽâd¾öd¶)ªNŠÈL)1Í ])`޹"€~¥¶8Jÿ Œ{ºn† Ðå¿Úé¯ v0ak0ft!wb¬8ˆ%`%ÑÌJpŠç©ºE[cVË –Tº:Ùr]€U¶°ª„P©g!56—‘x·LÆl dGÌr‹{½¢N[ŽpÍ Æã¦¶8,û–NPl&É™G§qƒ9bÝ#²³Z1¡+›RT5ÍeòðP9¸OOÓTfd…y­“Šõ}ß-¥²øGé¦â¹vÁPÜæºŠˆêÎÒÝ`µ{Ä=#!YŠ––æÅËTÍmÍbl.຀H&ô|P-æìf*¾B6¯Rlm<¬¥–¥õè9ת©¥{i‘Ù£€V«2AY)ÙsT HBO Z[–yÔ—¾ZªA]ÈLmé$½8•±t«îO¥ÿÝßȲµ5‹–½–C¶Z•’¬V„‚ž0TàN+¥gÏD$ªéÕÖÑ ë½åìª"Å„ÄÒŠØ–îîV¼Lõ˜ô5½µ•ÍAwI):§©–ØÔÿeà À„h€a=€@ÇÆg!討u*`®Ç^Ž8–áû‹»‡°y«c"~Aþ÷±Ô¹Q;6nr„R ":²Á쥙—‰÷Ìí7Û¢Qˬ@™b%6mÆ f´BŒ DºiHeЧÌP_á…¥øT«,23ÖjGC‹á¦d²¤Y¥Ë‘b²+´„Ñ$ÌH „ÍÌÈâÞV­‘*©g®‘^»Qõ „G£ÓŸ÷ŸIk}™§Éˆ´ÞÖe÷ô„D­ö|ø±ZçÉ?¯Ë’JÝô¡ÔÊÙ’«SÓäP¢AA¹²ˆ <êú1«;aSÿt(E’b;4ZÐÕ}…ÕÑV˜«Öz£D )„˜dHJbª,¶9*Ã@æ$3 §<Ù8›¹³«wÙQ“q}M‘˜\ÕÀ Jù :dÊ„aˆÄ`‘g`š`>©7¤ N M¨H™PAчå…D AøfLP¦uP´a` D¨-Ñš˜tZDfH³ÑÝ‘ 1à@¦Ö–SŽtö|H)#¢XšS-ÀˆZiPJ™@),óØe‡2 À·r~#48RÏ(U€ÁÆí0×\áH´ÔQH)ÑúðKÀ‘­µý9ÎÒyDñLS´ËR¤—À25ò€ Ô&–È®ÙÜ«,߹໹ÀûÚ ™k2æ¤Áz7‚ìÂjÞ&)è+h`±åö0("c»£O†Þ<–X9*Å Ìàúåη桡Žmÿ”[?¹B£ÇEÛ2BG{F˜ÈαÓ)é^Êlž=ÖÕÂPV`𬿄])uvLe7qWk V OÓôa²ï~K7A–RÊ Ë@¢”N wób>Íkï>9¦ID([OT7DFŒèËŒCýW$2³G_[[{ö®I¯þOþò¯ó~{S—£ØýàõOæ*ä[AûQ÷x\©þBu¹»Ó“tYvÙÝù`’øÚù€¯69œ•Ìèn}u‚ð^”ÇëhŽó7¼#(ý ¢ÖG¤“Gñ&T>§?Ý·.øÚÃøYì ¿¹àÑÇþ„“«‰üÞ-ÔÂû”àäÙk¾h¯gé}9.;Nó璉¼G6}U=¨í\1Ö¯NðÛp[ÐýþûâÏ :ÿu7ò£œœ^²È÷×ß;çþfÖ×N†Ÿjj’1_„úyÿ‘ÓF~}ý©¾Þåtõ U /ݨÿ _ôëëz¦üÙí¾ð*ë§Ûмû!úçMÄK©>N®óú‰ð?#FU¬Cƒ8î.x·ûß}Z÷‡¶¬Ñ:Rî^Ü)ýø?ý_æÿú—î¥Ý“0¢Î5Ö˜zf¦{ÉeÅÿþ#½DëʼƒDª áµe*p¶Ãb»‰î©4Os¡Á‰R¬:ͺY³w¬­ÿþ“¾›çy¦`Î>ºN”}i&d£×Rs"³° ¿ûÿÉ¥Œu]û~ŸËm\¦º¶Í”*ms¦NCS‹«*3„ S3è7 `†u 4L2ÒÀ¼:²GÈ …vØwužhŠžJô5$ ( &:”Z×u¸ÝBˆÅÆÂn}«ñ§AqÔñ)›¾«]D¶NAõs7][éý`pC?€@‹ ÕMÀÊKÙ>Ù+¬¢:`ÈØ>ë~£¢× J  ¥À F±c­‰7Ãä@oˆ¾ÕW³’´âè=Û V°&2ÒY™>dfƈ€Ñ°Z83ÖF°ì†J;ÕyZ~\¼ZÝMëçmÐõ“IÐhb¡ËkAÊ­›ŽE@3€ *=»°|F©Ü}˜TíOß¹#Òs­µx-žû§¬SÁ‡Lôµ…úÇßýæ»ve5³½Âª—uÕáÇg¬‘êD”™•uÁ²X¢ ü¨e¿v‰æÎ*5"JÉ蹄B2ÉR Ž ŠVbÁpKæÊÙ©}‰)8Ú>‚|2ƒ0)(#§`ŠÆaÓÉaº‘ÑBª@1\2ð‰’`"7Ê„d6pBî€wÔ‰L0‘ÒÚ±+ô ýGsJ.K ¢ó‰ Öªj¨d)žµÛ<š"Q—‰Ø—ˆX[$M&Jê‘ì0!T*aTÔ·­Lk"²ÀX"™‘è©!ÍG¦b¶Dnø$RF3ÙS™ãÉ,¥Æ¤ÉÃEE 8!6‚ ä¥Ñ34AB™ŽqC F®BJzÅÁ„åpÉݲ§Ç³SvOîÏã_í¬&yȾɳÏ,ÈDïä¦:D-ú}/4vÉ“†Ü7À"3JM³Ì@×Ön`uë(BêPÀ aÇœ_ÝÒ£}§7¨cú€8âÈ0V ƒr3VyJ+gûq äð6ˆÍ!± ¬Ï‡¶€ŽR¡`5K¡CÝcU~^YÌCXÝ&Ú®Ö|š|ª|j»Iw²²üþÀÉvOO*ÚåõCé‘}Øâ$IùT”Ðaa©¬Nyèètnæf=ú˜­¶¬±ÛÁ‡±ŽIf*N'ÙuTÿ—–=6ìÏTþé?ÿËïþâ‡WÂ.¾<Ð7ç^hë‹æîAwjÑî•ܨ2úÇzױ囅czô¶£Šûv¿îk~F©ëׯcþ^õû'ÚÖ½tüa‹¦tWý%ŒìŸÓFòÏ :ÿK^ÖÞzÏ;n†W{2nŒåñJ¿Èݺeþ¼ÚþõöI•³|óK6þßsNP8¦+õÔØå–Ýq>xWP8G»§^¼{îNÑõCöÃE‚Œ>ÿîS;,ë²ÆÚ”i4׿ù×§'ÿ_ÿ“ÿíGs)j©[Q‰±Gª­¤2kÝj#FÅgD8‰.ÖTqÀÔÊǧNX¤²÷LÉœÙ#““cs32ZgdÝÕh}C¹÷è?>G*ºZ¹öCÿ<=MN´Ï1ý¶Î»9––=óó¿RtôÈuÍXÐè‹ÚÚ[/%ÍTwpW¬GÕÉ7ÁºVô@&¦'¡t÷M§ËãPj×X u+ûµ 5ľ‘­#S‚ï3J*Fiqk]-§]…±e&å [n¶ùëÊÝ‘è= # nRì(ÖPÆÃ:bU"»×M”Üœ3 ½mköp ¶ºUÜ·†Í±µ ¤`ÓÖ.à3òä7:mgqÂDÃ&}r±°c!ÿ)úëÛSb“&™Ç–ôíwˆ†Ý®²@j²ÖsõìF‚Bë)7të-Ê”^‘¢¹c"K¢Duº»™!©° ÷§]ö¾ü¾¹›{wËå³êÁZ½TψLšYBÊîÛ¶ÕÙ"zäÇߨ“˜©yf² qxöyVÏÞר÷¬eWVêwOO³Ï“M)¹s2—2šËÞ«: ÖÃât‚ÍÓ+wÈÖÛ¸¾Œã¤¨¨BÊ,Í´,ê+•P²7ºo4͆1K{PÉ”Ršì;3áŽ.-† ¶Î“5IäÐÁ;‡ípV×\‡ ëè0¡ ¨LÃ:˜R3åÀ¿ê,E,P}B‡–¬° y•NKñš!'™C,tÔ#i¤°ðB§ [¡‘%£!>'¬L°ž‰Œ ¾d‹&/¸ÌÑËâÓ¦S X›cé€28—Ñ* ‚sµ52 º pãÎì´Õ·uu*”d‰AXªø„‘»´`º(F¹Û ;އG Ü<¶È gì g~¹ãþëØT{»T9óø; ùOïɳŽ?ö*1Ñö˜vð,pƒ;Ü5S{šGiRd®„E¦{2¥™PC¶ïÍòï"áGÊ¿•cò!VÞcQÕ*Ú:™Žf!cp¢ƒ^·uøl ‡€ÓƒÑ ïP»(æh 35$4ÚÚ Fg™u0z©ýcµ2ÍYû‡§úq†»%væ(^Ýê?ü }¿d¦¤§ïŸ:-mãžIôÒ!‹‘®©S6Csc¬idnæÆÌ0˜2K)IFôDFÏÞZ®=[Dï¼–:•òÏÿòÃß¿¶M{éÌäKp|7îÅÈøo°é\<&xÊ]Ny†ž=ñK_"1º¢‡;ñ²ö¹ðôvÀv óÎCç»UÐת™nú‚“8j w9“º`A¼¸sy§}ë«!âíÏu±›{9¨+©è´¥½Þ\œˆ+¸sòºÝ2¼ªÄÁ™ÛU>k¿þðÛÝ}‘ëlÀ£·ÔÕuבú0 ~ñ¾¹"×(?¤È}Ãå+Qýip^µŸ}ƒsgÿwïJȳýûù¦ì>†×·E·ç~©½]œÄë[¶o)$E‰–Î7Ñ×ñ_AÄzeÞyÌw%à÷¼ >Ðy~Ë-öðÓnÁýgtÛpeTsGL¿¼ çý"·”ª³=W._Žù¶!ã4ý®¸a¯ãËΟlwÎKç|#½oB^ú^2…g IÑ[J1îjôèú©øžy¡K4ÚzøÞt¯dP>€]Êýï{˜¼t¼?8œ‹JÝöÑýpG@>OÃèî‰ñ‚ar×—á!§ðµp†¯‰M|0¯¤£oΓëÏò{Ã÷Í…ÛxF¯‘`t›í8Pu£Lëçñ3êJ5¾='^\zárî¾¶t×+ø6â|_"úÿ¨×Nûaïeõ¾²$âÁßn)mûŽ3­ŸwÖ ½2è~ä«7Ò¹7ïø¼½kÅæí9¾ËjåüÂèÊGîÕ…í|<`çûƒ‹Tò«¼W¾?f¿~QØq¾“yÏòsõ<úºVÂã|8÷”¹×÷1 îܸç+6ÜÞ#^F?þÝïÛó!ZˆrQ¼ÿ/ÿúÃ?ÿk3ËTBîš ë²ÂhÓLѽ˜ÙúùFÕ+>§0‘´>„€vóä ÉÍsÒçu]HdÛUš1·¨eý¼ÄaáþÙ~ó=»ß~è…ëÚsiœJ;ìãÓÁ梥--a˜‹+rYÖüñoÑ ¨ÌÞ#ÚÚŒ]¹8²Cr!Ò)ŸPf¶z×(ì„Wx ŽP*Ô‘+Ê&¬lr¹ÏP"@Ð`€Ê6½“nGêùSW´áèÙ[«¥L¥tËÖÃàNƒ1SëÚé¨yþð1 úñ;ýþ“Ç3 >ÜzcË@¸mCÓô‚ÌŒÞL*6Ì'7ưÕòoáhhm˜þا­ð JdlÍÔfqlyâGà ú ¥"lôÍk(‘'êÈquèǶ‰áý;Hå1’óa×ÙÐÑ3%” ¯ôb‘^Ì+  kO":”àaÅ¢›™Ñ’ÆLźø w¨¯¥˜WGâîH“¶"éZJÑ¬È ×} H3ƒh”ÒŒ,œ¦šÙZÏ­TÒвeƒÉ>|˜KñÏm_ŠHö–èËôas]TŠOÕ%ÍÓ$ËÞ£º-k¬l–Ê8Mé8DÊÕ?¡€f\jvÉDtG5Û2‚ DÛø* Á®ž:€ht ‰ÆwB(™Y¦Áf¹j=hàŽYŠ”Áî2»¥ Ö‚}' F—TDBèÚò×–*‚§ ~ed \š [`ípB>Ê”6–§l tzOJ"­£~œB¸sstp ÞwêlÅ 5Aï+òPVtë ÐÄRY–ŒJµÜ𒯱‚¦lè @è}@І 9¬)0ýÍL p±ÁF†C‚ ÜL%0‘1|¼.ýÃÝ<öåFÑ1 ”­Ú}˜ A Uþ8Ödé2’Öe$}.•S!›&:ÿú„:Aö„Ü£MiPë´±\…;r…5 †’9Ú |†„Æ$•aD&˜pßòˆÛR3Å LX?à "8A ™ðÄÚÁº% p´17Æ+€†Ø#;"m#þ“@†g»ÓÃPÑ…ÙŒ•…ÅÚjà“s§§]¢–ïŸlžbíuW--‹£<µç¥NÅ[”³ïæA³ûÞ×àT8Ïþÿgïïž%I’,?ìUs¸™UÝ=;»à» `±Ä>àC¯þé|À+Aá V(â‹v¦§«2󆻙êკÇwÜ̬žîžŠ®Nɺ7ÂÝÜÜ\í¨êïôŽ"óè²iJÐÚ²fîJ™÷³v³2˜CÍ̈Ì¥²¥jÔeËìÓ~÷¯ÿóÿìNÀsYrÔýµ%yqQ—Ç·H:ÿè«"š® R¼(Ù¹CÞ~ôI\§nÊNˆo#ÆÞ{‚ÎÕûya?Ðt³9½™›P¨W÷E×˺÷¿p)í-‰WÌ×vg ×+zÜPr‹òW½ÎS÷Ç-=ü=Œø[ýJ»-ã}ï)³×ÍÞgëëQNâ;L¥KÕøÕDÚÕ©½ê´ü­Ç÷÷]™þÆÕ?Lèü[2· ¿¡ïzŠ~í¹¼ð{W9€Swoºr„ßÿ*üɽþ(ÏÃ__¿¾~}ýúz)UÁ¿x"ͯ¯¿Ý¶F ½> q'gu*1Ø6q}g1*ü6c˜þˇŸ>¯‡µ.k®¢¹™Yû_þ[î?îÿåì“C`$ÜšQk…2Ò¤ì5–F8©„…Œ‘“sžSB$Læ%3aÖkÀs@šQQ—^-_?=O?ìÊ<©q¨‡O_f"m?L†¬»öü¥-­Ö°˜Ìýé¯>f ý@¬Í‹Yq~þ›ú{ªønžL"ˆˆ…hõp@¢¤Š"#¼ˆ1 ês*ZÓ¼Q­…\‘½‚5A"¥  –@ Öµ+°£p.mAÙíæJýéŠæÓL™Š%PfOEÍ`ÑU#ÐdŽXÀ¢xÊåÓ—åó—¶hÿµB^+ Z·Ç,Ý xâ&%GͰ6Ý&ÚÞÌG®h10Üf ªdwøþÔÑ[êóPñÊ u…Oˆ$Ü‘´Á߈bë ¼À‰ ÔÙ@óaeÜùë0…ÌìÒ“Ïp7Ikk‚2°d˜‚"à…JLû‚ÚÀ nH*t[¾DýþêßÙE듾Ks]áDšhtsáé’™@ªe²É‹Üæ ùYm ›J™\”íR&¨Á"…Ú<[,Ò’rLK‡ã<=M ¹ÙÒ–ËÌ=…õ¹e4Т5+¬5¬@лý².þ„šª!Å`ï´^.*msòîZ]¢-£ÔÚ’hˆ¡“À°ªÁD~ÜcÞë9©àD²ÀH%é“*@àƒÃăйäDîJ(wuûßÂT£HTÑ]H¶”f£LÍ4ïÓ~rK’_ˆÊ2LOÊE±"»òdB03ÊiLAd Oé”Gƒ 3}ÉDkh`2™N;¬qÈHËÂ"uŒ‡ÒiŸmmêR{ýFá|O€qYC¥ðCñL|Éè]–aɉ;ZH! GM•“¡M¨ý¾s˜†În„Úš£ŽUÛ"ŒQœovbsq+ݧ° ”KàÜ<~íÌ-”g  «b]>$ò|ï”°²ÛH8¶ŠNÝ@­ÁO¸ "»ûð„¤Ã&”3(u÷q€MØ ”Q|¬Ñ`Ù6¿ëbh Ü@ÀZO:w/v6 d™ JD ™Èµ­ôÆ!¢¡;#«™`Hƒ {N,d+§¹ÁáEeæ‡>~¨•H{§d!ýǽö?´µáPˇ>첋õît¶ xáÎl·ƒ{6•©Ð<3×Z{¦\ÊþÐm‘¤¹0¢5Y[3)j‹µE …2å“OO»ýŸýçgÆ)g²,nDØ—±sk*=¬×ÎkáH¹á{«‚~%Ïü‘ÄÍ_B´ýõõç8zûÝ)ÿ=åþ¡óÊ Ú C}–¸Æ¶Ü6\Iÿ|ìoÿ ÒÿNà*ó®&—/_)ò:õ ž!¯€‘p5Z·<þvl[ºàrÜ}û›ݫҽ­›lÖz_ˆ!º÷ÜEFý.a‡¯¤8.ÄF½ø_ï|ÍÝß“8áÃ\Ë[rmç'¼Aͼ|©ôRmÀÛ®².!L7×V‡\/~èÛz6nQ/üq¨^,?+êåÊËÕçéÎÑ[nÄ‹O¯wƒêtì&¾º¼sù`Bâ-+Ľ±ä#ûfö¦Ó¬;; ¼@{óáÉA<¢qÚ™¿­}¸[ oO W O7CÁ;Ïœ³¹}ºc,{ÖQ"|]Ò[zcAúƒQ“CÛ4z½=ö Gtš¹W'¾}zá9¿\ÊùêñŸ©;]X7ä§ËÎS­Þ©÷ˆ%ÓþÁ•g }þÛŸ–çC["‘YŠëoþ{ßÏþøO­”2Oî0#Ú¡rç“},¶ßµ e牑ÜÍÖš™¯î1C^¬¶0Kj_& ”IšÔ¨¸¹Èu]³ã}„¶TµôɤØÏÅž—úóçܹÏóáÓs‚Q[ýüÌuž?”ò´kŸ—²ó9?ùêÙàvPËnFÜY—…Z„5ëAyÈh™i¦BZ®iJV¬u…­¨[q}4L:²À >‰Za@]ÑP¨uè}£^•0C]2ê!#X`)7˜XÒ,k3ËÖ²-Š¥¼ P5¬ ÖS;)s¬Ë¨îäœ.ŠÉ@GT0 ÿÌè-ŸÐ™P 9²$†I)â¨ßgˆVA‚]¦D¯Æ¡„éôÌìÇ0|MmT13A‡©‘hú]¶¹Ú•;Ž4F‡ütÅ_9fä$he*"kÝéVäJ„”>SÍ|†$U9Ufppæ•ݞסÃV)Ë4§`4¡µ ‚æ$¬+µ£>ÛIɬkBöÖy7f•M–¹jIJž/—Õ0…Ú ¶²÷l¶·©FþáÓ—ßìu8´C®óÇòqÿa?í ¸´‰õ9¡œ&ߨå§C¬a˜öóÓ§z‡V%¤*vÛ”T…‚0(¨Fš°%x(Ä–Þk)&La? “Ê-Xi2"… L.”à؉„*´T2WиRUð•-‡\knRšX%¦(kDû°„¡ˆlhö”l@Ð YÄ4Ã퀶B„7È‘›³€íg¸afGdˆÕBª“OËj¬´E ¢¥O˜ ç(ìÝ'QÑš0„ii!ˆØ4w€=GÉ-ÆÙ_0}Y„Ïêvó„}¡…žÈpÅ>mV´É™Bv+ãSà¡|PwtŒA4ø?ڬĻŸ¶6“Œ]Á‡ðüe¸ ä~;û—ÞŠºü-\F˜…(µ;‡w½>"©Îô@`@ é Å'9:¥è@ ­@Ïáf[WJžHe!d‚‚T`ÓV®ÞŒÊX?ýçÇ ‡Úví…PB ˆÑƇ£têa8,rÞ`"­¦M*e_8M;L,“æi®Þž3¹ä<ékrÂÇçòã“ÏS‰È¨µ”Yn5‘IÌ3Ýe-…µ†O&À JRFæÆÌ̼?(ÍLLE‹¬5¢6Ieòi¿ûþÓÿôµƒç7îIïçEýÿUèwÖ|ÚAë"š9·"Â:ž:ò^뀽{iÎ8ßtêD(Q3[0~ ·¼Ö¶Žü¥›QåÑ»âŸsì£'Ú[¾úý¦÷î­Ž— '¿ª—'õBmòyRç¾{ðõ&ÿþǾ÷Š<êü¾•Sßµs| Ò7¬'qœ¯ð^ï+úË…Îç}ô](^l:yc¯ÀÛ&ƒn$ûÓþ–eäÕôØÝ[àQà½êÓ5ßÿN`ìÞt~oZñ±½aú(¾yò^.GÜ~v$<Æ"|ÁÜà>fnCÝÓKïñô/5>^;®8zmšézíÔ ³›Ó/|é¶ÐiÀø÷o¤ñ{ÝÓ×Çœ9ž/5ì‡bæ¨Þ£Ý6Ù½kùhhÈëõò$ŽÀò2þ&_·[x -çÖAã¥ã×ësP÷pü·~ :³iÀùÞã¥oz dóN¾ílZ]ß>—¥P|Kd$Ü+Æ.â6/ñÒÔà‘êÊ’š&³.[¹_ôé8ÃßF…WÐÍéˆWL«³5ôáõÃ+5 ã± û$¾+jäÍÒ¯r÷dz]ä-ƒOg Ø¹õÕ u7ü}¾Ü¨ˆwÿ#i&£¢OûÓúù9jëî…4k…Ó?ÿ?–ýžÅZ„”ËÚÜJføÄ¨ˆÖ¬‹Î2KWû¼dÔi·£8ÙHÙT¦9ê’‘M2cI$-SiٹኴRd„%òó¡-«Uè¿}*ÓTœüœa"¦°C~^ÖŸ¿Ø_ÿXöÅžÿŽ“—§©ß˜IGËFd´UíyÈ\ÔÖhʤ˜\fŠ.¶Q«>´ (;X ·¬ 6䊨@WÕ)8[¼ÿ@™À¨QaIAl2å€#,Ö¦ëBt‚9›ó΄mzzºHÝ DóqcVÀè6ÿDgŽ×¡¦u¡ñ(Df"…žuèmî°¦sD dOC¯Â_÷õÍaAl€HˆŠÜlW‡æX‰XQ||Kv·ÏD® aŽÌÍ‹X Gu3¶ JÔÚ‚ËT´™µ…›Eh僙'æ0§É"i3 S‰”úmAš’uT‰ŽÈ7ëù>×i7™ •pÚ4;©È@`r7óÉÑœ¾›üï~z®¡ÝŒÝŽë2ÍÅwJ>cYêÓn¿Û==?/„vÓláuik4›¼Õ0™ÉL^òÐtH#[‹OùÜI ÈZE СU¦1T5U#D-{ û¨<ÉDë9b5LÆy†M˜ÍZ¨&p"K&'ª%m"…V‘‰ÙmO hM‘˜ˆ"’ ƒ„DZg>% F ÊÌiJ+Pg¿Lj©£Q€=‰/2JuEv(Š f5ôyÕäô .Ô¼S -¡Y‚XHS6´–4”l†{&>}Ž"Oˆi€!h]:7^ƒŒLõÚÿ¼yLØx'õÜZ¯Ow×´S×]flÊ(x*VS6ËvÀŠ)¹vÙº€EH´^ýzøæÃÑ²Ž ±+ûì>ÌsÞ·Û¼LH¡­°Dj$*|Ãý'gÄý°újcÁí×όРtXC8\›UoWdŒŸ¡Ñoù¿ÖF²Ð\€„̓KÆN+r¨'÷Õ[æ/7¿ö3µÁ3žáx2c‘Ñ€ ©ç–HCVÔÚ‚HD¢%l‚`œf„F›Pž¢|Àüŵº5LS™w阊ÿÕGxab‚g1[Ýûd Ï‹¦™ùiá²§Íe%:[¬Øšcá LÓ8ls…Z‹I£›Õ–‚”Ú{R´ˆÖ²EÔÚ–- Øäó~÷ôÛìë8_ŒõNù{·°ÂyzÚ^\mÃ-zP€£±SÜþà±tà÷cÆÇúìË‘ÏsÛ(ÙçUáÃ&/]ý]Ugæ§ç‚ôå;ïÆ˜/íÏa |@H½[ZóJñRKíÍ&k-JAj.-KPM¹´8´u¡*3ˆ4ä¦:I©èju@’ ƒÞ-ˆ=?òª£D…*L;DZy/é5Œbv³Åv—¿!¡Á’^,ZB‚¡ôÖ Q5šJ ­\mÓë7ÌN­H‡ÙPÖ†vMÔë3d Áw˜Ÿ†Ýn¯,î‚£MCž£a2° LØ}D]G1¾Ïæ›O©†‡§2@›"éÆ3Ì9}‚9åßH°Žž0‚DÌàŽÐ漡Q @BuïUKXFʬa2s7uCJÎ;ßÍS*R j.%”©Rdìé%/}8Ù¢µÐ®LFºÑz €Ýí)Y¡›3¡4eUCÌH±È››¡¸·–YT‡¶®«˜Ó„OŸÁ}†¬}©ˆ,œ”2¸1„¥~¶˜ÁlÑ–µ>yyšžíÀçy?Íe·®‹Éš…™ùŽjÐ2© ƒ„X{ïd÷«…¶@‰°ì~ª&ØÐoØúH&Œ&ZSÒU&,‚Uî¨HHLÀÑm¾¡]5gN¤&Lb![E3erž…Ä$LÄJ´  Ý % 4ÊføÂ0é‚ëÚ©QeŸ²%Ýd †¢--!G4¤Ò ž^Èi'Z÷‡Ø&9£×¤g"áTX‹ž‹ˆh-•€9áQvøa·‹ÈOëZ[*Ѥ8«&˜ŒÑYSD›¶’ ÊŒiÄž°ü89ŠÂ3*l§ù#ÚϘf¨¡ü i„¬È…L©cjUï®äÙhÔí>ðŸî®‘ÌpxÆú<8?þX§(à¢ê—gÉÜkÀe‰pž¿3†3°î0¡ÅøÏ&(Æm›Ý¨À èp Ò ñ.{ÐK?Õeã+wÈåªÎwÙ‹||xäã³ÐÝ0îÁ1¾#ÐâÍ__­~¾_dÊûf²÷|yøÝâ°íêwãùð>ºô¼Ò¯.9 AgÕ1/9ÿ¾€óW‘§ë©§í =w™”¯6¼sÈù>-ô¦$žç-o?½|?óñ;îM8ÝX¼zÛeQOÐóó;ýX‡Ók$ùjØzшz¬žæ™åïÉ,ýüŒômWëQ?ð[>÷Ý87}7×0S=Ëígë,ó}5wyÙüûÚ~ï\™¾Ü=¾ÜKørWéÖ‡|TÞÞaÇw>@¯î,¾ðù/7ß]¨uÕ¼r3€FëŸlÇÇØ©• åce–>ÿþçõyi‡µk€>•4øä©Ñ$Ö:ÛÎ@S2³ÕÖÝý´ˆ¤¯µí vàµ1¼¤m່\+BNØäa–Mô€™ ’Å4e™™-hÓþ‹¿ýïE8ï­ììã_}hk[–f@mõ‡6›Z[–ÖÊ5—UÙœ&Mn0ÀØ©  QÁD—ŒÝ¨Z„j.Ĕͮ“¨+C@4dŒ^ÛÙAÝâ²kèËšFˆª-"28 ëê Z¼@HD7 äÅ·š\,à˜ ¬ ˆ@EÖÎ7œF |ؘ<#ÖÙÛ ƒÍ lÂ4!*R•>’ÎñïÉ^^ͶùyÆÖ1˜!ºc÷¼Åvð„ Þ <$erÂUk& ­˜NT£ #8•"‹ˆœfFYzÒ»²o­IÈ€âÞ ”œB­Í K™ÕV·æyÁR¥hž¬µëð6sž&Ò`t‹¶föRwÊ—EÙ%Xœæ°5Ö%6ÒFÂÌvvŸ×/qˆiš½Ìæ¾Ö¥}eÔ5?&²,VQWÐЪž™Û –XëH˜ˆc]6GV&¤HœR É\üývU«lÐÎÑ€çH xÑÎi¦lÁL5®&¡&ȱ(®‘»bnêÉÖÖ»60ÒJ1¦PÛ\DmH©¹œÀÊ$DõÆšŒž @ÿ,Ì¡À”l ç]ì¶l´!‘g¢Ue‚äl.*©TLîf†Dq"ÍÁ])³ãóÚú ç©|Yêƒ-  ³k¿$wÅVå4±ì¦8% õ˜‹E• ¨_µ;÷жy_'2QfØFÓ²í‹:zÈz!ZŒâü±V$ ̽WøáGÄ3bÝ`A—”ÿí{:¼çt{ê¬Þ?/IAýŸÞR`•þ½YG†X‘<:ã9d£³ç:k¨@ŽÈQÂO¡ÅFD$¨+,6Oà ø°0é6$=•hýjmÆ Š‘/ìñ€ÚÌ®³nä±D­Xž‘ ”=ì 48éæö!“­}a™Åe»§2ïµ3zZ©îúðT 5d£å¯ÿ‘SÊgÏ„×9ÜuH04‹™b‘‘Ø”>‚.SR»=ö.‚!-)šÜAˆrvyak(ªìžä@2ÀÒ3@‚”‰Ödƒ ®ÜâlR”䆱²Äd`p$S"@X, jr­hêCòem™9ßûTSµqA€twJÝaº¥µ%ÆÓ€i[Rxš±Ÿ)S:D5æÓ‹3, œÄ§ôdÚõòøP팯62yÝAƒÍð‚¬0'DƒÖžŽâ{/ügŽ«i€úÊch Z&ºL@¡mBÿ±µ ¶ÜÀU ‘›Ê›èÕ@ãI1þE Fô>0l)(ÖFžRŽèéLì~l½>Ç=à0BXF@ïoè>L˜òwd§¨å86ëÉ uE«#¡¡-ÁPXˆsAoq’s¦ï¼ZAyú€²Ÿ`{bg¾‹²£ ÍlžedÀg/?ü@‡öö~覾ÉñqÒ‡=v{f]k²”dŽÝ”N€FvÇšZ[ÍTŠd´fî4ëÿÚÛÁLBf]ÛZ+ZDmY» •¹ü'ÿÅq*]IÝUCoÕÿ£‚|.÷lY^lJ¶àœ%/ÌNU/ìöâãñðV8Æ¥„›Ý›Îu¢s–Åmñ‰Îص:Ç\o*Q_àF>`*^¨gØz܆~7ÇüŽèî\.»Ü¹ó"êã)x×™ C¿zã3ƒ·Ÿ‹„üa6;å—S\_‘úå^ïB]iLo,JåWÅ7¤â_+BÛQðW’Ð/’ÚûE†•ß8¯øÇ8ïõû_]žÂœSÒDoRßßœ§GqcWõK§¹‘€?¥¹ûºËáÈ7–„<ú¨¿—'îYà~?ÿ|j©öÿX8væý{*R8A.ðùoÿ°|~®ËÊ”»µŒi?OóL7s£,%Åšlp_ëŠhœ‡u i¿µ"¢ÅŸw“©˜æfF¤"LINº¥ä‘B'­sòÙz•k]–º¶ÒÒ–ê?îsmÓd‘©¹ÖhÍ '?þõú°;üü9þ·ÿ!ךʴ蕕0Ÿæ2ýH-8|9|úÚˆœ…V£V¨12É€+±ž²v pCÔQáÞ©5]éòœÖááÙ}=£3ñ‰ú¼-+9Ô«®õ¬€ù¦ksóÈè®ã ŠÓñ>½Z‚|ЇX D™g=:ùÚ` P `È„ç×Ü”[ÃÁ™$|?0ý´¥1̆€OCbH¡L3>ý~”ðw ШýG÷•EW»·gç›÷ÓéÛó^†Ìó"äyŽžA!Ø Nq3†k°ÍŠyKDä‘ÑnðHтԴDÈv©õùÐæ©ì&J¡Q–k™Y£f¦ÂÀ ]‰Ú²X™vÅ j«ë»2'B&‚­æTŒÄ¼ç²¨V´mQ¿³–µÕµõœÕ~* #˜›',hœ5ïÍZËÚ»ifc!Z]ëÚ “1­u1ÑàSÌ"kV³û¬¢`iXåX½*6(*ڂЩ¦»«ÿÜD^W&¤öG Ú¢AԮѡ? aU>‘>!*‹sNeÐ&$PKNÅ KËæbrÊ^ÑŒb8ÁÉ@cRÜÉ7ÎD3¨èð¹¹IŠfi{Ð f2ëþ ò.Œ@܆nΙÝ„jƒ9(Ôo™ P0³™óäz®+€UQ×èÓ&š2™²CèËÚÊä…lÒa¼,Óèx“¢rwÌ3̱Ÿl-é.Ÿ1;fcÍÖ ÀÓl•™dBƒ iSÃÙ¸ÑÆÙA0 è4Ø8ä·Ñ¢§h€Á„V±w˜۬ƒKv9z=};ýí,ÁÞ¶¼¤ýÊ1;9–)–(†àÐób{c4.½@djŒgÖe< ÎÖõzŽ•D¶™š™L§9´ÙNô– Ðºµ¢­cÅ먷V´ë‚ì‡ÑЂ{7yJ4'6ùŒ™ä\ô4•ýSN¦]=À²›¢ »”Òd»ÙöešÅÆ‚*”'çÄVËÂb,.÷ÌgsD$†­±Ù"öE²¸Ñ˜©”˜šœ­‚@]kÔ¦µuRfæóôüëÿäí¿ÕÞ袞ÿ!hû¢žoÅêÅÿÄSMý×ÅT·U´ïäÿœK·#—v?p–ãØ*n^Лþ¼vIוP—[Òk­ϯ1÷^_Ã/ó½¿ '·û…{éëBçW”êŸTÑó%걂ÿÎ=ÿè÷!‰ ùFëWugüåBç¿»Zò¦ ï¼×|î;s¶s¿N¼ý"¾üÎ_ôîøz€oФ¶ 3ï~âYíü7%ήáCÇwÔÆx¿Ÿx!­Ëw,ñWÃ÷:2Go0ü¹‘èÞJâ¹™¼ sð’ùô›‚Öï¨Bò•$] í|A§~ÃYñ¼áá±’.l¼‹fž·&{U“NÿzÇ•XxP<~~—Ÿ×ã w㉋¶W>@ñ‘ƒî7ä®.©ÞµŒ^ ¿mHqÓp¹òçqáý¨ìˆ'ãìûë»ÐR•6LÔ«~tm»®¸Áƒ¾i|E×ê÷ÝʼÛ{w‚úŸæ!;“£WžUZ²9¾üþ§åó¡­•)/Þ”Ó~绩Ñn0v B¤“{ÎÈÌZãP… ²EFüt°uš>>1“-¸¬eÞ±0ZEñu©Ý5Ô%ϤÁ¼¬­ B­6Ïëa8Ñl]£®ñ)Û>å~"χC” æ`üüü‡ÿ×3í‘ÊéGÔç¬?·%×yŸ²pøy]–g >¡ùZ¿Ô¨éhÙÒ-3’”OR ê¶X)~Ðoz'›•‰žGOÚ®æûÀdÑÚ&µç(º?¥ †Ö¿iÛìÒ£Ù¨Âm JDC$|‡®²„Ï&C[QfСÏP/Þw° M'Ý›Fݽl¤%øÚø–îT\¦íð ÀH0´@™±>£­ˆ†iÆÓ}º[ìpÖêeó,%´¶A eý‹²m¢mŽ‘ïñìÞ§´ ô˜jV {µ’õ´Ÿi\×¥eÒÌæ2{q©=}ðÃÊVÜ­¶–‘4ƒk¶’Ý?¶U ­ Ij÷Ñæ½·šÙXPvÓœTDUÂ\V(èphmMc!BŠV‘Yw¦yª‡TJÉ;Rˆ¢H¦Ö5sZ§'§v––«˜Ê¼C™0žW$Œvø´´È¬Æº ])µÞ˜B˜…hÝ-vbÎjs‰BƒÐš&ä*¦Ð(&&d#Cʉ–‰…عvÒ”ðE2 z§!­Ñæ‰Ju½Þ„SLÁ¡n  ®‘Ž5éTem¾— lL‚Pö³&ÅæDˆ Õ[³²uØ;PҨm¦õ›®{ôê:ÚfMÂÎÌÀ§²[[<¯±ªÖÔ,Ìb–ÊS9ÔÖ±_‘JÀ‰P‡ÈOøðaÌÆféEó>ub”ìEïº(h‰-0QE=qÈÓÀ-Hýž²!ë« ¸?9JéUïžD7YÕ÷Ž%àuÔþkÓ÷}¶Uúˆ³'Gщ„KV]t¾ÆE %d zÆgëïÙ`œJÈ·´_™Œ‹%A¢V`E™àÓXQ£vã9’ȾNÈDVD®c^„cMˆ¬ÈDT´@&Üà†2cšXÂäŠT¦ÓfKeöýÓ\öª¤ûôá Bº<&Õ¦â6y™ì°TkQæRvî6[$lÚÖ2SÊÌìC@—²?[LeJÅ­w+µÈ £ˆ~©53Õ¢u©ÙZ¬-#ùTÊ\þƒýŸ|øíxaÓy,ß½Ó¾©«ðf+g;©GØÇ­ò:µ ôÖèG„𗼝Ößop=ÀE0w_ÍѱóÞϛŽ×7!—·|”€9o8øå½gûJæéË^ÐRy¹øFë5†íK—ã6  pÕp37¾É´ë>Üøhø£Ioߘƒ9Û\$ðZwÂ{ÕÿŸsœy3-©a;–=ý­_‘»Kúº©ø:ÿBãÑ“åŠruÑr“·xuò½ÀqÚ~ý˜9­l— ‹Ksé—aJWåQææQnæ<½wuq_>å#óçndP‰×w™þ¼ê Ôix¶5þTòuÍ0º|ÿüˆî yöa¼øê[ ã‘Â}}´—?x¢Úëæ‹t´ ¸+âÞ~//²YgSz)Ír‹ª9Þú}ÆèNf‚·“{Éâ6÷Á‡÷ÑYCÛÙèòó_Ê`o4#Γ9|%S$\®sw'óåÓkè»òùuväðr¹¶\žÚu*ˆÄFUí”#òáà»yÏ€<·ÃöˆTór3ÄåsúDg}˜šxc$z߆… .(«ÛSòr%ÕkÉ?Ý6Z¾+P¾Ýv~e|yöP¼¶·iÇ0‚…-»q^C7Œ?ÿíO‡ÏÏm­J-ë:Ù´ûðÁç‰ÆÈ°›\$JÔJ˜Z5)j­Ë"w´ižì‡2Gjñ"²L^Êœ-ë—%•nIÜïv€° Q’¢­.`YùyÑGé§Ïå‡,û)n˜Œ` o%Û§gËïÿ§ZcŸÄ™k¢&›[0К—Lóy5ƒ¤X¢=‡MIϨ]ÆÒö;ÌŠÚ¬¶…º"niDf禈âaiÏÀ~šžk«‘fãÇÉŸ+&·È<Ôæ._@Áhzèªýn:|\e†Ï(=‹¦TØ.MR”LˆïØ+ÀL™4 åš~ó›àe¬é9Œ1ðž'ãfÑ1lÉ!à˜&!‘%Œèélʼo¥ýyöôòËßNöø^>ÛòÒ9 °•ùÇÖ”sÆ[å=$ Îý÷Óó㿬S¼ˆLä:I°™@¬ÿõyœo÷ÆH š¼k;ñÕki­—·é¢à£'Kox—!„Þª_½DÀûº×;;¾Ï—Þï¸Ò¸øÍ_ú~rʧ_Ûíð-™Ê—gÅë«Ã6ÄÚ5ä_Ûð½ÎŠGü‚è•—:^\ÿ®¿Ë[oØðä×ô}úçEYúßC1ÇÝâ/xAÞÔðKœèÅPç)¦—ãáªåë^åoj”þøËù‹7Á•A3IëÐi\šÂoÐótéóOŸŸŸë²*ãyY}*eš­¸;ÍK ®µ®l™‰Ì¥Öˆd)ÓZwP¡ÍD«5>}jO;zI‚óTœ †y:´+"RÈLs÷BÀ3ÊtS­h¢¤¥*´.µýôeÞOìUhE³P#§d3¶„ˆ‰¦9x e‚³#…ÖEA5ªÁA¹T8™ÐÀ© Ç’`i˜úNÕÕ¿T•HÈ´׆h ×ÌáqmTt›þ·½s¥OV‡Ú]Ü„ì­'n-i|švMy¨­JMP†; "33•2ãn*Kí¦'ÝÐ óV@Ã4cÚÄü¸cÚcý YM4ô&€b¶fp“•ê{ÙÐ}Ñû:£Þî@˜¡5°óŽ€Ù6Y¼Àld¹iöÚZ–Ãè{@Ÿt’ò··œv´öÝÿíìY—6·4Æ>ñ|S Lû› v— óÃ&ûlƒ6,*z"Ä‘v&ø|,,u•3„‚b4,ô}zB]C)ëVý”0À x)Éž+ÚqG›jqúnÂ~Þí|Þ7Ÿrö6ÜgOíæ06™±¹fÖ•fÌÅöEeªf©l5 E> ŒÚ2eƒ/¼=ã ³SÔ”] í Ù &Ôj]Z¬ ­u±øŸýÿjÿñÃýÛMÒ»Sÿ ³¶?^ÕÇJ@6ÌÆñ ÏÑÖÚMf»øð°àqÉŒ6±V=÷þ€7j/u¾ rÞцþöó•€×Óo”›ïÆ|ç6ÆgÆT§ îí_±¯ù¶€_ô²|¥ùŠó#ø»lu2ü¶¾ ÝÉ‹œÅNõïÞðâë¦J|Ç€oLJý'ÿ@ óßá–ÜðÞ)ý7ø1ûB%å›Úï¼ÿ…#ü^4ãò>Ùî¼@_¹¢ÝíãVù¬7~æ2ÿn¸ú-Óú/ Ò®“×î÷8±?'?~¯“|¿Ñ…~ñ3Óå²ñ»)_ý~ËRrw‘½4:¿,zͨçÚgí—PëO'þ½žÁçðÛ¾ žUhürOåã~öÕ ÷­nW>Ú7ðÝG…ôÂöï]O­÷ÍŠ{Uç}:å½·Âç‘q5¦ï©8ä6âÖ/‡õ°Ddm«MnS±¹h”q* sߌ¼Ò;é¢S-©æÊ¶®yÈC¦žž&h¿£M%RŽÌbѸDN¤M;šu¸=çâFHëO‡º¬˜}þøªíó‚Cõ†¨M?}žvóúÓ笑¿û˜$”íyYþ×ã®ð E´ U¢á¦ŽØ†gûb­eTåÀXˆ”¢‘šºþôG®È>–6`Ö Z8‡è w8mðŠÞðu¦sIÃ^ ŒÉp»ÍýèßÒ!<™&@ð=dh ì#¬cFÚV„ÛPꢹƒ‚ïC6d…´^¶2aƒR€Ã €ñ¥ÜÇ{:DÛ¦­K  ~Ís«î–¤†¨È˲w¿Þ ± y[×XÑÆ÷Ú–$@k ‘@¬£¤Õ§’”§[>®‚a@WxPŒÔ¢I4ÍNZ±ÒdŽ aëÕœHW¶›]‘·‚ÃÚ9Ц¬¡â^¦yJ4³V•hª~Xkæbi@˽Ì2ËnòOÙPXk€ñ7O… ²æºÂ òC˜—åK¶%ó›}°a}n%–x®M5”˜æÎª«&ŒS¶¦qÂìw_ DqMÌT!ê…ãfH(˜a)4#4*-Q³RÉB¢1÷ÄΑвXzrAÌ@@³áÙ;B¼ ”4yGù9Œ©á„"¤ÒŠè•‘$‘I   ‚kФ&4°šÈ‘wî*®¤n¼qò©6¹DF/ùÏV»A·uC€MZ"×H¡Õ”§©´ˆCmĆýy®-óÚ+Ð fpˆ² »Qv á𦹋·42|¦ÚÛx­óŠ4$ï.Ôcc‚)ᛳE6XïÅÉ‘žéi³ÜLD¢ &¢Â ¦ÑdC¡lóö8êûýåG;_`g˜ˆ ¬g¹ãkB?àÁ Âcð¦¥oϰcé·nãyc0Žf&m >C1ìy{—€úÁ8ãØé:¼r؃Ó!–‘‚=z‡|ú  ¨½/ŹFš#ú·CL47ò%¹+¥ìveÞOe7O;Ìs-DÖFx€žÌíÇ9•)›]»ÙwsÒ­FmIKŸwN¶Þæ$%8¹4D¤6CR3÷VkÍžQqÖ e¤Z¶¥ÅZëÚœô©ü‹õÍû݇ßýˆ·Üï³ÿ‡ 4ÿ'q«{½ ¡¾B¥?û‡ßõ=Rÿïua^›ã–vôKÅÚ_—à/ñ~ û/[Íu–øŽ&·ÙžlÓø_|{w„Þ%ý¥²ß%—ðbfHß2Èw7uC|•ç~—ùþ–ôÏÇç|Êý¹Yt|ÓqÕ~ñ iüCçß²G~ûÒ Ë*‡÷¦:Î{Dî>ÎnïYò6ïx^’÷>tÒ«fËWlá6š FĆ:"O°œÈåz€Fé„ ˆ§Ý#Øä2sƒñ8£[ÜJ4c°‰tñ"WáÎy’ඉïF "{§ÛdÈ© –¼·ÔÞ»wšÒnRêç:OñÏæÌ/ƒ¬M¯Îò’qWîoظGÒéJ^P•¶@Œ×'{[™¢Ñ¬¨‹|ËQh8bH¨Sðz%ì^k¾>Lýð޼~'~åE©ìÕWR§‹§«±¼Ý¦Ÿº(t¦ßöß®³IDÜD¾¸p¨¾ş©súu}Þ¼¼ ^Í:ê^®‚ ܱìQRc;µ3¦¯ï»£ˆoJ”ðôÙ÷f_Ý.–áó€]Ž}ä1$â·é"›øb#êÝDÂÙ=Ä‘W¸énÛdY=ÜÏo§Î«ÅO®È¼8;Þºóÿ¦zˆ“Ü>þBbÞÏ>OÓ\ŠVJ—¨×Šqro-К™¥a¢í>ìܬ-K5›;cQDX%šÌ H!™Œï4=°ŸËÂvÿm]³Åõc.»iÖó—fHÔŵ´ÏÿóïeòŸÿç4M.D›"2j¨ Õ=}4–d®”§ÿÐì`Ê®|P|Âüq»]:¦DXŸa¶”hGÐÀÝ0¢ôë0nCt¾M—)5Xÿ}¬»q¥søj½r{hKÈ sËîôëH‡Êe4”ßXŒ^Þ«Ó€rZÙ@ƒ9¦'d¢Û4AeÄKîC̶Ùur¨‡#àPƒ•Á1 ‹Ñ®ö‘ãŒNĪ»ˆß= 6d¿•­5‡y²ûè–0@4ezq@ô,…€i¤7¢,EÏ P9 ‡™H޶sD‚ä<—V[4Ÿ—ÅŠÙþÃ~’²ñù°î÷ž–å°F(eAXÔ´püðCY>£LS*,![>kfÏ 3kKžkËæôˆ ÙD­¦9+“÷žAÙàa²Õñ¿YÃá÷ŠÏÍSmm¿ÿ”V¸ûaf™š``)S;45%EÐvªRM­Lûi9´^½ë¦–¬¦T‡ÿwâ<ˆäšjÀLíˆTôŒ”’š'Ò j²Ö`TÀDÓ®¨þEIÉ“0¥A‰&C)q*5'[ —XȤÓæjÕfC4)Ç£&RÈ€ ^B ª[ÝvõMƒ9kC ¹°nh94îãR–9ŒaûãÝv50»¹%„–jft÷QÈt›ÜS `iña*ûb5òóRÔÎkß7Ð0M˜gøŸPfp‰XàĺB@]ÀÁèX¥CŠz§¶V! Ö;¼«ÿ[+ bsÌîÏ'bƒ_qÀŽŽ<KXž‰õº‡ò,ëD#5ž0G»å¯çʱeGõu Amœj$"0±ÈÜšånÍàÌyç»ßzªPsÎó<ï9ïÜgYIsoš5æy!öOO61Ȭ’MfM^æjž©0ïz3[ 2aæLˆdfÚ¶­×ѹµá£LJÊÖjk Ekm©Ë²2åä?ÿÿÃÝÇ?þãß]Iª·AÁÁ“Ë/¤ÿmÜÖt—÷37•£Š{¶—¿i‚¼'ô|}Gø<äÕ·á9óçd‰×‹F6÷žv#2][’êœØzŒoPÎÇHó;¤{Dþ+!Fg_y3>‘þ¹¬Ï#}ëHz=z<__ÞG UÝÝsl•™¼…öœ²n´;ªN;ð«ö‡w3.S¼á‹ RÝOQ¼¬ }_uòÖãáåÏ—°{ãNÓù^ÁÒki¤û:ç Ïê%+Ú+:ЕsÀ¹:|5±ÏÁ&·KÊÙfô\ö{Å õ—6ñÖ%(æDݺq ác„ÀíÆðJC•2ô(ïò— ÑþÕ{­oêEž'Cz÷Ñ…¾|öæóEŸ·ÂνÝý;²¶×2íÝq¸ßpµÂ<Êv¼,(½*2¼3xùõžž9=«»7ùã—äG<ù_Iý\gGu_?=s_‘o©ã~{_Ý˧òÎØ‹  c’€ß~,o*%çûψßï"ðmàë¯ÔûÇNxó vü‰›^â?R¿õ—/Sº»¦â»´N%peö¯$ÒhÛOð;ŒÂýüõ÷jݺÊhð6ûöðé&Çþ}g–¾îWyýÀ9Êä½ÞÏ÷>üªJœ«]¹Þ>7u— x~d=¾5Q\À7û¥}þ»Ÿ–χhM‘‘if’ê²H*S17O³žëÎÚzéqf 5­«ME6A"a™qX‚6ÿ°ûò%i–»ÙÜ B²˜¡@3y™¦¬íPW#}IÖöwŸòÇ=@=ýøƒjË?üÌLýô©ýáSƪ„¤üi)?ÌüÍÆú¿þ¿3Q[«îͼ%„P4D³¨VžBEî*.W¶Õƒ6ÏÖZÝí;¥‡p) ¢d¢Ìˆ‡Op›ŒQ¸š 6a"ÔÐ8æ|Eæ°åì â€ÔC0ŽØîmÖ/Ž9(3² rEWæFåvûÎÈ> RP—Âa 6´®¡¶ âÝQ€/@bøô"úQb?t)€¯ÏiSó n£ÛàôÄ·S¶ s„?GDRw?î¤#ŸáóV80ÁrÔ†Ýï¦Ræö¼¦!#môóX†ÕçÈÚf›¼e>†lj›ép´-¤jk)L»Ù`k­L…Åóò¬°É§y'wŠôâKki®h™Ìò-ZZ½5‘•µµ2qï‹ WŧuÍdJ`kÈ؈JíØ2K¢e¶µ ê‚æºrixr|ú F¬aóì`®U¥€>ÚÍ“ïfqˆOËR¬05¹"W&¤åy!¤V}еóRúŸA)éiFÑDÇ—F …0QeÿsòIzr5 “dB³”4lÉÙ© >'-“Pn°Dcá´4­B„@| š¦Hr$© œŒÕ$JÝÅH“oæÆ”™ˆ„¹² F2‚JJòIÅÁ€%J°†XA—Öà$6Ëß^˜ßÕó~'z÷g§/‡Z³÷½`WŽ®qÝâOáXz;n=Úô•¡î@x¿YkûE;xô/»§/ÜýÞoè¸Vf¿cô{–¼8¯9Ô±Šàwk~Ðð¸@è+ÏéAZâUPëßsÀ»Ì¾%mv¶ºãÖ%mcÜóõý"¶pƒz¤~EÀ£DàÝ\ÔŸZÀÕØ¾`öðÕŸùÆÀûöÞ—[Æ¿ èüËÃÅÛŠÒKéÿ™±÷'/ÿÞgéÿ–)oÖù}õÒ_âõK黄ðgDÙù®‚ñ/Tú£\=è­Iˆ—Öý?Þ ðK´~^ôÝø÷:ï>ôÞ™màU ÄaÞöÕ[¤?ùåã{ ÷ÿÞÛo¿Ûƒóù󗃳?Ú3øšx{]o3vuõÓßüaýò\—‘f&&ÏÅ4J^ÜwSŒÞjgö£Ö "ÂÌP¢Fw¥D h-F€ó<Ü›Œ~é’Ó:¹UJ¶Z3'ë*"óùЖj³ã°ú²J°eš}ýÛO qb|ðùã~ù_þ;¬)¤yÀk¶ê có’Ô˜AYZI®ÞA* ¤à;ª1˜ÀŸã8CÌ·­˜÷ !W”=²‰Ö ø‰ÌôÉD<Ã'8ªÂ|ô6ªmż¶E“ÝA”ik«þ­ŒjÜòåjU·õ3~ü'ð q€O¨u؇v~NôŽÍd¸!Ì`Ó È:ÄDt<úQwÓàiŒ‰Q&ûä~l'q³ñ §Ÿø)º0߬’^†ZwÚ¢˜°Ø.€‰8,ÈvÌUÔeSwÕëh†Ü“¶QD £(˜„;Œ#×"ŒsIHŽZ×ÉÊÓn¦YË5SÓTöO%é#kx¢YÑÓnÇ)#Ûä~ø°y,Xk›Üw6ìÓÏÏ í÷…Y) *@u-0£™—`~©V ]L°Ì4'ŸY ¢MkÕb?eÔD>ÎOªX–µÖŠ"çT×ø¼gN¥pPÔ„RdN$€ŠL`I®M…iÄÚ¸&˜Óˆ&U‘Оœ`“ %—f2Ò—¦H}4‘JH‘i¡}d÷hÈ …c3Q•1‹tpR ¦è¦¹gÇŠŠ¡jh VÀCp¥fI&¤(¢;¤jîCÈÊÞIT[Çe]ŸSLÉ€gQ‰ÉF_NŸ·½ˆ¾Vpë–Œ@ŸµåpÁPfm1/Å•éÆÉ]­µhH5ˆk›ŠeòP£æ©…±»>ƒ:ŠÃO ŒBuÆy@ر™crö9.ç¨G7éý.¶Y¸ ½1¢[–.ÇçWA “´½¨ 3í2ÁÖ“sÛqL·çY¿m¶ÀǨĶ?íRÜ﹦ëþWÛÂ1ç)÷­-#Bé@ ¨îé¿Éžêë’õ´Õ(óªW"ÚÀŽYAÙ#È“x?÷᣾¹‰t‰»­`$˜Lp²Œ#Î4&•röy6߹零¯s‹â§sm ˜ ÿqgB‚ѰFìv3ö´{j×M0sË̵5‚¡,®w4SkØðŒï­EmQ[¶üÇÿοKc™§ÝO?þ£ß½†]Å¾ïª ¾‰Fõ]BbK|ÿÛ/-µüÅ"EΓ@b„îE´—ݘãêá¯6ƒýÚë×_‹«éÁ›ÍïËî½§ùBÂà^ºáÏA«º‡îù%>ùnêå{|þŸ1tþùœ|}ßRþ]5›·>o/ýØï¯“·="—¯‹ßz9 ðݯB¹:eÿ×6fÄ%„Û÷_`8p>9·µÙªôÏQ)qñT¬~oi|!¿sÞ2œ‘ήó‡«2ÙípyÝàñ‚2 œŠƒÏ¿èé|ýSmSóŽ©.Ê‹ t†¶ÐQ\æ÷GgÍd½s§nù´Q:él(ÎZ~·ÉÇ›¼…{ug_ßüø`Nv¯'¶ÎŒÔ¹+×ÛÈ0—]Ÿ—Ô^Ôågðö:/\fÜJÖº3wy\¿Žg=&äÅm|³Ê#¯TgžQ§‘&Îòº9 á"þºþ\TŸÑGôR3o׸Ó_ÏŠ¥OÍëYqN2â6uûM—7¬®/s/ÓÚôgH±ãQñmKçÙ( Þ/iQŸ’Lg´#Cçk ò¸¶6á¹[ÝE¥ù¢Ëpg½„wBn^dïD¡ÞÞ)ojð~ÓP§ûÖô—㮹€¶Q»ïwÑšGOÜGðåÿ7¶ÄgQÔycø)L¹j”ÚÞ“™[¿¼I ¨Ôá§Oëa]K=¬Š˜&ÿýý_}ø?ý—Ëì¤Ñ\™(FPëzp튡x6Éz˜ø±9mY3,£º²¸…ÔjãÓßíBŠÃáØÏFå™Âs¶¹¸u嬥=¯üh(®öÙª ÅÚpXø¼(…ˆvXƒÊ0¹Ÿ§Rêÿçß(-eµj{nª©Ý e² LT0;l¤ËIT[¸̧f^”Â(p.~¹ X6(?‘’ð Qá”ÈŠi&2àŽ2ÑʧQÒÛI5§ßëy»£ï¨Žï<ëD6tË.¼Ñ‘‰Ã‚O(óå˜ ­! ¸‰|¬qê óÁ ñÈM»ç`dwÅiä!Xúáœu<;»ø8pÛ[eߨ®Õ`ôs¡Ívµ·Mô_ñ fgð;–X"BðD1Ä—jÓ°öí  ”.h6Àé*ek2Ø $°²‘xZÇû fï H˜ÙRkmš÷hÞ¹ HµX!Ì6›3³´em\Š{hýòs~ù9§‚-à˜ç¹®é^ŠÉ­ ¢Ï Óv>5´¬YónˆÚ‘¬ “iJºÁðTãdSº&g®ZëJäÈχOûð‡æ!ì1y1E,Y[ËHVÀ¥ LbЉ ”´ L˜0¹V¡ f˜©L.c~Nôl4¹~pÿ)# 2‡Ä’T3Í”ŒFMášÄ¤ö9R\•Fv‚?(#Ì…†4°nÁšd_^ɲÊ;åÊ^Ê/ŠÊd6µmÛÐÈ ÚUpƒÏ.iA@$X1M¨&˜Fiy¿}Zæù:º¶ð4M„ž—µF;òF)„¤–î-z9|GÙ”2)Ü1—þÞmÜhÆ­ a»_Æ1lh¹a^ÝùÑž +§»¸%2᎑K‹ÜXþó΃œÃÞRSŽÈa¬­­î×¶ç@œIÿw£TnoóË0£ç AÂjü¤wL5m©ŽãwqØ¢À‘,HB~ˆé+*P¦ MÏFL»±Ê™£ì”¤È-Ô³áMl&À Lˆ„¶$bOBû ög I k¦Â0q~NÒ'÷Êìœ|7Ëlþ0K¦ƒ4¹j“’, ­}òÂÞX`ër²”4³B¤Bî-’ƒ Kš)S@Fœ"˜>ÕR2¢Õš5ZmÙâÿÓ¶,ˇ?>ýðác·ü}M¿×ú¯Û}Æ‘V±ý—‘{R7þ¹ˆóÍçѵ7òÃgñÞÙB»„[¬Í×iý·ti^¿–„¿Ö  3©7»Ó;¿øoòêÍ÷|nõ*®ä¢MSzTÜt¥_œ‡þ=µÖçà±—GÏ`›Wå·ÈèNÙú=ÐzÉ-™ubL½=¬¿Ÿ#lãø¥·è¡›øXÎÓß*Z]QJpo¿½ ç…Âð—ryïJè\ð ¹!¯.ô‘+lË=Ò÷ÉýTBæÅ¶‚g¦Ò/$ ÌìôjŽá,åò»®Ééw[gÞØppõ-ww§G³Ü»WðUÊ]5ö mt›M¹w\/WÓòHX:?ŒÐyÞ¢¥^XKï^ =XXuå|y‡<\‚/ÇÿÍϸ÷¥Ý_¥™Ý{‚ÜÎ_³¾ŒTú–LyAû&NX xÛQê]MðåutpÔùm«ë½£¾×(É·|­qÇËßñæÑW^įåÜ;ñûZ÷uæèk02ùsoÄÛø+oâ9ñáÑ㛯ֽ«§{Ÿ¯›%ïf˜¶u’/°zÛ\½Ù`Ü?í“*¯oš»ÇÌ[sŒ;èÛNÔóì(_»þgþ8[–ò•Ùxû¡gKë¹Lû¦üï×ÎÎwïÅÍyòy©ûí !×µã÷¬ÂÒûÒð_÷<»¼„Ëpðò„.v¸7OP½¥&âë§Àà {‘-»ú{!µ”_~ÿÓú¼Ô¥fDf$ôóýýñ?ÿ?O»B÷”º 2R²þLU¬Kv?ѵîZô¼‚ u kéëÂinÅV¦2Ø9ÑZ.©Èx®ffeâ²4¦’ª ›y1üù $®î0ùìùiíWÁöSÖ(O;«¶~Z°*ÿö$³e[êRJ¬Yb]ÁUÅÍË0]dI0Iˆ€Y4ÿc7lðcJd7àÕP¥»%o7È { »h r…„Ü!!Û¹07 6OŒ>ƒazy,rB4$ 0Áy²ù˜O7U…#VµºPð@Ù†e«Ù}ÛàD%(+^jkA•„UFDk•¥x²)ãùðY¦L÷ÐR$””ؤÏT)F ªÂo 'ÖTÁ i†ŸöÎZ‰@Â(€HÌD,ÕÒ JÃ^Fe_"*±+“ž’k"j²›ÜÒ²5z&"Ù(#\˜HÍ4”ª„ܺp0„ãN‡7Â6AÞ ¨&Ól0Ãs…KÅÐ ø/ˆ†Ãr’¹ó¬F€—%Z‹/)‡2eÆÝT–ÚºyôTü¹E¶ˆ”á€MÃíà ¦ VFj°·¼ôù99úutô92`[®N[ÏÐXž¥ q ¬&‡°®’YÇB„#l‡ðn¯í›®¾ÑÉzÖÁ^†1rË‹‚¬>> G9øô`¸ªýïW|2”Z ëÀuš…²uÞpsèB"} Ų ß+À¶v¼XÏ scŽhlF Ž“{y[PžÀ Ñݨm¤Uúß”H"fƒS;tË ÊlgV&‹âÓ¼CÙûôÁæyúá©ØèWjM>O¨_Öç•€Ïs@S‹þLŒCËdí6 0ËÒl.óÓlq¬Éá™+RDt›"/%#2S©ŒÈÈ^øµýïþݡ͞>|˜žv?üõïÎJlô`¯1*î¯Ê…n‹‹^öõæ€{ªÍ…|&¢}Óvû.ú=®Oîî1ôÆpó5ª¯Ùu¿at÷G¼ y]ØuARº1ÙâƒØ’ß¿;âŠ_sSx~ÅY}[À×ç7κïÒü]¶roÏ¿¼,èß*ÚWJô•”ÿüËûêÒÈÛŒÎ?þ-šæ½ª,]%Þuï¦IÞDz<çnÖêWèüsrG\:w¾ ¯œÌ|ËŸèö*ÿNòó×yñþqåŸzS&ÿ|.­þ2î²óNáëÑ>ïy–\&~]áÿ~g1ù™öç~…û¦èd©~i»”™Ÿÿ‡åóóºÔÌŒ ö›ÿòÿ"Ü̽‹Úîn‘ 7¨fýôyÚÏF´µî‘îxvóeµi*Q Ú=ÍKC“–5v&KÁP™ 'w³¬¹D¶”‹"°Tì™þíÏÈ€“-‹!صgæOÏ‚'åFŸg}Pû›ÿÅ"}ßà­Ëú¥åŠù)X˜Tq®+áé&q*FÁhæsô¢ø^09$³^ö€‚Ïði(ì±ÑgteyjOP Îx$b0Xüƒ mðyóóܶã)Ô^èÊÍ6  Þ«¬ l‰ÖÅÙ‚–ᆺ@9²Q¡ßiþ›v¿és›Üoð‚¨ˆ6„ËÑâ`[éc8ƒŒsàzZ¨ý^Œ|Ì4ÛbŽž«ýmÑ`Ÿ¶ò÷ ø÷ÊtŒv ˆQ´ÛeÈîûÚ‹QÍû¿êHT†¹BüÚ†!jn5ȼÀw£ 0«QY¢î&ºÖô,°Õ¼ÓÌýÓ¼?|Jóâ`[–¨•¤íç}D’üÃ~·.•®¬±~ 'çeöó³žèOO¥¡F* V º)‚<¸jª™2‘@&Å[›I÷©F…à‰©¶¦B&‰®¨D$„ '@ÎDž+¾$&BDH|®L`žz ¹¦*PštêKÄÎé&%Öä*c&›$b‡ àø@ÌFƒ2äŽ8„’,fa\½û ¤-Rƒöbç³Ó¥¦Cpf¯ÁGÎDêÍ+ê O4.frÂA%¢ŒÐ$º!FÐПœ†§4a*OH¡UÐ`qr© fÝ)÷ qà %˜/Dê¹¶aö›Š5Å# ‡áwxy7ø-5`€]ø.$³Ñ J‰†bƒMÔ[mÜÆb2˜cg^ÁãW †bƒ¦•¨[^#Çàe4dn†–§L°ÚÑ$`+ç¯g™€- 1F¦œ=j{†À‰š¨Ï£À·›q`Žì¤Ëô†n¡¡ïûÖJ¸qôõ9±l‡%” ô±—]O)Ár˜¥OO£äŸ3Î{½-GvvY ÇÔÛ (PL)ˆ5ðDAÙÌb(`)ÓÓ´Û}øð!ŠÃgNÞd»yW&óRò‡ýsÈö¥xY)E֖ŬN…óä¡X´²ß!"Ì[Ê–i6œO; (#tàžV¦232[ÆZ[WÿÿÙ¿àó4ïçy·úÝ—ÉI±¹Á7ÿÅJ¿èiÝÀÓñÿóñBÿƒ•N¾ï¦ÿnà××û²Þ«—ÿ¿¯ÿ^|®ê…6Ž3'çïp¾o>Ùsú¯€D]%H.jûzÎŒ—ÞõW¹¥G"Ò0_=ßʱ3ï¢Xà ^vð¢bÿdiþúÅyM³9KÚ\üäÔ¹x¦ÐuQÅIu<džà/ÚúЮVàû 5½B¸3Ò÷Ox¡?û± _£Žðò*]Wx³Ì:Óó^`‹p‰&á”Í• 9.úþ®‘g\—ë9΢kØ ¯>]œ¹lÞµ:~ûqê\tóBŠ~P„Ïs6ßy9Ï%H^§ÿÆûP ³÷ŸÏº³j•cÓÆhìÔ0»a²ó¬hkœyðÕ娫Ùp~?é…Æ^~ÀÙP_„æ§aãe™ÿÖçx6W裫Ý:HóÊüº]àŒüs$QI;/3Œ.îÆ»d˜oÀÖƒÓ!ëüNÁÅ:ú†N½þ Øš¿ue¡{ —WþPušzÓJ=¨j×#ñ°ÛºÏ(^°ko—YÝôÇ´;u g<ž7÷Ûáû:wÊ ôZaÞa;{þ_Å:}øü7wøô¥ÕV[ñü?þ›þå¿6ßÃ=$Hµ5˜s‚ L…Ù”‘K Wä²ÀmùòŒŸ|?ÏóTÖˆ4ËiN"–˜fghÍv¨š‘¥uƒ`8MJ›K‰¨Éì6S)†pXâLO_[k_ž-ÒžÊîé níçC€˜ #ñóÿ7ÑĶ,Ïk]±jÞ €`ˆ 6@l+8±HˆìúunåEµÁËVÉkCþž?`ÿëϧG öÊôº½scpw48ø?Fìžm(ÚÐàé+KA[ß dh ! ¾á>¦Qª‰2!-‡ˆÖCûËDÄæÍ»‰šÇúbI8BÈÑÖм‹øÒ©Ü [¯€ 1ÛÈèO$ÜϪ˜‰‰Hž·ãKÛV­¯bïÞ5„€j›]pŒ»º»³Y³(ÇÐu)S9 s{̱»wSPA@&ZíÔ£Ìu¥Ág¸û~ÚÖ,˜¦¹fF¸ËôçOM\eªKZLT¶„–¥ÕFøIv˜ˆ)3QE÷Y¡¥Ê¼Z’TƒŠŒÉ%‡]A}æ,€ÌD4éÁ=Q-šØª¨,¤Ì³lmÒÉœ“b.Z‰¦n ­ !L€‰În÷ª½õÆ%DGµPrrš°_„)Ħj4`•öNI_RÌdÐÚ!dnžÓ©n˜‘n=ïƒF”ÆXiÆ®,GÃ~fI4*¹IçRR&£«G '1ÕˆP6¨ ©Hº$v“XVpJÈà2q¼(ŠKCŒ>NŒžüìÞÈ~Öÿ—n4 /‘Æ–Ùr&0ù!Qeub­ØÍÓóUD„ŠËLp7zd‚tss'C’RÅ‹™¥2ZïPÐVûß ÿ#ÖúOþé?—’´2O»O?þõЃx ü·ìÍ÷©7‘Áý½ ε›€ËŒ.~~7.z£ ðš.ZyüßZÔê¼Gá* ÐuòTQ~¾×º» 0éßÕ{ÂsQæ…!ºÝ%kZ‡9öq;®süϸÌx\iKr£ÝÛϱCf:jO×Û½¦ÈÕ´À=üŠ®H¤à["ï³Jäsž‰t§üþ >fr¾Um¼*…¾gmª›A¹\ôßH)çË£OØ”¨vnOóQú‹½/ÝË*Ó_­v¿Ä’è+nÜcì貪ϙ{+˜°ßÕjÏßü² |—ÒsÛNqW¶¾Ã±y‡,û:M†ÏY=ºÇ©¾ÿB¥à•öygç}~!x5‹Þ{´¸Ç/º}x?úàsYòï¦é°˜ò9¦åçO¥Lùãš?~þ¡|,$kåTÆaú½2³ÑI{r ©íËAø,ˆ;ß?Mø²°Å´›´T­¡]Ëšõyõ¿þ±’õúï"ZË¡6R’’„ï• n’ .5É‘ 4N3L„¹ µq='µÃ]Å´€¸ðéßbÞáÃ_áÓ¿…ÜàDÕPåCßÌnë@ …RPvƒ „­ò¾‰]÷ ¬lB]7ªÏ4”;/€oÞÂ>>Ÿ[ù.»7ï¦ý©âJ8Gb ×ÇÖÒÑ%,†€ØQV¹-©!Á§m\+`Ð42½˜·'¢mêžmnŒÓÄY¥ÿq>ç&è[_*\ÞÙç¯V ÔpõT;e•yŽ<öa>Á; ¥ ú‡ˆ¨gÙpŽv„–qÐ’›0`€"” ëaYæ5Ÿvû†ÚjÐý©<ÕÖZôÖPÑ/\)S$d]ïBriœª­©YôDVNC‰fœˆ ñE1%a4²Q 0Þ:,…e6Ö\¥%U¹¾ìLÖS`MÔ¤„ŒZ¥ en…¬ÊçP¡¹SHš&`"g£jª âŠ>w±RlB¡,ÆÈ)†–Xî€ç0Ö(¦ÖoÇ ÖÀŽÄŠ“›,™Ø¬ž€.‰wh~ ²ÉUÁ‘)d©„ºÝ.¨yOß#W±§çÑŽã &G'NŸÛgö´ã/]æ6ýW7–âlÑs(røýÒáÖ _A‡D$Es7£˜aÇèº+diDf@¥ Ì° fǾsŠ·c6÷쩳È4Šú{,ls“í4"‡y/àçñ´õ0Aƒ ž£~_@½©ÈÑ™úßoaÛ`>êv»‚ù°û6Dp°›z~n¼ ™ ÃG¼kˆmñÄY— X¶vïôèý @ ˜a=³ØÐÚhB…j‡iwôEM}‰J8 r)˜Ýæi*eÂûý<xÚ—yvs+VÁ–¦/KUø\Tûs+¥|^59}J¡&I$ [äx˜CÈ ö¼‡‚™·hì™–ÜD‡LEfd«-Öµý“úÏ$ù4M»y~ÚüÝÛ6BçaéYPu­i“/F÷÷v:Ýßšž«Àoã@¾O¹ûþ 4¯÷ÌWÿ\»\ €.UÂ#mû2~½hçULó{eå·lQ_ÙÈ'”^’Mß·)¾.Ê:mïíîÙ¾óÞu|}®À&ïÚv½—XrW }ñwyw¦áÚ·_u‘¯7G|6ãÂ'ñž†~Ë^ÿ–­ÖwüG“ù-‡Ê—ko‹à/ponMÚ^È(¼%sg»÷•«Ì_>tþîûÊ£‹ýGáÿ\åà홽”ß¹_ÀñÜÿ^šþ4_± _¯ð¯¯÷¯¨¿¾¾ÃË~ò__¿¾ÞÎ_þüùŸÖ/ÏíyA„€Ïëó¼›al Ÿ&F£l,[d„2º €Añ¼ØºìŸæ¶Smm2ûüül©@ÛïŠe–¶–?ÖÖz·P0½ìfkÍЊ\ÔT˜õ˪>‘?̾´vhhY~û¡M´†õyÍ/K$ü7OåýÆ?î>ÿ›ÿ;¦ ªf«ª^¢&Ë¡”93“î#ÁÕ¥(pÌó(Kï…ó Ô†4ïeT‘÷òüNðWÚˆ@6a@[·j‚„Ù@ð—2äø^`k½Ö>F±p7ÃLÀº‘€‰Ö†¶ÕaA>ÁʱXbX»e^æ)s0x÷m´,„[üè¯k†Z`~ÚHªÑêÐ1;8ˆ~ƒå€`;XA6(ÎÊ1˜æ‘÷#‡ÂÞ…ý•:¶ƒ´Qu¬Üþ1ÈâÇÖ5mÑsæ°Rè5¿²Ó¯ƒ>"ï2Ž¡­£ìq|Hƒ•Žw‹Q°‰(3o5>?ÉŒ¬øùçç~xzÚïZk™"ÜIµ-¾ð]œJ´‘­"ëºfSMТ‰{cVeª&H84Œ €b¨Ð ØšLœ3øLÑDÁ7x¹ž?W EÊ6‹„˜‰U²n·iJ@bÏÝEh!Š4ù©¯u+Liа3|(ö%rö¦½aß5Ód*?8%|Éœˆâ&¦D3î‰hŒCŒ„̸@;¢$ˆPá°¹n‰@ Z©§èÆ­QƒFIhHí&èÞ!C˜ü f1‰â‚C’“šÐkí{ÊjÚi& 5¨g,„ÒglœtÒsÒ}Ü$v[j]›õ” ÇÍÕg»06Së”–Ùh`ê¨ÁDš™,Ž0å!ͨ‘°b©¼œŒ¾#‡{Y¿pÔÄm3Öv ‡çv7BãÖ(# `9]£½€ƒ˜ÔÞ{?tÊ‚kµxì0`(D:›éî±öŸ0Ûˆ^Üqº:7s`‡AØL êÐ0ïc“+›Q|Èúhƒ:Ô­’Ý ±¢8ÖƒïTz¾ÄGÂC€¨*ɹ7›1í‹—2Ùn¶§]þæÉ}¶§9Àšw»ßüøQÏësk6•ЬDÓaµÓKm±½ÊB˜| ­Uš@’‘æî^ºá7H!3‚ÝÒšIVRщÿmmݸÌeÿñÃÿø¯î«z]d'·Z›×ìlÿbÃý‰௯__±;n³sƒßajòëë×ן¾>÷¢ßòw¦|GéÿÁGé øƒÞ`·u>]UÕòÊÈòîßi¢W¹úÞ+ÒËE•ùeÁåÙ^w3tã»g S~õº<™WÓ…r¢ê̕Šï”Ûê"÷ª -æÑá]ŸïëÉ%±d>tËÐù¾bõ©·åj,ñ‚á­pe¼Œ¡¸œ58¡p^ \<*e>¯õ8W™Üóïú¦pùNÍÖ[óØpUáp”¹ùܧ××›»gögÉKHÑ«ŸËG~PºÀxD"9«G¸O£"¤W‰…äyÀñG½L{+ü¸4ƒz|Ï› o[0ï§¥yqUõR+Êñ'ü¶Úÿ‹^/=ò¥yHœº}Ú]?õZ÷„n¦Ø±ùH73âØ\}OÚ` ×MKo~àl9ö³%÷e¹ûò{Ž1ë«9>n:½u*»|Òo¶‡ŸÏ·ß×—e8×쳯¸ì>='O4,Ü’ª:ÛçyYŸµzˆj(>‚Œ”;7ÐT°Öe7•*mr/ލ†¨5mž§â–­†Ì]œç¶TÕ(küæ‡dHP1#ói"°6ª‘Ñ<‘?¤y2­ù»øŒ\k|Yâ÷š¹QçîUj;³l«¢&šYÀT˜³Ùô›ÎégR˜3E¥sð] Òà³Ðë¿ð^#¿Ùx¶Ž°/X0Ç´C´^tÒ}Ï%ô Ö®©õBר]ùEkÈ<éÚIp!Z×77DÏ1h3È‚ò­ Ko-P&Œ"tŠÞ‘{CAŽX6ÌB•ã¢m¡6dt'rËôºÒî,ÚÄ›FIµ9 ° Ùuw#0\v9¤|sØ4”é^2 lú~7î8 è8—Ñ6 (6Œ ‘u š«ƒñH$‡Añ±¯¢;Žl“-uëñ@$õæ +ƒØù\žÖúŒd4ÐѰ~Zð4íÍP[ûýÏŸ,-\L ‚˺DD…¹»Mɵ%ÖDTΆU( çdxNPVN)/–œiÑEðPeÂLë«ïÒ~…ûÓú©e¨R]äDwú5¦j"¨Ì~Š b€ŒrÀº„Mî)v‚*°JJ:áÀO”DÌ„Kæo ÷É&Ô¡UØœ¬ ¦J Dƒæd$ÈY0R.€k3û€('4ØúP 5D@R¿5fc˜"ТWë«•m†J¡`Q—J­'WOøÖ"Ú°äm y/ˆÉ£W0º×ñÔ;ä¿«ÿ^@ »;x÷Í€¤ÌD!–4¼ÿ ðÉánæDpm£ÁÆ‘Á®¤*\#Ÿ§­p\£§gXˆ[ﺅ¨È†âcYðããÞIP(›Ev?=JAT·;HœF£l‘þm\XÊèŸÀæ½q ï}Œ`'iË¥ðzÛfûÑWKÍRáHGdÁTƲlßkcÅè8 ž?yJ@1þ¾|B6„¡­è×}ñl€Ì$ýB6ÍX Pv6Ù~æ~ǧíö»yòݬ–Üí³ K+»bJ*æý®M-S¡[¤òR23kÀmÚ—*ÌLм¸€l)e7 Rbðd‹6ÔÿX[FþÓñï•yÚÿðáÇ¿þ«‡!à9”E¸ êAØtõQW;åGŸöŽ-Ñ)ò¹Úãžcß(Í¿ $ÙçïÔ½HI—Þž¼õ¿Å cpŠdÏp7¯g].q@÷ñ’¿œÌõÖ=à6j/«Ïˆ¾'âÃõ—¾)–¿a ½x‰ï£‚ÏÆù-_ýõü»›¦“<óxNžï°îö\LíSu’3^irÀ»áÕëèm}[[ ¼Þeyú ã™ ´Þ~ᮀ3/˾ç[½#Yë„3yíø_˜'¯ »w±Hï½[–ý«è˜ÐùG½w¿èê(_™6·OÕû3á;ýן÷Ž™ç=7ž_ëãx?¾¹^´«ÉöI”‚sþ/‚¨Çºøp2êL£â«ú‹ONâ:Æz¤êݪ‚:=&ožÅz¤}%Ÿ ð8x]z18&-N¹“KÚù¥Tzž†ð.MŽ×Éí^<äxy¾Ôæwy¦gäâåz—Kü’ÎI„çY›ëIƒ·Ü¬z8OÆ­Åå_çúÿ%ȳoèoÛüη¨&á6;»„wR§UþJõv,.rf÷ud½˜_¼}ß|õkÔœŠžîñ$Üõâ-òá]*mÉ€‡ÛÛ Æù´»:‹ë&îñ$¹|Óùs]¶"Wf4„^%»]¦â¿µ}õ^|ð*?J7KðKI’ÌüòûŸê—×Ï?‹œ¦bÓ$·4º™¹·ˆZ›Š»‘»yúôÓ'ku÷~œŠXÉ¶Ê–Ú zR¡‹}‘Ö³ ÅÑ˶:‘£çE@Ø(,‡Oƒ dòÒ>ú"¸ob«N¸ÿNÞï%Æ0Ôˆ!äÑ+ÔíI #ZO±tá²neÎÝ`£R{0C¶=’…lsIí‡4Ž Å“Dm³/Î ©²C6Ô/Ø} Áø’8÷»}mÏul”Çáð%³ðÒ˜ðFt³`«h5™4Ky^‚ÄTphøR1Í`³FÍ5z² ‚˜{¯ Ó’˜‚s¯ôO®‘½nÚ@'2ðåӫÐfc€3Ó ì®ÑÙ)=  P£B`ª…êåês"¤ TBÄD{b >'*`1<'—„=µ7| ¥0™ï-+4A-ùŒ4Š–H îú ÑLž óÎ]É› %dòÒ$ bóvÎ13»Ì‰$ŽËZ ਠfj ìÈn } ÌPŠºÙ5‚;)µ^ ".pƺ€D lÍ3£ä_gò·_VtØeu‡9&ŽYwJƒåÑxàt ¸Ë ­BŽ5EQ¥µÂ Ê VØÜMfæNƒÕ茟µïØm3ØØºmº ¯Ü²eרç,;#èèÜÛõwë‡m˜w0`ù‚0XŽ•ªÛ–¨mÏ Hœ¡­ë¨“Çz7 Ç “Û Ks5š ÌÇZ{]=( À)$ÇRÃgø›G¯ûŸ¤˜#Æ8þ!‹92ОOˆÏcUÉ-”ú·jÐ m¦Á='›‹Ïó“~ØÏOOJæ^fí‹¡ÐnÏŸO¿ÙObfº™—Ïk’f\ËLúÜÒÀy²HÁ» ™IÙÚØÐ“,^ªZ¦ $ÙjCf[[Ô5¢¶Ìüßÿ‹SÿwG½?Z§ ¼ÇîoLO±ÍN°®%òSÁ–nTðc¢—0±g¶j×’Ù âàÛ‘ |\t‰]áŒ]Ó'|—®äÂQîÄ#!ÿ”'¸( Ô[Ê5^:Ó»tï[Qæ5}\ Ðt£{ëÒýðŒŽ¯ >ûi(NCB¾ˆÒƒòZ¾}òÞf‰.Ãé±]ë¡Î™Ï o|î‡Ägõ°¯›“½ Æ¾%°èJ¸º7îr€ôxнA,&y¶Á¿W öÒ–äx^Ç€Ì|×fçVI¿âz½6°8¿ßþ-¯j©7†:×î~àÕžúö3¯œÞ¾ûÓã Ù]}ÿÎûµÏ?3èü=_‡”®ÅõÄ»*s~áÍ—ˆÞsé¥'Úî虿D¾÷Fv8˜£ªwîÚòÝ`|òk'úV¾®á/óõëüÙ^7ýzx¿ød¾çÆõÇ>Þ_û‡¿öÉñJ þu¯Gÿ@^zѯ©ÿ°µø»ÿß¿åÚ~úÃO$­÷© 0Á”2R™À<­ÅÓÇ=´ ›&ž—õPWa?O€OËÏ’ýôÜ´æ§ä…eúá7OÈõ°,Xõùo~òâiÜÿöGc/Æ,KL,™£d&EK¡Ý*#kËâðqö§}ýùÐBëó_ª£˜\€æ ©l^Óè9´¤…@Ú$,÷h+CËî*<€¥ÇÝŽÜQÙ> Õ™ˆ þÿìýK“$I²¥‰Ã,¢fîYU·» ÔƒnÜÆôk³¢þÿj l°ÀMš·oߪÊÌp7Sæ3 5S{ø+2"ëÑå”T**ÏÃÌßq®`5¢~*ºì8ŽŽ¤7G PÃk÷„#z½V–=F’{×Ô¼ Ïq‡¹Œ{¡†ÅFjÿÝ® v=®«äôs^|X;€›„súÍkŠnøú.Ñ|ÄBXGeƒ%Z[Ÿ‡;ê0èÀñÓ±þŒû'øîœÜo)çÕð“0 ~òû‘É6ˆCº§­/hÍ;©É‡=CæÆH™%ŸkuÿZª¦"Ñœ˜Ôüe³È†‡¶$ Ÿ?OÎééøœ‰l¤)³Û Фe¥1 3Ó­Yj6|2<€‹07í-!KÑ UhžÈdµˆ™(B%–ÑX: ;À &&3R“¬Q‡T’*ÀÜ28¬F)S‹Ø„Éà̤5õà‡F®1žº»Eâ@U:ŠMZÄADj×%{ˆÄ"S“a‰˜7Q\ÉOi‰ä@E‡ðÀO^ÓT64¨×+h‰j=ì%5f·|޵k„“˜­ ‚WÔJ¹˜¨bDEäˆÊO{ÍDTïÙÝ@Âv¢ÁjÈ*[ @K+ynŠ€okD(D¬ý0ºöí%Öà”Uìö?°•AO!Ú€ò°@õ4G[Çr’°H´¶ ° ÛIö므 Ðø;;]÷,{3h¥ßê4F€†X0‘9®6 ÖÛî©÷§($×é…§Èåj0Þ#…cÆÀÆ4ÀQ­‡'aÈ@­°i(þè ½@Hƒ*̰ hÛ˜£úd¡y\s—–yÌÆ0–Ç< “ðì±%øPq¦‰ÅÝw>Y-m*Ÿö|Øáh^k­µõÓCùᓪZ[.eŽ‹ÍÁåaG°ÔR'‰HŽm·ßYÁÜ¢ª1£K¨<¥íö¬7JR&R¡ˆh¡ˆ6·˜[´é¿ûûÿ¾NuzÜþg¿»ÎßXç]¦6f âŸõƳëæßJpxUEzSCûÛןùA€{m)oê{£Û¿õôusЇa_Wð·¯_žùs[*¾É \¹lâ­§ ÞµC¸wy¿·Ç¥ p§±è—®³Òù]´ýÂæþè5ôBæk²£n'¤ÛÔÝ;ª|Ñ7ø¥Ô‘[žËõý¼[4ÖÖÌæ²V†› ]#,>pí­‚ø­¥î¯(¼bœÊA¨}ö¦bEy½ñ4c0(×ü®‹âJÝd•ß3Œ~Çm˜H.Šr®ù1ºqCzÇ»áE?ºm†5±…xå€tò­Ú†m·¿V×\¦©@o jž½ÆùŽü Ã7E‘ºvÞ6«6C‘ ùÒ4}¹ ¾ç2¼ƒ¾Þ.M%ßnÊ‹¤ŒuéÃMÎË›ûÕ/]ïvïtŽ—×ˆ‹µV_óЋ[ÒKªÖ)OïªîX«[¯‘_þðÓùÏÿÛ²,Leª»K‘YfæF7l™YkÉÈÎ01)JhjK@òLdÓîq÷°xÁ„Ë?~ Ù—zXÚç]ûr`%wu÷ioóRŒl¡@CêéIiYÌvR¶TR@,©ç† hòÏŠ‡vøOÿ+CحЬÍÏòpÕ…®B/r=4ÁÕŒ ó´]ÖcA&v¥lÈÙZ1Ö6,.͆g7Ò ÁʪVw‚ö/cŒGªi×Ѩ³ªÞ³t;ÓŸ+Å~;@C‹èàJw1-¨aõ!°Mµ–£”Ñ'“ôJ¥( ®QwÍÍ!V2 Õs¸w¹hp¢ópºŠ×ÍxGd¢s6v`âHx¡ˆÈavz"r ¬[ ìïîÉ9\y¥ŒBæZÍ@hA,0CVÄÌ•R²Ä»¢Ú]Î`¥®r4x¯!èµ#KšÃ6¹Ç"‘ 7qZ”Éà ;õƒ­[{XYjÝ=?Í!#¨ñSËhâìeW‰¹¥ ™îðÀ¡Ù!@èiAHlGT7&—„˜ËÉéV2Š&‰sfŸZ´úP„``•æ%L¦”[0 ÍB! øœÙañ½Ovy:S]|ž;#“v` ‹á˜èB-¨@!&TH•šÁš 5iÏ’Q1G!…‚1"Õ?=$F  JB%Õ®HtÝL†´âæÕ«d2Ñ ¦ë‚¡¹Dø„Z` QQ‰ ¹Ó ŠKÉ]·¹îê¿S=¸iÈUJ.{ÈÐK TXŒ"Œþ•›‰•N³.¨Z“è×jM£š§; w#ïþkÑIkðê!@€†ÜÈ3=LPr0äqÕúp³uCSêZU0¸gÄùÝÆy¤ØGÀx®ö¼ý¥h”´6z³5+?61¼µ;b5èø£^½Ñ‡öö»cÅIôÂïQ”Õ¤‡´˜v‰_#QwÀ4.Ý•d!µú…Ì”Fh‘ŠXCžxc-Œy`cB¤³3š[)»©¢z™veçeoSßì9U<-V§ŒÔ’þ0MsCaÝ?¶€í«/î-1»Ï ™É©<Ô ¡QÆÌ=„ì±åy0*ô“–-òýþÕ¿ý÷u?M»Ýc·ü½ÙºÝß J½˜ßÿ索Jà•oñ…šõևןtÞÞƒ‹œ+¾Ž‰üJN+/¶èo«:/Wè2aB¸ÌfÝp—ÞÈ;ù†ºßUÀÉOò•Ö¸^ Cñιá̓†î 4¯ —|ÐÛαk¼ŸÌùËÚï=c¾Ü?„vyõ¹n\©Oãìt¢wÖ&¼ÿÍ_±>øò×÷ÐÇï©“¸¬Åy«õqîo ºŒ%\ߨÕûÝþõ6 ë•Ĭ¯›NŽo>pþ: óïy´Û>üJ·y¥à¦ë^ ÊןñõR°w? 7Cœ—KX/•»–õßQ«ôöý\Î7“äºL *w„´³4ɳmÖÍš¥»êó¥t%/߯ÖgU¡÷W›mÀª˜kýå†íà v;¯zÃíõu]vQ6räÐ*(ò%Ùõ:çÕîïrnÞœzêqEj|…=ÏëRêìY½¯j`ߡꩶÞÏrß…üwÙZDœ2ÿ.T®+­n-\Ö ÿrâ»h«Ý,½KoÔp]µôUŒC7ÂìÕþ‹7x“³Ú¸Ú\êÒ×oyÅé-õk¹ì€"Ÿ®§“ÜõžñT^{?“G›W¡îEÖCµ®]=øRÈëîví´qÝŒ§kôÒèZçàËÃ7zÛþ¼‡uÂ¥…Á½PÈð YmCx1§_ÁÉ^Ó¶o÷W‘®]Û`ÈFõæå¥N¥qÁ€íÏœç™ Xæ¥˜í§šÏ‡å8·ÃóáÐÔ–Ç]Ѳ´º_‚¾hÿ°ƒa9B¶ßï|šŒHeÌs,|üü8M%Z3—޳‡² ‹–C[(N5 i–ÿøŸ²EûÒÌÃg:Èvl,é%s¤[I/£-¥`n´f“¢+ƒVP«‰b×)Oì¢ÔÁ®¡€#’€Áí<¬3Q׌×21Dº®JGi¿¹Âpbåj÷üôÓpü„ý®—YEr4Rð $¢ ƽ•A R¿«U>S‰„b†” ÄŠÎ訟þê»­q‚P‰džŒ!)Êv¿™"çq[>(ù=«ÏðšË=¶(8Î>¥Wb¯ÑÞz ãå-XžG‚mÃÐ[ÅÇ.)öëô̘°WÖLd µa ØK÷\ši„JÁ°*V”À"Ô>á¡BBÝ˽$šd‰C<)uïÄŒ¶ ª[Œsyš QzDA0Ñ¡çn-6„}ŠH!rxá&I¼kþ¬:(»‡(¤$ˆ9Õ$©n0«ghÁx• áð@„ò¹ñ˜4S× xLTŠ`¥$¨cⳡ@G…‰|& µŸRN åÎz Sø­Ñ¥èå8 ÉGIB¹wT*F"”\,»å±ÜØ;Lˆ—À2ÁÀÐ,É©.÷$w­.²œÐ€RÐȤvJ $L.w˜CÐìÑ;(ܸ«óÅЀ˜ÁÄã'hŒ‘ß):=kÎû´Bÿû\êëÜ:f ]@í»ë5ÙÇ \˜gDq²iMŸï0"wÀp<¢˜!u®kéñ’s` VæO i^+½'¢Òçe˜j”2Èžj@Çã) cîððÇþøO0Ç4õX€{ë(XërDXfcºèã‘kš?V_ñ6f6Á1SΞäãçËõ{¨f ÷Z¢2J‹ºÇ@oðaµRG˜PöXr=ô$•ªÎnì`"f° * «L(æXJÙaÚ5ºÜöuÚךÆÏ?x±\Kf¦ÔÒ÷?ì—\Žp ‹×2M’RœÈ”Ìáp‘êk'IKIJÇMAP*2I æ%;ö'ög÷éáó¿ø;Ü"¶Ð¿±¨só/nÆN '® œ8ÁpƒË·×$_âÜo6s[ ËÍ÷ð’þ~zù>Ð-Týöù7›ºåÙlÙ2kÜâ½ÂȲý^%ôCù(Øà¶7yªre u±ÁÖ=UŸ ø—G8ÞQ‹7àΛ>+Akn×êÈ&l‘=¸'Jà7ÿã¢ëÓÏÿða±õCĪ+‰üÍkžÎçÿN* ×ãÝör/Åóús?¯J/†ÞõýVE}=6pK¹Ù†‚^×µOÎjŠòö{¹¼FÑ›Gó-ÿçöâ[ ÖÝ©IßÃð¹ÌC#¾*…ü¿èü‡"y×ш ˜ë*¿þÖåæåEA_7Õ¼òÊ^'åá †~^¦o“_ôßs{·aÀoPðk}}ÐgõµX+ÿ¤OÁß½¾ãåßþMò&<òUó>˜…ÿKB‹ØÆ-~‘×ð·«îåeÌ`È?Ôi??ßäF¿Rðë½»“ð+7s~ɯÚoWüú3„¾ecþé¾ÞÓ ïT|Mv¯>”/ìpß*ÿFioålã-›íþË?xúÃÏËa9Ž̌Ջ—i?y5˜lÊ%’„™MVvÅ\AZ—D&t| @ñåË“ÒAí>ï¾ü៦yiÓ4Yk»Éó°äT?}ZŽ‡çŸ¾´/ÐÎC,yœEª-„%œ¦„¥Û²´iIÕ²üþŸÈ °ÌŠð@Òe.†Eµ²€ILÄž;bGÛ’óãã.Û!ƒ‚`LÒLÛmiÀª ¡ e°'Ë;/+.VªõÉÞ–âM7¶Õ&‘k„t–̸æÈW[˦¯y¬«®ˆÐ‚LÔ tÒxwÂì¾ÙAÛâ–ãž;9ç”ÕÛWþ[™ƒY[ô/a÷©.G™™m ËÕ“è{ý­xñî:¬mlƒN7¨A@›AÁ}-8è°”²Bˆ–@nÉÝ„•‘ËÌ G(sÄ3Hxüü]½íss­°:ÌåÈ&©›Øp®f'sxAWÒÍH…\°4²`òòP¿¿Äœ&="càUÈ@;P3•² ‘\k TÊ`bâžú9é MZ;³"µž&N@:E2䨶æ¼&.™I$èÐDV·Ÿ•'ò¨Zy¯¨v*ø IÕ˜`H{ dX –ØÂFÏž(3̉‰Ú9ý1˜RKˆØSJšyL5iG:ðœúì 0§M½¿›:Â¥ lM ,k™,¡D¶ÁÒ顲].êÑë¶ÇPö`Å ñ©€Ü†ºC¦ºCç¼ÇNÔJ³q½mWùø.€© -˜ŸQˆ D®¦ßg#ÛîŠïïëú¹ºF“ ÅÆÛºu¶Ã ,q|†ˆ2Á ÇÃÙ9£g¯ûÚ§¹ã8**ëóLêlþ¡õ°õAúÕ¬‡åÄj’ѧŽš˜.è+‘]V¯(˜8Pw«ÕpuE½¨ùЄW ZçÁŠäžò¼Ç´ÖQ© ×pGH}Šˆ#f0üÒ1‚‚¥ æO6´#¼¢a=fx|„ˆã3âr¡Ïf»´ÅèI1BjÑe ¼¸O¥>–‚ê¾Ó´Û}~°‡½Žšà44ú燥úS(–e7•0BÚM>™ÍÅ}·ËT¶&Z¯Š uúW?^[5’‘Xî¥뮸ü:ÙÖªóým¨×nù½*ÿjNµÍÒ?ó=øU«ÚE]/!ßý3_Òð¼ó%äï=1ܾä¯g5‹ktî^q?Ú"wzé˜]6iѧÃá*m÷¯ê›Ý\¿x@ßûÈ•dv½Eæ€èjã½%„ߨw|pÊ“¾&ÊÆ­¹ñ·‹JÝ¡ÿë—…Ÿîø2¡§ˆ|Õžà:'ä¼ÓA\H«mß½B«æ»°b:©ÿ)üüÇŸ_ŒQ XwUfeW½:HIt·Ì¬…»iÚ‘™mžcY–8w»§š•†œ–’¬î>탹!ÛóÜö{™-‡ƒrßA$¢`Ê:•’óbž<.‡–m/„03 •bÍŠDÛÁÂøóú¿RÊRLKh¶(‹WTU«©’ž„O-¬¡¦Yµ‚%jqÔéðÔêÞ ,Öá÷#;“‚MƒÒSËÈRÏ©¯ÄƧ··ß‚8Bu(×'XÍîIßG˜m!låÑw'Ø> ‡•%Ò† Ö÷žDX†çe¼l%Úèz†˜N€¶žVÜ? ^ÑsbÍA¡-ãf¢A@"‡Áo{ÆÌI §þÛf«XY r•V5Zo@„ß§œha1€ú³/ç@~(QwˆyešÛˆ äº¡¯ÞÈÔhŠ6ƒ@™FP¡{w¨‹9Ü©ë÷­±VÑ€1£%aüü»q<€†Ý'´_~Œ¹þ hœƒ&B,h_€#´hi°ìö§2щŃK—¶EüDTiöN'ZªéxPØ%0…lô£J. J…ð ì‡%%aš8ƒ @JuؾÌÁ&U¨Šì]‹z`Vƒ„&U¢ pÒLG ÄN‰ø“ð ,ÒÏB@øä8¦vɨÈB, '`öÐ'ÐᘅB€jÒ,ìÁ„ä6¶cK÷s(‘œÁB5uÜ:wh’ºÊ §µ_U.Gᢽ k¿¦Êr9ûQÎñª1–‰ý'D`9ÀˆZ Ú‚L<~‚Ù{Eƒ Ñ)ù 3 Ñ€.;s£ŽÝ+Óè癘«7/B«MÕqÀðPQˆãóZBÔ›« ˜J"µ~Gí‹tˆ^øÂsˆ±;`Ž´ýÈP–#FàøŒe9Sû¹VÕœÈEòÓÃÙÇþZ‹£>ãÙ¹ ñ´«îÈ)ø&,8J0 ™HB6¦‘ná;~$Fã0Q  û7,0!ž€LˆD´þA>±ì5ÿÌi1sÎ3k³ã¤l`˜Œ•V̰3ßÕ²Ÿv»=w;cµý®NQ춯HÚ~g¿}t€™jÁE¡°‡ªR„2Í(/"¹ÌMÅX‚ÕP‹Á,rÀ¬º|džrëLJ!Zd‹XZ¶ˆÖþå¿ú{H4+»i÷¸ÿüÏ~wŠ1Ÿwé$.ù¥mù^Ø8ë­t«oy¤ù.úù­Þ· \Š^»W33´Ò¾»ô£Áa·Å£xåy#Õ¯'äëŠØÛܸžÂÏe¼u ï;7|Hi:5ů¯¦¾’ÜwWlŽ*×5×g ñ½Ð׿,p—èòN¥þ»Ï¯~âKêõÄrmO}gÀnímoeýîl=kêæ¥ÿɃ‹=Ðù_¸Ûu7a¹¯Xu¯Ð W}ê«‹6nßàÝH î•Z½2¹¾ò‚¶æÒ¸Gñ:ÝÆÉø”º¼åó.Xî5ëBƒk1üe&>.Hâ¯õ-LJÂ!ù¢æ{<ÿ¡'˜^(uÑ PÿÛ9˜´ÖCj-‚&¶ §Ÿâ™Öw&>Ý\_÷^Ñæ'Ñûo7NåÍä©ÈyƒØãéï®—oîɶÆØ4ÓÅLLnlrô †Ìüã?þ#ˆÈ<>ÏÑ‚Íl*6˜{-³`]Å=KÀbr§"ÅL±xmK53g6¸ÀZ¿üþqxžö$Z›Ûa~þñPkE´2UPÓäÛ<ÛÏ ²ÃÒ&óÎÅÖóKÍn% TÌv’!ýüÿþ,Ë‘, Kp¦BÀM(ZL*Y­ŠVw^j%µÔÉë¾,‡g¨™‹;¡†’¤T6¸‚bèڧרdž:D àð™äjzÉDäŠ5 d®Þ¹ÖšÒ=ÒfË) £-ˆ8dz˗‰ˆ@¬" jR;˜S2¢5D;ãþ±º¡j®¿™›\xƒ-Vi à;°$Zë_Æ] ĔӸ9q¼ §Ó1tSåÑçVÿR‚†¶ c€’Ü‘G(b×Ì•ŸÞ[˜Ëðf€#@L{€˜Xeë*ÐJ¶îÀ£Á »úPÞ} h°I–Ö“‘m‘h##[wÅ5C„™âí XÜ ±:ŒæPƒæ”2c“IùºíÙ“&>P‹T=ñœÈÔ'#i$ÕGŒ-.‚G IÒQ˜$€A,A#l™ *½)œLÇ”ÑöD&…l«+o*”É |&,):öâC@‰Ÿ… ¸‡&!€E(¤22ˆO¢“)UÕhO3pr×?1˜P)«“3i=þ‘=!ó¨Ã5@Uˆ(Åa=뾌¿À Ûë0£,ùø”=ý4*QºíD·åè.ÐÆµ$ czŬ(uØCð ߣ ÄT à0C pLëö(V,¾Ùu2OFµ=“ý„ºZ7gݼ»_БÝö6ðüÇs­O,p! P(@¶‘2ÏU"ïU;¾µú`‰\ 9Vß… XZ|KÈàì3ùØ3y'°®îÁc…ÊQí¤5zç-Vð×ZñÓ!þ§©àTc4¤Ä€aDïxIÎëêÿÉf¼[wóú˜„Ý çQ•ψIg|™r†Íö)Ëó—ÅŒ’ôÏ\DpÏš†É‹ÓÛdœ¦,“×]ýá±îö¶Û̾,&™Ôz|^~‹ei•ôâGæTk~~PFÌ‹%Ò˜í«ÊeI€-¼LuòÎY+|Tˆv÷P¶K›ç%—Pæ÷¯ÿž¤×RwSÝï>ýî‡ š0·g¶‘1CžŽ—lM¾#5dCþ¹aU\' p¤«œÈ$ZÑž|9JæÀùt±å(ܲ•·Üê_¨Lm$'®áU²Á] ûzç €K6‹®Y/ß$_Ϻ§oßÀ›¸çÍјºH¹ZSŽ.·Íýе9õß €NÕ³4)lâT”rqr¸`>qËSå­wÅé”pEÀ¼ÙâêuÈ¥„zÜv#¹¸‰wÅI^‰ ½IÀxw~Ö%uudd‹Öá¦óaãfÀó}wõš<¹‘fß‹zS`½«çÞ}³Wâ÷Ë…øó&gKy=ÝéúÝ“…ÛWp·àuÔKéØwoo«w߯¶úu ò;ßøŸtþÞÕ¾ÉG¼gRºiÞEªÿÂn~Õ™?’¿½È×W¼Ã{éí܃nðÏôK+.a~ gâê%ñ[>ÚÕèüxÀ/¿Þ·ÇøÊËßV|(«—ßôé^_ãõÝzì7¿ùïUpª¸;ÚÄpN[Áo0õM_*¿É|uØñ÷º_Aú…50ß+ia³~ÏJöƼ[pWxÏš·ÓTà*7íor73^Œ§µóýÓ?üÃÒÒ N›>ôuôRkEqº‹&e€.ç`_=)—EY ²‡©<·XZ”Jíç/4›öSÖ–c5ª˜»~øüi9Ì_~ú™™ù¸Û}úüéé?[Á®G“ féf‘*Å)m)S4ýôÿú_ÛdŽ4NæFçãl£#–ZÜ(wEICy¬Å*£f0‰29 ѽV¥A©(2•©e$¹÷ä@l÷|öˆ!©€1À>} í–•]Çï™òƒìá ° 8Á¨8ö¥!riEÛGÇmLjàÄ‚Z‘†ymê3‡Ã­qÄÔ·‘&Úª‹MMè°Ó‰=a«xQlhm½{-4Ò‚9pÿÚ°¼‰ ¸?F c˜c5åHãÕ&’Ù²ãV¼Œì–¡[,OÌkë ‚#3DX-O$Èñ×NIrq‘åˆ{•CZ°Tù*(w-"ÅL.^ÑfZ N€éxD’uÒñ‹”,Uý" ͶÞä‰ù™íÈ>u,RJ ¶ä䊢®üp°˜L½¶Ã©â˜!4î ÍR18Á@)…A‹•Ú—¤Bé´Ä¹ˆ&µžIruÍeïBÉL¨’K¨!p²Cù{ÅKJF‚x ÚN ¤Qn ‡€¿s¸°ÓøEjàŽ6)g’LØK€Äç”;ž¡ ‚?8œI½Â€@5Ê…™k÷@'ºpj$×wt~®ûާ¯t°Â ŽDöIjøñ‰u'3Lt~¥3삵­yë±ñ–Z{r ,Pï!Ç‘w 8(`B;@!TÖP+^â`p„â+Ý‹ãi0_ã¿>²æG5Ϫ–uÇÝQZÔu|" ësBŽA‡DéÄÞg” Þ#Ðíœæ?‚‚} q°‰ÆœÖ‹l: gà _ÎÖÖÏa„ºgF`™‡ßFkcÊê…+&漬1€2ì ¸z `eD8lµêp½ÈE·ÍK1ÀFO¡@1ŒXª+ÚxÌÜ™&=Óá´+‹Z$KÑÜÊ8ÕbµL¬µN;üî¡Z­eg>«Y\Aƒù~¿¸©µ%Äc$P¦2U{ Ì µ“½àÓ$c“¹Ã¦š¡LÕê}vJXº ¯”)Iæpg‘2£E.ÑæsSÄ¿ü×ÿÆk­»:=ì>ýî7g=i$.ðN~ï§¼}ý†á­£(¿ÙÁâÅ}Ò÷0«ühNå;*~ݯk‰û鈯l¯u'smõå¹CÇýöï~)­ðK´—?‹¯{®kØVüÙ ”~É øVœ†ó])ó6x{o·‰ÿ¯Þ×Yíßö¿® ÿz ó¬x)²òÑ_ù¾Sá«7#ýBR›+àÆéý7ñòKùsóx¿Hú?éªï'=—¿ôY?ÈúŒo. ~ïËs£v‹W¶ß¬UôÁ %þŠcæíÍë¦ÄàÝH¾WüöÁÞ©œøÞ ÇÕÛíÕ{åŸâ­~×Ýï×nF_  ?Þ.µµV»&Þ¼ònÁ—ÖÚÆ&.æ\c"nÌ :ðá÷ÿåB)â’y<³‰t‡ÅwS…-F² sp3y™­-q8QIÇy23—혭¨fbz¬f:<–ÃAóñ¡:Ÿ‡ýþóôyß ‰–L×DPyØ/‡#€ùÿ¿-žÏ?/ÇÖ–åa†la¬KΑ»JÄÒà†tŤ åq/eešrMe5""£U©» \€jt¡AB.ƒù#Am¤Ð2ÄÙ@À±@í,Åä¦Ö"ZsÛÕkN û]½Õ`Õ²{br6C)à]XŒÍ¡¼s´}È‹ŠÕä“CCWŽB„î #B¾– ôÞÒã«0´Z¸„ŽXªÀš°dO•È(!Ç\- ¤)$0¹z‚ùB<8vDšž¥ Ìä¬ • HÂqA¸2™ R K™A6+Mz4-IA!‰‰ì/‘ ëdéõ$ ’³h£èSQ€e’¼ëÝî–6gä䜊ºëñÏÐÄÜQm])û„è@j©ÏÆj˜$¸Áŵˆ3[2Ÿ!`Iu\~çÅ7ÌûŽˆYVæ~˜ ¼@'dEO A¤ãóÄ &à …eÞõyK±»Èƨ àêRk>øøVPz°4€žÝ߆hÞ{—•Õ꣇:­¾gq»þ¡$Œ˜“yAçèQ½3×A"l„ͬWt—Á1æB  q¸"øj3Þ-1NÜ¡ÿ\Äû=™ju{’É3[WŠºzíâ\Ü0§—(ÅJ!ÃðЭê´Âãqõ#q„†²ãîq¿|y~þuõƒÝÞYëÔÔ+'гø 0‡O‰6w‹D.`B}f>±V l´42 «N$-‰$á&øDw£qò:ÕÜ׬SõR÷üôh楖2Mþ0å¢Ü1“ËÓ²ûÍ^¿ùÔàåqß¾Ìñ´4i™¦ƒf¬³WoKÁ‚2Á‰Š›³¢ÕÜ;$¤ÎŒM7æÑ¢ÍK¨Å¿üû¿¯S}øüðÿø»óú!ló+ÙŸç ~uÓ¬—w4›Šs~Å¡ù–ðmÕÚ^ýÝV5ÿ©Tæ{¶ü…Ñž¢¿¤{ý²/ë9^mî{JØüs>á½${%«ý¥»;$¿ZLÓøJF??Ñ–®õ\gÿRç Ðù÷|÷%—æ»BöZÁ —–­_b¼üþº·×ý«_¥¼ÝØwoþ¶¢âªÜäî/Þ‰ÄèÆifE]¶>…Ô¾æªÝ…±¼Ÿ=®u²»½ÂÙƒŽwVŒ;oçDÜ9{ÜßÜŸÀÛ׿ 0øþ)´ÀéJÝÛzÀ¬{M÷^!ºe­¹ájDL­>×Ài\ôîú‚®qžÞ#mÆKT’ÖÇÙoïCEÎ-øºóð«;ä³Ä6¤qöÐ[tý¯M¤ÍùFÛí*Æ/¯ŒJj0JÏæm õlzÙFÉÊò3-åâÏËãØmRö;3ßp–Ùlõ/O—߀oÈáx{¿€÷Bv¼U¼ów¸Ö~­iÛ €×}­x“òM^ ^[}ø±Ñó gs˜Ø¬gú^8¾êû•T\Éû›€ÀiØ\Ôå¿1É^l›tqnºWÀ×ßÌPÿSÛfµ“ ùã?ýW#S"A£~~Ò±e¤³RPË´›Z*,†âVŒJ4#`sä®R›!U º¤£¤{¸«Ñ–ãOõqiÐáççƒOûÃÏO¨¬˜öŸ?•­)cþü0U/„ôóýÅJÝ×ýß=>ÿøó|8„f§5JHótGqVó$fÑV2bEš8¼`ž™m¸Ç ‰!Ø„„ÊíYÅT'Ì?s™±Z# ¢˜ ‰).Ê€PPIgj2ø_À¤”lÞÓßÍ“M=C?µ˜ö´pæ…È”›PIBƒsÌTv‚“‹PPÇ>Ä" -!ISWžÖ™B2)w§È%sg6Á ÐË4²™YJ´ž¾¹GZ(ˆ©O=%À%¥DPÝ‚·h9D1BNõ’”*NŠ}ÓÒ€P÷’è¦gÕ×{áßà DÁOT¯aúñ þÅïH·bÙf- ÓyD&w{º›`óÏ‹ïd¹‚ìUW~Õ¾½Kß|²Û+¯~×@Ú ÐŒA£w´W§»§P|M±ÇH±ïB/Ù±5U¿U#²A>zuFÜkŒÄ2.BmFÖ”ü\=Žúr1 ;VjÖz åf _†pß Æ{bþØiqÔîtÑ«ÉðÈäå@¢­ìÿ³Ÿ4dýVêŠ9—cŠð á[[§ ž“LÄñvNó';E-Ànù€«—†.–ÝÏ™L«(hÉ‹‘bšÙQ2c17«4+S­»R'«û(Å?ÑplùyÊY$,‚™VsV˜ýð¬˜ç(~xljµ’^Í}že4çžþÜh°¾HÂh¯%!‡©1•RJ-r‰˜[[šRtû?ýÛ·ûôðÃ?ûÝ É±ƒ†±û‡ïMJù%'7^I<ï8(SA¯îí×I¡½Mêü埾õþõ¿6Ræg|ñ¹Þ>O'oïwç~]ByÇzñ״彪ØÈÿ¼—^ùmroÁ&w›Ÿï9¿è•*Œ¯¯¸M/ûæÍþfbþŸ¼à¥ßzö~λ~¿Z“c_Ô ®B¿Ð¢öëÂ0ßzÎù‹Î¿çR/……Îê?ì´ÊÌmÿ¹úaüí뫾Ê_öí5ôß¾þöõ²Øüzw»@£Ó^7ÒÞýµ·óûöA¼*Ñ_ëÓþ™Íª.wügº´_ÉõÜÿΡ_³À„P¶šýôûߟ~/R‡ŸžÛa‰ÖŒ(£›yqE–â»â­e­µóólS­•Ÿ>ï‹  •J‰¶,AÅTkUÈ’=ì¦OVK‹vøùçFøäq\ =þðÉc6·Œt¢—/-õÇÑ"ëÎbŽ8´¶„—ª™Nîw­/2×1J¥»×Zª‹%ËOž;™ƒ¬“•ºÏ”²;žvY\ˆt ™ËÈ¡îõŠeˆ}]€vm¦ tÒX%Æá‘ YÙ»ô³’ÇS«i®ºº'ÌËŠîI°¿Ùž’ÕÀ³N‘k¤ABvüH +#6$2ÕË.pÿá„\„¦=Ô9Œ½Â9rüÅÕœ3‡Z:d('DCéD£î0œ# à¹@l`7(>%rµ ˆêõ髨×\Æ'×j®“þìi×T¥L‡$>j»r r.$9X›ZÏ‘-­’½m<9lpäšùn†½­$®~ÁqµnÒSì{Äâ”:a\_›$[ðµzkÛé[+œg(ûçhÆzÏ:ûkøFP aeØ oðÕ_„+Jd>×Ëv÷iuWƒžûÏ¡þŸÒŒú4FFd´4Dp*Æ47·d0D#ûtè½ÝsªV+¦òÛÇâESµ]~óà•sÚ¾¢¶ò𾤠¥µ?>çãT&z=RÇiÚY)8ü<—ÀìHKÁ`¦ÌCª-ƒ Ý6ÞŒ‘©uþŠHJŠXæÖ–KS¤û7ÿá?vè?9|~Çük›2ÙáX¶UÖúu6E_ñA¯=Ïw†ì_Tœj~™Rögµ-üf}~ó=¯~ö¯q ø‹F¾|Õ€ý5¤ç׳×…û|óu×÷ü8¹}×GüÜJþÜ¡ó‰ò¾ÄÿÁ‰SCÒÈä†<òKêë&Š÷¼¸—*~I¼"mé¦Wo¨W”+&ÉåÚº–DjC&ùÈŠ¸­¶X«<έ}§èÞfêþ<ºîe¤-3ºIØä¥e‹.#—?z›ú|B9_?_ŽCè\o÷†çüЍ9q‹æt‡ÄB³:ÓëâY7‹º®W—sµÝKi¹\_6´¡r\¥ÓnrÞ¹¥ÜKΗ:qbÎU°±ÛÛ·q½C½hó›»¿ã Ç‹·²¹…méì†F£‘)º1t:—)^ôÑ«?áBðfÊÿÆŒ÷\o m——ÐÉ!€b[`ÌX†.çŒFá­O¯º²rÞ=N“øøÃg˜~ÿ_~š‡:¶l‡9™±´D›&3³¤ÑLJ­ ô¬¾ƒá0 @@øžS­@ÉÜY©¥­­Ôâ=}Td:(÷4'1'(sJžÏGg[bf&…\†×¥"g¿ãþ‹!h…åÍðÚ•ìÓyß…vbßwvVKÏÜÔ9æg˜Ãý<÷0C7iàÉ;ƒöãu…5Ä3ÊßO‰¾nL#åÿ„ûw1&¥‚Ëó0íõ = ¿¢ÙŠ×Àjkܱ<6ܺA‚—!ëR†¥ <€ÙZ6¨# ˆÀŸP&ÄŒRËpòau]Ù5bƒ6ÀAHG¯œà0–à“èç–ÏÀÒ`Cј6þÝf’ðüDH• 5DcOš†4ÿ±K«tj9P)6)¨FBh­;D3ЄdäÆ4‰2Ñd©¡Ôœ’H¢ GE!R˜¦èÐóLpnÌT]íy%†)%¹v* Åž8oD”ݪV–Ý^U ì E–‚¤Eª`!L°Ì(nÝšØÈEÈ„¹›ùA©&§‹²nNpoÜIEjhî\@¥& Žì¨Lñ¤¸“¾³°œÊ)$;{gZáî#[œ½謦ºæþ/¥—.áÁQw :² dØ;ž›ösü˜*ÌQãS–Ï¿ûœÇùù?õ¾mŽýóqtàbc‰#LÐŒ6ki­ËèÊnŒG[`˜W÷iv¸ØöLŒ"˜óè³áØAB6°õIÈWc¡°H‘œ!bˆæ=’—Ý™€+ðÇÑ"T*ºÇuß‹d s° Y4Á׌þ^?„Õo s±ÆÍ¯qŒÓÏ«â>Ž’…¡×Ÿ4yBÑÇn71lEÖgÔ d´n³NĤ¾9¶‚È [ Bìõ › ¢E÷ÿ°4¶R{rò ÕÙ³˜:˜4v…‰Ü¾%¾÷·YFO»ZZ¶§BqÛ=îs>+²ÅÒŠhÇù™`˨ÎÂÌ©>$)UaªûG÷Ê3{Z409‚¥‰He4ä1Z3¶*-‹Ì¥&È¡ ´cOo7šºcÇý€®õ ´¶º‰j$®ž6¸<».œë™wËÔíÆ˜ ‘è.¦]ýÇjãIe x ä¥ fÃûõ$G¦Æ1òÊáp¢L#aß˸ÉÒc N0!–‘¼ß«¬}ØÿÖ´yS>V‘=X²ÜÍŒHÙ"—¶Ì-—–’‘ÿêßýûéq÷ø»pBМºÔ‡ÓJþw_²?•çÿ5š¯Þ¿}ýi…¶¿‚óÅ/kjéoºæß¾þº¾ºÀéô¿þ ð=˜N—ÁûÓRò#™Mˆä6 ôšþ³~\Ùäû^W/âL¤|÷Zñÿ%c[ø ¶` Þ·.z—&³Qg6‰é÷“R_,켓l¿9^ðl0l3°Oi²·“/o[CwR‹¯ÒõÎm¨tÆé„vÙM®s¾·º5¶v"VðÃ’·X¤ “÷rÓ_lÄËzâ•$š5gÜØ+CBW::Ù_vÞTlŸ7ýé*zþ\]¼õµ©‰sq×¾‡+§÷¤KŸïˆ/oX1.1MÛÛ¹ˆŠs›á~~´õ–O³Ãù£Oª;ÃåM_ÞûéË¢Éëþ™t“t³õ×åÇ'ÀÓõ¯,^ïe]]d.h=¼ß‹.ÞÉÕóžD·Y`ï,WÔÂîy,ß œmrôy¢ÙN9§â"mk«Î¸ñ¿/̦W+WvCWÅz›Åå²7¼Øó/0`TÕeÒí=Ý{oÜÔ÷Ž/^åTl©µ<Ïà›õq©²!)Süýú|nó’Ù"2˜™Sõý~fVŒ…fœ ;£[ZKq2V )Ôg1åˆDfÓPJjfæYfD„¡ì'fZ´c,mnÓ¾þx˜@)•:†ª»YU²µ4 ÊÄ‘ZHš[/Éšè…Õèæ¥-îuzøô@+˱µùh ;ž:3A…ÖZ̈„R-M™'QÊμµ\žŸ«W>ìPŒÙ"rY‚©©ø1¢oo'w‘™HdtL–²EÆŠ@ÿCk ÿõÿïêTë~züÝç‹_? o¸˜|2];õ3Iî~ÆÀÕñ£Ò9× ¯ò_ÒÓGIùºçãG)Ãï”T®$’g›ýá‹P kȳaÀÅÖ|Û [üÎöÌòÊ]¤àJN97žÖâ¸ËMïEÎ2WÉC—Á«lŽê/»_tBAuæMÁ׺@Wî/uõ—:öºdè•©ìuJÞÕãoeÛIl‹Ûºy‰cÑ=HÃ} Ö;ÚötWPCÇ;ôì;\½´"Ý/‡;/Ü´ì |ïßx:¹Zjµ;÷Þ$¯E÷›ýjç¡Ûå_÷öÕ÷VÈ÷”^¾v^Ån›R›¨WoÿõW m„ížKÃ{–ß«-Š^ˆ¤Ý:Ü\êºpWwÜ^"•]ªïxoãkÑB]KÕÚP Ô*ñ¯Ò'–Õ €˜ö 08À õÆì†k2}X›¶ΟJ0GÊö<ÓC=‚ŽȤ„L¦€Po–eaK¸£Í3Ÿp'w™)ƒz‘¥ªZ™4̉¥1{±B"rÄT´uÿÕ5ŒÉàÀL,‰dQuh‰$;;J=´¤ $Ùqðƒ2ˆä!‡ÐldÝB › ±«²°Lãx]’"Ø H8)à(Yjd¥§%è³ O‚%3“4îŒøYBFÏO/nžDI%ÍÔK1Ò%*R¶&ÀŒfæÅÚ!À³Ãdh`oüÖäI#RjB%šº?®D¦ÄUµ Ò„a`Û Qƒ¤êS³$ 0“9è8DzQW]— a˜ Ÿxw°÷‘¨Þ‰UÌFXË×€Õ!ÀöÈVeÅc5q¦œ¶u48" Ìá†ãd¨Àj•ÑcN‘Ãå=ØÓFÁœF@±7Dw'ö{öá9ùú#î”ÛÆ”Òûgÿ—üÿý±i¦>«ôËv3€5c¼«@çÿX]ý<ê&kNqÏ_Ò ÄO´žúæ0!Ænr TL°,#ñ¾8¢ž²÷9¬Ü! 3ä>Åuè/Üa‚J0RXRÜ• ‰Å¢%¬VvNwÖÉEºWíÌö5>Õ/ÉGº‰Sr÷0áóNÕíÓd(¹óeZ°d1Ú‰IO@L´]µa³+»ú©î:JÕýa?Ai9"eÐ}nA¡ÒDJ­E—ŒP +`/eÿéáó?ÿíY–¾:öèM™øæ¤ÉÛÃoö^ÂmîŇ’ÚÖíÌI߸M°xyÏídEÂò£)w9×Wª nÕ§?y n\^<6}\J;N·)} _ýÄ—”èSÏ鑹Íí9ÝÇ 5}KyùÝñ¦¿ðµþ½¤Ðܱ ÐÛ­ùæžüM ò®d¹¹Î…VôÊ¿®PߥKýÂãáV&¼<6\œÁøz ž9?oþÔû…â7Ú7`ô[ÉòM€Ïëá“WÎe;JáAóÕ_WJíM¦Ûå||5mbЛ´oô–ÛÀ›ÍrÛ]_·ù+„ΤmÛö6 é*ü}¥ÑßíêW/âFCàû#.ßë­|Ÿù:Øry­Ûü­Àío_ûúÛ×÷ýâ_sõõŸúë%"í¯ôj7Ñèá÷X©Úõë¡þ\´¶ lmñå÷?þü‡ŸÚqQ´r m–âÈý~o´¤Jq¯%‘îD¢¹—9À¶¾?=T³˜—9S@Q7â\øô §M¾3.…̘Ÿ—ùéh¥ì>íp8”4´ÌPkÇ}qµÅwõ7ûšËq>Ê»Skn,‹\–¶ÌÍÐèÑÚ1q,•rVés;ÛѺ-&bj“Ó{–rk Y!²eF¶è2¿C‘ÇÈóF‚jŠ&#âˆv@<Ã/Ȱ6“‘‚:÷£ûp¦óþGÐÎ@p.ÓûšÞ @© ‘±~·¬DìÎÂö‘2?2î‰ê £> …ùÐÐÁ‡ÑnvŸR»OqË÷0¼-H D´0‡#á×zÖ­£Ú*÷¼Àœ ê™Ë(5È€bäeé“LFzo/žèj P:É'à»ÿ Qwo$g@ 5tYLlP/ (€°Ì8¦‚%Q N, ¥€ÀÒ¸Ñz‚@2{[C ,G” 4v<½ –ê˜{$ %pY˜@&ÊPmÄn~*¸`ÙóÔH Eª¤0²…6CÅàýØGuÿP-qŒ•ýNìÅ£Ô†óª˜C\ˆL%°§QZ”è}2Z·Žîž½³Dö¢“$¤) ³dÂÎ ŒÃAé«E8i;·cæÌd˜%¥h D¤©³¬½«I6e7¦S™a€²W› MêwÒ݉!d*€‰0 ’rK‡‘‹ú­÷оWw’xà¨û½–¡²b_e†H659š„„C“£Ú(”é`T(°,°ÚHÀ D; t[†ž„žÑ`8ûyP9»qèd¡¡Ë`†R`…tØ qèPës‹Èª´¹×ÐØ©­`}8‚­ü¶ªp¶FþƤä 0¤* Ck\ƒvk›ž-$s á^ 4ä~€¯ðºÖjåö7îã ŒB]$ÒWË \ Ú#h×%þÓ¹y`…67ýúK¿·uE݇Y1œ“Ñ aÂÌk¤j­¤SŸ&˜ê‡c¡Y)2§vå0¹ÕòYu?yºiWËäé |ŽæSÛ%ÒÊãŽK Ä%r7xýtG¦,ÉB3uá&æLV¯ dY‹¸š0 4©´0u÷FD[Z´ˆy‰Öafešþþ?þ‡ÏÿìwJ"½k’ÿd»¢?Å6ìÖ£õWßþÕl¨u6ˆå_fúOë/>züíë»wǯ’kÿöõ·¯?óe‹kN_"ÿjfªApùíóZ ` €@â)¥üfµ*ØØØn ¼ÉÉ×àÂ7E=¬vöçß>»Ü_)¯å±^=áËž8gþÉ6EÿŽùÅšŸsY¼!=ÜÏ {sÞ\ïô틤鵚âtÓ¼¹:?*‡j«HܶøÕwo_Ãmg¿üœòíaqÛÞh»ûˆº2]½«ZŽx‡¡Ö5ŠF÷;o+7{†Ê\×6ð+^ê{\ÀîØšêNÛqS†z'lþúõ¯³šôB­®+d®@R|ûþ_tÛ}eØÞvÕ7¾õR¥*tßw-Õ\Kz¡Ò»«ãîÞ׋­ùV¯Öš3¥;ó_|ê‹Á}kUÍ»½ç¢óK÷«Ù×ÙBRn•§i~›!r.ú~»jrÓ.¼*\|Û͸ó±xã€4ÚP§ê¢·/ò\<.ÖÒùR§ÖNiž—ãq~úãOO?~aDD¦RBq/ît33zÙíw U×=›•îNã~·GËåé©~ú<=îžæö8•Œ<üø¥<î‹G¶/ÿø‡Ç®< °º/òb‰©D ʵÿ´kÏ‹˜F¶%žžŸw÷› ›»Ís(#Gd¶bV-Ì,.µEñ¥-ÇiJKE~1ŠDºQÂH*$t Jº ˜JîÕ©Œ§åø°{˜ÜAî§=¬–âî6MEÅs_ô©Z$Æ®.kÞ¨”)=7íØT¬0—Ëê œ%‘lÀ”æ¤[ºP½–Jµe‰¶fÄÃI)[Ãáâ²,1/Ñ"#2ÓH/¥ìê¿ùÿññw¿Q+„3)u ½|ž¼Þ`H¸ªÝxžfë76az±îàEÏNøåàÛMà‰sμ͑ĻÝ>ß) l9$[,É]€o«¹|ȼ¯yZòŠ]yÙnºM (ã·6•7õØë —×ùå|»3~ä`wÙ÷ÖìW:¼”·Lä– õ2ºê½ÚÜ]ªÆë·÷¾óã[oníÒï;¾Ýé{?¢kþ¤ ½z'¯gŽ¿òï/LàUr ¿ª3\^üýÇÛ÷I‡—$­ç»;?úU"ì[cåÛ(ÈÍ÷ÿ‹†Î¿Â"~©e®ªÇ®V«Öæ»ü–?Únwª¯–’÷àwîÞù €m@¸-¿³ƒ½d†|ñÑCêÚþºny’ÊFÛ¸EN9}dö¼m½aCtÔÖ+oì){seÝk4mµÝK(ûøá†—€vÝSXOA‘á,¸‘ò.’H®ë‘.lüXC?kC\flE{}d^ãKZî¹Fò¥_¸fmh×›Ké¬_jÃÂãíù…i”×÷uVáy©NŠçªÑÛ²ÚÍ­Ý Ø^+ȽÛ:zAä¾Àáv(Ÿocœ ÄÁÃfÃx@Ú– õIfP2¯´ÙõO.£¼ šàTŠ‹,Ýï‹w{’6œ%žõÎWö™¸œ#pÕo7÷}!Vë®ÙÃÕK¢ÞØ¢ñ¤¿zwÑˆó…µ Ëév÷rµ/¶Gÿ/·¸ ;=>_Yž·«ÂxÉ/Uï®Dãë(æUGØ '‰ëþB¼šu~%ÚŒa^lXÏŠùæ´wàÃf*¯vH÷€?çxê˜x;|¹®(«t¿n¹×FTr1º ¦‰[ŽÐ¥O»Pá¿™™™Çãrœçç?ütüòK#`nÕk’f´âpÊ|ªU +“[ì)GÎbz¬ÖlžeÚÅó¼D‹Ã¡´VŸbÉôýTŠí÷¦–r^ÚaI4g“rɈfµÄóÒæ™H™v;k϶/JEäî¡¶V¼8Q¢-ŠP,íùY1çòÅq°òìl ’3(%HMn éê¶‚ gú2‡ÃUš¹1æ¦\:µ¢5 E[ ¹[ÎJhG «Ï ˆ•QckÚ~§Ü :v cÍîï>º9ì4XørÍŸí|ð:¨;#¿Xèyèµÿ V@WÞÆ¡l×Òùî‡Ës ’8bÕP»AOøíV­uZMw äã#FìÁÆÍ° âÓ¨ O ôê53׿- @cö$_¬×oP' Y§´ƒ9üN™XžVƒ„hƒŠn–È6åË‚ê`"Žüyæo3‰yá$(==ŸÈ†/$»¸hÙÌ_,Šö`¢™ KCÍU FeŽˆª™R4b²^¡ Ì [C {S²/m¿Ûï¦) ¦ frrªáfµ ½À=¤=8ò·?à7»ens oinø4©8¤2•Ø•ºg`d„™Âe\ÀêÆÅ¡°H7Sf,Ê–sd­µºR¡ÌԒǶı´^çŽֺ¯ÿãÿü?¯¨–ÁãÙÀ y>“Ýð‘y•ároKD\ç+ñœ!F^š‡éf»¼n^W£^Ô¡®¶TºÃèG òm²Ê]HãWHB·‚ÎF®åÍó¾×‡àöwO‰/m]¯¼^RâîR^¢¦\´‡´MµÚœ7.L ÞðDâe1Á_ÚŒ^~#¼ƒaÕÅöV—hvÝë7ï|߯âàu¸VÀÏФwis¯¼µ»ÊÝ{¨,ï3×hÖÍͬÃ]Wíÿ©wlÝx©~¼žDöÑVz)æ‡ !ïdŽ¿)_½£µ‘ýÛóχçŸ~VK;v Ô’̦}m)7¸s?MË|Ü•2¡ÁR R­“¤"¦JD›ìðt,m®…ûÏËÏϹ´77oPžÛKD©%`¾«Ø›'Òm!mþ§ÿjµú4l°2ǧy÷0•bPBA-Çážç§ŸrùYí¹N®ÌII!(dJ:½8i’Â)"²µÜk!z6fkDS¦!!‚‰XrUÆÛr©ñ=µ?b0»sU¸(Ëð— ¿<«3=+_> *{J{Àa¦ XÁI¸¡ìÐÚpîíÒX—່Sv°Ìƒ­1x#B?W3«ð‚îmÛÝw{ÜB«Iéx–5BÁ6‚•a{‰@Ù!° pgyw}+H½Óù ˜™Õ)[sW¦"e>&ë^ Ì€1ŽýgpÁñ C`E V;åXƽµe´êäð.?<æ"ÊPUR0³:0o<6¢Önd*5N$‹ZCç¥{$hš¤Ä¼XÄšC-"U ” !gCJbæ…’| iÔîðL”@ò˜h@¡lÐÿÕ¥í=¬Aßô8’°À¿Sì,ä³t”œ#H°ØÑë”|5C%äÃ!õ·p¬•ÆïwÃÉY¢ÜÌ›91¢<îæÀ¢DB4ÐÊL7K1A îZ-:#iV †cìøÖÒ9UäQŠu²[½¢Ñ©6;À#l–F´É fõâyFÙ¡8æa({MnˆÆRÕiWÑà6^¨u§ óÓ(—é@ùóTÍ1LúlœÇAñr‡ m†ùjšÝsí}L·¤ƒ„9 8‘ÁtŠ`HîCû>þœ>e™püñXJ{ÕÆ˜^©ÁV—ÝNñjÓðG[[¬Á (£ˆ‡ÛÜ™þW[eßÄR’8gôh”"Ñ`kH6»”:pd=—9<9ÔßNÏñ^ó>tüžÔ?D@Yžò@IXŸ>¨sÞ½„®ÂòÑìÛrM­Ì ¡V³Ä’Ùs¶Zê»–:dàÆñéqI-cªY8YÝ ;z>X>< éyŽÝ±Õ%űØó\ªy¯ƒØWÑzx´¼[a‚H±Ê’JÖFNn‘Jº j3Oæeé½Wh‘Ñ¢--æÔœVKÝO¿ùôoÿ‡ÿ±¯)'gSuÊï±ÕÙ&øüy Oî$³ÿ:’ÇUÀeîË_4æU"ø‡·è·g¡ïx0º¨øµÝ› ðŸù‹ÿ6·þÍÎ'ï•ìSÞ÷žõô«¼’Nþß tþý±“_ÿ½)_|«O9•C½ºøêÀ´X¿? —l¿j´¾¾öëÚ’÷}‚Ïk¨ž»ßzq²(úºÊ…k‰®?ö£)¿RÀÛKõ=æO~|÷þÏ&¯ !Þ’‘¿Â9ê"â½%•ܼÔS`íú-_e‘ë[4ö»ß ï$Ÿop-§ûºðÀå Ÿó••¦×¼š b·f²—Q{½ßïwoè#3˜ô¿î‘䮩ï½ubà‡^ƒîÔ_ð¢®òuw÷·šä=e—ç<ŽUTíÙ—zÁw魪೵ú+)yYÑÀÒ¯M‡ã«Ó&×Ê1]ìÔ»þŸ+ÓDDPJ)µ ]W+DqÛ“šÂ~r# (†Ÿ¾cÑÃç=½[N†e^²È8.Ü×ã_æ¦ý®âaχå¸|ùãO¶Ÿ>UkÑZ =‡y¶éÓÎéÞälÇÏ(;æQæ$±ß;ÌÛqVÌe*ÓTk53D›Û*¬ “ÖÄý~”]K¥e ˜gQVÈT}713æå¤â)€ Ѱü4‚CüjȆh A˨™ˆ^Q+r†FD¢%ÂPLÇO3•( ¥¨Š ¸IG‰Ö8ÎD0-@$%, «kªŠ†ãÑL“Ì5IÉN|§…½W-þ€ÑA‰Ý¶T¹«¨ìÞLi1TÀ9‚%‹@ˆ¨Ò5äPÍ1{\nðä1G”^ôw8E0±çpHNB …HRP—_“’°3«èHY‡ ™&r¡@NÃ¥ÕZÔzœ€tÁ©-’;“He*9òzEfM"ͬ([(EFrQB"XÜ™‘kd27µK I)#µËÖÉÓ•S¢ô(XONœ BÃn2y8bÙˆå!fš À•h$hJµb™ ÕVÈ G`,¼±âøýì>ÝÍ*¨¡w÷Ú,, Ãµ"¿ ^+´jD×ál*H¨WüDƒ 4–rƒ¤ß#<Ý]c¨þËþx]Ã\ ÖÛ=E¸Úƒ+:jÀs†g¶­«ÔZÖ~ìP Aø:YeÂ˨„È‚ÌR@~^©ºËÅpH^§Á¾žvËñ:íuBÝ<ÀÑ]`P a‰Ë͆­÷Qx‘˘Tk ²YÍ]˜Çc‚t‚lÐÃçý'¯tßï&Ÿ¦g„?+Uá‘?Lþø[úÏónòHѸƒéÓ>„Ýn‰äÜðiJ:hqڶΰI*4ÊHÁÍŠ±µ0'é1G:Y IGd´v8.hË- X)^KÝÕÝç‡û?ü_nÊš%Ú–Qðm•MQm߬”гñ0ð.ðáeiú»„DÞÔ`¯4Kòu±æ{h./9g¾,{òÛÉï»Gçð؛ʋü×FEÿwËÖõmÓòêÎ˸Nýւ׫ýŠoÖm|è­ñWñ—ØÚ“â¼8|´n†7uìú&÷våï}Ë!ùA‚'xý¢‡ý¨€uC¦z×é{3H…{Þo~Ö[>رûW…ΟW4¾þ¡·cú6Öo?‰½Î.~tûŒÛy2ÄÝz‘W`GwßȦÂåÜã_ªk)8™-lpÇ+ãR¥#îÁçïà@zà6±â,.ë¤—Öø ŒÍe.ëzѵ’ùî·:ãœ7snJ^ÓÄî@Û…«â”ÍwnpAg2Št­¼S¯±MÐàhèê1·é¥7œ âD}qx_Ä]Ÿ·ï5tÊe_J®ØìSÝô$›$Á‰b0òØ´Õ°›P+2!C$2Q|¨ð'z„¥Á«ŒÈV°3„€”U¸!mA6¦PVü=wˆ`­šg¶&s”:¢1™èú‘çU8@X ¹Œñ•Ë‚@§ É‘°?(@ ’îð¢nî=X: ̇›´Ck« šð N­…5 ²—ž¡q“'’Þ­›'®µ¹"0’ë…na ü„Þ²µšçd½{ÒܳÆüÐMzi‘È»Çû°µU£Ï†ÖàÓÊCë1°Í"m¾VZô8X`Èê¹ÖøZµ–ã &X‚kOèqÁe fþ¼ÑMÓ¸{ÜÙTYK©u7M³Ù¼sЧݮQMóÂE-ÝŽ­¹Çä"Š»w0ÔŒyÎ–é¥ØÞšyˆ9 )’}Íd:E¤"¨d „FtjØ‚æfž+Š£µ¥©- Z¶yÉ^½îwÿÓÿí¹<’áT•qq´Xùù×.w:å+wL›x)[l6MÛt^dpå‰xïà¸ÕJVtЭºÂ×%ÎÍ“éÝ:é5 â³ðØ/3Xî"¯èÞ)³^Þð–%{'Ýø[ËF7âÄ“µ¶]q,·¹#Ûˆx×tîškq¯(àòê'Åž¯ÌéjWù§ßN|«åoÉ´i‡w`a^ýô—þüÆV Èý_áù¨p’ênT¹ –Ò•þ¾7ïYÍ] +§q§×¨Øo¨Æ[õÿ ˆt s«!¾ËzÓ¹mË<Û`Ö^“ª¤7´ý{¸›~–Ó ­mæe@MŸÒW1Z·ô=õŽú¯Kg»+DÏ{r·ÿê¡óÜX±¾$q\ ÷'¥W–žÛÉç6‚9$b;÷žð/uä«—øùä}?y_O~9’ôúTðJ àÎç¾èøó½@ ×}]~úkøCýF*õ’àþ=²¾Ñ¯ü©+¨ø®ø+=ÔeàêVŠ?»nñ[¶Öûf–‹ €‹¾xÇ-—ïÎ5ùNáUûåo°sÿÓõÈ÷„âßWð}ï÷n"_˜Uïz¸½¹"^Ñüû?¼±CzÍæ÷]å`¼n¥ý7§sû9<|S ¶,mYÚÓ?ùñ´Œ„àneª,=)©ˆ“Yj>>?=>¸ÙÜb™—i¿/µÑžžj)Ÿè5#v;Fèx¬{îk|yòÿðOÍÜÕ–¨žó\~ØOî¾Û-DûýfdD„К œváÊi¿/;–R2­e;(ž‹±´å°Ÿ_ž3´dCp—0C­n0EöˆkÊ•{¶»LZ3è}DfÞ€9V/ߘ¡y`g2Ô-g1ƒ€¸&¹k…~œè7#‰u(z«ÆÝ àHÀ:c§‹z±–f8"  8"_)ÞÙý¥ %Ã3=>2²ãKE,ˆeø /Í•æ1, nˆ8KGÝ´ Lƒk! ^£{ [… ‹†ƒ(/ñÏ•24:n"d¢Tâpèm ˜ jF´ŒR ‘fƒ€„žç›ð®Er?º•B'˜Áwƒ‹2’î ¬À» <ì®9‹eà± päŒe¡Ž„avûœg*@`*@c$p¤¨ @ˆ M2ˆ„OªUË̶po ˆ'»Ž™ ÕÌ»ºM†ThŽžê«4ab%Ÿ¥ ŠuGd¸ S¡°& “ôêX2sE©»Yu(64ã2¬tád’]œ HÄ ik¢°ÄFKІEYz·2‰ZgDd4üc;ïÞi½ó$™RâÃd~iª0/Ù‰î,†bK¡E§¹’§—=̜ה#S²Õ@¢õr<8JE©#ÁžaŸ€5 Ôm'(¶J¤=¶Öà™:'gò“‰È9`™`·="±‡÷oøø§ÜÖ_Lc* P{8ÄÑLË!ûô8Eñƒ±+Ó´|¬»ŠJ+Sq«´9ñðÛÏ)êËa™ìin©å7»ÑÔ×AwA¬ˆE‘òÉB îÝÜ…ˆVhÖ£µat¶yi îwS¥Ii©%22¢)Z›MKd«^vÿÓÿõ¹Þ-¬3õ‹™bßôtpµaºÍy%ç‡|ïnè+ä‰{ÒÉwÌ™Þ&r~£ù“ƒƒîVüÚÉW¿‹ z Âú;ºÌ Õ·}›ß©€/gr]V¼&Þ½ûì©w€^´·cíuMÿ{ëùë|Ðeæ¸Þ˜ñ¶øu4èûñáþQŸ‰¿Zèüý%ìƒáßc€_­¹¾nyýN«éWG îQH×™ÚýÏå=ýãkÕæÇ.ÿø—òurMxSÆ»éàzY“úe½ã/›8Ú‰÷JôžÎÆsrñ}X¿Mñ[=(~iµÕGïDWu[wØ—¾À9WË|¤QïÎô×…_Õ¿Â>™—ÿýéÇá9BþË{Ë]ÛMöÛ+Q˜ÎÉ7€×öI›t‚_ºI:‘Ç©“_užÒ+ûo£õó ÙÅj :üôÔŽ-mn_þéK‹Ì$)d­…n–¶˜Ü s«eRÓ|XxlŸ~ûÃôXÇ£ŸŸŸÿð?~zØÿð»ß<}yúé¿üÎiWö¿}üô›OÇŸžøi?YÝW?J?9üþ˼›ööi祅8ÿ_š•H›Ûd2ƒÓ›BZ–CfiÅÍ,[;8b‘æÃóS<t8:Z´¬TtcX dI™I³à¼ˆI§1ÑÔõ«¦Pñ„“Èû'8QÇýÇ÷Ï•LÝéæÈNìY=-û‚[W¼uúp aSÏ? s¹ ìF*)Bk.m'ž—9FŽOÎ ^Fw79]]%wdC̰Š2DÎÎïØŸ.&ÖŠSU^—üºb(ʯʅùÙ ýt³b8¢Ð…VçƒZ F¯žÊŒDÈké˜ôÇR§2Ù|ŒÔ(AàšŒsX°.m倷ñ°HÀA +#˜Ñh¹À©¹af<ZLµ¨¹ba¬'P'—#1›ÕTQ BÐÂè§+Ì )š,Õµ ®"µ‚]ꆽ&Ž2q²sU 2¢…žrZS-D#œœ…8F œÌ¬Wë@H ŽZttà=Ø(†ÐŒÔÈ©·>8ô,rJhÔ) 0 €!M6*8äÞ°sf2(#'ã˜𙤠#˜¦¨” ´4š”0¦1Zšhn™@fJ†è5L¦ñ·ªNv›>¡>ÀÊÀï°À Ã*…÷¿z9,úßÙû·.I’ì:ÜûQ5sÈÊ*½È! $ö[Ïüÿ1kÞzÖpqfØM¨ªÌŒp7S9{DDMíæ—ÈȬ«#+éán¦¦***²Ï>߯ä=¨¶T,Áy¨¨ Ž¥'œŠÜ~h­hiß&"÷ nl£æ ®~‡±G¸õDæ6滉žýØz/û¢:Â(Âüqž¿ý_ÊRãp,KYÕfXBT°Ýªë‡aÕ^èfÿ‚(÷öÖ\[*’w¨NSÉ»Ý>FˆwjY…h9½£)¡ƒÿ§Û訂G¿ëÛ6¬F¯_¶;·E‚«Õž½Gª «¸X´>ÞÆ>Z—qí4v˜ŒÁ4fª1?ôÅÚ'«Æ.C Hpäi­b>ÍÓÞ¦0ø4ÿò—ßZòp—qçyNžâÛ_$¢H³’äîɉÝôlFh>VÑ–‚ÓΫ¥"dI2·¤èÉîmø°õ µ 8Di6«€¢Š<äj‚ÄRp8f•تÿÿá¿üÃÇ¿úÕ8E§vMúaycAû5¬:º»B}“z_Î{«lôeÈ”ë_ýâ…ÖõrNz›qƒQü‡#¬Œ?ú¥î©ñ|©•øË„åŸPÀzaI¿î`.;îìZÞ^1º¸oÚ“ŠÀ{OéýOôc ¶ô‹æ›‹?¼pf¾žvù ü{èë×¶¯E¯L——dž¯™ùñ'í:–•ýî_Z ”‘ô¢ƒgdQ_ÞYwb–ßt!^øÉ›s}Ë_çB¿0ò¥mz¼V*ÜZЩ°15óŒ>˜%:tÎ 7¼u&Ø1ˆkepÓÛvÅß>*Hœ[™·ë–Óêîâ¬ñzEÁëgÄ:,¯³Îy"ìF«ízrŽcho(ý›&máB'ÔϺ½Å6:©VZ2š~W3ÕÈýº¯ûñâʈÛ<…ö‰6cW¸zoܱW]£›ÖÇMã•^2F@#¯Žxø8h™TóßR'KÔÖD¼e\ߘ¹°Ž÷ÍËph‡—'S/=ǹÖ8VIÛµo)2Üwnh,—@–Íg<ëóÙÂ9Ñü´+cjey Wõm†Ç°GN·'øÔËÞŠºNÙr;ú òNa`ÓuÙmªm”k}Ƥ{‚Ýôo½ ŽoñîLµ:ñWš¹6þ_^úõzR\©hk'èi^ÓËËr*±_ôà×ù:è,áí¬hs#†7ˆY7[Äf½¸ùÎéÊqÃÓyé~ .ç®hÓLBžIÿ¸×È9Ú÷\˜¨\Ði$ž>Ñ©ÎAnïµ>ߌro›p4òm~ÚA¾ûüùÓç|\¢ÔRÊáé9Zä [JÉS‚3¥$À'ƒû䞌F>}úœ—üÍÇ)ž>}òäùK|û«_ÌsªQž¾ÿôôô)%Kþ¸üð)óá‡Ï‰Àqñ¨!äŠ4g©åó÷Ï9ȧÿŸè¨)àKSu­–ã1ŠJž'sÎt7…ëñ˜—¬r8~~¶zD)¹Öh`’ 5(•ŲPˆ¤¢‚N*!Dt9)Á¦(™ŽZŠ’£f–£ê3ŽÇ¡pÕ~e¢B&hê†w[‘K׳ª~6 -6³éï°î A†XZê,Š` =]“-ër‡” @-ý»191ý6ã¨Ó„"C¥s{¢Â'ÐPó˜¼÷Ä२½#!|•1ðèÃAÔÚëôîØ…£t·7’aiù¨K ùM†T+ÀD—‘p(äB(Ga,ˆÚèMiŠ(]Ÿ]ÛVj…*#aXÃ+ÔŠZºê:%µ,ÉÀÅ„’a [鑬G*3Uø„€jai¢©ÜÉšÁ× VóU*6NL{ÒÏã¶Ì¦Òòl2µO¶Xx`ï={7(ÀS(w|f(Üz'ÌÛà € P!‚UÝþÐ #Ø ?©?¸Žcd­Žc*ÑÓƒ‡ _%ñ@{F„ ‰Ü™r’©Å†€&5©±w&ÃìY! Ö ¦`\p²J„r¥ö8$ÆRžU0D¢hËMÇî¦]«^‚¼%¦ö±×Tø9Á'xœû}×",à.3ÔB$JALI$j¨ „lWa˜ÆmB»æY¡èÈ,ÆH¿ˆŽÿŠH0ˆ==ø·…ì²¶b^‰Žâ1çá»òçC,µ.5µlï¡»²^êkó½ òOóàw¨W›[4êmÎIpìþæÜwx“ï}SªT›½úÜ#™Þß½ýÀÊåV{ Ä´I>Ç€¡ •(#©¸F¯¶²bDoj5‰VŒlÓšÐ#¾åh½"QaL=Q Ïu Ê})k’ù@œÁàD)*AÉ>>N?<i÷v¦”vSb:VÄÃ7Æ}Q$ú‡]82ØÚr­nniòHžÍ@³4)J+­ !Ps¡ä¤¨RƒNÂ2@IQk0+¥ÐaRH9—’³JÔ%ŸÔÿø/ßüÕ/ÇóC漂CÞu«l«º¹Ðçí—âk2ö‰“*nל·<Ë UlaÍ|A•Þ¶T|Kë$ß[|¡oÞžœ/wy U¤LÌ+Iû‰SÈN Ý3=ë&SâUëÍ|quWžÅÍ×<ûæfÛpK¥å¹~¹~ØMŠÀºå&銧¹èe;¯@ž}¯ò’Þ¤«¥÷K ‘įkî Îíÿ:c©r%’_‹Yï’ª/øGºÝ7÷ªpÃ?¾Ý¾iìËoÓÞ×_<¯Oœù¯Æ¯ôaöÒÎ å‚NsMÿ¿8žk‚Í çí^–n±õÏœe¼©âs£AŸ•¾¸Qˆx¾sÛgÞ½Kövè+…=ý˜Ñ³’ÙÍèÎU}Ó3•§ €Ë¸€&[¼ÌI¼Ãº=ßAò~²<¯k©Ûâ×:܇k;N9ƒùKæ©~¨äçß|÷üÿ‡“‡Ã3C-÷s6“‘dš'óö'+KFÁÇ PH“[%Œq8”y?Ïó.r<ÿð âþþÖŠÓÃô«ÃÓaž“šeÿ¸,Qm¿3óÝGùñÈ9MÉAVKñÝÿKŽZJ­ -¦Ø³š*²Î`dÊ<5[2æC.K>~>jYâ¸,KQ­f"±TxãÕ4'iE­}ýÕR€)E%‘AWh4ˆ q*86TH&Beöÿ¯1¼íáˆî=ïí†Én|:¦¡.G"—¬`Áô¥K`B]1ý– Â'`Èß-¹¹CEÐYØÆÞÊè?ÐÐ%íF턜ð QížÐÇ-NScÞg— Èúϯ‹€ö)‚Òäò\AÇ<ÐPíEn7“P–Â9ù<Õz(ÇEYZë%4¨éøµ#þ×·[ã‚§ƒhåô&57äŠÃ» µ Wæ>ÅêpäógîÀ) Ò¨ …ò„(…Q “‰€‰’ÜAhɨ•©­ß‹l-óÖõÍkO¶òS ¥‰û™ Å1dA]J¿Ï†Æ!„#àæB1U˜ ¬¡ ˜ƒ¢‘E²VJHîaFAÊRÀB2Ç RjA¾!4*„dšÁ*Ä.ÔL>€ÁÖaÐæ“˜ÈJ`2ÌÆ ‘t©šÉÈ$ÛA¤ÂQBÕj‹àNÅÔìþ¦à”ÛÑÀÔ±õ2”Š2J±®lÂü€iî-iê²Q:½ªÕíÄšÁtª QÖ¦Ž%¸ƒÜEÀ»ôŠè‚}6ÐP#· Pj‡t±1v2¢ôÚ©Ú­ó¦ƒnÆÚZv:¼+z!Á ÓÔÿ CÍøái—£HPû í>7YÖÑù!£ €µòÃÖƒ?G8>KËXhý>šJÖ§gï„â ׭ѳƯÕ)Y¯‰"NZžVS@­°4Â9¬µù@ Š#Þ­ÒP:¯¬ÛUl³N¡Á¨€!9Š€:~]'|P®aHLî>žlç5qò‡‡‡GÛÏ–Òô/þÅœc—Ì’…`ÇŸË\C»©B‡Ó~~HÜ”œYJP´êƒ^ÉDÉØ þ ¼Äèm™‘æ5—P¬E#ç¨T)’J©Ë¡Ô\j­þú?ü‡ýÇÇõ«lx„u…èEØåÆ*pÇûjkåFc¹úéµ€|Íÿ–UÞ[äÑwoÈx·´ð®WyoÀ…÷B×¾OZÿÒkõö¥ø;•&Þ[Gëæp]Ã+ Û;¿;c™·ÞýËèù?¦z´Þ/÷¬Á_ÜðµÕ"Þ¼ãð„—Â#_>B½¼ûâ€ä{éKúð6¶ø;g$Þ'ö¿mË}-ͽ¹W1³÷|Ü/‡TEäÔ3tþv¹ð•«|Ý¢ñ¶¦ Ý å~cyæ÷X5åý}©Xxù•Þ!M½ÏX0\Z'ï<Êæ+œü·”Äî‰è£‚þ{w"¿Àým§äüéû%—àëž¾Ÿ$Ü@?ö·_89|#Qý}ï9ºtV8[ÈómÏý/Zï¿\eÞšóÖl~µÈ†·~Â÷vd5ÖtÜ‹aÅ¿ÆëæŽwòNàëßt—Cù¥•õ)û¢[cT¤ucØRž~xZžÿô?ÿyy>˜d)ÙÌižèµÂifL>¹ €Ùò|˜ |˜\hªÁP ªÆ<§ª(¹¤Ýdž>úŒ¢òÓ“»eE~z²œŸŠûÃÄg=|Ü¡òøý³ûî/¹|zòZËoÿwß)0hu!HÕºdA¤E¥9CP&I7f¢Qp(ÑtYDJªÍŠ›º7?2ľ¨Ç†Úï Í ¡Æ1(ϰ„Dé(m5ÜQçy(0ÎPBñ殺v¼ȧCKPB] :B/ Lž¢–Ϊnn÷yî®X œºfÚ‚%Xê@‚hX}["¨AêUŠfI`Sá„u4G3J7ϯ7€£–SÀæ©m+Ogc¼5kíÔ«ó» Y/Xê1žQûˆõ! äÃRÈH,ÇC¶Ô›ß¦î<|V9`zèhõ®íwsËz]WʼnùØ]ÌÞ~Ä¡‡»¶h„šy0ÐÀR±J`XY + Â)©V”ÊÉÔøB)©†²¨¢caÈ©ªTT" 6 ¹q'ÉMzÌéÆR À<’ $’@T…3 ‚a¦hØ~{W€Îi¦x°FÈÜH¸:&1Õ¨3 ÀéУ ® Ü ™)w¹5öz+„d¬dQmÓ› !=AdÇÊå DµdÖV媘K‘ $Z­T7QaæLŠ,Ô”±nn4-u‰{LÖ Ÿ`3Ü1M0Þ€+ƯX×¾1è‘Õ4¨äðŽÊQd–FDe ÔfØ BªAQ>úNÌ{`u««Á †÷A¯:t•?N€µË‡èøš^Hhnú€Jôkü~Ë7Ùºv²#¸G©ý¯ÌPŒ°AÔ€û˜+ƪŲ̀Ƴh²‘[Тtm°ƒÔbº½KóýÎâ˜mÐuüXÓÄÐ’Á^¼¡oóý¨¿·72(`ˆ¤‘‡ j'z)zK›1 蔀~`Ô¶ó¨}žAî ësÎ Ñ^ßà½\As>îöÕEŸ‘æÇ¦‡íçÿú_[Q²ºì]9žÉÇ@ åÝ\>ìÒÓ²sÖÉ—Y™&Y­È%䔲°*Ðh%‰ )„ZiŠ6ãû\k–Bb ä¼Ô\óRKF ýw·ÿððÍ_ýªÿ7ÿÓ^i›êþ¦Å“^[Q{Tt.Ð_hy£Ä w.à6]ªzU>ºüî:ÀWD®DœQ#ç™ü†w~Y+üy(ú?e`Â{vÿgñš?b[ð2;â§S¾8¾âwp¶ïÖ'Þ7êøVû'W!ö÷F÷äNñ»«îÄ“œŸŸ{¹,üº™ÄÐùŠ—¼)¼ÖQ›çÁ—®{¾ÖuY?ë{/ýup]œ{aì½¹³d+j]fülÚct­°5ü§¤³´1¶ëÔ“#´,î+ãûæJKDÎÓ¯`%iƒ¶¹¥ÍòŒÅq]š»ñXãõŒz–àÚ¥[8,A7U´­_:ïè;ï/h‰«¶Ç¶ÌÚäÇÜ­´æŽäê¾k»àæÝwoPu‡ ¾*À^UœnñJÖoÖÞ¥·#èÏ3iÏ/Üš²°¹óO?N;V. ._q¥²\,½û??ÂÓ"JØ@©®s‚á®ê´YàÅE¹— ­—ž„ç6Wçù"à|Û¬í>»¸—’æÇÝ.Íé›Pês”ãçƒÈrÌ¿ØÏËós­¡Ãò”óþ›‡ÝÃT–êÓäOÿíÿq¨Ê½›ÂSˆÁ…KUXC[ÖŠ(064TC’TU0 Ý{Û²:wó†‡ÐŒš‚Úß0ÁÌ`ÈŸ›~Ö¥´†žh:eƒÞØ àƒÍHDµ)p r!@hùª4¤]W¦èÁlêÚz­4¡Ä&ë1T˜†dF(K'i¬}Z§~×#Ø,É-u‚jgû˜w|v‹Nu¢dШ©§Ã1ré¡=þEŽy.i±~´@¨Å‚O'AgÉaÑ@"J;ÀXBiÈïw :Ö£ÑØ[ð2Ghh­(¾2uNzk¨XÚµsäŠ×Ó‘sâç¬ç‚d¢ð ´ š˜k7•Ь¹ô%“„vıð9£N’!g”à.:Ð<£uÎô„OÈЃ± -"‰::­‘ú-…Ú‰[Th i ©#Fœ/Âx¨±3£… ¨º¢=»˜H# ÂPÕ(@f+Q'Á`…¨d¢–3VÁŒ èRÈ’× 6ƒNÌb58a2…!S x°¾rpUÔCš²'J䉂ՈZBmQp$<_® ¦=Rêt©î@7ˆ¨($ƒ;jÀ–ze+M½´ÐêU¦ÞRÐnBT¸f ¹$ÈâÀÍ·;¨,`BÚõPߎ¬PaéTˆâH^W²ßGØxˆ[ì‹ÑÐ qÄ€ 6,ö@9Ü&” e¨öz@÷û—žÿ‘ˆh@«MÂF$5‘F_E› ZŽnë+jñ­Bµ‚|$÷6|°zêXŽ9,€ü ¢´©À¬×,™zÚykêÛ'×¾Õ-Æ·¬é4]k¬'5f¡öçVð[³Áa€·õ” „(Гe«€˜÷?|œvûô8?îöÿò_Jõžkݹï'/µN¦ÝÎJMϹ‚±ŸjJ‘:æ¥a‹âUÔÑ^С+-9fXêbåó3Pá{XE ìœ*˜€\‘ “ 9P ©õXX/µ„¸J2Q´HÉq¬È*±7›€Š˜ 3DV+›Á(T IFKB‘Œ8J MP šñ¨B¢ÁƒP¤‰>›•1´y°f4é0bÈ ¶thšUrBP óæÚ§íÉ$a'K‡f˜H@IÌz•p 2d©ZM°"YÐ[UœGzx¥*£‰‘e* 1jmBƒjU^T²Öç§…º8®G~X`Ÿ{O‰9j±îX}Öë×· M° žz®µ„'EŠqd–èH´”UºÃ©ÚæGJR 'Wºi†M°"uAl2w>ÝŒÜDŒ;Ö¦i½5¹‚£O5 O^¦6þÝz¨õ*…cˆÝ–` $¼7ì æ~ÐH;­U¤”^rXW‚V;kh¥µ¶o“†÷¦f£::D 2ØCýSBØ Šn0!Ð;J„ÄÔ£Ö„&hí ª½Mª5ôô‚õ‰ç§uVCÕ2‚ÇǹZ:Ú¼D€(Gh‚€ãÉá{›m*”±T´Sg6y¦ƒ“vS™œ;KÉþÍ_óçR­ÀÍ>kÄaö´Kž%ñXj LŸóᑚ¹KÊ¡"kå¥ÖgŠhOÞÚ@g@©•$`”…D¡ÔŒöäÊu9kº”PôÉÿö¿ü¯ÿò—Ûhü[ÜTÉÖ¥×…Ôª5­‹oêJ=+3è”?¹ÙiÍ)º4ÝX½5ñŽžr™ùõ’¸óN/ãOf#}YÛÝ"à¯õœ{¼Ð[ž“ä!áFÙ×ÿz[À ë´è5;Ø!@7¼Œ¯ôµÜ#ºnj)7E´wïJÞª|ÜVðñ»ýâõøjÓt%öý˜€{ö5 é+úô¿¸àå‚Äöæ½J¹xõ•ïž á*OàÞðïí»ÿyWyæä׺XŒÐyà¼ஈtÕ€;^(=^ÿÊWªÑüñ¥wNëüó)ûúú‘¹ÚŸïlYõgç÷·ŸñµhÚ?½Ñ¼©D¼¼0û#Ø—€û}î¼pÆèÇïA¿Òà ûö±Soò®FNàÉ:·Ö´úRUsyúô”9%"íæ†¤'¹{œV¡s”úñaÞMSÎùÓO³‡°H0WÄr,ù˜ñ˵֚KY2Ë”vÓ~~È9ŽÇe—œàœ|Jüð°õ¸ŸÝìÓÓÓᇨL©2‰éûÿªZâXr-‡œ“Õ‰–8/KMPT«EµD‹À­¹iåB0µ4Ú ó®>Â7¨ëèZX³ÿÏ».‹P…9Q*à X –ž¡Ðâ=5r5£iy;ÌaŠF$oS£tŠÇl*yxWÿÑÞº•šÄ?AŸ¡@ÎÝëŠ z×þƒpÒZ6Í]§h_v?8£/[ÒÞZ£ƒj†„4w92ͽTÝ´ûæD®ØajÔ "íGý¬6¢[§W.‡y×=Í›«µ —­± •jãG/Ò‘Ì€3ªªù…›]º•jÚÁtÏ¡CT4M½Õ3ªúÙŽ¦í˜7êŠZ{U µk´WʇfÇN¬`Îò¤RáÙhš²ƒŒÔèèÜ‹b4{8‘3 jA Ì¢IKe!Ìä4ö6œ[Æ64%"t¬´î ‰ ¡D‰Äxp›)+ˆ ÚQF“ɲ8)¼?»½@§™TÉIãÊKï°‰Õ öæ„2[prÎ"†&Z†£WÍ.Bᢃ$ÃÀÊŠl‚‘0çÑ%b®PË!="…™»yÉ%D•4cª]ó%ßÄ]æ1ž¹„hàtT¥o(r(º‹¼±ƒ˜`|‡4azè5¹yFT4óµ lÒT ‚)AÂ4ÉZãˆKD –LoU.1Š!P RœL±•E›úí¶V¤°iy1;ݶ†5Š|”èr#î¸ÅJ÷ Å»šêÇ iÛàlB-w¨—Ê€äÄð|n¤Uˆ·U«M"Ô¨ý¥ÀÓë¹éù%‚p‡§‘<œú»´\u%ø êÔÞ5 Z@`vˆ£˜ÁŸQ[ÝNýú¶¼*ÌbŸ»¶ûù_Šq½Õ6d•^.âã„ ¤”&wF¤iªä¢bÉm?ù¼3ßMûý¼ßÍûÝü·ÿáð´Ô»ÉåTÔôTÊ.ù~¶€=e1O{úq—ª½‡Ùâæ![ZµzÞjÑZ”!CÔ„’k4BV©e)!É4¥÷ÿ囿øv$Mß@¼G-âÚµuæf8_üè]V¯ŸþëÜÈCðÿ™5ÝøúýçÁ|••ª¾Æ’ž?ûXûó×îð+ëïÝÎ÷*oٜޜo~ŸEÆmà÷ ¬ôÕ>~bèü«ÒpÎ 8EØþ^Þe?Å£óš8ôZW‡ÆÏw#ÑEyëüŸõ;Hç†ìA{ØP®^èºíæôÃ7äÔ[BgFìó˜Q­H£³åØЕYõº9iCÝŽÜKqë>øúüì–‘.ç©wÆÖð ."ðÆü§‹ƒ\ùaó<;o—=D·n[^}CÛ†×ûð“;O•3íÌb£‹“¿~¶î³%ö¶ÌÖªº²¨ëÅyé²Õ@·–¿/<¾x1P® Ãëí:¾±B{(áòÚ­ò³nȬƒŒŒ3®è­1¶}ÿìhû+ðü~À©»þò&½<Úæxáºvý¹«„­¶ôUvÙöihpò]©[ãÌ^v\ñ©¸ê:ö‹r´[j=g\­ë7æqOF:Ÿk±mlÒy™|óV@ãWPÝx<œžÙžþÛ‘î›!rõF\C ǰ]9p7 4z“O Í­[éÊùÂ%j3¶oÞwÛÒÅj»[ý&ì ¢Â†X·›·Ôf™ºÂgl#´ü;)hÎßüÓ?>?×fûižk®ö‚žŸŒ¥ÐPsv‰±L²ÈŠ(ô9y+ýÃÇ©‰tŸ¾ûTkDÄÇÝîðùÉõ—å›o>8uˆzø¼TÆãlÏÏK©¹,å»ïŸ|7Í»iÿ¸ÿü?þ÷ãåXbJžUòœÔLÿ¼OBEJiž˜ó¢P©ˆèçÈM–:ºÖá–­ˆFÿo¨Á¥‚žCDô =Jí¬ÿ&X·AÕh?ÍÃÞÖ!ÄÜ¥ÿÌ^ThÖÔ˜ÉFÒhÿÜbLÁæm'ÊÒ0öÚ 3,GD“Þš:Áš_¾ÂlŒþhnžÙÎô¯HS'q;G”N2;M35@J}¶i”³ŽßAíæây@!럺C9|H“Él£K Yì«ÀÔ+íþ)¹G s† –gDÀR«ô@T•ŠidH†°!Ü«C]Ntµ!˜–¶½å›‡zPËmJ¿èù’fZ0Çã#X @"r`  òS¦\ ˆ¹– #àr1*` áP(©Xª&>ƒÍÔ Ø T€ÎF+ b2T£ˆ2D°B vˆD2š»ßáÄ+DË5h’‹1¬Ñ'•ÈÒŒ)X ªŠ0LL!Š”ªfcrOTgr‚ÍÓJÄl±Ò0ÕÄ:Qˆ8‰ ­'@”EÜiä>B®"PM.Öç´Ûíñô<#–I­•ƒdƒšÄG…š¢ýãAݦ4o )ëÑ5ßJhèõ­¨(”Œ’á†y×#µ­%âZ´iê7uK¬í=+Þ{Pê‚9õçA^˜&ÑQ*£€€¹]Bo¼4L»–!Œinxhê@0s{¬.ÇZí”Ù ;Z¥ÇÔ!áÖ~Óõ–Ú •H(Ë)È-^ØÁ©wöh ÉTÁ_ÿÑç®vx«bܱ?ÞÝ÷í×[WèEç6 0ȃÂÔ^ÄF+Šê˜‰h;­Ÿ`*P‚·ÂC ¬Ý°Þ+v#†dͰӲHoÅ5p˜ƒHæ‰SÕbAŽ„²†•'F5î=ÍÆ´Kîûùá§“ÍÙ s2͹V0¤òiQ(æ‰Îjì\£ä(*‰°)1O Wm!4á°¾}ñ®Ýì?žÁ1Z!$ µD-uüS"×ÕdêSú›¿ûÏó~~üå7Û8N»€ž-¾î8¹1ì_¬ŸÉMÓâµùçrU²‰^÷°QBÜ´hº½(Ò莚r޽£)\o~Õ œh¥ká@·—‚¯aˆ_þÛkUñ-"ã ãníÃ{\´ŸŽõ>o‡õôÞXM¿ÎðçòEŽèVxA¼>KÚÀª$±ã>N˜Ë-‘s¼+AZG­›œþöÕBÔêÕ}3 é&Jå&‡êlc}â¯Þ ²Æk8šíà¿ÃfyÉ‹ý*ëF+sgÝ^·Sps$|™qÎùÑm`È:Y9D¼³A|£Šøª,x}{^œÌWÀ Â×vìqòO²ÇV*܆¼Púbãžo*ϰÒ;|`·ÏÀ5è톶—'ê/ Vù#‚ÎßÜÏ ¯4rŒn|I¸lWº`øOzýÐ2ÿ§y[š±®d§/ Óþ²ÒÚË“ðvªÙÒ~†{97r´W)¥ý/mï¸{¥ëKÝÜ ày&®êÞk½ ÊÞáÆ¼ç!ýF^÷­iã,ïàâTÜ8‚ûXŒ;‰ëÑ­èÍku¯”"^7÷Oø[M½Â&JëK{,·Ñkç—ùÖG»O_ÃÜp” ‰¸#ûŸ«è¼QD9I¾>àn°Ñ¯ê ëVd3©o×{¼¾2ÂÝ ½é´_Wá®%ýíɽh½#Î ë›ìÁ‹îçK{kǶÍóåÚ×§‰®>ùæXèkÄ Îz<×B/—Ú/œÄu««­Ü›/É Yû¥¹è¥©wW%|á´vðÖDöò#ðÆ­úæ¥×vñr#øâÞ¹ÀûßÚ­mžZçQ.:¯i‚6æÿ±oßà;/.g)õ·¿þ'‚F—[F¤4ÍÎ4ûçž§ÝlfÕ`’Mɦ‰d)EÒ‡-G-Ç|ø|Üí’ï&˜æÇ]2ûüÃg'œîÆã²|ÿ~ÞMQŒ”x8,¹”¿øPó§yN÷žìÿëx.a,(Eu!SKLT D^Jƒ*ÔÊ(-ÞSnHj÷zÛHÅ„!yw—·ŒÍhÙ˜vŠÁìi©ódZ¦­7DÓÔFtgcƒø|0pÂä=8·imMäÊÇ.FGAÍGÞ2u)˜õ,\Éû¹w„Ó5m/8lìd—5UOõ+k…ÂÆÛ¸:4 ¨¥gÃÐAuCqUµôè`ð$#iøˆ{Ì/aÖïŠÍ:$zçš{ÜB’ëa¼‚uEž Ó4ÿ@ÉÀí{¤©(#ŒA@Pê UXEä~ü½ZûÓ× %wìOtÛ1= "w.J ¤à*…O ð(D唢Ô&ÆR¦f¤¯”éyÁLì$„–8©cÒ¸ª¡hEÄBd€ÐcåÎ(áY±!¤=i““Ñt]x®µ©»sëê*‡9Q!Ë…!Et*S†$Ôg‚Ð1";§*m礪 ÞëV2A´jT($KCƒ‰Jd@ÍeÄfê@Ójµ@S±°xFXP„ ¨ôiúøÍÇ‚ZMÎûŽKÍ%PiÇci–tšç¥Ríui´WÒGÍ©çf‘Ø-êÊ ~E %LSÇ^EEš»K½9Ù[Ft§Ö=æaý®±Vi©ˆrÊßÎ "0ï”fÔ< ¬¿]+(NIÅóCÇßs·]©;ç¾þÕ'Ób-¢t韩ßÑ¡^ÜjCºá–<Ð@£0ÐJL(K/² ê6û ÐCG¬÷%´ÉCg÷ iã§Qº,þSG˜€&зë>œz/ÚŒG”èÝŠ'Æéùj5#ƒ^<-·Ô´ÓÎù ¦›§â:öàž‚üÏýæ8¹"·Jë­«Ä{.¸›¦¯ ]~k3½<íó9Þ}3_ Äçë7ìjß)©_Ÿ½?jèü« ßëuâÚæ+^v\߀7ËTו•?ަ¯õ4Oøóן¿þüõ篯ðXwc¿O}||ãþÏ_?ÇÅøI‡Æ-ã•Öæm»WÍ­Fýïÿõ¿åC64 à˜ Í÷U?<æ,•ð9íw³C:>Í,&ß'Çäéû%×ÐçOÏ|:~ó—ß‚VŠjàóOŠzi›ÙŠPD‰R£Öš+B%g…™;ÝÓ~þûÿÛÿ}ÕÎú–­ü“—v 7™žù ó㿽SägXdoT¹õö%^üyüç¯?ýÁïö7µ®?³ÁÿüõutíÑþÚ]U?Ýàzà3ø oÕ+¾: hÛpÍàÁK#¾|¾FvŽÖ€^#½•¼Æsâ8“¶ÏüíÿÎÿ·,êo¹ê×!§ºí¿^\DhŽÎ¬××/ô/#QxO‡|«hyj»[Ú¿y¦/Næé³‰äÕé¸,Öñ|ýxú—N]¹7†ì&4öì,®˜‘[åd½ú–w.Ñõà¾Ù±xAÅZUÚ¨uc^^ªÍ÷fCMÁkNW=27Zo\ÏN‹óLžßÓØÚ5ÜçÞmÀ‹žs ”Î.é5icñ¾LüáÛÀü<Ï–¹>ìÕ›LÏn(~QâÃMâØ¼nQ’îÜϺ‰æ¿ÿ+º+¯ßîÐí׸ѳÌÕiÿú}wÖ•ÓÆù©‘äD]ºsAׯü«Xù­h4XrÜÆyoß}øÕy>—œz 6ð35Šßþó?s?ëØ04·i7-Kw÷á°~xžþ0Ó(éaÿ0ÏÇï¿O³Ï1y~:~û«oJD)A7DµdM<{xܧÉò§%€ãá(G?}÷Ý/vi<×òëœMu‰=4í"¢–cŠ ý쨵Àáðh>ìènÃhQ–…Éà†(@£ÜØIàhZ[þ 8¦¹Ó0(C#¢–-kwÀ²ÍûK­¸‰ö‚JðGðécW@HgNQ2jF-ð©‹eXC>Õÿ<Áj€ Ž®†;Â:Чùšm¥  a´4N7ºAž¡!˜ÁÓPð[vh‚9"ÿ,áBÎÍ1¬›H ¡^“P0‡qäO Á­¸ífÀ“æGvï‡Z ÀŠÈð„H¨ËJoª"º OƒO` f$"س€R+`Á8Ó»Ýê+@âÕž Û’™“#¼7säæ0 áðÙÀ¬b°„ªð@ÖÊJ% `""à@.,™¬-`@,,S"KHä¾ÑÏ…z g0·+bÈÂL̤AaÌ”Œ(J†$D{d9CªÒNM¶µRZ•Vš)@&"µ³M-`*¢AnUZr£Y‰šè¡*…(8&’¤UNd„ŠY õA3! áà® jb , *TnpYµ©0LRq„òjM®)%Ê!§Â=‘Ï‹¥]žKÚíPµ2íÓn??~®Ê,ÑRëÏpïÄ*#Ô.÷X‘ÐP+8Zv8ž`?eç=âÛ½sÀÚxL Ÿ{ýÀ&@½j•fÊG6ªUs¤µÖ–5Ý7Ð<ÝíÞhr/­5sºFßÌš×'û6—•¾¡H;ÈG0z}nšáó tå!…L?ˆh%°ál»,ˆV3¨£Q ¶bFK„£ G¿õÊho!ÂY³ÔIvVe¶5ò„ˆFðßÄkíËq8áƈ i·³õ<þD³ m¬yÿÑÂ`ƒþÔ‚=¶]˜uQjÀ<§"QæfAD™%2…©|㻚œnsÚïws§ /*V4ýõ_×PÀDZH`$«>Mµb–±–ç_< ˆ‡R=ÉÌŸ–üq'#Q3€«`mf±Ù¤H¡¨5jÔ\j®Qk”ª ’–RšRš§ÿô¿ýoWÈ’êœza¯vÃ<cêQÔùšøÚÞ¨•£rí;l°wXzËêbåtµ_¿ø¯­+seŸà„”¹÷º·LÝFÝ¾Íæ~{Áù*GèU—óÝuíÅîì,@ø­ÒÒHM¸áJ¾Í̼ÿ¡ø–ÅÿV¦Ù4Öã,ÆYo‰AnqÕx5‘øJz£µÿÕS÷¥ÚÚ+¨ô›Ý_¦å]Ûº77˶Em5^AºkgûIêN¡;÷ÓÚÏkµMóõñÂmu}®p‹Ôtáz~øsÆeºØ¸ÿ™7 ›ï\S¼V~×Åi¹j¤¸Š­K¹ŒÛ&‰ë)•÷¥‚³ãäMDÌ}ô7;îß§f¦¯¥ÿAAçoÞ5/t¹­/]ÁÑߘwÿ¾¹‹Ã² u8?Þ»_Þ>½áô®GÉÕlð~ûà £·"€x¶Ùt:žê9ׯyZCÝÀFëå?_}öð K‡j£Î™÷÷Úì/] / ® ±ö¬?‰×ùo×ʯÞµF/¼{÷Ëeu£uψ¼3‡®Ìlž”Ý×)7&øÁÅõ¢¸|¡^T¸î ù£åõìÂèÞµ¢n©üÛ‰é²br«´¾åÍTgÍkë³êZ¾ ö_ÓíÏëdk5ä²br}6®¥÷“.z¿¡Ë‚t}­´ n¿s<«B¬t›Tpq¨Ô•ö|³RÄëÂÑZ“¹$Ó´5^/Üzâ\¿ÆÖŸæÈÓÎå­OÝ—ŸÛQpµ¯áyŽÂËUÆ›#˜ÛÉëþ‘ÜÛLÝ\ õö»w>WNËæÛ=’ÖÕQã8Ãý /Ï t£>„M·}ËôÕE™áõg̦æHüþ×ÿd†{XÓq¤Ðd^'(Y|?˜¦4çÉé4Õz(Ÿ?}÷Ý/ÓRj*RTÀiL³+Ó’'³”x|>NsÚ'S‰åx¨Ï‡Ç)%èøÃ!Mþí·v̇%ÏÉ—¥xRÔøø˜TrD‘²y‘¢óØ‚ …#+Š(‹1ÃØú;]0ŸÁŽ0¢Ô #Ò4ˆù•Ý&oB³v>÷P\ÑÃÎ ‡˜0{öˆ@,H{à Ó#òåóŸz².‰eAój N@AÚXûÛÃ*ÔéCM33ÕH>Þ¿ï-îÒ;úƒãµ< ú¿ŠæÃïlÚ_û¹j ­$РPE*£L°¢˜¡]x•Š¡Ù-¤}JÓd?, ŽÜÍ)À–R¬ŠSZ–åxÌóãÃîa*%¾ÿtˆcåäû9LjŠÔ/ú”,"Zímš1ùXÉzï×i7/ªjî±Øœ`„–`;ÐQ2J¥ihYÓѵF(÷^–²€Ž|è »;ðGY=7ì ±!€@‹bnGK…º_j'í´aÜ/Q£·¿D…¡ghçe$v8"÷Üò|€B¦©»ãÙj#΄Û½‚¯¨ âØO(FÖwï 7½§ÜêjËOý!i0v˜Æ›šò> ¼«ÿÓŒ¨ˆÃxXÜ{y@#À£Ùâmî»:îÚÌAâíÆ÷ñÜ®íjN£Ñ!Z˜0§ä Êa©3g1Ò”’ùœRšÌÜvɳÕÅ›¦4OiÚyÚ¹OA·@ú뿉}ʹ–uJ1%Ë5¤º›viJǬ@N©zЉš¦t,:Öã~ƒ¹¡¶zfL‹ÍêÂ̶úµ"¢F͵æRs©¥(z&¬§”¦4íæùÃþßý§¸@qk‹˜àF.–µÃè¶!8‚Ò*ýoV‚.l¼µ×iýÐèDp¾y³:sZºèDMä wÑ¥Œ…->ˆ£“‘¼%MjÀ‘/V÷T°ßãÐðWEÉû[‰ífˆoÁœ¹p©X½ÊMß¼L$ß·¾?SønIi÷E Æ:ß\ldy¾¾±=xi˜±ºU.ß92õÅòûe~Å‹›[úxÜ^NM?'B,qé$ÛrQˆ+“;¥ÛóÅÇ[Xn\…kÞt%w õåªÉ6\{{ÿn¿sk¹­toïÁ f×–âõ†RÖ[#(®¶·}¾×ÆÔuë‚ñY»•¢·¥‘›Cîä¼ýø¯W\)¼*ù[$Ì?èü­\Ý ¡¹Zí¡Ã“üŒsÐMeó"PÛ'×ù£G×½¯Ÿª?ÅéýJÜ_fœñï=ð?#€þüõòü5_‹¿¯Ç§ßÿëðÞswc‘ÿ§Ø¦wªÃý‰7)ò½?ùµ‰I|©Pñæ1|ó–ÕݽÅðû_ÿ€çß|zúô”ܦ4•Zóñjúðb)EOgüê;Ÿ§_^<ú<¥ÝœÜ@Z>,ódîɧDš›h0„%¤‡´$ìB6{Éüôtx>'³ü|(ÅvÓ<ùn¿;üúŸŽyfFäz8,)Ó‚" ¬HŪ\RUJˆ©çUJpÂòÓlîþ†ù^Øæ¨%woóÖ 0ABÍð¹cÕâ‚Ç«5Q¥H˜ˆV~øÐ52Ëg˜ºàÞ¤ÿ¼€†´GtÀ®°û4e-ae(Ô¼j:œf›çrÌ¥Ÿ›þŠºàpÀã·ÃAÏnàmI¼–à3ÔàèìÔ# 5ߘÀŠrè<–ƒj#ÕÀØÃBéPt÷q{Ù\Z ±fŽðU”@C3µv„v=H>†ˆ‚B$ƒ;Ò ä#|îE‹šG™¡B¥+€»S{5B@,¨ ¨ J(­ô(p|bÍpª5s°‰ÚTË´àó3±`o°TLÎ9à•!MM´¬¨…¿ L®½¢UŠ ¶ŒbIL.ï±¼t`&ܹ]FÌdˆ…®RšB LN‰U±D °¨î3 ×ae‰RjE" Í-] Kº°%äF4ºä §1É„â¨fT@0¡¨‰l®j–`ôЍ¡páHà²ÚÌYaLKdVˆp£‰Ïß|(RÍ%9&÷5OIž¦§_ò”Ò4éX?ÿpȇü¸›÷ßìvSúî‡g!¦Éh1ÏÓ¼kîñÝÊý•¡AÏo–ÿC"wë­9Ì@A¨@(C÷¯h))½Sª…ú¶šÜ%Fnæu¨Õ&¤=@Ô9º^T Ê÷€ašëP(¬ÞZ¼‡ZA=v%JCnÉMý‡z—€˜1*£#6`=“åÆ.x´Ÿ¯ýlU· ‘µ§ë&ºM6Erþbþ`{f•äÓ.yNõà1ÍôiJ>{J•ä¯þš)‡š2q0ó„TƒY1[ì¦(Ê“kJ•laó<,Å÷ ÉÚdh ¬mXÝk­}žŒ¸RÿKYJ]J-¥5ãù”|J>§ýÇG3û·ÿñï{«ßj’ˆM€~첤”ž/·TþDLáÖ>çšÝ+4äswÏŸ¿þ´7üÓÚ}EÏõÏ|´·”ýw¨{zC»Í ýàË/¦áÿžßJ?Ñ}¡[]ýoþÝ÷Þb·e‘ë"åE!üÁÑ_O÷çÍqÞ<ñ–;þjA° ¾þ{½1*süøj_³S®å'nC¼ÍÒ—Þiëÿ×í{í !w¾ñ¦åæW¹¹¯-(Ú xôE§äìµu3gäÆ1 pë;Xë€}ýüÜG{SoÆp:?N]ýûìx¶/A¼ñÃÞ>û·>ë¶“bã|çm7÷y ËÅ?Ûá=»šÛÕÊó°–Îo=’x•ƒt½­‹³Ã—†9ßПssVXmKkF;n&´¾0Aj}a]u` Þz¿ò,^¯U–uÕ@ò5ŠY|ìM3â)}gw+ªýî|êy×F{t×òž'‚¥rï2ðþ#ðZï¿lÙÄåߌ¬¼_9 ¾ç>?÷¹äzüü¬ZA–ZsλÇ}LS­Q”&ûî»§ÇÏŸß>î?<¤H»ã’kÕÇo¿A”åùhË1?/Çéh`>t1 @jlœ‚4u…1„º ¦‡·U "7+~˜W›… s ¢p|ø¢ ˜cÚŸ²@Û<`@؈E=ŽF?yðdŸ@¡¤@ȇ5Ýmê!ŸtÈ9¾ù\[¥¢ëwfvq·úª“Í·$°–f›0HAiä|¶âþK'õ §áu¡!Å ¢QS¨¢”#Ta»¤Ê“êÊ#)f ¦Ö‚úl%Ó]NšôtÄŽ,£˜CÉH²VP(hE£zˆõ9L$&Ð[¨)U…,H¤‰a(B ™!§ ˆ‚H° 0˜È$9%¡B†d’‹ˆ#b¥^@†d¦ç(¤%ÀH'fv‹Ø$šZqH( §$])UWkõªhnSC•'-·"PI($貪¨¦41€#ÂOÇ;K{سÊN¶äößîûÝñK‰s øí7ߨ.ýão~sx>‚HKÔ¿œì©<<ìŽËq·ÛEUŠ ÙÏ5âB#ú¢ð@šû Š ›;JèCkõÝ7«{CÙ°vMän±§õ³ÕœÚíÙŠväÉ™ÞJ@­ý…£I¥‘ô1(aŽEœX»2¾®Ðb·ìôX2°Œ#´«Þ®­BžF7@)ˆ¼!°TPsÇEî¥Pªg‰·bCjFþ´wé==pÀ‘3HȆDXB- ` ˆÁø²þgßõ‰·õ0ɃŘ< •1;ÙˆMÞ€Œ˜õHÙé©Ö‹kƒl{þ9œ½.ÛÔÜ8M^„e”}zœRbb$Z²ÏJÒóôlÇiš4¡Ê—°ÙEZDJ@”š }šœ@‘}Z°Ÿ"Í‚üPÊÇǘ“Ü@ÖRJ)fƱâ2³V`ßkõ?×R!XJ>¥´KûíþÍßýç-Œ†[ÃîéOoJ7ÛÙϨ +y`ÓyKÞØ{ß#!Ü#¼¾×w^ã‡îˆ×qG•¸°CÞþ©W&x(ã½"ã9€B'\㸠/Ç`¾å]6e’mßµ`ûbxmV¯àÞjÝÚéÞÚÚñöðä„Þ¼Ô«‚ÔÛ«‹±t3AúÇ|Û×mô%rÐ…˜|/WzsÆîÛ±WÝëM±Éo;ûwNò%õFÄô­®——EAmmÖïW3ß®8¾Ð"/k·íâK¢¯T ø£4¯º"^¾pÃÛë?1èü ­!ësGÛ§aÀvJYº}Z´QiÎÍþ7Çç«M÷¦¾µíf ’zõ2}ÙÌyդ‹If½í'#d’é …ÁU‘.•éÄ8O©æ8¹z0ݪGnïÒ³ö)ᦞ¿Î“À9¤[0Ï´]½(yç,~ù®Áâ>›Lo|ÞÓOB:Èþú¹}‡¤®3úÕMuÛÂÊk ŒN<éª4±y7].’7µÝ׈¯«9›6œë†·--›”‚K*ýhsA¼Òé¸6,™³ü÷­X¬³‹vžOp m~¦ ê¾p~;Œ¢²³7×»Oçý„8¿Q;âVG?ç×ã Ey>]èæ’ðÚÎÎ!Äèân»_º<—Ÿó: //Âõ¼p»\üäv¤ñzýÑz·.;åÚ´tõÜ=utžâxþ{§{þÅIz³ÃàY‘``uyÿÝæMéÕ:^›š{{Úé:Þ=¶KTÑK²—­Ó· ÝÃ5§í'¼,œ^7*®%…³Ú·E… ƒˆW¤žö‹C®£.{Ûד±]T]4cnf»˜çõô¬Sí9—÷é;‡OO%—šóoþñŸFaUÕ¡fNš’´›]Šy2xò°þ›O w»$}þí÷ñ<¥)ù™jw"7›EWÿã;´V(ú³¨u„zUÀF i«@DA>vµGWBϬ4vARnî îÚw̹XV^úÌUEÜ·ÚN ‚¨ÃhBV` P„©%’60(X¤"©b PˆÍ½¤èEªÂäÞ„Á«p9…lܸU1ѲX“™ÈPª‡å£%"¤ !9˜¬?QK„é0š¨4ìÕFJaUŠªT4‘A‚Ȱ#Î’„Êp# dh©±›ÃVÅb¿ß—ãÇìiN1ÛRÅRs.“§9øí‡‡Ý~Zj”¼|³KÕùË¿ø#/Ëqÿ°§Õišj¹,²hHŸvŸ¶çZûÝnL ”Œ`zŸàs§äG„´ï¶ý”ûýrBK¨ô’X˜÷š…±m/¶&ÐFÕƒ4t-"÷7å9ÐJn£fV6œ(#±…øÔp^ž:FŸë1úÔÄÑ££–PR»¬ßÊ`ýh£ÏW%÷€î"‚5ºüâ)2JM¸çHÜåHPhoäeƒZŽQ%îL7ôæŽvFŸ„9j$n0Åêpÿ>å–QpÝLMf«Œˆ‘ÊÞÈi£±É Z´j£¢j¶‰n4û¬g“Ò*£ÂÌ9Oӟí¸g÷ Ó­~û/Ž¥ÎΩ„-9Ü[G~®Ú%WManÉ#TsU2ÌS8é3#ÚýÛžÝ5ÂhR c6°üú_Ž9j…à“OûÝ÷üíüûÑ¢³Å®®—˺ãàfk¡Ë*Š«ö†kN’÷l×ÇZåEYº±×…ÚH†º‚Tžªº©BŽsÓ~÷z©¼AXjb®¹>ä•õë õ†W5”;Lž!AŒÝVüÚ|t¾]ÂÞ,qõ"‚yUl×§îÕtc³_\Ë ç+ßõT¯Ë`ÆämZöGºT)Äó•:6Ûå/”ÿîqжô^…ä­¤—÷ºÑqa¿@ò_«ëç<£{nöƒ÷ÆÃÕÕ×4£ß)8iº”bÞȈו:»²ì9­ãí7Ôßx¯3Z÷®òiŽº¨“œCÞ¬+Ü}©o½µö]I÷ò Ö#X¾.o°+Õçj+ÝËû.òão˜÷V׸Í;= þ¡óWsêýO¤­º±¡Ûæçô1·ƒ€ÛËß%Ã×7†ë˲k-åíêÿWªÍÜ•wÚ‡$%{ïUùQ wĽµàÏ_?Á×;× 7–b?_8BÝwPÜ­ä¾éyÿ£ê÷ïòþîáfßpˆ?îs}ÝÆ,²úÓš.€—ú¿^ÚT¼ø··?ffØ8x]’i{ßs&H{þîÓñùPsýôÝoUÒ²€¾}¬QKÈ’ÿÝçý1ï?<ì¦ùpX°,/Ÿjýå‡ÝœìS.Ÿþùûi?MŽý~š&”rÌOǺU¢(èàf­ÖA VXSémh‹ÆB©2àØ]ºMfêÔ ßԼ؅¶:øøc]j¬9÷³ÜÂ9Û=ÐpÕ–:G–±lKFJ¡‚h2pEš0í€@BôlÞõn‘fÔ#ਂ£jrˆðÑÅå#ªbèe6Á§®¾­µæ«míí¬…Ðbl£‚8Õ6š¢×UÈÔMÇz+W^ʪœZg 7‘®{¢Ó¨µðDêhWjµýuð·¡!ê{ã¥CCZmnåžÚDÃ.ó &5žºBµ Ô‰ð‘ŠXÔ@@-˜ZØo*jE.4U"kEƒ€ÂÀ´Š"& µ}‚%Á P`ŠP!URæ‰0ÂÔuÉ8ZB$™¥E8J³NRLL‰Q{g)²µt¡5·, I0JØÑ!†ÝùšÈgôb´«I|0G¨;àÍjÄLÂÅ0#ŠŒ£ÀYB0P™[ ––Ô`ãU IƒéÑ Q£Úa>&ò¹eƒ…=<ì&/‡RJm–ðôa:.ù鏨äÓ>ͦÝlq”™ŒLiƒ)r,EÙG™§,ˆ J U˜|d¨Í3ð:èpïÒö©VÊŽ·ÒÈ@éV}s¨@1R…Ç`ÆèAiÉÀÈFŠ¡Ö~G44? È'È”QÊë[Ü÷¸}JôΆÖõÒ+nàÔ5î^„MH–j|3Å(­F5Ž6惕㿵Ïhð5ž£ ø)²‹þí¦n£ÑñhëS­a…ÚÄËÁÒ &XñéìAP/QO5ÑÖóÑ Þkx}2±-5¡‘Ž N˜dÈ*-³1{¢»O¶ó’h?˜v;$Ï`J ³ÃÓî¯þ휪Bjw›<’E‘?xrÃ4¢Î 0”*À‚á¬É]ŒdJFªV [þ{öïØ§^«ÿ6ùô°{øÅûŸþ¡¥“möôíñM½ ÔðKW¬[ÛO-¯™øíûèÛ%ý˜Ñu£·‚Ï•¸ß¿…'/.ñK­¹nú;ÞI¼ådn•z|í€ßÑÖU_ø†<ÏžýÉÇŒ^;Izãe¼Æ ¿Mþ’‹óZô÷W'¼d)èk ‰ŸO¡¹èøÓ„ο¯\ðrð¨¶A?jV¼ŽÍ¸9¼_ì´û© ×#äzfŽ3[ƒîßxÛž@/ßP[‹íeÅIoMº½…¡ó vü„·µ~âŽÞðo°cÿô2ÿí5çEzl„t_a幘~áæ¿= ò=—A/Ü]z‰&Âk /3w7ðÆ;ñÍWõ'=ú+û½‹Sÿ®Ü¸ž¢‰­AcCäÑÛdc醹æ–Ñæö8;k’å»FÚ5ú~ó|y_Ú¼­/Þä *#ºÁ[zó\qVЫëãnÿf¼÷’ãÉñÎů S7>ÚY»p†/{÷y²ižTáDIÂRêÇÃayø°³R“;wC»_ÚÓóqz˜Ë¯ÿçäšR22´ƒ bJ¥TU–€ÏVë¢ÚnÁª"´Dßè4³ÙͲCwfCT lNŠ•ÚïËYòa“ú«Îýod &Ø ¦”/¨¥Ã…ºwž(‰@t‹q¶¼qxÖîEëý ­ŠBi@Uúœl)µFÓ.-¥ö àÓƒÉ^¼‡ $|¦O(‹L]§!×a—lêd Þ4 º°ˆèÜ|0¢G'ÈaêýF˜¯³c×ì8»k{™¢=qªu?Œ>²mRcõxƴ憪 kÅý¯“Ú±)Â2Ê5w㳄ºŒxÕ€*ò( 0 U´j*d¦á¹b¶QV…=àAÂvBPYZòÝãÏGùxüæûi60 ª,$äšçGÒ ‡ªK%œ¨¥ÛäeÀpÐ׊¼n€¿>Å’uéu•µ.kÝ-¢a÷å‡ÏP†2L¬¶w1p°ÅZì-VžØ¹ºÑ-£–þ°ì‚:a¿¥ç E×ÇkëøQ×è[¡¢Óð[†›F)d<ÝÅí^X3å“AÑ›~T:.©…x·;º5 ¬žurëø,ö “–ÐÛ&(z‡óxŒ5k Æ8Ÿ`g`­]%àÓŽ Y›hõ¬‚ú|”µc!*<ÞŽQm}í†oÑïÉ òQ;ñµËG¥ï™aÎ9Í)MsÚQœ•‚Ûn7sNHÉÍç4‹œþÕ¿G å^³W3&³ –âJ2Éä®ä…Ìv.À«¦ãrüø a$ýÒÝ¥{­Ñ‹§åzèZýŸ÷»‡_|øw÷Ÿ[³[tµY¬Ë†=•/êT¶é;ë2&ѵ?õ¢éðšü%[ý·“‚uŽpkñ§s£´ÞGw¹±×ø´§{9À·4mÂ3‰·…x×—¥7­œ¿ªŽÕ Hw¶ØÒÉêÿcÊ oX¿"x½q<ß*¼yôÚõ~g&Ø—‰:Ã\…â¾<(úÀÍûuGœýð…y/|û…2€î#]κ¼IÜ©q¾½ð²-ì-/ÂM•ó=—C/œmœ:øú”üEóÀ ðå™þO:ÿªŠ¢s¦öõ$z>ÍŸ5·éÝóáÍÌͬì‹óÿrÜ5Œè…Ѿý•›×W;l®G¯è+<_W¤“Bçýiç(žóâüz6K­ž¨È jþvìo(@§Ç/ú:p£cò¾œ¦ÈKT‰V5x«õ^×öƒlq'£kôôá7ǧ³7¿ào«u/]¾ÒE%ðz¦Ó½²áù§¾&²ërU k/öþüƒŸ Ü ÃÏjg€¼Û%ÂËz-ucùrbO] w´橱üâ œÃtÞbrºîÛ¶zŸ÷Þ-…¯èĦÙX—¬“†¿™ÏÑcëšé¼ë瘺ëÑý§æ­~dnæCÞ^Ú¯7ÙÙëݦuí0.>àóo¾[žŽÿã¿ýw¿øàÉèæ)y)()ª¹£”¨â”Òd%øüÃa9wSªŸž1%,Ëã/>F)‡ïŸæ_}œö3%¶ŒË\é ä?|ÊûÐäVs}Ê壻O)>l)ÍRÀ>Ìîv|Z|N¾c=æRËÓ!p¬¹J…$åZAÁ"W„lØT«š«üG06çªÝÎïò®z÷¯ÿi:ûŒÓÒDý'CýgÚ}d3l×Ð6¨B,`‚9Ü_»9ÇS·ÁrÍ$h5 lìùæàTä:! V *L]ªkŸŽiÀaà®Kö*݇Û<³4ÐÕáÑ­Á1\Ì žSpÄæ uœzO<&„s‘s” ½ @k;‚†m?N·a¨|:¤<:ø›p Ð)ݦm0‡ 83*Ê‚X´!ž¢¹_h´‚G]zù§F*T¡@]è„5I´å·ë,z¡'1ˆ!ßBª`¥r:…†c™ˆ™\H]fUmÉÒž èÏÎnB‹ç YBm˜{OUÊ £¼(ŽädNÅ dö²¤Ô˜fT´,k†ÔÚb$hwZ¼‡‹;£IU€1n0Ø3‘(¤(Ï•ˆd2FU«Fˆ¡¦©XT&ÇD£êƒ<ÅPƒÊE3X\5²‹bpâü‘š|¿\–²ÔœfOnœ¬P9²M>=ðñÃÜk•äSBº|޼hÞ)Í(„Zíùˆ|Ä”Íù.¨öád ¸ºÙ¿¹ìm ®h³Ä s¤[‡% ¢.`r»#†Öá'â 5ž•¨ùÔÄÓV—-´¶”S= Ýò=~Ü‘3¢ž2 Ú½P¢×Õ8k4 ÷kr‰ÔÞEdvÊþm_Mñƒî¥Ú§¸î‹n§¢iqzÒ÷é®=)6X¡N®d7Úõ?È`êyÈXz3Fy`MéˆÑŸÑ V6 kØxë>Q´õÂL©H©ŸØ©bkº¸mVo­©9+Z=²…‘œ¤%7÷H̦“žÜS²äÎ̪Œ“ðWÍ¥”¥Tc®7Km :J0ÎŒª¬5“†`¦Éó£#›÷¬¹Ï š!Dš$iVJi„=…J.å˜ËRVõÿoÿó?|ó—ßr¤¨k³pj»6Bj·ÞÉrmÄ í–*¬u»Ñw\"î]ìÁ_Þu¿ Ö¸)›¾&N­€n ›Èìs*ñù®îíD– þMzòXgþ(éó–zµZ˜Ïp [äqÓ[‘Ö·Ñî…n-$)Ý l¸\m_Ÿºû›ó\=猑U1ÐXÂö}ÖýÓÀ1õÀŒÖ|S9=ž cNÛÛ¬KôsqífÃõ¿…_/éêÓëåwSÉâõ×;¤¾D^?í<3ŒµïGoõÞÆŒ÷N&_îw~A%¿Ty]«7ýN´Õä(5ð7ïÉïa».¤ÆE‘-üg›TxƒŒõöbçu‚Ö†ð %ôÆI^ÈZ­T¼nu/ß÷’£- ~3ËmÄGž°<ç²P£²ñúNèÝ+v½?Nèüx© ÝízðùHÄê'Oé†ï+[süI’.;.N× ·ÆË•Ñ·wܻž¬DzþX¼œˆ.Žj|…ôŽÒð‹!À[Uö-((ùr#ÓOZÊúòý¤ïýÕês/þ•¾ÖáojAç áž×K%w˜)üjçu%ËÝ^©ß0¬v’›¯¯/îàÏ2r¿Æðxéõò˜¢NíõlyzÜmœ;o\ã½X]½(\\/ßoÍC<•q6qÈ/üÒÍÈóSæåµ/¾àü¯òל+xi͸‘qç#Ÿj‹ú±‡z*ì`#VãëZãøôÛï—§ãçß~÷ðáÁ燽wL8¢hÞÏNîæÝÃ|üá)r)»…þ¸£AËÄý.-Ÿ5çOß}:,EâB»¶ç}(‰Öµ°fæufxíÈŽfG¨–* Í=æ5†“½_ÕÔûŒST+~„àiª5*ÂM4¨tlO°Ô9øæ¨†R±,° t„  )Y­a0YôtSG)'}Ó æ(uÔ%Õ«,(óFdÒg-ÁlðC8äÈèÜ!ªÓŠlÂdƒœn˜¾£Ñ’#&ÔAQí4ðê2’– T;©]>µÔҬĪ…JÂ_é-MZ tŒÏÔÕH8ñÆB߀… A8†(”‘¥“yì9¾HF+RK%5¸M’¤ŠVY¡‡DT"ÈM`ÔT˜ŒÖj bQ˜q2ÏŠdÝ–íÎó21YSb}héôÖ#…K’ÌL°1A© œT+jO¦Q5‰Ñ‹IÎQ p!Ž«¬SXµÚ Äô™vL{ovø‡†±š ³Òd<&²êôKÉö»Âúáã~Þ%3漘Éi2UU„×RÌkV„ò.¥6ö2j>±hAÞ ž`s‹ô‚MðÝèDáæ2¨ªíÈßeøqkJ¥­ñøheM …ˆ¢8‘šýÿRý? <\{§6þ+ÞJ/{ÓJZ÷ÿSבW¼£ÏØ×]®?ÁÞïÅX^I|ƒf½5Õlvg¿§Ûãý1‘Â÷wU?‡‹öÔðI£÷>ÃWíxã%Û(Yº¿a×ßüù.Çɵ‘+ñjÀÏqx:wXëæü곬‚Û×ãÕ€×âk|C8ùk„oúõ•@ÿ#:.¾ùŽ€/ÂÏýy·ïŸ?èü›9 ×5€Í„¡ó'û©àMx»/~Ø]ô¼Zxw]ðµÀuõñ^à]O†ô…ú£Þ sù}þ:?coİý|bÝO´|yâæÿ]t|Ý'(_˜Åyû¿Õ7w?rÀ/8ƒ¯þÖâÃO\4{£ ¬ÕFu Ÿ½Wx…üsÿskû̼9¿îŽôò mÊçÝ ·¬d¦ú3Ì4_w‘ñÒî¼»§œo½ì¸ {ãïŒVµiOèÞ‰´fïþ¾àŸŸö»ù»þîó?ÿ¶ÑЧÝäSJó4ïæˆZr~üf—Ì¥p£ 1;çZ¦ “~û?ûÃÓñ_þ_þªFüö‡ç~ÜÍónš&‹\—§e?p*JLFÖPÀJùvž=jqÓRµBñôüôý“}|X>ý3i¦¿˜}Þå–|(ǧcØ!ʱæj íP* CNVU5wyÏꈼ z[‡5µ+}ìêN¡é±º}ëKM(Gh”­0z-ÁgxêÙ›f-쥜Ý\íM›|¦zªO¬  ªS |F¬§0Û&À5«ÙêÓÔ!B1bH{ ¡p~0ßÍu‰å)CáÓn‚É`†ˆŠ’ac0Í=é´ ‹6Á5¢†›Iæ„H‹<¦dµD ÐÊâ@Ïêl@Œ€å5a¥0™wïp–úÇé$z/Š´Z‹Ï°47’€ÑSŠÂr,´ªµb $Ɉ@,@5’ø&—8 "㘕Â(9dQBʦ»‚R‹9Pn¥ 2¤C=!`&>àS(qµ2·†„–‘ÌÒÝUlQNÖ $yªQ«äd&¢°feÀÉDK¡ %@2£œ†&¸V& ¥¾çÐæ¦UU)`6KQ…©Yú(’Yµ(¤ gDDÈiPx µ¬Œ rÆLUB`j:/U+ŒäNS0 D¯{º!¼“q™öx³4ïv>yF6Oœ4[’OfÂÖÈPa)ª$È-ååyN0ϵ}½¢ °y §«  p¢öhY .L#½6zÉ %#€òTËAQeµ BB!á]"¯cö¨ˆŠ2’r·wh)£u}|ØèOPf$ƒM§ÆÉ6òÍG/N›+Vzž‡ HךkÝfƒ–þí µ¢ŽÔß^¶t¸ºY¾®ÖdÓaG#êÉ”z§Kë3ÐèKXoÒ("ÀÁèx1÷ÎejØ´jpô©5bä{§Nï1‚@UWá¶#–ƒH¨ôGi‹iv7˜#ˆZáè×T ¼U©ÌÝÝÓĹ: JJÉfËÁjpù;?¡"8Í–þíÿ5¹[®0ÃÄIá“[ëÔH®”*­•ã­²ËýÕ ²_ˆ4º™ÌD­Q«™Tãþ×PDÍ¥–Zs©K‰@Sÿÿþ›¿üv ^ìŸ#7hÜÿ¯°´ÐÖËDܦX’ç»è[õ7ÔÞ¡gÝ_ ¾ý37{ðºz°¡†T¢ŸK׫fØ”š‹À»œóŸçϹ,}ÅÒòúð nðã¥òmAâ-ƒóž¤¼ñc‰×›^ï9?QìöçÖ:ÁèÃçæ ù99òo¼‚çz]}Cà'.yݬÝ>øËë{Ÿâ…ÀŸ&toîfë3Þ/yù ÜVºÞrš®=þ÷ŽçºéåJƽ*ΫYå7oŸ{§hûX¼Ù›rÑÏwó¶ÿ™6K‚3}²E0Ÿ'o°ö$’·D×ñá/h·ÅÖst{).;;Ïbí ½=øtyc¸œOL—ÓÕí2ƒpÅѶÈyñ÷ZAr¼~Ë¿9kÜÈá·ê›ñÐqA:¿íN­«kîª-¯¸ÛmJxÉþw§´q+²Ï¯oÆ´‰Û‹Ç `g›=ž²åNk0nÆßk+[Ó÷Õ^‹—ƒl Ý-Äõ5Ë‹MÚµe@—Ý6gg{ýDÔiçÄèõ4jœžSW6ÕæP¸A³ž*À§¬«9lÝPDÅîýÇÒjÆå•ÑyŸÿxs“õòx…RòÏÿüÝ÷ÿü›$˜{i7ÉF’ÇçcÉÙ?>Ô¨±ä§OÏîöñq—~‘J.5/ØMûýdžvÓwÏGÔøøñáã/> ÂÌJYvszxÜ)çe9îg÷ª¥Ôå‡çTD€³*áÉ ºåæ8üFA=ùs®*°JV°žËÓâRR0ѕɢáq88Á›$»¶K{µKWÍpZ똭/ecdW¶Æ¿ö Ü;¸?F+ŠÂ€Á½ Ö> X¡.Ûõ ÝÉk4ŸÎn«ŽÅTÀ¨È35Xyï 8uÂ~Yº~Þu°O–ætš nŽéa¶îj”RrU›û*èâ1€$U wô¿ï€æÖo‘¤Ÿm7%:<Y²I–£¹ØiÑÍà ,,¸F˜ Ó¨R4¡¶íŽÚNŽª#®@0‡'˜£ ¥öøÓX`Ú5•P2NsÚíë¡DQΊ"P ÔŒš{Ìj«C”Œr„'ÈK¯u¹vpNjpš öeunIX³Aa!ž=YCK´¸^€8ªÁ y„µ§Å@ކ¬ÂDB(1mæT˜dk>idTUF23@f’BÕD§c©jüÄHd†2b2™” „)”:½ œí]˜n°Ê Cµ†";&Ð31Ì  4jrÁ¬ZìijmVÛ8N1'@NÊ À’PÈe5A,Çt#eÆ”ÈuÁ‘„[J«j°0)ÉÉ*-ñÙ fª5[ª F¥`JɼԊZP ЊRBÕÈ05¤„4÷|Ž&XŸ¢k s¤Öõ@¨eDR µ@ù‘Á¦ÐÛxޒ޶ɳ#€†ßŸ¥v6W_ûŒ5¡ŸHå- $#@„oZ¸iVè?Bìû)mBƒûyOn·›±•/ëÝïßrwÝP„2@^žóAÞQR/š²Å†§QQ0¤Ôa_1š$lèþíØ:C)zÙ/ϧ•Újé%Žs.˜Ú'Õ)˜[Qn©]˜¶6Lf´d“ ‰æœ§OŽTa„s2fUš0Ãá)þ忱_=΢j”df&¢˜,¡pÇl€U0Äh‡/ˆV*M¤­ÊXk9Ñx¤¢ÖÒuÿ\r‰R#‚à¿þÛÿðñáã_üò5¶õ%lQG:í!//%J:ARtj²Ø.FNK—–w¦Õ&|£ð¢CçÞÊp³<¾$pj¥ñdnfF†ˆË€‚›ˆ@t¥+ÝÙW®P¯*`¯©u¼¥ ^l}x‹r•í¤‹}±¶ÊÁµ)öüƒp»>ÝÈ©7rõöçÇd¿ÝÙDë$¦‹£Ð|*¾Œ¥ùÖŸvN†Ñ¯¿íÍ.Ü“­êJ“º¿(Ķ„óv½ïü-xÓÊ¥«mþì†XÀS(ô±{§§/¨}±¬ÿIü¦Î»-Ÿëg{£-Xì4t4¤–‹Ý÷üúëö>ë5õ¶2z]ƒmùâ¯V™uƒÕyi÷ÇŠˆ?¦°Á3X­Þrÿv=ht”_àË.j¬‚ò•ÂíMyÁQ¿7Tþø óy [òDˆßŒmPj»ù“î·A4÷ûAëcæÎIûñyË_¥àåbϽS+¯àT÷hKX;+o>§×€Wbx¯ñò4ð^k¼¶ŸMø²ôf½©LÌ÷½Ü×í¸MÒ 4ì7¼(ßò¦|ÓÁé?{Yfxñ^=o‰ß;tv’ÏccO·Ìyw‘~_:úÃæ¼ïü±çä-}»gè¼,xÖ8½é°þ?¼)ôþÒóu€®n)ÞË#æyÉãF/Áé©£màïæEuo›ò®uÇuÍïö¬úîÓóúqÕ@Þ¸ÁI…wWM|á)ñê§úÑFn¶±+ L§*I"BKÎßýÓo~óÏ¿ñˆ‘Rš¦dóäS ¶^=~| …úôݧ(5j}|LË’<wùáÃ>-Ád¾Ù+¥ÃçãÓ§§4ÙããÞÜ€¨9c)S®:.™˜j­FäÏËósÙÿâq.U¹.?üÅŒHÉåªZë!?kY¤P@…èH¹¶\wÎtÔå$ÕùÔEÿoÝhc”z Ò†w¹ôÆ}Ým¼6ŒÃ‚M^a¡µî«íòVêè Ô ˆÿÛå¹FûÀR@C |RéÝ8oƒ*Þq>ÓÌz¿‘'óÙD3E¨a¿ i×ü¦Y Yp’*¬ŽÖtË|Y€†A·n޶‘j¨¹ÃðÄ]ÚQžËqYª LHJ K9n6û|Ô ›Žó2¸Ã'ÀN$O=.¸O¥­$@ˆ(Ôeøî¨G`‚Íà„”Ì‰ ybñÆÚ‡Êx$4êºP–UšŸ¥³Å[?‡FÀÎLø 8j˜¤ÊVjr¥:˜$À³°w ¤w$ÏÂ爫 ªcÒ¡€Â¤*!n6 ¢MfˆDQ,P4~?d¦íš7Œ ºåˆ*¥f"Ë W$‚4ƒ@N’›`0ܨ†TiÉÍÚY1ÉÌ\QTdŽ¥Fið£!š6„#Ár¢ÑšË¼ÈÂ\“ÒÔ:*᠉˜"µ5j6×¼pæn~ðÙX—ƒ¦yŸæFÕ¥–Å“ûìª%2«Â½ú4;ÌÍ2Jð4?–r–FJû9?-5b—lÞí>}_:¼k\fýŽ+={@£œÐ"I,> †¨=ícžzr,½0ÐKvŠ&V‚¥1YÌNª°d„ÀCÌ®i–§¨4$›½: Ð-¢Zp¦Ç„CÑü/ÿÍ æçS:D…ùô05ÓUug …г©ÿµ‡\ZÔ.Jj Œý|D«q0jyÉQJ-Q—\kmþ¿þ÷7?ì>þÅ/ÏÏbGÈA/í=ß¼õâÎô$sãIÎÅóÖJ_«µÿ•ϸJ07-„´è áa#@¼Ðð³}½‡½~ŒsE£ý'#V/ÐÃ~±Lñ;ùzy,¾ª]\tèí{Ž»‹æ7t\ |çÊï¶²¡wBðqS0Ò»–ýï¹Ý6Ùgy¡øySUñjÀø‘ûêá5µgy‘ï<]ùLyya®'QÜèï¿ì[ôÖG÷ú9.Ûš~Ð¥ëcÿ1ŸâO:¿€=ojÕ®;®DÐ7”¶^´X_ëÁ·Þ‹¾òŒø1÷NúC<oE©ü~ÿ‰¯ ýäGÎ7_ŸúHtí¸w{s0éy£@øûºöãèųŒ»»³ëF¤–Ðó󃋫¬û á[ÛH]æÿüpÍø#‡,ß7¾×òóÞÖ€M/P·U­†Êïøü͇ÇÏ¿ùîŸþÏT…L ‹†’8MT”\ž‡9¥i—ösâáÓÓá‡j±”:{-ñùÓAÀ~¿UJ|>ÖR±›'7=>îvsú°ÿè„“uŸ|7ÅrÐ!Ó<‹õpôKù(ái©öñôß±3&)L â˜sÎÊ b‰|¤ª1J­I²¹éáÕ»³«rZ‰Þh*ùàÏ »n± >w}‚͈‚ª®ïküƒÖ­@>YJ>Ïé°£†ÏúW hç½A·ÅN£VÁ'£fx…l$ˆ œàÑÃg»`¨Ö&©»«# R‚¹Û4IÝ,Ñ&r2Û!S¨""¢ˆ¤E4 c &]kÀ> "GôoÇ' ö Nw$O»Ý|ÌËRªar3z…UТ†!zñXƒÕyo³.ñ©w*t–HA 3€zóAë6h?ÐáMÚ#¹Ÿäž‰j±ä§åsŽ TµÖЇ°ª!QPDî©°Qú iô¡Þ#bM²$3ª(“S"PÉ`‘Ð"(è)"Ñ&À¤£47æ·@ÄNmÕŽ‰L€-¸a‚9{á&«õ–P#<¯HÕÌB&,I'Š4€‰$T)Ñ@d" ¦`oŽ €D˜D!€‰¢,IÙip7XŠÂ鈆92THB“*ƒ‹±À‹Š(d¢”¤êA3O‘¢V+e:´1„OÎBtÓöPüˆš9÷¿Øûó¾[x˜¦= ÊT"ŽÅkšÒ/Ò7…ñ„¬¨‰V!«e9’à” Š«t§Õ€¹© ö¾C¦ÅÖÚÕäíŽéC×Ó‰c@ئ)lBÚDÉCSV×¾£ ¿ìŽÁÓðúQÁè5¿æ@îO¨›˜ëƨiÉ­Ђš­+·!¦>qÙ8ª¹&¥v¤X+4üW'n :PmÈ~ƒ¡—îZ´o_ºõZǘú€PÅñˆ4:«0ê€C¬×é)¢³$°%œ7âDeÇ+5$Q›áÃìï#Á8Î^¨Í«½õÊê•¶®þl Ç2­´Àmë°&#à½í€’D3:épÌ2aç¶Ÿ÷Üíƒþt(¥ÀdNó„R…ÊóñaWËáÓòñ‘¥@걤 Ð$Àr„˜'Z……ZßuÞ¢É×¥žú4¤-"š²^"—%×\ùGµ†Á“ÿÍßý§y7?þò›“Ÿ¹-mëYÐO±‹Ð ÿƒSßàíØ]ßïjaxæà;—ë–ò»”½oÉM«ýUŠõÍ5禥@?zíû»c{+>û+¼ÑÍÀµ˜Ï¯z{â'`‰^x| ÿg½ÄW…–ŸDEº,ÜR¯\›Â÷Û‘5°wâåzKºìßò|Ðù¯"óœÓwœ„ó3ÉÍ8¿ÝÍsy³\õ1l $7/ÇëC×çöâõïu\7ýl]9• ¯ +ša+–žÏǧtòÓØM[ Ï%¢ç¢õn|°û×èMä(®iy½Ô9'iœ)äl*ð<Óù†’ÃUêø-5›>V‹£›™Wož)yª]þΛén fn¬äºÀ"‰×®çÛZ¡67ÊöìÿêÖ5~©žK›O¥{òìí.ßµoxmìÕ¦è¢"°âqÈS˜øÕiêËJ½eœå—Þr•·Ô5u‡ÒÕ‚ Â<™{îô9_÷Jß;E8ñúuÖZ}£çe„û®>¯ÍÁ‘ðÔ•}ÖXw=j.á?/­_·pÕWÅfòÔDÃów>ÅÊñlXðÕjO­gçw-ïÝ|!Š€g¤'}á#ò^Û©%v{ÎO 1Û*4Û¾Þxœ^>·pÎ<Û ²N«„›½í÷&Óã+³oµñìÞ<5AŸM&º˜Ò¤uJ=%Ns)ùéùð›ÿþ?ž¾ûüü|ØïfŸç€|7Åœ@í’r-ÒÞ§ãáùø$'Ê1/χœ3!ŸiN;;Ÿ<ù¯ÿñ·!îv;-Ïiæ~·{Øïˆ` åRj`¢RR >mž|N\ªTÊœ˜%I˲ À}-?ÔðâI–"?çšÕ"„!& :]Vim½b=š ašQJîXB‰“¯ …ñ4ÆmBY,[ˆÒùÝ63&Ô…ÅI£ 1Ò‰)Î{÷i‚’àÀDN@2sÈ «Í gU¥ød¡g1PªÑ\ÿÇàÐä6tùV~€Ùô-DQ9æ¬Ê‡éáXÇò¼K‰°Ìhf4 Íò®ÞL Âýï¨qÀ‰µa¢Ôvm†ŠÇi¨ï{S Jh‘Z&àpŒeÄXT”#°:B刚{£©±-B͵kp‡9 X+§œµp¢,ÌE`«–@á¢QOB@N[€£ä]`åQx´F'@#¬¹dC4:= ¢Z·FH!%2€ d ûʬˆZÈk‡L1Þ#ˆf÷Zd‘pÂaY%h 1>ÍŠ‚t€äD@jÍ#E8’é°Š¨ªÉP’vRuD2ºy5¯V¼r"ƒpx¥ &2f9ˆ‚]ñeÏQ#Éón÷°{бˆz˜~•—OÏñ‹lžƒŠ¨-Ò5R¦ï, Ê(ˆŒ@Ï×5GÊ'1½3²†~ZG¿‰4þª×·´€AräÐÁÛœÑD^3h,µJÀÒ@ YÛh’z+!Ä(Lr´wõÜòuaÝã_ÕKqí,µ§^Œž‘Ý‚µñic«-!6=-˜½ù@’á´€ 6¡”%Ò>x›O4²¾;…i|§¯½÷[€ý4ƒ'p†“)œ®‚Œ“‘3§‰:¦Y;Àª™¥©Î;í÷^4OݦäS:¤Zö¶ÿ›€Q¥ÔR9Qó”j-Üï|— hVZcþÔ‘í¡·Ðë¶³DA»í#jºä’kÍYÑûÑ|Nÿî?ÿý7ñíJ”ìõzÃëòlkq3§I›åε«|³¯8Çöïtsʺû¼pÂè ©ª¶ >¥Î‰/fov8º…Aá …‰Ž÷sø ¯7]+Ýè yjô»4õÜÕ"Îè“\Û¤ñº]èògÖN®»î±-ºXékÅž:¶×k÷hÔº…"]¾×E«ëÅ!¿\Ù¢‚ø†ow~õ²÷åžq@gÕÇK©hÇ[Ìfcv>x„Áã²à=AmI^¥É» ‘s9ìòžçyބޫ`ŠsÂè›´ÌuCqñѯ½Ò<=[€Ü¦7°’¾Xpç '6åÈk]ÿZ𤠶×#nGeÜûº}xƒ·Å W}{·^Õ'^Ñ4ï]™kQðÞ]¶5tO†ÓFLÒ™µózÖ»¡×P\WçüvÁ•/T]Vcû«CåO:ÿ*b¨.H#Â÷€Er k_žµn¾Ô —2™ïu0\Ì{_±2t³$sQú1õ¶ô²ì¬‹gÙ $‰^SÕ6ÓÌkˇkŽ·”Ý+%ù…úлe··bm¸­N¼ú¹Äá5×þæd¯7ÜMv¡^ø0w"‘®Âî¬etS×Ý,·sç«WøÁÿ-X(ðß:‡ˆÝb. ` /j0¸sÞ¨áleõÛ,£ öÌíóË—²æG74tŸms!_õÍ¡³yqûp¼Ø÷è’ýBWh”/îê¾bà(®|a;â—€uvMίÏq~w$è³ÉúF_êËÏÜHï¸<9­Û„/ŒÍ ñÍ~³ÏÙªû×›{¼°³éUáæo5N÷ååâ)láœúzkìÞ[‹½H¼Þå] p•DÚÑÒ¾ÿ§_ë°ÙÃ>•šM¶Ûí¾ù0ýðô¹Ö£èfîiJK96ùo?=<ççPzM¢S¹£ÅØ"Í!Òõý¡£Må]»CÖŸS‹µ4·Iòz m6ßÁdfN&X¢9j­‘Vë³ò+‘—¼¨™ñmÂn‡r’ÈÈ µÔ¥Œ4a?ï%äzèÖU"ÙlHÇz4sÉÓd»‚ʼn¥Ô Í>Ãz˜¼‹€³•\ZàF‹O(êØ“@w7{ŸB”€Ò¾OC±†&¸à8ªr†*TaäO8>aÿˆy‡OOòŸ3´ô¤Öv»¥¹§ÂPJ¿ÕŽRj驈\-ŠâSÈh%ðD=)2˜ªjOU“£ˆ$ƒ ÌU«u‡u!%í@£ÍŒ"ðýÃí̲”ÉP÷P,;z2E+‘„ƒ¢s ¢&ŸŒJâR‚Q3“Yr”¬²2é@µê!YªABUjäP€‰ìÎxaO/ªƒÉ‰€“5… `Ó„2a÷ÿgïOÛ$I’ë\ð53÷ˆÌª>³ð^‚|.†ä|ºÿÿ§ÌÌ]x‚ ¶FwUe†»™ªÈ™fæn¾EF.Õ]Õè@v!2ÒÃÝU5Ñ#"ï‘7dR…H‡ÉTûÖJqGW MÒ²ÈbLÕ¡öý~Š—É^"Óeøî©óalÇ #Y¾ß½¯m“M¡qdCvÅ8Æ4Úu{+æs Ý-ÆÌÖZ¨V´Šlgƒ%#Üàsÿ†ï²šp[úlN+ð’u«`O„ DŒKÞ(mZ`8Ëëר ¶ —„Ÿ 4ï°Ê¼ë\X ¹á&ߋٴÀ>Û€ÏFm ÇZ¬4'ó5‹pnAÀb½´;äšN˜ÓbnàšõÄ’ àID\Ÿyeó“SsÀré_íªˆyM›Ÿ”Ì`=pB ÖÁ€¬˜í´½;{/×Êa­- sæoVƒÍ—äÇÜ-‘c, ]–t3ss˜ªžîÞw;ë ]²Ãhf…}é SCí‹wÆÚÞÿßþÆ«¢+!í™|êgÃ/.·9Í#Ìê?føÏ%ùçR|*:;WqeFdÖ¦TL5#³…éþïÿæ?õ»ÝÓ÷ï¡\Iè8ä<ŽÅ_ãêÖæãŽs)ÆF¼ŸásšðÒÙ뼕¹”|EÁ#{/„º‚ž_Do§º¿s ÙpS¥ù¦2ɡŠÝ§Þ†kÝÈaòc¸{?7šò60>»,%/º7rn+Oø9ܨÎ{‹4×äIA|[öCš(¯èÛÛ~ß7ìApÿ•zÓWä~€ [~Q·‚ЕÝÚý€/=¡m]ÝmZ+˜¢®K¯×~}B0}›~»®>\sø¸ü }és8;‘\-ê”m»w±Ý»þUðk­ðÍÆ–ŸÑ¦¯ Žíá# ·­÷ïÝÏË‘úuCç_íwÓu¸Í’ñîhß*‹ÍÃåúÕƯñë*+ó¯ôç¯_Ú×—y9üùëW»}u€ö‹Ñ¿þ[Äo÷Fü%\–MÄ{± ŸëZ$!3ûÛÿãÿš^޳¦2o|K×ë;ë|üxœÆ©ocˆv8¼{¿ønè¦iô®ô}÷òqQ§úô´íðáÐï†ÝSï@CîŸûaj(&ï^Ô†bDL‰—ÑÌú©¡¥ºæY2þù¿/Þ±”bªhb"[míMY+VR&Є—šýä¢ÙÑPÔ†Ò!gNÅ2 ,/'d`Ø-íÉë 䩨V‰ˆl}?ô]w‡¨])R>=í` FÍÉ:ìûýaœ°"þ½£R3ÂbÖ;G&¢!*|æùìPÊ2»I¶)[]ƒÉëAºÓcŸÍÑä@+Þš"DЂ‘ Š™È±F¤ÈcmSÚÊ+/Žée©ØIå3ƒÛ „7Ô0™C™š‘âfnÌ4'‘ÅÝ ˜Æˆ2V{/9Ýë‚IbYl&çT g"y7—,¢_õAÈÎ\‘ùÜ#à3Åà&2ÌxŸŠ bRT´Œa,»§2½ÔñÐÕ˜ ˜É*4±óY_S Ñ€fsY½CS›½™™Âqæ¥Ì®±¦—Ô ðý‰Á‚H§\ÀFÎ6‚:z* àôÞ8ej-·`ŽsšÖ“-£IuN½@¤Ù)Ò¼_«¥fÌ…r" ¨ÙÊŒ2Jœ²„ÁèV4+´æ²D0“È• {f8 ²Òê~íMD3DC²‹W@Án°0%³‚„bнbóßÜÔ‡lëÁµ±á3 )ÄÜwå° , ³«]×jT€…Ýtþ]CÌÓ9ÄÖ¾+ž’޲8ú"©1ÒL]Aï.1œ…Þ±£Š£ ˜½wŬs”2t€;Üû®V#ÍsïþoÿŸ4³Ù«° =@Á Ž"(§ Þ’–š3"|ý)<‹¡T¦-bjŠŒÙzž(¥xñÿù?ý§çß|Ïs‹íFñ4ûã…©%ô±©æ·‹¦þ{1t)±4¿]Xû§¼ëøå ¡WkjG?#ôç)ôË>´?fìÊýs…ȯÔÃfsÂÛç/ˆµö3 Íß:ÿË9©«ÛûI÷ã‹6¬Oòì¾(;t·ÛàØçr^õ…|Öç–Ócõó¶¶àœ»Oîªß=CöÍ·'(…Þ !mm$O囤ñe Žcó²ë~N\þËŒE÷2¼çºùØ7Ž~â̺=ó Hj“—Ü< ô©1|nœ¼¹27g»î{>áV´I?kÝLé´å9éªãu­æ=4»nCÄ×­tï/[3nêiîÕCè²ïWk±µ©ú^ŽdCÏY.5ÎôҫÙ)[Ø~èmµÎõb ¯k¤yIiº™?çf½ë§6Gze޼-‹ßšmOöÍ-ÑÆÂò¼ âÅ×mkÕ[çÇÜÍúÉ’$lªÌ±¶m¾eq×M{Çm«÷¹@׫Äe!ÌÕzpýÞ—=8­Ê\[ynr¾É¬k©'¸švw[·îȧOÝd¶uý´¸¬•;¯~<¯#×grÚÍ^Í4È™cÆsãöšê¿Ø®ñ²§üž5óÊìT“²6§Îk¶ÎH‰+c ©Öqj‡>|üáǬB)–¥ã® CO³n臉µfm}ßïöî7ÕÊ”%¼ëö~çµ6/½w]Ëh©Ãqr/?²µa×uûa×w¯Ç‘nV¥Ìœ&£Qî*ŠÉ-iPDþ÷ÿ XæLxoÊÖ¼'$cF#Ž™c¶„gJœ![‰ØÃ;D¢¾,žºðµ ¨#HÄ„Ü 8j…€’`‡©Í ùei:i[ÌÌ ­% îfæãt„Òhî%‘¢Th«ÑèF`Ìc VX4½´l‘¶R–™p¡ï‘Z•w†~O¤E] 6gemöe`­G ‘½/}OödÉ”@ºg¨fUK“jÓØâh^!1²³Eµ‚a”lˆu³=%èðÏÏ=L8dÓÊl<›ÞïÍ•VeîZ !ÙqWv¥÷¦†œi2D$@wfÌü«ü7s…ˆD !èKp6@(¶:'ÏYœD™}•$´¶QÚˆñ#ÝéèŽZ›4×8GC«‹È¡¸€Ye_žÄ,ˆböÀ$µäiBƒš¬§†ÄG© øŽ ñ¼ˆF ÀqqR¥Ðhé´Œ)ÐÌ ì‰$Cúèi½{FH3€]KÎõ4ÈÍœÓs1 ÆYAv×¼ZÎõûMÀÞ—ê43•œMªIƒe  ZÊ$€) ”¦ÀÌædÍl¨pXV ¥™ºÌ¤`“˺Œ”åÒ7b‘ád–Ä®·Î2Æ= þÂVêÔ½d©ßw¿9ê#ò˜nÖuh#ò%»V칤GTâÉž+kmGZ1·h!N‚Æ—±«hÙh’”ˆœ™NªpŽim©é–vð~Y¸½ |þ§…5ó×–NkH +¢jD$ Ô¶ Ã"qt¡Fƒu‹¿ô<©ÝV×nƒrýI.9g"û=Z… -Çf³ÕÇÊü¹XÈu 2ð\~”k´6—çƒ:ÐÉ8/6'Wl…¸ü«oòs£À¼HæÌÑ"rvbà@YU6›yL(ËM7.à€/i×¥mÂ/ 7˜F :lÀl`îa^h¥°¸%©"˜ÃÜX ]±ž^è{)ì8³¢`–Ì„»µbUŠwY?»¡Ç®Ì»dH¥¬‰38AC·Áþð¶¾ý*Fˈ¾ŠTÔˆÑZÖ5¤$饔¡ó®üÍÿú¿ž7ˆëÎàNÇäUó*ïW—è:@˜£¤S }8›®Î5»„”hk Ê…P¦å¿W¼­¹ú¬øvã©3êåb' «½Á+—åD¢8Ëß$¥«›tŠšNâ ôXÉ8·¥¯h¼÷é·ê‰î´^Ò^\žMÓñMñõ¥øÆMÿùM`#Fë$QÜ0™¶¬/LJ<,s^¸4ñYÑÕyÛŒ+]^j8§ÈY›€;v ºJXn÷-¯Ò?Db3î¿f#÷KÊ”6{æÓœHwò—÷ñê'w¡:’DzqçÍ7óüÖ’õ¡=ó»6—‘gS@nU”7V4¿"´Ým8Ø vÛ ¸æueì}‚÷r³)Óf³¶ô è®½2nïæ#¿Ynw»w€d׆Ûs95„ñ@éñ|äA·íÛÙˆì'ñásñ¦Îž{é«óbrQҎ붪 ]éæ~¦M߯'dÜëeø‡Î¿:k ŒGÓv½×]V|ƒ¡üm¦êq€ñî&ÝM ÜÞŽOvÿܾóíüº¬Ým¸Ù.˜¼šï ’d¹l=šªçã&_M•á rÿÝWëâÿãZ¹ø ×I‚+XÅã3|›æ'ÎLžR7ˆ÷ËØƒ78 ×jmß³\pÛÞpñùö:‘‡ëÊ¢þëæ¢.köI§¼= é†ëDñ&vã£#¿ÊläëK¾ì.´rÆÖ ŸëQè­à¤ê^@¦‰7ÖClס‹Ö¶ó0¥ŠyõzríÕñ.]MAžá@šUæuSµ¨v+Ší«ª¾âwßÔø¶6%~—ºŽ*^Ç&¾Ý\by6jƫ۬ۋy/Âí ãÅLØ|wÙ¡yAÃ$®²JF9‚t }÷d°_¦ҕˆèÊP¼©l­f=4€Å:“eD”TX;F›0ϩڥ]†p{”àkøë gÉ3¨.T™Ù2Á†z@D]RŒZÛ‹ãî,ˆc­O/¾(×Za_NÖƒY5Ÿíµ¹d³$¸£ì ÀîyðÏ¿«j/ |•ÅIÏÖ¾sja^Læ¥Þ´8èºÃ}Q„=Q³UùÚZ~[ãÍ÷'0×ÇÖ ;_ ó%÷`{d°´¬é;Ì®ì3@é¥BÄþyYº³åXdK+Ëâ~L|5(=8 ïÑ>Ò;b’F3šÑ­3×`¥S_LC¼Ð‹™›¹›“–-ƒP)ýÓ{Õfc°ï¼+¢)U•S‹÷{¹]†<œKþuþs?²’ZKdf‹Z[Ô–‘³Ù/IþÏÿùÝ_þf‹Ó?ùfq«UÍz_‹ªxQè¡R·Á¶hK[Ãïx®oѰÀ‹ÀOºÚUc->Þ ß+®v,J9oâx¾¾™Ã&ÝÛx^ü™©}kòô`“w¢Y?xýk[FÞ—J/c>\Œ.·h—BÆ–àqªá 1I°ßçú—×I•Ÿ“¸°8AP?Ý(ËÛHúáÈ'î"Åñ§ø _7[¼‡N7‚Ô\ê»Mà”à¸ÇŒyuo¤7ï? “½Vi?%Ýœ@6×ãƒç²·³3Ù›«t¿Q´6Äú{²Ô7Ùo(G¿+Î9œÐa›÷¹{¦·åmzì.þÞÔ[Ô¦××Á/ÖÃ8é]ÛTlMA¶c†K~U—ç·/ðãý×ÿ’ã¹GOÆ›y>¿RøÏÕT}VúÊóú3èÏ__ÿûõ €þŒ*úòÈw³ñàŸ{pÿ5ÝùÍFWÂW¡Fy¶»xSîq I—:*nËžH‡ã”ÇñüŸÿm[éÊ~×[g(Ý\¾ºëûz»Á5M9µ§w»aè•y8Ç/=Ñ=÷»ÁÇqÈé0^Æý»eš±3Û÷^þê»é8Øíûãa<¼Œ}qdÖ±MÇ£7iè’–/ÓÌô˜ fl¿ý[µ–Ld£×Öh)ígŽÑ-rLTµd‘2™¢CÄT¡ ï°ûMÿñ·Óპ¿C®œkÎΕ¹XSzA¡º¢3Â;2Vbx,z+rqûô‚÷ïöŽÇ©EICñ®ïúâ&¨¢õ}¿ïsFÛ•½»'Z‹º÷ý4žv;Z`Èqœ€´Çáý/ȶÈd)°Dןîç©|“Þ˜ÓI#™¢ê1àP’ BNÕ)©F§Ã?¦ŽsÕVðøE}.È-eQÿg%‘-²!µE¯Oï»Â`J3J½ëzh"­ŽÉ^5eé<À$$d,6 ó§´Dg€¡ ÎÅ»u†¡ç\p; ‚¶PcvD˜À† _0“ZƒµªN̦8¦A‹@+ŠŠ˜ «&Asʧ n¢¦ àÌsÏÐ bJUi'#ÐH±"²—‚< :(`'¤ F®äÖ2\»àP dŠÖ‘ælH½[ƒKdH½ÑaIEšrÙu%袨N*æÖ@E"œd"[ª€‘óæ@eÎy)#ç*W”²ÐRéZXÍ“­¤@ BLuN/æE‡Y¦‡‡wöÕ¼XëÈn2'?þ©«MÐË;ºþéc~  ÊÜ÷Ë–€•0fx©†~ØÈl(‰ÎJSkã-œÞJX+[ IÙ“T[².Ã{nz2CéÑ `Úâú`³ß/?f@¿@¢%²ÁÍ  5D"'¨-ŠÿÜTUÛu 2gÌýú“ùSf[oëÖ„„Á:hi@Yr"f²Ö<¤—DñÚãâe±кÍ{ç\‹wç¹°)ó<[ kDCk }NiÌ–ÅXöØ[øØ(_«ø3üçÏ_þúy–Â/›Y·¿¢]íêÜÛíçöo «^k4ûÞî‚ À7ƒÎÿqÏâ¢çÍ'qÕñp7sU3úJÆ[¼ˆÏ×cŠo’Ø(º1þY?ØÒRøHºÍÅn}\ÉM]ñ&òÔåÇéüó­-ûÝØæÞŒý¦ð­Ôç¶2œò“¼õÁ¼AÜ\T|NÖ|›•î_°×º–Êî+Ã[Ýbi.ÿÊ2ël¼½ukQÄÕ*{‰:¹(ðnêýo}J—ï6îß.þ}íÿN;É›êæ//âmëÆ+#ò¦±íÞĽ×ï< ®oïÓM‹ñ†3Wn܃Öß›K´ ÝÑ‹À£òݶ{>~ ~âð¦Ï梫ã¶:†›h}sìZî±iøz ûúãðáêD^WÓ_z@oï‹ÎóD×i•Íný2^YLÛ?›á³~7uý×£í&:ƒy¶oŽÇØÛ Щ½ýÎ]Ðí&o°¿¼©ãÐauò Ü2ŽÖ·‡#Ÿ~ûû¿ÿ1¹¥½sCS†´{Þ O;£bÊ?ü$òÝoÞ¥8Õ6½L]g½w//‡ò¼_&•RÕ¾ÿÍn¿+™z¯/?|@Û•Þ#B-ëÔ •â.Ô-Ç®ë„0Z´šÇ£õE,Ô~÷95(ñT3ǨôÌC4cfB•¨`5}!HG.U´0$ñã?N€Ê€ð²˜FRˆ€Ï¢vC«ÐšP[ô÷\Kh³¯ó¬Êu=HÆCkÒ (X±ÞûT{©9°a4še¶d*á'sð¡ëûcû¸³§ØöÓáP§Z§ô‚Hx‡â COuU§æD›!ø„Ñ`šräL±’”ʶÜ` ­˜B°ÖÆ­ýD|$&›{Ú"AÚ,Áç¦|ØôÚ‚4!á3=É9sÉÍÕ»;„dµEoż ÈÐÜ p„gÙE«)‘Ūj¨JUaëB(̕鬜¡¼ µµ¾87Þêk"G $"ÓÂwÊ€*ÐG  ‚5ÄD¦`Ë…%á8Û0$‘0!“HJBÉLR`¢…²D1ÑÉÄNéPE†P(Û Ó·ÒA‘œmN“`Ò­¥ª¸‹Ì¨D¡M`_JËÁ6›Î`n9 f³[@z²£7e¨9-•½3™¡ìè ž¨»ŽCŸ™Š¦—éð݈l„¥LH¦r&’»Ïù€.ÓÝh>ä‘’aNÜü)Üèc ô&O뇴ÖÊÊ ïEv*Dæ6c”ŽÇ& €èŽmü}+Ó.÷MG@&Cl4¸·÷¡ù£5Š 6µªgkS ¤B•Ñ Y Ù4Oçù±`ë¨.³$˜»4Ü–~tKòÏæì `D‘ wdE›#Ôä´B$Vð¸\©gLÿ\øls?3¢Ê7Ü*Gä¢"[ ‹‘@®ÅöV–¤×lűÐuêò1Þ-8BÍ¥ñZuÑÀºe^,ئ\æ{1ÄÇåqånÍsðràM<àkö8 $lÀ¼†,>ɱnYÊrY¬C tm}’”\¼ÖçÖgÐÿÜKh è`Q÷:Ø-9ë0¯<„` ` ,‘D§âÞ¹õdñ® Úy´7W×)“‚Ó<Íû÷v˜RðHKšYÛy¸F7Á˜R^oÕNÈõ©òÿYýψ“úµE ’ÿî?ü‡~èûýðüßëdæwe¬:[7òÓ5ó7+¸­wÄú[õ†«3äæ-N`K.#hËÜÀ…_î¥|ñ)½·=¾.ŒÀÖɧvmÔ¦âllxbᆆ$é6œÜªW…Ä+¥« ð§·*×û›ožB¸Þ½ÜL!É̶êÂ)Pç‰{ú‰$â’éúÊÅ\ìÒ?5:^Çé\üUÚ€sξgRÐíg­ŽÌàÆpùU—Ñ+žíÝÒ¯+H…΄ × …^kà¾[õ|ý‰¼á‡ÞÕ+·ì¶›a«´½*·½nz¼}Ù7©5¾a5É{ÞÕ+ïâz´íxeÔ=…·#ðnÀ+2ÙÛæÒõΑw:ÄÞ*ØÝ²‹uã}ž2Û‘ A0ÓÚ!y1ŠÞvS.Æùë³à-¯|ûk>)7ÿ óWŸõF)uÛð¹Ú÷éÅfvyä‰Ë+€Ï•:^4}4âÞE{4+_¹ÂW฻GuwxoŸŸåáÈ%t£Ù>ì¹y4÷´aîÝ ¤®a5ÂÕÒñQ Ü3õ¾ëðU•_ä'³ Â' C«3L›·AÉíÉñ„Œ¿}âòe[®÷ÃÜ ïÅDkЩSµᬮC¥÷þuÐõ;?¸:úŒ…þnSÒf=¸cFq)‰_Á(uÝ«¼©âùóŠÕvÞÀèœÜ8âõNðqfàˆ Kèþ*}ÞÝ‹Qt‘ X“0yyš¶4BŸÏc¡«_ Wt²8¸tqÀ–rô S!ÝO7½A¥íîä¢C–÷cÎ+TÑõ“òú¥ºAÙè"éqù4âÝÈo›xº ,ßr²'®'Ïÿ|7%¤-܇§”Àå–‘wV§íÞç}åUNdàó'm; ®ãæëÇ)¯t¬>Œ·¹‡«auë^ÿz½Ž™yøý‡û;e’†¾ëûþi— BCß—R@”aÈ”9ÍÜ©q:hœ¦—–r€c«¥¶i4Ån¿kH•ΞöýT¢“wÖuÁhMµA9ô29Žíã± ÅŸö68k9üóßëEr¡&:ÂÔTkL“ÆÌDc³bCIªeKyÐ2' gø  Ô,ë]5D›Y ‰¬Ë]ò²˜ßš-茥̖@+«Yh¤V…® ò²3eiã!¢õ]v[ÆÓû§ï¿ÿË,yøÝGLY«ö{ì0¾´::Ì{h¶¶¥,ñÅ¥NFy‚lFJ„^:7³ÈPΔ5«ˆ4GjÊ”[éH“?2§ ²Â ËgÙœAˆsÕ?±€wfš‡õ°n‘­C$ЉŒ”…Œôbn½9]ÃT†¡•`mÓc1:L̪C32i0/&.æÊªPI$1%z®–¿æÊùœ}ãÓÙ:€&´#!˜«ÑbB}ALÌŠñ£úÙØê¡d …LÎ,u“JGB‘̆H´¤S6·ƒ@d÷ ƒ«‰*TPá"‡$€Ã"~ªÐ µh/J˜¥4И@*”ìatGƚ娩%´3ë7ÏÌHSÎÕúDP)õ4@ ²Y‰í<ÜÑwÙÔF4…`s‡Là4£Úl!¬„!òL¸ï¬TU#è]f2¥"³ ¤X¬"¼„ubSoŠ^pYfh–*rG Ô¥ÙNž%­•¾îûÝ_´}|œ~;ð©ÏÁ†]¨Õ–Åìš„[æôI•Òi5¾&Fq•tô°„o5I9ƒ VØÏÆàwV6¢Ó‰´ÁÝ Ò’ŒšÐùÏ=†+'ƒ‡~“¸c'z› ¸›´øâzùOÓðGúúú†Œ? Пû¿ÁõÛø¿u<ý1¾^u…à+Ç«ox†üƒŒì/úÝß­œÊ@ÞrÂ|ëþ¾ôÖ•WŸÊ0ýç߀¸¼÷b^§‘¾®—þMMF|<}=—õš§ù9ÓHK²ñµûñåP_Ž ~ø½"AôC‡âýÐyï‡r¾ÛïaÊÐáÃa·ë¾ÿ.LJßýôq(·®÷¬5 ˜ZŸÙ™¿üðÓøÓ‹¶“ hùþûw»}'!£ek“²”œ* Ü:ú¯Ü ífl©¨a1;Òf²µÃÔÆFE¤ƒ„Q(vÊ&¹Ø‹'¥ifYä‚tÏŠˆ¥Ùt®dŸï½K•ý¬‹Í¿¶PA ÈYœñÜòE‰>1CÝÐà½õýi//GÎîû÷ßËÑ^¦}?Z¿ß×àñÃO‡¿ùÍ;·îeü8ŽÓ°ë ºâ¥j4æŒW UH‹Ÿíœ˜õîÙ·Örš™u½—Î{‡,§ © ¬‡²ÈI#ò£ò˜yÈï  x @ ‘¼”E×›Ýn}·TøjVÿmÑ1;ï%¡$;¤Z*; B†`æBDÄÆpOí÷C"³©°S2@µœ{̸xª»  ú\DÌ…Ü¢¥xqe(ÎÓ„‹G±L/˜ pø¢Ò(TdÅØ˜ ©¥èx¦‘€sÖD)‹lBMìÃ)éI@Ø$A0pÊYk\UÐÆ ‚B•:iä’L. CæŽtPF‰£x„¨°ƒôäÞ{#é3ÀgÌ,M˜]Q ,±§'ÈHs2“ûÎiV2­$Aw¸¡$j¤;¬01f÷Á…D¶•ŒLaRZÒÍgê“Ó „› `ÈJÊèšú>÷²<¢–T/UL&/Y„“«kf šKÊ>¬L–Å"y8þö˜•ð§þ/Ì]à·¡ò¸·§¦É@qŠ&Ò’cE^[wÞÆ¨¡1JzxLBKe‹i?K¢pC7“¬Öh=…6§ ôùG –,ל lÓbvÒ¼øÌ`®$‹ÁÌ,¬…àÜ@6 ƒ»XW¸söè‹•¾È庉³å¯œÓþ=:Ç®#sNŠdK7AY|±FÍvóžëýóuîÿ‚ýQFDmËŸJÑÍKÙ¿z÷ßK«³Îšù‚ÓÿL`àÙlnS~üsì±Ïµ?üÒŠß.ÄÇ·€#Ýt\h‚¿È­çmáWÊ—øT”þòõ–? ¬üOòë-“ñJ`ý¢ù«/{ /Ò¢Ÿû¹Û߯#ïè-wv“.¸ìã×ké´_ѽþ@ç¿L:¿è8÷oü*g÷#S‡Wœ¯²#ßðÄ¿"°IAo bäØõùèöM¶µÿz],þ’WýgúúîÁYê‹ßâTÔû–‰¶a€,¾4¯³qþÐä3ä=OÔÖÑ7£§¸XoˆLyq¿O—•Žjm¬Í Ù?¾ øT›¹Ø¸©Q¶, bŒÃ?ümé,²É¨Á5µ¬’KŠ6Mªcä$ÕÖé’e›Â`Y–RNÍ–­ÈÅ%’0«Zeµ£\Kq%P+jÃÖ9‘h HÈÒ >,(ð“}èÖ$`VÍf¡ðÓÐõ+¥÷‚µê~x}7ì>üô±…ÌÚPJù®§CËön·—RxØىhÈ@à†˜Özü™ûsù0AïÍ:É¥.ªÃ!3DÆK =³I• )€D«bÂz¤ÖzÿU¿ËsF·/¾ Î¥ÑÁ;(cÞyÎÔ&‹¹n½ÓEéfÆÕúÁœ]K™,ë–t3ˆÊP’È4–™&¸#­¢”2áŽÞ–t ×ræY¡œ«¼gY³Q˜È –ˆQµl€Aa2‘T¶ì1Ù©„(-±­£ ”Àœr>7¤p„”Hã@´”˜¤ìÉ)•I/Ò¥döf„èÞ=gZ63 RÆN‰È£CiÐ"×ÀPJJÐPb•*´ë¡Éj  4”ìL€%‰ÎtŒì¡‹/€%ÈmO„áe) ‹.5_ûÈRDO ÑZD‘j¤yÉÌ¢|êJÂÄ`% kVy0¹½Ü¥O»Æ}µV2 VLC¤ÃNF'îìùâ#¢eÓˆÖu]ìJó®wt³Xô&y¨8v]a–ä!yhuÊ6øJGÅT«¢¦¢IÚêÍ;ã纊Z h #±d}œkfH(;dÃø³ÓÙKðYúçE»áÂÿñu‰ö_ æië°¹ýÈ! Úb²}÷£®ìþu¿l«…omÈ„ÔX*ßg.{h6ÃX áú™N"BÄ,#Xkí…ÃO0ƒ€w‡•12`öF^=dæ.=@¸A«åïœ5  +«_ÈrÅ¡Ù`6˜—â\×¹¶òhöž–¬çî=¬[Nœkt(ƒ€ Kù’ ¬‰î=«ÙÔ:ôÆCßJÇRÜJÈ1t–ìFP¦)a{7Ij)!ä]ç$`1tI"ƒc¨…z¿Ž2ÏüŸ×à?gìOä"ýO-#yW¼+Ýнû7¿9 ö—³µÔò¢UûnPuQ¬wîY4^@^f2tÛBþˆWqß"}ùÖ êܬÀËÔëÛˆÛlÈ©9ô"TÇÚi­‹š;@oT€×J}×z^=pæüv¥-çoÞ$æmïãæP}FP®›Âö;‡÷³nVWÒíe;æå‹7ð×äkïݬJ_—øùŽšWÅ¿·ëÞ·•io!*·Ÿ~_×»JÉrK„½7Á~~yYÎî“æ¶Âú“ìò›ºu=±ËîåÎ"}ÕÛþY>¼ŸÈ'*·,^ˆ~[Þù}èÖ̓ãíƒêO:ÿʉ¼¢5ž:õ6N”o9’ûx˜Ë\ßrú÷¥§{ëó[z ¶ßlûfîºjßr™> :s9J®œd!.zWe÷âÒ›0W¬Ã-)F×Ü{ðê)‘çç¦ c«Êò î­æ§!Þ[èu5ç.ŸþW±ÂFÐ$?-Ùó2"}EÔ½¦8Þ'ñŸu­¹®Á¢îå=ÎÕ6««Ýu¦òü:Ý;ÆëCÀí‰]^Íó§Þ„ß7F·)Þ—‰×.Ø Õô6Â9‰³%ÙoáDëÜ6ün0n—ƒyÀW±ñ¬•o§îɧ’ÛM¯•\ž‡!Ï£éú–ë•§-/¬ç7s‰+’êÔ­{4χAðÆPX¢S }‹L•®<N׺É_,-t ê2õpƒ¤¹¼×fºoÎwŽ›–Hœ/†2ïÒÿ¹}’½®ÇëÓù™WÖXéÎÜ¿ØFêj~ðNNesÿyïý&ln¬Dx?£y{ Ë¿úáåÀ˜ûÆÏMõ¼·^%Æ$Ý™èÚ<x×åúÑyo½ôò»ÿÏ¿_Fw7ÒÈç§}·ëiäá8ö}‡Bzy÷]ב?þø±3…x¬ ¡6~:ZgÚu¤86–ÂïþⲕyÊuœb’ÓØÂŠ#¢ëJÿÜÙ1µ|ù;ÇCMwa–p,ê¤ÙZæÄ2Bc«•–Ög« +F¶”w!)Úßr);¥¡U° ´ ¥[jÆ‘ ;š€ÍN˜Ž DEél¶Ãœ‹^ç’ó…?kñŽEGnà ehj­6³â¢ÕbŽt¥ß{šüùé]²yÁËtœÆ:øžÈ‡CW,0Ayò˜µ°™³_§Ë•Jp_‡•-•Èkü,ÈÍ@:Ùità‘53J!fxN]>e>£Y¶É3²Ü èKž`®A^Žm®GƬúÑ `™NEzé¼ëZfkÙ¢…ÕîIMIßuÖÑCjhÑ`åxPçpX0’ ÑÝ#Xå¼ÞB&h(|Xê£gú Ÿ—Øz@×êéŠúõ…‰å's‹ƒ%:[Ðÿ1’D)$´ÔçÂW L•´dzP`!Ž'v¢Øœ†ÈFô¹€»¨pi0O02;d‚e}X4*3J¶‘%èݺÆvî$@ìŒ H³C„ƒƒ4#EÌ©rÂÃ`ê44è;²Á2 Ì‚2È$ ¡H4ƒûS„Ø3=)ž¢@fQ•›h™-¥Î­epZBùâùÛZLVLC%­Inl»L! ŽÞ‰ – dABc(B°TÏ.KxºÆñ#‹†òþÙßæÞ¡7+¾‚=‡ª:ìwæÍ~j;[=š)HcF y”&MSDR™¨ Ó\ª/´µ’½l’¨\‰ÿ¾šg› ÷È„˜PP€Dkh#Ô‰&T-TžáïËûts¦a6ÆêJ=¯¶À¬ÎÛ„´g6[h‹^¯•Z§Œµfþf3’Ù X åÚ°º,é_jçmMfÌý|ˆ1ûŸ­!ç²ý5A¢Ë0Ö 2–a΃º "søœÒ0(Wu~m²uGâóo•s N[Z¬æ8Oo‹p‚´Šñˆ}‡n‡$Ñr¶g ïh¤uÌ4!’F#‹wî(E]Û±4ôôbæ%­¤1èI™Ê²ÏHÙbÉéÉóy'@s‡Ë±EßÍøG¥ÎîPtA)lá?x¬þG¨5jDm™I°t¥Û ûïŸÿúoþ3¤ûa o+gx2 ä…w”mšæ@qFˆ-À7ºŽ%7;ôÓÎN—[~n_´lÈ{šÐÖÈŒ—ÖûFIÜÂîÖ…¼Á™^ï}æµZ—û•ÇjÎ-â®õ ïJÙÄã¯3K‰ñî&)r§DF'ðØi«Á7¤]n6‘ë¥ÖåÆáò…g±à¶‚ìÛèÍ<Ðhkù'ŠâY¼$J“oª=¼£(=Þ–àF~½duR….'á«j5¿ py‚_¢à“¼ë”K¾rYÎ O¼Ÿu ÝcšßÓ”ÞD÷~™rçòž‹ØfºK< ùêñ+,ò[„Ë Ñs·`ë–ntWY¾ýá§sY¶üÈ-`{°wÒ±×8¶ûÅþ b}&豞{™âÚP¥©·:ï–ï n0t@ž«‡ÝŠ+ú†Î¿’Ľº¶wßÿ~2:‹[ÀÙl®7ËÑÛÕü7^ÆÏM@ÞÕýïÛ^1>¹;•^G'}ú”׫öõ7Òá Ç{Þyky‚Þò¢Ï.zøãFŸŒÆß>‹õø³R´é©¼Ô >þîÇû{ºRæ­rÿ´ï÷ãËhÏeØwõX/Çþy¨©ÖÚá§l“ ¡ì†AUp–íåй9üߟºÎ]V:szúÉœ07³ÔññŸKññcÅ$½X¦2k*"‘u‚ÆãxÌÖ¢¦Q"P k$@mù!VÂÆÌ‘˜ËoÓ€‚ÞW±^1íª±øZr®:o@¢ï»bej£˜&ËH3¤-D/Ëå4G,0G(ÑÞíw™9§x±¾ï;äIÊa?}üÐyAÒÀ^ `|†—ú±eÍ“‡R.‚cœ°!ZØß3â†s2ÃXœÚ”^‚V³èÌ(Ed»˜&hŽI-e¶³`‡S¦$—+¶`RlzÏ¥ù`Z¬[ªàl¡\ŒÅ” Ø©Caß?<Û ­ë[‹TöÝN,¡È…f&+&ÏiÊh+¶TŠ)™KɳlÞ'ꛋ§eZåÙÐÆ¥9&dC›P_G´2–½ó\ÍNÀ‹r&ˆý s(AH3d–\c¡–v´ DµŠœÍ(w¦B!ækëæ]æ ø4ÚLŸz"'¡3”›Ò“Y%E+D*`ldA4diã˜À»‚˜ŠQáä@sbDˆôTg–R !Ùˆâ0*§`:“Äâå…Q-sn;ÉHK%Ms-àžVˆ15F‚ÒÔj²%Ú•˜&ìspìÒkf&ŒC S ‹>­ƒ#’ð¹80D‚äÇãO°Tq÷"ë+¢+jÓT=½Ûõ»ÒM§éiÿüSü0MÇ.­£“¬2GöìÇvˆÑÐêªé¯êü²äÎÍeáƒQȵ%Hs]y,³Ãˆv€L#¦iAÓäªòŸÞ9×ÅVƒ\·3m˜«ù{o(Ñ^~„ï`=Ph…ÊÞJG3·4áæÅ º/­t,ó®ôCvÅ­˜h‚‘L[>f÷ĺÒE Lܽ|8 ÁýÀ]/Ì¿6«J© ;í";þë*LÚ@ÿÛÔbjÑÚ\á]évýþ»ç¿þ›ÿÌ;ý _6m-FyÙÝxñô×5bBØJ¯íúùH;ý"DÑ}”¹¾ àay¦¤7mL¯‰ùþPˆ–¯ú½áîÔÙÜ+„~CÀÏ~IxÚ¡¼Òð÷Ã_¼?ѧ¬W¶øUÂ7nÊ#ÿ@’Å+ 郀?ʾ¾eþt ì+Êï¼&¿jú|ÑæŽ™Áç*Ákfâ›w|ÍMùùÌWBç¿@×’Ût¬~9üTöôÓ×íž’þ³4É}ýÀÕ±½âñ1tñ+º“ø|ÏÅö³÷«äJ~ÉÂÉ«*`~ù ýÄøÊù’‹Ûº»gªWr_>ϦSK ï•lÿ¢Wké¦Ìû –l|;Ž?É¡úÜç™pY…s½¸H}þ,áü#£6]=qol¢¿(*Ó—\¿Ï]RÏÝ„ü¼OÑç2’KüEGÒg$nê˜6ýðÜüÑÃLÃV<- w~õríÔ£•b³/ßœ5°—Ö'Õú´[Š•—_üûÿë¿?ÛTK)Ý®3/€RùáÃáùýóó÷ï³eéúãÔèVÀ©Uê4aßûóP¦ép8Ôãäíúþcª>|÷þ]vôÌùáǃ‘ì;ßõm¬ ¤Ôí:€V|ú§ÿJºÉÜ»Rœ;r‡¦Pf‘SUmÊ)ãM´*KP©4—%²“‹Ù û´N³,•DÌåóX)«°5Ã|°„6a¡„s‘x3 ÆúRáè¶Û S­Ï ˜›fgG×Y‹Ì†áh/FyŽÓ ·Ù‚Õè‡ñ0Åô´r!?2`?ì_¦Çéc´:ó²)K$ú®3Ö™D[XØV#P3x73@ŒVJß·±bA„$‰FQ:fŒ Ð ¥_’‹Ì· ˜Ó‚м_äÎyÚ™¶(tÖà `4šL’!á8~4/ÍÒA+}:²¡ô;ˆ–L"œ)úç:þxÖ³³–r± s3Ç|FƒuH!& _øì³ÇéLQ Mhêíˆl˜&„–òϹ{ƒ (Žhœ[ $ª‚BK0H!¬(]ÙXÌž±àL/J- øšrÚACÏÆ …²*;ZôDSª¥v$¨1´7€QYåNsS¡»ØÀ@v„;² -ÐÁm'˜8;²À@™$¦Yî©Î-›&ª/DšºYT(LKˆàSS@­‰€‘F©MLIÙl¸»R*عM‘FÖh.šˆ)ÆAJÆ^=,D œ0Wfwf²t™G×\Êæ2P)—µ>ÜŠ`ƒqxçÙšZ?Qƒ¤Ú•]¶ŒœJ·ó´–ù2þ´úþû÷‡ñãáðFL‡Ñ†wn»zøãhfßý›ïz™bÌŸ5¾¨'Š=’ŒÅò:r5˜Åòr€6 mD QBK®ðô ˆÍ;ÏÉ€î„ë1HÈ\Ü;f!·5ÌÝ1¡v;´†týRj N‹0CV$–¡Þ°dŒçÕ`v"™ûWfÇòlËãÊV-~Î^XAVPQ¢Îf‹1ÊYý7‡­ý@¥C7`nšÿÊSÿüãÔú:ϲÅôåj;»ÂΎǧÔã91@ —3OÓ Üa ²ƒ Sf43ïž ÕÙ;Ý^P$+¥3xézõ½àì{«èÂgÕßæg`ÊÊ>û.÷½µÀ±‚V")+mgHduÑâ¶IWËn!¥œvþ£úŸ'ìO›ZF@°RJ_Jß ïöý7ÿùdMùPP?qôÖiIت%ÖúÌ>ƒËœÌ'ÔÍWØç°ŽwdÎËHx[Ä·Véêª~ÿKbòsÀ§ÌÕuÛÿÐÜî'Fð‰º’Ï>q}»Ëó9¥M_$â¾â°úšØpž ß~`¼ò†¿Fìö*LÿIyKðŠKüEBЖ@òe*ó¶à‹Çá[i¾w÷Î|0ã— D·íW [SÌü8ýù¨î¶¾ÿBÆÿ/:ÿ €³ª jnÚçÆÉe‡óüu¡ZÜãöÜ#ˆãì €®ú%B¸è°y¥à.=ìQCÀ7÷à­¾Š+pÇ%LéÔ”£ë™É ,è¾T¨+ì‚ðµ¶îC1¸}ïÍõÜЯNCgÐÆ¶>…פ۠ò<pÅ6º7ÒMr‚¼øÅ[Ùñ+v;º2|¿/Wž1-<)eºÀ„_FY7­à=ð÷Ú-ŒÇ ¼­ñj¶­åÉâIܽ†\bƒ—¹/ÃoºÑ®ž-:Ÿÿ&>ÒejãR=å ²ütš|Ì„×ã'7íÁ·ýμ|2ßk«äåóãRl^ÏïêÂnóÅsíÄæ^½m`ЙÅÊkÛ„›ýÎmêÜ s×ûù®h+øòµÄà"‘ŸÔæ·¥4î¶Už0X·CS…Û€Wú©±i<ÍŽëqñúë_Ü“ÎJ¸p«ƒó~k¯áJ7Êþ ßìfÓJpmn¿Àº3:6éÈ%×C.–ºÉšÎYC›Åå”87Hß9ÅÍ=¿[õ.š­¶þïÿ#¦:¾QúnúH…b÷ôBkÕ ?ýîǧç}Fì÷Oþ‡òÃ"£ï¼~|±hœÚoÞï§h?ýxØCOß=9ELcMbW<j´—§çÝ»áý#]W¦iÊ€¥‘臡ÅH¸,†¾ÿp¨Ë²¾ÁÇÃRG\| )s±½´¥¦ldžpÿ¢–êÚY»_6¡Å)”DÿïS}FYà –ªm­P €椓fs¡ºÛ‚^Ê)h f(Å“¢›3MEcïûý÷9fNuúØB.†Z”“2ef'1t"3*dÖ:çúîLçº~ÔÓˆ†é­"²¡U$àE ²`jÈÙ< —³›,BÎòëDB J(„5xèàDMhbH{3‘MÑR3}]ä d¢”nä!ã÷ Oʺ4.gƒ8AÕIÝü$¢:=‘Ò% —vé‰8P¥äSA'—(ª8R<& $ wyI4N)7t®1aÐ1ðD*©Æt@"d 0£)C‹J—óá¹2+ÊÖ°ëå€ìà‡LvéCGt)Ò„º x“Çk¦ —5˜Ö€C¾ Öð:”½s7åÄÖTSÅPkÛA(]év¾§Ö;ŸüýËñ…ƒ†ٷʘpüûýë4!SEÓIâ¨Ïb@B!¨ qÍ!­Æ³*ËÑ”˜êòVZß-WìÏŠ :ÿ±KF¼ Kê®”ÅÖ„;ZòùNËÝLÇÕ(zE|¿&5ÝãnÏ‚Âf‡{ í7kßMõÐUí½$š®5 õ@/0ëW[•»;œ{¬‰ó nîúú¡›=!?‘Q{D ¹á }Z#Þ"tÂ…îÞìêáåáÝéšæÕ%½WQ{—¥ó¹uÐ[*ÎùDn rï\±{úÑ­6yu wy2·wp‹ººwñ>wðjWþÉ„ë­rúha䆺3w­mMGÉK%p½Œ'´ÐùÏ= Ñ+ÌóÂú 7€öçÇÂj)¤Û™{ÁÌæµôO:ÿÆÃ¸BðÝ}Ÿ«Ñ5›Ï0 eОžÉv‚Ò…l{XOçÅ»^@ká!.ùT_¦¿ß¶¾åIýJn{äzðuçw¼nýßWv|QâCZÿª·æ—1W¾YÀ›ϯ¤ð7i}MÀ—6·ñŠ¨Ï­ øV×îs³ó·t$½åèVú¸>¿ZäuÊÍ·C|ÓAݹézT¨ñ Ø†¯m$n]b±¯™Äg‡}êf¾ò\ù¹âÈÏ=°Û°ûM™¥ÛÕâÿ§à?y‚W_¬GèU¢Ûiñ¾ð½€»møzÜG°YCû?þ~:§c«ãÔíz/Žâ9Õnº}wüáÐ÷Kév½™ïܽ3ób]÷îÝÓn(Ïϻ֙OÇßÿôñåå·Qæƒïh®t³©?{7ŽÇiröƒ7Z‡éïÿ?ŽÂ$e€j-bªV¬격r:´ÇVÇlS›*¬¹7…(šÍžÀ }–U~ãÉ¿×Ð h# x?ÿÅ †X­bÛ "­¤h1Ã<úyçSLnv%Å‹<¼xm͘sYº÷èæÞ Z¢ŒY3Ü ¬¶I )ŠwÓ±î‡òîýwn áØZË̮нEŽ4ìúþX?Öv0,Hù–º/D~$¼Ð 2àŽÒ­`²¦ ¦+ÜÿÉóÓÞۉʹ¤L0GT´ –Ëah oà&µJV  ÖÙÐ?¥P§–Q…Ñ‹Y hÈ t;W¸hìáLÓqŠrD>Ä4U2£!)æTG„”kÙr®‹ÙŠëP²6*„G A"¦D ÄD¡"¡ É2(ƒs‹Ã\² !†ÿÒ‘¤"áÁvnjC@š!SADâ(È€ÐR=Y‰HÂ$$sÌøHé™Ô›=»O‘ƒ±cNtIæì™ (ÍT¯4š d€î`*Á®SqcX&­ä~/¦ÕÙZ©ïS ¢ÊõÔŸi¨ÁÓƒ†BOŠ˜R-Ò2W5SˆvÌü :¿RŠÙ0…æ)`‰VPæZI9ÆÉÒ TÈr€‡†4E³‰i]Ða0ǧÖM–-½t½ve·oÙºRŒ%P¤d¢˜gUm9ÅØ¿ï~úpÇDõõX?~/“Â?þ8އ|9Ôh˜s]ßS=…C¶¦ÙcE·0pbJ–îŸÙƒ7)‰º ýv _ÕQ€›ž€ys!øLÆŸý3r™ƒ™K[@›V¼Ï©Lfž°\R’R8{{í•ÐbèsÆë'8¿y`rÎ’eÐl,<û ÌÅ=;V"м ø\›o¡ß-G;û¨è s¦O«½ÊL:™£Ì—qî QÊr¥‹Ç¢ºhÉ(—¶¤9ó±¤V Þ¡U¨® £*‡=?ü@ë¬ë½³¸[g,n])¥„»yƒûÞ­´— ôýû½ízÒ¼Ág¼QnÍvéD ¹©Î­=‘».†Î3³øÒùdB™¨]²P–JÿÕø÷ZG»(üo-k´Ú²Å ý÷λý°ÿîùßÿ/ÿY¿«íÓýܳú¥µ¶ÜPøï%fÐmýÎ[Ev<¨Ð?k»Wjñ£ðœ8iG_ßð†Z—¯Ý…~"Ê|µàMÕy#ïþÓÛµo¶‡ÿ6ºû;²û·™oãD]SÌ¿]Y(uþ÷$³KUz[٨χý²®Ø/¤àV®}}!{@´¿°¾0û¼I}¾uýtÀ墾EϽõä¿ä®ÿë„ο®k¿) ²é8ˆ-å^¯u<:¯_Î÷¦Æ—7ˆÏB=ºå|ªúÒ€cý\›?›[ßöíPæµE•¼ÅêÅHo¾ê_ׂʋí€>õ üŒÁ¯¸§ßÔs—›$\úÑ®®[›ê›+ÅÿÕûß|únÕnýúZ5ù`*ÛÁ.kä¿I,ñV¼ÏÛ¬^ÙJoz>¶?9÷oék†éšýÑÅÈ#€Ö€øÛ¿kÇúá‡evCÙjë÷;ïKD"ã$·éxT4Ãñå0Nžóðã ²¶Öûyø8þx§Ô_~·Ï©•ãôò!Š«ïŠœ»w{DBôNû®DK þùë¼ÀÌûR†â…-hY…1s:¶:Ž?Úáq̘Sé#¦l“•^¶_KzÞi®c-e¹|³ÉdL‹€ù"Í"ÚŒ¡hÀ¬ûÇl’i$Ø–JK:¤L4ytý>bjQ½§hR¥0%¦<Ð’D›Àë`ë|ˆ§i°ßí£MF e(Åœ9MµëØu¥ëJÍQM((©ò0($s†nKH­ÃEp‚2UGšƒRËemP Sä5îÿ$&²åBç8áþ}äRìŽÌi •iâd!08ͼ”®¢ŽcDiÞ§ŠˆZºÂi†¦ê©ç}7­NS vNoÁT™‚H8ˆW °$3D"¦ÙA²a ÄD5M#‘‚‰ÖXGÌž¨\ºˆÅ ’ °ÕöÒˆ4°+ê#<Á–0h7¢Á„Ž  ИP²B d>*gÇÉì‚\…zIT³1ó 8È(ÆÌX•G¥R}Áž¨3Ö_ìa‚ÉÒè„ HD„:3›A<â¬Ø?¹\SÔ$s†ë˜2¡›»G$AKô„5HÁ 3ì” àfhEª)9è€=‘™»» “ NŒ–™4KM¨Ð i$‘‘¡´ì«‡¥‡:L]›¡„1ô©51ôþÝ{‡)Ô(!BÞu„(DMMìU¤øp¨Ñ\Õ Êîû}~üác«(C7u÷n¿{êÛ/u¬¼”ï±b®O 13…XNe G¡­Ž¾³:@G ÇÜw´ªÞ8¯º\+âç||‰˜–lÖìÄ;M0[œ{Ï}l\°E[Üõ‰Ë¯õtfƒi,}N‰e•0.jûüÑÎ0¢ „¡žKìô] ! ƒo\Zçõ óõÉâ(Öv"%Ì`Ùve>ª¹ãa)ëóÕa6\ábjÂ¥[€gÒÑr<‚­™¹nG^~²øß8¼÷á{GqŠ—®XWºÞúâ^jÐKQÐËŽìP,@UÚΛ »Ñ¹@îž±Ïü8ÙO“ÜÚso`J¼’¸Ô1Oï¸HHoÞª^^/yñsçù—0¿þu@çÖ$Ù' êqÙÉt+£²§aSª~gÐâNÕìÍмt˜8½Wp o®ä£cxå ~×)zÛÓpÙÞpÑTn×Ök÷mâm¥ ¢7V Î×ËÛÞvÅm²} ÖcKPZ뎸)*½ùlïÍÅ’½0w.‡)¯yC禳Qg-LW Ø¢†p¶s¿z«³äº¦´Îšû¶|æ²]÷Ná /NCç õiüºÞ{åó\\ áb3GðvÞŠ€wdb]´Ÿïä¦ðþÔbuq½7a.oøâZú¹/½tYY±í$Õ¹ÿj-‚æÕª°µ½mÚ€Wª*N¦gi]$¯Ö+]Hâ%Íâõy\Œ¸u~p|›]ÊyÈ?®˜ßŽ¡5™Ã ²ËòPåÚÊ›®ŠÙÀU8{]£s"]téžSÍwW†Ùñu»—Ùè úB¹OTw@W™p>"Æ=˜‰GÅþ›vÂÍJ´´|nضñp»¬#ùª—¤µëçÄvI!x¿âì¾t±èž6š÷’l—tß« x¹Ýögé®É‰®W(.8’ËÍÜþñ¿ýÝørDd?ôæb÷¼ƒñðrL©ïú65€]ñãqRÍÒ±÷Oͺ]׿ûÇö<´—ƒ¦i¨ãwïÞýÛïŸÿ»ŸÚ±öÆB´Ö¦–ûïÞµ^ê4Yßy)õwÿÇøBÂÊ0“ÙZL-I7† ã‡ƒZ•Út|Éq”FgSP¦É,ôà Ù_)JÁlåØ‚Ã³»gSt°²ØÛ.²~‡œœ82`„;v݉õÐ"çÒÔ¾ëJ_2PÌÆÝ®ëJWÛ”ª$XlØí¨Ó$&`Ñòyß™•mÌ)ƒ#˜µÁ‹-ŽqÜ »TûáåØõVú²óR³ ÛàûnœS„Fd¤NÜÿùÎ'(È@€†Œ¥@ÈL(”-)Û\±;ˈ[Üÿl×yFLœpÿ3×{U!ç¢û&”~Fd\h<ÅÙí,æµÙ˜ˆiœä˜U3š-kÃÜ!´—*j×ïËT"šwÞ‘‘G€È±Œl_>£ç<§3”k‹ )©T6Ôƒ¤ÔÆã,½A1•"…$0׬TÎÊWÉE¸ ÂŒÔL%kpnÿNOꋊ͞Ÿ¢hR•F€´½aŽPo&` w;JÇ„I=±£“ŠÌ^œ»Î: eÆä»U¢(ŸœF2=̬¨LÈ ÑBH]ÈLO.†‚FƒSÕ²+(½"GšDÄŠq‘féu ˜¡ê쇬ìÄ /2#fª™ êÈbÖ$‘Ö¹Ó"¤I)…ä¤;åâübhš¯»Ù.|HNÈðª!Axe3¹±Víº_ç‘mî3G«±ö\€Ÿ‚µžÉ1Q‘køq Ó¢È êÿ©”Á×£šß¶`yÛØHÒ3”i ƒDR`‚ 4T€Bè€Á:4æ 0mK1:¿•åÔf×ì%®¸8‡ŸyŽ JAÌ€|C´³MñÜcDâÌÍ™¯X.v,f(¢Ò!ë{cqЧ})꺿è½ëKW|èL¦±u¥÷¡”nè:÷œ’ǨjtžÞÛìí0¶ì3&!U,v]”"Uiû!ûN€œY:@(…>Çe gVÿâ¿8#³–œ ÿ7ê¶P&@/þ?ÿ¿þS¿ž~óþÌÃÀYJßìÖ°“ÛíÈU©7º¨Cಣ8÷l[îµ.^8êêÄ—à‰„Ç4†Û™ËP~Ùžœ¶Ø7á4¯"ßÒž»#gTâ e<_–í WŒV. Â|ÀÕ9µ­!âMàýˆp£þó¦@¯é·gˆ·é1·U2·„“{:ãç¡ßoÉ9×IŽÛžÒTXÑKе ‹#äõ®ê†aÍù^^ïäoøz@’ÁcklžñVxÐn¬WÔ·¯õn±3w¯ÃöN?Òo‰"÷Äè¹Û)avRŠîžÅët£[ªÌ¥ÜÄ× ­ã\ÎoxSãÿ(rÖ4ô‰Î’W`;§«ûHƽ-*¿ºz·ü–WÞó‘ó9°Ý‰Ÿ*èN»H­B®×ùK<ï-è!"éΠ§)¢ë#dMOobççÉ×ZÍîÝÄ=Ðù[‘úíٸ󓔟•ødÜȲ=ÎWÛ>ëºl“»- ¯¬ä¯t¼t÷¡z‘ø´—¯®\g¿$ͨ¯HÐ}›L‘î3'ô¦t3_[…¹­Wùyª tW”^5D½ùbðRÍ¿b¼ oíà+åƒtoFÜ^Õ7Ü «ðä­ùùm¡Ð‰-p·â•óØì ˆ»¡Ó»õ‚ßz\v\Ì'0<!¸>ÝðøÆÞ鸶_»ÉÜ}»7”¶,•L¯o“$}‹Eøµ÷¼¾­vàQMÄi‡ðzÀµgÈæÐÃËuÅFã½æúðÕw¼7aùÊÕä£]œ6³Vzè_\[´©ýöü}N ‘­VûïžhÖ ñÃax¾ûî=ÄÃá°¿óÎyÍ(÷¼³ÂŸþåwñþûç]ïhÏ}÷âZ"ãi(?½dÀ°ëxqŒ(Ç,æÖ±ëÇù¯!ECWR™©hS P…+cj9©Mu<Œ‡cÖjÖJdª‘… Y‘ͺ.¡„ù,#£Ûy¦:‰ZÓv Ó Ø ç´þ·@V¨!µ32ð’ð,6¢Zß—ˆÖ2Y:ß÷»âÖò ßaŒ¬‘Ú ýT1 =4)K­ –݉d¢tƒ"IÀbŒã`»ÒÛ“3óⓎ™a !ÛÌUê;1úcöÃô¥¡!*¬,FÈP.²&‰™2Á² ÎçqÛ¿ƒwˆ ã´àþ‘pl1;ÍE%˜Ã mZd’ýoë½3#e¬ãd–4·æð"Ò‹ˆl-•žn(6”)¦ört•̪–PR&‘FµD¨ÀÌm®pGÅZËlFi–¦–î„¶´nLg”9!©A‡ %£b¶m NÚÊõåOB´2üýGcWdv¬íãïÚ8Õr³ÒÇ&°)¾G[5ý Ô5u2ÏUÚ›ÿê«U…o±aàpAoå&ÆŸ¿iy~zäšc˜QBÚ<[¶Çvúy¬:óúè7lsÇRéo†n·ÐuÒ( °NðÝüÎ;L‘0¡±v-œ“„—dtê$€æÜ˜!H?çÐ0¯–§Îï@›…ò¥c ËUöM‘xkè{º£tÖ¹‘VúâƒY¤Þ­³ì¨úÐ÷:0›Ô|¿ëX}ÌJ·ï&Ö(6ÕèwO¨&uÉ>N¨Š÷C:£+ÈXZl‰–d‹}?_Yí::Û`Z‹ï_1VètffdfªeFDD¶ÌHÿ÷÷ïËÐÏû÷õ›Kî"ÌÝ&ö×A’o­ŠäâKò²U2¯wð1ªñ$A*û.ËT.µ¿­ÁËpêgÜÑ꺀|T•sÕp«o^œ£ô°ÎéF¢¿'äoÄñÏWô¸@èëÔ¥»q8@~³Ïâ§UÙËj¼ÍÖS¯oŠïÓçQ?“Pó nêWϰy‚/O‰ÛÄÕãO#Rãõ#Õfbê[uÜÊ~¾€Oº,ðæëîï~vÀý]ëiižógħ¢oèg{ÞÔ_’ÙýӅο1Ûôí+~Ù›ëÕ§Þ/ökîÒÜf×¾þ«àÏ_?ŸTÿs=)¿âÝ ü2­Êæ‹ö3æWBú+½Ã?ogê¹Wãó >Ç´çç¹ïaÓ£ãÿÕ-ÚWmìŸqm·»;}iÜËÏ7Ÿ“­¹Ÿëzóé­ž® ¾s9ó˜õÛ¿ûûþù÷Q£ôE©h1<í3#¦I‰ãO‹[´<~8À9µc)…àOÿòûâxzÿÄVÔXÛËqªíy_ ËÝÀȬ1ì;Õ="™Mˆ/£}÷“ô»ÿZ:Ò¬MYkÆTé%ZÀ‹»Q¨ÈŒ©Žm:ÖiŒ˜ÀPfå¦tÍæ™Þ=Ý JKAð2Ñ"³Êœ86‰³ ê]‡l ß4 Â€ÈEòÎÙ8Q Â2qGó„¡Ædé ¢ë à÷ïÿ2‹>þþ÷…Öæ&@¤edï­†šch²¥"ÇàÑ»ÌI PEdš!×’ad¬xz-LžÅxÆ•”ëÂa­-^Ç _»$m.΂Ÿ@çŽ6¢‘—¸ÿ™Zî€•Õ 5ÃÓ…n@rü­ H°eŠŒ–¤!-fc^S—HűJDéTŠÄ,Š LZš Ï¬Š†LE„ÉŠy¨µ$é‹êæÇÑPAŒl €Xœ~㨠´ÆÙÂÔr²S2P“ ¤@—’sžÅ€J"Ó QS-éptâC‚À@3ªAa…:ª&5Ú31?a¥$J½7¼¤v¢Èœ¨@q J¦5Gx„ä‚ÏÆÃD3ŸZ˜Bkô’»Q…^]Єˆ™:‚L¦ë0÷¶™RØ"é‰b˦n¾÷@ƒºB$}m Ñ|{‘Mj™’ÒAË4ðÉK¥¶ÒN3ö´Æ"—‘¥™b¶òTz M]:Ñ`ƒh]="Z{Þíº®—E¥+#[”ƪf2ÒÉ.k{öìl<Öˆpún·‹–/:^žŸÊalÒáX?Öö|zÞ‡©u:ms­¶½\|y©°@Y…uÛtçú[Û,°m ¥óËTªþûÚ=«]p^æÚúšS™lŽõcÕý¹þº¯`ë‹B÷¼_zwXf ŠƒÅ ‹Ú®uj—™bC¬ë†Ða\}|íš>'°P€8“Ĭƒ­Å^`eÉÌ} s5 7˜-k b&Œ-žÆ¬,Ýü䢙¡¸£X_JßyWlèéyAئýP†â1$“™igÖ‰”qô}×w ºNFÑeUGíº ‰.dš«¦úâcSK¹1ä/ÇìKîúåqlPÌÅøwîR¦ TDfdFd‹å›™ùþ»¿þÝnèö»çëÂÿörðþü$œŸ5Œ?ã¢u_,ø"­ç8BWýãEøŸ¡“þŒ×Ф-æ×|è½æî?àþåµÔ¯Ôz«;ÿ±ÜNÀ?Ó†öuw¶ €Wäìorx¿ˆxù\øµLŠ?tþ›O·Ÿoþ¾%ÏÁ+ÊËüÓ£’å׆ˆEÛ,ÑÝ#¼:Îs>é:Õt}PE7ðñsÏãª4릇‡øPòÔ+¡®5oVöÎ%;úÁ“ñN“š¸@aÃöÙ°-.i<[{A\Á„®Óos ×vÀëK ¢ ¥®.ÖæRÜ0åÏOçç£eõæ­à§S5ņ†W÷蕊ûµÍ§®×í`å«Í[IR§ÖÒmÛíUqó5)tSô kch=ŠUµ\Nž=—õ%\v—³ka$g¸’N-):Ûó]tÿé-àÜ©!jÓ`‹6BA\mêy¹R\/@Ú´Îò\ø¿é`ÝÒ–.z tÁ‰áÕíÓ·t}[7ouioµåâ`í?¾6rÿäÚqÚá]­Ò¼‹i»˜fº]Ï¿GÃó’c»„zëgëfcrÑvUl'nhU+ºiˆÝë¾àÚW|ÑiÂË—`µ‚×õ0º,Ú IÚºŸÞcmŽæuXÄ{´­—n/ïá‡ÿô÷ÿPÇZÜ‹›À„ú}©ãïǧçýówïX¼ß÷ÿòÿüòãËwÿæ»n×w¥üø»Ÿ~ó›w5b!2K…§ãPø<Øtå¥/¶+ÈãÈ0§FK%‰Œú!~û_;ƒjÆØZKã\"9Y9zéÂf*CÔqS´ j>kÄTÙ#’+Ùz6Ü$ï|x~nã‡iйªT²)*0Éž,«0;tŽ˜€D ¶à­C‹¹®HdCÌPÌöÃ^À±@+ôž;XVšÚ°óâ¥N-ê¡& èðì¦V#Ò‹9Q TÐðÆèº2ÕH‰Ì„E+^ZDFΘ`ìϬÿ¹â“KMïfr­ûmÍEú¾,†3ì{¶7˜½sgmR´5£ €(ÌÐÚ*ƒ äJ YjKAælÆ[a¸Æñcù^4GfDBr·LZcˆ‚L’¡˜!“ ŒÍ³f†2BB±"e*àQ3­ˆÓ<"ÛëØw¥ÖJD}aŒ"eÂT©©# Jã 0“:_|ƒÝ„D§(7¨!+ iI%ZÀsÒb&Lpª UfЇÐæX ÔÍÊÍq+ôÛfÉ·Mn`mo1;¹‰/®bŸÙ?v[œìv±&®¢Ì\û°æÚÆdx~ŸiÓ—ÀÍé`ÕÓ‹c˜]=æ‘0èîA; #"açUj ÆÍ€r¨ºìœËåSNî·§(¾ çWéÎ-@"üä5’`±4%ØLò…3– #eDAw·ùÖöõ]ºn(¥ï’…O幆¾¨p¤‡¹[ŽéOEfØÁ†®zŸ/SéÜÌÓãù’IËâIlsPAc)ìZ’¢rèr×Ía°Lˆ–`‘ŠÅe]‘5æÀ)(4·ÿéßÿÇþÝÓû¿üͧTÛ &áÍNêS‚ÍióÀÓ~øÄ¡á-ûbÝis3¶u[~rÉms3/ÃQaƒò¹·©ÖB?‡4¼ŽÇ· åÀì³UÛM9ÿõ†‘[¸éÊýyeWyU{GDxdpye>Ù&ËËÑpÝÃ}ò)À–U²^ªPè‚ñ¹€…s¨yÁ^ëÿƒ‰SÜ{q¯7‰¼fÀê“öÖº’tê²?Û\ÃâmûÄ•ÎsÑ¿žÌ+Ô«v–×koïÑrî\é Ž”¯S€î(†7¯˜Ä^ª^ñ’½•ØîÉCº: »›DÝ(¶weë»ìš×E^>X„´¹›-;@=·Æ­›c=N^îÂ6wáëÞÖ# ûvîß•q_oݸ•&`åuÚûj3Ýx‡C|bbÍ/\ëªk½¦áòf6ñÚjþºOh›¦9y_BÃ×oÅG ò[êåíÐù×Ïw;Òî"€®Îq{ ç_Ü<÷oGãëÇ|çÝÖϾr;x”eâ­bóàIzZŽ.â™Ïqk祥Ç+µ¯1”þTÀ«-a·ðüO¦úyI\ÿ’*‡-6_·\úÏ ¸nçrñb#=ö½£Qn²é÷>éK³^º+MëAÌ×;V=N'¹¸T·ýzƒÑÆ8`Ýã.×nñvØNóé"]Qx_{>­ÛÑÍ)¹m¼Ó?µ©¦×k;mrBÚÎî ƒQw‚-Û<Ì6u9Uø©9²j®çÏáÅ2ú`8mx0à£1¥»µ"àg÷r‘|.>èÒ‹ÓRww|üä%»ž!ïŸÔW×AœÉsðwK‰"_ŸáZ–:ÝÉ£¼v S#Ý¥ñ¶ûþ½·÷ Å ·wã{ÏRí6gtñõò»ÿá¿ÿ¨M)7³âp«-bjîVvK©Sef}™¢æûïÞ=÷<ët?üþ#v}ùðà #ÇZ¿ÞJqœzb¬a-½@‘4Ë:ÅTp×ㇿÿÏhµ©'ÈÆhÙšZ¦”d&ØÌš­†ÔÐ"#I¡Èw Ñç¢i¦¼ÏÒYÙ픵Õ`ä\—J‡Ï—sJ2`€‹žÞÙÀDQ13s26ÎÙ<¼ŒïáöÃ0ÒjŽCé"U¼¯­6„iäΧ‘ÓQ€—2Xç*SÛ” ÛˆÌHDŒ3Ù¿x×w= -¦T0GæâÖË€ ä‚÷q¢ÕE;Œº$ Î>$˜µ~_tÿl;@æÎ†ùH`°BÙÄnÕïÖ¹‚—5¯@‹E°°Ôí0Љl!P)¸R93ËU©1ÒÜÍ §‰æ01D6TT ?-„Í2³™ž™©ÄÌÅÆÅ¥ZfWÜ{‡7X«•Ó L–Õ§©EÜú®›úiª:Ð9@„À}©¡¶£”ëŽÙ3î €dM„hP7;CI`gÐÓl¾0I €ÑÌÆÌ~ãÞ-cL>›Eâì)“äæ?¥ÞqaÁŒ‰ïœõB:$ƒjÉè‘XŠZµË=­/*n§—>ØÜÒ•É’F¨²A^—~é4Åœ+wu9ÃÈá¢fCc ‚`5æ ¨Å*¶ a$dO†ä@ONd“z¡I©èÀÎl0 Ë@ö´ƒ…1;7A —½ïöÒË\ÃoN4CWm겘‘¥(Y"”9Bv&z£¢f•H†iªÊŠwÏO!fòå0¶lûç2ì†,tgyâóÎö»çé»}´üñà œý»ýË/ÿò»ÓX£¶:Ö-K'®‚“Uv·•ÿƒÝ?/¢¡‹§cl üO|õ“ÂãX,¦ç~öäÈM;oJþsUöO=ýd±(Xÿ锜˜]@t:JöÈÙ x;xöHG/Ð+ïÄ’ð\ÏËØ²JÂ0,êZ[ŽÚ,ͯCÖTÐÒ°ô$¼[•ˉÀ—f/K±®~ãtˆP„Ι¢àÌYJñRºÎJ)CÇ®xWXJßë Ìw÷¥°ïãcES釖EiÑ?¿78¼ßÁ<P 52™ MEQŠÈ£ïI ûž!ÖȾӪ.­$B›{•2£el¥ÿÔÌ,öέø_ÿÇ¿ñýðôý{-WdÝh]ÔœjH´ÚC,•0[ùòž ó Š<µ$z¾Eeô•v¿Ùöè¡ ØýYSþYêõè§¼SuÆ;•‰waÐ×BÌÍŽôþ†ë+úÑýy7wݸ6Wã±­(7)ƒouÛnFë éþŽx±íyÅ™à+v(¯.¼¹àSίÞ@=Ô¿¾…cãĦWS¦ÌgޏõWWêÖôí/®côÑ¥þäÑ^Ý·ZÄQ€>+‰¢›ÁkÅQ—ÉÄKLÛùÏ.ÂE)äöw?±³ÝØÕ_xqŠXÚp_¹žªÐùÏΟ5b?™¾z¥Ñm]G¿J+ÿã~=Rÿ¿òmÿŒúóׯeüRÙEþúó׫~Í ³c[5'[…¢×\ }v#¼²žßúÃoøÇÿþwÓX%™;KñÞÍ=RˆÊèv}›¦ù§ÉÐ_ý?þí»÷Ï~üøñ§4û}×wî;þøSfÛï»6M‡£vÏýT[/f«ßí]šb'‰”¬ëñá¿™3÷¬cD¦^”3…G5ZKóLÁ’)Œ”"ʘ¥“ˆLä„0™ „9J¿ o¦1§ãǹÄ5 r”ØÃi4FËl ›bæþ/;… Jd +¢"µ¸ìΠj&¬X¿"2Ry¬‡¾+ûç!ðEî²~Ø—ÌÈ_j­èJ‘Úqeééé+ÿz¶»@K3S¢x©9Q‘ÊùgyÌÊRίº ~r…f,ײbÄsÙÍ\ŽVÁV7Î ÀWõm‘ ÀÜf+Å’6ŽS'ÏêÞl¹´Ìg4–s”E DÔÌ&a)*Ðdi’Š¡¨J£¥)c>µTrlmñ0n ECrq.Ei#›»A™L+Ô4ÙËÇPw}×ÅOÿ„Ýž¿Çÿ?  '´x±HR‚K Ô€-.ðTªI°cl¤: vnj.ÙöDÎnÀN>¨ÔÇ@D ÑÝÔZF6Ú}šCÀHºå$š²&ªcg(È=x h6 ïBÍ>6–F!kèl ¤‡Ê"˜ìr̹ÒdLz/jBELX›€e@$r9Î05 Ìedµ9í”êiMù’Òž é˜Ñn–¦fJª˜“(`qKK‡=÷ñãñ‰ÁýÙ®É"¤½˜$Ì»F,%ÇŽ]Š&9&Ž£õ]¡0Ûø1D‘íÝû=LíØÒÐõC×[¶ýS©‡Ö’?_j­ûçቚŽ/ï¾þî·-‰qªy¹¬jýÞ6Åû§ÄÀ‰é’àýrϪ ~DoH!æ6_êîs-|6sEùÚ´¼ÕI¾Ÿ6ÿ¼\W` ¬Ÿr² ðMË—þ×WÊ+~%Û‹ü•F˜¯*õfv*mž!ÂŽÊÿüõ¯XF˜ÍOr¦iϳã¥è-~Úü³®ñëÝÜs±üÕ&8ûÓ™+ß:ÿÍ¿luóþ¥á)Tæ7ºÖ¯É ”süs›ŒçÙç±&´éÔÙ”IœÊö75Äoþ\Ä7¸g«›^Ì˂⻢ñUуp]$ËÛ®^‘ŸC]>¾ãW‘7°åm7W„[Žn{ÚpÕDòzy†fWð¥Sôä|JÚï'³ìoy^Ý­çí=|+8T'¨.›NÌšM¾®oö£q«;G}Õúé·ÒRÜs«ç)Ôй`{å.XA  O\Þ9rñÎh¿¸Î é‰êÍo.ÌvŒmûß´Å;%Þ·¹q=޶q;åuçWxÏK ×ý4eוô[ªMøj\°©ƒøäCôQzëQWŶ-à¾16¯üî÷ÿð·ÿc:N/_Šûþûw¥wë:³90ÔVke§k!ßýÕ{´úãïüðãÇ6NOïŸóW¿ÉV§ºŽãËq:âi×}üq,¿Ùw}ç°]†™E´$Z#Hßíò·ÿûlV_¦ha­E4*2sq (rnîs¹ã*i®^ŸU­¹°L–EŸ“ €Ù¢w—²J ‰TBqa§=C-D`–¨ÀRKù¼Öž¡¶Û÷FŒqèßí:‹²/fg'4D9Lc­*¥*²¹/‰Ör`@¶åðh°b$ún˜êØ4Îy!súaÂF°¬û©@μ³Â  [=çõÇ ú­B€iqúÕj:ÿ5!1Å\lËU˜³u]™ xµ^ÒÌ¥âTÏ«3›è¢3šÆÐ ”1ÓfJŒj¸Ì+bªétÝ!D !§ŒªÙÕÜ@ÍØ §A™¡TÒåfÓc†åYCxiµªØdÈÃ?±+ ÑÜ ¤x’}¹Ö†°þ”³8À1͹6~¤ud¦ÍR‘¢ÐÏOId’Uéf¸Ž‚3 3e:ä²$û N ÆcI|ïüØT:þKS¿ë¸K *pWŸ‚X$ÅΔí12z‰®O-&¸a6=ž¸ºJ¼cÈ…å„\-5³Xœô¥< &ÌcÇ HÐS:oµ4Es¤$ÔÄÙ5ׄ½q®Úî{sÒ“¹õ˜uÊÓ@Ð¥ì2ç®JKö( ´<'IÀæö©‰°-×nI^r±Öº€Ð.j—Í @Y‹Õ pckæf0/,ƒ:ÑÑvÞY)¥+–ðTÐêØŠ{ÎM'SÔc3—¾3iè†PóØw¬ªÎãÿÏÞ¿õX’$[šØZ"ªfÛÝ#³²ªûô4 4Îà€}!ùÒ·?ÏGò‰ 4Ù=˜!’èîéS•™á¾ÍTEÔöö}sÈÈKÕ)G""#Âݶ™š^—ˆ|ënR1 ié(5ªÌZ–H²ˆ-A7S†Èð¢é¹œrÌÑÑ{½Eô®Üà×^ÊßþíßMw»‡?|÷l°ûY’9PËÓZ¿CÆÃåùçµýìÕqàŠ' éÓÇÑOž#¯H¬:Â}N-ܪ\C®¶«×é/t)|Y¼$¯”é™D©SßùçmDqHá-2ëU5¶^¨ÿŠÊËÍt™¯‘ž|mÐg'”¿x<;kèö3o+ çЇQóÕ%áWßÑÍ´w~éÕÞ¤ïDשè7ÎzoîczýîuFºæÿ\À².nøsøõÇX©Î}žmN­oÏ5³O¿ýW¾çÔòŸÍr@o >]ÀL^õ 8Q^od]àÎÊî?«Ÿ–í_ô#^‘=ŽXžf¯³ìùæÀ¿èü'»ÜÍeý§,ŸU¦syçÒÛ¯1S½éžO8]gÓË ?ý,§ÖÐ|ÕîûŽ,3:+ÔëGÉæøËMªÌ¹/$_É^0œ¼A&ye sÛ¶µ©S%ŠâðE=ÝåÆrÇ“Ú7Ý~ÝÒk+÷)½í4ä@¾]D<Ûô]·¯`:ºúõ°eãËBâù~Nç€[0•3¹”—å‚§8%ê ôIœ†8nƒupf»À]ñÝ~záMbŽŽR)o>ÿKOwûƒ®w:=µù£N¡v>ÏFˆ^Üã_ìcø Áà«Ýæ¬ÞšW³†>½³<‘þ_[y¯wNg=ž|[ÇÖ˜V_eŒ¾Û|µ0VçÀ*ݪûýÄŒÿêöyu?ì8.cR7©pça~¯ØgàK&–O-NÆâHE>kœ#âE§ø s~ÞÁýõÂ~òòëýû~ùð¸Zž>îi6¿»/»ÙŠOsýøþñéÃã7ßÜnëÑ[§Ûîn·z*ÅÚãÓ²o»‡»?ý×?UW¶Nh®œêî¾:ï«„gt˜¡z†õýº.mzw×þóÿ((Ö®±¶Ì€Gf R¡¤ŒRÛzB6x>’ˆD©›”V P6lýÈr¡ŽÐÁ —°€U(À£G.ÐêDÜM™ìèOPß8?[ßÕ1)JPÖ{{ÚÇPH…²"§’ð\ÛBC-3h%뺮>Ý•§e) XÆŠùÅÑòMü©Õ¼Îëºì—':'*!!Vd†½%ò`ª±ý%¶gàH¸#µÅ̰>=.-Ÿ1Oµ?5ëˆÀ»oî?|ÿÈêNtë¹Nì‚Û]sÔ‚2l Ü·ü÷8låÛ /¨ï6;Üöª38FÜ 3L3Ì‘íi37©Ç­b"0Øab~ØÛ¶úyÆLÒQ&˜o("sȱ ãîRH£ø0O'Kãù}WAï­eŠpJ‹‰æéT&¬ à%ÙÑúK6tq?,»'žÀä°—80/m ™ÄÉì7Z,“ VK¡9Ü *U9hbôR«ÞPfîÜ7£æy2Á¥«þ/¬“ÿÍ¿{‡Èòþ =@fuWµ- iÔ<ËÇßH"Òܬϓ8¦hö¹zñ„ cbØ g"‡Ëo‹h½µ>â–$½¯åoÿ7ÿòÝ~Pöl>t}ªÓS)ê° e!ã:©´®}™øâþõ ÌÝLÇ8'áâ¸Äµ¦påêtiMt¡Çmgr£÷¾ )¼®ž%¯ÈæŸðB|ЯCPê¬t¹<¸Ó\îëÆ¿ŽþÛÊ}Tnl¡¯]‘y<ñ9v½ó¸ÊÂy“æ~\¹Ö…¯e©ÛÇ“×dâsøT|Žue¾œ“oÎkcp™gÄCÑáLzÖ8£ûkÛ~:ôÒ“½"]‹£àùÒðë”ù›·[ð™ëÿ¿ö3Ð8H×òÏTÝëÝ—ÅÖO“[në¹:²iŽÜà³ÚQ8ÿ:3±í÷÷?üéûRü›ß½ó©L»jµš[¶ÞÛZvÓ²´õiy÷nמöÑšA¹_§2eâþ~g¥<ÜÝõuÿôácß·ˆžÕùO¨µ¸$µÖÖ¶_ÛüíC™vkÓ>ÿóÊžÊìKï=ÜCH)Ô•)„!Ÿ Hdmâ!úÄ ßÒlé0GÄhz‡9lÈÙWÍÔ³ê¤aðÛac?!?±Í„hPqHÀ VËÜs‘rãT”n6õÈÞ—yW S؇ý“wwÓ‚µÅR,éP`¾3³l¦¹öÞdX3±>H"Wð2PòH!ŠÃ§ ÄÏ|.W£#úæÁ;Úmk“Æì“U~!Và˜{ ˜mÙ¸›Ød›¢)!pp8ß[¤a=d(ûæ,:’åÍ `€•(ähçcñD l#ÎDïˆ$ ân¡uŸÅ¬§Õê˺b³Ídö¡AoKS2 ›fkk.‹¾A4NsuçÇŠ…ý rdö¸¿óR1OÕZ7³¾õctL"(€Æ².Ð`à4¡%*P€35ˆP.<»YÞä~x5HÝl/œÝf)2›8™X(* °ÀH|ÎTw[¥û½çL›–Ò"¿uüδŸð‰GïFï\k°D©Lãt/†aA zå4`'SÃjêɱRJ8“&A°ñö‰}`IìÀ± -P! ‡·Ÿ¿·Qh"‰AsC5+^«{5só2ꆢј5}8‹„úûz·³ogKø½!TÊ„R! §ÍH|\Óì2@à¨:olxÿ ¤A¡ie¨¬=¦"Žj“Œr›<#Zï=²Eo=#X)^K™Ë¿ú×ÿæ°nñµl‹Ëì&š%’C]ÜOÝ·?£¯í¿ôžè »5~2SæÙXb[þ^ËV13ybppÊ$ÿ+„ä¯_ÿ”éÐ/Fû…U þyŒôS™ßî _Gÿ–Q9_EqÖ_\£7("úFß[ t^·æþŒ7x䌽Ð{¿Fà Ç‚Û)ý?Ï$q J¿)?V§¾—·à̶óù^$Ë<çðäwݨ9½¦üN¾¸èbgzãÆyîsq)Ú2Q¨“UgË@åEÊîK #béH(zC2OnZ× ÈOŒËƒY ÏËϵ|>/û=³ùúœÕ…/Üæ±èùâ_MÉ ËÝ‹&Ð+ê¿>×S÷¹•ôrÓò‹žW‡¢kÊÍgÜ þÏó9äÕ )Ää/é³r‡Ë\6Õ㜧,ëßÏ­ºõ‚õõ4úúþàõïìcª˜fûŸþCZdWôTD4I0KÕþ‰ã¡Z2%Böœy±ÀÊÖrVà„€0µ p± T°·VäAÍC!²o¿B.BcAf ˆè‡Ä0ƒ (rÙ/°ô¡t*×µ--ª{¨õìÆr7ß=ÜÝ%sò‚=öËJOhVËÜbÓi“O‘M’ÈHñ´¯8ê•(Óó‘6`÷ikšÔ‚Ö7-ÞÙ¡!Á[KöDk°„Õ-ÑØ%º`Úrÿyôó4¸CÚˆä›Z‡ ŽDÂ'Ðà¾áò™W€@öí"½ƒØâ ¨m$¦Ë’[®Êžé$ÕRkK#ÌMÉó4yDôõøl€°>¤\Ðæ0+—÷Pïøñ#wÓÔ‘–ý±ÃÀ_"™Å@¡ /$Š£¦áI¹BL@\±¹„’À"«ˆ‰˜ŸY( *³€4ÛGÜ;ì) wfù-¨LFP;h"JÓw…>¥©ìT"Ŧ,˜ï*ò‘h, ’Ú‘õNÑŽ÷ïD+Ù&z'‰ÉaXS½Ã Û²‡×€·d¢’d×–’=ÄÎq“Ú2XQ´i‘@5Ô3“¨¥É¬ÒÖÌ L†Õ®n¢„ézRd˜ssv˜Ñ’èÚ¥Uð£Eï¾,÷Í[½»ó»Ý|?å61K±‰uòU=2æÝ4ϵõµgß·u¾Ÿ»V¸?ÜíŠYïíi}tCDûæ~VkûlÕñøñ}¨Ñjüãç­!0ðÀÞ‰†#ÂA÷σµï(°ƒ?‡UØPÿG$@›ƒBnȶ ê1.B˜ï7§îaÒ ÄdÈ\ÁCùòö㘻Qýz~;-Ì'óœÈqÍë¸öéå›ó/ØÇ¤`\xr¾†|“îx3Ãã´àôn¿Žªu(S8¶ß‘ ‰[{ôÓç’”ÿS•Ê׳–øŠðRƒ\´ðO‘Bø=õ«²?¢——'ÉÞ<8Ž\S|OwÔ¯'bó•rú¯,ê•Cð1ŒtTþŠ€u1f¿€òôúõœ«ëá©+˜ÉKºÛëŸþéÀ™Î úôí-¹7;ÛëéÏ/òÊnAøùÆu_ÏVæ¸úÄXx®í¿žD^/ûl­ñ$qíz¸øÄ_E(ÿÕ¡ó_°®½¥§½r勺º7-d'; ò$Nëÿ.Ö­[“ÛgMYgBÐ&0è“3ü+%VŸÕÔzYï,§:Øí‰æ´¨éöàà…DŒ×B‡»yUü}aÁç ùüÀLÑK€—#Éè±#Bq¾%ÞÁ4;Þ#7ÙëXHwNÒãÍé[WšñzN¸!t^ßÞ¹Ê}B A¾¼¬Ü€»ßÆŠ? /—P'^ML‡¸Š®°JC'”NËIùzt@WQ >÷³’žá?:6Ó^/мGÞÓw<Ù—hêÃtRÍ§ÓØÏIoÐëkþ³?¼x©·Û4±¥í+Nø3|1ÚtRgÊÃð5xÂo¯!‡qª‹XÜYÇxC<ƒçTSžÿfz¬â;­õ¿Ú‰çº'Mœ$^¯p/†n>Ë ç&žG<Îý§µíÏÇdR:½ëQ€l¤`ùÒŒ}á0@¼0hÎ~þlJ .ޤÿô¾í—h ©>üø¾µè=l*Ó<¥ÉjµZI. $woë>Zb]ª—zÿ§?PPD¶µ÷”à•̾.­iÕ³Z–òô§÷÷µÎõé©ýéOï÷°s÷œwþ/ÿ‡N¦”¡Ö%J #k˜Bt˜dP0>ÃÝ’„Frè Ð >Ð10ö¾ÙN"Luhøvv0¶ôy fЦééûÇévÀé ém¨rÔD”2®–$h¶›æµ/°D ì¦ˆ±›çRl]ûÚ—¬™‘†ŒzŸ¹ ±ƒ·ŸK{Rßÿæ@B¶.Ѐ²ç0õÑ.X#+Y”þr“„-a&O2]töÉ·É8XZXzЃ1CEñ`|L.ÓØH䇡L ¡D´-›Ø@ç½!F¬@@4mÃF¸#"&/F(ÕeHv(¥He¦Áʆ¤êDÀÚ"Ò-†'ò4AFSM!zY'f+™Zß÷Ö‚f}5Z=¸±šG϶ª¸ $s“BC)U$:8`±F­¢pÊEʇŒìB7#ÄQ~cÒa^™LYA¸YÀ s¶m›Q$‘ßg~K¥y ÉDÌà]æ 3×TĤYô¤Y¤.Ðæe‚kf*D/Ú‡ba%Dê ò rÄ&˜€L(iðô"uÒ C†Ѱ_Ú0Ö®­mâuPg£-럘 æÈëŽ<ÒsÃþȶxÞ˜Oì`¡Q >Jˆ*8Xd‰Äöƒ>!Vdn^ï^À ±¢7(ǡʂˆ(Ófiž/Hü@mqû VXwæõ¡°º™¹‘¥=˜³Tšg °4š™sŒ¥3³÷>>‚‚ö°|«©Bn&Òu ¼Ö*!îÏ í|³‰v 0•ZY3Ó½ŠÕ¦iWêÌ:•0^º„à D t *…Öþø¡Àð¾Ëe}x·³wøðïî4&ߥ³õ4KZLu4ÿ Æa‹à %Ò60š»¤ž©R sLJd¤"Û²nÄÿÐÐFJ-û/þå»ôûWT«ÔÏË]È3þøÒ.è\7)Wêh ôœ1vÀѼ.‘ÏÌ—LÑçMÚK4˜7J<;yñͺÕÃ%ý Øä'©ÿ8³Z;nV‘‡çíì³úyrÖ;»™s‹éaúdÏå‰èì$Á£Œ‚ Æ)kâ5pÓ‰J7ö¬ù…ï™×¡Ñs~mž‡|ññO?.÷}mÊ4àÃÓ£Œv÷»i7•©ìŸ«@ôuéß}÷;,cØófg-`¹ßMËÚgwÙ{öfD¬ëÓ¾Ý?ܧûûõÛ‡¾ÆOKï½÷ŒŽòñú• µˆžB1”‘™ ‰bÕi.f[Y™¤H àëÚ$dnøšA· Ö-0@G$(DÛòÄKú攫D 0†*£©? ëǽO¨32À¡wÇiØ‚Ã1Õ‡À¡zg>î0yHéUlöžùô¸<-ëý;í¦©eK¤Ã滹iA ô=Úš#ß*tû…Í£uè†ãËyÁ8Ðxrs­…Wô¾µ€­Ã æ$ ¸QÆ›†!“†l"YÓà!°$ˆ¶q(só5Í#C\'n ²#úºÁˆÚŠå#æ©d¢­]]9ü„ÅâÈÆ,¶ôFã>>‰äüþÛoæ¥MëÚŠûýn÷ø~¿ìÛzßz3Câ6uxźm+maÔzþôsôwÚa.* m~wD‡xHuDDÛü~e›e®;X·ú!ÐY‘}ã˜e‚9Œº7òϨÑñrjj‹€¦™ BW˜ûDø!H0Їr'÷¹Xe™ Åi•P¹®˜vVæLgµdÂiæR_²äx±ê‘ z)–}ij›Ku¤aT‘X"1úSbŒßa0<¢·¢«1Û,P+vw,*4„¢GMõÎKe©wó}-“Õê‹©©Ðà=§–]»ŠHöˆ}¡Îµ<Ü—û‡|\JK}Øëÿn4MO JæÝµw·±D]Õpöµ-ã'$H™fΣÖPdF •‘½÷lÑ–½Ei`þûñ¯î¿ûö¸n ×pé“$ Þø+Rj.Ïá_º[;KöùTàEĵ“ïWÜ\õˆO’¯3gHÂK‘“[iªg†ä¯~äûj%._ü•[üm­ý– €·~ίH¹=6rÀÏ}L{£¦õƘâM/ ü†‰.×Ïõiß”/2±Ð? ñOy¿À\ô—ú>WÖÿ¹×ÁëŠÍ¥ü6¤¿/þ¼kpÎí™SŸ)àÛåqÞdòü´eŸonž°5.|mn§wßÈtøùÞ²Þrÿx©â൷yëïyr6¸‘™pþ ŸÙ!^›:9Ïð4ó‰ø”éïç5Û¥Œ{ûÒoí’¼þ¨gßç½ÛïŠ>¹mä¹@¬“…œ?qÖ¸U{Ì—¢>¯ß󼽿 5~ÞSâg ù·Çá3×Ìt äó©´•ÓŠ#xS$œµ³º—üaù¸ï˪ÌT>­­L³¹Ñm˜¯V+wߺEë?ì£õ?¼/jµúú€¶¾û–îeX:vwS¬Ë‡?NÕ±4fìjñÞJq¸I«~÷Ý7S-™ÿ¿þï@$“å¦ÌHn§¼ÁáhLC‹ÆÆŽ¯„*Ht÷d=xfH@î(¾ivÎM¶7Ü+rE?àïGš¨:”4ƒ ̬» ¢ :,-2{@ë–¸*À–a°ER™ 7ƒåþñ)"A¨ïïîvww³J¢Ìöî¾>-½µ ,´«°Ú!É·ƒ§VtƒìñœzœÊÿãÇ8r ‘înÉPê]¤ðháe¶9&5Â$0‹H}åŠì;8”ïNL94¿’ÖkÂ7.¹ú|lÀʹ!¿£#ô%Ö=äþfšôâ¹nÕ±À«¹öT2;ÜXƒ¤gF™R4Ä!Ø`•Œ¢LeFW¶¸*˜ZŠt›„„°¶P°Lž‘­õž‰H„2G½‘hÙ°ádvpÚl!à“poðÉâ,¦®ÈÃ(Ûˈ4s.†!Ê32 mgö±IHÒŽEMÅ*$ã,M½5²©xŽO°fh6ãnÆúÝ4UÌäºj]ñ˜zç¤i1í Ê“ª8àX HT!%áÉ•²±OIfÒ ¾ Ó*Ç à bóbuŽ&™üP÷ N4šd@ ¹(6¬=9’Æçd!Ö¬ð0vá[ Ngd[´,<]äži(MÊNµÖ\µÖöÃ~µï¦Ý\PJY\Š,³÷âtªrä_C=ÚÝÝèÖ3Мeß÷ü˜ïîî{§Çö_Ûß+Ñ£ù„ÖÛÈ—s®DÄ^±= €e ·¡ Ü?à¶é׿ðéà,ÂQWº«9mª¶øbjÝbr[8Óaw =¶¿‡Ãw@n$LdG|‚—ÍW£Ö-Å~ˆþ‚S º~·˜ï|~W{g´^f•¹²dï|þî›zwߟ²/-³Q$ºaÍž™B’¥B™+•ûn 7$‘óæò¾™ŽØ´…(x0 9«>Í­¨h[Gô¥ƒŽu/ºX5•Ò‡Y™J± ^9Ï^¼–i¢¢·—29<Éî„--{d)ßýïÿŽîxjËŸ~È}«¿¨ [‰y†ÜhU½©¢•i!*­Iåa§Ãìº[IŠdNIÊܰžƒç’ŠÑúö_è™øÿ/ÿõ¿}ëæàS¡Mjס®ØøÒu,J]lŸ.ú´ôöR æó…ޤÁY„_r¬~û†íæ™_ý(ÿìŠç`  ·«ŸÏºÕ#~IæÔDôëkR¼a’|ó?ë¸qeš!¼xä~é®~µ ÀMPÏÎÅGNÎk'¹¾ü Ùù«ÙÙý”ê×)@×ßù‰G’®ŠSëî34ÐçTð¢|êP|ÿÊÙö-€›(­Ÿ¨ó¾¥ê%ÎM ÊKùøoŠJ_†¾i\|qÿÇŠµó¬ú3þíç¡?u|ÿ³‡Î¿Öí3o\F¾|øãËÇ}ß/Êü¸ßìì¦RKôt÷Ý7÷ÙÛ²_ê\¹† £í¦:Mþ0Õ|ZJ¬¨ER¶V"ÖZ–¾,ÕÍIŸ‹g)SѲNsyxwˆemêOOšçþŸþÏséÈŒRÃÍQ¢@#„¬f‚ÔGéÂ9ʬÏ~PÔ 83ž¸wX…„ôŠ3²Ô7èÿPÙú–œ[®?ªí…B$ѱ«>„ ûG´%­l½rž•ƒÛíñ(Åvó¼_—L ~ÈÂæßN³C%{ùØÐR‰®¬÷(ú‚\á†R˜¡½Þøû ø´¥ÖÑ×Í`ˆ}Z7s˜kÏw;™ˆ$rYÒ‚ÝD‹?éŽtDGQ¥…5,jZ0re6ÁìÔÊƒÑ 3€]@ -0‰ö´‘‚2ѳ["Cˆ±šp e$¨ÌÀ u­oŒ ©ºd’¦ê=î©l«R‘n°>ÊÓ®€žO 0Ò³9Äè”6ô•ÝE×,³ŽÚ¹#tªjíxhf‰,Z©,rÁÉÇÔ쨥*)êž·bÕîv¼(^[F/ ÏâFC"ºh†Ö2"Jq‰xÿøžÐwß~óã㇧u!Ð{þ×?ý l>a]ÚdªDŒÎ ô@_aܲæ·p×IÖÿÔ  aËÌ·-y#µ¿lIú":a‚‘Ûä=*i(”Ýæó¡ aŽR Ñaˆõàóa[äR*¦²í,¼@‚ n€aÄ´`°õ»¯í„¶Ÿl[,Í F² “O³†ìOOëû=!s§¤½h,>¢ì=„n’ú¾*G  ÙG¦,1ÖÞGgœO’52Á?10WböòPîö¹¶&ˆS õ®Þ©íf¯óΦZ‹Já>2’ÅÇŽÜîŸü# A)êîßfˆûsU ˨°@«fKèÇG§wwØÕ5A7=’d†RQkuÒÌÆ˜è„R©è=#ûÚ¢õX7¿ßøÿïþím]R:—H_”úN=„òh6Ž*v±ó|Þ9=B€E]oüŸ'd‰ýìR’8!õ?ßÕTž i÷7ôI±†ÏÛ¤ zø‹2Ç…1Àé_?½ßäi|âlІ'÷³óñ|½W²q8%‘¥ëZžmÿ6Ç ×±M/¤¾ñb¿Wá0zÇMâÄmÅ„·ûýg$1Ê!ÔþÑÜÏ\}Bã)¹Š_à”xN/á[„þkéÆÑêR‡^•"/ðÅ“+¦éÅ›`ÀÛù—õß—4¸·h‘׃/Ä [rùášyB>Ó´Nã"ÚÆÇñW}òކ¯°’>áÁ dž·<ãͰÜë.&ßÏ+òÒÍXËÍa~ezUaxƈÏè8“À^“þd&€a~”Dž¡´XµÓ¥ê%¡ö&ètþ•÷t•|iô½1Âô æÒ«ñž_>ÚúLÀ~Y»ÿê÷¹…N£W¤õÐ/^À/ÃP¼°bÿ„y{ïÍŸå;W4?ã²úäwð³nä§Ì~ò+ùœ €Ó¬ƒëqu‘쮯Ù:ñ®!_;XüŒ­üº$¯ |iGóÕGúÕîï³ËR^¯¸òûæ¥ñõ§?ë²àSï’ŸZ·¾Úüη6–Î[–·ö3‰>ÕÏNìòú |øãíqËkû¸ß×»«—©²ÔiB¬ÅÖ÷ûû‡áKÛgk^üáÝ»ÉÉß?~ä<‘>UI5ÆN»åýcºÕw;‡}øð´|Ü?ÜívÅëŒõømÔjjd×^±@Ñ R‡nƒ-“}Hi^à¹2ÂcÏV ÛliAÐáƒ|]·cÔ°É;©r”»Çúˆö½3ºµ}˜ÃBÀÜWnäîR@™Oisß6ÏÌñYvÀ}àÀ#"ÊQÇTç -éŲ6DÔÙ£Ë=³kÝ7 ¥VÉëÑ2³–"¤ZGK2F"¥5 š¢Ö‚Zb%p)Á½¢'`¨Áõý¿A£:ÅG!Q‰€fuwL¸XÈA´ªR!`L¢Èœ æ=-"÷™#´pG[3e˜g±*¥Ò¹#º˜‰ß…}”žBJtC$-T ºá‰"P 5#U’žÌ€JnŽ¿‚dTøâ$hr0np¥l“H)ˆ‰¦@Gôƒ6~ßMJhQÎdkz¶Ñê(´]Ç’Ñ]™¸ —i€išfØÃí¶ZÝ·¶öî†w³—»²Î«z6¹hœkµZÊTk™„xZ3UÜ[¬ÿýOûµ÷wsþøÃë t+kïë½­È€zÛ/†áG$R§©9g…‹ÃVw“¤¡Ôm~H ܶ3kr‹ FbºÛ‚X曚Ëac.°"‰žÛäí$8ÄýaÞë#y£pж¹ g"ã07:·avóñ A,1œ¬$¤Ôy"s]ž2¨•^L)ƒg(b”m,0¶Êè•xz„v}…ØŒ2ÁúÆùöÈ£^ad¼@=iÌábBNV”lêÂÝ´SÁTj-s)µN³Ù¤y¶iJ —Ì ‘ÝÊVJ1zäüÝïôá)–æøÖ¿{g„í÷êf;”ÂèÁRrßû]¶Åré ÈKp S'”)¤„¤™"††$£EïúÚ²o€ÌƒßïÝü¿ý÷ÿî|»«ó=Ã-Q˜'IR›Ú¡cÁ!€rÂá{ú"_Ù=ë"Eý ¶~'²…¾¬€ÏÂú1AâYgø¤ñ+cùçÍÂýY*ðÖûgµóO­ø¹„oV_9'ü™È/ >¯{üÔ €Ÿ¦A}vÀç~ÐÉT¬¡›ßb¨ÅwñËW|Ö§ü|¢­¤W®Ú[øB™×©Ð¤«¯·ë~ùÐùWƒxÁ°á/þKŸiˆòÓ^Áèà ús{|¢kóM²ÝgÉÿoœ|¿`kõ•®÷i°ÆÅÒxÖ†Ó·=#¿üµ _ç‘ôuæò[„ÊŠ?5£ñFž¿ÊX>Øýò§]ôó;ÛO/³±M=L°`*0Û!Ö­|!¥n}8V`8 ™`…"‘ ¬®™¿”1Üój äRQ&PÜ’ ×ÌtP®LEÉ)éDPI0ØWéZW¡o`tHô޲o”˜P<4­t+½÷ ­ûœf‡£÷è-ì{²†!E§OnB„¢m¥K‰¢èíÖ^J[µ.½ÖÁ\·ýS3g­µµh­gËH0QæB‘ˆLíæjÖÞRC3Ã$ treå(/‘m ˆ,$À¦õ`$Td D–B™1’tIg £b"š¸ 2MÀŠ|L3èÁm’Í î]¬ÙÄš*‹YA5Ñ5¯þ¡D‘uÁ¨©pLŽÅ²&=;»/’¥%3ÈΔؤˆM2"GÞª !lèÉ#㜑"ISGfQ5‹'…¢ìHʈÎüÆýCô%²’¬C3 1Óš²…Šèä’É©Yq.ž 0ØKvK_(²!û YÎÍ Ë‰HÝ» T,]¸À,SÍH¤÷OnVÒÖ¶–,ô‘”,·¢Ìe]ØÍ÷s{kÑĤ‘%£÷´1%@‰eÝp4ÑžWŠQPÔ7C•íËâðº¹^‹° ÷mp?`¤†k7aؾÀ(ÓÑqÈsû¬ Ó_ÑVX›À£²mŒOfêFDÁ7ëòa `‚ 4ø°)N(ófß ‡ »ïù´²$™H˜SÙS¡t‰ÈL¦yqT£‡ÁÌKï áŠëêÈ<ðý‡wH‚õy=ÊvxÌCÎëˆ[ Ë –ôd$ð¤–fîµú´0Yë\v(µ¢Ô´Åœô|¿ï=áD±œª€Ê^óÿúŸBÔ~™=Ì6UŽR©ÞôcònÂÝŒD¶Àl‚Ã-¿±ø°æš½Ö,‡˜`J$kq™é`D æQÑzölëš-”e¥–²›þÕ¿ûw—ÁžgâŽ%ûPåx,Ö3¼çÊÛU/×Nÿõâ:]ô“»^¾´½ù|z ¯ Ë/²Adžîv~9‰ŸðøjýýF)í·wСBþø†ùÖöú¬s‡n”øŸü~•Ï{Ø }­ý '‰Ï6ý Яg‚w>BqUWtáðó·Ì±´þ5}üRôRÉ×Û>þ©öWÀ/Sz¾Thº¡×¿¨Š<3Ä^ îžV?¼rÙ_¦yƒÐy¼\훜œ_jõ¼mþBÊßÕÙSŸpZtUªrÑ‘¼âS}Ýb/9uogû™çmO¹±k¹>Ìw|}m=#AŸî*Ÿ[æZ÷~6œïXÏø)ÏûÑç‹â#t’êrSV¿˜ý·aòlñÚ¶ÈÚ`ÌgùÅ%·”é-ær¦6(B<»ûgëîÛ7vÑÔ'% ÏÛ n+÷xÝ«+éê¥ÛK7 ¯×H]ž/n¶9t`ÙðŽ‘G.ÓåVè†s–„³wÏkÿÈ6¹ECºqÓ×C{ãHÙ-ådŸçäm͹u‘ë„óW ÝíOëyO[ç¹Dì¹SžŠ—£A¼#œ³»Aºµ0è¼úf“áåH¯¤ËÃÖu ðjv®ØŸÍKÇ}öõâúâJF¾°CtkÉçv×1Íí¥¸ÊõÊñR6Çéþç¦ ÇF4Ϧ›ËƒÂ±¸äìÍœLäåÌyny|È}?b&íy5€@3fã/uóayvá‹pxÅøð÷ß/Ÿb¿¨÷÷ûýÃwßøT§yî½GÏâ=3ÍMÊ”re<íÑâ›oÞÝϳïמóýüa¯]>üø§‡û»Ç½Z“[›«^ý~ŠˆÖ˜9Ü€õ?ÿ?>däþ©µ^”Ù ˜!·ÜyŠ…ì@ÀŒ¢`LRŒ‘î·¶ÙrÂ7/Ím 3d :Tþ¾åÆŽÖ@ŒAÆ—6X‰lPÊ Œ¾f`»7mÚAš{é-°[µy¯…žt¸-Ë„hðb)¡uÔ »d #wïPÜæ©$:<77‚Øî| ¿!(Z?¾_ŽãaS^áíñÈ­þ@L¶%ŒhúvåACêÙ`ÝÔИ ˆ é5jæÊQ³N¸e¦¨ðn¬U=E…ž0ƒ‚°NÂÒ`”gC_¶¦ö2¤f0%RÃc×h©T¸²%¢«°˜©–)2¼"¤P°fFÊÄžðD†Ñ a]DïïQ=Û=’4õOº×Ý4ßÕAbpÌ‚™;§¹>=¶è’ùÝ\ÛÒbKèæ*„$pw˜åHHA¢MÇlg¶@ TÈJŸ\$ eÊG5‹ú(óLéL‘ä`ƒŠ‘É;ZB+ô;Ã,5ªWSO™f°?•Ö4MÚSi¢a íˈ¨8Œ+0%Ôpc> ïsALb(ÖHP©Ð g!µÙK˜™Ž¬ó„ ™3-31›¹ù‚PÉê¸W‰ô%z1á]”}‹}dO4åD›èhRH¶b ð9)áiŸVôÈ)“¨É5мÒi9‰Qðh™=³çªhRÝÙÊ^¬—pgIEiXj),u*j9¢wž ™Ù4Ü®-°¶\¾¿l½g!2sÍU+ÐЇ¶Þz µsi ¢í àDuøt`Øêàk‚RàDJx!1}ÛL2au³ 1icøGï[Öü°ÝP X` V=Qê6u¸o|ÿ4D;¸¡Ü·ÉaÛ5øV8…g¬ Ü¶—¦Q9¤Qð•Ü»ŠÁ‚rxdw3‡Yö†8Á…ì0<_9”sDµù—ð@,áv0¶MÙ!®*ÊÍ&™/µÔ‡én*Ì]ÝÏ“Yu«ªÏ•µxÌÃË"ÌzuBwóßá‡ñ§öí=¦‰…LiYé@q»sD˧e‹Ãd‡&™q_LK9YK*æ™id)®Td@õ^DÚ²öÖ³‡2iæÅËTËTÿÅ¿ù7‡}¯JÆîÇ¡ò"²íç5)ñ¸ã:÷æ9”uƒùP§PÍgþç•?×õ&sÌoÇüŒ£ Ë“ý<ÉÓÄË˃ ÞxÒ?¥vœ³^Êß8ì1u}¿ÊýçMï–¬€ 5ðƾõæSI²ó©âÄÐÄ•'Âuxäøsò¡[~ ^ÍÚ;j”Ï5 gˆ•ÓÃÿùÑü…èæ;;m_!T\¨<>žªžò[-‘ž (x©K=?€>¥ÓO½%y¬?ìóÅcÎÌYÒÌKb¦Þ@5N’|NðÍo9ªè i‰G![|ÊÙ€xÐÎ×4¥Ÿ3Ά2Χ›‹³àÛ¶¯¾ÝŠ]©^'²¿ÎqÌ·ACç C³â;üÔÉ_Ô£~ê8ý4Ôþ«‡†o¼ò:Fò…!¦Ë ùM‹+] ïoêÞ*ÐüÌ2p¾< Ÿ£O|éäôÖw¯Ëu—'þgY¯ÎPRn ›ƒñ8t»ï¾ÿã÷ËÇÇö´Wk"}ž§¹Ð]PôbJñ¶¶ùnzxxâÆ<ÍÓ\ÛÒûþñû?~ðZê·wú±·žFø\Û?Cñz7[Hûý`&J-a\þ?ÿï»*¡»% Hõ”@8œ0: Ú¬lÁº›3€—-%–†#Ùbc‚€Z‡gÍ„ÅáóV(0æìM,#à±EùLÀ›Žöˆì[V~ê Ù†®Žj¬©u]—k™k­sé}‰–f6Õ»}>‰9͇[uÜ}»E`¹ôž x=Bò âD7çá¬<„À†7«aŸËö\ƒ$n­ƒÉži0FœèÌáàm@•Ð]–@¡%¢djݰA6•©«–&šÓ&2&àJ:2eÍ`ÐÊÊ¢Þ°,[Mì~CÈhIw‘"‚aš* K"²ÒÝj1¢¸™í¥¸š†èïÉâ4ãòÅsKÛàpë…;DÁ˜•­+ržXwõãjÉ»]u²·è=ÝFr4›ªÙò¸¶I@ZfZªƒ),B1cj4È%…‡ q!ÔĶ¥¨I•*ÆL6'•–Þ•3Ü1R©Ýä‚Ã(PRŽt#ÒSñT´Þ5ýèïd½ÆÝ¬{rJ{d–•Yõvâ.l* ªK÷Õ¤ ¤”2v¬ ˜~p „(¨þß%P $ Œ- &3šcÍn†ª3’¡x`%쬹U>Øšyo>fì5 ‚ƒ… à1£’–DÂ$"±£/©$`\L¦¾€+Ú+¨ÝªYeœ D¤«¬Ù­Ö‚²lkóÕ¢ÈeÖÞ"Dk¿{xèkß÷U‚É" ¡÷A©ÊèÛ;ξÅeÒHê)t!0¨WÃøw Àpˆÿ/[ÉQ©ßð\Fð¥";4L5*`„(XgÄ‚ì€m“À–RRPš1Ì“9zaìÛ̃ƒÇ@j°€Mó€!‹8†Év®²Š P˜Ñ™´Õìx>O%‰+Æ9º Ã>¤xàKç^˜`Bop‡Ú!x¨Ì6ž[&‡‰z„@¥XQÉÈ5C ™¶SHròb^ë´ Ôâ>×»ÝÔb<ÔZ&{lj²ûšÕH²‡ß½C븛íÝÝ¥)Äe•‘ÓĹÊï-CîHéêýš»]‚xZ-ù4O²-Ù_‚Ûfœ©õEèA@‘ŠŒÑF™V¼î¦»oþöŸÿ«ƒŽ;Êkt¨N=ËÈ:KI¸>GñŒV{šÎŒKi÷+šŽGô£ôú:èü*›CzÖóF¶úEÀéöí“`Ÿ›¯çÄù@º€µëƪ'oÝà¤^ók2h¾VÀ×â!ð*Lò û¿ÛýŸŸÝ¯?£à,ýígùú™óhßö~ŽZø/]À«Ô´ *úM­ü‹>Aoi,žÄA^jºë„߯Rp­·~Ò£õWÉÂ~Ë7¼Zøò €·AŽ|¸Í7ˆÇê›ÄåßPÀ¯¿ùõúlÿÓ+~ÉÚ»_ Ýó³ô>Êoò->Þ/Ôyn¸è~•¸XÝø™´¸M~ýU[ÿsqh¿½êSH@ø³špQçð6îÿ—Ç®4~Íy—ûœ×÷–UG_w„œ9ikk¾èÃxc;zz¹>Oé`²þ|¢:$íQ'Káûÿöýòá±=îµ¶R™§2+L+%CïÿôþÉößüáÝÖý~}êÑz¶þ;mK|xúqYWeNÉ\š"zô»y¾ŸÊ/6Ñ}Y ¾sOe'AÛÿçÿ¯g×¾+žLr°ËÈP¦âfZk¾eWHŠ>RÂ79 ‡œVsGô õÜ(Ò8dÎnª}T§¾á釗¦ Z@;””> &ø„‘ÞNC!˜Ènî¾,+ÀRŠ„RŠîÞ{OåFù0Àà9Û†Zìnš—\¢§UÀsø|n £ Ÿ‡iÞ@!ßRþX¶è˜:àèû-Çß…©¹Þ¶’…bhÜ;"`Ð&õ‘2è>ÔA?A5eÖèpXyüÐ#èâÌú´_;Ò*–cUƒÛ"s®]Ý”+×&NÛ›âÈ„è¨.&³3ƒjiUu&°JÑ»³’V«›#’TI"W¤Òàe*‘QŠ•]*€Ä ¼!A¦ÐëœÓ=ŠÁK5¬*„¤©Œ¦»im @­^Ü{À0üúð)è™ÝX¥ûb»RÖÞ?¤(Dk¢˜HÀp¬N©š“ìÉ PÆHÕÛ29ü„l ™)pÂÀ'$ ¦ ƒ“\+TÀÎ]Ò  ¡fT_ z @7P¶†²hr*e†áÃK“½a:@ª&ýÈÜÎSM9ÕiÚMV>çT:¡Ý¼›ªHxa-¾ªû·S®k|\f|x´Zè´jðŠøð”\ñîv“JÉĶR³%˜1‘:PþÍ23z72#”êk‹ˆQB¥Ì$àµZõ³Äÿç NÒ xDóÝ(/~ÛÖZŸ“*ñ5%!¾ž¿õuõ‹›½Qïxã’øâí3> lüósøŠ€+ám»Jüd„ú …¿‰SÌoópyòNô«|úÉ —é_¯iì?´uuÀÔoã üËÞv3Ûï_÷½&|ƒFçÞ*Ô¿&·ü†•Ç_:{YüíSþ_w~É–üf&è'ÚùÀº®J¹éÖþö€ßs‘Íñj[Ûy Åià¢6R'U0|¦×ÜØ_ú¬jKšõIqÓé7]ÆäŽk÷%ÿüºgRØ1÷Ÿ·ËÕη°<ÔûŽómÕº¶Å 3 Ò kA´vEP¡áC`0ÅÖ“d}°hb©ËÚ-úب3Ý*àZ#"E7w–6³²Ft$Ú’kT:á"ˆ¥AY'š 6¬›Ó ”¶¶Ž "è}-uÚíêÇ=gX)…¤Rûe…²ŽtõPJvS©-P,#RÚ „ ‚¨`t@¡Õ¬Ø ŒÝÄðÉ&Ip”dl›™ªì¦&·D.M²í°GêÁñGØj/É BØ ¨@b/¹FëB%Ù÷²9ГY)†}ì9ǘ 5> i„ZÊ·XІé‚!!3qG/fkfPʰ–¨áßdý1Úš9ÓïÍ?F4%‰…´*ë0QPèТÜÑÞYù˜AðÁl=IhÙA#žR fãl,´ÇÌ•Jv+°*3ܱÈm¯ö¡=õLCXK3·,ŽXrÚÀ5³ÁŠh‰@ß§'JdG_¶Ìt¢oØýãò’'iÌc‚‰á˜€jð >¾¥e§õ°ˆÛ¶c1 û=jÅô‰­°i7o\/:êD®{xj„$3a êtX’Û=‰Z !ÛÁÅàe£¬™O궺+€ð²9ôXRÜflô&€4ЛƠ)Vó¤ßÝÏOïÞému˜o¡ÖÍ8nY£…H˜ÙäPh,æžiæÜUŸPƒ6Ùdu*»yº»«óT­–RÖ©º(ÉBú¸†—\V°ÑwU=Õ“„FéÐTA¥€–tãÝNÞ ¡0–¥EjžJ1zÉL%“Þ$n¥Ì˜cÅN)•Ñ›±¬ÊèhF3+>íæù›»¿ýçÿòüüs\;bxà*\í Oj2O¡‹<ßWKÏ“ý1rwzÔ°œ †Æî`û  ¾ I¼Ty|ïä¶á<Û£> ¼Ÿëê xz>¿­>»æ‘WËçºÉë € é²2àú#ÏñŽ/ÄžÝÌ\ u†Ãäq׸57¯1²:EØè4aþ¼)^ØÌŸâ‡Îè3Â*î/#€xR rÉnº*)?zU^wX}%ÉIÏ ÚêèË“§ÛÝçî­—º3^çÕIgÜÆi“ºT|øÊ9VºÂ@Ÿ>ß@.Ÿž-ù’Þúå\<ÕLχ¯Ï°ºq.æñiá’ç²ÆIg"ÃËð“ëŒøsDZ¯h¼” žMN!n¤´³)â´ ç"8ñ‹GÔ^úÌ·ÿÞV!¿ThÞv·Ï*ËÅŒt›õ éå¥;yæôžÜówÇg^2xÊ »Õ"oäÌüeCçoÂñn—^j/M]/¦?eô¼NFºÙµn®æ®KÀêÞ‚‘OO뺬¦¼ŸëüÝÃï+DóÙ,—Çÿð£gEB½¥™rt•$i‡SùÚ´A~h¼äÑíÁmcYHˆsôVQ 40ý†²+ryVÿ m¥l»C¯=VF 6ŸÏá °9â nwÖ|j-Ãæ·º—jµeêÕY;׈Fd»»;ûu%’n©¼»¯µ”5ZÚ‰2AØ =ÑCÌØµ¶E# Qa^'Ö …歷H5ÁÔa†@ÒØB ±lƒHDß„¼ì@‚[ý„Âä†)À€B™„6 _#HFhÓ*tK÷eéô´ô4s43Zx‡ÀLp0 ùzƒªè`@zÈ­Øòõ3³ NÖZD„êÌ HŠæ{0¬ÒµzP¨^Ù£›!3ܬÔÒZG€Ý4µýR&ÏH} IóRÙ†'‘B«¬ Aùôñ‰Ý(åãh<•*´at£MÉPD.Á o€iÌã8`úÆ\4¢FãðÒ%dìƒzžÚ ³³¸<ås®¡4‰´@ŸRó¤³[·Ü9h©9eȽÝk')̰‡EG”»ªsMIòéBH ›Ê†~9ìZ¶ÝR£'²lâ6X'g M²d"‹¹‚LÞY-436Ä“"V;9RxÌØ™Ø+œÌS˜iÃT`c8g“‹²ld/tàÖ¡LÆp=%(N¹dè€K+´C±Œth™\ˆÜßÍódSÛ·=ŸÌ! : ÈÐ׭Φr¢­j††îŸ‡ Ž,±<ŒÔy¨ÿÃhäx(u Û+ð øfº[*z ˆ€ØÄRKf©õu5‹1ÒGe ÀºB!sxAôƒ{ð´ù÷ ˆ¶I /ÛM{EæéÜLѹ!wxZ d€¯Û|K":zƒÙ˜™Ñ—Q´¤1yš4Œ‘=`aÅ;÷Ëû¶ˆ#ü@ÄÁ»e‹Ô—«<¨›B«V ì…¶uïyçxÐS2à¯6íêìÓÔvY+XKZÉÉÚÆ;Š~Wën*`®=IÔB3¶>ü” ó¤R0U¸k¿ç²Ê,J¥I!*ŵ1•µÀLJAî42F£KõµGëÙ##†Ó¯÷Z¼ÖöwwÿÝ·gÞHÏÈégWßsUðÕÉuµþßyúHœ&]˜u}~ù1ÞRðS7ÉB·¥øÃ¾˜¯dóžóGŸÊä‹g¿Û²NÕÀOï ‡žýj;la‹W…cœËÿ7’ó^UÍÞ\­-鳵ŗõ ½Zü𜗧s]zÂ|žyöZøEþ§~Us½)‡ê†€ŽOZaà-õë~ݪ8Ü|vÿgáaƒóÁ}Eˆ~Y){õïßVý.^ž¥ôšaæo$?úÍàÏÐL_ý”kÃ/óZ¿6B¸P±_ ð|¸óäí¤ûþü¦Ðù‹{ãe_élÇdùϳ_û9BkŸÕz?ëTpÜü&@ýúòns±Æ¾èa?Ì¿hþÒoøå}å]äÏs‹:³óþËø:šãžŽ¾m¼ý•¶ÝŠìàdƒó‰©ŽÛi•:~‘ÞÿñOûÛã^ûUOûýïÞ­ûfRÙUÒGVc_{Dþøãû÷þñ?3Z{\RŒ5Uâññãº_Õûn7MÅŸÖz7÷eýþ?ÿýï¾»·:Ù¬“îûÿô'(z*÷ö´W_Í‘iD’¤Á4Ç‘Õe/@jÓ‰ "Ê–-# ðŠ2¡õÄ$Ô¯ðºÙÞn8  R@§ÄC™—@ƒ:úÓFÞ7ƒ„H쟞ÈÌ¡[9Í­¬­G†µúnÞ™Y¶'%2P&ìÛš»‡© w»©õµxéÙá9nc@‡·G¹eÚn„ Û2¡>QòÝï²=AÑ—‘^ EÊŠ@Ä:Rk-=£Aë3kÛËÖNT2GÞknÿ:˜!R‡ µ”5”ëˆÍ仿®Éê‡ÇPGÂŒÞò± •»Jhñ¢HhB˜Xlyd¬VÑIã–Ì'Žº ÅážÁ0ÀçÚz§1u2d€¬³ÏSéf˺Òi§gö¨¥ÐÈ`DÒWÈDv€ÐJ@Ñš¥Tk=RîÅœ½­“Dss‹Do™‘"Ý-BJ-©}ꎸ«¾$ÇãÐ'–äzˆ.yªš(†É¶W'ƒÅ’“eôdPR„œÌÈœ!‡‹Y]FJ9™¥!S£³JžlFUE #?Z[9U½s4jÝû}ÍI\¥Ü¬ ’&xj”Tp¸­Šù-‰¤Á4Ù˜v’9à9)L #z"HT2KDq»Ÿê÷m]3Ìñ®TO:ùq I]ZZCg i±*•mFâÎü)À.ïèN>*BX¡ÒL›h9Ñ…wäìL¨;ÜÃ4e à½IpÝù¬‘°$õ¸.=8=ì0WƒS)U=×È–eWäLyªôN"2"A9¥Z™E†ÚÚbm£œÍ‹{­e.÷ß¾ûg÷ÏŸ“1N°|§úí³3¯ðÕ˜=z. §¾>ðòÆnêgæjÞÔ@/_e§­pÊËøë×'| Žp¤¿~}eäÍ€ŸòR`T¿½¡þËa‘¾öÙö³´ø×óÒk–¿êsýCç?+ð›Z8^)yéu\ä |‚q3ˆ}£úªs ^±ã×r1­ðê×mt5]E“yMJ‘nÉN7\†OXC8¦ìžßÊMåq2×kœ”ëT…k,ËI„ðò›=Wꘜ˳oUÈ<úƒ_"ºóÂzô¤š“§ûvñ¬àð¢˜ô¢NìªÌìÐ&à3ùðtO{D‚nz¦Š_Šè´BïF°n´9/;÷Y­ã±Žê¢Wè2þÀóœ{·Ú›æÀóÔq^­ö<9Zj"oìÒ5úD$>Tl ãõr`åâ:Ô ÈEÔm“çÓR\ž¤ˆ#äç±óóÆä)éò ssìá S”Îs¹¶Z=oaôb5ƒ®¦E¾’±ój úXp÷,7ëä÷—Kƒô9³ì–RGÉkk±>-ßþþ[œiÔÓ2£N“¹O÷SɘªËðøáÑ‹¥¢-K¶þí»Ý\¦u¿våšmº›Ë\!‰±8¬==R]’nDÒ|Cï Vn2âY¦7XAq`Àpüyò•6õ¤²†œk Fd¢-ðJ¡5!fÈxhvAëf°9ì.KW(‘ nèûL7%–ý™æX–u›1-#‘ifØM‰ìZ½X_ "‘L~è4`Ø]2![iÂ\¦’}E &)iÞ?>®ë^]æfõP6Ä]AXál¨öAh( ê „Qf°E8iLe™j N¾ó{ë±rß[’ø<™õˆÇK—M-Iæ]ܵµtÊh1ÙìÅ—E s@Ù;²këôN+¤Ä fG|Ô=Ðá@dÞ}ƒoîð¾*mš&##û~¿Ø½8®K©˜§º¬«†ù/ÐöM‰žÙº†ÃÀ­dK‰±öÞsL•‚õ5ÀBcˆ½u/n!+Þ{*e©bÜw=-=ͼ¡Õ ™ƒ^É"Ðl•:Ô¡,bRfœ,'ƒ#çTÁ•ÂŒ¦L§,•C£ŸŒJk©B=&+©ëIX]«0 J²è¾J`sXÉP¨Úfc’âд5(‚”ñàá|0Ù0Ð7,Þ¨ F¿ƒmÓÑ GÑ®­ƒ(éž~‡’ÔÚ£˜=FwP §y(SN{̾Ï(fNQÍB˜˜¸£ø … À"u FÛgvh‡Qx±Í "çäCå“çJ€ØÉ“‘<¡3I­±º›æ:Ö–…îPš›÷ÑêÙÝ—ÚΘ„{ ÷mþ…G¡¿ëúÏC0`äm™a¾ƒH¨V ²-Â#ÜØÇTHÀ ܶJ¦èhk>6«îVéÅkíO2s äa¾m?ÆFÒ +î´QøÃ܃¤bÀ1R>o¡S{ô†ãÒ2æ½±fÕ‚Ra«è¶l7 ¾EÇ=#`™°1 Ë“2Q¦\Wh¿•dˆaÍ]@!W¬(u+Òbµ21ÉþqI§ÕRá4ú}™#ó¹Ú·}ŠÉ²VLé¦2¯êÆ|W¦¿ùÝQª[di¡ÿå}”bw"8Õì}£ ºëá®™7º»åÚ«ôÌ(‘æÝ2až0–Òª YÜ×Þm¼Ï”"Û̈µgD¶ˆ”;K­>—»oü³¿ûç¸*ñ=Û`®ÏMžlyVÖMÝØ·n ÁÃy¦‘á?:;>ê4™å û²-îM¶€ûk¨¤Âå–ï¹Tù…}ø-OijÃÒ­ü‘â:Rtú¹Ø6^üÔ­}ôñÄ(Ý®‰×©hp³8ö“Ò¤çcô)»èàø«3”­®›z.ƒÞ:â'gÑó=>ŸY·Ïgù#·çZÖÐ9šV/Ð*NÈ/b[ŽÈÔYy,µ0¼.8Ð5ŒóFè@/æÔ\îŽoœ uÆæ«4 ò²D檜GbîKÇÜÏU˜‰OKägÐWCŽ—gðóùã뉡·*§Ïµ›#ÈÉž†Šž?/‰øEõ’qÖ ¼éCþÂÞäÉèÖlvTW_ò¡=Z¼®K¾„yóÅaƒ›¾ÇÏËÏÉXWSú)™íæòJÀõ#?Ïñ¨|ðÌ!_zõçê[ ¼À·¸õºß0þMCçOz×ug{É#祾îf¯ûW_óÞþ³×ãî•7ò:ÈèytãCŸ§ï ßùk½¾™/VGZ<_(òúèÆ<¦k¬ßµwTÂO ¤8îëõŠŸ¼Ý¼UXt£ªï½òÒ J±½Hc9UÌ.¤íç2£ËìûKHç)aÿrÊÐõ[>AðéêzÏ‘g·­è!ÍWŸØxÞªÓ:3’¸ønפ¾#ÎE—O~Zx?û›Ó]Òo:ÑÅy;ÃÝó<^GÑ^í¥<¡¦êºo}ÑîF¤éÕ›yét‚ÓíÔ1vZù !iÞxå—;´‹(ÒÙ@ÕíšîOìß.Vë“s²ÏxéÁN¶Ûóû­–9—â¯Ã¡§½îä£ôR×¾ù'l×˃ . -u<7è9زí|NÜ!Ž„ÝÁ­¤Ý>æ¾ÿãËûëã^û%—µÿþÛ:UºÕiæ ˜æ2YAÿÆŒ^*–îµÞÝß=>>}ÿÃõöûòûýÓãÓi~ÿî®—Šuí­õ§¥•R«!–VXBÙ‚Rdf&ª;)B094mÄ쀇ÎMÇÄhcå+7_ÜRá†ÞF^?d¨;ø¸¡D ¸qzØÍßüêëûï{×&’ u_@RÃyØeruõ%l‚ˆlòÜ.3«~—†ÞŸŠ›ßÍ»T.}‰}7ú4•@‡§²eˆyW{oN—‡`"80òˆµ™ Ý0uWË\Ù×̘´dÉj¶Ô`pHFê=¦ws{\­¨ï!¥²­+¹@GÆVmP}+•°QO‰HÀsEhåc{tѨÉÙªŠYÂ×§ÎPv!I¥6ÚDÕTÌ’&–Ê]}lªñÔJw6¤Ñ¼X5¡›E†˜Ê–{ÜGÇÎN¤Ba^çwb]‘é–, 7së«vw‘z³jZRÌ$$Í+µæKÙ’§"²‘n%––-AÉŒ~¬W H› „&!sgæÕ{æÚºK0옜­°á| #;ÔÁ–Q ]bU#F´-“Ã2ÐSÝ@ §ë‘l©,SF¢Öä’Ô”w3ôÑÑX‹¬s¡l5$(Ȇè*°‚xé„§¹,¬$#•ApX«K̆Ä.9‘@ šÜ˜„8™-lè–šaß2ƒ  —ui¢Ïæ)Íæï£'ô­×.=å6°fZ—ž+tO&±—h÷ä|O°@)M¤ }*8\lÂ4ôΡ‰h$1É{¦9]|’?¶•®mpõ6Ý[}>Ë“ëÀ6½l5FÝÿø«;h`„ìðO0î§Ã®ÑµeÙÉž6,¬qD0ø_™Â|R\¢ÒYJ%i𯊄ŒeD‰JÒ<§z•(“I@J…™  ku.eÊu†´h{(óVË0Bq^#žj`E™¡Düþ9¹d4xßëˆ8µ šà(dð´=ÆZn2F‰Lê 똞d“—ZJWvhuV/p'ÊÊÙn*0¯ÅæÙÖðÿîŸä»9Í,—. -t?óŸüÎXôî^ë£àÉL¨ƒJ/ܹr<%XdS†Y+¤À.ôfH©¥Ê&I R¦zE¨÷ì­+R€W¯S­sý—ÿúßèF.Ž.òhx‹‚Ê‹Ô)òM‚OD™+—µgËÓdœ'VÜKÏÅî—” “po ggŒ“‹?'»½:;«ßä"¾äî;îP$^à,Þø›—)”ÇD8~éž_g>¼:¼è:°ÕŒlú×9±ÿµÔœOt˜sÑNºuªÖÛö7›Uo8T<»Ã=kú¦qŸ8ß:•NúôùA—ŸSÍ×O)·Å©×‚g7ÆykÛÿ&Áè"®À/9¿}ú…ò«æ°ë%˜ÉÑóáB¼&®“­.ô»ã5߬e¿ C$Þôý;i©—EÛ—_åë%ØÈµúÿešþ'ï¶F~qþ¼µ@ðåqs;øñŠò{“*sÚ&Ç<ÀŸ;ïþ/:iø)½ëõnüUL¾êàúÂgÁÏOúDà¯_¦_ŸaÇüׯßÞ‹Óoÿ.¹ëA_y?÷ׯ_ë šljó:úDBC»Ò³Møñ€õá?îßlû\öZÖö»oæÝdµÒÝÜ3ÂÌýñýSJ»»k¬ïx_j¹ÿöáîÝ»ŒÑÞÝïlmûÇÜ?.m‰®xøöÎÔâ‡ù÷?żtýá÷ón^€÷ÿÇÿÓ]u΀Óí¨¾µÁÅ-h2;Ä4ˆ„Šw„à ܱ.`Ù–ÄzƒUX HäàW" ‘a¥–x|ŠökççMà$†,O?àþÁÖ­}ìõ–È‘H„ôAzøìû»;š¹ÛÓ²ÔR3UË”hbD6žÆ@-ÅP§Zz,9Ø ‡bXE 9¸íCÇ3%…EÙJ­Ñ#3½XÛ ±lì ÊÚ¾ebº¯Šuù¸Bî€ûf4ê¶A‡Fl@†å×Áî9z§bÐó¥‰AÒº”ëšM™ˆ¥ LÖö}‘Ü,BwSíkt¦Íƒå¤fÊ Pï V‰erWt`A´Ì Ñv$ ¨Ì®ôRîQÙ¬ª›ÊÒ3 ~||ÒnWK­^žökÜ…LÛ/-"tPE¦Á•2s›’2eF€f‘B ¯2ô[$èÆR¤‘f&ÌzÜì=…ŒjÖ”MØGTâQ‚qÚ¢CäÜrç˜ÉBLŒ€b¤ŒÀDÌ2˜>˜' Iƒ"a™w%=0ð\ÂÖ•YE*Avæ£í:»5Õ­Ê,ÑMæè‹]2ëð…u°€I…ÉDK ™R0%„J%*ÍñI;"G˜’Æë“ùÚ³£sQìÌ÷…ö`e…@úHÒ -¤‘Â? RHh€ƒ•ð!3€ôŒØÃlO*bjÑF‹I¬¦ …¢8<­$äbYJi½G* l4O%­·}Ú¨w DGt0°<¡5Ôºy gò#È3€ú¡€výøûÁ³©¶Y‰Ð°¶ Aæ[1œÏÕ›Œ¨÷$UÊa±&×^‹èû}_©Œ2• åÚÇæ#‚æu؃¥GTRʹÄÔ(ŠÈÌ(ó4W#%„Y#‡ ­ÂMJŠ’£Ì[hµŠB_·id÷6Bn„ú¡ØhcsÁëˆÇͱ Çö³èn%hˆ„Sa5Ï- 0ú8JÕJ£¹Ù<Íw´.À½ÑD÷Z±*'«»iê 9Üý÷¿M¡T¨g\xÿmy÷-µÕ8É(×|ùs¥~«ÖÔV ð-*ñic=#K žµ¹Nއ.Ïf>— pÃßèºÀá‚üsÍ:åáG<-Ø=¹ò¥ª|5tšNtõF/ÚDgˆ¢« ü³:Šé*i_¼  \ÛL›ï4õçÚ“wkVž<Œ^ì«W•Üz¥“½ ?Ü×2êµxÃ9[ê² ÏÆ(o$’§ƒ½6(?{r9Öu“Wã¼jª—‹s¯‹0tRpqýþÞ²Ñ:-mã±ûá ]÷L˜ŸÇ^0»ã%Íë$(ƒÐñ‘NÇË Ðö䃥:'sÏi[GœNj t˜EǼøá?ì|ìOO¹¬XÖøGß•Á¨&Ý=£/‹ÏÀýÃ]-=Þÿð>Úúôñãïÿ]_ƒn?þñÇïþð;“ÚãS{ÜßÝM¿ÿîÝã÷ö?|ŒÞÇûý–^ ¤ê²Ôÿ¶>ý?ÿǹ‚=£–ŠžµÐ)æn®3MHcðŽÙ¶ÏVG™0ÝæÚ‚Ö¶‚€Qá°Lð‚ìqÊ VÀÖÑŠ¾æ3 jè øܸÅ~-Ópˆ=Ôzˆ1#Ûn7·¥gD"÷OÓ\h3›ÌNÛÍwôLe‹Vˆê%²¯mAÉžÑ{n¬ß:8pZ¥9’p7³¹¾»¶‡,ÖžR™‹•!dšÝëÞXÝâýþ Ü8$F¨@ 4˜c7ÁáðYNR G¥EGO0e݆¡%Bü»ìÚ/ëè›ÖßV §jFRiÆÜYkA· +¤íæ•Ù™E–;ów“š`“Ñ2BYèò2î=#3YJõ5?Ü.¬Ne*åmí=ÒO­}\Ú¾G-^éÅ="2ÍZ×Ý4ŒÇ¨h=7‚»Û™5™´ýÿ£}‡`þ~‰È¼/˜KQªîïIO!7PŸ)3cAΰ»ûB0FzÏH¨x*Ã\±AT†™eŠ©Œ@ª­-{ïkï=³ú·ÿý»ï¾ýöÿ^7·YÇ•š<ÛœAÿ?-oë¥zÚ‹ýÔ±†V×{ž+é_A§x­ºóäzíkúùrÏ Ýõ­ù¿:gåžf;êSuqØ|®ë&߸‹Ã!ýô*º*`?ÖHûéñg’RžRªð\·ˆ+Z×±2预âú¹®±Z¼âóNê(õ¼F<¬^§X½¼ûÒ¹¬;.ÿyï§ ñ¥ª|”Oy«úçvpº¡ÿC·úèóSó…‘w,ãU=ãMÝÿY–>•L\qðúGÑœWRøŒb¶Nva—Zìå›/GOvâµÿµöñEóäÄ‹¯Bg»Ð[~ºÚr¤Éåsz‘lóòŸTt~ùƒ»¥û ô:Ñô2p|=×;gÞÚ¦ëuÏ÷¶8GDé²én#ëæ:qvh¼èؼ:z=KÄÏÛ§»ª«¤›/âzøœV$_€9ŸÙ—1œ›2ý ~ö¥ç,K½rLP"æ[-ü6•Ð@Ã’,Â.0ð"sDâÁ˜BtNF[iº'Š©Š]J ŒºnÖ¢†Q 1ÀMt1¥>Œ'ˆÒ€¾yä ‚a|‚8ÀÙʾ÷Q1&£ÇèO$3z¡ òCBEBMêRH!ÚíãW9:`ÂL~€•w´ïè …ô¨ÜÁê@K%Ac5¦´3[-ZF¦¥€Ö2r)ÌÀ¥‰Í&×ú]ï ý´¶ÙàërGĆë9ZþŽáã'jÇ`wÐrÝA"µå‰xW@ ƒ†:¡ÌÛDîo+ƈµ”©ŒÖ儹CêkÝ|V@¤Ñ¦€³2E‹*YfuOšIæÓÝ7÷Êž½œÊìf^̲g  ó•⥖Z"afÑö*3¸}³ùµ„QËc¡Óá+.Ûj¶¦ ¸m³GÆ3\h˜-8 ™"!DBNït ɘ!îµLŬHnVööÿgïO¿$IŽ-?ð^U3ÈÌððÖn²y8lö·™ÿÿ™9gx8ÓÍi6{{xXª2ÃÝLUäÎ5÷ð-"#3«°…B†/fjº^ù];íæÒ>®|œôqá jéß=ØãthÝŸK£˜=ã`¥¢J•Í:¡2ÍÖÚá°—Æ Ñ!Eмtƒo‡£ˆŽUtŠdfFFëêÑצHDaîÿæßý;¯õÃßþâöy‘XÂk[¤ç튮NK7ŽGW[¾;ži¤Ž~G½øJžß|†¯ØzUÊûÂâgøø¼•®NË—é·rÉÅYòJ¸yýøÕVŽñÍÒÏía^øùWeˆ«Ý%¯ËÀõ¼½Îà”' îx3Gã^©W»ÌSb›>/_ëþ‰ä{}G ¹s¢¹e óE´ôEÜcs0׉ºL\ÎÁRwqsp盢?F˜ìNráµ p™ÒøZ§:>w}ѽ{–=k®óè˜^þ|Ý„_’·¾ZQ}]fý¬||v=ç¤&¾Ô(w¸Ä¼=k¿ lŸ‘Ž> `ùìËô¹ÈÇ[þòK±õwß|n.ïE¦ËUþ®.2)ùZDûf2¿©yÒ™j÷Bwzvæœùþç ÅYç%‘ýîÚzÅ#ºZ²Ïßþ™hÇOOmzÛw]üò¥ €Û]ÈWWœIÿŸ¹ø¿"€¾v¡ý¶@=~ÒZD~Á«þZùן/ _Ø}ëO´ñ[2oø#_É*øRâä[p_Ï·ùúIéì—GËÀslæ3Zt;“õˆ_ý·Þÿú‡¶t3+Õ­:«×©šÛV¸a¢›–¶ôJKµO}úÙ‡OŸßÿóo2:‘êÑ{ûðþ²×ÝxíRG.Ò£yíÈÒiR%¿£u¡3!áè7ÆLéì’(M"°3*Š”9g†S8@ Oéáó¡1~¹‘yptA²ŒgHš„ ¿èQ‡4ÔºSâ?@ ÎfóÈ«„^À ³m€³er‹+ nÓ£Á`¤×bôªcñì]#Ä$¥ˆY…’¤ûMw›ªÄD¹¹–™±ts,3mšŒÌè#Z*iîae`¼8±óZ|*Ëþ{õPD-Úpa 0˜)+J‰¶ÔFdGåVƒ9Ô+Ì`@&|„8Àp}’b¦ ³ê€Ôôyž‹;­tBÕ£–L{¬¾º—÷;¶°¥—¦FŸý-¿Ëú³Gö˜g·ÃºØÉ-ZΓ€|ê}ÞM»s*AÌ%³ïŸºµ¨Gßb÷\î¬P )’ÌÜÎâ2RSf õˆµeE@¢ñßüÏÿ‹ÍõÝßülš¦qð½H[9Ö±^ÊLéHưé?ðú)ûOìxûgË9é÷¾¤giüëiù/GèysäàGA‡ñ-L‰— þ,æ×+¾¶Q¿¹àOmÌÿñCçÿ§‚—º‡ôYìÅs¬ý<Œñ™à"pÇè§Ð²¥òåㆯËâz†Cü8b_¿ Þ¾ê*§€÷^;b>3 k+#¼©Ù{›jÇ‹ê?à”¸­×®î\d½›ó|ÊÖýÜdw±/æ)¯Ï™Û|Ñûø›¢%¼’!¯‡>ßt¯]¼à5ô–¥A—¤¦‹ký$ê…Ä{žµ^1§¿8Zr2v®(/¸‡Ãº_L|“£* ÓK ø²W0¯Î˜gÕœƒ³±¥.Ý‘¿‘·I~f5ûÚõ¸jØËrW^–! ç=…8¯vÿŠ+Ùl¡žÿ\lìÄk›ëó_zn‹£Ÿ‡nJÔOõÔÏÉF'ÊÕfú«mOlcg=~õ_ÿûþ‡OkkÃàWFš™ÛHºt3cY£÷Ý®Æûl½¼ˆ5‡õðýLJZÒY3Z‚©¾,$r]žžó›ÃÏ> ú#µ› -%¬öŽýÞáI¾›F£Ø>` 20ËÜ=mxhšdÅ3¸ÆˆÖ}Cå ˆM&Ì/H V°Í ÂP,JA03$™GÕÏ*¢ÑÝ}·kÝŸ~÷ôðµhã$dÛ:Z\‹Œšc]Xrp{Zë»Ý$æK-•fFÛ·= µLë²®ZR©häêæK©¡ÂŽLm&!Á>„èA”RfP©pŸ¢5óŠD[šÓHœÎ {®Zž` +@Âíh³iÐðC6(ЦܑƒpÒ!ó›mrŒÔо‚-ÃXjE`a7¦³\«ãÚ5Ñ eöé ,‚÷›&Öy†˜Þ#WIy­‘6¨:F›ŒÊȦœrø†›Mi‰5©*õµ«’¥øþéðô´†P]è ª5¹L›¿ªŠr¨›d† î¹%°B'¦T%IZqOi†©ÖÞû^š AdÈ•ô-™ÄJì T€XµC_¨Îœ 1£Ä¡£ÐŠHÃ"šÒn0¤ !äT)÷ Ú02†%Ò…”ƒu&õŽ g{Ó”;$ì¥!°º«'˜p£q‹“=„9‡˜J Hª3¸è´L)‘bJHÊDB]pâ©'¥<šPhfìPkæªt¬jö®Ô¦Z)ÕßíªÊÁ¤¹îh–Ç]ygµGýÙn¼Ì0kO aÜÍVÕØ--Á÷A´Xg›aUh2^å šõŽ# ¶Ô9úšÛ.ƒ~–.*%"¢G´®ˆX{DôRþÍ¿ý_Qý»_þ¼÷0³;뼎;…#SëÚ÷•¯t^ܱßfˆ/ž.Ó2ÏQ„x5O”w5‹ûgã{;Ém¯ÌûzÜUùü›´žnꔨȗQ$·Ä€{'ú;ï=£Ù|Ó1Yçéý¼Åa^3h_xú:C׊¯Ÿ3ð\ÌWÍp/Ó$oO‡/¢ î~ó+zëUJµÎZùùht¤¼5  ËAñmbÆW‰¾4“ýÍ'á/¼¢³Ú†¹¿ædöÓñ÷ߨnwïk&Ø—D‘·È¦·è§Û/Ó½ZŸóÜê·\á½üï‹äú»iË›,t†åy;2åõÙõÍžÀŸï»÷ŠœxV W‚— ¿®üiŸKãÏÆüÛeñÛûýú‘û¹Fþ#…οùõç)üg¥zã2ýÕ´"]‘U.÷W@WÅ—ÃsÜ‹Î*xß4™ð´ž§îÇ/ ̼Ýù|M,§ÔsTü åm-MêÖßùô+ÞßÂâ‚›£;s¼Y~ïŽtÞßÍž²Vy±»Ç¦¹ÜÜ ó·7xEŸÔUäç\]>×sÜÊÕ·œ QÀM‘®Îx1' %Š|Æ ñr€ßF@NìeôÑqSy‡¿¨º:}ü©4˜—pÛË›>˜¼·hñl³úå žAˆÄ;›]v—;¶ ¼£þŸ÷Ñ»ºëe'Õ¥šf6À‘!¨®ç" tEÞÙ’Uø¬Hó†‘uùº5ߨ†5qäà¹5ÇEæ¹›nOƒ÷66gŒË/Ûý ×î‰ÊW6¼–ãõBn¼n®U¼ÙfÝYOPàÎ׉fDêÔ¬ºsü:ïAäèŠ/ïÌÏoòúQÞ¶Í-ëb¶äeHùX~«MPyÞ ÒG`Çxz:}B„~õßþùão?öêD)N3+[B§“·èró‡yrÅò´|÷ááaš?®Dì¾›séjœªGr×ò›OóOËÃþûÿßÑÚþË_è?ý÷öáÑ?<Ì_ýW[Bfw‰?«?KÄGþ µ°nÞ)wd PÅЂAʸ¹ÔÂÀŽ f0?> ôíW £LGONR)T ¡ì •¤àéÍ“×ùÓoíiÙ}÷ü-ÛµVº‚ OËÎÅæ4 äLµC ¦g´@¯¥ÌõáazHf­Å k[³§JµÉç5”¬Õ¦:=-m[ËÛÑGt$qÌÁ"„lr7[×CF”ygé= Ù{vš;š«¯jY (¨yo3¸ÿ½± NÛTj@4D;z8(ZB†L @`á¹î¦Ä.ÖgB¹fBæ(erÛ¥x¢ò±”"Y¬”w¾«~ˆÖ»ÑdÎ¥Té(ÖGI„ ­Å@¡E¯V3‰@Sïq"z¾{صC•™?üp¨Å¦)DÒ¢Eo€JO­]Ê>OtÀ‰HU7v I7‰BšÈST?{S5®b“! %2cŒL7_‘À’\Ý”)èѸd‚x$‚‚ÉÅJÔ¢U2®É ¦ÉuX¡eœ#pc€Š+“N%5Š@(DׄÍe‹ÚÆ$I!øØjgG2™´iØó‰b ÂLØ·éqЃº¥É4*Kö£ä’@F 쩌$™Bdˆfd—ž"ÊŒ÷¥Îæ]¹y~ˆ>Ó 9›+3 :ð3w+ð›ì‚vä#ì“òô>IMx‚fÚßÒW"  v⥈±™¬ˆ$¬s5 Ú͘ Ô`e3qƒùfá› G¯ï1¥tdßü~Û å6óyí¸„ †Á/¶ÐZO8P…8Ö1Ø1@/° 9†+2À eÞ–ëiF fÌ„µH¯@*:H¥Iøˆ(©¡-}Dxá¢óó‚âîER0­+åF ÉkÍÞ¤“nÔ6’î>¯û=`Fd“º` 2’„OÃð×FІí¼$•bfȈQÖ#DÈ– ßj¶SlÑ‘AÅ¥4DªŒ“°'Š™Õâ4ršçÝü`dKÊKŸê*4/Þ͘ªu=Îé&7ßwåÁþÞ~ñ>ÎS @6O‡·O j­“cšz[Z”2ÍcâY[+Š»r´xª÷&Cž¤Šúê‘ѳõX»zdæßÿã¿zx÷îáÃÃû_þâ°®îîæ÷òGtt¾Ú…Ý þßg°ßx3ÎÕçÝÖ³ÚÛåÄg#µ3) ÜrΡ¼{¼çùÞþøF”téƒvÿ¬ý?äµcùRvá=/îF pæ¸Ø‘éù;PÝOYûéÿ.]g+N{&‹^ÿÙNºÜ3½,/a,|)nO»Éc×ÐËægÞ„oÊ5;WœÚ“W›ûÏERñÆ8¥ˆsc¿3ÐÂPû’ºô5WÀó0x]ʹýÕ­Êü*ìèkI·¢ðÝ/Ò¥ëø©cð…¡Ä3fù q“{y`/ñ[^¿µ‹Cæ%rëuŽÍ­X|¥êÞâË_ œFã« ûKŸy;íÜmóל XGÒÎmc¾id½]©)ôÂ(x¶Ò»t¨{©C_±nî® oŒþÞ"€Îº ÕyeÉ8iÙoŽ|üBçï¥ÓºùR<ã*X~Ûò·ýüœbt¾:W†·ýW.ìëÜAtãîy>œX½/ / ¡}¶^O¥’îVüõç'ú9uq½ þ²øþ[+Þ¶¶>ï õ–/ÿª-ÇÍ.áÇoèoûØ t¦ða€n+¾ø{¿öÑ|ÞYa:ýÉÕœ¿Vpo„ð² ðGš ðs»ù+¯ð?;F/77ŒÌX3Œ@núÍ¿üúðÃS,M‘æf¥X-eªûO‡Þ²NuW …bŒ¹´º+u÷Pß=d°µØMn(¨æÑ×áº=@ù´ÿôñãøô°klïç’û…¥æ÷‡ý¯þ¹sY$‘3mK¨¥=ò²ÀCØG›°L2ª•œó#̱> 6À‚V!l™é£i­‚BŠö£ÑÖ¤A‰¾ÒŠ|¢Äh Ñ 9¸ÑŠÌAe.û§Zcú¢Hæ›ø>âr>#½„ H¤ H{˜æ¥-RfÇCö-X0•¹TëÑ{_è‘fÅkH)¡å"¦­e[ö1ÀD-°›$,˜D_àñô‰e"Å2›˜^¬/{š—bÙšZóJšeÉ Ôa˜GlÑÀ"§ÒQjÀ@2A"J@p!m­Á軇ymËÒz_髵ÈÄÀTÛ<•C¨AæT4$öm˜ëÎ]=B- ²Þ‚½gïBÀC‘‘ ‹L›|bʲHÆÌ§ïµÿÔxÜí"º™:´RëT+¹$(åÒ½€L¥ mÍhšÌz‹™© ’BÒì(ãlG¤K3v±eZ©.EÉ}®žR—ªÓÜÔbR–ÀŽXŒ“Ää0à[…URfxwÃ}:ÀTå®e-jL%æåÀlH¡:,áJô„‹F-ÁRàPfGƒŒ¹®|LBüäYÈÇîúšÄžz¬„´&ÍÐ ‹£xB ”m_²åGÄæŒq²½‘!9mhR4ÉžÁ)‰!³}Œ@Û¶öŒJËãJ8›™4GÅlgnÀlnRåÀÚè¤9ì‘F>`Ë_¡¬@H:òwÚè:3ŒD³4ŽŠ%”‰08·hñ¦þf±.ȶ6Ö‚D6dbTK ìØ¸—<Š{ýäŸ1¢£XgŒ£„KCý?9Ⱦ1ý·H›2ágê˜Ð;Jµ2Í0÷Z­”¶,fn^×e¤‘>Õn6N÷ š¹Ñ æÙËØ?= ­Ç>#O_nÙ-܉©"r«ÏëÚÅÃ'HF¦Ù°9Ù$5(¬¸qc¨A@(”m=Ö1ÊJ=Z, 7/e‡ ÷uÙó™ÊÀ„d˜O¥ÔB«•ÖH¯Þ­LÅ+»©ÌÓC€ûnûf^øð.2¹_i,»ªZÜ­ý‡½×âï³Åþû}yœëwS2ÓÌ „yñ©è½LÍ{äaY!äpOvšY8ºñ("I"3#{ëÙzo]=þáŸþ+^¦º{ÿîÃ/.iž&žY/mù(º’EOÿGÓ‚Ÿ·V|Ù>õe³¹W*~DgÈ—¤ÿ˃üýðÓÀîîçÞP£ª‹dy¾Aš¿Ò›~oç€7W.+ð çß|þ0‡–?@À=ŽŸo„¹8¤Ÿ–ru|%ô-OïÕüèsÒKÉ72.®ª—øÖr¾¦ªÜ›½_¯xþ›³¨ó·Tütëè)tþUôÿjp?‰÷õK*ÿÝ0ÌWÍŽç]úúÂyùó’ÿÊ–~zÛûêb)m-/î÷«<žKO¯Gݹ"ðÛçž·ùÄêËh/_XÜÜq.×y*È7lFÇ!ûõÊÓÏ…x™¯þœ}ôöoÝùëœÎù­Ü0¾i/ps ç¦f¼ž£ï׺òë§±«åös=üìÞít+?gÎvØñÖñ×à"GϨLäù÷ÿçþ°´ÃÚ[YŠMS©“ÕúÝ<‡À²,æ¦mY&›K}|˜3øÛ_ÿîéÓ~÷Ãý¾G_ž“{Ë÷ß/}ªú¸÷ý!öË;hýÕo<2¿Í¥í‹ãj:?í³ÍFÄÊu«¡;L*«Í¶"J”>Í ¡­HGÌ!† tmº¿ÕÍõ7ÚFæñ‰õ½÷.I^M©|"ºb€È"HN¥øôX×§¥-Ífd¦(Ô£èHÐ1`âXžýV ÛB·6²È‘¹ä’™™ð «ðaé³å²ô5 Ý4E4ôt³Ræ5˜ 7X7³P!ãHDÊ$‚>ÕTš[«„%ˆVŠWJB¯»:(Oi@lÙÇ Ò1R¹uV¦ág0˜?Šcrt vŽì×¶G F Gϵ@KÒ'#•™aMMáâdSaqC£[£u Z¸UªT*³Sæü0Õß|Ú¯ï¦55»Ai B4¥Ôúb@D˰â;Æ¡íûÒÖ©Nè,ÉG/ÑQ8pXÕ:ÛºFÉ”RÙ3ÅBrWÊa@—Ëök„R»-ÊT ;’ÌhÚüm)Ðl•ÜD™"îæÈŽÞb¾rf!Vb6J¢qªR²#Õ§D„;§"ZŒš2íŠ"N™j›Zb€GŠ«8¨HÑ\f* i™4'Y„òè+JÇŽ(€%%ÇKˆe&1#YÓeëêŒ-Í ËèAR Ã…UÕ2¨ÜhJ“Y“,äƒÛ9‘,îö±·}†æ?/åñ2è$+ àcö 4`‚*À“0²®+X±¹o¤†4p…Æe8¸Œ(Áe’\\!s ìJv¸;#ý<9þ@ô£ ï6F%¢‘wA–t¢ïCކ dn/°ã–1Ï2ˆ"àŽbÛìaJAo`À XmÚX‘˜h–™É2Ã̇†¸ÑÜÍh,4÷R9†ÿÆuÊqGë§'€e®û>¨óœè^fVÍÒÝ d„X—ŒK16£)23Í<32å´lJ…·ZÃP´Í:#bÝ0b%n“$˜½ÌuÞ¯{n™k hîÎóRKÒ}®¬•9U/¥°Î3ÍŠÍóýÜÉvèï¦uÍi~<<¬úŽ ™uŽÌØ|÷àÓ\mM ?Ì(cÖRH·ùqŽh­µèݦIK š$/UÑ·iSǺÌÀÁýWdôž-¢õ¿ûû£OuÞÍÓÃîÝ/¾Ë̵µišîo–ÎóO ýkùÊ·Êúq6Ù_öQ:s“ý¢oºwfÞ|kŸoü6/ø®|ðã 4/Ñn½…ïžáïæNþbÇ)³ùs±žkpo¤üã‹%}©L©+ísTD|+ŸôÏJ¡~;ïwUÛ[¡»>ûütù¯Œü*t-oÒ¹_ÉÃUñM‘¿ßoŸü eö'Š—RÈï.w.õô‚/±?÷ÂýQp:&Ðù7ÉëÄï7¸ø’µõ]SŠ+çá³¾tB"›S¡™Îeœ•,œËK[qÕe¾)qõÿ®VóëÝÔU'9©¸§ï¸ úÀrúÞ{Ó.o$A½€sßj;/'/5È3 V/騗4öÏÈËœ¢[<‡Žêõ{9¾ú9qf+ËÛ®ì ˆ9gœâï)mºÀ%/‡Gõö$²é^xë"™ÚL7¯cugÖ«GÈÀM×m¨÷·ézŽ1S'Ú̱ÓÿçÔf×ÙÊ—OðR>qÉx‚ܼïJL¾*>½é[Ÿ“sq¬‚à­è¬CéLíÕõB|öD¶WŸUnòúžo¤:mK¯*~„|Wÿ^Èæ:ûÚýzyEÔóíž9l\£Ë(ÎÞpÖœ›Í›{9¿íóAr\PN šóÆàeòÐóË^[òXfû¬ý?Ó—Hp“.zûÕ‘ï, èVö^8ç¼PrHÜvtžElÆÅçEmÝsÔõ™së'¶HùêöØÂ«ú1òåÏ–ÿûÁ*^àÆ®¸`Òi@Ãñ“Ç8–£à?ÿÿãÇï?-ûÜÌÌJ—QaíÕÚ¾&Òi÷гuD©ÒÝæÉ—\ôñû§÷SAÿô/¿õOÿðË¿|ÏžzëùÃ'OÐ}mQM “;h²T ¬Hi;)Ó;e²4fHŠº€8p+›®Æ –G Ê£äf^·Ž±| Û™†8$ú$B'RR™ëüá}Z¢£ußÿð´{O ’ÌA‡TWŽN¼†hPGæ±sjCEr“D&+¦Ìý~?R\÷‡Ãn·+6›uX¸YC]ÈËftÛ§YûRGip¢8hH‡yGFHÈ!‘ts!úzõºåHÏ…I Ñê¼éþ$" ŽÖ¶€‰–H)rð–ÐWµ@ïÃI h=ø€ê6×ùÓÇET§ÍÓ´¶%gš?Äj¤Ù#LØÛ‹ƒü^z2eNAäìu%gÊ[ ({g†™N,ê½ë°ôá‡Y)¤Ø»Ú¢y‰Ë~‰žµúh˜µõòâÑd…)en“˜=„ò¹ºwŒÈF™ŠZë)3€4ƒ;”9Op³Ãš‘[Y[&pd“)熂ɇ.ŠÉIsGKNU£»†!S­±ˆÅÓ&$0»œ“2„´':DYÜ`EŒD*&S+;U £3ƒ”ž•,b&>J&¬©B:À$Gž;ÄÔfËŒ-©ѵ6¹³gRÙS!‰L©ÐÖã8҃ㆇF'xW¬INN4*¹:(g™€‰þCF FßÁ&ê·™{䉭_Éä'b!Bx ›°# ´ÕA"ð@®©…™#ªEo("aÁ=û°ÙÛ ãXÜ3Š`°ÀŒ1lFäl>Z øØ˜V̶Bž ¦8JmÜ·_™Áˆü Y ÜániÙ×ðbV6ç^’æe°‡ˆD*{‚¤¡(A Øb—1è5‚”  ¯aî£AÁ{ïÈì½!ƒ]9üÕtÚxÎTRH'³g_Ó«™S´ *1nJÄf1B"ä‘HgÈD²mŽÇÀp Îâ6ùdiÅÊûú°öžèiî>#}š+«s*Ó´3L>s÷RÒÍè43ãþiõDùÅw:´tÃãì»™®A)ç)¬„äÈ™‰µŠIÊÅ­÷X[›ç¹÷=d)îÓ!Vw7im­¸m»¹Tt¹m–¿êÙzGdöÈ¿ü‡’±NõáÝãw÷ >ÇÛ¯ûÓþôŒb~Q9z p?}ä9Õ§ÄoÞIÐyˆ^SÙ^«ã=;mê,™á¼B7;ÞçÓ5ï~æØsåñó$ÏÞRïEHÀMúÿ"ü óz.a_á Î?í–`ð…ŠÆ ÷!Owghб ÝrÈ0¢ôvÐh; ^€·ÏOR:s‹¸½ñ—Úð¶3¼þ^Ê©¼#6áõR ãò„zNb:ÞÈæ.ó¬z_ÁNJŒnÆòWw½ ~õ®þÈ;çÖs/Š ÂÌç;ÙåürþÆó„ª“«Ëæú uç,G ׸m¾r¿·RéKÊùùú;ÖnæÛåì;Š-ÏNß¼ÿâ\7“çK K”Ï‘Ûzv’; ¾”.v+/çä;ß{ y%ztû ¯‹Ñ' ü) ÿÃåLáÄeÈïεݼ˜ç÷rÖà+÷{>{?òIaÿ „ÎŽ„sÊõQÔzéñ½%î26µ_œx%Dq>E¼À»šWp§éBHÄïä2Côì¡}eŽì©¤àêR¿ºà5}ìGY˾õUœÂ׳¤ù™ïxž`Ï›ÞÖV|{,ø ²Š¯¦:¼-ÿ3×q–Œ-Ýiæúú¯â+2‰ÞÜ+x±ìÞ~ÉWÂ~>“sVpÖ¶º–¤_ÉÇ9Hw ¾øjÞ0…êåwÞ‰%Ÿ#ÿ /§5|kî¤ÿßÛü½a?r¹ox{À7¶íkkÞ¹åÃèwypð$t ¤|ÿø¿ýûõ°ö‹¤Rܧ‰Å><˜¹(QPöˆ€üþ׿3ÚûŸˆµ•îËŸ’6C,XöûÞ³Löþqz˜«™`h¥D±&Pj½õÉméüØë5;ÙÜ@Æ.KkO9bA•>«Rj¿í] ±*1ðÙàŽ$¬¢63Å‘’c°ÉË8ŠÚVI©•@¡¾lÂXA`ýaãº_ú¡Í†M,àÇb(½mÛЈ ÷ÑãØ/ 1pá²çåÅvÓÜb¯!ÑÖŽÝ<•‚TîÛ'3À™¶¥µÄÐúCc"móÆ”À$…ͧ S®-²“TFåÔ0è² Å´!ønÔ@ݤ¯›îÙôwNb ‰ÐŠèì#æeª°^eUS! “…Äu&ÒÅ¢ÇÊHë©T˜BœíѬõ°¤;¡4µdÙ•V¼ëJÕVaÌ®\÷aÈ‹×jQÝr=,ÓŒ¾ïkË,‡Wîþéð´´yšfpØï3ñð°û´?´5¦ZÆýfŒý¤Ü-If7réÁÔQ Sfå"á.ôÌ ‰è]" ÎìU„J“Üœ<˰Þ-²à ¬R1ÌUêÉPÑHcqÔ‚XÒ1Ž-1ô×^d‚‘îbaOVd¢r$²§3‚U=a@ƒÒrvöräéÄ) 0‰’ÃçGF1y 1+ìL8Ø3A8-fÖ2C ²šMdHúÐ÷ƒ fc8´ó²FûAk í˜ œÌ lR $êpñöJ…Üfô”Ô°PÀ"ú\Ä^j[à„&²™:´ï[œ @¸ |p[J@ˆ3ÖpY<×ñ ^PÀ"7OàÑ[À#Bsù(†Z6 ˜—Í7øwÍã„úDvd¤"z"ÿöïþQÝênÚ=>¼ÿåÏÏ7!ó<ëv§/Ü®¾­à&uE¯ï ¾zÇòuIµ÷«æŸ×¥¶Gií‹¶UoT:^^ѯ"^‘X¬ €cá˜3øêá8ª{èâ¯;Rþ¢ö_¾¨Ñ¾¨àkúÞÛ+¾ºõlÃßsnaß^ðucç':“þžò+w…õץد®ø¬âü–áò' ç9û¯¨›¿ÏñþãÕ èøˆV~•€~‰úÑä´{*ß|‡¼{£?–¬Ë‹üú¯Q‚¿X£¼Ô9²åÕ:ZþÔ…W·rìÆú©¾ô³þ›„ê{zÿº›øvÐÞª½_Ù.2^Aó™:¿Ÿv}Žm’ßÄúéŸüvQ_ÿÅ&À¯w(žÅÅÏÿZŸ‹0\¦Ý­—zNÊøÃlsu¦ê¿2· 5E$€ÿóÿûO­ueZ)>Õº›êTÜ}ô™H–f™ó4Cùó_þ¢÷戧ß}ìÅ[[ ôôŸþ{qÿ$ú®þòŸ~ùá~n™%ãïþ~Y»>í›E›87«£œe¥Zv Þ ¶‡O*éûwÞf)PÙÙ|å¼}À¶…cÚ!¯èËs3òÆVug`Ù2èÍFö®¼`ô¤Œ„9:aFôC³©+åS–`G8 …7TÅ9*'Ðr‰”0"l ²aÈ\ÖÅ æyn±„ÒBì×½rd6äE°ppBl&½£÷E;Ú'd"»|ðÎÕÔ& 9ÀLfb@Ì5ª@z;N=¹%;Ü?íGP¢/G®ÑžêP2;ÄYæ®Ì%˜“¦BtôØôâ¡×KZxÿ‡ µšÏ, 8H‘z0fªUëEY*ÛTjˆfi´CË ŒøEk^àt8€4õŒž½³’µy¡%«UbX&t¥”Ù–Ž¢ùTÝ !w«^{t€-µô("]s1t©`]ÍÍ•Qmø+h¯´I%AYtI€o¼ÝÒ 35A#t591!/éeX |Øm¦Aº£¦”´ 6Ò¤;ÂÅJ+¨$…¤Ò+Qdaeôpd¸X AØ4h>JâÑЀÕàžhðƒ­œL»‚.ÊxÑ]6’Ù <•«"J¥8"k-£\€ ²I ìB¥I‘ŒF<¸u& šÍÙ˜;óï×>Ì~?õЪœ¶šœÍ*Ø%# 4¥ ˜@ÅVG8OÂ|~µ%–J‚M¹m°#RFîŒYÕ!BA•“Ó/ª¦ˆ|v¶aÄà°´ˆÜ¸[ÉúV‘°ÙüŽ·x ±©þˆÜ@'ìb gà"ÌQfXEt  =¡€? L‘+ttÊe†T 3XŠ,PŠtsÕŠ†Ü¸nk°8ðD8 É4c¦ÌiÅ¥Œu›Ë³%Ý·1ˆèVœ¹ä¨ÉŠQõ§²ŽHÑ´í=‚1æÆ­£ä‚2ƒÇ€ÊhêÍB¹C–]À®ÎæróF·¡›ã\£ø»2‡›OµÎµW jW—iá†ê˜k/$ݨ5Q yÎ¥xéî)ö"š~þ¾LSo-)* µÈPöÕ¥”ÌXÖnd*–‘m]¢EDdfô@™‘=þæoÿÌJ-užçÇÝ»_|÷ÚÖJ¯l\n÷‡üìöýî›uQÐû–üVÝ¿–7å#ð,M‚o&ÎßQ. .ï‘¿(p•(úºááyÞôKªÍKþœß(Þ= Å®OÅÏɸclò®gñ玅?éþõ‹Ä+È?-{²Ÿ þ‡:eð§q0à—_É *ñSøúü]óóWf<žÃe_ |{‡|ùÉ¿ô›¯‡l¿Q’þ¢À±ÌS?îþK€Î_u¤·Ü/yg¼Níÿê©åäy}~IWðŸ×o—ED8åQ^…ü¯Þ~Ö¤gwz\‡O ½:1œÛ[ëæ7ö?\xðÅt‘—úÜù ä9ÔœÒΈ>:Õw\©¡x®­¾ 0ðvGzÃv§^”ùt–ðËKØÌåÇñ¦Þô"0¦›ï¸ÀÊëÌðžwX":‹”ènøäl êJd>ñl¶²‘çÛyL>îê*‡ôS›èÃí¯¯r†Èsª O,¤‹'rÚŸßãé xÓxñüÏ);÷—­g‹˜óo½FÒó,ïžsÕ<‹±Ïf>éq8:/Ó;/w•.òžmõŒÝÜ>@[â-yÊ©>C–Þ­ÚÒu¢÷éù¨¥+5ùUÝIðÚ`OgT1Þ‰cI÷kÝoòW7-¼ÛÎ*œÎË.uFE"_Œvm¥|îu÷ðeçôÃÓƒ¿Ex®(aŽí~"7Bõ¹üY|÷È¿ºSÙ>®ìÊñéâFÞ\öÈW:Á‰ ›ÞpËØ@9€ðãŽ8zH´xúíë~‘äîænÕl*>Ÿêèà¤ÉÌh‘mÿñ‡C©õÝîÝnꇎDùôéÓ¿üÆöAK[¾×÷miß½{ä\¬Öéq‡_ý‹2KÄôwµåšß‡uS¢Š%ÅD*M *åŠôƒ‚ð5‰B¢|*öaŸ¾C&zŽ\¡hg‡ï,Cv"€–aÿ È’’#PjßOËÇC;¬õ½I‘TÆ-OßK  …¾nˆ¡A ‡`D?EŽLÐPÊFW")˜=E¬±éŽRj-e‰eûL;{vðØ@áÛ’H=à £ƒ‡.iÊÆÊ‘ìï[ý;bEž±ØÜ R[”bë" ÄæzmA¬P"V¨#B v¨:êÖdX¡ÞPD/(å¹Ä7kvóeÞwõ-P‰'$&UÑZÊ}AšðØ“ìÕ“èµX‡2Ô“–™M’Ö'8›VfËfHÒ]K:|W,;×õ°ì£z‘Ðz·âÙÂéªl½ÏÕÝ im-S½§ê!³Z=—–”‹¾klØ„HÌN#²Æ5ÉÀµÁ,f!#M°–¤’*à…3¡” ¬ ‰pÓ\@"0$uH,. !jl¡iÒ4AR%â`æGµÄX» FbÝŒø,9RêiKjråÑÇØMèC!:{v.†L™8‚M>ÈG”S)¦[â{$RØ2Ÿ2FîÛôm¡E¹J;·ær# ÌIꬤ’KÄ;”›@Ikªš ö„6#jTÐÁOЇãÅ:‹£|šÃ“Æç”ý NÀð­ÓÆ·*š ÂSu¸s’ ¬Bv„4*„dG.âè8H\ðiuÚ ×oÖ‘×éqg|uä3ˆÇÕCù¢HÌUìä‹äÈ‹¯;—Zx–ø 5:ýNW©1/ "¼ù§^‰‹ÜjWxî·áw¾þð5I˜$Ÿ{Ž£¯|®¿õØ5u<¥=}îiÞLY7g‹zõÓn»Ã¹`·Ñ;¯(oÇæ!$?J(/\ë¹á:®!§QóÌä¾Ä§åäy´žpM|e$~‹úÓÉu5qgÞhDØìùxw2×KÂñ+ÓËUÛÞ¿Á!˜l·S@ºç:s5|.E‰¯äÏ :ÛmÆ?·ê雵€—¬\¸Œãuqãu·áÛö¼³j_K_ú‘øéãÏ=UÏâ9üù¥æºàÌ"ä›&™3¸;¾¥àzÊ×g@0ßðÙüšÈà¥Z÷¦˜ë sÈùú~±K~N™¹&||ëݶ†ìŽÂ%WþFƾÞKœ ó—Kë¥'ßÐéo\a/.â…;àk·§¯o!¾p¼ŽÝ”9ë>¥W7]c:QG^hòj[þ¼ÿäWFÅ_ ós«£^EIé*Xy³UþŠ~þ²ÍÁ O“¸ˆ~ýä |û¾îjÒ¾?9#¾êä£/iFÞÝR¼%}âØçR©Ü"Ûµ‰rkùÏÿé?Gë Õê $iÅJq’­ºvE@!ÊTÍ‹aùÍÿu­æüõo¿ÿôÔwóÃTüüǬÓüë_¯ûV×vøÿå·Ðî—ß­¿ýøt8üÍ?¾wdÿMå€Cç'e*<<)1-òá0dh_j.Ô”öeN÷®@pjÝ¢¦iãÞ`À ¶ËFî6ßúm_ĉÉt6:!ª!7%]ežv?ߟV¥÷¬óû_L@ÆÍk}KÆÏ#ž;sK'6THv€ˆX·\{éh|„™ƒu4‚ðb»] t…¶â¥}à ÙÈp¶ŒÚ!Çob?rÿà[Ñ@&” ‹D0m_=¹@@Ž×ubD 9pÿ %Ô¡:²a ’B”USQBÝ02_­ÀFPÁÑ$%Y§Y_ª—²ûíaéf@¦çA™¡8“ï ‚ÅØu¶ÙŠÞ<‹3[6ìŵÚÜ÷ŸX׺D…{z1óš¡X{u7³Öƒ£ JÔ{dÊKEG[eµxôl­³¢ÎÓ­t-}iJ&c—fguÐàŽìð‚L­ $ÜX}èff.dº! CÕÀ’h€œ…’¡Hì $æ‚Þ‘$ˆðA@8Å.hBë"A1ÑP+üÅs}‚ÒÒ' 1•fŽ ÂjÔflæ%‹© N† †ÚølTOXPâ°AÙ¡ákªôÀÉ8x÷ "°fV³Ù½G i=ž;ÜñP9¬.!ÔE]D¢Ik¨HH¶”¬™øèÞS{åÎŒR£ú”ªÜª8Pm[¢LXl‹ðü¸Az€N9Íž,Òáp­©mÏìCÖÎMÓu<À6^¸†Ä4!;¢#úVdØŸï F˜mŽ#ÙŽäŸÜæŠí§gæ‘þ¿›0í s [ÌWDÄÇHFÇ`™!Wôu%Q'g™è‘½“@eF¤’4˳ °÷ïÑ QR‘F¦YõÌrÒF“vÍé6|Á3Sf ‰X!K¥ {b1³1E§™gtxš#›¶Ózlàµ>hH¶a”[cŽÊŠ(Ø(ØsUL™pšW¯.£×é}y´RW&K5šÙT2•n…¶›g«•Ô»w¨E8¶; 3Õ¢ŒHºÌÒ÷&_{åÓ4Ü_DšH÷ëjî=ÉHLóÔZ‹ÖŠJfRòRÚÒ¢E_[f¨eF‡ðwÿð)”išvS©õñçž RG:Ï­™Ž©:ãh¥WSõæ €Ë‰Ë”ë¼—j§oXo<ï|¦à9ÇæÝí*0/…azñ¥Ù”¯WÜ-)¸eßs4³/5!x£Æq÷,t·@WIý÷jGŽlÒg߀·$¤\Ehô¬Ñþ¨,àj2î>GÝü|‰PþþùV|µáÄgœgÂ$¿în;÷+'ó×eÁ[aq3Çø#ýyK8ëäwR¿ï²Î_™ŒŒ—â=?Öøýöp‰îdá¾q’¼Ÿþ×;×n…ø– €;’Ó_tþ… €7ëzŸ ÕÿzÓ¾ípnÉüVÐ_ÜÏeŽ÷ѺñÕnãoÙüRèèÂ-¿ß-יήS{ë‡%¢ËçiýþS˜Ljícûød»YïÊÿôOï§5“ëÓwÔ—_ïµ$÷IïmîVŒa©b»Îë†Åõ¸†t|2~b›+Þ4O+É4Ì@ú àÇfž9tö訔 Y î,@W6*´ÙaU’X¿?°x[ÖõÓoÞÿ½™å© èT\T&”më~Ëú‚{O ?cÁ}‚ššÁ 9œ =`€Sb70­–k?$r Z 8ᾕœ O@n–!ØÇ-б&@ýsôDo(¨£·ç26óMýТ!ûÆýPWÓ‚ž9DOÕX 0 Q°IµÀ“¬PÃzÀ¬´댘û!Q„ZÆTêCžünIkÀjÉ o²Ä*­í`ÅfËOŸÊwæÁN+³yÉòÃjÙÝP³n)„º‚Ó4e(3z˜æummé.Ò Zc%HN²¹N ¤zv®Îl€I0L¶1‘ÌF.6Ch@ØKxgùðQˆbÌïß Z ™£¢\ä6Ø@h‰µÃ‰] µ(…1§è(SU`°„'#ÑR®”¸ÚL*ÐAsÕ Ù¸º4+h -å„«%c• Q dȾy±lÛin.,¥À¹Y§ ‘´Zj™@¥Y'J™Ü‹Õ©ÔJ÷®ÜÙ\&—SsÑ…‡‡:a”Qó;ƒkÐd€°tœKÊZ[äTiŒL)Afoà‰ÖÂ3·Z”23sgfoM™šD2SýéÐKöˆŠøÛ¿ÿÇ”¢ûããÃ<Ï?ÿ°Õç=Ëñ#ÿö¨½-Äú±Q‹où¼Óáúî–æN]Á´y‹J¤{…_yzYâ¸Êñé[^¨rxÉAêGF½¢ êõGxÓ:åó“RþÀ’èKµýùëÏ_ÎIô?b?Ræ[V?ågp¢ŠÜ„^ÿ¢ ó—Óò+_p \ýv»Å|÷JúN…)È3hÏÅŸÓÍ>sZîû$þ’Þðžƒå™Yîô›»F@/GbŸ?Ṙ“Ϲñº•oˆ"§”ö³œÝÙ’Ý`+x•o~ý¢;7rŠ©ê¤N€ÜD•«VÛN}Çœ<\¥sY•ç;§çˆÝ ü3é¬9Ž ^•ß^ëæA޳áV^xn³Æ‹K}¥ü„8ç ®l$Ÿ?ƒs€ó~Y tÖU΃MϽô¦>À9+RÑéÚ¾<¬óZáfà]:é:õë¬ÂâÞçÌ«òCÞYÒFrˆÎ;)î™õ úZ]þœ۱þþú\Ç—Ï–gE©_êžõYs¡Û÷Þ²çxæO2Ÿ>óÐZ*[ç¿üç݇‰ÊøaŸ¶ÂSÝ4·ÞUÂÅÃûšS(¨nHrnê)2Ø)õ}_síf“S.M©àTbÍÞzÝÍ€M^ÍaäT'CšR&:¸ö»ŠlK'ñ`ÖœÊnäL¹3 $fX’BkJ  ³b2î€ H¥ˆf#S•·u&nÇ’a”HÓHVç0ŒM.IŽ-$¯²‚ ˜Áˆ.#xàJ‚Dï„À¢RP °î¥²õ´îè¹±föµñ¶J“8 ñOÉLì\ò4Ŧ”TIøå09ౘ;R똀ý˜O:–¢N8YŒ F‰ÉiÉ.u¡€–ò°YžG£à}ž¹kSß¹¡ Â0ÃfØÁÒ" 6àÜÐ¥Up`¨@@ËfiUªd@¸/S)âN¶vˆd†|‚ÖÃf©Ýði›ÃGM†ŽuÀ¼ÀÈk*ÖÙD óßV/?¦¶±mþÀ©­øc‹Þl.+z6˜‰‘™_§ )F€& Ù’Hêì}«³h‡U³e„™™E¢U·,¡®Ì:ÏÙöÚÈf¥DoêÝ`Š$F¸GÑWQ™ëÒוHP (¢#ûÔÁC ƒ!$aX8D‡• Œf’£=‡ƒ‰`’:­Èç©Nu*“‡1Ý­§ûìNw¸»»Š±xÌ\Õ­˜ùŽ‚äûˆ¢h®› †C·‰ì‰aÖiÛ|8œÝ{ŠÊZ'–ué­Ã’€™úÚ¢õ¾¶¿û»¤‘Åi|˜'š÷·¿ØØOÙöº³™ÖóÁbŒ&ñ–íx}úáÙú~ع #^í_u—©«Mß³Ÿ y{¼úÕåæ\&þ 7¸žû`âzïW'B]5ã+Èþsú%’Ãívï*þÇÁ»o¿A¼tI/A„NùÌ#x¥=Ÿ5*mâ3ÀÓ%»à>Ôèu\ÏëæªA^ ™¼¨y%…öü‰áœ/*aGãÐÓ±äžÜsþ÷ÒÒ¿Xñ#¦½%]÷³ñ§—¨ßoÍ ?WŠÎà?za4½³ó%î¯ay1]žøÉA'Eå3È{¯yãt… ¹èÕ7ºøë,ò—¿‹çià/½êxx%5oFÝ^ÕÝûËéë|ŸË çì±kSä7—F]O,orÓ=[ÆŠÄ£,tWz¹Ý/!€ž¯æ/:¸âžÝ{ |aZ{Mô¸ûpϾ…x™¿ýÙAúÊêùÂŒzQ‘†g°÷Å4vA[ëÒQ¤¿ â\Ó—û.hYG¥úy‰ßTèÂàf#øJ¼AºyZ/½…¯v«ßù†éæRýý¢0Ùmdá¢JçÈ¢³Èɳ†«[iÿµ=ùk÷vFë¼Q⥔þú ¿íâú\[è:îó,¹^UB½)ÀEÔB/hå|©1ø%öͱ®çÖâÉØáò9ññùìt —#K¼Týoÿþt1ºþ¨M„½^“Äóí oÂw®W¯<–ÛøØY°„¯¶µî<;]ô–ívgÙy5Î7ìßôü…|¥OÜÔëuîË~~i¡ó^7¯˜äð:<÷ê™SßT {wêySÕ889¹-:™‚Ì `¦ÖÖÿÿíßï?í36â4ܬ:œ™¢1%ϴಶ¨>¹IIójìßï¹›ù®j7¿ûþÞ{úþÉ÷ŸÞGO³fÿüÿkþ_ÿü𿬻=[L5£í÷ÿ}iˆúž¾®©ŠIHW7”ÌF„˜Äû…5ñTµš6%ßµ´+Ô`eÓß·h\AyD†@WI4qÿPcëB6l$ÿ ÷¿~ZbiþŽÑ˜$éØl`ã}?áÞ6¸ˆØø?ê0‡Ò@¡”g¯9±>mQò‘ݯjrï÷M^ðÁŒ‘SÜZ±ÅÌa޾ ­‰RmèÇmÐÞaºߪ"l@=F|Âà d‡–-êÐWdCÔ‘±B‘¦ÝÓ„2c³©ºFÀ‚AµuV‚fJ¢fQcO4)% µ´Œè¹~ФÞM*ÆEKª¹«õìÙ­çºÔ(qˆÈjAí¹ÊìÝELuÝ#•¹JïÁÙ—¾¤8[!Ù¢-û6ïàžÕ<›£·Ö Li vUj•J©½u¥`†QÏá4h]‘¥hÔ`LI¤ÔR•,dRZ©é¨ËX‹`Û S[IƒŠŠI8Z€’=%©”ŠLd@¾ÙÊH©• \9€<¥B‰$èâ´C  o”ÐÇnPÐB$"YÅâÊ‚Dš«‹“@k¢ˆ¸{"¥NB °Ó¸˜‘ À8”^´Ì&å0¡ûié MÉü ô0ÖÌÈLy\?d4éCñ‘€IMÑ…‡b!eÑ# ‰Æ¹ö\“„!,RM˜€ ð&Ð6ÓY&Ö28±³J’%$í•Zƒë`5Œáp÷-»-ß¿8rEôÍoã¸9„€v\5ÇXË£ŽË /Ç’ @áQNˆ¦-V7„EÀD.Û %F°ÂF1ŠÁ:ªÃy´hž¾™“KR™@ǺhT„èíM‘9z¡Y5ìr=D†U¶Ef8Rtäš$j©Ê~TǨLyN­gO3`EDfÔ!äºñʆɨŸPDZ€ Ã^b´ ås­Ran³ïЫ¹—•˜ÍÊ7s¯Ó³îœËTÍÌê2Úð;þÙ/Buôž[Ä‚ƒß?Öà4ëòȨ†Eö´9G›_±1… 9’@ôá—Þ£¯¥¶¶fA3¶C‹ÖÛ²FŸýâoa,ó\çùý»iªŸšÏGñ37´3o.]8àÙÏrˆîm¹Î÷kze¯Í³•†ÛÄ}_ ³ € ©W•ñËù‹ Þe¢›®T‚·¦;\æÝŸ+)W¢Ìgr-/O¼Wÿ×7]wµž+å7Á—7™O¾aË÷Rdâêò^Ò/6nŸ-µÎ\úî:Š^•?s®½Uy>VùÅ“ ôüƒÔÅý•Áóg6FðG^_ùóXäÀh#8ánêa)š™{:i…4S­4Pk™ñé_~ëµþüoAÑçwïŸÚïÖý²|ÿïúºöOKþüg¶¼ÿÍûõzXz’Éïÿ%–røõÓÃOæAšĹ)aÀÃ$>L¸xx€u>>EÍb´‡ž*]­” z*z,”BÑ7Ü?#Å!•A¹ 5!¢3RB3°>ÌÓû÷}¿bàþûéÝ/H®eFrS`Ç“ß,µå×GGï[îjJËæ‚2½Á“}K}¦ +à±ez‡M¤r¸‹N¸ÿÊ3Ûv="4êÖÃd 5`¸Œ´â@tÄ@ª í-ú`‚#y¿£-g™8‚±¢/@@‰ÞФ6€¦³èÌâDÐkEt¨$kÚÈyÝÂà î›rÎ) ¥¼¯ïÖE²ꇒæ3Ú!àQX[b}‰àS É^JG6Z±C[ä†^Ö^h“=ýÐ »a Û"S\×,^ZÖ¦!¿§Z(ƒZ£õ0ÂJa*‰Þ;ièÔônPÚ¨ˆAš:ˆD5ND0!¡Cn|¹NšÐ>1‘KŽ,o¥``tøN`²K<@*€5eD)ì©ÃSA&¦Š‡I¥ :z2ÅXᢄ5ƒ2Ñ;†Ç]AtÊŒFqT„¸dgë´’EXC˜ T£†Ú©DJA äF‡Ù áç –HDHT3II³–™Ñka”ôÊÉÍÄ.Í0™j)Q%-‚¥‹¦2©`ebÒDT¡ÒmŒ‚:³ŠÑáI*Ьßb%TŒ€¬@ |4âyãX¹¥ÒD¬’ºŠ£”ˆT1”Ù×Clå;ú€ØD)0m.µ&d"Fb;q^æçg!áL”|6ÁÑæwЂF%ÌQ&ôe37C_`ŽR Žø˜ l‹ ¯¯~Ô# Äæ,ggû8zãX“„á¥RdžTÏÞ¥˜¦’ĺìçÝ8¹Pk]I£I&™9‹™XfZZ4 ƒ{f›¸Rx4>I86Óä1S0qò:—)‘°’⊄›yLîS)u"ëä%ŸZÐQ¦Š2k*åÃÏ(YÏEfp’Rñá¸IÅ·ò½5¨´Y4˜£p…„[-<¡Ì“ü.Ò̬÷`Fe¶¶Fef¤"Û²öÖÕãïÿñ_‹¨ó4?>¼ûÅw8rž@é´g)á˜#2ÇW¦e$õcï\þ¬6÷ð Ôg~GÚÀ™?ãï窆)€»V¯¿ù¯G•¿þüõçÏíÔÊ?꫺¬øCNèzß?èüös2%þS/¯ÅÞîV0œ2ÈëüËÛüíϳ¿Â눒rÓz¶@Ñ©àn"´îïfˆ«VòVV½ÈÆçä²Ûº°SÌE ð&ñúîWâö»ß._Hד75õ©*þMýœ'J׫ßôfë\éRn¦®ßU[ë ¢Ãs’É­m×åGè™eóÜqϺߨ‹Ÿ“‰ôÙ q»s^Õd|½³ €³,ù <ÓEaöyjÅçâ´[ä+uXw÷Ó·å´×åÃ'Äøoü›B G&ÒñÏ[=²¶§<æµ[·­³ŽN¼1>=lañWXbâg{Åù+t¾tŸ=Ëû'5Þ„ñoóÈŽägèN‘;uSõq'» Å!·Óí+¯¯@wC߯”2\ç¢=—KlqS.…uíÿù?ü§hÝÝa”»;`t£W$ëB$ÂüîÝ4S šæ¶?¬¿û8×*ÃÚàóôïþåéW?<þ¶ÖŸ¿ø¿ýüøéñŸë·RÍ[¼ËìýИ%™´4È¢CçÕö¢ßí=ÜÓµ:ܼ›šñý’L«9Èû„®qÿ„9RÈ&7D"iÌÌî Ñ`N–Ë÷{«¥/ëúôë÷OóÜ´r}Ó÷³fÛÊ9Òü‡º”€‚Ñ ý°”²aÎé€2 ¢ì ‘eO Àcfw©r‡aeŒÀ¶¿ëè@Ùmiø[n‰ ` ŽU †ÔFù?}Ž:216Í7  ñ˜•Ü7¸Ð€rPÈŽlˆÈ@vô¶)‰J´8lBÔ„ÁÁYL’—$ó°2B“:D©(d/Ñjé?¬¿Û‰éÖ¡†¨~(D4±/=ÙÔÓQ;%#í‡%"0›1=²P¢S­D˜=âq·3V×¥Grí½¤ªûÀ€Ç¾}·«0ëJ„ºNë"ÉâëÚ"4ÛöK)2¹9dÏ€0 †LV!Sh%&"ÏîÀ ìŒ1òÀ IæèƒCC¾å*a@QL^ÐZ*S̶:’rÔ‘S-0]m'X°œ€!¨°me+N8…a -ô®žI“Ö„'¤Á¦§¤ ,èD{h¥˜Faέ Ÿ2°´ã4¾fJêÆJh w—EûEǽvººI·Ô­E$u Eà.RæÂö¥rûóí‡Ä»‡¼KbÌÝ3ïçwö_zúýzøb‹F¼Xèð:ù7›@ò~íî-[àîÖî³{¿«O8O±|‰)ñ¢þrÜ Êk’!oOä×ð^|aé¥õu{ãÓÍìÕGÏóìï-¬ý…§¬Sˆî§dWŸ£‹´ðÌm·yýq¼Òø¯Sª~„Ký’ÿÂðÑeÍÏÏ„Ð}Ôןھe,|vF:¿µÛÜí3 üõ5ê÷U¿ræªr~ˆ>?bßÜï ®5®ÏµáiÙzý@}ºÄ³÷¯àÖ?±]ÁŸ:t—•yG^âgúÛg ïÞ¼¬ß¹£³øÎ7ýî¬ø–¢´+ Òíª{ ¼mò“ü»Ñ‚x¢uYÄð9Ö´gUëì‚ ¿pŸyÓ3n0/u!~~c«3q 7ÅJüÌnù¶^HW‘€{R>_  `WŸ.0ž#È_âªëZÖu;ž!¹y…Ì¿l0IÒ|iKü¹pÅäHçT—£øÏ3 ô…:ÎûÒð9Zd"ÎažËº¼ —Ý{ŠÒµ„Î;{OⵓÃ9 æôx.tãKÀÜÅÎ\—Ñ…—](Î(‘çx%J¥³˳?§9ZÂñ-Úæ8èõyúæhÁ“ÌÙ!à<î¡Ë“Ïê¢zîœbwMؼ"^xѯ/°·û‘³ßðËÃëõuº²O¸dy]Ѧ¿Ô΢µP¨×}uxÕ«/.žW+ÙyÅôÛ—´¯2:;⩳ 4ÃqtþêÿúÏ}Y”éfp÷ZX¬ev¡bª¢0MŽÝD²+è­Qvî÷ËR¿ÿ^ß½¯Sí‡Cyxøî_=Ø~ßÖ¬ïø«ÿë?õß~ñ‹ÐÓ?zÏyâüþ¡‚%"!ÉÛdïV=”à¼rêüáåjsb²âŠ…i[R¯ðî z`ðsg,#?¸yÙUsÏ0N½ÛÔ SJG4(6õ u3È©¬8Á nÈué DïeÂhÔmÜÍd” &¸ˆ2Á†0÷Lœ†ÀÖ‘ s Ct´ßmñf 7Üÿ8Ýl˜ò0ø 14ýÜĸáïÜAGPÒáèý #(´²oîÞ Ü»;A»̶qe:´7Ì„V @…I‚ÑêëU²• Â+ž¦0KÍÃðÃÕá  öä£J;dË”™ zve's5Ô:•Œ0G‘ÊnW•‚Ô çÚÛ!DÌ)fO°o¤‘lOD‹4òÐC‰Y€iFŸˆ0PR‡ãRÈžê@#„‘±A‘ï Ob“Í‚]*#‹i•˜[ň›ІF¹i¤l °‚jÒ໪à Nw™ ¢øt@)x|§$PY«P®í1taåŽç–D"…žÛ¶ïˆ«aŒmù¾áÁ˜Â^(Np±n˺ L±ƒ„z¢ @“ VÑ]¨jÌ.±Ðhsb…2@R{¦T'~˜, &ér·ÕS¡b˜À4UQ ½jrªp?ÇÔÍÉüAGÓa( TRj˜œ›$Öm&ÐQëWü"QÁ¬¦î) Í3‰6(ñ‰ÌQ²ãËFL¶‰ìJ(ž1ý1Â~ ã³sÆÈh÷Ó¿œL€bøŽÀ+È­\à DeH^aD¼‰è0‚è 4lÿ„—#MÈFŽÂ B„ì[ P€i’Èj0A>,%¦tO&²· Шj†‚žêºS´ât&ƒ‚ÙC´ ‚¹Å;}:ÂÊbÄ¡€:r&gÎÁ4ÇíLQëTŠ“ÎâµN‘ê†,n,!X);«é\»û¿òýãÔ{Úw³É ´|ÿJkórG!Ë$ qHÜ…òø‡#j` !ubn›#™iF3rÿ¶3Òdô®„hÿø¯þÇ2×éÝîý/~6ßx ‡¹ØùC§£žÍÓHñz7{)<Üç.^fœË’WÙH<íwxÙ¼LW8m0xEþìÑý…2ÿûNƒwSa®D„sð:Ÿíê¯6®ºe |F¬¹…Yºü=ùàrã}•#òÊý¾%;òJå¿k p+”Ü"€.³yzÔÛþžW§š è-/îuËx¹Þöò‘t)þ–˜ÊgUæëÄLœ nˆÌxò¸ò/Óyæá5©Ug†Ïjæ•<óªÎþºžûò½_ üS°ý¬ ÿŠ–úеÃK¬'r7çóþçëRÿ¿6äÀqæ%xEþyÅfü ¹V÷ÿæÅF8{‘^žN_>Wß›Àù¯e˜«¹å‰ýˆ}î‹âC¼ ^j@^ /Šæ/ýËsDAÚŒ ߆ž¿é÷·7ØŸ tþj±¾Ê}¯w+€¼büq¾wû]çïøRœÑÛ#yWïs7£eÆÛÖW}/¾zÑ4›ÌõçâOñ‰­ýëÏ×nZø‡äOôw¶›–å°öþøîazZ>}¿_ž>Õÿúß&÷éÞÏßuÖ]íÅr ®Ÿª¾÷xKS³òØù°¤%ù^\&­Î‡½í‰¶˜Ñ ó£ObnV™ç¸†„ Ö“‡Åh¬P ÔéÃß~ØÿÐú§}ý0g¦=8Á\;2ŒÈ†\Ã.uHí'–º0>™ýùpáŽäêf£ Â†VËá;¬.å `òM…~˜'_¹1@Nüå–ò ¯È@ë0Û"›ŽÌí]Û?9Ë:™ ›[Ï…O›3'¡Øäþ¾"f›€ºpcaJbvº³»L±ˆÅáKä.½°whVÍ!dsÓ¤Îi¡¹Sš"¨U5¹•Oî[î½I È:-¼xMi9 ĺåþi¯ŒÝC¥9`™Ù–¥-ñø~¢aIÀ-²Ã°Òz‹D¦ X!šÃå&±‡TÏ$YŒ’ܹ{*©ž*Çø_ˆ‰XÊcn æ` ÂÃg“z¤×Í™IBA˜£ØÈ’fqÍ(fÀ&2†¦-óø',àõ!)¶ŽR¦LPT©Ì¡á !µïÑ€àšX;–ÀDôħP¦P„óKÌ"º8xôł̤‘‚hâ„’H*! =eGÂÁ%2GüÉU»IíÌpDS8Ž^’†uA­(;5䮕VE*zHï ¥Ì †w0HkÈE7‰DuZ²$™' p F°N¥T–%#hÝ·ÿÿ»…8Ù,Îæ²ÅéΤsÎŒñêAG…r@øóH74ÜÆqÖ`ÆÓ¿oóà1ñ?zDëÑzFþÝ?þks–©Îïù³ñz’µÖ³ó÷‘)Ž;9.ÄyÙ)ï[Ã×6ߺչJùÿëÏÛ%°oÜâþ%6éMÈë¯?ýù‹ŸgþÚo8ëO¯½þh¡óçË@}Q}Ìö \]êkÔÎ0Ï©¤wu§›Í×¹7Ãuìå¤ßá¹€C_ô,Žàâ©:æ—ð³ä }Vç»ÆX^½ÿ˜K¯óÁöl‚uo!¿lþëdÞ»êãEfË©ºõ¯y†$9ƒ˜àÖÛö¦5ïÇûGÎÁ;ù¾Á±¾ÂÝö˜sc~ÊgÁR¯}ûe½•„ËÛày 'ñz'#¯eí³Ò„ó{¼®X¸ˆ°_·€ðhÔëG”­\§@¨ çâŠSnÜË'á®é2q¿FZw[á‹ïãd6ų°¼n½[ß>5žÜ]Ú»§-ÝÜçMQÏ#ä§ €›Kâ1»ë|èÕ ÁË/Óuç½ zó*eí«¥ÿ—§ €ËƒÄ…/ç°×ŸÂEÞE†Å_H8ºõV"_-‚tXÖRJ)žJŠÿüþ—ÑE »tÈé û¨OÑ4;8Ô3—ß}¤³”©ºµZüqê?ìû÷­GûÅ/öôi¿üöŸ—’õ±Tk>+Ø«ïƒM@ÍÅûÜ Óõ³ß-i‰NŒ±â0•Ÿ/^O²V™féüðd;™!V o‰ºV™L§Bˆ†ÐáXH/æýÓ÷úôÏûÇŸK8”iâTúÒÚÓæ"€±›*[*=FÁàf8”„œ¥@[URŸÝªE's›hÕ‹÷Þ”‰Ù£Ô£pï+X¶ÜÞ17šaz„rcúgn½#q8} X9B6N8 Ïª`¢ÁáÓŠ „muÃ4˜#¢``úÑT`¬kŒ£Yåà MÊ‘0C—Œ˜ ºéSÊÉhÉ^¡rЀ$<¸w…ð®\+µ®ÀJß“Ui]X„Y’Õk[bŸiDì º¬¡5¦i®¥B±,+Ý{fÂÜ) }jî…ÅÖ5–µ3 ®=:YÌ2crfêÑ{ìŠ×„…4mpîp/R4-s‹ÄðJ0H@7P‚3NÛQkÀˆN[RÄ Ì„©!!¦mºíàù”$mËGh „b*&ˆ™„Ë‹D°Nð0à ‚ ‚ŠØ»z À¨9@ "‘+2a8zG¢[8(cÓÁƒ¨¨B°ILÂL…l®n*„ˆžÀ*8"Gz“ŠlÉŒ~'Â#'M«l¸|ø W6Ò.ÙL…,3ƒ2ƒ¨’(“Ƈ¯™•”ÁY”–è¨0J„e=`B’‚ɤ ¢’X M2 -ACµíáŽÀ›U¯S@qxœ÷Ë’-¸•£V´Ö:‰ÞãÚÄý<ó¶ =oÜ¡”!hGÕ¾ƒe{A­Ûo%`Úê†ÃÇ–à¦?;“±ŸÆs”Ÿy¹ "CtŒŠ(8,¡ ­A£T0 (IVv@MX¼ÖL)•4…²5dÒC,aà #‘0ÛÐaî@ (bÊû?ÿå]·ÞM€Ï·?÷6i×;Ï:¿]ὑm6Ãs«8ù–s•®*¯í<ñrä–¼ùê—¾Tðöƒ _Ý.óõÒF÷®ðq‹¿íeu*}Ìí?…1ÏŸÇDã7ÞÊù5ÜQÿÏ·:dÞx_žt{Ò;Ë:ÖmÃÞÉçz5eþ¥üúo‡;ÿt’â—ºuä~åÙ½ÕòÅÞ®3Çß{y©ç¥ïú ¿å#LÈ/Ó™~Íþº||NÖÐ<×ÞÜfˆQ‹éLÔ»‡C×91Ÿq ÿqçWúÏŸtþîÏ}ÔÝÂE¹žÎi9_:ƒ™æ®Ïöݽ"Ý0?.Zã¥îqRæp*¿;=ÜÙ‡ÜÎwÂ|éQl/+÷†y_²¾_{¥{Bø¥möE4þv4Ÿp?ƒ|ˆÌúuÔ%«ñštŽÛbÏû3âyçsÎÜ9ƒ²<á¾°?çk"7Ã×@.ÞÄ6N¤[“ô[Å7$;>Ÿ.g p½á•î…$žw€·2£nò®Ö¨ËýáYÃÜP`n)÷TaÞl„ï3Þo;,¡Ó¿ nÜ!®ä„ôÜðGp® R×a“‹¶âuàãeò)OŧgG‹;=‹o^_¯ ­/OccPð¼¯_mSxíqpÇ Ž8¯Ç¾­cÄYVOUÿ—13¾¢æ¿zÙ¼jô³àìÈè²Nòh+pþ.ê(ÏÉú÷ã„7KûyUògc/òŽ® ¯ÎdwßxÙûy<(G$,²©G?üîÓ²_bmJ­u7¡8$K­¥x%—e •f†vXŸöË÷­½ÿهLJ]†Þ=ÌŸöû§%?<.ÿÇh?,OK¯“)WDî¬MÞ{—Q»ÇؽÓ²¯q1fÄaöº°&Âóiö÷‹½[ÄhKÒ‡‚UСÀz@}$!†œ]ôܨ5Ô&̱‰(P}WÚ§ÖöûÿTÍ!C¢å~éû(E:¤êçÖ k;:²Á‚ÊZw³Hªµ®‘h‘ým¤×Éjí-èe~(¡•í@$ÑÇÎÅ;†3ÁfVœP }F$Е‚ >Œ• Bn¶½£’²ÃDÌ€ƒ›ð}[³¢mA ðÈÈn žKF^/…@E/@Lô Êø®fœß© LJboš„*?°:l‡>‰ß³.& K8t¦D˘˜®xâcõa½Š}Y‡Ÿ®V¶`tB¢ÃªgPZk·ðâ-0mQ[1˜Ü(½ €×Z¢å¹X "Ó‰©”uíJ:L3BwÈ6w„áBßòÅ­"ñð®ÊÓ~yzZ¼B†ÂZ‹G¬Ê¬µZ­OO‡è‰ ÛüE‘Q#zÏ{…AÈÙªCˆ Q&(Ñ;4BŒÓ1eEˆ¾9@˜ÀpÙ|òy,ܱb\Ž˜¯-a°£ó0K`EÚ1íeDÔÁ j€a~%“9”0sf*ÂÑÚ$:•/ÙÜF,- æp Vä ”Qò2f-’¤‘ ͼÒçiv/IËâ˜ÊTËdÓÀ %R‘;+ÓÿôoÚnZ!fû•O=Ì9W­}<žY@™ CcøIÏB´ÕQô eç±—v ŨŠ‘û¿%þÿý?ýk’eªÓãîÃ/~o;y‰ý9“O§ƒã1ä,½àä@·›TÝÆ x­öS¯ì­¯PÏG¥›ÜN“ÛË×(Ì®{‚³Ãñu…ú«gÑ˃Ô1|±‘¶ˆ‹´Ÿ7艺É<’ÎÏbŸÝ]èŸÛòsÊÂbÌ ÿå³Ý—¸%wÅ‹_Ï'Ñ;¨ÚÓ¿òÞ™éöäyg;èÏç'Ùt{:/¤IÞ•Îï:(|–¿Ï“»Ýs/ºQW(T^œvyuˆx>;Üã:ãEÌÈ絿›Wò^á³rtEGy ôzǾ›|cà-bßÕÝ%„|äô’Êý–¦¸ß&—‰qw©8¸!\Ý}¦w'×7ŽSb¦Þ¢ÿè!ŸÏ†{¿´3¼òQŸª¾í»tG»¯LÚw³ôtåKp¡|èõŽ­g%Nç±ùmÿËÎã¦àsêÿ¹ÞuZ ž÷_÷"[äç.èFÿI¢V/òuž/{G}?÷ôå €;“?¿°à¬4áì{ÿØ@üú×ój§|¯à3[Ø-—ÍÿgUW¥Ÿê¡ñxG:·‡ý)ëO Èö~–qc]ñ…Û>¾Rùq3øíöWB¯¶Ò«³Ã›-Â_©øqŸóÇÛÑò ;@­õýo~øþW¿ÉL€µ—±ÔBÂÌŒ(DÆŠì;w‡§ƒræÓ>Ûòîçñé°ÿô©·Rh­÷¿þ¡µõWßÿ k`ªSIZcöù¡®¿]ö‘,ì&£–FùC‹€U‘J.éAƒ—.G(¢oÙíV®qÿó;h(­ØÔm#”ÌDæ–ER2ˆ„ éBYžÒjÌ4ëV,»€ÐªìÛ°>ž’ùsv_}$–ý¾·î| É-Ø tz¡M´RveÓV´«Å"ž—»D¤#msæ°ì¬w¬kšŽr!n›5¬ ¾:³ô¨„ÁçˆìÕ¶<Üga(#¨æg¬¡ñÉ~$þ;€M¦Ääí4ô¾¥— /ðàè®éU×N@U™€‚Æd……ùÂNQR¸˜¬+›ËË•`2‹ "•(É.!e†PªE)Å O½›qdï&Ÿg§22Ü DïaÍ'ó‘-™Å±¶L̈Œ e[%73!Z0±#4$²Í™†Cˆ”R…$Ô܂&%%JDm[KA“sgÊd„RG¯y ªÁ£&@cc5%!Ê€RP&)¸îY¨iB5uqaj=Âʈr ;ÓI™@ƒµpQ䦸#P„ Pb9&Êׇ*PLɹF’œ¤µF¹ÌHHŽšÌ 9Ô–í3#Ãß"¥È&EÇœ©Ç´‰f¨• 2cHpõÈNÓb)W å‚´lUj@…5¹ÀÅT%ýÖ¬wØbBÂe€„"6‚“ÝÊ…–(À¬†p8±¦ðQ²Í‡vpù‡x8O^Üž~8öø®ôìNotÈk—rš§Z¦è‚àî-b  ”³MºÍ%OQbsL;d"úV‘S>81¾†ìh<€DH¸žW'#ì¸tØ[åV9¤#= ‡ ÍÆßºÁkh|]Àìùˆ¸¸ptÏMEv;ÈvLd‚‰ ßél€u8NçaŒ+ãÌd¥¸Y1w¸³ÖišK© ±ÚB%Ãén4øÃ¿ûw“Ä¥GÔ2Íu5<Îp §µ,µb®¨9澂ŒcMæ enèLPbgJ½t”•”R&6æOdì!åßÿÿÙû³&I’%;<‡YDÕÜ#2ó@@5€j½(j¢ž!êšÿÿyô:·Çýô9+cy ¸£ÛóÊ|œ÷LysÔ7Ȧ +û©‚£àöÉŒ?g€|¹?µ3йdø¦o¼$ÝK`]·ßzì¸g²«_úVÝ0·¥Tç—ðzìî¸-o²ï½Žá3;]ýA$‡Î}º.®yJÜ t^µb¿¼­?yŸÞ)’¿n—3áØ¨sí€óš[Ñ£gÕ­åš®nåcRýÓÏ^XHÝuøúÖ €7YHqÓp‘ôÁÖ(iY˜Ù‡¿ÿñÇ¿ýûl!Îq}éFC-Å!0–¶,­HmšžwOµÖ¦¦wÏ‹yd¼«þôn7½L>NuWµÿ‘ÕIhþynm6KØ¡N3†©Tg)³W¥€¤J•èî‘óìd[AáÒîߟ ”`09Ñ"Á^÷J¨Ã ÜuÛ^+nu¨¾«õÙhÙöûeš­…”ˆÐŠûO(¶ŠÚ>U +¶§®¿KÌ4”J3š¬ãÏ­Œ(n0ƒ¥<@ÆA¤…˜•ʧÁm™÷È5!Y‚é@¯Ö”—Y6®‰#`èl"s‚ƒ—wà¡ÉT ØÇPS­RLŠy-îB­° Ÿl×WF|ÙZ;ÌM…Œe­ÉSjo‰‡à ¨˜g¸cØQˆd ΋FÃPà3÷‰¥)B2XÁ² 4-L!¤²¨ÓKd)©Íìl¢¹‘Ô†;”‘Ëó¬Ôb¹Æ1ùá§YR Ew‰¹}Œñ©9/Ñös驈pún´iŽI"‘ì>±&U`GÙ¤Ìl°q[‘Ò°ˆÚ<(¨&/ŒÄí $”Â’HpØfÀh’‰.4)&H¨Õ;ÓIŠ(ª0ÒÕZ ¦¼®ÏÒÝ À5b£CÄ’+/(š»}ÇŠZº§mö"j!1'”p L¶Í»b ¶¤¸c`7@Y¸f )Ôµ| V È 2e’Þ“™ÒgeyÆ»g…Á ô,bºEI ÂEZ¼E!Ÿèάò'µ¤”L6Œá1†‚Ù«ì=3E²ÂÌ‚CûÌ%•…Ô Ü_L"Âh;ÕæFÁ ɵ¸~Ü•HÌ­Apëí8±Ä2·|ÿݰÄ<í—§'ÖÑ/-²•â»ÝЖœæÅ wãø!§`1–è£Z«ÏKh‚•ë}· èwÀBƒïVç]˜Á¸Þû¥BâìÉ{¬hˆduµéJ}/í×ö G`õ…öÜÖ´‚\ ¬k<áã}Ö Û¶èõMðhp¬MϘ\ ù²ýQ×ú ®¶(«úï¥øPwÃ0È 3/•^­–BãÒ¢‰ÏÿÓÿÀ±xNKßøxd-à8 2RK¨ÂXƒB…$e¯- Ne J­eögˆ+5í¾ú¿í– +æO„BÿôŸÿe(Ãóî»ô›/ŽÎÎ+õ¯ cõ91Þ-FåQ¹ÿÐŒ¼Œ,.¾üQ}+>óð6=ö"¬~…æª[çŽOáfcøzöã÷§ÍêÁp|ès”—»{íʈËbOöFŒû›¢×¡Fz³vsËHyKànÞâµMÆedžŸ¯Þ>¶òýC—_w•ûf›Ï/èø½kÖ}ñ?uZNë ^+îþì5ðÍ»ÃëÅᛤ.• üÁZX~Ù©½~9Þ~±Þöíz¥öÿ[åþÄ óÇ®¯ÛÂüÛdÀ½ïƒè’–óYù+Wíסd.Ä'&ç++ÉU›Â9è|ùîõÙ9ž÷{½5ƒþÊa¬dÌsÑøŒàqÛ}©[?náÔì²õêˆÖ¿Bm@þóTÆ•Fÿ`å:Ž€îJZ§Š›;6§µõ&¥ÂóFÙëÀY@Üù1÷¥ã[Uûêop, ê1o+‚®¦ÿHîúóÇÈúdÀ°å4t7,»Õà·~ܳq»-uŠyj§ØÌÎ26X‰2¸èÐ=Íím}¢®­÷žç­ÇÑ(oÒ—mƒ¦Ó žNE‰'Ý‹jõ¨ð[GMïªÒuhúiÇûèNÏ…V|]Ì>jÝ6|=DМ½“vøò²ëê[.Áš×˜ÑË¥O<5óªóѰè|1ºìh»æ ]ºËŸÞ°åtf–pÍLå㡽ñæ½§È£±½ß±x³#9vLŸ?íx–ˆyåöéuν YRäúÿöÇŸþþÇl4ƒ™Ì’pŠdk­Dòê?þög˜}÷ïKúP˲,?æeÑ2ǼŒÆéo¦ƒñi,‡¿ûÌ´h p0_ž‡\>ÊM¾KËt:m" «°‚ÖÉ3I¤1?<ùû½aã:Õbê8ž5ƒÖ‚Û)AsÅÖ.£1)if¾ÛÍûC4Y±ˆTï6Ü?á~>öTæ4¨5¸øèV,‚¶–Ý‚¥È*«» ItVzé£Í‘^P¼ D7Ú­>“Æʺ:Ü˨²sìPFLM«]ƒ „94a(©¥µÙŸ`šV.{±«Á )´¾Î$²¸ˆµRÄ2¡5 €^œn[bް‚látÀ8ÀwJ¢Qsãn'46Àª–ÅâÀPÁÅT„iÂüU‘C¢„–4ƒŒ,º'pÒ¬‚¡ ˜)`ͦÌfæ$ÿ¸Ÿ%Ö2Ú~.î!ÌK$5V§a |˜bžA'Ù“ d·]¨Eª‰GÃ`‹ HÓóÐõMîS´5­LW8,1B š` s3h€ê P ¦€Q\`²‡D¿þ Žêr[ ] ÄŒ)Pê¶~ }¸˜ÀL¸¢·*t7àFAv‡0@C‚™B2Vì !dˆ£ÆRÀ"ÞX„‚K(RJÊA“BR0Z(E%šÒ‹†÷ÂÓb/\<‰²Ò¬¶!Ó¤2茰dK…‰Ž=±˜ÂÓÍ,5Ó€EÐdsËYH 5t{+n)÷ì_ÉÁrWKÍÃa¡Ž©¡A†§§g¿ýécD'ècÜÕêEjcµiŽq¬¥–iš#;þ‰þü<”R~úiÿò²@(^žŸv)|ø°_–ªÿýó?íKs v×e¡ŒpG¬ C]½µé+0ÈùÚ¦“ °ž³Y£WÛ ü{ªÀ^àeí`9 Å´þnÄuw3sõ$⼃/«±y.ktw&wË ²+ð‚\VRLä–lˆ•Ý>¤~7Á5P„QIwŒrœÕU<«™˜H7ƒs3ÿú_gõ¹pxa´aM—yÈÜ£µKr,‚°98ÆÅ• AæÄ– )KPRÀ:+·>¨G꿺íADž1þé_þUJæôâeê®®…ÿz €Þßzñ„9ïè?‹ . Ž.ѱg!Æy•óqk}V,öš^Û[¤¸bûöÓÛ=êÅr;x¼iÛ|ܲŠ<Õ¬g7n"*žãPOõ§­Ë%=õ|K°1îy±µ:—Ëo÷wëøŽäZžqŠ/®ùqOÕ£ÖÇU÷ü›ÁúÜBQ=þžQ©tžyé> ¢Î!›:öR‘P[´Î‡Júyé“™ÞÛï¼JܾÁ¯K0ëyýó̓¿ýsü¿ãn¯·™êö»[Ñ´ÍÊ/¨Û½‹Üy$`#¿ltéõ~_}R âvsÿçÙfê$ýŸ³›^Au]ñI}é[TªW½76`^µT9ûƒ2qy¦o—ì®>ê-ä–‡êäÚbl§íç'IVwgýç•-ü=œÅ1?òÙ"ö]’í[$È»Õlßð 7ÿX‹D›y}»}çDx!6¼bss1¯.ô…tû'¿â_/u?>ßf„yýèÛ´GæW} —ßþF#™¯ÏßÜ hxŒÞÿš€¯©f8â®Ï‚¿,ˆøº.~>YäAÃÁmHÌuøSŸú•ií‹(ñ—ó7wÜjÏo:‡ŸÊO]‘?Šf¶OÞgºa¼]eRïfX¿pIù”K|í—½¥Sçó¦!×z¸SÕ—Xl½r¯Ö¨Ï鸺Ûî<'¿ùúé€L÷O} HÌ@âÃßÿôówˆl)™ñy†±Â½ºU³Ã2ÛP¡ãoþâ»Rà€„e˜>îãåðî©Z懽Y©{& Ãò£¿/³ÑÆV^^ð/ѨhQŸ²–+ªÏq¨ËlYÛÓ.SRà°ày@¦–I0øo>؆¾‘m¬?Üœlã4eNÉÜ®¬EvI2'å)†§6O?Æ~vf¶Œ„ó÷O÷õVÎîu€riMÅÖý¢’Þ–4sú x›á¥*+‹ͬ˜A)$-auç™Ñf¹¡x ½˜ºÛP›æ,Æ%uPþÅ¿ýëÃÇÃIb$,ÒºLaÂPÓÑ@˵9Ftϧ}52UFOOI‘IJSffŠ‘Èµðÿº8æ¤Tö¼xvÝ?b‰òßü³\ú¨ÔRÇ¡> Ï?|wKÞ¿x/²ÎM°ßøvVÿŒhün‘À+Íz-DXÔò-Ãêû€‡ßrê¸SŽsìøD¨÷ÕðzíØ·ˆçßxï(‰¸-Òú€o3zŸÓp5vÖÀ7Ç翯éß‹÷ïúÿ°ö®¢¯77|ÿ‰¼~¿çøÐjåÍ5ï¿Ðñÿ‘Cç&€q^ëxØÆó_‘¸#íqã7Þ&B%Þ¢ž~ÛÇÓm.³¼ñô¾Eä§/þÍo•‰tÏöAÍEš]5}zÖàº!æSßH=ýo}älzfŠzï“Nåcº ¹^å#ýb‘¶$êª"躨ü~fèÑ^es¸0Wãqùóµô+C§oxC}VàéÓcMÏy‡ËWoxc’}>¾úšPçǵ{Ë|öŠtS„ó-·Ë75LÉyzþÜpßžy"«Df-åå§1·þ†2”aY‹ÜÝØ2³ÍHyuÈlµN‰YË4£øóXªôÝP[ËûŸÇ±à¹DË ±L“>Nó>²‰;ÕbCÅ0¦ë /­ŠË‰\Œ-Àº•9gWC×ÂÒnûêÃSaP[÷©XËhÀî|» 3ø  ²h™mð“b‰^U¿6ØŠ2GBnÌ&ÉÀå0·Ö|„UÈÖÞlÄRè#mìê9ÍX`L ’ž­eD¦Ü½Ô@ôjp™$Y+õYð\& XÅÐd'Y­ 9¨íÜ‹ÕÁk (D…Ñ*ÑJA½0ËÖ:å4¥Òáu%~ÀLB²‚6m…÷Ü$ €—Uì[þ"h’–¢¬ÒD b'.è€9`‘•Ä‚8à§ £1j‘K¸‚.Ù• ÃÆ¸ôÒS8]Ò„W?L˜Bæxro-#±½µˆH#32¥q°lÑbNC£ciˆE@ÄÖÅ·H½p¹±òÄÄ"€³°Y3ó ÜÕÍ¥¹¢z˜€…2¡€ý»B¹¬rí4cØÜ| ™ÁAJÙÐl­÷*±:W6ÁÂÕy¢ãžV™(Ô ïqXEä¶t/SØVÞ+ØûdV¬ôÿŽÒê¡OKx÷Á ¢·@4Tšj!À%„ä¡Û8 ™¾S&bIk>)]±  €É*l@Ÿ‹gɰ´˜ÂT‡"&ŠœV¼jB5Ä.õD-eÜ–E ±û-ryY5å¶ÈG‚xcνÅ 5[“%"€Þ¡xQ¦!RJ„RžîˆXIý^Öá  T«+°oSdºá0Ï^¬kæý 1”Ú­‡k}>ömN%‡jÓ~ž R\‰Ÿ~þØ–0`L ÊthÈR!"b¥lõ„ Êzc®- ¶-õ]÷ïÌ1¬É¹•„fk@öuϱ&HzO@÷ðXmE*ÜWïÞ$Jƒr<ëó&@‚fÈcuRî_´BÃbëWè)„\}²¡àpdÒD3*ÍK-e°̬‹•ÁëP`.:@÷ÒUP“¿ÛÕwÿó¿5r|¿S$¹Zd&†"'¾ÈSY‹Ü×ÝßÒTJŠ™22Â,EÁ23 F*N%sAG'O ÷Ÿ›úÿOþòŸE‹67t+CŸŸ¾ûÇ¿¹©ò{k”ººì^T%ûÒ˜SÕö%ç± ÊGdL|ÿçt–Ÿ2²=ñinºO#u õK ÒÇJ§/>q}:ÞåxÉ‹9òÖ­Ú#%â&€ß Š{}ÃVtÉ‹6xþ~„ñ3º±ÉZŸ'@Ÿ…Ä_«$| -û«oŸßsàÿ«îÿëë›N¿¯]s¾ö¾Ó)¹|ïýÀ\ú[Ô ZqÁg[¾U³ä©oòâðÛs.¡Ÿç=ˆ§tØ•G±N6§˜ý®<ÉË|_ ’Î ÀÏ:x:Ú>c¶ÝOkB—Ύ䘥Óå¡]ð].z–¶I{}®ÑíxÜ¢ÜDýº:þ+v¿¶¢8;¶ââHC?ƒ4áÒVFÌ ÞÖzg›¦¯gÀÙ…ÜÖò’6LêÃÔ;ƒÏû”Ïš€o{ ÏéM¡Øë†XW©Ë·´I^+öëôãõj¡«¿9[”N7Æýéøy·=®÷ÚèÎ;ʯè>çûa]uo\½ïl%¾hª¼Ìr\­g¼4âXy÷Zûêãè‡g *gƒ°=Q6™.V_Þd´ŽÝå:_ÿÎIÀaš3óþãß,‡)"†¡ÈK©e|ÚÑ ¥[e1@Ruÿxxy·Þ•r82âðóÇŸ~úè¿ù~´%åþá¿þGÞ¾{®ÑæC;Òô‚aa­³]ñBîç6šGšL“ÚXSñ1£-«ô_+XB4d¬e°]÷\­PÏŠýíìA˜‘@éZm¢î˜k1ELÌ÷ÏÔN÷¾H«ÆTše‡´¶€ðB')* +;”b ™g–LÁÌ‹Y5Á¢¥*#eúTï°+lˆHXs°°Æ!³)g/2$˜ì€ksðìÉÆÁÆARÊXѲAÎ2>ãã¾MS`1Ff;´˜!µ`IS#P÷^ÔÒ7P8è&åšØ bÁ2ƒX«’3ᙘê¨j`0)‘‡ÉÌ5>§½Ð’3”ÉÝøj H6“\XóbÅR@E¹£!aÝוÕ\m^‘.Þ9ŠÈí`!ˆ„"³µ6/*Î2ú:ÀJ`¨\ZìC™ P¨·yGøI©Õ¸s‹Ì¡R;0 %Ø;A¤R/ —!¿Û¡2øsFÌxv˜V¯ˆ‘PRD…ÌÐ Ó=Zy|þ˜D²£ITÖTV!z³ñ$ègç F¶)eÏÜêAHw²¡l@†pBÂ0BIÎnbKMŒ°Œ.k©§%Œ´@ª ©´-‚ÔúøËD!vä!Ôºoàjñ÷ïž@¼L/ÕÍÍŸÆñÝ»]f|œö™VÜ‘QŠ \-›^¬¸Íó2-‹€±ø?<øø2‘1 e™Û»§ñùýøq¿O,K¹á˰•í!”ºšu÷¥¿;r¯ëžwTÓ–ÈÓ¿® +Ž)Ö‚îþ<ÅÂ^·Æ‚i²òÓ´Æ”FÐÑ„Œ{€VÑ¿cÆ:J‚u· lX¦ž„ 3swÀÔÛ¬XåP‹Õ"ƒ—âÕ s÷Š9É¿ø_þÚ–öünDñ9cÉ è‘ÚO“¸DTX}ªTÊ]ÝU´Ré/iPf_^ižBÀ»)µŒ‚I‘§µcÕ¤ ¬-™™j™ñOþ›±L‹$3+µÔÝPÇÝóo¾û‚Dþ1"ç{Û6Ú<ä8n£:›ýA?ûExsÛy¨×¹í‡[¨s‘ØÒy_G¸LðÌAíö=—±Ùz€§]âe7ôØ_Ò#Ï>ýÖ]Ó=«5Ì1N/2:Òkt§>ã¸àõÆýlqü‚{Õ]}èt½ùÒ#éó ²îð=nƒÃc…Ù{Üýò]ìwygäucbFlcÔ•ô¯‹zo“NÄÓmåÜ=4ëI8^„SﵟץìÂ3¿²ÓäÁä¿æ#'ºn8S瀆óh~Û¬ñ¦~禉ÛÎ`ݷܼËÁ¸ufþb”ë=È(¯—™OQYî2m^Gß|RG»B=¼X—o~ôηŒŽûÀ›ƒ¿Ý½òÄ ù dÓ+›µ·—Ç}ú£¶»…÷rNçšà¥ŸßkGñhl_Q.7Î÷Oä²ÓÌœïäevó­9ªWË«¿& €‹ôäÙõ èõ™ðçe^‚.±“÷&áñIqq}y¡Y®çõ¥ò‘Êt.žßfv%ý_Ýáüç–ñWî¡Ï͉]Ý퇖;9­×e·fÎÞöDÓg$ß–îë¼—÷á—s%—~ªÒ÷ J¸_é3½¦öŸ< Ξ\üêÅé‹Û+øê_ßZtÝéx¸z¿©†âÎØ|Ë‚øJræêN:åVdo¾DŸ¦Û‡å¶ÐóQ†Rß¾€†øõµ7ƒq‡„ø–Håa>šäe¦ê-WK¯ŒùÑVàv1øÒ€­oãrñýT<úÆ öM’þçû žÇ ÷2Ã׉£ÕÍ ¯wœÿ®›ýÃú›éå-jq¯…Åë8˜Ój!XJa,Ó~‰ÖžÆZR1OÕk1k- |÷¼žjü¼¼@±´w/S+ù2OcÉêyXÔÃÀ– “<šù~oþÜÊ3ÌWñµµMPŸ Ī„®Åª±­Óà†îäxdaãŒa ™ëy¶e•Ø¢ X$­k R‘ håä[cî’4V±‘)…¶âþûp»É‹XAÒj¦’ i$i½Ö½ÔI%¹’í k!¤h[¥·LÖ2%:a¢àX+~Ë@ßAÕl]aR$­°²8r^+ÃSR"æHVÊ;jÊeÈ.{o\—nÐ;"»Ï¯Z×2 ¨0OhÁb"‘„ו+bŽ: PD`>Ð]îš>`Þû0C¯±7Ù©¥èC!fJ Ô:ØÇ“ÈþùÙà`Ðmö d°5AòbKèã¾EÊKk>Ö2Öm^2ŸU†bûeiÙ0Í0 ›±Ìè´²Úó)'ÜÈT ûÓ¢$"Y Þ a:0I†À" ’³ªú.# v Rƒáˆ”<)€¦Ìè '2‹:þ¥H˜=+ðÑÀ^õßDGk«yƒºLœ›ì‹­ÜÐ6* ²ãQRïžé‰Q\3DÑ€&M€'ÊLpH¥aN5`ôÍ^"ÑÖ®@ã² +x70)À¶9ë†'(å« ¬•R–6×j¥8‚up1M†—\Zˆªaš#D5GR9@©ÒUé\Eð è95IHŽœÑ–ÕF3zNý 6c€¾bq€½_ ¤CÔO^:¾fŸ†Bwþô᣻©éi¨/@—9æ%‡Y™ßÿð¬Ô<eÆñ²Ÿ ¼{ÞðÝO>ÆÝ8ÍsËeí7òUëÒS`¾’ú{“¸‚t°áþ{>À°¶/˜¯í ½Æß î0Gí(ÿíÀÞ8•kS+kÏ úrä®Úé1ÙoÉŒõÍ}]õïZ“²ë™k3–ùÖ„fnðSÜ̽/¥ÕÜÒénf¾ªèÝÿõÿbíebñ¥E5Î?ÚÒÆ÷ƒ¹[ËÚÚÓzlJFs‡QÌÒ,·=˜¬{¾S©H€™@Ó*0gï§È̤ÍÞ[°âþ{C\dFüÓöW‘‘˼ôZ‡ÝPŸÆ÷¿ùþ¬Òƒ÷c¬5Û´nju¬2Ùö;{ðã¼W¯³Vk}ûŠË7‡:çñ¿Â†êު§µ›oÛðzt¾é=¯Æ¿¾y}¨3¾ â?Þ®ÿB åkû­ëðÛ:¾l>¾©œè›Öyòkس_½Sô™÷Ý7¬Ž¿Dº£á[\ÓßaÀ%£åuæÕŸ Cç‹G÷•Ìñï÷õÅ¿—ã×Õõ¥ÓêÏ :['¡[ë‘OÎù?Š{øDa¸¼"½¡ô¨2}ëÕW½Ê—Ë÷Ìk(Â;Þýúüá¬'âÊIj«þ_Cãs©>Iú²ä÷r‘õÖ¯æÝñ68þ¬_G糯=‰›`øXSõþ:WÿP{6ï%~Éá<ð‡ø ÙòŸ2‡z”êE‡×ñð‡jÓ2M³Ræ6¯cw#‘D*±,:ìç˜Ûà6ï÷Z¦ý?Ì*…ïvÓÇÃǦç¡ÖP´y÷ý÷/ÿáÿËÔR±ÌË¡í—8, µ·XÜåžðLp7°”0³¡v‡Ekëzå»á¤à2×¢TX¶ê×@Æ©Ž £*z ­ÙªxÖVÑ ÀºaæZ Oc¶T¦@¹ÖS„d¨6ÖΓ–)€å©zððó2<(c6k-½T§‘\Œ!eKrªÐ0ïgÖÂbÙB"äÊŽ423‹htB%b!k‡ÈŒ¤[ñZ#TjEº¬À\0$3]Â`&BÈÖæLÁ u­Îèî²dÛG&ÌÛÔD° rq­î¬l#—‰€Z½Ì|V[Ö2€ŽC HXEO2¢U„0¿"ŠÌᮘÐ&š0&®9Ô„–æJ‡Z£ÀJõ¢\7¤0%‹¡!F¨l¶d-ØÅë%(&$X­ÔÒöaeU¸ç‘wµ-ôò2‹–n+¨ÅàÆE¢ôžF`ê,  J£ÔF†i s`„‚Xð¬ÎV†l‚ÌE.²Ñ¨„ !9a©BB(FC-Ôr¼øÖæ„%×"ìÒ-ZÏ,ì3¦Õ¾QƒhÈ.øMŒeÄÚû–ÉLU§Ãš2¹VƒVb4"SïÑyñÖ93R é} #¼y`§BÂä3"‘ܲM™™œÉ$j››ÍäVÊGÂB¦âC!§ýA%Jnn´2XÚQeÌÑf0YÒÆ"e[ÁúÜ E¶¶zÄYÖ¶ 8+ÔÞf0ÂX±¡Œ­5³ˆÌÃaŸµ ª‡)†ÁR,…ßÿæ)Bó/‡9""ƒ†yŽí§&§™ÿæ/Þ)´ßOµÚ28ˆ¹E¾¼„šº¦5`ìöÎL«ÿ¶—Õ ¸Köä\?;úÌ[m<º'J_?3‘\ñP<6Bújp"¡-k:aÍ+Ã}®Kk4˜£Œk«DnŒ >P[w‚¡ó³d«Už9i$ŒÕ™æu(c/šÝ\ÅÜ]Æ `t¸ÁÒôþßý;"ÛaΈò<.s#Éê»±<ï*¤™áƒc,]J Á«Ì¹ùý)ÑR)f3S´Hmb»2S¹þ»oÎNÿ‘¡¿ügÿ|™æ>ž^Ükžvßÿãß܉F¤O€]nåÜ ƒQm3?'2þª¸•Ÿ.^'¾Atw—£ªÏ>¯Ç;|z›¢/Ý-iíY8”ùÁù&|Ö^j]nG?µ ÔFî—ØC~[ÆÐµ6½/ëwy¿ƒÒ¯¯?›×'r¨¿¾~‡Ê×.ËÆÐùÛ*~âó:!¾í3âÖá¶ýåÁðÔèÖ ¼ÏiBçiøó3[‹N®‰=ºº’w.Pß ’·I”ÏÐþÎúòÖµ)ÛÑÖy›â­0~#ËÞ©¿ñôÆO^ñä7† O ŽkÐÍyÉçeØtDuŽû¼)Pºët%ü]6_^jíÒ ÃW"ð©Äz­2:ÿn§v^ë}Û€yÅôXßÀ³ïÎ2§ ÛỶ¨òš¿ÇÝ:‰ uOÒåX;heç¿zFºòX¿¼sx/S‚›AÝnŸpYº¦;b'ïô€^ÌJÞRbtÖìË•rY~l¥¾¸ÿOô,^n /M€oŽçTΤù…{¢“,.áÚ»í®¹\}.æ?{q¼Zª>åL€›®žÙ¸Ý[•®>g­å\y‹à£‡ÍíËq!xP½rì._Á—ï»±ñ¸s· ¿W#y±©>›~<‰6:ûe‰Öê²Vžì|ÏRç{¿³2Ë{éïþËß~~isÜäô¡ ÃPJ)n!D4H¹d&µ¥‘¿ýÐFÃX|ÉÌôüü±À/múðÑçåçÿóÿ `š§Å–LÀ:²Á ¼¬è [ÑöØEÑA'ra²#J©­âuBhbˆÌ\‚áY¤n2êÅd¶‚«RR"!ôî s‘@iiá^Ë2-Ú@ê-2R{¡@J(µbÝR*@Ð' Bu—hû tÂÁJ¦uª?ÃbhÔ,¨N EŒ£âÀÑT ctKWTÂH@F%";vÿøÜú±‘(Ç:a®?DÏ7™ŒÑzºÞÚ!0€Ð ‡ÁêGݳ\°£)¦«Wî3Vm·s«"»§\L©»¹vÊP¤Âê fðèfÅ@RÖ`Ufàón†¡dƒU>—2{“éýóŽÄÔb¿9­T+µXi–¶XúÎE}\¦ý¡ðéæŸ"’ D3/J™‹µeQfOi¸(h…áè¸2›«³n÷5p ÂH;#yÔÁ8¾­*em™ç4¶§§¦Ãt ÍK)ÅŸhJ+JOušÚÇykJÙíjFýø2í÷³¹=íÆiß2ÔbiiØ=ÓxSײ:Þñ¤TœX7:U´ñî®àEúôÙW[.½²õ× ¶h›WîVÛîQWAïàØ1sŽZýýׯo€ 5µõÌòb7ŽÓ½nOÇyo4>éQüÉâëË=Âùç_½7{ |1<àuäÅ#åîºRêru—óe¼«©òèàyO$»cž{öõ¯ÏÕÆ¯gÝ[ÏžŸº½u zÌqÚGó\÷½@̺‡&«÷&Àg]¯Ï½)λԮúÝ?W>—buù¿vxÀÐWÔþ÷ß=çÃüÉBço„õ«TÉ; òÅ£˜·‹É­¤~ûd>†'gËòëü–†ƒ7f^7&ókâØ-èÞho ¢¾m„…oI6ÝSùøEµ ]÷¿’¶¿øtõ™wWK¼ýãæ(Ÿg;îœ=ÏCží¤ûû±àXuùíäÄØê÷£}ÙPŸ¯Â#]<x²Þ)ªîpG)šŸÎ.ò”¼èEº.Cºoˆz/{v©þkM>½ÒPÀO‹î<·îL9¾ýÓ›VžÁõk˘^IÉ~žÅÖýeîúwR!|CÎá\ø¾»~éj¡›¯ºût¹J|V0w…øüŒQ%¿ 9n\±».Rƒ§×ËO§ûhªµÔ¡X)tš#£ I(‡eš«ù,¤T‹·i®ÔáçÔz˜æç¡:!ÅÔâåãüül`S,OïŠ×z˜&äâu°hNÅ­”!£å´ÇøeD~Dk°1¯pó–`ƒº¢'¸[fväEçcd¬¸ŒP†Íë`Y¥±ìUÂ%Xƒ*è€Wß=†øxh/A+^ÁÌ,f]`ÓÜ4H)fëÜt³TQ*³™ôn„›)/Î"™ÊRG–ë%0€êbS÷S1)š2I[KFŽïŸB9¬<ýàØ>p0$H¦ s–êѯ5±d-Ð}73s´@&iJFk155´‰Ù:]ÞUCK2 nXÙMŠ>PÈF8ÜÄãíÉe›´”nL*3´….ñŠnE‹DX6Š‚Ùzþ0" ygj'µõáÚ± ÍÐB¾uÑ –1ÏÍ $Ju‚ÓaiÊ&ë!pIt S‰ é’UX eÇ‹ŒTƒv`B­{·‚?+Q‘Ä^) %µ†*4çဦȒtcIî[.Œ&ÅB…,êŠÿZfP@AÑÃÓèF+õ%be¿ôn3ö€#ÛÙƒÖ‘h°ñrI¡5XŸü¹­Õø"‰M]ÒÝìmP š4² `oS€œP0ˆ&eƒ%hžÁ0YAy†ÕÞ£n½¨‰¢0·éiD!ª[Ü0ŽùT­.C&„I§%ìðrh3ÊPZS*KËj†æCƃ alJ¦  fkKi£êG,Ù?®k¦JeJ½…E)Ìȵ“   Á+ÌÑœGkX>"CÁ0”eŠbžÊý~&±ÇôÌsdb·«¥–Œü¸ŸJñZl|‡&Å´,µ:´|øí‹9ŸÞ ÏÏ»ççáãË Øºwn)+Ù©/×ɳ¤f_Ð$R` ×òüâ'ƒßÞ1 €•Í•@,k9–e„ÓÃnµ•ö !… ô,©±Þ+ÐM&ú¿hÇš í±”¤à套¶:çÙ ]ö¢\í õpÎ\ .ίìBÞ°{¹®ÜÒ™ñÕy%_½|W ðwcïs›;¾á©Ëz²/Òy?S,þ\Ð~÷—Iþ¢_ôm?d¯«ZàsAüMi‹×ðž~ú&Tò‚ß·tk‰ò–|ÕÝŸ¿ŽÚÿÂiüE +}üO:ÿú<|Àñ˜Hø¬‘~£?Á/zßšYO½œy¿ÇËÑÓŽ‚__o½ïuŒçùYwÿ+bõ)ðU³òOº3ŒüÂdÓïz†|•zûëë&ùóÍ/Ìï&jûCbN^$0[ÆýO—ý-zÙ•½˜uqSQ ‚‡%óÐd m©£+馿T¼LK‹§bm¿`,Ë?üûA¹ì' Î¥Åþð´Ýs–ÝÓþ·K1 »R’ãÓ`óþçR²Œ½ð…˜÷Q‡UŸêEÍ™0/6Ž\ö22´þ XVųŚXWg[·p½K€+„íÒGZ‰pI6>ÕËœ&³"Íf’B¶ ·6Ì*­ºlÌÖ²-@$ÃJªYWd7FKddC·¨ -@‘Òܵ’Ì 1Zš(´"‡ޥ޽Þ,–J)¾EýÌÍè$#:¤5e"-µ ‰ˆÈ²EÌ9Ï’²R/.îô¤LD#C]͆hŒ'ÓŸIC‘;–…îJt¬6±8¬Kˆæ™½‰bšæfî¢éЈèo¨½hPqeØœÊì¶®”CÒBx¸g @QxéÖ6šтɴ^ HŸZ E‘© *ÖJ[uê¤yk_3Ò NŽÄÜañ@P“àÂ{/fz‘jCí|{ÇÞrO•ÄH¾„-EÉÕHN¦rpÑÉm5„“;i¯¥éFôÒÁô¶….ucd4Ä)u¾Ê»8™t‰‚Jo‘é, @.]Õ• Þ;Ô›dèÆL´ôZ¤³‚Ç%aœ‹d’1ÂM&Шàʼn"=E…n³!©›Ä–5ÜeÚPj´\š5Œ¥e‹5Ð|Ìj»¤KiQ7Zusæ -,@”–äŒ&‰Ê Ò$"S‡ˆh=¯óšAag‹2a†ÁØ'#}Ë‘4ÐP+ê`O»q?M©”°4íé©Fäá0»•Z|(ÃÏm‰ZýãáP‡R¥,¥ºʾ·ËçâËþ âéý0MˇûÖZDZ)ˆ@- !`°Ö É¥õÝÑÁÎs¸ tz[Û“9T¡€ ø¦9'Ð}”ðŠR×DÚ&³®µš|æŠþçÖLÐÚ–NðÕ>½ÏcòÕ`•¥yhš™{©Ns³êC±Z¼VÁ†R†ê¥’ïÿíÿØ{q Y´%G·ÕN- rœ å™LÁ3‘Ê¢tëÙÖYIÆÈÕU»uÖêºè`Mn-biÑ¢ÍK¶8ªYùWÿÒk)µXqÒ¼úóß]Dr:ï_Má¢Xx-màE«^ÕEÏ›Nÿ¢Ú#mïOmK÷j´~að––;½¶€c+õçEäý)ð[ª{ßtƒþ WthŸ__¿¾~}ýúz“àðGÿÃWïfÇ®!7NÇnƒSFïᅢoM.‹Po£ˆk<ËU/Æ9Dä-h©Ë¦ ,ëq‹·=UºqŠÕÙ“ô10ûœas¤W_0zxw„¿C^T‰_¦åuúfAnxÑ-zÄÔœ;[_|ߢNõ9g™7áf¶›Hg ¼§oÑiKœ’£<¶êìðxõç×ç<½ÞPðdµ5(OC¶îñq1D·­º`y–—ЃY—¹Ä{MR§ÈŒGÐÏé*ñº]à8›·å%&LdžièêòálÊ]š©{r/»yÝ^{Ó¶MêùB\~†ÎZ0€‹¦Þ£Åƒx±¥x}7ñ8Ƴþ¨ãÈe^¤=ofgnâͼÿ¬Í»m€·½{äÖESÙñN’x׌ìØÓ|A_:§©Þ]ª¯çåµ5©ÛƒÛ^•Ý>>ßâÅû ¯lŒxáRroðÏoRÞ¬¼³@hûùq Êÿüþc[B‚3w¹Ñé§¿ûm†ž~xWÜæeÉ\Üj´PaŠ1Oíåe®Ò?þˤÖ~üÛŸæÿø:rJ­:P#J“µ|ó¹35„¡TGu œ l·K#°jÅø~=oó¾zYF‚æÃ³cÄb¥bÞ ™2{݃0C!®¢^È;"ÂËj¹ æsÁsðî*@™) åi@F"S‹2Ax%Áy‘ïÀbmnj‡å°ÆÂµ¤M*H3¸¹)";ê%C-³Ð8dkp•”Œ&!"ŒX—5¯Ofž¶o4äã`êùËHš‘ (Zº³xçR€¤ÈÙ„3憖PJ)´¶¼¨Í’bbÅÇ#¡†X \K˨)7¸˜‰RTD°÷˜kŒ!˜É#CÜ<)´FKÐÁâ ‰I :a”-H˜‰Ò ëî£$Z¢í_©#½ö¶‡ "ÍÝ×ÖT%Š[¤˜RÃÒ˜J­â\ŠÝCÚ‰ ZN8ôuÕXVdR*F®ÖË$a)'÷ˆLñ÷Nù XLžö’ù34ŠÏä:(ÔÆBA);½pB„DX"^PÙP!ų-äb¦b[ ±U{v¡Öm³uµ­|»k ™`nÏG!ò”, Œ.,B!fQäA0¡€ ²ên(ŽpF•L`F”4õƒ6;èkœ• Ô#vC-îÓ4cÊTŒeŒ]ÌKcfATfE->qe ¶láÍÝX%É8hɆJ‰R±4·T m‰+s„VG„L$ÖJùf™ºz^à«À‚È|™¦hé†Z-–lÑ>|H7[Z#bqw÷ï¿{ޖ󥦥”úƒ)éßùa¿´ätXÆ¡ÔZR:ì—§§áçû–¶ØqåuàÐ'ç°ô‹(låõ÷è+V¡€°-3 Zà¶Ú›ƒÝ:xërá¶ÝÔZéj)´Ñàf=9ºÅÕ}. 7a‚¾>F”Ö"KáÎk,ŒÅw£gÌj­6:YK©VœÕKqÒRéäÓÿð?ö˜eÞ/eðB0ÃóÁl0ÊXàN3³[½‡H®w’@sæ,sÆ‹DKó¢´Ì½Ký¼ï¾„Tt_ßX¢-K,-—ÈHAæVjùoþÕ¿6÷R뻾»D?+û¹,ä¿æP\k>%¯ªµQ0…³¶á›§ÿæµhîêWu¹%´…O'JÌ ÌéüqÜdHèMà×W¼Üñ ¼ ‘yÚb¶B·ð›­LùÜìÛy عÕû¤€Ûމ³Ï¹îì>»à§B ­Ý3šÏúnÝöòê:¼½×›.Ýã~þ€»SÎÛF‰3ÃYwÅu«nwÑGꌾs¶+ºÙ0œï«.9ʼéEÐE¿ûFF>^һŶg¦™Çu—_îºÂ­t¦mÛ»—ìS²Úë[†·dJ®úî,"77À$=ºã¾àØn;Þ.9Ýe?*¾KÂ/SYu E¹d¹î‚úÒkzý~½âª½2n/ÿþ†½uÁo¹f‰¼N::#ëŠtü*‹F·ps<îødµûã!ïMÚ –òVö~gÏ'^¥ëÜþÕùoèF½åãã…Ì~>íÿ| ó¯sÒ®ÆS—òüø[ø)+TÞ20®FoCo] NºÔ•oî]€<>ézÀÊøÝXOWx<»óñây-OÞÂ[¸] ×=¯¼Ê™’¯Óî±B¹±T¸b/¯äØ ºÍÅ#–¸JÜrÞÁW&åkÇvž^x­"[·¿À{ñl/QêRå18½Uʯ²1'Š®ë‚6ÄçÖRMnJû]þV}¿;ôhu{Md¾é‘å¤È+ÅJ¼‘j·]ës„ËÐ7¤’›ÑH‹©.sdü¶Ï9s§:§³DÊ-jñ†`H\[ð‚NÊKƒ„ó4Øc\ßôG>à³Òo½-1øÙqÌUŸo™×Q\;Ö2€t=áW‹Œÿ lu}BF¿I\ÝÛN–—±öUîKoïÆ¼xáñeÇ]¾R_ë¯a¬¼Éž­Ž¦%§þßÿ¿þmnÊt·:u¨¥V /{€O»²³žöECk¡¶Ä‡Y´&Ù0<=8Ìñr˜óôóÿ¹äüTóp˜#ôsPcFZkÎJCõAE.iï‹Ùdùþ»´²êÑOãY÷S"^LÜE;ЖÂLƒïž³MjwVæ2îh¦ùC23Ó ¤F¯ùWÓÃæ´)Ú`p©‚¥(‚‹‚•þ/%èP£™RjZ–Å*Zk9 ÑX‚ÌhJ4£˜¦Òk¥¡öÈ€’ndw}µõÞ5£;ÀÖš[™é^+¶Eœ^j,A¥ô¶ Aj™-Ú>¼ˆî–ˆeᜩEZ¢MÙ•¤Mqhsë v€fdý º;*ËúŸ½VÚØõ3º)(°Š'×ê1lˆà=_Š ElOJ¦"̉)Œ¤QF5Ñ(DQLH-IºÒWȉ Ó Ô~NÀ(³/Æb%ZËP¨”@uš?˜I‹èÔªlJ!A0ûabEÆÏzÍ>‘Òhܧ”2ý¨(âmŠ^ìN6ìÌ+ekcFp–ö™I%9…ÐíÀÓ7&˜d\¡.mK~D¢ëÏ×;ÂdBìz°Õâbõà=@°›p%ɤuH8¸Ð”÷‹ìPCjgD‡ûĸÃÓwBÅ, /(ä Õ¿ýTÜP0ì`ÄÉÞ6„\PP@Ú’ËœV¾Ÿ¢°¨$³4|°Ã¶ ‡ Î9f%Êà>–ÝÓ0-K›— èf‚XÕóf0§ÒÕí’û(uÏp±`I°7Ù€Û øÖ ÕQPš¡«u8hŽ–fw5÷©Äó»QÈý|Ø¿,Æ2ÔBÀLKä|Øÿôó~žÚîýJ×éyôÞ¦º9ó(­Æ¿ÜâÁNãY-.´¶w¬u'Gûb‚0ôžx¬Ö)ýWZ·K‰Õ+¥[GôŠ~`Ùö]} IkFX«þG/[¦ÖŒ^+‡Zfæ¥ ^¼°CÁÎåN·•C{÷Wÿ²ç ÑF§{mA9@5³â è¤À²^nÉ.)s7Vvw -Á jRB¡Ö"¥,î ‹îÞ³µK´yY¦9[d&Áú/ÿÛÝûç÷ÿø7½ž+gàÌBg›å®_ÇžÕþIçÖ­oìR%ïÔvœDàKùƒ[{Á©‚åa‡Ï HÞžGÆøbêÏ—×â8ÅÄ-ñÕ¨U¯—}ߪzõ?q—Ñ{åpnÐÖHÿä: ÛMÝýÉ£+ñâÍz£Þö÷¼ÚcŸ,$^%?œº‘«®›Äõ&í†ËË>9Ýu)“SgÊý¶{ë/p5Ut-Íýº6¾ ±Ö[þbÕ¾oÿä·o‘¾Èõw1òŸ\¾v{õžº’Â_UÒ¿øòézÖo,e»;8ot øâÙwÙ¤t®žóQÞèíýÑëÑFý[NO¼ñ,=óÇ  =ìüÈ?§mKøåZ*uo< ús™®.Ч"–σñ«×¯ Ï™¿¾~}ýúúE_öùEM¯Õ ó³V¬ŽÃ?Vë ÿáÿó´Ã¤–4£—$áŠ8Ì@>¿vµ8ÏKdPé Kq ©©xhqwÿá»yZ>ü—ÿC¹0KBqXKYp¨nåi—ÆÝ®Œ6ðÝû9‚m²‚6ǡe`öò|”E&sÛí™(;V7qXæ†Y+0lJV†Ñ̇±µ·Œ¶²)$$ÜQŸ‡•Õ%5Ëô¡¼“ã]FX4PÉU˜í6©H”wºÒ†¹ eű–^š7ó²xÞ‘eÿñCJR3ÈÖÂÊâÓL-a]£e™€uæÍÒÈ #™@NK)£”1E<¥˜WÁ˜f´Á‘ÓÑŠÖ¤ËËK'ÊO?Íí%ºÓ¤²ƒ"æÍ6N½bÝ…ŽÒõÐX³oî ¡:´€Aàš$ˆ"zqïÒZ2“‘kÑp)I •0h@äÅí@¨7œT$”HÁI¸ê¸ÎÙá 뉜U…³#lÔaÖþ°tÑ¿»º.ÀŽ Â¥^éÜó¥]‰4`œ¨ €0áŽA Ù$ ¥"R½ceŒfîfÁ"¼“ˆI…²ƒX’ TÀIjB¤218ÌêÝÐa9ZÓ'ÚÚr±äj!0{BBh/H[åÚr…SÀQŠÍãwͺÆÚöA õÎq¡Ü${íù‹/ðIVðÝŒPašúÒ‘ŽNÒ_»CºšLÔÜá¤\tˆ0˜W0’n`¬Ð»á±«¾´Fx}ÒÔ­ŸÅ  Å‹–ŒRa,—¶’å’‹´ô,Hsd‰Õ:`öÅ€»R,K¨ÓdØëëc–ÑÐ?æ V?pÙêŽ[ÝC‡}Îóœ™Çt‰2øî©Îsì?^^c”ï­ψyZvÃS"‘üé§=ïÞ?ÿtøéÇý27:¬Â½ÎËÒ]L¾÷îãá£Ux…ו±ÓuÿŽ5ëÕúý ØÖ^MÞ\nµå t4ýÛŠhð'¬`™¶äAoÐúlŸ7£®ý´“ÂÛ*”° ”È`R´¬æ°~á½z!½p¬>sguU§™‘ Ùî_ÿ÷K ÛÏ©¬»ÁÇJsµ,!7æ4» ó<[Q †\SXåècàKC ¥xI¨¥–$Ȅ˔A+FYË8Vó¤"SÈÌHEÆÜÚ´d¬ÜÕö¯þÕðîéý?úá¸s¼1b=w2ÂQøç…5‘nÄ“__¿¾Þ(^ýáÆß¿†Þ¿¾~}ýúúõõGñú£ƒÎÿA>0Ïû3¶oßbbރݜFëóÒ?§;0)Lçm Wßzþ[§¿-àþÅ‚ÌSÀæ¢;ïò´ÐãþóTÇÓpöŸgų÷“W^ x^z{Å™¹{)Ïÿ¬µûæÃuþ=Û©ñ~E½¶2˜ÍX§Ã,ÖÝV„ ÀÑY"ó•2¢Ë ž5Q‡pr;ëá<6WÕØº®n¾åG„¢­úp«¯8K¢êÞ œÑÀO[1ñ²ê•dåeç¡ÕûêÞ„¸š'<ŽîñëÔ{Ì£ã½þñ2žæÒv&'íñ&Ó¶Ÿ¿s”|èaÍ×o{8¦«Ûê²s¼˜5LWËЩˆ†·ÉÿÛ~ÉËZu¾~‹œàEãÞYGÖåÊ{ÓûøC¯r·2åOÇ=V¯ØŸD|Ás÷^eرÿº'ô yu¢mS3wòÇßþ´ì§¶„ 0 #h"—iqòÝ»ç¡Ð23òðÓ‡éer0BÊ]mKJR`x¦ýòòïÿ÷å0µ–^¼¥­V ‡ÆîÚO¾dŒ®Ý÷ÏËÇ)Û ÊP8¾Óm%ºÆÝŽóK×ÚÈVB:sÖÝH*4£Y›2s.ÃËu&?6‚]Y¡ÿ)4ÀÐIÙ]ãÆ¼`†Ô¦ØgËâÅÍšçVJñb(«Ù4§”•ªÖzãe©E$`M(H¶y‰œ`=3`æ`ì–VªÑÁ’˜fVv)²X­õ¹,û†@*É:îLËܼó°;±¾¥™Å2O_À0gÄœmå2½Ä<Å¢˜3réⶪq,3HxAM´; T "¸ÒpÈ1±SÈ&R°jߥCC„Ì%p Îͺëp¥²1Å”¦ 3‰„½t;Ña>0¨¥Ÿ¿[Þz‹/¨§zá äsÚá,;vw¾aG}³Í{¥ÿbCwµßû졸ðmغ'n¶ÜŸüáçý€û4¢¼h…¿[”Èë£ÔëÛ”ÛHõ,¼™sz¸î”7[½S3ºÞžž¹Ðœ”Ûaov¾ÄÕ¾Y·äÐÏ›öw `ïa=xÁ zØBpQw­+Ïê_R‘º;÷ª`ùú õzŸÐgIbxíòG™ƒ»™W?ù j뷹云ÇŽñ«HŸ»Ø½í¤.柼°W “+¶Éox¿l~^BôhSÿÑÙyáýkfÝ'fÁŸ tþ¢ïK÷àk×Áox^=l¯h¯wÜ‹t#ßyÛyžàRž:ͺÞÐS/¯ ïµ6ò26Óyæñm¯MÍ£3àZ¶Â#ŸgÂ'YÎ;÷t9 øÚ“Н©¸$EO÷™'·Zñ9÷qû³ù³5úTÛñ’€} |Ä="€ÞˆŽ¾y§øïl» Wƒ¨­’èJ’ßž—GÍ›¸ñ¤ö¯4Ä‹z%én„½žö½¶³Ó’óG³až.¢)âÄ¥áí1?X{;ìz"ä »”¼ê¼ÔýxÛ.} bqßáeÄzu’¹†Yz-(ÓÍòt¶P çngž˜±·Y®ëþòyÞJÿ÷¨ô×®÷WÉ~èí¤¹o8Á‡žwÄ,àítÚ2{«ÁÓæèò`™¾@¾.Ù¾#T!½Øîù‰ÈX–¶,èJ)2HS†bÎB£eË”2Kz¯¾vÁ\ƒÌŽÎ‡Lr (µÐ-ç4ºe9ÌOß=—¡´e©¨t™”MXRT´†ˆñ©>LóÇ—vø8}ü¸L„´²Mf`…Åj‰i†h+2ExFsU«ël—õÑNZj$¼PÑ„mµ Í-,!uì>EÄÖˆf‹$"Å¥1“nH @&¥,&%t[6ÌÕë—·úú cÒë”êF¯Ý2´¬\{¦ †b aŒm÷ŒÂÚà†±"€F¹â]3M¡€À4#U`¦=Á˜=w`· øÈô”vPî‘‚8 %EÒ4ÂRY(jÂR„|T—éG#à ZC&½ˆŽœWÇW XŒ’¢cÙ}MÓô¥Ù¶Qê¶ØxÛd=GD7XÙ…­[gKF†4*x~ÆðÄÙe "…*ßÁmŠi¢!¤›Ûvo‰ÐÄp_×Ë~†3˜ý‡¡$°Ÿ^”ÊPJ5+áËŒc> ™)£§´žZ3´_&0µ@áµx¢•!f¬˜[´-Õ²?h{£ÏZÝo+Û§ëé¶9èk“|€ÙJÑI‡¼®mH+CżeÒ€—Ã\=ŸžÆïÞ?ÿ¼ÿø²/ÅŸw»y×€|ÿî]uŸ¦öñã!Smɧ§±E¶XèøíO“‹‡iù/ÿõï[C©ˆ¶ ôý†ZÉN†²woh­ôïÅûI0át`D­X›E| uSÈeýu÷µ ¤Â¥€D; û¦À×÷˜› ²a™6o ÂúH îD*B ¹{©ÕKI§{©ntG)žtBæ„—÷ÿöD fÚ¼4Îê> ¥£Ù;¯x2<™JÒw»qè¶nj €õ.˜A)wnLœC XRЍ‚—b=¢ŽH¡--–e™—67Döˆ»ÿÕ¿ùŸ¾ûÇ?¨?ïì}OÿºÜ’w…y¾]¨Å¥ ×&¶ÿ“ŸŠgðPÉ?×çyÚ_œ ®ç’3$ú¹sÙ™D{FOæEªâXþ¤m¯p:Ÿ³ ŸŽ¦%/¥Ý.Õ…;µ,oðð »1ý]eᬒ»e#ÛÔК"âÕ>í¤Ÿð3D¡ ’«º(^oã®OäD!Å+ˆªn“um¼OÍû3æí)TÕ£"¬{àïGå6Œ?N`=¬èyðÍ˽î'bxÚF^ìEoj›>¥L=Ty^bœ‰YÃ3uò¬ô-õÖWÐü¯ŒçÝ»é³ìå>ywëgyOȼØC]nH_n¨¾ôZw?^÷KT‹Î½^—¯¥Ä^{BéY¨WÖÏ× ¾rÀÎTIÝEÕ_"€î,,W°ë?ÿþà]þ•Üëy øŸ9tþZQ;“£ú¹ÜMÜ–“ž[J^YŽ^(~¿‹›ý¢Àÿª*ôx9Þž¸sØúEÖv|.èr^ßæ„þ^¿ÃÌ´þœºùGпÊWÿJßúêÿúú†å“ÿs?FÿtÃ×D|AtÅcWÐær9,ÿõ?ý—LÁ­”ÂZËà¥e£Ɉñóû—ß~ÔtÇjÎ% Ì,”âÃßÿ´|ˆF˜‡×â#X=gYÏ—(užê´ü8„y¦¢)g«Cä1áiÈÌ/Ù¦9˜Ñ Ää¦yY1+I5”Ùè(OïM?HgÑ&ŽÙ)ö4ƒí¸¼¨€iT¡JÀ¤€)£k^™4`9DŠf4dSS÷•¨e†Ñ˸>*—ÍG]J€¦j®M„ .&•fÌÌÉàé$MR”éV­”¼Ô¢È\’¬ i^$L/Óô2RË:V%sž•Ñ«þQ°ÿùÃÇßþ]L/¹Äô”HØ€R·ªð4䲿Ù|D}^Ý];«Ý( D£aUÛ‡‚2!"×| "Q|å’W2xg͵³'ò$¢QBhµNéùZÌݧy ¥™Q- IUW·]hpUÇnèÌ(dKÀ¡¶ "Ñ„ ´-qש>ÔDÇ3;Âi&Íê¤úMs-FR5µc›WÞ8¢éCGÝ¥1¤¹dHEœ˜`ïÄw²¤ ÚÄ\LpXãì…‰vΧÉàéB¥È*`hSÇ11v#P¡ )#¢uB½”H"î†tï\Éœ;ë H˜Ëš éó40Ña(ÈD÷C`’jÅû÷€9³ÁAšjá’ £VÅ`=ËbðÚ=‰Õáž0Á*8h­'¼r³sxª…>·K£,r®ÅJ­Å´_Ü I%4%â»§÷¡Èœ³§Â†4ÕeŠê&ÀêCÑDŠªäˆëY¨-5eŽ$ÌáBæš\$ÐÕPF„À€*’G¡¹f¤"[F,vC=Ä’‘ZËö[‰îd‘ùáåðáã^™ßÿðîp˜–XvOõ/~óþ§ºë¯;ZÌÅWßæ^ßùW¶qœâe­³¢P PV±žÚ`PÝÄ`€² #¢Cüµf»{0¯›=2Ãheçõež(,JnÒ@o\ š—±Žé@q ¥xeõ­ÙÉU  m,ßý›ÿ —'dîÌJ- 5;8XËs jy—ö4 ºzæ¡ÃËzŸ„t)EØÀp‹e£Ú’ )RZ*–…0ÙBÑ¢ÍË|˜IÂ̼”ùoÿÍó?ú™'_ߋŒK±º¯a¶õØ/ðñ±ùÚZTwìø•sw×±U¶ëúDxáçöǶïàcú×ׯ¯?Ê[r5¹å¯zß›†ò§ »îñ»Œß­ßÇ]ô‹rÌú¼b’qþ†·&>ûZñ¬pû4¾8À q¬øÚÏ {ß81ùZ+ÂmÌÅ/:›OüÞU‰®½V6²z‰]o%>¯µœyœÞi<¼Û½pn1¼þü’ýþO¯ûÂ.ŠèoK¢ô°Ã§"'»;NÔ£ÙÎ;™ˆ;Ÿ«ò›­óºÑá~ÂJŸ˜ ÇßÒ›ÅÜæ ώᎷëãët±úñóªÃ®v³=µzγ½8é3è/2.½gõ™«ÀyeØr›{£ó»ˆ½®^Ÿ¶‰{ìS÷¥³‹ÎŠËã½ ÐÛ’¶ÿqm·ùøÛŸÿëüO™¢›¹»QF˜Í­Ii@ÌK«²í3îfæòÒ0V7hÎL©eËúßé„›ûìµ O–a^² ájÕëÔ}+NÏv²ií2i7èì¦õ‡mkþZ V›&dOO¨#s§Fx¢T„„ ¸ô›˜U;W-«dœ)õ ç3V¦ÁÝÜÌ&Ê€§Œfwc«Å]ÊÃôB %%„=!w£¹)rFÉ’–òféˆl¹¨x@bYæ9«RO2Ý GÝìså0Gr ˜(ò“˜-ñ½ÁTô˜°ð#Öª h)áeY––$†¡Ôê‡Ãæ(æmŽŸú8ÏAÃÇýËwOï~øþ©ÍË1 î¾;æ¶,?ýöÃaYÆÝ ˜­>ɾ5Ù°D›W»rV”þW ” W¿ú½IaC·ìs=ß̵J±ºJ˜¯  þ!ÚZRàn©ìê7T~ªu¯©)¶ÌifýùWÜJÙí†Z ‹G1”bÅM,‘ÉÝûÏ[4†ÌP³3ššWK[áLZŠ`zªxõnÞí °¡cl{äEhˆŒ”5XX.™-Uœ$ I’¹4e¨e,­¯Æ^J©å_ýõ¿{úî]´]iÞoH>Õ¿‘Giô\ì…^ÝÏÜpF®¶WaÚ-îá³Bœ{Œo¹ãy³\;Å­}àŠ$pòù ŠáÓÒù¶‡Ô5ºsÛ,ñѫϊJ…Oë·U '€n/Õå­¶¿¦Â¨÷®tòÙi¥­ïö¼gà,’¼¸¬Ÿ] vV*x+ôI?Ê;XäÇWó ª>ï¸a.@œ¯*¤¿ÑüäTü†38N=½òþO9‡ëÑæ_)̽2toyÛ·’ñ»}îéÜ.3[ùµ¾æ¾þÚÝô§œ¸\nE¹­¾ûÛ,ç¾Ðù ì„éÛÎñ1@⡽ó'Љzܵp¬í;×öxZ¹V¹ìOÓ×á¼Óâ< p+ñ_²éJL'Yø2¶Ð*ù\+y!ÉYß1ú<eë#¼ÂpœiÕW! ¯;7)y†üÃQßÅã{í'åe_Ͻã^ï½õP'FÒu¯dÒxžL¸'ˆžH×êòe3ëå%ÄùòrPN¿ÂOäþóà~Óu;ÎÕQê‚à‚‹]I«ÛÜ?-7Ÿ}ß]tüæºèü .´ué1>긹ØT8ƒIÝëw:ڻ߄÷{ñ±Sƒò áƒ#<輯ðr¦‡É^Y,Ü\È;U|m{°6ZáúšÖÏ{úø¶¦èAºçŒa¦{¿ÿÖ§û½Ž]Þèè‘.v“Wì¶›¯>.€<> ÏXGzû¡¾Ò¢ûz—ë­ÏAn”ôcþõMÈk„;Þ&nÎ’{:åÉŽ'}>?6®o‘¦ûŸ>Îû)[’´âuvÏOMi¥ÌKssä)/™zÚUPõÐ"" &s€”ËßüWîH„y‹\ZJ^fÔb˜ÓówO–ç{)A˜Ñ&X²c«Å¤AìköîÙ¨œ÷^1¼gîe°ø1["m÷}S;¨ ­±3Ð3L™`i˜QÑ´`!¬lH8©è`P‚mA!²!š²sâmå›Cr' ÂâtëtyI\¬@†™¤Þîo™¥$u]“i–¡ÈVhÆB!YÀ*¸e´\P‡]@¦2–ðjí°¬í ÑÄTÀ¹r^^æý‡6–þ˦Õ5ÔXQ€ÌÕT–¾"bÖG»¯U­)X¶–ÕËDƒ¼bb¥¢ËÖ§yKÖªf[‰ò™lµ‚½“ èT$S›ÁKGæ+0z­«·%##Ãäf»'Â[kr³ÝP#ç (EHEÃ<¯’`D,Õ€^•ì´óè°pr––n´»­Ü "L“è„ •ÝÆt:P‰¬Ê€ )H(®.?fBÐÏJQF WЊ( U/%³a׬ ©'Õd™ì¥dt¸ Zí ÚëÓÑWé¶î¤q`!|ÄüÑ6ÄÖç8»£¯­f)XµÿÐêæÚßo‰˜×õ +üN•€X`CgA ŽX¤ø@¥Ajù‰­oî«Ü/!”è® Åt+ƒ©½L/j(ÅžŸžêÓnZ¦}ìD6@¤\8äì 4sV8–6SŒÔ2·T ÓÎǦœ–BqËHÊku¢µ)U¡ÍæGi—ÈNб¸^´y­¸ïçN  X6RNQrdšÁhîeš[Dš£·Û}ÌC®d/¼ü<µ ß¿±Ìí?ýçß’hËBâ0-ý=–`ôÌSß÷¸@›@"·îööæžPê^@‡fÈàÜ`‰èïŸÀI´ó~…E¬Sˆ[|ßg‹™U¯DŽ^_–™àÜò©X$Œ6ø ÏÃ8 5%öæ>îváÔXjí_oΣ»·†„ åÝ¿þ+EX­,‡æ/“ýð.v5Z€®Ä2Í-‰–eW‹H.d*­·]¢!S¥)qÑÊØ"Ùô¼Aö‡`jj-#ÔB-2R-R Ы×Ýð×ÿ÷ÿMú"uŒ;6åL¼Àl9„:Gœƒ¯a¼·Y?îb®*t …¯·‹ç îÙžü.ÿ~€têíç'ħ[+c^º ñ´©è$:9šé‚Uq!ãgÕ9”÷œ´¸ya]×IðÜdìRš×Ížû-Zë'ó÷Õ1žƒ€/âNž)W#¯ù“r3y“ ú ‰|ð~]z’ÝÖOmCqaõÇã^›·ë™3@Ç Ù=‰êvسø¥çà[w”žã=rY\y%£\q0>©þŸmÊx™¤ºCQºU|î¯úl‡m÷y{ê·Ãv>O„{»¤×$黚ø's¶9¯Ü}·Žkvdß\ ¿=>ØŸ>úÅ»)“s׺Ï=¼ÙyS슿,oñMúϪ~»Gõzþé3¯,îÉ |%íq…ºD–ñ’.>^²®S·#t\Vÿ, ó—¿e£…JçIzÓÝ^Yyªä|íÍî‚Ósðk’gñÈ]ÐmÀ§|1†Ó3tûö˜UùvoUëÀ«ˆè Õòo+x=lÿD¦ýŽs‘ÎÔý·| Ç„¢‡ç©/¬/mq½+L¿5Ã/3fŸ×õ…Óé«®÷Y>íkŽG¿ÓÉö§Q ðæèêéòKT”\çŸïÝºÜæÊq'wʨ“mn±Dfz-^¼ ÃÓóó~:ôzíJšÔZ¶eLsF:vÃnùxxùí^Ų 6Öö·ÿ^ ᬅBÔwÖöáaÅ8›|( ) ¹ÿyb4+&l &B-SuÞï¦/ÈŽóîþHŽòD‹—Æúi¡'³ˆL-”“8!¦6˜%‘P¦^á.IÙ¤N2±è|&P+dÀ{J(£@š!¥ ÊDеšLm‚™Ñ´Òv`Hë½VÉ\Àèü£+K¨sÒkF({ }’–-iÕé±¼–q·ì[´%—9ÁØ+#̽T§¹´P*æv8ÌûCLË<ÏË!pG‡K  0ß(çÇÌb—Ô½T¾çŒ#“lÊ@yBÌ- [ ÷£]Âè”LËʨéèí$ ­&™¢ÓM±P¤uUÄÜ̦eq¬´–¥˜#d15̹¿{•7—Ø9$i>cI,ë:~b¡P¨ÒC˜T À.êKv#Ì”²x2&ȵÐê[¨ˆX99¾ZI«8,™ƒ¬¢á¥å»ÅžE ä(ÿ7KS bÍB†l°+ˆDk¨¥¹7(3C|B¼¢Vñ€ýÏXöä©ôR6!èÄ›¾´¼H³`@[+@w^Qò ÅÑà 1¬V(2CL`U ¡Tˆ(½M$Awvxz¦ˆ¶Ë(XEaŽl–È^ÙànMK…UÛ)çñ©° 3¡{¼F.ÆZ@¼¼Ì¤ [æ\béVCÕF j±`ÁX²-s¤¥:Š•lÍo‡È–îÈ ŒÓ Sð‚¨„¸–ÒωîÖ¼ l@ƒÞ&úÁe"&Ö‰T¡Üïçˆìùe‰—<øî»§Ÿ>Ìs ašâï–ËÒ$ÌóR|ïA_‰I™h3Ú²êû½;§ûR$ ëã8¬Œ µ§!!‚`A ‘ Á K"'Ä ÑÖØfuÞ Vk"¢ –‘@V«Õ†Ñr,ã€[ZsFظ˜|jaÅXË0Žu7Ò9Žƒ›Wã F!ЉŒH¹?ÿÕ_Zõü°§>ØXQ 2•Àán*„âxËPhLc”Aµ…DdHIÁE¸õrkŠn³½$Z7»Î QŒJe$¢i‰XÖ'$K-õiüëÿÛÿzýWC Ý”²Ùÿ§]°~ñôñgv|‹0ï” 9+Wº(Hν‘¿ÕF' „zE¾ÿ’€_bÏð& :~—±÷+sâ vy¼2`ûÃݾ½•ö+gÈÛí3ªãÉ]??Å.øâ€GÂî·íø•×ôëëáõ»íø&Úà t^Ÿ\µÎ;~÷Ï”o$Ñ\çø¸øõ÷½PžX@Ç@ïsÊgôñŒdùô¢èÿsB—¯yØ>xðŸ*ú&¯W·Çeá÷±÷áõáÔehÅÛuEúñÙ¥8¿]†æ:¡qÉy”z¸kì{§¬éÍÕ_(]4\]tQ|ñØðÌ”ýª^éËÒ3ß44äMxç6ùJýúÂHë­«ÛÉVî÷õDýd§íã„­®–û_.ŠÝ’óz%:9Ý Å¶re°ÿíÇeZ~ü»¿/µ Ï;á&£—òqȇœb^š¤—}î÷1ãÜÀ»Z*4%éf>˜×e¿oJqEQ÷ûO‹´{ªmص¶pÿÒÞ Fîri,³"Ûaz÷v¢"’UÝPw(cÆô²ìf, t£Äv¨ã.çˆýôs*A³M´ªì†&%eš¾Ö¶g*S˜ÑÝ+؈\‚:Ûà¬tT½'`Pƒ™bž·Çœ$è(Âx‚õÔKleÚZ9µ`¯ˆ4 Mîu@T¨0ó2ÅO,Ìy‰@$Ú4OµŠ>©±-mF-—ýa™öóÇŸcšÚ’2tûÜȵƿÔHˆ:‚†v@öª‰Nð1B¶æ0œÂ{°u˹=Ôcƒp„€D[ûøøþ½ê ¶`™0í4vRw‡ÚRÇ%%ºg@´€ : óÜa¥غcóPà¦enFÕÑ Ö™)rÅ:ApP$|»! 0²IÑó:ÄX 4@”ZÂÁ‘èåõ]vƒœ´¢Á…æëµ³ Ö[#)ñm® ƒÚ˜{Ǹ˜pÔ<„ŠÁ‰eHÔL'pP­IHójµÝë [/*¥ÖqC=Uâë ìÉž—w[[=úv©G;óuÀvÿ6Ì·'@,èø0ð²订?ÐíÖ6–Õ|i“Ž8«—êþ»Å—ç§ñyxú›?Íh>^ëø¼{öRlðÂÒ*Z-¦êÍbnOÿâ/5·, Oƒ2s^ìÝ(ÉöK}‡ïžY+„ÜOÃöäI&Hz7xØËý³³»À¤’LB40Ã#EH(tB!-óÒæ%––‘”œ´ê¥–2Ô÷¿ý¯ÀÖà“ÙÈ{à­5wëýì;ç³j†o²‘y- |Üý}?Èüâèô­Qœx‰ˆ½i½=Ë ¼!(×9+öÞ{tJ¼ z¢×ØJow¾éè&4üVsçó¦ØåŸ¿¼*eƒ?Ò7;~E ü»Ts¾ýlyõ&¼,űÚ÷Øð;˜N¯WI_OW 0 5`ú6²æW3]ïßgìéo9_"k<ü¡.ÊT_»ñnž¹<£”=ìoàÉö]¿ÃÑþ#…Î…×Eúo©ÿú…åí&äÒ'ÙÕzp]®±8þ¼¢þ_õ/Þoz8ª•½åªïKúTºæä¾ùŠó–#vé&꤅®QñZsÝÓz*O¦Ž=œwé§÷,¥{‡}$ùlh¤ófÄËѸ‚Œà 5t!ån4#­§ý}Ï-}q.]tÍu³¿ý†ò¯+=oa<T¥{Ž ç…6g+ÌýÖß³·‚[†bËEŸÚú÷º{³GÄE È ]ê¶1cÍ-ô#ÚvWg“áNbƒëhnŠñùžâ6y»Lh븠í³N°ôr¾6FÊñp¯6:Õûˆž3šôÅ™€O֛ܿ·Y»J÷µé“O¡Ëç­ŽMªW•ðÇNÏ#K–gبõý+Ž÷zP.;j¯½mIÅ'wYwÚúî?rn–nÎIg{v§ ¦÷<âq–øõp¼A\®ƒ¼}ñ×Li\¦ùïÿëÍL+…ÅeF'êµà°DMLdN>0¥ãP£-/20/¾ qøÛÿ ³á}5µðÁ`0O÷Õ't÷ÞD˜ÂèÓsht$`w¢×çÝ Ãt˜iµdF'ÎÛá§DKFËH3Xy&€Ü EmRkÙŒn¾²MF‰™ËÌç!§î– múµ®|›Ö°ÄZáK@†Œ*$ @Xié«5«¯Wñ¬Ê·u\x 2VÐv'«H¢§‰Î»Ì-E-HÉ”‰,Õ@Qòl£5!3 \Z"eŠö!Êáʘ—Â6Í/m™búû¥…°1û„þ¬”ð¾Ö- ê”paÕ âÉm…JÀ€¡ ÊIh%šAR7z„—¹Kš&v„Uë#¦õ= ‡ZËê—Iw7o‰R™n^‡Òí˜%šq¬5™M›Eä@3÷lM)6,KïâÀ¢~àì®Ç„ i PAˆz}ÁÎ m`w"Á¢,NSÊ !ë= k+ÀêL0I“¹%‰]³iÈ,Àªå]È•‚íD¡u˜eŠ¥ŒïFå’iÅ ­iŽÈtFVÐ×…3'X 4À k]¹õùæzíL@·uÅŠ~:ú¤®, ¾CXáE€Z1¼*Ê€,ðÚ/ Ô JxŠÄµê€zWé\Ù5݃¸³æ;,{˜Rw$ÜåH§%ÓC¡[[Ì©,6J¦y©‰Œ9‡ñýwßýP^æó·Ó~ÂJ1ªÍ³2ŒôR[‹ -ShÏ9”I3¯PŸí¶¢®¢aW•ÿÔ(-”5±ß¯àÁºM2¡ ¨kí¿rm ‘ÊÃ|è?Y‰Õ‚y½@™˜–†Ä0Ô÷ßžæy)Ý8öX¹‡ùÊå×4¤íhÿÓ`¾…‹yrìÐfáKÀ*”XàL+kÛ°Ú{¬¿mA˜ÖvŸ>2k,¯LD"­˜ÁL¬^HM•x÷´Ëz9˜G­Cß?=7gw9”±Ö±VçÁ-Åâܧ(»]x‹Ÿ÷ñÃNîX²~< ïž8 Üí3¬f)–‚¾ÓÔÙÍ=D@Þá*Ê$)wÉi‘RôjÊ[ž4-[Äm^b^"áµ°xêÓ÷Ïÿý¿ûëu}Ïì(·#Î~‹ ¹Î$/°7¸Qxñ°~ Z~ì"¸R«OYú{\G^¾ùÄ=þü¼ùŸ¼•g/¹ózŸ+jÀùq_PJtìÇ?#¯Ü%lH¯è¤Ü4K]Ð ø€Hs’öoé×ÁÏæ‰ Þ1¸K¥xFñåJ¥tr3»Þmouqäµjs®¹=l>ÖþNRÎË}Ù®Ùbõ÷/Ð)$¿;cïX ùW<Ÿj¸ÙŸÂà«`øþð¾Ê¹KÚ¼=ÈÛHû-Ðÿ»z™̱ *Ø'Ý >G ã½Ñ™T´Ê—çôžãOÎí>Gu}ë \Ï]|ÊÝ[é;þvuøï¹åÞÜÏé Ï )·­S_ßy5K¿a"ê³2mwö}—÷/¬éßž#~x´w‡ú+½^?÷·$Š>9îÞ6ó|a¿C^ýùvI¹ªÑ>¿YÞæ¾qÁR;Ÿ‡gHëõø3€Î_]óÛ–¹3”úk¤¬×U”Ïù¡ÞØÿôÅ)¨ó»ìèÁpN„~]zE#:7z^Yôõå¤Þ°m:ß’à¹V:¿ªàŠ´w+1Þgý.:V–å+ݪo)}8BHÏuéû®žß"ïý vܤÞ˜s{ÌŒù¥:^‘³ï[|örÀÏìø]¥Êo÷Çdà·®®x°Ï¼}ó1}õ¹“œ¿|…Ä#ÒîM*â"@ùåË^®]ÊÎ×»S#QÛF”úø?ýø÷?}øñãîÝ®o-|çµT¡‡¡-˸ۙ[K°ß žÈTŒ¥aÎñ‡çýßþd£ÁȘVgëúTri±,Oß¹ò0/%“ÕgDkãó9Ä´àÙË8(½ÔÝS’ÙkT³ƒËûY˜¡î0¤Â:B³¦¦ù€h4cÝ![.s. È4B±â³µPLóªt·†âèé½^¾8”ˆî#z€z]³Á 2ËJÏÁÖd‘4ŸJéÑ…Tº뮺s™•$:—¥‘˜JéMŽÑU-[”È%Nz÷HüRˆ &PD“†íƒ1‰ Q\ÅÓ€ÂW¢”pÐeâGç Æ« ×úk¦‹„ˆÚ‘4È剤«S³l»¤¡¬"I«µî&ó2÷ÞSÝî#[ÎðŠFİ ô«[éˆð¼¢ý#B`Áéžæèö‘‹ÂšÌ8:˜f¬ƒ$?†Åë™u‡:”µx|£Xm»QèL×H# ‹Zq*[{Q«šœ€¡£+^I]è2¸,ÜQ‹g÷šûRêA?©cš¦IÖb)´Ýnßb™±ûðððݧÃãã¿û¡f’>y¥-óân„ªM‡¹EC.I™”ËÜ”0w—»{k=-}Èë±®‰Ñ€ 쫈łœ1ÆICÀA(‰ ˜P& åXβ†0#8ì GÚÃF~È`#j–Ö: =ÚOŸs#ák«Ð–rEýãepˆë½àv»1tü¼À´ÑÆ+‘ ¥€P‡úú‡6zÚºôœ_æzmK¾Û° †•R`ľìzï í‹?ì¦bu7íÜlA–©|˜j7`_«—¿xø0ƒŸöS:™,n]™¥¸ÛôÛ=»=“i©Ö2ýöwS~žÍ¨jtc(÷e˜Wdƒ‚äžu’• R™kÿP…")¥" øšõÊDH‘½/Ñ[ËJ‘,Õÿ§ÿôŸ¾û‹ßhU`sź­-§í²Î*DF­ñí#·×;Þø†_ ªðÙp‹'C¬Ÿ;^}Ë¡þš:n4§“ òÒÕý¹æ\Ù>eßÝÀS;ôuíÑ?SLþ Õœ/˜ßüìÞßðî;û•Cê¹$ ¾ºP÷gi¹xvŠ_ÑëÏ_-¿þ:d¾kœÿƒÎŸ—4\‡B_Öð’‡âë"ßÏ;ÆQeŽÔû—5n~¾%²œ­FgV¯|³Òzê›y_‚’W.–wêÞð€;~ß.Ð[>ûîÿ“øVÂúevã™zöͪßüþlàK×ÍSžG_lð-Nƒo>Öw?çÏê¶’¢w<‹t.ûó¬,çÍI^Æsß°‰øNîñ¬zé­§øŽ#y1š®œá~®gíùûß{_³Ú»·R]]ÉßWœŠôÖÃä)Q)ËÓÜs©îÕë®.óRöS1x8<=L;/e¿Û¡/Õ±û§¿]æf½µ{öÝT¾½ýÿµü/v?=Í!ÒKš%«LeDHf^­”–]^Ó…ž°ÌÐm˜[ô´èÀf¼é£È˜…œÔ*³uÀiŒ"Ë^ô²Ûe{R=‡ŒJw'DúTd 3º¸a4°U|åàÎÑ7 `­–õ¢­õþæ>ꣳc…mlåÒô­ó€Êãçc«&æ(øíŠŒì4os_’¹O@dÌÑ„¥²7Š% Upy:æs†äf*¤‰”î9¬ ; ¤¯I‹hˆ¾ƒ(†­+°‚Âi(H±±'(²€‰¾=!Ê#‘`)n•VÒLÅwP)eon…Ù>{1úD;`ù ¹ r/ƒkÐæ£+œZL`ÇCBÙDä̕뵖5~ª\qðǬ* Ó^a{ 2X|ÅßñôHÊee¥ YOØ–ÐOeN\L£àÃŒ–ŒêN8Å^ºBRиô'R‰ §Ër©‡Ÿæ(Å ‚Ñá$÷u’ˆÃì™ßyW´Ÿ’t/bØ›û~WJïÑ-ÛÜÔPÜ;B9ºgDËb«©rdƒ8–XSF£@¾ô†Ö»XA=Ȇ²¾ñd˜Á´ù'ÕIkŸÍÈ!Ê÷ß}”ŸZzkÓË–,µÔÃFbüí`v­¹®3[ÎiõíÈaÍ­uIä–Ò/ðŠL"Åúçˆl« VQëp+ßxG @Þz÷꟦ý®î”jÙiîÅ’™D™¦îôZ¿ßï½–ÇvõƒÙÇ¿þ—‘ÒÓŒïö‡Ÿ±/{šï¬gíiQµé/~Sv“ ýô´-UÃÒ!J0Ð8hJ)EË  f K³æðSi‘’„%ÿHdÖšzDë½Gd’üÿÍ¿ùôÛï¿ûËß®ÍOcž@:æ¶™Îe¬ó‚¸·ÆÓüâÝç7E¿PH}ÝQªŸ1˜ÑYüÊãW)=×]z7$¯¸ü&ÒØÝºÑ»ÙŠçâÕ[:ÄDÐÿšOþÙˆO/•ýý2ãònQü¾våèýòþHoÕ/¼ÿ ÆÌ7ô€}ó¢§_Ûˆ½;¿H¦õg\_N¿r‹À‹‹¿â póö†óz»ŒðÅ£ñ :Yóüçþ­Ä­¨’ë¸H[ŸÂ3Fç-:ϲh­4Aæ Çt·³ê¹UýBMº€¢\Ÿðæguñ+>gPt6(Ž”¿ñÿÊÙ™nl«³Ö™-2¹më85É›^ìé¸^ï$óÏÕϳÞ[]Øïjgy/lº½“ë]úÇFŸ8Mîc‹ê) ûì½æ-¶¶ØÕ5ìü ‡§c+豒₵‹ö˜è´âÜŽ’›f¾cöàô/[ï ~üÂíct¯×ã©4ný–Lçõˆ=Ç4]m=†`ÉSÈ¢Ë×é*éò ÎüÈ»õ£³.ÚããiëLÿ¿ØéÙœNMºêë>rXŽÓþ¶'ëbOų|é)K|o…â½Và«tÂñÓtüÀóÒós™ àíœ=³qçɦýCuU¯‹sž*ÛRH:B˜xÕ‡~³Ôž¯ž/4ß%GäUˆy=Îx£oýúÑrKº\Á.žI¸®å!žáݦŸÆºñÜæWºÇJ;ÝÂõgOÇÇßÿ„ŒùéQ™í°<<ì?þæc©µ¸Ÿzš¾·b¦vxúÝïöÕ)ÄÓ"&i„íÝf²õÏ™±Û³¥LÔ€[8-¦îõ%昪¦içõ!<3 í?î`¹<5¤ÐçÎ:}¨fóáÇ0Zæ,{ö™ŒL-VöfÌù‰^Æ` ™Ù­¹Üw˜„¡LñxX2Ga凞N‰^Ju•¾ü¸D gˆþZ ÇÕ6ʵØy-¸\¥l”°A_…ö\iBãøÏ=Jeyð~š˜<bgÀ‡Z+Ð`1"Ó2@EJ˜ŠY´T:¢EªçlË‚§CVùxÌ´–4­ì—µtÊÕ”u@±Ñ×:qMë©• ·¬@@©ˆ Ä¤ú,7ÐàEŒ¾Ré‡ÎØ;YT²#’¼j@“¼ wY¦ê £‹(3ÖZKAë­:Üýᡆ´,MênFóì$"Ôe†êÞ{ddЖ ,àN+Ô}MÞpX·n€Á{§àFnL“ÜÊ´‡ÙƒmdG „Ì@Ó´“1¯C‚ 7ÊEßH8#ä0ƒ± iZ,5‰Á:ŸœænÌö˜àS†6/†è`1Ct™ÊG€ 5›ÚÃÜz—™›E“OV¬>þ8ïw­×:yÉ0ÕÌ\ÚŒžÖìáû}ùĘŸ—¾¯“Ñwu³Ã¼°i~j±„ÑÝ!ä´+ÑZÄeÛ£TßF?G…„XÐÊðún§„c p8#ìbùqÓ3aF$×Zþè€ÃG& @ ›Šþ·¿ûýȵ ÖÆéIêpN*?q‘‰´ëz[o÷H¬ù"^±Îú-Løl'oƒL¨ƒ«@®áüXjœˆ¾öÑì¡ìÌL33Ùãò´¯Ó¾ì"sW|ªSWZ)ÿä»OI¦y+´©”–S™~óú§)ô})Hûê "Tw#OÅZKë i”ÛÈ2ña¯è0—'C2Ié=DïŦRp™§˜Â¨öOhi=$EÉ6ï-«Óoï={dŠÄ¿ü«¿.»úñ»ûï>̇yWëÚ5Ò/)æu^oãû¼ìCwËt¯?óTPòîÿó;û‹MÑ1Ð[]ÚxF‘8¯Žr!mý+Å<ÄœïG|ra |¹çM©»å%[é$úŸž‡açÇ|<¯·3>‡5¿ Þ}Úû‚†¢+ìÒÅ6Y—Ù;<¢ ÷-]¹wâÙ<Îq»wÜn_5þ¾Qü½ºž[ß —ãWä <ƒzcý‚˜r—)¡Ëiþv¥øˆ#Öæq5~.Náþ…ú–ºçM‘Õ-õT3úr?ÃË ¯·üüüf½ ÿ¼ °}ÎJí}"¤n¶þÏî}ÑËè.Òêî9¾@Iº}Û9×ãêpOøa>»°ã—uYx¡ —ä™Wïò•Zú®Q÷ÜGêköWrëY‹—ZÇ™ p” ®R©GøùqY8ù™ywÕºEÿéBç¯$©ÓQÜe¼ÑJýÝÿ™Eì~ûåÅ­¹þÕ&g}QÊyëÈógëÕdy‹¡úYÀuÎþµÑñÖ,ãù«àB‹½óæ7Ö&¼·8œ¼ ØãÅšÈ×Îäø!÷¢j}ÙÑòŽÒ{e2rüÖ»³ç¬ÆùrÄg;®Ó /Ÿ¶¾ÂìÝCè Òù¶€+Œ*uù÷_R8ñÖ®Ìwu\ /ϧÏApz™Ð.½óì©ðÐùžàrÉ»þê«Gð{çüíœÒ€Ù‚¤Ï_÷ô¦^’a¯QzoÙï|AÀ{.u™»:¬¾€e”õÞÝÊng-¢µpr*­…@+aô§y¦±VoJsšíŠÕpïsÑBRü>úñ'/|ø°sÕqž©¦Îèu*µôÉ,^zöŒ.ævy]“÷CæÓ¶ÍÈ€eBoG•­Ê~{> ÊÓȸŒ4dôU¬V½#ý3¦Òq¹ ³˜O|¤±‚ y$ültNä ˜?¥¯ VaCGµ5!—ý´Ûçfa2™Aóˆ§Rפ €%4aø[Ù™ðÊ­?)áf0€9¨(SugÁHåX”R§Rl„ÝÍké¤ïýSÙ?üë’B›jÍØ·H7f¢«Ž¯øiFï=EZ1ׇ½ZW-”@±:&/©ý$²YÓ9€L&%y‘ÛŠl\épr°}=Û¼ôÖ¢w„2¥LH^ì¯þÝ¿«ûéãPnææÔ¨ú¿Âtò¢††—Ñʽؔ¯„;?g‰ôeÈt7Žú²Î«/vÎ+PXfJäE•É›öÏt½µÕ1 ý&U‚o«"|_uä;ãÌs–Ësˆ[ÝðëŽzˆ—•1·°Óo.#ÞO¼#‘ñN9ò9 ýËø•§üëëбáçîøâzuü\¼£˜|Áw}.ü]ÂÅ÷ëå“}Ëy粬Ë%ý]BСâª@oN‰ýÜüÐù?Lù 1KŽ7âꟿ~¢W¹¯Üþ"«ΊûŽæÃ"ß°$ò×±t~ÓáõÎTæ×ï1ô+¸‚o=Vþ·òÅ ß³£ò›L¾0–nïÀÕ>SuxÇ•áK›O½v»~=€ï›³z×{/+#~¾qÊ­_àÜ»bu¤Îì¡î<µÃÈ·>-­xìë¾G³äÃþ¡)›ðááÃTw÷û^XhK%þéÿ`ó²sèz¨ñ´XO:å}7)Ŧ,Îý.{b*Ì’ãn’w˜vá)£2•¦À’>P@)KDfDÊÕ1¸Es[–Ö{8Iò_üë¿òiš¦i7=|ÿ)"Z[¢Ã«\4G>móà^­_{c(úGËh¸'#â2 ¼*-¾F üœÛ^õlþ‚—â›K`¤Þû'ßäÛïQ€~æˆôçÛÓ»|+_ýñË®ß~c|75%ýѯxGIóOá\þt_Çþ_ƒV°Áøë»D'¹á:ÿ­tÿ¯w¡¸ú4e‘ÞÊ?ãöŒ4€™Ýê­+à éÓý=÷ßùwãN>‹<&¸ù>óZÔ<÷ÙSù2ôØøÔwc^ÔÆs«×E%õ3.o4×€3"ÏYºþ~ýî)ë¾T¾*Ö»b7bÔý¸Bªëñ»Q^=Êü©Óo¶«u²?íptÕ9ȵ*}^ðtÕÀ|Aä9^Ì{-<ºÆ»—y=ÝÝ\ñx4×õWËë±ÍøªïzðYî ‹ õÂ'ÎfÕ¹íEÚ÷^”xúCíq¾LêÙ1rÙozÑ…º=Zνì¯|ú©œ—Ãÿ»öÓc±bœëÞzo}NŸT\øË] Já´CÝ[Dd²­š©À3Š!‘½ŒZÁ;q`¤„ÐW‰s…™§)˜0ëž`Ù›kšÒ¦9å|án@‰¹É‹0§“Js"c˜ bóG]2p$¶Ê\­e¿"VŽŸÖë=‰Ë´B~”:%(eŠÍ|òlÙçðjŠ!% ‚ZAvä qáꢖ4UødÌì1k9dñâY õP€ÝhŒˆAµž& ê=w“äÅP2#e2ƒb@Æ;z-½VAsçî UÑkr< Ê”Tjrò¿èR@Îì\š2áED§‚™¢Yar^:ƤëÃ~'ÅáÐ>î|_v‘r+¾dì [v)wÅ:¸,iòlÁJ$dÀtÊs œuYQLÉÕ–ÖAÕÁ šCéHGN*E.F Y?Õv¦iˆÅG0TÆj*¥"­Ã `äžÁ u “¡u¸qW¢Ï¦‚JòžðZ±ß«©£…“š²·ê©C²QH@ƒcSÖo ò‘m+‚¯‰¨ã“‘ÙVï0!:z‚†©Â/€Á¹úÖŽŠks¨„*†„ùê";¾eõ•¹1[uä}Ùe¢ÖPfŸCR-¥˜'Drn‡©>÷Çö³•:íÊÞ'.s,Š EdSOBqX–¥µOöÑÆ g¨wËè‹d&'¦©N"ÌÌ {´L¹ÅŒÙ“é°‡‡z8tVoã‚>#;2W7c0.‚XkêyôÂÙü|C ­- >!:HÔ:ò”N¨ýÜr{ÒšX‘* æšk±í1çÇ©áøÐ° Ù‡ùÉz#»÷FLŸÖUK„: `…ˆf`7—l^ Þú˜JˆÙ´¤R–mØYòaÿðiú²+;uPW©¨…¦ý~ &ñÏò±‰ä®ÄÜBj©³À´·º¤·ÈTŸJcãÃ~‡Ï-SÇÇ k‘;Rì)Aôæð¬¦Ù8%eŠ’”GcäŒbéÃ…üWÿÓ¿­û)2ËTóOÿ1 å0CÚ•JÒ΂Æ%mÏmáXÀ{j§‡®žÍ׃ñvs\Eñ§wðã~ë o}ÖtÛïy…sºœ€=WG3þ;Ïv¸}[°rîD¹þlÄ‘f”†{ÏqÃtòÁ+/ë0y•Op¾ ¾o®v¹ÝÕß ·^†{|è~oÈœs8yS†ur[4zÚ}_G¹Çš¹›bãÐp~^g"o¯Ævœ÷¸¢G. îîãÎÑ%øÔçë=Og£ãÔ㳘»õsùªÊswo~îÄ ¼å\®Ð+ÃïÅ€7Õv:îïžÁ¾ë¹´ÊÙH8)uÇ ËQE}W²óå ûF"Ö«¿zËŸ¼: ¿Ì´àj-º’á~.Óˆ¯Û™v-"¼Jȹ·²=ëømÏîŠjrEÁúâ›~¶X…„«´ÏÄŠkµmû“ç®îý„— ä³+©ßÙÍ/¿tø‡Ë|ºmõ¸ºk/n3§ˆå}¾÷+qÅ©nY¯I'Ü2²n3oÌp¼-Í{®æ>ÇÝ8ÿßõ«ðšìxñD»*ûxnE{ýÂiCñŸû­žôì£.S“ÏëïçÂÿ3Ù˰üBLÇuçâ÷3¡Ó5¼j›Õ—- wnêXkÞP:Bð9Ÿ€ JÏØæ†ñžOß”»Pwy7ýÁýÿB²}ñ‘©Û+ój+×庤{ÁÏ=”þ³ŸðüÜ\Ý»Qûý­áõ– —ã]gù6»8_îxÙ5è9¨âÙJÄ»½Ú÷úéðjf^—‘ˆn†Ýåßò®á·^=‹÷4]ðN뺞Wg ´ÎüðsÎt»†ââ}U3Ç,Ïž¼ÌÞ¹·QNqwù_ÿ×ÿw›[[º¤‡|Wû¢>·6/ˆÜyÉy±b‘±Û¶åïÿöï¿çy‡ i?íËp˜|j9÷Zá“òQóÜÝKßﻘù¸‡5YàG%1`+^ð” nœö1d`®Ìî. óÀù¬­Ã–ÓÑÝÛ£¼&@hµHµ–Nõ@ú´+û¢èË-¯wpÿêD6ðXÚŠìp_“k†`¥ù¨ÝÍ —¹§à†”¤ z)ô!Og™ C®Â I±P! ;K‰¢Iú’xDÜ—n(»ê´e qæ%ÔÜkiO=B¬°êÖ#{f¢Ö"ª)ª³p‰•űIšÜÜK.òòFá5%Co®)”]qc,±ÄŒèmÉŒR ݤh‹KÁbfU©Ö›™ Rco@ª¬¬](FÐ …µ˜‡§¥·pçÇ)R=Å̈®‚—BºùÓ,1«yo=38Ь¥Š•À^€¨ëž„\eé6#‹C%`…ÉTr8¯ŠêB6ÈEA犵¡à¼";$؆ƒHœ1~F‡eú1cxöZQF9íŠ>Ïh]Å#‹Ãt@ÑÃPœUtÊ¥T̲¨§MLͱ¤©U›6€¹éõˆ oš2`ãÍã` V½Ø‡< ”DqÀà$ÈP÷HÛÐð£ÅÖ^–á¢@ßÌ}ü¬ÆÜ¶¶A¼Ì$ ª›GIŠ¥x* EóSì>réËü˜û]µÔütHDD||øHÖÌtã¾<4-Ê~~|:, Ä©˜X¤ŒÅ`tóÁ9•Úƒ•è®eIe).)^½³f1ôžó<‹¶æhcãö,§Åf> >.Ý–,<™‚ ^@Âð‹Þ dk&o ~ÆS:rôiǬö¦àû™¹Í¶‚̆Ðf*À­3c$¢V`×H@ê4½ ÷ᆂê(+tHmu ðû‡ßþ#ô>ÿø¢#úÚz…>zŠûî®™­–éñ)>ìËîÃCñý_üÕ¿Í}»™Ñ ¥´½ÌmOv‹xê;±Úe1#ÑVí æ–µÀ=A›}|°„C1á­Ë‹!%M«îOyQªGBîãá—™AÑ"zDl}»ê¼Äî¬* W¼¦3a‹W¸í#ɓĭh®Ëו|G¬¹¾¥|&ÑòÌöýÚIîM—¯FÔ/ÈNï@ñn„þæù,½y-ùRì3§ün)öõ~¾U|ÅzUüê­y…zþ³u«Ü¥¢ÿUηß{çKÏm.õú#ä–þú˼îbm^¶åøâ¬Àípz—;ÀK“ò jœ. ~‹Gúý¥âO:ÿÊ~.[×2á…€oBxûú¬ØÝ¼é¯œT~ÅÇö 3‰þüú&wŒÄëBÿ·Ÿ¾ø/F!ÿà;ßhd»¹£ã–ó­n?ãilAù)JYµØóÿ÷ýÅÓ²Ì3ȇ»OÓ~*ÓÊfÔÝnÿq™-rùýOîåáaúø›O^qøûG¸í÷;Î‡ß‹Ý ÓŽ=c9ÌêÑröºì¦ðÜ«,*32УŒzumð™l+¸|Ì2:R°8e:FÁ56)3sÅîGÌÄH$ž™9%Ùb=®ÏKöyÅý— Ü¿Â2Djð1Òa; #°o@æÅ†ÔH+ŽQ«^+½ô¶´¥Ñœfi£¸j ®¶ôÞ±û@eúÄ\”G5°K}µ €T$¦)fii˜ÒÜ–•½TG˜—j}±ÛS¶ÝªšECчÍÍ݈ÌPh*Ö]í€0Nß=DËL(C˜"AÛU«…ð:y´PÀö±´ "L™t ¤;ënßžö9Gô@q+M£®º÷T";{+l„ÉaYŒWF(˜ÛÔÛœ­ ¬µÑCOsßO^Ä ú<xpŸç>·f©LT`çö¹ Ô‘¹&ØTF[@%\s*Ô`¹Ld˜Z`,p…£w 1A ƒM…ìUL ¡eÍÑ/ 6U%à(£r|JôQyí*®ù¿=1Q?!áöýÐz¨ì€0@]•QX¤"eË%ûB4CO •• ƒQúßÁºLæ ö, =6ÅrëPI€^àG´ýÃ"mó‰mhÓ'ÔÀ€CCDÛ6Ë0µ2dÈT‚2w”´¶dï ៾û>»ÌMP[ºw7§M¥†zëÍèãPÍ!ÄÓÓcÁTëƒ¦ÒæÌœéY*û’Kë¡ nF3wï?æ’^wÑúngÑ{×@MUX !…2AL®.d¢Ú‚h°€'ÒÖ^$˜Ž3* ÜàcŰM¦70Ð; ×ΉHĦû}b´µèh2ZÌàÛÞ< ŽÝuf€¯I –+Óid#F;Â]¾_{ S+ÊŒ˜¤Dtô,P@sø¾øhøøÝôá»~ø¼ûí?Böö÷¿#,”˽L©l,ø®þ¦x™³[)ûþñ»6Õÿæ?Ú¡ÑŠ“„ºT–ØG­)e!—ˆ}ÁÔF¶Ä|€[éB|Ø!¥®,; …˜ —Æ¢ØO2R<‚¥!Åì)AH5 Ї¿´RÙ—Öæ½Krs¯þðýǺß}ú‹ß@Ú·ÊfÔp¨?爮Ï$­¹,é:L¼cøsÇ"G€ãöûýüÁc¯/¹~¯îøÅ^uwï–ÙðMú2 ãW?¾Nº]5š?Âôçן_ÿ`^4–?ÏÔ»¯?^èü¯,¤:EVçA¿`Èž L+7m.Ï%`ðrÛ ó®uÞ_øúQó¼Ö$YN–¥Wݱ—xW»À„»å¼gáϰ;çÍþ°7ž¨Ï”%ãX_AÞ…y,÷?«D>Uìê^¬û†Rž;(Ì—ËÓuB)a;ù +1Ád†®w}«y]½N]Äm—Þ‡tw¸\Ž}œ¡à·_žW³ƒz^YåóÃóÞZåËkLËE÷‚Î"Ž}|™\—‘Ü+8ÑÖXÁ‹!zéXuúsÝ¡î‡Úw¶'›Ô~5ÓïHÊ·pÕ3o®÷¥3.s¼w-oml¯`Açr^©ñBgÀíŠsY%ôšûÊ sí¢è¬ å8Bu6äNè,\•ø]ü½ð³i³»[ÎVpÛ 7‚.û'´% îäså>œ„ˆWöuݪçÌã²ÌÛ©õßÛãáïþÛÿ¯õÈÖæ§…r9´§Ç§:•vû‡‡ìVÝݦ\t‘xzš&ÝèÓ'‡{ûq†zXD6 eFõ,F(O\<ÃSX¹%÷ .Jô”©§Ã çۆѫ‰Hp‡U@臕ϳ¾g¨üXR0§}æ!³AȤiÅý÷12 æîA‹‘W  á:Wè 0Ó¨^'E¥,{Ò x4Xªeš"¤Ô¨S6/ˆp£N¤zô(Èì(ÕJ––Ñt(€¥80/‹Lu‡^„–©DaëèOÝØc&ÃHöÞm…~°EŸ&ºsŽ­“uEoM%9•bÆZ±äÌFj9K…F–]©L‰F£4ÛùŽîS›çº›ÊÄX))3¸ŸvmÎ6·>«uYݨÂô2YQÎM‘è«Y® ºó0¢”É–yž—erT+V="—æž¹Û×igeÚæp9¡ RQIš©úœ-¥ïÝXËÒçÚ1M Ws‡¤@ãÞT(’(äDuSJìL¨Q£9`¬ £ü@ØÊ‘_LcwôeEê£\VîJIp¤>FËÁw@Â=`ÁlÈM–2‘}n–ÙÔÛé©k7Ãpîå„“3æ@HCè°1žGÂLÛôÙÒo=· tÁ†F ¿ßRᾪҥnK—­s¾¦FIû˜ƒã†=F`FXµ‰EÉÜï&0`ªÕ¢«-9U7"¢uy@âÄj¥˜·69¦j;ó‚2EZ!Kì¿›ÛÁUvS ©>/(’qéOu_õèíñQq—»Âd&Z2‡KÁ0<èZÙ>cR×®CèÑÆ¥càb-ó×fI²¦-‰%ÖF¢qñËn%D™ƒ‰Œ5±[ÿDÙìÑátþsŽ^õ¾ÛðKér/57;ÒÓ¯_ö<£—çï— À/—Ð>wåßèçÁ7¬Û/ÿímÃÄ­¡÷}½ïl©¼íðÆ©ãüz[|É9¹¿†~ÎÛûmÜ÷«Zì—¥ç÷^áË·­¬ã÷¾Yüå󌸭Zàrû‚ ~‰ßø×­óÜ2õ^Ø=™ëÎ̺û¶ëã½ «^^ΟMÇ«=Ú2Ži€+:ßÝ[y¿ƒê %mÏ>òÎ@}mÚ•Mÿçm|†çý»Úç½çžtTuyG÷å3Qñ+|Û¼9®×Ç®®ÄÛsÌØý£àY x­iK'Õò˜UyK¥<ïnKÄóýÈÅÐk'uç ÜX!\.K:ŸWTâäõÀ;’ð©kY¸÷׃WÐ5U鎲¯‹ãÐq’œa*¯“hW¹­!þê¥ÁÃç²[ºTÜGóßkÝþ6´W×ê·ô|ÏgòÞòªËÿ~Û.âùô. £ÛÿŽhUÓ|žOÜ\åW„Û4Ãé¼÷ Çgõ ¼#¾ïå“Ôå¸ùæ‹´Ê™ Ïå3ó›‹§§ÃO÷ûXÚái–„Ô‡ï?Â=Éù§C­ä4ÕXz÷y~|úî»ïö…ŸíÐ,éµP¶è­~°IûÔÞ‚¢ZYšf’7(-«¬KHÈËç#¶‚›/àT«˜ÈÕK õS•ñ:Ñ7YÓ¶ <ôMÙn( g2ÍÖ­Zl³8mù‹)3D´š;öÑá„€‡ò‘¡æK¤f.Ÿ¦©ø¡uK™–Òòԣ燣¸›"¤])»bVÍ]a…`陉Y’“Yúw;xA†ïv Eš—áY`î%#£§ÛÜÌw¾sB½¸™¡ºËc&”–­Ñ‚®¹¡XQWDóžK 7ß{É!.‘4/“;qhÍ£ï>ì–ËS-wˆŽÝ~Ç@ôP ŽŠ)e¦”­?Œ‘ 5ŸFu?•@%ÔH Nˆ+;¥¥R0@R,¡Qˆ=$T£U¥i°SŸ}ËŸá¡6 ˆ`†Èm¿&ô'€p‚ uôŽÍuee†ï`¶€DŸà X*% ³ÚB‘J@=WXü@`­B³NÎC»?ZɬEâë «C„ @” ÔVMø{ÙÐæ+èÈ v4´frÜJXY[pÔAš;¤~+Ö†-gÕ+³ja)&§'>ìvÃÚÚ¬–b±,ÅÍÍR™i2#v»|ž3rÖ<}0šæÇÖ{3£2l€ÑKjúXãsfäŒV9ö<+ÍÚꜜ‰ìè Ù7lH dè æ@®. ŠÍÝ·­mCǶH˜£–“%ƒ%Ð!Á ÑÀ²Æ1fkµþh{™ +[žÅŽyɵçiµèÀVþ߬@ ÑP fE‘?w›NKÇ«Jeö˜ÿ¹~ôúñ£×ýˆž¬î\ ÅsYè&¡7£iÿ°¯^döýßü/»©(E0s‰¬ÑwVÍ4&§Zôq·- ä²~hdN`ì+¦)I‰íi‰©Ê!ν=LÆŠâR©Ñ×µ&.ŒDD`3õéKSæþ´¥eäèÈ(Ŧ»ÿðÿ/kãËñ>­“€ûÝ´¥V69×çæ¶œÏÔLáåâ©sÊÍyØT¹.».¤àûb8¾°9¿‘AOßxúü.=ëÖ9à»l¾a­x9±ñ–¤|»9ø³çõ}¶Ï.þ}­ÿ¹ÿü‚S¸EÝ»¶—ÒøÍBñê:ÿ–4Õ¥^q­¸ï³ƒ[;‚/ºÿ0 óï{×xå‡Ù ‡ýeÇð-sJ7ÑÚ kÝmÒúrÌ¿fП_ø×רë:ëgÜ–¾ýáÿ%/ó ¯Î¦?ó¥þÈ_£g(&o¸üFÓá—îI¼ ÷îFióOOO?=fë ŠÈéC©ûÊZ§ÝäÄ27w—Ph-ãðw¿kÎKôôÔ»öÕÕC¥8æì!ïâR0õrÈlÈNŠtžÅ<‘X;D{Ty:DG&Ê¢m¿5p$ˆ¯(`è HÔH€A1€ÊôÍ&NöÐýñïçR¼ì\ÄÓO  !Ö‚‡ž–ˆNË Ä¢…®&–A‚Á~ž3a…P©î`†ºà$…j² dq "û¡Wèq,ÝK–ZRY•Õ¬Nå°ô"2¡¹Ó0lTÉPT* ]I8à"wuBBPj¸3tGº q-†…XÑ:܆îZƒà@¬*Klb G6ÐèÀZ^ Z¬þÀZ€Pœ»ÕÖ!‹¤‚Ùw ¤L¿ŽmM+¾¯Åkrkx¬‚2×ÃvA¾® ŽUk µïøܺj†è¼¶jUº‡Ÿ°VÖ¯ !;Ü6 íDËÙ‘èp÷É+Ôƒ2³XÚÁ°/ªî.33 ^JÅ„L»22Hóa·‹y9{o»‡–Z– ¥WtÒ9¡X™ç$ fš"YÂ@Ï㩚<×ÒûŒ•ûOÃò¸{ #iXÑè(ÖŒInʱqÍôœ´ ®¼ HÔ –Dö•ãó[J9•0c˜9Ü·Ë&ÙoŒ<Óèöy&€P NSI¯,ò¹Œ4uOuL^z†ÈêL.åá¡ØÇl³}xØ=ìA`ÚúÜj©Ÿ>ÖÚ¡Àv¾#½þÕÿ¥Gø¼6±ˆ˜*@LEbQ/û½¹±eNE sZÀÝ„-½´Û²›R¦âccšÂœxØÓMÁ0ìã ›Å/±–#ÑšRföŒÞ{ëê1öØV¼ì§¿ù¿ý—c=qÞ¸)׆‹ÖŸe²ÿölz¦vàgz‡I‡½´3ÿÓaª\êl|1Ï…ûÌ|»`wl/ø²€_ø½+ð‚–÷çן_¿%îϯ?¿Þ©ËýQBçõþ/¼·©²·2?÷8ÿæOáÛÏ+<ë8ßv3çýž[dq+¹¾#ñMƺïØ{ùKÝ3ú=]¡S®^T§uãòñ¾Hï,8:žÞoŸrW¨$ •nq8§"š[ŒÉ½º UÅ÷;)á„dºñ%¿ ±7¨Û=;ëu;;®­Xe ƒt—«ó–ÎëwI÷~r4f»ßž± ï“9o»ŽCÿ¶Oáfäßko[v¿0{ÿMl‹.½Îtôu»{/^þ¢›Öóër®óžõÛíêèa|•ñwϯxýï³É¤3rÓ™ùÄu'1ï:<ó4^Ïì­É»[ÚëÕüìÐ.ËøÖ•àþ<8÷æÅ½žŠÈ\šz(ŠûTŠ—Èè]û½GôÞÕKö>Õ©AÕSm?¹Öß|Èyøé¿ÿIs+ÞæÃ?ÍÑ–²ëõÙC!GIXÒÂð3"JE!2WêÅ(’bâðØäfƒICÝÃ}Av””È^‘3F^!¡4 @Ï@®Pì#áðB¹²›R0yÁ è2 ™GÝͳwIfÎjTÒÍkÉ`fX©tËèуtK—y„Á¨ŒÅÌÍ?ìÈ¥!§ý§O?=þí²"ÀÌ æ{ËX24ô Ü0ÉÙ,Y»·à\ÉÌõT2¨yÎ ›ŠÊÎP-$ô0¸ “‰[F™Ê’ 9`V¨°ìÉ lŽº›¨®ÃÓ“DIóJAós£ÑÉ:YŸ#33Â,Sa¥·¹!gg(ÑRêaªá¦LfL;K¸ sÏ0éîš)??.Õ}*F÷CO´,æH¨'z,K„§O^‹gHUc-Ξ™KßIÅxH%$rø4 Þjìk <’B_P*¼0sð !ÅAqYí^ßXŽ„á¦Ã!á™p€¶êûf«ªžÔÍ« <)Ú*£gÛ\y'$‘”5㕊j±ºC ½#Šõ·ÊU¿ ÑF³9ÃO4žAõáfB«íWkzÉ‘@ »@X]AÚ ×:÷ßÔj/°ãçw0 e‡L& «àÌÃ&wÐSQPJÙ·¾´Þ)NÓ$¤2sȹ™MK¤$äÜÆÒ£¥5šLS-î47%Ýë‹cµŽ®9›îSWÖ©d4Z s•Ý5’|Æe @ðÜ»ô†¶ ;²Á€lȽ£·1[7ˆÿ¦¼Sàí‰wÔÝšXÓŠ÷ÕWyäNVÆ-738Bîp„r8ZÌyO®,WàµóÃÁ²Zûî‹ÜÕG, ÒX&NÅ33ÒHBã`)‘3šÍ’Èô½q·G¦ËûéùãóOŠÙ«czøô7ÿK‰°è}îIó©V$¾ó]f¯“õè]ûjs1«ôÄ,D±ùôBéÙjŸÌÄf Yí}qO ´“g‘éƒÊ¿Âju,ϱdJ©ÌTDFf¦"32z(€/S)Sý›ÿù?ŸèŒ×j'ÎÔÿq=©øyUá7oÇHðü!|!å{s¯á«­ÝÕãúyl¬n·./l ÞR—ú|áä÷Ü©}~[zütm%å›-ÄÒ±+úÆ–'6è»9o‰•_=©—á$—Ã÷¶Ç< ÀðLÍø[ïóÈýNw^”Né-ÁãyHÈg^gµÏ¯ožó~£q5z_Ìz.¢}ËAŽüÅ€-¼½ýœ¦uM7& I£[c;oÐoør*â†yp=”n\¨¯ÆÃÕ}øêàíòôLíü«ßr×±ó+©ß:~¿°fÞ1¸¾gýÜO¾ õÜ¡«…â½”à§ßua¿¡"ùÜM¹gƒÌw #/wÜ…•½uuÿ*_‚‹û‡þ>žö[F×K©¯ý¿IsÍyþ¸>¼•vkº||Íb¯3x Îž¿Pp ðt.‚ñùë]¼¡<Ç…¯þ^ÂàŽÍ[-öŒÔ}[áùï=‡Ú¿º|^<›¯>ð²þõŸ¼o0ÎKÄËÏà)Û·Í+ñlíÚ¸ú·óóœ=¢g>ê¼½V—‰Ë€í„r_å«°]¡m8]F—_ÊgsGgá²Î.ÛÕG}£x·z²Çî×Ëk«sRìºHLóc˜7.y|1ý#œòRÜÆÊ—=W®è•¯4!ž76?·ëx­“ñ…ëðò&–o»†÷ŒGxƒ>å¶ÝF1áæã ]¤žnæÉ&¹_ôn?Ðé¶8¹—LÙõ£ÎFüu“áųö0>žàq”ÜnE~üñóüãã㟑¹s—!ÍÊÃnr¢2[7s+V¼~÷aªÓ´<=}þñ)~zœvºß ÔÒÌSêl ‘´nˆÈ»[qZddt±Óá­a~‚¥B ÑÖ ˜ÙA-0àÝ0Ì{+(QêŠì Á ⦂q3Ï\·c €a4ÂŒîVì„bˆGIFšG9ó8s™›ƒ¬€µ2xÙem¨x©¢^÷{ ed§Õ:Š´}ÚÓøø»ßet §&f’ð;dÒ–œ¡AúNÈ`†ðÌx0kæ¾S¡bŽfYKtEë}î’E1‘FÂàFöT* ’¹4 ;ÖsÒ˾:¼f-Áݹ»)R•„hFZ,™ ’&˜»O¥-=#³5Xj™{,ð­gK*ÈN%pÏ‘êÈDë˜Eª@XZ9yq÷%$ôI7¯!))ˆfÕçë)q*–äÒÂ˰EŽö8p ¤IĪqW®5וFÑNxY±‚4VgÔe 3``RÁ ££e!$m $hóh•@ahô#Uà€%guŠN0¶Ž®Ã±–Š÷¾Nö ðý¦é×uòF"ƨ Ñ–G`xä$”²u %¦ßWwÙl¢ 3ô†Þ @-0Àëú†bèû_¬ùòá¤Ý xN&|¼ŸäõAÈÉXéù>ì÷û]9ô¥ÏMÈ:M»ú1¥¥ÍHôPfVÜ6G&TKAÚ¡J-»ÝŽ}‰¾”âbo9·©Ìì£@>{8]}á×ø“*‡Ïeª¯×!cƒít„6ïƒZ¬wJ‰RЙ! ÂHË™c*k]ÿ°ó]ð#Lûµéa´V Ÿ’1Z2¶5* X#Œà€J –“À= ZÙAî°$Çó ëzÈ„öí“Uu§ù¯ ‰Ý,͈©š‹SekH Ê›`µ”Ÿ|*šM‹–¾ûô^wÓÎÉT|Ôn_ÿå_·Ã!{/dº"VÍ%y KñíÓTY,™òÞ±XÀJ!Ì»—0ö0­wQË4%™,"m^4Õ´k†LdB«ôŸ=¢‡RŠì½DÒxþzñºß=üæã_ÿ»¿ROEßBDò•­õ¼„M^m2jHÇ¢›sÆïü2:½dtê‚$~ "G|Ÿœ{[R~7*ºÆ¹ð­ Ñóâî«êÕ[§³È뜗Aϼ¬Áºã^vîlô†Ýþy,{‹¨¸Å<jÞQ‚Îp7·6v8]MK'|>î_ê[yâ„>–óvôÖ»t¶Ëº­Êøú™½À•OÀµ ÀµQÄÍ…{ý}OžÓmЫÒÿ­¥ÁŠZ>™¿¦NžôºüÖ‚0ÂÖ1ÊÓöjð\־݊îJi—¥‚Çíúx£œßÞ«»òÙÏ"§ß”¯ò=±³¡®Ë´Ó—åç³õ®æ~w?'¾·Jï¶°ú-ï¿Ï‚î«/ÓÞ™h·,õ7^Ò[£¼ˆzU¯ýÿ‚€û–|íyÒù’¤Ï['‹>ó9LÖyÖ¼™wz¶fïÛd¶þä óo1Q}»Ä›Š{õ­²Œü–kê;ï%¹}Å2qo˽²Ò³±þçn’_÷뙜ÕýLï_ t¬Û:Æ›§b¾„ {ƒõõ æu¢HÇÍÙp¨Ï+ôºo$üóß®?Ñ×ËÎf_¸_®õßd‘<ïàÝ †¯˜Aó+z¯§ZÄ;Q™-ÐÓÄYÁ:¤´ØÕ}(üàÞæÆRö¥íñ€hß=”ù)—Új !”œö¥·Ï™lÅ-ÈPŠEF*Zcrpćs¦¯•¡Qö¾múc—C(uåüŒØå3¼b÷q-“'aDÆš ð=ô !Ò‘¶%Bi2 ˜¯S1/í1͆ÚÎLx1¯6ˆÒÔÚy L2iäàZÐ ­$¥%l*nnÅwßïææ i ê[FtZ±E³²#Ko¼ZAtö§%V™)&l8;º+¥(r×(ÁÌKñeQ –Dq¢~0°GÓ32˜ÓÌ`f48XkSAñujÕÝs”L‘¦@’=ÒÈÌôjBæâR/Å`óÒKdf4³n:(3#¨N‚Jµ€ú‰€ï"Åa‘Úº,“É»¹1¯H>T’¬]FôÖ‡¥¸Ñ èNFdÏŒžUi@¤œ$hDB!T²”Q S ¹×a‰"6Á×Û-&¤i‚ÉZÍ@ä‹È1ü†nKB¹ÝcÈÁ˦·Û)g`Z *ÆH° Õ0Ô€DžÊa‘ _`‰ÚtÁ|€e·wd ;Ú²Má1SŽh‡iîP¹r{°ï€£Lð²bµ¬¢îÐç•#¿&Õ´JÒ#¹žÑ á—é‘ 9^åf ܶTœanpª>±˜®¤Ð«•É÷´1C Ða~¢Ù~¿k}鱈Do-ÔÃ:¢îê\Лթ÷–-&¯ûéaY:ÛÜ4«ns›û!%L‘þ¯0G4póÑM@ 9à9C)1úb­ô×ð=¬/[ÿe¨ö)ˆkŽ'2­ƒÚï¶¶+­L¤²f•F¦jà€†l[´äVàÉaЖ&Ô£ë‰P’Õü  #)—=°´Vøc7±X¥÷á¥Û’fäT+øÁ;Û‡Ƙö¿™þÑ?•ìéw?Í?þ]À÷ùOÍ×Å£îÿ¢~~š¦"£1{™0‡&ª²™Í² 0$¥§èÓ‡‡,NtÖžÅ8K‹×º3G2€ÆR­Çb–X7Ÿ«”fìöW…2+d ~"£÷lk Z̼xÝÕ¿ù/ÿe¤  “ƒ¯À6콡Úá²°Dßâé|ÇpO?/æ¹4€®LTî-Æ9^àÕýë¯hÇø…÷å˜ÝáÄ—ÆyxsÁs%ôçåÿ_®«âÊ[%÷ë?ꎜ·e9¾pgòËÕ·Œ£/ý*Tˆ/Bêÿùõ+þ,ðýQ ,|Ðù?–¥ì+×´«äô ]™ßbžs÷:«Ü/g«Ï 1ç^%Ô•#Ó;d¼#Jÿ’…‰×ÑÆñ‡_Òc…³T? î{cPžU _Ý«Wý;®6HÇ¡reÒq62t5uÎk¤ÎOž]ŒÞ2ž3*ßÏÑa9Âög(@gÖ/Ç@æò@ÎË·¿2Ì?6L_4Ü·Üæ/òx~{àùþuP÷Êë¿4+p*Î9WéüCoYRŸ}"nƒìÂÂïTø³±†ï÷«ðüýÚxÃ,ãkc¥”k«H»™ÿû—úÜ—e”°×Z¦;37£BżT33:?~÷Àv˜ÿùóaùû¹,iÞ{ÄÓ¡Hu?õÅ?þ˜‹ú¡I½i™Ô²Ëe4 PasŽ wDÄ0k„;ˆ‚¡<2K DÀ}eýÚ[wˆ+P x„WxA,@=Ù´š)tžpÿ™ËO3ùä{ZÒ3Â+‰ÌžcœŒjñU¼!#½šM±Jµ^Ü[_R­xɆœãóü9š¬Ö²³X²Í}´Pd(”+™ÊLfÑMÙ(µf4äšq°Ê²sOô%I•bSìࡈ¥µ=ˆzhš¦]‘Y1F‡"ánÅØ-{)¥¸§GY{Zc–A 733§µ°ÝH¨§Ñ"{¶®&#¤èý Þ¦}Z;D˜´2j…œÓ Â$Mè„ë© ^méEÅjypRt*“ @(ke7'"[†-@ÆRÝ[@„ =–J¡K¶±Ñi(¢€&QaNô„„™hÿ'ÙV‘ƒØ®5„Ó[KÙíËÒ–È,´ÌÌ_¶D¹Ÿ“a |ÓÄ3WD» “‚Dlù*•Ð?J‹#@eíz[xˆ+óG‰B¤­EýcY’æx4p+{¯J]Û ¾ˆó dëiöŽØ’cÝòºÁ…¸ªØkFDPm85pGl\ºÜžsUÔsɧ'èKßOÙC©þÔ~ߢOe*Å ¼ÖZŠO>¹|ñE’hP„–Þ/>#í©-f”—:©y™{óâ”3˜eË%àè€mí‰ažBÝC óh†äv2õ!Cð3ÍÔ– ÚÄj%"Ö?q[Ucn_d[cSn6ÑÀê'ìeM) j™%0|åÚCm¬b2ãD/éaYŠÍó=¦,ðaL¢â齛Ш“&Q1±8?}·Û}§xZú“M£Ea{NþP°ÛÛÃ>çxxx˜ööð@Eï™–¡LÒ3ûÒØ:2Õbu'/…9·n6Õ(•°4¥¬÷¢FJ¥LL™³^K®æk Úݧ^f*ó¼ð?ZÖ¹¶÷âæF3sÿ÷ÿù?¯³BÚiçeá¼Ó\û\ÔÏñ¨>+ù‚|À™Dz'†¹ aê+#±ÛÒ»›üo®Þ†ë× €{†ŠÄ—ßÝ\!w¾âÜô¶Ÿ_m4t»ß»ðv¾©{zÍáMhPòM1öU çÝ“|Oà8—îûIþ| €cõê«_r·ü_[ËÑhwø²‘ñe§GPÔ¹?ðK–•ãç-_xê®yï…ÿêû¥ou£ÿa&Þ± “ß‚⛩PøÅÖµ·qç^þí«Å (Z^a6ücæ þö:ÿ«ÖýÏÐÏ-ïϙտ<†Ë¹ïñËž—¨çŽôG•^ç¬mœUíŸϯ{ö®£eÝ­ ²\]à΃äËÂS^! /$³›ü²ç¸ÚÏëùâ­v'fã¥"x ÏßwÙ|=Ñ·K¥W”8œ}®Žõ!zþ‘JœÃÿ¸~Åùzsº&¼>±«±ë¯Ò½a²6ãòø Û9Qºó±—þ뎟{‰œ[7zé>šüùØâ91õ‚òsBEgdÎ19[–êlœÝ_ˬƒ1±Žô£sÁ»=Ú©®ÓåRº…®ÏQ½žkŽ[Ïè8çuzŒOé^y¼ùóÏ{”ß“=öÁ½Ç+L·-™›€ò‚±2obžEDewÛ'O§óNÚ5ßúúÅsÊç½>¸‹1xö6]uö]§-ÕeÞFëfà"gpɺ¾"ºðê¸Dê¿1¹®ð¸-¸3-ç­ŒÕÂÉRëT{fë9?Î>Z1+Ä<ÏþigÄKO%Ùv‹Ò©Ž„™$µÙ-³5a»Ú²ºH@:b’-2‚åúhÓÈš^`†Ün¯ ßÑsô ê´ ¬‰X ­BÙ+lB?ÀÜke®:¼‚F¯DÓ$ÊÒ+(ÓŠ|0 ºŒé…3GÄчC›xêŒAŒqóÄLÀÌ&W›b¡¹±–LÁ:èÅw­¶âӇܔ‘¹´Þ;² P 0Y:§Ô•I ÐÝÝ 4DæÒ©áªÛãF³§eAÒä"ju™z¦EÏPDÒ¹ß;)v’ÌŽ¾¯0K/SGrcrCÉ.$8yöÌðe*#¬J£ÜRÑú2+çTkOb ÐG…û€Y™2*0b"šÔ’&[‹à祋3 tb€à‹Y Jã„UãÜ:”IÛ»y$•ÆUÀuCuö7VPD—7F! &£Wï\À’0„„d…“𵄂Ӫ•ÞRƒ•:ÍË‚HµX(™a6<§×èdžÁì0¯ÞpðÇc$’ÞAG©«¶žãÑä€Af(ލ£ÏëdN¶Ãcµùµ\³úýçÎ6 PÑrb¶Õì§#çÕìwD{(Óú‡£Ò<·Òum…ðæèã»l[©c]YÌÐêÞ”óÔ`ÙhúîÃw»ò)¢·˜ÝJæÈY¦¡B¡Ìh‘IGµ©G“l™¼js—„T®ì­5wK v{ÀЗqïXi]ÉŽpІIÞM&ûTöˤÊúÀ©MöÌÕ•,j k#,épôÃckÉR\óOùðá“?| c¿û˾Kÿ8 D &鞥öÃÜ[³JºEÌR¼TgæSæg ˜·¥ï§\áP1vÄ"cõfcLšE­¡|us;µÎ ÿ{ëÙC™½¸×Zveÿéÿù÷ÿñ¢H)sä»ÅíîœïDŽ¿ã•@¿"æ<ê8>Æ7˜Àê ;° vŒŽµlj: ÈÍxgòBÈý8¯CN½ºóÇ3ðwY.·ÁäELˆ‹¢5J¼¬.âm ൭ÿ%‡GwÉ÷ã´ËÍùíÉÞbǯü{ÒcȪg è·?Ñ'Ïiþ7ûà;AïùÞŸÒ;mo’•σö×6#çªÁ1uP¯í•WŒ…+DÆ{ÇëÆëþ”ܹ‘WÎû†/òOçÇwµ•羑+*”Ï3/t*õÙÐÿç¿?â=7•äÂàYÞËóe?7[ËäÓËPòó¤çpÞ/¢±ðâ€ÿ*õÿ ÷jw¼¾ÊZ}iÕàÅw½ #yüU$Ñs;Öû ’opÁ›ÏíªYð² yà »Nsß”}êvjßJŸwŸ\Ï=°¾B×—9aÜÕj¯Ôªó5ù½63/k)ÿ` óW;Çó³êùm~÷½ ²÷áý¹x”]¾¨±ìvüqâögèÐÝ"’òsä¿áb÷F³X¼Øð*%}Á’×·<ý«Ëæ¡z•ØÑ¥ÇÉ7Î"Þ)ù:“Ëïí±.µ3÷Ö;ï½vñÛõŠò:ãÂÇüÀK3õ .êíê<ìýÞÛpr­¸ŒÌø|Àuò›ß#ÝæQ¥;ÂÆßýoûøãOŸzlK+SÙ×jÕK1ƒ¦âýÃn_«ÔÉL(35·ì}rÿøýÇ|j?ü¿̾«eúîS.¿ kÙŸLKÝà" %kHÁ:µ¢·t»÷ÕjX óL±$|ZµÈQI 9ÌD6€+PE )XBÙÓ«nS‚Õ2QhÈÖ[° L$m”‘Ä@3˜sõA`D ‚™î;…wÈÌ@”iR ™3dµF¥ÕÉùéQÓúã"¥×šJ}*êÆÙnn@æb^Öv$‰)°ÓJ&€î‹Zôx<F2Ä’‘™t?¤’ÊkÉèéÉd!{Ž¡»órw£`nFÓ&O©÷h‡ŽLfJé¥HŠÃBÊÔØæåó¬ìS… Ø1¸tj$m’Òšj‰èÈ q+jgÐHl©"¤³÷ÜU:‘-AVw#Z‹§Èâ4µ 1GD¶^¥XFÈÔÕ8´§NRÐäS Á—“2™P’œ4•µ,O moY<§‡RK™çå𸌟ïveÚù|hKOsÛM»yžy´e¬ýØÜÆ¿xA4d ”­&+j?¹B{@ ¢†‰îŠž×ÖI0t„ÕB«?°Ù©½à»lp­ZÑ;Ü! :¨ÓÉ3cT£ kÊmh÷W¥fÃÖ¸(€¯éß ê3V¿ØÎ朙„ÑA/nÆé§ÃS-µÔ©ìžæŸŠqió~úÙ£Û†KDñbôÈlÑ Vý¡zí½-mI¢ˆ4óD3G[V4ÌÐ3¡¾¦.h`AïPÀ¦• ¦³ ‚ô>½¢#¶ÚÿÄz/Ž…xY¿b`ÇÆêtì«X·(A0‘–+âl,zãò– 2Ö¶€‘†P&°¬Ì±ñ­Ù  „l$¥`§Q6ìžÍ³x?î÷sŠbíÁkÐC ô©Fßóóç'š¬Ð–4+µºÙŽû¿øëé7:ôÞ¢š¡Ä˜ ¨É¨*¦éCÒL Ê€M°Tçsö–Ónÿ¸„-ž+STv1œN—!SR"Sî&;¯ú&V¤RÑ#cÔþ÷h=ccý×R÷ÓÃ÷ÿêßÿÇ“åªF;§NÔl£Ì¶_ßc,îVŠK(æCÝ~ü)–eŒ`x ð}ÙZ²¸)Ç€¯0#ãe+¨ª·uü¯æº£ÆWþÕú L°ƒ„rò¾ÎgÚ¦Ôoõh/®&` ï‰ð VN³fu$¶³‡¬´óMO°@}õþÍÍÖr[nD A±Ù…˜•¥„jSq3K¡)‘‹öuÿq÷ÐbɈ̈´bÁÝ9+¦=;„ ¤b¥õÅXZÓçÇ¥Å}*hí§eIÊ[³Z¼·6P=ƒ ºÂ$nåD×GºÜ‰¿ëœtuÞ"w½Ÿ]ã+Àr.º¾†¼øºË3}N~=ø¾4 ×ƒµYãµêyïß•$}é†ðî¹V¾g†ôÅæz§³9@\µÂ߯šÇŸŸÏléÔÐzö¥çn[ÆÉN÷å,¿PÊñV>ZeÎÙ{£‹†èèÊhÙ{ô–¡ö—H÷9–ÀLÒDô֨ņð Y™b±¹ÿ@evh÷PŠ£ƒ»]q–ÇÌl ‡›2Ñ—fJ({°’BÃüÔ—fº2!å}gaÈ4!3TRèdJs %&Š$¤S¤öæ(¾,ý°´½[­¥/n9‚NL¤CÀÔz1`*ÌH ÕP­õ… I¢@@Ï$]ÉÉLбB*F#ÍR&ÑIlà @äp%<œì­g¢ZY–¥-…^ìpˆh>,ð³´òÌ™ -•cdíF-n ´9|ˆÞc•}ãˆgŒ ¡?ÐÖ¸ãH8f¼kÊoû–Ñ^ƒÑ0Ì~cuÅ8¢çÁMßþÔÊé| Ìbu>eccõ6n mî˜#•½­ø Ûõ¤²KLwOëè=˜$ùiÿ=h„÷hnEFkÙ–þXlߢ·b„¶’{ß› ¾Ð™3ÑZ )×®RWV~ VîýÐáÇÜhn¨±íjçÑž7Ñ#;Ó í‰¶¹.™(eõ V•_}õì•¶~­+U-kb FS®®ÑôÍYp‚X5š†— ¶C™­›&w›Œ´É&wŸveÚ},;Ÿ&ì ¿ySþÔ(™)½q^ªEîÃvëžœêGøøoÿ3Ý ýø»K¡Jô%ìû±Ÿv¥²©T Wã…«'„« m ³‡½„>U§ç2³Ð”éÆ„ÑŒPJž*Ÿ“ ×(ñ÷1\#F¿×òWó¾ûÇ¿=Õ†¬Z››“Žtì»rVö£ó¿=Ku§†âLT>~×ñ„—:ü®Sñ§¶vþS·z7îé)poOx‹ñBà…íåUÌù2å*Up$œ\Ç–Û¶ä"¼Ð O÷êüouiÓô.ÙúÙØWºŠ¹ÞO]öŸ€¶È/ÖšðLêZ‡ÑJ–Ü‚0’Û‡ðÞ^„ÏKm^+[fuÔñ"¦ù9ÝüJ#8 ?—IzNŒÐëZI¸åJé¬:ý–=zžº%‹Þî/Îîž;òÛYs¬º½çxw)©kLÍKÚ×qwx®wñ"‘wiqbñR3nŽŸsY·Ñ}9Ø^aŒœ (¼û¾¨hMç«æFöâÙvê|¾Ÿ"é67ó^ÎøÝ{w¾|]‰†Wÿ‚q4WûÓ—·´/í땷ljsQ­xùÔºR0®¼W.ûŽ6”—Åx]æõÞdóh÷/ êοðJÖ¸¢3=÷/ó‹ž-#xñPnS•w3¿¯´4ý)Bço‚=Ÿ­áÍ#øB`“^™•_3ߘŒyáí}«ÇK̺7|Â-cü 2ýåÅýL}õyŠù¬ÌúËSoèxCêgH']Ⱦ_W ý¦Ã|A7ä›Nó^À/pÍ´¦(®X?—ˆ)½Ï_ízߎ÷ÿP×eH¯>yþ|½ÓªŸqánÝúËûÎççùý‡˜Þ·Z}}f¹Ïî^ŽOˆ«%ûýøîd§‡ÛÕêÕ‰youþšJŒó‚33¦VpË¡enÉÂqL?þýOËÓÜ#Fi5ÒÄÒ¢ FLæ^s—‡žæÇÇßþåo>üÅ÷O¿ÿýÓÿçw»OZ²«¿Oõ<ÌÁJåAX€%Sh®$˜¾›IeW$h3þÕHø¶µÝ`ÍJxÙ¨>}Õ@k‘ò(ö_8¥ÓG G`8»F‡yæ‚ð•Ed¸dôÖ?çôAd‡†HtdvèV Ò•F3щô²ƒ fË4hnÉ®nÕÊ~†žÙB0¦2‘$¼”m0›Á§ò0/OPPÖæ'ePŠˆ~xj‡9–l³RPˆDï‘ZÌKé­µE¸ëÙZLSMð0…bœgHV*iX²76š—(ˆÚsT¡wÚ’îf^¡öt€R!I^ú¼æÏéàdæ0–ž}òQžleb_J)\RRÊgn¥ÓIRX2I>¸ïjyêL7>L“C (ÕÍŒ”÷èÂ"±Zíq€àV½g !HX6÷ ŒÎ®U_CdV«¾zHt(J!‹`Ê-:ýøñ!COZiW¼ÔöØrb›ÓXŠ—6·è§í§…en­%Ì€´Z|r- ‘£T|ã~z&Qè JE_€a«{dï´Õ×zt HˆŽÔ Ê<¹_¬éL® 0püCnçÛÇÐÁa'k0®$r]W‡_îÕ âšK3@}[:µ‘ý±vð¬Uꃽ3 Ó‡‚`.…†Ôl4¤§ç܃ðyù¼Ûí÷û½³ôÞ—å)¦ÒɈ>&»mùྴl]²Qè•®fK)Ӽ̄#m5m^õáÕœÇn¡²yä‰zdŽØ’>0–Ë ÐÚ±âÈŽ†HüLJ9s®ëÏŠ²šþ0è@EqÈÀ°ÒÿÇe@ƒïVs…qU§î-:D˜%w(FsøGÛ± Ʋ+eR©VºÕí³L¹›ÊnŠYîSF2`“si…ènAa_œYvÖ["–ú/ÿC)ŽŒ9K÷Ó~7M»šO;Wæú°/>öŒ|:ôRAxRIˆ™‚¾D*¡Ìînn­Kf^*Á:P@'Ìš¥dt ÿ9Ö]ãþ#”’ô/þÅÿèÓTvõa÷á7ßŬÇJ&]UkœÅ ÷¢£óçö ¸Ú;±¿(ÐÛ*Nñîíæñ[uà†„þB´ö\õÉ»;Þ¿|ÀgðË•&l~³/!/RÚJ¾¸¥ô2.ãY“†{Wø« ¶_8†+„Ôå0x™Úóú›×¥Û¯;þËæà7É+·ZÉs€ògÏðëz»ïu¼ÉºùÜ1â·þÜÇâÕ£þ£§òO§à×óz“ÇÞ+¯n»ÿD^_lö€?tÀ—caþa@ç¿Ehð§ùúE/ΙÕñGe“ÔÞŠåþXýW×´cÉÄWä7¾z5úºu÷¬ñá åÜWù‹.ëzKBæmãø˜µ;Ë\å2¾þ«ÞyûøŽëp‘Oø-VÁ1©Kó×+ò·$¿½¤Ë]ïkò<®sòÇ"ˆËÝÈ:p¹2Gûò¦o3 ‡Æ•rnÆÂ©­I@ÇÅùñ÷?=}þÜ[OI¦ÝT¬8J©LSNæËÒƒØgd5¶?Ûa>ô°ï?>þýáwÿý§öéãîÓÃò÷ÿ5s)|ê>Ó»Õ)`tHæ²’C–e,Áìá~Ú)d‡„RVÅèbÃæÔ|˜ßBe£uk OÖôÀàœ /ÍwN”Š¡uD€­ ¼¢TiðÖK¶C(—Z=Þ \kÓRˆ^kÆ00(§]XÌ3ÍP™µw8  èbB «®Y¦L÷RiÈPÀ*—¥Í‡ŒF`þü”ꑽC‘‡ÞfÍXf˜cú¸’Ám)­ô-¤ÑÈAìi2zôû©š™óSÚž!"c1œôâ½=ZuwFïtÆSÏx*Ö qèÌ–OOꊙHêٌ݇m/(½GöUÖ¦Ð×Bj•d…“‰yüˆpBÀ’zZšRLfT3±`çƒyÂeéµZª±›Ya‹.¦;¹º{ÂÁÒNæ„öaÕ@Xœ}`Sr4hiPø-é §FC 5JÚç§C¤„$2V¯ËcSOFb5‘°Þ映0ÇB`ÚÕ욦º´NYŒÈ"û¨Ä„+”mÙ5D_»XVÉhSð‡@©ð äj=.o !~ýGÆký[̘Y$Ê~k¬±•c3ÞPv0XÇNÌÜÌÖ–‚D-[Ê¡¸[ÚÊޑȾ¹r•Îǽx(åÌLŸúብì¾ûôOŸ õaïn½/OóÁX™Ábf*n]Ì4Òœ,u×z+VÁT˜[8̳݌FKÊÖÐËY+0š0F|ê±]½ì`ê˜Gc„@¬Eú£oc’Úz•lÍ)•æ¢×ïÔ'((›£Àj˜ÌuAY)…äóKB$P`BqNS9dÙ$cš—ªÒ¢Tó‡©hçÅKµ ÷Ýwù›‡˜c‡¢‚Ú‘ôþi‚ƒ/Û•ŽñðÏÿ–®iz<,åûì­Ù®mi}ÊäÕ¹”âÓÇ}A&¥õ£vS*EŠ>  ŒE>ØJ)02i&eD"ÒŒîî6DîŒóhÝ-Î^™?£ðÿˆûWdJÿòŸÿ+ÛMõaW÷ûñ›¡›_^÷ıö|Â-±üªËÏóÛ’÷ÖȼCVt‡ùÂ3MùKùß²?ÿ2aåË?áqÛmÕý7ÑJÞã+ð®pø<Ót Þñù|©éÅs"ñN‚Óœ» ¸#î–îïùÎM‰/Óüù¼ nk_¾šÏƒÎ˜¯0£¾þLn/ìÅ z¹Vú‹‡ëèUºì@úãSÙNXÞ×ú?¾¡(ÿ³)lßœvò+UùÿdôÜ/a¿ÿ:ÿ«Zvž[9ß[¿~_¸•·NWŸffwW§wå>ïþXמëÿ xy1^I:_tð…û²¼–\µÁ3†ç½˜þXçrüˆã ÑÕƒî™0ëØŸxÖ¥²Õ¼~²ž_.^hö·5¾Ûq¬þ·Ä‹OýøÎU³ñØoêè,Ä•o>ºõO=¹¼ ë¹.¹=çü^ œp9¸<®#|ë­=1V“FèâCpá]jÿ:·žbÍÛÑŒ›Šó¨Š7Déîuàù`;MϱÏ{7¥U›­ÀÕ7¼Ãúž——åŒÓ$Šgö€Üc Ô.xuA/:sŸºïmy5/:+yIIâtÄsëéùíØ¸[z-!Æ· Mo-ŸÝ6ßþâìooŸ‘äÕ>ŽÏ/îWñ¸Ã¼ÓwÖô&bÛo ä¢ Ž ôÃï~€TJ‰¡·¹›Š™·¹E[žž„Þh$”™Ë¡rú°o‡ÃòøÐþÃîðÃçøýçþø”ý |×ÜäÌ€eˆ´,iò é£ý2ÑW;_÷µZy-ÍæZ;#1|PEx…„ð 3ô޶À޵c`™×!IJ Nƒ¤ Û0ó\–lM^л´À E’(† 2VSr7’Sv&3ÌrÚdÜ—jáæ•¹‚AŠ"3ƒ!˜©KILëÚ”Ñ2#ÉÌÃ% õ~8Ì}9Œk¡ŒìjOj3>ü¶þ³ÿá·‡§ÏO?<ÅAÕ‰IŠ v‘}i¤¬X¶„Üà&=~îµVƒ™’…Òð…–ôsïOO &¶ž±@TˆóŒâ*@o`€ E²K„2C0#{&Á‘âÒZ¦Ô I‹(T`¦ºØÀ’êÒw“?Õ¥÷@Vs³t"³È"£·ÈÌÒ!‰wPp¡¥ZŠ$–¿—”Á f¬Ä„j%€EäXüA¤D“‚‰1 öû‚bÜÕšM}ÉÌ<úð••2¤xØï•Ù[#Ìh–ÀœÍrÜÙÜŠñënîGQ¹ £=‚~-"·“lMC,§§û˜«Êm°ºÖžG[ÓÃF{d‹f|òº)áu˜3¯é‡Õ¥öøÃV>pùŽäJ‚Àlƒ\Ï ·5c1¶pàéócJuÏñ¤ÜõÃ3!¸¬úäVÚ™28S„2Â$¨(Uvµ=Í4Sæä{ Ÿúì^ÍÔ¼Ì ˜“F+&t!KϾžÂæa0ÚlÐù±¦@2¡\ó7"üúŒå€ D€Zµ~=Ú:ŠF#ņ,µü†µÌÿh¡¼ö0(¸#„èÇ¢”u)Cž*‚3€XVó :T‹vnûœ:™ ½¸ÊîÁ§©zÛ|Ú{·h¥~ÜíÑ—¨u÷›gÚ~²}ÑÜõ°ó¥×c)Ñ{y˜8æ¹’{fûî·ŸŠ1"LÒåF¹‚úŒ4ÖªúáID/±Ô¢RQ¬…²3iiuäå2‡Û.û°Þ†F¢y— MB‹(v ²ËÌÈŒŒÖ£EžáþÿÕ¿þëú°Ÿ><|ü‹ïqÝù·A{òÄô<Á ®¿ÄE¤ó¬Pv#]nP„ dŒÎ7:ûþ_FžgVô¼®Š<ßKGº¡¬Ü`ÏÕÌ+dÁmôÆ çýä2 ;Eògôlû£»%vŠã o{ç¯èx¥tš×!øIt:sÝn.£Í«Àû ¡ó†Šs Ð1Þ+É|{Ö=¼Â\ñ"f䈨°Úó,Ä•Vx{w^­ Ô±»áž:pÇåÙ=\‡ÃF÷®‹©ŽÀ§oU u‹Úp¬÷wF·#öåˆó+vÝ+ƒí'— ÒÀm3ò%ýõxïx;â¹u–w«¼áPÛÍ/¦és÷ílö\MÁ6’¼ä÷ö7×Û³uìàˆ"ÞL”FKÛJ–ž«>SÞ’e¼Ve¾@(¿…½*L_·hB_ vß:QßEý¼šÛ;gÙ]¦$ñÆ=òYæ7«æýSx |yœëÞþî`{)ô®}úk øuæòb[Ì×OóéóÛšÅ{÷è…ªJ]O°#Š?=èÿî‡Èôj0xet™2æt”þÔÒ3g‰ “$õÊRûa‰l!#kš!)Ëd,È…‹ØÑETH@?™W¸•*ÄÒç–«©À(¦db[Ü–ž@J4š‡-œá45˜™ÓÀX”èâd#¿ÃYù@°Ø‡Rz.yuf*âpXJ)¥uS¢5I-WÉ~Àmz®›Í.Ð7½ØS½Á ÜH &"‡.2²:äÀÐÖSM­ ]êC+ ¬Ñ¾ÿþSÊO?=Âlšê§Oûy^ÚÒÚîîNõPdF*…”ÓçCôH¦­ +€XWgî#0lÎÀ±!°V 64?O«1,±Y˰¹f¬ ªÃ}Õ—Iäö$öÂC&†ì«¦?Þ 0d‡ÜÖ"zꔊì²#ÛÚ|Àí©626ˆ: æCËL>LHÔZÌjïaFs{:"³/$YÔ"2><|`iz]…B!FFô–TqNµÔÞFÒ»]퉈àV[ëfm…öÃÈḹÍùP X,¨Ãm­ë7®ëõ´‘E.¾X“LH„Vÿ…øê+`®M…H"bt„ºÌ„‰Sñ¤þÿìýÛ–$I²ˆmQ5sȬê>ݘó0 Ã'‹¿ÂÅŸä¿ð‹äˆáhtWe„»™ªÈ惪¹›_Ã#2³ºº»üô:™éán¦¦‘-[ö„;Û7&…P,Ô<%Ì6šJ²œÒ¨Ù> YÓ(¦ÉìÓÖræú<š¨M^kìÇ<Ö²:"ÏO"³æT­Ìû9U"\K­¯ûôi+Ól¯süñ Û!g©ÁòŠd*‚Qó$)ûÊ4³‚ô¤ ×"EkD©žÌr2©µÉ„°®ÑmG0^ÝKñâ^+ÿwÿ㿵͸y~úüÇßãà°sç£sq®Ñs? }3Z¹Í_ áä2;û{Ywò^fÛÄ©·ÚÊÆIÞ§Î|öÎ3-—‡t$ú„¿*IùhÀm²á™ZλHv·ö3ŸÈ™”öÄÌSnÐ:.åâwh–PÉ›S+뱋XôðóÝöúK ïg}’Wí‡e•y?¢W´ §‡CÀ÷èx—-ÄÙ~íº ï-Xƪ 8Ó6¾ØSnû™á¢à'|-| Q[¯§Ûƒv¥à!EøsvÛÔÏÅàÚI|*½œ¾Þ„G·~úü†¯uÀå·<ðPxxâU úÚgrµ}=´Ü€éß·Š/ƒ¯ä°øY½¹î¨íŸùâ¬üU¶Á7‘ÿ~Eçykžbx"øM,èz¥ß†àû¡z7 ãG "~‘×Ñ{ð, •_vÀù‘Ëþíõ½çÙ¯¡ÝìüÔY¥û|Ï„ùæËVDTDE|‰*Â=ØñÁËŸ~úËŸþ‚XÜ.H Ñ,TÕRJ!D€lfjY€:½üåË´›}W¦Ÿ^ìó0M»ùµÔ/žvSb¿›’–Íf'Vš”p×pÌ;U M.ÆðƒÙö‘äØ]K›ìFš ÿâî_Ÿ†îlivl>/ÒÞqaËØ|‚˜‘·À „Ð ÂÑ0bí*â•PzÐRG§¢&P¡“­V¤yaQ:E °ˆ€ "¢zŸÂáó¬ÉèáÕÝTLÍrö}q8¢j+¸GL # k)uÚ1"AêRä²î_^_¾|ÉO£R¦É¢Ö`EªpFñ J2ãX¥0¥Ðà1¹xÔ¦ó­ À'D g„¨Â"óŽÅCDhƵ BDb.Jz%’”œ“ˆ°ÖÖ¡``NÉ ²¦=«@ös0ØÀحЈy)× *pTQ¤d^}ï1(6¦¡ „(\Bpj[i‰Ñ š ɰ†ë;J€¤% 6Í¢7€D?¨N9R#«Qô8Z‚D=–Ÿ°¤û©ÌÕÓ¶Ï£B½ú¼wUËY7›aÚOôÂ<Œ¥øn7ƒHÙŒ–“Õ¨\TÎ(Òˆæ@@|)€–@YŒyf2¸ƒìv!ǺrÃåUºÀ!ç³=.¥Õt꫞>ö[“¤:@Ú•Ôκå@@¡@íø¸,G„½i½Çrñt$U¸O» °§ív¯0³âûPQdw¨P!Rµê ŽBA¸°JM¡šé±Ÿçaç>C¼Ö2 OQ\T¨ U®Î0dJÊ ±ÞÁàÞïw.`@’ALz1 Î w[  i)˜¤ý¥ƒdC’¢{‡¦æà˜ æ^#ñÅØÜItLÙÑt¾"œ9ÛÓQÅ:=©ôÉ)ꪑ¤i›6cJ1ä!å§”EÕ>o- Û ÇÁ°Ÿ·ó1³Éĸç6{ŽÍÀOÖ°M 2ÏõyÒ±,gH¡»L<(’æªÔò4„SE˜BRU¸{2a ›ça£÷¶³ÍL€ZEw'A63ùŽŠéAt;â$½ˆ`ü™k-•ÕIþË¿ü‡¼‡Í¦ÿå²ÇôÿðÄ$u¥šù«Žë¯Áë>€•ÊŠ|Û.þoþß2<è~~;½ŽÄÿˆ ÝQ^묖´Y>­Yç;Ý@÷ëE¢þ6ë1^ÿ&³«‡$€~ÙßoxÝo¯@ðã;èSýb×ü \ð1MqíÛçÞ5ɇwÈ1Ýê–¸zlá­ÏãîMßä|I1Ι§Ý‹çÁ›¨ëÕ2åU’ò%ü@D¸ì—;ÈÉÈú‹–¼á,Ê;pxšV+×4<äÒSl%‹„“f‡³Û¾lˆ9ôLž5R¬J_¼N6¸è\=9\y–=Ýq‚=P“´zé9•àšJÓÁUUN)GÅÖš>Ëo¯2žKªþòÕ<örã‚Ûp¶S| `=_-oy/_´]8éW8÷ÈàÉ•“Is2µO»áÞVŒYo 7ú˜ H-óú=k¥¡óÇ+ËúTá‹d[‰ GŠàý§sÝ5÷¢þ—JºxÈŒ{M˻ӃyÒ:ºÚ¡e邾{dÊzk!¯îÔ¹\6ô‘ª4ꮑÌ&È"òåO?Ï»é§?ÿ¼}ÅŒ‚´ÙôÞmJJFb¿{Í) 9³ì¹+uÜŒ§q,»yúùuHÆ!1þ¢VÕ\ðšÒ~û„(æ{WuUæáâET¥4®ftR?Y’ÆŽjüM³…ÍNy† ˆ"å•6Ö'š¹€§ êºX¤f˜!†-(ˆi\a‡&¶&*óŽPŒÏ¡‰"jYEe•H"Òd‡DU(2× BhIj™lÜšåp¯S˜H¦¤¨ÈTQ½Fø\ÀP zÔZ»Z%Ý=J§¶qUg;ä* QÄÞ-éðôÔõ[L|®îª),ÜC5¨ØïdJ„'QÝ¿:J($&:8°«–WøN `£{{Uiº7’à¡ÅáÆ$ÌÌ.B' žºØN¡PsÊÃl&•RœîM$šÊˆƒ„$‘ šðÇ$YAF©‚È&ãt´RJ5GH“»h#ù6œEø¾Ù 7ûÙ6I¤©KÃÞúJ3x4q’FŸ§vArz7¦†4ï\•d¢’LŸv5™©éÓ8$ AnÇÌ!¥”ju9™»{©Q èþ@)ЄðN-o³Q”mwÀ­å%AS/]ˆ!i¯-+{ÙÞJhM]IQ;=e(Q L—vƒüº@²t…œ>šúôk¶Í¥£' MèÐØdp¼WæÚW" j9MS%CEvÓ®ø<Û<$)yÌ£{,ív¯&îªi.`áxm%É$Á%*Ü™²FWqqÏ‘“%÷Å›t’{ôs'Ðút@¼*â‚ÌÛ®Þå(tèI*•t(@³¾ƒÅñØBˆ„¾Nü¦„ôJ Ž¡™ÔvºuÎhÒ˜Ò1Xøó4KÈ<‰›œƒ±sUM“Ù6嬹 *›A·ãF² yHÉ2$yÞ¦—н›ÑˆéËTÇ4P*…ÁúeÏMNfüÓ—˜*³r$k•¢ÿ¥Ö¹x©Qƒà¿ýŸþm7ã¶ÉýË•Xjå%8ˆ£W±®<Š1ÝÓX¸—³œSÎÎ;8ƒWR¸3陣² Ž´q\é}|„»zIV8³ÿ½EÖ“‹×ý¯¸v:n‰ª“gÀøUiÖ7Ýÿ®úå>˜]sƵ)8‘m‘uä¿–†½­p`òbé–?NcÖpJÿ¿õàpÖÑ~Mü÷L-êTÎö˜i]êõ/b¥{yô—Àøá®#ý3Ìå¬î€œ´®j˜ÈÅdxÄRøMÝüK¡’; 0—z ·º´±ŽüWüM ìòQ'J´—}7¤'âK×§÷Z#ëê8ÜW@zo/õ*ë‘“V§£Î×zÆÈ è°kão›åj»Ï[3Ẹǭ€ÇݪïIŸ]ÿ¯¬ÈÊ5!Ùûiïé÷¡W©ïºé#WÇóÖ9r&ƒó8Aîj›ÚÙ|~ó¼%pÔoB'‡Ëœ÷ºzi!~Ëtçz¨A^u < £ßà•Šœï ÿ8¢ó§—Óp9ìŽÛ‘4nÔ2œ—=xgøcmï­…¼µ_„‘7Ðe û{û™ßº’´5Á›7µÆyÏ+÷ûÒA ‡~jOp£Íîú¶t@¿]ÉôYŽyÎaÊea‡à‰«€·£‘Û =?„¢÷ö†WïÖèx_4è2Ü<û^ÛÒÖóöšŹ Þ*ª–ÞæÉÿΪUrZ±â"}Qn¸,lÉ­©u-¦¿]ª=^¯äûæãíí—¢rW÷Ù?åôËÊuðv²Ú±ï³ÃìrU=¸“¯ÚÎADÇ>(dÓÿFA“—?ÿ<ïö^ª™¶~4f'I¦œ}ž_w{ME#À:¿ßíŸ~5›_v2 –M‡ôú: _þ’“)9±ìÜB3sáSSœwQ$0¼1Ê›Q ×Õ®µÝÀV6À¯¬ÌD'™G „ìÜí¨@Â<#¢kÁ Pg”"µB…ˆfv*î2I$BUX…Ao1@ ˜IˆlE2ä%8Ï ‚ªL„0q5T§©Ìµ†v‡œ¤_`±Æëïèmt¼¾!ì"H½FÑ‘Ü ¨1¡l¡rÑêÚ5«*¨& ¢–fœ>mFÌÅÇq0ŒiÌ’NûyÚÍÉÌg' æÉs²êPhÚDX¤ùÛ&±êPm[AtؽÍí¶?D,ig¢CÛï¶û•^Oo^´MIiÛm±%E8aXÛl†%DAÔz ¢ÒQq«ÛqsY°Ý¹_yCÌ]¨íd½¥@ áû D2Ûlžš«ÅëË—iz5•¬ª¢UÊG¡ª^½z¥ÃÌ‚Q¦©Ô*‚ ·:Ü œS-)«%Í‘¦²‹(šT4èhý.¢`s! DsII9¥D–9½€¤„:Üpïs,ºU‰HË-Ì#ÐLÖ»¹¹©“uéRJ"ãBPªïç:§àÓ8&ÓMÖ¬IT’Ú'¦¨;q‘”T5 ãf6C6Kã0rÈù÷Ï¢ÿíU‡Å凭}Ú<Í• ‹cÌófH¿Ë6æêBçZ¶#L‹»|ÓÓÈ¿¼Î"®I79%™Ìn¢iÈIQ›«i4ÜÛ¡¬Ð]ˆÁÄ5Ó¹z¥&@TÝ#ª‡À!©{˜ HUqgõ0P’ª6Eº5ÆÐÐÿ¹ÔRë\¢†þÍÿô>ÿñw"MHºc™K}v%–σsÐÁýêvxvrÚÊí`W¤ yïð}o…°ñJF’]Z rù‹÷ãœûÀofû߆ö`Fº ˜ÏE*ï"ks·y$tSˆA¹È©ú O%þÏuðWÁ¼à!¾â±áù~¸+oá%—(Þ97o0K¸”îˆJßæ_ÄÒ—dx‰üÞ@®KI¼g\¤A§ÅÇ7­§ù®Uu) tƒtO]äœ%ÈG³ê€@Tâ|õ—™æC¹ï”xLý¸¾¬oØœq!½ÅœýÅZC®–—äÔjãM W¤¢åÆÆóUwöæÑs£êvâ›òÍ¿÷o“ûgæ- ûáBÔ;¾ûÆfË»{õ?¨èüµ»8Ÿá§Â}·N[üj_(}L$ü»¾~“úíõýúÞ•·ß^¿àüqM§Êz §æwT!Mø?¤ˆ¼üé粟¢ú_~ú’†*%ÜËl9å!¥Æ´v1;\i5ÆM Zì&Sr‰Í§íîçi~åö÷&ƒ&¾^P'†ûœ|Uzó9¤XC*‹¨õ8_AÔÒ‡º¹Kê"µb iQ)i(Þ Wˆu¢´bYj¡%@Dµ²• :w>!&…Ú0pdÞ‹ˆ–Œ0ÍúôY N/”yOŠ#ÔÔ¬ñ¨ID¨ ^g¨0"T@@X‚Í1µO&A$™¯î_¢ñÔž"šA¢A¾” {1 ð ¢ÓÛ½40œIa"²‘Ù‰J"šì;›V~ $|e·GXÒÍvÆ~š{õ'p±SGûòón€Z’Ý~7ï‹Z³ÍçTf÷Ù-icšË°±M–y&›ÒI SˆÀ›ylíšû!£Ïcçïk+H/0ÀV0ó®ÔUf5 ©» ˜5¤¶×ÀÞ.ã€-öׯ@Hg÷÷-«­Ê…çÀV–S¡õ_ ‡Â!³>òMcÇò’ß[/´VeˆÀ=Â#¥lƒé¤c‚•DJFÐ’yT@ÄÝÔÌ4BT,Yv¯ CîðZb3LûùõË”*­®á5`íǬ{ƒð„jΪÂyWÃ!šgoë*½@B  -EéI¨0xë1j>+*¯i/#UÀÔôx< œœŠ‹Š™ Yq|0 6éš4‡pXÒãçqG›²ÈfHÛM<AKã ›”,§â±ôÓ&jHq×Íàs¯cJYeóy+¦þ2 ø¤ÉhŠÏû¼E9ÇÏYÅrVÒþü* ‡œgÎñ»O…0’QÑú;¥¸Gë‹aõQ´Š¤(ᕦ¢ª‘Ô–ž7 Ò(º¾Õˆ¤ Ñ]}.u®µ”¨þ/ÿúߦí8þðüé¿ÃIÒ·°ˆ/iTÝõTŠûo;–üeÚÛµïoÿ¯hJvïÃ[?˜ÀwÝÀ¿å\æ!Q‘vÄ7úêo‰Ïo¯ß^¿½þZ[î;Ðóß^óÓƒñu›Ñ-G{é¢Û¢š«näï>Á¿ö"š pctKË^W7z¡Œ(7Á³{Üÿ¯ö³øO¾K0(g^WGÇÛ“þGˆàÒjéøÿ#rX‘ƒÎ µXò…‹z]çx_atŸ´clÆÎG<=’›Ooý¸ÈÄΛ{Gë·`eÎÎûO‘Ú[Ï–ße¥ýâ¯g W;N}€¯Pq„µóõ´Ù⼩GN;ÞëèuÙñtÞ|Ú>•¸bÝ$§Škg’§§)ΙÊÖÉ·}å`üÜ¥¥ºè—9S–’ âÛÙ€?Ri—“Vò“‡uµž¼îtÆi7â­úÈ!Z<ûΆîr*6vûÔ5åeÝõß‘Ç<¸Ú–‘îa:¼þåçi7…W†!„jj¦îNwD*,ûy’j„Õ ÀRÖͦ7)î†dÙær–?、9^šèØn>srp§Æq`5Ò‰Àbl¼ãº¨@4…ñ>7 ÍG©H†±Av6Ú½IçbØþ0Dp~-Ý' ­©¥`þYX˜20"jÍAÓ Ó¨!P}w¶ªYt0¥§1©%xZY܆QUÝ £ˆº§Š„©´O˜¼lh3ˆä^Dé^@á,ËÃd”¹‘g5‘z}-óÅ™ %@u‘³<¤a Y)…ÒÃT<"–"œê’æRga±¬™™ð¨D£YâN’DÌ" ÀÅ j`n FBd16ýiÕ §æ¶DÙ4"ðJ–ª*6¤6‘§ ¤>Yr ''w‡¤ê„GvFD VATĺ॓°[•'µyr/Á jtÖ¼ƒ :O €U–†ŠC¿ ÎÑùòt„‚@vP.Æ[׈0Ø öå¬ÃóvTÁ®Ö@XÒ§§aÈÉ’ì^jJ)‚›í²–¹ª`Ü$m(; &iHe®Ã`š’¹;ƒÍžW“ExëTЦö£½Ó%T$¬kéˆvÜù©[Fx…4÷>?oÚ¶èö(ÐX¤oxAJ}g•öPGWBé½APƒ&D ÌPií2@ *Ä{Ä!­´¶\˜,u…X,I @–‘–ƒˆîö¯fÈÇ<äý®¶§æÕÝ]„CTÔ£ÎóÌ`8UêbÂÙ«W³l–À€Q#ÔÁ²/á®&s"$$e‹ˆfà]4‰“‚îáÊ®õDï^ÐôÅ’¤±ø…L0¢:D`ËÌß…62‚œ{U¦m À—‚ÊA")š<‘i20$+î˜ÈÓ0´I˜sú4&VƜƄ§Á>míy”WOffSày´þAMdfe*˜JÞl«T~™gù²ýý³¶2 ¢¡›ÎºŸu3Ⱦ‘Œ?<¥©X 3††Ò™JК @­. æ$¨ 0•’R¶*[×ðˆŠæ”º#6Œdš“I¯õ€úîáÑ•æîÿò/ÿ6o6ãç§Oü=׺‚«Ô€XiÊùq‡ÛŒƒ~¥¼#t¼Ô¥‘“…ïŠÌ. žëãªÿê»Ü\ïK|œuÜÊH¤|ó¡/ø}xE—–õßñ]Ïè–:ÄenA®3m9UÕàcðýáƒNûNuŽäVNÁ7œ$[hz?Ü?ý赃ô»Üét}{àzš;ò #â-r¥âÄûðì¹VDºøåû¨Åá´u=NŒÕ×­—á×bpo É»ö ¯¨$Ý*ä\ì‹>ïáp_-‰¥ ‘WSùuš¶¾Þ“GÙ÷^^´L_Ù ®úv®D®§š‹ÿ|=û®Irõ“o)PݧQ#±x~o¸ù¾ÄÂEï{× ÿþ5¸ßìÇ<Õo¾—‡×U ¦S<÷¬=æúÔúÇ¿=Ò§º‚7¶”%ú ϳýçýº³àRÄâRšâòqÜE|Ðüüªm‘,“O 5¯¾ÆELGÁrUï­éÃýðnEâŽö‹¬SÇ—¹\S3¹‰°±œE°ÿѵ¾–_»yä÷ÓìTëNž¸€µ§"Ëó9¨\)ñàAñ3µÓ ¹‘õ\W£_øWÇû<`Å×PÚ”ÒêC‘¤”2;a,DTDcpëRo2îÑ%õ­)ìϤH˜.u‚€,Z·]X_/¯´÷£zÆáãÆH¾îv›ÍPk …îafÛ§ATëÓä¦R‹'á–*bšsÚ½º¥Eó‡G¯{hg:$÷½Ϡ¶ƒùÔ1}QPú‘ÚÕ±ˆº_>vùdi½2"`íÖô^ ,opÔ ’¬H UF´¸€õ¥ ‡¨½ µ,€")¨¡Ný¦Â!bãv1‰h™}÷òBw³ä¾ßëÓ³ 1ïËf3$Mó~š`š,±M’Y‘6éuÿ"Õ&â Wh@D,¢@¡‚,6GIYªHLRhyŠñ¦£Õ[Fj DZnÐÚD™¼wÀfË °„Z‘ÓÑÙ£[ww“¥È˶dé®àD ›ÕˆðxÎ)'-N§ ƒÚ&¥”rJ±1Œö´ÝÈ&ÙfHO›Y}N¶t;`“8$Dpš#HÎ:nʧœ‡, _§ºÉ³3åϯ;Áøi;ïæ¡žŸöPSê×½ÌUÆ‘Ÿ¶!@Pw3ÍÈ( âÐR¡C¨@dO%†šWkY$™yÄ¢:I5S‘êA” šî¿Šx°x(M§>ƒááµz©>W¯ÿÃÿø?¥q3~~þüÇßÓ_òjo”s"ÏaÍËŒýÀ?8ÊO^ M®FG’Â]&Ô ÇçjBqš¿]­µÚïgDƒg0ÓÙ7^þpGRÿŽð},û€1Êb«v¸÷sS²ÇÀ‹;!o»‚]Þã9̉•ú (åR?êÀ|Zbu®,®KÞ®ÅÖÓd-H½Öô—•èõ<ˆ7‰Jkÿ H?6®¬ VzGkùìÕgòÔ§×T­®U#Öô´3¸ëT…é–šÍ2Ú¸mÕvÝc ¾|Œ]tk(¡þ2vW¡Ã~Ç«^®9~¯z,g<.”váǰ$éWõáÖ3šå²•÷zÏiV|ZN8«¬×øñÚ€+÷µËß•;ß×O{äÓÞè8{Ûõ ¼íWƒ§çÿ*òÈûùŽEqÉ+l½3¬ãÖ~~µÎ}_ðêÁa¹(ß¾]Y¿z€^>¬KªcÅò,ÌxC|wŒ ¬@ÜÚÍ¢ó×j'¸\ÜëõÊ ö:|v¨ÞuøÀ-a÷ïq¿x«àòÝ÷ú^¿IýµÊÅ~Ž7È4ßç:øàû䈹žqÇÿ^¼¬|›áÿ‡è»ô\hç_¥!îÃÁÖ»X!Ñ$ã¿õ= … 0‚ý——†þC`9—©dÑ$3ÍéÉ£ÎûÉTS¢‘4ÉcN†4d‡q¬Ðú:©YÞ :ÿÅþ8š¹Úôú—×q4%bÞG U„2<à3,1'P{L_bÇL¹KfK@i Ì{ä¶8¼B:@µaƒˆ¨eï„h3&M¢ŠT'u‹4Ø&©šs)ñúS>¡¦"Šº×áÉòˆ²3µ,¤Šx¸ÕÏ»:l5ISªuŽ©°©Å'P¬¡$}ŠDD‰"!¬ ×p?ËÔ„D”ðî€x”Z£xñ2£¶;MH©Á©)[ÉFQ…P@%AºƒÑÊñ€>©åéËÌ9´Ù¨”Î_–Š€"5U¥ˆCÁð‹”¨M ‰$j hH€qJÙ×Р*‘²Î"8—DÎVD\e Z Mº¯QçØuçi˜ ‘ Z˜d!iZ"‹¸²vU  ]%Wþït,]E`,Â8èH·V¨÷"“;œì<ôVôcÉi‚ Ú -hn>ÏûˆØlÒ˜uïS­³ûLV =ªˆiH)y¡ª–Òáeª¢ÎyžÇaLCN)'3ð›^“å¨%UaˆæôERúòg'¢jj¶qγ×þÄ# ñæÑÍ“½õ4µ¥X9+(”Çʽ·+µV€hòSÍ@BÑtˆb)í8:÷?wÚƒ ÉD¤¸Y}0KjIÓ ²O¡IÇM–1¥1‡©~d°ÆCŠm L›ì“sLÓ®¤]Mc*/³©Éó&beþɪY×0}\kk;sé9‘ó‘j…8L{WÝÎÊ'Íg È'@çǵOí‘ô"xÃèü8*-»æŠìÿõ;ìýd·×Ï-‹û>^ øM «•4[‰Ò|lN:®©át2<ÏÉêäO«Á[çc¼óøßØæV±¶¼•™­žØù_÷Ö‹ÍáVIö‘vC´>Ø!ª*N•€Ž¹8òÖà^ÜÒ"4Õ»Û|®áP“ý÷?ÿ„lÍéRE”QÉF’4{> Ü4Þ ™E“yñZjÙ•±É@y©ûš¢n’šéü Ù‹…Â…”B²ú¸K(ŽR;l£#š€Ç\ DÊýâÕàÑ]|u„mÀ@aTQfLE‘3# 54\‚ C“î¿@÷²ùœÓ“”ÉZ÷±ñ©še/bó¼)EYKˆ" ûL{æQ†!©ÆôâfaDñéu&S2Ýl«0Âf)ÙÒÐÀ˜‘Ò4UYlÖ"ªÖžA”/¤¢ì§¨¥–˜&–͇¶HîríP±!©D¸Ð!ÐZ="T”tm¦ÄS¡>Ïó~/–:<ÀêR4ÒÔæM!”Ô|qqÞZÌä½{·5/S‚ f Q³Dõ!nÙæˆ(u0U ^碀š¢ºWFÀ¨I Q’’6ùBIµÃEšÝ1’ ìiÊ.Ïâ H€vYêàÖHñ~8V„BDÀ`×½ ! €2oÍ­A iPUDDÉôÓ§1'}§ÊxÊ"M¤ÜÛ=x…¤¨µÎ¥˜&+^)¶9'«óLu6dÑ6mwXBWÂÂ_Àýƒ±ioü[ 3 +C7éõÒãf¡—€pQ"´Ëà M°œöl ?ûØö @mÒZ© vƒ àÚ횀 ¼¹Ý´ eÔÒ¯ÁÝUà¥iÆ”óPkÆq¿{¥1›AHF)³¥T‹ƒ:O¥iãì÷/Bƒkÿ2ïæR¶ÛŒ çî…)ðZB ¦1×’G*Å÷!À›ÊP¹ÿÚo¤;TKûQkˆ®à/KsIëŸèÇ ˆu#„2#¢ ôo€‰@¥©á„Çv~ÜŒYm7Ï_öû’“¥íhCQ¦A?ڌۡˆèÓøô4lDb“™§RTÆçqÆlI§V]’üq®¥Ê&ÏcycÞÛf`­¯•âÔí Sùò2?Úêï>"ÙHÊóª,*týËŽ›ä›± 3=|Ìâ‚<Í5Y¤ 1÷ f)Ø]Ý UM¦A”ZEDaÁPÓÔ”àLXk˜B‰.ûSk÷Rÿð»?2™Ã¸ÝŽÏÛçßÿ¸Gäà ¹–@91÷Žxž6r’<’߆‡¿ ½»êôˆéµÉÔ4eòÓžÀ4ƒ¾™Òÿ’ˆŒ,¤—÷ry¯ÔÀå›ÏÈþ¿{ŒyH»V2–¼öQ7yy¢}ú‘Dtu1+ yNSüzÅÚÕ°'²È•êHûoÛ×Wu¡[{…»bøìu®ÅÛ²2¹¿°¼”÷Ý×»×âw-œvÝÄ@×M,om9·€ˆ·Ñük}òòfìVà‚uúóµÎuµÎSü³ÌF ~¥êÑ•”3;âëí踢ƒûAÜöqŽÿã_ô5š?×~V|Ã]¦üå%­fÚÛÿgãðˆèʃã¶@nâªßl= ŸèÍÌrÜüåÌ û›Yaÿ½‰Îórò\¹Ó‹çx½!ºL7r©Ý}}¨Þ\—ã¶~ _I<]K\¼w®ÊÃûÅ:z=¨;¦ûøäì?yDöö2¹ÒP&÷Ç˳+á òzNp K»þÄAy‡JÃÃ>*g°#q ˜ÿ“èî(¡sìKZÞÕT4–» ¶ac/ t»G~¸Rñú_O0OâTìæäÓºÊÓAu¨ÇõG™¾-ÊÊïHm’órݹ®ÎùdÁi(²n |7î¹¢N®âDéð!wäJ/v¦7§Òú½‡)|–’Í>W›Xok½Ý’ÊâHÿN‡õ1v—·ê²Zé+.e-óË‹€¬¥±Þ8øûSà™60Ï]žŒÖZÄôVy5ÞlêäÚ=àÚ¿®Ç1Ø­€ï¿Õ0~ìÄf_í×+¦<t!¼×?¿ÔRHŠÙŸÿ¯ÿ—Íÿñÿ`“OË6ÏQvs̆ìTÅs8€¤ÖòåO¯ón¶œÒ—ÿ*iÞù2ïªÙ¦V—/2ïµzÀ‚ê®$ÕÁ2 ìHj  ›á‹”„²ëTe¢ š—‚ä„R0 "&óWîö:l¤Î·æ1 ѼQ_~âÓïŒÐRPh6zuz„PÔ"Qé@kEsjµfÚ99Ô5ùô\…dx§ZçÚâ+“ã¯ÛX“Þµôq¥àù%ï›ÇCb½¿s9¼«æô¬:YY]ûªà écñ·ñt×£{m-ýÂjÃ+¶¿CÀk0ÜlP˼TЍª@b.¦\"~ŠiŸ;.œ†.]Òv-ƒ@¨*¨4BÔá*4e 1¢µ•gÒ}[ÑJµM=š Ê‹êm.”äl• rÌ&¦ðˆêbD29© ×–ŠÖ’DT(Ê$BD)'AÀ»}*`#±9èª.>Þá]ï,E:P°„Xã}·Š‚tsZ.–¼–ºÔý4MÐ#'ÍÙRÒÍK)¥ÔÍÓFM·Ãáó\Ü …4ÒúÒÖ¢õK„GeE ÖdJnM ‡ÅÙTøM`÷¢Öˆ°Èœëª  v”ñi®¼’ bpÀ*¨mf½j"´ð´’¤ûˆ,CÊ£Ç@É Ðêp«ª-mœXÊø@_d‚Ö–Å0ék§õpêu…^çuè‹¿–R6›íf»Ïn¦– aûi޲ZÅr-Ñ x§}­Â!guE(áû×ÐRxÅTbN´WÅ OÀ"×Ó5²MuªÕÿáÇf_#Œ£s˜ÊŠl "x\™â×tžµrŸAÛg9ï#¦D¸€ñÎþÞR5žÐš®Ôþ*ø1ôý¦_Úp»\ó­Ñ Þè¸ý5¤{·4”¿óóåÚ¡áqg·Õö&ïú¶õ'|ÍœºMÛ½nãqªip· úõ7Ý&ø‹Î®_MÀ¯ `Á÷ë:ûpÀã‡æ·ƒüDÐì‰o|¼^u¥ü Eç3ÏÜPéèå]®ÝW{Þd*ßy"¬Ž¿R`!TŸz§ÛôC¦»oÂé—<ê~Ð7…w×7ù¤éºOê µsÀSo& nÈ«Ài®—häü„?–eezuuŠrÅl<°häý w×BŠ+Ã*u <Ðo´:­ïðl.©âýÿTôû±™\oáÀEËíã!&)É~M@®F‡rÓrlµqáuù òí GáZN§ :XQk°r”p¼ä²m­„v6>‡+²œ^E{ãÉ/ÊEPݼµ°«]¸‰»7{zËæ{椢 µÎ <¥¨)œ*hHÉ•2ŒîuúyG ¯_^ç©Nuge®»I…H÷ŠÝ{Ê$ð&vƒPC3j&„ R‚%„#*lD$0P&7pGæ fÈOQg”"–(¢iHe¶p¡Øæ“æÁ-/4SRÆç ªOÔd‚®ñîûÊ@ÊIEs‚ª×š›áIòüʲwµyØÀÙè3ö?à y@-(3¶Ï‹@ ºJZÛ„A X„Ó)’š˜’@Õ’¦ÄÚ€™'÷â>OÕ ›um ·?bØt1z JÖNRÎôâÕ½”¦ãJŸQ&”‚pb ,R2 Š˜HD5éV®Ñ0åĨÎÆ‡wB„J¸‚DPT¨! ¨l¢è­6 è¥zк×, ˜}1èÅK©:äT"  3eD%T‘#“‚‚AÅtE·dÓfƒ§ Í–D ‚Q6y›Žû·NÙ¦·ͦ•‹Ê@@eAt0…(B@AkcU[¤]š ‚%XÒ Ê>Ä`9ò†T/Ó< Ã5ÖR!pÒFIc®sì¾LË!ÀâUán ‰Fµï} °6šz•B¬WC±j”5ÃoeÐnYÇ¥tÑpê€KwnÅŒÎU¢Biìlô.ZExéý7K¯1è½äúì(Ñ:2@ÀK÷èc¥Ý±£=,,ûRʼ€‚r°X¨]uª?¯yHfC(,¥2ÍûRKñp˜š{Š?³rÜlÂIe-¬¥`a °ìŠ‹³Â‹³¸ˆZ2FJPáíÊEÐúHb‘ûWöÑnþ܇FŒe[eﺴ6ƒ^›l´æ¥ `ó'ÀAƒ Ï@óàäžµ¶ Jüìõ9©$›„OOãæÓæóç§q;ʰ~vŠÊ§l¥xÛÍu«"¯czý2=©¤ž__¦¨nŸ†2Güé%mD>?›ûʤšm;f1sý~çð¼añðb K!È9‹q óˆWs0Ù‹Z­hÕ¤vë°:ûãî§6E¥ˆÃR®­=<ˆÆþ¯5ªG£üG0âºå&sHLɆœÇqØ Ï¿ûáx ®Z&ÞP"ÇBñCs¢,!ÆÊjVÞ¹þªèˆï ó\Õá¹ZXEOr!Õø¾ë½ÚFp+ĺ&ör3¨üN¥‘¯ƒ™ÞU8fßj¿ùì ¬yÇw#öÃ3:¸?¨ÈÎ+þÏMó·  ?Wf×:ÒçÒø½`³”‡Õiåë&Ò}÷ÔK%åÇ×Òƒ€ËyÙ5Çù´kä —ñeFÈ-ÐíR¥çl?î_t ¬H}÷Ri^KmOá3®íåBy£2ö'—gt,ÞYÑ\((ø6T³÷¶(ÝÙô¾žtÿË—m¯6Ÿ–œ×©öÉ^Ç=œï ¼1ÉVý§í#¯ú«õž›öÔË#¿¥ÏðËþvEç?|p,?V۸߿ò¸ùü¥\äÁ·ùÁ©rzÖܼ¹ØšyÙ\yú‹{Y·‰Û Õ•œùª2³(ÏÐ[®›~zÏYk‰\-öžŽ×ùÊ»2JaõI—æŠ\{¢ƒ#—5‹Uuo¹‘Ó ßÑüd/Zõã¯Teä¥2yÿàv»ä Mõ~²­É­ ÇaäÚUÈ™xê©D‹\CX×ïëREG¥Ì–„ŸÜ ïƒãÄRrj©¶ˆKË#çàåZ:4F_ pÏwÆ6LrÚiÈ3ÕÌõ·7Ð0¾J%NòÃ…ÄU+1/·ï«gçè»*“—›ÈIýç2µ8 ääl²,#Õ…_Ví©wbÀ³æµ+Û9Ï·­ã•U/êºcû4ØåEž}Èä4®¼Üߺ£ U"È&¦y_듼z}ǧ!» or$Û*~÷ÃóÓfÈÏ£=>${Ò¾ŒÐ$êfrNšD†©¦4º¦ýfxJ‰V÷»òÃ?}ª^Ò[uJÒ™Aˆ‰i»¹ñy äM.sžG5¥;æÀ˜ÅƒÓÌ1 5Á(»¢Óœrš6ƒG$KTcˆ¨Eõ%°éÑ»%4j„ŠDB"¢êQkÔ%Èù‡Í§r‡ö¿§ßýpš—K¨:KÊå2DYÉèâkÈydrП%vû^yRpoaêÕ„í>]ãÍ_Âw|k»“}­ h©‡pýÀ¥9 ±[)®Y¯ÜÆM®LW1â[ú Ñkëgã³$c×LßB¥ÎUYo¡™·ô—n¥¾W“áëGvúÙ ¸<]e>.M×=“=q:戼†áÌóù4äÄÑ…•”åYÆw&ÕÖé*Á¹’?ɹüþÙä»äíð4%áš r`ô­…’ä„Å£x‹<€¶·¿ íݬ¿:©Î¯7å°ÏÖ˺´p¯^u‘°¬ÀÖ˜þá‰ð"y:ÌåÕ¨³õK%ØS¾?ïÓª.†ˆWùjÇÆ¬ãYït²è|q=ÿ—ﻉ!œ=Ò“Yu\=ÇÑ’(æ$¡\cC'Ú]‚ÃÑ}Be¼“A¨ßÃñ/kogHÜ5Ÿëî-«·q¾Íü0Àz딼º:îápK@÷>^qus>ûö‡Ü#4w(3]µ”xSOìÖ›O>gí®y¡íq6%Ná³Jô÷!:»Ò|ò|/¡¼Ó‰ñ6VsMŽï¬°½–°yÃ+ã]Ã{õâß\>—ç¾ÑõÜ¿ÐS ö÷tàÔôTëóâÿ6¿†’Ôê?+èV.1HÞ´Ãðb®OÕuÀ¢¸w÷1Þý¢®é:z.€¾¢0ËQ3ø»9?¶¯]}@w¾§‹Û?è<üÀ™}ŸFöWéøFUèî~  .£xq×ß¶áfU¬;Ól½½.'¼û[qß ýþà¡ðÐÄ^¬§ÇNˆèîç/îà¿ý÷?k²a H¦& D˜jxçZ‰L¨È<Íe_ OCÚ”?ÿßþïâUéQ §Z§¼dM¤p¯Õ5H H*œp[°N‡ÏHhXüŒ‚(Ž”1Œ‘·€"Ò¨t5MÆ*È[³¤MµŠ&%Å 5 `š‚ók±l$)ªVö>ýÛO•)œò&M¯AÔ42gÿòçà¥x¨"o0>ÒAö<"m&¶IႪ¢’¡CW–)gzí‰ç,‚ðZT"æ ¥`Übó¼ M²¤÷T…¨ÇzÚ×ZJØìØŒT-b€ü¼Û=™‹Ív dÚ•4¤2W«Sú¼Õí ¦b®L™Û‘^]DX©"ûi3“IQZ"1VVq$’5¨ÚÓ v,¥ÇéÚÿH…tº)Q=Š{õêñÏÛç´ÙèfH›QÇl9?ýîó_Ya.Ÿ*kxQëyk/g8ׇ‘o‘Ý×Ry0ß»jCwöº¤ì|+y‰7åàO³â[Š%ï½>’P<Þpƒçþm^ 1¯‘š>œª\÷x×°àÛLªw¤*ß7|«à¬€·*@÷K oÎÆ3ð÷tÕßš<§¼iök|ñ\R÷^ßµÊî¤Æ§kþè¯UÅì»Ò« ·ÖÅ#_¹cß…PÏø9òfóÜäœ3{@&ø×›uW£‘_¿èüŠs>ؾ~›}ü.k¿Î¡>»Nøðg " ‰çú¹yÈ×4òý(ß7(`mbz½ô,«V¹.IÏÅÞ‚pĉ‹±<ò„pD4pЍ¸;ƒþËÏšš4ÈZcf•@R‰Ò4—¤CSFRZ£uÖPS²ÏQþ·ÿ4ÎÅæR^'u¦Ñõ±Rkr:¥®‹‡I„ûnµàÉ™éÅAð§ýÍJ‰]¶‚K¿Îé÷Ÿýp*¬vÐ3^¶âå/õ¿ÿ÷¿¨ Á”stÑn@z©ðZ“ä¼›ERf­’ÅŽxýi·}Þþüÿøúë4Ìu÷R}â~ªoêO´!¥MêÈp\„l¼`U¨,Òÿ€;bÂäÐØOHä5ØÄBÃ4=ý« 4¿þÅçW¯Å5‰Xšg Q¡B³jV^݆dƒê¾úB™Y‡q%eeòF?ÿÁTl¿Ÿë<‡»¥ÙçZ¢’® œ1ÏHÃYûØzóDuX‚;²ŠWâ’ISI¢ªšYE —pE%y ’¢½F išöÅKx;lÀ¸…(¢¥ "'0°À(e:¶+öß0ºê ëjΰ£ç j¥)’! ¡°Yh awz@ ­„@F@T¤P‚}ó±¥?€ÖùÕ±2ä¦q@*ÁR%˜€œ5™•ð¨„"5IŠ Ì¨ Có‡F{[TÝ0¶×­…p„£Ihôm´Ü@4oÕÕ:hr!ù èŸë•@¡Ö4ŽhXbhJúµ3åS:# æ%Äd3njÔæ{;äœÔÂÅãÓ³öE4 ˃ÔOfƒa _wEÁ+kZz þ¾¸Ȳ]šôþ54Û[ŸÑÚ1ÚRkÜö¶ôM;…_Êã~ím}Ôú¹oQ ì ]ÿè]ìÀ†åø‹.šÔëõMzHúµÕ¹ßZ Jj›/q,—ähï‚E 03/®ªóTæ}Ài9×R»¤¼@@3™k•€ŽB¯ brÔN¨*»Ô4kHP ¶ û(PÑ}¼›EA+~œl®½ªw´›Õ¥N£ ~(µyu°nî?{oB‘,ÄĆ4dr2“1iI¦›œóàƒ`£2Œ xq49UàÙò?ÿ^ƒQݧ’r*SqòõË”‡ôúº4¦º/’s ×w³¦TŠÒJfÑBªhkQ4]ÖÎ0D@^w€òó6¶€Ì¹Qø«…:—h¦1KôlfŒha¢Ö¼©áÑB𨥲†Ï%ÜñÏŸ~LÛíøãó§?üž öªã%´¯Bzùƒçîé‰~8„Ûê9òWï_Ç“ý _"X Ö±ªôª¹\Ø®ëgr+'D™U,*< .Nˆ@7ÔÉ»\ÅA9ƒ+T‹à9‚ÛÇá">¸‡^G/@™S_âóÏ„VrˆŸ×xå*]GéGâç¥èðúÚÖ˜ì™úÄå/ÝÖÕ¥ÓØ•G:ÓI„Å[šH—’–L´´—<ñ>F~'éœÈ‘r•¿“nÜä·¬ÝU‚֥sҾɞjp/öÞÄQ¿¨Cÿ¤Ê¡ì)WfàJž²&÷ÉzlO†àv¢Çu£0Ïég¼zÏÃÂ.;o®"G¡K d-tмÔe¾Ÿú]gÿÓjw:qý_¯‘K´ç¬´q¿ïç¨é´žögNÂ͹k€ §~ÏçØÈ:O¶½æ0~#r“|×¥:)ë-꘱HW '# 90»‘ïóMxôòŸLo ìÜê;€Wë§zpá9‚qKþ^V•‚ó+•£¹œÜž3r¶q]ž8'ÂL'e¡{˜)nËþœ-õ"ÍÝ2Æ!A?Yý——p¶Ê.•sÖ»Xæ‚•®ø)¤õÍÐÿ¿iÑyœêìO=QåýòèÓ<yµ=ð·ãk\È>À²àå&ÈW÷ZËÅq#ÇxïVv5Z}¬àHãQõóÖD^ÅÇta¥+°.ñ½$½çiÈ fÜŒÁO3ÕŸä½y­=t¯€Î6ôNÖÜ@iÅ…—?ýäsUU5 z³æ¤"¥Vz€ÈI?ÛºŸ'/*jYÕ§éçÊÜ׺+ýÿóŸµø<‡UÚ<Ç4oÛ–ï! !cška ˜šG(A$O)Pƒ  ! H A”@^¸áAÈ Œl@¦×€zõÓ6óÌ/* ª‰fÛ¿TˆÔÉó ^ëÓïŸæ}ADA5!e÷SaÀ²@°ÿ ç‡mÉi/‚pÖ¡ °X^*Ä ,k eߥÕ)0•(¤ê°ÝÂÄ TŒÔê¨Ô¨ 4‰"„t³;GË´ŸÈZ÷sye™P †gŒOÐg7°•Å¢=ïäkŸ¡ /Ý4¸iÇ7F³æ¾ÎU»@¹ D"A ! ÁRB‚°À†(ºKÂáØ…BLh­¯¨¯/ µM4 AÊ"NfjI«‡—Pƒ dƒ–¨ ]Z h¼i¢â@¯8›7½öNðã™ßà{'*©)ÙX—§€ 3ßÕ:ÝzÄj€ö·©õ."  ØU³°¼îöã˜(‘5›YÅCa»—},'m¢¨Ôy¶,5H2 –Sžv$½9 °;[4ò¸õõßÝz¥KÖ4Z=ºðòÐ-1X»y@çé¾m²ÙëÂÊ?líýµ@sï9l>¶€þíÕJí>n¶`áXóÓ”2–»•e4ˆ½‰Pð _¾¥yÈRX:˜ $µœ6ûi†ªO%ÜEÁ(Ͳ¼ —©¨ +Á†¨ó¾.fƒ…WH¨jÞ už="|!t„º«ù¼LöâÙ‹Ý'@`† <…˪³ay. P ‡6£z÷@+È! â&aÌi!ɘ·ÃšéîvPS5 Ð2$gL`ÕÃ~÷³™„Ï¥bƒM“dÒ“nw¯ófÌ™²ƒ|þ§Ï5 ÉbW6?ˆ(5¨I<15 *ÁˆAŒ" ÒS²OO"fð—IžU‡ÄZl®sN>S1F˜)õ(CCÞ4êƒÁ¨î^ÝK¥ÉýOÿœ¶ãøéùù?Æi—çAÍùPÅîW/Üaæ“8àñ˜oE±»¢ÉÂ_€ûëfS¦üát‘°|„‚wG>W”I>ÈV¾ëœ |?48ïŠ]ß;&—¸O#íwZP^å‚ÜnŒ½FÙûv Ä“ÊÃaç_¢ïJrì8»ëuÊ |ö-ï‹É·ð¬; 1x€'{’¼kR=’}ë€ÀÃIÊ}ŒåÆÀòÁóƒÓ`ßËUŒøÚ¼y…÷%Ú?Œ-Ü€àßèÀ·‘þÿ«ïâ.¾j ÜYÂW›ØDä]HÒ·“ØZuß¡ý»Ä”åÖaŠ¿vÀßÙKŽ'ÞV°ßG´2–Šò7TÿwWì6¿*¸BàjÆ¡|·'ý¡ò"ë½ññaÝÔÃH–Á»_ï•s,ÿÈ÷ŽÛ¾c¢v{/þz§”ï—\ÞiGàWœ.ìæ—ä—·Ž»›Ù»`]À…õ©¿Å7Ú¼>à/æó4B¾éS½ˆ`ïôÛ/³siì9v ½üé§ée·{ݵ©„G$"2$=mëî’ñ²Ò^™h¿M g7.nÜÿ>&ÍõÁ€ƒú? ­:R0ŒˆVÇjM| Öº ¼Ï Y—z-D:ÚÞ:ÍÔºkn+Ä‘¿¨05"¿ôAéÚAÂÆttÖ=¨Ø…ññVÙšgýùÔ<ˆ,#P#¤‰ õúux©ÕCMDlžj­UÄT(Y@*¤Ö´f ÀÄ ÑB!ílÀðenøq¡‰÷‹Q¢êòfG(kD~À15)3ô¿ç¢tÒu¸Am—RÑqL¢©’-éi³±a°qsN›,jJRÒJŒØ;?J‡A" Õ+¥:IµADLÔ°¬ãv‚ÓTaªÿêÇ AKÚ:dµ”!çÝ~‰éu§fãóTMXLØU°èDh²†¶«r“+#Uw r¢ Dà ‚¤‡Ê’`“á%úîµ»![²Í?ý8lÇíŸ{¥š×àù#<ª+ œéBð÷ýºPõ9 VÆAHï³ç)\Þ"½q1kôÿ#õ»’Ø.ƒä3Tø #|ƒšu-B?»ûí×߉µwµÌ÷Ë8œD¨+»Ú¿ƒ•ù•:ËHC£Þ~í‡\çO—¯~®¢Ò·¶ß„Yq«ð]oý# Ußû²~‘óïRtþjˆr«‰á{Ko}åÚ¿†Ý'ßê½ê=~L>Ò±(£œïÄ 3z}…‡:€¤ƒÀËA¶_–¦€S[®“ÿ­d/ ®-0o0\V:0<-뮾æB ±q+O⤃Ðá‹Î†l{^ÇëH>º€Ëa°ú}v†óÁݸ‰Ž„>—Á;ïò;0í×.GÝå/$jd°î%á©ææjCó³Ö‡Ó²f]-æ ‹×´6Éøå"äàÿ‹—?ý4}ÙÕ¹$3{~ú²{Ñdªj P=ª—YQ=JѤ)kRIJ&McfDÝWýé/ƒÈnòZ¥Y²N¥3ƒSJIÉÆÙ¦ B!H@FT¤ ð1äŒx…*Ðf«ˆ&„JšfÉ™Ã&‹åi^kzR ƒKu§(!i›Ò Ä\Ëì)%€OŸm؈JÌ/»2M‚6®ó+‡mˆ•À°e/ˆ€äPfÄ XB ‘Õòv«yðI|o^ÕL𦿓hD)VK°8¨M[e.»×=#4P1l»¥p­ÕM×¾q× S¨‹·fûpœwH@™:C<¢ v“U { jîÐvTÒ c£ªªGTÒd—èRˆ´þ° …U¤ à 1!’In |CMr6©Ñ!=¡¤…ø¯Ð´b ŠP!¤„ÄB*÷¹“ljfi‚Dì½ Î£ úZkÁu;S›MÝ>w=Ÿ68ˆÞ€B]º%R§½Ô ÎÞQ〥a{õœ0>m0DÙ‡ŠB9¤<¤4Õ9‚ªšÌ<"ÜÅTAÛOSêtqª˜PLÆ1M/Þäæ»¸ürTsqÙ=Ô°èí@…Ô ¶ =ba² $ƒL{ä !Òâ” D ²7cÛÔ½”Åzë Œ^u©»´A64;h‰nùkÒû Zs€ê RêF áË'×…i3lüPá‹z•×Vˆy?·"„.» %e <M"¥Ì@Ofó\‘ú¦W<¢w|(…ÒzF‰f4ݬ‚PG`)"ͨ€ ]މ—ãûؤE2è`Ø]™m„%%u‚‡lsÞæœòèÙæQÓ6Ù8¤œ5gID¶•[Æd¢ÿöŸÝ=æšrª*b€—Š–ÍžMdb’ê¦j&4Ý>  RRrˆH*¥–â¬äÆ¥zP ÃàR¼5G;¤Aø RlÎ ‘V%C嬵5 @RµxTG¸Wáá ,©%ûwÿá?|þãï‰`sCÕçÉ…®4¥qTŠZd°¦ìa·œÇÙ—±éýh잟ñ}xPä¼|y+®„§LÃ3FêúÓŽÉÅb¿Èt°7ËÊü$·™ g ŒÓ˾Ô4x þ¸".tPѦú²ô Ÿ ¸Pxýqâ!®[heÇÜâ Ïy5°xú‹‡g}]áá°GË{bþeÎÔ«zcÃIºŠå¶È£“Ë©/éZžpÃV cTyþ ×Yyä«®“\9ñȾ1ÉÊ=®Å:YÕ´äZ™gQ@Â#Lì«“ð²6(·ãyÜ1ò=ƒQîwÃÜÎÖëë¾ÀÎYgÏ•¡ Ý{Œ{üßé¦ÄÓœú¸ž#JçOâ0÷zâq͹·}­y}î­§×IN°‹#Äc&'[ûJcu½w-/Çü C:èˆÈ•bá²±5ă7šÝÏ<.÷¼ðõœežij_äí3öž™vë}ï^“Æâj8èo€ õÜð\íÝÞ0—bÈ7®—Â8k„åâïÌZ̃²¬#ðêäyï€ÿˆÎãD+âlǸ*ÒxYɸ¤ðÞ&Ξ«ÝØáq«ÇèÁ™ÿá7_•·º/Pù±ÕzÒúEòúädX=ô´y_Ÿ9r-ê'd¯Õ°Ž˜Ø©§eX¹F1¾¦Ž¹'¬ \Fíï€n/h2—%9„ºË»ÃÄ‹€žðÊäùÖñò‰4<¯(ÚŸnßg—Œ •ãôSÀ«cröøàI";ß°>Ó¯|ãJážÓÑ•‘7Kˆ—Ì»Ìu¿ŠÚÃUÎövË7o óQœçŠ˜âqHÞÕÏudÁë;ެò“MxVj‰„œ-N2·óóâ]£{zÍ÷wEYÖ§§Ñªu¢É*_zÆp๱À$qe3<{´<£]ov%q&ØýôeÚíË4OÓ`­SrÎ9L9‹÷UŒeØ“jÌ ÜÿoÿÕç—IÃ~ÝÉT_^Ë@ŽÛ ˆˆiª5Z=A ©á­ÈŒPhBT„BÆ.tm4rgD‚ehUØ Š¡ÖT^ ³Ø€ð¢`~Î'ÝÕ’©©Ï®&i°a3„S’<ý û¿¼N_v^çñ©ãõIcØ^Äô6tÁËPÀ2¼Ë@í‚û‹(¼”}Xq")rN&&Œ.•jBkÐZ*ÃA÷Z£Ô˜Ëôê50$< дèõ¬]Ž|ªÐÒ&æ¬ôUUµR¼îaJ„°aÙ–„„ ‡óá]¦A¨‡ùHJD›FwD@¥ô2|ƒdeÔp‡n¾ ‘(:…  ’Š‘®œE²ÀÁJ@‘4èá¤<˜¦Äèϲ¤hˆ·8-ÐVE%;vÌ®ŸD¬![µïUvó€,p`ób]U °o HyÁÍ—ºHWCgÿA´ei7nmª÷ã&›©W¯Õ£"„ÛçJ¨H­³¼RXÞРѹTóFêŒ×/µÎ$¤Öª­È¬»¹uWÈB#—å?€a÷E˜èx>{¯Rtf}ãF'ÐÁ€)Äý—>æún–€öò@û¹1úNÍ!埊:Ó¿Aö"HÖ¥„¸8'·Ö€€ “£3è±87u¦øß¦zèˆ !̺h¾,"<ÂnµM`²»ŸkZg9›©iØäÙ+È”R)…Àð”1>§4(Lc÷* F$I)Ù<zŸbŽ^"jmȹÉù¢¾%pˆÔvbERT†Ä.WE@ÙKY‡CT’¥!''j ²IJã8ÔAÓfLCNƒÅ&«Zne¶d…"?>£¸L5 âIöÅ„¥ÈîÁ!ƒðÙE°}[ØNU…i™«‰Õâ¡”œž~øì^U%Sj™‡§-’U‚B"ÄjºHž1J@;h=ӾƘ`Ú¡‚&ƒAg ât †{T¯S·B($S5³lÿóÿú¿>ýî,ÒÕÁ‹}‡**¢‹”ä ¾w¦¡~툾£œ{ÿt?ÖõO3ëB±E×ü,ÏŸë0ß­€C¬¹¨Ë]ÍäÏ­ª>@ú»5n+‰ÞNÌåÌÜéfœsNC9ï8#äªzëû’Ø˳ˆñ,n<¡‰¬þíÜZë|±i»žöòŽœwÈ›MWÁ†Îá#J´k€àÜhá,°oôµ ÎÖ'ðDƒôÍ'uHn…—Ó‚×´ã?–¾›¡‰·H¯gp•£~9FêmÊ×UØÃC~¨ Að0Ëõ‘¡xûsN÷ë@6W>Gü} €\¯Oܱ&¸¨@.·û{ÑÕ ~ˆÓƒCú¨rb½r¬\T×¾öuP6gùÌý14ü=•³·/éÍ:ßÍL‘_“`ƯYtþr\ÕO»Ó€‡í ÞyôàoQõä;½ÒÄþíu¹™¼y³ŸAï+Ç ¾¡ö΢û#‹Dñ¾ÉïÛ™û·õúm¢ãe‚®w#þŽQòc˜|çÉÄ‹$û2UâQo¢ ÊÑKnÞMu.îUL“ŠeQ3Mªª TŸ5›(™SŠ‘uªA¯"Åçý~÷ónþ¯_4@JsyNŠÑ]ªóµšIPw1r€ðn ` ÉàCˆÙ$þ’!¶ $º0K<|ʃ?}"E‚š³Î;ÄäO¿3K¶ÿ)`š¶iúR£"*7£Õ×ÊðOE纛Êk™÷“W¯¥2NOä 0`Ö¹ÞÈ#æ ª:áåOØþ*²Au†HY£Z²ÙèÎ:¹PÔTMB<æÊI¯5fF ¢º—ê•u"*†jý&€3LP¤ÃŽP M4¯>'‘Í«îÁ,,7OÔº§à((ÄÙ$À Ã5AÂCȬ¢9y­µ©±«0"D)”d)B„s(¢!AQR€25!%’ ­–îC¥„Â6!~:\ BC¢•8(±ˆÕDPرãàZÀ™È"'ò€d0?‚ûíÝTØ[t؃H¦P‚¾à#KÿDèbM^Ü›/Pö®C•&6ÏešŠ)Æ9Y#IƒŠbªÅªDÐ¥$ND„B,ç*¥QàM¬†£ÉúKŸ„ð1@»`Q{sƒ¿[Ýâ¸óDQ*Ú³î4üÔÁú&ä„ÊÔ ~E»CoN0—¥6ÕZ`“åAÿƉ¨Â€CF76hBQºÁÐ|w# ìMëV¨àªõ“½ÐZ´)YÝÎZл4ÔàŽˆR'T† «é°Å*Ý‘6¿¬d–.¡ÿ˾‡U–´X6µÜNÖXªX”õuò$:/×ÌÃ5®~“˜o «P¯mq| ,th <é$½]Ü8“_¿ ‘+…_\ëTZ·öÜp«•K3™u÷òù¢¹r^í=¹ÚCÑòö¹!§\©uk¥\ôÕœ>î³Ùw®<=x©E{¹»]sÓâÍзô|3‰É@ž; ! Ô—Þà$PE6Œ@xôž×֦Ʀ¸…‰¨YΛaÃÁF4YIAñ¤ž$6ÕDÕ1XýCªµl~žrRŒil3$ªº+ÕšÌN­ÝSN–¬+øC4eQM99‘6cÚŒTm‹%z„ÈT«ªv‰@Á84t)P‘ƒ—)‰Å¦™ …šH¯Õg—VkØhs•‰hç‘å”7Ãÿþ?ý'¬ƒO ëˆm…ö N-¦-Á<ë#<ïÛ»ÞT¼F«{ µ.EàToäúË*\‘Sˆë²!€¨îå Ü$G=F9hå,WÓõþ–ʾˆœÅ´rhNèwÐÕ_²EgñÈš¼|Gãõ’w‹|zž,í‹·ÌÉä‚û}£\Uu.e(O”Izn$'aÛÙÀÞéu8›!gï¿JN_Kè9œþq™ŸZæ^“Y¦¹JúûxÛhOzþÜ ‰GöëñXf'3WÖéœàPˆ HȰr4¥Y Ë^®»w×kèÌå z·žZrñ>ÊTÿ0¸v–³¼‰Ý\Íq»ß›ÉÝWÜËÍÄêjjsÙdÃ+†W=ñÃÅ¥Ðklw^ÉvßŸå °pP ;jEž|ë:1?ɦ׋êD ç°QJ;Ëi·Ðõg*çLy¹ÌâMíýîkð.ß·îÉ’EoŒ‹¡Ú!ý\ äÞ‡ål=‚T¶µl¼jÀ{M¸ì øèÜuS?s5¿uŠÝâ¹ßR%ºc'~±è3»E'çgÂ!^â)óï]hò߇èüU½ï3Á¥CþªôÖý¯»\P*„Ë¥4âYgá´wÞTò¹zýoÖ ?^œ õw7%0­ƒŸCŠþFIº['€…ûVh½ÜعÆý/Ö¿²‚t*‹xŒéÐ}·‹[ÅzrŽ^`ÍWñ(Ø¿XïQn óQ~„+׿eç_[ŒâUí´b¹OàÖ“w­ÀV©Ü¢qt™uñŽ‹Ÿ_;øgý=Ý=·Ò=^ͦïïÚŽ×íÖgã¾ äísñ­™|<ƒOÛ·åTèDë:°ÎõΈcôŃ:ÊðòL0w¥•(r'XºŸrœU‰ô+^=ñ«> òðc¼•ðÝž»<§f ñµ¾ˆ!phs=䨆 ”07­&É êT‰¨µV¤œQv5 ‘7¨%L‹ ˾F©^•š¨Æ4 ¢b`¼ ÌÐÔEcÄÀ‚éõÄXÑ+,5&8l„ÃgºJfu¦4†W¯^çN÷}ãUy•Rc4ŒI̬rv(¢Â SÌÈõÆ@—9dv™;ÞʽÄ\¸ÌKDuËfib”ÈÊq+ªRY„°IÃKWìâ*l¢èªbºC%gqgÎbDñ fH@QB$@ÒL#`3eA挀X %R !Å€Pi`.…¡ŒCcAí¤oJ„@ÙúZ»}³öÅ¢ùÀ*˜½‰ÇÀ(-°„Ù‘†nåÚ<~eѸ·EÜFTaÑQxƒ¥E•ˆ}Ž5 [»ýN,‰À7y»wû‰µJÆ!m7[æiRKšD„^Ô§qðR“¥pè®Ìsô"ó\Z¼ÂyšžÞ¸óª¹˜ž¯rþ÷l¼òÞÉÑ&¥¤ùfh:Ì›H©Kô¤ è’ÿš.œ.¼võ¡ã1Õßè†Ìj°Å ­…¨° ” µtùþV¥_,ÊjçZÚ'³ VzB–ŠÅâ¸= ê& ›aðú2Ï›Ïã¸Íóä9 Äž??Å—@¸× …‰F"€~GPoÍ = ©¾5ÜGgÿ%̓[ö–§7|æ_yUš_®M• =­Vù·èË»£/¶l?&ùrù‹p;¸ø•ÓâÁ©møõ8šüw!:"÷Ⱥå7ðÞ©õÛëc¯ôàû:­ïn|ºW2åW £#o†\¿½Ú/þZÍGÝ'ô]EßiÓ?Úvw4¹”¸P†¡ Þýô¥¼îæý$yýÙ†¬¦ª€ªm6IÜïY}ûiS_wœwBµ¨Á …BrÈ£|¼ºï¦éå%öEKÍ ª¹ÆÌ˜uP˜HvÙÐÞ*Ð)w}›&F/„WTGÎo…Bs×`é^  BÌp¬ J&k„éáÌcJI¤Ö‰P±<`ÞÍQ«ë\ÌB–}@CS0pÇüò𝩢›ŠzÌÉ#è `†Z Ú)äQ(H "1ï÷ás^ML$ÕbI$‚î.LtŒŒAiB(û)&/ÌŽZ,:q{²@èe_QIIHÙtÐ0J­4SPw»ˆê–˜’– ‚êT·–´CUÕýÆB¦%k­5©ÕäQÄB D*ÅÃQÀki6 "’DÆ¡¸2rFr8B&jÂèâA C…tRבW9€,’ÄBHH u™”Í€uñõ=æî‚^èb9M„ç'DÀ ]:Æ2¬IÇT CÊ£Í^è!ÚŒt;.©+Á‹@Piª;*p`“ŠNû}xUƒˆ7]¦èÐéy³­¥xq¡ÔÙ¬ólÉÊ\ƒ‘(9¥yªW'ŠÏý †Ö aÄJ©é0C!ÐCÖÔ¼²+4!%À‡Ê ò3HÔuú·ëÒ[ÓþÞS¸Þ¯!ÇjŽÁÔ¾û&H¸/–x›í.{{ ÐKG—‹~ÑRiPAxßµZ/g#š¬×.êû—™ê¡¢Ó4…s|‡ÑÈJwOŸ·­iÁçH„„ˆÎÕ‘tžc»Ý„ §aò=%š5q²AÚöêPD°yFQÔ‚:3$EzF1DA °Š˜ *È`ˆˆÐTE¨ªf0m¦ºª"f–,ë0XªÙ\ÔD=™B ºù÷ÿÎ_fzÀÉMЧ\MX5SÖ}M}uIYQS˜º»Æ”Æ!™ „Ôh0°:j*"Éa¸RÊJ™[ææÍL¼5ܨ¨(-¢r(DÐD%Hóû­QçRæÕéÑgEƒ®TTÕ’¥1ÿ‡ÿôÏС¥åmñ$B *k&Ì7EÚµÏèá¿@Töî óÈMVÖ'×áõÒ+øà@þ2#󷚤©ê)QôŽAd¿+œ>m¨êÒ@²ð«QøíõÛë·×o¯ß^¿½þÆÂ†+ ‹üØçœ—ä/‚·³8á‘xï]Ö+†Ü¨ÿ-æìLK³xdmȹ1Ô!ÞXù]ék;þgÑ­%(|#ræBÛÀB¸?íwÂó~è§åòxe8 7E„ÄýqÑ/sNÃYq§pQä<´Ì®[µ¤³…®z?¡“µÈc_ 87tz«~Ö°{–Ž`ý«4þò§ÿ[:ƒ‹rÏNûŒSó€þ=æéwÅy7WWtpØÜärÜÏ».ýÓ±„éç·pf¿~mjʵ1¼Cr9üxÖ­I^ßk.-àÚnÖÎÞ§ÂMG­tsÛû‚Û~Ç‹«%ü7œ?Z—YÓS®fË5×Àÿ?{ÿÚåH’$¢"ªfî@dUõ gHN³÷Î,wïãÿÿ¥{ö\.É~Teàn¦ª÷ƒ™À@df=º§qzj2#€»¹=TEUDÖ Ö¥Ëë¤ÐW}káê»I9Ne.á."ùËŸÒ˜ó8@iÑ´$Ü]¨5lšéUJ™~z#T!9|§æ1½•ão˜JTÉR@W ?îäEl¦ÑÒà2FÞ 2Œ2@BÇþW'r†5W 4 ÌPKï#f‚|*TÂÌK™³EÀûO¹ ¸i-sÔŠ”à0+.9”H…PEû§Ô s ÌHª¡NÐ0€0ƒ¦.ÈãÞ‘Ó&ŠRˆ¡™ª8 fóÎH€nt?÷p?VDE5‘Ø]Xé(D…5 `òRïSÂ$‹xx­¡C ¨P3©ÅÚ2`†i¸SVdÕ©Ô+á¥Ð3Ä‹“Ù¢ZÔPê~#tžæ!«{RV9¾Mî1æùPEˆ˜j÷»ýnÿÓo¥ÔœÓ B£#¬Ö3Ó¼úiiü_Ä‘º¾žtÿa6RIJaAÎ[¡Æ9xjrOTèÐ÷'¬Òæî¸Ð-þo €fÝ»ò/ô8š‚“æOðæ°xJ“¡s8NLF4áâf!X_8-Bïö½Z鈀ÒŽx;QzhQ¢?³ø)DDwI(Ie:¾ÕÊœ3YU%æVò0fæa7’t i*ZK)s-‘̤ÊRãé>Ï}$(¨;"QèЫ’ê¨Ñ¹–˜3ÚÇfŠMQJQÍ)¨AQ!EØ('Ô *:³ÁóïŸÿøæ³MI„Tëõ‘R-ÙÓ\ œgÛ©Hñˆ€0%µ¬e®ÆŒ4X­…1‚¶·K¨n"ID›öTD¨EifPRD$i-劖ÛoÖÃÝÙB:+fó\¼XsùM*9%M‰©KàüáßþëËï¾ÛºN,º¾ZÁškÑš•©ÔŹÉSÙ îE¼ŠTÖŒù3xËë`¬Å÷–è†+ÍÐwóØnÙ¾"®›.G´ÎŠ6#‚5Ã26Ĉnƒ+>Ä}"{ìWqÑ>+Šr^’„߉¢Âη´ìøXå2ì}'e‹ˆ›f^>¥{ ¡§1ºÓÓ±²¼^õßIF.HÓ¸˜ù¸ÔËÚ@ÿOB_Wì­ÐT¨%ô,3.Rý­X÷ó¾-ZÝip½µ´¾×•Æ‹Åpsƒ—²¸åià‘fé#¬ä rg¨Æ—©Ó£ôóf9Ä\Ï=ýˆßBÜ]?‹æõ‚ù0ú‰ðQa¥ ~ÏiÄ›úÊjï$Ñ÷ÇbcB®t·°~ÙÜÁ.D¡¿ánð©V㊧Ļ®¦Ê [­=~ãÝ¡}†eu…–ܪ±mª­5Üøq(é‹×šn,€‹`é«0hü­‹Î?^àW×yO êñ=~hn,òZÈ1"Þ™3÷hO÷þ{\Ÿ¿÷nü&€Ø‡Ö°y0$¼ÚǬ»w.>0šÏZ…W"–kÈïÔ¸²ÇX‡ñq æ_úÊmoÎ E‹^!Oq¾\.q?^Ý-éoEé= ÓÇз¼°²žï% nŸ×Ì`¯t¬çôI„¿d‚X϶5ˆºpÆâ2ÙK2<ÕNÒ"±FJoÈíÙrFÞÝÜïÆ&©Ë4á‰þ½FJc-yñÏóé}ùF3”§Å|•«m§~g-=^d4‹8Ïcãøg*kŠæºÈÛ“y¥å¶6Þ»^”â®SÁÍ#ùA<}®l­ªw·È}œÅãc¡o‡÷¢ãÛ‰ù®ààƒ÷n°ì˯Þðè¸ß*}[Œõå/ÂëÙðÿŸþø—ù0¹;É¿üø§4攓¤D%A Ãm~›Ó¦J8‡CXùô²oÂ#6ÊÑæ£/;ÿ_$,g ·šsÉCBh©ÐB¨ @Â+zï¿Uˆtôß@»,I+œ¶¾ÓÖ”@ˆÚ[òE˜9iNyÈãhµÄñ€ACLopžÑb5 a>—&UëMm>e‚$ û†Ü$G¬ åç ê«H8¢ÀæÚ‚¨¥·™7ésMá3|žÃ‹ÐMm’뎃Á;A",p,Ýu`$LͲuÑЄZ[;Z À!ÍB‡|ÙÐ07I"+æámð«Wwä&Ö㩪æîŒHžwÜ¥ Èܦ°h”R‹c5åôÝw»ãáíÓžPÿñG3 —™­»Â† ÿLÀ‰PÀÙÄLà!†ù‚@:ÃqÞ ?‡Õ®ØcqÖ÷_ft§¿Ä"D ’CPV:9cãB é y@ÓÒçO) 9U+µ”¼ /*Póá*’SžË,x4<: ‡ã$I!®²—p”b9^,!^µFŒeÜuŠ·×c«¤«$:îu†{œì>¸Hu¼û$¾¿œÛ!+K”¥éÞŸSBàY>Š@™@ófuÐAvJ×¶jïj2÷ð^~vž,¤ËæyÀ@m‚ø I!¤ÅˆIÁîêŒãg4cg¶7ÖÎóÀbÜ.W€hU‚pÀû[¸¤›­ë¿éò›w†A#`n(¼:T¾ÿ‡ï"búcÒŽŠ4ä,DÄ4ÏAËãpœ« Õ|N¾ËãŒ#.„êî`† 0GÔ¾#5„$˰[/¾Ô‚¹`>r!Šr¤“£’YETD5gÍYrbÊP¥¨6™v¡;é¢5(4å$ºsîþËHh Ë É0€0 ÅXj²æ4ÌöùíûÁ’$²ariÜ ÁP-‘àƒæa7÷¤#krÂS™Í<%rîUC«$]L›Óoµ®$Cš{‚‚Ív†æÞ&ª›[5›‹W«Mø) 9¥œò~^v*ò‡ûßo¢…69o/ò)ï¿’å\u½ t‚E/R÷^z’‹³ÀZöË<æ9Ø[‰ ®5&Î…>Â8ÎÚ—«‹7éýe~¥DtécƸrc …O>a¼Ö£¾*0n?¾›¸ÒÕ]=›XƒÈ·IéC 0®nï~pá ÕÞw§Ž'5¤SYbë–×òœqÏõ*aŽE µýÛùN—òÀ£Þ·Ç±êº‰í²ëj—D ëœí~ýb3$¾‚®SÚ{ÎX›Oö€ç–ã’x‘Ú±'º¸ÐRÝÈ÷‰+à÷^ãÔÇÒÁÁCß¶s(6´¿¶âϦé{ÀЦáÇæJ_ýëým0VâÉqB,6ÄÊßÒ÷qdÞ4ÅsOê|KűÓê^t3¯÷¤óo>ÊC㽦¯{“Ÿê—Ŷ¡ù¯êH‹«Òlœ9dO}2o*qq¾º`nuÍž*ó÷Øg²ï{€æ¦:ñµŸxÜïù^‰÷޼©™м0\íŸDŠoP"àoHtþù²Ä-~ïqoþë=—ˆ‡×ïùØ<ù¶å™¯ü…wA­sðð£Òã^‹¸Ø’Þ“û¿@ù¡øà·ôâ© ÿr¸{kà)+¸·Ù=_œ:Ô›ÑÓ}oÕøH›A¯Y|ƒ2ö/³ŠÖÅ®«y~Y»嫸ãÛ­üoç‹õíK¯_÷Lã™g{ç@Âßêk£8xQMæe6‡¿¼Î¯+ÖfoÊ9 Y’ª4ðp šiq†#‚î⑇ŒpXIÃKåX„Ùÿïÿk÷)i­ /~˜`´ú›Y¡HÊÔdiˆ!E¡™)`9Téˆæ°ê‹™'U÷Ô ]‡€£Ö³ËAw - ¢*9tI¤Èð"+S-ÇÀ‹Ô9¬*hQSêÃÞêQ’ iHÓ[©sIÙËæHC—˜i]É@…hoEM •]çdëÔ’º§n-P^ë2µôÁwƒ»rKsz„—&nã8̨΢P‘Ú@j@ÈÝNVÂ%%&ÍVcž­V¡jšÜ_k¤ê 3YŠˆ{&RCœ•jÔV@03RÄC@¢ìÆÓd/ŸdÜåœxœ£f{IãnïELjÚÉÀpÓ2UªÐ †€c(éˆæêÜäà›Â~ðõde 3„Ánç†w馳Àªp’À Æ¹8 "º?s¡cgCÃIhBJbVœTgHè| ¨ҟ»ˆ‡[ (: C­µ¼úüVë® cDš!YæZàž^vƒJ™ëám.³%…ͳGe„ÍîfpëÊ'=Áiíù­÷¨Ñ½šã䬫F…¦¡xÀÊ2Ža³þQ>A_‚ïS]ÛG½<Ñå,bÿ6Q~š Ss†-Ü x­ѰÓÝoÁt@Ê}9ˆ/ ûËâm5<‰¥Ó 6¢ 6¾Çò€›À ö¶páxùnˆÀä³Ó5'¼}>4Åûßý‡ï¯Q1÷bµZùôý>€OŸösq–d69}xÉê¥Nµz—pZ‘­™šÑõûœ#×%ºkõ‚ _’xC_ð¹|%o.k{^Û·Ô '–$NÍÜpd:‰zâ,ö±’èYn¾tÃËø\kìÎmqÆNeˆÛÙòÇáÉÄøê€=?¯‡– «|ìÁ±Ç_ú_T6«¬7Ez¬Õ~Îï‹Uye`{¿¢øÑÀ»Žs|/àå-?ápÅ-nrইèþt·àÿ^ üèá]5©m}ã)éùÍ[gQ²ÞŠr.‡¬ì€l¡*qÑc“Ž5¢ŽešÝ ÀOÇŸò˜E›$Eká {ؘ0fÕ4 šŠƒ qcÌ8Úaz=Xõáe"j­ÕK™m>¢’ V¥¥Ñhˆi0d€yHfÆÅ˜±¹‰6¬³©7ÐÿÔÈl1ÃvòH‚hsUáºgJ B„ž##^ÜÌéÅó(’Õlž'Ô#†Ìåèa”ð@! mvž š:Tí"PœËšPš ì]ç­µË÷£Aí' BîÎ:9$úÿ²!Öìèé0A5¸#9à`y­J$bBÂYª%•ð¬Å]á#¡"”R„ÈI-”*V+áÒ®V›Æ:÷cð6’ª¢ša^æâf¤Ž™ÓÁ Ž!ÒŽ/ŸR~ÈŸfËiÐEÇÝ0¦\ŽÜœ±òüv€Wbv­L¡Mà]Â}Á©dQ˜‘.èÓÀVkâ>f C ‹3îÏ f—g‡÷6t80*$A &g?DFÓ`7xôƒts}|æRêlšäûHx¥;Í+àVçAr@s©%î¬ûݘ’ÂE % »¬]ŽÇ: 9ÄÍ\™’ÀKˆ$ÔÀJÅ¢ò_gÀ AWê?oËÒáudñ4îf¿è?§"˜/ jW­q–¿6ê¶xí6ˆ_;•©o]yß{!¼ÿ¤A³* ÂNÔïzJ­UÿÇÿÒØ6ÃÕå|‹Nnà‚ì# mÂG7jîFÐ~,Úúj#€5Ý0Ào?ÍAP”<¤Ýn¬¥ÔêóçŸ~RUÔ-öyÈ%TÕ#†![H±bðý~7ûÑjÔ¹V· ‹`È©xm;€a@qÌG¤š`ð^°Š¹@”yÀn¤ƒQ”"* ’$ç”sÚ ºRÔ/{ч@&›¿Kn•GQÅ1ET"¤ú”ä Hõ°F‚r·ïs!ááÂpöÎ ¬oÇZKÍ)IJµZ3þ ÕR«»‡…ˆ„JÆ4ep7+Ѽ‚›I6RR³EL̽íu"ÍÂxé} ÜŠY)µXÔêæ҇ݸûᓹÿã?ÿ' vãÈ«°‘<ãÓg Û³úO„ßéà½eU÷Õÿ®QÚ-r£!ñ6Š!6Ø»ïIÖ\F¹§®—Ëäóº)rŸ”¾nÕ†6ú —2?/n§S{OYÅZèóƒåÞÍ«–ƒs7ËA~6Ž+3¿+‚ù•(ÒTèËã·glN·Ûq[Ë»‹ÐO4~¾Ÿ·s­3Ô‡u—;û†ùM0…ãmþî½nñojðÒê6nS“F×yî£O >9yÖ3ùA"³Auú­bÇ›æ¨ß„èð42ßÓ\©/ßì¶Oê?9’Ï\m|ÓþHÜ‘ úÕêšO?“E-å® Új&ã2Øá»ú0Bo»¢ó—ð½Ö‡_eÛYßÊ=b ¾N^OS4®(ÂWüpÃ0ãJò,mn§L`…R¯ûù=6û\65³ã6f?_Aû2é†`'6ç xÍ®¹8M²Õ›·‰Oë‘ \Š®¨Á›qÏ2½$EØÍ N†|§;Y‰ûǺ­ü<Ž+vëbh›{F\þ·ž”R/'Ñõ÷aS¿fü­cº‡¼àµÍÃêFÁk gÒ㉾·‹l•:ðþÊ øÖ§Ù²íáš|J_¸RÖÁ¹ç-6¨@WdÖ{,¤{õ`#[ßHlÊ|Þj^nEðõ;Oí"ñ{À¶»Ÿ®¼SJ[ySM½CKçÍÁÅÚX)­?8VB†ç°è9Êá½QÚ|ˆ7ÙUM2nÕÄÎZ§ªà‚¨tžÐ‚q|þ_žG+ᯇÏiÌ’”"m¹ C›ɬª$}2+»q¦éíøùÇ·Ý.§—T¯üïVº×H¬8’Šâeþf É‘±H™„$¨†2 Mó;A6C@=ãìÖÔǤ÷ :Ô1Ɔ¸uÕÆ| Uj" ˆùx0ɹ¢½wüä‡?-0Œ`^„ûSGýÚnaÖ¥?ÐЀ„!* UäO˜(ÇåRgx9£ÕÐZtÝ–í¡t[Ô˜†‰ 1I09,àTº»@’åL ŽƒÎæ¥F¸óXHÕ!¡U˜SVI"ánÔ͵Vx†$:šÀŽBsÇ‚g+­~3…BΓï_ĆDx 4êàÄÑtô•´Ï2 “å]Æ>JޡɩYðݧ—ŸL«˜à¨õ R\ƒÖüœ[-Ä@GrB— ܉$hÓJò ÐßWgƒ®„€€fÕ ³¡G ë,1ðò²cÂa:¦$ãNg+BÉšÌk‚T ¥æ”œßæp£33bÕ¦©âS0T˜¦Cñy6³ØïÕªQ(ˆC9ZÄ0ŽTZx)5IÚc)µK"<<<° wGB-@…*BBµÏÔ /˜CÃØÒ _‰:#'¤ïáÖ]©E ­Ô¸uèœDÁñ'H+˺ѥã¾sU€@¨B‡¥ßQ¼»-·j!؉2mólÖó+ÒØé¨ÝI»Õ=‰®/Ô+ ÑyÍZ y ô6ï뮯÷æ’@iu4Hr¯MhÈÝ­„©EJ÷:Íõ»ïsRªè±ÝÃ=>}÷zÛïGGµ0Bê\…"´HH*ã.û\»-1O¨ò\Æè{«u)ü!#ªª«ê§¬šr )å4æ4 )§d¢N¤$ ¾@Ѓo“ ‚Bωz„ªÈ?ÿ>Ü}Ð"‘ Í£Ô)'5Vrª¦<+4ÍÅÃÝ!3Äów/"Ô¤q€Š•®·àTÌ∈”’»Ç"ç-*aP73³U4Ã@x/Ûô‚]x„[T·¹Ô¹F­hbV*y7î÷é?þþÇi€m ;Þ²ÖLà…H]«34èiD¹®¸NâÜ:Á³S·Ná%A¸Öl?O‹pæµþ ïÃË zç¯\ªPƉ.º©|x `ü2(oâ6ëž„«æ¬‰]ÓsÔz-ßü¾oAÀÛž÷UD·fÊǪc„+Yظ­"¬µ+O]§í6¡;GÚ–·×’>÷aÐX×-p¡Žy°]<©å9®#ä‡Hö:ƒ#›­<—St5Ñ.û£.cQ,fÜÁ‹Þ—3q}õ½õ>ÃGØS˜ÂGKWýC[ðßEÆ´ ü¿Í//9賕´Kƒ¨Ý#,†ÝàÅßÞ¦ˆ(Se ‹ô´¹b‡³ô”|â=,¢ š¡±,;±"¡˜4ˆB¥‚Ä8àíG¤Šœ{y ä¡+)µÃ½AçîöÀJGð-ºómë¬?I5^w8á<áz¯…£¹8,™o$’†ùu_¤HûXQ  a.sÂúa½xÓ_Œ ¼.. ÉËó5ÑŠKB1hJiŸAN‡ù»ï_(²Qðz<”y~ùîeÜ 8eÔüéew˜?›WÀÉAXøqšz1i±1P… {$˜£V¡ ÉT‹$A MY’èdPæ$9A5e¡Ê˜8‚)éO32à {P´×ßQÂþ•Z¬/:û§êj1ïPåe@JpˆÙh£¨ŠL)kp hjuM:•a²G46˜¦`.á)'6Cäê& ª˜;wï衪fÍ6&¸Gï¢ÿÕJõRQkÛE%ï‡ýï>ýçßÿ¡”ªä’œÜA†#D0(g°:NÊõ× èSÑ,¿":Y‚̸·NÇWEA->kÔx3bÙhæx|î_7iߨ^Ý—úú;ºÇXƒé·2ñ\z‚U7×&à¡GÕÓ)ÇWÂB”Žu•ã2—|’p)Eõn¾¸9åÏ—ð³¶Q?`ü Ñî5€ü²ý˜p;øñÑ¡øÍç cài]þo>»â7™¤ý¿pöºÁøÛÿM ô¯I¡îaÈó˜ð¥5Å_â ~3Ñùçåm à—ÔEüšoùißà|NOîFX>}·7³¿¼Yì ¤†ñ‡qàÛqJƒLsˆ$-^ë<ÍÕ}N/ßzUCÈø¢jÇé'å` *ÒŸP‹S‘ðÒµÚðž´ì»¾ÿ«°e[ie€ (Qµ %¡éB)¡÷’º·¶÷wÀç‹Ùœ•®ÌCÖbmþ©¦,`­æa zá L³{”!“‡/ ð4¤¾Ëñ0'M»]Ny†<—9‡„Çㄈ¤i·æãfšôeÜ•Ï3OêÿÍû½ûžiDA8dÀ°C­Ý†:%¨õˆ”Q/ßwµ}úê—@­  Dó‚ˆæ6QàÍ` Þíµ»Kœõ ߆Î+ÂÑõß—²„7îA?;7½üíÀôß÷nø|Š{bqi¦¶!¢¯ú¶ÖD C×;ê<@3ÆïÉ<¼MnNAÎLYÜê:0¹H¦d‚Qæy·sN)ë4Ý+€jVç™”1ï4ëÛôæÕa1©Å!ÐVŸhlŒ@¬Â‰a€Rn¾Í Mªi4ˆdI%S²FÒB$JS~JŠÙ8&NQ§"¡ØÿcþaŸþrœsy0U©ô>$=zäL¦¨nnû@-~,~(ŸÆHJŠj ÐÌ ’š·CôÖÖfZ¡I… RIº[{€ˆæ¥„û¢-ÄfÒÌyh]•ÉÍ­T+µ–Õнd’î†ýŸþËïÿ ‘š†ÕÁwò„í”´X ¼‹Ñ]òïnªqáfÊS3ÁÕ©…Vo™¸ÄýÏm_ÐM½©‰SÖqÓr{Á¸ÁêNê~OÉ,rU÷¿iX…¨üúÀò¶ï&¿¸ö|¾O<ž óžÀÖײ9ï`±Ê½žDíÑ•R¯"ø¥÷ûÝë\þ‰À¶Å—$í¼¢ðce÷µyò• Ð1è_öÞúòÍáËè»Éæ†_Nü-‰`¯‡ÝTñ…¹ÑoZýõÔÀ?r¤<šß´‚Øîÿüöxè3Ïåç¨üUNÒ­ˆióX¹ÄÄù=ž~vÏì3¿È âã p]øæûÀ(ðž‡ð- ·þIcE¬ëfçÉÆÿ53ìž4Ü£§¼²L¿]g¦¥&RÝîœÞ¾È]·"®=ây¾3?·’,ƒt+EKJs-ƒxJÖq‰GÁljâ|Ay[¾zV%"k‚@,êq6o ò ¸“«Ò /®ù:@àªãû±šäenv²=èw¹–ˆ{>¼7¤UŸ;íú·ç /¡éK­¦Þ¼*ð2 ºLqN&—e^þ:/ªS÷ú2n~õ‡ëÛ¿_ý¾e,Þ–•Ϋr»T³¡{[ÎYÛ¦IZâeÁåJ“[×wß@8£Ÿ)™\&¢²k>3hV¸Äù«oµAOfÄŠ#¿¶ö¾øé›E,†®pæÞž™¶Ÿÿøã|8Z5wŸê±‰ÿˆˆ,èÔZ³&a„û\³RöC™Ê§öaøÓÿø1ºÿ~˜üÓëçë€áûnú|T¾…óD¯H.¡÷×3!j0Áê¦òsãvà )PébtnSw‡4²›Q)^©Ù=HhÊ@]à"ãüãgaèë[-eVX!\,æaH”bšài€¤¾ÐÌ !†D&‰uŽpø VpB¸wW^^1AÁûÀgéšæê˜&Ô¦ÊÒï¸j"”Ð&bPíÒŒp0b., *ÌC(»!…i¨×#MÎx+u—tT¦“W0v/Z͈šàTèM¬Í3F‘fó„ôBŸÝLÀ‘ò’tO$«jF “qŸò0âà)ÕCI>ï²T+BÍŽŸöã.óOÇÙwP¸VÐ]Ó.¼Ž/ÃÁ«ª©Íj;E%P¦ðÒ}úÜ5XÑm{ƒ0À–@Z|‚ÑU”:hî]°+&͆!DÊöØ›è[é%í$  fùaGG$fa²©NóÑæ’@U g©^f¯³GB„”Ùë:°ÌS»ýáöÇRbßï^Â=gr9Í“[•¦,40¹†EJéø6×b¢Øók+hËl70:9ƒ0G-H;xi}Ö!€¤.¹Ó>¤Íä”– @éÂ;Úf>PË¢a¢šo%«¦>d†¥^Mà«‹c3`åìÝÝ•›cp³ÆR<èÑŽõeÒåÈ–“ƒÍ Øa[JæH˜ ÃÝ!t¹—åz¨(>£"’k–dȃ a(º3Ãñ<ìª×r,³©’BÉa·ßÕY,ìåÓþíø:MÇãñˆBÐ%Ì!’u¨¥6êæô„¡ b—áŽ!#ï‘C@fþNsÒDIY4Ñ“2%€¢pØÁRNl>ºæ8ÇÑ4}³àcr¡€ éâT-*åm.I#ISÊ0›GµTJJ9z‘Õ£˜39(’’½XЩß7J€Š˜‚«°ZU”Bq/¥®T*{HêÑ%mÜ V«³RÝ€¤”†”†üoÿÇkãÕ¬”ºHÕ -—s¼½˜V5zÈUùŸqÛ°Ä–g|/R±éè_´ÑÜ—^¹VÂ] b¬ûo¸…¹Š+NýÈçhð²Špb­>ìï8…dý«×Z9qÃ…XÍul¼ˆ¿Ç"?q¶÷Š;©øyøc3ü{ {/©>÷%]X{_õ‚ÜU9Øì¾‹¸«¾ò®TȉÕqêÈZ'>·ò;ë§}åŰþº+áãó[?å‡ÇÖH®]Ú¶…5V25+è~vÛÖõzÞnêJZ„ÜDï¶^Ý›ïX=¯•˜.€>d}­äsAª¹IŽq¼¾3—¸*m?Ä{oµáðÄS¹)Žël_"òs{g±¡VŠ/*¹½ß­¤ø¤ÑôP6äœ ]à à;ðÜ&á |…_É?¾ë[Xí^;ð×—+Pª ë=|r5…¶˜ó×þrø2V;ÀŠ…¹'…ø/øüÇo¹îŒx¼áoNË{²þ›‚æ÷”Ÿ¯ª›O‹ÀðòaŇêÏÐËq¶†<#p—ÄsTÝmÿvEçoèÕáu¸v ”Ç»¨àÍ—_Á\§ÿ¿«¾?´±ÌÓÛ1ȹ¤Œé"vmr«¤¥V e@…Wµ ­U¤j†°‰—{-h€ZÌéÏC` ëOÝP´{G¼(\áÞuB(½¹–TÆ>2©4Ô C7aóô:~:¨Š>ÊÑ`52”¨SÌ3ÈnyZÞjG‡5¡õk†¼"jøO&øŒ˜1aQ»9ªù¢8Od=–Ö /HrV@UéJ5 _“Eœ6¢ëÛdà ¨“#Ô À¡$£8*¢eö£QЇfÏ/¤ ÉrÀó¨b¬µ2»fh¢hòj²ó‚)rŒßAõ»‚„ºƒ‚ 2ä$Jå šb‡âµ£jxR@†RÃŒŸ¦’sÞï’&‘bCÀ‚»üÎÕê§Ý8¸ï†™ÙÛŽCÎûÄÙ‹Ç|¬)BÃ]ñò²3•·ÙSFhö©X”ZÜ5ñÓÞ=ê¡{ºv¿@ÂÅîÕ—RA+Ü›PG„×€5`c‹oOÊÝJZ „bÿiÁ<Á†h"Ió6ûÓOÇAE†ÑÅŠUTÂuØí’øá­LoµTÔ‚Ý.Q´êUˆ<BæZÜ=å4 ©V;f€“Õ4M/cÎY§YÍÜ3‡q<îæz¬oÓÁÅtXÎ_;S «Ã 9ƒ‚(½åÜ Ì@C_/uF†}_P"° ž ;ôÀCNªX7 #dqKn†4 ˆ¨0[øºÈ÷D ÑExÚÚ ïd…8—Ûaÿ¢fæÑûc¥W¢ô–‚†´=!Nç›B½[@K# ( àµàpÐÛðÛWçQöã ¡y—}6Ž“Ü ‡ãÁÃÆaLYeÀÌúéUUòŠ×R5Œ,¹Z÷b’Á›ý¸d@à€,.Ä- „{‘!i7p$‰dÑœD™è*A„‰…“š…5âhbÁƒá?þƒýî%H;šf9}Úiu‰€K€rœ"e”‘Z«Í“å:ÇwêÓŒ©r¢é¡ZàjÖÒÝ€æ¾á"J‘Z‹‡K TAb®–’ Yk wDx³ðÒÍNþ›hè¿×êÅj©nÖÜe˜rú—ý×Oÿð=c±u&)Ü¥Ô»ÓE¸@ÿqâ¿PÿÅ¿*¿¾hZ¡ÖÜ"È~$¨~àhw/(º(|]ª´ö*íñô-5ô!”·Ð.¥”÷™Ý[F©éè: ¿Q?À·v~ÚÐ4¸á. Ð݈ß 073ÏêxÜÞµ·óu à©®®3™/Idž_ƒ|.¹/z³1s>cÅeßob¡Ý¢+à›§‹c’QžÜòdþåaî¿v,î758¿e%¥çˇ1Š/ÜŸ~¹[;‘Ó¾òiü‰Î߻ΟµIâŠÀwÕÛ½>h®ˆ ½¤“'>R³¹ÇˆúèwèÅ­óýÓ|‰ÁÏG¯£bÞ ¬z+¶ÝÛcaŸE€Z7ç…¤Ìò›‹üJšgU?‹o6Q¡•_ü’wÇ›ç$r³°ö/®V‘Es‡ì*ß]éûÌ>ÔÆE]c¨XÑ„/#D¬¼–Î9KÏ×y¡s¹ÝÇ9HŒ5§¯è 7Ì™uØÊKîü“µnÄjâý‘[¦P׌’Ó´ Ü0;íúö yq.¬îŸ7é x³S\×Q.âã…wËc‘Ûƒí¶®~Ûwï|[3yZGÛùÀº?/n Cw’ÕÕÆêùssú}³h‘›õÂc_Kù¼Ãä}ÊóÊÔÎ}¹ãµêÂåÆìyÂC.¬(¸¨ÝÚ(þòÓ|œ¬T3+^šø Evàæ)'†3"%¡Žé0_'0†Œô2”ÿþ#¬”bDˆ8£²N^ˆ,¦&3"¥`° ¬˜U_°û¦7Hõð¦Ë®M G A€T6è©£rTM;Õ‘È^.T guÚd€aL^Vç׃×*Šù-Z˰Žpf@†$äŒrì÷­&‘÷°Úû¬ÛSJŠzÀô +]®Äf”" @£a‚‹\»4}µy—ÚODJˆÕ€ , Ò[°áÝúÕ‰$ïÞÂa"$<`gÀP‡Fa8SŒ;;K€aÀ)•¨&’†TÌ¡Jaª5t¨;ÈÜ!sfÝe@RÒ) 9AU¼‚^¦”"}Ÿ¥šîµûô&~R]1f*Ó¼{>›ß&WõˆYHŒA‡„©š‡Ks.Pwóz äVjbñÖ$ ÷#ɶz2ãäú ì—¿&é& M&Ð Ç#”¦vŽœ%%-S²¤¬µŠê La1èØ*Ÿ<"¤V¸ó»Oã« L$TªW«flómŽcܽ€>JòÙ_ëœRb¸^ß>[`¶*D„Qz›¼×ÞS.€¼ÉL2@ôLpPèÚS­âŽZ ¹7§7ó€h(y3ÕÈb¬ÅÂ7ÐUpÑüI#b„;¼Â­3Dá„ÈÙM³+#Ú4®`#÷ÔnÙ„¤Yéz7ö`t bk¢ÿ~®óŠv  Ü›»%ÐþL55­4¸uÃgQªŠ߬ˆÈø2„JåñpÈiØívÓt|{{Ýï_^>íÓë¡L/»DÖRË\JÐ(“yíT$l½hE¨‡BÀ„s©9«$HÑÆªR¡Rñ¹ˆº§6|œÍ²ªŽ„áN9ÍÂü6ë«™j|¿J5O6 ’@qf0‹SÒ¤¡{ì\E%0Ï%"ÒnÀšâB û1â8™ˆÎÕ¢y©‹€tDÒìn¤#›¶CÜI‰°h?õp³ZÍ«…™•æ!¤¤ôŸÿð‡<»ï?±ù¯Ä‘ò¢&NìÞ%º> ÙðÚ_B,ôpÜ{ÀEA0zÊ>u ~ÜüÂ…ZË»©ì:Sp÷>BWg6êZšåQŽ“¬Ð¹æÂÿ¨Gk¹¤8»žž‚œXǾ—aì"ÞïA0íÈ'œÓî€lÐ&¾"yŽØ|‰±6ä"/u“îOWz<壒Ê]ºëÅ×Ýøe1`›¤¿¡½øDÛ_lU,îo_woúŠ>~«°È÷{]øØtä&j?-û/­–_1¶˜Jó4×RÝÃ=4¥”Rª"QÊü6 ƒ&U/sNÕê\SÒ:Í< Zª×?þéõ§Ÿ|žæiê4‡W÷/ô¹@¬F Ϧ;o."ôØ}»ïáI€ÃÚ­ç “KeŠÒ|O §Ftá0ƒÙk Ï" Bшk¨ª‡Íoá^f˜×yŠ:•D-pëÊñ~ò-(wš1¦9dxDÊ@ à7˜u 5ÕàŽh&M_¾¯ÖŹtö"@ؼœ`3?h7nÝ 8Ž!Bd "ÂÐ`ãsrHà ‚MT¥æC¥D©î,y’¤Ãìc8˜J8œ)åߥaÇ<º1\Á¤‘Bs¨É)YUS^”˜|š~ôY9WG&‰ã4ÏæÅ? /Y5é¡X΢YΤ€×ZìH›'fÕ$L@ ˜»‡èÔ(G¢€£y‹zíN³ P açCôö\ÄÚbJì:ª½¢`:è.€ÒÍJЪ×R¬²–*DõêÍSÝíÇ<Àf$… æZAÔ©Ja—“¦ê%" §¶(|;Ìá¶Ù›ÇcIÔp¸Uw $f±â! $™U·®›o‹€„d±ž¶€$#ÂPÓRmjû†Â¸0iاY‡Åt€['°ëÖ÷R‘¦ŒÔ‘}+íÎÃn¨@ Hî~œ¡ÔŠ2!+$`ͶAºj³W¾ÚZ€w‹`_šš«ì,~ÕM} DáÐÞæ¯ Òtÿ›#ì¢ñy€y{;›,êðIosæœ*f>Oõ‡؉’D±¢IrŒ‡·Ã_~üÉÌó )kTw‡fÉ»¡j`¡,t‘" ‘ ÉšeÃÕÝ„E›•¢*Y% ’Τ¦ôA‘Ó ¢1Ènü”TG ûqš…òý8»‡¨½Õ„0ÕªÁ€e!aTs¯â(zœ-PJ•<è˜9æA’…›÷r)Q5Í¥¶£E@§ˆ°mMµš{¸I‰³ I5«€»yÓ6ñjVÍæjÕ¼û$ýÏøßò~xùÝwýqždëô—“Í/!ÏÄÄ…KÖâp*MâB¹Ò‹‡Ü:¡¸J,ïiÂÞ ®*W0:®ZƒâRQó"2¹ ’Ÿk›•)±j¶¸ÛoK8¸¯ÖÈæ—“[clUa¾¼OîN†¹îzO››—]uø&ÁûÕt"éî²àÄmÉðJßó½»½ÁI®´¼7ñôçßùÜ#ÕÛÇí8çT0nÎSÉû×3.ÙAÏfX÷ ë¾T^Ú˜ÛW@Ï)¿ŒèÖ=Mó{è3ðÐÓ €¯íð½²:y^âÛ6¹óŽuÜoùõà™hp6=ïâœô3 _>y¾ú÷?ä‚óÄIý…%ЧSýkO'ïw…É}I_ùߘèü·W_ÆùûûëôJߪ>b~1ûõ.6kO¥«ýsEOˆŸô ô`Þ»ñÀ]Lvkž¯åƒðuÊqWœ€çŸÔÕ¹Eà¯Xu«C½]&¾ÍçñVÞñkvÕ¯§½Ý¯Ý|ð+¾¥dPü }¨ðb~|-sqo¸å4$¥!hͲ!D-Õ8¨ @ÿüçÏÓá0í/úüŸþËüôÃw?ýßÿ—F9N3QE<*•TMÁ°Ýhˆ¨€JJZÆ]Ô‚Ãg ŠJolï”ì›gkœ· z0‘I1÷02uT*"Q“hVM@6kû“yçcñR¼z”аðÙĨµ‹x´¦T›ª°€Í`Ó+ªÁ Q!4J·Þ&Òæjé*.Ð`kQˆ€D#+HWª©0Áìðhjwm¾µ'w(D8"(˜="°Ë° [… K €T C)‹Žù0RPBj “: )ÃÞ™*ÒN¹'’` sX¶PQ:,ŒirÒ€@…uá%Õ*Á4d¯eÿ2h©ÇCñZwƒæHŸ¥”R„ƒs€3 tsî²Qk †0¢IZUÝìp8xTÐp8*Iw†˜r®©0àl3)®1.[­Ì…_ ƒæ¢h2(ͳÍA©ƒ Òý6#ª “™Ê§Jž'Oy° s1+5åA²“YÑLD”yf"ا9ìtšjD‰R=G0äüÝË>‰š[À뛩@DrJeª>¹¸ 9¿½Õ¨¯‘Ø1îSƒ?>à HÌ ¹«ât”½%?NsR ‚R@ ïúhˆtk Y®¼t•d° d1w`t+78{'¾; c‡þs“ ÀàMMhÑ sX7n›´G¿»Nil¸?!@‚$¨‚ÎfTPDÕ¼‰n±@›çúi÷ ‘ºvÜA“s‚îÇ(µ˜Uo¬«a‡7£¢˜×p ¬ø1Ž}†Y÷ %¡*THNÃþ{Ýíçi‚CÜ\²ˆ©¸  4Q ‚~¬IRkâ¾O @wßÁáCнj)”¬:fÇT°¨*u—SEŒÙEP ¯ó1B‡lªAFr…¤0AEÄÝg¨ ®¤™‘„"bîµT0ªU³î+d7›ñf ÐÿÝôßKµEó¤æô/ÿú¯ßÿÓï.\—Îh‚?‚Péœ×§c—ëÀ:  •(n4n1¬Ç@÷5Íã½î™ŽÎó‰¼á×À‰~vnûoÃUËöχº¶cˆK{ODÛg ¼¶=âgP¾|—ûò¸Q÷žˆÖ¯",½hëó#a1¿èqÜ&¸X9ý¾¿ªŽé/üD¾M>ø÷׃•ßjÇû»´Ò·‚GþÆ&Æoá¦~ƒ…¥Tª/ø.~­¸ôûóž|âÆOž O 7š(±A[k€“y‰ÕõÜù²Dï÷TïúWl¾Ë¯¸A³O=õ«¤Ó¿ôP¬îç½à¼Elö)œ©mË5G¯ÜerÅ%ëh´ÀË75ôï‚øº {à"¥ZYÑoUâšP°60»ÜÉkUœ8».\Á…æÒVºu?»¶g¸¢ ÅéKãZÔh%htã w›=žX\·R3[!$×¢ëW?aœýŸ–¾ÞyÇø4 §›—.î›ÎK›]Q›.»ëÍâùgcgY=Úëgwînº8ŒpŸFsÝ3‡ #-¹/ëÞ¤ëôþz»ØÜÊVÜ•Õ àõÎs^Âwɳk=ØÍýýοø¸Ôì:ˆbc/ÛÍI>,äiRÖZÌÌÃá¡I“R•° ³¦œ0f±©¨aÓ1æ·c9ÖâðaL:ªþ¬´œ0䘦8Ë0ðåSê~L.RĹ‚ô¨T_Y’¦Þüž!ý¦D Aƒ8ÉAÀc¸8’ˆCI!‘Dr™«×€Èô6i"0Ç\êôêÕ›h¼&Xº‘€ Ä1VQŽ .nþˆ(hˆèL…^ðÎÀâ\zª[ˆ"-JëŒ3¬ïôN0*‚H€8ÜáAD´îo8O4‚P€Äá”Ð,{£¹ NU““0«PC6¯`èšã4ˆ‹*¹ÝE% NR)΃‡ ¬TBÓn DDÀLàÕ!€¹!œªo¯S3 Tp„åæð)Ì*¥º+Ìm*“[J’“kÉ‚Rfó]ÜŽ¨.®‚‘bŒ¨³»­vÄÜdg°¾…`ÝA¶ÿù4ïµÈ;À­©kµ·Fxj…$Ð9eJ Ÿ^öÃn_æJ—:UU1 Xj`æCUÄÌ cò@ÎÉÂÌM•Vá9ªJ±¤PIs)VmÕ¤¢ÓarqÏY›ÆRª»Càðc™b@Š!*h:÷6aÔŠœsàÛ\rxEë­SïÃn©aPm%%Ô‚„BÞ&¶õ%  ‚CäiØv’jPÀ‘ ð‚êHc—J¤)M0ƒK·°¬÷º¥°;Tû†#–€ËÙ i| `BÑ;ñÙŒ?½ì x}=@¡‰"be¶ðÉÞt Q­Öfa7bÕTw7Ë)'ÇC™ªª$Í¥–ˆ~ÀXéÕ…¶NU©ìR…v”¢Ædp‡„BdH))¥™P µ:|—ó@€ÐœªYŒßù'•×*hYHÊØ æJ1û4–¬Ö\G¼àîH‰?¼ ”¾¥Ï@Þ17"(ôjáJš‰¦+'*Bî²&ñpšQ@Të Ì—"@³Š1óêÍ@ÈÿðŸŸÇaØû¾;;›G/¥Ç*Òºþ5›s°{ ìgû¿œÀ.%Ô-Ko[VÏ¿|ê6‰àJ=o ñ·¤É×0èmSù:FЏŽiÔïBg2–,ãÔ”‘ÄJêE‚s¯ž2Ž>¸WÑê¶ À¥®:—q)ƒsK±Ð{¥Ãy£%rÛhrt=Ÿpž%%?‚%Þtw]{›*ë,`Õª´¡ðpOà «ïXù¯Ÿ/òÞK \c^LF¬aE|‰Ø·°›ÜÓTÁu^w%[´Œ/’>ÆÜy sÍžnpkŽáÄuYgr]Ow¥œ»VåZ>ˆ·7>‚WN…•Ð:y=Çû‹Òí))Yóѹõ™'¹-ࡹî&`÷PÒ÷Ä¿êz W³–È¸Ç XR½‹½ê”ïÆV ¤›êÅ·A*¯g.Ôºx“­ß,ðÇŠp©ÝÑãJ¿ëC˜Þ6³Å»ºò–fH7ð’Õ‰‡Ûóãpä»àãêâÝ û(|;€W=W<³Ûxà]§“Ë¥}uÐ<«¥þØŠà*h¹³”ð͆ÐàÃ+Cà§¢óŸæ-It³p¾ ¬m¦W4Ä[Û'÷x~&·W³¹±íÞ/l®‚;ÈX¼»òž#ü9,>ƒokËt{³+Ví9ŒŽXCŽ›Õõµ Vðß•–Nœ‚àk úô®|n¿`µùÆÆöµVåàm̽Ú×qâ\†Igþ}øÃç}\¥çy^ªÒ¯ª%K­c½i^É2Þn?ñ͹øÌ,ÿðò˜p›MðþTLZ}ܾW »Ð¿Ý¸í»5÷›í~c~Áhm2¾²Ê½²ÝÌ宲ˆÕ­Ä3u×XW©¸ñãÒ^ïáŒºÛÆtg6-lzl—I6#×Sêr?Ì»(¯ö«Ådâ´6 ¸1Çâìr=Þ±5º^-ÜÃü c•,ô€p3+ÕI3“Àðé%@E訦r,Ç?þOá”3Þ­™Y“>¯ÕSÚï(IèU1—ÇCÚí Œ@+{Ò¦`®²ü™Ñ oD1U݆¨V"B6›Q Ò¦”%ǰ߫¦ã_~t+6½Y)VªU@!Zºæx}3 *lˆq\Z­õ¼Ï Â­Ë¬7Mö¶É«vôA{wv«´Š‹UØr_,å«›™*‰pP¬%ÀXLSÙýšY«,½Ò˜M H‰!  lt*èΰ FõB €yÐa'Å  1¥0;Ó@¤hšD¢ §œœá¦"Bq+%¥:ÜLV›S´*È.ù~hÜXˆ‚0ÇlÕÝÇœÇA¦i¦×QYÂ…pe š*ëTÝ'÷šá5Pª™ R;ÓÂ+Ì X…Ä22 UÂ/7€Ö>ž›5ë©\ºèÆPÎu1w$ÊnÌîæáŸ?¨"1íl†ŒJÀI²@E©IݬšÕ!žj)r®aš¢"ùt¬QÂHU‹Á:ÕC™ê<çQsNÞJ<”œÒ<7­„Áà„ö¹JŽj@“EZ¦Ž®äa0…,¥ .‚ÀMÀ("P+ H ,Ü‚öÞ„@ºYš8U °³…u< Da™˜+&€3Ü)Â`ˆP³X©"péB=¨ÁK+…ƒÚõ²zi!í-è|…^ÆI`î¼ &¸/wnGœF¸cÜÃÑh42êNBS¢¤ Ç˜FËäp¯uÖA’""¦:ñþñÿô—?¡*BJŽSqw)'*h566BŒºäPQI*)¤˜”cQj ’TD…*š$¹à´vE¨Óf.Å>í~À…ßa*æ9é R€Á@š«쇀U„¢!:¥Íj&B‘vÆäÝ”7«l…âˆXUBif¼ÕK€¨UR´3@8‰¬¹”â  pÌÕª¹™›·ÿFAMúOÿò_†—ñåwß³ë´5±¶X€þ~ðÅ©n½–,¹8øþï: \ø8Ÿƒq)d~ú]^Uò×å×]ýø àZqòÙ åT‰)Óv2qý–¸Ñœ[ ®µŒî¤*÷²»xBJå^¸ºúð{r+¥ò®Z.ïÜðǺR¶.)îAf1š¹É¥F%Ûßà"ÆÞ’^Z5÷œP†+µªM¿°Ë;ä†uÙc·Öw­°ã±£Þcür³oèèzwþÇå¶ÞÆ“ÃÈ*1áûSºd¼Ò͸^æqZòT¼—Ó~|(~éYúÑ"ÙóÊäV¹_ÞR‰2N ï tâçÞ@þDçùÛ¬ñÔ…âµãæ½ües~¥õcXw½›ÙÏñ}]<µ“}O_qãל~R¿k†µ‰I!šƒÜß§ïß_ýúé:BŒ3Ãèðã«ÍÅÍ!IT$+E¤¾Õ@ìvC©ÕkÍy„„j 0<’ º£?À×_m~=¾Dâ哎Ÿd>ÄnpÇ1¿½áÕÒn—U4‡¡’U³µ~8¯@¦ÞöeMÈÝÒ‘M[?dAöÂ°Ž£ µ«Ã[@C“Ú\ËÌ4èOÿãÍŸ_ÝJ”¹ÎnaˆÒaýZ:€È o þ„¡ ñKZzó®š7iKÛV¡ ²à"½*, µT$EVP¼+þ»KÙ úlê(«¨Ž 5Bädv ¶OŽîŒêìe2bˆ€ ÈÉ€(NIB I±J=~6˜$'JÃfÐ)YD.‰’ÒBG3'œªa5s«´póÓÄ(¥F¤Q#ªG%êgªŽSM‡R3áIÜk(õû——,¯Çã4Ï’ ¢êLˆ·©xø0ê/û?ÿéOåXàžµ·“aM©°ÆÕÐ.-~:¶ìÎYÐc¨9A†®<Óë÷Þùx¢ø<Ùî%˜ŽŠâÓïÆZâøêV«UŸ¬CÎYkµy.yL€Å´*%åd³Ãaó\(Ä@„û0>Mu.9ç”Ä*£ÍNS3óR+è*[:ßÂàs¯~¹w”¼ã£h¾ˆ˜ºˆ¿|@X—ËfˆBc©£D'¦ÄŒ @à¥Ïa—³gµÂú[¬õm+{F´«ôp41Lj "eh’,‘+æ©2P: ;b@ ô•˜{­«»d®ÝD…Ž‹tÃT˜A2ôšA 4ÞG ¨.„ŠÀhaÓ4×jóTÂ…)ƒœ4g«NaE%¹ûn?gMÊÐÙìõõÇZ*‰!ÓapŸÒÆ×ù à’¡5 *–9é>¥BÊ$9Ä)ÉDÀ¥0œ>{„Ï^ƨ{8ê¡‹í†Å‰œâwŸT•1aˆÔQÒìR-(–Ô«™Â»ä6ÒdØ !ìðª$êT@‰ð=‚„›{xn[’°U†·âo¯‡«H¸Y-±ôû3"â_½Aÿ§tETþáŸÿÓð²ûî?üNº½É…ÖeGüOü³úŸdWMñ®âyÛéå+y¾Gàqœ¿‰/~ît§ÞÏKªþ½ÖÖ‘8õßþnÓ=È ýKıÞkû…vºŸ žá½Wøûëﯿ¿þþúûë·zÞù·6ñþÀ·ÿfOŠ fÕ†´þ]6™Ø å>ø”¾|ÙºyárÆ­sçükmÄ–«ÑZ~ý?ã{‰OùÜf\$?ܰ»Ž*—1ŠSWªaø\QáÂWXu9µë8ñnÏ”Õ5w ]çY†hiO^Ú–±ápütïÿm&önöÄ ܧŠudÏý?—5w˜Ô8É÷ÜݬÜh%]•ì·Û­/¿kGƒ§l+îÙ[Ýûµ§ûÔ¶Ÿæ‡r¤›+Œ«~þÍV¸øÈ´¹… nÈïëh}a§í岉ì‚ʳVñz°¨×ÏêvLÓfu)«¾¢åO\Ì©íB,rm€­T³ò¹fŠRÊvI©š$Ì0$MbË<Õ©ä!OÇâ?¼N~üq9}áóÿ˜³ª0íwV¦}‰!ï?ð ,É ÎWò5åÖ+i±m £ÕÄ4‚W·²Jj ­MŒŽ:»›&ùE Õ¦jó4ý¥À Q­ÔZÜjGí£¢ðÒ±ø“<³¸ eaÅ`‹Bºõ–T‚<œÅÓÃ"%øâLëM¼eùüðÞ Þ…ZÝ" „ÁÐfà"œFëÂîÏ'z'ûЙ"„Dõn•¦ÒxZ0,*( s$È°Š‰3ÃŽ’‚BÒ‡“ô5Ü@dØy«”„«ŠÒæ=R0ªÍG„KÀŽ%ÂŒô1å‰Áb6ääÕ‹Ê‹ˆ¨Å¬’¸+`V‹ ‚!j™)æéP~,åà^a¥¦Í]%¦ÎgÁ:%p ,ˆ¿/KCVËÃI¡ lÕ émóNˆt}ü6õ<êZ-uМ²ä!YñišUN÷PQ2¢1’®¢8æTæê°Ãá­]O©†”wñ©LQaÞÌjý¢€ÏÞÊœ_ލ€Á ‚PØ ¼‚Ù ¨™ŠZ»+5a°Lˆ’€€ oZ9Úíeé‰$!ÍŒZÚh,ˆE`ªSgˆ:A”YÇ,JQQ—a—4Yá³ ZŒÔî=Œ pü ³Î¡€uiÁm éöÂm±8 *$C4u èÍýw·ðð¶ÖÒ(ûq¬Ló)L*ðs·:Yª9%Û{Q=LS  þz|=Ö9QÂk“*Óæ…†rœ³Á P[µB($©¨RS¢ì3!(ÍŠ;àº8†0è– ¬Öœp_öÿaø^”"ŽšÝ=°ñýÞJˆ j±ã¨ ´$.*S­L ‹ÚKnö¼ î‡[« CŠ@­µUtDH(‚µ UUÕ½VkgDk‰uw†ƒR‹™-Ü-joùoá(•ßýóÒ!¥œö?|w‹)ÇeÙ9"Öz¸:´.N5Þ9ôN*‡‹š~·’¾äìßD½ça‹x/…»!s“ p%ˆ€w”¿ãÒ7ë¬tÃ׿VÍìGz|IGÞ©ûx-zÉï^‡q€òVþæÄ­@»Kª>õ[¤é¾ÀU¨ö¸ëöÊáð&|6nÜï´1¶tõª°ð\â¬ÂÇÝïkRÈó×Rëø3nfÝy¶?#dñŽ ÀÂÇçzÜŒ§†Þß @ü·i׊¾—W¾$ß'aÒ $þ¼êqCþ¤Uu¡ÿ»ªK®™WšÃçM0pž!ßÜY î¾ûÉkóê'3ñ'sÀå3?"ÛuUæ½0‚¾X«äñÍ~esñ&‚qÛþîÅßWNã3¬²/®ÅÆQ'âr‰Å'Åíò—âv|Ám.É'×é­W妖ί^~ŒôüM‹Î_ÆIÏ Ô ,žr7„µ7‰ïÂkë·Á£yÓûzÛö« a{C#!óëØ»%»ä©p¦.e˜ÇXÛö]ÝkûÄØt4Z\ø>8D¼#Zë˜ïún¯% ·ÎÚ5lWPà ï_Ù,÷:•¬´—ªørBdZÂ¥—ñ9mòtHóT/`²˜wºµîÉ ¾ëö!Š‹œñº2÷“³•"$·ø þ¿ÒùáýŒáþ¢^7­çÅ¥þ;¯FùÁÎrGÀëúc7…ÿîi1mî½ñцrùg9ñîWštO`å±½…­n›§Å•:îXÆ€¾$´·IÍ:¯ÃµFjà¬eüh׊ӧßÖ%o6¶¸é+‰€X4zvE^úz1wGt—„I(s˜W„ŠHNÙÉœ…Ð2{ÊCÓáuªs•úùå{-ÇéðöЍðâ³}ÿOŸTwBh’h)JŠ9ÖE)9 s¶ø‰n)‚Žpˆ A¨kªjMôž’c°fÕ,´7ÀÖ¼(ƒÐZ&—*/Jñ2y ·°V¼¢ 3 MÅàŽœà€æ>*MôÜðæ !4fP…hWŪWeIt¥»•úÒ=ݬÌá¥éÉþ½gòÞáKÝ?–$‚‚0G8ââí½ÒnÀl#D€„1 ãÀ¤i.–wA†ä‘¢¤pŒ0ªÖù5bLºóRÂ_•{@ÃÀOJz0¢8•Áð0˜‘˜Ç!t/˜¦js8ó˜U’›`ˆì2à^ªWÖg¼Í5¢"œaXµ,<|>Ôr„¸Û±hE¯á©é¿¢©3 T¡àhFhŠ8uåúË•@OQÐ…®+h,@B“ c.¥˜»¬á)'«~x+ã0 ã0yš š–iˆa/ÕÌJ×Ï•Z†ADP@,*´æ)éñXæJ”R¯~j‰Ž¥»¿ñKNö¨š`eaŠpÔ VȰzW—]µ^þFŸozªÃ³‰èVa3"-» ‰- 34½¬h¦ÜÞ…zšm@´Ë!ôwÿôáaÅÜ"rjÌŸ <˜4æªÌÜ©„e©`x€rp_û57CÂY@uñ]RhBJK+Ý¿€d@àa_z46‡ yL{4MÇ5æaEôc=&Oµ–¾Ô:£jÈ šˆ ÏŒþ]¥{á¿—@xì*ê ó ¡bб:K0`*¹zË](d³È4虜Nö¨( Â=Ì/(D´µo¨¢^«E´ÖððEBž¤ª ÂÜ ¨ˆ—ê^­T7óbnæÕNú$%©fýÇßÿËþ‡ï¯àöEʀ׸®ÊÄ­;ï…6 q)iÀEå§éD5í/„ŸæóÚ@µ NžpÏ{9ç1ün“6ôYÖú?ëð½)†_´EÜâÿç÷-’ÙKŒ} ÓDœÊ!q-9{­]{•[;|T…öî;ø \ÖÞ‰r»âC5€åwÞO¶ï7Š<ÌÊGEÎ@[ÊÖ>¦q9b7WÍ(Wiöп~.j·‘óº'ïv)ñ9¬„·yû#œzUA\ÝdÄf¥g-êu¥q{½tW—z’ûŠÛ}j-n³nC<5Ô­oˆ>¼_E{Üy£¹j<|ÊE÷u´7$‘ßûœ•vÕf»jÎÛ¬*Å …‰¸v DÜKE7e”_eâ¾+ÌGw¼§¾îrzßÜQ™ÛÖ¿½Ú»»å©¿X›],Ö›À“Ôo1Ûßvï.«µÿwoáà/Ó²±…|ÞÎÞí¨ ýõ‹Î/fIë'}/>|·\ñ½»ûu ¬lªW~ã\±«Ç÷õ©Ãÿ"g‹ÓŽ:ûÏ|#ÏÕ*RÊ¥Ô2›’9§¤P”*œëÅ¥LÇ"‚!iVÊ‘Ú4Ÿ£•ÑŠ4IT“šU3˜ŽP}VøâÝ”ú})iêõ j/uÄ‚õ3 èó“‹4PW< ¤&6%‹|?à3P…èLÐ^ç 4‚‹uÆLwTèÉ È•œ­š$½‡¨2ª ÷Ö/ð£%iá4¤èŸaø¢â$Ú¯¡ó3IPÅ÷½äCéˆgr$µ¿Šjª¥Öâ^ÚÅ»¦¹ìö£3eU0†!»[A¨bÈúúzp•¤IqŸëTçØ‰A [‘N”1Ò¨*Iw U“9Å(bа¨£ºMEÊéæe²HôU4ýðÿ8~žDEÍ‘‡ªá1¥e8ÔœöÙr 'ž?¿`¢ø^¿Ýú½ä-)ú‚ð\ÙöáH^+y=7æ5øÇs~{m"ž‰£·@”¸ä¶É¹QxýóÓa²jápóݘ…@©ÌCs‹lÑZ¥sßÿÃwœ§˜K•éÏC®ÇÃôÓ_^]ò8ŠŒû½cˆH9îo*é»Ü0cŸö:`©Ó«ˆÀ2:Œƒ!80rDÄH¤VsS—@ DÁl°:ÏaT/³O³oóÑç£÷Ë·Õa€£X…*ÄA‡ØÒ“: 퀀5XŒEÊ#>IúHêˆdÇO TPZÛøÉ„¾·H7tM½Ïºµ€†”PÛ£³lYõÒ¶„;‰æ’L+á6½ t†´70èZ‹kZP5õÞèR`.¤ ^鳓4Ì}÷Gúù}Á›”l…:T‘DЇyŽ"B· ¨CN‘#ç:ÏíE1¤´ÛoÇùí`Aâ§ÃñûÝø²暪E5s÷O¥èêV%Š“ðZ Ž0˜÷F~+]ëzõ†øÛbÐí‘Ï®Að€84Aò"_sÒп\Eî.RÆ1OSišM)s!<ï>‘T!˜§2a³OVI ¥VA-ègÍÂr€$’Fu7soíê °îu‡¥~ƒsïè¼ÃMÝ^›ãu;< Ë[ĺ=/+Ö>g)DQVñN+?Ü  ¦^ohmån(:¢™IP¡Jè!ÁD¨HæŽ*C„HBš¹ûÄáŠ*A§@„^+Ã=¢R£„C:P»Ö¿ $7U—Žþ‹‚pÓ”‚d™ t¶;m!Tí‹É`‘Eœ2Ï¥† ST”1šEΚ³W3¸Õ°Œ å\§ð#&57U”(T„’%‰ S’¤¤»POŸ²*¥†7š…·ÆN¨A æá*ð9ÆQ“þáÿYJeRò`Êš¨&A…jUq¡¬9››“ xÉ“Õ1Ùn°€»ygjŠ»¶>¬!Ó{X逪ΥD«½”¹»˜S‚ÞKLD˜·#¬+VæâÕOMýšRÊI‡´ûîå?þáÑBß[X‹«xñÔØ­ëO¾—§ÚºG8.T*nâê7ÿ~R¨äŒrÓoUDÖþU›‘Ïeo7Ú?o´o¸§<¶ó½ÉâòÆN}¬Œ’yÝ‹ ªÀ:äÛŒr~Oôæ2_¸j ]Çöüúÿp«r¹ w¥fö½ÆshìZ|2hŒ¼{§W½áMñë¿^Fº|º8³6²Þ¬H]4uq^~Õõß³¿ÆMãºýóB!añ†Ý¿5møåYà ï!N抧­èb¶^6ãÇÙKüº-ýbϺÓðÎKÿÕ‹¡X%\ׯ×[͸ÏêÆ×÷Tþ’e¹{Kä¨N\ö±_+/ÙUë}à#Õ/·ÍîÝç2ǯF pAŒx¸q]4?;šý-š+?ªÚôä]|ˆX°Yø¿§8ý¼ˆÍÕÄøæ`µËžƒÆG†éëç_}‡ù¶¢óL€?ªvz½DíÎ9è‰4öX]í½Š+ÞêEœð µÙ¿ªz>¾lÞ„í>$bìuc×Èî¸ÆEVñJ­{Û¥w¸ð–ã*Pé»-OéA“³9ýzK‚6/š7⦛ht›4^mϨõž±/ƒ¸vHØ]—€èªô+9®g­ÎÑ•|p–QŒ•B—HjS_ea6ŸZ!®3–«%ñ˜q7—"Ÿà¨ÞÏgÖ$©sÓÜ)ø™]l)ÇëZûÝínIã®âæ[=Á/0^ßÈaž!<Þhi]¥š7ü-ž+Qäu(tºó-LàɃaͽ}Ò bí‚»6'!/ygQŸ*ë#äDN>Yqœ?öfr®2n(Àö%xøñóü6Õ¹´õ²hN»AuФI$Ò8‚c¦éO?´j))‡´ßë_þô9y·Ûý÷ÿïŸw£¿}~ÓîSUÓ8 ã4ÕQô»üÄa·G3±C 7†!ΜÔÜá³›yÞ ™!éøæCöÌ!ÉÌ5…HJ”E¬¼ë!¨eŽr„}n(­¡ÿŽph V„uáò†u’à°c¯Õ@@Ñð}éÃ#„Œ î]ö§u•3Au‘%Y54„À¢p_| 6à t¨²Øa¨'{Èâkà„¬áÑ1|E8Á@"4…ŽÖܧž†,ûµ)J«`ÆA9`Ç7@wÏ*Ô2WMAgÞ%u>†UÏû©Š1ဪNÕ1 "*æI^góV/"<o:Eá–Jz­ajeLoÇùx˜Aš‘ky;†»*¤‹~ êð s¤Ö î@³ÀµZ."NXþ Øò[Á ©× „4˜€¾ˆÝ/r@­q~µ}ž‹Uw‡ªTó¹”0ìv#‰ãT’R„V¼”Ba¦æ]z;L k«µ6ä´€Ò™"¢¤„;<¼–]keY‘~Ž6z0#g—ˆVBh¦ÇM冂$pÐÌ¢[Ë,eù¬Ñ Q!Í9à £¢ O9dQàèŠü’ÁŒÜf{^L­Ó(:ºK­ E$Q)ÓœЍ•bÕ©Š C”aQàaî¨dH[ >„*P!„)êqiöwxcÛ´*šöá²÷7ã ê²Í9T i‘ä2¸w¡Š’˜#àÁœ”dJÔ”J©¡*ª)Ó4‹Š&}=|)¬†Ðò(6I˜—D¥P“ˆËè¬Ï*.RÁºSg x.m+Ɉ9âsðw‘~ÿÿAþ©–>ô°¬áQ-¹sÇð:/ ±v>Ø‚µnTyNâÿ§ë[Æ3Ö£t"‘Ÿ1±Ø@!oÚp%:øP¯à"Ì'ïþÓ½zþrV¾_â¹éìÙ„­?$Ýdìë·˜ãñNð|'7®•ˆÌÕsâ€Ã¥àä9ÁÂâqëG3ôÊXa®º×KxÛQ+3¹hœž¢Ÿ§‡ô^†r•F\IÿŸ§ú©è13OzY§âY¬q™g´×þ7`ÊÅÃ\_y -­å‰6[z4T^•mnë"ÏLãwAØ{ªÏ@±^¸ëcàÝ¥Ú³òà%úßá…õŒ}’ ô$ì ~ç™-è½û¦¨Ð0"œÕíÛÅ @üÉ[¿cDøAøõòdy–äö¿ä)<]}7y¿ q®ÍÛ71§ç6;l‰À<)µw«|µ*vòÈz×Nç©jÙß®è|\MÊõn|Oèq1àÝpñêí+\þ©þB¥²ÛÙû`ÌVÀ7ùð´ŽCVÏë ÷-ûsém¿=¿Ûµf:§Ü•Òúpñî1àÙÞ`l¶Üað)„v%3t§0z!WÍî½yÕõðíB›O ÿ Z'6<˜~ýßÉn~>^óZ†ö¦åíWP¹ú˜ÉÒÍDz2þøÊø¨ H<i}¹ªÀ½K=+›^¬òù0Õ¹´ŒÑ£îvÃ’ªhÌšm˜SÒZãó_ÿñ_~WŽÓ‘c9Úqò=þée.ó`ÓáTŠŽ9e¦4¾Q‹UTváy©ù»ìõX“ê4OG‰I_m ’ªf 4H·° G÷·™S£–2yu;R_%€Ù¢4èR™Bjõ.La½å „£xW‡É¢¨†±‹4í‘&ßß@aI‹Ž|‚æ^3•¼ž€~²;—"`6Aúoðv1k]ÿ€8"0ŒÖæîЛRS‚Íåáˆ* ©U3C¥ÉÅ"Ò ‘îr\½—:)ARÉi2Ân»Q•ZÅÍ$¹&À@T05qí ŠÚ±2™ªÉ§ ¨Õ«¥1çÝVÍP¦£ª¤aðÙaáó|¨&¢šDs @Aš~;"¨ƒV;Ò+Ãs:¦ÏÇÀQ¤ÀACrØR Ýq¨oŠ7‹u`ÿ+`ÝAv5ó™°V!"-’éKSyÇ£wÍw—ì€U‡BÇD“ùXÌÌ ÓTÜy.å0_ö£È`ŦÃLåH™aµÔöP…¡/¸À˜wS™¼z8½3Htãã,ûÓ‹I„jAjÓ â×, y±/6ƒž¦™¬¤»ÀÔ ¨p rZàÔtp;3˜@d€˜Q !”$:Œ>›×€Ð“¦$ x”ÙUzõ 8„©+R$à`&‰ZÅÙ,DÔÂàtTïÌoÞ\JkÞŸŽ,­šM›ˆ„7¹-AσÓ”"@…@Ts)e¶„; ­f>»‡S¨¢ÇùXÍtPI‘TóTk¡’ hÞëwÜ%£©@DC„Zâ-AʨT%XBæcáŒ$©ùŸÿMSŠïv®¢/{s#S<*$DL”ªÉXƒrLÊ „LÊì"`0"§•¹„J€îî)¥–ö‘¸Šˆj5sZª9Ľ¨ªu$ØIªòÔ¹OD¸{uwg j±bµT¯î5©æœÆýÿoÿûm‚“çf,–O'¶îi>>oüx’ âC(ðì’´ò~6½×-u•¯ž4Íßíê ‰Ÿ½E.Ö„'ƒ»'ïàk3ÄóQÖMKõW¥¿M- —ŸáîÞûv·=¿*¿‡¿ÿ ~ní)lôÆÜŸW‹ŸÄ—5×ó¶ z«#ˆOž; ÿ–_ñ^cäåÏã¢7W*雷¿8à¯k0¿ðG¦ŸïœD~¦Sëß›è<î4“Ç»•€ˆGQÓG2Ï\áfê·1abmfy.4mAwLcü0Ç‹Ó÷ªd‘T@³ ^Ð_7YoœFñü}^Ä&q/ÁØ sOöpÆ ©â„$_:†žZ³Öþ¢§¬ý\¶5’—˜|ÜDO4Ы qÏï÷Þ7^V¬®ÿÇ5(ÌKÌóDU oý§ŸÉ´àa#üG³£€vmJ¼%Âuñe'r̪pR·â7¼o²õÄCàû™(O^R×è[?»5_ø¢¼bÚ¼ã‚|ÖúŸ+‹±˹EË]QêÔíu^(MÇ?χ©çð °ÌSÊ)§$J Jz!bž|žkPê4>¿~w½ÚŸzsóþù‡¡Ò}üÓÿæ>SøõaÁ5³dû‘}{9ˆ‚?nƒM®hWâšZúd2ºÍ¾vÖIDÜ ùù5÷µwß™„|?·».™0xjþZbžó®/²tQocô«q>a¢ËóßÚ/N ×qÐ}þ]{ Üšî+ ¿»¯]"Ð éOEK„q&ЭŽÔX•9Ö×»6ñϬÆw·Ë‹=åbr7Ò.§2ÝÅÚ¥uWuþs,<¿# ŠE6ä$tÑïöeþ]›2GÏÿƒý¹¶÷u+ûºt‡æö-N”ÕÔæ:_[›_l¦(«Ê×-ãÛ²Wä5_ö4=y†;/J«É³YèÑa—aŽõ!A¼ýù§ùíXçâÖÛtȪ" %„†›‡E1ýñó\l¿Û S–ÿùÿûSÒøéSµãëçùðù³G)s!«BÝÏGh’±Tæê.›¿ÿ§TÃa1§#•7NSÞ½êp)æ£ Bñ¹ÌâGóéøS„IütEðI4"fw aD8Šu?7xmØ3ç*( ¢BÐç)!åŽ6¬Ö•ý«CÚ#³Ë êÔ€ìð²æwyzTØŒ:÷ý¥‰l׊ˆÞ¬Ý14D˜…“ÞhMkÞd»É`‡F¡lîá2TÂM ^]4@XÀÝUİÛèeöˆ¦ˆ’“R¤ÔÈY,êÈ<×0ך8ä\"ô“U‹:QrÔ£0ÄÝÇOö¤0¤¡í‚jíu%Š—wj¬ÇB dñbŸP‰a}vŸ ‡=¬º;Š0D è€! ÂÀfÚHX¬H·nÖ¥ýßqÖ÷·E-§7øŸ*r–Âo¸$!°îùìîf%CÎ%ª&-¥€°êšR=¥,"µZ ¸“‚ðv‚_kµP…Óëq¦ƒ  @ºíóّػŴU¸wq.èüi…×DgŸ€4¯ˆÒ}’Ïv‹enc$´9çžì‚e±öFvyÜG–& _ÃE ’T@¥nŽ$D DÉ€Xq@@w Ò‚F¡tZŒ1‚÷`°ùoG]¼¹°!ˆftì ÀV~kCÔÈCF5¨@X—Õ:=_7¸;´x8C’fЪ[™Š¨N¥ºÆKÚ¥$`¶É}&M_ôÿÏÞß69’%YšØ9ª÷Ü=2³úefz9Ó3»Ý3¤e?ðÿÿ~£eÉÊ’B¡È®ì’Ó]]™á€ÙU=üpÍ`€Ãã%+«º¼»£#=܃ٵkªGUŸ³ËMªux.OŒT1 µÔªsš1 a%YàSjL ÛPrp›šÿãæP-ÅL|>ðÛT¬9ÆÃ˜‰Á°^Cøa§§]ˆ"žàñüd4'õe–ÊÌ*€4¾>Fsö| ˆŒ>ß Ìø7÷ÖÂÝqÌZ‹±5Üiš«‹ÑblÍhÑZ¨…2Õ:J‘V¼ µ u÷Ãó÷_þ Ο=$ŒL‰Ç¶ÿþÇŠÕt)М±m´*vm=ôOJ]½ÐzÖ}þÎBâ‘Z¹¢gpS`½©¸fuóóóýFγÇðYW͉ý=ǧ«z|oÖÐRµ_uâ¬ÝxʃNXõ3”üy4uüyj[v¹($ÛA˜¸Ù¢°q%oä“×bÊ]8ÀÆëŸÌÏîv—Ÿ'¼Wáyö†WÓ­ÆÃ[tÝ»ä}:8Ïãý÷vécIç¸Û#Áã˜ý\T.ðôŒ €EǪSæ”ërÜgS%‹*skŸû§–&®Sª™µ«kÅ’ëüãB¶X¨¢o`Ķÿ¥€ö¦v³Ééú²Dì–ý&ØçAÄÐyÉäËäMíiÍWÙ¼)O3g¸‚Äý*”MÚØæaßWV‘ÕÇáånyÊ÷/.â]Ç›;¯±imÅ—%‰3Ñëôû·›;o­«ëv8Þ_![³í•¼®jßyÜší».Zß*Üߦ.ø9oª´›ZùÝ®ös4ßwñƇ½B„i½7¿Ùmü¦úü[‡Îã ð§;:ÞcZß—Áy…Ï:T~‰uĦھ9Þz½ ýÊåç7ã:a-_\»3s®ßúüºÆ n€µq?x¨zñÒ›Šê2ûzQgZáqO€ÖÏ˸ö‘øƒ_° o 4l™Œé‘¸Bñ>0[ÓâgÖ:çŠê÷¨$?Á-»ÂÜ®óæÀeŠðŽu8®ÖÇùe5€?¬¾Ù)]-ÅïÜ&pkà%ú ^™ÞZŠ|o§KG±Ï#$øúó/ãçÃtI3ÇÃ~÷¼+ÞíQå¤ÕË$^›yùP‡qœvüÝ?}žíùGñóÿòÿÜ ,•-|lœ(Ç]¼IðRŸXŸw„±Å4ŽÏ/ÏãØŠ#SHå¨1J„«%8H)LCñ2iÿ‡}Û½¯ñ)óÌ`ó ɧEdRAYDÛ·Ì6« @°:ÇËS›¥Þh #e@u¨`˜&ÄçÙZ¦>Á ÔaÖF» +W–|Ùõ—N"°Pþ;¡>bæ–hB‹“³J&2醮–ÐØÝÎ*É Ô<憂F%•…ssouɺ!šÐÄjò‚^©0³ÌÙÔDÏÇëNÃÐY7fNXìj>Pˆ±+™À¤2`Øõ7ÃAUNƒ+55ÑKƒ¼2L-r¢;‘Œ½à¥o“hMUtS†¥€$˜>U{=LŠ–ÉC›hͼã”-¤ÐÔ¤DNpƒ%”h l`‚ 6Ÿ½£_éeÑÓWº?–9"Âlv ¯´I.¹0 -B3¤~CS"1ÅtØçn§Ý“ OÞZÐà„z‰µí[dK“[‚”»•R‡VzˆÈ¾ÝP`áÕôƒÎ6o/9ÍaO×¾;@μøæ°þë}˜AЬ€ÏÀµ¹æt´àÂDWCjf[Á}£ip¡†gðŒ@N0ƒ]Ö4ZQñâ%#‰¢JQ*ejÒlý<§3rJ’4)aD&ÚP÷sƬã³úÜ'lfïâEË„í€ò4—Ü̈“-}€9cŽ‚ÙPtƒ‘,.Å¡  MÓØ£”OeWhÎ ·ax>å©–ZXJ“YÝÁØD³½azbq4§½å£¡øóßDÈ…ñuªCÉCð…Y‹ *üè%ŸJ‰|ÚÕWàùo~Ò;³‚ÃÔÜsgÍù‘Š4gd3ƒ÷Ê™”³´7 ›fN #$Df¶ŒÌ>™0R- ƒŒ‡6”Òü[‹6¶ÌŒÈ˜fÛAffÅ{ãÿúÏÿH³õåQ(;™=E¿¥ðrO-ë&âÛ6Q_6’ë?×¶Àf¼–[¾| ÃÀÏ¡« é‹¢ÐÍO¯5rýö¿~ €/¦l¿yxë·…Ñ_çë%|žëQºÔi¾uv}ž&¾Ecþ<´ χ¯=ßÕY®ƒãkþ3Wùå-¿® ~ñCgã4{~–¤_ú‰Þ¡®+õÿÛ®–¯ùɯ¿qÞš¸ê¥ä¯z®¶1ù¾¡–-©ßõZü&¾Õ2x0é~ót]4wEþh‰ë}gá/Ðù?ê×ýQª HÞ†ÃÿZÛø#“aL9ÞÏëá¦[ó°ÇÀ%Þ`ê¦D¼±w\èw+uýfÔü¶µí‡"«s}+²¹Èô±ý­Hë½ãµú¹µ;Ï'nþÒtׯÓ< Í•¹(|×ÔE›½KׇúƒNßUŽÎz¾m*sËzý’_VØ^§î¥‹OÃí8ksêuå©vJ‚yä2@¦Gešû§¿”]­CñâÅÉÈÎ3He¸ŒÃÎûøý?}þôûÏS˱M/SÆÔ‚„×2ì|x6³ZžÐ`>~>xÝýøòã˜úåçO/?>»ªL‡Êœ ¥ ^¦6*µ“(ö:µø¸WyÐÅô¨I¥ª,)SªcÂgÄr±ÀZhŸ)ÉÉ uÓZ9M:4 Ža3³'p P‡ ~ÆïLàì´öŽl-åSu7ÚŽ Øt è-ÛÆYxëmË)’Hu¢?÷ w‘ÚGcÕ@Sov'L Yï÷wª·Û§h”Q"dk1º©µ ‘Þ"É|úHG©ÔbRhØ¡e“ðú9 /¨•Œƒf±{bÓÐ&ÉÅÒ² *å©F›xñÖSzmL˜C¦h‡Цœ,ÅZ=D¢K8ÇýäƒE›"&KËÔŒÑ#¢ãë;Éðn·°@~"•Ãíú¾^KÿXŽ-¶¥ÌÔ^¼éµ\¬¸K‡õûìÞ¬Eñ‹œz3²Ì¯àã«Z-‘²Šqš ‡Rëø)&å?€3Zvµ› Ÿ.!C/­¶œYÿÐ2ŽgáꬼV­ ûXº¹OmÊ9}'²Aê ‡åe{á$—ßK¾tM÷*×ÃS }Æa÷öZÚ€á…-‹…eN‡©øŽÅA'ŠËt˜¬z)#”­å¤v ’¢ÌHëæÖ„˜ÝƒæI†Ü‘ 1!Ä"ëwq9æëÒ›sBkð‚R¡£ý† X”hÇ`ó'%‘ÈP#e0QDÓ~RZ¥eåSQªC-ÃÓ.j…^aÎ0OLŠM}g†à¾e„ö7—‘ù7/Ù4x1ð„yþôbÅ'ÁAªô"…y᮸ ‡@L­’(÷í•-ÓÊΪY1LÒHäÔHx©€BiÖ¨3”êÀjdŸñÈâ(#ÍK‡„efkéf9å˜ E‹lSvÃôL4º¯þ÷ÿø/ý“·ç/o´£’¯AW_ÏîõXµÌéêRB=o^îæ3ÿ»"úã3ûçùªmþú*¸I 9š¼âÑ÷.©ün?ûfþ†“z$ó¸Ð»6§«ñV{þݨI·d¥/Ò}¶Ó„/‹6¿8˜]çf:¹nˆÿ^²ÈõE»âôíõæ‹i€y£x¨ðF¨~•ìóËàX¥ÄÙhþ–ž¢[s¤uH‡+hØöö÷ÞÕõÍÓ«í‰ät¼¯zÓ¯«}­€ WSW¿á Ê]Gn_0wñÝA4Ë.ùxL›€‘/+\‹v¿B[ ‡7/ÁwSQø6@ê«®û'¿5èüºýþ×.Éœaç/Ïÿ•3® ®Æ;fæÊµOõ…ì~¿­!•6‹ ¯¿5xt‰:CƯ¡·R9ŽkôÞ‚õt'yzö®¦ Oþä8o0O"Úéé1é½ËrEÍÙö+?ë©9Ñ·æÉJ,áΑÂs3ÖÕuÝâj^)溽\OS•Z "ëÛžçY—N–•5ù:n>N”“ÇStö~WC4×#“ø[ÍÚÛù­®~¬È@ì$$]µN_Þ*‡´ö}(íÖ>ø˜]8WÄ`§¡¿7_ð‚ntv¹W×sEÐ:óú]þ–oÝæÂÒî­jÇÆ¹=Ï xïLÂçûXë¶ü­ vL<.¦+×9À•ÛFÚ¼^Õ~Çt=x ‹ìä®ÓìÞùb<; :»syuAW³ä°Þ~¨O¿ÿeÚ½utÿúyx~2§•âNšíJ-FµOjÐ4©í÷™Ê¬‘øù÷ŸbjeWwõ)’ôòôT}póú4¸L@"Ac!íe'úaéååÇfvø´7âé¹(§hmÜï£MOOn;oѦƒÒˆŠ0”ø<~ú¹Œ5l‘ÞIrk“¦ÐžRðI^Mûˆ)Ó ½T*ömjzyæ“Û~—ORo²îN¡$`˜FtñQ‹íj´™ùÓíq@`fÇsyHsÑ›óX0èƬHökÇïk†®„:ELÂc°·`‹,†Úñåý$kÁ$‚p§À)滜 …™$Ÿ0²˜E$#kõþä¤Hš;žž ˆTƒ'Í" ”^²Æ É^ „;Ì1Û —=z-‘–Óeu‘p›«tðÝÊ9À daùx˜\¡D¦&Müi7<¿Úhá Ø_vOÉB¯µx¡<ÍH–×ä¤00á-Ü­‘‘ðŸþÝ0Ôö4àãëôiúY[ւ罎Ã~Š~x­)=$)‡Bч]ŽÓ8µœrz®OfCÈ­T§A“döRi†$Ð:—¯³(±T8HÀŒ"-%ÑÜ•}¥ËB™PDdäS#•©TL­k÷ææµüïþþ?ùP^þêÇÓƒfaŸp Æž§~\žSùÖϳeUçéò?ƒ=çÍœ5ßãgêTü>=P5Ã=y3ù¼•üÜ›\«„× lO»ÏØ•óGö¹j8Ó.âœ{G¸^TRºÇ9çaͼø\˜ çÙÍÕÏà”­ë­zWèp>Ôm£ë”}[êz3á»Ó=v„…vköë»æÎ©[ß›·oëíôäÁÒ­|vSšÁÃ`(™Úâ¼]Py\`Z¥4«~¿ÒYçF-'Bß,/=¤ÞÁ©¦yz˜Ü„Õ¬¼¯zø¥q›ét½é=ò”9[·ÇˆA•òNÏ ã“hão¥ä·1×/r¥2¯ŸÑ§[ró {ñF¼K™Ðc¥§;—`“(µùÍ[ÂëþqA¾­Éèú¿³†ÿ<¡óç õÂírµnO >r¹ñúi³eäú£ÝºR«jâ¶Aƒµ´¯¯?]šî”"p;››ÿ('°Ÿoy=ÝŸ¸Ù$~»LÿV1íŒÍ½KýR7ú|°åù°Õ²¡»qþE„¤9Wmÿâv– æF̓}Ö›wæ{töKöâhŃ99;¼Ý¯}ç^ý>å¾û‡Äk'Þµ¿Ê›&<âs–/-Æw@w»¾ÚÔ¾cG¿t–«é!ôí €oWP^EXçowËr_±ÎܯõfÁëÖ¿vk žÛn÷`yÿó§iˆÜ͇âC1c)ÀÍe)å ”ÑHeä~`µ¿ýoþæç?|FêÐÆßÿ×áþ_>|x¦ ‡×V,ëó°{©ãx "…çÝH“Ú¡y­‘­ nTËqÿË'娯ÃP5¾N¶³éN)‘ûŸÓ?*ãX©R¦´$PÅH‘8d¶TYòSÄ@s1R…V °±e=,“S‚†RR—MÌ9ë°3#°œéðê6¤ Ö‚Å‘±ê='¦)¸Í.¦Ê™Q“yâ5'ЇáR›¹A)ŒA‚¥OT&صwK-Ñ0K¿ìö«óc…)ØÜ·-™¥¸»m'3øÀ2ø0xšrLXÝÕnxÐÇ3—ÁèRæçO(,43h¤™ye}ê]Ö˜&ª9µ@A“Ú»9d1Ff˜9Í ´F7¢¸¦È6NjbõÜšÒ-£e§ó#!÷hB!ž|‚Úˆ±Á,ŽñgRÓ‘þÏ-í±ÿgw”¥ (ý  CkP D ^æÂ™ Å­X=ì§Ì¤aÚÇDÕŠZË45µ©ÔäCh‡l u7«ökÉsv–&$¼þt¿¯2ÿEÔî-ÿÙæ9•¾9Š3ß? 'D ét/Þj' Iº¹›Or ÎjÃøi÷³ˆi®+ô7ÍD 0ád Á~@ú ì’¦Ù|xùëfLD}úÜiÎTDfs6§"ƒÇÄiœ45$“öŠv¶hãÄ6_Õ3€(Ðb©|pÆjõ‹½úPÎ}1dÌ•¼¶G x™k\ÀA3ËXk1Ó¡!L È­¼p—‰Fñ"÷tï%¤`¯ÏeeƒÊëD@£˜ùü7×"TŠ>}¬»JÂŒæÆ”Ñ(išš Ü ¼^ÛŸ>XÍhYž*2§ßÿÏþêK! ʆ!2Z(½%trbއðÝSz¥ g+Î6£‰ˆ)Ù‡Q¯ÐÙ&æç)Z&*ÊL•‰J¢Q6(˜;8<î§l!šØøÊ$ñ4ؘ’g+`S! ,"»¤¸s{Lɺ(<Áfh@x™aâ]±MB&4Â!²ó…R0!Ç[¯•Áz'×7u²¿B¢ú€Üa$Àê¢4&‘2Ó0×!HH'LÐÄ ¸ä6[÷yzF6î¥x:>üä)Y¡Õ(ƒ³"&ŒûÜâé…ÙJ ‘µ0Ó5<«5ÄÄHõšƒïØ&µ=j…‘^i ‘a¤rn ´ÙêOl5þ ðî ,  Ú¸ƒ„•¹¡Þ8´l‹\z—RŽ:`™ ´î<‚Ѥìe3+>µÆ@€+³o„°ü»/fhôî~C·o-¾T›ÚB½OˆÝm÷´ÞúÇž“0S6óH8]LÂ!JNÀ j¦üÃævû^—rŸ9û™@À€˜h°¨ô’˜¨¬Ï?°0$ºg¦ÑÝ ™0wRDŒ-GÙ` ²Mj“"§CR4&Š›{¯¿Y޵×âÛ1Opj6ð˜½|Ì—!"JYfz9Gó( ™ |s%¬€h”EÄ„¬°zu¯A==ïvØM•´âto$ Š© vH¨Ô”YÌ »¿ûwÐÒdú|Æ›>·±”ý8)­xÉ]-)HñTƒ´b<Œ6BQ+^Ê>vW­SfIÛ‘cµn$b€›ƒlBJ}+(î)E‰¤"#Ím>ŸJ-Ó…jlŠhãd™™RËl €“¥ºÿûø+åù§ÛšË.ã¶@få¼\u¹¼Eÿ M`ÛXôVhÇwƼÏÍ?½q _iU[¹äùnÓM êÖÀ¤7 ï’b¿Uðv}¶—F£o¡½¥Ô|½ð­Øï‘zƒÞXºhŽ|¯gÄ÷¶K½¢àëOPuxðÀ×°U'ûŸÌ¾ßÓz¿=îO·ýeçêf=ã›]ï_ËËxË)÷±ŸçvËß ¸¨;äŸïZ¢øÕØwÓ3ÿL¡ó¿ýÍd= wè΋扫9*›A/æ ¿¡EÓ­×¹0‚¾³œMñ>:5Õâ8ÜÅ톹si#çÐJéɧ·aÕ Á èè‘Òb\0ÍùÒñc¬¨ƒ§mõ+b›ãó¶^ÈËüÇaϹ‰ñxÆ/Ü¥±1í0C“xúØë Ø~-·âëõI¸à=]ÛŽo-»Kô.ÁIZòÑ…g+ÌH‘qü%]6Ü8Ú\”›£âÀûž'OQmÁóò2’JËUWþÆÞ-áy´6•èízVn¹˜§xõ|8H™if·|›Iê6':uZŸgHß[S/7¦Sq\P›yÏFªë «ûç¼EKëüú̬–úé`סÇåo­pd:¿—u°R5ŽÞý–ÄÃUçÆé<Ñ€6µŒññãÏu7xq3³¥³‘!+&5Éö_ÝÓÍà%0Lñéó§×˜¦þæÇþæwÿëÿýÿúÃO»Ý³ l-Z›jõRi-4µik '§¦‰I¯'“ž^†ñðzø¼gNÑ,#ûi#à¡:÷‡8d¿ðn*Éhš?±8Ì_‡ÀP,…–j‚žŠ2Š4‘"~Ú•"å%«sÌ,‰­EŽD#èhÓÜàßíR÷0C§·g'·äŒO Rs?5‰Ðlè1?+"g\.~TÒ)Ý4 huP€˜Ì$óe›•$¦:ÿ¼/q–ÿã}7l !ÙM\5M!ev-Z© §›Áˆh^KÝ=ÁêDƒÑÇ`-5S4+OŠ ¬Lb†âÀçŸÔ ÓAj€¡M(±ÏŽïD 1QH4¦”¤RJa`²E¤D!œ¢Ðй40G|Æþ˜öð@ dÃ4‚€û Pj³ì>?G-ÎVÿ™ÝEy!Km™rè—ÕgZ 4c—æ+è&˜HÀ´¹%?cÑè» sd ÅÍ«g„2%rY69?˺u«ûRꫨϗ4ÐQ|Þ%ÜÑÇ:ĹɽUf·‚ m m f8"3‡: ^(7)Тpæú…F¸J LÀ–†êœÏð0ÁˆÈÅßb„JFx¢>£RòÚXw 2¥$Ìs’$«1‘F33Df7_îGM«ôÁkéwß1¤‹çIô?ž´Ù¬8çG„€(»bK„bžŸPÎó ›…Š”Y=)˜Le1ɪ¼øn÷T94ä‡êUUÕPÜÅÝžQ˜Ž ²­IDGnµ¿ýk µºcL=Õ,ž¿ìóçý`¨?¾ìÝ£µ Ÿ†AÀ”²âUsw£‹{xB¬ÞŸÒËÐëë¡F¾Š/OC«®™ª…óϾIw.efšy*”-B̦h Y_ô™²åa?ªÅt™}€NC±ZËúßÿ—õã:p¾èY¢.Î4Ë¢S™©N":ªÕó/paÎi‰ ·¦ç&U¼àS^—ºÝ4ó`í)¸9Šžs¨ÖŸ´Çgâ‘mÂ;IWÿ½Sœy,­ôÿdnº}âüAÿo¾—‘ä•>xÌ%€œ@<.÷‚Žø¹Í±÷‹XkÍH9 —“9Ä›Ýy— ¨ë£ºC‰¼¦l'¸N¸ÈëwäqÖùÂò÷*®\këÇÄm£4µ¾î×1çf%ãÎûXã¼*ÃsÏš›• Ë;çœl¢‹’8°‚æ^¦0kîÃq4†·=n,€3fÏY½„Mg¯“¯¦Ïm²ž¸8gçùz\X«éœVj²¹Ùʳy[ÝêÙ¼ 2/ß³~TkTïd‚÷û ïƒ<¬+]+>¸âol¢NneRÛ'm\ˆ[·ƒp¯_k#gÔ*¥½L”yu‚ŽÃ,Ú…úŽõ’Í‹ú&,w…»–£®‰%Wácuko¿mew±Â×õªkÚÖŽG¬žò§ §3ÔÙÕNòV‚wNû¦²µA]æò›:Öu/)¶Lßœ!ãýC½/ƒÞйþ×­ÅvÚaŽÏÑ Äô”´¢!Ý\ÛæÐù‹Ã[]?|ü½Èù[¬ïðíµÍ'Â½Ž‘VH›»ý[%½/ý¯ É¿¸V'ââ¹X®¯ý™p¼(ÉXãßU;;æ:Ë.n|¢“Sëæ¸Ü¾Ë¯z½ ŽÜŸ·&ÖöéìñüCßY%|@~½=ÜÝæÿÇãõ=BM¡3hàúbpÍbºŠØîDº×[ê¯ÖÝp*ôi™Z_8­³œ†5è­hùÑ €¹zb–™óàê*ŒÖæÖðMÎÉÉ·úKƒ­‹Pé~¡l~4½g{õ€ÑÅSézHöDø¾í™¤³äôtU—±³•Éõ¶¡Í^/Þ’ápþŸÿüs›šKñRœfftw‚†0°“# %B‰”­îJDüü/Ÿ8ÔúËÃ;jüüñàôb*%² I0ÌÆ a“q$Ùh»ò‚¤²í__÷ì ,afq˜?"eÌÚšEŽÁBÈÔRôDºþÐ&M6ÀМ“žª‰8(˜UÈkIéS+Ž¡‰‘Ѽ$ dD2-¥>e¦d3˜`Î-Ýs«uÆbŽ'â_ ™½@|úÎrUŽºæêÂVc)"1 pG‚‡AݱÄÚÜן} MR¢Ø¼{O‰‘H`÷<¸²½f„’­Q|j„ù®ŒþÊÊÎ[kA£˜Ó$Vz!ÝH<ï0ŽÐ0_°2$<1Ò‡ô"„DÐ1éêmöÓžµªÓóûñÅ8 íýÌôÞtbDǼ? @CKŒ#ü h#bl(‰’½¶ŒÙiÀ¹he‚éÔÑŸç=þë¿ôÆGàg.»i¿)î2÷é#ç÷2G9j) Í³Pˆ€Ñ2SÈlÙfo]‡s.Z˜ÍEç)¦è½êÇk&ï/Þ¶ýg&™«F÷:¨|H å˜P_¥¸ÓÓaÎȬƒ>-n0Òmpˆ&D1*DsÒ£M Y9)ï\…9Ñ ”¿ 0þJZ‡¦qouçe7u~LÅtøåß톗1€\Iª»grè% ez1Z±Ú´6O$Ð&¤fìRÿVMp‡U(šÕ»îœ¬ )L\Š@âàìû[“4ñh^dÉ‹¢•An@·R2ˆRJ<ü)=Hñ„¨à`šQÉâu IöïþÍ4%€`0Ìô4ÀŒ†üñ¥¶à§±üôTxŽ×1?Ž­’»AÖ7â¦(²¥Ðc¦!@ŽQ¨1¡ÖÜ—ðÅŽaOJ™ ¡]ˆï„¢!¤ug ZNÓÔ¢íÇqjÙ…¡¯ÅJa±ÿÃÿé¿_èä < W ^6 ¬¼´ý/À@]„®×ñ¯dÙ·9Áëhmž YÉð«Â÷¹·ÕMF<îƒÂÉ7Òõå­ûâlPë³{Vöè[Õ:°âúÎãIkíðNjz?öÆC` ÝáFÞúÕ7)š›êØfwøƒù[,#òÍ8˜[ŸH_º?˜^›WTn$ëÆ6­«bÂöŽÊCOöðip’ʧÝ.$ãÜv¨È:”—žÛ8íÿ?ÿ³©ù¸ß·Ã„Z£å¸?@Ñö“‘†zx=¬øà0 ¥ÍGC$wU4Ëéð:–ƒÜýõÓ/mz 2#s˜`źý%Õl3OÆR¸³IS¦LOæFŽ™¦PJîfêC©4Ð ì—©±–Oƒ â!²%ŒLÉE‡…º‡æÜ¸Ò)–]ˆ›)4ZÐ! ±‚OçžñV )Q AºÁM^c[ØB,(i0ùŽ‘ÌÄÔh­g+Öî,˜eŠÓþ0u€®€V}œ"•µ´2ÐK…,côµÔ`КˆÂ2E¾¼ì"r¨iÜHa|ýˆødÃK¶H…²ax‚Yïè‡U”9 ÅY@`ELì¾Ê^ À`&Š‹DÀf»Î–jhÒðÏP#pÀSAZ"&( !mV¢;ýÅx¤³Uã?—b€ÖØrÌêÿñ›ó¬FÎÝâì\2ÃvŽOÇ®¬öò 5Ô‚LÈq›S‹íJS*Sh‘$¬Ï 0ÓIÓ?–„º­t÷>†ÍE.ƒ&ZÎßW·½Íùð¼rzæÇ͘ǢÉã±­çdWC¦½ž/žS/ƒ®[‘ôi$ãÁ¢=W–gÜvÞ¹<íÇs°yï½Ù°YJ¹°¶×öÈXšÿrìr:ÍŸÌme:Ÿ??NmÖ´Ö€™ãäñxÑ›SZë_¿˜<ÅRâ<‰ß—…—‹v"=lzðã ‹¦õâܬŠ_l Çá$¾urNÃFÝyñ ‰ÔÇ]¯¯ßé¿t² / ˆÿ‡ñó~nÿ'¦Ãa÷<˜¹›’b¡O­åÔ4”Ì̈qœžž_>þá—Ãþõéåå÷ÿ¿™Æéßü‡ó¿ýÿcþÈÏŸ^mÿ9Û~Æ2"öY öû¶3£y1S1ŸÆ=“Ù˜Š¶gà3él€Gâ0¶ˆ×iŠqR6JÈA¦Z¦™l¡ô¾û0×KEûŒIz6¯Îƒ¢)ŸŠ»cD†r‚ŠL¢‚‡È‰ªÆæIàƒÛ!³È-‡bMÙ)û¡9_µønW˜>T•â6DËƉÙP_£îà•1¢Ènä+ª“”Þ¡†aÆ÷+Á &( ´€%ì(˜ù3S€è¶ýóžñ ŸÕ^n{;ó‚ž§™tôÆë&ƒ¹—¿{ÃZú¬ÀÂꉀDšëÄbòL0òйÐf#_›u.øÙÙñÏ.M—ÇÙ[ÍãÝÃV¶ aŤóšm/ͪ=IDL¢2!68l-ÈFjÙ B4’ØÑ„ÂÌ–1 6Kº¶ùªcËÍÓÓ¾ƒ²Â)šTKg1F’JÄØ²M©I*4™™º…±™£NlIŒô1r«KO³Ùoëê¿`9Ÿd'Îþ - îÈDöé‡mì¶°™74#AzI¢7M›9 ¥ÀD: ‹ÃE9§ªÕZÂiæ YŒÁ € Á3‘øÛ¿~5Nƒ;lÈȹ?\ p¬f96!ùõy’›ÀiÊè Ih0·:Y¼d4;0†Ââ˃Þ2#R3¢Í’¹uƒßHE&s.ØSˆLE¦R¡Ã~œ¦†­…uçg÷¿ýoþÝ¿ý×Z{yyq{| níïºLåhíi‹u;þ*Š»v½÷@ç ¹Š?¸Æož~^X×&:º`£­I›K›ó (ÉótáMkÜÓ7³# Îý?Ï¡:"Hµ@‹Îßà˜eœ ·OOen ×üÉMÜâE0'7[㮣ßó_ÔÊ/êøÊgiÔVî†-îËFEg…„¹aÐvŠí/q·*+<ŸµXbfnåwåÃ÷‘7BÎùÜn¡ú¹œdâªËþ"=>¢qÏVç°ÝÇÉnÍ;ðìvçuÂ{•ë"õ\Ï5œ²´uŒs.ëuvv•Y_tq>,¦ó\IÐj›:’¸°ë‚q±‰´¾¸ï°Ñ\ÚëVEW؉³5y¾„xk‰Ý×Uîlç„Ûëu²>É×èŒôÿÆÈÎñ—6Ó—(›õ)ímûK´t‰T¸b,gx³£õʶï§ëÑí;&Ï÷ýŸ¿‘LzS>¾L[ð çèKÝnˆ$zs]ÝÖy”¸±‘n*à÷ŸS ïOàÛ”¹ËÛù½"æUœÃÍ{ꑼ)µI µ—Ëø‚k±J:.†ÊnÑùïF >Ðy,ÑÌÙºç dt¾ù^ƒÁ/>æ:2¼fmâ•®õ¢ãÿžóªy¡2]„Žúð©kM¸ïú~[§}ŒÚãnºå+sgÀ9;GçFåüÖµ$ªé¢ðÖ‚ãëÞ¸Ê ÄLÌvˆÖ–úÁò+3 ]fü½¸õ îF²qêæZXHh‘õ¥qiÞ?<)*ÿ£cÄã]oóÛeB>ûN÷#Ÿ' $eSÂÓµ J¤ÆÍ̬º)Õ ðjÏ’º3 ¥·A4z™ÑCšãb=¢Ó)êÈ+Üfì&0‡}Ÿÿ꥚)0IN4ïL™Â,DxqP™ADM©0¡L$þR40aBë~Ë ™˜x:·ýÔM‡YýW@¤¹L””„A4s:áfi–¥¸£v«dZq©¨z­¥†Ç“Mn59¹…Ñ"J™ØPýw—ƒÛØhfnÞ'¢Æ– 3OÃweêuÌ©i¼É™»ª]i-S0¯(Nón5E“ä¥tm׆dD¸›R‘ÍÌ:p§?@J)#€h ÉnÈÛZ˵˜ZëÆÓ8ø·÷ïv»nA<ýðáõu¿ê²8Wƒ¡W„’EKéÛ)O÷Ã|ô‰Á…D§G"ŸºVÏÈE»Ð#Ž²Ç¹Þ¼!§ÝÓ…ÏXã¶OiÄ5JþŠ ~Ò©·[GtÝIrÝPrË ø ^~Žº‘û=ÚÜsù½}HkÕàVÅu´™(ÜŠÏí~åAõ·û77}?ùÇÇxEŒ¾RدîGËÈËiï·-æ¿^‚q× ëøYî‰Ç^''‹£7ÛÆAòM&Ò×'ɺÐ*×€MuxS¹9î߉k£µ7ÊŸx‡âÿ5ÒØƒé×ú‡NŽÞ™®“t]ô8ݺ…´½éœ|ÑÎnêsþ»¾ÆSá;©ÿ÷¥”û° [™à·ýº® Ýè•ü¥jS}KÄ¿þI½kÞ_ +Øò#¨ô‡,å7EÕG˜ø×ÔÛ·°Îû§¾bWù×ߨ‘?Ð5§YöÁÂϯóõg0Qð—¯?‹¯L}£êóŠÿÍ·K3ûmŸ¼è ™™f숳TdüN“’ÝàÂÒí/ õòÅY„Xf:7-@—’Oe‚ÓþÐÆI)3;¼~*»Zªƒt‘jaž +†(…Â8¶ñ0>¿ì^?~®»!bŠœ~øñEŸÿùã/|ý<ƨý§ÏÓ®d¦>2ÕФ’ØmT&…%§1?ðdVŠ}ô&‚H'Lé‘*I™2½‡­T-H²8v#Ûg‹Hs”nÊÈQøÉJ÷“>¢UÀ"KaW½€)¼ÐTÚÄÜGBðÙ¬] Ù˜]c¥P7æ ͳ£÷%Ð{;¶Å,Dg*’8`©< ¸ ¥»uä¤Á Å%ëåÎÝå DàÓ«Q –&l M´“2Ȥ"5QI¥|&v+eñ:™kxB}¼°î¬åèÕy)@OedXªÁš¤gƒCìžÌaÜïíõ‡êžä®fV Ë0Å„Ã/ô‚q$µ)5ZM–,EÙ³9 Ç‘2 B’LašXM…ÝG÷èw'B³%ìÊ»{º‚ÇN|Í"õ<ëä /Døu>Hx€ˆ³Óiò¾°YŽë¾t˜#s¦9‘È6ÌÎÄñÎêV´³¦_>Û ËO{ºy…©Ð4±É¹ó’p&2#]+¦dê/׉і¡Š{…·¹“>û³Û2÷‰›ŠW¾&š‡3 ¸‚Ï&ݼÀÌA§ÑUû€j&º™£Xyö]z<•B÷0o(FÊÙ=d-2±éóWÝ|iNh,c¸#ÌŠ»™ÑûË×_¾¾«:ù¯MvÈ<ù…üÆEª/¾²‘’¾ë.ýøóë7»DNž›k…{Á½ÀÊ!õÌ9aáYå4¼á(£«ÑÑ>e³Çˆú{ß|ÔÖÆQ¼>b¾atv±Ã»šŽÇá#¿´]~ÿþ~qð8wZ¾d&Î=gºp¿9–¸·gLV¦†×Ûë·o-_´¾é™vwàtÊV³Ë>rwV"ß93{ç½l¹íju6;Û©ÑC!Â÷ÝOo†)wZÃÞœ­Ó"*\ýëÙä×ò#ÇØe ᬮßI<%íÓïncCÊÈ×ÏëPKqs7Ÿof¤„0ËÐ8ÅaßÜòó/¯™1µ$³Œ°«ÅËe°fà§Ÿ3SS˘±§QÝvÆLî3÷)Ÿ_ð”´„šB,¥eŒH—C>¦$¤„ d"ÁCRÑ´ÛaW--lÐg´B>÷‘ÈjV]² )¡%RaJa(Ö˜;ù>Ĩ,Æ„&€bFÒaSËè­m<:'Ìç3 É@VÉÔQ%¬–ÅÕV×0 … …M Q!¦à„›D4±"锆*J–]ÂLy"]õ3@© Z¦Ôa6 ³:µ ¤¦q?/Þ²´†]¡W¬uR&) é^Ç)÷¯»P Äk5×øóÇ6ò§[KñÈØR„4¢T*Sb/$p`)cÒE)GjêR²¤ŽlR&æRTBNÌÆ¡(T!˜J 3LêQa_Vy—%{{¢ÛÜqßýiiÍèÅ•nçËÔyLjږY~ÏtÖÓl[ '˜À™éÎîÁi§¤£ü{CúñvÓò¾fèÑÙgúÀ‚¾ØM÷ëgóaëLµÕ2ÙZ(T…ÐM)”ˆA/³>J1æèV‹P¤h$}P?t… ”‹š2¥Lúü·®ï—ùè:}k†^Z„M†ZqȴϨÏzú¡4‹ýÏËK ––9Jl¡~¢eh†¦lJº&¡‘„Ïï( 8Ò ì&Ó Äì¦`$‚ˆÏ(´9Õ±`Öœ2ð4š¹™Ë ÍéJ:¥{„›Šyu–ÂæEVeªVƒ’äb1{ü»¿±1@/û‘`iEJdJ6o €ƒåeWžw©ÅuÅŒæÙëd©¾ÇД™’›rw­ûÚºÍOŠb´â2¥TÁù,æt*"3£E[§l‘™} ‚4@föïÿãl™/?þðÃ_ÿئæfÅÍœnkW“—£Æ t¦ß‡gCÝ·|E”¾ÞÓjkF–—® d¾ô V]ù¼@HœÍ…¯â"¬‘Gä­`«6ö å=ÖÀ;lœM3Ï[aÌu‡Ýu×áÖÀCáÛ­Œf*o‡Ù÷´mx›ð¨³ q{yð=Q߯ È_PôE©ä;BæGCq]0:6@+ æMYa3¥Ò†ãšÔÅwiFËêÒã+sýÓs¬|¤¤òf äÚùöþÆÊ>í¬LxÜØ¾iÛø7Œ®±´›_ÇâÇ ‡UÜav="nˆo§§×x¢+ø W铎Öñx`É}¹”qµÇ~[¹óK¸º÷óoZ9~Ñ~x3Fí‘Ø¹ÅÜhµþ5õâMþÏqµo>Iñ®“~þšz«µ|s®âÂký¹eãæ[Çöæ£ëÏ:sçzÚzó\½)ˆÝ.z=4îöÖ$ |QÎõ÷'N¾`/z÷í¶z­“R¿…@ZEÉ*g§†¼§Íﮘ?G,çå@Ì×ÄXëõ«wÄ_—ÞÕÛ{¾ÉœkT—/zÓêýl8eþA^ãucTP_·÷ˆë·>ÃfÐǧLk˜Ú’_žˆw§:úÕ³ ÖÆMÀèéê<ä÷Í;{‘>¿9õsºÆ¼^çå7gâ=±Êα~ žÁÿßœÎ;ô¾x0_׊î$o÷?øhãÄ_;O©ß³õè v«7çÏãK^!n7NÈ5oîVX³qBN|V^¸šÉ^ßå—˜ÝÕÚ?%hý¨‚Ÿ~4þ%ͼ¯ÅÜÌÌ(@T*ÅÂRK’ÒÅ~¿ÃøÍŠ}ú—Ou÷Ôþð¿eäQ •ןP<¿È‘vè*6Šc(üTz>«O“O¡&¼ZóD!“`(¤›H E¦´#‘&©%œ`ûÈâòApZfŠÀ®rG;(MÂΰp°¨:Ç|b »)æ¼%’ÜúˆpƒÌ0¸M‘“²s6DÙ ßÛÆ³W#Ô¡glaÚ¹ªg&ý™d“¾K¦`t ¹Óû‰ Š Ist -…Ú«b$Œ0e #ÕÝH)À®$'  RÐ2­ÅóSÉ‚Ã4:ÌÍÍüùÙèpº,#ÙÌeæÓ«²”a÷t e4M e2Dó§<ÿôqÀt茵WS"ƒ0¡:Rd0›µ†âœ–bÒ4—N³ îPo̤w¼ û«!nH.õÀà’¥P–L®CY0¡ì`™Í½/üD_}\Jèú%"ÐüšÝc€KïÿÑl–‚1Bj `Ý`uAè éy|ÁXšý¹”–²lÆCy=úñ.ùgà^·˜Á;4Ħ¬Î5b»ûp@W½!0J-2GÂh3€Š“i†D#sk‚E1ÏL Õ¡:èðœ~‘0‡—“)l§Ep®|z"&Œ‘ûׯgì$d1‘&Ú¨®õc h€AìxQ‚Á!D ´"Ð@Àfj:©Íô!8dð>bPƒ;Ћ»Cq*``tÏaº3šÓ̼¸Ù3‘&s6&½x¯ ØËD‘0NFÁ¢š‰4Z¢Öß}Nd-iÜ vhãç‰bV‡—ne`€Ù0yjWÊŒŒhéÕûƶÄÝ2Ë<†§Dfd¢”šŠ>ùסÿ@’̈l­? Ìæ×ÌHd6¥"¢SŒ-[´qê¿^j±bf.è?ü·ÿm*‡^^v¡6N»Z‡ZÍŽžÙ3. Œ‘+’ÿº§€ &Ókä3⨜˜ƒÛŽndKÑlP"K±ÞKï0u¦gÃ_æ1µ…õntÁ€&b‚#AN¹à3šªuçúWzÅaßi-Œ„¤:Q½…\ Á¡!%aŒÎ¤QŠ to‡˜Hq‚¹’R"çàªëŽcfÀîÞö*;%2§æ;JSF*@¯OSjD+JSîŸvÊûÙ&YÑó Zêð ‡Ï0(¦ƒJAŽ˜FÖ*£Ñ%°æ×Ï µ=ê…‹™vO7¶DhVÓ#»VR°@h9C~¦„¡{ºžªYÌQ;笰?6ÿäÌñ/0Çx@4Xwñíu‹cE§Kí 샬;ä"ß/wÓ±ÒÀe ÛÑŸÖ›­ƒu³ü1"1Âê‰Y_@ÿ”3^a"&)nÈœ‰û|ƒu«a°«Æýûnž)ëæÙÑŠYw§nBسgNÈ„dŽ¥Z !õ<¥lfÈ±º¥x„%µ+2c$„ÆÃÄWñFæäÕ̧©_Ϲ{œd)URf—þs!ïõ€€ì#áÖ-I-{<Š©ÅÔÚØ:íÍKñZ†§aøðà?ýçÿÜ )œOc›¦öòôäf³”k|(¯X ÞÒ¶4ü&ß9v½N2ߥßõ½o¿é©í¿|}Ãó7¿æoõ}ëÂé÷ÏýÞoNô§•C][ŒœƒŒø[bøË××/° Iô/×ô7²ÁþQh9ßï¦þ˺úcGº^hôÇÓ±•æ Þû|àäÔáY‹_`^•ëõP°õÞCºá´r¼“ߎà¯ÍL/KUç¢8ßyX¼§!žkÊW“YëŠmG°/º½Ï«”½FÄÆÁé ê䣪ãU¸iÕDŽ+7­µÎŽ•1Ðø§­–îí¡[ƒ<7—Ý›èºÐ} 23•Ô©欤ÉsZÒq¤ŸgËægÀñçq¡oð] üqƒâFÞ°räùïéN¥äÖ44V³©§†šõøÊ {röo>P—)ë¡¿¼ am?ÅýÿúùSÙUsëýUŒ] ¥Ó˜¡Èdf‚¦ñÃðüáw?í÷‡)5‘-²Â_¯‡ƒ±ýUȶcJÙâ„”"ÞŠ[lŠf†díGxJ ¾2=¬Pµ$@—LK)º0d²PH!ëÐJ×>S‰€”BºzÍ,`c†’²mg%%œÔz¢ç{•"³Èœü¡+Fó†”I,åŽ ´G&†1±ótÃ~¢€‹}IxÊ€ ŒˤÎú`€AE”P€QrWbBÈ…¦Y÷îïÛ„)˜”’QEÙ_*¥£u'M½b´xz)˜²M­~ðBÒL>Q¼¤ÚÔ¦¶×4ix0915ÏÉ“9Ú4LŸ"“2T&”D£tüŒŠ$2ë£F"af™’´@r2• i`§©‚£%d` Ú\eÉÎ;"":?Ñç€Y;î]ê]Lç‚Ðék?¥Ìÿ~—ôk—: Kó( œ3â~®ØL½ïŒ %VAq´µ™Âo±3Ž`]Å_}3á'gNÑb0«ÿýÇ"á…V(2é9Uzª Ñ”p›"@cñj˜æ¾!î™Íè)ËAX)@&¥8ÏPÑ MððT‘ý°‰Lt»Y ^æï¶ØES¦^eD"•“cÒÍ „& ZÒ¡ª‰Ö)DŽ Pp!G ¡rà ä„l3æmMH´ a(>#£½‰~Û—^Ô!Gƒ‘nµš›&ws+æ„©tgb+$ä‘6ÉlRqLµ¸›knFÓîÇWeMZ¨”:d4Úd>–(ÏOÏ$Í“†–†{§1r€XØQn,UC™"«›2Ç–^ØRº»»gÄò¸Ï^ÂÉLïÖÜ™±~‚D·ó"2ZëžIˆˆÈœ"¦–‘¼z}Ú=ÿîC_Éÿñþ¡·ÈÎíXRF¸‚=ŽÐÌö¹Ö,ƒ”° ²ßéI)nõä}\/÷|`v™à—H¦·¦ùP†ôž€.zQ¯>Ý™uò™ü¯‡LoE†¸aQx/—¹ë ¹&´Ü:§ïŠ7p£o»ê]çJúæÐŽëØm3ð;¿3¶¨_Ô ²øÁn/Åc»é ˵êþMœÏw‚Sæ"ݺjç‚_T͸BnžukË”ßL•Z§Žñ9¶gb¶§^îœü•Ìzvm5ù^ŽY<¬ïð‹W±5‹°–û¯¿ómÚÿµ}IÎ|é7?ñÛÆã·në•{Í•áôŠÝô-kXïÑÚ¶…ßG^a¥{\6Mo‰—+üöžÌ‹ ó×sÿX  oUYyïËÞkáx/]¼OïÂõ~¼½«Üçv¼J™¬zÿæx‰”<îWc7 ®Þ‚—Ö­½F;Üj¡~ð†]cçyLÎ?óõŸ«(hþõ¢#8¤“°ÅU6’F&­YyÆŠÁ¹Ø¶}¼ó*ûOæó÷#Ý«8t#,?Ž3h1µ'n2ò¸ÇÝ|žÕ’ÌpµOÌ J]•?wÐEÖt/?XÀÔòЦ:›‰ç”«á©ÕDøåb!Î\Ö­YË‚ÑÖáéöD±®¼Ì¯–„¶â[ø{žOCßÜ÷oÝróWJ\ŸØeðwfÄwˆ®íŠKT´&²n¾Ý1xâI{ÞFa>èf~½éo ÏžW•fà‘¦xÞá½×öhâóü¨uÍqº5\¹ÞúNh…Ón¨{ÁîèòX9xÌّ럘ëã?ÿ<-tˆÏŸ?–¡z)æNë,ÒlSª  ¢•q?Nã䥘©uܕן?þøÙ­T½>¿ Óë…cÄ¡xHùQå$sÔ¬- »LN{iehž`c“s¬²Œ¨(OÎÒ¬ETø~Dc¶D y官À"aÆÝ^èSÃh*bÍ8Ð&¤LÅðÁʧœZâƒÓ‰”Ð<Ãó™ÞBLŒÔA)!RÜ8ϪqŸØ7‡´Cz™\[ZKBŠDÆ31Ôl¥àt0§W!X`Dg…«-˜MhPr†ädgÖwK½TÌ„ Š´:T?;;üxœÊqºp fH%Æ)+Lˆéc<ÿ΃ Rzs µ•j¥]\¤ñ3(Dkð:7eÇ& dˆ@g"R'­Ûa cAì*Õ[øMR¯å@4dBÀ@ Ì° Â™±¢Ú¬GS`Yr6[ꀦŠã$úLÊ6ß ?·ä;Ä“¯-2ýœÿ/¦¦~tî]:†ŠùC­f8úÏôºÚÜéDü ¥;­h®Xt»c L0’™ÊI6€¾€wڈݘ0N½|ôI8I² %çFòH—¥")ÈÍÝ9@I¹" ̉¬)šºErf×ÜŒßÑ|ÌÉ™d¥ó¯àTä\;7*F™% Ñ8Ïz˜JQW&CëVÙßÅ€ –p0Íê?§¾´ÀDäì#ÒÊ*06Àa@$¬ç†àNi3ÖÅÈBÓŒçÎÑ@˜Äf^}çY@+Þ eôÿÆ„=×4ÀÍsWvn¶{"i‡PÂŒj3Ò¤½˜Ùßýý4.‚æµÛ †RºC²p|sÌâë%hë4û`+Ùê°ØÀjÉ?V^É^kÕ¢‡=þå !²üúZ–OOÒ;‚˜V 'Ëà0°=g·¡ÄŠk*ž5Ù\Ná±Ye©Ó/ ™¾ßš/t‰wÂs7[–âÊY¶r‹êZÖ”¾@îÞÀ Ü2FÚ¬=tÐR?ú⦑ËW¾mþ¥«ŠÅ©Ã⸘ߔP9/[þ—wÆÉ‰ûŠKu­ëm}ç!ñe•˜\)ÏLÎà¼qå²ÇNo¾ãEÌ›I÷jñë‹jvëMéì3Ü©—ëÝÓx‰9¿ÝðµmÅq^y:y°­ÖÐJ˜oÌY6‡6EºkhÏ;˜ÃÇW¿á pݳ|KÜøÈÚÒ"ެÆ-#ŠÛª¶·ž„óïž>Ðz«™s4ÞY~ïS±oK½×÷ìiw|ä^¸¹ÿsµå-úØ#Ï‹+’íWÕO™éü(×-ÁêñbÀfü¦È¸¥B¬A^·–ëzµ_Ø<(mÝ!üÜÚîÖ¿ã9¥¤«rÖVöˆÜáJ§˜»EO±7×ÏEôr‡¿ôg¿Ø^/q­øÜÞ®a\›ûÞµP~£º¬« ák*úzPûu®ÅYLö…7j¢Ös}pM±»Øsß,ª}ÅÀ÷ªt=và_]ˆß¸uçü-ª£Ç½—`ŸµœJ½1àïuvn=‡îìû[_é¬[O>n®Æ« €wmØëëÇ>ÞÌ·3__ïÿ|–~ó½×æóÃE¹YÁ|þý/SGÿi~DÿÓ:ºAm E÷lÙ¦¨;§Û§Ÿ!–Zjµi?=ÿøaz}ýçÿ×ÿôã_½L‡)Óv5^?OÉÈHÚý#01€Ï*°†1•.!Gf ?X™¼`ê„õ6}B|rímf¶´ÔŽ,Æ.}z‘3ºÓe2Õ˜ÝQ™ÙBÊt@L’Ɇˆ(z?± ‚˜” 2œmŒe`‘©ÅÀ0Â$MH!`M¬¦ Ñĉ.È'; …tHcª‰“D⩊R‚£÷IÏ´9·¯ËÄ&ëoÚÄäB·Yºu`® ¤x6>ïjÓ”’ …¥eS‰F,ŠIHÈZK‡Ôì0¶qR+ §Î8êÄüqD‡ÚK#ZÃDppä(¥`î!ç\ɧƒKdi®¹Šì¢'Bª6+éN  “ͺó`3ò…DÌN´(K³?8“ß…Ó»õ±¸OŸžÇœUxOÀ0ƒnú%èù3¡¾?~r¶èdñX½8‰š­Í?ƒ…Ï•o¯%$«*r6s±Œ³Ïð÷ŸSòe†J„l³‡p$¢aØÑáÝÐáíÝšspZ3'P^áVÔ„T)N·ˆ&4ƒ– ˆœú¹6WbìW3‘³r¢¡j…:Z8@t~V‡")\hsA¥Û_³A i@… päL `^@k³Ñ·d%ú¸L?±•³7C7dΜ=Šû”Nš“fœ^XÜŠSf2'á^ªé©ô …eD£1ÈF<—လ §~Ì”I³×˜\îÞÜÔ¯(½€³8$c(2·TUº»¬Ä਴qÌ~ùáÕØ2dÇÙ ®dæRÆ2Ðëeæž½ý_žŠŒ ¹R‘-¢E¶ÈH-%Þ§`¤×òïÿñ>üõOë6€%šÕS¸í|P2×õçoðN~5\<k¹º-o+k_W~s:âÝhæ>²ö Aú<{¿þ}«ì‹Ç²Ç•¼‚ïqùåñ;\ËG'n/ÛoéíÉþäw¤úß0(}ìÜ}ËäÿkÂÿïp’Îÿ7oû}PöZI®_`ðÝćï$Ñ·_Ÿ÷²Ú?Ù €/¿N}Í7õŠ¿ €~Å-tCý³Ÿúk6Æß yìO:ÿø‹£ €ËkøÛ¹7¿át޾ô¹U.6±ë{éì/äåhÌçùíñÚûëØÝ´n þê'4¯†‡O÷uôð¾wßôWº5ß}„¬êêØ46ÇÚ½‡7"å»ñÓq`Rs5½þ¾ðã¶7Ú¹+ìÆÎ»Ž!ÞµƒošEß+lÍ(|ƒ¬éºvñ°û7̵òǤÓÿÇÏ8oMz?(®ú(OŸvv‘=vv5rÿó§ñõЦhô×Ï¿,èÿyÃ4µXI éæÕSÑ"ÌŠ?zÝýíï~÷oÿªÿßþ‡ÿG©<^§¦§w5c©2æt€™­ÈÈ!œiŸËÔ1÷ÞLÁ‘‚G@»ôCƒ“Å*ùIÀCûT&ªü‰þI1F>ÑF$LhÍÄì*mKv÷^0Ôk¨Á»tÍ›•t1š–…ËC„3(›ÄÄ”™€ÊLksU¥eW«I¨RhÊ$S"!R‘ˆn%*ërÞ´–ºTM ¤IB½?=ƒeŠ-¡@)8áR9áëpT_=oÝ\K`¦þcÊö(ÿ°Ø„÷ñ‚e³Pi4Y–ÄIºå€8(ä†h¨„ƒ€,‘Ý-6É>f‹?àÜÂ|šÀ›ßQóÀ˜weÐD2C`VW6a daöþ%¡˜áK-¡<15P¸XÛ"knHá>׎æè:Ö ¦¢ß €%"à>OpÿP'\Ooðg‡õ÷ß 3½Ç Ñ—30§ã€àPÀʤ#™p LdïˆûïMÚp‰èÖÄD›@‡ϠÁ ÔÇ씸f@£X&+³Ï.t¡€.(…Ih€ÌKSH¢U¨à:MH}š>“Ž2æÕV*й=>_ uçÞÞý­yu²ÍöÚR˜R"w ágBÅ<Û=º)7ÙÛÿcñBÀ<™Ñ¯Ùœ8H0:Ù}qÝèžîôêµ÷Bë΂Îè‡5cmŠ—arM»ÁÂòáCºB¨^r¢¿˜Ë¬²¡À8“¹ZJ ’i.1»iuάŧðR¢Ö~?a¨h)P™ýl8ÍŠE4ùÎu’$Íúm3“"2R2I*Ó˜‘ѦÖQ?Êœ³z‚4wóâÿþÿáå§têñÓYÈcœÁ‰ léÂãûHõXZÕÏ$Gr£pCÊ׺ñvïá6‘ñºeôÝáõCOfn<é×SŠâºm^«ã«ÑÉ|—ú-ô¿·óñ}áĺ1öJÛ}°Œñþ$ö:r~óNñ£Â”Ý–\ßîºÅ–oí×è§Ëèú©{ìdÈ´Y¿»x/_õ Àô›´¥›âªú‚ös>ðý¤§óÌý+5rájjùKo²­Ù£+½ïý·ðÝ?ß_µüõå§ãÖÊ:`¯öÞÍÀre¸t\t<o÷̱¯ïeþúWä;%Ýï½ÐoíÞ³®ó'`oòÖ)ÚjyoõÅÍZYšÝ¼°(YzÈÖûbÇÖ£F˜o<}U|±q'þÉCç¿yèAmùV”ˆ+sæ÷< x1·wqÝo̦<~ð,ÙE¾&\,Õx—‘ðñˬ‚‘k`ßœò˜]´æÁç<-ϳZÜú¹Í7õÙm›—aâ1å‘.ƒ=¨4r|žiË"|ô¶¬®šDŽ)؆wÙƒj–¹†[âæ¸ZŸé^¬l­­^àj}¯Îý¶aúÒÿÏãøòyCÊÚàøúêiòÜzoöj5©½ŠºW϶­ªÒǦMmµ G<âºc…×NæÇôâüPWÑ.‚õ¸f«œvç¿øá›Ï’ òÏò£×X€· -%áâöþÆtñÖk;„sªní’\Pü[Y#€dK­®Æú¦Ó,;¬7àŒÒ…¹#YXѺÄ?íÇ66HnöéÓÏ+ôÿ '`”™D¤»Mûñã?ýœ‰ò²›>í§Ï¿û÷ÿæ¿þÿç§/»—çßÿó§ýôixöÏûƒR;äA.8Õ¯°ÈÄVa Œ%,lôæÁ!ŸÂŸU?g¦«Ïn Æ}¦%+Ê`i°Dj0s÷îJ„´ë(Ž"Œ(,YÝ&K3ôåW„*Í„LüAá ÍcTödl¡)É6EÎע˧œ¥ÉLŒiA3Ê”“6‚–*HJ#™¢§‚3ÞAdžIÓ>¯¢ƒ%20±ÍLöìbèêâ3úïž”ýû~¾øl< …舠 Ï¯£C…`NÆ:Ôò:ÆdÉ€ÑÍÂ[PûBEBB$<#À0 Z¢5 :»^dÀÝhHSf}γ 0iæ” €¬7õ³Ó¥àPq@(‘s„èÃ9O5Îå“R€€º+€ƒrBJßÜË‚êªçò(î.­aꮳ‹‹À¢Y¢”Ù8ÛÊ •èÐ"ýcñÀ"@ ˆ6#ý£ê¿h¨ƒõ;2¸ƒ÷®ËÒ 'ÜgOuÚ¾r°2{Q°@dÂxÊ¥PBÙ1S‘Z…™¼ Ô2E$ÒŒ%}R(šf»‹@=í| 슙YÀà>8kEaÛíF¦Ap2N)ŸÚQ†ܘÂSBð$0¦ÐsÉ¡$µÒŒd[ä¨@Q1A㵄H'IdfLSߦÍÑ2¢Û({Ø›ý ÒÆ)#çöÿˆ9Ü/îÅÍ4+öÿýÿq®Äi±~9²2W¥@£‹—çiáRi<“¯úØ•6¥m.½k ×yÃÊY|jôÀE˜w|æ®ÂÔåùÉU| {tI6\¡mÝìË<î‘[ô¸ëGÉ­u«ó‹«k"ÖÙm|uGl¾×ý›åÚÍq º%C­ž\8Ç éMÉz #Æ5{e/\E^0··ê~Ðù­{æÝì7«7ÁJ×&£›‡ ½Y*þÚšâí;ú¡6”‹Ï{ï̼£3}…èʪ‹ic#»¾·O'Ž_wªîíæ_ÞøÀs—íËù$Û7˜¸÷”¾ø±¯™XݸåýÃsÀëöÒ8›àš}ö–OÚ»Îã±ò¼Ü|§Ü·;›¾ë±M•øV3~“›Å‹+wbúïþa4=N•òã?ÿÜ“R4~üøóýLvÍ:j&1NmØíÚ˜¼È²E›¦ýþÿõ÷ÿ¿úX Ënø¯ÿ²}=(óÓÇÃËS+Æ2È Z 5`´ç'‹i’=™Šq4 p¯VvÊ© ó³g2L`q¸5A>íl·“%ÈL&&dfôL…™ïOÄÔ&wš£5‰¬UT‹t÷âPFƒÔ¤#Í)3¥tcÎMý–‘©€§ÌŒ>ˆÙµ7/îµ–]yúáåïÿáN‚8—axް,¬<•„/5»½¡,Ÿ»»®ã¬77‚ØÛßkÞð&Å–[%’Í €õ™YW&.:®²6ÝȸÞ:u5‹¼ët9Hø£M—oõÞ´Á|p`+µÆ×O|ÍgäW²´±>ã<Y4{s€ã>76‚s q\4ýF¾.ËT—Õ‰u3Y.H¶/HîM|¥pùGLߎܯ|ä§áªwLàÎÀàû=I¾oú÷è…x¿SÆ·žø~}Á>ù=&6Ké:C­}Æù¶t¼Ÿ~õ €/–fq¼k–¿Ôe#VˆcsÃÀJ›0 9M#SL¤~8`‘€;(€âd„ÛMhKGÈwuž4£2jݳ7ÄÕÇ zšèe¶Ä5¦È&‘¨$©&6ugVˆ&ƒ£uÎf¶ÏÎaKÓ–ÙÂÖz¥Åjh1Cÿ™gæõ½±=w~2“KD°¸þbAÍØÊ0@'Dl¶“]Ya9*‚>+þ§á€´Ró¦Ž )Dä°Æy!L À*¸, s˜!»s/ÁŹ¡ûQXBÂcáùÔ"D ât9æy–㓱Ë׫ñ–ùš²Ÿycïê‡ÑÝÜ ŸK}|XkFnÈT5¸ñÀÌœIÁ´«Cj¤'8ˆi†‰±³6xxªÜÁͼ÷Sã®fA“©ÔLµÂA–áŽÁÇ€MQ»•«™¹±Ö©µ4ÂÜ"""3͘)w>æØÛw»â™ EkøÓ¹ÿZ˜nèæîåixþéÃøïþáBH>3¦'ºåN͉ڨ¶Ÿ2º#’·:Uç¶úU¨òÎ^“·Ÿû_ÂÃÝ^É·_è( ½GeÁÖ¾ntÚbtûP×fÂ\×Î:žZ»'øGŒ¾¶/u»;Ÿ¾VùW#Èg}~}ô¬@îå—“ë¼.|NßN{z^ö묜¯j9ºùaΪný/™ ÆñÆû“¾Î7òÆÉú"ñî‹ï”#Y§Í«ÑíÛÉ1ÿ8¥©‡WŽn]Í/¹ þÕ#ýoM®|áû«ö¥8$ÞëóØóçOƒÎô[€Îß_-o®±;«ëÁµ·e¸ñ"¸‹ ßÞoÍ·ÝÚÿï|ð[M-×[ß¶õzìf™[96´O @Yl­y[6=}ìS«ô¥å õ)nA×s(祒•¾y‡­ç  ›ºÿ•úv»ß ±tØÑõXÍqÒçüOsŽ÷$}\èù'ycÉ‹Ö`¡Ž|ž­Ù.¬@ó ôqÎw-Ž/ƒ¦«7N£¼| ®àPs¦$g‡×d‡­„Õ ÓEZ¨«÷ê ß)‘]b5Ꭻi©{Õ6«ÀZ/³UV m7‚™ÔÌ+‚âÅB_Ï\cÛ×nZÜq?Þ q'½[.øvÓJƒxK8Î{Þc|³N±$G6‚ÎÓ€sÑ}}ö%õ•©õL´–û\ l\+ðÖ%k-¹WÍzI‡ÿWŒÒ@r:Lm!˜óÓÇ6/Æ¡VÀhaMF²ø!2¡Ã~<¼Ž rlu°é÷ÿïö:øó¿|ôÁ‡ƒ9š+Rã¤á`´êÕj0F=s°]­V|ðÈ0’“>c„è­º‚ZÃÜ™$) `@æL›áÄø¡0€Cæ`ÁvôJN5‚(SH°:³ƒ$RÄþ&êŽ^ìÙ2<ÁÆ&—"Ñ 0ZSŽHu¯ZZÊ “0i’ÌÓŽ™¢ ””2šsW8 ¶¥CU º§9&‘F3ÕÝòV|î6·Bxom…˜H¢2`W1~ÎÃ-˜5[;/œvð˸üÝ–™€>»Pk’á ©VÑáÅKúÔ¦¶¾ .j/ú9o@Mszïšïê°¼Û04«îbc&HEºÁ|¦Ù´†:ÐŒ)UHI( 0N™˜è?3%º‘€!Ô ¢†^{ÉYÕÌ„DŸÏKj±ÕIl›/ÞqÒÛæVôX¾o<ëîµÞzoËÇ_ãLVU³g©­05ó(¥,C)(mšÆÃÔ j-Õ}B‹)E¾¼<ûTöÚFöJ†Í ¦ùµ‰²CLèŽÖ$Ú«¤÷;ž¶+¹Ÿ`"G)dq$‡Óo1-;!2zņ¬B­f¯ãjÀî4T¢å<°;ÇOá\¢ aåx6¼k÷mæ&åbË>—j2DæR5éØŸÄšßÛ’»g 3|ÆiFˆ¾3áfÕŠW<®e¨6 >‰Élp~ hÅ”µ aô¡°XT×”¥Ö=Q’Ÿö ^ª[£adLÕ¬;ß%Ƨ:Y¿"”y*¦–`ª³ŸèôLa23smš$"ÙQ€»»¤™ÁÞ_ºÀ;$u­?Z뜵œY@˃ÆÝ½¸³RvžNêÿ*êá<ŸÓW»-Ñ3Ïa&ºýÌ\?ã.´Ñ«@w5àªNR+yÃ>Š<32»Dàî€Ö¹Û „³n]¿ ] vÇÊÄ*àáñDœ+àWq¡ÎBd®³ \¾õ(é-¿µE¬¾àf¬s žG’iˆNÊÛÓå'6$gË9ƒל“÷dã¼ßw:=—xåš p…²%.04¼ìáÛ¤ \ap.@Ç—=¦,Gô ¶PE_)]Ô{6cÑ«.æmruúÖäßU{ùR÷gJ.ÇâOäŸu0ÎSÒª3 +ÐÒ²ºQ 8¥¶Ë½ûH£Ø-éä:ÙÜßxÙ3ÅcíÊ 3eê ‚›ø½aõq~T›’ß–xtÊA°½·\ª7ìßš¼¿ÁÝQ®ï °:¿ux§a*]À£Ö{ÛÆ)Þ$Q¬`_WhV®Û©Çvž›/Ï6­2HQ*Ú”êt0JÛD¦û“ó­é ýî8së篸\« ’Õ}½Úzàž´†³:÷m1ôuä¾:yuBÎ~äz~e“åuýýÕ2Æš2r tK'|·ù‡.õ»YX:=®oê;ÈúŸW{/W9¥îWD.þü³„Îo¯%nX.@IwŽs½®÷ù ÀÔÝá’³|sÕ­*îéÇ–'oi’_ìDµé—ù55¨rÿÍ6\_Àq Qò.ž¡.¬x£°Ï|ñ¡¯âÚ‡ïÒc^w^X%”™Ò•ÅÁUXpnÑóN ¹ @oï›sHz|Ôo|=ôÆom'ݼq9î•o’¬Ö ûx wc…;ã#GÉ/ü˜ï¼n|ó[õ ñ[7=è¼ín+ܪ¿öÔ½uÝNE‰~TFÍ8˜ÏøØÆ¦Ÿ?’[‘)¡À«[ Ekn$R9îÇÝóŠé°=Ú8}ú_Ó Ó^S¤±|Þ0¥â0ò‡Jš Å^÷dØß~ðžya­U¥‡ÃÄ×4¡ õ‡f‰2iÿЬCÃD?µ8ª`‰H¢¥d,"ƒl{•¦lȳƒÙ”íSjèJxã>5CAܨ§¹å¹!ƒš‚6iôÌ@JC²ev‡º€Фù&ÌEˆêÈS)ê‡j%*U ÆZQ~ÌIÐÞ@ÙÀò,5fØð /T¢VNSÛý9"»i˜F(Q ¹Ãáj+ Í:µ–Æ-ÓG´ˆþeùK”£-pB’9j!šçŠCÂÔ€ÏBC¢C~ N´˜õ¤ÈÙ}wÞî Õ¸JDLA§•R2[7n­…ÝŘP)<4IHR®L¸q U©àÌáÑÜ5Ž–L"¦„†Ùívlˆ†Â÷o†4`fì¯5…„rÑ”—êÅ hvî=æ½± ~N•»UØ´‚}]D+GoÙ|r–w7¯6M“Ëà­¡ ž™Nkc´V9’(u>¤ºC7an Ä„I³_®Ž×^ÈP©”ÙJ 5uq¿K(ãŠÈX‰EÀ|ç eFÕÍO$Ÿ‹³ŸAGýø<åÌÓ]ÓŸIMG+èþ¾K•Èë·ùÒqÀ¸G©ð:ƒþûY?šNÖ|Ç¢‹gÇ=±-¬¸9Y­˜-ÍÌ On»j»j¥°û¤ÓŒÞ,úÝÕvUƒ âk;<ùÓPEŠe><¿ZitV¤¡‰0¦[Û•,¤” prOÁ3hÖËHfÌÌÜÇÔÌÌŒfÆiŠî ÀK‘ÚÌ0N)"#£üNÝæ33óâ,æî»žü‡ÿîNÅþ“Ûu×ogNøª‘½Šzpº™w^#é×Áó¨]kÅ@˜IbÞµ¼ ÿ¹ˆ¿¤·ë~VsÑf³j¹9%°zö߯O^u5\у¸Ûsü=Íìu,ºÕ±ld3ûíÝAÚ郬|®fd¿i“ï]‘ôí €G„wI¤u,lôÃüª\8mÔè.1ñ¼L×ÞÜ^œçUö´®ÝПøê¸üÁu~Ý&yÚ€r-Ý\¿rŸÙú¢¼ðçWEï½²ßià[冷§—6^~©r?’[iUu½ê»1pf2sûœß5ix‡ÄöžçØ::ýËÀûʱw&6ë(›HºwÞzzDœ|{1lOð[LÜ.ßóÖÐùÛT÷_}à’dó—¯rãzéÖ×7S0·Lw¿å‹_ÚÒÿq“ôæó·úl¸Søúð÷8ý¸Ãô<+|˰ã‹ÃÓ_ñè•kô7.Üt¹ÌÀæÊ¶ÍM™mˆiÛT‡¡%|ð2 ^="çæÓ”œ0‹D!ÍÉ`ÝU/ååÇÓëøó>MSK9ÉÃ-ä•Ðôº¼üð¤qú—_ø‡_ðáÙêàµxyyÞýðl¥Næ)M­eµÒ„qGŸVÇü È† ú|`»4Iƒ3Z$¡=˜™OÆI2¢ f}‘x*Ü‹£ÓæS*”HVÚÔ²… E€!$¢ÉûF–œB&Í6¼F –j<5Ú¯«í Z#?ìò‡¿‘WŒ£FY†ÕÂ,™¬L ¥6ʰ#ȺcÙÉRSh7@‡vHå‘2Ð\€d›TÕ:»ÎöUS Z â¼>×eÕÞò¿©©ÁAæ )'L“ê0M“(»ÅÀ5Ñ&ˆp›]X+‘ ÍJ®MÔ‰8ÑÔa/9ex±ÁihÍÙX«×Á2Ÿ¾¼ìôi¿od ? ˆÄ½_^¦@±NØ—‡ œH (D“`†IØM¨„ÙÙC+Ÿs'~×ĸ8ô€;"æî~+³èß½ˆ»+ÀìT¬cù™¬¿-r Csn“'ºþ›½UÞú‰Í6…2ën×Ú”Ñ2èÕZ‹hÝ5Ø2ðù—=™ÅŽòº ÙðgDÀ P†y X™W…“‘¦ÈdW| È\¦Â’0)&Ø”¢3÷én¥x33“IC)3îßü伓9‘xüì}"„@ —®|륷˜ËH]Äo±˜-;óBŒ4˜¡8¨ÙaâˆÊu§µVÎçºÍoŸÎ©ª³Å‹;Í­X¡åÎY«Óž!V7S#/…Sîô¬ædC|xª ý´ÓS}ÚG|nåe7z±‰i !i!kâ«1#Ýk'BÉt¡Ð2S™Oµ©TN-Z4w33î®ÌÝ×nŒÈÌ€™­ÅÔÚØ²Ef´bV;îgÖýüý?üãé9£ ÅyÅÚqh±«ÿßþñwnÞx¼N+•mhé½1ϯ=€ÿÁ‹¾ct±áÔzñœ¿L‰Ï-¯Þ+ºžÑÛ{8:.äßþÉЗ.Úïugüi #6î%=`|½RϨoš‰ñò7ýß“pÝ{ûx×€?›$ô_UÒý¯äë±-åÛn¸üíûO:ÿG_&wö½­fëïuÕnÉé] ìjSô|ìž)Ø®HÏ#Ô™Šœÿ²Ø¥Š«^ã­ÙUÜo ¿˜EZš•ΞIÇÆÝûöͼ~œ7]¬NKŸ*ÃÕtÒû/¶Ž‘.RŽõDh¥ëYiéj^LPÞyßÕô7ÖƒÕ83õå:¹¦€iÇy¥£úŽÐ|ªµ¹ú¿`?Zʧe³~ç#êpµ/ë¢ €+V×uÎe­¾ùty³}èâ"®Æ·ož®ó³Õ§¤5èœçu1µ¾}λ9„s÷6Þ]ñw@ºÁ­Z´íéòã$ñq¸ñôZ—D¿Ë5ÍÛúúnZÀý¼ì [NOWÊú_>þóÚØÆ©eêó§¾@3Ÿiç}"$%F)PæÆ:øÔ¦8ŒÊôjÿÏÓ”œ¬µlSS*3%¶¦Ï¯9§0¥hVßj9˜}ú±îPKd{Ç×xù«§:¤OѬ´Iã;š†úºßfK¼ÐÆÖü­%³7×Âv‡ZÌìs4Q½É=º¨írÉÈ'ØkL*ª@DñUkƒs+4¦ žr²I)RÝñX-‘ò“3ô%fŠÉ,ðr©0'ðô’åî~Pöå O”¼žêS&?~Îiôùv;¨¹›[ÿÅ·j¬FÍ^ÓN3O ¥ACݹÓ'ŠE!^³Ðóå)ŸY¦–i0ÃsÑK Ú0%ŸlêËF´‚&æìle>"G ¤×*e‹ ©Tß°³x­•d‹–$Ýœ…Ù&fœÍÉ#!åÔbjmjjÑÓ^K}žúÐWÙúÏÿåì)/`“°yz6ô›à~{%¥HÜš>sa?`ãd:#9gúG†¸×¡øÖp­ÎV@ƒU Ísi›—àž®+ åüˆåV\. v:‡òø™ÜØfÌp{R@g¹+^à5ç¡p^«¡P^)Îÿ3ºqô ã"-ZÅkgÍûÆjŒUo%"ï¢]-È#·Gw(@7’áK<ÑÉgQë„NWœ–{G«­xír~¨ÜLНûÓï.uóÛ¹á*DÕêBŸN'É{<ÛãÖݸϽãùs7¶>nýì`Û8úŠQvž]­#ß3B’§ýÆxóuäø—µ† âÊþðF®§¤iKC¸Ã¹½ƒº_G¹i:^øSrt§:£Ùò:#nÐ̃óžîãÆÍßÀÉX¯¿8—œNwRÈË›z=Sòˆª» èãÖ^±ZÿöþõK’$ÉòÃîQ3óˆÌªîÙÝ;;½3;s ’ÿÿÿÀsø ŸxpA€ñ˜™®ªÌw3¹ü fîæîæ™YÕ¯òî®ŽŠ‡»=ÔTE¯ˆüîõ¾˜ÍŸ:_Öxiù¢óT¨ «¬Éæg]è@³e+ÝÞˆo{ºÜá]\º›ŠÍ¦¹$œ­÷ä¬ë|}[/&ð õ–µ¸.xS$¿X»?Q‹ÏoÉq÷süùAçoíëá}÷ÞÆ~«ÅíVÌüÈ]»„o¾Õ7I*ßAmKK×íjöž7íñ.Ë/éâi—”ó«}qñÈÝjîÞMÊ[­4Â#ßšüO;¯SÀÅ«rû»#(3¿aBl3èØ@ñ|ÑÍ7yç0?S@ï_¿;KìuÀºáûJj¾J¹ü¼ÉÞÁ¿¥JŸO7©–÷Ì,§Üƒ.w õ«OÔ-Üê›ÊÃÆäû•™ìÏzG}ÛfàKÞ\À.oÖfòê/ïóy^Ûrñç'÷ áÌâˆa€"ùòçº?ÔiÊH‘p“q¦T°QÏaÆ]ߦi§xÝOŽáãPŒ¤¯/‡—qÿzpí½”Ïû 9ºï?½îcšâõ`]áÇÝP‹^™P×íú¾˜ûkðYöŒ®×Pœ¯k-1ÕŒI”ùнüëÚcŸˆIšÐƒÅÌàŸbP@£AšRôä¨iNÉ“D0MÁÏŠÞÔ‘I¤¥Rš`Í ¸Î¼ø"‰p'eY•S{¹ÞªY½6Ã$Y m ýG À¾ƒ?«f-õ%ÝY†§õùdÕËhÇ ¾~(1'+”"d4Ò½M»‘p*™f0XG&ÒŒÆ.3[±{Fš™‘QÌ»ÒIÙþ™™27df«I‰È1ÕkF°R¼+ÝÐ Ÿþã?þ®EVÅrµ.I¸Àóz¥ßªêج¢8.Æ+bÿFÕÏ1š8.wsèz¥#¿«Oÿ!ø ÕxQ‡ÎÎ÷*¿•}¿,¾8cåg OmUdéáÍùeåÉ-ÕìÎeÐ:dйiöÝéÍ€/ƒ1^Å®ïˆÀp¾ë¹¿ƒ¸cSq‹ò+Ûc]íù;ózC±¶¡zªûæÁ¿k›}äN^9\~Ä{>åúÏϽ0ÞˆÐõÎAòå±›ù‡T“­º¢Õ(Ý„½ðλ=F0çíÌÂÆ“¾åY}ß{ò1¹ÀóòzªÔýÀi‰3£òkŸ‰wïðÏR¬¼©µ¹Ê.¼ÒoÎT½ñÒ;Õ7?§ºiëxµýb(ЗÿôáëÍ›ûpöÇ$ñ·ÌÌ ¸ÁÎ{ïúr뉻–×7ëÁ½ÿú ²ÉEŽü‚Ô÷e0ôkqùVžãVzã«Å’3ÿܶϹ1·ü%Bç¿Õ¸}ÿªw™,üõ…MÐQìϫןĕû–>¤pÿl^wrP-B0£DÉpÃIéÍè×ׯ¯_zTcÉ+ò*.œýóæ¡–‡©Ž5"R§q÷a×õ]R‘¢©ó¢Ì)ä&˜»E×yG)³â,ÆÀë!ÿ÷>üôy|ú¾/ºƒ¬¯µlÛô£âUS߉‡}•ÅӮׂÕÒy¢gañÑQ²ZF©ãþu:¼Žµ"2â;õnöyœ–ß™ à>R° )(‰‰áàÐ¥?ÍÙß4âÉHáÐx"à,8&”¨9×nG’!µBhESSøu±:šï²ÒJ\b|ý> –Þ­+B韌E^ú€G­è½¯ñÚ™å#?|Ìχ×ô^ÃΦCNSí?Êjº‘­"~¡†A÷B9!+Øú˜íRÇtJ6¸B·ëEä4BY€Î-iaæ­zý0u½•¾ìõ§C 8û]Or§¨ÕœÚ ]éüu3rð9ýÐg/ÇÚ¸ÿªÉB¥Ðjn½Doˆ)Aà˜„Á­%³fT‚qfþ´Î†YÙ°áìmFô̬5îЬ;Ųَ€8_ÿö†vŒhÙ숭—Êæ Š%uŠHušÐ: ,a0„§Ï9îG733#¡ˆQ“; ±ÿqrC´fÅÊØ+£†"S1d…Z(C‘ÍE g´Ž64'a‚^†¢š‘Y•‚šˆÏ&ýJÙ’Os!¦yDÚîÐbvþÎÕU=3 ç±“묇kcµêrß´ù~ï%»hä¸ò–?«CYu‚\ÖñdÁyã–Ýü±.é¬ B×Y_œ,¹ßpËêÍ­<}ÄVšÇ8’«äìVϯFîc%UÒ\¿xr˜Íi¡ë^3}þ×§q”Ò‹¿ì_¬t2&Ì‹µª±Z«FssGŠÚ=õ;Cï ¡tý§Oû×χçÝðòùðỺÎú>%+nÙGŒJì÷õª?=Ø=÷ôá»ÕèCöÔ}š`Yû¾”Cø>t5BŸ9ŽPîsìãµlôè yH”%ýs6üÝÐÃÜh–!¤ð\øÊp 3ŒÍäu’ƒ ûJ“(6JIÃÌ,¥ª( H!T²ž°Ù£ IòFáè?¢üуú¬³>ZâÉéNzg•”uêv¶ÿMòpÈú©óø©åê•‘^óÀ”JZgÌ.ÃQ÷¤ &³B@„šcj5Íf@¬Lhy>êcßé¿.£bÄ¢•¥-À<9 s±á=Î~…p U˜Æ±QD¶f‚¾ÔÃDÈ ag*=IÇh&7$˜µºa·ë¢ªïûÃa,îûךS„*ªð:¢éæ‘p©9ò¶oâë¸@c: ÙŠ Ýr:âOÞi©¼xkçÑóåþWaÿÃû¬ù–ëzðëúŽññqíó¸xzyüçOÊA ’',¤îmåÞ]õ¼õ ´C;¿9g°”byé›d&¾ &pçL¶‚íµŠ¬+xËöÐ} zË6r[ë¸UJ¼¢ŸmÏ#«Gò¸UY7ñ¢\ôº¾øNÁ܃`Ÿ ¥ìh´ù†›ü¹ñamˆÂ¥WëƒJÆ—?:QÔÆ· NxV€¯-æ×/ëÉŸ)Û?«jÛº·×ñ[ÊÉ_tþ‚±¶9 nÀ$¾êq:ïX±·•+à !Ä]Ô#Ëß­ï|«<ñÉúJj ‹›‹SÓÑê/ÎæÎ|áßq¿¡õžK37®þæGðÊ«vîÒ×åHÅN—WüÎÓòðs{»#ò6g}-éžâ%ÚþíFcÝüZºÒÃ.{y1}ŸÓ•¸öÞÞåÜÞa tHðPoì~Î,çæÇ-ßµyÅíõìús6S_ =´î>:ý­Ÿä«iè‘ÕW˜M¾?c²êk{4f[5ß¿ù1§ñ©7¤3ÖÏ U{ò_Wí±¯?¾>ï§±f&ÀÒ÷Ö•®1§Ú\gÛÖÍD„j-ÅÜDF"3Bè†ßü¶ßíì_þù_†§áóa|}}ÔEÂé^úÓT“쟇R<ªêXwÏ}íØívþyª%èæ9”—ñ :u.äxø´¯Ó Cã¨.|ªÚGtéFvß'èYLcDg`”>šOÈ Ú@îS5EòÙ9*_C²¹üYÒÜ0%ŒHÀ I¨ÀDeî&ä¬7éYi ”ïÐ?Ã>ºŠ;MÃîYô¬ìv½^j¼ÔçžYLª2ìžc¨ÐI»gÕ0 ™£ï`c˜‡±¤‹ÉÝØ)„S¡œ`Y‚·ŒF¢#š£jâLdâ\“ [É÷íûàD:šyiin΢y .,ù9yp|«jˆ6y I0³UÄ[±TY²>xAH}AÃ&==íú‚:ža}aÝç´£¦·Zû@¹¬n™KßHŠ@4P„’(†)Q€b‹„óæ.‚5g¾ó3àJíl2^+BŠ˜àÜOºÙü·­ÞÀ€—Õ< ÐOªlóEÀ¢}KؿڑìžÀÌlбìJîÕõ]Ö*d­ÕÝdØû®÷~çuê:÷qÉt"ö§ E€Z ‹A‹þB"7˜fpˆ¦×à>`:Rð~>µÖz2U”Ñ üBé@&d 0æSnsT’‹:,dÌYœâsâ$—6Õ9íd šm%†6 æ¾¾dÈ;הݰ$i19zZgý®Gqzq7/†¨3«VÈPþá¿e¦Ì=‚v´¾{ªU…̾˧ÞjZ×a?ænH·ÉmŠÕœµs)¤%9¤6SÆL/®ˆTÖTJ{ƒIiæ(ž‘µÖÌŒ£u¥(¥¬02Q§)"êY#k(B™½x黿ûOÿéé·ß-ÒÓ²ú\ïK­ ûÆît½È‰‰UïÊ¢±èâp¤ ^h1¼X|ßX´¯#Þ‹Ðîªêç¯ÎÛxK0}4>_U˯‘G\k¨åÝ „ Ö?/MuüniâËŠ­‡#VÀ«:Ø;âãƒÛ‹€öÒÆù26}TZ±qo×ÇœK~\‰²›Aø#ºö#…l8µ6mÉ}gDcÝ"ƒ~Ífö?úV\½"õ·ÿ¿ìù¹|Tïo¶ïÐ¥ÖÛ‚óWÄ‚HÚ§¾êj<"í}¥Ž°NX.õN³V~îxq¡ão˜ÆÝPOÃéHï¹³Û^f¬mðnA{ní—{·1uܤÜ'onÙ6;ÞLèþÛßàXqvLã­,{N[8B4\ÿß÷ºB-ÿ„7×™€__NñЯ _æef˜ çþL¦‹R°?›¹ð@]‹z?÷ç­~E­üúúóñ1#Ñ__™£ãF=þ}†Í×ÌÕ·ß8{O³T9Â~¶¤³Š› û skxþAnÞÚNgUü¿TóªJå±¶Žã›ß÷g¿óV'nΙ1)oŸ:¶]\uÏžçÐæÿ£¤ëá¾é³ 8¾íiF’ºÙspÞt–w=¯bÐ……Úªö|ùÏªŠ„ÜáÇVž«ƒæ­zšcïÖÚáþFGç{Ÿp^O+¼‹WÖ¸Zo®~‰7ì…yÁ´YÕø? ¿×iêmß·o7ónÝ­ÛšgE™§‹µÕ%ËóGoî¿Îó‡R$õéÿø±Žã4N5r?+.#Í$j­ÊìݦšîÞ¹÷˜ö/‡ýß~˜ÿÀøzøôy_÷‡Iym¨U¯û€¾s™Á0ô>Õéå%Ÿv½íÊhö½Û‡©¢&¦:bêb,õµì¯‡Ã~Ÿ¥Ò+MÖðî Î''A÷¨¢:3’&%s¤thB5q”vîá‘A&M² $U*-"$¹qG¾Ô¹ ™PCܤÔdÊ6öz£ÑöÊ $m’ÜaƒáI»bv(Š„—ù³%ö$áHɪºƒ 9vzþnè÷ÓëK|žÔÿ¦– ølN‚Ú§bÔ0¹‰µ“»L´N!LP²Ud„da¤ÜÀŽ)¥X c‡åžuTo"oÃénp7fIwLô†$h³@bÖ‚ç¢1ƒŸLEá­°]h ¢Ò™¥¦>柳†ò±·* |™ª[:|üÐ×Z£æ®Ý“¿dŒ¯‡)E/nå©//¯#‘S uB+PŽ а ¤ÄTQ;GaGW_©®ó½ÁŸÎBÇ}ÖûØ :âH¶>RWfÝ«6Žv­VuîzøfžF…™µÒ‘U‡ÇñŽðÁÈù]á:q~ké­±×.k;Opkœ»\¶ŽÑñ—çÖ;åÌ›ãäþ^r–r1ä®'|Ýc1½-\ɺå¸Ë{h›·7pnè.m`OöPËÆ˜e2®Y"¿Œõö‡ÜÑùž}±®ö²ö¸mæN·èËg_߉[É(oƺþÜÞO,…5 ©!ÏOø×%´ €OÿüÃáe?ÆD?tÖš5!!€Á­*‘"Ô÷¦ÃÈRˆéååSºñ7ß???•î÷öÃ?§$Ëož?Ÿÿ)jMO7ë‡R«†ÎË~ú<ÕSÄ”;ûõ#ö3cLì&SÒ4)3Ò”¦Îø¡óçgeâåLkq8I°Xv² õù›Òµ¦‡i®ÓF'2°•"™ˆ~HÖš™«‡­Ý}²y@£ÓF©’nxr>uâ}‡1 ì  ïa;ˆeýè–“€ˆq2yÊÒLO#p@Ýó0éù (ðÉTä*À=§I²P`ñê.šÅøªè:µ‘G’HjQüh2væT % ïß§$gwàI¬ÐaŽ”P6¯Ý™þcœ ´“3©yçvÐl‚Eº„Òuƒe­Ÿ÷cç„ñ¹Û=õ]q^£¸ÿÛ?üô’ŠFùévE‡:cN¹Ïœ¦4 ù§¶Ä…%2`†B ’ X\yGàs…"F¡0Í'^ÈDve~ZR'G_-N#ö4)ß‘€ãbWë°e2OÌçÞó4ˆHÎóp Ðæÿ¶¼Ø‘Ôbn)Ät á^<"ëY³^Sꇞæ¥Óa3jו1Çi•i¶Z"°¹˜«é‰Ba>ÂÆýr ­#€Ê*è ,(ÖÕrYhèËï‰SCôZÍç–Z²¹é¾“xCÙ'È>-£t_›o%”gÍÐûÄahX×…jÅŽ>°/>…+a[XÙã]-WÙ—w>_ïúw6'Çã¥&¶4™o:4÷tÛË9“_.Í#ï$Ï®'Ò[ãð.~kª·&«õŒz‡}'‘p+°>…kA|­/-îMúò¬âVØtÿ,Ö‹Ñq*ø „ίÿÕnX¶¼9ž¿ÉÃ{¾,ñFZ¤RðGûz $âTŽvkFØ|ð6NûˆÙìú‚œ)ðPuú¥ï¦±:‘V¼t(”†²?LÏ‹º­V\Ŧ±Â<öBŒ™Ñp¡&j“¹+SSù9ç* ÑFÌG5&ІÎ@"†yß´6Øé14)< Ìôü™YÓZ'¸() :`#y²0‡bÁe3‹@¢ùK˜[éºqš²åp–á]wxë8zWŠ™u~xÝKè»~ÇZGd.¨›ÆQ úçnÚO-ц9¬e„iBÆœ ¬¬& Ë ãŠÅñ8oƒ–ïIä4‹™SÀ¥›5£Ù ÁÕ2\€à‰ƒµœ[ÎrN~N@âé–ˆ SÌÜ`IîŠwÖ ¤¥ F‰ v»nç–†ÒwVŠÓ»¾3ó$+ZWÌ;D*Øýí?ú¾~î†4D԰辌żXÝG¾ÆÞ9Ú•2ÉBÕ¨Ò“ F„rš(¶Á5¸{)ÈLB­a 3§lÕö2³6±D%ÒÊ©²Á"³FDd6¹;l¦ÍKWÌI³ßýÓ?}øþãL¨l„Yh Îì“®Ôí÷73M”| þDÔ ÿ\«ëÙYZ=¿Q|÷õæo|Í:®/üÃŸË ð$8ûváââ¡ñËmø 幯Ù[\@Ö¿õÁ\÷…\Á¬΀ÿçFŸÛ;óÏçÑâÛ ÛYßø™ù…RüYŸÍe©æ—ç?¤^ñ ~òŸÅÒ¥?jî¸ô“üC]Í?xCÆŸ¨nó‹ÝšÍ¼ËÀ7 ÙÿxR§êóË´ÏÚVê~úý­ù²GáZÐÆEZlá{sº?ŸZ´xò~³Õ—™ß87žKóz—}±j‚—¡©îÆü.º›¿½(ÌŸ‹¼îEætPŸy:¿£DeéE¿ªg»{_>¿·qxÈß‹ft™xãÜ5ç9¾µ7ú¶=æÀçz];sþ0Þs_– 뚥*#Áňm®þ_ÓaŠHw³)º§Þݺ£FCý{*ݸëJ1ÛïÇ„ ñ›ïŸõÓ¿þ0¾îÿå_~ìHdýñ÷/µ2†¬„Å~?EmœšŒH¯6ŽÁÎw¿±ºéeÊqŠÕÓ·1T•µÂa#e‰}Õ@ë{rϬU…CySØ\ÈæU+ÑÇTM@<@…00”:Qà4‡HÉœ™'ÇÑÛ„f#kkV' J˜Ê€O|,OdÏ»9&Wÿ„¾“÷¥KK ^F:ÀÌ$‡L¡Fáãg¾Ž¹Û ¢Ÿ:ÒЃ*BåÉ"KËÈÞ¬¦"0&ÜQúÌä8‘uvê„ JU‹fÜP'@ÂQumΤDŒp‰ ÈfwÖX ù4†É4œ‹ýW=IK½|¾c¼³1P3û kEÙ™ùº¯Ïô˜¦ˆP)]]/Düô:¹‘¥|þ<* Âþ%v¥ÈëËËS6B}爊L(Q–2ö)‘šç̹tU³“Aëmñuñ)P+Ìà°9ÿ‘&˜H"…ÒAæ©.Þû¹ð?ÒA1ÏU5Q è`@eÁ–¬šfm}Æ×¬UHBÍGÁL´CLR*‘SÖŒ¤[ÔjŒâþ4<=?íjÍRŠã~IÀ{ëÊÓ!"+»~ŒI‰Zç\E;k©5ZÐá ¿h.Pš`š/ZãÄkùe·…*Ójü}.ö÷ž˜Ôùú7×Þ!lQüÛyÇÜYbÍŸ`~Êæ‹ÓºOd³ËBLÀتèIÊÜSb DZçt ]ßH;ÓºÒ÷Ý|(iÖ‹•C‚1ÅΘfÇ0üöß…{%»"³J:‡NO%áf1í¼6zÁ€„U03a–^lJjç­äßK9N¯ÞúŽa¤4{[“QÃHJ‘U©¨5”©ˆ eD >ÍÜܬ¸9OïÎÝÇçÿøÿtª¹;«.lø âÌÆþh<ý¶\rÉLÀ r\qxœ#×Xüí&ÔÍâµu„zoƒqg{p?Þä9œU½éÚº/´¼*z§¶ÃKVÖYôÅ €3¥¾±zs¡jlÖN]]´o)öò B­Þ­¶$G~µ¢òrSï<%\TПzF–@û̱[—=ò­Kô¼î+m®vÏÖ<޽õ× "¿€ ôt¸ëåB©û&ÃXõ¼cSöuj»®‹¸yÏÍ:å[[§k Ð»`gy‰[™[Wóâ0ø¯·¦û{Ð7Ú;޲Ò-¸Õ1ðf‚ö¨L=¾þãr¼€ ¾Ë{Uï3¿µ6Ý×"ü寛:¾ñÂ÷ÈØîjº±½+ÆØ¬|ÞlDø2 äÏ :ÿ.‚Ùã‡úMÈWçwá`©ÍûšñÚ¤-á "t„Ø_!sn>6ßrZÊ­Ztm^;Y¿™Ó¸èÚ“pL>ë"\…±K'·ôX¼¸êÆyжMVýÊ`kÀñ|É_ØH'Æê`gy`NèºÓµh£Š×÷ugî¶8{üŠ­Õtk'v‹Plÿœ·LóXâùc {%2s§Ôå2;¢ ÿx¨­—3Sw¡òb¶]CŽæ?ÞšŽïî”x;£riu·'z{z#Ïz!%ž›kœöº7îzQ\Š÷­â×4¤ݰ¼ýóÇá®´M§º£œù­gòÎJ©9v’ž¥üOã²ù;±~úçÆý˜‘’^öŸÊЗ®$‘„ ‘)6¤œ$3å*}fÖir£Mi¬5,Yv݇ï?üþÿ×Ù÷EŠÈ†|Àˆý!É&¡¢Ÿ`“Tñ,¿ï™R »™äý†Á¼BU‘eí- ‘T˜zPd§ŒN0Q‰Q1Á: †OA¤K-ä—˜¯Ò¬ä¦Š©¸!fEÊQ¸SnÖkè&¦Y'wâCbHT‰1ö5`º$˜ˆš(b¢$kÕk}fnŠ”’¾Z„PXCˆŒAŒ5£ L KI&5ÁJcð,å¿Eš 36Ó×ùsuv躹¤½Áè»& ÈUh™P×Rš%ÚÐj <6»ç,ô·ÙíùãÓ“ãåÓ«"©÷Ô—ÝøÚõ¬S쳎™ªµŽ‡‰,ÃónèËþ§Ï/ûéi~zÙä®/nãk §±f³±ˆ¨¨ OtÂXSç1ÛÕraòTÁ ˜„B¢ó…fÓDü˜g¥ÙâØ#d¨ €/ƪ@"J‡ÈŠfÁå|e, ¢+[‚3. Ä<¶:Â…ë»Òw™#¨d¢Ö ™rì†î€„Ðõ=Á)bœF)¡$ ”‘éÃË!2)D͗ϯMò´Å°¡1|¢}âlËÜn\®oh“û´ËgK-¿dbÚÃjž-wrl$YMœl!ûGÂæôÔœ 8n…¹ü²t²•nI‚lÞ¿½¹9 }YçÌå0§y)Mâ·RÒ}7tôbdKYLP6÷┹“]žÿæ¯Â-Ÿž8V•R2j•Êëä ;W±|*p„0eNÅ|R˜2/`í©)Ra!q%€Ìûofî&)3!eD‹ÉZ±¿RhM‘Z$wïJ×u>”áÃÓÅÔÿwÿéu²Í™é/G_æ£ö¿jµ_P Ò&©’+ô¡NÁÊ)ø¿ ‹/%Rn)U×ã‹Xn n9ꀼ귿@Ù®%‹`|6±XÏÀ}ëlFº]ÄoKØu4…Zˆ=›ÒÌEÁÍ›b-ׯ®ùK\Å«8Û ñ,sÂEºÒ¥¯ÀÙf^ä—óÝ€‘p…P_9è’3yØmH·ê®÷ÇÒ¦ ðÌ…ÄuLuýÕ5’ÿ!ÅÇíÉy¯¤¶v—nVkr·2~lï×ÊßJ<·’¸mŽŒ~\ºVœö-Gõ’PÝ7®™Wë?9?ß½üyrâúú¼oKú^tÌZã»ÃüyLjYÓÑ68 ò úֻѵ×ïˆK7ÔyžsØpøuº­÷9¬›êêµ²s‡D¡¢Üæ¤ãB âŠ!uºú—Äó5eî„Ñ‘Îlæ¾Rq½:}žë9ë“8Že†—Á Íäx»éºvÚzN®™K¸òxäiÂÛûeðÀmìt_€¾B×ÛßÕä¯ÙÜH—"øñoï§”6‡ñ-ik EYM\ï“hWsï‘Ïûµ9ëÁëw[€í«ÁkDù ʦÍQ TÜh.½ŽåI]üÙ@ç7í’x®qádûq–ÛÛºoíÅø¿s6æä·Ò$wR2Þ‘GÔò÷ͼß.#Ù^å"ñ~[òNÓýAÿÆàŒ–Š%('¯ĸ÷çKß““½wv§ýˇχZ§fGj]a)­Ü×Íjfãêæ$€Ä ÅTk?|6"÷‡ýKýé_êˆaè¦@@bN‡ÉMQ§qL¦p¨>”zAà>õ AÙ›>üh •Ôkè (åÆâ,ô.hèœÀ1If€‹nÞ¹ÉÓ*_Ã"5)It°’<1K2Ã$>ef*£j-Ù€HócKÙA³Ò! ˆbfEÅœN+T!z=ƒ,‘â ]ì*•%Û…n ‡L(F› ȘkÌ•È.-Bûš½±ÈRŠ.ÍÑU;DNE¢¬ ôˆ"9ÂLÄÔ¶‰siaŽ~‡ ˆr‡AÄ#¨Ö8øGÒ 1 >™:cRÜYdLÊ!u3º‚Ë¥tË ‚ÄëþÕˆlÕãºÁm_3k ú‚RUÐ8Šª5¥ÏR ÃîùyÒþéÃó_Ñzj|=°æsoOO}Fe–bèúO?¾Fž oµ¸·OO|²Ûw|×·t·Å(•sÍ~36Á Ô¤ÿV2ŸˆÀlih+(ÀQ ”nþP÷Ù- #¬,ºZ6D+éö™dn¤yßEFÓûÊÐO‡}2IX)ÍvXBÙ¥²Ž1ŽT–Ò§j2ÍÍ»aÜ ¨‰2# ÞÍ9 ™@ŽRàe>Î*4F}#EN?CBà̓ð‚~‡h0ÈÔ²O>[K·tHëÉ„-’Yéçï4T8öfÈ ž`%¨î©ëû¾õ,¹y¼Fé ƒ¹¹’‡¡—[×w^\ÞÉé¥$4J2¸yo>Ê“îý76Nôâ}74.$-‡bNd‹âŒ©1Y{ï“Sg!9 1i0¥¦Z«¨ÞÒ°xZ®v¡ÙhÖm ¤2Iƒ”‘‘¢”ÈŒ…2rÎÉÎhóâÞ—ÝÇç‹™ûoÿáf¢kãM¯z Ž †x^IòÎõ‘8V>¼/fㆤzÁ=ŸK(û·®^ä·ˆ~Ö6þ¥Šãgˆ¨ŽY7}³Kñà¾îÛvl¦|i@xŽŸ¹HàO‘p«àêt„•JÊŸ}¯}¶O\'Ú¿ºoþ†ð˜Îت­:i;_IúÅ;Ö4ü›9†[ŠÁý€k½ò]æ¾Ø÷ ¹ó :¾±\už[xDtzÏÅÑÏïšfÎÓaä#çû­@ê_ªEüÑtlÝ }M—áÒöÆ_tþ瑾L»A¶X§+¿üv|Ã8™·vßâUp–EÄõ$»YDÿ®áHÒŒKX×1ÄEà ¦­[©î¯¹ ׉ú+ñ™*ù®çôXŸt¢–œG«×vX•&_v^ØÊýJJeë¸9¯Óñzdì®7uf$æÿqU1ð§°ùª‰î[úH,­ÄÐJ€üÏÝUuÌcWèîJ~Ìøþ—÷Ÿ÷u¬íC÷ãgv]×ѹXPÒŒ Ý™©z§$ë8õ—ß|`ÄHåóaÌiú›€HB@$ “1o;¯~‡ r´û›­´IqÉú`]b˜cQ2á†ö ¶ö.wGKÆÆì VéÅ#¡]m‹¹ñãÇQ£Nid1”»Þ#°ë‡aèÒP¼ »aT²÷§®Ÿˆ‘p·DV¨óž(½w5©÷× Z'tž¥X¢Ù ·ÔßáÆHBbÍ×ýAÃ`ÅeVÜ32KfËŒfÊØ&¤Ó%dfdºY13ã4›‰‹ŠŒˆ ÊÊŒšsŸYé»–²b×Uÿþýßÿý¦3ŽÑR“œÞòŠ|‡Þr; 0…ð¦ØÍ0O7\y/b¼¯Ò#¶I»§j ݨÉÐE۞ƿºòß?¸Ú*ºüòÐè–ŒÈ/E^\‰¹§²îožéyçá] 3ôñçyŸ Ï÷-ÜÈ~h³¶è+£èË7]2•óDuaõŒ·œ¯ßDŸzü4—1û €/Ô"2ïzqî9¼-žKy_2&7÷S :šÞ*Ü•0a~È«ùj/ö5JÞYÅ÷M¥®c'ÈÖÕûFZÛ7Ó¦oôÌýÛ›|^ pRįÓB~¦üý›<í¯™²¾&µ³YòËÇ ÷ÿ7sß$…óÇžBøƒ¾VÓûº½j^ tÌ>[î?8w57œOëçÎêÓú­qY¡HÐŒ·{[Ö'<3Þ}ö6Ÿ± .€L“r¦k©ô·¥ÓK•Ž6¼ûm‚”šƒ*;Šê:³k{ÏÄqÝkv\°mnìoøíƒsöÑ*Ⱥîì;¯Í®ÎšÇèvMÚj›P*œwÖ´qU׿¦ÁRG×ÌËíñÍ òê®l pñÔáâû¸f¹^wtn•úܱä½ÉÛºb{­ÆÞ½ø²Ýˆm ðåfbÝZÏsìo«;C­cµfÖÜ™uÞ×¹4d¤ QÝY3Yg–ògPƒøÅæêø)ç’ööÔ”²Zï i` šÛa &$Qgçd:#2`™'»ã¦Ä¶Æ3 ‘"¶x$ÞÏzWl<2KïÃSGFLé»#ºnPÆ0ì//d¶+SÔý´ däç}Q"3³‚–Íc )²yþËÖwàq2ìõfBópMî,æІ, ÀhA(=ÌÐSf±4@Ùν/¡W$–DÌ`úl<lj a0·"ÁÍ„¬µî†Á!U¬#²ÛuÝÐ ¤[ºCºb})`µ¬Ä>ðýwÙf–â1f¥Ôu&ÐZni¢1§HÉz³Dd†“^ÒmO“d)u(æVkb¬9x») A1gÏI5‚‚CÈŒšQ§PRË0™ÿ¶/»þéû׋ÈßþÇ¿?/h <çN¬¼š¡¹}áëŽ|µÒÆ—eç„e9Á€.–Ý™¦hgúÿµ¼{ŒDVèã ðD§¼G¬¢ŸScõ±ù+\TpëtÀÇ Ìu”Õ.w]•U®ƒ’[>kÚÀª‚«ß¿ÜR\oœt@<[ÆyGöºƒÜyTUælçpº8gQêY¬t$8‘’niÚ/È ÇvùU *]¿s÷#[΋º¶UŠh-Ñ¿Óê´NãóÍÂŽ5›c½g³#õlK¼>?Âͽë UÔÔä)³Á®ÚºÁ§@ò<°jÂqÕ¼rB¸ò8þ„DÛî­÷z›[.œƒƒ®'žvëÍl¶XšGÈÙÌp_üJ*ôíN)®·}7¦QÙîWAþ©ðhµ•X#}°9ÎÆÿ¥M§«kxVâEzà°vKí½ú©Ö ‹G¶Nwv7wdúõsz ZS¡¿X·½‚†mšÖ_¦ÇHlÁ©ÖƒY›«®@·¼Ê\žË:Q]užºÅ¸¿¾bÞsä΃¾Û£âÍÃ&èü/tA \ÍjÇB·õ>ªÿ Žpa™‰óÚл$ŸN”ÍzÐÛWò2º¸Êy«w¸BÞ註¦®o*§oÊñ›µ¦.ü,ïOª·Vÿ»“ð_t^“ÑE}}»ŸúÞ›¼•’´…¬¿LÖ>bÿþ@Êá±æ:†]{ÏÞMlênÌTx6ô·óu·øþk‚+?a\iµZg ¾8 Ùþ¦~®€Ç¢ÞQ·rkÏúVƒ!/¢ÌGS·N'• &»a £k§<á¶Þÿu ùošÿÙ_zëhyÑõ²Çîþ7ò ×Mâ7¬»û2+ùŸ©@ïÚð_\ýå ö?}_u¬‚è¾ý\†žn]ߟ…Œ$d…P¼Àl:ŒôV!m±Ÿc?ï‡Þ­XЬ·óï~ûúr°çÝø?ÿ¹4chL<ƒƒ!@B‹¨qO‘†â2¦ÃÜÌ•™¤íh)yÉBœö”‡ƒåÞÌÉH2ˆ‘¨‚!ÈYز„…2fÊÇLÑ$C‚’½h®úw¢ïìù >";…‰ÆŽxby‚í©©D2Øw@"'L–ÏæÊàAš”)Mã`ðF„%˜9j”Y'š&Rw   U’©‡ñ‚éǨ–ìwtч°Äå`S E•‚] HZAgð¢¬È #Š/ÓTªCV9å d zcÖ&íéÉQSC“K½*™f=©HA `œ œg©×Ä–Dùbìx}ݘ]7||r¿ÿý^Åê”ÅìõubäïãðQ“cí:ïú¹ç¤fŒÒ$zaL1ו{3- è€&Ír< îP"sÉsÌ€„Á‰Rà>{Cð‘P b>þ2ç,³™¡OG7œ|8Zü6ãìŠÄöû;P³³‚÷èûq_§È¢ì†ÒœÓ´óû—We ƒ Øï_Ó÷ß|y}±ùÉ,§=”Ù; {ÙW3ˆbux Ù YÉ¥ÝAKc÷Ïèÿ\æÏc²Y¨ãâ`Ìyƒê pG,ˆ¤9PÌ¥± Ù4:Ó"*NŠÊ¬`-WµYÊ’s® $ÝŒ’ÑKéúÒ±c)ÅÜ$”RDf¦Ì§¤÷ŽÎjaÐKçÑÌ:€îwÿè MQCHEŠ‘”*½ïÌ©æœÁÅ\ê| ô©¢Ž•nC){J0 ãXK¤ ]Ë…˜;Íš~&ÈÈbNGðL#$e´LBÔ±ÆT³&%³9øs÷Ò­øuÉÿßþý?léѳX¿ÚŠ­YöúqÇ5ƒÿlí;;psóprúYI륊7–omFO¼„³¼m·¸éžófÀÆÊγO¼Þ(Þá\oD²ú’ˆ£E ·ê%¿UßaƒùŽ ÞÛ…_)=ù¼Uyo‹±ŒövÙς٭?œ£ˆ/ީݽ}_ßÀs/ºó+£ª>¦Z~Aä|Uâ}©Ýœ Ðox’ýlµœwl> GÁë«:î|ârÉ»Ûè›»§Îït|Éòru7ŸÊ6íÞóá'sÇwmå¾ à ®þøí1w‘ãüè8“yõf¿´‘’ÿY;¾'õËw¼Wá}_ÀÝYä~†þÁPá/:Ï•+·2Xß~=ûÒ·½¿âü9µS”ëkTˆûëÓèõÇRì•QÖÅÍçäÎ-¼óm&¾ á Àãšû‹Ï‹µ/—Ú;Ž7À™áÕƒÇs'!9Ñùëñ¤:~F0ýåù}+7ßñ‰ß228Úö\æVÿ»sñÞŠÀ.ê1¸wüɼ6­Št®òë%·X'0§ý4“º½~þTž‡R:+f¥d73d±P¦œª+DQV”)«}÷׿aj÷ñù¯JùôÃKé+¨×χ§ÿðïóù_2Õ“x¢&a’^É'à(ÝU]Á@#if&T²R¬8„‡QqxQLIY2áá2ÊÆd –Ë"›šËÉ"#.„TsÖ¢àfȆäÏ:Û=Þ82Ç ,¥èÓ =1"ööì6¤)ø‚x.–JŒ6eDf£EªÖ Ø9aðd%©Y—7A&h2À‚‘ªÊÎaâ'NOô}2X4òudLA:¡ÎÞŸ¨€Ùf¶/r*smµšn˱b(êŸ0½`aµÂÿ ëB¼’…F5ôd¶3«‘ MÄÎøTLBUàNšJaV²9O*[=¸õÃ0NÓ8¥2ãpøžV&IAwOàû;d¨jÿ:Á°ûø\’ã8ޝ#i%ë$ æ¬=pBœY4>£ŒÐJ.0"; ¥oÜ@¢Dt=ŒˆÅ7¥ €Oÿ‚ŒEþ3ÈHÎb« kÑ0G.z#þ“`ÁÑœeQX­ävÏbBÄg)IÛï§]?ôýº~ˆ8ëÍl?½Æt -¡á郩ŽS 0§ÃØ=ïÊ0ôñ¹ªS…ð¹¦Ó’°v¡8›´£wƒÕéÐÐOM©oÚ;Þd•æ¤ÛToD î3½gÎãq¹\‹ÏÁi®iþò6°Ï2…-iƒ9a°ôk™#…â¥ïºªVìú¾ïŠSHÈÜžJ)nŸUÓñÔu^ºgÒŠ¤®ôýßþ]‚ÆœËíkVd%«ÃC)f1FzK)àdÈ3ë‹£+2ƒûP#3ÆD‚¢¥ lžÖÂ.w3²FTÀHBÅ]¡˜ª"S­cÍnæ[q+îîOß86•®uÿíõzÑ;ìTÝOA%y¤}Cýÿ\Ó_‚«­ÒïûÛ€«À·Õä.õÙ¯ËÜ©Týå_kÑôç=†¯Þ\Ý_ÔëýL;Øû·L_øÍýâ./®@›K¾ùÕcè ®6ß#à>$áý1\ó?ѱr­3üq^ä[þÀ<ïǶ†u‡Ä/1"~åŽü¡·Ï?÷£ýø'~«{'‹_:K¿Ohz<ŽúK†Îƒ€õç] ÎÎuMÅ¿hå¼®ŒßlI¹Ó†r‹fv1¼7GÞ1‹«û íí]$Ú14õÿ¾ÝÍúß”§ß¬\Ù¾ 'JüÙ«uDnxj¯4€2{n^x@áÜZW¾Ï·ÎîbjÛº G>Ô›U 7·88+CY*AÖZïªeËú|¾’íHïîuSÒ±ym1F*[ ÀÅ[ëÖgï°ê¡Þ¸GÕi’£°îV»…½€m--°Â FäÆà¸²_*øÖ&ï§¾ü+¨è½Žûƒfbx49>éú³ç ß³±c¹Ûƒ \–øÍ²ÈE!Îu>üAwÓ ˆsª¹E8½yMtíŶϗzùñó4Ž­€ôõÓ':3KÈH'e¤D/!Ài¬US"UܼøT#%/R7øë§ñõ_~œ¦üí¿ùNSýÑìóï?MûÃ÷ÿð»éÿù?Qi%˜ê¡H< õžÃÂupÑL¤ÆDé°+VhêB¦aR% ´Ùë¶VK±7¦ˆj’&™ hÁ)S ƒSY!,ö°)6ã…š!wa h`oþdå`Ôàü°£U³äÁ£§:·H)%!UÍÅL š%D%E°$'é%ª`ÑØ,CÛÂCè(mÞï jCE€˜#RÃ*â%à :G/ÓdvŽé€L.)™bVEª/f.4î<äŽö#ª06 “£KÀZÑ‚IN’AfœæÆ¥cͰ™®•ƒÙ„D,9—yƒ"sš*Kç&ŸÆ®X·ël(ú„2à廾Ûu¬Ù»ïLuÿÚ«#¤˜­€=röø5ÍD~ZŸ‡/Ò¿€ð¥Æ¼3˜åôpzÃ-o‰ñ€â0GVL/˜*2zfA ô3?[s€fÐMäü¤7ñ}ž4{·L@ûC°e™"__>€Ujâ|zÚ½î_§i̬æÅÊ !Ö›¯ûW%ã`ß}÷ý¸ÿüüa@|6Æ—Ãt¨hçs¥?€\úÌ Â; A™ÖuÊSïÅâ§©+‡9±Òfý:ÍÈ –ÑÐ@ª³úOCJ7¯yŠå‹£=@Ë Äì‘ Á€&…¯Ä–•Ñœ9àb$(º`ÅͽÛ=íZ r¤ú¾PH# æ]ú®+…æ4võ_F?d±"SÕ!œ˜ÌÜjf’¥È2Ç©F g²ïº§abÊ‚´¾Ù;E«©af¤!3ÓæÕÖ˜?’¤P¶eÊÒ¦i§ÐTS¦ Éê§ïÊpr÷mêÿ¿ÿÝ߃÷¶.G Á\´x äÐ ˜“ ‰ëÜ“IëHäAp{+{ ÇZß´Ôî=ÀðmïvbM<¤Ž>{>éÈ>< ãWÉ‘d+ÝØÍ­ÃÚ Ñ›ûí‹fÿ-ûŒÎw± ¿r,6!Ë;­‰—$ÆkÚq ¦Ñ5ØþÎcgFây°qN9Ñ ;2Äf`]â}Åüå­}ñõ®ê.´†\xsÀ»:Œõ#p« Dë1v1h­0«+}3IsíPÚîÓ±ig½ý[žl†Ö M :}y~#xµ+>ÑU×Qÿ18l“†6 e¸ý Cø«‡ëÝÁrÍOm+תÁµ,u1ç@ãê‹Ñç·žôëñó f·‰®>„†Ë f˜±ìtyÜÛk¼VØ/¬èÉ[´ºåñþrñ~ïÑã£ôlǺŠ¢pkNk„¬³Ã¼Šë îFoÜí9·ö×·8À+ŸK®Cš­RÔ›ãÿÁ>›û7ëñªÿ­JÙëdíeMæÍ:ý#‚š‡Á³ÒÙÛëà&‹ ÆÐùó‹¾j}iü3\Ò:°{äF¿‰¢¹Ÿº ?¶/òfJõ–ôÿxbæÏêg~õoWÚß×ä~ŠN¼®;6£OÜ.Ø¿|œ¦’eâ?†”«Eé,š»ÝpMbz 7öÛe£ïö3齫ÎùPÖÐyíZ~Hý¿ÔÛ¡æ|v×ĵð?ó›V*üE8x•(¹Ç|x nZ è‘+ÿP"{û&~Ë€…“{ÆÆe£ýÆa>Ø ‹‘®añ5“… /Îã¾1c¾Ù¿vÅLàUöm•ºÖçtEäÌÖ?æ`Z…¾T‘˜”8LñùÜçÜIãõƒ` n³”1Ëô¸Ã—DÌôoKâ¡‘2fï„v Yg€¹AhÌ¢V¼nGÁÂ@¥t…šdsSº]â¥ó¾”ÌŒ„ „Ñh½?8:#þúo-ªÌØ¥ŠÑÈ©XXIº3¡È¡(£j³KéePï–»Î"«„œNô 6eN¤· ðbFKåa BnÖÚ]"²µ€dMSÖˆZ3®¶çß|\OÆÿþwÿ|;¦?þƒ+õ¿m»VÖÉUà|w÷¾‚²«ÈêLå˜ Ýz\sÐ]„6Šaîýt}2šÂ²‡:+¿ùnÉÏR’Ì÷Å\k×€‘ò­*§‹º >–½Gƒ¸6EXáÞ«×{À;Mo*5\öu…Ê9oýË6FÛ<–sW¹ÛÖÄÛúÔ¥°~qxî«o±Ö^.„˜SQÌ‚Aœ  «m¬6?ve7Æ[op㮽DÞÖ>þà¯å è2„ÿ"•äÎîûÍÍÄ:oøæ$ömë¦L©^ ýwŽvýS3;O¿éÁѲåÜðîÝÜ£còèÛ§Õ†w}û¾æó~®Áþ‰ë¶ÂÈm5ÿÝà¥/üóGFòû‡:¿ò¢ýÃuÍ!u#8\”H>rïÍù ;¦fÐùG~¤•ñγM¿¾~ÉWy(ðýæ-E÷@é\[uµjñ?6âÒ¦³Ó;tÔ%aq´âO¾ ÷&ßð×VÀÍIùÄåýVwÿœ™ª[ùí?µaõ IÑûÜ—>M㤟ú©z’t3sï)Ô„22Í]‚¦©8: °I™¡ŒìvÅ]o&·,ýëËkA*j?ôÿæ7O¿ù¸û_ÍÆ±~ü¸ó»±Ö©¦#žž¦ý>vTv¼c¥z3E5s l”èdpé­Uˆ’dl*háF‚U–R ¦œ‹o–êÙl–ddÍ ¥2áC≠Â5¨V`ÕêÔåSº‡ JNÕü³›HW s3Eee­Ha‚$tÆ1S†„˜0ç< À 6Qlöµ²OVæ j¹‰“j££ÔÀOcð…^‚á{fšŠá0 B1°CTL#JÁìâ*Ôœ¿pr.ß.&:ã`VÅÌ éà‡b5A¥™J›5…Lͤ}c`Ñ5;â6ŸX3ÛuC­Ïì 2Q¡¡‹)±ëK'ÀùúzØOêºâÅ^^÷˜êKÀ‰Þìó”n¨BßµÐ\wߪÈe@´úœ~CK14[·Ç\¤ïDMTÀ)À|׳Ì=sYtЀËçnî$NîÒàºaVÉ›µÀ\á.¼î §9¢Âh}×{ÙA9µï»OOCyþ\_¯ûÇR:ë;HŽØ?=u¥³¾<¿þðZ_G/e®£_Äw-¸:²Ñu&ºEp‘S[vÃlÖ|Ô)r6L±æÊ æ9Ô ðÖX°PzŒh !³‚Ÿf_o-1A„µ~ˆ ªÈŠÔÜ p„)µŠg ue÷4¸;ÝŸ†¡+~ˆúªJ)`ë× ¢ÊŒdšwfówR‚€¬”ê´…B© Û(˜#Ó#Ì;7Yç`¢7¾ ]1Ïš£¢€‡À”Š…H¥¥”Ö®ÓjT` ÑØÒm¸§¦¨1Nuªª!)A/Vú®Ûõ»3èÿoþÃïh­DG ÖòmÕ¥9°¾NZÙ,?ÿ5Z»#Éá[¸³þ„g_d _ËSåcwiK_øô°w X7bWþºæ/ÿp\k>M¶ÿÎÏºËøYasò«âiâýü©_gîŸkÌüúº•¾Õ3õeµ?~ÙìÏ:ÿÇ98¯ú™l@nîgb6›êî|1ƒ®¾jö|Sv¾z•‹öÀG¦¹[u¶3\´}kã”x¬m"6í­uwM<–½#žzp6Y’uºuÒ·õn­cÎU?]ëþßuƒ÷˜Jgn¼Þ¹êtÑ-«ôÍiôŽÉ O^§FS¦ô¸ÿáEE›VÇ{Õlµ.‘;oâ>^ÛSó ´®ú^w"ŸÿÝ U]wÑQŽ oä³–—+bÐéëGúg·Ÿan…û§V»¹Zâ¢ã²§uJ5c^Ö°žà7pÆçÏÈ­%Dز < çeŠ\Ͳ닩­×úö]o¥xÖýpìÐi.¯:N9…w+]G73£ e´âJ“d$3ËŒ1…:Õ%ºõ€¤Á;/`ßEÔ®ßÀõ»‹Ôá_~è$v®}˜Naf º;ê ÕÜ@†‹TNVÀ éN#£À©dNÁ")H¤(BQRm5Î’‰Ì€¬t`"Äœ¯ÅÜÜ3J’ øÞMÄ¡¨vì ­Sq¢¢ƒ=Ÿ¥îàÝϰC¦*)ðeÌHxX"zXßgNŠL:M̪4ƒRÀŒLiÛIv¹hŠ’Í¶´JÚ#B(ÁOª¢ ™xÎ.R{…ÀpH^B ƒ¼¨‘ñ£¢2;@ *Ææ ”‚.‘º‚Þƒr:Ã@_æ× ƒrÚ>䀨â|•<‚»uÆÎ­"A… ª9êÐ1ƒHY*Uë>R`Ô¨ ™Xº.¿ÛuPN‡dÂ7ëûnÒ4)½³Ý®STU g¸ÆX¸; Û§MÐæ°â÷¹Nÿø¼E;k[Üz 1Á j@‚f@C U(„Ê<–Z ¬­wð‚YIoM ¥]ó97€Ž¬ÑR&(Aˆœ¦Ï#„b¾Û}(²r:Œ»n«¾ÿî·ÓëáÓï_¿û΋uÓ~Úþ ïºnØõOßcªZµ\̺§À™ûDïèÅ„ÚPûˆKº¢6ç æ¶†£I/"ÖòDNpƒ;BhÍ‘ð…óƒÅU8 Ï§i>gf:P̆Ìs;ˆÍ&›rºÐYù0|}¿€õ}2Œ^̬ë‹Þ¥pÐ|Ÿ‹³òoþnˆ4*‚V鹜åÑùTŠ&ŠôÖÜW|Ê*©AÏÅ=YœŒÔ˜¹¯•@"s¾“D!Ô2`¢’CÙˆÿ5¢†"ÑŒ‚‹÷Cÿüýóqâý›¿ûÝ;sØgUýë¥åHÕkÑ×™à{Ž[qÑÚÌ·9§?º]­¶+¥q«5Y+º´œÙŸgõ¯I²×aüÒe¾AÙl ÝܺÜ2ŽºYú}e¹}c‡¢U™öí>̳RµvÃ÷Üý³àI÷¶?¢f¶CëÃÙ`“êq)s•ܺDë¼W(Ù ðÏÇÈ+m^è5âæ4ÓjÃ(ûŠÑq ÎùàeèTžr ¸öEÓÖ[oF®ÆÄ ­º"uðh™=oº õh¹ŒÕ3ÎÃ[zÉȺɽ<ßk_K¸«scky_P{;³¾¦Ë?y6ñœáõTv-ylés’„Öøµõ¿SíŽ+*6°QkÂíj‡«;ùù^Ý»ûû»Mò#[­5é½Ûw¼ÛLò]v>Ç4ðqñ8ßí^ÛÞJßÇ ÜOcÑnÒeËþqF½žrެ[ ³¥ۜۯÓ·›*6À+°öž8@Gõ„›©±7²šëÒëeåœuõóñºžÏt¾©x>r07æ"n¨~ç"ìù¤„[†öë€G¼ò†s}N_1Ø.Å?uèü­¢«FŒ«–ß³fÊõTùºôƒ—þ.ãx«~“ÔwÂÝYDÞô¸}g {>ójÙÖ¶½ñ⛸Ê%¨Üz7<<Ä?ÕuÎäâûl¦|°~]º¬­I—·óØÜ|pJ¼}¹6÷·à6ëìÐõÈÙüÎÕ2µ,Zõ³/ÁëÝQp>ÿób¾; ¸‰¼¼Çfû+W‰…SüMpµXê²{&àjK 0ou­ño¥Ät‡ð»Úi÷šÈnUTèÍÎÓTÞ¨W7á±ÜÁFüp„õßìx³Tíøü¼;';<„»ÓèÅl³•’½‰äÙr¢µb{OEàåÇÏ1MMÖÿüÓÝÓÎÜ[==If„<ª5•‘€¨5fˆ(¥ÇBƒrèºq?þô/?Qùñ»Ýô: C755E¤—ÏŸ??ÿÿîÓÿëîˆî©tÄôIOžuv1€r0’»"¼ê”ÎDTéP+ôN•i9×;+¤’&W&#á™)HÍÐwÞÐØŒrQæ¦T—9$䀾³BŠYi™DqëŠõc‰ÀTÄ.÷ ŸÈÊ1Yµd€Ž yˆ„ØË0pJ&(Y¥Ðú…I:à¢!ƒ|B é!IÉÔA1)-ÙѦÈJ3R\ö:fšJÇVÆ~DýÔ„âŠ*šÙ©”è Š#ÚO§5ðTXÌ^B“ôša!oí 9¸u )b×YE¦ДÍ*už½[qz(‹Áͬï±NéB÷Ô¿¾2Qú.ÌY'Ö´Œ)"àMt-ޱNMa¶ÌÃþ‹«-…fyÓùQìD,H[Ò³*3?âXÎÌY/±D+noÕëî€d³«mÇk… êfeå’f2€„¨)éBŒó|Ó óç¬Ã4'Ù˜9Ö÷Í÷ÚjóÇ—±&ëvCÍš#ÉÝðd,½ö‡q¬¥”¬õðãçZkÔS=Ù@ç´ü éK¡+öa¦ DÎy%”HÁÒÿø¹ðCÝŠ(fß}ØŠŠši|~Þ¡//Ÿ_‘ùïþî?þ·ÿŸw,*¦Oµ’¼¨iˆÊâ,%÷‰I³å¦yC¾sð!!’u´H %dÐÈB‰LÎŽèR³ömAM.ù_ ¹<‰”²PƒØË‹ ¸äæL–†K¢ÜX¡i¯.½‹Òƒ?`ê‰!X€Ÿ2ëOë Ò4)--¥BF`JL“ 7 CmÝM ˜ÐZL˜2è9‹‰~F”4¥vîÓ”šJ:hžά†¹LCES‰–ñp"G‡‘Ë$à ÔD ÌRu‚"…´p‹g§Àb¶´g±J¡"•b]bö°ª ¡á˜Ü05§\¢3x *kN9&ó(†ÆPÕJ§«Ej¼”ôˆÌÐP¬t]''zG4‘‰)áG•S3_>!ƒ|ñ“Xò¥El6s~j¢舄0x‚DæòöÙ5—("¦ŠB‘‹J."—†in§hýG‹ÆöquBÄ ¾OÍò/?( ]ÿ݇ïIN‡}c·Û>|Øå˜ÊòúÓ¾^>í_zž†¡ëê~óñ‡ÿý÷JÔ}?6OÆ ³Î÷7CÊIcmk×¹ë röõ=Õ§-éXÄ=„Á±ô¬Â i`™­ Ù`ç¬I6Ԓ͸¤¬˜F°#èsQ»ÍFØF3ˆîÝÐ?0c&Зì}7 ¥šuæiL$\¿ý/Æ€C÷ânS–È¢Q¡D¥;D 2£a«ºάPMFh²®ìJé”$Peãû´ÜG¦Ú䦘BˆÈˆ¤!sö ö®”¡{úþLýÿ÷¿ûݵ‘;RÔ©[ß ªJ,9˜o±%’°Ÿ!~áqœhf`¿Æ¿¾ ù¸ÃçÞ´wïÞÝ»ó-©u`þ!‡ô²q;jý³C¤šÙÕÕž¿afäãÙ¬ñúPI3Ë‹~œ?½Ý´á×ׯ¯?»5ñ½)Š__¿´{»Æôšüñ Ãf«Êu+ÃÏŸExtWQn]Žó…æ=ØÊ\­5`ÜòÆYRôø_èþ±ŽñT¼Ìí’¤ûMÍ7nÿõyÝ!ž*Ú9ûD^6A_6Ö=¼ ä;FÀÖWë–r.-ô«ŠþóV©;OÈéNž®Ë:»ª³°ü‘ÎÚ±Þý<<äñÆ­ß[—~½Yxw²xÈñì6;èæ_K·#ïS;Ï%ë®öã×§Z žì7NCçò÷îÏ•÷ÜéQÖYáÝ[®7ê>N`†õçžPÑ<I³5¬NÓ ÀŸ~ÿûî©ç¬ÑΜ|"§¨µ¢ÆH¡˜r£’¢yq‹á4sïøô<ÔZÇqÜíºÃçý~€TCó›<ÔpÛýõo†ôþ¹üðô>ýÿ£¨Œdb·C=2‚n9@Ž©H}x ãQù2²ëй©VŽÓŒÚ/@$"˜ÈF|’ µÁÊ¡HD¶ú‹Ôâ¹C¢s%–d‘;•Þìà‚Ëv„I:xB0“5T=h­ZUN‚Ÿ!þ˜fÙ›˜‘…,†*ͱ©0!ÉÖ  p¢3 (SuÒ jOëä-“ã¢Uîä;ó„ÊHìÌFåKDV’¢™î‚Dé@CŒHÍN¿$"ÑuðT!ÀCóX–@’é3 …xîXS‘"U‘$ëŒ N’ƒ[¬JA³ ­P+håòS¢$ªàdQ`û1ùi?Ž™Â”S7t2‡rš´{²bœ2¡œÆÉ‘á¨B1H³î_03 G“fçg©uª˜ÍÊ;"¦œkä­ýó·'JA±Ùê6RèhMÝlßÜ®ÏpÙ œ+Ü›ŒÞÚ0!5û74ÐXAÀˆœD&ÖY7îß?í_ˆâåÃSçÖem¦ª‡êô~×KØíÖ/#»rø¼¯‡q:Œ˜íÀ–ÚZw´'bš-db»5ËÝ™³+BÚ|‚ nÆ NÖ‚Ux»ª„ÈÖúPACבà3ÐO5q³_B™³5f0‡@Pœ½7¢VºÒû`f"ëEëºB÷¾ôF3§ÜÄgàã¿û}­ã˜ cW<ÔE¶^``È’TWJ)DT/r†{ÒÔÁtäfþᇈ¬©–ì´¤î^œcÍ)[º. BSB9MQ§š52J#IzçVÜ‹[)ÇÝqVþÛÿøÚJÄž/{«Áqù¾ª^Ü蜿€óˆ7_X@½ÀæVÆ¥psNlì .Š…È ‹0߈E/Ö>ð²û^]*ζ3×ùÅwªð6™§ÈVF}Zž™K.îaY.["Œ§7Îké .72w›[ñé£û—èê^c#5qJHØ'{cGQJ¢%ëRHH‘)& L 4R£Ö$*[u» Âø£b—苞Œ>Z™8z@Є!|ÏT ˆª˜RQ³§àÌê¤B,z´ a¨Ö™{0O­ÀFCP]A'×ÁƬnFšwt]Ú¨ìh"¤ÈÁìàa>cä²€ ÌFè "škÕ[|%è; ãˆÏ/xê±3vfU¹¤ŠÔÌÁí55)ŸŒnY3 f™re‚ séüíœ!eEGx7ëÎn€ÙÇ¡Çë¡/˜S€{1¤rÿ:6?'"2ˆ‚9ÐPþ­Ìü½iõh†´<ùÓJ³šCi u@„9 t†ÞP rQeC@ÎÅþí—AXž f³Ì ]%¼‡R@ÌIˆ†¼çdϨlïÈÈÑâéi7ì†ýücVa@5”ž,‰×Ï/OžB‘õåSôO½‡Ÿ^b¬Q JŒµ­Jýó®N{4w祘¬åB Ïˆâi§Ó„þc2³å Z©¥:æëió{ ¨,p:§LX@^Z†sî„‹ œZLz¡÷æ]a)]éœ;+î,ÍJ ¸ueW%Jo…4ÿ«ÿ²(Æagäs§Ï/+X#} ”B!wvO%Çn ƒy4ÔTÊd%ÝÚ}L÷‰È Cï-‚O/LÉlèK•Æ) Z¦YéºÎR™IeŽcÄŠÈZcŠfïáfÖyéŠ÷e÷ñÀïþág‚ÀR¸³ý=¨-œ¯v&+›®ö¼‚ÅÍڡйgï9‹|ƒŒ”üš0ÃsÁ ÷zFE¤,hEz½„Œ_è#gnL—+¾Öì±þv„t橳b²_(Dç¥*÷êwÑA7‘¥—Åä6B8zmq-W¯q]Çàáxò§PF7¯óJ¦£ÀM]*0Çâ‰;2Á9C`Ë?¬¬ÝödÞÜ‚Gò×wP[[TnáøñÚ ¦5ûB×Ûà ¡ôDU[Ê»NÏú±4gµy9N"«‡‡§xŽ:çqx‰\?ßGðl ÎïÈMüìÖ6ù!`È—&fdßåáwû}¸ÊpyìÛü÷[’³[Û™,~q ×çþÖáâa¼³O¼t\¾¿N`«¤ïÔ¶ êÙ’2·©¾—0¶­™ðúR\C¢6çáõîhYþ.?H3žðÑvÞ>OlfÚ®uCnî]÷MGÄ3Ž·1,oj|÷Ðüï(ÐæiÝúô{Âñ{½(·VýyÕ]ä9èù~‚ö½ÂâÅSsnìñv2øk¦©/ÖmïHðW£B·Œ³`ÎF´nÓ•ïDMþÐyèV"A›¨£»§ö®ƒ|×)<^vü­À?¿`À£¯‚‡60_õp®6iâóî)D?ú޾UsÀ~ÃL+7t_™[âÊÉöô戜h;A£­Ìj.€³:wäÕÛOÉ1EpTÅ–$À¯]P¿ôK_1f¯vIëjއ§uùÿfDü3 ˆSÍ×l§1ïôÏzŽšK*çþu ŠPJîææÅ‹„HóPµ®0”eú®3÷©šïz¯zýüº—úâ‘ùúzè»îù·Oùy¯Þó§Ãþ(Ž—ÉŸú¬#"÷‡ JN(ä9ª™¶ªJ(í0„w¡Ê—‘ð÷Æ{Qª7¨a™"ŒP¤T¶ÓfM˜)–$H{%©PºÐ;½d%ŒÎjÅT„豋ôd£ 4±T‘Ò:רÔÄ×H[‰7¾FdB¤%hB•‚Ê£x- &˜7{=ä^YæÜRÊTRc¦€Þ̈B›"Fe_¬z¤…C±p`¬ >ØÀùBTÈg‡a ^à`ÁëˆýˆBH˜^aPçY 8( ¤FdéÀªIÌ`wpšJ±J0ò% aWØÁjd3iöΣV¼Ì#­ Ê㔉1…âEQ¥$)äÔžˆ)µsYÁ°VàO”ýOd@Ë<•FÌÉ[8ƹœŸh¾ ¿áqRrvHž…‚bð0žÑ”3(¶\N€‚ù‰¯«f+AÐàsD *3m)+ê Ö0A ˜M‡‡—½rŒ®ïR÷‡W¼º9¤ €y7ôÝÓn÷"”ÒK£ï£ìÊî»ûŸ>g­Þ—§ß<þç}“ãtìüá¬Ô £ÿb²Y¨Xæs±[£(XËØ ’RsTÒ ü)`Gëûb© IuB)sJ€•9ë:™!§h Íd%ÑïÕ è7– òuè„,óÃþVÒYacçUüP¼«ñ¼¯á묘 ߯ §a˜Œ“é QcºÎ „±Ð’Š}•£º`]¯S†’VÅçÎ|)32¦šS)2S©b P¾þ´/ çÿôOŸÿûÿ~šȬ0p;‰E1™@7ÒÞ^këH“YI° Y7)‡²î%†lvE3¶>©Ì€ Ì$AîÜ(ÖT  b°LeoÙ †g—Þgã•X“ìBÊj#j•¹™ðôN`¯œ¤CÎù>#§Š„Œ³õîœi© ƒ%alcÌ -Z½Ð b0Ÿ¨Pvæ ¥21ŠÙG÷½"=hÍ”}²JNXN6Zºƒ†: º› N‚ w¤a‡YÚ.†ïŸa dÊ)™[šËƒÙèi@/#™Ê´L§íJ¶ò¥dŠB¢†8Eg`Lšm‡ƒ@‚ʈZ÷5IÀ¼˜uˆLBRpÁšjO¸Í Œ±¢/(DŽ3fç˜_;®sfˆ&Ö; áe.ÕÏŠ¼á€:(P t™¨#j…ŒA„,>9'Q±æTmÖ~B,ÿJ¡µP0‘˜3«Çi½u‡œ2r3]‡ß=Oûñõ§ñéiøî·ÇÏûןÿí÷ÝÓ°ÿüúú/ŸËÐEdÿ40sÜö?~vc QëËïlÖ¾â‘îµým.–à ԉ̣ãg3ËH[µ‰Ë¿:ä'“H#bÂ4‡h"¿9ºa–¼³e¡ ¡䜿S€ÝÎàź~øî©tOŽ>Üéì&VO:§¤ýûÿœ9Ì ñÉ|WsZj4ºG ÖâV§*|:žJ—wØíö5Ü!FúNÈÎåÙÉÙ˜9 )RÆ*(äD1iœŒ­ÔšSFÿET%22êTÇ)SÖ@.6¿}÷·ÿ÷þê»/œw «ÔóJÛ;†„(o±ætúÅJtÍ!d—5•ç•(—‹ ðh)îºäŒõö]v`m-Œß¦ªòxouÑoÜ—õ¦ûx´Ä—Aø 'óÏ÷º"IlŒ“/«¼þúÈáÛj©Ç@á›ä«î^®¿ù—Çí©ónÃâ£æñˆô ’µ_£àßšðßì2ÜDá­+Êq¹­âRj>ŽN%õóO”u~㢅gû^P‰Vòx ¡–v{ÌœNžOåºSÂ|y×8^Fso怷»œ6/ÈŠÕî«2èuKÝYŒ²ÍÅ9^Æ5hYìyž$\ûó=ÉruÖÃjKy*ëžS MkPþÅÖó¢ßê¬xõ­;±ã›;«‹Ë|Î*\uz®ª.©J«eûBMXƦ.8“×¶ûs÷æTµ5Gè[Ï»LŸ7sQW›•cÞŒ 8³ìjÃt·à³N±ó.×õϰŒžË¸î2Óy7‚κ¯ßØf,4/¦;®R«k¢tl3]•¤¶Q‘ùá»ß¼¾~ss7'A3šI³[Y³¿4`ªµe†Ò)5Nu ’(äwÏ%lç»ÒwÒ?ìû¾ôŸæúçüûÏ?`œ²†yùðù¿¾þßÿnBsdňvƒ8Šca %¿ýyivÄí;G(`QaŽÒ/>1÷(¨‚±”Û’9æ¤Ì¬ Êéóá§)#ôz¨‡¡Äîy× ]qãÓ§}jÿ›ç'sëw}ÿái|}íwÝx˜_ël8lóé7KdÚlÁ–‡Ëw8{‹;t{-ñYµ×ÒP Xæßg…¥•l, “ð­—Ç Ö.K‡®C éÙ™Þ ½õÔŇ>À¡x*ëïÈî¿xzùœBu7£¦)Ò‡È"ú’4êì¤]¤ÕKW ‡ýPiPõDÜá†Rbœº©Nò0ØqcàœR…-È¢šj”Æ‘T6_ßL)2ÇZ“j4bݺ§áŸþ»ÿéÀiŠ…°(œ32«d—ö’c€¦;ËëZ=9ÇJo%Ù…y4ÅùìèVÊU_Û*@ÝfÐ]Stž¸(.9m@t¦È`ŠlC\ož¶ˆö¼+¼gc|¯œÛׯ³¨ò2ÉÎ tä›  w;1¬cdž$ã•®Œ…ææ-aóXzÎÇ6áw£Ó«ÉÚ{ì äûcBëú£A^¬j€ÖÙ…{¨Þ+–îõ•¹ÀN8—;ÚÄÅŽÐÈEÇš¹ð:9.ÛRžr› àòoËgòñmÏ ¶Ì˜É£'ð)³ÑrWàãÎtmóð=ìº0èú‘ܰ[mh¯¶T¸ãrwk²:†v:×|¶P\Á¦ÍÖlªW›ÕŠ\† W{­è{׳ý#J÷k¥küL×kÏ3j+@ÙÆN¥{s ˜.ÛÐÏç‰kLÜ­a{t¹–ç.4ŒGÎz5VÉžñ–/жGÂñ?8’yÀƒ•ßF¿3oÍüxpìñ·ûﳡ¶çCžI&ªÛ[Õºï¸ü›Óò±ÐŸtx7àî½zúõ?7Ò_“=úùR'ß°!à=g?)ø¥ÚL¶¡Wwta=|êxW[ù×Þ°¸[!øý3þƒ†çòºö noz¶¦æëÙêÛ×ˆéæø¹û«°×Ïÿlñ[ n›G¯fv½o´ßš[ÞJB\oüÞ÷ÜͨôU ÀKq÷¨Uÿöþ­Éq4IUÍ>€t[fÖµ»kzfçŒÈÌÊÙ³"Gde÷ÿ¿îã¾îÊ^ûÈŒtÏTUf\Ü |fºHétˆÌ¬¬dWWExÐIàÃw1S3UÍÌCƒccVšR¼(S£ (Œ&Q³qsCŒÔ–¬bí£i=…Cªû×ï ÚßýdW«ív-¢¦îÿD«™­n í<¾P0Å×­GHŒ†ÔdŠ›1 ¼êDÉ2ãÎÐwTÒf¤†®~ ¥À Âï\u©0fN)5¨ÔˆK!™ä€C…d%;‹²d#ö.&)¢†ûê û¾ï÷àÞ\¦ƒÇ'Ô¸±ºXp—dQkÞ§j£>`C{BžuíáÁ¦ÅÖ,¥¤Ì¸7/àÕ 5@[üÀÚ‡^Yl ¬­™ Ö¬Ÿ@öA× œ¤7õ›WøøWD‡¶Åá‘cS¼¬ÀÑO˜€FÌW Àô„â*$ÕL˜T‘Š†î´˜¢ 7DT2Uu¨ a7È¿ØØ2_ Ö"‘ðÑŠÚjM¨l²ÖL3à!À '4øÊjâhäÐö a”õÏ„•ûl;"¡H1ºÑj–Þ×A³>@Àýd!PTd"Že¶AÓ?Æòƒ%R¨Ýfè`€ . "zD"µ°t£Þ€Úåà­Ý¶MÿØ+3»Øß팖]ÍÇÎ ÑÕ÷ÿöýëß¼möíîÕþñ¡ƒy³·}ßEdô5úuÄý‡e>̇áE DN…¥£.0ãÈW˜ö»˜ |@¬ÖÀö=¨¡¤¤Aˆvìmk”À Ø œcð’À[¸#e!ƒy»+Þ¶M¹34ñ©W[PÔ´¿A[(‘LBw­wõu1˜õm“`¥ÉpgQ¼­fM±7oX; ‘jQMtÐ{’Aª)˜‘ô’‘îC a¡ÌH‘¢rTà}÷Š>¢¯µë#rÜ<›ò»?ýÓÛß|Ã!ú_“éÊ × Ã¿æËôB,û¸nÈ9ñ-vjÏR±ŸõÙïÎ:ô²£ûGÕÑ…^×uWûÓM?Þõž>?ºù:qyYÌújþÿ“ ïìÕ“ ÂS“j¹ÖÄ­"G¿˜EÂ:À8ÏÉüW €­Æùe_Ô‘Ó’É'3ª^ã¿‘×Ë{l¿¨X˪­õ—"à 7ÂÍÚÆ-æF$èÒcåWžEŸû üj3ìoiÒð ÞÏi‡ùÛ’¦ùi¯ö™ßþKÿÙN‰Ë¤¹K賿bÓ¥ù«^J–+uÈîP—xbZ9Ýj+b{~à¤Î/ÅÃóÏ-ܸY|™$æ†Fˆ‚ÍÌjøÉÝë¹ÓiÙw°5¹¤µÉ,ž¬…Ï}óŽ‹™›ëôB#É€=;ÙÞH+Ÿ`Ϭ0 -Ûê¹ÀÌ/çz"6=î}›5¡eVpíÙaiÖÌÙΰu`QŠtÿæUÿp¨]¯Ô›wï>>|4£C»öÐW-†6X0†4ˆ¶ÛЛmN³.”ÎâMû‡ß6ê}gJ”ⵯyèÚûݧ?¿·}ãÅê_ß·MÉNf0âþ?üó‡ù—RŒ©»b–êB5Õgе/R¢º „šjH‡J¤%V%SZÊh2!£9ÑQkbxq$\¹2lhHôˆVV*šD—zTTêάT>d6ÄÎðÆ½˜8(Ñ8w0‚Q>ôí f¼ÙÊ,³ËR=º^JÑà†¦ÁžD¢"¤TcܳôÒ!ƒf íÍP3Ìš©Ð¾xEj m€™ÈÄ÷ÿ]õ¿¡40‡ 4¨‚ HCS`›è‹MM†¾bÇQ%Ÿ†B,f1x’ªO ÁLˆD];6žwC¼°/£Ô~„wÒXš;ôPÖŠ.sPø©»õhA<l¨]ÅQ&/Ù¶‰´Ñ@“h²0 þÌ<ÇCx\uBºmìâw"5Q‡Û~¼ÔRÊX´ 9$ƒƒöX;©=(d…YñéaÚLê:5„€É7•}öƒELî[µo»÷¢êáS÷øØÕԻ߼šýCÇÿñýÝ«Vµš} ƒâ{Ëì$ò3€Òä`Õ‹ `²ˆ8J‚)ADƒàœ A§íÛR ŒÌ¨=Ú±"T@‡kG6T}˜UT1¹Ä»¦XÖŠžÍ›ß€Œl÷2=…ȾxºY"¥Ù°>îö»¶¤Lê›}_ÌÁ"5HG†{“aµBÈ}ËŠ4;5¤ùàÉaHe†„:8+"©%ȈÌQ#k â^V¼¹Ûýïþçÿ²éý5·çÔüü9–3·Ûç…/“Ð Œ›õ-é­šÜì¿T O½¾k‹Åíha3oÖ6m3WÀ§òÈt¤òœayéœ^ÚY Û CÇ¢¦ÿði ç¶z<+Ôѱ¢t¢2¿ ÎÚèƒûL}^b«+h«ë䃻 ­~½~Λîl›|Ãoó8Óf:“ =P]MéM½JnÞÒy`Õ£»àcI+43MòD—¢}^ D?g¶¯¢bÜìvûõ / ¦Œÿ»)t0‡¾‚èÆÔÝ’!ø;KÁÏ…†nÒòùœÀæ–q|OÁ/ù˜V4¾ÏAv6å¶ïWW1ª›€Ñ[Z3oøåËnüéïŒãø"°å%Ö„gS‘æçõþÈn›G¢'!¾_´èü C¬ç“ŸùÕ—©fkœëJ0+z^¸ò8Vžó/‡ßWŸ9´ï\ÆñÊÍAùY‹Ò¬[c&€ÉùxœnFaÕIÊïR½à©%{œw§á›T?O½ÚŒ³Ê÷.®9h_qú¾0˜ÚŒ2í6“H“Îy¡r´#Ö#?¿Çåi¦ùsXs–ŠGÉÜñ W·¶ÊŸîq £xiö_btÎ?dõIÓ}ºÛ¹ÆÀ“§òõkR:š}–†ÜŒ¤/qŽ^à‚.Ø)üõL›™gÌ´nÖôè‹Û 9®`ž1YþW«)Sée&ƹy…WË”>c²3]–ŽeR”À:æ=M»A`lù gj CVv­úè:I1…L¸„2€¾’¥˜›W€„»B'5ê~×ö!¦dìÝ] -ÌZò ô·¯ }|84¯ï^ß5ß¿È>^}ûª´m÷çïíãÛï~[?þPŠª2Þˆ‘E¤Q”Ed¼k¢æ`!:¶ÈõéáŽ4ðQh†[3:9tÿÃ!3‹iÄ}¹y øÐ§¯Ý°äöýÞìØyyˆ> öÎâ é/Ùïi#-ÀÜ렾䀄îÃ2Gù%/´Ô£Äs›ÖÍÐ… ÐUœ…L¥ÓJ"+Šñ>mçÐ!kJ2 ÙÒÂÔš9ICµT J¨=ÜÁòÆå ùâ@Cc„=ˆÑ;HdEߟ¤Þ‹A ‹A FRºÃa}æpô:F&1T èÈÀ!`†b@Â1XJ … 8ÐPÂ,Ùš‚Ç 9 Fdœ9¶Õh‰Æá I4EíÝ@=usà.²Bšt‡€Qm郧î#úŠZƒîÒ }?ý¤ŽÍû$ÜÑÕÁ>&Ä çcˆÃä<ùç@b˜|‰³”¬ ŠÌEÕp A˜›"»¿~‚[iFäÆc×ýðÉŒ^¬>vŸ¢B9?ö8I¿sÚ¦‚Mÿ¦:© Œ–mÔÞŸÓoe…kNž2*ðtD¯ø "‚Žfœˆ]1HЂvÁ“ßµ©”¦©Ö‰–š±¶è›Jª´å±}›ÛÒµ¯‡¶|êúæ±kÛ¢¦DÓôU™Ù“QãžVÍ ³÷¦`lîv0îkônÙ”V7cÕîñðØ6ÓÌÇeƒÌLSâD"ã±Ï¨UR2RY3#3B9l¿lÚRöí¿ÿßÿÌa~Î (æçˆ™mÓJr_˜»²_ª__—æDÃIqVoșЀ$›Ž–ëùêE‚G Í|.4;nF×Kû¥-ÁÆ“ ÎÁ.‡Ž‹ñ;Õ‚ˆYŸÈ… í¹ Í§OyÊ:ðº”ìqàl6WÜŽÄmuW,P×!€#`:lü›º7µõh)û”„ÑOõººô¬^²º/^˜±#=+.Ÿý™ÈÕs¡v¤&è:‚?Çñ7[ü®HRœ/K¦t+žMÊÈ…„Ëvwó$š'Å­s¿?mgÊ[W8éÒŸÍÀÕ"ºQÖù*ˆ‰Y‚«yj3å ܇­lQ— ¬³Ï\”ÍÎ&0—fã™ã ÏQY,«ÓÌ4™ ,xp¡ãu5þúC˜ÕBæí\®–ƒõ6ßOsi [Àèå• Ý0Öt ò" K óJÞ:ßQWµôD½m|¸ Ml¬tón†÷¶´ ý?ß.pU\è|+¸rI+Á¢KõÜ6óçz~Ü Ÿ_áuãÍUÇôl1ñÙJáR`µEpíH4 ožŒ4~¢óÇÚÿ¥¯ãJÐùªÞ¦ªùjl7á¸ó³æRyàYõ†¯Äøü"Ùçü~ùœêÒŠàùth8‹ìWm#×oîÉe0_¨Öè-+ÙŠXH4F=² ÍÐ>ÃìK„çáQl5ÜÜÖ ‡ækŽ ø Ú€IgèòN´-Ì`ŠÃ »ìjùQ¯f˜J È  ÖMù‘6‚ìæ(BßC@CÈB­cûFQ !B„9*öšOì ·où¥£lýPÉp€HÖˆ@ôP@œÌ ¥~M½ÿ6e/£6’(†pCTÀFOàŒQ¨bt!0}34~rtHŽuN5äè?<”¢Â0 qúáq':¹q»í÷MÿØW]ðáÏïØÝµûW{o›Oï?Õ®"“†Œ[0Ðä]¿UøÜÑþ ™ØUëYÀÄ : ¯Ô¢ž?&sò¯%F1‡§Ï Z_êÝpÕÄsRÝ/5yø÷|q¹žˆdÏ¿Ûç3¾ô(ýØÑÏ‘ð·",sîÎñãžÈÏ5IþºXÓ/:ÿeOºL}í3úçýý´€£­Ó3vôY>xÜ=® ÂMœºÕf-X'/¨ë¢/º÷ º—?ìM©‹PŸÓáþÜ(çRà‚ã×BvàóÿØ÷¥¶Œ›XÄ_jYÁóœgC:çH®R+^•–:[GÚ$µ[ÏßPØ7†pö‰ó¦Ä 3/Ì ‹yjÔ®¹ÙµÑõµë³ÖþЃð¦‹»ù( N'´]ƒÈZŘ"ZbWv5’楩™’J»kT_µÂï¿Ù×úþÿëŸûŒ„›õÑ‹ÇG´EÅq¿sâ›ÿôÏÿõ¿ácwï½¢˜Õ¨ƒníC" ÷æ!ˆJ¥l´®6!C"`î=©ÌbfDÀÄ„²¥Y%›È±77à!"¥ƒ²1/Vª€›)sÏÒšuÊúêeBNòMÁžÞÊhÑd#fÊ RÀôH´¢'-Y Z<¶5¥(ìe;yQHÓ}ëûðˆ< ÔëRlè›OUe4 ÷gÏǃh` ªÐÞ@öÈ@³ƒµèŒ£ûnSP{DÂ4^;©5‡=(8Dz³ÑU×ͪ“$Gì“>~Û øsÁ€J4 ÌнçDÔ wÈ„M倣ðŽ }å€lÚ›8îP^àŽèƒäÑPóÀ(õ38Ó׋ Ýî†У8JÁ x•s4€|„õ¨G$à‰èaDqÔÀ;`à¤_¤Áö9€ Œ#(´$˜óŒ2²ììöíÃc§HuUn8ÔÝëýááPºŸ¹š¹K»õ‡C}QøáÆ9yR ŽÇGjÐx‘€ù´ÝåxS£†•MŸCIɆ‡^&ß…#¾`#,É2¾ËÙôê+ìZZM¡/(æ(»Gí‹ñ 6h^ß?â°—ûd+¼j‹¥º>v´Z€Ýn2¹Ì Î¼§U‡wÕÈp 6.¦$#XŠÃÚŒ÷$ CâÄrËÉÝ·Öj$SµöÑWõµë+•Ê“I²¹ÿáOÿTöíý»×Ó÷þ¡ovâ–ƒïôTlÒ\Íæ–Lý%Àë²ñ<ЏBÊà›Ê[Í€K„RWળèñ¼ùZ²’?aàv|mµmm}¸Ú]£•eî‹ W¶¨iý™¾î2?éîèò¦Ësy·gíÿ·>h¾ËXù!ßR¥¶ÛÅ~t4mÛmáY³â§GŸ«ÿ£Ÿ«ôÿñÒnÜá´ÊÄ-;êמÃWݪžÖý²Eç>¸ù“2›7/Pƒ?§2ÜÒQœ÷Gh¶wQ¶²¹b1“”Šn 5È5>72Î@QsaÑ‹Xùj¾LØÒªGj8egåZRü¸Ÿj˹~æWd #m“–{‹ÑùuU–+ÿz9˜ÆDWÅåºöÖ<›uÍhëKŸ˜ŽgU—¹¾ÕúÓŽ|õ-^êr.AÏfF4ÿÏòs0Øš_àño+â“ßøL0w=bÚ€“϶®‰ª:!ÃG\é"avµ¶¡·ò £Í÷_9çSëR ·"¥yö}êq"Ę̀Ï<N§aåyD5²§±$žï’—nðÌ€ GU"œ´©Žß7‘!ÔדÝÞI ú¨hâ(µ¸¤ûw¯ãÐE™ùî›wïøaxI}˜ö)¨ÖPÖ”ÅP“ #w?D ³ïú„úÌÃǪû«»æ›]Þ?~ÿ}­=úê÷{¥ºÿþÃ[£ýþHwÿñÿ—û¶qÇçì€ZeHÃÃ¥é¤ÇÔK3PR0Z kj[! F¶£„‘ÈLdÒ¸OÇýªK%Bf½äd—iÀÎlèèww³Üíu¨y^ «eçÚ¥WhhQw²q¦p¨J©4ðÊ …+(%à2C¯j-ÜÅAnÜ¥uŠ€•ûð6¼~²Ê:h²«ËtÏ2û´ƒ2Q’™ãæiŽÚ€!zD(@& Ôn¬ŒÐL à“´½ Hw !ô(´ÍDt1Ud Ç{Ï3a }¢1LÖѰ@'xAãˆÉ•·8 ±Ñpt#è7”‚ ô |°­&¼`Zâ¤\d“3GbÄ 9(àmû‚*R#K`lº7HÈÉ,w¨OÐG€£ëàŽ¶ {d õ‡À&mò¨ËW,QŽ_#&> »ÓBLab2̶¬HÝc‡È¶-”¶<-ÐÄrê6±XEòT3àä0<µÁë#4rR0‡;*`†ÒBkfI  8H  Œ`'ŠCÑe°`Â’Àž-L¤»ÁÒ¬ß5YÐediÊ«?zí[ó¸ßY×ï^ÝYSTû"âñòÞ\t…öµ‹Ò†áËa`KÁ¼mKÓ°ï[Êjt¥{tß·›¥ÑK±ÈÌúú»>2Ó DÖˆˆˆ®Ìš*f^ü÷ÿôOÞ/åîÍ«#žŠÙÅHÅ'Ör,šDs!‘£.Ä:-?±GÆmôÉ0é’”çy¾ú$úû‚êL̓™­pk8Ft¦w1pGM€<&h^5Ù8îg¢=:éCr5š‹büºQk©Ï.œ©m“$N(G‡él=Cù'M†áÿÎßpY]Ë(~/P©Yu‚G) Íc?n‰DcSr!ä²ê`¸ž}Išë -´xvµÛ“–3¿}Vu|jƒVÒ<Ñ[Íü5Sacòúާœø‰¡¡ÚÏÓÝ… ZéJ8Q9gób»8‹®y=KŸkLÍ´#àÙ;)aLdgô˜=¸? A¸½Z³õÎ €þŸ "5y–ª­:Z<[’<꣮nnžymµáóÒ.Š …—à;«U³Åç&ÏþŠÉʪm¾Ikm¨y·LoòGTj/|[JO\>€¹DѪ#j5Íæyêå®qÎЀíK8cË<Ë©nœgâÉkçbj‰N€âL:oÔŸÛB æ%Á…6Ëå úz~}|î4ý®E“ÚÉØs%ߟ Ë*2—2wWðœÙ ½½|"à\aË.Ïëˆó-Úód0¶ÄÜžÂfÒ† ù“Ű5ÊrI|i“ß,ëü2Eç¯DÑ[Š ³b³Á”/¥¼Üx›€ÛíŃëòàçÛÎ-"0/á³)«N{q"ý¸ œ´Ö"r¼>™ÎÐgÌ€¹ÉÚ"P¸•ëúÜ)~sÙ‡7ì5/ùpÞìäµøÏ…-xÝ\¼²¯[ÿ[ŵóÏk1›– ®aZ2¾\Íÿ ŒÑ¥ÅµS7Gï,˜§ÒkæÀæç‡í¤˜¼‘kŸíV—ÒžÍîÍíû=rνY8’’eʸR‰â(Pöm©µv}D¾ýîÛ÷ßÏQo$“ŒÅM5úPcVŒBzƒ¨úôxhš&#$¹A‰C²º¿~uÿøoùþûÜÿöÝã!A#?>&P\©öͽïÊãŸ?Xâí?ýúzøá/:ÜCg? p‰pÙèÊ!§ Ù#¯A2ÆHÑHº2(ÁXR@#ˆy¤CÅ mB¶f¡¬ÂC¤€ >“Åš†ûØg»·³Ñh·C>ŽÍé;3ICii®Fd¹üÀ^Q °  $ƒL<)VSRJÚôå¸yçXl@‚‰;…Ú¡ (F•ÿ…à„úÁ×—pG”ãÝðƒ'ð€’ ;Â0åü¨Ë?üu¹«ØD ¨m[î¿y­¾>~|D¤"ÁÅ>)xÁ 9û9'ÅwµÂ†•‘¨|Ô"9R`2Q+J‹AÕ'F;é>Ú{HˆÉ0Yƒç·‚ ¼LÌf¦xÃñyIPT¢ßgó`-[ÞÃÝ:m‚°;©Ý³‰ÚæÛû>`/p·ëzÁŒIôù ëÓ ©GåÃ#¤nߺ‘fËH–½—¦ë{d&¹Öxd³)žyOëS‡>µºÈª•Y£ë+jdDJ‘ùÛßýÞ[o÷»ænwÿîͧåÑÒwL¹Ç¡– îHƒXõj\Ã=_ »‘W €;¿¶úxcKÔYÿÔÅæŒy;Φêë£[º#^'5nºß>Á¸r¤^² Þ¶#zsvU—žóg0æÊQó½úd¿¡€•­n ÚŸÙü9ã9à³âÏi’óRày{¯Ò%°ûÊ‚ZÌ ”2NàéÉ.bE켑0§¢¼`LVÅ¿mÀF7ðSè8]f\£_\%?]gà3›ÂS«½çÇbð9×ü ór”°eD²¬þnö^ŒaiÏo^ÿùh–ï~ÀWBÞn>Î^¾.ñÓ4â/©tOÍË/p={i¬Â°Ï‘õÿrçéMÒç=ÓÕ€K7!“Û°Þß§èüçOÎÛív¾ÔZ¸âÿú9Ç ~.Ùå'øÎ£šç“ 7:Œ>_[ó Õ‘¾.Üýãͤ¹[ßÏij^8Öù9ØÂZëæ(Nýs•³;µ¹k•ñb[nKªô¥øLì:??ŸÔ[âÔ9†e¢we>ܽ}‘™5¢Öè+0’„Ói2Ef&–2e%M`‚FšeŠF ŒðW{|óV™ŒšÍýîÐõ(%ïw âðà 3´¯÷º÷Ÿ¨ñüÝïò‡)ä¨íÎÑa·ì2k ËmÒÛÑç !CdÖ£+hÐ @Ÿ3ñ8ýµ*[3ûÌAê~Cÿ¨úƒpW¼1Û‘FR‡ª½ ‚¡< Kò®÷ZÂ’Y”R FîÄ*,PÌÑá9¼ƒ‹èJ¶in,•jÈH4´Ò["{HP_¢‚–¬Š^YÌŠ‹å”†•É‚Õ ¦Ñ|DÓðmGúÇ $’¨uÞqæ­æÔ€ «–°IÚ>cì¯/ƒþ4‹Fo[!½P4ÊʇFß¾€;ÜPc| ‡DñQÎ~gð ;î'ݳ…†Ž™GmÐàBú$n“PÔR›¢«ˆÁᲉ´‘@àƒ1Ñ×S!a3B"G+ °Ñ*I!g¬ˆ˜À}.Óâ¹Fh}ôÝ™]ýø¯-nŠ,³_LAvÚ§Ü“Áø; ,‡ëÃ[£Ã(æÃ±(b/ >i÷ûÈá€õ;ú(›í8ê•}/r¬Ühz 2 p"¼qC[\;g«ôjÞþî1îÑ´E íÛòðPÞ¼R„% ¬—a×ô‘øøðŠ¤Ûƒv½Ì¦©rd?‰Ð¥r8 •MóW/bÜ›¡Fº“R¿D 96af¾þ¢ëº“[Qßgôjå(8ë‚ÿÛ±~ñºÿQ¦çMÃøu¬mìË®µ¯)êûå³K}ø_`š×ù™º»ühý•Yô3VÎùÚØõ¥æÙMsF— _ð û¢Ÿùåõ $=ó,úé§çÏßwäY ü—DŸnàèÌÿ{5KÏ[ æÜßMUŒKŠÙ7*k÷1œ<,7ºVØlÑÕFáuCBë: €Gi˜Ê7¯¡¯ÉZWk‰Ä¬ûøbgñ óù«VΕjfÒësþÝ1©8©žhFÃ?ò¯ón=±n‹ 3C‹ÌŠ—GòÌçHG‚äñ¿oqü;2 ® ã4™y!¸åˆ›Ká åàŸ¤¬8v6.5N·®{FØ_‘nŽ@yñ á5Äý¼ ¶Íž;™¬/Ú|lšÍ§ïTpæcqÖ³8]‘ŽË J6±ØêCÒyàj°Î˪v:¹·Í9´SÝœ—Wß|]¤ÒD)!Ó‰Í~2*_}ñëïÞF­™ùîÛoßÿ}ˆ»½9sh‹„ Æm0×…S‘Q#ÉÇÈ[c±¦‡ºúþc_üþ¾í#köÕú®½ß5¯vÝÇÃߨ]¼þÇo“øøo? RfͽۮO‡ïþùÿÇÿýÿU”AîŸê ÀFt•(£‡íÈ.%³Ê~¥93¥”4™Yf2BðiôSø¹3»/nBBMÄÛMŽJ$è€ 04Q‰@"¬˜É®T°cvL7¶ôZ"Þ@)Ì*ù[39â‘QœtµÕ!Ì&ãSºÛYWÓœLPLðAa††‹é£Ø½ITÁcàN€#º ZBBMôs´Ÿ€oM¹ ž€}ÎJÒÖÆÔÕž“²<ƒŽ?TŒ2úöoƪ@Ì‘ +È:r H„€~Ÿ¨hìã? Pµ•Iy?à>~Q$`øoŸÉ„L´}³©ï~(þ…雓ޒX@?‚ôL$Ð XŽ#>Á·U"Ñ™P &švTÚ©™@Â8jûÄLåÿ¸Ö|VÐ ðqk÷mÿØeä@à±Í¨娛¯É `T»š ZC%Ãl= µŸ]èQÚñ^¬ß&‡(4J÷À€,‘ÛÍbü¢6¥BVÇíÔÆâÇPc “æ‡>÷;*‹y)dƒ-­î^ýáÿHæþÐ'ÄÆJ­n%?=”×{µ»ìMÛÆÃáЇÅcóú•íJ©ÑÓ£«m$ݳF8Kª‘ÚÝ®ƒÙÑl ¬}”Pã)k¿2³7;€èºC×#¤>jß§))Aþîþ襡{Ó6wï^óœU¯Ór´Ê8²)záB?z¾ÛÎNÄ£-ðÉwóF|3BÛTÙTÕ¼n¹bs^uä²ö¼ÀA6•1H-›@µÄ²µ>µ—¡ïÊPçÒÁª­¦²yŒ¾´`>éä§“£h³ŒŽê™«ÊÎÜŠw¼bCèN½+…)2dóéù€sã>Ï…çæ¾WÅbÊi±/•(nâ•Þ¨}üd·þŒ¤‚I„êÚݯ҇eµl[GkµÏãVþ5Æ›óù@ñh2q:3t²‹áÉæuºz˜ÝV:>omšÕyÄÜX¢ŽÓzàz½HdãÊjÝ\Ýs5§MQÍÕ¦tÎX¾™Ë9À-œíì 3)›K3m®°4WÂXnHš] —¹æÆÌŸTkx}÷ÞÚÞçâ ;C_Fâ_J-ôK(p•½Í×ѲYKO¯÷#”3‡füüà¹D‹Ù"®mÞËFn®å;¿_twµÊÏu;nl³=q‰ ¬gþúQ¯ú4ªs¾Ôlqù`ÎpÞ¸ñžØKvGÁØ/Ágü6–”ÎD7–b‹ç–ì¸/\ùÉñ,žE«¶½js‰ÍEi®ÿx6AG>‡«]bzÌfÛFõ„'ª¡Í{¿íÚþŽDçqµ·‡ñn­Ìv~©+E£sýú!{6hçX—´ª® ÿ—ùg•µ6ÅŸ]¶™í¸Ïݪ /n¬øðâÖº€Œ7„Ñu¹g }~fÉéBÞL,odÂ^5»y)r^™Žám™Î)@>æf üˆrž—4.íÓçÎ ÙùÌhyþœÇCzÈ~o™8“ßÃÅÛ y‰J²ŒF0‹úÏgaóùâ:"þKùÌÍ b£B¶®ÜDõXl(Ç.¸§¦+7̶#­µ§ÔÉ]┯͇JK‚y¥åÆ`z>áç>ëýçvУ*‚0ˆrF:ß›}›5ú®Ëï¾ùöÏýkF˜Hæ#ªšÁ>+{k¢"S¥¡[9Df*ˆR{mØµÕ ©ZmiË;·7ûúáSñô}swß>üùcúîÃcÿЕ]Ó~û¦¯™Æ†ìººÿÓ?ü¿þeÐ|éÇ‹·9' V1Çnc CÅ4’DŬ’’Œ2#¸d9(š €;³N™$²<©¦eãÔ8t@—ʶZ“Õ%hÖGöJ#ÌŒäJ ©‚ni™ ÅX‚=Êœ-ì`áâ^H‚}ê£ÕFÖš‰j‹u‰ ìÍ%Àq¨‘ÐÞ½Ï|Èš”L)QŒ^àÆàOj¨:Œgh½7¢qÔâT9ˆ eà 5²Ê¦ ÷Ðzõ&Àlà6"d¥@$š=P PA'´'Ô£ËɹñúúDÜF«÷Qjæ”Ò *óBE6v¾À8' &Š!!x¢LfÅ9ÔräFô¦¥x$DŽo°ñýHD6þ¨ëÐêMÖkŸi]Fjô䆳96w³'²˜3¨k«Dºh';w©»0/~ÕíæIðëêØn¦ÚÄeeå'ç|ßÚˆàLå㊱Ás2ªõcZ²I΋jÏé­æ³íp±)œ¢å&qêYmJ<+ ]÷óø]ÆO Íè‰rÊÈçê6±ÎÃ_\£xùN¥¯$ôüŨÛfÏq\9$Œ·wã_ÂÒÎ%€^0a~¹¢ó—Åʶp¹' T—\6Ïïèv¹žg­’9hÿ²^å§¿Qx­ÚðE÷<žlî~¼×š3ò9¾¿¾¾Èüy^Öin| å«¿ƒÇ¨ÁŸñÆÓýþík…22úšÌT¤<\—9 ,ƒ&~ríú(铉˜úñi£r=slYímT¹±}_)N ‹û9bì}Î8 Ë(QÊI¥'(Žý(HÁ @Œg1Üï¡ëGÚÁÐG_ J3~fNnº#-pƒj<ƒæ~Žš6G`¸LHƒ„“ÄìmãÁ:ÁåÙO¦Á8auÓsÔÓ¡„tê(¿s,Aa»óOú?ƒåï±Ä—½]9 æÙÑ8gÅ€£tÕÐÿÑqWð÷Á@â(p4À÷~?þ|@üc(¢X3^ÐÈü Á5FöFTìšB‡R;/p²õ¦*‰0ºMK§õ¡¦Í}½kÜYú¶) vþ§ÿ³‘ÖpdzÃ!v;:=Ã#KÓªõǯ«ûã@ùêÃ!‰ìj)ÖYJÍtsŽ¢Fä1ýhh"µm@X†ÕTŸ¦ø©¯õÐGæÐÎZŠÿöhï÷¯¿{7Y§ã~¿_ÔYÎ|äuDüÊT;§Áç`p7 fsAÎ-Ú¾ s¿ŸÉcÌÌy#įqòßÚäü9>¯ÊøyÎ¥_gø´å12³_Çä×ׯ¯óU¸AOû××ßÂë/:ÿ¥0±Ïo!ºñ)¬¾z&G©?äö'r.Xzéîæ%‹³å¬sþ*«/^HhÏd^O¢Óe­ËDÒfºA³ÅC/¡ì ª”ÙìÚÝ·¯›×ÿùð×ùþ‹uʸ™5Ói>t7GRrƒe1耛uJQ!Œ!ŸªŽ!‘ìRÉTª'Þ4¼/¬Iµ¦ wm£]JT «…æt#30)*!x¦¸+žÃúß;ª&¢ƒ¼•ì™E J éÍ…ú”Ù&]†¤W&Õ! è‘N8`VQ)˜dèSŸ4DNŠU5€m;:Áítd¨pƒ ²õ„¾±rŒYç&Fo ½ÀIg@–Õ ªH »ÝŽKˆIW‡DáÓbÐåh';${ÿ‡žz›Ê0x H›‡bÒÂxœ¬#r¸s4 Q ¤ùmlíœ! h ã8CU£I„@‚å臡jÔ÷1ÃP•qƒ )QtR‚ ­áþÍmÿhjpüÃüT1ÎfØ$Ó4ôøƒÏq½;ÚðÚXäÈÉœÙi…¢Œ>É6x9 t‡‰w0øH£¢öhŠ5¥t0P™„I4+é`fÃÂ,Õȃ—lÛzнÚÿ»ÿ5ºÎà¬}©è_í˶ݵ #ihJÛÕ>>=ö÷¯K³ë"ú”Ñ4"ѰÛU3X‰Ú‘‚j©”‘F¶™MfuG)}MIa©N0 —û¾ì¬ë=žýÃÚ]ÓÞïïß½žmŒÓ>¿TÑX‹?ž7sŽ§Þµ¹Êݼ]‹øçÊçòª³ ޹+8õ\Fc}­>ÿrôÈmIà $é“ u†aÍñ9WËØ8OÏÂU˜­9‡âD¯Dw&?Óáv–Ãm‡ÁÓC”Î8Ü‹æzÎ"ÑyÄ£g¹þb“R½• ጠսl{ºÎÞùd«ïáš !ÊlœÍä/wáîûdR7ŸùOê$ÜöÏü,wÉ 9Á"~žÙi©¿¨[2ØsñŸ‰'v4(>I3MÍ„œÂÛùc¦j¡œ±m|zƒYïb¥Œ&˜FšG·l,:‚—»}!¦páªÖ;á¦sÉòæ ´fŒ Â*ë§rÚÎr£Ytjë|n±gÚ{$À#;|ºZž)âbîqE¨íìv> î™ïE³Ä‘Ç¿­H 3–g»åpwv!Ñ,­yæ?ûó|pVà=–#ŠË»¸Vë=÷>óeÙØL^ŽEž‰li6\|"9?#{}^mØ"Žw=ÜòUÝð-ÓîÑ1é8 nxôÚêñ_&Ý· ,>s(Îâ™ó}qû¾¢â‚->ÙíB(—}ÖŠrÛ'þ冖•ÎûòNçÛÑiM]]º°š~É¢óü¼Sräž®+U¢Kðõù3ׯ»~1k¤ + ZlßÂåëy—ÓÞ>¿Mœ”ª8ß”ÏWé…½PCà‰µÇk‘=Ïw‚ç–0g%‡£îâ±î°Àù–ŒÑ'´·.@ÿç«ŽË O—„Ÿyž­vãö7'Ü\óÂÀéó‚Ç¥éºÍe»°oîón™‡=çár:ôøÌˆ`ñ•7ÄB‹£t4柩b*>Íÿ½¶ NBAÏs`»ê=cŒÜécF¿`»ç)kÚ¢ p3ƒ=ÏŽbç«uw F¿í]Šæ[膕ñò5—þÝ. ÍvD­þg~äÏ)|\(\T³ÛÕ®Ö®>¢V:iDF@ÅY¥®¯¶¥Y­=Ì™ì«;ƒo¢ªìwFd_yww÷ûo›oJÖè~øÈÙ÷Íý¾~xDôÒXö‡þÃ"ÓÀÐwÿüOÝ¿þ·¾‹š bg>˜î°ÁX ÈÌ$¥fLs7tdK-Á]͘)/Èa 2cf9d*‘b¢UàŽ®"söÌrZEä*„!,颥 Ív W¼FQµR6¸  ïßÁ{f0™Q-Õ9¤ƒeÓ³Àx@´Å<ì¡Ö>’D»‹¦ælÈ 5f()& °8FÙ×húš„QdŒXü`„ ¢öã¿°GÜüd±;à“jÍñXw ¥AiFÙA»#º€P{ø(çUDŽ¿›šޱK½ øp=7¨G$áoh4?ˆ:Â÷}…eèÏœlcÜÈrø¨Aö§Â `ÈæÖ¨üSûQG(5¶åÛÀ°QhPØ7¢ÒCÄèw;H&] ú½ÿ«Ò{.{üÛäè]1hîë”Ì H›4è:_+%C7úàlä9\ª&  AëýŸsÆ{Tƒ†ç8L!U˜£´²W’t N£RAezTucÌŠÚPÓ–»&¬Í,¥yÛ6Ö³ô #w ùúÊ>óðáqoK¯îWç¡î¥!:÷œÓv°®•ê÷ÆF}cæ ‹>eˆ¼~µÕÛ¾¸÷ãŦ+Ì!þ‹²ÕgeË/ƒ¾nÔG—Z$:Ãøž:×Öéþ…!Ñõ¢ÎS3í‰dð&C”í­cþÊ+t(_CŸçí¦k³[5 fËBKÀ10ã…1º•pK?ò ¼œõ°^S³ø|ÅìŸðµÕùÁs€§ŽEžtø{yupë®/€]^›Ï>ß_<‡¿”Yñµ}r.÷¢/*?£õ64”áoåNfƒ†¶Í0£=ÎýÙÌøÕ3ˆ—Èþúúñ§ ¼¦éµH^tºŒF¯¼Pœ: iïÞ½ê‡Ú×H½{÷Ýû÷MV¥‘‰„‘!<>v܆ÙXcNTIiín »¬™MqÕìÿüëß}cÅúOíÛÝë?~÷iߪ«wå.ºÚüñ»xxè˜1º˜jßÜQzóïþ—ÿöý¿1dƨÇFÃÑ´ƒúÈ;³Aü=¥M'!wF"BM¡útgí4Ô‘¬© )3%H6?D$UvÚµP Ü•R‘™¨–é ØT3Cšàh ªê˜³uŠOõ+°–¢¨L°„GÄt3¬½²f¹+£ -ò 6½Qœwá(ê%T#Á‡½«4hÓ?ƒ¡.eßçm¨JXA<ŒJ/‰zäL³e÷g!8'%{ÀÈPÆžiX&¥x¡V´ƒ:@G=Àˆ’PAMøgsü^·±P‡ø£Š}Œ¸k 8Gù  Ø@èp¬ñQ'…ýÖ2Ö*hè;h7‚Hô@öhÒˆµ;€Á?y GØPÞbÄÊ DÜD&ÜF-ž´1b O>“I¯éÔÔ¿r@ϳ¤3'`gp ®@e3 $q4þ¦Ö~úK©±8¡™0†i`£xlÒ8 0”S:cìÇËo 4dÂi DeßìÜiæ jú®ì©04Þ»^ÉïŒ;CóêuKß±-ÍÃ'Ö¶e×TwÈ<²ÆÌËë×*ž]ïmã™f©¨ w¸±mŠ 7æÀ¦€»S©Ì$)se-©L´–HZ—q¨µÔÚVEßW)•Šûæ·ßݽ¹ýÝ»Áûw÷bÕ×4¨Œ¿ÐHàIîæOõòÇ xol;Â0Ù~É9Ö¶*d<Ëlèïùõ·§OµÁø±Âi¿Î¨Ÿ+§ÌIJpû«Гèí¯ãðëë××ßèÙú‹ÿz#ö#|쥚˪ ¶:ÅÎϵ/rͧf™Y›Ìs?·ù´¸¡ã`Õ«s^Ç×¥ köN^†/y¢þ}-@sù4W}Ñ$*4·´Ö<{’î±ô²81`­C“îâ¶ÌØŸ5ôDex¾ÝØàO·ê8x¢ÖÇ-µ§¹n~.W³ÔS.ÈôÌÛÿçóŽ·­¤©àÌzXçò@ÄùÍó‰àì–ªàŒ°l²à×siO8»þI"eíäuqpNÔÖS;‘˜8çÇâ²JÃí'·^ó© ë€Á¢ƒWìªÓIŸY^³kkýc5Þ|ó݇÷¥É”Üid[Xd$"d4¥ú¨¤s¥DDif¤7w­¾HõŸên¿·ý]ƒ¬}Å[³ÌþP…O¼~µÿËý³…2R]_ÚÒ¼¾ûpèöÿþO‡ÿ÷ÿ†È@T*SÅÆrPFn$p‡Ým‘¢‘ÙI¡¨l†Ô‰Ý¬£jغwf‘ ¨m¬ud"_/dJ1t‚REfÎ2¨ZRE(ž»–•ÙCÙ3™¥áÎM>虳˜="SrãNÖefEãVÂBÁV¨h;7f"[3s õ)ãNNG›&DE ”ÒZˆŠÕ£Füàì:êYù8ybàdL’ïtŽú ˆ !I˜FÅ!+(¢ æ'…þ¡õ¾XZ÷þWš/ÂP3,^p}ªÐ¦„sláÇаÐPï)ð2*û„ûadl¼ަ1Â&ôß`FQ‘ðÆ/21ìÃ”Š T”L€tcPn4YöÞÜ1Ûæ®¹³Ýݧ̪h[/o¼ +U´]ë­[iÂáã£Ù‡úü¡ëKÓºšZw»è#KÏz‰óiyÝãê `Zsœoæ¥Íçv…¢›,.sC=ÅœÏÞrÄÙ׿¶:þÎv×κz*OmäOmSà¨3»U ¸yá-çÐÆLZ¿Og¼gmgWÈ;³V6s] ³¼j½;\<®î÷œ6–èêQñ(º",}–ÇÝfO²s6ÜuPÛÆb¶ÍÁ\Iv]•ê¥EBa."sVA9–a6¶¶k·8Ç6Îq­kuúóM¯D¶F¢Æ|Þ¯gÙZý~QMÖ¼Üóðá<›3îâÂ8ã_X&Z h>둚ÉK£‚ãö<÷˜ÏD'–'ç™f,»w¯kdÖ¬µgèë° ;e‹Ò4Ž”¤:pC}¤¦-F &" hšÆÍ²ÖžôÝHÿÍ;š‘zü˧ÿõ¯oþñ[Ͼ~øË¸¿ûÝkôµ>öw÷íÇ¿¾ïºW¿Év¿ëû¸ûæ›Ãÿ³¹e¤™èI TÛ""€†°TRô@%1©|ª¯<„©©|Ð:dÀÈCDã4‘“IôÊÞ`Kæ€jˆ– Ï.¤Gì pùpòyÞµÖõ–+& îŠ ¶0'ÝA tL5¢À©ô¤¡IRxˆÌ.Ц×T@ÅYd½9*ÑqáĈ*:™¨âCÑ1ÙáÖ„„bh jBCÉd„éÞ¿ídŠ›9©a’Œ×Øh³3àe‚˜…èCH8GÿÁ @MA t0YûŽúE€ F†L(à>šuM­,NäýO ûÉð@SC=Gù~#ö;(‘9–4}&Œ°Á¾x€Ëc„ ×XŽ‚ÒŒŠüH Gæ#€kÍ=@〵€\‹Nô2Ü‘°3p’ò'ÁƒÉß/+€C9öøÛQÝÆý’eü'É©B ˜™¹G­n(—Æ#³-DAUO§ Å(švm!98 ÓI¼ˆŽ ¬i¼uÛ![Ïl_ÝAm³oê§°ý[{ìv¯îpLó“aPq‹Ø=T=v9d̬”¨!N™™1û¦‘Tk(s×øpW‘”5åfM¤úTW#²‹èkêk4Ú5Í7¯ö¯îïß½"†"©åù‚£Ô WRz6þ¹8öO£®$T:{—‚ò+Z±ç¦ç”êç@ÿ‘5éJf¸¢/åYÁú$;IivŠÝæA4~µ Ðy D_ÄÑss)Î ŽÝö§«›­NÍã]Ì©›ìVêÀË~•Q+f¦{K«Í1bÕç`³+–•Ò¢‰g¶Í"ȳ•´¼Á‹‘û-бOMZm-´ê7Çk8Ã9j³r–áèiÜÜK§€lŒmÃF§î¨«¡þeTäì.®M‰å?]-%bCP ëÖ.âù|£K¥©Û?窂ó†Üè”EŽK_‹º¯®À4×AÃ|9,á“ÂèTØdù¬2¤“¦ôÐ ;ÔŽóóL=ééŒìz%rÞžµj=º •»ýEó}có`Z.·ãÓÙÐNY™Ÿ¬ŽÌs­ÿU¹nsl/•{ÅQì^:ÿÚ*ãxsóÂÒV«ç ÷âKB)—7½­:±žÆv/4üÞZ†_£5“xó1]þ|\ûÊ~ËYœužà_øEáfòÓ\Jn^úœé-_ƒ\èSHðøÝk ÷14•.lqWºIžŒgÎçܤÐþ”Š÷/Ntþ"À´ãêóÐÝ£¾ÇíñÇ‚pS\ô¥îKçï3_?#  ÏÚgVi¿4pü’™´Ýò|þçw~oÅ7‰Áý¼ÎÄ‘¿âƒ®8ñ'â-Ÿ3Ο¯¡±hK»¢­­Âuˆ\+  ÀëoßdøŠ|÷î›~ød)…H ßdJ’ÌXÜES ®¶!íZ#8`ÁC œMª{xx|xÜ÷¦}}ç–™y÷ê®ùÍkÐÚ»]´¯ïÚ]QþÓAd÷×yï}µï¾¹OuùA™‘¢ÒI`© Zÿ0¥ âÿp©¯9tÇcrãp'TžÀÿ Â/±SÔTG¶îfô¦ŒPUÊ3i,9ú³¨8ì,$õ©#¥‹D1*qP†DÉ,Ý™5 (…’æÄÁBE$;ɉ{óƒF#ŠÉÀH‰@˜/剖@ƒG)£èä MÞ¶lˆU€2ƒ†~.N‡A\> ÅÔ]>É u‹îov£]ðà*~Ê.XÓ‚0CSª™ä w„>T2ÙALU0ÄTØ÷n>FBº¢w´;ó΢göÊâ4SÇJ¨"µ/掀`Õ¼Qk¦To‚dˆ–® `%ÒÜ!Os "¬t@µ, û,Õ3-jK&Õ„LäCf’r"©¬ÐÁZò0(§%G‘oP»ÑìwçÓû5Q÷‚€XÁD3TlêÍÅi‚S#½À¦¦øw`woƹ• *óBhlH7]?þº€Æ€@ã·d"cëI¸!Ü0(>ù §Hc_oÔ“ðýP ŒƒCCk¨ÅCÕ29bôÎQ÷߈b™ÀÆ%3D™?€c÷<—ã‹ûâGø^ 4#»¤m&­*I 9 šE)¸C‰Eœ"¦Áœöࣺ‘&ôÿȳÇ?ê@G¹ÿftxG#ËÎÚ]Óg …¢>#]÷ÍîPDÛÖä¡(¥IY…Ú»†Æj2VŒn^˜î¿ÿÏíëû|xd×#Õ¾½ßíoQöðÈ]›û¶í+€*eª©•BîöõýÇ ðÍ=ÿòCRÊè#k”Ì’êÝ@ûãïoÅï~û.¦¡ä,Dí¥YçòFãÓaÃOX0Øl’Ý4ûý±¤U'ÝYðÈSÍ~Ù<)qÝf°ºµK&™¸ìðxìx[qLq" ,òçŸõTTz᜸.ÿrsÃÝvàeº'_Í@ÒÍ"oúð+Ž/XMOÅT Û䋊MÛñ6oG+n~âsbp6’×y9ÃÁû™¹úS¿u«Pɕƿ Œo “þ¯¶? .œºÑ3v©î©'¿b¾Û¯ü^vyótãºeîgïUÑ¡' ‹¼ruÀÌÜÀ¡ÎW½®úolû—üß?=Ÿxþ áæ+¢·ƒæÂË l·3À>'»æ§’/jùQJòC·æìž6ˆg?ÞäyJûüÚcýå‰ÎMõKU¶Ž‰…øØÜõú8ÓηôU¢q%z¹²´ýú/ÇbNÞä­`®ÓšÎÐÑ[ŽÑy™Ý©£'ç/MÊåss?y´\ Jx”åYhΞžÿ*œ³+ÏFc ®_Î’Wñîpm+É—c!ðèd0>—i`O¢Gb6NêšÑiˆ‹ÑÆR*øYAƵÔB—+><=ùY'ùqòyŒ>ÎéÎ9¡Ë˜Óx^šN§7h+‡›ä*|"6÷‹[³Ó]K‘°ã,ݶb_73ž ŽÙÃ:s86øhþù\ì9'gNý샖/`3pšÓ=ß½{•‘R.ñî훿|ÿCd¶hÝŠoԻ¶”ˆ>S]%/2³áînfźOÿã{{/â±ï÷»F]Oi¯ör<ï¸ß·f<vMüð‘©OŸUQ}|ÿ±î[õª?üÀ!Næi. ÍÒ5$#&¤?%…Btj€ÐCdŸà„9QE@æðlˆU’Á]áñ¹¡1ZÐŒl²– Èɬh †…$­ "I´²C—¥3¢`ç@”1žÕ³©$2ÕÈC& 1)³I´H# |lQOAS³9rll7"û/1êõç ž/d?öé7†ì‘…kò¤N$NƵ×öý^gÀ 8'Î5c—úQ|u D‚†Ý}~ÊÑQ c„­‹#mÄÙ‡€‰Ñ@1^¿MJGGÓÝ£0Ž(ôGrüD?÷€øT0Í nÓN5›l Êtã¾?¬)·±T‚“úaôÝU‰¬coþà®|,cd€ÅÃ×@ˆ¤Æ=Ǝ܇aüóXwÕØé?êq$jÏi…!™ÓfƒMàæ”lKÓî„{) á0·’ÍûþÐ ·ÛˆÆïvgc(÷ÿô?‹ìK9TÙ®q(S¥)í¾m#ú¼4fã'Ø+êú»¤µè›Æv·»/n‘½;ïöÙõåÝ[kË0åRéôÒÇÄoYR¦2U3ûÈÕPê‚Ó(/0ûÃ?üÁŠÝ½}cnæ–}ÅvÁQ<##`–.*­Ëvˆã›ŽaV¶E'8ÏÌÿupÙù¹ë^‚¯Ã‹ç‡òtúð¥ È&=_Ç?]—3zú:ZX¡W+Åð“*]ÉuOI®©dœŽì¹6Eüù´CÀ惻.ÅyK‚¹•baž»+/W³ë³]'¾ã\4I³Zͱßk¦}¤™‚æâ[f×¹€æÏ¿÷Êù>E3 »µp’O»^FùžˆrÿDç±TG–8Þç—1®œ¡WO“'PžþÆ+¸ÿOϘë~½Òͳ‹Â·>Î[Õù¯+WN¢8ï‚ßü–ëƒv o¹XpeOÇÍŽ<޾}›¶_•÷`{³ÓeñÈKçÛ €\v¿vM7ìÏ=?kþ úÚw»úáV¸Çu`{^¼0,»ì¦·‘ÈÎ{ŽÎodUÑÊ"Aï¿}蟢«µêí›×ß¿fÙ ˆR@3›Cîp0·–-õ¿5™Õ,÷¯ÐÕ®ªûŸÞ|‹ý«]tµïY‹Æí®Ù¿¹Ë¿|ˆ>ÚwµFú¾9DÆ/Ø·{ª9Í‚H\Œúz‹÷K1~¯Ðv†€tò¼òfñq­$õ禷Ô9^ú†¯Å¸ñ“×À6*ÒCȳâ߯­úžr¾lÇøÜ¼ù篊†-ß‹@É_Ì×=·¯Î¸Ücñ7'"õ‹ñ^ºÙócî3ðóiåóë´ŒU€n ¤ç%ôçKy¡y÷ʦô†Æ^LŒ^ò8Ÿ+„ÎkÑîQ°æz¬ÙÿØ^óŸ˜Yf^qöx²=m2Æ…ç#\VFºú(µÝ¦ã®«C‡eñdán|ÃLâÿ|ê»ÒL¢hdÑþF°°áÚüWs`s¾Ú´YìçÅxM×9¼)òÐåg31BW½ +÷ìçe•ëüf€sÛ'^¾¥\^!_}÷6¥µ«L|óöÝÞÿìÅIOðÐ×âÌá‡Rf¨iI E¦¦àfæÖïÚ¾Fkæw-eù›·zµQ]t]­jv-Ú&$‡OùØÁ Mã]ìw¨©r·«þÁ™)•ÙP xˆ‘nÌÑ6  )§¾$‡0ù×yï†Qˆ%Ph…Jfƒ«’¨=ÂS„‚nHWÉÑ„ÝaroÔ#Š£1+®ìm€vÑÊŒ¬Ì舶º…Pûª¦Eê†ý`áÕ2³lŠ­ÎÚ‘9±:uBÿ”‚¦…7t†æôèY(,d'é2 €øø@˜äcF©ýHÔ^`>*Ë“±ÀàíI ‡6BØ`H ïQ ņª ¬G×C&j- vƒNÀ&;Üq ÊèÏDS·>F| ‰ŽýÃj ‰†¨9šåîÚñ^|èîŸxŠÑ?C¹Â&–ÀtGGlý™ãøŒ¾Ä9Õ ˆ4 á>Ê÷¿5 ÚÀTàÄ0þœ¨6ߟ|poæ8[0ëúWBvRù—VèMÙÕž:@ÒXÜjF@înVœ,¥ìJ fã¥xyÌjŘ0w/F÷¢áÝ®ñBïþÓÿ¥í»þã!ÁRØKioh$Fà®}H45wÎ}W«îwx¬©†: d0¡Ö>ÜêK`M’ÓÌL©ÇÚ2 £Â,SHI™‘Z£†"²AÈŒî^šbn¿û§üæ·ßÙõ}èÚ*3–8IþÝ:vìÔ'¾Zéx>º\Ãýòèÿy¿çO—ŸA6cç§.ŸÆ7Ö/p‡Ò¢pá·gßòMkuŽò”nðÈ=Ưgýâ3‘ç&Ôx†³Ï² Îv»Qc|¿ŽŸÊãëŠÖ¦qo%A;ÌÂÌ{g¯Í§‹{Ù]w¼ZUOæ¹ÍÙ<Ô3<ñ±›ÔFx7ŧž8>s  qfsV=ÁÚYaôé”–?ºø,¯„šqè—½ÇqX…q' ™›ö¨ 9R,)/} –̈¸¥d·¡ÛªnhEŽ>¾y® ¬ Âø<Ã;ëÍ?ß¶´X¿‹Ô’÷;˜Gñ¥6—7FØóe'…þÏökgöæv©Ù?éjN<­)WóêÛw€‡èB5^ß¿zÿñÃðöÒÌús7¢Ö0#À>ƒ1²û”FzS2Uk% ήªÝ5êºÒ4Uúôþ‘?|ºÛï›])wûx<<½§˜a!A‰ ²›' O¬3EèvŠsG¢ç"A3ºôüs6ÉéW²žŸ?G1“6¢–¨'¹)ˆxî¡už&md'-Í@¾yÜ8L ñ¨ªé<Ô¢L1èÈ-Ò†máZv™A«“ Áyä<Õzâڮ毣-5€×3áœ?‹N™SÚ¸ëeÏ<êR¦ÆØM§˜mù-‹ž‚–­iu!õ]k ­¦ð2*¼è™±ŒmTŽQòìn®‹x,ë7KÈS<¿ÞsÖØ Waðº”xIWçÒô{>7e³”ÂëÍ«áýLœäe‘Í”s%Js†mP³ç9ÂJŸg%³ó’°XŒGm›Kaúå'uAIÊæ%; Ï :sÙ¹ÕW\Á‰ŽrRg«vµŽ, ^Ƴ¸Üµ¸°SöÔÉciYœ©·é ~kͧŽc®Žr,uÌ®®²ÓôÁSŠÓO Šè\£a+eä ëÒ-«l%N2çUyLxì5šJ³øyfJÜ XršÄz§âV{èIÆçLvìnm‘ç²Qçš7¢"ç@ŸQ·¸hau<¾IP³ÊûJ¾øêU]’ »agæùT¹~BýòDçç—1?,¶U€¤Í³vîs‚`Õ•&nk@Ù@™øD-pŘ€ÐkÕÇKøÉ"úÍ=ÜozÁB*¸Ê˜!©XêÌó$ËMñ”dØmõÞgT¦5Ó£_#Œ¼Åê&Àñ‡+ÀyþpuMJZ{çרó`í–b¸æŒóLëùªJšŸ\Sþ©§Ë­âk§ãMç³þóéM<»!}aô-·¼)y殼:†/¹5m}'Ÿµ’x)|U¹Paæ9Ýø«ÔoûÈ1éÖ .;ѧDâõ·o?€j_£¯¯î^zø 4ANCfPDÐÌöû=”Zt#T# ²áÀÒ6Y»¨5æž`ÙïjªºÏ¼kÙøß>ôYwûöõ?~÷éÏ3ò äßéu=¼ÿ¤!‹Ô 0e­™¤T¤LNI ª}_ÙÒª23±$h5Q ‡¹JiW(EW¦%," ‡”¥äb$]ô03e*MÜgy8èÃ.z©$[ZŸƒ wAO3±f–;•GÅ£aè”ý”æhÏ[&ÀZƒù­FÝ›Q(?‘MwŸ^bòÅ`h&L޲˜¼P…ÚØÆ>%TÓ_ ˜€€9hPŒˆÿÐož#žNˆÍ¾õöN,)f×+?™¨)ˆ£šÚä}¬³Ê„Æk6ƒ8úS£j¾_“úÆÔ¤cÕn˜Ñnèb2-ÐX9ð)‰H‡€ÆáBƪH€f§Æhƒ&æqœ‡»k¬½+ äè,Q)‡¹£¸É]ÁšIãÞÛ°4÷â ŒtcñƼ7<‚;w3¶Þ8íÕŸþ3tQ½XS`ì:¯¡»ÍÌ‹êÁÜ7T¡ÉLt)ïŽG2k–C‡Ô#¸‡Gò` …ɲ˜'™ÊY3 ™*Fròu&k¨•@ÔP¨5ú:T`2¥Ìa¿-mùÓÿô¿ùÝ·Ã>åf6ž´)¥›´•þÝ5Ýœ~Ê“"ƒ~jÀldÓsŽ^ê)X|âÓ €á5COVÈê%î^ð nêt[ðÁ3kXÞð7ÍÓÏeH›êüÙã1([ òèÁÆJòâÛ»½ËUÏ.Íâ=]¼×…ø¯*¯1¶<¥_Œàÿúúr»ë “hÏ;¾x!ë‹?z=SÅ‚|ÉZÛbÜrŽZ>cvÅ8®ÑEƒ3u$·nWj?÷6ÏÕHn÷¢Xº¶}Vý…öF¼`2?/%n3Êxi<ðE3gŽî?A4³QœY¢7?'Vï¢óÏÝðÏkº z¥‘ôRµæ‹ÚŸJÂ?bбïãs%€°Å 9fV€/1¤×[ ~Êa=µŸaæ¶z[[ùÊÌjE"¸Iðª†Ï¨Ô°(:=éˆõdà§æ îܧ÷e«E{ü…ÀèdXxVõŸ¹*½ð«’åûÒw>gá­µ’~%þÉÏ\­‹Ÿ2£ãÂvoµ¹¿þîíGAŸ>E¤2Þ¼yûáý„Ì‹ïJF¥™™{)ÈTÔÈ$mjþp3¥‘€¼mÍAîŸ>Å_>úÛ{7¶…x}gżÐ–CmÞÞ=þõ=ë‡hïÛ7ÅÚòp8ÈØ¼{>e&Âh(RB"œ’E Ô\ø…+—Œ¡Þ²5#ñ¨ŒDi²qw¸€ÆT•­Ye¦Ô’™Ì’Å-R öÙ4´žv× ¶Þ„‰Ž` jÌVSëD‹»ê¬lhÕR,i™¨m´°Ý°W­ªP}Ö­W"Dƒ'8ô£€ÌÉ wpˆðâ©k~èLtêsÓǨ?ëp™üf1ÊËŒ£c8öbvÊ£”ÍôkÇòÀmûÐûï°B’ EÔªIp‡ï3sßö,èÆ @(F²‚Nȉbc÷}Ÿ(y2ö2þ+ˆÀP30*U¦Žó±¡Þ4Š „B¸Á&„}è'pßÛ©š2F®CŽ_1ªÈL^ÆrÈàB ‚0 €Чk«¨=¬Àʤ8D`RjJi›æã§ƒˆTj(ØøD`ÀZËH+ÜÝ—æÎºÞ‹ï/C…ÂÀ¬8+ÒHM1ô’hfƒÕ¯k00¼þãŸè»¦6 œùØÀ®Ý)³¯jêÝ]IR³)ÑUJ%"½ôI D–èÝ;°ïëÛRÒø¨†­R‰Ì,PìJU1"Rt“©PB’ú¾ë‘ʬ}‘FÒFZ^ÛoÊ?þÇÿðú›7Ë(™YûÚõÑ4,nÉ\:?2¿FÔ9ÀcìùGµkíŸC ØUÄ„Ë0ãkÝïó{o¢Ïí ¬™gÓvNìÕ× ÎBÿS ª‹áô¶Yî&íuVø²©ããô¬¸øvÆý‰Ís¡Åuõ ¶ÿÿ¶·‹m²ÎçéBLÝâOìôgß«ñ´/å\bœÜü׋RŸ ÞÆfæ CöôòáIiö'ž{?.”² ŸýÂ^CUs1ÈsÍÅ矃úqC£ç ýL$ƒÎgõ¹˜Áßf`‰_ªèü³SŒ#ýóLè‹PëÎïj9V*ëGÙ¥¥±ôö8ßvj¼´#vNzî Æ¹•ÄBÊ•HŽó–np -Ôû7ÍSÿ(#si"žÑ¯fí"ËoÞ&ÎòìoXv¼_ {Í*E'ýŸu‰v™>-h,ÒúkºÀB‘hÍŸXNÎ:òujHš¥÷<ú`‚—’•ŽÍ¨þ#-ãrù‰MýøGÃ(öHÝçÂ+Çy3X„bnr·ÔJ:Æ€£‚Çsñ„Ú®´èµS˜úM4 ž OoZ-Ëyz¶™‡\Ú€6öÙMîëÕˆ| '8õ€¬Û§ââ§ݸ£óôãLÄ_¼í¨ßb»/H”ÇËX±át³ èæ99­Ôy!h¡žtK˜5ëÎ<¦§|ý›·Ã:sß¼}ûÃ?4;²¯¡4÷f×(3j6ûAA&“0 )Jn»]}mïî²xf*j ¸™7ÅBûjÿM)‡Ö½ØÇ¿~@S|—wwM>ÖÎ:3Û·¡èz{}xÿ±š,‡•e„†Þÿ2+ÑL¸œ¦E5 …“™ê2ÐP`™ƒÈ‹zK#vÅÜc5Ñ8«‹–ò P„;ŠQPVT-#P`Ùd˜¬è®–¾ íÉm´á SÓ;©&K+-Ìñá=XE—‹Gd<¬ãÓ+e„¤†ÆpÎäéO1¶¨;€Uûs2 Î#‡À!{üžshEG&2F{ÌVpÔq—UEÓ œr3w°¤ì2ÂÑÚÝ«øØwß÷ƒ†‘†ªŒ£åØË_€£8O1ÄÀc H4ó±¤!C&ÜÇÖý¶àã{¼þ])¯ßþò)ºÈ‹<äzŽŠfУæhØ;èéc¢™voof§ë4,ƒKðq;rÍ~‡ª 9´ÿÇt0hÒå‚(YpW\bdÔ*˜NÆÅ40Ý­Ý5n,-Û¶ùôØE&œ™r’DBí}¹{µûôø(‡\ÙìÊýýþPAµÖÔš„s|û•L°Ð¬/…^ÒŒæ÷¿ÿG˜…PÍÊÝÀAf}†7÷{¾jÙ§?ôaû=v¥VDz>noîš÷õ±ÒîMSJS@#Ù›ЇR°.åÃnm4Á3ƒv ÖFÏ” R¤TFÖ¾"B!ff„$7óbVœf¤ýñßÿ»û·¯ÉµjÃð73۵âÅD¬8ïØn+Ð:l:Õ Ï8[kVؤøCžh W™–Ë)zƵhnÅcÐ…”õr쵕Þly[eõ‹3Ë•gWÈMLy™ÓÏû•³n×Ð_Im8d΄-WñqŒLt6æsɆ!ˆã‚‰¹´¸”R^g ¯˜ìœ)#ÄQË“M3º¹.rj‰XæDœé~ê©b#X±£óÈ&»¦‘¢“,ÚKÍ“ÉK|Q¿ÛŠJ®ëäÒ•2ÌæÈÏ{Vx2 áì¦×b sÀ‘Òm²ËíLHd)Ø” {Niˆçkž[óí¨Tpw^é!܈ ,ãíµ:.t`­n±ØBÏ$tØ_Á•V€þ–ϼƒp=òç{õJ`çIªól_€!«f£Št¶lT® 3+åáùÔÛÌè§}&yÆ §×i¨F-¿óÄP§‚Ú*ã;®u]n,^^XOÈ…oùògjv¸Ìžï›ËóŸ¼$y|~™\ÚþÝ'…VŽú?§#“S‹®6ö¢ÓL?:kò(ñôuËÇÆÖ£þÌWÅ3lÕ½±égy¾mv.^XŒO?¸+}‹¯`jBmqÕñ9˜Æ“0úl$òùÅÿý‰Î_¨¿ùÙŠçoƒÊu!1¹X8™dã7ÎåI¨–—NöKækXqãêé˜f¼€ÂëRé<:Éa®åÍ•Ôæ3«º·è‡\ž7{ÈùB_Ε­gÁ¸åR´P!Ÿ‘'V‚>ë÷ßvè.ŠX0æ® Q]Êã×q?gz´gÕ1ždù7ƒ8pÓ¥ÏÇCW*–ËèApã¨ZÁx%e<ÛnÚ¨níª¸*|û2˜ªAë“OËðób]aA·NÉq9·®ÿÖ- €•ýÀ—°}ÓÖ¹ª'<€x„â¹ÝSêÍwïtŸk_k׿yõÆ÷åÓ§7’d" ‡î™mÛ˜y ðJ+•if4ã¾±bÙ÷HScÔ¡ÖØ7UÙ?tÝÇGTfvõ7¿ÿæñû¯~÷¶<ö­_íø×ïëDäÝŸ~ÿÿük–a2ƒTÓEMµ¸’0"Oĸ Ùš2kŽAD‡ÜÓ¢èÀ܋ӵ´°Ê¬KC+7ˆ¢!{/jÕ{zpïd0öá v½Ä6KR•Œ µ ­c¾3ƒ'RMZ6Ùu²JŠ ¤ NIȦÿ§Ò¨à/ÍûQe‡Ç™Skÿ ÃL⨊’ëæJ>m±ƒ:Í0Í£N´€™jñ¨Å?¸Ð ‚ÖMJFUÙ»·­«(Í}¨ïÛ=Ì!ôehU®³A“¹kN»ëС?Èâ×@ã@B3@h õ@¢CÔý&M|GŸ°éö‡±*‘*7­ZIÃmÚ$ÖiL8Ù'Œ|r£Í  ¤F’DNíüŠ‚EJ4ºû{/M+ªû$,1øÓ¸oÛO}†ÝA´ön °XÓ–ˆØï»¾o÷MiËmiÊ¡ï$5miœfdñBáJj ˜ˆ`m÷z÷Íýïç]£½¾CȪ-ÓI ojÇè¥]Û‹hJÙq×u=¬¶ÅÉ8ê¡ÚΨ]í‡çAö((î^Aˆ=¢7"eÆ”:º‰¤º†š”"3 ‘JEßg ™A ÷¦x[v¯îûÿ@3w;â°vªb»›dë`B:Cøo¯œšóƒæŒðøà…MÐW›F5‹)xé¤þ‚IõS €Û¯mðëFዳ¼‚çòêKŒR«ió4'x^èx"h2ÑB´yÆõœ§3OÇÊØðN¸ÌœÎâ…•PÕŠp¹èr…À³”~;Õâ—™‡7#Ú×UM†O·~µn‹og ê±/HW3½Õ#ôã3Ž5ªËKkó“«åºK¨ þ–›@Ìü³&3¼ QòÍAÐv"s+`eË›nUÏ]eW?禚Òeíæ³:î$[€Ã™0ÐÆT½ž«>¹QßnÎ}åÌš«¶´€æóôõ|‰ûe6ÛMÑì :ãyD¦'°Ÿš úÍq»ÿóç ïóc©-Q â3ÕÆ_à(~åtÿ{ß6¸ùw?ç׿àkr#¸8™9ØCâçý*¡ÏY¶ü¢ŽÖ?Õë§¹î¯:#6Ý;¾ê— YïôõÚÅ)ã㪰ήg–·ÏK°‘/mÚ3þH‹ˆ/›>§)ÊŸjÈŽ¢³v¸Â7¿y÷À§ÇÚõQ+ªån_0øø¾i*ãÒ5MÓך™îææÃê°bC—¾jˆª}o»]ÓºšRLºÇ.ÛׯvŽÇ>2Þ—B3ÛßïúC¥[<ö(n÷;4ÍîÝÝ»ûÝûÿÇ¿˜¡‘‚¬ D2s@w‘§Õ3ÕȤ”2ÑèÆšYMgq„ô zòÞJ1'Õ˜õ¦ž *=ŒðjÚe6 PïÑSYhÁ]¸=ºAا:ÊEʝŽ™lU OKz°O™³˜£é·„Ô`˜ب¦7hp7žÎÙÁew@Ï1Õ23 +€EÌ{dåG _PPŒÀ„—á9㬳¦)ûÖÚâE 5ºGYÓÜ5}ÇÇï;ú»{e¢{‹Å D—#VNC)( Å$I„Ñ£Å(gdŽj ˆ`­BfÛxazƒl€ëÑ> ˆÁ„‚±ø1ôìG+£ï10’!†€b‚áÀ #sb*ÏÂ)d€„û´ëØX•iwÁ3¢‰GsÒYœAÄêY𲍢188 +µ§™s¶^CÎҖݾµÖµßµ­™»·ç£)-1ð6¬&§ kÛx÷îî„¢¦Ú][ˆ€È»6Ý3]}ÿ»bÍkt¯µ'‘¥„ñÁZÛ7}Jfû9²<¬Ù™ÃKºQ€YôÑgFj ¦¤e ;¨SPl¤IF_•Š25kŒÊ?$­˜7Í¿ûOÿñþÝëÌ||ìúZ›Ò'ÇÔèÁùîtâN[د*Ù¿Œý‹oÝ£ÀËõo>âŸóî„!·àLÙZ/{(¼Umëo^óêË?ÿ¸|êuÝîM¾>1Hþú¤çú —ð¯/ž³KÏø¢Ÿ gzþõ´;!”ÕÀùº¸Òýýíh"~]￾¾"jøËÿRþç–.8~ÏÔ[x«Öz&Ì^Rã¿Â䨼¾5\úœa)OD,,Ý–.] ú7ÃñLŽ“ñº…ŸGfè…¬WsGôIeÍì=j: ç—ô>žþ—G]mqЬÖsBÏJ*çJoÆP >²É°ª!ÏÁ\åiñ\PûOj8ç<¢³94í7ZµŠm²³§æD®æÒ¬Q}1ðG’ï‰ì;èk¤aöü7g5·±rdŸœXc#ëÄe;Ÿ¢¼¾¯J›O¦k›ÕÔ‹K”Üêõ;ýñ†¥¡9QZ”R˜SO)½Ž#z“áêȬÖ㉰¹™ó#þKŸƒ :`óy»t»ÚЊæe}†ÙÒ_Ý×™;]Wø·”ôú7ï†ñí»®öõõë7ï?~T¤—RöjЧ¢ÑLƒˆÌÀ2“„hNʘJgµW-0ʥ؛7{³à~Ïøþ“¿½ci¾ùçßÞ>ýÛûLì¿yUîv?üùû,ôböIå7ßÖÿþWší‹Ñ¨¾ÖuÔ‡Ž\Mí(#n8ëXØ8³ÃPJØ ྵRBšà‘†ÖX©tѨ&³>²ºê.vi,)`WÍ(Y=M¶+ö¨È xHT¢UzÖH6´ÊtA½EdˆaJSJ" 4fÊ')ü£ÃiNå#Œ#v>Xæ Z€„4˜Hm“¬ûˆenº'9 ‚D`"äXZÀX @¥jW=Cr·v§ˆÆêºÃHh¹SŠ“ÓÀ°?·†ŒÑE &Lð4LŒäƒ¬ðµB>Zû†&ö€ÃZ„à™„RrZƒ1RP¢ñ•Á[x¨08@x5=²B CR—“àtªŠÁQf\>™ÈŠAÁ)uÒbÒ(v”æ(;+-•0ƒ»ÕªH„¢Ã=Ÿ>£Ù55²-N#}˜³l„¹íÚV–»}S#RÙîš` (Mcf$»®ÿtx iß܉âöúduáîþEàÕ®›w÷I~üÔ—¨]/{èšWtò¾m¸kгÓÚöÅ-öÏz9ê{l ÙåPöúxµ¿gS>~|/©ì˜Iê»~Pi1sÚ˜³ÖŒâ~Ôªjš‚b¹ÛYSÜ,:eFgãwo ô>ª7Þ~÷æÃ¿}ßýëA}´¯w÷ß¼bãµæácÛg¯v?|hÜÚˆ¬ƒRËЄ¬Uus@ÀAJ))ÙЇ^°#äp©€@îH¹’¢ØÂ‚Ù+³È„d£û. iŠ’~Ÿý{؃©@¯„ODµGËÆLÊ´¦=EBØÃ€^™[Z§Œ*ô¼‡BÕpщˆ“03g¨r©#â˜JMwnáûAÆm¨ x3DLU+öô™J&û_ ($a¦Há–ýžé-Ë®ä¡t®á»"GÅ|ýèã6Ÿsüðî7°Ì#Æ@æ£ëÇò†7ô}›‘ñ£íR)™V½:-Žz>áþ¸ÁˆÒ@C©C“ÃÁ Ù?¹+5¢Éˆ€êˆ x™J/LP‚ úŠx ^@–×Ì.U„ÝIAOº{!aa‚šÖÌÙÅá±V%wd)Þõµ1ûf—RÕ³B)5îö;Pû»¶i‹È@Ò¬¸÷¡†Æy4÷ô}ÖZhíïÿH©ÖjdF„x ·‡pÔóûÖ`()ËHõ]Íæ¾·³‚ñØ™— Ö”»D!Ö¾ï>úog‹âr*Ó`J³¯!D[\™˜522j0“RF(!¦˜ÄœæåOÿñ?´wíÝÛד£³Æ“KËðeð§ÝzF=áµúÏ´óó|—|Ò ‰Ø¤xŸŸ•'HþV§Ø‘ù’TÀųo„“.j¤¾¬sÓ§j3"X½Ëxu«éá(§"\v~äçÇñ—Ó¹¶èÎÁÍ Í øI[)Ùí­Lã/p:ç퓜aåëž›£¥Ít÷"*?gŒeó ß;Ï0W˜Ñ.ë[WZsŸ‡­_ÐÕõ_ººÊ.α'ÅÖ_´¸fI÷L è E¯Å/ ·©è>™ºXWXÖ9ÔÕ½Òçx]·úsö—Ukž…Öݾ‹NËäTߺ®q2>Ç´‰á,-ÜV¢.!=óúÄreW«5—;âWéï2“]-­Rú©…ïbÊô¹ €uÑm±ŸoÖƒ6ü×Ïæ)0ô3í.§š7g¦‹MæEíM¡ÐÕÚå ·gÉ^ÑoÿÀžÈ²Ý—¼)öºífo{:¼<ø÷ø‹nüeäèY‚¯ÄF:Öc®W?`ù¢£ò+Ãõ××K¦Ík(ˆÓÏs:¾™/Ë}ým<þŸî¹Îöñy¢q !¼þÍ[øˆèkJìûW÷¯>~ú˜J™Ñé¥Úï Qfn$³¯)ÈÌ•)ÈÍ€´ÝÞ éSÖå¥v>~¨æµ«ØW5¯ïUûÚGûî¾m9<Öúé`‡ ²4ÿù+©x4c8âPöHƒPB—0¢ì!‘‚7ði‡Ià HÐÇ‘?¢Bˆ:V²CÄXJ1Gi'Ž“ûäf° ŠËxñ½šƒ:ÍX úˆÇ¾oKÓ”BÝ)ÉœmÓˆê³/»ÒîÛ”†Ò„úÚu=IGÂÙÜÝ¿ÎfÇßÿIû}ÛwÁ£4ªµ{¬µfï0U{K5VúƒËú¦™©”îÐuY÷»Æi‰Tæà‹€H‡ (ûÚwÕ2#sXq°!—¶ßÿÓ?ÖŒûW¯Ú]sÿî x¢ºÍ鉓èϦÚÌÕql:û¢?óV¿CFÿ¯¯ÍWŽä+ýmëLýš§üè¯_håå–ƒ¿¾¾üÓ?ÌŽM<¿ŽÊßÜË~Ý7}ýúúiÖÞ/Etþ[];ï6O¸gñ4o|óY=[/–š'~ŸhQ…â±½d³ÎšŽySÉåR¿Ò—‰Øtþ˜4³ö\¼oÁÏÙöçÒêóF .>~sJðRº±&_jVÄÖ “léÀ~fõ6£;Í-Ö&¬çÂUI'ë2]²“=:*/Â6ï™›w»z Æú¬¶¹­È¥í‰y3â ýNÀ.7òð7¬Ä+ÛÁÖ¢ÞœAMk2à™vÐÉ,ùrÃÅ‚lÊçna«+œ-ù ×áM¢Îjbp!ç°êR›}¬xIÅsÕ% ݲ ðú¿‘Ìc-Á¹ÅæÙëõ·oÍØ?vÝ¡ï]DÞÝÝ=<†tœ{Ì;`ð®üpb~Ä`AN*C€ª¨ˆ»‘tw%aAM„@ÅÀ6Ê1”Tü©iE%¨˜ªF¢Vuxl˜<ïã–NÄ j4BŠZ,ŠªÅê‹/ýðÄÎçBÄ…¨«¢zAJ¡ŠˆõA¸•”ÝÓ±mžZ¼ßÆD°85[U¹X&]ªfªf‡”K)fª@*¤¨ì÷¹m£i¬Bé N¥”TàîD.. ª™ ƒ =$Ï¥¨€"_þñÕ›Mµ©ÔÔBØ}xèæÂ=1DDE»0¿·”qx(s$rx—tÎ鼑³øõ KwáD¾.+±ø Ó#ý9zÍëÐÞm1\3~\èš;“3Çl4®]ÃHûâ§ð¤5ùÎU•<®Ç$²E¯ö×# NÍ$&!ï9“NqìÜ»¤“3I îrF=Ë Ž@b.D´/±œ“wåbìξª6 -†Kíq\OkN2½´4@WÅ^s¯þå ÷³¥]¸wJãªØ†Ì®~"!ÚyîŽçÄ ëXQ×¹"K{5—%û\™s¡n‡Ô/}à+‘#©›ª`õ`.N ¾n yF¿t ¬í`2^wçÕ÷Zï±ñÆuíöeIXm¾Üd þ ªàñö!½"·-“3k¼ÝÝå]1ÎìÙ €—i‘‹,ÜÓùßÀs 8Y’3›f¤W`²±¼ÞËëÃçœüSä´‘ $­åÙ™{Ÿ ïÉïïܺoÇf׿׳´Áï¼ñ9d$r/Ü›@Ûów˜+DÕ•ëþàG+:%~,13x%h¼æ¾Ù°¤Ü#W}ã¯wwô/³.¿¡/2{k’Dƒãó¤’I„É8žMrqc•¥‰}aÀž¯æ~7¼?eX„Xô?9×ËHáäæÚ/Ê$T™w_? nÏ8bž&¾§à‚çlFæbéXu¾8su'  gŸáÊ?‹ÏàLrŸTJîi!ì¥òdQ×l[ɬ"u~æcM,&ÍD»À1z>¯4 ŒØ¯/×)Åð¾UÍ…‰qq\q„· ä3Ÿ;rŠÔF«K–Êw”+æ“æì$»4¹¤•5 È&ç½e¨_-Xe³Î yN{ÆÌ«õÀésè„!µÇÔÃ@N–›ôÖîÃ?àãï¾iÛÔÛŠq·Ý>€&÷ºŠjPgéeêUL­Jé¤Ì£YCá…$Ã.„ÜsØÕ9„È⺫6uôã15ÅKÙî6ª€Žßö»MÙ…ÿâ_üõ?ü?ÿ¾j0 ÁE˜ÜI§ „½£¢œz‰T Rgµ›-‰šbÌ Xm ÆB‰QE`d)d‹b¤¹fT¢N?¶„  ÈtQÖ;4Ô®Ž#î`€ÀÜE¡†œ\ÄÔ dR¯R BLPØ{Ì"ÀI @H'CÓ¿‹_2axtÂD‚“éO–ÈÚo6N´T„n)÷`( !œ¶?•ÎЄÃ.. 8<ô]ÿ»"k!™KB&B줡°Ù‚BˆCO{ª* ð¾ '‡*p dˆB þ-è «zÛã€$Ñ•O Nä„Ð9â©äPú²wM8Ù-ä¶¿ôÃ!¥€U ¡€Øl Šk  ïM–©)1.lµ¨‰™YåÒ´Ù雪*¤›«ª&H"mIÁ,DUU5}Øo¡hK$ªÅ:nD›c*É…@ü“?‡3 ÁT¤uABå1h!b%N«6<‹ÓjBr ÛªæÆ‚€º‘oÛR«»£¥ÕU¬‚©ŠÂ`™ª"’¨8]Y‚ˆç’3QxhZaç4M‚BwGfê4¿TÄÝ;•ö'þg±®Þ}ù¾sáIl˜>ž¤Ö‡ñÆüïô.þ{(×ë1È<28#^“F†°×iÏ”¥Úö5,iˆ[-à{|F 8'8s¼õŠØRdŽYÊZP1†/1Õëå\õaMx+’Êç Çš}Î0K2/*œô›æ·2ì8B8ü ^Ëèž ÒâGÁ%¬|FÇÂ]EÁ¤7e±ã笊*‹"Ñã'Í“òzÅÍa,2cO3öô$ÇgÙsÓ¿ùÌì³E)í%Á…áϢɅÝÐó½r©Ó…yæ4õ–¬ƒ³£àµ‹xç)Cû„ëºÆ\QYGŽV5µ®ÀUk×p^ çIÃ[Ê$¯/Ì,êô®ÜÝ5œE‰`\íR\ÓêªÞÞSc‘¹·ÁÜW`ˆåì‡ã2šêƒ„÷ÙpöÕ±ãðŒ[é¥ãE'GW?‡.g ¿ŒÚ' |†/–-Ýtb›áë7ÏÕÉÎpvaî«ç¢Â$¿»Ó$²_GCDFÖ+Ï躕ù¤½·À¥Ào[ÊÀçý“%v—´Î’ØÐg»qàtSMn¢v÷x¤¯E5ó"奻Ïôši‹ö-Ï)"< þq‹ÎßY9žº( 6ÓëïÆOûtªûXÇþë•LÇpµHûœ þÒÙóóëM·..ÖÙß~ƒì‹oÄ_ôÁßh.ýÌŠúùusŠð\ô¹¸g.šÅ¨Ð¹ÿò½;O%Ie·Ý=>­bEuPPŠt-»&"Te)@iÚFCˆæÂ”¼<뇚¡’""·_hûéØÚ‡m]½Û•äïªàMrÕ‡_¾‹ï¶VÇM).8þçÿô?ýÿŸLqSwËpL;?`÷‹ù·(îz¬ß…P&ïZã%4"3׈ÜBkÔ»š¥™No„>OâTV5Œ"YQ»D¤OÈu: h”5©'+T:ÐÔ™GXV©à…Y½ÑÀ”-í¤HCíeë;´Öw<— :,@ôlmÜÃîÀî½”sß^ã`s 4àäÜ×Ð"@{™ X0š @¡a\iëøÒ™î*Ä ]rë€÷Ö¸,§¢…à ±r —þz:Õ3 }%€ä‘' à‰À®Í¿„>ð9pÀ ʼn©pªv—–ÿîÂîô¤×ò@èé]S]ßýŸûGÑ•*µ€@oI¤B…Œ(Ñ ÁE•Цá¦ÒèšÝ]ÝTÝI”΀9˜©›@ÚRœÐ p›’P1•ÝÃ΋P•¸ è*XtOi÷° !äâîEÍŠE 18vú§.ðrl†RƒÖ¶Å¬Ù¿GÉnºA*¢Ö¦b⥊e»-OM7'âvK¨»–ú)$Z°¢VRéì‹“{ò” EÄTÕ]2)Ì¥xñœ I-%·Y;'mg.N©xq³Ð£ÿ€û“?ý“ÍnûîË4ëTKå´²;Åû2>.6¦ÝÿÆ@Kn×ïÏŽv?ŸßoôÿÝ„ÜoÖ²þÃ8ìgÏm˜éÎÑøÃU7ùŽ7ò<Íò à»IŒ_<÷iÿ¤p^Ö-þók-“ýùÄG+×?O¾Ÿ_?ŠHïÇ!:ÿà xøL¸”WÆÏýüçEšKô†û¹L0œ>et'ƒÆXáÕ-ô&=áeñ“¼…Làò'pÜ'k?ÀÛ#·\•¯[’÷>¯¦Ð“nŽk“Ó•qc\«œD:½`óož¬˜a] ŠA/Ø©#l‰~u“V$Óþ/ïÅ1• .2ž‘ÏûÎ-ÄEGgõ ÈèS‡Öçr=ãú´à=¤a™mîà 1vÎpsm-ºgM>x…ļüí³QXåCñ{W‡¬¹m_~,£~˜ée-òÆ_㫌 +B:¹““ÖÙ•£@D”x÷Õß>¦6‘ÜívON¶ øÆh)t‘œÝK ¦¢(SUa‰U ÁÛm%ÑbØÔéã!¥¢V¥\ªMm"Oa[U»úxÌ¥ÉÕ¾‚H¬íÃ_ÿy>üÛ|D[‚AÁìR¼ðŒüwbï.¡½.b¨‚QVîÊ`†æÔ™^X(аÕ,€·p(;?´Ít'C8鯰À 1ÀËJ¸V$™bé,‰Ã¡„(¼@²¨Kk%;ÈdçôË@2˜NZö]£'½þn²ûÙ¯¤?:E5X\  pGH× Ÿ T!]{{€\ ‚PõûÁ)Ûê@ê^gÝéﱫ1ô¶ÃP,D«­ä\IHwÐà„*Ð×Ô. øE@EÏDäé“žÄ C„æ™@‚D :U úÈ –íT'ãcÖ_X:)”½ÛL·Ìô$û#¸·Jv … ¥dM`Ñ ®ÙrfÞh °­ÕΘ%›WU šrSr¡£$…†—pnщ’áÁ4XÕ¤ OÑ4Õ.¡®²æ,ˆf±ª H!xaüÕ¯ ™ˆ”í¦HÀÓ'mZˆ4!XŒ -`ÿPê1DÔ µÐM,>Ô­š43ŠÖ@%75Ls.%»™¨ÊÒâd[RJîΔéÌÝL1‹!@%V¦f›‡]·É¾ûâ+Ul7S5td“K„)}8Õ©ºØÎDWö„–aôBø¿¹”3™3’ËžÚÿýP*ô¤{{g{!Ïåg‚ýåÜ¡®ä*Wv{ì`L¯EÆkr|C©“Å(ù&ôvmYî쿜“"§š†XC¯Äýk$úIº²ws¨†1ƒáÎs@®ø,dþ'½‘Õ]9ŽÏ·3Õ®æ Š– RÖ÷xr-LÚ¥ð³š&¡\ô$WõuGÿ‹²òkYÙÚLp¨5M•ë¹ÌB÷áENnäœ ,§kÒÃgtï%JÒsˆ9äÒowË3MÖ.êû’¤~à{[k?¿>óXüÁ¿¾§Àæs¢?ò¬.‡?€;ºÿ0nq}ÚBj8©¿zÚÆªkÂñÙ{§¯Ë<~zÛÙFÞiÇ¥¦ìå9ûl?‘YÐv SœPÐÙ‹GŒ8±èûõžy‘³v¾“¬“$݇éÑ˲b¿.õƒ±YÖLùgJÎYløÂ¬3nH)~Þ‚>CERW…îîšåM8øoµ¼QP{bF z)ŸuÞó¾·Þ.±¨Ktâ¬\Z'–æá¯“N Hõà¹x.»Íîéð¤Ò!¯¤»«B4ˆˆAuŠ*(jÊR(ZH!•®1 à+5Cçåj$À« ^Šüx AëýFDr›ÿŸ>yÊ‚&ÚÍoþ1<þÿ71-(Å]Aï¯:t)µx•ÉTDX%ŠÞB XD+d!Ћ” SK´;„Ú"¶r†Ìû>wí|k!džB„\À@°€R €ŸÄyÐ}`ºÌ!@8/6¿î‚§Óª;¶ÌN¸µžjžÄSwhéE~,œJv› +èL}Ï)ÊÙKîГGîùŸÈí±x¸‚}}åÍÅ{-£ÒaôîÐ&À:Ðÿ¤ÆÀan`é]x’þ»öÔû"ˆöNá§ï-†^ÿ§›Gó D’j¤ºhªr·;f'©•Ç"N`#1¨jqÙíŒdD•ݳ2ªúÆ¢8ÅMeƒhAŸØz¢2Da.$%µ‘(^$ÐbBi TLT% U­A] ªViŒö°­²JÊîu¤ÆDkSkaóîŸüMùø);“D+^6µ´ Ùs¬ƒªæâ".%Dqf9Às†‰Ö̘©u­î.¨Âæ)§R ¢*¤ÃL¤MÙK‘Ràð\š6±8݃ˆîTÅ`!„:TûíŸþù?>6Ç"é‡cBPAJ©®+S“ Ù´s¬îðAœ;ñOtKž „§.Ô1}ëÒì×ñɆôÄ×Ó_¶m/æfq±¿éf`ËNÚngKÁÀ]HÆ-ëßqâw¥é™pÉ(ƒÊBΠñIIæn‚9Ú~UóZä›&®"So¹Å›˜«ú\A ç³nb ü2äë¥Y¬‰áL|J—ûKVÿ_¸ÏÕ€a»:_¹™š™úŠöÑw¬Ï+ýàߎó]<¥Z´Ð¢º„ÑóûÛÚ"p3×ÅB`±“tQ³â…ñ5™ž\3<滜ës—MÌø€À[7È+¼™¥ÙµL­•^åSú’§zaIT°nÃþÙ }Þ’óý•Öê¦?dÄy,Lr~?YÑùé'üÀó¡˜Ï]̉Åle±ØP²x0­-µSlþ£kÝáÝ»ÃDœGõü†ž¼{ÙÌûÜ´ŸærÖ_<Ø,¢¾sŒçô=GÍ"?qq’ÝÍtä—×èYKgÁí½ïW~å°>j…YzÃ8Â83¶d8®hðœiq£û8‘ÀOÌ E¶Ø\– wŠ‹ ¬£2¢[TŽýó3`‰4QSêÇ`x‰KsOÎú=Y;,¥Èc\{Ôá#”K‡ÜE–‘ãg5~†Sl[æ“|‚Ñ¥2Üà+öèYh»¸m)ÛcEÜáŒç3Êi«XþE„úâ 1P^G鿜¯gF×ã­ãžýæ¤E{ÉÈžñò•CÑ€1«§n]òî«"r|<–œPð°ß?>}²NÞ]Dܪh¦ÅKÉÉ*JH¨*¡)ç6Õï(&"VÕ Y²õvSO%5™n¢P›˜QÚãmU3)Ù™sU™§Â6áÎjW1¥’…¹-(ˆš«¡x?M …A$0(úöóœ„ Û¤tú<¶Z"K¦‹÷mì~Qb‡B˜B€’‘f€Â\6м-¤2ýœjË~ÒñêËnàÞ÷õwn½(½xŽÉE-GºVú“`=%ƒŠ ½T÷Y._Œ §Fx¶€öS­vÒžCB íœN þ̽…ïÙ ¥ó =ùxï6ÜQ8(X6ŸîÑOÑ¡zÿ# °Ø”vU"ÅÙùËÉ"¸¿ãuª©u‰¨¶Èíiå*¤3"–Þš8vÜ…®H™!Y„`*¢.p ))RÄŠÑE]·C¨Ž©õÄ/WÔTqQƒzàu;–\Ä£„Ù)0ajF@$*â&$ ¢’ Šª…Ð-(•Ð4ÔFÕ¨" ÓV¤ÞTÈÔýND¢Õ !¾ß‰ b¬RPJ ÇXyöhiMKB¨L©Êí–ª`¶ŠqS§\ÇÖª:7m¤l·uótô ?}óhªC0 H* }E†%g/YJQÐN»Cˆ¦U;©Ÿ/õ+u½Q’òØ4UŒ›º2UœPc9™Œ\v8½üíIHo¨ÚwQ’¨ …/zrœèJ\÷9§Or’e1}9鬜®ì,”qg†<Ã.š7Ï—aè¼Os’ûûz®`7S—¢Á!=z¦o˜g©¤Y³&WGæ¦`ÈõÜl…ìÈYjÁa¿œž0—=:YU\r‚èÂÛ9 ñ,…i—8tü—<‹K^„"‡ÁÍ3ð´‰ÓÁÈî4œÔè|ŽN²‰UÒíÝùÞ ‘úS'é%õÏË^05uãR¾s³B0F¯Tæ†+nQ¦c¸0yÉ=΀É"D54ßâr tD 8·Íƒëц5W"q2Œh—õ¤h4߬îV ¾óxºŒëCãMfÉðëºWö«*Ñ5Äd¨6ÌJ¸ ‘Ó£3çäAî¢_Ÿ-".YóL£ «'çÒ1Ô}õxå^vüÁ#]>_.@+‡ô3˜WCÕ©EI†›ÏÀîƒC¡§e+\¼ýFâ4×ÄêwÜÞýƒ#ôè¼eMfÚ<Ú†EË/ÒÍ”ëxÜó:.“saç—KnÞu]Êà¯Æ7rÖNÄØ—ñІÒLùù$ =êJs!ÆrXr%w~KæÊ.w³(xSÆpqÝ=µmØnNw¹tN Kšgˆ êÉ÷Ó` ß%`t„ÊËΚ—‡u²Bò[ìyKu ›Oéûlæ}àþt±/,åÝcO©èê³é`¬Øó²©3Jsø 5Å5½þsìêîª:ŸßÓdÀ뼌äwß{3’ÍÎt…ð='‹gƒ²u<뇒Ø~w›¯Ì«;TzD^®¶zCYî~Ø+ݼߎXÁäsàó¶ W­øçõ€_*~ÃÀ®µ—¿÷tÊp¡û¼§»\LZ.œ~G£ü]†4p . Lü,:ÿ†ß÷V×K@~{º^Y\+,N›Wàq/»÷ïÁkkÈ0{æ¢{/‡˜”î!ßüà ,˜ÜžþtäeØI…ï•͗뀻.ë ‹hå`9“[äùæÏCÏžõ¾îÿâu7$8ñž_—û¿ñ‡‰þ¿`‡yö Õ´ù¦èö¸yÿU!èLtþõß(ƒýEîˆo\$/Z'^òµÝo]bѪü»ŸùRã¨ttÑhY ‹ L6Ís»vó"–ÙI)h`«ÍKÌ:§³ßœ?;QK”»ï¹ÿ÷i‰\ ËÎß‚…HdJœ±cxÅíÔ?P2¹p¡×7ì±·ÕN¦0íâXœÙ÷rOSÚ ÕäIÝ|Üþ|º»sÍ$À@ÕoÄy\ûÆËœH!É3v“É$¼¤U监™ÈR§ÆÒqä‚þ¯âÙ1}®÷žs(º|¡,/(½M›0dÄu††w;ž0ŸËìÁ˜º?) IˆgpûÞ-»_¼C÷‹Ó†wµIïz÷ÛàúŸÌùNoö\41¸ê82¥­p Ä8ÈØƒC1G^êç§."ï¾üðMÎ¥¸gßï÷V…Ç!çPUVU-¹ˆ¢ ‘¢,LžS«H' y)p¨™vÍ–bP©0ÉÞRÛZj]C¨k ©ýxHOm¬ƒmªý—ûßÿ‡¯OMýPWõ¡mÓW÷×ßü›ÿUJ¦^ aCU¨±8,«E²ˆPîë·W/(äù“ˆB"騾€8<1ÄÓq0Y¤"’Dª„ TŒ’ï|Y*tÍÓ˜ Ô $ˆ ·ðS…Žá‰|;9~@;$Ý‘(ûCœ@hÇ900åì (m¿„TzGß®¯µsèÍ~e¼‹êEÜ¿ßïVIGh辂@vˆô~¿eñNÁŸì4[¬‡û;1"ï§—ªz÷FS!†¶ñ-ÆJSèª*ê$J§ì¯'u–d E\@@í$däÒfénŠ®F•@¥µ*×ùÝ{)¢!oB©¿ÃJAý>¤ƒmö„¯¿I)¹2 cˆQ­¶ T ²‰„úO}W“áª+4YÚÌìRY.ê*+Hq—PçÌ6„Ãû¨ûŠŸªß|Ùþö#T㯾òRbʇÝC Ç6§RBÝŠªä§bæÉ"Ì´Í*¤i®£íê¨"Ÿ½Í¾ ™®%«j)~T–c[Åà…*¤{n“ŠB²´™ì´Z)"›M¥fj"¢´Þo{©(Õ_ÿÙŸwi3í¶UÙl*UÀT7›ZU/døáñsñLíûþGêq<ŸYÿ¤a´3 &Šfk /n ”ËD b¨ú7<œÇÐ×4î® fäÒIj7 S¯dS–ÅVÌó.‘o]õÌô‰ ç_ؘ〽 ÄÒ¡sñÆDª~s\“Á’àÉ¢·Öô÷ì e.-i ƒj¢§û˜)œ„ž'¢ão´±Ÿß3K¶Ne—À”“ò‚œ‘ØÁJ=Ï‹–ÓÂm®© ×S§Å€dRÍZ°ºÈ4q®5­m\)oÈD=h)ߺÒW4ع†ŠÞÄȰäyš_À…\;\\C2ì ¤xÏŸÛCv…}¾¨G¡ª£·\ÅæëUaúÕzÒ@Vel.¯ƒÆg12_JQ1 žŒzÏV‚óaN-ãüOSïÉ 8Ä+ûŸµŠÊÉÃÖÝE¹µùy1¼ƒ{@½óæ7’c^©ÌÈ`± ¦òé×(ƒ-–ããã¼-* /Ni™<±Åw І%‰YB7êjž’XTˆZ–M˜‰5-JC/³C&uÓ+fBt C}•!æ1TvÂÕ’-OšvC’\_®Èb8œãå)ã#ÓµKfº^œUîÁÍ %®ëMkkmi…žœúNEpŽŸEÂÍqk· V,niæ ÎÎÜDK ?NÑùëU™ù|ÃRûέG\“ÝËê5— e­…h`L°žElï®÷lÀxf,8¶ Œî+`-=Ç5©Íë,Úáµúg¹î‡ÕíŠÃt‡õá-ú½a9h5g“q·ûhtŠ„"ÀWšÓd”£MÊɃÝp±ñ†1¥Œ Q2+eIÏu‚Þ®W]fÄ…;Åtˆ`ŒùÜê_ øOzÓn‹wÞ…ðL7 Î%R±èÖð,=¾ÌGîyo”cÈn€_PDªÍ†ÅÛ¦¥37y·ß}üø1{©½ŽU”RÉmJ!Vjª0#KQUˆ8MM ÌŽɪÕNxeÎÉ%ˆ9K] !ˆH¬2¹IѪíû]UWô7u½­>þîÛí«¿ý›ãןªw»ßý«ÿwiÅéwDDqëtO²j§}ï 茉#¼£h@i¾–üBØpˆB¶, “@ ‘4Qƒh€g”U¨ M†!†î+àHÇ^ÿŒ*¢4½®”Þ¿—w0C0G)ÐèÉÍ^sKw]ó¥í¬½0Ñ{$«¢‹ÊÔPòHYH-ÝÙjБ §–üžý NÏp((P… JÖ}¦öN¥T¨b4 …»[P÷NêGÝâæ3iöℚn6UòÖݰ ¤£ˆ*@ñÂÒ© Qáð-"ŠŠ, Bˆz×”nÁX©dV»HO¡F &ææTA´$º‰Û¬OÉTC¨TÐ!XÙü‹n¦(ŒÙK“M¼ƒ‰|¿m½D‘]!Òæ\W–š”É÷»TUp/r¨JÎñÏ~MÕD4OmQ—Ê‹DgÉ%U1HˆBw‹ØlDèî¶Ù‘R©7ÁÔ¡äí6‰¹3µIœ)¨Yó w-)ç6§âQ^Ü… ¨„;ßÌê‡-€Ò37ú×ÿéŸõ~㤄uJOw7µ Ì(%Ÿos½å…õ˜€ø,A“98Õj,ξ¯°õÎ83€ïã²yõ‰É ç¹³Þ¾Œ0—%ñ~£×,ƒÖgèâ»H²·œyú q|>c–^ ¤¹Ö¬±ð ·ƒ•0Aø¯)«òV^sÏJü0žÕýú,æ‡ùz%`^g]›6¯llÿá¨}¶q¿Î¸÷cç¿óBÅõ®£%>Ù[Ÿ÷çÆ ™¸)½Agœë= ð éàlôšû¼ð0:§ehD \ ¢pGÊ ¦ßù( ލÈm§í:¬§"S‚z2 ¾gUOÝ$'yø~·T뵆Îúx.(½yS?ŸK÷Ú3 ºk£#;B­u @Q $U©[oOÅýÐbWB¨*‰!ÖÇr,ÒªÁ‰`¡ªBöBºm¤qºt¬•$"‚(¾WòI­Ä U ͶVsx¨]M´.!3?=…*}û{«JnÚâå˜s€î¬J¥Ôý7ò~ç›Ê>Ìi¹`¿õº¢‰’~lŠˆ½Ûåc’ªzúøÔÚͦâCÈMŽ ”’›{Î…îØÔ™@ÃòvW XŠl‚؃€YÌU @]ÏU)tÇ~‡cãª-A )NŠj%ZÈc5jˆ¹do3È”rj“¹ªªÑÔTD-XµßœWùýæO?~zðîÝÞLOý\'j\/å߬º•ïÎcÓn6µBEºY9ö©YȆ)ÖnïG×I©ø‰[Óôor^½“}!‚Ãï£MàEgý[%Ĩpr¯–žŠ3{ø~%’+€ç^ö™}x¥sbÜT{D;)ÈUâw<Úß‹ä˵ËùYÊèêþá´â~†±ÿžóª9/j‰ü`Ô…_-`?økæ²;Þ=ü¤Sàbø‡‚þüúܰ›\1ùìëcØ1*ütDço_v̽ٚ:“ÂÆ×ºÄÞXøöû/~­2‡²'í åW© —ê%g÷ÖËÒ ›€×³‚3W…ãKP·xzfc“ØÑWžšd¯ÜÞØ(Æk@®Ãº|íÂP-Þ°ýŸIô°’¢Üœƒ§'S¶ß Ý™îíâê ¥¬·c­·ÊŸøÙ³ùÆ9JZG†â¹3]ïÃ@>}<‚“á–!þÔý1P¦ïy¶=²"§ƒºÇ`Κ#F"0³á“YªÂK)C8¸)+äê¡3OçÓÕà,µueâÉ™ñ1sb˜'ˆ‹æ~O(>ϬC»O>íe]ÎøÇóâÔâé0Èö‡…âù¡2ëUœá ¬Ô³dö€¸ Ÿ“qóE7áÆ³it›ƒ·oßï·ïvŸþácóô”ÛÌÂwïÞ?}úØQÒ‚š™æìÝÎ…’r'fUUˆš@znŽƒ€j(Ås!ÔŠœ“±˜z>f/ ›¸ÿò]shvï·°Ð[w?|ýT?Ôô~™Ž©}l7±9~:¶ŸÚí—ïöÿåõé?ü.îëÿÿ{´p2ÔÌf"B5 ôˆ¼$С;ñ“‚¿7( Áª^Ý^#$À¤¢ª°•ÜÚž+K÷Óx‹ä?-¼8ÜÁtšö$Úìa&=hÙš`Áçq“áÙ7£F¤Ó1)ë1/YãÔãâhxhÆ Ñ‰™Ì‘¬ê_æó–¾;ü«3FÞ«žuçq\Ô 8ÅÚ{  ½ì%G?µ]´œyÞ£Ë~-^\0äšMšÃÎf]§Úò`ܦ-€?ƒe.ú#ÏÜ+îíKp)Z—Swšõ²ÔRÇAröBî ™I'ñz*t{fÎsŽÈEÏ∽¡-º%€ò¼\†[N«úœ[]pò²ð¹vt®ú׎î• €“L÷Pb³<èH¡~×âñ=þ‘,¼¤¬lq˜T§×ÎÜk,CžG.ןn—É–Q°e ¸¹ÖÙ²äÌ[Ô&_†ó^yûÚ{ŸãH:—rÉ!Éј°]0ßÍícíÚ–NÌ;zÓ¼¢ók÷¢ ÐÍ öº–ô¥Ûæš?øÕ~ña@{Ú’dŠ»²FdvÄp½3yUŒè΂ÁZØyë´Z- ןþâ¼¶qÿ5†û¢Ìå=³a ÃÈýN  Õuÿ\äÀzæí м7éÅ”0—E›ÛœBkOF&:Ã×ÍÙ%a9ò×zA«Ç†œ0òõ#sàø3X´çÌÿ|Ÿîì6¨Ë}/Èßžk ÀR°Áû>laböD¹!—,ëµéA³>“eÜþ¯:å„w6‚GÖ…(îÏ…VöÖ‘*ź2ÝKO¯µéÎÃ_œ*gLå¾z<æ”<åýþÝÓÓ'P E¡PX/i“³†½ 375¨ˆ2w ÂÜ=—¢ÎtôJiÆÔO9†huØ«öõáñxøæq÷a·ÝW_?‚É3Õú¾(_x|¨m¿ËM*Móî/ÿNJùô¿ÿêo]+¯öîNq²A9\Xè-ù$‡GØŽtø°á.Fª€Y ;Hzp_LlC!r)”ÎÿÖ@‡{ÿ;€Þï¥Àj?Yòvu½gØ©ƒ€Pa :âb½ÙÖÕœOÂ>^ î'…žtóãÉ­·œU¦AÀìÄúgcÞŠ@ûZc¬* JI¢&@½©Kn@Wƒˆ¦ìÝUAsò’;- 5/-`Ñ*—,ª¢ÅÔŠç\RW<°Ží!å¤5kRNm“JƒªdK¥¢‘j®¢æ„X`°¸()G ïið÷-a^W°fP1¤›¤:ÖÑ›´ùÓ¿ÙyÌ¢íÃÖJ‘¦irFÖ¦â M»ƒàÃu…RB›ƒ…æJ7Á¬uÝ~{ÜV1ì7ºÙ0KmÁ,H±è”î"vZL»ÐÝÕ;”+„]*TAqz*šÝ¶Ù zÓŠŠÖ5àuî.„‡˜Û\RË\R.ª ¢ Ò‚ÆMµy¿sw5óRÎ{ʯÿìωK†Ð£š—A]2ßÐä4!Á!gzÍÂøP%wê¯#ã¶Y¨·ª‚}3rX˾VÔB9:_—\bbfsï¡qSeå|ÝVeá-cõ‹‡m!ç0ºÿÄK\1yD² OªØ"Ïl(yæ…q“µ^ŸÙÑJ –âS^* Úûâ -z9ƒÉÆÖ•ünö4d9àÃsH‘äÕ낚ŒßÓüBóÒ c$ze÷ ÑàreKw*×a¸µùJäÒʵÆuÁ² Æd WZ6eT«î?Ý6»¶wÜ«´#²øhø¬áêsX¼Œy§çu|„w—Ö4ŸßdoyÉ~„˜_‘ñ>=Bu§Ley–ë'7½A àþCíežÆ÷~´<§ÖxR"ŠÐ½.(ó”òEï•å®8!糘ãzž1ÙoHã¿Òÿ{ÿT¹þ›ß?àeª× –o0V"Ò5#–çòtdacǹ õN`ð™%Ù>—úɈÎ_©î¼Xh¦ÞÙœñ‚ýö§ó ÏJò¸C?âg>.gQ~ÊçÖV;PÄõNÂDÚî·54ßb:+ÜžÛÆIîÆú£äs÷ËKÃ;òÈWÍ¥þS¿ ½Õ2ç¨ ¾üˆ<"çTRÞïOj ¡ŠbLÉéNÒBUÂE´oŽÑX2YŠÃK)ÅEÍ„9e/ f¥¸DeçA­äBØ¾ßæ&Ka¨Kû˜,VðrüÏßâ÷ŸJΦ⇦ÚUñ݃Øÿч§ÿoJ“TcQ‘ÔPÍÝ™",(Q:óA@)m‡¯ TÐfA+b æ£äoEŒ¦$ AG!¼ÀIÍ¿SȬž¡étó tˆ d¸C aŽBˆBÜwˆ¢ój-©ç¸Ÿ€¸žŒ|;-#¢xoBÐ7õ œ Crþ„©«IôÊB ZÅP˜D´ÞÖuÛ¶A¨š©Ó&nM*UÛRq« Ås›«m¨ãž9'"—bjÎ\˜bŒ•U9•Ôæ%ÆR·mK…ˆ™Zvf’Q\hÊ‘ŠPIL¹ ›í\D •h”ÉqJÊuÔÖ¥HÑ $ÓK õK¹vg]É/ÚcvÑ‡ÜæOdŒhs0 †*¥¼©˜ajjRL¨Uð,,Òªäw/*9ÃT¿xPº:PWjA‹šVUQñ\ P\AÂ-¢·D¦˜‰»“.Ú¹e«@,‹hš"** Æ ‚œ2Y´Ås. PŠ8I˜T³—MÔTC¨ßm»sèŒþÿú7¿9W³GM§ãÞ¾íVFpæØË÷ùû"ñÊ-øíÏñ•#’?t ç Ao·OЋpv…üñ ´„2ë7¸æTtU]telgMÂC·û »ƒÎg˳¯I½}´ñO1~úÉ¡L–”ü”Rî2õÓTÕýùõók£p¡rÿ““öˆQ|ûÒÍå\Ñ’aR°n=²ÒWôòÁ\¥$>'0¾šÞ¨µKXüÛó•Í;ÂÆ øNèIûÒ74êÏ™zçžòëñ3‡¾ñn\)›ÞÏÅðDνXóÔá¬s4lE˜ûJ¯Ì‘ù`S>~¾¸ùì%?±yÁbX:KÏ*œÓkïS ®ŸÛgj;ç¾¹—¾è²\:!åœNy¼õ½·t¨33m?åNíC2ÒJ–µîÆ3`1X´Óâì§æZYøÖF3Uj»‡¢µŠŠ$ÏÝîÑ•Œ9öw˜•]Ùþú TNœ~NÀ• Y€W¦æ˜[·øèÆZ_£.ÃÓ€vøËâÍÛp»t(mtVíÀ¥qEúy|žŸ3m¦‡/ß"øÈœRN¹¤¬ªtïô×L­ÓˆW¡ôÒ NÉîLÁLEbªRÛäci ¡B¢‰z† •‚*¨=‰£¤â¤ÅpüöIT7µ˜JJZÚÜ|| ;9~óÄc²‡:lbØÔÞ&ßì6Õ_ý“ã7‡Ãïþ7iÌYTQ`Dro!€j€á€Z)&¡ã$Þ1° R'k×­‚"déMw¥Sþqñò¹… ¤+ €((e¼ÙÔÜÐ}l÷ip‚ ™€çqr%èZÍ;Ñ!(¤«œtÈ>AƒJÿS'¤@ì$t"*©iÉî„vŒqHÙTµUñØš’ªMð£WÕF )•œ[­ð~ÿ¡mSI^×@ :,DC8~,²kÍÁ‚†*´ÞIU£VfÁÄ„Ìvú YéŒfn9G¡Ã‹ìtŸQâ¾jwnžÈ'(ƒx@Z)šL¶RVе8%1<¹íöóÓ6Æc’jóí6¶9ǧT['˜Ÿ¢‰É¶h1©ºJÕ®.ô£Ãš]*CÜ¥I´˜Ì4˜j$î4(Ý©mx¨ 9CÀN?HÇö `äÌ^T…AX‘"’CD±Q5*’ÝÛR<;Huz)m›YŠ™šZ¬+1Š‘»÷û ìè.ª,ú?ͼEºòÞdk–ÌÜ,…ƒKy Ûfƈ€ÌvÊô4\³ä½—m¶Ä¼ ŸM’SŒéç‹ûí:$:™lƼÿD[$b÷W2nr²‡#vþM,ò‘§Ô ÏÏѹ00Œ=ãàœ•Agâ€õ13¶ ÞÔN½rŒÞü›9ûz¼8¹þ‰ íyF\fÌE)rŠâE1›Œl¦Œsü(s%è9ïä·» Ð…‡1²‚âI°è¤»8Ÿ“œ ºi¿–¯Nªk ã÷lÔjƒ!.ÆYÓ0 Î%,E\W‚Õ5>þDRfð-¼9»®mA2 ÛΡd1æîO«¦f ×ey&<)ïaFº¹,ÑEIši¿ÛG˜ïE<÷–ßáC8tå¸SCÕžñJ Öì[1H‚&aöåvïñ×½Þ‘zЙ<“ÉížWýP)' ·ó_çê0¡¿¢–öf Ÿg¦:Ö¾Ãd> k¸ô«kš²Ô³<iå”sÆQVµ&+q=˜î†×&ðè`Y’°™/—Åu°¼ÿcY]põª9£x•çö5Q gã•ëºã•=T¹ÿ¸:ëÆÊ“÷ð´î<­Ö¯Arçz³_ជ/9¹4ó,}°ñ9÷Šño›˜Æ‘?^Ñù›ÄD@éú¦GrŽA ÿ’dwKXAq×ôñ&‘÷àHíõH'RbWo¬„ÿŽ›7à’®NXœ ×ÁÇó0Œ}‚™²Êå˜1¾/úï“”‹çG2Š ¹¨œòôË;'rjga™{JÒkªüç¦%̾a [²¶ žëY60yÆ[åþê:kíÉE )(Ž’¤“NP;ÍìUPà±™·¹™4Ð9B–™RÁpEM^ï{Ž­àñc›‡³³ƒøÙKWnKÝ1Þ·4)e)p¿·ådÌå–…Léô[«ôååb,ôy»N¶Þ¼……ðz±_wqW—Åc¯kŒ‹§•\°qáÃ/ß—’¼/e¿Û…ºz|üIݛ͂B=(D”¤ CŒN§“&¢B0Ô5T[R›‹šŠAØ´æB«ƒªŠçÂ’Y˜s†jØV Ò1A$nªÝ¶–=Q¡K f;1³´|jâûm0Í%ãXšc«›?ÆÇÿ lBns>QÑ{ã@Â[Ò;•éäû%@D O"S RƒƒÚ ò@ F^à©×ú7 ÍÁy•§G*‡®½°wÎÚwë‹Á"Ô:“exƒtD¨;’^¯_¼‡ :|Y BÐ;®zÓÖ®&@AÏ"D!ª ŸËY}ùAA¢´®¢±‚‡P;µx5 9; *âÎ6µÎ\›&}üúx<¦jë ¢!÷’K[XPm+SMGˆ¹¡µ6åÖ\7Õ. Žõ¶Ä,‡ ­ˆéû;ÍšÅX1eQ£i›(™ªA2ÒÇ·&F˜zܰ…o7°>\¤(‚;YU²ÉÙ£CU›ív³ O»PˆwF@ +ÕCÎñÓcíÈûŠ¡:nê–ˆm&sÛ¤ aûªD£Z®6ž‹ºçÓ¶í¨Ò-VU”ÐAºj« µ“$„ ª `¡H£TÚÂ*‚†Þ†H!)9‹Ã=¥¶Mtªµ*T[ØIíGDzåŸRHþêOÿôâ"Û[ÚðÔì/g%ž ö»+p "2¬¬nf:ó3ÞÀ’êÚÝ{¿\Uæ] Þ^•ãÅÕ“X|P8~T„× ¸ÝÜÕ§–73<÷Ò‘2‹oeýáršÀâÎË™ÀûÒã…„Wr¿g5˜/"³sáãÉ™{£ÏK.½(ê°s^ù’‹(Ë쀃Ö+‰Ù •…Ó×;­x©V-Å\9Í9Ò4èÿp¥äv#[ã[Û‰^ôÆ¢œƒp[Öðús>ö z.sgÑâÎLuÍ&Š+QÝìNG›Ó續ðh•/Ö9Û纖‡ "cpá†ÊïÊäâ¸qg”¾Õs¬+±ˆ‡¾(Á]œ7Ô£íУ"àÂå]„îÇJ2×áÁïK7ãú×®î‚'åðq\Y›œ(ÿÈê¢~ž÷KŸéZQ䞇¹ÈЛ ˜ HÙÚ ž^¯„ó&ßäh¾ÿ]´zî/jµ½¾ªñú‡3w¨ºçyÎ 6ûnb®Y6¤²fSK{¤…’%·j³'Òb©b ¡ž=Ii­‚"Þ¤Ò&­¹©UÝ©êäB/4sgdw…Q¤©:I/ÚA»AJ/TÕDŠ,tuæìâŽR<%æBŠXŒ±®â&Ö;w§ûY퇤—ò«?ýÍ´»jh)sn<½œðò¼½àG¶»}>ðþí^ •îà=€ÍÏ¡Ûg8ÿP×A‡?´iÞ]׳rÓ3ÊýóŒüùõƒÊžgXÍ=¿üsúöóëç×ϯa„ôóë•iÉËcøqiŸ¤¼dd>ûx¾ 8·H§XÌà ã=U y¿Îü·úþ:™geèhoP¡×‚†qIgD5à”i:u¯6¡ •€1© ‘‚³#Ñ¥Œ¦Î¸6¾XÖ¾ÖÚ·Ð $—;“ñçÈÚÀ Ú¯Íí¥¢kO ñ΂·¢;»bk_â”5;ûùÞTøZ!ˆ¬#ÈqCʵϜN†Ó”šÛ ¾M€|µ“sb3¿@N¿oƒJ ͉RóމÅíãŠòÃõu:¯u/‰ zV +ƒ—Â… ,«ìˆiÛ〿? Ï®e"ÃYyº 8U(¦ .aû~ﹸ{n“—²ß?|úô‘€åbÐÔ‚&ªIÐà,î4Ò4p/"ZÜE ÌŽt i !wÔ«T²«ñ\Pà~h•¥ŠÁT­ÒXW¥-¢¢Uܼۦ*þáR26)ì7( »hu…|ؽßÁ,Ó«wûãï>n¾ü³œKóŸþ}|g¥´Lù莢¤vÂEƪ†é¨B(.®´Ò÷ñ;Ù)òw¾»LpGˆ}÷=3ˆ@x€¥¯ÛÁý$þã(]I¯“ì¿pö"@FÇ2Ò,€Ÿ$'DÑy‘Ó*¡Þ¥à쇺³IMKq @GD@à@¨b!Vôœs:$ÂEa1†PYT'Û”öU¬j@!^XDt³Ùªhjsjs]mXô‹÷¿ üÐrÛFµmÜ–âß¶ôRi•‹³õZjÛÔЃѠL^m6Þ„Y%½(6USP=*(M‘Æ¥LQ£$A.MKhû° ï¾*mÚ}<¨‰ö…¦c{kÔjÑc ¦!ª°I9t9Ö5v[)¬R“Ky¬rU‚ŠÄ"~$½°MT¡Š•›ÉV,Vˆ©Y@WÜJIDÜBa7C$*sߪo*” æ©d‡JqÒé^r“—x˜7uâ1=Ýø,@Å¡s5î ¤W—Ã`}2„ ¤ß›¤ßKä¬×½¸ÞΚ>ƒý/ÞwYÚì¥<<¼‹UüöÓ· @!U+±*%{.)%ÕÐk¤Š:©j’š¬fN§‹Ö»-®`¦ÄŠ”X¢jJÁ4VðãcsøæhAc㮎u4Q !¿þ6—”ôÉ«ÊÚE þ±=¦oÚ¯eζû2~õeÀj¾mYÔ6Ù“Ä…uX€V4œtU‚w*ûT$x¡‚’à€º<6bGlkVðŒcBi¥£ì”$!P¹€‚œ¡Š`È´s÷-Ý&(Aƒ”/°JB)`ªÁ,LAƒH¿ÀÏÚ/ŠºŠ¤8Óé~¼ÛèCÈ¥äÇ,.±bÙ5­w›ìmξѪª5…hJ™îâP±tÌÛí®ªê’·›-ÀòéðÉ=×› P£µm» UfÙíÚÜ&°Í.™RÐXÉŽàµeºµ½ 0?1‚ª™OO­PFåñ)­À£»š»ø69~ýÇ%l63)MJ%G)* ¡ÄªqH“B…æÝ>ì+æD1#$‰èã1&o›œ¶›ùÔ$Qã㱪cò”™fwî ÁBPT›*+Ù›â"ÉÒ¦.1:!!³ë?I”\ÄTЏ/¥u €8Š”œ½Í^ 5“*ì>ì;¾‹ûÔòýÃ/¿Ò^hèrXÉ,®– †zsk=‰ŸÎáì+¿|¶`æÆqLÉéÎ)W"Øë0kðÜ™‹<î¸ÓéÉáYtq[oªõi"¼¾øËìë%Ú¼‹Ø±ŒÏÝiÈ>ÿœ5£úþà©®‰wOk2¾»”yd\M:˹¢ðñ¹7ÈM9 ë'äôYL«.BÕ“ËH‹—i|9﹜Z5Øç_:¬taüZ¢:V|=—=Èsž— rdp‰a‡QÃZSU¹§ °h™v¢±èJ5©Ù ß>ø.Ε †]g9ÎÎ\á.á—Ñš”¥Ur¯ÛÁ0âZá@–amò –&OøeiÉ y<)9Mš{6&¼š®q,\»f3€%áÑþùœ”Ô8ñ%»ø-îuW6öËŸJO¤zç–~<Én¯Eýd¬B>Gîß”›ÉКÄi!L~ç$xg*w'ôvÿi7Q^ŸgV2ãºÒÍn­Ï‡ùÊR;ÕiZÎE_yvèXó˜lž}Å‹eÍ fp«:9 +èv•íeÕ (k]ßo§þêGßó½WÀÃÐh~n¾®1ÄdZŸ%/ú¦E¹é)l8©ðrTÒü1‹Îß÷!k’•k©Ê²áç|],‚¡ó~ì3W)^bE€PQ5€t@(ª*È©îb -¥-îBh}ó»i‚ÀŠS‹ÁTœD¡}÷GïQœDÜT$áLŸDeÿË÷mÓúSëOMeÆm•¾=JÅýøõ‘‡´ýõ»öc6ZUküâošø×ÇVcˆ€3h0?ÊÑoõ¡†–#¼ 2 Ñ Š%Ôb«¤K9¢5!B€4B ˜3D{=ïB) Þ­¾’àŽ®7Dgf¯ýcìQþ’!« ¥éÉÄ ŠªŠ)%20\éä€êMcÕ´-1DÍ%W¨fz¬jù˜›ÔŠJ`¨B½­7m’cûÉÝw›ý¦®s.OícNÅ4îÞ¥&yòA¡Òv›msÇ%`˜mÎ5v»«îiÇõö o«¢ä+˜þ¬j¾‹š¼æc*ëu‘E?×q»Å c?GÔô2RÂö5$Õ,a-#€¼ÁÂy˜Â¥õ(]ú »áTòñ]«úüVÊÏ:u?¿~~ýˆp³Á~r¢ó/ÛÀçfowrÊ,“ã¸§Šƒþ[þÀÔbÎ5ä·Nrpïó\Gìk}çþ”¹‰9–Í|¦Wý‚^bŒVÜÝ.X¸ÐÅ/žÑlê¦,–^ãȇ=v¯Ó¤_1½dÐFñÙáåÉL*%vì5u†Ô¸ó\ú½‘ôÈ’zåCåjmðNÆÍEj`Єu…%tßÓ]bÜ*¯ðoúõE 9wÀR.=}côÿó7#w¯á½cYèü—¼]ä™(ÙÁ”ƒ9ù­ ~!)ˆÛp.èGÚD“Y¾ÿÅ{µÇæIs›JÎtæ&¢bª ‚î%'533rÊE#¼/h 4UÕ=%§È…îˆ1@é,j3qH¥í§cÛ$ÉeÿE‹%e:!b›ºZ 6µŠ´ß>åckï6m´¸©Ž_?zqÛ«ªfé›OåãÑuÙÆ_þIÕþ»¿o›l §{‹f¥éêâ"„Í%g˜Dn¥®‘3‚@…ì8E‚ƒfd"FŠÀ¨"ò°w p„¾[èm{Mú6ìÎÓœ÷|) 0ï;É œÕsK!L@‡‰š*áU AMDJ“ ´®£iEû”ª‡°{·yzdCm›íÓ7½)º©?<ü¢ÚƧrxJ·»MJEDɜ٠K1ÄÇOߢp÷°7XÓ¤Ös ±Ò‚ ÌBÈÇ’B.©ÐtWïôŒ(áØ6E*R43?µ)µqüØæ¶øvÉÜ´9!|øÓ¿ »ÊêX’g/e_‰ra›ó¦ŠÇÖ¨?ýñ‡êéhŽv[‰³6ñÊDÅR‘2µ:6Ç`O"•ÃwuCúæ“I¢{!?µióno ­•1wS ¡‚©xrHÊQuÐ( NÒ<ˆ1x)"(d)ç¾P‡;rS¢‰Ï9+à@Î%pïÿEÄ¢Åm½}¿?ï)¿ùÇÿ(ç’SÊ)—RHpЧ~rìõÖIº ÛÇ:Å|R¸~f_¬F1l0íÅIʬ7ü­Žã˜“mس&Ö1øR™u _1[ÜxQAšoƒc°…À¥<Ïù`rtÌÈÛdUœËz ;ï-ðíÚ»0¤£ÍÁùá±; *æ*@2ˆ,Ë‘ÙJàv|5èŠæ³Ð°ÓZâô$žä,K­t³±»×xy.š´ò%Ï92™´ã¾Ý‡DO8=“¸ëû‚”§Ã‚_åD Æ‚Ý:Ǥò%õ¬Åü†®¿×'$&‘{äÜ3z*·27dq‹¿Ò;~vÓ¼šîÚ*?Û0Ëz= š0|îl™?®ÑŒ¸rË7¦\ÍÍ䕿ÞC⎜úÖ&Ûõ º\‰ ‚Ïxž÷ÞÈ0áÛ­ý·B»F €ë‘_ œ>3Éäxï’»B—·BýîŠfbJsfÉbûðݘ7t¾³;óÅkù{ÁûÇ2£ãàÇ-:ÿ’):Ûo‡èª. çûçRÛÈü ˜œA쓯ãQ\šQ&0ð[:Ïÿæþ'6Q»çÈQ×NèµoåÖþrÚeÏD¶EBÙl`dËNòµé³•Zd凓÷|’N{C†Gíé-rbœ-nñã1>‹‘ò>A½Åi·(ò;¼¥~î1—±ªýdàrakÌߟîäÕ‚ÁµUDx6Ó‘»åÁŸ×±j'êq¥|·L¡ê ý|ÒV#' ^´ÖŽ–á,—¬®JFŽ t9¥Ãýï/ Ô©È…Aà„^PŠ yL Pâd”,Ia#HY ˆ™“8E„¢Fý™4Ü™ý€:Dz·D1€€÷®¿NˆA¬‡:ƦI"° ÈýÏÂäÐ Å=AN5’”j5µ ÇÇV2£ØÃîáðØx)Œ–™<šovÝHb:þþP½«B ›í¦è£©šY°‡ãSÛ¶O¹)‡Ç§ã±=|<ŠÂjƒ»g÷"Ç6í¶uMi©ñ%l«Çâ)5Û¨ÚØ4 e_WžÚæ©m³K-¡•ݯÿ"UÎ^…Xײ¯KTß©A’‰:âÛc©"ßmÃ×H_ì¥VG„`ÿùÛ±`i] ß>áéhîYÑJñ–RêJ- Ä j)5û­IÉ‹K<Ó²W&ˆ‹¦Âœ[:¹É¥ŠÁLäRhÈ.ÍTJ)mÎÁ¬Ãòp’ÅSÊÈ÷¦-‚”3ÅI#  ŠÅë¸9¡ÿÿøoþ¤»÷´œ&ôÔýžÊ!º³ÓKUoLœžÊãƒâüåçpŽÔf½%WuƧžÜÊe]‡gÇp°·]—a±{"ùr> ÉÑ…¨‘Ȳx/'M±"×ìõ¤q srþÉ “É$Œ[BälÙrÂaïPÇûì#5,#œÕc–Ùç)´˜utaÃPò$RÁ{àæùñz‚ß/Ñâ$ò#8ŸsM¼É$¹ÔÝ=ð³lÎ%®áða ~:¸AÎÕHß>"¿Ïkç¥s¶R8GG©]⹑jÑpÜyÉö®°¯…@óÇ5×ê¹^E˜¨“tnä2Jº“hOŽb­Ek‡¡PÌÍŒõ~jÿœ»°0š]?Ѩ{B›ëö—Òkg'62|»´k͇û4=d¸üf°#sLYˆ·‡ÿ\} Ž™`ÖÊô˜¤ÊC˜aªžt~ã ^6.šÚI¬íT3f+Óly Ì+eŒ»÷y½`Ñ·p|í礘ƒ¬+Y‡'mžËfr‹L©ë·8Ó9Æz~V˜éÕžf·`Üôº«ö!Œöà–ÚÚž‹ (óEÖd˜ÆÖƒoM.o¿KsÜõz9/À‹Ü/ÖeæÅdXס]<øf(Ðrû X1„º†‹¸ËN`ÖExízøqµø6v9/Ÿ/ºÎȵ¢íò6p>ÅÙ@qözYÝ…—nÄ~¬¢ó‹‘Éä?×ä¶î™B] `ùCNûç'º¾RV +<éMWlH~ ¯çºeœ wãy¯.€ß_ Ø<=÷[>à;®-¾¾¬ÚçEŸãz.êe‹yˆÌ_—ør–þö›œËû½UªÃññhQ!(¥|÷'A"Šÿãÿ*tªì´xLº(Õ ÅÁ"Qh€hGl@°~ÃÍÞpqñLBB°!A¨’jd(¡g  ¢¸"êtQ…Bhì½÷Ûm7¿ý”=G)—îén‘Px1§´ÇÖÔ޽ȥÍm&Øù÷ªHUÇÎ1"¥c¬ã¶Þ›§R·•ºAÔvhˆõ»Ixˆæ¶<>•”·›]:¦öPLÃñSãÙ‘hUJÊ›M‚iŒ‡\Â6±Ã¡ýöñ^EFª·uÞq¢,I–$hÊ/þé?óc[€CBübCXmþáÑÈ ÿèÄà©¥UØßÄc åÓq÷õ£|Ø—MD0­+ì`ÈJa鿝þ¦n²š|H8¤¦x æ»*¼ß>6 D7›¤ÈÙñé €²P‹Ç”‚9ëc ^ÏîÊXå ¥¸ó’ÔÚ*zv-LIm+tHt Ï®¦qS§ªôâ Qc ªÁB*Y%RJ)îUˆÔD©à¥ë߀—ÔæÒ¤Ò&).N˜Y½©j…@DEMëýöÏþò/†ðO6ºÓ½;³ûv¯K9Z8  Ýí1™n¨K?}qV:”³{–ÿ¼r1‡ç'ÚZËÕÙxüQ2Cl¯JkIö„ÇÉa÷=úB÷¡‡þéůÐãë&î“z‰28†B%K4Ñ7 ¼¯LKŽ­€‡¸óꫲ/¹ržda¥k¾éO¤ë: '†å[ùÝnñ¾;dýÁ`€ßià&ë‘­Œ‰93C_á¨8Ày*Èa÷9#Û9ë™^÷n†ã¾ãïiØp/ŽõÃï£|vŽ&oY°[wü¨_»»¿Î½á-‹φ€yßzz޼ÇbÑð»/¼þ)ßÔ^è_<±^Öð\øI‰Î¿Å ™ Џ.ÔqQˆh÷]«]† ÏFò(‹¤â5¾ÚÈqUsì9ÑAÂ-“íáñ:•QFørÉ/mrÒÄÅTŸçÌ<¶5Šë„@±&+6!ÏÑÆy²zå!®xFŸ?çY1® Þ(k˜©,ÀÓ2g7__$ƒiabOød'ë˜X Y¼ µ€t~„Ëz13Á¦Ž!{é˜ê[É0@ W³Ê!ÀÝϪ^냸8ph:É•³äÍ ’UÈêÁ;¾÷+•¹†ûŸîs¢¡|½:0è4?A»FNz?¦gÅÈ™*8Pš~úI¼‚\¹ÁÅé=šÉ³Ž‰‰úÄDñíY¥‰MÇøÁŽ]Ù†Ÿ&=ÿZ1 Üxcv=øã(r"ýÁK `(Epj»PŠ.eû~¿}ÿðÍú÷R¶ï,èÓñ`1P†Î sFÝÖ1g!)îi.É6eq•FÕˆ*ªèîÖá â¦.õ¡¤Ì6Ó´d*,Å(›€âÔ&›Vƒm7ÑÛœ[×h›,=Û]Ý>µ0­?ì„.¢%•ÇOM>´¶ß¨ ýø$©Tï¶õû]Î,Ç‚œqLÞúî/þ‰ì7ßüËÿÉ3%É¥ xë¢Öéî BQwxˆ‰f€0ïåø, x¡X 8RéYÖéþ(Izïé¼3=jØ€”|DU—M½ÛÄíSóñÓãã~³KÙMÕv!ò”ò‡÷Û/>üâÿø¿w¢IY-XˆDq-4–Tj‹$šcc UE¨Yñä¾Ûìùä)—ð>6åP’WUR¤máò°Û?>>ÊSÉ.ª"a·Ý–Ç&Ó]v»‡ÇæI)ÁbÉÒ>æã1ïê¨1T¦šˆ¶0X{L»¿û?•],Ð]¾=¸Š½Û‡=cT6YSÙþâ]ý°ËÿáÛÆ`ï÷²‰…´OÇLþâ×Hm[W©j±©ß•?ìíØÈ§¦Ä üý7éýÞÝ#Ä•L‡CÛ«£šzJx.Z…¸ßw\5µÍf»• dµŠÒúZUçÊP¼ä\R*Úù]@<'’îE5xÎøœžKIÙs‘âpªˆE³M½y¿×Ó2ûó¿ü‹ÙáLz0¹»»“Îî#´ß‡"":Å]/ºæãnÿ‹”×b,"}éà\Ͼ?»¦k<í^Þo¤õúþè0£0C  Sø{iµ™å½\ ‚F¦'Þ‘yÜ1„æe†sÿþéR±¨a2ÑHè{‡)"ª Añi˜Î!§adÚ“µ01µÉLÔñ¢T2 𢭷rZbòIð"V~u®©#¡®þÅÓÿœÞõ½ Æ4»‹I€ Ÿƒ;TW“œ{š†oZI¢ÎŸI.›Ë˜ÈîÛÉÇ €¹êΕë¹4ꦾIËä›cúëiµ¬Ï+÷ ÀÈ8•\, 0#UŒ>qº¨ ÿºýš”ó8–ôá->‡.1ÕÖš‹Èr« fêC£]r ¶V3XÀË.¦çTFJp x”ã_%J=Ø= ŽÏ®|øã,f_+«`˜ÚÈØ‹gæpðW°£g¬Ê¹0ñï&ù÷€˜‹¢lñ䤞> “†È[:· ·<“pþ–Ù¹/cö‚ó`©siW_¦Ãs6 1’’þP¢\4qi¢ö|V7Æ4ô»|.ò“7wo‘מ=¯õÜ]rúóÂx\E]îÁÙñúµ6‚E-¸É8^yï$N˜ýÚÂî>Ò¾ìv|Öó¼§‚«6$§gï šQ?:Ñy^Õú|®¾Ð8ùÆeùYp_¿z§ºO³ ¾¢×mŸ¾cWŒù“>“s¦A‘¹¶Ø3²´KÝÅûòÔTûíãÿü/‹¹˜Ò‘)<:÷Ä.ˆ)þ»ÿNRjÿûÿž½Z:Tdqˆ!Tý`ªÁ…P!Ôª,”ÒZPµb†¸%NBC"43Óøí×&±Úm„GÓX˜!òí§ãñcBK)9SQæäÛ(&(²­v¨Xr1€ØmvNʇÇG…±õÖs¨²ª”¶ñÇ£åÌÄth•U¾øÐ’–ªMû”Íܪ@˜ÔQÉ ´M¥ÞÖ¹I&ÌDUAn DôñSk¿ücý•U¶Kn¿~´œ2•Ûz³ßÀ]2 ˆ‰ÅP4 K¶MØVAJÉßfn*qЍnkßÄÚ›ðT™½©ë\Es Ó!¹$ê‡}]W. D¥ 1Ó’¨"'yjY‰Qctw±à¥Xe¢µ˜÷.à•*FélxÈm&i"BÏÙUäXŠª,(j?H÷”™ ‹ (*ƒÆ°ÿ°ÿêW¿Úl6¦z¢Èt yQptº;K)ÎB:&ŸÀÌó{Fã¹ÅÖÅ^_|ê˽gÍ3‹yÝX|_Ö”Ï,¾I໲)ÊŠ:ÇåØné!È À¨yÛÝ,¥|;Ÿp¦(¾x¿Ÿý($9K£üÒöº•VðZ&k¸üó…'ùÜžúê3y}àwO-aÍ`&¡‰7di¼Iôy#Â[ ™Î0yCFÑÛ¬Á—3^µð° €;ëw¦³-õÇ©lôd¼èÝßàYwø À‹æòç½>c†Üu½á–u½¸þ±Ï[½à'):ÿâ/º9[¸ÄǺÞÞãú°V-{C+ì7‘ûwÈðúåŠû?¾»}ü&ÖOD)ñÞ²Mœº]x§ °X9xÁÞyCèí’èïL8õ-u 'hÈMµŠQÿÈ“7Ýž^XŸ{yÄ ¿ökòq¯çxkÈ`í,‚Fؾۓ4K¹ms.^¼®·M{tÑX3sx+˜…Œ@ö ETUxé>¾SoRÕhL”B]£jƒˆŠSµr%ÛæñÀRbeî¹}Lm‘¸«½INñâ%gÄ}]º?›‰bûa'_ìÅTŸ~ûñX›šÒ,Fû]qÏ^›—c*ž}ÿ‹½™Ø~‡*lÿø‹ø‹ÿæxÌÑ„‚æ±yx·}l÷þa³Û”œÚß}ô”þÛÿ«ª|óû¿ŸwsÒ)*¥u2©ôõ¶  hD\k/IÅ E,†`žR1’Bé¡MI)y»ß<||:½®b°§Ãñ㧦Õ~¿+,¿ûÝï= únTÄ`O‡"j²Ùo6»º¤"*¹IUŠùÉM$[Êꄗ̶´^¸ÿb+Õû‡/Š—âp-¥Ð¡»í 1 >6^iõ°«Ûß~üÝïž*ò‹ÿö¿‰ÛX)$X»‹~Løæãþ?j“7)ó©=´™VÞ…¿ØQäøÍSùÔää‹]®b¨,[ÉnÍ“l+û°å!1çz-À>õ›'DËûê fªéaç(È&jJ±Í‡娄˜¹Û›ˆ ‹@´-!ÕŽ&¤ TD‚9IBE‚À’sëT*ÓB¡N’¥i2IR!Úiÿw+«xN¹äâN~õë_oö›PEÛÖ›º6ÓIûhWšæÉŒ½«ô8Ù5ÿ;}tÍqrž}~—wøå|÷Þ£ö³èß_K¹o'Þ3L “VÊÅþp·ê]_7òí~íŠÙéßò²£p`ÿº˜ÎH—ÿz†Ó…)BŒ\0æ Oº‰Žàç áî¼üK‹¦B=¯—Oœ,œy`-¿Zc‹~ÖL˜¯È·Käî¿àë€7‰¸~˜0‚¬ª–sÚ¡—‰ˆ²° óÍ!Ô—ÝÆünž;Ï×1þƒNWÉg&YK€ù@G|éò\Ó9øn ’ì¤åü{Ù<Þ~d¿>O\¯t¾î®È}¾¶å—Í¥+-êϼ°Ïk½án÷c¿~ݹãÝÓrNZú®ë÷uþÍI `’øÌm¨Ï\ïQ1{Ñj~Qz}þ ³'% GÔ<â™ ùÍö–ë3cqZLþFdi‰¯èˆÝÄ—.[–îïöR¹>¡¯²cF·v¥þÚÿ”a£Õmï.K«y¸^$n9”ëº,${“ÚÀ¢’À…ñÈeñ¨¹÷«_Šk’SóОì>Ó™¿QFÐò2}úÃé÷9ràgmŒ×ãå 㣿K)'Ÿ‰ô?x×€Æ8“¶¸oJ“PÅɆd¤z4±¹?cC³å}ý‘O‡Ü–Rrë¦m³8¤‚ÀY„š˜(C€ªž“‡ÂÄÒõD›i)NRUé‚ÁD‚t•”=~Ø ˜ÛœU‚˜½‹Õv#žàTqÛJŒ™)·MiJ[­=l«¯Þ‹j..d¥pçñ›G@¶_½óTÚ&Ù¦Ú>l‡†‚ÍÛ‹!H0Ý<¶¥¸ÕÕöýñm¶»jÿÇ_ŸM“Œ äcõTï7»÷{¶­¢ºý°KŸ mr“ÝóQ¨?5åplÿíÿ¯W“hÌÉ‹SÌ ^Š ]Ì5:ÄáEK /ˆ|õå*üÏ¿û¶x"ˆ"Þoª°ÉíÑÔšcÙT»X×Ýîö>¼Ë¹MIª w»Ú%ÇJ·u*°ððÔ4ßoŸ¬’°‰€;rØiã»÷ûÇÇ'O%I¶]´Vx0p‹cΩÉÙ½-¾Ñªª«C“ƒàxäþÃîÝ¿ø;wßVá¿,Ù+¨o©€›/wPkS뉺ݼûÕFÀã±xL¾­Êf#&‚ì6©@TªLh²m4S1‘*ŠŠl«¬|:H)ØoJÊ·G+ÙQé®Òñ zÏwÎ?ï爨¬r¦‡†.§ ®±&­»éÆ$ãoåR2|O]j­gгlêÔx4(ž.N6á‘<60ŠóÏSJÎD¿Ë£8ïùò2Vš¾y=¯A0ï¬X¯¼±B˜›kÎ,íØœ¸jBÓ1ptÆ ÎëzO÷•~ðûòî·ÜÇ‘ÉOAt~&Ü¿¨ÓïáükªBžŸä‚ Ñ(†˜‘MçÏg¢/:A¸V|¿„€×0V[0î_ÏÏ-i^×:¼‚f?÷)Ï÷Gݯڛ§æÙËšìæ=GoG_Ï;‡®}ã´1p¡—ò ¯|¾ì¯3–Ú_³®O÷ÝKþ¹×¹·x³^™`8K¿·È„ ‹V×Ë—2Àó*ðkshýdz£=s åðÜìD05ܘƒ—$d¤§z½YUzx©W^âRØÚ?‚ý‡w¹x):½”ÊâñÐ@$˜‰ˆE¤äÂ:ç ™AáÅI/§ÒA%DµÚX)žI3Óhž‹˜—¦ø¦ º©sRWJŽ%—B¨%%c‰ïv"(¥´‡$^4‚¶­º+·>üæçI)í÷ÛôéÈ–öa_UѼ0¾¨Ú:}óÄã1¸kCP¶‰¤£m%{>6ùÓ!¨¶ÇÆ º‰û¡¶Oíæ¯ÿJ*‹›úéþWΡ+,RÍA'3EФMA¥¸¦V~ûÛo‚áñcvJ$ĨØ~óí!ç²­KÍûw±Öo¾ùšD ^~÷û¯…üÅ—_LJ÷OÇOumC÷í¦®vñã7 j‘ Y—Xf5{á§ãá›cÖ²}¨c8„­yV#Ÿ>$ÛÔr ¢>üÝUÕ6æ a·IMr_ÛÓc[´î*Øí*†Ø¨ív;h+ŽM]{ÀÜV±ÔUS¼•M…\üئœ+1M…µ)TÅ(.jRw(O‡Ü$n+|a™hbV±í¶“âdkñPeEÇ 9¤”’ÕuÜD!DÑ©÷»Àì¬vé&Bw@ÜÝ;XMRCGð’J.…tÏmrR bæä/¾ü’ÎMU ª‹fÁBŒ?'ÓÞ²<øö0ɹ±|° ÷b€¼º-÷¶:+ ²wï:ä³zVÒ~éîöœ|ø¹ €þ1Œ9§ÀFE â"²²{ÍOj¹çPG“ÞyƳ‘ œ;¼ÈÎdHÜ1•?Ãÿ×ø­SBà°³ý’«B…rVtžõg¼Yg×ýíÃ~ƒ~B:!s|Vp·#ßù”[XÿbŠ5w!ž7.ñ>pí™¶g÷ ~&&éž2Gm®ÿÎkxoÖHøy©ïa,>F91ξó~¦ëv o «rièþu4ÏUg[ǵÏàþì£Xöíæ¹`Ô¥´zâŽu߸Ôã…µ¤gíŽn /Ÿ¸×älop·ñÏþ~Dìû‰V9¼%`9Ž’—lI+;YÐØã­¼öúyk­ß7cLžK×óY“£êNpïe’›0ÝÌ¿çùÈwóúQ‹Î_/½`& <>©º®~•ðCÀ倯pÿ0¿ø9®¦na¾ßûPMö”gH,ÞÓóþ‡ñšçã¼ñ´^™¾~ã>4~D÷ù¢´RÃÿnþð”­>yŠ?tý¿ñÕJ'š.ï¿üð¤Òšœ²»×UÝ“Ô}o?D»ç%Dq ݽĘA/ªÖÇN¨¸SM ¢ ¨ ÄBK)‡ÛPí·.âD¥YóÍc96^×ÑDaBJ¹)¦0ÄýFÌJ)épÌMkueê‹SÈ"‘Sq©L¼8TIäOVnª°•Ô¥iÛOM>´a_¹óøõãîû °:„:Vûº|:ªª8=5¦Z½«²Í¶ß<ü‹¶mKóÔHõÆÁŽÿÓÿ(b.%³xv:Õ%%Xt¹ŠªÄ@|ûõc[ ?>‰Q„©-%‹j½ÙÔ_~õÁß~ý1%:áO‡ÖÅ݉61Ð*j”’Á(mÉÇO©Õvk+b»PZyjý}Þjë™Ií;Ýjqª*Tßÿ×ÿUIåøÍc ÷•«ßm¨òíï?¥C6µ›ÐTª°ADŸŽ…DÙVÇCÞ<%ËÜÕ›ú]Õª•Cp‹†œe·iÝQy؆MÍÔ0%ꦠmñâxØ€šÉî…¨ê á!Vµ˜ •ÃÎJÎ¥¸Š© „ª¨‰¨vƒ­ ‚uÖ’I¨iq' —LWR€Îã:§ÂRX¼ÛÑLõ7¿ùÓ"€HAMÎþ=ª¶{ÿp N5=žK "8úÎô®0èþåOCÁïsd%ÃÝsŽEò†—Ú÷¿õ.Ø)Ž bH˜¸3ðÒ~åœíóE­Wj`k Âui©I—^ ˆôýu×&çZkçOoGâøÑs ?аuiæ¿Õ÷|¿ûòÐ@f©»™/KßR5õœúóël÷ølC÷cÚ•ÿકÐâ‡_?MÑù7 ™Þd|Àš¼æx¿"jtýí×ÚZõâ~×îž!y6^ú– €á‡®Qƒ'±Úâ/r`×Þ;¼Ž;"÷‡S§7ÞЮ4&p©}aJ$™ü»{æóØt¾ÚÇ,øKÔ1WžYVõ…u×&•àªùÞ€±ß·ËY—`¡¿ã"ª,]ùr²ÿ.’‰f|Õéý_÷ûlÄeþ(Îò2ƒa’á Ìv„Û‡=϶“ÙÊDiž‹±¨8¿æ“ç0nû<«Ù,½èfœÛi»Z3¯P÷o³ú—zç9¦ç_›4úÝA6¢(—Ö9o?§Ánv"L U†?%Ôη#œô¾žúƒäNGkœúPñðå‡O¿ÿ‡Ôf€(%åFšŠˆAYrVUP4¨ŠÁ"jPÕâî\2c BU@C¤{·H!jFì7)Ìtñ6U¨0F¨…MExö¬”§Çæ˜ý‹mt…›ŠAÝÖuD:&o?ûÌßÓ¡©¾¬¶»Z K.÷On«PW,N¡¨Ô› eëØ6©~Ø•¸Ý<µÉ!q…ñøñ`ÁJ[J*Þ´áÝF£IÔì¨î›¿û/ªý›*üö÷%³þå´ù›óê/öBüþøKaµƒ¤êDZÂï7±z·ðä¿~z:4•Æz·É%³7Çöë§æÝïw»cÛ¶É¥Šj’ÚdB1§fÀ!{iJ†Kªôø©aÔ÷ÞÚCSZ ȶNÑŸ\˜uÿWÿL·Ášö›ßªEQU´ Aö‡w[ÄH§¨Š›‰„ÚÁ]Ó\[2ÉÁñ”™sr&«CѦͩÄm]@4mÊÇ6Ó¨K©¬˜P¨ÎÉ.¬SʪÔU‘]¿yôýUˆÔTErÓ°ÊôÿÏÞ¿-HŽ+Ù‚˜-€tˆ¼Uí>{ZG3úéAOúéëõ¦_ÐÃh¤>Ó½«*3"œL$A`Aº{ddVzW×Ίôp' À.Ël-3±_äû'l3±…=‘YCSÈ‚Ñ3ûIëÇ{?8ïœû]þ·þOOŸ>œŸ?üöÉϬNbÌŸOÌÊp]ÑÉ%hâð³ c̪fÁâN¤îÌnSŸùT¬* áE8SÖ m-¶Éü2O+1Êuq®ÑŸø©ŠýK<,Ç¡Éìx7KúzïÅnš*#X¦¤a“¹rT<¾ÚÚ0Ó‰öa’Z[À ¥7ZˆÌ_Ä„0óëIªn„»G63™³ÉT¾ËÍÌý0µ„hƒâfif"ò“øV]¿Œ”"½¬3 Ä7á´d/ɼ(«×ä8rQ‹bO¢XÍ +²¯lP•ú©T8ÔŠÅfÞ[‘ªÈ)ìO’‘½È• –ë8µÅ+æEk ¹h±â\Ú\â7««Ð2Õ0í7̤~¸”´6#ÃðÖ€=2oˆ5&…Ã*GÓÉf¤(¹ñİ|Ì+|䪺€•@)5Ÿóå ÷_Mýcu§ˆÅ½B‘Að)׉QÜRÌŽÚ‰9p"CA™PÚ+´k„å£ÇÌÛsU‘+C9‚)CÊù.ò_È,³”Í…©ç3dIô¦däy“ʵ¤ê¬¿T®‚XµD&mÙ)úlb³Ü«vµk¥Tw¶‰¿•:¾Ó ³YPå(W@öÑGèXi“H© ÞßÓÜ gV::û7Ñù+¿«}sªÞª~„UÝ< ¥‚eA¹£o\¬MÎkåc•ã†E©ñÿÔ…¬nWŒÖÒÎ_ºm¹K*%»ÊØôë÷nÑ%ÁìËÕ9ÔwjRw–…€”¹±Pªá€u§FU½öC¤.¢©XS•§ÜfoѦ„"bË:9Zþ,u‘oà:Ô.Ò\XP±!²e“Ķ-‹ˆ0ÓPÊgÀ€”ÀÏ5vž¸$)o€Ôì–äÒF-¨¡v!P½Òßn04؉Lµ0Z€)/ùøûç£óÎîñü‹Ë0Œ®#ãÈžú뙉`¬È;?åÂÎ{k`¥®7ŒnÚ¶žh1†¬5 òìALž¦ïÆ×ÜèˆFϸŒDædüã£ûãÛŸÿñÇ…ðñÓc÷ñÁ1YcöþÛë‡gÇ ¢‡ß>ŒÏïü×Ç׋ÿ69&OãeìN=?¿úç×îÓ“=[?:ã\o zcðòu°§þó??:¦Ž™‚5ã×Wî»Ó—‡óxr߯o}{þ¯o_>>Щ³§Þ<¿^¾]ºƒ{C4^_‡ÿý_ÆÓצ3í¾üŸÿ/xìÿýü2 ȇӗS÷eNO'|èËÉþ××—½õ§Ž?<ýõ¿ý/ÄÝ·K÷ééÛÿëÿùñÓÑÉvæåÕÁ€:&Ð0²!Gûæ†ç °O½=ŸŸœ£“émoŸ™Ý£ÈPßýãÿúóLçΣèÍ×ב<¼¾Ž#3þôèé«}ì=€µð—‘ÿzÆèûÞÈŸNçÿù‘<ùo¯ý—ãŸß†ábžzcÌåÿó?>öÖ“y~y1§lÿ¯¡]¾ŸþùÉx7~~ÿøÅùq þú×+:ûáÓã§ÿûÿÃ<ÿoÿ2//§S¶Ö°{8÷——¼§SoÿúϯþëåÑú§ß?\^‡¡ïÏ'ã™Üÿ÷_ô2<þûïýSÏ__ûôÐóËðòì;Æ×çWÛÛËó…gOaê'ÿË0x°…ñüÊþñ©ëÏ_‡î‰^}qŽ.£é¬yèàtêODLs¡#ö<ëŽ_¯C–Ês¢ñÝ»H/eV>l­ó_å%TüÑb– dÈS&¹K…‚x:ýafýñÛûU ý^Z(<Íp÷žˆŒµïè‰L©Hëøëõ“¿øÇ3ö¿^¿´œþ“Ù{?UƒÞ›zÞaç_¯{‡[û憆æÊ× íòYñ¥€ùÀWtì¼ù‹jJÂF)qcK7VÑÀJnž¶h ÛœM’:H(£ʉUì§‚ »D«ÊRëdstƒ~:²u"‚n¹½år)[lƒ„“Y?su|ËEê8£ÊâòBîcÚÞ|¥©Â F–Wþ;&¨£ä£ûŽ G÷»Vq™ÚpÅ–ã`Ÿ©â ä ZA2Ä÷({d™ª-²Ö¹ƒf+^蚘U¤"£r *goàOJÓíÚj±Õ¸«_[>ŠDDŸ?xï™ýxØ»ÇóùrGÀz6gÓ™ÞÞ½¾¼œÎgï§ñl­1Æ‹q<3wÖ‚7ÆöõLÌÞ0–†‡gØÎ>>^ü³óÞÀ3w~p¶3è{êl¸‘»×ìûGëÉ:Pg-õ=Nììh=`lGf¼¼þùjz<ÏžÎ/0§Ï¶³ð/ÃëËøìñøÔù‹£átz<gÌÓçÇ ðü_ßþøóõÿíƒ9÷î✇‘Ó忾ŸNn­1/_/§‡îõÏW>8{2µgóüç«çádº?ÿßÿÁÎÞÓàøéüðtqìøÐÿÛÇ&úÿõ¿l÷øå±;Ÿì7ký8~þøømÑà½7öù#f7Ž4ØWcðpúvN„SzáËàØ±ÿv!Cl{KzËn°ø:x2þåÿæÏ}zðLÝSÿx²ýõ<œ;3t¯¯7º‡Sz:ãÜŽOäFgzûÐ]<ÞƒûsgºîdÌùÁ8ƒWÀ[Ûwèl÷Ú›îSg;÷ Ã`ƒËHÞó©vþÔ™®³0˜f(ŒL€Áã™™ÇÁ1œ‰˜À zk:Û1{f2Æä={ïæÎXîŒ5–Ø“0¡)s&xb6~š)êýèxý8úѱó¿ýã¿Ákmw>õç_>.>":äk ,L­$ÁcšËS£v×"’²<³qŸå ÈOL¨à´<ñx'2®²¥ƒE‘Æ"îñpó{ÊÁz…¢·Ú1“œôÑsÜç%|}®¹1Ggºêð6MÈ‚ö¨dÌlý|¼ '_ˆ5,ËÔ× aÃbs¬-@‹’€ýÙ•ZÔãÌ’ÀK² äŒúvG9]o.›SMÙ2Å™KÌç´÷ì8Hç¬ê·¨ÄT[Lßm/õ¸åâ6’Ä6{š.Q »./ÊÞ¦#$9kIŸ²|6kR)HljçX P¹½wsp%µ–A2d~HQÇ//æ¬Ò¡Ù¸ÓT’º Ø3½¯¿Â?«fÓP·JE xŸ±Êî­(á’´uC*ŒiOw¥/oÍ$oH-ïöÒ¼Ðc#psÀ¤yuv|EI=/ûÆæ1 bkªÊEû!ù-3!¾´´j!µ/}ÿ:’‹”+·ßg:,—4á£Åø'seW@*œŽ„‹I×¥lʲ+4µ]»¢Îk¹*!'´ø„‘zßIð·‘µDƳ#ÀÚÎ0cÌ0¸é€ºÑyÏ]×]x˜`O"ãÑ£ÃëhÎýùþõmpüðпž::õ£#Ó›áâì©s— ýÇK°½¼øáuè:FÛûû£ùë¥ëí§Çóǧ×ÿüóù ^.cÿåãÓ¿=ýÛ§§apƒsçÇþüùò`_?ôüâa¾ýןÖvÞýÏ¿þþëá|Âùä xlOÝ3pzêøuè<¿zü«óƒûp¶ãÓ‰žº€óôøpº<¿þ店®Ãè»ËèÜwlMçíó·Á<ôÝÓi|ùÔ]GÔ9½ñ¸°¿íØr‡Î˜ÁÓ·7zöÆxçø›÷@s>wÝÉàáÔ™3ùatnd¦Þ¼sÄÄÞÃ3Ã'Còì½'&cà™Gç:kÉ0{öÄpÞ[ÀL죥¹ÆD伟ööT?˜ñ<ÏÞ{?ºá2ŽÃÈÎó?þÛ?m×uç¾8?}ù„IMw–'æU«WæHȰ‰vdé*ƒ¹3„ê5¾\œkð}2 sÚÉÉ-£QÊ%ÄÒ6ÒØ¼:´¤¨Žµ(¥j^Y¬HÙ»x¸2—GºòNÐ’«#…xbSAl·Ðš3­s J~_Dqñóçà@þyf2¶”‹TÞ½34j††ej¡smŒOŽ/'ºÕ›;|Õ¥èñ¡„±ž&I4A.ÐR5äz PÑ/º ÜÍŒÁÍŒ½¾îI… ­€£à2ãŒ4æÚÕÈ9úŸÉ‘C×vO:ïÖúm8ÒÛS‰šJ.žžÈ+«@ÌZ¨Î@"Úš‹¾'Lj$(=×h›çK =¡ˆãXer˜²âÕÍYׯÁå\Û¥J¼]õŸ,Gãizµj €µQ%PŸ{’ºæšËm+[·ð9ÀtM“lIud“:=«}Jè°ƒõ‘?å] íDcer«ÝHռĎ¥ PÁ•WªBss(B Ë!¿pÌtT"()ôÝžE×diTÕ)e€ÆA2ul4öJÒc$óœR[ÄÚÈ–Ã¥š’\óÔTó·×`´¤¨ýbJbò"€ß®Ü¨éϽ÷Óøºá«£¿Ñë{ﺭÇMh¬îÑ);m,UÅqë4ƒ_¯+𫆠òûœÐ»RDØÐ÷^)¬)1Ègu¢ÿøLDhïü§ŸþüëË0žŸžúÞkÉ»×&é—fNbçɳ·l@DžÑ[3Õ±À‘1fþ¶À½ Ñ{ºó‰Od&€løõâGÏðÞ{ºŒøóÉt=YÃL ê@/þé^.§Îc¾¾ŽÖ>|þ@5Ö:Ož_yrÌ#áÜw½% ² ®YCÞùçËÐ3;Žüÿz}úÇÇ¿ÿ2¸×áôØ?|ùï__Óvpñ·‹ÿôo_¾ýñ̃3#ÌÈîñŸ¿Yç^þ×ÿz|}|2ìÓÙüõüõeN½}rnàýÇŸýÉö'ûÒuÝCîÐÃüïϯ//î±7¾ëÿë볿8ÜǽúîÁPœ;CLΘGzèGæ‡ãÿ÷üíåõ¥ï>~~àÁu½]F‡ÓË^èg~8uÀày Ó­ë»ÓÉS?ا³=<½]F?xöDÎ3rnøÊÞYËL'0_^ý«£‡þÜY î Œ…·‡™ºŸQoº¾ë ={çÃD0ÆŽagfïü "ÇìÙÃÙOÔCàÉ#žpFæIüLÄì¼çe`/{ïgçÇqGÞ¢ßÿÛ?»Sz|˜ö0ù¥CÛDØÒ 9€$¼ŠÃ§s‹·A:vö\i›ÈßÀ±Ü$j¬«Ã3Ç7õMíïSÙg2…ûÚÓJ;‘ã¿Ã‘ÕùŽtuîƒ­²*™˜—@É·ºæ·‚¼Ì {¾×ïþd5…íï)?-PþE\¥T‡¶ßaaP9¸?ˆ‘¼é.Eæ©[ì˯×èN1@Þcjs{WÈÌ/Ñùw_U¬b©þ¤>™lŒëâ ÜʘwIÓYVnÚ(›%ë]û©å–æA„:3UõyQ”V(Óµ?Ì @[Z°F¢²ƒ,ÙQ¿”ü³±{ææ¬[x«…—FÒLB”Gô»ˆA+ë|Ú7ÚÿI_³Ç…X»)ÍËÛióÙ4&ë«‚S4 j.Üú²]f€ÅÔJÐŽioRæ(\¶”¨AP‚*ìÆ„8Í[“ó© og öÖp‚´ŸV#¸ê‚dŸ»‡ñ—<¤ë =C@ñ²×?0ˆÈçsG˜ˆèãó7òÃèÆñã‡üùçðüÜéôô@À0¼’1ÖšþÔ»Ñ=¿¼öµÆxçÀd@—×Ëé|²Ö2ûat§~šØj uÖ`š>ëK†Œ¡Î²'k»ñÄdæ¾YûtfyïÁðž ƒsÞ˜þñát²'2æe`oOÝ`ìÅ9àtzeâ‘NDýùl,âËóÅõ'oÍ‹÷èlo` OÝåùuýË·×§OÔáùÏWï‡Ç§GkÏ o¬¡×Ëé_þbóúÇW0»ÿü†®{ýv¡®{ürvŽý“?þ0:G<÷>=ØÎž~ÿH7>ý¹€ÿ cÎgïzûo¿zuÞ9ÐùéôçŸ/ÝÇý秇Sg<:{¶8ûñâèrqè`:c½5DŸŸˆì’§~ÆTgŸ¸–-BKNÑüó·ÑÓàùéß>u§ËËÐ=ôÆ3Yã/ãë_¯xìñåã·ÿø×ë·WýÅ}þÐ÷ÿüøÇÀçþÁø¯?û/çÓÅØÁùמÎ]ÇÎêNçgÏÝ0ŽÖÑ¥ë¾^¸»ŒƒÁH4<=²go¬!:=ñzyêì·×OÝëËpîÌÓç'xß¼Ž|î;Oô`-.ÃÛO 㘽cgé;\ü¹ï̹{õ¾ ì}gœgb èú‡îËCgÓYkÐYxY´`ñ‰ËJ²OGÊ-ëGòH@¾‘â,,Ý,È*¬GHd*YÅlTÁ‡8WmìJÉk-T¬7v&âž- 5vdA\¸™m…ÄV÷R’¸Þ±änöötO!æ‚`®E 8ÇH°¼ÛŒ=»1h*¯%?ÑzÑÓ À‚EMú)+D=2y×AâçƒÇYŠ@µ¥Hž &£¾?»T¨U‡º°*vÈø<@Ṵ̂Ðÿ¥ÎKYš•L3íç¼Öœ‡j‹ÉªãWZˆÓ^›þ+¯ÁWÊÉ5ܤÇ<Þ-s 3Ãs~ÂTWÁÚÜÃêƒÍÅñ+ÑÅòæõŽÿ΢ó{ [Ý'IÈ—õÍf˜fc°±Wª½tÍ“¹yY®{³EýNŒ®Ä2”½ßÕ•Ó„š£x»Ç¥¢iy^ŒüÆ…î{>“RæFøÅ”ýi^I±êÖ.­½2ÛC–U„ÔÿÜ~û ˜ËóÅ]fïGúøñãŸþåNƒ=õÆ€`Ü8tÖöÖ΢.ìÙñèaXçF°µ€ñ$êâ™áÝ…cLoí” zböÞ{ïÆÑ1›ÐÿÝÙSߣ'7ަëý0:Ç£ç‡Î2±'s:.¾¼zœzÓ±'âïÙvÝÙZGþÕ“õd FO޹7¸xþæ¨wl. ºÇ3,œ±ö„‡žúSgÞûîãÃ48×?ž^¿~£Wç?Úîd^ÿ|ûμ^úçsG~3ìºó 0ßÏÿýw¸l §ÏýùÌ4Éà|x0è:CÆþö:>ŸNg˜'öy˜Ï½øöõcèáDÆùÜ÷çþd»¾· ==3ùŽ=Lç_/}×™O'KL½10ÞX8ÏL†ÏóHØÎü0Ú®c‚z soÈ“±Öx¼zê³ÁË8t5Î_^éâüùÔ3ãé|6nt#ƒ½g6ŽG˜È;2õìŒ÷“Ðÿää&Ü>ì/;£ž4£—D0dÈ0³÷l`Àäœ÷ó?nBÿ½sìùó—ßA ïÂZkû®ë:{ê?}H&6ëDÝüËŒVÑYz3\=äמCk¦Yæo/ x•‡ÃÕ_~\%¶)nj€»eÆRºü€3=ô·ˆ”Úõ謹…ÐÈ”Ã9â¹Yë+Q[®ß€”¹®ª÷&-Aø{D¢uŠq “æ)ºGüôöx*º²†pã=\[ÇÍyëo’üÿ@_±‹ =vä3ïææîý¤¯Œ¼”Ð6¯{3 }‡BJ¹ûàjÔ‡={« p“1×É¡ˆ$6…†·Ôªßg+=¥ŸOtþ@´‚<åA±$P)Ùæó„n¸(÷3ºÜ,ä]7Ü:›£„vÞv‰GƲ«C†¢c ¡ý*±‡;˹q0iÿ×ΩÒU¡†û\éÛ¹Î,ÕuÉ$ÿ‘ÃlÀPl›ºïHŸ&_X}>v¬ó’]»bLåCµ-Wn¾L6Ùbc‚†ãÊ…‰}÷€t8Ú¼ÎZzG©Ëµ[*‹'h9ÏãF¾mmFÍq›pÕÜø#š3ëþŒ‰>üöÉÚoë^/ÎÞùÏ?þñ×_DD}g,Ü8°w¶ë apŽ˜»Îv#{ç±<ùqôSægŒñž kk'6€gÏžGbæŽÈvü4ê•`æ~%0¦3Àテ×Ë0:²†œ`¨ÃÈ`d3zO̧“a²à1‘gòc˜ƒ‰3œí‰aÍÙÚaº‡3ˆúSÏè¼ó >w}¥óÉXóôðàÇÑôöÁ˜Y·ä28 úðÐw†¿¾S?ÂZ˜§ýeݟϧSoNÿz~éN½ÀÑ7ϯdÎàx|½pGÄ~$× ÌÏŽ^ˆûxê@žx ë½ï:ÿò<žÏ“ÈÎCÏt2O¿ôÃøpî:÷ç‹ýxâÞÂvõ¯ÌÞÏs—É£éz&,s!xXödúŽ-"bŒŽÜxσwÆÏ ‰ÏO²|ÝàÜ™:kc½g ØEÖÇM[}tމ'ŽÈÔ 5¹{ Àž‰Áì=³g7Õüèýèœs~tÌüå÷€@0¶³¦³Æ0ÁÂvÝãçàPÌB°Ù À¦Íò<¢wô3ï 8.©p¸ZÀiKsüS?û?Ôe@<ï}è!ܽYXÝoÞS¹«…nƒe˜{ˆ ¾Æ»ã)§P3Ã7m!Ò&BЛ̬4äÖs¡#Ã'£À¶ £,Dî;ƒ¿E 7ë_*ÍÈQˆ(¦4ïL›ïµK0Q,”¨Ý=!IÁycCTU«*_ËÊr:ï´¼áW ±r¶Ö.õøÒêçèpªßØ`„›aôâÓ—'EqöÙ–F6ŒÚ ªÊ€5cJÛöïsŠ3)uÙô,R%úÇ—«J¥m¤ó̉„vñ‘¨Ze^½ÃUó‚ hišº&MV÷[E²bÁvðþ ja~ò’¥”OThïÄß:´%WË#_Þ3³Ÿ`½MþkðTæ6¾¶M=½¿§èüÞoω#)آǮ>¬<ðKDï4”…mä’=lO¸íöæBTŠÇV¿“ÝBJK3œ’€{’9&çökR©…9c:•KÒ ŽS‹(¹_)Ñq^¥Š®‚´½ÇRÍHý8­m,$€NP)CªRèg[³¸|Ðÿ‹…à𢘰Ðç+ø¿ ŸcéŠWªˆm\Ÿc¹ý¢Þ5i_><éc÷Ý1G= ”r#ÇnØ2-‚HDB.0áË«O èOs,D9w䢸¬ÍÆw݇Ka<ü9 Ij¥ìYH¢ G¡Ù14»êXNN»›žÞÒÌLBiu‹4 å·X+&€Äpl äh“S¬Ý4Ìä?xÂÇ¿þóË·çñ2zç¿|øô¯¿þ`¦®'cgöÞk ˆÙ³3k&és¿p"Í,Þ¹ë:c,LO4ºÑ³gâÎ`tlržÉÀ!‚_h¥Æ ;Ÿ1îr±äÉyò‘g2Lÿûo¿}¼8î¿|ðDnd{>Ï £±¶'þýá|!vÎ=³éÃÃÁYõýÈx5¸ 3' ²|ñ4Žè­³ÝàØ_†¾³=¸ó~\‡WÏûŽ úÎZÓ÷†ýï&É6½c"fµÄ<8ÏDÎóƒaÀxv`óp>ãÄ/¯¯Ìä<;³ø­5|2ă§‹çsozË ÏnôÞZã™.ÎÁãÔbâÑcàÙKÄÌnbxÇ~r…ðSkŒ_…Pç€ybÐ:ïÙ{xžÐÿÏŸóÎÍnÇk­é;ÛuÖÚ‡OOáøÌÒ»ÓøÞp†–Ì<üÇT "ÿÕ—#u–`Á2BâarÁÌ–NrU¶çµ¨F‰ðÚꄚ§Vxl‹H¶T¼s"eÔwG–òUòüŠè|t1“‹À_y¥:›+Û䳎@Ux­ %‘é0‡ð¨íµG=E.‘g!˜ÕÄ.¸`Zâ ®'c±¾MÈ„¯à)Y5%aô:§¾e/5&íòÃw±Œs½0o>Iâ, >¦RZ%·‡S‹¶šÜªTUÆPÇŒ®Ì[¢¬„i‘·ÿ'‡…F$^B?§² e”!³„qxÇñïÊ¿Ì5¨’”<ù¼¢“0?ÒøŸBGª„QS‰ púdÑfSPf“8Ãʇ“ÊæQ2VKEÊ‘TV’Y¹¶!)ƒ—Zã$'j˜«\Je-*¯u´+É’rmø«ËJh5Žv£È)n½ÒXYTI”TezÑwç»<•Ú(€³Íp-òG³H¨AÈwE x;ü”÷qÖÕE2WH‰ò€”ÓQ«¹APŒj7Ô}›>U!1¤:yUkÚ[ØÔfÙDçs¡U9pe”?|/F§:Ð\ªQƽ•Ò©*|W lª:,?F(I!Æ1³Aés6×1ãÊ«t?£èNÒPÎR³Wµ¼|û‹?ö< „ËÇžŽŽ³Ü•ÐÜÂÙ?´«©äØë.ŸÚ"*G„¤aæU»å¶»p-̇ :üëÝLoøøû—¯ægw¼óŸ?~úã¯?‰Ùö±†Œ%œó¯îÒwݤóî½c"t0Ìž@Æ<ážGǶ·Ö†À1LäÜhlb€,@€-Íž`òì­1ÎZ6&OÞ;g`:¢ÑË~R/þæüàùdÉ1Ðw`¦‘DÇDc,xôpÆLÀ7Ã ÌÆvd-1 —‘ˆÍpí¼'ö|ùóëÈ<ŽzÀZxǽí{¢¾£ÞzâñÛÅ|z°½}0ö2¸_ǯ—Ñy>÷ö={wöΣëä™32œûÊìûþqt~ôßþøf?<ýõ|¡‹.È{ÛçÇó7&vŽ:ÃÛõ úö<d:c— è< Ž_ ÌÔu]ç‰Éxç‰É³é ¬'O#ãÔ3ÁÛwðnôĽ1;X{Û“gÂÅyïÙ½òh ºÎç¼w0£ó–È;gŒ™6=ó„á{br‹øÔ”óLJþ˜œÓ¬ïïüçÏ¿yïÙ¹q™Éc{ÛŸúî|züüˆÈ‡l‹×¶_ÈÎÿuìÐRü6P›ôš˜?¬vQ[È߼РhcN,oö{Ñ.y7ÏK»‡ï5ËOSÃh}÷xùˆSÞ¥ [„¿5³ ñÿ.>AâøŽ%¼è]EIÝÍÚ±Ãl[¸ò&ì{·5K%ù"p“t­ŠÜ¼§:;Ñ»d$·ß2ßøŠ€%ßro‘\Ô Pžôï»Ó}m4’PÿðcÒ·bˆºæ¡åã¿YÏŽ[žB>ö àÛdÌ7c”s½–ÝÛÀh݇{G§´;ù €[¯Nü48ëbx¯–³ º4ÈÆímroö?ò†â"¡š ½#@nÆÿž¢ó{Ÿä® Gòäsº_¡YGݱ騜;u j¾Ó«;”Êr¼§k¥0Mh$L”üÁ^.yºlÑsÜ1´?IIoŒ Y ‚ÿR iç}ü©Y­¾íNåÄÑcùíc,h%ȮإüjÛÙ×ç µE²ßSÔyÒCj»f0ö_s›úçèÚ=äÉ*@É-¿eÇ€-uÒ5mb"Gr¸ÂÒ4}Ӣě÷„ç¿&æ¢ñ2xç>}øøÇ_2³íÙX3Á@7Ug=™Î0vÒœ¯“?ƒ"ƒˆÕÒþ<ýõaâòŒ'XB*n]Љ'ß„¼°éy¯AÛl=kuÕ{šhX{E¡(%$±Y¢„QOî[ ©7…í'DwJI ¾g\Ud«  kÛ-–]·í )ƒõ¾Ñª©• ¤e`jˆ¡~^Î-C2QUDô¿d„ŒúL&eÛéïYœÈš:ém¶Ê-Îd”Üv"QöÓ?oßÏ—éÐÜ‹~}â×2w”•߸RÍžÞÿ ‡ŠG– Ô…H«˜}/[77ºëÈ=Æ–ÂV=ý1S¼ªÈ ¯Vîjwõr¤ _>¿Í.% |ÓíÀ ¥¥xeüÄÑ/p«%¸õšþíD篌LŽF£\5‘iI•q¸k:<*çUÊTä1ž‚‰—Ç·l ¥ˆô"Ibú.É·&TQMØ!píâöò8êøAÏ@B“Ìeô9JvÊ×»Ü?²E…ÌŽ³]3AÛœÃ8 ñ$†²ÏX ‰%ã¹?V²µhK…°t?Å&ék ;bmLÀžÃ]Kο;3üI– -…Ð%l†\â‰âÞù\E7q¹j9I2ÞOK(tFn†iDr艮 —²F©Vc¡%^`¼‰§%ÔC ꜩGl„- a}ƒGÄúü)Vš¿3åƒVÄþãu/;'„•B€ãÉðj£oS÷Ti° s0»h•ºà|%abE…ùÃ?¾0ÀÄãep£ûøôÆ|}þjûžˆ Y2€' ÿ‘=3Œ™Â\cŒ#χÊã8zÓYKd;k`'*{g0zç<È£±Æx""xšºá=Û®/Žý¬0c%g± f·(òÍ ø ÏD£3§n]î 4 އñá—уÎ`=3wêûÎ ÎãHDÎ;gDÖZ8çÉœ;bºÎZÇìÙ½nšOrúçoƒsƒ pN'Ûóèñ<ºGïÆÑŒ%z~Ý«7n4OôðøødÉy6ÞÑéd­eŒdí·—ñDð¯¯Ö ?÷ÄÞ9†5.£™:k „ÎÀZr0žŒ'fk¬÷d˜ ˆ:k»Î:ðå2Xk-&¡göÃȰÝèœgoaNöK£óÄ~tlA½íÁ³gO´àøÌð£·ÌntìyÝ´>XÎz<{fþíËïã03í`Óuvú¿¾{úò‰@ä(`ePMÀ '1FÛó³6«­" Ê9[9Ú¡lŽHÐ=˜œ¥3x‘kÖìgyY< !èIg`7'Ø®C‡k„çU²Ù “þ5°UQ› ºGH’¢Ú¿E숳žz.@uÈÅ„ Ùê›G{ˆx)íIô88øö9*NãÕ±1ºšë6>~È£D*'9?åD1BoƒàÊ2$±Jx˜¼¨%Š_M>­e‹&Ï?ý„c%@±ß§ˆØÊ‰DI´ç^’•ÕMŸ9æ–›i Æcxdb®èy”{¯ÂüPwcIVˆå2±ÌLá%æŸSFT¥a¶póݨHÊjˆ„ViT½ÙŽvÐÖJ‰,‰ÍeT)NÝB:©«ä™l,â‘dÙ9âˆ*4 E$˜“/åØ%‹X{ ¢¼Yž#ŸFñü Èö#T²xù‹²ÆÑM¯¦KÝÕ(÷W†6ÁA’wV*ªìpÂ饬ñ.‘t ‚^ið@¨©FãJ\Ln#V¥üJ²oÏ•¯Q*³ꬤh+|ªªÞt2 ‡êÞ$iN¹},*¦`j b @ݸÜÀj}$ÚG*­3cl<Ä'ŽbÜ›”)$GõD›§m_s”²]Áq­‹ëòŒá JºjP¿˜’e+˜µ¿èüÞ•UÃòÝÛ†)™Tšey:¶ÆM÷¨a\¯*y“×1@RmP\f92V'Á¢vËÎ92ÇÏåõ§Âׯb‹ÖöøÊò«í0°q‚Bª©Æz-~›kmEäPˆ“Î ±Ì5%æí©ÚcErÒkLj¤ù'T±í7 ¹ÞE5RóÉ¢åÛϸ†š”4Pà†#ÌXŽø#)6ïn7óÛ½—º>~Õß@·§[³Dÿx ½?üöyÊöÆËÀ£cï?<<ýõü™»~šî;÷ÎýŸ¢ ?)í,Ÿí™<ù1 Àƒóã0œO'ò4Ž#¬1Ó…"7^Æ ÓèˆÎ'bÏnÿá½'wÎL€¡qäÑ{fê ,ã2º×—‹1–ÆQ<#çùÔ&vÞ{懮ÏpÖö—a¨³Ö{×u–î­œ#¦®ëœs“N‘e'"òÎýõj€îtâ‡n|¡ç‹ëûîÑ»h0< ž p]OÄŸ:ºx~yåÏ£s§Gc˜.Þký8v~„÷§ÇóåùBÎðè©·¯Ï{"Ó[ÛÙqpntÔuž¸{8u}ï›f+ž‰½1lg/ÌÄv„¹|½¼öž¬÷¶³ä¹;udìó8bzkzÓ 3Qg Á8v—Á[0‘wîÕy"æi’3û¹&äsžÝ8.*?óÄ#RÄÿ÷'À;78ç·óh_cˆŒ±æñÓLûÓ»io¬ÈŸÄn´ŸéŒXWˆ €ÊA%R©µA™5^jWðS¾¼I.9JªYëeØ%©ùëyNVq3!âÆórý}¥ªÆžÏÛÖK‘ER *ç~”µŠ=tª§7ræëÛp•ØÅ¸‘úP9µŠ”¸eÑ<†k9ªùa,.bHÏl’uãa»ÍÆkPS8˜Û¾ÖQ´‹tš1Ó ûX†þ.àVeAÛs§°^W±¢”î²áÜ@¿X€î¢J®!‹µÕKYs[1§Qo,] £¨ŒpÄ2ç_=Ñ»­åQ Ï? ŽèIsµwÐî[1òjˆb·Û2Ü`N±¬~©¼û†=jú_Oá‘”T‡*˜áqà0Þä“7ñÈ*hVÚµ-S|J@–t%[Ñùë-^Ó•vaëÛ¸'¶ëՌb·§rÝXc¬xÛ^—_3ï'Ø£ý®¹¶» åê{/FQ[ÍãMeo®í3œ}Þ‘¦¡ì¾Ô‘öaMÕ§® þAÁÛF×nxÏå6 šæÀm×Hk”ï¿…H³LŸ‹$¹WÜ#X "â¿6—;¼\Ü0xç?œŸþzùJ̦³Æ˜YŒÅÌýDÓõøqdÀXc-yïü8Ú¾÷ÞÀÞÃÚÑùÙ¦OÊþÆ‘ÈÖ Ã@3ÇÀOºñè¬!ÈŽä˜ht®ƒ5†ì蜻8×Ï#GÝ8vç“5†™|ÏÆ˜³í‰` @f$gÈØSçÇDÖàÕ{cÌÉâ≘¼ç¼sL†,³s®ë ½:Ï0Œ=b†÷þ‹y&Â8†âÇ4èÖY˽íDZ·üò2b=“'ƒ§Ç§ÎpÇlñÀÖÀwöõr<-.—±ïÍé|º¼^F¢þÜOd:ë‰<3,yÏìÝàxFçýHÔ÷³gfòfx½¸‹Ãh†q ®`{kŒa°ˆ|×™inóÈÎ1ŸÍÝÇÜÛ“÷ãRù={&·¤æý`þýŸÿS×÷ކŒ±ÄäF×9Ç "îûîüáq*‘gš\ù´å<Á³Ž¹,± *pÕºqü7+2y½µàÒÙ_ÛPÃ[µpo¼“Ýÿ®Xjéês «¬ ZF’sÞäïTG" µFŠ+1b¨hÅVöUºb9 ;Ò€ù^]BwïÐÒ¤:™Ĥ¥°ExÌ7éÕ*Â(o¥½#Oär@´Òk>ŒÅAn7Á Ú·q‚ãÜ)Œ;+ߺ齯¡oÚ .@IzDÿ~]_UÎqãc1»˜Þ¼­ó]vH›½‡rý  ÛÃî UçÈNßå«ÒPÿ÷ÉÞëßÕ;_,\ ŒÞÍõãXL¢ºé]­·º‘–ªÕßYtþVaÒ5×_¦¤äúV’P•I‰×ñZ슷˜‚Ò«SÓ"¡ÑÏqÔ ¥Ë„){DÌì=3{æE †eË6ÅmØ9ST“_ŒVné,È:~Úeç#-m ¨` ¦.X¡+cé?D,%(zS^2èŒòYö%G%:b’1ÂÚE&'g¢•‹¼®G¼U5«,´›ÿIZF°,â­RóyΑ@6IBÿa[¤Í‡i%Ùo!}_d³±rERÖ¯O,ù+fË)c 3»D%>®Žp&ÊP°_Ä!æ±¶Jé0>¯mViI!ô¨j¯ë¬º\j†¢Ý&ÞÓ!8&‚Š‹ÍŒeìé(ìÊCVóªW¼š=ÞdzaްiiX érËð=~úðøùã_ÿã_¯_iç܇‡§¿¾þe:k¬1Ö;• ¦Ægpa*«ôÖ8ÏŽæCk  — c¬afc­÷ž™­í ï­½›Þ,ŒsÎôÝô‡ÑûÞZk,ˆŒ1DžÙx8º®³npèüh=1`tž‰,¨#c¬%çŒ5Þ±sÎÌ 1¬õÃxGý\ ð“`ŒDŽâѹóó÷LžÙZX Û]Ø¿:úÀŽáÙvž=Ñxq½ŽOÎ0Üþåϯl wf r¼7Æðùód :`|y%ÛÀ‹çáùâ™Î'1£¼§Þöža<žGÏXØžvœéáiªìÑud {ÀZφ¦jÊɘ×q¼ï-Œ'çGb&ïi ?†1Î9f&Ü0²óÞùY °Ö˜ÎþÏÿüïöáôôûg`šþ ï™Î2“ïDž={çœcOä½ãžD8¦* ‰Š¶(ææÄÕeJZ¼Ý«6iôõèˆrH°,*ˆï‘Ç*¹>™qð*É\E—¨C±â¼G¢gIZR¡Óf²Bß§7Ï©b.:©zýøêÓÐEê!ÎôÀ¨F¢ÿérÝVYxG©Ái{¹›K|‡T*Élf`*¢2‡­š)ÍÄíiqý\.«¥%‹M˜H!WXëÚó2Êm“´.ÊahÛ¡ªèQL“Ÿ$Z1SDð!—µExâéT°ul§A×ü¬ǰËóH¤«—i:±—‡TÖºÄm5+ôI ¹¯/QsX“ì(n³A…›\$kä\!ˆd¾èüàU6/œãôª‚:P¢ß:½ƒ×[ÎD8½5$®ÆJ‘k‰‚cñj„Å»*û6J¦GNqÛVwÙv$Û".$¬µü-Ä(ñ±KF·ÌÑa^X ý'5E/ѳ´ÑEä¸,Gt&ã-Ä2ÎÅ‚§íH ¦A¨duI-}µíðM˘wU÷¦hj¤Ð•ÈdÓÚÞ$´<,ܸY+)å;íZhñJ˜LÎiÊT¢8JZƒðBqD…SJÛL£^QûÈ¥–z¨8£j“ƒ¢–ÿƒ÷¯p@¥å/"Ð;Ñå=4”[ÝF|³®3SÂI%´³<4NúÄ“É:ÛJe-Ð<ª/M¢JðÒÄRÑO':¯^d>mbV´ÕOSÿÌmÇØ–Å˧’¤ñI†½imøæ(ÝC>CÿÆh¦Ù{Cð>ÒlYaÛ@YÌ6 …žÛ8D˜+1\uk̦¼0.ˆd‰f¢8ÌIs_H83±ª4Ó£²Áß±YåÊÕ ·‚X„vnýÊ_ñýâ48'š\™* €Êc啾$úYg¬ ·ÎâÚ£T°[Ú ñK«: 1î¶ë»6N­Á*€ëúõç]ä†z/ÀÜÕ1\=MψcñΠ &bÿñŸ™˜¿2_ïÜÓã£1†_Ÿ¿NeXcŒ1ÖBçˆ`Œ±–ÙñèØN¬"ïÁÞË ið¬G Õ]ö]ga ]{ï=[ †ÁÆ[B7¡Ììˆ`:C¯ÖvÆâ¾³yçØÙ×ç×soû‡Óà¼5`æË00£÷ÆZCD„©ˆáœë¬5Özf¦‘ȸy™ޱf*8ïApž x}yµŒžmçAda÷ç홓óôj:~²tê{çù~ô†édìÅy^Æ'L«åÙÚӇÇÎZ&îÎÞÃ޽ãÎóä½7oÀÎ[k :Ó¹q0"gØþu잺ÎZv̆hpÞdÀ`ï'òÞ{À ò<ÕÙ™‰Éy?8^"üO¿ý[ÿp>=>|øÇXÀaêá7ÆL#_<{k ˆ¼wA÷…<38 ñ´ý‘³:?Ž+.“8Ó&i‘)áH d»Ô*.Ÿó Ü*^^,É ÛFª¨ÝQdAL`íä/XŽ…^9·W\€á¶Üz:–öVT¼¦qsC1ÎK­uÉ££ÎTÙ90‘[~‰Y ¨Ú¯às´+R@½K‘7]3o„·ªÊÍ €µ¥$’ªgÙœ#û6VaIÀ›òä˜0WŽ#ÊÝ9 a_mÔºi{ry\ÓòDŒÜÓÿCÌ0$ºŠîöâl ·%Ÿ5í×­M'ó(Dc#É{ ±ø.Êë D€µÆu“vcæ"ŸìYRg̈j4rÊRxÅ´JŽÎ*Ý/‡¨’*U+!/¡h:{Œ[-©~Ä6Æ´ÜÆßç…f¡@l{ÄÚôÞ¤ÊOJcÕª^nÉÜe³šŽ!B=Âän䘥ûKœ%%á´X;ßÑw•Ê›>K³1t¢gó³Úd´Ë.ÕgMïÚíO©€þ#`’S–´Òg9t$s%ˆ§ÝzS5HºâîKÀñßGt~×õ·W&ªKÆoæ$~8½ îš_^kS\êÃ’xàEó ¿?Ü•FäJLáïðBR øõDîóùº¦™!mwÖ#¾ ²[=¾—mi‰]nà!xrŒÐ2™¼JDoùãÇß>ôú ãe`Ïì<ƒÏSçà·—c­éŒ±˜L÷$ ä=æ°‰Ù9ê&í~ÓMÝ—$4Ò½'¢ÎšGgf@ì½YPacAl/㈥­ÓM-íeæñõâwz<_ž_º®3Þ™®ïœ<³1£ë¬óÞyß;Í âÎvã8uªûÑ9ú¾s—‹'ô0“ä¬!rž'V³'‚Îá|>=Xï}OÆ[óâÝH~GG|†yì,`£óƒq®ëûoß^<ó·¿¾kNO¶³Ó(FöðÄtGçÜør¼'O—Ëè˜-f™þqôÖX†™ Ìä½7¶ƒµ'‹yƒAwêÇË7 µÔ[Cdæ¾â‘Gï‡Ñ;OìAäãØ™‰ 0oè7œÑÓwæÔwçSw:Ùs÷á·Ïa.­uÒ PØ;ïœ÷lð@‹Ü`0«m¯ ¾bÞâ¨ã$÷4v=ˆt3ö–Áˆí:ËÚD ^^má¶Ë=Jr_Ò‘¤ðÓ:Ýýc¥¡ò »ÜÄÞQo?å,#pÄ\RqêÎ0]é§-¢RWÅ3·)4ž¸ì´Á¯Ð({‹ Xºh8«Ï¦ npæ·DášÂ¥›>ö7>gâNLBS¯­,I„kv'YêLÌù9mø Ê층Ÿ5EËXŽkpÌtÿ…»ü pÙüë²áJÐwT~ÿéEçï–ßx1}p· ¡¶q2‡fmßENõX©ÆåW2ÜVæé«yöTw›Ô¦Qƒ B¥¶™§¾qÄŠjÅd¨ìqpèvóO7…`•Â(¦”žHëê­©@Pä·J1h8JˆKñöì«2êzºRBU=«™S,¦•.~/o×O˜‰âá²B}bJÇõ$¹€(s2͘9;s\3rlôıﰊ<¢\qá,úqû‹hJ—Ûs¦"ñK¬\iŸ”Zð‡öÊïzW3N”Ц€Kª3 ˜¤ÔJ4Ÿb,»uN}¢Ç¸ô. †¤ž°zŒWozåh]¥¬A%a¥\I@Ý ¿ ô¼‰GQ@†"ÿõáË'3^?Žãà¼s“ôDýˆ¾=?O5€Y ˆÍ<@°û½÷–ØÃbس7˜:àá½· v¼ì?wŸO·é½1`ïXLíæDóèZ²çýÀ`kMgO§Þ;ן»î|"ïAd œŸä ØÈcÀlا‘¾“ÝOëÆqšNìÙ³§®³ ffkŒgæÑ{ÏÜ[CÆyf ˜ôê``É’½½{t£éÏŽðõÕ£ï .ð̶뺇ÞvÝ$ÊduñÌ3xÆÁw}ç'φÙZcºŽ<{Ï<:kÍ0x€íùäﻎÎyï= ƒ†Óã¹{un.ϯtê ˆƒñ“ˆÿ88ç=;OÞO©7S» ¬ù½èÎ'Ó÷¦ï``;kN§¿}¢µÏxr̼³­îXûMXŠëfvÓG˜Õ ¸Èd1Eÿ!ÿRK¯8ðW¤rqg0;_‡•ùžÈTW:Áz`eµ0:Y°Žm¯ÇH´Z‚Ø•³fÞ£C*º“Ô\žóH#Ôáâx&¨z¬qB°xù€œäž#3ÅɼååB—`Åjª 8Sð“kw”ŒdóEL,ˆ·Mäoɲ™ àS’ª¹.ñ¯‘£Y¥;MŽ’y9¼ 攓ÎÙ„ižª<ñFsS#r]QºOˆÊ}ú1®œË§0Š ëlzæ"¶ÑÍ<əͰ¶/:qsêV#“~Ýî/«ˆ3ä‚–ì]Mh9Ã}£ø?¶Ñ*ìs\âYUú?V7Z4\Ö, <_$јÁ*Á‘ºÉe_“ÎP*¡}pJÂÈ,$Z;lάMôùœ¤.\\â’(ÄfίPÍin„Äf˜`#6D>^Ú‚“⚥6T0´PîÏî˜C຋¤Î sáªi K™_YIãVí¯òcÏe"A·JÎuóºVÔð@IûÜÉÏ™bFv/P•ß²‡¦€e){£ ¼Ð³ŠÆS{˜ÈMYq2ß8É“–7P¬zXë‹w;èìí×­^ÝMÀÚ31k@xBrÞHWí§$oyï­µôëõëõó¿îËÀ¼mÉúاÁ´(±öLDžüFR ŽaÈZw¥_{øüažÿøê‡Á]FïÜ$àÃÞ?ÑÃ_/߸÷Æomê𪠌ndçŒéˆà¼g?ú‘¼ç©éuœçIžˆ¼sòb˜iô¾3€™±šIǘˆlgÎæ4ý'@11EÇÃ13“í¬1Ý0 ¶0 Ð0zrÎy¡Ñ±ƒ1DÆZ?:õvt@ãåryyefCæõå•=“côf´ÖÌ:8Î8ñÄÎu]7™\0νוּ†˜{Ф% kJD q­…y艈œ÷ÎÛ¾Ñ8ŒÆ1ºÃ8‚itCgý„âÓ æ0ýè à‡ÑO2K£cï'ÄÆÚß>|´}gzûôåÃ{`?-$Õ€D]ƒy. Ä-»<_—wˤfsžˆ `;ë™2†ˆÙ{oŒéºÎ{?¹öÞ]?Œ¦ï–†[¶½9=>’±#ç ùÁ3¼§Ñ9Ø®›ðqƒ`öÌžçÎÀ˜ÙEœ`K§rcºÙŠo™† ‘F&ržypƒg&ÇцGÇÞ“¾líÉXÓ÷Üuݹ;OÝùôøù!:6€ìÒòo“VYš%gÆ-­µ˜•$©‹ƒÒ„MÇgTZ­•3ÍA°GN㎦ª' g%<Á–®óÙ±ü ƒ»â~ƼÕ>kÇñèp^¯…5b²ª®&Õ8äà†e竆!7«3‚ÌÚ•6«6éâcjÊÆ¤_)5 ßÂUi̹ЕJWÌLÛrvá1oaµ¶¼=ذҤ zë·Jª­0s›e=‘ìFiJ—uà|Y7Å4õ˜!÷J\æû_“ÆèAÚš+¬xâ®,!ùDã©›f‰È­#fl4þ''§rßö•÷IÊåVE¥Þ×^ˆ>ØIAB“Z„ýžu¼@Óȧ€Æ—-Ÿž` ÅÌHØû˜‚-—°Ä^š/[òLÂlU3™ _½®Ti¶Í+‰ýÔwªj •À$ì»t+Ç#¾!WõeG"«·8yÉ&:gÇ׆¬’IY#pNä.Ž\.Hð¥W¤¡†kÐËE061óÆyª%"Ne?¨ÊŸuwõÚÂ6.ûD¹FAç@*»wJ$ß*â¤ÒX5G¬°­÷Ë6n¤Ý%C²¢Ž[µêwÇXë’ ù{’žu«ëwªž®,¢h90Y´°C€­%>¬péênºŒÅ$›Œ:ÃT·ÿZ'7üÄ¢ól‹`qbUãajÔ\‘šåç‚8µõ‡w†Õ•æ"ŠßÇucÖéŽåQXdðrÀÿWÚm d/”(nZQDiB)!¡ÿÅoP¡a$óµýG+Œ^$.Õ3¥ìêY^S Žè›uñî‰q׳©ø"ÖÂKkF–çÚ M/8ÄØ+•Sèÿ5ã‡,-~O„yX³D™.Š@ƒ_ÉuØ÷X(d#®¦¨àã7Ê«`J®˜‹x¥Eo!Š©ì$ã¬Â~‚lNÞÀi}/í‡F&õGjþ'0ÈuÑÆÍPq uº\ý_Sheer"8‡5k7Æk¬ÎNF>D„ÇÏŸ¦´åëþùúüâ.£÷žAŸ?~™>ÊO]ýÎOå–o—×eºû¤D3¢3‹]HD`¹ŒD»TQei—Ì H´§y³µóÕ˜i\O“‡­™/Ã9Êœ†¬¥‡SwêMgÉóðz7öÔYã÷“ªÛžœëA½`˜Ý8øp;ÓetÖ`f(ÌÇ`Bêœ÷AoVÑböÌìgfÿ:x‚󎘽g&8çLž@4z×°Æô½5ŸN¶ïûSgN=[<~þ`ûμJg‚B1Å,Ž5<·Uញ@ÞcÁrCö 0Ù„‡‚š&§´G\Âï·0.Â:!€%ƒXmCy›ñXëgåí²b¯%€Ø¨Ï£‘ % ªˆ0‰ª’÷q4‰$¬('½Ë¡U:÷_äõe25Ø j#ór©âËÿgƒ@ôŽ”Y;ŽÖ’j|↑p&NV{íQÊMœ< ñ/©$˜šÕd¯3¢xVSÊm¸=z¬$äõ>ÁJ^)Š‚ ²Ÿïº­]/v :¬VR¶9X+-«á)jµr g“¨];Ž™ƒSÈ O_EGÄZ•¨ðQ vÌ…“%ÂÃB ïY 0ÖÆ XÛ+34"™¨(Óº˼ 0&éNkÜ¥šMŽ—ª›-³+¸uo²ª¸’ã²ú”ˆJE­òpÓùäpÔ§ @·º\/6ìÅdê¿õ“‰Î杖œri3«Æ–«"¥¼SxîzPþp!äµÃÚB,¦»ÓUEu™Å¹ üÙÜwÿã‘dâV¯÷Aóa*(:áæ{ç×ë{¿q=Ð/~äFhÃx™¸ LeZ]^àӥ鼄·"2´qxÁøðûgX3¼^Ü0úÑ…ÎÀL/{ï==öó wd9™1³uò dÃDì™ ädoùºkŸù"+ Ia`š© 1EfcšjšÃZ&á!ï|à Ð<Á˜‰xúá,]ÀNI>u瞈,Ð{Ç0žš'–Æ9u¬;·r¡à“‘òÓCp“Ò ‹ó$ëÄÞ{ïýè½sS`Øyô<]§1øÔ=5ž™p:ºsg»¾ëû¿}œ&+Ó: —Ð-–¼¤ç˜É%]é! _€'IÿòÄŒuÂöÛŸ¨"0Ü脊L™´«ú«¸÷°¯‡HüÉ來Øýæ‹õvßHisÃ{ö’a@ÓÚ/®€‘FÈœ½ÔÞ#ÁØîky³Póròö<¬'ˆQ9ˆwÍ¥ zŠ¥½¸ÕœŒð?­#ž–Ĥ’þî¹7š«¶÷Ã(þ¡ü»ÉšßCÚ~Ã}Ž·ºHÌËUIî;Ï: tø;Æcq“ÐÁçüÎMÇ-:ÿÓÃe7‰®±òbJr¢èªRµ--X  œoçHnhƒêñïvTö'°A `æ«0Ү·PKg9¹)OGÓ‡®]Rü’¸î¿|äû6hq/â‚êmòñÕ$Uƒ¥ Ó϶2ÿ­z².@NxW”³½ä€‰iGn½±˜Ñ\uá€ÚF1åÞ®­,ÖË„ÎlSÜm¯§Ï ôüÇW7ŽbpOSjÇË€ÑOŒÍ"O©«Yû–Ö*;O£z3q4?Sšíã4m˜‚+ˆðç_Ì…°Ï®À<^@¦Y¾æ´×¢ÏŠFD¯0~±«SA!\Ë ‚±Ììܤöb/ðöSdêúwnAÿ½wnmR À ÏçGoÌùÜ£ï Ì$çÓûÇO˜ À›$*±¦QÉb|¦>´2¢óxj´|¢^n«Íh››™ ÿµÖ™¸àL°LNÎ? vJâªÎ äÖAÍDɳÒI†þ983O5KJ{Tbˆv]%¨Fbò¶*ôep4‹½U­îèVü•zn¶*êžô¶ØßÄ|ZÕ„3¦mìü#Š#eŒþðš>“ˆ¼x©A7LéKJA«&ã½ä†×v Š>‰ò©«ñ)xÉÀè&Ò•ßbPY(ß-¹Ô@$’)·ýÕ ÓØ®Û¾c×J2tU­…èèÜK¹ÅT+‰†S‘ aÅSYgÇV—YÑÓŒ‡‰Šßâµâ¾¶!`ë´j£.âÌ–^Úz¨¹IÓ©·ñêrdÜw [2_[Yþé#øVödo~åhó tR–¬k:GÇ÷V-Ÿ±:hˆì™ÊŸ_Û·ë/ÞÖÓ¡0í9ýZuÓR¬µR:SoS$SSàt/á*Ó"‰Î]£~TgWeâJ½ù[º¡Þ¢:£Ä´Fúæén˜èk@û>¶Ä·(é@Þ«½&æ¬ØŸw':߬–®üÀ°ßMd›÷‹o«î¬ýW¾<(¿.Œ@WviBoŠtD)bÐv”ÑêŠ-tÓ ƒ'ÈB¬3~ûÔRååKtÎI IÌkEø ,³ø§ ¡™=Ü ƒÙdsÓ\¾͸rO3?ÌAsÀÀ0_™©ÌkT´›5Ú°êÄ{ZÛy‰gqŒ1~I, ÀER”¼–@¸‘#¸•ý‚ŠÈ7ËÊÑ."5íçÊ]¤oƒ’ãË®žy‚BΜ$·ÊÔŽj馂êÎKÍ ƒ£‚G ®‘è5/ñf¤ÚYµY8C÷¸}ÉŠï‡Ìµc¡¨5ßÍq5ym&–DCDf}¨_øôÇÏÖ»›°zÏÌüí¿¦Â †r$#áŸÄᎠm0ˆnôa¤-¯ŒšÄgˆøÃÓGày©“ñ_/ß&i{3 ÜÇÅ€ žø¬÷oþpýPmÎåEl™=#€wfõ~z`ÆLꞺéé:ï=û¥0auì¼÷èïÙ{vscý§ó“=u¶ïlסŒúîñÓ‡u>CÒˆ‰]ÏÈê¦_•°b·³§Æ¢V ô?Õ˜#rµp5‘R‚.¹Ò™,~nU3 !êù•)CR±ˆ¦®h 1/ªe¼âó‘¢JÁËÎl‰æŸýgŠö ÿI‹7W™¹5õ¯ùLtx‚¢¦”šĬɞjwL¾ets¤Þà®j²Z÷OÒþ’ëŠ)§9f#ˆ ØOˆ‡Ø:|Š môUèâü„¤ª¢*BQbpqÔC1¼ÓaÐd?«møIK„ Ýr|æ{UH3 ³Fjçes¡ O&bÖRJ”qÐçÉ#™uÔš°ˆo–0»ŠÅ e8Tqý£=#DÉê )i⊥°³‘ÃÚKªÅz±<]Ý &±B p |W”GÕêl´NjXØ$£”&ÌWæM QÝ~õsTº°w%:_Q •Sê;\x7 TO„eµ<~ëw}É䚪’\Íßl’’ Òæbeñ¤w•ýzµ-zd&nY×ãúqMUŒœnÈøÁ‰8 µ¢$U‚ruªÑ[·õ,(>ì÷,,³6Oè{ÒÛZ Uâ Øš†E¢ªÕÚÖdw­Í08Ý•,£ÛhdÛã§œõf#/Ñ-®þd„ÀìóŸ_ýèüR=œjÎ97:vn®"?•èÃÃZþ|þ+/ì}hŽ\‹5,¿ÉÄïE»¡ õÞõÆð­_¡¬ÿW2B1 $t—™´å¸¦@c´×-âØý.¸jš‹/í¢EÞ ç¨Ï+¾>ÜODV}­S¹Í š.É"§µ`\fü¤ €ª% #Ž*•g߀Ûa»Ý ¡„Б!y3ï.£ŠÚJøÐþðB^öcÚ¡r|¿KŠqÞu^v‰ƒ—f¥Þ/«R÷ ÁkŽØõÇÿÈ|£«5'Ðÿ÷رIi ‡ïäX|õ–zM?˜è|Ûï¶0cnÅØÄ|n½óW·ãÁaý;%âI:¾*6yAÚLtk‹Aò-:iÛw¨VÖ–Ø%€x¾J=ÿÒ'¾0å˜~Yþle¤‹,q¨¨…{XÉKŽWpÿX×{,¶~ÌuãU¸n.L¥Þ#gtJ”²ñCÁ(nRˆÚ®¶ÆÞG ×èŒkͶy'à7à*jUÞ˜š”vîd„’Í;<-ˆˆ¦VwNsQzþ㫟Çá{çýè¦)ÄASåÃÓÇYÈšý׿`Ö)oi&èÿ‰;&úê.ñ9cfþøðAfRð1ÖtÖž:c­íìçkw›©?áóŠXÎ."(Ya9D`DoçJPôÚ>Æ¢FÑKïÆ¼?‹¼‚ ¹kˆ¤ì*ºü3íAj‘4àBùöpò¶Å˜N,«ÙLØø®+(½ðÈ×Úó‘t¾«R‚¦4 ÌȦ©£õ3w&Ô0Æ-GL>~—1ð^N¦DÿG2’2À=~eÓæÝñõ˜dúC,ƒ ·Yñºƒ-ª‡œ ‚Õ ¹³—ñŒ¹×®k©kÝ ÝÅšpFÃÖ½] ÅÐ ±;³îqqX*!E K¼ÁêÞºeÞ(Bb;øÚ°1Rµåí7W¶M}cK×H»èA{ð©gY€!kA›÷x+³£’no…ûTÒäç…ÛîfŽÍëŒa¹JÆä†(Ò^D¸Òèë¡à½w¬ZþÎÒŒÙÃ=)F^¹¿G;וŸ_zDõ´ñ¨–‹Ê˜øè'Ýö]s¾ò^šݦ1µ#ïJtž¶ú6›c*”Üú†c« ‘Òœ§Å‡ ³+Wá&ƒ¸6cøð¾¶2\¹ æ~bNä{™¨'úµq‡ÈºÀÕ01·ûî&3Ø©²êMÕÔ2m¼¼…kQlqõIdû”¹Ø!y­ Jø€Ë„Kpó,ÿ¯‘Ö³\E‚ D²òï‘ãUåEŠ5¢Ò§?÷ª˜ÈOoRr »ÑJ¦Ey²š¥‚}dåÆ9Ö±‘Û Ú-ÐUµ ×¼nñ¸U/Îbh©ª>n. µõ5s5,’Q«ñàÐt¼ÏÂ*¼û-±‚¼©Ó¡ªÜ´°ñÌÒ.‰l­€Ó¹ÚŒhR”Å 1XYÔ­¸þü]¹Ð<«à4‘á8ÚcȾËl ¢ðzþã«wžÙ³óãà¼sÓÞõìÉó‡…8¾'fò4MÜeÇä=Çsq-Ô§a)Ä;óYÒG*È›ùÄØiÈ1ƒè㹟ÏW² 0]×u}g:ÛõöéóG¿Ê+5DÅá¨!%pƳ$’™éº„YA‰S-)Lö‘¡xù\Ï{Z)MÈ‘gäYõ$‹‚*”I4-ßYpN@ÈU#©€H%ÚIH*hS  ¨3(ÔÓì窄ºªLÉj«lqx¼A@QœN½:QÐÖkVÿzPo”è*JxI¢6›Sžs{(ùGÛ©“.÷ ñóƒŠGàr»@Dnù+"r9œƒÂ[Ê9ÓŸ àsô'€¥9@õŒëéw©™ï} NÂ|qp|ì°j „kÑ(]^8È’8ÆŠ¡I-j b1 žÉÅ3›àtêQkëïz¯û^!=pÁ Fùø„­W®þf˜­‰Ã b¿hÕ—ƒv`Ös~;ÖÜ.»—úr"DŠ@)ªSÁ4J^THnè±¢¦¶Šrˆ§dÑ™F, "¡Â‰kJöŠ—­˜$º‰ô‡¨,'§ŒËŒ’[È3Ð$Ò¾…MSÒ«¼U޳°7ìnq† Á°£œ‘Ôš«ªo(Ýojµ’T¡PßhÙ'yÖ\.$F%yOØh!'ኀu¾ÖÙé ¡Tš,MiX‹bµdiG#2 Xj’ˆÕÊ5¡Mð´ÄAOªÜ ÛCÚ¶©ÈÖ뱂Ìv°VAú bE S)h.³Ï˜U6}ëf`¹iÁ~&ÑùJi¤´ˆ-@õ‡_zÂaHÐ :¡ ^»¾6ó–•!.[ûúënx XÌ3 ÅÑp°“¯•=ú£3ô‚z8'Z˜¸ÄÚ,î_8 Ž@%8X„;â*PíbHT)AA%ˆªôîzÌxç!T¼BuÏÅÁÇ¡¯•¾÷ÖŠ¥ÉÀ>¨˜¾Ý©ºŽGIàhŒÙÍìæÍˆ„£zic=rS@1–†æÈÎE=à‰´.XuçdˆóÔH9 ÷†‰"ç®vÓœáñóSøáËŸ_Ý蘽wÞ Ž½ó> !^„p Á0ØPžçÆ%‰ŽH*Ï "2ñ(€ë›éf™úúI(åƒ Lê¿|X%ŽW1Ðé+ÓÕ”þp^pÐÍŽêÙ–Ì #&ÃLHÌZŠ˜@dBÍÁ¬æÕ,ßÉGÊp–ýf¡ø·HP|QÁx§Ë  à³¶š»/AíµŠõwšª jo èßàÙ"¯Þí ‘¯¹» ¾L(©äˆÆ7šU2‡V“åƒP0÷¸µ¶Eùª€6€x T j2tGɯ\Ìͤ¥‚òÄQ¿öªŒqøªÕdÑJ¦0Áƙ٤w4šâ’‘E‚kµ€4åò0kcÜöðæ³4îôª^ëþ´|tظjí=‹:"ySX×y.¹¸”Yk)«ãªÕ/åkõÊýÛè¸Ò;cìªu¶)~7@YÝ]@ë{1è]ŠÎÓ~øþØUÕgíü _‡!î®Ä3eS{·lñÚE&ô $)7ØúDš25?„îÒ^T…6ã¡Uþ›„ئh³fÊæeîˆ|’¥|²Ùa™æŒXùþ†é¸á«ÂÓ¼3úk¼#ªK#ù\¡Lc_nèWZ‡‹(Û1Ì(B¢¼[<‘òº™->$Ýê6 ¹IˆÜˆûÄt ³/«o/5üñ¦¹I£Ã¤Ä”ŒÜ\GÅûá:[/ùßþ˜§,JG¼ yE\kÖîDSʉƒ(§uS{ÿ¼ Ó€I3÷/k>=©*óAV¥ë¥C§•FÏLë âµÛ]::Á`À*{Iõéîj|ÑùÀÑþØkö®ÞÊi˱`í¯2ì;äZçÑ œàÑ{',µ±Þ{L¢2jž[Œcsà±+Ý5­$²—OxôíŒïHs‹ØtÒ(ª^~ËŒ.9haLýÕ$ñeÓ£€¤*[¥ð¡É7±O,¤üއd3ãCöaï€kÐÍ“º¹’x¾Ø%þÏ7Ú™7ßð»ÖWëþ^Õ&MÁ|Ïï­ã•‚Ói¡ûÜùb”ót]z×Ìó¸÷ãÑÚuÀï9­®è“(x‡=¢7¶À<+º½cXøo(:ÿ}ž³Ø”Y|¤¥ùí›6„ LˆÒ0dõ·ò‹¡í#•K!\aQPGy;Iľätœyð©Q×¢ÖÒ \!¼ñD’'}"‡¤*t³¸=–Y$T¦*@¦gÎRÆîÊÓUüŵƒ™ì9‡ØZ¯ ŒT/d :á?ZÄ»6öqâ3——†Y僑¦Ý鯡ðð[¤µ‚Õ^X$y.×c ]…‰4…èÒÜÙI¬0†£B<˜6yN µÀv™¹wVò˜¿eì_©R1`@éùoš…ÊØ¡’XM8(“£ÂX£`½iKŒ«Ô IÓ«à$ôӉΫ“]Ž]m:o‘«¢COé¶ó¶c„TÅK¯è3c¢+¼Ú –J?ÑUÊMPe´—^ÀáýD·¯Ï­Žž+DÓq™KhZ…X…àÄ& ö$Q’Ž¿ýXå7D@eìk~¬ ÖÌÄ Ò‰Æ;ÇxuÅË êëá¯úgÞ¾»é•ØaT£ó¤­ÞªyJ¾”‰ã0k³Wå~ÇçÞ €’Õ¦­©€EqºF#uD艣Â(dˆ†(³ŸÇTÌbÉqWˆÅçÐÍ:¸Q 4Zi)¦Ñ¦€*í™'3—°€~hgÑèH9a$Œ5ŸÏ‰Í‰ëÑ‹²) ,â´\ÈŒÇ}È‹êZP ”h¼( a±ÛHºØ’Äc&ÑX—k¾Ä¹ß¤doÉЇ«;wö‡²›®YwaX6žˆNáÑÂE~Ç·Û­p‚íQ¬¥e¿ÂÞ¶UVêÎÍ¢I‘rYd®öÀÉ$†ö•Ý1è¨üüKJ¾$Ú½1×ç÷{UëIGæ&ÎWÖ,g_ÜÔÅJ׊¾ðö&¿Óì8Z €+÷ÀßlLEãòA!çöîõú…Fiœ„ÖJ% qvYì èô¿ùE7f„Ñ ‡¢ôûõ™î…¢’ªXn]5,ŽÍ:Ý Ѽkø¹úh Nt[DJÅ"ÝüÌtM»wBâZígwzXˆéí_ùعöV¶]çIÎq€jnoÀØw;eßš†pý>ùŠÎßêÛÛ!¦ÔЯ×úºÕ €ñ©‹ÿxy?I-˜®Ã|ûÂæ_Üà{€,I»gštn±öØ7.FϬä44¸ïú‘k1]+es‹ó¥JÏÝ'mÛˆŠ3 I]â¶ÚIû…–e.‰ªVeýh'é6jròæ¾¢uôW¢°ß"¾Fv§8 ßý«“S~‚­Â׬ԶK\-uoXcnþN×ègÚŸolîàt¢l!Ô+.-ƒÜ£úRæ¸)×þˆºEg„•™{âÂ՗#Í—_œ›GWéÿLi—õ-’ XJ¯’4$Þ‰Þ¤ –q¸ª—„²³™©äÜÊL°Jè–þízgL²™T¼9ª;ÿ§G¦$Ù 1—P³ðHH}‚²^/ ôë›X¼wÇ(¼Xx*•ª”å+û¾Èˆ\4¾§/¿YReYŽB%Én ÓeÀéVMØ bj9É1j<5c3âð‡Nf"µGGʸnØÙ®z*”Ò½óôÕõ·**=õAöT ,—ýœ7J .Ô¨±š4X}ÝóÙ‹L׬_O‘‚Kf¢_ÐþvKÎÍþS†©µW½~QqP>¥¹ùW@C\j#EPæO¶¼ð*ždoŠÒƈ…V‘[¼ÀV+´Œ‹¿àLvÌLx8X™÷¼@XÄá˜$‡ Ó*úd~q^kþ+]Dfe]ËÃß´Ñ/Ñ#åðÛ”h°‰áÔѯ© ÍZYXUðÕRíGð`É©2Icˆ\™}·3´•Žb «· \Œ&WTq¦9S.¸¦’Nk‡ ™‚ABV?Jø,,Fn£]¹®Ø“K匥‡“÷=5*Ñ• ú¬² êŠy´%»QŠ]s—”Ô!Té ݯ"ñ!P¿.þ_ð´Ó‚£?öòÜnQw86¥@Þ–®h–åqi6.³´µÚ…S²ˆ%ŸÁ†øpZÄsfHî˜ß‹ïjR‘ 8¯¨uF4¬ÚÈa±¤Ï!Ø¿pM:)J—–Ò1Efïfxr¤Z@$Ï#9›*‚Ñ™]¦åK•0Ö¦’Ÿ \G1ê3·v!žyô®5b¥zW*^(‘blÈGW|PÈ&¥eZ7Ñ8=H¨ÆºA8 ²€wîSíÏíá,c’¦ƒ7EÀÔ[ÙäÛ$*4#j"SÛ!GrÁópª½YŠ*öP]âÆó’÷³ÆO2@^4])(.©²É ¦{#­ªL'Ž$õ2á;ÚCÏXÍ:§ñºaa¬ÔÉp¬~Í?‘è¿+‰ï†‡6u»Mø{{Þ(ãâ÷zl!¿^íù­ÊزìæÎ<Ü÷p“ «`Ït%HÍ¥àEý—ˆ'kfþND(W[¨ÔîEÅ9“ºž³å£KJZÀíi@³²=7éGd7B'g…+Ýy~Éy%@›ïÈshèuÕúeæQ‹ÕRðÚWÊcw•Ó•k° ¦Ðªï¬ T6y¢¨KBåÂ7E̹ ¯£€£†ÙYÐÇ3Ã3A¤¹i7™!œÛ£ªÎÕ|HÃQU‰¬¥g8S¡9Ú3<Ýàº1#ú+R€ø+ìªl«¢[¥ßJ:†®\ºÔ„¢›Ð±óÙ\û˜s·‘ ;È¿BÄç)u¦(g‡•œꌾZª¨uç¨Í€Ô8úkÍßKF@t×Ç]Ýš0ÂýOV"o6OÝ:37è¦Išì‘ÊŽ%·5Ƥ‚·jãI5Š%øÎ§Qx°ÌX|¼ZêIoa=г0ÛªÏ6{e©7xÖѪÑ~¥Ò uá4:mM© ¼Q·g$FF¯¿”±:b6b2d"›Á7€ê8¥¢ «CݱnÖìR‹ÝhÊC)b,ŠèHöI HÒWS†2'f¡¨€²Þþùp¡ð|¢¸Hµ½ÕZIÎB¤KJwTÐaÈ]yÜD‰ds#­‹Ñµ‹{V˜g»b§kP-µ^ú;@çiÚ•²ÑÐþÀ«è¢šÔ©›êzŒ ¿ëœÚR9ÔirQ‰ab5Jᅳq,: T®k2§·@ÊšŸF ŠäºÊ|Sd 5þD²Ó*üààºC@À Ňi›ýÙÂÆ"e"ƒjdñk?iœ,”sØãÔ·D.9¼™+Wêú6ä³ÒHÒaKµ×ܾ뤹Ufc•ªmNÛMHo@ËâD"Æ)5Jô‹ºùÅç<ã†tʧ NAp•ó$%ôˆlV·DM ¾Ê펞Ê"%³/,ä¿%¡M°öAqKµQ1¯‚A‘̵b%}-f ÝÍÀV?Š5×û¾ðf*Ù¢ÝÄÑ#È~.zF[b"Ý‘ærŒc´6¥ã–°@ÊÈkÑùë·Šz/E¸!`EªGLÝ•s·W"ôJ*¬‰@Vé«y‘ /¡ÖLÜ¥Ž,{Kd¾¹è³Bž È6OV…;ÅÅÿÔÞ̹Q.qÜ™)éXé,É9VN©I t’Ês¶¹sô¿ŒÜeÅåž–ªD‚ãL±ˆ¢Z/ÊFÜ´¡7ž‚®‹œ‹ã§j !UüO7PüA lH¹ùú¤}2[å.9ú#{&xŸO˜h#$òβ!´ó£ÊEaÐÁL¹9BŸÏœÁ {½!¦âln+ÓVMTë“­ª9SYÏQ?ìäöq°ÏI¡W#ŸB•Ô*vC{[F6v S2‘UI³g ’ ׺ê¬rAë}§š©9\3¤ )ŸÇoˆ©6«rÅb >¶˜áÌi%êqÝ0¸]ÔòËDœd:L úSž9¨·-—ŒyDxÎÞ2ûËK™/ÕŠå3#ÑÙV7ëº'ãÇŒ`\w˜ˆBhŽxò%§5£ÍÉ4 ƒÔŠmZia’Õe$UŠF™D–¨[ª•Mb¨ÞxIT4èQ«qÔ¦œÂlT¬óme–2˜i³¶±+¿bæ©ý_M+CtÔo¿² csÑ ˜ôÖ¡pVÕ'ÒÓ°^N1”·Í9ó†  ,dM­ž½TbŒ6L¶ò4Üb(K‹§šb%*Ð$ËȼVã“ÒÎlwB‘ –¢ò ázM.?•‰°C#@MžsÜ%„¥’^Ó6kÓkRFâiÆ–9&:dM'»à¨ µÀ<öÊ@ îtT÷vm+ms[ðP&%•l§m*•ˬì1U ³XÅLVE¬3)¿âpiN@ȶväYõœÍCìw]J…EÖL @‘Î.*IwVÙEîÉ…¾¦Ž¸Þ+]m µ˜ûú’}˹Y¥°Æͨ–¿j?Œ•A@§ªNZÄ‚U¥†«­t6lW¥ùç¿3¥¬´ ꬬȂ—çÑþį͵è~ÊÛn?›'¼oùÜ+ 1~1\¿ÇŽY½ù0g±rŸ·Ì¿ñÎ;ý% Qx>Þû›Í’úõ*䌫ã^§JòBáIÚ&°;H½‡™ÚQîÛðíe´…ÓpR/vóƒ°…aÖ¯fêÉbb"/vªŸ'ïL5kï®×w/‹Ái;šÜþ뵦ûûó!ÆÈÏ»$>ùVŽ÷G]KIz0Æìò23ÆÐŽœo^ç/ãàÈ&ÑÕ:lcöüCµm@…Ú¦’&‹úatu¦±ÊL¤†ÑÇWÇÈ™-jº®¿X%•9c£f£V!Oˆ[›OŒ’ùAûí­gq„!ÄèÜÔŒûDÙ_»üâ©YuÐlPEÔôû/·&=QáxÆÇM…I†BÛåÜÓ=yk©îΑÉÊýãúh _…s¸øIð)¦ÁH:ËCsF¬¾šwš†¶A ë#ù0’d€Ä—i¿ v޵+ĬØEñG2qŠM–2e•ó5«úÄ´ù=ð`ãqnœßµË`Š~Þ°é׸êJ4d•\ŠØüÅß­Ìâ+É5äs㩌;WhòWf°¥NçJtUŽ·<‹¡å›—…µ”ÑcÚ´˜nný2Š ”j:”NE Nø«è\©üI§~T}nj.HBBÙQа‘I·¢#dÎþF$ÃÂ(%Ñ`8´ç,ÁäÂZÑ7ã=•õ!K Dùê—FØ`h³táPÚW’ÕDYyÓ7MýîÅÖävÔÚl—}SÐÎ@œrÒßâ.Úìc¢(õ9 >€¤¤¼º’q()6Êä¶màÌ#žº©*" czEᫌ·«¦ éV\e9wŽ2nl©® ;‹éu’0ÑFͦG¸rJydW¦wê¨Êº¥Ç¥‘Ehï=ÉÞ«0¦í#8_À‚ š\Gh#«‹Ç¼ñARÖ\¹J4r*nª{Ó:[þ‡¿ã® iVD/Sò wÊ´ ynëÊB{[uU!Ç]á}=y¬ û4H߯€Y;€‘Ù•hŸ38ž“è<¦ Ͳ žšX\qÁy“¹‹éBfȪúhÒp.Ï4Q$÷,×kôÉåN+Œ$UµBøžÕ-sUÂe`#£1•UDnbÁ Þ„þå%ˆ\#1&êÅx.9Bª¬y¬à| öQ€ C!г@k¡$ÑJŒƒÊŠ@¿$j£š3ï£Y]aÖÅ·³ô¨¥ É-Tp(fµtB›!õ±X*¿Þ¡æV%¹þºN\ãWk„qh™dip#6ú¼ÝÁ%K¹Ÿ‹Üï·âa”D<4UÖ,e¥Ä+©,+Îäz«¸¤C`®zÕ”CÈNf¬ÎþN@¤i^I€’âe*ÉCAhz.ÄXÈâeˆ ³g6̬È详œKk:ùqFDJüèìó ûød'Æ)ÑêU=E¨ˆÇ^ÈLÕ5] ¶buâhဓYÅ¥¦³–9@¥q‘—ˆnLH.Æ"øjf"í• ¡FßµÔ¶s]ªJ‚­ZCTPœ?lœ—§–íHnº’MÌÙ°“Før+pÐqçÐX2ãkyä ÷FsQ¢HRgKh°*b:ïH­F2GE²·Òh?ÖæTFÝ,õª´¹AÄÁÜà7÷Êž©Ë:W SãjÒ`$g4žn³–‚ç¢UÓ2rübÖX,;Æ©%*is­m^¼æ…yíú+ØDªóƒx¯-†ŽnþäŒ'P(æ÷!Ér# òOÕÒ´T­ÝÿqÎ¥µHËkilüëÞG,S”˜·#G›v¾Zèºù&|µ÷‡?mCé®ü4¤þ Ç™nB–ÿæ¤ ­Ô{T+™9×ÿ›82â{˜÷[ ¤Sª¸xnAB<¶Yªi¢LCÓ@ðÄMsI‚l¯HwŠXrYTw¯u•éö02éáÓì™ÆS³Î/Ô‘šŠ$ÎF\¤Ýc„$ŠLjèR.Ua„ü33Ÿ^ªýï‚}µÅýˆÎW=r øÞ´ BLœ4ÚVÓ¹wÅhÄÄnຒ7{mAQ‰ å½7¤× uVÉ9„­¸“+c„ëÑ¡h€š¶7cCo0êQé÷£“þÈEþ!.ïë­>à#;.ão¾I¼]´ÞÚÜâ·32; PÜ=7z\é4˜V.Ù³‡7ÓÎ>'® ö™ú( ¿×A`Ž` =ž¥4íœfÀÎë§0õ»cÑ<Ùn‰ãK“cÚÅ®‡É4¼¯ñH/T1mî”R^=fâëñùÕiê˜T½xPìq¹Û‘aN?þîâ=!UºpëäÞÏm¹XhšÜC¡óWÀ[ÂûšlæÎ4ºN"œ››snçÍß•¸TôGßó·©d|ÿ»Øp{S$önÂT¦¿¸÷»Ø~bnCеΓ{ƒ­¢’P)OÎã·]Ó[Ofº–8œw¦ßQcÿ2$Tø†”ˆšs%Cg꺒Žskžê‘öÕö2WuÂ¥ãå—?]y-O€þ«Ñ,/D·µáh¡J8I3MãI˜s¯âÜ¼ÆØDtŠî |BcöB†®iCÈéÇùü½Üp¼‘y¿fQ/Häyï)ä7³¿œVIÅ(Œ˜~8é8Óþi~{©|ˆÝ¡¬=ÙçÍp—"ÿz–î¶3ÅI¡0—tŸõ*!}M,hs%TãpR;³)¼¥~jý´öþ£XΉ‚ž=ûµÝÐÏŒ¥W¼i½ †´Ð˜;½ ö&–!BØ%Üw‹mxW€Š“wÆvÞûÉU´€b{OK §!=Lt³jäÍ»>ï‡âlÔtü6£—ö@ÞªM`P¹¼˜œ¥×±bÏbû"mŸ5°ÝU+ÌÞ¯<´ë:†Z"k8|‚‡"7Iº5à8RÞúNf°Þˆ§;_ßÊdFİ}AšÚÅ,g®fK;ÿo÷”åÜBˆ‰Ì•x²%E‘J=ŠÌ¥ôâÍý¦Åíä–»ìÌCÞvŸ¼îëJ Ëéõ,,tŸ«ätV³ EaÉ8èÃ5†-æØôHSà‹–y#s´íÎC˦$ЍÑM<8eâɧâú6[Žx?’Ôî7ew|žô´4R”¤QhŠã+Šgi[Qãß{Ï¿¡èüwCrn®à½eÃ’ˆÙTâᜱ  {C•”ŸŸèX´HÁ§Ë‘¾¡O°Ó²k%©Ï[ÚÛ4Û׳ö¿ÀDÑæH ("KXøè€z<*m\X&u9ã )7@E(¹Ú´ ) ßÌYš„†ßMçh Óá#Bm3žX "ÃBOÁ¸®c6±ÈU@‡˜â4Óø^´FÓ—LCöÄŠçE (4æ½EÁâ$>pÆH,ÕôÏ‚µD鉅Z9ez‹O •(ÿªÅ)ùÕ,4¿žÝ±ŽŸš°Šª~[N ÜüÍщüöcÅÃV¶\¦CU÷ª“XK¤­ÄiQ(dÚ¤™8lägP‹««º´ˆÀqNrDµ¨¤Rê­jPAE.]¾dOFšÜ˜ey(ñ pêÓÍŒ0v·R½ ³ èB"¥'ˤb®Éú€3Í¡ù/!dÊ¢»H„.„¹ãD‚ òØzöÓáƒW$m-ФØ0bŒ@ Fs¶²ku°°ÞÛ=ÈR7Ñ Ìk‰Q¿hÃõR2_˜låHœ²"•F¤áZe“ò˜Âqö„5»õ<³ ¼ü‘4j*O‡ÌÝ¡å®Ko3cB ƒÚ´2W.¤‚_Ä,”ÊÐ’ˆæRˆÙœJ¨›qª6mÔ•Fsï–D »2. $ŠKÁæS|%™:?…»Ehµ "ÌB0®ôÄÄx yÐsb>ïL¡+8‹æL‹5[UM«{Äñy<6ɘ¬â56˜ÌXÉ€„âVªè03L9ë²èþdëO¹æIÙŠJüâJx‘ A—T|'9€Ìþ?~5?ç2 JUk¢œÊ–Ì…£u˜ªO¤ŠÈÏOÇÍåó™ÄŠ @ÉC>Ä+a}l‘nrJJ(ÅPÑd ‰ø92Áp]T­mÞ,×Tž’çJ¼”¯+æºÍ_´Ê%!™ê1Sœ¢)65,µ:ú*·XBo7ôTäÅP/ƒ ÓÈSd* ¦¨h ²›¯D›²$ÑWbÜòPD)"öå.Ÿ $Zª¨vLõò›è?Q6·1>7ªzDÒ7ãèšíj<°y{u.þ7}ê€~)ÎÉñм¦ž'nyò™Ã¬õv³A;±öwoì¢Ø»–"ºÔy…ñ9æFÛåº[UDöV%KS¦®¼0ýb@$¬Úºôûš¯AÃ&Æ 6•À‹¶Åxën¢T˜Ý“îÕx÷6”7;o>UÝ(ìh’ÚÆfÚܹ, %ÖÙÜUÉ}mFx2P å‡úXªØEßs~ì³AR¦ã꯾¡´Ù}n·5ŽTT¨ß”pƒ»¼êòOyC€¦«VdÐMÕärµúÂóAñG¼y›\ûœ|7"ýužQPe±8P'2š¡dh{²U…·ê‡¡ÄIûéØ;q—±•1´ZØcàtæ÷ÏhŒ*Rží¹_=GñÀþÙÍàˆ/Í#Èñ£*H ýöCWí]§®l-²ÁBÉ€XÒ´Œß•â–žóßÇj9üUú!”J € t§cuà{=³ûUbÈ”¥çê°#ˆ}šù T{8&ƒÝpÛ=_ŠŽnȸùÕ¶ÄÌ[=Èô®í(Üfãcêm¯ÆnÍø%:ÿ¶Á‰ìÐ KeöÕ{¸þ{_&îXtŽèö|íè‰Û4$¿€´¡r9^°ïàð= aßg›Æ)Vñî”!‰EÈàêhlA}Ö TœhçÉ-íVr™ŠÜˆ•äÞ¢(ûsÜYkcÇ6p±ð¶ý{÷ŽÆ¨2›¬0±mR=Ù£«‘¶{ø›Í¯Ûån+ j‹ÙÂ4LU€8à}£ZwÀ²'á¹&ß@$@¼m-ÝbRÅ7¿x-4˜¶™Ñ0“¨PýÔ¬²8"å½µ¡¥¨2 ]¯r-wÌÜàPka} ±÷ðñ®Thì¸ß;m•J •lR ýí“âDèáõÞÚ´–7ìÓ9Ö…Ô˜¨×¬!fTpU ¸Ok†ÆÌD õ +Ÿ£ÌT‡¬{òû<‹ejo8ƒÅ¹½Tqïý´o À±6—`¬GŠî;¢2b·4aò&»½¤g"i$„mT¥äÛÌãîø·)ûzû„Sò5ó²OµpÛLc°ùý#ìoS¹Ÿ*Ý"-[6|®lž‹ºp‰~Dï~eóÒá•k*EÒJ¹áÍŸÉ&!r÷ЂÐß­†Ä,4ÙýëÖH¢\fn)@n;ÅÖ@› H²¤[l’Ÿ\tþHí¦÷þÉ4ß›|«G½Éú-ñÌòÚÕž¡Lõºy{{ŸWu®4¸€ +^”™¥k tqÚb‰²PÁcïwL,¬ˆú8¶Ûȃ&’»‰ gõŠÕáÕ|Oˆ¬\²Ìy2QtE¨yd3Es´ÆfºÀzÛÿÖPà’Êí"¶‘ö°f’XÑ÷Kø: &¦:ŠF¤ÍYÎc’ EÞV pJå3ÚÖJoÂ.›…D‰7ü|¡hR‰¹Æ‘Úʺªb¾a)+Vtµ–^q¨•$¶ò“<Ë­ˆ0nžèm‡Ü•ªˆ‰\»]Þ±Â7d¡ì˜/±8X¹ø#°­“Ÿ"å1)|BA¥H?Fþ-—cË™\<7³/09­"0ÑÈôHC‹N ¸h3¡ ` Ü2)j3]—Îð]B=iÔSiq6ç:ALðÏÙUѨßEá b†œ4>+Ó6!Ë‘¯È·Ì i³³^]gð^B fxÑŒÌ8áákæwPœ[¥Ûx~äÕáô’–9fEd59÷Wò£ÑfŠ•¹¸P¦‚²„,ÉÐ×Aª,²Žý/ÿ[ò´¡6)k¹q^Ï ´Á­E{•N5ŒAŠ¢#ÈÍZÉ`RFÉ?<±6‡à*UÑ€I%k_w"ð•ä°ºR¹ÉÓ+-\c[ÒLß&°2w©SY{±ÊÒË×,³˜äKÛØ9\jXh‚Ìì„Dà=DšeLc•6M:xSYž2<Õ¨*·HZŸ`ÚA –^wÑIƒl!CÉhÂ5´höHñr!OIãÑG”:^äΙ‘Ô` E·¯J~a*eÌA­ ymœ!SÉï«Î ‡º6ôܳþÞsVÈÕÀ£<_² ¢;ŠŠ:G«F)KJÖ.¬B{rüÜ©Ú&¥±a•› ‚OâL8Ó.l2c± ð€h-XDE½*…É› Wë4o¤ °’N½ªdÔ¡¹¼’/Sµ€’œBIΠ:i¦ré¹8£am6MꬓܿbK(s]g £˜ñÍ4 äÚáäj–º§:‚|Â]W˜ô%5¹g6LùLVo¥h} ý[ˆÎ§·¶èâîzÁ¹º^ÞWRùL®¢sÍÀÛW#ýÖÕ)HNAùCuʺ¿‰)U|› E •Ã&Až"à@ý­ºe¿?à&•œíEÛtÀ+ U·£­^Ê,Ž¡ Þ¢›ÀR´§¢fl¤ˆ8”Ïe{h{ª:² kýveRÞˆÁ¢ë9tUíì¼{÷_¨ÎOMÑ÷FTõì«c½•}Ùoèb‰ç)•»¡bÖÓÏSŽÞ‡À{Ÿ4ªÌ·ƒW›AçU«lš˜­ëÔnj ÃÓ`=VfôØØ/í €£'K@zUÊ1òb€>8¯:·Xdsïý[ß õ©Œ»®¼>¦¤ÿÛž_Ý0K)öhêeWé2½×îá$¿Ív`Õ›ª²þYÞž!8>œÇdhNÖá›3Pq^{7Nb9ú×5¿“Z½Ïœ¦²&Ò¸—q͆[}za©M'|”À¬NÅ)k{ªåÆhjÝÚ™ ÎÁ½vÍMŽ@soÍ*a¸7õ¨h‘ß$0†›±ª€¸†‚X½&ƒ®'k·L7nú܉°=ð®IûòÎSÁmý~#à¾He•pX$§qœÃž3Ρ²YŒ`ßœvu({ú6¢ó›Gà~O5üIêÛnÂ8ßQ ¨„#݉€¥Õ›ˆºµ{Piq¸z§¤ž¦ÌV=˜µ>½_¯¶ìômЉ`]D£¨ _‘¢”’‹;ØóæW¥‡} Lû®/¾K·9¨ç]+å&TÃ}%{î'³@W"¶Åòmê¯ð}7Ó­N¤˜rÜú¡Y$ÇÒøÈ â‘²”›Hì"zyQH0 Ö›deÚ¢0Fà5(þN«§ïE½Umoô“ΉR@/~^j¹Þ§´Sb¾]Ú°çQµ¨ÐRyðl^6ø›˜Õ?ïŒÙoä+ÞD.WWOpóú‘Ù\¦<ꋚìâÎGñfy‚”v‚ëýŒe[;ø6õÖ½s»^®MxÚŸþòn±¤Ä{NGS ð›¤peÔå¸ÁÀ‡Ã{ò@Õ]7ð.þAJC)xäMs.®ÂWIÇwìÝxc‰ö÷‘ ‹ k¼}ï‘ñIMÊÚÍ \ûLuÖ'à)mÞvkI&ÇÛl°½ý-Dçù-ÆeÖ'l÷¶/‘º*[4O[JÆ$—Ž ¬'›ç ”¤Þ¢‹Ä*»l" ÓZH5 Zû¼#Ù.­jÒTë‹JÇšCS)çC¹;Yi‘f"ÞÀb²«L“޽áEËü½zU­Ä®m>ŠÈ”HtOª,`-íbÒûÿ—¡„XRÔñ'ÛÆªÚp«`‰1©ÞN|Þ”P鋤díBuL²Ú l0/ñB…ݼÕÚÏŽXcº˜‡qWè|º=5w²çdÙ>,IP´ÎûV°% ÝÜ0:v +Rñã}7yú‘WG’Ìä&MŽ×BãÆã-«\‰òz®ýjðÉl‘­AÖ7¼Ĺ¹b¿Yë5g%Š‚ÁîÓnD/ìóƉä­Q\  òäiÖ‡1 î³èyÈQr$¹±Sö——*¦KµK©¿œ±![€ô«*€ Ê¿–zŠ2Ä”–T’jPiR¥~Z¯™¤ºý—.ñÂíܯ  ÈT6`èy¹Ù¢®¾A¥ ç Mõk€4ýÓ›{¾›¸•ÆÚvÒƒ¦ª¬ÖÝÇÍBhž`ÅŽÌ׉xÃl5@×»â})*Ôñá8ªÐ° nÛcyœVŸN¤µ\¥¸d2É3xU²«€Çº "uM ‘‡ãíMµ“ëÐa@×ÝÇõ&ÞÚÈåI^78‰H°7Š@Ãz^p`ù¸ì,ióë ×?ϯã( 6ŒjŽ>6Ò&Û,ÿ­›à‰IëÒLä€Ì]©Äž§u€x¨Jø[ªHòè*Pùªìc@÷ýŸQ-AÅ8îöXø n­T/Gù ½àz¯—#«×<ÒëSûRoÍ{ØTwo¿à> Í4> Ò(§¦½ýË{OÞ{¢©yëÞ_×ó„;&`?Þ«E?îïùB@Ôñ+›1·Ó_r‘¸mlŽcûõz7AÏ]¯¶]5ûm˜tw?Ñ?¸€ú÷2ƒßEº$tsààT¨Ô\€d¼pÃNAØ©A.Y²!1@þ~â>?€Ç¥TýŸ sÒJ“åö&&uu2ó¡pbs‚âÝ6ÆÞ9íWZŒJ~øÖf„˜é6茊ë½g»MGä(SþüDDlkªØB40)™¡×¼E(“Ç%»z[îŽÒ¤ÊÍÕ›v¹Ñ7'žëöŽD ߇Wü¹ )ÚÀ „Ö=R@Ù~ŽŒå¯ø®‘­ïê)7E ±ßbÐbÉbáúºIàNúï%:O¤¶dÝ/JádÌt!LÊì[E]h+I¿á«KsªYv S~ÝS— Òà“‹¤>3E˜0':?q…†+½Ô‘ãXâ`F’eCb¬•¢î ü@oæY—™"ùgäuuµ?º;j¬»ñt¬ òlÇà‚™Ë¥ïâ•/;-¤0“œÙ+D¤0VÎáBÃ-\PH‘¦†ÅõRÄ1¶<Ç™ùU òKêä˜%*¼¢*£þ!ÑÙP±¢¶\Š!Jóâ~#PeK­î6S€JÎ@C@ƒ­UU#¨¤P/›ç`Mþ%¦³™ççϹÄö(iäÝL% žÚ3.W¡@–:Žje+Ê úÃR[dÓUW/PŽ,+¹cáqIejn§G²E®š’ÖšÑ4•© ÅTY¡ªW<é’Õ'dW´0ãû"ªuB»‡Z°HHLIufÀ|×B0 5Ñ–E♃¤b”®rÍ,ý»˜z’WÌa£·HB›šºt`rÙŒ—[‚QEhgcÕ”å†zQã`âÄ¢ª÷Ɖ€‘´iD cݱ…Y¹á-÷»ÓÁ–±í™~;ï²NTî´ÂªAIÔqZI6Ã1ÙJª™{ i1¼÷ê3Oœþæ…-B˜y8·»YxGSaIj¸S]pIáTù„:Ý*kºVý 2a/hÙuâÁóxI½-BFt:Ã7d*@K`Š•LE[Ãè ?jËCÊä4%»ºTc¨¢ú€QŽ=&M ¾I|¯-&‡jßÀ2½šS/Íi¿êçÄ*zAOJÜÊ $QÒX„ŠÚlkJTØ®M„@É ABÞÞo–{Ï=‘:˜i;y[¸ÛH ñÂ-f%—L%ùÊ Å®;#5ÀVv²ð(Ý?©s×Ô)KyYÉ8ç¶EµöÉp{nС !±p€›D¬ö' °€6^€Ì4b µXa;Cu8cÏDbP`âå«™fžNÆ6_KsË$‰ÒµK; ž<™«™oÅðæ{¬TÐÚå‘Ë çi~)lÑ|wl÷£åEsœËÛC®Ç–IïÑb –³KO/".§YS?¹è| ©û¼ŒhÕ´Ž7Rb©b—(s) (Qƒ©¬Â½vHv÷Û¨]òøR<…@h÷WD`xÝÎ[i°kÌ#ëî ¹§êÔ)á×GÃíðdvUˆBJlF°(£TÑigdSÉ;Ó "qÒ€£q !Õ†ˆbAz$žÐY"ÿ€8­m\p×€*æJsÇL@ VNUA!ÕÄ—hÑ[åÏ–z+¨IÁaÔ£aºþÕ¨s@dF½ÎŠ®h=J«Te²ª‹tíö«#êBé1oÚXºÚ[œ¿‘ ò5ë¾V¸ýÌGI¯H´8-"‚ËD:u“"¡6šc T°9Õ†åö|Zf¨ñŸá‰1‰ýDV,œ,liZAe­d¤Î«Ù¶;mIÞ5².¯†3Ñ,bIúÔGÆ{{>=y?‚ÿfµfW,¨õ|dtŽ¢–•è)«Vì€þKN­ó*¦rl`5¶ÒN‘Ÿ½[Eeû(nnÖëͳÞô@…IE±€'WKz‹FûÏåÂCéÊs@‹¿–Î9wá—0·Me ?Mì™ÆÖ犭K¹“è³CÊ2{j‚ )JÙKòp5G³3q”5P6^Fà w_ü¶Ç¦ú´³}G>^€Z y/ *+¦•í+·ÞDI³µl„7ãö¢P¥Ÿ.Úº,ýZc•÷X2’›ë<}PcÎtl£ÒDÏX¸P¶N*%ó3ÔäGeáèÚÔGá« ¬è.oZ)º·çè›ì«fT¢Á]0ëÞ¨iÓ(†(RQ¥¹Sh{¥ÝT´hÐÆ¬8kùÄRÔt7\µEPþ'W£úÄêÒMÅÕõôø§6½)àçýÒ¶¸ÃkRªbfòžˆýw|Âþö·–{Á_¯_¯_¯_¯w+¬6“•vì6=à¤(Šª÷°{¦„<üzíhH/+”r/^ŠX^ï¶]«÷áÍÖÚ7*døëœûµÖ¿^÷Þo°˜åtPáLÀ,¯¹C%è=ú^á°Vâ1f÷O<‘!0»BÜ>Óø½Î¯×+¨X®_¯[y–Ÿ:˜Ì胮¾Cço+:ÿ¾\Y¹uæ@­÷Øi-M»£€UríÝêÓÔHÐJML,&n£)*xs8âÊOŒ˜¥&Ö†7’T5ŠÛÿÛšÙ)z1Ä|#(åg¡<4qƒ1€PŸ%‹jqË䆈3E€°™rÑhåØTˆ•K_•†xíëáØî¯½¥ÍWNŸlt…ºÕh#öÚ”y…o˜Xÿ,µOâ|Ê^UÍ G¥ûdÚ³¼˜ÛŠš5ŽJ®K*m ÷«5êZÛÖHX|O+ÏQ3)×=–B£ÔaÛñI 0ïL…”Áüƒ¬A&zä¥MÒÒîÊ¡Ñ2y²›,¤¯Tá 1%5òÙ×ÙHÛ ©K´òëZž(çu“;‚ì±´ž©"RH-žnöÌ ¹DAª'ÅJ¨,%š.‚|8 ¡‹•I‚P— •áÒí–»´_òþÄZ@Y+ŸЉ®½†Æ[UÙGly_ô˯“ʪwª`ÈV?¦r§¥cZúXõϑى5qJ´¼Èö¤»*C“ÆÎ'ì˜~ãL«Jgjš¿z¯®qôá唀Uu°Ìðb3§i[MŠYê‰s—Óð6·½¶-ÄgB#nRa›]/{显¿é»ÕjA­·4ñ8æfÖ]TÚž7KímÔµÏÊVBÁ„d ¯5’(µuÀLøx9`>â71¸4^¾ÅGÈFë@ÕeW²ØzUé­Ì9ŒN¤·®çKœÆ© QhiΣ uÃÖÛ e8&ZbóõLD#pÅ"a„°Od`\5,ùùªç#‰7“Û!Ûch<˼Õ!»3R£3WZÜÓÈFa‹€'Ÿ)~¸ÙÞ]Ò0*H¢GºÎÐ,Dq `¶V­”ÊÌiùDWª)ªíÔ€¦\4B‘‚¬Ÿ qm‹èû´àRKS¼’[áM¼Bk˜[RŸ/±‡‘Â:+È3ÑZ1n ÷[‰ø¸âƒK èŠRKå`3ÜeµUÝUg-62nG݆κŠïÏ‚i)$…(³KÌŽEwM,g‰û5.­4³"þ^‡Ï²,ÞèÞ0±®"9\YUÆàªÐSTó6¨„P¦öž<·¸ØŒHÔ¦ A*‚‰ýaÍ&vÉeýôbð±Âh)¨U•ª,œœ¯ÚPÊPE„ƒKe9áF^ÞVAÚ$™Xø r!DVÌ`µáóOÀ™; ®cþï %ðÙ9s†ìS˜ML^Bî"ýÏ\ÎR5\Ðc5žh°ök4’BÿáŠÊ**Ã|¸„Àý‡Yt‡8Áò“*€IÍEðw•oëØ±*v±9ÁE–D°<)ZÀÖMm\¡ñ˜¬Ù -+—õ!äõiÅÑha"Õ ä™žÖCˆRætó¬[qô¶tP&Aƒ¬rµ~­ê ÑdIy©O½ÛRfC¡£Úø²hI¸BlGGÚôÆ5¨¦Ó{÷@óg³ßK9g9À<­~[@é™s¶$+Ù{ÿ½¼^},ðs¡ã³…~ݯ׻I®MÕ¼g€™ÑÎ §f¬µâ4½Y8¹—¥÷7 e¯ÃŠz¨[ãg=¹I›á»‰¯îøÉxg;ó jÃÇÜÿŒâOÇ ®?}Bóó=‰¹Öõãë¿ÁSúAÙf=4=«ž3–ŽÄMžO ÿ T¸ÕútâãR’@”:·Na@3Ê+\½»6neAŽ w! sÿÒOÞ"sÌ(ÞE‰ÉqÔØ`î‘:ï,ª8Xd"*÷¶N‡Î¯.ënÀB]k\M—•eÐàŽšâï(‘*kUG’ÍÓ#µJå „µšó£¬vä%³Û]¤1]Q÷„¥TVF”EFô¹M”xŒc;¥Ý¡*a¼½–Wµßœ‚}b­)lï‰È¯¯Ü_µ‘²X‡7h…Pý[Ô~E‰|Ü"Â3MÔdN8m™Sê':ñ°^™Ñf³ÔÖɽ¡°6‚…þ¯¶Ï-¹†Øˆ±Îùˆ¢At‰_D!àâÞŸš%|¸©Ôû¢ÎIé¨Ê±©l“|{ý¢+=½Û¹"á>*oÁý¥dI _Š1fÚ?Ó2ͨè¡]iZ+J_‰/^{Ìmqºg˜Y‰ëÇ$ý_*Ma¯ÙÕúW¡UúÅía2I{o¼‘«¨³ w“üÚ7¨!øÎ.žÒ†¾MHö’'Ã+ÇÓáò†éª€§ ¼Ü3{O‹ö/víõÍ\MjáYæÓ¤ ,–ä,Ù›ÂðNõUÏÒ˜ÛÍ>káÛ5YжH¬eÛgáV»VMëòGÛˆö½¦7E%¥>y²F‚j~œÐCg&v­l~_œÐàršÆ1ßœ?ê>lØEûð2ÙU–`îa£` °UT±A-‡Mɵ«n$©qnjãh§VÒN0ã&·ýðúÊÔšî‹W^gó+÷ü^ìûøŠ«c=Ö7¨ :\²<¢Ëe-Ì,9AŠªÄýêòõwý7oèPÜ"ñ Q¥#ëbP¾Ö•¼£}½Z4À[¦Ë«J¸é›*”+µ¬^Äæ“–¯N$Ö.Áz!ÔßdÖŽ @®§Ê ˆ\³Ô‚žG8±¸ Zó FË ›ŠQàÎ"ÃEŒ5÷‘(#ÎO5½XRJ…¶eÌ~‹ô "ø©ÐFAù£ ¥ ¬ä¸d#£Ï UÜz=ó˜Ž_—,q4"Ìõª|-EUªæ+ej ¦:›F£¼Y¨$´›…ŠÒûEî¡åÑÁ‘~©¬Ð,éU½S\ “Æ”0ñ²Ö,'Þ¥hNI1Q–Pñô:ýVʈåM.¹žLca¦©—B„ºú°VIÒI 4_¿Ùâe#è'x24¶hmªuo.yúd²®Í•«m¦ö¤~åÂ凃o)%R7Wì…‚újQ9¯[jjæ¹l¥\$ŽØÆb=JLƒŠá=à0šRÅ7´@&"i¬$T­s,ƒWhžKÿ©s$’…Q5cbeÁÈ Å¼Yâ û_ÛRÙ ØÀåÄ]q^”²lKq ÐŒ4V¨d)B ƒiݧûçÜ•ô•ÈDþªHcݪ°ª$ä¹Z_"4ÁKÅÊÍ"P‰’pÙÛ׺ý+"$IRªºlÕw„ßj;B ¦p—5¨÷$úN*Ö_ò;u}¶èc§ý¶DAž !M)qççV­Èi“oPiÝÕ XGM'©!DZ®¬'³™'+cˆÙ3ÕÜ Eö¢!À,´bšòüúóçH(!¤N„•òˆ0ßÀ9.Î`à㣠ª:ãÊ(sØ2$KÂCé6æ4’IÞP1‚X)²QÛ‡NÕ„é'4ƒ´â³q"Œ}Œf­>%Àh*KH½Ž “Qq[I<À´öÑ•ê•É<&$¨¤zÌ™ëy/—¿5ðr#Ò]Ô²]).æ…±<«k£•òÄÊOJàŠfʸ!F…@ë@ò6O·œÃü&›Šabš ŰIPõˆæ ”ÅI6ÁÊzG骿ÊlŠ¿U3Džr–*FSÅÓ¶uPC¡m™OÎ?W­ÅÔ\{'J¤Õ’ú}°H¡ !jÓ%±D¼¨%±Ü YI+oø¹Eç¼]F[ûÏŠúá+ÖǪK«‰JŽR£Å¦æaW?Ö«ÛQÉi¡o^âwœ†æØ‚#€Æ`Æ}%€~¼åÇ6 P -©òi‹k®Ë #ÌxpqA–u3òصë6»ÀÇ÷·ô¹k>¡µí§ €7 œ¿ÿ×Û»½ €ë"Tú›,rnØ>ôDj6 ¯YÄd>õK8&ØPdÄ#š»V‘¡—¤7ëOQþ~ìH•jf7i]ÿîD(To€³¤‡ù³VP)  ÷C¾2Å:\ƒëŒÿvþY >XÀhô6Oº¢üpÃí÷ã஡ òÝŽg¯ÆoËa©µéhbø §cáwŒÿÎKV†|Ë` ¸Ù¾Wv4’ÿ?‘k¿ƒù†»ªÄ¸QÌ|U‡ÊÞß*·Ü¦ˆâi ?¥8J à„ß#%­ˆvcü!ûÒZ”—Ð~6ºì~Þwöæ¨K£7ùYEçïà&ø&{só!o¶u^¿L[Ÿpûé–37. 9'ç¶¶²ÑFo®=g“÷@ ò>h ÓØihÒ²<Ê{n#»¸‡)=÷?Û¸Œò_ËDS¦F¯•D+@QS Iv6‰µa=Q÷iÒ Ó y’j‡ ½ÿ;ÂÄýe«’Æ‹˜ŒíF&R[»CïŒBŒ C–c¸Ðó’¡ÌM»û¦öä2Z(L‰ \iЫ0(w=ÙVY)Ü"“â,Q:’óWv·Ö©¼ïÊ÷òRë*•7³:ë ìøvæ>ˆÛ;ÎÕ¢G^O)eÃKÜ_S4hÛ­ À^™¦µ\}PÿYJŒÊ–i ˜ø°T© 6ןê-ƒ.©NñP¤žH¼/ž…ˆ°Q”@¹mrÁþ×€. þó cÂ. ó$wýëºHŠ{W m¸%)”!åµ öQ¹›¬Ò™µ—><½ä̆ä®oãQ,E”ð¦z[åm¤ŸòY–õ”}°‚ŽÜ\•34Ε¼÷“òUÞ!ØL±<"ejâq€1ó¹ãÒGCË®Ÿå÷å ¼¶¿:q߇.µÝ®3o[äFY™D¨Ò'õÊÝ­8×"ì°…yì¨Ä6 YÊÐà ™¹Hå0F¦¸m¯Ô[ ÚuOîѽ´)ëQ"‘ìÚc™qS¦Ñ’>Øœ%œºãïPá ãò6àâ&X\‰-¯(r“š}’Oô‡‰‚|ÄþÁ¡ZŽL 3cf¬I(oƒQŠ%/oöú%:ûý>‘†¶îº®5Z ºò_Lˆ­¹UGL·Ì”®o†e9X¹ÿBÐÎËvG0ï4>fÖÒÿ²ð Xþ kDZ®Bƒ& ¸Í¸¡í9-lŽ&0Ão4iæl²µ¹n•í%ãÔ%?j„Z×/ÎfÌ*bXeþr-²J³Y P"ysD‘å…`““ÒéØ:¼Hž³Ø?¯<Âw¿qÖF~EÉäÉýZÈt”b¬‡ò"Ôñ6p^U8L-´(‹ÕÄ „ÞHú‹R)JJsÙžU $;VE _ÊÏeÁùÈSÉUo‹(l™¥ƒä6‚œº®’K~qê´pX^ÒæŒõ«KÞ—0P-|Q} Ó–üH}#)Ö@œ˜ÅÚr¬£µ‰ƒS¢¡T‡æñX`x“ZvÛdFa¢ÿ Úà¿|Ûìkâ-r›“¢CÅët™ðÛRg|ºÇð=(¢1óza‘ZKä_rcž¨ˆ7°Jñ’'1ÙÞI¬ÌÒÊ„8 cÒOF0ÓÙ!‡Š¤„Ç5‹Œå¦½ÕªTT.ÆR22¡e¼¸Ç›ÀÃ}';6–ß圚E *8céÅÙccáÒ‡ñGÉ*{bL’A4iý‹@êév?‘Û2Ù; PüÜäœ.ïóÒÕ{‚í“û”¥£ã\¨>#±E‡ªâ\rñU*§ …Yéw‰8÷:N)ž­üêwZTPªãk‰CAVà2ôŠß‘ö}ÑO¡j^ +…*­¢".ET³x†&V±u&A#M®7²Fœóês ¥\” L&h4qyÖ+Á²cÖ?Q<*š÷^R”ƒ†ÏbrÈ‹Å!ò«œ×¶öÔ¶.–ִ{ã¼-1¤|æ>ŽÎ^+€:¨\¬7’·ŠUà(ž>·m±Rî‰$6b;˺Áx3§Š|Å„ÙËiŠjéy¾/`™ƒ¨l0‡p¡¸¹8^Q)©F% FM7*¹aA-ëiˆºñr±Šçî%ýþYü‚R1EIrÕ sy›¬ž&W@ KÖÑê$‘JÜ\I %"o Îh)tW­ñÛ *¸d l†«¬ÆãBí‰ãžBHQœÌ¡eèNÁ)H(‚åŽ})‡wª‚„öXÜyêFfM4í €»¼ZvàO):§”jóDlŽvh‰Õ9­]ÑrËðѾJ 1å)kñ¸Ç•mÖ*à,¯"ÌS¤O¢ 1*TR¯Ÿè@(q¿Úd]–¸Q,îÊ…nzhib#óŸ&0E7ÝëïÇùƒ¶úïÚ ÇìòÛDŸZ“H 1«üp‹iÃÚc¹nBž9F zõ¨¥:çï-Ò°ïçhq£» Ð_J¸IàŽ­1í,æ¸/^‚>T!=Ô.ÙœÈÒ¾Åޝ<áoB¦‚ûBÀ3è/âÇCª ¾õ°ãö+Û|ù¡c n•æTï¶ù¬±PŒdÎ7ž2õ®Ô¼0ýºg6± c¦Á¥æV)e~ ¢6åª,ÒÍMëÛ”jQk…ª{U.tÉ3±éȰ«Ñü'| RÚó]œcÂçÚ£¬]ÿyâ ô¨XÇfµPàŒÆJÇ\覥cFµè«èŽ¢I„·•ö?’äá%2ÊÀ¦ÆQmÚ x,ïdÊû³ó„&™Ze´y8ª¢JZoØÜåC(Ì¥‡x¾D¶Þÿ7WÅwóÛ¹ßÒúìÕ«Øg#íá½®s·0%Ž7.¼·ú#}‡Š£k·i²6íƒäm(yL»m¹˜n ÿ)Eçw-åœÍŠ˜ŠW¸&D­Ê"U¬‚¤¾&GY·­VÒr~;^É€‚->0äÇÑØOÄ `¹dTÞäRïµJ4ys6ÜúŸœ&?ŠÑÜÃUæ^|رN±Db9ÏM«ÄÌÆ˜X°…÷Z¥DÊR~™ÓÌ0èõ.£²dy”0¶…q6m%ÏìyUŸŠB£Y¯€5Ï9-#HÆ@I?8Ð ªlJƒ-cƒ˜ÅB22kœÏÞbCË8ÎuµÜ|T;é¹<×:W3Hf`Êí#‰™aë^šRP$üµ~`Ž.´[ˆÙzÉùݤfO¬ô$m¨Èød(v˜E©wÑ(õÐRÃ/|Ú*^…4†Ò“£²Æ?Gs™Å1 VJ©ºš€¡‚CÑ_nºùÀ]’,6U­S•¡ è¥:Y2"-K+G[høQulê†_ [¸q6uý‡X)z%Ϥv~ {µ2¨CcW *›Ù5¼H’:1z)º=c"HÙ²’Ö=éÅhcBK{B-¯æ±×ª"ÈpøEKm™©~Õ;ý[¨oË—…ÀfÑÎceo7ˆääÏ(‘ /dÙ•ËÇ.w!(GŠ…"9ëUqÃH0©ùqÖB^7kjVn®\H¹äoä58 nRN Ô4ѰN&!Q¹I VSʺF\^Ö*‰ûç{ž“J’ŒCqò­"brod!–8ˆÌB©>¡žâãÍ4ÒWÅ‹}©j²3í²$ÂõµV‘%®àØEnÜEЧä… D‹&XÇ`Ñ(«.Dô$”‹¢¤&¸Áp.ʆp\§dŠuu]¸Þ«+3´ÇEÕª˜nÊ),’— ÂâãH`Zû ‚$B]dLRöªƒî„Ü*Óž”*`.1W ’ëEauu;±”í*/ozÆB'$ n”[—¯s^* 4¹5¿Y•C™xÑ Z.“‰X:š2a¶¹‘àÎ.Fi²©Jz°›YFò$o ­D™É§~&êâ¡Ú_'Ù„¥š?‹ñqëY¦-}KÇÞãVé m.té22ªÆæõá˜Ø@þÚ¬û’oB¦ “²O &Œ•¾ŸxY¥_‹ªY/“„(ˆóIÝå)*åº:è®U‹bׂ4<ýt¢óItþQM¢z4²]— ÉÏ:³ù¦MÌ*ÜDmBÐËÛêö:G @k,ÞžÙkÇ¢õDÔ-¸-BÞ›ó´¸äl}$óæpØxkBŸ6¦nß·a¼Þ´ˆ–G:5€Ð⯠¹­ ²ÆžIÁïÐë÷‚R<Ñú(VÞ ¨´ê(­ºCêGýž#ÂT¬¡‘ùžFr¹ÎûE³üvŒ.î¥É‡`n(o‘¢GÇ?¶ÅÔì#’ï Ô´MÏ»5<À+·°R«õ†L\sdn¨¬—LQôSÁQ¬B%wmtHZYý’ÅVÑX.T’2'’hcÈ”šdóg¸•¤Uº0æM 46/·OE¾}«´Â bÁbuea wvul'ï“2Æô/cf@§3YÏ5oÔí®l×BqËýpÊñR'¯®âNb’ΦÒÝmóO1Öñˆ)Û›­mÆ×»ºÚÛ,ó¯Ð»Ì¼È#¬T뢒cç^1CKÁvËpãf§6µiÏHU—“ m³1<«‚¿A>Ùt«K?¯zÅàž+­Äƒ®ãÖ²BÖ6'½|Üßxrêƒð"䮾wàwnh™:K¿^ÙþYB~¼ñã¹&tçœböÝqªjdø“‰ÎÿX!AF !ÕbŸcK«ã"C+¡[}ï;vÇäÓNÊЇ|c p!Ke+YGúâŠhè0‹D†ªÉF1 ƒ`CGq ó"{Ð2=C•˜P†Â‹ûj™OP ò4êt–à³ìäT}é@Û¸Ìu–ƒ4Ù%¹¾ÅÂÞOžW®áþ—#šIhp܃p»É7.2³˜¯|ö„ö®í½Uè)rG¡I LkŽè\JÃO‰¨‹lìwW<#²YŒU ­´RªýYÃ…Ò‡ÌRQjÝ´Ë‚ÍYmf´ŠH‹ÊßoOJ}²ÏT¶cæîYQótÃИ/UÑ”=S ÕˆHe ˆ]ì‚•*7Ñ"/#êIlú™sç)î¢Í¹xâáPKHVjŸPÃò1ª?ßÈ ÎI"ÌGô0l·d-aNt¢£7±Ûâeþ+‡í52ï ÄÂqêòs®™f(òÌÎ\/´•á©T÷TôcùOQ ýK´8[b÷Õˆ ­ÚQ»¹Ó·a•Od*nýè4-ÑÀ*2%=küL¢# \.C)³p/a“HE&Ê$)jö ¶9yu¹fˆC]šÝˆŠ|‘‘m§(È&óÀ¦4=b¯;ȹÀ¤é×0aÏÏjÉ 9©mÅ;@º“•ÒT¦‡HFH=Õ)I¨äéqJz"ÉGI!¬xç.['™wŸÕ@s– sîhRï‰ò ¡„#;B^„j¾­ŽP1x¢I ub‘7Ué1Q„«" uÉ¿ð÷òx# ÐóC˜*s†7Æ»n„<­øÿRn-“é‚î ‡µ‹uWJUÏœD{F5–ÞŸœ²’ŽÁ~x!Ïš–ÕˆyØâ×q#û¶8®^D!Í:®©f‹PÀ šPt^ù<€cþº«JƇpÅóeÞRnɰþ€$’Zšôs) ŽSX99¶’ÉW§Kc•3´Ò‰2¹*`£BÅ^ç­<Õ-vuó W}\Y19æÂ‰FóU$ž“LZ­Qܹ%@j » ç¸9 UÐü æYóÝ©bâ9`åõÉBmÜ‹º5x*@$Êþ(GÐÔƒ¼·,󎼙ídND}žj_Â5³Rëž ωE*Bî­ßRŽ¡¡yäe¸Ü šÇÛö ·äÅJTLܸ [ðÐ֚ʑ”iÿ¬‚Ò9®Dñ5À=‹•³Ð2½)-4XàeŽêŸ|+l°„^þØ¢óû63o`Å¡ûWëÙS»™óêѤ#ßBÚë ¾b’šs0? kûõÒ¦³Ô·”WV8bkþNØòcüžÚáôëus'ªaRZåa¿¹úõ„½xÓ[lœwÁÒU‘Áã2¯ÇT”¼;œMÑ::É1وѾéÝ÷My?¯È[Q#ßîiHˆãþùP¸ù3‰>•wd— Âï—¶ýõ¦Eÿ<ÇŽ~¸Mú+ÿõúîÎí¾hcsCAÂïð|£¶nü:Ö¿^?îN>>è‡:¿?“èü;|¶IMk›¾dö¥€™²ÊSBIÙÜ€¦ËuÞFœ¾OVr÷¬@*¤(îŒæÖìM{¦‰ Ô¶ºX”YÌ»YºþÒ)ÕH¨9íâðàïZf^Ø7ùÄ»XN)JÇI VÒðÜÔ¹Q¨¬Í ”~bF†ªp[–EÏTM‚ù‘Œž¨ïQ㿳P¬(ÒÒ£‘Ãâ7Vî8˜‰æy;sæÐJ„(çÏ|³ ¬¶…–I£Äñ¸,ÕV¥dX¼1æs‡EC£$³Ð–%çBÉ…Þõ"“ pEпÂÎËû7wQ…T‘ƒ›£f¬§y]»ÓûÉæ/Óå†äið»ÁŸIfzÞ;™Œ'ö‚ܺœúÙ˜%>-5­Â¡65èA1»«XYN_•v´¼ š4¯ÂÆFLÎz%Îfà_g››(ñÚ7 ²qdb¤>D$È‘<áT&B"›~^µ AE.–õY¦¤ú €Æ¡)Ñε“õ®"¤Å¦ÄùUÌïjAšþ{-Lü•“"DÇR´!ž;Aޤn¤¨OY@#-Mî*ôð«"3ê(`¹#À³ sbÆ)±W¢œ§+¥:~@»°2iH5‚Þк*‘é­ê‚‘4²‘ÄJòbáSå„Ä&lóy(Ø>OK•°¨cX‡ŠOÂÎOÉ#Ë|¯Ø½šôtÕ5jêíÿÕ´BcB²ñj´#bxÖin©ô‘b8ãšip«‘cŠíÏÄ-ôl­Ð·Ü}p|{‚æ–®Õ*#Iµ‚û† ‚Пúy­3`4A*a¨´-k‘Ÿ*ÝÞTKPÀ¹ý¤µF•´•OÅ!¶Ð;´#‰ì‘×wªÏ¡(Æ¢ÏUÄ>P½"}£¦Û¥ÌKb©ªŠ£‚MMÿ„ô²Îø®ÆÆõ¹Œþ™DçsÈ7/²fÂJ`S–ŠjIîJ!kb!·ì‰Ž±äú~¹Âv†æ«†ORQëð…tùP|%]îÔìeÕ.Àj©ˆ7ŽJE··˜D)?ä5Šõæi‘<ó¤z[ØÍ%˜ï˜bTeUù)D¤ôð¼À…}ÚtªbZd‡‚GUX¢ëU™i®E]X®"´?Z†&•GŸÜ¦9Ø‹ΊÐv—¹{þ„óò¦zmSIiÛõ€³)I_ ó•L²J©‘*­i±\#Ó~¥¶ñ©¬límm!‡ŒnD³)ð:¹Eå>ÆýÓs‡½Æä `·^. È °m¨L`³=Ùû¥ÝRqó©¯,o³¸À×”LˆrÐ' ìV˜<—JUÔ±’úúG&Òê"•ÇôMòqôZŠÒ@6f† °¯=ÀUe^âÄ&™„ÄÂÑ-QѨ®Õ¥ •Jw{{ÿÿÙ»²ÄFr ¨|ÿ·Ð$±ŒE’ÒÔTg9åXHû{pçWz ÉÊkÀÄ«#œìÔò½¶£×P%²/Ëô9›‘‘gsgÝÆZ$³¬)ô ËÏïf~Š¢@슌k ÐZpdbzœ•6†[…½¢’âÌi3m9VÏ_Ü)þ¬Ã‹µåôa…ÂVð’´eH“E°íICu“$•0Ê2¶Rzý×}’°Ä©kQ¥oþñðQLM,Ýáø—¤¨nQòIF=Ž¿™hœtm’Ii—P÷¬þ:-…uèf²ˆ¹pÓ'wÇTI9·É›¯¤“((†ÈŒ8Ö£îlö ç§Gó©sw(0LEÍi‹èÓÔ„Ö{nMë}ÆÆ*µÖ0 Ü¹OÁÆ¥Gï¸`>ur©+Tݱ’uûy/9\‡;àemµåÁµÙ£ú׳UUÉýâÔqÿ›q;jöÑí/üümÒy5ÅéŒü¯ŸGû¤)O&3-><®OYXþüL¿ñ|ù[FEï½öî"zÂ÷s4­X7lÎÄcë/x)‹½ŒØLSP˜âBuH\ͬ¬ý¸·…Í+Îmr}¦Ÿ\@EЄã'†þ N7Eo¤|T¯¿£ßGcÞðÅö/U®g!DÔ€O‚ÑúÆ0(îô´è–²“)ÁÙ#”°P*ùÙÕã…Œ’ +ñŠH¬Q–Î4ÐøÄÎ8nœ€éò³6=ž½ŸÅüë¾i½Ý¦$ÏáƒÕ©ÃÈS`Ëò¥»‹¹dVû§ÛÑ:QÁ¢.Ç0©¹@öDdã¾+ëlW;ï‡X:7u¨£K³9öŒ‰-4ˆC É´=õÖ8ÍúYx<Ôéõš A¤¤U׳hÈÒÜC¥xć٠îtòB±í0aƒq7EK÷8RŽzA¦QHŸe>Ã특XTץѯtôóBçMôöšî›¨½Kœ  þ—ÍÎ¥@ã m+N¸°÷þ£‘]ÚyÉج (¶ÑŽB\S=$Th@â¦u‰–wDÆ#Û=÷¼²É9:¼5Üìøì¼@«µçÑ'ù”1àLBõ~¯ýcqpf”¨ bwäç''6g8¿ŠEˆTŸ×\\ô÷æîY;`§ÔºÝõöw¯D~íh×%›Öo*ýÁõO&BHƒ’‰Ôæ0úuZãÝÐÄ}áÏÈÛ 3rÖÄßÔ/b2£@²ïøZ*&Ñ–ìÒ†ªqÓ\¤T¶ ïí¤w‹Þ¸y о˜ãþå$v˜OÉ^?Ëk~Tü5R£­ w!˜æœø«·©bµ_ªÎÄ"tAs6%Ø)É¥Ëù¥¨J2 ZÄ䔸)ê»ÿ—IçÏ:Š…&zë ÄðQŽëoªq`ŒAP/‚½§‚`þáÎ¥¼¥6=N` åŽGçÑUÌÉí²ñn2$4qàsãÅü¢7¯´ÝÒdyçäe9ƒ§·ÞÄÿ v—)e…’ÊHzA=:`8Ðqeu*ê´øu€óáy)½žÌŽ¡ˆ;„NÓR#ƒLÒÆ‘j  ŒñæN#ˆÄ‘Ítµ¶;Â(\…­z4dðIJv&Sœg)¹gïd`6_)W“†EÉ3fÓ9É’jÍùjt.¦Sj1–‘õ°ÔX-ŒBayϲU’Ï I¿ò "Ú䊒^û –5cà^mß]sþŠW ¶‹ä¾Éß=çõƒ¶yÕ8Ö¨­j­âÐ8dµ)1Æ*;, ²_qê !%œ°Z;¤«éþµŽÂE%Îû, þDNJGÄu™ž÷Uð9äÖQæÜ]j}òfËÃH\™ªÁ}Ⱦ»œ]å¡Í]ΤF;Èzv'àjoÔŸAI`#ÿOˆ%r*KãC±§´¬C"fÖ³ò¤é²K–Ð\÷ØuOmRéŽÂ•:•‘ìi¿Ëô5Ža„m —’Û¦†ÌYt3ìÆÙSÏã5ý§Hç½>±P8S^T÷˜ÌðÀTÎU9_¾ ¦×y“"ýi‰årõ˜o­áãd~†€ÎG `~“NUú²èõú;JÒy÷Ýú5˜Ó§ï4ØŸ¿~d~Z[hó™Ïç!Ò«ªKGÅüáìtÀ_ü¬"¤ÐÒ»øR9ùâs_öùkìQç‘gî.¶ C-Z;òT•A‡WfUøïµÚ‡fqåÈž^¾ý(6””ñùŒp F®u‹ê×X‰§ê>~Z|iŠÊSo­6DôF´øÙ[³ tÑÃLn°ß‚jºW·ø€¿å8±¥ÔHñÏSbE+ðâÐõ3VbIœ2 –lõ3ˆ.Ë€:•>VIž*ö.ß­‘ªmÔw›ÐâTƒ’ˆþˤó¦±xE ~Q©Û#-Ãö<^#æ ˜”% jaÖ òƒmÛ‰á\TY Å™ž:Ó‹ ëQä:EK6× ó[˜Hh¯2Ò‡á>®ðf×ízžê¥ ’ee'º©qv”Ý ý"ø¦QKÀq…ñhh/®¦È°tÿÁ”z:/õ0€ã‹£eø©U´Ëüõ =Ÿ¤Í„%ÜZrŠ\"–(j–aÛ±ÆÑÓÄðtb_=æ1“ìÌ/Å'òâñŸ|¤ð«,¢dê:b@åt¸ò4ÍSï¶O u¤Û¹ËaÓ¶Äu "JÏxx\(δà¾)ôXÚÂh·©-á'q¹:O:ºÙŽ;h?olxÚ£êvGo0€}Ì2FeR ¢Þ1B¨¨µêjFá·òÊd͆À)4”zëöוÍË–„{è ›À˳ V: YٓʯY0Š#3ràøóîK\œå~ê¤t§‹Ãš=ÀE yG<g‚ ë ÝWjcð±ž1'j48]K-µðµ‹™¬U…+ÈRU¡*NNá®D2ó˜@Doí…Æ”ÅR×ÇÒ+¦:÷UßæL²Õgxpç·D¶œÏëÃÓ0DT;.¤lÓ _H6q„†ˆ=Ââ(¦,é!·Œ¦äTyüŽ{'<¾ÀUßn!Á»º¶’–úÁ$†ØgÎ+ð†R5…¨¨íæc‡#üĦ¥ó(eB£Ù:¹Vc'ÂfH>ÐS8ö™Ik@ÖÐlA#ŒT+Ùº>"Ç~Zˆ«é¦ =µÄg¬@ÄŠØÝý_²ÎA–Z¡×”ñØþrGp4_L«XÌ:Є°k%Ö‡«¥é*m±! €úȇÇ]e'YO®vwMÅ.fEýS™pU7n„åg\áÞ˜QÆ”5ÜH… íÑuÜè ²<u)ö4-Èà‘g™£ µáþpŠ•NšdmÌ•]Ï^RÅEl$!å®0ѽ.áÏ,:Õ›÷‰Üê´ŠÁÛÀ‡[îüãB¥K@"€?6†\$ ±…dDHÝ”,÷…3TR`ÛD r ïäN7~ôôõ€òqL+ «°_Ž8lé¼Þ\ôȾVKDYÙ±¯Éãñ¨Ø_(²+X'p'üN=êZ­¡ðÖ¢q$íôãªöÈ—áêÆ¨&@è²`ÛðÜ㢲i2žôÅŠ9üf€'á3˜Ÿu` ku•³ ×+ùLD¬!»b)EŒîܸ$ëq‡Ö:¶YwãØ®E®÷Ü„¨a%xœÞç | `ù@‰ám2B„”œšE;±»$k·Ð’j ÌÜ]{º Ù|ý˜§‡3¦‹ˆk³£´H¼5Û ÿÖ¬€ÿª#Cp)6ü[¤­ÌK%¬Ž¡¬:eÅØÀ8 h÷—z]ëf;kÇå©O¸hðoq¯OÞO± ‰€•<›nnBÍ}S¢[Ï!Sát‰¾úËŽüAõ‘#â5™Î¢¸Û|)NbPYÏVΙ‚ (ëñ×¼5à,Lka/à­¼Zá;xßé¸ ðK?dlÝ:Eý%k7 $Ù&Dκ– M_íšCã´VH©Ã(¸ÙB¡7w~µ g¢˜P ä¨Õ™xß$«Oúï¥9®¸ø6£ÔÛì_çö{É®¿×øoÇйbȸΠ¥ú×ÔໟìÈjàÚ—tŸ#FÝs·§KGBÄÀE¯Çöõ>l“Õ—d žJ@·-.·¿/.°À[·ðë~ÂYMŸÏgeÙIÌצù=̽–ì²ñ¸ÙçÉû)DÖÞ. /°¡,¨œ"6¢üQR¸TWÔ‰¹'Ì­‘E¤Å9˜d`µ-x§&3ýèÂö4+Iœ‘"EÁûµÊ‡^¶Öò(.^Võ^¥3ãLx2„8æòÑÕ*u:ÂzUðŠÎ?O„å­ëwŸg ¬R}oŠœLëi}(Ëoûø™¯©&&àãdÅÏãa¦7¼”´ªî–G¯fébNë4ËW%¸n\ÉÝÃEk¡¶¦U’ÿ ¤ó/Š"]¶òcdÝ8@Sm)±ØhQ @ˆD»66_&§¦pCýbKn`G]pƒ}7:*ãÊiñ51šï†€'¢0xNƒ~D`$r\0²Ã¢ ¿@¬£Çm'[õÊÁG«Ù(€ÈÎWóaëVdí×,>±N/^MÛ¥ÏWw°ÿp”K¡<ŸÏÇãá¨{DiÉäs5„ßDnl¼ïˆ,vçm7DsRðA‹}P½Ï?†î‘w9P“èRY£1š¼“oð•ýÇö.åá¶÷ßo»RsxÄB¶šÎ¯õÝ[„ˆ7£_? “T¯zµd[°™ƒEœ?,™¨SŒß<©§•Þ|äøM+î•5ø]R&ûM4*ía„ËãjŒF=~ÖLoq·{? »?)óå%Y¡àÚÝåt¶Uð€½ Ÿ/›‘!"rroòx¹|\vâ:Êœ)egP€M7£Û@ãÇ/óêÂä}7€§wÒ-næ´ôÆÿ]ƘU²GwQ"Ò§¨À“ €¡OA†*GChe]м#A¿%JL\ÓŒ¿!h‹e×@1{îí9 à-n¾Í\2É×sQRÛ¾—ÛåC„1aÇd&4(ú8ö¤<º í¯EB1³Ï•àH¤â|*x(®¬àþUH`â8„ÈãQ™`áS炱®1)£ ‚ºÓ­p¥ª€þ–™·ÿÄAÄMÝx5GMu‡Ïxxµ»-É!)OT?ÚÀû£¡–Ú‚!ìI4AwÉÎGªËæä1u'Âãé¢$'KîF/¹ aûdG¸E{”Xm˜Ùy×Jø‹Ô(ñ ÊÕæxž9Ú†Ü<ä jÉ Au=¡ê²M¦Ñ—+³H g¦ÆÀŒ¬zyX7z.‘àE´™e+ÖÊI8!7FUJ·&!80’Ýr–òËލÝý&¡««kä‡lHùØžWd öÄI›[¥$ žý^NÜ$ú”$³K‡ŽÝØZmÌ»{2ÝŸˆ«™ß °UòÖ;_ññ`)ÌMäSn ov ¬ÐåÓfë àSaQYÉL©à'9am‡š5— ]êW'o2¨,;yQž:ø“¤óeJóDJÚ’¢$q AÏ´‰âñ)¹_A‰¢;@Ú/YRÔ‰Qßð@x@ÆN©^¯KáL±üè³;•Ür}‘""Nw‘rìhYʼìÁd¢ÈËZ?7ô–Û¸„hBj¢‰Ú«IOMË¥D]ñv²âÇ·7ä|1 W ‚OˆðTº3faY0#ôjÑS•ý~üü“"¼»+ŸÞ†8zšŽ3/¹:PU#äûÚß‚8A@A3?Ó3TžÖ;½‚;às9:(áB„UxGÝ‹¸›Ûñâãŧߠi^5g¬ºÐê/7;˱UUp8oyê¡€þíÅäÜQ]òÂrHêjï1‚ÑQÕ•>ƒ€:Ž!BœU{²—&D€ªÓUºD£µÑloðì_p#X™òUøfÆ"°?"ëó.óÏmH‰Ì꺿õ‹%zí¯}JZETí©§Óø U º@æž?܈€J‹Ý…æE"ŸŽxQŒ8U˜"5ÌW¬¾œÿ&éüõ?wE×"~hvÇþœ2¡çö€Ï-¹Êcki©óOYÎfoê{µ‰~íýò…)é<Ò¸à`Í™±_ìàà-¹·ˆê ¡íz 3Fw¸‡axà¶½¿;weO ~Ý‹C´ ΣËÍäù8FÑó–¨ãp|Xœì¯ÐEbÁªÀ×Y½ÅZsYùQ¸…ºõ|ÒL q¨î…wý(аשÕ7Ü,k)]ð"hùøWÔµø0þ™;Šl¼mKÿ¿x>J¥ùà ÏNeEDGÖ¯Ÿe4÷ö !½ÌªÙðÛØ ¥žvÔ®Ûå3¶²6⻈ELV¥´)oóÞãŠ3`抽 wâŠSÅ‚¸æÃ\¾ïÑÖ¯¯À?ä¼">ra Uí`”H§ÜÃó) zeë\êªü?A¹5\ÚM'g¦;ãCnq:ÇK²v3Õwø ŸO:GÀ8t|ÎpqpKzfF›Óù×bõß"Ñfn¦m%µa„Æó zÄ€Eà…]RÁGvL—§u¿¸ÎúXè8œ„8´«Úµvª&&€i<•`H+Bl@Xº_%I'É\ÞyçuIðžó˜ß#L¢©¶ónMD;’kjd«Š´SêK¡Mr‚íL¼¡lÀ †Ê’TØæÐÓ& s…±”ã‘mlðw4á—6cýxf¿K[ç 艼‘À»Š“©ØË†›ÉØL¦¡pïU@Vô¦ùO\ááñ †æ&ÒÙKO U>V.bLŒÛå­v8x¼b5Pp°¿ \5Ñ7UüfÕÜ4ãóqý7îT›µ< vÓ”ö>òÕŒÎ;ç¿…%íäyiN4¿¯ùøoRrâx_2ÅŠ2ûïëån±'”Xr–ÁÜ1v™YŒ×±ÞÝ= ä5•¤LÝd¥IçÎõ1:. ãw èé:F B*­MÓä²už]©°¤‹ÞdE _‹¼‚HeE–B¹þ­hŽƒå UK;;“pÿ g™Kï–ÄnÉ—‡Sž*d ð@îKæ8QÁŠÍ:9„tȈƊY½)ë ”k䳨³¢(`¢šÞsÿŧЕT$7’ f’ O~mö—¤NfK‰¡3‹6/Ú‰C{®–³´ÙcîÐH­2凌ŽI={ÀioW¯Vp ”ò¯^ÍR?ôÀÜ{6 –k4ðfvvèDIOÒ¾ã&]äe‡1‹S®ÄÇaÒþ*é|êçpš£ºÉX¸g(iw*h¢›fg, ]”Ju,%N‚™OŠœÜÑdP5󘛘bŽ™  |’ÑoPExÖ˜R3\S4—rÀ ÜÍûN– °I,z@Q¦Aª2U@`©“dé{Ãþ±Ç¦â|ÀŒG>H{M¢AP£‰ñX-™Ôê½ML9QÀ‘i¹d `â`Fޤ‹7SüœÌ´È‚R¡SX§Ò1¾ÿT –ƒâtìÔ)×ó@8ì:X´[±y"•…QÂÝÍáÀ¡V ’Ú¡’™9å$GöÜÒ“žøÄGÐõ–<æ¦êu|Pµ'’%t;-2À‘ºõIe^W ¯è6”Ý×P­yæfüÌ­¦á¦oq·E&KÌV Ý%à2@a‚´*$iJÿ°RPœ£ gÃa€9ÂË“'€@açµ2!§p®“•ïÇ'ªôÙ<á8¬±]fÈ=;`Ù|Ì PÕ]$F¨¬§ªêÝŒ¡Ëä7œdWh“Äñ->ÛÒ¯sùFÇÅÄz¦Ê6¨2áoÕÊ+6ùa cÙ£xÿÕÖb²"û… ›Ó-Ͷ<Àø;ÖþH_W '2®Aô%$"…ËP«=K:ç$ç`ŠˆÈ¤i\Uòr4-‰:y G†ù3²˜Uª«?H:7‰ŸŽ×¶ <¬§îÉ>ÝÍé(—>?³e&ÅKØgCø¾dèßÏ+Ñ›Œ”úÜ¿Ž¦ÿS²”W½0: 7óÿ|à²ÞEk÷˨Êäp 1ð)‡îÆÕ£…ýfågîgÔÉø÷>Tî…¼‰KðøÕðLôúN7¸XÈÏamo>î7ä7η)yD>Ÿ` §½ük¯n¿Í³Ë·»¸ï±€goŒ4½X|¹l^ë÷ŠQ ÿúº»H«yéèNd—Msü~>ÙíÖÖmwi\ïß$¿Ìy1¸¦¿ØCbâhåEø‚ê¶áQ¹˜OÎa+‡Fƒ×L Y2œí4®ù± ªÑŸ½¨${ûÀšìúÀE ê…;~ŸhP8´‡Ô È Áy ± nG€‹[wKÝ‘‡%u»Ì Q‡c–仕'c¶Ëƒï$N6*Æw轨T\%t;6iRF®®lܱaãûdmÓäŽËvi=ꘒ(²W„_MFrHýšû"¨«6d·¹ŽB^”¨âìËÞ´œŽòi@âRÁ¸ä6mÉêJFXhÐŽß?ìk*ƒ†,fì. VR½£ Þ²Lü zn±&¡+Ví¨tŠô°Ì•uL6ATeó*}g²@êœ(h$^¿L–§K 8ŠƒÈh±½ç•Ñ4íHŠÇÃÚM—¥ƒ¹*9àÖ›*]„Áy-Ž˜&¬³WL LDßãf,u+$;|ÝsoŒ«`)& ÌúêÃ"y«¡[Æ·œ’ˆt§©Ó2÷Ñ⢻D\·,Á3òv"¬½¥[¬¬jr¨#}µ~[ަ$*5þ;—eä+I¬˜¤;wUÔF1%?‰ô˜åÊÈ_|û.çíiþíÑÊV ŸÜeKüöbrSg1e3Gè³×ƒÅú‡Ç=üÀMƒ1z+ÊÇ;”¤Ærcs‚]&ù`ýY‘ÆÄN Šns{f‰•ì¨p½<„1¬¿’=ªññtƒL“Ý,b!["ó‘±ÙT´Š{v]-ÙrHÀWÛaË%÷3òd*6ŠÑܹëgÞ×x}Ý~uóEùI9S’³i½¼3Þ9¦=ì“ô=Að‹d€ˆ{@§2ªºÊÊH8È7"¾/ñޏT½¸³Š¤¿ô‰”qο&éŠÔ‡L”–*¤Pc¹FÎÄô¶V_FPŽ?³A%¤„?— ÊÃtnÑøÛ¢W3 sÉiH=·!¼=z=Ÿ˜ŠÕ‰ÄI"›ãë N:=Yì-«—rSÀÒôˆŒ3¿È&B`79¤ü9m”õ[öÃÈüa(s쎷­»GVì®ëˆs;ϹeBz¼I¬*é l5ˆây”T¼0F{"ý š¨~¶;$ÞzÜ©ùeðOÉë YMXôã5a›•ází]“`¶˜{µœ˜EUJ2—‡$ÉÉ<"‚-¤R¯X/áÄDµãÈ­Û†±R¯0ÿ,ØÉ¹O¥éøíßæµ®<ŒY¡Ži#í2+u°UéîWòSïš½ø5²dê1h•iÈOé*šø:ê³°•¾Óé¯Û˜{>*4˜sÛDÄýœáÝ:ýÊ­tÀ‹ù¦“…Ù.u\lPg4P–(æ«á& L9#uÝ …OÁ²Ù!'?±](o”Äó? žgGORÈ{íxà*j•s"ð 'å‰Î @’žÀrüé& ãÐs})gÔ“ÔØ×Sj¤$IÍ2æó/N¥6«Ž%:Èñ’]@“Ä?ß ÊÚ¤lö-±) Ð*£iÖbTÂÀç¹°U^ÍdgBB³„Îý£‘k3Öeéñ ­3èÄD†²|´`€@ïºäkTBãÐêÚ—«Ñ3©^D[LÉ^*Yà @÷®àNJ†ÐEÒ„G«ÂÓ}I5kê5˜+öIöñxø´HUö €z’7’kè 6P &æ0"ƒšÆ¥ã¥Ó‚Ç5¤ú"zÛÏG†Vš…Çݧ¬i O‰})úÙà´#0ˆ&á†@¡éœð‡1oð‘騀¼a§ º‰¨¯ã¦“Lü‘Y+ûÌì¬mùâpMï$5b âÍ}8?æE(ŸA #s}k ‰9U”}/ +¶?£$8‚:ß6Èé¹ø­%,E5_ÍW@† qL…Á¥¼$5-k.Ûkˆ‡Þ†l ` ý¦„-+8kæ… W}*!Å&Pm"CòIôsÆ=’}'ï¨zoM"9)ǽŸŸ¿®P1QI‚9+ŸîUG:—ñ‡W*žÞ1ZpÅéAž?pšênÃË2!ÞM¥´Æ„Ú‘M°ˆ"¢N¤Æoûþ ¾Vß?©Ð‹%Ab¬å??¬]s}# «ò¤ØàL]úb¥nǺù ®ä™@'à2‰8d9\×Ê­"ÿ,é!îŸÛ°{q ¹Ý™x]æÁºÄ‘ÚQ/h-àRgÏ%í yuW˜\ÆYL³Ýn×ÕW]UåÐi¨ÊN©g¡˜˜“LÖPVÄ$¸Hì#sêuÁݵô©ÙãXpúùï·lÌù]U=väF}Â…«Þ+×äQ×KÒéÂéãÐM;0HºJ†˜©=¨2˜»À’gŠ8Kq^ÉËá’È[’kxkî4©jT2ϳŸw zG’\Ǧ4C`y5õI.»ïäH5™¡§ÒËz¼ÿ¾ˆ¢v˜ÍáCŒ>ø¡üðžÑêKW:Â…ÄnÅÓ^m^ÎóŒiÀÅ{/{Ñu´[˜©‘»By‚¸ÖóZ¼˜é9ò~Ò/c0ΆÀ-:m&‹^ʇÆÅe•?G:¿5ŠO¶UZ¨+”£Û¤<àËŠ1à%?ðý¼ÄŸH9£ñìå¥O_ê@S#fÝI~óç·P¡Aÿ=Û„/<ƒ¯Ö¿WQ…ó-¯{¶õ(nƒöýÜpäÏ»TÐiÓ/½õ/€C+Àßñ4ª+jòÓÝ¢†¿ìŒ ÀÇ·¦þB_ˆ#{îÙÓCµÌ•Œ_nœ¯iþ~¾ŸTNXL~Éå¾”S·ÅeFjY-t  ICüŠW]£êé3`S­W}Ü×øŠ¿štþªèÐI6EܶÈÆ¿ƒl¨S½ô ðÖÓDÓ"¯?­>üOõ ¥ö´üÑØÿç¾{á(zgw™RE²¥ C¡4zÕi±eŸˆHG¾Ú&´|&Éq~(D| >y²^õ3£™æŒ'{/å»(: Ö¼4äyjÃÆ4hçŠPý¨#ò¨6W}ÕþúŽ/Š£y¿|“½–jJ:Mw&²1ªk&i@ÖéèÇ %ÑR@nՋ䮋ƒ•ù®^i—M¡œ5Ûzãôìò¿rkذ®ý³6bR•p·(û„¡ö‹d „‡´™íÍYðÃ’Œc½*ñ#YtdŸ96ŽÕPòª×ZuÿP;óæPÙÛ)z¦žO¶gGÆT†-r¤ð½ñPéJè-E ­C˜é FÁN(­ z–`ÑÖCAH>7.;uNÖγ±xñ_Q§ÛžôØj0V?ù¬Q§¿2ëfÎ9ºnw;`ΖÞ ë’ÆNÎ0¿""(Ø€3l:S7”ÖŒc°ÿ‚LAIK¯ª£"È,Œ|H£W|o€¼ý’€XÖŽ3ñ˜NÈIÜþp•?bˆMHjÒþ¥ZlÜññ èÍMþë*Ù‰–†%¤¡p'ƒçœ ‘Ý­ÌP²BêÐ8·3*Šê¼D+í”ËŽ(Vcÿ°¨+uPçÜ•º€õE§qÎ6™ð-`š]’ŒI;<«É:£«ð–EeT-†½¢vˆ bí³²G éÒsÖ=<2âa\EYQ¢¹}žä6%˜´p©Îê-û­OÓ­2š?‹i 6íƒ& ]‹hODt…èÅTd®Î¦Šî$.rG²öÍÕ¤Õ©ŠH9¼3è,xwL18ÒÀKòã PDÁ”SWi²¹ûº!QKoiS´Ó(átkoVE ïíÄ;cé, ŠUÑJ“ ±ú™óÙâã-ÚÈ·t—<¼DÒ8ðµ²]C·Ð×ÀF“‡i³pÐ-EÖ†FÄÖ¹yDóÒˆY!€â×6: ߕԾcÅ;Åy`Ö÷eÀg®Ä¥rŠ<~fíyY(í˰^™G‚¯0øû/Ñ­TŒcó™ØSï[Šã‚ç³”wÓÌ-w9†=¹[ÈNX‘ôY`ÙO§Ý$”;7óþ/p™µMþ<¢pÁ ™!õ2„,o÷ü›Ü½€|Éeå®±ÍPä®Z2+K+)¡²¶9)_Í)îÚä©í,ò=”ø Ñ6»ƒ«k•/ˆêoÈë ÆÏš§/ÿD4îitæâˆæyÌÐF»»6Xºï!ñ7­žn>'6äQ®%þ­m…©ÆòžÓo©YÞðà 2Æ'?›þR«²ru1í¶Y©ÒÑRÑËØ5‘Ü'°ÓÌ(Êfä6 Çh¥Ò>wJ"K?Þ7k‹¿J¹DÎÄÎKݬÏŽq‘®ä5Ë‘•Œ³‹˜t¾>Òµš=¿;åó±S( g”½ß†âJʧƒFœù,S]7Ðm±ˆg.ÎÞ¢@ùqëʾøƒr¤ÀÈF»€C‡`µi(r»¯yÛÂù[r®}ÈÎ$вù"xÓ}k”s  ÿšEûeçñ’a\n¤[ÕÌšÑʧ/?@¯çkZ•ù–ÉÌ}¬à~Þ"óAK·Ý\ÀêA»j¹°;Áoèæ½yÓ;0gFÃýönôßMªBþ>&­ î„ª·¾Áhè9Ð’öQúyzÄÊø!€%SÞâr›:{X£xshÎz˜—s@Ýn,&ÚVÿΧüî¿/ 8€ùEÙ…wíÈùÃ’äY ¾_¿O(ÑM7¯¢$öµ€àêî˽LƒÓÏ'¿^5¡F«’Ù»ÓtÀ…xÙçÇQ—êp”ÌÚ1]ZT#§IÎ\]·VÛÿ,^Ät çª=²–ý1šájüû‹(® ê0+§á“ÿ}D|<Ï糎c]Þc {1vŠþ%ÿ>ÊÝäEÅPïð½‰ ÈÆ´&½*6¬Å%í¦ð.^h¾8:…ÜUÒ½·¹¤¼­)‘“cþ+ë:Óïåg¢*šÙBmN–Zíä½ #yíwÛÉ F©Hڟϧr­ZàÁXìú£e:bÞŠÜw—…V£…†–z§ÃŠ¥kŽÞL÷ÂQ/;:ÁÃ\p阷cgˆåsÔ¯°Œ½¶Á4ƒ4Ý:ÃdˆzÑó«OalË!<Œ*#þ»½ýÌ@ö–´nNñaLÔBÛLOÒÐ ÔòÉ} 3(ÏWãWRyPãAßIššøÈ+Ž×'ósºñŒ HöÏ[\ÕËŠæíÐ(vD|>ŸÕòïøí{ryPÑ¢9oÒ(ÊÈT°ãÓŒ¡ ì®\6Út;ÅñËh&oø ):þ„µ÷¥C¦vÙo)v¤N÷:äyN‡¹¹¿s»ÜÇc¼¸‡²‰<ônt›ð²@‰©WiìÜ{~í¤":“¼*…Æ}x›¶äi®¸\. Á`3¼ê"‹òí ò«Iç¯÷g8w¨8à+5ÑoX˜„Z’ü,™Ým•¡4-ex?™aÞÁé-= Ÿ—èGí:ò²e\RÌ4„"@ÅÕir„"‘Ï~²Ò“U`RŽ¿)t ”ýÖ¢¿[ÐV•&ORY³ÿ…jªé@ð ¹ãRƒ5Íb ¤åÿi?Á¦‚G*I‘9&D:s‹e¶¹ pC¶!¡|²õ.T9ÁpMS Œ çš,vÖY/ iÃ4rê>þŸ\@¶míŒo*¿ïß›ÿt½CtòÔþ虓 %ЦQjž=)Gm:¶k‰0×RZÕ“ìý}Û™Rˆ~¸Ì7ý^aQ ò옃[Ú´L‹Õ„BæÜŠ\õånÎMœ9ÊJHÖEð@¤Ç#šƒÂ€È žmT;þÈ<[÷·´6 GæfàZr1e ΉCCÔÌizb-»„Ýî‹X",•ß  Âæ=Åjš8÷ÿ<;•ävg_b™»šÎÂ3r:í Ö)ÃM¾ŒÁµ:M²gd…ûD‹a“aСž³bpQž3ªSõyã”àÊÙñµÅòøÎL/Ïéç‹Ç¡jÑP…ãDYVÑáíúP”‰œP4Ùe‰oʺß*lžcó=Z ·ujWss¸mþHæÃ”üëÔ.«µI!Ç&7xh¶ uBª¦€XÓ¦é"”žtLBæJþ×±ÑýÚ¤Á%UÞ7Mª°dIi$óxšzJ—Ô;¾¹M†Ôê7e´i:*㯓Î_P^’×7‰ ±ÙöûÀ˜ §(/¯Y„(vûlG5Ì´îÝöNß÷ €b}ïU+’§sY¾Î1¤]Ü톩ѪùÜóø<œÑ!2ÝyFò¤(¾ GI‹¹ŸNÏîÙg/¾·FãaAºœ®„®Õ9W lEG±¢£§úeÝÀ™çä%Š[5´'¥K^í[T€AQ Ëa:ñÉäÓà«›wb7OÄ<-zàjgïš¶Dñ€ðî›î©¨ón?ÊÉË&àjÑU¬g?¢äm>®®I.Óè݋ί vJôš\ ³ ÍþG“HjõsáwS¥*ÓMµWD>G§UUOä^‘•TZX Â!Ž1^Ö[Xàã>{…ÒªÒawnÚYƒç6*‰þ3–åí€K¥…ÞþxKTk-në á"^JšypÍjÄ€À]£Þ˜ø:Å„ôúC·¤¨×åwr”¡’²" ó¶pL¨!âÊ{DàÎ_«‚˜¢ÞÓ{ߦÀ¦sPîþü~Õe;*µò‡ÏËzÒD“0ÉÜýVÖ&«î›bÃo*åž?Mœ](ІX£ô‘°ÿæÀ›uæá$Mºq”tïš|GHBu¹²‹j]±Ù¦ÏÑ-^ǶT°sE¯wÛLóIà·j;9Ž©O®%¶ò@t¸Ñczûûq´ål°c’Je²ò¥púõ~îVø„@±¿,èC‹,Ò™ˆ0Y#Ó'ûR·öÉÓϺËdhocS…QÔD°“4ö€³ªwÇɼK° ù|ïc‚‘•Njƒ@¢~3N™Là’Œp¤âê„WÝ—Ù aÅûu:FAFÒëf媞…?u/XõùOú{•Ñ÷Eû/Pߦƒ'cO:ðŽÇv§ÜëMKP¹¬i¿¥ÃDOõLœênÅÓ:mI¸Š·ÅË'¼¥5#±ÃÓ&C£ó;Âø ¾e1àívØUb¿.×±Zÿ’™œx§È ÕþE3¾zß é|ŦSÀè(ßÂÙͶ$2J‰°ûÞEc9Õ×:3°|æ©™pü+›s/åú#ó¬S[¤œ§¬…ÞóM|}íîIšöHÛÛ z©ÒKqÔ¿ vÇìÖ~G,¢5“>èdÝP!|“)d_Þí5I@N¥¥£…”XIy?VtÈ€Ovi ‰¸g/ÊæÆÊÕÒÚ $úä(Ò7ˆq¾ r¼â/*šõÖÒÒš/6ÁA% ’ÆI•²1âG²p0ãÜ«&NBÝ:£-… ÎfDSÌHކ(xâŦwqˆ…]¦#—ÕjŠNr. Q1ó±B ‰ì6z=ŒÎˆ‚d<æÀÄdz}@èRgØÙ‹ÚÕW‡ý’ÉM% <=FYƒà'Ê<›%¾ŸPèô³Á+uëbÑý øÚ¼êY JµÕÛäÓËÖ­F5µà„Ô{uΉ'"»“B\¿ Ö Dx>A"g3õKÓÏ)'Ãñö;â&ÐŽýEàJ8‰ÉCª;sUHg·ÐJ~“Ødw¤€ù";µû…Ä¿ˆ;=Îöóч¥ŽñÎo3ì ßqEðåPmK-ÁÌ…Ìý7‚—eFSÀ®™5FIÎHHçã(È¿¡ a\­ÌÁ1ï”:™.Û¡ô…üüˆ¢ìœW<ÝÀIr”þÜ0¹¤¨ö0[,õOƽ´Àö™óßSçY¡á° {j÷Ý·¿<4PÔ„…(C®'2&ÏêõûДÄ%¾—¦®[5mÕÚf)kGNµÙr?"ØUϲÑGÑ×DÔI1`9 UGXùFŸ"ÿLÑÝàÃøòâ ÖÃêä ‰è&g-Jî,¡y¦Nrß–žôî™ Ï¥$—˜ÅUYZ¥°= ÆyQfÍÍ]z´¹E£YóP£ÄtòV⩬>:Њa¦Û!îž@çÕÛ“#@DØ­­røÝt„¢“Ëb-ˆ=mƒf{é©ûš:Õ;ê¤Üòà:èì¹:¢Ã×Üm•èièõ`dÄ›#m£}'.‰œó NØÂì#)3†#ÐÃ^ÕóN‡^̈üÏ’Î#O(Q(éjheдŒ]¡Õ¡èæU55…E3 \/×äì-“W6}¶Ëbua‘©sUñ/ŸA,:ì|Íô‹‡UGYì `úÚ‚Ä?Œˆøü;0U¤•nè85YEô™™ýs3@c|z]I²^Ðàsƒø`ù‡«Ï‰SPÁ®ªÕº•9s£iB9ýÛù}þÐÂ_4‘þ6©p´Ç‰cí–¢SC¬¢¤îyPP¸nœÙ=æ S@Nóì%§F·»Ç>h¥ÂwŸ¡ÑXп¿'àÅ€‡=;èη¯!â¼RÝCp:,¿ }Ù·IR/ çkÉBy¦r‰dTWŒv‘ÆDN0WÏG¹N2Q)TÊk6 =–ÖŒ#Gàu€@“¼–_\Éó쯕™ê•DÃBrýÕr@ù/ETl‹K`ÑgxÚláôÀž3#+qÍ{\ù;½)ž¤½ p´”Uf7¾ +uÝÇy@]ˆ.qì¯J¡,“m<ØN(ÍÅdüþQ§Ú‹P³¿™t¾bÓ‰& I2|pzƒn2µp”'ó5óõ‘ÿ9yðŽìñßå@¸ü8©€©E¤ÃÁVSÿçE-úܼê/=nN‘v.ws`ÓÕ`¨SùØÓr0ÔHuFÜÝäEêVqŠÁåpÆ— ›N ]Äf{0ö^¾W˜£ r\¥Î?Ÿ‡±˜Ñ؉`xº¶Þ-i)Ûƒ¨Àµ,<ÅÔ”\¤Çg<ü é´‚›ÕÖ±@ËsrD%ù‚éwÇ5ÇîpJ2—rO«Pq>Þ|•eq©phô„¬ºÞrD{}ÌZ½,Ñ3Ñ*Ùê_ÍU<´¥^¼Ã9Üëup ‹|%½ßþ*UxSZ´ïZyëzLQ¹Åñ,ØE3Ì><ÈM¸ ³}v®ì;ä-Uò1ëLkBô)ª_Ï·¿ã ðý/5éüaoÇõ €žOð­_µ˜! âF½‰ùÃ0öœ0]ÀÉFþ_ ÄŸ^45ª}ÚU KmR%ûþ&§c²µÇ£ñMº_{èO²MõL{Bžø˜'}z ív °gö ŽBw_bbtºé(‚i ĽoŒÜ*› ›,o„‹1õyðæZ)¥öïÑi)c;à¬Nu>NÝ®¡FöfUy0ò­Í`wшgGÌçýb‘W‰(4¯Y"Ny¶C,þRœ/ÏA,Ú{./Ö]k!®ÔÜÝqYz– îª½“,¡ö¢Ÿ«õÌ+óØÈãŠBÞ#Ð_’0N¢+†áƒÃõ‘Krý ^­]ÊÙñƒƒj€K¥g„Y´k%ëèæX·ƒà…RÊià^ËÒ–ïWt©Ë“.ÀTò÷ç1÷hÝ"9ŒúO«ÔrMŠZö_H*£bä,£ì¬°¦zpv\isÕµ")‹v^ïë}H¯¢Ãéz˜{eÛ”LTë@;3$z6_Õ„dfÀjv³¿itü±“Wls€ûd“ÎiÁáÀ-çÝMÝ…Ö—M£Õ†½èU;/¥ž’¡ò4èÿëØ:æëÙ¿›G¾³á‘!F~ó»@ ÀaaÉã2€FÊ'ñ"ëÇt\Çc ×)͋˂•¹4—ÆÛŒ{cøY4¨¸%KØÑNšÎ¤©_K‰ik²Ã`¸¶5IÇ}ÂL¨µ¸½Æ»]d€œû`<äŽþ6!S…Àõç'kx‹,ß’Žˆ¦+,ÿë"c*>ÞôîŠBV8—³_œ¦V5‘ô Ó$‹EÈ`ëky$±4 ¢ Ë«µ—³†QVV/}³(€ –Q­§ÛMŸKÚNæýl±—Lƒ&ÌĶòÖè²ò¶ÄRÉ÷y?(7þÞ­ƒTwȺ˜Q2UjŠ C®í#žmP ¶0 ἦãëä‹(f/‹FÅ1ôàŽ“H36¦ñ̃ßaBB®òÙœ- $]LkJ&gÔuþ‹çËWŠt>`®¬§Â­ŸãÆ#âË$GˆABTÚ %zº|C_Ròý•ñ›Y“,1?æ=]ÌpHT"Éí©ªN׳Å‹[1´0ï 4fÍËN›­(†ªbЩç*9™ÛÅnçØëP¨ên›9Iüþáä?·×ÜÌЂœþ„ € EëÌ5</¼•Ÿ\‡”E3¶}áù|*{ F.ƒFÚjT0¡„§qIç“Sì *3/³”ˆ¼UËIG[®µòÐq °Â®+é Eõªé}BfCuÌ“M/tŒ®!Îh•B wÍQ* R¥"RÏlº+V;> ÔBG©¢%ÓsÔ“½öƼŒ8• ‘Ž´mZéigÞ¿÷;˜-(ÂÈù÷šÆ0‰-GÁéÃ{Y*÷zI‰ŠJ)Aã…¢ê»7–ÿãHÞc=Z`$N“›%Ç w\éfðNú2ä¾Åöì7Ȩ¼¦[¤f©UçoC{MÒ>–”U¢¸Â½»>‹ ¤±êâT|NDýöÒm-Í÷BPYhì8H×B¯Ùß^Õž;[(‚t˜üù•¹2 ˆ2éNn™¦%“ &"â‘r€ßÑ%£ë¹ö»"­Q>\UJbDTýÍcrWžÀ•?Å0¶\S°=U-Þ¢¢¥X7í¥RDø<"`²ÆwQ*)HÆÙHßcòp‚©Ùê'ÞÑû>•'÷hϧd²øë_ ¿$èŒzªÈ›s0‹RþÚçñxô”Z´|Ï瓞Ï'õ¿üù»+ƒÿÂögRþBòŸÈkÜjð"&küE۽팧Ó~ÅÃCB„—Ì—‹Ü^*ªEO‹›/~ç¦{œ‰Ô“žÐ¯;øqà‚€jÉkü{s)¶ñòÌQŒð3k¿kСÀì–îVIn3þ)ïè™…Ëø®¼ŽËþá¤/þ%bYÑÕ¼1SýD—"ù,sù«D­ú‘¥âWP%¼LN$ßý¿V#|?¿!<Õ¥MçdÄÿÞ9žJ½ýÿ+CŸùlÒùvÖäHò+-‘jäBÄ'âãñ8m—ÌZ!ecŠØˆ @Xò"w¥R~vc.3­Zðñüø6~Gø4„´$òèZɂՖ±¶©>G¡ÃGIô5+ë~ ~({Øèö3%Ë(åÌaÙé\þ½ ïǨ€£‰Y£?=uÊ7â 4詆ä<ùÙ4Ô@q¿f¡q­2ÆyIµ¹jö¨;†Ž!z±UNÛ*·ÿí¬Ó8Œ½Bx‘m1°åzÙM ‰Gø1²ABW›Æ,TÝ‘n­ ËÍQÐ µH.ŠI‘Y‘™—¢àä V¨ˆ¸&z˜Âæ“«BícOíœ=äi-ÎÛ3ÏFØ)µ€­£Aà^à!Q—ï’wå84g\S›jP·§L»'eªéÛ‰†Ô)Ú bUøËÅŒn#±ô'-u4ɡǣÕatfÁC¯+ÉG¼©jä\@­PE}|tgê€*ƒ>O0ã!ç³ÇS›:j|ýÇŠpÆ”ÃAèGN?ËžW[ÂÇDèþ' ±Y;ýCÐï@Ä0c’w*¶çªrrúp'˜‚[€èWì¾ËLýsFWM“íÁª¢wq䇵ÿi&ïHúïØî‹=ͬmÆÃ‘ìõ% ¤"{¼šV™÷ë>vNZ£^e<@¸\ê½¼˜&¶M4q'´ÄåK º¼!^<#«¹b§Ì¬b6nµ iNu♢«ÒŸpÕzùßàKrGŽ'ñWs‹,ã£3×Pd~øUvQm¥õ¡Í¤:+Ìmxáz8Z±N™˜»I«‚gp$ÝÒWX¿},=ÍÈÝÃ¥ì‰iYÑY¦¦9 ™ç7U[l¨*‘[qUPKYùúŽw´_b@:­‹L+ü+¥/˜mèöíFTÑõdÄ’8yó~©Ô¤É}1f0‰ºÖ¬ST4ëñ“£W½ÄÌ~lǹÆN€ÒEs— ®ð&qÉŒy, K«Çs0½Hpp© ©'š‰ ”Á&Γ*oä£ÖÕÎô„l9qÞ°cØé§7ʩŇô^êù£Á]i»¤\{”œý!«jŒRŸNàäÒ1 tÉ{'@IBÚk¦(%‡eʳÖO’°¡J2Æ‘J>9vQN‘ Èu±’JÀj9y…cý˜6ÂF5°çá8Åô Ò Lµ ’¯¶¥Âu•tÌ–Êa) I–­s‹Ï–‹\¦r˜k5%’™[FzéœlÊI?üÀî·IŸ;‰ÓÈ4ò²g†Ò¹ñ<¢âcÉùOLN=¸Óç'ëѺ²–èIŸè~˜¥eÈ 9‰ÛAè¶&Xûnl›«Ìk9ãÕíÈÒc|.é<Ë8'Ħ«T™ã Ï¢`’LÇÌÖ¯øÛÛyo#Úç¯R=~!ÌßXqz<žÏÿ}—â¨úþ;[T÷%‚æïçŠÏ6tá¿ÿþû.ű»eÿeSÃwaÞ¯gŠQ1¦¾Ñå[ÉkE ˜æ»ƒžÑ·Ø‘Çãñ.ûµšgT§àx<é 0›ypùɅ瓟Ö*ueËi$o VÍégHû÷cm>wÉþ~~þ~¾Ÿx "¹ÿùß[™ïaü~® m"ÒùÍgS€æ'_fSú„Q9äó¢§Ž_jž4íã¸ÚRì¶Ì ½ÐõT L±+<‘.ÆÉ†D.±TÑF*24¾©=šÙŠVo²Ñl°3»–ÖìM—’iF…AÅõfQ뉰·ñŽk„ÃG){DÞŽHEå(‘±. ž ¶·7:Æol?(@B©Ưˆ¢9®Ê6¶£%Ž7NÀUÀM<ÌGk,úuœl”›bØúIÐúúÊŽ.ö*GÔòõMöË,GÜ-XšñîZäÜ픥rꃩE(a>½ §¤H³¨ñÿô›i>7d‡·M%u.ùƒj`¬•¼nǃžÒ*ë¥ü ¸(ÇŒ¬é¸\xfKwľœ~©Š&áã|ù]ŸOã´yGñ`Å(„îPjÇË»€Ñàze¤•Žn´Eߨu’F¿¡Ûp(³ «hwä·:²<è¬[`–³r#…¼ÞÇåp¤Cbð*4®(I¡Ìƒ6Ê ;ªÍxÁK˜†cû÷xù9&à:;ضçEÛú\U<Vl¥J`¨™‚*(Y“ιJfv©¿O:¿ê–ý¨¸Ã•v1«¬$³f¬µíóf’W‚ÝêÊL³7…+[Â5¼PŒO‹ îŽ#d±ö»¡).p…‰;‰l£ŽG‹Ôyfád"›‡ŽüU®¨ÌòRˆ{ýoˆ)8-ƒÊã±sHm÷o*]éY̪Ïs”|r 7ºb&¶'ö â'ÕÑÄ&Þ ™‰Uðš+S^îkLD¢$[§( Ö]¥4=j€p’®°nû‹pª¡ò,eóòØ,"Ï©CÎñ§-yÕpŠeŸÒÉå\8§äkñò8“$åáÐ FewF mß}üJS–øb:ÆÐÕ úU‚´ R3(]C(6A”}ê³4Šîr^ PŒªÄxIw¬Õ*<}.•äÏÆRÒòñœzvGŸ’á XŸ'Ä$Ía °ÓlB0Ðl÷Fµ¸f:ŸPâX>¨¦÷üŠ‘R ÀM·.±¿ˆK3ìHrþùIÏ'šùX94¨)Ìë6ú„#B³Œ dÄ>ï„+$Ômˆ‰x9ÛC;û•áXAC°JÎ6 ÞYS ÿÝs—¥Bœ|.r}”ÓźÇÚ%¨Íf¢HæÄ"K—Œ/”³'·ÍÜÖpìøJ=E/»g¸E%Sjû=Š,8‹³ì],Utb¶¢ž»)P%ž_­¸3x`ÖïU÷¾Ôõ“¦–üÚE}$„>4z‚yÍØ‰UìLèÆæûÞZÀ“‰át &Ì ƒ×wâ/ØeQóC`V}¯'•ø¬õvŒZyVÚTPºo^ø‹ü÷Ô¿J'çÑñÛm§ŸÍ£9YJ#ÓéùS÷6R‰héRÞÀøHçk~¾#-æ”Þ»ó‘;*Þý¹ãV¯‹ìRöàþ¼eà]ëÏ„á À¿zuÑêß=ÿòzÿ©Ï™x…L|¶N»vBÑ»Võ¤B«EþÆ ­4–ž9ÿKmt©0ƒ›¼6ïøÏq $Ф{w¯]¤ 4Ã5ü­rlèôå:ÅC€Ë6{ù8ñð åêÃKur‚êþl%q­D9po‹(¶ÿÿ^§åûùp_êBÀ÷ÓzÙ`´·'6½4àéL)¼ËLD½’Dújé» uÒùË#Z¾ù¬¤­êyBWOÝéÕù%8oA.VÄ"€KžJãv*axÏØÛ×”ädªøºÎu¶jcûz<;×!€dEËK¨ZòD3Ìdãú&6N$ ¢Ø\Š3r&íàÊ©÷oí6u.ÍY: ΄âÅTÖfܹ³I!è;<).Ù‘¢,å ?’¡îpZÞÁ=ê©‘¹ÛÕŸXLȾn"_:«fJFEC˜ä™ñ/é.oÆú2:‚‚Õ«³Ké!çqksjŒ˜M7ºqÚË—ÉÑ€X×ÉWØÃ°Ñ|¢‡Ö/¼¬«§aù»Í|™rŠG §Óüøï“§T}}>ÄKåEEws ßuÕÔÁ,ÓF½Z¥µt4? îgÞrÝ׌s^Àh—‹«'„ð|ŠNÿU+p 5àx­½—lôê3Óˆc¦FÆ· üvp¾óÎÞ~÷i©4F"%¯«=¡œ=É@²¤4GØÉVGÌK/È.­C0u$FëÃUó™%+ìçö7\ƒ*Èïô$ñCŸI­B71Ü ~,Ñ2ÈmˆÇæ½kÛ¿ ·™ ô×Aðc~b<Ø­¹ßSú®‹ACihðiß›Ö÷ÉôÝ:ÙÔ¹šgH&"€¹ÜÊ»Ð|™äU}÷ï4yã¿B:/ág–ÎyʶÕXp‡A+ˆ¸‡çÌ?Œä|¬JGüÈdµe S‚Qª;¢‘Ó«òH •.þŠ9àĶãGçæPpf*{–â j,¢à 6\Þy×½“”Œ½ÔèÒqSý%Y–œƒ(=Ïu’M!BÎb_m Ÿ€,ð~Fq(@ÓvµcbA5–] §-À¾BB:¤ ðfk0ó'/×’v5üI 3OÚe0iïòÅDQëõÒ‚XAÂþ$˜¨M›8l(±@Ën©®Ý¸˜$)çj™Çåd«s7Ûš“$øvÜõ™»¾`³)&0HƒX4 â°6˜c’ØïvÒ”£½RXÉ®QüÁÜ*ñž€Î$é*«RæJÆuS £Ø­EŪ!Ý¥¥1BÒŸFÝ“ê;›a\ZC\’.ä¬PXH^ÛEèýMá‡ÆÏ¨ñ<'ǧ'+ :€{M“IŽº Üí»h lbãðûÛ<·h¥S69͈Ix\‡ºU‰xØ`šêù—HçUÛ)íéJÕ´1É€ òJo­(òÑ»ÎGä¬ p[±ƒH?ÐŘ#>ö³Žp+.ÕŒ‡žðå‹bzÐÕ¾fµ$O¾ù˰)¶³5ßßÃó@/XÌËÇ¿ävôðC^+¢Ÿ×¾ý‹ŸÓL™ÎòbÉòÕ®E5Ý´5D/R”àJãâM8©rM â”:óècÏ{V;Ôj ‰Lö­ÒÅ Vöo$öõഺʃ®«Tb2Å·Ž”wˆòq«`!Ý.Ááè: ë¯à’IÖ;’îªêÖ²úÖ%VŠ÷Óò¤«$Gw›¦ªiuovOëkË·û3¸I/õK¯C\¸&¿ø®8C²îE’˜¥Û,XÜE2LÜRÑøÍžç{Aà ¹òGrï8ãË.Õ«"µåûÐïäEªô¥}˜€pJ?Žtþ'«€8+0Iv"RJ< {ƒ“\æÇŠ îÓ»w€œÏ÷·)O¸ðYm|цjpÍ%‡d†½&—.°³f+^çé©ÎªRWï{mt{uy¯e>à 8[dþ9&$e«ÞVïºYú'—»/-$‡:órՕ׆I¯ß$ó÷Ý®˜,~ÙROlÐ2åê0L±íôÝ6v‡“Y³ÿ•×ËÅcí3`Š®òœÚ“¡&¤Éª”\öQÑr êó#%Pl&Póý^`ä—ò¦Œ¬Ïš´+Ë]|¯3×Ò,_/쎪âJ¡~ü% ¨j¦´yW‚ŸÒù¤g¥` vDð Å ™YR 0¿„M裵.0¨àv’bT”D_zèÜ]‰¸ØNo¸h®ßï%ó#"­°ÇÖÈ¢œ®Pç7˜V¯¯ï ýØð⻵A"öRmr -•Û·À42¿·È …òæt~©G¤£Î®EÕÏå·r»Xò‹ê©³¥p{•ÖfÕI[uŸü¤óD´ã.6—œ¤ ö þ+Oía:E»ò},“¯ÌÇaÛ7-â´ìÝÈb ðQÍemX¨íw© ¬Øþ !*⋨Døåqm€ñ¶ˆ¸o=ŽhÊ j]ÞYó|>×ù‘q“=ÏòQ÷»?ëñcž³èçÞãÓ’òÊZ¸;2噯ZÖE#OùD2Ž&WGG¾…QêÈ–±mà½!”9Zµí²ÞËùUì` |éuž=”Òâ@A7S×>J ñôÁ@«ï_ÃÍ…„8UÍ81´ãš[…4¢t(ù<1 2¥™Ç21DöF\_³$2•¶>áyÁ2YMwB1 ˜ÓèSÌË„¸1"S·©P¹*w,)Òý½cD_yE„èž}FAµû2;; uV oÕlž«ÉÜã@ˆdZ·K"¡€’ââ§H•(óèB¿×ІºmžÞžfeÄä”NR"d+&I‰W;¶QE‹@JØÃûñvA+[ˆP›?ŸŽqªx—f¡çµ=]Æ[läOÜ¥Q÷, â^CÐ]Ì(¿‰kˆ…¤ó@oÙÉ–2(ö—ÉlÐÎY%Τ}É. Øä²ž8‘{ç…ñ––‡óS î'V–Tæ"”EU!Ró:‚bÌ2=À¿ˆ}È)ï"“eÅc“wq‹o>7¥0<)oU5O¢9Óô©  &)Á3‘ø)PBŠ(T°Çè-‹¸Æã>L\'øcžU3„”ó“+Cp J…T{¤0ÿ0é¼|ø‘Ø¡ž%œõµÚ‹¯æÿ[°3‘!È=o ]²Ø…[–8©í±ÿîŸ'€_ðá¾ß -ûe®Û{Þ30su¤Al¦£<„à#Žéé2)az¡øRîp6°rhÓ¿ê>ýDS^.NÌ®‡l‡_ö0 o1;y@Œ;¼Ë7àð’M;[ÿ?¤Öe†âËꌨŽuüd+¾ZlGS$X*¨¬ ø]S›ÝùÓ€·iLëMÐy…uÆÍˆ €¤ž&N.,#Rï­±¡F“åŒäySÄœ£œ4ìá:Íg}Ï©aO½ZLõÕø:"â{àŒíZrí´’t‚{ÙòB8S$òC쯪‘Êùø€KƒÃ¬Õ=¿é=¦ŸµÈvY^, +TX÷\ÀÊèUkXx“ÐäôÐô’U©Wßàëž•:¦É8ÓÑÖ°¶ŒP«Á: ´Ù9ÀUŠŽjÂ…G¯Ÿ9uæg—%HN¦Î*ÎŒ<Þn†®äI««Ç_N:O4ÚAjzí°1ŠRߨÛ~~ào}#{ .Hý{4³ØÖ”§…ž WÏmݧð#tf u€ÿ¢‰ZÒá4-Õ¥z2;ÊœœÐñаµë¡ÏEÍ}”èzŠ'U!`#a&µÊ ¾;òþ°#jÜÁzªûïvaàÝÁw{ˆŒ ò´LóKòµ<Ù­»":µÉ ‘ µžÐ˜Ôáå¢"´þ{HÇ™Fï;ž:Êî\—×-é–ѽÕúñwëgQœC™Í¢}X!º,6ç]¾Ït}õÁTÇyf8l£”re>!´ˆsÐTpxÉ]ëÈÔg¸Ù•`ˆÒ_IÊÏ1÷”Ó)ú÷Hç·Àtï@÷ÖÞ¢Ös׸Bz2W÷Æzƒ ñUfô-áÌ`Ëy®¤™ŸˆÒ!À¤¨E€Cãݦ vcb€ðÂϤÛܼ»/ÝÄ]ŽøFñª{á2 Pmˆ*yŠ6¾m^ÎŽžèGÓbìx„Ä´vƒ?¢é¾ÒXòÈûœŽ,oëŒ2%²ÀhÛ)õP4›‹ý/>J0º·ð¤ý{Æ ƒFcRîø*ð;GK¿E:46€)0Ì=×`(€˜UÆ‚C66²È˜-’î°:§%e{¢™739ô‘å³Ó)6äávp:â!ânS ƒ“]Øf<ÛV㑲qˆ%Ù»2k1RAîA> ™’·$=\ ¾ÞýC(sïhïÒ­]”ØŠ(>$ϘØ/'âèÒäÅö%+0DI5tu²0º¬«¹2¨ÎOB<ýHœ%_QkAáEÖ;~úúšwk¨!¢Q–“O SÐWñ×fÌÄ WU×Nç zd_Ž…b_²:+á§r Lë…í†ß Æ9š˜\¿K°>z&Á,ês„¹)ýˆÛнhô h×*Z¼È<#O¸‡ #BÚäq¤/Ú Òcêw§%ŸxeÀ µÿaKWrï¢gÿ¡Àêjlµhãâ]ù·¨YCm=¦pþA†F@Ðãé¯ÊAØ8³v -AD£á“ œŸçiÕÔºªc‚ ýu½”†w”2æ+§ÉFþå™=–TåU®åuL¶¥tDŒ]‘§nKDŸjx´ši¡?uK(¸„¨Ö5Šo¬æÓó\¿—)sPª©{._ò“鉖˜2 )œ=&ôÈ,@ äN†ªxIÌ“Í:b5ŠsÐúlœ;uXŽÑêÞɽ7x£^ãÚWx?¼–`£Ÿ#¥¿‹1*âðõã3fN¹BQ,“s€„¤“~›5õ~]"j;‚ {rE¸lð€1F$˜¹§éU|¸HöŒ²|ʥ˩kxe2‰Ê½ª&QßT.X;=͹V„˜š <¶;|xÑ¿©ñˆGÙAÑ !‰ãŠ­œ"M]]ªÔ¬ ¢µ+Õs›)±^‹P éŸ'WYšQ´àÅ6Úµ^æä³Á®ÔF@‹kZ¨p™¨i©OÂsÑ`XŹ–뀗 MœŽœÇëñõ*µÄX^‰o4[9mO/¿Ó­€™LÐôg±xQâéžAX÷Ê4íŒAŒÓ%w°ÏWö_¿`wÄ(zUEtå'>ÕÊ~öÙ! òy ðHÎŽnb{ùçdÛQ=¨¸áÉñ2î `•6Ál 6Í› ¥yµ) ЦiríFÁ ð²Džã¡;.ITÀÇ[E­C õüÂùßG\ÓjfU÷YûI€ ™puvÈ-¦Á·pŒzzžÚEIŠ`¬úœ› ,göÜ:"nÅ׫„Fn`,˜‹1t_ÜNaçúõáãü›œšyÏœŒòèÈeçþn€¨Éñð_Šˆj¨RÆFÅíJZ§©žª w¯Ñˆ¿'òöËuñ>:5ÑI{¥0Ðe»ÏË¿ãìs^¥_pæØ¢sy\}ÿ Ë»ð\€0CSu&­ÌÇ ¸eÜYp›8£\Üô¬±4nø†Ç Hr÷®çS»{u¹_ÿ2éÉ;Ÿ%yø˜¬Î¡ü½*ùm…—î×úùþƒ6”ó9ç¿à…‰âXžÈyŽïDñbÿ{=· m@_Jæ;‹RÒO-ŸA½Š±xãƒþqÒÕ<´v¤TÏg|bÐgÁUÃE­¯«z…çMÇròÕ–MTtg"!âýЬX〄P@ƒáö»k]òŸÝíc;Äâ€ßD 4”¤DK½b!ŸlL ‚ƒÃàìC|gy°AÌÁëä»5‡lÅœÚsÞòÔgƘÇåÃÆ·{ðoŽQ錈‹OöÀMõòçØL™LÃÆ­òi ÜÄZI« Ös'Ýž;‹Á?ùÙlŠž±Ê®vãZÊ»•Ó+7{ŒJkÒéÆÔ¹’¦`›ÉWn°“ýÂÔ}J@u|pV%óÖö)XŸ™§MHf ]lV¥ÇßB=V3³¶ý¿7pOÇ̪Û÷ò[G1v«£1§®úØzw)–ˆ¤Èø4X[Ìœ¤E÷s¤´J}‚‹ý(¹Y©#Ê™‹]øz_⪑bæ:ø2åïIÜû6Hru’F˜GÉ»/¶§­ ñ÷!ú¬3ñ(Fp)À΂Ò îˆH¿àäñÎ)vRÁVYF¦@<¾IÎZg-dkÛØˆ¥76ö¤GGlÌG0Æh÷­ek‡ˆDØY WTV*dÙí†l³&¶~½È Lƒ‡`~üF‚Ò-`ê1…K9Rmd‡k6¾:Û1ê%}Ä„IÂlc†üÔG¸Øä\.}œé Ìµã‰¶Ï…çîÂùÄÉéáÙѳ![9ŸXÍ*›W`^×Nè’¢d©påG)zÕ“YBCÑÆNAGV{¯'çMFç pÙ¬“£Y˜…2qLz¡qæá™±>V™«ÂT¤×ÍÃNš·±îä  ÆmB¢èG“'NÈs,V=‚L$a£}¢$rO‡÷·ê ’dÙBæ]ñÊwg’å'…sm¹ E’ßI¾ ï¦a#5><ÍéËï´òÛ¡Œ5çM Š6SÒ¬bÛZt>öÊ»oŒS*”>¸§qစòƒkW®"Be†°èD™ƒÒùRF$5ØÀÌÓµknÜõŸ6ý„Ôç›ò”®§âùü‰²º]Ua%im¡l괜Ąæ4ñÜE@{Úº«ì¿ ûõËpƘ+‹[§K~æ:(uT†ý™2&Ód)É“E‰¹Òz£‰ÊoóWxÈ;Auï(·\˜C/#–ÛcË’éòÌp†IËDPöèÚ * “= ¢ºr5 æ–(ßÛ‚=ï(þÛ´à»q‡& ±r¯ÑS†12áQYÕø”euãi•å@ö[¯ÁÄiçè±€g7r‹»?*ºé—éö—ºK²Nß±O£Y}TŽH­¾)¬õ‚]Þíµšì6FÔs©‘£§W˜ŽP É7~.ýRiØï•ã»Ëõu­6Õ¡rUäÕ4"¬“P/$e]N:0ÂàÞ’ÏâH”÷¹=D}4q/°Ò•TiÀÎÙÉTûÖtÚ¯®ØfqÀïÙäj¯z !j ój! 9ºu{<àùL: ª†,|Ú@¶<Â"ÕÃZt>ßrÆÀYW‚áŽ+Ï2)ðê:G¯¯B¤X@0p=@«œ.­ôM¾ ÒäP­[•뉼?•sHiq¾º“¹ÙÒSLüêÓ+¬©†¸‹à –cÖCäá°˜S‰î\帖ÆÝÈ?©ÁÒR UÔ§)¿š’ÆooJÈ>Ížsç®/Â×j>|É9ÿ¾³¹E~üd%WíÂmügUý¯'÷›‰Fñwb£ÇWpè¶Ÿ #Ñ€iæÿþûÏMÇ\BIÏ'=z(Ù øx<º§ù‚A>‰þ¯òÿ†ºßÏÒ¤W)ŽëÙ{éÆþÝÏÇeŽ~k€¿Sœ´>‰*ç>Çì›~ÿq¹N|Œ>p3‡ª#(™bèVóçdqèÁ‚¹Êzˆ–x‹ WKòÊîwÐÉß3eÓZ Ntð…‡åz­…Ø:´hü³A[‘åv¯ã`H”¬püÃ×-P=rŽôxEnÌ È1’+j ]Ä;» Ïöò·K‚nhж¶„?ÑŸy…“<©HÌá'°£ÉñÁ ØèIæº1½çh&vÉ&wãf(^Ä]Xx´= Õ&ÖÏc%@–!y@QOv;—“ûìä’Ôáþ•†·9fó&kZìóµ¼7æ “^·ýê°2f3î ¤+xÌ!ùÈÍŠ¥Ééä‚®I-ÕgÞÚõP/®Ú–!¦*4ýð1Ux)fñÝU·šÑ¿5•ÿ“}Ÿ’)½,²ö^cÃ}'F. ¤"³#jÌ ïŠmì~«ï,ŸçH£Æ³ u®´!؆:ºÊg·vV¨W¦~Ë_•Ôüõ.N÷ËÏŠ±â ön;fäŽ97Šx®^*g8±Ðo5¬xc¢g]*L(QÀ°5»—=ØÐ¼Ö•Òy<î‹â³33––¤×Û5”ÈÜÁ åÈqb>Þ©ÎkAûFÓ%âŽÙ0’>Åœ/éõS@.hFìswÛÿ ¶äÃà`ÐÂÔ ¯*±K¦/¬:®_ GýŸU@Ã"r–'•*(´Êc»H[;4Ò ½˜Í# ð쯢Öe/fSÛÅ»¹©<7Û㋘dÊ3ÁŠÚÉè,§Y% pÊ'Î0‹óM*ˆ9m(CDa²ÈIÑñÇÆ6S=#)a{ʆ®R>ùDÍ©i×Aµöžd®?‰¯5"P~2ÖÒ÷‘S‹YÜåÞ}‰¥sÑO q¼G•í¯!G¤NNÎzåxÖ5Hy 祡€ÐK‚&Á…}¼eÐ`ïñÜÎS–ü‡?UO˜aiüœ×‰X¼ê+4=ÆæDjˆxÿ×¶E@𣲼݇§3O³=¯<ÿ¿ó8í´nyŠß¤¶Ó¢E3¾£82d¡Ö,Ù­²1¬ÿ¨hÅ=ê'Q 瘀"þо’”×7fY õo—¬ÑÁ“yŠ,¤«D€òª-åx qrOEEuYõqÇDxJ ]$ó“ý æú9‚2áDbÜëÞ|·=Yó+……á.Ñ/¨ÇsÉ‹y6u¦Æ7Šq¾5»©KÆëœw)bñT€´¼ÕŒíp y}¢£ºL‹µÔe%VÔ%V«ØsX¨9Ñ…EpOç qYlæ ¥ô!o°—ô-xÙ@¼ù bYQGÀd’úM‘ŽÆœ/»õ9¸É&@À:•¹RC°9÷G‰.òZ¹.ÉûŸj;Ê“Ô&% $0Y—b†ZÈDÌhmA=c¢N&_9GGœ’¤4õ®ÿ]Û@¬qE±¸#NDä¬ ¹Ú 4¯+F9zb£ž¬s­kü¼cLç¾Ð”P$u¿¯:eÝ_õžž@– nZSÄ+îä BzR÷¼$ÿçs(I:2•±ØÊ ì#h>P"´l=ɼúópr_eD¬“\K2’'¿ÀX§…àÛS@QšŠ½<"ŠTˆ2Ñ$ë½²?¨*N6ÖTAj\D9áÖ¬”Øs’hš¬>GÊ}¼hB쾚D¿Ù©“ÓwݱÌDªYw,-_EÇ|;kcÄÇHý’òY¡7I‡µD‘ŽÃF[Rà£38óQp»úè2Ñq~|þ¥1(~4'o4\MKéc…‚À7ÚlÄ_œÅÂÖØhÃãñà\ÁW5ËLózAr†bíÛÝ1R ß5M Ï{…TM=ãòhtbx cÚC7})Ì(´±jÍ–Û¤¶=zb©?mÀÅ&#üyÒydDP;| IfqÙÖɦÉ Kmš–OCáuÏtH[¶æ“ ´®@Pü“øŒ_Í?øyq?è}GÑÖ7ùöÙû鿟ïçûùT“ö±N‡o1 û~óçïásç}¹ ®YÁWîý†èod8•‡pŒ" ¤—ŸDø|>q´ñ¶t3,«¢ö$B"|>ðAÛD2öDë†âߢNAˆ¾Ÿñ‘çtŽŸL´9q³•ÿ€þåQù3‘ÔVÏèþ4êê´ïçJåßI6ê¥4æ¥w¾âڈ󗆭Ƶּsž€S Ðût]ùÏ<ê­´ÄêH¢¥…½k¯ÙWko`@‰Ñ{Ä^zŠ&Ç>\ÒbŒÞ6œ‹Zm+JÎÓt”¨h3ïSº[/wå eaÿ©;zràáÛåþn±]Òža·S¶rhÝ­ï•o2=•’ Å¢ùôL§`›Ê$Oü:™ÑNã ¸M8QUû§3Ó^c2=J(½àD3èn,inÿ—mpÁ¦olû¢¦ËT ²k㼞ÜN=óÊijÖ[œê6àt1ßPƒ6q¸>+"æ«zëA? úƯëµ)';p:øää9”!0?‰w2íFt;>) š]C¥‹JW“ÃÖ … û+{éÅ6Ø»ǫ̂W.>¹´àPGÍJ±î…i2¦Âw4iÍV„z h£BéøA)¨ìÊh™Á³›EDî’©³Üû÷AÒ ,ª Zâs‹ Ÿë9ƒlªÚ¥Œù‚D´ího5ì©1âíc€„ÎpõÞ—½õ[ršK8ÃO=JäD3ίâÀ¦Ú©O<Nó÷Ðkýóå¡è›ñž°€° š ¯ÈÏpÚÎn°G ˆ(©ŸÈ òÖW»,nèɨÞz¹1=Üh¿êhÃÉ™©° ¥Ã79Ñ_töWÞu¾ù&Ö|dÎLwiÈœ¤uÎ6u”jG51´MBÃH8™ûM Âຢž½7ŽÜš‚Eº–ÂÕZª¥€¾78ËúTgÞÊ_˜'«K\yuò[þÎz}–҈ؖ¦á³•Ub²—բ˷Ï8¥þ0¤ W9–J§¹ «Í»þ݈ϭv,©>_iÇ!­ÌÜÕ=Ùè ü6Òy. R ¶üâNpü©I#VKÄ\Ñ7P @7ôç[7 ç!™†Tf ø§Hæ¬@?ó€Ï)1à ^¦§Ù!ä‡Y*{t¦%sÚqOëtî8v{ão«F¤WÌÏg B÷1R!Ó'¶SlBA8Ò^ˆ )q¨«ù)Hâ~ÏwMˆV¦"Ë e‘ÓcìªhÍ„ªezä¸Òw¨…8õs¦Öæ7 «Ä%Iï$ÛÚ`gnÕ#è€ÝÄw"¼I†ŽôIG}MÆ+Þ~ÇBv#Ô3}¼ا¹6vÊ•T$½KTØ6[W?ŒÀˆÃµ±)@áQUÐe9{~ŸÜì¿«4ÐdÞUŒjË»BAíà¢v²8*¥šFb†`”Ñ”/ª"Û5ÓP9º¬›ô4My"ÄÏáöô{c¯cãHZÎVÓj]-lÁ"'í¢ðÔ•OÜïÐ2AÆV›«)}Ê\í”ÌÆ@ëÔ¶1e®-óÔ‘ ^:µÈn50<Ò #7{ÀˆVÇ@ªfËH×Ü-³µ1ÅeS<&/Qò“¬ML(qòü]=_VÉ»9Áç@¨ŠˆÙ¹©l“¹ˆ›,s—+©ø®5D4žƒÊl{/&4¸EÅ„©åÂìäÞW2,ýY*Ì6å#Ѥ+ßP’»)”[UËI¹bG’¶¨Vˆ¢¥¾Ï¢ 9¨6×Eäý¥è Ã#¤¨Ë%â:“íÊ|âÕ~x]`R¥›Š…Ó5"µfò&†.Œ»©s_=ÈV%lTõ V Óø¨{Ì(ûe(2±¼`¾òGI绾"à¤ó¦¥+IñHfI ˜íâl¶_üñøRƒ<ñÎþ£”ùÏß\âLÂùÀ«6`Á£»âqvÄX}¼J¤¸5 ×lÜ%Ø4Týõ`:lW§ø#FGÔM©¨4ø¿EîÔ«4Û àöS@ñ g ¿àC>xø0¬øâ¯#…øg›>¸œpæ™\9–÷´’ø{ÿzÙ%Zx<:q¾ŸèL‘å1¯ï£Hìú‰9z‹2¹yÚÊy¾‚L<Ú>\.[ŽË®dç8g¼x÷™Ìôêùøf |y•ñÎS]Žu;ÝàýÓµ+Ù{‡´i4€$óå—Vþ‹ûúËÞ·ªsÏ󓘆¹N[à2¹§ì¤û~>õÀž÷ê(¥wô¥5©îæ¡:µ ˆðoÛ£ é<áì=ó¡Ô—¼Ô\N^W$óc»U}ãx ?½ÍÎÍu/Üzº–,ë‡ùPõܬûlßZT¾úü;®êôŠùÄF¿sÚ|¯zÓl4_ÖK`û¶s2œ|­N— H<á–š†s4^ ÝÂxqDÛ’çÙ ›êÃϼ;­3—RQÎÙò+c¹eâèÉ’$Q¦¤@«Šµ/BB£³^ÚŠ2<(ò)‹õt@0‚è¦Rܹ¦yé;™ NârßQÎÌÝ,ò†oÛ€Vtàjaç~ÛÕþ&u‚Ü€x¼ª›ˆ¬Ÿrâó ·M«“-OëXõDGæïyy4û0ôK…ƒTû¼0äñõÝT÷õÞù÷ÐNñÍIÓÌYvÑû=ºÄ=‡Âýï@ŽÔçò¢+ýEY^öiV¾~²PÑÛ¶Pl³ÖaV ÁAD=Ÿ«*fƒðÔÛ-]Ykó2I@OjC›äHá+j¸YÉØY¡x§#R'ò@‹‚q{ã çÆŸ3‹Å€@ù0ó·êHüœNS4~E=WIÅ¥ ‚bsîµæ…<“«ûèó9àa—ì`lÙø‡û1ªW:ûèæ€"Ϫ!.V¡‚—”òÇNf(¿ UÃðªª(ç2o:Sg0Ð+~>­ÖéWüq*2¹Õ}Úˆ.É­('­Zk0‘m›Ã;Ó¥‘ûÿ/>cÒùí[nY6uúÓsé‘<Ê»+2iŽaw€öÔá)#—\:jzÈm}Ô$a‰C©˜uV0&üt%ÏFu¥ÓÒÅÿÏ‚+B“À åÉR˜‘ S˜è¯Ùƒ &M–ÒÇhKN<0,êMí7Ö+jƒ‰‰•Å œ‘÷ü?Ë^`¸8p .˜þžA¶ ²0ÆïQ@eYÑi±?U¤î#’»O'M…h_òˆøEvÔÐÅ:HëÞµfÓ=%ÉAi¤[§ ø ¨ùжÏt€1D"AšÀ!ßlÍ‹"—nb¤NW?ÁUIHùFW€É6OÐ"ÎY.ÀIêÜØ#%ž@>2T²Ã¸¹4ðÎíb¢~‰èñ@€GÂO½êÏr‚lt̉…ßÇÉ¡QÖLK2åí,DX#‘ý$'½àø D¤»õµö–ºÐÔ„í :C*bD=OB­–cü§nðnù®hæ˜w^ÂWÄ59†WÒMÅ`yŒÏ¹,bÑ8ñ‘HÌø@vo^Î]èJǤDLÜÍîÆ.ð:ZÚ·³{ô ^”eoÑÁô¦¼öÀvâÞJc—øŽþfµDö ¦t6‘ZÇÄ7^c;c¼‰+Fšˆüäp:`Êa¥¾ïy…¸.sŠqÌ ­]k¡®‡m,wê˜ûÞ˜:eÔ‹—L†³ŒŽãÕ±úfGzùCé’RØÒìÏü}¢ ¯çÁÐ$ ú‚ÉÁòS€i$J¹ñQnìdÃYÁ<‰o‰­ ¢*½2éwq¥ÑMEVê›êí¥t|qv‘ë(†kåU€PÙË”Ã‹Ñæ@¡¹ÿJ1ÃaäâŽÀ[]×(äcÙÌbº”`l/d"@ûDæ´«D’uP{kŸŒ™V‡¬Ÿ5˜L‹:V æd—c“QŒ’áa¿ôfÉi‚¡•Úƒ›R‘¾¶#æ<"ˆ¼E‘kê’*nÔd€­¢Ù&¾}¸dS¦ŠbÚÛ”G©]öº=Ÿ”Ƕ‘á`—–W˜Ì “4ZµiÄ%3p#—Яdê-×b4¬Ký­Û¨ê­9j„ ͺ(Wþéd‰Úy€ÿ„— Tá<Uþ,×ðçÎÊb2`ð%Ï‹ä$öŒËw;ç_Ü×$–ŽÆ r7ÊÄ5n»hÖ9UçÇ»Ñ᫱jARnDÀ¬wp*œÅÖÃ¥G:²A¥àŽþ_Wt¾.Üÿ­±ï vz@¾¢Ñ=šëü´“uòìßÉ>ĆËMÝë^oÔYvrE±Bœf'°M|Z¬=ÂäMÇxÐöä©Dé vëWÁI<úç/;çvÈg˜c m$4oš^±ñfHŠèãK¤:§íL•Z8HôÖÄ´×/àþ]‹w?À/MyÜô"ªT~÷r9å+ÑzIe_dâ|#>:&d™¿AôûxšÞMBi°ÜR êå]ÞÇBÀWO†M‹NŒj‡Ÿ‚cî]ÒøPD„ºkÝ_1ñÏøblžeÞ}»fms&+7×ÑýX”ビM)†¬MŽO6¸«¢‰aÛŸnTÅÃYMÀ…Ü ú°;ž¬º«è›<|LÅ1SemÊfCíþÔ(”tÚ X6R9ÝE»æ¸é3ñÿ6õš¼³Á%!Ä7ï9çÁ_Ò*QKiùz7ÚÖÞ}îtDýª/K®Y|’‡ê!½ÿêgÖëƒÊîhóG;íKR–vâÆöj¦ìléòrb‘œ²Ý; IýÌ‘kŒÇsâ mX<ó‚ +üf²þcjÛH·Q¼^ûÄv»änâès ¯–«‰äüzÒy';%@ÞˆpZ±eF B±ï‚ö÷ã¤mŠRd‡l±±Ñ‚@ü9ÛlþÂî”5K‚°c|ñ Î=˜¦î–#›&ìÖNÅq z­ìqíœ80°5zr4r&H ë¯H ¶}8ãèãã`Úà¤Ðùdâ·@ÍÔA2ÉÕÿÒ;âÕTC¸ë Ÿ·Z˜²Âp H¦u‡ƒðI“ž%Œ0ƒ”N RŠ0èŽV³ Lö"ã„xÔ ˆ”¤º™ìhq…ðV±¤z >‘âñ@z>©V™>Ø™š‚#) Lµ<Ϥ,fŽ<";õf€ñÞõ¼¬y‘ ÛIÁÜÓŽÏç³®ú³¿Y%³qv1>. "ì°åà4EœZnpû|ÒãAnùà(ÀI$2<³t¤-YúWIG1ݪ»Y•bŒ2«„ô`Àk;Õ˯©¹©˜§ilˆQa+ƒ`€ó˜F!ÜcŽ&œœè`sÙQÒŸÿ$:ƒîsmɵ£óu‚ÞUhšûˆ[ NKÝw{:ƒ¢×Ox#ö0­£œgÏ’ôŸzT$¤TŒÂH¯BîÜ}à·Áa&ÿÎc[®6K™À\ŽaD2ŽC3L»ÑêÉ!o'6Å_É}'Ž#Nr£†bÈéûCâùo=è°÷6¡t‘FÿÌêÌ¢è`º5<—;f9úˆ€Â!e@oî¼ûœc³!ž"'¿sEÙ„N&3ˆ-D£{Cf‹ì‚kJŠd/‚h…=ºsëJ؃Š€â\Üh¯](TΑ=A»m’¥1ž¢мýÛØœ¥J £¿r²#Öua!€Iî2²ÒK¬Yu[ym]¥'ÇIQÿÍ]‡ªwô”§Š¼¹&lÀг¡-ããˆAiªd²)…ˆã€Aõ€ÝÕèN€dË"KGÖÜÚ–½‰kä]çmÆQjQF±?^ô|ã‘—‰5-r*Yê)¤†YåÎøÛâ*Ø4EÀÄ ¸ñiÀ£Ý#!¿ƒ#+&Á:Bý)ϯyøV! ‰h¸Üš“õ† 3š°VTv¹b‚¨Y&›ö¾î¾Ì«Eî¤ö“ëácE¾¼¨ì¦³BG«0h¶?M:ßBÎùÝ9‚ºÿ°0íK&Ë{«%(­‰rD8Æ'¹ ;['XmJÛGÝ‚îÆaK” .«>%+ ÉRKŠûΕáÔŒpo•xb…—‹#"±²³À² Ÿ”NÏ1Úù ]DPLäR9ˆ), Š'KÁ7#¢„õ1QNYª9Iw!à|ÿñˆfa8§Äãs'divP!ÄRˆôš+!Ì+†¯ÊߊŽ â.ªH%cG£ö'Mšg· Ž ÃÐŽ+½ö)àÀ탴×ëOñ…°¡#Ô“ÂdOT„'ý`ΛKo‚XñòBâåÂ9D «a)ˆøtÎS-~R·>è…£¥aj¾·ÏGåüLl0ELû‚ŒÅ8U[ÄíG•äxêÊÝX (±½Jùa@館xB³Fó£ó1e­YfÏ¥dƒ)¼Ç=ž¡wm’¼Â…'tâ¼Rβ­üÖ2½Ç$<$&«^ø.ÿ6=Ÿ¶«˜ï;©Ï#èŒ7á^^òFÀ‹w'ïÃeá﹫oøõ"ºUÞ¦ïû €D-LÙê‹ÞïáìÁIÞÝi$ý—Hç)´×äöþ¥Ïy‹v…MÌÊ–?oÏñ½ñÃêB5 ¸ŠßLå’ RËQ ÞjX…ÿ¹“ýžïØk,M¯ÂRµpCUŽáäæÌQl õûÇsÍ%ŽEÒ¼yIÆäP`9·—/SnÉ™âýbnmjšPS€Ôp³ã=ãDA‚gy¡£v“Ÿ/Ñ]{%À ‡ ³<¨¢«L¸F_0–¨5mÇ÷ûµ!*Ÿ²a¹3,Iž¥©¶µý:6„)KzPC_ÕÙ"¶Ç'4ö¡Zó$yGqÏ£Àœb̰(¸Â¯ú¹2ÚÍ!:æðÖõөΑÉ$ 1ì.9=æŸC¤sVBU»}ާsmm~G« 9¬¦i<–q ~}ÙXA£ÈЪV2I>EÍîN¢¢Ò™”¨Eqz£ÈqzìÔ¾¦7P6ʤˆãRz½W Lí@ ÏŸ«³Á8Ö™$åA|ÜðØÙŸMµaT0;9?O¾*FPIô2Õ1¾²æÃºG®ZoWWl†Æè4àú¸òuH˜#ñcgCÐ%L‹êÓ‚ÃPf ·ëžËà«b'·ÞŠD¾ õ`à†ú}gýíLn‡Ü²mµÒ@ûU¶ì$MŒªz‘ñðçÏZúÊq‘˜¹é¯¨/®¬Õþ²æ4iÉ!=˜HÅÅ=2Ð4çèÚ 1NVíŸìþ+zË’,4átÀ±&gñ÷¬Í¹õ5É•™M!¡ÝuW|Õ°ÁÞ L,ÚaÑ! aY §) Eá©/dï…Ūkýî"¥$®:G_qq¹ʲ²Î¥†QÀN½â¸J§_Ά—„Ò)P_vK°€«^‡l“2#è²v‡ÅLÇþÒõíívï¢å—å©´—(÷õåF'SÃö¯;²¶¸Ý¨e±ç QG7Æ-¶ÆAQÔÝöíá©´*ÊHjlè¡{ø±'âYrU)¹’ˆD®ƒ™q\⃥nn9ÙÜe«üCB—Z€€‡¦&g'ï±¼ežDs‡ž)é^Açoì.ýãñ°™¢Hç/5F$»r±¬ë) ê©éý'$œpb¬¹Ö/ÿÛ¤ój80!2–R’khüÛmL*0’3/3ë­›^6›ÊwÙ¡Oz’t®7%r;S¹µ2’ /÷küìÜm5€6žñJ ËuÞÔð q0Ó̦*Êä£?Ç®@²Œ¨HŠ"L¿»ˆÛ” šL€îb>ÉÖNTêø½ W>À¤N2*/.œÁ¦¸“)(WåSg‡ Ú½ à–6Ë©mP÷R¤áÅùþ¼0m·qRî3\È”§þý™xoÅïP]‰±e„%äc€Xd8¡ä'.˜ËnY`ú"·ËžSó]x3‹%•Wr¿ ë¹ícvŠ“e-Õ™¢°pJÇiÕ¦[…@UpEGN Î…ÖH(ë^'Ð@½àRèò(퀉£ÌSá+_îØ)dLÈf‹—’, ­Y(à"2Ÿp:¼ÈÇ vž‹,–ú&–Ž’Õ‘ª›¨&EÄTe®KÍ cfê‹y, ©¿“e­„ˆgÙ¯HV˜e—Ÿ¹ÓŒUÛì‘H£,ÿØ|iÝåVj‰­* "K«ÅÅ«$+#wÈæñ¯ x¶1¨Vœ‚`c%}J^Ù­œì~…ôò°³]pøFT)ªÕPi)¥À^"Ë#¹>ÂANmWžk¥ Ž V‡œ¶Â 朙Ú5“üÃÇ­^½—L59›gZÙ¦ª;™™T3Ó͇’Þ8e9´?I:/e|2t0mP¦ðýÜòùùÇßßMrÝ’)ÁwÒõ½~Ia6ÎëLÒIz±Š˜.zqôó‹&Ýÿ%y†€ˆð• ÆUç6@ß÷óýìó1 æ¬/ÃúÎMùÀ ÚØ×œ Ÿ¦vž&lص`º‘ìê=Ϲ¼$Š´î5OëH/6ço·b}ŽSý a`ºá8|<Ý#'«£Ï{¶É4ÎüW¾®TÅ‚Dsz Šíû9áNà_{#6§„þåàåO;Qß³ÿ¹>ÞE¤ó¿ÀåKÖÜ'¨Äd OÒý…<áñT]ãâBƒœÆó‡õWêM6(Lá;L콤Å$„¹#ͳ߳@ËÁÞ1Ý*êÊ]i‹#œ9…27ož‚`¦„Žö«Q~CÆ—æÇzÁ"LŠŒÛ‘ë•CÀ£/¨2€âèXªi÷î$´½±äOBöx{i[?^ú–ÃÐ"€žàüév t* w…³R–GÁDß7‚µçÓ EØŠý”ÉǪ`%! }‹ž®r[0’>>Ådû‹§¸ïü‘’¾! >`@ß•ײ¦L/Á¹{F6oR&„s3a¸W”8ZO2§Ù¸ob/P“Yì Ð%¡$:¹Ûˆ‘·L—m.ÌÙaj+\a(5ÛÒ:e¤÷r{Ç€µœ«wÏÏWü”nýh./âÈw—«‘vŒŒÃÝÛ6MöMèûY2—Ð+Žlž‚ßís™!èßæÜ)»-62ó]+ìŒ*ÉUÙ´!¯’[ j*ݼÝ9°@d¦.¥d~RѽÅîQ—ÞÄQM”±&P8‚Ze‘C¬Î€Lº à9ÔuT-˜‘¹–OÒ‘-iÇ}UIœDt› j׳ÿŠ#=rý]߉bÄyË‚foOS³¾Lä# Ï3ZyjA”ç4·!.ÜcJGdMl®k וÆB÷F˜1rà#›=‰â²pï¢äé àêÄøì' z5b÷íž)–ÇÄææ‚áòjz¶^ŸÇ"éÇ’h3öÌÑ‚ 2c@éRxgȨœ#…¯÷ž‚¤ÎAn ¨[jƒ]utß {Zi8c‡}0)´ïÌV­s’zÚ ü¬Å¡ÓNÿü„Z_Å80».-fRÏcÐç4„ÜÈŒº ¢ŸkBô™T’·,[œ¥›õ¶Ã!é0tðÌul^±EØ\Gâšþ ÒyvĨsâÔr™¹¨Öõ˜² UHi͆F]à‘Q„óª_wq‡@úü[ùˆçAŠÜ‹…EÛSå?ãÎO=Z»p¶Ðãq€ çLd~@ÖlγƨMN.‚J(@„wšF¢¸·a/ºL™Ðü{w“Ž&~/®˜ ºþÕNÀ§"„½!É£ „$Ùÿ™…X7€V? އë˾P‹8‚Éè9ÚÍÃ|õG=é鋊%ªÀéç% Ì]7ŽÊ™gWwÖõ„¦FãÔúxº¹reE_óK¤Ò×äP”ïDÞqé¬ÞA´®8vÓ4¾8.É«rÔ&QœY[NP*·ˆh-¥x°%:œê5Tfe'ÓàÈÀn±ô¯‰Êø€c:4+{C(ó ÛN–„K¬Í4–ŽF _ìö´ÑCCótM@'iK”8ÉKW1‹nx95 i*FüYá êc®Úõ%g´H‘Í¥Â.Ç·2 Ï&Óm¤·è¾Š·£¥Íèvð½)Œ¡‹wÁø®PeZe·ÔþyuÀ£§ˆ±k'°L²@Y”äúý1Ô÷¼"ÔÄtZ’|VěÉÊŠ–ù•€+ ’T”£ÃAóÄi'5îE—‡ãíäxv(ƒ"ý~(m±pZò¯ìÏ’•źS8;ï'™ÁÕk²¸t^ Žîäš•£@½»ÅãJ‹R~v3ÿ'‚(WÖ<[¸‚fe÷ÑFèp‰júLÒyõ+xèùFý0æù.kµ7‰^OQÿüë@oøpýýö!èßϹü’ñü ŸÇãÏçó}’FuÉïçûùgÏi?)o<­/Ö =ߊøøÊÀ÷óý|?ã!b€ó|>m`óñ¾ŸkWzúçù„/ûÇ¥b ˆðGÅöùÝßïçûù~^ðÁÅñ„'ïò/'Þ¾Žv>{ä^óggÎɉ,L×Íê„ÊÁŠ‘§¯‹óÖ¶p‰Ã‡¿HXÖõzÌûHáxHq´ahëðI OOßb—ï(ã¾æ£½fû5 Ú| ãõ2Ðb.»v3ÛøßÈá¢lÐc½¿zÝLj»¯”ɧÿ^äbÛµ# AïˆÐªôXL4eãݯ!!‡0€3ÇY=³eΉ4ÔÉH/Á¾]’ò6™´ÛÁñ2æ²iëtN¾ ºÕÔHŠ]}ÚvD´â@  |rº'T.Ñþt¶©5ãÖ„Í?ã›*µ¦Ð{Ú£€x¶ÒÆNÏŽ¦Ù—†«Ç™z·­÷9Ðø¬÷´5zá€|&­.צ„¢YÁ¸1±è>ÛÙÏvog+„NK³ÞÛ#¯É»êEðÄÐŽ|Û{ú ž^ÞÆs2ŒK`þÇ!Nʧ2¢WJæðLul¢'ƒNáj+Q $ƒÀÒXä”»In?xôÌS>¥ï{.3BowW 3险îz È1rcˆqa%Ö·YJ1bàðXsÆñÎx¹­v)â2=”œ'ޤóMKç-8€äA°QºàõØp@M§Ê¤¡þ¶†Çò&ñ¯m~wPSâ‘ËŒà^¹ÈŸ­Œ= #t¨-Y©cõÔ8®\Ynà¼EÊ\7œ‰Ô/"û:×Xºdǧ/j ™ÒQz¿ùÄâmœÆàtF÷ ‰”WÀž`%:87k„34xZ“ÌñNîçœwwÅ˧3ÊÍ)/Êôâó À™ßQ2P ¢¬mo1] —Ôkuþí*ä}1åœE gà¦GþÒù=F Ô=rl9FÉ=rVvâ±àš›³`VM¬Ð½.Õ ΫÁC#ÉT#téÆÖ£"ꔤ#ùSÐxÂ8O]å¡KêdØ FA¸][N¶Ð›KŒ[”Œuóh(¿^ì‚ptFÞ,ÐFÜOÜ¡1Œ²°³y¤Vò~•àÈ0 ÎÎÇÈ‚]ƒå”g‚¹D âqš£Ç3`åÁš³-ÚòàxB7Õ~LCÒ`”+a·¶Ü¯èâiÅbB!9‘Æd °Ð»kûÍ];ëi¦#ª1ëXr0oTÖóMyáÄMi=ŸO7ÅÏ鱨Ûr£—ˆàhÕ1" s+Šf­8³a*ê›ÃÅ’ÿ]‰ „>ËËMcˆ ¢Í Ôà j¾P(ëœR;ñ[g*x&òØ8h7Uz:•Õw„" Üeǰ½.P—S›È¹ Õ ¼×ó¶»LçD )3ÁûJq$ñÿ¼åhEz³ƒÕÜsaO(7ЂôÑ&Ä­0#RéSÐYÂF6M^ª?/^‚ †N¡°æ¹®AŠô FCÖËCðjÇûê.©Ùðãá¶åGüKò}äY³$¹°½kOÿK½>® ¾R8ö€©¾Ÿ%K ÷ˆ¢ ÷óùåËz‡z|3ѓֺ6‡¶–t¹Ù»Æëz_¿{C ¤ã—h+zó‘Ácóá$¢Ÿ¬~_iÿ›Ž˜9.ÿÚ²_Âú8®o>ýÓYþ†Ÿ’–x¯®ø¥qñ'“Î?ùx˜¬q ’ŸhÔÒîÿðšÌP±î:çä܆¹ö¬ÁOUýM׎øXT#èúOh¢ø‘­dÿÌ¥á ·SRoÍP@éªûÄNùkGCÌ8aÊjNBÝkÕ³ŒïuÇä¶êC€ÇóùÜȹ̴€dß\”Óâ’©\;ås€×Fºíée—[~5ýNòv« ‹zÇPÒ $r1VmGªUçü–çÄGO€‡¡R¿k[w—6.¤v²Chp¯ñÒÏÌIï8CDÀY?’sª"ωã“ëWŽð J,ÆToP W`ðcg@¢>/:ûEñ³€ÇÞ¬›õ¿ ë¥]Ü%险¥p‡“bíB‹a}O¸³3åHTåà¢lÉ‹„ÊEvpo4›ÞI˜ø;'lEp ÅÆöI=Ÿç†b,5Ép³’È¡ü³e8ÃΈО¹¹(“ù‡Î„aé{ã"&O¢zlØÖYæaÙE!¥_•ËkŽP7á´V0èÔó*gÚ‰øðßkR ¡ ° õ~V5b—º-+Fi¤âþÌ£‚Ys^Y½­¥’¤ÇyZí4 2®¡\ó%.½u(Ošë¬\}çÙš‹€‘œç=³$nÏgÕòPƒÈ/åfbu¤{@éh„¸‰_€P'—¯#|>˜ê X2"!d&0¨Ùú‘ÆK$–K)ESâb\ò|³–óäžüì ™•Œ|øè¨–õz¸—¯O¦w1Û@}î á¨m¶ȬÆû‹vYk‹S×–Vþ_ Ÿµ¡ x+W–n$sÄ4glÌý{mâ«’’LïPûÄ÷@*³AúÝI¶ÿýÑCoEœuéq¢ÇˆQyÔT&!®|ay;ä &d$uÒÁ5‘\®¸×[Û¦ @£ hvÄcK!Hâ^£ DÖ 1XP'[ZrW='Å%‚WÐ~K? †¡®p#^™HwçÜG®#>ûhGµ‘Ôù—¸ÖF´&œH#û¸DqŸX%O=xìÀ+µLG3­õrEne®Í-›‡G7„“ûn ýFO%=n€ËÛ8Yç1sñ­M¤J…*‹$£Ü13œ`¼ö0jÏçãñ؈€ÄM'€8tëó µ”y•µwu»qÿ†nØÚ½êê îQW;a%;¦¿Òˆ ç{Äh‚°³¯$~X®s/j–­^p÷­Æ¾&GoJ&W© ¥–#À’®þ“âÓÌmæÕô€²]üì kG?!ÅʰgÏ7—eK4£d·”–®y+nØä™®p­½š Sž*yYà5‡Ù9[V`lz(¤yž$œù·¤*ûJ÷Æ¢9LŽÁmñ¤”Iª­q4 ªdÑ“ÆÄ,´l€žÃ,9~;£Ï°~Ê[Ù8–»ˆrÿf§®¢,ÏËX¡ðšN/nWúV? +s+ïàFOÑIáP³é^È·kžx,nu@æm–ɾlGþ$,zE ÃQî!pj*ì™Iéòuà]·'áÚJÜžQ¨3 N,æÏ%]êàÕ@qío‘Îë¢¯âØ‹+6`‰Þ‘ýÎ#ÁZºô—~Ê€…’ÕÏ´Œó!/ï"î¾—c<¸¢a{i}zZl­ñoÝŸ»K4k€Êu8Eç†W÷Ÿuþ®r@Ö@<¦_QKÌtõìÞûTJvì¸+æé×{€~}:.öO‡×õ•owŸ4Œ5Êd NÛxY•îÿE¤eN:­ÛF—A1¯w£ÞNcE4W5?¯Y¦â$W úmi.#X˜[Î\ ôã;ï=mÔFþ¢A$ª¿Ïß•œ,úsƒliP ,to mò|>ã¤ò\¥ç, ýx亻7’\ìëW²¨ Ó{T­'Ý]±*ÉÆÕö“3íwc}…-ȦœØp…:òÇóIA›ÑYË­~ØÛÿCäÁua=ä¸18‘­€ù¾Àv^@øÍ爦'h{Íl›#âŒ[öà‘V¹¼ºs¤v˜ì9â‹|ÙMŠc›Û2 *@<œyù‰EzqbKØÛð…FbÝœ­èd…õpsbiô-Òè¤<êæá›§ÌÑkë¼&a4%Y‘Ͼgzƒ%¥5˜5k“iŽ=6|*' ‰i’yÂe- }Eø€&=xÁÐïüÅu×ášÓKÑç*=ŽÐ:∃Ì;J2VŸ’ãX^\ù­ˆ|lá¦oÊΑ;ryÉDçüÚsE¦ŠƒHPΪ”1ŹÍaÖÖ¸uz‰9À7 0FfÎÆ*çXi™êèÿ‘é‘ð ÂCÚC¹wª²&⎄„7+ J™¸.Ð 5~ƒŠ9ç4¯&¸'c„¯ë‡¡%£ä±JYŸƒ³|¡Îh¬|•ŒˆûïM}éüÕÉJÈøÔys'刘îwh$ŠÖ(,2å”Ò8Œ9~DXlÖ"uüéì¤Ikf”'§ý·qƒskºd¤ wHZ5õ<306‡Fîàe|\q"{=Γèí@²{GÝò¾lBA•¶¿˜b~raqôè¥ãÉV!)ùÔ§ŒX€ØÃŸ¬ùÜà ƷcoÇ30ÄèFæ©êœFƒ/ü]tS‡É±—ŒF ç9· \ü¨Q=RšÚŽI¶ Zép«hÆU75üäñ$ B¾{tÕê¬0,ó,%ÁÞCˆ=¦XŠdøŠÅÙE­ <*ÕR¥ªháÄÅ[פa¶sTNP½‡2<‚'è& ¢˜À\m*„²aYÛÖÓVå<`§1Œ¥ù8bg׊8•µuCñÄ^d N1ça_•´Š”V¸­ò°£ƒÊ6,©ÊXRð;oÔ»"ÑšQ Ô¸¾æã¡'Œo±4²)qÁÞµ,(#¥-(V§:ó˜ZÝT*ÒSst6é.•í¯‡\á.NYƒ¶Õ“íÌ•TŸàÂ}3W‹vFšxFSb&9T`°$½#²KRR¯¬r0ý çÿ‘FŠL;1WÔˆ€¢Q4ÕÀûâž@'ÁI,½o(Íóc`±5˜¾oY|“ }(BV]H^íñx8g„‘Mu’ŸÝ´IÛ1ƒ-²AÈ]O/6qÎu>jTRÏÄr¸AÉÄFVå—¤ÿÊ’1u%±î <š‘$åôC’÷¦’ë[òÜ~ãx˜"¦OÈÄ8 ŸüaL÷¦•%šZs× ‘ÙwTa`æQÓ/zv(Íê xØ.ø|>£ˆ›e¬ÿiøŠ÷ÈŒßÊáhÐk;¡™bAN~#K*¦ò0$!¬ŠëŒ2‰&™Y)•¡V×¼<ÚíáÖßFBÑöÔȳ/¶Å*iû3׈\ÍÕÎ[²*Ý[Šh[C%­0[É!LŒ#<{¼rú[¢6š`%Rµ°–`´Ž§3 Ãö°ÛåÙÿ)KÏß#ç1²+uÑãY¿z˜ï’E€šÇ}»ÈSÕ*赋ÿ†Ù‚P½tÓŸ£·º&€‚®ô±%G®æ4J¶á¾nRŠãe©¤®ÒÓ7®#êÃ<[žÁo©Å+=ÑË¿-¼p´•æuŸ5€:ujDv ¢{ò9o]½•zCxZ¢E#”¾ºü ?òMÂ&81+ß.Ñòº©²kOê1‡)·ÌTê cL~æýB`Æ}¹üåNÃð>ýüäSáÉêèw‹²C‹ç èjI~¿¥‚1½PT5¦€•UÅ©WyÅñY´E­ *…¹¤Ã(0ÖK¢òiBBb 䉥S¶­ðì›. H‘àªó\ñ“Áà$¼ëîÿëîÚ2¥Éø‰L¿P¬(bºî7[Ô·ž§÷z’ÓÑ tã3O›' ®H©ù2^Ù½îƒ3?òB@ACD¯dE7¨WD_„¸Û¿[ѽ PU)QÏÄ’aM´ †ãƒò>r¢,à—~î ¿< <ŒX ñ>Æ1†%&·Ùç§rËä~•¥¼°ã@U,Ok$«›.fÂŽBïhûÝðSy-Y>Jgü4jžÒÏÒ*±ˆza®•e½+ã>½p_ ¹€9®(QÍv t¯öZÀÎ{­ýÀü=ú$uía÷€©â \!6ý¨JÞ¡71¤¾šz¢¸}~öSA·=úæ.<¼<[bˆì&ÒÈ(Ü7Ac—7êKqlþ„â© ÇcËG °‚àLjÉsêÛÍ/(Åêºb2±/|´*€Š÷Æ-L‹GœMÆt‘]ð+!Í›ù!“Q\óOˆ‘ížÂà/µ€"0ŽˆûÑ N„ [™ùÕ®ðA…O*ÊP»A^gÓPn§Hà‚3î»ö½¥ks¸í^D/(žXj†êàü{ìhŽ®r‚]ú¸ÊøÊy*–FR¢v6.Ÿ#i³z˜ X¬Gˆ?fÐXë1„b2Ôe1èìÜ¡vÙI”òüÓ#áa·îÈÜ\­Ÿ™È " ÉÂ&T$‰£˜+P¤p²é&–UÆå|M•£o8ÖK±^™qe2\• ¬yBt/ð±%¿äùnaâ\Ú&ö:Ñö`ViS,¨»uënž˜P¥#Ó3ƒµ—Þ µüÁ˜ŠóÁ²qZOÌÛ#Ÿ¤ ¾´PE§õEAFüê+'f'¦TN";xÜ’ÿl²ìº½ !r«Š-™ ÖÓ†„7:[¤U£—Z|rÚ•b—ù“uØ(¯yZ6rý’ÚCÓrT¬ŸXê]µ(Bã 2Ŷ=+°šeæÙ¦í8G«ê:=¯#HëI·‹ñd¦ @rÖ¯dé<[:.=„m£d½¹výl¥s±mÀ“ÿ¿H:qØ{º–Ï’„Ó«’Šé¦è½îèy=ôÞB97W€âìóTiOÃ$±†°¢yžÓY^áå¿=|‚¦Ä”{37\Ÿ¦: ²4Uå•€ÊÁWe'8Œ,Mw%Gø’³6ÂzÀq’jTKöÀ½eÕ4P[”ˆjä'ÛCÿ_K²G‹½Ìv¼D)ñs3 ¬¦Ž4ùöpµ~íÛFäã-Ö«Mû|& ž%t#”¥¡Ð¬Œu@uœA^^Jcêk,QË"¼Ç̯4üÒUr  «“ªì‹‰‹AçôÕ”Þ=Ì£ÆýªÏɶ÷&²Ú‘¸ œ$K¦±VU‰Ek\‚øIç¯Lh€}°ã‰—Ïý\ú?— D±›àMK÷™ÛWáÈlnÒq0ËŸâKAË’íþ³ŽQçõÇÞ6äÐò˳t^Gª¿ÎG=ÕÝOÇï즇DçXç´€?`‡>A™¿ÜØ¢¥•t c/ ³zÕþïÿ "µ¡f4±wÚ«¾“×c×TΦókìCNíâ\¿à¼ÉégûÖ¹W[e;v<þeôttªÚÄ%G‡&ÿŸš×6Áu]Os?²ÌoËÏ¿t…“vK NÈjñÏ;6KÝ€Ú"Ôɲ>ÄÎ.>À+¸ËV¿Ÿ7”ü}‰ Tï^jìÆ`mUp1‚ïÍ¥À?C:ÿ¹Ç7ž–ò?a4¾çDCg)QsçgŒxî­Ö¦›³ÈGi)8–th¥Óœ}a¢K}ï„2·÷¥¬*€jδ„D|#6Q²6vT0 l{ zì-kñä5YÉZp°Ÿ›bC¾#vûêC2{Q–'Ôl~Ív¾Ëê‡éai:ÄÆê·ì¿]ý8ÇêBbB#À`•t84 &+˜w2ê¹:©MöËr§DäÓ¬ŠÌ „sï¶>™ÄeÜŽªßâ<;· H­H+]«Hi”&”êÔ¼ÏC BKH"Žù„ 8xD{‰ª‘éÆY,Ðõt•îÆ}#¹h¦úpY’Õ.¸G¶u4À脲Œ .¡!Ì0 ‰z9Ô€3håV:¼(·bΓ˜Iª:ðà´UÏ ©uÀ–¨Mê¢ÇèÃ\ÓV±¾ªk’Ë*-Ö--I²‰V!ç;ž{nÊïRP!b'™Ú.t¢CE͆œN…¡ºÒàˆ@‹üè¢5»nDô|>®=b@.G8-íÈÛ ·Š ‰9(÷+Ì[Å7ß¹ìŠP'0ñ'Ÿ‡DUÑÃKhèÅyb|1h\ÓqWE%Ã¾Ùø›ˆ äŽ6¬)°ã'Ù½4ZÿCÄÆ&ÖWpfÍSj#¬“–h`—ì+¶•p8mHF!o¤YL’¤ÄXSø4ÂA6ÍoEƒ ,[`W¯oÏ8}$Wjž$žâÖ ÷L«$íô( #L~S芥ž’bdâê$Ñöman ŠÂÝaë÷öŸh—Ï,± Îîeó(O¼¿Ë‚¨ti9£­«O7jB,îªø®ËÛ#dÿä%(d, ¸]æk«Â@7Ù—؈ž·S“G±J_ˆ8C^l[ùÈ.O&kƒØ”°¦Ç⤠ß{——U›½ö®~vùÓ\—ÏúÆÊ Œ;'Ѥ\÷‘Û}ù ÄL ˜ÁPšÈ€’œ< ÐÙ•ÐÌ×ìådGQ¿ÆÈ}´¸…Ê´@ÖÃñ7IçaîZ¢žI¶Äñùw[,¨öÐMÙ[›•û–ÑÃb4)ùÛ*0wnäZ7ö45Æ ði\áÚËi=º̬!v}^óYïøÀ™Q„ÓŽý-Î~†ÜÉ$/@L*KÌÔ}€03È£©8ÐBóvÑÜD‰DнÕm¦lqKg»ÎÔV™Í€¸p"¢Uußn¾T §·~“éç¹$?;+=DG^ãW)Ÿf¤Á“K=ÕWS½í¦œH Ô<õƒHüH«“Ë8t"‘71‚žX0ôFÁë¢e%—wX„êpµ=-f7õ?Y…3( ÂcDc¥£m ŽîTjWAE ÎbTŽm1¨¸–õ®çCÉpñµ Êv$ú³°qR0I•wõÍ*½,ÌñxARbó×Z¨4Õq•âJÍxР½6†Éˆ˜ø-ˆpP¶ ºû~xN¨MN$†¬RøÚ¿±”}È^[@€šÂBfóŒB9vÁ~sÏû¢‰Ù6TÖkë H—®tJù¥yn ãnë[º>35¸ÔùJ³Òu2ÎGÐÕÖ^´áNßñó.4›ˆ·kâ÷›²xn¸—ç¬]€mƒ,D“+­GÚïü[¨Z~L&©&5Ùã—Ô 'ÅLd„îl¯]y2›MM ‹*Ùž>6ÈEo)V*>— ÀN¬|§¼4ÆÖŽM;ô+=ÓðGHçóc¾f÷—óräŸyïJ~øççŸéóKœ©ïoûš]Ûþðx<žÏçãñ0>"šœ‹ð_Üþ|lõ6f»ÂŸS¸ üŸS0ä†9Gç}¶çÿ€ûëa|âlÁãÁâòO¥ü~~¡¼µöláñ×@ߵΰÈ}¿l£Û?çÔîšôÆØduDøßÏ/ X8*ë_t€ï\]Æ„•Ò¬NuöïAü~ŽØ8€_àF³¦R*çæ¿Âÿa\|Î[ó²?CCÊ rž…Ü KŸ²À8ÙÀ鮋íqSµ, 'áDÓ!oIýÙõ!XëÍÚV¹Îh„1Üåbíý"°A¢M˜Iƨ¨„0!n—ÃêsRþ•^·;(ÑØØÁYœì§³ÔÅ]¦;iÊ®˜}æ%ÀÒ4B{_÷hÔ,kxåd$¯{Gý´-–û}àN†‡Cú1ç!9¦mSz ·¯0èÕe‰BÞʳõ¦Úd¶Òx2+èð…ŠøUZÜ$‚»˜¢E7檚ºBç¶ö>r†nMhC¢÷Û;Y.ï¼.ûÿ*âíä["D…!èÎ#yw÷+üT‰éYNËôÛ)·|(ÕrpBMhÙ*È)0yŽGV‹˜½…4%œto0+¢ãN:/²Ñ‚ñ°™µµÚù“œ‹®˜ƒ3Ï?vo2¾ÑÀºJåØõÊ¢‰;îMãÝ4$£¿õ27zj¢"u‰Ržd @rS2 <ïbÿ7úêX‘j%Ì´nCc''-Àv; žñäý‹ÄüŠtT¸•¯kåÐØ}O9èD­¸KÛÑ ¼að¦å=_@ h†4ÐHÊL@?âØÆŽ}åÔGÎC‚âr~˜ˆ=[½(XÐ×ì áõíß2^è 1R™›øŽð”ÐE1Ä•‰f Û(î½ëî÷¨Ã5´±ß øQ\Æì‡v¼ãSI°¸¦6ˆ;œ=¨†*§‚‰§OŠn¬NÜŠsE üB›ª2ÉžÔˆD„Îç<©HRÂXÐ5ˆ|GR ÍTj çÝ™÷¼SÇ´ns§~½¤Щ»Ÿ ¢F÷OíˆÜÔ-äŽ RÏKrŽ-á†dæ^/&=5•¸òßQ»p$¬"Qd¨ Nuà ´¾º;‡R ¹?I\3¹y=^XEjMx6Ÿ}§Z:*®*ñÈ_'/ùª9{;§™ —š¼â%†ñHÂ^sŒ ü䱊âÜIn|qsWð øÞØ35íÉ›+*cQÞ?Q…u,ÛÉç)ÎÜà»3MîÄEÚýOtäóöØ29·ÆI¬ÍÔSâß»õù̬[5Û¿ûšnÕÁ$À â³Ëµº,ÇVøÀ×êÁ¼âdçD@Ê)“%9~"Ñ1³wœ²«Oóûî4¼+| å•.þ¦J¡602AÇx;~vg¬²ïõ.úÁUP¼þ±é… 9C©—ÀIõ ·¨z;Ô¤!PHŠÉê5Õ³àÍ×´E¾ÚŒÄfޝ‡BÌ{àÀ"À³™7MýÅÜŒd> ¸?.·u¶ëÏçói®Æùs‰y§ùS:‡Èé¿ZÓóªWã%p³}Ÿæø._áu,‚&Ö«äî½ö*‚}RNˆƬÈü¾ ¤ªÙ›à2Õa]FiFnOIIÎ,aIÑm‹¨æ‚· 4lþeÕäÞ[F\C™¡B׉®“²èþÄg~ÖnÙ° §;U¡`v+®§£.ˆ“¼«d;Îz°›¬ihú«¥;fÍXò-‡¹óŒzñó@3a WÒvñ²7¢f\Ú+O~©¶ ^¤=m¯ò¿‰/Õ4ðÿ{¤óÙa]BVrüu³·?íÏMo•¿Ÿ?ùy<*Æÿý|Žœõãñ@|0?Àoc?6ÿŸË+dßÏ÷ó»?ôJr!êqòïV#G’r7®é…:þËÄ×_úÍû…øx¿Q¢^ïàá6ððùZÅøöÝyÐ÷ó&÷õùË»qŸÆBø’ø|?ï‰!mF“ì=¾Kâ{oÿý|šMêâû&ãäT–\Á“nÛ‚:^âÅÚ\ðÆ‘ Ggç6oâ…[rÜe·d8¶›b[• ¦L„Gƒò!0~b¦­¾+C˜quñm‚>â#’øýw;ÌZC¢ëƒ×Wk'+IÛ vüotl*¬sp 𕻀³.`1ÝȲÙ+GÒâ UÜÖ–`ˆ^ÔÛ[Œ`óGRMô/ÍkTjEâŽÇø,ÑèŠè1TDð[>­ÓáÜb·8¸ª6áË®ìã;§œ9¹Þ00ò^¤.õ·†OÆ‚Š@“ÁÚ‰bìàeÄ•ëæŒžO¿Â=íp¯ce °bÀÆÃô¹]&ßö ¶¯:˜÷h¶+¡wS~ΔÉôÙ佬gh,Ì-¯š^æ™ã4±¼–0ç„ï˜ïËRWÑ„–PùU4¨ŒÄì_Р­«;ÖGðXÈàæ™lœö·]Ò—Y‚N”¶£}tÛŸÅßêöØæð ˜j€ÂH7Âl'*¨»ª¦/8uÚÛX£ÝI*¨z={¡IÄF&¬à‡ìmž›ÂÎêië˜XŠC9CöH³æÖ],û J:E& ówŒ3—æq ±óµMšf.q:åX<¿U¸¸# 3?20¹|s[šœ¤'Ɩד›‚rm6aý9£ÅËÏäÑ!ˆVŸ.YääµV¾PïKô„ÙMV->1ñ¬NöµLÉ ]×€™cŽQ̬?oíGö# ÆŽ'4¼œk“dãèx‘I¸»2 VÃþ=ÒùsJœ±SŒáG·¹…00OJ,ß‚G¶#(ü:7kœ't“Û0£›¦¼Â§BÁ´±hÊ«ŸŽ“žs…»ô,0ÿ¸4î6q¹…žLîs7 :_ZJ²'rc çœÁŒ‘Žîz‰r0Þa„¾÷„€èä\"ÁŠv-yq–Éú·S±/SŽ›Z™z6žDî5€óy¨è¯–Àz±RÀ3NR={ëœ)ïYd‚i0óFèªH`Ü#¦þ*À³Ò.?ì3³•Ü’ß#a˳SÜ¢ðí)òÏòá~•7ŠNÊa>«i%l5¸&–'âdB¹f!/_ñ¾Ï-Dé,²Ëú4¦%¿™mx‰z>wº—©ÞpsÐÊo˜-;zr«ƒ &{+9ƒÍÃjn=BÎuçSJnœf*‡7]3ÒÜOYøT¥ƒ,¾OÒŠnxJH ¥gœ·?p3âu)¦mÛ43:™žýŽëÃØÞ…È=(V,äÉçÎ%ä˜ç’Ï-öz–Apɺòe)t뙺•—zäÖêKÁÀ'X—¤ŠŽ™{°•”ŠR°s/+ujûߪËŠ3ÿÑ-baíX¶Ñäá,‡´ITuÕÄN†ÒÛm²™:‡ÐÑ@,7 ì«Á£²ñà™x²5eºàᘫ.ÆeÛ‘q¤Ïázw¸˜Y⛨بݵ÷®¨ 'Üu@B™ìÕ½“¶²EM¹Œ"žï^«Óã#_ŠpVÑ:·hâ9 s•u?K… ­Ù:®ûH£%¨ÚZípe‘tøs](*èŒ%J 2_·ÿV#LÒ€1øâª®ØZgøõ¬×Ó?NSÉ[liâ»1Ñ‘ïtŒàêôÞ•ÖÄ‘Ec­úAJÙV+ùžÜà Žj™OVP'¢ÇnîoHg˜Š4h玗˜6›©HŒUÚyÎÈ›éEY½Pkl6¨ôTžÍ(v0Ϝ҂t^Ÿ@ÊNëUÔ ,ùB •'óZµÊLJèvÒN€žv1P‚ø-dª‘ž|#¦w°O¯xï]RkQE°¦âEI€5K]v»¤¾Ÿ‹ŽöáÅ,Kì–n¼g)@#¾ŸC‹˜çZËnÍ1Nê™ `”¸£Em g”òÏñúMéˆ é,Át¹=òƒ™åŸ³ÞCâÙ†þòÒ‹ßøÏ˜ÎBƒò¿b¾‹ãg>jß_búuͯ§ïðÉ]¤ŽMÐ]ëù›ŒÔïÓíùø€OÖhc|ÇÝ<í©³úü•§…ÌOañ÷éÞ=G+ºj/Üí_¢m.ô³ˆîˆ+\¯±Ë²§VQÁOØ×;”Яôÿx>Á¸:gÿ'¤žúØôÆ r¥•ø¹Pï¹IXëÝbüYÙ* *7ÇucEc«‡••ʘo£†X§ž˜0†—[%5’÷¦D€*l¬˜,Ü](ê=W}"*Y÷|>_|zWow€suFBòlfgõUUŠ*¤>eŸ(¢J£–ù(xˆ{äPxÝyedwÏâ‘ÃÆøí$ª†£ ·OŠÖ½Fê}i¬Åfê€á4b3&xÔ× †Ö`Ó$ÔÀqÏ.ɼq(Ì—[—Ø ÂCôùhD³ðôØ&h9pêð¬õdž5¡}q¼DÅ‚éÀ:·Å.tkÖžwœAotÁF ÈëZ”Y«µç¢¸×jþˆ>éOŒýê2Çß0™Äú7ÈΑ•à>d®¦øÔ¾)A²¢È(n@,€Ì%ŸÉ'rrÝzoÛVLz帪˜•÷Ÿòî¹óÉ{бºj7äPŽŸÁ‡‰Úc´ò¹ +Ç ¶÷˜æ±(4²t@±è½ßÅ2ЖN#±çìâºç<åF#«REä—LQ¢VkÄhNlì2³6ùle*ލåÔ½"su5ÃÉi7ƒ‰Ì(S-\ú‰!Ö=”Ck£7Š*µ'zwÁˆÊ¡¼xXá=ê ,³4c:úü‘;ýÚˆúK:î”ç9’TkË!'ùn-ÿÃóùt¡‡tˆÜ©è¥S3…n¶nxÈ8H;:}< õñDòº36ÐO7dˆŸŽ –‹¶pÝz7ûŸ£­IÒMx‚Ò9ÐúTÑŽ´«‘âôˆ²Q|ª«=á#N0ÞþÑâÚæ9|¬o –CÐY†C¬œŠ­ÄÞ1´Í‹ñ€[FF벨ËÚÀ†ÌG¥3N&/òæ>æu",+)«>HåÜÂËRZ-¶X»t2B®]›~¥8ÎM'†¯¡€¦îY&—×5˜»©%Æ×Ò{ÒÐÏžÆ8&ÈÃ’Ð%›.ñ”é AòxÖ×Všæ0?GÐ9Q§bjaR)š6‹Èn¡Ã½Æmgâ¦/ºý]J4ˆð À<Å D-f²Å‹nW"¥ü†/é|îÏê¢`kJµ÷ìI+â°ýõR¦·f¦²tl(lþù¡«ßÁ¶ÿçgãÐû|"àô ‚O8x¯åQXÑËl†½è÷üSŸ`a£Ix2m†•”Óë†ßs’J*O¿N8]‚àf“'äÿëxŽPÏ´OQ?`Áïæsl€§kªÜê©Kmy…ÈÝÓïÓBâÃf*çQ•Š$$Á(}"©Aàv÷ô‡}#Ë<Óµ–Þ×!õ» “qÔú¦u‹ «uÛ•·N†^Éíewèu÷Áò*Eµç3]>u{>7`og:ô¢s1ãYÏ#ãªVé*‰L}Wg°ÆQÀ%hV2¾ø‘ÉrÁ5ß`v‰²3yP¤kߺˆXôo_…<. 7{¯B,%·Ääã–}¿t„çÕ¿dfAݾx|¥¾Y©¦–ìöR:lý·PŒB¹®PÚ‹òí^ž{%Þî±9$§ŠRúÉuQ4/¤¦‚æb-ˆB˜ÉÞ ÚÁ˜KSm?ëlH¦ø— a‚¼†Ùtåc¾¸êÝΡ37„r§ê€«üo3Ö_æ°Ùêý%;õ" ¿/rp- àíL' ‘l$ŸÜǽ£oI–¨s¶lü?@O" '<àÁõ³,l#Ç;ó˜¢w8sjøßŵ?fa‘œÎHõé« )DEÑ¢Dƒõ —íG¼6<þud"×´4­ ^›‰ÈGÒYÝ'³«³žîð·ô¸øÌYSSO’·áþZŠXF¥ˆàT­+²qy¶€ô´÷bˆ~Yu!Ë·ÿoPßÍöÃí>|â½÷„­}ñ¶ +« ‹€j+/qž†2Ÿܰ"1…”ãyIŠ2;ž„ùi ºæa¤R=ëdšÁG—4\WT¶ºÝ´˜‘tÜw,ËBäâÛ]‘È0X¡½ïz~ƒÎÿ@‡„ç0»ìtUTòäÓ­ç úÅ„Õíþˆ —~½@Y±fîԸϙUPx™7¦¸þEÒùÜèÉŒ zcƒåÒg ¢…ÙŒ eôp %‡§êí¯DÀõ+6ÓW·d4aˆý €Ÿ-JEÒxºQÆ>Ÿ¦äaLûâ}üiLõ>óÄHº§Dd ±?¹½!Ñ“ÈXð·‹ì¤hKE׿t!½HlN¾ò©Dº#ÓKÀ ž[ÇÂó²6ÊD ¤zùšÛ»M²O3ì—kU›Îæ”Pð‚±?gqëùSŠ—]ÇÆ±±ë°'I;‡ ’˜_I®nª—\‡CýmRË·¾¢…:'Š ê8NÆ¥ƒ^´’ìF+„›Hp¦{©2Ý–k3.›6]Ê“&/+•%5v9gú3£hØ(eÙ‚Ó®ö>È#tÔG‰y I*9½ö€˜µrëXƒ{¡ 8Ç h („_™4h¹2lXÞ KÛ,çÆTn§K‘MmgÄ%÷HÔ 7ÌwíêLΡЙ+WDÌs""ÄA +¿ß˜6ô Áœ\’ñãå¥CËrÙA>ŒÁÕ‡Ðçƒ8èÑ5In«ÌÏ ™ÍÕš4O•tõr¦ þy«X"ÉÒóž‰às”¾C*fߤ‹’iÆNžÑûOƒ£Úh@6r6vÔ¬…ýà{!Ða×w®ö}‚d“*Bd î¼M¶Ù-{•»Ñ¤l»¼Ë÷Ò«Pƒ>…Žæ2)…Ü”{å[1%²˜)ÎíQZ{èð(žóE®Õ…̈>ŽÝßVcxæ˜ ¯#‘ônGÿAKUκ3e!W¿Ú w<‡MÒùt¤qztæÉŸtü`VGB"ø¸ì¬5y±m%)¢mS¨·$òÍ•!r2 ù>rk!ÍÒ£‚õÎ5äf‰ˆ8 ”«(Nì9wö«è:Ïr³"f7 ´?…Y§Ér¸ý6ؘHRÚ¥ŠqJ¨;-Ì´ñF E³Â"?Æ€‡Qp’ü¶M§÷X·A¦È´š·u-ö+¬7èš9æJQ¼˜?mœÙk\Í;¡‹?Ò`*ßH{{W},H”®A“;+H¦ÒÇj=ùÃëxŽŸ¹<_1õ~mÞlšÿÿ ¤óÌ3g‰õdª§SS^½ ¿å,ÃBiŒI·e4X­vßÚÃøR Àkªk?…¢Ì  }bky`HИ¨žèËfÞá+þÁ.滀qä > ¨XLŽˆ€î“7‹‘0c¨ï{I­ 1NbŒI€¥¡Ú=O3ø3éx¤}X^‹@[áÃÈU_ô픵x#›ÇáÓškžR[)@Ä6ÆÀq ¨Dì)¼Z§sí­ŸDO$zº]¢¢%ºöÕn§P—ïes¾¯qKÔï~ùšô¡c@—,8ŽHHuas¿ÿI„èâµ½h}fkRrˆó€ìÞñÏ“­·j7Yv_zÇÛGeãr:uYO:“²Ü&(7‰âÆX ÈÚ¸P€ýb>œ«"Øí4,}ý)ô7ìx¨7F1÷4„ÛhXg±‚"\qµNŸwd_„šJ„Woú¯k]!÷I‚SZH(–nðËæÁgM8¯ö¥o÷çþŽ ˺ÇòùôJÍC¯Ï‰€8Á:¡Ö'ÓØ$ÚD;¼ê| ì…c´êá¾s6à Ùûqú”æ3î§™ŸbãÑiqu¶ô3{õÞ"íwÎ×U–e'"ûO7–s’ä›.½—uE€D÷V°oæøxÎ¥G‚íç üœBG"¡ª£û^¸;·ºnu¦fÏá±jÔSì—6Õ^Á)Eî1è¨EÒÁ xD}jw^óDºƒ‘ˆ¿Ÿ¹2=Ü@Y±sǙƩ=ÒÞaôöÆCSR]ôzñ Ù±m›ŠqpþÄöh°-£F¨&ˆÕéÓË.ÁøÞÀRõ¨ t‹{×4 å•€¼³r`®+Ió¤iEKÜ>$ä)ÑŽÈvÜ®v¤Í–%!KÈ• ˜NÿKè}0ÙL,Œ !‹£}ñ‡1@Vx"˜jÌä€;z<BÜð’ê™}¥ ˆè „Oj†l­Y DÄÇõS?øç«\à‘A—û³ÍUÜLKнàRQÖÎ,Qû˜oe¢=ÜããBp’S³FŸàÖ¢›eŠò®8¢È˜’ç> êòêâ×÷¤icAŒ…«N§•×*îv™Í…¹Q õ¼3ÕÒU 55d»>l©Iš)hx슜v';<Ÿt«úåZÚy‡Èu'–ô3rUçÐù¬)î<7ùïD,¡…öŽÚãNâg†ëG‡Â›,p´\ŸÌ6»œŽWbç{¹cã5Ù|ÖöëÃÆpÒ“=dØÉ7¡Ä¼Úp©bå2,)Z6.ý’Ñø©ÜM‹Aìü\LÝýæVŬd|h Ÿ_`m†8„³K _¦s˜bM›<Éžgª¥8'Ñé2¤«*–K|&7akroÓí4’Zz8#zù;Ãc­ä>¿ ¬1s­5‰ ÛÚ®øz…™Lfz°£"àFxÆg;쌞óÈõ˜“ÍÑ£2øÖû5þu=Ħ`é! Ý8L&)w(rŸ¦@AÂY>ñVªsƒr,EË8H©/Tiêð΄>GDn¶»hš,±¸/Òô„Öì§cù”ÌZúY£[$Ý— Á*¼ “Úò^ Pº&wV B/®Õ¬Š™q˜{ô‡Iç¹vôê‘d⤼ÂÎÁª€à-!¹Y’—”.æg3Ñ »ÙöAÿÛ[]ê…6 J*][@³íÅ秤]@Ú×bøâY¶ƒÒ·ÉÇã¡\%Ë5f‰#ŽU®rópɨñ ÀNÜEƒŠp‡"ñeÝŸ'„†ê›j&ç%2SA¸°Såt•úÏN¬üò›1!3–ŒÄz|]ž !à½F#ÜÿüÅ¥­ðtŸq£Ó^X½~ žðÄV=$7Ú_ Àý¨ZõïNdz§¥žO|<ŽÿÔmòNì^{Óí·\òÐB!dy©zÙœ¤Þz•æn£¾,xµ¾Ð^ßu ‘¢µbO^¦@’¾’n/¯%b:ä©»Í^8‡¦bHÌ)y´L Aѹù©z2ÉŸ‹­Ø\§b¤žKâ³ÀHgL`@Wr  cŠ\…oú˜Eî‡ÓñÕü íE3€ºÀDÏžV….¼†žHC…³ÑäóŸÔE•Rœ4 jÔ±(Àž«ˆ1}ß»ƒÍe»pòåH:ä”òwv×itR£¬Ž¸¼Å^ÃÍx°ÅuqÄ(àyRFµÿ)íG~š$@IóJùØ™ à"ÚM5»>€$yì¥ýàT¡­6Â|*…¼jŸº¸nDàºFv.ÑMX¾_–J“-ß:ýÏ'/;dð1±í@‚©r‹ £—_!äÀ|î~ôûò1èO…4CgÎ*®,‹„rö£¥t௹µÀ?À=•+LÑ–qÈY¢w!Üê!˜<ã%'tÚ'lÒ%AZðÖŒs˜µ¿ö¾¯mÊ;ßýÅÏÙw\wõú­üwGÅÜj#!À®]dÝ¥Óæ]—ÎE¯­B–¯Ó3ø/›àïçûù¾ãkð€"½—ú­ápeˆˆÏd?5‘¯Æ[Ò¸uŸãÌö–&ÌýÄ³å‰ (ÝE“-%7‹Ýœ¬`k—ó™¸VŠ.VEœøvð/‚d ÀÖÃÞcªžøWA©ûX°åû“#øDß›Ë΄pÒ<Áç]™~Ó¬q5G´ÿ$éô®ß4ø‰ïeÞ +£)Àå³g9†KÂå(˜OžS'ŽºÝ¨£tšG½»Yɿ䄱³Ì‚{]…h“%|½?[Cgßãøa¢*I°‚Œ”¬,Áq*JÕyZÂ:Í¡|Â)„ò€@4™3b•±ŠˆLØα¨¿&™;Õ[¯àvâ“qbÛC?šÌ?Íñ)ÁO¶ZÀA¦öȰ…Åuì{’#…¦1|Ä&Á˜:í„ß7ª¸þ’ã¼$ÿ9©Ý4ÝÆÐCÙÖS‡[=ÉÍoîä,?ÛPÄÓý³¸X!M§AÌ+pÖåvËüP‘·#^¿”PþLo‡t‚€(z‹Õ‹Zb_œàN)ÄÌö —¨Šˆ:—:—•bæ>QÝv(ï1XŠ'"N ']ÜõÕCèI”Q0KÍ”v…¯ße“KFþFô Và§6Ë]@`sú 0h8«wÓ(Y»ÿȨƒvPzfq3?¦ïtSXmbmùñÁ!'*Á„ËË×b¹â£m&Ö‡D†jJPhÖqJ±ÀØé=±"³?¡Ê@{!ST™›§ëŠ`ÑôWÞ¬P¯ëG\θã©ÞΕ|°tëm#¶ J…"þsÞØ gÙ#ƒLü®i¸[åCt‘r<©¢Ü,üºHïãj‚íÕ2TÔ ÆwRC,‚#PXÿngv#UèuËMC>€O$f\(væéɆÙ1WiGîä¤1"ŸúôÖA:SØß¨’½åŠT.®åjsÿ¶CaòÌ‘ˆÈEKÛ‘e!3×ÁÕ«¹!:ù÷+f‚Òî7ÇÉF<=6Ô6Ñ“G¹<%Ä ©ºhZK°í ¥ŸÛ~]h‹Éܹ𛅠¼œ¦†lì|½òÐZOsjø @Øú~u25b&^¨ÒÓ;ÂÙ”ù½#u“y~ÇD=È:Ÿã:°4Їî3݇¹]ÿæbˆÐâñxÑÇêâ<àÏ+ðf»¾Í„;à†~8/Ð÷sèó@¤‰ÇðKNb!(xî§m-Žû=£wîñø×]²€ôäû¹Ìò!}ååû9.>Ëöèû¹8¹¡ßEþ~¾Ÿ´×»žò×ÎW>}r§Æ%¿5ø Õ/ψ¸~¾ÄðõAñvbBT0ù±×€  ūužîl‡’©…~žJâ¬×èG×…3ÛÚâ=D]z¯ôþ¶räo ¤xãÙ“ˆžO2,?¯] v’?c«°ª!êUiBò ò…oAX½ÅO&½µÿ–õ ÿ6T¤¾1«ä'¬­›æãžkTÛª¼ˆü _š©_òñ‡Ô}¤Yy*Åg¼Þ“j™9âÙ7çì%XŸ=å ÙÑ!Z"q€¿DàóÑI øãÍš(êüj@ý–^¬±¨s‹W/ž¸·Ç©Ï·A¸ËÉž¿dŒÎÿýåõªCúÜͺô bÞóïç¯m}PÈãù$ðøoꈭTòΦc~[Æá,ü§…Æÿ˜™ýgÛÛ,Ákÿ}¦ïã¥ôw‘Î/eKvÕG{›ø¯TõÔ×~µ&¬$º4*ŸŸð›dn­³*hºo” Èý£Ýß^é¡£ÊܹåVåÌTÔ¦j»Gâ͹ה‘ ³‚cP=_QÇfŸ_Õø0ã‚þ(³«¥¢ØÞuØB º2_ã)Tð£ŸÈc€3Ío·["ŽÃ þ@'BÏc…¡þeêbÒ(~M~ÝÀ_rÝâoºkBnô{ËÇÓe7· †Ë¸M™yX æz©‚ü“¾õ@Éî?·1ÓžD­IõA”ÑõôOuˆÌ\ÚI©‘‰ªLãÔ~hYéÍ~e÷(¶`eëÙå¿ç*Ã6k íÔf-Dä>`49<Ó¯âƒ_|yÍ,¤žJÍþe†‹ÎÚ¢ÓŸ¨;‚gþòèᜢ-v‘bÿ‰àÛ}xf“«A®—™¡KÁÞÒntâÄn3â‰ÑÜÆ”™¿¼£íÑ&X±„Üæßø€|2élÍÁçɼàÅ ñ¦Ölg*êÖ)UXøª´UG¯O e]Á0Âé»R¡çrpßíÿ¤D*£¯%L±ÏŹŒí¯±ÇóQ°\%E¸¨§­ y©[”€ƒ ª0o–ÜËæÓ,Vîïr‡žáØ<¼t8=9¦"p¶¥)énQhws@e>žÙ,tÌp‹0´ëëÛà˜}%à÷‘ÎgDÏk'¦{PÒÕè% "£$Z=¼©ÅÜž UB¬~t.Ux6ô‰“rÔ›30h u©'jœøÁ1¦Uç:Óx&¬å½¤³‹e:+Ê» ýZr;I”€Íã°ð†žY¬;cÎÝèh4šS$ûŰ€6Jž¸Ô ĸÈ*¨”>*ÙõÄ4NK9Méⲯ€ gën£$C"sÆ,¿på$ç¼çç©ñlìä&þä3еӉÅÑlö}}’_¢i†âìH(—m —ºüŽ DÞo릹ùôh]{€ˆýŒwÐ*WŽ\½7µL¾#èÕ*.Ã쪩p× >ñ<†4cyr?ÉÈ8| »Ðrª[k}Â}dňÃN}’[ñôƒwn a¤Hd'Y*w6æ¡ÒJÓÓÁ]?‹aB1y”Kx5•´<Ù7Uõ¯`Ê÷¯2«Ük"ü¶©oq¦¡§×½\„ }ÇP¹y²Ô°Ìi|¥Iø­åÜÇ–Trf)) $ÎlªÀ/Ð ^“Ã5qçCƒ’q2ì?»)´¯”ÒJ¸¦ªnO·í²! IQa5$(JRè]¡9íéÀæÏ76k÷iP‰y„‰¯ëBˆ\E ‹}ÉØ’]Ä‹g³æ K,£!e圬ÍñÄ”KÔSt­U*ÁOkïbfõÜ5Ÿ äã 0T +jÜ‹ ½OtĬäU:[KÏ–)Ê™riåiÉu&."(¯@y¡  ¾sÈ*˜%(ÜĦrÍö®ËÚÈŒI¬¡ú³ËFJ‘¥pˆìfÂ}1ÄÎ¥1"-(!ÛòP1vÃ|¶¥zEã2Û“¨…¼õí@Æß÷…2@ñ\n/6wK~¸ Æ<+-×ñxV$ýªjžG[§ói“”:™YÆÃ¥ºÚ˜€1¿Œ8DÅcñr&;Í’N¾Ë¤¥Ü¡ 8Å϶Œ¸¬'æ¯øü2Òyåà²B# d.a´ª$Hè·‚6‚Ô)a¾]C]‡©ùß÷¡ëêE½ð¢'WU¼q‰J/ÈM}×/¼R~Š^}Eéò½¨3Va—~Ñy ˆª?i…9áH|€NôJ€»H U‰^ºÆ¿b¯L~‚xµîº­U„ø?Äp`Nu–ìsrâ¸î)É»ïr7V£ ´A$T ãÜ ¼›‹I~èzg³º¿4Ë Ul-‘4§ÄµöÀú0~? ÷Ã'‰3Ýw»Ss½¶YØ—KWÿ3íø‘qµRáEt5¿óÛ¼YÑ9úêÜ]ñv0A¨%.mÜ4žÿ€;Šø#1ì;~)l/YöKvêÌó›DåË2wÐì}0éüŠv&oTZ¯'Pä“ÞžX¸A,ç¹ý1±˜B-<æOSÄ(ÃÈ‹éÅyÍù¥PšÔÄ`\èh€Ò ³aèlÂÊ?œÅÝäí`?ØQÅÃuçºØ©»¶IMŽ&åãHÙ#Ùî³ûÌRÞ—SMëÒníâa¡½`GóIhÿf`*ÞŠ,û&ºgG$HP3%—> rê¯agkSéE¶áð¨#‰îÈ'¥<“Z&kÓ>¸6Ðch¹ç½÷OçZ«þ妨³vIêÇíÛ‡¯8©á`IÕ&Ã&Úäd`»ÃOPòÐ\hNßìt1'ÝÁD‹º€ÜtrÓ°í]òõ¸iÆ@+»²ž”¶¦3ª.ìRS›mÆ‹ 5èW„HÈBÐéÝÛ­úôuˆ@?cØ&^¥ON泪'q%­‰“QÛ0i^N-oлOKËKÅp<&=YöìÉU\š —8ÀÞ!ÌÃ3‰ 4ùZüŸ†Æ"’õ…\BÆ@`1©òð(r <³óáâjܘ<ŽÞ Â$ëqÕ»Òÿ!¨Îð¢€p\sê?"Z+Ê[:Ù;´;‹ÆyÞfÒž—ÿ(ϳ$ƒÜ}æ{vÁEÓ‡RþA$b1ð¦øÑöLŽxz;qI'S…7LÅ]ó¥>0ûdÒù…BžGðÒÃî·6ßüšþrýsëNw]LÐr¬ÃôvZlÌx³ã ¿ómÿüÄÑ7Å-+.Fº=QmÂô˜Ž¨SÆ‚¨üμæCŒ ËŸ4àQÒ«S¥ú>¹^À5_›>\¹XéD)¦_€ ¥éö‘ÓˆoÅ=žR_€â| >= @UH kè5¢Ì¾J(ÛE°œÔnFµb-CErwέÌaOQfÿù|Úúãñ(qö!÷ýð¤ÿOΰxçó>M»°hºß«Œ] þQ"½ëÌ6®ŸÊ mšÛx/M™ì;SÚé»5;Žç{1ÛAX`ʽ`ölftrXIèÁÌÛBÎÊæ"ÙãÜ• æ ‘¥IçÝ´¯‚Ä‚‡(Œzï÷•Y9s#§FŒŠú,¢ ™zÜY×JÉ’NÄ/âº-ŽPöÅ9¿ÊºæJL)s'åÈv’Xö“˜9¿iƶýhO˜`wnd­­¿4d³LG<ËÝ7Aiµ:÷"Zš}Zl«cr¢~Vk'Ýå2¼ˆo·á­Â}• øp…i캊ðJD¨ÊççKsm°ýùù|âãœÊ@Ýieò"> ]×À-Ý¿¥`°èe S·ŽÔ~äz% „Žæï±2 Ø}`ïÈhŠóب Îx°ÔÎ2­³ºÃ±øø ÷RÔØÅW©ÿrg ¤ì±OÒý+ާèè•4¼£C« |ŒÑBxë9±,¾aûÊ¥$ªU°Ÿ «±Í6)Âa>m6mæYR?ŸfŽðÜY¸§–9ÄdpØ«ïw»Ž `O¸ÇX6!ÅWZ éÛÿ‹‹02C ÏÜ¥£zߢ hÜu¸LƉÕÚ)jä=²"i<Ô¢/©?@rªKi¯•Ò$E¾>èúÖ4¡Ì¤³Ø®O9œ]Rp®ªG¹û=M|½ 8«îp¦#ëpLÍÄ q䮉OjºìuÑÅ„UØOQÖÊâE/ ·”³ñHç‡q=ž”§x\{DwÌÏ)ÿÑÊZ´Nß‚[: §Ò6¿ï‹(€~Ågı½&q<úÂæV^æ>ä¼öÓ±ck`ÍšâvÏ€q p^§¬ ŠIœ˜[?6It “>ä|Ç®œ5U÷úµ¹wkAþl.ynÁúr_RÖúpòίòyª­ óìJ%(¡,¢‰Ü'¥ÈU}à‘Œäü4z´ÝK€30ä“;>AlA•È"aÅ©¸îÄ…ÃÀ×=ÓPÒŒ.ãÁÁÉÆY«×OÖ3¡ªGc«U³(zðÂD·ÜSxÜœa98oAžÏ§{sB³±*#³¤`/XÒÓëõ‘ƒG&1^+Á`{£Øß¾/¿Áü]‘‡te£Î¦vó\<Œåø«H–}ÑŠB°Uü.•ëB\‚¿™úökb/S×@¼EíœAœ¯â¿=È› €Ç<×#®Õf_³uÂ+YùÛ ©$ðù ¹¶©áw …ÏÏ]zñÞiJ§†–dÜèô¹Î¢e>ä úòªZ| òì'˜8!²ÐÈ ^<ÔýhÀÍÖ­r1­.o1y”d¤ËP0<œaûéÝ‹BÃÕÁ´ö|‰Æåà h.Þ¹” ôyÃf‹Û oîgåüPš„D"1OéØàp•T8¦7ŽqOG4J4×ÏIwó8¦tZò~Ì%¹¤‘®ÕÃî•ÊÃU ª½W• ïoPýâi&U'­ŒÉhÜÓ+ƒÎ8ÓõX+*D¤mùøh{)”À€uª­Ç®`HÌÁ}¢x¥0·gÇMçsçlüÏ:ý—ŽAµzWWȵý_dæö2žKÌeøœãLÌ5aº[Ò̪ëœÿùiÁ£ôß4a#Ôèïk‚‘»X‰©Ô¶0¤KËù }’•ÝëžäöœPaØ,ÂuEVÄ’ÌS€sÎÞèÈX5_QÄ©„Ë™ô^ì‚cyYêf‘î$1—# uà•–Ûh¹UÇá3ý-Òù#Ér™ ˆ¡¢‹†âêÄD).èKz¥™ÆëP£âN1~N’ü*ÄF*÷D +Æn@ ’êÿüìX‚Y€øëC%³}ŸÝÜ„iǧ‘Þ`ð>s§i9dÚŒŸÎb~lø0R4\:ßHR½/jí$¼´$f ÃeÙÒe ¦¦¬“kgÜä‡1YÔòÔE‘z ØcÁöQB-ÚÇ8µ1>ÄXìb¤ár$’£ ÉRx5ÖaºéK¶QÑ?ªm@4h®„ÿd%!¾Ô Í­,[Œ—Ç<\dŒÏ¨ÕBŸ¥Ê©yß"—ÉԭˆÄ;­ñà…hxQ$I[q=D€€ôŽAöD z˜±R g×fy0¾Kf~@LÁeV—Fög†Äü©G5Ô^S9¡Ý/WƦ²êÊ@°¤xÆ×$õI”-UGo¡™q±CŒ±-¤_¡“Ÿp[×3lµ=Sµæ5GL1sZEíPg‡‡Rÿ‘YÎ|?œÖ¢‚‚ÿÇê®)U´ jFåº1! uK@|Ì“*Càˆw™i 9c†r~¸ôºEYêÄÔÚò‰CÕŒ׸”<ø˜6¦*AÑOŠ3’Pé†v=CHãüîmt£@´Þ?§u&yx,_8»¥BÂ2Šºgö L؃‘¨ÁŒˆ1-õ^óÜŠ›Â‰e#вñšžaò`O=rÜðÀ®õé'Å0ÍMPœg§™ÄiYÖ/M70püqRƼ;K–"–HëÌ_=†Ë‰9¿¢™øÌζ—T8¨óÎ>¯ÅÙ”ÌЋ٨eÙ%{jÞÍŒ<ùÄH¼…%ˆ9KX]A¦°±^ð 1ÇœRÎwÙ ¢øÔ¢qÊ‚à[<°F2nçÏçä´‘÷(“bƒ¯G¸ LJB òâ:ÿ£G %u;¹KŽ^–sÄÍÊçÎØjv„€ö&áí¨1â'¤-LTõ`ó !]Ày•l÷*…Ñð[ˆê9UqDŒ£–« Ò–:~q¬-Þf6ˆçK‰ÍÙ#cî~ÌTO¶t¶Øà_H$rU±ä Ť‚ •Ü£¹ø¿B:¯^·#ÈooÀBÉñJä’ÓX%ƒIgs„¸5·ÙóÄìL³ïª7Ïl’þ£I€,Õ;ô»ƒ“q™VQ§Éˆ°ôÎŽî›&Jó]¥ƒ[e–mªÑõü¬-¿iþä4È\Ý Ù§¤Ý$gçìiʳ}2Åm»äÖÁt#Nm•{qăí!çEèV@1؆Ӹåj¯4k„9Ç&³‡}¶Õ½iE}‹8ÆË’¼²M’D`˜fØY½úšûžË¨^à¢ËáÏ”ü‡+“ºãû20Çù¶ ªyö×"nmuÏ]©½*ùÐm[9à9ÖÔšüÒQÀšã|-¼¼-Dú>"šÇ­]$Ψ#¯¾¶'ØÒT¦a3§’yZ[+/³bœ%|ŸˆD€©©z£Í­„·÷ ðÀS ÆÎó²}@~Þïæ PZnù>háeÆêï’Î>D÷!Ö€¿Å õ“¤6>Ù9+ vî2XññáuŸìòF­)‹p¿Ï¡ÃbsàRç… >À®‚xþµíp£¿ mço9~ËñÍ…Úì°W¬”Ïvã¥å_§4Üvx·°êñÏC¸×àW[-ÛÔ|fé4²¡¹áѨGܢ`éÉË–ýüÜw+JþtF[@݃rÉóóÔ)~î mÉ©PÕ_|ÑI¿¬Æ&ÝØ 'ÔR!oõð¯iœYðÙœDr´!0fÂ?HÓ´š_97uísœP;åÅ0A¡ã¸â –ø³Õí²ÇrÑ)FÝ- ‡ýß~˺,Ä ßñò ú3Ó#Ùƒ¡t€e]w₼¤ðw>ˆtþÕï(íoñ[“N.Ìì;Üã¥ÃGË95ÒàŠd‚ú³„–Å`ñÞ$Ñ´´C/ˆÿùGåb¢a,t\‚ÂúkÇn Y ‚ˆØÄ7æåéÈÖc#C#°’º¾%,,)J‚k¯O¡ì‹›ñ°&%TL)ý±;7þnkãÀ…X®„`ZµHä6Æýñ](2ÿ$ÚYýVæ‘t~J‚s1yù¬Ì:§}‹fn«L©¸C±e0Çö€1ÉTã Û™…w‹€ [؃$zm°WDM‡ÒD3Ö×Èêí4˜gŠŽGK´có¶F8bcßíÈA†kkµa,wr‰Ä!CýÅÑUÐ-›¤›Ý®¢Iz:Èï8QØÏ-9AMAS,ö]ÜÀB×äØ.ŽíÅ w‡ƒÇ#¤–×–Í¢CœðB#Mki¼#;9ª·µW¬:ëÕxB¬ªI•é Ð̈d¾qgÕy³˜›ÞÓ¢ï$£{ï°¹£.1·ŸÖjÏ¥XP–l“‚ó[Ž#ks·Ø<âÞ¦*ÒÿÇ.ß·R¦eâ%ù ê¶öÍXžSë °#œÁŠfíÂܵÌþçʇUÎHܶ㓌6)Ÿ‰ÂQÌfnxÄ”œt—)"´zú hŽ@l|û·hø2e@žå³±0˜ºçÑ’h‚mÃ<’Eù:™$HáU¼GBꂈû7#8~bcˆ@“¢ë ¢»–Ržj ˜âö7¸ys›¿ÈÍŸ¦Ê˜Ùæ©I.äI<¶Œ˜ËJH•‚r©?D³…$ØE/+Ü%…’ôÎâ4ð®Ûêí —$ˆ6º'x¼ê¡¬Q# a.–X^q@¸ ÚÓ‰a6ÂÅ™UFVTغ܉‘»ÈRwÞL`¦y›%Åç²0 È=ƒ(û“D;¦ƒx!©E™É#Eñ:Q9g ìÔ×[8uQ…„W%s '­Qɪ'É4{ê¶m‘ݰڨSx~%E%plš™”ö +—yÀ1ß´³H§ù§IçUÖ0Êá†}(½‡@Pv™ Jl„—¶)7>G¢¬hVƒCçYï"%µ›â¡H¸³~º+”u2.N–òA=Ÿ@$©â°å(]#2ÉK¿P™î벤,BVH~?õØA(†Ó\Ƥðñöq§Dvá0Ïõoy>šÖæë“kÕ¥Žþ¼4MЬêÚÞµpS> ®A¡©Ñ•ÙŽùŽóY0`¤üÁP”9þÂãa%ˆtm8õ¦˜…« 2u†’tqMÉP·Uäü¬öë˜;¢d·W³ 0w9¥ÐYz<äœÍn*€`@¢·£|èä½ÐËøÚK{ØšHµp¸!×uñÏÇZ¹=|µö£'›¢´˜ð/-ãòR„½:ˆ™…S7û:Še’Ht+Wv¿é@`ýF¤ˆjÖ >Q½c#DÄSÑ-Dóž)otM¢¸f0mrC ë4©ÐÛÍL&áØTc5Ù`Š‰æ‰˜Qh*žDI‡9ÙYEuÂ*îY£zóc@b©œ†–6ý’ç×€×ì1uJJ©ÒᑯP0¶#uö²^ï78äyê£Oí:êQJqöºOŠ^¤æï²tUäŒ *«K³òÚnùÓ¤& –?¾Eb*¾X²e€b´ƒy‹›‡ð–­%ÛbùŸ2Ã4%…¥®NñÀ>í¡3F×) :‘§[õßò]x=Îe­¤ê"ø0 ·ø¼Ötu^ ‚»é­Mf •¿á2þƒ¤óË)—kì:ý^ Ø­ŸŸßøÐŸ úL<—]¼*/:âëŽé¿úùx™©éßbµj4~·hŒr]¡ÒÿYŠjT?¿É4ÛÎ`Å•÷ûõão~ƒ×0°›i]ø {…ú@x‚ø°sqÏæøzæbÛúÇã¡¢¬«‡3Q,o¸c[—SQ]pLðﺂIwׯ'q“hÊ‘v}þßpû/G+ß(ð§å’I×Ã<\™:þý|¨4fRDßÍ|­ª…¯¶½=Z¬©MNiv”¡=Á„ÃæœjŹEž&æ ÀöóŸªckG L=>êÄCA°7Ø¡6Nǯ'ýã~$é±[8¶—qG¨™±Sž% 0õc¦]öXy¼¦”–Øæ»£/ {ß.Üšø0VÄU]vGÿ’"ȯénhÎí3C7'¨çF÷p(9s¹'ൕ7"™MB‡XÙ»‹îHê‡hÍc‡;QÌŽó´ZŠzo’|$I@CéÆi½g™ŽêèxâÀ‚p¶k]Ûhèì|#ý7¸ÚïÃtùÅS sô\ˆÙ¯É˜a|è'GBPŒ4ê 15"²2I•$%ùòŽ…£”3 p60Æ/‚)3“c+á¥×,Ñ×ÄB;êÁÁÖd¿è}.±+L¨™Ò‡?fÔlÌÌ•†ZÕãmõ‰B½pˆœ%Éí‚rYF\Nˆø!# ½–wCÞ©¼a !/\O%÷FODçÝ—b•Q5ÔCæó6ÎÀÎÒÅÓÿ>ŸÒYÑG ÃºœúF{Áô Òó)Èö (£v YÑÛ²Ò §ï5";@|˜·ìt.¤NÁ#brâPÛ‚ ¬ÑZŠˆdGµ•ÊÄ„„êÖ‘: Oú&?Þ{ŽóÒ˜%Õψ7@ï8{ümÑùñÝøNrŒNçX=@‡¶Ì5´ á‹gûýt<°#ÿ,ˆ"9@~S»iÌÏe[ÒÌŠ(%]½’p³¿5+8§û2—çG•“`|­øÈI:KÑ 5r”ˆwÄ.óþb|?‰ÍZe­|?¯d¹]‰ÅÓrN;ižïŸ[9n©á~¹q IcGWJbJœÜ+ª¤®òíˆüZ^^ÙDàyZDt“h‡RE´X,Z¯„’Õ:ÁÑà Å™*òà^ÙoÓ×H=3…À¢4‘è÷*€¹øêz0aO«•;YŸDP$#g:1ªf2F‡ÕË%iK€šòSCtvk:ÂIXš QÄél$ðsêÒð[Ãb“í- Åþ0Á¢Ë»Úß}r0o=¢¨T& eeßÈÏç…W›&êàhêioòO"¶J"²HF)öéV'ÆsÀ.«ÌÈZÅh ¢«ëH>/³M¢Ð#LŠz? –/ï_¥k‚²6˜c,ªgiV¾Qç³ÂçgIÙ¸pNŒØ!ÒϨ¼Ó"PìBÒ€¬ô€€Ý=“ÑŠà¿1W‹Nî«z%)ªH»=)M”½‰|½Õ ÇÑSв­µñC'˜gE.v‚éñV/o:ÓkA.[w3üè³{T9 {S ªå©,Ôvº§”P±§1”š0<Ë!Š!¿±]vŠPö4IKo‡€M!šÌÈU¶¼I!'›âQ'×*yb‘™œWñ®^±SW'ìåx­ÇÈ[äq(Õ!Ü8#ˆYú lu §ŒwÄÕ#^³ü¶‘ëT þ‹IçÓ¼…‡DÔ-?pq%)[º!uü{??Õ}£ý{n-KßÏ_ÿ|ÏÛ÷ó)ûÇ4û¯æº©šûÉïKDÿý÷߯޵_±Î¯ V{÷þ%Lö6R»ëNÞGh5ƒðx<Ú´Þß®-¿Ÿïçûù~¾n6¾kðý|?ù“„ßDÍ÷óý¨¸ ƒŸ,ÍTå)p†8†âº6Êïÿ<ðñx<ˆOð18óévÕõF(Õvì ­¬qJ¼?V"lEöÍ~Š©dáÊ'ç]Ù³V5…PbQB·Æ™kwä©ì_øîPv[Ë¿¹Éö0µ¨&­LôÙfÀˆ øÂÅwAÇx#´²jë°{Ê׳8›qEU¯¡]·è@?ÂêzÊ'ÑcЇõ­~žjÞ1ÎíXHô{:£& m™´•y3CMÅ ¹³³÷Ù‚ #ÃLŒâUýÞ(°¨¯ü*ó!Kô‚‰‡<|@¾-.šÌMß:aÃx´n÷“´`.&ˆïi÷Û›ƒÑpϣBböëJ€ÛNˆ.¹¬&‡íËmUþlµ‰2?¶kÎÔAyàvÛ»YIÐM¦)VU0ç'ͧÑ匮»8<ßÒ#tq*ác¸Ÿ‚£Yy‰dPÀ‚Ø?ö×ȠȦëâ‰swTQSã¤AWäÔã¯Éþ¾1¾!©¬”&·ÏF¨ÐÎJP^UŸ”oopö‰æJáî4$*.½¼ÓIÕ éšøcÛÄ)QÅpñÁŸÓ¦cP·v5]2¦ ¾{ÙÄ­žH+ÄÁDí`ªl¸ÆdkÄ>v–Íøha§Õ$zH7ÏámÄ=˜ËÏõÄ` ªóm×8Ngó6 rçcÖ ÿ‘‰¨˜‡„C¬+^XáfâH #À¸¬È›½¾uÄÖ+:´îÉQ=»¡ lÇÝþ‡9…¬£~mˆQ‰UW¤ƒa„žÉá/Ö‰Ý8±ï0ÈÔPàq^-:É#º²×¿»ù#ÉÅ­»y¿t^iUš ÷²{Z˳a \8b.êx~Ù«¶ {¡’#B¹¦sÐdÒ”(H$ù"Ã¥k4,-%»}ù‡§Íøñ£ç”dÎÖhÅ`c”"AÃÔ0ªÂá—÷ †'ƒi7 >ì¥<¯¾…p‚Lr„¹ÃÙÑ r¶´ vÃã‚Ó½Y‡`|K—£)ÐguƒN²-ØÎþ/Ó»bIÇí|7½@@ vì*Kæþb)þ4ì2É¢!JK"ÞÀn…ÀÉ(®^šc1/¡¹-%=’èLû¡ãiŽ%ñŸ1Á5RM Ä]$@Gµ:éf'}ã?Eb§ÀE/:¬Ä³¯=ZCõ`Jso \¸ñË'w8¸XžBøtšiM3²ŽÑ”³82šqS,QלôŸö¤TùŽjl0GF80ìØž-æ]2)Ò<ø ¡ÞÓ˜Oõp[2ÏD1oˆBæ¸uOÆtvùÑ8šA5Ë&I±mÊŸŸV¢’ÔõL:×o¼ŽYÏ¢`èh&_¥*ÙÔ@Énʤ¥Ѱ¯É Р5Î*K€NŒCœÄ)ÒZÉÐ;û¡Uw×?X`xû$ª¼ÜjñûÒJ³Âá¼m=˜{僚 Û¦‘äv ²ç„&jSÓhäJ½t†Æ™œ”[Ë5ðwÚ‡u0£Zþàge:ù–õ§Ñã< ?>óóšÝü²’÷£µ‚ò s ~$fRàoxAãûž6*o¡>ùª³véd—À´r?û\üd}ÿë5v™DòÜA·Y™Hà±§Bn~µÃo H< WÛ•É:¥<|PÁzà [}!œ^û='k•ùi0=oõßû`R5ü•bû¯É È%åmèí&ò»sæ‚m0=ÜD÷1CÞñ$¥Û~£>,NÉ£? |?ßÏ;2Àº” ¨@ïù­ë²ÿÉçÇjܽ“E¥Jû5Üå­O‰é@ÑfMQ³«©¾6¾|‡ hÇžnÿD›!¡yáx4æyüœ×T.Žê°HP–$æ†ìãDúŸ†§ñ5¿ë¼qÐÆGÎòv_ÎYó ÛgzÅDÑ`Ô:JF!È6ºKÒM ¡XËÑÌ“C¸†¹$ƒ=-Vh„²c‰q¹ì½·žáùx>&«tÒË”óG©|{%8ß§ÒÐXÕ†Ø:#-뚸!‹Žkó³9jûŒ4œ@U‘Ú>)™àäž›ë%>š‡vã‚Ï @õhrz…¥§HhËÄhXºîê%¾Â—¸ÚáÊáÃïè~Í™ÆbÄ•ŸGK;CÒC‡Ïrü‹»‚ßÀŒ ,©Ã¸(9xÿ ïË©70V¾æR-Ys·Ç¿ôöº*Fî¶J Hë"ê2«­ë§ôŒ\y‚cVx ´H1à!!Rƒuì²çèº>FrÞÿ¥x8ù¡éRgT ‚$àh·Cba^ Mܺšæ:B\R»ìª´Qäš%0ÚÆJ­ñÌ t..{c·`ß1»œã—Ø#aó¬Ô{/­òÕ§™ÌìÜ‹ÓÊ"W/!·ISrväßx‚ BîQ×ü™áB®Jk‰”ëd’Š%êµI¿­mЦ uª@r'U®5U'f¡B›Pb«É„{tÞŠdÌÖÖ"Ýõ¹+xüý¤óså˜bY@æûˆ@KnDtv\ÞZ·¹‡ÉÚÅ œ’@#Èm"§µ7HdW‡–&}«óKF‰Pü_<`D/}'.fó´’cQ™žæÓ7&#À³pê‘ u÷‘Xâ‰&®¸Ôã”å2–7Mj~€z=%)`ú:‘¶¹vn¤×,†@0Ƥ–gÄž!P6&"›#™Ðm5%áš7Ô°?õíň|¦‘G’‘UAüº“4–xI7E`Q`¿§¨|—ãÞ½HòðS×ÞÉ:¥„EÅ Wjž*iÈ{I aVÒlûº›‰éߡҵ$íd¢Àpão«‘açkDTMU§À€'!>àñD@|" 2q´¥a-,ÝÀàµ6RѶ¿é:èu~?¤ÁÞjså&K aè¡ô\Áõ`Cn©³Á5Æ#h ZKãZ;’£Ú^”*7 2ÝÕÞq~÷¬&'jÝuþ B›£æ§J†çeû-À£ÖÙÒ¸@’–psÙ žÌ…°òjÖ¨‘!›bÿÿDŠ])ó)y±zǶsßÙ¬OBá*É©â9»$Ûn8°Ô“ÐJß!“>{71KÅtzë8r^/•[ïñ‰à´C÷÷T>†t­åÊà™ÒZ]Å;âN|'à§÷Ø:onØ)¼Œ’8¼ˆb 8¹6štõ ZgÌÓ÷yøv…`Ü®QÅE!kYÊ0Gc ®¸ê/YHúÊ.(T y\Ò¬wGEw2z–©¿ƒPrŠ8¶Íi-aú=M+g˜˜]½Ú,EsDqŸ«Ãîöç']¯®™ICºÁ\#®/ÿ`S6Ó%Ë—„qŸ[%›‘álÒ/AœÕq)âs®u8Ã2è q¾øÈ«Àà<šÇÅKaŸý^^È@NW­F„È}ªz…iêTLC-AA¨»ßÞ¡¦B´¼Òk–ï70Õ#·Äô*yf‘ÆÚ¨XÏüæ­Oì“gÝÚߙҹ*©þû‰v&£/nÓŠ÷#®Ñ+œxÑ;Y@]¾M¸™¿uX¾ŠºþuÚxuÞÝ¡Èý° JW#úFV˜ ^ ‹’QDü6þŸ¿C:‰Æ‚'{„ßÇ û¢QÒ± ÁµýG4ÐÍž£0øÚh•˜?Lä»úùíä"5мÄý9ωò4æp& ·€¡Ï©UìàÎ>Õ‡[µª7‚LýïÉ9-G{yóÞNuù„Þ½ˆ‚L"׎5ϧ)–xÒV&ܤ€ÛA“»#›Ïg¡ ¹BƒºXOßî3åɶl ÎGPkwdEJ$_uˆÙ׆¼yÏ Ý§ÈûÁí®ê{¨,ñÞ,’ŸžË Î1±m•¶‹?(F®½èLÆáÒ 0,u˜‚°¯–ðå9¥—¼žzñÁ¥YÁŽ;ã5K¶72ËÛÞ!RãZbcÄÕ96™½Ôn’F´”.‹Ì"i' Àœ< ¾i'¼>Y“#þìÒ¡z@@Üxc°ñÚXž  Ç”â6-ƒ6ÜT3ãiC.†?Ø„‡É›8ÕÿgïÊÉm$ ©ÿÿc ~È$‰›`’ªZZ¯=Ó]%¥xà #…&á¥}­þD“¾í¢AØ™eÛÛ¡ŠmezÂK-2é§š(Ÿ{:¯ˆÈÐXÔÁÈÄ?½A‡ÚVãÈŒ—›[ÆlÝ­¿*¿«jwZc9æ¡g¦¦šTó $ÐXéGšSETIAà…M…¬ M‹MÐ"cJ¬@‰ÏÓrÒ4yµƒ‘Ѩ¨lõj¨:r.3 2†ÑŠÈ,l´wm]7ûÊÆS Þfá”…g+ëaÍe(G‡Ðé@1ßâñx@¨ÇBçmµz·Õ’€ó}{Ò”c¦%º/ðHâ Ã,Y FÀïóB¶ û¹—ÎyÀ€z´K³~ ç°o‡Ó 6ÊŠ­+·2>ös“­qÙ'öw¹UtŸ9þ,ÇF‡äø|>¹ 0ͨîù!÷n¸B£vÌR÷7%­÷üêuÏ+¼Ã@Žyˆ.µ\@ùDáãxnGj…ò.öÃ`9Ë-4ausFàÓq‡f)]OÆ—9¹”ñu¡%ºŽã•"~œrªŠ7Œ'9˜ÄÒ‘H€Ëô`9«”< ͪÛ… UØÈDÁçjþ-v¬%âè–B™ŒƒYœý6aaÃ1 kû??ŸO €ì.JLåBÐSôð±ð˜íiœ@V•wÝ|Mº•ІŒ˜s;á,quúX– xê‰O¹pbfàw*‡€à/u¼k7o«]^¢Øg¿Â²‰uÖ7ÝÿZJüìà<ÊrÇvù€?áãñ Kwöºñ×þ7² VR}á‹\ãfžg B†Ð3'L•' ÂÑÓÀ¨³`o½Â+*[øz£qÓ±÷V0 ¥B^±´´Ó) wCHÿJ]Ä n bÄPÕ$Ž ! š£ÞÈ@¬-aªØžü žˆîfÜiäAMz¨€[Æøé2Xáâmÿ Àa[qÜ·¾Rt~Í|²¿X’Ï3£·~>[ Þ5žç¹v…ÈÙµækpõÁ.“†o s„©•öïð3¨9À•AG¶Ï Ëyì[\Tâ«úûÜɽoù. wúBGñ&GE§¬Ó¸ñ„ÙÌ  9ðMÞâÖŸKVn´ô²A·ç‚ ðªÓzA­”®?7öþ ‡@gìÒÄiã¼Û¦ŒØ€+[C·Byù´CKÔŠè‹ÕÜ1å˜M>9à7½‚Ó$áovE¬p*tà¾L.ã*ìâVƒ¥ãêŽ8fïév D€0î *…2ËÍV‹Mlà*5¡B õÀZÍéà ›l,á…(Æ´€ú èÉñ€D* ü*AV” ‰©M:‹$ó–]»vzб“]Qwñǽ€%»wªg[ìBÙ圉³‰RÀ^qG>E‚©õMO!3w•¯ƒSî}îv>`8»Œ£7ØrPNe_B­ë†oäî¶>J‡ÿêã~‘èüY¤‹ŽžŠAP­µ¨º<õÂŽ1Æê½Ô‰9v¯p¦ÑÚ“—J:¯¸øO¸!Nc©¹)mp×ûˆxÈ@]µÛÊÞ#%0Î'竈áÆbT/JC¨ùÙ"©_HÏ'€Vð·Ÿ!8Jƒˆ†v d§ôÉA«D“hÏZ«oÀa=;™>š‡Žî‰(^àäÇr†¾;]Ù6RÚ*ƒ$6HÕÛ‰†ÛPgk¡*2þÊ6úöÇ;߃¸SGyëÊÆÝÓ\k)ûãÑ©³ãCÔ|È•h 8%h"z=dªCM™ØX ùî\™Ù“YrÌÿi7̓Øê¿·ó¨Ë¡¨mЦ9ìA”êj˜¦Ù‘uªö‡’ˆÚlÎÜíöÖC©ÿŸ^ ™ö‘\£Â5ãö qžúÎܤæ:Hžp#”€ßü•È k¬î·”[`.àŽ*°‘Ê0³Ì íšr¤’¶©e•‹.å誫›t&•À¨XNö†¼CâÊþ¨gËQfGa†]þvmµ^ºÕ‚«HÞ×ñå„2ÜO[‡vxD1f /f}½a£-Ë#4¾)î©+êlZõ9•ÈE÷×òB"ÈôÂ?É®'w¢Z~Ù©WˆDG;1†”:úêÉçD-ô*qB GWäÀa²æÅUâìþB¡žêèÅIÒ3Ú•1ÑBs†¾¬?ŒÔÁÀøš8µÔí8¥‡Æ uuŽd|+¨fÊó‹\ç*äd¯‰ÅJT«­“àÀÉ€'ùUÅ&jÊLí—:a”Pv+Î@ä·Ö¹ëxJqS$y±kxÉ€4‚0ñï ‰.‚ב(e%st`8ŸÉK‘‰H`Zï‚Y®ä¦ð7or…À¬q¯Á Z2—¾‹»i£>uË©¹DSök’=ØGRÙZ•Ï=΂=¨„X[Ü H»æ4š»âÀ¯Ã@D[‰F[øé7‚®ˆ\±07",[êÕ,±ºWõjzÁ»ºðDô|>7ÌÅÂýõØoš€¥Ê=ð2µ¿ž1“\”i8e}5mJ'œˆº›d^è§(Ų®ªÔE™n"§ Ôhl;ä$›áqÍæOÖªS±¥º`ÀIn(îc”«•¥vzûìAÒpÕuëÞ¯æ–÷^ rŒy% jÒT­}ÔwL”ro[A(L8Ì Êï#ál`Cï·""€'ÑcêOW {“tŽ1èU¾¯ŠSæ¬˲À5·á|Ö$ú?CGïé4f8òžY^¦-ÁÝ%«”Ô4ŸÐ.éU_ÄD èUÔqÁ(UäO?€ðKEçÏúwd Îb°>‚ðnfó{ýÔmÅRØÚÿ¹k€Òîc%oŒÒ§ó–ñ¤HßÂnÿ zqýÑe²ùëÝß…$Eë¢tät°"Ø ïÝS¢“_ÌÁÔ6ˆ¸äã»Èjvè„ný  hrø´\Œ[ü–{÷)¤çc¬ÑßíÈîþèùsæ^DÏú]žâޱö¬ïé¢ñT.X¬ZrŽæ/µùWþK†`/))÷…>­Ì“Áʘ‡Êüö£¼zµsõ½¦õ…»Bß¼úšþŸw,æy% ùï„‘ÞÎà’Ÿ²D7k“W ñcl懴ޙÆ6œ…N½Í$åù7oÉLâ“Ò§ÉÎTb溆Çß ýžùjàs C]Rš$£¸²½<×UýQÊ#¡1V1}¶áò‘sÂzÒEùžÂíï¼13úÃëTDb3`ZÆä&—CÌ—”À)@w£{JÊ]º§áï”Ùþ“|iÚ\P´0.Wt‘t•.ƒm)G»(ù–ZùF°“ßZ;¾’Óéi¶=õ•)Çɯ´V”b¢Pž·eÇŽ$O2ç:Ù?)õIÉ`‹«+<úÍBçë‡4¯Qž°õ‚U2÷#‚ÉãÛH?Øß™qêèhüê;f—Àé’Sÿ:àEêú‹ƽ¿Ô»&Û/²oޞР`²IAýv·*…®€¬/ƒ3 ’Ùn‹ŽÒ´ŠUÕ1'’²ŒG¢ô^‹Aº—Ý@aÅÊ&}é„ú? ”LçÏMðB@VSgšµ=Îc,ݾ/DÅ(ŸÌÑÝCè[Hï±Gý´á?˜wþÚ‰?¹üÈ4 Nš—zëÖ¢ ¼bHø–Ç=üÉ(~úxT.„ÆÐpÃÀÆv¹Ó©+w9oeì'• ×À…Sê ç(žŸ1 rÛ52#9U¥‚)[! ÜŸ ÌÈ›Ãì]6ðБŒ‡Qç¼×Cq!Ev‡ÅÒD2œ\š«²èï‚ìj5a¸^¸b=Fþ\€!ÖÅš|ÅÀ’`mŠ0€ò—YTÌTåÆe/Alƒåh~’K&4… KæÂ2.íB£”Ú´ºRAD×pÿ¡¯dÕt»ò€Áþ¹IÜ5Di8ð§õ2 Dtd*WéQ¯ÑtH%Â2kGïbªZÞ.…Žl2jSS¬10jçnJ ¼ŠFëh—I¬gâŽõ´ ˲îPêŽËÐ á!EÞ.¹Ñ•IôÏó‰ &j?®æ!˜S¿G¹Ä¤ÑÀl. ÅSÒ`D¿t]OÔ{f>Í [êVÖf­p$å"‘E誋Æq­jþ5ça}T2w÷+ŸDÆÛ.U“‘¦FÞ}ø.©Ÿ³5m­LÂ…>¡ž!€`à»Ië"HÂ*îÉÿ‘){õØ,²"Œ¨(šD¹\ ?F²Ë[t¾œÉ‘OÛg\Øï1 p9S/GXJ@ýRŒáÊm1e ÑCªèá4®“GŽ¢!‚De÷óD?îÁ¬”Ô\v¿’ì{´7ÿëCÜåÛêcˆ;9VÎ6ÇJšf:eõpS|ÕÄ?¨@œ|ó†µîUÜ«¤¥^Ñ|BW"7r:É5H¢$‚ç*®q?™T²Y•!ÉYÃé´ŸE ‡R,³Ó±µÖ®‘œû©ôyš'RXR·\k‚(]-â¹aÐY¦É­ôßëk«¥¿’E•¹4, Q,Ëι3ð¦#M3(§°Ù+Ä=£•üx1ešJA]Ãê€\¥Ñ×% !dŸ“·`fcG$ `4Að­ ÀË[X´$o½Œ0̵sƒ.!t¿Ê•¬# ŸˆøŸÿÎÜÑDç°ÎÞ“7dbȹtŒpj#-Ҟ Ój\tžëúéùM d… uØL|y‹¤vß#Ôï¤$N+ œ)‹— °ÅïhŒMc×B¤ŽÃ- 6úªÓßuÖŠ± 4>ÙF àIúH„V„ €k%˜ä`:9 ©ÏN³W9ö8B,]¥óÆóŸo Q¬©Î®gýÞæZðwý˜&²²€ ©ãd*0¯†zµŠi¤\=~/Ú ‡ùÀ©3®\‰Øš‚“¿Pò[«Á3~¢mû*ƼÀšô¢e sY'©0E‘üì¶Oòô6rÅ™7~@3Ð*ëª97žÐa´U·²ÈG<WÏÂV7Ç¡tú„€’ã4+Lî@á´8WyØN0’1í+Ž-YuUÿºè¼œ‘2xœ†¬‘ZŸг1ÖмÏx•Ê07°j~ào½>æøZ“Gå ¸í'¿`¯èIðßç>Þ÷eDïÓ-ËåÆ÷•ÞåîtúÍ_paNÁ¿òºC@æ'¼þÎÞñÎÇcSØÿnÖߊ÷^ÎüyR<ýßñûúãÞmOëpJx<º#¿‡ß+ðçœÑ÷õ}}_ß×oŒ¢eôyIHív©.1Y;ï?€ËSûÎ%wb<¸0”KJÞpïÇÿ©ÿŽúI^³ÊàcSõáÜ,ÈÅ6YõÓuáϬ”_od%^Z9ïˆýêcRš.€­Hªœ¸×Xî’K_½~J¢¡2~f-öaÁ™+«O"õ¾ž7|‰®ö·#ö¹X›{YºÉéªPŽú`#§í¤N}€¿%#ª‚ñ·?õé âîì§'ʘöÎN®{}bx r˜L˶Ç\Äõá ò÷Rô²ö¡gD'µ @|‰º•X–+A}µ1‚Šà°ö°U‘³B@^—ÁdÇõ1 ÔÎ&-l¼{¤æOÝe*©1$Íq£wKÜR }8%hv˜_rpŸ+§•‰Ä"EC_oP¬lçE¶=/×{v¦nÅýÛúXøz¬bý÷V7åó‡Å¸Ãåç=’ I¤¯F£'„Óî WÌ Ðs@ü¾:"•‚[æ¡á  àa+_GÉ%UÌøÉã=ë9ÍÕÔþ –ج×~Á;ÏŒ4È)“¤ää€fËÅ®Àvò\'²fÐ9S§òW‹¤Ø£~Öˆ]ÐÝŸ–œ»–ï·}ÍV©QÑ«®4Ô; hØá\Œ]=‡ ‡Òy±)ñÙÖÉÙ-èß®‹r†r©@4‡_ºÐ¾YñµõCîÒ °¼ÑòÓÒ¸]®½³4¿ÃÁ‹8gÓέ3#´4×wÞ[sOi¸9 íŸ‰U@.rŽ™´ÿð‡B%β8Â!Æafäc/Ày9O ½íT6eŠç§ µÔ*ÜÓ%vX`§²ES7T àpLe>ºÂÿnÑyšÀD¤2\mE¸ÊS€ôM™ã :ӬϚã®J—:…Ï®h¨i;±R®Äsr¹–…fb\©äºIâòãs‘Y¶¨«ýhÒ*½]Ã~騽;ÿóö¨ûÊã½€Ôn²ìâˆönÃK $s¼cG,•síÏá#êTpŠÅ9^Öðüýغf%>/‚ËÓŸáÑ7 #Ú²Œ9^â 1GS5RŸˆmd·R§ãk X[¯d’ ¬ŠÅ‘lfrfò16è1* ‹fçÜšBž>~ç ùµ¶·q%j"7L.ÅI<žß,g™®ßßgÝ›¼zïÚ"f=Å#~Ûûs²‡§1úŽÅå2pêg„È´kÔ­ß§‰rˆmüsÉ%?µXÿî2Jø’ˆt}?`‰öÜÀaü–ÓBwä1ß×Ëß.´¤Iý›¾à>›nªò½þ„ƒú«GÅMGþ5c$;?o»Îâï:Æñ /r6æ?åæ» Êa:Þ÷õ}}È!&Â2£?ú.a-rø®Ô÷õ·bBø»:±ß—Úî·ˆÎ_š^lvóIéç/ŘԽ边›!ÙmDn׸Å1{ýœ\8·Ekü¹›XðÀ°n€xz˜§d¶iÙ„ÀüM¿,´ú1%´2S¥ý† e)žKýxq·{qØšÚ¬Õ³d¸¹¨‹¶^•rªI¿Ð)ŠÈD-°3Á°@äå&øÅæb „¬†hwbÄ ÆÕ1B5¼j/‹‹u’îkb8h‡ Ç]·®ãßñ\d ”LâI=UûE;Ã《GcvJJžk,”b®ðÙ\fªsåºåœÐ¨OµY-t'ûÇ yŸU*4ÊQç¾Yg÷ð‰Ñ$Ã[3Nùi´’¤’ãÕÎ!O6t¥Vm͑ЧÊ}f¦;¼]]Þ\9ð“Y3ë@'—yºõ¢RIÑᨓ;!fF(2O±ÞÀ5»¼Ø©(‚ÕÄÄ'tÓ´3]øÿ{–3Þ©ä.‡îK “ŹˆE@"Á܃ެ¤~ßPK+Í;Úz¿‘¹Ñ1HBî`çiÒUH©¬Ë8š ËøgGr"j}QŠbÂA«–É‚±(·ì$Ì›zF ÉÍ“ =(-²ê&¨)ˆ(ú¬OâGÀOša-0Ï -ÅZñÔE³³Ü´CPÕà­ ˆSãsåZùÜ¢‚e8.cR°hQ£.ËéÎ ­ˆM¯äT¤÷þZ%B9ÍêKyég]‘–¼ ÿ¡8ÇúÜÕ[RåÖÇμ{<”¦…ÿ´LîK·›Üqx\RcâyRiur\0¡JP ˆTÑb*æ’µ™[t~(XQñqPlWSÔG¸ég…ÖY 4qØ+¢q#F/Ií>ìO+í>÷f´«w!’Œ®½ç‘™qì¢QÞBÚ¡ÏÊØ»ä¾{êůÑ<¼Ú”Á½¥¡")®åï>Nß¹”dá-&C³ìfC3‘2´±…G€¢ †o[†Žkµ¥±…4|92Y‚('cq­†¯ðßôe‹ÿ6@™Ç0 ”oŸÖÚßO¿ŠhQ ÔGæ>¥Ä9ø_eh q6ÇQ^Žm¬öè“Ö‰–"ßmºêTs`l€€™ J¤BIì*CçÚhŸð±©= Í[Lå;¦y‚-ÊÖC„ÐÐ8g|pW ÉôT†3êŒÌ×´‰,n ··¥…]ÅÏ(1ôýVÑ~Pµ+É“vBUK§R ¤¡^ÚKM©˜TO·1ùj?ÒB.Õ°!Ö0™êz«¼hF·Ç"nSÜ·ÍQ_Å.þ¼Ò’—\„âÜü{Ù°‡w(ê(Sîð±›ì$‹OPè–9µØ3x‹Ì5+ø"f¬†1ˆÄ•ç©”$-G×! Ø’”»˜ ÚäYÚØP°(ŵýDki6Æäá…rCi Õ¡=#—H|Dú†æ°™dM¡D!ÁSé&ΚÛ€ÓS›?³ÀeްVé´%š¤EÓÁCÉ·ç'›FÆ]'ÍÕuD,c ˆP¤èÒ5šÚ²ëæ—à OðÝž= d“0Vˆ¶Ë½øÛe_o@L7×ëM¨„NÕ§…'šµZ—¥Úe¦´Y¿Káñ4ÿæb€;øf±¹!A´™É³¥Qà±¹ƒµø™µ±O]•†rþè„a± Íôw+!(h<½&°×VDH¼zx¨P÷uclWþÈØäuÕ,ԅŲðØËzøè8÷©"¹ò<†ÿµ¢ó“õ•ºFˆÁQðÖ¤›Àx¹ÇÜŠÒ™„t>ÓÅ €‚Dçtf&kS~¶³€è@§ŠÏ¢]ÉÃ"•Wù¼ƒ‘ê×!zñ×vб_àý¿èzö ?òÜjzy]þPô¥æ­œ·»¹Žÿ–×)À{…¥“ß8+-à$3^Z!/¿jôóJwtôWq‘àl}¯GPdÌZ$ ’á~/@¾û}ã…—.¯75`‰€·ý¤e¼_é‹î|hr‡:b>ÆæS¿u ²ãù'ùhYU"%€þ1B@{ZwŸ@×Ýs ?"6ü5̹ ýƒ@¿û¼,ršnºÎÑߥ^ý±éÒ¡€ýಧ=;ת:òï•G}‰ˆöÛíôŸÿ¨¯ÌºwÆÊ¦Éýõ~»¾Èˆ2©¼®,$Ó~Æ÷Ñ¢³«?¸G>*™& n|ÏTò!ÃÕ°@&ÕÚ+ãÙ±9j”ǵq‰êàÜr¼Î‹t9 Àdz¼GŸp£ñÓGGÁ`ÞDŠRšç°ç y×ÒsõäsBÈðQ4;*°WÑÑ“o¾µ=+6™|9¦®žaóǨ@7ûƒó¸OÔ+w$óG>óZzdÃ'g/«b ªxM‚®iÿ½†_{߇Ÿ<"ªà8 o‚Áø2d]‰ÌGczB(ð%]N Õôö¿ð†…ŒVïLÕcÜëÃÛ7íüTêäêØÛ¸Zœ÷lڛ™`Õ™–[!¬µ‰ÃÒj e«ºLEù›"æ'Nê&¶xÑWÜ-¹˜^øË>㘶¾GÒÔL:2zï‚,˜ÜÙã4¢Ú’³Yt»rÌdÃ5 ¢NÅÜ'VÈsÇ®¤L‹ýLØÓNNÁʬ`tÕ5µ¾9k×z5Dz®–˜i%0¦ñX‹£?¹ ‘ÄöôSGã™å³˜©’=¹6B¸ÄÜáÝ3Twé0y»–ôÕÞ{Fêºd}®Ù&8^؉ÓçrZü¾ÅusIKçviy]Àå!Ù4äû«¢óY~L NXsŽ&ø¹ð4’Ñx²ÀèàF Á„ª-Ò+Ôæ§ö¶fièLùQ(ÃDé]åQ¢m#d ìIpv #€ÛÅå•üÚmWï?ÿªBýo‘ëÈuo]£ì}Ü;_gŠ'È3ÍÎ]>`ß÷„ôÍÏ™ú]µP¹[ùà¨Ò¥3LìVÕgIì µ^ad¢Cd’m÷ŠZ¶íˆË¬&ò§¦Ë/‹ýku‚Ýv=1Ôvà›#{õ$Ú¿ ¬•oÑuýæLÿéùÉQ¬»%rÉù™q†@èéÒ~ ¢• ß'¦%˜/@ý ¶ŒoAŸ/&Nø‘ºžE §ש¶°6·ÆˆßɉPÌM–9Ë@=àæQ”BÀi Ã9Ù¹âe€À•« ªÚ–kÊ¢N„Ët±…ÁN±s†سý€Ú˜ÞŠ(Mqô¿ŽÛî-Å¡—Gˆ{jÍ™.Df³D3 ’¥“³@h¾ŽÇƆVŸÏ§KÜQ‡3rÁdç|(  ²,{rNη ¡]ŽHƨ «6‚îÊŸð.€é"vë“hN3ÄäØÔÓ°LH©“oùnˆ¼ ó2¤Ô@I¤OˆLqºŠã&0º}¾) U­&½J‹E/Ý…î5àRŠÝ‰’ƒ:˜ò_™Ø` ßìû ÇQ,R˜7â¿CžlKÚÓ°Öv P $ÒJq"–‘šM¢0jÀ¦_Hx› Å^uµ¹…Yc-i4¬OóÕñW¼`Àôì"0ü“ÇdxYmÙ¶ÆãÕßK¦ÃµÕ ¤~å±ÅÔn®µÐü¯‰áŽ ÂÊž¬×Ç«æ €+²ÔtÊ@9-èVxÂs¦ØþÙ¯À“ÝÿMh¸ ”m͹gT0zw0Îl®ÆþÊaU@9ĬCW0î;õ¬ÈUøé@^(:îŽ QJ¶Ú;Ú®"¢¥ €»|\”×{Ï} DÒzc‡¤i©ã€ÇãñxG›÷«Béz°Étÿ]8}d«üï$µ=öéˆ%ø]Wß ýš—wÉÃG"ØTîD)µ‡˜Ý¨}tذƒäAæ†L‡Ò§9¬„›ü­›gººš9¤ˆLtqÛI”@ ù->¥ ¢˜hq¶Šƒyò¶uÿqèo&XrŸÛ§ Â^‡V^5¾Ä‹™ØŒúó¨1¶='±*€!ØwY%¹ºÙG~†û àsáµt“ ‚çXœCÖ=¬4]±MÃ-V°?fÇ1 æ=$AQhïö!T 0÷ÏHY 7_½é÷lY \8o‚›@²ßHutUa ö¢œõ(¼ Ÿ¥+äNÀì[¬­ F*ò;¹gäîãÀÌÈ_„cR·Þ §YäfWµBˆ®êr-GD@|Ødp €R3¤f+"™\±J"¥x¦\áÆ-¸Ë³˜½}™Ù &F¨xì/‹Îû@^’!A”M“+µÍíF×;ò"'´Ý|3¸•] ãÂ7}^Š`Ü««&È“dµYþBè¬jÀß_ÿÞ yúº…1es| @u±~%Fjîž4±,eU>øñê€g:!ì`¼(b©ä¢WìZaЦqK= ¼wœ°3ˈ¸´f—œ³,æŠðvy ‡`g¼æI\ íSgfÚWëÁB~hë›ø5=€“("¸xòiZùyýße«Hî¡EUâùüÒÓ*”!gø¾Î”éœl /é|tÐùSS‡­›yŠÊƒ{í˜yu{  Áäü§yà¼ã;ðÁ €—½~@w?àêÍ«›ˆIs4Ì;®Ú¸úŸ>€„û¨¹ô˺¾;ì»3Z ›áÚ¨]ÒKtïÙ¡×'Ì;ò‰B+ž™ÑŸ/}ýÀï|ÝÔFçØnd­ÛŸgÇ/gÄÔ}^ÔV?Ï5b‡òϨYZÍŸÕ¹ªjýâøVOO­‚2‚À?ËqNFžFCÃÞ›üLöÆdì’õ¾Aœéôw?aúüŽl“Î0>‡Vòœ9aÎïÓ…¿%ºN  íØõ>蛾#¯áó‰|Ìõ14¿¢æ% í?GÆ ÿº@ )i=?o® =ðkpW9GŠ^šcfãµÊðË÷½@糚WŃ(Šø %ã’—¸;ÞFõQádÛ?ðàÒýÛ‰×~õ\qKN÷½)C\U¢û¥îìHšq[˜}EÀW_¸íÍ_äˆÆ¶èüÉÝ¿\ÿÇɬˮ]#Xž.Æ ‘Qÿ±iÄH¸_Tb$)Xµóçb·¹ Aƒ»Èrâ7Àϱ=¯?3Z£X Í-•¸Ýs «·÷) ÅMó¸.Kwl'(жŒ&vÁIæ<=2S¶×W¦´¤ÖuihسÉà»üƒ\¡r-ÙûëH¯¢2á~„> !§9m­€ªäÖ·4è± mÜþ] ‹4B(wo8(¼âÛÞ Oÿ\‰•b‚5" D+K/‘tãô0°m2gÉBT%çÝu\ÂJOƒI†žäôÙ‹5‡»GÆ ¸’âõ9Qµ¸Ç®'¸Œs¾¡½¹)}G8VM pzßF¹X§ ëI m$ñL‚ý–™ãA²WqLkGpGí¬E-~³¿wÓy{»í‘±j~ö÷˜Ý¡ž½Rß6´˜–£·"º³i'É“Ów6ç†ì ï••žn…¦8”јsåã_$)«âÃdîôŽñøÄä¨ÕŒ¨é1=á†Ð0îì;—‹4¥ßåfïkvf—Û¿ˆäˆ,Ñ$t/,- ÇãAÏgôÌnßä‚ÜŽ q)ÊJq·Y˜hOòbJ·ÝUÒ|Epàyx³F¶áßì;M‰¸4£ŠÇ\eŒã€W KÅí]r§|ëÜìÈÐÙS?¥çFQˆm«tPÝNWCr¯ÐNj8„1ÀÆ%€À˜?›daœd‰ëOBÒ-‡<Ýë§.G6¸ØËøs⡦ íXæ qOÊ1žxƒ#‚çS FRWO*·ˆÙéÁÇ1«M§0§‘ÌÒ5{®#\ÔŒjÒëîò ÆºmxSŠ—*F<éHã ×8PV{ Šƒ+C)Ü/=CiVò )‰æT‚@õL8)‘Õ ½¼"xòxc|÷ Ña0òIP®Έð@Ýtäõ07æcÇ–iÇAùŒG•NÊa@¬Gô:yœa’[ñrí†ÄeDõ‰âŒ­°Ñv>å@=û¾|Í{¼(H]uÖSÀÔQžŒ>à÷É­o!seÓmƒFþíÍažÄŽÑ“•>ü†4ÃnîúFSt¾×P=pÿØy¦tʼŽ~ýék›ºÇ+?ö礅zWÊw7V5l!K’ÿ:ù«z+Zf®i`×ð\ɈscšzBºÁç+¸ð7Ç]¡‡j¨ÿdÃWËRÅ‘Áï¾8Xˆê-Ìu®ù½™cÕ&xó[Ÿ¼â¾ûŸlz¯Çƒè¿^!(8÷o44Ù‘?·@XhT ­Á)õ³7ydÜåÿsHQñ©¼ÂgjŸþ™õ¾\è·‡@÷úÒ¿­úi«¦v‚Û·eFß×÷õGüÈïÿ½K i«G‡ˆù?ÇbÞAu·qÞXq^ÄL⹞+Ô·ýǾµ¬Šap(~׋Ñð9-"T戹ÓHO|Ý÷—m ¦ó+ÒP e_ƾ1(^üµöoÄ«7ôìÜÁCsx‚Ú> ;`Xðã2‘éLu9%H&¦’V-Äžu÷2BèòòŒ8Ãè !E ÊÒ+ÕT’å:@¶¶8WsêZcÇq—ú!rz?s¥W©óûµ«¡¦Hö7A²ì¬9œ<Ÿ²Å}Ð%v…í¿ D½kB‘ávCлÌSëã}.(¬ŠûÅ­˜Ù!µš+óÃ\!‘ÒÇ/pˆ†¬î4³ýžòæiŽ€?€ÍÎmx䀣KàÕ猶ß`ñ’Òš ήþÚ›r©Ÿ[yDÔ'#—úè†|[«fË«&¦²©Q… ?”µGH¥–hH!A®øä<ZmFnŠQõa&nû{È›Q”ÞI\j=§Ü)øY¿¿}tü|>Ÿàõ™ð  fè»v À™Oê¿åƒ.MÄ‘ 0À䀔Ï!nØ¢²kåF$f0§OèV1Â>j|2"n„nÍÿf2-¡pß– *šK‡_yxÜ®/©—1%n†âk{ÜU_‰);á$Ī‘_“U 6T¦PhE¸\Qÿ%_žÇ‘ˆ!£DænJÑÏÁ>¯3PŒebWÈOÆ8Tí÷2¢ÈcR²N ¡¬|ã>rˆÉ|qÓ-œrg G2iÏ´I¬ùUR#÷K½É¾ÝG6Ș䯒{è‰1Ë8YÂÎÑÔBtĬ£ìâÊÓØ¡5'z$wjBÙ §ž÷¾’±6r]1uA(ÈdIë—²C\‘óö%¿H[t=&±‹»ƒ ÏQ•êç•S³Å±szª\ £"×Ee® ¨›ãÔK§wô³(Æó<2ªÃ½Š&‰2Ô•~šÃ®óð"ñè×Àý¬68¨È/ÊsÝÆÙ¿):ïñe¥Á 8:-,RéÚnZ¬964*@439€Þv¯j>“1ûè%TÄĬÕ'-LjøSò°òž3órUú)”‰,WºKõÿV§íY¸v Bëo8Í&o Zéo¿d´ÅŸQœeoç@̈n‚“¶Ñz&?óCK ˆ m.rà†¨6W˜ F…R…\ ‰8E d‚CùÙh2Ї>ÿÑ'ºÏÐv,*^æ¢^ƒ#ÕòØé $&Ái² f/ŒRX†þ]A’•šMÁ÷¢*ßÜDþLL̇d(ÃLâè”Y¢Ó×Äq„Ž;=hëx(Kfåd1yê|E'rë\ñ°œI¡"@Ëò[ zHZæEØ€3·âŠ…ä÷®œþí#f¶z6 žÈÉ®#ßÍu€ŸÛ´ò€Z„‘B>0{Ð}ìæu³Íâêòƒ/AË ÓDÙκ@ªßµÖòo¸‰ý; ¦Ân×ÈW­€(Rú2ÒV~”Žî åBɨíç _¥RÈÐw÷°ôäôÄ'ó|ç› Ê‰S8>Sz¡ÖÝo­’Z‰ž„çn9&‰8¹‰k)¯Ò]7ⓦ«Ôv%êÖ™w?’²ie/ØMñWpF¤WÌ…¥Jjbi+é¹uÈ¥nqq‹qu÷©µ[by×ÇC9ržÅ ”°¾ðÖW¸ã4»¶pÄþ¼Ž% /8žMô‚À&<•EA1Z5úŠÎ‘NžÝ5B³ho&0…ˆ"BõŽHOT§øÉ%¯ø¾¾¯›_CùÅØTK zæ_ß×÷õ²kù}}_p´!å3žü¬Km3h£ÄhêcdøOÊø}_횥+gìAôü®Þg¾žl;ññx|#Ò—%G_;ú}}_/¶P§"uø}}_ØåoaÙ‹Eç?Éõ¢*”l¹}bü-12ñ3O†G왎&-b‡éÅK €-á;ÀDýbªì#:;ííù¼zÌG^Ìkã¬(:¦èä ò‹°\è>”ÃÇÁåa89èåöE*L!Öþô.“ݒ棺TÖø+²"LšŸÔ1ç.°ÍÌ‚ü‡~ö‰kRPÉÔ`8p†Ž ­ßyÿÈa~AlÕ´4ž×#À6ñpæ+f 0±‚©Zzïu·Z5ØV¯Œå,wi6ci3ðŒ-Œ8Û¯,¬Éˊɘ︭Ÿ¯žŸ“"ôðzqá­uÚ>7B±Àéí íÔôëÚ.˜n9t/:ÝA³Á^D„$d¨ÀëØM‚Ë áÞ9Qo+š,Îä¥! …ù? g±LO ÿxFI ¥êž2 ªû>íÓ ¡ÝCÔÏOóTšwÿ»O¢<>—?ôνeÆUâ¦À/Æ¥®Ô¼ ÙU﹩'@ï8·†ZõË< ù3³ÿbäF¬(ÃjÑÕC>ÿÜ´Þ3K¦ÌÕ+ê—î—Bgw•Ù¼(ãk?ÂW&;†¶cÙ–5±¾`WiY{Å¡¥i PjN¢ÈdiÉX¢9ÑUj>ŠRW ·§q".ZYF*m„|s´E&a®Ì¹.i±nQB°üž¹%­„O‚ h#D(ñ;MÆý3ÅÎGæ\%¸Ã~Š,Ž4ö‚\CÅd‘&i£«!&À&ß¶ÊÆr,B2¹¹çìŽØ›%$v ¬V'£_«ÏsàÇÙ:T¯Zry/D‹g®[ýÐ _»V\qe·=®r亱x‹W9&Å9’i7=="¿Ut~,I”Ԭ;±y_âéx"Ë…€È*»ÈÉ×JÃÜÅvžFÃŒERH°.ˆòslÒò±°Š<•ââ}°ã]?ÎÎyi˜'KS¼Ulÿà‡{ĵ• ®ñkïd mãË0¥R ë\Éè&ˆ£MrªÁZþZáþ“³Z³¼qBF•¥žù÷º…1åbÍ-]#|ÁÓÞ –­Côj+¹ÌbÈ¬Ž„RÈ"³ u¤6Øtê¡&Q4Í~UçØƒ¯¼i¿È¾?Õ’Zýj(‡vD RSØs${šæN•pÿÛ½ûZ)ŒÆŸº"SH%ȃ£0mT¡>’D-B+#¨çœOäsOéÓEQ¸[q\*bµä˜S½1 eR\½æ­ZT§‚Ä £T+©–QòÐ05@4®`lx¯°sª7ËFfµTYE>´'Žh¬pÔlÂc3ü¤.ffšò¶J¹ &øŸ+ç¿@(Å1`·TQ<ŽŸF!÷|€wíîè{E´Âð¸2¡Têý—¿¢¯llÎðg×4ºA®õz(Ï]øÕòJCŽ­qZw§S7Z9¥°šhsGöiK\ž|œu¢dtxÞû5B /l°š¡ÔG<õ´¡ƒŠ”to$ÁOIy"…ÓT;&4[Ýýcª­¡å:î0Z¿«"ÿ¡ÚÒµ}‘Î{å®+2ÃÇ£TxGŽ# õ~‚Xƒ¨ÃuMÑÍùø<¬êðAÌ úI%ß­\Ñ«#Å£ˆœÑ<ª¾ÖWÆ’>TÂ,ÀÀ7Äá}p‘ñ…¼átý“¼ë&bb˜;$Z8Þü&n&r(ûŸ…ÞéWGÌL>­¤‰ÃbÖ†X©7ËǃxHõáQ`jòãšÌ +æÈöCë(„«™ì'§µ '…1F¥k_â3k}m€Ï¾PÅw€zœüO@ç‚ȉb%ïîM¨D¡a€ÎÍàï7SvP*>æ ”æGA…þßò\e˜ãr9qÜeÜ÷z«ÐïeÝÿÅ×j³Ïˆ"é£xÙ%׉TŸæ;]oX7ïY‰'Oò?ó¡gîÅWxê_}ýûòÜm¼MÎὪ”ðx*G_žŽò} !Ù·ß5@]óZó£}è·œÍ?º½Pß ¡´l'ŽôÈGè=Ï2>9°ÿ:ž¿Õ½Ö¶¿š‚ü}]wÔ£MûîæZ`÷rÑù¿û¹0ö€EÍ08 T6îgæp[‚‡$€Ä€©®´ Z4bìȲVp›4¯¼!ÛðzòY ÄZC·<ÜK(ÃFÏ£FqF››¬çT芜bi¡iñŠ3=¯ž,DDl|QÖ@+ò© `Ø[ÍÉ1z)^b­¯°¯#òa9C"Zqãyçë¶Ù9èß‚rsöƒ…£O1/ Äà{…°dßÞõÏ'Te†þÏë‰DrüTù-j{™¾¹+5b¿Ú\=ƒ“o@Žy/ØÑàI½}åÿ5«2û”ìMïM»Ëa0ø£¢hécnu¹›Ø)¸•+ÙêY×¼$å“jÂÚ›ø°‘cÄHÚÏìPIÁ-9#9—îÖ™£F5e#vó¨ÍbÉdŠgXÐó¹×ò˜Ê檲\)øœA‰à™Ã(sPħ„€"õ-'´Æc£:-óMœÌ`¶¥È)HÉuÞ¦z4õP åÝÖN^eãú‰[(Ì8Í×Ä(…×2áà¿&ªkŸÝ—‘– .­³[/BÓ yÇRwÿOó5 (+„€…Öÿjv¦ÓÃÍç?›°”LJ6HJÆÂsë7fµ£t¡¾3/:4,Äÿ*qð‡±²§ÅàzâEd<ý[´x ­d‡O@ŸrS¸àUá‡_´—™Á’*ËòÀÇO*½WæÐBR`µw&|t)ø’RnªðÄ¿-: Uér¯ç«­Â.Œˆ›™ .êžHõ 5¸û±´ÔØF›¢oç¡o5[êmWÅr©Á×ãÃå?ÿp9B‹“VœVî8OÄà³ZðE8Æ>*ïYNpF¢RzF8öŽ}Däߥt2 } h Ѭ;3‰ë>ˆz79+0)-QD€å%iÒ¹5ÿ‘ž‰¶„ÄvwÝ$1 È5¼|³*?™ú É2¿y7V]µ_;ŒFëê«SÇÃqÞšA•>ŽÙöm㸛u†M‘ X•Xv™jƒC£Q¼¯è¼Þ¥<á÷%wöÐŒbpO0ʰßˬjhæGÀD{E!`tX=‹Tãë?é€I®¡TûDdƒÚ‚ô(òR¡ä€C”°ÞÝ2ôÚúÚPûU+‘\ F©øõé@V‘Œf€_!C³r|Êë%XÛ°cÜîÓñc¸CƵw‚ËU×>ˆØf4¬ÀÌå1¿18d¢uyª³<ãƒv­6쇟È[iÔòè¨ñû‰Úòu&Ù¸æ ¡¨e£’Þ®žï6mR·ÂÚOHa42fÔ‘áš%¡…å’¦yDê:@ñÇ ÔÿȽuD’ÌcKH‘iÂðž6yM6³Ü VÞ$Ø ²cÛj[…Æõ::}<³·'#•¨Ý™RK5KÕ –š”50çÌp»"LÔáK2f“˯ÀAÜVCc]Ý÷×ÐuD>¬Þq3õxˆØ²xõüS!ç(h=pÜ“Æ!žß’Ràÿ1_•YItÞd¾ý¿½…ÇÃWÀ-!„wK½i¿W k-ý¹³Æ8‡óÝþº˜€n(¬šð&e™Ó¯â¢Mpöãg„.?ß¶_Xü Þ¸YØt X4J¿èmíÞ8ƒâå1Dt ÈÏ̯+ü×öT0%o·qÆïèô8sÌ*M ÇfH2Uz@¹ÈÖMŸ~š­u² €âñ¾³Iê’a0õ3k(A%• ~­Æ,v‰$"¾·‘ ‰£Óg‹!Á^`\¼ÂËîÕ=q)Q]!U:Ò÷\ÊKtO¢ÚGãà]¶b}¾}©wðCZÔ¶uÞ•»1ÿÛ¸ü§òo]ê ¦®ÿÙ¹;¯ê®ÞÜãÔøÔËã@kÀɤSžå!]'{|G¼f,óŸEd‚ÈK~,àsR甘âõÙ»èƒ| zÒwx%¾¢ó¿íX/©„E…¥U[ñJÛrË Ýn°ßTª]\°°½þvÅ3Û¥Ÿ$³ªšýuÚ¥i–7a•/ž<¡n@&g˜æ™$:ÀýXtë)‘NöܶÊÕìÑ„óSŠÞˆ~øÝâÉZÍϬ`õ¹n5gq;FëÚ N/öÿ)£zRÖøÏÖ8o'&{Rh†*®7g3Äž Ôp5@@Œ&3 ò,‚‹…ýÜ4Enâd8èzý\và˜álÄÖ(‚²Ãú®ðlï†ßgœ¡k½-vïû+ɯ:;r‹è\`#­#1½u&¹Ãäæ\ÝÛÍþõ²Ÿ+â'×m¤ÂOöøÿ€ÒôÓ®9¼fÒ›ÕÖÜBÃÙclïº‡ÃÆ#a»Óœs¾ì•‡>:e7y8’nÜ?Ÿ·È¢ Œ¾Y÷±-ö—Þ•OCjæÙŒ¸9ÚÞÀá:\=GYl“|âXnÍiÚÄÑLMŽ\ ¯WŽ/ø|>Ý‹µéÕ ”šq?)¸:3DyÌF\´óXšÀg‡Ž¹Zš ìùŠåS±˜;U2ÂiËŒòýýmÄÝ¥®äqµëß°v%‰ö¨hq4_»©¥p]7Î`|‡)ï M~­Øø˜CDÀ^‡@ñí2qJÛ‹³ÀÔgö¥ý»ÕK^‘!èæªD2Ò]­m8m¬ ²¬€1(à†‹K‚¢¹¶F3Ú< f6(„t•ØÝ“ )gÊ8a–·÷»×źœŽL)Ðp–b8:Ì T  GäxY÷–‚ñkˆ¬¼wJBìQb†ûßÓ¢öeYÛ„UzIr“ÚG‚4í°ìõ)ì'BÅâ)6±ƒþ1ÆéòÛ!Lûyd­Ndz%ÜSä*ŒÖ©ãz®zÈÂŽCKTa!Ð Um¦î%ºÍÔHGª/ æ,ÙRKÍC/b\ßH‹=8ŠPÇ»@åçxªƒãsQ#”{N›¼+qñ@6·C%G09âÔ}@HKÊP%1ûªAt~v¦Vq E-;Ó ]WÞ¸™Ü¯âj\Åxåë uã8zlž"@i_òÌÇÜ/«§ÝFÅieE³à#éº/[g$X©äZ@‡[ Uød‹ Ñ7¥K…a¼#‰k¶Û¤…/8Æ«¦f㯣Éቓ·JöÇtÿ¸üg¬3ª0ÎJmŒȸ1ˆED€E»A”ŒïKég2F`ÆnS†q¨KzRCÌu7.þð"Cúü¼ûìÊ=V45­ø†×1L.Àߦ—0dP£—ÊÆðÜ\KÑ’LÓ÷,ÜÍ Å…>~ÔCÝ:ÓÃ1š£›ÿî \+ â”@ÑC×Jü¦ä*së+]¯œ`‘Xf¬…14Ôà†¸ë)®že˜ÁTp«]"Eˆ:È(" Ñ¿žd´§Ðÿ3 €…¤EC¨ô™Š(U@Ô²yÆH0¥ëPkX¬‡7÷ù¾w³>ÿ?=v»#AÒ ^é¿åR¸öî/‰Î/;/&T¢¸éSÁ©¥ûúyõ†!ç<Š™Xß<ï“ð7+Xù¢çî¤u´ÓÁ÷=Ÿ *™ç#¼c_ÖA0‹ï9Eôƒá†xÄ1ÁgR*2ÁýÃ$ŽÆ¯çtâ¢ßF `½Àxry‹ùç]¡1zŸ˜…lÇàè¨õú‡Æ¦yç{,XKÁëòð¨^çˆ- >6['(á=€™ŽSnèæãÝ.² xR “åœ[Óÿ˜î¨ok.1•ç ßçc€kbƒ®Í:°Œ•†MþUEˆåt@ïD–UÀÒàÓè¾üÎhêJ\f™½nòô©“˜]À{†ùcŠý¹sêÇÑ%¦ð«&°B;7eÔÇ€×n oÇŽ³¹IE¿Kioé<  C©x›ºùà:|°V§hµo¥3 üÖ~äæWa‡k$Ú[¦v/ÂX ö`¯v,U‰Pv4_¿>×Yæ»çE]Õ®á]òTóΤϸ·÷ áœ[ÇF©ãêÊ5æqàWtþ³œÇÆœÅÓVA!Ф¬ª×Mák|bÌ]g7¡Jh­W7þôÖW«ÌX2£}‹6”{ìø:&4kõJâp¥‹4|ƒ1÷”=úôÐa2äÐâSŸn³iˆ£pû-\’‘3v|4øëéãƒJ¬KE3(')oåRB§;*FÑwÉ›ÓÈèÐ=¿8 øv‡ì„ç·ç³˜ QÁ9ÛÒ ,ƒm¾³ÞTCú»±uÜá°}B›MOuÊí©$’;–˜ÂD>2æ`´ «:ô^BèvRížT‚p5>¤]÷"~Ó5â ëÒ} µ7Fki{=å2ŠÆà.¢ZÎrn©qdEcÂóIDöZMó”=á ë½Õ›¤8{Ê×NÐÿ„ú«bÊ·–Bp9þA²™Tøövù· ÜIk€¬Íû¨Öàt° ZÑÜÐ…¥sæœ/¤½Ÿ—L£ÛhCT¹èøFÓej:!@û""2ñT±šê.Ñ1×cÕ2öÞd\§bÓ»^“xÓs’D¥™yì\„ذ۞Äãý«©1¾B‹{õ\OêëMÅÁq7GW`âÈÖõWfÊg³¿¤*cm‹/fe˜ÊߥßQ<ˆŒU·åvGQd:¹5 dÐyVKM^ͯπ¢.5†­?ŸL…Lt…‹z8c“퉇U[‹òÞ%A,’d…C¬ ,ΟtãªK‰O?‰lJóí²¢ˆCᬠDbc0…)éùó¤ey=ÐjNz*Âü!"hõV0½xIIúëÍA51«zU‰39ÃØ8 1»D-Pßìe°*î{Ô•œŽ[Ú®ú•Wƒý߃ð.ÁY•JÐe2ç;æ¦8­+¹t†©'¸( “´Võ§¢ŠQòIMÕ6ú¯w™ %‘±ü‘I/$"±3À.‡5U*Qüõ¼mÂí‰2s‚zM1.MÏä #lÑÕÔ’?Ï¡ot÷Ñ@3!%’§_g¾ êðÉÝaR8ãª*€Qžµàhn#i­u… ýƒ¢ó64]rSCW,A‰NÇfϹF6˜Æô‹O£8’ê®ùzNýì±V-}>ˆèg Ë«çùÚZXŠ$CD¦©KŮߛö³¢?3_– Õ9‰Ø.a$e€|m½=³2)ŸìmŸÄÍtÐLT$À| “z$ƒ!*L¶âtsÝné©}Ï.ÂqÙü´ÂÕ›cð¥kAÞz_̘YÒ$ër%àø[…Ç÷ÄÄ£§Æò ð° ü{c¶§}?µ!u㽘CBT8œþ-ŽlnRÇb`·pcLµÝÀÚ]Ë~kâ>î`ð¾k í^η¢'ƒEV|è0ä;pK(:W˜®Ky+冯'@³Ô°‘Ÿb\âS.ŸŽ¶^0¸Øk¬2VOdÏ+å[õ«xÙóh Eäë¬ÑEk–?e%\0£Ïñ {$(ÍuXZÉÙ÷J”2ùÎz0Uƒð 9q‘ýkð*]"HŠ£qžplØuL%9PŒwÈ\nÌ/Þ’ýÑ1DñœY^g@ÒUjý£@1ªSÞô}ëí;ç‡] ˜¿,M=Y}«ÃQÙköò”—ë>7„¼éŠ9ù†9mÁ¶ ;üÇEç¯2òŸü:‘†¿úõ31%]p!N=êæë¥ SüE'ã|š½z\wEV¦¼uµ$ w?rÅöEÃyxú‡åˆÜÑ1‹ð±Ô;³‹$àûza~EÎÐESˆV¦÷NpŠ_uÓ±'Á0«Æ¬õmÌ=¯]tTð̆Y“ú.qEËÝú£x × äÐ ^uY^ƒ¹í¥T-(è¸)ÁKÒˆ^«pâ¨ÕÁü¢ÿY9ýòuvXN¦e[#Wö³ã¯‘ ù°£û]´›ÿ¹xÇ[‚žT}O‘ã XDò‡½o úû ¿Y2ú×á¡/3^7¬—žœ]tþ³¼bHi}ñ'œ3^+ >…fóÞ¯}ý耞—;¨i¦¿)c˜Å’þ”½«Þà&l4~K„qä\xJM nE‚°Ë`ÊŒNÿטÍ@Þ´ ãkíñ9ØõiÈíÝF FØ"w=„L}¥ÌÑ®Ÿ—^$î븫Yî> €CýeWæÁÖŽ085/cÜ„Ø7™³NüÆ¡Çéloe®´V¢°ºð}ý)#I7Â;¦ÓªgO"x>é_»¹^ÿ´¿r™po±`BŒkùKÚ®ó©_YBäO عh߃ý}]Ó|Ôç©ë7(ú¾ö‹ó— õß×÷õ/]ɺ¿Htþc=2sÍ“Ô2*-f¢jéyꕘDDH¶t‹üé@PK/Ò^ArR B®pdú³æãx½‘IK ÎL/O^qê LwŽ·œô>‰hï i‹®õãŸöeÃ…NxvðOIX·ŽEÃ2H¯¡¤ì¬ÍS äßk£U}G‹ùDýþXgGò4ׄCZ<«õÐtÍŒf)÷­ð¤fT’Ç[¤(‘¦IÛ~ĉƒ˜¾…™uXà„Á mDûs§e§Ëñ¨vhdÎŽºÜnNã-ŸÈ·É.éC~å¼sÊ>LÞèdž9óc²èRüýPòØ€“º±· íG§$š5î €í½,†K&tk¡%$—Ô¡Wï>ÔÙ)¬Â1DÙO‘¹#`‡“ÅQî0i *$†¸!w§ªCµ,ùù›{±S"Ô± #&B Þ"Û…¡â‘ëyaÚÊ:O$HÌ?h šùfZãX ô&êcÕ‰F[LcdnžÌ¿¿ͽLd½IÊß±%g4¯npŒ é®[D>S¿Äö!Ê{ß,âŽZ/w.t<*–ªa›‰¨£Ç*Bà¼N]Šj»;lÂV/ÐEìJA§6¬Q[Æt'2†ö }u,o´Ó»àžÈ Øsh'ñV€¢ià:…x¢Ö.˜³8—êÏUí¬HEÕ-ÆRgñùŽ.¥?<o‰SžUîò»Üé{ZÅ/àÉ‘Œ9ù‹‹¢ÇS/xž>Û –ÓÓ¦F¹ñ¿ùo‹Îçë1dxÕ€@t¬™îk$LrŒ ÑÏ=±6Ÿ"úŸií,²è¸þç(ý:’K঻h~‘:”¨1ø¦£kq0›¾ áƒZç°LbSGŒ­ÏxæTô×ñ!¯®ø4C!?bú¦ßWÔx"(Å0¸Ž» kö"º¨ ¸„}›Ù§ìÔáÀFº qq^r“4Ò•ŒV:p¯.M£È™; wï~†rMPpµ€"í•K:1ÞL‰ £5†wÉ*óÖ|»šPÝïŽ+í2Wö´ÝAíÿ+n0ñù| Ë?Ð~" i¢R̲È7üt^ÞN.ź®ër — ‰6vœíøR†Ö½ÏE4ÉLeA:ç.Ó‘UÝ̪“w £UØ*Ä•w´ü–¿DðSI…Æ@6êò5O¨—A~õœV/?ëÃsùW'VZ Ô×$ê_À0ÄÄ?‚,5ýÑ=cͧW´'á«¡Å {•ŒFè'íÑí"ÿ(fÙÜúrmÿÉfÁÕÜBòxûK‡ÄÖè‚N?5í,²/&SÀˆpØ)ŽÌ1e (š9NìÛ‘2êy¦ºØéú=víÓjo.ãI¼(º®Ü¦Hí=É·•‰£üñ¨*ÂP’#›Ô B Ä僶tñ"/*¤ºú˜"b¿wxn»'–(ð!~­.ïá[YžÂ»GøCx|†ã/!DnÔqFGþðoÕ«ªÉ„Ò›ÀY0  34ˆº¨zS܃´–ƒJèä…†ÏÇŠÄ"?<÷X®=áƒRØ4ˆ<©Îú<ß?/:_|oXDûv"È£¾ßN˜8]úïkÑLpüد=·½{>þûƒšÑ?ó:¡n±%Oz"àWv森í_Ü‹SÞñù|ªœk-i•%½*žø¾>ÚNÒ >;qðA;I€Þݱrl·M;vðO5°ñûú¯ÇUàÿûßâiù®â÷õ¯ÇxßEø¾¾¯K’ Þ¿©zþU‹q9Îø}ýéKO"|<è8¢ðÅ…>"ÉÂhƒ‹¿U©¢áLñèª3B€~P²TÆï¥ù¿i”2@ÂRÑÿ€ÃŸÑÓ7âËìŒÖ™b©a®_¬æÖíêí¸¿Î©œÏç“Å&ž¼ãR`çw°êhs$­[ÓY%‰¢HÞ æ¤l4Dì!>j¥­Ùž@Œ€¬ðšÊýDÿ"ðÁ§ÅË~ Å>ˆ;z ØíÆÚFdÐûîꯩRó¾¯>žMÆ\йY“«á~-È¿bý@ˆæ-Ì£ "÷_÷ý|6sóxëå` Ëf3•ž®;ä^]F$…R×ÖE‹f/„©Ó A*ûr¸ÞŠçnGúÏqÁå(ú÷fTû¼í‚ûQ1B¯Û`„·£Õç¶ÇŒ gé“ ²úJ`%ö`€† $Ç¢¡Ú´4ðæIQW¥£ }¢&ÐHMSt¬Ûã±2T¥I+ƪ„ôxøD嘆hÑ ¸©¦y Åd¡†FYíu¢9$ɶOPþúw\S³™lî Ï?™qÏ“ŒjPiªöh¤HÙD§…ú†T(roºë¢…>(>ÈJ»u ]°ŠºŸÜ¬µjËÛu6ë \ŸÃJ!ƒ­èJ$V4C‘ß$Hê¾erùV6C€^ËzŽD9b8­@¨Iuú·h,WT“m̲㵞‡òcË„Ê<—Èã^K?Si¢ ×™Ëé…^©ßqÇü®zö2¦±”}pdÃ¥Š'j¸™"×âÛõ§êÚƒþ=C91¥œhXTà•0a¦ñèê0óÉçBå+‹¿ê{ÊÞ¹†áI‹Ñ=×y`½HH¢îËs;x¦íªÅùŽ•HQr9?Gkž®®Ç³Stb5òÑk*ò™<9‹ÃÄùüwDç%PÀñÔöPcô³¯©%˜çÔÚùÃ?AªoÐOåîNÇÞ÷*FÏ×Í¢•'r ä9Àœ8Q—dðIG‰«CÖ~öîç¿zÇÉ•!ö³ñ+ø­òròÍͱÚX*þ±6/Xò#1ƒ8²©ð"=ÆÒŒÙº ÿ¦-®¬üëwuJF1㽺—çð—‹FŠxKï"û#Þ£:àn;;†Ä\lë=ŽHà’æN—}•÷]ü_@µîèÿ㽋ȻÐ?>ÂÀ'L\·øtö ¾1„øòô?ývH ‡ï0×$Aà•ÞóøÄÔ·¤‡,Ù5 €wÝëà €;Ò–Àsÿ‚WµîÞ”þ|•„ÿŒ;ûçEçéó¿TyHÝ©û^›Ùõ #ð3²õ¸Ÿûx” 7§!F­‰Aùk­k»Ðþïº=·EZ¸ 3Ñ[, ƒÏ"\&¦žõB.ÍäÛ8¿rD;Ûšu»Š&'PçSý(wY½`w܇z÷ºÒŒYï?¹& ±þÌþbî„&~ÿÎÔÌTÙ¡k NÀ±­áíŸSŸ~+Ì÷á=“ÀûùÍ;Á!â^$ît« #W¹LeX”\Á®B|´ŸÞTVð¦ñò|>§Í2Éõtç¤)+õ¤,ÎúÞ~˜BÛ~ p;¤–ȤnÅÙŒ­¥’*‰ {¸ú•§Ri·‘¦VŽw¼r1‹5#Öqy5¶7€/£¬Œ) U7ÂVØÿäÈ5¡£×óÐlJ<ÓàˆìÄx?yk}Ïð‰ zæ}ÍàÜZ¸ôͧç|ªd 8Dõû ù ýl±U“…ÔSò¥ÚêµH”{»¼àÛ‹yí¹†÷ y,CK—’–§j‡{Jo §ATØà»md#É šþ>ÂyE4íÓz^£o„»›o˜^UÔîÚ¾ªp: I ……HÞK‡[M§‚|õ’”êŽ[ý‚þ˜ÃòÈÛ/>ŸÏ&òð2ѾÏ[ å…V¿—“Î_hF  IŸþ» áD¢ùºyb¦âË—âÝöÉÛþS¢óDoŒˆ&äK–À£§^šh¦%'ÆÄqš¦Š<”K¼(Åž(‚ר¾5.ÿ¸ØMXèé¦üIRxD*ý"£^C6:èÚ1.NÀžÊUåStuûW«–=Rÿ·0èãñØû¸¬Ä7©ˆh}!ˆ:@…*Y8¹±â pû=yÙT2)ܯ € ûÕ•­Î‹îÙó]!øÔ#<—P<ÆKPö“ãŒÉ¤ˆÃy¨Á¾ÙÔÖ5,È~}Ã_̱AT6ÒXÈ"\š‡QÉãt²–:£}Ë;ú¯ÅÈœ´ ½„„ PG pVä– ͌ӥHFœuÖ6f¿¨¾åŒøÉF!ÈÂx*ÎPmKñ[ijVÅahŠ»)À®kˆ€€vÆch0Â¥¢lEG/’Õ㟛’U¡ï­”Ïné~»ú ~,žOàuÙxA½/‹•Ѭ;ï‘ÄÉ Têv.Ø-T9 ãÐ<©<·ËïOìã|L‘Ÿižy¦fÄ<øÙ}‚5M ˆ˜@*/ÔŸ¹ò•õµbÐûME=LuÚ]³ €uÑ)ª¡¯¤ƒ¸DŶIj’JCä(™uùs+že¾|š¹Ð*Ú é5ý˜Ûû«…™" dÀÑ–BbWÀ¨Š0aâ:*ÖOó¨ÀóIˆO¥Ÿ m‚##ÁxûeäšRâ‹ ÿ–(GÓ^h¾¸!¥pÀ¨žù®¸=*+ ]¸7ÓÈö?= "˜ñþÜÙ´¹`Ӭܮp‚ðË^TâŽþ0HOÈ‹Ü2ó°Ú•$wÅ- “ˆ›`œ›¬cx¥¡O·=1ÈŠè‚^(ÿ Œ¹ÄÁ¯ƒþ¿°€òüyeÇ4@%ý“ܸ‰§5Õšpõ¬À…•¯Qj·›k–]<,#*¬äInJY9`¤v¡+;ë%’„ÝZý ·æ%¬D ¼žìiù[û®PmâI”p54rEœ–ðÓ:`•Ÿ¢¨âb3MŽ0æòŒ«ZI *à9±Ð%“GS¸‰åÕÞõŒjÜ>§΂?.:ŸÚê<&ÄúE›®\; €Ÿ`c…uÁƒIM>Šc¯è?©Ìú¯`QÂiÐ_2ëÊ>&£€—€TĪ>áeÑéËþ‚Ö••oåÉJÊøÀC$€Ê‹¿¸¯¡Va0ÄØÿ’…¦Ü¤ÏŠkÞ‘\¢b\uMh¥ƒ ÌÂö“Êj‘­íúñxð,¨Z7Z¿›2ܘCÌ£­1îˆJ{C1@¬U¿¸éumЙ+¼˜pàì·Oí0;E=»×0.¸ì2h¼’Àü°YÑ>(šœÖ!¿-ÑqÉ·óÉ—òHßÖMŒ²Y[ àe¤i2C&rL&}Ù?ýñ·x‡ã×fv¹&Šñoø+qžRÂ1µÈôUÇû`Æw& ù5 ŠÎxc-Ë“ž9ä#œïtÂVåwÛ°0Ç"ò Æñpû?,2~Ñë£$[_v;êyôY5”[tþ“Ï}ÒÓtx?|e~¢t$úºeåÇ44¿·|Ý0Õ \¹EÈ ¶‹ôÖ#W­-³p§^ø,½ïÂX`7Ô“½iÅ>´Þc®Äâ¼ÅÄ›”‹/Ͱ"x¬ÎÀJ±M- ÞzêÉù.r%À›ˆú|šóŠØ‹;ÞÜMoŠ®¨÷;¶X¸÷hcâòkuÒP¨v¶36“•~XÇ/ЉU,䨫Œ%áàâX³¥M?ÝJP8Rî¤ý3¯½ˆÂv¥‡0ù"˜oGÖÉÅ/[MeÀüöðn®×Oªçjã×3êJvÁ§WÞ¤Œ¼«X"ã«'>¸ V?Oœ·“å…ñÜõÊ2Rå<É®‚FÿãD-f)Xߥ+‘ú íÆjÏ£m7>l1ò˜Dî¡3Žã•¹áR÷†º«ô~±|)$kí–ﵤx£H]•Õààxã""<ÀÇùÞŽÓ&b9‡T_ÿü €¼ÿ骦çõʦ‡ÊÖœÀ]Õ\t~-‘Ìŵç͆< Æ¡(~ÐP1HqðÚEئ{Hšô „C€­ï2Ä¿I¡:â‘@ ëý 3À Ú~÷ÔFn/ÙÅÄCØ¿bݾ&±g ²P¨7êE©‚Rk¸«ä:0©Piü ™Åßч#”ã«¥fÌF`˜æ¹óˆ¥:MßÁä%É>¡©ì ! 5é%-Ñ>©iS(çMËAí#"h¡'.I‘ªtb4Jž„ø/šÖTš¥µJHEOÃêm„zÙ•‰Ùd¾ò¿ á?çšÀ dhÊ3>ŠäHn ñ&q&Å!Æ QQÏ?äÏRE°×¹žO UWxné!#¦ý[—ÇWùÖÜѶmoî¶)õÿìcøa;Þûu×lÒ€³3†‹¢C¥ÿ“Ó‡Õè—𥽇=×Ð1Ó»Ð%k¨=-Ê©?LWEŠÒè¯iŠbdï±nÞ gyþŒ´©$í®`ìªS'•ÐóÃÔÏSiÜÁ ³´.A˜Ü#º1åBhR‘²ÜÜ7"N=@br)×™Xéª<Ìt¶¹bnÑQÛW`²{-§(€qã.nŠì™ƒy¨åº@ñð¯ÂÚoñãÏ' âsï½Tzu¢Dªï8¿{Ê-ÏD‚OÅÑI†‰Ážª­$ò×GÅx*:á€U\„™FúÕNF·#B0̈‰íÑB³&dÁ©å/ß ¾H*ÀáÏÐYq<ô,`áö™¦>ñÞŽ{SéôCîVÚcKL=¨·€Wò‘‡Þ!0¶¥Å¿äØÆ<¼qÑ+|¯rÓB¦92ŽÝ·p7´½x«Å4O‹Žõ´Š:êç· â×J…»¹ÞºÒ…HDÛ»ùÝ»ž*ªÂ»Ê‡6?eÓˆcýEÝŒXÝÎñ ý‹<Ÿ{ @½¹ês–bÎŽþ¸Ä¢cþ½Ü|ËÝDrÄE2WR†oJ›šà§x^^6ÙÄ"¨É%'*pÉœddx•!Çü)ž¥x+A“§Ívn©Ì*#Y%4{Ò&÷çDçËc–EÁHh3 ×tGçÖ…^¦?z úZXxø†þìyšdªNjTpa2/‹ŠJ8cäu¡ä´Umîà KnçÚÄX(¦d¥íc¤ûˆ>Ó¢¸…ú¸Ãï¤ìr‘¾ÀõÍÞðB‹·WZïò³‰rIðL¶²´)ð‹‹ÿ¶`àIL°ƒÅ«‘!·%þ+d°w¼òs«î­àŠ:,4Ïî5®0 ‹„€T"] R4¹WZ9£cfàR9ꀃ€ '£"Yó I¦—Ùá&[\z6ù…#ýÀ‚Âï“… íæ±Ã˜¸I¾ÏÜæÅËKCÊÉÉNnPŒITLìMÁ@7Ÿf*œ'—ñÕ €éã¡ù¿ÈEÉ nè?z–V×tmöÂãÁ×wá«z”@;¦Ïéb3À?óú@MVÒ@õÔ§Ûž“c¸Âa€dLicði¯ÆþíÌ¿&=\ý[ïb½œ>9;ǘ±˜üXPXcDpùEÆÇ #s õ«a^À›Æá‰ºú[záß~ÿ]ü+¢óuïx9à˱¯±4W-P¡P —È»‰Jû9[О^ƒ­ºMA|Ên{ª¨p•-‹j"Ë2ªåÀ}ÌS$Ó¼õX¬æË¼¸H‡CDeºæÓ´ è/7CËM$Òxƒòi¡’lO‘„ ’¦ç›#fÓö®Œí · €›©UF/w½:R!lúÜSöXÈ\«Rx,Cƒ —7–ÒµNW“¨cKç6bÛé¹SƋʞ$°«NÎ>Ù@NNgo÷^jö=jMO?"c›Wa=Q£ÍL9ƒ=¸wâê4^ü>D_]cÀÈÞ±žÐ<õ›K‚ÅLÓÈ5òVs¦—3R#@“¹kŽíQS3„ò@7!›Óˆ!ÞëT˜óÌþù‰øèk%¦­ÓÖï3ÁÃ}§Ñ¢¿?ZËç±ñúC­S%¸6Rð«(  ‡Ä[ÉÙÔm07°ÿYO1ÚIvÏb»LvÖûŠÇ ñ èG’®Ø¢R0ðTU4b±? ·«'mÎÔ~®wÍ¿¦Ôð qÝÞÆ`iéþG}½ oW³×÷‰iŒx6 ìm>zm2‘8vÎͽ.çF„pú{àÈú‘ã[ª£µÑî¢^GUFÑ Ö»¼ÛîlvŒ5µìá(µ¿áfØIÑ,±ROobÄ­¿Õ´6¼†uÊv*ãE¤/U’σDµ)ýõï2gÛ‰ÆõoEƒ6Oßý3SÖÁݦM*Sò‘‹›Õs"ql¼zA&ÆÛâ"ôxu½_b¢sŸy„¼^ ! "Û³ç¡Yíú,`ËSÚª}#·©ÜítŒú••* ×$lÒ_Cܦ¿[W‰à¢| î!0¶×3éh>YÞ%‰¾"‰¶z ¦\ËI'ÝÐȤÃÎäêj†_e-^f–& —¿!:¯óÁBüÏÃ$®¨íÞ¯èry®9Öš«_„Ë–ÈF ò/ÉF|õØ}·¿õ³-ö“òß·¬rGØ2– ™+$Â/î@b·÷ß>Úh"+(ùÅ#æ5 'r %€¸[•áºXÓŠÐÏ@¯{B$Ù¬ðñÈJ[ùG»Qìôⳃ–àIðhœ$Ú&‹Ð»µ4’fm)”«ˆ‰Bž0Ì“nd}Æ›J­¬=ÎÕWĵíÐ`Mã‹ã}bù'ØóË\W0Šœ;w·Q(Ð{iÀmÌá¾DY㥯ӕ\#À^"©ú$o‰?3 dLµÒ·Dî¡ Äâ”ÞXUñ¹ÏËP÷£²¼‘–ht>qŠ–J1 @ùÍO(eëi ›1#ZPôPÀ†žŽ‡V¸žçŠæÍ‚®†¶€¨z&ë€j£\}0z¼"âXÎ÷nì6 Ððz%ò@¹ˆ³ù]²+øK)Láù|šÚ´/»ÚßàžV/‚¥Fy¼}Ë/{ïô„ãÂêìþôÇ—úϧÀëiˆ²zh/&â…»µú=^Ę̰5ÇË×(óè>“U­Ç“Á x„@ìºNÄ's¿$qê¼á ‚Ôÿ®Ë €z•/â‹Mí¢ãßËîHN÷WÀ‹z‡„àÅukåOwdŒe¼kÐtDz^’ªÛûíê|1?ü.G-ÂçÍåAÍ¿ :í·Ws³~ãù|ïë‡ žÐmKµ:²X³Ê ÊËνÉ{¨vÔ›ÄØ·ÈpßôÑ 4„è¥ 4¥Ûõ«_cd‚šIB­2‚ó _°îËê·Ä}_sø ¯q§^ë zçàäD|ÿõ€$ÄsPhiUÑgÀ¶5ûM«MIíçåao¸2«6Æ?N$Æü8}s}›ñΘç7xyˆ~àB)Àg]/@ŸþšOGþY»õ§ÍÃ$ž1Ýúà2ƾ¯ïëûZJŸ_fZÿ$7õò_øòÏŸíïës„I¶E…{ÀhÜ zà½5°ÖƒÚ) æ§ëÙŘ&–þ‚$—"ûõ.½í•ˆ¹ÉX\RÓm?û“ˆ“uŒPv&U¢Â@øDÚx8˜ž §ûWE…¯ˆô$Š -ýíým@@á2êÃ¥J¢)çùcÒ’°û ©õ»‹£Û8‡DHÃa¸ –Áø†9m›‡ JQŽögæý?Èn7‚Ö9#¬i˜Ü–­ÍNÐ=âÚZ²L ¥ïU;l»®P_©J0Þ§4 íV&c$“þø#1¢±-Õî~³DÙ/²)IJƒ¨ºñ)`k«{QÑ·BŸ^ðèö+$GÄ? XÝùi‡àVÞM”6 …O{'êjO]¥ŒäpýS%,4_£ãÚ©ßOýål¸™ËÄj9~váþV&‚ԋņÄB’°ÿŒ¥ö)#“¬…ùòpm¡$øÛPgòu5¾´ø¹.ßÑÿÏ=Õ†&/ÞŽ­éuàœF¦‚[x°Ke-×÷g·Òê!JYtQ°BÇsØvª¶ÛˆÀu ?-6¾å³"¬,¥úq‰óÈßí!»µ§ƒû¸®?À’º«ÎÃÄÚBEe±:ÁÑü“U£ÔYñYÅÒ ÿùN:QÝ0– JSEs¶ L»0`ý°5%ñ³z‘üãñˆÂ˜«ÖI–)×^%¾B\„ µ,+ÆÂ|»ÑÕ óvÐ6f/ù‘¸ÅRŒê$KRcÑ@*z©V-ùæuB9N¯Õ5ÄL®D=C>š˜­!ºÒ…nƒ”.K® ƒ,¢.Ær¸Ã=»Í.­r ‘,ÉÌ΄2A wÅ 'Û35dÝb”7ÙPb¡¾huCç ƒ$RøÐ‡ÿ]–fç*ÞRøq€d`Aª¥æª\›ã’^ÀÖÍÇ¢%»F+SggÙ3ä´_ °¯)`ªò=âN ³À_çyƺÐYI.à)2E@ùh‘5ýÑ¥z¬—ü¬0x\‰œÖO |¯’DX~  îËŸùѸù!ì[‡êjZÇ©:Øg”BKžØcz¹xAŸ²>Â÷Ú@ƒÃÆ\hR¬›*Zêd#î»å¦/ƒü2D5£¡'9N‡©Pî¥B iø;Pe@úâ¨C,pvÑ‹»¼Ó|A|â®íŠ¢r¥ß ze[IML+Ü©(P 4Š./Yõ§-°µ&e EwVôˆ7E€Eü—澚&9µ%— ×cÍ'à±&ÓÀ*?­°…BVÿãp5G—Cà` ÂÅSÜÂò’›iV¾æ 13Xìu®ŠŠ gxž]{¨_¸4ÑH3¸¾ƒ­5RF]ãÚkxÖáð«]{xòúYîÊn\ÄZìþãÁ «@ê3þ ïêÉ!Pam³’/ˆ<íÊg&­g!àËvG¼N‹ÆÞû(‡½ðEËZè'5*…¹ü"yüPßÌ to–{ö,ô_Áýë ÊWòV¾ Á»¯á±3–Ä$ç…øW ¬êtq¿2•ÎáAO]´Tùß–ýy±øåò'‹Î»zQo}vŽU>ùu‰DÈÏ+õÖcõ|f_æùì‡ð{g€ž„H£š>‡zûx<t± ¡MÿþIOzÒWæûú¾þ¥WB§xÂ6+ûù€Çw¡þüv¯ù¸÷ø3úJ‘|_Ç^[ìù±1å6`ÒññØ¢µíEôLcçï«–¿pûÿª`ÅÇúµ¯[ù¾¾¯›@ƒÍC…¦õ«”rÑ:'s°¾¯ïëûº:*\¹biò\§±~xÑsì‹]x@æÑ5V¾T³É YWöPë\‹ÆÆ÷‚¸¥\m-d"0LZÔ:óôŸžn\g°³+"ló'kJÓ5ÎÚ«PÃF;ÙþÐã)¶ ³ˆØ[[ÉY«u¹ŸÛ4×ÖÓÑD9$ÆÒV_6h‘„î凂Ïo­æ.­+f [™Ž¨£d j›CŠåÐÄ»ö0‘\ÄxNzå¶æ’Æ¡ªùœe÷œ$]ê¨ô;nÔ^.ÅÊþøîe$bv:¡§“Έ?¤ÑÖœèJi½ÒÏxcC=±‘Ðç¬nWˆŸì(`ï ǹ,£äì e°9k^r=®4Ðj+«LÖˆ†4xÄ,ŒÒº­ñþ1ÇÓ†¸‡XÄ-öqÚM9Ó!óÝ”‘‰tç2µ'!™H’ …k±k#‰’ýÚ´yΤ¡î‰Qª9κèÚ‘4ÞÖÏêÆ)Sɹ•ý>¡Óã‰é‰ÈT’9ï‹Û1n\Ú9Ŋλ5ÆfÏÂMJ7éˆ o¢Ü@üï?©‡†#Ä.õL (0&gý²Ècr‹§þyèØäá³:¼ŠÖŒ—~ñ(ôJHUœè=Ä–V-Þ"N@»Ã&FÎó0’;\aÆ÷rÅ+c¹ÔìŽ8A½7|Ôñ2N›$ ‹ƒVeŸÝ“ÞúÔòD˜ôÈŸ8üÊY¸Ö8¼°¹îÖ%¶rípö•¿Ú|-¥´cX’»ŒcGã¦Ya_UuTW΋³²ö_û¥z<⇹w,¹g–ò_¶Ë•÷TLEàK"s+'¥Ø~Ó[ÿâ’@ò-ÙÈJ$^ŒƒUèBÞ”%}¿«ÖÍÎÃÒâÿ†èüš@– TÔŽ‘ã!àÇG1˜›Ø¸¿òiäX­—P݈£Ž¸–ˆÕÃA?¥,¶¦þŸÁÖ'  Ÿ$‰IR¢tA(Ñ«D_›Tî@€ö'¸Ip/Ù‰½ðtꥋÚ>h{(`Ò¾ûê $ÍÛÂ#†CÎÄSjJª,uÚ5a=mß‚WÜ$¹›Ÿû™w,…/7¹E]äVÔÈ­Pe‘³s\) —båþ¤¸<)pQIù7ð(zƒ°è%2r^Øš™è2Hãа að1Ý{]° ±äú7î¥ç¢¥öŒ%ÆÝ9<Â*ÃpOŠ"Ù)êY™lõB”9º™‚½©³án°TWPK·:ù|ýËŠÕšÇ 8JV “šÁmN€QÄÞ)>í|Ùb¥_vŸÁjü²(ôMÿ+wÎ\´Q AZÀ%‚| ® y¦iˆìù%U4v#žz^ŒVý¤Ï+ê©}n­›ÿé¶‘öhk ‡¯$b’ˆÀÁ’ ›À‚.RO,Ì0XÞp îj»@]±H¹E%Š— Ƥ€+9™ä~FDœæí2¸Â, lÀ¼eGRžOWo:æàOÐ(Žš]Ÿ®²zÎgŽˆ5S‡…—¯#ÀÚù§¨®ÿ›¸àù¦òh¨‚ê©AÐ2û²üf…Õ,vïhQsƒiϦLæA’>¸£MFª«ALeà…EU%û¶êD4¿@FôÝÑùÜF+]ŽPC è¿“´-nÉ–}  ­@‚ú¡¶x!FïCH»mTí¦/Ñb|êÀ€7þ]®\Ñ[:n™ª^(kc £«¯• %]Õ9Š –› \ü'5°Õ¦P‰eƒY¥,üˆV)HãhédVf䟻”kÏêÙÝŒ4ËÏ6æãØŠ¸{ w^Åûn‘„im¦X=ú«¢ó¬áØ18Å=å=ÄØYЏ*!_õl\CŸgA:wÿN5}žeÀŠMÅð4›r Ž*Z„úH»»¢»Äê4•DèåO= 0ø—_ŸI\”äž;óOp £H±ÈøçμvرЭJOèo’R_:'æý»?±••¸¤=ðh o<'6_€H§ƒÆ5@ð5XnÌôh&çšÇu4kxº0ów7Á¦VÞ*0 ö=sí®Uã ³`´"% ®n{+Ó°•à+ë—Ø7yËà£0_•üº¼ŠT èt _¤™ïn úTæõhùŒ5Aóu-"þEßW탇=’Jç›Z›¯l#‘CÄãvl©%¼}œÏpo½ÿóúâeÞ¤ÌCâ)o@e5n"ðÊŠ‹±$änÙÌØ&úÞÇ·#¡ø»àa¹žYøMɇž\ý_':‰qsQkµ.4¡vºcúš«Èfá\I±8mj±'ånÄ46¤¡ÆÈñif? e Ÿ;s¨È\p”ÉÀ$äÄ!HÄÀ“÷øªfUšJªšºÊÚ© W2×>9nÈ™/ÈTØicvZÌö¨Èg7Jù’ŠO;vGkÒ[gßuö•X<€SƒØ7ˆsr“Ì}«IJÚKqyz ú&8È¥†Øn3÷2ÐF"Fa`»V¦býާ‡M‚TX¹Ö1²ƒ\…æ›ë—‹? ^ÉEÓìÏpÁq‰h$˜)ríýOͽªÞóÓ&!1Ï`nœb‚o±†ü?<ÃöÄ"çüarF¤¼Õ^0ƒ&òøÃÕÝK…Ý)‡ÛÎæ{]8…‚1 þªb“pŠ;Å'L~†ï°TÇŠeÈ•Ð\Çiàªê ”ß[£n 5ßKVX­N Õ„½5tÙV˜ìóÅä©X!¾…HŽ( Å©-ŽàK"ÇMµ‡éüIÝÜW ‘°×é,[êC(û4µvògÍ`D~¸ëÇB±‰@(|ßIЊ“sxx¢ X^¾§w‘³»D3aâôJ^5£­$*süüóùt%ÎûwwG8ðãJÈVÒl¦1UÄ”E³ŒhÅ0ų̂6÷£%·çì#õa .§Õ=P&G¬†±ðÄÃ7òÑ2|_øykùÖ˜õÖqOK bŽ 7ÇG^¿k+æ¸R¿ËòÞ‘ÛÎľ)ZÃÈŽ™É1ÑOº×*™ Ī˔Túw #§GÅv‹iZô5öŸ™•®«ò 91 Š Aó¥M²<&±PH«û="=ä6L,2! a'cÝæƒQ𠆮f®YI`Õ¹’˜1׉ç„9Î%ÚòÜM¼Ð mÃx˜Í#ñËf*‘´9¦´Ü.‡¶¤Œ­í¤Qr¸z}ˆFä3¼È‡ Í+Ä@<,x(#&³ dTI‡Õ¡J2;… ú'Dçµ &" ÌK)VL8e:Œ,DYbrêbi¤8gбˆ'êÂ!@úª`õþÄ™F;Fɨôêw“kØQ£ ~±óåÉŒÙvRÚß'D[<ð’¼~¿Źߓ½…­š‰nÑùEœœëÏ•¶+Q4ë‘Fã©aÊ/zÂD^JYaL¿8ÙóîöÒIQË—-›IŠèÂH{Émôqï\”eç÷‹Jîí¨Þu¾”ˆrÛ#bãqûüœÍÓ¸î:,F/ó¬ï¾žwY{JÀÄ‹Cµ^$aDúŠ6^·È/ÆP®zú,º¸ç±“ âz/ÞY±”ˆˤV݃þ÷ Þ•gNÇoÊöèÜzÙ]~Ÿ PÔF³üD”ÍÄzòò§vií4Ùñ1 þ8óùj†çÑäkNò/¿é~½×=3]¯¾ÙÂeÛhà¬p5q‹Öïr¹o«;—ˆ~®ùfA ÏWòÓ5â¥&•EÖ$‹%­ŒŽ9™†ÇÑñ¹7³-‡oIÍ›¼w>™ÀöéGí{ì¤â®~4r Èå–À¼Àî$$AÕ´Ë)8"¢lœÅÀ]›b?YU½WÑE݆‹D~kB[q{;©ÞÿƒivòÌùK g?øòå3'êR® î+kc…Vô¯…Ø´¢|дó.µð”GœnCGä†ÎŸÜ¨‡eJéÌ÷9‰M5ĵ& ˾ 1`1ϷߛªÇl¡à2ô‰ÓD¢Àš²1#$ûæ’ŠN~Š âÉõ%brgnûÈÇa¢÷ÕZ!~[8Ñü>ŸÏçóùx<¤yÀKÄÇÖWûZ¿Y¿˜Ø'_x­Å‹:ËÎÄr¯Ã¶KªåÎüç/>qˆÇq!ÏTVq¢Xâ.¸bSa9…ªÓbmðq‰Œ‹uŠÞáü“·¸7™Oðhú¬46üe{€U˜·t)Ð;EØèÏçóEÜÛ⌌䤢¦»Ù÷ •n§DKóCVüÖ1\2$tSàtƒ‘+p&B8“íþIÑy<®$¿u’™Tج¸ûdÚ0#dh\¡Éèô–9Úè=¿Å¡ãch»¹%°r cs 6Lý§Ž éæaštÝØ×Ƚ+ú™|ÿf”‰MßÍr×Jµ«± ¡Œ'_£sª| èüšÍŸ‘˜Jr>åÞAd“ºq(›3…^Ä1HË6ÝàÒt “¤C`‘Dž¤„é0ŒŒ#P]•Äç!qÎ P³j€´^£àoÑy¸ríŽ{è;>C EÍÅjÜ„4BÜ“œHƒº™”}ž¸õÓ­‹ 7¼v^” o\<†`f½dš%M~ s‘UÁ˜"Åy¢šs(ü¯‹ÎS«ÓD§k^B{SOÓ´>¥ŒûÓ« ¶^Ž«0W·XÏ+ÄÆ³üw€%x.Ëÿ¿RÙ&®Ò>/PE¸€°–†½ô’ߧžC g©ÏÜ4 –5qúî3ÜãX&[N ÎìŸ/ª’“‚³Y(¹›dØvõÿyµœí> ïrÙÄ“îp™î×Ô#TOÙÑrÍ¢¬²Õ.'ÚæôÛgˆ3@‡;ß¾(Ó1 +öøtj_\›öÉ‘®Mûç)öÜk3OÚ©Ò¿&úéG‘d 4ÇÀÝQ*ù¡ºzsiÅž ¡ JŠ•_¦ ÆÎ‚L¡ùxé´Åž °ŽåøPf¬­Õ´uäEq¼Ü¸“Ç ó­OƒÐ¡âUÏ6bæÂÛÏ!¬Á‹`è±Þß[ôz‡²åp«ËMÝÙtlMÖ,¦ê"ò/>tUF=Ûnzñ…=”ó'c‡©~¤‘XjÉ~G¼í~_ö¥°´’¿QÃeñÄŸê«p{Á˜¼àKï‡ Vº*™{æ $ …› À«ªÑ”JpàOŸªa"id:jØïïöû^ ‹ÚA#½ : Ê1Œ?*:Ï>:bœÕPzÃpYtMX„N¼•ý+ŒP_Y“1ûÁäËU7¡Üé±Z·ÍUl“u&àj@+<ññ` '´‘ï°©Ú €sØ„' B%þÂR#èZ­MGH;ÑM†iJL?c\Ó“¬JŽøè¼Ã̽E“ÊÝñßÖ‰vŦ”ìý Øj=-—.—Žº:'5f) ­ ÓÕP"G2 ¬ !õ –àñYÆ•{˜§Í¿òr—‰äÑb) Mheì¿ÉEî¬tI)‚Tô¨tuSÏ—Ût9­Šõ³îŸ-ñΨŽ©B•¤fÏœ}ÍX%+«$À¨‚¦` cV’Ú ¤1 ÍêF=ùÍôù\åjKVOIiçqeÀšåØ<¯Û3}ŒÖ™}²ÖHGô³Q;« ¥]{T´‘¿ª‰2u¼Ò,=‹y™á;ØÇÊ ÖB'åÿßYûŠ@²­tD"Wò#íÁP§|¸5Þ)±[’ToCá-ŒQÞÕízvoŒž¥<ï´MÊ–ßɉ#q…+WOÀ¬HñŽÄ# óÀ“çÂŒïw×mµ ¥NYîðwê<ä5ö„+õSSsÈzËÙ¾ ¿¶[ú|;Ñ”š4ýZ@1n„À-Z† $ ZúozV”kÂ0¡P낃„re˜ n®ÒC-õŽçÓhTÅñj£ÜDá×- ùì~@â¾!ÑSÊΨ|…CH…d6;jÿ›ç3 „=ðD>2•h&@6É­¼U0št”m9{Æ<€œ¥™vFǬðÀì’È3t$’}µbÍäŠÓ%ÑŒ8ð»ØC_òµ42ÞUæa†T<¬q¬äIT9ú"±»ÁÇ£{d‘-ÀFMËÔhÓÂÂ[”»Xy>ß8®Ž“Yä†.ª)Y±[%¿üðÈÉgÏÀâ¼ßœZ<ù•ÌW"‰× ï®üž§.¼fOsžKq¶€¼ƒ­‚ìówûWDç‰Oçâ£zh©phvÍ1vLlÁã%tŸLº#{•8¯YP2bѼi†»ª—2ÔíJjn* «'dþ£. ý‰Ä؇Sâ­Õ âäøà¼¤å¾ç’­W¾çI„Ïç¾æ€°Þ(Í¢$Û!ƒVóB7´Põ¾]\ ¼ò+4R\…tTÅÃk5½¹ÇÚj’ŠÂÊĺ½\r~á˺1›,ErÓØE¼[vþ®?ÛÉ xÝ`&VZñzûjÐP×zp3¼p®u|u2æ8¯„N‡®¼;Ég»\ úaž/¹C>ä8L.‹•òTú{Qidz“EžÙôoÕP¼ã© `Y²qhV¬Ù½$àü‡È6æÉ?˜òÂ} €6M‚+˜P=Äí0$²|Ëi©„%pŽP0ѽP¦u äð&x-Y·žxâ%‹üZÀ]§L¿'ÿW‹ÑibÔKB{Ý)ZŒ™¹?¹½$ºGâR^¸ÓÿÈ+¾zÈ1ÿ…Õp'wýÁƒåó¨||ðx4ð²o‘Œn Bø ÀhŽÙµqÝëÃÄ¿þº:²8šuQƒ®AïId#*­¬6}ð8¸$.Ú wˆÔ3GÖl¾Çz£˜/ÿÊÅÄò¹é?x|_¿\x¯ù×¶ôŲ®ß#ÌSâ{Ýée¨ ¼HGξÉÒì >¤÷„}ºj5µ9þÝBÜõ‡¼ú׿)ΙDx¡èüGe:Écug‹„`Y‡ÁÒÀÙQVÉây 4þwü:ëÞC¤6ž:(Þ!lbC€ùPyûµ”8Tq/m«©ÿ‹8NûN«¢JÕ"Mí’º²§”'O› ²tm @jâ4ûDJí5“Ôg!iˆ)ú°3ÐùFgå'˜`§ÛPkæAo;¨L˜R¨û§ä2Åmhp&Û!ÞxÓ[ãyÍRî­ÛnW£$äQ‘j7£Ú•¿¡";rÔ */ 5U@6Ý»dÕTЇ¼À‹¸^SQeÐWGÜæeûØ yœ…˜JõEˆÉL<ýþ­\LLÄe7[S)ÃT¶[úç÷^R‰™¢Ç¬â\i\›eª5b³š†P·€,7š!%ŽÛ-‚黑ÒWçµ9Q¹h„I©´‚~–}f¯Ó¼$PáµÇ ¢#¨n«u(Ì.P|]‰[rÄdöÖTÑÐpÌx€|o|šÒTtª£¦¢]vzÌG|&ºD’èạ̃뜡Í"‡V¥èå*1¢«\Ê`‘—äËLkíáí³•xåfÿ×g†zWŒD½’‹é©Ö(O'‡‚6·ÈŸ¢'/à@$½¿²+0D”sð.Œ¼‚¨ž¨k3r›^æF›®–xPŒ>?ÙâÚS\ÕP©™0K‹ÂmÞŠÅk±ÝÇ¥9[¼‹†¡X/íôÝÈ9¸‘£ýpÝÞ’³Öš?tTÆ$h±$.Þ`ôô|wøÊpâ#,꜕œü!åSh²¯ a×Á¨1 ¥6ê*@j ùâ+M¿pM†Ë<ɘ-TT‚´hêláŸ+Ô£Rw•aÍI€X‹âÒaủ+Õ2µ0 BM=<ÌcOÇCT¿¹=þzAã™W¶Ä¡PJ¦É`˜ªÍ—yFñŠMžf°Ø7:Ç«PÐLÛüxW¦ÒêùýËIreò™äâ(‹foÿBcö/P¢Pøà%ý†µìÜ/Ò_ñátT O›;+ÀGq@ÂtÑjßc1§Æy€ÏZÃYÝ·†CB—ÚÁÛ¿ ¯Ñé'BÔ3RA ƒÃ×â!Èj÷Ü‚qE{ϹLrò|›º/WJ (Ù9¥l¿ÃÀØ{òc*²v” zÏePÐpw{V#ÿ]Ô{DÁ¸ü}Ï8ý¥µ-4)|ˆnÚz€£CÿqÆr_²qwùÕ^ìûú¾^o£¿¯¿fhzÍw°¿»†Ç#ªÜý¥Þ~~oÒ39ŸP|šÐÊ÷õ1ÁÕ÷TÄ™¼üÃJß+³;àÃTØ€Ùg^%MCMŸ«Sùë§wßø?«×%-l¹‰/®š›ÇØv€¬@Ó½äC`]q9DR©‰{ƒ vJ[wi¼CÏÈžŽ¶¬þvk1¬2Ö ‘}ªå)û F›#¯q´Vëµë7¹LV‚?†|þ¦¯cì7b×øéÓÂIôŠ™B°Øz{C\n¼sÛe)_Ý‹ªDÑ‘ZTÝœ‚š’¯­ÕàV¬§štˆpI²Û' ô¼‘·²&˜.Q©œÌ»ÏÏ{º]LSw°wGl¿ÂeÛÔÙ¨Áë¶/’Lo7ºdàßPå¸6ÚöçÇ£?!WjJÄxØN¦2ÌŒx¨¯î€ÅØc÷ ™4LTw1á%5g©Ëª¨æn¡* Yg,|ÄÏK*+Áy°®˜ºÀ#o‰¹¦à)>ÁЉj¼öªõŽ˜°ˆµØ: ¡ïŸ W8_ñÙ© ò<ÁðD&Ñ¢:9Ü‘6HqG¬|­«£åÚ/´À¢ˆs˜š ïÝøÔ×ÞÕµs.úëðÝÃ0yë¼ëjÊ¥‹xW6^ò~Fþ™hØIbØl¨h-»ÜÑ "B¾YB±ýé°PëJªX40Y€ 52_íVµq1%À.ôˆµvWá±ý" zw}!bJ>Èùï¹NN€‘³.·«G3X¾©m©Ë Ž—#Õ|ef*x€¢]-zäï?ϳY–G¿Êе­…:mxk÷¿Øµ`†vCËŽû/∩ýûò’É7™í˜6Âx6=— ^tO1íÂæ÷‹_v75ãã)²Ã¦,¹R–Ën­k0ɺK£bÛ^›0É­‘ÈoJ{^¥)¤•è4¿)ÑÈö7%3¨å­¦ŸÅ“\‘X™¸¢~Ó®ùhp†Eú¸Ô¡c}¾«-b2ã"÷èϤ­-½>Ò=ž†÷KÃló]û¢óÜt<Ÿ½PG:Ÿö”¬³Õ;]ZÿˆË$ôXÇg_ðúºf2à~úîTN³c•k•kC[Ð3$›x¬^ë3EÎHra YÈ %èÜÈí¯˜`¬t¸NØA,o÷Ek^×ho@(ñÅ·ÿ¸¶ôþYùa'Ñ)-lÿf }D˜ˆ£-MnbT7ÄŽµ-Ý[ù_‡—ÑæœÇˆÒµ–R>Ú–ÍŽ“/?Òù(Î ¼éöÑ©¯ãÌm uP³ °BÀ\EÝÀÈÌņßwVz5ÒãÃK`q׈˜Þ=vÌíâgJN­³<¯Ä7`fÆä›XgT %•»Û™.ŸnÀ;ûtè*Ä{ض¡*¯²U¹¸å2Î-o%@ÊÁ— €(2¥´8!V,F]rÁ\0Ft*%£ Ã€C.Â5>ðnÖþù©‘WdÊEæK²hˆê”ÚŠÙCâv4Hõ(C Ò]8ö™d-cÈäsÉúTDáU¯ZŸéB¸1˜|â+5Žï~¹â®nÖú*IŸìjûÑx_)JlX[7óü[¿Ã’v¥úŽXÍ\O! Ž>1 ïƒÜbï0s‚PÏ›*Ο <1rܕ܌ּѰUÀCöÄÑù7»ër h)!ÝÆg®Ø*5YObµÚ•'RþÔUÛ8™VDMÝÌ¢ŸE´]™Ö¿Íìa©B¥­¤2ŸåöÞ'ù¹ð’÷ùi›BÜ}€Ú5)¦iñºÑl%º/õýûú¾¾¯cÑ>ZÇÍÿàù»ž~ÚÈam/±ûðR ‹"3œð}}_ßWž+è~ýå©ÖþÅŽ]˜Öóùê0|_ß×÷õþë‰ø`ÅéÕ_ßÞA”ú¾–ík`_ýÉölø+#ùiAŽ¢ªõœÂp… P´ˆÖqÊÀGÙ¢¬–ò§‹KˆÑ@³/½x;§áí–ú»ÞÓ‘1nz:´¶ 9GÞÕÕ¹>à¾õ´·6iUéõë½C(ÎÛŽI#—cádkB°ë^ÑÞc)¬ÖðǸ¢FmÜþÔåíå³È÷Ht}3CëÓ^ÀUòâW»€H’Ò©PF;½y‡ïk±‡û£¨cM"Ewzì½ÌEANÌÅf¬½íßhÊ(Œ|L jbDšÝBÓÑèfÙ§œ Ù¯%qf„ÛÇó¦wõê³¶’SáÌcÝÙ—xO43šhŠÝ@Êò¥U]jŸ 骨dBè‚;ëö¼{|r£ÜæÉ“ûK˜² ­·Š,Ǭ©ÜU_˜y¼ÎÖŒ÷…¤R£üDÅÏMèìÁÒå%s˜—gNËZÌDvQ*ÖO,™Hñ"÷IƒhtóCQ€‰†Af=·ñÀ5O¨T ”Ì•'Ýñ¦LÛ‚.š¢€;›t,<»æÄ´w06º<øK¨·´]÷³ø/V5`šñe1Iâ0š*„a~7}0×5GÑéåažl¥iD“ZBm ÜV†ô0`!ÔÃ4~<=}eˆOK[þèen˜™õ}–'…ù᪓2i¬<Ò -vkœf]ZlÖ‘ˆš\NÔë‰}æËF<{÷‚ J3³{îtú§@€ÇRåYbÛ=„geÔßòš)Nµ&»1¥º?åKÊy£:ÿõŠøðôýïok@Ä£Ÿ‚¨.JWõ¤â{Îî&À±6¸¿#:¿ÎÙŽ7Ž8˜Bj?<—2†Bçu)ÒX¤W‘AƒZX*@—8#-¾ÉÌ(6¤—‰5ÙÃŒˆÄn¨É¶ˆ?P°hü£§×¬õ|R$Å¢E»¬|ƒƒÝ{,¥(—Â… Ðên{”ðÒ(? ŒËI³oª¯Ö®à1~‘€¸E–¨1  x¬e÷rÑ-¤îEP”ùH›‰Ï !Â.eHÙ¯PlÕ&f¨-ÛYäŸ@F´::Æ<KRˆI"D:˜¾)*ê‡Ä¿¨T‰ Ìà`Ī€æÒc^â;äjcÅ\'öZ44\Íwáw‡ärû¬šµ8¹ÆÝúëàœ…Â<;™ŠŠ L¥š™v8»ŽrŽí©ßS÷&XŠÐ4}ó3˜¼¢c3E§a w°2Xf€(ÚÎàæë7>²ÆD\ÜÒ¨ñŒ`’1cÆ ã¾W‰±Íì¿kJ»€ä(Ì øU%ÈÆhšrM¼ºW±[¨Ò© ON`°^ɵlMušÌ±Å$àìî>ý¾ámBWQë‚ÁUo§B!$®ìõ{)Ì‹Ý/î.–0öCîêch'½J¡çïPgöXOͼ#g­eE heñ‚©ì«r?Îe1ý¤ìý|û’]Ü ì÷­™=ÃVaŸ9MØô‘ó<ÔnäV#D©Ýù¦G…*ÚA&1DW%—ô±BÖ¹Ši’%å jûé"ÚDÃëÍæ¢Eù\FÈ} ÜçsÜQØ«ø?ɶ,‚¹xsÔ[»Ó†¶zæQ àÜžó•ùäU›Ñ)I“.†Ñó¬Ýž:–¢6r–Kt¼ÿíØYE'â!CÃÐgÛŠöy†¬‡× îseN}÷UÚnÏl\ðAÎVy).„˜ðÌňr ¿!Ëû`ãûr‚>#|!ÞùÕA©±]ÇÂÝ¥Ìá{`«Gò@?L «nu)ˆë×NNB©QÿZý× ž¡ØÊRÑ—ïQÒ@Íê´Òü,”%³æ.1[QÅ!ïÂm^E»ÁÂîB‹¶·÷¥£*ȧ)*¸Yxí–]ê1.ÑeìÌèCiöæÝ0æK>MŠ‹}Ü•GfŠžOxà³Çf½×sʩłÑE…T䥚s·Ÿ~Çý=‘Bf]ónr”¨»¸Ã®“9ü¨·”¹'éMÉ£S±k#’xøO&CœÛE³ÿ!w”D"æaöÿãB^ÿ¦Õ$‘ïJ{ÉÁ:¤,E”Vtn”´%hN„é]’‚é“Êòl±0X }¢1J¹|J=âé*òœeÏWžàLTHÛhÉ\ºæâÀ;D‹†©@s%÷‹8•|¢IˆÆÒUúæ n¬c¦š`¶QêÃZƒ’y3Ò}ê±­`ÂNTÀwHâ¨tê\ /2È2Ã~£Ù"û‡5Hþ)B̹E-ù2p²à¤vk'Ì»l©¥Á©òÜDè ²".”8´£!¹J=Äšè]‰ /¸þjh߯ß6gûvžTˆrÍÔŒ‰ZšÇ"‡È4g°ãDù@Å(lûFiÁ롦¨Y¿aÐ("<…þƒâò bô5“<Úáx·þC ÃÓplº.ÍÜÊ„ìyG—°Ú»ÑPÉbq±IÉó’/æó($Gì§&j•]0ö3ôÑÝ’·²zg K~6³ƒ¦BF¬Ç˜ UeAùÀ¢œøÆ-€äÚ²/]µÌ½ ‰8,ÆÕµ ^™+ÝH‘B]P­±A wLÌoÐlÆb=3#5ÆØR‰›hs šÜsö„Ô ß.œd»V´tË–ýµÖ•>ÊÊ“‹IZŽ.À£!éGŒ·šÔUƒ4“õâ¶Àì´¿§\ì'Tô­ƒ›^ÿ¢ï…Û7{<žÒE·{ÖŸBI›}v ûÚèByåmoP”ÊE­6ÑMI`Ù話—¹qß6úWë1s‰÷gŽ•@ŽÕ6T0ù Öbå¦rb>Äy¨ ¾çq Ë1,0´‡S×tÌÿ":¿ù û ²Ç¦§Éس³ ZÄ0’<%r5’@ –Œ0ák¯Àï{!þÀ?ÿòã蘒ÔøvhdŸµÛ*V·=Þ¬þv‰nÆ;êߥàVsĪEÀ­ý'Ž?uõv9Ñ ‰øx =ÛtòßfTíx÷üLÍÔlŠRNr¡‹z__ÌùF]=d0¾Å xç|YO0¬ÚÖ]C)øa‰gŠÏ$ð;ü×?Ü¢¦¢¥D~UàrÎ¥Ù|óü†sÃE;òÿçãäY"/³ì˜ 3<û¹Èþ¡íxg|rmÓÜ%nîZÀRNô}ùÆÙ2Âm#Áø°|á·`:nu禘m y¿÷´] I¿¹é>.>§%ÌýÀjvÀëñø%Y#^À¸>»ýêý;¢ó櫱èÍs½5ã®]Ÿ³â.· ÙÆÞ_‡ôü)šr?mM —Ƙ—Ž6wéæ$äÐDA¤ÃWH4 P%Ä¿Jß³8è쾬é¢3ûKÙÑ[ É7Boäâ'GÙÆ­ß º:Ê0ž|к@;ÿ²í»E<ƒŒN¨ÝÕ¨v[aÉ­.ãïX³}¹çó9Ì´¶‘ëØKÁ¶Œ:pX’Pð­j¡ú>`*Èf§JîíNaßñxhië+\ÎÄæ0ìV‰4k$…þMôHý|á.I‘Âê]Iµ/bB]׃Ká(eâú* ('#R‡Øy¤Ä:Ûvy¹’>FÞ¶c‹(é4 ­n¬áñ»]ºÊí"2ôz‹þPDdÄÖÐÔ‚ÑÊti¨£K¬X§Ìôâdª¹Xœ1çD\X„ÕOìwä’•ìnä´ËÅ“‡®°djiÄM ]ú†ì%?„‹ëåJ¹‚·Ó©&©ˆé@¦´Þk‹P°Àv1ÇØ}_9ÒHŒ2ýòtÜòt]ö*|µ²,Ãj'F5J9‹nWG £‰Çü HDJʳ#€±ˆ÷D^Q¶EªŒIÎìÂŽF«§ŸŠ½ÓbáJ¸F÷Eµ3óÔÕ¹V\; ¥{TGÉH×rûi¹¨»Z.7›NÒ ; Ž3Å•I!Îf±b÷ è—G)÷hBbÂYb¤k=¡¤Ý¦.¹kv‹ˆžPhi×ÁRÅöò—|7½¥1‡ÐÍDZY†Hx§ÒŸO¨,-÷T–BQØfBu1¸‚-yˆ6¢vÕT*žÑ¦N‰‚JþþÉI‹ ?w,e”/¸rÿ šlÓíD‰‚–ÙJ~W€§Üì&7Ý´dèy5O±òØ=S`ÉÑ@¢Ñܘ’'Ì›c8Nt†Œ:³yü ³Þfë5ícgxÏþ+„¾Ž‚³ÝÔÅ-pWž­¹†õU½r¼ëUu «¹×CþÝÃ%ÁŸýÎ×}®è°>?·$HÖRwæ…žæ|Ã]µ¬ÿêÚog¼òuIáêŽ{aF ùÇ·_xºìä.$¾xqÝîg`ùƒkØR>„ÖHÌ9âãñPus¤yyì õÖnLSÑóéÿ°}A´ê`!$4° ­í6–l¢æ]v—‹öáŠiÀõçœ3pÌÆxÒUäªùų`ó%¦  °òÀM-3^ö`s×ÿÞ~¯ƒ'ÓÞhP¾7áe¬HO|n&’ÚHª"œ±êv?ƒ­«ô±Q¤àíœànàÚÔƒC''E !`,¼ç‘É<¿ùuÒ“¼Gíç®z!­°Íë¡Eíò¿ƒ¸¯¶O/ÚxoÓÍ €c?Ïe Õ¥ætx^®ý×4¯9.ù¸»W-Ý™7¼üa^r»A1²êýì»×‡‡ýÕÊžµ D ê…t=à¸Yø4Ο|3^Ÿ­4 I`­ ´c £#—*¡‡ê4 36j \3-tŠý+óa†õ•O’«¼ Ó:~÷óXNÐêáìO&=¬xþ@¤Ö’vj©¯ORáMʵ«ö¨•âÏ5MzW_y‘‹ý)«öïÐ÷tO«cöºÀ2ñöð^@cOW¢ÃÈÎË=”бÁZµ¬VÀÓ‡Œ”% üú$jÏÛŸ£{êÑ‹¬òØœ§!~Z´Öe%:'Öé‰ûãdGT„ŒAKuŽSôO†Ç¶ˆl’‘[p6gVôbÿ±ëú­ä£;R•…@— µ ÆE²`ñJeJ„ïø´ÛÓ…à9Mï¸q”0˃»3©•šwKz1Óoe‡€õn«ùã‹£ˆK î» ÷oÄ@0C‹¶š71⥷]‹,(^1Ƙ4wÿ‹¢ó’¤>)pχ¯8.ó>¶iµ`BÌ%nÇ)¬iþ¹s@1šCï2Ó®é5•­’±2áŒÇtöFE´BÈ1†u±¥tºàuÙ3ùŸÅöüÕ^ qDÇYítIäc¶™%á-‹èðp;Ÿt –ÂFNª3¿4Ú%³;kº™K ð!…s 7‘N —˜ ©žíUœË%¼C•z¹¢â";é¤!&¦‘½ó°‘¤ŠÙš<ŸZŠ"à«¡"µ¦ô%áâì½¹m5Ÿ§›p*mgI&Wžð=±_c¹¿å>È Tß;Ù’YE´²gðš3£«Tàñxp- #ìƒ]T¡9|@ô·[*¾’Y']%œêÏ‘$ºñ*À„è³S¸½wÜ$‹–lÍ'$e¸CÛÜÖ”†ÑƒÂŒŒ@6еKXöäqÀèlj'’¦“¹Ryr*÷"gåw ×;ÇÉõŠ1ɺ Ѝ£±ó ºŸûrÊÈ\¡HdCzXG0!@¨ ƒ@P ûêC3DkI¦Ì‘ÂpÏÔ„$;§¨q‰É_EÄÇã? 'í:Z;£°Ñ´;ž¦¡ÿÓU¶@Dˆè†x‹¨úÖž’û V3mf.¥Z“ï~÷}Ê[2³){¤æ5%[öÔ 9°Éà3ß;Œ|€1$Žzsp®T:E›•ÔÚU¢P(O'óu ü€±¿¥ZÐÁåoìÕ&’±b¤%‰Ø¶_„¬œ£ø¹’ñ§h±˜nW$ ªþ„+Œ­Ø¢Ë(.Kê7Ê5TŽ?Æ]¦ÁÇ]§ý¿½–"!ÆÎDD£(ÈäJÉ}«4‰KD®Zð&Är»ü¦ ½¬Õe9µõ È8‰û°Ë¥:]ù¬ÔH¨˜3N±NOÑRîì>ª{2#|¿X¨Ûm›’×SûéºÙ\Þ~¨ ºïP@c Ûˆ‹'9T ýåî;2iPÙDøÁ›ÛMü«¢ó\Í’‹Î»52‰jÆ @^kÙäˆmäƒVÂũȮZW͸NÓ·5œªZrȪX(ô˜Ø¢ü†ß㼤†@úx 𸗈ÕGùÏà'Ó" D¶¢B ’€ÐjuÞÎp~p@¾x†®µˆûûŒìW¾\£²Æ~RñV¤χÁÜ“éÞs'Á>RÒ8¶†TÏTèð‰íHdþ †A„'">ô =f_}H`üÕa6Ø|å¦RQ6Àë î¬v[éýÊ!aòæ2|[g樉÷œt-üÖ×ßgÐꎭ1NºE’k#tßmU0G¿`Æ=²˜yDu°¥·Æ£~VO¼+|_¼;zcg·? â¨hÌ€G78Ã8œ³¼öxÿ1‹û`²¼Ô@Yûá  8kÐ{[´,—“wtTꆋæ'ÿÑyæ¾ZÚZÊt8_Rª…×b˯‹Þ3"ûçEß­uчëýY 'ϸi¬{•¤zP±ðèŽ}òm¿-• Ï <ß#ðê»i±±<^w;î§Â,¯ÜÚ™@yÒ¡y½ }’¦ogÝ…|™ Ð îç×Þ|TÞ À}ˆ0`žtnðÿóùÜcQÜî—‹þ*]މm猫£í‰.·H£µÍ ü+ƒ×s–áïÜßïkÍ0bî[ž@ŽNÃÐ!&Úß×’ÇùÃY¬ãLŠW¨1CÎÕlŸõïÈo¹›¿k@GІQäüÇ{aœ¿):¿¼þÓ¼Œ(„S>àÊ¡(tž„d@jÚýH—:)ŠÅ—y(É¡"Æ·èíÿ_A?˜R§OŽäEKT$¢Îšw­q¨–ý”=¡!zæºc‡¨‘ã[`Ô¼]#yÒFÑÛ·ÐUÕžõ§lQ™}lÔ1™¤×´'`CFû¨ç­ÁÖþîæHS1%. µ©˜ £ºÒØW¡€åP¤àÙ„FoÔB…hÆ–ªF*ak¹‰Œ€A ¥¢ú‡èÀ'-ÅÙ ¾²íŸÐ¨ç­7%_Õ„7M³ëIB‘x œ­Ûåòyh‹9¿ïYÄa ~˜€SòñÁži´ð磩Ú1§~+ÔUmÙ¬—|âÀ¹ßb䓾޺®ŽÔg}t.Ëpá‘=g°jÔ§¯ÄĤÍtÉä<ò4)¸Gž¦ ÿ™ÇCò5ÙÒi’C)¬)'²ÅCJ߃}Ìý»µ^¿ŒµhÞ²ë±;p+ã‚åðr©mYxõ4SæNÚNý5= £¡Ï»˜!ំ“χ„P`ºŒÞèÑ! ß¶Óõ.R§]ƒî‹¤S2ñYÌlîR, ^çjo7qÓ¶žOz=žOz<ºP=à©ôPJxçA+à¥RtÄDô¬£‘úGRoM8‚ˆ…ÝŠ6Ô‹l£ç×a—½bÑô$)hN´ÇöÓ»7W—ŽÙ¼=°W/Ñ"ãÊr/ªÈÊ6O(3÷¡*9ßnN¢!ɤd(b }Ï•ÇäëG%ó!¬îÿ4œ¡×vŒ; •„9ªƒ†°O"×c# …ˆ·Ÿ+œàМ+ööÖÉyVµ#ŠQ»ÂvE~ñúÀwR®š+E¡]W/lj-µá.Mcoк»t®ŒÕ4â=Äð/&z)—ÇV{6¯F'c6¢ªÆ{±ìHv2 WܯiÓÉÈ›¸ËÈW¦‚ÏÜQ•Q\ᚚƂº2gêÜýsתaÒ Éã>*ãHÿ”è<>tê3¨Ÿ+6c•Á™,?!lÙn0‡šQ=Ûw„ÝsWë,͸縴ÌzmÏ‚"™sIÝç:Ý®¿:r\*ŠAª­€}©ð@Š'fßøeq©˜AòwHhÒuí®»^¦A,ÀC±áIp™Ø5”ŠPÌ’Ê“½ñÿñx<ðTþ/W ‹çöHÌŽƒ[úßF~ã~=*~ñc[©Z:ûTêfJUg_“,aê™|nÊ’I°õ¸çå¿|Øy®¾&Qﵑ„'f‚ ’ßhÅÀ@×ÕÍ u;(Í+ €c³+’-%ëä½ÿQ®Îަlƒr8:‹(ax¼z:ȳ1eùÉArét¡‚8cV¬Iq“.r-#‰åçóËÅÑ«ÀÌŠÀ84™×ͺ›#™3ÇJ@}Ctt†%˜è!‘ÜWßóÀÃÔiÝäç? ò! Ë™XúÂFÌ¥é¿ÅÜÕ£pS¸y[õ|lX ¬PÌKš´…^‡ Ì«2˜ND¥–ß•¬9ò_‰a8ˈ ÌÉñ–“ÛI²«å¾Uåy\ˆL;#òÐ¥öï~¥ü®ÐÕ­ŠÃ%ÀbÒRãØ‡ä,åf‰\˜øàòZ[´Ðys‚`k) ÂHŒJöºÒ‰3ÅÑwpg 姪:Šò #Kçõ€ÉOÝn4o5 ÙÈŠŽ‘`äY›3'7íã9¼&Ç$w¢aB/ØÁdÅ꽿V馄} .OwƒKgð˜¤OR ¿~QÀîŸç#WÁŸì‹&ôUÝÃÖNhó’Ïê‹•º¼›_÷J©Ào¤°ôº}—²{¦.>ï GHWhÅd#„/™ùóNôƒèy!Îõ}]g1_—„¿Ò±V¼Iÿÿ£›<9fÙù÷õ}}_ÝLÀóIÏ'<¹_øXѪ‚•ŒòǼ‘°°¯é5º+>‹'¬~_ß׈âûú¾>ȳ}ξ¯wÄÐ%4þš‰}âüKfzX+ärÐé“Ê®úê»B¯´*z+¢è&ÿ±oÎç¼×Ãmþm™ˆO”ã-Ê+íÉf¸™O¤Š){Ú½}°ØØeBIVAÄÙN‚ŒåmÖ2Lžì9ƒ,™’Sªˆô£×-:Ê–°WLkFÿ$¹®[/¬)¬Ü‘%0L}Á¸àòlÚ+5é»÷¼ë,p®¸½ñí¹À¦ÙÕ7[&rÁUSøz·Á:8Äå8»N_J* ŒZêû¼yB¨«q´ëŒ˜«Š1†Ñ»¿°0>]}Í&ç³öéÃ÷ù±œtÙ5Hª„u³Ë vg ZV¾oòÇ ç«7Ž*27©sÕirîÒÖú™Ï/μæ=¡û”zÁ&¡à`°ëá¬Üª±9ÝÔàØÂJ{qu#4%Ê+Ëc©ÓÐF0=êóï>í)»zJÉ¡pŒ7£“Z”ô)Iì=ý4ôÌl¼bBë°‘túŒª™ÕäÌ¿tœ+T[Žú©‰ÜoÁÕü™OñQmøÕ8MSÈ)îrSFEGaƒÉYø@¤¹6iÎÀÓóBÜÉLfm÷oC+°D|.;ÀJÝ”bgK€› ¦Xõ)]š]Ù-Ÿ#&Y8uÜ–špY˜éPx ö6êüþ¶¨Éth!?«ïÄ{ǧGF{*Itæ[(!šÒLÁu)+?ö‹×|q21i mÊ•<<;2b Öû¿§¥[ëšeøñU(¼hêÛEçMÿüu¬Hh«9hlG³þ£×ìŽïëûzÛ¡dµD"z=¦‡³Ò¿ÿk®d‡þ‰è¹è®š4rÝÓ¸ˆ¯ÌË{Ýö7„þ×lï÷uè¦ÌCÐO–úšÙïë_8`_ ¾K*êŸs¶_äepÔdLn+ö'R2s ~€zAuœwv˵Á“R\2ú„Ô¢>Þ\º€3do"Ùøéžv·0Þa3GØëñDÔ3çV¼ÑcðîMùz4-9C)f ø’Ç|rØÅ̸C}8™Sº…xìåþxúÂÏúÁòˇçêôÎUÎa7÷1Šp;ýí@²]íórÿ*qEêý‰|Êÿ¡0~ Û-÷Ûl·û4Ø¥J ¥.ŒÛEZù‚¸còvˆÉÇø%¼%? ¾‚¸ôªÙwn;åò…Ë¥ðòàçNƒ/V' ½!F´·<ð6\Ñ>¿·¦ªgçäkµQ|b JC+‰Ä§ZêWDc1¹ö0!:óþ]l(?/§cšI‡˜Oi¾òˆ­ß4‚d#¦­£e»0 *‹\ªÎï:÷k–D;š,š“h×E8XÂ;þ¯G)Êa½‘ÔŽeabóÞàRg´LoíÄóu?ðx<žÏg¡}RPùãÂú%ñ#yVOOì”Ehrz´2O—~æ] ƒkµá¢M¿5óùÝýCzdîE9­i>…ø„—Ar¬#Äíg¿ðP)¡ÂÛe¢ìT*ò?·Ò ÷Ù¿&~B˘ÀäÉ”ˆ÷U9_Q%e=ýäã[ªáË H—²<F­ž°K¾YµÉ®8ܰ•Ë]Q/XY:û3ç/æuí‰Fùp†-L•$åño`s >ö:¹ùÿ„èÔ®í]Á9óË ù´Ž(õ“°BH œ.×ÕŒêQl&Ð1Q„ã#¤BNE÷\kœ‡˜…Áq!4ÜaSx jwcêcu~lEã¢Üµ\"cЊ[½ÃvÕ»V÷И³:^ÒeºH÷ù’¬k'M`*EÒq¢É›Ü»®3•«9–ÃI¶ßÑÉj #H©‰štŒÀt°©â…)åm¢c×A…4 ‹ÄaôU,ÕÖÆ6. · ¤"ãЍÆ<¸p €–«Ì㘎1„ePãù1Ž,[CÁèf³;Ûö‘X~|t,¶ Àj×Zb:¦r[TneH-…®f‹ÖèN;§Æ<1PS¡˜:¾¹æ:X…CdZ1"$BßݳÖpYydi¤“Qúã¢ól’€ÄRµÎÈ,Ò©ãèÖéÿ"=³3·†¦}L‘oµõ¥Šå´ úU ðt‰ùë§h;Ë9Æ/ Pìµ6$Ï0©å@ȼâQ8ÌëmƯíPakæ/[è÷ìø}J8ÄgÚÄ[’O§€+%Én9 ß×5g墓üê4ûKåœäç9 …Ø'kpË7oü*.ci Ã8+ó|ª¨!zc‡ŽäïëeGÿCùþìGÂDúuªÁ¦ì®ÎGÄë¸rÙ) OÔ†—SÔû§¿ÒÓ’Úêoðö!!î¥ Lšï ¯Ò/z à½ÈíVÝFÓ¹ ·ý­Ê·`ň}¨{ý§léÀ»vä¦g+·eä§%¢V¿ñþ»Y ÝðýóÑÇ÷n€?z¿ÊKJÓ…;L­íMLÞRrsêi‰¡(ìŒò–p9Bðìh&[$Ê$–Ì9±IR¦cɹ…G^V¼ïr¸ÃQWƒõ½áËŸ,"ź³qÏsÒO=[µV–ßy-ýü%Ž“ rWq’ÞrÆHÊžÕ7ﮜK;Tª{" Õ¤&UX_óìYX³¨bÍì²+C>Ejáÿ°EÅÌŸ¨UE9QÓ6IyhìœF‡1+”¬¡Pz|¦}kYb;oÚ•iF <ãUð: u]´ÓœzÊÏÏiϘbÕd¦^ã —·À/Iõܤ Þ˜¬c¦âóI]¿l`»ý\Ñ’Òwëi×ã€%´ Qì¿€|7*@pœ¢à縒wŸÏ:1O¢cäA;™ÏÃ-tà.O3¬Û¥›òM¯% 61>ãe¨¹TK¡¼6¥'yÒ`xB '¾ªf* Ô¿"üNXzÔ(õy°,Z”o»¿ÄfmÏù×C¼úŽÇ÷… È·ÿp¼:ÝwéSŠYK÷·(3›DŸ\80l¹Þ‰ ¼nYw“" –÷Z]²„_t~§ÌÑë>Œô×eDz>-aeƒmê@Ä=Ä\)]ý~Rù€S?¼Å3ÂÇ¡³¼ž-[WWéc¢»”Â`tÐuº¥â{{¯Rƒ€RÐ?âñxX Òâ§k:jõùÉù¥ß‰Œõc• œ : ”àPޤŠô<%‰GÑãñXŠÑÑÔÙ0ÖPãÌRöGÏ/m$}š«3AÌxµß±DÛÑ— žÏq{ i úÍC*6øJˆS‹¥ u>D ²¸¢[•îL’æ}ëiÛïì”ÞqRTÑ­!å[Iômú'¯¹Õ¤ãð7t6õvä ˜²ÅέëÓÏ €ŒÌ§U¦ŒDÇC † T®6Î?ãÙeòbà†þ혒‰â;³¢çävä´_tÔ Íœ(@¯lÄË¢b°-èï¼G`r«F “^ö2À¸Eòù­Ú>ߨŠ)"ò#”Ö… ʦ¼øÑíV9A^ÍO.`p¶×u[%îº18À$Y&V1ÔÓ´1—,ªdSšÖ IÍ€R–ÞåJ\ˆÐß»9¶Õ°Àª ’õÉ’ü2›ëƒ×íÝͰá”çDþ¿½g®îÑïyÕG˜)CKÁÿC.™º=Èšø°ø×ÕKôi–²é¨.™­Ád‚1™UmìGT›O0ùØ„©7ôÌÊ- À¢Á_ÂþÚ/"t„_ÏxÍ— ,Þ´ •Ï@†$qÀIóeR©ŒqéôÎÓâщ¿*òrQLJ íJGˆDËOBÈH !µã öa„Ð'šL¹K»Ì@&ˆN—|âý×ëйy À× >²3Á¹[Ö¿ Ììñï*;Ð!ýêyíY®‰ó5±OTê¹*’*ÕhîwlÊúµTÓ «Rc\ïߣϽ6‹#zÀóÉé»[ééf3ö’éñWÇ{Ѫ­Bèßz`ÏT° kS¬Ló±É¢»¶ã·H¯l¥ö–ùž|j]Ô‘×|y„%0Eò‰^û›bø±J%wÿ<@¡çŸ|œÞËx•5¾¥^²oÖ‡˜–ÿ€·(ñ=ù˜á±þàwŠÎ#1UoVN+|üŠ;ÃhVôg„X@?>G›¿€/ þLÀ)i† ï«aöümÿ¿rSÊß³žå’JÂú–»¹-uFq³4ŒØ h{Rü)¬ãÇ_vŠr‘,b D²Nl{Оð–Àb‚/‹žlúÒŠ©þb?èî™o4~Y;*í꬯àŸÏ&mÛ¶é¯bÄŠ«èõZRú°êÍ Æ‰ ·¼˜3+?zô6º/ ¿…vŒ‘›²¹a:±NÔ®·÷ÚüAgìu8¬_ÞÖ>↻°÷.Gý÷¢ çMWê£< /‹7cuªgàÉ èí‡xÄBãf×ö`|ouäç¿à#œ`ûQÀZëà mÖŠv_›$™Í-8tÈ• ˳~d"g‚ÔÂðž " Âçó)Žèùl·øQ¬.Fç€ì?WÞ¿mÅžÏçã±Æõy TÐ¥¼’ºzþyjq†¼nì>ˆ1éxïcܲ×%îò„+x”ºz¶™ã¸F‘]Íû!âñQÊAÛôàÕ£ÞÚÿž#dÍ£¥³T ç[åf¹G4i¨ÁÕËôC/¡þ_û-߉vÐú×7Í¿ÛÜZ)l9m­^ЇT¶Á⟿ X´-ÈènZGÚAŒ#cq¾½È”QºaR´Lj‡9ßNY¶-ÖÖ"˻ڊV–9ød4È€ü&Â,0 ³kÏÙ2H©“Þ¯(õZ@IE{ÊB„Î@1Daè–xiQäÏœõöÙ#Á{òô³Ãp°ËúDpXÈŸ›¹.bb‹¦Bÿ¦‘–ˆú6$7|±çܰ$‘ƒüƒ>khdFb䢥4§VÌ ¡¨eDœ”A›ãQ-:Í–ëú¹9—<±t¯7ý¬´ óK†Ô'»Ô’ï;ŠG&[Àâ̆ÇËyÏÅl|»™›(*Á©¾ ž·žÜEõÖæVjT-º»or:Š6ˆÀç7ñ‹-¨kÛÊ}#<$≞wpêBß$[FÍWMý¼Þ Zf½ýÞ??9L˜€F ¿IsKÉdgÔ÷ŽíCÎ5?ÌÙE±‰˜aW#b)9ÊåØcg³rLH{6o•ìA©¨…yŠáÁ®6&%|AÔ•'ŠMAµ1WçRpê½ ¯]‰!÷ærŸ¼kâ]«¤š£‰ÐÔ;I:^iÿgbã`8Ób»Y³¿÷œPn+‰9Žä†QRÔˆÜ?Ï”âØhÉA»î›ŸFÝ»‘|>û$€mËÐÂažVOÙ3Œ®™¥Ä²Æ±GÆX#Û•oVSà¡í0ðUõôdXN„ŽM òM›Èå§“0LáY*d2ƒU³ÄôM-âÖ§·Œ†`Ðvwêäš„QÀi~þHÚìf‹˜ M˜ë ²Äì^Ìûð89ögÅè¹ø¸vÚÛCzÀã Ï> ·Ò“ÌfØ-Jdš*¢C®Apå§ažÓ1Wì!&åÈ­Ô*C³¦o•çv.²å|¹GBÁO”0”¡féí„DD7¹ðJ´×=;´õÄaeÂ:¬áwºLsx^¾ÙF›ïl+Ú©®6“r?-фᚄQŠg,vÆ ¯”²Š|…czÔ)þP-ÆDs,Šú`J('‰†{^8"WñVJ;òÃDßÎH÷P6¨ñÏâX¼Û+×™ªÏÅÛsÞ›˜©}Øc¿8¸öÊ,B½82«f«NTŠPanñ:ÍÅ/^©EpWŒÇVlûïç=ŸBÇÎ'Ftæ ¼[¸c8‘“QBÿ¿‡˜ÿ¼9ªpg%«ŸÎ-ÈÞ­Èë Ày€²]+G¢ua_Cibd^T²Å{ß×?ÿ²%.“ÇÚ©æ7Å\ðNÖçÁ|ïð½Å‹Ê”¶˜á[q/Kac™mò7 d]¢ªÙ½@ù÷¢‚Ò%&ƒÖóvp˜‹ÿ„užöv]bj.~Ïö?ëíÆ¾q«ÉÑ{ ïsx[[*E ¢2IrÍá»vGPQ«m®:¼9,u†sü®S!é ɰëÏ N ò²oql‹'¿%{½¨O1$ Üç⌫G MÎPwø}s¾z §¹Ÿ8ê'×äÌA-팇Ǹ˜ØçÀ¥ƒaïîLú°Tå®o9u2yâ0à3-XÙ»}Üõ>8©¨’Gx*~œ–2µARÜ¡;ÌÊ¿7ØÁ¿%:ÿa¦³•9)D-hÐT3æîäP9óYL¢^»b\]¾+¯ &V·%jŽìJ@?œs±<¹…es)üÅ œDÌ|à¹ÔSæüÄ jÕtÓä€$ú/¤_\xE¢¶m!G·Wè}•q!ð<ß8HVê׎=ÿ² &c»Ì÷ªOf·‘)Px-k}Š÷.¡ ȳ4j’®hÈ‘m*ň^À‚¶=v ýû‹!±% ñܵ'ê© ¶c¸’F‰T[emR òdÜœÍSÅ$3»Ñ§ ÆkKäŒ:IœÚœ*àSºGÈÖ™»ð!3ªQP†!Æ¢tHËÛëêÿ4'¥Œ4'¡ÑN>Bß+é1[jï(1µ¶lÌìôT'Jü`Ø®Jþœ’" D›u¦­ñM@ƒò»÷w:¡ï¶­6ùH)m^Â4à ÑÑW-N¿)LŽP¾ ª"’VÕÏË£"¨ÑXŠÏeMUpÔc}0ŒÝÞªcIÍiàÂ#!ØDMÄD¥CâZ%]Q™έYbö+F2ÿá)ºxVsä$”'üHÒ3ò$74bSVÕmdn4¶0ˆA£À$Ã⟃Îæšà‰}ß‘¬ëd_|‹ÐºZ!D ï'ÅETŽMM[‹32Z¤i°ÚkÉ9^‘}OÁÚþ tšmϤ’ŒÕ›Vjç±$ò™b/Ø89[à“QôìÖù¥«‚J6e»eÔ|—]mŒ­?qÃ;TÙW±y\EëÚ-#¥EØ=¡ÓþRÚ•­0<ݶӋ:ΗªQÌ]ÃÃMÁ9qõl²Ç®qD“P§g¦R«ÇÍRõ1C=p„:+ÓÕ¼na5On“æ´9Àí‰Ð½é"#ðnW?sCA”Ý¨š€™³lßœ@„µ凭¡ö¬³J0Í;©³¹€Qb…Üëwæ%†îV*"ò‹±~W—ì@ ÿ|>ù™y<î¡­`ÄWgœÔð,¢R 8rÖ§¤Y ÇœÉPªõSðÏ¢®5Æs™@·›¼ƒ@¡Z•Îðâ(Œ0“ ÉÛ¬§€³§}WcT|Xä™õ |5jq߇+)WÒûóux¡Èųv!eT KE+ŒA+×¥¸îˆ¯£°AûÃT0SÐw j]Ù™™¯ªÐŽÏ¼¡_×áOázaÎ`¬9b[Ð¥U€}#; ‹ gX¢ý)§¸ö3^\kN’$põÀéóQiz Ýî¤,š(´Frv˜‘ ažë4¹²ÓŒ‰W”,Ö‹­¯±b/¸5ˆÚ>ˆ‚xÅ„CúA›×KÀÔ¼äæÑÒ’Ìâ3¹½2Šå㋊-¯|í®bhCá,?yòÐÖÏ.‚,^xþÜÏ^båàå°Ëý¯5¾´DißÃÜÊØue¦ €1#„3 X‰^iPºÔÜëxÖž^:t“È£Ù}¯hÏð ?4êeóT©¬z¾|j;xž] ƒêBà—‹YÃÇ¿¢Éº‘ ïêI^ÔS…¤¨ö± €â_õ×Vàfg+,}Á †›<^2qÐâ4K›È»‡Ö:«H‡|î#¢ªï; ¿—ß±ÄðôÔÇñá6EqŽ?!:Ÿ¥GmÔÓ±O#%“~‰б×o”Ú§s¨»q€glVTI³AŽ`…ƒ6^Ê;™ ¬ÌLgn|àBç_Á’¢¨hÁ_©1ò‚`Ú ’ú¾¾¯{LÞÇœ®»ÃjwjÜ5÷ox|¦¦ÜUê|µ·¾p†J}ÂÙsÊ?¼´s>ßÃógŽ £ýÕÎ`@Ìð‡üšÛöþi_ä$ºåþßm<úo<‹=)~}­ýí®Öc}®Ðç3Ë·ˆÏÐ…ð²ùgv ˆÑO›C8{§JÒ|,Ä5ç£_¼0$ù\a5Õù€ùƒÉûñx$|£Ï\´Ã۽̈́§¿®qyf‰î=íÊ\þ„ÿŒèüç¾f ª§c0«‚ÂZÿXŒÑÌ]S_Õ8bŽÏ`æÙ¦ùŸãP7¢‘ D–sÐ!ìvgëB [Q/÷q’ÔóùdÂÙ*93¦úW•öÿ©Á­¬³úIöóÈ;¾§‘n.£tTE´f ¦Û±’»¹q%I2èˆT,õ)—][4ošs‡™1Cî€X46Û54€†š6m’Œ†_aëË÷d­ç¦šÌ»)ñ1¥oçfȪÀ6‘u.²c]ôF g«ùú\b«?ÑXÎ$âND˜—,Ls± •ÉÆ1tW ¨HêîZ?ÞE¥ú‡Ø-V•ý z¡I>W`oËê$05¨Űæ8駦.ƒúê¡x7Vk·ÝK+lªNp ]m€)ƒ ½k -]™TKäé݉~ ÙÕ”(Jé/Ûà.)÷LÜìH†Q«É Š‚¹Ž\ R]~lÂ>œŒ Wš'®“3t™ ¡þz‹Ö"c 7ÓÙj(K&&ïv8òQ‹¦6Â+ÿXÿJú§ðý­™kÐö+rIÅx€VfôU𢠄¢ª˜YhšÛÇŸÐESR [Ò—<ƒÒ©(=*0‰’øÖÿ®&ˆ µ•5˜N½^ŠŠa½QúXÈÚ4ŽšÍdÃò(Ô³ Cvþ­õªLÑ,ðÎð :c£ø×·âi{Ðйñ½š~ˆ‘8±IÑTL#Úפuì§8fÀrçóÉŽ©PóV¦j·[Éǃ ‹¨˜d*™•ÃXVâµ’k»³nìár£+¹sŪç¢|®¸J. ,}åkžy¿¤öεà*¹ö4Å(ººt¦ŠqÊÎH1¹LÝ4ƒt" ¿ó—§Hkiòë®UL$ ì)†}itªÅ3¸._…Þ®»M'ÄU^ÃÁdZMÚ‡tÞ¹_P"¥±¼?ɵ .Ì™ô PR~ÕæzŽ]2!{,pÌ"bù5Qô <]¯=I! àyÞµº:È11 ~ä¸]à ;ÈÉ2¿E+ í —ƒ|Ÿy# J†*ì°ˆý§žŠÉß´ëuáv\¢ÄÇ Àj’^çM‰‡©z¦SË€@‘³øä•ªF‘ƒÏµ¨Ðâ.,:Ó#®Õô+6?ëX²‡… B—ç·†‹<¯K@m5µ" )QHðµŒpiñ³FBÂÔm©û¾§C\òÏ 0ÜOÛ§F»`J»]£Ò¼]¸áÓ2pÑ•aS7dW9(IJáAöÀ g”b Ý{´¾Ìm…§Ûɬ¼¼qˆ¸‹ 5t:6ÔáÃw.–ôz>¡—,ƒAØ‘'5œÌÍ?(»²©ÑcC¡™Í¢ wƈ§:d,/DmöýlÿÐahrÕÌ'õÀIJ¬tqˆQ1r÷­çŠÞØJÔ¨–ÀîUÀÔë§¡@YT%íSatWUg§ú¼‹§ðHeÉ­ÄÉáÀû/°=@óS„ƒÀ­|´¯ß¢eñh5ƒ;Ú.½ÕëF£ÞOlÕ†–Xž?K.Ùž’·‰Û]¿D$ÆÚ¡Êÿ휛½ñ ÜÿÀºø ÜÉ„¢žÑéN3¶.†^Ê'JbïŠ:Êy7z¥mFŽvÌI±#Ò^+›èò'Œ–&à)ø¤S>ê°#ȉNû#Üš¿K¹µë{€«ÛaX“k²ŒBZ 0µï•!’½ÊOH2$ybYZ×<ß#jrý§Dód•°øL¢šžDÖ†¼*`¾çŽd[d úd:AŒDÝÍ© Ká Þø2²ºá—É᧸}:#AÚ¡§¼iÅ]EÏRv¶[cZ8­uÔ} ˜.;}ü¨Q¯œpÉ»ìî’×Z(¯í|ö±#oF¸üSÙ¿*m–þºZ*ëhPGîÃ~X¸€Ä´ ¥Aˬ=H®Ø x^Ò¿QèM²-ˆ ÃÁ9¶½ËÞ ¾§y«º\Š1WˆQÆ—gÈ»Z2SwK»zÞù¹Móî’hJa@Eñà3©7Uܺá¿KÃVp ³ç,ÍÈMz‘¨~ø gžÁ˜CLòqÛN(¹ø¥uÕÇwôêk¨ÈÑ(Ò K‰E‡ZÄ øAP¹(&c3£|ƒØ–2;Ùùäѳ)¿C>QÝžÝ*ÍÎ'´‰ð¯Ýf¥I½—ð"ÉyWp&Læ1J¤=è!^ó³è$Ÿ€]cªYZ¼&­É`ÆŽáùÜ”òðÒQ1«Û%ûü.(j‰8å¾2ź6 õ šùÔ-Ê[Lm×Ì?¡[0Œ›|y†Ã$ãœEqÔ™ZqŸ&Š_6.H§debe(Çëû›E牴;F/§‚™>Ä%¡)ñï¼9éb‡àä™ù/HCÊ-EúÐQLþÀHèhù‹²%køè^"R ÷hnÞý;"™ÄDå|\ÌB8 9Y/#ÊàktÈk`÷¨[j*¿)Øa3ðœÕë2wšf±ÒºÿKÌt’DU8ñ2Î<\Ã=¬ðÌ’ "Q1þ„?ZWÌWnØáÐ ûB8z”fA˜ãc\ã)zà£_ÆÈmŸš4e‡åNÚѪ롳™¢±L3G‹4G ŒMηvõxnÈ_ ‡ƒäŒ†|}à³kGµæ Ôo”Ç4E_ª LHïònVY­Lè!pÿáúr·«nœâA²,RÇ¡—^»Zz‡&U {hZ÷âm‰ ƒ›TM.âq‡ƒí¦ Kˆ¿BÃT7éwâe "Ê”NP•Öº ¼ó÷»¼PC±G!¼4€må÷i8 Vî¦y>%Ó‚qಠkev´õ­ö˜¨Ä0²–ÃÙb·žÔÀfý èø°Z¶úâèÔ\èÙS,$Dz?´ 1— â"x(ÃÛ¸ :<"—ÅlÈÈ¡qÕ~1>ßì)qE~FÛˆr¢ÕÇ$®S^€1Ft£¡ás “í–ÚˆS;Xò‹_ ÜBϧ#W„œ¢A¹z C§¤LR\.¥d ÌO ¬2ëáf’QzxWUq*ªÖ¼fÄ„骭ü^ÈÃ)ÄÉÌ6atÂoÁ2µñóHV׎ÆýAÑŒIÐdƒ*ÂMî©Z÷Çx’¿…HÖ’õ3&·CW;´×\e(@:Á8& ËãÓÁÙ¦>´çÑ£eguüE/ºWÄ Óç3¥0¨Á2¬„oZ«á‡}gZ[Ì®ª²X—&É$´ž#t¤ºY!âÆëý9@³Ù­ªmn¥Èá´¾Qa•*u¾ÄˆUÆãá{ùXGvDaR¾ú»2¼¼ÌO ÃFW§‘Áçt!3â87Ýå4E FpMÁ–^þ¼è¼W˨T*3½•ÿ³!ÍuÓÒKfÈ_õ†¶pWœ¯zåӮTŸ¾¤ÿÕ<0¸bªãÙO™öÍ… €Ó7v­_ï¢ÙPKñÁßàN&ó'ÇLÇÖséi/47êWªxˆ^`Ý{ß]ê«tñ#ñлUAÊ„*†ö……Â¥ÿô:!ó‰_a¦ìè!‚[£‚Ë$b®ZÝ ÊLŒ¾¡Ñ']þi¬¡6³M\|Añiqòµ7ô½ßå¶}Ä¥cªœ l{2ëGâîXZFDo³O«\ÛÓ {»±A6H?ÀßÒ™²èèÀ&q qw¡úF5ŽeÀS÷o™ªNÅDûººDëõ+Yõ ùšdq^† w œP–¾~ÈK)›l>sb3QF•x°/"ÏÕCQ Û¹`Ûô®“¨µ¹rÑÜB1º=Z⾓¨½7•ŀߜº>•Q/´<^®tWC5Wƒ× ¬ir&‰÷ŽÆV0š²¨%„¨8Ø’¢Ýo¾“ ÚSÁ°G’¤ªX‡D3$i˜ê¿n…•`¥Ï}öYÊé´>€S¸¦=vzR PbÜ«m*/Kò'x!&“W>‚Y˜÷‘w¡;Y·ÃJv§£5ò£í1º5®Vä¤ÜXÅ!q[€èù|B“[¾YÓ.¹¤ž“¤}¢°>EÚ»Œf—~ž›B¬Ý*$6}P¦r)Y¸3<Ø›:\™}"Všœ‰Òœ–¤·Û½é˜öëÖ~,\í£)k €4š 1ìW†`Ì>Ž‡Ñ ¼ž£BÃx°ÄÞ j#Ä+4bœ~®]Kµ.ô*B0dü*w&Ë—îx£ BŽ!;¶QºÒœŠ-8r£¦ }pŒn$Í{߉¤¯YÑœp|¡š JJ¶UXiL­ã𡥯B dS@Ý8¼Ö~ÅDTô‹›SÀQ&ªzòOˆåm… ›™+A¿„24î0€ëó˱åõÜÓ´}OHsÐÝ[íÜOƒ sþ™ t!ÔV6ácLyßÏgÆŒ7¦9‘䅵奻ŶÔÈRÙ'<ù´èu—û–ïb”‘‹Þó2\>TÛn rÕD•.Ôâæ¿ëÊ~’LŠI‡s艒ªôs­. Q²Stž?±;ãÚ•ìã÷˜³¿"6=xî^˾€&S„”B8CóÓ€T”<Œ¤óñÔd×÷븑¡†—°¢™ `7}pBÈ/—"p)±4° ^8à ¥õ°@üÜ9’b©aé´”@ Ù‚6ä_ÖÑEØiÓ`ÌçïCðà?ª¨7HuœÍ»œû—.Lÿ «ÉÂÊd¯ Yߢy¾LÂÃÅ"ìQ6îò›VqÃp«ÁŠÉ„.Ô[‹l€£çÁís [ÙV̆2nŒ%1ßn D)oÁ±ø÷*zJcJ'h—«N¸ÛeåßrKmâß,Ù¡!¦è Å5«¨$øÛ³MÔ™©ñ×É™ÎáåÎ¥$)Ž”cì(Þ¡—(”WS…Év‚¼OçAh7ež›eYç$÷B»*“[A‘@2^RÝå!i$¿ ºàÚà1P@œ[Ílå%] „sÌ>A‰N€®ÐŒ½é’´¶à¬^ä*ïGx1ç7¹XÕñ±y‹)182b3[ ×CˆGÿŠŒêÀ*F*jj ÃJñ‚b#«¬1Õ)ÀI uqE‰m‰SÁFÚè,å_P^šÈékÑuk8¡ÍÉ ˜8Ûú(5ÒYVêmšçX¡¯ác‘õ­“x ¢sñ;]`ê=™£ wóö95Þ‚,Óè|àÓ}è~…<@óžb†é>Gÿ§{TWª=’'7Iíð.èF7”˜½¾ò­3b2o±Üy+?©‰yð‰¤g4N¯'\ Cøâ¨DÁrRœNï¹$”SgR C•Òf¢²â.f×±A ½.l¯yª§Ñ¾‰É‹®‹ƒä¹ü0L3å•*‘˜Æ× yg3//;p·l£G|Ö\“Œ×yI,«‡5/³Á{Èp &íÚÆiÉ„ÿ¹íc˳Ú"V¨ÎšüuìÓw̧<ÜòŠŒ ‘¼ ÆNð@Tö[Âáå_û>ôë«AðdGRЇæáx[cðLÆ4h‹ŒMaã7F>ð7EçKx€öMÉ!ÿÊOª745Fò!«W2`Ž `:jó™P%›ÉŽý.üÜ—¿hÜMÃéÉðZ™a*:“Ü8€T <ž;þóÓW^¡h^ã’ZÅ£gÎ̃QTi¯SªJ±ðêSû/·¶ü9Ow`aóYwÛ+¥%OWoVÂ(¬&ÊY³tàرqfv¸D=V¹à Zþù–iágÕìù €…V£#¶kGÏ I_{g±´÷¿Êò^rõÏ<.À"½‘°~Íý©qóø“j €skù«Öï?-L›~²Þ±ù‘Ð¥Y×;¸èÉ+6€è_•  úå¶¢R9 ´\AÙïNwý÷î”;¤xQ‹Ü_)•„vê˽×meTâºÖú1ÎÄ!h¼Öæ›àò‚Ukèc/£[æ¿c¬‹ ªºlÏ7æõí)ÂE4!#/ë®, ÝcvþMÑù<÷wc¹_·0aY´öVûô¸Ÿ…=±ÁPÀµ¹B¨õja ‚•)xeLÊe% =¶Ëžàô‚mué²z$Ê!€C’ÆÊF˜˜Û…1iýØ‘åœU›$-À3v7¬JÀ©šR½n??⊺Ì\‘ì,+r‹ hÓð&cåÖžÇYèfôÅ[Ž›ò¤äeIÚ:9¾?\àqoa°4¶|\ÚÙÔÂÿšQ~[:eÉÒ1Nâȶc³»ƒw`y¼AœxÔ•!ÎWÒáÃ|¥³m3 î ”»ï*'–Là g¬Ý í.»Û¾¸ ΀½ck2—ùåòäç!‡¡×úº/žY«Xo-`]]ÀúUš¸qõÙ–VŠ{ Ûr˜\àþªLõ|¶ˆ×G ÊäY›LžŒ6\}EåÕ‘Ïeb,»tò³G‹Š#É‘€+…"§²øy#12Šo¥t1tJ}û€X¿{IQ9U~;ãuåÙC'Ð2G.ºæ¯¡¼T€{Ö¢)µ‹hláŽ0&Yï·­íæ¡xcyÀå«Uæ“u§}Sp…M­Ó]Fg†5F¹¼iÿ×¼7ÈLÅ¥Çó BOͧ¼MʽÇb~üÌVü}Ñù+|ÜKK˜xåûtk½K_!×K—Û±ÝÐëMßÅOD?î¹'Õ+UñCgjZøð’° Fu?„FÏu~,,ãö+_A!à o¬ÃMôbüŸ–’ÁöÀ=%&½ð„„$rfNoëlè®;³ýë6æ9 ȸ¾5ç?‘Êåvq„^éRŒN¦TABH”ÆL#nàpÿÔýÛH âBNB.¹V#·:ä›nËévf€6[zZd]­=PË!ûô{u±ªðÓÎîZe® ‰Ï^“¤\C ÈvÝtM÷”Y‰’Ô”)Æö@æ‚¶ù)Kµ}Ánta#œ$€vÖãóIưh4J °öM"B H6༎0Å:ÏŸßÒ‚eü¡wìOÜe€ŒÌ AžÚLjT¶‰àñÀp×ê¦oéô³ ¨Ÿ‰*jË¥˜÷†þž;ÙÍ‚àDÅF LÙ¤½ÏéŒN1oBHª:ø4Š(`fyw9޹mû°WmåË´«Â!°ã¯îÜ®¥ØÔù…6Ôáÿ®uEꉆãÄÙ‚Ê"^;¹U)bGåzˆ¯5°yà‘"ËVΩ+bÜœ;M3¼#p¤t/g=nk‰M^Âïÿ+óó´“ÑœÕL·¨"Äɺ ¬*O C5 ¾Ññ:5ËåÓyë}Øcaw+$Ø~±jEòodD©±z¼×°’°‰,¬òŸJÖ¡R&9†·BAÇv½:e4>áÑœì熂¨ÚôÌ«Úap%K/<B7àŠçÄi…#ŒN1¤îN2ƒxB@¸DÄD H,ÑÈ­ebFN{ŠéVŸ¤9I·“MÓD踫 oŠ”m­Þ TëJT"w#!Ø1=5yüÀR ñ]Ú?LÖŠ N2üoM ¹9² ¨Ô]vKˆ^lǃ!rÚÿuÑ÷±P4&x‡>pÆØHò%©·5¡Ó’s”¨VÄ~{îŠÝǘ‡óZ“JŽúãšûÔàÿ°„Õ£*Nä=Qšm"ïI“TIœ|<¯Q$è2‹}#xY¯k¬˜RA¤‹Ä‹¶¨§WA|úgEçÝ€ùL½M­ÿPá»§¶0¨V,ÇVtWs‰s•Ȥ9ó'Çxç#2=IDó2NìE”Üeš×ÔÔèÜT£L´xj EÜÐ…¡qoæ)bÚN >`”O4&‹Eõ«ìN–ñÏ0ŽÅL@ð·0îzÛÓ—us¬¶åÏu‚PiA.Ù<àUcdîZÌ0ë#Zðýj|4ÓÚž@—ÃLÉ艶ãùëyhªjáôÿe:ë“ÏGá†tyü-9»þ²Uƒ†{- Ð&Ç»3˜ fy¹EËšWUúv*OyòþøÆ=·ô·(¾g :¡èf?{ð¨¬vÕÅ1Ãe j?_s?`Ø §Ç~L]†ž寢W‹Ø'lòøÝíO*œ”릋¯[x.Rß“oO¤±¿#£Íúu‚NG“Ô*LèvF Ó˸ÏâNCüAÁÄé~Èå˜.ÿéôÄäCàÿ’oºÖÍUøþ¿ã…;å4aªL9‘Põyjù¥0Ü;ú5_M‘Ò¢H©´øáG¨z#ò¨9p¢^òUeÀLoúŒ-z ¨ÔRŒ»pŒÖ{ÝÒf²w¡‹:¤#6ÁÈ (x!`„°P+Ÿ¦•¨ù©@Îz¹8«¸ôÚºrÞ0€ÓßÇ[AþñD±Ú¡8ßËÕÉãÆ·[Ÿ–ŒHý‘Mjr{‰lz¡¶¹óÎÿ”è|â7Ý)PîÍE¹Å¡%Ï7W¶á‹¯•I5²‘”¼t2[Õ T6uê J$¿»j‚™ÜLvÊÊÖ‘Ž.îg=8X…RYäoιâWH=v­û8½Å!dãLp[6TK èÌÀ]8L÷½Üçy¦± ïíóÔþ)EYÁ®²Ó”)H‘ê9¡¿åžÏ'>NèÚZŒ¼YUýÃx–EœÀÙ—vTDpÈóØ-`¢,=蟟–F·è©-R“ÿ7*€NôÐún*™x;Ú-†»\WÍ-’Ȫæ1ðÐŒQˆNŽK,bÁÕw©½%ê›ãÆÇ…Ò=3œTºsÆsÚe¼†ÈÃåµv&7J¢½Hr–ç˜`ãûnn¦ñìÛI¡ÑJϾXU©\åžà; ZœƒÎØè¬š$ДIÚ6zQ æp…wâoRo„¤[‰ýahýtÓ+ó("acžÚª`U8òž##þœÂÝê$ýZ6qÉ»ùZ@Õùl>kMÆóJ ÆÎ–­­Ý  ШA”šÂ^`+ØR¯Ç×MZ7‘“â)—Ô6^¸ßGŸgDiŠõ<Òá“nÝúß*º^À¬*aŪXDìSÔøfØÑ7I«MJPËEТ1›j+]åŸ)D%A•"¶+ ÒlA8÷{„¬Ñ9QJDYº´« ó±SLv#JŽ<ŽÕVr»Ä”&Ã%Œ¹5ï Îíx³ÇcÎDãÁ“[fTÂ0©Ç `g"EÉŸ@(Id~e0ÙµPe$SUš$]&ºƒ­oP¢ÀÄÀ¯¸/IļÀËò½pÒÌJðêÀð`“ˆúp¬ÊDO8\¦÷"»ø7È‘ž#b|ôIËÔú€Ûèf±š ÞëY6F M†$9%È$)äv׋ ¼@¹4Äö—B·¼²v}¹¼>Qq9ÿ´è|\¹pf%þ ý8Ò~늒µäeˆ¤°T½Píò bgyá´b/,íÀ¥FÊ@l´xtpZ»AE#6KJÂÙáw‹¼@uk[)À?éá,{ ç“áù¤NóTé}>S‡Hzö«Jy €Šò¿ž€EÛÔ*-Ì)±¶` úéN…ÕMSûÛnÓÜÐgÝ‘1¼µ(’¼å…jx€us,o•Nãäg4 (ÐÉF{ßèD©ðÎÇ&’Mía½žTBÑÈ©"’È-Û 7sZ²›’3*+3.µ½ˆðxøø‚Ç€º㜩{^¤bæÚ¬ô#¨(œa”~bÏgƇ¦ØÛÒ†VOŸ¨ñ$âVZª#V;Ì‚VÔ\Æ]¸ó™Â/HÀl‚Ú)Çà¢KÙÈ•Ï3‘?­gJ©ÜòWN|&‹y¯ sÔ7œEIܤPtÀö^ºõgÞŒ¢7ŒTh>Ÿpfv÷%DØ“»_œð9 €J‚S© ð/+ŸèÌr¨äA9Ì!ªÝK!B6Á²ÃPág–Âåµ4g¾hÓ†£.A5_G € Ò2â¢ɲK)””d’ö¨¶Ÿ¼ZÕ®Àaðc±ÂcÙ<±¾Ð…TTèÚaO›2j7\몑kCPƒïèAm °rþ˜Çô_Ì­t¡ËvÀ`üUZä…¯Ÿcþ <‡sñÐ,yõc¡õûó;6–rUdõþœÕhX•yýÀ¥|íUwçœmó¹ðj(Õ¿Bîÿ¦Ì^kÂØøã.†åÕ Ñ-ªA×ä|Îus8(™žs¦yüØ&¢&c]¿U×^ÝÓîø³Ìøç`¥TšQ¤™f²ª³ÃiPŽ7éåÜå2? #-‹ô¡×ÁN½û«¯£S(=Ä ¿ÆíS®ÞµÚw÷m®SÿË×ü|~Ä –J‹NhïW@hбàB/¶EP_øÓß}U E7}“¶kx@w% ,lÆ•¡ÏÕ·8Š^^´¼å¼Fìyõ`£ 5U<2¯îF¨Jt~5â}ÁG»§º²)a#Ëä>g]Ý*[¡¹?¶§±¶ôc?ÕQt2¥D×·ÁÿÆ(ñص "¡ˆ ”ìak4ï:6°‹!±°¥ õ%(Ä+ÅiKê1Ñ:¤èi›O9 '¶ˆ‚QëÖ ÑÁ©¡vi5æ9t‚fO±ët¦^_k4›Àÿ‘HŽ`؈è«Ì"Oã`ݰ2Ÿ¢&Ùc¤|ã={O^b¶ÜwŽè2ª;Ò-*<ŸÏöBïN½¹bÇ\*/Pò¥6º ÿ¬FÉB&¨²ýnçLt®!*X«2 ûèþ>”ä ]“‹ï»ú-‰£â›³á Vþ•çô‘i;­«hü“@°ÞÁD¬ÃcvQ®‰Â“¼g7‡´óÅ‘†høÜ†QúÜ…ZLG#ߌÿòoVÈCÒnáɉ ÃÁ®Ì jà¶;^Âs;»4ŒC“‡€>¯Ío§f* –ˆ-x ÈjÉRtµ>Í`¯õ°£[Pz b1C’µtÊŒ©Ã;¤Á¡Ðò9ô£&IŽÑ¦ð¢ N@JV59MIƦ,†|ùˆ½O<ôžuƒ¼Àè#ÒNßö¼kw(ºÏ˜›oÜÛñ;æÓã qÝÀÓ˜Tb&#‘ŠU"}aÂ3MÝÀB=@;ôO+äÊ·@Â#Ìî,\šGœKTIÍF4vÓbu"©“|mSH£ Ì!È¢P8xUX%ˆ)ƒ¼h†gWÛÏ£Eã¡ W_‰¾ìµˆR*\¹¹ø=µkÿ¬[éÝ3E³Ý½SµÃšàÞ8·f߃ñ3㕚›œœQ‘dÙ•þú4Çñ”B5m„äÞAHœ‰6Q"º¥oÓîJwr£¬ó3~œ’pEUdÂ"î¿Ê%Þ¡“B—ò.\=Vœßv#Kõr2AÄtÛÓ@!xôÂ¥e=Cmm‹j›Ï®¼$™Kuå ›µ'±B %Ü¢„”K•*KÊÌöäiÏkHg%Š{­nä–)bI~P³5æ3¡r5‹¶_dMÉ5i°Jáš'’‡8ÁÅ}vÿÈpR†ßÜî;1s(GHç‹¶&áDžÅ/¶F›õ¡öÚË2KH<Ï¡9 _Aˆ…ñ×YtÇÄ#’3·¬¼wç+ º’1‚—ƒc]-Ø"o#ƒp]9¬êÍ=èºQåͶXÞ%RãL_T‘z )°i©n>¤^¹ðyY¢î¶âNerì…Ý导Xª¾y~?SlFDPÆ[a¡ÎY£@bô–ŽÍ±™À'Ï€ sþäø <3EùFï¡9|UšàûºÒœ‘6ÿ , ¬3æ’úwöôEC2*Ã\á…äÚ¨Ðo¡V”(ˆvÇÙñ˜p~Ä…]ÙIØÕ ¡‹’MHèÌÜ+ 5¦{¥—m…k~E-€‚9ÀÞÃSšy5e6–?3 •ÒªÜhuפèäx¤!3Á¥÷£h:ÕDц yÂ97;WÛ«à´QŠ•°†iŠ‚G…Lgoý/ˆÎ/ÍÏPÂÚ­&IßWôúù.Á÷õ}]‘ßñÃkˆQß×÷õú×'êÇãá^䯢à÷åœWI0z>Ÿã ý÷= ø=Hß×ñ×óIOD|>ŸÏçs3Sß×÷õ}}_žkº@èòGúê2_KÙ´=ÌñOƒe\ò žkÿí+ÅyiB£õ €|_çý£œ ­òŠi–$• t± —Åuoý¢c”÷c±ÖùCütyÛN­¯´Ìú_üæÈ™º×¾¯w÷ôI¶å­)|9‡(4¹ø4Á$á­ƒœÎ¤ªô­“®ÏûE—jrˆgç–—£ɧé‚lt›3%ºÀ@¤3Q?VÄ`ö“«ÚåNsm«™¾_—o¡öIH$q'HÉŽ“ŽÏž™é´cK‰KUèš?§n Õ!w1™Àךëtl R«!LŸÚAd”3Äù§RÀ@ÔRŒR‰Â1¥ŒEÒ©€’Ç?47Ì”2Èš«:\–h¬H%â1Vkû¢À¢dÙaVlE{íW]|(Ž:*ŽÒ˜ýýÐ4ÁÅʧ‰rÖ`ý2™!„bœª9"–àúâ2™†8:ùÐþPˆæ ¡C0æ>‹^h-ÌXJžuÎZîï­ˆç2+ÔªUØðûm¸êŽ~ò<ÏX¿µ[C»]“ÝÏbÁÕÃ..‚gFò˜$ÁQÖE¨±Dté€NrQ܈Bˆ y.˜ÙäR¯q(: çÄE„1—cu­¹ðvhf!ÕÌ]â©=;mµëã¸ÃMW#="•)"pó6Y{ R+dãîW¤:nàÂTu྾Ÿ–ÿ¢Š<šÉã@©Òa†žÙ]Žp(q9¿R’¾BYGàòrð*`DŒã4:Ò9첄Fß¿&:_˜êdµ­6D’Pm°Š£î@%žhõ0Ç[dÎMÇ]©^Yˆwn@¤Ù‰¬qâgy5ä {ƒ0KÕ• ýùy6hrŽ©'àCGº,Z‰F¼W\ð1Ï>ú4×dYo‡œ)™°¢Û£»f¼°22Í$õ©Ýè!Ö š wÜ•±{{`Ygþ†@yÏ^Oøßí×Ãá[â6Ig%µú²³7Ïq.‰Ã@9>á’¢gmíXÄ,*Fb›x§£Y.d[vUa<ÃFDÎfåÔØ ‰@|;Y·pü_›†Ó¿¶ ÙºmJ¶ S&aïÊØ„BÄèƒ>Å,˦ÒrKÎã³ó¢œUD;t §=¦—÷ØEˆ?ºeoÖ ‡FiYH¸Ñϼ¹ð?³nÝ—žC©}Ùfw‹Ø©w‚ ÒpGD¨ˆÚ¯]ÂPÁõF—’䓵T‚êùí¢ósPwõ˜eÑ„FÍÿÊmq2Úôjœ°ášrú§½þ$€Þó­„ð'NõúåÖ'”Þ;¼ýù¤ÇãuOy¿§ìïõo¼fÍ’è¥ÅÿËÐ\Õ«ý{½á™|¨¡k±$1埑9? øöUªz­­@ÏÞ×ð÷ºÛ|"âãñPÝ»Ïç©ôj±ÁàäLEö'è"þEkkOöÏÿ~ÒÞý†þ{÷Øgnð9wk‚·ÿž©C¬à©$€6²ûèC:Z*â½Þ¿Ò?´æöÿüØõGrŸQŠz„jd…2üá(ÇñúÒû36$ªv—ŒxeÛZÔ¾ä"tFÓ$!VÆK:üÔwµ“nM†"M|˜´Ò.©MwÚ Ñ¦É7çj<ã–ÙE{jÜ™ÕIy|@O+Q÷•"Éip[zëë ðÇèi-Tóä‚“£¸§ yçõ‹³ntn©ßã³X>lÏÝwÅÐn¿deëö“>Mj ]e$Ubæ êÍkxs äw”ÛÃ¥Ó-Ãb^O”u¹ ÒçF ]ˆ­µBTr _‘zj™ÅªÛÂ&AðCÛ !z%|W3p…p"ÕÏòhj{öù@ ‘¥Ñ©ñ¤Î–³U%3Ðõx„`BH@éL‰r3;I#×)²KÖé›Þâ¿ý»ÙòªÃ7L÷7d¯§aíR8zå(Z’"—#“œà –€´T­;ïŽãÙà àËGàϤtNM“Jl0Õô3Êp‘"g­žiÄ@5b:Ê)¦J:ÙPÀ’MLvæÐ`›—_á,-²ÿðEð`"E²´`ãþQ?K‘Ãðåtëã( _1õÆušÆ®chòÇ…៺’€É‹öÃÙ ̽ÕV(3w¦DO%)5UFŽÆfÀ›È«”jöí1Ï›‘w÷|YUN.¦UatèÐqíhW(w$·„“_(ùÂXZ”?$Ë Ÿ2ù’ZÅ]ƒ$#šr­rIyq¹5]‡FŒ¥‚^¼‚Ò.¸›'ºÂΧUìÙl{p5œþà-ðú(úÞ7$”wAÍ(íDøõ¢óµiR¬sÚ•@ÐFý ‡ŒrpŸc×Èc®cÓ(oDj$;zȤ˜=Kb<’elH}(b’¿3KËIÄœ€(-%Þ(!xú}š#'µ•e@Eé@φ¦G]zžù-lúGÐ$‹ß9ê3’ÚáÎéjyì6O…lMe‹HÍÒ²QŒãc¦bråÃ"a´ø:§B°[OÕOx Kì6œ A8—GJÝj 0Å“÷臿’=ç8A´§q •€^IFº$}b’*)Èè iFg2úmˆkyù§{šåJTÅQ/+@%DT2 IVâZ{×–îîú¾˜6*XÁ¤(·„ªnQ˜¢MøJŸ€ž#ü†C³V_ó±UY)E?Ü® ÕÁ%0 $ãÝZ¸”Ô÷Ï1ËéüãùHDAÆ(u‘Þ~~Žýoš<%‹f ËÓmiˆõhœÖ”JLé• * &³=$ö)¦³¬ÒI £DQ 6åHRA7èKe?¤h˜Ma?×ãA2{=GVX °jÁO6¨†âKmŒCo™”Ý:) › Ä¡XÒñL´˜²z4MÉòm»€Ø! ëHí÷ÍÜ/ stXÈ“º *£&A¡úRETfP$òÈSq¯Uô¾V+ɧu®¥Ï%¹ùE’…fPeöLe¹^‰±çDYß'¶¸š&¹2EÓØ /%®д«4h¡À¿~Ê©‡nVš&td¦ªèòmšVòR-wvW¤*ÃÞ\Êx`m›Ù€‡ÜåÚU7­\j’æóay%ˤ‘Š&Z€Öl®N ©yÝùžy2õ·é-¡˜ ì%¿WiÇú¾HΫ< -J»¤˜ ¬áïÙù¢™î4‹½v¿žö¹Yd݃x9—Eq ºòŸ&ƒ4bÇFíªcÓ$Ø$e Ò¾:££69ý挽Î:ŽjÎNÔêx¶z-6²ðáR{'Hnjså¶åšîCE‰nà›©Ë­¨®S©/IQ‘!6äL,ÐúЬµ½2„ÞŸ]é’ ²³Á/ñrý–‚PQ¥ZRs *’Û“ðÚØï²ÿí©H`AÔ÷:¾Ççç>4ŸIsÄ‚äÎØ|Ý[éÝâð|U ü¨ÝÊyï¥gë?-{¬ŽÞö*L ©§ò¸ûûkµô(¨ŽØªHNEº¸Ÿ?)ÀGã'úcf®ì¾|áÅ‹'rbëboÙÊŸ;záæ¥¾·YîòÆ6(‚YKoríìË'ef'~µÑ­Gç5q…# ÿ¥$Ÿ™Ç¨ÆK¾=ÄV¨t­9l~¢‹¿õ˜ç8þ> Åæ"àü…ø§*㤚Êg-¯ÒòD—*`Êæù®ÒC[¾#}3¼Ì¤ÌïÙ–¿æœ6Ázx»¤…CâýÑKj Bøí—QŸ-¢d÷õ¤çðß×dµ6¡ËÙÊÛF7¦€>ahÄU(N᜚)i5+>Ö …€(Z̼ï|#˜ÉÙ9Q@+v‡,‹2¿Â5ŒÈq _^D™wƒqY€JõÕä I)BjxÑU9š8žôór´Ií\‡QðÊ›ZÂSŒ¡tª„œÝV‰Èi 6´RGJ±Îíˆd<à‹¢‰zR½t: tZr€?wo1‘/µÔ“ÐYI’›+Y*_A‹K‰žßMÉ“ MÔí¿•É:_nºDu'ˆ]Ûj7èÇídË™°¬È‚WR‚쩘ʵ‡+‰\YßÉä{ÜCë6#ß- Gêµo!ï ’th(4“1Mg/Õ*Z‚ª% 4äkõº%Êëû*Zz[È à@¶·é~oê4ÇŽ6µi¦ÏUuV¿]"7J÷ÆÊX8»¾üAÍTŠÙí…Å îîÃÑëd÷¤¥—î&½ î²¾f–¬ÚŠ"‰¡8‰µÚ,Ÿ\ EAÅW7=da7ô5t° ©ƒ¸†Ïãt Ö&†@ ѳ}-Ìu°™N¯‰ 0mKE¹­½&#â¼…·,i”Û>åí§Ü½îDÄ)úÉâ8nغ˜` IŸbÈ{ %tý˜Æ·À… ¦ »Ñ°ùŠÎ×m¾‹ûqË~‹I<Õ}Y¢DÆçqiž.žc}ÚUm[Šk ÝþY˲»ù·ÊBjCÃ`¼Ò—š˜;Eâ’ö®¹_œžˆÖùEî“§$„lNå|i7œèPž9çYyeí°ûÉ釧7dˆ½ ½›-G¨aÄFñmÎ)å:|¹ ñ¶ƒPÒ1Ž]uʧü裵öÌ— zîš5Ù¶FQ@D¾–×~|ÐörЇí&~åžW›Ö 1ã(Òq‰4Yî ÿj¡b¦ºÐ~±?:²gí@U&£ u. X걸fVuxrO§ bÜ/MT&›È-¹%¹b“C-@j®5)ˆyú³V..däP“§ºìø±ãí„+&ÍlÁ#Áá‰ph\à£5„\ä…†íèDι g®$‚Š”nÛtñÇ%‰mÔ‰èt¦£h°g6ߣB§ë•_LÕu;í±:g[‰Ý1Ö³§¿3Ìv W­GÛh5c5‡ù Ø"“*Z‹ª±stÁ•ä>æ¡90ŽIê_nD]-֡JåE2ÒI”cm‚À½’’¹ &B6ø¼Œçó ">š³keûž½G ÕP¡ÇÕˆüF¡w·Úk2% ¬¡~7OVõ–@Œí#ö@@ µ%Îòx Òñ‰Íº4ÓÝ5€Ž(‚ø•$m'›5ŸC\’/àP~l8]Ž ïqf—×gëúùjðIšsX³¶ùQcM£w6ÿ7Uwì­¢ŒËÔ¯<¨•e¯µíTP‘ ¶o,Sy³Œì¥“{ÃR_•šÛÆl¿ðÿ7—;…¶# ÜštpÑAMÿø ‘‡Úõ¶•–8Q%H´¢êux?cÚkªÒŒ/ª²ÕßvàÖ㳫~6ÐAR®—Öîf°ÈyÒÛ‹F²dçS“Û÷ÌË´SÞ-H÷Ä­,=øîW‘àUú–YG ÉhLs€¨Ý×CŒIïÊÓG àùDDx<@E³Û7ÛæW  ø‰jX‹‰ùTXpɈ1WÓñX”Z;´cN7´©T2†W¬rÀa wC¢žîü[ÑÉ ÷¼ÈM'ÃlÞO`ð Àó´ÆNfSŠ þ ÑMwºG‚6„ȯ´‚ž[Ïÿ“±‡cýXà§ ¿_0áúF²LCÝ^0j7@·Ù.çÞ €7™*õGg@ïýÇ7š‹¨àÂyý‘~§Œ·‹ŠÒº¯¼ª÷ú³Â™@=%W÷?&bÐ’Í”ßyx¾Ù®jÈýñ†-j5©¶7*}ZQý.€1Q3tà½7N[A”|NØfà*Y¹Ž2œÇ)h*ñÖA­ yúî€òà+T ~Š×,¦§€`Ó‡y£fFK„ëÈÂï¯tßgÆ£Eu*#Ä3¢~«­èjtÉdŠZq$º£23JMš´¬C‘’‰‹D ê!§†òEœµz¡_ܪ\Ró4Rþä ðœ1—ˆÐ Iý8¹µ2`U®Íå%¶`Êæ¶Õ”X›&XZB"c‰!ÜŠ‹…d0*Ú-{+ÏÌ·C«áWùs7ôØAéðp] ©˜ÙåGˆc*'d(M0ÿÂE™3Äl’<Ë&%«÷ñÀ®¤ì$?°Šn$íp£O’^êLUÅd×LÇ´Bo«¡p ë­n«a·¥ðV\â¦+H£¶·óºxãh¢jÐ# . jÛg”N‘=¹"&ôAµ€¤»Œõô«ýþŽX‹§iƒªFü$Rß,„楩t±Nk9ùCìš Ú4?‰ðá„tZKN›Sæw¢§Œ€ÏÌíº:lëŽÒã8ÝýNŽ'/”DÖA€P›yîjûðƒ¾×\hÃÉF5š6HZ=w˜®°g¿×Do©u ÈË\¹ 2ò8zÐtNðâ9 ™ÄÃÆ" å&’wK²ëfh&¨!ÀnÀl¯*Ñ(0$ØYö£$×ðìá>þO9ÓöN=]ÉzÏÈ›ôú»+6h›­ˆß½Ð¢U•´ªDƒ!èÝÞ‹cý(ý†¨[SŠßwÒé}©Ôs1é‘ @ò難%¿~œFGXLÿTªÓ€Ëuù‰·Hë¶âù®&LÇû2Îåã5!LìMÞ[ ˆ¢‘2Bãßø.êAà PM&Ó&%–C¹`J~îŠqUô7.5cÁtS,ÛÉ=m@riYz%Uy5aSsf¢nÞÞ q°a ˜Ï‡uî¾Ê?»\˜ æPQ¬ *È #qqLcsj‹“>4lm]Äû œiOv†JªUSë2'a á‘AíKMN걺…«»•FVžéåX̤(íe²Üh@0ÖØˆ½Korý]7ï àXÖ®¬‡zWÐÐêìÝ%È0Žîe{ß2š%vCg*{Rò±SmÃÛ°!ÎrÌ”UmãkuÛ»Àæø›g5-{±J,h=Å‘ôˆkãÈ')Ü”%vn¯ðñã'‡;ÄÇ1¤IôG½Ì_,:ß²M¨È» ¸`àŽŒÖ‚‘ÞîuŸ³á ähCiy4ö¿ü$ u¬â¾›•”žËÖ Š¯>*lÉ>o0’Ü5úÕþ&£!² ?æ®TAp­Áy9þrì¯=a`û* ”ǸX’”gÕür$X̸2…½‡ ˜0®Ì¨ÆÐÉn€fȽ3I;ÃÇKà7±úCŒÛ…=ˆ`„;y‚.£;›4a®ÌQ’bÔ!œ;)€›}»Md6«ãÏrƒ“R.N-•–ÚG,pœm¤4 Y´Zfˆ¤÷('¥Ô²£k©bàiÄÙÏÑÇJô(Hà`LàÙš=a—" 7-<‚52‡ó(Ïæ\Zvá§X—2†›º/±j²³¨ñ0e"–†kÍ}0KbÕ ¼.1ÊS51) ±¬l¹Ù:b؃° )ª®—ÆŸÞ^ xsQ¥Ž›Ž÷-•BUþCÿe'~¼dMw‘6nÅŽp÷ò§?bþõ²áû%“óao [î{éî°Œ[¸ÒAX™HH‹€-øéŸ•*üÀ³¶8ˆ>F›ž¾å¨ÜïñbW>6Zý‹ºûã«g&¸ü¬|<Ôˆ¡µ‘ÃäñŽC9xuŸ»ƒ?0D&1¶÷”œ£¼¡ÿGå¥[çv žKqög)ïIå?^êíÃO@¨þÇË‹‚ééÍ K9 é§w«OsÁvߥÊad£:£×ǧÉgŨÏÿGDç£åÅà&ZßB#`#°® ‹ÞÈþG»ÓY#DªF† q«}y={U¶ñøµ/0Ì6wf…Ê.üÑði>™3’žA.L ¢NαNÒMǤØüâF—¼ ] ‰¿[ê‰ò¸[6\K´»PlEl¬fJ“A¿]m*MÇ©MoÓ’ Â’6kòÁ›)!0}çžÛë0­V›D¯×yr3ÿ™òHx„\Õ-ÒM7žsLÅíŸÀQN#MƒnF„\rÜ܇sam92ñ½aLœ2Z`sÈšÍjEy¡%Än0m×,r𪶨Q?ZV¢V ]Aƒ´OͱùAd„ƒI_t@3gǨ°ò"}‘X“Wç“öd%»,M|eY/›*ÚcpŠ$‘ DÄùÎÚð›ŽP4ìlDÃóÍÔÖíJÕq‘tÔÃË)‡}††¨MŒÇœfP§#Œ±ž$™p2ÉéIX™ö˜cÑ/¼¶É@qè¸ÚØHD…C‚ÃMj‡‹ÿ ƒN|›ª}‚c¢ÑòÊ2´¦aH`ÜÀÆz† §®MLÖg{Ú•¥;Õ¼\A†åîÛ·Šý<㨰 YÔ² "ÝzͨNò…|2ÌŒjß( u=%N iú0”$‚;Ö3ÜObȵ€â¬2I9 ÃU—ÌLVΪNqO­Å‰Q®¤ÈˆbF_°o ÌI”B‘$9—̲i«×L®¦Ãb&i îÃ!þ‹Ùx\…Q„vþsìºtL÷¿I»6·CÕ±üÃ-gÉ?›ˆX7¹ngœå[_!‘äÑEÃ%U+òvÎ{/zÐ!Ö‘šGC &–›¿*™DfЗԹ-ŠäÑ„ð©»ÎœßÀå„L Ë}ЃÖÉ€ *¦Ï¥2s%ž\ ‘Ì nƒÅ]nº 1¯lTÛWM‘"óBgdAžµ¨º”kI‹Ÿ9WÁÏl>=÷”zn€ic™òÚL§NçBAÈ!8uƒ»ØÁß\$å`\Eñ5™ìê¨àJæ5š¶üª¢<ÚסHÓˆçÔ®O!žs:¸9 @É>`ÔbtÃ](B@{vp;Ê)x誷ӘW¨þ@ÿÑùÄ’ÚïØ1ù“Ô¯óûµ£Š0|&Wôdý†Rω•ŽŽ¥œ±ÊXr£ç&•­z$ë1ã‹7*"6ä#5…›OZòñµmì¬!KŠŒi7·1ÎÉ¥ÈhEZ•ð°ùäý9¢†œ¦+`}?Û艮 ÉT‚æ‰,ÅhÖÒž¯Gk2·™Lb¥Ê(ü 8ج´«‘;LâǦÁ‡úGmg“3H‰¡A·×{©'t‰l±GÕE z í©ŽNi¶ú‰#ßI©FË ”P–'©U…Œ¦[¢¯Ÿa,'ŽL÷v=YÅ0F¢,Q£b{øÚrºÌ·VatØ™V² PÈTt¼°rvÀM µËM H[ðP©\û,O¾ ÷L(ö“<¤N À8.’ÀWšWïºcER¾§ ‹…xaªã¤Ô…GCkM³š!…}(œz©èz£n¨W 7J/7AJÁþC=Ôáre³äJõ‰5#~oJâd »™U’/ý›_ä@ M0˜,Ï™Ê:” V‘ÁÕÛ߈˜9¸¯#å²Qæœ\òtCZäc?¹”¸ž¡·WÐ"±QŠÇ©ø{9Ü THêFƒ¡ÛѯO.ìÆâ1SåS dîáOjIÿdž^4I¯ði×À:ò%7Éþ%÷ñQ.°æEÀ$ìŠàó†}œºì@5‹f±hV7²6ÌŠ¥èC ’/9ëiU`Õ&lñÒ/žÕÅL‚ÌÅßD¥Ï µ’@”£(Ís-ÀÅcîLÏpßÔYgʶEP=§½D©ç¢`Ô¢æ· $Áp©½}ëokù×g½¨Ï‘&2£ÞÌqóÜ L> Á{3˜„L%$m,ˆü1õIDdQG„ÈÎCF´ò¹ÿ²è|~ñ{¨÷4óPå÷3Õ>ýìÛì$|ÝÉá{»"|{÷ëëâõÿm“z=àAzÒ¶ e“ý#“æ¯'À—~ÿù|ŸÇ8¤¿ ¹þ½þ^‹!óã,úПi1À¡œñ|"\žÏg—lþ{Ás˜ûW–äù|fýq¿~Ô©@|4/õ¿ÿýoûlõB÷ß~xmÌøx<èq<2¢ch:p  ãÞˆ? y_ìŸ)¨Y «£ýßÿ©‡K¦ ÷ïõ¢ä ŽæBxm¿ìßëïõÙç caÆùƒtþ^/'Z ó{ŠÀOÖ¿,:ÿÒ@k)aïs:íÞ7^ç#ÌŠIIƒDÑÅÚ29©ìvÂþz0¥ñk}ÿˆ!$Ç‘UÒN5ñ9ÿþ‹fnñøHêÒ:ÛÆ"ÊÄ©©>a5@CíMC;1.`ø¹ø6àîD`ƒn±ß‘{v oq#QÆñr²m«‡…rRj>ý|c€TìÁdWàl›;€±XI®¶P0;K™á©zïâñuinQ¯Á£#õ¤Þçëù\B®vÅv¬=w7åèæäñéKV0/^!IjZM›B[É@Íà2>éÊø¾Lkõ€±~ŒXf%hÎ ŒN';i1F:QF~‡;b&õƒž¥Ö€K7õas%7eí—¹“V³Öm{„fà)&aw뢒ª6ö–éu@ÑÓÃÅ/ÌѲËAŒ$[VÕ¾qûGêۊØ“«B+E>öìÎà-ÈOÃÙ´Év0… h†bß“âsêw]ü•dF_t´ƒiXàórŒvQ´·°¯L“u·-ä&¾X/تúG¼ÐL„!ýBjQ¦þtíRaH•EäŽçrÈùY=";ÁµÞ%ªJ絨 梠\ÞçAAÕ±•«Ì QVpçl¦QV²ÙÔÔúy{¸?¾¬ŒWkzU bØ_7aê<.½éYøa›¤×_„ iÅF:¿Ë㓞ØwigG1  ¶¶M”CÄšªÏqH‰ `Õ~Sé]µyŒjzYÈRBøô©ëןoyü`É'[q‚•³£¿aÞ|ŠóÖþâÖ ŒÌ Á¢»bËfm¯£ i¿Ô°¨§£I$'Bƒ|‰ã¿K؇x1ùý½©«kÏq)æIy;¼ŒkàIÁM×lŠÐMƹFΊs † -Á5‹P°.1©[ªž\ò¨'5À“(Øÿªè|bÁ:—kC(N9óˆ§÷¸•ÔA6`ªÛ#/DÎVáêM Š–ÎQŒÜ1ÓÛ¡½<)<5¶åWâ®´œ4»Ùçó©@—†¬Ÿ®òÌbO 9>HÎtµ€¨Í¤¿,ï^ ‘l>k²Ca±«Q$^€RºBšÄÄ XÇ$ÉÕ’in ÐBQʼ³MO]CÕnžP‹È{ìî"Aôlž| ‘;’ýîw«iüÌÂóIˆOîÂ¥†ž‹ '»ÂϬæ5úÑ 2ìN-4ÚpÙ¨2‹–úÏÂQQgψ’ª{+»Ê£Ñ¾õç•Ø|Fb”(tñ¦Å€~©y¦a\ÉÛ)ÐSÏÉ@ÔúLfT‰6g¨«#ˆàX>eÒÝ8cáàƒ 8ͱ•9ulg¤Ä…[fVåfé+¶à]±Ó&ÓÉ,EO`T¨D ˆn‘°©Açž$§Ý.пQÕ ¨øa”°`lÉöi.×ãÊ¢¹2”‰O‚vï‰ë(K"SNñ‚d!HÙ¡1ÁbÏÑ« ô¦˜2å?„"ü‹IhŽÐÍ:b›™‚êš°²\ ´Gí6&fŠàLG°ÏÚ=v/ ì^· 06cÚ›â&"ñß¼^Á-P)hl˜¤M²2 ƒ-…&d"x½ŠL±†˜Ñj@½Þ”q•*Ô$ädh¦@z»‘åh*­FU»-ƒ¼º,\‰m«c"xëxXÏçÙŽ»åöáuœ;-Ãj‚[ÕÄ.«Ä˜8_«Ló‰#J¬¿Zàà ñ­€ èD?~\Í&)™ÚGPˆ‰‚`'¾ˆ.rE‡u™§aòRûÕVœk1É# ÒH*ª{–|zŠ͵òÉ ck¨¡us£hOzg‘"9¯RÝ@ý- lÿýøpy¬E-Ë_¢uˆ¦r.Šºä¶³\·6ј8léÌ9‰‡9eô`>ê#= hCFžÕÒJufÇ¿R<àö°0m\B«PP!c ozˆ4tL›#FôRœ¡·NA¦œd|KUßF ¤”茤Ì"¸Â8©¡_*:¿qüÝúÿ™ oUÃP4|*~q6Á€,j|wèõl«¯­ku„G_˜z;†..:}Çìë]]m„‘í,#,Ùö¥U¿ÐêrÿKÁ/yñ|`[mix\zÊ:` eþØë7ãíÎ6üìvjT×cýÑcoàî.ư[‡ihcÅzƒ‚ÞËÄ ÄrŸ?½‰}ëÆG+ý áŽãR»žÌúrŽ”¶úé¥c²Îà$Jѯ; ÜØÖ×ÃåAÄ>é‰O^Tˆ¦¢ýIv¯Æ—ÚŒ|£1 è5`¨Aj½¦ ôÿ÷º;ô¥ïÚ“ÿf÷wüæ¯û '@ò†{ŒºF^»øªWäÏâ~_ü<þøžÏ›§›nÅ4ôgªùZÿ´èüGm¿ÊßòJ>ÍjÄ›U#— Ù$´û‡ê‡(ÐöŽƒÖhÝ`µÐÚ²€ gó6ˆ§ºïWÖìõPÌCL”oÁ!f•+©ÓY `SéûDZP—4 «ÞÝ-Âñ¾‰t®›gòMò¨Rí¯DÏÁŸNhy4ž˜/è¥\}DX‡ïO˜€¶Í­#ù¥Æ‡ˆrOµÑÖõÉž¥ÞªZ–ÓEnDÛ<Î#!gÞv[÷^(&ü:G¥²™cPUEñß¼îZÉcÞInáCä"½`ä›r"*".L1Æà,…µÑ¼x¤º=x ^‡¢õíÊið6ÇÁ®ƒÚŽEz€¢a h-ÇM\¸ñqŠ†Ò w¯M5Dà 0†;б(ôWËÒ0¢»…ƆH®!×­#=jutªKÒ–Ü™r&õ0$$°öñ‘[Äf±â‡´ýÈh%fÏȉ&¿IÛía6{“¼€b)óGõëtÅB«¡ä„І²;–Ò€·äÈ9ÌÄçÙ¤ÙŒ'Ñã—Ý‘nùö;Z*¥%â¢þ`Û=]Á+ج\Ð"¾ú8SiØPª)˜P-ì”Í’2u²Ð¿ûoh´zhëJö•ÎtœøÀè—ß*aÒŽ™uè¹,lÈ&«ÓȦ—|ጫ C¤`®¡BR¤è­‘ˆ„|FŒi6Ä]‹@s4ºx>§ýi{®1HlŽ»Õ?¹”½0@UmiLý’GeåNÑ Ž§;ù^ƒ` ŽL{®Éñ©'ØÂ;¨nÛ¡øM' pF¼þ~­`4sà*™Su?¡˜ßIwOòx÷~óÄØþqºâ€D”¶ Þ‰VàË´†p~î‘1¡hÿ;¢óÅ#ùl¿ò­Ü•C“R#» dbeý³¬‚Žv޽™EX¼ì›$‰¡!ÔàFM_M=‹l7ÿØK.n«®˜»±¥&û‹1R氆ήãfŸ$/áΗMI; @=D¶`˜~ÒIokW~ªt‚ða…IëøD!>ìžn’Ä …j± ð/FŠSéâø*Öw™SääN[;%€ìäjš§(|ã¹ÒXl MjD±Orgê£P¶Ÿc ß±vÇ"Æ:Púpʘ}·bçƒ"ô8—¬TPŽ«c§È±äNª¨Ð–ˆ(×ê y6xÕKb/›%!¨’%—Ý5£‚êã^jPÉÕøGw×å1ŠNo©>ÁkŒ"*ºþ.”O_DGrÙu©¹˜0ö ó)[~S,—º™UÊ|WÎŒ~$qæቢàsX\œ~X‚É…J¾æŒˆ@瀩yI_¾¨)ß&g·†ÏÅÌ–v¿Ûëf»=HâJè™r [Óñá$”H%fŠ<Ö‚B^’SSsCËêv›Hmuµ7Ÿˆ"~©è¼ŒñÉMX1²g“. œ QÎ §9ÄPì€éœƒÛ'· ³ã{÷ú¨ @ýjXëè<ˆ"óú@ÁŸAƒˆ~à—äyö—‡¯»Ûk"]¥¡¯nàE†Q xéY~Ý'O1è·16ìú%O!›¿fíŸÀxwB±a*% ŽŠ%Qf eù^yŸ5@úøLWà ÿ¶èüÇ€-rëaÁ0+þðZ…›G^7EOå. 6y}%gÕ2Ž×ó¹¿}ÜóÌ•úT„@‹yÿ²2¡-TdëôÈí³ˆÓ`&ÀAŠb!,*%Ééè;> g;Jäb àýh·ûPM" ññÛ8NÖ‡†!‚éÇS(§¬'W ÿä`6¤¸3²ÒSuz}Yé‹°A2C ƒ_”Êx£"e…”ßré–Y»{¡îñ¼Àã´™_±Ø3!#;£—iå§QQ›>£'عxÙ`Ìæ‰öÉŠ“¥ˆ2“@±G·!ÓvIÜ6”íI*âD`»úV•À÷ 6ƒ„ß×ðOš Ú0-¸ú3’j½53=ªN·Í9-}žÇˆ—ë×–ëŒåÈAÛnÖ&b®lŠŽI#<¼·@VfK܃Q®¨©¾0*PÐ eÉ lC£Ÿÿ»)YÀD¦‡W¶¿±Î¹sQäüx >gÝ;ƒ/Á i󲲚R¦ìÜ?Ñ€vTV.XÂ"èŒÏLccÿ¼´…v'îÊü…ê»îÙŠ?øð«ÞRY±‚’çBë˜9Ec£.ú²¸¤¹Ç)xÒ|žs5NXô¤w£©¥ ÀÉ™šÓq–Ò œüÎ! •‰{R /ZF f+¯¶]@£ØévP§ Ý>;làWî{·,Ò¨ÕÙI§oô$‡†E1qwï¡íÐbq5TÈjuCG±z;ÕfJÿÑyXNØýïºc@+E"رQ7ŽJ)|J›uÎï ”°»;fx¤s¿z;ï¹6Á­•©è ’9ô¯hÇGŽ\‰WºÇ” Åkªs­+?ÓIs¿$á ¯T°”„F³‚Àë:‚CZš%€#u2=€]hŽØÛ?ŠØ$蚣nÉ0WóL©BÔ‘\θ tÚGêêM gÍùØ üœ8ˆÛŒ8I$dø$ú„ʼ„Òù±¸„ó•œW6sÄìq©YsE½|ƒ+Ïn¨;Fþ'F'„û@CˆG,&ž„!šiÅß$Z-Ù¢Y ;e]"[:r—?—¡¸ õ—RÏÛv4 Ñ$âK:VÕà,M ç<•ÖK:j?è«Ð%ÆQp‡(ißÈ©';s{9Hy{j¶µ‚DèòË0Ó!õ4L#" L¸¬çŠáûÑ7ÎAyÒ-'y騴¦plSRî$d¼ Ñ® Æ\,\Ñ0•’ÅÌ \†$1iTSÚŠ£±C!e2ÆM ñQ&†Ó?ŠT茊q_T´0»y>¬š÷óÏvæÜ9B‚;˜±˜ãYÍÞ \Ï0ý§L-¢@Qðïã€æ, GðÚD]BH5b"†XŽ<‚N†Ž“é#—™)ëÁX<?NÍó¾¨5I¹ACP‰tsl†…Åý"heš)ÉÊÔ¶q&6±àÖFCȇ¦7“wnH^~¹ÊûS:Q Q¸qÚ&/Í‹0Ùk§ô2@ÅŽÙ±Íy1×Î(=C¡iº‘›Öܲ±Û´ªúCX Žû™ÈÓØñ˜hc Aˆ‰£ö0¤[F¼ã,›Õèÿ„xÔ/t‹l=­ŸÓ(‹7O–`m;H(4ÒÔU.uZ2/‚˜|û¸ZµÛ+éìLÄrè &² W¬ÀI½6Iï@ÕÊŒì:Ç—á@†>nÓ&6ªÎ‘ÕÕk«âxlʇSZX¥Ü…¸jaú±Ó(`æ=¸1TÔ§ís(½È‘{Òµ€V¢6ªui»'ršsœÉ’¼(‚…]†±ˆâ ¬ì y$ßE™’ÃoŸJ UîWCüáVvÒW”Ú+],YžÔ5 9ƒ™TâŒ;2^ÙÚðuùÐ*ƒ/jÀ Ë.‰{]ǰ–­?À @œìƒQ(Þ)éÇSgLêpë Pê™Ù–P—„‹'×mëõ„Ùæ Z‘ôíÀkÉÅ [4OUr0ù~΋)&Iš  ߑȘČVÌ«Û&P[.}–´^g,OÐÓ_Xlî[™&o"ˆµö –¶âÇ`P9û&h3ÁNÁO•—ZLfƼÔöÐÖî`ñ+WQ¶¡°:gÐje7ž¬Yîç1lEK)Ó؆_vDS#ÎñºLëˆ<Ò]u nŒ= z<Ž›À†3¯ÅÇ|ôŠ—vVCpŒšvÊÖ3Mzº=a ú¦´°£U­=6g0Hþñx<¢ç=½™4“CmÓÅ–üUœîêmmaXûëéI°ºúòœ1ü|>Çö½¿ŽðíB@¸<“>ùUˆg~¶ò’,ðolzˆÝS4ÄWöÔå8Ó“]¼ßQB{ÈÔ§é¶öÄSp’­óþHX ⽕‡œ>cZš»*Wμ7Ålj‹ dšP«¥ô¿R—J¾2kké¬ÓR.T8'ñ8YÈɹˆp¤<ۛܢޫæˆS8ˆÒDoù2rº†9œו|î“ST—ÔB¡z´FE*Å2õȼ«°>òˆ‡$rpàn‡½Àþœ‘kÃð)J`Ч;Š"2 ÷¢jçcjeWè¡$e £Òêoî{- Žo¤ig†*© ßCI^~•™¡0¡½OH)o6ºh¿ˆ ä&ŒGêø!‡½ºT4A2†$Ÿý]ÆŒÔ2Jþ° Ð ø‡­NÃ5ö<3þÑÌpõŸ86² âf‚·[™CzF1ò<ŠÙÏ îXkWlXŸŽÞ«¥Ò$ªqQ4ÿÆÓßw#|U³1)sœ$±t.Ä!¥ø”ª%¸…€¦ ?×b V°,[½‚n¦ÿ]I«dëý3•SW¨«8m À³‘#ÇRŽ­é5̧}¸rŠï¤2t[8vÁ†t.þÚÒ>)§5bÐÁg$îÏû®Ãr)<Á~~íˆ2‘Bÿ²ºM2>Oâaa͘ïDWÖÿ$… Œñ &ÑqGÀ®ÚÆ!XA*gŽì˜×\?ÍÕå•&ÇÌ€KÔIºevNÉ2£%Ê—nU(·«KˆyìZ«;è€1wÙÜû‰{â»3þE¨œ‰€ ºã*.ø[AôX“7t˜†L—ÍDžíÕ™¡>Ä´>ÕÑdfœMëDr¤M Öµ¾jöM©qºÕ¶ÄZ  3ˆX}@ÇwáÈü(°Ô+CAÜsÔ£B.Ÿy1Œ{w¸`Úc?`'{"г‡¸®mÏ5¸äB\® Ƈ AAÈÆ‡‘ûñ¤o2 \˜?»ž;¶ÃKGc~J._ é¨vÅh³ÀØ‹"Zr ¦0놑Iq:Ù9Ü—é7Ä3„ªµ½Tž9ËØ¥¼FWŠ3 EÐ5ïZ(Ž…ž»Í‰µü­¢ó2Ϩ²n5ÖáH/{×Ú÷½_˜ÌläbÞZç&网o¢S™3")ï´> È;¾€O›:ìÈýÛëNqÿ¨jµYêïíÿqRJ$–ÍëïqÉRKÅ› WCP}zªÄí˜Èœ€ëו×ÿ¥û9ä7ê‹5RÊeók¤|“«%E{ÄD*f&åÇï–EdU„#€4».)Š@S€ÍÓä8HŒe AÖÏ–3Ü9y8!ýÇ(º“yâ¶#tßm9MÓüÅoÉ¿‰€¢œ#Drœè!kæIBNw„ÔÇUðåªÇNa)Û©ÍŽk\t¬~7-Y§(ppŽBÞ$">'š7‰ÐìÎoeŒ=èʹ&¹ëëá`$ͯêWÔ¶1ï‡ÂÐ7#àGÏ”ŠgÛ~ý±nË(e,õ+½¿Û7¬1X’`Œ aSVîVJQÍ¡Tþ¹  1NÖÀ¯XÒ5<,­ÉŠÌ:¶r9ö¦'„`gݸ·0&rW–YÛÝ~ Æ–ú‰®ÌxOÇèç3~$1§n¦(\FS̈®{AJZ¢ËOõñŠ‘ŸÍÀ÷Șæzz…*ÎvwW¬E·O‚®Úô,˜®,De×­ÖVï?œˆ¯~Ž0Ó"6@w‘VZaD€OQ\u°bÆk¾í7‰Îóë[o` -#óÏÛ_;@ÉÕþ”ÍÖ¢:Ç£× ÞèÜ®gsÞ÷¼fžèû\2˜;ÒdƒWvôš»ÃdûöCB7FQ%qtà[HßùQ⳸o?/,©;¹ñÎ\]b%TDÉ6¥è À;×™(Deí¸ór`zª8øÊTƒÏ€/¤ø.½.,9¿ ©1¾ÏfªF¶h{ÛºíϹÅ|ÖÖmÀ3^:¶Î4韲¥q [r£“ž¯¾Çe—zlÑyјDáZqZ8r¢Ç–á§‹iܨT¹g5‘Ñå’@%ÕzéÅWj«ó4—ÄËa‰°ô”érÚòRc4ÑÉB|Èþ!¥¨ÚF¦Ñk#½Yˆ!Üö‹Õ£Þ׎]§Õ…éþüÞróQ­ê½™þ5êŒ&ŒN ÙôjÊùrÑù3y€‚€ÂŒ6™˜.G¥ǛĊàIÏ3Ìëbw"G‡º\ÔފÓb˜\¿Ú…ÍÕ xŸ“AkÓ6ý¼.c‹zúoE«Þl`%4ÎJ£Þ¯¬íyÍÄÛ“¨+Ãè[£C^¦3ÌùÎ ]âÔ¶ {àPYÑ­Ù]ãdfjÈÂèÀéÜèNQ!?¤ · ¥‡hKLzû|«,U¢ú|2á#ë^9çɸ=ë¾X³Ê¼òÓdM'z£ä•ê r+ Ö•PÀFĦáÂßZÙ¨UsÙM·Cμa–ŒÔò“#Vâ¸&v©‡û4NÔëöFեȱ#Ä øàµÓ˜˜¯OÚÍZ“±©ç¼Ï¶ëÐ ,¡ÖßL;<°lX.qÍ?„Q{[ϧØA`ð9cølüG¶E†ª  â¿<.{ªû‰Îf&öh’±ð™äe›î¦H7ˆ¢CÇFÄÃI-ðF.¤Ôƒ¼\KÅÊ-``zÜ”Nõ!õÆ`“òæšQÍD&FBåÄ{J ðnŽíW?võ’Hôî£*Ì"Ÿx0ÅYlø`ÿö&£æ¬ “=Y8>Í>C”C’ë'õ-G‰ÝqÝ¢ ¨»ïñOO­ðLû×oNïÐ;Sb$ì™ÈYt¨ T¥f ,þ lã4‰e)Hø@¤"!>ÛÑì%»¡F…†&­SÒ}µØµ`£¬°u*ÛbmJ€‚ÌO܃3MïºlÒVv#'2v\u©úÍ&®¶¢î^ ø*+z¤Sr1A’%DÂØìz!¹)ߣIªØÒ•‘6Ó]€Ô={yfl£Q“@ëã xc̽U!ëy4pq‹r=Æ®@ˆÓÁTÓ/qèªßŸã JŠ–[zû¹ìO<,7v“äÙ=¨’ϰhby8\F 9 ¬¿Ä˜¡ÜóÆ=ãqŽÔ<ĘP@Þ=b=@£@,%ÑŒM[Vø¿™pX; Ô…ÛhÖ`‘/ãM *ŠŽ Välìa–ù¢mƒÈÉ–[õ¤öôu­!%^éQ 9^1âÍ?ª> $2i[/ÇON"Avgƒ±%ÿÍ¢óê 7ìaðäˆ*9/7ò X (ÒmyÇœºoìŠÀi]CT"ÖhÆ‹_}á-Ьñ‚àu“à²ó¾·¦%GñÑN«+Ì2W–b¦c¦|‡>e%¡'Ïü@n§Oé@ð‰Ûë%6³"U ymó¶&RNÀêPn°X8ÍÆ‘,N¼víh”Ù$CìÆ­Õf,u ßYÈ^j»T €yóïʼ%õUžÇ”û:(¾H¿xÎ#BgP¼|!‰@8ˆiWF/^¶¸q;QèHÅ~® ¿´ 14¿Àˆ¦ïÌúipë8@V:â"ë¼ kOy!.gýP.;ö*€na¼‚«Bxn•ÊûoZ;Œ\ʳ<|eKym+¦O¨ruj›ÈÓé 9¶«ú3ˆîÜöoi*›>[CÜ¿>4Ò :ÛQßÖMÄ‘Íâiç?_Ÿ@pEÉd®V„Ž©?*ÈÄþ6À?#:oEŠ–(”Nú\š¹Å:u¿—­°"ªöÖÕ×öA¶úΕèÁ¨‰oM“ï}=oÝ@®<âLt† ÿ½^¿™ÞQ®š$z·. QèÔ±”þcõ~Ên½” m—÷禯ý­ðm4{\¡¼.°U‡»µÅäk[L޾¥†¿µý"Øè›ÔˆôxÑãù½b O[C™/Yï¿×Ô˜„Iïßšÿ½CQñßë%Ù[U¿þb§¿×4ž|øp¿ªÐç®çljκ¯‚ØàÕ+ÈžWGAw$)û"5zö¬\iZs4ÏÖ‹ïÕ÷eC€½¿Jæ8&5ȧ\@AEQE¤` vNô’›i/äBœã?˜Ô“eè›¢Ž•b“øQD|Ù-|~øIm§é¦¢A’$Cò’ØPÁq˜#ÍÒ!ëiUÏSøe Å>ddû¬áv)Ön"+•ÒX2@ŒvŸÏ4MMGÛ—·3’>$ž’=œ±­o ¥DaYq±M”央SdºÕäcÄ€®¬„Î5°OŠÑÖ””ÚÿJ":˜ÏçS ë°q”ÆîobÍg2Ùù r91yÐÆzëÍ£$¿•9šÍ¼$«m’»äA TíÙQ¿JçöÞµ«ï3™;Ò÷žDP.ŠQ²ÞìAÚ§¨QÀçÓMÜ«Xˆ¹ Ê7¤7ÕärœOpÈ• £eÚý¢ãw˜:]ë©ãí¿8ô@¤$¿2Œ¯êÖõž5 µ8A_³YëbÛ5—ç›ÇmSuùË:b“3Êö<·EBÇå=pVK 4ïy<Én/V_U‡Žb$8eFw”b•Ä#káç‹:Ra›½9Ò\Úílü ×pî4JmMýϹp&ª0‘Æ"6¬“ó=ÎßUWÑ4sÎ’Ž ”’4„°›j£ÄHÅçÌöt$-ç‹Ù€Yáü3]òPò+kæq|ÝÑ8‰I´F¬Ø5ïNJ¯YÚIò"I9_—á^á0Ú%ÊDxPn¨$á–÷i •„)‡×—¥I§1'qJ´â\õ%"F‘ü4Õú 7vY0]_Ë…Ôø9êƒ~ü8AÇÛØº•ZÖYx áV)žn"©DHçöö,(ò‡Jì¤U“‘“žÑLŸ"¥•ÿ¨CÐÓ“0 ©MU:“T‡ KZ`;J4 Õ숔%q÷â뉵MEo<Ò‰ûT>+Ò˜šò½Vª¿ë£—äš#{.S˼QZâéFR6üX[Óg´H?Œ e!`­í}ÙK0¦u¯‘ˆ2%tbJÇ*,€Lt~<ʉèxfÐñ%òJ4w4¯ H´èçK–­Ô#¤ÂžA#-ããFOf¾3zîQ{ÒMÌOV¿*Tb_åu Š+R:€ABRÅûbïü—„=O{ÐSGÀä+\Ý›º†& %ëǧñSœç:‘­9ÏMj¨1«*"D#ñ„É@µ³U(Fp“¼’%¼ô´Z<²P`¾Ú¥„a—¤ÌÃkŠ®ÄÉ/q*›šN/ee'òÀÊãJà¤e½(‚Ë­,ˆE-úÓç”éÔÏ•ÄdÂO¶uQ±=8žnýiº]‰÷oåËCÄ$³Ò¾Â2pˆÌ>Ü7ŽU|Á½'²òw*F˜Q§}P§ÛãÎ:DºTØA{§ÆÒÎþïàcÚ‚ìºgO-Z×+ÈûæcVà2L¶ŠŽ©ÑW>mck™?4…Ù°‰Ç¬^°+Í_1Pb(ˆù!•¦‘ûï÷ui¹x„(‘0zØDV‡Ëx+ü™$€òÖ~à†”çhâ(ÑÑꢧÅe¶)ØhcÄ´9P>0jÖóêVÓ"lô®vû¡b_)Ql B˜ },™âD­\ÛÆÄëa°jÆ£\ËÙŠ"ho•Oüþwû"´1ô?9—ؼÇcˆf‚+NÈΑv&4¹Û¼ê0ÓÔ°˜ŽçfÁH#o/È@41G§t¢¹àÿž‰K¦Ô”ONß•;T¨ÞýéN¡œç >þÔƒ}PY]º¾†¯òDAÖAyä#º»[î×ÿpÃS3Q÷Œ,Ké£WÓbn7Vé_ÏÚ]KˆÓdÖ‚ß8I#¹›Ö0Ð%8ýÆ×¼ñulÊçÛ‹×%š>ˆzò‚ñ¿×ßë£^¯’Ê•æžÏç€Øÿ8ïŸøÂQâd´šõþ=Ü¿ >Ør}¯€Ì÷ÒØé' dý ÐÅΊFÔçñÉzfŸÏ'⻣7þÌõ_6ñ÷ú{}Ãñø™¡ÑßYÞñþ¾æßëß#þ^/ZÑOÿ±ûÏëŸim7$éAŠœ 匔P%YâZ4sÿEkÛÙÁÄ1|fk§ØH4rŒªf¹SžJvöÍ}5¦º î@|*†+ ÊÙ\D* ïœÑó}DOÿtÛâiÔëæ'QúHW¸jt5¡„Â’(ýÒNmn}p•6A´gIES|Xwô³¹°xaÃ¥ÇRF©Ze,ÛÚs`”Ø ÃAçdÁ¶Òvê ‰’Å×µcÅ‚·ÌسuÑ ¯]³%zó­š„Oµ¼/Ö¢çiKoÏåŒæµÇìldOû ÉßfÞrøÜmƒ›SoБVòÚ,KÃ9 òÊ‹ –H]ÍpâŒq’E€‘ãÙÓ%pv23íeo³õ¦f ɧF[$úèiƒ°µ2„B'þ y¤Mè¬í—¯pÐY‰uûé’—=ÐÌ ã!b:2á4v¯U6l+.`"uOèÓ¬ÕŠ4Àß~#fÂbøâ_£uÓ–†«2Vd$§B¨¸2J’Ndhâè°;±=lb4“%É›H{hж¥ # 4çV‡lÏÄ™pÃxªWt©·…Õ˜\¹ØÏ^k}õŸÏ§ú¨Ê'Ýý?,ˬc#ÑG*w¬/B:Ð S 4§ É qÛ&Þñp‚L—0W0ÓFË¡I±&ݦ–@~>Å Ñâ]!›YÂDóbY›5áN›?›#•Å0Ñ} 7o>ºàRÔÄôw†AÒ°l ÙÉoq•âdæöƶ&1¹*E³*F‰‘&e”^ù¸ÓK 9‘kU´mÛæº¼ŠÜÿ&Ïîþk–yÎTáG˜›˜Ü# ^Ú´‘—!R XçTÖðJ?†×ñù‡D“#ÈØ‡øI<4ê©Ý`•eþÁ±Ð•}ÿ™*…CüûxQ(°^§kö@óC29yüHÄØÞBJÔÎt¤HZÇÏÝ´Ý  [žãá± $m¬¦“ŠÊ¤ ˜+¥Î1ÒW‘°0Ad9ÛgîW=x¿’¾ÚÇà\å×@eC·kh»oð°îk(–uêdÇÐÁ'¦*‚䊭΢*U¢1r¦Êíesê‰ì'Œõ~‚ÔœŽO„.£—Ôlù“wîX ¥lisoâH¹bÄŽ*ëX±‰Iá÷.âÞQ —¶…\pQ%ªÞH ½Q è%÷Sw­«ë}úa]§FVŒjÌgAóR.òá¢3:z7Óc8Í,DL‘ú¡Ð‡ •'#ì+¢äêÐq¯>ýSÖ5û”lÒ¹Û‰`‹ -s…D2.›ìÒƒg5šS4ÂÚ² `‘ ÇÑ¡R’HVUÁÖ`@-Õ‰üÊT Jà䪦gux‡?ù£˜@+c‹‰ç,)$ÔªÔ÷²Õ‡~lÙ± V…Xd#»k‚”Þ)n†@«àr°DÆd’¾Ì멵r×-Y+G”Ék¤½>ÏÓ$’/ª4`„‹$®6©.‹úp« @Tu÷¨ÿͪ{82;½Uj T°g\ùÌ‘nW£aC•wÛ–«l«î'2ïù?  ŒŸ5 à[,g¢AãB™ÙöF®V×| ‰?½Kë8 Ù.½vîqzÖD‘Ý ; B8Ñ# 2/Aý›Í’™“$1ñÊ¡"ä<ƒù †•6`†'b¸\°æ:3…UÅ|ñ¸ÛP‰™äW\Ùnlº’õDÐ0ÉeRRNdºÏ¦^3ÈK]dp:óXoPƒÜÆ:umFåg5€Ÿ-:O\õW&“|çŽæQ¯ª1ffŒGŽRp%y yD¹Ö£¶s¥ß+k'z ÐWy½UÈbjÑÒð®ÞUÀU<ˆʽ~_’÷™Èý –¬$m-æôc¯¯ÐOÖøG_r9Ú8à"üåÿ› R45vô² #z‹ƒÆ¿rz~49’'ØÛ—ÙUz³a€ÎøÌ§:†T‚×VôR[òއBD‚JŠ>g±¿I§z¨ÜûÑ Ɔtëêüz£rW«c}šåßëÞ#ó^_ûãÓܾ+߬ǚ{ÃÓùÜÃ%­ñk ))Š+Þxå/ò/¿Ê¾/uVïqOm<ÚmWð Dç¿J¡Êi_ÿPR 8ùñǵ©Œk—G³½f™_o;²¸„Òû£û4zc¾qM1ã\hU9 ©Gáÿ-`ί«Þ4tôˆQ4 Ø_ÖàC 1úÐhAù"¥­eË‹K >¯ëaÖB‰¡YK™îUä.ÉR+Pm¢ÞgÏ®(УГú’»àçW©¬ó§5½wÛh•H¼f„[³'ŠZúA´û¾&B­ìð•Ëüé 2¢‰´ËhƒÅ5@îªÐ„ÝœÖ8ìß½kidÉø]f÷Sô¯µæt‘Ä[º`ªxú‰Î ÐãQÅà1Ÿ¾öˆ@šš…pç0¥í~®Ú£_°íˆ¹>ÕàîEœâ(h»Zn5…§=ê/ì«Ë—u)®l¼øv 6ê}ÍkbÐRÝUŠ{„³(šó~Þ]Ü—ÿp·Ä¼pdCΈ—û]ü"^ì‹rj¥ uÖgà ¬-)ð\wrаª¶´ëÈÞ€»ùÉ­"Y~Ò•aš;f0ÜñûM~o½ñî;üþÚ%œhI†ÓL…ñrµv«­¨BÆ÷žÝ4Ì“õhž¶%Ù®º(¤Nb¼!×-|Ké"¼5x’@¢÷™P˜1cö B”TÅÛ†ä]ŸÓþO¼ŒL¤‚q¤Æ‹pЮO0pL;D“îà90õKDç¹êœÄ&nh1Ó$E¥qÄÜžìXƒ‹.uZ\Úhÿg×W¨¦§¶BqŽ £¡$)xçÃA¤Ñ’K0´kèëÂ9UëB2ñ뙈R̰“ndE@:uºŠ©¹8üÔòOd B¼*#y!炜"MÇÿø¤KÁæÒQƒ Ýgì¥ã›ŽÏ´Bqßx1Çrœç»i0“bÄŽ}ë2Ž*bi‡Ž´’F÷Ñã¯65ÁOõ­u Ù<ÕÜ&–>%6â2k“9¤i_™Ÿ æií9蹎õ¹eëèŒå“zÛ…)Y/Á‰ÛAsGÔ¨i0 0ê¢ÔàDrÒ`àZÂå ùD”Õºjƒ€Æ§¸ –»Â[ü6=Dp‘Æ×tßÀÄ©©&ùHjãœr ˆ*õ§»¸¶d R»ÔÄGK¸0HeQá¤ìhr•64qا”Iì BD„ZÝUB·´M=» $‰Ä¦§5¿0۾랑<ìA D"SÑaë;S슋ÈKó˜)ÊîŒáÆ^=‹qT=,IJaÞ0È´Ãh]ßÃaªÐ׳5(uG&·(¦½LI (ÄNöŒToæ#Œ I¸v¹Þ²@( g¾/Â5Ä;%ôgbÆô—7¢SÆ÷-Q:§‚ÇàŒJŒ^¡Eh'R¢ŸãÛ=Á4=^Š›ÐŽ> YsÌä(F€‰#|ô€oƒ) 1º@[öÙ8¨ŠòCp÷6X;gÂk¦&€pÔäÜŸX€Âädé7&Fl é¢áËÏej7Ö§þ»<Ò“¡>6CJ¯ö‚OÕ5šÙãUƒŠwFØá7L±#Û¦ƒüÄ1U´ã1ʬÊÛZäA ŽÖ¥Ÿéƒ€Íuø(]’‘´G&JFˆÿ¨êZ„šÖCcò©ÍcHPíð6 aÀ ÜÜ©ciû¨@èÝÅHѨC ´l­=᪭e2"l&y²á×M¹Ýmôjìu¦Æ4ÈÞCÀÚ®…ñ`{Råuã]ç^$[ÅPrQÑÜvgçõã¢ä†\ Ô›"0Ž' ƒxÞl^hdI—Ðy«|…ê/ì1;‹ú2c¤á¿Jt~:NMâëdT†W-ÃhÜáÀê²5¸‡ÀtÆŒèëG}¬ÕÀà[$€®T;òN˜ók ,8;ª2e!£‹‹ñ,º>ù6g–,n;ÅÀHâëÎfé›>‹âCWÝüëÎÃ]Ÿ9a,/"n\ÒÆEêóÔ{ÕùÔ¾6=†msDLêCïâO/iŠ}û‹äúìjETžxÛHdõðSÀBº^}D )û¾G…E´ñ§Ø.Ûøí1Þ»»ïcÜa°¼ŒüQÜØ6ëËœÿ`âv²^i§SÁ€IO]½ñ˜Ø:W.öUK¢AÙ,aèü}öwn‚*Ý——r5ŠB›|Ÿ%©oŒÛ#·—^íd¯þžÅõÀ€J÷º×šýYM¬­Hf\º§•áb¶KF>xÿ¸5f“”ÝÖfðìB`YR­Ó÷þl+Td¶o3/$?Ñ«2Ò¨üó6;í¢2ÔÁÀÉ|]gØ<ö¿\l¾_H ~¶è¼ëxÞÀ(ì›EáÞÓIBu¾go‡M4m¡ðú ¼Ú½(¢f°§&Š2… ;·®í_„èµ äüL^†Ç£uÄùÒ­æ)"[ZUñŽì'¸ÈmúœG/9ªÙ,¸o²_Š Pê‡òRúxÊ|c>èž-6€¶°ð²ph`J=DÆÜ:­ÒKñ½^nn.{—¥óä @c83¸ˆ"ï+Ðr¨_,†E?(l”WH¦ÆÝÖ—v®ÓïF×WÉVÂËÛE:a>ÖÍ0v¸Å¼•§÷•|fS¯õ‰N:ÐQ<ûE{œ{…n½“Ç È g!⢓‘Þ™=m¼;¡&§+ú¬ÙÒñ)§$êgÌ´š#rº¥Z"RŒ$Q _KÏb7ÃéÖÑÛeaB…]° ƒÉŠiÍ‹*0ç¤Éº³h­gµI©…"[;j@žøžÛÖðÄÉ¥¢|€®>DQÆý«\`Wò’IMv¢¡^F\«]_Ä4’/rŸ‘Îw”}ð8øZkŽ­Š ñ³à˜2ÓVšØ fÒ[=”#p”\@ˆr3«J˜¾Š…“Vp߄֡÷É[ÜjÄ‹ ‘è¶ú‰'w€©£ñ$€¤]vÐ(#´„hÛµµ²öº!»ý‡Çæõ4GØÄ¢ö àÅk6)⥊‰PA/_ ñžjW¦ÚDϼÉLŠJYP HèB˜.ˆà <é¨O³°“ÕK÷†&L;ž:vEä½1ñ|˜Ú%Lª’[Ý?"²i®ÔÞU´>‘¯ƒ™‚&»Ö5HB'㛥G‹‘\|Ù @é†=“é¦Íq4æ`ÝúÊ‘lBvE©˜ªXÕMâx ¡|zŽÙÌÓ«Dc0êÑœ-Åh•­“¨s”ăæ"ù]RÇgö!Ë8À£@ãÂq£¤< 5’d])ž×3ÊÒ¼IÏû 3ë"naê‹ý:@y1ë.-(üGå( lÞ-\°A½I9€ß,:ï'æÄö€­ XáÓ|+JD³Ž¶ê•7aˆÊ‚“‰¸•y´ y›ËÍÔ(»y–ª ÷0,M‡˜0xJyd„“D,½Œñ¥M‹N¤"ü$ËXoíË` ŒØÓŽó<’—=%kú¬hù ¬2Öžt ÁÞ¦­:ÈOcl èTB#{K•t›cx•ÀœÃðD*žÈ},®¤‹=χ>/»õ­Q8GÅ_ÑšÚçhÔUF¼q­Yò0îdG½ž`œ{Ú]·†ð9yÀ?VÞN%W*˜ àBsÞÔðL.;µ{›D^ÍÌSìÀ†×lîE»ðF(G«è3Úbiz¨xEÙh· `Ùñ•sš6:è™p¢_=gF€u¾¨¼“£PfZ÷l£ÊQ¯Ç?W.&GÕ¿—°!¿ïÅÕç/>ÌW1D%}'a2ç÷Êô¸$ á">åõi‚ídQŒ¹3o?åèMÂàÈkl÷÷0^|Þ²D·0–ÝÓ{ùªÞÅ .oO¬­3g\[Ð[ì9^`¼!(…÷Äû±3÷'çE€—·¯Ñ'S6R €Itþm €ïqŸs#ÞŒÜéë+cWçD¹Ï—õꆥ·ðÛZmYtî'Ùj'®œžð…ŽùçÑŠ;¿S©[?Rèò6Ó@‹RYȺ/ü飊fdžâÔYloIºÜð½(%Éúw×gªð/a£ßÖôªóƒj8›6RKÕºZáºÐ[ò}l3ÈÀM_²aCvöÜ [… £bˆsc1`Cj¬v›¸P³õ\öšM >¹º„ÔÔò„cîü%½Î;g9à]`ÎûÜV& ÿò€æ3 ¯ìÀe3€!n½9p(ŒºÔÝå^k :-„bíäøñ¾c`ôµÒ¨=?ã4¼_þ"ùVº]Û÷ö8ú"âð¡I²ÆöÏŽÒ/„ÖìôÁ,Zgæ‚Fó ”v·½l£õpç¨|6„µ‰HÝ´^©nF›ê¦§ùöÌZ“ÿñ¯“Q! Y#ýÓ²oÅ@kïŒø€k*Ó*Öšì¯.ºã†¢@0ø_ÿ¨$h¤"ÈçMÛº""pVšvgä€k#â£WQ¸–ù…ÌÛkúB BP:në}j2 êÖBý8À/,¼“@¼¥YrCНá´mSH©ëï°Š‘¤£³g„\FYÐvÜòbáñÌ¢™Úbgt†ȃ±ßH’_ÑM"@n@†Mw ŒŠ ªÛÂ%ˆˆzχ°ÐjŒ õŠ২Q®Ü»ìÅ%ßpŠŒT‡ÖÈ!nMPê~ø”vðd4¢hÒ¥«·¥Ô¿£”pL EK‹e‚UÐeƒPoÝñ´™+†³m¡°ô »iàJ££w4‰bn—5ìU ~\4/Ðn&Æ3æJ ˆ£Ô±€¬ó™-êÝýíiq¥¢'<áRDF's¬XÜO]̾υZѹ[PøŸIÉ9º†PÉT¬²Îk¹L ÈŒM¾Šý %Š™Û`½¢=*Ù1{êYð‚‘ÊD¶å†„AÌlÏ"ú¨ÃÞ‹£3üµ^™FJçIs2…Œ«D¨5_l5¾ãˆªŽoÚCó:zŽ…r}£'ŸÅ5W¤•0K¡70zdwþ¤6–f²?I*(JOÑ‘x$Õvñ+ѼìÆàb(Cm-£D¢£Ïâ¢y›és÷Ä‚d´zuuK¢c8‹Ñ4ÿ冀rž®gÿ3cÇSßÛ”¨g÷ž:ÐUqšZD!â„Q2mÅÙ¼e‚«²ÑvÛÊI†-Ø×¹ŽA 9øŽ#yDš»»ÕŠÙt¸%v•4™èâ½õrWhË¿µvê€YWœy{D![Fìlø.áÀü>ñy–ÉÅ[U+‚²l‡ ç`$)¼IîŃ£q/vÉÕùqò¢Ù^5‡ŸTlH1uÜl:«Á5€ìê¥M(±Wm›iÕ®$¨3ñ¤!ò¹­ãxPÅFb¤²ÇV­o)(â”äerúDˆ#¥šˆò KÝø8ïbcü߆¸Ðâ{¢>0 ÍV æm ©r¥ ©£Š“F雀ÄlVDæ˜t?¾Ñs  QRcˆ$ffUU¢êñª"ô-#D «õEç)œE…5+¢›îCp{Ðç…1UÙŸýM¦Ÿ5™ß™S-–"ï *`”äu÷}ê8€r_â©MÉB‘"}@»2!ˆ„,çWÙWt û\û‡ÊWÏ0MßnÞš<âÿÌ9QýHÜÿB}LXgœvk{Șlno4¶«¶ÙP#yï-¼'úŒè4G—È€öÄ`–ôWK&÷mœô)µ>bç”IQK€¤û*“s³`åõ˜‘ùàB‰Yh¹fT[7%[ÅR¦³3.›\xŽZjó<«€"z>ŸÀäæe{ìdøå|då¤ÀSb”gMwÆ×>T)OœÖë'у]X'Њrņ™£½]´À]¾t8FÙäw'ùz¢ŠÅšUÌíʃãA–sÈ;úì²ìŽ÷h> çÊfEž¸•nœ…EE‘È æ¿>ê{/H‡k~„ܘÁ³o•ö÷«€i5ÃQ\d›‚äǨ!K¹m.j’O?2à†\ó#Úy¸r âêZiž«-Þ›µ ®$XÀMa¼1ʲœîÜ—+&kZçËqÿ|¡êuVÆHþÛí@!¨{UÖ€9 ›a¦±z„¿Zµ}fóÙ8 ¹HÖR‚ ¼–Ì\í8ÂXÕ‰šKGʨ  ".úJ@}Œ'­[6¬f?”Á‚·Gb/¢¿ðdžOBxƒp':½óÊY³’TÓKª‰¯ÃÈv;šþL8kéºÍI¬b®¤è…ë˜o¡˜À‚˜Ft¾Ç¿û•´½È%úÞËŠ8¶B2nHÝsåÇÞîè ad7ð†721LQŽž.b—ç³wÊfâ»9¾]Æñmj¥ ›‡™ßšvã’÷*èYÇ%XI"RŸhìcåªèâ/w¤ûù|"âãaÆ6ü‚ v)š.0^„b¼bÆ@5’¥ï¬On:`¾m¹¾}¯ßr2‘ïMb·¿cm¯:OØ|d%†¯|>ŸÀZqè¬#¤w…{79 oZ±ßg$?á¿Ýž¨Îô[ÎÅ€;6ÇS]?bw/Î…Á8øo'x¿êöÕ€Ô`ìê°}¿KYεíSföõØø’£ôøV¿Æ¥þàYúĆb§G¡—zD½¥>à ˆHûO•Ò†Ûô`VñÍ©nißjççb°Õ; ¸Ó§@È< “ª'ÄlÉ‘ÓX¬P¬Šþ}®IÀ¦ºœ ćÆé 9²®ID$<]ÎQ°¢©Çš[¡®ô±”‰qo¦gPPÿU”ôÚ—8º@ߊæ2’øáBmjùu1“Ì‹-ŽÃȈŽiEwÚè¤l½‹³¸Ð‰è±ic¨”sàÕöµÿ#5¨änÊ™€÷QÀØ/Ç5ó ?ì!%? TLd± ¼-½IÄÔ.#^é´FFYª¢Äè2zPb]K€ÿâ`ü¡’Û‰ âïëºòêQ†‚­;»7¹ûžHø ö·ØÍšÓþÏ%—š>þÊUEpöÀRN—æð)ê’Z!Pónƒ†:ï»ÇD•D´&˜ÝNp;€ó<ä¤È™æm„þ\«ìLA?Qs²Í±î`PϹ, ~BçÂØ“G£ÒW;ìÜ~ê±›V ï©!?€r[߬éi°²ç¢ÉÀÓÑŽ”·oµDŠ`Y<¤Ú]ºÁ©ÜðdÖ*i(ýMðzÏ?õ¸Ájªáp$Fe£gĘ“7Î×Ò¹òO!½.HšÌÅõÃ>ȇç3}ðKFëL§· ä¤$ΟÏ c 2/øaÿèì±Âq}eM#-7ùöv·ñ´W7þ[îäPu9$CÎdrÑÒÒ­$ÝvÐëå¡óMÇŠh¸92Å‘öàZ2ìMÅÉÐbæïrL:¡ˆ¼57§(ÞµGïp¥>zª'–žO>ƒÍNôa䂺m6ò¹¹°w@Úÿ#¿lrb!`FÔbß×kä¹ÌHµ „l )–óÖÜ„™P ² Æpdm\šWm:ƒ›v Ú•3q›q)¤J(¢âd³É1¿'Ô<¼åÓo!i4D[=í×½Â@.JfI~6EckȦä2ÏÄåò'SGáj;¸šÒÇššs†€Oc`o%ƒcæU²ª¹„rnÿsñÀf ˜à¿$:/BXã"0€Åy’.)?¶®Zi"+ÚW´å:Ò•ÈVæÝ-8ÉÆUF­õ¢•Cç¤uJz«Ã; ÌÓºˆ1’$z>€ôA]W1PÁåñ1äØôC„¡1M¢l@ZQ1°Ñ •ÐI?6Ї » €Ü÷ „ì½RM숧CŒˆ1âµ)áJ|-.mu›ðÉÐ$‚ìET‰Óh,–¯UY “°òkF@ðÄÈÏÖ¾÷®ïZ¹p§…ªÃ'Àôq»à ÅFàm DY¶D|ôrFá +ˆ5b)¯³‘wdzæEåYg:_vQ]ðmýôPÃpQ…”–‡¨G˘q“€«ýG)ƒØ$âroA•hSW‡ùv¨+KN³zðúžx.M¨îQ[&¥ã ™rÒ¡/_™œa¶.%ø5q¤qvl‹CæW§§˜KöLÝÍ>¬9ÆÌfö&Áñ4ùtémh,TŒ‰‹‘ŸE?쬂e\2 Lé &Æ\—ßzÁH ÚVVwZpqv3ëx›Ä¼n0û‰.ÞãdÂêžʇc¿1WX¾FûˆÇ&•¯¹+J‹äž)x½¸bÈüœ÷ºT)Ü­K3_g¸Ž,¶å.⣖T|+ÜPRåÀG€ãÍ>ŸcŽÍäY_²J ›ñb¸Î+¬Uæbïî:;‚(Z«Š¶UšB:Œ)íò|Hpe.Ç“¸·£%Èd·îÒ—¡Ò+5Z‘Û¤“Õ ®ÛŸÉ†çˆ4UÌYIgæí]bTÐÍ¢[vw?—²±+öé,çó&öô²Àáá QE§C¡Òœÿ<òžÕŸQ®_,:_¿>Êöòµ@8Þ&Þ>¸’ù®ç&•QmÄøîéFgÛñú‚ï=Ç?éÒÈ”CÚúDùÇüïõ÷ú{½íõ€Çúۮxð/¿èT~ ÿþûÓ©ú™Oð.¾êë_òz¾Sû1žý÷ZÜsÿšþÒo|ž@ô|>ŸOö`ÿû￟~_×ĵÿ^¯¹ë-Vûx<ÔŒ@Ÿjú÷ú{ý½ºG”ÒêÔÔ-þ–ç_x/…»¿NtþgÿÉÁçHiy‹-î`4‰ˆšÊ&™GºÐ¿ULùGÿ?xތɞUOœ¢!»þFU]Î3±dUÆØ¥]z*{b†®.XØjá“h)ω%Hß®x§›Úšæ ¢÷rea‰âmëîcq®Y­âPïçEÏA6:@©Ó–“#·˜/©€Ng8½¨$ # ,ZÝUåÉ©¡+:£\Gø ú¦îh{µU™ÜŽpÈõD§ôg=•¹ˆš`w‘uGZq ª‘ß žZùnmìxÞמŽ+âíÛ.éeê¥ tsÆ Åª×µ™pp™(q.jöDrêÑ£LÄ쾤Ròß+Ë[£‘Ë-õšÀº Ù¦ñäñC~ŸÏgØžÒÿ½£lOЧVrFùÁD=ÿÒÅ…%¹lúJõ &…Ï4µ áÐ^Åbº;›ÔX߇Ü$û0`²}øDç5Të˜$*8NÏ¡$žwÏoª¿ú†×” Š2_X–¯\­’~‚6¼ž¼ó¼îÏ^þø ~¤j<ËTÜMGû?Á§ˆl(ÙäQÒÂÿ¶ö·ìKöŠRåo!ZÊ&¼ëf/àj÷;=ú¹*@ÄFýìØãïõV{ãgÑ$ÒØ_r«{õwûÍ?säuÔé%:þôx ” xÞµt‰œßßñû°|öïµçÑùªÿi ,q¬:”Ë«'ÇËDmДrĤtš?÷é…~õ9∶UÏöoby¨÷§ï!¯¸ 6ÀLãШ¯’>Û@oáÝÁìf$€5Øaºbl ²dóó~à£r´*•Nà)èAÓf&ÂåG Œœ·²) ekáÁ»»õf÷ù‚<’ŒƒjOº˜Ýj+×êàÁÄ^Tøæ•‹É{=„j€zl¬—œVûÚÞŸÔ•ý.67šmÊlŸä„µY|p¶¼Þ 7O)ðcž3Q0èºSÆ)‚Sé;²>KåPeUÃd»HaQ*+n  iïå€ÙÁ¬› <6Çé$†¢éÜ ÈñòwF¢öp“!ÁAQðàNHUÓÈ&FÞqVfÀ¢RGqþ°Û[ZôÎDcèÌÁà ٥}Éö(M<àÉõF;úI5ȯâÑÅ™uÙÊQÒñ3Õn¼ùdH3ï¡Ö­”ŒV7ÚM9-W6 1Ñ /Í«¤ëC˜ïJk±/~O±¢É„¿nI6w¯³€„—wƒRJÜ«RÚZöîùf+†E&í£>ÍHÚRd÷œm‰»d߈½Ç°iJt’.(EÊ¿Gðe f+l…žVömlr¿.êmGœ4k¢°ÐzÚË€¸°jNfÇÊf[ºjûhûw³˜ÿ €c”º=×Kƹª_j÷Œ~fCù‘zš-)ȱ©—fÙÞ””ûiÑ—à¥f‘€aÅøØ_ÏÞåC£tÃÛ®PõïˆÎ]æî=sK:9*ØÀ@˜Ù³• ˆ]Œ{§ÁîòËœ_k@6%︌äY8U¤˜Dô%/7ö(Á4Æâ£¡.Qý+Ø¡¥.Ÿ„,ÿ×°?/aX—ˆ¼` %ˆ]yòc Nf3vŽS‡˜rɱbßW°ê1œ U:1ÍÇZÚXmÒÕ»gU‘3rÎ1É­$ŠUfš7õðÔÏ×<¶TÑnrMÌ)¦gŒW| 0[> b2³¿Ü)û] ^,ùõ!?~÷8ä)¼;–·Ç~~\$Ô …Ÿašâ?¶n‚÷Êcåêì^²óÒaì©>»ËSˆ˜tšžã¦äz• “M.”M¸n3%ï$÷£ÿ|õÄIq°Á[±³Ï •œÖ¤ >žC³ûJ;ŽˆYZˆæÄD>yG¿j'Q¹º£ì|l”±‹™Èäè¤ñÊ4†ÙÎlª)L!D‡Ð×¥/>MwÛáÒR•…ÐànÞQ•Iè<«äf¾ÈŽ­%ÉPþ®ªˆ¦yR”f A°ÿÛª#æ~ÎʱE‰âÆ]y„zL"ó4â÷2·ÎÁy@Žâx\ç|Ý9¨˜âªÃ¸ºýžìÐ#Hµ’òÅ·ª_lÐŽ`Ä3Õ2z¸X%ÆZÇ:ǽ NHª®R­ õt0"WÀßÈèUúû‚®‘¹‡íÚKÔ-¦0Ú*öOë¯Ù‹Ò–&гoJ®s2è(Jš’XµW$%í¢øiú(£²ÅŠ”Pˆ3ô1=Lï ƒá«M…éSR»@mMªÛð½_™dÌ® À´ö°ÚEëbVÞ”vSËŸŸSG–„}ŒQê€È5ì΢[ŠwêUzJVÅ\WJy'Â]Õ!ÙA À‰ Å*)il%¥mã‡ÛõiD}óäÂGÄ›$\õø¨#o!{ 4"”wð;QJ0zº÷É­°ž}açmã×5Vº €·txGÃß–è¥\ëßéŽü}ù4sÙâþ´¥¡æeS³-ðÚŸúñ¤Ò,ß¶v„[«Íü¼Eÿß›i[tU˜óïålƒ·±õáÃèù*×s àšë¿|s» ä¹!ÜYeäöí»¶îkÎ&±NüŒcøgØopÁßþ4yû }èÒ‰$4X¶¨{J'®•þ¡ëœàh€*ÑuÞÞ+végŠÎ×@ƒ}Œès©ð\Øàz~¸TN` ]ôÓr¤,ï(°º÷Žƒ¯æ}q–£zã¨OËŒwüD${4¥M îí¢)D“Ì,«,I6ðV®aw—ºrV\úNYÏ©êâ ÷ûî—‘-¬ïg¨óKòÕ__4èéÛr2ö¿Ùùí5`JËêytÑ+˜y†æçZÝB¯#D‰Jf«z¢<ÓJ2åqåæUÌu01‹¥6ÒTši¢ÑKõʧ-Ó9ê…žØ-Ôí3ƒùÛo¶ží!n¨¾…-'ý+§£´msÖrOè°y¿I((d™·Nx…ó"©=ÔO?~a•eJ/Áå.m_C³£ùËd0Ƶ¥Y.z 1\Õ‡­ÄÅ­kݓޓŸís«ôÛ‚õ©)ß‚Èv9‹¢íõbV‘Çõð,;z®5.ê±t)ͽm_WÛØSó€´Ùö®o„’:(ç;aÈ€mzY/”ꛡ®ôƘÑÛ®C2É;àµ@^ÈëRI;ÞK¼=œP[Å tK6ûq鋼F“>d¤Ü̾×.ŠÖ;bRr˜h®|©2Wžx*ð@Ä'ÿ¤Ö³G•¥r¥{6?/?<€ß,:¥KuBÏqp˜¹ÊMn¤å-¥§í¢¯)ø–¥=èdíY0/ìD“|À«–Í [<}øZ>Øz7À J£„þ<Ý@J^JXÐØ0V—=£Œh ï|ízˆÎÕjG:DHO=ƒžª·;S—ª¸À}oD“¬ Óvû•î¡nÁm&uÇ{‡hÌhQt£çÄšht HI µ1RÙ¾C«ú`Ž8å± ± ôA%QC’ÛÌ_ü`È»¢€ ê­/Q6L:à;N¢@v6܈:<8’ rq¨ 5¸¸äÌñ‘ÒžJ„Oã]¡Ù—ËHrÏÊ]sjiÐói!•p€ba”¬A+DVë¶íÂÒéæ´2¾lºôé#¬/1)æp€o•¼↑ÜYŒo¥Ö óáú§ue⪡8+;ñïg°q“±®k‹ÛÓ”˜—dDVº8Zq¦3ñ’‹ŠIÕIj«ks\ËcËù¤<Ì®Ÿ8?óÅž8£—k·o¡Þ¤EºYîIj_$¤nµÚÁCC@l"¹<k’'Z™ ¤lпþ(FCUÊß-:?1‰Ê ˜ 6ù0BeÉxÍ.p™`êFþú}õÅ>€'s{óëX½¯ËŸRq´U_Î'ë JÜ7×›g“L¤ÎÀ©|):`HlhŠ €Í-I*IþnÓ\¬„8ÛõŽ©rÊdøVDÕ‘³/bT>OdÜ&lêúÿåùäà}â6K ÂÜ >9jSx†P>šI6<Ù§l³šÉÏÓ+”6’W:‹¾Ð¯ê#•}ŠM\aWUcò-€´1Áì–1e0ÅѸÈDK“3¹ti¹ÿB˜3‚zÒú*A&“5}øÓôrèä± Ž\‚@‰¹ ¿…°¾Ã×T“À4[+~˽ €rŒóA/üç4“ $¯‹Ë\ÏèܽÐÈ@¡ó&ÀÊîÊ• _ªäñ`ñ¬¨þ^¸²Íh]Døl~"n‘e¸´M‘;† ÛÞ™ÿ16TÙ`{ŒŒ\%/Î}ïq K €‰©òü‹(ÈO¢ÕÖÜוʺ Àz `:\'ëàwˆÎï2.l5³+f *ßÚ¶†n2)º ¼#D|_Ò*k„à°î㺷æèÜ”pÀs]*Ù\ŠÚÛ§_´’ûQoqZ ÃÏ!êþÈ:¢àô¾¿¸b0tî&€©² (lB*%àôm2™‚…Àîq=y«÷ ß6½Fv¿ôÞ|I¹]«>ŸDÏ*ߊÐIQcÖ\)°}ëE²<&¡ö=‰dÕç~Ïsæ˜Íx…ªã:Ry{êr“:Gæ&£¨o•Þ¡ÊŸáæ…}‚~4¥ãb§È ¨MÂFD˜ µ¥Ò@·¥¸ÞœYa¾N×Q›l}eû­—…(ŠãY#ÿ‡Ê _ÆðKëÐ%¿pìÓ:#Öm³uÑ[n ;uöú@#wÞÂeÛø¡`¨¿[óÏ鎌ç·sÎ"-ú8ywp¥ðê;º#*O-~h{¨½}ñ~âéå°Œ{b@ ›™Ðb»Vú Fë ¶ŒÐ+ƌՇîž6Ñòž¼+Ö}çL”Û’JÂ=ÑÈUÌ4¶á£÷Õ9r—Õ¥(¢²" ޤ*®$/Ï.ZÒ^¼jôìÈ@ÎZÚÏÿšè||ð…åY•SÒpe”}2îCʈkë®§m¹±ÃW+£ŠzÅŸ‚L¸5FQÇ”˜è8@Õ²@Äg˜b-ù Fs«À¨/æTöwpä}Ú÷òÞL¶R(Ý6Î"àPeoðÑX¿<2ò‰<´Ä[yNžìæ‚®Ÿ pæ˜HºwØÙTª2Úÿ›»¢™_ŒX§¢†ã [H‹3.US6× X—·LÉx°ó Eý¦ŽÃÜ~ÍH^tÙÅ¡Z9¦»DãÏ´"vÿ’AZ{}!l²€K1éjûAéçH.¹0X¿4ÓWæ[^ëpW`W&PßZUEY8Ì+b§6k –çóépzP»%` t]ÃÁsZ4®Xq.û4ö=ŽLÀQr³œÆ¥);ï³¾%<žÁb»ìSýæ¼\†æŸÕP»}z°¾«ºØ)’‹‰‡Ú%êØ¥§±5 wÏ6Ov9¤ý:G¤Ù°¹}yýÉMD ± ñÑ lóQß|NælÃÙ©YHâËá$‡ŽA!cW~b©Ø¾Çàl53šçE§¶ %:¦ì ƒƒÊá[²KnŸû©bNèñÞ>þ—”PZ]'GÚÐÁä–ÓÅbÚ£@±cŽ‚lš4RÉPÖ²#W᪗ƒ¹A‘xÄ_„Ö »Äy©§çç SÜ?±$ÂVBR‹0i%V‚‰Rcé7õ€3t jô+üêOàňt¼ ù4× Z‡Rä+“`Gs ½Ü©˺i¡’g!5{FA¦Ýù¹× \ù‚¿f·¨œp/zX¤ò¨CjÝýÁÔÛ¯öt_m7Ž2¾h³yâŸ~ÂcEõ56@ª„‘&1ƒt`„·c µ@(ºk¿:Ūy¬÷ §*ñµ²Ì•ã¦Àï5Íh¯bEêÎ0iÚ1ÇV/)Þ»ŒÞ½ÍµTDçJ†ÂÊ°ŠØ½ÂÈý懡+J0‘-·qˆ5JXƪR ]›l˜]©bºº=ñÎÁ'Ñ86xÉ*úÔÕµGLA=?„k…ír¸'~à2y%@oCãþ׋Î/ý­Ö‡ÒÈ­¥D¶NfØ1(­£/Æ}$8tÄù#˜‰.”PÕ—Dåg~MËy+ŸV2§ÉðïUßáµå׋|GçcK»»&—ÛÍžr ³·ãMœ· {H J”pß‹ïî¿¥„™Þà 'cõ£s¥,j¶ /wÄ^¹Õ¾d‰ðÊ[ñsG‹ne§´²yIŠèÕÜù'=ቶ_1*ØÝ…ͼЕ“¨n`ôœ¾kx.Iö” „h¶ôUÀ¢ eð´ŠeâR£ük5ÿÙõº"á·í˜;¤pÉÆ”)ÛÄš0œq½/Õup.îšÜÅÀÙ®Ûv&/ˆcQzßô:W:RŸ´a9Óp‹¾Üµ±û €9nBG¤‚ÃõÐ6îƒÑ¯]äœ; @ØÕK@f¯üÎWߨÊî;ù¾¶Ø–ã˯pFo»Ík«Jo»ÔIºbß³ºd €¹´ºþIhÄ\æ!N èBë­ÓÎ+{æFúÎ`äkU?ìûpä]øòHsa)‹ÈµW»«  «£PnUžÚF¢¹m±®gia×L\3\}ˆ:/oWBèMt>?4Ó¾ŸH W{4s$üåÑàÒkR µ¼få/¡HáÇbÍ>ܘ‰ŠÅr¦®~Öïȱ8Šp_Øz·ã€O?Ÿ×ðÝôS Ey?›Ö›O¹¯)oOÞ=g²!¡Çg(S¼À9[hCªÞµ¢¼©|D(woÓ´ï¯ßéÕ}χ€@ô^ÅIg!jù¡7l^D£åÍfvÎÚKœf~i$C¯= еùÛN:øDÕdŽú7¯‹ž« S Ƹ<`ª#t©›ÓÃö’¦Ÿ":¯¿÷¦/p—ÞýˆÁ®înÅO+uû¦(Þ$Z=P#q#¿ä€!ú(÷ÚUØò4 j TÚ^ §6¨ân¸ä„l´ 0ÝÑf5N=i¸5?WlÒù¼€<˜Sâ÷{ÓR¸Š:Ó+ÐÙc'‹9Wòÿòñxžb ý÷ hq§ªM@LèXãé‘Ö_Ä¡žŸÆw0Ž@ñÞü-sÛJûJ†ïÅ\ù¬áB;;€µ¿(MXa[ËÁ…9‰¯<„ú3‘‡ˆŒ ·ìÙŸèúÈIµˆíN~ý®R1¡Ô4â>¹™-ï96¶ë= ½ÂØLò8PïÒFå/?q½š4"Q@‚+Š€§Ý úNmbCÒt˜îu9ð¢n@h†Â‰r^¾N÷rb“ñö&wMý½Fwb$7VC’8úìˆ9ͱISL½à={%êížÅ£˜6ÒG¢„–©Öǘl€®ŽÔEü4eÄ2\­g„{»wä‚`«X‰~Jz/:á8•NVt4ò…E)mÆ—SyÛ`ô· rd­•Ço‡_꿤ôÉh½vÊ3vj3‘3âârg±ï¼bËGi@‡ JÚ»ˆoó¢šjâÞ¡!‚lá¬ì‡möˆd…¡‹}ãöç=탭úçy"É"©‰Ðø$hbh${o‰Çc·aûUý‹®)+Xuôô(ÅÎÀ9ŠÇ à%Ú*æYí‹\#™w–k©å¨ÍÞœÀ b!{/¶Æ ~¨Â§dåsJ3EûUSã6ÀEê‚o€s½)wÁÕâ«;â>šÑ>à¦T²E&¼I;›útÒ|h'9¡rwz¦Cê+†À…” !×/¿‚¾#5™7!é.Ÿˆ é¼î±ÖÔY'yù±r7óô£\³)?M}BÃC¤œh‹¿¸Ê]üù‰Í¼Åä_d×J„çzr}/dc‡wÝædÀ4XUB¬óqR‹x¦wÉE¿kuYÝ›²—ñûEç#Í[6%^ ¬‘DWD¸ÊVÆ{øu>ŸOR O܇˜ ¶|T%ÀÃI ±“ë®_?ÄŠß’×Å 0Ôaø5¸Lrê©póÅM9 §Ìº£:àH|1Vö§&ýg³û²ÍÿB{*é®s¢.PœiËÖœ7”ËÃa¬ä#{çª0£óda'³K·î’YÝŠƒ·š!˾óœ-¥(˜»àóø=çYü¬²ðV±Ù\€`Ùõzâô_gv0sUu'UAÅä´”Ó,1zX½#: `cR‚E1J„'E¬„Ý’¡’N ´tûIDŽõ¼Øì@‹ ·¤[§4˼u¼^ŽWê”þÊ;ëè£Q‘®hÅeÛgáN;.óW`¬¶Qí±EÑCæâå¸Qhñ· -ÑSëkׇÀÚ0,ï®Ðqj'¡s™î”2àÅ+¦}Ù^,v+sa÷ÙkQ@€‡÷ ÑÔva,§Æ°àÈ1떲ʧ¸¿½ÇtC­5;€ÃMð£‡lñ& €>ëF®Ç¾(‡s1Í´:„¥~‘Ûl˽.d¿t:J៟ÔÛbcÜ#j Ý0!Móý?*(}ýŽÛxóùÛ/^à;q8[ø7‰â _ú{]³g×€„sú…×ÃZõzÉþ^Æm=Ÿ„(g¹þ9©Ïó,?Ù`]<Îÿʃþó’W¥Ä^è9ÒYÛ­²ÿ½þ^·fCðF-Ô¿×O =ßÛà']’ðÅ;ºiŽÒUˆ{fÉBݾ;z'aŸ?È>šÜ´I ®LŸ‡­‹·Á9œýF^žŒ‚r0gÇ bS"äó+âAÊR ú¼d-¾*Üqë–ªáÔ©‘‚” wJQÍ» v&zÂHá›\¤ÂÝ<“ž ìÂÒŒíÃé4Г17ú ìÊꈣ jEÒ­àrW’‡ãPUÜ\87m¬ñ±oöãb".+¢.c4ˆÛºÿðtš®+ËùÅy×-ñs~Ž=ÕÍž2nl>dÆMk‹ÑD ZŸ¾ÃìÑ8£#Äs§P<3<Õ68“Ûsa½ZÒY ‰’nXMl¹íïRZ1ÏM—c‰¬Mñ9·wigª¸<á6ûÌyʬ#‡½Sñô£àÕ2íÜû²“œasä›ÍŠ<èí­…œ°¸÷ÜígY®&ïôyº\॑³8Šö‘»S†_ШNƒ ÂO‹Ž<©ßã;˜èßÅ”àô+ÔI¾a¨Àœ%˜ÑðM¯Œ§#/è=/†Š ÷>a®®ŸÛ,šÓÛAÝ#tR‰¼RÊ€Ñ( /SÈí›oØýDú\=÷7\IÅúZöÀÇöøaúºapäï¼°·Ê°’˜¼GÓÀ8r+Þƒ†»ûÜ™’qólÙ_F?¬Úô°•œÑª)ò[ËS ‹|½!Rf­+½En‰B‹ZùHÀ$H|šis±ï· xª€Üj˜ÎjÞé,:î"F+ìâ™fˆË6ÍÁ†úÐß NÍÈ–^¬Ív.ùeœèD)ÑøZ]ö½{I¢Ü É¥‘…¤nБhÜ ?§Ñ” /ªP.i«‡T%ßN¹PwdùŒù‡r:{ :§CkW‰+éýBÖ5ÀÒ®ˆtAs­*e唹xDöø›Æò4~(•ø–«Ï‚ö0pªÄ9W&ü]ŒA‡ áx—Yø>*üpÒö»ØsGw®‘ÄãÜÄ£"Ï6¼lÀSjä>Çp ¹`11­È 9;Ð<À]MÀGNPŸ£à<æþ·DÀF`9ý¨‡e&x‰SuÁƒ€É[hÎ¥= ˆ_*º‚‰G¨k:#,ç§é%=ÔfaÂêÉÜ]Íǘ Z(-Ðe’eùhå̉ˆq Šý’ÐéFg‰“Å“®”*'(1ã9…\Ï-F¯¿b»â(Açôغ”äx%üøØü«ïW᛽¥Ö³2¶ôMÜræ |s“×µïö­GáClsƒÙ¤ D•Õ£oŠÝéO~%ÀEAi%D }ä·EÄ-^<‡Pq}FÈáy@bÿg~€÷þBJ ÒO®¸¯Ì""k5ª'(ÝaÙ|!”GçÍ9äÓýl4©ý= ·5š™$ñòÙQظ}û<;W‰€6L\yÁ<=Ï ŸŽå€ÇæáðƶÙܨ~ãËMë—ZÎQ¶É¥ÃêFH̯cÙ[.˜éòÍxf³–]IMlôÆÚL>N€wß©ycîÌ'?øa#U’<~7@ú6‚¶Z:·ž´§‰W®Ÿ€ Ã0B«QffY”[ ¿×Ù…¹ý_gŠG€,›PÍÚ•í¾93)5øä5Ñæ þëEçÝ 10G’ÑÝB$ã~D§'åº3-ù­Ä£/ø{}ÚKÍ ¨½è³_·´€þº×¯'‰=[³ê3÷akËF¿}W´y×Ï2Æñ €Ú?:ØÂï26v€Æßnþ{ý½þ^¯÷{®?Q‚¿W%fø{½1·ßµñ§+÷YOòïõïÌiÉŸJÕÍù$Ò‹Î[Bt`½SÞÄcÞÖy0ô“6q›Ž{üà«ÿùÀ®ÙŹ?¹ÐÃÆÄ—<´…ÙXj— E?Œ]‚c¬/†;£âä-ãª:8 %ç0lZµSÿÛ?—‰ö¤8(†Ý® C Ñö±ä=SV€F¨ È1JKÑmÔÂ<é a-FI\—‰à(‘›M´Q-Ê-‘üâ‡`@/ð7Cþ\”*9KFÅ–ÓA¢F"É¡Cµƒ¡°Ž¾õÇ&ß…L,IýÓßÌ~¯-ZhVs\§­ŒCuŒâŠ×Ϧ™1àšûǨ¿zÌws.µ¤X_È›§m8Ó)‚ ‹6°WzîÈ‚/Ëgÿ®P(nqö¨kœ}¡›dü:«¦Û_¼²s䵡»æ*m¯ ™”2-I#"flÚØUj)îWËnd¶3s¯ß\®ÿ6þ=ÚÁ#°4èó÷ÌÒù¤6ée?r†6›{ –@}RŽ+Ì=äùÙ–ªNjÐçèøKE¬»Š@µçjr$¥ül¢¢bwaäÐBbŽ’ªlÓË6Ä6æ„9»W—)!³eyEþ<3h/¬C¸âÅ0>™Æ\ 0¼I•ŽRÐRêzq¢«º.#P!Ì9Ù Ç ú`‰tF%€,Ç#3=Øbò3BF$]8mL¶3<â¸e¡áNª‘ ¦æ‹¤Ì—€+…´wI«½í;¶MöÚ8ñég‚€üÀ±ji’ÍéÁD!¬çÞžBebå˜a, måž~K2Á¾²o-Þ˜xŸYt~ýíZlHdI¦¹g*Œ–{ â#xŽúЉ2Iáh/E‰ⵓ£$~Kêÿj8è«‚æûU1Ök‡YÝUA4Îk.¦™fJˆ±;ˆü`Ä#œ“I+Ù‡„X¡‰é•„òåqLŒ]hà…wTTÑJ²Y £BUÀTU¨ìe§ÓÕ…TD%÷p¦“0b;{ŽiP²L¦É€¤ÒCxTè6ã.«³mÙa/¥ˆ´“•$W”rü±KäÓ0l"|XÙ8d¥ZûÛT@‰›HùŸÖ3ÆqðúŽ+:ê›öÐ`€§~õÀ8—GC û éúÚprSŽU˜¦µáåÞh©r‰3Z½¤T–Ø+ÜR¡Q —Õø¼x€^e=ÂîÝh€b¸™€’=h7뮄P.¸ýº§WÔ(¨H Ãäá:1£Ý*áCôÊîìtUœ®ùS:i=H壸f=»ö4@0½m•¤TÃmӸIJŸwFÁ PÏ‹ |¢éA§Åk‹YJà&ÛèeE7†§TÛU¡\P/É HxV?þWº(#©ì'SÆÕ'Ñ?àäW¯õ£bßÚ+%9¶Ÿ;¡ã ûH!Bšº{Ùhÿ$G|Z ®8ìU˜Òš¯AX Q¾œ‚,‹íáã:Ì=JWj)ÉçóUÊÓ±Çía%£Y½LgøXAÿ‹OZ=rhO‡XÞwñ¾º©P"-C¶ÕÌZ³`_4ŒÇ‹`©R¿wá=2c”¢uæx¾jËÎìˆ-ÙØŠv\ëj¥rêÕĨ۲²æ&Ž9 5›¤k@™ãR¯Uñ6½=€SS=GU°fŠz‡è3P>ÓZÉ}’ÀQmUסvÿOíï^oÖ¿!:¬¹Œá¨Ã+†hB$›äú`QàQ ?jU—ðÑl=~æwJåíÿïyáµßì $_ªŸ=JU˜±€}ø#þœ‹ñ›¿­í+ؾúzGOÊÙÍ„U—Êg|ÄÒ¡H­Ÿ‚kýÖ¡:¯C+ê×SÞ³8Q0êýðM›=ÔE^þoˆ1€Þð;¶åK]a/÷Ò‹lQ»°”ô£È÷ˆ¯ò’ÛÕô2 ð óè2j.µ8!k8Ã/yýSê׌ՓX¥ö Tææý×^ €Û`çÚ¿ï°üägï‚ïÇ’˜ÒÉ|Ôî žÅ&àz¦ÿ+’Q(^ø—Dç7öBë´Á·åZ==Z3‡-ƜçJ e·Ù×ç WbYw"G±`ûËó=æ-”HQdó%%½ûvÙ3:$ãÿ$ÉR}ÂŒ»7êt­Ÿ—/ãÒhê™:nSL2ÌäuW"’ÈqXv¬u¢È:Ò>Ã;bò)â8Y{ŽƒnŽ÷´SŒg§ÏðñÀôjQvç£åºo’Ÿe¢„ªQ¯]÷ü73"\ù„\mcVý–BTx×¶¯Kl%§µbú¦Ú;¶ñ$HºökxRÕE¯’ÌonËö‹Ö¶âΫJÛâ´Eü¡vúÈ›ö‰ó¼úF•%ûò^\þ ŹW”âºËÄJÉ?~ÅLg!NTËšðp奕ֵw¦²Z¹ uÔÛ‹iNi™~ëå@Á•ï§žb‰‹cG³§‚P€¨¸E:_Û«ˆ½¦²[aŠœ@gU§¯ENí€õ\<v1Ž|Þ\w[ ¼8–ü´ÇãÁ{Ú—úË¢T#Ì_M1ÆÞU’1Ñ=ƒ*'8µP!i¥I¤Ñj«'•¿°÷S£y¯çÁ{>"ö…p˱£Ýµ™¢-Ê¼Ëøí–{£½7ð¥ÑŽÍrI}õPŒ;#$¾Ë©ËdÓÌuË¥! ×Ô¢¥÷n¸oÓÈ5¨ˆÒ¨ýONÖÔþ1ËÂå2‘({D«¯ #VX(5…%J`\1¢Ø–î뺮¦µž,ž¸áŒé{Eå ª1ËâèÅÙö½áÉ ³ùš›çÊ=äà§Ù0 ¿èý{gz‰‡ôs@² ®d²†3C$›û !3n„7&1Ê«±”ŠŒ@ÌÔ¢8ç¡ ƒªF6nÐIJ=8I~Ú¹¹[à‚R/Gƒ-Q €|¬j,E÷¼ØÔá!>lúu:6hΫÖ¯ ш£¸ˆMüÌŠ*:r¶¸hj¡#ˆÀÊI–5"õŸÐ§ž"³ìý:Nn9‰®±#.*J»€õß"˜«€ã®Ìs➦ºy‘—É/ÕŠÀXË[‡6úås„´Þ àJÅݪ8bÀŠ"–H‘5QOîvvœ} bxiÁ|‚YTR„?äqQeél(˧¨E¡~4]@YŦ$Œ­¿Œˆ5ðn¬—fîÊT¶­Ó®X¾™Ánï‰ä¾ó?ð¼Æƒß€Ox уø`!b¨zZ”,‹Å]ûØ¼ÐæØ Ò˜;?0V šj`6LÔ‘ÌH«âtks­êÆ>ÌǨäÐÿjõÛDçcóî9ß.¤êVÂ(9P¥Ð.Œ=Aõ(Ÿö±bÊ)Q4õö;«}uþ•ÅgÕ/» 'ú–×*À³AÉßÒL½¿z•0cDðǽO­~½VûøÍSn^ð:¿I|Ÿ<„€€XšˆaÀ£¢tæ]&º@Z6Ró‰”JòµÉqÖbxXÆV¨§Äï·:ƒàò§dêÃ7 ]1¶õAL°2ñ%Û‘[mêp×R'š¿Óˆ³^Ø{©u_Ãgô<Ý»2yÉm靿¡Ìþ¿à飤º;Í~bì ?BÑÇ-Aï|ÆT¿èMÊ ¾¹¡8¢8S@^ðT ½fÁ(­'ºb^¹?/0ÞffpÁÅ3õÉ‘X‚˜ÃÈŸ+XúÎ(¨».t½Ô'E­™Ôf^þM§‹‘†Rìh;ÆÔþY°Yú´fèê ÷codT>ê.çµ'<þkEç§ €Qs ¦_çuñì‘& δ⽺9¢˜†”Eò5MÞ\ÊöÖlX_¿G¢ÑõÓ¯ÎxÀý:Up£6p•îàF #.Ø;Sî©emÝ|zêrCz0Öý„Zøx—%Äm¯€?j‰6ð;×ÍN&bøòºø¤0*ÖúÔçò9ƒˆhªámV=Ÿg€€§ÐãpŽï`K™A ¦IÇ‘QÉâifœãPü”§&4"[¼båÖ›è|Q9|ú® ¹¹¢÷ö^"£@|®$Ëu|@/Ê+wA»z'>hs‰ã~H‘³ŽRg´}tÿ Õ’ º!.§D!:o®Év£ç)çô¾“׸¸Ò‰ÜB^POœDÔ…ðQe~ñ76ˆ dO1ׂ6¹ËȰÿ…çÇ5÷]uZ¾§ŸaŽóÍÀ¨cš°ŽÓ}XR—FÐX#.è‘%,Kò,¿7ÎNWTœ@-¯ÄÿÑÝÛ6Ž ô†®Œº0#IàO ñ#TÊ4`·m?ñè!ŶYn%óèÍwÙ+Æ>>T›‡Ð›YêgíÜÆE„Ît4ã@£²7w§èµXqÌÒ~"ê""%@•ι^!ï0²"'n ·T ¸“~«7r§ÒÚpæFÛ ZŒ³÷Õ–n?iùwqŸA“ÄE8SϤiV¹ñ(3dœÏuÅCv;©€¤¾¤˜ëÞìôñ¹á'íªT_~æY¿#ºR-üun‡ÔAoÕÀäëÜ *ÂÐçA€ç”Ž›´q9H¹7©»ˆ]«"éìjS61ä¤OÊ$îfv£4þt šàŽ>£È‘yw”Jéç@Ë Œ Ÿ£Ú² ÏßyO|\˜<ìg­ØŽg÷/ëÆÂ^þâüU ZLÖw}âÿØ ù;ycJ`æW!¶¯À¨®VÈ(ÆS*eu«‡YÈ´w §º.MzÓ›o®dŸRØ[-¨¡_‘ãvOV¥‘5dxš‹Ùß|ët)±Á(}N$z h‚…Ú`Š£gp†BJ"Ô¬ˆ­B¬Á¬(=*‚‘µìþiú6±lŽV±¦YÔ4ý"×¾-µc{"0T9¤·Ô¦:f§žRËÖùûŸô{‹pÏ662eà%`2ƒbÃɤÆÐgÃÔ 'ÖDÓ0²v*E9O=f‹QÖ]õíQ¥ÍˆÞg8c*ÀÚÈÇÅ=åZ¯ÓÚ nd¹÷ÎIq+ö“À‡Yï[?Æ {7ä,ʟǬìH ãjjãnôüŠçNe€úgÇU €nE‹™Ø¨k ^ºâ„ªïa¼àáœwô*@ lkøŒ²ge9ºúMš*E’ß;Cˆ?ÀÏq ÇÊÄÓR``y˜G¥©æË°)ârRÝë,+}ä3ùüW‡Ô®ûç ÏÇó”":ªÇßrnWµÝ+ß0·~K €Wæ•7:„À­Çóù|<Ss÷ŠÎßòE!»×D=#ü Óh­ÄL¾àõµä¯db‘{»}}z€Þ¶ @öJÃ7.€ºøQ¡óÆ„.@ Œ(Dükaß• ž2]n_g:›èá¬JíÙ>Ê%‰­{Ÿ£­,©(ô2Å|1ȶp‚.f÷ — 0›½oy–rÍ’ü²ÔvêîòV 5¾eµoT´LL3’.˜úÓw„ûÐ_ F—‚0m:^“>Ý÷¹•ùlotúßp! `*UéÞ¸Ç.ÛLŠ«øtË„•ã ~ Éû…å’>åß1'< š%_Âï}ÕŸ&6ðUK4bxV?#*• í’`iÕ(¼Ì HqÆŠ~“­X³’5ŸûB7ê9…ÛY×(qoˆ…'~‘!š“Qp’oÛnjoàoIž±ÈëªäGW–KHÈÿ2Ñù׫%qS櫜 ™Ö.$‘1çÜ{ÙqQœÇ¦SÔFVÖ}%^›7EÕÖÕ‡»úŒ°–¯F 4Z¸»Í¥‘Âæ’g¶žo°Ën’À§Ä'þ)R2RHÓïÙ¥£®˜$ÿ~ùAýÓ5µ•*“f£Ñ)›çsbÔp¯ç¥Dn5§WþHû"ª©ðIWL'µÀâ ãŸëLþÂݲî¸l:Uyõ ÿ[W:,¨v¸é1ÑþC5ƒ KÅ$}uÐø²³sZ°B­êyë}MÖ‚Úþ¡§„B—ó®ZWµalr ÕQµ¨DCª8j©xîî‡Õ@²$sçrÊ«a œ­–+1´9…“EꤰG‰Ó¸Öµ]ˆ&õ(5åîDK{+¦0Ü4*‚ ¬M˜KQTçR[Ä BÈ%|º3—£J'» u|IÊH*ñ„ðÔUb0ÌD}ôW"…ú''u}˜R§ôêê?¤ÕN„ošmÝ Ç~ÙuÍÖü äyÿ”€8ÙÜË6õV8î¿1ú‰ÿ€ZlŸÝesí®ŽŸ{„‹È)³*ÜJÓÆð7r‡D§7:“PîØUtÇNDS‚¹2ÕK'gGÅ$Y“óW\ú?­‚+†àvA,´ûŠ׌flSÐîå®å9`¤Ù‡©C)Ë -öP‰©Þî´‘0IÔ‡w-+ 7 ´Ü»^ê—Š¬¥Êy£ç2ÐpiŽt(wlÇgU :Ñy¬L»r±ÆU¢áé©[èL¯™}ÕüdñŽ·c!g©’Á\nÛ.ÉóTä[³¿˜tG²Q]U8*ŸÔI™wA:ó79k=mBó£Ã…ö‚—<#«5_µ"%„ yϨ«4ÐÑH™¥%ã?xV&wQ.StC®¢¬wÞIßDJ5‘ýöÒŠ(:HyO›ŒBÛ$éVnql\„àÝœ™¦ŽøÆàÖº-t, iüæãõ•Ü*A V)/1¹ƒ—½¢9nôð¾6 ã^X`'i:i(»Z«þËkÓ“ÈY[™6¼&lÌ‹‚'<é g…že®RÄFÞ ûnr 2);'—oT”Q·w0B«ÝÿxéÖ‚9ùá"rêj€ `pe‘ßÀLÜP¿õ¨fÞw½<½Eª[HMŠßešÚ·±,WûM6ô}Dk°BV`£P+<€nZZÖËã %ͦl½§3—tEЬñY›<.Éß)T.#[Ÿe)Qëgñ¦ü’°kÆióè´-~T줌›ßF£‡áŒe*PšUòMž¸¦Ø°ÛÂ}ÚÉUÓÀ(>[{Ó5½!Zß÷Âì©Idïa*ÀÑ\»oçxÝèš³Šß‘-G¹ÞÆ]»R„j6L¼ôf¡¬Å¿±ìÓùaLÌš·<ûÕTRÿbú_<Â$ÌV–WšÏ¬6¢Æâõ%ƒö’BѬã~]oªN~ |óÉÉ-óÇs&0Ðóù<‡>¨¸w®­9‰-ý2#[×y ûßÍÇM'0áâÅ$­÷¯`À¢Âû//ÿpÓÙ¢õ꼨>òkø‹ýõå·^@t.Ju»Ï¾Mµs‘m÷;_´ò áÓ¥ˆýÑ=o;œlÐ(1Hxìô1ië'åÏ•NB‰\æóv®Ô)¾8û…_M@¿ïÏĸ!75w;—Ü 8ï§Ç"Ÿå—·†C¾}ÁTïÏÍ2”/’´d–÷›Ñ«+—½¸|”™“ïRÀ|‘¸zä—ø·¯ÅŸ¬ônÊ"#•˜¿|t•·ÄW u{VT[¦o †g暨ìô\À«C‚· çVôVÞ»»>G6p¹jÅô3¨‹|êQ~]TV ž§½ö?ËñÝq#?LtþmOíFkPþ¨3oÓÚ¡6/“ܨc›ÝžÓËl×Ñ=Æ_÷5z–Çï oÙ‘!¨[Ô§‚GDEt˜en©gjJrXPugä½WÅ­väAo"ÞàÙO|!oFëÅK)W:qkÌQ‘h–C½›uUkPÛhŒJOžò+Œ‘Ç ï1$_ìc‘:€íÒ+Í:¼L—«ÊPàé‰ Þà ¬¾g 1¶ÈO¡ O°ý8. ñÑ:^Á¿Ì×𜠢6£®Aè•·Û8ØÁØÞßí¢Wô†Ù=ê ìûR=ã)Á~Ú\ðNPÏNÓº“÷Hw(kÕÝDËåUrå `Äã£ÚícgVh+áæO$RÎaÂ!58œ™½£ÚrÚ)946ÚQÛää0’K¡Rx#@xJF°òÝPU®z.¢Ó¤"ÊC'fʵîXE ù(Œ¾‹XŠç‡”×ó26cŠ´ƒíN•'1  %Ȭ°+\Å$Þ±E{—ÛÓ#ÈûO+wÀ”˜@Îv l)Ã5i1m•§|žø_è‚ ŠyΤ–Dl?± „ÐpãâDb]üÈsŒ„gdPlÂe³ldÉ ís³`s\-qr-¥Ÿ€]RéüJ•@FÚ›ƒù’SV÷×g³%M—LU¨ò ®ú¬7èT u Ï›$Ŧ‹¦|P1›S—¨ó…ê´M÷¶Ñ¢(“µ?ýýõæÙq®AŒ{NñLtNZ6´ ®Ã¦‘4±cjXãç/ž¬ :Ÿ¾2Ø}];n¿¹µí]ÿmªº– Š¿At>¸ž[Š®Ç·æ=ÎÙLß[€Á—fÊKQ¸¾]ˆ…ˆ+Rì¼ÆIþ&ÿBb&|Và–ÂíÈÞŽH¢i{£œ)÷]¯+¡O„NFh@–c3ɶ"½&> -cå$oARyNnp÷¶ìµÄºe­èI*"‡½ˆeQžÀ÷þž©<„høZCyÃ8¦F”Fâ1ØfDxg|2´4Ûÿh‚¨¯¬‡©È? ÙN3¡Tõc…ÂÑ5p­àˆÀ(Ú@Œã~ ÿ —H¹çAV•ÑP#Ú^ °¢¹7´®¯Øœ@yG&…^½pþ ‘ŸšÀÓiWµ;QlU’»<·Ðxå»_÷¶Ó®”%½)RÏÈ| Ù,”M«…’ô³ÎÊ·¹ñ˃4òISó¡"®mf ÖR±‡T8éxÓ¨àŠºÔ¶‘QvõŠˆ“†„C×€µPm3¢‘–S§Û•ñÔ« ¶íª¹·i-öCúÞ§ûp:g%…ÿa¢óåÓº|’ó›vý¤÷u;òÊo{3àå~¯Zy<{ãžþ^ÿÚ‹—¦·z‡ÃÞ<ñ|ráÿ_½äß(u€?e›¿×¿ðR úõ|>¯¤îÿŒ“øÅÞd¦‡w¾ÆA>›Àþq1ù[ƒä(Éèµý=ÜO3ÿ×S»¿×ßëýQ o†µýƒdzD¯üŽûCÎ "Œ½ô»ÿ€‘¿×ßë§èÏ ]üœ¿üîÕOŠ[ÙÖ[Ìi1Ý+A>´réë’æÝÙ ŒäúýDõxžñ†¯éõqÜí` MoüV û!EŸWúìÖö]’æÍ¡<Ô—+é ðZMG+1veúö ÑD¿l"F>Ø Èÿ+—«qv`ôÈ„õÿ„¤c¿ö^CI†©Çú'H0[[»]Ÿìw¶÷FwÑÙ9Œžï1¢VQàõ£s«têOv¶ .PÞJr”=*k4<·`†ÌèZ@ô/Æû ukîÐ6¨q ÞýN©©N7E.rŸÚg[:»šà˜PÚÀ^b<¾MJЋ2ƒNÊ7;žkG¸ÇÐ9HtF­êÛr› Áay úgk¢ŽyHÙ×v3ÁF},è”z´„Ý1¦`I9TÞ3u v„¦hX»¬×:%•†[ßb¾vÍÉa¶è<ö4^akλ× ÜV4@³UFØ¥˜%]²­¨ÈÄôÓ Ðbj’n[w'F%²$íÿÀiœˆ|Sv§•:¶ž:@ þ‚ÚÙwÙ Z¸˜Ccfs&öÓ=öÞ§Jk1•y8'2—%A!Ï‹§ów=ùˆÏ˜Û>ïi·CÉí*Õ‡·Ý¢Êèïé2Êé}*­üâ»eº—&AqÆc;¼W9 VÞ0¿ß ¶K¡s6ùöHTäúRv•þÛºPêÒ~ˆÁe䕃ÆCfPbÛ?‘&Š|çä¼r%“¹¥êãÓ±®Ô¡dÿ÷pªùÝI£`EkîZÖÍQß´«@ë?A tÖÍúÔ¹1?aW·0lK»k ^êLübÑùrF Wü]…íWùÝT †Ô¦~(øã¸‹K¡xifÆtk…,Á—ÓêåëätALö´n/|¿Fʤl f<ßÙíRø¤¢ÃKJÙÞ_¡mkN‡tsÈñ©x…a„ÂYûÌDŸ‚TX;ƒ*³ÿ§»óüÁ¡=çí¨¥sj†xõùªíåÑ£…Ž«<8&³41æêtpfKoÀ÷?¶ ´w&­ßM¡\éyŒ «­an#0b¡‘w»'ÚVsœ;.Pr“@šth-Jg_ F’ݯîÝšãéïcâWa…:ŠAF&é*˜e~í°è£“uhµòúM¡ÿ¢£ù¢7¯µi/œtdžtÃEiìª6òc5ªAgÆtؘV™ÇèK7Ø!ìè%G?ç·¸Þغ®¹;Û€6ÔøÍ6ù„¤#Ý\® ÌlÞrYsÄÔÞ… oðÿí+yfßå*ÑÉ­?¥Ê!Ö 5à#„¡wäÎ¥o+ƒ ªéD‡h’#;¹a±f$ª#}2ø•‰ÀFÛ5"©¬<¯ZXÕ;/ÜÎkj•ÈúÆ™Š {½e6Œ¨v%v*ÅU®tÀt$²›G»Ã«íV\Êߣ]:l‹Ríξÿ€ÐoðñðÇãù|®>­¥ÒÆçj•° ·TÖš‡?un«ˆÁ›Û‹ã@‹³C•eãx”§]¡½üK¶¤¶èÇ<<2í®éŽêª¿y6}¢«E–»K¶Ö›D“oÇ’Ѫ~£è¼gÜîõ¡jNÌô'8Ï,“uùl¿å]C PL”Ûº÷áŽ2@8¾(xà‰Ÿèœª|iVµu®u¸Ðu‡9Ê6ða•kÕ£¡ÆÄÃǬy2Øqç1" N9ÆæåbÐ\4&Ø^°eÎnS`W‚s|!!C!µºȩ̈ý&åfQ#©÷#5à¡ Ñà&Cmg¢³‹:rƒ±}·°‘›áØm€].‚ÉT´ïl7Ei{rdÙ{" ø³.{ÎÛÿ §ÕR6ˆÜ_êHä°Nä"Ȫm'¶”@wý¦-J"S¸-´mv(NIb´çÁ–Ýͦ*`Ór’Ú‡.cÝ«:äØdZêj/ y”Ñ#ó¥˜`÷Ök,å!.¾IO‰xýõÐGfûd\d¬3U$ÇTÐV꜒„\çÆ½C¯†,59)ì½Vä.»X1·o؉ÆTêÔŸåI”ÑI+ ̲‰Ây1æîÅþ@ïÜ I3¦z@Ã0ô“ÁŠ M±ØfŽ&0­ 2ÎÐ ÊEéû`ˆ Ô#…òó­Å[@RÑÛÓBD1DAêP9e#“èKÄó*†Ô^¿ñᡜ:øNFA“ž+ô6{¨Êõä+KêØïÇ]ÑX(¯Ò@í¹h¶‚òIXßHÒ·95\ö³Äžñ±AÉVlîÏâbš_W(H|8ÀQ+±)TD»!Bçh¾ÍLÕÊ%íAÞ“Á ÑêË¿´ÐU‘3²R¢mí ¬ÇM®+ ŠQÊ /À-ħÈüæÛØÊ»ëXÂ8’@óJ šÅÛïzþ#™\²°Í$Jq÷'ëÂf-ÜE62©µK±ÖűѶtß „Âüðò´gq©8°07'Õ4¡d•Uµ7É|AçD_¥aéðŽ<ÜÇçç¢ `¶*‹ä+û‹3„÷÷‹ÎÿqTÜR¯AÁA£ç" „þ×#Ì+“ VC߸[8ªu)^eXD¹Û+Û=ïùãuÖ·òö;¿é…o¾€;QÁ¯{IÀ=GB k?ÌÝ»ñç÷z! ¿5-ð/[¬  ù~¨‡‚E˜¦Ô}wÜÜÐTݾåî h½y°y ¤Ü•,I;ü`ðäœô*À'/ͯ±xð²âS®ï>ÿýƒDç_Äx¿/Û+•ìŸ ç¥G§c†_S· ‹¤©»‹U^½}ozu$ÌwÓ.ÔJµó°÷EtßõÆW6J£¥ƒ½´ŒåH:«9uÀt:(—òZô¤sr±rjR±¡¦ÕOUÝ=v=MJL¶ØêjÐ/ï¼Æõc^>×âbæAŠ)ÀHîpé\ö'¼*êý:zO®n• g˜¶l)›CIïöÁ‹4gß8Y¸ŸFt›òzg¦÷ÚUÊÉ! D¯y>‹wüS5:zsMW jÞÆôè:~ýØn«{çWd :«¨’G´HDÏ}b›-Gšñ¼@5-ân•=#M0¥[b­èÛý.rÿ8³^¿õ Ä×Bä‡Q8ÚÕ__ ˜n *LQVM|—lÚQð(•(B:~Áµ:ã§l ²3IIrI/¦ÙrïÝí‚Ó\é¼ 6’jøMÌ ®P~&Ö\jA.q‰Ít ntô]´Q¿Ê¾`Ì•s';îÛÆh³ùÌ/ò|rfïÞµÁɼSd.ñ,wÝwÜtG…Çž«¥œô0ôrèØä®­þƒô¯ùKä<ºBþXÑy²ïâŠW¶jQÌŠVrؘ«7Ñ$WÞmµ>”D¡j­üáð?oª£Þ?ü‹Zk%ÊXfšJmzš8ß¼È)[ GÜ/JX~Ç׺âJH½ÈÉbâï:Iîœj‡±Þ…øXl¹I”êÊÚeV„„{œ7RÒòÜ­‚J¬ò2ÚÅ!Èóù´z&Ö¬tOF\’Ì7öp}¬ÑÛ¥ ,BX nˆuÇ–¬ÀI¤²³öÔÍç'¸& ¸Ûþë!ä¢ðd¼7#$M5¤LÖ!‘raTwÿQ|4Ïë ½q ó¹ŽDd¶&¥å˜´8ÿ dáq®$©¥Q»œUõPiS® ¼Zv#ovs³)%‹?e«vŸñÁ¹açxH,ÜSàÍÄ"ÐÌOÉüQrû³ø@là>Ÿå"bå0\NÒ1û÷¾v—ÑÚž–qÑ à ´Ûò`9ÈA‡ÁdS”å~¤Ýz¦VeêGåå[gÁ.z£»áVš Z ! cÜŠooµÖ]ý- ¬.I:ræs8x.c[kp2B%¡›VMWkm:¿¡è*1í-è< ©Dl7îÓ÷hB4çÌBÂ4>Y?/K-w§Öhzìͧgç[;O«rÐçÊäX·M å&EºCW¸VçÐôÓ© ´ã{ˆŽT(kj™÷s·+½²N k5"ÏC€»vG?×»pd6×" •çe\¹¶ˆª@ª´VØ9z{„“òC:‰DK”I¿HÅZsN/í´;2ÒRƒ¿,EÔÑû•ù]#90•Ò*#ˆÕÀ§6­0ÛIÖÈäw»ÒI‘íºº¹ã|¨;¶6^®‹£=CE‘ÏB°mOåûÁÍ+Ýè=sÜ)öIc±þ<ÊóP%H;=›áç4—,"ÌØÍíI"°ÀíšH2ÓѵK&B;ÑÛÔI‹“Õ6úë³¾‹Hý¯wO._±7÷UåÂÚb0”uŠ‚ÀáRƒûg2úM}+IDÌð®ŽÅH¥ºw`½7ðô ~ È®.ø-»E9¿ ;Ä–¨99zîݲxO$·}ÿ3ÊXÁ8Æ¡On#Ð^åÖ áyêRñµÃhXƒ:ãKyÁ$ýq܈ŸòòmÙ§“I]é"²À!ÝeG‰³Å07‹h¡šP“üA¯ P•þ ’X¨ªB†Õ§Â¼žÀÜ·Õ¼é nº¾ƒ.9Ëv‡ÈV‚³°ÖŸ¸„þoœÄ1ÀíP€¡.ñ‡$9+)à ÇwYj6ߺ¯žc'Në½¼Çî­ÒC_z³õï­³ó«Dç»_«}¾*tÜžò†®·È‰|£>Ò—'²øÝæ€ë½¸aAÞÝãÆ÷å@5q/e´‘âmÏb€±$Q7í±ªO][Š– K£:>f¦ÛJ/b¯.°ö“×`oÎ1XH¶±àÊ'–˜ûF»ƒ“´;´´€T)®þYʘ8|“Ì1‰ðDûS‚¤P äÍüû›Áˆ7Ôs~¬ÙÏþÓ+Ÿ£(¯…™>t×ýœ¤‚fB9nªÁsàô6Ũ8- ¨ä³j¥ãcf_µÍÆ>¹Þ7ä ^î¿ Àÿ>ÔœÖ\ÃRCór½¥½¯ÊõÞ½(%[]4Õ€V—ü¾AW'õ[®³t xlÓú/ŠÎ°ðF®~í$¯·[€C‘‹ãÚ®Êæ˜J…ËVX{¾Œ]ŠtJRzŸÿÅ“ÛD…ÃFö« ïEÑžè$8̾xA-UDÝrÚL€n" >XÏ+Düä †6áqœ Ž€}’ Mbj’ø ·LjŠ‹êhÁdÌ:y,Å|#­† IJÉ@ƒ"â¡pTCì•@1'Y£Í}ÎÛ욨4uJ(!y Gü*xDL†Z+R´íͳè™uÈöQ0Èv¬wÆÙÏò²±÷êKËŸ–pPnH}ÛÝö»>9fÄä°ÛÑÆHüÚ—/ áŸ.¦?|tk5kú·Ìžr’y›® ° ¨Äç;iÿ阦N&6¿Aòά^°.NA ¸@‡XXª*ÿ‰û·©-O{bö¢í´õ%€JY)=!/èÚ¼ÛÀäa%úQ®ãI¸Fk?ÉÌHÇ&»†A%™Ë]›‚kþàs­¤ü{?ã`+jË âÿwŽ7ŸR¥Ž|í5EèdÚe.<…˜Þ§H·ðƒ€ t;êɆ:m‰ƒÎHÅŽN®dï—=¦Ó‚Ø:œµ­^οŒ†ô]‡ÒRÁLÚÞñGYùâPÏó‡{Eq–ù =¸S( þ&Ž@}ïu¸VÔs°<£N°EíX¦9ž³§»(™.¥Ñ{ÌÉ–Ûµß俀ø¿¸yAèNÍ9w:ÚÍvM üUú÷Bd*Ćñêe_ÁŒ+¾€áhºÌ©q¨î汉­Òʬè-¬ölåìÍ_cÔß–CD¾âª JI㸨¢Ìiã¥h~\. Ï ãù-/‹Ð¼ÎmK!÷8·¼„õy¯ømyŽo|å¡1-Òøë WbuÂ[}[Xþ „€"•¨^ظ¯xØ—l3Am /¸"гW<ˆpT¨Z j J-VñV"ßlÙGÇò?ÓyÅ^¾°!wÏ/r;Y…,¬³wX_—éï:'9<àc2/Þ%Ù,0Ö+·YZ/w`ÍÝ5y9ÀÅU¯ô¢Øå‹oÙ °­ï%¦þÊËül€ˆE²|<ÈÏíØ›ÀŸ]Z+Ç.m‘m„ ©jÇ\Ô'½¯œ—€®ÕæmÜó³c:6Æs¿Ì¸8dõ5Q襑$gˆ|s*ÙT^ŠW;`8 ¼ÔPmÉ?…èÍéÂüÕy*ÿ¼è<²ºð+ÝÝïNÊùw^_¯ ân ·Ž”ƒt—lÇÌ—k\¥qUÖÍË}—N#d€(µJÜû–üµAçñ½—÷]5€l'¤¥¯Üá}+”£¥«z‰ŒÄ@pÌyÔ7Lƒ àãb–PnÚ:#É3´S²Â±ó䓿Ö}}êëçØlªÉ¬ý-y¯KLn"«i…Id–K?O÷Í2T‚;Â7e”jõo‰&àÍ'QÓY¯ÑXÔûR¡r²}6s“pm?Ùv}[ u1¨øÌóA±Î*  T“ gñ–hóv4ŸíÝ*@h½¢óoŠÎ¿TZ3– ÁÕ'¢÷䣧]š{²‘¼…Ú–-²Â¾N‘š•Ç’wú¸Z1n§d¸Ýú¤ ’‰ÏSŸ–ƒ'!º¿eU ‹Ã|ƒ&qiϽ‡Ð)xB“° ]ü„ÛJ²ìïñažê4Da‚Kî”§|´º]Šœcë*E&ÛlR¤%sמ^(Ó›ÊR¥Lÿ#£wHd9VÓCláI½Ñ²qÝGÃÄ0êq<¹{ÙfÄÑ!y@ëÚgCJ®0Iqd”÷ê0‚¡3ã ËlE.ªYH”WÂ#Ý5í?±3eH¤::×:Dù&2: –Ëi›…—4[£ytÈ!°­©–LS}}Ælg‡ S¨ÇJWÀ ɧè½XàN;˜áa[àìè“5 yñÇŸžØE♂¬[áB3?dó%Ë[ÜZ™ †Ô:Ät°‰pà‰_g'jp¥ÐEýLf¤ííXh‚-róeTÿåæ!‚!‘¤¥Ü{`Y³ý‡®Ú’ž‰+#æQ(ãuûéùëö°:kœ´µÂƒ qföY QP„e·5¡‰12u~ªöܤB³Ušæ Ss´‡oÚHX…A4°z9®›kòÈ‚ wˆ4m˜ÁH$Í;¥Î…X¨Ý6ó&¡Wô‹¬Sbƒ:|i—ö[¤'5<¦cãÄ‘œ¥Òíg!ŸAs{Àƒ«®àÈô"{¶@2Uã‘âÇÖ!…™1e+bV”ûwÎ ï6‹S5;·`oÌc}Ï$és\àËk3ºŠÂÆiñÓœ DMt™,•dñ1®ùBÅEàÈÒž6ÿ þÑ? gŽÒ5ø5VkgÒÔÎAÓ´M•4pÁ¬4¤ù|ÅÚt=‹kQ%2y-R~5 œ§ k¹çâ3áïÁ8Ó`dRIÌ«ÄBÉÜ)Ì %ž €}ôŽâ›?UTÇÀDRØþ±h¨Õ¤¿d@úÛd¡Õ1˜c¾Ùeûý8Í-âÞƒ‰´{òz‰T%ž´'Ðè(p(M ì-&ÄC–øà¾Q’̆e¤õÎ*¯¯Ù€b˜ÖÕp4 ºš7·Ãxúâ†SK}Ž•K;oEaFæ”T} ¨?Òåš šèI‡LwåùÖÚü]‰ƒñüúêÕ½¬Igª—¦£Q‰D,T¶°ìæPµw¨Ù“Ä5ýÝåØRB?AƒëM € |è*õ~úW2¨Rùý»n lÖ-ÊÔˆ*û2ÂLÜt ©t Þ-2†­C£žƒA¼ œž²–‰^” j½?zZ2x4dœu¿ìV19°:ÁÓÎ@´¨ kA¤i«<£š8uïfv[g`VpãÓÜ͹H_ïKRnö˜ä·\e1¢hÕ—4²½ ‹uKᤠ®Žü fr¶íp%QîPpÓ˜)|©pz“6‹aÞևѣ–W®ù†-~¦SoåT²,*Ÿrröý´1öUå²)fO#5:?¨…Œˆï¢m˜Â<>LN)õöG6PR f§ x'œãϱU™Øîtv‘›µF°L°°ï=çírØÀÙFݦt“´JÌqÏY‰gÃñ1jÿ *4BËo X’kˆŒžtñ¼Á!i#]“á-D d–´½M@C®³kmV¿éô¿ÖŽÍSìÞ¬*¨Î_• FmS¶K×?Ùj_È-â~ ÚÅg‡ˆ±àÆü ªwtÁgÆfZg†ºY9toä$?³ó¥”Z%,ÙÛ¾×bÀ…Ž¥â2ΰ×N ×õÓ6‘gßÙ^KµCÃ2Mb޶ù¡Çß9l¡ì‡’×»±¢ ±ºì¬ë¾)NÙí'Å•DÒÑG„FahaËØrˆ£x¤6ÂÔ<”¢ÈcˆòFˆ]–a=µ™¶ Ýy4³™ Z% _¢©E± ¾+ÑÞŒ¢­O˜Þ±@‡8ŽÓpÔM¨ì3r?ʺªhZ Ë €ËDvœ¥Vþå(<ŸÏHG1I$‡|ŠG>ФØÞÏù}¯™ЦÌ]“ÀÍ<ò¥¯![>ñ]½‘ÒÌv@ž®zAøAhÇ<¬CÏ@®â;õŒ#7’¦f£ë­~9çð"uë3tkµVGDšqH3ßÔE!B°0ÐR)ˆ“£6uÈ~) F!½•EJÐ’X×¹¼q¦âåŒÒéÔúDçe(¢rU¬ÈÙ}nÏWŽ¡_Pé¡„U ÛW ñ ÿó']²˜’ÇJŒ( Åaù*®Úu5Ïøg&9?©æ~±-¾Ð YAj'ë̆¿ãñújÏ †ÝHnú…jñ°R‹G€\Œ5«\!÷å›Ä›œfƒ¥’Ù‚ûE“wbjñx÷̯ó ”'°îôAè•g‹Ä¥'0ØîÂðcjÈ ðO¤K!LbN«D£ÒÂÿ‰fùÌi¨.`ºšW©•q“¹Ñ¹Ú‚äè–ÐÖat†ñ&ÛªÏfç&“žfUþ·_ˆPqîx¥Ò»XEÄÆh±0_†÷Ø[ŠunhwoTèè¤hÚö•ÕVyv«±C/*_{Jñ£SB[¹*Ž­Q_$] 2ä~O1ú<Ū¤7ÉÍ÷o_U’Œ=NQJN£Îͺ¬Éuä¨t“VVž7µØ/ÚÜøîâ&È %+7óv*8”ûw©RÀø‚tifB;“º¢¢ÈâÂĵUcò)Y…Õ^Oº·÷x!j€Ÿâ·£9¦4I>E牢̀j“žžR÷«‘Eà¢&áuDTŸï2^~d C;7¶ÀZȲ¾m8yüM&|œH\øtáK·bgá‚þ¼håÖJgší:~y¤Â1ôæ¼-o‚p†Á‹ø[“HÌšx÷¾LIѨ|-”iȨ?èÊø‡ÊO^ôªwâ)UrÂƲ竒ÔA±… hËåSÁf®¿æšqœr’V¨ß&:;È–àŠ{‹ù†óþ³ˆ=ŽÐóùܰà—RIý{ì¨çó9òØÇã//+`¯ÀóÇî|ðKÆÓðÏhLƒšÇ…ÝEZJ¯lrÿ»ú$@"x>á¿ÿ>Ü÷•|<³ˆãsþMÞùÓâËD8]’þ„w^þ0ôÓCåçóù;£ýnqظÃW«;¶£ˆû¼*:ËÏ Møïu!%‰:X-»~üŸ?1•éÕ æó³ôËö÷ú{ý½öb1x¹ç²›sÚ`lç½±û¯/7Îi™Ì€³ëؘÓJ–°ž'“=Ø%ƒÑ£åSýVî{ì`ØÙ«.øü_&í 1ÕÒdsÖNý?x³¶¿± ÄÁþýwøË¼äx…¨µMóŸÉu9•ŸÝN#QÀºlú áÙ qêÿDÝŽ$ù]è¨/aºùñŸ{’lTÓDÄN–¹ûÁE 5Ù>Z¯¿kX·S4½‹²}VwÒRv.†×Ê@x<€è Oq}£¹‹}É#J|Èzë8ÿ¥s‘™³ã&‡ÿRœbe†ÒÛ)7+ÚŸ£±±‰<Ň(·0«Š¾Þu&oÉ"Ö5û ²Gß> ðHú¢•ô9a—HÌTT£Rô›‰8¥·7Ž Rðè# õ. «J¶·Wâ°EÝV`Ép«‹J r¬+F³ãKð uZ3…'²÷³ç è†Iw.é½ÏÒZùx{Ñ’[èì‹ï¯9%Ñ‘áW;0ÃgÄä >ãWŽŒ§l}îþ,åEsÆÉä<¬¬¨(DŸýú2"Z‰™²-±RTËð¶Ýޝ Õ®žÊš«æ9Ÿñç/÷:ïo3³ó9×i *è õ‹ËÝI9(û•ýÖû lUòhÈC¾ì’¤Ã²6ñ_áø¤"B#€YÄõÊçÂj±7Û¦Ò=Ùk-»Ñ†À¢ã4åÛÈÍž‘i^1¼ñuYáÔº{5ÂYdÒåT&³I=êA @Ùæ0‘Ø“ q¤fµ ºäõB ÑVcÆ h¢e¦÷lÙ;oÃÆqýúþK”Äk’/ˆ}JW|´ÁŠÕOHþ·¶–ä†dO¥ñ«ôHñ¢­?Iík? ¤–Œl‘X:Ë&h2Yí, ý–ÀÎ ¢9ø(:é )ج?ýž¨! ü·ÚÓónñ@”D> Ѳ¡š;JÝÇdxlº@$JY–“ËÇQâ&ÌX-î¯ÅëžìmVGñ»‘;Fí-reÄa&Y6Ëë}Ù$´î#Pá·‚u]»@˜ àìNëI3á ç`åJ|KùLä ƒÃC €4‚2¼¸Uä¢À8„løÛXF ¦p•–¦J딄:­ã "Ýä.¬-Õ8Dù0P©$lÕkÛB²¹0˜ß¬·h’ŠŽå‡ì “°:úÀUÇp¨=èƒ1Ü@T[€&r½W’ºßõ´ùhÊñ8žvGw´ð_”Ñ#B4p¼ŸÀ‹Ü+cB+#ÄÖ¿Gž|¦8EV.ù+?ý£1‡½2­œ•"lyË;×&¾M'm x"*ìj—ª} û ¶PËñ„4Ñ a5¯@÷•3ÿð#PBVäMw5QµÚÛÍd`-*Īò §­{6r’Äm™ÖVP!"”éÀXF»¦)ñ&¶ o-“þŒ.tû1À7…zàhˆ7l#úŠb‡Ä%ˆ–H¤ª˜¬˜­%Jž3ÑbµfF _ù|LrË è Z°&7êÃWÑa;yÇ žM*Q ŠB¾|M’NJwZiyÞÅkd “£—C#,¥z•Mš¡Ž$Îívb냶×ê‘?Zt¾ÿ:¶€D ŸÎMD¾\w4m,¼s6Èi{nì„E¤ô&€F°ˆÞ&åö¢ßôr …aˆÑ¿ûÊ1ü7l¡èìQìôæ…KçïÛ%•gz ‹ñM›šUФwn¢{‚õ=ˆóÙ½+Nú¾³\Íå·-ŒWã¡É9ËPºvëâCnÞŸ}¶9­<ÌwŒŽ¯ìÏ÷îLjƒ'3Ì9€¡XÿšdÂò0ÌŒÐòéFVøw¶n?÷­U:H°îao|.†@K_áv‡ü‘.ZYdO1þƒîu~ñJšÎï4kD2#­âà¢Ú^ñÄ-étÿã/¼[eýújGÖ®Ë˨MLC§76¾t[þ1–î ´Ò0Ü{pÌ}Ÿß\y`èNOœ<Ë@D,®RÁœòƒ‹K¨ÚkZ?$È”uVÜÖ®ø†‘°Û‚ðψÎ_„¿ß;Ó›*`T aÉ›_°oJQp¥quR’#ÞÀ— d‰†ÁŸÔÁÈŠðö‚*(þsK¬VZ«ùó¨ÍP+ï Q¦©÷m(ñí$@“F³b0Ý*S×ÖÌ`òе¬+÷ò"ŠüYåÓŠÊ!JF³{ý¨~ÐÒ'œ'Õp¦ñâÌHËlgo6ýsýÔQ1€ŠÈ9¥pöırDò/çÊСŠp¨µ¤ÊûFvðPkZudKCˆÀDyU4VŸJìET¼øö®AO?`)ÕÖ—^Xø šåÙùÝ41€j.ø5Mgëù"9\è˜îf; $5ÖPýå„€~ívdÜÔ+:¹D©iÿ ëÉ>ßÙe\€%AÿmÚ®äÌ”Iû ÚS™ë¤„!ƒðIvʃS·êlïcO: Z($½hÏÈ’œ„Ø4^$½ºµÈµè&"àLl†¦ðŽ]€¢!j@Rqµ¹ÌF)ýˆ(uo«BÃŽÈ<¹ÙÑœÏósvSýšº`Æà!»æßjüj™.¬H"‡Ü[n*¸¡é“ðùß4¼|C{À'õ8o| £í4¶¡­QTêZmË”ÍaF#ç]‰ß¦HºKc÷ØßsãÌ¡r‡¡$!NlX 8{§Lšèf£“¾0ÇD5±×ÊPÖl3k–*aq¾c6D¶X^hFÄÁåØ(~;­þûDžûµ¼ˆ¢PyÀ€bÃÔ3F,…ÀgRHÅÒ3PRìÂ¥tšùÇäÔ£é>¢^&i1Ë ê!àH´øhãhȼgêËÜUˇé‘4[Ä3Â1:Ï47ÇH•ºÞ<5§U¾Ú¢Œ†’Œê8Q;Hctô-uÄ.ž– OP«e…ŽÄY5Â|#NM]Qm8ŒcIh»AîªÊt.'_×#L¡^Ž’,(ôdT°£›9R]ˆ$'âÕPŽS‡ð3ž‚hºÏ¿*:ÖA*7 pŽÊªŽÜN$°[þÉ-ÕM ðdâ®1Þ°.•Q])”Et¬òáI™±{Å•Yÿ©¯{ñèèó»cóYSÊÈ~‹<5™Êç’‘ÿ‡½ž¬õ+çŸìmÍ/ßê E@ >¶hTÔ‰µ&ùÊ3»±=[£PÞtaI[g…pÙyg ´žsÓ—¸0òÂ=r3¯î`ë·sÚë¤48£wMï0®4µ‘ qÀü);̶‹¶Œ6Ô2çIn3Š[«Ôü%÷ÞÄŸ2ª»¬4LZ_q~^húñ ÒhI^1 7ýs%)î<9I ðbßwyÀÕÇw«àê%Íþ]sƒ#à{ÍŠi§ßÅxQ0œ§'Q™Õ$ä]ú‡V€²Æ=Īw­”Ë€W{^÷IßÀÖ0ì7txuÈF©®ö–CAÎøHT”Dzg/óßëçDS¿_t~£fQ¥°gƒb†Ó§¾÷úJr¡+O:i±YÍr¯òbù·ƒîÈ ÀøR3½%t7¤¿rRéZ0z£‡‹:AdL9ÇY܆¦hæEõpÅ×+N+Ht‚òzç³í Ÿ™Í¤Bw%¡ !R9VÉ3­îeth.êúàF´Ý$+)aF”€Ú=Ñÿ-¹ôûòhʆ¤WhG¥øxðHµ•>î®{_¡éÑU€ÜÙ‰ê¥éq ±y÷¢ñ$d±º=ð©Á}­X0úûÃó<…wÖ¨¦r!›GPµ«Mý‰î¥ˆŽ†JDœ•à³wí·…§LCCÊíŸ,„ò¥Q,üd÷=žWc2CœÉõiTQÔ Ò¯£m–Œ°çûX¬ÊfþóÆoè‡å>b´v£Ö<Ôq¼8u¯•b„jE±°új˜ð6ñ5‚·K1`> ^îUcýئ^_¾³)Ìûîm·f¦;–‹sÇó ç-Øá«-Œ»½‹ÐÞ—h¤Õâ!áeS[M&¯¤WKÕôj¿ÊyêgÄ•‘¬¦Ÿ:ýê‹=¤Ñ^ É,ýYË7#Éh«æ$hò´qœ?ÅcžŠÆ {Ф»MZj—®Æ™H7Ñwuœó±_Ð1°ÊûøÈÌO‡îGòoÃs.ðXac,!u 0D"-¡Qæ!|e€æp埀;c"(¡äH¨¾cÜ«£À¬î¦‡êrPœ.~¤c— A4Å­p5š1ǪyWùY¦8ë¡‚ÏðQ-wƒ)…™ÜʹØtM˜Æ6¢®dÅØÜê41£Ä“¥æˆ*E·‰>ôò\ï@7¡ÌX(!óÅ™xäÑPê¨<f’Eíx<ŸÏÇãÈÀW÷j}$ÈÛ†++¸2|Ѓà)Æ•+³©¶¼êÉcÏαÀžÔ+Á¡IäxšH-Í8}Œ|_=ˆ‰Â\n…”`œÄ¨ ±ÃÌ‘dÂ>üWº^´?Î-Wwœ”1Œ ä°äÑu" RµŒñàà ôP ¶ËÔ ¹-Ä‹È*]rt)_˜°g‰=ùp9¢uÔÄÝø»ÐÑôðƒ¢®/€‰Fƒ•ÃÂ’|KðÜ…”ÄëéS;攺:w x‡+m]â#R¶Åëâl³4ƒRºòC}‡"“Ó›l÷pqRè¤ìý"AE¥·&iÜ$¹Y¤˜ N%J·sCŠ› BQÉ¥R1L—›-›N×美Ò;œ¤h Õz&yàw ;àú¹4•à‰až„#Ù”Ù•F¿ýäÈqŽq5½/ŒÄ «p§°`¤ÇYP/ºMòÇV£1¬Ü­ ªeKžâŽÉª]'Ï+Jác  {‚m»QèÒÉã‡è´Z" Ð9 ¥¡ÁÕº#œ=eÊXÔwŸÊš“˜_ÍG¬[oõaíѱ,Ë–ÙÉHöûÇçΫ} (É9ª\¬g¬E×qÅhÖWéÎ~ÓsÑm1/àëz³®£øâÉlàýÞ/u¢Ì›æø-=— ÓÂùsédXÜ{ n yÁŒ ³â>žÂçÓO€y52€„â« ~éÒs\^ßc5Ç\©:Æ´ñzf8 „â/*L¡õ¤0Å3:ü|>ñØ®ù쥽à*¿Ä»>ÍÁ•“`}™H±®^]DÞ‡0:üÁ†ˆZ€êx-Ä6% å3^2J!z¶9À¹}»×Ÿýž]í×¥y/Š©î¢Î6õëïãò·­†ÖMñN"§À»¸“ñ®3R~9À·Ýn´>Ë‚Ñ+}Ö/LÝ®j­PLÊÙý•jIʉÐÛÂ̺à`в\†*iºLT—=Âmî ïzÎK$Ý( ¿+=ùE!æÑí7¿FE[îŠ6¦ÝçI̶¶¾‘p»5ßr{?]‚é3Eçá7ÊûÔ‘ˆÉôɯ¯IlT³n·Ǧâ-˜ç«aôª$ý+ÃêLòÜCt[0i Ý2·x/~Kmß¿ÏUß!¨nKV@qWgo à ‘üMzMäÜZøÜqŠÄmÀaC§Gù”( BáQê( Ò20ªÁkÜÇãfA-”ÅsÚºÚ×ÄŠo‚NJøâ§K]\ßææ]”ñ=¿Å¥!¥äó|µîAD4ÑgÁêwlí½È³•A¤õ”<²ªý"ÛÝ/šü ª%Zãëܦ¨}9òUúoÐћȡAü†ÂÌ„Lëý ö|FAìßk7†ù)¢ó•‰¾{{ºò]—LÒ°u¡G§.ÖÚ¸æõñέSÑ}ÿ—gþõù|"ª]Ù{`ØS çÔa[j›ÝÓ–û=<(´lôÇlR—ñ{äŠÏâ²ÖuáD"Ã*Þ:|YÒ1´ÒLÞ:Hf'"Ÿj£§ÉP<Òõó®êÜKÏ'ß,s5!»¦‘Ÿ ùjÓElsqG:Öw#QÞTŽ ?ä¼Î¨G^ ‡@ç’Ép;zÎOFäû¥£m*'7Ñ ð%µüR‹‡îÁ´Z[~ yÂD0ÞÚ%H)yA|&Ê "¯DHÆM:çÈ{ÜÞÓ>=ŒB#¨vWJõ€xbŒÑâͪÅÁcÁqÆjI—ÍoÍEšŽ°.ÅR¬ÕÅž_A@ïI‘ù‰*^N¢Þݘ˜+YC8¢ÃHÙ*·²€þóSÎ)WÒEÇ¡àз#ÓÛ'ù̺~F‡#»Ì™£ChÖ/QãCYXp— ‘ŸÀ1Ø‚ dË(m,LhA:êã¾ä u Ræ1ÝêËu-ÒõΛbØw/`màu•Ah 6—Yº=¯ ¨ln|mÊ_ÁFí-›oÆ=ÓAÙ/3³HÁ7í—hz|Àž‚ÙÐ%±ÂóÝ0>¹SŽgmÝM·aÌHôxxwÝÖ5XŒV¹ÒQu àÝ}–ßĨcîS%X…ÒV>çuw™ƒü¦ À°´¿ƒpNçê*"ö4á«|¯>…t‹;Åô*z©Å2Ùœ«ÿ‘«Ø¹O1DŸ @N±W±ØË9.|*àÜgó«º,O~fý óhàt‘» ºdW—x-K[ó ¾ W.û%ŸŸ%:?ÙÆ©I ¥8û½÷Vá·ó|>ÿûï¿ßK_9€úþ…sGõ®Fç?è…M-foç.M¶‘‹éÅyL² [|½ž„æÕG©Ñø*GÆ‚E™ò‘¯HDe§ËG‹á]®ú,ìË»Ì(`‡¼$@5ÕécTã$´tILu›µÐy!-ݲdË€q'GÎbíw;¶ÛÅùÅ’×ôíb0GÕ$€alÚ6Ù'WÞ¯AKŸ–š¸i µ€x_Þ ü82Cn9–e{Ë=]+ÆaiÀͰZpÁÁòsnT)K’•Mb£Ú@ìÒ®€§wm?…?¹ýNgÜÙ¿R¤I)ËÁZƒØÚ­Þ€½¼9 b a‹îÈ!h†ÿQÉÎèü½°ûveô_…UõNž~“saº÷Ô'Âè—8…)‰`_¥–¬S=åFò´âÊÝÚuÞ( Ð%ÇÔÒ?»û^ØâIÁ¯Õw\¬iºV±ò³€å óŸ—Ÿâ'?Qtþö¥]5WÏä% ²©ªÏÛ²Ka ¢Km‹ö•\½Â‹• ª©Ùé"fY#îkõŠªýK¨1>88ŽV®†z‘`Ǧ…êdNRà ã÷Øé½Vë‘?3F_ãx_FLj¹>D•#S²Á¶A\OˆC^†ˆ·Ù.Šv9«Ìp)Å‚J¾†ÅÃçTX¥pÒÕ]Î1AÁß/<Ô¦Õ*Ú¤'^­8Æ`²ìÉ«Ù1lr=^i?1_GŸárDŽÓÈÙrZ‚@VmL³ç‰žðŸ¯Õ¶¥î =žm@+Ó*/éÐn¡|³Yå<ìCA%™ÂeÇ“+ @ú“íP8 Ç,ÏpL©²BæŸâäq€²h@\7z:ø «¬“غe¡‰¾s£„¬7_’®prò²N¹ÿáã9XÃÆ(謂[Þqt…½踟æºN¤Ã ØÒŽuê‚ÃÅ© йà¥ó…h>¾#0ÅJ2\f eµ CÚ^Y¡ŠŽʼnްëÞûïöñƳTçnf7œKVf•5Ü–• ߨA³gÐK4Žôˆæ¤3å1Ó9‰ÇRçSëú#A¦_‡}Fǰ€Ýý$å¼”W6Š#BØðÜZ§øˆÞJÄÊEøŽ‡Ùdâ0tò>T ÊNÆž¨m¶R³-.ˆ•¤ ª¦•üÓJ"xìÒZÊ·øpÑEuåî#ȤZTt—„(Ä’.ˆËŸ¥"­1ŒÌÙø(AVPàqD$äõ ƒžüáï LêQµ ©ò'ÀƒžH€|èË `K¢²Þ'ƈ #;hª‚JU(ޏyºŠçŸOz<ªMIJwø¢»õ Σ&Òã. ØÒz Ê#ªÄ¢ÑÙùSóÖ •Ð0KQ€‹?z>íiØ5Sê@uøbAL£m``k‘/Ó \ÐûB6Ǫq &8cÈyÆç»ñD¡¤«—z<Þõ>’ð͇SPürp{Ê£ŒLd‚ „nÉäÊVÝH1¢ü!gìH0mš)Ì£²Ô«ê¿¡±mIÚUg[B0' ÑèŽ*yBrüN,…Lj´‹7͆ìBø¦g;Co X‘­ìˆœ(K8Æ>䯷/ÈØ‰@æ¼`»Gü1œ9þµÎb«/e”ˆMßÒG¶‡Pà2~Ù€Yuê¨ MøhÅ;»h>VtÀËOPœo”êRì[ˆbpd£°2 èÝö 2íC‘0¨8”©ðBÈ;í¹ª÷7èíñ;3MHzŸRžpÙ=ö8²ÇcÖ8#î£“à ³Ffa} ç[fe¼Ÿ / ìñÇ}¬ü"¦ ¡WÂ)"\¦ÂŠ÷ÚmóÄoѧùºz¾È)ƒIÛò´U‚æ}x¥n×½\Žñ»((Mïçó‡&«gúãDçëåIXT…ò徕Ê;]>ŸŠú•Ÿá£Øþ­¯wŸÐé÷ýPF’jax<€èž!ì6]K?–Þr³\UŸ~Ö3zÑhËáNñ% ÷/=àyöyáã='Š8’v×)VNŽPIÂß%ÝìwŸzh»E~¼k<.ðù<ßýËP?)€üÙÜÏÛ%§v^OzÂópgù`"%­ºáÁÆI.§ð£‰ÃTí}ðJâaô¤'<ÇSÝnÕç’ ÷­ðÄÍ~üïõë_؇¢~ô1úA'þæ`ÄO·#òÅÊgªSÿx<¦ô¿óò÷º’ÿ­Ãßëþ‹öŸ/:ÿ –ܸ7gœµË°O­ÐsÌe&εÜ>2š ¾z1REÀÉ$Ð=¼445Œð0Îâˆ]¤Á¹Èêµ<[¿ö³Þ¥)Ÿ ^÷NÀúú$ol´d"oB3 FlQb 0h­¥N(“ÔtªQ‘<P´­ï‚äÈÛJ0ZÒÎÎtÁ_ÁÅt GËÛ.ØÈvi7¬é§8¿“S!ˆÍ d9Â1¯W½¯Æø@ø÷r®üÓ´¯Ž–jBv‚·ÊªBý]«ô”äÞäæÊv…iŠTq4 Yþ{ÿöÇãTR›¼½™†9–—Ý?ÖõÖ¯˜œ:[+)1á7÷Ö±,Ôʸ1SP’ ‘‡œï½ñÍH–õ&Ý1ëC¥D».¤JL€3HÈž]»³®Íè.8Зų×çį?Š%ì|^‘»âɦG:jvòF¸,)íY9’w¢q[ÔˆS.|ˆYE?±£Çâ+šÍN#+¶Ão]M™vÒì–;ÙÇã´ˆñ Ä3Oë†-¥FõP šÜ€F9)ƒ°àŽï«>t|çÀ@F Néä—GJ]A‰cèɶ%`„ ï‹ÔëEA±œ@œ¸©à'âyyÁ/VÞtò€m‡šS5† ÙDŸ‰dÆÓ˜ÖqS}ãó«QÜ7ô"¤LZSiÌ –½ 4ƒ‚@ÑÅ/ýŽs¬ "bªVùAñ¢l<‘íÖS- áÞ°¹hMâ&7‚ætiët*™%nºa¿$ è‘‚ï嵟"VÍH è¤³§¢(fè=7î‘ÏÅjˆdØ…º1Éå.žX´Û&êÀ¤ø“Ë©°àC\B(`%P÷lÙ¸rW˜8Öûò7ëmCaYԣʒyÉs†–þ.»€E/6]4C”PßùÇâÿð÷&ö|Œ„ÛÿD3óµ¡Á9Q‡Öã‘`¯[b›—îÖ+"$KâO"|>Ÿáx†¿—o!ˆDð|šÉÄ÷«_üÐ#•Ѥ÷#ž$úé1ß Jþr’{ógÊ»,G´‚¼«âOaçóû}D}Ùçïuy{ÿ Ñùj7°Ð™-•ü>ý„ß©Þ)Û áE`üWä¤W©´µ¾•BqEܽÝÝšvˆ9A®Ô0Fk@2÷ÒiiYm‹ÅŒÂ2vƒêhÑÕþ¤=A>â…dyå)óëŒz[CØÑ¡[“۵ͭ­šp+{¤ƒÆ‡H‰‚Ó”º*‹¡«)ø@öÖh=xîÂ&qÒ{²œÏ—ªôÐŽ•áܨÇéy|Çð O›ªµ¡çŸ?Ã~‰d;ôÉCCÝÑe"Üšm*ÌɶNiûƒ)ÌÒª¬ÝS €BiMìå>Yêk1- ·Û3ÚdNç΃ÁÄ£ã‚Ái¥§ä‰,aé’ÑëŶV Úõ À;ÓbHÑ87!žú²yŠ{äl3Æ|ìrY³LJ¨#wQxÓ<#P€x<ª‚'iuìÐÞsÉüdõ‰OI )¢Ù’ño•l1 42GJ÷fgÌô¨Íÿq'¡c—›âJ]ÞwUºÒ–Ô .ÆZµ’"÷tZpÌ¿4Iá¢ÇãI‡òD?s'À•º1ç™ë8ÙíØå>ÖûÇ9+訳ãÁ³p.^(«úÑžOêžo"{L¢ë$/αÄ;7"ç#Ýù-·Ò³³6ÏüO˜Êz\?2Ö UgX⊚Ӷ çó]gœp!2é¸'R¨r -Û‹ˆ££k&ˉm0ͤU#ôð¤ÇpQ`v"[V"è³wsOªŽoаLX ¹ˆ2©I‰Ñº7q •bTû¢O©èëòÅá¿4´m¹*œçé¯Î%p›ˆþÎ÷¿cI0n$Å ¼#>]Nw"àT®Ä˜)~è¢þÙNDÁÈÌʯ†{¦¾Mj†ižB#s#CÅuß“l]×Ùá’RXÝW.­$:Ò±¸¢”ÃqAØÐWãgO¹úé¢óÓ nck]g!G¬~<¹fò„uvTÜÈSêXHúùP#B%#à ¾×¯¡“Œß茷€¼j÷ĵûÒÿŽ\EÍ[¨¼p&O+šº"ÍAÉîdg xNP=@Œ¸å¦fRžû¡¡{“òï&™¶Œ(8®ËSËÓM’!;Kq¹"K"èÆ|fÑ„Ø5ié ßÖ¤rÕÈØÃˆˆ$qAš†,>ú?{W¶Ø:Ž+Oþÿ[˜‰$v‚Z''¾s»OçĶD‘X ¨E|iÜŸ.µ 6U–cPÆßÑÆ ì©ñànHñu¶Cï‡É)J’búfn±ôUÊ2ƺ:œ°v‹íX0£[!ˆðf´O«´ÿ+¯S»Å€ë·Ç¤ÔNm×г–}ASrr°]u­ÚGüD0» ìZÕõtÑÕº$¤d…úHw¸»J+úRêÖùN>•êe#>>Ž¥Ù`íãJüJ±Õ+€9  ©âÇP7B7wÈÔôæO쯔€C=X 1kNÆ<Žäž×eIxVWHÞf D#ur2*õö¹ä}‚.óD#d² V&•g³”É—õ \°ÕÇÈGw\çzÏâ§p¨Ôf„è«©ò&Wqh\w| ÷H‰ÉZ C‚Â×Vþ-ÐÿjLçË5“Ô´d±ŒÆ†Šà¸=5l¹†¸Tû4GÁ=bâi‚ÑevMUö±#…#Œ\8:îÖLÆGœ“0Ï–(òTœßõ¹Ég‰3uÛÙȨKñì—™<ìÑðI4àÜYg"?u-Óuã]Œ`G«,¾*™Ã\™µvÈŠlmmóJœä5f­DML>Æà„ìr"ˆ¦g‚\'Ÿã{Áä!╌¡Äq™*›&¦v–¨ô ÍBùL1OÖâá]ⴴ…C¶(-È' &BT^>ˆ¥£HÛJ}ŒRPËè1ñ'Çï¤‰Ý j‘ Ì|½•ÆN®91_ªæG‚H t~GeËàúc¹ßrµUœó$$èØÿõà½Ç}]Œ‚t¥oÄ´#´»gÖWäIè…ñr#ñޕ崵2ÇX9™5} ¼O'“ýBÑù•Àž‚Â~>I,pKŽßõø¸-§ÅND/º[€¥áý €o(r…‚¶àµâþΔ73øž‘)+é íÑ­ö’cûdZ“àŒÜ¶3Ño–½uëùHM:Ox¥ð&ÙœË ó„Òw åÒ'ëCùgÚìÎvûZ‘ïØÒßÞÉ f~¿W‚É4×É&qßÄ ×å¹O š [èqåüÖ-‚…¾Š5ƒp®á‹Oú¦y—ypx tö*ÏXàï:ÖöØ|àHˆvlwYÉ®ì{>?‚màç<»êd¡f5å‘€R‡³3ô>}~î•â´B¬mH vÅ ¥>ºý™ž¼K ]aÄp~(Ã)½ñ±Gozýv† ñôÓmºïòV…‹9¾ûÑ›ö±Fo‡ÞpÞÿ|âç¬ÌO¿mû9cÁÜuÓáÛWâMj¤"tðÐÆÿâ÷!BDk=¹¾à‚(èKaÚï¬õCF‡•W1âMƒ,yM¼oM0„(ƒ´ ˆVØÐN¿¶û]Ó‰(Ó€Ìû!Þµ=ê«« ~§Vo$n-è,fsƒèÒù"²­×£íHvsçê× *¦š*(úÿ}7Ááà[”d£°F`Õœ#·»H|l,ír¨üÞ%Ih2›Û*ˆq{ZzðÇöã1§‘ÿÏ®È(QʇñÊJìë[xš¸D Jæ3Ï tÎâ™Ñþ;zý¢¦sk¢4…ä"‹1XÀ3XÓáze¢ê+ˆ¨7+B(hvâz*²üò—¾: OOôŠ o»fý(‹Ÿo ÑužÒ<|åYÕ²P;\ ÆVaªä{%Y°LG}©ätùÜ»7[·šãf‹OŠ3Ç÷¤;vÕì2EyV±·<ˆ²ýœ%¶êáó›ooâd1LwiÏ#>V“3å+ÍÀ¨IœÕw`d±‹6‡fSu¯+z݇´éVqO{m¿‡vBPIï1ót$TOR†hû|¡¹Ç¹åørãĘïú‡4X ¢óƒ£"†+¸sk-~mÅ9™,$qEš#׳'kPuƒç"¤ÉãŠxèÛ2ç¤ÍDñL÷"ÚjÆèE4‡FO2Kàô°§ÁÉg7xôÓ6ÔrWH½|J+ÅÓ„AˆuOYÁ€PO*ÆÕxÏÄ*”ÏB;Ô[RÛ˜”`þøÑ—3m4hmu×\Û‹;䈫Ó;¯íÑÅ ý†Z”ì‹gØØ=ˆé¦ÔJç Ô4¼¦&ü"~‘fTL˜=²e#½ØÓºÂˆqlG¶NP°g›É”Qä$ös×Fñ“vnë …ãû6AD5]гIW• Äà»SÊÚ‘jï]xÁ¦y»Zz$JGeˆ €¤§õ»‡L¬0ÊÚv=1Ê]Ñ;ÔC—váIeÓ¶A.¥j-$®¬‡;3À…óŽ °}Z70 Å\‹­Œ`À,5ñãX£&¿`Úõ‘K¼’äóêö|nÁØ’mЉçéËâj O ™®¦^/Ùáäz°43ibµ€.d;º²AKØÁD¡¤5@}A–'ëR†ør!áýo”¨0qÉXòöáRüá¡ub,ô†;ˆ ½–ËÈÅ˶»+¼—+;G8fBbóTývòæË˜lÏœ Bfn Ρj…L€J‚b=U 'Ít¤p2uñ‘¾ç ¬]èÇLÙ Fäg-Œ$Ñîs®Ée𤏵'½þ4¡ÐÈó¹Dï2sëïÁÁtÎJ©CxIîg±)Ò(ñdpŸý+UÂ$Ò·C‚Ði„ç?àRˆ^Á!Þ•%ø¾*ÍÖÄ›m¾qÏ­‹I<wRׯêZÍÃ<ÿŸM«ÖP ‡ºaíRØßƒ´ä$¤#EÉé¨DëÒHÓoUÃô~0³ñ0G:4ØC7ïJzWÙjÄ>8X:ãªæp¼ç=Ì Ù3ÃÄk9-6B“³' OGX0ŽíÌ.R9Ì 3ábpÜ{Ý…:-ìÑn{Ðú™ú®_í×z¨7!µ{-N™¾sËÐH‹mú_á#B‡¬žÑyœÀ~JrA³¨ÅP]¡ÔHQûG8^r y·b0úà €F*ñØ(¥R ŠRI=×—fåq„ÔÊE/–•Mx›Eqª‡^!RÌtxd|½ªÖT&]By¤mä¬Í»üé9*ªõàÿ¨è|°=’®)†tÏk’Ded¢ý™ìÛ©Ößñ¥4§Ô'C"3ü.ºítÕUÜ3¿.Î& €Â]^lýyõ½YȘÄïÄtœÏD&ÿÜÌ(<ÖõÂ) »Ò”»ÑdýS8"\Ì4g´äe0I‚§–@³ɵg« €âcËy¬FfÊíÝôÈ¡m Å¥·åQN}rßl¶`djàE½äêk¹sbWŽ CÍïg'³þ@¹%–%ÒÒl^Œ™ÀŠe.ÙÛl6Ù¿·lZVÛˆBNDg³ §[t J^ŠÀžN¬=/1ÕÎ2`õ›Œ'u£s“/l+‰)ºX’±ÔP£éM«bWžºMZŠŸO§²%CFƒT ”k¡ps‚YsýΡÎxÂO}à!‰!ÌJ¾‚†Ææ¿‹N›KKwÃÇP(æa ú KÏeúO—š¶„ßSyçÆB~$1§êÁ’nz/?2c8F“¡L·Ÿb\4Pwq$}-÷ók¨}òMªäö½¥Wˆ¿Q¾ÆRµü¸¨o÷æ8`ý[*sÞeÉNæbäÙó‡®ð1Aúÿ¾×½0ÞªH˰t} Ä1Ñãçú«²pO›,Ë«Çuì£>¢N ÊîÞ„µÖ€œ§—'¶¯j­¥ºÍ´ªèn2Ÿt<]´SÓ@b˦¤‡|¡S_õOõ™ªì1SʰÍß‘Ã0¹xŽúà%}#ªhACèÕÚžÐàeòâÃÁzsþÎ[,Wªe>Aà¤ëzÈ'Ç£uÁ E‹×ÿ¨ã¸ñà ?Îh2°ÂGƒ’ÎuG{Ǜ ßOÇrÑki+V°]Q þ¼ÈÒ­ “ñ€ÏU‘o`íBðÖðQŸ´|Ãz2$áŽ^\;u}§)HÊ¿ ‰ ¿… %nnèÙ<ì¾SÙÞ…]*<4; p´ÖN\=üçÀÓbÿw´‚Þƒ‰¼ r2üŠÚ,Þ`…tÀé(ɲL%ÿÁÀàÌùñyNƒÆ»²(6Ëf¸&²¼^¯n¾Ðûm^rZò\1îäo‡FÿÎ %¼çÞmË5¿ÙÌ ƒêĺ2êçÃø²Y{¯ºâ¯—3ª Zÿ èü·ãɃ°ëã ÁDfÅvå@®ãq÷ÿBЇš 4(\~:¿ y üõEm(ì(êÇ“Ûμ“Ä2®Y|-úøxB©œ0Û˜ï×±èŠ0Ë~ÂJ…¡ÿÞ@ôð—Û÷XÊna…»¤?Ð¥E uŽôòºÉ;tµâÕ‹º€§{Œ4Y%À@kxü† v’j­×ÜÚiµÇnæüv¯ùÁÖP#˰Ñkáe²Â¨iáøùP?þj¨˜ -žöFÕ”@ý5ÙùŽÔó¿îe-]€àÊ5¬Þjéô­´ß 7wòAG ­ª3®ÜJP%A(¦ DDÛGæÐ){Ôì˜ÞÊpÕ‹gÓ_sÝOÛ­ %ÁÑG@ _¢—gšoêay]ðJèÊ)DÒIü¬D†•+uF<ï¦ÄÕ7+±t 8K|_¢¦ Ôú©º|I ~Kš3퓎}µ/æ¶m¯×ËÖ5{o‘ëÚ(ù&®Ž‡½Ã.ÎýZuÀ1ŸÞduÃ=Y,6µD±îh±|ÐçAJÿäÞ‘]вg"¸v%ÅÕR¸Ûž¼GÚ}#ÄÚJQpµ·$ªÀ1ds âøL@ˆ dq¦u71þ±º¼ÌL‰É¬yÞ™€àa Œ£‘·=m¸úõnôìUá˜ÑÓÌ#À©âŠ{ïeJg–³Xÿ¢Ç/Òœ0w6›pª<%¼¿Ut¾¸C¢]¡M¬ CÖUe?! êÎò$DÙÆÇ@YrÇp«tHTÈÂ#d"Ì7s-æûúÎ*_ àÔSÂוɺ­ØXQª=ýQcå €«©õÜ¡Q ÷ä1gæ¿]%ý‘Aõÿ5Ü?ú×å¤3lÁÂÁKåî§`+=AFXÔtBä“E[3Œú8Xm‘_´W—˜;I”O˜Áý,FíñïFGuW_¯}¿¼¼·¼dùÄ`y­ñYvkgYä²dñ£üóÀþ®mg1ÈœŸ®Ì»-°:ä7£ŽÿŸaPŠE8õõbL¡¢³Ð²äv.9ˆ¿/»TáqêØå‰Í¸…xqH2DlñHF»(BÀ§â×j^­ÚA bž*x Çï0Jùôð®$.zѶ‰%— †¶Uè3%ˆÍŽyBá¤l¦`6íý9™-ÝJ‘:sÒ‡·z#€©ËM)Óubì'e\ĉڒ¡Ä Àžý6Xsx9O1’ ®u^x™»Â¥›}ø„WY•Á(‰úd}L*=MŇÃ*ijÉÅV žy تal ZH€•S¹k{äEÙõLlsw¶ŒS“Ae™ù¬•‡z¹,äUÁrBDJµò®G¹vŒü,ùŒ I¬ÊY7]àêCÂí˜(WÑû= €§R*x99òßÈ#’cž£\«hPÓlÒfÇëËâièùH¢g1¡-Ý¥œÂÄtïx½™§þO‰ÎŸ ¦©=–¿ú–vCþÚड'–zo´À _l/|Ÿ+ïµ)Іÿ{=³?¿à^Š×fpÐo£ QLÚxÃWßå+ÏÓpöv๷ûäbÑÎ"ëñ'"‚èR.HÅ9<çvïÚ‹Iè0Sþ1’­Ä£\³~«ßuLðo•§ð ’çmzÀö7<.eJßÎÞ˜Ÿ<ëœãöƒ”3ŠÃLùý{=»ãqEä‘¡pDðæÔö¹ð„BØ;]Ä$kuîZ/¼^¯9™à×¼Îq©sËð[NÞI´"eós²ÇÈéŽQü‹æ²³ ãuÚ¡¡5Æ€søh¼gÌìz)":¡8lø:pÇ`°ºñü¼¨»½£9·H*×ø;/ÿ(ý.ÑùO *,Ê”øÎÞã,9=)|½ 5*I qeÙz·8'ÀΞ“èþ¥ Q“ü’B!ÃÃL¦]ÛrЬYÀ›A/Û4’èM’¾m€Ã‹ãƒÑUNøÐž®*À*_ØÉ0ÙìÙ’‚¤dôæj²}ÊŠ×ÕòØSäªèA¹V6C©Ú£å(% ¦.+öÄQ‡t ·ÕÕJ¾¢èÑXÇ›ÁM‚h<¾éB0A‰Ž•Ij]{!ZêM‘Pò †žöÐøÙ8N¼pèAYæïÑÜÍ轎˜l‚V<ÚE pŒXäÍ6qãµÉÆ­]‚Ü‚sgtŸ ”F§µÝhé¶tnú“!][¦Ë1î¨çˆ •:|ÿáò¡ÖUW!Ø™#ýòˆêi†ì.‡ D.j´D²™¶dNzq7¢ÊêþÛ@wCl27jöÿÏüQÔb(¦¶¢%ùùÈX¶Õ›²–càP¢þ`I#z`%¦P‹=DœÒk#MÌü;™d•ç¤\ ž“:€]ãË<:ß7¢ÜIáÔ«Z1)dV¬G¢xxŒ²~Z×`iaƒí(÷G”ë^y+ÇÔe°ˆ…gM«ªSjZlÑôCôâf Š_¼J¹4ÿåüp|ˆ‰ßÁŽHÅmvë#7,„vjOSW#”GèQt<´'oe5îÍÐf”‡ˆ “Ü1Ó÷oíÿ£Y¸‰™;“¡ø…ï³<%·V Db†Í?N–‹'U®}v£åJü_”óR&…fB[¼ …f¼Š *Û-Sßz ›£u^VÓPÍœE®X¼Aö‹ˆˆ«Ñ8.BR`úfRTh7ç½mA¨~hÂN·æåÐÑöMG_íܦÜ`ÄzÔ&¹ ‹RŒ<-µ ìE?TTÖ'±„¶bZF=úY¢Åñ~! ?„^@‹°É†Ñ®¨ˆûµµ6,…‹à$Þfè_/Ʋ†t@Ü‘]hßØÎ {A`hõÁ¤«íîØýò6ù^ÄUá´½‹}o)s}¿ËÏò¶³ž*‹ë RÃõ¹Lï`TØÑýÏúæ´¾#µÆ NBÏ‹Á% 2ò}–‘ŲJ$àÔ± €š,ri «ÇÒš£Ôþ†•±ÌÿèüMʨ¹HXÁ½!NäܪNÈP5HæfÇÂ]Щ’•¶ûp6BÕ­¥,‘pHŽÊ¿‰P‡T•µä58`„ûØC8ž@WaJwÈÅiœ‰&uJatºÆЊRÔ gظ€c©“.F¤ëE®×á2ͽz„h®;A„ƒI%Bžæ)E%–*€À€q÷‘$ÁÓ„ FA‰Ü¶{­³¹aJ×îõÂms ŸL 3‹À¶›ÔZòä&àYYtðòpg™6 ‘…Kì\5»x¼V(Qš°ø%¨Ù‘W)“MÏ(ƒu{ER›æ»ÔÔÉÐy4'F:ÈIìü‰çn¹* Ä©­X@Hºë!ÖÆiÑîhzx3pq<æ‡R1Øè e£&²„ò\iŒ5h{‰ñÝùÉp÷*Mìv˜uX…ÊÓÊ?ž^?¹ô|W Ì0Èú»vydƒ~=eÝ^X¯×Ú½”¯r+j³áÒF Ž n¥ˆvT 1½Õ†Así„ã3ØÐ+T|È<‡òèF§TV­­D!£›ÝµÿÅn̸hœmñ5n®DÉÊ«_/0¥þ½èdÏ5¹¹P•²à{CÉ”†Kïi𣺔‹sm_˰sDXöRbã˜7XéµwÓ ‹É#qEΟ1®„†ÜY^ɲ¨R¾r½94Ÿáš0 æFD:b‡ßö;¡YžN“ ¢é£2ð¥hÎO¦ÒQ…€QŸ÷Û%EÏ4¹Õ᣹ -!@Óº!ë<¢~š)îµ5\* œ®1¤‹TáÔ))aÆ As¨m™äQÀm…ãOfZÔŽLI“À¬ìhÞ4Ýý‚Øø¿,:)=Œu›+ï…x0áÚõœÚ£LH±¾&-›5âúñ;(íŸ!$^¯³þíïumÝ_/^@DÄ×…£òOrÛ®\´¡(?ü•Ä£mÛ8°¸m5n`OUÜõsvݶOÌU¯®üz½jFƒ>ÍhDÆ'B„IÊû™ŠBÛÞ¹´mû3xÈLÞ.7Ó-äõ<ê[—žžÛ0ÛˆÄôÕðO áïõ·{¨ÿˆàEP/oýŽÊqiyrX3ÖÒŽqÆýËòm£¿<èïõ÷ú{ý¼zÛ: […TîwØî?³ý÷º CøM¢ó?÷¥Pµ€BA¦k·ý¤U¢ÅtÚ•û¶Þ*õêä3—®Ç_\ÖNuŒ;í ¢ûgaºcE­b‹Í—“loËþåPxlÚS!ãžÖå·Š9‘{ÑlÎС½q´beÚHÑêx÷¶—ÄøÅn”Ü—Ø·‰à•º/X™ cÕÒùìºIJV€m;¤<ŸçÊy«)°þŠÖ7Œ@ÛNäùï?R<8¢'3J}tV½p ‘h|/5gØþ=½­Œ8u\Ú2A–tò|"`Ÿ4¨:¯e1À—’}Üab=N^…”ív ä]½>ÏnÌE{ýËÝ H®³ÕàãS…ݳ`u6]ðÅ{;rAAš@®*hÒÕ÷ݪÍÌ{aŠ” mk©ÐŽkî=0ó¹‘vާfN¸"¾Ÿ ý´6]s fN½ª\+itɵ¿ôÑÁœÖéÚÕà&1ÆgiψµÀ„å]½Õ`íÞHÝ•#ËþI*ü.ØŸ¼£f©é[Ê'„@œo£ò”+:‘Ý\º£ÅñÛäEÔ¬½o+¼‚ƒ‘›åÐê9pö´Æ¬ÕÞ)ÝZ6'7˜ëû/ˆÎ;{Ï;eð«ßq¹DE–  Űb”šÊ"9ÂV€'UŽèmW³DR$B–";_­ª{ê¡X(Œ¯®„œør¦´‹f±`"‘ ùFDWt1Œ¥@‡sÝaŠ@ÃJ¶.„J¯“‚!ëPCÌӘž9dšIFÏPnw]pd–rüÔõ.¬ú_¼¦ª{GWˈ¤°nž’-º($ÀœwϺKJ¯0fùþïûCŠþâJƒ+:ÜëõÚÑ3ÃÉNpˆåÁ®¡b2‡íîÉÔÞ³v3¡ÅÃ"k¨ŽyJ0–;Š4.£{s][åŽ-ÕHÇþC‰•#çZl%bt2»¤×σ¢‰Xs¢dŠˆ9À³¹0«cÁ0Áãbã§’FV 8”V·çvL`ž£ÈàÌ•Q`ŠÝŒ=‘JË…•¦»ºÅ‘4ù•;¦ Ï-¸½ ©š]„È¢¶   WMíÇ‚9'&ÚÉç¢EẼ‰åóN{ßL<©—Õ W•¤p;©à‰o7.|FŠárDÿ[£S ŠŸªB’¨>ÊI9Q Š€î)'ÉÊXMù*¤ »ìéb$¼\ê¥8…äHµ]| F¦¨êñLÞ ž˜CÍÍ,Æ2]È”ÆmsŠ:,È’I÷u=“0 ø4ž\¥Ò_¯DVŒ˜&qln$mÖì ®Ÿí-‰ æ[‹@5 ÀËpúF©«³FÖccD_ÜÕÛ Ô1J=‘]|œ%v²O˜ØËÏÏ +È"„¦ï SI¦U˜ü‘¤#+†8ï0@饶ʷI›ÎX±¾ ÔÆK 6ìh - #îD4iMâù¤ Rq…ý/sˆ¶¼ô.È2Ž-y×q¬­uÊÑÉiÛT0¯C'óÜæ×Àº*JÕ!LSõÞa¬ºZÁ b£e×*„Ž©†õü÷‡ŠÎO—[Orãm†µ±õ‹¹k8wÕîþ(¶×£ÝézËì=w´­¾}ÙYS3êƒßúb‘ÌwQ˜DÏt–F“À–¶µó½/á„™²å÷¥lûTÉe(õM$éÇ­]ãÑ@;ðØË‘M}Œ^/qä­7€¯{ &E/yR!Öq»ñœiuþ–àEë g¿‡ÀÕG@V³Ÿ`|WÝûEHpie<È´¬êû–h>õáôèòz4Ky=›áٖËI#gŸûÍÉiA2ÐLß¹é\>q; O¶2ZÙýÒãÊIr×Ab?‹&š|8gërÀ1 ÉI g²{oêM4rÜ.5ŽVVÃP³5Ç‚»€œÔbØ ¹ÖŽ8J2³aœ>y4´¦ãÈÜ»ž=ÙW G(ÛPn5Õ*îœOŸƒÒ­O²ISµ".d×m#ÿeŠ”>ªÇ–ÙÖÒ†ò‚Ç9!Å ˜øzl))-¿Û&Fw,1á®C‚pÍz,X³E ºVóæª3181IÆu?Æ>nuÝ*¤IXï™Èó Ùº/ó.Kâ~T«¹õXºã àÚ»TΊj"ªŠŠ7Yª†ñ ^˜[: ´à´5#N9¥3ÐR03½–ôFiÏ8}.¬ŒŽŽÊ ÓÜMsǤô7û§ÃÝcºWÑ ØÓ:Øœ£«Zü5r¥8}ïü"µ…ðÂiHu/Û /+‘†—DbV‰d–€2Þ(e(iÓÌâú–`,g¥ä­ÈÐw$\íf‹âuçrγ3÷:q—å£u*\ÜÕ¿Ot~ ™5¬®[†œ @F‚¥o¡š:ߓ݌j5rAm0~Ï-ãÐ¥D»zÔ5Ñ.´)–ù%ÓJVÀ0 i£Á¢ýŸ¹PgWJ¹Q´>7™Ò`/¬K-¸ä:F“‚o·¡‹hˆð÷ù°©t£BàÌN'·¿B‡Õ~;|'Wá¤8ÙBlW¥ýÊÎâT O0.\ñ¹c¹y߆ȇÆa×Ò‘ÒêWÓ{Ôrô*÷BZY‚º»õ›Μ>+âßÈøT·9¬jpßÕÓ u¸¨M~þÄHë˦c¬èIŒ郀$*„ã.^loáiб–Ù]Ãæ•ç¶ËÕ,6º ~ ‚Ñ^öÍÅÉ„R¡Žöj®.Ñ-ÿ×F˜%Ђڋn;y/ð'%2dЯ~#  ©Àk^`sDL%ÍNÖ‘öYÿµ5[(Ï{Õ.¿ÉÑžÜa¨†Ù/ä2ñX¹Z/ݨºûD7Œ1¡[ÏêÛ¼USHÄ,Vð#1³Q[^öWT(ü«b²ŽÉ b¤Ô±q >:0ÈZ üed”#!#|ï·±âf¡sCCÒö_ÌN0H¹3¸fƒ ˆtznñÁu¨q'"Æ ñL’øÜØw”að:ªBK’¾mTÕÉ€Íx0%j‚cÓ!޼Ïc?’šxä6¤nQØÏ¯œ7 Ù]'ùŒÏ~b‰ða1^—˜Ô ÓèFŽ¡1™v]œë޶KN k¢‡ p¯;Ìi©“)²°ÄèrR-# ;ް¼ÍTùí$ªë–f3gͤõ½ò-:Â’K÷R»?_t^iv;¸U÷ £'yš^ü>ŽQ·£r™Ix GˆæV²g\·1È ƒ)ºƒEä!°÷„WÒz²†ç|—{_¼ƒ.Oª\†>¹2$Zî´ !hó5»ã|‹ÙÔÒ† dX¡q \~ *n®v+ ~/e€£ë—0¹(ÖÙq}%'Iá&HòÉò6Ïgd¿÷Eòå8еØ.eühšü÷\|Ìþ¹›µà§CÕÞ½H¦AÊaœƒ8²‘#Æèò ýz•’¡~}žÕÛ²ò ³‘œÆ4r€WwqM+Ô\gÓ0%çFN–›Êø ¨¡¹,±ú_n{{Ø0¯ÕáÇä í¾•e§$Õ+Lw¤?Ò6ÊèW-"üI^DèÑAÓ³öí,`úy f\7üD&ò½ÇœPn`ýT `¦$!ºSvÛaÒ˵6*JâðÖÆêJÌÃ+n¥\ßL~úƒÿ¶ð~®èü•{þð 3æ°u2{ú@Hf=î3ãä:à#¹ï*´kÖ©{ýÓYÛ±4ºÝ0œ™èÈ‚ï,óhà Ù-®øÉÝ/†‰™v°Ò7ïû~ÛqCx¼¢üÿøάaGõx/DÑseS°x N5gI’d& u¸qY/èÅV¢ðji_:ªÉ†ÝÒБS’€'¢>©ç}A´?G(è)<ºõý¾ÃXÑ- O†&(º¦>Kk¯öümßRxpúQùÙÖ4 mt•š‚O¾Ñ«¤íV8]HR¡M\X¶|O–©Ö#Íþ¾w²Ê¿+`xóÀ'(%~èB+±NèN¹Â&A‡bI‡P’u÷îIÃR/¾ÀŠ tïždÑ~ŸPQ¾†þGXOÈÌÝ9jÊ­¡³"£“Œ°U)ø›°É MAƒêîôP!ý©AÖéQ²gÍÄ+Ý*)£Y¿K®]ö¡¿Ïs± !í7û±Ñ†€/â1²o©ó"y…dD¥^­ßG1kª´XémŒ®2éÈ 5û ôÞ°YXg~,K5-Á£H÷Éð¤$œÐr¼DˆBÀóµ7ìº4,UÑÍ7ƒÛ£rc8ÀMÃô5nçÕ(Ö®¥mœ‡*\z!…ü.Å#v¢µã9õ¸Ü'Häg!3–ô.àœrT3,c4 §,«4WVoT%.NÏâ*E€;ൟÇD ‡× zhm"¤²€…mSÓ…Ïzè(–˜” Vçö­Î{P›Ç$ÕŽ¢ÀNB=D@È)øGà‚Üã²è3ÄÂOYõ‘•Zbí²ÂyHÝ´‘í·W…S¬>#:)ÉâÛcÞ„§ÝNÑ$KH<}Èøàî› Œ™Èõw±Ä†BB ç1ú¶mC|í¿ÏŒSöfZQÝK!k,¡ r{iþ¤ŽØÉï²KíšÍ‘(D|ñGüz¡D+(Ç»ê xÈ#<ÕDeAóNºÀÐ~‚¢Gmû`¥”Z´é EæÛÀˆ6X¹ìzf"®ê#X^‚šÓ¸1.nù‘¼}^…BÈWä¢Ðè p:Ÿ»»b¯®˜Vw1Éi\4è G“Åì[‹g •Á‹stXíˆq“‡]]täÌ%VVÕïûÙ¡+*Q=ŽìÕ$*IF­ Š(°Ë*y Îú&È(ç ‘b÷©õ`ÑTùê>Oysýì%Ä~oZ…F¥*ƒ5ò €@ý–g[ìòFß#É ·Ÿ•RÔ¡‚‡ZÍUHµ€å³Ö·¡Ç¸]2²½§>HDÙa;*…ð¢$hŒwyŒ*4é Éþ¨o\qœ»äBEJº‘¢bhM¥‘dÔݓٓËöŠœå±÷V‡r[ñbÂÿVèH«~y{6Ì~½èüH..I!AAà×ß!™×ŽŒ´>YDNÌÀ)l-ß>$¦o,Å|9—s‘ìæG:]8ƒqHÃLA!ÄW`mÔddÖÃõ$8 }K6ÑÛ›—nq¥E¦÷u½àÖ¶\&Ø!œâ¼ró±@‚1 €É¹!ƒí8¬–°Žð.â(#$¾ßÛ98Ë a6åÓ=o“Ýé !ðV1²S±#·dõ½½ÑJœVür{ÿ£­{Ùe¼Ù±Þ´´ÊGT÷>šØK¯‚A¥©†]~ʸˊV"[hÆíøø.0P·úÄ®Ecë €ÓaëÙ†.O"ŸL‚µÍʉ!<Lj§•vK±UY›ûÌ>Ù7—¬"Ð〘 E¸ÏAxÖ^Q:q¢­…¨yjºIZèË()Yy7Á>éÄ+´Ó ½c©¡Î¸Ûû?™ÐE —1‘Úÿ¬©eà €ç¼Kбƒ3E—cèΉ|=g,Ùêó €‹{;xÚ~Ǻ¶[Š/Ýy}–Ï™0žXô`îZ7k'=¾j¯×Ë↮aŒZVÌ9€³¥xU0(f‘I^û´ÀG.è¿ë™¾™Pz Y hâç‡ÁÆ*²}%EYöf•â_ÿr«ÖáZó(ÚZ"±®Š‹¶;£Þ£âR˜¬®Eò«gShè„ :ï]*V“‹fØQ6O~R× V¨!õåÃíçëV[0r‡wÑ4<ËM“ݘÐ:tp¸{¼ëH£š}v¦#L›/îOLGx‰Þ–âú“Lj3;{¼°k2ôbɯSá#[VYMˆ.)‰€[Řcf˜Á÷ò!“¢g%k‹ ,žC6Œþ ?MX(¯6Ñö¹Å Ýƒ"â™wÝþÜŽu ­¦øØ¾­pzŒÅ*Mtká‹›JûtïíÄfUR:æÝÚ1`sòVá¤3à‹Ä‚Üì|‡Ú'§7;ë²2’]É}Ôd%H”œÖ¢’‡~nŽ\¥ كϺȟ(²=«ñøµd 6ÒÅHþ‰¹øä¡V‰a—ÔPZj„ô­ãâÊ]ü§Ëî/îG¼ÅaW šóhÙØîdâG o!ÍÛ1Ùý¨cw¹‹ÆØ+|½pl Ò0’É„èʺ " Õ¿;$aëÐŽH8¾@Z°%tu!L¥'§IÞ/Üã¾Érÿ¨·(:}ŸÜecs™_¥é·¶´uB¦T¨êñ44¨m“Øpqâ,!®÷ íb—û ’„”Ó¾¤PqE"ïF¿¢õõUó| mX¶NÉ[  YØåÕHvš(“:nÌÑUµ×cK‘À‚Ú·Ýò3A$å(›lîZ0°mgf¨FNÖpеA¹È‘z^gjH–8 ³èªí¤ÂXEh[‘Áå p\ÒbcøÞ’ÏTü¬lðvÛ{ÈÍñc‚AžjLRbµBoã¹:{»Rn´ý°Y˜:-Æ"WˆƒSŠa#ƒ“(f)sçã^šÆ¸ÿá8(Ähã8Ó4@ó}\ÜHk‰¦Ïxr™Óa‹âjDºo‰˜§‰ÁˆyG±øªÌ4NðeÏtó>€q©<¼,¶ueˆŠ¡D¯&¾m²<êê8Hý¢ {"³n•NRåì¦7›ÛÃÊRXCíiµé¬‹‰£pmB©øg3@Ò–ÅC–Úº½Ë»ÔqOcTè²ã†D½Ö!8À¯[P@WbFÀ¯ötÈãæÃ’Wˆ“[`¦bK}R†À6aŒJ4Y }sü-¬J2­†h?Û5d*ƒJ‡ 3ÿê}—"o-íƒþ®þ‰1ZzWÌ ÛR,„³JÀà>†¥B¾\×0Wsîz‹]XÏ+:ñ÷vl(ÍÐÑ­6IÎM™þDÕ ŸÅt¶…*0Ö’FÁ~jû)#å ÓW’ÅèìÌø/xpí´ºqφ˜q¥ËH¹éä[fÈWú²ò÷ÕÒ+ì&€,¡°=M+KÒŠք^ulu—êÄST! %óŒJ=£ym·g.Qþ²žzhÓ¯¹3•®kn›À­cÛ|C|e|9Óát7ÃBÿéó"¥c7mâ/[V¤dÑYz#§phÀª¾¦.ds4fQ£–4äŸ<‘(”ñÞà^–F;®jdcKóŸºDsâb>–jÆ$žQnW6<•Dv*Çî÷ÂeE\bz³`˜ŽT²É'* r*…XwRÝ´.«®$‡r'Ä^ÀˆÑJ™~Ëë׈ί<•þŒ[ÚÿÏvóDKBœƒöêªÕ¢±=³ãG¥"<Ä1ÅãšY 'ïÝÐÁ(?Brf¼¡xÛ¡bR6x# lBkêÞD'¡©¼þɘµ‹Ý‚²T¥ATSY)ß%\ X-íÆ{û>©¬€›a…¨™BS,,«?ŸÚAÝ$[s5.ƒß»ª©ŽQ+)F’Õ™©,·¨#Z³SbŒ‹à™†¬(³Ïî@¥Ÿ«Ù®·¯ê3 °&Ðü¶WÒ½Âp sÅ3-K‹Yr·D®7…¿ OTq¨ØþncŸþ\£\AÒ¡»IÄjÕJʉ€'§¥ùáÛòƒ†Ê¥.EÀ‹6oª§«Îw @\›Iæ/ÍDA(&Pfïm·ÅŒ_ÀÈ Ûòw”hÛ›E×eëèE¾:!€ª+SV´®xæ)¼»YïqGnk\LÏ$…OÅw1*èX˜•ñ‘iW¢À¸æóR0ôƵ•eÎoýš½"º9ìÕÐkvSƒ¼Þ£´}ü€T:ÊdS¶–»‹¢r œË%€V–åàÈuý{ €è‘¼—pÊÐÃn?˜ð‰)mxq?St~ å¸)syÊÿæ—?Ð'òbR_` ¬ìvtêx¸´Egûµvhý~‰Ž¹1]Å»ÍSÀ7‡ßB¯vG*:bçÙìuSH×£Õ»)­3¾.J%òY‚¤½œ4á*åÛot;O³ÍT€Þæ¼zñÏ®s²#!/LíŸþŒƒ»ðâ·Ðñø7»^z,Ø…ëhÉÔ4ƒºò”‹3–Ëùó=ê[Cëõë puè½"Ðîú9ó x¥‰;é´ßruþ@É’¨qZGû Å€®CþgË¢øAÒÆOœËx- üØE°^ù®¡ψ=àw¡GKèÿAÞ¤‡º>Á"yÚ?£Ë€ð÷…Š7ëß?£~ÖËúÈHíÇ<[P¨%ôÑO§Í¡ÿ¬§þ¡qÚ­Vœ~ÄsúPÑù;ÜJ^Õ¾QjÌ ”š@"”ýOÇ\ðÁ|t)СÃM3Fz›•¶“ ˜>9TÉÅßWž¹…Fê¢vô_ÍàÞÔöLÁ¤9N|‚hºìd¡bÛ ¸!g°¸ªÔîsk;µvÚ½Sjµ¨q,–—Óq—Oèë PŒÀKçDQÙ „}Œ†ª ½›¢J% mÄQõ3>ïÄd !Jå=0B±*ƒ@'‡ˆ„Û¹Ìf¿;¯Éž"/r,…Ëiuörµ(æµß—’ax ùíüÚq¹#Wß¿Èh@W±´Q¯œÚÁÔçH9)àÄ»ìÈ%„øý’׳cR¤Ü©ž÷C]qI~¸°ÿm‘ À–:N]¸ÈIa+ý|îcz¶˜ãŠa2`9Cµ–T ¤°Šj;Ù” "éS·ºj²ÓÒiqÀ&¬tW<ì'‚'Ro Ç 8š®hþ¤5°ÑÝ­ÑÕgò)ÄÈ´kmtn!÷†ÖG.>#i—ã"V‚Œ?Èÿ=B F°à0v£b–…Íh *¡¸2òÞ‘÷ ÞØ¯‘ëÖäOfÒð¿”:36ÔvG ;’nJC 8)ÇÓã¢+¸j–û]æ¤dµL«KìTÈR:–3ZŸäç{šÎáþIÎ2ûXm‰‘ñkL’LgÒ~EÖ-ïëv†Ó"]&mRÜWüqÇ便ä%OóRwŒñôŸc-ÑŸ3í}ÍùgAb›¸|Fý¯Ž~ªBå,ý)]ÎZ×êÈ` í¸!”Ê­åS$:¤Ð¨®Zƒ¶Î¾šCœ6j‡gDŒ>¼ÏF¬ð!€„0‰A {+&”rJ×<‰9²ZŒËj6s·à÷Ä© åk…kT©ƒ,zìÔ2²˜ÁG1x:uÁníÁ·*d’k€àœSåjÆâ7Í;”UR– qLY0v(ró¢íC§ÝoúYx€—íÇ™@zØ:‰‘™´A¹D ATiÌÙÊH#ꬊ$¤òÿ”…\Š* bûØeÕ1Œ2¯9Úd‘O±¤ß ÀNöVöá"ÄÑícCFÙ.u™¶rðñU\ÜT`QdøÈ®ÝBV•åòÁ1 o‡Ðëy‘¯ ïZ`Ba)£Ï•`Ê@œA˜ä)ó„AIÍh: £©ðïû}‹êQ4»;SF²ß[\ÞC%#&_{=@™0OL]q—|y³Ÿƒ1¿!SŒ #C•â0Öøå«»²„ÃÁõý)&JPlÖF6iGSVªÛÓ|Ý{ ”-°ÊH0x{ô3§B&C¸¼ÃQèWBÎ(æ„ç 3Ç\L6©r Ï rÄ1¾^°mGÀà_6…ÃûÁ ˆ'RÔ@?b¦‘…×oJZÉÈI þJü›×^¬ž¯K¸.BhÑLÓ¢B'[[’’ÀAáPxW«ly'» …Y¬‚À˜d±KÒÖàjÔª¥ÀQÏA.C?¿Á¯|…@|JÍÈ'ï[ùÕ®«Uá§Õm”tÐe³p¼²ÊôŸƒ&Ñ^*[ãI‚kAÛÖŠs¬h«\Ø!tÂ’œð³·7•“Ž˜XOqpo;-}4!"&;zäv‹\§òå—¦QÔLÑ €£¸çäfxPáçctЬ+å1ž°òz½¶mÛÃi=  ¤ŠªCŸºŠ-´¿ÆÖíö§—ð÷ºÃž\óˆ/ˆsý«ËZ²Œ½va@Î³Ž¦&¨¾Š[¿÷Ö5 ¸€Ÿ°Úÿ ¯Üܦ³¢yÿúëa^þ?¯{ðSÂCü“éø{=·»à€`@UOf‘¿Keéï¸ÝíÒ~ÞùP­Ñßk‘~žèü÷Åå°­VFŒb=èLÞœ l=@$E':6ÁˆZüŽú'²Ê öaφ §8INó¦ví¯/¥Ô6#Y;¶‹¤Üò•T?éÊqÞ™è‰JÊbuûßx=˜N?{¥Ùß6Å»“· è ó²?öéÜ”áÿG%s¤6-ê9«=òa³w5[QáHï~µ¼Ṵ́ó±D†à¯¸ó†Åýœr0ø•%KáNª0-­¢B>¥2ñ{ìÅy24H´ëkpÀèò6ÕÑNŽÓ*k`wšC¿òyÕJwHü².Ù‚poE“ ÜèÆPÌœtò¨ (4úÂSárd˜•¥¦YC¬Ueè”È æ}Àlëªê>±nƒà-ééO ×ÔZ7½Ñ¶ŸÕ:ýæ2Dbr"Ø€Ô\´ˆ½FÚFÔ]{@*KA^ŸF8I»ïfJ1 ­AíGiû‰,¯†ÌÎWÆ]š³°~È/‘K%ð~ªmÞžÙ‡Ž¾LQ‡Í¨> z`OCœ¹ …–Iò6¨arf–8ö? 6 ³¹·æ‹^¸BoQLœÐ_ñVµkìkó"‡:€Œà£ÚœÑ°M,¡\¼Œ‰šŒaøS³v ð@³EN¬(¼'ǪYJ‹Afð]~Ä}2oTÚÙ‡-ô@ÂÑÃI`Œ8Ò(ß,å*Þ­(R=|¥~Þw+´“»æˆ¶ORÚë˜n†Â/ÙŠ9‡Qe, F†?¡üi¡’khVH& äF䨴_8ÉÚPN`裻ašØ^SèùwìÀˆèƒ×ÅIí=éJk0‡˜j²#B=›+ž/,ª@{P;öœýçøˆƒ‘*QS%ž¹÷°’à*ãy¬0Ý,½^ D£ÜwC ¼ŒLªº)‹¦¦€1i®smXrܲöŒ[8§'AÄâ|2ûk“c«•z)çÇò—8Õ¦­ ¶}sÏ\7h]µâ=Dw †«¤“CIZõ§ˆß½ìW?]ψTÐ#çø#Eç¡éèíº`xuÿåq‚û@û:v æ¦bªB¼CÐÄÙÃé1é(Ü‘9><…¬Ú­ïø:¤¹ ¬íªL4 —(#jîZÙaåñ-Cfà«›pwVõyrÑùB 2¯êô‘ÊçG²(%õíîkVžõwbdqð–¥ú7kø5Ýõsù„›»mðTÆü„1-1Mgvðð(.\ͧZZŠ‹ѵÍiѽ @ÀߘÂ.ZeØðMDtè3 ‘%™=s8øšïÑLQÏØ—·ceh•Ù5l¢Éì©ÆVž À‡¿Èù#B+ÞEÓº]Qð–ЋD„q&bËË6Ɗͯù/¦§ÈÀ˜àAr+Jp¦’‘+Ã_µxFÌCïÉÖvµ™2>£˜¦¢³-ý»­õAC‡¨ÀjèH[ŸÿþûÏÄ• 1Ž%V—8!c˜þ‚…ûÐ!ô©ì-´ðwzdîâçVjØvL…Nƒ±°2ÿ#©X8+d¿çÏÈ•°KVÒY"°Ã×Uu’þ,”%¯˜ŠT¡ó«š5+\PŠ«ÅóN4ýÎþÇ%ÿþAQ…{¨œhEɺ2mp*D {(Ä"Z9 ;ªcÇKë®æÀ¨÷šJÀ¸i¦ •·&aÒ_tkQx¯£xžø ‘?·jÔ)To¢t¸m¼ŸîQÈc¡MïN£Fí5=“ÇÈ@ÙÌÄKº­•„e°ß´<Æ£Üî tügú³‰kˆ3YótG,u.áªKâ-OYø~¹¼‹à‹Á›·õLê(´aƒ)yëɾTv^g<k3E(t'ø .Á‰(î‡ÛqÿÓ¨ãsnqõþ)¢óøŽ¥sû6¾‘•NÚí(~üÌÁÔÿˆE)V Lµ°gµk&'g¯/øÇ^¯cºÏí³O>i$ä”<È~ÀŽ=NŽ"Ø~ã¶Þ¶¶¿Cñ÷ú±mÎxÛþöáOu(Ü ¸⿃Òüž|éýOí³ý‚·gÖÞ»ý.MˆeGŽˆÜ„~ÎFý“ú{ ã»W,E•¯ñÓÍò¯è¯sÈcá¹¾ÓNÂFôú€yfmÿ^¯¬ó‹ÎZض4›–f«Žæ· âúcclÛ¦Xb­6}‚8' ©iÕÇqö˜>ÀPŒÐ¯¯Šó—(k¡vjì½WÊT€{òá£u^ñD·ž Šk^<t\-O1-yñL¤Éêðt.Oã\’d%¥tÆ"5úÃÔM)‹›@ÔÑGµ…Noï2ÔîW»4T˜‘FQQ_Ò\õƒ“ä¶jA¦£vÃÄÊè;xóýо’‚_t%*MÚHÛ¦@ºzc—w«UE7^ ¦OYVó§Îé‘„H¼ßÇ0KÂäTÎì÷œ“cŸ"±Ñ^½7,9>n¤®3“mk×€™1C$É7lÑu²j5¼F­q(Äû”Ìòãå }ƒ¹ÿ@ˉñ¥ ð…JŠAÉDÅ›»{.ýPÍnR9ͯíÉà…ù÷ÎúpIÛùÃ?úZ¥¦¼áÇ´Á}ÆÌé9¤ò ïÉè59à‚á–eÆÙW¹1l*x ;&‘ô™~µ[@ûÃ|ÏŸ.r ŠfvñÓläÙ|ÿ$-íÑûÔöëéM}·ð§sbõH„”d%òHKŽfÊ,[„¼E.³ïéê§&赺EÀè˜*q ¥¢ô@—öƒ+Ƙ¬Ãˆ¾K ÔqÃaëõEÛR‘]†ÍDøÞSôì+Ðüâï%ïÁC,1P¼~µ¸dJ¤ˆd(LGB ‡‘†PûMÓUH1b½8q•‘½x2€›¢²èvÕ®ö-†q[9ÇÞ9Le·LÞ¯YíšÐÓ'E}MG˰¡Î±csD¡£8(E2æ˜w®»cºuøìÖ»«ÀWH?gaÀ5n ¥4u! Èƒ;ÍÙ[Güï5{Xe1SƒNˆm,%SŠ2{¼ ‘=œÍ “MûEç™<;ç›JD29qÑŒ_¾1¨¦ W@nª;‡¶M˜\sZ‰€ )H§ç¤ãR¢L×UÂ!ƒ@”eÈ ´TR ÷—{0HéA ,¨ ?[ÏÊ,(êcv=Ç»à;øyˆÍuO«ë²=C¹^ÓLÔ4µ^Åè1Ó9yŠó¼ëRµNˆgœ|¸Ì‰p•«ÑVI‡dÜH^ÈnMòó9”s…=.º3ÕYÊ·S…/—¡þÃ9ºU ïV¦]¡/S#òÅ£½P{,s«ÐÅŒÅ0ëJÓàJ.öö8Ø¡ ?…oôhF6íB ,ÿ$>¤)ôa]°ÕHB2ŠàòÝí¶‹Ô5"ZyÇnGýïÄ BÈc>7…Å$=Ù!{À`:‹,Û°JN>ürª“e×êˆKáÉ¿šÊ¿ô_K;ÝpÑË=òîÆªaÀæR 2¿Ñ^°ó%‘&)ÊÎ0׋C*ѽUª®Eò ½uHµþ3{(1ùo*èA _÷èvmó€‹öÖQÝÓŠ@:—hMžûr…g¢Š›V7hóUÍç=ö°r49’w&ÚÌ×Vå]5µ¬$ØÈbc0b² 4ôNYôŸy:ǧA­ÆQçà!ÈYÛèÔ½“d‘y# øó?„J"M×]è˜uv4]%æÈé–ù AÚ¯KïÝ’¨†„Æã ª7:ÓèÌDu…V•Iº ¿3p¨Z,ÒO§ßG?#CŸÀ›cAZÇÅãÚuŽY;*«'Ž5™`–L«“Df¶U9zbÜ+Ñ›°ß—bRÅ6:bâyIg•€!oªÍ˨!ÏõØ”¢æ§k÷• (óâÅ]‰(É(=Éòˆ’´A„»ÈˆpVY‰˜,6Äêù^€žÙ_KЄ˜Z É\'¯Ã#Ь‚LA hª·m¡ý¥ç\0¤"héVÈ—,­öŠN»‚ïàS-5¢H:§ç.C¦lÖ˜z|“DAû味ð‹Eç9ìuŒheÏb¸ÚYx>`¬Ò³_Ÿ+¶:ºéø:Ì‘£stW|õUÄS~Ë‹½¯¥wo£h<«\…•ƒEÙÀb†€O>Žˆmð÷ú§_ch}2çøÙÊÌI|«YÆC;mLQǾE»6`ü€Gïù– ŠbyÃöÉÊxv,Çk•¬ìûBoüî'Ê{?Üåä—¡ð¦Õ9Of84æZšÓ:ågŠiÜñXè_Öƒú¿•µh¹ Ú¬uðöçêÒ+Šó,à¸xôÛáßà•¸2R¢vA¦Hì?ÍCú¶s@ðy­ªm¯?0Ôü‰ɇ‹Î#à;÷ävB&€@lÜ©d-lxQ$&A¢Ã£Ôru¨TDÄ÷ÃGMÊX ^.Jž¿}¸„yÀÓåBíTcµ†b¦²ä` TÁJTO7Êɪ_ie‘ÔT¥Oq]×Ñ„FëЇ‘XÄõ[žˆrmÁƒ‡eÍRñ ²œ"²v¼™6\Øü4ËÑø_ã©5£Åj~BÝéb ÈE{üœ *'¡0ÒJÜ;ø'j¬»Ž?Ü0%qå± Æ¼Ýu— ¿«Íd§”ݼ£¼2:÷Fk?ÚÕv{xãïž\ò.zѹlÿVtèØÇ8†9fh|^.&B~ö*Ž/ o6ÉâÜPïÔ‹Ñ'°P'|(%×Þœ’åQ{>Áûª÷ä„Ë`Tr4øÜ̱%¸œGkQƒÛÁL2€G¥©³°s|ê ÇùuC-¶8užÅ}a÷ã{ü×zš™5\²nš@zýì+¨ð¦BК»Ñj؃`x0«Èy¸”$Ô|.`hÏ[×°R÷Þõ TóSŒJäQKÙûÍW©¯¹ÛØ{úhSÀŠ3H…Ï]²KPҚĹjn9*™8ÍZf×»ÑÓo! ¢ Ì4RŠ`±I8ô½(j~c‹cÝ) ö5Vâw&*…\Â$é½È¤ŸC6w#'KüËÕNWrÃ6þ;ñɱÄê º7<þ-¢ó-GBxsà9c2¶G?%?’ÄÍÓ`‡Qd ”¿|½^ y`»®‹#@×H „ÀÅ* d aŠÛøŠ#È¡7ÈÝ}g»‚A­^bd œãجú{ÿL|Š&®ïO¸ƒ6˜qˆ\Ès¼ãD”€Á¶ä¯v¡Æ«i¢›+d ¬êZB´í‰ rW#PW,{3“ÒD# 㼜ÿEòÄC9äŠäð8ÃH(µS¦’Ge—fžaÃý©ýßëX‹)•œ( yKÅŸÁF0ËÒòlçÇ–çS犹'@½KIoMwq",˜¯Å %îîó„Ø¢“OR¨“ ‘ΑÖäUDŒ˜É’ UÇåúÀûðÕ"Í~öQ°r‰Mq­À_ÈÛ  y ºç^.F…\X¡(ÂàJâ-­íöÅ¡¨q°/ß “ ³†4EaHŽÛÈkÛ £C$+J'´ÿh¨ìcÚˆÝ*}$D{å»3Ñ[t‚ˆq™ÇÙ`IÌêj!·ã™SÚbƒûí.„Á6Êìqž´#bw2êÉ&M±a„¼L†DG‡Ô÷Ÿæ“œ_ñ£çˇr`ÖÄßMV#ªx’=ò%âuÛÁ°1µ¥€L.$ð¼àÑ#ûë2UqÞ"ËnhâÎõ|ÑàbN„#uü½ÀÃjú»ÏÂj‡‚’‘ǡٯ„‹:dúuüA…§°Ë {õ¨‡3¼Oêͧ>Š^VÉôl@ M¨÷e%ƒ™À¤5^jŒÕ°ÝÃò 9}†BÅe‹ì”É©,‹ˆ^/ôêED„æ]¨º·D,ÃåÝ£lYš[õ¹“ϸLKp!VÙP ‹5 öŸÀQiÒ*‹I2ˆóÙ c¬’÷¹EÖ<¯I+_Ùô¢•23Ù Õ—©ƒþLÚŽx‰Úä1­ý¤”Š> úo» ¸^Ê®x¢B|ñTdHÚ ©ö!+µ*YwI+ÎQñ2„ÓéJ`PÔ9´ÀT£b÷PNðãa/™£ü¼LOèÔïÛƒi#½ÙÍ{¡¢Hsáàÿ8Ñyž2P·3´àÔ¬Õ«žÓÎ-ö§ÆX’,ƒ`†…g¥K/-‰Tξ—PL<~ µ Ù#~Ó9µ²xåÄRÌ럲§ìL’¶º%–‚œ¢Ô]%‘Lvãw±êØØJzÛ&îÊëÏ0àB‹Ø©7zÀORií«×.ae ÞûW0Ÿ³N×lFµ'ñ–C*24¸í/ڻǟU°˜àîõŸ³úoi…1Ê7šÏp¡Û‰¡q"½Éœå<î‹b/Jå—ÔÿÝR²dV…*OâaKˆ'<Af!:û,e/Wó¨L:ïG¦´¾ÛÌ–Wm£4Xp0à°”þ:–ïfk¶-y–R•è‰PŽ·QÕ” {gˆ…®©§FÖP4ß§DNŠ5žË]ŽqUÀÀáâ4)GuUp‹Â±šMâoWp¹ú–Ý“`Z$êMà)bÝd”æý‰.¿í\~å·•7…á—I7˜? Ú“øžõtöÞ‘pçF¿|:¥ZÕ˜úô©u³¶¿¼/È “(*¬>ëëuŽ $ñ[â`ƕЩ`n˜LKìhÃ'òÄJ;Íå‹ð b1ŸY-‹À‘•´>P{²Ñ¾Ç¡ÈÕ¢/ÉTµ!º….]µøýwž@o¶­¤ÎAH$Z^3w›¸ÃÔ·º•¿2’¥Ìé7äÞ`Zµ=b×£MÖöLÈi1+ÐÇ,ÃpÕ˜âš+ïtßIÃõ´0ø!5ƒ;šŸž²ää«?QtþzTœdKñy=hÝH0$õº®Œ'AJ€£E×ÂAï!¥n×f&Q׌yôö!kg|úÂë«?b±óï«©QÚ%7¢y1rç Tèwo+çÜ[Ö ÉxžÈa5€žä¶­î„‡†ôÁààÛ û¿GøE¬õD$؈]Œ… ²«øÈ–lˆ»š()×É‘KÚLs:­c8è¾¾Šûâ«*µótCGBØ÷··Ä]§Ê Qt_DäbãÈzµ!Ga¼=Qà¬L p iˆ‘žÍðg\îV¬‰/; Ù'؃'„ØçÖ=,ûd`úØ*û5¨y ¸€Ø>Kš)Ý Š0ã˜î¢Ý•IÉ‹\¥hy!U²«zâ{.×ñesÜÇÌ0IµÐ«‹ÎIóýÔKì)4 "”/s(þÙ¸>¨ô‘Û©3ê ²Y®:¨ `&WÜ·êQ9–=\v€HÐÑ‹¡9ŸF%n¿KVe¤%~à‹lr• iÁ ˼Ú÷ñêQE¾Iì¶SóTe<àH}3Øßd%a”¾Åd—rWëÖGóê"nûœÔ”ª’ãåúsG3Óky[<ÂÍ{UK~®l0‹£&¨w¤‘v­:öŒGÏãh$¢ül“·_°©Ú¢`^ÚTPÖÁÔJÐ u ÔZדtGO¦™ à¬À¾úN8jµMiÉq=K¨t66Þ·zUÕ Çë£>œ+éUºT-S_Úƒ&§öí±ýZ¦gûô‘/ý™záý¤ÈOÿ(¹eQU,Ð ÜÆ®Èžìy—íâb$U0ˆ)ÿP?¿Mø -wœU‡|Q¦ÝÆ)¬I,ês6DÿT fö¿×ZÈá­8IÀ˜a(~ȺJáÒúëõ?iKo+zLѪ¯›ãx˜=D&¹ØhL²²u·inY]ú8d7ú!uÙµ-öšgšHÛGýqðˆú 0 ¿‘Ì(‹!ùÈ [ŸÜ; IC²`B°™g¤TfðMê1]µà®‹ÇpúŸkÅë ¿‹ô`¢1K|Xntç<àO¢GŠwoHGAYåÀÙ'_¯4ý…‰nžŸÈ $ªIOâ†(|À÷ùŒãk ÖÊõ‘Žf<Þä…` ôº‰˜I¢‡5ñw¦]27ô±®òàDûÝCCíÞ¾?é‚Ý(îü*|ÏT8Ø'§c˜lƒrÆ·=kÝÃå&åÈ?‰1@ÅÈe€Ù¥Y`º²\ù ZmìºÝç­éÑ©®3,. 1¥ßŽ^ujáÃ[Öq®yÖl_ê¹—• +ÍõA9*Ågß)ε´ N¥|ÆüÕ y‘à‚¶±/¹³úÍ<¼„ðÎËXcµÍãç"Å9ö þdŒYcéZÌYiȼnÄîI-î`DæàsäLSE ¸‰,Ô’6*ߨ+\4ßs€)‘xE-A¸XI(²³N'V&`D;Ó²šJü]gÜj àf€VGý°©0¨¹8qºq[š6©Í¯oÈ+;[õ5ʪÆM9d9/J®{ïÅÙÈèœQM‘ÿ9çÛúï4ýnK'wô•Ϩµˆ?¹íýÀgj¥,ñÌœK²»sÒ2`Û¢IëÏ÷6-Arz GÇÊ%¨È-›»ÁÂVè÷Xб1F¸·J>}yÙYö§å˜[¢Í9ÚšI\17¹£â…Ãu{Õj´æ’,àÐ×§ýQî˜6ƒôyÓ¨{Y5»\†sSHr¢¢MlÖØä ŽÅ(`4úg–|àΉ6C(rÀõ¹²…Ä"쯺Îù5Ï…Ø Sâf­ìï{t”(☫=¹æQ®Å~©aTc_ƒDÕ]œ(RÈ3 jº/ÔôV£ Ç–Å1cIÿ?Úc¥ àô „NÜ`» Á»ªXŠM#¼ã„x×ÈÚ]ï Ñ!™J8 Vߪ ‡fm¼vu¢šŸr S‹ƒ\^ K”º±Þœ÷M¿<Ì0ÈÖ·v¨³jn‚€¡¡eiÒ2ø˜rWiëaœæsÚÿaUIø_F?&®p‘­ÒjÖcoÏ È!óÑåKM dù´1Õ@øôÔu!!Íšímûíÿz.+¸5Ì0ì¥ÇÄÒA´7Sy\@-©í‡öÔ´ÅP9•\T¸ìFüÏŸÛPÉ%+öÚwB‚®ÆÙÊhÛ†#—öî›ÒÖ^<ØþÄuÐMŽô'MÑ · áŠA9aÌ ¯d¤ÕKpI^æÔ\"GFѱ AÆNzV Ü1·BáLe‘‡|:ô5<%N" Ú´iFiP gÔW=’Ä\bV2&ÓCš "Y@±‡* ° ·€ècÅ|뜽`@b¯zJ)"PŽr15®óÓ Žt£Èœ,I-¼äÑ ›ÇKQ ­¡k6zeµ»b²:†‰ÏˆRØ/˜Ü›ËÊ“¾ÂÁº ¨ð`(jüoßÎ…pUJ¨giËÆ¼#Û½—Šù*â!ç¤B"ç¢DnYQtøöÔUþŶmØ¥qÜ9漤'E+ÆãÄ ÁϽ®˜ÜìVžò-Íû—?¤Çªõö%œ…'" ÂÛÝü}:³PGº6¦[âäŸëT£¹Åp†‰ª­L}Å=â0WNPµ¦¿¼hÝ3¸'ÇO¯dCC‘Hã-Ò ™uéZj›™àf[ƒU5¢kËUüxzÃfÆP H:˜Œ20`mO¨5Ç1„alHM€¨À1>[v$…wÉìvIç €uùGØ´dCê!cdtÚŽóô ¢`¦(tæ4s°Dm«ÎtVÏi2 a©ÐŠÀ«µë™*45Zsì¦.mT| éhŒP_,ˆ¦6^1TäzùKKuƒ‘GV¯»œC¶P ñÌḭ́’èvëÂ*«›p!êÆM'·ÌÇ‘«(çxá4^õåüjó¶³°oÏü‰!x­“ˆÿm 8<}pT Š˜o¦=Á¶áË E»`ZÚ3¥A}mcxÍ‘—@LW4§ÑÎÕÔ]NuðÙT%½_¤¦G)õ&óOgÝÉXHÀ¯èØ$±Y.ãµ ‹vE˜6«º±Ùð°sÜ{¯eÀí y|]©(Ô¿çõûDç_1Y¾ý–G·Š-¼^¯mÛv«ñº{ÏE6¤è ¿·ò#:úérç¹øÉ—#Æj°·í$>žåïõÎ×9Ô+QÅãyQŸŸ?“¼ÏÊø’©¨Ë‘À6æ¿™¨&£>…È+à•mñv 3F¬\õ oн‘óÃé‰'xþ¼ý|çðÝjŒ'–œ÷oè™i¿Õ ÷}(ñ?Ê;EÞÎûÇÅOè¶÷ ‰Þ%z~‰ÂÀÐøó³ʧÕàéP•|±ä¬=ê¸okø—^µ†â`ü',ø­Br`nÍO% ŠÅ_‰‡ð¾t‘êìJ~nZ[£šUýTÐ{¾‰þÞSg;úot.½ØôS¬à¼×æwQ  R¨ìòf2üùÄ_æ·œèü ‡†»'Í\ç¶žM T“ú ; ƒñ¹–°ö˜–Î/û—­Y’éiZ*—ÕP“Llc„Ñ¥̇½c8"þË)Ól6ZLQ.-9ƒ£D5çu:^¥~‰Oeq H¹…&þƒj#1ÞZhZ¾\‘$F¢Y“¦~Ü|2P,ʽ£€Ì:îxÎò ª’êwQ$8ÛÁŒ|r¡ÇdÞdH§#’ø¥Û^ª(Ès«â¶ß´ñ8Ò­9ªì€Lk˜È8»‡rÐ<ôW:ÈòD¬Û~Õ‰ÃtÚÃ=npL%;®U˧¹²‚ƒÃ¯=êJË{lùN<‡³¸-9I›gR¢à¶ÅÙçƒê@½ )áŒl 3=ð³…M6æÓÀÓ$eæìõ:)§Àúd½Î'ìBnÕÜŸÑìiÊ´ËoY#ƃ˜„¶¯Wctwb.Ê—–´Ï+<Ξ å y%]Œ’‘y¬g—¬`p0ïߤý?yAˆh“ ¢E¸Î!tlqZ©ëjî?c{g©UŠ7j;¾_0²1WLaJøÑžGæe®4ÐráÕÍç¾qÔ¤] ¬‘ KšÁ±¬Á(ÜÒݶk3 o¸ÇC M`^b¹ù‡Ç;4yFѬœLÍ¿Õõ1öh‚iTXYÎ Ê3Žæ hé ´-õÕð.ã?2‰ ?§Ø Í\©ž›©"nx®£R¹B•ß*o®®Ø}sa²,Ìá6Ÿm0µPk"2PRL-ÑñPì2Η§ÇÔÒZ(óùP‰µy–WC­~H×w=ņ›Ü´!hkÔ´† Px³ñŸ´çá•‹ïq®¤LYË?ª_Nò¾©šÖ¹ì€/…:2Öð*‰¡Êw]R 5J*\uâó“xÑP{‘²#GfËûã±€æg,÷{¥Ph…ŠNS<À¢ý Ákáâù z3¸]\Š“[R@“:ž”>ÜŠ8á©ý/Éh£ *A®qØ(V°ØÀqU±ì³à•¥¬ z€Ñi¬VhNT>]t>Š1”'æ§9…%f¹è ·VÀ­dEq‚§¡,Ž3€RÓv ¥bU¡A`|'Rl0ûNçØqû±¾S¯/à‰\Ì,Ñ;ë~4]9?"›G"¦BÝÚ¹)!äM&5Œ«#•â#œ˜*õq¸kf(„ø¦»u*M.2¸h¢uh¯<è®%@*ô¾¢V$„IUÂaÇãP‚ÑuÝÏ¢@Gñpœ!Q¢oĨv¥è° Ë¡.;` "_ûî«U A+J1¢³9åéä‰Q?™Šsä ®8ÙlÙŽ¸`‰~¢h&n‰ú0ÔÑ{»'‹9U©N¿¦È讀Gì÷®| D›|žˆˆ6¢W\‚h ÆFÂÑͼ_tnÄ¥ºl+ö*Jþ bvŠÀ‘œ/¯ßAß$,,VK®bdU bµI3s ê³Ö¦23Cü?Î Åñ3½®f¨(Ê¡1k{]¥ 2.¬3.šÇh§Âãž¡‡â"Ïu?{ËÞË3YCÇñ¹Måïí"$3¤WÕé£f§¥©63­3***¢Yl‘txWMœ ¢EqEÿ .ù ;` |æóÑx@Óq€n R'¿ž> ‡)<$ÉP¦:àKÚ#{µO”øÑÂØä^å… èñœVfÁÏÖç°ðèƒ)–ÜŽÊ;‚šÖhq‘¸QÕz«´Ð¨ðÕßû:-ÂŽxmÉÖÁ ö9ëyÞ´tð“Eç/ï™ú“x÷> €‡t_(ñ><Áxs__ðo¼†Úà>€!ç/ÀßO9ûå/\ù_Äo꤭Jø{=˜v.z©ÃÖ"G<Ì ™z|>µ‹*@¯ïxmÐôAÝý;߿ՀÓßÓ=ûz½^ª¯¿×?rØÿûï¿GÜî¶!¾‘~DÀdÚ ? ééÑ:¼^¯{ÑŸkûä¥7lÛŸGý{-çš?Etþc_Šª4±‰ß¼Ÿ¬qТåÂà¨iËúwT#røš7']eÇ4M=7û ~å©QŹ0FveêŽBGœÕq….fñY'ç´ç³O1HH@N¿›P?8ÇR°%e›×f=~ ÈÖòvuyï¿Ë“Ö\Ϡퟤ$ [F3… ëúI¡ßuhYçከý€lÚ9.uÇì #¦Ã, }¬‹]ؾ+Ol¿(ôlL†®Šäò€rÇŸ<®`ëŸÍíJ/ˆ¼(ÜŸ>&êŒÈC*6A¾’؃³ M›ÙTxÜ)ïåV¨qæIè­S#)Õ’Q FcŽp„LeBAT ·”é²íÿÙ H,8» Þìx®„Cu’fxŠÛHèD«¨P¹€©àÛÄÂ3RúÐ>ã[}GP0˜ÕÌà|ÌuQÂ`1 rFÊaâ®UºØø •)àÏLÓ"%†4}×ÚР¨éxéN ØHpðWwq',DÓ^¼—;•¨ÇHÒo¦X¾£|~€—@Ì'›j˜œSáÄX1ˆê‘ GµÄUoKnÁjÁum7 )XêmÛ–¶ÃÛ÷.0P¤*dcHë 8‘QiÊÑLòÂýØh#6AH§ö|“ß»V0Ïn|¬$ÍŒDÝ´¢3Q7„ÿ¬KðäfC°Š^šÊæÊú´pU‡E;Tºƒ|¶µ#<ØU.–Eš\Zc=Û3¶!7í¡ÀcWº³JJB` ÈÙW}Üs9~t6ó ;}Õ¿Yt¯ƒË xzÿ¸1LNp=œ@£€Xa‡õ'÷OŒòGÊœ³¦Ç¡ ç‘Kù7'DÜsä+±+œ5'V¤‘$e£ÁŒ ±¬Ê¶¦K±¬(¸Õ‰-šj鬸Ï`›ÆÊã-”Çý†®z`É‚î !‘ƒ˜3È BV+èÏrQø¤(@û?¹Ö¥+AîÔ}øº…e¾§WCšRã±n£}nbE“¾ÂŽ3û\> b"q²ð@JC¶ÃУiI à†Ú:˜ìÂNé˜ñ^„à¼ó´tÑØ<NdLœ“N“’ÆR˜žhõÚÐ˽G 9ÎUY@?l“´ ¶r£äf*ó¥j–Jz^[ó¼c‚ÔÌKcÑ«Ôoç˜5'9²ªƒï}z‚ý2Ýêà×)I+8®Š9ñ$­ìZy_(Ò«¸'"¯¢E†"†/:zà áZ›Ù‰Lƒl<JJn6Gãé$54Íy@&âçœî&~%;óH¦)®6X„ÇG–ÚZ`–y³‘r ˆX« b€Ë£7¾a}¢u©ø o\9( A ²‘µ«=¦ŠX·¸È•ϦÈüS¢ó‹=¥FÉ™òÀœ.2aœ†{RI|1±ð‘ñm²À% óŽ[%€èé"Ϫ|b$ÃÜ¿¹äø½¯µ‚ó¯²Ò7õ{ þ^ëkæ1Ò%^ ßÉ8W0ø7Ÿ:1©…Yß}\é½g˜þ€Î=ßî¯ø÷Dÿœòß럖ÿÑŒá/ò¹w%ß¼œCôÚ¶*Í_þù¡°ûüŒ¶Öp+<ËÅÀƒn+ë–òþ‡ u,ûË¿hçÍ6a2É÷Ûc÷GÎþßkñüXÑùŸ¹ØÐy³ÄÝhÿ"Ü‘74EµóxiköE^úK¯¯¢£é%ö“Ñ’‰'lj©Ï9÷x Øy¬¡ÞÉPÙ†c(’š¹GXK]{ËsÝ)GCè'ÎëØ{e’C£ù«Yº="}1Û`7q!´¶ÓÉsdPúF€ys¦© †¿¼“*ÈÌ¥uGJê}«í×üv”x`ážó§«DcÌ|«]Î[L¤ bÆ«éHâçVtI“"J¶Ù$}-ŸŒ}ü'Vy2±êíþç°©}Ú¶ ¾XvŒ“;”wNÆä·ŒÞ”¿l$˜­^AL8±()S€ËË1i•RÊÂÔBŸs´dúyÄ\üI>Š+qy‘ú‚ˆJ¡Æ÷‡„R¦hν3bÛúO²å[â¶zÒ“ÁÁä,Ë'´oo¬AIn§ƒÞ_:=q ã¼DÇÏtZ—oï…M£ÁËmHD`LaðÅW÷—qŸÙ¼‘Ti¤;C9mžÜ »•‹Ø bo¸Ë®™HïªxØVX€HŸ…| sLNŒtôóƒRÛ‰'/Tð˜ÄVì+Øœ#6s·LPsåœ¤í·®Ö7µ Z^Û±¹cu]{¤æt7saÁšö„§›I|ãípðëõ3R~Õ‚*†ÐÝ0Ÿ/Ðä6¡×q Er7Å^Ap“;Åw´&º2 8d²ò`n€ëÀkŠ¿)À…ø ô*hÈ,E¹d” Ç©Ê*ì ùÀÛKdž~½öч¥‡‘ *vg”%ÔFôã ¨ Š+(èÊ'Æ8€¿Dè#Óái(…±Zµ¯‡™µJµÏîç$|êZêÿXZÁ‹Qj]„»âé\Ø¥Q†_Úa>üº:òÚ"‚Nbc—L÷oh‚„_ë(°Ë¢Xª˜YNôßÿØùÔ‡™Û _ˆ„H¯]nŸ w@jë¿sÊ öçµp³Šÿ¶òP>ÈäClȧ a™µ|ñÖÞyã¿OtþG{N=J]2ø Ô©‰Uú4c¶_Œpzƒ';ökñé…=¤bºÂâcïû•r6ðÊž‹®Ìðúú{äz„R¸¦öt›j6¥ÛÏ£>W9Š;"‡X)è›:K£éÆu¿ŽìëñÈÝ>e:ǃY‚ªƒ¶ÿ.¶FÙrà6€&ýðiZÞcÓ-g¡Ÿêº83oNâ4Ì* {9q¯´5Aq^œ»'evJΡMü”ÖÒóvZþ$1ïß4£‰Åݧ¦Š 8Šç œËãL³Ù~·¯}®ï\^ijH™â âÞ£'4„*Ý…¦ê¢ß%§4–¢Ž ývnð`Ÿ«®Þpð=*Ìû¢û gÓ…TËôV“º¤-W‘` õÙ¡j9ÔBÐ 3Û{ ëÁVm_.ú˜©p‘@3¥Diù)ŽðÖV¨I(èvƒÝ8Ótqí¬Uã“%€²®—ÈšY‡x-»š ºÉ)< Í$,Lg3Á[EkhºªÅªç½¦gÛÉåRpÊB´ÇNXÔ¦ ˆøz½– ×€¹ðtñ vŒ’è£>8:¯I%vWŠd0ªkÄ f%AoÂvE5tçˆLÌi€êuÁHŸ­Ç°¿ªçdd IH¹wý’2‘iãxWÜUe¢£@út²"ì̶H™Ö1€(u7†Fñ¢Œ=åñ®ø½µ9dB.ÖÌf‘ÑRˆÀ Ý+©˜>l*èªÔp?D3,ÂH”'Ædºšw-Њ”…Û21û†ÄßèØ¥cˆI Zq ɃQlÎUÁVþFWP.³ÿ®Mi‘‡ör5 Ä‚ “Erru?¢T€ZÀÇ©àm¡›… ·¼†@éø×aZËjL |  #…à{-Úxƒ\eƒœB_Ö*GÎ\3¶íz¸:Ê–²ÔÙÜrö•©çöŽ+-ÄKe®r Ì4TWSt¥Ã»CÈ“üN´ë}ÇçÈÕWÜÏU$~’ØŠ\ÊyòÕ‹„ûóíQ‰ œ5!r ¹ý ­ž£ÕÀ¬Ôœ\ÀŨ¾'4è¸s1Ѐ,ªÞ“uD­%Æg(L[åz"ê$kÌ}­ç¤¹¯ñ>exŽM´“Šp»MGžpd.¬mPÍÃ!i@ð¸ã÷q»sJž&n ‚è·è 9¡1ö"cÁ#Îç7ã Dö’žˆI ÁoFÂ\Mb©÷´,HìÙ¹ ü”¡‚bÔ¡P±Ó¹B© ŒAŠSó¥¼DX)€ÅVò·â+Ÿÿ»EçOX3Tšù»ÞÂ\ŒežùÊÂX/5ÔF;”g‘À €‚×½Þ§æÇáµ³_"È$J—·•îó à±âtÁ,â‘è;x0„JfSZ G8–·Ó9ÒÀR;¾éK €1x£§xv+@!œñhs¼hß+ù7Å@¿&ºþ`n}%­^‹{:ÈLíJÝ÷èšñ De€ñ¯ºL÷M/0úîŠ)± ª6çÔrÐLÌ¿ÿxÞD4ˆdt["Â~ÖùÏ1ù0y–Ã6Àãà 91@[7+óœñtÎ:-1Ocä4ŠV;­¦úÚä7¼¦ ¼Ä¾êÃ{ë›Vì’AËUöë½ €¢ W_½Šë{)gLå ïÒu‰,ðÇEÓ¬‰ß¡)éÙËICîbLðµÅçu=V°m*½mÛë…ïRnÌlú Ýåv@¨útê¾|Õº§•Ê<~WÑÇ,2Äi%å?‚A ™3Ösbì¯*_yŸzt \ª«BÝ{³¼øW‹¦Ý‘¿ŸbüBÑù_òj+-í¹Ò«YåÞk“NÌðºŠdªÇhÃm7XÅ<*4ƒ‹yÀ<ºšt§Íùª2Üè.%$riçVK[“æö¥>¬Šýè¾€Šó ÙH˨$xÒ㨙K Rï`;š¯V Cé²q‹œ’9/Û9dýUý_š,’sQy« šÃ;pÝÀœ µ’;ÁêxÒïÑ¡µ¨}þ”$h´w]ŠŒ»%Áz]íÊî«·âºÏ=,$e£ÛñdÞ)8³®.–½Œ 3˜ŽIø8+]xÌØ*¸¿©G—I²6bUcŽOpàYAyL ÍxédÑâÝΆYÍ®S;k%L=9} ñ²:}ê(*Æ8H ‡³Ù êt%ÀRÁÞ”F,4ÑìuÄéø¬%3KjÄ’l-ÏV†œ‘ìÆv¢{t¶!¼¾·ïÕq° OKpQªâ±—Z©šO÷çÈ€p±¬€tÌO7Èх~ÜuÅOÕùöDZ¶‚~×lž;ƒþPw"Ø6BÜÑÿ—Zð·šbXˆŸOœiZpgÃÖåSÔrõ€Ò5‚šÐÍV" íf¦d^ÀyæüX¢À G`;^<Ê‘ér㜷ªü†—UEù]7÷SEçPÑ ÂT묌(Âë\#ÖÕ*õð‰ó‘…Eã"‚à׌̺ý‘pYxŸ€Ö èæ9uèü‹T¡eÄYäCmŽšÆê<04ÊBãßdŸTÒÀýF:;L¶:}‹$þA;À)Eù6æxÕ máûÌl0@<@B@ÔoÁˆ4!Ùh#¥·q»½®‚ü‰[¼Kÿ7©½·_¾$ƒÚ(Åɹ/-œ—ª`ß~¤Æ’´8VEí¯$iM(Iž/  ôãϽ+Ck=·=êgÂ[.ýÄ5éL6‹]@(|(‡SZjRÍž…qƒ†=Qx ½:I9.Æ®.õ› Úu¦iÊG*§ob;‡ÂÆ“ÖΩYÌq)Xp¯wÖ"Oo¼ò¸Ã­Ë(°ÞòÏMwoQîÉj"ÛÁnÞL2‘ÛžT4hjLë|Ú¯_8DNÒõÓTè\ïàú6CLÒ±ÌÁÊXÍJZào]Ñ ôu’@Ãtu¥ï™¨æ}Z• «(ÀY¸@"†aÍòœkˆCÕJËC—¹;¯›`.¢Woàκj¼CT@3ßx Öàü=-”—â”õâ|Q¶âXQ ™ULFŠÉð²Ñ€%ù\ð»0¿6R‰4E¾'²6’Ò€L´EÛèdé8¼(Š÷˜·:‡þ(š²œ@t§Ã!¹¥s{’ÃsR…Ÿ€CüÁþØ 2 p¥(ÒS,LN+™¼:ßÿ˜ÄÜé…Q¤Ô¹¤á;>3Ô'ºZTªv<ðŒÛ¹œhÍEècÏto¿Ñ£y†üçÙ%)l/s..Tç6¨#ZGaN›îÔÃ>ÅPr¹“;Râ°&5#¢Ü Ú)Ž¢=¬Š{­ÇØtÛM]ç'1VÏõéXèQ€LÛ‡2 ô"DÕ=fw)‘ëûì@èïr»ýz €høÁu€+îüØÔÓ  §fB€ö²†Î¨ÌX}Ö¦«†¢he>¯ÞHÞó4Pu‘¥&—?ò'2^/Ü6ìÁð¶m{”øz½ô¹[amYòæ•Ù$|ª3O[Áè§kÈi~lôEŸyQ·¯~ϦªA¿œ26SëžN ¤U8—yù–§0e^ÞŦå–ÇÕ@ÿÖð›+³ß|×ù:~p¸óô…ç%“íåN/'Úˆ¿QùêG8×Mâ[ŸÈoÿ¡1 J ‰„— W4 7ÃÕÏ£MÔòØô/úÔgÇf­‰q{´3˜êªÀ—!¤\Œ $ÀFú<…B”ïMá+ÁXbd¤ƒïðÓ2>CÄ>ÚªÅüm5cÿÓËŸC‹è B ‰îwPëមaí¯¨É1l¹•ê\Ÿˆ6" x‰~Âшª¾ƒhª÷>°‘(D*޵Q¼6#®r ;’ÛFwjXÁn>½vÿ³8´#0"9„eânFÚL¢ †åâ7$éÆös­ù¡”¤YçŒ8Ky›ŠÉ_b÷‹« 9x¶ ›Ñ7ü1D³àqø¶ýÔ!W\R‹”ÐK§‰SE%ÂASOc»îö:áe¤Ö¯ï`DeGGY‘ì4HT–©”ŽY¤|œÜ!  ý€«–7WF&ì̺§E ‡½XÌOo®5»ç$Y“^p ¤‡rI^*•9ï|ò q®&â3}»‰#n–%§á÷1Œù[6N6ö´yŽÒçḠ7ü"OPË'W¥Î‡RÏ×UŸãâBêŽøV1ús85‡âM‹Êüp»¥û=^„¡Ñb: µE¢‚Äã ¹ÙqdŽYá‘(4q_–ߊ¥MË„¹–?÷{!ý§=ß„8 )€èH‹Õ"7ŽŽ2ï±ZWPJ{1!0RÑÍz Äu&^e$­Á航u!/€bßÞ§¢U.¤Þzã „‚çÈ ]Q9‚H”qü¥lt%bµ£„Ú‡ª!‰P$#®œ\^‚Ã]ˆPg»ºµ¼Ú(øh¥¶.gñÀʉz±¹ÉÝÒ2®`kWÌþ~¤æFAK‚\{‡é7:&—épqN9Y¡ƒØdЗ†gºOĪ7“€âT‘wW¨(7YíŠfTÏp§[õ~ùˆ«ÝE92„©"q2GÇùØf½³Ð*¢ÊŽ­f´É“Yè®þ•ŽC½‰\!£4"ÀL ét-ê+½Jò2ß㯢HÎø¸“¾øìhõ Eï€î‡Š¾Øqœ´ž ž¬p¿Ô< ¡¼öu¢A»Ž„±€OÿÀ`W­ÆLÒÏé§Õ4íәެ^›c Ñ©eH…Þ¡š4Öað\²Ü "ôP¡{!D>‰ŸÀ)\9 P¾ûÏnoš: OM̶9üòuÑ*âa2ñz !8[ øôŒUÀP¯8¡4Ï©Î>®«¶[Iƒ«£ÂiT½=Q÷‘óßæq•c kfD|ZN±›´ééÜšTZ/¨¾§Üzô,õcÏ»ÿã €/ † übÚ™dõ²Z3jÆðö—Çâ×›M23 ™ú¯Ì¶e«Ìp¶Ù¾9®§ ]ñј;B¡NE3€\P ·p àqÃX•*4eýB­ÔŽ™š3°àÎb5°>Ñá™u¸»¾´QpéÜ,÷ÏRé‡7îC·†iC–ÞEm:Ú™ÇA:ŒŽÖ~ªœvP¡{2”¹¶ €U1iæXÄ÷síb{52kq…~ ›ÖÏNùÄ# ’åT>mEÍòÐ~¬ôMËHæ70ɨ+AÚ†ByàŠ¨Ü„ÒÂ"l›«°äëfWí¬3,íy63ÁÔFÚù(§°aÛi¬üÖÐÅöChZ}tm×uŸü ¶ ®dähÒ2VùEçO¯O2 æí´¡×d·‡/x½àaù(JÑê_%ů¿Wù„ôÆ»ÏYÄÝ!þ_H—Ÿ°áVœJc. ýt O¹~Õ0J¿ãü4/•µ²8l %¹þ wm/ü7&å>™=äÎ>ÊKžÈOßoaVg¢ü°àiÌý Aß´‘þ‚ýßûŒ?wI-)›©wæÍwûB>069Poµüy^[ˆ.ûϼ<³µ}W„ èæðOªñ#À@ä!ôQõÂÿù‚É?/KØþ—ˆÎÔ¡[²6²×eâŒc1ÙÈõg˯> åtøb¸«sˆ äO 1 98\$ÝŒ…—|mž.ƒ¤ç“ßEFD? Æ€ ’çݹŠ:Ð`4ö3[ÈõÆñ±AµÄ¯§ÓîØ‰Hˆ×–¤­ES ûÔ "qGGÕº5oE›Ñ}‰$„kè°[{û„jûÔœ;öïY§ƒj mÂT„j¼¸×]ƒB*QŒ5Y¥©0ÒbVú¢”£iÞ…ò<‰íÓ÷*õ 96yÆ2ëÌYZ6Èz¬œþò>á“Hz”‚“¸yÞÌŒ£m¢®°nësÕ¢®«Ü£¸ïŠmª°Pù_‰!.P îvŽ7¢ònd¿ùñôpÓ12óEpÓþÏmò¾«Ý”S°FOÙ”dn–ˆÜg‡½Ã} æb~‰8,çFä]%†öÓÐpA&Òד*Ú¯AØ&á,b·Ûun9cáË“”¿ø‘Éû:w?¨M/–a±ëA“ñ*Å¨áÆØVgoóÏ×Ç´S¿Glê}“£,˜†çÐÃ|«q§€£ÁÒß”ðr¨Ö5FR݆~ô°GÀÈ4Ÿ[‡ : ÆtGt#=Šð„±jÔö|‹ÒBTo›dÕVm' ˆ”­âž¡óhBiÐWBRL²¿‹Œ‘MÆ|Õ@÷–AxîS4*Ý÷\¢¢+ùz„<ê²?‡ì\Ÿ:ƒãßóσ JØ'KØa˜#}$›È SRæ/o¿ˆ8{³¨Ì~x®5dHFH·mVäÈr5'þ{´æXCèöÀFËëÆÒn@in¼g5 ê|w‹?1’ÁuËöÏv•Üx²–¼; ©˜4mÕç'ošÑ¸æéµjðËÞ·è ìä(‡³RÍé™Úsßd÷¦/F^œÐkQã¼{F.b·V",L¥Æu€uè–«é/Ef|¤­Ž(¿ËÚ\JÿÃDç—û®È»ÅÊu!sn‰—–܈üŽ`;ÒXG?ô^躙õ6ÔTG)êÔ,ºÊp¹:þ5`æ‚„ ¹æVÚÅCÐÁ¶z#™ï£$ >›……ߊ5“4܈H rÒxý|)eZRú0¢@B˜B`R XÑÀå„ÅaäAäW¦r#j"ž[pý^TcFXMÆ •õ)-ÕQâ²GÔj„òS*4UÉß¹²”Ž|®é¤e0“òRiŸh1G”2\òÞ0˜_}2 Xˆ“àBƒe© QL¶Ê`Ê\Å™h~ÔMec[²í¹@¡N¬ž~é¿AZ]Ÿ³X_1†kŽ(ÎMN0Ö/†³5Ìœ¬lÌ("Y:AH‡ÓNø%2ŸíƒŽé+bVbrïo½b-'c3dˆ¦¸¿*øÇ=öø™øƒÀŸ„Ôq|K ÛßãÙí‡(ýV¢ð¹ìvÖ›ë+FÚ8fÎ֊絆,Þê&žýØ—‡ªX–]q,ÃÀ"Ø+IT&—7.W\,X5TÑÂÒ¹Ø]¹ÇcâÒ·qÊú-Î$®£4õ5kÛlUõv‚µ’®ÜTè6€‘÷@±€ÓO! »\¬bUb(€_ˆ[Ь-5¦ãØëæè"Îuíkûz½`Û6[ùx'Yâ“ë~ó•qÍqÆr€$²ð\È»$r“ŽÓÄ/æQÎ@šd dÛUΪù¼™µÆÅžÉ×swÊ„ÿ6ÑùÛkõsî8ûåM1‡ÈqØ[_W%€þ^/€í_¹× · á°áÿþ÷¿¿çÿ÷úG^+wpL=ü3ÕÏÛ¿mÓÞúýÞ†0ÏWÿ^ï Õ/Å€ßf¹s­ÿ^¯¿×ßë§¼T3Ôƒ–ç?üêìùõò¬¿×óþì±Dô·uŸ² Ÿ!äû§¸õy6ò׈ÎÿüÓ§ÐY3KƞϾ[%\bF™œ=¹»žg(Ÿ@Lû…mCÀ¥ÙWhR^͈2"Žm}öë Àdî\oRÛ¿»u¬aµa­I’—ždÔWãAb0ýÚ?±«î¸ƒcÑ÷àêðàߪ1NˆÙ,r¶¨£}y µz3Ò0í¹µ4K{­Z+ŠŸ\‹ãÔß’Y2 ±‘¼“Dñ û—Ñ)Qd4ÁÖ2¼SçQ¼hÿ TH¡enn”×¾¦ã(ÈrÂÖ’¯†’á1sMÄãt` ,® ÍÊË£;=¢ß—5X² 6WÈo-ñFÉê$àqåòf)ð¿Q®ˆ&™³ëÏΌB¦}»‘äƒÐGð—}ßëÄÍoY©rl?åÆ1p€d9¦²u-U7z“p#‡ª‰H>"BBªKH~ý§SzvçÂ2……¬Zj¦KôßN¦{¦.ÔÍ=BA$R#õ‰Àl¸…]δjåæKXÞ lr½! ÄAù¾ê?ݸÔþm»‹séyã«$ÓUº"väa”ol½Q{C=µ9j… Æ=n 3²Û¬©¦’‡£‘Áÿ ˜ÌT» Ó²â¨9…·Â½ÎkV1ëü•M{‹:Ö9on»j‰0ׯf©Ö1TS-ÿqÑy¥jucF´ž<ðÂzf]A‡t Ü-<ðú‚ßõ*Í„Á;‹Æ,¢Ÿ7¾a>Âæ'.øº†ÀÀ7Ÿé³ÒÖÿdU.7«ÉÏÂÎ{;Kqi6Ú¿úÂw=‹Ÿz”Â|²ÕáƒËNÁùÓXì·{(žÛ|»ýô¡,ïÑw_ÞŸUû)NùÞ³v×¼Ïw‹§gkÏ è¿zv¨ø³föîšÒ[ç¶cÚЦ‘[>ÿư®ŸØçŸ,Ûb?Ûþ„e3–ìlüæÙ‡EKåd®ào‚O>=´8g7>Êà¼íbT-Ê2®ô_ :¯¶Ù·[ûõk°@€ëÆÀíûøë¾SötLÉuv°f¢OWo#WshýÎh›@ö- 5Þ N–›KkW@Pm·l‚Q!Ó?çštE£Ñx0wÑLE^7o=&gáˆê}™ I_ƒ}†çf‘ˆ—ntW0u¡~=ciëèÒ]Ùùј¦iÔ7˜ôñ! R¿>›d^`m„îAô¹ƒÝ£OŠ bnÓò'•À4ò÷¿¢ÂŠMœ@ü|É6PÛ“»°=ÂF)¿ÌOe6’üæIïåDÎu³+Ô³NyÆ›ŽR"”t.nYÍe(¸ªúò^B–’“ò*aùìdP¸½µo£¢ø‰þ;f+ôúàbò†ÞöFFnM¡Fòõ}Lóœ{ùaŒ³‡r×¼`¨¸o§o$%JŠéã3ßåS4*JAµEzá _/D@zm¸MÏ‹ÿè)³Q×# þ ¯×K…”ªÿ×ÝŸçˆ_‘™æHuúªÔ‚ØÈÔœ¸Öó\)'×¹Ë}Ž’å±´»OVý¾Š?对¶Œ\c©¾¬ø»ã.+7Eܬ0:<5 jêy3¡›<>Í}?Mtÿ,JÛ$™œžD‰SÏ)Þ#ûW¨¡Ê÷ ¿Ä†baõþMÑyk…¾9ЙÚIp«ôÆùµ»ÕÆÍGXtJD¨¯¶MôýØÓJª4øµmäAï`N~Å /ºú'Á1 AµôÆHMV0À®ÚEo’ćc^")6i$¨c•34šGƒ¡†$œÊ.y ïdú&“ÌŸ˜Ã#7îæ{'óÊz¾\òò_Õ½U‡oý.ã% Ãàê‘ ZŠÀ ª &Ò¦¯‰}ÛÌÜð¥ó´]àåãÊÌ Zw04ƒ€æ¸ÌàX·A•L_ˆÐYçíÆ¬|‰¨O{àF§q.Hx\^ N»·¸Àq^ØÕ;IÍ·Š‰ýFÀ+ÊFøu&:‘¼Çõ˘©ºŸ¥põnäžv³•{xZ¤&vU‡f* R¦YšºˆJ *Èžˆ*{Ë.(ÊÊä6o¤2Õ}«Ç¤`Êl€8sôþÑ{©TšÙµj u¼ãþDvðÄù^“@ŠWC»“¡¤‹-î÷‡b"ìÝ3Çi<1‚ãÏŒs»^l£€ì~÷7çüw” 5Í(0M„+¢KàE £‘wk!VâÑx®’üæÙt¥òg+ˆÊD×…ÒÂ;Ú•nPFàv £ÌÝäêÒ )BjsÉñ¡ r½•±ÈALÈÅ¡„C+’¼ëßß–hžìY˜ouϰˆ!1Év¨õh- •éˆ'R…ˆ` @s¯eB¹ˆèžW÷fZfÈq[¥‡±rZ%挾K©ë0ƒøVÒJtaý®UÆá†¦§Ê Í º3rí›Û¹’·°ð‡]\šßzϨE&©hk`ºOfkEM§ì§&î/ÿä> °‚?w± š\‹M)A­Ñƒþy"?üÄÆ”R¡$fEšÉ –äÜšÍ2ÔnÆÙ™•2æ‡A7m€’WäRËHŽP¸Œ´Ý§S"’‰,Ö¸‡49ì•®”鿏wþÇOè$ùÊœfƒÛ¼"†ÓuïæÀú©ß׿i@Ýc­„Úx£bÁßV·Á»?‘èá‹VÏ ÒØÅ+G¸_£6y”.ôî)Bšä¸Rû•‹tf5h6‡8DZk‚?…n›¦¿?ömóB‰ý¶ÿñ£¹½j¼QïÞlªdôújCž¸¼~#š$U*`Ùùž 0‰n‰4lq‚~ g{©ß¿8d˜Mëð¯;®óßxá¹ÃŠñ ´Ÿµ]»{;jʸwV܃ÑNímÊ8–¿k[œú«âßâ…O0 Œ9‰ærG1v¬‡z.®_|/À;ž0Ú–køaU¢ôí¢wzÛsà®,ãÊhÓè§ç†yÊF‡É´æg¢á8pšð §C§?\i CzòP¿‡À]Çæê—ˆÎž¹¾sûY/özíÜD?û ê9âÙð*ÚIº°Šº l” éÞõ;ëA2ÜÃB6õÔž,;cØÏd¢î¿‹°Ž¡–ý2ŸJÁoœ„Ž˜’ÚIÍÄ[Š ÝµÜ`ÃÉßùTM­à»ª ~òâÈØ§£e|“%Ëóú ÂvYWc/%rª×`º!mÙ¬ fâß°mËGÔ¤oð„];ázµO¤™A§£ÀL—œh¨Û¤œöÇf“ÌšˆñìJòãñý ¹7¯”!TZt“†]¢°:·T™¬ÜØš%ü¦S¬ìM€×Âú’š†W ï]{ 7$½^/DܶÍíܯ>2ùä±&°@gÄKŇôÃBOÍE+¬0"s+ÎuÓå)ôd¥ï¦±wÂhù&Ô‰ÿ'}ËeLÉ~¼8 ­³Ž$¡‚`¸Üˆ÷™³. •<žÂ UtÖŸèÓŠ§g¯æ•ß•5Trô„%ü/‹ÎÎ+’PJÉå!ÍE +ñè÷hM@„m“I†æ €Ô ŠÌJ³©€óõ?´©Ñ{H‡_D¤IAä®…S> ÷Ë{Pëtk’r åjSœ‘!‰’¨H½zDOÊ“:m–HH«/ئ¼Þ°I ã±ñx¢£ê}“ŒkEŽw©F…#¤0\#ë;!¢ë²ÁqeÆH‡À¤“Ð%˜ˆýoÿ$ë†É0¨;J´‰ E&?j3×E¹ŒL˜Š¹¾ù•"p(–M<&d°E[‡jUŸ%Áö4’÷ (ÿçl\k×ìYÎÁëc¹¸ÐW‘”ÔÝñƦ&^k•}^J$àwÝ¢Š@Aò@¼UC-1$ü¾ˆ"Éíb*ÍEvUDÑ{v–¢x †åÃNeo³mM-‹è%cJÕ(Q#WPf˹!*â³çÊìRCF¶Ëå—|áÕøÁÊ”q×àf’n4æk4›ÁM;NJ¿§ÔðiiOŠ»M}nriãD¡ƒ-r׌‘ëhšxǯÉ3‹žÏ›ó“:%ä(¾øjœ+¾L†)Šgu]í]å9䘥&#‹ƒÚÌññÕ@oéOj×nr rþDìS°¢ד+Kw£AW*StÓ xµ;äÂ`d—áLMLÐ+Wixû1Û›gÎnÔTøö;IÃIœìƽ `Ÿ ºäöp¿qÍvò®mÄPćNté¯#\Å ’òñï&ë…„ý"PÌ÷¦Aúøný€­ç +!Ð ­|Ÿ# ¿;”s$GûÕ)ÚÜ3Ì‚€ÿ~ôˆÙ¹0PÆø$&¯g>/À5ç;¿ºÚÓ‘6…5•y+†Š±]Ñ WK$ÜW Šü¾ÈûXÝ}CÈà?2Ô.C(Ÿ¬PéwåÈ‹íÏöã•$úRSÿ´ŒáF×m7c¦tc›ÜŒ0O-e‰{ÔG¥#ÒDrA7ÞØÇÃÑ\VhBa)ý!Ê,J8¯…™ m!0àR‡†dºw8NÀ´é(VÒ[·IË2—Ç#®ø$“r¬ºéúDUô"¨¨òtmFmÑÈPؿ̦·ÉÁö`Ñ_*:ŒÌØ'æ–G•‰âˆr%‰ˆÐ-¤mð´Îƒ±O÷Q $¢öWîããîUýps¯\{âˆ@. «kUÊY˜¡cP³pÈ/ÜïGÕ$àÒÆØq¸O‚ÐÅaJûø*ÖÝó_ƒ2€¼Á·ä=Ä‹ ( to% ÆB¯oXü„ݹü;·Úùe®2î½BåÔ?… ÞË¢NŸC³œý¦‡t|Õ _[9¼Ó\qÚdôðy™ !’­Ô~«÷ò×äCf©Ó½—½Üˆšç]Ó}»6òØtntå*`õÆ×âRøçì-°Èþ˜²RF.eDPNf»ÖÆà8ßÐ=·_-Ní†7{Ñõ÷F™ì™k²èßzÉ ‰àï¶Ùï ©€N^êð3¢ýVW¦¾—à‚.öíâoCÄ|[N•~ÿ³]þá ·j.ìüU]´S^ :7E&÷S95ßʸ3x¿"L„Âýn­u"¼Û¶üœ×sV⟆ ?¤§wåAßrIˆø¿ÿýO¶më €èÁÕWò®=ôÅ>0+ Ó@Ý.«ÎtE2ˆb‹õµ<šÞobF‡)ºž\Ùëç7ùíZî³icÂ3âº](¢qØ×-»ŽûSüœFgÃŽã-9Õ{D‚ç¦Õ˜Æ—ê´>‘oܵ8v pl¡Ôt„ÛŒlT½Ë¹ÃI»Ù]Kt«=\ý4|Ø“iæÍ÷ÓoJÍ‚ïH›J&š-ì_¢uõY?úµz "à°­[' ÊV9šÚMêŒEÏÎTž‡r¥ŽN|hU×̈ÛÑ™?×äR?ïôƒ´®ÍýÖu× Æ !ëŠySÂG5K›g¸Ôù~âY/]UñPˆùŦ£ÿösñPtïs?W¼Erä ùÛÊ_b –§¬xPýí‡qâHÔtéÝ'å¶ ºjÆ>«m $)úÛŒ7÷ñn+Ã%%8À¿":oZÚ{L^6t|‡iÛÂ,¬7qÁ Lë¸ãJî?‚C,>ͨf7NØ»£€1t’<)±êƒ™­`•‡è´:’}|Ôs7¿J’hú;4O½T;Ãþ¥‘Ÿ~ŽÜ=äR&Å!.k÷ëGuÝëÀšLaTUÊÁk+ŠP9 QÂzôvúî,`–ïÍ4Îd[î›Ý{‚ÝO&‹6YF!ÁóH'ka°ª*óSæ¹ÙŽeÑ,Œ»-0¢Ü*R!§W£fKoé+®9â¥d#±e¢Û ÛêÛ_tñwn¹óáæ‹ŸæÍͰ rqø±ù\Z_ŠÉ¾±KË—þ,R«ƒšó6ê\T&/¼S{ˆK8ÍàÃf޹êÊÙ½W*.ÊhԇˋÍÒ@'`ø¼Àïgí¶Ë§-ô †–\‰3yððÄeŸþÌ^z"Êr Ýi`ÑæqW8¦¤°4·,×P€âŒÊJ‹ÆÒw½ l6c†{$––Ξ;·¹>XÕR<¹c3çH9êª.RMÄ €³Ø­‘è} S7rE1dbÇp‰¢|¿ÿeÞPOð׌0>b„/žGÛL6ÍŸÎâ½è<ôa¡7Å ×?†hܺ-þêÅ–½3Fê'«2ßûúªÙºI`Ú û¾Ð–€ »—×~„Àñ™½}’Ãî–ödååÔ)Jæ’ÿ½þ^W|[Ô½¥b%úÍ#åÿ^ï+oú áü\4üÒ©Å3¢þwOÐ~ÜÂ'?|Þy"£ö> ®oÑ+bÖ?ÅVœî­î•QÒûœ~Èn|‡íI¥郂O2ÀÇP¥×ämr7ZÀ{¸oy¹<È'Œ'Ý·Â>%×^6­[ª[eO# ·{·òi?4Â{Ã\º+ŽàÄG¹RÇyà¹àäÓÔ¢ÚEá¼-£Ñ˜û‰¹uRÌ(" ¿*)Fæ'Öù§ˆÎÏdLNº³S¨ôQRrs䆄Ûôˆ>u÷ ‡\ªêùõuïq@Ì{ËÓÒ1ôX]aÛ".õUYL¤LRá»cŒfžcw‘ ¥s1†®LÐFw¥*B§#†Ô°0V2c=˜Öéžïòã"†‹äät}ûfrTA¯À}‚âƒÅL*=ÕÐÌ’pù‚Ô(ììÜ[ví¹ ÛË~yÕßF*(ð²ã‰"ãV 4ï£`€ÚÜ`Ä.[qNÉ`ú¨Ýcâ¼ûN>Rá.XBÇȾösBRÇ'¡”ð™TÊnRžd ‚–„û›é˜k‹(“B5ìÊĶ_‰‹Œ_ÆsõdYêB¨¹`¬ê`g‹j ¢\£Fmoïî\:cèþÔ2;{5z31«ñÜQ ˆ‘F2RCZ&bpâÐkqZ –ˆf¹J[‰mˆE—ÃÁÎëìÍ1ü°õ9­°,·+{Lä›Ä!þÁ;R÷”ØC·j?ZˆWIJ*%ª\!7«0-SÜ[SÕ§|ýÏ.‘dDò™ìòMgj²‹d”Œ©ô¬ ôYÞÄÝŠÕrt×[¡@Í=à50q5ßVjÛ¶%ã:ó@4ö&jâÏ2¥xGÒ|V)Žx¿Ï¡š¶ÇÞÙqâÒ0„CJ½ˆl@ êà»~ÐÒx’ÔášA‡iê¬\2ìÆG ’Åh¾Š…ýg™ SlââMt²¢”6ÊP|m"¦­‘|…K‰N„6ƒÛFJ¨ëæËÕÎ@}C&ãš)Œ¢J†»Ú‘\Õ¸dHÕƒöU#Xøê>ës³‘Ñ¡¨:Ì̆ö™}¥D!–.œÆóÙæ'!¹ƒPŠsЏ¨9BAŒK2V(Yo®X‹,úð²˜*Ú¡»]$tÖŸ [f–w •P) —œò0I .çû0w}¢±Tì¹²f„ÉA80_R¯þZÑyo²}WÄÞ¯²iŸº'Ývæ‘ù+_L’?›ÈË¡°àê­/U]¹Kv Ô…4µâòºÏç|…<kWtxö/Aƒõ{U”®ßªá¾,¸¶rPhçp MüG3Ìj˜xý›weÜ=z^ ’sQ»5·"ìCŠË+€G/ˆÿØôK6W¦ÙS±éJX¸Óµ;ÀJ0ôÚ…›ŠùS)1ô"æÀ¶G+æ{_‘J° ÷ÈÑ^'%˜ìípLñ'ö8­v‡M–--óT8^K;¡®ùvÃpR;ÌÁ.”0]áà ,ÔÙôß!•Á¬@“˜Ð3àbþh¬ŒÄ&MŸ9·Û)Bj´íD5%+?xéVr×ófà Ÿdýþ>Qa¾è uêû³7ðH×}ø"¬uÏä‚lD•çw+ §>m :KŽz4*gÝòëqBh½Œz¨ûÆ'’!aÀ¸·QMÒæàˆ¶Ä·ó%´wŸŸÊ"ÉýwÙÙ¤U!¶_OìOÜf^([~Þ €h"p)ÁrÅqª[’O´v‚ Ä ²¼'€± ¶N=/j5¶må®×ë¥mÛþŽÄ‡G]¢óõÚOÌ~Þ^/‡Ö–ë·æ—Ö?¼”h(ª‘ä &ÜŒM~Ù`ŠSd9oˆwõ]€ú—Ïž« ¥ÓÒèhÓ23Ù‰†ì‰®ž£ëöÕóî5,£í¹Iº¢TK±Sh~O<2]øµ¡À-Ó“jf¨R tÚƒØ{òz†œlóépoE͉ž Óûœë§%©$Šv™ ™Ÿ„u¡âúoãóôÁÔ¦*ŽFdÇqËV&x¬¶w«ÞrZ|*9€Ø0((q}o%Qåá»ð'CN;‹“«ùP]öÒ&D i)a{=º%g¾èH1pE›Îõ!@D«Ñng3› ´býk kÄИ²Ò4 ®ªtï .Õb¡ ÃtTlˆ°¿Õv2’·é[ÌÛfJ‡N®«0«L|„{foŒ:Æ' &Å~]B×ËímT7$„ÝPîZbä=î—³NbRÑn–ê# lùA `_Û!8ˆEDûá.5s¥’‹4®£í|Íß7bûádÏŠøÏ³ׄB‹ixU‡u*àI|÷Ì)Ë„€i²Üçþ9žbeª9‚u’xÃñ9 œaš5$‘CÂKSwšˆÂÕS•$ïË?áœüιφZb­Ðܱ¸‡­´T)À-̰DxëÀ‰5Bå¡Çt3\i‘þKå+ŦýÜêèLA0 Ö™óß׊t/…%ï9Øá uõÜìŽNÙ:»ËK‚èß//;¾á ËÓ3a‚R¬€g…ë52Þ]7@ægu>ói«_ •rßùÕ±pvviÂ$,˜°¨÷*çQn2+[I6DO¾'ÿÃ&š.§ÖhÒ;òZø¡*C ((LØEjƒ·" ™¹`¼ÔJ°’¡Ég$Sµ\lH+ ôs¾®þ`Qµ€H …À&7[*Û“˜»Rw^¾·"7—‡‚ËSqd¤·Í /"÷!89fêF­Þ ³ñ¬Sqƒ#‡öГ€uó´©Ë¯è«&éJ„ ¸9@ô]–gÍÌ#YJ¢ÇJŒF°†<ºÙÓñCõ™Ó$j×Á5 „–¤R8&ñ÷·ÂÀ¨Òjm(Æ`iÙüiä9›wŽT½„”¥/”°nQ×ÏQ/Ç ûö" —Gùït½³ì ßWøÔxÎÛË+FÌh¢Ø¥`´‚ºZ)ùn¼Iœ.1:±ºÇÃè~¡¸“ÔVidËh‘”“•xÀ÷ Ê"ye¹yÓqR°‰xú㹯Lƒ¨œWn^´Ú ÿðùÒÁƒÑSCÇl Pr•¹ÇŽŽ@í¬­©ç¹g»<Çæ&µƒ3~&v Ë€üRŠ#C<‚!Oírp[U\ Ôs:* zyÇ `(3§1¾h)x²'®Ížn…„ÚòêuPØ•D«ìç$¦×ô;Rå WU|ª½¹ª"…å¡paD¹;|ÂØÑê¹ ?ä·ô¹\hËXÓ ¤hÄÓa*öΪËÎì(@ ÑwÛ'C˜{?vT|ÑnõtîTOFÆõàsßÎj'dßNcÐi ü/‰Î ¬Õ €gö€D;;€PäÕ”oŠÔ»%Yøª'®èëÆÃÿ±D-bc8æ@k[¾í' ¹z^Ï=“dfÝ÷íÏ“ø¯?jÛßË}íTâñD¢±Z¹žÁîdÞ¿‡òÃ_"êî÷Å'Û,ئDöÿ^¥Å ¢¾€e—SÀ{ÿþ ß»Ö¤¢ýð“o鯴®•èp£ÇG9¼%µø{rL¦ø1š¡Qëßë–-´d~{¼±¼ÁÈsèÿ•2šþÇ‚lýï"­x½Ä/ü„˜£×NÞs©Ÿ'ô':ÿ3Ü1ö ÚÿO(aâà×ë@OÀ¼_Ðuq²Q‡âO¤ÙÀ˜õf„3-€£ýVõ%å’5vZÖCwU”ëíÀîê‰N"Ð}åy?ˆ›­žoóPͺ{w”Sh]¥«º&ùT%Þ—€gé-ìëË´wâ1BÀ&þ¹«Ì•¶)ó]]:5ÉÙO6yqÈ{”3iÇgÆ_>¯“¹Î%9,ÙữnÙ‹îú=) â““ì‡[.dʲÏ&ÍôÚ»IÑ  £(nŸqðÉ0£âcÎ_µÉ'k†xÝ-Îfõ:s×è²³ùO8æ¾§=u²”¨åÐ!`ë³¼(JÈæ’Ñ›dñØHúPT!"¢ë±Qö#“rõÎîuH c©À¿i‰1œoan?60‹2…+Ñ€‹VR#  öKõڅІRÒWSo£q9jK.™ØLZ?QNÍ5Ó€íBEýûņYóþH†øŠÛ–'r4;†Í3zÇ€“›ÌÍ‚/!%>Êe_küPÒ°©xdåÝÅTvÝxÿ¤Ë¦MF°.¥LD† ûQP…«È˜Ûyb§†±@g4¨Ùýe° Å”y×$>Dˆ\Š‚©}ýK‰¶ºHf‡Ãä©* ÐñýÖuœzܵvé<\©ÈoF×)ÇÂcÁÇ­eàõÅ¢K>“Óý¾jpæAEÄJÓ,OlìÕ7Zfy~~OTS‡[YXõQSÇ…ð¯KŠE{"å«bÌ૲¢,¬Ié´ÝE‚0É ÃFõ®ýãh;s¸‘S˜Ço¿^¸m.Ê|ñ©-Åo.‹åö<¢šÜÖ2‡rs»«ÿqÑù›¬J¨òìéʼnP®‡q%’eËÓº¶ÏBzµ+Ý[È €FºXKº]  ((ÊoÊþò×è†'Í…¦ʃ~°ÿ™|Àè<°ô†oÙA’úPÁõ`ÿŽ$ü¨0Øõ vÝ5_ªÈ—+ň)-D¥úÈUœe"À¸#aF2Å` Å#*¥eSB2"Ob×2¦ä#ô–5:KžR‡ÊºÞ™Ûx»K›Y$¥D×ácâ8úQq"ÈĈœ861…6nŒ6Ü ¶HN‡ø¬û˜`Q´×•p©š·º86N!$Á­ÞÇgñÝî*˜£êßµ´Õ˜ò©Ñ»òÁþž±&y+¦Pû «ÐïÃÖ䨡øß*ðÙé¹UéhŸK_Á½0vƒ=ŸYlWÐÉ'Û*gÍ®¾ÇQ\Äñ…X šg"6óìÁÉ CpÊŽ;J¢šäÌ^Ð'D¹”-o—HPœJBaYhD`ŦÄW‘ôieˆ­ûÑÎZÌûC»™‰æ¦òTõ—ꀦ åi íš‹5ydU•1N#L«|ZœÀU›ÚHìfÝ"ÈÇó,+F–P­•jo‡Å° …/V˜œ7¦qàê|cÛI3{{ÏÐ7¢—F ÁöéÍ¥ÕltÇqñ:Öe YjŸä†e©Ìã–%ÜV³Š:ŸÍU£¿[u²\B|¤Õ–{Êòß¼Ä(úŠ&r@6…g¡Yu€A˜L¡N ‹-Ükä¯>LÔ­ÏÑ´:ºV-dám¶0$ËSþ‹ÜŠÍÑ(“/”Ä=fÝËDÖ#ì…Ñ=ò]¹¤a¥V´øF¾uÿÑùúa¿TjË;Ûi:ÚÉ…¢ªÎ…íá;žCo¢õà‚¢¨#_r!–³øÐé¦Leš¾ÆLܳX• ¼…r²Ä¨l‘«WAg¤kL±xGæ)H×Ü,)ÝÙ['›BfàJkHõµªgSy%ã=ÃÖIt£RÖÉG—Í·¯Æs‚Äþ/±ÍÕ<´éÿ^åcx~;¥Ý6nî‰âuNÒŠéqyÌ+ž\ð[Ïo¼wlïgž#=½ŒÅiÌÎuáç=h&¦òä6ÒïÚ5úcSEûÝ–9!s¸ €è§n3›.¤IãØ渾\ÌP¿òÞrµWú»¾ý4m̺Ñíþ¬WÒušUv×…}ÔƒXuå9Ç}5g\\óÏV‡þˆ}¿ÿÃAo´ÞH{σäè÷ȃ´ûWÞ„’o 0ÌÌÑTtþÞ‰Ð7¥ó©Xè)µ&Ý— rm4zón<æ‰ìßûå—töe‹²ÑžŒÄ³oJÉ$Ú´ãT ûINÏÒŸßÙèD“[“U–yWW2¥±³Ú¿Ü+¼^Èûa÷¡ô½ÍçHQÁÕ»²øpbN Mô΃•YfE™äY-ô_”¡m;D¨X9X3X^»QtrFQ ±fÕO9¼§§×ês~c ·(9€¨ìLáDºÿFôœ3Ëkv “gnX+eW7W±3]dª«íú?¥EeSØê¡ë7‚É<õ–ú¬Zoöo(ð¢muúYšñ6Î*cÑÃ;wèC÷F|wÜC!l5áÍÚ#°Sõf¬/りÛå´ýhWº‚“­Þ»â È2>Ûw¢‚˜<*jê=2¡¹2]ó؃➊[©([°9É}[ÔD|6¼Y·¨Î„ùÐ⩱æäzOœØâ‹g„xÒýÓàqIæõXSúcrge²ïÇã 8“†hs÷poš½÷òl$³ÞÚÀbÿ-Ê`ûò¸4í}@úpT%ÀàÃEö?lZÛä{ð£H%æÆ X¥),…%üöµ­L¥Â2d‘fšÂO{¢y“qÊQ´o£—{WÛÿ—ÂÚ•ØÎ*ó|6–؈6FÀ–Kôe݈ÐaÕèÝTÏ&.g©x5™–úðä!J{ì¿Ë©Õ,ÿ¿!:]¿Ç*+†ÁWÑ¥~žrûSg~ i–#ÈäÁ(í‚;rpQ61•dz<÷—óËÙ¬ÈU˜é @Â~7„Cˆ;Û)M‡Án²ï #é|­‚êuÚ‡´‘z§EñbXÍW2…cÉŽÙMåLmb¶~ê ΜQj< Ž ƒb€ãž6Ž>ôP°R5—éÒܰÂ[¤/¤£ÿCAqÈ&¡˜ÔVWRý›HÿK状ÍÈ e÷OCL&iuð„†µúÄÐ/F´¥¢cK¬öi8ô±’KÐ’Üœ€(lßæ›Ã1µû­ W±/’0.žü(S6$-$= ÷Õ´!Ž,ÌiTî®çËb˜Ï«¡6Ã;žÌ¼T©ñ¸ø4²¬,@] eZ–àí6µköPèSåA¬â™œ.sDØ7~¡Sú?ÀÔ ±-;=)ëFƒÕ•ýð%Šox‚ ˜ý¼éA@×+ž8Jí±ÐÌàSŸxÄs¢Zv‰jS|Æ|»Þ–Á}s.”Âùû̼‹§Ìõ”Ú!)3^ÙW¤ÓÑÖxO´•6Ò¥lâò™Þ²ÇþàôÃT6ä®Ì1M¢áF*„ä[ÔŠ‡Øbä• “š&•-Å\¤àÑ`‹ûvQ'ä*Ÿñ?Ú¸¤ãJ(‰ e[AÉš(ˆÔTiÐXM/ e¿p~èfÆè^Ê_ù JžF2Äú(Ù˜¹§å +ˆÍÖÔd=Ö‡Ùô|ïí=W:½££FåØŽä8œXi&™l$Ê©ñ¸êíElË•‡uõQók4Cµ(—qnGøpCW̦ÚY‘Q«Z]e!oÝFØàºæ¨T_”ÞJ\¡;@b"d¬>åm|,ßoVz?ÊP†”9<‘aýAûmäÛ7.Îlµ½ÁQ|…²*$ƒapæa)%Óàù ™‡,ðÄ•°jˆ:>Ö'ý¼ï'0¦{ OsR É#Á;[e±N3zƒjâ•}Z éÖ¶šÙíÐgÔ…sO¬’mP["߃„w£ÖŸr†z–=9E¬ün¿Õt‡&ÑP!@ØÍ‚¾M®'´?2£ŒÙPJֱɀDçT…Lµ#¾…1øpèE’¯*¢‚ýÏ$H®Ïqäù}wá"Á\ÒJä`|í ÓØ¬@»ú%zéwßɯ׫#’.hˆNbaîÞ E rö‡±ÅðϽ+x©'³¸_9G"ÆFµßnî…«ŸÁT£Ìn§P6Ê“¶ˆF(ÍÈ"@©pE¬Œ‡bhéa—N=ÕzRgÐ' *ÆîíE § È9*ü}€äßU<–¾Ìcù–Ñ` …âHØ'Ò‚ùíœÀ==9!Ò"w,zzªÈg”b§>½n€‚%Ô[Σ…F=˜."ÙýS´œP©v•ëç1ŠFj¦Df"ŸœÏj©«‘ ‘úÃT1Ìu¶ÆZþ|4…xtÉpn¢¢Ðé¾Õáë¥Á&ò:œÉñdÛ2¨PÔòSÈî´ÚP ÿ’PCa<šÃÌt‡Óí]uàèä'ºëUÛ–ÂZBºƒ}N¤ˆÐ”לⲌûË.³TûIê¦Süĉãÿý¢ó~$À…fü³o4¬ÐD ÄÒTéI$ô(T?WþR™§'NˆÓM½VXŠêù{¿ŠgŒX eq´Ð_rcÃ{á(è9_QJ-ׯ/eÍaøBL”ùªY“S]4Ä=÷>^à^'Ë£‡§5jf$ áÔ¡ 3ÖJFÄJEé2 -}‚`ó ¹iÉ :º\€,Qååò—'óxÞ3êæCÞƒ¼z}¹hù˜´ëmlú;­9Á&šÌrɨžþÍi[ÞÛµÿ¿ZªPd\±„.·W\=’̓=¡w1N¸B,ýVÔ$‚'€‚: Þts©å ž ©š7bÙ°Ö@žR{„s;÷€gíF’j¶÷ˆ®øª­‡œ¦'—êÂ}°e¼Ø«Ÿ¬Þøÿ! €8t ‡9ÙöbFpS¦GA0&w0àfâÖÒæ‚$€Ÿ–Ïu±ž“ÑûÇå==³¢xs/à̉÷,^¿ª½ä–\Åyî&ºúøO=>ºH›I±;8ÍÐ2»­Ú%jÒWžmÒÝ8Ë"@êC"ê»'níÊp‹ëM«V¹ízL“Ž"üà[ê1S©Á(ðNŠ,v>±T?'ˆ!¦mÛhÿ%}T¢äá`|>%ÿŸÑ•ãç®á›”¡?÷õµlüðffbPôÓå7žlœEöo=gnU5VÉYªÑICgÞw&_¢yðí¿VÙµôO#_‰gòW”ðLúyO’‰ž,]”´wˆ3¾úÞ3ÅÊãnê?¿r(´NLúòLd,”ÐÞ6 À“ ƒ©Dܯz”o¹·§¥xo3û?L8ìdÖAaò8Í´oËf>ÊYô\s&êCŸa7WO×Y¸ëÀ~ûÅTF3gÿ€;?í–ÙõÁÆCÈR‚7œØ» /óãÑ]!¨3´ûpžø‡‹œdÍ^g2<¼9ç½ìÚ ªsaˆ ‘ˆ~Û½„åÀÊ”×ôïß«ÿsq¨Ò9ÚÊMUœ¶3æh@!ŒÂ~ïˆùQQÁ®M´QÓô¾{0°~øžÃ¿4±ä®ˆþÍ)|?Et~)_x4F¨1ë siƒ=œŒÜvy]åƒÆöè}à¢ëDðÅÅ,öKe>ħéµÏÚD%ã…²…™Ž¦Õ9kcÖGØÂ×aÚx@ujm ·–ž(È[ðî=Ën‚ŒWÆ%@Ñy*%Mˆ3¬uU]~îØrÆÞûŒŽ Ùì‰;äñt™ìÙ¦&Êɱ3‚D=3šf޾[›°oÔóÓ˜çÉçÉoä¿Ofű«UŸ1ÃÐq:£÷†Æóftæ¶Ñ-V¯„ƒAÕÖ+&¸æýbç r%Óc3 3êJf(;Ðnš_3Û7 Jë¤Æˆ¯C¥óy|`‹·Q®ë2òâ…þNDjV©c$ÐùÔüˆI±—Cا?Ç>v•Þpâ\|ÇüšÛä B~mâªOCL$€¸À×N]€Xd©¤ÌØ3”ÊŒe÷wêêÛÄf#¶@êGÇ–¤¹ïs¼^û%–à‹Ë­ïúå"rC™ ±ÞŽMŽ8’H/)Ôß…b3ó¼øB$3>ŒFÊ6rL™òð’Ò%éXŽß©¡ZiAúó€".r †SÚCÎÍÞíöà¡~l_k¨œb%ÉèáŽXN…dÑÙŒ2 %‡èž©â‘´raêÓ®¸æŠÞÑR íõô0¡d"'gâB\z@@b`íJ¦ÓÓÝÒušCËÀiq Jë¤i@µRŽ&W’Ù‡e¥ž@+u„€pðû*[Ú9Ž£‘Á_*ƒþ,¨Üѯ¯2µqq^"¿Y:Óß—ª­y0™0WU8ù¬õ-}i+âˆùtèF@_¦n.0e|!ªPS%ˆj§#—·šÛVäc|>sVßþ:j8ºbëÓ/ޤ|·cë®/¸n G±PXª0N1ù-viÀþ“é‚KŽtÍšùN@½`Q4̃ÿB嵪—Ø3ȇ\y‚‰k¬OÔ°Þ+º€bSCr´XíPç‚<¼Ð*óåk®Ó·Ø4͈ôÏèø1Ò}¯wR%’ÉÛKÏ®.(ì©ÿa…çä3qÃéVÙŠn£xi',˜‹#Ÿ(pfs ò/{2Ú†Kt“H5èJüæ‘qíÁ/þ®d†˜ªÀŽÄ†êÐëE@‰:‡²ùwÅo_"Ö©q‹©½O† ëïÝIÂD…Üðåd|²ž™ê(2c"GîFÁ£)®¬]u¢réáÂô‰Q$؃yàtØ–ã)l8JrRòs°?ŸÿpŠŒ,ra›x:€·¼\ý+öÃ}ðlgÔG :*¡ ¶U³‰^ü\Œ(TƆÅ<òÄV9É\·®lh9¼¿óø^VDýÓ®Û\œª¨´ª<4! Æ®Té&²>÷ I —‰Žxù©ï"/n! :ȶ9ß@Ÿ]£jÞoï’wj‘Üü8£¥ÐÈ õtë¾SkæCDçWÏò] €Âæ!6ôߤˆø¯¯ïúbšq«vžorÑK:ïçâÎ`C»côp©ö[i/õĬi–T¼Í3üEFÕšçNµ¹,ÞˆEzDïcô¤ÖäC¶8ûÌÖ#  5ì%L¨Üi?%îÿ¨×Rñ)r+Ö €G¶Ö)óþ…ÜŸÏm>Èî§™ÄÒè“7†?í$ÖÖEp÷~úb^±«]¨ÿdÛ¶s>ði+Er-¥E#¶“=¡úDí²j4JçC7xY›^gk«Ç?¾£Z%|îÔ‡}£H×w*-Xø¿×ßë'‡1ï–]|ÂÄô~‚ýÅ& `í’´`Æßë/ ÿ­AÚ~Ä+zQk¾tQÊUÜ1KdSÈ)nˆÑÁÿ²¡[ Ž*¢°&U£êõd Y¼7õ+ëo W¡ûzE·-þÒ> ™m”}”žàù¡’Ö1LôóÓöè•C ®õ4SàÛwá4)Ò3§¹üŽFE'o¶+걉ü¯»·nDì}‰º*|.}" ÛZé[×b8ø €„žÌ€ÇÖ¶"ã" n¸õ蛪/ÂèeÌ`ÁΚæR±|î°ìáéä\×îc¿æF3YIdø„jÉ·.”¬MW@½]¤ªC0n†A±l÷ ŠŠì³@^Ω@½QS*vI-ÃÆ¥)g-DìÞshšCH‚ô Šû„l¢ÝR+™m ΟH²øL\Š˜MÖz>5¢:8Bì¨\¾»J¹´BÐ|Êñ’ËÌ¥¬Hœ•7&?7‡kÈ5A6¾¼š›ÎàÙ“aŠã¯Ÿ5*|Ös tq`ìxô\ ãèçç FwQ†BLZJ/~Q¾69\5g]æ N3à°0\ÏE¤zZ|$vÃ}bŸ:.ƒ!ùIÇåžr _nÛLŽª(±ÿ"¢rǧìÓ€Õt€Ò‹[û" ËòéÚ¬ZÂRa’T’Çû›óB¦½‚Ü{^—6î/ t©=½ifòe¥ç›é$¹G;XÍ­™nQWŽõÞÓ \Š«,!ÆÉ#¶ À­’€x‚§IB®¹DÔl€Cd¤qk÷*{¸ÕÓßofÛÔ`ðttYÚãd‡ú+\íU}ÿôªÂ ‰%p+9ZüˆbF?JÜ?Òš-ÔcRˆÕÈ×Åø¢ED‹{’ìHͽ”þé|ë÷qSXlXs"T ÷¬ž²éßq=(ôwÛœ²•0dÉ 2&Ã`¬è‰mZpc€=©FÀdçç¸EÎŽÜv‚5ë YÎ…ð”`™š”$Ò­³wü‰.…ÿ"«Îµ²O¤î‘(*¿†¨ô’WX>|³È€·¸.½e ~i¤ª™× ®ó £ ÙÕv©Óz’/5“‡ê~C4pF– Ö7O¢îm€ÀñáF\‡~½ýq?•„ =é '?$2óEé¢e¸t#8 'Yú*JÎ÷Ô6v- :ôBxhE‰cogØh^霎%ÑÞ¾É*X)´3Torê‚—‡úH´ŒòCXœf¥e¥ŸÙxå!yè†Í¹|ü¥ÊZþeS€“ʺ]|Ölž5ÿ ™j!kÏrÖ°†ËŸÛcøFΛ¼äYL¼E)©î«ö;OüÜ{ö{íhzå.¸ñºòŒôκRÖŸÅǦœ$mSj뾫¨M1Çyhœ;Q¢âVÄ=ßôr¥Óu àK­¹ÍCÄðŒ‰B'H×ÍúDY>“³î:ô¿m[/À[GöíxIº%s¼%Õ}î-çöÝà°>Ñú7ŠÎó¢²N€¼´zIæ¨}àïÕ^_Kð÷úvSû†×NÍ'€Ñ¡æëk«¡bé'l°U`O4Ù%˜wHF…äG`¾mðº|=m‰|ÿßëijƒõŽïo1ÿ“ž+›ÿ½~±ñý3ÎÞ­wäù¥ô+‚(܉GœqõÓc©× ˆà¿_vÅE†îý³¿×ßëïõ÷úá†}¯_Zü½þ^o9GpO»<ðà;î—I9©’(g LXA~±{õ;íy›=¦CñÂö<¿oÐ{[(>°7‘›Î~݆½UÎE—¹¢$žÜY—¢óÈŘ>ñ+ü1F €ˆtâU)è§>¦Ž7îtR~$Ù_2áÌ‘êmLfv³»$þFù·¥[)²ô]Ó‡¼ìWŽç…±äåëÒ’-¶Èg8" ùy¨ÜR€ÆºÁ¨ò‘÷Ö–ønOˆÃǺHñ©¡4f˜cÅÄS'ÕÓ¼ÃHÑh8ià¼e¿k1×u¢¿$¦ã¿ìdfÎÕ¨óN”àû¥†s^s…°b8Êþït{i5Ðj!D:t¢Ôw®›Ù§íuóG¯r=Šn–Ô¹y\sþò²Spxž?޵iŸI ºwÀd < lÉzœ ÊcV¯=‰$£HO€õc‹l:¥Û¸1^Çv¦ÜÔ“ÖõäzÖÃ’ªHN¾ eÇÿúó¸ª^NôvKE¤Ï¿ìùƒ0ä9ÇVѯY»õª€.”ˢћr£Ÿ<5ræÂù­¥›K! Ø–K*±½ïvuÕØDt'Eti/_(57q…Zß¾ÒaÊ‹ˆR?G«Ï]2§OjOÁ±š’+H§·×›²¾ä·û%a¦æ£/U”ë$áïGQVEjãÛ_•nz%téÞŽý¹¦6bz¤ÂÀH`sEzpI¢SDÉì)K¿¥ì€Ýig ™p´dtm»Å>R€;`ÆõcjˆhO»Ï‰+©Ñz¦ï¦–ý~ÞܽºÊþfÑùÇÖ8‚¦ ÏšºânÄë›4þœ…šX?ý‡aw°r¹UOíŠüíD_Vö ¥êýƒìvcÑüx¬b^ŽI*'~G²†€CÏe[Š0]o"£°üg®Rì^«ökgÕzjŽXqzîŠR¹& *Q q¤žÓHÖˆäĨèc£êÕ#çodöQÀR–.äz>샯ûuX&o‰ Û2À*w.Øã_Œòí®ăøÙ xò4µØïš$ö¦«¾ŠÚƒSmŠt‡ú(… Ú±~à#Æ”CÈuÔ?ŸÝZEì8awo¤.£é ×ðÁàÔÏ6ÃÉ'ùdÝòxX•ôÈA6…‚*B#髱†£ð¬Öïʵi¡øc;¸/ }/nÉ’I>€ÄÜ %_·]™„‹ç8§ ^)F~yWÒÏ‘>í² TèAã_¸»U%¶DI{ uÜßõPdæÜ8¡ÝDqE«)ò[ضíõB‹˜Ï¤$qÁ+‘gy*} %ù²‚œ³J#YDç(¸.wÕŸT—ºçáù®¡'¶'B  ÒÀ¨ Ê©Ó{Ú'8ó!ðÚO¼‡Ýsg9Ì—ö²Úb÷ú¬¶-xX±.²¼êF.X‘‰[\½>„Y»X¥†w¯¾¨E׿"Š Í®F6z cÂh Š±\Ї~¼Õ=FÛÌAQU@brr|”H“­ªj¹ôàC@P³ç}@TÒÿ‰~dÅNðr댫_—Ÿ&’h&y¸M¥÷(ƹz®÷ØÙV¶â8œOtÞ‚æNcêø¯@ƒ<›ªbOÇw©}&óHé]CïW]xv»\ÞzÏöµÞXc[µfmLÜÇ0+r rÞõ˜©$[¯ŸiÒ/‹7Þ/"d\‰Gzw­C3„ãßmD¨r¼éš¤ 5ç™;øw¥ëN¹m’î•ëùèÇÑñXœž ¡ì|ºSÀ¼¬x,›³òO+¬Ü/ÚqZ¿Gm‹K­.ÂÆZóFúþÄ=Th-ú{}ÿfn—ˆ¯’¾!‰«ö6¶ºšüý·é¯Dßô}Ïý[ö<5´sû'OÜÇú¯qº/Šþ^½ç û¶mÿmÛÿþûoûßÿ¦pćV6þÒHê¿×ßëÅHpoÜx;T,葟Š+¢Ò” ï}YÒËŠ»É)5q26ÚNÉ¢E“  ‘ÅÙÒ'9ìf‚Áü-¨™1>»å_k'ÂÝm"bh dn”;)Q«¨ÆÛ(Äê÷ÅÇaX:•±£²TMüÒ"ÿ‹ó׉?ªš§sOU°ùRDTúðíL†Ì !Png'‹èŠük>T¦öWĤÀö‡‰4d@èÓàQ²urõÌJ­ÏªîðY4û¹ªÉ%ˆ|&@ÿ拨¢ô5½÷{¥ØźJ†˜>‰–¾A@B]g(F3[L|EæÄØáL’ƒáøŠ ƒÒ- ÂÍ=F×3ä6›ºxì+.D ÂØÞÞ?­¬J ÄŸdÝ6Û9è™Ï©c×á,e€Ö0Öö4öŸÓ‹õÄö ¦ÿqÀ¢/(‰’©ìƒ=tžƒàSÛc8`3Òfæ³Þ‚̸ÇÊtŒ:À Þäž«Oçc;ÚY#%M„2ì=tïËÚPh°‹LŠˆÙƒÛDH„VÙcŠ8Z¹?š|lj˜Ç}°+$¡AC)œ¸·åî£Û‡®À¼ÿÛI[@å˜vÁ€ÛwqÕ¦t|…ÏW[‘¡dÜWKq¹8H+.r¦VGý‰335„Hïí6S"xÑû}e6¹5²9² e–JÉQk=8P¾â¥H€’HáYœ7rE6ô¸¢¡½‚Øp4>ÍØ[ܬMA6¼Q!)GªfyR®ŒšdÝWfKP„&;M%ŒÛÆÏ qÍ.˜)­OñµsÁ¼§õØ8%£HÆÕr:±˜ê¡ô¯MYʞŠyŸfxèÐË<"íD"±-VzFn,ˆ\À©ø¤¤:hÿ¼­GÆD@¶ÕRP²`½Õ¹2^-Œç¹ Ê'Å6óÛ !@¸r·?*׎¢Ó´Mkx¿Qt¾dKû Nîâ‘[i·4•„:Š$§%-›\,3VÇ'|ÎëK@ßU•héÇ®!»¦y&yzcŬænéúƒ¨\Œd¨€§&Y¢Þ}:Ò¯C‰Ì¿ý ð¸Ù‹1@”0 ž¦;ݸ|)ât{¬Z+z¢Õ¡šÇ¾é%å\Ÿ1,S&¦éÛ:ÁX:àõº¢?“?Ð=a>=ή¯ÃÐD¾™°Ã/K~J76¦sÔW'Oº_w;àôÓ‘îèÊ®ôË)x§¸ ú;NŒR 7µBƒl3Ïí €‡–Ά—u!£ž“#b¯ôª@Ð*þ)æÖ›ŸpÁ´>)ìÄÆ7 € Ó¹B³ùåÛ¯N”9í.ƒžÚÒí³Á*ô- Æ/%•Ï^j•v~9‡þ†¬u™¢DwèˆÖQ{Ó5~óÆ(0xúÉÝöŸ¼^ð‚Zƒg½ð;^@>étÉ|èæ äü,J#‚ 5–uo° ¢Ž6) E%x>w2‹‚ȤÐÑw´R%÷F}0ª/†•É™ŒÒúÂ% ˆ’?NIMƒ/›œ€g8X+*5Û`¢jÝ {6G©^¯×~'µîEvVøÓT€‰ÚF˜ùMœ‰A'Ù—hÂå{vÉú'òM¶pZ±ž « Q0ºI·xuS«-jC‰xüÞs¯,g?úzf’HÛË!±7•9eK2ó$•áæ ÍaìÉ<‹Ø9ÂñfQïCQ5p݄̞iö1†ñάàÜñ™ÎÆù»F×¾im–œLö5D”vK¥l=u-Œ)À|ÑõUeSŒå,S/B˜Îí¬¤V$€½PdCéé>©ƒQ„l†~‹.Z Ù|x ,ïóÖ‰¿ôÉ'1è#Þ¦%ub1ÄPq«“O}@¤ u£3Ž÷ô“:™áGU¨?Ô®|öË™=€™Ó=@ŒàŒr¾¾¯iÍ^ê4ê¾Ǫ©*Q*qÅÅûL±V˜S«Ú'j*$’r?î™[·ËÀCêt©:¡%Ä­cUd‰N*æ“‘(ú­Æ âëõb¢¦LrÈ¡ð7ÂÍKu}rUô-¨úÈ@-™È­¥ãAW:×ôZE4ü¼¶2±` Éw‘su¨zðTǹÖ(Øöv1ìa›íò ÅŒ?âĹÊcèÉà©ûÂHaWÊØlð }¹¦ZÌœ–ž‹ÍðYjsÎÁ¢ ÚÓ±ºf”ÉvéÁeVý©²¦Îì Ur½TXI#Ù‡0 ®øËîP¥¨so‡¢:Š¤Ì .Ûíø`Ô7K.&ä½_¡ §8¿Ø-—0bx(‘ÞˆÇLü®E ;~Öhì%×X¾lCÀ1[×J›‹cï£wÔNl¦h‚,'ë™ù…v{Äò{õRZ(ñfBóÒStÏkðlZ)^bÁ¨ï@5ÄEƯÙö@wû•Èýe©P‘,¾ÃüI”å»jâ&êÅ¿–­uï^‹ 2ÇtóÇÖÝIRä`òPSS¤°Ë®;f¸¼ Ã&ù¬‰Ë(²)5X>Þ »<;±VTEMVL&Õ; »û€©z’`ÅJrib¢CÐlšBÕPå2àv†„àÎlyµ„xŸ®æ´ä¿.AvÝQ.ž)îºi‘ÙäcÇ"FÏÒ‡(ï5P„Ë/µ¹h‘s›bX šdÎÞ²`ݲm1Ö$zwã"+0B5íOr`\nIp¼+‰ˆ[&ºèÏÏˇê¹IÆD=a@™Ïº»ÃíÖŒG'rÌÂF§Èì³ÚËO%Ryà+rï9*‡’!?;MW–ç)A¥ mZ—”ÁìЂp}ÉŸyzò„†¬’rpÜ£•«§ à5GùËEçëÜ¥<9²—¢H_”=b:±Á*•ìŸÉè—~FY¾iÐwi ”#ŒÖ2ògBЉ¹ï+â…?Ÿ5&>‹„Õ.ü§w”¶˜ pÿ åé±´>kà,࿈-F}Äëú_4•è™I»ŽB4m%D|Òë´Ñ6ÒB¢z'ß/”­|!ò~  ‹EòXÓþr´bᥚ óŽ©PçÙÓ‰bU4`â G÷i¬ßê?N»ûÕs¿­«%´»7h‘jç‡@²ô@œù®FcÄt"*Z«jWî4&äÁÎý €é˜iÓ=Ä@¶U@év(ð§ò POpªFäïÕ›@• þÖ–„+³Ð9úÿßÿõ «7fÍãðöž-¬m-ߥ©võºÛËöÛ3«ËcËï þçÙ¬ž2 Ô´a4@jøíu熸ð·ñè”þËÕ1Nßûš°³éÎïØr8æŸ}Ïz&H ™}‚'?üÅþÉsŠp*5¹©kdjÊ ò*£QÔÄÝ(ûùŸÝ©ÂÑ».…²Þ0["á{Ò¢áR³?†¾_hçª:è €õøížk¸ê¶Ì^³\næ6­pó`‹”v+^Ùï`¸Ý tméˆþYÑùoñM­‹ÓñêRÛʧ½¾´}¨ÉЉúwäÇUsä”Me™š[WŽ€=üˆ¥×nÏKˆÒ@'ňE!Ùœ—áê˜ü{b¥aŒfs£Ø8¹³mËB–¯O>Á(¿BØzP˜ ÆcFЛ|Ô.9,ÞÉ+Zú6Ã¥Œ#lKÐñX ÀQúieUïÑǓӮc3åŠ!žÖåæg ^³r¨I % ¤Ï!%„Ä Ï=\À™¡§r´´´U– ,8AÅwÿ–¨4²¬ÅNÆó62Ea–Bä^“¢\±EMfìQÑ€¼+lãî¬Àå9jðÂ_`²oÉ´ð*&uÇnÈžÛŠÁ¼‚O '²Í?iJÀª‹].F‘º€µEò xÛÁ®å¿â¼]zÅ>¨mðFez\5öcD®sŠ=¢«üÍØt™ÇÔ …æ–ç“‹|æ…ÞÕðœ€ÿ]' ·{ÔÇPSx—ûvœÏÅpD-½pÓˆZª5 Lv;€åXl©ѱ¥ÎÆë•o+¸oÑÇçö,Õ^j’ýŠHÃÛ`ÜVtþ^£¨ä£¶¤Èl¹V‰ÂÐ`Q á!TÑáu?ÿ®¥úNw.³hÄdyú¥m´W¶_å PªÔ³Y çéíØ¤)DËöå4Dqrâÿ‹÷;·å6ò2G§® ²yÙ}”»ãA†àSçº=c¨‚BÑš¸4ê:¼Ö ërÚ…¤v»­0ÔɾžxǨúMÁãAªý/D#uzve)Ú£œ.5À~] ³`ÉÀ\Œ—àây«B»(5•ùàͬJò繑ïžx àõz)aaª¡Ï›=2bPëHŽsœƒÏé[ƒ3yeŽËûœ=÷ä-Ý&Æåu4\}4’1sBõ©$ëQÁõºÐÈÓÈAÅX+" LC"9UÓ¶‚bGÊ5r0µ{=Ÿûû¶™ˆxØ,ÓkêØvÊUM÷ hØðÑzYEñŒx9Åm•AÒ~Ðø9ìkCN1ÔN pU3ˆ“v©»føÐ g]bS¶ gŽJP"è„ÇO´uâ BÏSU+ ð4‡MQ…¡cÚÚO®S°±P¿E¼îfO‰:ÔÆ­€Ê¼"8KĘÁ¬uw€ïâ×1˜Ä”åÞÆÉF@DòÿAOð§mø168#/‹òÚ@j÷ ¦J›¹q®± #÷ª·7ƒzÇÞp.Ui0b‡“¹ <þÇŽ<Ih6Ž@x±È±’À£+ö¥ö é˜þ•1H…ûUþRŸ¹“õ¿[ÞJwE9”‚ Þ¡Î`EÞÌbør¬Pž}56V#îѶA׿égˆ«óE‚Ó€Ö•$Å Ýÿ:V´‡ŠŒ“Ý!'ÿ6^R!èîëQ.{ gyoRäÿ;>Š5왃0¨ÁýÈÄ ÷ëBïÖ<ó> žIˆÃ¸ÌÜ!C¦/Ö–°ù þpƒu.чHõ6 ¯À¢ MßGLægìI.¸N ÜOíL±]§c—1ÉŠ*G2¶§Ì6'dëß/:ï)-FIÖ–”C¼¥HzÈŠ;( ÇPæ+’’ŽÊ]襚¦§»B¿}HÃß ¥ò¥>¿›dËàä°føùöŸéùß!_Z5ó«ï7Ê1žBFždE…íXÌNÇyÀ|å(»õK €=U»¼#ŸX4ó'†Q ½…ãd¢+%"­Ly"7ŒÞ›þ^¯×D¡}g°pP2“áTQ°=I?n}¹QÝ]S•j³ ]Â(¥'à…ë@L¥ñÀÊ?Â’“< w½NCן/€¶ÃøÝ‚­Z¡7¶Æ\U™(]´Œlüí‹k+ÔŽÏ`)ôàV³Ï«ÀoŒùÅçÐT°Z”ÿý÷Ñ¡¾ÑÆk’1ƒ•–ù[Põ²û"ëži;¢U#0ÍWå¦*°]d;[¤±— !¡/ÕÍ"Ì!ë‹jXahX¨mS%ï]bܪ¶G[wŽðlTz¯§Õˆo‚Š=¡ÉÌ’èÑDz´ÁFGC’+情íj½m¾{ù¸TÿfÕ´£m£¢ lAˆ¦2ÊÕºn¥ÑïÞš#ÁïÌ‘„w1ÑÉè—~´tT³âÒ÷۲㪮‹´ù/Ä"½^M$×êQt…03ãdò`ôU:rKqÙ= ÇwÙ`–{MÜÓyÁïèj‹ øO½°àù¾n\þÒŽÁ;ûÚ˜t–vW§Ÿ×øÜûüFq(è†ñ·:ûÓ“M…“zûÉ£ÁäiÓÁÞûB0ÍÒé5zÁê¹Dv|ꋆV"¸C’¾^#™./xã$8Íæ'˜ÈÏÅ+ah!š€÷ZØED#Wxð7F-$§<á}øÿé‹ÌSÖ[R­<‚ÓÞí’åzŸv¬Æ—ÔŸÚ} ¬:sI8ÓÆžišÙ‰#Ìß¡ Ø^Û _¸ÁF[iHÉßK­¹7 L´mݼ£{ƒœ)"s ¾x©Ï—¬žK“éÎhùïuŸ£åÞ¿Ž RrQrÄ´°nUåÕÓYkyD/#xIà#Ø\k5ÊhYÕ¹5Hq-ý»÷ÐwZ6ñ|J¢%€:?Ý·4]ÝÕAõ¾Öjí?õ¬ïý­¢óEŒWn O°ÀFÌ@W"Û±‰jEôÜ“äb/‘ Ä<}ù¦Â(IÿŠgóÑkØV]ä¨W€€·c͘ï–NE DÆIÆ/EeÜDÃþ|³+— ý­Ý“™f,…J¨'z?³B¤nJo+êƒ|‡â€¸™CÊG<Ç?8hÐô1€89jf#™UÃË­.™vÛ’;ɿΙ¯«°‡N„!ãŽÇ57øµ#p¯œùh2D^_äyAK(î›uÖš2:§O­'»¬ª5tlG{K±à^a"¢Iò»iܳ.VÐ¥?Fõ3Ô<`Ù>a ÆÐE 5Ó”éÒí;ƒ % ,ýÜX+K’U±W…B[Kéû‡pq•I³^~M¸Þ§D!ûD…,dˆ £ànÈ´Q¨÷aÀ·Ÿþš»à^Y™ßév@Ç6S—›4 lä? ÖnÉɹC{HÛFÖíòpyuÖóÖ4¸<Å‚ßñˆ7Ú`{ÁkíÅßm4&W¡ ¹-qeܱيyÏ×lY!tMž\Àí´ÍwÙ9f¤0*•ïØð1)¸G+¡Vá%8ëÍÔ™]./QW`İYÄŽ\]oÑU‘ŠzrÎoèM»¬„Ýõ+mÈX´4„ÃYPG1¼>N¦pâAIOѤZL=€ˆPŽqëD€è†ñîÝs#?4{1§ÑëŽås¢É|ûYe9›E«øÚ5Gà‘€ i!v-:Ä{vF”yÂ)|¨/¹î•wbqŽN£É·{i'Ü1ÂB F’z”:Çi<…DT=hCÁé7™þŸ½„¥ÒE&#DIH¨3ŽøŽŒWèqÄ ämf¼>ƒ„“åJ. xE‹ÊZ°×­[ÖQs4Áê¦2ݦaD…}«xñÌòæù‘›‰˜ëôý…“¼ÄÎ(O·a¦ÈÚ“£±å©rõ)Њ\·”òŠÎ‡ŽìdŸcü9v­JÑ'× ìò*ñâšÑ¾ò vaRwÝ¿²üÙ(HyÙn‘ [Ubæ:…&Ò¬o?ë–•ŸZã—Sì²GðK ›¢ Q\[$[G"_yÇ8*` ÝPº Ò9ƒ·¦·íÍã»:*“ e®€z°Zr­ á¯=9›¹‘ù¨HVµ—¦ðØžh#zYqRôÄ:Û ½¼#,V‡%xœPÏc¯#l,]ëäÇ×@ä@“Üv›Í­Î’1Ý:ËÄÉ>vb6f†žxf*Ûu«¦Ðöw½Šwªýøá“½²‡rÎÓ1äHhס[p¾eLƒÁ<IJ €0O¾ï±†¹§ל‘og®lòi•¢&Uü® ª…Ú /A“3§…[· NfšãD:`ïÀÔÏ&}#}^Ö8){wcþú_I暢1ònŽ·þ3E['¦9.3M7€]¥°„)‡Àκûó tW7ß½˜Y…Ò©•r§Ï€]*¬Õ•Si•ydŠMaTæ¢ül.¸cBM+( »Ž¾¿ªÎ »Âî½°‡¤uâ Ó‹[NdÐådޝ6ºÃ¢‰Ýý¦[Ô²1$OR< kzöŸÍâ¬$‚ø)Í\Ìa1\#uç¶ ùí¹c¨µ¬–™Lüª[t§Áñ@þá*Ùôu`r;E®èhd±¥µLétœÞ€ÚtÇêf¶#"FÐï…ÚäUŒ1xN4Û(D:hò™¢ÜâiœÂâèeqû·ÄX‰¥{³¦Š¤rpyvæj»ßadj!t6Üg'×p,þ‡Dç“ÓvúqLëÖR¦[œ$8‚•ÄÙpé¹Q%*Ý‘ËY©|Ñœ­àý’Z÷¯7?sÄš(̉@ôÓy1 üÙ/6¡˜~ÃÝØ–€ˆ6 ×F=ùí°)Àòó§6ðl Dµ™–?æú·m{½^ÂóÖà¦2 ŸQ sÿSö#6gÎÒýŒG¹6 ²ÞóþЉ(¥ ŒQ_>bY”̧®\ÐN¡6;ެ©Uop«׿c 8ô”d»?áFðä†ghÌu“¿Kýï™GEõÇ$fµJö÷Æ3DU!¿ ðªÇøáÇWéò_”â9½®õßëïõyy“ä‰ñIÎ’!¢mOH³tk/"k:"mñ"š„Äm¡)Ñ*ÐÈû7!©ZˆŒ*ÊæhƵšU¹ýtl¬E]³Å,3 ¢Æ›•Ó*8†·Ë‹?<$)xlÙ¹ÀIZÐ×[¬ÈËèùŒKzízëEZ)‘Çe6Il0”'î°Sá›ê„xWçó9„Þ.͸Që QÏ[Oñ %ìLI[Ðâ¥%FIQ¹?É·«GΕ¡Ø§#’,} G½fWÛ àR;9v0Å m©$ÕvóÔ>ˆ 1°¡£‡ôÇæð ’Áœ˜Q‹Q.éì4i$kêÑcÿH¹bú »Í.—™ ït€Š›f“Ç„ö–`ð4g8ÑtèM%àsATÔ{³+u—†ÙÙ3z‚«qªµë»ÔV›CÎ{ÛÑN$³K vKj2)Œp<Ö²‹ªÙí¦ö@þX£Æ1·_ÌÝcÒ ûß¡ÂÖ®û`¿u5s¸צ0`rλZùJîÔéYÞúp»¾œØ¨ç¾Ÿšð¨ÅAmÅâéT1Ã\ù‚HRÀÍ;IÍÀ;ÉÇjñœ?Œm°ª€îß EŽ#,IºÝ) "íßu¾‘ÕÙ_±çŒ´o4-žÉäb ÌPlBÆ\6ÎÜJ|ô Ó åÖ‚®­ƒ ˆÈµ]–g¤ ”¡m®k7ý å+©wÖ ›èPYá‚rÄ ëÑ™vø%['+¿ý¨_¥Â,¨q=ü•ôŒ«eŠ“BOv~<:vÑÃ×!£ê–ŽrÞyeóÄMæ¸*l †ñª˜"VfY<¾´€>÷‚‘^¥+ 8ÈgŠxÀßÐß&P “À±¹GR\9Êmvó87ºcߢçƒÇ2±­!ŠhqoÀŠ…F¹·Ñ6Äш“Téq((³"•žºÜîï_ŸŽ©õ£ŠØÅ´û*IÀwYÎAÝ;dišHçqé/@¢m#xá %bt÷ I´¡}Ê>uœ¬sfvÚêoÐÀx¢]¢‡QØ¿%º¢Ä­ÓJ¤˜d4q7â4¡JLò+HI䨒›NÊ© Àd%Æ­ •CJ7ÞÂo1§}·} ÕE™Ù ­?…`qjQ¡ løêh»‹ìùˆ¦n²óP`ªE QhŨ”`ØÕ¤™%‡¦BS«ÿK8ƒ D ‘wqja5õM3=B¤ÙX†Q±¢%ºùÌl úC¥&©9EfWä1™­à2®¬‰›»N‚$®Š‚:aì£\.^؉ó~aççú×hð8½ÔÑ5'q³Â*7»T1r=T¼OÑç’U޹‡Es×F9Ää<§wÐ!Èéÿü|å“«<üuúÍŽl¥ÔdTH ¿hlVU5AS.×× Ý»wÅÙ]ëqË8ÁzŒj<¬1ÄÄ”Ë4 ,[Ü©2ºjn>€KóÛïSšÞLo=ƒÏÍZVšÖü˜±'ÄÑ<9Ó@óB½agãø Ë¿U-×¾EzuO2­ýŠBâP£©¾^¥„࢔ Âú²9åß+³hxæÙ®¿^m˜Ê🇄|7g“÷(½ý)ü½~Í©ú{ ‹ˆäå : ‘·™ó1>¯±1 ®\~2¥ú!ñ¢;{ƒ+”Q¼º—Žƒ56Ÿ¶k´u°’s¯”üIý½Ö¶yIh ^qW#…#üwL?"ý-â#D´m›¿õ÷*[ˆwó+6z-½+ÿõzµø_ôÅÿ½þ^/ísÁ ¶­+­ÈA]@Û†ðB Àÿ½6bFõ^CCS¥#S£](Œ }³B/ŽZ9ü}¢m£m³µ¬/<RUqŽñáe†€0sÕJ;XÍ“MnôMÚ h]¦£âÐm‰?ƒÛd7—þtÀ £0@]fÐæQ°âÄãìÜE¦} òÉPÿ!‰Öt±¾ã³Dg<²ÎÎ]a6+3º»ÃŽâ¬is¤XMÅ•’jrC„q÷:ö'aÁnRmVd§Qw´Ä|dêý(œJv‘à!ÝôÚpë¤s èµ½V#N7ádÿ.›2sŽ:âЧñhÌ'¨Ê$B*}O´ëÁ›xÍ(ŸgvëäÍnó©É-w%$q '$âä™3t€Düÿ‚ (Êé„1ï}¸RLr9´¸ÈÑWÃJ«igi;Ó=ç´6·L·+Ùˆ‚<=ë:’¢pIñ7ä´Íˆ‰Re-A!YUþX÷9zmsòð‚Ÿ_¥\Qj+Ÿ¦|‚Yý$–r­€»`sÓÇ89¹Dda÷HæÛ@=_­'… äM9žX¹£Ú‚CBT•mËŽTàÅ+êY|Žƒ6_æq+‘¹`gr¾ö¾ï‘íÄ)‚GlÐ;u1DuÃîêÞ5³Ž· E€§OSÑbG²{-ˆ\°¨킳¨¦¶r|46[ Î áÞ-;¼/†=¹’ž8ï@ç<Øä§q½Õ0>cë²óÍ”SË`ï%Œ}Ä|æùþº§©mivϸ‘+RJL&˜)è˜ôV¸’Õà‚Ͻ?Ùû`2I'ÙîkXÿNûE<5“q}Àös’ðHðdŠ€žØ)8)ÿª ƒÙ6s*)çëÜ“¼œ»ÙÈ #$>yaTˆÇ” -Šˆc›sb¯~“V°öŸò„¡xÈÇ™{B­¢VÕ–wí¤<êwNؾ3¯L#«w»«ÚL°ò€x®MåÝW!Âæ“„—f‰± ÝN¾0n˧é' ‡Å\PöùÖ[ù§Éåpí¯¥ F|`9ÑF´m°mÕƒÎÖº¯½p#€å¡/5w ˆÎ$EigÏè‰1Í]É€ðAu“ÇÙ Ú¶ÿè¿mûï?Ú6Ú¶},` Ò÷°'™Æuz^¢Ø*0ÒâñÇöy靯]ЯRÃqLB6ÂÑž/^˜°à¿pð¾†Ë´ Ý‹ƒÐ'ý"!¡þtÔᤀ@“ Öh b$áLÀo”Œú”ƒˆvôaæjÝÀÂãH]ÐöÓ7l™¨ÔL‘³}uH¾ëù“>D»fŽ_R,D¶±Wbzu¢Š}uˆujJÿäqHš\qäͰqSÓ¢PY†Û7®Öc ³¤S3Œ¥(Ú?Ú¦DîÍhŸq篧yäÖ6D>è2—–›b|‰vý³QÛõõÓ>‰k]‘ßüÚ”^dt_ùDÿ DçW•©ÿgïJ–äÈm(Àlÿœ¿eþÁßëËcG¨»’˜7ìÉZZ-ÉêƒF¡©êb%I,À{£ 1‰KáÔbq$ë. s¹ˆ1犽’S£Ö.ÊlÏ­=uî¾ÛÓ¢¤ –à{6„ÀKͦ­%Çó㉨Ä;Çíîo¾{¢ö³Ù„ì+O!\ª{¿"[ä&ºÉˆ±«îÀÿ¶L1éȱ~Í úô¤@rVÒ²V V 8× {({ë¼`\1€ñ47íÕ¼G“s„"K/ë‘·OD(jø—v…©äâÒo^¨ü $ü튆d®w#Íì·c XèŒàk üfÄõL=¤Ô÷škÉÚg"™6É]z—ë Å]Á|d»¬ rEÒ#Ë ¸ÈeK'S%=¶K;~AO«M=fú@ÁÐ0¿$ct!Z³Ái¹BÌîÆC_/)iG&ù‡p¥·“»ÕϨ"Ží§Ò9ʚФOÙ%ä!MÏ„|#\ {¶”ÈDLÞ‚‘¶“ ?®Xû K²·P’ÿ\ר¶ÆòÜÎÐô=ä”s¬} ›3®`ƒP2Ä‚—!õ„ÙŽù«ÝdÔñ‡PQRÃ;¨A'diÅê"¢t§›tóÐÆQŒÀ $LŒ I.Lí¯ ÒÑ%å{€@5 fÚÎrå 7ωøÕˆgRBNú*ÜœR:VB"RÐòUtåªã¨G±OÌåÆ9F0kiǶ‡§ãN¢á™MØZá^ßFlœð’:AÔ5ry¢œ! JtžÀ€Þ‰âuîDÀ •Ž£T,žKæzHR¢‰·$îQºh4ÕQ°b9¥jWûTW\© ý§>0lÞÛ£p ax0Õü~$Û 1_ ’0iÄ;ßð"ÙŸwgh8ûÊl‡æ×?ÊÕ£OŸ¡'oy2à9@@øtCïïŸÏ>©Dûay6ð狸²pó=@AwãÒWorÖLZÉì÷eý)Ò™ŸÀ¶ÌŸk˜ß‹~¼éÊiˆîxWvò»Dt²½Ãiª‹cljJ š z¯ÚÙI7º#ŠûÚCòÿFLgÀzzæLþ¦õÛ …ˆ Öz;]ÝÈZk—ô,DPËQéDn¶“œ˜‘ÿ½‚.yÑ‹÷íH²ÂñŽÚ‘¤¡][km,@tV^’xkü@2 ¢»N0o΢ råö,ñÎr¦Ü‚âu€ JùÑA¢–l$ܦR½™˜ HyrêÈcò¢²AIUázÓPÚ} do î‹Õ$lï Yƒˆ‡ŠIêºÂ)¢©)jkMB?ԣ±fÀ«·ßýfb…)1†áD VG¢PÞÖ?.iC !~¯Þ,òˆtˆ9}ò9]OÐ §×Mñéºïˆg×Q#ƒ+&E÷Ç;}ŽO:]ºÏÆ>;Çw—TTfs¬ybˆúZ'Ùµn„ç‚¥Ü–Û 8c{Ö¿LùxLñÉ…"O¿¿ƒ @“éÙK`ÔšÞz-úŸ_+–3¿8Ïy,†R½VYŠäžž™¦ß)ñ±y/®Ø2é‘òpH¶Ý™lC.o3Ÿãð>ڋʉƒ(0Ç€¹n.U…ãrbPÂ.ŠJR¸Ð%{ïªDä~íÞÚÕŽ7yÜ…Q›ÄE‘àSîfA*£a,'¸Wmfƒ½çó1z7 'å,ö)Èv) ·í¤%©Ø÷Ñyý8-ZÀKð%6ï»0Í0á¶jÑh>=ô•^g+(M}ÉçÜ­®<ûå óò½B}ó ÐKz¡8{D”^1æ’óÀ 6Ú˜pomft!Ãášmzy=ì2_FOG· õr‚OLÉ#ì}yœDÚcUóÙ¾ž_…˜³­÷^ »p†R°¬Õ¡RÉÇcµhŠô¶Ì$BÈGäsѬ—¸ˆÏîïgµ±z+Ûü äI~i{=cNŸÙÏ 1Vk½ÿüã_õvû•Ëûlú¬γֳž½oõ¬õã³(`º….KÄLI¼ˆ+¸Þh¶ #yWÝD¯ûšuY Èk´Ü2â@ÂpVmM6Ybü–d„˜˜e“ÂÄïœë—ÚæÊÂI«áZ‘K*?Éí,¯Ît’h„h`™7‘î¹7Ý“h|'äQ¸opûîÒzbŒ3Нk±xQl¤$úß“*¦A<L"¸tP‚„-σGŒ{ñ:m`h«q½Ü´p“Í3²©m1'<—JQö%ƒ ¯ž!: 6ç9qA)ä"Å ä|}´7THøMzñܻؠ9 '7´qØ®vN&É’œbó9³ÔƫԨZÎnqDÈ)zˆç%m…ü ïüž/æó©Ÿå¡û\óƒF]iÉ,ÇQ$“L&}:—»g¥š‰ç<ß„z¯ÆÏw¹ÝÙ+-}Ëd"ÎÎÐg(Ž»Dà>rí *$Úy˜›¤.›hf>UÕ Âк Í9‡l^{È·˜‹A}Ó,»ê@Vè¢Ë/îÚŸIkC2 9¿Âü®³3šK\Lþ‡AQªCD9ÑœØP︣‚¯Òá ž ®±ÖOÉ25€‘æÑêô'¹h<9/®éaßù<ÕgËD¾„ ¢Ž$;á¾Ã˜gÉ\/9–DŠ–ÈÖŠÓc#Î÷fAi)Œ¦÷fŨ}Nc[@¨]óq…ç÷%U<{<'WüÑzÀÿq„"z`›îɳb„nº“¶áž¡y‡Kf¸Œ ’}ʆÅ ¸ý%&¼XZ€LÔÇS |Òâ;q$Ã0fnÚÇãvð/›+ápû=åô˜œ,ÆkCkñâêÔÒ^ôƒTvÊA¡Hµw"_*wO+¿p÷ÊÁ2»;ý"S$‘ûAõ}a`ÙŽº—pÃuõ¿xbŸ—-½zÌyÀŽKó’!*^b'áu)›Ðr B.&Uˆ#gBpI“a>Ö1¯ïº*Ë?¼ÌI)¢\~ËI¢‰†˜ =˜p ,ò}A^ó ¯ Ú=ÿãIÞ‡Ìæ^c“ÈèV^N¤î1Q&»ùàN_¶5†æW= ž¡^&,ɃÝìt¼/½`ðwNYŸ!W±Î5%Zòp"ìEÉ,·úqûö×_Ma5mÉTªŒ«¤x;oßà?ÿþ³üãmTRÉkæ0KQŠáɳK¿žµ`«¼ !ÿ¢‰±HžøY†®œ>ñZn³h¶ Äàp›¡ö´ØºJ)X°`„RФƒwü©Ñ¨ Y/`ã#Ú™;™ H””ÓpîæÃŽÎ?«´ƒÑ˜¶JÕ‹´ÎCí啈„"ñøe|F¥Jµis݈,PÃùÆ¥u1>©¹=¼†Ò޼ÂÎæŒ"¬ZéÈPó3ì€)–Ó±›hWîº ¸0Š×níKAéHïЭµÖ³ží-z8ÞŽ£¥ÈËœƒ‚*u{Ôº7«à$hd ÓÚI¬Ñ¹h‰ °ø²íãÚ§UziøGƒ@ìU'‘¥ànENz NFAc´ÞM«Y “°`ØGà©Ê!ïý ^okäüsÕtFG9ú®Ž£=Ô‚å8 –YVªõ¼ÝÎó¼çykä<¥”ãx;ú *Ó§Ÿ'ó÷ò5ÌÍÚá™ ð°±rŠ’;›Ò'ný](ƒP_¦Ìê­F¾¬Ú‡),i»ÆÔ\ó¡pkaÒa2`–‚Çq”ß…×ÅÉ¢(9Ëá ðž’c1%WwÓAh· >'¦¡AïÉx_’*Õ³žïït;¿ý÷@ÔCqø•l~‡ «x£“nïT©¼ßÀW¶•ày>†¥›!†ªx¹…äB#eyÜGëöêál¾‘§=´,ïh ×oyYªÍøz8Ei®—×íײ þ(ºß+ó¦Q@,ÂUd€Ù1ô ŸK¤¾,L/ )ùÉyÞ -&ÇM$·>—³ ɆE ^+ç¬þ/C°ôxŶOɽeR]ü©oU§àÎâ €.~¶€®žDçàʃ£%öx0ˆ’#ûW°ô˜¢ ßN¾Ý\eÈÉQÿ£ßÿÕÉ.{Ýa+&p–á÷( ß;ÑŸŸÍÅc\X«Ü's`Tôø¡×b²bÐG "åè«\´Qõ¿#fâcN$¤êwª˜æÃ˜yÂé'ÿ\ó>˜Ð”)ÞyºÔz⋬ ¹‘0Ö4ƒ£<¸.0±÷¢I¦×h&¤‡ÑЪÀ´&/£ðׯ›”§´köÛ¶‹2’@²ý2üêÙ›?ߨ ²‘ù_ÕXE0Jâ^ŒÙ ÛwM¶wX¾½ªÒ=„mOï,X é«ïª×û€R Ȫs® Zù:mÖ|Ù¢ŒM“[H¾ò8Ýôº0bÞju6‰³$¯áÇZ3›LevȈ6¸“ÙêC[¬éd0uH-¼iõ¿‚¢¬d³AY–êQä®HӀЛØlgI~C|Êqð±ËÆ.XUº‡ ôБsv/ĸ@~*ü€Ï´éàø®Ñs1uQV¨n¥Á´ºÌFG8Z¡È†¢´«0 ”âð‡kuÝ-Áæ~\WjO >AY\À6 “6`p?%ÀêzfBdjJ);!Û¥#JâH 8#­·c®uì=v§¨ZÍo A J îsY0Ïló•'T"”›“ƒ1‚LpÍ~îÙ.§æ¦;-Ê>/g2¥²¸Í,jØIÓ HQí"j_ëaë§z„]«®Hµã°€Çq”ã(¥´Ž1©Ú½PZ°åˆ)”®ˆUú9”`ÏÜÒ BºÌ­ö‘RZ7dteáyT`Ùüâéi3ðwþ×kÓ6™f…Q¡Š^(у‚>m0Ba><¨çHjs5«ÏtöA)Gÿ³”‚8€Îþs;[9zJ9ú&@g5ï}Kíðñû:JžaVè*Âìïho® ›° °FËñ$ÖSD×uP{†9Æ G“­n9Swº  W]˜Ä=jzÑ…¿½û7𮾪r”¶¹~—±hG-™­ð1Òùˆ)\õ|\pbeô2­ôWË ¾fS@ô¼6TëyB¥Ûû;ÔÑ+ø "þ°ÿÿÿ„Ùà°:–Ð&IEND®B`‚opensurgsim-0.7.0/SurgSim/Testing/MathUtilities.cpp000066400000000000000000000036671277777236100224270ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Testing/MathUtilities.h" #include "SurgSim/Math/Quaternion.h" using SurgSim::Math::Vector3d; using SurgSim::Math::Quaterniond; using SurgSim::Math::makeRotationQuaternion; using SurgSim::Math::makeRigidTransform; namespace SurgSim { namespace Testing { SurgSim::Math::RigidTransform3d interpolatePose( const Vector3d& startAngles, const Vector3d& endAngles, const Vector3d& startPosition, const Vector3d& endPosition, const double& t) { Vector3d angles = interpolate(startAngles, endAngles, t); Vector3d position = interpolate(startPosition, endPosition, t); return makeRigidTransform( Quaterniond(makeRotationQuaternion(angles.x(), Vector3d::UnitX().eval()) * makeRotationQuaternion(angles.y(), Vector3d::UnitY().eval()) * makeRotationQuaternion(angles.z(), Vector3d::UnitZ().eval())), position); } template <> SurgSim::Math::Quaterniond interpolate( const SurgSim::Math::Quaterniond& start, const SurgSim::Math::Quaterniond& end, const double& t) { return SurgSim::Math::interpolate(start, end, t); } template <> SurgSim::Math::RigidTransform3d interpolate( const SurgSim::Math::RigidTransform3d& start, const SurgSim::Math::RigidTransform3d& end, const double& t) { return SurgSim::Math::interpolate(start, end, t); } }; // Testing }; // SurgSim opensurgsim-0.7.0/SurgSim/Testing/MathUtilities.h000066400000000000000000000070731277777236100220670ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_TESTING_MATHUTILITIES_H #define SURGSIM_TESTING_MATHUTILITIES_H #include #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Math/Quaternion.h" #include namespace SurgSim { namespace Testing { /// Does a linear interpolation between the start and the end dependent on t. /// \tparam T The type of value to be interpolated. /// \param start The start value. /// \param end The end value. /// \param t The percentage for the interpolation. /// \return the interpolated value. template T interpolate(const T& start, const T& end, const double& t) { return (1 - t) * start + t * end; } template T interpolate(const std::pair& values, const double& t) { return interpolate(values.first, values.second, t); } /// Specialized template to call the correct function for Quaterniond, might be superfluous, /// delegates to the eigen interpolation function for Quaterniond /// \param start The start quaternion. /// \param end The end quaternion. /// \param t The percentage for the interpolation. /// \return the interpolated quaternion. template <> SurgSim::Math::Quaterniond interpolate( const SurgSim::Math::Quaterniond& start, const SurgSim::Math::Quaterniond& end, const double& t); /// Specialized template to call the correct function for RigidTransform3d, might be superfluous, /// delegates to the eigen interpolation function for RigidTransform3d /// \param start The start quaternion. /// \param end The end quaternion. /// \param t The percentage for the interpolation. /// \return the interpolated RigidTransform3d. template <> SurgSim::Math::RigidTransform3d interpolate( const SurgSim::Math::RigidTransform3d& start, const SurgSim::Math::RigidTransform3d& end, const double& t); /// Does a linear interpolation on a pose, given Vector3d for angles and positions. The angles around the X, Y /// and Z axis are being passed in a Vector3d for a terser expression. /// \param startAngles The start angles in the order X/Y/Z angle axis value in radians. /// \param endAngles The end angles in the order X/Y/Z angle axis value in radians. /// \param startPosition The start position. /// \param endPosition The end position. /// \param t The percentage for the interpolation. /// \return The transform gained by interpolating and /// assembling the rotation and position values. SurgSim::Math::RigidTransform3d interpolatePose( const SurgSim::Math::Vector3d& startAngles, const SurgSim::Math::Vector3d& endAngles, const SurgSim::Math::Vector3d& startPosition, const SurgSim::Math::Vector3d& endPosition, const double& t); } } namespace Eigen { template ::std::ostream& operator<<(::std::ostream& os, const Eigen::AlignedBox& box) { os << "[" << box.min().transpose() << ", " << box.max().transpose() << "]"; return os; } } #endif opensurgsim-0.7.0/SurgSim/Testing/MlcpIO/000077500000000000000000000000001277777236100202455ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Testing/MlcpIO/CMakeLists.txt000066400000000000000000000023721277777236100230110ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. include_directories( "${CMAKE_CURRENT_SOURCE_DIR}" ) set(MLCP_IO_SOURCES MlcpTestData.cpp ReadText.cpp TextLabels.cpp WriteText.cpp ) set(MLCP_IO_HEADERS MlcpTestData.h ReadText.h TextLabels.h WriteText.h ) # The headers etc. for this do not need to be shipped, so do NOT use # surgsim_add_library here. add_library(MlcpTestIO ${MLCP_IO_SOURCES} ${MLCP_IO_HEADERS} ) surgsim_show_ide_folders("${MLCP_IO_SOURCES}" "${MLCP_IO_HEADERS}") SET(LIBS SurgSimMath SurgSimTesting ) target_link_libraries(MlcpTestIO ${LIBS}) # Put MlcpTestIO into folder "Testing" set_target_properties(MlcpTestIO PROPERTIES FOLDER "Testing") opensurgsim-0.7.0/SurgSim/Testing/MlcpIO/MlcpTestData.cpp000066400000000000000000000023361277777236100233020ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Testing/MlcpIO/MlcpTestData.h" #include "SurgSim/Testing/MlcpIO/ReadText.h" std::shared_ptr loadTestData(const std::string& fileName) { std::shared_ptr data = std::make_shared(); if (! readMlcpTestDataAsText("MlcpTestData/" + fileName, data.get())) { data.reset(); } return data; } std::string getTestFileName(const std::string& prefix, int index, const std::string& suffix) { std::ostringstream stream; stream << prefix << std::setfill('0') << std::setw(3) << index << suffix; return stream.str(); } opensurgsim-0.7.0/SurgSim/Testing/MlcpIO/MlcpTestData.h000066400000000000000000000041141277777236100227430ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_TESTING_MLCPIO_MLCPTESTDATA_H #define SURGSIM_TESTING_MLCPIO_MLCPTESTDATA_H #include #include #include #include #include "SurgSim/Math/MlcpProblem.h" #include "SurgSim/Math/MlcpConstraintType.h" struct MlcpTestData { public: // Description of an MLCP problem. SurgSim::Math::MlcpProblem problem; // Expected output for the solver (as recorded from old Gauss-Seidel code). Eigen::VectorXd expectedLambda; // Other metadata std::string description; std::vector flags; int numDegreesOfFreedom; MlcpTestData() : numDegreesOfFreedom(-1) { } MlcpTestData(const MlcpTestData& other) : problem(other.problem), expectedLambda(other.expectedLambda), description(other.description), flags(other.flags), numDegreesOfFreedom(other.numDegreesOfFreedom) { } MlcpTestData& operator= (const MlcpTestData& other) { problem = other.problem; expectedLambda = other.expectedLambda; description = other.description; flags = other.flags; numDegreesOfFreedom = other.numDegreesOfFreedom; return *this; } size_t getSize() const { return (problem.b.rows() >= 0) ? static_cast(problem.b.rows()) : 0; } }; const MlcpTestData* getTestProblem1(); std::shared_ptr loadTestData(const std::string& fileName); std::string getTestFileName(const std::string& prefix, int index, const std::string& suffix); #endif // SURGSIM_TESTING_MLCPIO_MLCPTESTDATA_H opensurgsim-0.7.0/SurgSim/Testing/MlcpIO/ReadText.cpp000066400000000000000000000335471277777236100225050ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Testing/MlcpIO/ReadText.h" #include #include #include #include #include "SurgSim/Math/MlcpConstraintType.h" #include "SurgSim/Math/MlcpConstraintTypeName.h" #include "SurgSim/Testing/MlcpIO/MlcpTestData.h" #include "SurgSim/Testing/MlcpIO/TextLabels.h" // input helpers static std::string getRawLine(FILE* in) { char buffer[1024]; if (! fgets(buffer, sizeof(buffer), in)) { return ""; } std::string line(buffer); if ((line.length() > 0) && (line[line.length()-1] == '\n')) { line.resize(line.length()-1); // remove the last character } if ((line.length() > 0) && (line[line.length()-1] == '\r')) { line.resize(line.length()-1); // remove the last character } return line; } static bool getLine(const std::string& fileName, FILE* in, std::string* line, bool skipEmptyLines = true) { if (ferror(in) || feof(in)) { fprintf(stderr, "Unexpected error or EOF in file '%s'\n", fileName.c_str()); return false; } *line = getRawLine(in); while (skipEmptyLines && (line->length() == 0)) { if (ferror(in) || feof(in)) { fprintf(stderr, "Unexpected error or EOF in file '%s'\n", fileName.c_str()); return false; } *line = getRawLine(in); } if (ferror(in)) { fprintf(stderr, "Unexpected error in file '%s'\n", fileName.c_str()); return false; } return true; } static bool readInt(const std::string& fileName, FILE* in, const char* label, int* value) { if (ferror(in) || feof(in)) { fprintf(stderr, "Unexpected error or EOF in file '%s'\n", fileName.c_str()); return false; } std::string format = std::string(" ") + label + " %d"; if (fscanf(in, format.c_str(), value) != 1) { fprintf(stderr, "Bad integer input in '%s'\n near text '%s'\n", fileName.c_str(), getRawLine(in).c_str()); return false; } if (ferror(in)) { fprintf(stderr, "Unexpected error in file '%s'\n", fileName.c_str()); return false; } return true; } static bool readEigenRowVector(const std::string& fileName, FILE* in, const char* label, Eigen::RowVectorXd* vector) { // Read the label. { if (ferror(in) || feof(in)) { fprintf(stderr, "Unexpected error or EOF in file '%s'\n", fileName.c_str()); return false; } if (std::string(label) == "") { if (fscanf(in, " (") != 0) { fprintf(stderr, "Unable to read label for Eigen input in '%s'\n near text '%s'\n", fileName.c_str(), getRawLine(in).c_str()); return false; } } else { char readLabel[100]; if (fscanf(in, " %[^(](", readLabel) != 1) { fprintf(stderr, "Unable to read label for Eigen input in '%s'\n near text '%s'\n", fileName.c_str(), getRawLine(in).c_str()); return false; } if (std::string(label) + " " != std::string(readLabel)) { fprintf(stderr, "Bad label for Eigen input in '%s'\n near text '%s'\n", fileName.c_str(), getRawLine(in).c_str()); return false; } } } // Read elements until ')' is found. std::vector values; while (true) { // Scan for a non-whitespace character and check it. while (true) { if (ferror(in) || feof(in)) { fprintf(stderr, "Unexpected error or EOF in file '%s'\n", fileName.c_str()); return false; } int nextCharacter = getc(in); if (nextCharacter == EOF) // either EOF or read error { fprintf(stderr, "Unexpected error or EOF in file '%s'\n", fileName.c_str()); return false; } else if (nextCharacter == ')') { // We're done reading input. if (ferror(in)) { fprintf(stderr, "Unexpected error in file '%s'\n", fileName.c_str()); return false; } vector->resize(values.size()); for (size_t i = 0; i < values.size(); i++) { (*vector)[i] = values[i]; } return true; } else if (! isspace(nextCharacter)) { // The next character isn't ')'. Pretend we never read it, and go on reading data. ungetc(nextCharacter, in); break; } } if (ferror(in) || feof(in)) { fprintf(stderr, "Unexpected error or EOF in file '%s'\n", fileName.c_str()); return false; } // Ready to read the next element. double nextValue = 0; if (fscanf(in, " %lg", &nextValue) != 1) { fprintf(stderr, "Bad data for Eigen input in '%s'\n near text '%s'\n", fileName.c_str(), getRawLine(in).c_str()); return false; } values.push_back(nextValue); } } static bool readEigenVector(const std::string& fileName, FILE* in, const char* label, Eigen::VectorXd* vector) { Eigen::RowVectorXd rowVector; if (! readEigenRowVector(fileName, in, label, &rowVector)) { return false; } *vector = rowVector.transpose(); return true; } static bool readEigenMatrix(const std::string& fileName, FILE* in, const char* label, Eigen::MatrixXd* matrix) { // Read the label. { if (ferror(in) || feof(in)) { fprintf(stderr, "Unexpected error or EOF in file '%s'\n", fileName.c_str()); return false; } char readLabel[100]; if (fscanf(in, " %[^(](", readLabel) != 1) { fprintf(stderr, "Unable to read label for Eigen input in '%s'\n near text '%s'\n", fileName.c_str(), getRawLine(in).c_str()); return false; } if (std::string(label) + " " != std::string(readLabel)) { fprintf(stderr, "Bad label for Eigen input in '%s'\n near text '%s'\n", fileName.c_str(), getRawLine(in).c_str()); return false; } } // Read rows until ')' is found. bool firstRow = true; matrix->resize(0, 0); while (true) { // Scan for a non-whitespace character and check it. while (true) { if (ferror(in) || feof(in)) { fprintf(stderr, "Unexpected error or EOF in file '%s'\n", fileName.c_str()); return false; } int nextCharacter = getc(in); if (nextCharacter == EOF) // either EOF or read error { fprintf(stderr, "Unexpected error or EOF in file '%s'\n", fileName.c_str()); return false; } else if (nextCharacter == ')') { // We're done reading input. if (ferror(in)) { fprintf(stderr, "Unexpected error in file '%s'\n", fileName.c_str()); return false; } return true; } else if (! isspace(nextCharacter)) { // The next character isn't ')'. Pretend we never read it, and go on reading data. ungetc(nextCharacter, in); break; } } if (ferror(in) || feof(in)) { fprintf(stderr, "Unexpected error or EOF in file '%s'\n", fileName.c_str()); return false; } // Ready to read the next row. Eigen::RowVectorXd rowVector; if (! readEigenRowVector(fileName, in, "", &rowVector)) { return false; } if (firstRow) { *matrix = rowVector; firstRow = false; } else { ptrdiff_t numCols = matrix->cols(); ptrdiff_t newNumRows = matrix->rows() + 1; if (rowVector.cols() != numCols) { fprintf(stderr, "Inconsistent number of columns for Eigen matrix (%lld vs %lld)\n in file '%s'\n", static_cast(numCols), static_cast(rowVector.cols()), // NOLINT fileName.c_str()); return false; } matrix->conservativeResize(newNumRows, numCols); matrix->row(newNumRows-1) = rowVector; } } } static bool extractWordList(const std::string& fileName, const std::string& line, const char* label, std::vector* words) { std::string labelString(label); if (line.substr(0, labelString.length()) != labelString) { fprintf(stderr, "Unexpected input line: '%s'\n" " expected: '%s'...\n" " in file '%s'\n", line.c_str(), label, fileName.c_str()); return false; } words->clear(); size_t start = line.find_first_not_of(" \t", labelString.length()); while (start != std::string::npos) { size_t end = line.find_first_of(" \t", start+1); if (end == std::string::npos) { words->push_back(line.substr(start)); break; } words->push_back(line.substr(start, end - start)); start = line.find_first_not_of(" \t", end+1); } return true; } static bool readWordList(const std::string& fileName, FILE* in, const char* label, std::vector* words) { std::string line; if (! getLine(fileName, in, &line)) { return false; } return extractWordList(fileName, line, label, words); } static bool checkInputLine(const std::string& fileName, const std::string& expected, const std::string& line) { if (line != expected) { fprintf(stderr, "Unexpected input line: '%s'\n" " expected: '%s'\n" " in file '%s'\n", line.c_str(), expected.c_str(), fileName.c_str()); return false; } return true; } // actually write the data bool readMlcpTestDataAsText(const std::string& fileName, MlcpTestData* testData) { FILE* in = fopen(fileName.c_str(), "rt"); if (! in) { fprintf(stderr, "File '%s' could not be opened to read the current MLCP for GTest\n", fileName.c_str()); return false; } testData->description.clear(); std::string line; if (! getLine(fileName, in, &line)) { fprintf(stderr, "Failed to read first line from the file.\n"); return false; } while ((line.length() > 0) && (line[0] == '#')) { if (testData->description.length() > 0) { testData->description += "\n"; } if ((line.length() > 1) && (line[1] == ' ')) { testData->description += line.substr(2); } else { testData->description += line.substr(1); } if (! getLine(fileName, in, &line)) { fprintf(stderr, "Failed to read header comment block from the file.\n"); return false; } } // We have already read the next line, so we just need to parse it. if (! extractWordList(fileName, line, TEXT_LABEL_FLAGS_LIST, &(testData->flags))) { return false; } if (! readInt(fileName, in, TEXT_LABEL_NUM_DEGREES_OF_FREEDOM, &(testData->numDegreesOfFreedom))) { return false; } int numConstraints; if (! readInt(fileName, in, TEXT_LABEL_NUM_CONSTRAINTS, &numConstraints)) { return false; } int numAtomicConstraints; if (! readInt(fileName, in, TEXT_LABEL_NUM_ATOMIC_CONSTRAINTS, &numAtomicConstraints)) { return false; } std::vector constraintTypeNames; if (! readWordList(fileName, in, TEXT_LABEL_CONSTRAINT_TYPES_LIST, &constraintTypeNames)) { return false; } if (static_cast(constraintTypeNames.size()) != numConstraints) { fprintf(stderr, "Expected %d constraint types, saw %u\n in file '%s'\n", numConstraints, static_cast(constraintTypeNames.size()), fileName.c_str()); return false; } testData->problem.constraintTypes.resize(numConstraints); for (size_t i = 0; i < testData->problem.constraintTypes.size(); ++i) { SurgSim::Math::MlcpConstraintType currentType = SurgSim::Math::getMlcpConstraintTypeValue(constraintTypeNames[i]); if (currentType == SurgSim::Math::MLCP_INVALID_CONSTRAINT) { fprintf(stderr, "Unexpected constraint type string: '%s'\n in file '%s'\n", constraintTypeNames[i].c_str(), fileName.c_str()); return false; } testData->problem.constraintTypes[i] = currentType; } { Eigen::VectorXd b; Eigen::MatrixXd A; Eigen::VectorXd mu; Eigen::VectorXd expectedLambda; if (! readEigenVector(fileName, in, TEXT_LABEL_E_VIOLATIONS_VECTOR, &b)) { return false; } if (! readEigenMatrix(fileName, in, TEXT_LABEL_HCHt_MLCP_MATRIX, &A)) { return false; } if (! readEigenVector(fileName, in, TEXT_LABEL_MU_FRICTION_VECTOR, &mu)) { return false; } if (! readEigenVector(fileName, in, TEXT_LABEL_LAMBDA_VECTOR, &expectedLambda)) { return false; } testData->problem.b = b; testData->problem.A = A; testData->problem.mu = mu; testData->expectedLambda = expectedLambda; } if ((testData->problem.b.rows() != numAtomicConstraints) || (testData->problem.b.cols() != 1)) { fprintf(stderr, "Expected %dx%d vector E, saw %dx%d\n in file '%s'\n", numAtomicConstraints, 1, static_cast(testData->problem.b.rows()), static_cast(testData->problem.b.cols()), fileName.c_str()); return false; } if ((testData->problem.A.rows() != numAtomicConstraints) || (testData->problem.A.cols() != numAtomicConstraints)) { fprintf(stderr, "Expected %dx%d matrix A, saw %dx%d\n in file '%s'\n", numAtomicConstraints, numAtomicConstraints, static_cast(testData->problem.A.rows()), static_cast(testData->problem.A.cols()), fileName.c_str()); return false; } if ((testData->problem.mu.rows() != numAtomicConstraints) || (testData->problem.mu.cols() != 1)) { fprintf(stderr, "Expected %dx%d vector mu, saw %dx%d\n in file '%s'\n", numAtomicConstraints, 1, static_cast(testData->problem.mu.rows()), static_cast(testData->problem.mu.cols()), fileName.c_str()); return false; } if ((testData->expectedLambda.rows() != numAtomicConstraints) || (testData->expectedLambda.cols() != 1)) { fprintf(stderr, "Expected %dx%d vector lambda, saw %dx%d\n in file '%s'\n", numAtomicConstraints, 1, static_cast(testData->expectedLambda.rows()), static_cast(testData->expectedLambda.cols()), fileName.c_str()); return false; } if (! getLine(fileName, in, &line) || ! checkInputLine(fileName, TEXT_LABEL_END_OF_FILE, line)) { fprintf(stderr, "Expected %d constraint types, saw %u\n", numConstraints, static_cast(constraintTypeNames.size())); return false; } if (ferror(in)) { fprintf(stderr, "Unexpected error near the end of file '%s'\n", fileName.c_str()); return false; } if (fclose(in)) { fprintf(stderr, "Error closing file '%s' for reading.\n", fileName.c_str()); return false; } return true; } opensurgsim-0.7.0/SurgSim/Testing/MlcpIO/ReadText.h000066400000000000000000000016451277777236100221440ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_TESTING_MLCPIO_READTEXT_H #define SURGSIM_TESTING_MLCPIO_READTEXT_H #include #include "SurgSim/Testing/MlcpIO/MlcpTestData.h" bool readMlcpTestDataAsText(const std::string& fileName, MlcpTestData* testData); #endif // SURGSIM_TESTING_MLCPIO_READTEXT_H opensurgsim-0.7.0/SurgSim/Testing/MlcpIO/TextLabels.cpp000066400000000000000000000025551277777236100230270ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Testing/MlcpIO/TextLabels.h" const char* const TEXT_LABEL_FLAGS_LIST = "flags ="; const char* const TEXT_LABEL_NUM_DEGREES_OF_FREEDOM = "total degrees of freedom ="; const char* const TEXT_LABEL_NUM_CONSTRAINTS = "number of constraints ="; const char* const TEXT_LABEL_NUM_ATOMIC_CONSTRAINTS = "number of constraint DOFs (\"atomic constraints\") ="; const char* const TEXT_LABEL_CONSTRAINT_TYPES_LIST = "constraint types ="; const char* const TEXT_LABEL_E_VIOLATIONS_VECTOR = "E ="; const char* const TEXT_LABEL_HCHt_MLCP_MATRIX = "HCHt ="; const char* const TEXT_LABEL_MU_FRICTION_VECTOR = "friction ="; const char* const TEXT_LABEL_LAMBDA_VECTOR = "lambda ="; const char* const TEXT_LABEL_END_OF_FILE = "== END ==";opensurgsim-0.7.0/SurgSim/Testing/MlcpIO/TextLabels.h000066400000000000000000000024701277777236100224700ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_TESTING_MLCPIO_TEXTLABELS_H #define SURGSIM_TESTING_MLCPIO_TEXTLABELS_H extern const char* const TEXT_LABEL_FLAGS_LIST; extern const char* const TEXT_LABEL_NUM_DEGREES_OF_FREEDOM; extern const char* const TEXT_LABEL_NUM_CONSTRAINTS; extern const char* const TEXT_LABEL_NUM_ATOMIC_CONSTRAINTS; extern const char* const TEXT_LABEL_CONSTRAINT_TYPES_LIST; extern const char* const TEXT_LABEL_E_VIOLATIONS_VECTOR; extern const char* const TEXT_LABEL_HCHt_MLCP_MATRIX; extern const char* const TEXT_LABEL_MU_FRICTION_VECTOR; extern const char* const TEXT_LABEL_LAMBDA_VECTOR; extern const char* const TEXT_LABEL_END_OF_FILE; #endif // SURGSIM_TESTING_MLCPIO_TEXTLABELS_H opensurgsim-0.7.0/SurgSim/Testing/MlcpIO/WriteText.cpp000066400000000000000000000105001277777236100227040ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Testing/MlcpIO/WriteText.h" #include #include #include #include #include "SurgSim/Math/MlcpConstraintType.h" #include "SurgSim/Math/MlcpConstraintTypeName.h" #include "SurgSim/Testing/MlcpIO/MlcpTestData.h" #include "SurgSim/Testing/MlcpIO/TextLabels.h" // output helpers static void writeCommentBlock(FILE* out, const std::string& text) { const std::string prefix = "# "; const std::string suffix = ""; size_t start = 0; while (start < text.length()) { size_t next = text.find_first_of('\n', start); if (next == std::string::npos) { break; } fprintf(out, "%s%s%s\n", prefix.c_str(), text.substr(start, next - start).c_str(), suffix.c_str()); start = next+1; } if (start >= text.length()) { fprintf(out, "%s%s\n", prefix.c_str(), suffix.c_str()); } else { fprintf(out, "%s%s%s\n", prefix.c_str(), text.substr(start).c_str(), suffix.c_str()); } } static void writeEigenRowVector(FILE* out, const char* label, const Eigen::RowVectorXd& vector) { fprintf(out, "%s (", label); for (int i = 0; i < vector.cols(); i++) { fprintf(out, " %.20g", vector[i]); } fprintf(out, ")\n"); } static void writeEigenVector(FILE* out, const char* label, const Eigen::VectorXd& vector) { writeEigenRowVector(out, label, vector.transpose()); } static void writeEigenMatrix(FILE* out, const char* label, const Eigen::MatrixXd& matrix) { fprintf(out, "%s (\n", label); for (int i = 0; i < matrix.rows(); ++i) { writeEigenRowVector(out, " ", matrix.row(i)); } fprintf(out, ")\n"); } bool writeMlcpTestDataAsText(const std::string& fileName, const MlcpTestData& testData) { FILE* out = fopen(fileName.c_str(), "wt"); if (! out) { fprintf(stderr, "File '%s' could not be created to export the current MLCP for GTest\n", fileName.c_str()); return false; } size_t numConstraints = testData.problem.constraintTypes.size(); ptrdiff_t numAtomicConstraints = testData.problem.b.rows(); if (testData.problem.b.rows() != numAtomicConstraints || testData.problem.A.rows() != numAtomicConstraints || testData.problem.A.cols() != numAtomicConstraints || testData.expectedLambda.rows() != numAtomicConstraints) { fprintf(stderr, "Inconsistent dimensions in file '%s'!\n", fileName.c_str()); fclose(out); return false; } writeCommentBlock(out, testData.description); fprintf(out, "%s", TEXT_LABEL_FLAGS_LIST); for (auto it = testData.flags.begin(); it != testData.flags.end(); ++it) { fprintf(out, " %s", it->c_str()); } fprintf(out, "\n"); fprintf(out, "%s %d\n", TEXT_LABEL_NUM_DEGREES_OF_FREEDOM, testData.numDegreesOfFreedom); fprintf(out, "%s %llu\n", TEXT_LABEL_NUM_CONSTRAINTS, static_cast(numConstraints)); // NOLINT fprintf(out, "%s %lld\n", TEXT_LABEL_NUM_ATOMIC_CONSTRAINTS, static_cast(numAtomicConstraints)); // NOLINT fprintf(out, "%s", TEXT_LABEL_CONSTRAINT_TYPES_LIST); for (auto it = testData.problem.constraintTypes.begin(); it != testData.problem.constraintTypes.end(); ++it) { fprintf(out, " %s", getMlcpConstraintTypeName(*it).c_str()); } fprintf(out, "\n"); writeEigenVector(out, TEXT_LABEL_E_VIOLATIONS_VECTOR, testData.problem.b); writeEigenMatrix(out, TEXT_LABEL_HCHt_MLCP_MATRIX, testData.problem.A); writeEigenVector(out, TEXT_LABEL_MU_FRICTION_VECTOR, testData.problem.mu); writeEigenVector(out, TEXT_LABEL_LAMBDA_VECTOR, testData.expectedLambda); fprintf(out, "%s\n", TEXT_LABEL_END_OF_FILE); if (ferror(out)) { fprintf(stderr, "Unexpected error writing file '%s'\n", fileName.c_str()); return false; } if (fclose(out)) { fprintf(stderr, "Error closing file '%s' for writing.\n", fileName.c_str()); return false; } return true; } opensurgsim-0.7.0/SurgSim/Testing/MlcpIO/WriteText.h000066400000000000000000000016571277777236100223660ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_TESTING_MLCPIO_WRITETEXT_H #define SURGSIM_TESTING_MLCPIO_WRITETEXT_H #include #include "SurgSim/Testing/MlcpIO/MlcpTestData.h" bool writeMlcpTestDataAsText(const std::string& fileName, const MlcpTestData& testData); #endif // SURGSIM_TESTING_MLCPIO_WRITETEXT_H opensurgsim-0.7.0/SurgSim/Testing/MockInputComponent.cpp000066400000000000000000000020401277777236100234160ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013-2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Testing/MockInputComponent.h" #include "SurgSim/Input/InputConsumerInterface.h" namespace SurgSim { namespace Testing { MockInputComponent::MockInputComponent(const std::string& name) : SurgSim::Input::InputComponent(name) { } void MockInputComponent::setData(const SurgSim::DataStructures::DataGroup& data) { handleInput("fake device", data); } }; // Testing }; // SurgSim opensurgsim-0.7.0/SurgSim/Testing/MockInputComponent.h000066400000000000000000000027331277777236100230740ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_TESTING_MOCKINPUTCOMPONENT_H #define SURGSIM_TESTING_MOCKINPUTCOMPONENT_H #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/Input/InputComponent.h" namespace SurgSim { namespace Testing { /// A MockInputComponent allows Components to test connections with devices without using an /// instance of DeviceInterface (and then an InputManager to connect the device with the InputComponent, etc). class MockInputComponent : public SurgSim::Input::InputComponent { public: /// Constructor /// \param name The name. explicit MockInputComponent(const std::string& name); /// Set the data that this mock InputComponent will provide via getData. /// \param data The datagroup as if from a device. void setData(const SurgSim::DataStructures::DataGroup& data); }; }; }; #endif // SURGSIM_TESTING_MOCKINPUTCOMPONENT_H opensurgsim-0.7.0/SurgSim/Testing/MockInputOutput.cpp000066400000000000000000000027441277777236100227670ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Testing/MockInputOutput.h" using SurgSim::DataStructures::DataGroup; namespace SurgSim { namespace Testing { MockInputOutput::MockInputOutput() : m_numTimesInitializedInput(0), m_numTimesReceivedInput(0), m_numTimesRequestedOutput(0) { } bool MockInputOutput::requestOutput(const std::string& device, DataGroup* outputData) { ++m_numTimesRequestedOutput; bool result = false; if (m_output.hasValue()) { *outputData = m_output.getValue(); result = true; } return result; } void MockInputOutput::handleInput(const std::string& device, const DataGroup& inputData) { ++m_numTimesReceivedInput; m_lastReceivedInput = inputData; } void MockInputOutput::initializeInput(const std::string& device, const DataGroup& inputData) { ++m_numTimesInitializedInput; m_lastReceivedInput = inputData; } }; // Testing }; // SurgSim opensurgsim-0.7.0/SurgSim/Testing/MockInputOutput.h000066400000000000000000000033161277777236100224300ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_TESTING_MOCKINPUTOUTPUT_H #define SURGSIM_TESTING_MOCKINPUTOUTPUT_H #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/DataStructures/OptionalValue.h" #include "SurgSim/Input/InputConsumerInterface.h" #include "SurgSim/Input/OutputProducerInterface.h" namespace SurgSim { namespace Testing { struct MockInputOutput : public SurgSim::Input::InputConsumerInterface, public SurgSim::Input::OutputProducerInterface { public: MockInputOutput(); virtual void initializeInput(const std::string& device, const SurgSim::DataStructures::DataGroup& inputData); virtual void handleInput(const std::string& device, const SurgSim::DataStructures::DataGroup& inputData); virtual bool requestOutput(const std::string& device, SurgSim::DataStructures::DataGroup* outputData); int m_numTimesInitializedInput; int m_numTimesReceivedInput; int m_numTimesRequestedOutput; SurgSim::DataStructures::DataGroup m_lastReceivedInput; SurgSim::DataStructures::OptionalValue m_output; }; }; }; #endif // SURGSIM_TESTING_MOCKINPUTOUTPUT_H opensurgsim-0.7.0/SurgSim/Testing/MockPhysicsManager.h000066400000000000000000000032741277777236100230300ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_TESTING_MOCKPHYSICSMANAGER_H #define SURGSIM_TESTING_MOCKPHYSICSMANAGER_H #include "SurgSim/Physics/PhysicsManager.h" namespace SurgSim { namespace Testing { /// Testing class used to publicly expose PhysicsManager's protected member functions class MockPhysicsManager : public SurgSim::Physics::PhysicsManager { public: bool executeAdditions(const std::shared_ptr& component) override { return SurgSim::Physics::PhysicsManager::executeAdditions(component); } bool executeRemovals(const std::shared_ptr& component) override { return SurgSim::Physics::PhysicsManager::executeRemovals(component); } bool doInitialize() override { return SurgSim::Physics::PhysicsManager::doInitialize(); } bool doStartUp() override { return SurgSim::Physics::PhysicsManager::doStartUp(); } virtual bool doUpdate(double dt) { return SurgSim::Physics::PhysicsManager::doUpdate(dt); } }; } // namespace Physics } // namespace SurgSim #endif // SURGSIM_TESTING_MOCKPHYSICSMANAGER_H opensurgsim-0.7.0/SurgSim/Testing/SerializationMockComponent.cpp000066400000000000000000000036411277777236100251440ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Testing/SerializationMockComponent.h" SURGSIM_REGISTER(SurgSim::Framework::Component, SerializationMockComponent, SerializationMockComponent); SerializationMockComponent::SerializationMockComponent( const std::string& name, bool succeedInit, bool succeedWakeUp) : Component(name), succeedWithInit(succeedInit), succeedWithWakeUp(succeedWakeUp), didWakeUp(false), didInit(false) { SURGSIM_ADD_SERIALIZABLE_PROPERTY( SerializationMockComponent, bool, SucceedWithInit, getSucceedWithInit, setSucceedWithInit); SURGSIM_ADD_SERIALIZABLE_PROPERTY( SerializationMockComponent, bool, SucceedWithWakeUp, getSucceedWithWakeUp, setSucceedWithWakeUp); } SerializationMockComponent::~SerializationMockComponent() { } bool SerializationMockComponent::doInitialize() { didInit = true; return succeedWithInit; } bool SerializationMockComponent::doWakeUp() { didWakeUp = true; return succeedWithWakeUp; } bool SerializationMockComponent::getSucceedWithInit() const { return succeedWithInit; } void SerializationMockComponent::setSucceedWithInit(bool val) { succeedWithInit = val; } bool SerializationMockComponent::getSucceedWithWakeUp() const { return succeedWithWakeUp; } void SerializationMockComponent::setSucceedWithWakeUp(bool val) { succeedWithWakeUp = val; } opensurgsim-0.7.0/SurgSim/Testing/SerializationMockComponent.h000066400000000000000000000033151277777236100246070ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_TESTING_SERIALIZATIONMOCKCOMPONENT_H #define SURGSIM_TESTING_SERIALIZATIONMOCKCOMPONENT_H #include "SurgSim/Framework/Component.h" #include "SurgSim/Framework/ObjectFactory.h" SURGSIM_STATIC_REGISTRATION(SerializationMockComponent); /// This class is for testing the linker and checking if the definition stays in the /// executable even if there is not direct reference to it, DO NOT define a member /// of this class explicitly anywhere. class SerializationMockComponent : public SurgSim::Framework::Component { public: explicit SerializationMockComponent(const std::string& name, bool succeedInit = true, bool succeedWakeUp = true); virtual ~SerializationMockComponent(); SURGSIM_CLASSNAME(SerializationMockComponent); virtual bool doInitialize(); virtual bool doWakeUp(); bool getSucceedWithInit() const; void setSucceedWithInit(bool val); bool getSucceedWithWakeUp() const; void setSucceedWithWakeUp(bool val); bool succeedWithInit; bool succeedWithWakeUp; bool didWakeUp; bool didInit; }; #endif // SURGSIM_TESTING_SERIALIZATIONMOCKCOMPONENT_Hopensurgsim-0.7.0/SurgSim/Testing/TestCube.cpp000066400000000000000000000055011277777236100213450ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Testing/TestCube.h" namespace SurgSim { namespace Testing { namespace Cube { int numVertices = 24; double vertexData[] = { -0.5,-0.5,-0.5, -0.5,-0.5, 0.5, 0.5,-0.5, 0.5, 0.5,-0.5,-0.5, -0.5, 0.5,-0.5, -0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5,-0.5, -0.5,-0.5,-0.5, -0.5,-0.5, 0.5, 0.5,-0.5, 0.5, 0.5,-0.5,-0.5, -0.5, 0.5,-0.5, -0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5,-0.5, -0.5,-0.5,-0.5, -0.5,-0.5, 0.5, 0.5,-0.5, 0.5, 0.5,-0.5,-0.5, -0.5, 0.5,-0.5, -0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5,-0.5 }; double colorData[] = { 0.9,0.0,0.0,1.0, 0.9,0.0,0.0,1.0, 0.9,0.0,0.0,1.0, 0.9,0.0,0.0,1.0, 0.9,0.5,0.5,1.0, 0.9,0.5,0.5,1.0, 0.9,0.5,0.5,1.0, 0.9,0.5,0.5,1.0, 0.0,0.9,0.0,1.0, 0.0,0.9,0.0,1.0, 0.5,0.9,0.5,1.0, 0.5,0.9,0.5,1.0, 0.0,0.9,0.0,1.0, 0.0,0.9,0.0,1.0, 0.5,0.9,0.5,1.0, 0.5,0.9,0.5,1.0, 0.0,0.0,0.9,1.0, 0.5,0.5,0.9,1.0, 0.5,0.5,0.9,1.0, 0.0,0.0,0.9,1.0, 0.0,0.0,0.9,1.0, 0.5,0.5,0.9,1.0, 0.5,0.5,0.9,1.0, 0.0,0.0,0.9,1.0 }; double textureData[] = { 0.25,0.25, 0.25,0.50, 0.0, 0.50, 0.0, 0.25, 0.50,0.25, 0.50,0.50, 0.50,0.50, 0.50,0.25, 0.25,0.25, 0.25,0.50, 1.0, 0.50, 1.0, 0.25, 0.50,0.25, 0.50,0.50, 0.75,0.50, 0.75,0.25, 0.50,0.0 , 0.50,0.75, 0.75,0.75, 0.75,0.0, 0.50,0.25, 0.50,0.50, 0.75,0.50, 0.75,0.25 }; unsigned int numTriangles = 12; unsigned int triangleData[] = { 0, 3, 2, 0, 2, 1, 4, 6, 7, 4, 5, 6, 8, 9,13, 8,13,12, 10,15,14, 10,11,15, 16,20,23, 16,23,19, 17,18,22, 17,22,21 }; void makeCube(std::vector* vertices, std::vector* colors, std::vector* textures, std::vector* triangles) { vertices->resize(numVertices); colors->resize(numVertices); textures->resize(numVertices); double scale = 1.0; for (int i=0; iresize(numTriangles*3); std::copy(triangleData, triangleData+12*3,std::begin(*triangles)); } }; // Cube }; // Testing }; // SurgSim opensurgsim-0.7.0/SurgSim/Testing/TestCube.h000066400000000000000000000027611277777236100210170ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_TESTING_TESTCUBE_H #define SURGSIM_TESTING_TESTCUBE_H #include #include "SurgSim/Math/Vector.h" using SurgSim::Math::Vector2d; using SurgSim::Math::Vector3d; using SurgSim::Math::Vector4d; /// \file /// Data for a cube, vertices, color, textures and triangles /// This cube is for using as a mesh. OpenGl does not support per face attributes, therefore /// to implement sharp edges vertices are duplicated over different faces, for a cube all /// vertices need to exist as three copies #include namespace SurgSim { namespace Testing { namespace Cube { /// Fill our standard structures with the correct data types from the cube data void makeCube(std::vector* vertices, std::vector* colors, std::vector* textures, std::vector* triangles); }; // Cube }; // Testing }; // SurgSim #endifopensurgsim-0.7.0/SurgSim/Testing/TestingMain.cpp000066400000000000000000000021251277777236100220500ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "SurgSim/Framework/Logger.h" #include "SurgSim/Framework/LogOutput.h" int main(int argc, char** argv) { //Disable logging during tests std::shared_ptr loggerManager; loggerManager = SurgSim::Framework::Logger::getLoggerManager(); loggerManager->setDefaultOutput(std::make_shared()); testing::InitGoogleMock(&argc, argv); return RUN_ALL_TESTS(); } opensurgsim-0.7.0/SurgSim/Testing/Utilities.h000066400000000000000000000024541277777236100212530ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_TESTING_UTILITIES_H #define SURGSIM_TESTING_UTILITIES_H namespace SurgSim { namespace Testing { /// Predicate to use to test whether a container contains a certain element /// \tparam Container type, can usually be deduced /// \param container the container to be tested /// \param value the value to check for /// \return true when the container contains the given value /// \note for maps the value type is std::pair template bool doesContain(const Container& container, const typename Container::value_type& value) { return std::find(container.begin(), container.end(), value) != container.end(); } } } #endif opensurgsim-0.7.0/SurgSim/Testing/VisualTestCommon/000077500000000000000000000000001277777236100223765ustar00rootroot00000000000000opensurgsim-0.7.0/SurgSim/Testing/VisualTestCommon/CMakeLists.txt000066400000000000000000000025341277777236100251420ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. include_directories( "${GLUT_INCLUDE_DIR}" ) set(VISUAL_TEST_COMMON_SOURCES GlutRenderer.cpp MovingSquareForce.cpp MovingSquareGlutWindow.cpp ToolSquareTest.cpp ) set(VISUAL_TEST_COMMON_HEADERS GlutRenderer.h MovingSquareForce.h MovingSquareGlutWindow.h ToolSquareTest.h ) set(LIBS SurgSimDataStructures SurgSimFramework SurgSimInput SurgSimMath ${Boost_LIBRARIES} ${GLUT_LIBRARIES} ${OPENGL_LIBRARIES} ) # The headers etc. for this do not need to be shipped, so do NOT use # surgsim_add_library here. add_library(VisualTestCommon ${VISUAL_TEST_COMMON_SOURCES} ${VISUAL_TEST_COMMON_HEADERS}) target_link_libraries(VisualTestCommon ${LIBS}) set_target_properties(VisualTestCommon PROPERTIES FOLDER "Testing") opensurgsim-0.7.0/SurgSim/Testing/VisualTestCommon/GlutRenderer.cpp000066400000000000000000000171131277777236100255070ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Testing/VisualTestCommon/GlutRenderer.h" #include using SurgSim::Math::Vector3d; using SurgSim::Math::RigidTransform3d; int GlutRenderer::m_width = 1024; int GlutRenderer::m_height = 768; std::shared_ptr GlutRenderer::m_camera = nullptr; std::vector< std::shared_ptr > GlutRenderer::m_objects = std::vector< std::shared_ptr >(); GlutRenderObject::~GlutRenderObject() { } void GlutSquare::draw() { glEnable(GL_LIGHTING); glPushMatrix(); glTranslated(pose.translation().x(), pose.translation().y(), pose.translation().z()); Eigen::AngleAxisd angleAxis = Eigen::AngleAxisd(pose.rotation()); glRotated(angleAxis.angle() * 180.0 / M_PI, angleAxis.axis().x(), angleAxis.axis().y(), angleAxis.axis().z()); Vector3d squarePoints[4]; squarePoints[0] = - (halfSize * planeDirectionX) + (halfSize * planeDirectionY); squarePoints[1] = (halfSize * planeDirectionX) + (halfSize * planeDirectionY); squarePoints[2] = (halfSize * planeDirectionX) - (halfSize * planeDirectionY); squarePoints[3] = - (halfSize * planeDirectionX) - (halfSize * planeDirectionY); Vector3d normal = (squarePoints[1] - squarePoints[0]).cross(squarePoints[2] - squarePoints[0]); normal.normalize(); glColor3d(color.x(), color.y(), color.z()); glBegin(GL_QUADS); // Front side glNormal3d(normal.x(), normal.y(), normal.z()); for (int i = 0; i < 4; ++i) { glVertex3d(squarePoints[i].x(), squarePoints[i].y(), squarePoints[i].z()); } // Back side glNormal3d(- normal.x(), - normal.y(), - normal.z()); for (int i = 0; i < 4; ++i) { glVertex3d(squarePoints[3 - i].x(), squarePoints[3 - i].y(), squarePoints[3 - i].z()); } glEnd(); glPopMatrix(); } void GlutAxes::draw() { glDisable(GL_LIGHTING); glPushMatrix(); glTranslated(pose.translation().x(), pose.translation().y(), pose.translation().z()); Eigen::AngleAxisd angleAxis = Eigen::AngleAxisd(pose.rotation()); glRotated(angleAxis.angle() * 180.0 / M_PI, angleAxis.axis().x(), angleAxis.axis().y(), angleAxis.axis().z()); Vector3d axesPoints[4]; axesPoints[0] = Vector3d(0.0, 0.0, 0.0); axesPoints[1] = (length * Vector3d(1.0, 0.0, 0.0)); axesPoints[2] = (length * Vector3d(0.0, 1.0, 0.0)); axesPoints[3] = (length * Vector3d(0.0, 0.0, 1.0)); glLineWidth(width); glBegin(GL_LINES); glColor3d(1.0, 0.0, 0.0); glVertex3d(axesPoints[0].x(), axesPoints[0].y(), axesPoints[0].z()); glVertex3d(axesPoints[1].x(), axesPoints[1].y(), axesPoints[1].z()); glColor3d(0.0, 1.0, 0.0); glVertex3d(axesPoints[0].x(), axesPoints[0].y(), axesPoints[0].z()); glVertex3d(axesPoints[2].x(), axesPoints[2].y(), axesPoints[2].z()); glColor3d(0.0, 0.0, 1.0); glVertex3d(axesPoints[0].x(), axesPoints[0].y(), axesPoints[0].z()); glVertex3d(axesPoints[3].x(), axesPoints[3].y(), axesPoints[3].z()); glEnd(); glPopMatrix(); } void GlutSphere::draw() { glEnable(GL_LIGHTING); glPushMatrix(); glTranslated(pose.translation().x(), pose.translation().y(), pose.translation().z()); Eigen::AngleAxisd angleAxis = Eigen::AngleAxisd(pose.rotation()); glRotated(angleAxis.angle() * 180.0 / M_PI, angleAxis.axis().x(), angleAxis.axis().y(), angleAxis.axis().z()); glColor3d(color.x(), color.y(), color.z()); gluQuadricOrientation(quadratic, GLU_OUTSIDE); gluSphere(quadratic, radius, 32, 32); glPopMatrix(); } void GlutImage::draw() { if (m_firstRun) { glGenTextures(1, &m_texture); m_firstRun = false; } glDisable(GL_LIGHTING); glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); glEnable(GL_TEXTURE_2D); glEnable(GL_BLEND); glBindTexture(GL_TEXTURE_2D, m_texture); ImageType imageData; if(image.tryTakeChanged(&imageData)) { float maxPixel = imageData.getAsVector().maxCoeff(); if (maxPixel > 1.0) { float scaleFactor = 1.0 / maxPixel; glPixelTransferf(GL_RED_SCALE, scaleFactor); glPixelTransferf(GL_BLUE_SCALE, scaleFactor); glPixelTransferf(GL_GREEN_SCALE, scaleFactor); } else { glPixelTransferf(GL_RED_SCALE, 1.0); glPixelTransferf(GL_BLUE_SCALE, 1.0); glPixelTransferf(GL_GREEN_SCALE, 1.0); } switch (imageData.getNumChannels()) { case 1: glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, static_cast(imageData.getWidth()), static_cast(imageData.getHeight()), 0, GL_LUMINANCE, GL_FLOAT, imageData.getData()); break; case 3: glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, static_cast(imageData.getWidth()), static_cast(imageData.getHeight()), 0, GL_RGB, GL_FLOAT, imageData.getData()); break; } glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); } glColor3d(1, 1, 1); glBegin(GL_QUADS); glTexCoord2f(1, 1); glVertex2f(m_bounds.min()(0), m_bounds.min()(1)); glTexCoord2f(0, 1); glVertex2f(m_bounds.max()(0), m_bounds.min()(1)); glTexCoord2f(0, 0); glVertex2f(m_bounds.max()(0), m_bounds.max()(1)); glTexCoord2f(1, 0); glVertex2f(m_bounds.min()(0), m_bounds.max()(1)); glEnd(); glDisable(GL_TEXTURE_2D); glDisable(GL_BLEND); glPopMatrix(); glMatrixMode(GL_PROJECTION); glPopMatrix(); glMatrixMode(GL_MODELVIEW); } void GlutGroup::draw() { glPushMatrix(); glTranslated(pose.translation().x(), pose.translation().y(), pose.translation().z()); Eigen::AngleAxisd angleAxis = Eigen::AngleAxisd(pose.rotation()); glRotated(angleAxis.angle() * 180.0 / M_PI, angleAxis.axis().x(), angleAxis.axis().y(), angleAxis.axis().z()); for (auto it = children.cbegin(); it != children.cend(); ++it) { (*it)->draw(); } glPopMatrix(); } void GlutRenderer::initialize() { char* argv[1]; int argc = 1; std::string title = "GlutWindow"; std::vector charString(title.size() + 1); std::copy(title.begin(), title.end(), charString.begin()); argv[0] = &charString[0]; glutInit(&argc, argv); glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA); glutInitWindowPosition(100, 100); glutInitWindowSize(m_width, m_height); glutCreateWindow("Simple GLUT display"); glEnable(GL_COLOR_MATERIAL); glEnable(GL_CULL_FACE); glCullFace(GL_BACK); glEnable(GL_DEPTH_TEST); glShadeModel(GL_SMOOTH); glClearColor(0.1f, 0.1f, 0.1f, 1.0f); glutDisplayFunc(display); glutReshapeFunc(reshape); } void GlutRenderer::display() { glViewport(0, 0, static_cast(m_width), static_cast(m_height)); glMatrixMode(GL_PROJECTION); glLoadIdentity(); if (m_camera) { gluPerspective(m_camera->fovY, static_cast(m_width) / m_height, m_camera->zNear, m_camera->zFar); } glMatrixMode(GL_MODELVIEW); glLoadIdentity(); if (m_camera) { gluLookAt(m_camera->eye.x(), m_camera->eye.y(), m_camera->eye.z(), m_camera->center.x(), m_camera->center.y(), m_camera->center.z(), m_camera->up.x(), m_camera->up.y(), m_camera->up.z()); } glEnable(GL_LIGHT0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); drawObjects(); glutSwapBuffers(); glutPostRedisplay(); } opensurgsim-0.7.0/SurgSim/Testing/VisualTestCommon/GlutRenderer.h000066400000000000000000000167751277777236100251710ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_TESTING_VISUALTESTCOMMON_GLUTRENDERER_H #define SURGSIM_TESTING_VISUALTESTCOMMON_GLUTRENDERER_H #include #include #include #ifdef __APPLE__ #include #else #define GLUT_NO_LIB_PRAGMA 1 #include #endif #include "SurgSim/DataStructures/Image.h" #include "SurgSim/Framework/LockedContainer.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Math/RigidTransform.h" /// Abstract definition of an object that can render itself with Glut. struct GlutRenderObject { /// Pose (rotation and translation) of the object. SurgSim::Math::RigidTransform3d pose; /// Constructor initializes pose as identity (no rotation or translation) GlutRenderObject() : pose(SurgSim::Math::RigidTransform3d::Identity()) { } virtual ~GlutRenderObject(); /// Pure virtual draw method for subclasses to define how to draw themselves with Glut. virtual void draw() = 0; }; /// Square with center at local origin. struct GlutSquare : public GlutRenderObject { /// The unit direction along one of the pairs edges of the square. SurgSim::Math::Vector3d planeDirectionX; /// The unit direction along the other pair of edges of the square. SurgSim::Math::Vector3d planeDirectionY; /// One half of the edge length of the square, in meters. double halfSize; /// Color of the square. SurgSim::Math::Vector3d color; /// Constructor /// \param halfSize One half of the edge length of the square, in meters. /// \param color Color of the square. /// \param planeDirectionX The unit direction along one of the pairs edges of the square, default is X-axis. /// \param planeDirectionY The unit direction along the other pair of edges of the square, default is Y-axis. GlutSquare(double halfSize, const SurgSim::Math::Vector3d& color, const SurgSim::Math::Vector3d& planeDirectionX = SurgSim::Math::Vector3d(1.0, 0.0, 0.0), const SurgSim::Math::Vector3d& planeDirectionY = SurgSim::Math::Vector3d(0.0, 1.0, 0.0)) : GlutRenderObject(), planeDirectionX(planeDirectionX), planeDirectionY(planeDirectionY), halfSize(halfSize), color(color) { } /// Draws the square with Glut. virtual void draw(); }; /// Axes with center at local origin, red axis along the local X-axis, green axis along the local Y-axis, and blue axis /// along the local Z-axis. struct GlutAxes : GlutRenderObject { /// Length of each axis, in meters. double length; /// Width of each axis, in pixels. float width; /// Constructor /// \param length Length of each axis, in meters. /// \param width Width of each axis, in pixels. GlutAxes(double length, float width) : GlutRenderObject(), length(length), width(width) { } /// Draws the axes with Glut. virtual void draw(); }; /// Sphere with center at local origin. struct GlutSphere : GlutRenderObject { /// Radius of the sphere, in meters. double radius; /// Color of the sphere. SurgSim::Math::Vector3d color; /// Constructor /// \param radius Radius of the sphere, in meters. /// \param color Color of the sphere. GlutSphere(double radius, const SurgSim::Math::Vector3d& color) : radius(radius), color(color), quadratic(gluNewQuadric()) { } /// Draws the sphere with Glut. virtual void draw(); private: /// GLU quadric object for the quadric operations required to build the sphere. GLUquadric* quadratic; }; /// An Image drawn to the screen struct GlutImage : GlutRenderObject { typedef SurgSim::DataStructures::Image ImageType; /// The image to draw SurgSim::Framework::LockedContainer image; /// Constuctor /// \param bounds The bounds, in window coordinates ([-1..1], [-1..1]), to draw the image. explicit GlutImage(const Eigen::AlignedBox& bounds) : m_bounds(bounds), m_firstRun(true) { } /// Draws the image with Glut virtual void draw(); private: /// Window coordinates to draw the image Eigen::AlignedBox m_bounds; /// Texture used for holding the image unsigned int m_texture; /// Is this the fist run of draw bool m_firstRun; }; /// Group of objects which provides a transform hierarchy. struct GlutGroup : public GlutRenderObject { /// Children of this group. std::vector< std::shared_ptr > children; /// Constructor. The group is initialized with no children. GlutGroup() : GlutRenderObject() { } /// Draws the group with Glut and iterates through its children to draw them. virtual void draw(); }; /// Camera which controls the view of the scene. struct GlutCamera { /// Eye position. SurgSim::Math::Vector3d eye; /// Center (look at) position. SurgSim::Math::Vector3d center; /// Up direction. SurgSim::Math::Vector3d up; /// Field of view angle (in degrees) in the vertical direction. double fovY; /// Near clipping plane distance from camera, in meters. double zNear; /// Far clipping plane distance from camera, in meters. double zFar; /// Constructor /// \param eye_ Eye position. /// \param center_ Center (look at) position. /// \param up_ Up direction. /// \param fovY_ Field of view angle (in degrees) in the vertical direction. /// \param zNear_ Near clipping plane distance from camera, in meters. /// \param zFar_ Far clipping plane distance from camera, in meters. GlutCamera(const SurgSim::Math::Vector3d& eye_, const SurgSim::Math::Vector3d& center_, const SurgSim::Math::Vector3d& up_, const double fovY_, double zNear_, double zFar_) : eye(eye_), center(center_), up(up_), fovY(fovY_), zNear(zNear_), zFar(zFar_) { } }; /// Simple static class renderer built on Glut. class GlutRenderer { public: /// Initializes and runs the Glut main loop. This function will block until the Glut graphics window is closed. static void run() { initialize(); glutMainLoop(); } /// Sets the camera used to control the view of the scene. /// \param camera View camera. static void setCamera(std::shared_ptr camera) { m_camera = camera; } /// Adds an object to the scene. /// \param object Scene object. static void addObject(std::shared_ptr object) { m_objects.push_back(object); } private: /// Width of the window. static int m_width; /// Height of the window. static int m_height; /// Camera which controls the view of the scene. static std::shared_ptr m_camera; /// Objects in the scene. static std::vector< std::shared_ptr > m_objects; /// Initializes the Glut window. static void initialize(); /// Glut reshape function which handles the resizing of the window. static void reshape(GLint width, GLint height) { m_width = width; m_height = height; glViewport(0, 0, m_width, m_height); } /// Glut display function which handles the drawing of the scene. static void display(); /// Iterates through the scene objects to draw them. static void drawObjects() { for (auto it = m_objects.cbegin(); it != m_objects.cend(); ++it) { (*it)->draw(); } } }; #endif // SURGSIM_TESTING_VISUALTESTCOMMON_GLUTRENDERER_H opensurgsim-0.7.0/SurgSim/Testing/VisualTestCommon/MovingSquareForce.cpp000066400000000000000000000105701277777236100265040ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Testing/VisualTestCommon/MovingSquareForce.h" #include "SurgSim/Math/Vector.h" #include "SurgSim/Math/Matrix.h" #include "SurgSim/Math/Quaternion.h" #include "SurgSim/Math/RigidTransform.h" #include "SurgSim/Framework/Assert.h" #include "SurgSim/DataStructures/DataGroupBuilder.h" using SurgSim::DataStructures::DataGroup; using SurgSim::DataStructures::DataGroupBuilder; using SurgSim::Math::Vector3d; using SurgSim::Math::RigidTransform3d; MovingSquareForce::SquarePoseVectors::SquarePoseVectors() : normal(0, -1, 0), edgeDirectionX(1, 0, 0), edgeDirectionY(0, 0, 1), center(0, 0, 0) { } MovingSquareForce::MovingSquareForce(const std::string& toolDeviceName, const std::string& squareDeviceName) : m_toolDeviceName(toolDeviceName), m_squareDeviceName(squareDeviceName), m_squareHalfSize(0.050), m_surfaceStiffness(250.0), m_forceLimit(5.0), m_squareNormalDirection(+1), m_tipPoint(0, 0, 0) { DataGroupBuilder builder; builder.addVector(SurgSim::DataStructures::Names::FORCE); builder.addVector(SurgSim::DataStructures::Names::TORQUE); m_outputData = std::move(builder.createData()); m_outputData.vectors().set(SurgSim::DataStructures::Names::FORCE, Vector3d(0, 0, 0)); m_outputData.vectors().set(SurgSim::DataStructures::Names::TORQUE, Vector3d(0, 0, 0)); } void MovingSquareForce::initializeInput(const std::string& device, const DataGroup& inputData) { } void MovingSquareForce::handleInput(const std::string& device, const DataGroup& inputData) { if (device == m_toolDeviceName) { updateTool(inputData); } else if (device == m_squareDeviceName) { updateSquare(inputData); } else { SURGSIM_FAILURE() << "Unknown device name '" << device << "'"; } } void MovingSquareForce::updateTool(const DataGroup& inputData) { m_outputData.resetAll(); RigidTransform3d devicePose; if (! inputData.poses().get(SurgSim::DataStructures::Names::POSE, &devicePose)) { m_outputData.vectors().set(SurgSim::DataStructures::Names::FORCE, Vector3d(0, 0, 0)); m_outputData.vectors().set(SurgSim::DataStructures::Names::TORQUE, Vector3d(0, 0, 0)); return; } Vector3d tipPosition = devicePose * m_tipPoint; m_outputData.vectors().set(SurgSim::DataStructures::Names::FORCE, computeForce(tipPosition)); m_outputData.vectors().set(SurgSim::DataStructures::Names::TORQUE, Vector3d(0, 0, 0)); } void MovingSquareForce::updateSquare(const DataGroup& inputData) { RigidTransform3d devicePose; if (! inputData.poses().get(SurgSim::DataStructures::Names::POSE, &devicePose)) { return; } SquarePoseVectors square; square.normal = devicePose.linear() * Vector3d(0, -1, 0); square.edgeDirectionX = devicePose.linear() * Vector3d(1, 0, 0); square.edgeDirectionY = devicePose.linear() * Vector3d(0, 0, 1); square.center = devicePose * Vector3d(0, 0, 0); // Push into thread-safe storage so the other device can safely access it m_square.set(square); } bool MovingSquareForce::requestOutput(const std::string& device, DataGroup* outputData) { *outputData = m_outputData; return true; } Vector3d MovingSquareForce::computeForce(const Vector3d& position) { Vector3d force(0, 0, 0); SquarePoseVectors square; m_square.get(&square); Vector3d offset = position - square.center; double orthogonalDistance = offset.dot(square.normal); if ((orthogonalDistance * m_squareNormalDirection) > 0) { double planeDistanceX = offset.dot(square.edgeDirectionX); double planeDistanceY = offset.dot(square.edgeDirectionY); bool insideSquare = (fabs(planeDistanceX) < m_squareHalfSize) && (fabs(planeDistanceY) < m_squareHalfSize); force = -m_surfaceStiffness * orthogonalDistance * square.normal; if ((force.norm() > m_forceLimit) || ! insideSquare) { force.setZero(); m_squareNormalDirection = -m_squareNormalDirection; } } return force; } opensurgsim-0.7.0/SurgSim/Testing/VisualTestCommon/MovingSquareForce.h000066400000000000000000000100771277777236100261530ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_TESTING_VISUALTESTCOMMON_MOVINGSQUAREFORCE_H #define SURGSIM_TESTING_VISUALTESTCOMMON_MOVINGSQUAREFORCE_H #include #include "SurgSim/Input/InputConsumerInterface.h" #include "SurgSim/Input/OutputProducerInterface.h" #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/Framework/LockedContainer.h" /// A simple listener to calculate collision force against a square area for the example application. /// Includes support for the square being moved by a second tool. /// \sa SurgSim::Input::InputConsumerInterface, SurgSim::Input::OutputProducerInterface class MovingSquareForce : public SurgSim::Input::InputConsumerInterface, public SurgSim::Input::OutputProducerInterface { public: /// Constructor. MovingSquareForce(const std::string& toolDeviceName, const std::string& squareDeviceName); void initializeInput(const std::string& device, const SurgSim::DataStructures::DataGroup& inputData) override; void handleInput(const std::string& device, const SurgSim::DataStructures::DataGroup& inputData) override; bool requestOutput(const std::string& device, SurgSim::DataStructures::DataGroup* outputData) override; protected: /// Updates the state of the tool as described by toolInputData. /// \param toolInputData The state of the device controlling the tool. void updateTool(const SurgSim::DataStructures::DataGroup& toolInputData); /// Updates the state of the square as described by squareInputData. /// \param squareInputData The state of the device controlling the colliding square. void updateSquare(const SurgSim::DataStructures::DataGroup& squareInputData); /// Calculates the force as a function of device tip position. /// The calculation is very simple, for a simple demo of the device input/output functionality. /// /// \param position The device tip position. /// \return The computed force. SurgSim::Math::Vector3d computeForce(const SurgSim::Math::Vector3d& position); private: /// State defined by the pose of the square. struct SquarePoseVectors { /// Constructor. SquarePoseVectors(); /// The unit normal vector of the square. SurgSim::Math::Vector3d normal; /// The unit direction along one of the pairs edges of the square. SurgSim::Math::Vector3d edgeDirectionX; /// The unit direction along the other pair of edges of the square. SurgSim::Math::Vector3d edgeDirectionY; /// The location of the center of the square in world coordinates. SurgSim::Math::Vector3d center; }; /// Name of the device used as the tool. const std::string m_toolDeviceName; /// Name of the device used to move the square. const std::string m_squareDeviceName; /// Internally stored output data (force and torque). SurgSim::DataStructures::DataGroup m_outputData; /// One half of the edge length of the square we're colliding against, in meters. double m_squareHalfSize; /// The surface stiffness, in newtons per meter. double m_surfaceStiffness; /// The maximum force before the application allows the tool to pop through. double m_forceLimit; /// Points and directions defined by the pose of the square. SurgSim::Framework::LockedContainer m_square; /// The current sign of the direction of the normal vector of the square. double m_squareNormalDirection; /// The location of the "tip" (i.e. interacting point) of the tool, in the local frame relative to the tool pose. SurgSim::Math::Vector3d m_tipPoint; }; #endif // SURGSIM_TESTING_VISUALTESTCOMMON_MOVINGSQUAREFORCE_H opensurgsim-0.7.0/SurgSim/Testing/VisualTestCommon/MovingSquareGlutWindow.cpp000066400000000000000000000101501277777236100275430ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "SurgSim/Testing/VisualTestCommon/MovingSquareGlutWindow.h" using SurgSim::DataStructures::DataGroup; using SurgSim::Math::Vector3d; using SurgSim::Math::RigidTransform3d; MovingSquareGlutWindow::MovingSquareGlutWindow(const std::string& toolDeviceName, const std::string& squareDeviceName) : m_toolDeviceName(toolDeviceName), m_squareDeviceName(squareDeviceName), m_tool(std::make_shared()) { m_camera = std::make_shared(Vector3d(-0.15, 0.15, 0.3), Vector3d(0.0, 0.0, 0.0), Vector3d(0.0, 1.0, 0.0), 45.0, 0.001, 1.0); GlutRenderer::setCamera(m_camera); m_square = std::make_shared(0.050, Vector3d(1.0, 1.0, 1.0), Vector3d(1.0, 0.0, 0.0), Vector3d(0.0, 0.0, 1.0)); GlutRenderer::addObject(m_square); m_toolSphere = std::make_shared(0.010, Vector3d(1.0, 1.0, 1.0)); std::shared_ptr toolAxes = std::make_shared(0.025, 5.0f); m_tool->children.push_back(m_toolSphere); m_tool->children.push_back(toolAxes); GlutRenderer::addObject(m_tool); m_renderThread = boost::thread(boost::ref(GlutRenderer::run)); } MovingSquareGlutWindow::~MovingSquareGlutWindow() { if (m_renderThread.joinable()) { m_renderThread.join(); } } void MovingSquareGlutWindow::initializeInput(const std::string& device, const DataGroup& inputData) { } void MovingSquareGlutWindow::handleInput(const std::string& device, const DataGroup& inputData) { if (device == m_toolDeviceName) { updateTool(inputData); } else if (device == m_squareDeviceName) { updateSquare(inputData); } else { SURGSIM_FAILURE() << "Unknown device name '" << device << "'"; } } void MovingSquareGlutWindow::updateTool(const DataGroup& inputData) { RigidTransform3d devicePose; bool button1, button2, button3, button4, isHomed; if (! inputData.poses().get(SurgSim::DataStructures::Names::POSE, &devicePose)) { return; // not much we can do without a pose... } if (! inputData.booleans().get(SurgSim::DataStructures::Names::BUTTON_1, &button1)) { button1 = false; } if (! inputData.booleans().get(SurgSim::DataStructures::Names::BUTTON_2, &button2)) { button2 = false; } if (! inputData.booleans().get(SurgSim::DataStructures::Names::BUTTON_3, &button3)) { button3 = false; } if (! inputData.booleans().get(SurgSim::DataStructures::Names::BUTTON_4, &button4)) { button4 = false; } if (! inputData.booleans().get(SurgSim::DataStructures::Names::IS_HOMED, &isHomed)) { isHomed = true; // if device has no homing indication, never show as un-homed } m_tool->pose = devicePose; // We generate the color as a linear combination from various states and buttons. We start from plain white. Vector3d unscaledColor(1.0, 1.0, 1.0); double colorScale = 1; if (! isHomed) { unscaledColor += Vector3d(1.0, 0.0, 0.0); // if un-homed, show the device as red colorScale += 1; } if (button1) { unscaledColor += 1.5 * Vector3d(0.0, 1.0, 1.0); colorScale += 1.5; } if (button2) { unscaledColor += 1.5 * Vector3d(1.0, 0.0, 1.0); colorScale += 1.5; } if (button3) { unscaledColor += 1.5 * Vector3d(1.0, 1.0, 0.0); colorScale += 1.5; } if (button4) { unscaledColor += 1.5 * Vector3d(0.7, 0.7, 0.7); colorScale += 1.5; } m_toolSphere->color = unscaledColor * (1.0 / colorScale); } void MovingSquareGlutWindow::updateSquare(const DataGroup& inputData) { RigidTransform3d devicePose; if (! inputData.poses().get(SurgSim::DataStructures::Names::POSE, &devicePose)) { return; } m_square->pose = devicePose; } opensurgsim-0.7.0/SurgSim/Testing/VisualTestCommon/MovingSquareGlutWindow.h000066400000000000000000000054161277777236100272210ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_TESTING_VISUALTESTCOMMON_MOVINGSQUAREGLUTWINDOW_H #define SURGSIM_TESTING_VISUALTESTCOMMON_MOVINGSQUAREGLUTWINDOW_H #include #include "SurgSim/Input/InputConsumerInterface.h" #include "SurgSim/Input/OutputProducerInterface.h" #include "SurgSim/DataStructures/DataGroup.h" #include "SurgSim/Testing/VisualTestCommon/GlutRenderer.h" /// A simple listener to display the simple scene composed of a square and tool for the example application. /// Includes support for the square being moved by a second tool. /// \sa SurgSim::Input::InputConsumerInterface class MovingSquareGlutWindow : public SurgSim::Input::InputConsumerInterface { public: /// Constructor. MovingSquareGlutWindow(const std::string& toolDeviceName, const std::string& squareDeviceName); /// Destructor. ~MovingSquareGlutWindow(); void initializeInput(const std::string& device, const SurgSim::DataStructures::DataGroup& inputData) override; void handleInput(const std::string& device, const SurgSim::DataStructures::DataGroup& inputData) override; protected: private: /// Render thread which runs the Glut main loop. boost::thread m_renderThread; /// Name of the tool device. const std::string m_toolDeviceName; /// Name of the square device. const std::string m_squareDeviceName; /// Camera which controls the view of the scene. std::shared_ptr m_camera; /// Tool composed of a sphere and axes that are moved with device input. std::shared_ptr m_tool; /// Sphere of the tool. Pointer is kept here so that the color can easily be changed based on the device's button /// state. std::shared_ptr m_toolSphere; /// Square that is moved with device input. std::shared_ptr m_square; /// Updates the tool based on the device input. /// \param inputData Input data from the device. void updateTool(const SurgSim::DataStructures::DataGroup& inputData); /// Updates the square based on the device input. /// \param inputData Input data from the device. void updateSquare(const SurgSim::DataStructures::DataGroup& inputData); }; #endif // SURGSIM_TESTING_VISUALTESTCOMMON_MOVINGSQUAREGLUTWINDOW_H opensurgsim-0.7.0/SurgSim/Testing/VisualTestCommon/ToolSquareTest.cpp000066400000000000000000000061431277777236100260440ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #ifdef __APPLE__ #include #else #define GLUT_NO_LIB_PRAGMA 1 #include #endif #include "SurgSim/Input/DeviceInterface.h" #include "SurgSim/Framework/Assert.h" using SurgSim::Input::DeviceInterface; #include "SurgSim/Testing/VisualTestCommon/MovingSquareForce.h" #include "SurgSim/Testing/VisualTestCommon/MovingSquareGlutWindow.h" void runToolSquareTest(std::shared_ptr toolDevice, std::shared_ptr squareDevice, const char* testDescriptionMessage) { SURGSIM_ASSERT(toolDevice && squareDevice); if (! toolDevice->initialize()) { std::cout << std::endl << "Could not initialize device named '" << toolDevice->getName() << "' for the tool." << std::endl << "--- Press Enter to quit the application! ---" << std::endl; getc(stdin); return; } if (! squareDevice->initialize()) { std::cout << std::endl << "Could not initialize device named '" << squareDevice->getName() << "' for the square." << std::endl << "--- Press Enter to quit the application! ---" << std::endl; getc(stdin); return; } std::shared_ptr squareForce = std::make_shared(toolDevice->getName(), squareDevice->getName()); toolDevice->addInputConsumer(squareForce); toolDevice->setOutputProducer(squareForce); squareDevice->addInputConsumer(squareForce); // NB: the code does not currently support exerting the reaction force on the square. std::shared_ptr squareGlutWindow = std::make_shared(toolDevice->getName(), squareDevice->getName()); toolDevice->addInputConsumer(squareGlutWindow); squareDevice->addInputConsumer(squareGlutWindow); std::cout << std::endl << "**********************************************************************" << std::endl << testDescriptionMessage << std::endl << std::endl << "When done, press Enter to quit the application." << std::endl << "**********************************************************************" << std::endl; // Wait for a key; the display, force generation, etc. all happen in separate threads. getc(stdin); toolDevice->removeInputConsumer(squareForce); toolDevice->removeOutputProducer(squareForce); squareDevice->removeInputConsumer(squareForce); toolDevice->removeInputConsumer(squareGlutWindow); squareDevice->removeInputConsumer(squareGlutWindow); // Right now you can't just tear down the MovingSquareGlutWindow, so we exit with prejudice instead. exit(0); } opensurgsim-0.7.0/SurgSim/Testing/VisualTestCommon/ToolSquareTest.h000066400000000000000000000031761277777236100255140ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2013, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SURGSIM_TESTING_VISUALTESTCOMMON_TOOLSQUARETEST_H #define SURGSIM_TESTING_VISUALTESTCOMMON_TOOLSQUARETEST_H #include namespace SurgSim { namespace Input { class DeviceInterface; }; }; /// Creates a GLUT window containing a sphere and a square each controlled by a device, with interaction forces. /// \warning Does not return, instead calls exit(0). Therefore, will not destruct the device or its scaffold. /// \sa MovingSquareForce, MovingSquareGlutWindow /// \param toolDevice The device providing an input pose to control the sphere. /// \param squareDevice The device providing an input pose to control the square. /// \param testDescriptionMessage A message to be printed to the screen, e.g., instructions for operation. void runToolSquareTest(std::shared_ptr toolDevice, std::shared_ptr squareDevice, const char* testDescriptionMessage); #endif // SURGSIM_TESTING_VISUALTESTCOMMON_TOOLSQUARETEST_H opensurgsim-0.7.0/ThirdParty/000077500000000000000000000000001277777236100162065ustar00rootroot00000000000000opensurgsim-0.7.0/ThirdParty/README_THIRD_PARTY000066400000000000000000000001721277777236100207770ustar00rootroot00000000000000This directory contains third-party software that is not a part of OpenSurgSim, but is packaged with it for convenience. opensurgsim-0.7.0/ThirdParty/google-style-lint/000077500000000000000000000000001277777236100215645ustar00rootroot00000000000000opensurgsim-0.7.0/ThirdParty/google-style-lint/cpplint.py000066400000000000000000007303471277777236100236250ustar00rootroot00000000000000#!/usr/bin/env python # # Copyright (c) 2009 Google Inc. All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are # met: # # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above # copyright notice, this list of conditions and the following disclaimer # in the documentation and/or other materials provided with the # distribution. # * Neither the name of Google Inc. nor the names of its # contributors may be used to endorse or promote products derived from # this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. """Does google-lint on c++ files. The goal of this script is to identify places in the code that *may* be in non-compliance with google style. It does not attempt to fix up these problems -- the point is to educate. It does also not attempt to find all problems, or to ensure that everything it does find is legitimately a problem. In particular, we can get very confused by /* and // inside strings! We do a small hack, which is to ignore //'s with "'s after them on the same line, but it is far from perfect (in either direction). """ import codecs import copy import getopt import math # for log import os import re import sre_compile import string import sys import unicodedata _USAGE = """ Syntax: cpplint.py [--verbose=#] [--output=vs7] [--filter=-x,+y,...] [--counting=total|toplevel|detailed] [--root=subdir] [--linelength=digits] [file] ... The style guidelines this tries to follow are those in http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml Every problem is given a confidence score from 1-5, with 5 meaning we are certain of the problem, and 1 meaning it could be a legitimate construct. This will miss some errors, and is not a substitute for a code review. To suppress false-positive errors of a certain category, add a 'NOLINT(category)' comment to the line. NOLINT or NOLINT(*) suppresses errors of all categories on that line. The files passed in will be linted; at least one file must be provided. Default linted extensions are .cc, .cpp, .cu, .cuh and .h. Change the extensions with the --extensions flag. Flags: output=vs7 By default, the output is formatted to ease emacs parsing. Visual Studio compatible output (vs7) may also be used. Other formats are unsupported. verbose=# Specify a number 0-5 to restrict errors to certain verbosity levels. filter=-x,+y,... Specify a comma-separated list of category-filters to apply: only error messages whose category names pass the filters will be printed. (Category names are printed with the message and look like "[whitespace/indent]".) Filters are evaluated left to right. "-FOO" and "FOO" means "do not print categories that start with FOO". "+FOO" means "do print categories that start with FOO". Examples: --filter=-whitespace,+whitespace/braces --filter=whitespace,runtime/printf,+runtime/printf_format --filter=-,+build/include_what_you_use To see a list of all the categories used in cpplint, pass no arg: --filter= counting=total|toplevel|detailed The total number of errors found is always printed. If 'toplevel' is provided, then the count of errors in each of the top-level categories like 'build' and 'whitespace' will also be printed. If 'detailed' is provided, then a count is provided for each category like 'build/class'. root=subdir The root directory used for deriving header guard CPP variable. By default, the header guard CPP variable is calculated as the relative path to the directory that contains .git, .hg, or .svn. When this flag is specified, the relative path is calculated from the specified directory. If the specified directory does not exist, this flag is ignored. Examples: Assuming that src/.git exists, the header guard CPP variables for src/chrome/browser/ui/browser.h are: No flag => CHROME_BROWSER_UI_BROWSER_H_ --root=chrome => BROWSER_UI_BROWSER_H_ --root=chrome/browser => UI_BROWSER_H_ linelength=digits This is the allowed line length for the project. The default value is 80 characters. Examples: --linelength=120 extensions=extension,extension,... The allowed file extensions that cpplint will check Examples: --extensions=hpp,cpp cpplint.py supports per-directory configurations specified in CPPLINT.cfg files. CPPLINT.cfg file can contain a number of key=value pairs. Currently the following options are supported: set noparent filter=+filter1,-filter2,... exclude_files=regex linelength=80 "set noparent" option prevents cpplint from traversing directory tree upwards looking for more .cfg files in parent directories. This option is usually placed in the top-level project directory. The "filter" option is similar in function to --filter flag. It specifies message filters in addition to the |_DEFAULT_FILTERS| and those specified through --filter command-line flag. "exclude_files" allows to specify a regular expression to be matched against a file name. If the expression matches, the file is skipped and not run through liner. "linelength" allows to specify the allowed line length for the project. CPPLINT.cfg has an effect on files in the same directory and all sub-directories, unless overridden by a nested configuration file. Example file: filter=-build/include_order,+build/include_alpha exclude_files=.*\.cc The above example disables build/include_order warning and enables build/include_alpha as well as excludes all .cc from being processed by linter, in the current directory (where the .cfg file is located) and all sub-directories. """ # We categorize each error message we print. Here are the categories. # We want an explicit list so we can list them all in cpplint --filter=. # If you add a new error message with a new category, add it to the list # here! cpplint_unittest.py should tell you if you forget to do this. _ERROR_CATEGORIES = [ 'build/class', 'build/c++11', 'build/deprecated', 'build/endif_comment', 'build/explicit_make_pair', 'build/forward_decl', 'build/header_guard', 'build/include', 'build/include_alpha', 'build/include_order', 'build/include_what_you_use', 'build/namespaces', 'build/printf_format', 'build/storage_class', 'legal/copyright', 'readability/alt_tokens', 'readability/braces', 'readability/casting', 'readability/check', 'readability/constructors', 'readability/fn_size', 'readability/function', 'readability/inheritance', 'readability/multiline_comment', 'readability/multiline_string', 'readability/namespace', 'readability/nolint', 'readability/nul', 'readability/strings', 'readability/todo', 'readability/utf8', 'runtime/arrays', 'runtime/casting', 'runtime/explicit', 'runtime/int', 'runtime/init', 'runtime/invalid_increment', 'runtime/member_string_references', 'runtime/memset', 'runtime/indentation_namespace', 'runtime/operator', 'runtime/printf', 'runtime/printf_format', 'runtime/references', 'runtime/string', 'runtime/threadsafe_fn', 'runtime/vlog', 'whitespace/blank_line', 'whitespace/braces', 'whitespace/comma', 'whitespace/comments', 'whitespace/empty_conditional_body', 'whitespace/empty_loop_body', 'whitespace/end_of_line', 'whitespace/ending_newline', 'whitespace/forcolon', 'whitespace/indent', 'whitespace/line_length', 'whitespace/newline', 'whitespace/operators', 'whitespace/parens', 'whitespace/semicolon', 'whitespace/tab', 'whitespace/todo', ] # These error categories are no longer enforced by cpplint, but for backwards- # compatibility they may still appear in NOLINT comments. _LEGACY_ERROR_CATEGORIES = [ 'readability/streams', ] # The default state of the category filter. This is overridden by the --filter= # flag. By default all errors are on, so only add here categories that should be # off by default (i.e., categories that must be enabled by the --filter= flags). # All entries here should start with a '-' or '+', as in the --filter= flag. _DEFAULT_FILTERS = ['-build/include_alpha'] # We used to check for high-bit characters, but after much discussion we # decided those were OK, as long as they were in UTF-8 and didn't represent # hard-coded international strings, which belong in a separate i18n file. # C++ headers _CPP_HEADERS = frozenset([ # Legacy 'algobase.h', 'algo.h', 'alloc.h', 'builtinbuf.h', 'bvector.h', 'complex.h', 'defalloc.h', 'deque.h', 'editbuf.h', 'fstream.h', 'function.h', 'hash_map', 'hash_map.h', 'hash_set', 'hash_set.h', 'hashtable.h', 'heap.h', 'indstream.h', 'iomanip.h', 'iostream.h', 'istream.h', 'iterator.h', 'list.h', 'map.h', 'multimap.h', 'multiset.h', 'ostream.h', 'pair.h', 'parsestream.h', 'pfstream.h', 'procbuf.h', 'pthread_alloc', 'pthread_alloc.h', 'rope', 'rope.h', 'ropeimpl.h', 'set.h', 'slist', 'slist.h', 'stack.h', 'stdiostream.h', 'stl_alloc.h', 'stl_relops.h', 'streambuf.h', 'stream.h', 'strfile.h', 'strstream.h', 'tempbuf.h', 'tree.h', 'type_traits.h', 'vector.h', # 17.6.1.2 C++ library headers 'algorithm', 'array', 'atomic', 'bitset', 'chrono', 'codecvt', 'complex', 'condition_variable', 'deque', 'exception', 'forward_list', 'fstream', 'functional', 'future', 'initializer_list', 'iomanip', 'ios', 'iosfwd', 'iostream', 'istream', 'iterator', 'limits', 'list', 'locale', 'map', 'memory', 'mutex', 'new', 'numeric', 'ostream', 'queue', 'random', 'ratio', 'regex', 'set', 'sstream', 'stack', 'stdexcept', 'streambuf', 'string', 'strstream', 'system_error', 'thread', 'tuple', 'typeindex', 'typeinfo', 'type_traits', 'unordered_map', 'unordered_set', 'utility', 'valarray', 'vector', # 17.6.1.2 C++ headers for C library facilities 'cassert', 'ccomplex', 'cctype', 'cerrno', 'cfenv', 'cfloat', 'cinttypes', 'ciso646', 'climits', 'clocale', 'cmath', 'csetjmp', 'csignal', 'cstdalign', 'cstdarg', 'cstdbool', 'cstddef', 'cstdint', 'cstdio', 'cstdlib', 'cstring', 'ctgmath', 'ctime', 'cuchar', 'cwchar', 'cwctype', ]) # These headers are excluded from [build/include] and [build/include_order] # checks: # - Anything not following google file name conventions (containing an # uppercase character, such as Python.h or nsStringAPI.h, for example). # - Lua headers. _THIRD_PARTY_HEADERS_PATTERN = re.compile( r'^(?:[^/]*[A-Z][^/]*\.h|lua\.h|lauxlib\.h|lualib\.h)$') # Assertion macros. These are defined in base/logging.h and # testing/base/gunit.h. Note that the _M versions need to come first # for substring matching to work. _CHECK_MACROS = [ 'DCHECK', 'CHECK', 'EXPECT_TRUE_M', 'EXPECT_TRUE', 'ASSERT_TRUE_M', 'ASSERT_TRUE', 'EXPECT_FALSE_M', 'EXPECT_FALSE', 'ASSERT_FALSE_M', 'ASSERT_FALSE', ] # Replacement macros for CHECK/DCHECK/EXPECT_TRUE/EXPECT_FALSE _CHECK_REPLACEMENT = dict([(m, {}) for m in _CHECK_MACROS]) for op, replacement in [('==', 'EQ'), ('!=', 'NE'), ('>=', 'GE'), ('>', 'GT'), ('<=', 'LE'), ('<', 'LT')]: _CHECK_REPLACEMENT['DCHECK'][op] = 'DCHECK_%s' % replacement _CHECK_REPLACEMENT['CHECK'][op] = 'CHECK_%s' % replacement _CHECK_REPLACEMENT['EXPECT_TRUE'][op] = 'EXPECT_%s' % replacement _CHECK_REPLACEMENT['ASSERT_TRUE'][op] = 'ASSERT_%s' % replacement _CHECK_REPLACEMENT['EXPECT_TRUE_M'][op] = 'EXPECT_%s_M' % replacement _CHECK_REPLACEMENT['ASSERT_TRUE_M'][op] = 'ASSERT_%s_M' % replacement for op, inv_replacement in [('==', 'NE'), ('!=', 'EQ'), ('>=', 'LT'), ('>', 'LE'), ('<=', 'GT'), ('<', 'GE')]: _CHECK_REPLACEMENT['EXPECT_FALSE'][op] = 'EXPECT_%s' % inv_replacement _CHECK_REPLACEMENT['ASSERT_FALSE'][op] = 'ASSERT_%s' % inv_replacement _CHECK_REPLACEMENT['EXPECT_FALSE_M'][op] = 'EXPECT_%s_M' % inv_replacement _CHECK_REPLACEMENT['ASSERT_FALSE_M'][op] = 'ASSERT_%s_M' % inv_replacement # Alternative tokens and their replacements. For full list, see section 2.5 # Alternative tokens [lex.digraph] in the C++ standard. # # Digraphs (such as '%:') are not included here since it's a mess to # match those on a word boundary. _ALT_TOKEN_REPLACEMENT = { 'and': '&&', 'bitor': '|', 'or': '||', 'xor': '^', 'compl': '~', 'bitand': '&', 'and_eq': '&=', 'or_eq': '|=', 'xor_eq': '^=', 'not': '!', 'not_eq': '!=' } # Compile regular expression that matches all the above keywords. The "[ =()]" # bit is meant to avoid matching these keywords outside of boolean expressions. # # False positives include C-style multi-line comments and multi-line strings # but those have always been troublesome for cpplint. _ALT_TOKEN_REPLACEMENT_PATTERN = re.compile( r'[ =()](' + ('|'.join(_ALT_TOKEN_REPLACEMENT.keys())) + r')(?=[ (]|$)') # These constants define types of headers for use with # _IncludeState.CheckNextIncludeOrder(). _C_SYS_HEADER = 1 _CPP_SYS_HEADER = 2 _LIKELY_MY_HEADER = 3 _POSSIBLE_MY_HEADER = 4 _OTHER_HEADER = 5 # These constants define the current inline assembly state _NO_ASM = 0 # Outside of inline assembly block _INSIDE_ASM = 1 # Inside inline assembly block _END_ASM = 2 # Last line of inline assembly block _BLOCK_ASM = 3 # The whole block is an inline assembly block # Match start of assembly blocks _MATCH_ASM = re.compile(r'^\s*(?:asm|_asm|__asm|__asm__)' r'(?:\s+(volatile|__volatile__))?' r'\s*[{(]') _regexp_compile_cache = {} # {str, set(int)}: a map from error categories to sets of linenumbers # on which those errors are expected and should be suppressed. _error_suppressions = {} # The root directory used for deriving header guard CPP variable. # This is set by --root flag. _root = None # The allowed line length of files. # This is set by --linelength flag. _line_length = 80 # The allowed extensions for file names # This is set by --extensions flag. _valid_extensions = set(['cc', 'h', 'cpp', 'cu', 'cuh']) def ParseNolintSuppressions(filename, raw_line, linenum, error): """Updates the global list of error-suppressions. Parses any NOLINT comments on the current line, updating the global error_suppressions store. Reports an error if the NOLINT comment was malformed. Args: filename: str, the name of the input file. raw_line: str, the line of input text, with comments. linenum: int, the number of the current line. error: function, an error handler. """ matched = Search(r'\bNOLINT(NEXTLINE)?\b(\([^)]+\))?', raw_line) if matched: if matched.group(1): suppressed_line = linenum + 1 else: suppressed_line = linenum category = matched.group(2) if category in (None, '(*)'): # => "suppress all" _error_suppressions.setdefault(None, set()).add(suppressed_line) else: if category.startswith('(') and category.endswith(')'): category = category[1:-1] if category in _ERROR_CATEGORIES: _error_suppressions.setdefault(category, set()).add(suppressed_line) elif category not in _LEGACY_ERROR_CATEGORIES: error(filename, linenum, 'readability/nolint', 5, 'Unknown NOLINT error category: %s' % category) def ResetNolintSuppressions(): """Resets the set of NOLINT suppressions to empty.""" _error_suppressions.clear() def IsErrorSuppressedByNolint(category, linenum): """Returns true if the specified error category is suppressed on this line. Consults the global error_suppressions map populated by ParseNolintSuppressions/ResetNolintSuppressions. Args: category: str, the category of the error. linenum: int, the current line number. Returns: bool, True iff the error should be suppressed due to a NOLINT comment. """ return (linenum in _error_suppressions.get(category, set()) or linenum in _error_suppressions.get(None, set())) def Match(pattern, s): """Matches the string with the pattern, caching the compiled regexp.""" # The regexp compilation caching is inlined in both Match and Search for # performance reasons; factoring it out into a separate function turns out # to be noticeably expensive. if pattern not in _regexp_compile_cache: _regexp_compile_cache[pattern] = sre_compile.compile(pattern) return _regexp_compile_cache[pattern].match(s) def ReplaceAll(pattern, rep, s): """Replaces instances of pattern in a string with a replacement. The compiled regex is kept in a cache shared by Match and Search. Args: pattern: regex pattern rep: replacement text s: search string Returns: string with replacements made (or original string if no replacements) """ if pattern not in _regexp_compile_cache: _regexp_compile_cache[pattern] = sre_compile.compile(pattern) return _regexp_compile_cache[pattern].sub(rep, s) def Search(pattern, s): """Searches the string for the pattern, caching the compiled regexp.""" if pattern not in _regexp_compile_cache: _regexp_compile_cache[pattern] = sre_compile.compile(pattern) return _regexp_compile_cache[pattern].search(s) class _IncludeState(object): """Tracks line numbers for includes, and the order in which includes appear. include_list contains list of lists of (header, line number) pairs. It's a lists of lists rather than just one flat list to make it easier to update across preprocessor boundaries. Call CheckNextIncludeOrder() once for each header in the file, passing in the type constants defined above. Calls in an illegal order will raise an _IncludeError with an appropriate error message. """ # self._section will move monotonically through this set. If it ever # needs to move backwards, CheckNextIncludeOrder will raise an error. _INITIAL_SECTION = 0 _MY_H_SECTION = 1 _C_SECTION = 2 _CPP_SECTION = 3 _OTHER_H_SECTION = 4 _TYPE_NAMES = { _C_SYS_HEADER: 'C system header', _CPP_SYS_HEADER: 'C++ system header', _LIKELY_MY_HEADER: 'header this file implements', _POSSIBLE_MY_HEADER: 'header this file may implement', _OTHER_HEADER: 'other header', } _SECTION_NAMES = { _INITIAL_SECTION: "... nothing. (This can't be an error.)", _MY_H_SECTION: 'a header this file implements', _C_SECTION: 'C system header', _CPP_SECTION: 'C++ system header', _OTHER_H_SECTION: 'other header', } def __init__(self): self.include_list = [[]] self.ResetSection('') def FindHeader(self, header): """Check if a header has already been included. Args: header: header to check. Returns: Line number of previous occurrence, or -1 if the header has not been seen before. """ for section_list in self.include_list: for f in section_list: if f[0] == header: return f[1] return -1 def ResetSection(self, directive): """Reset section checking for preprocessor directive. Args: directive: preprocessor directive (e.g. "if", "else"). """ # The name of the current section. self._section = self._INITIAL_SECTION # The path of last found header. self._last_header = '' # Update list of includes. Note that we never pop from the # include list. if directive in ('if', 'ifdef', 'ifndef'): self.include_list.append([]) elif directive in ('else', 'elif'): self.include_list[-1] = [] def SetLastHeader(self, header_path): self._last_header = header_path def CanonicalizeAlphabeticalOrder(self, header_path): """Returns a path canonicalized for alphabetical comparison. - replaces "-" with "_" so they both cmp the same. - removes '-inl' since we don't require them to be after the main header. - lowercase everything, just in case. Args: header_path: Path to be canonicalized. Returns: Canonicalized path. """ return header_path.replace('-inl.h', '.h').replace('-', '_').lower() def IsInAlphabeticalOrder(self, clean_lines, linenum, header_path): """Check if a header is in alphabetical order with the previous header. Args: clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. header_path: Canonicalized header to be checked. Returns: Returns true if the header is in alphabetical order. """ # If previous section is different from current section, _last_header will # be reset to empty string, so it's always less than current header. # # If previous line was a blank line, assume that the headers are # intentionally sorted the way they are. if (self._last_header > header_path and Match(r'^\s*#\s*include\b', clean_lines.elided[linenum - 1])): return False return True def CheckNextIncludeOrder(self, header_type): """Returns a non-empty error message if the next header is out of order. This function also updates the internal state to be ready to check the next include. Args: header_type: One of the _XXX_HEADER constants defined above. Returns: The empty string if the header is in the right order, or an error message describing what's wrong. """ error_message = ('Found %s after %s' % (self._TYPE_NAMES[header_type], self._SECTION_NAMES[self._section])) last_section = self._section if header_type == _C_SYS_HEADER: if self._section <= self._C_SECTION: self._section = self._C_SECTION else: self._last_header = '' return error_message elif header_type == _CPP_SYS_HEADER: if self._section <= self._CPP_SECTION: self._section = self._CPP_SECTION else: self._last_header = '' return error_message elif header_type == _LIKELY_MY_HEADER: if self._section <= self._MY_H_SECTION: self._section = self._MY_H_SECTION else: self._section = self._OTHER_H_SECTION elif header_type == _POSSIBLE_MY_HEADER: if self._section <= self._MY_H_SECTION: self._section = self._MY_H_SECTION else: # This will always be the fallback because we're not sure # enough that the header is associated with this file. self._section = self._OTHER_H_SECTION else: assert header_type == _OTHER_HEADER self._section = self._OTHER_H_SECTION if last_section != self._section: self._last_header = '' return '' class _CppLintState(object): """Maintains module-wide state..""" def __init__(self): self.verbose_level = 1 # global setting. self.error_count = 0 # global count of reported errors # filters to apply when emitting error messages self.filters = _DEFAULT_FILTERS[:] # backup of filter list. Used to restore the state after each file. self._filters_backup = self.filters[:] self.counting = 'total' # In what way are we counting errors? self.errors_by_category = {} # string to int dict storing error counts # output format: # "emacs" - format that emacs can parse (default) # "vs7" - format that Microsoft Visual Studio 7 can parse self.output_format = 'emacs' def SetOutputFormat(self, output_format): """Sets the output format for errors.""" self.output_format = output_format def SetVerboseLevel(self, level): """Sets the module's verbosity, and returns the previous setting.""" last_verbose_level = self.verbose_level self.verbose_level = level return last_verbose_level def SetCountingStyle(self, counting_style): """Sets the module's counting options.""" self.counting = counting_style def SetFilters(self, filters): """Sets the error-message filters. These filters are applied when deciding whether to emit a given error message. Args: filters: A string of comma-separated filters (eg "+whitespace/indent"). Each filter should start with + or -; else we die. Raises: ValueError: The comma-separated filters did not all start with '+' or '-'. E.g. "-,+whitespace,-whitespace/indent,whitespace/badfilter" """ # Default filters always have less priority than the flag ones. self.filters = _DEFAULT_FILTERS[:] self.AddFilters(filters) def AddFilters(self, filters): """ Adds more filters to the existing list of error-message filters. """ for filt in filters.split(','): clean_filt = filt.strip() if clean_filt: self.filters.append(clean_filt) for filt in self.filters: if not (filt.startswith('+') or filt.startswith('-')): raise ValueError('Every filter in --filters must start with + or -' ' (%s does not)' % filt) def BackupFilters(self): """ Saves the current filter list to backup storage.""" self._filters_backup = self.filters[:] def RestoreFilters(self): """ Restores filters previously backed up.""" self.filters = self._filters_backup[:] def ResetErrorCounts(self): """Sets the module's error statistic back to zero.""" self.error_count = 0 self.errors_by_category = {} def IncrementErrorCount(self, category): """Bumps the module's error statistic.""" self.error_count += 1 if self.counting in ('toplevel', 'detailed'): if self.counting != 'detailed': category = category.split('/')[0] if category not in self.errors_by_category: self.errors_by_category[category] = 0 self.errors_by_category[category] += 1 def PrintErrorCounts(self): """Print a summary of errors by category, and the total.""" for category, count in self.errors_by_category.iteritems(): sys.stderr.write('Category \'%s\' errors found: %d\n' % (category, count)) sys.stderr.write('Total errors found: %d\n' % self.error_count) _cpplint_state = _CppLintState() def _OutputFormat(): """Gets the module's output format.""" return _cpplint_state.output_format def _SetOutputFormat(output_format): """Sets the module's output format.""" _cpplint_state.SetOutputFormat(output_format) def _VerboseLevel(): """Returns the module's verbosity setting.""" return _cpplint_state.verbose_level def _SetVerboseLevel(level): """Sets the module's verbosity, and returns the previous setting.""" return _cpplint_state.SetVerboseLevel(level) def _SetCountingStyle(level): """Sets the module's counting options.""" _cpplint_state.SetCountingStyle(level) def _Filters(): """Returns the module's list of output filters, as a list.""" return _cpplint_state.filters def _SetFilters(filters): """Sets the module's error-message filters. These filters are applied when deciding whether to emit a given error message. Args: filters: A string of comma-separated filters (eg "whitespace/indent"). Each filter should start with + or -; else we die. """ _cpplint_state.SetFilters(filters) def _AddFilters(filters): """Adds more filter overrides. Unlike _SetFilters, this function does not reset the current list of filters available. Args: filters: A string of comma-separated filters (eg "whitespace/indent"). Each filter should start with + or -; else we die. """ _cpplint_state.AddFilters(filters) def _BackupFilters(): """ Saves the current filter list to backup storage.""" _cpplint_state.BackupFilters() def _RestoreFilters(): """ Restores filters previously backed up.""" _cpplint_state.RestoreFilters() class _FunctionState(object): """Tracks current function name and the number of lines in its body.""" _NORMAL_TRIGGER = 250 # for --v=0, 500 for --v=1, etc. _TEST_TRIGGER = 400 # about 50% more than _NORMAL_TRIGGER. def __init__(self): self.in_a_function = False self.lines_in_function = 0 self.current_function = '' def Begin(self, function_name): """Start analyzing function body. Args: function_name: The name of the function being tracked. """ self.in_a_function = True self.lines_in_function = 0 self.current_function = function_name def Count(self): """Count line in current function body.""" if self.in_a_function: self.lines_in_function += 1 def Check(self, error, filename, linenum): """Report if too many lines in function body. Args: error: The function to call with any errors found. filename: The name of the current file. linenum: The number of the line to check. """ if Match(r'T(EST|est)', self.current_function): base_trigger = self._TEST_TRIGGER else: base_trigger = self._NORMAL_TRIGGER trigger = base_trigger * 2**_VerboseLevel() if self.lines_in_function > trigger: error_level = int(math.log(self.lines_in_function / base_trigger, 2)) # 50 => 0, 100 => 1, 200 => 2, 400 => 3, 800 => 4, 1600 => 5, ... if error_level > 5: error_level = 5 error(filename, linenum, 'readability/fn_size', error_level, 'Small and focused functions are preferred:' ' %s has %d non-comment lines' ' (error triggered by exceeding %d lines).' % ( self.current_function, self.lines_in_function, trigger)) def End(self): """Stop analyzing function body.""" self.in_a_function = False class _IncludeError(Exception): """Indicates a problem with the include order in a file.""" pass class FileInfo(object): """Provides utility functions for filenames. FileInfo provides easy access to the components of a file's path relative to the project root. """ def __init__(self, filename): self._filename = filename def FullName(self): """Make Windows paths like Unix.""" return os.path.abspath(self._filename).replace('\\', '/') def RepositoryName(self): """FullName after removing the local path to the repository. If we have a real absolute path name here we can try to do something smart: detecting the root of the checkout and truncating /path/to/checkout from the name so that we get header guards that don't include things like "C:\Documents and Settings\..." or "/home/username/..." in them and thus people on different computers who have checked the source out to different locations won't see bogus errors. """ fullname = self.FullName() if os.path.exists(fullname): project_dir = os.path.dirname(fullname) if os.path.exists(os.path.join(project_dir, ".svn")): # If there's a .svn file in the current directory, we recursively look # up the directory tree for the top of the SVN checkout root_dir = project_dir one_up_dir = os.path.dirname(root_dir) while os.path.exists(os.path.join(one_up_dir, ".svn")): root_dir = os.path.dirname(root_dir) one_up_dir = os.path.dirname(one_up_dir) prefix = os.path.commonprefix([root_dir, project_dir]) return fullname[len(prefix) + 1:] # Not SVN <= 1.6? Try to find a git, hg, or svn top level directory by # searching up from the current path. root_dir = os.path.dirname(fullname) while (root_dir != os.path.dirname(root_dir) and not os.path.exists(os.path.join(root_dir, ".git")) and not os.path.exists(os.path.join(root_dir, ".hg")) and not os.path.exists(os.path.join(root_dir, ".svn"))): root_dir = os.path.dirname(root_dir) if (os.path.exists(os.path.join(root_dir, ".git")) or os.path.exists(os.path.join(root_dir, ".hg")) or os.path.exists(os.path.join(root_dir, ".svn"))): prefix = os.path.commonprefix([root_dir, project_dir]) return fullname[len(prefix) + 1:] # Don't know what to do; header guard warnings may be wrong... return fullname def Split(self): """Splits the file into the directory, basename, and extension. For 'chrome/browser/browser.cc', Split() would return ('chrome/browser', 'browser', '.cc') Returns: A tuple of (directory, basename, extension). """ googlename = self.RepositoryName() project, rest = os.path.split(googlename) return (project,) + os.path.splitext(rest) def BaseName(self): """File base name - text after the final slash, before the final period.""" return self.Split()[1] def Extension(self): """File extension - text following the final period.""" return self.Split()[2] def NoExtension(self): """File has no source file extension.""" return '/'.join(self.Split()[0:2]) def IsSource(self): """File has a source file extension.""" return self.Extension()[1:] in ('c', 'cc', 'cpp', 'cxx') def _ShouldPrintError(category, confidence, linenum): """If confidence >= verbose, category passes filter and is not suppressed.""" # There are three ways we might decide not to print an error message: # a "NOLINT(category)" comment appears in the source, # the verbosity level isn't high enough, or the filters filter it out. if IsErrorSuppressedByNolint(category, linenum): return False if confidence < _cpplint_state.verbose_level: return False is_filtered = False for one_filter in _Filters(): if one_filter.startswith('-'): if category.startswith(one_filter[1:]): is_filtered = True elif one_filter.startswith('+'): if category.startswith(one_filter[1:]): is_filtered = False else: assert False # should have been checked for in SetFilter. if is_filtered: return False return True def Error(filename, linenum, category, confidence, message): """Logs the fact we've found a lint error. We log where the error was found, and also our confidence in the error, that is, how certain we are this is a legitimate style regression, and not a misidentification or a use that's sometimes justified. False positives can be suppressed by the use of "cpplint(category)" comments on the offending line. These are parsed into _error_suppressions. Args: filename: The name of the file containing the error. linenum: The number of the line containing the error. category: A string used to describe the "category" this bug falls under: "whitespace", say, or "runtime". Categories may have a hierarchy separated by slashes: "whitespace/indent". confidence: A number from 1-5 representing a confidence score for the error, with 5 meaning that we are certain of the problem, and 1 meaning that it could be a legitimate construct. message: The error message. """ if _ShouldPrintError(category, confidence, linenum): _cpplint_state.IncrementErrorCount(category) if _cpplint_state.output_format == 'vs7': sys.stderr.write('%s(%s): %s [%s] [%d]\n' % ( filename, linenum, message, category, confidence)) elif _cpplint_state.output_format == 'eclipse': sys.stderr.write('%s:%s: warning: %s [%s] [%d]\n' % ( filename, linenum, message, category, confidence)) else: sys.stderr.write('%s:%s: %s [%s] [%d]\n' % ( filename, linenum, message, category, confidence)) # Matches standard C++ escape sequences per 2.13.2.3 of the C++ standard. _RE_PATTERN_CLEANSE_LINE_ESCAPES = re.compile( r'\\([abfnrtv?"\\\']|\d+|x[0-9a-fA-F]+)') # Match a single C style comment on the same line. _RE_PATTERN_C_COMMENTS = r'/\*(?:[^*]|\*(?!/))*\*/' # Matches multi-line C style comments. # This RE is a little bit more complicated than one might expect, because we # have to take care of space removals tools so we can handle comments inside # statements better. # The current rule is: We only clear spaces from both sides when we're at the # end of the line. Otherwise, we try to remove spaces from the right side, # if this doesn't work we try on left side but only if there's a non-character # on the right. _RE_PATTERN_CLEANSE_LINE_C_COMMENTS = re.compile( r'(\s*' + _RE_PATTERN_C_COMMENTS + r'\s*$|' + _RE_PATTERN_C_COMMENTS + r'\s+|' + r'\s+' + _RE_PATTERN_C_COMMENTS + r'(?=\W)|' + _RE_PATTERN_C_COMMENTS + r')') def IsCppString(line): """Does line terminate so, that the next symbol is in string constant. This function does not consider single-line nor multi-line comments. Args: line: is a partial line of code starting from the 0..n. Returns: True, if next character appended to 'line' is inside a string constant. """ line = line.replace(r'\\', 'XX') # after this, \\" does not match to \" return ((line.count('"') - line.count(r'\"') - line.count("'\"'")) & 1) == 1 def CleanseRawStrings(raw_lines): """Removes C++11 raw strings from lines. Before: static const char kData[] = R"( multi-line string )"; After: static const char kData[] = "" (replaced by blank line) ""; Args: raw_lines: list of raw lines. Returns: list of lines with C++11 raw strings replaced by empty strings. """ delimiter = None lines_without_raw_strings = [] for line in raw_lines: if delimiter: # Inside a raw string, look for the end end = line.find(delimiter) if end >= 0: # Found the end of the string, match leading space for this # line and resume copying the original lines, and also insert # a "" on the last line. leading_space = Match(r'^(\s*)\S', line) line = leading_space.group(1) + '""' + line[end + len(delimiter):] delimiter = None else: # Haven't found the end yet, append a blank line. line = '""' # Look for beginning of a raw string, and replace them with # empty strings. This is done in a loop to handle multiple raw # strings on the same line. while delimiter is None: # Look for beginning of a raw string. # See 2.14.15 [lex.string] for syntax. matched = Match(r'^(.*)\b(?:R|u8R|uR|UR|LR)"([^\s\\()]*)\((.*)$', line) if matched: delimiter = ')' + matched.group(2) + '"' end = matched.group(3).find(delimiter) if end >= 0: # Raw string ended on same line line = (matched.group(1) + '""' + matched.group(3)[end + len(delimiter):]) delimiter = None else: # Start of a multi-line raw string line = matched.group(1) + '""' else: break lines_without_raw_strings.append(line) # TODO(unknown): if delimiter is not None here, we might want to # emit a warning for unterminated string. return lines_without_raw_strings def FindNextMultiLineCommentStart(lines, lineix): """Find the beginning marker for a multiline comment.""" while lineix < len(lines): if lines[lineix].strip().startswith('/*'): # Only return this marker if the comment goes beyond this line if lines[lineix].strip().find('*/', 2) < 0: return lineix lineix += 1 return len(lines) def FindNextMultiLineCommentEnd(lines, lineix): """We are inside a comment, find the end marker.""" while lineix < len(lines): if lines[lineix].strip().endswith('*/'): return lineix lineix += 1 return len(lines) def RemoveMultiLineCommentsFromRange(lines, begin, end): """Clears a range of lines for multi-line comments.""" # Having // dummy comments makes the lines non-empty, so we will not get # unnecessary blank line warnings later in the code. for i in range(begin, end): lines[i] = '/**/' def RemoveMultiLineComments(filename, lines, error): """Removes multiline (c-style) comments from lines.""" lineix = 0 while lineix < len(lines): lineix_begin = FindNextMultiLineCommentStart(lines, lineix) if lineix_begin >= len(lines): return lineix_end = FindNextMultiLineCommentEnd(lines, lineix_begin) if lineix_end >= len(lines): error(filename, lineix_begin + 1, 'readability/multiline_comment', 5, 'Could not find end of multi-line comment') return RemoveMultiLineCommentsFromRange(lines, lineix_begin, lineix_end + 1) lineix = lineix_end + 1 def CleanseComments(line): """Removes //-comments and single-line C-style /* */ comments. Args: line: A line of C++ source. Returns: The line with single-line comments removed. """ commentpos = line.find('//') if commentpos != -1 and not IsCppString(line[:commentpos]): line = line[:commentpos].rstrip() # get rid of /* ... */ return _RE_PATTERN_CLEANSE_LINE_C_COMMENTS.sub('', line) class CleansedLines(object): """Holds 4 copies of all lines with different preprocessing applied to them. 1) elided member contains lines without strings and comments. 2) lines member contains lines without comments. 3) raw_lines member contains all the lines without processing. 4) lines_without_raw_strings member is same as raw_lines, but with C++11 raw strings removed. All these members are of , and of the same length. """ def __init__(self, lines): self.elided = [] self.lines = [] self.raw_lines = lines self.num_lines = len(lines) self.lines_without_raw_strings = CleanseRawStrings(lines) for linenum in range(len(self.lines_without_raw_strings)): self.lines.append(CleanseComments( self.lines_without_raw_strings[linenum])) elided = self._CollapseStrings(self.lines_without_raw_strings[linenum]) self.elided.append(CleanseComments(elided)) def NumLines(self): """Returns the number of lines represented.""" return self.num_lines @staticmethod def _CollapseStrings(elided): """Collapses strings and chars on a line to simple "" or '' blocks. We nix strings first so we're not fooled by text like '"http://"' Args: elided: The line being processed. Returns: The line with collapsed strings. """ if _RE_PATTERN_INCLUDE.match(elided): return elided # Remove escaped characters first to make quote/single quote collapsing # basic. Things that look like escaped characters shouldn't occur # outside of strings and chars. elided = _RE_PATTERN_CLEANSE_LINE_ESCAPES.sub('', elided) # Replace quoted strings and digit separators. Both single quotes # and double quotes are processed in the same loop, otherwise # nested quotes wouldn't work. collapsed = '' while True: # Find the first quote character match = Match(r'^([^\'"]*)([\'"])(.*)$', elided) if not match: collapsed += elided break head, quote, tail = match.groups() if quote == '"': # Collapse double quoted strings second_quote = tail.find('"') if second_quote >= 0: collapsed += head + '""' elided = tail[second_quote + 1:] else: # Unmatched double quote, don't bother processing the rest # of the line since this is probably a multiline string. collapsed += elided break else: # Found single quote, check nearby text to eliminate digit separators. # # There is no special handling for floating point here, because # the integer/fractional/exponent parts would all be parsed # correctly as long as there are digits on both sides of the # separator. So we are fine as long as we don't see something # like "0.'3" (gcc 4.9.0 will not allow this literal). if Search(r'\b(?:0[bBxX]?|[1-9])[0-9a-fA-F]*$', head): match_literal = Match(r'^((?:\'?[0-9a-zA-Z_])*)(.*)$', "'" + tail) collapsed += head + match_literal.group(1).replace("'", '') elided = match_literal.group(2) else: second_quote = tail.find('\'') if second_quote >= 0: collapsed += head + "''" elided = tail[second_quote + 1:] else: # Unmatched single quote collapsed += elided break return collapsed def FindEndOfExpressionInLine(line, startpos, stack): """Find the position just after the end of current parenthesized expression. Args: line: a CleansedLines line. startpos: start searching at this position. stack: nesting stack at startpos. Returns: On finding matching end: (index just after matching end, None) On finding an unclosed expression: (-1, None) Otherwise: (-1, new stack at end of this line) """ for i in xrange(startpos, len(line)): char = line[i] if char in '([{': # Found start of parenthesized expression, push to expression stack stack.append(char) elif char == '<': # Found potential start of template argument list if i > 0 and line[i - 1] == '<': # Left shift operator if stack and stack[-1] == '<': stack.pop() if not stack: return (-1, None) elif i > 0 and Search(r'\boperator\s*$', line[0:i]): # operator<, don't add to stack continue else: # Tentative start of template argument list stack.append('<') elif char in ')]}': # Found end of parenthesized expression. # # If we are currently expecting a matching '>', the pending '<' # must have been an operator. Remove them from expression stack. while stack and stack[-1] == '<': stack.pop() if not stack: return (-1, None) if ((stack[-1] == '(' and char == ')') or (stack[-1] == '[' and char == ']') or (stack[-1] == '{' and char == '}')): stack.pop() if not stack: return (i + 1, None) else: # Mismatched parentheses return (-1, None) elif char == '>': # Found potential end of template argument list. # Ignore "->" and operator functions if (i > 0 and (line[i - 1] == '-' or Search(r'\boperator\s*$', line[0:i - 1]))): continue # Pop the stack if there is a matching '<'. Otherwise, ignore # this '>' since it must be an operator. if stack: if stack[-1] == '<': stack.pop() if not stack: return (i + 1, None) elif char == ';': # Found something that look like end of statements. If we are currently # expecting a '>', the matching '<' must have been an operator, since # template argument list should not contain statements. while stack and stack[-1] == '<': stack.pop() if not stack: return (-1, None) # Did not find end of expression or unbalanced parentheses on this line return (-1, stack) def CloseExpression(clean_lines, linenum, pos): """If input points to ( or { or [ or <, finds the position that closes it. If lines[linenum][pos] points to a '(' or '{' or '[' or '<', finds the linenum/pos that correspond to the closing of the expression. TODO(unknown): cpplint spends a fair bit of time matching parentheses. Ideally we would want to index all opening and closing parentheses once and have CloseExpression be just a simple lookup, but due to preprocessor tricks, this is not so easy. Args: clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. pos: A position on the line. Returns: A tuple (line, linenum, pos) pointer *past* the closing brace, or (line, len(lines), -1) if we never find a close. Note we ignore strings and comments when matching; and the line we return is the 'cleansed' line at linenum. """ line = clean_lines.elided[linenum] if (line[pos] not in '({[<') or Match(r'<[<=]', line[pos:]): return (line, clean_lines.NumLines(), -1) # Check first line (end_pos, stack) = FindEndOfExpressionInLine(line, pos, []) if end_pos > -1: return (line, linenum, end_pos) # Continue scanning forward while stack and linenum < clean_lines.NumLines() - 1: linenum += 1 line = clean_lines.elided[linenum] (end_pos, stack) = FindEndOfExpressionInLine(line, 0, stack) if end_pos > -1: return (line, linenum, end_pos) # Did not find end of expression before end of file, give up return (line, clean_lines.NumLines(), -1) def FindStartOfExpressionInLine(line, endpos, stack): """Find position at the matching start of current expression. This is almost the reverse of FindEndOfExpressionInLine, but note that the input position and returned position differs by 1. Args: line: a CleansedLines line. endpos: start searching at this position. stack: nesting stack at endpos. Returns: On finding matching start: (index at matching start, None) On finding an unclosed expression: (-1, None) Otherwise: (-1, new stack at beginning of this line) """ i = endpos while i >= 0: char = line[i] if char in ')]}': # Found end of expression, push to expression stack stack.append(char) elif char == '>': # Found potential end of template argument list. # # Ignore it if it's a "->" or ">=" or "operator>" if (i > 0 and (line[i - 1] == '-' or Match(r'\s>=\s', line[i - 1:]) or Search(r'\boperator\s*$', line[0:i]))): i -= 1 else: stack.append('>') elif char == '<': # Found potential start of template argument list if i > 0 and line[i - 1] == '<': # Left shift operator i -= 1 else: # If there is a matching '>', we can pop the expression stack. # Otherwise, ignore this '<' since it must be an operator. if stack and stack[-1] == '>': stack.pop() if not stack: return (i, None) elif char in '([{': # Found start of expression. # # If there are any unmatched '>' on the stack, they must be # operators. Remove those. while stack and stack[-1] == '>': stack.pop() if not stack: return (-1, None) if ((char == '(' and stack[-1] == ')') or (char == '[' and stack[-1] == ']') or (char == '{' and stack[-1] == '}')): stack.pop() if not stack: return (i, None) else: # Mismatched parentheses return (-1, None) elif char == ';': # Found something that look like end of statements. If we are currently # expecting a '<', the matching '>' must have been an operator, since # template argument list should not contain statements. while stack and stack[-1] == '>': stack.pop() if not stack: return (-1, None) i -= 1 return (-1, stack) def ReverseCloseExpression(clean_lines, linenum, pos): """If input points to ) or } or ] or >, finds the position that opens it. If lines[linenum][pos] points to a ')' or '}' or ']' or '>', finds the linenum/pos that correspond to the opening of the expression. Args: clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. pos: A position on the line. Returns: A tuple (line, linenum, pos) pointer *at* the opening brace, or (line, 0, -1) if we never find the matching opening brace. Note we ignore strings and comments when matching; and the line we return is the 'cleansed' line at linenum. """ line = clean_lines.elided[linenum] if line[pos] not in ')}]>': return (line, 0, -1) # Check last line (start_pos, stack) = FindStartOfExpressionInLine(line, pos, []) if start_pos > -1: return (line, linenum, start_pos) # Continue scanning backward while stack and linenum > 0: linenum -= 1 line = clean_lines.elided[linenum] (start_pos, stack) = FindStartOfExpressionInLine(line, len(line) - 1, stack) if start_pos > -1: return (line, linenum, start_pos) # Did not find start of expression before beginning of file, give up return (line, 0, -1) def CheckForCopyright(filename, lines, error): """Logs an error if no Copyright message appears at the top of the file.""" # We'll say it should occur by line 10. Don't forget there's a # dummy line at the front. for line in xrange(1, min(len(lines), 11)): if re.search(r'Copyright', lines[line], re.I): break else: # means no copyright line was found error(filename, 0, 'legal/copyright', 5, 'No copyright message found. ' 'You should have a line: "Copyright [year] "') def GetIndentLevel(line): """Return the number of leading spaces in line. Args: line: A string to check. Returns: An integer count of leading spaces, possibly zero. """ indent = Match(r'^( *)\S', line) if indent: return len(indent.group(1)) else: return 0 def GetHeaderGuardCPPVariable(filename): """Returns the CPP variable that should be used as a header guard. Args: filename: The name of a C++ header file. Returns: The CPP variable that should be used as a header guard in the named file. """ # Restores original filename in case that cpplint is invoked from Emacs's # flymake. filename = re.sub(r'_flymake\.h$', '.h', filename) filename = re.sub(r'/\.flymake/([^/]*)$', r'/\1', filename) # Replace 'c++' with 'cpp'. filename = filename.replace('C++', 'cpp').replace('c++', 'cpp') fileinfo = FileInfo(filename) file_path_from_root = fileinfo.RepositoryName() if _root: file_path_from_root = re.sub('^' + _root + os.sep, '', file_path_from_root) return re.sub(r'[^a-zA-Z0-9]', '_', file_path_from_root).upper() + '_' def CheckForHeaderGuard(filename, clean_lines, error): """Checks that the file contains a header guard. Logs an error if no #ifndef header guard is present. For other headers, checks that the full pathname is used. Args: filename: The name of the C++ header file. clean_lines: A CleansedLines instance containing the file. error: The function to call with any errors found. """ # Don't check for header guards if there are error suppression # comments somewhere in this file. # # Because this is silencing a warning for a nonexistent line, we # only support the very specific NOLINT(build/header_guard) syntax, # and not the general NOLINT or NOLINT(*) syntax. raw_lines = clean_lines.lines_without_raw_strings for i in raw_lines: if Search(r'//\s*NOLINT\(build/header_guard\)', i): return cppvar = GetHeaderGuardCPPVariable(filename) ifndef = '' ifndef_linenum = 0 define = '' endif = '' endif_linenum = 0 for linenum, line in enumerate(raw_lines): linesplit = line.split() if len(linesplit) >= 2: # find the first occurrence of #ifndef and #define, save arg if not ifndef and linesplit[0] == '#ifndef': # set ifndef to the header guard presented on the #ifndef line. ifndef = linesplit[1] ifndef_linenum = linenum if not define and linesplit[0] == '#define': define = linesplit[1] # find the last occurrence of #endif, save entire line if line.startswith('#endif'): endif = line endif_linenum = linenum if not ifndef or not define or ifndef != define: error(filename, 0, 'build/header_guard', 5, 'No #ifndef header guard found, suggested CPP variable is: %s' % cppvar) return # The guard should be PATH_FILE_H_, but we also allow PATH_FILE_H__ # for backward compatibility. if ifndef != cppvar: error_level = 0 if ifndef != cppvar + '_': error_level = 5 ParseNolintSuppressions(filename, raw_lines[ifndef_linenum], ifndef_linenum, error) error(filename, ifndef_linenum, 'build/header_guard', error_level, '#ifndef header guard has wrong style, please use: %s' % cppvar) # Check for "//" comments on endif line. ParseNolintSuppressions(filename, raw_lines[endif_linenum], endif_linenum, error) match = Match(r'#endif\s*//\s*' + cppvar + r'(_)?\b', endif) if match: if match.group(1) == '_': # Issue low severity warning for deprecated double trailing underscore error(filename, endif_linenum, 'build/header_guard', 0, '#endif line should be "#endif // %s"' % cppvar) return # Didn't find the corresponding "//" comment. If this file does not # contain any "//" comments at all, it could be that the compiler # only wants "/**/" comments, look for those instead. no_single_line_comments = True for i in xrange(1, len(raw_lines) - 1): line = raw_lines[i] if Match(r'^(?:(?:\'(?:\.|[^\'])*\')|(?:"(?:\.|[^"])*")|[^\'"])*//', line): no_single_line_comments = False break if no_single_line_comments: match = Match(r'#endif\s*/\*\s*' + cppvar + r'(_)?\s*\*/', endif) if match: if match.group(1) == '_': # Low severity warning for double trailing underscore error(filename, endif_linenum, 'build/header_guard', 0, '#endif line should be "#endif /* %s */"' % cppvar) return # Didn't find anything error(filename, endif_linenum, 'build/header_guard', 5, '#endif line should be "#endif // %s"' % cppvar) def CheckHeaderFileIncluded(filename, include_state, error): """Logs an error if a .cc file does not include its header.""" # Do not check test files if filename.endswith('_test.cc') or filename.endswith('_unittest.cc'): return fileinfo = FileInfo(filename) headerfile = filename[0:len(filename) - 2] + 'h' if not os.path.exists(headerfile): return headername = FileInfo(headerfile).RepositoryName() first_include = 0 for section_list in include_state.include_list: for f in section_list: if headername in f[0] or f[0] in headername: return if not first_include: first_include = f[1] error(filename, first_include, 'build/include', 5, '%s should include its header file %s' % (fileinfo.RepositoryName(), headername)) def CheckForBadCharacters(filename, lines, error): """Logs an error for each line containing bad characters. Two kinds of bad characters: 1. Unicode replacement characters: These indicate that either the file contained invalid UTF-8 (likely) or Unicode replacement characters (which it shouldn't). Note that it's possible for this to throw off line numbering if the invalid UTF-8 occurred adjacent to a newline. 2. NUL bytes. These are problematic for some tools. Args: filename: The name of the current file. lines: An array of strings, each representing a line of the file. error: The function to call with any errors found. """ for linenum, line in enumerate(lines): if u'\ufffd' in line: error(filename, linenum, 'readability/utf8', 5, 'Line contains invalid UTF-8 (or Unicode replacement character).') if '\0' in line: error(filename, linenum, 'readability/nul', 5, 'Line contains NUL byte.') def CheckForNewlineAtEOF(filename, lines, error): """Logs an error if there is no newline char at the end of the file. Args: filename: The name of the current file. lines: An array of strings, each representing a line of the file. error: The function to call with any errors found. """ # The array lines() was created by adding two newlines to the # original file (go figure), then splitting on \n. # To verify that the file ends in \n, we just have to make sure the # last-but-two element of lines() exists and is empty. if len(lines) < 3 or lines[-2]: error(filename, len(lines) - 2, 'whitespace/ending_newline', 5, 'Could not find a newline character at the end of the file.') def CheckForMultilineCommentsAndStrings(filename, clean_lines, linenum, error): """Logs an error if we see /* ... */ or "..." that extend past one line. /* ... */ comments are legit inside macros, for one line. Otherwise, we prefer // comments, so it's ok to warn about the other. Likewise, it's ok for strings to extend across multiple lines, as long as a line continuation character (backslash) terminates each line. Although not currently prohibited by the C++ style guide, it's ugly and unnecessary. We don't do well with either in this lint program, so we warn about both. Args: filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. error: The function to call with any errors found. """ line = clean_lines.elided[linenum] # Remove all \\ (escaped backslashes) from the line. They are OK, and the # second (escaped) slash may trigger later \" detection erroneously. line = line.replace('\\\\', '') if line.count('/*') > line.count('*/'): error(filename, linenum, 'readability/multiline_comment', 5, 'Complex multi-line /*...*/-style comment found. ' 'Lint may give bogus warnings. ' 'Consider replacing these with //-style comments, ' 'with #if 0...#endif, ' 'or with more clearly structured multi-line comments.') if (line.count('"') - line.count('\\"')) % 2: error(filename, linenum, 'readability/multiline_string', 5, 'Multi-line string ("...") found. This lint script doesn\'t ' 'do well with such strings, and may give bogus warnings. ' 'Use C++11 raw strings or concatenation instead.') # (non-threadsafe name, thread-safe alternative, validation pattern) # # The validation pattern is used to eliminate false positives such as: # _rand(); // false positive due to substring match. # ->rand(); // some member function rand(). # ACMRandom rand(seed); // some variable named rand. # ISAACRandom rand(); // another variable named rand. # # Basically we require the return value of these functions to be used # in some expression context on the same line by matching on some # operator before the function name. This eliminates constructors and # member function calls. _UNSAFE_FUNC_PREFIX = r'(?:[-+*/=%^&|(<]\s*|>\s+)' _THREADING_LIST = ( ('asctime(', 'asctime_r(', _UNSAFE_FUNC_PREFIX + r'asctime\([^)]+\)'), ('ctime(', 'ctime_r(', _UNSAFE_FUNC_PREFIX + r'ctime\([^)]+\)'), ('getgrgid(', 'getgrgid_r(', _UNSAFE_FUNC_PREFIX + r'getgrgid\([^)]+\)'), ('getgrnam(', 'getgrnam_r(', _UNSAFE_FUNC_PREFIX + r'getgrnam\([^)]+\)'), ('getlogin(', 'getlogin_r(', _UNSAFE_FUNC_PREFIX + r'getlogin\(\)'), ('getpwnam(', 'getpwnam_r(', _UNSAFE_FUNC_PREFIX + r'getpwnam\([^)]+\)'), ('getpwuid(', 'getpwuid_r(', _UNSAFE_FUNC_PREFIX + r'getpwuid\([^)]+\)'), ('gmtime(', 'gmtime_r(', _UNSAFE_FUNC_PREFIX + r'gmtime\([^)]+\)'), ('localtime(', 'localtime_r(', _UNSAFE_FUNC_PREFIX + r'localtime\([^)]+\)'), ('rand(', 'rand_r(', _UNSAFE_FUNC_PREFIX + r'rand\(\)'), ('strtok(', 'strtok_r(', _UNSAFE_FUNC_PREFIX + r'strtok\([^)]+\)'), ('ttyname(', 'ttyname_r(', _UNSAFE_FUNC_PREFIX + r'ttyname\([^)]+\)'), ) def CheckPosixThreading(filename, clean_lines, linenum, error): """Checks for calls to thread-unsafe functions. Much code has been originally written without consideration of multi-threading. Also, engineers are relying on their old experience; they have learned posix before threading extensions were added. These tests guide the engineers to use thread-safe functions (when using posix directly). Args: filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. error: The function to call with any errors found. """ line = clean_lines.elided[linenum] for single_thread_func, multithread_safe_func, pattern in _THREADING_LIST: # Additional pattern matching check to confirm that this is the # function we are looking for if Search(pattern, line): error(filename, linenum, 'runtime/threadsafe_fn', 2, 'Consider using ' + multithread_safe_func + '...) instead of ' + single_thread_func + '...) for improved thread safety.') def CheckVlogArguments(filename, clean_lines, linenum, error): """Checks that VLOG() is only used for defining a logging level. For example, VLOG(2) is correct. VLOG(INFO), VLOG(WARNING), VLOG(ERROR), and VLOG(FATAL) are not. Args: filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. error: The function to call with any errors found. """ line = clean_lines.elided[linenum] if Search(r'\bVLOG\((INFO|ERROR|WARNING|DFATAL|FATAL)\)', line): error(filename, linenum, 'runtime/vlog', 5, 'VLOG() should be used with numeric verbosity level. ' 'Use LOG() if you want symbolic severity levels.') # Matches invalid increment: *count++, which moves pointer instead of # incrementing a value. _RE_PATTERN_INVALID_INCREMENT = re.compile( r'^\s*\*\w+(\+\+|--);') def CheckInvalidIncrement(filename, clean_lines, linenum, error): """Checks for invalid increment *count++. For example following function: void increment_counter(int* count) { *count++; } is invalid, because it effectively does count++, moving pointer, and should be replaced with ++*count, (*count)++ or *count += 1. Args: filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. error: The function to call with any errors found. """ line = clean_lines.elided[linenum] if _RE_PATTERN_INVALID_INCREMENT.match(line): error(filename, linenum, 'runtime/invalid_increment', 5, 'Changing pointer instead of value (or unused value of operator*).') def IsMacroDefinition(clean_lines, linenum): if Search(r'^#define', clean_lines[linenum]): return True if linenum > 0 and Search(r'\\$', clean_lines[linenum - 1]): return True return False def IsForwardClassDeclaration(clean_lines, linenum): return Match(r'^\s*(\btemplate\b)*.*class\s+\w+;\s*$', clean_lines[linenum]) class _BlockInfo(object): """Stores information about a generic block of code.""" def __init__(self, seen_open_brace): self.seen_open_brace = seen_open_brace self.open_parentheses = 0 self.inline_asm = _NO_ASM self.check_namespace_indentation = False def CheckBegin(self, filename, clean_lines, linenum, error): """Run checks that applies to text up to the opening brace. This is mostly for checking the text after the class identifier and the "{", usually where the base class is specified. For other blocks, there isn't much to check, so we always pass. Args: filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. error: The function to call with any errors found. """ pass def CheckEnd(self, filename, clean_lines, linenum, error): """Run checks that applies to text after the closing brace. This is mostly used for checking end of namespace comments. Args: filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. error: The function to call with any errors found. """ pass def IsBlockInfo(self): """Returns true if this block is a _BlockInfo. This is convenient for verifying that an object is an instance of a _BlockInfo, but not an instance of any of the derived classes. Returns: True for this class, False for derived classes. """ return self.__class__ == _BlockInfo class _ExternCInfo(_BlockInfo): """Stores information about an 'extern "C"' block.""" def __init__(self): _BlockInfo.__init__(self, True) class _ClassInfo(_BlockInfo): """Stores information about a class.""" def __init__(self, name, class_or_struct, clean_lines, linenum): _BlockInfo.__init__(self, False) self.name = name self.starting_linenum = linenum self.is_derived = False self.check_namespace_indentation = True if class_or_struct == 'struct': self.access = 'public' self.is_struct = True else: self.access = 'private' self.is_struct = False # Remember initial indentation level for this class. Using raw_lines here # instead of elided to account for leading comments. self.class_indent = GetIndentLevel(clean_lines.raw_lines[linenum]) # Try to find the end of the class. This will be confused by things like: # class A { # } *x = { ... # # But it's still good enough for CheckSectionSpacing. self.last_line = 0 depth = 0 for i in range(linenum, clean_lines.NumLines()): line = clean_lines.elided[i] depth += line.count('{') - line.count('}') if not depth: self.last_line = i break def CheckBegin(self, filename, clean_lines, linenum, error): # Look for a bare ':' if Search('(^|[^:]):($|[^:])', clean_lines.elided[linenum]): self.is_derived = True def CheckEnd(self, filename, clean_lines, linenum, error): # If there is a DISALLOW macro, it should appear near the end of # the class. seen_last_thing_in_class = False for i in xrange(linenum - 1, self.starting_linenum, -1): match = Search( r'\b(DISALLOW_COPY_AND_ASSIGN|DISALLOW_IMPLICIT_CONSTRUCTORS)\(' + self.name + r'\)', clean_lines.elided[i]) if match: if seen_last_thing_in_class: error(filename, i, 'readability/constructors', 3, match.group(1) + ' should be the last thing in the class') break if not Match(r'^\s*$', clean_lines.elided[i]): seen_last_thing_in_class = True # Check that closing brace is aligned with beginning of the class. # Only do this if the closing brace is indented by only whitespaces. # This means we will not check single-line class definitions. indent = Match(r'^( *)\}', clean_lines.elided[linenum]) if indent and len(indent.group(1)) != self.class_indent: if self.is_struct: parent = 'struct ' + self.name else: parent = 'class ' + self.name error(filename, linenum, 'whitespace/indent', 3, 'Closing brace should be aligned with beginning of %s' % parent) class _NamespaceInfo(_BlockInfo): """Stores information about a namespace.""" def __init__(self, name, linenum): _BlockInfo.__init__(self, False) self.name = name or '' self.starting_linenum = linenum self.check_namespace_indentation = True def CheckEnd(self, filename, clean_lines, linenum, error): """Check end of namespace comments.""" line = clean_lines.raw_lines[linenum] # Check how many lines is enclosed in this namespace. Don't issue # warning for missing namespace comments if there aren't enough # lines. However, do apply checks if there is already an end of # namespace comment and it's incorrect. # # TODO(unknown): We always want to check end of namespace comments # if a namespace is large, but sometimes we also want to apply the # check if a short namespace contained nontrivial things (something # other than forward declarations). There is currently no logic on # deciding what these nontrivial things are, so this check is # triggered by namespace size only, which works most of the time. if (linenum - self.starting_linenum < 10 and not Match(r'};*\s*(//|/\*).*\bnamespace\b', line)): return # Look for matching comment at end of namespace. # # Note that we accept C style "/* */" comments for terminating # namespaces, so that code that terminate namespaces inside # preprocessor macros can be cpplint clean. # # We also accept stuff like "// end of namespace ." with the # period at the end. # # Besides these, we don't accept anything else, otherwise we might # get false negatives when existing comment is a substring of the # expected namespace. if self.name: # Named namespace if not Match((r'};*\s*(//|/\*).*\bnamespace\s+' + re.escape(self.name) + r'[\*/\.\\\s]*$'), line): error(filename, linenum, 'readability/namespace', 5, 'Namespace should be terminated with "// namespace %s"' % self.name) else: # Anonymous namespace if not Match(r'};*\s*(//|/\*).*\bnamespace[\*/\.\\\s]*$', line): # If "// namespace anonymous" or "// anonymous namespace (more text)", # mention "// anonymous namespace" as an acceptable form if Match(r'}.*\b(namespace anonymous|anonymous namespace)\b', line): error(filename, linenum, 'readability/namespace', 5, 'Anonymous namespace should be terminated with "// namespace"' ' or "// anonymous namespace"') else: error(filename, linenum, 'readability/namespace', 5, 'Anonymous namespace should be terminated with "// namespace"') class _PreprocessorInfo(object): """Stores checkpoints of nesting stacks when #if/#else is seen.""" def __init__(self, stack_before_if): # The entire nesting stack before #if self.stack_before_if = stack_before_if # The entire nesting stack up to #else self.stack_before_else = [] # Whether we have already seen #else or #elif self.seen_else = False class NestingState(object): """Holds states related to parsing braces.""" def __init__(self): # Stack for tracking all braces. An object is pushed whenever we # see a "{", and popped when we see a "}". Only 3 types of # objects are possible: # - _ClassInfo: a class or struct. # - _NamespaceInfo: a namespace. # - _BlockInfo: some other type of block. self.stack = [] # Top of the previous stack before each Update(). # # Because the nesting_stack is updated at the end of each line, we # had to do some convoluted checks to find out what is the current # scope at the beginning of the line. This check is simplified by # saving the previous top of nesting stack. # # We could save the full stack, but we only need the top. Copying # the full nesting stack would slow down cpplint by ~10%. self.previous_stack_top = [] # Stack of _PreprocessorInfo objects. self.pp_stack = [] def SeenOpenBrace(self): """Check if we have seen the opening brace for the innermost block. Returns: True if we have seen the opening brace, False if the innermost block is still expecting an opening brace. """ return (not self.stack) or self.stack[-1].seen_open_brace def InNamespaceBody(self): """Check if we are currently one level inside a namespace body. Returns: True if top of the stack is a namespace block, False otherwise. """ return self.stack and isinstance(self.stack[-1], _NamespaceInfo) def InExternC(self): """Check if we are currently one level inside an 'extern "C"' block. Returns: True if top of the stack is an extern block, False otherwise. """ return self.stack and isinstance(self.stack[-1], _ExternCInfo) def InClassDeclaration(self): """Check if we are currently one level inside a class or struct declaration. Returns: True if top of the stack is a class/struct, False otherwise. """ return self.stack and isinstance(self.stack[-1], _ClassInfo) def InAsmBlock(self): """Check if we are currently one level inside an inline ASM block. Returns: True if the top of the stack is a block containing inline ASM. """ return self.stack and self.stack[-1].inline_asm != _NO_ASM def InTemplateArgumentList(self, clean_lines, linenum, pos): """Check if current position is inside template argument list. Args: clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. pos: position just after the suspected template argument. Returns: True if (linenum, pos) is inside template arguments. """ while linenum < clean_lines.NumLines(): # Find the earliest character that might indicate a template argument line = clean_lines.elided[linenum] match = Match(r'^[^{};=\[\]\.<>]*(.)', line[pos:]) if not match: linenum += 1 pos = 0 continue token = match.group(1) pos += len(match.group(0)) # These things do not look like template argument list: # class Suspect { # class Suspect x; } if token in ('{', '}', ';'): return False # These things look like template argument list: # template # template # template # template if token in ('>', '=', '[', ']', '.'): return True # Check if token is an unmatched '<'. # If not, move on to the next character. if token != '<': pos += 1 if pos >= len(line): linenum += 1 pos = 0 continue # We can't be sure if we just find a single '<', and need to # find the matching '>'. (_, end_line, end_pos) = CloseExpression(clean_lines, linenum, pos - 1) if end_pos < 0: # Not sure if template argument list or syntax error in file return False linenum = end_line pos = end_pos return False def UpdatePreprocessor(self, line): """Update preprocessor stack. We need to handle preprocessors due to classes like this: #ifdef SWIG struct ResultDetailsPageElementExtensionPoint { #else struct ResultDetailsPageElementExtensionPoint : public Extension { #endif We make the following assumptions (good enough for most files): - Preprocessor condition evaluates to true from #if up to first #else/#elif/#endif. - Preprocessor condition evaluates to false from #else/#elif up to #endif. We still perform lint checks on these lines, but these do not affect nesting stack. Args: line: current line to check. """ if Match(r'^\s*#\s*(if|ifdef|ifndef)\b', line): # Beginning of #if block, save the nesting stack here. The saved # stack will allow us to restore the parsing state in the #else case. self.pp_stack.append(_PreprocessorInfo(copy.deepcopy(self.stack))) elif Match(r'^\s*#\s*(else|elif)\b', line): # Beginning of #else block if self.pp_stack: if not self.pp_stack[-1].seen_else: # This is the first #else or #elif block. Remember the # whole nesting stack up to this point. This is what we # keep after the #endif. self.pp_stack[-1].seen_else = True self.pp_stack[-1].stack_before_else = copy.deepcopy(self.stack) # Restore the stack to how it was before the #if self.stack = copy.deepcopy(self.pp_stack[-1].stack_before_if) else: # TODO(unknown): unexpected #else, issue warning? pass elif Match(r'^\s*#\s*endif\b', line): # End of #if or #else blocks. if self.pp_stack: # If we saw an #else, we will need to restore the nesting # stack to its former state before the #else, otherwise we # will just continue from where we left off. if self.pp_stack[-1].seen_else: # Here we can just use a shallow copy since we are the last # reference to it. self.stack = self.pp_stack[-1].stack_before_else # Drop the corresponding #if self.pp_stack.pop() else: # TODO(unknown): unexpected #endif, issue warning? pass # TODO(unknown): Update() is too long, but we will refactor later. def Update(self, filename, clean_lines, linenum, error): """Update nesting state with current line. Args: filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. error: The function to call with any errors found. """ line = clean_lines.elided[linenum] # Remember top of the previous nesting stack. # # The stack is always pushed/popped and not modified in place, so # we can just do a shallow copy instead of copy.deepcopy. Using # deepcopy would slow down cpplint by ~28%. if self.stack: self.previous_stack_top = self.stack[-1] else: self.previous_stack_top = None # Update pp_stack self.UpdatePreprocessor(line) # Count parentheses. This is to avoid adding struct arguments to # the nesting stack. if self.stack: inner_block = self.stack[-1] depth_change = line.count('(') - line.count(')') inner_block.open_parentheses += depth_change # Also check if we are starting or ending an inline assembly block. if inner_block.inline_asm in (_NO_ASM, _END_ASM): if (depth_change != 0 and inner_block.open_parentheses == 1 and _MATCH_ASM.match(line)): # Enter assembly block inner_block.inline_asm = _INSIDE_ASM else: # Not entering assembly block. If previous line was _END_ASM, # we will now shift to _NO_ASM state. inner_block.inline_asm = _NO_ASM elif (inner_block.inline_asm == _INSIDE_ASM and inner_block.open_parentheses == 0): # Exit assembly block inner_block.inline_asm = _END_ASM # Consume namespace declaration at the beginning of the line. Do # this in a loop so that we catch same line declarations like this: # namespace proto2 { namespace bridge { class MessageSet; } } while True: # Match start of namespace. The "\b\s*" below catches namespace # declarations even if it weren't followed by a whitespace, this # is so that we don't confuse our namespace checker. The # missing spaces will be flagged by CheckSpacing. namespace_decl_match = Match(r'^\s*namespace\b\s*([:\w]+)?(.*)$', line) if not namespace_decl_match: break new_namespace = _NamespaceInfo(namespace_decl_match.group(1), linenum) self.stack.append(new_namespace) line = namespace_decl_match.group(2) if line.find('{') != -1: new_namespace.seen_open_brace = True line = line[line.find('{') + 1:] # Look for a class declaration in whatever is left of the line # after parsing namespaces. The regexp accounts for decorated classes # such as in: # class LOCKABLE API Object { # }; class_decl_match = Match( r'^(\s*(?:template\s*<[\w\s<>,:]*>\s*)?' r'(class|struct)\s+(?:[A-Z_]+\s+)*(\w+(?:::\w+)*))' r'(.*)$', line) if (class_decl_match and (not self.stack or self.stack[-1].open_parentheses == 0)): # We do not want to accept classes that are actually template arguments: # template , # template class Ignore3> # void Function() {}; # # To avoid template argument cases, we scan forward and look for # an unmatched '>'. If we see one, assume we are inside a # template argument list. end_declaration = len(class_decl_match.group(1)) if not self.InTemplateArgumentList(clean_lines, linenum, end_declaration): self.stack.append(_ClassInfo( class_decl_match.group(3), class_decl_match.group(2), clean_lines, linenum)) line = class_decl_match.group(4) # If we have not yet seen the opening brace for the innermost block, # run checks here. if not self.SeenOpenBrace(): self.stack[-1].CheckBegin(filename, clean_lines, linenum, error) # Update access control if we are inside a class/struct if self.stack and isinstance(self.stack[-1], _ClassInfo): classinfo = self.stack[-1] access_match = Match( r'^(.*)\b(public|private|protected|signals)(\s+(?:slots\s*)?)?' r':(?:[^:]|$)', line) if access_match: classinfo.access = access_match.group(2) # Check that access keywords are indented +1 space. Skip this # check if the keywords are not preceded by whitespaces. indent = access_match.group(1) if (len(indent) != classinfo.class_indent + 1 and Match(r'^\s*$', indent)): if classinfo.is_struct: parent = 'struct ' + classinfo.name else: parent = 'class ' + classinfo.name slots = '' if access_match.group(3): slots = access_match.group(3) error(filename, linenum, 'whitespace/indent', 3, '%s%s: should be indented +1 space inside %s' % ( access_match.group(2), slots, parent)) # Consume braces or semicolons from what's left of the line while True: # Match first brace, semicolon, or closed parenthesis. matched = Match(r'^[^{;)}]*([{;)}])(.*)$', line) if not matched: break token = matched.group(1) if token == '{': # If namespace or class hasn't seen a opening brace yet, mark # namespace/class head as complete. Push a new block onto the # stack otherwise. if not self.SeenOpenBrace(): self.stack[-1].seen_open_brace = True elif Match(r'^extern\s*"[^"]*"\s*\{', line): self.stack.append(_ExternCInfo()) else: self.stack.append(_BlockInfo(True)) if _MATCH_ASM.match(line): self.stack[-1].inline_asm = _BLOCK_ASM elif token == ';' or token == ')': # If we haven't seen an opening brace yet, but we already saw # a semicolon, this is probably a forward declaration. Pop # the stack for these. # # Similarly, if we haven't seen an opening brace yet, but we # already saw a closing parenthesis, then these are probably # function arguments with extra "class" or "struct" keywords. # Also pop these stack for these. if not self.SeenOpenBrace(): self.stack.pop() else: # token == '}' # Perform end of block checks and pop the stack. if self.stack: self.stack[-1].CheckEnd(filename, clean_lines, linenum, error) self.stack.pop() line = matched.group(2) def InnermostClass(self): """Get class info on the top of the stack. Returns: A _ClassInfo object if we are inside a class, or None otherwise. """ for i in range(len(self.stack), 0, -1): classinfo = self.stack[i - 1] if isinstance(classinfo, _ClassInfo): return classinfo return None def CheckCompletedBlocks(self, filename, error): """Checks that all classes and namespaces have been completely parsed. Call this when all lines in a file have been processed. Args: filename: The name of the current file. error: The function to call with any errors found. """ # Note: This test can result in false positives if #ifdef constructs # get in the way of brace matching. See the testBuildClass test in # cpplint_unittest.py for an example of this. for obj in self.stack: if isinstance(obj, _ClassInfo): error(filename, obj.starting_linenum, 'build/class', 5, 'Failed to find complete declaration of class %s' % obj.name) elif isinstance(obj, _NamespaceInfo): error(filename, obj.starting_linenum, 'build/namespaces', 5, 'Failed to find complete declaration of namespace %s' % obj.name) def CheckForNonStandardConstructs(filename, clean_lines, linenum, nesting_state, error): r"""Logs an error if we see certain non-ANSI constructs ignored by gcc-2. Complain about several constructs which gcc-2 accepts, but which are not standard C++. Warning about these in lint is one way to ease the transition to new compilers. - put storage class first (e.g. "static const" instead of "const static"). - "%lld" instead of %qd" in printf-type functions. - "%1$d" is non-standard in printf-type functions. - "\%" is an undefined character escape sequence. - text after #endif is not allowed. - invalid inner-style forward declaration. - >? and ?= and )\?=?\s*(\w+|[+-]?\d+)(\.\d*)?', line): error(filename, linenum, 'build/deprecated', 3, '>? and ))?' # r'\s*const\s*' + type_name + '\s*&\s*\w+\s*;' error(filename, linenum, 'runtime/member_string_references', 2, 'const string& members are dangerous. It is much better to use ' 'alternatives, such as pointers or simple constants.') # Everything else in this function operates on class declarations. # Return early if the top of the nesting stack is not a class, or if # the class head is not completed yet. classinfo = nesting_state.InnermostClass() if not classinfo or not classinfo.seen_open_brace: return # The class may have been declared with namespace or classname qualifiers. # The constructor and destructor will not have those qualifiers. base_classname = classinfo.name.split('::')[-1] # Look for single-argument constructors that aren't marked explicit. # Technically a valid construct, but against style. Also look for # non-single-argument constructors which are also technically valid, but # strongly suggest something is wrong. explicit_constructor_match = Match( r'\s+(?:inline\s+)?(explicit\s+)?(?:inline\s+)?%s\s*' r'\(((?:[^()]|\([^()]*\))*)\)' % re.escape(base_classname), line) if explicit_constructor_match: is_marked_explicit = explicit_constructor_match.group(1) if not explicit_constructor_match.group(2): constructor_args = [] else: constructor_args = explicit_constructor_match.group(2).split(',') # collapse arguments so that commas in template parameter lists and function # argument parameter lists don't split arguments in two i = 0 while i < len(constructor_args): constructor_arg = constructor_args[i] while (constructor_arg.count('<') > constructor_arg.count('>') or constructor_arg.count('(') > constructor_arg.count(')')): constructor_arg += ',' + constructor_args[i + 1] del constructor_args[i + 1] constructor_args[i] = constructor_arg i += 1 defaulted_args = [arg for arg in constructor_args if '=' in arg] noarg_constructor = (not constructor_args or # empty arg list # 'void' arg specifier (len(constructor_args) == 1 and constructor_args[0].strip() == 'void')) onearg_constructor = ((len(constructor_args) == 1 and # exactly one arg not noarg_constructor) or # all but at most one arg defaulted (len(constructor_args) >= 1 and not noarg_constructor and len(defaulted_args) >= len(constructor_args) - 1)) initializer_list_constructor = bool( onearg_constructor and Search(r'\bstd\s*::\s*initializer_list\b', constructor_args[0])) copy_constructor = bool( onearg_constructor and Match(r'(const\s+)?%s(\s*<[^>]*>)?(\s+const)?\s*(?:<\w+>\s*)?&' % re.escape(base_classname), constructor_args[0].strip())) if (not is_marked_explicit and onearg_constructor and not initializer_list_constructor and not copy_constructor): if defaulted_args: error(filename, linenum, 'runtime/explicit', 5, 'Constructors callable with one argument ' 'should be marked explicit.') else: error(filename, linenum, 'runtime/explicit', 5, 'Single-parameter constructors should be marked explicit.') elif is_marked_explicit and not onearg_constructor: if noarg_constructor: error(filename, linenum, 'runtime/explicit', 5, 'Zero-parameter constructors should not be marked explicit.') else: error(filename, linenum, 'runtime/explicit', 0, 'Constructors that require multiple arguments ' 'should not be marked explicit.') def CheckSpacingForFunctionCall(filename, clean_lines, linenum, error): """Checks for the correctness of various spacing around function calls. Args: filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. error: The function to call with any errors found. """ line = clean_lines.elided[linenum] # Since function calls often occur inside if/for/while/switch # expressions - which have their own, more liberal conventions - we # first see if we should be looking inside such an expression for a # function call, to which we can apply more strict standards. fncall = line # if there's no control flow construct, look at whole line for pattern in (r'\bif\s*\((.*)\)\s*{', r'\bfor\s*\((.*)\)\s*{', r'\bwhile\s*\((.*)\)\s*[{;]', r'\bswitch\s*\((.*)\)\s*{'): match = Search(pattern, line) if match: fncall = match.group(1) # look inside the parens for function calls break # Except in if/for/while/switch, there should never be space # immediately inside parens (eg "f( 3, 4 )"). We make an exception # for nested parens ( (a+b) + c ). Likewise, there should never be # a space before a ( when it's a function argument. I assume it's a # function argument when the char before the whitespace is legal in # a function name (alnum + _) and we're not starting a macro. Also ignore # pointers and references to arrays and functions coz they're too tricky: # we use a very simple way to recognize these: # " (something)(maybe-something)" or # " (something)(maybe-something," or # " (something)[something]" # Note that we assume the contents of [] to be short enough that # they'll never need to wrap. if ( # Ignore control structures. not Search(r'\b(if|for|while|switch|return|new|delete|catch|sizeof)\b', fncall) and # Ignore pointers/references to functions. not Search(r' \([^)]+\)\([^)]*(\)|,$)', fncall) and # Ignore pointers/references to arrays. not Search(r' \([^)]+\)\[[^\]]+\]', fncall)): if Search(r'\w\s*\(\s(?!\s*\\$)', fncall): # a ( used for a fn call error(filename, linenum, 'whitespace/parens', 4, 'Extra space after ( in function call') elif Search(r'\(\s+(?!(\s*\\)|\()', fncall): error(filename, linenum, 'whitespace/parens', 2, 'Extra space after (') if (Search(r'\w\s+\(', fncall) and not Search(r'#\s*define|typedef|using\s+\w+\s*=', fncall) and not Search(r'\w\s+\((\w+::)*\*\w+\)\(', fncall) and not Search(r'\bcase\s+\(', fncall)): # TODO(unknown): Space after an operator function seem to be a common # error, silence those for now by restricting them to highest verbosity. if Search(r'\boperator_*\b', line): error(filename, linenum, 'whitespace/parens', 0, 'Extra space before ( in function call') else: error(filename, linenum, 'whitespace/parens', 4, 'Extra space before ( in function call') # If the ) is followed only by a newline or a { + newline, assume it's # part of a control statement (if/while/etc), and don't complain if Search(r'[^)]\s+\)\s*[^{\s]', fncall): # If the closing parenthesis is preceded by only whitespaces, # try to give a more descriptive error message. if Search(r'^\s+\)', fncall): error(filename, linenum, 'whitespace/parens', 2, 'Closing ) should be moved to the previous line') else: error(filename, linenum, 'whitespace/parens', 2, 'Extra space before )') def IsBlankLine(line): """Returns true if the given line is blank. We consider a line to be blank if the line is empty or consists of only white spaces. Args: line: A line of a string. Returns: True, if the given line is blank. """ return not line or line.isspace() def CheckForNamespaceIndentation(filename, nesting_state, clean_lines, line, error): is_namespace_indent_item = ( len(nesting_state.stack) > 1 and nesting_state.stack[-1].check_namespace_indentation and isinstance(nesting_state.previous_stack_top, _NamespaceInfo) and nesting_state.previous_stack_top == nesting_state.stack[-2]) if ShouldCheckNamespaceIndentation(nesting_state, is_namespace_indent_item, clean_lines.elided, line): CheckItemIndentationInNamespace(filename, clean_lines.elided, line, error) def CheckForFunctionLengths(filename, clean_lines, linenum, function_state, error): """Reports for long function bodies. For an overview why this is done, see: http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Write_Short_Functions Uses a simplistic algorithm assuming other style guidelines (especially spacing) are followed. Only checks unindented functions, so class members are unchecked. Trivial bodies are unchecked, so constructors with huge initializer lists may be missed. Blank/comment lines are not counted so as to avoid encouraging the removal of vertical space and comments just to get through a lint check. NOLINT *on the last line of a function* disables this check. Args: filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. function_state: Current function name and lines in body so far. error: The function to call with any errors found. """ lines = clean_lines.lines line = lines[linenum] joined_line = '' starting_func = False regexp = r'(\w(\w|::|\*|\&|\s)*)\(' # decls * & space::name( ... match_result = Match(regexp, line) if match_result: # If the name is all caps and underscores, figure it's a macro and # ignore it, unless it's TEST or TEST_F. function_name = match_result.group(1).split()[-1] if function_name == 'TEST' or function_name == 'TEST_F' or ( not Match(r'[A-Z_]+$', function_name)): starting_func = True if starting_func: body_found = False for start_linenum in xrange(linenum, clean_lines.NumLines()): start_line = lines[start_linenum] joined_line += ' ' + start_line.lstrip() if Search(r'(;|})', start_line): # Declarations and trivial functions body_found = True break # ... ignore elif Search(r'{', start_line): body_found = True function = Search(r'((\w|:)*)\(', line).group(1) if Match(r'TEST', function): # Handle TEST... macros parameter_regexp = Search(r'(\(.*\))', joined_line) if parameter_regexp: # Ignore bad syntax function += parameter_regexp.group(1) else: function += '()' function_state.Begin(function) break if not body_found: # No body for the function (or evidence of a non-function) was found. error(filename, linenum, 'readability/fn_size', 5, 'Lint failed to find start of function body.') elif Match(r'^\}\s*$', line): # function end function_state.Check(error, filename, linenum) function_state.End() elif not Match(r'^\s*$', line): function_state.Count() # Count non-blank/non-comment lines. _RE_PATTERN_TODO = re.compile(r'^//(\s*)TODO(\(.+?\))?:?(\s|$)?') def CheckComment(line, filename, linenum, next_line_start, error): """Checks for common mistakes in comments. Args: line: The line in question. filename: The name of the current file. linenum: The number of the line to check. next_line_start: The first non-whitespace column of the next line. error: The function to call with any errors found. """ commentpos = line.find('//') if commentpos != -1: # Check if the // may be in quotes. If so, ignore it # Comparisons made explicit for clarity -- pylint: disable=g-explicit-bool-comparison if (line.count('"', 0, commentpos) - line.count('\\"', 0, commentpos)) % 2 == 0: # not in quotes # Allow one space for new scopes, two spaces otherwise: if (not (Match(r'^.*{ *//', line) and next_line_start == commentpos) and ((commentpos >= 1 and line[commentpos-1] not in string.whitespace) or (commentpos >= 2 and line[commentpos-2] not in string.whitespace))): error(filename, linenum, 'whitespace/comments', 2, 'At least two spaces is best between code and comments') # Checks for common mistakes in TODO comments. comment = line[commentpos:] match = _RE_PATTERN_TODO.match(comment) if match: # One whitespace is correct; zero whitespace is handled elsewhere. leading_whitespace = match.group(1) if len(leading_whitespace) > 1: error(filename, linenum, 'whitespace/todo', 2, 'Too many spaces before TODO') username = match.group(2) if not username: error(filename, linenum, 'readability/todo', 2, 'Missing username in TODO; it should look like ' '"// TODO(my_username): Stuff."') middle_whitespace = match.group(3) # Comparisons made explicit for correctness -- pylint: disable=g-explicit-bool-comparison if middle_whitespace != ' ' and middle_whitespace != '': error(filename, linenum, 'whitespace/todo', 2, 'TODO(my_username) should be followed by a space') # If the comment contains an alphanumeric character, there # should be a space somewhere between it and the // unless # it's a /// or //! Doxygen comment. if (Match(r'//[^ ]*\w', comment) and not Match(r'(///|//\!)(\s+|$)', comment)): error(filename, linenum, 'whitespace/comments', 4, 'Should have a space between // and comment') def CheckAccess(filename, clean_lines, linenum, nesting_state, error): """Checks for improper use of DISALLOW* macros. Args: filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. nesting_state: A NestingState instance which maintains information about the current stack of nested blocks being parsed. error: The function to call with any errors found. """ line = clean_lines.elided[linenum] # get rid of comments and strings matched = Match((r'\s*(DISALLOW_COPY_AND_ASSIGN|' r'DISALLOW_IMPLICIT_CONSTRUCTORS)'), line) if not matched: return if nesting_state.stack and isinstance(nesting_state.stack[-1], _ClassInfo): if nesting_state.stack[-1].access != 'private': error(filename, linenum, 'readability/constructors', 3, '%s must be in the private: section' % matched.group(1)) else: # Found DISALLOW* macro outside a class declaration, or perhaps it # was used inside a function when it should have been part of the # class declaration. We could issue a warning here, but it # probably resulted in a compiler error already. pass def CheckSpacing(filename, clean_lines, linenum, nesting_state, error): """Checks for the correctness of various spacing issues in the code. Things we check for: spaces around operators, spaces after if/for/while/switch, no spaces around parens in function calls, two spaces between code and comment, don't start a block with a blank line, don't end a function with a blank line, don't add a blank line after public/protected/private, don't have too many blank lines in a row. Args: filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. nesting_state: A NestingState instance which maintains information about the current stack of nested blocks being parsed. error: The function to call with any errors found. """ # Don't use "elided" lines here, otherwise we can't check commented lines. # Don't want to use "raw" either, because we don't want to check inside C++11 # raw strings, raw = clean_lines.lines_without_raw_strings line = raw[linenum] # Before nixing comments, check if the line is blank for no good # reason. This includes the first line after a block is opened, and # blank lines at the end of a function (ie, right before a line like '}' # # Skip all the blank line checks if we are immediately inside a # namespace body. In other words, don't issue blank line warnings # for this block: # namespace { # # } # # A warning about missing end of namespace comments will be issued instead. # # Also skip blank line checks for 'extern "C"' blocks, which are formatted # like namespaces. if (IsBlankLine(line) and not nesting_state.InNamespaceBody() and not nesting_state.InExternC()): elided = clean_lines.elided prev_line = elided[linenum - 1] prevbrace = prev_line.rfind('{') # TODO(unknown): Don't complain if line before blank line, and line after, # both start with alnums and are indented the same amount. # This ignores whitespace at the start of a namespace block # because those are not usually indented. if prevbrace != -1 and prev_line[prevbrace:].find('}') == -1: # OK, we have a blank line at the start of a code block. Before we # complain, we check if it is an exception to the rule: The previous # non-empty line has the parameters of a function header that are indented # 4 spaces (because they did not fit in a 80 column line when placed on # the same line as the function name). We also check for the case where # the previous line is indented 6 spaces, which may happen when the # initializers of a constructor do not fit into a 80 column line. exception = False if Match(r' {6}\w', prev_line): # Initializer list? # We are looking for the opening column of initializer list, which # should be indented 4 spaces to cause 6 space indentation afterwards. search_position = linenum-2 while (search_position >= 0 and Match(r' {6}\w', elided[search_position])): search_position -= 1 exception = (search_position >= 0 and elided[search_position][:5] == ' :') else: # Search for the function arguments or an initializer list. We use a # simple heuristic here: If the line is indented 4 spaces; and we have a # closing paren, without the opening paren, followed by an opening brace # or colon (for initializer lists) we assume that it is the last line of # a function header. If we have a colon indented 4 spaces, it is an # initializer list. exception = (Match(r' {4}\w[^\(]*\)\s*(const\s*)?(\{\s*$|:)', prev_line) or Match(r' {4}:', prev_line)) if not exception: error(filename, linenum, 'whitespace/blank_line', 2, 'Redundant blank line at the start of a code block ' 'should be deleted.') # Ignore blank lines at the end of a block in a long if-else # chain, like this: # if (condition1) { # // Something followed by a blank line # # } else if (condition2) { # // Something else # } if linenum + 1 < clean_lines.NumLines(): next_line = raw[linenum + 1] if (next_line and Match(r'\s*}', next_line) and next_line.find('} else ') == -1): error(filename, linenum, 'whitespace/blank_line', 3, 'Redundant blank line at the end of a code block ' 'should be deleted.') matched = Match(r'\s*(public|protected|private):', prev_line) if matched: error(filename, linenum, 'whitespace/blank_line', 3, 'Do not leave a blank line after "%s:"' % matched.group(1)) # Next, check comments next_line_start = 0 if linenum + 1 < clean_lines.NumLines(): next_line = raw[linenum + 1] next_line_start = len(next_line) - len(next_line.lstrip()) CheckComment(line, filename, linenum, next_line_start, error) # get rid of comments and strings line = clean_lines.elided[linenum] # You shouldn't have spaces before your brackets, except maybe after # 'delete []' or 'return []() {};' if Search(r'\w\s+\[', line) and not Search(r'(?:delete|return)\s+\[', line): error(filename, linenum, 'whitespace/braces', 5, 'Extra space before [') # In range-based for, we wanted spaces before and after the colon, but # not around "::" tokens that might appear. if (Search(r'for *\(.*[^:]:[^: ]', line) or Search(r'for *\(.*[^: ]:[^:]', line)): error(filename, linenum, 'whitespace/forcolon', 2, 'Missing space around colon in range-based for loop') def CheckOperatorSpacing(filename, clean_lines, linenum, error): """Checks for horizontal spacing around operators. Args: filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. error: The function to call with any errors found. """ line = clean_lines.elided[linenum] # Don't try to do spacing checks for operator methods. Do this by # replacing the troublesome characters with something else, # preserving column position for all other characters. # # The replacement is done repeatedly to avoid false positives from # operators that call operators. while True: match = Match(r'^(.*\boperator\b)(\S+)(\s*\(.*)$', line) if match: line = match.group(1) + ('_' * len(match.group(2))) + match.group(3) else: break # We allow no-spaces around = within an if: "if ( (a=Foo()) == 0 )". # Otherwise not. Note we only check for non-spaces on *both* sides; # sometimes people put non-spaces on one side when aligning ='s among # many lines (not that this is behavior that I approve of...) if ((Search(r'[\w.]=', line) or Search(r'=[\w.]', line)) and not Search(r'\b(if|while|for) ', line) # Operators taken from [lex.operators] in C++11 standard. and not Search(r'(>=|<=|==|!=|&=|\^=|\|=|\+=|\*=|\/=|\%=)', line) and not Search(r'operator=', line)): error(filename, linenum, 'whitespace/operators', 4, 'Missing spaces around =') # It's ok not to have spaces around binary operators like + - * /, but if # there's too little whitespace, we get concerned. It's hard to tell, # though, so we punt on this one for now. TODO. # You should always have whitespace around binary operators. # # Check <= and >= first to avoid false positives with < and >, then # check non-include lines for spacing around < and >. # # If the operator is followed by a comma, assume it's be used in a # macro context and don't do any checks. This avoids false # positives. # # Note that && is not included here. Those are checked separately # in CheckRValueReference match = Search(r'[^<>=!\s](==|!=|<=|>=|\|\|)[^<>=!\s,;\)]', line) if match: error(filename, linenum, 'whitespace/operators', 3, 'Missing spaces around %s' % match.group(1)) elif not Match(r'#.*include', line): # Look for < that is not surrounded by spaces. This is only # triggered if both sides are missing spaces, even though # technically should should flag if at least one side is missing a # space. This is done to avoid some false positives with shifts. match = Match(r'^(.*[^\s<])<[^\s=<,]', line) if match: (_, _, end_pos) = CloseExpression( clean_lines, linenum, len(match.group(1))) if end_pos <= -1: error(filename, linenum, 'whitespace/operators', 3, 'Missing spaces around <') # Look for > that is not surrounded by spaces. Similar to the # above, we only trigger if both sides are missing spaces to avoid # false positives with shifts. match = Match(r'^(.*[^-\s>])>[^\s=>,]', line) if match: (_, _, start_pos) = ReverseCloseExpression( clean_lines, linenum, len(match.group(1))) if start_pos <= -1: error(filename, linenum, 'whitespace/operators', 3, 'Missing spaces around >') # We allow no-spaces around << when used like this: 10<<20, but # not otherwise (particularly, not when used as streams) # # We also allow operators following an opening parenthesis, since # those tend to be macros that deal with operators. match = Search(r'(operator|[^\s(<])(?:L|UL|ULL|l|ul|ull)?<<([^\s,=<])', line) if (match and not (match.group(1).isdigit() and match.group(2).isdigit()) and not (match.group(1) == 'operator' and match.group(2) == ';')): error(filename, linenum, 'whitespace/operators', 3, 'Missing spaces around <<') # We allow no-spaces around >> for almost anything. This is because # C++11 allows ">>" to close nested templates, which accounts for # most cases when ">>" is not followed by a space. # # We still warn on ">>" followed by alpha character, because that is # likely due to ">>" being used for right shifts, e.g.: # value >> alpha # # When ">>" is used to close templates, the alphanumeric letter that # follows would be part of an identifier, and there should still be # a space separating the template type and the identifier. # type> alpha match = Search(r'>>[a-zA-Z_]', line) if match: error(filename, linenum, 'whitespace/operators', 3, 'Missing spaces around >>') # There shouldn't be space around unary operators match = Search(r'(!\s|~\s|[\s]--[\s;]|[\s]\+\+[\s;])', line) if match: error(filename, linenum, 'whitespace/operators', 4, 'Extra space for operator %s' % match.group(1)) def CheckParenthesisSpacing(filename, clean_lines, linenum, error): """Checks for horizontal spacing around parentheses. Args: filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. error: The function to call with any errors found. """ line = clean_lines.elided[linenum] # No spaces after an if, while, switch, or for match = Search(r' (if\(|for\(|while\(|switch\()', line) if match: error(filename, linenum, 'whitespace/parens', 5, 'Missing space before ( in %s' % match.group(1)) # For if/for/while/switch, the left and right parens should be # consistent about how many spaces are inside the parens, and # there should either be zero or one spaces inside the parens. # We don't want: "if ( foo)" or "if ( foo )". # Exception: "for ( ; foo; bar)" and "for (foo; bar; )" are allowed. match = Search(r'\b(if|for|while|switch)\s*' r'\(([ ]*)(.).*[^ ]+([ ]*)\)\s*{\s*$', line) if match: if len(match.group(2)) != len(match.group(4)): if not (match.group(3) == ';' and len(match.group(2)) == 1 + len(match.group(4)) or not match.group(2) and Search(r'\bfor\s*\(.*; \)', line)): error(filename, linenum, 'whitespace/parens', 5, 'Mismatching spaces inside () in %s' % match.group(1)) if len(match.group(2)) not in [0, 1]: error(filename, linenum, 'whitespace/parens', 5, 'Should have zero or one spaces inside ( and ) in %s' % match.group(1)) def CheckCommaSpacing(filename, clean_lines, linenum, error): """Checks for horizontal spacing near commas and semicolons. Args: filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. error: The function to call with any errors found. """ raw = clean_lines.lines_without_raw_strings line = clean_lines.elided[linenum] # You should always have a space after a comma (either as fn arg or operator) # # This does not apply when the non-space character following the # comma is another comma, since the only time when that happens is # for empty macro arguments. # # We run this check in two passes: first pass on elided lines to # verify that lines contain missing whitespaces, second pass on raw # lines to confirm that those missing whitespaces are not due to # elided comments. if (Search(r',[^,\s]', ReplaceAll(r'\boperator\s*,\s*\(', 'F(', line)) and Search(r',[^,\s]', raw[linenum])): error(filename, linenum, 'whitespace/comma', 3, 'Missing space after ,') # You should always have a space after a semicolon # except for few corner cases # TODO(unknown): clarify if 'if (1) { return 1;}' is requires one more # space after ; if Search(r';[^\s};\\)/]', line): error(filename, linenum, 'whitespace/semicolon', 3, 'Missing space after ;') def CheckBracesSpacing(filename, clean_lines, linenum, error): """Checks for horizontal spacing near commas. Args: filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. error: The function to call with any errors found. """ line = clean_lines.elided[linenum] # Except after an opening paren, or after another opening brace (in case of # an initializer list, for instance), you should have spaces before your # braces. And since you should never have braces at the beginning of a line, # this is an easy test. match = Match(r'^(.*[^ ({>]){', line) if match: # Try a bit harder to check for brace initialization. This # happens in one of the following forms: # Constructor() : initializer_list_{} { ... } # Constructor{}.MemberFunction() # Type variable{}; # FunctionCall(type{}, ...); # LastArgument(..., type{}); # LOG(INFO) << type{} << " ..."; # map_of_type[{...}] = ...; # ternary = expr ? new type{} : nullptr; # OuterTemplate{}> # # We check for the character following the closing brace, and # silence the warning if it's one of those listed above, i.e. # "{.;,)<>]:". # # To account for nested initializer list, we allow any number of # closing braces up to "{;,)<". We can't simply silence the # warning on first sight of closing brace, because that would # cause false negatives for things that are not initializer lists. # Silence this: But not this: # Outer{ if (...) { # Inner{...} if (...){ // Missing space before { # }; } # # There is a false negative with this approach if people inserted # spurious semicolons, e.g. "if (cond){};", but we will catch the # spurious semicolon with a separate check. (endline, endlinenum, endpos) = CloseExpression( clean_lines, linenum, len(match.group(1))) trailing_text = '' if endpos > -1: trailing_text = endline[endpos:] for offset in xrange(endlinenum + 1, min(endlinenum + 3, clean_lines.NumLines() - 1)): trailing_text += clean_lines.elided[offset] if not Match(r'^[\s}]*[{.;,)<>\]:]', trailing_text): error(filename, linenum, 'whitespace/braces', 5, 'Missing space before {') # Make sure '} else {' has spaces. if Search(r'}else', line): error(filename, linenum, 'whitespace/braces', 5, 'Missing space before else') # You shouldn't have a space before a semicolon at the end of the line. # There's a special case for "for" since the style guide allows space before # the semicolon there. if Search(r':\s*;\s*$', line): error(filename, linenum, 'whitespace/semicolon', 5, 'Semicolon defining empty statement. Use {} instead.') elif Search(r'^\s*;\s*$', line): error(filename, linenum, 'whitespace/semicolon', 5, 'Line contains only semicolon. If this should be an empty statement, ' 'use {} instead.') elif (Search(r'\s+;\s*$', line) and not Search(r'\bfor\b', line)): error(filename, linenum, 'whitespace/semicolon', 5, 'Extra space before last semicolon. If this should be an empty ' 'statement, use {} instead.') def IsDecltype(clean_lines, linenum, column): """Check if the token ending on (linenum, column) is decltype(). Args: clean_lines: A CleansedLines instance containing the file. linenum: the number of the line to check. column: end column of the token to check. Returns: True if this token is decltype() expression, False otherwise. """ (text, _, start_col) = ReverseCloseExpression(clean_lines, linenum, column) if start_col < 0: return False if Search(r'\bdecltype\s*$', text[0:start_col]): return True return False def IsTemplateParameterList(clean_lines, linenum, column): """Check if the token ending on (linenum, column) is the end of template<>. Args: clean_lines: A CleansedLines instance containing the file. linenum: the number of the line to check. column: end column of the token to check. Returns: True if this token is end of a template parameter list, False otherwise. """ (_, startline, startpos) = ReverseCloseExpression( clean_lines, linenum, column) if (startpos > -1 and Search(r'\btemplate\s*$', clean_lines.elided[startline][0:startpos])): return True return False def IsRValueType(typenames, clean_lines, nesting_state, linenum, column): """Check if the token ending on (linenum, column) is a type. Assumes that text to the right of the column is "&&" or a function name. Args: typenames: set of type names from template-argument-list. clean_lines: A CleansedLines instance containing the file. nesting_state: A NestingState instance which maintains information about the current stack of nested blocks being parsed. linenum: the number of the line to check. column: end column of the token to check. Returns: True if this token is a type, False if we are not sure. """ prefix = clean_lines.elided[linenum][0:column] # Get one word to the left. If we failed to do so, this is most # likely not a type, since it's unlikely that the type name and "&&" # would be split across multiple lines. match = Match(r'^(.*)(\b\w+|[>*)&])\s*$', prefix) if not match: return False # Check text following the token. If it's "&&>" or "&&," or "&&...", it's # most likely a rvalue reference used inside a template. suffix = clean_lines.elided[linenum][column:] if Match(r'&&\s*(?:[>,]|\.\.\.)', suffix): return True # Check for known types and end of templates: # int&& variable # vector&& variable # # Because this function is called recursively, we also need to # recognize pointer and reference types: # int* Function() # int& Function() if (match.group(2) in typenames or match.group(2) in ['char', 'char16_t', 'char32_t', 'wchar_t', 'bool', 'short', 'int', 'long', 'signed', 'unsigned', 'float', 'double', 'void', 'auto', '>', '*', '&']): return True # If we see a close parenthesis, look for decltype on the other side. # decltype would unambiguously identify a type, anything else is # probably a parenthesized expression and not a type. if match.group(2) == ')': return IsDecltype( clean_lines, linenum, len(match.group(1)) + len(match.group(2)) - 1) # Check for casts and cv-qualifiers. # match.group(1) remainder # -------------- --------- # const_cast< type&& # const type&& # type const&& if Search(r'\b(?:const_cast\s*<|static_cast\s*<|dynamic_cast\s*<|' r'reinterpret_cast\s*<|\w+\s)\s*$', match.group(1)): return True # Look for a preceding symbol that might help differentiate the context. # These are the cases that would be ambiguous: # match.group(1) remainder # -------------- --------- # Call ( expression && # Declaration ( type&& # sizeof ( type&& # if ( expression && # while ( expression && # for ( type&& # for( ; expression && # statement ; type&& # block { type&& # constructor { expression && start = linenum line = match.group(1) match_symbol = None while start >= 0: # We want to skip over identifiers and commas to get to a symbol. # Commas are skipped so that we can find the opening parenthesis # for function parameter lists. match_symbol = Match(r'^(.*)([^\w\s,])[\w\s,]*$', line) if match_symbol: break start -= 1 line = clean_lines.elided[start] if not match_symbol: # Probably the first statement in the file is an rvalue reference return True if match_symbol.group(2) == '}': # Found closing brace, probably an indicate of this: # block{} type&& return True if match_symbol.group(2) == ';': # Found semicolon, probably one of these: # for(; expression && # statement; type&& # Look for the previous 'for(' in the previous lines. before_text = match_symbol.group(1) for i in xrange(start - 1, max(start - 6, 0), -1): before_text = clean_lines.elided[i] + before_text if Search(r'for\s*\([^{};]*$', before_text): # This is the condition inside a for-loop return False # Did not find a for-init-statement before this semicolon, so this # is probably a new statement and not a condition. return True if match_symbol.group(2) == '{': # Found opening brace, probably one of these: # block{ type&& = ... ; } # constructor{ expression && expression } # Look for a closing brace or a semicolon. If we see a semicolon # first, this is probably a rvalue reference. line = clean_lines.elided[start][0:len(match_symbol.group(1)) + 1] end = start depth = 1 while True: for ch in line: if ch == ';': return True elif ch == '{': depth += 1 elif ch == '}': depth -= 1 if depth == 0: return False end += 1 if end >= clean_lines.NumLines(): break line = clean_lines.elided[end] # Incomplete program? return False if match_symbol.group(2) == '(': # Opening parenthesis. Need to check what's to the left of the # parenthesis. Look back one extra line for additional context. before_text = match_symbol.group(1) if linenum > 1: before_text = clean_lines.elided[linenum - 1] + before_text before_text = match_symbol.group(1) # Patterns that are likely to be types: # [](type&& # for (type&& # sizeof(type&& # operator=(type&& # if Search(r'(?:\]|\bfor|\bsizeof|\boperator\s*\S+\s*)\s*$', before_text): return True # Patterns that are likely to be expressions: # if (expression && # while (expression && # : initializer(expression && # , initializer(expression && # ( FunctionCall(expression && # + FunctionCall(expression && # + (expression && # # The last '+' represents operators such as '+' and '-'. if Search(r'(?:\bif|\bwhile|[-+=%^(]*>)?\s*$', match_symbol.group(1)) if match_func: # Check for constructors, which don't have return types. if Search(r'\b(?:explicit|inline)$', match_func.group(1)): return True implicit_constructor = Match(r'\s*(\w+)\((?:const\s+)?(\w+)', prefix) if (implicit_constructor and implicit_constructor.group(1) == implicit_constructor.group(2)): return True return IsRValueType(typenames, clean_lines, nesting_state, linenum, len(match_func.group(1))) # Nothing before the function name. If this is inside a block scope, # this is probably a function call. return not (nesting_state.previous_stack_top and nesting_state.previous_stack_top.IsBlockInfo()) if match_symbol.group(2) == '>': # Possibly a closing bracket, check that what's on the other side # looks like the start of a template. return IsTemplateParameterList( clean_lines, start, len(match_symbol.group(1))) # Some other symbol, usually something like "a=b&&c". This is most # likely not a type. return False def IsDeletedOrDefault(clean_lines, linenum): """Check if current constructor or operator is deleted or default. Args: clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. Returns: True if this is a deleted or default constructor. """ open_paren = clean_lines.elided[linenum].find('(') if open_paren < 0: return False (close_line, _, close_paren) = CloseExpression( clean_lines, linenum, open_paren) if close_paren < 0: return False return Match(r'\s*=\s*(?:delete|default)\b', close_line[close_paren:]) def IsRValueAllowed(clean_lines, linenum, typenames): """Check if RValue reference is allowed on a particular line. Args: clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. typenames: set of type names from template-argument-list. Returns: True if line is within the region where RValue references are allowed. """ # Allow region marked by PUSH/POP macros for i in xrange(linenum, 0, -1): line = clean_lines.elided[i] if Match(r'GOOGLE_ALLOW_RVALUE_REFERENCES_(?:PUSH|POP)', line): if not line.endswith('PUSH'): return False for j in xrange(linenum, clean_lines.NumLines(), 1): line = clean_lines.elided[j] if Match(r'GOOGLE_ALLOW_RVALUE_REFERENCES_(?:PUSH|POP)', line): return line.endswith('POP') # Allow operator= line = clean_lines.elided[linenum] if Search(r'\boperator\s*=\s*\(', line): return IsDeletedOrDefault(clean_lines, linenum) # Allow constructors match = Match(r'\s*(?:[\w<>]+::)*([\w<>]+)\s*::\s*([\w<>]+)\s*\(', line) if match and match.group(1) == match.group(2): return IsDeletedOrDefault(clean_lines, linenum) if Search(r'\b(?:explicit|inline)\s+[\w<>]+\s*\(', line): return IsDeletedOrDefault(clean_lines, linenum) if Match(r'\s*[\w<>]+\s*\(', line): previous_line = 'ReturnType' if linenum > 0: previous_line = clean_lines.elided[linenum - 1] if Match(r'^\s*$', previous_line) or Search(r'[{}:;]\s*$', previous_line): return IsDeletedOrDefault(clean_lines, linenum) # Reject types not mentioned in template-argument-list while line: match = Match(r'^.*?(\w+)\s*&&(.*)$', line) if not match: break if match.group(1) not in typenames: return False line = match.group(2) # All RValue types that were in template-argument-list should have # been removed by now. Those were allowed, assuming that they will # be forwarded. # # If there are no remaining RValue types left (i.e. types that were # not found in template-argument-list), flag those as not allowed. return line.find('&&') < 0 def GetTemplateArgs(clean_lines, linenum): """Find list of template arguments associated with this function declaration. Args: clean_lines: A CleansedLines instance containing the file. linenum: Line number containing the start of the function declaration, usually one line after the end of the template-argument-list. Returns: Set of type names, or empty set if this does not appear to have any template parameters. """ # Find start of function func_line = linenum while func_line > 0: line = clean_lines.elided[func_line] if Match(r'^\s*$', line): return set() if line.find('(') >= 0: break func_line -= 1 if func_line == 0: return set() # Collapse template-argument-list into a single string argument_list = '' match = Match(r'^(\s*template\s*)<', clean_lines.elided[func_line]) if match: # template-argument-list on the same line as function name start_col = len(match.group(1)) _, end_line, end_col = CloseExpression(clean_lines, func_line, start_col) if end_col > -1 and end_line == func_line: start_col += 1 # Skip the opening bracket argument_list = clean_lines.elided[func_line][start_col:end_col] elif func_line > 1: # template-argument-list one line before function name match = Match(r'^(.*)>\s*$', clean_lines.elided[func_line - 1]) if match: end_col = len(match.group(1)) _, start_line, start_col = ReverseCloseExpression( clean_lines, func_line - 1, end_col) if start_col > -1: start_col += 1 # Skip the opening bracket while start_line < func_line - 1: argument_list += clean_lines.elided[start_line][start_col:] start_col = 0 start_line += 1 argument_list += clean_lines.elided[func_line - 1][start_col:end_col] if not argument_list: return set() # Extract type names typenames = set() while True: match = Match(r'^[,\s]*(?:typename|class)(?:\.\.\.)?\s+(\w+)(.*)$', argument_list) if not match: break typenames.add(match.group(1)) argument_list = match.group(2) return typenames def CheckRValueReference(filename, clean_lines, linenum, nesting_state, error): """Check for rvalue references. Args: filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. nesting_state: A NestingState instance which maintains information about the current stack of nested blocks being parsed. error: The function to call with any errors found. """ # Find lines missing spaces around &&. # TODO(unknown): currently we don't check for rvalue references # with spaces surrounding the && to avoid false positives with # boolean expressions. line = clean_lines.elided[linenum] match = Match(r'^(.*\S)&&', line) if not match: match = Match(r'(.*)&&\S', line) if (not match) or '(&&)' in line or Search(r'\boperator\s*$', match.group(1)): return # Either poorly formed && or an rvalue reference, check the context # to get a more accurate error message. Mostly we want to determine # if what's to the left of "&&" is a type or not. typenames = GetTemplateArgs(clean_lines, linenum) and_pos = len(match.group(1)) if IsRValueType(typenames, clean_lines, nesting_state, linenum, and_pos): if not IsRValueAllowed(clean_lines, linenum, typenames): error(filename, linenum, 'build/c++11', 3, 'RValue references are an unapproved C++ feature.') else: error(filename, linenum, 'whitespace/operators', 3, 'Missing spaces around &&') def CheckSectionSpacing(filename, clean_lines, class_info, linenum, error): """Checks for additional blank line issues related to sections. Currently the only thing checked here is blank line before protected/private. Args: filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. class_info: A _ClassInfo objects. linenum: The number of the line to check. error: The function to call with any errors found. """ # Skip checks if the class is small, where small means 25 lines or less. # 25 lines seems like a good cutoff since that's the usual height of # terminals, and any class that can't fit in one screen can't really # be considered "small". # # Also skip checks if we are on the first line. This accounts for # classes that look like # class Foo { public: ... }; # # If we didn't find the end of the class, last_line would be zero, # and the check will be skipped by the first condition. if (class_info.last_line - class_info.starting_linenum <= 24 or linenum <= class_info.starting_linenum): return matched = Match(r'\s*(public|protected|private):', clean_lines.lines[linenum]) if matched: # Issue warning if the line before public/protected/private was # not a blank line, but don't do this if the previous line contains # "class" or "struct". This can happen two ways: # - We are at the beginning of the class. # - We are forward-declaring an inner class that is semantically # private, but needed to be public for implementation reasons. # Also ignores cases where the previous line ends with a backslash as can be # common when defining classes in C macros. prev_line = clean_lines.lines[linenum - 1] if (not IsBlankLine(prev_line) and not Search(r'\b(class|struct)\b', prev_line) and not Search(r'\\$', prev_line)): # Try a bit harder to find the beginning of the class. This is to # account for multi-line base-specifier lists, e.g.: # class Derived # : public Base { end_class_head = class_info.starting_linenum for i in range(class_info.starting_linenum, linenum): if Search(r'\{\s*$', clean_lines.lines[i]): end_class_head = i break if end_class_head < linenum - 1: error(filename, linenum, 'whitespace/blank_line', 3, '"%s:" should be preceded by a blank line' % matched.group(1)) def GetPreviousNonBlankLine(clean_lines, linenum): """Return the most recent non-blank line and its line number. Args: clean_lines: A CleansedLines instance containing the file contents. linenum: The number of the line to check. Returns: A tuple with two elements. The first element is the contents of the last non-blank line before the current line, or the empty string if this is the first non-blank line. The second is the line number of that line, or -1 if this is the first non-blank line. """ prevlinenum = linenum - 1 while prevlinenum >= 0: prevline = clean_lines.elided[prevlinenum] if not IsBlankLine(prevline): # if not a blank line... return (prevline, prevlinenum) prevlinenum -= 1 return ('', -1) def CheckBraces(filename, clean_lines, linenum, error): """Looks for misplaced braces (e.g. at the end of line). Args: filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. error: The function to call with any errors found. """ line = clean_lines.elided[linenum] # get rid of comments and strings if Match(r'\s*{\s*$', line): # We allow an open brace to start a line in the case where someone is using # braces in a block to explicitly create a new scope, which is commonly used # to control the lifetime of stack-allocated variables. Braces are also # used for brace initializers inside function calls. We don't detect this # perfectly: we just don't complain if the last non-whitespace character on # the previous non-blank line is ',', ';', ':', '(', '{', or '}', or if the # previous line starts a preprocessor block. prevline = GetPreviousNonBlankLine(clean_lines, linenum)[0] if (not Search(r'[,;:}{(]\s*$', prevline) and not Match(r'\s*#', prevline)): error(filename, linenum, 'whitespace/braces', 4, '{ should almost always be at the end of the previous line') # An else clause should be on the same line as the preceding closing brace. if Match(r'\s*else\b\s*(?:if\b|\{|$)', line): prevline = GetPreviousNonBlankLine(clean_lines, linenum)[0] if Match(r'\s*}\s*$', prevline): error(filename, linenum, 'whitespace/newline', 4, 'An else should appear on the same line as the preceding }') # If braces come on one side of an else, they should be on both. # However, we have to worry about "else if" that spans multiple lines! if Search(r'else if\s*\(', line): # could be multi-line if brace_on_left = bool(Search(r'}\s*else if\s*\(', line)) # find the ( after the if pos = line.find('else if') pos = line.find('(', pos) if pos > 0: (endline, _, endpos) = CloseExpression(clean_lines, linenum, pos) brace_on_right = endline[endpos:].find('{') != -1 if brace_on_left != brace_on_right: # must be brace after if error(filename, linenum, 'readability/braces', 5, 'If an else has a brace on one side, it should have it on both') elif Search(r'}\s*else[^{]*$', line) or Match(r'[^}]*else\s*{', line): error(filename, linenum, 'readability/braces', 5, 'If an else has a brace on one side, it should have it on both') # Likewise, an else should never have the else clause on the same line if Search(r'\belse [^\s{]', line) and not Search(r'\belse if\b', line): error(filename, linenum, 'whitespace/newline', 4, 'Else clause should never be on same line as else (use 2 lines)') # In the same way, a do/while should never be on one line if Match(r'\s*do [^\s{]', line): error(filename, linenum, 'whitespace/newline', 4, 'do/while clauses should not be on a single line') # Check single-line if/else bodies. The style guide says 'curly braces are not # required for single-line statements'. We additionally allow multi-line, # single statements, but we reject anything with more than one semicolon in # it. This means that the first semicolon after the if should be at the end of # its line, and the line after that should have an indent level equal to or # lower than the if. We also check for ambiguous if/else nesting without # braces. if_else_match = Search(r'\b(if\s*\(|else\b)', line) if if_else_match and not Match(r'\s*#', line): if_indent = GetIndentLevel(line) endline, endlinenum, endpos = line, linenum, if_else_match.end() if_match = Search(r'\bif\s*\(', line) if if_match: # This could be a multiline if condition, so find the end first. pos = if_match.end() - 1 (endline, endlinenum, endpos) = CloseExpression(clean_lines, linenum, pos) # Check for an opening brace, either directly after the if or on the next # line. If found, this isn't a single-statement conditional. if (not Match(r'\s*{', endline[endpos:]) and not (Match(r'\s*$', endline[endpos:]) and endlinenum < (len(clean_lines.elided) - 1) and Match(r'\s*{', clean_lines.elided[endlinenum + 1]))): while (endlinenum < len(clean_lines.elided) and ';' not in clean_lines.elided[endlinenum][endpos:]): endlinenum += 1 endpos = 0 if endlinenum < len(clean_lines.elided): endline = clean_lines.elided[endlinenum] # We allow a mix of whitespace and closing braces (e.g. for one-liner # methods) and a single \ after the semicolon (for macros) endpos = endline.find(';') if not Match(r';[\s}]*(\\?)$', endline[endpos:]): # Semicolon isn't the last character, there's something trailing. # Output a warning if the semicolon is not contained inside # a lambda expression. if not Match(r'^[^{};]*\[[^\[\]]*\][^{}]*\{[^{}]*\}\s*\)*[;,]\s*$', endline): error(filename, linenum, 'readability/braces', 4, 'If/else bodies with multiple statements require braces') elif endlinenum < len(clean_lines.elided) - 1: # Make sure the next line is dedented next_line = clean_lines.elided[endlinenum + 1] next_indent = GetIndentLevel(next_line) # With ambiguous nested if statements, this will error out on the # if that *doesn't* match the else, regardless of whether it's the # inner one or outer one. if (if_match and Match(r'\s*else\b', next_line) and next_indent != if_indent): error(filename, linenum, 'readability/braces', 4, 'Else clause should be indented at the same level as if. ' 'Ambiguous nested if/else chains require braces.') elif next_indent > if_indent: error(filename, linenum, 'readability/braces', 4, 'If/else bodies with multiple statements require braces') def CheckTrailingSemicolon(filename, clean_lines, linenum, error): """Looks for redundant trailing semicolon. Args: filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. error: The function to call with any errors found. """ line = clean_lines.elided[linenum] # Block bodies should not be followed by a semicolon. Due to C++11 # brace initialization, there are more places where semicolons are # required than not, so we use a whitelist approach to check these # rather than a blacklist. These are the places where "};" should # be replaced by just "}": # 1. Some flavor of block following closing parenthesis: # for (;;) {}; # while (...) {}; # switch (...) {}; # Function(...) {}; # if (...) {}; # if (...) else if (...) {}; # # 2. else block: # if (...) else {}; # # 3. const member function: # Function(...) const {}; # # 4. Block following some statement: # x = 42; # {}; # # 5. Block at the beginning of a function: # Function(...) { # {}; # } # # Note that naively checking for the preceding "{" will also match # braces inside multi-dimensional arrays, but this is fine since # that expression will not contain semicolons. # # 6. Block following another block: # while (true) {} # {}; # # 7. End of namespaces: # namespace {}; # # These semicolons seems far more common than other kinds of # redundant semicolons, possibly due to people converting classes # to namespaces. For now we do not warn for this case. # # Try matching case 1 first. match = Match(r'^(.*\)\s*)\{', line) if match: # Matched closing parenthesis (case 1). Check the token before the # matching opening parenthesis, and don't warn if it looks like a # macro. This avoids these false positives: # - macro that defines a base class # - multi-line macro that defines a base class # - macro that defines the whole class-head # # But we still issue warnings for macros that we know are safe to # warn, specifically: # - TEST, TEST_F, TEST_P, MATCHER, MATCHER_P # - TYPED_TEST # - INTERFACE_DEF # - EXCLUSIVE_LOCKS_REQUIRED, SHARED_LOCKS_REQUIRED, LOCKS_EXCLUDED: # # We implement a whitelist of safe macros instead of a blacklist of # unsafe macros, even though the latter appears less frequently in # google code and would have been easier to implement. This is because # the downside for getting the whitelist wrong means some extra # semicolons, while the downside for getting the blacklist wrong # would result in compile errors. # # In addition to macros, we also don't want to warn on # - Compound literals # - Lambdas # - alignas specifier with anonymous structs: closing_brace_pos = match.group(1).rfind(')') opening_parenthesis = ReverseCloseExpression( clean_lines, linenum, closing_brace_pos) if opening_parenthesis[2] > -1: line_prefix = opening_parenthesis[0][0:opening_parenthesis[2]] macro = Search(r'\b([A-Z_]+)\s*$', line_prefix) func = Match(r'^(.*\])\s*$', line_prefix) if ((macro and macro.group(1) not in ( 'TEST', 'TEST_F', 'MATCHER', 'MATCHER_P', 'TYPED_TEST', 'EXCLUSIVE_LOCKS_REQUIRED', 'SHARED_LOCKS_REQUIRED', 'LOCKS_EXCLUDED', 'INTERFACE_DEF')) or (func and not Search(r'\boperator\s*\[\s*\]', func.group(1))) or Search(r'\b(?:struct|union)\s+alignas\s*$', line_prefix) or Search(r'\s+=\s*$', line_prefix)): match = None if (match and opening_parenthesis[1] > 1 and Search(r'\]\s*$', clean_lines.elided[opening_parenthesis[1] - 1])): # Multi-line lambda-expression match = None else: # Try matching cases 2-3. match = Match(r'^(.*(?:else|\)\s*const)\s*)\{', line) if not match: # Try matching cases 4-6. These are always matched on separate lines. # # Note that we can't simply concatenate the previous line to the # current line and do a single match, otherwise we may output # duplicate warnings for the blank line case: # if (cond) { # // blank line # } prevline = GetPreviousNonBlankLine(clean_lines, linenum)[0] if prevline and Search(r'[;{}]\s*$', prevline): match = Match(r'^(\s*)\{', line) # Check matching closing brace if match: (endline, endlinenum, endpos) = CloseExpression( clean_lines, linenum, len(match.group(1))) if endpos > -1 and Match(r'^\s*;', endline[endpos:]): # Current {} pair is eligible for semicolon check, and we have found # the redundant semicolon, output warning here. # # Note: because we are scanning forward for opening braces, and # outputting warnings for the matching closing brace, if there are # nested blocks with trailing semicolons, we will get the error # messages in reversed order. error(filename, endlinenum, 'readability/braces', 4, "You don't need a ; after a }") def CheckEmptyBlockBody(filename, clean_lines, linenum, error): """Look for empty loop/conditional body with only a single semicolon. Args: filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. error: The function to call with any errors found. """ # Search for loop keywords at the beginning of the line. Because only # whitespaces are allowed before the keywords, this will also ignore most # do-while-loops, since those lines should start with closing brace. # # We also check "if" blocks here, since an empty conditional block # is likely an error. line = clean_lines.elided[linenum] matched = Match(r'\s*(for|while|if)\s*\(', line) if matched: # Find the end of the conditional expression (end_line, end_linenum, end_pos) = CloseExpression( clean_lines, linenum, line.find('(')) # Output warning if what follows the condition expression is a semicolon. # No warning for all other cases, including whitespace or newline, since we # have a separate check for semicolons preceded by whitespace. if end_pos >= 0 and Match(r';', end_line[end_pos:]): if matched.group(1) == 'if': error(filename, end_linenum, 'whitespace/empty_conditional_body', 5, 'Empty conditional bodies should use {}') else: error(filename, end_linenum, 'whitespace/empty_loop_body', 5, 'Empty loop bodies should use {} or continue') def FindCheckMacro(line): """Find a replaceable CHECK-like macro. Args: line: line to search on. Returns: (macro name, start position), or (None, -1) if no replaceable macro is found. """ for macro in _CHECK_MACROS: i = line.find(macro) if i >= 0: # Find opening parenthesis. Do a regular expression match here # to make sure that we are matching the expected CHECK macro, as # opposed to some other macro that happens to contain the CHECK # substring. matched = Match(r'^(.*\b' + macro + r'\s*)\(', line) if not matched: continue return (macro, len(matched.group(1))) return (None, -1) def CheckCheck(filename, clean_lines, linenum, error): """Checks the use of CHECK and EXPECT macros. Args: filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. error: The function to call with any errors found. """ # Decide the set of replacement macros that should be suggested lines = clean_lines.elided (check_macro, start_pos) = FindCheckMacro(lines[linenum]) if not check_macro: return # Find end of the boolean expression by matching parentheses (last_line, end_line, end_pos) = CloseExpression( clean_lines, linenum, start_pos) if end_pos < 0: return # If the check macro is followed by something other than a # semicolon, assume users will log their own custom error messages # and don't suggest any replacements. if not Match(r'\s*;', last_line[end_pos:]): return if linenum == end_line: expression = lines[linenum][start_pos + 1:end_pos - 1] else: expression = lines[linenum][start_pos + 1:] for i in xrange(linenum + 1, end_line): expression += lines[i] expression += last_line[0:end_pos - 1] # Parse expression so that we can take parentheses into account. # This avoids false positives for inputs like "CHECK((a < 4) == b)", # which is not replaceable by CHECK_LE. lhs = '' rhs = '' operator = None while expression: matched = Match(r'^\s*(<<|<<=|>>|>>=|->\*|->|&&|\|\||' r'==|!=|>=|>|<=|<|\()(.*)$', expression) if matched: token = matched.group(1) if token == '(': # Parenthesized operand expression = matched.group(2) (end, _) = FindEndOfExpressionInLine(expression, 0, ['(']) if end < 0: return # Unmatched parenthesis lhs += '(' + expression[0:end] expression = expression[end:] elif token in ('&&', '||'): # Logical and/or operators. This means the expression # contains more than one term, for example: # CHECK(42 < a && a < b); # # These are not replaceable with CHECK_LE, so bail out early. return elif token in ('<<', '<<=', '>>', '>>=', '->*', '->'): # Non-relational operator lhs += token expression = matched.group(2) else: # Relational operator operator = token rhs = matched.group(2) break else: # Unparenthesized operand. Instead of appending to lhs one character # at a time, we do another regular expression match to consume several # characters at once if possible. Trivial benchmark shows that this # is more efficient when the operands are longer than a single # character, which is generally the case. matched = Match(r'^([^-=!<>()&|]+)(.*)$', expression) if not matched: matched = Match(r'^(\s*\S)(.*)$', expression) if not matched: break lhs += matched.group(1) expression = matched.group(2) # Only apply checks if we got all parts of the boolean expression if not (lhs and operator and rhs): return # Check that rhs do not contain logical operators. We already know # that lhs is fine since the loop above parses out && and ||. if rhs.find('&&') > -1 or rhs.find('||') > -1: return # At least one of the operands must be a constant literal. This is # to avoid suggesting replacements for unprintable things like # CHECK(variable != iterator) # # The following pattern matches decimal, hex integers, strings, and # characters (in that order). lhs = lhs.strip() rhs = rhs.strip() match_constant = r'^([-+]?(\d+|0[xX][0-9a-fA-F]+)[lLuU]{0,3}|".*"|\'.*\')$' if Match(match_constant, lhs) or Match(match_constant, rhs): # Note: since we know both lhs and rhs, we can provide a more # descriptive error message like: # Consider using CHECK_EQ(x, 42) instead of CHECK(x == 42) # Instead of: # Consider using CHECK_EQ instead of CHECK(a == b) # # We are still keeping the less descriptive message because if lhs # or rhs gets long, the error message might become unreadable. error(filename, linenum, 'readability/check', 2, 'Consider using %s instead of %s(a %s b)' % ( _CHECK_REPLACEMENT[check_macro][operator], check_macro, operator)) def CheckAltTokens(filename, clean_lines, linenum, error): """Check alternative keywords being used in boolean expressions. Args: filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. error: The function to call with any errors found. """ line = clean_lines.elided[linenum] # Avoid preprocessor lines if Match(r'^\s*#', line): return # Last ditch effort to avoid multi-line comments. This will not help # if the comment started before the current line or ended after the # current line, but it catches most of the false positives. At least, # it provides a way to workaround this warning for people who use # multi-line comments in preprocessor macros. # # TODO(unknown): remove this once cpplint has better support for # multi-line comments. if line.find('/*') >= 0 or line.find('*/') >= 0: return for match in _ALT_TOKEN_REPLACEMENT_PATTERN.finditer(line): error(filename, linenum, 'readability/alt_tokens', 2, 'Use operator %s instead of %s' % ( _ALT_TOKEN_REPLACEMENT[match.group(1)], match.group(1))) def GetLineWidth(line): """Determines the width of the line in column positions. Args: line: A string, which may be a Unicode string. Returns: The width of the line in column positions, accounting for Unicode combining characters and wide characters. """ if isinstance(line, unicode): width = 0 for uc in unicodedata.normalize('NFC', line): if unicodedata.east_asian_width(uc) in ('W', 'F'): width += 2 elif not unicodedata.combining(uc): width += 1 return width else: return len(line) def CheckStyle(filename, clean_lines, linenum, file_extension, nesting_state, error): """Checks rules from the 'C++ style rules' section of cppguide.html. Most of these rules are hard to test (naming, comment style), but we do what we can. In particular we check for 2-space indents, line lengths, tab usage, spaces inside code, etc. Args: filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. file_extension: The extension (without the dot) of the filename. nesting_state: A NestingState instance which maintains information about the current stack of nested blocks being parsed. error: The function to call with any errors found. """ # Don't use "elided" lines here, otherwise we can't check commented lines. # Don't want to use "raw" either, because we don't want to check inside C++11 # raw strings, raw_lines = clean_lines.lines_without_raw_strings line = raw_lines[linenum] if line.find('\t') != -1: error(filename, linenum, 'whitespace/tab', 1, 'Tab found; better to use spaces') # One or three blank spaces at the beginning of the line is weird; it's # hard to reconcile that with 2-space indents. # NOTE: here are the conditions rob pike used for his tests. Mine aren't # as sophisticated, but it may be worth becoming so: RLENGTH==initial_spaces # if(RLENGTH > 20) complain = 0; # if(match($0, " +(error|private|public|protected):")) complain = 0; # if(match(prev, "&& *$")) complain = 0; # if(match(prev, "\\|\\| *$")) complain = 0; # if(match(prev, "[\",=><] *$")) complain = 0; # if(match($0, " <<")) complain = 0; # if(match(prev, " +for \\(")) complain = 0; # if(prevodd && match(prevprev, " +for \\(")) complain = 0; scope_or_label_pattern = r'\s*\w+\s*:\s*\\?$' classinfo = nesting_state.InnermostClass() initial_spaces = 0 cleansed_line = clean_lines.elided[linenum] while initial_spaces < len(line) and line[initial_spaces] == ' ': initial_spaces += 1 if line and line[-1].isspace(): error(filename, linenum, 'whitespace/end_of_line', 4, 'Line ends in whitespace. Consider deleting these extra spaces.') # There are certain situations we allow one space, notably for # section labels, and also lines containing multi-line raw strings. elif ((initial_spaces == 1 or initial_spaces == 3) and not Match(scope_or_label_pattern, cleansed_line) and not (clean_lines.raw_lines[linenum] != line and Match(r'^\s*""', line))): error(filename, linenum, 'whitespace/indent', 3, 'Weird number of spaces at line-start. ' 'Are you using a 2-space indent?') # Check if the line is a header guard. is_header_guard = False if file_extension == 'h': cppvar = GetHeaderGuardCPPVariable(filename) if (line.startswith('#ifndef %s' % cppvar) or line.startswith('#define %s' % cppvar) or line.startswith('#endif // %s' % cppvar)): is_header_guard = True # #include lines and header guards can be long, since there's no clean way to # split them. # # URLs can be long too. It's possible to split these, but it makes them # harder to cut&paste. # # The "$Id:...$" comment may also get very long without it being the # developers fault. if (not line.startswith('#include') and not is_header_guard and not Match(r'^\s*//.*http(s?)://\S*$', line) and not Match(r'^// \$Id:.*#[0-9]+ \$$', line)): line_width = GetLineWidth(line) extended_length = int((_line_length * 1.25)) if line_width > extended_length: error(filename, linenum, 'whitespace/line_length', 4, 'Lines should very rarely be longer than %i characters' % extended_length) elif line_width > _line_length: error(filename, linenum, 'whitespace/line_length', 2, 'Lines should be <= %i characters long' % _line_length) if (cleansed_line.count(';') > 1 and # for loops are allowed two ;'s (and may run over two lines). cleansed_line.find('for') == -1 and (GetPreviousNonBlankLine(clean_lines, linenum)[0].find('for') == -1 or GetPreviousNonBlankLine(clean_lines, linenum)[0].find(';') != -1) and # It's ok to have many commands in a switch case that fits in 1 line not ((cleansed_line.find('case ') != -1 or cleansed_line.find('default:') != -1) and cleansed_line.find('break;') != -1)): error(filename, linenum, 'whitespace/newline', 0, 'More than one command on the same line') # Some more style checks CheckBraces(filename, clean_lines, linenum, error) CheckTrailingSemicolon(filename, clean_lines, linenum, error) CheckEmptyBlockBody(filename, clean_lines, linenum, error) CheckAccess(filename, clean_lines, linenum, nesting_state, error) CheckSpacing(filename, clean_lines, linenum, nesting_state, error) CheckOperatorSpacing(filename, clean_lines, linenum, error) CheckParenthesisSpacing(filename, clean_lines, linenum, error) CheckCommaSpacing(filename, clean_lines, linenum, error) CheckBracesSpacing(filename, clean_lines, linenum, error) CheckSpacingForFunctionCall(filename, clean_lines, linenum, error) CheckRValueReference(filename, clean_lines, linenum, nesting_state, error) CheckCheck(filename, clean_lines, linenum, error) CheckAltTokens(filename, clean_lines, linenum, error) classinfo = nesting_state.InnermostClass() if classinfo: CheckSectionSpacing(filename, clean_lines, classinfo, linenum, error) _RE_PATTERN_INCLUDE = re.compile(r'^\s*#\s*include\s*([<"])([^>"]*)[>"].*$') # Matches the first component of a filename delimited by -s and _s. That is: # _RE_FIRST_COMPONENT.match('foo').group(0) == 'foo' # _RE_FIRST_COMPONENT.match('foo.cc').group(0) == 'foo' # _RE_FIRST_COMPONENT.match('foo-bar_baz.cc').group(0) == 'foo' # _RE_FIRST_COMPONENT.match('foo_bar-baz.cc').group(0) == 'foo' _RE_FIRST_COMPONENT = re.compile(r'^[^-_.]+') def _DropCommonSuffixes(filename): """Drops common suffixes like _test.cc or -inl.h from filename. For example: >>> _DropCommonSuffixes('foo/foo-inl.h') 'foo/foo' >>> _DropCommonSuffixes('foo/bar/foo.cc') 'foo/bar/foo' >>> _DropCommonSuffixes('foo/foo_internal.h') 'foo/foo' >>> _DropCommonSuffixes('foo/foo_unusualinternal.h') 'foo/foo_unusualinternal' Args: filename: The input filename. Returns: The filename with the common suffix removed. """ for suffix in ('test.cc', 'regtest.cc', 'unittest.cc', 'inl.h', 'impl.h', 'internal.h'): if (filename.endswith(suffix) and len(filename) > len(suffix) and filename[-len(suffix) - 1] in ('-', '_')): return filename[:-len(suffix) - 1] return os.path.splitext(filename)[0] def _IsTestFilename(filename): """Determines if the given filename has a suffix that identifies it as a test. Args: filename: The input filename. Returns: True if 'filename' looks like a test, False otherwise. """ if (filename.endswith('_test.cc') or filename.endswith('_unittest.cc') or filename.endswith('_regtest.cc')): return True else: return False def _ClassifyInclude(fileinfo, include, is_system): """Figures out what kind of header 'include' is. Args: fileinfo: The current file cpplint is running over. A FileInfo instance. include: The path to a #included file. is_system: True if the #include used <> rather than "". Returns: One of the _XXX_HEADER constants. For example: >>> _ClassifyInclude(FileInfo('foo/foo.cc'), 'stdio.h', True) _C_SYS_HEADER >>> _ClassifyInclude(FileInfo('foo/foo.cc'), 'string', True) _CPP_SYS_HEADER >>> _ClassifyInclude(FileInfo('foo/foo.cc'), 'foo/foo.h', False) _LIKELY_MY_HEADER >>> _ClassifyInclude(FileInfo('foo/foo_unknown_extension.cc'), ... 'bar/foo_other_ext.h', False) _POSSIBLE_MY_HEADER >>> _ClassifyInclude(FileInfo('foo/foo.cc'), 'foo/bar.h', False) _OTHER_HEADER """ # This is a list of all standard c++ header files, except # those already checked for above. is_cpp_h = include in _CPP_HEADERS if is_system: if is_cpp_h: return _CPP_SYS_HEADER else: return _C_SYS_HEADER # If the target file and the include we're checking share a # basename when we drop common extensions, and the include # lives in . , then it's likely to be owned by the target file. target_dir, target_base = ( os.path.split(_DropCommonSuffixes(fileinfo.RepositoryName()))) include_dir, include_base = os.path.split(_DropCommonSuffixes(include)) if target_base == include_base and ( include_dir == target_dir or include_dir == os.path.normpath(target_dir + '/../public')): return _LIKELY_MY_HEADER # If the target and include share some initial basename # component, it's possible the target is implementing the # include, so it's allowed to be first, but we'll never # complain if it's not there. target_first_component = _RE_FIRST_COMPONENT.match(target_base) include_first_component = _RE_FIRST_COMPONENT.match(include_base) if (target_first_component and include_first_component and target_first_component.group(0) == include_first_component.group(0)): return _POSSIBLE_MY_HEADER return _OTHER_HEADER def CheckIncludeLine(filename, clean_lines, linenum, include_state, error): """Check rules that are applicable to #include lines. Strings on #include lines are NOT removed from elided line, to make certain tasks easier. However, to prevent false positives, checks applicable to #include lines in CheckLanguage must be put here. Args: filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. include_state: An _IncludeState instance in which the headers are inserted. error: The function to call with any errors found. """ fileinfo = FileInfo(filename) line = clean_lines.lines[linenum] # "include" should use the new style "foo/bar.h" instead of just "bar.h" # Only do this check if the included header follows google naming # conventions. If not, assume that it's a 3rd party API that # requires special include conventions. # # We also make an exception for Lua headers, which follow google # naming convention but not the include convention. match = Match(r'#include\s*"([^/]+\.h)"', line) if match and not _THIRD_PARTY_HEADERS_PATTERN.match(match.group(1)): error(filename, linenum, 'build/include', 4, 'Include the directory when naming .h files') # we shouldn't include a file more than once. actually, there are a # handful of instances where doing so is okay, but in general it's # not. match = _RE_PATTERN_INCLUDE.search(line) if match: include = match.group(2) is_system = (match.group(1) == '<') duplicate_line = include_state.FindHeader(include) if duplicate_line >= 0: error(filename, linenum, 'build/include', 4, '"%s" already included at %s:%s' % (include, filename, duplicate_line)) elif (include.endswith('.cc') and os.path.dirname(fileinfo.RepositoryName()) != os.path.dirname(include)): error(filename, linenum, 'build/include', 4, 'Do not include .cc files from other packages') elif not _THIRD_PARTY_HEADERS_PATTERN.match(include): include_state.include_list[-1].append((include, linenum)) # We want to ensure that headers appear in the right order: # 1) for foo.cc, foo.h (preferred location) # 2) c system files # 3) cpp system files # 4) for foo.cc, foo.h (deprecated location) # 5) other google headers # # We classify each include statement as one of those 5 types # using a number of techniques. The include_state object keeps # track of the highest type seen, and complains if we see a # lower type after that. error_message = include_state.CheckNextIncludeOrder( _ClassifyInclude(fileinfo, include, is_system)) if error_message: error(filename, linenum, 'build/include_order', 4, '%s. Should be: %s.h, c system, c++ system, other.' % (error_message, fileinfo.BaseName())) canonical_include = include_state.CanonicalizeAlphabeticalOrder(include) if not include_state.IsInAlphabeticalOrder( clean_lines, linenum, canonical_include): error(filename, linenum, 'build/include_alpha', 4, 'Include "%s" not in alphabetical order' % include) include_state.SetLastHeader(canonical_include) def _GetTextInside(text, start_pattern): r"""Retrieves all the text between matching open and close parentheses. Given a string of lines and a regular expression string, retrieve all the text following the expression and between opening punctuation symbols like (, [, or {, and the matching close-punctuation symbol. This properly nested occurrences of the punctuations, so for the text like printf(a(), b(c())); a call to _GetTextInside(text, r'printf\(') will return 'a(), b(c())'. start_pattern must match string having an open punctuation symbol at the end. Args: text: The lines to extract text. Its comments and strings must be elided. It can be single line and can span multiple lines. start_pattern: The regexp string indicating where to start extracting the text. Returns: The extracted text. None if either the opening string or ending punctuation could not be found. """ # TODO(unknown): Audit cpplint.py to see what places could be profitably # rewritten to use _GetTextInside (and use inferior regexp matching today). # Give opening punctuations to get the matching close-punctuations. matching_punctuation = {'(': ')', '{': '}', '[': ']'} closing_punctuation = set(matching_punctuation.itervalues()) # Find the position to start extracting text. match = re.search(start_pattern, text, re.M) if not match: # start_pattern not found in text. return None start_position = match.end(0) assert start_position > 0, ( 'start_pattern must ends with an opening punctuation.') assert text[start_position - 1] in matching_punctuation, ( 'start_pattern must ends with an opening punctuation.') # Stack of closing punctuations we expect to have in text after position. punctuation_stack = [matching_punctuation[text[start_position - 1]]] position = start_position while punctuation_stack and position < len(text): if text[position] == punctuation_stack[-1]: punctuation_stack.pop() elif text[position] in closing_punctuation: # A closing punctuation without matching opening punctuations. return None elif text[position] in matching_punctuation: punctuation_stack.append(matching_punctuation[text[position]]) position += 1 if punctuation_stack: # Opening punctuations left without matching close-punctuations. return None # punctuations match. return text[start_position:position - 1] # Patterns for matching call-by-reference parameters. # # Supports nested templates up to 2 levels deep using this messy pattern: # < (?: < (?: < [^<>]* # > # | [^<>] )* # > # | [^<>] )* # > _RE_PATTERN_IDENT = r'[_a-zA-Z]\w*' # =~ [[:alpha:]][[:alnum:]]* _RE_PATTERN_TYPE = ( r'(?:const\s+)?(?:typename\s+|class\s+|struct\s+|union\s+|enum\s+)?' r'(?:\w|' r'\s*<(?:<(?:<[^<>]*>|[^<>])*>|[^<>])*>|' r'::)+') # A call-by-reference parameter ends with '& identifier'. _RE_PATTERN_REF_PARAM = re.compile( r'(' + _RE_PATTERN_TYPE + r'(?:\s*(?:\bconst\b|[*]))*\s*' r'&\s*' + _RE_PATTERN_IDENT + r')\s*(?:=[^,()]+)?[,)]') # A call-by-const-reference parameter either ends with 'const& identifier' # or looks like 'const type& identifier' when 'type' is atomic. _RE_PATTERN_CONST_REF_PARAM = ( r'(?:.*\s*\bconst\s*&\s*' + _RE_PATTERN_IDENT + r'|const\s+' + _RE_PATTERN_TYPE + r'\s*&\s*' + _RE_PATTERN_IDENT + r')') def CheckLanguage(filename, clean_lines, linenum, file_extension, include_state, nesting_state, error): """Checks rules from the 'C++ language rules' section of cppguide.html. Some of these rules are hard to test (function overloading, using uint32 inappropriately), but we do the best we can. Args: filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. file_extension: The extension (without the dot) of the filename. include_state: An _IncludeState instance in which the headers are inserted. nesting_state: A NestingState instance which maintains information about the current stack of nested blocks being parsed. error: The function to call with any errors found. """ # If the line is empty or consists of entirely a comment, no need to # check it. line = clean_lines.elided[linenum] if not line: return match = _RE_PATTERN_INCLUDE.search(line) if match: CheckIncludeLine(filename, clean_lines, linenum, include_state, error) return # Reset include state across preprocessor directives. This is meant # to silence warnings for conditional includes. match = Match(r'^\s*#\s*(if|ifdef|ifndef|elif|else|endif)\b', line) if match: include_state.ResetSection(match.group(1)) # Make Windows paths like Unix. fullname = os.path.abspath(filename).replace('\\', '/') # Perform other checks now that we are sure that this is not an include line CheckCasts(filename, clean_lines, linenum, error) CheckGlobalStatic(filename, clean_lines, linenum, error) CheckPrintf(filename, clean_lines, linenum, error) if file_extension == 'h': # TODO(unknown): check that 1-arg constructors are explicit. # How to tell it's a constructor? # (handled in CheckForNonStandardConstructs for now) # TODO(unknown): check that classes declare or disable copy/assign # (level 1 error) pass # Check if people are using the verboten C basic types. The only exception # we regularly allow is "unsigned short port" for port. if Search(r'\bshort port\b', line): if not Search(r'\bunsigned short port\b', line): error(filename, linenum, 'runtime/int', 4, 'Use "unsigned short" for ports, not "short"') else: match = Search(r'\b(short|long(?! +double)|long long)\b', line) if match: error(filename, linenum, 'runtime/int', 4, 'Use int16/int64/etc, rather than the C type %s' % match.group(1)) # Check if some verboten operator overloading is going on # TODO(unknown): catch out-of-line unary operator&: # class X {}; # int operator&(const X& x) { return 42; } // unary operator& # The trick is it's hard to tell apart from binary operator&: # class Y { int operator&(const Y& x) { return 23; } }; // binary operator& if Search(r'\boperator\s*&\s*\(\s*\)', line): error(filename, linenum, 'runtime/operator', 4, 'Unary operator& is dangerous. Do not use it.') # Check for suspicious usage of "if" like # } if (a == b) { if Search(r'\}\s*if\s*\(', line): error(filename, linenum, 'readability/braces', 4, 'Did you mean "else if"? If not, start a new line for "if".') # Check for potential format string bugs like printf(foo). # We constrain the pattern not to pick things like DocidForPrintf(foo). # Not perfect but it can catch printf(foo.c_str()) and printf(foo->c_str()) # TODO(unknown): Catch the following case. Need to change the calling # convention of the whole function to process multiple line to handle it. # printf( # boy_this_is_a_really_long_variable_that_cannot_fit_on_the_prev_line); printf_args = _GetTextInside(line, r'(?i)\b(string)?printf\s*\(') if printf_args: match = Match(r'([\w.\->()]+)$', printf_args) if match and match.group(1) != '__VA_ARGS__': function_name = re.search(r'\b((?:string)?printf)\s*\(', line, re.I).group(1) error(filename, linenum, 'runtime/printf', 4, 'Potential format string bug. Do %s("%%s", %s) instead.' % (function_name, match.group(1))) # Check for potential memset bugs like memset(buf, sizeof(buf), 0). match = Search(r'memset\s*\(([^,]*),\s*([^,]*),\s*0\s*\)', line) if match and not Match(r"^''|-?[0-9]+|0x[0-9A-Fa-f]$", match.group(2)): error(filename, linenum, 'runtime/memset', 4, 'Did you mean "memset(%s, 0, %s)"?' % (match.group(1), match.group(2))) if Search(r'\busing namespace\b', line): error(filename, linenum, 'build/namespaces', 5, 'Do not use namespace using-directives. ' 'Use using-declarations instead.') # Detect variable-length arrays. match = Match(r'\s*(.+::)?(\w+) [a-z]\w*\[(.+)];', line) if (match and match.group(2) != 'return' and match.group(2) != 'delete' and match.group(3).find(']') == -1): # Split the size using space and arithmetic operators as delimiters. # If any of the resulting tokens are not compile time constants then # report the error. tokens = re.split(r'\s|\+|\-|\*|\/|<<|>>]', match.group(3)) is_const = True skip_next = False for tok in tokens: if skip_next: skip_next = False continue if Search(r'sizeof\(.+\)', tok): continue if Search(r'arraysize\(\w+\)', tok): continue tok = tok.lstrip('(') tok = tok.rstrip(')') if not tok: continue if Match(r'\d+', tok): continue if Match(r'0[xX][0-9a-fA-F]+', tok): continue if Match(r'k[A-Z0-9]\w*', tok): continue if Match(r'(.+::)?k[A-Z0-9]\w*', tok): continue if Match(r'(.+::)?[A-Z][A-Z0-9_]*', tok): continue # A catch all for tricky sizeof cases, including 'sizeof expression', # 'sizeof(*type)', 'sizeof(const type)', 'sizeof(struct StructName)' # requires skipping the next token because we split on ' ' and '*'. if tok.startswith('sizeof'): skip_next = True continue is_const = False break if not is_const: error(filename, linenum, 'runtime/arrays', 1, 'Do not use variable-length arrays. Use an appropriately named ' "('k' followed by CamelCase) compile-time constant for the size.") # Check for use of unnamed namespaces in header files. Registration # macros are typically OK, so we allow use of "namespace {" on lines # that end with backslashes. if (file_extension == 'h' and Search(r'\bnamespace\s*{', line) and line[-1] != '\\'): error(filename, linenum, 'build/namespaces', 4, 'Do not use unnamed namespaces in header files. See ' 'http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Namespaces' ' for more information.') def CheckGlobalStatic(filename, clean_lines, linenum, error): """Check for unsafe global or static objects. Args: filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. error: The function to call with any errors found. """ line = clean_lines.elided[linenum] # Match two lines at a time to support multiline declarations if linenum + 1 < clean_lines.NumLines() and not Search(r'[;({]', line): line += clean_lines.elided[linenum + 1].strip() # Check for people declaring static/global STL strings at the top level. # This is dangerous because the C++ language does not guarantee that # globals with constructors are initialized before the first access. match = Match( r'((?:|static +)(?:|const +))string +([a-zA-Z0-9_:]+)\b(.*)', line) # Remove false positives: # - String pointers (as opposed to values). # string *pointer # const string *pointer # string const *pointer # string *const pointer # # - Functions and template specializations. # string Function(... # string Class::Method(... # # - Operators. These are matched separately because operator names # cross non-word boundaries, and trying to match both operators # and functions at the same time would decrease accuracy of # matching identifiers. # string Class::operator*() if (match and not Search(r'\bstring\b(\s+const)?\s*\*\s*(const\s+)?\w', line) and not Search(r'\boperator\W', line) and not Match(r'\s*(<.*>)?(::[a-zA-Z0-9_]+)*\s*\(([^"]|$)', match.group(3))): error(filename, linenum, 'runtime/string', 4, 'For a static/global string constant, use a C style string instead: ' '"%schar %s[]".' % (match.group(1), match.group(2))) if Search(r'\b([A-Za-z0-9_]*_)\(\1\)', line): error(filename, linenum, 'runtime/init', 4, 'You seem to be initializing a member variable with itself.') def CheckPrintf(filename, clean_lines, linenum, error): """Check for printf related issues. Args: filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. error: The function to call with any errors found. """ line = clean_lines.elided[linenum] # When snprintf is used, the second argument shouldn't be a literal. match = Search(r'snprintf\s*\(([^,]*),\s*([0-9]*)\s*,', line) if match and match.group(2) != '0': # If 2nd arg is zero, snprintf is used to calculate size. error(filename, linenum, 'runtime/printf', 3, 'If you can, use sizeof(%s) instead of %s as the 2nd arg ' 'to snprintf.' % (match.group(1), match.group(2))) # Check if some verboten C functions are being used. if Search(r'\bsprintf\s*\(', line): error(filename, linenum, 'runtime/printf', 5, 'Never use sprintf. Use snprintf instead.') match = Search(r'\b(strcpy|strcat)\s*\(', line) if match: error(filename, linenum, 'runtime/printf', 4, 'Almost always, snprintf is better than %s' % match.group(1)) def IsDerivedFunction(clean_lines, linenum): """Check if current line contains an inherited function. Args: clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. Returns: True if current line contains a function with "override" virt-specifier. """ # Scan back a few lines for start of current function for i in xrange(linenum, max(-1, linenum - 10), -1): match = Match(r'^([^()]*\w+)\(', clean_lines.elided[i]) if match: # Look for "override" after the matching closing parenthesis line, _, closing_paren = CloseExpression( clean_lines, i, len(match.group(1))) return (closing_paren >= 0 and Search(r'\boverride\b', line[closing_paren:])) return False def IsOutOfLineMethodDefinition(clean_lines, linenum): """Check if current line contains an out-of-line method definition. Args: clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. Returns: True if current line contains an out-of-line method definition. """ # Scan back a few lines for start of current function for i in xrange(linenum, max(-1, linenum - 10), -1): if Match(r'^([^()]*\w+)\(', clean_lines.elided[i]): return Match(r'^[^()]*\w+::\w+\(', clean_lines.elided[i]) is not None return False def IsInitializerList(clean_lines, linenum): """Check if current line is inside constructor initializer list. Args: clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. Returns: True if current line appears to be inside constructor initializer list, False otherwise. """ for i in xrange(linenum, 1, -1): line = clean_lines.elided[i] if i == linenum: remove_function_body = Match(r'^(.*)\{\s*$', line) if remove_function_body: line = remove_function_body.group(1) if Search(r'\s:\s*\w+[({]', line): # A lone colon tend to indicate the start of a constructor # initializer list. It could also be a ternary operator, which # also tend to appear in constructor initializer lists as # opposed to parameter lists. return True if Search(r'\}\s*,\s*$', line): # A closing brace followed by a comma is probably the end of a # brace-initialized member in constructor initializer list. return True if Search(r'[{};]\s*$', line): # Found one of the following: # - A closing brace or semicolon, probably the end of the previous # function. # - An opening brace, probably the start of current class or namespace. # # Current line is probably not inside an initializer list since # we saw one of those things without seeing the starting colon. return False # Got to the beginning of the file without seeing the start of # constructor initializer list. return False def CheckForNonConstReference(filename, clean_lines, linenum, nesting_state, error): """Check for non-const references. Separate from CheckLanguage since it scans backwards from current line, instead of scanning forward. Args: filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. nesting_state: A NestingState instance which maintains information about the current stack of nested blocks being parsed. error: The function to call with any errors found. """ # Do nothing if there is no '&' on current line. line = clean_lines.elided[linenum] if '&' not in line: return # If a function is inherited, current function doesn't have much of # a choice, so any non-const references should not be blamed on # derived function. if IsDerivedFunction(clean_lines, linenum): return # Don't warn on out-of-line method definitions, as we would warn on the # in-line declaration, if it isn't marked with 'override'. if IsOutOfLineMethodDefinition(clean_lines, linenum): return # Long type names may be broken across multiple lines, usually in one # of these forms: # LongType # ::LongTypeContinued &identifier # LongType:: # LongTypeContinued &identifier # LongType< # ...>::LongTypeContinued &identifier # # If we detected a type split across two lines, join the previous # line to current line so that we can match const references # accordingly. # # Note that this only scans back one line, since scanning back # arbitrary number of lines would be expensive. If you have a type # that spans more than 2 lines, please use a typedef. if linenum > 1: previous = None if Match(r'\s*::(?:[\w<>]|::)+\s*&\s*\S', line): # previous_line\n + ::current_line previous = Search(r'\b((?:const\s*)?(?:[\w<>]|::)+[\w<>])\s*$', clean_lines.elided[linenum - 1]) elif Match(r'\s*[a-zA-Z_]([\w<>]|::)+\s*&\s*\S', line): # previous_line::\n + current_line previous = Search(r'\b((?:const\s*)?(?:[\w<>]|::)+::)\s*$', clean_lines.elided[linenum - 1]) if previous: line = previous.group(1) + line.lstrip() else: # Check for templated parameter that is split across multiple lines endpos = line.rfind('>') if endpos > -1: (_, startline, startpos) = ReverseCloseExpression( clean_lines, linenum, endpos) if startpos > -1 and startline < linenum: # Found the matching < on an earlier line, collect all # pieces up to current line. line = '' for i in xrange(startline, linenum + 1): line += clean_lines.elided[i].strip() # Check for non-const references in function parameters. A single '&' may # found in the following places: # inside expression: binary & for bitwise AND # inside expression: unary & for taking the address of something # inside declarators: reference parameter # We will exclude the first two cases by checking that we are not inside a # function body, including one that was just introduced by a trailing '{'. # TODO(unknown): Doesn't account for 'catch(Exception& e)' [rare]. if (nesting_state.previous_stack_top and not (isinstance(nesting_state.previous_stack_top, _ClassInfo) or isinstance(nesting_state.previous_stack_top, _NamespaceInfo))): # Not at toplevel, not within a class, and not within a namespace return # Avoid initializer lists. We only need to scan back from the # current line for something that starts with ':'. # # We don't need to check the current line, since the '&' would # appear inside the second set of parentheses on the current line as # opposed to the first set. if linenum > 0: for i in xrange(linenum - 1, max(0, linenum - 10), -1): previous_line = clean_lines.elided[i] if not Search(r'[),]\s*$', previous_line): break if Match(r'^\s*:\s+\S', previous_line): return # Avoid preprocessors if Search(r'\\\s*$', line): return # Avoid constructor initializer lists if IsInitializerList(clean_lines, linenum): return # We allow non-const references in a few standard places, like functions # called "swap()" or iostream operators like "<<" or ">>". Do not check # those function parameters. # # We also accept & in static_assert, which looks like a function but # it's actually a declaration expression. whitelisted_functions = (r'(?:[sS]wap(?:<\w:+>)?|' r'operator\s*[<>][<>]|' r'static_assert|COMPILE_ASSERT' r')\s*\(') if Search(whitelisted_functions, line): return elif not Search(r'\S+\([^)]*$', line): # Don't see a whitelisted function on this line. Actually we # didn't see any function name on this line, so this is likely a # multi-line parameter list. Try a bit harder to catch this case. for i in xrange(2): if (linenum > i and Search(whitelisted_functions, clean_lines.elided[linenum - i - 1])): return decls = ReplaceAll(r'{[^}]*}', ' ', line) # exclude function body for parameter in re.findall(_RE_PATTERN_REF_PARAM, decls): if not Match(_RE_PATTERN_CONST_REF_PARAM, parameter): error(filename, linenum, 'runtime/references', 2, 'Is this a non-const reference? ' 'If so, make const or use a pointer: ' + ReplaceAll(' *<', '<', parameter)) def CheckCasts(filename, clean_lines, linenum, error): """Various cast related checks. Args: filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. error: The function to call with any errors found. """ line = clean_lines.elided[linenum] # Check to see if they're using an conversion function cast. # I just try to capture the most common basic types, though there are more. # Parameterless conversion functions, such as bool(), are allowed as they are # probably a member operator declaration or default constructor. match = Search( r'(\bnew\s+|\S<\s*(?:const\s+)?)?\b' r'(int|float|double|bool|char|int32|uint32|int64|uint64)' r'(\([^)].*)', line) expecting_function = ExpectingFunctionArgs(clean_lines, linenum) if match and not expecting_function: matched_type = match.group(2) # matched_new_or_template is used to silence two false positives: # - New operators # - Template arguments with function types # # For template arguments, we match on types immediately following # an opening bracket without any spaces. This is a fast way to # silence the common case where the function type is the first # template argument. False negative with less-than comparison is # avoided because those operators are usually followed by a space. # # function // bracket + no space = false positive # value < double(42) // bracket + space = true positive matched_new_or_template = match.group(1) # Avoid arrays by looking for brackets that come after the closing # parenthesis. if Match(r'\([^()]+\)\s*\[', match.group(3)): return # Other things to ignore: # - Function pointers # - Casts to pointer types # - Placement new # - Alias declarations matched_funcptr = match.group(3) if (matched_new_or_template is None and not (matched_funcptr and (Match(r'\((?:[^() ]+::\s*\*\s*)?[^() ]+\)\s*\(', matched_funcptr) or matched_funcptr.startswith('(*)'))) and not Match(r'\s*using\s+\S+\s*=\s*' + matched_type, line) and not Search(r'new\(\S+\)\s*' + matched_type, line)): error(filename, linenum, 'readability/casting', 4, 'Using deprecated casting style. ' 'Use static_cast<%s>(...) instead' % matched_type) if not expecting_function: CheckCStyleCast(filename, clean_lines, linenum, 'static_cast', r'\((int|float|double|bool|char|u?int(16|32|64))\)', error) # This doesn't catch all cases. Consider (const char * const)"hello". # # (char *) "foo" should always be a const_cast (reinterpret_cast won't # compile). if CheckCStyleCast(filename, clean_lines, linenum, 'const_cast', r'\((char\s?\*+\s?)\)\s*"', error): pass else: # Check pointer casts for other than string constants CheckCStyleCast(filename, clean_lines, linenum, 'reinterpret_cast', r'\((\w+\s?\*+\s?)\)', error) # In addition, we look for people taking the address of a cast. This # is dangerous -- casts can assign to temporaries, so the pointer doesn't # point where you think. # # Some non-identifier character is required before the '&' for the # expression to be recognized as a cast. These are casts: # expression = &static_cast(temporary()); # function(&(int*)(temporary())); # # This is not a cast: # reference_type&(int* function_param); match = Search( r'(?:[^\w]&\(([^)*][^)]*)\)[\w(])|' r'(?:[^\w]&(static|dynamic|down|reinterpret)_cast\b)', line) if match: # Try a better error message when the & is bound to something # dereferenced by the casted pointer, as opposed to the casted # pointer itself. parenthesis_error = False match = Match(r'^(.*&(?:static|dynamic|down|reinterpret)_cast\b)<', line) if match: _, y1, x1 = CloseExpression(clean_lines, linenum, len(match.group(1))) if x1 >= 0 and clean_lines.elided[y1][x1] == '(': _, y2, x2 = CloseExpression(clean_lines, y1, x1) if x2 >= 0: extended_line = clean_lines.elided[y2][x2:] if y2 < clean_lines.NumLines() - 1: extended_line += clean_lines.elided[y2 + 1] if Match(r'\s*(?:->|\[)', extended_line): parenthesis_error = True if parenthesis_error: error(filename, linenum, 'readability/casting', 4, ('Are you taking an address of something dereferenced ' 'from a cast? Wrapping the dereferenced expression in ' 'parentheses will make the binding more obvious')) else: error(filename, linenum, 'runtime/casting', 4, ('Are you taking an address of a cast? ' 'This is dangerous: could be a temp var. ' 'Take the address before doing the cast, rather than after')) def CheckCStyleCast(filename, clean_lines, linenum, cast_type, pattern, error): """Checks for a C-style cast by looking for the pattern. Args: filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. cast_type: The string for the C++ cast to recommend. This is either reinterpret_cast, static_cast, or const_cast, depending. pattern: The regular expression used to find C-style casts. error: The function to call with any errors found. Returns: True if an error was emitted. False otherwise. """ line = clean_lines.elided[linenum] match = Search(pattern, line) if not match: return False # Exclude lines with keywords that tend to look like casts context = line[0:match.start(1) - 1] if Match(r'.*\b(?:sizeof|alignof|alignas|[_A-Z][_A-Z0-9]*)\s*$', context): return False # Try expanding current context to see if we one level of # parentheses inside a macro. if linenum > 0: for i in xrange(linenum - 1, max(0, linenum - 5), -1): context = clean_lines.elided[i] + context if Match(r'.*\b[_A-Z][_A-Z0-9]*\s*\((?:\([^()]*\)|[^()])*$', context): return False # operator++(int) and operator--(int) if context.endswith(' operator++') or context.endswith(' operator--'): return False # A single unnamed argument for a function tends to look like old # style cast. If we see those, don't issue warnings for deprecated # casts, instead issue warnings for unnamed arguments where # appropriate. # # These are things that we want warnings for, since the style guide # explicitly require all parameters to be named: # Function(int); # Function(int) { # ConstMember(int) const; # ConstMember(int) const { # ExceptionMember(int) throw (...); # ExceptionMember(int) throw (...) { # PureVirtual(int) = 0; # [](int) -> bool { # # These are functions of some sort, where the compiler would be fine # if they had named parameters, but people often omit those # identifiers to reduce clutter: # (FunctionPointer)(int); # (FunctionPointer)(int) = value; # Function((function_pointer_arg)(int)) # Function((function_pointer_arg)(int), int param) # ; # <(FunctionPointerTemplateArgument)(int)>; remainder = line[match.end(0):] if Match(r'^\s*(?:;|const\b|throw\b|final\b|override\b|[=>{),]|->)', remainder): # Looks like an unnamed parameter. # Don't warn on any kind of template arguments. if Match(r'^\s*>', remainder): return False # Don't warn on assignments to function pointers, but keep warnings for # unnamed parameters to pure virtual functions. Note that this pattern # will also pass on assignments of "0" to function pointers, but the # preferred values for those would be "nullptr" or "NULL". matched_zero = Match(r'^\s=\s*(\S+)\s*;', remainder) if matched_zero and matched_zero.group(1) != '0': return False # Don't warn on function pointer declarations. For this we need # to check what came before the "(type)" string. if Match(r'.*\)\s*$', line[0:match.start(0)]): return False # Don't warn if the parameter is named with block comments, e.g.: # Function(int /*unused_param*/); raw_line = clean_lines.raw_lines[linenum] if '/*' in raw_line: return False # Passed all filters, issue warning here. error(filename, linenum, 'readability/function', 3, 'All parameters should be named in a function') return True # At this point, all that should be left is actual casts. error(filename, linenum, 'readability/casting', 4, 'Using C-style cast. Use %s<%s>(...) instead' % (cast_type, match.group(1))) return True def ExpectingFunctionArgs(clean_lines, linenum): """Checks whether where function type arguments are expected. Args: clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. Returns: True if the line at 'linenum' is inside something that expects arguments of function types. """ line = clean_lines.elided[linenum] return (Match(r'^\s*MOCK_(CONST_)?METHOD\d+(_T)?\(', line) or (linenum >= 2 and (Match(r'^\s*MOCK_(?:CONST_)?METHOD\d+(?:_T)?\((?:\S+,)?\s*$', clean_lines.elided[linenum - 1]) or Match(r'^\s*MOCK_(?:CONST_)?METHOD\d+(?:_T)?\(\s*$', clean_lines.elided[linenum - 2]) or Search(r'\bstd::m?function\s*\<\s*$', clean_lines.elided[linenum - 1])))) _HEADERS_CONTAINING_TEMPLATES = ( ('', ('deque',)), ('', ('unary_function', 'binary_function', 'plus', 'minus', 'multiplies', 'divides', 'modulus', 'negate', 'equal_to', 'not_equal_to', 'greater', 'less', 'greater_equal', 'less_equal', 'logical_and', 'logical_or', 'logical_not', 'unary_negate', 'not1', 'binary_negate', 'not2', 'bind1st', 'bind2nd', 'pointer_to_unary_function', 'pointer_to_binary_function', 'ptr_fun', 'mem_fun_t', 'mem_fun', 'mem_fun1_t', 'mem_fun1_ref_t', 'mem_fun_ref_t', 'const_mem_fun_t', 'const_mem_fun1_t', 'const_mem_fun_ref_t', 'const_mem_fun1_ref_t', 'mem_fun_ref', )), ('', ('numeric_limits',)), ('', ('list',)), ('', ('map', 'multimap',)), ('', ('allocator',)), ('', ('queue', 'priority_queue',)), ('', ('set', 'multiset',)), ('', ('stack',)), ('', ('char_traits', 'basic_string',)), ('', ('tuple',)), ('', ('pair',)), ('', ('vector',)), # gcc extensions. # Note: std::hash is their hash, ::hash is our hash ('', ('hash_map', 'hash_multimap',)), ('', ('hash_set', 'hash_multiset',)), ('', ('slist',)), ) _RE_PATTERN_STRING = re.compile(r'\bstring\b') _re_pattern_algorithm_header = [] for _template in ('copy', 'max', 'min', 'min_element', 'sort', 'swap', 'transform'): # Match max(..., ...), max(..., ...), but not foo->max, foo.max or # type::max(). _re_pattern_algorithm_header.append( (re.compile(r'[^>.]\b' + _template + r'(<.*?>)?\([^\)]'), _template, '')) _re_pattern_templates = [] for _header, _templates in _HEADERS_CONTAINING_TEMPLATES: for _template in _templates: _re_pattern_templates.append( (re.compile(r'(\<|\b)' + _template + r'\s*\<'), _template + '<>', _header)) def FilesBelongToSameModule(filename_cc, filename_h): """Check if these two filenames belong to the same module. The concept of a 'module' here is a as follows: foo.h, foo-inl.h, foo.cc, foo_test.cc and foo_unittest.cc belong to the same 'module' if they are in the same directory. some/path/public/xyzzy and some/path/internal/xyzzy are also considered to belong to the same module here. If the filename_cc contains a longer path than the filename_h, for example, '/absolute/path/to/base/sysinfo.cc', and this file would include 'base/sysinfo.h', this function also produces the prefix needed to open the header. This is used by the caller of this function to more robustly open the header file. We don't have access to the real include paths in this context, so we need this guesswork here. Known bugs: tools/base/bar.cc and base/bar.h belong to the same module according to this implementation. Because of this, this function gives some false positives. This should be sufficiently rare in practice. Args: filename_cc: is the path for the .cc file filename_h: is the path for the header path Returns: Tuple with a bool and a string: bool: True if filename_cc and filename_h belong to the same module. string: the additional prefix needed to open the header file. """ if not filename_cc.endswith('.cc'): return (False, '') filename_cc = filename_cc[:-len('.cc')] if filename_cc.endswith('_unittest'): filename_cc = filename_cc[:-len('_unittest')] elif filename_cc.endswith('_test'): filename_cc = filename_cc[:-len('_test')] filename_cc = filename_cc.replace('/public/', '/') filename_cc = filename_cc.replace('/internal/', '/') if not filename_h.endswith('.h'): return (False, '') filename_h = filename_h[:-len('.h')] if filename_h.endswith('-inl'): filename_h = filename_h[:-len('-inl')] filename_h = filename_h.replace('/public/', '/') filename_h = filename_h.replace('/internal/', '/') files_belong_to_same_module = filename_cc.endswith(filename_h) common_path = '' if files_belong_to_same_module: common_path = filename_cc[:-len(filename_h)] return files_belong_to_same_module, common_path def UpdateIncludeState(filename, include_dict, io=codecs): """Fill up the include_dict with new includes found from the file. Args: filename: the name of the header to read. include_dict: a dictionary in which the headers are inserted. io: The io factory to use to read the file. Provided for testability. Returns: True if a header was successfully added. False otherwise. """ headerfile = None try: headerfile = io.open(filename, 'r', 'utf8', 'replace') except IOError: return False linenum = 0 for line in headerfile: linenum += 1 clean_line = CleanseComments(line) match = _RE_PATTERN_INCLUDE.search(clean_line) if match: include = match.group(2) include_dict.setdefault(include, linenum) return True def CheckForIncludeWhatYouUse(filename, clean_lines, include_state, error, io=codecs): """Reports for missing stl includes. This function will output warnings to make sure you are including the headers necessary for the stl containers and functions that you use. We only give one reason to include a header. For example, if you use both equal_to<> and less<> in a .h file, only one (the latter in the file) of these will be reported as a reason to include the . Args: filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. include_state: An _IncludeState instance. error: The function to call with any errors found. io: The IO factory to use to read the header file. Provided for unittest injection. """ required = {} # A map of header name to linenumber and the template entity. # Example of required: { '': (1219, 'less<>') } for linenum in xrange(clean_lines.NumLines()): line = clean_lines.elided[linenum] if not line or line[0] == '#': continue # String is special -- it is a non-templatized type in STL. matched = _RE_PATTERN_STRING.search(line) if matched: # Don't warn about strings in non-STL namespaces: # (We check only the first match per line; good enough.) prefix = line[:matched.start()] if prefix.endswith('std::') or not prefix.endswith('::'): required[''] = (linenum, 'string') for pattern, template, header in _re_pattern_algorithm_header: if pattern.search(line): required[header] = (linenum, template) # The following function is just a speed up, no semantics are changed. if not '<' in line: # Reduces the cpu time usage by skipping lines. continue for pattern, template, header in _re_pattern_templates: if pattern.search(line): required[header] = (linenum, template) # The policy is that if you #include something in foo.h you don't need to # include it again in foo.cc. Here, we will look at possible includes. # Let's flatten the include_state include_list and copy it into a dictionary. include_dict = dict([item for sublist in include_state.include_list for item in sublist]) # Did we find the header for this file (if any) and successfully load it? header_found = False # Use the absolute path so that matching works properly. abs_filename = FileInfo(filename).FullName() # For Emacs's flymake. # If cpplint is invoked from Emacs's flymake, a temporary file is generated # by flymake and that file name might end with '_flymake.cc'. In that case, # restore original file name here so that the corresponding header file can be # found. # e.g. If the file name is 'foo_flymake.cc', we should search for 'foo.h' # instead of 'foo_flymake.h' abs_filename = re.sub(r'_flymake\.cc$', '.cc', abs_filename) # include_dict is modified during iteration, so we iterate over a copy of # the keys. header_keys = include_dict.keys() for header in header_keys: (same_module, common_path) = FilesBelongToSameModule(abs_filename, header) fullpath = common_path + header if same_module and UpdateIncludeState(fullpath, include_dict, io): header_found = True # If we can't find the header file for a .cc, assume it's because we don't # know where to look. In that case we'll give up as we're not sure they # didn't include it in the .h file. # TODO(unknown): Do a better job of finding .h files so we are confident that # not having the .h file means there isn't one. if filename.endswith('.cc') and not header_found: return # All the lines have been processed, report the errors found. for required_header_unstripped in required: template = required[required_header_unstripped][1] if required_header_unstripped.strip('<>"') not in include_dict: error(filename, required[required_header_unstripped][0], 'build/include_what_you_use', 4, 'Add #include ' + required_header_unstripped + ' for ' + template) _RE_PATTERN_EXPLICIT_MAKEPAIR = re.compile(r'\bmake_pair\s*<') def CheckMakePairUsesDeduction(filename, clean_lines, linenum, error): """Check that make_pair's template arguments are deduced. G++ 4.6 in C++11 mode fails badly if make_pair's template arguments are specified explicitly, and such use isn't intended in any case. Args: filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. error: The function to call with any errors found. """ line = clean_lines.elided[linenum] match = _RE_PATTERN_EXPLICIT_MAKEPAIR.search(line) if match: error(filename, linenum, 'build/explicit_make_pair', 4, # 4 = high confidence 'For C++11-compatibility, omit template arguments from make_pair' ' OR use pair directly OR if appropriate, construct a pair directly') def CheckDefaultLambdaCaptures(filename, clean_lines, linenum, error): """Check that default lambda captures are not used. Args: filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. error: The function to call with any errors found. """ line = clean_lines.elided[linenum] # A lambda introducer specifies a default capture if it starts with "[=" # or if it starts with "[&" _not_ followed by an identifier. match = Match(r'^(.*)\[\s*(?:=|&[^\w])', line) if match: # Found a potential error, check what comes after the lambda-introducer. # If it's not open parenthesis (for lambda-declarator) or open brace # (for compound-statement), it's not a lambda. line, _, pos = CloseExpression(clean_lines, linenum, len(match.group(1))) if pos >= 0 and Match(r'^\s*[{(]', line[pos:]): error(filename, linenum, 'build/c++11', 4, # 4 = high confidence 'Default lambda captures are an unapproved C++ feature.') def CheckRedundantVirtual(filename, clean_lines, linenum, error): """Check if line contains a redundant "virtual" function-specifier. Args: filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. error: The function to call with any errors found. """ # Look for "virtual" on current line. line = clean_lines.elided[linenum] virtual = Match(r'^(.*)(\bvirtual\b)(.*)$', line) if not virtual: return # Ignore "virtual" keywords that are near access-specifiers. These # are only used in class base-specifier and do not apply to member # functions. if (Search(r'\b(public|protected|private)\s+$', virtual.group(1)) or Match(r'^\s+(public|protected|private)\b', virtual.group(3))): return # Ignore the "virtual" keyword from virtual base classes. Usually # there is a column on the same line in these cases (virtual base # classes are rare in google3 because multiple inheritance is rare). if Match(r'^.*[^:]:[^:].*$', line): return # Look for the next opening parenthesis. This is the start of the # parameter list (possibly on the next line shortly after virtual). # TODO(unknown): doesn't work if there are virtual functions with # decltype() or other things that use parentheses, but csearch suggests # that this is rare. end_col = -1 end_line = -1 start_col = len(virtual.group(2)) for start_line in xrange(linenum, min(linenum + 3, clean_lines.NumLines())): line = clean_lines.elided[start_line][start_col:] parameter_list = Match(r'^([^(]*)\(', line) if parameter_list: # Match parentheses to find the end of the parameter list (_, end_line, end_col) = CloseExpression( clean_lines, start_line, start_col + len(parameter_list.group(1))) break start_col = 0 if end_col < 0: return # Couldn't find end of parameter list, give up # Look for "override" or "final" after the parameter list # (possibly on the next few lines). for i in xrange(end_line, min(end_line + 3, clean_lines.NumLines())): line = clean_lines.elided[i][end_col:] match = Search(r'\b(override|final)\b', line) if match: error(filename, linenum, 'readability/inheritance', 4, ('"virtual" is redundant since function is ' 'already declared as "%s"' % match.group(1))) # Set end_col to check whole lines after we are done with the # first line. end_col = 0 if Search(r'[^\w]\s*$', line): break def CheckRedundantOverrideOrFinal(filename, clean_lines, linenum, error): """Check if line contains a redundant "override" or "final" virt-specifier. Args: filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. error: The function to call with any errors found. """ # Look for closing parenthesis nearby. We need one to confirm where # the declarator ends and where the virt-specifier starts to avoid # false positives. line = clean_lines.elided[linenum] declarator_end = line.rfind(')') if declarator_end >= 0: fragment = line[declarator_end:] else: if linenum > 1 and clean_lines.elided[linenum - 1].rfind(')') >= 0: fragment = line else: return # Check that at most one of "override" or "final" is present, not both if Search(r'\boverride\b', fragment) and Search(r'\bfinal\b', fragment): error(filename, linenum, 'readability/inheritance', 4, ('"override" is redundant since function is ' 'already declared as "final"')) # Returns true if we are at a new block, and it is directly # inside of a namespace. def IsBlockInNameSpace(nesting_state, is_forward_declaration): """Checks that the new block is directly in a namespace. Args: nesting_state: The _NestingState object that contains info about our state. is_forward_declaration: If the class is a forward declared class. Returns: Whether or not the new block is directly in a namespace. """ if is_forward_declaration: if len(nesting_state.stack) >= 1 and ( isinstance(nesting_state.stack[-1], _NamespaceInfo)): return True else: return False return (len(nesting_state.stack) > 1 and nesting_state.stack[-1].check_namespace_indentation and isinstance(nesting_state.stack[-2], _NamespaceInfo)) def ShouldCheckNamespaceIndentation(nesting_state, is_namespace_indent_item, raw_lines_no_comments, linenum): """This method determines if we should apply our namespace indentation check. Args: nesting_state: The current nesting state. is_namespace_indent_item: If we just put a new class on the stack, True. If the top of the stack is not a class, or we did not recently add the class, False. raw_lines_no_comments: The lines without the comments. linenum: The current line number we are processing. Returns: True if we should apply our namespace indentation check. Currently, it only works for classes and namespaces inside of a namespace. """ is_forward_declaration = IsForwardClassDeclaration(raw_lines_no_comments, linenum) if not (is_namespace_indent_item or is_forward_declaration): return False # If we are in a macro, we do not want to check the namespace indentation. if IsMacroDefinition(raw_lines_no_comments, linenum): return False return IsBlockInNameSpace(nesting_state, is_forward_declaration) # Call this method if the line is directly inside of a namespace. # If the line above is blank (excluding comments) or the start of # an inner namespace, it cannot be indented. def CheckItemIndentationInNamespace(filename, raw_lines_no_comments, linenum, error): line = raw_lines_no_comments[linenum] if Match(r'^\s+', line): error(filename, linenum, 'runtime/indentation_namespace', 4, 'Do not indent within a namespace') def ProcessLine(filename, file_extension, clean_lines, line, include_state, function_state, nesting_state, error, extra_check_functions=[]): """Processes a single line in the file. Args: filename: Filename of the file that is being processed. file_extension: The extension (dot not included) of the file. clean_lines: An array of strings, each representing a line of the file, with comments stripped. line: Number of line being processed. include_state: An _IncludeState instance in which the headers are inserted. function_state: A _FunctionState instance which counts function lines, etc. nesting_state: A NestingState instance which maintains information about the current stack of nested blocks being parsed. error: A callable to which errors are reported, which takes 4 arguments: filename, line number, error level, and message extra_check_functions: An array of additional check functions that will be run on each source line. Each function takes 4 arguments: filename, clean_lines, line, error """ raw_lines = clean_lines.raw_lines ParseNolintSuppressions(filename, raw_lines[line], line, error) nesting_state.Update(filename, clean_lines, line, error) CheckForNamespaceIndentation(filename, nesting_state, clean_lines, line, error) if nesting_state.InAsmBlock(): return CheckForFunctionLengths(filename, clean_lines, line, function_state, error) CheckForMultilineCommentsAndStrings(filename, clean_lines, line, error) CheckStyle(filename, clean_lines, line, file_extension, nesting_state, error) CheckLanguage(filename, clean_lines, line, file_extension, include_state, nesting_state, error) CheckForNonConstReference(filename, clean_lines, line, nesting_state, error) CheckForNonStandardConstructs(filename, clean_lines, line, nesting_state, error) CheckVlogArguments(filename, clean_lines, line, error) CheckPosixThreading(filename, clean_lines, line, error) CheckInvalidIncrement(filename, clean_lines, line, error) CheckMakePairUsesDeduction(filename, clean_lines, line, error) CheckDefaultLambdaCaptures(filename, clean_lines, line, error) CheckRedundantVirtual(filename, clean_lines, line, error) CheckRedundantOverrideOrFinal(filename, clean_lines, line, error) for check_fn in extra_check_functions: check_fn(filename, clean_lines, line, error) def FlagCxx11Features(filename, clean_lines, linenum, error): """Flag those c++11 features that we only allow in certain places. Args: filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. error: The function to call with any errors found. """ line = clean_lines.elided[linenum] # Flag unapproved C++11 headers. include = Match(r'\s*#\s*include\s+[<"]([^<"]+)[">]', line) if include and include.group(1) in ('cfenv', 'condition_variable', 'fenv.h', 'future', 'mutex', 'thread', 'chrono', 'ratio', 'regex', 'system_error', ): error(filename, linenum, 'build/c++11', 5, ('<%s> is an unapproved C++11 header.') % include.group(1)) # The only place where we need to worry about C++11 keywords and library # features in preprocessor directives is in macro definitions. if Match(r'\s*#', line) and not Match(r'\s*#\s*define\b', line): return # These are classes and free functions. The classes are always # mentioned as std::*, but we only catch the free functions if # they're not found by ADL. They're alphabetical by header. for top_name in ( # type_traits 'alignment_of', 'aligned_union', ): if Search(r'\bstd::%s\b' % top_name, line): error(filename, linenum, 'build/c++11', 5, ('std::%s is an unapproved C++11 class or function. Send c-style ' 'an example of where it would make your code more readable, and ' 'they may let you use it.') % top_name) def ProcessFileData(filename, file_extension, lines, error, extra_check_functions=[]): """Performs lint checks and reports any errors to the given error function. Args: filename: Filename of the file that is being processed. file_extension: The extension (dot not included) of the file. lines: An array of strings, each representing a line of the file, with the last element being empty if the file is terminated with a newline. error: A callable to which errors are reported, which takes 4 arguments: filename, line number, error level, and message extra_check_functions: An array of additional check functions that will be run on each source line. Each function takes 4 arguments: filename, clean_lines, line, error """ lines = (['// marker so line numbers and indices both start at 1'] + lines + ['// marker so line numbers end in a known way']) include_state = _IncludeState() function_state = _FunctionState() nesting_state = NestingState() ResetNolintSuppressions() CheckForCopyright(filename, lines, error) RemoveMultiLineComments(filename, lines, error) clean_lines = CleansedLines(lines) if file_extension == 'h': CheckForHeaderGuard(filename, clean_lines, error) for line in xrange(clean_lines.NumLines()): ProcessLine(filename, file_extension, clean_lines, line, include_state, function_state, nesting_state, error, extra_check_functions) FlagCxx11Features(filename, clean_lines, line, error) nesting_state.CheckCompletedBlocks(filename, error) CheckForIncludeWhatYouUse(filename, clean_lines, include_state, error) # Check that the .cc file has included its header if it exists. if file_extension == 'cc': CheckHeaderFileIncluded(filename, include_state, error) # We check here rather than inside ProcessLine so that we see raw # lines rather than "cleaned" lines. CheckForBadCharacters(filename, lines, error) CheckForNewlineAtEOF(filename, lines, error) def ProcessConfigOverrides(filename): """ Loads the configuration files and processes the config overrides. Args: filename: The name of the file being processed by the linter. Returns: False if the current |filename| should not be processed further. """ abs_filename = os.path.abspath(filename) cfg_filters = [] keep_looking = True while keep_looking: abs_path, base_name = os.path.split(abs_filename) if not base_name: break # Reached the root directory. cfg_file = os.path.join(abs_path, "CPPLINT.cfg") abs_filename = abs_path if not os.path.isfile(cfg_file): continue try: with open(cfg_file) as file_handle: for line in file_handle: line, _, _ = line.partition('#') # Remove comments. if not line.strip(): continue name, _, val = line.partition('=') name = name.strip() val = val.strip() if name == 'set noparent': keep_looking = False elif name == 'filter': cfg_filters.append(val) elif name == 'exclude_files': # When matching exclude_files pattern, use the base_name of # the current file name or the directory name we are processing. # For example, if we are checking for lint errors in /foo/bar/baz.cc # and we found the .cfg file at /foo/CPPLINT.cfg, then the config # file's "exclude_files" filter is meant to be checked against "bar" # and not "baz" nor "bar/baz.cc". if base_name: pattern = re.compile(val) if pattern.match(base_name): sys.stderr.write('Ignoring "%s": file excluded by "%s". ' 'File path component "%s" matches ' 'pattern "%s"\n' % (filename, cfg_file, base_name, val)) return False elif name == 'linelength': global _line_length try: _line_length = int(val) except ValueError: sys.stderr.write('Line length must be numeric.') else: sys.stderr.write( 'Invalid configuration option (%s) in file %s\n' % (name, cfg_file)) except IOError: sys.stderr.write( "Skipping config file '%s': Can't open for reading\n" % cfg_file) keep_looking = False # Apply all the accumulated filters in reverse order (top-level directory # config options having the least priority). for filter in reversed(cfg_filters): _AddFilters(filter) return True def ProcessFile(filename, vlevel, extra_check_functions=[]): """Does google-lint on a single file. Args: filename: The name of the file to parse. vlevel: The level of errors to report. Every error of confidence >= verbose_level will be reported. 0 is a good default. extra_check_functions: An array of additional check functions that will be run on each source line. Each function takes 4 arguments: filename, clean_lines, line, error """ _SetVerboseLevel(vlevel) _BackupFilters() if not ProcessConfigOverrides(filename): _RestoreFilters() return lf_lines = [] crlf_lines = [] try: # Support the UNIX convention of using "-" for stdin. Note that # we are not opening the file with universal newline support # (which codecs doesn't support anyway), so the resulting lines do # contain trailing '\r' characters if we are reading a file that # has CRLF endings. # If after the split a trailing '\r' is present, it is removed # below. if filename == '-': lines = codecs.StreamReaderWriter(sys.stdin, codecs.getreader('utf8'), codecs.getwriter('utf8'), 'replace').read().split('\n') else: lines = codecs.open(filename, 'r', 'utf8', 'replace').read().split('\n') # Remove trailing '\r'. # The -1 accounts for the extra trailing blank line we get from split() for linenum in range(len(lines) - 1): if lines[linenum].endswith('\r'): lines[linenum] = lines[linenum].rstrip('\r') crlf_lines.append(linenum + 1) else: lf_lines.append(linenum + 1) except IOError: sys.stderr.write( "Skipping input '%s': Can't open for reading\n" % filename) _RestoreFilters() return # Note, if no dot is found, this will give the entire filename as the ext. file_extension = filename[filename.rfind('.') + 1:] # When reading from stdin, the extension is unknown, so no cpplint tests # should rely on the extension. if filename != '-' and file_extension not in _valid_extensions: sys.stderr.write('Ignoring %s; not a valid file name ' '(%s)\n' % (filename, ', '.join(_valid_extensions))) else: ProcessFileData(filename, file_extension, lines, Error, extra_check_functions) # If end-of-line sequences are a mix of LF and CR-LF, issue # warnings on the lines with CR. # # Don't issue any warnings if all lines are uniformly LF or CR-LF, # since critique can handle these just fine, and the style guide # doesn't dictate a particular end of line sequence. # # We can't depend on os.linesep to determine what the desired # end-of-line sequence should be, since that will return the # server-side end-of-line sequence. if lf_lines and crlf_lines: # Warn on every line with CR. An alternative approach might be to # check whether the file is mostly CRLF or just LF, and warn on the # minority, we bias toward LF here since most tools prefer LF. for linenum in crlf_lines: Error(filename, linenum, 'whitespace/newline', 1, 'Unexpected \\r (^M) found; better to use only \\n') sys.stderr.write('Done processing %s\n' % filename) _RestoreFilters() def PrintUsage(message): """Prints a brief usage string and exits, optionally with an error message. Args: message: The optional error message. """ sys.stderr.write(_USAGE) if message: sys.exit('\nFATAL ERROR: ' + message) else: sys.exit(1) def PrintCategories(): """Prints a list of all the error-categories used by error messages. These are the categories used to filter messages via --filter. """ sys.stderr.write(''.join(' %s\n' % cat for cat in _ERROR_CATEGORIES)) sys.exit(0) def ParseArguments(args): """Parses the command line arguments. This may set the output format and verbosity level as side-effects. Args: args: The command line arguments: Returns: The list of filenames to lint. """ try: (opts, filenames) = getopt.getopt(args, '', ['help', 'output=', 'verbose=', 'counting=', 'filter=', 'root=', 'linelength=', 'extensions=']) except getopt.GetoptError: PrintUsage('Invalid arguments.') verbosity = _VerboseLevel() output_format = _OutputFormat() filters = '' counting_style = '' for (opt, val) in opts: if opt == '--help': PrintUsage(None) elif opt == '--output': if val not in ('emacs', 'vs7', 'eclipse'): PrintUsage('The only allowed output formats are emacs, vs7 and eclipse.') output_format = val elif opt == '--verbose': verbosity = int(val) elif opt == '--filter': filters = val if not filters: PrintCategories() elif opt == '--counting': if val not in ('total', 'toplevel', 'detailed'): PrintUsage('Valid counting options are total, toplevel, and detailed') counting_style = val elif opt == '--root': global _root _root = val elif opt == '--linelength': global _line_length try: _line_length = int(val) except ValueError: PrintUsage('Line length must be digits.') elif opt == '--extensions': global _valid_extensions try: _valid_extensions = set(val.split(',')) except ValueError: PrintUsage('Extensions must be comma seperated list.') if not filenames: PrintUsage('No files were specified.') _SetOutputFormat(output_format) _SetVerboseLevel(verbosity) _SetFilters(filters) _SetCountingStyle(counting_style) return filenames def main(): filenames = ParseArguments(sys.argv[1:]) # Change stderr to write with replacement characters so we don't die # if we try to print something containing non-ASCII characters. sys.stderr = codecs.StreamReaderWriter(sys.stderr, codecs.getreader('utf8'), codecs.getwriter('utf8'), 'replace') _cpplint_state.ResetErrorCounts() for filename in filenames: ProcessFile(filename, _cpplint_state.verbose_level) _cpplint_state.PrintErrorCounts() sys.exit(_cpplint_state.error_count > 0) if __name__ == '__main__': main() opensurgsim-0.7.0/Tools/000077500000000000000000000000001277777236100152145ustar00rootroot00000000000000opensurgsim-0.7.0/Tools/CMakeLists.txt000066400000000000000000000016471277777236100177640ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. find_package(Boost 1.54 COMPONENTS program_options) if(BUILD_TOOLS AND Boost_PROGRAM_OPTIONS_FOUND) add_subdirectory(NeedleSutureGeneration) else() message("Can't build example NeedleSutureGeneration, missing library boost_program_options.") endif(BUILD_TOOLS AND Boost_PROGRAM_OPTIONS_FOUND) opensurgsim-0.7.0/Tools/Converters/000077500000000000000000000000001277777236100173465ustar00rootroot00000000000000opensurgsim-0.7.0/Tools/Converters/tetgen2ply.py000066400000000000000000000160711277777236100220220ustar00rootroot00000000000000#!/usr/bin/python # This file is a part of the OpenSurgSim project. # Copyright 2012-2015, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Convert a TetGen set of files .node/.ele into a PLY file readable by OSS Typical usage: TetGen_to_PLY.py input.node input.ele [input.face] [input.fixedNodes] output.ply """ import csv import argparse if __name__ == '__main__': parser = argparse.ArgumentParser( description="Convert a TetGen set of filename into a PLY file readable by OSS.") parser.add_argument('nodes', help='Filename for the nodes input.') parser.add_argument('elements', help='Filename for the tetrahedrons input.') parser.add_argument('--faces', help='Filename for the faces input.') parser.add_argument('--fixedNodes', help='Filename for the fixed node indices.') parser.add_argument('--massDensity', help='Mass density.', default='2000.0') parser.add_argument('--youngModulus', help='Young modulus.', default='1e7') parser.add_argument('--poissonRatio', help='Poisson ratio.', default='0.45') parser.add_argument('output', help='Filename for the PLY output.') args = parser.parse_args() numNodes = 0 # Number of nodes, will be read from the header of the .node file numElements = 0 # Number of elements, will be read from the header of the .ele file (support triangle (3) and tetrahedron(4) elements) elementSize = 0 # Element size 3 for triangle, 4 for tetrahedron, will be read from the header of the .ele file numFaces = 0 # Number of triangulated faces (if a .face is provided, number of entries in this file) numFixedNodes = 0 # Number of fixed nodes (if a .fixedNode is provided, number of entries in this file) with open(args.output, 'wb') as csvOutputFile: writer = csv.writer(csvOutputFile, delimiter = ' ', quoting=csv.QUOTE_NONE) writer.writerow(['ply']) writer.writerow(['format', 'ascii', '1.0']) writer.writerow(['comment', 'Created', 'by', 'tetgen2ply']) with open(args.nodes, 'rb') as csvNodeFile: reader = csv.reader(csvNodeFile, delimiter = ' ', skipinitialspace = True) row = reader.next() numNodes = row[0] # Enforcing the need for 3 pieces of information per node (x, y, z) if not row[1] == '3': raise Exception('Invalid node information in ' + args.node + '. Node dimension (expecting 3) was ' + row[1]) writer.writerow(['element', 'vertex', numNodes]) writer.writerow(['property', 'double', 'x']) writer.writerow(['property', 'double', 'y']) writer.writerow(['property', 'double', 'z']) with open(args.elements, 'rb') as csvElementFile: reader = csv.reader(csvElementFile, delimiter = ' ', skipinitialspace = True) row = reader.next() numElements = row[0] if row[1] == '4': writer.writerow(['element', '3d_element', numElements]) elementSize = 4 elif row[1] == '3': writer.writerow(['element', '2d_element', numElements]) elementSize = 3 else : raise Exception('Invalid triangle/tetrahedron information in ' + args.ele + '. Element dimension (expecting 3 or 4) was ' + row[1]) writer.writerow(['property', 'list', 'uint', 'uint', 'vertex_indices']) if args.faces: with open(args.faces, 'rb') as csvFaceFile: reader = csv.reader(csvFaceFile, delimiter = ' ', skipinitialspace = True) row = reader.next() numFaces = row[0] writer.writerow(['element', 'face', numFaces]) writer.writerow(['property', 'list', 'uint', 'uint', 'vertex_indices']) if args.fixedNodes: with open(args.fixedNodes, 'rb') as csvFixedNodeFile: readerFixedNodes = csv.reader(csvFixedNodeFile) for row in readerFixedNodes: numFixedNodes = numFixedNodes + 1 writer.writerow(['element', 'boundary_condition', numFixedNodes]) writer.writerow(['property', 'uint', 'vertex_index']) # Extra parameter (thickness) if the element is a triangle if elementSize == 3: writer.writerow(['element', 'thickness', 1]) writer.writerow(['property', 'double', 'value']) writer.writerow(['element', 'material', 1]) writer.writerow(['property', 'double', 'mass_density']) writer.writerow(['property', 'double', 'poisson_ratio']) writer.writerow(['property', 'double', 'young_modulus']) writer.writerow(['end_header']) # Parse the .node file to format the nodes (x,y,z) with open(args.nodes, 'rb') as csvNodeFile: reader = csv.reader(csvNodeFile, delimiter = ' ', skipinitialspace = True) rowId = 0 # Write all nodes for row in reader: # Skip the commented lines (especially the last line of the .node generated by TetGen) if row[0][0] == '#': continue # Skip the first line (header information), detected by the number of nodes being different than the expected node index if not int(row[0]) == rowId: continue writer.writerow(row[1:]) rowId = rowId + 1 # Parse the .ele file to format the tetrahedrons with open(args.elements, 'rb') as csvElementFile: reader = csv.reader(csvElementFile, delimiter = ' ', skipinitialspace = True) rowId = 0 # Write all tetrahedrons for row in reader: # Skip the commented lines (especially the last line of the .ele generated by TetGen) if row[0][0] == '#': continue # Skip the first line (header information), detected by the number of elements being different than the expected element index if not int(row[0]) == rowId: continue row[0] = elementSize writer.writerow(row) rowId = rowId + 1 # Parse the .face file to format the triangulated faces (if a file is specified) if args.faces: with open(args.faces, 'rb') as csvFaceFile: reader = csv.reader(csvFaceFile, delimiter = ' ', skipinitialspace = True) rowId = 0 # Write all faces for row in reader: # Skip the commented lines (especially the last line of the .face generated by TetGen) if row[0][0] == '#': continue # Skip the first line (header information), detected by the number of faces being different than the expected face index if not int(row[0]) == rowId: continue row[0] = 3 writer.writerow(row[:4]) rowId = rowId + 1 # Write the fixed nodes (boundary conditions) if any if args.fixedNodes: with open(args.fixedNodes, 'rb') as csvFixedNodeFile: readerFixedNodes = csv.reader(csvFixedNodeFile, delimiter = ' ', skipinitialspace = True) for row in readerFixedNodes: writer.writerow(row) # Write a default thickness if the element is a triangle # We should have something closer to 1/100th of the mesh size if we wanted to have a more automated tool if elementSize == 3: writer.writerow(['0.01']) # Write the material (default parameters) writer.writerow([args.massDensity, args.poissonRatio, args.youngModulus]) opensurgsim-0.7.0/Tools/Fragments/000077500000000000000000000000001277777236100171425ustar00rootroot00000000000000opensurgsim-0.7.0/Tools/Fragments/README.txt000066400000000000000000000007411277777236100206420ustar00rootroot00000000000000Scripts in here might have a very specific use case or application, or there might be a need to preprocess or postprocess to utilize them these could be refactored into something more general. merge.py: Merge can take a reference list of vertices from a .ply file and add texture coordinates from a .obj file without changing the order of the vertices in the .ply description. It does not implement a full .ply/.obj parser. See the documentation in the file for more informationopensurgsim-0.7.0/Tools/Fragments/merge-testdata/000077500000000000000000000000001277777236100220505ustar00rootroot00000000000000opensurgsim-0.7.0/Tools/Fragments/merge-testdata/expected-testout.txt000066400000000000000000000003741277777236100261230ustar00rootroot00000000000000This should be the result of doing either python ../merge.py testvertices.txt testobj.txt testout.txt python ../merge.py testvertices.txt testobj-indices.txt testout.txt 4.1 4.2 4.3 4.4 4.5 1.1 1.2 1.3 1.4 1.5 2.1 2.2 2.3 0.0 0.0 3.1 3.2 3.3 3.4 3.5 opensurgsim-0.7.0/Tools/Fragments/merge-testdata/testobj-indices.txt000066400000000000000000000001471277777236100257010ustar00rootroot00000000000000v 1.1 1.3 -1.2 v 3.1 3.3 -3.2 v 4.1 4.3 -4.2 vt 4.4 4.5 vt 3.4 3.5 vt 1.4 1.5 vt 0.1 0.2 f 1/3 2/2 3/1 opensurgsim-0.7.0/Tools/Fragments/merge-testdata/testobj.txt000066400000000000000000000001301277777236100242550ustar00rootroot00000000000000v 1.1 1.3 -1.2 v 3.1 3.3 -3.2 v 4.1 4.3 -4.2 vt 1.4 1.5 vt 3.4 3.5 vt 4.4 4.5 vt 0.1 0.2opensurgsim-0.7.0/Tools/Fragments/merge-testdata/testvertices.txt000066400000000000000000000000571277777236100253370ustar00rootroot000000000000004.1 4.2 4.3 1.1 1.2 1.3 2.1 2.2 2.3 3.1 3.2 3.3opensurgsim-0.7.0/Tools/Fragments/merge.py000066400000000000000000000073401277777236100206170ustar00rootroot00000000000000#!/usr/bin/python # This file is a part of the OpenSurgSim project. # Copyright 2012-2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Merge a list of input vertices and information from an .obj file Give a file with a list of input vertices, look through the obj file and find corresponding vertices, add texture information to the input vertices and store the resulting list in an output file. The order in the vertex file is maintained and vertices that cannot be found in the obj file will receive default information This can be used to add information to a .ply file where the order of the vertices is already established E.g. vertex file (fragment from .ply file) 1.0 1.0 1.0 2.0 2.0 2.0 3.0 3.0 3.0 obj file (fragment from .obj file) v 1.0 1.0 -1.0 v 2.0 2.0 -2.0 vt 1.0 1.0 vt 0.5 0.5 output (fragment, paste this into the vertex section of the .ply file) 1.0 1.0 1.0 1.0 1.0 2.0 2.0 2.0 0.5 0.5 3.0 3.0 3.0 0.0 0.0 Typical usage: merge.py input.txt object.obj output.txt """ import csv import argparse def find(item, vertices) : index = 0 for vertex in vertices: if (item == vertex) : return index index += 1 return -1 vertices = [] uvs = [] uvIndices = [] if __name__ == '__main__': parser = argparse.ArgumentParser( description="Merge a list of input vertices and information from an .obj file.") parser.add_argument('vertices', help='Filename for input vertices.') parser.add_argument('obj', help='The .obj file to use.' ) parser.add_argument('output', help='Filename for output.') args = parser.parse_args() # this can be a basic obj file, we are only looking at 'v' and 'vt' for now with open(args.obj, 'rb') as csvfile: reader = csv.reader(csvfile, delimiter = ' ') vertexIndex = 0 for row in reader: if (row[0] == 'v') : #Go from obj to ply coordinate system, change the sign on the z coord if (row[3][0] == '-'): row[3] = row[3][1:] else: row[3] = '-'+row[3] #swap y and z tmp = row[3] row[3] = row[2] row[2] = tmp vertices.append(row[1:]) elif (row[0] == 'vt') : uvs.append(row[1:]) uvIndices.append(vertexIndex) vertexIndex += 1 elif (row[0] == 'f') : # These are either # f v v v # f v/vt v/vt v/vt # f v/vt/vn v/vt/vn v/vt/vn for item in row[1:]: indices = item.split("/") if (len(indices) > 1) : # .obj indices start with 1 # put the index of the texture coordinate into the indices map uvIndices[int(indices[0])-1] = int(indices[1])-1 result = [] # Reference is just a list of vertices x,y,z separated by ' ' # The comparison is done via the strings of the numbers, no accuracy needed, this relies # on the fact that the output format is the same and no transformation was done on the # vertices with open(args.vertices, 'rb') as csvfile: reader = csv.reader(csvfile, delimiter = ' ') count = 0 for row in reader: texCoord = ["0.0","0.0"] index = find(row, vertices) if (index != -1) : texCoord = uvs[uvIndices[index]] row.append(texCoord[0]) row.append(texCoord[1]) result.append(row) with open(args.output, 'wb') as outfile: writer = csv.writer(outfile, delimiter = ' ', quoting=csv.QUOTE_NONE) for row in result: writer.writerow(row)opensurgsim-0.7.0/Tools/NeedleSutureGeneration/000077500000000000000000000000001277777236100216345ustar00rootroot00000000000000opensurgsim-0.7.0/Tools/NeedleSutureGeneration/CMakeLists.txt000066400000000000000000000021561277777236100244000ustar00rootroot00000000000000# This file is a part of the OpenSurgSim project. # Copyright 2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. link_directories( ${Boost_LIBRARY_DIRS} ) include_directories( "${CMAKE_CURRENT_SOURCE_DIR}" ) set(SOURCES NeedleSutureGeneration.cpp ) set(HEADERS ) surgsim_add_executable(NeedleSutureGeneration "${SOURCES}" "${HEADERS}") SET(LIBS SurgSimBlocks SurgSimGraphics ${Boost_LIBRARIES} ${YAML_CPP_LIBRARIES} ) target_link_libraries(NeedleSutureGeneration ${LIBS}) # Put NeedleSutureGeneration into folder "Tools" set_target_properties(NeedleSutureGeneration PROPERTIES FOLDER "Tools") opensurgsim-0.7.0/Tools/NeedleSutureGeneration/Data/000077500000000000000000000000001277777236100225055ustar00rootroot00000000000000opensurgsim-0.7.0/Tools/NeedleSutureGeneration/Data/properties.ini000066400000000000000000000003701277777236100254020ustar00rootroot00000000000000[PhysicsProperty] #Mass density has unit Kg.m-3 #Young Modulus has unit Pa needleMassDensity = 7500 needlePoissonRatio = 0.305 needleYoungModulus = 1.8e11 sutureMassDensity = 900 suturePoissonRatio = 0.45 sutureYoungModulus = 1.75e9 opensurgsim-0.7.0/Tools/NeedleSutureGeneration/NeedleSutureGeneration.cpp000066400000000000000000000320051277777236100267600ustar00rootroot00000000000000// This file is a part of the OpenSurgSim project. // Copyright 2016, SimQuest Solutions Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include #include #include #include #include #include #include #include #include "SurgSim/DataStructures/Vertices.h" #include "SurgSim/Framework/Log.h" #include "SurgSim/Math/CardinalSplines.h" #include "SurgSim/Math/Vector.h" /// Function to generate points on a circle with radius 'radius'. /// \note The points always start from the origin and go on the circle to 'angle'. /// \param subdivisions Number of interpolated points on the circle. /// \param radius Radius of the circle on which points are generated. /// \param angle How much (of the circle) should points occupy, in radian. /// \return A list of points on the circle. std::vector generateNeedle(size_t subdivisions, double radius, double angle) { SURGSIM_ASSERT(0 < angle && angle < 2.0 * M_PI) << __FUNCTION__ << " 'angle' must be in the range (0, 2PI)"; SURGSIM_ASSERT(2 <= subdivisions) << __FUNCTION__ << " 'subdivisions' must be at least 2"; double increment = angle / static_cast(subdivisions); double controlAngle = 0.0; std::vector vertices(subdivisions+1); for (size_t i = 0; i < subdivisions; ++i) { vertices[i] = radius * SurgSim::Math::Vector3d(std::cos(controlAngle) - 1.0, std::sin(controlAngle), 0.0); controlAngle += increment; } vertices[subdivisions] = radius * SurgSim::Math::Vector3d(std::cos(controlAngle) - 1.0, std::sin(controlAngle), 0.0); return vertices; } /// Function to generate a suture, starting from the origin and wraps around 'axis' in circles. /// A circle (formed by the suture when wraps 'axis') is defined by four markers. /// Each marker is rotated 45 degrees along 'axis' from previous one. /// 'subdivisions' controls how many points to interpolate between each pair of markers. /// In the returned list, the origin will always be the first point. /// \param subdivisions Number of points between makers. /// \param radius Radius of the circle the suture forms. /// \param length Length of the suture. /// \param circles Number of circles the suture forms wrapping around 'axis'. /// \param axis The axis around which the suture wraps. /// \return A list of points representing the suture. std::vector generateSuture(size_t subdivisions, double radius, double length, size_t circles, const SurgSim::Math::Vector3d& axis = SurgSim::Math::Vector3d(1.0, 0.0, 0.0)) { // Increment on X-axis. double increment = length / circles / 4.0; SurgSim::Math::Vector3d direction = axis; direction.normalize(); auto rotateXToAxis = SurgSim::Math::makeRotationQuaternion( -std::acos(direction.dot(SurgSim::Math::Vector3d(1.0, 0.0, 0.0))), direction.cross(SurgSim::Math::Vector3d(1.0, 0.0, 0.0))); std::vector controlPoints; controlPoints.push_back(SurgSim::Math::Vector3d(0.0, 0.0, 0.0) - increment * direction); controlPoints.push_back(SurgSim::Math::Vector3d(0.0, 0.0, 0.0)); // Used to control the rotation between markers. SurgSim::Math::Quaterniond rotation = SurgSim::Math::makeRotationQuaternion(M_PI_2, SurgSim::Math::Vector3d(1.0, 0.0, 0.0)); auto point = SurgSim::Math::Vector3d(increment, radius, 0.0); for (size_t i = 0; i < circles * 4; ++i) { controlPoints.push_back(rotateXToAxis * point); point = rotation * point; point.x() += increment; } std::vector result; SurgSim::Math::CardinalSplines::interpolate(subdivisions, controlPoints, &result); return result; } /// Save a list of needle and a list of suture as one ply file. /// Points in 'needle' will be output first, as the order they appear in 'needle' and /// points in 'suture' will be output second, as the order they appear in 'suture'. /// The caller of this function needs to make sure /// the needle and the suture connects (smoothly) at needle[last] and suture[begin]. /// \param fileName Name of the ply file. /// \param needle List of points representing the needle. /// \param suture List of points representing the suture. /// \param asPhysics Boolean to decide whether or not to save physics properties. /// \param needleMassDensity Mass density of needle. /// \param needlepoissonRatio Poisson ratio of needle. /// \param needleYoungModulus Young modulus of needle. /// \param sutureMassDensity Mass density of suture. /// \param suturepoissonRatio Poisson ratio of suture. /// \param sutureYoungModulus Young modulus of suture. /// \param radius Radius used for fem1d beam. void saveNeedleSuturePly(const std::string& fileName, const std::vector& needle, const std::vector& suture, bool asPhysics, double needleMassDensity, double needlePoissonRatio, double needleYoungModulus, double sutureMassDensity, double suturePoissonRatio, double sutureYoungModulus, double radius = 0.0001) { std::ofstream out(fileName); size_t numOfPoints = needle.size() + suture.size(); if (out.is_open()) { out << "ply" << std::endl; out << "format ascii 1.0" << std::endl; out << "comment Created by OpenSurgSim, www.opensurgsim.org" << std::endl; out << "element vertex " << numOfPoints << std::endl; out << "property float x\nproperty float y\nproperty float z" << std::endl; if (asPhysics) { out << "element 1d_element " << numOfPoints - 1 << std::endl; out << "property list uint uint vertex_indices" << std::endl; out << "property double mass_density" << std::endl; out << "property double poisson_ratio" << std::endl; out << "property double young_modulus" << std::endl; } out << "element radius 1" << std::endl; out << "property double value" << std::endl; out << "element boundary_condition 0" << std::endl; out << "property uint vertex_index" << std::endl; out << "end_header" << std::endl; for (const auto& vertex : needle) { out << vertex[0] << " " << vertex[1] << " " << vertex[2] << std::endl; } for (const auto& vertex : suture) { out << vertex[0] << " " << vertex[1] << " " << vertex[2] << std::endl; } if (asPhysics) { int index = 0; for (const auto& vertex : needle) { out << "2 " << index << " " << index + 1 << " " << needleMassDensity << " " << needlePoissonRatio << " " << needleYoungModulus << std::endl; ++index; } for (const auto& vertex : suture) { out << "2 " << index << " " << index + 1 << " " << sutureMassDensity << " " << suturePoissonRatio << " " << sutureYoungModulus << std::endl; ++index; } } out << radius << std::endl; if (out.bad()) { SURGSIM_LOG_WARNING(SurgSim::Framework::Logger::getDefaultLogger()) << __FUNCTION__ << "There was a problem writing " << fileName; } out.close(); } else { SURGSIM_LOG_WARNING(SurgSim::Framework::Logger::getDefaultLogger()) << __FUNCTION__ << "Could not open " << fileName << " for writing."; } }; // Utility to generate a ply file for needle suture. // Command line input are supported. int main(int argc, char* argv[]) { namespace po = boost::program_options; po::options_description commandLine("Allowed options"); commandLine.add_options()("help", "produce help message") ("filename", po::value()->default_value("needlesuture.ply"), "File name to save the generated needle suture.") ("needleSubdivisions", po::value()->default_value(10), "Number of interpolated points for the needle (default 10)") ("needleRadius", po::value()->default_value(0.019), "Radius of the needle (in m) (default 0.019)") ("needleAngle", po::value()->default_value(135), "How big is the arc (common values: 90, 135, 180, 225) in degrees (default 135)") ("sutureSubdivisions", po::value()->default_value(20), "Number of interpolated points for each pair of markers on the suture (default 20)") ("sutureRadius", po::value()->default_value(0.01), "Radius of the suture (default 0.01") ("sutureLength", po::value()->default_value(0.45), "Length of th suture (in m) (default 0.45)") ("sutureCircles", po::value()->default_value(2), "Number of circles formed by suture going around the axis") ("savePhysicsProperty", po::value()->default_value(true), "Output physics properties for the needle and suture in ply file") ("physicsProperty", po::value(), "File name for physics properties. Note that command line values have priority: " "program will use value(s) from command line if specified.") ("needleMassDensity", po::value(), "Mass density for the needle (default 7500 Kg.m-3)") ("needlePoissonRatio", po::value(), "Poisson ratio for the needle (default 0.305)") ("needleYoungModulus", po::value(), "Young Modulus for the needle (default (1.8e11 Pa)") ("sutureMassDensity", po::value(), "Mass density for the suture (default 900 Kg.m-3)") ("suturePoissonRatio", po::value(), "Poisson ratio for the suture (default 0.45)") ("sutureYoungModulus", po::value(), "Young Modulus for the suture (default 1.75e9 Pa)"); po::variables_map variables; try { po::store(po::parse_command_line(argc, argv, commandLine), variables); } catch (po::error& e) { std::cerr << "ERROR: " << e.what() << std::endl << std::endl; std::cerr << commandLine << std::endl; return 1; } if (variables.count("help")) { std::cout << commandLine << "\n"; return 1; } double needleMassDensity = 7500, needlePoissonRatio = 0.305, needleYoungModulus = 180 * 1e9; double sutureMassDensity = 900, suturePoissonRatio = 0.45, sutureYoungModulus = 1.75 * 1e9; if (variables.count("physicsProperty")) { boost::filesystem::path fileName("Data/" + variables["physicsProperty"].as()); boost::filesystem::path filePath = boost::filesystem::complete(fileName); std::cout << "File path: " << filePath << std::endl; if (!boost::filesystem::exists(filePath)) { std::cout << "Can't find my file!" << std::endl; return -1; } boost::property_tree::ptree parameters; boost::property_tree::ini_parser::read_ini(filePath.string(), parameters); needleMassDensity = parameters.get("PhysicsProperty.needleMassDensity"); needlePoissonRatio = parameters.get("PhysicsProperty.needlePoissonRatio"); needleYoungModulus = parameters.get("PhysicsProperty.needleYoungModulus"); sutureMassDensity = parameters.get("PhysicsProperty.sutureMassDensity"); suturePoissonRatio = parameters.get("PhysicsProperty.suturePoissonRatio"); sutureYoungModulus = parameters.get("PhysicsProperty.sutureYoungModulus"); } // Command line values for physics properties will take precedence if specified. if (variables.count("needleMassDensity")) needleMassDensity = variables["needleMassDensity"].as(); if (variables.count("needlePoissonRatio")) needlePoissonRatio = variables["needlePoissonRatio"].as(); if (variables.count("needleYoungModulus")) needleYoungModulus = variables["needleYoungModulus"].as(); if (variables.count("sutureMassDensity")) sutureMassDensity = variables["sutureMassDensity"].as(); if (variables.count("suturePoissonRatio")) suturePoissonRatio = variables["suturePoissonRatio"].as(); if (variables.count("sutureYoungModulus")) sutureYoungModulus = variables["sutureYoungModulus"].as(); auto needlePoints = generateNeedle(variables["needleSubdivisions"].as(), variables["needleRadius"].as(), variables["needleAngle"].as() / 180 * M_PI); auto suturePoints = generateSuture(variables["sutureSubdivisions"].as(), variables["sutureRadius"].as(), variables["sutureLength"].as(), variables["sutureCircles"].as(), needlePoints[0] - needlePoints[1]); // Points generated are starting from the origin, when constructing the needle suture, // the list of needle points need to be reversed and the origin is removed to avoid duplication. std::vector needlePointsReversed(needlePoints.rbegin(), needlePoints.rend()-1); saveNeedleSuturePly(variables["filename"].as(), needlePointsReversed, suturePoints, variables["savePhysicsProperty"].as(), needleMassDensity, needlePoissonRatio, needleYoungModulus, sutureMassDensity, suturePoissonRatio, sutureYoungModulus); return 0; } opensurgsim-0.7.0/Tools/alphabetize_cmakelists.py000066400000000000000000000067051277777236100223050ustar00rootroot00000000000000#!/usr/bin/python # This file is a part of the OpenSurgSim project. # Copyright 2012-2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Alphabetize the CMake lists of headers and sources. Typical usage: Tools/alphabetize-cmakelists.py SurgSim/CMakeLists.py or: find . -name 'build*' -prune -o -name CMakeLists.txt -print \ | xargs python Tools/alphabetize-cmakelists.py """ import argparse import sys import re def slurp_lines(file): try: with open(file, 'r') as f: return f.read().splitlines() except IOError as e: print >> sys.stderr, e return None def spew_lines(file, lines): try: with open(file, 'wb') as f: for line in lines: f.write(line + "\n") return True except IOError as e: print >> sys.stderr, e return False def filename_sort_filter(file): # return re.sub(r'Tests?$', '', re.sub(r'\.(?:h|cpp)$', '', file)).lower() # Taking out the string 'Tests' screws up the file ordering test return re.sub(r'\.(?:h|cpp)$', '', file).lower() def alphabetize(file, lines): if lines is None: return None (result, indent, var_name, content) = ([], '', None, None) for line in lines: if content is not None: (xline, had_closing_paren) = re.subn(r'\)\s*$', '', line) if re.search(r'[(){}]', xline): print >> sys.stderr, file + ": Bad line '" + line + "'" # put the content lines back unmodified result.extend(content) result.append(line) continue content.append(xline) if had_closing_paren: content = content[1:] # strip the original set(... line content = filter(lambda x: len(x), map(lambda x: x.strip(), content)) #print var_name + ":", content content = sorted(content, key=filename_sort_filter) result.append(indent + "set(" + var_name) result.extend(map(lambda x: indent + "\t" + x, content)) result.append(indent + ")") content = None else: match = re.search( r'^(\s*)[Ss][Ee][Tt]\s*\(\s*(\w+(?:HEADERS|SOURCES))\s*$', line) if match: indent = match.group(1) var_name = match.group(2) content = [ line ] # include original line, will be removed later else: result.append(line) if result == lines: return None return result if __name__ == '__main__': parser = argparse.ArgumentParser( description='Alphabetize CMake lists of headers and sources.') parser.add_argument('files', metavar='FILE', nargs='*', help='The file names to reformat.') args = parser.parse_args() touched = False for file in args.files: if not re.search(r'\.(?:txt|cmake)$', file): print >> sys.stderr, file + ": not a CMake input file!" else: lines = alphabetize(file, slurp_lines(file)) if lines is not None: spew_lines(file, lines) print "Updated", file touched = True if not touched: print "{}: Nothing to update!".format(sys.argv[0]) opensurgsim-0.7.0/Tools/fix-style.py000066400000000000000000000046321277777236100175170ustar00rootroot00000000000000#!/usr/bin/python # This file is a part of the OpenSurgSim project. # Copyright 2012-2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Runs AStyle to reformat the specified source files.""" import argparse import sys import os import subprocess ASTYLE_FLAGS = ('--indent=force-tab=4', '--style=allman', '--add-brackets', '--unpad-paren', '--pad-header', '--align-pointer=type', '--indent-preprocessor', '--min-conditional-indent=0', '--max-instatement-indent=60', # The following flags require AStyle 2.03 or later: '--max-code-length=120', '--break-after-logical', ) def adjust_environment(): """Adjust the environment with some likely AStyle locations.""" if 'SYSTEMDRIVE' in os.environ: for prefix in [os.environ['SYSTEMDRIVE'], 'c:', 'd:', 's:']: for location in 'SimQuest', 'simquest', 'tools': path = prefix + '/' + location + "/AStyle/bin" if os.path.isdir(path): os.environ['PATH'] += os.pathsep + path def run_astyle(files): command = ['astyle'] command.extend(ASTYLE_FLAGS) command.extend(files) try: retcode = subprocess.call(command) if retcode < 0: print sys.argv[0] + ": AStyle terminated by signal", -retcode sys.exit(1) elif retcode > 0: print sys.argv[0] + ": AStyle returned status ", retcode sys.exit(1) except OSError as e: print sys.argv[0] + ": AStyle execution failed:", e sys.exit(1) if __name__ == '__main__': parser = argparse.ArgumentParser( description='Reformat source files using AStyle with our options.') parser.add_argument('files', metavar='FILE', nargs='*', help='The file names to reformat.') args = parser.parse_args() adjust_environment() if len(args.files) == 0: print "{}: Nothing to reformat!".format(sys.argv[0]) else: run_astyle(args.files) opensurgsim-0.7.0/Tools/fix_header_guards.py000066400000000000000000000113141277777236100212310ustar00rootroot00000000000000#!/usr/bin/python # This file is a part of the OpenSurgSim project. # Copyright 2012-2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Fix the header include guards in files.""" import argparse import sys import subprocess import re import os def slurp_numbered_lines(file): try: with open(file, 'r') as f: lines = list(enumerate(f.read().splitlines(), start=0)) if not lines: print >> sys.stderr, file + ": warning, file is empty." return lines except IOError as e: print >> sys.stderr, e return None def spew_raw_lines(file, lines): try: with open(file, 'wb') as f: for line in lines: f.write(line) return True except IOError as e: print >> sys.stderr, e return False HEADER_GUARD_DIRECTORY_PREFIX_CACHE = {} def get_header_guard_directory_prefix(dir_path): if dir_path not in HEADER_GUARD_DIRECTORY_PREFIX_CACHE: prefix = "" path = dir_path while not (os.path.exists(os.path.join(path, 'LICENSE')) or os.path.exists(os.path.join(path, '.git'))): (parent, dirname) = os.path.split(path) assert parent != path prefix = re.sub(r'\W+', '', dirname).upper() + '_' + prefix path = parent HEADER_GUARD_DIRECTORY_PREFIX_CACHE[dir_path] = prefix return HEADER_GUARD_DIRECTORY_PREFIX_CACHE[dir_path] def get_expected_header_guard(file): (dir_path, filename) = os.path.split(os.path.abspath(file)) guard = re.sub(r'\W+', '_', filename).upper() while not (os.path.exists(os.path.join(dir_path, 'LICENSE')) or os.path.exists(os.path.join(dir_path, '.git'))): (parent, dirname) = os.path.split(dir_path) assert parent != dir_path guard = re.sub(r'\W+', '', dirname).upper() + '_' + guard dir_path = parent return guard def fix_header_guards(flags, file, lines): ifndef = filter(lambda x: re.search(r'^\s*#\s*ifndef\b', x[1]), lines) if not ifndef: print >> sys.stderr, file + ": no #ifndef lines!" return None guard_expected = get_expected_header_guard(file) lines[ifndef[0][0]] = (ifndef[0][0], re.sub(r'^(\s*#\s*ifndef)\s+\w+((?:\s.*)?)$', r'\1 ' + guard_expected + r'\2', ifndef[0][1])) define = filter(lambda x: re.search(r'^\s*#\s*define\b', x[1]), lines) if not define: print >> sys.stderr, file + ": no #define lines!" return None lines[define[0][0]] = (define[0][0], re.sub(r'^(\s*#\s*define)\s+\w+((?:\s.*)?)$', r'\1 ' + guard_expected + r'\2', define[0][1])) endif = filter(lambda x: re.search(r'^\s*#\s*endif\b', x[1]), lines) if not endif: print >> sys.stderr, file + ": no #endif lines!" return None update_endif = False if not args.lenient_endif: update_endif = True if (re.search(r'^\s*#\s*endif\s*//', endif[-1][1]) and not re.search(r'^\s*#\s*endif\s+//\s+' + guard_expected + r'\s*$', endif[-1][1])): update_endif = True # The comment exists but isn't right. if update_endif: lines[endif[-1][0]] = (endif[-1][0], re.sub(r'^(\s*#\s*endif)\b.*$', r'\1 // ' + guard_expected, endif[-1][1])) return lines if __name__ == '__main__': parser = argparse.ArgumentParser( description='Fix the header include guards in files.') parser.add_argument('--lenient-endif', action='store_true', help='Fix #endif comments only if present and wrong.') parser.add_argument('files', metavar='FILE', nargs='*', help='The file names to check.') args = parser.parse_args() for file in args.files: if not re.search(r'\.h$', file): print >> sys.stderr, file + ": Ignored." continue lines = slurp_numbered_lines(file) if not lines: continue updated = fix_header_guards(args, file, map(lambda x: (x[0], x[1]), lines)) if not updated: continue if updated == lines: continue output = map(lambda x: x[1] + "\n", updated) spew_raw_lines(file, output) print >> sys.stderr, file + ": Updated." opensurgsim-0.7.0/Tools/memcheck.supp000066400000000000000000000001311277777236100176740ustar00rootroot00000000000000{ wcscmp/.../~locale Memcheck:Addr8 fun:wcscmp ... fun:_ZNSt6localeD*Ev } opensurgsim-0.7.0/Tools/remove-trailing-whitespace.py000066400000000000000000000043501277777236100230260ustar00rootroot00000000000000#!/usr/bin/python # This file is a part of the OpenSurgSim project. # Copyright 2012-2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Remove all trailing whitespace from a file. Typical usage: Tools/remove-trailing-whitespace.py Foo.h or: find SurgSim \( -name '*.h' -o -name '*.cpp' \) -print \ | xargs python Tools/remove-trailing-whitespace.py """ import argparse import sys import re def slurp_raw_lines(file): try: with open(file, 'rb') as f: return f.readlines() except IOError as e: print >> sys.stderr, e return None def spew_raw_lines(file, lines): try: with open(file, 'wb') as f: for line in lines: f.write(line) return True except IOError as e: print >> sys.stderr, e return False def update(file, lines): if lines is None: return None eol = "\n" if len(lines) and re.search(r'\r\n$', lines[0]): eol = "\r\n" result = map(lambda x: x.rstrip() + eol, lines) # If the trailing newline was missing, but there's no other trailing # whitespace, leave well enough alone. if len(lines) and lines[-1] == lines[-1].rstrip(): result[-1] = lines[-1] if result == lines: return None return result if __name__ == '__main__': parser = argparse.ArgumentParser( description="Remove all trailing whitespace from a file.") parser.add_argument('files', metavar='FILE', nargs='*', help='The file names to modify.') args = parser.parse_args() touched = False for file in args.files: lines = update(file, slurp_raw_lines(file)) if lines is not None: spew_raw_lines(file, lines) print "Updated", file touched = True if not touched: print "{}: Nothing to update!".format(sys.argv[0]) opensurgsim-0.7.0/Tools/run-lint.py000066400000000000000000000476171277777236100173550ustar00rootroot00000000000000#!/usr/bin/python # This file is a part of the OpenSurgSim project. # Copyright 2012-2013, SimQuest Solutions Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Runs Google's cpplint.py and some other checks on C++ files. This script tries to flag violations of the OpenSurgSim coding standards in C++ code. This is certainly not a substitute for looking at the code by hand: many violations will not be caught by the script, and some amount of flagged code will turn out to be correct. But it does make it easier to notice certain common errors. """ # TODO(bert): add some more checks. import argparse import sys import subprocess import re import os from fix_header_guards import get_expected_header_guard from alphabetize_cmakelists import filename_sort_filter STANDARD_WARNING_FORMAT = \ "{file}:{line}:{col}: {text} [{category}] [{level}]" VISUAL_STUDIO_WARNING_FORMAT = \ "{file}({line},{col}): {warning} {vscategory}[{level}]: {text}" WARNING_FORMAT = STANDARD_WARNING_FORMAT def emit_warning(fields): fields = dict(fields) fmt = WARNING_FORMAT # add a "vscategory" field which is like "category" but never empty if 'category' in fields and fields['category'] is not None: fields['vscategory'] = fields['category'] else: fmt = re.sub(r'\s*\[\{category[^\}]*\}\]', '', fmt) fmt = re.sub(r'\s*\{category[^\}]*\}', '', fmt) fields['category'] = '???' # panic button fields['vscategory'] = 'RL' if 'level' not in fields: fmt = re.sub(r'\s*\[\{level[^\}]*\}\]', '', fmt) fmt = re.sub(r'\s*\{level[^\}]*\}', '', fmt) fields['level'] = '???' # panic button if 'col' not in fields: fmt = re.sub(r'\s*\{col[^\}]*\}:', '', fmt) fmt = re.sub(r'\s*,\{col[^\}]*\}\)', ')', fmt) fmt = re.sub(r'\s*\{col[^\}]*\}', '', fmt) fields['col'] = '???' # panic button if 'line' not in fields: fmt = re.sub(r'\s*\{line[^\}]*\}:', '', fmt) fmt = re.sub(r'\s*\(\{line[^\}]*\}\)', '', fmt) fmt = re.sub(r'\s*\{line[^\}]*\}', '', fmt) fields['line'] = '???' # panic button if 'warning' not in fields: fields['warning'] = 'warning' print fmt.format(**fields) def emit_error(fields): fields = dict(fields) fields['warning'] = 'error' emit_warning(fields) def slurp_numbered_lines(file): try: with open(file, 'r') as f: lines = list(enumerate(f.read().splitlines(), start=1)) if not lines: emit_warning({'file': file, 'category': "opensurgsim/no_lines", 'text': "file is empty."}) return lines except IOError as e: print >> sys.stderr, e emit_error({'file': file, 'category': "opensurgsim/no_file", 'text': "file is missing or could not be opened."}) return None def run_cpplint(script, filter, files): if not files: return False argv = [sys.executable, script] if filter is not None: argv.extend(['--filter', filter]) argv.extend(files) try: cmd = subprocess.Popen(argv, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) except OSError as e: print "Failed to run '" + script + "':\n\t", e return False saw_output = False for line in cmd.stdout: saw_output = True line = line.rstrip() match = re.search(r'^(.*?):(\d+):\s+(.*?)\s+\[(\S+)\]\s+\[(\d+)\]\s*$', line) if match: fields = dict(zip(['file', 'line', 'text', 'category', 'level'], match.groups())) emit_warning(fields) elif re.search(r'\[(\S+)\]\s+\[(\d+)\]\s*$', line): emit_error({'file': "run-lint", 'text': ("failed to parse likely warning line: '" + line + "'")}) elif re.search(r':\d+:', line): emit_error({'file': "run-lint", 'text': ("failed to parse line with likely line number: '" + line + "'")}) else: print line # The output is done, so the command should be finished. assert cmd.wait() is not None if not saw_output: emit_error({'file': "run-lint", 'text': "cpplint produced no output!"}) return False return cmd.returncode == 0 def check_header_guard(flags, file, lines): ifndef = filter(lambda x: re.search(r'^\s*#\s*ifndef\b', x[1]), lines) if not ifndef: emit_warning({'file': file, 'category': "opensurgsim/no_ifndef", 'text': "no #ifndef lines!"}) return False # elif len(ifndef) > 1: # emit_warning({'file': file, 'line': ifndef[1][0], # 'category': "opensurgsim/several_ifndef", # 'text': "multiple #ifndef lines; using first."}) guard = ifndef[0][1] guard = re.sub(r'//.*', '', guard) guard = re.sub(r'/\*.*?\*/', '', guard) guard_match = re.search(r'^\s*#\s*ifndef\s+(\w+)\s*$', guard) if not guard_match: emit_error({'file': file, 'line': ifndef[0][0], 'category': "opensurgsim/internal", 'text': "script error: failed to parse #ifndef line!"}) return False guard = guard_match.group(1) guard_expected = get_expected_header_guard(file) if guard != guard_expected: emit_warning({'file': file, 'line': ifndef[0][0], 'category': "opensurgsim/header_guard", 'text': ("unexpected guard '{}'! expected '{}'." .format(guard, guard_expected)) }) define = filter(lambda x: re.search(r'^\s*#\s*define\b', x[1]), lines) if not define: emit_warning({'file': file, 'category': "opensurgsim/no_define", 'text': "no #define lines!"}) else: def_match = re.match(r'^\s*#\s*define\s+(\w+)\s*$', re.sub(r'/\*.*?\*/', '', re.sub(r'//.*', '', define[0][1]))) if not def_match: emit_error({'file': file, 'line': define[0][0], 'category': "opensurgsim/internal", 'text': "script error: failed to parse #define line!"}) elif def_match.group(1) != guard: emit_warning({'file': file, 'line': define[0][0], 'category': "opensurgsim/guard_mismatch", 'text': "#define doesn't match #ifndef!"}) endif = filter(lambda x: re.search(r'^\s*#\s*endif\b', x[1]), lines) if not endif: emit_warning({'file': file, 'category': "opensurgsim/no_endif", 'text': "no #endif lines!"}) elif re.search(r'^\s*#\s*endif\s*$', endif[-1][1]): if flags.missing_endif_comments: emit_warning({'file': file, 'line': endif[-1][0], 'category': "opensurgsim/endif_no_comment", 'text': "#endif with no comment."}) else: if re.search(r'^\s*#\s*endif\s*///', endif[-1][1]): emit_warning({'file': file, 'line': endif[-1][0], 'category': "opensurgsim/endif_doxygen", 'text': "#endif with a Doxygen style /// comment."}) endif_match = re.search(r'^\s*#\s*endif\s*//+\s*(.*?)\s*$', endif[-1][1]) if not endif_match: emit_error({'file': file, 'line': endif[-1][0], 'category': "opensurgsim/internal", 'text': "script error: failed to parse #endif comment."}) elif endif_match.group(1) != guard: emit_warning({'file': file, 'line': endif[-1][0], 'category': "opensurgsim/endif_mismatch", 'text': ("#endif comment doesn't match #ifndef! (" + \ endif_match.group(1) + ")")}) def find_column_char(text, column, tab_width=4): """Find the character that corresponds to the specified column. In the absence of tabs in the text, the return value will be equal to the column. When tabs are present, it will be smaller. """ text = text[:column] while len(text.expandtabs(tab_width)) > column: text = text[:(len(text)-1)] return len(text) def get_column(flags, text, column): if flags.visual_studio: return find_column_char(text, column) else: return column def check_length(flags, file, lines): xlines = map(lambda x: (x[0], re.sub(r'\r?\n$', '', x[1].expandtabs(4))), lines) for bad in filter(lambda x: len(x[1]) > flags.max_line_length, xlines): col = get_column(flags, lines[bad[0]-1][1], flags.max_line_length) emit_warning({'file': file, 'line': bad[0], 'col': col, 'category': "opensurgsim/too_long", 'text': ("the line is {} characters long, which is longer" " than {}!" .format(len(bad[1]), flags.max_line_length)) }) def check_tab_indentation(flags, file, lines): for line_number, line in lines: # Not a blank line if len(line) > 0: # Check that lines start with 0 or more tab characters. # 0 to 3 spaces is allowed for alignment, but anymore and a tab is expected. if re.search(r'^\t* {0,3}\S' , line) is None: emit_warning({'file': file, 'line': line_number, 'category': "opensurgsim/tab_indention", 'text': "the line does not correctly indent using tabs."}) def check_oss_include(flags, file, lines): for line_number, line in lines: # Not a blank line if len(line) > 0: # Check that lines does not start with "#include second and not saw_out_of_order: emit_warning({'file': file, 'line': files[i][0], 'category': "opensurgsim/cmake_file_order", 'text': "file list is not correctly ordered." }) saw_out_of_order = False def decorate_listed_files(flags, file, files): prefix = os.path.dirname(file) paths = map(lambda x: (x[0], os.path.normpath(os.path.join(prefix, x[1]))), files) for p in paths: if not os.path.exists(p[1]): emit_warning({'file': file, 'line': p[0], 'category': "opensurgsim/cmake_file_missing", 'text': ("file " + p[1] + " does not exist but is listed in CMakeLists!") }) return paths def get_listed_file_paths(flags, file, lines): files = get_listed_files(flags, file, lines) check_file_order(flags, file, files) paths = decorate_listed_files(flags, file, files) return map(lambda x: x[1], paths) def find_responsible_cmakelists(file): dir_path = os.path.dirname(file) while True: guess = os.path.join(dir_path, 'CMakeLists.txt') if os.path.exists(guess): return guess parent = os.path.dirname(dir_path) if parent == dir_path: # uh-oh, we didn't find ANY CMakeLists.txt file?!? return file dir_path = parent def check_file_lists(cmakelists_files, found_files): while cmakelists_files or found_files: if (cmakelists_files and found_files and cmakelists_files[0] == found_files[0]): # lists match. remove matching elements and keep going. del cmakelists_files[0] del found_files[0] elif not found_files or cmakelists_files[0] < found_files[0]: # in CMakeLists but not on disk. should already have been handled. del cmakelists_files[0] elif not cmakelists_files or found_files[0] < cmakelists_files[0]: # in the list but not in CMakeLists. emit_warning({'file': find_responsible_cmakelists(found_files[0]), 'category': "opensurgsim/cmake_file_not_listed", 'text': ("file " + found_files[0] + " not present in CMakeLists.txt!") }) del found_files[0] else: assert False, "should not have reached here" if __name__ == '__main__': parser = argparse.ArgumentParser( description='Check source files for coding standard violations.') parser.add_argument('--traverse', metavar='DIR', action='append', help='Find all applicable files in DIR and its subdirs.') parser.add_argument('--cpplint-script', metavar='PATH_TO_SCRIPT', help='The path to Google\'s cpplint.py script.', default='cpplint.py') parser.add_argument('--cpplint-filter', '--filter', metavar='FILTER', help='The --filter argument to pass to cpplint.') parser.add_argument('--no-cpplint', action='store_false', dest='do_cpplint', help='Do not run the cpplint.py script.') parser.add_argument('--missing-endif-comments', action='store_true', help='Flag missing include guard #endif comments, too.') parser.add_argument('--ignore-guards', action='store_false', dest='do_check_guards', help='Do not check the header file include guards.') parser.add_argument('--ignore-tab-indentation', action='store_false', dest='do_check_tab_indentation', help='Do not check that lines are indented with tabs.') parser.add_argument('--ignore-oss-include', action='store_false', dest='do_check_oss_include', help='Do not check that OSS related include use #include "".') parser.add_argument('--max-line-length', type=int, default=120, help='Maximum allowed line length for C++ code.') parser.add_argument('--ignore-length', action='store_false', dest='do_check_length', help='Do not check the line length.') parser.add_argument('--ignore-file-lists', action='store_false', dest='do_check_file_lists', help='Do not check the files in CMakeLists.txt.') parser.add_argument('--ignore-ext', action='store_false', dest='do_check_extension', help='Do not check the file extensions.') parser.add_argument('--format', help='The format string for warnings and errors.') parser.add_argument('--visual-studio', '--vs', action='store_true', help='Use defaults tailored for Visual Studio.') parser.add_argument('files', metavar='FILE', nargs='*', help='The file names to check.') args = parser.parse_args() if args.format is not None: WARNING_FORMAT = args.format elif args.visual_studio: WARNING_FORMAT = VISUAL_STUDIO_WARNING_FORMAT else: WARNING_FORMAT = STANDARD_WARNING_FORMAT if args.traverse is not None: for traverse_dir in args.traverse: for current_dir, subdirs, files in os.walk(traverse_dir): args.files.extend(map(lambda x: os.path.join(current_dir, x), filter(lambda x: re.search(r'\.(?:h|cpp)$', x), files))) if 'CMakeLists.txt' in files: args.files.append(os.path.join(current_dir, 'CMakeLists.txt')) # always skip .git, build directories, ThirdParty... for bad in filter(lambda x: re.search(r'^(?:\.git|build.*|ThirdParty|Modules)$', x, re.IGNORECASE), subdirs): subdirs.remove(bad) ok = True if args.do_check_extension: bad_ext = filter(lambda x: not re.search(r'\.(?:h|cpp)$|CMakeLists\.txt$', x), args.files) for file in bad_ext: emit_warning({'file': file, 'text': "unknown extension (expected .h or .cpp)"}) ok = False if args.do_cpplint: # Batch the files through cpplint, 100 at a time so we don't exceed OS limits on # command size or amount of parameters index = 0 ok = True while index < len(args.files) : if not run_cpplint(args.cpplint_script, args.cpplint_filter, filter(lambda x: re.search(r'\.(?:h|cpp)$', x), args.files[index:index+100])): ok = False index += 100 cmakelists_files = None for file in args.files: lines = None if args.do_check_guards and re.search(r'\.h$', file): if lines is None: lines = slurp_numbered_lines(file) if not lines: continue if not check_header_guard(args, file, lines): ok = False if args.do_check_length and re.search(r'\.(h|cpp)$', file): if lines is None: lines = slurp_numbered_lines(file) if not lines: continue if not check_length(args, file, lines): ok = False if args.do_check_file_lists and re.search(r'CMakeLists\.txt$', file): if lines is None: lines = slurp_numbered_lines(file) if not lines: continue if cmakelists_files is None: cmakelists_files = [] cmakelists_files.extend(get_listed_file_paths(args, file, lines)) # cmakelists_files will be checked later... if args.do_check_tab_indentation and re.search(r'(\.h|\.cpp|CMakeLists\.txt$)', file): if lines is None: lines = slurp_numbered_lines(file) if not lines: continue if not check_tab_indentation(args, file, lines): ok = False if args.do_check_oss_include and re.search(r'(\.h|\.cpp$)', file): if lines is None: lines = slurp_numbered_lines(file) if not lines: continue if not check_oss_include(args, file, lines): ok = False if args.do_check_file_lists and cmakelists_files is not None: cmakelists_files = sorted(cmakelists_files) found_files = sorted(map(lambda x: os.path.normpath(x), filter(lambda x: re.search(r'\.(?:h|cpp)$', x), args.files))) check_file_lists(cmakelists_files, found_files) # if not ok: # sys.exit(1)

µPjò×îž'Íuu†PæêîUú'zNýâ¹À<¬ç6;* )vKjÈ!Zˆó˜JPP½Þ\Ài.}(èqã]M–´s“Ñ.à ô…P_ÔS3ÿ+=›zk9÷ Ù;»L$¸AbÞ˜ýÍ»·ÞÙ94²>χ»(bŽÂoËy<ÑÁ³ܽDµ’9YÂp2ÏàígÁH.ZÏå»XÑ­æ}s7ƒÜG|ðÑb„–^ˆëŒ¤ÐR€êKm¾Ä@¥r /öª‘ˆ°ÐÙõV9fwñ™›ÞÆaíU8FTOS0šuQƒ·alZè°âÜÙh©Ö…D³2"8à—%ÐhÚ7hA!á¢>Âh6HÝœ#xH’ͽæèÇÛ”eÓxõé½óIïMRé›áWOݤŒ/8žŠxª8±ÖÚÚéUèÒ¡3Š Œ²1Cúér|Y%[TU"pÖ'1¥[þJHϦ® éœ`­tjöŸ€žÊ)eÈÖ*)Yß&G³¯Ã9ÚÈD¾‘Î:D94c æ>Îãý;Y"«îa ¦ELÏTÑοÐÞe}s÷Ôá_¿åf\³–§)Ú0ïʯЦÐ_…*ña9G#§ž³Eè\˜%ɺšO,Kó_8žèçÅ´3J êïßOÐÑ儨יÇÙ/¡ŽÂªäÇâÏe:ÝóYð…¢–¶»ÿÜ[£`ÈLbÀ𦾱çeûÂÐç‡û^×Êëa›ˆÝà Û`vÜqjjE#§&Ÿ á/—\YUu}U«ÚÝCM^Ü ¿šÛÏ+ÐG{ÇRÿ”¹³ñ’'Âw®¬Wýí2…Šðgf} vAÌ #Œ¼Ô‘3PpÖö°yàlÁz¼>jc‚ã;þb­“©¨¹û{ª#…çÙµ`ä[Ù´“¤à¦¾ÑîÝ„dh'ÛM>ÞºuÇŒ9c<¿½rm>ï“ÕÊ_Ø=w˜ðWì|ƳVmŽ&(d3äAu+Ÿ/™Ü GI‘1›qµ6Èá"õ Ñâ¡|šÂwEá~xr¡¾_Ô¶*< œac)ŽßôF`&‹õUvò"ú!‰üæú‹ñòå¢òa­wºw:èÔQ—ÃT]Gޏ§ß#PƘ"MèL±²ú@˜DЀ9À”4ƒ‡!wÑhu{AW¿"»Yvúh_–h':9t4Ka„ÐONb ]šè´BÏIR4½W[±Õ€u}†í»R#päW|y´Å ¹OY·‡Ð½ËGGZÏÐ {J¡ôÄ<}HT' „_³ }É 5ÈÉ»hÿ™ê6DÃÆMOe ç êsÕ¤A~lV}j’í+E÷CQ[UbD{MI B¶]ô*H’^fç*òˆ áZ«"è:wî'5I5ôsenŒ– …ûHz4úÎÕ9ÞJ­õf Æ®š|D8ýúÿˆ„𠆢±æÖ5¸Â )IòDDÒ÷ÄÆ3Jÿ8âµ³F®E–ß?ó‘ûÁX÷‰²”Ù¦Xò?ø¶ú ²oevDëx¼uJÂöï@Õnj IDATߎ›½S‹<ÆåñìÞOvKî!|E<èG(“µ,6”vU5½ƒG`íð šÅußó}!—âY™pÀlO‡ËŒ}Ž´zqr)á ·’S;Ó Œbªm²“Ù:-Š PÃ"‘æÏæ3(`m‹ñṯ¡]ïÅÎÑ¿IRð†&zÄ=%çï^[Ÿ¤Ê]~4®VŸr/ènªbT„š²÷° bFB]f§o¬í4Õ“%«t>á]0aE4Üé~˜Ýœ¬±ì|/ºD^Q¨ t©ÐùE› ûœÑ_½Äõ]´–ø:áºFÁFû8ðŽnB½½±ï¹„u †â+WWð+úç™A!»Z‚~S5^K3§ŽI›²ëGyÐZñG'¤îÜÐJoëj7q‘et©©n#ô¿;ô#ô ©yJjPŽón‘ç‘XJÈPhÛF†'æë“l½-ì` ?ðAÕáxô.zF?‚’:´…7`-¸+©J\¸Ÿ:¼ÙH'ƒ9E´„F{±8ààú6’k˜AÞÖ:žƒ­œ¼å #E¶ÝÍj$®[}-˨WP^²Ä§lô¼bÏêÝ|šã?ø^)šÑÕZÅ{J+oC1 çÁ“6cpÂgŸÝs0tþE${ÚPžx Ì¼dZ´âm6ð´›°¶¦|6u*Š 4'5ôYÚ1ʼ’[ãwÊøaò‰û2’ujìòÏJk£4ö¤>×ëØ+J ½®F­Ýì)¦„Þ°nêË'Eòî(gCº®®·½ RXÇš‹räÓ}Ž9¾CŸ¡ ,Úò˜úôÑ1QhØè]ß³nS ¸ ¾ØÁüµ:ÿàšÕ1£ŸœáøÜAùrÚ][ã·TŸžîŠdbƒRÿ„f;;eDmïa ò@Ÿ?2ÿ<¬h_,ÔÓI?I(ÇR$\VZˆÚ*Œadv—ò=1Ÿù,Ù>”÷ HÈLÑçDZ¥Ãbõ==ᑘèH .íË€/V\ÕÉÌaµiÐÏÙÈi†4E´£qÛ¿š€o(ÿˆ‹‰î1Ò¹#0Þü›ùiçøÕ’Fýq²QÀcn´ha…kWØæÐµ/ ™Ý—€ù{ö…ù•F &¦¿¯fƒ— AsàD4£òG]DÐV¬¶‘ÐBH8›eÄìøž¨±1: õ z†yzcßXœñH‹g‡RoÔÊž G¤¸)õóY‰ßV퉙œù zRSP A=æø8tYø³ÜÄÒ¿½Ð6@òÎwnèNO?ŒÄÍQÒã!ø3¾tÿ®æÇgP÷-Õ§)•¤ô± ãÐ;a@(f~è6üêNôµ­8'$ŽxêýµiS;ð˜Ù·o‘Jð¥Hvn9oX¹SîÊâ¸Ì‡„&¶üçÙ·ÀaаПƒÐ7A£A€µ&ú Éo¿VàLíÔ>Œa9¹‘úã4ƒ·p¹?É Û Vq¾¾:ô”¿ù7ôS0Ð[¯W>}vÌ1ì%ãõégö$$‡¼ŠŒÚR‡HçZôR@¹øæ×h7‘SÌC Z¤`@†ëBL^ªCc-`å†cNþ‘oäð¾•s‰’u?`Ô ng-ˆ8vý4õVBAuícÑW’užËÅ}÷ÃJ‚Òëu,yä‘FL4¸¢ܱ”^ NiÁ]ˆ§‰øs‡ÚT`æe§Ë<ÄÌ%S ÇÄi슭TÎ-Ù"4õy|²Ï‚ò¬ó‚—³YìÕ&EÒ£à¶wµb(_¤û` š>ò†ÿÑëÜ/†êCüŽÄ†ˆàG›LÛY-pŠéWH+#0?ï¾Ùh1¢$AG?ÂQZKdÄÑ&^çå0§ÛxÔ¨¬¶ÕR ¹Q“KO3-2´«RÎ)JÁt‡~ÕdÙ:›<‹Ë]û$qœÑ¸Óÿ…¦ì¼½„ˆ‡6ÓõHö /6á½n~%Ph¦DAé‘»[ÔѲD4k>ï5× I¹zéÂ,õ`’_RyUê¦Måùå¾1X,”§Uõ MÅ:iŸr~ÆuŠ@ ~…Iž‰ƒšûáµ#‡Ì3<òw–¨äcöJ°jduo§˜Ö’¾—ÝÄ4›Á3HÁöÂð v÷ï@i@{"49ذ# 5X¤Rè-B³[…Õ˃£@/è§8÷P«0Z=HôQÖ0}üÉŠ*ý ™0”¤o.û:"!&’2ìM)%xÐNtƒÍi(ìK-3ã•¢þÑwŽd&j>$û4ÇìŸ7±l”¯¦c\ãÉ:šu¢OÜŸ>Æ­€¦4Ïþn£óÛôNÄ(üpýlÀQVV–£b:¥_T½ï%eh´úôÓ*þœþœoq–ëžZê =fd·¸GrÈ]t"ø|[T ذ×¥‚´n_ÉqÂ…ˆ–7Š>fà ,j•éª ØÜ~‡BÍì¹£nvüŠÕ²^jaÈ¢YEB1rhOÓt©Q:‚6fƒ†{ÙOIJ8íõò¢òõ.ÏÕ`¼àH÷ óúesÔ{Md‹diPp"šd î¢zZ|ñ9á‘Î1Î*FõT–þ$¼ÃË5М ÝN»”Â' 9šMÇÁ‡j°–hƒžI†CíºˆJ¦x”îI±¨‹¾yûä#Å »>µ!ÜI4]wª,Ú!œ}Ù(Òã¦þÂÀÈ™»¶04–±p¾G)¢*úA»$ÿº©ò@D 7!K»NÆ(oGÀÓî‰?I É7ìtØÞø×á—a£~ÍKËlmɲƒM`ù" êtÓyÇ í ìè™é¦×܇ª—|RÎOO­Rf£ÐóŠ„‚%Íi•Ï)È"„É44¹k{WÚÆž^º‚~2¼óàéÁº·F*À’;1,š›T?©[JÉ/̪ÿ”3{êŠAíTapÚ!9¶%;qe^ø®šjÏ"Þöd%5Úzý|û ÿoço/]ÔªëèäòèwÌ„-Àý•5…A¿Ë#}#úÁè3›aX45øqßPìÀ8ˆš.M‚Þ¹Ý×Þ¡N1 Ù7¿E_ÂpE?TÕ'Ü“@‹’øH«>µÐŸ4‰4“>4–ƒ$øç±nñÏÓqÓ6lR¾CšØ®õ¢ Ry5ø}Kè>nR%Aéà°áä*êuo<…íÎ¥,ŠWÓ@{­ŸvoqK‚nz .õN™SÁ/úGôóÀ‡äàÎ_4ùÏ©ÿ´w½YAK•ä¿92»g”qƒÖÙ¨š+߯@U í\"÷Ø5ÕcÀ,C”ž*tZß±1†`(íÂÌ6¡TRýæSK¡£:‚\]EBGƒ½Y©#Lnƒ·Æ®½XÛ '&” rˆ[ÛwëUý'åÅF¸0':Å”$¢€â æi –/&×SU9fâb€ASÝSóä1ä¥ß:»©7‚³ð&a ñˆTZj1¤RC[2Nôañó§µ1wž‰J43‘²ê¯BS“þt~¯äŒn²2@ 1^òÕ÷Ÿ_åÙ*—Ó\ð„z8ÛS;cB4?Òaè)BÃÇØï Uf\l™)÷tVÇN.¥_Á«/õ´CQÂ'jØÐ›‘KstBˆcpyrÝ6Æ4®xI;ìy ”Oæ½_î1þô€Þü³m=Ê·¿äàûǹ†lxÈ•ª']3¿·YÉpÙQ³af›¼ôü:g'‚~«â*Èf!“s K‡´‹uÅ5¨SôLw°¡Ò‡lΟaÏ˶Vµýxëß”W-ßzäMXÈŸ;Zkã’ÉaƒFÏ^^ã$å>w„Ï/ßóÙ×yNßÿÕ~¯z´Ð;„áá˜Òù„¤dÎú|\êâThwúÄe¾f=ñAqÅÓýþx2+vd|/ôé?qHá#Øq´cC/ÖM—“ù¿Ÿérn›¶Œø‘ôBIòìŸJíè ¬U:—Û„ƒˆÿšÆŽë©\ «xûW‚~wýV͸Š2ï…ÏAÚ·¤ai4J·)0ר >ßé¶ #ÿx©MÜ´ä»koç\N°~ó\k_aîÁç@Œ¡oB°èC‚m…KA›®½+gÈšóÒÄšÝíúO^´u2ÖIrlo~FC µ,žÏ.x  ýÉ‚§K£›­iÉY$tr‚I~å’WmÜœ€¾³3®)€ÏôˆÏĺÛíh¬ ‡¶3®iŒ³»w'œÍ“›©ãý©ÈÑW'|«3@÷O{PŽwGþðˆ@:N@É]’gmŸl)²¿«ˆTˆ¢ëò†™ÝyBŽè¬ýµ²#¿úaÔRû¾´þ]õ$ö©lwùŸÖàr1eÏüÑ](ú$Ð$:µ3H˜®B9ÁÄÜBÔ݉¯Ø( ˜†bÍ SÉJñ} ìNzG’_^¯RÄCe÷@þ$ù[xýO¦ðåi ØÁãàÂÀO^Ç_ÿ*ú+l¿Gý«ÿ«·wa.?E†çH/Ö[ÓsYM2Ãc gê ¾3.jÉyE›k¬ž^Ò,,áçÒêp'º®³wɤˆ‹0:Ô^%&–0“©V:)P±( ¥8Œ‡_qm0üÃÉÔUÝLÃ/ÐëÛ ŒDxÜü"Åï+(GsÚnÞúrÐ:À¶ï÷štBy= ͳ± Cv鶸 PK§ßÝHRˆm´µHYâaxÖFÁRj…ႈñ´Û3c¯ ¦ÊÙS­+¾“^¯óÒ†9!ªÇ`¢èŒnDÿCiŠýVuc®¢ë±“k±™AýîB©çËaVhXWC¯_‡ÜS$-ÆSÄD¥m_(£Ÿ¢gYŒ%×úÚ¥|mG´b‚öð!¬:žÏ€IÿTT1NÁŒü<Ù‚ úy“ˆ×g½?¤Bç?õ»¿Cp(áIò¥ãàμÜ|v0ÐÉq" ƒV— pj¹oGo´EC>‚Î7 wÊOò'\v¾ffd‘0,sŽ 9l!PO⧤"¦p;Y’õlX(×­Q–—Ù—*´ªæ±VÂ>­®OPo*9ÄzL“Hw;"$Æäíån"f¶òÙ³­Š}¾^­NއÖĺ»ëõ «N­û÷aMidM]nüñeÏ´7O3Âw€)n`ÿ–ß ÅHdaTf®í……×ÂÿuùF­a®I±Ô J=4ŒžA[sჭ¶*•€œø[11ÙÝ7â³~Sÿ¡Æ}Ëjî­ìÀœ'çãn†{ è%ðl6„ÈQXèŸa V# ó‚àižG ô÷Ií H”$Ôÿ"†ö‰{vð]z E áb¶lµ½Ù½Ó“—cüæ·7m¸ÏîíDóV²›š{›¯Dæ¼0™c ’/g6g;Å2†ªõÊ*À´¹c±tʶ )‘ÙÚÛˆw§¡×8Úg”ܶK·{sò¬ÛeÆmº–1Fzå0¼{Xñq¦GÉö¤”Ï?‚€f&­Áâ˜}Pf‘t%{¬>U„°Au2]o\Ìd×s#wË~9h‹EÐ Ð^¸Õ4þ‰P¥Ï!x© yæ•ñfþQéOWwIÄ*Ã/Â3ƒG½L¾¢ª¡Ãõ=5µ6—FÖ™Wë{Ç<Ïïøùr‹."è¨íén 8¼’ìÛH’{ tƒBÝ¢šÍd¢DóOS°2 Äÿ4ü„´^Ÿ˜Ü‡oƒwL¬/&¢²PÅ-ìébþòæ k ?U”w,›ƒ®e"¾ ÷JRÓ@1ÿ^k‘z³zkïB­«¹†“D,-6(ÃJäD!t’FËØ‹ƒRMõá¿jçÙ% ÐSBŸEq9û?ðØ÷UwØ|tí¼ßðôha<Áš.§ùhž„ûê·Ì+“\è°Ög¸ª´Ì´ôµáž¯“]îL­ZâÁn¦g†Ä7ÁƒþÒàbº$äTal<‡ø0µ“•þ!yiÁ=qYrÿâwŸL¬[/©¶»Ãºß%Ô9ÄBÀu2§l=õ§õ‘\¬¤Î^Ð×diåôþ!Å+’/´ÏúNkJ¹_¥"§6K¼?X~iàž°ƒä¼'0ýC;Ê qˆÐÉ?ìx ‚þÒY÷Î.Øá¯4ÔË`ÄûU3ˆ¢|žjW\3œ”ˆ,ÌàJÌ!ãÔÎökÜgœyG~˜I¹Š®UÝ3Å·™½KôÑ®ý×»Hb ÖðØ—GŽÙb ß[J‚&öè­©pφïà g}Ž9÷yƒÆKêÍ]ú#6 GÝ6ù¹ãˆ*˜ê7ÐÆÿ U^ 1MÅ—€è¡ñ³)žc5rÜ7ÓàÌi ³P9y!‰ÑE÷súÃÂeªšãpÝýgÖ¬ÅwzKsÂwÄf€8ÉÇ‹.„þéÎÜÉ}Ñ‘@ÑÐ?ucÍ®éÜÂÕË¥äÃ3 ¹¼‚Ô<êY1SóyBóÝjÿÌ;û´Så߆ˆÝeâA÷C½Ý†u?K•Í·Á.hŽœÎÛ UµÊjÓŽÆ.³Â¤1ôËYl6ë^°æŠã!þûiÀ;}Ùü'e úSn:µ£Lÿ¥[±ŽøYF–ôŽ|hЦó,,éÍžãgQT_y¯Î–QPgÉI6aòcö ©AEƒz´îÑÔBUíiíÂ&èú?5%ÎÝ”´%kE^Ïiï÷Qh—Ä+0„šyXrû-1£ “Ë!MjÈ$ú¥íù^cq‹„î¼躱ú#‘d?ËýZo{@L£5¨2HX’–|p: ­ðè8Á?o£"=N‚&l“©bÃŒ–þ!­ýƒ°êÓ‰ýyò—¼äPȃ‚z ‘ýƒ&¼Þ o8S3i—Gt÷ý oŠ/p[•Ë‹”#öÎsÓà‡Fšï7@.÷¾€õÕfžÍÞ–q*ŒÐm¶µ%®Y^-¬.#«Àª­˜O¨òÂßäÿ*‹èSÇÅ?ð=(°Íg7 |tø= ¨œZ•@ç—Q54Ï_*mp‚Ažâì͇¦?&N Åz#‚N5[¬—hù]¼Ëf²¥%}~Ë ·\n¹b šn‰5‹ž‘CZ^åìTù+úÉ™tÉá*h¤b˜ùÙÆ¶ß]i€šßq}S¯î8 ¯ÿ ªðih]ÃœÊØ&€õ 6XzŸYß7ûãÝR*Çù¸îæç›'ÅNCû>ôo‘¢¸˜’{A1*%9ësË!ÀÓJw>CçWÉþz»%Ð>ÏÉçšt6Sî}v¯ä(}Ì`ñ•yª…NºZÿÛÐÏÈ!,8ž_îœù+wBªÉ’ãÞîòª´CЛշ|Ewu>ÄCOù#¸³†®­yŒx}£n>ë\ãÕ?ø–h Èîòkð±;P„ãB¨qã§ 1xrÃê -å*õÔÆzÌ5#qÕ³dƒ7éF Œˆïä{oÝôÝýšvˆÊ”€Ÿ×%lŸ‹&€–óæ'm˜òš¬‚Ð7<Ï:¯¬¯©àÏ÷ù@ÑPD…sºò@1TaÌÒqkÊIšû’eóö~a²ôF•˜ _üÔb™ðsƒ-U „nÇÁ~þþ“/ùoÄ«ðò?2C¯ PñÆ2Ö¼ºûÌE'eQÓ¢ËLs¦Ô²:f—R4Q<‚]òk‰64åöbŠS¢€dèsÐõÍq¯Åuî#û”lò¶ËWÁïYéqiØ ´n˜ÎÒ9'%žz/®£. «“µõ2JÎõ‹Ùîx³×€Ÿ“:¥kj[¶‡ü0=Kž›å{ 8¬-¯ÌÏ;D¡ß(•äSùR|íÔj¥y¾’ÝEÌøDüE³rÉ…‚_zV ¸s\®‘<êSó·sFb÷Mνժ¤ådŠ'îÇùfÄÌ® F÷PD6NµhvÝáãúWþ$wçó…SÒ~ûŽ|þË ‰²¢ž!ÑãIòáÀÙ{¹S?¼ÒÒÔl¾ù°‡@Ïtrc4„Ýiû\«$P´‡ZÝ-aìjÃû|«ìx ¬lâõ"Íû%|΋BÛdƒé’ÆØdÆ÷Ô¼ééLh‰Ÿþàæ²7¥”4Ö~ꌃ(³$ÐÚ.†zw¸‡Y< «‹êO¤Ðœ9³#Irä9ñ‡ÅE¡ñC^c¶Æ`Â?Ý:›¬\žgI "“éˆÃôšœf0,ƒ zªOjúáI*Ðþ¢¾ ¹ç‹%Ïúò§ˆ•ö]ŰÈ15œp()ƒ5jã² NAÄ™ù42knë b·Éþ ÜgÎä=…Ì Ž¯áÖ¿=æúÕþ"iŒƒ™—Mêa'kGOÿ+I„éHÛÝø¦=¿Ÿ…½=ÈÆÞ ¥ip ç‰ù÷G7©¹˜-—4xÙÖ)˜nˆcÝ^“ëë “ŸLO@Bšr ©ˆ“јFº{ú±ÊÖgbyCþ>k‹ƒ»CD極:júi™¨v.†~ ~ì,ÙohŽÒpÖ5›²Ý󖉧–öf@7)kÎ󭼇†MÍ ŽrZ`މþ3¡’¦X<Lã~ë‘ ŸOÑñðËãè|ºà"Zð¶ï}ú§ «@RèÕ^ÞÊS,=T¢å±ËU—#“/bᘰ hváæŸá΀~¦5%+¼p?—×—ÓÖ¼US&v¸áôÕ¿9jL(/Oö^”yO\ÔÃRöv¼ªôzCùüdTöà£ÿMÒ…DÚL=€æp1~0âE«òS5„èä+:m¼>ûFšبÒbe§'O Ùü®9Ü[~`åS¯»)߯ð¸Ú£Ù=á; T÷‚Šžn5ØÎˆ¼µP»Ípƒ;—çŽ'€O}`OI-w:?¯Æáá·TŽÀÇè7+ïõ]À_ÐOÜb˜_Žy$²>ú&úÇF`ý$ý!™ÿÉ>„¾±DAÃè˜.ù^y¨TˆU¾}†ê{JbA?x¦|F4“¶D©67›ãœmz™ÿã«Ço¡ Œÿó ‰ò)ÃÛ˜D£x$¾¥+°ŒBç7™ñÉKÊ_ºÀÊùöúø?­Ìhö² =•ÿU×”ÍK*Œ_ b9«éñu©ˆÁˆ"ÜEú-TËôæHi̯”\HRk“…|p’=qñ—……§#ÿ{ß’åÊ’ãHÞS»­YzÜ;è5ôF5›? ™yÄÍìsžÈʺOárIî.E‚€ÿf5³eö·ÕÄÏ»(â1f&ñåE¦]Wóntœ´»H-°0F~É¢´¨þb÷>ª·°2ºÏ‹äô»_Ú7 g“†Ä\r ‡ýŠ’ß 'â׸”µCdŽÊ>0U£ïŠ Ð÷FìZ»;/ §™ºG¸ó¬ÿصo­/6q˜ëlwGT€»œ—OÈ3Ó‘â§·„´º@¦´`I ?©¬ÙLð>Zþ†+Û/¼ÂµÏº%Êo¡xsí£L,v0>œÍÄö“xñ9×7_9©ÕBÙuÈ_iùóiüŸpŸ.öÎàH UÛpA¢ïù!ÜÿªéácR„Ñù ²-t¦¾`¨'ú!ª×¬  Ð«àpŽÂЂBÛ Ë´t¼§Œ®ê®»˜™!!†³Œã!'³íI#Õü…V«ìÜë?ìÁ#6´®°ÿº€ 7È_ƒ«é‚-UBÝí‡Ñê~ìßçâ·Qà Äÿag…qèÚnæÞ@Ž* ñƒ7Œýz—­­x ¹î§t|nƒŸÁ !쉟í³ñÄ5ˆüIô7•¿*/æŽ¶Ø yAfØdWÆ£ÙÇ´Ãé£Ý8âÌ—Dñ²¹V6#f™Cö!ðñ¸]7Þto?é|åÎ?h„éþœTÉ!,1Da ànZ>¨q¢Mð£yãÓ¥?–@—/ŠèÄËWGq…ïþJg«¥œÏ™Î+ ŒíÔË~Vÿ ±¿¾H>E ú|êOÄ9ÓAKi€Ž¾SÉå/rH(tcˆd.nèÝï|áÍ]–Ü€®Ywf % lµ$î¯ØÅ·þ¿¸ ¿ùØ¡9È=ÓñŸ-ý»W­È¦y¯þ™¿¨ŸüÍ¡Õþ÷nþ8NÛ–ðh÷ðKˆ#s­¿G(çP2 öópç˜àæŽ8¤ZiûÇR·Âó7Ì£-Pa[R¦zFÿå/¤Ê½ý–+DÏãt•ëñŽDËáþ˜Þ‚žý‡Râßè2"À/0‰tþA:cú×þÒlÔ ÏYÿs ªä7g!se6_¿ÙWKvÞóß?–ýÑ ·û+¦¡z'Àÿ²Æ–N‰{$ ä.žýsc(’"Ã*-Mï)¥Èˇ¾Ø–,—Í_}%»ÀòØüÀbÔ—žŽñoà>ÿ7^vÿl´û#‰sÃ%]eìXéû…÷Ãù3ëæÂ‚ý%æHåøf!zöÄØ¯<æ± o~Aeg=¥<üËü&¹^®p…F$Tò(•.R÷¸G „t¢rj7’k³þü÷ÓÛõ¥Ïâ‡TŽP0QÿYe"ð/ÒºÿÙ\‹Ë~³f)R ÎaË„¾ Û^1D›?^ÛÉ8ܵè{dÒ¥\ýÍ+ ¡_F?•õõøÃ:ÎZÿþ€ûq× öDàGãŒ!Rì [óm7ÌeÁŠk@ZçCÏ!­1Øù•q¬Á/1|˜í·•)šM†¿pÇ‹î÷у@øÍ|êq›÷$ÐM¾UXð®Rñî1ÐÑH¨Üÿ¢·[Ùbû;¹‡>¯øxþwèÚµ©ú ÂlѰÿxH6]%W)ê„ò¹ç)0þK  yÿÆàúúÔ¿(Ñ Z_|h„yFëMF¨ñ'$;lõ=Zp<àžÃ3Ný\‡MØU†ì+Báa¼ß&û<\ÙÄc/œcÍŸ§KRÅhv™¿óEñ5¥«a`¼Y²Ø—g!­.Ü|ƒÛð|åB„jà#‡~ ¾ŒþÝoʺ lÍÈÜ¿!iÖ'`¤á¯@‰4Hú €$:ý`Êa¬)4ÀC‰I ÅïÿuUBôÿŽ áF Vå`$ìH SÞð2ã?ƒn^5}‰íïdñÛø–ȹÇ4¯1Äëæ¯Xì Ð6`ií|ábQäo™A6°7âRÙâ* ¬ò`ÖŒqü8ù8Œ}®…ÅJzgôDßÜ|žõߤ#<ñ€IÀ ¾Þ¿Pá/KöBØHJP#xE³è;©e;ï/ ÷‹&ñû?P‡¿!¸ LÞmL]Ol²À6ü8ʼ2l¾B—\ÑÞž±[.àÏÕoÆ;ÝO2Ô‹9v¨Hv«|ƒ¿ÌHWÁÞзÀL2²§"<´›“U&‘Î0°ì†_-Wfîö“¿VÕ ¼ùí{M]áVN÷‹¯/¨1ÐýðÜD1Øp?§§Å=ô¹ç„îû¨xóa“¤`w4Ýßaª*èŸ eˆƒ¢ø*Q©c ¾ç”œšðùÈå!/›º#TÒYÿû§$Ž¿ƒ1œšŠþSl—ÍÃ}ÑS¾Qâ¿ü½Ò¿vñد™Æ?ì÷xÿÍÂ]«Œ[O¦ÀȃX†ä‚ß|ã¤jÇÐÛ:ÎØ?J“ÅøÃ¿l¨þì·gïŽb™bÜßâBï@¸ºL@$¿=]8®ƒæœëp ±¥¬Ï…Ãlîûß(ýÙï^ý–b£&Æÿ‡ïÀmkŒúäÿê®@pù‡BK^…¿û\w9ÿç|KQ¿ÃCH¿‡yYÃiš½:}Ô£^Âd™3`Ê~ÉÌ: S*rgÿ´g\ôÎS“ÄÂsñM“+{n´(÷ ùßôÂ*I “äiöžôÎ ƒ{©ò·ÐÃÈ­ž@ny‰ôæSqŠnü÷Žó–*—’=¾Ÿ+Ý !yìWÎ  öGý{Á$T‘ËÖ˜_ y ,˜f¹/9 ̬ٺCç”xII?äíÙ%'¼Fßï¿­§¯ºÔtö ³v­\ütª«ï,ûÎ6Šeõ×Ho‹v¤pÖë'óxF‡#ÄåÉâ–ŒËûãÅed¼9 «ë3ýƒ- ˜û½å ãR}8e$ÐfTu°t;ÖNŸQ÷7tå‘^²ߓ@úó¿ðÀî ÖÕowÕü ?ý$ï;>N·(çtOÇ¢–‡¼™Ÿ¼'x_þa|÷…I’òõ~Aĸ~ø•n˜àú47CøùáÏ_"K/â¡Ø/ÀÞ~ØXk¬„lÒ“^þF‚Dv¤ 99¬–ÑÏ…õ³¡§5Pïúá+¨þêÒ;(·‡Ì-}OÞÝ#–‹‰§-ø}ßü§ãß¡ü#›œ[ýðaÄTp玃^1Ç àæ¯ÎÍ8þ9àÐß ‚!d˜ô©%áå@"`"¤Ž3ó4ã(åÓ-ÜÐûI,Å GõŸà,ßÎZ ±%Œrå7ª "YGµg®ï^¦Év¨ñâw¤Â—Ê·½í«×­Þ“ ÍS`[æù†µÖN¼ü¶ÎÿÖe6¿ù˜tuýóê¿ÿ×ÿÙaÅêw;ÌOä¸GìžÍít BcwhÌQã nÉ}m¯5tÖÎK¯§lŒIrF×Ú¤æç•Õ³\ëŸÝ3¨øv~reÖ’]ÑýR±R+˜ïgÑb–¸?6ºRAÑ{.’@Ê„—N>‘ÿ÷ÿwÿèúÚú¯¾]ß\EÜ¡pøæ±u'Ý[‚Ñ>psÝ4£Ý>½Gí‹«í0Ah'ÜÁ]Ч@y>šÎŸ3ÔqƒuEâOØÙºç ¿a´ü"üúËö†%»ûªËv.ѪTÊ®®®@]øü“Ê_‰»ß¢Ÿýbç€ Òš(ra¢›/åù…fÅô¥2ìp‚Taºy#êÇj“PGãúΫžÅªíQ½”ÕèOÕ£„‰TÚê‚7…Ò„ID?ÀE@AWW ®®ïÀ@rÈL :èî;°s²‘Ôš›_óIî1ô0æqJÕB)ÛÐêpk43Ë1 d’¦©xµÂr¶ <Ú·ö‡·(¹ŒÁ–ÚˆSÉz£Ÿ®®@]]å2¦§ÔA=Ó¾:w“`Èã€idÒÐÙðT•¶â¢DEûÃE¢ô„JšGÕ<71žZð=qÌ E¾asñ{«Ýе6p§œ…I´OÔ")ñJ~ººuu]}™GèŽiüèÇ£æ,ðø!ú1\Ž]Ë ‚A¹¹H‚Nj¾ç0«¯0H0:c »Ïô¨™]Vlx3*ÏÍ.£?µ~ŸôLÜÉ–Å9|*˜®ŒŽŒÿ±?:N(šy¤QPW ®®®ñP3D‡€dØGÿýäY2-cà¤ÏqA…d’h­ˆ@dK½ǦëÌQÑ?Ê”è2ž<Å­ïpY¸Ã*£·v)~}*Äz„8ðvÌò?ŽªÑ^Ùouu5êêú§³>s øˆ[Ôi€A´¬záÖà*Quôä¥Ï‘$’>Øë£¦s2?‘æ( 4z^Ÿ3üà!$­ŠtÏyf^~l£a‡§¹³÷€ç€)ll³‡Êâ€]ÜŒ~ðCôªnïêjÔÕõµ(È}tï°_69°ÙùF-tvMû¬gª–]ÒÀàTÍ2”[º96ÄÇoàQ5î¥[8 ã]ð¤ãûK#Eõ5is‚ΗnÅ¥}“=úË/Þ£„Èï` Ô¨«PW×·c (åq¼Ž%v”Ñ:Š¿(‚ÁZc”Áè˜åÍÍr­–Jïœ|a4Ïþ´~µ¤õº¤Äñø9öð„š¶«'‡–="ëŽ1ô#‘sÛªÅ÷Øww™^™ÎPÙSÑ›øÐvXN²Á‰HÏÝè§«P_‚®ï® ©s»È9ü£wAñ›X5û?¹†å9º2k±Lš¨ŽhDFaü˜oÆÝ÷÷zšgJµã`|~É’´€*Z2Fì­»6p‡¶ƒƒ¥ 9fGú&‘?–´‰*g†~¢ýa!‰n ÔÕ¨««KJWèKeȤŸ ŸB“ê¥ÍX "ûi÷•¯î€ƒQPµ}3îžÔCŒ- ;çÖ“¡ÚçÏÌ¿Šó?:¦=ÅS=S$²ÐÒ# …Oß•ª‚º\öóý€<ˆE~ºõ%èêb%'d»`‡ÎWÆI—š– ¸BÜd»í-ûÃCfXG¦âÄcŒô†ÏO»ä™/3÷neGâ1‘EI*éÄÜ/ýÁ‡AÊÈ.ãsÄ¢˜m·«@C~gˆ?†Bë »ºuuiPÅk5 –)€Ý¢xŸMP‘m½?î25°W=gø’lftKQ¸ ™°4ÚyqèÚ! šù¤—nÞ,½ü0`Yû\k÷~!Âø!'W¶ ¢‚?HãVhr!Ýl ®@]]u,S k©P.ºqP¹<ŸÁÏñþtª„ÄŸ"„5{n/‚^RX7ƒ`G?è´i‡-ï#SG¬ôñ©ø£Mïïú}d׆DÒ Åy=Þõ¾H‹‹Á kóÃDÓ@÷Àººuuí¶4;¬ð6˜’®NØgïF${ï§µIÂiõ¨Mw@nÍ—‡á@½ ¾8b :–s»*$’ðE|€´ÄG?Évß$ZØ‚¨ЧH]­ÜÁ¢Ãîž}Dê¡ñOWW ®® )$Ê×Àb!-D?[š¬èá¨Ù£éå4ð7ňWnP=®Ú&\&:Õο$pÊ¡0ñ‘êÕ3‡gÑÝE8Âd‡lœ`™‰uBnië¼äðM2?Œã^„øIÐ'@³®®@]]]ÞãÇg¼5?W{CWɺLÆ‚Õ*;Æ¥#ÃK½6:R9ÓÒmH6?ê`–JÁxuSú#¬Û59?Õ¯q(l <Í<•þøý׊àÙcž]ÈhšØÊw4œîêjÔÕÕè'#Ê(õïÝòŠ:ù©zlvvV D©Q,ë^ bÝ®`†ˆÐõÒ{ü¨r§†Ž¸‡™;Tt+ˆ:óIrA)YN+Ú¼"ˆ`(M­»©xmê0 Ô P|†¨Š¦øª ®®@]]锸çdí³}ÈÙï@ ¹Žj±q´{Æúƒ¹3ꉟÚb‹•SCËx[Œ¡½AjÐ)ä9B•Ó®Ip÷PQûSZAŠž'~€rðô±ö?Ö)±««PWWÓ?Õ•+4v#cŠD°…OF×E·§¶ÔO„qÌ´ÕVˬ8_"=À ‡x$åÀç hx”à!)ïáG¨‹[Ý3=[Y0…í^E_ÁÔˆB…·a\à`G¸½! ÃÇ×Çð<œ7ZüPÌÇèêjÔÕõÝèG/†Öi |©¨(R3H׋LÔCw4Ëæ„X‚Ø<|T”›7«^9pOêVgl¬vX5üe“ë‹ÖØÞû‡š…g87ãP>²u‚ÌΩØ݀“ºòn™î2þr÷11´ÅVŽ!Â÷wu5êêú—2C3à…úDZ¿p<¤$˜›7ÁÜ EÍ‹DuÏ %r‘4R&”ŽRarŸ`2Jÿ Œ¼à$PbŒÞN´ga·$ü„wÏê'äù’QA$È´;åp Ò€»7bÎ?Kù¤?›lîÅnu5êKÐõõèàn·ÙÈÃ[½pvgƒ~À´|Dò4ܦÑO/žÍ!dUù÷»`–%rôOAqHÄØÙê0ë~=”,ƒ†kŸàIHCH, ]6ßµçGèxñ­,¤P‹ ›6-°Œ•l¢!=ÖÕÕ¨«K6Q¦0Ò5äØ dô³ÏOÀ;âĹsíºYäŒ!PA¢[¹§ªDÍ‹õqø¦z˜”ÐÌ<œÛ ƒêtµ•a;wr‰“ ì󿜸‡g“:µŽe„˜‡meEÄàúD%PWW ®®Æ@di·XGEPKeõœ¯ü’Kôsƒ€Òˆ:pàÚi:Eã¨8;UA`âÙÏmù˜$Ÿ,s¹“"ÑL /$âz£RTé¾,wv‰AÁ’N 1Eäv˜›j)àâ%„ ½ZÝÕÕ¨«‹38Œ‡½Xö)ýû{ñsèS›ùUæ=Iá«U_Ìâ4% ŠæÔI6Q :ˆ$4‚>ôtFå°þ¥škŒ` ºVÆ»œñ‘Ôó¬ ¤@?>ٴüþœÜ ½³ÌÍ„hôÓÕ¨«««bQÄ ’ Ý×gÕ•fÊžrƒ~¶’ ¥…ÏjêúÄékùœ'¿n[ ·|ö$8 N‹Pý<¹Ÿo'h)A>‹xh§ðQM½JÇò„é÷…*lH}¢!Gj` à­¼9J éD7!œ\šþéêjÔÕuC·À±D…‚Xf2 íI£äÈ÷Ì·+åwžüSÕšG‘Äå0íKê/SÆ\4þbál琢Ô.NLÁ,õˆ»ˆ8wÁÔðoaI„$yDàT¨‡8è‰O0xPYWW ®®F?‰Ñ)ý GËçÓD‘!(ŸTÑBû… !Ì45ì,q´\+`l`> Â’Cªš  GBíp™?aÕõrâ™$6D6¯áp ˆSRï)p@”8TÊv¶-ÞüŠ¡_ôX`&ººuu…ÅŽwyÄs±ÏQù¥v7Iÿ7qÜ«¹l–<K… /É>„£ÚaB†¶v ¦äÍës„éñêøžáXËj!L„ñøŒ8&r‚æ’â¡ÿ)¡O%…îêjÔÕÕ¬Ïv‘L;kàbâ < :°;gôãÔ0‘’9M~ç.ÛbÇÃ%äWD{sArg1ñâ¸ú¡œ¨_xH|ƒ,M“ÍíPèG‰½Ž*_6ëî¶Û1­”n xªÁ:³öLóì1Ë”> CIú @ €ºuuu­_#:9Ú$âÀ´lSß °¤Š˜4>†š¢Ž'¶;TYÏm¡‰í™4µ{¸‘«ˆ,N#šhƒ\Rœªk©yt”‘÷=\=;Mo² Kûòo»P9î+Dyñ„Òj–‹ €jqO½C„>Ëü0„‚5þéjÔÕÕÅ0ÐF¡Ìîb6AA¦¬aê|R¤xšƒˆ›´¨£6L¶Å…æ&¡"Äù0oÛó0=âè™Es4èaò NiYQô˜”ÒÀH’OKlµóæâïÐ.~¢Î²GâØº³0L†Â*,–…g~*9ÏQö ÷É!Ak »ºuu]Õ18‚?J âj!o·X¡ŸºžÁ‘ÍËî‚qi*¥Ù`ÄþWgàUõ‚œ Á%¡®+¡=`Æ ƒ~`¦ÂJ5w—å?”‰ºtßĤõäfŽ\³,p5–û ÿG\5ÄÌ¡j+ ®@]]]™2ˆDqP,_!#”™Z-o¥a¬Vpe”y¥¾ˆvÔKHFKLyIÅÉiå 3}†™Þ¥šsÔ!¤,¡‹\qÿ ðúh$©Ç@Õ»ÿOv¯Ã¥ÓûF˜Ý¡ÃP»õ%èêÚ.û$®‹Ã‹]KÜua´£®b3 ÿdßÁZ˜ ÑJZ>¹«ŸyÇs躄>,ê+âw¿Ó;Ë$z –ìiü»à–直ãŸÀdíu Ì‘>1È]H@—ƒG5šAF5H2f?º…Ð¥ÈïŒAw5êêúj¬“É ’ºU¥ÉÑ÷9LU^ ؛ėdXCïÇTΜØ#7ó¶kïòˆlÛ¯r3ó°;a¶Âl?lãz)%wEµ¾p ºtϜтlñ¼å¼0gévnxžˆŠ[jäÑ´HOu5êêê:@'¸#·ª ܽnLÙÜ£Vª'J('zðº%B¥çúªêâVÂÙä½[OéýCãå $ÐÂjc¼‡à½Èw·´Éî<†&‚Q¹}À) 'ŠƒJªG•žÚ`°žëêjÔÕuXßÓ”Ö®ÑEÐ ` 7q´yýúaAê ‰¨9àNF-6^7^A6;~è|À`õB\;Û¦•K…7‚¨<ĸyx ãmóXߊûXa»L óò_ ×,K“çR¥WXôR6QWkCy(÷N$é®EKè®®@]]]øÀ%º°ü¡«Ž’‰ë ö)î™s_Òò8Ã6%=>Ú3ZäØŽ *f4]ô‘kDЦK5æØu¢D¨ñD\ÄOú˜)0DP5ó¡`‡¿˜{¤w~Ì3ì²ip±v8Vi;·•t=¹»8 4@Ò ú´tWW ®.eÆÒ¦[ S#ž -6†bl}e\uØ*ó¡ QO§;œÆ «¨VÎÄ@öY ’yvXÿÎÃwà ó;ÅÙ÷1DïÔÔŸÔwÁa}ÚWœ –"ªTÉ›þ@ÄÍ`ŒŽ#¸:úIñAvÔ-°®@]]"(Ð TÂ&ÒoTDtM  ÃžLï ODO¨¯V\3þB¼%b7)°"þk¯ýñˆm”Mzi ¨Ò™Ãõ!™.˜a’èŸ=ÞñRhC¡Ä@÷ÅåØÇ‚ ¾s&åuÏÁÆgõÃ<Öñº¡Œx0¢Z»ÖÕÕ¨«k ~ðE9*ÞÒâ·ÏèçÄÎlÁJó½:÷‘fü…8Ç@“l±”ËyˆpD°‘nã=½¶ÄÍΙÈÔeôÕ¸(!ŽÇÇ!wq¹§Üœ9Ò3ÂÓ»<0‚á}ˆ)4¨zžÌ7 l”o4êjÔÕõåÀGALmZ…žL)f) ÌÌ|é$TzÐONp¿à™~€é8——Ô÷©Z&> É’êäú#EÉ2ø™ ³8?Ô@nøÁ„ÀÇv˜Ú2ò2[ÅØ¡4ÖeÈ×ßÊ ¬$ý¡ˆÇÞôt7[ÿt5êêúz„Ûq‹ P ¢z¼Ú~ }^<H¹ª1E”2FôÌØ‹µº`T«]¶ 09oò¦¾Gf›Ëek 04‰1"hŒ°ÖøG`ÒÏ4Ptê,~Rè©ÄÁvBEV%e›fg˜¨ïqí1D€5ûf(tÔÄGöF4êßý®@]]_ÎﲄM~ÄEg¼NÂ5Z*ƒˆRñÑšrPc¿V,胂ËÁéÊØà “;øg0MãØáz–n'©¥ì‘…r–k¢c€ÔNÉ€A Ò=ýºÐ£L~? êõ_¶¼Q r$¨OÒÆm·ðÆ €BlªÄ*†Ø$¼ym?ÖFˆ]] €ººp‚è‹%TÊ–7ÒèTì‘£ârhÐ'æ©©8xN[_êÙËšsçŽø5³Ë1 IDAT±M1Gð¸4Œù¢ÞHڢ鸈‡øù€Pk!½DÐz>áþº!½ÃH!©4Ð4wÕ©í‘«±XÆÍ±»i089uœ[÷&„äL‹è ˜»«««PW×7Ÿ›5€)°áŠ*× ¨äù›«Az~/´Ðh©”ACê‹‘^æ'­ñ”Z«C“r!ë†#x «&S¸À’ëX™û—äÇDg/ª"48ôYºŸnuu5êêÚ.õŪŠQ†oP) Ÿýdú[ôCFoqc*‰5 ç2ä8ñ¶@ÞõÇB]zgµÈç»/ÐÄ>Ïž¦KfµÔŽšÓ`±8ixOþHÖ†ûé)°®@]]M}î8’Àã8p£,Kbnu}£³ßOê¾!iJ‰´^­~ìÔ`Ýí¡…†—®a®y‚êsÚ¤’£L—Çϸ㦂èaä¹GÔÿ|Ì–²z©’wt!ˆïIrxv9ð²Ìu’ã¡AJÞÔ'N¤š_¡mæÇ¿*kh º“XOuu5êêJèJ} .¨—2åK9³0Pu~d/úÑ_DØ3j â,|\î©ÙÇ»??Ý-nj•CH’ó1<dí¨ç…ZöVý³‚I”¼3Þú9ñ@"4ß"6ÇrËÊg˜FìI ?ôåÏ@E¥õ cj´5êjÔÕÕ%\—CÙ˜5x”Šgr« ­1 Ö@;ð KA¤;!ªª–†¹>0æ¹­–Õ‘…nd÷˜avóßÉõ¨Xßã­ˆùÆxµ¨3 W°>L¨3§Á[G ÉŒ|(¼_xhñ<Ž%"gÓ:³øÈGdÄ@ù}Xê"±ººuu}kñ|(eö=”úHðe3H…;i”0‰ÙÑWxM÷°èE;ìxéÔ¼´ª¥}d…¢®pŒÏ ûâ{D¡¥ô v†øyZªªí‚™.Ð>u:!½ÉfÖË^8 äâ¸"Ü1bh£Äñ¹ÄÏÚ;Ëœ=þ‰ÆA÷8“¡mj ³ººuu5 ÚÜÅÒR @™¤EíØû°Z:ãŽ#7£ ®ÝpE+¦ëå•¡,—mxÉŒ½7Í©Ùs6÷YÃì2,‚$Fv¶Ëå‰=`jàžI1˜§Œ±Ã9Æ„´ÄRd{¢‚ þðúÇçø=¡’ ÍÅ;ë Ø‡™„wz ‰&Ñ]] €ºº¾Q±²<ÃO(w"žâëu ø,X!˜¦K÷+SÄ}BÙhqÒë‚9+·ÃC¢ýnÑ¢ÞH–úg¨›bÁ‘Å‹¼ âpP0¨ ø,óÁ| z#î"…x5ŸwŸrœ„¼(`gôö4x(‡g ¢¹ }šêjÔÕÕE×{u$0‡eº³R­Ä§Eú)°?°È9Y9{*è"ÿŒžr4¦všßhv–BYׄž>|£k*©§/",74¼1RÃŒKÐ36`P0 h×r¬´e‡*²’g7î.¶Á•È›xÐqÊ蘟jðsJDVt¶îêjÔÕÕì[êÁxš_‘Ô6»b(Ÿ•/K4ÏA´RŠ +í‰âNŒßÕÕ¨«ë{ÈŸ;‹d£§%>ÎsÍšgÐxQþðpTÕs˜KRžŸ„Ãß’cW &@bB¾ÂIèÊ3üϸ#6‰Ï Oq´xÃh×ùšI`NÌÎìB,|Rjeüc蟅*Öð¹iZ-^HüŒ»k‹!ÚŠ%}¸3hæQZ€> €ºõ%èúvôSØóÜ.ÊåÌ&ùëȧ`Ëý`ûâ2G»]ÏÉ’h­C>CÙ>±Ý!9™t ±V†þQ3,¶8!¬y0˜y3íå‘ÌXÅéj^©|Â9¨ÛRµÇ˜ ' ’±e¾Ó¾ÿ%k̰Aƒï±F?ñ°¹÷ ŠPݱ=Œ¾ˆÒ ®®@]]uÀiooGÖ$ÅŽgÙ‰#â«è)pC“TÁÒVËü ŒD8í$ÕEmyNûAÌ®—¬ ‹'0lõ»– ôîºgÉ}D0v]ùsrL& д6„Û:ЬP°ÄôS^Ý(K÷xL#¶ÕµÚRóK. ;9/a:Ìg©ÆæWŠðˆ ;i ®®@]]§îu<$ø;³)¬€èƒ D¹³§ÞpEéÁÁÇ csšýñrÚ¶¡Š`+£ Âë1ï¥#Üý5“ÜY–ŠËrfHÞ¦‘¯aÿãAcsRëçó-<³7dè]üp—F¹‰/¬¡0•šÔ?!1ƒ9‰X¹On·PWW ®†?ŽÀpPËfKÊÌý0„¿ à €£”GXmÒ´QOvTS­Ë®¤ÔðþÒ~»2ÊP:{á3äeä;°!`þÁòœ‡aj[Sªùò™´TƃxÈcy>ä T ­.kÆk;“g±c`Ca¾ &bÀ_wû‹SfG I³ú†jôÓÕ¨«ë«ñ.7¾Êü²ø'Á¤Fo‡íx :|s•w¡‘÷DRZHïý"Êz†Ä¸™h:".ãhÛ/§õ³O6”Î>Ù4IX- ²ñdŸ7Ú#ë12Wäébz cÈ 1p“ÃXˆ[\üªa€„èK²âìêjÔÕÕ%§¶=03\• ·ðè‡a»<Š Ø:ç7Írâ“2Ú) …q%ÁÖ°¼\ÏUYPl0>ò¨še¢]¦=‹Ù™ü $çÛ¸RÆÆ°˜u4š#öþÅ%¼1¿ÔH&ÊÁ q1/f`ŒÕÐò~?Xób†’˜†fí£IðEL2úÞY`]] €ººJpðzg‰§{J¦ M²c?vYjÍ@|*?ÇÕ³£JÅ…3Ë P~X˜f ‹y qF:)]ãóêßOFçåØŒ÷Ájš~÷×%ZL ¦ß=ʉ[ÂÈ»Ù.‘øI>Ñ.Þò:ÞíÐÉŸ…Å 6þéjÔÕõÕ|O¹a+æOFGqÿ“âgÎ\7à²åäqޱàQ†’Ô£·¢¯6|–_§†³ñ+unDc{h\ƒ¥øñQ§¸ht¾°®à‡ôŒÑ¢6=ÞÑ?Nþ<˜‰àû\VÅl 7/úHø;#fÈž©³NY`â’ÍÌÀZß®®@]]^[Q/—ˆå« $RëAcP”2ÆI+j*Þ«ãI¬Ã!9È¥!4Ë÷ÉÀ¼À(( Ð1ϬÎÒq\¤•6òá0è’Ô$€¹Ë« “)Ò fŒEÉÓ±ð TÊǪžÍcÉ`È.Ð>S!òÄF“ ó_ôØ1+оˆÑù0¹ nÍH ®®@]]]™àñ+d…ˆ¤ÊúŠOHi¨Ñ•_¸õâ|T3$™Ó¡ØÀPCö.Ô~ˆ(ÔÛ„J[6,%]àfdÃeŒ9´Úý^G5;"<©… ´?sc!ˆì¤¼|Í «²Rhj(ý&?õÃlW+âqœ±4ø†>]] €ºñb·#ñE¥õ Ž~ÚA9få&@Z ŸL¿ÄT¨F£þ(nÐódWˆî—ΑøIyáó ~#‹ž6’©óe€ŒcÒ1óT2Æ. ô9%q@BCö#py¨âc.¼P¬õªA=Í\Ȇƒ—ƒõs$~Ú¨«P_‚®¯†?Ø.Õ5)’¤(p9F[$…Б‘º8Ô,xñj¡ÌQ»èÅ“8œ¥{=loºÇŠ‹Ÿå±w^DƉ±å#m†çg0ü#I¢p|{Q(Ÿ‘Íœ$´ºãÛ^Îù!Í·>ˆYãC±2笀žxˆñUøé°®®@]]{ÿB  óâBgÐ!bSËï6C7Ó¥áhä|"òâ }~ö/£ÊÿzOE…‘õ©€vrq©ê1Ðzˆs[4ðHiȇò^JxúùWçœz0ã‘8ôn ¨ñSb ™ŒÀ ­Ã€'¥–%c6þYUЖ5ÔÕ¨/AWב Háÿ³áªVƒ8W¤Ô¸XBO==¤Nƒ&‚`¨Â=J2N/ŠVÜŒ·xŽbÐ@] €ºººJfEd°ÅÂáø¼Ö$`¨sÞLÃ[­ÎnZŒÌ…©dJf‘º&ÁÍ‘¸ ¸‘,qa†Ç¬Ï ¸øàµgÂý±õùðBSÙ<ÕÓãÆDWÈÒq˜¬+bøwŽþqxÆ… F'„fØ…°@ x,åäÕŽæ$§"‰`~ººuuÅ50*DP/µ h#ú±®ÂðTÀ¨xI›%6Iœ2G€!â|“iiŠPEv ¬ÝI¨¬iAmûY#éš~7F?ÌÞ ‘äœÉrSŒí»pd‘ªýÙÙùø ã´ku!µÏò¼7J”/ïòSó]Ùè9€žî‚uu5êê’‚™Hè'íŽ á†ïß±‘V“QkwÍéì´ÝµÔÁ›ÖXÖq‹ ¹¾jáeT žRÒ(FßBõ(JŸ¤wÓ˸'Hžç´¼Š›d›Óò;TãÏ×XV'Ø!Á::°>1Õý/R†ö^qt‘ü‚c¡ü«Ç£B©ìîêjÔÕõå PÞ@l˜‘!‹g~H:Ñ?ÕÓF‹ZÐŒ‹TjÖ ýhZ‰ûáJ¯¶kjRˆÃÈ—Ö$™êB76uÚBû‰°1N§Þ]ÎBÏ¿NõPv«Ž§ãùdGA§}Fq÷E¢·èqið—Ïê„þ y¸}¿ººuu}þAEv°ŸI‹ìž"9ãùEÀY)qL´ò#¸5bÜdNùŒØ&æ€B!;~”©3l®é°D ™¦ƒ²pÓå}ÙH'=Ì)¥1Eë @ ±{<³‘H»V²©SçHlZAHFA?—Šx'Âj}ÜüÂTvúÝ}Uè§1PW ®®ïÅ?¸!†b|š—jývγ^ P4áp>j Bˆ€Š É¢‚é]¬×Á ÈIÑÐÊBh6àV5ƒñpy_þÈ‚ˆÔ%ÇÁöºëð±ð™Æcк$¸AncÙK‘LMÿ*öÊ,îqº*§%òPÇG^Dô“¥?~ºuu5¤[œb­¢&ÈÛÎÚe’ÉLÎä¬áHöúÉFÎÓPçšå´Î(`O€tœjÂ?‰ª[2$ÌFJŽÀ‰ÛÔäYYF„Æ0z¤'†™–ÒA8­lŽNƒ´{%Þ!>e­ŸCÖÅØ¹È÷u­LÇMâ¬û³S lµf‰ ýt¬««PWWZ­3)S<("k¸âW+ –^=P'H`'bfáØQyÛ{& (,«V ¥:ðÜRY+²çÈå°æF¶5ƒWÕŒt-¹Ï3ÒõŒ¸;)´EO 4. RИ,ZÈ¿aº‚¿¢¶F„3®†ž ðÖ…„ oA²R$!(SZ¹ïs£Ÿ®®@]]r@²Q ¸p;™D@Ü(>Jn5d^4Œ.h=¡ª^¯¡~0BAtÁʹáÏv àÄÊoôÓˆÒìõ,ÎÇq„Á !/ÌܞЋ*:zÙÿp–åx7¬ÎŽ„€ zœ¢,#',‚I¨Þy§ê.XWW ®Æ?ƒ!tÐVí{Þ5/‘É,Kì„m±ÂÉöØÇ"ÉvÍ(BD áñ[„É..Æä".ÄÈvÌä—ÉG5’ ¨é1TCh‹„è[« |Swð"Ä£¢phjœ{wÀëXÆŽAoæ0ýtu5êêzƒ*Œ"`¨tÇ´ i-ÃéÅI›J²€HG¢ö`TÑ£Ú†“FlUa9ÐRæ”;]³-$YÑk—Ý5¢. ³ƒ'O4†ªïg­à 1ÚŸ5 "Â’kÐ<û]€$êÊÐlþkQ8`^RÁH® Á¨R« °oôÓÕÕ¨«k‹fŽ¡4&IûZ9Ì«mú93r¹æ&Âós`VìÀN‚Áâ ?5%ŒAæE ðg†üÀ$Бgãæã€Ñ „h/¿›Y½æé-Òxù#ôSØsÌ&Ë&>:ÒÇ_WÊ ­yóJ™ðá`^q?‚ºuu}5”×l¹—@‹pF(BnJŠÌ‹íçîí+ä¦',KãÓðŠÏ]ËòOaÐŽfÌ•GÀÈÇ-½ b‘"–’q OM2*`ÏbœÂ;Cöˆ£§Ëᲇ†sh÷¢ášjè4UBcëýÏèD0D0’ ‰Î¯§ÎÊhÉ9eÜOß®@]]MÕ v°¤Ö´”í-¯ ÏÈ( b,m‘jžÙK›§û1ÖŠ¯êsU™¥ƒqšND<칡œI9[íª6‰ë3Ó.úñû3¼5³PuÅfx¬ójhäá6Ç»¨K$µ$ÙH´>b|¡-Jºãmx·/%sW’?SÚè§««PWãžû¥;Dú:Îë™Â£N諊9 ŒJœŠ‡SwÖê€0¡Q¯R$|„8/†PF‡F$qOàè¬3И‰ègŸh¤ãÏôƒüªâ‡ø}§)õœ ¢%~âŠæÃ(ìlŒù»ÞÚ^Ä=úiÔÕ¨«ë‹!Û¨‡á/"ܱþy)‚C6¿!¢Âüó÷h<5 >!Õ’?¨Ä°*1K23Qð@FJ$’:ÛTn‚ýÁ,CÄcæÃl ؼËݘVˆË=Ñ •[ää’)£¦÷„$R^û¥`¯ ÷0`Dæ¿\ÒH"©„gÊÕ¢ŸëêjÔÕ Ð=N¢Nsž³uJDtB®@°G^»ÁÛâè$ʘ¡ ,rqªhÌHÒ]Ò‡$±h<ت¨³)Õ1äÍ"„¼¡3†Mô-·kµ<Ї rL’ó|T†F™»rPc°>F˜lÄÍa¾î­Bê.•†«‚‰R"±Iþ*D÷]] €ºº¾ í *8;Î Åïæmâ/âWûóArkÊ+?úa ¼±ìù‚Í QÁõ[¨çcŠç'Wüßö5ç¼æœ|pJ3bÆÚœ&\öWlC¿G8+sòý#—Ƙ%S;ùÆ3RÎFGóôWaÁ {V, • …-ð<CÞWÖeÇ©´x2ìóÔH¨«PW×WãŸÛe t K·°Ä«8üNmgR[¬Æ:ª$D)þ¨B ]]™%{–˜æó;Uˆâ^v²è¨8ص¬l¬©!~&W4gãŸCÈÓï0œvcM·I˜½Zú{à €¹Þ—¡mln†É–—lÃé6ñ.æÝxåþÜè§««P×·# ähÈÇÆ+WÄ™•+£Ü ³Kئ>-" Õò¢„ ©Ìz *÷ŸSn68½Î^ÿܯºâÀFX9 }ÄÑO¬F–EÇLxàü–ö *î‚È&Þ½4\Û¬šü"qîÞr:84 Õã3ž©««PW×—" —¢Ð ”‚á ôuº;®èà£~Ÿ+¼é—¹¡'Ü =PØåM#â£8(2F·´ C¥˜ÿ'Oöû笱œ M×l)Û-2aª8Ð`Äi5¿"M¬$XÉùŸqw¶ÜëZ k/dNÊÿÚbê*礫«PW×ã5 Ê^õW©p%‡öˆÇ!?x4$|9Ÿ.ƒÀm±HÚÇ÷†ÆNЧzAõöFˆ¡¯Ÿ®–8;D}¦ež| IDAT¤™âŸ'.lbÔer$.1, ’°˜d&c8Kh3)ï=€PbñyÒœ"Ë\!à`öH vu5êêú*´áu6_’Áé0“90™ õ"¤{¥„Š 9À>«#–*Ø# ÃS›k?ü%Ÿ¬;V* Ò)ö—Ê5¿,ˆr!÷ŠÏÌüã/´˜Íð.÷-‰µµã„Œ¥OÌ÷ôMôm™g´ „·Þ„ã£ýtÛ«««PWW±hŸ'”„Nêð/ú Ô˜%öî¨5¥*™3i×@/µì´ ,Õþfø |ƒ2гr-Ä4¶L¼«:/P££ï`xé¨Ï_äE97 Cæ,K {RXl‡¹n×­ ;w¦ÂbY)è,?»„ºuu}72 @o$Aiþ=‰‰@zˆPm¸–ù>_°õÿbQ„‹S©ÉšÂ IY<šž-­ ‘S>Cì,ØÓÒz&Þá…Ûƒ Ò<àEˆ¡Óu˺Gʼ‡„1.ñìÏhŒ-óg`h^/篨Î\Æ8Ük¢ÝÞî4úéêjÔõõ¨"caß¡ŽLÝ$5´d¹O|9Š».õÙvü›I•ª¨ î„0H ¾²4ÆèÁ&Ì"JÑpïèU}h“í5sÀ†0H„Àh>nm ,Q @0‚!ÍÄðêóÓêuÁÎmôBºlùI ¥LYf ÄÓO‹ø†@]] €º¾ž‚Ç›l¿5ƒŽ®W¸'2¥4%<~y1ù9œk¶‹!D°Í€YABÔ©eOô—Ú¬SàÑ™FFÓHlÏVãñ˜i¨…›äh¤% „ILü’D‡¨0CÛ¬.I>˜!¥µ%ýÄ!)M·$~ZÔÕÕ¨«!Ð é²›b*L‹g¬¦Ãž•·zÉ$º o Â/kf)GˆìêEÙPuÊ_Öê '+õi‡ ¦¶Ç¹þ<ƒþ39~þký¤kHµæÏ>äÌb±b Óõšœï‚-CDë21œ®È#-g ÿÙCF?ÝëêjÔÕuŰáeÛ¨T2畱 ²ùÐÍÚå¶7…Œ7 ˜£ßp?´4´¿¢¥Ýd¥Ò¡`I£ÈŽÜ‹9/ö ÀÍN ” ŽH "ÿòo…š€øé/K}/‹v-°h¸`’S]WØ€ž¼Áš\AiOÞ:â­««PW×÷" ó×ágùW °ÃS)†éh xÈã hAx ,{&fz T IÝR"+ÂEËØgÅ ÕÍaøqéÇZÇÿË ÍȰ1 6@†2þ)6%AøÛg ã`µ8OçÉE'C#œÎ)ž8-ŸL·bèG:£««P×·ãŸÍê_¬!‰¬©ZÄ­0®:gqOQ85[€ÁЈþhÙ{‘B4=:UÒJ£ñíP‚À`¨$ŒºfÂÕ¼ú§Wf²à‡LÜ\€%r3l¹‰ofg°L_ÌF¢ \L,dçäç$½x¿ÅåœÇSöHÁ®‡Âººuu}%$W'Î+™Q²E ·àÅjĤӚ»Z‰›QOäØS™°ß¿‚CÊg`ÞÇLÕ]¸( ËŸe÷<…A"¾ö< ñ8I¬5tF·pqÉ ÑCk„&‹5š.Ò+6dtˇÊa.‹¼pG¥ìWW ®®¯Å?l”i¿ÜA”MÂŽoºc‡¡ï&zPîªì0ÿE¤Å™ª? ¸Bz¸#f¾ûóÄò ñcúý1þÄÊËÌ+/f|¯@h¸Ž§ÕB‡pŒEü˜”x¬fšolaÔX\ £þ™Ý›£ûJWW ®®/@[H²‡MÁ•7(þû‚Q¹šÃ©šeY/¢XðúÚª£™`35–;úãSÿX 0ȉ¹ÙÏÔ‰HCæÆÃÁú Æöa<™“œQ4c€|¨{loE÷ t#|rÊñ¦Jý x`WWW ®®šÎ)×Å‚;¤tÀ:øÁ*Åý•fø–‹×?<3Â<˜Žy6©š‰ \ÒóD#ÚTíSÎá¯1+6üžäz™›ãNcTKÕë ±<Ÿ¶Ø û²8ÏñYPÅ÷ÄÔ÷ŒiâɈü>‰¶««PW×7 æ©.VH!kæ¶ùµ~ÞzÒ¼pdO€ÛW½’Öwû,â¿ö0%ùUŽŒ•™aœ¨U̬˜³’gX~Â<¥o&—‚m>!êràmL/ÌagŸèÜ}PÜ@ xàÑ‘cKLæ•Ö>wu5êêº3?áhžjIdðTüÅs¹ßu·»îši?·™Ì&ô²›¶ÏÇD-<3Ý~ÖKx Dó$Üš ¢r¾Ð§ø„Ôu–%²cðÖCÈÞð€É½ìý4ôéêjÔÕõ år_2g| ¥ª®ÄÏÝéðËûo§/ Ð&EÌ„¸k u¤œàGYmÏdz0°ºbso…MCuJmTwF@¾æðc}"ýð =ÑýHèÅy-QâÜMm0ÔÕÕ¨«ë•Šƒ¶õ+àú¥NËôÿŸo÷¸¤…tƒÿt$—ÐÝ_îtÝÕMŒ «¸ÛÅõ<ácoá0«üt¸yø8œ>¼DÌÀ—±ù$3îé‘H –=yò ’|€Â5ª[z5öëêjÔÕõmh¿"à@m x½m÷Ôkøq~Þ¿¸Ü-ø°}‘"“C 9‘Éób»s ÆEê’T㎠j!# ×ý’(²Ãò âÄå‰a™…Æ™Ï3È ä6÷sB‘]]] €ºº„5¯îÖœ¿2-É núaxq‚o.‡ÊT§£Û?zyÙíPýèÙ›á5‹„æp—ÍÀPã˜ÄQ8øi‘¼»} ÌÝN®Ø«‚9Åi-V'„àüì…>×>@凮Í»ºuuÉ¥^ýΦ‘‚;(²O¿`qô·_ý!V¢ü†M*¸+]Ü‹õšf9¨Ä q›œá‡érÔé~­Ï?¾Ðë•·/+ï/h[O¤À?Þ A$d¢áÍVï ‡½ú9x$n.]CŸ®®@]]k•(¿ý_Ÿr=IÃñ—“õ7àæ…Bú7+8˜É—g5w»½”Ÿ£fÈâ¦Ó‹0yÙ»+éóàát¸@‰êÔéÕûÁ S>…„”0ç½A®·åoH ó/Éu?{q´{üÅOEWW ®®4 tX#J±™„×/¾Œin©å„È_¿,ÅÑh¹›kÄ»Ye§‹Ò¡‹Vò¼«K6C1ÒÛ§øD¿[låŸt‡&5¶6ã¤HL˜8Xã< sãaMºáÝŸ­ :ÎÝsôÃÍ/)©Øx¨««PWò‚M@vߦ«öØ›eæj.¾PñV@å·“õî¥ Ýóê9Éþ‚!<…÷4¸ó+…¥‘^ ÖìÙMÛ3xµ¨,컟óç „``Q'½dÐs AEnŽì9 Êñ ™lSôÓЧ««PW×=9ެã’!ú%ãR0ü±*7FG'mæv˜yZ͆Ä%P–î<é{¦þ Y¾?vf^¡‘ÁÐT…µv˜ƒC7CïaB,«¬A1ñ™Ï'Y0D¨*üä3ÐÕÕ¨«ëK¡OúþŒÊç­áq%º¥Òß9 ñ=~‚zñ´#U½&Ø„ÛcÙß_ LâeCZÇ¥Ñ)¯ÂP3jÄùMƒߊ6ˆkª=G…ÅÌ0¶] þGðO"$4ËÞCŸÆC]] €ººÀ9üì‰ð†ÝÉ‹¾Ü o,¡?8Õú8°Ãe ’#À¢¦Ø§Óý«ûÖØŒóšáí~¯GÏÉ5ƒ”'ôæJ¤¼‚r ªŸ[a'ÅГsŽFü7XfuýCðÃ@WW ®®oD@5Ûs!”¾ZlÜ:¦{g>d Ðßc}ªçM¼p¸L ¬“ÉåÜ q*ž'*v¼†Z•NAQç-ÀPÀQ÷Ø÷Y]Æ Qòä—Wµ½®óîGü§4ø'«§Àººuu]p‰¤omë¯á[˜…ZeO½Ä—Ð'í÷ÇûËóqÑQBìmP5)^"QéκǤW¬çKï€Â£"{#yP øÍñþÕ~~]ÀC¡-{)¾¸¸buÐ]y´yñ©/Ôq]] €º¾žzÛ9>ün~ó]‹çß°AGìtpÅùÃÔhÅáp/d†è| .É ûxˆË€ ˆIRh—o*IÜ ¡%ƒpñ‘®R»ºuuu@ÀnýÀþ{÷=âØ-Éúöȯ÷ó‹cVB¶õdÄJÈž‰&8¼ŽÈÒ ©cf൹òK%•”E?âí ­?"é§Ã\^jsg«{AöÆmfغººuuí @ÖƒèIPQ,¡8”À!Ùá›~‚ô†€IøÁô’œž÷ÑÄ e"F¯Öi?÷•ˆÌXùáï£T…¿a'¨Øÿ‘4<.õB,ú±Cí5Ê—ƒ&„€#!¹PŒu¬«PWWãž´ê;¼?=W;ï:búÓf~p?`Ú?¢Ÿ…ÔE`Ì…‰O\éI4˜ZÅõT´Ž?…Î%DÆGßjŒÑþèF¼¡ã¨ <ʳ\ã¡Ø€›„lªóÕÄõ;‹wŸ®®@]]ÿàÒ´*H&^¬,Ð DJÂlžAÿŠû¢6?锳TC%=š]Ñïé†:,Ùiºô Æè:0iMœÀ.l+‰•TÄÇ/8GÅÎA´óAªètu5êê’ ß×õR[‹Ÿû5¦&‡*3j§ŸiÐ=ëóBn žÐY„ˆ~È1k+•K¯¸//ñ í­tA"å=ÿƒ’p*%åö€ÕG€18µn”¦VØãtCD!ž¸&Aý¢ÇÔ‹¿™ÒÕÕ¨«ëŸ„|•ꊷƒñ‡t·(•³`Ê9‰w«›?]Í$ey¦ùå±Âé9äd¹ü†P"ÅÑÅØÚç'ù½–péþý¿ìAúãpFÆ'd¾ì“†äe×ù"Óï„‘Â-ÌmZ¨««PWCö£õÊÍñͺ‡t®ïzaðþ(îŲ̀Âî®Þ˜ƒaPM AÆ7X?èuln aƒ”b ·%¨NW ;ý± 9E£äž‚ÿ!E<YJ~P@ tººuu½ABk§0ZèÍ]~Ñ:›|É™ž{{hýáúGq·ßYÖ>Z†K‘­ÀçÞhü©zS¼’ßî2& ®v6mªãì«ôÑäF˜žýà—ã{âˆ{ñɉ]Ä„ÉÛ†lWW ®®†>5$å@2vÏIíl~(½¸Týæ«ÿ™LZÍ/ÌÁ«4üµŸ`Gâá̃~bFìtÕ`@À 8¤•oe€CêO„ôÅ,Íêúfá%u»”Xz_Ä*û[ï{WW ®®/F?¡á‘Òáì¹ý庴AKø7€ªòy’È=Ä5†ÂüÚÃûhýŠs½y› âI±!NMè3ñÐÜŸŠ+Æ…Ã Ë 10„ÜÕ2w*jYæ¡´NWW ®®¿Sà ÇoÌû¼]‰Ô㌟K–ÿ ¯ãÑÃ\‰É1Ð\ÌuM‚‰NSDâgš%ÄRƒí[fb©J$g#Úøü½fWW ®®(t¿Fš!ï†Ë—ý 9=ȈÔ+÷F­eÀÅ Œ¼çQA|H,*iu†º9Ú¬ø3úð$P~Ç•p6Õ§ÃÏ•ÒÓDN¡….©Ä/ëQåMnßb8ð wu5êêú"ü“ÿ•šþ©x Ëì@ß$€Qζw1øü>jÆX¨±]Vrÿx~մ«H8´'™ËötÃjNH È"À ¨ŽÇ5Âàˇ.Ê„Š2•ys4*ÅŽ ÄÍÆß§òêÜ÷a›êjÔÕõÕ(Kc×Jy’¯¸¥Âé[Ü“XœŸ×}Ø}14¥žóppÅYD?ò ]i\ŠEup$” ŽÖo’“DÓSÿ¨ÎAºþ0PëR3n핃J™HäÜÃPÿA´<½A°ºiÄÓÕ•êO_‚®/g€¬ W‹¥bN€ëÚSíÎJbîÐ=þÀßëJX÷aàfççõᦎ²›ñ³—ÉCb>mÄÕgćB€Ï=—'‹ÙiTs¡Õ\Ûè Ž¡rok¾+»O*AŒI‡ü:k¢ u®< 'f‘ÞJ¥²jØÓÕÕ¨«kK0(…>l±ë«ÖK^Hu~y?EQgèóÁ"Š ü!ÎpÑ h=Àh`£ %¯ 㕃Å‘(YÌ3î´qõ-å ³¡EWô”81+Þ÷Æ@ü˜ÀLŒÀ,ãžXŸCûAÔ}ø'R—ç¤Rõ”6êêjÔÕE NÄ@ºh­VßI<(ß§\§ÿfÁ‡’nLª±þGžeA(sxpðÖÊ=‡å•ÆÿïeJ,NëÈ­l‘FÊDˆ€½Ï»)!SAàâdq;Q¸°³tøMóûuBô]]] €ººv+…>FM¯Dýêà…D*ª‡¦XC¿^£NÐÇ"TÓ@“ о#x>„?ó…`;dë&^¤®na: ‘R$ „ Ò´õ‘7!‘Fâ-zS~.JOð°ØÜ¢8½øðt;¬««PW×4'¢’ѸjŽw²>I4Ô) áüèèú”dÏ6 ¨’å>n¸ Žrg?bäA±ñ«†hÞZh)êÕ’¶/PàÞŠu¼S¢À•dy‰ÖP4…vWW‹N ¼²ÿ쨱Ÿ}¤ººuu}%úI RÓ£½Ú3+²î×µm4Ë ¡76+rÛQÏ=È’!$µ ²%~»3Ÿþžò©˜“âü(ë£ÞÚ¼#pÐNíh!pÂ-Ýë…×AÛãø :¥˜&}^tÀ£9a§¦·æ&ETý¹kÔÕÕ¨«!ÐÃýè’Ð:Ü#¶ ¦3ö³Ò>Gm¿MVµ¢ç´Ì‡Ø¢†9°Öåܬ!ã^QdðamÒ³/=ÒAž$g½ž”-I¥Ž’õ’á,ýÑ|‘“Jâbf/ÝÕ"õè´˜>´XXJWj P÷W´ÿ»uu}7äÙ AäDaЂA©‡7Å+ô4ÙÌÿ~wü8C ¨ÂRñ,Ѓ(sΈgÝ* š<‘›ŒŸ{²^AR'êè…tÎLkóá{T¸~ˆZe ^JqÝ“ªŸóØYhˆ yF0d4Û³7ë›´ê?nŽÞÔbË¢»ºuu…u/Ò<EaÐ\r¬ ÅùÓ<ë c€^@2Î\pt€>`¤ÓƒVšc&°œƒ‚é у%+ºì”½wKrþ‰b“ìÉI%ÑÐL¼ç¬(µc“zðæ†ÒLSLâ*½dIíÕr‘jÅPL{6‘þtwu5êêúç0@뛲ßÈÈ!µ(hlJM1-&Åd=füO_L‡ifl ‚Düx_Ÿ%>.gļ…àUÓN”PÙä{.q bœ6 {„æ2R}„GÆ*6Ú‹"J” N©®GW)¯€m®ð ÎiC¤i¦¥Žl1–M u5êêj ¤kÝQ# R/ßÑ`$óK·úeÅ|ã¶–‰zÅî\@'£Cÿ_¯ïÁa8‚f¡žE#ÍY/ ³>ÓŒ!ú9$6­ù¬|ª:â©pÄkB=0;štpvoH±Ë†6‚7ÅœŽ„¾Z©év»íp1¹AÚê{_uÿ«««PWWÂ^¼Ã´ÏêµAjadš'ý¨âa‘¬Ÿˆ‚Hï\^ø ¿–-Êÿ ž&rªgtŽHð0Ö~°Þ¡Ž|D–š˜ÿL‚éù©•”’`±¡Ž”:;KÍùA°;Híÿ>Xšã]îC7?˜êfæSð…ùüúWÖ5êêZÕa¨]ßNÿÀ~w]uQŸŸÉ倮Ñ'?\™û[q,Í*J5îÒM)òV±‰ˆGÚùá=Ì5ÃDêÁ¢&R˜*cÍœ¦fÒ90Ä´² ß­LÅG/£ÇB”rÉñ¾ƨ°UªÞ!h^K ·èJ›ÅJ¸Ÿq÷ãÿÅè©ÿóþ;±««PW×?+ÅgÑ¡EcAÏ Õ¹vŽ=í® <‰m†¨:0‚Ù»“Ø.|`²‰`Ç@p„^Q…y@×y  9±UØ-áŒ8Xîsý\Š<Å:cvø¹œðrl®B:±À:_¬@ŽO®ØŽÕÁŸ1Ì“Yo@‰ŽÏ޹¿e|Ru‚¡œãû¸°Hof~¿ººuu}!¤ªkɇŸÖÁþX®!a?«&ŽÇKq5}1ûÎÕÞ­QcÁÔ¥ Èž|lôêú,:‰‚1qZPùƒYÑW[ʃYû\Êu©-yŸªBÖ¾YçÔ‚øQOý8ÝvøQÓ,¾ºnTj)ߟ†Ý;§G©Ȩð7æ]ƒ\`Ⱦ{ÏÇ8Ò<y>ŸC-B黺uu}ÒIáÈ\‰«áaÐúшDÖcÇZ¦êI0­êV-‹‡Ô‘FŸÅl5K4&QóÑŸGç,K®ò”O LÛkÝÄ<±¾+üƒšÏï€Å>þXÚq—©¸ –€ÃCüƒV§ Љk#~à‹.¦œð†×Ó 3® >ˆL¡‰Å›˜rPW~â­««PW×Wâæc,Îêô÷Êj€Á#ߢ :L È,–kùs-¸¼ÔZ½H57ã D[6Ô!ZÓO¹<^Ê£ÔX‹ñšd‚WMZ->ú³Í4 'C¢“¢JWž`¶è«I„K2uB8Kd ÞÓµUõò¡ƒ8ý#¾jnèçøIä.’Ý_¼XËRgÚ$PW ®®o@æKq„Ab¸!‹í©jF I<( §½‚E˜ïæ2VX*°”ô:D&]£ŸrúÉð n}¶ýœ€žº ëö8­ÙÉûgÀhÌÀËz§¾eöÉÆ‚ <'®$LPÆ:Ь†ª. 8{úà„wŠ;î12f¦Ë™Wb2=Ž_RÑqZ³íµàŽ®ö,$à°Øÿj¨«PW×WC œ#z=)¨Y}àævTjè±ÔBcYž[– fõ+‚ÖÇÿçXˆäG…~Êù0N ¹OáK£<ÑL"‰mA‚Âw‘>‹²réÁ…¦ Á ’:\Äf`šÓÑ¡¯ô´5y•]«SÆÈk$5@cÆku»fÌ#žùä:?¶6á f,!¾£««PW××2@Ÿ—D"`Ì ±¹¥kDo4»4.L ïØ¢sÜ9¶¿TÀµ‘%°¾û[J²¾)Ä. ‰Ôf³Å">û\Q”ãðŽ|ãa0ú.Ø„=Ï1š_ R©‡Nrè}Ø)áР〨™gfƒX2LŸ×A> ûéw;*¿®ãsÑÖ©O¹WÓ½\ŸÓVu5êêúbd cwL‹VªaV¨äæ×dŒ°”ÓaËGØb»Z2V8ËM1Èj %^!ýœxŠ~¶ÐIë³Z÷ „11ÂîyLX†Æð,›ö©^„ereDñ,’c¢Ç(Z*®•áHÒ¸]å#TÄšiz&k¹&"ÍÃÇÉ//š8Y–)ý½A uu5êêúFH£vÇ‚t©m'ŒI1!ÄÊlk{!5Ö6ãi‡˜Aë……ÆÀ²¦%i°[0My Jàg›±¤> ‚8uIæ“ëk\8ø¬0 ²sÙòC Ú(øù×%­=z0P.¼T]âPBþZí‰Ò •J çÄi/ÈWU$Qµ¨aîă׈„ººuu}1YŸÉ™v³Y¯ £jq”fØ÷Üb—}·åŠ£²ÌÕáxÌL|=~ ¥ÖrOAÐ0€VqîØjiX(h¦”ž.Øgé~TA2;¦“ã"¸¼€óÅÉ>×”B¾X(PÌt÷– ï¾ÓiÌZÃñAýÔ˜áþÄ í¡mTBñ,”e$S’%ìêjÔÕõuøfÈõAÎãö‹_èsùymÑý ]ë’Ë…Þyù(›¯ï. ²ƒ÷Kþí åvàž^Óv•@D~ |X‹Æøh{0­áÄ2C­e8¦ÅQÒ+õ¶´ÆC*¼_æ˜%"FuC–‰Ôñ"êoª×žG4yBûAXÝVÇAýy™Ã™.]] €ºº¾Mô<Ödzð ÇŽŒifĈŸ— u‘&ï@-0 [êΉp (…[9ôC¡Et‰ÍÝFå¾BBÌÁ,Ë8Ïèµ¶‡µßÌÉÛ<5Ðpˆ6sVB!ž…c[Q°“Ë#á›)*î̸ñxZsþöS ë­ÁÑGÌP˜XŠHÊ[5¾Ëºuu}1R/y.Ú,îÊ[9áˇÀÀX¶Æ0–Ö9Ù¼hTAoÅÎf-µ¸&™-ôÃ0£$ Xó !;ÇÀž¶øÖ×ÜA5…Xp‡ÀÑx\Âß,B"!Õ IDAT`cÉ]¨NÒkº5ޟͰ=—…4Øåf¨8Â\(¡‡IÉÊ4ëØ`FÙ3äY®Þ Ñ¢qr¹ººuu}2 ‚¹mïŠ7¦ŸË0³î11Þȇ¢ô#‡\dà£åœºyl‹ÄÏuzÔÆøX+¢Y¼ì”(Öš#íkºm^1qÝ}œDj[‹¦5e-ë£>”6=2DÚXà)kšX³ÌM¢0=Z¶ G¶y~~ÄlQÿ¶k ƒf›ÁªÆ5©) ®@]]ßL‰øÊ W„%Q×B˜6BÓ«É%Ö±÷I1xÚ[k ,`£ûµ¶Å»`D?^”Ñ$uÓP‡ÂûVïËܻ–buÖAnªÌ8#-'$1 ±3šU‡¼…guvÔPý˜n¯¶öÒ¤²?Tv_ûZÆQ:7 ŸXŸA˜ÁK~ ²8hAt‘‚ïêjÔõõø‡¹þŒ…L½c—ÁÃ&—ü5õ.çc×A2ßéÕ‰ šdÄ`8'D¡1^)ì<ï™(:ÈúÜ:Ì#Á›…t¥e ´Ö@B+ÿBàO µº'òHè•8²CݼQ:ËRv%׿™çèÆk8)’x &¢^¸œ •4¡©ººuu}š£×bf¾ìŒ 0®njô.£†àôˆŒµ"¿¢óeÿ×L,9 è˜J<(NÔ°J1Í5=Òd}« /½…‘åZWDÚšôÑ3Às&‘jšÊ‹$„izhÛk¥ ‘t5õSñž=ZîÎvK‘5Š qˆW>:^PD¨¾€AÏK=}Eé0Ô®®@]_Oeg?£ä†áëƒ5']CaŽGÐ1/X·?-°e hx–2NP>M]yWêglRSeY9ÊÆTº¢zå 5"ÒP«Q,(B·(p-xhduùêÐaxlWW ®®¯†?c‘_Þ†:_0 !5$B¶—Ê mŸ˜Ç¬ñ̘¾WÑör,ÈwÞ9z>ƒ0GvIx„D‰‘ !’ pG¤o`¬íŠnæâ&¢2­%,Ð|Z /¼„9Ée"ØsžÓ°b2–ðPyÂaïþ3ëZyñ²Ìê.Pœ\ 3e]] €ºº¾ ©í^GàðŠI8W—1%ÏáNps1Ϩf‚¹0ÄóâFÜ,Ê…åW%ÎayJH”:_ ÎE’$äVtâœãx˜ªÓØ,þG½`Ę#R¡a¯yøÙlö“”QÞ²9˜ê–ÔÙ¢ñ¡ñN¹ÌCR”1qqhnlÒ`éÔ °®®@]]Ó¹G\?*ŒB±´.{C]þ±~‡šðPash!Øœƒ²rg¨}–Ðòr`„?š¦(•FéÆô6©Zí"5£ï¬S6²!캟¥aS2¬þÆä‡zV ÖPRl6È ¾Ëê‘NFR*Åœv`°J‰¦~÷D”‹{?§®®@]]_ÀYuó\(¬Ašð%go8`¨Ó§ ¦Z†þ†Ý³ä üvê:šôÐ|Œ€~Ä%¿D‘¤Xr5/V™T ù:Ïû(¨Ã±À+«ŸÝW–'œW §j4ËÀ ñãšA¾uè!újWsÔ ê·xÞHÉ«\L™¡Ð„9êàš¹ßÛy‹¿’*ÝëjÔÕÕ0( º;U\/S sûÊ»kæ¨Ø»g§î• Žuu5êêúrÈQ­¬ö;¾c€ŒØdM³Ðc&¾Ž…j5ff6ÐŽéZOqØgà9DÐ \d…ÛÉͦÁ¦™G+=˜!} ¢V)dH ‡tMï‰0²¥’vƒ`ñSõvª‹ ¸[çs¥£$Ì}×V¶7Èà0È늺ºõ%èjòG×Ìjx©™ÿãž%dH¡ÕˆPÔ$}"…šª_;áP Ë2eË]ðšFInÉÈý¤C4)Úr;$!¬´cSd÷éû,.ß¡¶7&@f0ý§¼ 9{Sœ@‘ɶ'`@Ì—”Â<Ÿÿæ¯2²±!©>\ŽÑ6EÚÚ©¨v°H|[Ñ™âñÔÕÕ¨«ëŸ ƒòtðòø .¼®Öá%ê^aLÇÍ~t„–Í Ïê›^žìÉmŸì‘(RQAHé«Hé“»Gý ŸaM€¬óŸµîs’@vp> ’vSÞÅEtˆJ‚ç!H“‹ž>òlüÜ8ô?V`¤é^÷ðú|ãEˆ}QWW ®®/‚>ºÜff¶T9qræäcL¡A>Zôª¥ƒ@ ÅU^"”>Qx<#fT ±"…Ó3¢²%2Q†ªY0Vœ ©îF#<‰ŸEi4ƒ¶QWª"5÷ãÚax$YL$TrâòvGq£qz$¸gŸâ˜¯û17}Ð]‡¡v5êKÐÕ5è ìÂÀC *r,0"´’TK h*‰x`:aý|ÂÍQ%‹Y´Öw0ç¾à¸·qM¬¬€–8Å3W!üË ¤’’%ÝöÇt(ÄèJÛ€3‘*o5¼ñ!濾(B‘Œá~T:õ¥¬Ûu ö ÚÕÕ¨«ë+  û™ë'÷ã< Í¢„•kPÐÃ^cÑãîk© "¸¶UÎJ†Ð¨¦¸Vo2´A1¨ =]‚Œp¼$Cu… teÎ.nY®MÓ>‘2@ £5&Cf!_æ…½tL!D­£q"ŽÛÂHG‹#î×O¶à|WW ®®¯As%c©Vm¥Ì{_ŸRhŠØ_b3êc/8A4;ÛØw ÅœR<ŒN´Ã0‘£~¹¥ [wˆ(1@±¨~L.FéÒ\©KŸ½³@ý„Œ_2ȹ€L{ÊX%•€…}¶V(ÉKét7¿ººuu1"B‹ !» +—(ëf1•Y˜]¬;ƒG3ýÂnAØ-4¬âæ,|fÝ6Š~àp@9 –TÑJrHq"Å4ŽlËÃëÑúçMX3z2ÒÌ¡J` ̳í!@bñ +˜¬®žŠxHM"³->ì L8™Ÿ|껺uu}=ý#ÆïÇ’=6°+L±¾£§Ÿ L•ÃR7á›VàÐÇ+x¤üXB»bþ92.J‰`¼I{;±‰ò6\ì)tLQ!ÁÍOì±_¨gLÊí­Óz/ÿD4§˜ÑÙ.w´âÈÃÎ⦩fŒÆC«< ®jÔÓÕÕ¨«+,‚JÚ7B5J) ¡ 3>BÉ Sê÷ àɺ/#ª€’ây§ KÑB`6dÉŽVa® øŽéA Ñ¥éáŠè™:iĉ°ÓT¼2ÂJÓyªrùNT­ãJPOB‹•¶Ø€HFn¡ ¸U"<ºÿŒvu5êêúB ÄBKÅhóÃ÷K¨Ÿ3’®îÇõ£”‡E„»¨Á÷“ú_…ƒ rkñ­ú\8P†1y¦Ðé…ø@ºÉAõ¬»’‘ V6ïO0Eù7›ººuu} ÷“–kX!ûå‡*€ó˜œ›áóSä~~df÷b6à+uŸ²ºàeØì˜Kà `¯°â lAèrÎÏÉJ%1r ŒF>8fÊŒf¤©Âæµ Ð#z ‘HcÈ8¬y> k©<=[Ö(~Öý°íØò@æd RJBøìFÝP§««PW×5T@ 0A¯Ï]óZ`îÍ”þA0>´¦ˆ`’bçlÃ/ Öd Þ'§º» **§á Ìz–2cÜ=iû„ÏÈݲRþP<:#G41 ­Câ©*ê০2ësBÏ«5-'fb"¡•y6F Oh>•JdKýÔ=¨««PW×?ìœV<Úèa@†Ð?DâƒGÄ„•1ºhƒpÆFŸüE:Y%tBÈøl! R‡C™Ÿ¡3Ž1ƒÐ9µÎtªž1F¼>7èã8ûE³ÕµæÄ¦@á—£Û-ˆ‘/\*„"Qu£’( Ú `æRÜöÔºº¾¡þô%èj ´Vð¸ ;ÙhÍLF®¼±!§ØÇÀªÀÔ¬'γïíÐN&£’²– Ç Øi´g“‹íXN&®3ânólXz(÷BsÊ yæ fÊÍÐkpWÅí–ÑŸ4G¶ÅÇÂŽ¡=[4mÙ`f ;þìIègÏy‚ %ÝJôO®ûb]Íuu5´u…¡+’UG²Ça &E¶X–"BKž¤ñ8§ê©F  ¾!Ì“í£C`*M·â¦Ö„Ù¸ ­ Œ9êµÔ?p?>LL"hŠ–dMÍþ‘ZžkÖ'ÊŸ-ìÃöY#÷c¶;âŒJ§™utòbÔ7ü®®f€ººº´Xt‡<ÿáQ¼­óÄ70ã`®×å­ jA vœU!J*;²Šeù43÷ˆ½Ñ”ÃH/[žÖž>¬> Ù.ƒ‚;ÁOž2ƒs¶<›ÌÃqü[_½"m–Û‡rS9%Dðƒ“íêj¨«ëËI  ÷Ãø’±&y”ȚтŸÏr.Øæ’]·,ôñ+9ù …£Gµ_jßE"ïîRgŽ^JÛ–qèfèìá3,CHFüÅû$ÇëäzVì–>,‹ì”/aˆ f>PÔ“1  #"åCN e·LÓjâTÌLA3Úê#™MLPÔJ7ýÓÕÕ P××׳Êkü³'$¨€J•8Óg8çiê6"n̽ [— ýäù‘¼Ý½ŠïÑÁ1V†ÊYâ ¬ø!ÜÒb€Ä)€–§#dbÀ%; ô˜ñÓöŒ*ûêAjÂÑ^0K\ƒ*Ü«#Ï~}Ä ?¤ü=¢+™JJ/Â3 Q ä´šêj¨««‹ ¢C&/cæ°‚0fÝkaxèCfÁ¸›¾ kËÝ^ã®Ðiè"Å>@Z9FÜãïS{j`Ä0|Vç ¤cDº,gZü3ö5øš3©Y@ªÒòª&«„‡€ò â DgÄÌF5~r©V1æ“é9j›ºººšêê*àNúZmG³àºQ¡‡åºUÓØ0XÄ'É>@öë>…‘¡Kdw*(þhäGÉÀ‹‡™²OºEÏbÌP‹~°6ˆ 5{Z…F «1‡%ÞÌÔñ±‡ÑªŒzøסt˜.&"E×ý˜I 'dçñM†;´"í@)"ÉT <Ê9мOWW ®® LYp4üqÛ ’KŒ_= „žœ‘Å@[×åÝöíi{ÍNèCÙÖ›v‡Em ÔÀþ~èßõgÌ<=$ Ÿ Ž\hÉà' 씥êà”ã((ŸäÑÜÓÔêòîË÷<ÿâiún1Ô, ÀrWW—«nu5è‰ÖÌÓ„uùšV’oí•…f¿Ä›ýÔôOì]i’~Ôˆ}?ed%ϲÖoËѸá%»Š¯'BÈ»ðÄŒ-P¯¬‚ìm‹¯7ìဥ(xHƒÅàÉ0Ì%™=¸áIy×'ï¢úP6 $>äŽ䉟н ZÓØW¸Lvz_Œûâ:QcÏ(”ì¦ÿ#åDCXX nò°¿h$~À®J“@]]ÍuuÙ/Ú§›€La ÌB‹ÃñD‘óxöºbãÿls&²ÌVù̧½Ž3`;{k fûKÄÑŒ¢¤xŒŠ0øn„Ìâ§è—¬Zœ¬*µáÖ|¾Ç‰82àèG¤¢ËT5¶ÕtɃTÍ#Ÿ°2M:h]þÐjŸšhÚ åcó “·’j:¨«PWWó?>ŠÊ²5B‚G}_+)¦a '„<Þ.–o—)üVíÌ”Wñˆ?U?¶Î^Œ'3kí!až0æï`¥ˆxUµ7›‚*¨yy–DИ£Z3Äñ¸dþ×zéò?\ÿ3Õp¯yòуݢ?Â@â0Påd?µrV‚uu}wu ¬«+KÌ»DvLÜHŸÍô»ýq‰W’¢SNsGDKÿäÌ Ô¨&Ç©ïZ]„ˆãUp1¯žŠÉ>Ñdî(àºÍ!=-¥¡Öû¥À²zî}RàõIØZž@Ëph: i S/BýZ!ͧMµ†f#ìi[ êÆ ´GÏ6ÈÑ4í…Í+`;l±öœ^ …®Fë*¬ˆ´®®@]]ß }$Á+y¶Ö¾ f¤Àbüq$xûud¶'à61u8»úyk¾RSi8fE|Œ+þAÚ’ˆ¤ E… u|Ä>sZêù1ÀÅôCü LéÈaU]jAqŽ…^–Ò<Ò K,4§ÐlÀ‡A^dCPŒŒ5¢Ö"!†‰ºº¾½ºÖõíäŒ ë€¦ß]ïž1s`&é3ŒP™!*}æ2™ž&Ò_=÷Dfzú™ö=ѱœKÙÆ÷HàEEð O·!¾ öl„3[J¯šj@?ªý|Ä?ÿÃÞ»®9’ܺ¢„Þÿ™›ç‡2‚ÉHeuõ¬óm‹ô¸G¥»Re'ÄeÿsmÄpA¤ø)6_=kƒ × [Ñ»|¶ ³Ø´áÖq+puff ™™ïd€ö Á³(7K×C6®Åd¯{¶”•Hèü£Wç¶?ãQ~p>ûØŸ‘54Ä Q@¢çР»|zg®dUf€Ì$Ñçê=Ýá:Xi@׋C¬^&äÏ‘ñ8,À5÷@ý‹„Ûÿ•È!#‹-¬”ºH¯•udеÖÓ]ØáBÚ 433hfFXŸ²„ò¢‰vÁI …Ù O‰ÉfV#¡µI¬+m¸Í¡Áãî©­oâžø(Oè§4ƒ‰ªy)U£'ºA-X†Ýóõ†9}®&0‘·¸Ve]˜â`tçëA;-è=¸Ý ÚÇîiÆ@Çh)YOU«üºé„èGVW!éehÜ-6J ™¯ŸYÍ úÉÂçÒŽ^ZKeOcœôÅ Õ.Ö‚Å ~ z>CÚ¬5 Z¬³Ïy92fu/(ÐÕéO—h³U>OéʈÓ¡5¡åÈ÷NË0ÕfY­Ñ·Àç|¬#q9aùBF?¶7`F7‚7JþáQ±=³äïÅš±lÈ÷Ê@~?xÍX·cÏ‘óÌÌ0@33ÿ“¨òÉ.'d¯`¨4ˆ’Å]lâÞžBÿ|Ð@Óâ¨*Ÿ þòù0!BSŽšÞUÔ]˜£uý#ޱ ªƒ4Ñ{cô¾‹Ð¨‹ž²ä)k k,_hö_8‹¡ƒ º^ŸwaFmë‹rª}¿Vt¹4c'+²D:}É{QHÉ‹\/ßn»è‚ßUÜÏÌ š™ù"”$Ï,õuм1é¯àêa€„í±”Ü—)Šd£÷1†+|J[~48fè•R2æK‰ Õ £µòÓk“FW/Xù“D?´ÛqF/îÒŸ…òÓ;úa©O¦V˜t&m]»$ŒwTïÔ6­ml´x#ó„ÂX–vaÖÄ@7¿èž–v#š4‡`æ»'És2ÆSW—‚!S£ß§te¥¢Œƒ}z—\¥ùÕ±ØøÒ¡4ø´(GV-¦wMcN!@¹P>¿†ß1ˆˆ¹Ÿ(C =]ŸGI ë¦ e<­ˆNôm«ŒwX`(dùWQì÷%ös—¶T€z;Ü’à™Ϫ}]rîDm´ÔQ>÷$PÕiÏÌ š™ùJ(2Î{.ªgÈ`(1@¹1«@7ôOB}WWÆ@8ð*§ °Ôa"µ¹1fQ ÂØ‚€Ú¸F¸*àrx­o d”Ô©œ7>@Ãjdfì9‡²Aúã-ôLqz’!ß3$½G¨#Õ9{.‹Öú8ÐRwß` ØxÁffÍÌý’•Ï Õx2¸q°;æœ (eò$¸ŸïQN÷÷â*ïãÖÒ3ÞsAmD‘òÛM‚½ò@E¿"G@u-燎ʀªhAßF¬«(õÁ”\(G¯UPmKÅ>†Wm+‘SvÂC´ðJìÌÆ@a†§çûã異“rɲ§¸ð3þ 43hfæ«W4]£?Š2Ú˜2çZS-± Èq¦¨×ÒŸ‘7Jô2¯ /*|µ\(›_Æ öðÂlQÐel÷eww Ý2‡$ÁŠßa!A?­a\ú.¢l ù-Hc{BEÜ¡éAa†Õ.Võȸ¢¾ ¢™™@33Ã¥B Íû¡]‰Ÿˆ rjÄ´/¢_y‰ï]×^µÕ‚O¼Ÿô@;,ï¾ø¢ã“¢Ã5ZÛÝR…G#…&B¨þQ¡~hÁô˜;Œ]RnÌ)ÃÃýVTÈeh7=ÈÐå -k²âsbŽ×BÆDWa 9åE%MYˆÕFhÉÀUC +3Bcs…O33€ff¾šjÑŸþ‡AD¡R4ZùL’XËíTnH’ë>*«oî陞òVÛmé‚uF0}â(ˆ-[fç×oG…A‡(CN(½&îXD„38ÜpÝÐã‹$¹{Uœæ©L´Ð×eY‡¹Š£º‹;¥I2¨1VÉËߤEÏÌ š™ùz tà,í³Ò‰ßÍK<²䞣‘™*éèŸ !ªª!ˆð7yÐLóìÖ. Ç^LŽi>©ôçÖö½±0ÒŒúLæ/E9mß'2ÎiNôu*œ±¢ÿÉÐÍ%4 Ã³9ßUFÄýì¹ÇýÂ@8u¦šö§Zn„ßÏØêŒÍÌ šôS5@M F®¿HqÅÊýDg{i¿øÔÇuäyê O ÿàÚ–â–WF?,n*+°~ÿe HÊ¿Xærq!FàŽ à…Ú§q·\p€>mp/µœ°ñZK­ï`•Ž«+4DN‰WòÑÂF„ Ò@ÿ¡# f6•¨3€ff¾}B?Ρ‡Úø%ÌPþOþ$, ucÖ4`t>/Òþ`&ÐÐî Ö÷X”´Êõ™¢d 3ËÞxK»½²Câ²t3ÜÏ%„Ù‰ÉF-¡Ö¬º|Ó0á‡òYp‡ÀI@`Ȫ¾È¡µnLðE¢]pBš‹òYyÖoå·q4ï·hGf¡rˆ®ç€¼Ï ˜™43óeaO•S¢o¶d5FÑšxK.©Sôa1°7¸f×£ÿŽ*'áýÁº7WtLÞ¡Ÿ,JŸÆ{溑ÎΫò.ßX¶½TS(ÎD»ÿ**èM)!tt‚%XäÎ2s“÷QLü„*ÈbË…Þ2FTPì Åö>–~¯m®Â ™™@33ßÈUÜSNËRn€b$èÁ: ÐO¦ó€­s!ü´ìê+Ví¸‹“"S–uDR'Dj_1eæ³ïUö`À´+ Pz,N¸ê‹:ͳ@™ú}RX x„z…°O¡ÌÚãN™‚ 1c¥þô¦0Ë%33€ff¾’ʦùšô‡5Œ‘™ôAˆ­ËýŒB„ñŽÇ¹U8óZì3ïsìG'‚§–·s‰«F&zúÄÉ _Ï®~F\0sìE˜ª¡Sf`K!‘Â}nI ÒÕ2ôÁ§wrqOˆŒ$¿ñ¬ ÚÜNÄC'úªòC÷µ©›9£#D‘‘CÿÌÌ šùvÔbîšl³¼òbÊ'ѯs1¯ IDAT?ÞU¿ûÏTÏéJÛû§'ÈêŸH>töƒñM5ËǺ^kWü=:RZÆZ”k*‰²q —ÔXâïOõ¼¹jW`-ôÉ0(u².d+€f…]ë+û‰Ÿºžv'iÛ½SïXêʈ­›ÊÎóÌÌ š™ ôD ­V0ëW^ç —ûHÀ»Üò%õ§;²è¹.È©Bh)\ñ–9/w/,Øcü±hH,r\@SðÀï5ÙÕw_Pcf°f&­¨ôú4é‹^å6_¶Þy½*Êñž]J‰Ò5+hãïøõy Ÿš™433èçý0—ã®lO)ŠhéµÀÓßÚo@ÊuvCWAì@•"ò“ú§Q ù¦ÒJT•z0ÐgÈ„äÿZä€cŽíïµø]ˆâ}*JÄO>ñ=⺨Ú' æé4Ü}:"´HÕ¢³UAÕüRÿÝÌÌ ™™/@?@?îZhšƒoY­X÷öŒó±×Â"ßÅBïü˜õILQˆó^,9Ýà –i¯›¤é¼¥ŠÂ¯UìŠ ;{• Á Zœ«çЕ‚X-bŠŒ•@VôÏ?Mïl¢x¢è+`ž~ ”ºx¯xH År“<7§šñ333hf&1@öýÐé¾_|yÂÖ€µ n Þׂ•Êé¡¢gç6jÙE a€Þ1ªxUIÝi€x㎠ù¿"åÇ›}¥"oÆQMj\,Zîü#èÊ söhGèÓB h$VJ`Z1µíº¯®ÜÞ*ôêȧꯀA‘t¢¡ffÍÌ|;j!{…IÖÿÇú YEEv l:ÐÓ(ŸòFÍ]gÐ*…ÜÃ:g£[ã…õ±Öà¯äÝYöJ¦ªU€¾³¡ÄMüY×90."µ¢’>Éa*¦ ÐÀè›vŒõˆÖ²ŸÖ[Wþa-{M)AÁ$E^bÑG«Žjwd”r4mߘ™43ó…è'¡÷Ê Ù}ÖÏý4ÂgÜc Õ~þìþ²Þê>½C¾E=ÍC²MŒUÒ¥¤q¹¹  è­ËÑv¡Åmø€eõÏ„–…@q J=è–?r„À¯ )ë°¦B×|"ç·à ‡ñ•LÅz‹”Í]^¢36b¸síÐ|cBϬÛð@3€æÌ|5ÒD2' udˆ·¦½+F¿ +\f®!Înz÷sïX»ãòº£¦{/ùGM¯‡“êÛH«›r׎ic'_SNeˆŠ-— ÂV¤?¢Ç=s êì‚?F…?È›äRd»L¥Ý;R:‹ õ 0Þr¦Q½[ ‰Æˆ gÍÌ|3òvÍÕb -ùMw,0è&åç™° z/´N­÷”»¸J‚÷ÔXº¥`"õÞ­[Þ` 0 ã¶ÝÍöÃÆ Îf§ÑÙûÞýŽÕ%oåF,”!~@6Áç4¢Š®Px (#dÇxfzL’©9õAM²4vë̃;ä±k2v¡ì°?3€æÌ|5þÉK­¦>ÿi)÷¦Aº& Ê|R{!ÖÞá§Û1¥s¼`qx5ý¬ IP¨žý[#lÉÒ÷NÓ", ­Îñ$—J4Cv™º.1\]|!nzC+\O¦Vw$jR¡í D‡M%ªÊrІùÜ’±=nn®¢že§go|zb‰ š™43óÍÈRúsOqö³–_4è§=ô pØßÉñs £Ž$P¾ä¬õáû»â$³IƒšWi0PÜ¢·ukûÛ7(Y BñC %3,¶`oy Ñ<ùZ9ZTÄ?¢C6vCuÍ`ÚK *߈̓ʒ1ÂgÞw¦Ú±=CÅCkÁEòⓟÿñÏ šC03ÈN Õùx‡‘*èèé—À„ô×?ª£ í=–rÍê#yz Xº]tÔ™òœ‚ø†.Þ¨‹hæí6R¸c€âÞKú‚ЇB íêêz/~ZèãèC†peCƒŒñȉ( ´ü‰Ó=[ßéî¶ 6(0SBEü´†Þ,fŸ© ™™@33_~ŽÒŸäp¯Í§GøC)Ñþ =Üg!¯ÖP³yøvv§¶zi„£{†>ÞÞ_  ¬g@9(¨xßæ';ÈŸÙq•# Á[°°sCŒý¼‰X³#Ó?»2 0>:2@úÜüuEõEz\j2…\)ôÏbÑØ/¶NbOea\.+Bé™™@33ß €¬ßt¹@žŽ¢•WrJù_Ùov] BÓ%âo¡–¢^Ä@–(‚ƒˆ7" ä+¬ØxùU ÅÖàðÅê$™ó"i6Úàr©CÀÃh‰dÚ™ÝÄ!6WØ¡GãC3FvÉŽ,ÎÚ…míŽk¥Iž/k¡(*H“‚0ò‘Õ²° á89zffÐÌÌ÷2@V”@öýhV ò"c¡M£ ÂgëW¾¶°O÷%_îÚúÎïØ dr} «Ím/í>CÃѱ€ÕVt\aÇËÚn3DN,NÈg°Ô‚ŒS¼ˆtŠ-¬Ðä.["•´ÄøI‰Aºó²Z]vf€‚@RÞ†åA–jÂv ½Óæ‹ÚW-ü÷33€ff¾YÊn.Ë®Tsñ¼R”Φþ¨ô:gu7yÛúŽÕ›•ƒÊ?¿o—ÔfýÄ<-mm)CEb}ÖS[Ê•@9ï“õŽ}.ÄŒÔG€ZâÖÙör^~áÌñˆÈ§¹[Å@‹½:ºÃzôßàzXí׿Þo«¿=¢±Ã,wú¬>T Á@ï_ ¤öÆÏ læËç5‡`æÛñÏ [ò/_§3`rBqn` ”€’=ƒ›×øt®æÐB!ŠxcuABøò‘/ÜCâeÃÞ¹a'¸¿íý×ï|“$ØLÏ~f××"F%î)?¾×^|ÿ­]fÿ–e1Pþ\×­¿Öíû§æÛ[Ï€ðèïûÛzöý¶RÌt4›ˆÏ‚|Õ5Ö÷4N¿Ž33€ff¾œÚà_XdšâÔ»;-_ÜAÍ1Îá|}"nÏwg|T¶"MTpÜ'÷]ú!s<“4;AQ_È7úyƒž úŽ)6êb`TþA][1úýxó Ñ ¿1Ë‚2T¶&}X¬[ã[Êo&Ï ˆaC œU)Òé»Oß<Í|÷Ì lf þ'÷¿`‚~¶WÀ]•Å:G-½Æ^jXl¼ryØÿ«åcû9âíñF.µe>å‡òZm³D®DQºr[·6Ól­•je—[»ý—ÞŠ ®N/ª‡©™ ” !„h¹gÝÛðH¸^ø1|–z_Žïp}/—6lE8;í´ qŠDƒÅ/L²€Ù_6éÎÌ 43ó¿HýhŽñ=ô[¨ƒ8è˜ dÎ ›”LB_ì¹70} DÚµ•Ää&ùЕÃÚÌÅÜlgÓá²h…µkm0¯mfD ¼×a«ãcÿ6¬jÓ÷&l}­{Kö~ƽ%O r"ƒ,ÂÍ š™ÞÇ ‘aRg}ÿ ºÎ}üðØq÷LBÒ§°KD³mév²Üãܛю5¤?.½³»=g§ØÖJ‹Ekåô^áôÂ¥}á 0†2¡Ò¼>À7¬Yq²3$Ú˱ „ ´8Èä6dŸï¢Ù÷ÞH»û& ç}½à(Rì¬!™Øfù|ËìÉf¾}f63ôOÆ4šqèý# òáÁ¢¬>rgÝbhëÃyÿ…æNVê£Ö´ÏCås] ,Ä,ÍÙ&¯Ã Œ•=?ú畤EÍL,Zº ÓxùDGì ”´VaaÛª ¢Ú»2~k4þ@V¡àŸé#&¸'èQáÚÙ„833 ÐÌÌ·Ð?áËý“#ìNš«óÊ>銀eýéª/l-Läd{×ÄÑ®Îêv%0qG,Þ I)ê21%!P¢º+y¾v¡©›Yãö²‡;¯z¡nÁ€n/&`¨Bˆt›à³4¹‡ŸNŸgU[ìuÞÅáqå…íËk»¥ë2%~¿©‹0ZF1¢‹w¸wm˜Ä™™@33Dýä" êÂP$t`~tNyŸ}?À êHß/ŠSÆz'}ÏÇ÷“ëOù©º­Zúðºsæ"Ó9´>Wþa8᥵T–FÉ× ñYr¯BJHԈÄd,çö”HžPø>a†÷µ…½+œ¥?WȪ{uý.„€š¾€ïEe4}¥ÌðµØÌÌ ™)5]0È"ÄæT6Úã§¿bƒÖ9ò˜À(q/àÍõ×ùëŒÎl®0YVtÒ™SΛ.ÿ \`œé,Hëܪ¼ì"—-rÏýÙxíwºQY»,™ËâÄJTÎÊz6I1ì ”œÁ´ ˆk.® »ä?¾„ΤzÞ˜éâs ä á  êÖ1¢jÒ€†ÿ™™43è§et\v@ úçŸËeùs…"$o>y»”%ð ƒÎ'>;•ìqnïô.ÊY.`½´EVЂÉQ` …RØ:2¾ðÑ Ü)„¥ð!e ¼hùUÑU$*©í«éC‚ÒÄa×Â_xd Ÿwøá º¤M•³ž¶Xqdœ~9ò·mf^¿øÁ?33€ffq¸úÀ” :m‚üŸW†UBˆ×°d‰GÆ9Ü”Í\žúämø~ÒdGS¨Hæ[èã‰Bêí*vwøÿ.|á{³““ Ã æEœa-”‘ þGUÑÔ ßKˆ˜P5È–à*´…=×ÒjKvâkäصåŠ=èÞ®ïã“Õï‚Dà߀!ffÍÌúÑõ—´¾gû{ôSŒó7©Â¤G.€'ÑDIèŒ'¯u¦¼!7‘¸Êt8”Y˼‚Ýq‹›¯Èå‹m“çÒ³;¯6KRaNjÇHa„j—"HJ¡ÌP õhÁÏ MXmávßy?±sÒA/è©É PÄ_êehD@3€ff¾yƒ®[ÄFèGÑqáÓç fZʦK\`L|DE·$ÀA$tµ»峄¿Î}ì^u?‘ Iˆ¶·hiz¡½' d÷ž/¥xÎw°T"ª h¢¸û‹ë/˜æI™ÜÞ0@+ËèçÒëĽ$ˆ¾îÅñ‡Xl™30î¾ðEB;33hfæ{I ƒ¨»•ÑýÚQ£§É÷s±9óÉÎx,m¹"h¸C>0k–"lP›= ×Dx׆á–:?´T!ÎÚy… ,\c5Íè|Y¢ “B²&K #¥ ìÈ­ÀÃÌ‹ €ª¨×ŸÃ#ü`WájÂ^…nøÃ…¶×3 ô¥Ça–_33€ff¾ñ,~ö]Ô=Ñ/€é~JŠ ÙÀ(J×q|ini!­Â¦w+ˆÇ:éiX"ˆ"`tÄ@·]Ý—@ªåÔ«•šMWöOéƒ#HoóMõë\;)ß0ˆ|Ê™ßIdlèRèc±+àôûÜQÃÿÌ š™ùft°‘èÙ+2ñ‚¢äò_‹+º-ÖýݽJ| ñ…Éÿu÷÷ôO±¾ ªð—àpÞ` óÓnÍŒZ…éYãCç+j6 Ri7|¶ƒÅò+@RgC¦=*Ì–^S 6_³ŒñÛÄG’  _ïl:,‚q=ç]¾’ÀáfÍ!˜ùv¨ ®ýÊÊ [ô#äÈ߯Åp|ic¢“ä:?ÕþóôöȦNêf¦¼'@[¦á~lµ£oÄS]`òÆš:.Ë·ºî‰Ú(ÁD•QüD 1–ÒWrÆmÆ!ÜÃ⟭߉æ.‘7Kªeµ³©ZÈ+òן0íÌÌ ™™o&ª(¡oPÎ=ºzpŠiî’ ?q¶KwýÈí|TC“Þ èìhmûÚ˜MK׈[9Ó<ýÏ;°ÔŸf‰«Tp ô6ZH4ôiú©­\ ™åvŠbÿrÊZ¥ðæœràôe’¤+‹¥Å>f»õ¢ýâMس0„™™@33_€~4úˆ„¬I‰Æ‘:c §ûFú›ý ¯'`vk ««±“ÿüÀñXWƒJÐgùÞ_ÄÅŠjˆŸ$>ÃST"nqWÑFBÍ¢¨¢Ã··6_oMÎŽ€ÞȈÿ¡CîÙÔ~é mIœ7ÆÙò÷”B7pzŸÄ"ÍÌ š™ùJüSI 5¦—~ŠNÝÞa ÿíöá*WÝê=N0(Cϸ¢Êwúüx‡ g\ø!«(]`I”ÒVX Îße©‹ †/ÐŒËÜéá5^:q„ðµÖŠJ A\1Q”Z6\e´Ò;ëáÙƒ0–¥ ìç |ffÐÌÌÿ"’Ô÷œy ¯Ø‰‘žŸWVîË#â‡ÎtRçEšúgåÝ@ž’'sCÿˆ îæ‚~€Õ„Ú;¶ ¬•Q³ÊÇ5ØGÉ¡{‚MvhPpE33hfæÿAü“úÞ ôi ñ-“ä,üÀ'žÇ?Ü'Ù›@EoTO¬U埴L$)¬‹ÝÎ~ÄC½úÇ( Z¡*SFuu¡‰i.1möZˆé]if¥x£ði—˜ç-êy–ðµïwÛêg3’BGtÏ⎜ œ$?.ºªPKe |ÐÌÌ ™™/@‡€g/÷¸‡>å ìT¢…¿^ym I1mj:×§Ä&múÉÚ«Jœú gï¼î~ýù¢z‰ †Ìð"pC›§Ì UÖçNôàÀÆsYÈ zT–`©”8BúEÂnVƒ Û£…o±¼þVyÕ²ë×ʽ©;è0é¤=µ¥ŽhfЂ™@VaPE?M:í¨Îi·@ý tÏ%0DÓoÿzÿ›¿óƒNÅVÐ"ôñ;=<_Y/Tk×c”sôï»Â¬öAÍz{Æû¯›7µH­ê|@#„àu8™4ßv•Æ_œP@ˆÊhûæ#î™§¸Ì™™@33ßËuð*÷ñ¼è³ ‘@ù…ðW§œFôÈ ¦Ÿžáœ·ªgS çÁ?( Tÿ]ƒÔœå-ÊÁAhî UGç'Ð$¿Uˆ~{î?5e„B­#2 *@¡ïQ‰:öÂÓ lÛßMò“B‹=hfÐÌÌ +ÂçüïnÖFÉÝåË-ªÇmEÿr䨫€>?öþ¸¤kNk©Äñ‹+ñú!„Š«¤ÕÔ‹õöyÔøYÑ ‡ve% ”@}ºp¦/´»¿Þ€ÎÅïfB;‚ŠÀ¨ ž¡­Wæs€BøÎF433hf( /L·( µÍx=åÙ½ÞŒõ·ï›C;¥(~zJÏÛÀÖŽŽCà!.ÊáYÁ´ŒñÊ)^¬…ÿ\ÒgÂ@ÕþDj€•Eˆib¢'ÚàËrŒ¿õÙÍ š™ù^Ôÿ}jµÅÚ€íåVgpß×kÂñsPt×ó7ÐèóM§¸S¾³=0qåÅ‹EµÄ‹J9 Š®âÜŽã±ñ¶’/íèuÖÎi@-%u&º ÅíDFÂ@¶IÃe sï–œVD<ÖÿRb‚ªåIk433hÁÌ—S@Ö¶ZôÀ AHÕwÄ‹®ná%èŸÙÂþ ºÁ=U c÷¼i`Õ_à„˜ÑÏK¹X µ­ï¢CúýŸRÄžK*Ý“ÙKøÎADB?uIŠ•N¸…ÏWýû{1niçÖ¬À†¦[•û1‰e€|óó?ý™™@3Ãõ ÇëE¯§àÔê«É!ö`‚¼q‡ùÿÝvìÄÝ3Jmó'|ϽBK#IÐhB€RñzÆ=OîêК'ó¦D#0žä^r¢I•ªÒ‚lÓ"ë{D †ip­·V[Æ=ûY¥ØÔ3õÃÑᯩ–Ÿ ØÌ ™™a€n t˜© !â~.Œsí»–˜%'‘Á—{ýÇdÏýÝ2®+!=ËâþNÚ£áïÓË F¦°£"Ô$hî¬hŠPUauûý šmÕ¼‡ZÌ=•JÔ xÖ»óLb Ìë¸`–sšmÛã§¢@i_aB ×%××”ÍÌ š™É4ïA&÷Œ„ ØÆh¿¥¾/þ—+X²¸Þq<¿ÿWˆçC’ ¢Öl_ÞáÃúl[ù‚D(â¡DÀUþÜ¢Ø{?\E߸AH”ïbU5Lù)EDª/fçB)Kïã±ú"t!mï —æD_Ð'ÔÑ–*AˆaK›³™™@33ßIù 3”ƒöºî/ßq/@%ô{R}€fÿ?QA'T„nfŸj¿Þ]ê›Cz%4µK€PQÚ8âÇŸÈsØ ý S8\ŽšQW†ièq™m‡ÖûRTua«á¯–Ô%ôqÑá¡dÎЇY¦M™Vê¾±EÙóÿ3€ff,º3oEBï@Å}Fqº|:!×*Ô: ÏaGa8~~‚§!Õ‰ jq­¿@Ý©0M² ž ÂèçãéÛ;Ã^–­gé7WÞ§ÏZÑ‘µ1Ðr%6tÁ–ˆQ!åAsC;ãé€SéSG——L\^ûÙ›~¸™™@33Ã9—ÜŠ‘`M5g]æx/(B«Œ>¼<¼ü+¾§<Ïî3/)>+ê+vÏÜ(''ü>ž* ª6±xçxhK®Ó",X@}*ÇØôO¼ÅüÛ@`Æb?dÂ6Û(Æ%ú–ÂOV 1–§Þ¸8ƒc½%Mz`33€ffL+Q3Å€0‘ð'ëxDm¸%!vr¢Û-e5Ÿð7pç/Ø ¶UK3BÂmë„ É\ùŒ$êæ¸z1œ8•l°"Øf½Ìî4P#R"9P±gÅ:ŠH ¥ð‘·ç‚‡zSX |³÷nôòS…133hf ÿŒâÌÇ78韋–¹á€Xä’cÜŸË‘i„¡–'Vt²˜Ó=OHH‚V´éþ+–Y(^÷ Q@µð§EX%žÖWDÁÏn=DÁ9ýŸFîò‹¯é?? úCA—Äe§.Dûû õYôªø ]ôI¾ð“Þj.Ö0M†~@©ÍÌ|üæÌ ýSþñ÷?|Ý5V`ÐuëTyƒ¥ŽË6oÞUG«qÝþ›&19ËCˆ‹EP>õCÃqÄÿ.| ‰•§¢mϨ…bÜEŸ8Z5† ûJ¤Æ…¯û¡òQ%#Ù½~¬|X4(ú"üÞ›?…•Ü"bë@©/ "»zKØ?!wËÎÌ š™ùnþçL ûsØgõƼ\üÉ›Úé7½^' PLÔBC (ŠÉäέé´‹l‘ñÂsAûÄ/Šà‰‘gß½?â|¬®ß Cò­·k(åÍòþ#¥…!(«.qÙÉæÑÀX‹Ñ¦lffÐÌÌçS¤ßã;€©|à~ òÇ'n R«ÚùY)ËHøn„oP4@[áŒæTÍšgYwţ̈9ª  ýs:n®êd€ÏO‰tDJ X¦¶ä#)¨Ò>Inî(.~ËLû0!T‡0;°™@333î7uâGvæ{¬–mÈÏíOH¤Ö~ÿ¦ºÏX'‹TZÑÒBÔ?éI¸>²I«jhcùKù´u§zmî¿%Ϻ7ѳQк Ãåf™(¥3ÿ£GÖºîXÍâæå3’lfæyÆ?3,Oh”Ñž¤ºÂÿñißîjZ;˜»~†Û³¶Ççê½ZŒŽëùåÙÞ-f™'iÏþÊ?T1 2Å«1¹&îãtv÷ÇèÕ‡8ôŸ¤Òè”@7_岞¯NŒ]ß4W/X4]\‡\“¡A ô¸Œ.G3XùrgfÍÌ|;úáÓ î×(8¤ú|B8ïêçhèOgcÞlʵRf)JøB<œ$,=›p¬N­•hœß5²i<îƒÝø©5[ˆ·¡lÆf-ÃE<©ÄåøEêO³¢”ô§OÙÈh"’Ž$0B]@ð- ßå]WÒ* Û‘ÐôÔÎõïÞ´¼E64VZôJ‚^]iÑEfTÇ:e¨3€fff€†RèožàwíÌÙg ¢éÄôLàPœ©¸çÔrtË~02`X…£°â¥ºÞÅp!Èžµ r†Ah!QOœeé¸ÿîûë’³ÑE¨†áŽÃße¦æ;q­¼Ü™×;ÿƹË}¤‹u× öàÌÌ ™™™ºÁǾ„œ;ñë÷öoðÜNŽ–òˆ$}(öÑÙ0Èâù\„xÚ !æ”ãÆ~{v“Å|c ¤C?í÷Ÿþ€þix t¿!} bdg^ЇûÚW9—q!<ƒ¡7Šñ„YMëÆø>àí—EH·;=bÚÀfÍÌÌüÍüßÐ?øð'IF¯‰€­PÙ¯†–äñ¼ òú–Á`ÈÉ÷í­ w]åÔ^µî¹.¼‘ÄRgûfƒ° Ù\߉f¨øü)bE›'ÝA!¢ÕBƳ×U¶± Ä‚¡½3cyо³odèüUoÒg3Aé[ž™433Óó 4<{ÚN&Œ˜zÜ#Mኃ¢=Ü÷†„Ve­¨–жðÞîÀ·pÊ™àQé®rR Ó3B mñÌæ?@$ÊZ3yæ7úÁ›òõp_/ôq ÆñˆUn÷ÊæöŽ]gªV¾Çâ&ÄÌnÛ¼ !#EH¤:0åîØ^°ùô€ÍÌ š™±ƒÒ¥»hOЏQR‡ÿ+ôóácž>yP 'è“‘€ÀÍÜ7ÖY{â91@N`Ñ 3z!“ hïÈ@ÄvüzÑ?½HGzÍY;ù#'Yt”æì\"h%bB‘n•¢ˆV¨†À)Ú÷ª‹h¤õ*ôÌÌ ™Á@ÿ~ÿù¡ÚåÀÈÂþµèÚihŸò⌺ï.Þ¥€>dÜo/2l_ëª0;=c€ˆþÙ èXiQ½C8äßo|oÁ6lb*ÈIï’ üô–>ñÀ£ „\ËèE}%ë0qæa¥xùÅYj!2Ž-„b:/Êå×½â¿ó?þ™@333÷ðFk.{Ô\ÐÓ6]ƱØ_=íOEÔ®MP ¡IXß&/B6 ÍdTTOÕö¦d &¿ÀPlÄê ìȵ‡ò˜üÔÔbd¤\~GÜtǵ¾†,óYf- Q=û°´æRW<߇Ä@Lñ¹hfÐÌÌLsDÇ%P„³(Z*Ÿ~F$ýg´P¼×0]»&÷àžòpcEó:ÍnÓœP>¨h¯i6Í$ PæLÚoÁ‚áî0ÛÐgñ@ð f‘$Èh/Æ Ðyùe‡´'g®'•z¡Â[þl%qÙ¿(ìgEy’PÓÑùV•þÔÊшŒt×BnffÐÌÌWâœPt …ÚÔc½¢Yý ”³ ôK“¤ §–ŽAK…˜¥´ÃË×½ÎÆNÈÉQB Q7„ ‘æÆéˆ äèó&„Üb·mðNüÓ‘JA”xxy£ãÊ:+(îl¼ì¢Ð뀈¹ã5aæãLs=aAEÐP@3€fffš¿°«Ì£6]Íe¯‘nNð S€ÛÓ«ÿäSxsþms‰År”¸Xõ¼_ïðá­õ 6(I@׫Ü7‡8·JÑ5  ÂÚˆmMtÜ”ÖaÎ"[äc0¤7…¥¾­RèaÙ~wí²|õ`¸‡Ü‡²˜ÀAä9ï½h†È/ ®­Þ«±Ù€ÍÌ šùz¼³ƒâú‚H¤½Ñ,ÀÒJ¤>E»»E?Íî)ŽË¹ÏW¢²;üþe“‚  Rê`–A\ö8$úÙÑuSáÀÒAñåÊEd¤.Ög)£¦¡A=¬tmÿÜv‚_‡(›Cä´  ;ÞK˜a ¯[«Äú\Ÿ@¤Ei¶”ì³›43óݨ'c2¡Ð']N8¨WY¿ì:k¢ÑP7糚L=!ZÄæa%øÐg¡G¸“‰[ƒY„Ž!‰+”bVƒva^¼/9UÎs–´C‚mܳÑòç…Ö{p…8´kžºÑzۧ؃× duýLøÐeA×X—sž0wkÐo§öý­ÅlÚPgÍÌ|5þéô¿(캔—vAVÁÕQýÓlTx§æÞœ>!¾fok½ââà _»»žJ-…ïÞ-œÇô s# èÀÛÞ …²:“@Ôœšs\DÇðØ…ÑŸFTö¾Œâ¤¯óïDöºã)`(áO( ?÷ï~°m‹NxÚ|~!cÝn‰/í¶|˜#,ÚoôÌÌ ™™oA@¸×ÝÜ’@é:S®Võ@[Êk퟼ôµS›÷Z¨´»‘Ø#GQ$?ó9³)26; 7v¹Ó;Ýi4 Òûcö¢S´Cmö`e¢÷,hµ?D½·]F!Ñ„ŒÕÐÄ$eJNýnÀ™@¤Û©Ç£â†;"ŠŽÆ.â‚♿>@óÈbjzùiffÐÌÌ×âŸû¿Î7Âæñe/ŠIŸ^ùdHÓÕ Ó@*‚h™ÈPÖ¿ôî‰ó{å pÉ›7„ñÀ/ð„zœ 6ü64ÇÚ#LŠœL—qc† hÈvÁ tA¶¶o™D"ÇWáØ÷,ÒJJ¿8§¾'Bf¼ tqDë`Ÿƒ•l“º1Kb÷I‚ž™43sû׿òwúÞÖ?%üWdÑÉHÿó, ÎèS:ÜAþæZjaÌYØn’å(ëµ\é®âà¬Ëp: µ“¯qÚ>öÑ; +‚ Õj»Ð+Öa¼ £è ¥ö /&§o­GT±6i ý*´ù*ƒ³«×¬×sHbô ïf ÏT¯…H“=33hfàÏmÙ% 1S˜ž¦ÿö ’‰éW_:Rñwº.Ÿ`IÎã)ÆÒ‰pU2è.NÎŽË.;I¶¡ä¢"tàïE¬^ê¤Ð™Úä–!Õ©Jšé¢”rÍ€ÚÍâ«>q;'u9€ Ä:÷jÛÀœR„¼d åÆx¢zkÎ]µÄÒyéü²D 1÷æ{$Årg!ÎÌ š™ùVeæe?ÕœŽÑÐ<½Púàž¯§÷ª3òrjK%âôw{~÷°ÑÃHo›º¥LæˆìÜÞÜK¦>» Ùa½ï™­áÆ™@f„ˆ»Ý`ŸÅŒí“ãýBE¯…^0¼ìÅHèÂC×Ç–í´yƒ4@áÿ’lƒ¢K°ØŠdRˆE;w< ­<è’ô‘[¢‚0wÙê}¢€ffÍ|;â7Î÷HˆèpôÞ¸íÕ°N†ª *:è8µ5E¦H>žøŽìb‰ü ¹ÐFaH6y‡Ñ(ŒŠ¿ëdž1‚µ@§oÏÓr-vX¶ØôÃôs?Ú/F('I|ôF+KN W…5TÞò不šŽéçºÕŒfãºUßþÖŒa–`3€ff¾œ:P?Ýý–ºi:0Ž<Ÿé8ÇË©ŒbœÃ_ôÆ Š;8nB˜‘ÄÙ‚Š?¾è€±A{ äO„ 0ÞrÓ´E êÓöɹÞÌ9#‘þñ%ˆ/¿Ì2!´Éž‚~êË£þVÜü½ÁNdXòb,k¤{¸ã™¡»àˆ„rüâÎÂf63hfæ‹Ð}"ާ1ëpXuÚݰzÕT ¼Ïá¹Î´ÝP$Pühê r¿ÚIÝ}7`\Õ q¼È¤Ë¹h).YuIL3Ób.rèëÒ¯H}GB;žßJãŸÓ]AµÄ¿/ãÈmÞÈ$m¶ð Ÿž]„¿sž‰9“|žÃ2,)ÒÃoT?B1™‹$$<œÅò33€ff¾á'w¶^ÝÞã¤ê`Åþã:'¹zò1GþavP‡¸u ELbfÖÉ D íL xRŠ3ç±ð}R¨Z¼`^™%*O®äp¸Ž(vCøÒËŸ_å*ôQ4Œòë4d×A fT _‹·*þ‹ï~@êYm‰â²Ôw´pm33€ff¾1âÀ§~¤D µ‹"Ã9çaR—ØÊ›…>Ü’à•Ô«$ ǨWá}·Mü\T‡D(´Èp9'Öf\q&W7ñ½'t´Ä5žrb5XÕŠË—ÒmÁ„ÊhýƒæÖKôš}%Xþ¬«ÁªŠ/ ]ÂmÁ4ש Ý6–o8mÝú Rô…¯b?º{æÝ·ñJ33€ff¾’:’ 8fàÃ+JàXuƒõæ¯Ϙ6;÷ÐSµ¥(Iª5þmü1³hïí]ûÝ7}ð*ù5jŽ ýoà"Âô‡¶Xp×°£éÁð›~ &ÑòYÜ“ÑÏ«"$Ðæk £Ù-ŸéŸæK?çY*㢯ӢûÝ¡´NãýÛaÒÙ*ŸúNyHˆ33€ff¾Õ¿’ßÓ?uí¥`æ”XmS5ðe¡9yEÊsjFpN”ÑbT-Ž­‡~³D\#,'ÌS»·ª d|Ñ ÄA=RMV² â©Îü}÷ât“å—¢³#ýóRгßç†G$Ûþ@Lt¡G¿Hr/Mö.ü7wXCj¯‹p(TÖWp¤‘66ø™™@3€Ì “Ó#ŸzéTžÑ8§<˾m‡ù#'H sQd Ó£9Ã\_+&ìp ¿ç´Þ lƒp‡C5ÑÙn#°•E,ˆÖ›ê[ºU¬;Ò$Í®¢æ…~€Ëá„Ö›…Fþ03deé%[±.!ó²ßui–Ùí h‚KXs(ÍRr‚1W»0å ªG43hff`P…;·§Û }zaK¿a;ç{ÓMæ;ÛY‹ø¬ÉÛ‘ýλ‹˜Äýœ†ûè…ƒXPrÎ"Pô¦…²£ª~ íîÈÏ]mf–ÕÊVˆ™H8|]h6_x%1–äùúIèStËû¾î}V†'b-SNôÖ´oÀätt\JÜN$UÂqõ†­ êé›43óÕÐçé9 ºâq Ò䜻â‡×òr™}CTñ$[¬’K'­ÐVYD]Wö–¤#³ò ~ÿ' |°™!:8p%]£>Ta4×Öø´qCyz/›Û7è!H„ @mºkëAÊWÛh~XÇeˆäà mmu»%œ#¿#±[¹õ¥¾—Ÿ¾3ƒF=33hféùçtîòÎöÉ!ºÕíÈ'Íj}´à¹'ƒ£ïh)¶¨€·ÔÈ‹ª7ÉÕ¬ëÉû/$Éòzl߉ðêžü©;ç4^Å@Ђày1Í#Ø $BÕDƒŽG› p£×våîbóõè!L+«,iH­¡‘|+=:ÃJ¿ÜðÇ é733hf拞<{9ôÝ„ûœ’¥ÑÒ?Ünžbñ*'$‰@ò§R>Ü·¹-`õ!» Ý’Ë_`ó<™ Ê€Gî” L¡“?ú6à7¯lUQj€ßPÇù`Ã:E8©úŒuÓ•™ÑÏ\Œ³D9Ç] ~¡ú6Ö;ƒw¥i ÆxmUÝ%‘ìf33€ff¾™RãU…(-ãs “îÁPËð(ÆöDÀámT³× $6§ú)þà« G2ˆCÁÞw÷ˆô"”;ùЛàË}ï„¶šíúÈ×Ö™™@33߇º„7ÿ{êy®_$Ý>¤é¾¨è¾¶ ¹(åy"^p[£ãC{Á<ÅÏXAí2,c ÊÍÙ(¨e€`g*ê#´8¸ÀLrz éϤb>ªÒ}lg@6uðv4©y£’Rè{B¶ôkcýô*úií¿–&lþç?3hfæk ³®b m rÛEz<?:k“ÆCΔ–d¬^ÿÖŸ¢Kd¹ÿ‹8\¨99ϺYhZè€äÇÌI)A†be‡}<Ú°›íXòš Á@wPZ/ÀÔ—5I8% Æ:*“6‡u—JƒÎµŽ¶î‹oüÞ)KcƒŸ™43ó31è} ì_Tl·V½¥ž›ž©Ò ï'ƫߋ+ ÉúÀµ?,ŽNtPYŸe9tf¡ààò jÕhfªVÚ¢Ÿ†Çª‡ ŒDÍd)ó±+”kÒ™ÓO`‹–å­i‹¢Zo¾iX!—ÐÌw˜b”mÌÌ š™ùbH¥©Ÿ ëù7S8pÞ«ÿRjI íÉÐ7äB2åc‘O%?HÙÓ±? D'K}†>§|¥tŒ¥æê‰ Hýjò¾ ¨®ÆYM.zíc.ä÷ærsù)ô@%APë{v^Æh³™S2 …)LüÌÌ ™=>ðnóˆ-ºYÞDÑ»ÿùöH0Ðr`øÏÛ•ÛÈDŽÊŸ{P%‚w±*Ý$Ý%q—X f3™Ð¥ JoŸÝïFè‡ÛîóǕװÓB.m9Ï|Ÿ-hÔÓEaXJ´2ž÷ûUý¶àÔÛ„FûP43hfæ‹¡OBl\ Ï#©®Ná·¨§²UÞ_.§Öü ¾¹¼ajÔòŨ!€O¢zrRbÖD[Uç«Ôq¿ó6(% •µ›| $õ¡"#›˜5Z§<¾rí•ZŒO$=M |¼0iy¤'uîCäÙf£š433(.¼…*ˆžÈû#þæ7ç!¿¡…ZçtFjûXÞX–6_*‚î’•ôPo¼©:Øóúdn¤]@’ýL`ô=Eý{FwdõׂWi¸Çá×ú[¥P†ªm9R—˜²¸¯ºŒ-rÞQ‹+õ[‚C$=33hfæk±ó©wêÚó‰ðŒÛo¨;¦Ü??‰ß[èQ48dñ¶.Û¹A§=˜¤i(•žþ4[0^5‘)ɤ¦0]ëY#ˆ.¤VÏfe÷ûÁ”&Ù•¥æ„íaÅýw‘”ù{–â“쇿ôø°UÂhs üÌÌ ™™Åÿ¸ÿ€ãù«×1øã§i%Óôðünïs‚ŽŸ<]Öž‹úhÐð@U+­°a÷ÀÿÔì¿P˜ NRURCqí¶÷„ŠèÝwm®­^,7¿æi¿²”éSjRëà$‚›´]\2 ª@¹¢¤Í š™™iká‹y{mþæÜ06-ÿSLjÎÿõ~ ö l5›/“n«ýˆã=þUKàËøf”~€ òD´‹HPè<6µ ³Uâª÷G§ýÔ¨G ´Îå|l¹ÛM¨ÍÿÙi—ÙªˆGœld¹J>J{/ɳ?¯ò8Œ ~ffÐÌ×㞣 >É“‘tËv‹˜î¯õ„f¼}EëôŠ‘’4ú9ÕÔXÄ­0@LÿlE̽({á 2­”ÈÇù½" Ì RYo)ƈÑZôƒ3úA_–¤é…ì°ŸHköîÇ]hj^À3L‰<0ñó.PY/; ÐÌ ™™oA—5æ1s÷Lõá~‡Üоãýãu%;3NsÊóñŽ8zðn3è(§wbÉx'ñ@š ¤ý`Íb(]¬õÝ¢ÅÇ„îdi•åGŠËbóÕ¡#îÇZôsFÙ[h–Ì_|{h€2åX Ë`hÃ*B?!y~sP Ù½@~ffÐÌÌÿ>øyŸN$K.! Ø•;ïàŸ  £Jò£W…ìcô£û$Ÿ ö»c ) Ô×Ã×øgUaßa Ö÷NÜÏá!bé·làJTPSZ¦~÷Ì!%ôƒ[¦ÑÈç¾0OÂ: ¯,N'~\7Õ´o»üð[´tÎÛë’B{øÂúãÌÌ ™™oƒAÔÍ´ÑÝfêôñÓ£ÏÝyº\Å==úi@ÒZÝph ­²É‹ã ‘0‘,ˆ8L°ODìÚ.Î\HTA³›43óÅøÇíG:Ÿ;¨SŒÅ9]¨dº¯{+‚fD´¯r•±úÍJce]lä™ïÙp‚ôÁ‚T@õˆÿŠˆÊ´ àœ h@7RêŸ½É ‰ÇIxT/˜%{šå®ŽÎg'Ï×]ªú×QNî{§æ®µ«ŠÞ/òy™Ã9ÿp-×ìò5ˆÚöÆ@33€ff ý5·,ž>c ÅÆ+~lE?"ò÷ô»—‹'0µQs²¶@1ëZ®Í‚.Â#±}üŒ~À½Y uòÊ÷(¥ h¨Þ­Ä[7èÇq“YbÅ,­Ô úÉaŒ}ìsù%erçüÏúJ5 ¹Oè¿´&óÕfaúŠ˜…hþg?3hffæ1jw^§E˜þ±"N. P\#HHQ’C‡Èèm®Så~œb…{c)y5 Ð. ¥thN“6Ë ©¢®IlSi’‚‚šD³Äw©‚~(öHaÆwµ®óý„~N¿J5®BÑ=-Ä&yaƒ,‰6ム©C@½:OýªÔØ*蕳8ÿ£Ÿ43óõÓÆúÇ{UëzCÕ¦Nìg´& IDATºŸBò8ýØAŸÛ-X3«$tÕ_¢ƒ?™EC躼óv£X$„ä3CW¬*¨¡«±HŒéA L W”[kb¡¥.‹~õU2Ÿ…b²žµÂ-¢/ŠuÏdÍJ¬O–-Ðm^ïoŸÒW¸!yÝß=ðA͆DZÁÏ š™ôÓ(·+¬.>º@?.ºèruy>Ÿ~ä-˜·Ÿ&Nw×ë`Å ÇŽ&JC§…Ö9¡°‹…RhC eX .rË㊠Ê;òRùÎŒŠæÈ¡~ºªæQÜ—Þ‘¾Ç$€ÆÍ3¤ ã¢cš‡Dð÷\¼eÎ0¤I üÆC×–_×â >+°™@3337,Nõ±'ÛzŸNO{.}BWMüèeÞÝî¥Ï{k´¶ë<¹Rd }P¨IY¨°5ì:oü_ÖÕ_œÑObz\¯I—•|)­`ª¸–ÅXY¡1¯T¬O¾}M|úF³hÃ#¹òNøÙñ‹×¡&TX£ûÁ¢Ž’;l4Ð33€fîÜc™ú£”S¯É8)Á ^Ö“R ¥¬ ·wxülX¶g—ŠŸÌa øâ„LS}úšFMÖh’?¢0Õ!’̦“Ô÷3òÃùvé²îÚ#Ù¢}¨½ÿÝévñÎob(~ýV*ô{ïuÁ'»6ŸÛ5Á@ƒ€fÍÌ|/ø¹-½ÙaíçåAÆâ £:÷{J¢Ð†QEt>%o–Á|5 ,0¤o´—óvH`&èC‘E¸ äQx—3ú‰Í—.¹DÄW/V–(ÖÚË݉’>à¥ÚßcI×tf‚6qù†Ñ€q¹À6*²´íc×IÆòÉGø7¨qffÐÌÌ¡V•ÜÞáã=¼ÔüüÈúîBU=P~]>½ïZSÈ)Jîw´†ò'f§>Y;Sž8B Ib}Ä8ÕÑ3^@Ë‘Ð9ä;ß‚ܰE°>ÙyNÅaòÎê‘/–KG6"Ýt=#¹Ã4ó§#‡†š433èçŒ~XtÓ ?+†ÈØ¥Ë/%„ú¶`vIùp?°üžŽYã0–õlÁV1‚1+ä!ÞZ\×Eëf²ùë»­àhNaœ™43óÅð‡!D–üT´Ñ2@-îÑu•µž/k€µÜߤ?{Rˆ5a®Â(»H {†|4þ°M¥=¬Ò?¸A?x€~ˆí.ì3åóéåS®!:†éÃåóë°è‡ëÀŒÝ[›Ür „Fä:Ú… :DKEöø]4633hfæ«É¯¥=ú92@ž PCú0Ó€¼¾LiþêÞXýHû,îÄØEüøòIǨßà ³¹[ %ãT3óKÎîx O@çž‹Êû,%†Nˆ§'™üôä!Œm*ƒŸtµœ®<ïKÙ¼ôìÊm¦Ï|ç%úqER33€ff†’ÿú!ù!ÌÐ?xÝ]kÞuŸå^°N)Cõž÷¹MsY'ÓËû®¬Ïµ³cÍ Jì"°9R,X‰{¼DûÄÂ謉þƒð¥îø'è§H褸nj˽Œ _—IOšÁÄ&f¤žŽ¤Dn: ¼5±•ÍÌ š™ôãZê¥úc3®j /OuØyY 0tÉtÖâ÷“ÈÚpéb†ZÏ®OØUîžÎíÃaŠú'YæO¨B<Ã@–ÚOqŒºÜXF(O`¾c‡}VûIô+¦Ê»6†M†t –—&w¤Ë¦Öˆ=€8øÄú|xÜY}óÐçoìö A?M©=¿°÷ˆ ³^¸Ý×k7œ’­ÏPö_!"¸f³ý¼Æ0hffÐÌÌC A&•—±³èh2Ósßqá ·ä=>¥R߯Åök·),ÚÀ“¼Xe/þœŸy†`œw6ž+ÝM7:Âî8—ŸNçûã†û>@ëàG/Ù³lï¤6çcK§cÛõµ,aaàr‰b<´‡Cƒ~€gfÍÌüïßDÝèÀéøAÔÐJ5ðÐëȨ‹ž§W=Ÿ†ÐÏ>ÜêlôT rºæ/1ÐûÅx‰UmþŸ` ¿¸ÿGú§s¼D?ŒIåK“ØB£`Ÿ%Ý!_$YF¬3—ï ç0¸ç][˜í“ÝlffÐÌÌ «’¦oºº8Kq…‰Ôñ"¯Îz¥ºWñÆc€@\z Ðî£^ð‹2‰MTtòˆ<+÷wû0ÐopÒyY¦šhürQlá¦vÞ?9A[9‰XõÙfŠÈêŸýÎÜk­˜élV`3€ff¾˜*µ\ÉŠ^ÑúlÉŽ%O&TÙ£WŠa¾å™jRQ,6öfæ’ƒ˜ï³4õŸÓ#çÂ]¥ù¹ÜÜ(7•Í~©22yHiœäÏ8q<ÍŽÉF¸yñg¹-ë–Å÷…è/å,Ž JE)61@ë%Ù 6uð33€f†r?¡LÌtI=9ÂGƒòZñ~Óü•n’Ä领NaÈðäǶ YßFZiúà@I"L'òO@ED?gõÏï0T¹ä?D?§ût©Šwö~اdI±Ä3hÍÀŨCö^Æ!Þ ýd“—\}òÍÌ šC03 ÐøÉ‰Ìý=êí]UtÖ•›šê ×`x1—Š(ÍBAZ2Âw܉QÞñ;øe®†^ø+€ã?íÌ84cÐîèŸ{“<÷¸’Ø ÏÞ®ëO„r¶8zíɰ¾jC‰æ) ý w*6Â.Œ™™@33×Iöôñ„izNµkÞ½%{ò= ð²¾hÞ4WÏr ži{ÔÎÇ‹ŸôlàB Ž—Îp¥%|â\Žrå_͇Qwa}ð’ŠùnF{¯è·?øÀ>¸ø©ùbwR¤çB®‹¦¯oã~ø¨°¥¶·pŠ‘™LÇ̸‡Ã& zfÐÌÌ—@°QOƒòcs¢OnøªWjΡJÚD"K-$@⇰ W< HáìÕðEÜÏ›6²­›Í1ƒ•ªè§Ò8Âg<’ý’ ùfÏv!ä”çŠ`*'Ô>”Ñc )BEŒóNf²]Wk[ü¼¾Àý;@Ñ>òŒ"ðB,/—‰ÌžJã}‚ gfÍÌäÐkZ·Ð'°JÞnÝïGsbމ‹ Ž †"„´+ x롹«|­DÔvï ª0·5¹ÿÁ+ç>#s>IìTÙநõ„‡ ’õá@ë*ϘmÇ0ƒ“ WU¢ÙÝÈä!±ù"×b,†‰?œ¶(ªè™™@33ߊÐç ö÷ÖŒ¡Ïu©G@]T OƒuŠºm›Zƒ½Í)þ‡`ïóªµ+°E„´8«¡Ù(˜æ‚[ñÒÿ…¡Ÿj.N·*Á#Šfôxèj@ÝE÷õÏØ$æVøˆ¹QÛZPm ˜Y»Ó+×GjbkIñ‡«JŒëÃl<`3€æÌ|5ê L×Ìu¤šû·¬OótÝÚ«j€¬¯ª×O±Ó_Ô¿ô"t7 Ä=÷Ü)˜}íjâ¨ÅæÅ‰m ô³õC0Üb ¿e_*SQŽV¥¢ó¨vU«ÃŒë;ðîyÝü/¾-ÅÓ¡€ž¢¢e!¨ÌtKq°ÛÞwÏ™¢ŸMåpjFB»4c· f¹4?ãh€fÍ!˜ùz ÔÚOJç¸O£×)üNão¯6úžõÉêñ½7çx0þP±±©Ë}?  dNøƒ¨:!0r? ‰ÖIÕaà·a°Ov0+dÒ úÜ0= r¡Ã©º …ô¸BCÊÿ?*âAEy&6ö(÷Òª°¥D$ЛçÉHHŸîTƾ°H—–è ™™@33ߊ~êÚ«F0»“¼ 0,uÂÔxÝ‚H#ÓàÃfkÁÅÖÖk¡˜%vgÝÕÝvo¸Ü bnÜ ¸Çš ù-8†-ôEn²ÆöèìûÉM•¯’%N±Ê†<´µ£˜ xZW™` ~.aä0§BõZ.ú”h°A)(æ`?I“!¾¿ „üªß_ “H33€ff¾µè‡PQ£ êÚÚ½=-¦¹Ù‘eôÃ:óÙÊ™âpÝT%ÅÎ[n=N2 ‹nðuÂÜíû4Ïn2'úå2kâj¥ÐvìÃ"!ÅmQtgÅ|NRöl<´QO€ 0 a”6h ƒê/›T•ˆ^ÛÛ\ê.¶tgÂoÅ6]œ±Lò09š,`fÍÌ|5tGü$½NùÁëÞÊŸØé ªjè§èçtªÍ+§w»Br‡{’m’aǯ‡lî‡×pÅÎA‹ñÏÉvxó¸Û…¡\,æ.Iµ†ªu¡Q:J›/Ce‚”JÄZ‘„f[û•ûÏ‹ ³-©Jøi ¼H¯j¨D+3›Í×ÌÌ ™3kõËÊêèîQԠрž|cÀˆß£Ÿó\ÕfTš¸ˆÝA®ñ>Œ\ \á(=tj½šª §síçÓð}ó“»ÉNŠìZÍ““1€¡…’,©H-Ä7*f}øÒößí¬Dhã?ÃÛNO»ÎLÃgf%È"שYMÎÌ š™ùJü°'°K>§hºò°&³VHdi½õ ýüzQáTŠÓA±'«Y{¶ôÅö œqyUWú#úÇš¢Ñ¤9þx7S‡ºò7~Dõcº[T.ÇØ$ ÕÏóМKHv™­twfáîZO Pù‘µà°ç @g 63hfækÐ=ñ“ÐMtáñV£Ty±°¦é6ýþ¾a 7`øå3Z®±+_zoÏ8F¸ÇV¼¹ùA÷E1©ÃÚöÖÔL*¢!Ž@TXù^í‡äuXI¢ ç/'çHJüŽ®Ük0i6]ŸÇ ?ÑïeæJk/ˆf} ™™@3ߎ€ú¿²rÙ´4¾,ªÜÏPÇ?²;ìºÃ@ E½“ëé¹l¸Ô<¿E´‰X Ù?’ˆøhóU«ºÌ’®F P¹2m¾RÃEuêÎ+H"Nj‚MX%~K=ÐÇ·ŒœUÊ!“b´2@Ñc*a(Õ¯µåԣę#B“§933hfæ‹ðOåu(q§5[ÖñTJ‰ÑÐ_ŸcTüÊêåãJµÕºæ“1)]ñ–ýH64£"1aé~öù=U~¹VŠáý5¨,ŽÜ¼« 5#êæ#R(¯ÁŒ7i–{4M6w¬¿I³ zl¡:`îvþଠBT…eJ’lóœÜýKêpffÐÌÌÿãiìrMýI!‡ýpy¡xüHÿäãËx•oã¿¿ç6ÒJ~hê=> ]Õ@éAl±NŸ¥Œi¡Me WÊç5–eU†@Ú½ž0P6beßVçò: º£X …=âÿê÷qˆœàx7»o3üŠnÒ¾Ôû& jââSŽ,:76.õMy"ŽffÍÌ|)JÉËäØRÕŽk»KBsCЄ‡B–u¹´~`A|vmÒs‰Ògö­|›Ït˜’==÷Ób„‚ üÖÙžè+µZ ŸeE×ÓÝOXš"p¦e×Úu $Rc8Õv±qéºb¥A½ô¦ÖìÎü…ö=Sý:*¡+ôÂ÷TÉskò"ÐÃ`0åÔàX+ÅMmÊçü¼H{ÐPF¿a’#Q‚h] ¦z4ÓÆù™™@33ߊ€Òf@5=^þo–Aò/έ“š èùTéǽ>¾¬üõ¿†è$ %àÂᄽr‰+ÄÓœˆhœím.O}ÛW¼\3 + ¢Þ.³FîS0@ŸÞᆵ–¥YaÙjýÅù«ÓV‹«ê"¤ÐK¦¼lu‹¢Ö —ßÁT’* ¾@´œˆa€fÍÌ|; T.t§³­æQeó:ïxœÌ»®Hæ!ÿ„@RçLZŠ„9xƒƒ|þ>xÌzQ‹ÇsNV@³OÍPÑO²ª#ý`UÕ¼»K{{—^™Âã%ô­Ê~ ±?8‘?8þšùNÚ^yÚTüeŽ xÓi×*Õ¶¦9‘t‡`(ŽKð‘ÓDhËrbÿH/½2•’Ô,~rV”3)ŽÚ†àÐçìkgܣɄ¯d5O¢m :V Ü š¨hë¼ï…òÁ,¾¡Ž¤!½ÐøléóMÕWaýºåªyïîwOÈÏ™™@33ÿÃóyÈYN,~@ (ì?<]ítö+M i™Ÿ-·S/z¡Vû§â•w´3Ä¡žø1¯ÃÊ•iV[Zjšw`Š ŠÕ)C m=E®ÉÅEËíåïtm¿´å¾³Þ³?Ê ¢ûUòò»³Ñ²xo33€æÌÌ$$„Fè’›DÝË6D¤'Ô’ Ú¬£=U‚þ¹c@¤ï˶U ¼‡ãç2ö"œ³U/X2‚uêîLµÏDZ¡•ÉÌ´é¯È“âLûÔ„݇qÃŒýñrÏ»àµ|mAÀÆè³ƒffÍÌ|êÉÀ„O(xò õüß‹E>ò5üÚMÖ¡Û•#•ªùÑõî܇ ~ˆ RŒÂƧ {N`¨P\A¤©¥ÀkÿËÞÿæ¼æý¯Œ{,1C)¨lÄ9ݦ¬zCŸ}/…AèÐÏ=ÊÉάn†n+»oEÚhõ91mʧtt5ô¥=fýZÞWöФKnîî.-º7PÚ~póÌÌ ™™ÿu¨¶èGt#õ? úivJÖjÒ_åóªÊóé=ï²üò¢jßÅ2* Òr(%ž9ã“0²“CçÀ:IôFHKý: [I‰)ïÇPí]’î³ÿm™¨K¸øtïïÑo£”‰˜Ã‰¸yçe(ä…®[ÝíúÞiùI%f§¸„Á@33€ff2JG–&ä 7)Îlå26)¯RγþèDj$Bæ~j\?a€ò™¾ÒWl‰7Üì¸^-aó ™2@[ôŠàÀS¯(ô‚DB×^Œk“B ͧ½eæB¥¼fjÊm€ç¾_ÁÏTªÆ7äYˆÕÃ^0¨Ýƒ®ûúFÁL%ñSû€ffÍÌJDcӳܧiÝŸGô#{"Zž fq\a+„-­à~´0PÓršƒæ¥WÃÿÖáUØ+Ü^oè$Òf€^û2IõÍšxÒu½›Ïì&åûPÿVqOÙ{±/ ÌºÚyæЬfÇÛx·*Û4~ŽKä™êÉ¥ÁA33€f)¸á“hjÓLXHþÕm\G@Ç©õV ­ô'd“ž ƒ\,D=’òÁ1k0rƒé‹yUý4¤Ðòz½ öz] Ðë"˜.:xÁÈ ß‰~P;ï? †« &ù øPÞ‘?pîÉ0…ÑL¹ƒóBÔ¨C¼Oæ˜òo‚ù` ™@33_;»“¡¢Å>]$Nϸ¡No‹þäë7^æwñ8¡£ ¼y–Tª:Ýüå4ÊŸ½Èz,ôzmèGìEØézÔK8%»AWÌ[2pÛI[é°ìàbp)HÇ×Q'ÒÇô¬[½=ýXCBÅ­$‚޷3rõÃÛ Wu ÏšÛEGÐý *=Æ@®÷Óð•ì^bæ i‡oõÏÒ%»Ø«UJuÁ?)ÙòÐ_›r–® E¦"ær¨ËÚ+®å-c3{ŒwòòË ÈZ¤ÐUJ433hfI°ß IDATæ+‡’ˆ㨬C¢ UÇX¦%rå|NÍÓº/]{¼¼…A|“y¿#³¢¯.¥ÕtÄJ™øØ™Z.÷—$"òÑ{½Zï|Çÿäâ (ô9÷Ï6ëƒÎÙŠ›Ë3æ”6^Bÿð}Üþä…ØÚǘƶöGï ”®AA3€ff¾š*è'çÍdÊ -$›3QËXéͺªî9Ÿ¬23$XÇIÜì•öÊLƒÜnÒ+$jŠ^s$¢UˆT=ÚlñÊ®SvPû\šP 5Ë›.zƒ~ªÙÜrÄ’*§ë äÙ_AE=FÂdÚv @ò¯¾þÔmWµ¥%…ÉÃffÍÌ|-ô".ãÕÑëþ%w'…ÐGM4à ë6Óɺ ê)å~’bÅœÏä²Ó±Œ® LäË¥(¾–žräáA¿Z¥Ð[ÝíØqÑ!–’÷vÇ•š¾ºCëùǨˆ§ò= ña³vÏe vLZö—òŸ ƒN 4kîzhS™43ó- P£ä}ÒåÙEýò•®Ýô‚¸«9@ÍΫWytinÆÈ´U•÷kŒ1‰i¬à 1¶Àd–ÜaÆIЉ‹S²õŒÓº­ Ÿt0A‡ÂÈK‡“ O;3ìIâ«°'ao!ýúÓâ¨NôÃÐGò©gfÍÌ|-Ô)O¬¿ÞZF(ÙÄ †s\´uÕ£~‚ ÒuktYÓQ×ÓJЪ«Sõ/2ÉÒ Œ]`MJe’ÿl|µÛæ/{·Âò —úô=¢é‚º»ï˜e϶‘›'ß{Zm¥5—Ykت9ˆö #¨[‡íW«/Äeò¡Hš™433èÖvô:¯Âº«II]\ñesÓÀ‹JO4éèŸLó0 "Úˆ¢ƒ\ƒ‚ì¾4£‡¨Èˆ`°ãž_ Ëš”^zñAÄac®kD>æ ÊœÊéQ-ܱfvò³Ûäóa_–a–13N˜43hfæ›:ô:à!Ó¸ã™éBL‹4´¢!-Á<]ŒKwqÏ%Hƒ‰«Ñ‘@M¨´¼¼X£mp¤)ÚŒ‚^/À8(ì 8õË›†ìã³W^ÍŸölóÕ”€xöy]]õŠ ‹òú+m¾LɽƒÝ­º~´,3k„A¢Ë–O233hfæK'—.ÔR‡Xßœ¸"k}Úµ@>”»="ÁÍqj‡{ ‘Å ƒ’7>žîÖùC{È^r0å@¾b“ŘÑRŠ¯Äž Æ=Þ2?)اÿ“ÿÛÛ»ä^r­õ^eëe§EX…AÖnÊ*²•dË H fc›43óÍ ÷o6è• Ú¯×GYt­Ñ"Ñ‹Ei‹9ïRi\tÐ^ ‚'¾$ésèÏ™%q'²œ_½RY]„5µ¦Æ;-®·à-X¦žžp? +{g{å{¬0:Œ<ì¤æ±"êE>åA§ûßɃŽh( «³°‰®{ÐÌ ™™¯@aSj Ϋ9£#„ÞiÈÖÄLË0T D8¢9…kâ!‘Xmî~&:öù_5Ô5@¨Û…EG¨*˜Hãk*2J™×«ˆÆ%gHœ-ž8ßp@?å0º†õ¬¬³,Q4Öì·2 yM«ï±#‚©âhëµ?Öƒì˜R£q£%§ÛÌÌ ™™of€½´ÇS©‹Wɱ9G#æ¨hÓ, 0‚8Ÿ¿é$î -§qA4%ˆ~lªË“j¿ºp@Ö8}¤RûÊITúe¥K¶p?ªoF{ÑWž3ÚC(?¥Æ«({)"9TZx›qد¯¬%jz³uÔŽµäYyæVž+ ¼m ™@33€(¤æ•8¡‚~^ÂÝdôÃÿ22•÷¦0ú+zöéZ§=½g’#ÿX¨MˆÎ™@û=1\«R Ô"k H,AÐf¢"‡ðb8ÕŶxñpN×*Ó¢wV a,Š\eêGCúŠ`þsGüÜT6~±’ÝÄ uk­›tꦶÌo433hf Lý¼’èu«Œ~E>âK ËÕ_ â4|XòH*t"̪Ø9Á µÈ $RMHƒ~:¶Àmo;” €“ÞÅ_e­'eå:ñÐ +fÎnð6þ ÍÝ¿ºU=­ýÞÃ}“RÍaD€ëŸzfÐÌÌ7 0ây ûk˜0C¯ )ݸ4¤Rkzß fÖâÑcŸ®,Âçu–yÍ;6’B×H¡6oú ,˜É9G±ŒL$¼øþœ&ɨFÖzYê!jÑVÜ‹}Ž°Ý¢¿¨@teî‰#¦ùãnöçYy音%ì`骞 w,[ØLŸÔÂgðÏÌÌ ™™ÍIYÕ¢„"³XX Ò ½^ç-ØC ´Øï³ìÀª›§éÇh“oڰĤ{4…^LåÔÁÎ⟂‚6 ¶.?® !Zðê]uÜÊ‘,:ŽnÈ6:` 7úùó§AE~‹œ˜¦Q@Û©x̬CBÙ䞊ÌRdÂH gfÍ|õ0ßÃôÏf†Š-ž¨¢¦à¼FB ²Z §&'¯¤P :ؾÌjú‹'Ý&MË"LI 'PŠ]®ÑFò9¹ma›×ËŒƒàËMld¸ÆšIÉ“üýt'¥‹Snä†AD-hãz­„~þt(ÈoŒóÅÖº·Lû7DÓã~(03«Ò¯†43hÁÌw3@H$ÐÂ9¯Íý¨-þUØ *é¦ÁÇ=ú¦ìœ O~2'Ôj€Rñ…[)Çèö_ž‚v’C¾K4ÊÆ0&ƒš›¨(-£$k Jùõ°÷Û®ó; ~^ö\/8 m b©[”Y´g ?m³…Ut³ÖÊêæDü42ø"éRâkbgfÍ :°>~ ‰JúÀÙ©µ>£7è'Ÿ¨œYŪ^ê¬Iûñ¦¬ԇeT aÍ L©A,   WsÀ¬Ù¾It Ú÷àë®û_™ŠühoÉ6§b´hÑJˆçpCÝ–ì®UûSÞ®ÄîœÜíÞ„$Ó¿§v@3€ff¾±ˆÌ_I ݸÃȺ=˜åbÔ €4è\–*1h‹ãÞa K:hëÎ^Ò’MÜR–S½¾©T]¡|ÐõYaŠk^¯—p_IîƒsbdŠPºìhîþF@pó}¡ +?¹šÅQ¬’úäó?’ f½ÕFùœõ_ ‰­d&ÌÌ šC0óÕHàNMz¥5XÙˆq?Ø‹Ÿ—(¡ýP!6Nî ¹'<ôUú¨&Š*:oQìˆ~ #e%fQêF?” ‡ðôôXˆ~ÌÝßÏò¾°Ú;ü½k€Pz²Îñ¦Ål¼“µ–}B?Mâa²±§bÖìl÷¦.o¶RúQúÖË6sffÐÌÌN,»dÑ%¢Ÿ×+e¤Ö°h÷<ˆÂÞD17ÖŠ ï5@úó¸Â;”W %¹÷ÆçzK9J‹®gYÒ¼V`qç>&[rL|ó<ææ]hà­Ž^ðño3{ÓC7!ùìú¹™ #Hóý:ÆìÞ,zuf€¬ö˜$0Ôb^Ë€vffÐÌÌ÷1@/õ´¿T÷£è§Á@H ñ¯R„nm7ª/äÍN¦¢}ü`–\ìÞÔYxæŒ2²j´×h¥z5-Ji¼®ù h?†»Þ}¾#„_÷ð7ÙãþA×…7B\B ÃûJ}çoQçôO<Šb‰ C1Ó‚ÙÖ¶WÔ/;g(ÎèGÛÄÍÌ šùzˆ{Þ_R÷^šÁ^] ØK R{Ȭkk .Q.\<Çû 7)oz¬£MóäWO¥`hó‰0+T *Åu}Î]¦Àg¤oIŸÕË_ÚŸ‚ÌÜý¢‚.Q4.¶g3BÊ]_ÄuP-DåÓ'ô“tîÉxŸ=e½Èî’ ²ÒƒÁ›µ¨ðãÌÌ ™™/@x›àU!¤‰ÐÀ /{!ÝÐGBSرe ö|Þ‡"2³âp$ð:ë½3 Ás. -¶0]%ÒãÓ*zrˆr}¤PCXŽ ˜ÍØö7 êGX³ëSƒ¯u˜a8,JiÆ7{„ö3óQÑÌîFtc 3^n•to·¤®Ì•EXÙT&¶nÐÌ ™™/ž—t¡ T©®Žï×ëu_†>°¨G]¹7lõ¶ª›iR·r^{…ëD¸ŠºÞ $!’ Jyeÿ•»áÝ­€0SŠç!*BªZ`¤”ZëÀZ“ú¦Ò­oV躰‘Þ«2s’ ¡.WQv¤ÙQ(pQäKwMÖ)JÉ­.*ósE£åîƒ{ffÍÌÐ)MËMy#¦E¨/9Ÿ@t`p¿¤ö!¡r„òMA*Ð¥ð}ÿ°Ðm kz Q?Ñeqᤦ&!Ÿ8XÊ ×Òp5jÄB=ïEˆ©Ju`åŠÍ…-ZÈèÀ ÅY;¯¿Ö2Ìöòl©©ÉG}PeËÅ>Ì(eÀzdm—õèÇ’gì^33€ffnP“Þ“ã_Yàóº=¸¤EÆ@‹jŠÒ×™˜¨ GõP5Œgxä»°ýr†¿5 øf‰Þë4£}™5!‹¥>!8#ÐÏ$½ˆ¼H> úž$>@éŸF§dfx¹ý13¬­â•%}DpNjaPÄ.¢+™ðîþ\éµE!%ª¬\uº/¨}så8ÍÌÌ šùîyNVôê±ô$ÔôÿµwmÛ­c9ލÿÿææ×Ÿë3¸Y2Ò¬üT¨Ý“Ù©é!vkkÐÖÖŸ@·1ý+B(?1ƒ¤|î<výô-°øÅP‰ÒaW*€N;–¤fqy‹¡AxÃJ ÈÁ ¦¢¼¯^à hëù-yåS&¨HGø[ÍN‰(` °‡Ï ÑϹ3À™º)SAp(áÇuÉÍ;Ò¡ SAšS˜{DœŽöð™—•mm-ÚZ„â]È3+_X'ÁNC=üÿÅÿGœ*²çú€ôé^ÊÒ÷¤ôÇa *Ä™€pÑ1Ó¡¯©çÚü š¶Î­óªSVÌöÔiJçÆ :ÈÔ×£4+²EÒÌ .?ó0 æžxnM¿>¨f(ýÑ|ÖÃ>Ôч2ËÊ£¢þYnS…V7üçø-#÷öù–™ñÙù×ÖÖ ­¿€þ‘<âJÔ y7ªGMþù²0@Ž~’·qA;I 0Ï8ºk[ðŽ#$OшH^;GÙ“LdŽƒ )ˆbÿý€)?·Žl>ñù•7ß} ®%:AòT{g‹ñàçCÿ@×#jH 1gi(â[q¢HµÑVúDºKÑ™¦†mŠsåiß»ÙZ?RNÔíÿî·¶m-bx#"”uuÀAʪ0Õ·ü§œ}”modmse”Éž™s>IÍÒÐÙ_Ñ ¯ð#ËH¼åû¥‡À’•Ø]òcî=O@BÍ~è²P eŽDˆˆö½0¥;àÇTÐôïçƒ>r¨ sçb4f:su.ÈcÈν]E¹Ýt]àU²aµm`ƒümH1°ùó¡Ïºó­­@[[˜ªúÛÓ¢Ȥ˜’L­9ÿ£¯èo †1üïU­N¹`h2è;“€™"êÌ‘jß<×[‘E$•×Iß#q2Þûr›ª^^Eµ7Œ‰fpG ^ú™7¿2fRRI©ÔáÏBHC/cB§ˆ4‘A$Dt‰|iÏqñ‘¯$ìjb-Ú ŒœáîÃom-ÚÚ)6=ìМó8ƒÐaÜã(iÂ…áÚ óõò§Õï?èÆ!ô—ÅÞtUNÎà X¢§iË|?3ê —†X™õI`Èc@úKæ­7ui°* (°c£0=ßA]! "€Â6±ê£» Y»l¾‹¬+ ½Oš­y˜½òØ1Òá®j©/ßù­­@[[ý€ÕΙ)ê<‚÷ˆ\m}ZßæöN¡Xè2–ùw^Çi¦·ƒ{¦éMg4"¤v=Ö§µe¹æW=_‚súïP3%ÇgóñI+ï-,!DÉ¡ÀQ'ä !5-ôgv¦b`rHΖ<4¨³ nÀk{Ù9›@‘ÊÍßÀ·ñ’ó$C>*ÁÍï‹<Üõ­­@[[ùßÄHŒŽ¼dŒ2h%w¤b#§³h=ó‰ŽpÃ8Ï4L•„„œg'î†L¿B!éÃã»õÓ ÄL“•/ñŒ~¥Îœ m±—m¯Â4ÅpÑ^û¡¼bf³Mg‚ùLÌUBn˜Ð:±wÊ¡däȨ4û¸m;Š·"È7ÏCIdÓ3ÊYhkÐÖÖ@$÷1z‡7¼䉨·«ç4QD— VBÃÌÄUضRdU…;¯ÆÉõ 0Ôè]Òõ4Rv‡²™`~²þÐLUòŒ×ü‚~:‰æH1pè–ºo’ ¢ÆI\­¾ônÀ†а¹È è¼m1SsS¡¼ègó8%òǼ§ÏËgt¹eqï 6$ÕyBýmÚÚÚZ´µ5tÝÐ)#kq‘²±¾ß i]KâRSÄ–L‡“,ªLº¯á@ |+Ð칤IRlµ’JÙ=Æ r´8%:ÌORÈ/ våÆÇh#I"#®{Qú/â}Q[ß2Kg d8èë>:é„àèö4åá!ûÙY 3ÄÄ ÖE»Z¼f’f[ª?¬/{°Gà4zóˆòÁ@¤y¬ý¡­­@[[Y…”q×ãˆjúÛšhÞ´&º‰øQ ˆ0*êÊøÒòÏ4ݹ ½PD,Ì–˜’a’u3ET8¤.Ò ¥ÌyIºàtË€À+~÷³®3!_fç XI?Ä4̱ —…3¬#2¸xh¼«‚üpdô?ÇrºG”…vGΆ¾3Zü"(°VÙ\«R\RÉô mm-ÚÚ f$J1 œI-ÌQœËñ -øjR‰Y°M- w¾ã¼'¬–ñ(ïã¾àdHà!†TQ ™çÜr™NA¨â¯¢£/dEø ‹tp²±Ûe«æ’7’vØ•l“#‹ üë’ú'r-r`pÇF_gO=r2üÉ8:¥ÃQYàÆàÊÌñkÂ>¼!Ï -ó•_î/¿!º'ÜH’ñé 9E 7v(pŠ£¢#·´ÃU§`nØS>2:ZŠÜQ21²SE|x*~ž &'Å… P˜&š‘¢œ‹¾ÚÏwû\[A=BßR[‚>$6W<¬ nmm-ÚÚjˆ‡¤?:©fn?ÁGaPòè™|hXº@ó†¶-.eŸ»ü®[¥ýi9ªÍgFÝ1æ¢ßÎ;Õ÷ˆ.}l¬STir¸ùâxy9kdbd!'BŽ2eñ4´Ö?„\-¬„бSd§¦á¢9âØ‚~nöJû?å­­@[[ÿ¯ðƒÞTé¯oðŠ5ßÂ3ˆhθ´”§Œc¬›Á058­ñ[ñˆ‹LêõûE(o3‘>-Ê‹ðÜkNû]éü%£ôε³_Ðrtêl4„ÌÔÑ]#r.#£ãî~·¥xaû1t¨"Ï–?R/X*å$'søQÉn`еO·OÿÝN×⥭­@[[µ?—µrïñ`#vô%­zÒ¢»¦>FjV“päðì==7¢ÀG …–VZ D(©×èCïü–±¹¤¿¾/_ÿ Ó ÕþtQ'´ÊËdŸ÷–/ÔùŸPFŸÔ4w ²˜™5)–]šÿ#ÀâÐ? É*óW„³hkkÐÖÖÔti’•Ò¥xîáZ*yàôÚEÖx>iÃÉš]tÕ®pÕ䯈ò8¥ƒ1P¤=Ìì@è£5ÝIࣃÀ{E’mŽi5A7’ÎB¾\õóa†`Ù§â^ïLæ|ØA&=×/2®¯è¸DÝZ´µõ§±Ïit„ÒIÅìÃ#xºü}^f!ñ‰5ç}·¬põäpr”ŽTÔ°× šÇ·³@HM '*Ê.;„}Ûýi†Ýí>ÊѾkÕúˆsž¤Õ“þ™Îæ30¢ˆ,’˜é”¼ØÍ³ZS8>«õç_­ñ_Å‘üžóÔOP¨(tÑÏÖÖ ­-j8®¯ZÂrHd~:¸È†õÖÛêŸù´ºòö=8ÄSSÍ1Ï·„4%lxb’ËU%Wó¶Ks@ÙIVå u®ä×%|AnÁÅRú!<ì‡$ ½>:ʲ¨ˆÆ^ª¢EJ­ÏXèø†f–JÎ… ø‹Dñ‹Á -ûÁÕg)ëµTô†€ï/ÏÚÚZ´µõ?~4ú•õLÎÝDÙðÊ^½Ã”öƒ\ð“qc­Ã/9ê9pÌ–ˆÀ9gFÆÜäAƒD$V¯9>“rTë˜&Qbs0¬˜cF+ â¶Ñ>cɧ¯W UTÏtÄgÎE¶Ú}ôEtª&ˆ”X—jn‘§‰ŸCÄÂ߈´Çh¶^’×Ó<3@ {¶¶mmÍ ÈWÜs)rŸìj æIDAT›×·§¶Ï•µáðbHÈ ò|¤eŸìCS9Ûº÷0Ï× ¨”7ò³tús90f€SÄ‘¬ ½wjö¿ÖÞU/Qb_!ž ¸a “†5ze’š"ˆ1P¬„©ð¨¬œAçy-ïtÑŒ~R¬×láO-"ÒSP|¤›"]VÜïÈg!ÑÖÖ ­E?ÆþD–xdˆ&¹3;—?É«¢Ùxè’®z´>1·"É3"Y qÌSXM\r~‘g‚"é X„Qd0ˆº)Ð,€HÍ TréÂ˼19¹uOk_g¼×ît±€¬ÏÕ¬‡&Èg{ôŒÊ ®Ð`|…Ð<Èì0îß;äÀËb>Ï%Ó=¸"†‹ÖzkkÐÖCg`BÖáôtäª:6Asq¯˜PÖ; ­µ»ä(tÍjÅFc檥4¬óäU·1Öƒðx0²'M—ÂPþפ7bçiÁ^_`Ðr{Š4}8QÁ@Òƒ$#Íó.»ea ÏûR£úH•.…Ï2ðtѾiÛÓ¤ÒñÆ•‘úçíû­­@[[ þxfwŽlçn—ÑC€žÏ¡9À€…>GÏ#¼ÅuZ¥ØKbFš“/Û´+PšÐ¸Ê1Ž[ø\¬@B´øg„e&›.ëBŽ+Ðü¢¯Ö|˜ÆE%öƒJΔ,2vÔnà%9©$HªÚG¿ÕñÇ€ô?6Ú¹u7¢òä?"€ü£±|7Bòï¨!òr/h¹Ÿ­­@[[¥Iú_ñîðâÀÂâ¸ß-1¹Èç¸jŠbG ¹È­0ø–?Û¾C%2Ÿ $£$ÖEÒîØüËN?¢5x~]”2¬¸‡†ÎEoV_ ž[Ýõ ¯”¸<" H Ói:ééÿðahÙ1‹¹ÂÙÒ†•œ’û¹ïÿˆüÝ1².èIiåKåám¸Áʶû•¦q‹ƒ¶mmýaüCjû>6ž‡vó¤„ÎAÂ’çÐU“=³$…³$u3e‰ åmx™‚WÑ­ëÂI$9òq,Î@e?E+ uŒ†\¤f5‡˜FWè§ç“Ö,4LÅ´#¡1(ãyWŒVÌw :sfƒ0wðxÛ u|`õÏt©È6™ó½ñšyŠE?[[ €¶¶ Ò¬úx‹¿nÍ(,\ºF—M|€r¤X»Ð0,I| ˆ™)µ#(I—I×£ÈJ™ø£ßãÌA‘Ù¶ù€¯Ü.‡IóNSûE]æÂ9$Õ9Z«7ai׾ÕV¬x¸ê ífˆZÖæ¥­…½"ßHu„6û`ŽýJ'V½a‘¶ †R×^­Ÿm-Ú[°õ× Ú\ædK•¤ѯþ§uóŽxçLòBWEêÙcÖøc3A5+ª eÉë䘋°²9ÑAÿ¸[b¢EÁ­qò…Ö7½s†¨DVI(¯Ÿv«ú$­a $Œ&%Ðí;=¦ Çûã²ú^RCÿ•‚è¡=&Ÿ~‚™lÛÚZ´µõ× ‡Ñ…XÒü|’>§ŒK¥`UqKD'y„Ò6b|b#31ØB‹\FíÄ> š•öÕ‘–¼‚ÚBiþ8 ™s UmI@=8Ï î“]PQ~©D;eú§fÝß ¡Êõh›‰¼,…‘ P­õý9¤ ÙWÏÂÛÌïÉËö[ÔѰ,ÐÖ ­­e€H©sÚ½™íï$Ùcôr»áhK7Þ5YêRµhñA²™_ ©jó½‡ÒWáŒÈÒæ‘Ûb1É´=­3»#KÙ*úÊ"ånM·(~YÊñ![zö…š© 4{Î&›¡G͆Ó6'¾œ`ÀÙY?ýJï< T¹µ,øÙÚZ´µåKðP2z1Ü@S°—¿èsôi³ÇÊ»˜Y"i,¬Ý@F(b£-Ôu²´j]á‚ÄÍ¿Â.Fs&=^蟇­7¼vÝ«'±ÞÐÓGgÏÐ +§ÆÝ,{¶óK‰JaòôÅwð' ï&°Sü€.(\ŠƒSC_ >¤_@6lkkÐÖ3@g]…²OóŸáƒ •}Ÿåùt?r¡ð1{vh ™ÝËŸ:;3{ 2|rÛ 0  mZi[nJa·Å#Üi M/ˆJFOI/v§UúÖU¸+}î *3ôò^g(”@ÐÁ@–j2Åši¢SîBž€)ö0ÞîsÿÐɯéïŽ'?¶,ÐÖ ½[žòVÃ/}æõÔâfüãñ¥ÂŠ]‹Ÿ'…³ˆ„á!3@HfÏž¿ó.eâ„‘b³53:‰$"r ?»¯keR'ÅÆíl¿%¼5–yHÏ"&I‘)¶Éò#×Rè F?ê&r˜6NÉxþGnÐÏ3|f^wà+úŽÃ ý|ͱµµhkëž²L.%I°iqœ@lPÝNÕGážü„ý cèù´KK)3£^FM˜Y™jj·­z=-\—5¥ÚGutèÉëfåÒ/&ê'¬|¥ ÌiÚ½báÍ 8` —ÐBòàõDq#cˆY¼»ohdÔû„m¾ùAúdüBÿ4ô#_²f[[ €¶¶þWñ˜í¡¨°7s.ßN!21¬;×1!ó_ÚÖÐ1]ƒ²ž­˜•:{B)•[ðÊ9¨,FV ¤5’*-I•0M ¼0@+ò;r§åó{èXê:¯ƒiA#È×0iz´á­yô#C¨Œ&‘Î1‰—ˆü#òŸºÁÑÃÇ 3Õi¶Ñ÷çAÞ¾µµhkë¯1@Þm“Ó^6 ã0*ÜaS0¤}¯Ôˆ5/w ÍŸä|HBµwFŠwçÐt$"Zö«Òø)ž3înq7Õ†ƒ`ê<ÚÒÝU^VãŸ[a{ò(ÀVK!´jx"s&5œ4½wðÃg˜_cÍ4†Ü‹‘tÓþ<™!¾àî›Ôyrµ‡°hkÐÖÖŸg€¸Û會áÅ Š.ˆó*ißkixp‚ëyˆªG¯O •HËœtEÒ!Ûi1`ÎÓ „~ôÒX«é3nÛTA†L ù«†¦œW¤y¥øl‘’ÕU_hér²t…AHt ”9¸L¬¨ÜÙ¨ á¶ô~C3ßDz Ìψ†ÖqkkÐÖ'€xŒDÔ|$ˆ{`½Í")w ’ð ¬D`2G1 K4@,êƒ0›vÕò`bÜp ]'ÔAš"E3vè’sZWÑ<–íì†}d€c A‚>zÎtËÞ‹ú€„\£m<_Ì~D$¸*è»|¯kFà:Ÿçªë¹E­ âÖÖ ­­4ôI‹Sš÷Àf¡Ë…ȵ¯nÉkN¶’¶ì-Í4È  ±(D¬ Ï&Õ²3šdíÀBèÔ—®ƒ›¼T–µÒ4NDº_H4Ï!ÐàAë'†ymE$ɨŖäK™ß½9þĦ˜ÆÙäJž ¨î•ŽšàÐÏ.Œï`4^´µµhë¯3@Þ#˜*ð“¬êࢯ ‹„ ÜHXËø(Æ`¦~ÞÞê~B!w¿¯ÐgŒBÓ4 $õ„^³âê·mÒ•à¾ÿTÉ'„MÛÚZ´µE&ÄúDJè/“‡}¥+e“½÷ãéõhmq5å¡nÝÚ‡ä)Ü|Ÿ)a¾¹L;#eœJzÌŒ2!cgb~êìvA—Iâ$lDˆ˜¯Ó= Òࣹ#ÏblAºÂë5}.×6nÚ Q@ ü›Þ–®ðg”mmýÅú?ßnºÌÿKïcIEND®B`‚opensurgsim-0.7.0/SurgSim/Testing/Data/Textures/CubeMap_rgb.png000066400000000000000000000160701277777236100244760ustar00rootroot00000000000000‰PNG  IHDR€‹Ÿ»úsRGB®ÎégAMA± üa pHYsÃÃÇo¨dtEXtSoftwarepaint.net 4.0.5e…2e©IDATx^íÿ§íu¾Çûùþ—n×-ýpˆ"·ˆF1)É4IÉtÇh“EE4q~ˆ(¢1ä(%)‘¤ŒQŠEQ ýЯ»^kÖ:½×g?Ï>gíSçìõy<ÛãN÷ì½³¿|Ͻ?k­Ï:§Íü—’6œå(l8) ÊQØ8pR”£°qà¤((GaãÀIQPŽÂÆ€“¢ …'EA9 NŠ‚r6œå(l8) ÊQØ8pR”£°qà¤((GaãÀIQPŽÂÆ€“¢ …'EA9 NŠ‚r6œå(l8) ÊQØ8pR”£°qà¤((GaãÀIQPŽÂÆ€“¢ …'EA9 NŠ‚r6œå(l8) ÊQØ8pR”£°qà¤((GaãÀIQPŽÂÆ€“¢ …'EA9 NŠ‚r6œå(l8) ÊQØ8pR”£°qà¤((GaãÀIQPŽÂÆ€“¢ …'EA9 NŠ‚r6œå(l8) ÊQØ8pR”£°qà¤((GaãÀIQPŽÂÆ€“¢ …'EA9 NŠ‚r6œå(l8) ÊQØ8pR”£°qà¤((GaãLønñòÎâåh=^÷Õ=õëúeÝV7/ÿûõX½\/Õ¿/s!EA9 `àÏõ§º¢.­ êÜ}=Rç/b¤((Gaã,èŸøV×ÅØŸÈ+ëòÕ{ï6) ÊQØà ãa·'ðý›ÀÝug=Z/Oýô) >Ô?ý;:… z>_¼\V—l„ÿ§õ“å(œˆ>ÿÿ×úK=WÏ®þd·IQPŽs§×ë…z~qÄncãsº­ïD`àÛÅËõuÍžøY_¬Þ‚AŠ‚rœ;×ÖÕÇø6öoÿs;½òãû¦º±øSR”ãœéæÆc|[û´ïÜÁÀôFß·ë­ÕkX¤((Ç9óY}ºqŒoë±zrõ7Íä|Pïo|¡ûÔ•å8gÒôŸªðp=´ñMñt=µz å8g:âãqÞÊ&ȸ¥nÜø¦è{QIQPŽsÆ89ȸ¸Žÿ†¸¨.\ý)“å8g€“ƒ€Ö?6¾!ú® #ŸÔÇËû?Y\^î¡}bñ_¯×fy/¡å8g€“ƒ€¾·Ïø qWݱ…Çê‘= ›Úî{ôãæBŠ‚rœ3ÀÉÁ @?*pü†¸tyhï¥ ö³/ Ñß\s EA9Îàäà`ú°©}ûÀúòÏ})辋hˆ«êŠYœJQPŽsÆ89ÀÂþà¡z`ùø€D?¢ðöºuÏûõEâvå8gÒôóyPt×@Àš¾Bà‰ Øvø×O37R”ã\égð{¸:åc¶OýLÏôq?Çc~Äè_õú¡ßÏ,~ÎïÛúQ¾}Àœ¯˜¢ çÊýuï2â}·OÙ>WÏ.c>>¨«£ßwíîÛó¦wýl „sà¤((ǹÒÏï1 úÚŽ}?`zÝÚ~œå8WúÆÜ“]í3Ù·ôã„(8pR”ãœéË:ôéé%Ü“ý6}m® 68) Ê‘BŸûïkúôyýý±zryçêC\ôG8) ÊQØ8pR”£°qà¤((GaãÀIQPŽÂÆ€“¢ …'EA9 NŠ‚r6œå(l8) ÊQØ8pR”£°qà¤((GaãÀIQPŽÂÆ€“¢ …'EA9 NŠ‚r6œå(l8) ÊQØ8pR”£°qà¤((GaãÀIQPŽÂÆ€“¢ …'EA9 NŠ‚r6œå(l8) ÊQØ8pR”£°qà¤((GaãÀIQPŽÂÆ€“¢ …'EA9 NŠ‚r6œå(l8) ÊQØ8pR”£°qà¤((GaãÀIQPŽÂÆ€“¢ …'EA9 NŠ‚r6çÔ¥?/åúŸõ? ¶þ÷ÿ¬7EA9¦((GnŠ‚rLQPŽÜ嘢 ¸) Ê1EA9:pS”cŠ‚rtà¦((ÇåèÀMQPŽ) ÊÑ€›¢ S”£7EA9¦((GnŠ‚rLQPŽÜ嘢 ¸) Ê1EA9:pS”cŠ‚rtà¦((ÇåèÀMQPŽ) ÊÑ€›¢ S”£7EA9¦((GnŠ‚rLQPŽÜ嘢 ¸) Ê1EA9:pS”cŠ‚rtà¦((ÇåèÀMQPŽ) ÊÑ€›¢ S”£7EA9¦((GnŠ‚rLQPŽÜ嘢 ¸) Ê1EA9:pS”cŠ‚rtà¦((ÇåèÀMQPŽ) ÊÑ€›¢ S”£7EA9¦((GnŠ‚rLQPŽÜ嘢 ¸) Ê1EA9:pS”cŠ‚rtà¦((ÇåèÀMQPŽ) ÊÑ€›¢ S”£7EA9¦((GnŠ‚rLQPŽÜ嘢 ¸) Ê1EA9:pS”cŠ‚rtà¦((ÇåèÀMQPŽ) ÊÑ€›¢ S”£7EA9¦((GnŠ‚rLQPŽÜ嘢 ¸) Ê1EA9:pS”cŠ‚rtà¦((ÇåèÀMQPŽ) ÊÑ€›¢ S”£7EA9¦((GnŠ‚rLQPŽÜ嘢 ¸) Ê1EA9:pS”cŠ‚rtà¦((ÇåèÀMQPŽ) ÊÑ€›¢ S”£7EA9¦((GnŠ‚rLQPŽÜ嘢 ¸) Ê1EA9:pS”cŠ‚rtà¦((ÇåèÀMQPŽ) ÊÑ€›¢ S”£7EA9¦((GnŠ‚rLQPŽÜ嘢 ¸) Ê1EA9:pS”cŠ‚rtà¦((ÇåèÀMQPŽ) ÊÑ€›¢ S”£7EA9¦((GnŠ‚rLQPŽÜ嘢 ¸) Ê1EA9:pS”cŠ‚rtà¦((ÇåèÀMQPŽ) ÊÑ€›¢ S”£7EA9¦((GnŠ‚rLQPŽÜ嘢 ¸) Ê1EA9:pS”cŠ‚rtà¦((ÇåèÀMQPŽ) ÊÑ€›¢ S”£7EA9¦((GnŠ‚rLQPŽÜ嘢 ¸) Ê1EA9:pS”cŠ‚rtà¦((ÇåèÀMQPŽ) ÊÑ€›¢ S”£7EA9¦((GnŠ‚rLQPŽÜ嘢 ¸) Ê1EA9:pS”cŠ‚rtà¦((ÇåèÀMQPŽ) ÊÑ€›¢ S”£7EA9¦((GnŠ‚rLQPŽÜ嘢 ¸) Ê1EA9:pS”cŠ‚rtà¦((ÇåèÀMQPŽ) ÊÑ€›¢ S”£7EA9¦((GnŠ‚rLQPŽÜ嘢 ¸) Ê1EA9:pS”cŠ‚rtà¦((ÇåèÀMQPŽ) Êñœ4çþ·’6œå(l8) ÊQØ8pR”£°qà¤((GaãÀIQPŽÂÆ€“¢ …'EA9 NŠ‚r6œå(l8) ÊQØ8pR”£°qà¤((GaãÀIQPŽÂÆ€“¢ …'EA9 NŠ‚r6œå(l8) ÊQØ8pR”£°qà¤((GaãÀIQPŽÂÆ€“¢ …'EA9 NŠ‚r6œå(l8) ÊQØ8pR”£°qà¤((GaãÀIQPŽÂÆ€“¢ …'EA9 NŠ‚r6œå(l8) ÊQØ8pR”£°qà¤((GaãÀIQPŽÂÆ€“¢ …'EA9 NŠ‚r6œå(l8) ÊQØ8pR”£°qà¤((GaãÀIQPŽÂÆ€“¢ …'EA9 NŠ‚r6@à³ú´ŽÕ“u´¯§ÿõÕâe®¤((Gaã |·xéà_TÖuîqŸ¯çVo1?R”£°qV|R×MuÃFø»ò=ýà;‹—>Þ×¾\/Õ7õõê-æ~ú‹Þ§z.¬óbü[@çª|Ï£õp<þï¯{Wo1?Ðð^½[××5{¾àžRŠòoú À‰~¼¯îY½ÕüÀ@ßÈ;ý‚_UWÔëõÚò >þ¹ sUþÍíuëÆ1?êÌŽýú |¤Î¯'êh}»xi¥(µ<Ï?↑_lüÿÀ YÀ]uÇònŸ#€R¤Ó?ô]Y—?Öo©—Çûxü;3¤W¿oñO8J‘Nÿæ¿>Îû”ðGõ¡@ÇPŠdú7ÿ>ý»>άû—îÀq”"™ßÕoŽã/¦`}Ž ©¼YolãÏÔÓ«×8x¥H¤üym]}üøîÇõŸ­qà8J‘H_ïk<¾§wqà8J‘F_Ù·Ï÷¯íß×oW¯ùŽ iôu}ÖÇu_òåóÅËŽ I|Pïo×ý€„ÇPŠ$ÆË½÷•Ö—~™âÀq”"…iÔ_­WV¯Ù‹ÇPŠú^—Õ%Çç¾ØÛ~8p¥H`|¢—¾ÞO_û?8€Rœ;Ó'zy¬Y½æÄ8p¥8wú~þëã¸/üÖW~»ÞÚ׉ñøïSFãëçôÁ@ÀPŠs'=åëéú³ºnõ·ï>@ÀPŠsg|²—Ê~$ñ\p€Rœ;w×ÇòaÿsÁ8JQöÒÇûxüwæ vúQ€ã ;£Ó'…î…¦oÓW<Ñ# w‰å({qŒ…:¨ýwì:) ÊQö⸭nÞø"Äþ;vå({qŒ<¨§ò ’ÃNŠ‚r”½8‚!EA9Ê^Á¢ e//Ö ðP=°zÍüpà¤((GÉ|Y_Ôgõi|ư9áÀIQPŽÂÆ€“¢ …'EA9 NŠ‚r6œå(l8) ÊQØ8pR”£°qà¤((GaãÀIQPŽÂÆ€“¢ …'EA9 NŠ‚r6œå(l8) ÊQØ8pR”£°qà¤((GaãÀIQPŽÂÆ€“¢ …'EA9 NŠ‚r6œå(l8) ÊQØ8pR”£°qà¤((GaãÀIQPŽÂÆ€“¢ …'EA9 NŠ‚r6œå(l8) ÊQØ8pR”£°qà¤((GaãÀIQPŽÂÆ€“¢ …'EA9 NŠ‚r6œå(l8) ÊQØ8pR”£°qà¤((GaãÀIQPŽÂÆ€“¢ …'EA9 NŠ‚r6œå(l8Ô¹ VØ8pR”£°qà¤((GaãÀIQPŽÂÆ€“¢ …'EA9 NŠ‚r6œå(l8) ÊQØ8pR”£°qà¤((GaãÀIQPŽÂÆ€“¢ …'EA9 NŠ‚r6œå(l8) ÊQØ8pR”£°qà¤((GaãÀIQPŽÂÆ€“¢ …'EA9 NŠ‚r6œå(l8) ÊQØ8pR”£°qà¤((GaãÀIQPŽÂÆ€“¢ …'EA9 NŠ‚r6œå(l8) ÊQØ8pR”£°qà¤((GaãÀIQPŽÂÆ€“¢ …'EA9 NŠ‚r6œå(l8) ÊQØ8pR”£°qà¤((GaãÀIQPŽÂÆ€“¢ …'EA9 NŠ‚r6œå(l8) ÊQØ8pR”£°qà¤((GaãÀIQPŽÂÆ€“¢ …'EA9 NŠ‚r6œå(l8) ÊQØ8ûð¯ÅË‹õB­Ç뾺§n«›ëÁº¿žªcõz½VßÔ׫·Ü]R”£°qï,^î®;ëHšµ/Þ¢Çà»ÅË®’>.å(l€¯/þt ìçÏêºú¬>]ý-»Eúx”£°qî¯{ãAÒ^Q—ÖeuI|]{{ݺú[v‹ô±(Gaã ô9þõѧw®‡êïõ·úvñ²¦Ïû?_Ï-_?Hmÿù®1ý”¥°qúôÏ…uÞ2ü}ð~|¾x™ŽÀµuõêµ»ÃøïWžÂÆøgýcé©òL=½q0õxŒ¿-ìã¿_y à4èÓAÓªOíÓ¿²6ÀiÒ7ÔÛõÖê5»ÁøoWžÂÆ8M¦àoºK à4è€M¨]{<Àô߯,…p¼YolLýÛÀ®1þû•§°qNƒéÇþP­^³;Œÿ~å)? }?ן– ¯v¬ž¬Wë•ú²¾X½åáÂ8 ý8K뢃é“úxõÚÝaü÷+O9=^®—ê–ºqyðôù]{Ñâ-ú¢’‡ínâÀé‹_`/¡»¨Œþ‰~¼rÀ©Ú§‰ûA¤‡àô=}ÆÅïÿÞµ{ÿ¬¿9•§Œtݰþ)¿/ Ù§€îª;êªEî§oÓþº~¹ú[Î>À–ô=nª6¾ .~ØUÆCyÊÁúïS@ý¼!é²ð}þzWñö¯õ—Õ[œ]€-ù}ývã y}]¿ð»Âø±(O9¿«ß,ÂïÛNÆGõážÛúýÀô-üã±/½«Ï°füx”§Œ¾È6?øõ=‚ÆÏûa¹p¤pŠô¥žÇ/`/z?sØ®3~LÊSÎ Ó~–Ͻp ô¾¦7úö9¿90~C*O93ô©¢ñóÞ7€“Ð?å÷küâ=WÏ®^»ûŒ—ò”3Ãôôqßvxpö!Å¿Ÿ~NŒ›ò”3Ãôžƒ}7ÒÀpRüûaÝscüø”§üøôãç¼O!oóÄS?&@ Å¿ù;GÆQyÊGßK¨oü=Rço|ΫGVoqöq&âߌ§ò”Ó§/ Ñwoû>ÿ}ƒoŸ-è»zN?߇­%ÀÀõþžø÷¿æÌø±*O9=¦÷îIöoýÀ¯~TðaÃXÑWé›>d»èÕ÷øé_ã¶ñ°^ú51~¼ÊSN'êhü¼Ž^Y—//Ów'÷j ‡”>õ“¾xñ¡z`õ·~Ò¿_9ÊéÑÏž>¯'ò§õ“CuáH`Ŷ_Èýì«î é߯å‡å›úzø~ hßÐ÷÷Ÿ~Îû^@}¦à0à¬è/Üô ^ê.=V ýû•£üøô©Ÿ¾LôøyïÛÃH9pÆoJå)g†¾]°o ?÷ýà°³gü†TžræH·3ös ŸM8ÓoHe)g–éÝÌ_¯×V¯9;8pÆoFå)g–~ö°ñó¶o vàŒßŒÊSÎ,Ó{½Wï®^svpàŒßŒÊSÎ}m ñyEÚ~f±³‰güfTž²=òƒ<ÚúœýœÂgÎø ©­¼Q2ë®IEND®B`‚opensurgsim-0.7.0/SurgSim/Testing/Data/Textures/CubeMap_rgb_rotate.png000066400000000000000000000013571277777236100260560ustar00rootroot00000000000000‰PNG  IHDR€€L\öœgAMA± üa pHYsÂÂ(J€tEXtSoftwarePaint.NET v3.5.11GóB7kIDATx^í›!jesƒÈœæ»Àž!·rmîÿÖ´Sfš!PEù†)=oœb€c pŒŽ1À18ÆÇàc€c pŒŽ1À18ÆÇàc€c pŒŽ1À18ÆÇàc€c pŒŽ1À18ÆÇà˜_àçùW535 f¦†ÀÌÔ0˜™3SÃ`fjÌL €™©a035 f¦†ÀÌÔ0˜™3SÃ`fjÌL €™©a035 f¦†ÀÌÔ0˜™3SÃ`fjÌL €™©a035 f¦†ÀÌÔ0˜™3SÃ`fjÌL €™©ñöüù¬úýõT}>ÿV}½žªǽÖ58îµ®Àq¯u Ž{­kpÜk]€ã^ë÷Z×à¸×ºǽÖ58îµ®Àq¯u Ž{­kpÜk]€ã^ë÷Z×à¸×ºǽÖ58îµ®Àq¯u Ž{­kpÜk]€ã^ë÷Z×à¸×ºǽÖ58îµ®Àq¯u Ž{­kpÜk]€ã^ë÷Z÷×?h¼?U3SÃ`fjÌL €™©a035 f¦†ÀÌÔ0˜™3SÃ`fjÌL €™©a035 f¦†ÀÌÔ0˜™3SÃ`fjÌL €™©a035 f¦†ÀÌÔ0˜™3SÃ`fjÌL €™©a035 f¦†ÀÌÔ0˜™ÏóçF4ð”ìIEND®B`‚opensurgsim-0.7.0/SurgSim/Testing/Data/Textures/Gradient.png000066400000000000000000000004171277777236100240630ustar00rootroot00000000000000‰PNG  IHDR¾;ç sRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÝ!;L• 0iTXtCommentCreated with GIMPd.efIDAT(ÏRI1þÿçÎÁÄG™ÅCC‘ ­"$4¼ 6Üd%¨ˆˆsÎÈ«~ìI<ú¼áÏ=Fqò$+›}æ5ùM¿Õm©þã«Í?|õ)½ñW ý›‰ëPŒÿ¶ofÛ¬/yîÕVº‡IEND®B`‚opensurgsim-0.7.0/SurgSim/Testing/Data/Textures/NegativeX.png000066400000000000000000000137651277777236100242320ustar00rootroot00000000000000‰PNG  IHDR\r¨f CiCCPICC profilexÚSwX“÷>ß÷eVBØð±—l"#¬ÈY¢’a„@Å…ˆ VœHUÄ‚Õ Hˆâ (¸gAŠˆZ‹U\8îܧµ}zïííû×û¼çœçüÎyÏ€&‘æ¢j9R…<:ØOHÄɽ€Hà æËÂgÅðyx~t°?ü¯opÕ.$ÇáÿƒºP&W ‘à"ç RÈ.TÈȰS³d ”ly|B"ª ìôI>Ø©“ÜØ¢©™(G$@»`UR,À ¬@".À®€Y¶2G€½vŽX@`€™B,Ì 8CÍ L 0Ò¿à©_p…¸HÀ˕͗KÒ3¸•Ðwòðàâ!âÂl±Ba)f ä"œ—›#HçLÎ ùÑÁþ8?çæäáæfçlïôÅ¢þkðo">!ñßþ¼ŒNÏïÚ_ååÖpǰu¿k©[ÚVhßù]3Û  Z Ðzù‹y8ü@ž¡PÈ< í%b¡½0ã‹>ÿ3áoà‹~öü@þÛzðqš@™­À£ƒýqanv®RŽçËB1n÷ç#þÇ…ýŽ)Ñâ4±\,ŠñX‰¸P"MÇy¹R‘D!É•âé2ñ–ý “w ¬†OÀN¶µËlÀ~î‹XÒv@~ó-Œ ‘g42y÷“¿ù@+Í—¤ã¼è\¨”LÆD *°A Á¬ÀœÁ¼ÀaD@ $À<Bä€ ¡–ATÀ:ص° šá´Á18 çà\ëp`žÂ¼† AÈa!:ˆbŽØ"ΙŽ"aH4’€¤ éˆQ"ÅÈr¤©Bj‘]H#ò-r9\@úÛÈ 2ŠüмG1”²QÔu@¹¨ŠÆ sÑt4]€–¢kÑ´=€¶¢§ÑKèut}ŠŽc€Ñ1fŒÙa\Œ‡E`‰X&ÇcåX5V5cX7vÀžaï$‹€ì^„Âl‚GXLXC¨%ì#´ºW ƒ„1Â'"“¨O´%zùÄxb:±XF¬&î!!ž%^'_“H$É’äN !%2I IkHÛH-¤S¤>ÒiœL&ëmÉÞä²€¬ —‘·O’ûÉÃä·:ňâL ¢$R¤”J5e?奟2B™ ªQÍ©žÔªˆ:ŸZIm vP/S‡©4uš%Í›Cˤ-£ÕКigi÷h/étº ݃E—ЗÒkèéçéƒôw † ƒÇHb(k{§·/™L¦Ó—™ÈT0×2™g˜˜oUX*ö*|‘Ê•:•V•~•çªTUsU?Õyª T«U«^V}¦FU³Pã© Ô«Õ©U»©6®ÎRwRPÏQ_£¾_ý‚úc ²†…F †H£Tc·Æ!Æ2eñXBÖrVë,k˜Mb[²ùìLvûv/{LSCsªf¬f‘fæqÍƱàð9ÙœJÎ!Î Î{--?-±Öj­f­~­7ÚzÚ¾ÚbírííëÚïup@,õ:m:÷u º6ºQº…ºÛuÏê>Ócëyé õÊõéÝÑGõmô£õêïÖïÑ7046l18cðÌcèk˜i¸Ñð„á¨Ëhº‘Äh£ÑI£'¸&î‡gã5x>f¬ob¬4ÞeÜkVyVõV׬IÖ\ë,ëmÖWlPW› ›:›Ë¶¨­›­Äv›mßâ)Ò)õSnÚ1ìüì ìšìí9öaö%ömöÏÌÖ;t;|rtuÌvlp¼ë¤á4éĩÃéWgg¡só5¦KË—v—Sm§Š§nŸzË•åîºÒµÓõ£›»›Ü­ÙmÔÝÌ=Å}«ûM.›É]Ã=ïAôð÷XâqÌã§›§Âóç/^v^Y^û½O³œ&žÖ0mÈÛÄ[à½Ë{`:>=eúÎé>Æ>ŸzŸ‡¾¦¾"ß=¾#~Ö~™~üžû;úËýø¿áyòñN`Áå½³k™¥5»/ >B Yr“oÀòùc3Üg,šÑÊZú0Ì&LÖކÏß~o¦ùLé̶ˆàGlˆ¸i™ù})*2ª.êQ´Stqt÷,Ö¬äYûg½Žñ©Œ¹;Ûj¶rvg¬jlRlc웸€¸ª¸x‡øEñ—t$ í‰äÄØÄ=‰ãsçlš3œäšT–tc®åÜ¢¹æéÎËžwç|þü/÷„óû€9%bKGDÿÿÿ ½§“ pHYs  ÒÝ~ütIMEÝ ·MH 3IDATxÚíÝylÔeÇñO;-­•2´´€Á `§¥Ê‘(Èa¤X…9ÔÝÍŠÁˆ¨Q(ç¹*,•ʹeÅ`t¨â*À®î² Gi¡÷#rzPRJÛéoÿ0šu óÌQìû•<ÿ4íó{:Ïïû™ïoÎY–%­R 7@ €@ €@ €@ €@ €@ €@ €@ €@ €@ €@ €@ n*Ÿ§¥É 03—/÷ËÚg½òŠñÚ?OKku{ ˲8õ!IñEE:Ü»·‚Ýž£ª}{9œN‹ŠòÙº£ËËåt8d¯®v{ŽÆ  õ>|XEññthŠâãµö™gŒæh_U¥Ì… }ºîÅóç¿$ýuÊ”VWütø…ÈŠ 9EVTÝ›&çå©0!ÁëëMÊÏWnŸ>²¹\nÏQ¡˜²2UDFòZ·ŠÈH-ÌÌ4š#¨±Q+fÌðÉzWNŸnTü’”¹pa«,~:\µ€ó’“•PXh4Ïý_|¡í#Gzm£¶mÓ'£GÍQ§¤ü|5ÀFnß®/î¿ßhŽ‚ÄD%çåÉe³y%¤ò“’WRb"Ÿ>ø`«Ýg.pEÛGŽ4.ŒÄ‚M^·Î+ë{îÕW‹Gjj«.~:\S\I‰Žôê¥à†·ç(Ž–ÃéTµÝî±uEVT¨,&F••nÏá²Ù”œ—§‚ÄÄV½Çt¸æõñ«Ï=g4Gty¹æ-YâÑu-ÌÌ4*~Izýé§[}ñÓ Yí«ªät8uîœÛs\ QBa¡Žõèá‘®$?)ÉøÅJ1ee:ß¡C«ß_:4[,¦O †\¾¬ìÙ³=²ž3f¿$½´`ÅO€ëes¹”Û§’òóæ²g¾¾ç·ÿ~ÄÎÚ‘šj´†ÒØX%åç«!8˜¥ÀõpÙlš¾r¥ñ<«ÒÓàæýÍåÒÊéÓ×0sùrŠŸÀÚ9b„ñ‹nú<¨?¼óŽ[ûÔow ÿ¸ï>ãÿK´Z§S‰‰FO žìÒE±¥¥ª »î¿±WWËép(º¼Ü¨‹é“›«ü¤$6’îp:úËóÏÍÑåäIÍÎξ¡¿™·d‰QñKÒO=EñÓÀ”'îkÃÂ[Zª“]º4û»w=ªÂ„µ©¯wûxÕv»bÊÊ|útøUª¶Û5ñb£9Âjk••‘q]¿ûʬYFÅ/ýðy?<ÄæréPß¾êuäˆÛsX¸oŸôïÕߺ{·v f´Ö²˜%¨¾M6Žžà²Ù4mõj³{˺æÓzMMZ•žn¼Ö™Ë—Sü׎bËb0Ü[ÇŒ±,ÉhŒß´éŠsOZ¿ÞxîÞ{/ûÔÌànóÄtÇ»wW|Q‘.‡„üô³¶/ª46V·:eÔ¥¤ääèpïÞl—ð†£wÞ©5S§ÍÑýøqM]³æg?ËÈÊ2*~IZÿä“?ÂÛÚ]¸ §Ã¡ŽgϺ=GµÝ.‡Ó©òèhuýö[•ÄÅ)´®Îíù.´k'‡Ó©³;²Atð¦ íÚ¿ßß^]­—,$-›3Ǩø%iɼy?|v/ÒÔ¤ƒýú©On®Ñ5û3k×jÝäÉÆ—% ……<òOÀ—†íÚ¥¯†÷û:Æ~ø¡¶>ü0Â%|i×°aúpìX¿¯â§€Ÿô8vL… ¹|ÙçÇn TJNŽò’“Ù:øÃ±=´zÚ4¿ûÍI“(~:ø[xMœ‡:9ã³cÖ„‡ËátêL§Nlü©&<\s—.õé1ÿôâ‹?Z̽JS“ö ”œŸ\v$þì¥Ä €5*}Õ*Ÿkvv6ÅO ¥Ù3dˆ6M˜àõcl7Ž›K´DݾùFEññÆ/í½Z—1`ÿ~夤pCÓ %ú¦[7|–ÿ•¼=q"ÅO€–ÎïíÿÛ¶•ÃéÔéιéÐ’]lÛÖãO fedPüt¸iN2ËÒ¾ÕÿÀ\VÄ©.4”–7+ @3V¬ðÈ\s—.¥ø ÜlL¿×ïG‰ܘ\øïž¬¥µÖ7ƒˆÊJ9u8Þx®ºÐPõ,.Ö‰;îà„¤ÀÍ sáB¿$…ÖÕiù̙ܨtt7CPX¨¼äd56ztÞ¡»wkÏ!œ”thÉV¥§{¼ø%iÍÔ© ljâ&ÐRýæã•ºc‡Wæî“›«'ׯçFæ€K€–¨M}½ SVæµcœíØQ±¥¥ª¶Û99éÐ’L[½Ú«Å/IÏž5þªr:::ë|ú´Jcc^Sãõc5+± @N‡ƒ”-AVF†OŠ_’‚¼öŽC:ÐÜ þhßÀ>_ÛÈíÛµ#5•“” üé߃éî½{}~Ü„%çå©1(ˆ•KøÃïß}×/Å/ýð‚£g_{M  ð‡°ÚZ•ÄÅéöï¾óÛ*#"äp:u¾CNV:øRFV–qñ7šŽ••?}Í8èè|äŽ'Tܳ§Ñ‡Ö·i£ßmØ ¹¹ÊOJâ„¥€/,Ÿ9Óø“ÿü Ú2nœÞœ4Éh›Ë¥Uéél €/ ÛµK_ n4Gyt´N§ªívu:sFN‡Ãøuc>úHè!NÚæÏjËb0Ü.—•›œlY’ј²víÏæóòËÆs:cb¬6—/³OÍ n†»cÊڵƅz$)ɲ56þlÞº:ëhÆsÏ^¶Œ}jfp ·´¯ª’ÓáPÔ¹sFó¤îØ¡#Füâçã¶lÑæñãæækÃy^²hÑ"ãâß6jÔ‹_’¶Œ§ÝC‡Í^S£¥sç²Y<OêY\¬#½z}ÒOCp°z9¢’¸¸«þNßC‡t £§ùA:x˜'>æëµgŸ½fñKÒ¡¾}õÖO˜àMMZ3u*›FOµm›>=ÚhŽŠÈHÅ”•©2"¢ÙßõÔg <öþûúàÑGÙ@:¸«M}½GÞ{¿hÑ¢ë*~I:ݹ³²22Œ™={¶n¹t‰Müž a\瘕müÔ\QÏžVPCà 7¤®Î:Ö½»ñ±df²< wt:sF¥±±jwá‚Ñ<~ú©>{àþ»ñ›7kÓ„ FÇ® S\I‰¾»ýv6”K܈¥sçÿŽÔT·Š_’6oüE aµµZ6g›Éƒ€¸)99Ú?`€ñ»ô’óòT˜è×uHÒÝ{÷ê?wÝÅÆÒàzxâ[xÖMžlTü’”“’¢·'NôÈÿÀý2š¿Ý°ÁøÁ·*»ÝŠ*/÷Èz:Ÿ:eÕ´mk¼¦‰o½ÅþZ–E¯_3/ž?_碢<²&O=-˜•‘¡¶/²É¤ ãj#sÁ‚ù¶ÜÐK—¬ãݺ¯miFû̉θÒèzâ„U{Ë-ÆE6fëV¯¬ï‘>0^[]HˆÕýØ1€Áøÿ±qÂãûrøp¯®ñëÁƒ×¸eìX^Äuþ×={ŒßŠÛ¨”œå%'{mýÔþŒÑ¿÷Ë/?ÖŒ§ñë8!<ôî¹7'MòjñKÒÁ~ýô·Ç7žgõ´i²¹\<È`L~ýuã¶úBx¸ÕéôiŸ¬÷¶ï¿·.Þz«Ç?—Ç­nØ«ª¬³ÑÑÆÅôǬ,Ÿ®{ÞâÅÆk.вÚWVŒÖ;V¦§Òñnݬº:Ÿ®;ôÒ%ëD×®Æk_5mÀh#®¸Øª6.¢ 7úeý½÷žñÚ냃­¸âb€ÑúÆgiiÆôõàÁ~ýþ5hñÿðYZOài@€@ €@ €@ €@ €à&€@ €@ €@ €@ €@ ÀÍä¿L¤äÖÒ!l}IEND®B`‚opensurgsim-0.7.0/SurgSim/Testing/Data/Textures/NegativeY.png000066400000000000000000000117001277777236100242160ustar00rootroot00000000000000‰PNG  IHDR\r¨f CiCCPICC profilexÚSwX“÷>ß÷eVBØð±—l"#¬ÈY¢’a„@Å…ˆ VœHUÄ‚Õ Hˆâ (¸gAŠˆZ‹U\8îܧµ}zïííû×û¼çœçüÎyÏ€&‘æ¢j9R…<:ØOHÄɽ€Hà æËÂgÅðyx~t°?ü¯opÕ.$ÇáÿƒºP&W ‘à"ç RÈ.TÈȰS³d ”ly|B"ª ìôI>Ø©“ÜØ¢©™(G$@»`UR,À ¬@".À®€Y¶2G€½vŽX@`€™B,Ì 8CÍ L 0Ò¿à©_p…¸HÀ˕͗KÒ3¸•Ðwòðàâ!âÂl±Ba)f ä"œ—›#HçLÎ ùÑÁþ8?çæäáæfçlïôÅ¢þkðo">!ñßþ¼ŒNÏïÚ_ååÖpǰu¿k©[ÚVhßù]3Û  Z Ðzù‹y8ü@ž¡PÈ< í%b¡½0ã‹>ÿ3áoà‹~öü@þÛzðqš@™­À£ƒýqanv®RŽçËB1n÷ç#þÇ…ýŽ)Ñâ4±\,ŠñX‰¸P"MÇy¹R‘D!É•âé2ñ–ý “w ¬†OÀN¶µËlÀ~î‹XÒv@~ó-Œ ‘g42y÷“¿ù@+Í—¤ã¼è\¨”LÆD *°A Á¬ÀœÁ¼ÀaD@ $À<Bä€ ¡–ATÀ:ص° šá´Á18 çà\ëp`žÂ¼† AÈa!:ˆbŽØ"ΙŽ"aH4’€¤ éˆQ"ÅÈr¤©Bj‘]H#ò-r9\@úÛÈ 2ŠüмG1”²QÔu@¹¨ŠÆ sÑt4]€–¢kÑ´=€¶¢§ÑKèut}ŠŽc€Ñ1fŒÙa\Œ‡E`‰X&ÇcåX5V5cX7vÀžaï$‹€ì^„Âl‚GXLXC¨%ì#´ºW ƒ„1Â'"“¨O´%zùÄxb:±XF¬&î!!ž%^'_“H$É’äN !%2I IkHÛH-¤S¤>ÒiœL&ëmÉÞä²€¬ —‘·O’ûÉÃä·:ňâL ¢$R¤”J5e?奟2B™ ªQÍ©žÔªˆ:ŸZIm vP/S‡©4uš%Í›Cˤ-£ÕКigi÷h/étº ݃E—ЗÒkèéçéƒôw † ƒÇHb(k{§·/™L¦Ó—™ÈT0×2™g˜˜oUX*ö*|‘Ê•:•V•~•çªTUsU?Õyª T«U«^V}¦FU³Pã© Ô«Õ©U»©6®ÎRwRPÏQ_£¾_ý‚úc ²†…F †H£Tc·Æ!Æ2eñXBÖrVë,k˜Mb[²ùìLvûv/{LSCsªf¬f‘fæqÍƱàð9ÙœJÎ!Î Î{--?-±Öj­f­~­7ÚzÚ¾ÚbírííëÚïup@,õ:m:÷u º6ºQº…ºÛuÏê>Ócëyé õÊõéÝÑGõmô£õêïÖïÑ7046l18cðÌcèk˜i¸Ñð„á¨Ëhº‘Äh£ÑI£'¸&î‡gã5x>f¬ob¬4ÞeÜkVyVõV׬IÖ\ë,ëmÖWlPW› ›:›Ë¶¨­›­Äv›mßâ)Ò)õSnÚ1ìüì ìšìí9öaö%ömöÏÌÖ;t;|rtuÌvlp¼ë¤á4éĩÃéWgg¡só5¦KË—v—Sm§Š§nŸzË•åîºÒµÓõ£›»›Ü­ÙmÔÝÌ=Å}«ûM.›É]Ã=ïAôð÷XâqÌã§›§Âóç/^v^Y^û½O³œ&žÖ0mÈÛÄ[à½Ë{`:>=eúÎé>Æ>ŸzŸ‡¾¦¾"ß=¾#~Ö~™~üžû;úËýø¿áyòñN`Áå½³k™¥5»/ >B Yr“oÀòùc3Üg,šÑÊZú0Ì&LÖކÏß~o¦ùLé̶ˆàGlˆ¸i™ù})*2ª.êQ´Stqt÷,Ö¬äYûg½Žñ©Œ¹;Ûj¶rvg¬jlRlc웸€¸ª¸x‡øEñ—t$ í‰äÄØÄ=‰ãsçlš3œäšT–tc®åÜ¢¹æéÎËžwç|þü/÷„óû€9%bKGDÿÿÿ ½§“ pHYs  ÒÝ~ütIMEÝâ›LþIDATxÚíÝ[p”åÀñg—Mg J6'ÇöÎ^ÕR«Xë¡V)0ŠTDA;ÓN ‚<ŒÎh¥Z±-t´B-V­x¨Z¯ì:œ¨@!ÅÌH “lï¼(Ú&¼›MÒü~Î^€ÃwØoßÿ÷ìff“ÉG>Àˆ”õ€ € € € € € € € € € € € € € € € € € € € € €0,ÌzcVdò™¤G¶7ïýÞ žÇ»_|7²½Ùäs™õÆ,`äX±|Eò6ò™|¬¾kõ žÇª»WE>“OÞÎÊe+G̵Ïä#Ÿ·8ïÏçÅë_{=ínÒ›3wDÝ®º¢ÿÎ;㬿½ÙÞäçᵯ¿fÀÐ_½ÙÞXsçšA9þÕw­N^ü…zL Kç¿z~òݯ¤»$§7FeKeÑŽ»©º)êvÕEϨžäóå‚WFÔ57Pл_wIwÜ÷ãûŠzÜkïX›¼øGâÝßÀqf¿<;ù.XÚUÍUÍ1ußÔ?Þ½ÓöFÍžšødô'Éç½ýÂí#îz›(ø]°«´+øáE9Þûtòâ©wŸé¢?]/}㥤mŒ=:6Zs­Q~¨|ÀŽóÀäQÕ\Ÿôqòù¾øÍGäµ6pœ{î¹'yGLJ¾ÿЀçƒ?x0yñê|Mü_¹ø…‹“ïŠeGÊ¢­¢-ÆwŒ/øñµOl\k.:Çu&Ÿçó—W!>ïßë–¬+èq=zû£É‹?“ÏŒØOþMôÙå¸<¶}k[Ò6Ê•GKeKŒëW·mÑ1¾#ù¼žýö³#þúšøŸï‘3ùLÒ6•Š ‹6äxÖ-Y—¼ø3ùL,_±ÜÅ5ÐWüþŠä»åÔ}S£©º)ÆsÂÛè×¹Ö\´OlO>Ÿ­WnuaMôÅòË“§€}S÷Å“×?™´õ7¯O^üîþ&NÀœ-s’ïš¹Ö\ì®Ý%Ý%ýþ·ÇÆ‹ªæªØ?eòy<óg\Pýý, Û›öriÍµÆæ«7ŸÐ¿}â†'’¶7;âîœ|äó}yÌ}zn>ÿ«k¨Ë÷d{úµß®Ñ]ùŠÖŠä}Ï{jžëø}¶lå²ä)`WÝ®Ø2gK¿þͦ›¢­¢-ùî¿lå2Ñ[NÔÌ3cîïæ&ogÍkúüå=£zbík“÷9ïéy1cç Ñ[”ÇÎúùlO6yßvÙ¶>íoóU›“÷5ª{T¾¡®Áõó€Tõ õ1ÿ©ùÉÛéËWˆç3ù‚|Éèü§æÊ7~ H¿5NoŒ™;f&ßö ·Çì—gîÿßzåÖ˜³eNÒ>FõŒŠ3vFíîZÎgÂôÆéqÕo¯ð) ¿häêÍW[ü& mOÍž¨o¨OžÞüê›qî_Î=îï_¸ø…¸äùK’¶]Ò] õ QÝTí‚™(¤š=5±`Ó‚äí¬º{U¿þ¾?lZ`ñ›(MÕMQßPÝ%ÝIÛyûËoÇ9=çÓ?¿zþ«qÁ+$ßýwÕ튪æ*ÊÀ@¨nªŽk~sMÁ? ¸÷'÷&oóÚ__kñ›h­¹Ö˜Þ8=é»ù3ùL¼ó¥wâì÷ÎŽ·¾òÖg~&У?Ó#ךsL ¤\k.®ûÕuIÛÈgòŸ¾ç/Ä{ÿ럼Þâ7P,mmQ»»6i ÈöfcãÂÉ1)í*ݵ»cÚÞi.Œ €b¨h«ˆ…&m£7Û7UÍUE™ÆÍUÍqú?N÷Ä› &˜‹_\”}-~|±Åo(Ö“•RÇÓ×/Ö 'Œªæªè×9`û×9.š«šcÒÁI^œ&†’I'Å-?¿e@÷qëÏnµøM&€¡êPù¡¨l©)àäNŽ–Ê–˜Ø>Ñ ÓÀPT~¨<–¬[2 Û^²n‰Åo0 uíÛ£²¥2>:ù£‚mó”-•-qÚ?Oó¢40”MlŸK[ZÐm.}l©Åo0 ‡ "âð„ÃQÙRGÊŽ$o«ìHY´T¶Ä„ü M OˆÛ~z[A¶uû£·[ü&Àpš"">8õƒ‚,ÜÃÇ©œêÅ(0œP¨ço¸³·€ €Y‰§ ïü  € € € € € €ôU&y¿íL€ € € € € € € € € € € € € € € € € € € €0¬ýÍAB¥ÓÅM9IEND®B`‚opensurgsim-0.7.0/SurgSim/Testing/Data/Textures/NegativeZ.png000066400000000000000000000111341277777236100242200ustar00rootroot00000000000000‰PNG  IHDR\r¨f CiCCPICC profilexÚSwX“÷>ß÷eVBØð±—l"#¬ÈY¢’a„@Å…ˆ VœHUÄ‚Õ Hˆâ (¸gAŠˆZ‹U\8îܧµ}zïííû×û¼çœçüÎyÏ€&‘æ¢j9R…<:ØOHÄɽ€Hà æËÂgÅðyx~t°?ü¯opÕ.$ÇáÿƒºP&W ‘à"ç RÈ.TÈȰS³d ”ly|B"ª ìôI>Ø©“ÜØ¢©™(G$@»`UR,À ¬@".À®€Y¶2G€½vŽX@`€™B,Ì 8CÍ L 0Ò¿à©_p…¸HÀ˕͗KÒ3¸•Ðwòðàâ!âÂl±Ba)f ä"œ—›#HçLÎ ùÑÁþ8?çæäáæfçlïôÅ¢þkðo">!ñßþ¼ŒNÏïÚ_ååÖpǰu¿k©[ÚVhßù]3Û  Z Ðzù‹y8ü@ž¡PÈ< í%b¡½0ã‹>ÿ3áoà‹~öü@þÛzðqš@™­À£ƒýqanv®RŽçËB1n÷ç#þÇ…ýŽ)Ñâ4±\,ŠñX‰¸P"MÇy¹R‘D!É•âé2ñ–ý “w ¬†OÀN¶µËlÀ~î‹XÒv@~ó-Œ ‘g42y÷“¿ù@+Í—¤ã¼è\¨”LÆD *°A Á¬ÀœÁ¼ÀaD@ $À<Bä€ ¡–ATÀ:ص° šá´Á18 çà\ëp`žÂ¼† AÈa!:ˆbŽØ"ΙŽ"aH4’€¤ éˆQ"ÅÈr¤©Bj‘]H#ò-r9\@úÛÈ 2ŠüмG1”²QÔu@¹¨ŠÆ sÑt4]€–¢kÑ´=€¶¢§ÑKèut}ŠŽc€Ñ1fŒÙa\Œ‡E`‰X&ÇcåX5V5cX7vÀžaï$‹€ì^„Âl‚GXLXC¨%ì#´ºW ƒ„1Â'"“¨O´%zùÄxb:±XF¬&î!!ž%^'_“H$É’äN !%2I IkHÛH-¤S¤>ÒiœL&ëmÉÞä²€¬ —‘·O’ûÉÃä·:ňâL ¢$R¤”J5e?奟2B™ ªQÍ©žÔªˆ:ŸZIm vP/S‡©4uš%Í›Cˤ-£ÕКigi÷h/étº ݃E—ЗÒkèéçéƒôw † ƒÇHb(k{§·/™L¦Ó—™ÈT0×2™g˜˜oUX*ö*|‘Ê•:•V•~•çªTUsU?Õyª T«U«^V}¦FU³Pã© Ô«Õ©U»©6®ÎRwRPÏQ_£¾_ý‚úc ²†…F †H£Tc·Æ!Æ2eñXBÖrVë,k˜Mb[²ùìLvûv/{LSCsªf¬f‘fæqÍƱàð9ÙœJÎ!Î Î{--?-±Öj­f­~­7ÚzÚ¾ÚbírííëÚïup@,õ:m:÷u º6ºQº…ºÛuÏê>Ócëyé õÊõéÝÑGõmô£õêïÖïÑ7046l18cðÌcèk˜i¸Ñð„á¨Ëhº‘Äh£ÑI£'¸&î‡gã5x>f¬ob¬4ÞeÜkVyVõV׬IÖ\ë,ëmÖWlPW› ›:›Ë¶¨­›­Äv›mßâ)Ò)õSnÚ1ìüì ìšìí9öaö%ömöÏÌÖ;t;|rtuÌvlp¼ë¤á4éĩÃéWgg¡só5¦KË—v—Sm§Š§nŸzË•åîºÒµÓõ£›»›Ü­ÙmÔÝÌ=Å}«ûM.›É]Ã=ïAôð÷XâqÌã§›§Âóç/^v^Y^û½O³œ&žÖ0mÈÛÄ[à½Ë{`:>=eúÎé>Æ>ŸzŸ‡¾¦¾"ß=¾#~Ö~™~üžû;úËýø¿áyòñN`Áå½³k™¥5»/ >B Yr“oÀòùc3Üg,šÑÊZú0Ì&LÖކÏß~o¦ùLé̶ˆàGlˆ¸i™ù})*2ª.êQ´Stqt÷,Ö¬äYûg½Žñ©Œ¹;Ûj¶rvg¬jlRlc웸€¸ª¸x‡øEñ—t$ í‰äÄØÄ=‰ãsçlš3œäšT–tc®åÜ¢¹æéÎËžwç|þü/÷„óû€9%bKGDÿÿÿ ½§“ pHYs  ÒÝ~ütIMEÝT×gšIDATxÚíÝÛo×åÀñO”STá¸1Hˆ­ (*Êâ"¨q‚F FeÐb* /€Ë€ %T1.›B\ÄÉa“S;FÎ Øåq©ËoW»ÛvÓ'æ÷ÍïõúžÈ'¿Ï;Ï£ákQ.¹ R±€ € € € € € € € € € € € € € € € € € € € € @”ÿOQQ® þœ¹\‘ € € €ä»Bù OÿÅŠ 7~¹\äüÈŠ ÆDEEG\¿~[’ó*+Û£¥¥&ÊÊzÜ ŸårE±páîdË?p`w47Ï-Øå2¥±±.Žy,Ùy6¼ãÇYÐ3õ Ξ'ž‰îîIÎ{úéßÇÇÿ¸àç*ä½ÞÞ’˜<ùx´´Ô$9oøð¯¢³³<îºë?[OòÞÚµ+“-DÄ®]‹,¿YÐÖV55-qóf¿$ç½òʯbûöW VÈw==eñÀŽÎÎò$çÝ{ïßâôéI1hÐ Ãõ ß­Zµ&Ùò÷ëw3öî}Éò YpâÄñaÃëÉÎ{óÍ_Äý÷ÿÅ`=Èw7n Šªª¶8~l’ó¦M;‡=ÅÅ· × €|×а>Ùòòu45Í·ü@:ôDlÛ¶$ÙyÛ·¿£F]4XOòݵk·Gyyg\¼8*Éyóæí‰¦¦ùë@Ô×oN¶ücÆ\ˆ·Þú¹¡ºû÷ÏŒY³>JrVIIo=:-¦L9f°nä»+W†ÅË/ÿ:Ùy+W®µündÅìÙûâý÷šä¬šš–8vlJ”–~o°@¾{ï½cΜw“œ5xð7ÑÖVwßýwƒõ ß]º42–,Ù–ì¼ÆÆ:Ë/dÅâÅ;ãêÕ¡IÎzþù߯¢E» Õ€,عsqÔÖîHrÖÈ‘—¢³³<† »b°@¾Kùeߢ¢\|òÉâ©§>5XOò]ê/ûÖÕ5Z~7²¢±±.êë7'9«¼¼3Z[«£ÿï VÈw)¿ì;`À·ÑÚZ&|a°žä»ÞÞ’X°àdŸõ^·î Ë/dźuoÄ©S&9kÆŒƒ±lÙCõø‡•gÿÙ\®(sko¯Œšš–èé)ëóYwÞùÏè計‘#/ùAºïzzÊbþü¦$˱cG­å²bõêÕÑÑQ‘ä¬ÚÚñÜs¿3TOO€,<Nž|(¦NýÉòÿçaùÝÜ2r8|øñ˜>ý³$ÿ|<ò§8rä1ŸõÈB®_¿-ÊË;£«ktŸÏºãŽE{{eŒÝåÇç @Ô×oN²üÛ¶-±ünnY¹8ðLÌœ¹?ÉYsæ¼ÍÍsýè@²€+W†Å„ _ÄåË#ú|Ö¨Q£½½2† ùÚ΀,xíµ_&Yþââ[±gÏ<Ë/dž}³“}Ö»¡a}<úè ÕÀ O€Ë—GÄ}÷ý5ÉÇ='M:'N<ýúÝôcs jkw$YþAƒnÄÞ½/Y~ +víZ<“ä¬M›–Ǹqg ÕÀ O€®®ÑQQÑ×®ÝÞç³fÍú(>üðY?0 r¹¢˜>ý³8|øñ>Ÿ5bÄåè計áÿ2XO²`ëÖ¥I–?"b÷î…–ß €¬8wªjKòqÏ¥K·Æ–-Ë UÈ‚ÞÞ’˜:õó8yò¡>Ÿ5~ü—qúô¤0à[ƒõ Ö¯oH²üýûÍÍs-¿YÑÑQÕÕ­I>î¹qãŠX¾|“¡ YÐÓS55-ÑÞ^Ù糞|òqðàŒ¼ûOªžð?¬Y³*Éòz5Þ~ûg–ß €¬8uêÁ˜2åX’/û~ðÁOâ…~c¨ndAw÷ÀX°à$Ë¿pánËï@–Ô×oŽÆÆº‚ùófåµ&ü0×Ãâ[µ…O,„ € € €áo‚ € € € € € € € € €` € € € € € € € € € € €yÿs“/·Ìh kIEND®B`‚opensurgsim-0.7.0/SurgSim/Testing/Data/Textures/PositiveX.png000066400000000000000000000141211277777236100242550ustar00rootroot00000000000000‰PNG  IHDR\r¨f CiCCPICC profilexÚSwX“÷>ß÷eVBØð±—l"#¬ÈY¢’a„@Å…ˆ VœHUÄ‚Õ Hˆâ (¸gAŠˆZ‹U\8îܧµ}zïííû×û¼çœçüÎyÏ€&‘æ¢j9R…<:ØOHÄɽ€Hà æËÂgÅðyx~t°?ü¯opÕ.$ÇáÿƒºP&W ‘à"ç RÈ.TÈȰS³d ”ly|B"ª ìôI>Ø©“ÜØ¢©™(G$@»`UR,À ¬@".À®€Y¶2G€½vŽX@`€™B,Ì 8CÍ L 0Ò¿à©_p…¸HÀ˕͗KÒ3¸•Ðwòðàâ!âÂl±Ba)f ä"œ—›#HçLÎ ùÑÁþ8?çæäáæfçlïôÅ¢þkðo">!ñßþ¼ŒNÏïÚ_ååÖpǰu¿k©[ÚVhßù]3Û  Z Ðzù‹y8ü@ž¡PÈ< í%b¡½0ã‹>ÿ3áoà‹~öü@þÛzðqš@™­À£ƒýqanv®RŽçËB1n÷ç#þÇ…ýŽ)Ñâ4±\,ŠñX‰¸P"MÇy¹R‘D!É•âé2ñ–ý “w ¬†OÀN¶µËlÀ~î‹XÒv@~ó-Œ ‘g42y÷“¿ù@+Í—¤ã¼è\¨”LÆD *°A Á¬ÀœÁ¼ÀaD@ $À<Bä€ ¡–ATÀ:ص° šá´Á18 çà\ëp`žÂ¼† AÈa!:ˆbŽØ"ΙŽ"aH4’€¤ éˆQ"ÅÈr¤©Bj‘]H#ò-r9\@úÛÈ 2ŠüмG1”²QÔu@¹¨ŠÆ sÑt4]€–¢kÑ´=€¶¢§ÑKèut}ŠŽc€Ñ1fŒÙa\Œ‡E`‰X&ÇcåX5V5cX7vÀžaï$‹€ì^„Âl‚GXLXC¨%ì#´ºW ƒ„1Â'"“¨O´%zùÄxb:±XF¬&î!!ž%^'_“H$É’äN !%2I IkHÛH-¤S¤>ÒiœL&ëmÉÞä²€¬ —‘·O’ûÉÃä·:ňâL ¢$R¤”J5e?奟2B™ ªQÍ©žÔªˆ:ŸZIm vP/S‡©4uš%Í›Cˤ-£ÕКigi÷h/étº ݃E—ЗÒkèéçéƒôw † ƒÇHb(k{§·/™L¦Ó—™ÈT0×2™g˜˜oUX*ö*|‘Ê•:•V•~•çªTUsU?Õyª T«U«^V}¦FU³Pã© Ô«Õ©U»©6®ÎRwRPÏQ_£¾_ý‚úc ²†…F †H£Tc·Æ!Æ2eñXBÖrVë,k˜Mb[²ùìLvûv/{LSCsªf¬f‘fæqÍƱàð9ÙœJÎ!Î Î{--?-±Öj­f­~­7ÚzÚ¾ÚbírííëÚïup@,õ:m:÷u º6ºQº…ºÛuÏê>Ócëyé õÊõéÝÑGõmô£õêïÖïÑ7046l18cðÌcèk˜i¸Ñð„á¨Ëhº‘Äh£ÑI£'¸&î‡gã5x>f¬ob¬4ÞeÜkVyVõV׬IÖ\ë,ëmÖWlPW› ›:›Ë¶¨­›­Äv›mßâ)Ò)õSnÚ1ìüì ìšìí9öaö%ömöÏÌÖ;t;|rtuÌvlp¼ë¤á4éĩÃéWgg¡só5¦KË—v—Sm§Š§nŸzË•åîºÒµÓõ£›»›Ü­ÙmÔÝÌ=Å}«ûM.›É]Ã=ïAôð÷XâqÌã§›§Âóç/^v^Y^û½O³œ&žÖ0mÈÛÄ[à½Ë{`:>=eúÎé>Æ>ŸzŸ‡¾¦¾"ß=¾#~Ö~™~üžû;úËýø¿áyòñN`Áå½³k™¥5»/ >B Yr“oÀòùc3Üg,šÑÊZú0Ì&LÖކÏß~o¦ùLé̶ˆàGlˆ¸i™ù})*2ª.êQ´Stqt÷,Ö¬äYûg½Žñ©Œ¹;Ûj¶rvg¬jlRlc웸€¸ª¸x‡øEñ—t$ í‰äÄØÄ=‰ãsçlš3œäšT–tc®åÜ¢¹æéÎËžwç|þü/÷„óû€9%bKGDÿÿÿ ½§“ pHYs  ÒÝ~ütIMEÝ(IQ_o IDATxÚíÝ{l”UÆñgza ½€;B™NÛAÊÍrY¤!xY KŒ¢®ã%«P°ˆ ˆ, ºEZX“Åèªë*k” ‹&D"º€+HW°E¦íÌPnr°´z›y÷£ÑeÁö=3Óvûý$çÎ{æ}Ïïéyß33uX’%R § €@ €@ €@ €@ @ €@ €@ €@ €@ @ €@ Ú£›Ö¯—òl·Ø`P;GŽŒú¸wŒ¥˜PÈhì7­_ß1/º%Y4š%YåV|Cƒ%˲ݮٲ%êãžðÙgFcŽoh°*ÜîyÍ ÚÏZ^a¡Q1ɲ¬÷¦M‹Úxß½ývãñævØëí°$‹Å/~PÕ­›\€Nvïn»+÷ïWEF†œõõk]B‚2**t`à@Û}t?yR—Kݪªxt«ªÒsO?mÔÇþ+¯ÔòÙ³#>ÖeùùFÅ/I¿æ™[ü’Ä ÅÄhäÎ*ÍζÝGrMüééêuìXDÆx¤O¥ûýªML´ÝÇU_­¯FŒPl0È.ð㤅´bæL£>j’“õÔóÏGlŒó–.5*~I*ÊËëÐÅÏ.í’í7ï¿oôp-&´vŽöq_}µå…ŒÆvëÚµ\cvh—jû´Ο7*´ÜM›Â>®q[·ÉYWgíIKãK·¸¨(Ù2£>6çæêïS§†mL»ãm7Ψ¼¢"¥UVryˆ_R›˜(·Ï§Ã}ûÚîcðÞ½*ËÊ2Þ<ß¹³Ü>Ÿ¾éßßvW?®€Ë¥äš..ñKkkõâܹF}ì]ÛÇŒ1:fþ²epð mÀhŸÜ–ŸZËáhÓ¯©Þé”ÇëUeZší>Ò*+U–•¥N —ü{çºt‘ÛçÓ¡~ýl«ß¡Cò¹Ýêrî’m@˜rÖ×kY~¾Q•iiÍú¬Á‹sç¿$½ðä“?Û€­õ€¥å÷«íåµMÞ¸Ñx[ðDíÿ`ÿþVçs猎1vÛ6+äp0yH„»}=t¨ÛÔdT ¾òÊEû¿cõj£¾¡õŘ1ÌC€ˆTûÝË/ilS“µëª«.èwë¸qÆ{þw¿õs "ÙN¥¦Z©§Nêä/ØöËپݨÏijg­Ã}ú0ÙD$¥ž>­E õñÉäÉZ7eÊÿý×»ïVqNŽQŸó–.UŸ#G¸@l² iÁØXe—–ÊëñØîÃÈëñ¨¡S'¥ûý:Ò§í¾8 ŠŒ %ÔÕ1›!ŽS±Á ŠòòtÝÇÛî#àri匪êÖͨø¥ï?1Hñ³`eSÖ­Ó·Übûßw=sFõN§êl÷1qËmÎÍeâ@´í2D¯W :µÊñcB!í5JÃKJ˜x-9oœ„Ã={”WTÔjÇ¿ÿõ×)~V¬ZSMr²Òý~ëÕ+ªÇM©®VÀåRÏ'˜t¬ÐZ’kj´dþü¨wÁâÅ?+Vmåp(§¸X_޵[¯Çó‹Ÿ,+D)ôL«PK¼ôøã?€¶düÖ­ºsõêˆçÚuËp¹à ­9Ô¯ŸÜ>ŸÎué‘þcƒA•fgËãõ2ÑX ­éwèž|á…ˆõÿðªU?+VmY]B‚2**t`àÀ°ö{Ùwß)àréòS§˜d¬ÐV%ÔÕ©`Μ°÷ûì³ÏRü¬X´¹›7kËĉaé+³¼\»† S\SŒÚƒ3g*& K_…³fQüÚ“á%%ºï7ŒûùõGé† 8¡aÔ¡¿Àν½©µn1|n·qû Rc|¼â©\Vh/Vßy§þ5aBXBd匜аþÀéÀÛâ Ò¢½¨ML”ÛçÓá¾}ÃÒ_Juµüééºâøqª—Úº%ó燭ø%©:%Eó—,áIJ`ÐÖW{VVY™êΰ_·âœþòK*˜ÚªÙË—‡½ø±™+Vp‚ ´U_wÝϾï?ܶޝw¦OçDs À-@[»hЋӰ]»Tž™Ñãô=|X>·[‰µµT2+´/?úhÄ‹_’÷íÛ*_AÆ €+€‹ø¶G¹éÚ5*¯ÇY_¯²¬, Þ»—jf€Ö6É’¨¿$Õ;zü¥—8ñ¬X´ö `ǨQÊ).V(&ú?W6^{­&ò M­¿úüsm?¾U^—ÇëUÉðá|R[€–C$Ûÿ˘šãí»îjµâ—$¯Ç£?=òÍ  }¯0Ú゜MJ’Ûç3ú;—Ÿ:¥z§Sg“’l÷ÁW…±@+xþ©§Œ­÷â ŒßãÿÝe—ééçžã‚°`-•iiòx½Foùº{·J†WS\œ2Ë˵oÐ Û}ŃÚ1j”²KK™€¬i³ ßï_8k–bƒA9ëë¿D4ËçZôG²h‘i²¬·öôú>ºá[¯ñ§í–uë.è7wÓ&ã~ß›69ØŒÆ-·¶4ÆÇkØ®]ªÈȰÝG|c£¼\ÀÏþ¼4;[#wî4z?Á€ƒU‘‘¡ÎçÏ3¹@¸ýñ±ÇŒŠ_’f¬\yAñKRvi©xí5£¾ ?<ñЇ€¬ÂíDÏžJ÷ûÞòÛãÛop¹ÔõÌ™ÿùÿÃñ™‚ÎçÏ«"#Cd2²@¸Ì[ºÔøýþ‹,¸hñÿ /6:ÆùÎ5§ € ÆC@†«ý{ôhË = VZj5ÅÆþâ±âã-—ßoü@póĉÌÇ‹ÎQNÐÌr8¬±Û¶ä§“&5û˜Þ|³ññ†õ•Œ‰aN€IûË=÷ã­k×¶ø¸×oØ`|ÜU=Äœd‡€vMJRºß¯£½{Ûî£SCƒÊ²²”VYÙ¢W–•¥ìÒR5ÅÙÿEVÝOžTÀåR·ª*&&aç¡IñKR^QQ‹‹_’²ÊÊôðªUFÇ>Ù½».ZÄ…d@Kí2D¯W :Ùî£ç‰ ¸\J©®¶õïO§¦Êètjªí1Ä55©4;[YeeLNVhÉOn“â—¾ÿÄ Ýâ—¤ÔÓ§µháB£14ÅÅ)¯¨ˆ Ê6 ›ÛÖßxc›y ßgey½ÆãùÇ”)ÌOv€æìû+*Œ nSnnØÆ´áúëÇ“¶gUçt2G àR­ ?߸ئ®YöqÝüá‡ÆãZ2os”m@^̱^½äöùT’b»g}½Ê335hß¾°Ž-àrÉãõª1>ÞvIgÏÊçv«Ï‘#<þÛ¼¥KŠ_úþËBÂ]ü’ä 4cåJ£>Î&%iî‹/r¡Yq ðßm{NŽñûý{=jU''GlŒU]»Z=Nœ0£#²¶Ë3ðÓ÷ûçlßn|ýçûïøX_yðAãq^]\l…€F³$ë{ï5.ª‘;vDåÃ7Á˜+»¤Äx¼¯ßw@£U''[½Ž5.¨-×\µ1oÊÍ5ïÇŽYgRRZÇnùÆÅ4í½÷¢>î©kÖ;¿ €m@t\þôt ݽÛhk-¡®Nå™™ºrÿþ¨Ž}ß AÊ,/7úzòøÆFí:Té~?Û€èxf¿$Í^¾<êÅ/IƒöíÓìåËúhŒ×¬ÂÂø^Vo@ €@ €@ €@ €@ €@ €@ €@ €@ €@ €@ €@ ´ÿÔé*´67ÖIEND®B`‚opensurgsim-0.7.0/SurgSim/Testing/Data/Textures/PositiveY.png000066400000000000000000000116241277777236100242630ustar00rootroot00000000000000‰PNG  IHDR\r¨f CiCCPICC profilexÚSwX“÷>ß÷eVBØð±—l"#¬ÈY¢’a„@Å…ˆ VœHUÄ‚Õ Hˆâ (¸gAŠˆZ‹U\8îܧµ}zïííû×û¼çœçüÎyÏ€&‘æ¢j9R…<:ØOHÄɽ€Hà æËÂgÅðyx~t°?ü¯opÕ.$ÇáÿƒºP&W ‘à"ç RÈ.TÈȰS³d ”ly|B"ª ìôI>Ø©“ÜØ¢©™(G$@»`UR,À ¬@".À®€Y¶2G€½vŽX@`€™B,Ì 8CÍ L 0Ò¿à©_p…¸HÀ˕͗KÒ3¸•Ðwòðàâ!âÂl±Ba)f ä"œ—›#HçLÎ ùÑÁþ8?çæäáæfçlïôÅ¢þkðo">!ñßþ¼ŒNÏïÚ_ååÖpǰu¿k©[ÚVhßù]3Û  Z Ðzù‹y8ü@ž¡PÈ< í%b¡½0ã‹>ÿ3áoà‹~öü@þÛzðqš@™­À£ƒýqanv®RŽçËB1n÷ç#þÇ…ýŽ)Ñâ4±\,ŠñX‰¸P"MÇy¹R‘D!É•âé2ñ–ý “w ¬†OÀN¶µËlÀ~î‹XÒv@~ó-Œ ‘g42y÷“¿ù@+Í—¤ã¼è\¨”LÆD *°A Á¬ÀœÁ¼ÀaD@ $À<Bä€ ¡–ATÀ:ص° šá´Á18 çà\ëp`žÂ¼† AÈa!:ˆbŽØ"ΙŽ"aH4’€¤ éˆQ"ÅÈr¤©Bj‘]H#ò-r9\@úÛÈ 2ŠüмG1”²QÔu@¹¨ŠÆ sÑt4]€–¢kÑ´=€¶¢§ÑKèut}ŠŽc€Ñ1fŒÙa\Œ‡E`‰X&ÇcåX5V5cX7vÀžaï$‹€ì^„Âl‚GXLXC¨%ì#´ºW ƒ„1Â'"“¨O´%zùÄxb:±XF¬&î!!ž%^'_“H$É’äN !%2I IkHÛH-¤S¤>ÒiœL&ëmÉÞä²€¬ —‘·O’ûÉÃä·:ňâL ¢$R¤”J5e?奟2B™ ªQÍ©žÔªˆ:ŸZIm vP/S‡©4uš%Í›Cˤ-£ÕКigi÷h/étº ݃E—ЗÒkèéçéƒôw † ƒÇHb(k{§·/™L¦Ó—™ÈT0×2™g˜˜oUX*ö*|‘Ê•:•V•~•çªTUsU?Õyª T«U«^V}¦FU³Pã© Ô«Õ©U»©6®ÎRwRPÏQ_£¾_ý‚úc ²†…F †H£Tc·Æ!Æ2eñXBÖrVë,k˜Mb[²ùìLvûv/{LSCsªf¬f‘fæqÍƱàð9ÙœJÎ!Î Î{--?-±Öj­f­~­7ÚzÚ¾ÚbírííëÚïup@,õ:m:÷u º6ºQº…ºÛuÏê>Ócëyé õÊõéÝÑGõmô£õêïÖïÑ7046l18cðÌcèk˜i¸Ñð„á¨Ëhº‘Äh£ÑI£'¸&î‡gã5x>f¬ob¬4ÞeÜkVyVõV׬IÖ\ë,ëmÖWlPW› ›:›Ë¶¨­›­Äv›mßâ)Ò)õSnÚ1ìüì ìšìí9öaö%ömöÏÌÖ;t;|rtuÌvlp¼ë¤á4éĩÃéWgg¡só5¦KË—v—Sm§Š§nŸzË•åîºÒµÓõ£›»›Ü­ÙmÔÝÌ=Å}«ûM.›É]Ã=ïAôð÷XâqÌã§›§Âóç/^v^Y^û½O³œ&žÖ0mÈÛÄ[à½Ë{`:>=eúÎé>Æ>ŸzŸ‡¾¦¾"ß=¾#~Ö~™~üžû;úËýø¿áyòñN`Áå½³k™¥5»/ >B Yr“oÀòùc3Üg,šÑÊZú0Ì&LÖކÏß~o¦ùLé̶ˆàGlˆ¸i™ù})*2ª.êQ´Stqt÷,Ö¬äYûg½Žñ©Œ¹;Ûj¶rvg¬jlRlc웸€¸ª¸x‡øEñ—t$ í‰äÄØÄ=‰ãsçlš3œäšT–tc®åÜ¢¹æéÎËžwç|þü/÷„óû€9%bKGDÿÿÿ ½§“ pHYs  ÒÝ~ütIMEÝÔ!‘ÒIDATxÚíÝkl•õÀñÿ)ÐBYM*+ pÐ UÁX÷f!Þã&#ÛØÜÅÍm,ˆ¸1&£F}¡FͶÛ2“!•‹PÀ+Š—yІ]B|c0ù•ör± 5‚åRàü÷Âl‰™ÑÒÿszá|>ÿâ›çùŸžçù>?ŠœæB 1%©Ì—@@@@@@@@@@@@@@@@@@@@@€Aaý%ëCÌŤ_…²Bhz£©__Ç9›Î …²BòkYÉúz÷£Uêë¢?_cˆÉ¿ýþ£ýú:Ö^¾6“×qᆠKçÝwù[!†øê—^M¾qŽ—g¼uF¿ìò›“ãñ²ãɯá•/¿RZï¼Kß 1Ä þrA&OÏÕ³V÷Ëþœù`&û?ÿ¯ç €UškÝ¥ë’o £Cƺöº>ÝwÖ†xlȱ使<íåÒ{×]öÖ×y;/“§èÒ¹Kûtß˯^žÉ¾Ïýû¹`•özé+/%ßHGÊÄñ;Æ÷É~'l›»‡u'ïùÅé/–äûí¯ùˆ;îº#ùåÝåáæßÞÜ'û½å7·„aG‡ ˆ×í¯­“b½ðÕ’Ÿ¨GŒ£;FuŸcw‡†JÞëó_{¾dßkÿçÎ;ïL>ƈC#¿¿±¨û¼éw7…ᇇˆ×k°NªõÜןK~²î¯Ú«;«‹²¿š=5±«²+yÏÎx¶¤ßgE{*V¨ ×ýẢìo•+=ýMV±Ö3ßx&ù ÛYÝ«öWeº¯êÎêøþ)ï'ïíéo>]òï± €¢~g¼ú½ê0¿y~¦ûZ°pA8eÿ)iϽ\,áïü›¬®§¾õTò“¶ctG¬ìªÌd?Uû«bgugòžžüö“Þ]=ù3rÌŤcŒÞ3:Ì]67“ýÌožªß«N~úßuÇ]Þ\@ñVoŸLñµ<ñ'’Ÿ¸;Æïˆ‡+’öQÙU÷ÔìIÞËãß}Üꀞ®¦MM±+$ßxóÏKÚÇõw_Ÿ¼‡B®Ï~ãlW¨À‰¬,>l#_›CíÕù+WÄãv&ïá±ï=æê8ÑuÖ?ÎÊä7f¯œÝ«ó_Ó|M&X2eóW§@oÖš+Ö$ß„oñV,;^vBçÖ=,n¸5ùÜüàW¦@o×”ÍS2™®XsÅ wΊ9™<ý'¿9Ù•)²þáÃÉ7㦦M1WÈõè|CŽ ‰­“Z“ÏùÐrU €¤®3ÿyf&SÀe¼¬Gç›ùàÌäsr¬ß>¬Tठ@ˆÙ|çk_|íSÏ“+äâæ)›“ÏõÀpE €dµNÿ×é™|çô§ây._{y&OÿÆ7º"@²\«g­N¾97\¸áÏñú^O>Ǫ+W¹@²^“Z'e2\ü§‹?öø3ž‘ÉG”7lip5 €c­œ½2ù&]wéº=öÆ©“ÝrU‹+Q X«aKC<:ôhò:uãÔwÚËÓ2yú×·Õ»?eùçÀôZ[C[¸ÖýÉǹõ×·~ä¿oÿåíÉÇ\}åêÐ^ßîMòÏMÅ\µùÚäÌQÈbÓ¦¦b6?©¸{Xw¬Í׺ MÛÖÚ­aÕìUIÇÈÅ\¸íW·…Âÿ~O±òª•akíVoNO¾ö~#€Ì«^~ŠN.æÝk¸mbhmlMú =…²B˜Ó2'9&ÝåÝ¡±µ1lŸ°ÝEØ&’m›¸-´ÌiI» eaÅÕ+’÷Ò2§ÅÍo0ôµ Û'„ÖÆÖPÞ]Þo{è.ï“¶L oþm  €¾´}ÂöLžà)–ÿd¹›ß`è/§í8-l™´%T©èós©8ÚÂÎñ;]|&úÃŽÓv„û~z_¿œ{ÙÜen~€  ¿Û5.´5´eòS{{êððá¡­!ì·Ë…g ?í·+,›»¬OϹôgKÝü&€â?Oš7½ÈSÆØÝcC{}{ŸL‡F õíõáϽãn60ì»;,™·¤OεdÞ7¿ À0оÏ0¦cLh¯o•+‹vŽƒ•C}{}èÓáN60tŒé‹¾¸¨ç¸÷š{Ýü&À@œBøð§çëòE™ºFv…º|]Ø[³×]l` Ú3zOhžß\”c7Ïovó›Ly!„š½5!_—#»FfvÌ>óA¨Ë×…w?û®;ØÀ@¶·foXtí¢L¹èÚEn~€ `0L!„0jߨ¯Ë‡ªUÉÇ:Pu Ôåë¾Qûܽ&ƒ}£ö…{~qO&ÇZ¸`¡›ß`L@!œÚyj&7î¨}£Bç©î\€Á€¬¾îƒýKù# @ÿjXã® € € € € € €'‡¡¾Åá|`@€"bˆ¾ `@@@@@@@@@@@@@@@@@@@@@@€Áì?^@~Ö*ÏgIEND®B`‚opensurgsim-0.7.0/SurgSim/Testing/Data/Textures/PositiveZ.png000066400000000000000000000112471277777236100242650ustar00rootroot00000000000000‰PNG  IHDR\r¨f CiCCPICC profilexÚSwX“÷>ß÷eVBØð±—l"#¬ÈY¢’a„@Å…ˆ VœHUÄ‚Õ Hˆâ (¸gAŠˆZ‹U\8îܧµ}zïííû×û¼çœçüÎyÏ€&‘æ¢j9R…<:ØOHÄɽ€Hà æËÂgÅðyx~t°?ü¯opÕ.$ÇáÿƒºP&W ‘à"ç RÈ.TÈȰS³d ”ly|B"ª ìôI>Ø©“ÜØ¢©™(G$@»`UR,À ¬@".À®€Y¶2G€½vŽX@`€™B,Ì 8CÍ L 0Ò¿à©_p…¸HÀ˕͗KÒ3¸•Ðwòðàâ!âÂl±Ba)f ä"œ—›#HçLÎ ùÑÁþ8?çæäáæfçlïôÅ¢þkðo">!ñßþ¼ŒNÏïÚ_ååÖpǰu¿k©[ÚVhßù]3Û  Z Ðzù‹y8ü@ž¡PÈ< í%b¡½0ã‹>ÿ3áoà‹~öü@þÛzðqš@™­À£ƒýqanv®RŽçËB1n÷ç#þÇ…ýŽ)Ñâ4±\,ŠñX‰¸P"MÇy¹R‘D!É•âé2ñ–ý “w ¬†OÀN¶µËlÀ~î‹XÒv@~ó-Œ ‘g42y÷“¿ù@+Í—¤ã¼è\¨”LÆD *°A Á¬ÀœÁ¼ÀaD@ $À<Bä€ ¡–ATÀ:ص° šá´Á18 çà\ëp`žÂ¼† AÈa!:ˆbŽØ"ΙŽ"aH4’€¤ éˆQ"ÅÈr¤©Bj‘]H#ò-r9\@úÛÈ 2ŠüмG1”²QÔu@¹¨ŠÆ sÑt4]€–¢kÑ´=€¶¢§ÑKèut}ŠŽc€Ñ1fŒÙa\Œ‡E`‰X&ÇcåX5V5cX7vÀžaï$‹€ì^„Âl‚GXLXC¨%ì#´ºW ƒ„1Â'"“¨O´%zùÄxb:±XF¬&î!!ž%^'_“H$É’äN !%2I IkHÛH-¤S¤>ÒiœL&ëmÉÞä²€¬ —‘·O’ûÉÃä·:ňâL ¢$R¤”J5e?奟2B™ ªQÍ©žÔªˆ:ŸZIm vP/S‡©4uš%Í›Cˤ-£ÕКigi÷h/étº ݃E—ЗÒkèéçéƒôw † ƒÇHb(k{§·/™L¦Ó—™ÈT0×2™g˜˜oUX*ö*|‘Ê•:•V•~•çªTUsU?Õyª T«U«^V}¦FU³Pã© Ô«Õ©U»©6®ÎRwRPÏQ_£¾_ý‚úc ²†…F †H£Tc·Æ!Æ2eñXBÖrVë,k˜Mb[²ùìLvûv/{LSCsªf¬f‘fæqÍƱàð9ÙœJÎ!Î Î{--?-±Öj­f­~­7ÚzÚ¾ÚbírííëÚïup@,õ:m:÷u º6ºQº…ºÛuÏê>Ócëyé õÊõéÝÑGõmô£õêïÖïÑ7046l18cðÌcèk˜i¸Ñð„á¨Ëhº‘Äh£ÑI£'¸&î‡gã5x>f¬ob¬4ÞeÜkVyVõV׬IÖ\ë,ëmÖWlPW› ›:›Ë¶¨­›­Äv›mßâ)Ò)õSnÚ1ìüì ìšìí9öaö%ömöÏÌÖ;t;|rtuÌvlp¼ë¤á4éĩÃéWgg¡só5¦KË—v—Sm§Š§nŸzË•åîºÒµÓõ£›»›Ü­ÙmÔÝÌ=Å}«ûM.›É]Ã=ïAôð÷XâqÌã§›§Âóç/^v^Y^û½O³œ&žÖ0mÈÛÄ[à½Ë{`:>=eúÎé>Æ>ŸzŸ‡¾¦¾"ß=¾#~Ö~™~üžû;úËýø¿áyòñN`Áå½³k™¥5»/ >B Yr“oÀòùc3Üg,šÑÊZú0Ì&LÖކÏß~o¦ùLé̶ˆàGlˆ¸i™ù})*2ª.êQ´Stqt÷,Ö¬äYûg½Žñ©Œ¹;Ûj¶rvg¬jlRlc웸€¸ª¸x‡øEñ—t$ í‰äÄØÄ=‰ãsçlš3œäšT–tc®åÜ¢¹æéÎËžwç|þü/÷„óû€9%bKGDÿÿÿ ½§“ pHYs  ÒÝ~ütIMEÝ3Ã4–ƒåIDATxÚíÜÝo—åÀñ«ªÅÀ ̬œg_kysãÅ 3ºeF´”ËB „Ȱ1† a@„±ÌèÀÌ EEµé €0A o…ö·#Ï–eIï±ßÃïóùnáñ¹¾\7¤OQD.@Aêå€ € € € € € € € € € € € € € € € € € € € € €y­·GÀ’ËÄﳨ(g@@@€|W(?ð$ðo¬[·´`ïE¹œW€¬:ôT´·WD¿~ß&9¯­­2jj𣳳¤ Ÿ§ïäÙZY¨?—þß>›­[g'þ«WK£¶vgÁ¿+™RW×'¾›ì¼eËž‹ãÇï-쨺ز`ĈqôèÈ(-½šä¼7ÞøU<ôÐ?lU ù®¸¸+55ÍIÎ;þž(/ïˆ/¿üAÁ?[WòÞÊ•k“ DÄœ9[ ¿ ÀUU­ÑÜ\}úÜHrÞ‹/þ>æÏÁƒÈw%%ññÇ?òòŽ$ç}öÙbÔ¨#qåJ_×€|·fͪdÃãFŸ˜1ãeÃ/dÁرIJeÏ%;ï™gþŸ|òÖÀ ßõí{%Z[«bذ“IÎ;p`BLžüvtwûóÎ@Þ«¯_žlø/]º;fÍÚnø€,˜<ùíX°`S²óæÏ!ΜìÁº¸ä»þý¿‰ŽŽò<øL’óv옳fm÷2ÚÈ‚††ÅɆÿÔ©¡ñôÓòPm6€,˜6moìÙóp’³ººŠc„qèÐx/¢ €|7pà…xé¥ß%;oíÚ•†ß`ÈŠÝ»§Çcý5ÉYÍÍ51~ü¡¸yÓ§.@òÞãÿ%víz"ÉY—/ßUU­ñÅ?ôºï :›6-Hv^]]£á²bóæ¹1`ÀÅ$g½úêobË–9ª+€+@Ì»9ššæ%9ëìÙAQ^Þ. ô⠀仔_öÍåŠâÁÿo¾ùK/+yÿ'Nâ/û66Ö~€ +ê꣡aq’³::Ê£ºº%®_¿Ã 'ïR~Ù÷Úµ;£ºº%Ž»ÏËÖ½ gáýÚþ‘).îŠmÛžLöYï+ž5üþ€¬X±âÙ=ú£$gíÛ7%6lX䡺Ü~À-ùŸ~‹7€Êʶhn®‰’’ΟõÕWߊŠö8{véµïJJ:cûöYI†?"bÞ¼&Ã/dÅêÕ«£¢¢=ÉYMMóâµ×~í¡º¸dá 0ḟqðàýQ\ÜÕã³Nž#GË—ï2µ ù€ÒÒ«ÑÚZÇÞã³nÞìãÆŽ––jë @Ô×/O2üß]# ¿ À‘ `Ò¤wbÿþ’üwÞÿg1qâ»>ë-…ôë÷mtt”Ç!§{|Ö×_/*+Ûâôé!&Õ€,hhXœdø#",Ødøm6€¬lS§¾{÷NKrÖ®]ODmíN*… x!Ž»/ÊÊÎõø¬3gGee[\ºt· u žþI†¿»»WÌœ¹Ãðß"ùÓ€·âßÁ éǧOßì³ÞõõËã½÷~n2] 󚑵”•‹O?ýq’{92*ÆŽý nÜèãr ššæ%þ+WúÆŒ/~ +æÌÙS§¾žä¬%KÖlj#ˆñ¾»sRGB®ÎégAMA± üa pHYsttÞfxIDATx^íØÍqÛHEa%ád´w*Þ*Yj£%ƒÐÆUJ@9¨\ÎÀ9x°ÑýúöAÎx¨;<_½‘ ªÒÃo†–tÿzøÂ0Œ×.ÃXé2Œå.ÃXé2ŒåtÒ=ðÙH§¤ xNIð ’.àA:%]ÀƒtJº€é”tÒ)é¤SÒ^Rxrn;óÅ?½çÓªÕßK7^öðQvÙ–Ë’î¤Û² é¦c‹îñ} 1î]{×ë®tóÓìÚÉìbJºý ¶s0| :lýWéöž,îÚé¶ä!Ýt¬þ“/,Êpr3y›Š¿;Ú»{ÒÍïžvòðFÃ?e— (M–ÓÚtëí|R8º$ÝfÎßœø”‘anã2ü›ª3Õ¢Ùµs×50L·]Çãgæ*Ý^¨“#ÕGŽOyÊ’î„Û¸ éÊ4Ëñ–é¶±U×SÿV>9]U³ñîL7>A”!Ý› ·qÒ•™¥;ÚÿTºù„ê5GÏÌšn8óô¡v¦ûoîºã;6Dº#§Û’‡¿uõˆ¶·k!ÆêüÆ’œK·›P=ñ½ÚtÃ[,‘·é޾6ÝÏNº7rº-yH7†´o!†Ì ºu&ݲ%N&üb/Ýçñ`›î¹Ë¾iºWüîÿÛé¶ä!Ýt¬J%n¼;bèpï3ó<Ýø‚“éü¹Þö·×9<¿ÕÏÏ«ùeß"]Œl·= é¦cGåÿ:qQî]ˆ²IÖý¬/¢O€ÓtË~Ø{”í]ê Ýðï¡M·zÔ—Ý&ÝòѺÏðw,Ý–mH7[„ãeÝă Ĭ;²gé–/‚þêWµ}#ŒÒm/L’“/þôÒmg}ëýw¬#|•ì|x¹á.CºéØ*nAÛ »h!Në½`×-?-ôÐ[Zâãtç[ëBNè̾t×W&Ý?#ÜÃeH7K:9Í7¥ÎB O³yzÏ–å2ô§ó§å“ð¦Ó5LÒ­s&ÑXoѬL¹’îÌÓåy(ÜÃeî2]ÀtJº€é”tÒ)é¤SÒì{cX½Åê €PX½Võë®»NßBªHsЦÙHnß[„Õ[¬Î…ÕÇWÿìg?«¯!u‘Ö¡‰†¿ïÝÁê-Vg„ÂêÕê?þ¸®“¶–¢¹S sßãÀê-Vg„ÂêZ}íÚµúkÒ5Òêáì;–"Âê-Vg„b¹:M¿wd °±<ó™Ug„b­úm·Ý¦ÉЭÁ&uŒµ™/“Yu@(Fª?ýôÓZˆ Ù,l[7™ù‘dVJÆÕÏ9ç½9IÙDlg{d<ó³’Yu@(ùU_¶l™Þ“ä„l+68˜üf~r2«Î%›êW^y¥ÞŠäl4¶¼)ÙÌ|2«Î%õêgu–ÞXC¶CP“Ôg>„̪3BI·ú/~ñ }/±ŒŒbbÒùp2«Î%¹ê÷ß¿¾…22‘ÙHnæ[$³ê €PR©Îoé!2ë7¥2ó]Yu@(ïþÐCék™ P…áÏ|wdVÊ`«ŸvÚiú A #µŽÁÎ|2«>GoG!Ä òsˆI°ýÄ0sÞþñ5áúÊÿÔÛñ7e‘qÕŸyæýEàÄØþú¸a³|âú­.–ë™p31Bé·ú·¿ým­ü€Û€Œ1"–Ï»«Î(È–D®~ÅWhÝpàÄØþ`d1”Q°yÞWP0-‰V½õŸ«? ÆÀö·Ää?Ñ>k罌«Î(È–D¨~ýõ×k­vc`û[EFÃÚvÎ{WP0-é´úòå˵JÀˆ1°ý ãŠÁí ç}&\u@Á@¶¤£êW]u•Þ¿;àÄØþÎÑÅ·JÞç}<®: ` [Òzõ .¸@ïÜ5ðb lÇÈc ["×ó> ®: ` [Òbõ“O>Yïø1¶? 2Òî`ò;ï“ãª3 ²%mUòÉ'õ†Ñ€c`ûc!ƒ#³ó^ WP0- ¯Þ×Çvˆ1°ýqó!£’Íyo€«Î(È–„T¿å–[ô&½? ÆÀö÷ œ÷Æ¸ê €‚lI³êCø‘¼ðb l4û¡ÄIŸ÷@\u@Á@¶¤Aõ'žxBßÛ/ðb l¯ÈÀa˜˜tÏ{8®: ` [R«úªU«ô]C~@Œírp0& ÅóÞ®: ` [2aõ3ÏÐ-ø1¶?Y|\8ýº«Î(èqK~ö³Ÿié¤c`ûSF Žb,ztÁUgô²%_|±Íø1¶?}ä0âXvO/nãpÕñ·äÞ{ïÕŠy? ÆÀögIÎŽ‰ï6e\u@Aä-ùÉO~¢å²~@ŒíÏ9˜8¢]Ùm<\u@A´-9ãŒ3´PfÀˆ1°ýy!‡ǵ¢¹ÍH\u@Aœ-¹ñƵJ~Àˆ1°ýÙ!G‡¶â¸ÍL¸ê €‚[òÍo~SKd ü€ÛŸ#r`qtÛ&‚ÛŒÁUgt½%O?ý´Þ?WàÄØþL‘c‹Ü*]»Íx\u@Aw[²téR½sÞÀˆ1°ýY#G‡¹%ºs›IpÕmÉç?ÿy½möÀˆ1°ý¹#Gº :r› qÕ]lɪU«ôž€c`û Ç;˜.Üfr\u@Aë[òÿñzC#Àˆ1°ý6CãFënS WPÐî–üô§?Õ»Ù~@Œí7ƒmòÚu›º¸ê ’"ðb l?I@Ëüà?À±è$Qtn{D>, nˆ«Î(Ù’ýöÛãÐ+úü `Dѹí9þ0‚‰ q›p\u@Aã-ÙsÏ=1}£ÏßIÛÞ€LFc·iWPÐlKvÞygŒÀÐço€$ŠÎí+€)L@3·i WPÐ`K,X€Íúü `Dѹb°†Ùhà6-âª3 ênÉ6Ûlƒm úü `Dѹb 0ˆ±Ôu›vqÕµ¶d뭷Ɔ }þ0H¢èÜ 1ØÄÌÔr›ÖqÕ“oɼyó°ÕCŸ¿ ’(:·CC,f1“»M¸ê €‚ ·dË-·Ä&}þ0H¢èÜ1 XÆ(&t›ŽpÕ“lÉÝ_Ðço€$ŠÎí0““¸Mw¸ê €‚Y·d°òãÐço€$ŠÎí`™éÏ‚fu›NqÕã·äå/9¶tÀèó7€@EçvȈuÀDJŒw›®qÕc¶dÛm·Åf}þ0H¢èÜ1XÉ:ƸM\u@ÁL[²Ã;`>$Qtn‡Ø eŠ™Ü&®: `ä–ì²Ë.ØÀÐço€$ŠÎmˆ™ÀV#5´Χ¼Mˆ>$QtnSÁ}f\Õmbâª3 ¼-Ùwß}±ié ÏßIÛ„c©ºMd\u@AyK>ø`lWRèó7€@Eç6-Ä^ÊnŠˆ«Î(pM¹üò˱Q©¡ÏßIÛä“ÑçgB¬Y³[” Ú½0H¢èܦˆX´? ´{ `Dѹͱ#SÇ0Àzë­‡Þgv¯ ’(:·y vcêÀŸyÉK^‚Æç‚v¯ ’(:·Ù ¦{êÀÇwÜqG´<#´{ `DÑ¹Í ±&˜TgX€7¾ñhv^h÷À ‰¢s›bP°ªn0G}4ڜڽ0H¢èÜæ‡Ø «LÀ³žõ,ô8;´{ `Dѹͱ)VØ €¹sç¢Á9¢Ýk€$ŠÎm–ˆYÁ¶ÚÆh¼æ5¯Ak3E»×IÛ\Ë‚yµŠÅ8âˆ#ÐÔ|Ñî5€@Eç6cĸ`aía.-Z„vfv¯ ’(:·y#ö#k s°å–[¢—Y£Ýk€$ŠÎmÞˆ}ÁÈZÂVdóaŸ³¢Ýk€$ŠÎmö´ûq¡í€Þn€üë¿þ+Zh|ÍõaDѹµ€X¾æá1Üøò—¿¼ºU.¹älHÛœ~úé¨Ñ*×_= ´Í‡?üaÔh•Ûo¿Úæýï?j´ ´Íᇎm³Ùf›¡F«¼ñoD¶éè¸wß}wh›vÚ 5Zbã7†© 9ø­Eî7&mýЊ+°íÁp0(Ð6 @Ø~ûíama´î´C €SO=[Ñ* ÀmÃp0”£Ž: @þp 'œþùØŠVa8h€ƒ Èoþñÿ6×”ü`Þ¼y …à`8JŠpÓM7Áæš’yì¿ÿþÒ)€Âp0 %Å›_zé¥0»FäúЇ´S …à`8J¢ œzê©°¼úä[l±…vŠ 0 @I7n¾ùfX^}² €ýöÛ}b¬ƒà`8Jº \vÙe0¾šä .D“¦`( ÀÁP’á”SNýÕ!Ϙ7oš4@a8€’z4ûŽ  à ƒB‡ÖÁP€ƒ ¤ÂÅ_ œ˜Ü`ñâÅhO €Âp0 %ƒN<ñDXádä ,@{J0€ƒà`(yÀòåËa…“‘U¼ãï@o¦ÃP€ƒ äÂÙgŸ Cœ€¬`£6Bo¦ÃP€ƒ dwÞy' qò €1?í‹ 0 @É&„+¯¼¶8™ÀqLJ®Œ‚ 0 @É)„ ÿZ@&°Í6Û +£`( ÀÁP2 €n¸æ8–àío;Z2 …à`8Jf œsÎ9°È™É!6Ùd´d ÀÁp0”üàŽ;î€EÎLò°ï¾û¢3ÃP€ƒ ä¬—v,Z´Í @a8€’eãÿnpÚ°Ë.» ca( ÀÁPr €Ïþó°ËQ$Ç{,:1 …à`8J® ˆŸÀ4+$óçÏG'fƒ 0 @É8V®\ Ó¬j¼ë]ïB&€ 0 @É8„³Î: Ö9T`óÍ7G&€ 0 @É;n¹åXçt’ €·¾õ­èÁd0€ƒà`(y€ 6-‘dlºé¦èÁd0€ƒà`(ÙÀÈ¿–^Tâã¬0€ƒà`(Ù€Pý™‘éÀl€L @a8€b!¾ô¥/ÁFבXpÀøêëÀP€ƒ XA\ f:Eb°þúë㫯@a8€b$î¾ûn˜é)Àþûï/½& …à`8Š‘.½ôRXjZÐì_ÿ€Âp0 ÅN”L4ûÓ… 0 @±‚û/É@ƒoþq0€ƒà`(¦À};PÐà{ÿË0€ƒà`(¦@пFÔý«¿ …à`8ŠµÐ¿œ@ÔýäŸ* …à`8еÄÛ½]‹ì¶ÛnøŠ›ÂP€ƒ  €o|ã0Ùöh9ž~ZžsNŠò¯mI¾|£*wÁžÊ°¥ÊBZ½úiXmK´üG@÷Ý·—7b©È¿¶¥òŒÙR¹ öTî„-UÒÐ^{ݧNÛÚáÿÃÐX»öo¾’mKå³¥rì©Ü [ª,$£GY;Ðxä‘c¼ùJHþµ-•Ì–Ê]°§r'l©²ŒŽ9æ‘!À3ÏüÖ®´ä_ÛRyÀl©Ü{*w–* )é·¿}fpðøãK½áJKþµ-•§Ë–Ê]°§r'l©²’–.}|ppÿý/ó†+-ù×¶Tž.[*wÁžÊ°¥ÊBJzÙËîV|ýëçz“•œük[*O—-•»`OåNØRe!1{î×a¾a´ÿò/{x“•œük[*–-•»`OåNØRe!1í±Ç¿À|Ãh!N?=áoþqò¯m©Â›¦¤å_ÛRy¢l©Ü{*w–* ëˆ#Ά)×§y,_¾À›¦¤å_ÛRyœl©Ü{*w–* kÁ‚å0åú4€y£”ºük[*“-•»`OåNØRe!m}ìcðåº4 €‹.ÊäÛÿük[*Ï’-•»`OåNØRe!m|ðE°æš4 €ú§­½QJ]þµ-•gÉ–Ê]°§r'l©²¶¶ÞúŸ`Í5i't¼7GÈ¿¶¥ò,ÙR¹ öTî„-U’×ñÇŸƒ®C“¸ä’¼9Ê@þµ-•É–Ê]°§r'l©²¼8àtšÀ¾°¥7GÈ¿¶¥ò ÙR¹ öTî„-U’×–[~]‡ÚpÊ) ½!ÊCþµ-•É–Ê]°§r'l©²ƒ.<6=1µàÒKßà Qò¯m©¬|f €«¯ÞÍ™\å_ÛRyf ¡üFÚQe!Oí¶ÛÕ°ò˜%n¹esodr•mKå™IP €†òiG•…<µùæ·ÀÊg`\œxâbo^2–mKå™IP €†òiG•…lµxñ‰0ôQŒ €3Ï<Ê›—Œå_ÛRy` ¡üFÚQe![uÔ™0ôQŒ €Ï|fo^2–mKåIP €†òiG•…lµÏ>Ÿ¡b\¬X‘ÿG9ù×¶T˜Åh(¿‘vTYÈVÛm·†>Šqpç{ó’±ük[*L‚b4”ßH;ª,d«7¾†>ŠओŽ÷†%où×¶T˜Åh(¿‘vTYÈYÇl½ÂŒpöÙGxÃ’·ük[*OK‚b4”ßH;ª,ä¬#Ž8¶^aƸüò½½aÉ[þµ-•§%A1Êo¤UrÖÞ{_[¯0c¬X±½7,yË¿¶¥ò´$(@Cù´£ÊBÎÚ~ûÿ;ðŒpûí/ð†%où×¶Tž–Åh(¿‘vTYÈY/xÁŒ ::Nà͈ù×¶T’Åh(¿‘vTY0¡|à4ý:ü8ë¬wz3bDþµ-•‡$A1Êo¤ULèï< F¿? ~¨Ê¿¶¥ò$(@Cù´£Ê‚ U?Ô€+®x­7#Fä_ÛRyH ¡üFÚQeÁ„^ûÚ+`ôëðàškvöfĈük[*I‚b4”ßH;ª,˜ÐÎ;_£_‡+WÎ÷fĈük[*I‚b4”ßH;ª,˜Ðüùþ‡BûðÅ/¾Ô›#ò¯m©<$ ŠÐP~#í¨²`B/}éaôëðà®»žï͈ù×¶T’Åh(¿‘vTY0¡ç?ßÿ»`~Ü{ïzÞŒ‘mKå!IP €†òiG•Zo½{aô똣g@ùýïŸôÄŽük[*I‚b4”ßH;ª,XÑ“Oþ^Ç^™kÖ¬™šíÚž¥@XÕ±T‡~ß«³:–j"&¯wP¦ýБG‰WÕ$õ¦„Àê‰Vï÷í°:«c©&bò°û)¦Àa‡†WÕ$õ¦„Àê‰Vï÷í°:«c©&bò°û)¦ÀˆWÕ$õ¦„Àê‰Vï÷í°:«c©&bò°û)¦À>ûìƒWÕ$õ¦„Àê‰Vï÷í°:«c©&bò°û)¦Àž{î‰WÕ$õ¦„Àê‰Vï÷í°:«c©&bò°û)¦À®»îŠWÕ$õ¦„Àê‰Vï÷í°:«c©&bò°û)¦À;ì€WÕ$õ¦„Àê‰Vï÷í°:«c©&bò°û)¦À¶Ûn‹WÕ$õ¦„Àê‰Vï÷í°:«c©&bò°û)¦ÀV[m…WÕ$õ¦„Àê‰Vï÷í°:«c©&bò°û)¦À[lWÕ$õ¦„Àê‰Vï÷í°:«c©&bò°û)¦À‹_üb¼ª&©7%VO´z¿o„ÕYK5“‡ÝO1-6ÝtS¼ª&©7%VO´z¿o„ÕYK5“‡ÝO1-6ÜpC¼ª&©7%VO´z¿o„ÕYK5“‡ÝO1-þê¯þ ¯ªIêM Õ­ÞïÛauVÇRMÄäa÷SL €ç=ïyxUMRoJ¬žhõ~ß«³:–j"&»ŸbZ<÷¹ÏÅ«j’zSB`õD«÷ûö@XÕ±T1yØýÓàÙÏ~6^U“Ô›«'Z½ß·Âꬎ¥šˆÉÃë­·^U“Ô›«'Z½ß·Âꬎ¥šˆÉÃxI}RoJ¬žhõ~ß«³:–껟bÚÅŸþô'½;!„ü“‡ÝOÁ „+Œ ü¡>ü¶¨1¬žhõ~ß«³:–껟bÚÿ#pX=Ñêý¾=Vgu,ÕdÜæ·6€Õ­ÞïÛauVÇRMÆ}(ÿ"XX=Ñêý¾=Vgu,ÕdÜ_ãGA4€Õ­ÞïÛauVÇRMÆ}? ®¬žhõ~ß«³:–j2îÃàøqÐ `õD«÷ûö@XÕ±T“qÍÓVO´z¿o„ÕYK5÷aø#!Àê‰Vï÷í°:«c©&ã~$$(|X=Ñêý¾=Vgu,ÕdÜ…ßj«­ðªš¤Þ”X=Ñêý¾=Vgu,ÕDLv?Å´ØvÛmñªš¤Þ”X=Ñêý¾=Vgu,ÕDLv?Å´Øa‡𪚤ޔX=Ñêý¾=Vgu,ÕDLv?Å´Øu×]ñªš¤Þ”X=Ñêý¾=Vgu,ÕDLv?Å´ØsÏ=ñªš¤Þ”X=Ñêý¾=Vgu,ÕDLv?Å´ØgŸ}𪚤ޔX=Ñêý¾=Vgu,ÕDLv?Å´8ðÀñªš¤Þ”X=Ñêý¾=Vgu,ÕDLv?Å´8ì°Ã𪚤ޔX=Ñêý¾=Vgu,ÕDLv?Å´8òÈ#ñªš¤Þ”X=Ñêý¾=Vgu,ÕDLv?޲fͼª&©7%VO´z¿o„ÕYK5“×;(ÓàÉ'ŸÄ«úàMozÓ‡?üáeË–Ýÿý?þñÿ÷ÿWéw¿ûÝã?¾zõêK/½ôƒüà¾ûî»õÖ[ëÇV?÷¹Ï}éK_ºÇ{üíßþí™gžyÛm·}ûÛßþå/ù§?ýé™gž‘¯å¡‡’6|òÉo{ÛÛvÜqǼàÏ~ö³×[o½6Ú蕯|å›ßüæ|ä#W_}õ<ð“Ÿüä÷¿ÿ½”[»ví÷¾÷½{î¹ç¢‹.:öØc_ÿú×Ï›7ï/ÿò/¥Ü_üÅ_¼ìe/ÛsÏ=>úèsÎ9çÎ;ïüÎw¾óë_ÿZÊýáøïÿþïû·[±bÅ’%KÞúÖ·þÍßüͦ›nú¬)6Þxãí·ßþ-oyËÇ>ö±k¯½ök_ûÚOúSy‹”ûÍo~óè£Þ}÷Ýï|ç;7Ùd“ç<ç9{íµ×W\!wûãÿ(¯<î¸ã¶Øb yf¹áÒ¥K{ì1y—ÔýÄ'>±ÝvÛÉSÉãp ßüæ7å1䫸ä’K^ýêWË—)_¬´åÞ{Kzrà 7xà믿¾´N¾ðo¼ñW¿ú•tX¾Ò£Ž:j³Í6“Ò¯yÍk.»ì²'žxBJãß8þøã·ÜrK)±`Á‚O~ò“ßýîw¥´ü¯üZVd]þ©¼F^)¯—wÉ{år¹›ÜSî,÷—*RK*J]©.Ï O"Ï#O%Ï&O(Ϲùæ›Ë.ÈóË[^õªWIŸ-Z$•/V:)…¤uRWz%ÿÂò¼ç=OªKÇäõÒLiŽôùÝï~·¼¬.gIæjçw–!ü‡øùоÿýï˘ɺ|±<òˆ ÒI'$“#Û$£"Ud6¤c2 çž{®ì¾ôMöúÅ/~±üâ‡?ü¡LÈ6Ûl#_òÃ?,c&Sý³ŸýLÆ^fõ ƒúío+}“Zò•J·e8e$/^,·=ñÄ¥èyç'ëï}ï{¥ÿË—/—SsÈ!‡<ÿùÏ—–>õÔS2rR|ðAyÈ¿þë¿–á—3%3#‹2Ïò‚U«VÉ‹¥ÏòÆë®»Nnò¾÷½On(*7—‘–B²)RTJËáú»¿û;yé›<˜ì©<¤<ª<ðî»ï.;"_‚|!óçÏ—úÑ~ôõ¯ýE/zÑk_ûÚ_üâwÝu—LÂa‡&³!ÇY@Z'”;ÈôÊÍe÷e¼¥Wrpdþe£åäåײ"ëòOå5òJy½¼ë”SN‘;È}änrOéáG!O¾Ûn»½á oÇ–ÿ•_ËŠ¬Ë?H]¹y_ˆ1Êã9¦ý {ŒF‡À`0bq_uåæ½ ;¨>ïð@毀À`Ä4â¾êÊÍ{AvY}Þá€<"^€ÀˆiÄ}Õ•›÷‚<€ú¼ÃÙ6¼6: €Óˆûª+7ïÙõy‡2Óxmt  ¦÷UWnÞ 2±êó?dŸðÚè0 @L#ܼdÔç~ÈøâµÑa0 €˜FÜW]¹y/ÈpªÏ;ü'Âk£Ã`01¸¯ºró^ŸQŸwøð|¯€À`Ä4â¾êÊÍ{Aì]}Þá€L^€ÀˆiÄ}Õ•›÷‚ÌŒú¼Ãaà 7ÄËãÂ`01¸¯ºróøˆ±«Ã—sçÎÅ;âÂ`01¸¯ºróøˆ±«Ã—rñޏ0 @L#î«®Ü<>r¸ÔáËŒq=¼#. €Óˆûª+7¸™:|™p衇âqa0 €˜FÜW]¹y|ÄØÕáËŒ€÷¼ç=xG\  ¦÷UWn1vuø2#à£ý(Þ€ÀˆiÄ}Õ•›ÇGŒ]¾ÌˆdLñ¦ˆ0 @L#î«®Ü<22xêí£à¯xÞ€ÀˆiÄ}Õ•›GF,]½ÝctÈüá}a0 €˜FÜW]¹ydd¢ÔÛ=F€ 1Þ€ÀˆiÄ}Õ•›GFÆR½Ýct4;Q0 @L#î«®Ü<229êí£@6ï‹€À`Ä4â¾êÊÍ##Û§Þî1:9™xk,  ¦÷UWn9eêêUf ™H¼; €Óˆûª+7‰L—ºz•`ï½÷Æ»cÁ`01¸¯ºr󘈙««W™1ä¹ñîX0 @L#î«®Ü<&ò êêUf 9Ûxw,  ¦÷UWn9§êêUf A†7ˆ€À`Ä4â¾êÊÍ£!#§~>’q  €ÀˆiÄ}Õ•›GC&Pý|$ã`Ÿ}öÁ=¢À`01¸¯ºróhˆ«Ÿd\È1Æ=¢À`01¸¯ºróhÈaT?ɸ Ã=¢À`01¸¯ºróhÈœ¨Ÿd\r8q›îa0 €˜FÜW]¹yäp©“ÏÄ, _îÔ= €Óˆûª+7ƒ<ƒ:ùLÌ1@<€À`Ä4â¾êÊÍã0òÁ—™%.\ˆ;u€À`Ä4â¾êÊÍã ®N>³€ ç7ë€ÀˆiÄ}Õ•›G@N¢zøf€vÚ ÷ë€ÀˆiÄ}Õ•›G@¬[=| ³€Lî×1 €Óˆûª+7€Ì€zøæÈ³ŽG¼÷ë€ÀˆiÄ}Õ•›G@\Tžd<³€ ^Ó5 @³¸ð ¥Ÿ_ýêWew¤á²qbFÒ ñ)iÝÞ{ï-“ #C²á†ÊüÈ#É×rë­·ÊÉ”;í´Ód̾õ­opÀRNöBlëç?ÿùÂ… åË‘c|ß}÷É×(_ ÙK^òQ©.3É`4«+7ïF0â¾êÊÍ;BÚ®^=!õ@6u:€  }f0d#q_uåæ!Û¡^=!õ@<êt@@úÌ`È>F0â¾êÊÍ;Bޤzõ„Ô aîܹ(Õ6 9x é3€ ûÁˆûª+7ï1guéÉ©ò…¡ZÛ0äà1¤Ï €ìc#ܼ ¤¨ºôäÔ9¨Ö6 9x é3€ ûÁˆûª+7ï™XuéÉ©‚úBë0äà1¤Ï €ìc#ܼudºÔŸkÑ$ôœ´@@úÌ`È>F0â¾êÊÍ[G¦Wý¹M@Ž=j¶ @@úÌ`È>F0â¾êÊÍ[G£ús-š€ §eÛƒ  }f0d#q_uåæí"S­Î\—†pðÁ£r{0äà1¤Ï €ìc#ܼ]ÄÕ™ëÒ0ÄËP¹=rðÒg@ö1‚÷UWnÞ.â-êÌui‚º@‹0äà1¤Ï €ìc#ܼE¤ÏêÉ hò…¡~K0äà1¤Ï €ìc#ܼE¤„zrš€ÐîÏcÈÁcHŸ ÙÇFÜW]¹y[Ôúù_U‚@ OÑ 9x é3€ ûÁˆûª+7o Ù\uãf€œ43²Œ¸¯ºróVhðñŸ¡Ðâ_`ÈÁcHŸ ÙÇFÜW]¹y+4þöGh2.xœ0ÒI€ô™À}Œ`Ä}Õ•›‡#Û¤B  »Ž' ƒ ;Ê>3²Œ¸¯ºróp¤ÛêÀ!´Çs ž( €<€ô™À}Œ`Ä}Õ•›‡#Æ«B  ȼâ¡`ÈÁcHŸ ÙÇFÜW]¹y 2!ê½´:(0äà1¤Ï €ìc#î«®Ü<ÙõÞ@Ú ZF0â¾êÊÍ#6+÷bÈÜãÁƒÇ>3²Œ¸¯ºróÆÈtÉý‡‚Ì4³> 9x é3€ ûÁˆûª+7o†ÌŒÜ\h-ôvm!s€'­@@úÌ`È>F0â¾êÊÍ›!}–›·HË È—‡MŠ] ó~Ã|Æ0’=f[™§å?’_迵%¼Ð$ðB“À M/4‰úUZÈoÎÊN ó £ýKù]9l5à…&š^hx¡IÔ¯âÉ'Ÿ¬:m8ÀA[Mx¡Ià…&š^hõ«„¸ñÆ«NN' ´ûóâ#/4 ¼Ð$ðB“À M¢~• ¿üå/ÕW“ ý†Š„€š^hx¡Ià…&Q¿J…/~ñ‹ê«É€°þúëÃ\S^hx¡Ià…&šDý* Ö®] KM+öߘk À M/4 ¼Ð$ðB“¨_%Á­·Þ KM+„„~/4 ¼Ð$ðB“À M¢~5|Êÿú/$ ý—x¡Ià…&š^hõ«áãþô_I,„T¾^hx¡Ià…&šDýjà¸oþq¤©üx¡Ià…&š^hõ«sÓM7ÁFב^IüÅ`x¡Ià…&š^hõ«!£õ×#ÉHâÓà…&š^hx¡IÔ¯†Ìu×]-‘d›o¾9Œv¨À M/4 ¼Ð$ðB“¨_ –þð‡°Îé¤ïz×»`´C^hx¡Ià…&šDýj°\~ùå°Îé¤Âüùóᵃ^hx¡Ià…&šDýj˜¬Y³¦Y!á8öØcᵃ^hx¡Ià…&šDýj˜œsÎ90Í €°Ë.»Àn‡¼Ð$ðB“À M/4‰úÕùÊW¾»EÚ°hÑ"Øíð€š^hx¡Ià…&Q¿ K–,]Ž"íöÝw_8îÀ€š^hx¡Ià…&Q¿wÜqŒr’a“M6é x¡Ià…&š^hõ«AñÔSOÁ"g&‡xûÛßÓðB“À M/4 ¼Ð$êWƒâª«®‚EÎL l³Í6ðÝÁ/4 ¼Ð$ðB“À M¢~5Æ|ëg™Là¸ãŽƒïx¡Ià…&š^hõ«á°téR˜ãX2 a¯½ö‚õx¡Ià…&š^hõ«°jÕ*ØâläÂFm÷ðB“À M/4 ¼Ð$êWCàç?ÿ9 q² €w¼ãpß/4 ¼Ð$ðB“À M¢~5–-[Cœ€¬@X°` ¸oà…&š^hx¡IÔ¯z硇‚NFn°xñbpßÀ M/4 ¼Ð$ðB“¨_õÎø¿÷[%·ò3#á…&š^hx¡IÔ¯úåÆo„ NL† Ì›76ÜðB“À M/4 ¼Ð$êW=òè£Âþêg,\¸6ÜðB“À M/4 ¼Ð$êW=òÉO~öW‡<@Øo¿ýàÄ=/4 ¼Ð$ðB“À M¢~Õ·ÝvŒ¯&Ù€°Å[ÀŒû^hx¡Ià…&šDýªüqX^}r€}èC0ã>€š^hx¡Ià…&Q¿ê…3Î8–WŸœ@ØÿýáÇÑš^hx¡Ià…&Q¿ŠÏ­·Þ ³kDæ ôõAðB“À M/4 ¼Ð$êW‘yì±Ç`sMÉ?N8áXr\à…&š^hx¡IÔ¯"sê©§Âæš’‡r\9"ðB“À M/4 ¼Ð$êW1¹á†`p˜aûí·‡1Ç^hx¡Ià…&šDý*ÿþïÿk £ýÐÛ 7ÞÞx¡Ià…&š^h¸Œy†¦@ ÕgåÊ•zù–I[Ò/s–}|n¸¾÷ðíz»¶~c¢ÜsÏ=zÛìÁ™¨€$ŠÎmöˆ‰ÁÎÚÀýX®gÂÍ4è¾ÿýïëóg¢> ’(:·y#ö#k s°dɽsÞàLÔ‡@Eç6oê~Üÿ¬˜ aÙ²ezóŒÁ™¨€$ŠÎmÆÔúYb1„{ï½WïŸ+8õaDѹͱ,˜W« á±ÇÓY‚3QIÛ, ÿȇ™°Âþð­’8õaDѹͱ)V˜€‹/¾X«äÎD}$QtnóCl †Õ¦@¸å–[´PfàLÔ‡@Eç63Ä `UÝ`=„¯}íkZ+'p&êà ‰¢s›bM0©Î`ü™ÿú¯ÿÒrÙ€3QIÛlS‚=u üñÔŠy€3QIÛ<;‚1u œwÞyZ1p&êà ‰¢s›bG0¦Ža,_¾\‹fÎD}$Qtn3@Œ–Ô= €i¬ZµJë¦ÎD}$QtnSG,f€ÏC=¤¥“g¢> ’(:·I#æŠ`k×®Õêé‚3QIÛtÛE„0×”tÁ™¨€$ŠÎmºôëu €€À i¡s›. €B €@p&êà ‰¢s›. €B €t?2g¢> ’(:·ÉáL†Ph  ¿¸á†ô×i3QIÛ´{)» ("®: ÀÛ’ÛoÇÃ$ÎD}$QtnBŒ¥ê6‘qÕÕ-Y½zµ®¤ÎD}$QtnSA,E½¥ê61qÕ#·ä+_ùŠ.&ÎD}$Qtn“@̶©€ðàƒêúðÁ™¨€$ŠÎíð¡L1“ÛÄÁUgŒÙ’o}ë[úÎD}$QtnެdcÜ&®: `ü–üçþ§þÓ!ƒ3QIÛ!#Ö)1ÞmºÆUg̺%>ú¨¾`°àLÔ‡@Eçv°ˆiÀ>¦3«ÛtŠ«Î(˜dK¾÷½ïék† ÎD}$Qtn‡‰ØŒ£Â$nÓ®: `Â-ràLÔ‡@Eçv€ŒqaB·éWP0ù– ö³"p&êà ‰¢s;4Ä"`30¹Ût«Î(¨µ%ßùÎwôŃg¢> ’(:·ƒBÌ613µÜ¦u\u@AÝ-Y³f¾~8àLÔ‡@Eçv8ˆ-À ÆR×mÚÅUg4Ø’¡ý Iœ‰ú0H¢è܄ɸc·iWPÐlKxà}×À™¨€$ŠÎí+€)L@3·i WPÐxK†ó™q8õaDѹí÷)oÒØmZÁUg„lÉ@>;g¢> ’(:·ý¢Ÿð\‹· ÇUgnÉŠ+ôí=‚3QIÛ‘ƒ ¨C Ûâª3 ·ä3ŸùŒÞ¡/p&êà ‰¢sÛräqøkî6!¸ê Ò œ‰ú0H¢èÜ’f0:áŸÿù¹«WÏ¡ÓÉsVω.)ê=5xÉÇQOœ@¿¿-j¥úm·½ÐjèbPHŽ6yíºM]\u@Aë[rýõ¯ôF‡´Ôl’CãFënS WPÐÅ–\yå^ÞQÀ+9Î8ØÁtá6“ãª3 :Ú’sÏ}›7FÔ@Å f–dé6èÈm&ÄUgt·%§œrœ7LÔÅ faæ–èÎm&ÁUgt½%wÞ¹±7UÔ°Ä *’c‹Ü*]»Íx\u@A„-¹îº¼ñ¢$5]r`qtÛ&‚ÛŒÁUgÄÙ’‹/>È2j(bP%ÉQÅ¡í€8n3®:  Ú–œzê½Q£!µNrHq\»!šÛŒÄUgDÞ’[o}‘7sTÏbP«çÈÁÄí’Ènãáª3 âoɲe{zÃGõ)€yÉ‘Äáì˜ønSÆUgô²%K—í Õ›¶%‡Dz{zq‡«Î(èqKn¿}So©İ*9€8бèÑmWPÐï–<ðÀß{CIÅÀ¤äèáF¤_·qÕ½oÉï~÷o4©¨bØ“:›n£ÕÙ’ûî{7£T$1,Išž8ËnÃ(È–È/øùqýˆ`FrĆsÞ±WP0-qÕ︃ÿe8®$ÇJÏ×ÐÎ{L\u@Á@¶¤\ýÓŸ~“7¾T‡bä.9P8Z €)Ù’jõ/}ioŽ©NÄÈWrˆpœÖ1ØóWP0-YýÓŸ~£7ÐTûbd*9>8H%†|Þ»ÆUg dKÆTçOèV €ì4æÓü‡Þ»ÃUg dKÆW?ï¼Ã¼§Z /ÉaÁ±Eç½#\u@Á@¶d’ê7Þ¸•7ëT bä"9 8*3“ÐyoWP0-™°ú'>ÁŽh[ €,$G‡d,i÷vqÕÙ’ZÕ¯¸âµÞôSÍÅH\rp0& ÅóÞ®: ` [Ò úm·ñgË´!@²’#€Ã01éž÷p\u@Á@¶¤YõÓNû€w$¨Úb¤)~ƒ:$}ÞqÕÙ’ê—\¿. @j’Çè×'ƒóÞWP0- ¯¾|ùöÞ9¡& ÉcÜ›’Íyo€«Î(È–´UýŽ;6ñÎ 5‹)H#Ffç½®: ` [Òbõ%K>âjœƒ—Œ4†;˜üÎûä¸ê €‚lIëÕ?õ©÷z§ˆ-À€%cŒn‰\Ïû$¸ê €‚lIGÕÏ9çïDQ¾ƒ”Œ.†¸Uò>ïãqÕÙ’N«_pÁÿóNUˆ00ɸbp;ÀÂyŸ WP0-‰Pý ñNõg1#Q kgØ9ïU\u@Á@¶$ZõóÏ?Ô;uÖÅ€d,1 cí¼—qÕÙ’ÈÕÏ:ëÞ ´+@¯’QÄPFÁæyW\u@Á@¶¤—ê>x§w-ŠГdü0ˆ±|Þ]u@Á@¶¤ßê«W¯ïNCbÄÖú:u–O\¿Õ[ ½Ƀ‡: rV ˆK2`5’ € ùÑ.ôÎmæbt/*ŒɈ9ø­EüMÙ«ŸtÒñÞÎV €.%ƒ„‘ZÇ`g>™Ug„2üêË—/ðŽtnbt  P…áÏ|wdVJ*ÕO?ýXï„ç#@«’QÁÐÌ@*3ß™Ug„’\õ«¯ÞÍ;ðÉ‹Іd00"³‘ÜÌ·HfÕ¡¤[ý®»žïY@ªbHÆ11éÎ|8™Ug„’zõO|âï=GHO €F’­ÇÔ$õ™!³ê €P²©žðgK0ê(ü“²™ùdVJ~ÕÏ>ûže ] € $ÛŠ &¿™ŸœÌª3Bɸz2ß8ĘY³~KO2žùYɬ: #Õï¼scÏY$ÀtÉfaÛºÁÈÌ$³ê €P¬U¿ì²ý<»é_ €)ÉÖ`“:ÆÚ̗ɬ: ËÕ¿üåí=êG†@¶›Ë3ŸYu@(¬®Õï¾»¿Ï£6Òêáì;–"Âê-Vg„ÂêÕê7ß¼…çYÝÊ@HKÑÜ)†¹ïq`õ«3BaõñÕÏ>ûÏËÚW¦ ­C+ ß»ƒÕ[¬Î…ÕkUïä'Úç“ÿ\õäö½EX½Åê €PX=°úÍ7¿ÌóÁÚJ3ä G ê“Á¾7†Õ[¬Î…Õ[¯~Áoñ¼r¥òEáËkƒ,÷}BX½Åê €PX=ZõOúMž«BC yH”j¹ø£ ¥ºZKS›RZ]m³ÚLMÛ¦´VÁk´5Æk¥K-¹¶Úð³7ø»ªJ7¥¼j/oÿyø÷à¿ÿ<Îïy¨mð&+µ¯°Á^´*JÝð¶¦Ê’ÔQ&¥¼@+‡h­\DÅkŠ3“s'£jSÕhƒoW*æ¢K[­ÉÑáŦ4ƒWÖv´•²Ö<¼IªÕ\Ci®â»®{À{µ®Î”`î¸Þ£ŽG]jÕµ]JÃÛ›j“ÑÙèMiþ ¥ÔÜxƒI뇳ƛ Õ^Õ©Ös)תް Öà]Î(\Ûb .rjµî5ãfkû°úï“¶ÞNY…½J;­\j®Sm_‰+Á2h)ZŸ°ÈZ­ZcÑlÊ×ÜÆÖ£òàË%~÷æÛc›ÞOGåå î6ù›ná‘ÃQ榼,ììËgÿ×ËðÛù[ú×k6Ø'l`k«ë¬rÜÈèt3æZ±óu*mhòŸÑ®*×#åVpWQ«®\)jõµ.Ø þM˜1'n=ÿŠ—íZï Ø°t¡aO[â¿på½Ö£jž;ÛÖÚvlŠÂ/•Ã%aûšÊø˜>ScIø™ø|&¶‡×$ZW ×ñz·æßu­©þ¶5[*lÀ·¶ÂlJõŠoÇ#‹÷âaöNýõ;¬AöûªkCpÅ8¬Z‚9§lKQµâx^€­Å5á Wë”ÅeÓ>øg‰†ojò?X¼ýŸ.vùô&óýÇÏÿú×ã‹Òÿ;¿åò»Ý#—)•ÑÙ›3øeÌ4w|…6jKÙ¬[ËÙ”ñ kuMNóN9{ÈY ¥ž¼}Äp-uÄ[p‡Ø;œ.£^ãì‚Ëɰkî©ã‚òš±Ö“·Ç`—%{`µ¸ÿGÎ8@VŒž‹?²úø/óÀ ÀY8í]³8n؉ºU~ø`ŒÂUYÝd¼68±Nõ,ØÑ˜—ÍïÑ®­ê½ÎÜU¯Í9W¹kì·vvÃŬ\ìÝfìûžâ‚u(8ɱáfahÓqxK7}MÿPhRŽ]ˆßlÝ—ýÓžyø0gÿùëðõ2üû8þùÛ·ßþcùÇ+m Ëéé½\õ+‰o†Ë(UÌAñäà°×¹Õ=Á’©þÈr¸"b¦ô5¶/“æ¦à?¬<þŸ¦èÍséä4Ñßiüç¢÷Jp˜%‹³¡½ùš¬¿H>f«ä+è éZ¹#E¶ØÊn¡'>®²•ãPQì6qEaŒÜGzF¬†\(ÖWŽ8õ¿ýW|-ö÷Zù6ƒ£¼Ù–q"›öØá"Ž+s*ÁÉÃÑè1êÃjD[• *¦‰é™„Íã"U«~Ò¿}ùïùþïoû#ÿúÏÿü/¿«ô¢ÿ@lê4µ{Õ?o:¾ëS©éÅ´ÊÇXÚb?g}÷íOÉÿÙœ?tDØÑ[Œ‚Ï‚¯·AïNávÄœÔ>áέûH%&83•àhg5Äja°Y¯ð‘8xp&‘'¿)°¤âÖjÒŒ'7j önÆî3XÞòŽw ÊŽMŪ°Y™]nƒ¥qXò¡óÚà6^N-]Zî'ãM-yu3ü[pM›¦³¶]oö¥lªI‡Þá]«Q¼uÆæè}5iÕn‡Ç©/cþiü·{ût7áhÇÚÚ=¿¤Í+ø¶á§O±}>š`FœšC-&oÕ>Ííþ·¿Õ/Ëÿ{¿üÙÜÊéÓÿ¢ðd^™Ù˜Qyßp Ö ð¥û»Ê{sN….Z¥¤ô½[[MËV-¸äM Qc—mj´fì 6ÂÃÛÀ„x*Ãl ´S÷| Yþ +]^{Æ»¸B÷#†í+ž`¬í/GÓÄÙc¯UÞ*ãüÅ÷ãõ™G޾ÖðµÏÐÞò†(^ŽØ6ïʡ̽ťò³#¼Œžû0Äð—ÃÓÿk´¶á\`ûñåG2æFäŒNS³ü<ƒ¼½‰¿Ã‰Ã)nÜý ÿ†»åy…‘Ïsppe‘šá_Å”ÝÞö|ø·vµÿÅüöOú4ü©Ìå¦?ù¦ΛNŸëíßÌ|¨¯±®—ü—aÓÈÞ¶õX×ÿæN q‘Q–ð¦)Y»2\NS½u-ú¸ªò Ç1ƒ‡¢OõˆÕéZ´Ú²£cÇ¢C)py!åDa·o'ý—ÑÃÔæNy %Õ²e7+»[\¨ÓXÔtèq/![ïN[ Kð‡ÍÙÂ3ÞW×§Ó~?ÕuØÊøú ÓdÝèês1k²ûêÌá&ÄO“ŠÆŠÎcŽÓ~ز›–ø¸…Ž ·ìÏ‹…Jä\«Ýê›;ÿuŠÊêjÆÏ“ÿãàæOùݘïÿn±Ðö“³zÄ©“ÝÇú¸ÖÓŸöûñ% ÿãôå_Ží„ƒØ4à^2M.¯\µz¦>\<¸{GÓ×…1Æ9`¼¨e*pÄ`¨Œ ‡þÓ4¼¯6ºh ûð¶¡ ŸXwÂã8Šgu84 ¾L,‡ÿÁ-Û&‡o®bTpó.ƒÁÇ ÑJ}…Uà“»Is0ZGpR³>ƒ¶`\]X,ðõnBÒ@ŒvÀ¦2•CûÃàÈEßLÀݦ5¡½Ñ „BÂ1Þ_©æ€:œvx1Êd‰E‚Áˆs2#»f$iV›D7ü0_(̱–ðáˆoSc¾k¹ÆüÝš=À¯'àýMG€“‘{€0‚¬;³A„M<Õ’pôÓ%6R’X±h·ÅÖ75dõ€ü£gpÀµao¥´ä †QÕs}èºÿtæoÚ¼•ùomDÈøŒãH>7˜ö½Öí½˜Ó•!^Ïj?‘Ì¥Pʉ‡–`¦Ðc±‚`åÊ¢m!C;otqÙq³™G—²Œ>!c•ï tœ Kw+$î &Ð7¼eã•ÃóXúZÂŒJûñý¾¬Dx¬äA„ÞÂŒSüÜœA#œåî#2Øæ¤SJi$ïÙh$FòB’WÀ üŒ[«L Ç$ØÞ¢Éö€ Ð#Ë©ÃÝ༥¬Ž½pÂÜ'gÎhq„£hâ9=£Ó©ž¤‚@pÝãoÆ2_#†+uŠ!(?ðPb!ž$ü€¨•RFÌÝ(]8ô¼ >p†&‰-U‚Ú©sã°PÚóµ6ý¯h¬®òl_ÍühS*L7uýKûx«øŒñb¯¤í¡w˜ÆÑf5æNƒfTUêQð^0âܬs°vÈ®;‹£÷¡úM}¼ùòÖ~6þÛtýRËõáÞÞÜíÚÈ´z˜:Íæuv!;)?玗[®¬¹OäJ`º60Ý`¤}Õ\ô°"βœ„G%®€,Z%W¹àõÉ|cŽ"áØ:8um^°ßôÀㄈA¶Žêþ¯nÎWðcæI‡³i§’±I«‰p¢’@„ùœè“ÚÆ¼Á6€KHÖU„NB+ÄcÃ-Kq¥l’W–ØÓBcô–’-ýÞŽÅD¹’Ú‘oš†ž… dÀ¾Y9ôXaO;Ûá+½d‘ÊŸ‹ðžÌ`*±o8r¡¯YR@‡YT¯“ò5,㲜փ 3%V’1^\-Éùd-ÛQäO%yaÚFOµŠ½áÞ´é»äº³éy$§pV˰x¤4¼]ðC¦sSMt¥6Üí]1ÉÅDä® ÿÚ„ð÷Êš½àDà ‡R„Æ“§%˜òæ¦C•Âu1‡³´±bÅ&„ÂOæøW5Ë¿ÿ媿_ô±Oøê?-¤/Wœ_u4@3 v1wÁ6«Ý¬Ï`ý ¾#³ÁúzfN±¯8YõíÃÝ~w/ÿëëßkÜãŸcüØ<SBE±Z%»²ê ¡‡u\Óoƈ­mqñqUfe¸T’4K4]ú¸`8;Ø~æ 1O&å°Àb ïHµ‰YÞôòž±æhØy²ô‚‡òkŠ'¸j“†v ízÑþ§ïíóÐ{¬UÍWMûÑ?£¶H§eÖøSÜèGx®sJ`²Ù˜%º#YPœž½ÚbJñùË‘á'¸_!ŸÄ²ædµ 㦋¥»µÄ6’¹‡ÅàÁ17Goh]5XzUÁÕbI6š;'¸;à·›)rZ ] æb«ÍÁS4¢h~kšðî…A†ÖìYìlâF™b![Yj.ì…Œ'6Èú=X–Õ’mgÅ„ÙRæØÒ0)·_aM“¦óÀ”×£©)à©pwX­vO šÿ×$á²~lj_›/’ð,°4Òm_‰0C~Ît´nŽk¥Á²J`rÉÎÐH€`7¬öZî;«Îû®Üó»Íþ“G¤b|É xf~h@UÁŸˆòÉźa¬æBÖ‚³D#óæ¦ð™mR{`D€É«½¿™Ÿ×„Èûu6//yˆ8 Ußm–ð}xµV8 „îÀ)ÿbpÙ‘9©xöè¶{ ˆ1`VVúèOž¦¦d×=Î6žÁšã3©•ÑíQÂR“·0npýmÕw¬h"á½¹;óèydfð@F†¥|xœ‡öoÆGc^óø9Niû-Ö+€ÃÃÇ7·}DýÁ2•¤,pXÊ2åäB“ƒÉ2‹ØTχôSÑh[5÷Z>Ø œ‹ñž„qK•솢DX¥· wÉ ”-QjeiàQ˜®a ±× ðuàñ+ø•ò# (~ÊJàÚ*:5–uYôå©9žr Ù¸¤ÂÕöR® ô ´w~~aÁø»É1®‹ÀBpù°[UVoe~’§ÅávLËÌv€ÐØ=µ?ƒá:ÂG³RÐ=`­%¼Æ17ÒåDÙÀ ¬Ä—*hLdÌ\:^¯Õ¾iEÀEw^jÞXwÔ`¸åG9¶r_k. Ôs|q@g0TÀçxƒÝƒ9âÓ€ ûôŠÚ<×4×;=Úù¦Ý]é¢ðD¸‰£«¯ ÂªŠ“Fø’¦îÇ8¬È Ž .¡=nǼ1ýf£9ÏFöÒÓÌ ÇGE3˜”P=A\yñ)K}Mî¦Ï\Yü"çcÆ®žf6ýx¨1~ÔÁÚ†.º¢$’—̨xSc.£ð®,ìp…O}àd6æFrJ [ì:6½âP:xÉñ0ãæ_qþ­~‹noR‹mvt´Sᦈ2‘ù‰\itüR'ùõÔ,,f{â-r™Ì*"ån8Àu<°Â¾¯ôÀ.…q`ñG í\СI„,9t Vœê3‘ÈCÓc&úÚbÅçÖô§Ævý R„ARMëº2Aóø+@‹/#z5DVƒ¤!W~¡„©JxS%3;¦z¸Fͱ‚•=3éîEQPƒ½Srjî•<¦–ógÐbåÂñ²çÎ gU' àÿÚÆo‚—¦#” ùvò¬åòE¯A"¾ ïLà4ðô•áag½Û ôüØôrËç-'lŠSŸ¼?M>¼šó§¶_ÊÏC/ßÁgŰ:ÌB xÆ2Ä —ë0æÅJë@ga™Ea„eM=š6ú!3¸À*»³ÙõÀ^¾«áѶ¥=ötäüâÆy¶á³/uwÏJˆ#ÚÖð%ÓQQ·9a‰ÓªË Gʃ¸k³9š¹—½é;=+.[´½|Ôý‘˜ƒ±¸Ù-™NzÑO½êÇäÂ{±¡ŸsxVp%„)+ÉlÍVs"Ðà'½˜‹&LvmšÚeªÃbÓO¿/ÆïjT4Ü#ð’G±"y]²¥$u+&[`Š,Q“cˆ$%?CÏÊÂ?,8‹‚À‘DÃX›$ɸE*¢PwÀäW2£ãē즡€d «Ø»¥ '‡„ÕÈ*±˜ ºbeî–î_3/ ˜MŽ^¸à<¢X^æ,Ð0ÛùܦsÞXè´;ë£Ý,Ÿ’ ‡{»ŠT×¢ÆQAT:¡#•§ ‡õäZ &‹òN³N¢)Þ‡ÈÏ#a¤ü¦õ/)Y»$¥öÿa‡„½å­m·´­ÀM4fíë9Ì3Xd›JÛÿp?ï`øõåäÜ +{$ŒšÎ &uñupeÝìíÍ÷6K®`Ç;1À1NkBÀ!jlájœ³Ž\êòn® . Œo5=¸þÓÅͯö-¸ÁIø+ÌúùÙD¸çŽø!uM£î'«/ƒŽÌ7³ŽÆÌdƒaåµJêMÒ5t+Û¬ó`OÞ”—æÁì]lGX€OI; ˆ‡ëƒ"­¯ ‘"¶6GW?‡ùw«&µ<ôþ-—%ƒê½Löä(Úx‹ô9ËÚnY4°˜siXVGûÇO²¨×d*-‰æÎý›ºš‹ÔJ„ ,ù3ÏÓDæ«#í¾m³«ßeºÊMò°œ˜MA|[Yÿ²ÌñŒ…LÕZ&)Ä®ÎÕdé,è&áYdU©Ú,dÿ%‰„V„,ɑК"–ºJ½µJö…D@“›™âÑv eÕê)<•2ØPÕËRákR¦BH‹4x &ĪwC\JÊÆKÁ^‚¥ © ?˜Ìâ# ¼Ä¦ÂTù‘’‚áQ÷àöÂoéjHÖ5w@ÒRñDÕóÜ^Šì¼gš «üìÜÚå^¿­w„¼©ùýÊb~KØd_A`ŽÍa³a¡.Á#š÷›»Þ Žå8k^€œ7â´Óך¿¨é5sÍúëöÛ7œù= €Eé:j *š)ÔŸ­þœ¥E:?@†%cíEçµíØUW6Üd‡W÷2;“p5˜uÎZòÖ"hÑd ,È8ãKýXxíËÁ¶•MO!àmeiËÕjøäÉ™“nãdÝ'2·‡þD„[{uC0#„¯p¥7,]l7[1 ‘Fšzi’r×)“µ” lYà+÷bž«¤9íâb‰²:êÀ¹u¼lÖ¶`pàÙä¢4*"Gø+*N&•D°)ÊÀ€±Ø ÂwC˜J1¹8ÓDÅÍb­ÝX™É‘’l¹X@šrµlL¨pŽÔG4I¨ª-¶GdüS"’”Óäšµ(wöîš%SÏsuP˜D’æ˜Á/Ûƒr¯´æhÍélÊ…ôl/¤ >kWg•f ÃK Št~s: <`šroí$bÂ,é%® ÅJbÕ˜gÊ™ª`±~6y°Ïƒ‘–’Yñ›ì`>Œ¹¯Çds0QX?V ~%àt™Sýð9ªù¤s¬”žÃCÜl0vqå‘õIŠ#ïWÿ–·-ƒ2ίf˜˜}ƒëX¯a­fÛlz´!§é¦ê‹ù™}ú–ó#¥ì§'“@‚‹=+3'æ~@’ÀvAŽÎ®I]© –¨ú¸`Rj¾CyáµÂ_iʈ§Ž•¹0ÓJn+Ó*N†Úr†ò`à¢(aÂyÐ$ X¥:RõûÂeø4n–\ï°±j°,Ldð]<{JÊÀQ=à&s˜@;—{¥pÁÉ7ÊŸáüœ€Úe7ÓRAt¶¢ åw&™ £,lt?ªßô´3½˜™â •»^”¨ôH0íÕ4ÑJài’¾åzâ²±g8]…Ò8zMrevH¥Žy«îÙ>\ôúuqË—rxÞuySl[Fp†ŸG;# T<™éµé™‰¥«+l¯ïÞI·ÙŸGþKÛð©tH°ïr9,‚ñ2jY? ΂ZàëÒˆR-{eÉ&ó0y^(W3½ÆO¦•¨¶ôÁŒ2.ß=é†mKd½8üÉbÆL”ÔÚ©°X&òª: F½¨%¶»ö\,õª8ÉÇ¡öïfý(ËV£/V/;urŒ²Ì²Q>€îzÓ/–ì,7˜2{áØ¼€Â¤,¿tÇ1¹)±”XvÁ@´`âV ÆHÍ  (¶«×›aêÃõ¶¬¬z§‡žÅÙ=FêÖJJ ]>“¥xÒ(Ýa­ú¤ˆ¸ÖÕ¬r„"»‰ˆ|&‚å P|­¡„–YN޼ͧº‹òh0Øî]”©z4`SÏ+Óâ‡e­ËwàAìZE@ŠãzÐáâ:°38D^fÄRßÈú¬Âé9•^Ñ€qŸ £ÝBXež”m¸a'Xìì¾_À—”Š ýJ爵N¤¾Èü–$Ë{Œ€JOÁEN¢}=`¦µPa†e­™4?“lk²{Í· T ÿ5ê@evý«ñ¿(à>ëä*î|ÇWÍÕöóîâßÝŒ Ôm9¡Ã…ƒ!!–ûT¦kµÙÍcœþÉÙÅëàL…W=ÒÅÒ‡ë@÷µ'i’\aYvöÎi”‚õÓF•GÍV0C¸Ÿ˜šWˉHáÖ4‹Ò€Y¼ø´µtp½ÆUÕ«>fÆREc0¢2(‹þù¡ò÷böZgËrlçÒ A𩉻{=pÚq1€[·ÒV¢Rv0¶6„;Ÿô¶9“™8g#Þ]w*ÐD2€ÃèB"á¤Rj;Mss""#`c ÏLVcEYDDÓ“âU—ðHH"Ÿ i»‚}1¿B-¥† ~{^y﹃+ðf}2¨×ƒêzœKT °‡”%“Ô(\ïiô/e+vÆ¢‰à·# D…xa‰Å„• CZ<ŽK¥äªŒ„~ã÷ò~¨mëµ0ñ'pêÁéàÈc•”–aB”ëXZ”†Mfc:ð’7ŠV% ï“•È^+]iÔÞVü`ñÝj€à0„¥*©$øë”ÁP5ÜÝ|Í%xÄ¢=§!øñÕ+j¡˜c…ý4è˧š&@_`éP”@2ÕcÛ²ë`³ÿòPC†aèʶ€ÆO&€áÔlÌÉÐe}$&X”u¶Lè†÷&£G>pP;Çt—ªyɽí‰Gk]œY`ÝžZª`܃<µë€ïÆb·j×2¤ t_#] ‘Un3ÀÃÆRÚžq´è#é.X1¨[¥˜ôôêô@6Òe<8Eµådá8ËÆÄŽYh"p—82³%v‰P~ÜÌ’'.U¹x™¤Ô†¤­—ŽÄŒ_(uÙbúf ¼YéTÂDëÉLv ’ÜOœØºx}Dhù +Áëk§Ñí÷gaŸl(ÿª÷ù4éáÜÌT›¤ÿ÷Ä^–BUŸ –ð!Áh@rŠÐ9´•5Æ¥@y<c[ÓL‘X aµˆ@¡rí¤ñÆôJ¸å¥lìÀ̺^å0"ØÂrÄ™EeÚQïô^ÒñÈ–O¸Gb$ìá ®G§/™€IÉúéžV•Ø$ÙY &©›^`Lö‹FOH}ñŒÔý]¥˜eUGÔg8ÚZn{!¤söÓèÀ•—×Îzšj¨íx#CËÆ±Ùc£Í;ˆ]ÙC}«ùŒSz¯9Ñ©±$ÍSéíä¢3¯“¹ íã­>ne¸•3,r²í«]§¶žÕ¥š—£ °6„ X›äv‰;¥‡ºH×¼g)¦ÎlÒsjfÝG<«6f6ßޣΣ9`>)trÁjÛU~0ôaw Éào°nœ–ÒøïÙDX$³Ï"³uÏ Ùßæôê b²=¨Àq¢ÿÅš‰ÞìßIW?Ym&áà Ôg… ~ŽzÀçql/5öCäÁ”`ógk@@7 sÀ…I2ñØ3•7½Ü+áGRÛ­®K¶¬•³Ž²ŸèëݹKb;<}æÝǨÓÌÒ¦gG ÃÅ›),u¤:¿å¸Ø·Oþý¢/ú´Q–ÅÓœX™ ž­¥… p¦†"“€+°Çrº§röÛÈ‚;E=XAÇ:B»Gõ2Ø——Ü.mÅÑØÔvo×TÈÁ<Ó‚"Ó•)JJ]ÑF§§Õe¢[‡Ø vþb˦Ýj:*å\ŸÌ“ZZÈê2ãl·Ÿ&WýÂ^Xzîaf¡a=L½ó‚ŸiD#Í%¢bô‚ã“ðZ&¸Ä©[ûLãÆ'Í #_žE]I_Ù²Ä%¿ñìmdŸëõ¶m+‡³ C4çT€GÕQÚØ¢J¥ ¾ë¢ÔŒ¤ ©³ðç‡[Sf³þ€74÷{õïmØZäí³D ç‚€©Sò‚` ¯€G°…W¼ïz>ðam÷Ò4\™Ï,Òð(6)窗ݑUlqrZêYEºr¤ßbÝ»‘y`!pçìŸ3ÍÐ!}=¿œ>S’=½ñ¬ÇGöD ¸ÒÖ<éW¯skQ’Ö’;-»ÃBõyÒo#IÒ™Uz¶ö´­¹[EX‡û¼€b¾5ÐÄ|°;ÕÖ2E£ãÚ€á]²oû` ñ$—Ï6\=&,‘ï+@W-X÷On;ÏãV¾|äjÝcn­'ÆC^+ܤc“²–s#Í\5#$ ­œÀ16,P|hé㸘˜Qa;§ÓVc-ǾKQ×µ‚Æ Ž=ÇJæ ІŠ$X°˜³/Àu¬sõn×ÖãxaŠnøfÕ{ãô;*Qɶûε^Àçë~pŠIeX»;Õô ¨©ø"µ`–”X Ýì9#eÑ2Ò\8vÀ3E¹îÎe¬j`†)&æ%C_¥¥J*¦=[×3'@åìžá/ýnþÌZ)e8Zoøˆ¥–vnuªÇTÒ˜AB¶ÍîoÁ~óÔuS3ZlAÉÞé¬Í8ØHz F¡·Ü–G7u‚g›¨.¦c,ŽþÁ¡]˜êÔQ·Å²4áèé¥hÐ4‚·s횆 &Û•IRÇf˽ô­±¬ãXÒ2òÖ.‘Ý{ÃòSTž\š»À§ÅO+©lë.Q*Ϻ£‡)åÏlm”àô0a!ÚNËF¬ä&&,}€P^RwŠteHê–E!ÏÍ=€«¨’éøõä4 ãA}Žäd‚›oÞ01Åþh6£àmE,톯Hðý5Ý>/¬ç¶ã6#¥+s©¯×ÊChëŠqÆEÝÝ¿azWm,Ðê:ZüÉÀp ˜«Ì{º[Ëù '¥çv6cî3 ’ÉØ–<í é Ž¢þ¤™ìaD6㡵?( X`ªQ”êVZŸv2T°ùHw&pÝ gvú2²Ê³PG™ß±’c”±¾x Ïæ€!•3`¤DIOI®¦JúP"¿3í®˜üѳêi¼.?–⑇⠢Ž%)”'HG/Âûµy4`÷ù¬õ+«õ´·•Y8Á4’ ~#~©Mv~G¸n?ßÝã¯úÓ;} ðfËzT‚×2‡¨'»°òŽ©#C6öâà®5KI"C:X“f!((ó@h'ù1B™ØÐœZÒ¥®{h6ÈQî%†ÞˆÜñ“'ÚÓnd¬G™õ“\R–ÎIÉÿP7èW¬P7€‹°—¾T–I¬TàÙˆÜöjR¢?›ªzÑœÝpëZõð°å.R~w:Hxlxf˜_¸yIZX-j "k¢¦Lµ Òц`a£ÄnØC^¥p÷ä¼=ÕÚÀZzÍŠs²–‘¦ +᳃‰{‹G9›.¦\8›‡Ÿß³~Ì´Š’‘#Vž]ŽL®îÁíüÑK¬ËÙšq\¯ üqýÄ).¸v{8ÉxlU—ê¨üÄÖEw@‚ß+\À•¡ Ö8 ú˜8”ÅHsá·%5Uk[¤^_h!ð¤iÑ‹Xó纙-iú\¬Rå*JyÄ…‹<¡«êeÀY£‰X!µð $uìÖ§Á°Y]ÉR¯•ì’/¶‹TÖ¼Èyº aG¨q&–r5+’)«…w×É>ER v2ˆli$^©3`«?!Éé“¢¼M{ÅkÀMÆ`ÃÄ›¯"ºÉ‡ v‚)Î @?  Ì›Ák¢h“{bFI6qâyìSˆ­[” \"^DÚ)¤§uážð1Õ‡u¦¯Ù:€ƒ{€ ÔM0UE˜.ZY#­ñ,c1}„í¤0Øö:óª\aVbž­ÿ«vx¦¨â¡¦·sµ÷×|JITiIÄy>p³jÙZY›Hëøv¶9晉¢Ÿç;æûö]EÉì.×Ûú•ù:ã,A Qûq6G•4õ"ת˜ÈßË‚nÛ™cm\b"x¯úHtB´6¶}ªY"µE;K:éõa>²}{¯ûÇqíù++7‘ÚoGÛ3~áZŒ ÆájIöGУ$Úu¯n²ŒÙÙˆ @.çšVªØ¬'u",,>ätjÇ%ã"׫6’ŠùÀ¥É¶N³t5ó¬ÏPÓî˜Âf}woã!ãzÄ>B¥õàe >¢e”"y`SKžöœ £˜í‚š!7Išu°Ï“2ûÑ€QÃsž+@”âLšµšr¥ÊzÈ̳¢qΓ۳Z·zlenfÀš2ÏR±¤±w,}xý %¹ÂÔ'pˆGLu°´ÎИ¥¾!Jú5.4°ÑA9“–…~T÷."Á¤Ÿ9Ý*ÙL#Ý ‘+½cd´K=¨[j=ç%h§H>‡CËX°/S; ÖØi•¤”ÈòJ X“[´ýY?3Ãïþ¯—ºäö‚Ku\G¬»4@ÇVÁKì 4]dËÌzïÖ—Écíí]T^ª:2K€“ϦÍôzÇ.gIÂÔ†ÉAmô ^Z‡à„H"±IÚ ¤ÜKQ[`ÿ¡^síU”ñ¸f°ˆ ýìÆ(jbÕ]" éV€Òü7 hGûÛN°–:îÊ/5S¾Òœ3ã/y•o샡 òSù‰¹ðMÚ``Åc©vSïœúØ6Ë J£F×ö:n /¾±\µUч`‡Ù¡•!„<½œÜHlëSsS•ü‰:¢Z®fxÔq¯»†‰ëGlû‰5¾I~V‹€ân<ì=É«¬‰úƒ+¾e±ð¾½ì»–›—\î‡r…f„ Ü_’L¥HŒ´* ŒÄ+7½ùPÉ 3il½kÜQLAÛÂ}ù±õÙ90ìa¨,6fŠ M Hìà×µ1Ô›µ?ÐëÕ«ü³R¿]óË5ø¹é¹£Œ·Z脈€™`•Ý6 ŠsHìeJäÙ.Ï$d‡@Žè›«W2f ²gK¯ðJ™BZaX¨¥ cy¶§A¤’  I‹œ›¤¨Šw”±fdÓEæ´tµw'¾¦>Ù ŒƒÀ–4<‰,ÄKFœ–'‚DÉ?1MK!†L«®½Í5|5qpáVݵ²<uâ¡÷Qß¿†ö2üf“ºeâ§Kå1KÉ¢öÉE<œWÄx-L¨Ã±žH õ2eÇB„ÇËüM6t¢×ÍC)¸+À:á,­8‚žA“âNÙÙ,B¥»Ç*ãÄÔ(iÝ5Úõdš’—QKK’-…É !ú¤·õD8Ró7ZXa¢°Á$¯i3`­+“àÑë"ìVÀ] ›©ÎìLS²ób)cÃá™J“tƒLö„9.h9Q8‘zÏétGï®1´7xSÜ)PÎÛswàJb]1BIlØÕš‚"èø™ì•)jÝIŸ Õ¼r³”ò7sH±ÈOÀÒ)ÖÔ´«vgfÿÿ‘ê”[XòðÑvÁîÔ!s4Ýv‘Ê$k°‰ ~4R!vÒbfmhV”‹Äcƒ "%‹ÀZ™È™Èð¹ÚJ&É5ŠÃ™Æ•ºp{ö²KÏŽ.–R­÷ì²ûS8ZïIu"š•R—hÁWÉPÿ/ÓB%úÌñ˽>ûÔH »UwÊNwlöÐöQ=Fg+÷ž1çÞÌ3v¤wì ûüx‰¡F?§ˆ9iB—Y´"&c\ã`Jq †M3Eµ´µ¡éxŠf« ÉвžUÞ®Eë Ö¼3¼ª¯”ªWéŒì2/’3+”ÄQª÷gæÊÀÝ·Å€°Ö¯T’qx£èÀzO°•kƒ­šúÈCØ(%\‚SŸÃjRE^—‚m<ápPpg¥Ì¢ÒRà‡çþiøÌr$Ó85õt[Än,v¶ûƒŸÞõîØ ¿ÛÂìE4t›!G²=8²Ø;|¿øDf-ýÎí #€D¤O@ª=ü˜ý1âã¨ÿ•ѱ©wØ'k¬òJ§Ü—=ý±Ĩ<¨ç‚=˜õ]Ø0Ù@¿˜öê~rð5àø .MJYV$ÙœÅB?«á.×j†ïwÔ¿T'XŽ/mبõ%é[äÙ“Z¯wŒûó±’Áër¦&ø¥‡Ãç àJpR)…²ÏAºfÖ$é(³žÅ\yƒô&Û_º·ž?ötŠ2>Htá,È@ -¥éç+ ®ÈZŽƒif#²$|øGUû@ñ­â¸L,eË"Qä1;è´z?¨ôwJQV†S(À£ø§RVz‹A2¡J`…Zz;¨pfaUyÏn,| {Ý31¢¥‡¨„T‘CJÑÄ…-í㩤±=ÈA C¦.—‚ÐS s!{K†SÔ%›|t©°Ð$ôúÕ@ÇÙLRó’º)%g¼WpÈ€ÅÛlî£ö  ýWA¡PÞ©q4Ó‹ñ_šý”³o+V­ETËtLØGÖZÔLqÂ.Ç%8Ô‰b[Nó=4›´$#GŸ!|N᤽ð‡£,¸4 ì" eêHL?D‘ÃOmëà°èçÌþœæ bD5ÔÊ.ê"3³`ÃaMP{#bäðÞˆEu&½˜}³¥X1"JSuö¢D–B“¸ƒE²5YÔ'®·°ù˜­dôD}`¡‘P©åÆ9@N´«B÷«4êtù ë”× n2šú™P"œ~Æ#½ÉJÞ™%‡Ê¼…vÅ‘Í]ÄA¶ï8½ÌÉZ‡>]«;õS)%‰lmÉ"—ÇáæaÈz?DD(]ªÙ§Š2C²·Ú¦ÊZ[/TZ­dµÔÄžë¶€ªÂz±¯f³¾½“Ž´„,9º]4hé³Y½]3åÌÊUŸõ¸¨GàȘW?½®¯õ5y¸ám0?íäÔtÊa(ûaóO›ïR¡H†º=•‘O½±€°Ö+€­ËÅ( Š‹\jÊLpKpè0qÞ¹ ì–LŒ5G ˆâ]M»~_ºadž6†˜W[{ù”CýøÐ·µp`u¤<÷ÅÙ€f]šb §±§+SIF(&í&UJ1‚bèžY)ƒeûæÊX†¦Î¾-U½ï:®ÌªáìÀìH“Ú0Œ¾qFÀ·¦Ìñ Zs¡œð™~ bÃÒ ³‚X½Œê–T|×ãƒ2 {bþ‹W¦ûžÍƒÅÜí§Hc“*œ¶dd”·c­EoIIåÖ]±–rãÈ0 )áa— ®°š~‚›tf´>ëßì$Ñ&SÁ8¡omgÉRE—éäÍÌ•äŸtV|®Çæwµo5H:Ÿ“½Øy(xÞ¡×?² ‰¶{ŸFß»+{7½Ló2ÂO¤ñ†Ž¤I3›-{í —=Èì’&£K%?óÀ/CäÅ+)åööZ˜ƒ€¹>ŠU°¯ôÆ9ªÓxΫ0`_Û'Í4äÝò¨±L[Ëß½¿´Ûtü/ã—¢ðñpo.ßZÜûeëž«NýJ¶±è–Ed+‡–É++O {3½—¯µ!‘(ˆðΆc}e2!gj™ Éœú!mq좟ò7©Ž6ÖsÒFU2ÖU]›¾Vv°~Âé-Ò ÈövbÊøsë=Id/0YŽ–‘¢gq‚¢a“*ý¨ŒFf3.È ég…‹Þ}ÛÙ.â*£2§“3ö2Çr=Œ…^ä–;¶À-¬ì<ž'}œôÕ¶G¡ÁeÜUÖa'¢¡É×ãDjxâˆR¹D‘†è‹¹Ýb¥™9’*¹oZD§ªcµ}šG¡c«QÓw5©KûK(œæâ´ÌÉW^ÄÆüÌqM%ªöI8ÝÁöŽæ*e ɰ2N±É ¿æà™–ÑÔãînï¦ ú k­kžS1˜4‘è¢)ÔÙNœIï’´ÉœVÍ$AïD›Å0'0)„ö²OFZÈ‹L1Rbܽ !R<ÄbÓØ‘t'Ô éa…Ž¥M†¯"Ô@ž3#Å,ÍÐhÄôž¤€X¹ Q‡Y}ý´-¯þ¾é¯oÎý fÀVðºpóÃÕ¦è,V|ÝÌí/¶Sy‘Ñ©õLœc³hîi˜L«r° ÀŽh(Öp},O Azt¶°gu‡g§,o“À±ØíXõrGÀ,Ÿ/m?JèW—&„W²ÃdbìüZÅúÓ‰#¿})ö¨ÞW9(F ‹¦Ê>3¦Æ”p­Ÿ²v©¸ ³bC•q‹Ö¬y*™Ï%t2Ê Ó¯$ÙXþ­<ž"¬OTŸIí÷ š;ëc›â´»äÉ8¬“ÕË ÃO42}×ò°ôüM aqÉmÄáZ±Ü†¡ö)Ž"ŠÝ¢^–Ì`AšÌ¬É :¶´÷> +´[=0JæQ{1}P'•m#å'%ÝÓJ•ƒK­¼&ج4§)HÁ>Eš÷˜Gjý‰72ˆµÂg™BƒãAb‡N—cLþGKóîþñ ÆÁ¹ºò1q4óÅptîg@ÆV ¨,Ï”8!´ØJZÎþ>~gE¶‰TB=¨Àa§IQ±æmÒVd¤›b$A„-ךLÖ̯jºo>\áJ|«`½o-À½Á¿:µ¯Õ.ÔB²¨12-–øåU*"FÆ´>øµ«ûˆÌÿl©a€êÚI„fÔs6^‘ì3¬~[y›L0xÛ&àm„4é¤p,³%@R‡/á5#`9\×àÍ6kN*àè$} ˆ(¦mVÎV}ª‡/Ëj. åªÒ\Ñzú•¥Éü*óÅÙ$fd¦ÐJf4¼îYž òC·;­FÐÊ2)ºIW˜‘ªì“K±ß#£î_sV'M©}e'0›$¥¦èD’ªµŒþ㕌#ûEj©™É‚›»|œŽœ$‚Ÿd‹TOíòì[î)y%®EíG¸,äUdë4è ÒT‘aíþz/GÁT&4%e*Ëð+‘%õà1éfüe‘útýv„í Lª’ðEà¢#Äûîªþ¥Js±§ºÎ6}è¼òêù7TCyìzå“Ô‰YöpÎëóáüx‘~#ŒaYî¹mŸG!C^M”|ñ!m¸û÷Þ"\̤÷IQÚ¿±O,ʬyœ|«Îºž¦z:g øt3ŒV/–¥âQÆv«íZË9Ÿ“Š$ús¸´A¸-ZFÕQ™å']YÀ9Ïb?¬ÆÊ¨…,•8½sTZŒ¬¹–ÒpÊËJ•¯¢˜/08H[lJ!¹Uû¸ÿ”]ž¶bP-³=F³î¦,,‚sÄXÖ¢Uûhð!ÿðªÌ¥Þ@ß6y`ÏÄÍg •S•Ù` û#«ä¬J»)+â2mñCÊÜɺ³6 ®8ܱÝìl•â1±}”!Y¦s_¢h+¡»“ˆ°Ï^­=•qP J`âžO-멺žw±Ý§Š( «1ÁCUÎnõ™¤a§‚Wà°äŽÆâëÊôdE,¯R){ŽŠ(lc-;Gù †yqmM(åø?–ÀœÌ¶fj¨RjIS ø´=©¤¤RêS‹*é‚Ú…Ct}ØõTl¥ÜšÍéV‚ªˆéðš~õªŒ4ËIߊù¹Äúžÿe ë¤.€Ö‰ÍM ’”Ø>‚Z+f3læÂ|H{*:ûr±ò*³:¦Â†ìÄÞ˜±vô.¶Øgh¶³XJn9¤_4{ÌØzG¢å¥É.Q­GÎç|ù}µ÷;Œ,xÁg·ÿ•EyÑë½m¦êÉœØ{£k$Ø¥ÅøfYË$.Ái´|ÔQ»ø)Zdž‘™VIújš4?Õ¶ññc\Àt¨ÈDµÌEö”WqLj`†±n7÷þMo6~&) qžÍDÆÂªù.z «Ò6ëG>“o˜tùÚÔKf3Ó¡·›=î\“ñÒÂ…³Øá ]©gRDÖ!­KºÏoÃ2ï&-¦*QàY¥™}v¢në4<‚hÒ{꤉I=EÑr~$Vilsí±»Ww:Å5R%‹u˜k–ùõØ)1‹U¤k„—š9€Ù2~ƒ)RIó6 Ð ¤^ æÚz2\ÀFuÚ÷éq2iùÕ”OÏ5ý °pIaâíÍ¿ý]-÷Â"î \;ƒ¬ÔÌiý¼øã<ç¸ÄhÊ™È^Ù=SßL{¬Ö~,šžÚÀ±¡y³óÙG´CÂLèϺMQþ:Ö ë·YªJD»)93ÉlXOñãYžläAeQYÕ§`¹#½ç`,I±‹£Ì2ÃÚ°ÉHc6mË1ÉsÃøT5§_ˆÁ‹ù¾cÑX»º5x#çvÿ9¼Ns‰/ÅE$s  ±Èã[OVQU)Op4’dÊ%2Èø©"Q±˜Àc&Øé^Ó•ü·›~i°Å­JS²£;×]#§žƒ­Ì¬nB´Œ÷Ö÷^Æýý”?I“Z@@Ÿ‹:'좘]m¾›ýasW È)>~âÊédJh[aò¾uBŸ[ï zvÇZV«vyމ4_P½åÉ&"Tl>1Ìf Àœ2HiSÛŸ2(Å »pÌÄQÚzp8ô8Ûñˆ‘†¾ó©ømÔ°?^O­›VR,o2÷ܳåJç±ÕY:¡åñD6Vf“}·Çm¿•a0/¯&[”…o¢¥޼Ù3®Ð}ªÔ2ížUq8éá[û©ü-µW£ÎŸ›}-wγ0f‡—¤õÓL#3uô}ö»ý}¬¸CÓ'˜2lCò¬ÙÅSv²§&ºÚ&ÏÐý©}ØzéÄ#E´t;½µ•ª\‡õÏàSž5¸"sŸ-iýYšê©ÔPO‹—p$‘­ŠÎ” ;x²È‘\®Í³FÇÆö¹Æ©LžC…o{wùCÏ23OI·»š˜žc«ÔFÕ ¢Äš©Ó²]+¾êÂ*¦ƒKžE.cX™æÔ:+y„V• \Á<‰“‡bä^Ÿ¶=èó»v¶ù(ÄpPð`óbùüIŽdNàt·“MdKŵ¶“Pßò[´r0‰– 霊"ˆ>Æ 8p’èZù0NÒ «ù0Ûws¼µuáÃ3Ý{9ƒÝÒÅðù,2Utp²v›Äåø®ýO¶OŸÔù·l¾(å‰qál ±%wº-“å+qôñ–†õÆ*s¤¥ˆÆ4¨oÒôû 8Íau7áͯruLlëmkÒÏ!Õ[jU{ößXyXŒµöü¦|"y•{¶+0 åº.Ew5n­ˆÈ>:ê ëâòÍ\¯ö±É(¡ÁA¢‘ÃRq×+¾kd/º;vkou *Oº·Æ÷)¬¼ÛIîŸnRãˆÿ+3ÚVšHdú‹ÃÒDCո͜Ð*/–1GðýÇÊ °B±LÇàiå”㽓ZN,cLòPkÜ<ø'¸`N¡5Kï’¢Y™–.Çgìðíq©5ð1MZJ=ZÊ)$¸áùp Ò*ÜRd‡!n f½¯f¹ªýÊæ D¹ébÂ+s-’Ž3›ÞlŸ±©³zL‡‘~ÿ6RÙ­~ŽöZS´ç³žOÍŒ|.&€Õ2”­è¥>]3e?XÂuh|ÂÒ’é‰"ç¸ è >UIvÎÉZÝ)¥‘æS)$»,º¨ÒãÌ)¦œsÀCQÉ~è}û8.ÝÝ™Ö@pùÈêZÊKmÿ”ÛË-ÏÎß|yq¿©òš’S·Õî ¯ÈI6#ê™d”¹Þ„S¥ÂKúÇIó“qÚ³ Aw^ne`0Çm›Ö»–ÿÀõiêW_¥Q¿îMÒG¶ ¾‰…øÇÞ'Œg=L×gµŸÐFSì$'Úju6N,d}~Ámh1T3´#ȳ>¸Çð»1ÄÈÆð ÞL!d#u´nLl˜>^SVE€ èÌ®VŽ[c$„ á“Ê îlS6Ca“@I8ì>JqP ‚„ ÏlwNCŽ2¥´z{‹üyg'ø*“#XN‰òxU{Ž›uo¹GŠÜEìYàÄécÄ0ŸªP[kžCj©q°Ò|ÒÑ ‹·šã]ã'>rw úÿ¬ÌK ã=Û±JNï‹ÚR‹†£]ã»®'³ÌµôÑÓì& ¦×¾®ƒL{Ånà-Rƒ}©œ5–m¦ã·•ã§Á@8wPÑ™.NËœè!Oæ4Rqyîyhy"d1]•ûÍê©L¡ÀIÒ#JÁ4Á½û5ä§ô§ÿa­“Ù%¯|º˜Ì¹ìm;Ì#ÕÛX†ÈÆ&[KÙ´]ÊËÑÌâsø˜ô¾f9æsy‚<ˆ¡FÉ{xûé“Î[§Éj-S>‡ÈîFºadtTé¢ y8\(5T¢vú%>Õ¿r=ŸBÕŸå.Ù§.îîÏhb+“3Ý‹ˆSDŽ8¼²,Jíî¼i¿p~0Ù‹—â+Õ9"Âãæ%q©8˜{w|ºiˆ %N-É/ðˆ«ú$ÏÆs°»±†Q4# ïì;ÉÕHŽä U{vl €#Z áüÈtÍUþƉ5<‡A5ËçÈôvWåZÏÉ ƒÎ,øÐô>뷥ϫm{ästÈb76…N8ð2é·ö9v^†õ‡:F5à{9lFwh?”~'E#pQ-3"§j*>)œ„U¿º£O›™¾èˆž:¢â1úùXšžð#þ%ç“iôNfrÔgŸ„îZT"ú3átV<1Û¥Y¯aõ5Îu õŽ^)±«¶‘ÆgzïP‘•(†– u2¢]òÓÎu%ÖOA"±è`ÃdæÎ{æNÿêµà䃷ðŒ’ù}J!ñÝ¿÷.ÙŸ#£˜éØ:ÍÐT! MÍlûRW¿ý4zå)õ,˜pìÅ1˜8Š>DZ·Ÿ¶f¥$ëÖz·©ž˜ë–d€’»xÜ"Q‹³+¥e‡}Ò•Ÿ«¾ÃiýÙÊx¡ù Jø¯ü „ãvA§L¼ LeÒERø—¡¼C¨[ä0>¥W2ÇA,‚0ûÎÄz¼5·´é¡ç¦—“úêc×qc£?P€êJœÀçvrÄ?Ì.S9Øœ Fû¬î™þly¾[ONð7îÙ?àà9ºöŸY_i{•Ù-ZóÁA2¨k|EãlœôN™Þ?z8ëË%7_޽ŘƒËsÌ0£Å9ü•Y bf$Ù¬›€¤ÝèÀ0±Ž @&óˆqÚ_ø°âe„¹ÒýËH] ¨-ÕÒÓ-SàCêŸmJªgˆ%7'£å=1 ¨Ÿ ý«ýÅPËÅÐÒ³ŠýÙ ™T[c{®:üÝòá°s>0ÞØORŠç³¨XÔy‘Ç1ºž ‘%“&r *㙫©BÙ›$—Œ<4$±¿CNi}걋#XA¥ç&éZb†ŸÚòx]%9,}#ÍÎÉsÁ@‡ÒÁ‘À}ŽûjL×lÛã¢A.Ùê¹ß`´“ƒ$äUsÈáç=,Jä”QÆ}ª½§g™FCÿjª$š—˜ÛäùLZ(UÊL€ö7rÇa1D©K5,çH“†g¡TÆñÒA%ÝŸ½{–?9ïŒsìUÏD‰^Œ„X(>X*IWˆì~6eÙÕ7£ßU¾hóš¨Lð@&d‡IëK5c'Elèa ”NíD²ùìÓzrKÝEV„‰TÚ_O‘ç”ÿl…)ä^àIÅ|ì|È ‹…"dׇ™>X:¾'>ô¿ŒŸÚÀÄ©}á\w/m»$vÚs˜\°ña œ‚È4‘­ÛêÚ;ŸåN|h7‚O“Abòl"VXšÔeŠ¥ÅËX(©Ü{-Þ½Ã݇ǓÊWy¯Â¹¥#Cì¶.ršdWµ¨€ @•Œ‰´ÔŽ'k8ÌñÆSà„‚~&ž ¼A"KjL´õ¾®‹úsf‰ "n=ËÄ ê«ô¼rVW’yå•’UòfòÐ)åt>¸ÁËkyù¼åX»Û?þ?¦ÞdI²$KÏ»ªzG3s÷ˆ¬Êj hiH @‚Kn¸ãƒQøT®¹¡ÜRpÐè]•C„»™ÝQUy¾ÿ\O°$»:+s³kªgü‡®<Ú~Gu½›Ê>‘­ïÞ—¸ÎÍA4p t~(ûj¬è$"Dð~G¿£ƒN{FðI+2“\œÝ4X‡]ïƒÂC,ä\Ëê¸H‘²è…N{€QP{`]‹rB:©ÄåT¬ÜON¤8 Ñ3ÙÅ©PŸ*2FؾS2 .;!W؆™ùî#žTS#! €ÓÈÑ¢l\ûKho-±ä6Ó»-}~¼îó÷Ô=˜>»æ:7×_ò{Ú~ÇÈä ¯TÏ\À:R³B:«>…är¢E²‚‘Ïv´-*b ;gJ`@(¢±‡§Bí %a¤ëæùÔ^áBNÍKÜ?ÂóAÀ…$­§ J3Xw} oÛ…xf%RËÞ~)ùe Ù«äSÎûw3·ªw§‹Æ¡êîXHë•}ã+]OÕe´F®’oâCÁžrpÒÂÏþz' SÔÇlIyBUÅ~eÔŠ±kùóÔ´¢Ô90/­Ò5ÂÂy ‹ò¢U»²÷ç´Á3oÖ+C.‘£kîqÐ@ʋ݅e:by#¹±j½Íá§Üb¶æ–O©ÚÑ¢~„P²-üy‹¬xÚ!-\Ã9Ó-k$rÖû=οRO[ÉÊÐx§C­º‚@2ñ},pvÅšl+èºK¹ßBc Ø6¾K?¸qû:+ãÓÎè3ŒK½¦p£ž­VÂÙ‚‡0„ÝÔç‚… ®sÑ7öÊÛJ+<^›áR@ê“aÃýnŸ À'Äf¤VRYÿM×Ð^õ[æÁè-°»Ö8½¤å¶}·Žyîú–áÇŸ…ñ¯Ø6,Úô“ð¶ål·ØkZMåcEeiT0’à×®cj!R&SÉ¿»„_^÷:®«tçZ¬ÀóÃþØÒ†5QN}’Ze[UåãóàÎ]§·£ª8îÖ,Ö…ý7ÿOsö5»(°Ï`ž p’´µƒ¯Y©<’ËcB®sÐ,ŒVÁJ±€p@Šanf7˜%VþžÃßým÷oþ¿‡ÿòÖýn|¿ÉíÐ\ûm¼¬/ýñK,–é.}˜âMÙÉŽá„<(“(—©:%Æ?©&Õ×Nú£ï9JHÃm ¢óc›S´B+ ”äc­ÓJŠ®ÏëbÇ1œRTER8Ízboµ“®j%/ÛÊl –É¡=éþXôþƒX(õ¤Ä}¾ùªú¼ñÿú(q;:ûçf5R{LKÈ™'ßuDÒ;M ÝD±Ú°-³V•zGÿ›“ÏäĦF—í¾·ü)üû¿éŽÿ_˜þÉ¿þyë¿×n°ÄÛ ð&” bžô·´M£2'{›ðƒöÄgÆ¡vM'%"Oª·SÎÅ.½ýžM.NÌó ö{×¹¼‰”Èq¾ ¬_ÈÅû‚ó&ìg-9å½;¶Þbß`gÌ¡€“icôç­‰k?Ÿ­Ow¤K"é:Åÿ£qoxÇ%ž?KŠ©Û»¶üÏÿšbC›)k>e΃kÀ ál/ÐoAÔþ‡e ÌíÃ=ÖïöfQшW–šVª.÷f††Iª[G-ÿî§ùo~ýû¯ãñç—ÇëõXËhñåÒÝ€…kÆÂøc/h;kbXò”7ËÔFîœl¡DávPP¨àÉ2=ÊI6·V5" ÏüJã çTæñËØ}"9¦4§­vkÁ•Û|8È"ëš¾²G–änáòúìüÎdç:B73-ˆÈ½™«8ÁÀÕH…´a¨¢^<çTìÕ¢ÐHÈ1¹£K¬JÅUëÏØ.t™ñj•n9vüOÁþ>`?#Y.ëX^iŽ»,¸&˜pq F6ÿ·ë¿ùËË¥þþŸÿø‡_ºüË-ÿ<ÐÆý`¬BMòÇаþË¡Ú"¨/gv'Íî ~âS2MmÿÚ¦)…)ì×/ä3ÉKH¢ èÞVeN©:C‘4}F—Õ[™ÌR¤Ð`€?ÞãúŽwN²–µ¿_Có%Ú‡˜ ¢:$„AãAõÄ@ˆŸŠ}É‚Fo#b†ò4dü÷&_í:üö¿ (‡\Dù•’„0}_ €¨¥<«Ÿª•›r½´mqXÖeiÂSFlžgàøë·ìÍým›ŽËí_Åîº=ŸÛv·ìæÖ0p'#0NPö(ì,´ÝGJ3ÊA{{ õÕjWÑÙvó‘Æ 'ýÛ‰ÀU¥Bu¶°£¼©„¹»ù|tÚíè×Cð¯„íÿh]FÌ—ôI£-ˆVç£ ßñQޝCŸ§ËßÖð˜Ëë¼&ÞQži]8EBî!›!Ÿ²°´-ö“Êt…&‰ÔS®Y~n©xîk´ãGã8å™ëçN¯j¼tâØ¢è`®ƒžÎW¨tÿã·qxm§?Û÷º>—cSüŽ18–ŒnKöÈatzn¢è•”Ùkˆ!¶Ž5Ÿ×ópPhÉž3:cæ»ù7%•ñtæÉ3È$?4ê‡ ð^‹{U'ô)¯àÅwiš>Úö± Á2À‘vË¢x>^ G ƒ$?)ù…U68…ÑT종>©P—™&Á ñš•à½%ï8MOwci±•–Q +çjØVý©84| Ú¾[A{ä/vÆÇñi‰¼m™›J#¢*Ðí·iR# ó¦6Yÿ¨95}{ÉÌÕåòVu>>Ûúó¨Áñâ<‰ÍïË´Cg=Jg­‡hKy¹;²SŠ4T\ZÌ$–²+·O)äOÏÿóNö²ß¸uñ¿ú§éû?ûñy6ÏWÿò§þwv+S+ºââ4Õ Ö‚k“@‡¢Úø Ü½…GxôÙzc>Ñž±HzÿEMýÙLû+ØÅAd—¡ÊÔà:¸:‚Ù)}8P™ZxºNo9Jµ+ôÅžßí÷ÖœYö—]›&j^ºÄD9.å~8ìé ‡e_ëãÈëÇ÷­.–š ôúÞÉÔ`møÈÙ¾bÙéRбƒæw£5þH’R†´„;þ;Ù³àÐóY8: zÎUeQ4àõ(烮Eü @ù‡!þË×ÿ)§¿þ?ÿúÿÇîŸÀÞœf©P%ä7£ßìà%pÐdÌ¿’…ÿã8Š]¦@ÿý£ëÚòƒÒ5 W4îÈäÇ æB ½À"Wò80ñe(Л•=8 Q«L©NÑ"+žÔ! öehØ:¢¹›ÓG'p" ½N컊‡6k%ȇ¦p_°Cš¿µPÒL×RÇŒ i|{ŒûWh°ËÚØ=Ñ6æ8[Þ˜²¥»òKkïùxÖ5çe¿nÍ $` dÉq ÑwôaK’¤qi¤Ùÿž•d[é„Fwxª›vŠ­"‡(,¾›Îö“ß 6\ÊìË¡Äé)LpD—,VeÛžE°7‘]ŽM:yÙ2Èb'?ÇÏóÄk—ÊQV½~î" ZŸ}v¡m|wÒdbÝEÐoeB*iStÉÁiá“)rEŸ-IâÂàºXÙ?(‚#J÷P7í27³ U‘8Zá-Û W-LŒz¼˜5u˜â¥ƒòÛOM «G3ßô4× i!K"{ìùˆ4ö¾ì#‰h´´&"4:{´Míw—µçî^»ܽà3²$NR¥³ºçÐ$ÇN›ÝI;…PíÚàþÎÌ)[§…hïÖà¨8ªi#–jV3ØClnòl…¦Îíã/a›Ü1H|vr‘:Iå…P‚xTÔ–•-Mh×fØ!¸Ú‡DÔ?ât˜Ð¦¦Ï—¯»âzÜ8W [ð:$k*0rÊÇâí‘ÿø¼X¢+”‚Íc á½Ú}•ðÚþ:lï‡Õeì|÷®æ–5¦d4ýíqs­§w@ÖJÈÎ}u_)šÒTRv*°„8“RvާywÆþXv£ûΖêBÕÔÝȦwØ.Ø­è(}\×ÁøÝ¾-™AØÞû®,Ïšý¢l%„]wöjp¥ßs„ò©‘hЮÁÞ»²Å „:´elDtŒ­Û£V$í×o*{ô†ÈçSžÈáӈĬ'¼öô¾r$ |Kߺ˿ *h\ÅÈÉÚ}ßô£diV;+ÌDìÉZYŸå"lÁïeŒãäxØ£/ݬЇpû*½n ѬÚ 2&}‰ñÑÔ÷ÃÎU÷¶±}«ÊÖÛ¥Úb}NUÚ¦ñmÝÜö(« ÿ‡.·´¾íÇÑHƒ({Òèέ&oƒ»¶ç75,6C ›kc;¬vÝ‘áâaÆi€©—%($[H½f¶búz´·­¥ëR¼ÊÀ<¨ÒFX ƒIS3f¨‹î£²¦°IE%·!àÔ Q‡È±]˜G(wQM²F‡}U4}ÜÓök3- Rgû>(ó隆£Þ®aûCX_ªEd«²dÉܺ‘°%Ö_IŽî§ç»¥®ž´n`Jùl1_Ô”¤IÎmÁùìÕŠQ@;(vn´ë*£iJxØ©p!‰[e¢Í·¹mžÒ±O1úUSg«æGÉVc´R“·‹'ul.ýî"Yvü²@—ð¯«Ób„ÜÔ2ÌÊž¢¥ËÌß÷á~Rwk­gx†iq7À¥ñ≆òûsΩælAx\U‰,Ù—“ÙÊÆáàÐcG‡F”V ÙÝF)=Á“Ýq‰PEâ…-ä¥6ÜÞšñk¦òH4°Ö[À<Çd'~eó<Ž#æK šëö{Wyá¢Û¬Ô>¢%öM{¾¸xØs¿7Æ¥ñ aIg›§ÝòáI•DF‹’§ŸYÿ$.«¶Û¨þóÒö‚c£˜ö¹„Ü%ÁÜ÷vjúþ˜˜ÈÍò)¢™h–­,Z« *•Á·¢#ÂþªuSÙ41´,†=íC½a}_ÕTaÛÐníø Ùþù^{é?ðž9>u&€ZrË?ÖtŒé^eWUªî¢ °®–:…5X°µ\C'˜Äí’FiC†éÉ@ `“ÐiYwi‰ÿÚÉ"D–fäæçXÄ(×â ѸÚm™4ïõkV5g§çNšõ¹Ôí(ݘÒ÷áR .ûp"~k6ê©nÚ8Ò1:›@ wD«^ºEU·¥‘©½U8+1 ö=‰Ë~.;מ‹í<úO”uð!±/nýÿU-ˆ‰@ØæU™Vib‡N´NR‡Tûµin’y²ú©KvRůˆ+&¤¤ì./eü’ÃíÈ¥u˜Sÿh·#>w¸/€°7É2_K}Éó5ôßÛã—`‘¢ß‰~K LéPêÚò±S¾Öå÷p‹q´ïz-åN¦äG[‡€V²”Õ_d(öŒÏïÖwJVU _V!ƒÇ.>x­Ÿ†Õ); `JÃv=¶õö–ìè…kNã¡ÄƒwFާâS+Š™¬ƒ —y±ŠdÝÐËg&êО¾Öðɽ曟 ¤ƒ^–D…ùÚìom—Ý×jÿÂ~÷ Kr‹§ŒIðì䵌{š¶@gW°’m]µ9°ÞêiËC²®7¤‹byó™«öê[—‹;]Xì Í<Ð4(¼W)wJš ÃMÆ-ävb¬ã ñ7û •†‰Õ¶Õ}¥^èÇ®ô1SûšÛéÜ瀼q{™r×s˜ìÂв‚‹Æew-g'ÁžÕ-?ØÚ²òö÷(q`p2€½l8uYŠêÎSZDËô“ÔÐ/àÙÀxÊá¨i½¶ºñeÀã5Ô«E„:/Ízo€ Ôæå5„ØÜ²¼f YlD ¡«u{¤=wÛ"^Ž3¨9™Åmj±^C·§¼võ}6f ­›5¹î_ŠÅo|3 ûŽ¯Öš‘$šn©ïXmY„'ËÞvIìÜßb Ó€À‰ýÅ÷&Þ¡¢ã·.‡]ÆhG:ð¨Q?ç{Õ:±°®ÐÐö’ÖjÅÒ+—ßÓãrSÙ²]¹Ú½²Þ¶F²ã­æ”Šõóà¶xÿ° P/lÙÃCЯ¾Ôi'€Î”¶ù¼6éb½GX¬à›Y­Y³—].ÄÍŠT³ô *ßÜa’0ÌHÚYçˆ V+ÑÈ-¿©+l·Fp òº ?Ð Y%)U‹ý ­Bö² æO’‡S+pÞüážf—ìáä -uN#Þ4ÍÓŸ‡{-7mÉŠÅš‰@=DªY|ãöÔ¬¢{)â^ZádÉ4ùô{>/aÌ'YÌ¿ac`Ý'ajt`ôA*Z¼mLõZ’ÛVágÖO{)Ýÿ±1~ hÊÉkfj^BÐVh A®µ2íê5Àt¹…³>p}i¾¶ám í—f½q„¶z2ßí3Œs3YÕñ­Ûžð í¼Oö'oe—v{ÊØ´í"|¥o!þÒ®mA ª·Þ2ÉûçvArtuAk(2¦±Võ$Õé’®/±»±Š±"xYƒ!;·±_€Ûm;ìâ=Âc ¹­—‰Zn“4sÐ3±ËùS€ßÉÒþkmë~ S,”\ìþüb‰ªýõå'«A.aèw4ˆšb3G¡MŒëø¼óÓílô¥lv‰¤Är‰ÅBä/–ŽÞËøl^†`%1™ðˆkÃl—uýn7;H)hgdÀÉWĽTϽeÅÁwѸ7æ)cË4¥…€Õñ%Ñka¶QסIR:ÖУXHY,z¿ Òô#kôì†åÆ+ÑÛ¸¤šßÁíÇ ¶¹;à¨×(½P/e&ÜÕ‰‚Úòã b«ul‰3Š=å*º+¸Sð%žºÊåSÖO‹ÓSÖ¼Hc ?/ÌÈšœ"u”aô¦›“ÆÊ»˜݃Qq©‰Ã¹ÏWFÉAnN¿ùA°`õgW„kCgJƒzË6:­$oÙ³¬ÊùÁÆGa{PÑÙ¾¦××.Öž¥ÇGxY›KWŽKcÿt‰-úû{|~0_Âõ¥` âÊ.³“Â…|žåkØ;Š„^Ö*‰×g&{VTor¬Ö6·&~%Ø8p³³lêÝ-®®[Üg Ív»^¨Ø­ñ Ð馊-§à;“)•ÃDy2ýäœ ,ÈÆ.XB³×Ÿ>Ê×GXþ‹vø1§®<·´¶A4_Rß¾¦õ‰ž¤õ«¹ ëâ’¨¿á´~!Qßí¢–¥”q°rk=WöB¯å¾<&à­P”]Ä>‚‹Hgäh¬³¶L ¦¢S}Ž­„\ Å…}ÆMã6„sØokX4rC \Ê |r"“ÜŠý hõ:ÔÕ’û#ì“n‘+Ö`ZšHΰ~`Âó÷Å.]ø:„W —¿hϸIu’£©×S1®œFz)š+¨ñaþ)¹ Ù´"»d骷åâ&yL¿Kr‘ÂY¾ê{ ó¿¾—?ÿ‡ÐÚ7A6ãKR°Æ½¿ã¾ÉyÛÊÝôb_ë SG,(–gæVÉ@µýéb"¹LG'ˆmݵåÒ)—ˆ®hÎtºÛÃåZuÝß]U:(rÜhiöŽ¡(AtªâP^i»Ú5Âõ*]t+%#˜Nø¤6*d™8hB—/¯,â–ÝeÕèPà–Üøåk%·HcM>aãÍ­ ›øåwùW UÝH|·ÕÍI­£z¹Ym~Í8ÞÙ“é„Ù@°+×NòéÈ26³É ¢zß8ÊË[„óöô›¢É,Zø–Fž©6ŸO®ë$aR„ñÙOË7r;œ«\aÖÞYžÁEÑÎS¼ áÒ²r¼×„õ“"Æž:~ý–îÏøë‡¸:u"ìÿŠÈý¼‰“êÇ j÷@ÕšŽ!ÙwÞj¯—”…RV–Â~–vêõí_ð¤—E¹Ý'é´„fûD<]`w¿lâ©kíh‹È•HDY®mΩk§tgáI®…W%jñÕŽMûaÑãZ×k|YKüÖÔ0]ã c¶ù·“X.Gá6”c ûh'éÖÿS³Œ‚Tv°×Ib¹v×8„7Š”—‚žù˜_£l‹f+¾fåÚG8E¯?úöõqœ+)j¤>ÿàµ@O_g&$üñ©¾0åÄV~¨íȨsY¨ ú¨+>Ö¦-ÁàºØ’דÂ^W78Ç”s*zȲº[LäTIâRA:jN`c¨>€s£ÏëÔ¼X]9å\Z¬ ‹I\áÃI@EÂu"sí[Š,C$,Ó¸;P%¤ÛùàZuñ¡…t,´›ŸZü…pGFPÛ(`È'*¢´n]Ë.'±Ñí¡m›ÕÐ5­Â}¤8½†Ç D Ë1S_§ „‰¥ %á’’ÞÞÂ{ûü–æG±6îòF­ú\šaUY?±J³y<Ë ¥çDÀ¥¨£¯Ï®¶ƒŽ´“Š?¸‡›17ƒõÐÀð ˆy‰0T”™Ý'80ºeGCø4ü”!ED‰Ñý²Œë§úXÑ!ÓS†Bžð!ó:`%…«EP«îF>o÷Äïñe§.²²ùù^.ìÝ%"·Á\Ñ5ÅÎ,äjäðž:ŒÅJÛ-•´ßa e—HpóGÞ¹‹:C 9¸=ƒM¥zt‹4•„lM·HyûåJ!PGeÇgÍŽàá*éOk F‹é¤¤ÒÆjÅí g”î*ËÀº`Eà²er3k'¨rÜÄŽ;m5I§ )ظèM¯V– ¬s«f†g׋ òQ§z|¤ Juq2çÙ€k¤³Yw(ñÉJahGÖ'y¬+–}}â{ƒnžõ9< t*‡•GsÄŒªÐG•>fS*©íÛÀõ¹k²AüI"±yJÙóE .¬®¡ˆ¯ÍôÖ\_¶Û¬ç{ÿ÷=ß:hõó’~þ¥íXØi³ÌñêKzÝjkˆóGµê?'5˜FÑë ®â~ÞO¸R¸.è9o£ü’=p|¸EQ'ÒŽ cÌ:·‹÷UŠGWï­µ–ôë ^(ð|?)n{õ-„ôÇC>ÛBYP‘¥S]X?¢Ñkynu¸ÇqmZ×È>÷tµŒ¢îS‰µç9ÊOIer)í9"| š ¯òÞuõ¡™‹ŸŸ´»:„ýL*è}eÝí¡iZï:pÇ)ìƒiñ¥*y¡¨æ Àö>šùÎàýz‰Çܯ6û3ÊE \üú8 ÕZyïû Ù‰SOΊK Ø?—ç7ª$­…0±årúÜ ¼-§v>{Ÿv^­ÜÒÎ Eª8Y°ÇÖ(×ÚL¹y³jçí&j¯ïK÷í@#úåQóOG÷S׌oñå x 9Ôµ®“a‹UêÏÒ=1}Ã\™®›M6¯NoUÁæC0Í‘­¤¬ã¬a´úáII+ǃtú@³úi$舛ûÐÊf¡•`Õ£Ó„õÒŸæípd”ûÑß-M1¯y öq•OÆ`þiÌ}`š'›Ã0Þæ&O4k¯O®cE%ò4G¨Ùæëjñ”ÙŠë —i¿ÄgÊϘïcb0OFˆk%¹žú+¬eÀÜÕ®‘ІêEâ­p æ.Ï×a Ÿ œÁ8Èü=ëJuáT˜:¿ï*kÃ%=Y¬N7&‡äÞ«~j’ã9-âβ*¹$Êôà]ØpêÄÂÌÛj])ÖM+O GÖ.»à6OÖàÛ£ÿÈiF§¼ÍõHžjWhLz40%Z;² m–ÞÊ©Y ÎÌgù åï ­ðܞ‰ä½&¼bˆ÷×>™o3ˆâðçîys—­¦µ{¸Èµ)èÓu©<,t½4o×úò¶Íöfžíú‹uFÖÆØÇ)Ï%ý´6k×üp%H{²¯ßùTDvÉ]b>…@¸7×¹Lˆ§¹%Ã'A”ä`+Bcƒèo7Yæ_¨Òøu?©¬ân¯i¼U¡êDíç{ ®[$4@û¡M$Ùßù¢t®Òb,á¹HÀAôÞê˜pÿHÔä‚Åx+.‰Ö€òZ»*iÙ‚Œïù*4ÀiÜ`ûÜן9Q7J\ŸÑ.á¥yïì93‚”‰“½ØrŠãžâGŸ,ØPO›{p»y ¸XFH÷ò8iØñÊ“¼¹k|¶(ó†jTâÀÓ€êêYàs¥’DfE^GYÊFû5"FÙʈÁÚö‹Ùcj´s’I‚ì/Y߈·59ݘû†¬ó¤âR£úAcrûï䢂±!F,£=³+­gjUXûàj.øe8?É¿Íy_wÈà™ªºYt¤¦·£·a[®mx™ÊeÂØýý—ô|/|»,®kï0{z+™~Œm_ʯ5.¹\Ž ««šæ¢ÀüQ-aO! C‘l—D§Ç_,jµ„8²`ür‹_¿ /„|¢N2´¾AOšƒ[3=.Þ®I]ÄT¦šxnq›“µIÝ®öÝO—ØHÖÄY)å²ö¨®’죜+ÊÐU»èVZ%n?ë‹»ŠØÖ—ŒjDýl÷ ê/ßú­x™”|ñÍ ù §YªÚp•"n‰Œê¥‹ fèZÍX‘°mO¡Ó®Ñ˜ÅÚÙÂ? Âñ5Œ/¥ômG»VúIB°IÈ™zv<ËJ¾aؼZ‹†¡ÛPìSQŠT¡ÕKZGò‹tÔ²²Jm@¤O®²-ê~ú~~÷êEÌÂàv-¡("¤Q Üê1ùÚZ°TÛéôŠýÍöØUÝmýpE74¥EìÝOV²¼9ж¨O L’Rìm´n(ü§µÿ†:¸þz<§±–ññô=J׆IXbë)÷NŠKv”-äó7Ö«=—½Ëòͱ›ÜZö+E²÷œíí³Á{͵ÞBgƒä¿B;§ ‘Ò-‹&»¶òK‰—¥¶;XR‡-‰äZ]w@Õd—¡ÎÉϲffÙÀ:v„`õv-CWk|Þ# Z‹//¸]¬[H0Iœ­ ï ÁÆÂÍDcuõý[:žõ°l&·´ÅF‘:Vd @WZ#`[_„ýÖ¥GYyÛÓ3œô[½¾`šþ5®{¡N^Û;ˆ“8ƒâ™}óÕšr‘èëWYuÑÿIsÓ§¢‚­z\·²ÞþÛn𾋞³–io½lblдC¼4H1¿ôáƒ\æ®úò×â–zå%”ïaÿ½3Älõ¾À.`Ò£³§ü`u7ÞUûlʬ)À[µ?÷ °«„ˆŸŽ`~|S%AÚ‰ZxÙA˜[Ò-“ *jÚí:z£„܆¯kt†O¶ysj 3öæÁÊFØ-pìùÄá…†þU¦>‚¦zUßµ™Ÿéy° ¹¼Z~`½lxcýhÖ'âíšÚXW  ’röcW 9ê:7ë"BÜh÷‡Yœµwï*R”¾}הӽˡú«½s(!X`Kö«»!ÿ…e`íºÚvr ai™M‡eÏ;Ÿ¬Ü³jÑŠåDúÁ¢~±ûr ¥tec­ËêfïØ™~_¬‡­ã;¦¢€,²á!Ý ý ;Žù8kÁ‹âê8Dë”ßSÒ6ÊÕß7ÚꉫœQ¹þæ ã¸(ÙE&a¡èºxàÈGÜ3q:ÁTóç*4ª-.¨åÂÂ3•Ь+ËлĮoÇN2Òd_½„bÕvAaµÅb¼ÕBíÀld^÷gi¸Òå6¦—„áÝþçRÆ^ÐŽo{¡„ÙížßâÐŶåé!kuÇå*ª‘â§ v=þ!ž¥”ö"ED7í˜ØÉ÷¶Ûß,GGû¹†§=©jço_…}ÝC8d¼Ž.T©×1\ßj¸¬µ*ú9Gëjì#?£¥ÓЭբþ<¥ÇÐ\5Ø*™a—ûÉe­·*Üq‰ï%|à”ÁriHvhQ°è³T|±Ÿ²È+«§d•ÃíÏ_-G.àåŽÂ*»lVJ=IÍ›òÕ®Žœ Ř«ÒWåXY5`Y@MÃ’Äþå#ž6À‚ZVG¾ˆÅÂl­=9œ$ƒZÕŒe5AÑq§}é®Õa{ËÏ+[€ÍÞ÷·¾üÔBéPz[ÖTßÃÏï’ÿ¼k™.wà ,Ë/k9ær-¡Ckû7´·Sï±ñIhß{A“MªWö©ýTÆ*ŸZ^Ÿ‚¸ÞºœæHÑ[*26[GteHÊÀ»Ãù&„SR›F~§C‘ J×S‡]¾k¸”ðx:Rzj/“£ÅÈ-—Þl3W¶¬¢BB.hŒ|¤õïðó÷}x4¯!½ôÑŽæ}oîkNOºáÎBï-.V¥àF ÊkhÍ&9ˆÖC­{fq,MZ®â{1•ªG{Ný5Šqt‰[…{mîæP7Q¢/\|°Àßi ï,ÐEàá¹G:ö¥· hè¿bñºÉnbvEw”%Ùêt+–h _U¢{;»À¶ßï¼û(á:få›zå¤X)-‰ëPÇ)>Íò¤„o¡t×|#³Ùý̳lŽ’Ã"ÊÎ^û\K¦DvGr ص0ªyçA[ÝBkQbœëk­ ÈK¼[í„G“Œ§ŠkÞº döÚÊïU¥uÖT°—Ô> r¦¤q˜eÃ…—B}ás¶ÁÉï$©:wÌê s±¬t©Üwk®Ž£{ÜÀX}²Iu†Ÿ47hwadÍ`û}m~^Ž­\‰KûGÉ[c²¯Rp‘õ ¸ÈŒÒîÛ1K®[pÓš¨A1#cÖºà®_®¥ø½}kŽ›ËìE¤P`ŸýØëk›^´è[iPÌy©ùK<ì"m´t–Fì‡VÍ'Z­“®KX3hP«?/Sc¥ˆýñÕjáýŽé š¢ð-⼩ªÃÝi$ÀAœµ”rrÖüÎáG#üã$û–Cšù”(¾YN»ÂS³–döA»°@³µË/Í…|QGxôqZË‹uCc“.yëâcë­iÄQÑ¢#&³º Be~;¾}ëò?„´2 [L¢,SÅAÎb¸[6ž›Jv\¹ªâN‚„©Å¼VûÈ9Áª–9¸™èÊ4bœÕÁgy$[é(×ê2¯Ô¹ø¡ß¢Ño@#JÊÏe‚­PÙrl—×:þZ¬^Z,·Ûì$ëÒ,ˆÚ =Ù1Ñ“Xä^c¸…p‚Xê³ ž`ílİe –œO1 kae=ýèoR·êµÞèí<‚H•ŒðáÂiÁq§rç៊úÒ8ŽòcV 9­qiòF8+²!ƬÆ;œœ¥¿ÜL[]„T ¤³§å£4ÁK’QÑbÚ‹²b+ƒ†AV7¥T!.£ƒä‚@"ß7’ôh_Ò ˆÖô¼5@Ón…®Y_ôžÕpoµö2 £ƒühŽÜNbˆÉzÛª Ë&÷õ[þŽš›êÈŽÈ¥i¤]nñõØÃ¼BÇõkW¬)÷N;¸>Aä9{+ñ-x»¤|ÃÄО@N]µÊ¥=¢(€ÎZžžÂÒ„%x·q¼W[W#7gûî­k´¶ØÓΗ£}¯i]°Z^ûòw+®æW„ ,Ȇ{ß, ­Vÿ¯æ/V\VÄwã¼tuørxB>W1*›­ê³.¼“F‰JŠ >8)jUêp­<ü²¾n¶%²Q ½B#b@KÄ0…*%vP ×]ÞîK±htôx£·àA¬:w£éæB±°~¯Í=¿ùkÓÝ“…œfžË¼{9n¡È2l: š>ŽU #(8‰uJ[f…ÝíH«úØÒ² kä³rˆÿ9@=_›—C2P׃/°vEÑÞå>q gåÙ|ÛÜZ?˜b֋о;l=ŠóHÛê'ØøË{›¦RåsØǰ‚pÅ–9hõ¦ì^„»É.ÉJ'ÃÜL»L,¾ŒSm§Šnµ [%ÞÚKùôBmå*bšÛH±":S©9NЩ衸žÞ£Ñ}ÓóqŠ9D-®W@`µE{‡mýäžE÷•›¯feW~»¸/¥ã•Ù__°u»¸õe–:«åt{µ_šúLåõK÷õ5}ù}é^! >ïih!!ïæAõ²×’ê ØÊcµ?i­™"* uë•h°_Á¤¤n_è ´’¢XјÉ+=Édïõ5<yð°¤Iе–Ř¶ÎŒðií‚ö©]€E–æÞ£ ò]†õõ|$%õÎÑ5ã@—C#Qk9>¾uß¾µ e©š(í¦[ŒWd°XíØõëÁ¦ÓOãÅÀ–Ãô·ÆRDÌÞ˽¡êÔ¼ épÊ—Ú¡Çøy$–WäºjšãuánJÖ _ŧ{2<…{å*ÿ'¬ÊEÊ'úA²ºyá¸Û%Âk¤§_°?çžIâ½ánX'-¶aý8r·•?ûØnß÷¾®™ÛI¸\ûÉ·G"£òLׄKdÇ#–s/O.«LNñ©'tÚROÞ‰§…]²±îãÉéOîFzÚÓKMÉ7‚:ë‚4[À‹"—7£ö•¶ËGlŸZåÔ nUt^ÿ(ºãý'åNœpWõöYè¾ç|¯›µïÅ­}ÿ!/"üdH¡cýÜ–‘b¯9Ý !rÅ´OÚ¿´ÃÛ‹Å¥Ÿã{IùšOäó*ÈáišÙã¢3·äð±YSPÒ%ÄWÆ|¹-‹T߯g–Æ_Nò´[!¢[…]Ý1 å’ýÞ²Ÿj“Œ‘”¸„mmF »z¨2Ö¢ZÞçð r‚Æ…úw謪¾6ýòšÔ’/Yf.ŽQ…h÷îç{÷ëLóÖŠ×bIcHa³o|Ä4(lˆ<[…¹UËf`ÀÞõ^ë7‘\û± –‡Ïet=]WÆ+aLÊê,uÜBB5Zª;ük²»À¤Ó‹6ÀðÄz+¹ø^¶O†ÖÞA{Õì‘%èá ™Ðü¬ÙrDesƒ2øÇÅ>N_߷ɲ㵵æfˆ:[¢/À÷mca¤dFŒ[ÏŒ>)9·£å±£pH!k•óþ¤2²cÄUQÀâQîIH”¢>¤žfûÏa7î¼$XŒÏŠƒDŸiIé¤ü~âÊ\ë)2Wƒp‹q˜ÕÇŽ“”’  K{‘mß>žxõÔ\¾´'}_Àøù4ÕòÙl'Iwí¦µFEoôf'à­Xü\£…ŒaVPRns¡•jßBDD·éÞS\¢E¢ÅòíVöR@œdö¬tæ»nëvµ<ƒV zDRí´ï²šî5ö/Zînpû¥¾FK”IÙ裄½ål»"Z4eð#bT7*©§Üì–¿e»“ÖôFŸB•)³/”|·¸–ñ6Ò΋3Óůj×ÚGçg€æî‡AË"ëçïšÓ425¬2u{åü§ ®—Ý“…ˆ;R¹”ÆÖpN5;Mu««.øæT‹°±ÓK±+Ðb‹û&2JU‹  ¹=¸^û„Q ¾Û`Åf«ÈwqY—䧯~ébyKß~g‰¥–*Šô\­k¤5‚”Pcãl]qukÊ(„nsÂÎZÞv©?Œ=jØ fY~c gW¦COÁ9Pû'y.ŽmÊ -Òó–׌öÜñ$ÅuL]È»ê{ÖEV¡¾o>‡§®Ô‹ÿum§ümq© `«åXŽÅ~oŠ]×`µKÿ³¹µÕIÆ‹`“‘Û8´LE¿µVßOSäs¿h³+\ Y ºÀ/Œô*h<îò™P¥£oÙ?‘Û ™Ql³n}ËædŽr/õÑØZ/LhW|Ù ÜŽúz_À GQ=±;¶á±à] Ùˆa”Hˆkk…‘…²×œ`èˆÞG-€ÂnÂqX¡OÖý %ioo•ß xqŒJ9áÝS".mÈα5ÔgŒÏ%lwœ?Dib¥MÏ*±°4”d›OšH<§Xö"[®¶gÛmØB Æ›Âá³n—]plÉw)íx-9Öï+#䀒ø¨¦“ -¯¹S<"£Òl·È7ˆb·¾ÅòÊ¿ïͳEêl<šȪðýڼߚÖú¼÷"¾ˆu.yýصž x§À[åÐ6óÓîWâØ0WIt@¼€ÓÄ”ÀŽîNçÑ´hS‹(4`y}ªâK+aùšêPM‹ÈO´Ú—[Á6GGwºAFý «}dÕýí)÷4–;o‹m\6qóÌYÎ9rîE1¨³ÜñIÜÀØØ%·$mùsØÛñað²“<ÙÄiuûn KxNL„!£ ht¨ì¹ôá2! º¸ˆ]:å69xCºÆñÕ¾ã|l˜É'RÚÞ–èòT—7FoöÝ(ÇùË2αGeE×ÛÌZ÷(ÀÂÃ<™AÊÁ TL ­ G´R¥­´$³ }ÜêÄ[üÍsZ±PrmìbaÄL¼ƈ\•B.XÝI0xZ鑹ØsG>Ú¾!rìdµXßl+ŠÙu—Éz…ž ¤ñ.xTŠnàGØg€Ñ!¼æ4r 6©jÓÊ*ög™ ä«hå^õL•±,jM9Ýç\,NÔ#Q ÉÞGÜßcóA«n1™€·OÆIÝ%ßi’Âù)ÂbºÃY”wmR‰A>𪨳§P•ýû=–¹iŸ÷°ÎPËFjȘXF6öôíTÍ—²tªa´ëÝææ˜å°ƒøºíãÇÁb{*ÝØvÒ?:à–á™/kÓ¿vÓa›Êl¹ï‰rKɿ̓ã"“¸~³í“­Iy–³E4«°l8zë„(%§-fgÒ%; Y)ÕUrHíáS €­ «Ü‡Ž=ºê‰«ë#aÝI|¦•ŸŠ½ÈOÉžü*ذ5óLÈœZœ¸¬PD%»=w¦Ùíe°Ï¶r1Itï­Y¶úÂØÃºOuçÀsû¶‹¯ >.Kt (.]ñ|6»U¥—ÍGƒ[:ÓvjÒKY¬±z‡T=äpJÙj-4w{޲Y@tvÒÜó¥;ž×Ãžç ·ÏOM ªÃÑüÌ£dÙTÀ ‹¾[ž)} Ñ—Òê,¸fŒ"ëà¾GRXªë4¯>´œA¸œëmÿñ°—’Æt‚ÛÐ]‰‚VL"Ü$Û+Ó{áböØ<µkYQÊ­ÝøíØ‡I[ëkŸ$7â ^7EP”êÑ$ø{è})$˜=Ta‘ ùQžù—Ì^D*_"t)Ôß—k¶&ÚbðÇ£™Õ"[Z@fKni¹ÅîÁªë2p ‚×tI—1XÁóe ýïë6Ñû箯.b¥-‰·ä*ÚÀ´j[„ê@ø2A4³GbYl™é³iôïV€Æ£%6苇Õ}j¸³|¦áÞ4ž<ñEƒ^02ƒÇ$Âç½ ásìÎXé â·—6p9û\{V“Å ìÇUSí‘Hl”¿ËFn þÍÐÖ‹me€ýzÜ–\a‡t§6Ü«:NV7IÇ¿ÒB|Žzò~ÄÕXHY5õkÁL饄ɮ–½{3ÒÍÇKŽƒ\5v¶÷Þ\séšÕÊëx<íþ½wiÆ!ˆY™Ì)6Q/ì£E+Ó-cÛAœA°î–1˜e[%ç!àg|Øý©ÓÊÙ]aµ)?4†>B±ï¨]a0î.^/H6èËNXz m’ç!ñ?…Be—ª±š¼”±ô}žaÚsï7»ÿ0#±o¼Ã.2°…îÃ9?êe.VO$Üfú&Ü®ºÍ’NÀninF\ÐkÁÓÇY ¬Ú*d,j¶¾{’¤ÑÐã‰~ÿc÷ñsf§ÀÔOå—Ød–UÊN³“¤®öÈ]0D;ŠÕ¸ÍKj¯¾/y½–wk_é¸Ç½ ök—t‚€'-o§í0¬ cÏg€ %îÞsl…ÿÖ¦fë<ŠLÁy.42IœE•|íOŸ§Åê`µ9Ý_ð>ö— J>‡MÍ<ÑÒ­2xjbíÆ• Z¥ BÔ;z»ÌÆ 2«4/0ËAÅ=­Í:,ªµé1ðS^#­óG OyVö`þs tãÁÖ"ÜHŒ ¨€àUìé\ãÍG_Þ%<°wÍ]j.Mu’ažcÝ[½Çõ]+õ,’ÜŸ¡;’B[·¯?äíK˜U1"Ž´±ÜÀÛ!Ðc^Ï`ä÷‡Å×x£+B‘…1¼=Û²^Ø,I—Asªû?‰úƒ`DðÏeÚxÈN íGõ-³+U«÷0r~ y®ò˜È–g)ÖÐ_ºØ!ä› 5Ÿ Ôd±ÓOÍ4æ8Ö§Ài{éÖìn« £„ƒÖ½s—« œ3‘‚×,oß 'éÀÚYTï´–[™ #v÷=>ÿ?s™ßÞÚãµ®Ciµ SþíKEÁaĪçeo†È`ÈÂOkòÓ¼±¸^›øµ.­úŠ‚˜Š" æ[ÍvöÁ<  0w]róM“ïÚ¢Âv‹É•4£\Y=¢ uш°ã!® iüßöçVÛ[IðZÄýì›nÖ\Æ_ª%YkîWO¡ ˜Sò/^åX#ÖŽÅ%Ö,—`á寯»M«­ÇòŒâž4û¸Z—rÕ;ûÄ}’È vÁdoð…WK#Â!v8ì[³§´>B¾ó·®·xûA%òƒIÜ ¡R7ÔIS¬y'²µƒ¥dQÕÑÒA³/K8ø²Y€ö®ÚY~Ùë°àû´[«×NKËG`_Æ‚Ç '÷…·»0/`¹ËP­î{øaw ™Ø:†‹$«ŠtP2â|‡³zÙñÞâ|â sŠVA(»jD–Àr— î a/ ù.Õ·,ï£1£ÕcÍ·\ý1¦ ]êJTƒ#{wˆ5‘?êú‘ÀÌÓj;$&¡xÄaKɪkiÊLÀÄ ?æË½„›tWúU.–ØG oúž0¬ÅÎ}l¾Y(vN_Çx»4OÙ^€ÿÞÃÆ ¦¦ ‹l~áæµ ïhOyK›J‹„6Ó×¾<+Äj»WE X·Nµ <àQÁÅ]êØ_´àdÅÕaÙ’€÷:Ò¾ÌÆãûþ\1Œ/‘hxg¬'N Pª5™¸ŽÜ¥Hÿd7äÒÉ`ÌúyøµÚÓµÁa§¼áƒ&>½†ðƒ´¢„|‡/ǧ†\¤ääòðN£cn †ª™áû/qÉJØFãÕrî­É/ÕΨ[ëæð´û©¡Y _ä±m­ÂÃt¥rØ´¨ÖVìÓ†ÙAʇý\ v7.-h3sÖцVظ/a8°\Å{>zäâôì–ÛÊ6ä¡¥ŒÖ6ìCé/X"+’DÃ{øhÓÂHN<2)ÚÛOx6€“gkH,N.Íã©R¦¥ÌH;ÍÅøÔ’²!Î$UÉ¢¸m¼Œ§J+î¥Æö­DÚÖR¬ï$-q(¥ Lw>c‘†– /}ŒŸHÁ‚ý ‰ lµ÷Mj‡êçBÀ¥¡*õƼ(ì5µÚuV„A’S&[éœkà ô{|oöGž©“¿†ñ&M+Ë&XcÛ"ò œTG ˆÙíHP<›xGï½¾^c÷b£¤Õ¢Œå…j÷ÑŽ¬Ë†1Ë¢ÇE7iÔSÏî’MmÃcƒÅÒñï|ìF‚Š2šaš¤ì¾šBbäîiÎy:޹”y>épRJÔÜN)—ck9Ñ-³Ñ3ÓŒüÙ{íÖbEàåÇRþÐl×B¡uÄ6‹)³YðŒ;Š Ib®s§$Ï2J™XQ?í ÊÑ!ƒ;Y|ZI€bRÏ ú¹†ð-†¨pÖu C¼¾„— âw²,¢ÄkT‘ ˆá¼ÞÒOùAö¿¼–î’×=>¿§i¸6FTílÝ,”|ë÷Ùjçb_@IÖX1ÜÅ‘pom‡²7]só+­íÐyFR­CƒR >íò@jÀÎfä³0¼ßŽÆ—^QÔV»Qh¹è ? îŠ©qlCf„Ùå $‚d/9E–}_ӚˬV‘QúûŒ˜e´ØÃ×$¢2«k¹K[X( ”6 #°Q“¼þMs0ÿâ½T?]T¨u;_õ2å­µy~kÖBµÉ×®X¯ME¯ki¶Ñ@Ø*ŽK¯«/O5~<Ûxâû_„YŒ²ŒÙ…•9w™ÀØ¢úß!”¥2ß·¤EÉ“ÐJ°qR&Tõ»º§DËŠt›T\ÐJu Ÿ&óΆ>ëB(,XÔêÍÒht/ï$\Ê­Ç#|¼—é{ù]m^šýò'û¥¾|í>~_òí 0ëæïTÏm ™öö×g«=è…šQZ“‡æýeO±°I'¿,.˜V|ø¬SeôfUï—W$¹H+ÃPh+n÷ü 9lh 1—³ÂÉÊ «X,T¿$êÆÇ’>4`(„4¨]¡½³–šú²³z%w=„ᱎ°·PÚ»Â÷hÊÛÇ.o-[‹r³£E«sÍŒ¡SèŸÕiVH¡ï;tîí0à³þž Õº„™»Å©(í‰Ôpz³‹nP1¿*¤µužõQ6¯Ü(Æ“œ`¡1<Gû­yÕ<µÂÛå2DÍ[3ì ÷’O¿Q#>ÚÒ¾DÆ ¢:ä{®DOÑ;ým¾ÜëWñ^?B³XÜX#d¢hÿ~“ߢéÒÒ•ùjù(¡Í¦èvvó9Ö=œÔ£âÍ4`¹VòóÝûÎe’ÆÉ eð±˜Ë‘›Ù@©P‰»…õ³ìÎéd@IéÖRâS·f!µDøê…ŠáàNRÓ)á]ÔøÆÓ¯²º¡AãJ>E$¬…¿]ãñ•†ÏÊëïGy¹½¦±c? õ[ùúhú{º¿Ͼùu× ißÒÛ¡`{v ²h föA‘kåß~¥su½‘(@z•n6"1)”îʦ¥ë­çB.k¶­EWý[:€Ñ û u‚bv¼ÇmÈ×ÿ ¼½…þ"©¯Êrf_$¥fb»ÄâNÂo§pÕØ§ý²/) û˜ûÉrÖšÖÞ:;á®Å¼Û®+‘Õ"ñHõuÁK³Ê ƒ´Åj)z(ì°¶rº %q v‘ûDÆ.2 i7³×.p Ö—”òje`Ý4U+$ÇžÉEZл@rîZKîÅ”°ZºcÛÿ›_CäF!UZâ/ïÇÍÏ]ýS+K¶'4²áañ´kŸGóž+ìSÜ-G÷€ ÀˆÖR0.f! ¨oÊõûÃ"ÊnëŠøcWò¥ZıgAõìe–=Ó=b̶"ThåÐ1…G—ïö [ºìáT×ÐÆâó#•ÌOâ 6lܧ,kó*b޾ŠB^$”4]q]‡‚nª{‡òª Ž’¸Z—hu¤=ßË@î~ʗʲïßq(-Fî[³¾·Ç=´K¹ü©†G»¿Æ£·â“¾ê²!C–Ð^<ó’{˯OÕbu¾4tÓÉ5q9b×)Œ?4ÝÅN‚¸ÖÚCÎ@š{‘1æ€ ¡fÄUxlnݾIÊsãÇÚ¾”u¦I Jêð›QõæÕce|+ÛZŸ%ØšÚÜ\Ú¸­q±ÀËݪ”=Ž [_'ŒµŽ;™ ãdˆú-…ÓØ#Ÿ±eRPϳºž@=çñVý$ÉŠ¹®&žCPÃP±•íˆ[©ë›Ò ¨.Èþ×ÇSDB†PÀ¬_šþà¸;Zëb6imúT·k}ÚÃ|h¼ŽŽ¢Lö«(#¬€ìž\'ïÎC<ª*ØœýÐþãÆŽ#€–8®%¿'ânŽP:@Be:;[È™å• 3+º…\fÆê §¦Fp"´\xKgb@p ÀMI©‚ˆfe3ÛUI¹—ñPV”ŽE’p#—›vVÅä›âîwªŒ‹FrÈyK2©ž”yý ÙË:Yc8—òDëÏâF<_všåg‡rú¡¹}ÝK{üúH9·ö‰Æ#X%Üö¸Æ Õv)‡} ׋gi¿Xد=ºAñ¹à•©F¨tÓ©_2µoVëªoÍÞjøz|0N½øwEô1í0^G_ÈiÞLN‰Ä §ìZÚÅCB”£ÃþU k-Àú⼃¬®,XÕeF«à„íA. _ˆ+ÔVÖ1£ÉÓcËÕ!º^°¶®‡àxIMèUCb²KÈs¹1¦ºe’íI rkouFJ:¹sù'Hö¹Q.x/¹¸Ñ4!& c™kgk]9дÚéº\E¦^æòýHØS4PÞª’Ä—±€$—‰ÊÝ•TêÏä]žl•oSmùÚ·¸0(;`ôC“juö•›ˆ«Ð,*Žƒ”9:¹¢qM’Ú}+œ.×ú6•Åã¹Á×´Èn³X¡ ¬tRƒ jvŒòñÚßU{}qmuÓ©Úí%>'(^Zîk¦‘Ý!Ôùn/¸Éx4r,)ï‰}pÜä!í¯n ~Œ$Å1¤±Jz®XÒÛ=›<ªâEÄÁ¼°2З©7VŸZjb ’Ëáæ·´ªà¾´¬¬n‰²ÑòIÑC<ÕU —YHô-¤5B”Áö©?¸žI‚¾š¯ŠZd…¢¥Ý|#ˆÔ†=êLB}ÑúSf-Bão&"ä¶„ÖÚÊ Úô ‹•8(†mŽË#<çb-,½bèãÕÉÙ¥…kwƲ¸ÑÇn«ÕÒ }waB®Ú™ÈÚ“˜XÈáqÐZâ{‚àõЇ÷éxo×Û4DÉ—ÏK/éÊ”.¸SK¼^!ué>œ½§w)×WÔõÓxÕu¨uÍE¼:WåõÓØT(ë Óšv ûN­ œäÿ@h¸';ëkÆÎ-ÜPØÝï!|ÐÞ-b¡å [â X13 Â}ã‰Ø[šV¤ˆÉ!=ߨáà˜êÕÞÁ3ÎÀ;›ÛÍ Ùºº·ˆ{ŸI•:"+ÁÃŒepr"[:«)fCûÂÆ k. ¶Vh0q}ÎÍvß;"ÛŽÏ‘dh¬c)Ô¾>$µ{Úu¨C=-õ„Ó=Håì{ëòïúx= ‰C ‹*wñäÆ"r÷8Ü…óÔí"“´še{«4 š"3L×iÆ¥XNµYöY½Ó­!ˆÏÌ$[>"XŠNAЊº-_ÆxO¥ËÑþYré…ͱ[²ó¶…Ë€:„…eŽ««$Y!3ØoXQy+Öcßbù·ÅÙêÙÄr2¸Œ²³OÙ_êËmï†ü½†mIa‰v26õyQ.™­/s@{oƒ` ÓwH%;Ñ2Ùz ñq«e|.õˆ³5ÔÌ*í¯ö3žV§joîýMpm'•@§X@7鳃F®â…!ž#-È–C`u¯€e¸$E,è¤ËŒ "ï–øZFûê 5§Î"þÚŸ¯G;àÆ³Ìm÷Æïêg„¼(CÁ«§äüæ§DÇtù]Ó†sqëÓL¥ì¯~ÖÝ´ x,iË¥«/—ÃÂíN‡ž­ÂèŒ %pA …K¼±Û®eÌg‹÷ö|.ÅÍý¼æj6…½‰®^d˜æ!Ü/ËîP]€OJeÞYÛ—©ÐÄ>¬aøo¿]Îw[Š’E·#;øÂA ª†Œõfo®=R,À¼‹ô¥8"dÏž; ®ªòo‡$×0£há"•­Û÷îÖ4¿ïö'|Õ*#hp†ÖʱkN‰Ò skHhAÐ8ëúA¢tóŠ ž6ÖÍI”+´ú®°~J7¨Ro¼9Ð —h}8¨çp²Û9L—­`~€/ý–c¿[gÚÚ¯·ÝÑ£™–Þãú›öïÿzOïé÷ÿ|üÇõ·ÕŠ§Ó H¬jý,r»„ëÙ Ôg‘kæQ0×¶Ð@žDÄžúFí)ÑØJѹ&Ñž±N-}#Êb‰.†ø·Q[³Áëð“ãœ}+?5›ýOÈ^L7í«l¥W?º¢¤’Ãw ŒNó¬ÆMê08îÈ5f!¤ÛU=¶qˆñCœuÑy©É•:ËÇšSrÛ^ HÞ—²ø0^KXÚaÈæqm¤‰ómÿ(µê/ë¾Þ~?-nßpO0 Àk«ŸÉpâu½±ÜIÏÆî©D°ý2;BŒÝä!¤ØPÉVÈVj~r&1³Ú×Iîp•µ¿Oœà­¸™­·"a±›HÕÞû¾ÄâžÞžÚð©ÿÿ¦køÃüqš-¹òëÙ-¿Ê óÖâÌéwKluD†ûZ¥Þk«Zl]¿; –÷¿u,vJMº‡ÜÆÑž[îê­R¿F7ËçE8Åa[ªß_8d•Ëãg,”tð|ý’B@f% ãÝÔëW«K€R9<ÄÔ»Éé„<®üãÿH¼åœ>)ûþ-ñèóSúôŠäãM•2ÅeÍhAKç̧³±þÿýmûq‘#wFýÇøÿŸ¿üïÍÿüKüøoWÆ×“½æ|’öKêúFßtv»ú±%Xœ¾Ii¿=ÅnNn‰>æQÊ¿ÆíüZ†÷æjô] ã˜F„xk¨iœN+Q™R×(¥É/‰KE2uCñø†â+›37+òI¥WÝì -ʽ“ûÕ:ÇqÍæõfy¸‡Ç’v1ã§VûOþ{c¾¿Ýš{Ù¡FnÛ=—M:©ÒÔç(‡‘¯é[söê$…eg^’›ïòs3:Õ˜&AÉç*…ü–hìõ ­íÉ]'ßñl$Ö}ÍrYNöÛ€1ìÝδÚ:²ò%m1Qص´TO.7myIò¹¥²(ÿa~ûlþýë´|ÈÛÏ?>•‡|j¤Š U«øžœ¶—7©Ÿ€¶ê]g[«_C —·„jÿä«Öè*éˆ2µ :´‰é^ ¬¾­¢@F¹öÜ,½ÿkLvŠ´N¥¯ßEþ¦‡t­]:½ôxežÄ1Œ0ö–·ø$É8+†0mÿͨ¿êÛšÂ=¦»Ô<©O¨ aä­ouÃik.Ç|æ $¸ ){˜œëýÑâjz®`êxÃê¿Îž 1ÌúXE£Ç€ânŽA,CC«Û“kF 6~K½Œ¬äÖA}°©îœfkï;¶åeÖqÅ—‡ª³¯2àtjH¿Û=nyÛãž;g)†ÉÊ Ÿd8ùö{úˆs{Ö××ìak—“aã:œ à ôMiF \4J½ƒƒ^…Ÿð”ö€Ý§< ‰ÎWk^›r‚YÒq°ÎþòÝ}ýºÃݶƒÖ¨Þäç=âÑšÑÂ=%–f)q®~"H†s/xÓ ôJåôÞ©õ'ï:h‚•"éÀOº‚ÚN§A_wkWës>KWp&yI¾Ì÷Tþ”å-/Ÿl|”ô…IÎ*…/—·]ÛYußw9¸·³Qg#?J²ß=A):íeÀ‡Ð¡5×®ùÞ†QëÓëË1ôØÉNR  J$ÅJ:ü—×|òcÎ¨à €w­¯Öóïý¯a˜¯s]Ó´jË‚) uŠjÉSL› û ÜA7¹íctÝÁƒÃ'Á ¿l„³i3l`í€|>A®÷M^âYÊ%u’&iLÿ‘ÍËÍüœ«›ºFJó󹼞ã:Øxµ0Û©81k>ŒZRâüj®3Ô‡$¨h áy ^½ž“”œKÁOøÍå1=}œõ_cw»6ídZ[ö1gTŽr¬¥Œ÷¨çoýëÝ J]àŠ˜6õöÝßßT”Š™ØÀ¤­Y[I-ý_@ý½g¶¤>–S×Ìi(e©~&òdÎNÕ)5´S^!N^–3öå9æ%J[¾°µr÷/Pk\cûwi]‹{K^µ´×Cn»òæå¡ª.‚¡Z+¥òÉ«Þä%é/“ºKõµ–á2é&—!}ÔöÁæ}ÔëlÛ×VuîÔ¥‡âîx¸[³þ˜Þ®]¼Hh¬«UBù/E±>vrÞ°ëXÓ£»¡Yà[ECR÷3*:S“Šlа§G3jªE༠!¤ÞH7Ðkƒ®PƒûjZm¹©³2³kA:Ér ’Kö‡tÿ©¬¯fÿ¦&ð$ tp¯û>Êßóô[ @L [YHó×­ß‘þsP«ˆ)èW!ŽRSoG×`¿‰ÃŒÐT3 – Ú*þ00–1§ÖD‰‹TFDÁ_ÇùÀÇ– cs_ô°ù4äås.O AfÓ Ý70ˆ¥‹‚Д>Ò t0-Õa— oKp(‚”œþÏéóoß”/¿<|ýçöþœ«?hÿƒ?ªÖ…AòýÝKÁ0§ØÛæ³-¤»õy^ìõÏöíÏ1ÝäO$é1|G Þz>™jO¦Ye6ƒ9=})W9ÎÏÞ“Þ1K§ø½Z+¤it3æ±Ïʆ„/«¾8Šê°3@„º÷Xi¦:öÄïõ²ÏîtÑ—1 e‹î€‹ä^v’¯$©¾åë7©‰ÊÜJ†0ê}‹”¶˜ê³”vòmV;Kmý”ü“QºÍl6ÉAzk0¤®òÝ;è‹›÷Y_Û#´›#ZNÔI]×8T/…ô†6 êÜh@–r«Ç¾X/ZBL®F;¹ŽJkÉD€*%d¤Ñ3“êðø˜/Ð{ EÖ êæ@7ø& ±È5ýôÙ…Q-&½ôA}:°q4%ÆÔi)T(„R¥˜«}v%›žhi:aÞw騈Ì;x¬[n­8U‚‰§Ï`R¿·ó¦BLt•@BeÄÀè5™õ±5^}zPýS˜»2õZìùªí„=Vj1æ?µ®ï‘Ö‡“Nðšô‡´›<Ú;¬BõǦíÑakøLO¦[áð´I{ºÂàötröÁ5¸þšÖ¯þ~‡ŒÛ0:ûÁlòs&Õ¼åô¥²9wv{Ø GIîrOzè3ÔÉ%^Lòl9-…øÚ-¿i9^;“ZWº:ò<*[N80Àq4qr)ìýxOa9Èhɪ$­ÜÀa0ôõ¹S5£eß™m]×ÿç<ÚJ\z­(d´½›fÎ~É®Ç#tˆzv§ãó0,ï5U›ÖôS6÷àçWhˆs†g)«Ê@U@ Pe9mÆTí¦ÒÂûè“[æŠkª¥}@Þwz®îí*[WÂXuDQC)$m„1Us\AKÄ6àŠ`ÁH-£‹ ¹< :Œ‡ ˆé­¦iåÐàœZ•»Of+aÞv»‰«‹{ýHEªí=gßø³ƒè¾ë›œ¹%X.@dWDïóùò×öÏí/Óü46£“¾¶“Çt/ …¾6ßûíE€³nûÇ}†ŒøXîyûIQpÊ6Ûµè›iv]ƒ„%š¿5ÄL$¿è{rKH·Ã=5ÎmìŽjÛ!ö—ñ„¸óüìîß%&*©µ"ÈÔÝåñÉ]ŒjÛ¿’ÅÊïê&ê9{ÝxÓu“@¹hV÷õö²Å=wr)¤G¿Û¥µw)&—ÔÉ3ììhÍž%%šö\ø~àFhç UiC±Þ–Ì.“Û§(eRÆ%º¤ÇÑ®›ÄÄU"Q}¿ê0#<Òþ¡£è€IªŽ!-j Ks“Z4YZø€¨ šäx}ÖÇÖøh:ŽÆ”œŸ¬(Šô‰Ú6 @æYà¶}´ªRC©°9ݬé,Ycqß`ìnM§±e ’#ÍAÎR¶n¸iðsGì?Ž6#š¢¶v5Ž(îHMŠàTi<¨y,G'•Sr¬…õq•kâˆÄ&Ó,$B5¤“ƒ9Æíõ•(uðâ(øœ3=D»Vð«ÔËÝL_S{/^ ÙS†§¨‚È` ´L†iªTG6ðÔꊿ˜³©âÚPA“°¸ev“¤ù³=_œä @Ó1‰RþZ6-u¹Îba?éóŸwI¦Gk!×)^u'…yîS:Ù,Ï6õÕÕž.Žr^ 8Ú’ÿª×ç<=C°ŒÔÚ;¦Š‡ž‚éŸt7æžÜó—«•?µÊÇ—w|Ëú•øg˜ÕTp%¡BÁR×À˜ÖR!] >ìQr¹/Ô¬-Ì,ÚÿRBƒßéÔ;:ß…,ñâÔ0{«YB£Cq»ÞH)a£n’\ðUÜI‚еôE›†Í0YŠUZ\¨/åŠ+q4WÃÝÿl6AP•ªo©ßxXÁ­G¸Oc·ei0ghœ ˆQiCý¥Í©þ¤; S1Õû³),1^W+[)©ÐzJZíbîfÛ)‰†tûÈÝxØ&o€)X•ÜÑ^)ØAãÍÈ8ºžÊ¶cèÊXÑcÌ:ŠŠhõö”wš…Ôy• ç%É2§9… 4¤ìˆ)ltëTB%P vœÜT½ékã·ÿ`›A^ÛjÃ)êjÅM{hù2ÚBBÕö(S;Ü$Ì;·Í\÷Fš$Û›ÇzÀd6†ÅJRV¦ËüXÞöþjþ(•*€ñË¢Ö}k¬s#xã9¢Œp$%I¬!9HF ¨w5í°ò•Ã|‘êsQK#×U]¼yDÂĺ×mzÞÍ×›™¥zkІdW­áނРXG0’úKiòÚcÖ2Ï:¾êó嵨Wgåž_£.f•“1å*S·΋î©Då}¹\a…"UÀÜï[û ¼cå ãõ6®r!¿C®&€FˆŽú0„­O}b}~t/Çö´&Æ¥Jò³j2Txn5溱¢Å†V–NÆù¡çô&BÁ3žÂîE‹$À'À{0W±\hâ%uÍrÀÌI¾ù³Œ„u¯Ô 0E5Ô"1”ò¯@ðÒ@[RSu•WõŸ`É_/³¥Ô5úsuþ©óU•Õ!ütìD³Xf7i×»4$­§ î„ýì7n‰p=4 WQ6¡S”;}ÝZû–%\É{K5¥ŸÍ¥õË6—Ö-“h‰_ÔnðTÅäQUλ:iŠÔ{ÈMº>MMùnym|Ê9¯ vnR)…>ÇwŸ?Íû§¸ßöö—.¾ØÐÓ|ÙäKÿ:Jä~”ªÛ.½–†œ£„ÃÝ †+T[†Š/«Õw¥ïpÍZî 0mzsÙvÚ>Ã8ãÙèY.¤œ`0PýKXjA.eœLNÑ=A$¹ì0ÎêWà‘òL”ãÒMÚ¿Þ¨^ju•@¾©<%¸hžLçA¼œ̬U’$„C ‚ýÀƒ€ÀN=çûnÏs¸U2É*cu¾9¿ƒé¦áÆ·Â;›ã”6›lÜ`#r¨ŠBU\½Ã?AfçÔEÇZàáÍBh*»K Š)è¶(T"ŽxTT`ŸB>(xp: F@“ ƒôâªG&?vô°þ–ÖzóF²ÇÉÂóBW„F%Üò˜7d,9c RÓDKÁÔ;¼L3LèÓÄ÷BÿÀ:°-!»Û©YUz…'W2 å«0鸱ÂRß×i•‘·´¯*¸‡dnäHèk©ØM=&9Ÿò¿ºvô`5{mõMŠä¦yêí[¦ˆú_r´Ô"·w)mxcä¿K^;]ʇ§Uÿ0¿tæ÷ßÚûËégýРÇH hxÍ¢úˆéõÒè5Ùq[Ô}y‹ë·ÒŽ#œÂm.—V*o×ÉžÊÒ«Ô“¸@â±aƒ£6KÕ.§ÿ* ¤C·u¯$Ù\½tçyÙõrÕæšûÀ-ì~€CúnÍÁŽ`%вšeÒqÚ“(y¹®i—ŠQ”3€3H.ãÖͽpÂÖ·ærÒã™úÄ+$`ÿa³v `Öf’w—Zø“U¾¤Œh:Ðn"Á9,ÅñĬ†!Ùúµ¯ƒFõKºº×*ÅŒ* ‰å¾=Ì$wCCXßD‚¯ªÓŽþ<4€ÜT•V‰íøÕ´€°¥;ÈFž.}XzZ€j€ l£, H®­™;º‰V„?j-½4AÛNQ*];{¿¿cHªò. 7؆ÍRÕÒGøG«C¶ƒÓ„Ó`>òΟ—kóc Ú Å-˜ìÈSÖ$}öDl h³¥9GE˜ìÚÜi^Û <8©120¾³1°íÛÔƒ7Vê^öϥ鮪¼ &ÑÝR4Ó«[/Éð ¯Î°½èÖrYòç{Ö_ÛmϾßËœþÑK®£<°CS¼2ÅôUú‰¨oÑ=g3–2˜pqŽzÙ •aˆPÌ=0>2ö¤9à±pP–6cŸôý»Zf¼[×Ù¦Ó Þz5Ê“½›· H„®—ÎÄJjZ½ó=ݪµÃ*ÔVÖÕ)Ïù^Òœ×%“¥[wK¤Œ½Ýhn¦¡t¿T.Ã'3œõ©Kò‡®Ï6ÝaNUÎXÿ9¢¾€¸‘¤·A7R¾ZïuGæ«\‡ÌwЍU`14ò éA•0„×!µ w)såU5é¥E±ú‘"OBެ_¿£î:fþê¸H0–5UšE½Ã#P²úýÊM‰.žAô:n¯‹l•°L('xy3ÕcCã²3ÄšåòàÖFãy§ä£³ñàR±ˆì²dåí­…‹ï ªá–sòÜuhŽM°‚Ò ¢ pý-WÕL¼ÚŒ’ð—Õ;ûU9 tv¡-*%E(~Æi3¿T‚Ë]ŠþI5¯ˆÁF CVÄÈG@ ¤D…#/~‚n§yÚÁ€†*¡4«-î½Ô‚á?Jù&%ùmøXÆßóÈè‘{¡–Ê¢ä·ì‹d$ °°~Òí g¶Ñ—°§Î馻›N»qe«+KO¹·­aºô ´"£Ä§ædagë)C”PÙË#‚@¼6gMzÀ50j8 ,Í( wSnZ‚7†å£ž,?å—† /–Þ4£mÄ*©pÖFš?­±#ÐbyR×›ÞÞòcλ²vòEÐÍ„EɤQÙ·ÔH x0þ„±ºüÝm׳d>Š’;{*$¹­BþA<¨³cªí"•«‹ï@¶ Õ´,°¨³†q–™‹‘LÌF†®\r̬#ºG—ÒaÆRU›©ÿZªD®Îk•Jð™©×Ý7M-§î bk™éô ±#›akµ£•eШH挥úÈSF¿×û¨ì´Ç=Š»Î‹³w9LÆG#ï×Ð#5;Dsù† ö`(XM†àŠÑîê”}[h“8féÙ÷Y·Ôý1™Q™{®E›Ó”œ†“¦/¥!~Àe¨©ûYBå€c§ÿöl~ÓãÐí Q¹Ÿ]üZPýÞÀ»ƒ9âÉÞc“ýÔK̓®ÚC›ˆ2m=…S }O;ÛŠÔèj ½Cêâe‘~¡Œ \-=y}±úçUš\•V¥æ@J9Ae^JÜñ®±nÊîòrJÁilgsÆæÍ~•‹‘]̽•žD; {R¿…N-'¨g >cž69I_ú)¨qæ+ N¨0&Žç;0+Nºô0³F;‡!‘بÐ)&èjüz”é€r"¦xÈt+rP!14tɶé®iøGk°Àc‡{hÊYóªUCx3)pR—ÇM7Ò¶y¢«u€®X"ê!ï³Ám¤Ðôˆs)(«X‹BošLò€E¿„Š3£ÓÌNïѬ7ÉŠòQ‘ˆ šO!äL;Ô Ÿ j÷ ÔI^á–¦OÎg+ B‘ÒÈ0vƒ¼o „aµ„Á IïsÛ_A°ôÛÀ)!¤mô]n [뚈Ǡ>؃]ß» »É…ÖtšQÌûòx0 uÉš%w:ŽòßQ§Â3/«G¯}[°è½Úù®§9·RJ],ÔÝhrILÓ#å·\˜·' thÔ[H=‡¨!üº ÔÑÒ‹ºM(3 ” €´Þ ¢Î‘œZåñ¼K~Ķt‹£´q”?˼Hë9£¶!Þ†ÌpçLïƒãwT­¥•PY,!“*d*`ݤÖWIw›4°zÒ:H™e¥(¯ ÝÀYké¿Apz¡° —P r`¡ ½­¨¦ÍÔƒ;vy+û÷¢o’æÕxöý'+ø>mÅΔç笢ÖrÙçŠ~µVW×b¨\#93K£°D<¶iKÒÇ­“ÛWÄ»ª,€Ê^á®´¤¥áhX „‚ðªS³Ñ]®šSØæà×dL¸i¬TKpÈ?J Ï „î # .Šr©àM†ú-{‹FºÔS'ÕŒ_ÁÁ¢ùE¬J ’Öf¬êYþ­\š°©CSW Â{Üm.x¨M-•Òa#MxǪô;Q ‚|êÊbX‹jgöm–ÏÔr¢g8ä"дÎH±îq†Ü°\àG³’É Y¯ûüm3kþôSôÏ‹Aui')»ÁO®íöfvjùËG¼€@±üºE_º[ Ô;<5PˆËgÓ+CÝF`|¸”œÈÕ§ÒK4•$·Ñä¤2¦Ìn$¨çx…Mué H\–‹ÏêRá® .’r}â ªiuhÞ U3Çqu#ÔÞ@Ô-“îb›hŒ 2Ú > V謤jÕ1JÝKçÐAŠŒjx„CÏÚÓèDü§­4܃ԩï0–NòØÏ’WÞôrW]oË äÄö[rÐâ6 U½0²OKOØøBÙ¡\D·ÖTš}h¢œ7{ŸÝ2cú)â@aqŽ©Ïµƒ£OÁNW[G“0[8Ô„à¯<ä­ÏÚ“‹Ÿé´GªŠÜ$[]b¤ÌH ¥”ÌÃ#Ú•}f ”ݬ‹ß7¸c¸=«Zxöbõ¨Êœsii8DýN#Í¿T9¨}€!Bõ‘Ù½$…†¿òÎÒ¬æª®Ž·t53#ØÆT[jûèY™IÊ­ÏÒã‹÷ö¦òQ+\¤pOŒAl:6©u¦VéÐèÑ×f½ÿmùx6û9þ¿/ͶäŸ~lÊï@”´{[]øAjùkoW“¯Òbbø&ç@*®¥”öL~‰¼)»C—ÛÇ’÷L•(NÊGŽJµÔ {d¨SÊÊå†ÿ¹¨Þµ)ƒ–€}ÜpUavÅä8ÇHn6—zÕz•˜–ê1\÷üîðå. ‹RZ0¶eë¥=…!f ¿ªƒ›¶);ô ôÓá>æ5ŸÄaÆ,­¡0ÄFKÙäcºWÚ€î;–>þßô©*kv©t t” ãÅȭǵ†Y:C;Ü“{_àVæHîH~„88s͸€wÄ0/ÁÞ&œeÆ…ÚÍj(l(•¡a g=|qÒÁ–§gÞB¡¾êbÝ×—¦•«HqæBÅPHÒâ…¬¥¢‹”ðš¼Â¦{Ù6›!¹²nF¿¹ÖXeÝ- %Õ; õ×âs-¥¤%ƒÉ#B¨§*¸!€_þKÝàüÒm«\—¤Û¡%ÓÄD“c P>^y0®Êåî¼4ñ¥þ_¼E=:Ÿõ& m `\Ä- Eþ ¹éº2$,•"ÅŒR•ÓYƒ:¼¤¶·íþo×áË[üû'÷ñwË·ÛÝKÂÅŽÞüFú^óç? ëÏyЦ¹`rÜËkuÒë¨þ$o±HQŽç©;ø¢JÚÍ`}§«XÎY p6«ìE’0¥Ì¹eTIIÿàZ]ýŽª®è¡qý]ŸCþu1‚"‡–{v Sqò€Šåúçä(ÒEã#‹:G²ÿ˜)Ù0H1 é6RbQë·eá‡X¡EuŸL~†Á°jèR›J>mTF~’WŠl¨Ïè‘‘ˆ‰³Îä`º;)ŽGlÛ`{š¡ëØöïšC*Ïu¼¶’õÿXµ¢2ºPƒ¥m–©:ЬᖪÐÊÓг'Ú*¼uŒ¥×ÚîέÁµ‘\'ˆ„–ª8® }±—é1 d“·/Þlrıԛi›'ý–…`0œ×€]åfÔ„{‚Së+&üAè‡WTR•ÃdIÑ—EÚš<ƒ–èþCg­„†GÓt48¨¤ÃLU/u,8ª)¹mÆÚõù¤fé²gsÚ«m!Öp•MÏK^©:A:Ýh ª9RgZ}+öÏIê¨æIÿèsû/þú?é<=¨óé>†ßÿœâï×ߨþé“™\Fc­iãÓBˆ%V-»‚2¬¥ªÌ:”õ¤{JÐaè ï¥.NtÝëÀª–~+KÉ!e79í 9ÄÐæÝ=@°­ÜšÍ!8ªßWè¸à|5ûÿ*àÈAª>楒‡8-ˆ„TJ¹H(iê´JKDßhû5xP@¶¤í.]»~¹e;•Lj1¶´NRjÊ!·þa“DãFÕ“bhørÓDt À›?r _ûVùdÀÄSˆ½´55i×td9ª·4í‚”Y$©š¸B÷Üs¨…²$TÊoµq²ql/B)Ciii]3@6Çh«‡Aàv…GB­¼ÐcWWî>º³½“lï¾Iê¤À.Õæ¹n€'ÈbËÛ]ÇÕô3̳9p€ouÈØÔƧ•'Ên‹ò“s´YâNåJûh¤Î±‚ 8 Õ¯Ï¡Ž‡"“",ßd\ò̪tŸ¹·´@‚]F4šûS*·T.'}¾2O€':m¨两<˜†˜ýØçóÉγJWCD’zXuóêþðoËüáÃ釿·òb‚;y¹¥†^ŒÕf±ÄG”ÛÉxˆªÒ¼Í£r‹\b´Þ:l£ÍŽ3„.Öb‡S$aЕ«Cb+w|µH®Š¢ä§Vöj'G…ǺãäW]Ñ…Ò$Ðd—éô¨¥)v-E°Üö-ÂXû¼«I²}—IÖ&H–7úf¤‡‰³Ê“¸Â±%_WíÂha/ÿ¯õÚC8Q:GÍÐÁ›^~ï– ·ß;xáÐ,&ÜQ® `ëpù¡4…©ªkJSx}–j!)Be¬núåˆoì,ˆB?K¾ T“}©Af[>†âÄžQa¯˜IzÉáC›13¨«cï±’ÃWƒ;5EŸ+ÇS2¢¼‹SÔçöûêÒ³ÛgÖÚT…¨ eQ1yÛjµ6õªj~“†•‹Ä‹ ÍRÁp#Æ6^XCI‡òÆ!™]ª  {€‚0Ù©3Ñs—K€—65Ϊ}Å‚¾ íA@®Z;uX$}dÓƒnÍáÕ8:ø¦*$#<”LÃ<ðȺœ;ÿ˜’½µúñwñzÒÏÏ*ü³r\bZ>þÔÿÃoú~(× 3(¼¼Žò;×Díy"×T÷ùXß8®épŠr¨,b­ÖIoȇ 6eP@0ˆX¨Œ±¶®6JÕ(S²»Ê 4»«šuµXÒ‡Ì ®EA¨‡ü ú¸X¨•H‰pÉ_Lö+¶xð“lÔMÞòU_¢YNr áÁ0ÄÏ "Òÿ¡?“(ë¥bé ‰,è EÃ2žœï(í t›UèI{ÖtRŽÌ*S›™k½›Ó“C¡ tä\€G2ZÆD/J’J„*Q®ìbäqcéhÞ•EG5)Mƒ3HÓÑ÷ޝŽð²Ê¨C³=VÕ7hlÏœàÕØ`JPêš4µj†Vð]-ʯ˜1/– =J¸ÉÑ1qLW£l]7ÊAU`‚d¨¸”펑×éQçËé>ÔºjM¯x8ò?´$âJ›ÚyÚÈeÞ3 CÀägç$}Cöº˜.I¥HlI¹¸µ[WVS&I/˜‰@¯ 1—¥aË5¶Mn‡Ðt»”ƒK²«D¹«kgªT&—2— Ž?|Ém[ }—Fþ¼´°·?ø?ÿåõòKþÍÇçßü÷~ü›ð Þuú„êœÞ݇þ·õoœ¿z;­Rã–ó%®C”»nî¾Ûß¡ƒÖÖc´œöÝX `<'u,WXÿa²Â~‡'"ñ錾-OÉV_=C‡D#¨ÃoÜì§Ê–pœrä•FDh‚ŠDû”;‰vf1Í7ˆIÜ žR÷WõTüò¯º4àDW¦—8\áz fX/øv„Þÿ.eûl˜]UÓĪ_ˆQ½|ÊzåLnPc—.3K ÁTdsqBR RpÏ óh¢ ]ðÌëo»œ×# ²ž&.°[ÌuêªY #ê©Êp‡p<Ìäð::?¸šK=©]_öžÊh"ñ¡C̼…ˆ9 N‰˜;UÝxÚʾëõÍn7Rs«÷ƒR(ú[QŸUtí3Z5x`a¸ÿ[gî¹©Ê 6»e.X¢QTqHìâ¤`v‹¾oe›Ë`-ì}{plxâqõ¤–öÉzG|ËR¥;=q ïš@(Ígb·9·…¬v]ô}×F(c ªÿnn7ûöM¥I^Œ–Ú4J%‡XŠxFSùýSÌ·/MüÓê®ß%qЫþáááüSûñ7êÇ&Éî_éÒ›z¥`PûÕGy¨RÚvy¾Ùp‡(aÛ@KFÒ»t9}I®DbÂÁÓD‰/‰NúK`Íåv”/;̸*pÁhQ¤r÷α ¹ªÊVé`l‹0§s(<<™à{E¿R B›£d4ïZ-ÒÂ)ÚÚ÷iJÆoêÃV«„ŸœGÒ®’ޤ⑳Ž2ÎyÝ[àÚã¤å‹À&5”–ˆüÊD1õÀŒåPîD¡»ªk §MâÑœ¶ÅÍÙÞ%¿<§üÚ=^œä:ßÈ—?™t’2Ãà‹H-õSkª“ŠE”&„—zÔ­Áä`Àp3Ú& þç1:Ãï­ÿÁXÙl$^EºÖA"¯°ÊÇøHwÉP§ÿÄ@>—²,ðÉãH\´dÆ@û‰f%r”nR<·äǓɰ¦¬2%—Etw’+@[—*}F¡ëî•ÉIÈà‚é¶âj—Gºa½s>ë2ÒÁÀ0½ÉÓÞõ1®aJGñƒe—MÒ;6 Çíý‡w ¶ _ §£¯BŒ—7L0-v¥»èóIZ)p¥7‡9 ‚ähK1¡2/Û/«Ä½Î}TŸšûo]y̧¢>YýwëÐoÿ~;ÿ<åGmGùÀÏp´}<Ù‹ß¿–ümKƒ|)KŸ7ÈOl¡ ôO‡÷ò{Qމ˜§V™¡iäÐ;ÎÆ4A}ØPŒUüAv€É&g¾ÍÀüPú@ D-–Ò» Àat‰vh‡­¹n‚Ü2è[Kó: òÚG©R~ØÖó>K➤ˆÖëEoz[°òk–((räî¥R± ™V\‰B‡Çøãi÷#Íÿ<¡;ô´Ü¯ðá‘pu§A£³ºõ0{”ÛÃÙWb{”#’z‹õ h;U—á€KÑï2X¹‚ˆwDŒYØQÆOkSz¢õP¯÷–0J«z(¿ã¬Q”ãqÐÏÑâèwŽNêÊRŠ  óòØ7_ÕzO÷)˜-?=Îf{5±7~0u%¥y?{®®f*²µL½…;^9›˜Æ†ðMŠfduÀœ–y“zxrãƒýôT®Ÿã¿z`ÙŸÆüÃåí»nÿ,_áw9þóìÒ›“Š_ª—æ/~šU4ÁŸQçíÜòJ/hGÜ]¼‡QÜq%O¨Ï^˜”æÑd©+6|¾MZLù(wZÆg”Iø ¿Ú×ãÚPÏ}‘K‚E%Þ;B6:±þdôÏR7€ ô.Á3ÁÉkDòÉÊG.¿¿5×]›,µî*o­ÏÞ±Å×]^%îL©Yß5Lj)¤>l ±?Ó‚Û™ªQ€‹ºlèL‡ew1Xïã`¹¡úž7(Ƕ[öÎteø¸gIn`q¨ý„I¥žˆ”x¹"êKÅO±¢Ühddkw¤+àC?¬íúió ÆàÈãì3­Rg„×Éôef)Y& _†ù9Ž´ÝÕmÎ÷%ÆœûÑäŠK¥×–ÒÆB;ÒˆV± ·=r nR^hñ@|žŸu·)ì@¤Wè†Ì+¹ÕˆõœÜKèUjð'åC)«ç¤æ§M>|\­œ¤ )¯åÄw4”Ä冀 ÷à–F)ƒÅ¦Ë€ØÉ— Òebr.Ob%Oœð7˜[ÓÚï9ØÑ„}Õ篱¼ùñ£³ÿ°=~z“{ðu9ùK8õñûb¶7÷é VÀˆØ…åSg€‚’„Q‹Ã橃/Ú¼akŸáYÛb.÷F-mÚäFÓE½¬:¼hý"1Q5c…|ê_§`ŠÍŸÉÕÑHóaÑ ÇSì\q^D…˜¿Kê¡oE D æÆò>&¤4ÿsïÖ4YrcÓ—9103§±ª|')–&I‰ƒoà«ErüEäyÊ…(ûÚ¨ñëMZü0Z‹ojàÄmgŠÑ-‹‘xvå"Ùõ‡Ý5!.~€³ÂÔtªMx5SÚ —y[õǹ"Ø)…"¤©Îª ™öµ¾tótžèr §z¦Š_•p‹ ºyÔ¤õ†êAJ?=Af[²KsPÂhö3,¿L4ýhè£îÙDòѼqÝu*œK–‚6@Wó ‰)kBÔ¸KêEÅ !íB(ö©5i̱ƒò Fµtÿ¥µê$•ÂR‹‘¢K¿æUO7LÚZN? PÍð#S õAa HFÀèCåÎæ9Ú2›³)­O¯¤¬tÕa½4ߨßOÁUkuô–ÒQ|ÀNæöZ|Øþ‡´Ö“ÚE»?>ÿea¦ÞÒ.‰õÃa=‹ÁÙùln->7F˜€Ke¿Ún¡¬çº+ \~Rã¦ú.ì"w@‡„‡»žîJMù"É1âWS=uUdˆÄxÔW 8×¶Õ±¯Ð1œ8Õ­Fe”ªƒÁŸE±(ßµlfŸM+åÐI/ùY™í¸­‹TÞRKÜ4†€ZEÜ\¦E¹ï4»=¹æAK4ÙÈŒêÙràæƒu¥ëŠý°ˆpž4ôPȺ5nn´šÊ ¢xÔ@½t€4š”\†$…¥™7V¹VÍ Þæ§oõ”’G]¥!°³±²4©öì™fs|—ˆ7@*ã{éãsCõKyËÛŠvyèr°½ÎPþ’c-9ÜŒ:8ò4:àt ¡Á½A>Â0Ò@dy]qõ’j保\¢ñ“òµtúfåëæÞ”yEmƒØáÿ‚?)mÞ\FP.B+ÝË‘0êÍÏèYø:”P{ÞzJv…$aɹô/X=8…ÈznílvЧGس·©ÔM­‹Æ§Éš»<ɶ<™$Íþsl–MZ7Ë6ñ×hnwûÛ ™TÞÕ"a",¿ËZâçní~ ß~¾üËŸÚë_×årîò“ÍÁ9jW)x%ë~{3Áȳ†~ÑñÃbªÝàˆÐè[ä¥>€,_ä“|Ço’$$‡fp`–—­Fœà†ÓKÍÆB횪™jM… ±¸R¿É%Ÿµ[`öD“¬¥+¦Ì¥AG%hÉ™D3èÅHøH{š'÷ç`¢/Ÿµ"”VRrdR)˯–ÒÿÛŒí¤Ô R%Ž6l–tŠk¹¢s\S4Ì*!ð·W‚" yC¸ËÉÍ)ç³¼ 'ý4¸ m¤‹RÂà·± }ròÐX‡Î0½g|‘$ÍÆ|Â0¼6ÅÚ_Ý:~SUu?áþ3g;°-ƒ!_9{(R vU¡hÒÄt¿ê¯°…‹½Kâ½sü åèšq^Ý =dšM"s4T_F©ÇG¬ù¤bl:u:Gߥ°ùýÙäÁ@ޱg‹°2ÊÉ,8@ÊNxÂ%¢çªN®ë°Ë7Å,¿kXïSëänWëgãÌïáàCyo©gÊn‹šñÕ“~ˆe–#ØàYˆ`•4»ýÞÄ–jãRš\ˆvOGp”`¿¨eÑ·©PLˆBõ%Um“á—8HüÛÕýïÒßÿúýäýðAžúü¦îÊÀÒòê  Æ¤Vzu¼PBÈ´-Ç~¦%'Ý~HÃc¶\ß¼ýâ‚<Ü`ì2uc‘|©8 +x“.+ÔNâÀm®\ûGß7òs^r’ë×ÅC]±®R™HÇ qP 6ºmLÝÑû¹¥„¬ºûF-WB®¬#–er2Ý ^T¼^µ]ä²ËЖ8-4ûËœ±³k*4À83ŠiFŽPÅ€Ù”ÆnùoëD{#çÃN›î¤ÿ–¬2ÊËâ­†Sžñ* ºw&Hò•ÏÉlP=R«"`*¬õþàAÜž„öÞ‚±)zceröPÍhC•˜ÒŒËj—Ãu/ïïYMAz•(§îÔýhwéJÙSY7Àœú®É×’çߢµ~„ËýÏ¥’ /¹¤Çª±€÷üêžßÌzÍ]ÀÆÐ à¯É'”ÆÐ0|ÉïP¹­Ø;Íî1÷¥U‹N4îF¾¤ˆ~vÒë.«‘?¿QÑÚùÿ>ɇ’Î ŽÑEùçÍØì`É8›‘ÿ4€«"Óí7³.+'²$›`ø‚ jÖŒ«4šsÙ×ääɶ‡Bh!ñ¡®R$lt)¦«ý_ÿÞÿÇÛ4<ô?þ¦;?ª»”ì ÂA‹‡YªcäÃÒÛcÐù¤)•Á-©\Û[‚®éÅê¾Ë]‡$ým7ß3Úز{,eWÕR¸{Vg\W!=œ®4¶UŠ/.,&¤¢–FBëÃS‡Dò6€%°«~ù<ò”^`Èu›õõ ÿöñ ¯ÕB`4r1÷W);ýÏv½ÆåQ¾FW —.b']uÇz+?L¦ùR˜$‚•Ñø*X‚­OìÔ/qùó°0 ŠËŽŒ\Lò¸'˜1kàzYv"´pƒçj{Å£ …ê'ÝÉÛÐì)Ö9ŽêŸ¡°þ]ŽW NãxÞÚ«©A$°igÞ&hú®ìÛ |âFGànõË îmšå.5öáªÛ¹Ä+èÍ2Nƒ? fäV¤f»ZH"Œr $[ìRJ¸õç¼/rÞ¥›²—ôÀiUrý¤'–ç¶ì(€cíå84‰Òë¼ÉeáÑʃ"Nçaæ áoxÈéi|T.t³¹@Ÿ]²æJ.°…¼æÖä›wéj{ °Û‘& ¥ šI @–È{UWÒ<œ$%Ü(tWm©‚òhõl^ÿ¬~~YOú¿ù] ¢Td&]A+éñªÖvƒšnU›Ë£) rïCê[+¥È0«v¶kñónæK"L*9f®ä‰Dè]ìˆY©&©8Ø!žãa©#oP—x›P¤ö£Ñ#³©½õU¦´ÃÔé4êôP¤ÝÝ®&=çpEŽ|¼XéŽÌ@¡|ó·›Ýå É+z–Ð’Ú³>bÒ´ds+W=2ÜÈk°Íµxn tlL«»„„’hpÌ©é!B~ê ãvìz ÕÖŠŒaQðÝš}—žO1¥ CnÉÿº*«®7,“w’Â<Ó£`;YAÈ· Dh±P_6“i^Ø–t[naÛÁêÇYއÞv@½Äš“FÀò0y«Ï«\‘Aþ–$´¬˜Iôg7\ }Ù°Ù\¡¢ ²ø^•póË oߌítÛÁ+`IjÂ~ ×²ŠûîáBŒËtCá­ý]ê0‡6C¾›Ä—þ¡ŒMêäNž7—¾€f"ÍŒ´uÁ–ÃHN”+f:’0’À"áGÞPÇvpÊ0mNelõÔåEŽÔlÖ^Rïv]õc¬önxHæÈgzºšõ‹½Oùüàrm“ß`ù *´Ô‰’3<´©” º²òåÝL^M%°‘_'¹Ó` ’,ùfì›D‹²…H.+C:P]Õʱ+pô –êöÈâm(Á¦¼$ycÙ:ýö¢'é—´T€5#+õÅSêú“‘ô”$}©ÑNKZ“¹k¸, ë|n5DŠIʺ™¤NSë–;9põõ1%g.ƶ«‰ &ãWâ„ü•Š•­§Gú1ùúòeÚÞ‰´É«DúéPÃD‚E‰ßUytMrø„m“— ·®Ù»ÙÔ1Y.Õn‹0zµƒ÷ƒè€ó^wÀÈGÚ!å+…±Ô`«Ù¶Ê냮†·Q‰,ÌcsW@Fʽ=éš0°ê õÜzʰeÉä¹ÿfü³ÝˆáÍòð.RÆØÞšî„»ï%N4î¶Ç€"a`­=L¦SêÕý!}‚#3feËU/oЋ i|WÐÝ ›Y‹> L0öùFC¦€Ö†»iV?dõ¸çæM𖯾‚gêÚÈϨΩe‹SX:Q™;#©€"Áòè;7Ýîè&IG}*>`¤`Záív€ ‹9´Å wøu¨ icýƒî>©OgN`v‰µ8yÕ¢Y¢È ¿!'yd#] ÚBKÊíêN—’>Ä®òȾݭ]½]mŽ€¬˜Nºs×±cdå/­²K¦°ÔÜU£-kUù#cε—ôW¯é´ïí)s3+ÎHà)-ŒÍòŽOhèSŒŽ¹Uð3+µŸä@ôú4@¥Y¾Ê:›-ƒ¤^Wz:[iïBú!»Ýn×ì°W¢ÏËË=t&hjèôÀ1m7qÕw¹ów³Þ@)—¯ì[œuGQ )˜Rþ0¤f#¹¹Kòã¥x¹¤ûÁC_ YÅVMhÞy ¼6຾‘‰Î_±4 {Mò^"Y‹‡ØDÀ˜$T‘ð”»Öº'SÚòÚK䘜(01,á€A>9ÌuNg“OÄh¥Ä—´–ÛýXÐõhA¯+ªŒážž¡Lkr¶ØE»o6¸ó"BÅ„ÚìÎédÊíný訫d¦1^sÄ¿=¹÷@ î‡"¶z~¬j©¶C®ÃùŲ:d=ÂðPŠ¿«?7ëýü—cA( Úñ*{]_C¡®£â½G›¥ìZîp—äó?fýÃE}{Tÿ¶—ðü ùÁƒwžÐÂ+õVùë]£‰jù&ß`áÁ‘#;ŸJj.Â6ƒð ’hk$[5TRÊ ëiåXJ7"É`†äÍ.©xË9ˆc+ºb¿ùdöD#Q"+±?&?]žÓÀ9ïÎ])À õ 4äØBÂ[ê1lüÕ<Ô-A#¬«x ÍäµIŸs½CøRžúôL)nd’XrwŠË)Ümz¾ø­m›¯Îß,—C"Åv˜RóN_í+ÈWlt³l½é{å—Åìoz¿CL¶›$4™vJo' 5ŠóÑÒxwù^ +If Ô2;,FŠ;”#‹cuR‡sÀ Wâ(h‰7/^¿ÌVzR3C#oÝQ˜ºQN-VƒiµS®{Gª#RÓ Š‚|C •Œ 8x\=H71ú¼AŒí µ {h“ÜÐñ"×l¿Þüt×iRe73ü”ãc˜ž¤AW~au±PñÆ^ XôúÃX¸…@€tZÒÅblâÙ À²ì•~ü±É ¼­6$Ðy^r:7’Ëhß«ò¹,ƒîïÆƒ.…xÓ’Fx³FnÔƒ‰Rtþ³¤åê¿uö‡Ëú§¹þËܽª^B룅€zæŽÙ«.À¹¤äÀ)Wö ŸÜçØé4k--f_Üç¤1[¬}³Òõbw0ƒ¬Õ9¤P0ݳ‘Ôv+oдբ])TÓ\©PPØ”§ÑP»RW /~K#‚ ÁB1“–¥¸-öR¦Fò†n0A•8ä<͆v5(2Í‚îÂ’7ŒÿH ù`0ÆÈнS Ö¢òì‚>O&mݲçmAäú„šª}Tò¿A·MÒ“`qÒüì~þãâÚCMŽÊ3]y¹-TÐŽHÃ#ßó‘}–šõbç&ËÇëuÙ@Oùk£Ÿ›´S¥¤‡)1´²;‰)(ŠUõº½O~ÿ–üºŒíŸä¾é V¤a!ZÝ"€¸<¼‚äkbóÕÁ9JÚªÕªyÕe2 7;™3´Haà5ÝT¦ÅÊ©Yð·¬T$ééÑQ^_63¼1åmbS)×lKóã Zk[0i’vL(Ôä-üÅÏ_$•ipý”7”:›ERĨºÅmb©œ¨#ìÞa#•°ŽÀÇ~ÖêuÀ;É7ñO¯Û¤kÊR¬šä^%B± $ ,:\—g x kí;¥Lit£~²ë ±+'h Ë=. R3‘òʤÆ]ýÛÕßîñ,oHþa´ 4õÁÖC®t:vR6¤ê9"u/yí >Ïdãbcü–]¨l$Ó³|mJƒ4ÊüæùvÌðà€r¤]Û“ýÒ•5mçÐNx}’²á+ÄIS‹Ç"]ýãœîÙ}í㽋?GJèbzIçd.ÄyõbÁ —7pÎ{ÇÍú!¤iúöNþ4äB0]é“áêWž¡ÄD¹ÿh‚TOÐrT‡Ø£Ò8ƒië;*×b×&AI™äùóGå°ÆJ,˜ÏMŠ}¾‚QVùÁ”ãÄ,Áè›$±7•¯ñÜZ{_ B|D7[HùJ~ºKQ= ¼Ô4œåæ˜çBIêAF§&¬5ãbn6c+Åþ&áÆ™ FˆiH*x'·5¹Ó”³«ö˜ä@Qx•ʽÒI݃ƒá"”†Âøïf–{s‘<‹Z<®[Ú„',à §n»¦bÍ—Eš4ÊúÒµû9Hœbq¶^ÍúªÌ€ùòo.a?ùì²½ÛüÕ¯3°i«ß^B‚K’„±^nµ— Ô»¤ôº_Cwr¤ŒvU•©ró<ƒŠ*Ð#ä$»ÚÊ*šÿTr  –ÁY‚kmµsÕ§lEçèRÛ¦ív³RrO@Ðåƒö‹Î‹Þ—ÚMJYè¥gš¨^gõM>ʹýpiü¬å «ÐÂäOù ¬¨V-ÚQ¦N^|\4U} í<(·é>»µKøƒvß&Ý#Òí³4EÚ­jÌÛgÄ0·ïr.éP¯¥ÿ»o)Ö¨ èð“[ e µ½ Ó°ÝQë:–¿+¡m<4£P8 ©¤ŽWÔ ‘"M= Í’S÷ØÇþSš÷%›xõƒ´˜PEwRP$0}ƒ®"¤ëbŸo)µùò7ö§ÑäK¾»Â›,ß 9E+œ±Kuï3T›› ñÒÄb5r[& •£ÉòUûˆ6>sšWiœXÄ@ß¶HÁ6E7RîæÝ`5n¥‰4ôïYKùâò†=Ä€“S±X©u&¨ IÍÚŸŒôá‘£4ɘ'ÊÁÝ¢‘ì!iRŽ*¦Ô&pèú“”4ˆXZbr¡öݬË/g)Èóñ>N§m>å¿Ææz7o_Jx‰ƒ”z›%ÕuD±Wï$!@I°Œ^’fpàÝA!=d3ç«âiš[w(VÀ¨ˆ\Ķº¶]IZ\w”Ð'<8þP~©²àR‹«ï6,nŸ1¢Ÿìù·Iÿ´OrÖg»¾ÿfF»Jé  % š'uëýž$›µýƒEl³“ïTÑÈ\ú:HœQ¢GKÌ‚r…-@ÆÒ÷»´è“ÃÐ#³œõÔ°ÀRBIŸwtÀ³×QžÕîœK'[*€ÕÚCžwA£¨@”¸†u’‘!!{†Cø^É­’¯)G©N„è®NCóDb%-Á3!âMÛ.ömÞ¢¹mlnG¨Ø—I›1Ë5ØyCIzÑÓx©ù(]Jö‘¬·„¿ÇPˆÎr8Û•˜©r^h Zjù­ë]~¸j¤äz,ê1I8ò&qRº½°i‹Q©åŸ6!utAkÞp°‰ïÂv¦F ºÃŠ`ÀnP"ƒ: E @¯‹õÝYa!ä§cK;7ù.AŠcDDŒâlêF[%×Û.·Mê,bç=˜q6ã^R4k”¨V†!oOåfÕx×ížÚ-•Ùõ·—4Ë/(ê³õt÷¤·‘Òd19 wÖ8ÇÞ<˜yJÇÊë›lÏyñò‘@©ž‡¹&GŠpˆ|B¿Ž1Lyz,qDì ùøÜ_cNp2&‰7×vð+σþ0”FžÉÍNNOYÍ.c¦”Í~—lÂŒV¤9™ -²¹t¨}oðƒrŽ%ñZú ¸§¼>ÎaV —Zhú&)Ê¥l{{sq‡.¼95eѤZP/”×Ûb¤´ëhº!;@ ~ à6i—k¸íb¢.4- ÜI¤V w“oF²G PµÁô¯“Ž_Jî@ b(KGgŒÜ‘´ch¡É¸Ÿ¤"Š]š.È¥C?ÝÌE„+QqR´È :i³µhÕi¥ßUþAŽMøöÜ ßL+£G¿ƒži×fƒ.‰íõÖë*d;à3ãòc³K‚ÕòßÏ ~‘Þ¥…þ•áäj Í2V„Np¬‡\¢¶iM5wr…ê–@q‚ë©k#¥=Ç„”Dž\£VЯ€làr!!QS¹Çª®ò:C‰Æ…Û^vãxÙ$ÉÐÏ^Šïj]gùgˆzò&Ì ÕQòâ¿8ýºšø4ÿºéë¶ ÷ö"¯ùØRy]ä4¤qVƒÅ(ú>%íéž³Áä xÐ¥ í¥‚Š°„Û˜O‰èd|:c£©Ä †oÁÏßá€ÏÓ´#‡sÛ¨)‚2)ÀHIÞ7ù¬¾ Éé.¡÷O6¿ÉûÀP^ÊÍÕ•5CÒ¾\l~FÊÖÜhØzÈËGŽêõ@N…”m´ÅLõIƒ‹ƒ Ûó8éîU§«k›²6ê5«¶TW…£Á…Çêˆ*ÁÜf£&}qXàºÆ: è Òü;±eÂ:¬A€š¡ìy‡·Xqò¸¨n-w„ 0œ&â…â9ÇÝò©ƒtåıð¥-y°’ࢵYÊà”Ã>ôÒ¾ÜÜ–`/2îê¢Ô“+sk$LH„†œ‚‡Ä·U¿nñe>‘}±WÕáà¤z ?~ p 9'o—¤š1ì÷Òp’4\qà 2ri¦ ¬©føÖdxWb:’U!£Š‚–¿+²²¡W –‘¢¥Ê~€éW@/pUÐnëÀµùãѲ7yÙͼ›FJö‰ rîséCµ\5)yUR°k¡ÐÐOéVÌýÍ:@öÍ>è)9¿Äý–I_̰‡Šf „lêÙëE*Oè .]¥ØéM;¨Ï½€dƒ·i1ÍMîÎÁ@?âŸ4XÚåë‚™B­ŒPôjnÐc/0µ-š,ïùP"L ÔB% ¨á¢· à–O*}ÜÏr±¯)/±¥o@îu}К¥+Eùðc-íȱµ íþ ½ÒäÈ÷@"m ÁÐÚ®_±eGEÛŠžs.òÇ[¬¾ßgC)yù›T_涨!&wl%÷ª‡U!ЉS†*Ë ïœ÷H#i —" jÎX`ƒäd(eŽòõaåËÏtÉkÙMù®´ç¸ŸÒ›üÀÅöArNð}¢k]{uRË«ä7»Þ³zÜ€ý$¯—p¸•a³WÌ匇=t¼c»Üä›o¹ºûÆMs¡pƒ‡ ˆ¿Cä¦r:=Qñ$lÎÍTå´à;b´5Ãn¹€ƒ\j1•‘‚YÝHnµ‹(ˆÍ€å{-éÅYÌû ²ÉFO%.”^kZzø`¦x¼w8¸=&À%"U@e®³6J*?yprN6䔸HÙJ"ÉÏÇ>¦|º•\yºî.×J?Ãó]?ÊQx*ÛY}¿ö×?{i3]kÏNjз=¡¯@_®ûO6öyYMxc-:u)þ }*•q›¥•ô/o÷`?ÖÇýã¶´émò¯Á4r¯9v`=JŽS^š†òD‘á$- ¡š¦%Ç¿²¨Tý¾ZmJõ¼üÿL½Û’mIv¦5Ý}×Z±wfe•J-Jêjf¨ew< Á`pËÛðÆ=m\дZj‰ê:dæÎë0OîÎøþ1#Õ²m©¬k̓ûðqøãïÛõåmk?5A+•&!¾[öcX ž„ÄÔø•ö £ô0KZg /ZÔd#Û\žòö\Ÿ»\G»¼P¯mÏ6Æç«!sˆL-ï/:Л \Û ñFÃA.cÜÓ~K; ØV DˆíP.=‰û}ŽOk6)=ÊÑÈ^¯6—}Q.’Ø Î}Ÿ¬êejkçÆSOyö}/ˆW¡›Ù¢ÿÞÃÄLÍuéö?Ö³}½ä*QZF×Ow:0›%!kJ¸ÃD/èIž[û|çï–ÒÙ“ƒˆv »ÈˆúS €nön–c¿ÂÁÁc’dÛÑ2…ŽÝÛ¥lO{u-.k`þ“ê ?Ž×ݦ¿ùjûó.3ï³TÔÎC‹£=ÅûîšèT‡R—wë$©ƒ³‰ÄHÑâºÛî°BzG}lõËú·?ä®öŸ~Ów¿ùamÙËR±¬ñ0+˜ú•ݾw@}¬¢¡CÖ·yüñ}è²ÅÔý2mï̺í|ìm‰\bóݸ.§ÅÞmÛ íOâËgìöÔm€vq+d],a´ùÚ¤ë)ÆïŸèX•æ¶ÇmC*ºW{;аËÿ‚@ˆäÿµ•ì—l§Y¸îáö“E‹{s©v±ãøiõ*®VÛ¬…T{V AÉ Î¾e & (jAzçëŠKTðáóœÒ.})„¿n}} ½ˆd5AnBÊMÂ!›ÝëÎ_<¡†·ßð÷F§÷ÿýQ¿þ¾ÿÃïJx‹Ï/§_üõûv¹ÛélÛŽ=ŽqÒ³v—Ü7#ª”ÃÃ)¸ß3 /e¬“L5Áôã—#óî øðýþxÚ¶Ñüê’Û{A¹HSÇ.ñ–c¸våÖµÈYÑÛdÈ~±*|ÜÛ–~kƒŒ~±T ø9=ŸàÖ6+„2’ó•.Åϰ7?Ë’W1óì¯ ewk§"ô•yO·¹=?ÒPQ Æ@åÊ  «z¶µvKIì8Y!²dáÔå'Ǿ±‚5F‹ä†T„Ãh*Ù—ÐQ—5±€ç2ÁFÑW(;ú-&?ÒÛ­ý‡?uïX_~õò_~7Î×HIoï¼¥ÆGµTý3Ž~W $ǼžÖkµ£#’ O¶÷–dk±í·t±3ܪœxÖñS£=Œ7TUùi ÌŸ“xêvHc̾mYÚý}Zç.vûtYF+|#bR›• I´NX4ÀºEeƒe´ƒÓEm´i-„àw`õzüÄÎô·c˜ÆÍ>_6Ë–lMylw{/?öU”p¼hÇlW&À²RÖ8S’5JT0ŒaoŒ*U÷Üæ½]ìGNóÔ(«Õ¥¢&Ú]Íì6‡iéÖ«eÏä-[ޝ¯Ý?ý®ÿýß­§§ñ·OÏ¿Šw(¦%Ù¶É’HŒ`ûgKó®°å ¶ˆÓIð8a*¼»|Ï™_Ü}¹ qëLq«vNÇg9HX™nÇÝé9?Û»w³¦.+¦EüU¤Šõ"ã“ÈèCç"âœÞ @õÃÌ‘<™ûbžÍ(e4ÏáÇ î¢') VNMþC÷Þµk;±I…¹å%·1^@Ä6ÿO[ÙQ3rˆ_£¦øÃbjY_èÎÑÐÓ¦a¦ÎKÈ’¸@YȪ+qoxt\H•‘wûIKŒÜöç¶üõŸ]~ûwßÄúòõû¼Ü6İ!€—¢;+jSË­uÞóº>hìY¡Õu ïÂfÉLl>÷ÝdGRÛeIbµtÝ9f)dI%W[g8i®… Ý‚‘Lu´h]×Gy½ïËû¶å)Y²rJƒ%‰@‹­Ð¡ÉRA>¥J„Þö’E¹¶'¤Re1ŠC©ù±¦øÈe_öº]Ÿ©qRŠR /e'î_v‡I2zh}c’Ã{Fš6éÿÑ€ò¦Pž©9P¨±v›Ë"·§ã&«/Ù>9#STª+T X¨ —ÓÊ À}‡jýãòøýõË©ÙþÕ¯¦ßüƒ•GÓüÃRfPé¶|ì*{™—9h’m7éZ’¯2L°Ä çV2’„œ–ûCßržkYÔ÷·Ø©ô€šgë(Ÿ8·çíD8Ýíܾeuý°?.]J¬öÝGd5,O}–lEЃAÜBr_åÐ(aµdԿ쟛™Šp-ú ‰G NN—|3å‚Þ,ÇjYNùÂÁ=ÝH”š“Èÿá›ÿ­hr%¹8wÙ*xès!v&‡Ð\•ÑåÁY“»÷¨¢ºmYšôöÇõíÞ#;é™Ý™Ww)pöêŠI|²ÿbþgf£¾v”Y½ˆ WŠ$ EqeÄáÞ6E9Ãþ¥»˜_ ýÓ/_þÝééï¿üøé‡¯Ïëšc·ÌrO‰íè(f¯ˆÄB¸Æó„ÇÖ1K£1k¢8&AØ¥ .áÃ#+¸å®‹U—[?,¢·cq’C6Á­i«ìè,û> õ؃ºQKMðª¿9/^»U{£ÚÐv=qŠ['Q[óV¶zŽú6æŽå}–>zån7gbçNÒ^ .YE#Káô¤‡äž>V@ ÞnÕD¬96ùwÇìêJ …??ÿüùÿÌ·ó¯ß>å¾nÄu¼i4åz иáVPg0*ó¡u©(ïb伯NbvÛ!ðslƒŠh…?)×vñMÒÄ»s ÉÀ„:8¢˜à!¶¿üíV Þ» 1hœ¦»m®OÖ³vÌ.EÐP}ˆƒþGÏZ—¶vôݨŸA­²ø«uáÁÄÁ1ÕÉ¡CÔ*Ø*Ê=x,^œçˆN‰¾ÝÕ6€< [ý ‡†«1 Á¬–zR*£ÐH Lêø7¿¾Ž¿Ùÿ÷úôü_?üöÿþö¿Y†z¶Np±¬“ùçé.`𳤧ãÞ·{Bbíf‡®ÅáWŸ[mVYoÈ"ë”hÉß“˜Üvß8Xnžª ã¹›$£‚ A h9[¾Š–·’ÈDÐäÿ(<Ð/±Âq?í»fq<4yâ})!LmêÆ.Œ}î»'qõuÍ?Üîé>Ú|ßê¯á0²/)0¢Ë·,óé\ñÔR»ò,G¤Ô"ìyËþ´§Á=Žm`R‘iÂÆt—Dô…ž$ÄGšðÏÍ¿ú«åÇÓ¯ÿíÿþó?>?½N§®»'«AËIEdO ¤Üf’,£b 1õ©–Y‘rÙ"z' Ö†ÎÆ¢;²øG{Bx¸•öbõ …,6Úøü àY‹¤mZ%ádÖ—•–%õ†Ûòßÿ*[RÛŠòâ¤^éX P]]QáÌ*k +1»b6˜jˆ‹AÍ¢@V”eÈ ‡ZÂx¸”^[oe-©Ž‚’ƒÙAévn“™¿Û»ªÃMXî#C(„—ñ»l¤¬”em àmu¦Ÿ=€¹äª½ê öÊ–¯Û’þ¿Ÿº¯ùýú¯ÿê»ïN_.NYóÔ›¯²³*¥‘XdÛPÅŠDÐu>[\õHl\@“úZÀÏÚS¢Š•œa$7cˆoåUž‡’º¤˜~N»mü­†ûN!g‡òòˆo×ú5Ÿ¦Ñ¢o=1R÷æCA VvYùÀBÐÓÒ 1Уh×åÐÕi(ã”ÛË–Où6Ô{”¹ e\‹il¬埤7¢p.­é6¼Óßô_û}þÓ½üt¾µÿÙ/>ÿúÏ·ûk=Î&}¬j[uáæ”e=vn!í¯Ä}èdq°%€¾ô`…J–†­ôl=XiZdÈg÷u›Óvg a¶Ñ@%{' ¾Éxe-!°ÒZîp±åÛÆïm›§äš¬Ù½#ÃTГ\ÔÔ™]:uK3ª0·ƒÔ Œi+Ë%H-òHcc[… ˜7»¤%´ Á«Îf¨Ô÷ê±C€ŽJA¨U~Ë $-D£àHfnØÍhÜ„Ox{—I®ü0xWA¦ðlNÃÞnëmž¾¼ny.ãÚ=¯ñG{õ{uõmÈ£R”°HˆÊ@j¦s“O$ë*#Òñ-g{ý–Q© »±&wrU”8ëîÕ¼piTÃÜ%'Ô¸Hr×å²:XÉ€KG#„æ‡KÜfúî!¸°fcKÿq§;>…È$;åÅS5)Ý’fk²·5Û#Î÷¸>€Xek{šç§tZâ0…yÀ"Úgùuwr\XWd':ePl]ýW2ÃzŒé¯CIgsgGb^^‹ýÁ扣#Y~+l ¡ÏpéGØ¢1ÄFcç?Þs^¶sþì§æÇ{Ï*R§ìô"z¨¶´š‘PàÆŒ¸8í˜c\oíÊ ‹eôÔgÇ«uqEˆö·‡=Í“,’ÐÊWE œYpàF–0t%…ïì°Ö;øÄ¦›Åœ]Þü´¥ŠBÉi£ýÁcÛ¸¢N’Zòc­ç½^†€¯-ìrÁÍ‘ƒ¬Wf&A ø e¾«C4Ê£fZ̧¡œ¥™Ë ì›3±x«Ÿ‰B´tRðuÏéÏ0í÷™¼”ìmö²%EØpRj»”~ÝgøÒ;Â<¿¨N@‰ÁÍÀ÷À{”Oo_ã²ÁåíŠL>QÒd¸;‘`†Ö>ÿ¢Åm‹õ- Zäõ ³ˆ46áLY·íÅ-…[©NÈPd…ê$Éì\‡¥¥d;A~§Ó€•/©§=ÎE•ÚÔ§±PáßlCÞ˸4ŠØ4ÂåÓÁ!5ouÍšþIb±íš'\C¼7éMl8Jg€±i@Ú*GišoryÏ“r†àO Û=`1O¦æ6<ð¦ ÓK&wöÊv06‚‹ò‰q©t0J¸«Øjï"½.¨ùsç] £¬ç%3@¼“ AZ‹‹ÐkéÆ))[äŸû/ñjÁó–‡,жæsY[à½3ô´lõ:@fu2wÚÅ ¬ÀzõFr«z€ÍÛºíƒåI¶"gyîµÂ<ìnŒ“¡ó‹å÷(öÃE áH?Û"LÍÕjm™]BW ¹ë=ÚøÜÀ؋ƇEqˆØfÌ»JEZà"ʸC==Õ¨L×ÒknQÑ eËBç)¬#½Aµ%#G†tôå¸rºEh‹Fë"ãWL$Ê!ê-‘ÓÔ>“FPÛ»—uÍw)Ì©±PÔh†xy‚ŒboÅ6üf« »‹þ‚>*輂Ö}*v0œ-–‘Þâ0§vS|i¥£Xq]xf‹qn.s±E¶ ¤zK³º’ÒÐ[¸ f@„Š$4GÚ.U58îÞÃh Oàè‘ù¤3‹ÅË.°€XÊwÕÎÌvÑ£g "¼oM º£8àj¯®Ë®ÒÌjm¥:*A`´kȧÏ>ïÀÁÕúQ“®•|@‘.šÅ§V™ƒƒË‹ü´o=˜ûΞÛZ‡U Ý׿•=wàטôU–ニS °¥¬–()s–´5íÙï®R¶¹¥¯v”¯ÉÍ”÷l§mç]Gj«é&“5÷fšyjƒz­¸°J±çP1x°$5çÇb¤c`µ²Éº+kÀTÎÂO´ _™ÎÚ nÍ~KøÔÚÑüTÓTÌÔ¢”—%ÓiƒPeÑïQË=×§Ÿ¾b¶kØd†¹Ð !ûÔ|ê±)’†[ñcs©y%¦Žk3EÑ‚;îÿ1€ó¹¼£GMúÕ‚ß“nS¦!>BàÞîbÆ©{ë«àÉÛÛ¢»tˆ‘²Öb¾¸d’!J^Á“J$ð?Œœ·xxˆŽîKd7Rª§‰L£iï¡|ˆ5 ÆÍ}‹ÃkÚï4$„Ë#ïñ+âaRÏô>c"iWÄ÷¤•öèlG×=¼¢ÑìÌPs`|YYeï%¾hþ™šŸØ•O •´Û{1I Äæ =0¡’DŠŒ„êºórƒ>±Î‰²¼eÿµ`q÷¡æId|HEBŒ!9±ª Û¹²;ÄgÕýÒìgåiÆã`P¥ý!Êú8#HÊ (<:ár¥ãtõÚ|hRY²@×H†_Hi¥‚Ë-2 ãŠ+ð¼P'KH Œ Þ,ý÷ݪ$ÈÙØj¯ål–p8Ó¶$?Ë @jˆ!OÀZI&ÓaÒ-¼KÞìøDÛeçnÀ=w!žžZ«zãŠþ¶¬/E4³=O·!B=uõV@ÜÏq`ÄHgµuo%M¦µfúpœØ âI£0à½|÷ûùgáW½M§As HšŸ¼ãy`Ajër{’iîÿë6„Ïyˆùw¸º¤+¨èRs)å¼7ï-Ûpj–N; IDŤjoW8p-ðøòÚ×§¶y9•;X†à@ý+ð–zL˜–‚Ôë$ÙÕ({Ü$wäM˺e«Û£¥Q·ºA°íÉ‘|Ë·÷jKõ¨§N$ í.¯Y9‹<›Ë³Åç¼2¨Š÷G´Pf:5bÛ“ý[R”ögKŠòÕ †ŸÒü#¨÷$sÂ^-¼%`Ãc±~XPLØ„ñº7ÍûŽüö)ÊK®*»%\<Š:òÞ;Ç£Q{öÚKƒ?\­(Ž[ü€Èñ$jz{4šëP‘Õ1!ê¶M:´ˆÉBV‰"¯‚ƒ§º |1€L†r=t«µ!qºvDØ X„n߈ëjòï‡ì¦­°‹ÆE['Š}+·-XüÐÙ²rˆwñhÎdÚ ™ìê&^ …ÂcÈõ›ò§T.[,aû¡-RÌE‘.ÛñN³ª2óáGД?V+û s7yKoq•j›G¡ÌrŒç½~²RžYÄʤy¿£w4õµßšåû¾ðÔ5&‘D5>ªžYå±7= ˆäGyÍÍliNzfkAæŠ:INÅ{Kç1±™ä¬Ìô¸vSj'±žäe4‹Ndµàð¦gD"ªkx_Ã-˵®GkÉo³ Ý[`gHsZÉ‹ë‘};¥¦½ž{©¶†íãÇ\O÷úù‹Åòö1ä·TÖ)Cd/4ǤM¶n!>öô¸Çû×p¿qšÚɹùé '¹ÚkyÛÂõÑìïØh·§0\$›Û¼ DØÊ“Ç%GÅÄ 8J©4 Õœ/K‚ŹŸ£8«©‘ü¸œ=ö£msð<^èâ04ÁÕ+"™žü'邸êÇDuЍ]Õþ:4²þ*ÉÉÌvœ(ÉÈ«’x$r’ì”TTO°‹¸ßðJ›ØUV視QýVµ1€ hʃóKVÉ`!ÛEëO€¾ò7‰m¶ž£ÅÏL½•ÑŽµŠ GíKBÀÉ*”/kH?¦ù*'ÍÔ*°oDÆ êm£Vðàä$ŽE6’„Zôý ‰2'_¦ŒîÖæumÞçl‡êøMúæ9/cƒ¿ýÂ.å!ÈËvXšõ–®ïÁ^6ÉðSÓ]jÖÉ[ESÚåq *ÿÇÓ«G1+GùM&ÈFQÉz‘ýÑØ ùºÍu_è§^Nñù%¾¡ ¹ØÁr ëÄ‹>Q½!^&l‰Å3ѽU»j¸Íâ]0ÈuÅ$qƒ )^FÖ3fÃÙN¨žÑ@+¢Nv*}_º÷´ü"”O¹QŠøé== £;hÛ{}Ûí(»£ B[¬¸øNHw²Ùá¶N:Œ¯zÉeoKGÍÿæcý5†5ßn4Ær§Úì^U–»î}ÎÃ)ßöÔ•†t;6å%«%__Ó[¬ã)¼œšþ™vÑz陵f¹m¼y†Æßïá„ãäN½–ö.4Y«³Æ°ažêBZ? ñóHarÍá¾*RJ§ŸžÕ=HmÛ{ ®wÐóQÉ•ÞÏj^–ÜÔâ°rC ñŠE²¡F»b Mw+Njïq|/¿\ÃVÚéÛý†Àz`ãݾ¥™$X°¶ä4·J£b8èÆB‘©0Ö•VOBñB ú ‹Wé¤È ›™¦gRz“Q¦a“vM•Õ†©’«(RÓ°ZwµS][­A™šÉ|d:ïsƒGW€ >ƒ*‡ss zå×$Qa!Kå-©Þ†âu#ZÓÚ#( ô³n¦'%ƒ!X¼Ca9çZÁPÒæÝ%^ÅÆ¤ƒìzvÕC%8ÇbƒpÒÑ€ŽèÞ×.¼uùyjÏ#ZáL[—° HuŸciSO–>¤íÐXç0ÎB é(°Äéñ¥ ×òÜw×—zG“uŽ®ëûQA6 ¶å<㑜Ƒf˜§ ®Œöƒ—l? ^c&;újiØV;YšÑ…OOáiÀzùU¦ž!´©kðêk^—ð…Ù^sp" W;úãzc:n9ë»]Ì\l¹Èû •Ábm"ú‹aˆSóº:·Ì:˜J ØÙ#¥W"6K¶Æ¿–ìZ ¨·HûÊãºè›Nã¾?02eÃ,Ð%ü#íŠVýÚ|»¤m6æ Vž¶]8XÁÍ]èu%ÞÏ ´-l?}©ñž–‰ší}¨ç%VdÏ€ÆmåM–«<5á̼|wÔ€Ü,v`­”`ble"VÊGR­Ìt»›Ö¢GµÅ7ÎtPìnº ÷^¼ÏÕ˹;b•}?J9lVN¬4øãEiîÇëœ($Yò¿tñt ”TTÕ˜øÄ­qµm·;ðöŒý×víe¿“ù0ÕX# 2éU ¢3# •Y[ Åâ.'•v²­f°7Nª„àWoÍ=ì%ÞÀæÞÎY[‚ÕÂÆ NÄ%»lËv,Ê *Ò‡Ô8ÍøüGwy]Îåe á§@t®K=V†ü¶£â yÌ}ȘgÊ2Zœ®HK±uë(×گ¤%8Š›íÆ' ¬çŸûÒŲaðjAÈ „!¬=Ø?õ÷7«z)è»I*ŽWê¶G¡æ4Òü¹ÝËú(tÕ¡Î…&³ˆk—[YZ0rÀd-;y,c´Ôˇ!Î9'ý\•â¯s‹šwÔ6‡¦ƒðެ`ÈÄŠ üå>„Ìd€©8¥÷f›'«€ö­6å4¬™¥šù©n—Æ"`x4ç‡m€·¡Áû½—_ §tíѹ‘‚‚¬æÆrˆ þ+-pXjÖ}Å¥Ìx„–z û²ÈÊ»ì.£ÇdO¨~´Ú¸ö±×1îs1B'´˜$ŠP<î À1ÞAî!Á%îi¦ßlŒÇÆ ÍU¤f'øƒŽG9¡ÈƒG˜t‰çU»m`㣢¨˰øHièÿ/™[FÑŠá<òPõ8d–L€:©‘5èϺà^Š(ËÒt2Ærùdù¥ó¸4·’ÍejÆÏÛ’l‡¤4[HaC½Ñ¢}Wç4Þ¬6Œ·l×i qgÆ ¸x·†v¶g°`;‡–¨åH›ú4øËvé¥n+¯Úa䈳]iåÃÙ6É^,"^Ö¸å8ÛÛ¾4§S¦Í^Û²DK²-ªN¸‘Ç5½þf./§h5ýƒLGÛÏHäz¿6·° LêÀI?c×1ÏN¹ ¦& lC5hE¶Æþz’ €’ãu ü,•„­´—i\JK—3IN>TÊi°’ñ½ƒ4kÑq0*A½ÕËX—¡¢õŠî'yæ¥Ø»kòsYž1x|¾ø'³RAm”èg `I‚ã œ#^*5d­m;Ö¶rtx¬í«¸*—“Á¡qs®‚ë_5Pëµè«SÑ•ØøèÒ—%M^9\åŸ×þGo'Ôcÿ+ñÕ?‹N%ì?·Ú½=Spca%]Kp³`tè)«Hu5ÉSÛþÐØŽ}F"QäÌ]MŸ¤3îÀûEVjX¨ðœLøfî0ø<5áy>›8uõ§ ØË†÷ôSÄõv˜ÍC9gzL‡£•›ß¼ƒª±Mo/¯û”òÊqwôx^b2ë8“O6âµñÈØøL©¡ö°|f=8[Rˆ)C[£²¯H¦OõòÍfòXÃÛf¥J±({™ +}¿uW;…ñ÷eÂmKâÝvEƒ£«-Úû­Y¿ÖÇmw÷MÁÙÅ4|«ÈUê•=îÒ>jšóðËŠ´5ûH'–Fu÷€P¨·–TçÙ†BÄWÚš–`î‚Çù€ÂÁ,®ìä½uš*«ØZaЩí1èðªAîèJ²8òNGpË-¦¹>iU®àöÀOžÛ,Ò¦Þþ ä1)倦ØÇ0¢ØW5÷T8å ÙQ0ñ]´Bѹ©Ý2È©„Õ~ :?QÅ@»©‹èÐ=_¦ñðŽb½l ©ƒø:}’"?4ÅÒ*] ½3hV÷%¬Ú¨ŒñSZÉwÔo”zÀ°²†èŠNÑ¢>š ]òî„¥Åà K툄`ÎA½*‰7â.HápoÜ6bÑ ¡c,y´±Ší ¡£ÓJþÇá¾ ×áëþ£œ±TÁR€Ùju5¸»…dÛñWz‘ ü3ÙÁŒÃÜe L–0L–Ø<‡2JnVp4;7hÃÙqÑZÌ«ÃÉÖ=½gô—ÒJ—|³ÒóSi_y€^Ó«å­}±íÚ¦òzk¿WwïB-[hÉ*x¯ëá|½g¸Œvicð Ul'ºÅ‚ LØ©m¹X«„Õ*“;{|í@bÛ³rÈSÍ.ÜR5²ýÿ óÇQ, ¿⟤£‚PånâÔ¨½­#‹ƒ2±ÈLJxšaÀ\Ã’ÂÉÂ65¢¬l‘:NU àU*Û„ÍëÉînEТ大i‹–ôïQ]׃Œ½WBDzUßÞûò¨°@÷Ia°‘ ¨ZúEÃÖ„ïŽÆÿRÜ(Ò¦§³¹ã‡ 1S™V‘¨,ô¢>ep–~SUÄp“Áý¾›Ÿ œ]–o-Ñm^7J©‘®:±È’ï È/I–ç6ô5¬Âx°n„Ž(‰jˆ¹a”`¿ß‚Á; ï”FñŒša v‚Ò«È=!øa'jÞaÅ.QóÝfÔœÅ.1ƒSmf\ÌlUÅKExü&”Žu¬wI”Ù…Î"Gç\ÐV W\ÀkS·ªÞ˾ò“ƺ7AnXtöÊ0-Nªˆnž7ºm…w_Á¦:½”ñd©rX¿vë <ÓnÍò„©k9~ãœË/%Õøuó¢…\`lÝ¢À>F ä©@—} <”‹¥¥²ÊAZ³öbk¿—q«ï,’F†ù«rzJº‰ãV ÷ybW[–¤óå©vQÏG}9ü"s4$cw¥õA6ðÀËâeƒÕ¸Sm±Þ“ÃÎêG£Ñ™À]|2í@g‹À=é(ÀlõummU\IøÒê~îKϧÉŒ´†ßN®0^÷кHg›D,Èò÷b ÷@V—&ŽœÿhùçK!ÏÁíõHè•Ü×Cؽ(•²qôšÿ“ É’Ž…"°˜r¤±œv}¾“¹ºÆÃ è ÒRÉÔÍB8Ñ[Œä‹wɇr:kÌæ‰u‘’6·Eïò~tÙ˜Pèm…zs$‰BPaºTtCÚ²tb@m¶Âš¾GÕÚ¢ÈrjÊ´Ã5‡WÍÕ/+€S;Æñ JéöêØ ,_å)ÝX5<5/—œOõÝòÕ9´”~R-Å(}aÁ)¿²’„† YºÝuû©½¿'ËÜ:"må=ÀÑZÂK±ääÂÑn •ÆCÝ''²·÷z~0äì¤YÙp«šÕ1ÒT š[ðטÀ•p8ô™þ7>Vb|3ßÛ±à†ISAŒºZ º–tŠþc#; ¦Ý-{þ.î™÷yàYu~‰çp×È1ÝŽ4ÂÑæÐÓA•†^þ^ÂîÁ+aßEdEí*†BÂ( ©7(ÁÁ–p¬*ÂåÜ·2 r£÷¸ BLÚLKä·é cùÕ6Ñ(BIJ³¦é•„;{Á¸@‡·5fhÊÇƹŽHùÚÉü(V¤u—ØbGÀ#Ý•Si Š;*©iÝ?ƒTg­NÏíôw œªÏÂd]PÛ_“tW£-^ÙJÍ‚—j¶y‰¾‡…v–ÆK‡H£KRÅ;çauh´CwOê°!Îtw›ëT-{¼ÇyGkq.ÂÑÛíWý»Æ&e/û•ihú3&_÷«e/¤ ÛÏÂ㢔Š×””½…Ž]f=ú=§×[²\vTöif´/³ÜìžÞÖz_öï"­Eûöe;ä! K[>Ý®[.ª§6bÜ c„XÅ~E”XzsêiîJðè¼Úf–&€:§dÕ=IÿbgÂ)é™jj¶ªÞÃÊ*‰ ™Ø²[:Kñ{}NVüäi›ó9~þ„ÔämM‹ ™z¯¤Ù¸Ã~Ki[[¸ óìŸYrÉæ%å™NÚ&9½ª° #¦(Ê …–eÛJh,ô,JL1¢HÙ!>)Bú@‹Ú¯¶,67è “úc~¥&¯m¤¼ÒæjÐĶRPn ’kT rçMšŒƒWÀ¡9öƒ‰¤ýÆ”:XžÇ¢³ýý*ÔjÇÆëÅd\Ób;K¬˜z@kãÖZ /}PZ%r^·aËIˆ"U-šY»¢¼Ô¤‰ÒîËVJÅ+&ͳx Q—Øq”£m¶ÝÃ|¥;9Záuq¯ÒÚ×’Þ'¾>×:¬Õ-Fîz]rè9oΞQïØ_G[K¶$ÞñJ¸¿É¨âÒ]Ui´kKãŽÜ3pIÒvw¦hÜ4s-ñV«å!Ir1¤¶Š¼Þ¾¾…ŸÓIÎ̘È(RrûÝò­.sÝ©ƒUî.*¡ZU÷ö@-zï¢ý–½È'+ûvÎî*Ã)[}#J :¨½86ƒÐæ0óU…ñðÁÁèXš¯ñþ–µØ¼Œ¶¶.X ×ÄF] Ï©•W•ÒÈ¡Ÿçš®ºU„Hþ?¤ÉEãë6+H/&Ç ©’ä ÉžšÑ:l ¦æÃ,VxfN³‹,/ N¹C £Ü4 Âø\í< 2™_Ó|×µô{˜6`ýe o ¨jhcZôÃ=akNV‹¿ÔývŠÞQ±Å-&¡Ë0#óÌøœ×A³S)¸ 6N¼á#€Ô¶I8²·Û¾8ï"H˜þ93íÖ·îýZ¬¡5‡ü(‚ÏQs1<]iiúÚVÏÇE][Õ6ž¦MM½AYl®ÚW`☔VIæ1ªe”´€wJÑC`v¦Lã*ÚIì$ÍDi£[±r+Aí*mʬ…óá:!«ÓD°“ÅÎý{Öê%ÌŸªE‘§{¶¼™ñÅ›•á°b™qôÌ;3 ®[™ðEþ¦}ßû߯bϺÃZXéšz‚õá”=½Ä*¨f²W0O–q†õ½.R¾¼8ý(;Ž—d)ìº+^¬øì¤‹ vN=Fðõ§%þðÞ,?îé^§!>¤Šo×pÏq«CÓ9”!ÌCÇZÎù:DVêUÏÆ®yëªË ´ác<©Æ…·ºiÃËWŠÃš†fYß5ëîBŸ ³Þ¬c½%òÃÓ½:l8cõgå&›¦½1¸Ï7 ¶É¸šç“¾åÃ[“°ICDúÈ1žp[©óKÊ/T>Xe-:@H,1b¯å±Ä÷5äzR¡!÷b8Cê÷[oob²tb*q°Ô/¬WìpƽM™w7³H·î)»ÄrQGzÖŽLH˜”¯ˆ~B…!ÐòÆì5 Ͻ©ÂКŽwW¤“añÎU7‹pìp„H¸u²ˆ”Êž+þ³pjD\sJ‡6œå H?U­±Œ‹>‘!Òa o.u2ó#I åµØp¾´®?\¡YØšû\òŸ·õ^š?¶qº¦úŠJzŽ‚ a)~¢›²Áµ§iÇq{û/â}Nù§ÒmaPû¯ ëgv›íØ4Ê™Y¸£~m|Ð ¤¹KqW¨T–: ÎdK!ËFŶHwiÆ1w=3¢FyAiž»-—/é~ ¯8N–ÏmúfJc×Üróu-vXXy:µ_|ˆ+‘äaXÿ¾ Û¡NÂoŒ[Ôö›l˜óC_†Î ÏKÐIjv`WWí€@jÁõQ ú؃Y/“‡awÛÆ´#Àú'éÚžEfïåèø=g º„µ1s×sÎsx*ùÓÞ-'®©Cé‰X–™”1|Ú”(ž…ñ"óVk^㜯 PK8õ¹M¤©÷GÚѲ²n¬ÓˆïÎâ‡ùwh¨Î@:†BIKí…BÓï¥ÔKC{®óL¢ïÂ#ÒMôÃÙ \ùÒG™ë·®ãØ?Rs@¹¸mQrù—)ú+:"»ª@ûàòIšÏ$9Oe7ʃ}£ÿ‰Žˆw U ŠœÏš³Õ·i¦cW ˜¹Âü²òba }ó¶þÔŒÿá\þð­Õs±½!Eµ ì¥Ã©¥^IÑêT¥’¿Ô©ä-ÅßµíõRì8èd9˜´­oÙ’‘ú)˜”IhvSÓ‚ó´Òº°«û¦I\ÝIûyÛ RC³0<‡ó§‰­\×-zæle›½¶÷%ì·°=ªPõÉÓtÒ"¸ïõÖ•ô]‘ƒdêQw¨!TTi‡;¿LecqìÂô„?Ýô;svÍý”Ó9ïÔ –f¡ÃA/lJ‹BÜrÝ¢ÅÒÖk,oºØ{93ËÞïëÂv#qO_ZVÀomWƒ+ÁuÁv62µêûPRL¢ê#Å—Gžö\lÛ?—òIsý9XjŽººÝ£]áØôè÷9̯> Ô Ýª]>hðuäÞõ^ÛÆ/uÊ͈#;’a.P%´™°ÔU(U´'à…kùˆ˜p2вuóSj~L»œìª@¹2|ÖN¶ýóhìϹ„áÜt=‚IT6C/|ž³`“h7ÊåÜÒjÖp"ÿ°wÙ’!¯,s‚Pœu–²‡³Ø âzÅŽ'0·ˆ½/íìéÀPu«–ËZ÷© /V §oÇzXIו>zxh•÷Ò ¾Ñ ϱÿ¶ÙžsêÁøZ½]KÁÏmB·“®åº{3­R;ŸI9ü,ð›Ö ÷K{>–³Z²g[{Ûš;b ¢¹E¬²Šð!ÃøF–Ý@ ¡<0©Hò·Ë³Ö„U£%0€PèwPyP\Ç\PEˆ6­¿C;ÏÝvw¥pÚ"¶½W’.ª½ÌØK®±D+Y‰ÙLˆvNþ˜Ó3UWh5#³£È’ú_òeŸ‹VÈ!:&Ì"é÷0p#Ô.¬¿ö*–dquxìƒ#k!Õ5Bmë£R:³¯8´4®u~|㡊§y‹ ™¨ÊÀAÄËFƒéVî1̶8Z|樺(­2çLë¾{Ë÷@È6Eï|SHE]‹uáÒg¼—šËfa&.äpèYŠ6,M{cë¬{=ç|²wvI·VlX!±¡s+ lãNÛM®–ªQA‚³l“›Zó 8aö¼[µÊu’0 ´nökÞ·bË«g>-Ïj*>ôPéöäápu-â «ÍÞ÷‹¥YßhÅÜ›ð5xé²`+„Wá¡)ï%> ô”–·&Dhg[¾([ê•»æQ GK#ü<¨%%’+Âl»ø}°¢{’(Ôs°s ¤j í»NcËv¢º¨  îXgvE«yЪȻƒ §]öô†—lÏÍÎsœ’ᬡuiŸ9Y{G=³aXß6+ddf†ÑÄ¥^*±§žàE¹y\Óiã0{Ç)•Ñoÿ-Ñ,]¢¯Q2²k×/2Þ™¼¬%¼Zݲ †ƒ"¿Õ|&™µ½¬¾À,zRþ’;y?ç JÉÁådÂ^:‘º­jÙa„Ú¤†ë–b¤ËWIÌSN[êÁWïÕ‡xÊ·×Ï›,¢äh¹N²±«º¥ö¤l ÙË8Õò© <—ÇVO3?yoâ„kó|ûÿaÉý5·}˜¥áCÂ×\¹Jéä¸9°ÁŒ¥,@v]šía9®BJï’ù¥Û3£lÅýnÏVÖCžcYeFMtQ6•’Ÿx’‹kŽvA¾Làá> ÃÙ+xo5ÒY¨\íp[åe+?¼ä"ýF˜Š+jû¸,Îü•AµÚ²8‘V?lÇÞ\fù|óüÏ—°¾ 3Xîádk¥ûPV`pq£¤ˆúSWÛ”ôÅèÿ' x8†Õ¤€?Ÿ&²¢•Ê8Ù vé§Eô?«0 Æâ¢ýŒÅ…v"_‚f€õeƒ¡(.¯sr\[V¥’îˆÊSíÙt k~tLùÛäjÀy¿ § Èà•©:‡—´?ÛÜBf ~2E| ºC%k,ÙµdÁbѯ[µ‚Ië)EyA6£›†£N:5w:-ÅF#îÍ‹šH3¦€v|žÂy¬o#=P;’`?}USïs ' «dùZɰ=® Ûà—ÆÊ³ði‰è®•Úc{A®¼ÝÛE`5+yíÛV^Ar”Õå_Q)ݤÇaùð¿@&'·f–ëŽRcÔ¸àÞX½q½×ížÑ œ"J"¹>Å8 ª“c\ß8Õ|g B’9øÐ)b­R5Å{s‰N=¶²a&rqøKêóHRGùhý¢0`±ÛŸ®ºC¬4/«ŽÈ†ª¯ì¨Vx‚c2`›GÏzØC¸”ˆHîYHkH¹ˆ…Ãa³üñ)Í¡uïõÙ.‹B´&· ^³ŽÈ Ý7e»lÝïbžb¼ØÆ¸Ø¡P피 Õʬ>ÇÛ‡¯é žôбr¦\iÝËúý*@í½3hÿót¤†Ž«Ý%´èDÃâ$Ù¹–ó¬(u´S,Ϧíð°0†”e[‘Œæ½äà–Ví&Ž€ D@¸lhAS¢jKdÂĉ‹³Eg€óÍÓs^J3 tvÐ\X^‚å~¼ª¶àráÉ[8Äfµ×:.Lö.L[yyçÁÎ{´‚ E·˜¬!”DTí ‹ƒ £] fâå«?„‡ éºrõ}Ë×6ónõÉn•X3íœvE–PPp¡g©[iaGACž Û‰ž#r}$Þ*ÌŠ­Î`dqË× k¿ÒhY Z--sºZñ†6Pë Ý Õ€)Qúf{¢•G«j|€ñ}z=í5Ç€* ëæëA© àa-ËMYqòÒTJÏé#çWå)í!CÈÙ%èk‹åâžäùNpñ ¿Ück7‹ÜmÒ½‘J\«‰Ã®Î´Ø'dê)¹û4í¦Íj4ØÏ·=ÆÅöò^nÍËÿq*÷Ò|^–#ª³*é} _òþ‹Ð¥Ô܈®qÒI³š˜ÇЧ(;¶p)„\¼zqŠ)‰;„cqóQ©äRЙÛpo#À¹^ðdl~ŒÍ•Â@í[ÓqÐh:Òak§=ÇLAi/<-BÅê 8aìœàeN4ÒŽùÊ’ËsH/R‚ÍÊáôXÆÞ—û#v ’PŽvàe_ jq´n“MÁ·Á’à:YUº…eŒYM̬ζ\‘~û€šìP‡ Ûîu¥ŽªZ'l5uÑú·úá†bÏc‹B% Ø.ÊCršæ)—eWWÄé€")±;+ÏÌ(öÏ._=ìàïÖc ß®EÂå@ñÛ[k?7,ƒ+=I;°Iö÷ñ»ºHâ*Ý-qàQËF ž%Y¡§Qw•I ±© í’løpìàH×X€Ÿ8þ{«ÕVKëƒs¡%[á"¦Qþ ÖHUB-r¤nvtÿ¬,jÖ47½~+Ž{ §3¥í²’÷»Ô‰m¤FvçmkI|ˆo˜n˜Ï l±ñ½Û­Úée=×è9»v†8\ÌÚI ·sSc‹£¿¡þkÖ¢•ȸQÝÞºðè%«†áˆ{ƒÏõdήŽY^MÑÜsßâ>á­g°A! , œI™PtêCn‹8O…î­ÝòÒ#ºA‹Sªt@›H‰õib÷fqi1Sã³(l–kõ¹Yg¢ƒ‚Ôlœk{S—Ò™Ö…’PFvÓëÂι88å šm¯ÒÒ[I¥’Öy² “]¶©Y“SRa&f„@Ó øuˆÕÑ›Ÿ×P?ÀÞ3r¤5€mAw0î`q”¼MslÄRÀK_i¥:,µN¾Âp+‡!Mã"Þì(ù—rä¥ôžÃcNéS¯¼vÛV9YöI‡GçÄÒÊÈÎw*QÒ`|«CÕ‰&’åÚ͸ùDÀþ1$ „2‹”*+ר!Ës†Vé±Y®âñj)¯îçDa0tB"màæ‘Î½×õN{’U1F Ù–¯Ÿj?–kŒ7B/½ví7{`ˆˆÄþûè\H¥²ÔÚ9ØÙ®X†|·×uoíút¦d—oïi7…ÔWWo¡¹ sÄd'Çðì<<Êqýü=L+Žðkägi ¥tø0½”mÀXøÌIîö6Gg9G2ã¯\‘WZy%=äÇak—’!üF;Lúˆ\$aÑ^J$xØÛË€L ÐÞG5jÙ$>¡-§¦ñîâ~Hv&Ú "Aæ:bÔ@¹hËÀΫ‡cè€çé^©AçIޱïi¡ÇZ³ qÍ®ìÿ£+ÚÛÎ,s×Xðíܱ¸ÖÁivÝ ÕìàU×CuÃS«½ÂNí!Åx {k8àxQ¢@N<àIÉÐí!sE%k£úÝâÚ)Íw”œÕìœw >vt¸[±ì9FØßû-¨9Ú¬›ŠGÌú w@juæXhð½X$&jdz<˜|DÞËi û&±­ÝdaSÜõÎâÕݵhˆÊ¾¼%ë…^g±W‘NHÔçñ|Ž !xÂ;Dòy«}q披ù’¾Óœ0BZ-w£*‰å;À‹- ”½zÞºaŽn¤H½¡†ì Uú÷¦Ìëa¼ v¥¹»" £8¢ò1˜D§¦XV¯Æ2‰‹¨ˆM¨DŠXÓ“­ƒÆ=µ¨ŸáUð—²Ó±œÐƯ×X^åIzFãÈvB»”vã÷à¾W¤2ë§æôʘ…ÝSû`ôŠ7‡ºÛ.H‚&›QÇø<*åö‚Ú;ÝÌGÁ`B 0¸®m+—Áø›CÄßwõT ³Ÿš FÖÅúÈñ¾5Z@<æ<Ú‰äxq G[IX©5»i¤ã‚Yº~¯ìªöCxWø8hÿê Éj³‚tmóÑSRߺñ”†VÚS›o¥½Ûw¿Ñj¬^ÉØ+¾T»d¬«×²pFÜÂ~ðëô?40'è0¸´â¿ßãX¶6g]„±zŠäkIWå…Ãu£3`yÉ(Õ€]ѶĦcÃÎö DÀ[Jî ÈC«ÚË è¹fÉEhµ‡u³ÙÈ[·låÑÍȈî‡le@.>b¾ kóNKÛbuCúî'pç*`Þë2Ö9ÑW n¶?ççA¤»ÇᎮ¨…·­“u.PlFò0Ç-Ÿ¶ò±VÔ‚a?ƒ’*J’„f§ÙÊÓÛö€O%ò\ݾVŒ¶€ÿ¸èzkà~>w‘|Ô<{“l]ªt ¢ô ¦S3>•ÇàòŽ^ ¶$è» )žŠ­E°Ãx^Ùß°!×ܼí^ÛBTÃ0¸ƒºªñã—s¦¯ŸC´”ñß4Á¤ ȧ›"ÍubN‹iÛ)Zîºe wûËÛ‘# S´¯@6™<94Íû›©9²|r¦öÜ£ã`GŸ:¼IÁÆßVUÞ¹,ˆô3É—|MvC19öˆ׫ä£íåM2|ŸCžËÓdûC£.U#!9(uÏ­5Q;Û}*뺊_KºØßås]¾­ÛÃj[)}Kœ$íŒOîS¸¥æÛÂæmïâr ®5>J׆ ¾“›îl€Õ¸2v¹Æææ6J¡=¡Õŕә=øÇØÜáªdqU‚"“8ûËå §uRöžwKÜÄ’íB´Òv³¸ôùQ@iÄ<Çx­{@U‹¸‚ÙV¶-düv‹ý=¼XIÒgK,î€Ó éwñã*KoÊáƒ:‡3=Ô¸õÅNEÛ9HŸ×ÆËDWÉÔ¹*;F¡m’§µ®ÝD8æª/È\»}8' «²à¶ÙÏT–«‘™‰µEÉ8à&?ÉG­ìVÝYöÀ6š”‘ÖÊq qVä”” òQÇân}º!c5`",\„ÁI1þP ê³£ßX`÷…FÙ¯¯—Ä ©dWÉ<·ê íA³OÂ3ÈZGA¬®A[ïì~0/µ)ýÒ"’F`ælôã'Q×6I‡:h¢×hlçæy‚Vº!pdåÁ­yÌyâ7V¡ᆗjYª×‡t£J£í ú¨LÍ,Ü?¥ÒªOÇ8»¥µm/÷=á ǬKø<;¨1˜•R«Ìa}Ðñ8l;Sí‚mUžC|jÚ3躖z*Ø~¾M•)YÒÙMeÖ¤¬—qÓu¶rFYš]^ vBí*¯±qгÚxêA²Ü 4F;žK-“ØW;¦E¦?[ˆNõKEÞ²ôs'¹„>.½ô”ɤ=‹Åàx†ŸR=åÚGY6–U^W€LŸ šo=Ñšš-RAIf™Éýqb9Ÿ|Êd—´v¬‹àvM=¥ˆŠÖˆùâ^Ó”¯V4g,ªP²á0±˜ñ.À¯cÄá¢\!pŽ'4RV×h‡C_«F€ROªZý$NÅÿ«„o·¡ºà;Y“™£Ïî2I„¤¶ÓxÞþÞ*]@yPÀPì&Á¡Aȱoù´å›š•ÿ8–3|èëìÛÃUžP!h¡«,¨oܸI–0ÔÊ«$:ìŒÛ&PÓ‡ó’”±PPÚ¡“Tƒ¾i_b×\DóŒª0µuZͲÁ²-d”Z‹.VþcÒKÁ=h”[¼wE£ШÑÌÅÖ«žžú»¤f•ÞjéVäí&&3:ËhýZIÐŽ Ž˜|mѲ\æh/r¾Ú™F‰r¢£¥ÔWé. m¾eŠ+v@*.È åe—8’øýÈÌh…Hº‚äõ"W¿i‹Ýë°Y|†½†acsÚÖ¥ën IƒdðÙ™ëóNÆ|ñšÚ^®–á…è4à¬ô nrÁúä ))L5[{XÂÕ öV8dÞöâ›¶ñYá?sF'Ú”]µ’ñÙÖwída¸ Tì¸ë¢Üy·°Üc¾S@ÛÁ¤A¹yÞwtÞk7ǥ˨¥œé—Dõ=ÅKZVMíªèiO£‰¡ð QUƒHYFŠ©¢qM#錬S¨Li“ÅÄ´Ÿþþ°‰/.KЏÁ9K<öÙ­ŽµXCu4¹Ot¾:gP»K <×ÚICÅŠ&ìq¥ÄdN®¥€› {vènÙÓÔI‹¯ðiŒZZÌý0ÿ°`7#/‡u§Up²BZƃv\Ý4—KDûÚr°NOÕ´%ÛnhMF‘¼ËæðQ´u¥,N]gN'ÊÿÓO½í …PG Þ·¸¾7I«ß.}8ÅËçf¸ dºChæHì°J‰n´V«Ë‘×^%M#p‹íÏÓTÒTn9¼ßðYoô‚μønÉU’äÓ¾žÐl}oê¹+#“Ú²ö»=®û­;= åä1o©¼uhÇ/±|MO2›±GhäMžê°,Öbÿk·¼Í¨P QþÂÊì]=3:õçîºåA¦×-ºA\fzŠU¯§1¾Â[8 `ŽLxt¶Ø<¶mŸßE½†¬”¨Dx<¡F¿VÈöwߤÇÕ¤ò^,UªK›(¿M·›j [=À¦ƒÕÝ=ÜéóYü=IMY©Z ñÀQƒÒØÇm ÈB§¥dV¬Ì›ÿ#‰ÄÚÉžš„ô7íå­šAÚŒåPÕ²ldè9z—á×÷, ‹¥ž÷=Zý¤\L‰ú3œÑýˆÇ-€%1Ël­ZPlã1FÍbû£ÓSP´É,IW&š;Õ„-¸E´ÿàú÷‹¬Jêm¥, ð-„V,Û_² ¹c¸ƒ¡=…ý"ƒ B‚^¤³—d­7CœIž!ï>ŸÊyÂø±F°±=AÂr9R]v>Ï ;¼–×heƒ•kSoŸ`¹V;¯è†S« b«ž÷¦rî5ÞrG“ö=ç E؇í•NÓp± aŽûÐX.´ž«ÔCc‹› ç]NMp-Æ÷'\-7ä‹ŒŠ‘ rùår(è·Â/1¹O¼k-­’¿ ƒÕÐq^yqzG˜‚[9÷“%«wT‰À jð^嬌¼‹€ÊVlz°‹yݾ'ê¬-)ñ¥PoOì=¸¦/]¤¡7éóôÈ¥p µu.|;ÆL’"/Yœ|™Ê¤Nd8¤¿«|Uÿx¹¼·¦»BO ãF™­DQùŠæÑ+Ë#üwø¼f+ïÞð0M§µ¹ˆªÌ O=PT»°dâŒ#)ø0ƒ­¢Ê² ™d—˜—Ä`´ j[¨S7ÃN[Xë§lûäbUäÂãˆÄÒ$>TQ5Í©¨â„Æ4 7æâ©; ²E3?ê©¢uÖw;9E'È‚ð &1EˆÑ{±gþ’ãg6©kÉ~´^ÀʦXØœŠôNü [ÓÃHŠà 3»w‰ÞÏÏÍ' ±ÏùÍÒÍ €ÝÚÜb¿guiœƒdÅUlÃàC§"æõÚ±ô;1WfµÆ»“pM’¿‹2Èp3cËÖzH èZ{Ujé®qÖ9m,Vq†X:1e‡ÖF±Ïà ÒZa*]¶×Ãl³q³È@Ék D4ˆê½1ÍGýQ%BIú-ëQ:[åmÏmÜ&r¯Þ÷îÚÁ¹"ýZãËjð—ßJú²öDéÎ)íA©Ðá‹&Þ¾(¯&JÛêÖŽòH¡ÊØa9ºçP”•ÝÍ$¸£Í(&r126wŒÂG!K…I“wÔ†g‚| Þ†Yéˆü]½õeA6¬K³z&¤A©Õàu ªuÕIhÇTTߢZx±_ƒëK `Ÿ­,îEÀÃ!GùF Ñ+iº¥=J„›Ü.¶Ù¢[™æ2œs‰÷Ž/Îòj©Â¨eñƒS…m©y–`ë¤$v¯µ`k%ÉÓ¦!–}u  ¥H„Si‚(ÂÅ NíäŸÃ´ N³KäT ÉaÍ~è,ãŸÀ–nK ÷8˜µ’½/ ¥ÖÐ#ZmgnyiHKåf¿ãê•: ÿ'Œ1Àp¶‘]ýIveóž–GÌç)é cû  KeìòMbíûqò¸^R §S°#.éþ©\Ï[ÚÑrÞ•dŽqÌ܆Dâ’R¥ñ`/•cW 扱¬÷%Ú¡ü¼4ýÜø¤Y<©“À"Ú¥Ãþ,…ÈݪÇe'£¸KO ×£^”QéJL§z²Œ-ë`YGJxôbL߀ֲG¹zsL§Ç°Ó ÞÔ½ žøáQåQR8J©[Q18¦"GȳI06ùM6¹Ð 0mà³ “pz¤± ZxþÙøžQèN¼…á¸aVÃ]¤ï!Í=oŠ+ú«² ü>³ú Ü.‡i/‘É­hËŒl{¹‰ÝloNJã’$øŒôP^—NI>ÁՌᕭߎêÂ"ž|H J”3m”爅Zûœî\a/U÷C¤Œ]ïjÕúãíˆé»8Üõâ-–TÛÂ챌ì0‘û`K&·Í¶ °G=VC.–ÈD´©½ìuK$|ÄÿüÝòF[R»!¸ú—‡R“µ›q¤ýmiZnÉ,WHš\YT¸šÌ€ ªž~=jÊSñ~E…̬V/µÍ’•=[”÷÷vÇz·{"2uN ªVû€ jcŠNSßŽÐæÂ+ soñ÷fµ Å ˜^à.³”ë{Ì_²ÛßþeõÅÒ ÀÃŽÓÖ[êA³€f ¤–Å>‡¡aßÑçGb«h¶Enë’ ¨šÙ¶x¯ ºöd+˜QK!Øþüøv“§&¸-¢Ž ©=HÖ.Ÿ)û÷‚Èy-ŠNŠLÍ*ZIT°³£Éª{µ¤¸ @ß.Ž’û ƒÎÍÈ<¹ í^ÄÆÐ$ MxØ›¡”£_Ä)mßuîÊ2Ô7M:ÚèÌ«ãüï™Õ\ò*çÓ¢?F:‚xƒ×û÷ýfÏì>3ž~óúåÄMO¤R¥EkÞ~±èm“âGFO^ˆ'9•×ñ±&¥m±Ÿé-ZÒK“]K²ìOf’’ù’¥$ÑBóºÕ·çÐc"—‘„öû}ãÒµÝ_üØ‚¨‹-;tCBù°¨ñ²Ûv*~Ôõà¶dUVaû¬¢Å"'‚O¥õ·ÎÆ-ŒÏ' ­}l–éGò$‰Ñާ“H‡,’¼n–ObXâ¡îЍ›1»žSDøCF}Z=;¥ž6@9­ÎnÏè׺I|ó§ŸÒßý€_ŧ¿|ú¯þök^3º‡j(uò}(ðIV1Çç—´"†Iõ!UJ{l©ÕE.§ËèÛ(e´Åà°Bñu]‹ Ñý°A“6ªü5‘r«úuôn©§8ö 98™bŠŸé£øv0‚,gqma­¸êA‘ŽP‡×P¢#‘Yk´Òèeõ#Êk%¿·§´ó (C´{­Ú‘¥—JaGMÉOR!QÈu%Z>Ðåž–H=T¤€à1Œä”°;Ê{úá½ýþqš¿|½\žÿë]»—?mC´ê¨×µ5Z«¡V|ªª«üŠ$Ü7šñOiRßʰ ©Z¡Sp²ÊÝQKF«Î­0,SʦytCž²vV‰Ž©Ìi_x*©Mÿó_ºìz–t~¬‡ŸÓN´°{Žâº‘ôJBûóåö¥†·"G·àB°yмÅ­n׺,ì= ³*…òà'7ïÒ¿¡MQOÈä•£ª“Øã„¦ÉIõnqßsáÜò2?DÑ 'Æ)•Ž\Â^é¶–¿}üþú»_¦¯ÿâ×_Æþëwém  Ns£S;•‰‚÷*š û¨ë§.¼×̉@ ž¥c'GkéFê µkž'ôæB(”‹-«ëô#8RvÉ‚ð*¥®mýµ"¬Çû‡yceª'Fƒ›£‹°âëÂõ‡2ª¼ÐÑêåû£ä×-¸“­-•¨ |Q<?ż %ªn€Òò+ö-ç}uCPÕÑž(Ï’íKÊA–þµ)õ§<¢çæCçÏÎ Qa ø~–²!Aðe]_çëÓi9ÿÕ/ÿ¦¼ û%~q64f¶W ‘ïóÑÔî!$‰ûëúì‡E’³½Ê~°&P°h×,n´x| $àßáÏëPÓ¬M@FUÛÙ½oe.zæljšBÙ^áÿøù­üÑ…ï cpxÁçtÊZvH‘…·=‘çiZ_>ÿÛ˜–·¯O×ëh[þÐn¿¸ãQƒ`9ZpÀª9¡¸èàÍꔂ¢v‘ë98ö”›·ìÜù)úõÈøÝ»£ÙõÆš#¹p ß^?(šÚ;«•¬]?uã'K2ÖyÏ@²bL§IF .µ"¥0bŽäÀ>î=¦d?ƒ|°uîjqa%Ía:÷IÑõlôWäcÆÐÜå/½û碸ÝÃÆ´³2ïJŽ2\ß_h–6?û­4b‰î¢zR÷‘}ü€¾ZU©&­ÿµ9nðPEh\ÇðzõîÙE)_–Æ ¯üÙ»FC¸výПmŸ¶¡´­c§ºX’Ÿsïc 'dptYTâ6^añ¾ ånC;µ•k>H]/Üä”g<þ'wª–huù‰ý ”©ÌY¿-/¿(‡¸ßða©Ò#e¡£>¸l¦],«Ï]ó·ÿrûé·Ÿÿ—{}ÿîÿÅ?½ü†ãÿº6µr±b(UhѰ+Ôªž—•’4¶heýSÇÎí.g_îìt(cë›Ó¨ñe¹Ñ‰±øU<eh†µ³2Cr!»ß×ñÉ"oj0÷JOŠTQQHQѶñ!µ­ý„ldoN÷Ò#²°·4ñ5£(}Ù È1õ@x :Ç 5‡þè²I“ ƒZ*Û‡Û9}¯%T¤âׯõrdz`ILÎ#’@¶Ù?Çudõ½É-'µþ†6þퟧÓ_ÿfûæßüûÿ÷/þqz¾Ÿ¼_ˆQ‰½†¾Mí[Þúu‹«Œð/ôqÕn§Qz”¾v?Vq8h!G"Dêí’1]•dòë‹”‹ù: ó’Hà—ÜN¶!A“"‹¸¦½A¡Ô¢ ÓB «Ô[Wy ×úx­?ZÝî!Üà¹8$¾>¦ÈE›TOć¸P§‡kÊ]õMŽ9€R½žŸ° ùzÉÿë[W *6N˜­# ÿ£~ùÛÛýý¯Ó´üåÇ?ÝÏ•´Ô»n÷# å±Ü/’D†a÷ñ‡?K¸?LùfâÚ^æÑ\Jj¢Ã9´2aÅœ‚¯ÀI T TŽÉ0•õ@€¼ —Y)¨”Â.ödBßÒ•ôvG²ˆ#ÿƒ~l6œ¦ÁÛÈFê4ª ývÂ*oÀÎádZ"ì¢ñxÚùnÓà7žÖ,u()îècî‘@há¯#8SõôoŽT¤sìø¨½!Ë\tEÕãšÓN±Á¥Žw¨  ø1ªjÖ¸—÷Çôùý––d†áãh?,I88næíýü”Üð'·ÿ¹ÔWoI{orír{:Å T-¢(]›mŸ°ªòM_ßOýe&Öæ™§>7 ³‹n‡¢´ŒS}J“ J |PÜΖMíã‡R.`rH© oì¶ÇL®$ºIÔ£¦gÆ‚h¯>OÁï²%—6J®‘1˜£úòÔãUmiÓéÔlÌ)© h9d {0Grðw)ŽÑ¸èÔ[I¹Œ\(5À¡ê]ƒQþоëꔹfî^ø~ëòäÙávIpÒõöi¥øÖÌCÖñ³½>ÚõûþÇ÷ñß>TX½íPY•Œ€7fØxãLP)‰ÖmXÉ«$ÉR1Ãìˆôü¡OmwHé bvG€IV¹’^ƒâ¿¼5Cídj)@NXóà·Ù–Gü>ćvˆ©Y7wn(Â,¥P:Ìh3г{CŽ/ÙÄ’É“…Ã’'éó[ àšâžÚ~ÑJȲ)òïgeƒôO»5ÎuÅöÔÒÓÄРzÃË;Šg™¾ÖǗÔJvŽP¢”ÓmyÔô}>w¨”Ϊƒ\kª3ì‰ü·±¬òž&G¢ËQ—ÏÄ!ñ}Ø¢t­[)>ùÇ^7XÐ;«ã÷c¸¨Cûû¤ãÚIžç†aÔqœI±÷Ô±¤-™R©òH½ú> ³ áXÛ‚ ÅLÊ©üLT—'ÎÑÀ“d·oÙQ6í`Ì“ÛYöIxà0Yï$ÇÓŒ«iMµ¡#svK¾ž_ÏvM†:ˆÜBT}vKPо…0ÖS`Gd‘ÌÕi1@à‚ÖW®š¯¨¢Í¿ÆÉ•7>uMí¶I R$!NâŽjÙK" W%œÜ’‹Z.m?÷j¶¡ìÇvÕÛËedÚݘEjí„,•A{¬HÜfÛv—Bà…2[˜Ó­å;\TÂh/ìü–¿FÉ|Ú˜Ýõbæ×º å±Úë NÞp æEþݶGº fŸÁp qA³kúG×»-ÁÒ0@RS/EVózJÙb>í®L¡¨  Ñ«ÒÇM¸ÃèêHè„ÁjÙ¥fm.÷†ÛoKv@šò-ËúÛ»+_ë%µ#ØÍS YÜG^Z˯ÞÿÑæ €„iS[d8WpÊ‹àa²e´Œû©g M–ÓªªaCÙÄ+Öb£?$`a<‰³nxÂàuzm•'DÐ=öù¨l‰­ F®`èfu7°é­*j+¤£í{‘¤~ˆÖ½оxTö:{Ò®k$"“%ÆÍðÒ4>«dØ>tò~eFçl'vÚÁôr°-»K2 vr†TZ¼§HåFÛiO/3ç~º_ëⳬe€ÇŠ’Ã¥]®9YÖÒÔ*ð;ÀÍIm«>|‚ù¨«Ü‚ö[}ÿ†öì¾ÛgSH£lëV­†ÕI·lÑ7ØÔXYˆ–V» Ì ùÄî´òCŸ ݾÌíñÇä þt#”í­?¸X R¼”4Øïíêcª £À·¼&9¶?X«ò%žp@°Ætç4“¬–h»·${R ÿ·ý¹BåÞžaJçmÝ>Ę+[à>Ly©Ù> ٬[üšPˆ/PÆl…£&èB®”£wµ?jÛ+J÷Á£—D‰IâÜýF­‚{h0âT¦ncCAMB»;ªó2Ù<²ôaœG®0t©6ràNfR˜ …d§å8³¢m,1 €ôu`Ö¨FÏZ(ÊÉêßÌ¾Õ oŒ–‘b…aI²W˜±®f@w±™Ín•cmA"B   ¶~±jê†t XŲøŽ®g–ª{%ÈþáPó 4àG«Ö1²;Íw •!v­á·’wƒÜždD·4É¡;™÷I’ kã+ݵ•É„˜ÕµÖÚ¶¢ «Þg…û잘Ÿ,ª>Ÿ‚Th O·7=‘îª9lÜAi‚´SÖÓYNtŽT%Ë{½šofûXç¡Lµ÷àFH®¿oîòHpþÒ$\nИÁHd¡!ßJ.QÂÿCoÍi¿­vÕ„sÔ2l4B•÷E‰TŽ=((¥¬£•{ÂÓ>‰{›ë©7uíÓÛ¹(Sª4qÊ ÌÐÛI›Ggƒ“Âv O°¿€êB/DÃ.´¤ RÜ"rÃWôA0ðâÆE~LR:¼xCq/2L,1]­g«j& Œ1'¨B̉%ÊÙ¬¬šLQl-ÝNîV}|ÄS·)»ÀA­wÊ €ï’ò„¨?¬dù°pCn29?:yU=t•ÞV:ÀÜ>;ê]ÉÞª8ÒH3ò[⤷Ž<¸2WRT&;ÐĘ[¢_‘3 °ª´p'=#?´¡¢“ý­¨bº‰áQ î$¦MBÃB¼Kê_Çý.øƒÌ³Œ ûŠ7­÷k-˜î §ŠÁýÖ0‡ê½ EUmõ¿U›œþ NR˜ŽRfm1ð“,š‘cÛ,v ÄѾ¼f÷±ø7ú |ù³ˆo? ‡±Ù×$Ù~=l{‘4:² ±KHj™ŒìáêÂDN,”®‰µ]¡GµÛP’M”64­I8“åîõ à¸‡Aá&ôðlli8¬>)4Ki[3›VÍC-!á_VI}ÎfoF®I¢#”pØub§ e–£Â³,)‚¡R_Í8H856fŒ¥\ §taý,xQ4– RK ôn#ÅK”½E[EöZº^#Ú;°êj]¹—:$³ºg$®ÄÆé~k’`Q“9vYý|ÊÜ¢%fx A'¦@\dó³âŸl¥«Ë4-]^Û ]ð€ŵ«ýf×ÇljK#¿lÈ–XÐÎ ƒU7o§Ó>‚7Mî&™½±?\õà®Öê)-1<;¬•Cšˆ¤ØÝ8ø ­nmØ;ŽY}Îvñäü¤Î¨½¢>›ífŒÊoUæ“.t ‘€ódJÂ2+hQ‚ó‚³7Bðý¹«%Ô)Bvg¿Ç/)üøìï_ JCùL9Õàg:i˜±Q±ÏÜÍËJ“j|Ö,”Bcî\Ÿ÷ò—‘‡¥Äö ÊÒ؈ÈH½ äµáHÁµ…úäg¸§›çÓ‰ ¢±¨€D7} ‡²I§éÜ”`ãŒÒý?ÚúFj­ác©]žQRS˜Ðs@À§:£ZÐ^aà¹R$5w1TõAó^¾7¡ËH©ÉcôH19Yú:4CG¢Ð\–hªBõÓÂgŠb®Ž ©ƒ» uxÂð¾R`µ¶á¼×&e¬.Zƒ!©jYYAθ§Å¬oÏY©fÊ͢ÕKÁ·zŒc¥òû&âóAz¢»¥˜¤£‚ Έ ãרÃL`35¤ Õ9é=ƒ…c’ÖòûŸyF:2øø½d›ò½ãìbìfÝXÂK­*„Ì»Sc8Æ/%šVÊÔS-&µmyλú‰‚5(ŽFMli°RGˆÖ}j·À…²QÆÌå#¼ßÜ×{N©.y§¤’¼©'ö6dõï+Ž…¹…í2ØÃ· oÕE)T• ÅýÈݕղCˆŸ¼Põ¹f‡!fXŸxnÔPÙIød¡xe{¶W)Ä…¶ºíxtÓSR«4M´êBKsÙ$u< uŽô%º­¹œWag› Y1{ªôÛó4#ò€@k‡ñlà 8ª¦ýáwžRÝÅžÊȤΫ¤øRéÎìZfª’Pˆ_7ÍEè,/Û`àËÏ:"=*S·Ž’¤èP|2dõ猎”NåÜB—-I­§S zG‘<æB»Ø®+Â2Ù µWnã„Í\ØÏ™€rw¬15’GrnÐM¡1oÔÆ<þ©v(‡Þ(7D÷òÖO9â‘0ï”QÂNkbPFäAQVºJê(E¹G_ÑWÓ1©ÜÀõv¾Z±k'·qp`Õ÷ÀS/°;B˜gñó= Wo=h\¢B à¼Ëº:O´2%öCÕ"S²—\g8Ož¾ní~·÷{–BKÖÃl)p}rn8Ø:¡DÙ ºC'&| 1I™7AV2î$‹!³Ââ4}ŽL…PåQöB¢Æ†tC›TV•O kÖÉÀW×}”¨bM N뾓ŽÛÿÚ9(H³¥0?pœÈ6vf©P®Ì yâÃÄò œÔhËŠò$|ÇA¡î\Ê‘Y8ZHuׇ=ú:a³[(pÓ ˆ`zù18Ñ6;·:Á#ÍfRŸ@ bß±p¤!;å![ÀZÙµc°åT9R(rÆ6j?ÑJú9âiÄÎ}ö‰·bIôÌ’åÊ/C;—öîe+)ÙªsT.}‰Oˆ©È3~#,‘Œât*íG5 ®0j³PØ'¡æˆŽJqjÝqøÉž‘#Wá’ a•' ;jœC„­&§|œO¢R&²~¹ôzˆÕ3¬=%_¹Š)Up=I¨†NvÓzãß›“þüO%Ç-Ú ¿Ppm»àÊZ1\{ ÊB‡ Xn`Sñ“p AAóö¼q3Œ8£¤@HTŒ!Ë[…œ­îR-my%õ`Ü«ê«^L!EY‰‹WäHÐÅ@‘EÓ†LA!G¢zñ>xù ùºêUŽÂÜE[×¥'?ºéJÒ[ø˜Ð¢õ®ª(©ð†J(Uöõa58’‘A*E”]’­zJ èÅëœ%ÊqÎÝ% ÐͳF:§Ã(S» žõ Š* Û&ÈJ5èse¸J•öÔÓc2êéIjé&"wÛ2]wÌÛ%h!ó)ZŽtÍ–ÃjÒ½O«j‡Î¬§öz)·°Ñ;99‡£ ^&´s8Á­x0 ]8žù±3)Ü&žc!xÜu¦[±O={Ž6»ßã³!n¨|v±#-б8)ý0¶×EIÇ‚°*êJ´ÏzÝ‘k¦Éƒ®þn°îž6Ëû¯œ;%^‘iÛ¡ˆ?ÿC Úèz›ÎO ɲ³Ž ½ µeÇDÀ+A2©°Â–ú&Ù² 3fóÊ”Sd;m[í(GA&$–Üù”†NjA,Õ½˜Û4 ÿ ¶ÃEåÅXÈx£ëˆ~d¢‘ð€~]ŸN•|¤‘RpÔPî¥2ÐKÓìª ^Ð,!¶à’æ6'dNžóڢȣcbØP,:ÞZë$Y»–»’'*Éá)ÁRÊôÜÙPzö Ü(¢}‰únÓØâRsh[rVe‹Múî©g ¡u5.u‰ôÜë*`Š¥‹ ý]Ù]è\Œ‹¾¶þ+'fuF;h(`èª8—s™¤6.÷3HJ¶·:¸0ÏO(çƒ×¡5ø=vHuØÍùeÚF™5Îö¸ä±ÃÔ ÂÙjiQžÊÛ+ú`ßéÞPÃÃÜ•¤”ì̺ˆT8æR¡@©˜Õ*K9QQ=Ø>!®û檮Ž./PC©¬ßX8i»ö÷1°Z¢?0:ôý¹!¨­hØ×•§Î.z (jàh†iÉáá„—!ìžÌG)Ðm}—/X²l”ç0»¥âfÕ¯@ž†8MžVžÝÜ—– *ÞO ‹zÁKã93-àÜqHO¢™¡,áH÷--KL? Ihc\O­(M{toµ®*Uk¯ ”ŠÑª&ÅHôØ©Úö Üéù^XÍ;­äuŒ5,9ÏP4rœMG<d¦‹JMÐŽI7<´v$Ü¥z¤Šß–'-Yû]RPY-ÈÑ¿B¿s‰«ùˆ-ƒöŠ+ǹ½9O0)”UtqåT¤ô*Ÿ±Ø@™@H¶|ddH†ê•1Ízp—M…çgü£d)«™6$}ÄcÉô y¦L'ÅVå@ÿŒ•wf}‰FSbódaKq¥QÀŒ©ópm¯Ä2­¤ÝÓ[Üë1J¹ Û];°MH<¸\fF y§äB-U¾n#¶çû“X¤ b•hõ`««ãy8¿¢Pܪ/š°{v<Á²0ï Ñ¢•éícwrП®NÆÌ ‡þA0: ykqØ`•uF»ÃȈÉúnØ༎ò,ë­\fØæ§†ûõdPˆ)ÝêPVaÖd•H_¬álÍó°UGuÍ~ßN¦7øÛÓËÇQ‘¥R7p€hG½¤«s—Ô´æ÷ ¨Ä¯A‘:ó; › Qò@Iuø/ñå4—ôhﲺr‹ÛÓ í ™ PÕ2³­•CšË™j=Ñø„¬= ©0XaÝléj!¯îA3퉃¼¬y`CIŠ}0ç€ç†N™"MfOxOp OѤÅ>Hk’—Cº£Ú J“––¼Å6tÙ­ <£AÅ[Ì:ø`ÿNP¾i€±²à‹aR‰•L÷“sp°ÐÀcß|–*A"Ñs‰§Š6•U™Ã·'3êù&4ã~°#fìíà Xë~¢â:™9ÌX9O% ™wʘÆösX‹ðv’'>C¦RJiwú¨á29esßMy ÉfÐFïÊ¿> lÉd§Œ>•â>û˜jÞ&ë`“° ýR·¶R`°²Fê9yÓh¾x¹NûF'É“Ö@Vaë$ªÝK}έUÇ¡%µ¶môô¥e3²;(®jó¥õ‘-J¼öéª0GOOùÊ«}œm‚JpYZ]PW²ttL"Ð…Ø!Laf‰èPOÂt#†LV6@Â͇Ò8ÐÿRÿ5ZÂUN™ÏúŠ%‘ƒÉꀈ ›åJù{ùnÓסҼIÄAy=0uiÒ Ûîè9R'ÀÄjãM–Ԗд $tZPØDæ3mÐÛÉA8˜ï¤N£—k˜eB.o„øÊÓäóÃλYVˆ*laÆwœ T×Ç67û1‚“¼jÙÉϯ˜ _]ýŠºY„£Yu£dadú/Œ<®)Â@°;WöA$/Oau@¥Õj8ÃxÙž}°Ö÷ÁQ¾«ÔS{뱘X߰ņ/üÄ´{oSdŠ4ZÓ.uÆÌ¾UåWê>(RY*)êèC| ù~RýÒá0à(]-Ä›ZLóAî 0&\&ˆ&Jž&yA¨]ç;€ª•>@­ŽMO¢;Û“ „³Š ¬8´Ë”fŸJòïiÝwŽâ± *‡× @¿2óÕBHtø£Ým4¢ì¢æ®¹ å8Ýq‹Ãà ÞL¯%^3òÕÃÇ$•¶Å¹EJ;f´+¥"0DÚhÛ¬F^ˆ@ž›6Éš<¤sG…¬„h3#\¥Ëì"Iä][”ç‰û§™ƒê¦€¬LeR9ÅJ椣Ç-¾«HtÞÙºµžçÌ¥0 ÄõI”[‚Íuíp ‹„¬vOšÓŸÞ€n—¶vx‰æ’f[ÕP$) ï É1z)> 0®CP{b‡w«’°b²òN<‰3z7Ù2µ2× Ü¶l/V¤’LS›~hÃ%'_÷Ûp|‰ò$ñ¸{˜€ä›»ß˺—ч+ °qɲt¶ÜÖ5/‡¹J4¸8‰CÊ;GЀ‚'VtTj,ýf >c I°ü"¶uÌ­}úGé KÀó„^+7â.'*ZbŽ3v6\®lc'¬­Ïƒu" :WSóÌÖeñTCcàÀ$z6âcN6•\Ê™õ&iyvðWCk©ƒOÉ'O³¶:SµIuxt”iôv|_ëJ¿vÏÙ\³€y†,»G‹ j§æwèêY°@M$¯ÔGE=%#¸Ê7ƒ$•ÇnÜáÆªQл|ï|­Ã/5¼d€»N×îòîÑí8$s;úžo$ÇI´#£Â)½!iOí ^ÂÐå§²µØb#‰:|mjØ Î²j…Æwä8Ì@©-ùz‚Whz4Z%q÷:È|\—u]œD™,S˜ iy>pð&?›Ñ¶·ŠÆµ„òWó|Ó¤˜ÈâËtû¡¨UÎ;€rhÄv­–þBò‹¾œHªÐ„«Xt²í"uK2·fûâÝßìÇ{#ƒaKV(¬Fè\ÙGöç=×Ý´9Èþ‚âÒNm‰ †×^²7*m©šS;%SåY‘$À„Á@ÌUaÀöqa?TÍÇÒu Z¿ðQ¶žÛ˜g›_ÈJãÚ*I}¢Š6½ jÄO«Ý™§wqÈB’l”µ:HùYÒ½q‹ârª|†‚›8ßH¨âz÷û‰<5(Bàà‘V5ý46,ÂW[£®Y’Í®ùâX¤ÓíyB9½Pw`@2þ©ÈÈaL«ä•ü¹˜8¸ý œ‚ã{/4K¿\̾X8lŽ-²7nPß•’~bÝ ŠÉ¶Ô-ÖÄh'€ãmªBc¢WíwMyDôº§ìH°gðº!•Fô)=æ£e~:eñå<±eÁ¨À&lP6¬ÁnŒXè'NȤ#g®x‘ˆ¯’cXr1eËf2Fš¢UNOØTÛAô~šN+ 1ØÔõBmÏ:äzA°ÇÑ{œ¾p¶ç˜ŽTª×w {2çŽlß%¥öí„ß²ç‚ÚÓÅÑ‘B±z°¢EIÒ¥…ûtǦÚÆ #Bov]èÁÂØYრð±vggɤ Çf>]ÙÃx ±AÚï,½®£”ûhŸü^„acÕDµÕŠ~bòmè!¥|hÞRÚ}ÈÓ^^ì¹n–4Ü& <¥•Ãóˆ8öÁ£GbƈK°W\òÄq7Ü$T;N‹OqËúÀ@SÊ3ˆ¿;d×I‰F2 5Ëž­aMJ Ã@¿Úªš}=†z]Mw­¤/Ç`9rës.Ë* ;çãFò‘lƒ•KÁª Rí$¦û«r’ #Ç…$ž…œVóFZͪ`<ÖZD>€9® ЃÁ¤£ý-`ü@—»·£¤à/R È>Y4MU¬p #Ô"ÖÝšïmØë‹/cø†õ]ö rÈÑ{’Ùo ÎŠÈµ¦çÚ ”|lp•‡ŽHê•Ôk qC `œœÈô83îøÙfŸ¸x¯C²ƒ”ÂËÉr§³ }c1}T%¬fii/9ƒ-U¬øGf# Óû>šÍò3tpaYmÙØ¡xOE2Ã2„LÌGu WÛ|)ë··”ÇŒ*NvŸ¯~ÊNÌJ¹oÑrL=Ø{©!ZÏÁ(ÀQ‡þÝDTe+)E‹x …cì}‹{ÆXýå{»o~ v//í¼6·»¶’Û)y;³»øêÌÑ똈LyW§lygÛÝÊË’?ýb/m•ÃysòÜN°¬€,ÙÏ4äM³›_`X–9ñD»lw¹Â—¬³3 |I'’ÂSB}’­ÆUÒóh[÷³l {æ‹’JgÒ¾$ñ?xA^ ÷XÁÀ±¶e™E‘#sD%µ“<²Œ ½g Ô !9 äØîõ‚& bèeGÌÐn;l¹™ýDu•’ÚBˆ÷.»ÿDö6ŽÝ@º÷ÈNýg±×ÓýºåË—ô-´;(Åu ¸ÿ™z´Of‚£‚€,| 2¬%JÇJv˜C·W0´ûExÛ -%ÝI¥V#­Î>qc‘Ó3th±êÑ*Y Õìn&W£R£–‰Ñ–”yK cS rÖÙ§¼Ÿ“;oº,mA…`?^^¼› õÁ¡ªãÓœ?ì²–7ëÒ²l/ÆÍÀTȯÈÌдô,n+»ÄÞÀÕüovJÊ·í§LóÏ1%Zùõ©kc·ÉÜ1Ë U´aú¯Ãj BŒ &™°X¢@†DßájÆ‘v£ ãB©y†Ä„¶àd–@sÞŠÛê‡ç”ún ž9à!¥yÒÓ»šZ•æ:€•û„¤£}QŽÈö„¾‚äK²äÀWgÏ]§þA§?O0GG‹GèÀ`zÿœO14F¦¤¤Éðà¯H  ê€IŽ4âC¤¨^`#ÂDRÙ40u̸DGˆ¢UÑÊ@RxÈžì.Åï !²öÝjŸã.ï  ¬:`d«Ôø9õ°À/ò'[–üjäŒu rÔÚˆ;¸Ð½»m¡W ˜dEV‚8b{Údþ¨õ}A¬n,dÁ2,y)(Fw ösC{í¤©Î´œ+Qnƒõ•<Þ Q$|Oò¿'M绎 aÛ ~V……_zótG%Öl•PåFeœ©ÆrXÍ@bžðL°a‡ÂÂÈŽ-aîÀõH­ÂŽ<+¤çº8)ÌЉ›»LÜÌOØs÷ÒòLž¢Ø„ÈnáÆéø²™äɆx†g£SÊß¼1Dôî › ò×û.Ó ~xPh‘¸ct]!ÝLNÌ^óVsi‹¬ 9¢ÿž®Ÿóö×W€¨åÍ„ÊB’*5$Ä‘0LX`Ý)A­ÁËRsN–O˜óÚ½Ÿv7ˆ&ñà9ï)Ž!èÀŸж#È¥kÀjÆq 8þ•K,©Ž3{ÏnŠ,sÜÇtœßØ8÷¤)š¾žèëÆ]· BŸýQì™B•LK§ÂnFM|gBç¾¹U²WÂBdÅ?ø±²]¥`Z%¡©’<ÈZøþ†È<&dr˜îP퇋G–2qÙzD´Ã8¬%w$\,Ñ• YîÐÒdöøŸ¼Ñb ¹;@Pž^šö0©#dR1?V[9:ÔN¥T°<Þ‰j?Rt%‡ À•ë6rJXqš2µN“€{_1YªmA(:sQ¥WÂêÊ4—0T5ýCÏVÎϸieIým=\>ŒÚ·‘÷Øh¤ cs0Þ¡_gÂB©À>æ ò›1pL“¥„Åå»°§öä1ß°ö\œª¾]¡ÁRæî ÍrÀNµ.8|$¡·w·Iª6÷áF:a\'‰Ý kñFy˜>†¬ŠÉ³L7Išê¹‘ê«aóDºî–мÄ饬d·‹ÚÙãtb‰ô]$·OȤ\Ûöˆð_%ª-Þ̦;mÀ(Qm)9áŸeWOÉÔZæ•MÙu,¦kvÓƒytcì)…k8Qª²÷¯J”¦K0ÈDÕåMC“Ó9ɹ!™âζ7ÝÀ¹ý²0 .Ðs^ô+¢Y­;3.©èžHÉtààåÎÙ¿8w«R*œ¤´Oê—j ÔJ BÔ¨ lÛ¹¹Q…îLÒ&Ö„W³˜ðY|oœFÚþ¯,0é–d¿7‚,ñ:À}¡»‡É¿£…"ßi»îƒ}ö‹LGqVUz¤,é0 €a²Ã©Oº70ðêBŽÓR6sYðC—«’ 0ê‘ݺÊ-ȱ'«°›-k¥z=œUèEÒ€’œa–Ò먃ÄÔA‚Ú¥œ‹¬¾fÙà÷Ɉ¦6`×;“ °òÓ¥J‰n[üÝÉQ ¥ç ûGxÖ›OU¶èqºû»™HEÇ¢«ÝahŠyœxÚ@‹hµB-K¾o–”f!Ä=#¢´×ü3Û;Xàºm€áI Šð‡ýæ±Z€'~È–*èªSIE§-„1;jhʺ•6ð—ió üŽÄ#áØÂ+us ƒ&0T€ÙYáq¢ì•<ifÊ/Û.Bä8$£>*Á„:¿’Õ†ÀÛåŠm<è°"·u­íØØ¶Ý¬|õA`›Ú²£Q¹^$5ÄDi˜í!ÏSõÞ* °ëK{ŸÛÛ7'÷ŒÎÚà€²–-5rίFZÄç@6¹hÒ !·B]1X®˜’ÊÕg·Q  O•Mò”Bév5‹7½d"Ö*4Qy†ž^UŽ9(zM<ú{__Iº#؃¸XFËÁ^…¼Îó@'-²mÜÓ@6³®¨i_ŠùÂyGyØR#ù¸£;{óö;}=>HÒu-ß]~L~ŠQ2ÖisÑ»My9ÉÑeÚ¬û*YŸiÞ^‚æ·j_óyI%V¨ŠH1ºÁÕ³è CQXö)b¼â«Í$Yë‚-íÖÜ1”=É y,„ñĦÕËJt—Á¶€F?u¢œï)w“‡às¥ÿ‘ FÝr&æŠã<8@3ö@u­#ɰ—ê^$S˜ˆ\#Õý!§ð|.4‘8{©$ý€=¡ZÌöªB‘cDZèÞÜÊ|+vKðó‰MÝ&ä+1Ž®¤˜®æàILVS™D šHPŠ'DÈ* [cFã1u^v‹2zÙÝÄn£Tvöy¸(‰ÛF]W‰7‘“Â/UŠžúÑÿ6›ï0fG8”G´ýÑ.?ê÷b>G@ç>H]\P£Û 5næ Î[=šIæ}¼)'¹`„Ú˜Jø?²Òˆ"ÚŠV¦ºÌ*™FåÔ¨K§Â¦ã‚:0Óuõä ÉádltMcòbÄÉ—j$îŽÔüà™üØÃû*k‰ÁµuŽöSç•Yy™Ó½}¤ê}ÚmëÕÁ½³·µŒLPVÐ=Bß7&÷yôÈ¢åv;\Íјń¤œ¡Iñ>ºasÃÞÂa†w»Üdm…ò×k…Y7)uàUŸ.Ñ‘{Èô,¤XœäàvUÒú¶FËJnÂËìG¿™áÅ¥?µÏÊVêvéf 8·@À«Ñ=(`\XòÖi×_Ü}ÔR^ÑN˜ÄsÂØx{¸ôh©®îáy#Áçe±s=Q¸²Æú˜‘Îp¯„,)$K$ „ áæph§X–b¼šqà"k—Û@e3H&‘×ûH¾‹SHŒr › )±êŠNÄ6ÿ¾7ÚÁ¸—ì·HVòÍ‘¿;ÈŽÙ0Á—üû„™ÌO¥tŒ$gÉ:äÒ¼×ù8_ÿj¿.ãéŠ ®‡E³·ù–å/Ö~ÒY$Ò•Àz+S̪¡*ûu5îwÉŒ`Ž I×¶ºW†lÄM˜Ñn»$ÍŽ²%RvóijڳÂp±Ð”ÛžÐÙíÃ`šv©xV+]PÚž(qÚ〰‡u‹É„»«»Ýx8‡½ÉÛÍhð BFÃA˜q~Löá«‘%¿XÿEÎL[fhCDè9Z/Û.ïÚ,£+½œÀ–£íƒÃMÒ²´ë¥Ø f¶ ­Þ¶b5šs ­ýøÕ'…pt²¨«x)èñ£Ã-aj™I€]1„^=S5¡Î$§ŸÍ͹åV_¾år³Ë×uÛ1 ž¼»ÈÊk&Iíñí5úö&çëjo)¬@‚˜K´W)x&©zݱÛê æ—R–Ô““÷^®’¾šùU.;°&Ž_öDõÕ … t+d½áÉ_a4:œw 3Npµa’­XýuÇi8‚EE÷XJéw–2aÆŽ€J¼à†³eM“ßêÔÐ0oQ5FN#';IW²£TQ8Vày´Ý¤ý ôn”û©òøòÃ1LÛ²¶¼µõT;>ÒôÞ&ÙÙ‹Ç&Á˜Ù®LñåŽþ£ûÅš7©½Ì¸±›¨4X,nQƒB°Aœ½»zaZÇ~¾,µ½IO!:ƒÅ|—§–Ùå)/[°TW™“¯L`Æ”(éCh(¬ïô0¡ÿqEÊýåh¡ÖÉR7uK²¾Ô…#fÌÃgÞ4¬:"€†X¢®úAyí°þ<½DTDp_^¥íºf¤Ø·IÊ÷ ir€\åCïé{„›§©úK™'¸ÙžV›c¨ö,F vÊ‚Öb[·¸~žâW/ QàšNÊ”!¡¼°­ã·iD£s$à^¡Ú+¯x)öjÛ{°·Y–‚‹?šû’ÿðÃI²v  "Jú7FÀoñ±l*çòIž€?ß«ý5 7ÚË›{{m—ÌYoɾ΂«„«¾=·—ÕAÒ&£¦¿J&,ç@+1±y<7MAe?˦FNU>à­Ø„/о„S°î'¢ÑíæÐmœOˆ{îΪ´%2„Èc‚mmòd¹Ï„ÝQgXöéÎË K“Áç’Ãr™5U`8õ4ð…qÕÊ‘7/%¸Ànw#§8,GˆÚáY\ZÜ.¹×ꥠ”ÂW’@ Å&YçÕno^ Ü_/-Ííë$Ù|[X­f-ÄÒfš?ƒ"ˆ¶å[Õi $\ÈÕOÀ¢<´uј—òuL­«OK¬‘‚8u§b\ġƸPÏîgh0ìyŒ«ÈGæš(hÁ8aSKúN±ò‹ŽÙ À$Ê!rwaLÑTøQ ƒp ZåW³-Ö=€ ÁÐŒÅæŽ’ÞØ+MC †ÍMÛ€¡iˆiÚèc‹ÚƒDj ¦|¬ó óçÓ?J½¢&Ç*oÄ€Ó¡…º/•ÊEr—Õp/5Jl à lçܤ–{\LùKÛþ£óyø w4”o¹k½TPM£‡„itêõ±˜wpáèv™íÛ¥]|ñ›-ïn/þûY_äÜÔÎ;ÉN%>Jì»®íËÑñr¢‹½’yv#ibBG±îEX"嚆€ï†Ëîy•P‡rBB)Í_Áåš|7{Z™aÄåu³KF¿ ¼r‹Õ²…’‘S'¿ˆ1àäÌ’÷T¨H!aXΙ÷ÏáÇç ïÒèQ\!Ê–bår>„«Úùñ£%Ñ¿˜ícË/ì"m.ß@“ôzºÀœYÁv’¶ ÐØASýIÑà;ä¼;©øÕ0TNâ¢þY”dptŠYdÀXÑMqóÚš¬D\R'ËtÚ»XUñÕ;û¿–^ÔÄL0!LŽ ¸|““_1°ÌÁIÆ~RÒb„.’„¢"*ÜU=OØ7LôÕ0µi±é½„u…\Êl)£‚ŒÂ©’Û@»À…ÕÄww‚.€†§>:Ql‚  í)UÁ&ª¯ ¼SÊÒh‡Ã ÿúÚM’õ&‰äÃÁx€Ø›.œ°úiôPïÍ®½Z;µLx±oð(p·{ÍèÏP汫™c!-r Ìè=ä¡-€ÐÀjÃëõ&nîŘ+lp»ù"y ûei’Äž² ¿B„Oþ"SÃ劑¿äìõQ%g·€EHàçô7[%·Q&èk#sèöêÌ›±”;eÓOÜh÷µDSÅŸÀZ):àp9afj0‚ý€„ ÎÙÍ]Pºä¡,ÐFÒ²ÿ|e{øè­êv®"¢é~P‰ j÷ +JN»7`ë/CæöÅÊöpãêä9ú+Zc’íÉ¡„ƒ‹maÿ½W„y(¶¢w~G²Á8M±pQ¸Oh Ã}æ„þ+AìеÃv=JåseÒÙ€(QÎO"9™ÇòÃ#ÌÌãÊ èBV<%B·¶áå%ŽÐ~wí)& Ðå8=ÉB'Z®™Ör”Ø€ÝßK+¿@-JŒ¨c]#ßà èúH'ˆ Í7•A e@{:'Fâja M×&«÷X1{9ܳ¯R¦—8Añ¾Â€:ˆF:yÁ¶m]trª”ÝÈH%Ç7O žƒO·›Ënæïö» òËÑM ¸0 RÑ4‰†km¯>ÂË)9ݹ÷Ó.ÛÌ4ѹîÊîø$‘ø‚&u£fÑxü-Özî&/hkéQoÃÓÍC×ns ‹þ‰óKÒ&û8§*VõÏ002HJòœïT’V‹Õ‚ Œ@#¢Ü šûФE–&9R®Yª–+MB…ä© 8^8¶JÔ”o™çš´Yêî>së À÷W)øgùÉZFEäowÉðÞ)¨&òÛ^Ãy5²fŽiw3ìP—“çu4î¥VT§“/½Ðs$Ð.Bg°’æJ‘#™Ò»,Ó¥½8BúäÌÔµö]ê-4pA>ªÖ–ÊS0PI´ò[±QÛå—ÕÐXtP-—{¿¸ºà r›T¥˜ŸJ,pú!žÚ `“Ê©ýnÏ;ê")o$ÂE¸«·9b*'_¢”æš²¿}ðr/RêíA ÐP"IÉ»$™+ªµ—+çáêë¾Ú§“D÷`ñhh„±”°²º1@ôOní¡&€ªv/ ,ÌŸDvXaËÒ/¤bIXI3 ä`7¬þQâ=F{’^´£;?É)V±ú1<±Q6Ù»äBp=:\jäþç9.W.À†Èż mºä‹Æ­}CûªYšÅgɯ<1IzíÅ^SýpV9´ß©AòZÌe³ÔÅså°[2rp¹ÉŽSƒ&‹C,”6eråÌLWÙ,[è<à~0 ™"A%$êì Áº€Üè+/ñ8ºø÷“B-pÑRÈ7•NŠï H§”âÖÙ}rÊC;¤YÙÞ×Ô³¶n{÷í«¬ò*_<ÿâ.@°˜}€h‚ 9dˆÊÌPÇXUH¼ˆŽO„øŽÅø_¤RaÞå%IFq)¨kä»Ë(¿ÞÐÂÛ€‘èÆQG ÉÞ>Pâ˜óTVÄøšƒLä`3ð3Iûtô–$®b>š«V½¡®wå)a9T)¬ìçXVÊ‹ŸD•Ñv”ñB)KÞoPb£(¨ ¢¶Äþ†$;ZðZ”Åäsˆ§ÿcj)Vl PM1Wš†2_Ëú–CÞ%ÏÞÇéÒS[ ÏkèAaœ¶>ƒ-tÐ8â$-ò%_„jŽÁDèáia©ª"²6ÂÈÚ¿ÚÅ;T\Μ‡“bæWSÙ|6TOƒ.Là ¥h(#NÊSËì¯KXaTîáxsãoÑYàTÏ:ÚPyZªl¶áçñ`—ýX”äça¦ Š)GDzŒ &§ý襗ìcš¬¢ƒ-Ã1AMX "‹#"¯(«+’PIoί©;†E…‹ ç’<ƒw(žb­C9…ºäú¤œqɹûA@»«ÐhQ ðÁ@¢4ü¹¼,GÉfíãîoßÜö@¯3^íüjæ×"‰;Ã|â+ôÀÐ,ºH^X¡–~ªOSw)˶3W`Ę̈å¡§THÍÍy—51B^N£D5@ù'h4ØÅ©Ã$Ð`Ä`˜ )Ýs1µPÏŒpm¢¦/#¼²@%×ôÎ^8GHܺ§ "¨nÕ63„CqøJ«Ü9*£~ÜMýâÌÚ–k»þšì'“¯u«<dä»/{‡€ó„Rp…¾ÕAjb˜˜Ýׄn9K¥sd~‚$"9x–I‚‘\½È ÿ)ÄÎõš P­fœSšÐ³’¯}?}ý:ú»÷ž×¹»yƒÞÌ–@WAe8a‰Bõ?¡*7” 8`…+%˜YM4ˆùL¥e“ÓåÍ ²‰w''cI- <;Œ‡å«±qþN_8èQs„:È °‚ýôt8Ä*‘±aaÂÍ_ÄèÑïç$½“ÿˆx,ÇýË\ãX¤l…Ñâ)I2ìKfR>cg÷ \­Wç—B/Þ9NÙtWÈö`)œHÁr_ù x§Òg =@BE¯Sí tZƒ¡€1¦ÁÐiß1gÁ«£úëj· Â+ØåmŒÔ¯ žãsHñ°‹¢Œ~J¢•ä°ß*ÙÜ]‹  êÛî¾¢ôw¿æƒË—[i[lW?|ª·œcAÃ'31¬è$ ‚wRß;/5¦¨@«`&°Z¼)”õ$L¼t³¯ß¦o0®²?Û—@à1.î–ö:à?A€‰ ëõÈÃI¶÷&#LV¼Af#{’†Nø˜B9ðÜÁø+¨ë Þˆ7>.Yþä¬n—ÔRö}% ›-Xt‰ ÀE—©…ŠX’Ù]-Q •íë'g®~º™ZäûÒ¿I˜ó[s’(ÝŠÕÇø—>§_¦"¹å9Klûûxü=w¶Gì´ÈiÌIºÙïÐnßhcõt¡íA•r1þ”);攽d°yN?ì>ð$ÔH’Na¤;¢ŒH²LWúÿ €ô¦† Î$ÒоÆt7qu^Š¡úXŠj5û¨ö‡l§Í¼âÝÈS,äÚIæ@¢fr§T}×V_i†u†1“ô.9X(wìá).Õ˜»$(rJMéÇÇän^"÷r)çK*#¤ù[ðy$,S©œvG'óì!¬6Éw§ç¦˜" H’š–9¬€iý»>àVyrhrDâh’í‘ÜÀAváIS’‡5Ä´Jx0ÄóbåÀu'àÕ8‘dYËyqóó RYì#Ö®îèÉ€Õl×3¡ÁV.ÐÎŽO!0Ú`APë`•$éãPµ_Q©Õ/‡~ÔƒñÉèªO;’ÈŸçØ Z復œb½.ùÚ-ìe¼Ü·¦v®˜7ÙÕy° ja qˆ"ïŽ&÷ éuò@ÛJ!!𻇕8) SOï‘Ñæ¥L†z‚rjЇ#^åR¥”LH“àþV {ÐUX2b®;èwY L2V2†C•”:0¸Ñ$›Ž<ÑÙTôl oìDÛ\å<¯sÎŽZñÅìR³ËÞháèÞ<ÂÏžxÜ„ÍÊb—ó^ÌtðQ% Ò¹ÔÖ—€8Ë:¼7dYâò³Éù“«¾lÓäš2¬Xú»‡ªüc\€n¦bšìҾéŽ3K¹Ûšp }gØW7¥$™gñ’hÉ¿ƒ‘˜[–ÓJ¾~"/˜6©ö*¿jqK’GEDqFÑý¤D=cßøD‘JV!½î Òár„l„·R9 Ù©Z€fC_¹T_i_‹0…Ã,”#à~ªU3‰j€·q„å¢lÌ¢ŠB»œ$ù©áS™][|ñ#ê®ÏÀD¦-G$:D%[»^ò±@¹´¹Ìt'Pî€F.j5à™ãj@§ â^ÅR»ƒ4õêÉ©bƒ),ÂÛd‡—< [K’­|%Y—úD–ÑÛœÇË)±î=;÷Ãmp³¹”:…|ÚyÂs;æ‚öö­"µ—MR¼)½ à „ó¬ÍUHP¾æˆ€ˆ}BÙ%þ€Ös]cÕ_˜¸|"¢´BQßÌÀÐ-¦Xë“£’j5ɪ…y)¾v5KuI¡ÙÇê°¹d.R°F@ÈäCÉ?¶âè&JþÝlÑm«¶Ãi+uãF'åô—]Âqõ8ü‘§Õ&8M¶^‡‚(s`@(qpB•UZäOeñȶt’ûžÞA˜ƒÐ'Q [Fý™?<Ôd¼¸R ¯B^èÀTúêaOé öVn>„#HˆÉ£MP„žïe,3,Z^ Áà f–%ã˜feÏ'ƒµÎ–»êÛUÌq$ÀÈãæQÞe¬¼€…À¸ªˆ=dS(¼ÏÌc|2=H‡#’ UG&Q¢ Å\ïÐ)³Wb¥ .Órº!Q[Ö+&¡E–`)ù;q™˜Ëá_€Šû”ÓœCíü`ÍÕf Rd7å}ÕjVGDGãê*qÚm~ÞЛö?ò”¶âWy5sŠ@¤•?¼€&æW¹¸¡Î¯g¼Ø.1¤dåââŒNÄóIñàÀ¶K’ÍC>'ô7ÕÝ0Ng”ã?ÿ1;¸’½TI4ƒ©!‹ð¯RT5ui«2 ²áªcb)‘ÏžÈYù™š õÅqÛ¨g$Cýœ}éœåðv¼Rs¼(—É%ÏÝÔ‰°IÓ·.®¦PE²µ7Y Í?=<€ä*’ ñUòöÐ{c/…ɽ!Odˆ’PÔÏÝ]}}^ik‹X;&)’•ÆI’n4!% `Ø^Rض±ä`«Î$oA‰ŽÕJ.wŸ\3ÆæPï k²Pº–ǘädh†Þ‰«?Î-ʺ4öp…y;z‘(//F“XBÎd$õ/!ïÁ:‹?H#ŠÐ §3vIýéÏ sçw  K’-!I¤üÖ, Ãt¶#yÀû l$둦²Í2N †.WhÈGõ9xr¬¦—ì¹]N—Á†lQ@ßTÁ””N®3â+¢³’ù¡HÌÎ$Õ£°Öe:ºÉ±å&á}X*»Ú.³a:yRž-›¹§½j-h»<68üZIl¦øLÖí J êû! õ6¶Ózüà¬w92H©3$ýðó»üµHä]––GWУÒD–*w`oáðÁ¯L–8ºõqá!£ææþ‡“´D.’Î$ vl’Ë¡œÁo#Ë ŽéR#õ ’öìØòö‘ÖÊ¿L9YfL¬ q¼ðåRúºS1‹\ðêÃZ5^É3¤RR’qˆï®! Û‡o²4â YR hÎäN;àlÁAOãÀŒÊ$G—öÃ; a5¨QZèMÜÁ ‘g_ª<•ÈØÝø·’=ßÇú‹|˜y±ãÛÃû}Ul‘xj‡µî\÷M4ÝÑYr` ³WŸ lÆ= {„YÉ©ÅÄ?§AB)…žXÎS:îlÇ•Yž.ÊŒxPuÑ®£r!ŽØx CYìP¼$P4Ω!‹/Kl5ÇScøB¢,JÆí‰ŒÐ£<‰n ’‡à3ËØ¯cïfŸ Jw“C8 {ºP3Ió„ÉõÊÇÂÓ Z3Ñ©«.[­Ô?QÊÑ º{öû1œH.¬¶€¤õ¨ö}N÷rJ”$îíÏ÷äÖÝÅMª„âè—ƒŽP— ©Ngí2E<¸êKU¯Hu>°Ãš, N-‹ ƒ‰sCÇå^؈#—­J?Ê=<²—S9ÎfˆxïT’ ˆ'!½¡»‚|Ä”‚‡€E¬•Uzš¿bx~ÊŽú‘ÝxÐ×ĸ§üæÑIÉ«ëÖ ¡ô6P)“.‡OóyèŽÀ4ÍÓ7Qå…ÛO^—”ԥ¿ÞEu¸ÐSg“ã®õw9 xÚ¯›î Ì'ƒ¸”¹õ2²ø–h9(7ö_Þâÿ‘ ú,ùàþáßÝ&edáC |GÐ Fóêòåô">^óT!PÞAÜ4ÿñFS|Þ¬í’èO¼éÎú€ áµa~àÊä —©B:Z{ÒÜ:»¸u'ß@YGÓÍ×Úïì†gý­ˆÊÛía,èlRÎV¦'½½¬±Ñ#¡;h<*7·É[~óQ½z„­ƒ/KÌ.¦â63W˼àR=[vD?}ýs×5oÝå¥vnnw4l“ -­ömlàüßûò_ÿçÙ¾Çÿü×ÿ´Þÿõ%ºåû|ÀñÉÝÖ~ ÉKJw I—Àös³©t&ñb,Ð(¦w‚ý9iª”XûŠce º†¦ŸÂV k{.¡®Þý'é!ã[ê„ÿ æ$vÈ#•„mP{ú®š-Öôøù4Ed~Ó:îIWuë?§ÙŽ}þÕÏßêvËÏ•¤'/ºqˆ ,O]>wýU-¤ñ|˜Cð¥à-Tç4§âŸÉ£ømÿÛßæã·Ç4¯ÿÔ¾•ñò%ôF}ßù¥Ò-8o§ßÛø<‰ââ"µO•þܵàÔ±gÎfŸÎÑýGcG`’PA¨>Ê0¤à©ÄËÛ%°ÜÚ/ÖúCÓ+ÛØ¨”rkÏp¢‹¢÷µ•e¨Ã)×ÏEZÉ  )ÞÇm)3-8Ø“’í.R-)@}V²?D{åR¾qý–0ÕúÿM¼Z>É@IEND®B`‚opensurgsim-0.7.0/SurgSim/Testing/Data/Textures/wound_deformable.png000066400000000000000000065605571277777236100256700ustar00rootroot00000000000000‰PNG  IHDR=ÅDg pHYs  šœ OiCCPPhotoshop ICC profilexÚSgTSé=÷ÞôBKˆ€”KoR RB‹€‘&*! Jˆ!¡ÙQÁEEÈ ˆŽŽ€ŒQ, Š Øä!¢Žƒ£ˆŠÊûá{£kÖ¼÷æÍþµ×>ç¬ó³ÏÀ –H3Q5€ ©BàƒÇÄÆáä.@ $p³d!sý#ø~<<+"À¾xÓ ÀM›À0‡ÿêB™\€„Àt‘8K€@zŽB¦@F€˜&S `ËcbãP-`'æÓ€ø™{[”! ‘ eˆDh;¬ÏVŠEX0fKÄ9Ø-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+®ç*x™²<¹$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóýxήÎÎ6޶_-ê¿ÿ"bbãþåÏ«p@át~Ñþ,/³€;€mþ¢%îh^  u÷‹f²@µ éÚWópø~<ß5°j>{‘-¨]cöK'XtÀâ÷ò»oÁÔ(€hƒáÏwÿï?ýG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)¬‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(¼ AÈa!ÚˆbŠX#Ž™…ø!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fº‘;È2‚ü†¼G1”²Q=Ô µC¹¨7„F¢ Ðdt1š ›Ðr´=Œ6¡çЫhÚ>CÇ0Àè3Äl0.ÆÃB±8, “c˱"¬ «Æ°V¬»‰õcϱwEÀ 6wB aAHXLXNØH¨ $4Ú 7 „QÂ'"“¨K´&ºùÄb21‡XH,#Ö/{ˆCÄ7$‰C2'¹I±¤TÒÒFÒnR#é,©›4H#“ÉÚdk²9”, +È…ääÃä3ää!ò[ b@q¤øSâ(RÊjJåå4åe˜2AU£šRݨ¡T5ZB­¡¶R¯Q‡¨4uš9̓IK¥­¢•Óhh÷i¯ètºÝ•N—ÐWÒËéGè—èôw †ƒÇˆg(›gw¯˜L¦Ó‹ÇT071ë˜ç™™oUX*¶*|‘Ê •J•&•*/T©ª¦ªÞª UóUËT©^S}®FU3Sã© Ô–«UªPëSSg©;¨‡ªg¨oT?¤~Yý‰YÃLÃOC¤Q ±_ã¼Æ c³x,!k «†u5Ä&±ÍÙ|v*»˜ý»‹=ª©¡9C3J3W³Ró”f?ã˜qøœtN ç(§—ó~ŠÞï)â)¦4L¹1e\kª–—–X«H«Q«Gë½6®í§¦½E»YûAÇJ'\'GgÎçSÙSݧ §M=:õ®.ªk¥¡»Dw¿n§î˜ž¾^€žLo§Þy½çú}/ýTýmú§õG X³ $Û Î<Å5qo</ÇÛñQC]Ã@C¥a•a—á„‘¹Ñ<£ÕFFŒiÆ\ã$ãmÆmÆ£&&!&KMêMîšRM¹¦)¦;L;LÇÍÌÍ¢ÍÖ™5›=1×2ç›ç›×›ß·`ZxZ,¶¨¶¸eI²äZ¦Yî¶¼n…Z9Y¥XUZ]³F­­%Ö»­»§§¹N“N«žÖgðñ¶É¶©·°åØÛ®¶m¶}agbg·Å®Ã“}º}ý= ‡Ù«Z~s´r:V:ޚΜî?}Åô–é/gXÏÏØ3ã¶Ë)ÄiS›ÓGgg¹sƒóˆ‹‰K‚Ë.—>.›ÆÝȽäJtõq]ázÒõ›³›Âí¨Û¯î6îiî‡ÜŸÌ4Ÿ)žY3sÐÃÈCàQåÑ? Ÿ•0k߬~OCOgµç#/c/‘W­×°·¥wª÷aï>ö>rŸã>ã<7Þ2ÞY_Ì7À·È·ËOÃož_…ßC#ÿdÿzÿѧ€%g‰A[ûøz|!¿Ž?:Ûeö²ÙíAŒ ¹AA‚­‚åÁ­!hÈì­!÷ç˜Î‘Îi…P~èÖÐaæa‹Ã~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DÞ›g1O9¯-J5*>ª.j<Ú7º4º?Æ.fYÌÕXXIlK9.*®6nl¾ßüíó‡ââ ã{˜/È]py¡ÎÂô…§©.,:–@LˆN8”ðA*¨Œ%òw%Ž yÂÂg"/Ñ6шØC\*NòH*Mz’쑼5y$Å3¥,幄'©¼L LÝ›:žšv m2=:½1ƒ’‘qBª!M“¶gêgæfvˬe…²þÅn‹·/•Ék³¬Y- ¶B¦èTZ(×*²geWf¿Í‰Ê9–«ž+Íí̳ÊÛ7œïŸÿíÂá’¶¥†KW-X潬j9²‰Š®Û—Ø(Üxå‡oÊ¿™Ü”´©«Ä¹dÏfÒféæÞ-ž[–ª—æ—n ÙÚ´ ßV´íõöEÛ/—Í(Û»ƒ¶C¹£¿<¸¼e§ÉÎÍ;?T¤TôTúT6îÒݵa×ønÑî{¼ö4ìÕÛ[¼÷ý>ɾÛUUMÕfÕeûIû³÷?®‰ªéø–ûm]­NmqíÇÒý#¶×¹ÔÕÒ=TRÖ+ëGǾþïw- 6 UœÆâ#pDyäé÷ ß÷ :ÚvŒ{¬áÓvg/jBšòšF›Sšû[b[ºOÌ>ÑÖêÞzüGÛœ499â?rýéü§CÏdÏ&žþ¢þË®/~øÕë×Îјѡ—ò—“¿m|¥ýêÀë¯ÛÆÂƾÉx31^ôVûíÁwÜwï£ßOä| (ÿhù±õSЧû“““ÿ˜óüc3-Û cHRMz%€ƒùÿ€éu0ê`:˜o’_ÅFÖšIDATxÚìýK–$I²,ˆ1‰E½nôÃ&°:¬ pNôM! T>ÄQSóðˆüTÚ­[•án¦¦*ÂÂLLL„ÿ×ÿóÿafF’fF3tÒôEÚõ'€ÁÌÌ`óŸæ\ÿëÿÕ½‡üÓþM`ýWøyñë_Öç]máaãú0þr]ö`þ;ö7Âù¢ãwÝWˆt'æ W„ï‰òÝ×/§{2¯r+Æ…¿x’ëÖä›3.?Ü÷µŠïMÆ+ž±æ]`‡×S“»ç~^8ÓÓ€,ÿL!ï•nðþqÊó³â¡Æ/~óE åRùìU¼|–‡Ÿß \=lßýâ«åkM?Æ}£¨‹hü¥¾Ü]®å4/}}„û„ë âí %ýÚu×:VÑü[®÷¤ÅÕ|´qi×ÿT—5>n~[úqÝÕzÅÓúüh¤Úç6æ¼"VÛëú º½©«ú´×óÁ¸“˜7E†±Ázïffì¤áúøq ã·Ãƒ |ø¨Ý¦Ñ7Ÿ¶¹Oç'Û€sIqŸ=²„æ%غ‡ýþ{®ÒÒæûÑ|´‚ýMÄ>w eí`_ÎJx(Ña…Äù·@ÐÚõ”SHï0b„$ª¬ÍŸÌÜÛ%4³CD ‡‹þë|?æmëNç6£ŒËÚÆsŸß\Dzù£ÿA’}ÝkÎ_š[o¾g_·ôº?Í`ÍÿÈÜ?<~Ç|°‡o¥§œ¦¸áÀZ'?Ƈv—h¹ÕʪEJ+ ³žÏŽCÜ8‚ª“ïPݶóy±BVÚW4ê\ÛSóP®U:û*:Ù®/°²ÀH¬ÀëÙ“½Ó…÷}Üù8ß$­5X¼.@Àü…ÃÈñ€ôi­ÛP=†oÇ·¬kpîr#ÉnýúÚ­¡m'hòðÜÂw£µv}—6Ïù¶öÒu.íHQ”9áß1WSÁXQk—âÑDýÚ³z î@Ê´¶¡™KEÇ’[[d¾ºü3k€µñº®jÎ÷Qó¬7ï×-ïRýu€†kw¶”u¨Ôpä¾—ùÈëi6wÇõj†¦ø’Œ±–,uIÔúìGQ3‡B²Jªýº¢‹9.™ ÿH´-*CB-‰­½ûôµ•žï”UÁ\.Ö|ÉFI€PŸbƒÝŒìW:@öÑ%‹ÛAØÕ©óÊv*”‚y‘8iÖµÎõ{ m@8é*³ø,±^«Xg'ŠTË- hE¥…˜dé#Ú¨Ï)íŸÉÒÈ_æWÛoL¦¬Òå—Öý] '@{ZÓ•ÇÀ•]!Uð ‰zLÀöÝžyi‚sP§ t/ók~ƶk®o<²%Ckm>Ûð¥Ø‹úÈÕ4ï `Ë4åÜ\¹û¼Ÿ-†ÐÑ™Ë!õÆ`?èWÛxW½óMöŸ+7ÎT”ˆe«;†|gÆhºhç³ ÔO®t¢Ï-(aã!¬öqRIñ 4´‘d̪S÷R]zøþïÜ&ÚÇoï½³÷u´h­½Ú«¡ýøñãõzµÖ®¸>ÛÅ:fˆ ’cmÏOa}™BIŽHò8ï×M²cÚ -Æ–átûŸÿYBd‘À§=òx;7fA…–å‹ŸŽ¬k)Í’ÉKŽû>­³ ¡µÖ^¯×ëõj¯öz½°—Š"ûÁt0þúKŽå$ïG€Va'@Æ¥lů:"<“âq!&U+Ê”·¬¾LÿJ… áò"#yÓ(áÓ"Ã(`ÿ €r‘uݘLfèJ¾»OÇ…;Oo0‡üøèÁ¼Û@ø ‡hÁºi¤‰÷«ô+ €wp˜•Oã‹ €÷ㆺdëc±¿*øeìQØç|ZcÞõ×CofÌffD¢Y2ž5rX# ‘-U)À…n@›ZŒ_…3Î"ôåù4W1|P,7äîœ.õÚK0˜5kë ¦‚06kf4¶q‘œ©vë+ºëF]¨"Ûì<~å¢p•·ë ¾ËÆ=„<úA½»q\™o‡{1?FJÂ_fJ w6é18¦Ic# Øúxe¨ñ¹i„|uŠB1ªÙzîŒ <Ër™1óéÕàô®ÿÝ´ãÑîblίôw÷,\V ¹x&ËäjŠQtâ̆SÓp€Y»…q}‰+Â-Ç4 hŒmÒpeú]j$×›=’½+L,˜¸­.€ÔÒ =ôÈcVTÚÿŸÈfÕ‡ºÁðâql¹:.„++àWK¢ (Ä k@¾ ÉÖÁvE#ƒÀ/hÍrÒS±uG÷æ,u îûÚ!G…ñjÙ6ùÊóš|j Àå‰A¡0 H–ó&•½`s¿eˆ`D›ËËø_p·™m¹@z¨¦va=~¸—/ÉÖ}¥k¾û¤ †™Ú$}‰¦Ûó€Š,n£7.›*ƒHBK$†Ì#ƒ#¥\Y¦´²ªW]Žâ¯qlMvv#ÿè®Î™S[ -Ì™Ç`²cÞbüÍ<|_®‚(?!¹oW@Æÿ  ³'ð »§ÎcW&à*Ð+wè,[M¤ ]>7!256]DO €ÔÕ`”†[¹Nvz7\‹c£òí 'îÄælˆ÷Rç#ÂÂ;GèZ wÚAá.&"¤»-©a ߤàÎ>.¤;BÌ›ÆÌÆ S*y¢6Ämæ ×ÁÓ¡!©ûj®;°§PX€q8) ˆw¡²eÎ ²c•Dúƒ¤öãZÁf–•—šw.<ônÚ9Zm‰ûJ© 1Ýô û¿þgwž¼Zk¯×öúñãÇëÇë_¯”¬f¡@=\ë«/xûp"¬2|/øêHc‚(¹Ùë,Ɉ׷œ%¬÷ÿùÿýOÿ¿þçê/¢Í¼c×'ð¬ÎÒÁ¬qäœÏÙb¿¦´ë%õÑŒˆ˜q©ä•Érbjf£W» s´…ÝÌš? g[`ò@¹"?$4Ûzãójx½ÈœMØO%_^SÙÀ(ßÐ`°Vv”ýªËx_…7°xˆAÁk¨X6¡Ûqsp?Y)ð¸ºZ‚7¤¬Bbc·¢žˆ½&²wyvþ*FÔÌ83k”®™›î·”EÐèÂ,ÒzµÕ{¨öÍOÌŒØ^Á]‡Å-÷œØ³n½í UM–¢õ Ek·©” âùo⯪ݹ÷;ª³_ý|Ü~Cìê 7ZCó)œ|Þ¢kgu£xºšç.ÄÄ æbäít~3ë'BqÅøk üX¨âuq³Ð¯ØÙÀµ ÷:—tÌösÑü0nüUJ ÅŠÛL€ÅzÄÎÜ›£$ÌØÞûx‚/Oƒl¡º*]´qº-¦Â EÂ%.¶³¦ÊÞMM6®½^LR¸n¡ç^À¬Œ%(•¦ÑW»ô\ž]4@ˆ!~G´ñM°‡BÌwh¬ŽûÜqm%úu.Q¾#†Ô)E(ÓÀ´ã°—J{¦;/æ³¹vŠÒ ORNP §ƒÑÚ$”Ì OĆ×6½€¯›ï*ÙG½1’8ÐÛ5±“ &gŸ}¬ÚÛ×û÷Þ»qG0´´«@kMXý{ª:!%ÝÉìõµ²B0ÖÍ9‚ €|Ž·Ý€……)IHÇ6ÍìÒExAƒÞ;kl}SIÆi++׋Å{€Åüø…Çó|3 C!ëOf7Z„¸vÆžÎÑ{/Ð.ÒfàYàÖ™m`Ú+’ªˆkæbs…VŸRÙ‘ÊMÂë8]8{\ ±/—,‡]˜Œ^sf—AÒRÿsœ“œ`pÍØ›LÖ…\h•ˆ«¯˜ë!(dõ…¨ÌÁ~ç¹ÉÝ.ˆÿ2G›,!·C›c1ühÖ~ü§ý¯ÿüïÿ÷ÿc 1ìÍŽŒ„¶yá¯Wk­½Z{½šËJÖ‚‰_'‚&mV[QJ˜·1W³—ƒiW5¬±+ z~›™üCO,CwJJCÙÆdHï¾Y"=“1A2 §Ò7mfù‚œ,B÷\W±@(=³ÌQ‚¿Úˆ|`&f5ÒÁwÛ@`©A“5¬@åYç© ”s|©à*ÁÐø„¨Í©ÉYæTlD&L=C‘87XÕÉi€·­bEÖR€Ú2›Hq›óˆEÀ?•@ÀiÀ7VÃû €yï6<éYøf7à&Á%@»ïßâ]2æa#\»‹FZ—à¥Ëlµ¬bš~±P¦Çg. O €)*øUrEÓ¿§•æSiãYKå¿m(9ç>ž¸›¯EÝ7q¾õzµ¤£?cV4Pm4(å:Ê@NxüQgOV{}¾öÀ^íõz½~¼~üç?ÿùñãÇ50yUU ŸÝÉgIàænìö¤à”K²PÉþôM¨oíÿûÿþÿü_ÿçÿÙÁ‰¹X˜ŠUðšë½þ‹\æ¾{[p­ëic*:Žòïr›—~Ã&U\›v ›¶k<¶W¿!±ÀéãçC€dÇ5b0ÀaûÁN˜±^ÕDzUŸ+oÊŒ0 4LÁƒ‚ïffaYûùœßq0-”rpÚaÿõp[¼m—ÒN]U¦E__gzzìd¤@S½bjªOì}ÊÍ;á4õHC7…ZVL(Þq<’*à w=yò$ŠäßGRƽ•þz†´Ï&‚¸ëÈã¶qüBö&g‰ €Å{Ù,¶{ÂDì^‹º7á(Ý‹Å;g,Às¥«ð“ì*E›1kâc<Ô´ˆ––I‹†aNýcðéa㆙ÙK2é0છ·>µd»JA¦EÕhi\ígÂ÷¨Ö bÅàœ£ïýÊoóPÐÕQ¸ˆ§ÜÓ•¹ +ñZµx•÷êî® {N“?¸$Ñ¢ªÙNX™ >‡jËp6ŒÌ­høt–92Kße“ÑMÜý¦¦«˜»Ô­⤜Vi¬1ï‰"m™gŽD\E=]=<¦¾ç5Æà œ2 ñ•ƒ€»[²KÙÌï]4Êp¹b:}¹ÐP:Ho¿à×ÙØ¸2­p5ºzwüÃ^AâBý_­ÙìhTYj#Qr¡¸5¿|î;sÁXÉ»T•¸‚9ayÔÁs‡Oo:¾K‘2¢òc}®ßfÆ{ï9¨6ésãÖ¼ªôÍÍä@ÈÈ~°üLz-ÀÊh÷v£€Xz5Orh\ ?HeièÆœU'/ ¸wàZð X:d –k vs3ý¾0ß„CÄì¤I¿XÑ~;]yc‡=ZûœÔk+mÍï­_a‰$]ÚÇõ‹šR€¬;ÓºíöoUµoÚ“:ÑP »Å!£)~R™K g«þõãõ¿^ÿù?þo{KÒM$€…æŽåºlÉá}k/°”‘Ií‚5GáôÂ@©r3‘}ŒÉJŸ]“óK<¾êXÿþÚ˜Aƒ—Èä¨=¾1ŸbŸð¿œP*Üì¢Ï=Ô6ø×åì®|˜¦ý ¸cCȾ Ax,Ì¥›p]æ|lÚ»„ªªC‹·aÑéã¡D*3“Ü@{_æNÚ»¯Ì·÷ e›oÕ(ÉäócnqÎâk/L¨46¾øv‡;ÆØ‘ÂñDWñ£oæ¯97¦ê+2cÉpd®»y\C0<ºîÀEŽšRoËhW›K {Çm åts“QÂuCºÓ"0Ú|»1pû矮>Ö1†UÔb«*$ê[ðGÙG€"¿TÜê4ÐÁŸÜ°Ï÷Á©p¼m6” =vùöI­_±Äê¸>¡¼+èÍ«yŽÕè­5©ƒ7½ØÃ~p È|³}jÞØm³í¨ú¯OíÇÿöö?°wå5µ¦ˆš|Nìyô˜9^‚m(ê\šÌrvvL‰Ãòþ›YÛ*µ³.BÃë⌴†×Õ"i+T°nNeÍÍF›’OÐÿøƒ†ëO§ÐԳť/Ô`h”Ö¡ b¼kß4ö;¥ªNz‡¿Ôзê›ò.»%‡— €#vË»˜+Ú9•⛩T¸_JW׫nTšûÏÅ@2Ñw7'cYq§‹1ùGžý™ŸMû PÍï?m<ÑFÏlP¼W¼þJ TË+ÞRÉz»çœ+/‰i–4€{¾{Q&ó¬ ¶²á}`1š_­ gœ¤¡3& :™ (éÝ^°?8ÉÀëßÇv´<æâçÀÞaN§>D³Ù?˜ $;kôiÁõ»/[“ì ›Ö6¢/n }Tì¼`‰AÀÅ)à`­‰æ³Ó¬Ó<:~®ä/ó4Š~ôMF¹îÆl¨PP¿ã˜§m¥ãX Ín\=}Ôûž¶Im$æ»Öîy« ×z黚…©CprO®…TÅÁ¶¤˜±ý øZï¯~áJÖÛÀ7j9 ‰Ö¾eë„‘Íz7³Ö†,£]€ÖÌ+¸ø+ü9sÚQn°æõ×#‡¿52F®'ÿÝ@yŠmî%0š‹ /›l:åÙ‘kÿO”sGýÔ«a¢Ô,HHàñQWÉp (ö2A7 tã5ÕT}òÄÌþ^᪦T§°XJ%mc:‚®Ä’|ÏA/ÍÝóíÐè{*‚Ò£TªCÓ?“æ\Ü:{ÔNÜœ§2’li¼ÖWiЄ䈇ϔž  ¬ì‹¹tŸ6±\H2®:„{Ú ¯Wkh—TSk?þ÷ÿuͤJÏívÇ àƒ·æùÞ3ZÇß*½tL¢Wå•)åÿæ±ù”ÇÖ(jÜnõqZQ(ÿa‘×r«ž¹a:›(Ji$|\kLÇ{=ì} ª:…G3‚îqDÞËÙµ©B±XŠº"YŸ\qGDXxc9,·IÕ¸#‚DV¾ÎƒÉ© Ùan3î‰x81>ÞÁAœƒÖ‚J5­  CÛn#è¬hvëçûjbà ȵΙÛþÛ<û=’g›[í‚%\À‚ï+ï@²ŽK`‡qœ…¶ß ÜÜ.ô Æ©ŠóvÎYStBRßJRé|gž·À!ºì8™Ç23a& ê°z¶Äñª ²s×Jt¾ZH[+©Â…áävC5MuÒ[‡âþ¾`xµ×þc“£`ŽºóL0¦©2NÇjž>B¿høY“MÈN½;û¹¡tÑìÕìõºjN›ãA¶)€r*.&ÇôèìÝþǺ}2h?VPB^híu À©*í¸9‚è}=K>8ÊÖÿ·¡8ÔŠš_­ÌÙ³8.ŠN*5ÆÄƒvús÷µl¥½M2Ò'Jödàhõ©À;y;ï®saWÇ@ôœeÙoÄhܳñRןFĈ‹%@§ÝÊBwßÎFÊç8M³3w>MHfÙbß½J¸£óG™Âòª_\‚?xïvõ®iTO>@LçÂUDg ¦Ïwêá ¢™¸_­Œ½yü:((*ö*~¿TKÞceÓÆdsTeyJ§] Ýåœ2Àp*«ýâ‰$Œxåéç,©;ƒ‹¶Pu™ÈïÝ?1 µ–ëzçf® ¸ÙÝÞŽ2¦á¶ ZÈÅ¥8›Ü­¹ªòj™š9Õ¶K 榢Ák·l£BŸmmP¾*ópdÌ1ñ€ò²¥€Ée½–²åp%ˆ9Gè1è64´£a U ÕΩÎÄ]ŒÃù^œC3a¹šQDn<ŠÙ7Y¹ Š¹|PàQâ¥y®Ã^2P0¹eK÷N bµiBu)ð‚· êNò Ãg™R–ŒhRô>`P 1E[·l$­ý1–F£­§4Um/:‡í4‰$ôÞÉãâÿ·¦’·‰Ú@n8­dí yÈ@ŽÓèÝòQ…Dš“ÚÅ,ÛØ$9BÏ ßËsF ¼#”’föú£_çNÓÃÍ5µŒ ǦEI+ãŠâ}„-xE c¿ú iÐ~‹µÎ÷lÚó¬ÆZ/1‘n5!¯’ÿ# ‹Ø ˜ºÏ- OHÇv3æ–u ˆbˆ-"_º–|ÉFX{òPD!›k—ä\œJé“•?ÅÜw` ‘ãš^Xû‡KÜ›÷îgäôá:»iÈ׎&Ó°hHú 4Khðº{`¯×ëÇëõ¿ÿo¾ëÆsL¨çͰÐ%ÓÁEL]|˜ñ‘ÐdÞõx!|ô¿Ò6H mhþ.,™ïÑPX×q {¹–Œ")8&V>—b à¢éS vÜ7åÚrA%Û݆»c;ŠHI|˜½E‹þûÝO&Ýçç,§‡5AZáád(è=íª8¾8ðg¼”éÙ!ÁQñdEð¡Í›Lüü˱ÏÏ çvàË7ÎOØ­„?`™ól¯ o~æþ9üüÀ£ç%£a&xï¹û°íæP{b²˜™À¯ ÀóãŸJþꄸ(EMÚ#Ú³n¢?ŸãŸÏ´üÌ>ˆ €/n礜&/Uª²<÷q°ZL…ÞÝšo›ÝÊM[Sü¿ïK•â,ÇFüÌÂÚ}ÓŽ µ DMÏMdk?.ý… $+“šèb`2G:´«2™Øygï¤áðl-_†Î‹¸¹Î¨!} ^¿ÚPJzý®iíe¢ï2;mÝú5L@öÖÿøc<ÝÖAà#ðƒ/e´Æ”ZãH{/橎œ_ åvYàØÈË”|7Wo3<ìÖ «R0ÞÂYøâØÌ ƒÜ¶üI™Þ ßN?5d= {®EÚàŲ µV–OÝW£ZÙùE¶¶‘»¸¨Ö|Tú³Bå&±|Ñö“„uŸÿû×ùÑŽJ^‰Âp1å;”©Ò-ñÿ†£ b¨§ÛP~A5}Fr‰<ÜBøã‡¡t…ã9*T: Ékmâ™mÚ_qöœ§¥M‹ê³ÕGl¡öÚ¬É-‰°ühS§ê ³8Ód+†9bñrLIaT›ŸK5«AqWk Lºò8¯:; ³¿¼]DÜdšÑ¤½<úIµ -‹}Ó-ׯŒæCR ×ÙEVtƒÊ!lD2U4hIÑ›@t¦¦ÊÉ<«D—Q…|"¤u Iuvb7¿œ3­â¹GØÉ PØdÏC7ðজвi ¤?ÒäD‚Ð*öÓeYpN9L2¡štR—|1«»h®4¥0Y4´¬ óœõKxÛ â@sŒô %pmÐ8€=À>ÛÙÐÀÔ¦ %û¥iCÀþ°n0³Z{µ××(&¶ütËñ1Ù‘Pbÿ@3Ö­[ÂÙUé)”ç o}¸{õŪÐÞªÁqÇò˜¹ Žá ¶6:^2°£_-iž¸ÞÆð¦¦º¶æƒ‰ÎVu󞔦?xÍ<qóÝCÅžÂnâŸN+·ˆ[÷ö³^ÃfüfïœüP3 3ÜÎñÝ¡ít,—nÁækõ°›ýZ²ù5|1‘ÒË£ë=ä%7;+ ÍÄâz§SƒÄ÷2ëæÕÔ^뀓º‰j†¸îÚëÜÝj8z?–Y¼„Û«·?™öµ—%É2þ_Ò¥om³WqôŸÿ¸,FœùFrëc @NêYéŒaÅ6m®Kh‡Ñièðâ]ÙÂÃVát»ÚWšãv°¾Ó™? ý‡ðdj©öd˜Ú’.î)g¶B&6ÌéV­(«¹É=“Kª=úS!öküñ@äINvOÞSðp-|ÛðmwxWâ,‰c)ìµñ™Â§Z$g«O±fвÃéʾ5¾åã,›y,8üi}&"]˜<-è­?Ùùøòï bL…ÙÖ³'±œ²Û•¸SŒ$Pax܉LŸúå–a¡¬„ª³û‹äq*1±”Öˆ˜m-çß–EöeQûQw–ÍÓï~f|Ðuóàr`…‡Íx¿©ƒÖÈ9½´“’÷Wrqßs¾–E  6ÄZ6–è¼oƒ¥7ߪgÝ7ûJpµ4t¸¢Y{µå²+Ïcú-š›ت@£VÚ»kå«msy}]u$ä¦ñ¾Ô,ŒmÿÁ‹ ÑûsÑ7{™½^íÀ5ŒŠ5†>ìž6TÞÙ/$ã?ÁâÕðǨoÈþÄÑ5rkxµí4ìÚãˆ@„Œ]ÏJ2ª[¨ Š?· €'Xé©Ã!þk 6 ã)mÊ €šãöI- 2øS5P52"ì“HÆž@Mó zFÝ5ŠŽÊûÖÅ0Tr^¿oÔÀ}Üø°%»èø¤àþÓµ÷ 3ïko©³ÝdÐ{ÃM3¼8¥XÖEvrê–µAÒ3ÙFììZÉ(s°Ý7ê8…Ùõ£ø5g­´@Ü­ß7SÌv‰ðLÅÈ0ÖiÚk†ºT®«ù¥!J÷­m1>n žK°Tô ð…âÎñ;\]Æ!€J~½O9û™J´IŸGK©±?¾-™°Ç&M˜X0ŸÎÒñ<ëmBÀ–¶1 }з¥ºáQ¶ íõF\9;Ÿ2¯^7„ny=^ä)ûƒò½´‹X@%7cÕgOÓʃ[k±Ï-ÜüÊEp˜YÁ‡ÆOG³>M¶B›]íIJ3êKï&ÓpBPkØA4#0G¦ÿòÌVû5´Ô¥™´HB o¯éÍ|y'æYBh?^x½æbj'<¨Õ xÅnmŠ\x'ÈfÑ6&6rÀ?ÀÿF›Í>ÈÒYË+º¸¢QyˆÛ×p+-iÛ'Bo›²'Áq<âqÆ<­´Ö^s —ç(†šš!$1棫 36ù7L¹s Dƒk'ß&"åã &|¾úôñR~Ë%2³5õBš¸>²ï`²Ïæö˜Ç¥Ÿä0'ﳋúêts‰tn³†q|¶]ßr¶§¯ù5{e k—Ž@ qaèÎäÂfÆ8)ý-š“S.;Iø¶ò @ ƒ¬IëÓ^×YÑÚ×þ:S+™³WCbŒ¹m™jiC³oQ;)ɰ(fù=À‚D'Í*ªjËh Ñ@…ºpv/9Í_¹3ÀÿìFß#“Ð[I¹éÑWY;šØ½]ÚCY6´ ¬Çn 6o'ìt¯V‘m¼&R„ôè³8=3ÁÂ•Š¥S;Ãáæ,1kp›Cfö¥¬ak\™Î”m}ë>3olÍ·„¶FSÊšS9Eãòâ`-6+ºÛ€ò*‘£ô…—©™ O1ÒèWKRï^µ§é|¶.¡àMmk—è;¥bó£g §Ï;ªæÍ¦8Òúü¶|‚­nÞ"GPw ¸m,§ØªIúd8Ç›rØ™âz~4R®:G¤Lâöä‚-80ÅöX^*q¾b7¯á‡zanËb<ìIˆ…Y+Ä쌮dõ8XÊ=å„zÎÁžÚ“-dž[ "¯­½n½'î®òn7û©í¸1PÜ¥Ò¯"7nH8й…·º:EØðβH–Ñ÷R±$› u“ŸïB>”î³K7ŽÑõÝ€Ášu³×5”éª<ÄÉÛ 7äqºNÆúñömÓ—Ñ!†;ô¬¯6U´w¸oóàx-ÀdÊMýXË©sK¨a6vDV?Á!‡°ÝgrØ.¡hîÀ02¸À¸Ý3à¯ÛõŽ"Œ0äÜò¸,‡( hKýgxÏ„C˜þ¤œHZI¹¡/¤éÇDÈu²pùoµ rÄÌÜ5€U!z›iE:ÉŒ)]+ />í\þ À‚©Ò„S0?Á™x‰Ž§É5u3ˆƒâ&./Ãj¯à5ö¢ œ<îE¦#ÎfƒÎ|Õß:ÓÒ»ÙÄÜõ ª6}?¤D¡ù@›ç—ÁÄI|ñM(J—˜¹1̈ŽnS½«Ä4—¼.gˆn«éhÄT»îlðzáÕ0=rÀª€Y-¡^ ä±Ï —ZOÜy}« ôõ Á#·Ø7ˆ5m6O>Sš ÞZs!0%6£.Û¬Þáá!tœ’XÝü¸9{ïàü1³>§\hÑÝÄŸû#ù;C`|Ë`G.´fm€ƒJ’ÀòسNÞNR¯%±|z €Ë«SF X)¥\Y2º†ŽÎ^°¶Ú×lμ.{C`_0ð‡ì$^´?Öð©-$JìƒWÜÄR•n«\±í‘¶·«R¶Œy’ßk/4éÍNØÍñO=c;p‚[ðû@m[ŠŒcu%éË¿â¤ám¯8çUùªÄ< ¼Y %ÓXJ –)þ zD8¶Qõ¦Ž5µŸ¤Ø£ÅJ.·jVÐöQ)L¢#6Œ Š }¨ÔÞaÙz gíª‹¡gÕ¸;„¯Ï T€«Íh2š\à÷•ËDÁÖIËÏIç÷%Ô¸9é?„± – õp̉Ã#Òt™™'ܪì çð°’“À6m=¿ ®:‘LŠ—ÜÞŸlG`v5°Æ ¤“m ûpƒWØ´€Ñ+ ;ŠÆ6WÏ…‹L ƒ \¦Rt&YŽØäÆ6z´8íÁ—qá÷`¦ èĤºíྣ-”@ &~Æ*2kž?A¨Í5¯c—k"X2š& ëúøi"º»dÌŽŽv!Í^/ë4õ¿\nIÅÂ<Íê+l)èoÜæ¨÷—×½ÄRvë$8o¯%·ø4S¢Ù|²ªc‘dYüS AlFÎܧ´z,Üèþâ2se¸`€‹VÛßë×v0ûr È˜h‰Ûø(¶kY~ÃŒ¥þ n½_C3˜tè Ø3´K–ÑZSáº`d+ÇÁuGZYÀ»úÆ©”(—ZJ²?š-ëko5¼Ó ®Íÿ4Ù/$”›{Uthpv„iã”` vÎí1ªØUê!!fpô_¼»d†³#劧yFÆXˆÂS¸r&Š•ý.í°Øq´Ëü^%­5ƒí=§sz}`_ûZg®Ý7ô!íœ-N·ÕÁ1:¹£a>UGƒ­ÓÜyôºçÆk7í ç’æò)îÜ‹ìï„‹ÂLG@3øeP†ŽÖ0L‡ƒãK¬Q—UŠ•i´cÏ;k+ÌEöDõ‹@'6ä¸ Å͵Xº瞘Ÿ,Ô¿„þïþ]Ýÿê:ï[5ê“ IagûF…ü$XŸÁþî÷ØÓŸù*XÛ^íK˜ó[4›?݈µyuÊÇGðæÙ --u~åë3µ(H+i>n*à;×ÁÎ^Â4_½ý²ÅÚç»:Q ùðXùÆ'ëÙ®Þ=+ ç #ýóO<"a­,"EÑä+ô&p{t÷Å×ß"ÄÝmà$:Pµ Õɺ!ц¡•ؘ©3î•ܵC÷+GË0¹óü¥!G]¼ÁkZ[G *HÅÅ㈱Y2¼¤<µ@¸êb52¬£™ñ*Wb >hlvéï·vÔ]yª-í¢†v•¢Kç™ìäˬ÷~ c´Öºíþá { §]Óóâò„ŸÛkH© ޹ Ÿ¿ç×. ß’:}ÐÁþ…ãá+Ôdî¾õ[ãü÷¿|3ç_†|)ÞêüÉ%ñny?ºuø0™<~\€ˆ~⼇o Îéð±Ì4ñôaq›háPkÁ¦@} âBƒ3{ƒ°®d¢)—…Jc7¿t˜~¾Ã’¥²÷†x¹Œ“À+I+Úhˆ¶Ø½â0#BK}‡‚~£‰~ôÆø–žJ·¡^Memç ñŽÕåãûÀ5Ü,Œ–x¼Y#¶`ßÃÎÛ{U^óÐEÖ ™ "X¤‰=Í7wDO³6Ö¼Hf›nÇIäƒa4ÍÁÍ ãý*œnFƒ4‚˜*«=ÔÝ[6Hà1A½}w‘Ëž»‹h—ªã¥C¢ž{d æ§Æ¢»ñfšÞ®ÛÓzo¯×5Rcâ$1‡“¤ÜBTéÙSpá0¸¢}R‡z$&©öw­á¥7˜éž„L°”ôÅ<‡X½?k­ çBya«ÅH$ðþû†©²=‡:B÷‹ctqD,7Æ*jãþd–鉞€×¶l³îòžðËHý ßL~›8‹ ×ÿ­OiWwpZPlÓÁI¸¹tÁè\Xöº;¦­y,Î…@íÛ\£¹ýôr+<ŽOÕ©Ç\uSÉ}d”[µg¯›~Š­´æˆÿOV}®3 H7f ¦5ÆŽ!ýcŽ©×9»%CW-¸äŽ“–ñlœVÆÒ’~µèY-ß(b•>ꙓHxHP5X˜ªÏÒ^gÂ_°Qɽœnjq&-L¶hL $weAå.mž'(²§»öHö¨Ô¿-Ïì£>gSSFÏóÀ|†^MT#¶©ÍæùÖð’¤;mY¿x½çÌv\ŒÂWBÅK‰žž³í’ÂÕÇ™ÉZYC¬\«â0cÞÚÇ®÷5xðþh½¡®Jïýê+k€ Å€o5¢Î;cEÙ=”J%)<,œ·å§^ŠbAæº ñáÖ&Doquòö\?'WƒBL"Z¶F¡•`½µËÇD&ß EàÆeûÔ‡ €ÞûÕÀJ çý‚ æ•’Äóå\õÜ‹`vê¼fãµ5ÿp¿êÕþr@þY` ]îg×|VÌ)7ÁÃ+}ôë’¦Š¸ôk òêp~P0ÇZ•.D@E¶ÕmQÖ¶aVZ‹Y°­hÒoiÿ† }:àŽ½ž-•Æ›•©<ßôÈ °‡àåÙ/í´(‘ÿQø€ Ìgë|×_m§ô‰Ð/¹øâ.0Y_λÿ8]¨k¼BAæØ¡ôê\?Š6Á¤+fÁé9èHù¨Únº.‡Ñj×vÐ{›W e;už«[ƒLPì÷‰1è#XÂâ»ÀjA vOQ:.SÂQº-ÎÁ¸ëŽN-%ƒ ©ˆöŠ0Õb0fç¦Éõæ4$MãëÈy -Æ+ˆu¶¶§ö§`IpÆZ(¢¨f»Ô6M¢[kÆ~ñ&›CÿgP_û-<À ,½ÔA„x•uß@w£[^¾lIC› 9Ši>=8Ì-:œ;„˜Wžìñ12Ñ/b…2Õ¾c÷Ü´L“N9wwç4âZØ [¬bYOC‘3®çtøm…e ±UÈ=;Íä.¯Kóc°8¹ÒCœžÀ©[÷sl1²nÿI›®§Æô5 \ØT>¹ ƒ¶n£í§RÓì€…ŠŽØKýGaûMŽœÙTf„WØz’T— À“:Y¹IM Íô "VWŸV5ùÚîßAå¨÷x îÞöž^lÒ<§©Uu‚)hz{Ùk–š*h¯¼±ûH^'XH:u´˜ø4mŠ¿Í6éøJ}íδ Í¼b5À¾04—­IbKMNèÅ—Ähß9#Tª vfçìý9PþN*Þf+’qïPUþÂ0dÑ™&¸Y¢­÷ó™©Ç§GHË`oè…rÙÑÌŽ¡œ8ƒü­ ›Xrt7^¶“'î¯æfŒYâDëwû˾e}Šàœ`¤ ŽlaMS›nˆ&†yÊCÜÙtR¡ÇÝW´;ÊÏê^pk•sÂfbß³nôý7­ôþÝ\ÛXxaA•N›k±8º`fÊxwbR5|•Enµ|»N¥$ÜÉ0‰õVÕ—îxÊ*‰ÂØÅ›0èi!ú±-Æ”/ü‚·ëû’@ÅÄdÎË3¨¯-Ê()„ï4É¡)0=(fÅLÏæée;7¤§ÚÚe’à¿Ûƒ|7;p!RÇQP« _IgªÁ[Y÷:÷IVæV|¢âÃjtKÞ!OÐ1MÈaè׋—ÕánPι]¼Y»éQžêÛKè¢`ô‰½âMN[ÒÏAñÇÉàXµüÒCÒc‚OÀ7âa‡©ºEª!k÷Ã`y<´V(€€𠮪0sf…‘³6?´_.5–Q±Î]Ýwº© ñ4¶cÈ«EO`dk[ßT4‹‡JM'ÛÓ[IUW­ÚeëäóržZ¸Æ£Àt‚m]³¶gppcžçYþ®¹séiâ`ÁRÉÞð„§ˆAé( ß r [Âõò³[Á [’vù»-…©Ð—úqã?e_"yÕ¡Ë'J?|Еø¶<¾–ÂÇûÀ_Òø]P8>úÙ_ÔïJàÉ-îðão¸)ü"ˆÍ·¯\Êw?ÖövஸÍúVá‰Lg͇+d& I)e¿ùD˜ÅŠqÿõ¯Y©p øl«äe!FP7Gbßç–òé6yÅ>¶ÝáÄäéäLùsÐÃ(¿ÐmÛ"?"¨Êë…bègÊu®!Šì{,·<ž­õ–ÜÀ$ŸÝ°BÑ1s¢ù:~E–M3¤ùê£:ã¨8´xy{j½wtõêþõ®Krµ»WórÅŽ/5ªE Z²ôEäTªzGãø$é©Ò©Mÿ̺=UKIP0¸›”V¯v“’ ûõ€Œ Ýpv#@«]ˆÂ áŸ\Msê&ѱ0‰]X y:[a°»~ºa`^œÎCÓ(Ê6ùCêÐÊÜ×c a5 œ¹ŒîC×è7x†Qà±êÐö£CÑYt*ÈÛy)ûµj2— Kˆpfoï˜Ð›äfj‘ƒµì¢BöÎPÒw×âg(d6ÉtQgæ#"hЧEèƒÃì7 ãÁ °§È7딯 ¬#›J†÷ø¹†Ði{Ì™6¡qhÌ£Qˆ—èËŒv!,…Å~hÛ ­H” py^ÿ &-¤´J³Œ™LCôÊQˆñÒ ­å$Ëa9¡“Rö¥n³ŠØd˜ºÒœ«žVÑôegÑ妣9Áw¤ªê’hñÂâàÃ4Î Ç/DŸ"žî.TLÄyÄ•†bÊ j›¾ÃFnp/6ýøOYDZ@ÿ§ð]´¹+?öœ®ýïsxßíß§ÕOþ2q.ØŒ¿hŠþmêkojï¤z%p÷»q]¢­VÒB¯'ÓÐPÑe:^[M \°<”¢eŸûÍÂbßüiòÄc-èzÔW«:‹ž–!Î}=÷1{1Û¶”Ëä·û¾çìÛ” Éûvw‰Ç„G\Eöi7Ïãñ°ŸÜ¹ú̙іXäØ23ÙS¼—ï†á?|;¯&(ë¸5žýü¾9ÞyEMH‹ÙN_Åñx;œòf=‘ÔÙvÛÞý¦gjˆðS™ßÚ ýç¿þ•ìùÚ¢y‚¢ÿ£¾ðïûœËBž×M#ºu#ú?ù~¯cR['­Ìâäø¿/{.:?%Oãï®)Ê¥ÚßÚcÑùfÍ‚ÃÁHÇ:/ÅG™ø{à[…ûðþW‚½IA`‰³—ýk´J¥ Æ|”££®¢þDM°~|ãq ™²ýÞ“±Oð»&Žú¨ƒ_D‹ÿöûú yÓ/;³€'Gõýù}W~žxŽÜÐ?o<ŽíÍÊÿž €OØ._>Q ?ZßWÌìõ„Üq90Y½ñ¶1Ff¸{LÌ5ïÚ«»Ò Êd×:—‡ã\9ÜrFò­¶Æp¨:Íü¯&Ó¬ ±MT  =ø›U*:‡kî«îÑ~ä]…tw¿‰ƒ…/—Á*J­(:}X(È“€‡ÂàjÈ“.eþÚrÓãy8¤ž®-ã.Ä·Þn7oÁ²0nøf4X'}†Ü§Ó/=Ó?>~–Ò¸»fÆž²ŸfF!aÈîÁ±¿Ä!Mè `ÙžÐÕKX\â7y^¥|¯þ1bÃãæñYNgÓ™-„L±†=—ÜùÓT¡ÛNÍKÛb,”ö™Z¬š×…9A‡.ë‹äÃåÂîldÎÆ|ZÆý÷G^‰>×L“9Ïta·›/íaÖo.ܸ¥©'CpŸÌ˪möå0lo Qnž½Ú·Ï‹(Ĭx±DSö¼—7ÎÁÒÐßü–¬¹ÔúÙ·¾ Ìlò&zG&·¯ÞµãSÊÎZd.7v7¸€a$r}àkú@ïÖ—5Y1/$âÀö]q?_xíšk¬wx:Tãþ58>›5 V[sÚ¶ÆçáçP¦M}p=«Yù­–#+×16.º¹,Kì–Ò8<„зšÆâõ²tÎt¶9ç2‚KœN’+ BLì6K"¤í†Ò ‹ë ÝŽ¿vyR¯9wöNsú:V;Óð3 {GÒT LJ¦u)0åtÎ[³©º»OÆRLÑêøT"ø¾7xð6€¿5Èñø§<|¼N)Js-/zïJºÊKDm¦ð³wæFÌ’ž÷«¨pš¸GI>HŽ~â©ñð¡L•ªÚÜ"zþZÔ6ûFí/™¸Y}^9bäúñ‘è­J¬h.]ˆg €®JVîÜ› ô€Pt+°S<*æ$Çõ7 “ÌÛ9 1µ f?F‚é´Á⸹fu9©ô ³^;uVN˜FTÌgNøƒe3øÉ¬®’ˆ<ËþÊ9Gšlòˆa– `we¨\óCéx¢ÍÜŠ@ëó›»S;sµÁÒNñYàÎú Ñ5…­î÷É©¡qç³ðe¡ª¡Otfù¤Üs_º¢ÀRÓÆ!hÂä¦pyÐÎ?P æá|ì´­Þ€Íd?¬ž@Ò_õ„òo Ô<‹»i–lcµ§¨Ï´¶J¢¹ïQÌF‚ä(íh‹º›Bw—›”ÞincâXàZ2¦(Zûl†Øñò´­é¨ÚA(b’d§Íäxà܃ŒæXh\Ó ì+¦hÁ;26ªþ± L^¸ïò‰UÞˆ„H>©ÿ¶wìKúŒb€f1=ʸ:Ç«iï…NcE8Ý„·ÏÜRŽ~Ak¶aÈú«I,T³ lÏÛ»/ÕãÓlB.²íòsãÀ`$ˆ`¨Ü-xÜ4fcË꫇ŸÎk]èq Éypd@ÀhëFJ¸Ê–©ã¸§÷ð qñw/åAv'´ E·YAA¶òÆγ¬©a©#N»!ËÒ{ëì Yg\òÞ­vî\7½Û56fJœ¡;¼xnù`ÌýNü £Øßø7iæO 7}t«ÿû^øëÎ*Ùú_Kü“¿iý'|X°ÿ=sÁÏ7|k<¸¬rÖùÙ{` ®t)'þjwïÁ>¹·ÿ`ÑùS.ô—Ʋ۩ˋ§NÎï–RšøZÀŠæñAÖéÁgýøò½ PÂ7ì¬)ÑgZäûçýÅ0º)U‚¿”¿}_ð}r_˜qð/œüðçë¿]•ñü½ájßõ„íUö¨¿—ûFHº¾vwÑƼm?øÀþK&ЉÌd¿ë&Õ5‹ìŸ•?99u;f=ר{ÖX¸%ûAwi0k_¥ÓÐøG?G#ù·~;fy1ûýW¤>UÒ£Nü`°m秨㯾;hh°5×Càlq¿3ÇS}óæ âª×&bR¸Då~îh±ÌÄ; ŽÕ{]6Hܯ«ÈÜi]&8̶qÔ÷rô¬À$Xló`#9¿méÝ/ªB3 {ÂA`ŠY›#M1Ä4ç  =€*­T\Kt`°„ø%Ÿs·h¢Á˰ÎÒG¶%?t:7ƒD²:TkËcˆVïá^.HÍòb¤Å—]êl]¡JÊ´û+åá•íyè\³ºðô®Âi+Gf,¢¹ÂAofŸÈ(âú?¹$DW±í|Rý·yêO&ê[­3ÎΔÓg"À׉ea3KˆÇô>TøGˆÆt[[Qöêή 8?•[²E®¤×í¨ÎØq‚¼¦ ŠŽÊXÙÖÛÙMËm½J@§×w. hʶ€ÇÙàiw÷!ŒͰ2šê½*‚û˜âqŒ'Å”¾e¬ŽÄNB|úÂõ1­­5ÀÚeõ»¸ PŸœÑ2•À8‡'ý!ál,—žvLl$`·8öc"ªÁ{­PBÛŽ´oüV ›…(¨¸NÕ‘=(ô¬bþpq› ÄТL•xÞ=ݹ2L~»Ø.mãúý‰•¤@hüÀU‡[J‰º$³êšv2ÖUlãú­CWñx2+wRE·\rbGœ÷ˆ¤?yÖ.JàDë:%áV“<¤LèÙAD 惾‘h»YÓucTùçVÓèþÐCÓ ƒqœñ{«ÿy‰W0céÚæHeH>Й ÷žvÌó¿ÑXf«ß’4Ðg‡õ£>jEžÙ“ ã{˜b¸…Ò­2“Ò׋Cªó”&ÓwÒæ$ã7…•~§Ï`¥¢©#8î^_®5ô>ºʨœ÷6n°ï¯cbÞ8¤´’Þl/q§gtýUÓ?ÁÚúç‹Î‡%Á×ëÓ§™×î'>Z'¨4ï2ñÿ TöäÇœ+“Dj<Ô×0*‹#·Ú1 äÝ·Gÿûk¿€0Qïß×7.û_Å¿þW”¢èœþÿ<]¾¿„ ‰ÔýöG"ðŸÒyÓ¤‚(‰ŽóEÏ>Î.Z)  =ïÛÔgèù¼6‹lï+m'I.†ø¦4òãPÌÁÖ¥ôC¥QgÙ–¾íâ æ§Î0,»'z¿£S“ÄqYPfšÜ¹E­–œy¦U}°»³7¸€I–£æjæup'¡Éük[‚w;nÚFn›þ¤£ ÃŽ—|®¿ÊŸñ’ܹ`£Ÿb§o™ðŒ•ŠR°ñŸe€£ÌÀ¦ö/£Ç©ï4;Ý5ýSX©çÕÂÛÌïf†‰Ñ£b©7iÅòXà)C¿Üï_à$;púŽ•)“Ë€Ð4œ#›(JhÚÆïyGŽüòÉÊ0úÛŒ¡MD³¡¾íÝ‹„ŽÊ¹‰îU,K!}ç”âÇfôïÌY£«Á®¨ó\L]È^À2üÚK™øqöÁnP`Î;î‡*rïsËô{ɸÌYBÏ^ߨ¥6¸‰­¡¡½^CÂ`·è…éI¿ì-|ÿå˃èd®q^{§ MBÅhÄ$!"Ps‚B ü´“æA‘g_5m»CŒ¨Âæµý£ï’|̹² C¦$¢Dh¨ÃS¹ë‘Õ|×2–ÞG1xg „°|^âe ¦E"q:Rƒ°&îj-0½d¸ÆIÃ8µÄ|ôpúùvZ¶I.èAjÉO³ÕQŽâGí~·ñF ß"w™¹Â³Xi1 î0DÆÂn*È͉¤DzAÒ×#þJF]9â<|â·Ž+c!=ékšÙäYísi"(î3G-m á þ7*¯7¡žÉZ%}Ø`áR•ߌ440ªRQÝF·BOâL8UãS"X*jµŸâlÁÔ8J'™Wðec0.?ºøµ„6%$Õ‹é#b]¦^˜ ¬C͇‚ÎÁ°EŠŠ#kã±#!]AÏp”Ò| ±Þ—I‰É½Ãõ´šÙ8r#*m¹g/ØžžÏ˜ê­Êó,·b¾@êŸÓWž¢ñYñÿïöbe–ˆ?IC7žCˆù®7ÎSƒ±H€´c8Èh´·àríØž~ ‰ p‘o‡Fr¨ ózZ÷ÎÈð]nŸß¶1«b ›¿ÂDÆ›k ÊœÄu'/ôÿÕDþ[_/OHzÍõñ‹ç6r‹TÆõxÔ[ŠÝ•ª¹9„wb¸¼ù3ÖýÛ¸,ê ‘÷C )Bo_&¡|¸Œ„Kr1L{­¶;Ö¶7ï±ÂwÕ¶€ë”¢¥%äë›ÇÛ®!ïÊí²¥Xäó|Ôª|Ôðüä´tPÅGLJ,gþêý‘ ÊF!ðýGÂÛ‹Á¯ùöÁ–žÁ&_úä¿n¶ÀïúiòOHŠøÓ»úî7xc[ýÙ'ÜLlø EÓjVO3z4e<—øÿy|æ8IZß…/ÂHÀ!f¨Æú?^tþvŠT5¾¼ñ]ß7~Ùïæ›—ÃçOLÈ4{;W=Û Ýú&1ÖZ[B—w ~1à.~àØX·#Þ¾Ò·`¢½pÜnÑ;’l qÓÆ¸uVÔI¸Ôã}¢˜ÃÛ{†ûÔð&žýáSfÕ]¸ùfOœ˜Ï·ïßEsœ7Ÿ/  iO¤ÍŒÉÍè¾’NiWOïý³Qk!“ ýè‘P9¸Ã?€.¦š-§%º¸Sü#•µ§|E×xx°(\º÷*q2TF6~bÛþ׿l&÷Á±jµ¸R£zG¦P†}œIFë[ öF8jÓ¶áS5ÀÍyœµ³Wñ ’)k{?ËQoޤ]€©Ötµ„“Ðáü>ȼy¹MÑͳ³;cv¸Hä낾ûà'#S08‘Šªû)F½™Ü¿q»\q´/¹’›A|’Ö¶ROTìß\{í ‹ô’[ê±:¾· ÅþìžÞ Âþ®4Xï^½Åá}Óÿ7ŽÍwÐú+[•Ç)BKã¿Vt>ÁwõaME‚>sèzú;O–SFí¿ðP´…³Å-‹Î–/FxúÃîghé½[3üa0üaýõ‚—x[1hõ}7å¯.ôïëß׿¯¿Á+£ÿŸdwÏÏ.ÿC"tU…G€ÎB‰ÚÔfˆÐîHVÕãBx·U«MùX”]æP@¬Cô ŠXnÅ6wÄ'à²8v@MR¡’ê˜ý7¤/=“ÔøCŸ}♸—ª D8WÔŽö¹ä‰ey{‹á–+±"zBå•„"CQ´”£Ì­D‘cÛß– ¼'_ðñ¶­àV•ëȳítx“*óÀyÁ/Ìd“<Ç$@ŸÃ/â MQïàØg«*ÃÃ!Aü^üრºs©gÈ—·NªÃ;³ÉÍÇÔRKgU"à€HªwÜàO›âìò¸žTËnáÍsz|xîSxœ‡1­±7Jk%›»0OU€`Gþ¹âû:jí¯å-s)á¥æµE§ˆŽôÅœNr/‚·ÌŒNÐ÷º¤6C5W·›9 8˜—žïLÁ7(@@Pˆ7o9~Oàœ¤tÄ¿¹t&k\KƒÎNY»”ÿš/B©tu·½Ä¢¡Æ 9î¬ômÂ9´×œž×Õ/ÇDt•‰þ¦°Ì\Tå^Ó’X2ÑåcéXÀ¢üf>m’‚âš#VôhÿXí‹NÚ%ýßÙwï¼s%K'=yX°J£Ç1UÿhÎëÜM•;Ó2€¸æÔñ#,¥¢UŒ¢€ɾkûˆvkþâ óÆ!?ã ]c”lñ£æ„ÿ—jÆn}çe2Rsº67 ˜q–ùªuîƒíMK£"IY-E·3—¹bøÓËKrÝŒ?D§"ÊäFx«Óûnª‡ ©’.e¶¶c7o“„hiÉ‚ÁL^Ô÷ÌeŠÙ?[§¨òíÏfZ¥éCž6?± úª*î;:õS„-‘•¤®ù»)ðºhô]ÜZ×ÂÇåó|?Rƒ›ÍÚûÝŒ;Á—I…æT=´]}¹’WL×s$3oÆ2ÿ'1Œ¥ŠÄ¨äåZ²ð~¢ý‡Enÿ±úO¿Y$¶$•nœ¬ÖЪªŽEø¼úhâU~ëð·_^K7›ˆg;R]o¯Š¾ÎPœîSÌ«;ˆÒìGìÙS:¸Ë@¢o28Õ½é‡OÅfåHj)A’ÞÚÑ¿g|P–ªÍŸñ·ùYãêÞ2ç>1¸)Ò×9Žj+¼ŸE$ޤdA¶Ã'=¿˜$GJ îoìnÆ„§¥•u }P+ûp8]n‚5n8>+?ZoET¸Í»ê£?cr53ðSÏó¤‘ÓSwKÄ!'; <ä[òG&æ²ÓkV>¸Í·mÕŽÑóHó+ÒÐk䀕¯$CV‰F‚Ú<‰ú¥ü#o8WŒ;®¯s¹8v[~ÁóG¯“¦cÐû€†ãrÜBÿ[…ð°iè"ÌDšÛ#7MÛŸIìñÑ@ +<×-ª*b«z~öÓöðƒv—ÈtþiF‹JŽå€“6L6gÓâÈˬÝSpyàÝ®ù,yr’GàÔKWÙ€-Ç*ô¨”b[Y9´N-GØIƒ›\¦‡«CzjËïzQS8TK’“$3˜éto&Sÿê Õ¯–17Ìè+t ÿ/v 8ÉZž—š9Í~¼‘¶ ®‘ÇžºŒs²i-Áb¼‰¹d©>Lº.ACK®/~/Ò¤FƒºÏU¦ø¿?îi<Þ1,dÂÄ‘Ü/gIÌâ6µð¬M ÿ:„Íìbý·UHÑs§“ ËV®‚³0>úyPp™fY‰yjB„q"XºçŸX,0²À…-{§¨U¯ïôJåOžàs¸é9wฆ'¼OÄ<ݶ㠧¼£o$_lÊeù{žV (êNÿ‚©šÜ»uÉ3ï <Á>JÖñIÞ–=g¿ß"sÃ773PãnïA· „¿ßv;|úϾ«mða)Á'™ÙóØ?/¬Týñíñô+Ä€t GrÔ77ˆîï×xŸ¬KÀ¯Md*@ f>z—ÑdMœô–7ÃXǤot?‚‰hÏ‚@£V”½EÿoТدX ·ÖNpö·ˆÞÜxoùµöæ/h¶Í»ÖZË–¾o'žWX'ÑùÏÖeq'~Zôé³ þvƒÙÓ'†~Òýƒ(®œ[¾Ûe𱶦 (o#¼ÓRdjß*1ãä&Î #öX©Ë;wâ—òš2E»±7i ·ö{0ûØ€ÔxÀDXøˆ»Ô5ûuŸúw`6Dé‰g´ûÛ™ü2MÆž8¶hìà‰Ã˜EÀ ()1‰²¾’ǹq€Ò ëƒ3æˆa°aiÔ­+”|[ è-ò¼&–4q[È‹Íù§:Ö¬ 7~™œ|M¿a7¬ûÿ±åoýÎ2Miç0pÿ»^½“—0•ºÏ™Î;ÂMðbmÒ×Ê &X‘EM¦°=7AgÎÖK—›]‡výNŸ“æƒÏÑ@Ži ]­ŽzpÀPÑŸLÆà¼š‹[Q-É8þyËrÝó —Gq‘­#Å€q‹Êh*j“Gª+¡ÆÙ>ݸ/d‰ÊLŒaz5jwh½aA’bH²U²y·—UÓ‘ð"Œh4¬°½˜£$£¹Æ tA×Y•ÎÔ{¿€Þz·¢¶= OãÍþô.—ñNéЃ°Lh”—ÑXKt ³Ðå!d,“—øÑ–¡Ãûà f_,°:l8‹‘}O6“<–¢¼@Ì:ŽIsW/Ê®»‹˜ó¨O²›ê~t{n©YNGŒÎT÷[!Ïðk”ü]“×xÊò¢Y¼×x©¥0%UœI*Ô÷Æ'´\§-HQjv:äA/Ôù…PH¤þŽ6S‹0†nïÚû‚ÿÇÐÊí§ìp5çØMwÑ3?š©l_o}4õo¦ž0Xè’aÅ“ ß7 ½f ßv¸l ^þËÖøû©b˜÷ÒœüÏuuïÅIší£©~‹¡˜WüW×—‘„€¦#Š\ •c<wÓœ”3`š…ûšRPk„² Ûòu^L€§pÐnŠD4z_þN×*¡_'-à óù~±ƒëJxn탫àžÛg€2M1¼"¾ ļý+>8¨Žü 3±òžðÉüÖhÂÙ[˜_ÚTí0P~ò‘ .Œy,ÛËaê÷ÃlÏRŒÜêQØ_‰Ž}¸Ô“òðÅç†(£Y/h³0Ù”ÄnºÄ,æ]>3³ÌLmŸõ©{1?ç÷lÅÍùêR[TèŽ #­N`=øA“,'_ÞC¤XàÔýo%áÖ%Úõ 5.­ö(îó¬ðO7{l$z”†þ¼ð‡f^~7õQA%¹í{Ý Í$Ûp·‰Öƒ8Y=똂Ú". a:ºN"Æ®‡@ûWèß׿¯__:i1xëkø®ñðãàgG÷ûˆGüÙ}-âÉaò¶ôñs¸VÃ`Ú-nAå]sOñÞyYÛÏàݮǟŒŽÄfVo˜ÙÇtMï°¢…ecŠ áÉ‚ÇrU?šöF3ˆ…JH¤éÆàV¨°b ÖÃPÞJhjú§G*_qâYAt7L>úýüÒÏÅ7òu¤±ÕìŽSì 8ÕÞÉ“o€~% sõ:ÏEÖÈþµ} ÞÍYŸˆHæÎ½ð¶N¿:@!ÂYœ`vƽŠC[*N }fHhž˜RÏ07‚Y‘µqVÐ ^kÆù‘Þ¸ÂdΈ+PN½ÝÍà)êi€"øiº%«\ž¾‹4œÉ7\ßOe‰³t½ ò^”¤»Ê7³¥ÿ’æø®¢zý•» N6Õ¤HÓÊQ`6åƒ:¬[µùâ¤CF…·ÃXóál¯Û=$1› ª»µÚæt têÇi8qÄ1æ}]eëWûr3k«]‹†ÙAæjÕâÕÚë€5Ù4räì¦Á37:çÔ1o·2Áq½•1ÝXpûâSìRàý}A,'SgËvk.Íá;`v}t–ð÷}בinÃúáH'Ö„„"TCxƒæè‹¦ÂÃÆ`™KÒÚhWèÿúP>?nIAiŸËÚÖRaîñj9Ì –ðY˜Rœ£¨¶a#8q‰L[b’šÑ%À(C…ŠŸ¡RãÙH®¨É1ìDiB&U߬,=ø)TïPg7,Êé·æò£³È&§•IðBÂS à±;¥Fü[À»âv—DRŠÉÓõü /·c’a.ÃM3j âZ0w$í 0û`ê®Y=ëBId†Ž€×V*HŒ( hgµBŠÔ³KY’ ð‡r 0gDx“ü‚ÉF-•…×ïSÎÛ,dõHç (•+sˆ¸ºÔ\W²gnÔ¼ .ÚuÎ ?À޵“Öp‘àp«êõÓä¶ÝÉÚ8¡žKȦ‡Ë}Ñ>­KTYxó°Bp{ÿHÑyL²ÎÞgÜŶŠá÷rš•«Þ»æ<­pkÕné—{3·žf6§ìÞF4M›8g ¥>LIF&?kÀˆÐÀãŽÊ³Êú %þ”š~A ­|_½m,® d±Qx7¹P=?œÐ%gú3^šN ž&Ž=Ïv*èêvµOnVù9¢ü3–XÈclV{æ-ìÄͨò W.„àð®àNãÁËÙO›œ°;qÒ/ŠǘÛ5át픋ü ÃŽmOáç¿Ç¯©:9˱ôŒº^€ï•áïwkê¦)5.71¹ ª¶îô œ’=J•·ëf/‘Ú¿ Wñc‚ƒƒ€ØŒÝZ×· èžÐ²F¸¸¶’Èд*Bq£†ÌÐöA]j½Q,È·‡$rOy) GX›\.ƒ×†ë&5‰bêäŠÄ[¢EK-;)›‹§oféhwD”–psë(ûÀ1ß(sÕ“áÈ'—-é‰ó,,–jG÷e>ÄTñááò ¸ÉQ·öDÃÎN®L'ê‘ààUÑ’¥üTšÌ>ÒqûJyó]YÒÏœ)– '¸7«Lᯩœ¤{"Ô÷ü™wt6ˆ7»ˆ¼‘]„ÃêÆñòžyG™©»½:Ÿó ³´²–tÊ)ÔÂéNç\{• -·ŽžP>¦ýf˜á~aÖ•è³´æƒZÚ8®*4ÛùÅf7 °†öjíõj‡6טŠÏÛ“Žáä­=»9b®„E|G¥ÜN´á=ÿ´ð}M]áq5GÒHùù2]NSõá‚…[;{"ëÔuëé9ÿ•ÃÂ¥s;”Î^À˜f™ì‹ÉE¥ö¿h%—9W›ÀÁº„[M2—îÛó×µ‰ìàtP.Î~Ùå`,5$žœ:x–BàT!þ¼—-’I<¢.ª]M“í&!Cà]üM¢“e¼OÐyß·Þçbr([«›uüo5Çõc ÊÑÿ’×>¶K.tºÓxj|—ÎñÇCÎnz†o!?$\¾ø=ÆE] gXÁqDï&¦º­àxdÝšˆ>ëÀÃôøÉnV÷í–þ´ê¥OèÅ6¿K†¶R»=ûï‡wæŸ#:ÿвJq¹Œ©‰x·èþã¢éw—-^™çÞÓâ7l&d:lè™åïÿˆ4ƒåÌ£Â4𠩃ãqt•á–0“Æãß±Dò5ܲDŽ¢§žQ·U­Ð Xq¿n–tˆ(æA²=¿Uö>¼ov S¬¡Õn€” EzÆâ¨/DTKþ q¥úî¾c¯ b7ÒxÞ©t"ø„Cé\ˆ%Úï‚ÎÊ—ú›mÞm2u1‘º1·zžòÍx*NµVÊí¹+žÍÎÀ2ʈX°[bÁìðy&?Fk¸äÊ]îÜjÐE]±`Ë·ö‹<•,ÔÏÙAÐ %ÝÌú=ÀÄV.TE¸2k»8=kmÿ(ÒÌúbhÐhl××VöwU‡þX÷Y¸Šñ±À>?^t-Ö»{_Ó¦Žû .˜·pcûÌ!ÂEÜ—o§2ËtrnëZ¢žr¢`á&T^¿SŠ7Õàî§b¿¢Jƒ©dTÚ;¼Ò·C6lsô,ÛE}¨a{òæ+˨%·lÑfzƒ +np/ë›xß¶A€§6²shÖ]ݸq|MÃ4*šåT@jÖöõ[BlIùäAŒC:SløMy Õ `VÓ®`vòÞ‰V{çÏr2n³[!Œª2fQ¡™J´á©–…ÿ ¹ö“jŒÝ ¤?GBÖ¶Ý Ìs‰ÅNÚ|ÊT²xñ Øîs+÷€Z«s]z¹­½‚»éDÜÚ`“ú?1Lcï—4zïh1ùŽû¾þwOßP;Rlˆw.‰p“DˆGøá@¡ÍèÂ*‚ä»m8ÎÎð4¨³] ÿƒøÔ †ÖZ{µ×«½Z›¦§´bä ¼S“*A[›H;Þ“@±ü ‡¥vQSnǶƒeõîÁź\D£Ǫã&¢xÇ€-}È” ûq¹jT†EgK"ðüãnž3¾ïvçʈè²È4Å`\n, ð“~‰xn J«ñ6°- ¿¢Íª'oÝNÿ/ÆFçÑEû‹ÀKýgOúóœRå÷å+;IÔ‰1ŠäDÙÞøv<ë[ïÿ“åúVzôÃEônƒÇ›ˆÚ0ðxàgw‡QéÓPù“sb…Hßá¶SWaîŸ<ø÷ÝŸ{í”»ly¢¨K£¿ºº‡V³ü‘›ÑÄž.ä¤ÿDçï׎þÖxàWÆŸÇŸûd͇Á UÐ í´“ŽV^®f‰í%ª|ä˜â‚™Ÿ0Ž)Bþøztùë½~¡ãßßÌHð«BxÑïòO02ôà5þîÏ„çsw‰|#š™Áº½‡¾n|?H•ì™…ã\¤³M[4išPþŽ¿·3TÎz3'½ñÂ)èNeKÀ»SÙŒ Ê“âŽü2^ çæ+îò;˜Hê ã„X¤I¢ÈŠDÔmÉ%€sJ^¥‘%BÅý \¦Œ}MÆÄJ‚ÎÔdFžpÚß %0ëQlóA² úoÀªž>[5¸hÚt¢pej`U­¯àÇ âr#d>·P""Ïv†L@ v‚å<‰çôòÚ©Ó([§°·ê 禮 P‘qÄRR®dE.«çv‹Ú´TìÅüÔl «=+ÆN?”U\ií[ ˆ(Á™·å;T¶õ01•!ô\¬—h5u:jÿ d¾&/Buø¦ ? 4g >¶al!K¥ç2fê]M÷ÁÍO Ñz 5ÒpÝ4¯ŸOqÂ8’Íc΢ï,b¦cIzq4sV±=òSw!*º, =ê¢MA…zM!Wh«X¦Þ´èšÒTg8¨¹Ö޽ÖPÖæÝæWS ³¡{™èˆ¬ DKfÊÍ`—æ? ր׫½ÚdÌŒ©¹—\®ë¨Æ¡së z®/ÒÂÀö0 ŽIbõ¶È4rZâF\wj^•=ÅUÊ*x (¶kÀ¸ï~p»–l—ø¾O¡Õ·ËZr(&>bOjÀ>!ƒasðù2¸ƒÏ=v8妊gSÉUp“æHC+Ó¡-Ž´ø*pAç*ŽéŸ¶ECI’'\ª£'"‹CP¶¬Ç—> d­“e x®£ç£áE>+¾y¯¦’àª0Ú¢žYAn¥Ã5ä(\u0ÈOÒ»‘5Î4=yŠ@HYFu´);Q÷åt™ë0JG¡þ`€Ûs×I¤3}-QNœSS`_‰˜ $™èQ™©,’ˆMµ­fé#=d)uÐ)ÓLã{©” M¯"~R ,}GVgûòøfB½®~Zê•—[é¦gpOžs/ÖQÝ(ª—Ä ¸mÌ®=¨tÕ—ÃÜ}ÛÁ{ø¤ÿÐà„Â?o~üõE矚èywÉG(|q¦ÝÉÀÜ'žÉ»/áuß<¨'µÌšzÝRz›ª¡Aýâ„a?\ýÈJjú{iþì/òÀ¶[ç¢ïöñ^œðù1§xû;¨‹â_¯?fþ}¼Êä|¬8ÜÙí#C~ßz}Ô`ðúòÍ~*ŸÏÛ–CÕ±>R“%«%¶.g5lWÝÙ›k äƒHÅÎx…f֡殫hvTYÂà.|hâ´È5X.b’¤µ6bëE<'‹eÜ.”àâ^”é¶à/N¯à~©& ±$^*幪Z`ñ¯Ï3›vÌöœprÓê{ç–Š†‡0€í5¼2‚¨,T‰%=å>>/=WÉR VÔ§©nc’>É*¶qÿý¹v„Õº>,ð²Ö,!ö·ÌÞÃ*÷UQcøž—é =èµћ*;:ë[3WVêx<â:IQ2 ·TàW5ƒÞÔ¤eD\•ì… ¸‡éø<œÞ†ž3Yèæ\šS‚¿»­û-™}SÓìƒ ¿x'÷øü‰ÔY«‚–íq?:‚§W¬ÿdÞoføXÉcÉqTÌÛüx7¯Ö¬°“™åѼÙFqÞfØç<“ôìŒZDvúÔçUs ž¤r$Ýúð€Nø¦ºBZ˜h6ë¿=K¶iî—¬d„Ï)§3ÕuÚp«â?h kü‚,Â;BäS½©hŠ<;65^;úpv»Ýk6p'¡“·F"¯M»þÜ|MË®iLðÔeÕF!|ÈEá´à›ðÔ†p W¡Vu²ž§ÆÚ•2…£"6µég_(GÙÇ1ù-â ñîá‰ÙS´Xâ*J2 sÇ›D½ùÁáH*¾cnJÆx‚[NÎy\Wu•ô³·õ®Âñyl˜Ê“¡P!wm©3a¬nšÇ#,v¤ƒ«>èi`j/,ô'aœ"àªêÿŸ×ƒkëo”à´ŠQâ}^ô™íç^ƒ+=Óì>•D¦O´»žZ\º©é‚3ögý×ú˜¼8ð7]×Å“ŒÐKöúçVºÇòþð‡ÒÑ:6PöP88w&,ýaÆýýÀ¡7£/I/^³¡üî_úç‰Î¿iž Nœýäÿ¯?ež£z*܂ϗá@¡î Á¸ÇÏÛ€Q}¿¦Šfg « ¡#R,(Âfm®žs½R0ÇúÍ aÙÊ<­Ö­^Zù‹¾1Í#¥c·¨§í¯ù|n##·E|½&§ž,æm§—9‡¼c:$h#R>Ëä2’¯F7í@˜rÝÅli€Òn&³ìÉÁÿàÀ«Ì3†I·ÈÞ»™øÊä¾a+E-UǼЊ¸Ë±Õkqó³Çk¡‡¹! Q,£†…(0¯¡gl­ib7iŽ‚ø:A`x—¼ýcKpU–½ª™F$¥Ýl–6Ù·g7k—-‰Ñ6¸*€éÌ%,~”Pô‚‹ð¦šP(«[絮уÄ08•hGéÔg2&& ŸëÆlÂ~pº’‰ìð¦Ä2%—ŽX¦3„:V@3~O%/# FÔ×ne)‘×3.¨ÔŸ›¼%@½ô†iw§Þí5/‰h[a—vó5ÝÿÒ+)¹/Æ¥'¥ÎxŠ"îà–u§dcŠSEW%R€JÍâÛzøõƒ‚Ë1ŸêmÇ,™?7I¹()ëDp‘Á&BdÊ0u=½‹G=“O˜á\•›5KæÔŽäÑ¢ºtÀ1 '¯»ZQ0Ô½óÆš™Dk?Æ#[hªé»îŸŠíyLý:¼û¯°$7¦;†ÚÔ÷Qbå"H//ž,Ž=÷ær_Hu°~â:ñZk W¡Û0þóO$U©ºÈüœÒEFVøPnç`\¨ï„T ¸0ÖÈüÛ~ FT¼ÑUŽ‹Óç¥÷nkráÆŒ†9ÃÔá¡Ë.°`ÏÕ áuMol ¸±¨Ù°¨ 0þe0„EF"S_~†ý›¿>ë2Þßu ßû8ù‹d÷ÿYÝ~›.Ãw‘$áô_£¾} À÷[nF>~KH®_o'þN{äÏÿp¢l9ÿ…ŸÂÍàÅéܼÃÍÀ**ðfB+×eI ÷“Ξ?\ÉFû59ÊošøÒ‘€/ýÕoLºVê <æW|bÿYÉâçw'?ùWå¨Ýï/Bð|óÑF^:RüÂùw—èÂA¼%H§øg§I#q #ŽJv_kÂpú’\è-§JÐy œîÎPzÀ¶q›ÿth£¸§Õûðɽ€Œå}ˆAõmÏjL{ñ( àðOPA±‹rðV|~£@îûÖÕÖ‚_¬h^¥áfÈ›ûxŽø¼Èáx[§- ea~xß“­´3úE%˜ÅÃth³¼%:PéJ„±¬™‡ ˆí1i¹àMa‹ac­ßôÏi™a¨”úó–‘€‚ö^oò‚ŸˆZ$ŒlΦŒ«è¦æÅ;©À}sžRÛ•û ?xüæ•YÁ)và.roû„¸ û,F>ªOCÏ E‘j @~ðÃ'¡Ì\÷p¾‡ºöH\g¸;rÛp»z^„‹í£èª—ìÜe54ˆèE„î¥sßH‘®Èt¢åŽ7*Z/@,1½c‹QVQ/ÆöëkÏZvôÅaÁ‰ïófP±˜ø8øîZÓÉÙ,é#Y?p”ò1d¬2¦²BF›nãÔËÐ~5ófØ6ßkÀ.ÑzBÀŠÙ€·òê{îHöòn(µÖ.µŸ¶ƒÊÚà']Ä€$ob(U™æì~BKN–!½Ùô šHÚÀ5‚º2Z±Ä—PÈ‹qË®¹Qá-¨3Ï4— ˜_ò+þèîp°‰“hsˆôú\xë$¥Þ׫l]F;3͈rq'T´gn]ûÎé’_DéND¯[3ïÄ4Ty³næm‘ÂÄé!cÀ" JúåMô/£¸s"7Ç«˜bˆxW¹ÎÍ ·½¤¢ÿÄMFð²äšù¿¶ÒÜ>{2Û”[Ž +õj™¥’”ûQнlÒ«ôÕ¦ÈØ&ˆk—@B–èXªàdAj¯w$c´GÖÀ3àžÔv€`2Œi°­WJ‹ÑÉÍÙý"ˆ²‘Y¿%mñé™êäbþr(Sõè$ï«ñäB`0Oó´T¿UÄ¡Ó1“œ#¢0éõþU¸3‹Â[ˆ¶D*Ÿübµ]Û> a¨ûñDÛÑWoåtzï$õ¿PN ?˜u(ý÷$ÑšèüžÂÜâÂ;¼!ø?{“¶˜x?öá|v?q<¾žÕ_é™ÞÈ-;[G¤3ô¤ ß4Xß"LƒUÏVŠ+ÒÕà›aþ샵0]öûÅ‹ÂÏt~)’¬×„_£Ôôç5,Ÿ=ù_ÙûǯYÑn~ãgGº~ѺâƒÛo½°ÂÂØÝIž´v´póé‡QmE&¶@ÿðêØ£^ìóh‚Áˆ."ªtÔü5­ B™_ ¾…h—%ïSú?¶Ÿ6¬Í$õ²¢mXÍ€ ÐøšÂ)à.<î÷§ïqî¸ñÉžäýò×ñh9Ùýß þãqôÔñÐáËîblÛÜÁ9²øWÂ}˜<žã÷e tÞ`žƒ ­(¿2}y(}?f~ôíh3§ŠIþ¶|¼V²ï )¾Næ|´Jã¥J¢Wÿ¡.,æ õo¿›N)n‚Ÿ°;Ñï ñ», †±lŽšT¼Y@øék¶ƒÉpÜY‰/ƒ¤Ärº¤7|?Pý4O¿½ñkÔ{<àG2·t•-œh•ŃvÁ²#…f…|®&:Ußìþ}`¸RßëKŠé6UX®™À¥Z®)ûTª?nô þtÐl",©KE¨a8ý¶Ñ£)J+‹P|üÝ (pª¾´ü^ð2.æúNp3¹œbUþ˜×È%âLî5R»{ K×OÑc.£x€ „Ó4—ÓÛ_Í5e5Ô&Ûß\ÿj[+cxÀ¾Ó/Ž)I¶èÏ|øÕám~j‡Xb¡"¡”E¡ƒSÊ„k3tÖnî<—8¸û'T1*Š¥ÞÍÿRÉÒëD9ó‹/~x?]s,'—n~1KÜdæF%‘”´}´ÍëG[m'ñO›è 'ìjäž>÷ºòFÄLù¶À|Ž€íK+±ûŸÿ–Zû{ñNkàd ;1júßÅûËm¾5«;ÝöX!¯Å£Vtr;¦<Õ}6'Ž/LœºwÕåÿ<ì C?O©xÛx(!×8‡JöÞµ°þÆ?y„g÷K>ÿY¢óá³tÙTM]|ÿ~:sÞú–[D_ÞMYðÁ[­ €uHñ‚Øh`-|ÒÁÛÊ/LÂ:uzN2­ªÍiVKº^<(¹ìùèr‰q›ÑÜ|mä0ÿ‘ªÄe@TGk^ÿ EŒNP,re¹ÉÃÒ¢¦Ø — ü`<+@UqÅšø&Ê·YÐ#ýr¡Ä1¿l‹ß9ô ,¢BqüVæ•ó ‚ЏV%±Ó3ÃÝÈî4÷¬zqëzÓKŒ#æ­t—~òê9âGÅþHf-føÚø ú€/ÄÅ69Èë’ºrã@Yr,Ž’ ùV\uaŸÔÊ¥â¿x¾º²»Álµ6‹ÃþÖºTF9nLõùñ} r µg›—.-L×®µv@lä0V´Kúª²ÀÕÑ«á‹E®šúÄŽÈYÔYÐ7ÃY1¢Š%¤”›7pòó©¹½}P`— ¨bÄãÏ':<%~è•?0M•oSxq€e…Xk^”:”îˆø>˜³Þ &®‡H2 ˆ»…vžõ°»3< VÐæìéRh¸ct$sÐÕ0ZKàúó*ûç-.ÁŸO”“õg/î<ôôßY~cñò¾À¿…qÜJ‰#3—øÙ×SÓ'ž!°èäeñRêt„¶*}5’ff—œzô!ÕÕ—2[n­ø1q¾í¢š{Óч®„Ð CÝgÕýðú®Ý1¸¼]±¼<øRµ …7£ Ww[9ö{.l![k­áuýÃÖÏÄàlCï‰Wn¢P¢-F©º™!¾{ç`!$ŠâÉ=ì™F¦ýuýRùW¥C;e‚þ6Ð;Õ‡¿;6ˆE4‚î[ª&èÖ=® Œì#eŒl~öE!à]Kó·½’%ú¿¯_?ñêÿÞ‚Þ‹ü‹D«GåßT™* 2– €¿þ·øgˆÎÿ]îp˜­9Í|<"Á¡zí©;Eã2?NÆ!OPƒ <Ã~í@3ôO˸Ǘ§o†Ÿx'sÊwõÍi “™ß bŸšÔþâÝÀwßô/x|òˆ¯¾G¸¥mi"%¿á['~â¶Õ˜Ýw=+>¼&ÄÜH:(M><Ôpÿ½ägè¡MeC1Åªê ¶Ax¹ÞÕë}ý‰vîMˆ>} , ¢#«ì÷Õ½Z¶vZÝê˜ç…GI{#fßbš‚ð‘5çú!œ#%—ÎG©hHFⶃëfúü ˆoðˆ"¤e¬ô‚ÕÈ£&©JÞnåÜÔ ³v:3Äzî'¥A¹Š‘MVH\µKÏš3”¡¦’xd&r <€AfNê)íTãÑ̳±h²ú-¡© "Sžsõ-œŠtEç–vðluìþeµªëzjqSC¨ îq¬9‚%!éÚ¹– ãðp*sýƒ;²í=J,¬@(!!ÝßÜ›ø¸˜º( ¹›¦êGï?Ï-!¦Ó­ÒÛæìÈâtj0ÁÄéf«2D{v&åñÐTâNšy3NGöÙ8Wàiú©¸ ö“'ÑèÉnòuaÓ¾g§nô¾´j?º@¿¡k½)k-pø×3ξÁ7¨ÕkÙrk`\ß[A}Q«P¶Æ”Äá2*Ç쯻×Å!¸KéÓè¬RsŠ®©ëJ !xù6ª7`x]Ge_ô&:Êâ ,-ëfvˆGàç R—Èj÷î.üž\Ç4¦¤BÚ*IFb=© CǺޒj…ºˆÈÄùHºsiÐ/2ÏZ„Xà\Â÷äž"±«'<Ž"!ž÷!œ´'¼GCŸJДg²MåcÛ¤<N.ÀØV?ÊvJê»k#AGBæ’UZoT¿¸/”à*~7JŠ·¿éB)v¯’IL(…ŽÌ©Ì¸†(è(8¯¾Ûò¡¹ú¤Ò^¥– A}%k¶$Ý)i§¦üõà®Ðƒ>`¨Š\BMÈ òÍrõA£|‚ËsÌ­ÒÊ\%/˜¨œz-ÑY—ÀRðM9ySÁ—ONií‹{!„Ÿ0•õH"mòôx•œ·šÑZpãÆr|<Í/“·½*Óã"µ­ƒC¦~øý3zÖEP_Æ«No­V{þ²¥þOPe9qä‹ßÕaÄWoutäïóxøû‰Î›Ê<­àáÏ€ÓÀõÌeqø‚Oš=årööà”b'®ŸNmÞ\©zä}¤jKEQ3ì$Ylã]f[–G_é2%%‚Ls5 ÃÌìG¨Þþ’ò[ï©_¿óÅŸ–ßp øÙ«Ç±}À¿ø­g%ûË?›õ{8Ö‡~}žbé|ÿ¥:¶k>rr‰8ä»-27º‡7©2®{§úK'n")¯þ¿ÌßO…©oº+þÖ8«v *4«Û5*SX?ŸÁ¢w” ˜réIæ['Ð…ÚËw?Îpóf³èºÕ{«°8ëwç÷ç£}Ï#z®ü’Ò7/êD³P5ãƒPÂH×§ž©ÌwÅ=湻Ϛ,4RéÐ ówáT&Uö›å,÷Ï©{ `Wõ.fÔ@oCp:S¨S…‡»ñËúî|4\…Š–,ä~ÉÀŽËPe‰èX8 ÙgMû8wàÌÍw~˜gÔýNË–U î>œíÑ®™‡BÐ9ÁuòÛyúšhó qZÜ€¡m†} ÀÃèÕbaà!äm‡ç.QTÔtO¾O"§ØÈæŪŸ!¦Ò4-°ÒxV}õ<ɤϘz¯eM0¢[kh×lðj—ô¼Ê~€©Ó›×{*×g‹‰BÒ‚«‘eޏ•Ãf¼'¬çrÈÝOÍÂ]rï\ÃD œªÖD—ÎíÛ$ñáþif5N€ /#ê1Îmf¦Ù«áAQØn†á(m_°%¨³Ò”/ô|,ÚB…ÃMZäY¡œê“÷Òçç—²O 8ú}hß-ÿmõ„€™|¡ÒQ‹&ï­R’bIÛÛ3Ùâ 41[™æl§^ô”{¡c±”1}…7eÔeε?8½!}û±H3¢Ì‘oø)RéW½Ì¹¸È{š]_Ø;¥—@ùj ­ÆÏFWì¥eø×CTAñH/Y>Ón³ÚøA‡–޹ ´2õ¹¯£‘sýé=dð7*³…‹eÜ¥5νJ®L,ë£)Dܹ³ñY-Þ_Ügýߢ8u nºDõSöïc¥òcìd ÚY7ÝœÐۀ햠ÿ“;édœ+ÑùõÑÛ Ø„|T§ü£Dç±þkîg§[|–ULßá!ôº9€1ZØ©IöÍàµlÐCR€¦¾,ò&E"Èãì@§—,Г…X¹÷XöG¹oØ3;`ÔR aeúdK«&¾Ç•ò´¼‘é+ß“·nÌ –D BÎ*íÌòƒ(÷n•›j'à˜íMJZõ÷úeù]$ÔcbT¡B8? {ˆ.ÃÔ”‚ÉZ’‚wÝÄzáÃS)°xn\k¿3vÎ TãߨbxX Oº ¬±&òTÙî”ÈKÆshÓÉËt¥mjT-Y6GbStW`h—ž‘†´awö¥e»ºœÓýtú%.ÝD]°ZÁ·ED_È}QÈt ÊkÇ6NÆáîfئęðê¦4A[¥úÔðh@ß±¯yoÇ©b¤£b3Dͳ´3ôD •î8ðÛÈA7fà¡ÜbÅ ß÷Jx§õÿ ÙÆÍ ?œñ|Üw¤ây®’ ¼ÊÃÒ\f]ˆß KqQ ]KÅÝϹÕrö^ŒYÃ$2†ä;a9OÆIKóŒ¸xÛÓD†Ÿµ ¦üW“ Ÿa‰ÉžþöÄðþó'dÏ9Ûßå…?ûÓÕ°qŠâ ã}ŠjÆwý´ÙWŽ~ÃSÓ’ktL¥ÓDlòÐë<˜"^®2 r:¤(Î cþÇ *ÙÑ"ÜÄæ› :/ÝsÎI©ôÝ[œ*°¿~Ö3âîÀ0T¹×yYþ¶f°†aüã•c?,€g[šì]ÅOã}s 7¾5Ç> `ÌÒw´»eý¦“î;Gñ;1Ø®âf{äKÒ%=¦V³ÊV>²¼”VÖ·JhŠù®kšãO+i|š®üIýO¹¬_ðlx—£¥>(ÿÌ¥q@ÇÞ< gæiä÷'pZ²±Ý?céþ³tF¤¯Î¿p²øÖÌö7_ÉÃ#ød {Ãý¿[ެßvÎ|ÿCü“EçñEôëóíÅÛœ­Ñ9­™7ÓŸ°þÞ3R™¤¹Í3‹9†Éœ£åQý¯¼~(ëgLÇR&$`Ÿ(=}2%…úúQ~¹lÍ ³˜ýíñÍG¿ÂgpéÐxóø¾ýSöë"‹O~óÍ ÏÜäà‡Ñ©µÄ§k“YìUKÈÖ¨#„õrü¦çñÄ6Jºga÷Ýés™«!JKmÂäêCGüµXÔ&(¼VE³yq (&3³‚Tï÷¾šJ › ñwe'³c¼„hÉAˆlS¢¿MRá5£û° À&M*ÁŽÂ ã2øpSâ“c¹Ä;dÅhF&ü1Z6pÔç°ä®$§7{+ìOpÍ ¹¿²Ç˨þvUôFEÞ@V#h´ÜáÁƒ óú‚ô:ý—SÁ0Gƒ—Nb’rcxc-±².V*CƒÍ Ô,Oa¬™sÏ2ž~3p0É´¬Ð<˜eyˆÔó4ÞÙJ³#c¿º~»¡²C®þA!ôÏ(8à&ð*èõ&rÂgèIn]ˆÿÜZã“8­yVqüé™Á(¥X¨5ª˜Ô’aï>‘7¥Ú…Vá•/@,àb†P`D8ðY§êÅ2oEk‹Ì1º½Ôl’³1. ƒÍØ/ÿÄᬎèÀ›ªÆ¹Á´a½o࢟gñ¨ůK^+ž“à@ ú“‘L &#»³¯p°yMy8aùÖO"G`ÎÊ]Ý‚WDé}I‡u´¦Ž «Ê’elËLhóW…ÍDÔ”4&v?Í´û@¯²•ÕFB*¹ã }àö0¹Õ |1ÒÏØÖì€w¶¬oeÊüØ‹Žf»nÊ‚F!{ÿͬêiE1'¹±`,k¼F 0i{â Çfs²r<€R$p*-V×ó‘í¼O7êß;{¿ë¾`ñ@s ‘⮇ówƒAÍ[pÚVtæþûÚaô!?níëÞ6v ‘œnf¡6/ïÔOtŽqÞ‹!J¹µž5Ñô¹TŠÖr¦JIu-÷¨¦Z 1!ùÃþ}ýûú÷õï+T2ô“FÞ¶ÌPHÿë›· )*þIë¾LDÝC21ª  {Gk«l¦¼îü³]°=·¤ÀÀ(º­àâÀÖ›žÐÂá)ÂÓý¯De¬òµ õPp°|ØV¯;à‘–8—ˆ5?Î}$ê4Iå%Õ´ÝT†µ±1ÞÈìvV9#Âû—q2ž‰#\H¯x[dqƒú`7¢î·Àê4 ¾¡€QHËeÆo‹7ÊãîË¢ÔØÃBÆ'Ìÿµ6ÍÓz%e+³éìÍòQy«·+‚´NÑOÙ$fÝŸWŽßndörÚDùÎÔSYdˆOûaåó/†ÒÝB -Á´×(…L5 rÎÄ£r#*lÍEK$Z[ôHÏ)dKa3!* º–„YH³úrwØV4{‚r~‘6£½ ¯”ûÉÒðP´ÑÉé§³ue[^9XºG³÷êÅ>¤~Åîgw¡°.;|îVk-$ª‡{ý!r! ðs6ô»_} ¼±Ì€)‹TÄ('¾YÙräZHÆÚˆ±ˆ4–Áwz2ÎÒðÁÓG7ņ¯d›°ðloRÈ¥[°5—FžuîØbØ!ÜŠL}Dø' G%˜fí«UxìªåަšÎëš®PÌ“£0—*8®ÃÐ?'…¬îŠ.A»ÄÚ(»ÎÜjžpöãJ?ÚiÑ„“’‹ï`B1z<”v¸°À½Ð„ø#Yóò³JýÄ.žKåÜèïžÄq ~âzòŠx‡¾§ãxXÔ8؈xbòÆÿ5¢ó«]²;… ŸÐ¸m¿.štú«Å!…λnSé*÷„"¶þiAÿC'êÉõÑ2;Ê®ÀC8݃ٲâ5¤Ë5°ˆÿ¸‰;¹º :Ý]xqÕk³Áò‰;³¨¨Â¹v–dŒA· ² Y¾&³Ö›êÎÐ)9ÛÆJ“’í~ß0ûêîyµŒ„½„7bÂ.!×|6gRI&Ós‹‚:øÝdkœIŠ0Ve öj¡"0æûOD0|k•<,Îmﺳ§³_t =ï¿j>ÂñNóˆÕcÇ=,ߨ¿¸©þ)ü—Î ú©W‹S¨ŸbÖLXþ㟚«t÷»¸VŽ˜÷¸«/‚;ëZ˜QñŠ8«àZ)+šräYÔ¶/µcÎ^_ÒÑúš‹sÉpøF·p_öYo0ÎÊ1Æ2Üå?%$Ðþñ”ÌGïLÂã âgŸŒÝE Ä6‰›[Ðöõ©f<ùÖñð»ã02dÌ|Ãì}§á{>þÉ/ðÓ`ÿõ‹û§?=«üv)ÍØÿ|fµŠoü¶üè¦üâ\OVàÙý+KóökÓHÐܺa£pЯà¦|ïÀ­ º•ÐyùžÌ–˧Óv–Þ~ÆÇY2Óžâ§‹ó¿Ct‡íãŒâq¼€g«®œ(nŽs;ÂÃ@v~ÖýúÙ°Ÿû²Ç𔟉6fϱ³“ýêüìfh•â8÷ñn¡||öÞ+¥ïÜj»ŠåU…Ràô|6þyK»|´q¿'•óHQAçþø`Ö¬}€@Іóô¾ÇéÈ|ÒÞ©ÅüÄÞ`DÊû£^§,ý¼oÊß:s>ûZ?»à¦Mðámb]7‰-Ã7=°Ï–âa“Ò¬_èß^^jþºßìƒFßœ_¤Me|²Ÿa3ë¼0¦®f’½h‹m-T,-b²Gq›ÕÀpÕâV‡iaiSªá"þÏv!ÚöÇ0hhæbu¥hoA–M™cРƼ¥±ÎwÊ{ð™)語¤Õ9^MCyØÑÞ@~L¸Âbƒ¯Ž—C!ÄA'"1 ÄÛ Zãj¶·Ü)VŽäÕ¼ ¥2W¨âm6û? ;Ñî\qä\ü€U3™ÜÌ~³,8ÏÐùÇùô<ì‡ayi¿Ù'&ްzT†µëÞÖþ$Óg ÈÀcPŸ4~[»æ«7_iýâKÄó“eü5v|8Îkú²U³5߆o÷þ§Žw3 7‚-•pñ>ð}߸[mS÷ÜG¹7±:v7“(ÿm¢ó‚ }Ï"þTEŠJ¡µÈ{¡Ñ0(µvh!¬¤jâ úŸ@;#šHï±Cð”:dÿÍUÖaèQ¬±S^пõå-o  )ÿ¾þ}ýÞ¾¾ó(ÙÅÉÛµ´è)sg,2`˜ÅZÏ£îÚØ*lÆ®\w"À9‹ì/*¼íÂ+°­…e–{¢ÿ󘜊ï—îÁÖj H!w¯u'÷Ræ£8HŠ„Q5·ÅlUYRäP(Á— £ÆÓX•_¼+®äø´óù¨ÚA[ÖœyÑ@ñéÔ‰8=t žãæÆ¬‚•o´QöÙI9’EÂçç^*`¥C±ïÎÖáØÕ¢sà°|Ç£ÑAfLçëÝõéCc›¸…6 iï‰9Cå»âÖ*/ÓÀzKåÄÏÔ$JQŒ>Ò[P9e­4èͬyWnøúZä#¥×'7çN³uDû±=ú¦Æ¹µ‰A–>'¨ËŸ¬w›¹¾õNÅáÄÉ‘ú È’ «ñ<„w°5wHmSÿ#ì'Jž ÒÐtÖ\>×lçöó‡¯Mˆª4¬ãa-ÉC:oÂÑ˜ß ôÞòiËÄñÈÝÛC86ÖÃǼG×”‹‘.z¦+H4XZÃUN@Å`-xrÌsÙ´`ËÅaŠ‹Â‘h¢“¯ÔÈYÀï‘34 Ã$Kˆi ÆïÚÍ•mkÍ‘÷”½ý·ÓÞÝÍàª/¼ª2‘€uõJ¢E #ÈÎsŸÐô\ulÕ ¸&VnƒÈÆánVƒkk¯µÊˆÉk€ÇfÕùÞz!ô‚fm}Cœ ¤Aê-(A…'nd;¦YœH77)=û`çRÆB<+‘„zª¾‚*oDôÓj¸“5cšKÂ1É(ê@ÅΑ×:túâ@á$m<•X,+\üXu æaBu2LPæJ~!­yëœ>'IJé`ÉTrz S@im °þ*™³Þ^bgí(Ci«zù‡K”ÙûA}óŠ…Åò÷Ç‘˜9ʼnjv "¸'íBNx“”¢bŽ$fùMSiÐüSŒ]Úœ íý¦3¡K÷m­@xøŽ'ü=ÿÃ[ ¶øIÆ3ùk ńøS¼­¿Vy;”;W–µHÝQ µâB–`Ð×üouÿL§¶Mß{Ýžü‡ÛË‘nýäÛ’õ¦$^¼Ö×»FéYK æg}ÿÆ„û¯€ˆèxFŠyääðϿѫ‹ç+O|Ù›_4]~2xCæÞã£!6 pvµÞyHûŠ´ìî«ò˜R‡“ª$—£ñ‡š9wr¡üD…Õt`~¸/¼ Ü·Ì‚}‚Ù-\½<°-qï?Ö\.|ýxŸªböÕ&ÑzøÒÂ+ª7qëÿ„!2GQ›¡¶ÍØiͬ¡¯ô¸»²ŠA‹ûhœOh:ÏÁ+bNG߈z±3à=d5Œ ÇÑ@ª×… !éÍž#±Í¬O€&µŠÞ<Õê€×¶ `^ý5âÙ¹_ÿx[T"1õÑœÊ9ÜùBm«d2ã0ÖྸviVˆZ-µ[]MT°0E¿9¤ÂpF¨öYq\ªº¥­9ñÅͱEáÌO°«šÿ¾þìn/òÉýK^Y­¼ŸõÞvç Õ²ÏÓ]¬x¼{*Ÿ4cƒó.Õ‡&“åÑß¾øö«© íö­šW†³-8Æü=¦JSÛ,jì*º*øÓK½'œlŒñê\LG…$œ¹jrÈ£µöjmJ©ŽÑ9P‹iÏ©à zGÊP”/rË%½íN‘{Ápv3.µD?g^h¼odž2~¾˜Å¸ó®Î¬ÎŠ!núd|Ve$!»›þGs—lÙ”¥Ýoïs!òÎµŽÆË»#¤ŽgÒ§Nàí¹9B d­Thø–‰ß,çîÞ–ãqÙtµäÍ‚á‡×ú´à=$ß d¬e×iI½ç[\À÷·k+ôÁüÿhïùŸNfživ8éñÙ€ôÞÕœýi¡?žÆ¯.Mä5gŸ O1V  ¤ãƒ >¥4–þÖ#®ÉæÈÔ,ú}.LéãˆeÛ(ŠÉ~P°*ˆÅ¬›TA¤nèÍø°? CÚœU{iÏÛ_xZ7€MNëàëªF»•¦>¬×P) ¡À¾ø®ö—=#^jÿ‘07A+ðö®Ò¯ë:}Uˆ˜»%ëÇë ›™Së¢Ó ×j­&»Í;®l nyÝX/<ØI3‹ãînèx§mÎ\7˜Õž â<L¥áÚjäâ;™*¦¢ÐF m>ïÞ¼^þ¿ÏRdÃP$oÓÙ¿ß>ÃÛ’uûr‚Ü9Å4‹æØÕÞaÜù­:wcÑÄ€'Î }˜)#÷Ùê¢ZS­@žíyœ¤ŽÈy?pomV Ûi°qÙ àeïü¶‰ˆ·-ŽGè“B:ÞØ5±VF©"ð5CûoÔã‡Ôä¡pÓUºrGèèÀo‚?;žü°,€0nõ¸rc†ôÞ7 }#¹(Vû#‹÷÷»á|PYÖ¦®ÜZ)üÎ#(é;~¶¤óÿ¤äºk™|Cà½Êâ[ ·õ(ñÓ~ï½ >I«ËÀ“+¼w…}¤¢#Bè¨vBÆqp¤M‹‘ í.:ï]g#_üŸÂhæO6Ò†ã!µžÆwPþÓаŠ1AÿÃlM§š€ðâáóðyo°‹^¹v¡³4ÔDzbWÄA„eïCˆì$ÿ@ÿÿ}=É·¾/¬Ý.:Áÿþ/,˜{F+Λõn ×’© C/â»K ÜDVX~Ç!×iÖ; ¢»^}ýÞ/áþ]KC½ÊáœQÇÄ3”H°ÅM¶ÐâZ®Í–¡4CQ ŠWUuú1”uË5êÜå:¯èR•l‰»Êˆ…’É9Í*ýE<P!µöÝgQɧچ¿ð+ïJÉ“*½ ¿…Äv‡/æ(CM q…ýË“e“O»èÇ Ö8Éj{LßOéµ1·;hSÒJîñº¾]ߣ^W+T‡üý{pª×ýò¡‡â½î‹_%ƒÐ»:”¤Ìýy„Ì!m^#‡Ÿ‘âodwrcè‡tbi#ZÎPŠÖ©wkV5P'Ï”ç>Líÿi¯†‹ÿ¿:ß[b;è:lZ"éàÔ…£š1:£@5”&ºÎ켄û‘r÷Kæ ‚p-ç¾– ‡÷\¢:(ÕÁ­d2® ÷«±JËߤ†¸ÄZݳ˜]»è5»¿ŒÑÄüÅÃ[.¥ÊwÕ¾g2Ø6ôbJûö­>uÖd®PÕj)h+1ûAtçÞí/êÝÜ„ì=R9Î~×Ër™œ6/U " Õ„cÛ-X醩a[7f ýdñÂLŽÝAXn<¡¦b$–œWº.Ùnô.ÇRþ``­Pï"ŽÀ«ïÈÀ È«•êÛø±'鮕QÑûü GÖ÷" U¸¯ãvº÷©saÙ78`wPû‘iõ¾aGÃü8™™KeÚN|„s«k›²Þq&èÈO‘·Œ¨ªZˆÿ(l¹òªÄúnÞ‡!_•´öÖ '® ŠJÜ›’ªü¦•R¢Þ2µ-Ç„¿-~æ÷³Nýœú9¥Ä>ë¶õ'Ãôº.±Å|Óæa1Ð, ^<†–†{¤3·X¸¬ŸjêPÊ?Ut~d2à‚«/þäåºHMîÆ­O6ò /$‹t ϬWŸÿû‹bæò9 ]X¨!N@Xÿ6BC YŸ—³‰ïz×mÝRò¹ƒÇ0< Úâ=Oò Ó~Ì8µÃž ­û¤™&ƒT—FÔçʳ‘» z͉7ó†áqgèÎoqz´ç/ΣbVðèp¬ÊÕ|x?¿ u·¬qH´ˆ¬!i?aÚ2Úhª§Ú†µž/¿ÃÖ‰=Úê¨ñæm^:ØðAƒ—{ƃõ¶lÒïº-Vœ$¶6‹n¡ºÝIõ™Ï™ãË)¶¿÷*žwzpý`'šE r5t·‘ÒÛSlpà¾A™6JFÊökƒË*¸d–ûß‚„6øPNèãJ?«el˜U(rå&ÏÅ9Péëž1§/y}ï ‹6¼?s^OöNB5ùdO…‚\ºë° C² ëô<~¡7VM2ȼLþŽ1kð|Œk´Ø8›H!ÒÚ0r$¯î¡…5÷´žYTUR/âßÜ;Žäëoý”Ã=û»t¿ «%<¸.r”[ò ŽýC¼&?ˆQÛ‡Ÿ³7‡9kë î¼c‘ªÄØ2&®›å•—«ÛZV‡ûà‹pªãç;þÿ{cÙ‡tŸ²;£ˆ ã|¥Ñ ˜Ï¢j7«¤Q+’’”A„éG¼¼vÚ<¦gY~ÿºƒPïœ )³Un@aùËÀB@sd– –çö¶Ód#s‹ž©œÀ­µ)g¤ÖxJ'ã¶'/}Ë< ­Ô¾Ôa3ÁCo7 ßÀ>Ñ]]ÕT˜\5"¢˜ö3ÍC*Îù=¶ÕöÛj·Æ±‹[¸e ÄÑ »à,ZÄú½âÄ?1$veæ‹åˆÝ´½¥4ßVm8ú©rY ¿™S1o„ý“€U‡ïà‚ÌŒ© TשŠÃ½F‚ŒQëŸG1¸Ý~§m@õxë ÜÞ¾ƒ=óGý™ € ýš¸I¼kµ†ó»áÐ[Rì8HçÃè¢MW™ Î9. C$Mø†mé3"(ìq ô-`Ÿ’k‡ é+±—¥“›¡PC9È?™ªad‚"éÕÜó~Y5QsÉÿšM‰ËQm¡¸¿Mx‰Xžoôá˜N±$=6Ñ@0Y.Ä‹‹g?ºñ©šÊc 4zÚU¸ùè €[îø° ½}µ’½Öó•qGÕJ”Ðÿ¹”ãY^ú7 *TÇLî¡==V…7ó‡Z,¹/ãÒö^,rY¶µÊè1'ÓûQæ[— Ó+!yAñHÍh©še«Ámsè [.Ì•y&hÏ=\S|pµ÷0ým6Õÿ§B¼›á=žÈ-׃I—P«Ïí“'¢¸q¦ôl1–LiYV¬˜ìcEsÄ©·d,Xí4:ëã¢Ás{þž·Óìí˜Vd¾’Û³:&]´0$ç ©Š“.1ÇhžEþT;ÖjÈç¥LÜâ5©ð^E€GlH9°±Ýa‹áÜüè)àµùß ó|Úd/jùý øw¿DåcOuá÷]5ïQÔ¯­ØÃ[})OM …hþêÙû÷Ëw¸J{\à£gÀ3éùû„$¤rrÝÑã;ã—?è| ^Q¡{íÛ¶h?sOð]Ñ•Õ{ÑnžÒ¬äml ‡%˜Ä®»Â[j<.(!îâ«¥ˆ‰ý8æAü†{?ðïë+«ùýÀϪö3ì…ßwö)/ ؼ" øÕç¯{Œ‡/Ú?×r\?Þ;co‰Œ9óÌ\¹Ð^Q·ßüÃÞe!YC·ÇÍQ Vó– 7Ê_êÿ2pÜüž|›(ÎÄ) 1Ü!Ôÿé±ÀÙá:{’'àÄ<^V º9(ë3wy/ ¯¯N…II c£|‡B»““µuE†÷ü€í!Û£s…`Dó-Ct•…Ziwûarf o{z¦xK,'ÍpqWן1˜z¨™¤wŸ¦ÜIª˜‘ò=Ê-ÓÞÆr7âû”øÁ¤cF\þµUƒæ|™Š•ÓýçþW±ºÙ$-òÖdC«ŸKr“N¦ŸÓ¼•R/¸í.̱ǭ¾Å_Í79˜.Ê„(e”fë´›z0Ø=lë–ÒS7ßÁÁ—÷ë:&Ÿ<ÛÜEn…Ai÷âÈ7=9F'Õ@O HÁÊ MÞe›óÁi‘%Y› j¢‹]\}~zQŸ¡Øµ”Ö “]a¶.ƒôF²ž©°» [þÂÔ—Žk&˜@~Tqë1·ÖZ{½Z[PÎU6^Ê?[Icö ÖÞB¶aÙB掔öV›ƒ]}[yß *›gGU(7@:ÃætPddL¤+ÌÂùªþ»†1P@?PÆÛT]ºk"|ÛŽ ±­™Ç„ãO Ij³€µkDTND˜’í@²-®“ž±†ÐÒŠô•û/©ä0wƒxâËÏ,zZGùŽÐ¿þ`Ï4ÇŒ †äôlc]b§«¼€õÌqí7ÕS‚Šj(Õ‘”}Å㻜<ÈaÌÉðŠœ&½æ:+ y =Ô¶9wŠvÅ5ÚÎÌÂÆäÃäÒ4 µÒÓã+RädfPÎýã·ÊM[‚øXƒæ§à•ìÁÆ0«ðѹ­Ê4Py7Š €}^EÐ ½ÏßbUÿk|YÙæ1õô?oÓe/’›ºàNƲOìSàû€aÜÉ =PïÉm€j{оzzŠâºÆëýÞŸAgè&ÖŽ¾nSN«*I×üŸòc:Äî.:?&&Õrj™{­«æ–»\:F·Ëá¡’^¥)œ£˜ñúõ¨ —ô§ùÝî6Ž—ØÌäJç]RU’õ„_¢á÷~ÜAzøøÊ¤îQ»Îæ£>ÁŸ€H4¢ñÉÏÿTŸÀWÂü¢AÕûóÐöSváGœ…É‘¯^N´Ä|$è 3§÷öí`=osoYâ­=ø­KÑ|0&½.{º«¬0·¾Oh@¿rÏ q@@I½;nš€ãcn[UÜØÁ‚›—knÑÕÛ°oA` "üjàÝaSÞ˜ƒP*åhIà/«È*©ôìg?l¥ü}>7ô) ÚÍx8Õ–š¥5ënƒyiþ_—&hz8éˆû„™ÕXãœrHsêí}1|g“Õ¥v´§ñTŃÂüP‹e†;…Ãâ}'Lÿqì:Õ"ߢÿs#‹/bîßàÔIG·å›nò3žWYz‰¬s®`¦B^éö–ßÔ5*Ô ‘“`e&®üæMC2@‚SMxèoqÉRó]P¬ãýÔÓÁ³³Ï1¨ØA]LÎýæIϰúAlce-Ï”vܪ]ºã íÇ«½^¯‰=¶){«!¦Ô5^- פû{% Dâ4±’øÎ0‹F‡Ìæ4Ìý9¢¼o‚Na¢€¿1ArUK™Ô[Τ†œZüK6ªXúµ¸”Ü$ØâR¬0u$Ø)è·Î¨éd×Y»W•CÒâJè[cà;SkÝIv'– ªÎ[_ËÏs“…8Ñ?ŒŒŸVß\0°p÷°V!î<_­µÓYùŒÉãäþlJþ7Q†þ¦csóçÿvKïÿ¹>µûcé&öÈòôåÏQ0ôÍ×Áûó=*T2Lì}þ‹gDî•m*HöˆûWë“¶†³¾ v:Olë +ûê°ÂÜ¿¶Iÿä*ˆò;Ê Gš ²Íó{ ïüzÅUÅð¤MT$(þ8àÛ£j,†òèú?Tt~J“…B'H’ hS™òôaÕ /Ë¼Ž´»C¿TsçÁ¹ßå1ØŸýú¡w“®X,HÖ<0LõqÑgÄnÒœPœmâœ,ÞxØè5#­Wž¢w¸Ô\‘7.kÜxØ,ïR qŸ®Å›Æ‹ÉMô¬ÛìbXò&¡9Œ³Œt¹%ã‹ù¿Ì˜ ýKaÔdú:¿´ôMÍÖQ²Š<¼ŸÇ)Û0¨”õT0 .ÍMU"€©È÷<[p."°µ!‡iO ±J2p ô¥C׋u¼I¯Ãød-Ó­§¸ì[Âû@!üú™ƒÞ¥ ŠúR?O¾E‹¹Æì²_œ;vèq¶6UñŠª†ÖÙ“–"?Þãi,| Õ‚6u‰¯¥×¥tHÝŒh˜t~ ûaÑF0Öv¦^'Qr2§í.ET½e@Ȱó§ÛzÌy»nkc뼉i¬Ø_ª‚&Æq0{¾Ñÿù–€ wù?¨UTè§{½üìsq_j\Ì´ÁèƒÓÎ ¯µg†ã°û±¥ÐcO·{{.a¾‚Ö ZÙšÝ-tra–(©pëÈfÐyÙ‡3€±UYÎùäv*ô«e©ØtïME/ÿ®_ÿâÏv Õ(ò—n(G2²ÜsG‚¹o¡¸·Ü˜¡¡µöj¯£0S_RÑø„µe8¯*µÍÒ èöÞ¾œœ*Æ Ùõvâ]­û¼.QFä¹u÷–ï¤Þét±–EÔqÀ“Zaúô=¶À·­è·ŠÿÁZûyEƒ_wuy½ýz1ˆ@¸ÿå»QÕüµŒ±&Ùø×šÅþ§†?ùæ¹ïþ«Mžþ}}”,+ó¬?ÌÇ×ñÓÑ%¨(/ߥ·IÀTÛÿkjÏÿé¢óÞ=Ñ4{±ý5ÊUbpê#gs—têƘÛÌ:ú~%0 1Uc=|¾öÏ©Tùƒ~OÂp3`&úÖØ^ÿwàø…á§¿#ÿ²ø†;[ RÅ&µŸ§1XŸ®Þ7߸N¿¦ˆ÷dMÃýó”¹éõˆàÄ`â8­Ç- Œug0l—Kmžàê@ÑmÇØ”µòÚv‡~g°!VÕXÛŸ3.§é}¡¡Íz_üÄ»bPu ßÖä—¸nà{à€'k šQ|`U€‡}Åâï'/­.² ïnù\Ì/«J0yxÚ–QñÒ@˜÷xÙÅo!±æJ#TøYW²7ÝÕþÒôNuЦš¹Vº¢ ƒÒñD!0åt¡:QÂ{ô¿ÀsƒžËjv½Ù×Ýîb)Š}÷t1ÉHyߺƒsÚ»<§Fὑˆv8ÞËðÊ„ü‚ëZeÎ50YAà@¿µäxõÑrcjé¶½H\kCºzîLŠÏ \+êí™,¥±÷!;³PÃ8Tìèøâñ4¤ebÜóqwëР&™=;r¹É «ovÁhÇæ6ç§‹?öf£¡x7{½nÍÄßwc`Y‚è€ÐüäN­ _²~Ne·=z½¹Ã‘î‡öÔ¯[ <øÅ Få¼; ³yo!ªo¦@_¡Æ‚¬ô6+MüqÇ»`i=µ´UV Æ®m±53öõmír£ÌìÜËÞ7¶W;œšXÓ0ëH½šH#·âÔ(b˜³Ûª0ùS4ÀIÂ×Ó.s7V.iÞ²—(¢Ú¦øIã!7‡ãõ¯?óæ…¢åEt¼Ø${ø2…·#‡àM1ÓCéóx ZuTJú瓳Œ¾k¨"`E çIPÿg~ar¼Ø3e×UB*U‡D”† p Æš¢çªB¼ü•Eøù™Ýƒ|’¸²ûGfiÕsaî¿z¨cÝ¡«%{Ê)Ò˜²šS¹uô'ŠžL“hþ+Ü{·5ctã)ÞˆQ‡sNEUct…xJr¾4ÙÈ$Xù|’%ÞXéÖüîì ¾žW2tíãÚcãþ¦C­Ë»þí-·9ñHÿÞRBÎ>ç¡à©qŠÏz6Yd²š$^Γ]±ÌzäËÀ¤¹-ô Ò=òܦ#I°ÓZòE²¡Gòð?Pt>àÝ9Y±h^mIæŽN ç'GåMÞàžã³ìZ¼H¦°µ :”£ù޼ÕDŠºeÓä¿¶]½*gœ$ãG ôm¹êfT®Ãžøñ 퓟ú9ù»tþ úÁ5‘Ÿ¸q_ËwÏþ{z¿ÕNÿ_vÞß4†–¤òM[Û“"ù“›à¶Ùô±°J˜*Ž nIýb` '$3Ÿå%“ÇÛ'06;Ñ0H¢—%¤„ðôlLÆ} Ǩ›šÈñ õk ˆ›½%=OkÞ÷\nQ§qØ*cÌ…íFÿ~ù°QYuTºú¼‰ð|×[²Œ°¿û6ÌíIV¼W•»+5Xêî—.êp£øæqÁëhqÊ”ÀÓ6L‡”hµì‚ùïü$èîr’ÿ&¸ê6æT‡æ” Æ,í7N|t4>-¥ÞL|xÀÕÙùW‹À_7PÞ\µ^*ážVܹ?ìwˆâ(ã4 b1a7ëPC‚óötÎä¹H·FáºjF‹{ºéº2Ö}Œè®Õ/á]Õ¶1¯.­hÖ1Iý}Ú¨rœÖŒŸôE¹ê­9$8]Ì/•™Ã¢v*t¢(ÓP߯U„ãªúè߀†ªÌ ZzØ*MD»$J‚0¦/ñîe‚®iS`" lŒ®5ט‚‰méÁ ìÇÙH[}) î¶åÂÕgë2d3ÌyƒàŽSÅ#åô¼ˆ†«©A¦„p{¸š“ Q±Gºa-n%C‘û¹~¥Á¨J9÷s@díï·~–Ý äoÆ[9¡¢`•ZÈGH\RÌ_Ú© ¼€$XÞÐyŠLÙŸ>чíÇ8ûmí^ÿ:[€kѹóú4´ãá—xȤ´}€tòEµÑC•‹<–þdç^ŽÞ“*#*“1nÁN}ÁZEÉ RˆŠ•’Ï'®ÄîË÷ZAÂü˜ÚÓ‡Ä$8Ú—Œãí9QúJ5IfŒYüÍ2Ϭ_JÐx›w})ýóÃ’¨jwŸeªÚÜ­¾l Ö‡))V±ÞÕ6§ùËÝGÚæ\L„Qo$+¾ÕÄÐd[¸n ‰–!óööß :¯‹@åoµ8”øªìäºø¤Œƒe’.}¾t·YÌð0¤}µxäƒkø5øç>ä¯tõG0á)Ψ4§N•­ˆá—6”™f*Ö #IÁ-_KñCd¸±|ÖÔàÃ'GµfÒo²@ÖÏa¹ßÎ OBÚvåðE ˆŽ,¦ì qdgÏ?¹NÜ΃ñÐð·7eCl 6×ÙÀô„YÊv´,ÚòBä&·èö1AWŠiiC$—h¿,ú·-‡§¨*ÄÜÒ¬¯+ù‹ â¶%(?ñ¦÷°&XÇö—ðV—&õÇcùC±w²¨¼›ˆ0g÷µ|!¬dùy[–´ f¸&ü@w:Žçš9`%9[F²5¸›>, ¤€žÀO±zØHÅâNRžË¯R]`]ANðS†¦ímžž‹‰eXðV‘,ýnW¾¥sq³›ì~ÛBʳ —úbÝóCè 0}þçsÚmžI6ö|Î&÷& Èý/e q×ÜÀù\Q7kÚì_ÄgøÔeÜ}Œ™ w¨>)VÜqrØÜSY‡®`.(,ú'6þŸžñóÖÒ·¾>oõÿ‚aØïÒ(¦^»ü¥ –>0ïÖžÄÀ?jzOïaVwŽßV®åŒ¢GT*E!ZÄ­¶– ˜‚?i4VaZìó ºÛW¯N|l§êλeó¾ l<Èú·%£h€UAÀ<×KÌ' Un.Œ#xŒä’bAå`7¼È¢$N÷îÔSs‚‰Ãº/RЉ b5s.{¿!=3(cã#hy¾Í^²¬¢ÐÜx»´Y•J´9S†jð|½s—¦»—'àéîðêE8ÑGŒ)r©‚¤D×?÷~M¨ á iR%èç7*‹©•L‰'gpk¶Ÿ™SûZ÷— »B8«2×8‚lÌÖÐðBk¯ô·e7ŠözµÖ *¹m“ u’2è(P7^gfIU‰üjòPÂŽ›+nê`e(Gl¡Gg%/R[AíƒÃ"IQ~m`^Øö8Lu|W Á(ÜϯžµJáHš‚oà¢ôËÞGªtÈô"·²†y×V9ƒqÊ´]¢s‘3/îe ;'wä"_ÅÐJÔñNm¸AÐŽÇMžI„á#–AþgÓœüô¾ž11$~$jìœEô¹lza<–ây{è’keõ lM®ÄÇáaÖ˜‡ò³ˆ@ï0Š•4ô¢ÏPŽF‰iîÛ®µ›ÖÉa$Å6àmJ–ØîG`Tõ…€#²QìÕ*r“ëkÁ´VâÿÊ€ÎöÔõ¦“Å,é÷Ã&žÈµ€nï!ª{%χ™jÞ†Uª³TeÛóøÑed ˆã¡`gOà¶Ç ÛîÁ— 2+ÝkÍå^Aö Ký4`I¶¨:)Ç¬à†‚þñ¢óAªúä¹Võyóvä¬lBO»DóÈJfܾ| ¹ ht× µ¨Y%¦¹ ',~r&g­w|Û x S/‹_”ú÷õ'¿~pþÚì<è =h‡ià£O~Øœ’D„G Ïߺ`øö™ã-»KÎSùÆ!æ<ÓNÊ1®. c¦nsóÙª9A–+äYôNìùÏ)¸h…ÓõٕͧŠÐÂ\ìÿÕ,B’ÌϨâ o¼^ù•£,Écî*>¿«%‡µ”: ïÁ#+0¼­X…ðG ÜJõºÚwà™ ÏYW@In’é²–€s¾€}r*n´5îŠð u¥ÿÅÆ@+Üݧ†±$•ej¡Éƒ£~æø §µa?MG›ß*Ù=Zh„£n*è kü54ž`=W¸·sMø (ð0‘ó®fùZ¡N½ æY÷ö9Nñq.¥hºXtÂË)«tsöFA.ì\yô-R%ŽõÒñƒ Ìã“:\@c­BT0p¦],{gÙÖˆ è¡miÄÆœÌ€ ŒÕÆ†Š¾ŠèÍ6rëÚÄ]–SçtÐöcB&CÜûÍ5¹)V+»»ºBvxµöŸ?~üx]DÁIøÏ€ái# º€íÏÊ5o·J4ø[z/sF4œŽt+†{ÚoY*Ï;¨½U¹+…¹"_’ˆÍ°‚¨R 'ª7£KKŒ~<>~lÝ9ʰ¡£¿Áýƒ”–i»…¡ß`N F7 - !&¸s¹e©r˜DÎÝ—¬·AªÇGí9=ÐÁ£+7÷"$Ì#¿¬LbP##Ù}ÆAÿw­ñ± ×À.¹!ľþ­ô†¥úw ­”dQî(?h „ˆ!Ëu¸ÝR™cáÇÂÀ÷¶ü¸ŒOóœU±‹Øíe(3«|óôD°×AždCV¡a8çýÑNÝÏjÞ3†(×ÏnÍáÎÑ¢…0:ÌÀö8ô|2n޾͗7…Ì6ê‰m‹Ì­ûl³03PèÅtN F›DFq¡+.Ë+¹ÕšÁÍlKD "¡Ä (àñÛ¯2¹b.#+ä•‘ §Àøá]׺¤& Ì ‘=ª€zÈIÖ=œ&"C6á–Á£óéÙ´,ÅÆ£j±¤r}©6ÿ2ÓÿXÁ¨ÓÉ«´žÇ0©Ól†!Ôg4Ži ç‹<úÅÍv%Ã÷›Œ¶XcûnRa屆(g¿²ÅBÄfà¨Å¦Ð·«ªòYÅÖ ãý!¦€×­jw^¯ .1Y-ª6 öj ªŒp*ÉÕ5ü–·@vôN¼ó­Zh.Ý Àåv[•Ø¡pc҉ݶQñJµö:,nea® ºNËÞÌZÄ»X{À&þ"/’öWžó>4xðþÍ-{Üæé¸OŸ™…V>úôÖ·½ úìÇÐÊÓof^W:È<>À0Ës>ñ÷”ŒÏò·v»·l%sèÚªñI¸>†Ò^ä¦â:«Ê]L-›BŽ ÉÉ’¹‘ˆ‰crlÙ«áÇëõãÇë?ÿùÏ×ëjH’b´ ldñ5ßμ{Šjþ‚†ˆ¬J÷õœù:÷½¼óƒ”!T€ÂNŠ*,:áN¤Í¢Yƒ/ë¤-œM¬ûòñ`ÑþT7dƒ¾ò߃¶2C¹ºëýŸ;¹Ñð-‡îAÆŸcÝ~÷ÑõÁ¹ÅÊôɬ]@ôƒ´œy3Äð=‡Ögþ>oß·ópφ_ž?"€…K!VÓT1ͼÒh“ؼ]Q]cCÕ×oå¹½mz¥à×Ì™ê”Ç&oUµ­]×µùZ^0¤$ÞX&è8/Ïún›ÛìónïÑ2[´Ëéà =þ¢QòÊÍÕ»Ÿ}ÁžC‡,Óõ´† Ã8Å$æO6J›7áaœj×ì/éÿ%às@óÓ ¶õL–ò??da1ª¾x¶5R '€?yl?ßxnzô¶›gõúÞÚüØøä @±Áð¼e»øùc¾P«:X:hw¾5çð¥ÉÎOvžþ©¢óïÄînæ?²»Òÿáw™oÜ¿3Ff Þ§=„šÒFWB”â«áV£He’àuÑ{G3|ý¡l€%€þ}ýûúï{ÑgK?éÖù‘9%éPZ…ȹA@Š[ ízûUv.*Þ’ZU“Y·ÝAUSõÆ>ã›i”‘l´ù¬B5¶È%DAl“Bz‚é´ˆöל{ÿX¥ ÌBö~ú’%—ýo—Q9Å,}"‚Hâ>÷ xg ÊPö\ä.ƒ‡+Ò¢Q²W¢goEµÇü¾ Ú=¢›1œ}± <ª§(¼­ª[]aq‡ikNàY‹[HåB¶ö¢•zÍêÚÄxÀ¤¾V6®Yø$ž@ʺüäÅÚo¡E~,½*Ïžeð·xE±¼>« °[ȪOzÛ8X’9!Ú<|œ¾Äҽ̣’˜—Q¯–÷¿uü,Éÿƒ ’Oƒ1•uPéÐGY!tçLýqšJ¬ëpåqmŒ¯mõ‘ ˆb³äLï€qšðìæ=çÇ–w®Mÿ_± q L°sâðÌD{çì!Rlh´æì Öœ“êØïy½U”­úlŠÛ«á2úºÍæïaÖçè$Mô{Â.+ÖÓ‰äð¥e´‹ñ¼ô Wב˜¦ ӱ’.’í·XZOëÈŒc»^ƒn¶À{ÆìG£'*ó¸……zrØ· Ô±žYÀJ]§¿©' §"0ï¼õÃÃß>ùcAÚ¥>4l8fÔêÎ^ä% ÆÌ|„”G¼Í œÆ4\÷N:·?‰ûkÙ méßpäD¾ôêÉxË©¬†I P= ú,\·,èY‹¢ 'Ö/l•µ¹ÞˆvÝ)EXeæpqLèR;Œ§!P·mVϾáÉ‹´‚BåÁ.qápÎn¯C?®Ä;Ë™5±å%ÅŠdJÇÖg«É]8t6kDcޣإØÎ[ôÿægâqæ¥óêMQ%?_¦á…VÆ*C24=“ð识‡Ý]Þ„òs­ ’ušÊƒ,¹“PàùçCT ¯˜W ÈHò¬µ$zæ´h¦_€—èÂ=ÔgÙ˜•7(˜ƒ~È÷é\ºŒL_á*ᬆ×hd©03$oÞr°“¨Ì'Âv¿P”KÔ?}2öÌnýû¯wKñÁ½Ñ^í;£¹Äò 9L¦Vœ“ ƒo=ª,‘ ÷W7÷G—Q׃4Å2ҤƦøQÜLÍÉ-½þPÕ5Ê{¡9›œwÁEq½«H vúÚ«—;¯8>Û±:ñ‘÷ö™ŒÉ@R,±I†f¢;ºÂ9šò%ÙSUµâe¼ËU|k׎ˆ…¹Jžò!”2AóÊöd9 åæ&íöéQ‚…¢ÛÖ“ ÇUèwŠÅEè†EŸ‘ƼXÛöo£ÏÃP»‰ú„¬q«`2öà=xRÖÃ¥×Ð0M‚g5Û]¸ÁdGÚšV¦Vž<éOx€.ʼ¸[z£†æ jõ)²FýºH×%OoUæ9t‰ŠWGE¿J©¼QßM¿cÒÞ£p»óõØ6 ‘ó’l”ôV›,ß±HŠ-OoÎ3gÕHˆN„ÀiæÆ<º÷¦s·H@Ý¢þ:®—§­Ù™žÑ:„Q”‘êŽ Õq=4œéŸË€ÕóEîçU+ë°G1,‡MÜú4Þ¢4ŸeÿY48g;L´Âg®—¦K¥Ny#˜¸sÓ}$ñ…ª'QÞÃÌ¡6½O™©ŠýszÍ,TF\ Ê{Ž"Ò Þð±|]‡75/DÚ‰/DŒÞ/ýá¬!_ ÛM¤›¥æb°•^çáÞÚæ|hV´Xü„6Ž0ÐØ¶Ššª1 K¨ZÂÚÚ#síûàçØž¦[Ìgõ·g²ïc¨æÇÒ1ƒ{u‡5¯N²õ ©ˆ£(¶NT íÕ~¼.éì5ƒäea¥ìçx³].…?zݹp(ªJ>½ªS±ß¹Uæ\Àe2¥ânû/›t,xÀ±ê¶\ÃìMjL1AÊ ‡É“GÍ#HèK7_-1;.ž]\*Ò‘à>sa7ΗøÅ½|§Ø”„Ëp§¨v<0˜ì¢q8~›¦¿Â.jÀ›ãÆJÓõv9e¸tà‰ÞýhÅ5ÞAµÝîg|1ó¦¿ã1᳟â‡Ïñ¦oDÜ„¦m6F\ø>R€oÜôîïð¯Ýy?¦×]úƒþêò@Úw}»w!ô¬,û:e¾ ¤Hü̱8 `ÞáS”jÞ¨)¢º½jÏŠñø™Q‰ÿÑù“ÄÓÇý¡ ä}Jfïº<¥wùƒo¿ÒêÍÿÃzïoˆšq.ù°É]Œ7øWèß×ã‹oS~þ#~uÚñs9ñ—O› ì]˜¨¦úYà1EéüZ8yEÖÞYplBÙæòÍæ8ù0Ù®‡ ôA¾åˆµHÓ4Ú·Ž7Öîîd@ä ßî~óÓ,ˆ¡”LfIÖÆª6„«ø¡S Fg*ýöp&\ÇÔQˆ’›þÁKø ƒJà¦Ä-ú0É.I×q3ð >QæÂ‘äŸ6ÉŽÑ[„'íŠM™œ ~ÐÁÛo ßý |RÈÿn’¯É6‘—ÂGÚæÂ&ë›/Ì+›§ëw­E2pðƒ9X'ÃòùPòe’b´ª†o ¦šÄÞxófáÐq+/iê^YéƒÕwìm_Ê,sÅ&î ÜpWxü£3á –G' >~Ÿp>B“Uüð^ÀÛuÈG†¼µjKð…GÝÍmã»ÎÝ^õ›`oêéÖ_ý|{‹L³ú`BI}+ûNB ÝY1#:Òe¾ŠSûÎYv„±(VÇÃ,Ö–õš·z5²RÚÍê=*!­Ã^.teæêk’ !…K§¥PåÔ+áPŒÏ Mídr-Ép¤ÊÕH/(Å'©©mͨóF`ŽÊ7ý€mÜ8•Ø䓿|Òs, :Ü…"­T ñÔÍÅ 3_5z„I'­‹ËòØàB.¶©–º<ÏÓS˜ø0¹AÅvO‚çô5ª:…'îÀ¤™ãzU 4lê«ÜN¡`Êq…T•¶›E“Ë®4Ì+| V?N¿À­Ãpn ~Sf_Ø|ßù^<ÿõlÇô\¥> ý9Mt¤~ðÕûõ4t•meçet&Tc ù=ÓñÈùGGœ¤ªCúY¸bÓµ¦z/µ D3UÂÀY–>êêÞÉX$×ãYC ±ž­#ðu“(|¨Ë<»M0Z\öjíG{½~¼^mKŽnå"ÀÌ:{ëÀÀ5ãåá]ýÃw[¬˜z”FÁÝ(¤D Üb{ÛÅ Ý Ý!q oéü5 ° Wüósg·¥4B~þ^\r`mý&SÛ ‡¯,E=õG"³@U,Ì눆µÏŠ‘úŸ’»JG9%wŸNP¡iúø8ËóG@®:‚YÌLºG{B¾pØÖ»>ŒºêˆÞôiÜ*DóÎw½ú0@Ÿ,¥Ôü¹Ÿ»+îeJ*xhvŒOÒ_¢ÿ ÷¬¨9Þé=?¼æ‡b/¼ë<—–ù™=WOÀ>–1øÉËøY— gŒ¸Î>Ó4Ï €Jßø³²U]| ËT—4úÜÌVa{.R ·vn¢Ú8G”’Ø Í¯Œ'|y1?Û¤7;úw‹Î×§Æ×&â‰Bßáþ4”}O)4üy/Ô`ã¶¢)R†E‘‹7KªŽDÒÚÌ:Ÿ+ä}pÿ¼âƒßå³3 ’,ŒÁ(”Ž vR<îäÙ½ÓŸÑ`¼Ã¢pr Ý&\)DLÅ{ªÜ,Ná«ú@U ÝÉ—!Êm ¢b1PQe¦{â­¼•eÕ»’笢Âcæ}Ç×f® ¼g}T`<ºÙ~ºK$³Ð©ß”[õgR(·éh¸– qZâÂJjCóçJ]¬ \Ü'ê²´Ü€úäK†1E?û6˜þ]Ø b?ÍåEÒŽä÷­å³Þ‚ˆ…¡3P¢os(í»ŠTEÙu1|ONB 謽lêós<íŒh±öSó–u5@@«µÀnçÁŠÈÔL¬|D–¯P¿áŒãP/ïm¶³²d D.ßu$ÿÌ&f…=¡F¥éXŸ&ÖÙÁíÿ¹í)¯–Ò)À¾9®Åá×–îÔÊ㈗¼˜[°T¬QSŒm«Lö…/ôé Ø¬úl<\°™§®}ÿéŽàCÕeyï\(?³)®{iMÜ4©q¸;!Ö:ÿO/DRæg${÷ØB¯,YZ.9é*±5CíRÕ‚ß•ùË»æñT,Ër8%ðô3Òçb-\,æ)ëïœY™Ï`hOLžæwøRéèz&Ñ‹fNjŸïi­GKn Óµd¦ÆŠp¶Kƒ×ÏÁ žÜй”ÀÈY³e½¹×ÑÜtXhõˆ¶‡ hhíÕ~L¹ÿ­Ô¦ç¨)”}®¢|(iø ´ÛVv6>Xê4•€íɃÐÏkùfȯÕ÷AÌya`Ûh·©J†ã”ã,Pïöy#™÷X±5WºÏmáK”ØêÎÝÖV+…ÌÍ–oA÷Iaj€j®2>ýnÑø8áCuÙ/#ž{í®xGœ’é:‘ úøÕù,¨Ætðì¾³½û*¸(²vë3”íw½hö׸Ý·¢b´ÿÞÚ_pЈ}¡-’¿FüàÞ„½c oî¿`£[üç)΢¨ýåÏòœBßÞ¾?QtÞ£Ò_ýü-Ý@U\¬õ¦šºN}õQ­¿2MRÿñŸóâ»wv5#ecdîµñÙ%€þНo=¯ñ[cÓ×b:žïþÂÄŸùyDðTòCkî“/»A¹{`u!ç›Km†øÇââ? “€=p7…z4Ô¾Š4#­Mrc[…÷B&…™ æeÅý,8mý‡ ø5AÕ þvX­SŽdÝo\Ëf,íöÅ ‰õ– ek†9eÏ5i -"’/¸Âæ$ÁßWí!.À:åÉ vÏM=N¸{7æX‰‚[‹àMÎ%×±{„ô躣G§¬æõØætãšI'‚3$ûºoTã‡õ6'¨—ø·¾S7~s°r×J6pR ¹]Ñ|ñcdžiµ\¬ úÏLýe,§hÞìÜyÿG*€}Ïáã'êDy ´Ñ•Ušw{ÝÔw4Ç •Ÿ_—´ú²EÊ”g"$2€o˜ˆ#™×ó¦â*I!.š0S(„ìú­|¼È"£%+úÔ]ѱ¹êº†Qõ)ŸzgíŸËð`…°†)uIý41wƒÁÝŸBÎ`É/Û…N(×ÖP‚ˆxqO[Þ ÷=4mö€¢Gˆ‰PÆù›µÈK~SoöX¥¨]îëb¸¿«<o²³5;t±a#z|ùCvC1i£%|6'Ë„áÜ™ í€ig½Æ÷7šä:«€a¹¹Óh}ZÎH²X³æL›¦ô«Ï6™ŠHˆ!”ë×ÃfTñ’‹&ïò-φ=¡«§ãíƒ VDx¬ú/– Qo þ›N¦ÑFÿ©ã‹™2§übv›]l]I 4›JDLêJ°ŽÛä…!OAøJÃÇ›h˃G®_âþ¸ ÜLì“!€  ¢)5„æBà§Æ‚mw¶‰@ˆ„ ŠÑÒ¨Ù3A›/T¢q£‚q ¼ä÷®öËš \ûÔymöƒOZP¸Ž»³©ÛøXëã!{ï xz2G­³Ì{€^—{‘â]Ùÿ` ­;òðå_…) —§Ò›µ5¹²§}f«&ŠâÿÎ77$|•K%5‹yÖ¾þ/?2Óõ`õæS jk…ÈdÛiå­¸ú›8Ùû'½ýÎP|¾”VbËV;w~quðÆ>¦ÚÄë<þ^Râ©ÀabwVôð`Tæhç»ò“g9â0ºxøê Û>ªz<éÍÓ°G=xv+Û >f¼º?Ý ˜ŸÙÜrŠÝôÄ h Dÿ ÛÚ5 ûd›®ª 3ØX)ô¸~ýï ܳ >Ý4SŠr4,Ñ`‰GÅ•»eÐë¡y³´Bàðó ‘r挜ò>ýYM_!8ºH†8ï)Ì?2ð%\\ Q±,f˜Rà![U |U`ju˜ÔOåÓ;$ÏËëfxè¾:ï„ý{]ÌOçнÑ]‡;ÓjÙ™ jɾˆÈÏ‹¥»tŸ†»¿fçûiË›QõTJêÞTÒ ÷ú›:Ý“®k=­»;̤uö«guÒ•±ÔÒ9H7k€a¯„dëYý+n4þsçÐV4üö¦÷º‡Añ2¤PJ͘D†¤ãì'ûHp}jt±lžÁCtÊ4ŠjIÔõÞÙÈ[Ä94X0äÿ¹Ö§á ¼je,ã~pž÷Û…z7]¢ëWvì ¨å:$îΠ*›Ó`+õ¿ ½Nÿ $Mgížà¶J3ªzމ®uÂêÉåhz…ÓQ¼¬>¸²æ›ð}+\Õ„õ6L&Šé¿»kôúy ¯r·kµ[t#™ðÈ’9Á«ÛÍJìÛYÓ*¡‚-yï¡ÜÎ$”¼´ O-pò‰òPĆ ;%g~#ŽHÀ¡Þ8gW<6n‚zM1KU*R]#íY¼„}‚¶VÃõ…lf=X¥\¹jE­õÕþµžcME(ö_zj¤SI:7b¬RK™n¨b{¼dhhÑÉu2ÁÓSd$u5wjžh»|°Ð6ï¡rU7D t]Û;Z@œ]ŠÚÙ¥Ó£r˜´r‚3iü¦fÿß«ü{Ób˜P¸©/g¾0ih|} …w‹Ý²x‡2ø.]ú7ü,T ßþÀ@ÕØ@2ó’t޶ÛÿéÇ0¦|Pøã4“vL9 T–Ä(V.*?' ¯ÃO-n~øÁH èÿf¤<’0GiÐF˜-6¬üÒuX ¦ÓŸ3\¢aK¦YI=æÖůü_éƒ@nÁY~ò†™åÝ¿ý+7&ÞxšoN䧘bèaà ;vêÛ÷ù»4‹õ6t¢Üfm(OÅ;eI˜àöâ*mHð‚Ç–ÂM?MUcch²0“•§¤5ôŽæ²JÕÉA°Û"yñRQµä)Šwxt=ÙØk*ý€]“8û\¡a#›YG¶¢Fœ2õlÕ‘Ü’fD¸â²çÆ&„E3.ÕŠDùÂ«Ú ê²Ðºf®L|÷²MFO±uv—¶¥`D»BŽ ÿ‡4ü#ë>®Ú?"j4öœ€€;¢Á¡=‘éPlfÈñ@›”UTí–žŒa1+¥a%ZÝ“ïvgá‘P´>Ö¡õjîOþ¬¸à"¸ñU4ùÍ”9.Ï&¯ÿzÊ—eæÙÅtC1u3Ë阌pt™$u´_·8FåÓÙ‡ðû(>Œý‰|eè;Ñã¡Êâ!Æ}t`ÿuœ‰ ¨Ÿ°4M!ý|œÍ·R'´2U&Møs9ïb-j§R¥'ÜÃÀ¡ç6’PŠr‰o‘áf©ÿÊIa¹é)ib‡Øl~Í< 7Ðé< º£¥Éì@`- ,¡ÀÒåy¥–—•ý¸-°kZÀ…i¡æòÜéõ´ù=Õ~jEE}}q5Ø[;xÝÛhmÐÞà¸4šc˜Aê>ÌŒuÜšnXo^`L&jçD6Ø¥aÆÊ8zù¤qÆB<—Ûl-fŸÐGXœ[¡d4H’E«ÁÒ\лæ±RòG.™€¶†dÂ>)1Ð(úÿ[¨©ÉÀæð6Ó%#xyâ¾KóÇœ…1<3´À¢Ê-"B–S“©usûÞèýoˆê˜˜d^_ß5^r‹°¼d¼æWôž)B࿈°'ì¹3Ð¥·'U§ësÓè*÷¼„Ç‘ýi*(ä c]š¹¶ä“Ù†c"f M!48Ú˜o·È¯-V”¦Øé«7J~´|& ®´mÝ[ÄáTÍ,¼Õ´È¹Þ—Ïh¹;&ÃpÆòvD…@0 ¾>á3ij\½VóCÆìã5õ­)¾ì¸à¨ í¹Ym,c˜˜ôN€W÷_ðÄä™Hý1SU˜d2ÉÛÑ<§ÿ/× ”"eg¦G(æx?ŠÒÚ ÿ¹$ÚsÊQ-ÇɤŸæ¿Wtpo|¶m¬CZ5 ¡ÑÏëBµ³¶¡’~ڀɎbW?¦'Z|::Ü4Ó˜œès·ïà•™þíJ]pLšd ô¥üëc­³÷ç.G;~´åó¨°e“…ì¯x«ÐÐÑ‚¥ÿgíÉÁÆp«õµ@ÂÖí¢º–õŒ3ø‘Ⲹ˜l¶Æ‚­ú½PýfÊGpTè>ku£úmA)û !€†zÖ ÅZæâЉäe0ÛÕô2ö5¹®²7,šðÉ&¨9£Û6 áQÜ .ß ý=¢óéæÞ‹â³d ÚÑ¢ÖAçÉ€ž2aîðû~Võã„È *F?Ýæ@ga·ŽFÏiK3/Iméb‘“{˜E†ê‹ÎtѽìôÀA—Œ¯H¶Ö¸z±ŠUÉÝ9ÚMبJæËîÎÜs$CªœÄW#î7©oEئW2ˆÕVxŒ ‚‡KÒånE+<§’]6›Ô9(@/uHÓK3K¨=ghr"f'­Ù¤]Æõ)eOcv^ ÷¿’Ñ™Ž°TJsB%@£ ýrÔ†7Ô«DG4a`!ÖlëR›,ìG:z+fzfq7l]¯¬ªãÕÌÊ57úðéÙ89¥ÀrÝûžJàAã¡`+o&ûÞªÒœömºF=¼a]<œ±>Ȱ„x-¶§AkK@c±Â½‰Æ2¸Jd°È>8§‰Aœà=)¥o¡œÊ´k7ÅÈ‚4US ®¸²×ÙJ¨Vó©*Q¢‘Vc˜³ ùâQx÷€h\p‚ïàÇ“?ôHû&#Ê¥úÝ~Np„ÄÛÌŸJ›fÜÿú³AlõÊ wuö`«ÉÊLD•.Ïš ‰r]P¡â?Éådž(gñ¸œ³éOH‹î,8ößOYȉÚ"»3zÔ+q?º5l.—ÚõÓP»«1ór¨Ÿs´">¥1¦Õ:v|ˆþ4  ±Àª×~rblß#ZQj­¿~Õ_õׯÿ÷ªõÒüïâ~ØQö¬Ë¤—óx?R¨L;©«ÿ®»Ú˜}c§e „ îG[9¹+ì\M²™ QĵK<ÚÀ¼¿0¾ìÞ µV|‰ôsZXŸ­~’0»ú6þå€ã÷i•ËqJàÚÀâ©þðŸã¿#Ëð‘Ÿú]›çµymÍG{þÍk…ÿ[‘vuT+k VÓŒì"õlßüþ Êÿ4#|ä1ÁRÛ•nZ^Ýôñ-ËæàÎ( Ìêe?Ö«}0ŒÒðz@¬“îkÕ%ý£0¿Í1ñl9½ûýÎ §¿ÊozmØÿµg¨MîÕý‘¨Ÿ›†¶¶o­ƒwÐ:ñ²_Ø©>{šoXGÁ±Ž‡*‚!àÕkdîÚzƒ‡Ï&Mêj¨Óó;ÊÕ‰çèáÑFà|8UÒÛGÔKµ¾ôiתDîdªÞY|t¦Œê@\šFLºdÃ#7õgÜ}pùQŽÞ[ÈTqoÃþdß6Šõµ0Øw_µr^Â~4¦°Ð J‚NVlyxQèΚ= Ç‚ÙôKú[bäFõ—ÃûßÀN:ªfƒ']Õ†ñÙ¦:Ê語£}èº!:éx‘$1:G's´9l壨ÝFø‘ÍFu¯‰wý½Ãå¤ÞÈàð–.Aÿ+*ªni—"Q¯éáÍÛÙñV:©ÇOè«!ôèxæ2˜âÍ@=Q½/ÙèZÊM ç_¬x°t¿-§»ŠU¦ñfº^*¢k×4sålã›»Gš”B!9Z˽ ÀiZÁl—ªÄÔ'+†H]1º×ì/ì¾Ù~Sˆñ;Ì;¸¢B54#Ç”ºŽ³ T;Dà Z»œ}ø¹–®7D55NÐlãí¤Yáä^ê5ÕÔsb@C`èggü8ÿp&Ucb¯Í*,GÛcõRüÿõzÕ׉“Uµ’Çsv\–‚€ÃïÛÜAë À~Œ³ÔE“È1¯•…±Sï⸃á ?©Çˆ¼ xªõµP– sù‰€ ¶ÁX\_Qa½ë¯’ÅÀåå.ÌÚ1EOþè4K›¿p”~U‡ž6iðÓ sD²¬ÆHÙ¾7¡[1н «Þ¹·¾(û³æ«ã1›$ái›Â€ìÍ»¾ÊŒ×¥½»±AŽ9äqÜ¿å>¹ÒÚ ý§n‚ëÚNô8úÖñê"‚4¸Õ@ZÃØÑ_4˜Øú¦Æi 6:‹—ÙšþæòÕ—µEjX;@’›ÙOÒ‰+Ä =ïªëø½O ò!›åÀíç#û(çBþ”Ï9‡Ó¡pwzÎv 3{2ñI-¼®Ñd1à€¼%ô ÞàáçÞÚþteU‡ÇíÊ/á©ãšé6‰2Ì="*q%¥ìú!?Erþ2ÑydãqI‘™Å–l-Q¹È&øé@x@ÐѶ@ãN}³Ò{õ~˜r³Mºcâ¤ãˆ‰FÕÙÉ©bzô[ÉÇÙê“uÛyÞeïY7‘îõµR™¿vñÍç €ýµ¯=¤ß=/2™ ûmÏáù·"ñªø½Î(øS+ý½¯¤£¤gQ¾ pýb…i"’Þ°×A>É †?X\1EšáqÃã……µIZ C¨˜k§Ü‹Ê Ie—>…˜öL”–£aš^‘k¨ŒÅ&2ÊÇpgcº"÷vôLïÚô1ÇjIU”'c¡”5Fob°”û›¦W ¿b1j¨NøQ¿\\ˆ£À (ÑzòcPv¨ª°{C[ÆæHç+'U¨•Qè X¡ÅIËê?âøÇ= ×K6b*æ%¸«“Ř¾¤—.Ä¿^¨` ¡ŸùûöÀÝÁ˜NùþŽ)á·œº†É‚ÀýãK ¹)„$ƒáèbúŒÉ/¦ÇY"ˆ<Üì÷£ç*©”•+ìáKb¹áí GÞáÀ„ ßå·{á;¥`Íq“z~ˆÿžÿy\ý„ƒCHçR{›à9äÐ^PÀ$Êp1]F}œK'ÈêÆ3¢‹ ±“«}´zª7Õ¾Öò;Ç}^õõª×~ÁjŽùƒ~“@ #º®OËÎà@‰EèhïösÊ ¢Ø~W鞦>¨öáNZ€3ŽÕ†ß0³5:ÄÁøé! åÐcÆÞÆõ @1yƘg4òteø$õ8ô@|¿‘"0ëý‘ÆË‚hhBº€ÖŒ¹­A3VÓûàˆ1ãø¸3³/"ow‰|I·Ný*Ã{Ûzú˜nF" ;umŒ[€Iò’+åŸLèy™3DŠõôqÝ”n†»•ö‘œ4Ê_œ›¬Q¯o`¢ÉÖ[<†{xÃâ“ÖˆÝ36N3k©ÿÖ}§'Unî⎜iRˆ’{†Â$Ë€Éé9µÉ¹i-ŒmÍ€ÿKÏmO ýZý&8›…Ü0ùe6{) ©¡‚Ýzû•’uØa@É]R ‹Óma’)ãy¦v¥“ø·°Œ%·l6`ì×m¯Í9×ÛxŒ.ã-®Â/À™‰=ó ‰ÑÛâ[÷ŵBÍœýdSsìZÚçð·ò7‰ÎëqìÿÕ<¸&×g…Iµ$ùDƒ©¼µCÞnÿBI÷Rjð2ì—›{GËÛM.õ¯…¦?²ks4"­» "z£-ö{G qH 8èYÓúÍ=Õ­¡€ °[Ó¦X6JnœåÖp¨™“è…ûø–à41X//gòí;Œ.wÈ–t{»>Ñþpµ¯P£¢¬£!»ÁcFT{0†~¡ÙšLå%MýÓbSs ØÖÓˆ½02CËçoøýIÍçw’´ñÕ\s_½Ð»_ßæV×ìØè•¸F$…ÙSʤ™áßîwán¯¹Ê&k[Ø_†µ!}•ëm½IÕù·Ä’Žk1il–ò–Dæ7é–V:T´°‡\Aés‹®ÒÛ$žÁrû,?B&Y¬À©F\ù5•Ë âiUÂvzGúûË {*ü%¢ó(óRˆ®€¹Q—$My\ëÏ¡ÿ¨·–nç4\G‰­u‡£«ÒU¼-ß`®·Ç%¼]f—§‹Hßµ±¿æ«:$ð«üûù÷ó—þìZšÿ·ni™ÖDdFÿap–Ó6”34ÈËÐé”ê%¥~ýÖA£Õ#zÎE”Ëü9éJçÍØõa¡“~X´ƒnrOTtÿAªM/3ü{­Ë/OÆ„F/ñ晉*€<$§¯W b¸!*2åú2Wf¯Ð½(`È>u:c=™!ÛK½å1uD‘e®3#]™4OøÂ}²JaYÁ ðìO#ÇC\¦Ím,Ò#&ëÓµ’©m—ião<Ãiê Ó ³“­¾ <Ý;C1y‡a äd›ÕÈHù04OB¬Còˆ˜6[Ôn¡xý¨iéeû£ÉÐÌsÏUÜ}$ŠòÌGÊÜa d’䇈2Llû9c?ø˜bt«v(Š7IÿÑ_­ÒöØÖ˜—Œ1¶dc‹:‘ƒÔ)@Kä†óFkËY´œ´äiu0ú8ÿiÂ_çIÉS2ãhÏð°í¢¡"dgáÂHîÁî+ ³ Å¬()*z_ÔVÂ'Áÿõzu4±vpñZÚÌn§ÅeeÀ+`P‚¤—Øï“€Ç‘á2$ŽÈnTbÚ³“¢‰f¸u§à²?žýÑGç/°BäÜ®˜ÃPº8)~#%ki§vsýuBŸ­Z"IÛHúfÝòÉí$ã|Ñ)@™ù8Oc{Úúéñ4 °#rçÖ¨Åí˜à\5a“’l„}¯]uMßÌ~ÏÑÞÊ^yÁ1‘ã(¬„ž˜™¢±O›ßè&©xkA°»Oj$áX|¢`Vää€ \ë‡Ä~¢ñ¼1Š>Éèò´G4yü³ë‰‚Ú´U1 sdXÏL¸’ÿ.ÓX¹±]N~Ї®[V¤¯x—†£¯ÌäìµXœLf†o¶ÎKNÿ7¹Á|ÂiÈZ0¤_iâRÊ2®qHáÑâ>qÞÿpâ?³µ›¡€R<Èc½òŒÝÑ#Î,“ubrR»—m#—ñ@Ädšþå:8Þ·oG«±7Â’âYpØ)-þÑù¨*7ÑFÛ(³pS‹¡D*˜Ë!—pùã°ÿ†ÌoœX¥)Ó ¼I/œztÁ)«0ëHÙîG8áôëb<ïô ×QaúAˆn†ñìÑUûËHjSAr+‹Æèêå«• ôZ¶ŽFI£:–ŸC^ØÝìN^R<„AÎ:Å,ZDD/ðW“¿^„0`b 'W«šXQ&­ÝKH\ÖzP´ž²7Hm—S[-ïE ‘²S 9àC½zp›®¡ÿ"™îjm<4i¹ ¤Ü9¨*ŠáNÜT® \6V€°Z¥ï Žw$L&½®Ø7§ 'FÆ`ià n–…‰¯“¥p s|‹ ¥4BÐÑmµÓ´2Î4 ‘,7zO€/‡Î–nØW±£'U¥Mt<€ËTY#–¥FZ¼“s±ü˜$×=`fÒÚåÌ‹‡YÂKfá­ŸÓ×›­ÓY,†ôÀ‰ô\+h´ùɧv‰†ˆ•[Ì<=O€¨†TⲟÊß_ÿ‡.zÿ*GÕIÒôWhwõ× °^J¹H1­/j…nvÚ,OÓF5 žÉîv·ÍZ ü0ãÊlæ“ø¨C[¼uª똰L”^fS3§ämÚ›¼Ñެ܉”‰[u¶¼™òíÞÅ#‹©[*è»AÌÀž5lÞ(¹¶É%A²M“ €ÔÜ"g¹ß5¥–è?&âöÏ´Ô#>_£|Æ5}ew&¾†¸A3wÒIÎf¼|´í8ÝÝŸÃsÿÑù7žîŽ£ûÄèÎÐG¯%ùÌÞ¸ñ³u£JG„éÄÅÂ+>=ƒ¢\ØíaúOèßÏ¿ŸŸþ3“¬ëLmçaÿŽ%wÐÇÐR¿ë!•1y¨d†µod[4 .Íõ·Xécª¡™K·2ÑöA1ÇIÉ5¶‹¿½¿1cnzœbè’Xªkþ]ôøE¦C¼_Ù%j—º=v9 E*fп<6eòBú6«q§pcí@…LH6Ý¡”Þ²³'ª€„w+g¼Y0íÝØ’ú¶Þg‘শ Ä.L6uÚ!ôSeÈ× -Þ ;·Aî€ý4›ŠKÆÙr»­J´æM´I=ŸÔ’´ú‘½sé§a¢­CöHâþ¶•hÔLDXÌòð|}-­ïœ¯Î[Ê~çB<‘t£~°T;Ö<(f»qÖÔfï>Ê7Ü«T½X^ 6í;QŒI:ÙmJc’PH*xк°öuÛU|.+˜ãì½A¢\-飱ñ¢ÕºÅÅRxŒžµs¯ér¸.pC"ƒdR¹íòÖ‡qéSÖѶ;{hÑ=0@ì1f½¥³f(D~…`íýÿÚ5ÿ.|5Tua €Ž¦òs0b4CΨ^[Åk'@éëÃÄxæ]×î’3­ûG;Ê’ âùcf†«ð »K;õÂÑ =µ¹>aû!„CCÿt€&h2nkŒË!•lãhEDdk„ s̶ç o@iJ­¤»SÄu2ØÇѲdè«Ìs•&öUdv4¼ä¹°9,Ý¢ÌîU¸z^qLtnÌ,`)V턪µ jœß`ƒ<Âl…¡Ðš¦`‚Ú`<€Ñ†'êt×…’Zµ 3‹lFþëb)õìXÚÞ,Í$L"ý…¨B:I`°h˧NUÁs×€áYp)ø¾ñ%NY‡!Åh6Í!vÊ”áÅXm2´áïqNgÜ6KØ™\I‰·Fð±ET-p$ÜDTN ãLÅà:1qd:c9³¼;ï'u4¿ÀNS*\`½ýü¡Š´yjA;C~QRd¥ÒoJ éÕ¥Ë/>ºÔðc¶‘o¤ÿ1&¡’•\ïË­L§³ô÷‹Î»6àŽQGF5f£ ×#(kÉJå¢Éf÷Šk_lÉØYÛý ‹¼ÕðxÔá»ýù•½†‚9ø3,”~•Eœ\âû­žÅz͈"€PD21BR¯àE6>ƒIµNKø ¿ßпÝT¶áH.Fñí—5meì~sñt]ƒ¼!>àHð×Q×^F,/T´¨èz9Þ/Ö0†lkFgõSR󺧭r-­H¯¥F993Dë9LË”èùy†ìQ—>J!êù¥ÿw}¸*÷:« ðgà9DáA„ ù¡ÿ`æï9¸}ÕŒb¾Ñ°°ƒ’ ‰HX¸ äj†p7ãÇ ÁLË@¢è4åƈÂýu1]À,Vu!¬:+AÏtBм_–š°p ææÖŠ©ÊxéÅ›¼ròŒŒÝô@kUØzxëˆâ]^å^§7úöËý@Ó˜}tµ¡ÿÞ~(Ëg¤·«ÿ~éM>¡ã»Â*y³n'ôA:¾èÓˆ–µá^f¡Š™’JD…¤‘‚pœ£ÏWPSrpBìGÐG´wñßǓނíÙ™a­Ëõý8!^vÒ§  2a„ †”Jܨ N’^á5×eŠM½¯¯ZÏÿ­MÿÜ©¥7Í ‰kŽ“¢ ­ž‡"̶z¯œˆù$f§Ma>Ä`Ïpâo–¦ôµçy1n:Œ^Lj_çÏa–; }âkì«Ñs¸4ù9?»Žây—ÒwJîÁv”d„Åu¹¬sã,]û狜jLÇñ­¡½iËä7y£ó{_ò»…‡šÖVµ-bsÿRïØÀ|*®Pbñ: ? 󭊘÷qëäÈÃép–):–šÀ|²&«ZXùÎ'òw”ÒÿŸÊÖÏ”—¾®Cñt é‘~$‹ô“â{ÀÆWns¯`UæÉŸðß`a®'3¦`¹ÿeo`_Éç·©x­ý¶CÞ‡˜ô‡>VáÌ&Özn_Ù‹zÓÛùï‰Î£,LÚÞ/Ÿæ:fë¤èç)ý8áÚ_Leÿé–7W<Ó¡A‡¤Kïß:œíi †2ÅÒ1f>— ]ãyÙ¹ü̪#d{R2ÒëçëÌÈáÔå^„TΞ€{?‰*Å¢ÓbcðätŠíö›nƒ-ÏãJp¼þšßUð¾(=µïÝç˜÷„q`ä`Q4'Ë "J•7xûÇ0¡ÇЛœ±¸žÊ|„Aº¨tY‚àG¦ØØ1ßÖ jÀc®h¤¥5ç`Ú¶ÖÍåÖ› €&ÆÖaîH–K³­]j6h¯:„ÔŸœÈ—°Î ¼u¢Ùìn.gå÷‹Q4ïj“ ¾,•Ø$ï.:­²§5‰2ÈÛa£/:ô¿½ã6§Ñ" .Ñ}>A·ŒHü[Ò‘U”ƒ¨PBâ«ÖZk}Õׯúªý}ƒ†Ò'n{SXìZ«‚ÇEªYk¦tëöþ„ŽØ„¾ÙOúmkz¯¼Ý­þºæø­¦+|(š”ŸjÝ>4Þ¼dÞXÁ»Žo€œÿ>Ñù·0óÕèÑâmŠ;lj¦Ž7ú@aø¤¬<Û¢`ÙSæ¹»†éUC&†ú¼4,Ùúüí@¢ ôïç 9NÙðØùïþ˜Qq‡j—1¦ØšéaRO*îR kB«ˆšpÊé´ËŸÝÚ7î *®ÛŠAž3·©ëãø‘€³p½Ž´i¥mŠyŸ*ùö’™ó¥M¯.‰‘jîî‚´þdŠbÍ"%qi.YR/çv·3fñ×`A v…(Šeà t|b™"¤´²FkCú@ #ƒÀpKïþL ëí翳ýy¡kyKûð›‘Ò:*¡÷¢„PNí¤Óíÿ]­YÞ’ÊõdÙý·ÃŒuRfµ•DO /(™¿ K¬Ñ-®Ø‘­K2Æ}Ñôjeªo¨Ç7i±Ù äšÔèTr·Œ¥-&Ê0Éc1>#³¸¤MXœ>ؼhA=×)ltƒýý™­\m½¢ÔŒ«å5 sÜ]][„vÓèÙÑbȬD›ât­‹|ÀZ(§¾t~éÞ&œËB(½ƒ£AêÜ4ËÒ.ˆtœO‰µÈ¼(½!”QUÒv,Å]Øò^,º­ ]_°‘ж¬Û|¿¤‹´Ç*Ã{Vq»½8¼ yj'¡ÖŠŠZ_@­@½DCFÌ2_„mà ÁQˆdšž‹ÑDqRy Å‹åP"1ö†”[û|Â.ÃÚŸÍX3¹R8ë9€È£ilÙWìfêóÀ&݉À sÑ8T‚#J¿Šˆ.&^ÂÒù0}d! ù;ëÀøP3 û`‡DU_â¹ç›¶`Ýù ´‡0SƃÚYpM4¼F®Fh™¿ô*ÓëýWÔúªEDÆz[‘e‚õÀ0°´ŽŒ ¶£vÜ™¦´FѶ{Œ<Ór‚IÑá_‚³É~€ÑÍì¿[$-ˆ;d4¡n4ŽÜU5ÖŒþ[ÌQ?Í5¦ àј³ŒÕõw tj½Ä„/»VP)%ÛƒŽÎý{MVÓKuÏ6$4LûŒuq{`GSQ¡›+ÎÞæh„¡9•i³ªÖº€ Þ¿“gŽ5xrýC65Óö×!cGo?„Ê£í!EÞèu$·½À$Ô~¡Mµþ[ë)ŸtÏ“—|ÑØÄ ùÆuþ¢óÞÔJÃBÿy“…jV¾õ‹¨ÞÀË~[´|‚Ìù¸ôÛ3›ß}ø'‹AK©¬ÄÍúf5Œ!’pçIW1K°aX%j­$€ñM×4ÝëO‹Z1{H_€‰Z¼÷çñÂËãÒÎrúpƒ¥^ŸØô™ó;¯æ< Û`ÖfÙ4¾ÿÅúJEE½ô½ZÎÀniÓpt¯ ßï*L¶…™±˜m'ñ^ÑÞnÆ(ŠWKN$Õ'¼_ÚÔ·¦e,\Àç9wÒÄÁ±Õ- fI”¥´a»¬ZàÞ5ÓÓ+xÒ Ò×è\í_?v\èQr€w3-_rT0äß³Cw×q4ºþ’&Lú·q$¶Aªÿ׊jXŽM‹>:ŒB8~†ªÒä5ÃêtšóÉç(ÌDÆv"”Äl»é”R~š†@ºQûFØÝ € o3Åg †©î[±‘¸Ò'©ãÈOÓ«Ìo XÂ{™)¼‡7ýÜ € ê[6ZXDê˜Úd™È ‘ÊN¯©ÿ×ã8ÖÑéãPx"¾ÈáM&°5 ü¨s‰‹pìiïL5¸ö*«¤|ýiqlƒ>êü÷‰Î?+ñf˜R±¯ìÿca·@PðjµLÐÛ÷¾µÕM’s71Þ÷JÉuuP0C¤3ôKœøÔ ÌÚI?ó¥æDôa«UÂi(™ º1„GÀYÓ9;üg‹^ UĈÞû.–™¡…—(daNùO4¨ôv yj±ÅÀLËÄ6s·´”Po8rªÙAÝ€$Ü1'º!zë ˜ 0ýsâÝ8o •"Æ…“¥Aºwo¹‹Á²ËäœÇpï:XxcfßD3‘G)@©õ¤½¾Ì¯ëÖÎT'»*±¬ - E}„a¶ÝLúËQ€-[íƒE0¾á¬ â0u/˜”µ¡À¨›7eg¡[F‡ù÷ ·4nÐ};T siYbÖÛÅú¬HÒý³ã z-  Í5äEûÓŠóê$±1Ò±ò“"6¤‹4|rt1‘ßíÊ‚…SìîÀÏó¾‹}¯òš!ª~q<ËÌ„åxÝþ]—™y¶Ü£Éq6v¤)iÑbšuhÕƒX‡ |#`M‚¹&'‰í3›ä¶À˜‡ãFDjú™2‰¿Ü#´r—Ù_Q4Æ,3Ú©ôé#´Þ•~‡ôÏÒqYž/¥ÏpÚÔ´Þõî´³oð›]¥G?È ¶63`Ì:íWð”ŒS>.æ÷‰@¾j}½êëu‘—9ÊDôþq‹i æm@Àpíƒü3°2²–ˆ“xÈ )zÓòÃëLv#èÙÍÆ2cçYùàÏ-Oµ@Ú*,NR­ýÜ0ˆïN°‰ÚöoTºíé7QžÈœG]”ÉCoöRL™¥Çqã8ÎÎÛæ‘:ÛYl«zÔ³“ ß+‡â&õ }×2=~Ÿ½Pî4Q†±*¿ÿMm\4"k-a¦“Ÿgv8Í9@Iþ@áé¿ìgÆÎµGÞ'XÃÙýwøÛAaÂé®üÜÚ[ÀØŒ…$èkÝŽaÒ˜4~"cëÏïý/ò»ýLÉrmÒеP,¾R֥ݮàólê+è¾ä‡S},峿ïžïòýŒ|VšÄÏq|4á[?s}ÿÙ´ÿûGTÏEÂèR‡Bïß[DzÄ,ù‘LÇ¥+ÊqyûiŒ ¥—xò´Ô´aÓMˆ–JÈ,xk`ŒþC5:ãî x3!L1–Ø‚P>nfhc‡HYÊ\B˜fÃ3Ÿ¬IÖ aï+ù·T֭É‘!¤óÛF#íêBÝ~D+{ï4”¢ HbŒÔ^;Aéæòùì¢9®¡Uíùךj4„Ìagà ;Éûë˜$|F îÙ—®Óu3jæ×F­fVæºEß›"2)ûÀOÙåÏÌ –’Èþõd (šÏpRL `ÊðŸŸå>…³X Ÿ(°­hÇ1 ?Ìn±'=ø·¦‡*b[^†ß’Š„Œm$ÒüS?ƒA¤ÖtË–`º‘b»€_ÄÃ#ÇmçpC1Zñd÷ºÿîy‘<ÊѼyÉûïôÿ:<:'Ö·b¶‡¾YY„‰&‘ÆSÞç,ù”m¤Eø0‰mªÒ‡¼@îüq+[–ŠwØýÌ™ *®,ÀYÛ( ± ècîm‡¡m!Yë§]çQ€s¿ šs¸ÆÓçµj-4LTsiõسqûg¶™ŠÈ/~F{äJ¡P@ü‡´›Èa?TÓ|öÒk LœLgÄ™>“ËYHÍë`s¥/ØŒ¦0Hó%L!:1ºâ+†„tûn=ØKöÙñc•ûiÞê!qyP]nO"Ñǃf 9­è¼Þ`ÛYSl¯~ãz òö•ÑUˆ¯X^…ŽÀæÕz¿îóÓŠh8²^­ÿÌ †±nFwÉšzerÄúÙÀŸGhJ¯Oô¥2êðÎ[£¢¿#gá 8‡cw¤6„á(i˜ìÒ»€›9ñî\!o|ÿp[#1,pYä—6onFÿ‚ê †³ù{Zø"Ytge%èB`„SÝK2¾3fBÆÿwè¬Æqа®¨.Ód*d+h Ϩ™SvP¼‘k8¬Š3„®j|·¡rzË註-QøØi‘lÿ~`„Ésjµž£Ñ.Á-PÛ‰&ƒîÍ‘3r‡¨Çÿ%laÄý-øÉUÕ>9<ïž6ÊeÏå«[îýÛ¯O¼¾bHÛGxÂÍß/T0)üðîórU> âøÎÝ?0¿ë* PåMª+,8ÕZóΊƒ¿Ë²d2» †v“¡[‡Üýrm>ÂDZ± Îr'a$ÅÒA}ö^š™Q¨—î%ýùéóŽ8sÔ& š9ô`*rCÏägv^:g´q¨SS]í }–m^öšnóãtô.:ò[ñ† I£Ø)²É:#J6õ(_ ÅKPVJ—ØLo™2+2l´{ï SÙº´é4Þ¨‚”`n5NÇXš½3Ü.‚p:i¥„®!^ €¾,É€lÀׯ. ÃÞ“à$øÐ¹Ú‘s›Þ-=Îkic´á{ëTe†þ#âºfzUË36 y./v ÿ§ûîÙ¯´r9Ÿ<9-hÕÿëå(N3v%7ÃLX,6xÁ°§YÉ$”L$Ù l|TžªÎçR¦é©À¢¯lMî?}‡ÇŽP¸ÞÄ&>è  Ï&Òÿs~±p¿6ñ\©„¼L¼TbÜ`¯¾:K¡”nO³å3èžÊVx_Q–g@Áˆ¤ñ9¬'(š[·šQšÿ.˜ŒkºÑO”âlšcØY”Bq7ØŠÐ(SÜÿÑ{ßÜqIÛIú½ ÄÂÅÒÒçǯòoÿªÕøv‰3‹·.ÿÿm†%?ÿç—ã2½X¤ÑªK¬w<áwl†>-<6¾UÍç™Íde£Ãj&L2SÂ^ŒñÞ–¡.A” Q™—`6/5'Ü'ÈS²7ç¢è•Vwr˜ð«$'tZ=Hú¹Ñí"Ù]¼·;û0‹ÃËi¦¿A]äj öŠHùœ¨Cö‰ÙbòÉú Nfêà€–•Aþñ®Î¬”¡´¢Ò…Rˆ¼­Áî±×-Q•3¥}è&žrÐÚø9GÖ—M…ÇœñðåÅZOš¿<Œ~†Ò‹œÔ+îS ê(k¤1;F¿_⨣ñ¨Î~®8ÙÀ«÷N.,qõ7™ñw°ÎÞºyý¬Þ@ðÿ~¾iuÝÒ5yWÞl²é¢ƒ%5 ó† õ|ÇÅö¸:"7ÍU_Ñ­ìhÝøðKùoþ8ìæ»E”x`~á±}Ç€ý´µá·´Îv'vê¯ý´ìn@Ú>yÛÌ–eèR˜£\ÍßL&dÛÛž¨Ë9Zõ 6ÍUÒ9†òñØ 5ìýFº™e˜ÕÕ×;V—÷á—´a]9•[g:G4Çb³.jÝñ+3)áYe‡Ü9û7y¼hœTÞÜ¥Vœû8µd ¹.Í2õdIƒ@DQªð&ÐU:ŠºŠª¨³Õo‡ÅR›ƒa–Ã[¦6€<æÇSs ±Ä9„q+Þ½†ñµ$þ„ªÏâ-Uh<²0]OüjLfFÝZÓ¸¼8Ï`anâú(]‹qc9»w×%…aÊ[ÓL¾ÈsG½#…ýn¢$ƒÞ¥¸–÷Œac]@ûÖ¹óŸwò8G–s`š7»bñískÕ̬– ¬Šj'U9–#›, œ ñu‘z÷ûæýåýú+"Ò0nÚìNõEXñ‡jI”?úÞìZdŽÒåÈ  µƒû³@iSEÑùÌCDÉlÔUWN ö<»f(µ”ã`'N3ŠÕ¼\‡ÄÂD»W ¢„†¡”Ó‰çj¼ûùu) ˜‡×9sM˜1ÏJ±~\r|”At4H:½™ÌÓ!ò “K"AïÄØ;s{ѾðýÛ,c– ùÕ F{küIÓ‚GÚÕ äÅ õÐŒ—§õ³(“ºo´áu «ØÒJãbqãôˆ0}Ð6¥òÀ0ZXM˰wï bìv%ÄüH0>–ÜÞ#Dïa¥JƒT&â GÖ,œ›EÙ1‡›>º ydë´Ç㣠åÙ¹ÍhGT±Á¼›¨^«‘¤â,!5€È÷M8â4õgíKvåÏ<˜1ÇÁ£sZ 7ýp@S:°ÒÖTâ…òOY_C6tÇ(ì¤[&BìÂ@kúmR·ãO»ùQ³k[í;iŒÇ2%›ÛX¥\ó+DÔwìÏ4¾wÝÝ}㉞ ¢¯¯îøþÏÌÖä-ø–™LJ3/¬¼Ê(ƒÄ aN+ ¶†hNÕ´¢Ný–gÒW]:¯,V‹mâ=yálÙfßµ¨ÏþDç'#;A il¸6Î0™©ãºZFrm2»%Y¹ÝB'¯«ò”°©…Â}w 0ìiÀïœ Në7yüpøß±«>Þ³_ZlÞoÚw­°¿ŒÊãÁUã xüçáõ¯F87ðÅÏô†­ö˜¼ô£XŽNÏl$ ¯e1¹mx¹~?N6ŒÈwMÞz C^*(¨£b'i¨möÕ]M*5žÄg3_9Ïq¸¹XnhqN;õ­úöÊ.kéå}*®z— ÌÖ¸e=<8ܘux&b½J)÷¡ÝÍTÂÛ¨u•d£µ2 ßw4KÿÍXæºSôÕà€Ô5ù£gÐSÌbÙÀ¶³×æõYÈ ¾A1|`{`ðÿ'3ɨ\ž¶@øîîg˜ú¸-ì84ÙÕ˜Š™Qð.Xôd— b…­·k‡v.œ™,µÚÏ8h‡}ìAÍE ÖÁ²É€¢Ëµ±°:).–9SÕ&IñPÂæÛ¼Æ>c»ðò è¨îÍ;‰³Uíj/çºMTí¡Qog›òDzæl–×)òÓäké¿×é½³™2OÕÄ}häoÚÌ\»Š£ è¡V-ï‰ü ÂÅÊÐ –R%"ŸœiV”ˆø['p2&zøÔäµOl{ÚÿgW Zª"Ð0Œ0ë(CŒ4‚ã÷ÃnU'Çj„¶Nk¶×0gD<çæÆÐžµÕ©qH†ÚWt}÷©Í2†ØÌã)Qh5`]'V[`¼K†;+UªýÆŸÓeòË#5ÕN„R®€B'‰‡|rÁåÃ6yêOmGRk¢¨Gî𚢦+š˜ùÙüäòÊdðkÁT¿oSfV#*,¸¯ºž«3íyHøT2hdcýEHÄ,æ1QÎÇ2}ÃNQÿ^ÜûðŠ+ÐTŠ%žU{Ý‹’%ßɶNpÿý–ÆÂXâí®É}*93 z·B5Þ+-˼ØëNË÷… ÍÏÁ87ÖJÍDêçn³teH®ÿƒ&ƒÿ ÑùC6öÅLNfï=zE²÷}ÜûªŸŸÛV¿çç×»`ÔÌë$çùP:}ÿVïK«50欠÷Úà >(ñŸ‘æ‘eäWqázeÊ‘.cºLr¶®L6Ž¢‘Ù¿&ó§¬\ëêYŠ1Ÿ\68ɺ#è'é#rÉè4¥°@T.¢Ââý-Œ¾&š• µõ…ÒƒmÁŒ ÌuRS¿tYÌÿ±4ë¼ÂrÎ÷¨1X°P,»¯Zû«¨€ùt§1ªêõ1gÙþ‚Uâ»DÖÖÖÍõ¬´±(te’ ÔóyV±ÊŽaXàƒ7H6”1+Ö½'0…“ª6¦AÒƒ€ås»EJÓ0g×#z¢-@}]¡C§ ij€’ó‰¾UB`ɶÃÂiõ‘O†#Ô¸´ß&¤]AU‘r´N㾋[õaÎá¼ûƒ™á {,ùT71ÀŸœ6|±Ñð´íżðÆÓÁöï¤ú9sûþGOt¾wwQ× Ú9[™ ¿ ~½¤JvS]Ü+Ñ—ùÍ^¯¡à’ý:œAóu†B%=â†yâîïN±v‹h`èiC‰N1³rŽ0´¸„ùÌîzRœ:%™7'™ªþWt((µÖ׫¾*NØÿü¿ªÖ<¼ÖÃj\PêÁ€*ˆÅûM÷Lb¼ð‰ù0@àÝ›ÜÚLx¨ËƤÏÌ÷Ãã»V†éÚäæž 1í4èß9tró–ñ gJ—×jµ2ÓÉÛ÷ÏJ‰ûL8/>þX^-ÊØøŠ¦ÍÒʲ·vê¤fþùÃÛwWþIEÿœ£áO¼À­ÞÒçÑÿ?P ì_ŸG¸Ï­”·¶¸&`B6/ÿÆOŽ h©ïÛÛ6ä¼SäÁa…%0ÕÞZu»©p¯tn-ÿÿøÆAÄtPï#! ’Àãq„i â·¦FsyßG…¾p‰ke¤yç1™éÛ®ÿÒ¢hÍ—{߃X©Q-¥Ó¢$Ï·^#…s0ŒÞu€Ó…°à¦;MêA;<Ù ¬m-Ù¶k2.œšÞ¬OLÆjcWË…³¢<,œWÒÈátȈLa`c÷=(ÉìË'—×¼‘Âáíi W,Ž–Öÿ†‚Nˆ¡^q ôúçшî”1;ç&a†Þ… ¢wfó(šG£¡.$G ï˜Ç¸fƒÀM ~«×—f†UyÁ8ÌCšO\Fjá²øA6¼‰-¡X!`øæwS{wýã$Jƒkd„fžÓ“œ /„«#½óO§g1{|•ëßr²Þ·*Ê„ÐâÙu€bG©3S9¨Â”£ Â!]ö¾dÓr¯d36O8è³u(ÉS>J©$b¬êþó€kèq¤Šh—‰±Ï˜¦&Š.Ð¥º›‘Dc¦…IŽ~”¡JtÊÞ£~ßqÓ,¥¶i´ðÓ›˜ŒADT=Q¬«ŒÝ´àÙ&%PSC‚÷ ȃYrƨ‘ Ji˜_!k)ÖœR?x½^¯sj¥ªš7;·`…U³¬çs bØwYצÑêè\írõ:Üy#NCî)Ÿkm”U Ìõë¬à ¹°ˆ¸Uk­Ð´†cy€P!ØôjšC½ÑâØh%;#õ6BJÔª-v2W Ø=0Mþ®h4æFGï, z ™sº?˜Sa<=†¯¹ /–bŠ/û„8÷ÄíI’v-Gzó~7}wžÔ^ð³Qâ@yëõïC0ÅàžG´Í eSë‚ù¾ûp£ÓɧÁj÷Aàé‹»J¤¥(+ßF Q¾î¬[)ÁKI)z«•îvwu¼êZ]“Íô¿":w^Sq*:«²ÐPMQŽ£4Â+ÅúÆhîÉÀë´vÃ>vئéŒW×5Æ„-_¥ÍURµú›3_£Ká™Äì„|õOÈÀ?¦‰÷cÉÏx?âÈG†¼ó?së©´;ö•zh¦@|æØ<[24Ÿ 0föK]~çš wü0î÷lâ`ÍÉÕ´Ðÿd.?{f(k–”Û¿”вàqû^*–ªË1¢gƒÄ¬•Àdd`.È–&m²âÇpw7jˆÏ0s(²D\Œ®Ï–ËèuçqУÞ0µ·€ífò‰N˜DU²Çâ›çØIç\T¦'í:ä˜Å/p9'‹>Aåóš ÏZL n¼ Xÿ â'i†ÿ¯ baŸ-ø×s.¤^¾\ôFÿ]–9‡ß龜c[›=˜ù“,ź&6º½`Ç®ŽqÑž5ð0O‰Å@O®Å5põó\ð±ðtnÉøöl…n7sN뙫ĺÎE#ÿx 2u¼“§³&ë¦yåóV´§µrÐ2Šjzw”›—ÑÂ%e¤i•Üe½eRÕx³°ý}ÍW¡6_íZQ_õ4ûe¡¬È’Ò¶¥|„SWKO*ßIÊüe2c û$¬zR¶§`mhš bwÒ ø/(;=IºÖboœœÅüÊWEí¢ÑÍ$RS q† ˆ’õ«“Ì,ý¿ ö]ã Cj/¶ö'TâQ!Ümõßí/'øèÞÁMÒ@8 ”µÚ^¬ 7e8Ôü,_òÐå´2ù8}Vݧáè;:Ð8ÖBä:ë^Þ‡Î(;-Žž[A’i4¼GEa&õíÃÔטÜÎèâßÓô¥vVÇk𕯹Õ6ÛN%ˆÔG„ñQ÷NÊÆéZÏ­Øzñ°ãüÜxwiÀà°iíYçXìÉ•ônÿ0úÏ@ÿMO¸@IœUÜY!’“­ówŠÎ—ùdpÖ­ŒyÍj’̬S®û°ŽXã7+ðS÷D[õ!²œ£ßT•o÷`~ ÿ·¤¯Áž_É¿=zø¯äru[FÆ4ŸZ*˜B…,,èþ 7Ç—u!LtVKÐßîüitâ÷)™RPPTTkkì—dÅ¡‚ü‘éá”—,PÙ¶IuóÛÁ§y¤@tu®pPirgØBžU°t ÷ÿs2Ï é[³n¬Dc\Ö_»‰xjsq\J5Ú (…QqýBÞÌ íĽ‰DCw8'ì~žèTÉ÷ŠÏMæÈ@¾YøÅ¬„òÍrçþlño ì .1–}ÎÇöj¥öóNÄuv"ÛYVë©Ë;qŠPŽö˜¹ +r?êÿh€Ë’¼8ÜlBŒ Ü¿ÌÜþø˜-¾£çø—üôD,¶äYþËÌ—¿™³Ê´¸ô!v¡†ò`(›SjFNÏúÞß²ÿgÖt:<ç³cnRL-K–“Ø’GLQBÏôh}å*“)Ú!3F%·vA,YBÉa¨ËÑW1"áV²íÑ9tµÇnƒ[“|¯èºìx½êëUèÿ •<ŽÂõ²ÜLž<ÜË©»¼©(“m ÅÐ˸ïæõ†–vþ¸\Okñ®È7Û]¼½aësÍy¹š³³«]fª.9±e¦)³0Ǣ-˜ŽìF…>·a¦ÙÙýÐ˲yŽ)ôv ‡ëŽŒ¹¬U(Fþ‡e7ä­ µ¿ð(tØŒoI{§YâmYþqû3õ)ÂGÿ<´c»ù å7¦„ÏîñGOüÁœ}{©Øaü~i©~Ñj°f+_~8÷÷è§Ñþ@ }?·w„¤dô[ŠÃÇñÿñíõÁ7'oÊÃŽÚº³¸µ`¾Š6L;ˆNí©d)¥ü¢·¥{óÉLà"Ì»ñámËeØyâs{ád¼~„Rð†Œ?MÒ&ýfnÝxg¿íHb÷„=«˜pkö39àvìÞ«4šX¼¿LÿNˆe ÊçÎŽx¾ÙÞSòŸr8ŒÖM4ÒM–]“vù|íPðFiÕä“$Œ@Ça(%Âü—>ÁÔó%›ª;5Öú¯…«ž¦×MpÞc²åkSçïÏ"åÜÃìeöìèªT_>Z\¯ŠM¯Qg0—LâSèÏÏ!]†øxưÛßz‰D×~ã0.PsihJº1ŒOdü»é«DtBD0o½?®»…Fô–EÌ?•þe}“Utiu x7GYxvÒÓ)G’ç÷ìÔ!³·gH¼`º®${ý®2ó3n-CßJôëè½QUt9U,`lˆít…fs@êÉÛÄL˲I2Èß®2,MñÖôA s+°)®yøƒ¦ôÞòf@§]1/¥L¡£à(ÔA9»tbƒmWR%ß`¹°M¯ %—l—©‹ÛÌõ8Êé `Hüñø14®©G8 U¿ÞR-Ÿš³k'ŸC¦²›¯]·b?Á©T»kd·@_ûeØC§¹€ Zn€¿y^)±¬¨çÖŠZk­x½.àóš4é˜ìOëݺIèœ}K‰WÃm9áï8­eµÑQØXr=tïBrÈÌßQÙL MPê ™J¤¢ŸOñ¶ÛkH ô3qwÉXsS—(äÙ©“A@ºÜé’ôú&¼‚QcÕ¿ëÒr·Þ¢WçÚ%µ7ªdÒBü·Tμ°½»¤ W.«e!ÙEc »üFάØt1W…5©Ö¬åò&p~'޾Ø@ 5m7r¶™UŠÈ޶¼ãƒ›5©z VO&”æ0ùH:=åh+W}uý›–£otX›â¾ x¯¶ßÛ|Æ }>ðátÃSò75FÖ:¦6ý±á‡Êßz—¶Àµ¾´÷1¿3?C"Eø« FàUç<‹0H‡ÀqåLŽ/|áYNñ¨äx*?Ftå >f^\œàrq÷Õ3žl½xF$utô†é^YÞ`XÚ7ZˆA…! ¶ib]Vt.ÅýÐS6 »³ù'd ¿áßÏ·ü`ÆI®Îl„Í †}؈èZ>ªjÕó2òÚÃw œÙÍé-ÜA¼*jm¸Ño_$Ã-‘Ž´k1Mç¶¥å¯bþšfsäê»R÷;äƒh*r”<0ˆ›…ãúxóð%wù8/.ÔãïÓK`;Ñ,æ«ÚÙÂVŒRþP8“ߟ<¸µ>>—ë«%ùå)úÖ3¨xd¾5‚í¬7¤Ù8ÿôÁqeÖœN«À¿4%WãSùˆ{»€-Ê¢ª1V¯ÐÕØf®º4ä’Ô‚rÌ!L³è„š»b¨BÿgJ§Ýô¡=œTa¬ì¦@d9¸#äV€V’ùN•3(4‰p•¨±­îq†è˜w)YãJáüïe³ä„ØV7@IH,ÞcP:ŸL:œ¥?Â1´Šü‰ZIÂgY"øêõ@\üþšXêq¥µ ( A3ô9J!ÚM¬ n˜ÏËßi¶°ð¬8‡ív<$naËÞ¦g¤…Ï~Ò—Jt¢ÝC›ÜZÎÿÅlÁ|×øÑõ®ý~ØÖlËè8¯Ÿ¾ëñšÈÜoóãH¼a¶7Ý2L:‹ 8]l’â¸TCäOÇÅ|äQƒÈ­…ÿÑùûÁ… Ë¥¶éJ{æ¡‹©‹cµÖ.Ét;°Sï"QëûÚÇr©ÜMtç¥å@&°T’Rɉ5»æx ³D#<µÀV»óÏXan}ÇÜ’#»½ªýc#3­<@w]ÓÖqiñH05¬^gWާQ|x«Ì’2Ž,°õ»ü’l.LP¼ˆêÚ’-xâm6®ÕõLv /þd?Ø~¯È< /3=‡šþïÀ%/S`ïÒX6¦E¥”£ J~­×²? 0xk¨ý»Úƒ—cb—±n‘½µX¯çuš«×ªJ—((Õíãš,¨Ô©°à¡¾­ËmPbz#_Ë:ê‹rR0Á:½¢`p(d¢Óêp€âÀýexП†B%³“j<ľV#VÇuÁm¢Ç=Ì£¦uX6ƒWе8´ÎàL…ºxÛê!×Í VüÝ^êÿ~þ¦ŸZê8[PðvmÆ ò”𝗬û8빃Ï$?Q÷za]¬¬öÙ*;it\¦"t37]¦ŒÓôÆhŽëS,É` ‘Ú Ðα<ÕŸFÖŸL€Ðbýâ8¤¨ðÜÎŒ1Nf0¤Tvd.lO{%Î<ÐIwå49«åUqΕÔZj}Ýú>°Œ­å¡,ç­-OY$•N¸³à1Xòö|>Æ9ПùQ˜“›Y›Éo%ru¡>µë†ÝäÍöÁ{}¬žÿdÑN43¡ykÇxû bÈSIï3e޳,‰'½ZG^2,xoqíMìNñ[Î"ô‡âd$ñGÐàÎß´ |˜Ýþƨ2¦rNÚ÷}A Ž¯Ñ–‹O„õξ‡á>>y©„Í €ÜÚ›Œ{üg&øìdI­`@ì¥_Ìâ|AnJosoàì\„z³™)ˆ=8ð­wô7‰ÎoÂݳ%æe8ÉÛÅ0kWå 5ûAe®?0=ÔìÔ¡µ­¼u‰—RTe`€AV¸»&ÄMœ´6Ôw‚«’»”q¡Ýêp€pýcê•ÿõêä0î1å¡ 4± ŽqXbpKX=þK¬A¿Ì_*r,1 –et¬È×TãëkÂej¾Ü„£uü¥¿ÌÜ?:†Œs§oÓxÆýýp°YÈÂv0ŒT¦†"Öaztͱ–6\Ê0)%s)ûÙòÕöŽ>³‰a”v& 9;šHZÇŸ¡/ƒ­$HHx/Äâü)ÙÓ$owl`öÅÉíƒ4¨xÔC?‰^¹Ô(œWËúú ‹GÖΰ²oÌ%>¨ñ%“Ãü‚ ÏÿCö5Ẏ„º Î1óÞ®]† »hŠ@Ìïßµ‡Î·r=Þ þ¯õU_eˆS÷çrùчɉE^. 3 ³ÜGC ¨ÎJxS*~" áÊôÿµ¸^þ®ÍÁዞ»Œw,]ÿGõN8çÓõÐ42[¦2Q'\µ×¥k,šã_¹£Ë(´æ(|ðZˆ´ââÚ ”•ô¿5±ã³Wv«M4ƒà7XÉjÍ<$Ãdp$àÁ%åüv®½úÃèdö 0÷|Ô@Žé<øH–è¢ò5ø²|AA±Ü$ºßø ~—ÔŸ0²SoÉà|åù|bËßö7Aé Y¤§—zò㬠¾÷£7m(kÒx'Çq ìˆêƒV~mYhž7öÁÃЃáÿ’è<¾þu©¸÷hÝx¤È~¦ñy~j§#Î,³Ù?0z‘ •çÑsáÅ{—Ù+û'ôïçßÏwÀ‰ ûº‚¾/ls–¨VÊ=4¸1¨[Å7p1Å0ÉÏ.BíÇùµÀARgR!´°`ø“Ñ]ùÉnõ${ΨÙÒΦÃôë ,Ì2§ 0¾P¹£À&"9ÞÀ:L#YL(±»¸(_… eö rþD±Ì$¥ÊL]( =v¬ªŒ}Á  0´„iû™%46‡Àô¸DtõnÅÙ`òó¬ø“¿c._ãÌòM*ëo1V橸-¹]Az+ì?&0>õªcã÷ÀycÇ1¨¶tò*I~¨v4†M³My¸]!p†4æ£á†u6ƒôÃÔ¾ Ê!pžNuõ¶!dç†Ø{}õ2½‚sݰ {Û7äÁ'ö‰ÇoÒdÒ'†-ƒbRU½M°hæ10AyEÁô^¶"rŸŽ‚é¾ÐÌ«µ_¨5Á»u;)Õá¾3Óu˜Q†ÑlºHDêyÙµ Œ«Çï¤sÚ¿BE1¶¢8sÈäóqž¶ÿ7,MSóçU»ÂyC:u*”I[£€æš·R8žaõˆ(GЏñ÷k-ôí¡^­råúGkL%PVC¸¡tF·¿…ŽÕYJ9º¶ Ç_['-}P’PJ±‚ùJ;Po˜æJ‚ä3Û_¬æm z+: Eé5n–ý’ÆÐÎy ¹cô õE+Fogd€SP[ƒØJVìøùC³·¡ÇãÇôáŸR°%"f™–„°¨M„æBãO\>ÁàLbƒ…ß& úYÞGboê—g¶r_F°cå;"-3 ÷EQÐ~íR'”9ý2¯›ÈŸ•yݰ3Û$2Ä‹[HœÛ©÷Jo=^b÷4I‘v€lÞ0m˜¥—Ï$ƒÖý$¯Vdqgy:Ã.IáæÅXqmèç¤ÏD±\>S ¹õxëÏÖ<³ÿfafÑx*pT–V+0ዪ^,Ù`Õ» eù*§µèàqOÝÜÒ#ŽÎ/EaÖ!Q@%è;uM‘éÄ=Ï¿EtÞ‰<¹…THJ»-#ºRܦ=ÕØPYì&fã€ÎmÜæýî[LÌOz'X&Z=H²,öi‰û~ÒØ·‘YžGå{Dô³TÉ]RóÀi%€¹©ÖǯßY:”q5|¸“P#TûvþÖùRæMyó±×Ìé{ŸæŽ£FT1[# 0ÿˆ.ÙÜ’ÜQ߸œÉb*JîÖºÍYþÒ@àÊI’©îjÿŽ?·é×jçR&²ÿû˜¢¥)õÉüþaµ‚@5¬Ð!»k†}É gdZ¹½ ªh²˜-‡kh£òAPû©æª`Ä£éPòòŸöc‘ïLR;Å)ÖKæ‚c‹oºèéÿ…}AÛÉ[0™<®¶+i@ncÑ^6ÌÕ_üÓ¿?öçÃÇü##Öü}„w>3‘úi>®‡ìdgÊÆMUŸœ··„ š®Ð›(Èɱrþbx¸þñPÊ;ûß=‡„œ•¨x~»k9Be¥M}äd6§R&C,i¶LóäóÄñêÙ¿­ØÓ€w[é#+1J Ç^8£+VWªû!ÿÌÚóË‚“‹Ï½?XbؼqÌ“EytØ<íÉê¿Eñ‘›ÙÑ4èOÕ5¯;lž\P)zI¢›t›T8 8¼Ä1³ðžÚR²z+Yi½Uø~,ÅJûUæ5ML}gzáxS…Šã±<ÓÞñgþnáš}Ö¹[µ?àäþ7Ÿ¼ß'þcÅ·(üÿÛÁé­Å»“áÀýå_ÉNra³ªñ¨Žù~xvˆèÔU¿·"3›è…èü;·OÉ €ã0~¢Ýë&èúáŸ_ã 2Ó߆‘¹4ƒÑ'åS³®/>n-‰X<@g%e1/ÞDÖø]‚z“?ª—PYª6Ö™ÓôìB1eÌíw—4¾;Ç”ê¬îVZ·Š,øíVï2/^@§½âªNRfÚDwSóýF{æ6&$%ÝC—¥Áý†Aʆa Þ¨AcœÓljnOC¡Óˆ˜6t ‚!L£°¶?.¾–;Ç Ë©õ_‡gÀÅe'o›ÓG9t·‡²ý×1vae Ç\R‹Cwm¥P¦ÔpÐ}Pb'Aß% ”> X é(æÆ-8¼^ÚÍfà­C ¶|;”l8Ö¬m†´;C ß±GÙâT¿»NÐpFõ<“Ã"<Ê…ÊÅK»#89*Ôká](ùK²ˆFH ‹9ÕL:ÖP SÆ‹Eaçänèð2N¸…tNÉM­(~n¼?в|4\wj›E0lkl°æEn„î! Ò…ßJªæŸ¾v8é¢Í餓gü"ͤ° €ƒ¥z iÒM¶¶7tL/†FZÐÐÜ¡.¹t” FuÝ…ÄÑTRžøLv±±Âƒ ©kÅIøïF¡Yë]J=ÙsÝiPÙD‹[ Û6zx¶ Ò]…w­¯Z+ðëõzÕWÏÕÞ93L Œ ´ãðæ»và`ð/÷¶í@ãî4©æè&Ð\m‚ä£Ý Ëh,þúf¾ö,Šþ7V¿œ™Ì8?nÉ ·5ÍÛ;oF*…É)FÕBkÞ^¡jù J±ãÇå:îõMÄ‘éÓgBHòý"l h›Ïç…›¡çO>×[1%Ç'ÇÀ.ì¢ð“Æ:XølyÂÎs¢‰sMy[ûâë §7¬¦°”ŒZ>½x± î#{àóAPŸø^„zIE7«ƒ3ɼþNCÿ9‚%Qj8²‚qÉ]w,åoŠ-pw™‡kl •öŒ‘-6ÃX”b¬BAä3¥û¸i½ÍéP>^ óϺÕ©5„Q5 Ë„f`v<ÌÔW ~tcœcxê¸ÎÓ£¡³èczõU_¯ZQ_µÖW=É1ö‹#ì[]¡opÄôRáCN²c&íd3½F ^4>@ 9FL„-Q5ʹ1Œ99À É7Lj²Ñs;àtÖD‘H¾qLÂp(]±8 µö•ô½¢8²Þ=kÅô†BMÚ³Øæu§0›ªUDÉͪgZºËÜÞ¶d'² +Óî9\“èÚëG’Ð÷'ת€„–>„2‰>'çëqßÛBRФì<§°Œ¢Îè6ù‰ýÍÈôcˆ‚¸d5Óz–cÑÂDïñÎQÆä/ºŽÇç.p,!Ô¼n$ýHež ÊàîLcÖÄóGxéTìerÍ9s£J ×8V¿Ǫ:˜RT̈“Ñ,*½Ç2µ¬pJ8q¦aÖâê¿ÿ…ôOÖ²–íÙ„Üq¯·±teÌ­âÀÅYÇÁ¸kT×d–ôÒýÉ-È<ÿ<ÝczøµpÓ%¯ýôšF ´Á —œc‹_Õa$”!êv aš&„º¤ { ë7ÇîòµE—^lK¥Ü¸e‚Gßp*pœ¨LÊý߇¡ÿbÑyÜÐïŒÊV—ƒW#¶'Ù$V»Heß÷LìßèÑåLJÿiW#ßn)8^ìCéË…,” ¼N± ÖúëUÓøf`fØ£D9òÝ\òNÚ¼ íû‘7’U¦Ýa-~YlB;µýlm[mç¾§ç0møÞήfÞg2͘&p•Šÿˆñ‘ÙùtlǼ%Ùˆ`¥›9äú¥Y¯4çC³dºYéï™Y—dš#^ŒùÍJÎ4Zv¦Xà§±~&¶Îi¡îÞ¢„Á‰N JKÝ%xgëIÎÓÈaÐ’à‰d,NºÁ&tx¸S3ÓTŽÍZP6­ÝÆZ!`®Ëg×aPòABÐ`ã}”¥žÒna÷;™Ò™‚‚Ü Î÷^Ff°W¼¾kŸ}0Õüª÷o"!õ%êó\´}e5{mt»õÑb[èÅ¿PyÅNC¿ÎZë!ðNî9Ò¿ø+*ßËŽ`–Õaö¥iýrSQOÖ¬o€µÇ†Í5ü—‹Îo—cÀ\ÇkŠŠsÝ\|!ðŸbpù%c†´ôÚgð‚²]EºGO<¶àK&xáG}Á†ÊÇ^…N1¸tIYš Ú~Ƙ¯³u'HgÀ{×k –ÌDMˆkx›^†BÞé¥gfDPFùŒXÚëB±í,šädÐEF=+½y•*XÛ( ”¿.S`¼­’ÚÖ¾8¥ºÁebêOg9Òƒ–«Ü89Q[«ƒ Ϻ#Ö軲7º1• ÝwÖ²ÔËAò”ñAw),DÐpW @f¦Ô!û _A G¿£³˜ºV¼ì«è@ÀNHó=4½$JÝ]XŽ„eì£ •„#« ¯×—®·It''g]·±#±bmþjø¼ª°ƒäj‰UiâÊu%Hx‘1µ SFVil)#kçÊÛ°úÉa¶ —iî¼9sy]"Å7mR,š:†ý:yX@naÁ&ŠÀ4VBòÛWÕ±7#PZ~¤[ÃEÁ‘æÔs„ü£¿׈¾ëO.ʶ`&°SÑéWþÍ©äf`L㢠­XˆSŽðø?ÙˆTù»qÊ;1)+˜8;v)</Íë­p!×ÝÚ™0g‡­ácIp1å NQòå½uæ±4UBÍS´+àé;®çr÷ê>ºë]© ôÕWE)¯Z_¯Wïã”y7ÆôÍ8Ý*zrø¼³Q÷ÝÆ~BèËŠÑ©ôݶîý!»MbW$kzbwŸùÄ1uöBq§BÇYIq+Xkû8©ø«oõü¾Vñü±b™#1©k§ßÚÚ¯oñ:éY´_@¢¸Uç­ùð‹Ããöý8k;}ä“c¥üZEï =2Kp ç×õñw¼…ÿ»?ŽÑü‰…„ï[ö«]@–?²P¿+ðšúmµúZ«Nùü×óŸÿ™{õ6¸©oœl¶³–™An(¹ä³Ã룿gãþäKüöGETòw]ôTâqònÇ}Ÿ\m^3m1CˆV—xÿÖu±¼éqßÕ .a¯s}r-åÊĸۖÒIIÍÐ î€ó¿"•¡o Ibú˜ÙK®ëÕ0ãza&¾ÄDd95 ê@m45¾d¤A×pú«.þ!ˆ¼ Ë(Ü9¯ÍùÂe•4O#^y+lV>îN†ž,å‡Sû­Ôj˜“ê Å;Õ÷Zúíº²Üx£ûC8…°r–JìÇô™5§þÆ<ñ'¼Ö’/ÚÕƒJJpú“;ãæ"Ò“]à†ÁvË¥Q`'ø8_ÛR»l-,i~´rxt—ÖŽ“LutL¢Ú®Ò@7fo®e߯RU×¥? Øþ•+ *Jw9<虂:Aµ}þH¼C­ŸMÚ|´o* dsSíÉ¢ÝiÓ‹8Qk˜Á ÎE”Zçúp§0MÔ›oM­‚ª·–Rkõ*4Ž”öÖé³ ˆÝ¨6¨(¤ç¨Áº$xRÎ4”S¾$é¾^Oõ(ÅiõÀ¤Qá:- úê qNi%ÕIjÁîè G{ÄŽñÿõëõªµœ^=5qeh-èùkLž‘ùÕ´†-dΣÿ»Î ¨ðˆaF_ÇËӸɵÛÐÙ]ô×u€Û­÷Q6̈ ûùÇvp£9-”ÒO­ë£!˜œ˜Øq¤ñ83Ð}Ó…¡éïŒ×ÅI/õ£Ý¡­ŸßUX )ŽŒR±ÇæO`W$£mBvQÿ›gØ}Ks TCëká`*ãsSï‘án«&KJ‡ËK¹Q€¦Ü^Göô¿#R‰ãõQŸ?Fð¹‰,«¹³¢¼Î5„›‚zL<Ââ“u¥[°VN1Š„Ì|æÙZQÚUL3L6»Ö05É#l4[vˆßì^úG-]‰ýêÒÃ*0¦ g,¼éŠ1°eL•Y éî-—(r2SáÐÿ\ ã%ë¸O‘‘aŸü¹™‡ ‹:X¤7è´àOgžˆAïÅJ锳|ҼɤÞrw¼®ÔùÒ…te`(kú?𱇊²kbQ'3T;@ 5ÙÜkŒöúçë1ÔŠã(j—’SËU÷·ŠÎowV†‡ ƒ·0ŠUòL‚áþ7Æã8yYùÙvNœØ ¦¤†æ»³\Óg’(§‰«O[¬`á¯Ù©öYàvÖiž´pÞèÃ|ç'¿=îõ09™qgûúÉ6ÏöiÚÉMääF9»$Z=Ã1C8±¶¿40(‹!ÞsãnieáUáÿä>êCE9BuŠûóuÜvj2ãçö¸±V™ç[+‚CŸbÍKB ·˜b™¸†¾]¤wxŸ@Û †[1õ˜7%·Ì&'6¦Hbk/\Õ•·µpU¨Aå2Øu¦wÊûXƒRVý›G჻å™SÈ£q–Ô*êm ~­üÈgú(öÎÀîÛÀldçwü`fËÀ™/hhDíy´ÜD 83Ô2s£´½›´øÂ@¯¹0§——(LV3Š6ò‚q´ ôÖ‡x83ntÐ ê[Üã çƒM×…b^‘hªöC«gáʉýz’Ãt¸}²kvTx(ÓFú_qþ\%Î$Ëc,ð„†YQ_¯úz½~½êëU_¨æð¦ÏÞl •~0}‚âuèwòª™%K<;™Q7`7ºR:ô|Ñ«¸&šD¹¸ÆÿUY¯>HmPAäŸh[(aq¡ì´Q½IV+̹©¯ÈÁ7¯ïä †“8E«2&DÝhKK/é–ôø~ô¦D‘¾ËJT]¹“¼¢ÜMe˜l4¦j^dÆjFÑ> ½ŒùÔèû¾Žì‘œ…/©×/íœt IGv´!tVnóWýmTµQ!ÝD׎–-êóÐqžS“Ädvœo:0/…§T×eÑûÉ0âjPò.:^´ûyˆ˜úÛÏ>vÇ¿ÁaO?ÝÈœøÌî …èþ!ÝʲßBlÈLk=½Áüf ÚªEái@9gq t„?¢9¬Rú°çb4ÆÆÍi3|¯ÓÕ 8»žb( ˜ÕéKLˆNuê3áÖdo–ÈûÌ:\¹?±‘u^ÇNÖç1tÏá*Å8€ŸÅšg4ôÀ ;+ô".2Kfî }û½t¢FóÀm@³³„‘-«’^#ÑÐŒ`ü_Œ!þÇm{¿%@y,žóÑïm…x£vÁï–þ÷Ú3oƒøs4”Kÿyˇëåóäžï¼Iº„&68´‰z@èT$ù˜ŸUVÙéèÈ7D°5 \ów¥X:Òø ‡Œ RôÎI‡ðÉÆ’­Ò 8¤ µiP‚x=˜Íh6È1@} ž¬HAŽíB’.­ÿZëÿ{½^¯úëõªõUë0“¦«mÅŠwgšÍ wÆ÷êV&Œ+×i+¯jØ.ÍÂöhÖÊG\É”^±0kR•1µ ¶êzF•Ádćzì>Ïá¯qóv £a.sè‰. Ê¥#yËÇeJ·ü÷sÿs쌟iy©¨2SÊ3¢þŸû©µÕ œþ5ùëjå®ãàéè‚ÏÒßYyÇ¿ú§~Þzèõ3y~ƒu*špk)Çqü{)“j=1ô.¥ÔZû£<õ3[éãÏ? ZÇñé e¡I`Vã°ÔI:íánnHÓ‰ñÞ{¥=³¼Eݾ%ý¸_[‰ù?qFñƒ‹ægdG˜-§G·¶3ÐŒ>'š„ÏîæÔÇ–üÚWÞžŽïbYô%}W‹À{…×üº» GöÌt„Ç”좽þ©Ÿdù¿ÿã땘&£ìzÖ—¼b·„Q•ËbfÉØaá1ðå<>´Ù! •d.3—èÙ¤ó°J¾#ób‘]­Ã°G\µ£¡<à;ÆÅ@º ½¿»},Ýž(Ò q¿ä*1æû^¶…Ð×hƒrCÿ‡NÁ‡†wL´7”¦{ Lí"Ó\²-I(8?‰9“xÅè’†ÌðýHÙ­>‚Oú‡F0·Áv2!8µ8gXTbësÔÞeG=¨ÑÅÚœ½xŠ B–ìÑmx§WKcúôk¦©$€dm5«5&dz¾0 a® øS0ƒ.ƒ®s¶4SÉ7XkiŠ¥ý…ï³Cp ±‚ðÕž±Ïn2 t¾«‚œ¢*h4öëJj‹«Åu׺®¡åëÎéÿ|\Z-Ò” x°ÜE¸Mæè6ëqPûiщñ<ÿ‡Tª|£ˆ”ZWDéê£@äöˆÀy0‡ ¦‹ Q+j­¿êÕ° /o¢ 2i‚·BÏA&ºT¥óL\´É4ãý7£=ão…zë¼Da°^‚  %|:Ú[`„­ZUשzñ1ì%â9¡\J’ÄOÏkx->~„L£ö"Ç{㸠N& ºhX-y6ÍŒ´„2&Zf)þ†‰Ïe˜&ÁÀö”†©·áÃiðä0©)7$€Æ¨ˆ¡ÎX÷(¦'¤ˆ)m*𾟿fÞ“½ _®]È-ŸÞ;SÖDW\ÌIô@d¸åÆ~à)†’c¶™afMOŒ·!ú1;fÎŒíÉw´RiX°ovô4­²\ajU ºÿªŠ$*FN³kNþ‰Î»Øe#j1–v×”b/ý¸ówT¼bÕ¯a°~²GÁL/¤ !óö8‚Y˜…ÃcDsùÆÒòC~}íüaqísÜÌÝIlì"Q&ô|ÑóÍ'0¹ |ÇõaûzhO^¤hÓË^{Ÿ‚ÂÓ±õ*sóŠ“ó¿&Æ´ƒgúA³<À“´|Ï´_ñÂm˜Ì•ˆÅ;ð" àóÀIôÉøÂäØßlèì<)—Á‘eiÜdºg‰st,PRõôg¸ìL.£Aݬ€‚'Ðy”cî¨ )I¹[Q,ýáÁÁ·ÿ-Ö¿ƒÆ"Ü~x2„·ÞøBdüHÌÞ>tîgg fÑo%2((Ñ8Ñh30iò¢Ï]¥Ð¢†¢¹Hò‰Ø]É#/&S-»l¯†1ÀiSs±  Ƚ ß¹y¥ÿ»ÃSäâèÊ|öüýƒðÁнÅ1ihÑ–ƒ¯öC(8Ð;h.Töô5rÊl. ªƒVIç]P¿&¼j}5ô¿¢ž MÀ>Kï`¾f´Ÿz-;éšƲÇýš=3i6‘u´i_8šï,"ˆ=ðbÛsbnó)Cvˆ4=Š (ƒ&¥!‹N«Iº`Èí4;…Ð\6ÿ2ü¥1‚¢BC%ïÂí°Ý|ÓbR ¤á.l@©èèÿU‘†·ˆHËX„E‡Y• M‹¥,`«÷cÚ›õã|ˆúw|&.ü?¿äz®üŠbäfë¨`!ÛS\¤ª*¸ÀjDßÑ„öLæuì”ø'„iÍpÿgšb”€›8.º( ­#Zü-ŸT\¢—*À¨(rñ‚bmXaÅÏRÄsÑõYxÕΗµl&|7ã"EßÇX·åMåHœ‡£€ÀìnX`).4.~y5”z‰£F¤âáAyÊpî «á7SPÈ*Ubm{ƒEô[‹¯ý(iòq}ì³:OrœÐl ‰Ë€okIÏT}Á^%ƒYéwÝ9Í’\˜úe´MÍAhüb©}ˆn|¥Ófg…Gs½XÑyø¢nâËC—Žc‰´nÙ§˜ƒ}^`YO&»<3c­ä„“ ›Í á¿â°¼,=Ï 6×+ÚñÿF0ú·ý¼Káø[¾ð¦þÐTúÍð„;31ÅùŸ|'>1ÏÚ-[) yú”‰~Yr3éËZ®¶óÍeÎu½j`ŸýAÖë‚<&§gÔv’À¶•´Ð*úœ>ãÛ¹ šÑ¨.6ž-°¹¡. ]ÎBòj“”j½ìæÊÅüGm*G—˜¦ívÌ›P=at¶è°óR+Ê|\Ç~˜œ3õÿ•`–ðçã±óÈïIÁ`šHÞÖ׫øŽIiØïÛ' ÌÕd 2øBˆá¬Wù_Ôwq^ÏL„Vpá‡3ØÑ-Q#û‰‰‡+i{„÷õ™héÿÿÒÉ"®ŸCTrsÌçÖH€oíûi¹ûH®• €Â£±ªû´(ìàKüîÔ“\ýk?fÿú¡–þÞŽSÑl®aþ3ïè?9KŽò£ßPòáïçëeÃ1>ÙÚ¦>þó ø Ä’Hì¥C¼©Z¿†|(åèw—÷W[ß´/‘¸"‰cS}‡©M‚–¸K&m8JPÉ„b‹õ®Ù&.– ØÔŽà6ï‡XìØxiÅ{óðúhñ,Ã^/¡—qãØ‹1IŸŠ ±8âI—I_é~wE~®kòs¨º–ÂZ¼) &µˆÒõA–¹#cDÒŒXqŒ¡/–å E•ÆÙÔðv~§0ƒ¿%x9g å¸ZuÀnxl‡Þ‰óW,ß~¯1¯M¤]ÑL8˧8¨•Ù›ršùw瓌lX”a¢y1œZGø Á×­OÝiÇ£å ô&ÚJZ¨£ãòÀ* `®ëÀ$ÔZ_‡É©±´^ÀÎhOn3M£äƒbì|¹ÚË<$Ì8çéPrClXf¡qxã„p’&‰X¹L Æw†c-Øz  ÚCù^~ˆ>]€Ñ++CÔHs–6Šê7N÷ 饇Ç—åcK/ÎéítèÙqzQQÌQ€Ô·oÅ\ ë3i—¶8â@¿ ô ê Ì<ƒÙ|K_f}¾º­=ÓvÆÙå.8ºþ;­ÈrS:”lµQÂò+K YvýÏ xá$6eˆŒ;ÙÓp ._¹Sð§â‚üÉRk©Í±¹·¨ýô¬Gyžrà½}QBkZÎø{¹Jk²ddÊFw¥ ÛuQ%[D#mŸÖ°a{Ž¡kkž DžçâBXûÃæÄ!ðèÿ)úO1-}XCŽv lúÏâ†:‰RÙŸt·ék3)§‡‘µSôÇ*“{H!~ýÎ1¢î C2SVËî8"=°)ÛéÅóœ›úqÿŠ8³" Ñ!’sV$&’2E±¨wþÄýz[ùÝn^¾‘EEc8¯ jxÁŽ7]À}6ç¶ömW“Wÿ9Á}kI]Š“d´/½Kð©}eQ¢rßíCPÆ< Šå¨¦8}¤ŠÏ_¼¯ï€Îèꛟ™Äµa[›ºÞ^OܧVÿý8’¬õ¤ÕÁ¤Ëot €ª´ü„Áˆ,›÷$°kÖ¯.rië^\­:nîezÄMëŽÿ“W`Ó¼ fnæûÕg®ëTãDI*Û£¹šÄmæ¹=ÔþGDçïèÿÙï—1V èpsÔCKOØ·ã_›ŽÓïÜOq!œ«dôÑÿƒ<•zûT·à׿¾Ó¿Ÿ?ûÃïÿÜ7Ž.C7úIá„ü´Ç½spMBFmhTHÁóÏ!9k֔ĄuøQ5Éæ­ÓÃÖ™û¯ÐÊð4~¤H+àɪ`¼  zó•'Ý…-“{lÌ»+FäarÞEÛcôÛ]NxZ™ø¼ $Ø<Ì-Ò¥( ªÒ®™Ñdçž6&Év0ˆäÕݾQ’ˆ~ùÞÇdp<¿øÛGƒtfèrøw¹”¹Ž˜µÆBm0mGI#"º- ËË…ojì½=š6ꦇ«¡¿Ó§?§µYÌU‹‰4®[ÉìqÀ…årRÐF!×ä;p©Ç⃺¯ø73jŸÀ GÂªßØ%%³ç]Ôä¬lšI´žâ÷¾wR™àÒßëgïù Gqò$¥wšNcÙZ_µ¾^õõªUÓÙhöÙ`±2Tà\ ´raèÐõœsOh¥cm#‡JÖ‘dÆñ0ø]FYG×J»ÓZº˜ÿÅ×0Ì–„¦ûÍQ¤µã"Bô`á`P}:útȰðè‰ÞØšƒ•rXzkÓxd6GY£±©rw^V pL´dL(Pâü`‹ŽN|¿…†V›Ùqò>2»…IC ¹kºpôŠ.væp†ÏŽ'Šp•5Ö9E r]r¼sšeWeþ&ndæ˜rb¡ªÓé6Εܲ*€Kc®Á²LT̯™n2ÁW‹ue³éÛ‡ cGê;гS«Àl˜keÐÙªW©ëH\]û¨z*ZU&»þœ§RBQÿg«=àž£;Ï‹¿7—:û¢´âš‚äi?_(\)=c+3ÆœhyepOCYRáù­vîºB»ÖÚY]ò‡ç|[ï¬w+¦1a¹òŸpÞNÉH=ô®—WÅðÛ=Ol„)«ŠÑyŠ@ÌíÎØSÉGÐã!ùÙF“EÿˆÎ¿ÿÆ}¡¡+:rø’Ú-ŠL¤ÀÄ…÷GDuÊ$ܯ¢j–woó¢}ËÌ©sóamRû³45Ñá —­a†{°D=³i¤;g>¥Ëbµä°:'þÌ4h`=ªÊ¦•Ý,ét„¼ˆ|š-¯ñ9ŸMžÆ7f‚°VçGoŒôá Ðe…Ý|tÈá©D[T(:¶~C¶òªìh 3^††F´Ì 8¶9rÈœì<Ç+¢Õ§‡~Ѳ?µ§yHâ<™,ÀéÂHë´!©®e„®AÔτڛ–AÚ‹€YÌ”±…ާAÇ £AŠlúËî“II¨*ÿVæç“G½Ž@†|–A$zd(_iy¦9ZÜÆ¥y,fR¶7,§7Hå ®¶à¾§h+YÕþòjÈëiºüÂü÷óåEWògVÖýÐØÓsûd/0¶Wˆ´s\“¦K?.»‰s_Üí¿Ý\¥Í†n­=?æ]{ÞÊ-–É ¦/Žþ@,GV“½¡µò¶„:°+"x¯ÄÛƒÃÛÛ|qËOIšwùYúLå%Ú-£7ê‹eÓs=ÑHˆ|…MÿñÿQ?äÇbàŽò¦'ó÷G±…87ì²°øØÚ˜jcnlçéœC‰Éé(˜wøû¶:Ð9”áËËøPtþÙÓÎܳøþ¹à7°ï§°#<;ýWX Ýù?Ú¿~îù¢Þýݯ,›oýk~Pÿ®FóõÙ¿íìÈä@òïD8h*Í3þ-SÿMdY™9™XJ ‹÷á¯(#žèÄD0Õ©µÏ"ŠCç[‡Nzd2ëë|Ó¥½äϤWy­~Oi¢P¡EWÓ™©/i™FAó ¾n®ß=| sÂçd„}m—¼"Ç­ 'Æîè̂έcª±o‹jùÎÁ¥ýÕö~ 3›;¦ûnéÈ Áš˜‚¥xwŸ•M:Zºêij$&›Á3D z!ÿiv‚øE_EàùF8y¸À)àÖ W q¼q°˜Içx25OáN`cÙZ4Î*D*WåϲՄᵧO—NP8uº€9wZÇîù€›bû§9éÎþ+®eÙ¼ÆR:d‘f£! Ž9¼cÚSòŽp*6X&«‚óœâ*%âÒví+en…Q²ÝcžçÒjè…‘ðµ.ÝÒGàòV6¨“¨ÁÈN+£¶Åú:Õ)\CYè/ØaÙGH„²§DÛ”èá4ïc^>¡ý__ËîàiH”¯m}$¾u¬SØeÓ›æj9„8á•ʆ£Œ’ŸÛÔúU—´‹¿­ëšÞÑ aÖ Ôúª8µ¢Ö~P&¾?ex$Ç÷NÀ§˜å`s{%zóA§ÍùZ'9ú+“Æ:{ŒÅͪSå–`¹ @>F™Ë‰½­ÛØë}ºŽß¤°AŠÛ7)0Æ¿؉­.pW8qŒVp¤ZAüM¯c¼ær€£øÀübÌß:¡»C\ŸÔä£Â *í±ñíÆá±lL\TžZ7vÊ•ô(Nlû…+g8Õ ÜÓ#fœOÑÆÊoù©1|Ï‹„µÖ ³Ž4tdéqþøo {-&äÁ(¼^ cy@ÔQˆ/ëüàÎêùûðk}wÑã+°ÝÛèÿÑ¥I—hçÎÆQ(ìCl,©ÞvÊý²#Áh]»¬¾ßÑÇ =œÝÝ–5¥ÐÄÔQ+bc^eû$1õ#ÂSº$Òbcùwñ~gâ¯X]HÐX~)6Î^é,YûÊ»ˆf}fÓ³vó%ªBƒ YÈ@ÿ~~ܶ }î›ñz†S•[ŸÃ¥ì¦¾R¶iMð],¹ñÜ#zŽ’½¦È6$¶¢Ê`ÎNîÝ·Âü†µBçî+yF/g|‹‹\rÕOçòÊVÓÔó?NúØêÄšFIaJûÄ~ÀÆ¢7ÆÕ:¤înW¤'ÐqQ䉱Bj¦,St qbÃñÉ­W£ja:ƒ{ǸÎè, Šüj\»‡J¸ËÏq'Î?dsVeå‹ïé06J.¨2…¶ô>qŒd`d¢>Š“ ±£¼¼B)®–¬ÕŽâÓû1FÚ/MRZ9 b'ÉûEÿ1·lí( •Oæ¬E]vVO×GiVÄM‚ýQ_]?vÈäjæÛ ʸtÿÆ£û9Èï x¦Q×ц*¬sÔßR@ËéY¹Ö®ús¾³zÑÿOݹeÛ‚={ ²Ý^ßÈGLkB=X"4$ûe.°½3[Õû§ óãmu^¢tbá]$6)˜àþåP7gލûs9ÍlY âFIÏcÙ(%¯—s0LÙtgžìôAÁÕõ-‚×B™ø}éP©i&=äÆ@ÑN#{“ò²ðõsó Oe+ –ÉÌ {K/ÖÍu$hhÈ"‚”ºWß§œ™žlšÑT½¥8Óü±šQ7©=@YŠ;E”èP<¡OBb„ ¤Ï:c=ÜfòÍóc-›”b~ÖïËÈ8x"YÒ=Æ,…‚ ¡à‘uI”®h¥ÿ³9|êeôó–ÃZ¨Èáï6sûšÑåâf×*ÕqÝó ß÷6ˆä½a€Ûþù»h~¼˜$™Ü½8™^âfÄ.áØêÿ„xµ%j زˆÔÌ|3m•Îâø†ØÆÛlìì2úF{:Ã…ìˆÉŠT| ®i}T­á²GÍ…ãD¢Õ‰3¨sAУÑãÿaM{þ·Eç'ßÕ§P)2+â[Þ SÄ*Ö`¯ˆ‡ÐdXÄD¿g¬g2sðls}b@ñ²¡á\ü5;΋{k ’ç¾µ¢Ú‘ â<ü!nu¿$5DÁ”éÛѰ@'ɵ¡í$\N¤ <ƒ˜T Cþ¬àâÓ%ƒOäÝ \Xœ² ×Wn™“ Õb™H„è3æðÆ{uÓèf½IxIY&D©ŽÕ _2ÓªgCþT4m|=Uz—¾i.ã– .ÇYȞ͌Ӊ)L=.眕j±xŸóâS²8¢@H,‚¸p œlrIù¢õ¸ Û]ˆ­e¥R*â¯ÜKN»HYpd ÞBpEfQ ®›P˜l‹a¤YÜ|ƒ¹K–’JRy°„ŽÈëñTùçwÌÓýûù}?» â€ézðâ»:ÎNñ÷6áÈ~·¿±ñ/h:ƒóÌ’òæãIûjÞrp…R^ö”»Ø²„HœËJWÕ3yŠŸ8]#B]h2 =ßœs*YüjWs3ïÝà}ûEÚ„]øé±»OÅÃ-ÔFá~²Èþ—wÁfü„³©ýôÊú`íµü‹?\öÇm’6(ÎW€4¼jßa‡[Ÿ¥R~…w`4V‡ÎŒ1H„y{ÎZìÎ%„GËö(W¦¹Ÿý³ªÓ#9p×C4œóá­ºò¨ê¡^g[=¥×­¿ 6 Ÿ^øzã66°­÷XôéÙ´û÷n}Ø;ÒˆyŠ>ÿnÆó^EàáèNÌz¶@¢yGl‚Ë'PHïÖÌO–°pbú¹¸—!Õï”÷E{›¶ ¦<4½LÜl)év%@yqÆB’ƒ{^½‘n‚l€t÷P0/¸9|EŒƒŽktÓ8™e ªè^§ ÓõïiæReôÿ=/± F·õÔÚþôûÅTeÓÓ¢[¦ê–ÖìØÉ#‹9 ¼²ä®~]oµeqZ&…«Œæ¿Îûµ¡‚Á)ã ˆ|³¼OáYqdÉ ôqÛ÷?ü2i£Ô<·Õ­~½Þ¹¸WÈžsï´†?ç.UlÍ…·á'ó—QÊ1H+aþ £4Èß­[¸|z»°ð‘|‘LyÑ#gœ4»¸ÒÇLBìúž ƒ Ü;‘5íO¶m<üEè£ëùˆë¿«Øn5^NÃQ€rðz‹G—_R~ßeÊ“?Ö§O]„~Üÿêݶïþ3å„ûq‰þ_d¶ŠŠzÕ™eÝÖ%Åg[,Œ»õ t;ËìéyA¨o|Ã*ßÑ6À*×ÍÂ.‡sÎÐñ3Y óÕeʘx(lÆ)”r«:‘¡þð” ¬ ÅÉóýÊ…Ê8qP,c¼¦úhY3ÆA`ç4E¸}Z\vHöOÉŒØx'´.J\ÌÄ\è <~€6)­WÞ˜4/+ší ·›”9˜]?ÆêøˆP@•¾Ât¸§\¬7êDû>ô¨Øôõ²á­Ãy˜Tn=Þ»Áˆ DÂø!‹Û\èée;³¬Ddç´@ò[ÑÉ䣸 ©Ç|"ü~[wGrEnW‘sE½É¶Øÿ¦èüÝ1»mVn¸ªûKu-¤H›±…O~»*È+…£°³›~Eêã»x5ÿ$€þýüÄŸï#’ÎTl þà?¿¤‹v¤ '†: åüïÚFÊìR•8bH+”„|xÿs¾,_|ç,¡~ˆ}^Li Ò„× WG2™sá“&*·§bµ°b­,ã§49'êe3Î"”l¸{ÖãÀDh$Ë¡¨Š}a2¥S›(ƒ½›z±g9›ü@VË~¹»þ4[@ɵè—iÃ,õY'ƒ²:@‹­lŠa}÷'mZ«~‡?¢¡qFj ߎ¯G8âf™½…ˆZÍuaÀWý{Ÿ´1D¢è*LxlrÿÝ¥Âõ¦!íݨS¦£¶¯¦j´•)èÈ_,VúǶ}å+\úêoÖÜÁ¡ÍŽþ/ƒYÞ6ÝqÄšŠôš³cö* ¼îCF»#8UÈã J@ÿ=WdÀ5Y!˜Úÿl¿~ö}zg< {Ãt%ÿC•×KÖ81CþëD翤ÿf­®Ò)½dàà“ÿ‹?¿ºÜ„¿H …e6d´Ñ[â>ì±ÄJsÞ`˜,eúdtçKG Î5!P·ÒôuWaÄ»¬è£` 5Ò€°lY½­ãSË„1a \€ÃšC™;A aib-«üÛZgÆ'ñ2“Oþ¸HŒ´®>¡“mÔˆiKY¥îsÖåŠî0‚Œnšóì¤w JÅUëv¦`¯ÊN¬VQ|tûBK ­U^A­ç·Ôk¾“®œR”-×kf`Þi㤠‰wzÊ´’Ðø7Hï⨈ã¯i£]ÉXkw°¤ ò£ÝsaÓã.¬s¶³¯~ÆϤ˜ i̶…Ö¨s‚AØj_ÑíÑ4Ôõ€²ùÉä¤cß`‚vDGPóÏ´ Z†Ðia`ï æ²ÎYRw¿ßº7[;÷dƒÄw–€0`ëØ}ß\<:eƒÏÁC$b!Ü/Ò¢_»Q‹«1ý‘¯]d{®¯Ë§gõ·\sÁoVÂW¦ªÄ¾õ42·áÿŒŸÖw7H~ñil"•1í¶¸$žêÐÿ¤´ÕXùßn|6D<¤¯šEP2ñð›õŒZá¬ù¶@õÃDçßß׊MdúlàóiÆt¤ÏRzà`ž„šµãŸ/Ü]ÞîM÷”Ü(”×3mèZÒÿý÷óF>ðïçéC½·»yãSq›úû ¡¡ÆRJ)Ü–bclFðf ‹"²`ž¡ûÆ…Cåµ1{Z @™[rÓþ‡`Øn"‚W¿ékZÚ‡‚½<„2fG£²~¨xlÜÚtj Hé#KÅ û6äj€aå€*dâ!2×N:ë\10QI[ïŠ ˜d±4 jzei–@õžÍØbÛ€â…ßy®”Íã'|…ÔĘaŒiÆJƼ¤ØG–0æXJ9x\žz}BW.¢Vˆ$£àc)?qbÍÈòbûtzóA ²Ïþ±ÿM…Eø —Ή—3Þ(­Ñ^·S¯ B¤ÕÑg÷ÙdÌp:yÅG–aµÐפ£KWd´,=[E¦IêÍS‡\“ÍÁGgá;ÓbdPçXº¤ŒçË ·ôŒF;Ûb„…ÎJÀ|(&Ï3çüP¤hšc:…NëH˜ºM‚@{›!výã]D{jDmG“IˆÛ¨Ö¸É§hWaÐQ3S‚嘜®È¼®dúÀlT ²ò>ö 1—“¹Û¶ª*†Çq­(Î\–{ßÐv1`!ù³;šdü‰K“…u„ƒ<›:.„:½ ‚̤=ž&õ##Ì‘ >³HBñÅűvaú±C“ ¹ /‹ÓÇîA¢A€¨bÊî–†âR±þ×[«"gEó…FK1öÉÂ]S)×[9黄ψöiãk±ÃË臥O¨¥ÕýƤ‹KYç÷{x±]çç?µHk½ožBkߨÕl •©œ×-:yÿ®£Ý}ÖòÌ>'À¢&ßXpp­P‚çûP¯gæ(í±˜ÇÏî=¤ êß,:¿y=w7CVˆ·“~¹kW<­ùS?¿’ [C~$@}ÇÏf?0“Ç}Ö)BkÖpèíu3%ÞÇÔœ_da’_xäoüæ¾°&ñkw"¼”zÞòAÅÓ:®""Ü÷— +bÛç³É òhBË%Cÿ»è°Äq$£±X¥¸¦@ì°Ñ×^æ ÂJ•(¥x}î4¦_Áíõª¥ÁPqÆ„ª7¥ÊÛ´sõ–9´{¡=ª+lJù°¶Ô°m7:ÿìÀ—ÿ‘„ ãœþ¿µ…©c¯¾³l>!P~ ©NP>Á9ÇJÆ7po;`zÅÌÞiè'Ìð:OC%ù0 ˆuŠ´ò’ØÕòÅIþ;å¢ »oEjk\X,.ÖáøB¿Æ}fݨ¿ciäŸdÈôIXpí*Ä1{˜Ò%ás£è{ “TÜÀí#gÐz;§œ3ìù;ž75 59è8ÚWt`¿«uÃAaûËèXḠæGL¦3)€7¾.f(éúËýÑzüº‰¦ˆQ?’ZiçŠy_o!w BL,˜×iaEE,g/¡ÑcZC.ǼÚ~õ’O¦"oà)íòƒQJe¹¯Ñ½rí¦CÈšYX,.ì¡WY²³ˆ˜Èe„hG˜Ëù•ÁùFî˜KoüÝTf½¼õw¨¯ïA.3ÂìÓ{‡>¬ û:°Ûèý˜à†vMßûaÑekÿ hòÎx*ÛqÌØÉs\ãÙ«Ÿ¸a7Ð_ªöŒfnʦ1lk d‹\6ü“ €-@òù*ø‘¢óHˆ#åN=ŒdÚð‹v¾OÔ,ÕSùGáž7xÁQÊÌJp¢êC÷}é¨ÊLÜt{ÅÓh-ñÎäðxRM•!'’+6ØŒyŒ–«×álí.šà„Ö§!Ú§RM3Í>­ä¨¹êÙbU8•b– =Þ3óF–$N}Ê|ÄFÚ¨àú_œ­Ÿ<2wÑyÝÿpX›‰º°),Øk¾6Ing«MÝ~°T9Û8Ƶ©…ë4¡f1»äÞ;¨)CÛʯDvˆøç¨Cf´q2ìB½ ˜WUÃy*sYê"? ˆ ·}«Ö¯Òà"Ѷcç"Ù%N`u.9¹>YFÑÓîÇ Í¦vÅfÛ„‹í«˜÷-D'¬e¦‰± q§-͘f€aYE2Ñ?L 6¬l—n)釠éÛɹ­º×eèÅY­½nþ|:î?Fèón7˜èžc„™Â3™ž§p²[f€ƒràúP.¶À†/˜í-@*Ùu%2‘žnÅ+^¡xÝ2ŠaªMHó¤Öǵ㜂!Ì€bƒ?HTÔR‡ †ú†«ÚŸ1‘!2‘Öþ4§ýF¡/_˜5{ØD›LaR3Ù_ø# žÕ•GÆø€!ÿV™¬ "Èôwff çc˜(M¯ Žþé9Î3ˆ€Ë>‡þwk±ƒ_P Ÿ’) âªÂ¢æ5‹>q9’°R¹Òþ|#ÓîÌ–wÉ—“+¥[Ù³†¢ÇVÀ8%ߟžBT{ÚÜY¥¹wöÕ·¬üt`)ÃNÒè šÔƒÁ¶omO®¥-÷à::ýŸ Í-”~¹)È’P»ÿª“ €Gê%e>°œÏ˜ŒàAýòCP|ÚZÒ “ß:19X6–Ø2£Êæ€ëì‰þ¢ó·ë“Ôe\šî„<­ó si)OÅ¿õ¬±ú„¼ tJ0Bî ò ¯ÇÍ>™VnÝÃŽÁY+±N’ä¯õml¾ùZþ ݤ›ÞíwYsðaséîùl_â›§b’5°÷Ep›­êÀ–ìÃ$âR±!ó ÁÕ+îŽRX6ÜøæßÒxTÅËå—R†}ã×aìÞ»¥ƒíµÏ¼‹ˆå8lx¶V0dÕkàŠ¦—jüoÆè¦ìˆœˆ «Ô½ „ ºÔÿšzçŽâz 7N1ãq˜` u®zX]òšqG{€0‹Ðà·^¿Ð¶}ÿøÕ5&o¤ ó;Ÿ_¾Ak½¿Ê¤Í1ÍKÏ€o°TÚðyIO'`ºˆ›¦lï–ŸtSÌJÈj¢Üjàëm>szØÜ}¬(A&$Dá¢f[ Ù{Å¿^§4§¯ÊFCÔû9O…Ïnl6Ù1iŠ16”ð¡’æV=ù’à ¢mHIæþÂIó iSIö1 ³µ TÔú:ñÿZk,×ébÇ›NÍ¡§ƒ ›]“=Ò.ÛH¢G£DîþÎ>hÀâ`‰Š*ÐæU¬Ú’ʇf3wÏgŸ\À´bÖl–tqBvÀ"#Âpê3¼ÁMqÙYJbÑ#?ăߌ_ãfRPPªƒÎÓ\EÔ”›½!3¹þNk3¼2„CmïHtj³ûYÍù´J]êÐ ÿé0ÅèÀ(bQ7±V0N4˜éÿl?̤ڶ˜¸GØOsæt.$^üªBI±BD…¬¬%î•„F™!¼ë;Åí1V­K²ëýX‘I?®÷÷3&b¾¯ï4ƒïß¾›ßù=8YŠíÞ9 -OU ^èGç™­£‚õÎJêÔ¢'ÓþÝíBüé&uXÿ#È2›T/Ëß@¬ìDúêdÙrƒVýƒ©ö0â‚/›{ø{DçMì´³°Â°°0ÊÈ ›Wyý«Š‹Öë56%1¸5ü*¥¤$E¾“© KÊ3œKÏÛ>¶_Ï NÐV÷ñŽC-¯àÌ:‘Þl¡IçZ)¥fRÝZB—¾oÞâ1@XèÌ $¼«°àÆ|óP”†”BÈdØ%Cïx2Ö´<Ž‚—¡sÓ>u2Þù KÚb{ÚãÕ^Ø ×wŽNÙ¢Ì=ÜvZZ}·™×ð.+]Ü0GNh ¢e CÜô207Uîw„+9m¥Kµ3o³1öW A°õDÄ{/8öM_ÉO~vn„ËÆŸ~⻿ÆgÞïëp’øJ·º[‰X¤Ùk™Ã;Bø˜õþ@|Á¾5¹¶Hßœ¹Æ3^lÀ쵈%åd§¡-ÓáDœŽÅ•Ó@ïèl›Â·LÄ•E ÚÜì/ï\§yJnÞKS<;Ypmm¨¦£€DÅqœROÍŸý5õŸ2Â냵> ÇjឺìÐÃÖvú¾­žbÛÛJº_?kðîíÐñ§#eÉ~¹ü;-¤°š÷v¬R‡KÍOå*U´9}´òwþàÍ7‘ñ!äë·öÙ#ÄiŽß ’ñ“9pyðþSØø~Žãø"îÿÇc€‡(ÿýäñŸê׿Ÿo]dz ×}‡» EÏ\˜êÍ­`ràsk!Óé`}ü·Ò{Äj¤?ðžýüÚ+±'…Ež/ÿ&€oøjÑéýàÀ¾Ýé-â”èoóâé3ˆsE°p´#¬¶:ï×hhˆðaK/LŠ±Ææ‰¾dÀ(ÇÏÁ)‹n¾ †ƒÅèÂRdÔcµqaÝ„d“ë£x¢îÍÀÓªîc2n`j´þ–e.È;°½/R/A#º· òõl €óàè!u§]D‚ ô`¢p=›0€ÐA&›Ìè%Dï;c#àMEÓ*RÙ\hHfò—Úy²ªÎ}€iÐòÌÑ¡ZW,‚i<:.j~6UH8#ËJÕ=ÈѬÒ.K#Ën †ÌÉþAÇ=YäÙß šõ¹«¦‹ y+±÷ x1×dÚEÉ„”N±þ¤¹É ý°áqEQZ6îÄ\­x0ù$÷Kºx®ç*P"w£-´þ!'¨çGÉ ¦ÕU¢»û¾nþ§‡èùqh]AÄ­ýò&JFTÌÀŸÑîu¸6øKWo)îò¥1wJB³HXŒ¼ZççÛãuLJ<@ùº ±v3Ø<$ª^ÞÉ&óÂ'ÞcQ¶Eï¸C9/Åäj=”—î×TóUk)¯W­¯×ëõ:±=¡ïZêÞl+±í^`P¼l1<}ViÒÐîiÝõ¹Ÿ·f1qõ3M7¸Äuwr÷¨§¤6#H&à'Âhá,ç,Åö"<88*Í ýG †ÁŽ4º— Øy•¼híêS-­Ð‡TÔºt,gš¥qå±ÈÆU[×lèø¶ˆ`Fà(„Ï1,m[J<ÉÈ?…u•†‡HÖÃvÙyCS²‹n,IúE~×6ÀY¸Ì¼‚?T>ûžòŒÒ‰´bæÿ9±pœÊ×Ìîz ¾ŠhÔ ï1÷“D,÷ü§H/x• ªühyg„$Ü”}žkq•þ¢¿ÞA‚Õº8M²6w0 §¶áÖÃ׸4ñfã_0áŸôÔ4©˜é‰Òxs;"È3kÑó šé˜]—õ²F›G@_ð|CîÀ¬\›²ó^l§)J2¥uºZ^-Ax7}i°µTºç6€ùŸàÈ–8Ѳ SFQ\_]vî6ˆþ² ã2èm€>|ÃhÉ#‹”Ü9°ó1RìMµ¬Ÿuª)£á´g^lAÉ4^„¶õ¢xPÿ/*I?K¸Ë† zx´ûÐôlÖÙ^OÀ€fR9cø{ƒ”¢ÿûH“‡Kh—{ñ&jnY÷žµºóCÀêŽÍySÁîfœƒa3áºfwof ºœgƒjmQ¸›«Ý›±5…»'¼FÿËó”ÍŽT|ÌÛH«qˆªVMn v§g/×¶%³WŸ¶ ÷fú`”üÉäÕ½(„÷yý—§¯#Uÿ_àÎezÊÉ%8ˆ'éÑŒû5ãè#Õ£¢BŽö˜“]ùÃqÄüï8à É쯷ß;ÌÓ\\‡#0ÎѺ"YóÆCó¹:ŒY¤*Ûr]v"oo¢oèéÀÃÖó/žhž­² qTLî”ÚÄ޳”L¤MV]»…ÉÉLxH;““Q³ŸÆõ39 í¥gÛ© ãbì—uD³òƒuOöAs‚(­ž)9{Ôdqj,¼Ik BI-gá0 ì&XלVð®¡.ѺÄ^V¡o¿<Ô _ÀÔr5¼?²¸3Ò½;Z牵: äãÒÄ¢…¸ÚŽ6Cón”òËñú’ƒ3êûõ!€ÖÑMþØ1ž†Ÿm¡; Ìv»ºÖ©¢Zj¬¯XÜ!]Bc¤+­ƒÖµ¡´3Ö> vJb„vMo áufÅøÆñàbH†Œ_ß $]K¤v-„l'óšÃŒ!ëyHк1 Iÿº½ÿ~¾ûÇ Ôàiäa*ENö;I`®+™áÀ–‰Cö!\7\œbrýÏ>ŠAˆÌ¡»!Pј™(ÿ¦6=È\¡ˆ(ÅŒý’PGtu _:¯Q“cS󡱕µ ~"=Ô¤ŠŠzjyœm€ZOà ¼/‚&r¥Úí‰Åï Ÿ,šHÊ!£0uµŸáÓO¿[£Ïÿý¶÷¾„%TF%ÛF½ R6µ™£󜶥 †‹ª‰;z0Û`» Û”)­¦Ð³ê÷ OŸ?õ&ý=zPMé›…‰ûäÀú{ŽÔà­Ÿ ÀÖK*íM—?¾œ€Ÿ¼àÇ2›£ÿÏÐöÏâÃÊlÒ'ãñw‡¬÷„ö~&ù €Ÿ»ð¿&:¿ÿƒvƒ-Ùì¤Ëe´ÛÃ1m¼½)–)*öœòÆ1ø+_­Ì¬0šIëÉÆÛ÷%_lÝEKàa|fF‹_³æµ~}—sëžV›+eZOº;.‰ø0vð8®ÿ졵ÐÐŽ­/¢ÿk+éÙ›}ú+´Åãn*ª»·ÚäÖø ¶ÎìX*ÂW°[85uÆogµª=©Œç³×±gW^tLýaÚhÞ¾h)茿æ_-: eß¼l ŽQŒ"èd ø&ëc.jç`¹ñÝó ú[4ÜBô‰Њ>Mc°µ¹Î2òWùê¿Åý÷óïçÁZ„]âÉŸ¾û±ž&þ•l#׋Cï˜å= ¥•b(–øÿv¢×ˆ6h¯’ 'Â9o›í}0Û…8RR%pûY„_A\ÉÙ7G' ÀÕPVÂ^°4˜"ÈRÁX…S‰Ÿ,Á鸈-ã– uÑÓpŸmΛÖòƒ’˜sæíó¼"¯ã:Wë7°|oWÜ'b× í<àÁ>2~Ú¾ÄÃÚÄ®ú¤†ÆŒ÷ºÍ¿Æõàéò°ÅxŽ—Ç%F29³~ŽÊQ8cÚ&WP~ðÈ+§ŸŸ 17jÉ^,.Û$îkyo¹zdBSìý\5õ5¼¦ešçþ³µ}è k€’*'jñƒvô\œ‘t3zýV|> IóŽROB{Egõuº£VÔW}ýúUë©ûƒ˜²[´õbïsx6´&M×PÁ%/‘̘³ýÑ“Gˆ9ÏdZ2¬l‘–`{"Ua¨«¥œ*OÞò\kyG€…Øh¨ônäÆIe…ä D£ ²„]º‘º0IUÆÉÏ$”Ùœ/íü«÷Ÿt)Ý@O)50ÓOƒIFÛ…n&±uhᛌ­„}5¨ÐÙ¦nÏ.Á°#†Ô´Â–|Û1%„ˆ4¤'áû©Í`Ýð–¼ÍZ؈BÝìÎõ“G6ì%wÐò. H+Ù¿0—…7y6¤?–x8œñ/ýÁï¡ø÷óð°f–}þ==od¹ƒæ®··ì©Ͱ…eÝJ['{sÌ¢¡ˆwA™YZr߉ ;ØB ˆœç=¶º&ÚŸ¤-GÓÚ§Wf÷ñã4?A‘ú0û“nˆAôO:gÙèÑŽì¬Âíõu­õU_ÿïW3û­—MâYà:½YdÌM~é[Í7i2|d·ÇîÈ+âŽ`R Fÿ½Òtkˆæ>Ùç×7{ÜÈt°ÕN M|é‚ ¨"†xü¨ ßÙçv,µJÙÕÊ’“QF»ÿYÜ'ÆÀ-*z‡ï'+Âý£þBÉåÿ“IÛ9ôÛ‡€á›ÝƒùßZQ¿{ÉŽMÛˆ7 Ç•þlàë¯ã ‚6ÿd:û[e¾c_L育[Û@bÈG׌o¸/o`P|‹ó7^ü§ËÆÏ:dþß¹&„ÀÜVŒñS|*…¾NqÝ:Óïåîêß- _›Åû¬ý>ïüå]óëlÀ³À”8óõ=Ÿˆ*<ׂ­¾ñ¥·±c=±Ì*¿å4DP1‚8üÍžåí-gÚj1±Ìº`Q"ÑdØ…Þ‹kŽ¥ØÃ"úõÓEÔâf©Ç˜­ƒY„L*1Ð :¡›*øV¶Y9>¿ü Æ{%&Ztu}ªL_5R÷Œl}R&u¤ÿÖhNž™œQ` „­³„ÀÀµ5BưúùzruÍê„jèð¥[PŽ¸Ê‹ÃVœ©=ó¤!*ðâ€ØÑíïrUD–ÙsÕ§ ‹3® §¤„èœLDgéõÙô-´‰Ä´ øhPÚOÃ14û%©§¤.ÿ–г)ŽäAœsþ¶a¢sÖ%ƒÀ9“jÓ Ún:v3! 3Á¼âÁn‚ ¢Ú¦PšH¨¬†Ø'Û¤ÿ…ÀѾïX^É9Àg2ӀЙ1ØaPùÀE”F:4ãs6QûáÄ›>yFú¥ÙÏÚ6Œ¬ÍT%¥Æ§=‹£”ÚUìIêêÒ‹–Žø þáV‚^nRç§‘ö£x òÕ$¥V‹4òtÒ=¿²±Œ™oê1ÉBy8#I‡ºè_ŒKëËÅïD­µ°œŠÿ¯×eø{”rœBv¥¨Á¡iþ&5Á9»qˆx°ÒjŸÙk×<ËH2u{ê…áŽHÞº(C31š¤J€^V+Xe¦Éôóépžž¢º"ÜìÔŽ[Ñ @ÇC‚îÁ½G‹º-&†P_'§àXB‰À]áx¬jÑÈ.pÝàÑZRŠA0÷ ñ™4ïܸ-õðyô»Õ!‚ß“ârˆ‹]3•´ðÎ>g‚Ò0¬’ûŒ}iÀ¹é‡à8Б·Ÿ6nõ; 3ßKZvðÎŒö“G›5ôWï”\!Ê]û:æ+vßtƒ6½FN ÛîÕ‡.½Q‹)qÍ¥XKÐËz‘ü¾€É…ÉéË'Uð¿.Sö}GJ†aþÏ–²¯Ac 5ƒIñ–·?Á n‘.^DŒE³ uèQyŽ´­n‡‚ Ÿ§_NŽòdm {øÎç–*my¢OÐrçWù÷óïç¿ù£2ÉVøšMäPÏFn„È»XV"ˆÍI-œÅÝ™Itnˆ°ÚWZMd±1¶ø„ZjR˱M,SÎ`h(O³N˜ò³ª”¼ì-ÒaኜêNÛdQéÞéÓ2 :!/áÅ›l”•³D¸BÛN@Xx,¦cWføè¸Æjxµ&&Ê,ÈtÌŸy$ƒ›ûéòWV–Â\…7G(Ü)z¤ÁP¶m d^M1™eB¼Ñ5+9&BX<& J”,LUÛ{'Jæ¡\v…=LG•)9Ñ$p–;»@)5ý¸”u'N"QX𶬴 ¼€zß:íƒp!ÈCÑWã_Ò# ŽOáä_~°Ö‚Aß%¤žÕ(G¸~0Ù4½aê–mXBñûÔº=êP©¦pK¬Ãõdfk¯zþcÍ]Í#LzE7v>³HÑjèÏíººZ¯^Ê«ÖZñªõUQ+ ÖÈþIb êu—Û£˜1kÓ§åpgp[—y3x°¨ýIŠú5,É ÌÑ.oƒ3ô[|»#e÷Âu%eÎ"¾ƒÔ¨¯)o7âŠ5 òJJwMìn·(×sˆR¢ï]l˜‡³Kåš|³ÂÕœ Üñ>Pà¡ÿŒkš*Í*ó¤Wβ4ˆ‚C†]i'eJ¢éдì_£€Íu˜R/@UÕJb8d?-ºô?V™¸ª„Ô p”;NlRØ[cI%€DŸ+WþIñ£þ‡ªâøŒF$yù÷·á+nanè¼9îQ›LRI£Ø´¥‘¶ hÒäÁÍ0}ˆ¥ìƒS: ßXÔM3ÍLVÏ&•ýKêq7>§UŽ?iŒÜHÎxïQ¬ë @óßÚâïše&“B,r;ª«­‡ïÂÚªa9 õŒB$Ît·ˆ6õoFòÚ!÷½±UÀ´ÍÝ'](0爅®TUÕ{}GýždÿŠþÏrä÷O24ŒÊ†fÒ_.:O§¡­&”ét²ÿ;ý”ô%q”ÍëTNØb«ÚNñÎeáÑ~15K°Ï$q[õ0@mܦÁܲf¼•xò‰îFÜKÈð­±3Sô{6æ7ûç®EYhF¡ŒüÞ!¹Ì§AkÔ¢5«m.~˜*²íäO{a©KÎpP^÷ž çPk¼×«0OåkF²¥Q~`(“WNÕ 0Úš8ݬ‚Ø oO“t Frzœdžµðþéˆy%áS'蛣¢ÐOU ´q*…î_á¬díâÒÔ¨ã>KðĨ~¢'ïk^¼/Ikè§×{ù,f·Î@×$ Kÿçù©¾Ü(ëè ïŠ 0á@'í+m"O·'g]«Õ âþ:Ç,ÅDù‡³ðÏfŽöïç{~"¬ÿd–z72çzIýOÝKn2BÕB&Èhœž7¯±ìçØøÚ+Ù8lC`R¬±„Ùš@a[$-®…z©ûŒYUÒ‡ ˜” Œ€f³Éuç~¿dˆêoQx±Ùy“ÍïA©V´@½¤¤={ÞålBÒÔ6Ø,Â3d,ÔVámçÒÏí¢E̿Զ5Wú|2'»oÒÆù޽¹ç $—ª *RaÂ( H[rX˜A®6e ¤V–PÏ1~b›˜£ÒolÿÉc4ÅF’߇Ä|ü0ÚNe 7ÀMóú©ì½¢Ý|ÕÓ{÷žøÎÀKÐ<ãRŸïûÉ óXÚȈ>l‚q °Lλ·„>:áÔN|`wðvÇ0ŒÎ‚_eï¶>;0ðAAÿý€|+œ]邱¶7°ŸÞN†bÍ@±&Àöüd<¿}8Œ ·ëþJøQ²ÿ]ÑùYqôõ£›q E¡òÄFêéApþœUÀÖòŸùù§ñ-3Vu~,ô²‚ùrQ”)f£ÒºO£82f€‚c£`*ù}‡‰ô6v’cÉ’^þb'xp‚{Ø5|= …Æ´³c1ݬ†3×kGé#–ÏAË!ݰ,Ë\Ê«CÖÇqgŽ2Îèƒ\@,Б(( ê8(¥àèøfú&`ÔÞGú/Ö°¦Õèm"¼&µ#'KV70 †PYYßTîíi23Úî¶ØuÉL[)"hPŒR½¸s(*#˜ÅcX»èï¼#YcãŽ> ‡DšËÂ÷vì*,iŠ¥…±Ê´¦lRº:nva¤i#náúÞ!1‘ùgB±Šgs!îoì‹íÞ;GyƒóNqÈr³€20Ö©- ‰<F (ûW3§ÛÅñˆ»³‚!6¯­¨ '%mðÄpr÷Ä0ûû¾%KÝ]¤wîé»0¹Î £JWš¢ò69ü‚K3Ü¢DQ!Ž#zÇ@FÈ‹ØÊ†£û¸~¸|‹´z÷æÕtvla9¬)ÊÀvØ'0ÒHŽ]ÛIé˜Ì´Ï- Å“”9ý·9(<ØsºaØS3è8¢‘ëÞ³ò¥¢—óq7“1ßk3Íž”ö¬‰eÕ‰üÌx VŠ6dI¦ï9ÀŒºå†•„à“òkÓ»ÜKe[ÎÁ–œüÉXÑÝêlHn<œâ|FDv>Ë’.c*m¢ßîhΔ–1è¡îÒ_¥›2Ñœ›¾Ø"â?^î6 î=¹:©ÿYÞ=þ'òŽŠßS[oX×±$^ [¸Õ;·ñýõ3­ô0w•Ó?P´“g¸6QØFï,v3ÿÐ Wzø¬€>]¶óDèà ,§ˆ_âšûÖ›}C{9Až¨!=~Ÿû¡ZÊñǧ%SŒ¸°·q‰eõE’ÃŒ6À¬ç÷ÛöþBRlçQÌ.ò›¯¿Ý>á¿):o‰öûŽnðñ²œ»ùØ÷W­j­Ð87`úN0SG˜¾¡«¦!”º•¹{­Þü@ÓíÒ)¿þŽ­òïçüð§\EÔýß).ïó€ÕІÁ±˜!R4ÿ s#6ÄŠ «¨,ÚÉà O+ŒÍMKðvÀ¼egÅ)~ÁÆìDj×ÒÔÊ Hà¤PŠŠ á@äkád¤Ae„š\ÊaÓŽ*#4Uá¿/ŠãÜWÇ•àª}3“t;Ûq©ƒOÏ¢K‹ƒ‰„QÄ“÷OÈ­HœZpþ¶Üµ|¢ÞÚkX“™t0¥Ž§ ïD§y {ËDÔØº©yJsðÆe˜q-Bi@·tÁ³rB/3=ô1ƒÑ꣗irM³ÖL_ù€'Gvès3hX8$W‡PÍù›ü—¼B÷°Šâin59f¼>o`g‰xº É-¯‘Öå}:Cî½–MÊ9MÁŽáF:ËõbqàõD H³Œ.)`µ ðŒùk³DÉþR8>ÁÍ/St(°Z¶>œë/ýb¡ñÄá-8‹ë岩Ï]g¥Ž¶Š Ó\_̇—Kø1÷”|VÜMÓndrì¾Ð>G~³™NŽý¯( 3ïˆÐ¹zÓdm:ßé%9þuا°!¡r1·»e M>I.—ÿE*gª‡8óÆg;Â<{|>šnécrõqTdg¤LûËS6&[°O‘$B\&oÃ\GÞ”äæPJÍ:myæ9ÒÖÇl©Ü‡+y¹GWúÌɦÓ™¶ˆïŠê$Yöpœ5®ù(5Øc•Ú÷p/ú<ƒøy».fFÞÎHY+Áñ5r|rN^ÿüžËš`oµL&ÞkQÜà›“g¸øÄ9£ýß1 †é ’iïqT ÿ9ÕšäÍ®ˆùôư6¾ ÷iŸ{¾&øj¦Ç°û´w­uý=Ä®¾$þƒe­\L£ Ù(ú¸E· gzô²’P‡QÕä£÷„ëÝðl¨¬>„Q§˜³®:öø;Ëþ?):ÿþ€ Ü×’œ.²bø=%v­¥ÖÚ&þ#º?òóK&˜Ô†f2Ò¨¡ ¨áÈ7ƒßv·7b¦¼,7Á†¼vÊr/((oB3û'–SœÓ—i‹x~à¾òg ~ 9B LÎà$èUªâêÝ-€¨)Ûœ LŽZñ9©mX‚ÑsƯDÅ‘«ìmT“ô]­ Þ1ÁÄa×ÓDT±›Û^ÎëïBf(#3ŽTzåÚ&zéâΊÑ'«®KŒd8(ôœKfØû"R˜<ø„Óð–­Ãì„CAðµ÷ÎX@<]<þ*EçÞŠÛô-Ê`朜 Mú&êÌÿ×ÖýVvj¤¹(Æ–Ó}=I0À@°TßQ &VçÌW‰6—á¾Ê‘çµ9_jFys°Ó8 /,Ý@N\#¥\$8X¢ÿ®™Å«Ñ­êüÕÂs]<µ{q€ý½æ/n Àƒ“²2efwk†…-½{[?`‚Ïj:eÔU š ¡þŽÿûDç-…¼yÜf“Ppø:ye±À«š ¤EXD¬o­3y§®id?íQàá%{°cб ‚vµ,Â9”_ÅMØAÒ|Z"á³4µJL¡;ưÿ¹_lLÛ;0•ICÌð÷ù€/¿&°ðÍ-°¼Ù+¼ÞîqCLånÄéäLö&Z2Vo¹ÈeÂÏr5ŠpÒ»ÒW†:i(žwÌd¥gKV}4‡·…™1õåhŸ!…œòÈMm@f;ÞÌ ËoM+¬äÀ*W™Â¢Ï#“ûÒÝPà"|l—k¥ÆŠû§‹LÏDL«!òû̶ɔ±‹ó’ôãz’ýŽò¯k°`´.ôvXXÚ=&Zñ׈ÚÐð¯8qþZ_µêþŸÎf‰ÄZ-gS c úïÏc%ìzÐw¥ÃlU Xü0 ÄÞfP™ž Ç-ºP¿mH—s “õÀeI{Ëú°u %‰Ç9.ÖæðL‰Ö-"8šá–/›‰ÓJíf.¡ë³'ê õlˆ­ü ]Ö6È®+3$LB¤á{-Ã1F< ¶eÝh–²ÎÛlF`ꟲuŽOòù ì0A¯P¨ÍÁ‚6Y% Ù?y%jšÏ4&§9‡G;€¹AB¦ƒ/’N‡ˆM¯3HžÞ¤èᲿh|›|¾ó*ˆ«ð‘Œ‰àÌngz·þÿø¯N-½7’¿ŽüéZ±ø46À’iÙ·ÿ PUöÔA°þEu/8>5°@á¿rÇ ‹¸—EÈêþÃF4åí œŸ‰iì3ø~Ø·xŸèþTÔ}92Ô ™Í/úkEçg=ž9Ôn’ƒ8ümÕKškˆ·Š–:í³¯Ï£âN$—+¯÷‡´þÊ„$G¿i8Eð½r£ž'0˜CFõô)›!‹t¿)ÓР+¡¾Öd^¹UYá`aä7nŒb›*@8#…‚ÉL·7©d$×ÅüHfNž‰8& ÊÖŒÿ–S Ë ÚW!š™’t$<²GMúuJIÔ‰&Ú÷oˆ‹Èªc9`‡q­¤Òê@ÁŠÐȼ3êÐ<€+c˜*Æ,0ñÑÔÌHÌÏaؗݬÉDFö¶&‹21xiJD¡§0X<Ê\Œâhv‹œ45‚þq1ô'×twQ27§2…(ƒØŸNŠ”’X!ÀCkçPâ%ˆbtú›ÇÔâÔ€ª¡C[¨–Äõ1d0éÑ ¨²Nçoo?v€ñ›>÷íxÆÙýïb>V§(AºÊ¾Ú]kl±?Ñ 0œëw?sö÷ÐÏP/yµû˜èNªÙŒŸ­BÞaŒgØ®’ÙÑev¡ë‹=ýÔ#ΔbŽå4I ÐÝùSÎë!`ع»B˜¥høµá2&±­¬evñ—ç½^í?O¿ßü¯_ûbª.â†mxÐïAú< úf4¸”r®o\“ÅR^^BOŒÚùÉøçì•{Ô×»uó(¥›çÌ»¤ß}Ð܇¬cŒQ7ÙL¦b$,˜eû‹@hcßÏ>¹J-x€ÀþÅ?†þýlÀ¸Çq¤2~ïöq:õ:Pþ­‰?{‹èKZ _^Àÿ1¥?ðˆþÛ¢ó÷?ê' ùL©¯jUö.<ÏPà)5`$@3:f9¬Ç+˜w¦”ÈC;‚²è¾¢¡€¿Ò&ðß5ðüs¿–·OXÛtù@2ð¹Gýý¿ýuÇϬ´y^ç¾°A%£à®"2c…œ1‡pÑ Ì ì ýeÀS3fk>'‹:, &t‘úª±k¢Zàw'“-Ô>öbÁ‚` èš#=Ÿ4HS¦´öíx ætOk€åKâ öEÒ-ÓÆ¼Vïa"Ò.åX:ÿkSÖeÿRô‡ÁB88 ÖÄîÀˆpß&2Eh èˆcøT33),b諾OÇØ×g˜ÆÑ5S˜mQ̦):‘•‰±Ëx\“F$f쭸É$­MÁ0ÝFQM(iº¢™KUÀ× B¸·Šâ ì”OàÂa3ƒ@˜H”Ç©#Z]!ˤX“*‹èš[æƾû(,uèÔ÷gWqú‘ÖÜpX„¦ed7¾dðÆ`cøð¶Glán1AqÑ vÐ~|P !–¥½Tó“- •´(ÁÆÈéBðDF@#RƒÑôì ´-ÐS»"&Àç#ï4ym Š{O™‡}…¹57R0¾«°´¢êäþ¿j}½^U®GRnϨ!KVœz €É}ä^?ÕhfïÈ6}N8gÑI¡¥À¤$­«SåÌŠ÷f؉#·AŸZ’Ø,­¤`šmÁÉô ÷”‹â¢+»ÆhœðlŽÒxöç¶åЦR^É”§–á‰àÞ_§ɨRzÕQ/}\oó"p™r1Õ¹(#qf4!á*%ßµœòœÓ±á¶ÆHúáp|ù^2“[¿îTBòŒ9ÛE0,Sm²Aí\åùL;oÀèørmî‰Û>AbòŽUl€Ý)¨Ã`&l¬à3&oɵAÞøÓÏÍ“»PûŸU —½wØÜ¬8Štvª„àJRÕ‘zv—•ΘlÕ)X2ÿÍÏ£ «yˆÁ —™©ù,§f{!ýÏb¸˜¿ tÀœÒ[þ€ô˜¿øK]Š\@.yÝÖ׺Ż&ÕÓ{¹|qâÒ7\žXÿ¢ó”¤Å:9yç¢3yþO‘œƒƒÈ𮼳<£²](éÎŽÊbe <–Šèä_Z¯ÿ'c\^ƒ-ùXLöGaæî ÔvbÈœÑ{àa*Oúëöíþ‡Løc_ˇßûï‚ôøÞ§ê¿!?w VŒÕ*"ç¯Ó5æÇ‹èR#ýx˜.c~´Ðèé¸÷*ItÆ9ï{ « `@Nòæ^£©½¶jar™3ÍNx$"ë—<æ3B ¿ýYÓ11çøœ)ùkÓÎúC8µP1– =fÚè’ñKý©`ÁÃû1xùB¹Bγaöé‡}IY-ü­EjuÓàÂú¿ûpzçóóJfòr‡#R‘–±ñ¸±{g|ëyp¶´â f˜MMã‘Ð,›ž[—ͽ%è%\p‹Ý…ù1‹”Vµ†‚{ÒQ‡’–ÆZH‚I:/´üórêÞ xüyzN¨·Býå ”H%!@¹þvÂDN¶ÿëüïJ«í{ ™W¦oŠ´¸3]¯õ”èžZë£K:ÁLNÉ „ÌïMƒüR‡$œT•êÜöyA{°ŒÉP¥“K° ‡ÜØŒL$ÁàÏ=Ïý¿k¦84ÊR!²ß{†ùô9îƒPÑ_mŸå·z uÜMó"‚÷®ï6 =в= §6M p½'ûDáJÚ«CâÿŽô‹…dNBƒUÆ ZzÁè•Ùû’B½[¥ ;åZA¸g‰ñyÉË`SŠÛˆžŒÿz±yû‰‹@CL×ÃjCð"4ûaE- û%`‚5…!P•l< 1í4[„9d3 áð‘kÂÆœ0‘ÄUúæÓ:%œ¦ùL¹£àGÇY¹‚m¡ŠF“»Q ŽÉ(*GÕÌÙ½To iS“:UT¬¾ÎÀ]Ù©¡œ`Ý#ôê°AÏCt¥eýª/q ±LÈìÆ‹a6¢À¸‰ðã¼àPS¿ÒJVjÀ1É!Ô;šå‘YCÝ“¾ÔçJ)S€p±&ïɬ¡WW¶Ÿó_[ع›å½{°Ó©¸ÉÍ1ýcfã) ¿qÄü¦5½§¼=àzµ6ÅýäHß°ÿЕiX—3"ôÐîAbGé2ºô:µmz³ì v¯l‚­YÊ2”yÃ-ÓÝCîÍ’;pj)1œ(ð[_%JfnQWŒè[þ5€ Šuйôgرˆ·µÍܳ,<{¹)’»À¬U9Á€8#˜ù-W‚ú×Á§@³yM)Í™b˜ç…ÇE•bèo÷c1—¿bò–€ËY5v,§d²¸òþŸNüÇ]ð‡û:NB-2E¸yö•RžÐñ²R4±züçMδµ63Tpµ#þWÞÎ3…–Þ­äÈú¼ÆŒ1·óYî­Ãô_Ñj.̃|`, ÿz¨ç…ßdzNµAÔsOFÑ#Œë…‡pÞ{mŸèüæ3ɚ؅A`±i#6ÊQ52í«ŸþF²9X#Óñ8ª’u‚ê’ ÉÀޤëñ'+~ÉÓ¾¡üòÒ”î;˜ÓíšéLÑ€f…œ˜yΗ¦¶Ø á°õFZé¨9 üäûœ¬¤øÛð¿,,§›FŸk†‚“s¢,d(‰ÅÐàb³/÷§ÿ—ÈòQg#9ñàîhOù–ÇQĽ.ªlÕÆ ’q#H¬]/Ë‹}™Ë^;@‹ô‚r1þºeM¦æý?I”³ÇlR·ñ•­>Õñ¦çxÎR5Ý€&Ä5†ÉŒb6"3²—e„+KQ–i’FÛ<3xÝK~ yG†+»¤Š®aî7^¢–w9×Û/Ÿ^"P¤¦Õ/»ñ‘µPF®Þ´pÿýƒ×ÿÆ;³:ã§_,& ÿÖM`oY ëC¬Íˆl#¯ŠdçrO.bÞa88Â3ÿ˜dze*„áX `¤»ƒY ÿ8&Yp¹kþÄ‘åYßÚÀ~DÇ:EO›@i:ùÆ 3 [lóUŸ•R0åýÿ¯á psŸùtì ¯ÜÑèíòËÛþ…g+$©o¹áIù»r×½ €u[.µžÞO”ÒÀŒþŸHÛÿOé«|ˆUwÍ#žÂÍDNÔù÷ó¨tûåóVt~7¤5ôß2ÒÏ;|5I¡•o8>c´n´Mt`ÖõŽ6¬<ÓÀO ¿f©¹UDlUBµóBøò¦YÖNÜÛ•¡[X²k½ßëxxSgËIÀ}ìý‚äB¶<—ÿ™;PD#áôlB¹h–Zî§&pOèÍk³°,Ž0â›M‘H¬xÄ…$ÐH=ŒŽP¯òÁ(9ûSíëøj?¹ˆ`EÔ.‚ ŒÐÝ–€à*r7šEG¸° `ñÊ=pfØÖ°˜ƳM'o«!-ÂÑØ:ËÍ2¬2G§äÀ‚G°iÏ"@34¥”dóÃmÆx·)bI8<Ò;:'îD´ºx'P¸j;<Ì6µ…®ô*T²‚‡±G˜ë”±Ãœ ÊÞî r×B3§÷ì<Ø€^TTßÀÎ&†%ã5uZg…ºŠÑúR!ûeœ]KÞ¶'³zõ]r4²z"qcÝ.b4bTãU‚—äMgÁ›>²Ÿjô§iê*‡‡zAcÙ”‹ûØ":dŒ@ ~ë5JešbVŒˆf0idQ£]ÞCòÑœXy¹/]lój ZR´>Z@ –âLjÜTlàcÓç)¼zØ]YÌöÖÏGõêLoŒ:½ìzê ®8_šZ¼ø÷£GÍ/•¾eݨÆRxˆVRÕ`ήÀë”þ?5ÿó²5:ØÒ€K¬Ž¼f®Ý¾˜wÞš>ÐDØ"Ì}¤e2µ…ÆŒ_âw>fN’Œ3½Å䜗™—‘9nu4—.ñ|rxŒ‹L¢;Ç ÎÕ¦­¾4=¼ðäpYÞ¨Jm¸âê΄Ówlòb89PR5홑äÄ=ێɘȺ¡Ã™ÓÙÓ£qV³„À0Ĉê\¡¥ÃEê ê{3ƒ»Æ 6Cg €Må‘ÁyÆ=-ëØ‡ì©ï™}ýjS™9ùmƒþ°Ð‹p˜4Br`Ý ˆ¬|8jï˜xó0•ûÿ!‘úoªR;·ï@Çð&(wþÃw\êjEŸy:Z}dâÿÃC'p…çBÓOÖ4ó+€®äûçDt~ú†šr*Zl[šCWÒãÿÿŸ½«mp›Çq‚·ÿÿŸqbIà›,g2mŸ¶s»{ít&ql‰"A`]“wäÉP "³ ­’“õ’¢ã-ð»þëV]*BÖñ¸öœ÷)Î0Å%ç°|àß×÷ ­–?ñƒŸ:…h^™:;ó‹£ ïß®"÷¯oɨùõõË‹O®–ËÓúÑí ­'ÄgžVü¹è Òo/!‰®î,Py—çnÞû!t9˜é[ðStIIpÖõK»zþ[š€vrÇÀø À³l‘±®wmFø¶ ËúL€³pÜ:˜ikçä‰2ÏX¨¯%3=gx4±ìaÙƒ7/b×9kÐ,zžævÙvìC…ÖôÎàÄ8Ä3èÉs`ÔåL©À)ט¾Ï|Ö;åµu(ÅïͦŒOœq¢.ä Ïoš;ÖL&ÙXÝi¡SRO”¹| A1âLvöÀ‰W+…FCÄïEÍŒf0Ÿ³öæ µÈèŸ*­Æó½D˜Ø EQ{¼½c„H3ÕG7|iÿ¼ü~ãûÕ©Ešÿy™½™¹-ÜCs`®´.t9œíÕû¸&^€ü(Ì¡rŽÖÌÕƒA~nÆÎ>5éšÌ1‰«æÙcØy`dÆÎ'ÆÞìx * VQk ³ÿǺ«`…‰E·zá¦W —h¦G±‡ È‘¥NŽ•ÌVX£Î©6f̱KUØŽšÉpjÝÓA©ôçtzFC¢î«ÎDÑ+´m˜„ÖâÜLÎ>‹U2árm)Yx¥b‚#¢sê‹ó°ÁY©»ãÜ×xÐiÆs,ïàà ý( ·ãá3-zÖÐsÄ÷«ŸŒh‹‘ßp…‰>’YÒYY”Ý ÕV(¼¡ì<Üí¤E€ØüÇtŸtÁŽw²HUïdñy/Ý¿w{–—ý<ô»—Ý¡ù/FøRkgõ•ùAB“piS|4©ÀNÔ¤Ò›qSDâp(Öݯ+¤ˆ:*¥w@’“.PÔr ‹’E¥ýÀðœ4e°ån44’RÖ‹gñ‡ÅHT;èÌ/uþsÞ ÈS­ Üãûq wèz%ˆ­µÖ~LŽ–9øÐŒ™\3N÷#ì'Ç›ˆ`*u“»IË#Ô¿¥þwôŠ9ØÀ é(6p÷L-‚Èû5ÑË.ÑWyHæ‚£l¥ªƒ]-Ýe£X)¬}. _p;¥±@øó o6s™>%všô•]¼, KSRÉΜèöä'6µm+–ûúÏ]%dé1ÍÃ/k´ñà ÞhÚ 7Zn,t”ÚÊ…RÒ¼½3ÄAh͸ÍxÁê/µLòP]ÓábéGnà-þP…0úM€2:ij)ëžZc ¬$ŠÅÀLée÷=ÇÍïùuüMö#í;c)ûó^ïbýã—|¾YnëÓb{$:@ëG"jjvÚê˜Ê2Âe è¯ïˆ<2?oE^!Ûi³û6Ÿ€ ]b ›tw2ͧ8<={à=Ïð(4ðô•²obŸe@Ž¼ÎøöÂüÿõ€¶Ê~ìu+MŠÕÞRü`žÝi[9¤‚á²M–ç ë*ˆ–þ„§3ªÈºÃ#mˆ–ñHÊ>/ïwd'AOÈ}‚B}úf+}¯E‹GEŸ1SÐãQæw—1ÇT7u)7W .ãÍõoNÒÙ{©ÇZ(Ÿ›xÒ„hÒž[aÜÀâceŒ§÷Ø7@Û7ñÔÀßn]ïöÑL|?øLáYá=ó+·ÚŒ±ôÆ€Ûe·Þ¿¿Œº¹™ëÚR$[zÞ}Œßþm_¿z ïؾ¸ë¾oàú‘ €O/þöW‰Îßç]i4óìúñÈõ£Duç}¬Q‹aüô-ÿóØS•uý£Ž›‰–Ÿé´#䙤?xo»! %°Õ‰ o i4mÍÆÁ!ldÂå¾²«Öáo·U]ÊŒ+µ(©0š.ÁC…zÜ~0^*z œª(©ÀR¿)P¢À´1 5·èÁ??ÜsIóÆêJõÇæŽö;ªCGqU›ÚÛä0žþ2{5p”c7Ì-*È3[m•Hêðvkþ\'åý‡CgØÓÛàÚYV–tíñÛ3pêî°oiY¸ÌŒÌl3ob1“oŠ®egáÈ©¹`<‚{ QŽÙM[hÁõBP\ …Œ0oúôÄpÚ~Ùšw,“ ŒÀï\ùÌE-ŠqÏ2LÏS/«>éUó–K³ÊÓ¿Aê 錪'š(ùpifœ¬›(×SeVFÜwz1d’°“ú` þXÙ4ˆàO*ñQa1耖it7oŠ.L›$3ôŸ‡÷E4óx$XÙ l<`°VÄÚgntñ·Ù1(b¶_øÌO5“ ¦§ò5ó¡ú:4¢“=øò£Áev p†#7'qÝ‹³ç{2ºz%THç Hs@¶©/d"4¯a { ÁŸ¡]^ÞŸ3^_\t™ 2° Žãh­á˜±áŽã?þwÇË   óSKdzwI‰cé®åm½Çœ,Ó`kã¬ë²PƒÅ‡à€E”X\F‰ O%ä°séuÁ$óÍýâm L—ÐÚ5l—ës½#“.ôÂI("`s¨ÒêäÝML Sa¾2¥ª‘æ&$r°ÊàØN´Ï¨ºû)‡»SüÉ9ÿA²u7O²í¢Ö¥ðMÄsÿ§+‡Õèßû«ÐÌjñŠ7tYïxQ{èSgÏ>2·ç<ðÐÀxB[ôÃüµ,c‰#ûú/ÊÓß^óî’Æƒïþ…_Œ{ph‚Ÿ½ON¸Î0‡ÞitôQ·1,ÈöŽàù¾ó >öþfÑù›5™íôËNìcË-C¯Œþ)ÛBŒÝ`4¯šO­µÈ†g>pv=¢ñ¾*äŽ$î¬NÂë BFñ‘5þ̯aÿ¿|P¡f ÞÒPã/2a•êÖ [ ÒFãóG/ÙªãH(í4¥î“¶›"—‡€i—ÂéþØÿucå³=5…0l)›Ðp/ L.~€™¸P‰k3­“ê†e…·^ƒ¡ß‰QÕ™³d´ÅòºÑ¡kõTuñ}lLGÕʽáÑ6©e˜ÜÕAý`€WHïÄŒa‹Ê<ˆ¥¥ÀýÁ>gðµ1~Y7ËùL:Ü×Ù«láˆküÎj”0aˆ¾¸"þÀ¨N’ Å0ôHpt`–‹§"ŒÑm. ¹MawWâ:¢w»üˆZœ¥§hô˳ö4•ó{B¥è3D"žÔÔ¬É~ No—H±r©£Ñ2ºLôSÁ“è«.MK(bñ€2šÚź¦ëªÃs0Ë”p"3™ÇUŒ,§Y4lL0ÍÍLÿ»€Ã´¬TÜßû©°Voé콦Év˜•0;Ô¥¾ üÁÏü-/¿üýVý¥ÈsRßÙ\–FƒJí*ÎU4—oâÉë8PÌ\ÃÓ®UZ„0 T¡õ‰Uš›Ó‚ñêö.x]·_T¾|Ï%å€ý?/!—nXgµÓaXýs¬ï‚eR(ñ«?[tž¸yZÌ¢+M Îou`Æh̪FUd—´!‚[Ègt™/íq³Ý+2"H²©ü\t¦/'™·DX|¶§±+$Q)F?v5‰ '<ºôÎÝ<:±FS Rà,¶©OÔ ¦a©ãbu‚ãíMïÁHã› ¤hœÓ3ÂV:ØâxF–1+K†µ ] m¸k³aާßCøÊ^fùÜʉó`k•ÌŒá€zR%* õ.2‹ÕZ9„k¿Ô®Ñu’‰é›¼ßÙ&>°ã …›¶/m×*Œ™(RÞê(Ô>TAüæåÀ/m9k˜y4ÈdŒš*7]Gì`[zÏܬn°QdaÙ Ô€ü£@iæÀ{yJ>ÁÅm%ù˜މr¿É§Î=z\éñ±³ÕkyV<<ÒüÁN•·©ÞFk@¿»lˆ›«½hñ F¿qòÃm >Aº¿ILoÇüVu¥›âhLlêÚLgï‹©šÉžq^…ƒ>> ´N^C~dSWÜÖ¡t‹ZÃýȈÇ9³ÏY¢^&Èblᄌ­ù厈ãåø¿ÿ]Z?c Y÷Ç4³¤;<Ôâñ/bÒY5ÒE—-âB¨€¥Mº*gol[+£zE+Î'­-¶¼7H¶¶Í1d˜&Îx^³ƒEJ‹äÑìÜWÙxö8…ò­ýñ©¡Šõü'+\È/ø¯TA2.ðí÷&ž)ù䪊=ø81ÀWnPkm Î16>/#ß°á­¾ùö$ÁÝÆšKßa½Íš=¦¿àþ­OIÒC/À.ýöS΀Œ €ýe*ÿpyë¾É½ö«·ê¢½™pm*àÀeIÚP[úÈ]ÅþU½½$›t0Up=n’ïZ*õüÀœÙVg¢¾­@9xW/×7øß":¿'l¾ǰõGhÁ•ð¤ã®ðvÔoègä×nÈ’Z÷›jÿ0÷ tJ_z%¦OÇžk©ˆ)Qá$̱)“ì9{‰À´WÛÛ¨|0Ó VqVE|Ú‘0Æ}hN'§J¸8MÍXPPþñ=^¸&«§Œ¤za@´¼_^ªÈ”%a™W™¸5æ‚óJƒòÏlnJ#uÈð4ÙCd5f™(¸Pú¶ΕóÔ±–z¿2Ë–FÈA2.|YAÕ”Œ U#¥B_Ù‰]&Òw¯i»§€>KuèqfŒ˜BB¦ÚЃ6lôï}ªöX{„Œk|)j8Áìëy9:FH#˜ÙaÁBE"χyçéc榣!s^IÌœB\Ñ-ìÄj69½ƒÉ&B ¢ÖÀvšþ9E¨†]ùÅ®çăi&4:¸ýd4¾ 2ô4´ÈkÁ#vÚS7º+¯¡J#ùhÚq¼ÿþ¿z# 2Æ9ý*¨¦¼>Œ‰äÖä¿Çc#·²NlNóŽbýÙßérµçôøåxþ0;æÀf [HÓ«ôEWYióËß„&Jò ù¤îŠvy^ɵ›¦oŽ™ÊJMb>}R†÷)µG?ì¾ ÙwŸ aÑ *讕ÁeÅ׬Z´E–Ùj "JÜ02ÒN`8=Æ`^è5гMŒ=yù­&ïx2œá^Ïãl†4]Í+çŠc™ßš7gl¥qñVa¢— ?E$>ÿ_œíÌÙôŠïÿÔB ü¼m¶#±…ò¯oHdÈB3‚i²ê´¯‹Š?QÙ»Nï@„Ôï;%ŽBp÷,Dÿ°$ɹإjqÚH/Û³iÓB’Æf ’b¡—çoþu¬M–п»ÿ¨IÜ.R$,˜5–{¢ÿãd^ß?Žƒ4K1¡ é$Çru0‚ü>¡·gVtœŽ¨#BˆˆOkôψ¸xé¸õý£¬éšîëü” ¢¢léY¼rÆgcK”ÂmD<µ¦sd œÀõ5îŸ(:¿Fór™µøgZ<œQËK„0—PÔûæƒ49²ÑQ²»Ñªël9Z£þàt;‚3gGøœ«µäR/{m*I˜‚÷œxØüövàÓ î:# Kñæ•ÆTà¯èS|E<¨¦_Š,½Ñ~^ð¶ûþcQ  ©É06®M3]âRŠÎb†ÉšÓNv»ˆ 3ÚyÞÝI¡Ó Hh‡—£aK…_“øïñÇ\¨ìH_ÙâA³Ìý°P/áÆ9xe͹€þ›"ì¼Yšqy3ëY°\¾ˆ<@fËØÛHð•ó•á ú}5üªâ½7ƒò—àþôDÿûùtkÿ²Î/Û‰¿Ùò¤}±DžLÄ7BxèJ&•‹gs;7‹§Ã*„½w¡-©¿Ýñ¹†z;vR”1bàÇêÄ„+SaÛ%¥à!eÎ¥ŸkôÏÐNb"çøt’žŒ¢ä=¶ðü{`ZŸç‰kø€Q[S‰cèJnã^Ñ”<1¤F¯wý1™¢¡V¬ƒeL#)}<@ÃãÇÿþw\*@:È‚åÏ–ß(þ%™¦+BÕ»Hvij’;eéÄHÝÖ|PézHŽGá¦Ô|!ê››µ,%Þã½ü6íHp Yô5 ”2Â,«I ØO;ÆeÈ.‹çDÀEb`×eîÍ—½Ç³ƒ5ŽÙ›XX™Ö§>é$ÿ²»¼IÄÙò˜ge$ôÄ{Êë4àpƢɦnØ+Сk-HœßbÍÕ¤tìÆý-2X&1êïÈŽZÍŸm  âòr­˜Û½™Ã²)”ÜŠ)Ì ÃÛ‡aÈv•2€ÇO6÷÷ &;,]2ˆ1²í»\íã¬Zö;µâÇû\r¤=‰û×ÇÖ#ÅRͰZQ¶FíÜË2 þXDø]^©“ü ÃM<á.îˆ[E²G«!OšS~ûÛDç]jÈZ™"–¡,™l’f¬Ù9r©nsH䄼oú:)ºÒ¿~L¯F]’ùÇJO áËÕ%õ«cžD¯D ‹ª°†·5-ÁØÿdZ–·Ò££eÅý$g ?¬/‡RÕ$ƒÓqõ~œˆ¡MÕ¹¤Ì¢Ä'†®É;v` "¤)tºü$¹‰T“°ÇÙ˜.IÞ+dÁ è>‘5î4xëN"ÿçUk­§Ü^¶Öptùhz`ã1œ$.sØŠÆ6‘VÄr†©·¥°:ͨ‘ßWœ²AäýÑ?ØÒ´Í…É"fk -xsVÙË a#—x±¬m¹È| ƒ‘yƒ@ ˆx+áñÈöÞJˆáL, Ts¨P×TòVR ”®N2]Í9N4]§ÜŠýrâ{ ~+1IºÂ ù_`ú¾™ë¯é±yõë>f9<["ØÁ÷¯ iX?&ZÖ¹R« Ya í5×û <í8EÚ [¼¦/в#™Â›˜ðÌ_uìœ-ÿr†¨Ær;A’$+”{2Ëï¼7oºY2‹Ìž#Ð`=S•BOJfLÄñ„ï8+:ò«¯hK’'O5 &yXáG0 sFO6j¨WÏ`¨ÅyŽ6Æ †¨ ­…Ðôö¿ëë8þw ‡dº4-DêMß÷€7ªÎÏE:ÝvOÌ\­ºh“±‹³Ø§±QZW{€­Ð_zŒôH>1ˆ˜.ó³óø x¾}ê¼{^îÕÔ;êlÜzÃó51ôÿÛ Ž$‡¿–fÇ˧ðѿƫÉJýý×?ù/܃¥þ÷¬#”þ=Ųѓ~7\2þ"[@áaô|1HÉL‰ü†À¬(Êÿ8Ëù©„7æD(Síª}Í~üœmÏ/{ìÞ„´_­³K(üzùðÙ € ù"Â…ç½÷”V.Ë©$£/=˜}´<Ë9õcÊ×°îÊ\€ä da& Ѷڟ=$Õ’y1-oÁÇwms ÌEE<Œ1µåÌ¢ù`ýÑeX0ÑÂ¥ ”f3±¤è*ÍȆSÕRû†fÛɘ¡q„-÷ŠlI9•æ`˜Y)Ì<>h$ƒZM„×â$[kgtáDK»4v´V;ÝJ(qÉóQ°¸«8ä?1ÑÅELÃÜòå“jÞÓa`pž`"î† ‰tK—Ž+ÔG¦H•Ä‹°Ú0®!ŽÄà›Sö}}J(Œ¹EœÇDHÝÁL3Ý•D%&°´¯ö¸X–˜qŒdÁÁÑÔd¶ú‹ì÷ôt–ñÈÜ+0ãø4= ÓìÛ‰´¸u%YóHιŸçë¿TvæužRQ £XÏ.M;k€Ç´üÛ)„÷Ádo 'ñÖ`¸kú û«~õšéZˆcµ;þrîœ×ó£Øå ÿw¾>ßѱٱKD>ÂÛøPZE½ÈŒ™óͧñs ð‚ã. /ÁëÉÇ‹þß™ÿ˜žÆS?Zk¹ÞQEVh®à6ðœä•³ë$•O<"H•—\? ‹ÅÞçÍ86>È‹Ü=Éã“{Qzà-+ b<˯çÖÜ9CfòGƒè¼ȯ:ñãßBš“?}Ý¢v1†MÉ.D3½ñð¡pÒˆ ž¦úa¼ ºH$ëbèü,V m!Ôôx—Lñ>.m¦&Fb@êj9vEJ«= öÓ_íÎ~w;‹¿ÅË¥&0¿}7ŽQvþéEó¼à¢â€Ôl&ŒÄ™#Å¡æyÌ*䯯T4ªAj|†¿uÀÀ–c Ð÷ŠÃïó!‹ìgõ Ø^œw¯¼Ô‰Ê¬ë—£CÿeÎPÉ)™Àd;U²’\ñ"eiÓˆE;´]½¡Ê•‘Œ" [$öoVƒA éÝô]›óëQyÃ?Äà>ÊÝ—?º£ß3Ó;ÖÁÂM6 +³!÷4ÒÖê1–©IneÅKæTKã1ðۻ׫›p1pͤ1~m‚ÓìÉõR™>ãT®·ad_äöÖ¿'vÔω¦AÓbÝ_zôl»ï{€}\v°¬Ìœ^’N† \¥ÝË9í™bdä½,#ýp’ë6ó&ȇã*ð^<M6–M¦ Œ4ïXÅŸ•‰(e˜vv[¡Õ,týã"ˆå(·=M-¼Å€»¥0Á Ÿ`8a1šû‘ò;hØÆŒ1¿ð`hjêîN!"YSo&]w·ö®¦œt…HÕAcï\ Šô™…vsìžç¤ÂoÔQR¸<Þ.°nVùN;ŠT9ZJ±‘àJ_ÞÑñ¨CÌõB&Ò?Mþ¸™¨Ü©%xžü¬žuâ›ìõë{»§ â†qʼn €GÛÀmœÉÇšë—ݹ† ‚¬º,ßa4ºßpt`ëI=͵q“?3*ìÇË‹4{¨ìµ“ k`羦—üµo}h  ~ÜS½¼n½ÛndÖÁ1¶i[0ÛêXArkñÌÞÂb&Ä´,\­ÚÚÎ7ö2uæ˜.—7ª:!¥fdžÈêQ!*ñ_ÖN…è|s »³l= A—^yÜså2wÇ(HLøt}4'÷aT‚š» ¨å̾øõƒú8‘3mʾʆ/ÝÙÙÇ¿á(¨YOÞÜT pÒ+¡rNƒþ‹ò\߃Ì|+Iï†8ipu"@S#Õ7d»¿£0ÏH×âk˜pe½£lsã›Ô¬Kýc#€P׋ ŽlùÒ B^’…¤WlRΠ´ x- MgÙ~°ý&'<ì ®Ÿ9xÏ‚«’WˆN.XÓ<–pÊ¿‘dº€vàxqþ_è¿$VÐö ¶"ÎXs0ͲÊ'‹xÇy|‘œn£éx+šT¡²C×cÅž¾5Üæ¢~¶’Ëðø<ÆòQûÒ“xAɯÿ±¯dô>¿úêÉþïë¯ýú»xÞýz‰ê(Ä9D·½ò¾Bü¿"N ýòßöÿzé÷+—ÜE y¥†[Œ:óuž¤:ÏAü°ß¯·ú«EçÏ„`ô„´°q¯Œß·+ŠKuù.´_@¬‰¤å3½–;Ñô˜ŽþøŽí+ƒÕr±÷Ûäv3ò'(¼àéþ»^2­í)þ”tâNðlU™úÆÎìÁxd­_ìŒZ¼WqŽÆêØ1Yh•©Žl•FOÖ/âEЖ{õúôw\ì£b¢`yH+ 2}vd³´Äõz´ÊáRðg±˜m±€pÔ …˜Á‚éº^ðâÜð ÈZY˜p5t@ÈÃ'ɺƒ­è}Âòxž¯-s1ú>?<…8OŸ!ìLG‰äªÊ4'%´ýá¢óM­5_ö`fß½ƒ!”&U.]¼‡~Të`0!3ðPx ßÞjøY'ênÈW¾~`´ ¡šJê¿éZ‰FÖ:µãDáV!¯K i#Qæ`“£Â“„GkÌcÊþËLGÆòú‘@+L?½ñ‰ùÐðì×õ¢X+Xñƒ[ °ÐP(q9$lNQ3ýoVÓ4fµõœYpƒxùK"u8mDÃy!bîH«½F›óZYAè`ô €†#;Àq™^QâX5Ò’€9ì ¯lÈDlwˆÃÐ=ÿÄ=8ʆÜÅ ººqÁ!g^‘DAC+YV˜UÑâehÙPеITDz¸å‰•tt¦—u¥í0Ùw#dcd2h“yo"tBÆ­Ã`"ÏîÄ‹uøoXõ+çu¿¾áŠÐÞÉ8X þéO:Ir¦«v'B0b}˜¿85Xí{"~ñþ&övšf7¶†3ñeYx›¬G‚£¦Ž Ì• ›4¦ y“;;›9ÕF4öîæÁÇ+éÄ'ž€ÁgC¿w©öÄ•‹à`ÔC'í¬âÿ£`Ý^D‡}Ô²àxý_¦‰´JÄ7¤§¸:173úÝùÖ!ÛAÝøÅ"If÷š;°Ìä;u>(ùv€µWϼòƒkDËûK{Ý3€¡¢á-ªøŠäßó¢ß” ,ÔšIýøÚüËò2®Ñèzà·•Üùà…}aà»/M³¸MUýò p½ÚOá·ÒDðçi %_ß7øž#÷7ÜMŸZ¸/Ðÿõõj8b|›F‚ô%Òi[¤Á}¦€ÓÓ…ù‰òW‰Îÿnh@ÖˆjIØÁ¢@ΞqÜX?Bf¢;†Ç×ñÎÓz0À¤æM•äΖó©õ;•øî”-vâÑ%Y>ñ¯'Íx´®_¦ö¢Çpk\¿;¢,Jz£ú€¯W W‰­¬ŸÕ1ÉÙ\uÈÿx3$ߣÒÿ‹ŠÚâ¤Õmaz=¢6?º¾é€Ÿ£g>?N¹Ö¡>’\oÿAdµŒy&©ÒŸÜÂ…=#÷픬‘H‡¤SÇ]µ{ŠÐEü>«å9èSœrIÈ~[2? ÌQVwcâOnåCȹñ‘¨‚aƒˆÏ£Ñd¡ibáÕ=-dU2ëâñm :¹ûÙ £´×ÒId2—Š,ƒGޱŽ ªC ÿt½šhUSP#Lª8šS”_wv ‰`Eå·e׿ð1М¼†û{ ¬PÄŸ“þî©-û²d–SÍîÏH½ÎJiƒ+(Æ)Õ@dm.>L«¸?ènÓGœ0{¶1—ìs¤˜èƒ±ùr…á%®‰ãE¹ÏÉŸ» eº ïOgÍ:Ìwù’âN)Ÿ4cˆ×…õ Ñ>§ ÿ ¸Ma%ù§{Èë}Á1|6ù¯Ï«%4¯ë,˜X¯éíýö)ЀÃ`t€¸xögz@røÑ@«È§—¾Î0pg ox}ž „§sl‰ÑˆS5¯…‡¹ê¯²ññ9™8ƒ´ Î ‰:]™zº)Ÿn¼`%ŸÎ<ˆ‘Q}GÑkiO6-##•/:€%ÙâQZm9i•³Î´Ýy»F•MNÒê&àpØ,‘üÏY¬”d1¤ò|ÀúÙfŒËIƒM4 ˜ð£–kgÄtý5GL»ÂZå­Ô'†ø«žxyN„›&0A¡¯A>ÞiÖÌ©ÿól ¾Ùú-GK¿¸°s—Q¼¯Vä‹Eg’ Ï™M~P–®êÄ*ÃøÄ?ÄV‘ÜÃ'Z*ðHÁ^0ûplž”œ#;ðÚŽ0ÒèŽÝ"Ü ¹³£¯ú? TÂ^dÑ^…Î 5;V"5±±`îm–·¬­6V£‹Ua÷¬¡ÛvÙúo3áö"2Ó‡l#)«u’F€Å>Ú¼töÀ0%±k7SáGãÄ(¨Ü¾kÉ—û¿Ft5T´~d¬;nXX·nq»fá— Æ<²þKb³ XR™ “Ôê0‘×CU$צ³–J¨YQì³ P.8]1´_ÿ¾¾«§¢ €'ÈV3 À$ ã$è„MÉ´lÊl8ûÁ¤—°ÃíÀî˶è"M¶€Dþ+B·)§+û*—ˆ¶ç_"ÌšyóQË Ýˆ÷Ä^À" FûûÚI °bÞ@|´áøÚr…±¨s¸Õjb]€ß®–åöÂNE!nH?Eµ»Óø™®ù\>N¿Cð¢Ê¾?4Ó]¿[8c›(ýß”ÙÊÙM£ñ™¯{{&åä/_®p¦¯1¦àËÚ?ÚíMcWæDÓvr»KPn>fµwvIÞuˆdB\xOvz~ý°NØÌµbLñ])Á¨iËB¢?Ô°y½¬ètóÕáêhE˹8Qe0\™´p±Z ÌS_ãÍ:t¾~i?Us}«ûS¨l³YñꑟÇrühlfº37s pR“L®.MŸ\|mi‚r³@GË)Î×ÝF³\žlè£CMjŸ6m c˜à¸ÞŸóhA5FÈÆÌ“@•´ÜR8ÇÑ2¢ž´GnM–¦lŠË¬EÛ¿SÌ– ã §œÁ™á+¦@šÄë™ò^ ñYÊ€Ç.äæk\‰ÙTj±+Ý…:ãj7ÕæRûþ&_¼Q™àbíß×G¿€ßäVã¦Wõ•–¦ns°¥ÄÑ;ýŸbí_º/,!¹Ñ ¢œô÷=Ô!Ýþqu3ëË}]mó2©5BŒAƒ~¨€þ·I,Bn¯¾«]nªV*än³aÁÚN´×ÐÑ4‚¦°äBŽ«|ê Q©3ö¤ÓŽS.›D@%Ý4ãø 4\ ,Ô<\ dF¾îïVÑzç³ÝeåóÚMƒ»½Ë­wÇ&Bÿˆ.FX¼f²*}–…ø7å ¶73HM /Ïø™‹ÄÖÿìÃòi<ß‚ôÌ»§rkT# ùÖ#v²àŠî´8ÃYMxt;ƒ4ýÇiؼ¢ ¯_ºÍÏYJµœ_(Ú´I4IIJ7èÿ?%ÄWÇÆ+pÏýÅièA~ùãûá³÷H‡*\þ‰ÍûjO'jÝÿ€)Ù`å< ÿqhþ/èyž-i$µötHšõ[ˆ dsÞ5ÿDç¿??{5á4¹Š¾;öGÓuƒ%ö8u½Eöï÷ÐÆûþp=2°ž:D~dÏȸ’@¬;S˜X„ÀÜÔ)«]PßJ´u7âͳ ÷/ó©•¼.gùà»ëKB&Æ“‡›wVq{·¦ŒÂ≠Ùö—,:ë, 7,[; þ?¸DÜl튓 »R§è2yïbÈ#¶¿eƃ´¥‹Ù„åMïXrEó”„Î`Å£û —¡Yz‹¡¨§u}-ý £«0åù“¤™t­Ò%™gÌfoŸ%}ØîÏ›¼CgxF t6mŒ¥!.RȾÑg˜%ÀÊ®5c¾'º1ú?¸R˜XŠ™ïÅ6Þ‡>×Ͱâ ³9È_ˆ«?"q¦ÍO¥!øh¹-x3®¶ ü¤…uz@Æsåý¥t2Ý[ÃN¦Â>=ªÙ„‰ZT=xõR¡·½™ÝPkÖC%fíë±äSKf±*òÓf¯gJÓwÊ3†Cw:ºD»„q üŽ©ÖO´ÃtX6Ô[mĉ|›–žàÚxH›Åý¬s?ô 'a̶ßoͲ#acê`qħìS=DŠYÈ&P'óŸ£À1 Þw‘ÁAã{6æ:^2ÿ/OžIÛNüð2@ÚOÕñ׉ó‹¿_˜:XµÊoÛÐùÉéáIsiWĤK×§B”|uÍ]&P0ŸµÓ æÞž”Áôš>•-™W°%Iª6]¸ç=ô!A’uÝÕˆ¬f¸wÊ£õg ¨04&Ëtôm”¡5ÏNÿä×išÂºÞF[_ ŽÖCK “eÀz•·¶ÕXëØh ظóIäåSp9° ,Üìë«l˜ƒë Kõ¾ ý¿y·©ïG:ù‹ 3ѬB¾½ßk,÷*—| Ê_öN²Sƒï=ÜH‹˜¿Üïï½N¿‰ Ž]Ç‘·¥ &·®høÙâ·ÂWÕØIZ×ýýùýÿßÿý9›g;í~C€·K¦µsRQ‰$iø«EçÛC½¦tåèLl©xf hVáSŸiÖ”q®ÏžeÁËÙ`ê)’”áñà€õRªÌ€àçjà»m5»ó[u¸˜ój*P´™[³»‰3¹4çOð†ÃÔ¶³¿á'¸qùt7 SÂÕžªüâ¬s†î팇†™­Š¦*cìïwDú©Ï¼V„a$¸îk1€þLS‹\s&ZEÓÑ7gâì¼^ÁW†#ƒ¼¨MRm l &î ùÖ)ä:Ž801b ÇÒlÛ{Ðð&5,Í¡^*cÇ(N¢ü¹kÃꆹ¦:Œ*¥¿Ïæ<­uzZˆT†¥Ôï‘D]ŒÆ&娎°l"ÈÒ^кÚËø$¼x?jl²2IJu•°UÓa -ÿèõ Z¢fÎ]´IL ÖƒrÖätåˆj_Fä ì©%ôw™³‘(bE³9DõÁŠpÞ­Ú 0‰ââwSãÅÉ®Ÿtóϳ‘§”#k¤SŠžŽ‚‹d¢/…³]/ËÏÍìéŸ*:øFŸ­’ªG)ghÕ™uB½/.ž¥ÕÑtiÍ ónk% Oý7Œ¸¹\sHF!k KÛ¢›d¿~ÌÔ‰SÉD œŒÌAæHÀ\¯¦†ý~L_I½ºU`÷î!£wðÝÇS| x±‹Ï˜<ûÓÔ xÛkKDÝa½¡¯†6p|÷ ãÿŸo‚Y衦8µ©>7×cTƒ‚ÔpŠ9žODeä…# ÃØw-)Ùµ¨0'É—·âûHš’qEk—äRê¦ö0`à½Zæ/x3,›„lxÿišSOï‹?)._ZÏw.ˆl¹K…ºx…‹ ·&?žo2ff=;ݛƌÊöÖ‚é2餄‹Ý6&Ež8ý¦ÏV´ßIDJ£h6ç q˜ð†¾~ì ]úG5„²Ž#Z5c¤Ç9öWíí–x¼h¹1ͺuã—Þþ6 q¼ÍŒØHèÿ𽸚úTRT¹ºùT§±‚ ’-°5,ǯ¿~:pËóˆ­zizœ:ÖI¥éª àý5ÆÌû· I1Œf'°.&íô9Ö¾Bí×ß²>¤¦©Š:îʯ½_'¶/ jUòÆ¿Vùg!íýÓ&€öÔî껿J Uë{œpýÚAðÛ‹JPÛ/öÕ Ä}dàËœ¾ï˜¸û±´‚G-R½Èª˜þmÝs¿%‡G†ôZ߯ ×µœ«½ˆê…%cdþ‰Îës|ê}[Á0˜OÇ ï‹ç—EÑ—CñÍeòípð# ØútŠ…yÓ³µçÏäÏæÉÍ•;Y£“a¼Âë.§|‘Žëe7ÇîõÂâ]‰´hæxÃòöß–V\­&–§i¥Y*7Þ`XàEzÔ$¹œálL–™Î\¦Æ²¬‚×PÁ5ªe7£Ó8ÁÙÁr œ²* írËľhÜ‹±Ç¨Š¦öy3X—{#v$äuCå´ô¤Z'«¥à¥ð+åNzìAaz0ëúÔ'%êIáL/ü‚¹ò\0˜ ê0HwÊê±Y>àâŒÎu;Bã €xPZð F[¹yëÉôPF2æ³0õž %œ}TO7åÜEyiÛ¶¶>Ú–±ns.NÑä# bŸ$¹ ²¼eDÓ% @ÈD_—{.ñ囪UÐûóȧï%Q@%C€U-•šáå¾vX’!ùÃhú72¼ÇàÇé¡b q¾‚=¯wS„lÐÑZŸ4pÑòzuPXÔ-™o¥m­µ—âIï³Y…O‡7w•þ³ß)n„U˜\»i’uD}Éü¼¸ºô–ó £×d]g£»†–˜kUŽvñ¶§”à0ÚÅqÉê¦lš"þ!± T¨¹ôFpCÓÅ“ k¥rEž'êDPf9ýÃÞ/ÍYUU>–b‹â©Ô³§-…¼&Ï ¸¦ ¡WÀ´i^±%GéÚ ™JÞE/60š%K3™¸+Ú¿õY!¦9A*å‚ÇAí Î~Ä e–i_Ô9%aÝ?’•—ŽÇ¢º·@ðûÀÙ[èóÏÃdXyâð /4Öt¶<,¾¶ÿæ£O È¿¼ð}ÕOkí|ì[A|5%H©Esñõ ñ;~ñK„Ô~Öâm)[L'ª…°ÏBÊ,?E+àóœÃˆO-J'•² SKèü£ñ´ýŠ °ÜHƒÉ%ªJï4«ÿÄ{³½É¦Qê˜Ð*¢•Jï×w`Ê €Ï]HøOèß×7ž-nã¶_(ßpÿ„a—tÖï4N', ¼‰„bÅ&|(|,=Sd[B #ÌÒ•„^mLŠjUðáù›9jÿà`Cu™ÎH&ó_6-RV/¤ŠŽv·¢—F ¬c‡m—æÀÛ«.TÈr!²ìÞÙ¿l˜/3ž¯]½Õ½;dyWÖXù=LÄôÛ™BŽ×\é‹9ÄkežmÚ77C+xíôv!ޱÆÍ±#¹—±{ñužçqW÷~(²ëq²s†Ëº*hõûg·S 6õtûú•ÌŸ3A˜K®É¶D½ø+_<çÞ§ûÂÜØ9À&kDž;BMˬqårhÊ„F¯Ö‰› Õ+Èjsè¼ÖksЪË6àÀèóÓ þýEÀF#q_‡åë_íå癥8<½4Ýíñ&,ÞY1Dñ 5ø¸®µ±k¢™‰¶N)r汇,L3*iÔ–ùÄð‰)Ô»|cnÃt úçˆúkâ]mÈC£aD¾eFdþ¿.KKÈ\>l ¤Šer@ƒê\ù¡Œ¥9<§0IC¡0ÀΠØO˯Ñ:íb­¥a.<ëþ’É‹ÀL6Q.kªÑ Zž'8†9K£_•¬®Õ±µÜ¹ìcfW²ÕÚmÉŽB7HÐóüAD0=m'ÒàÔé’1©ÓžQ û¹†ÉÖ‰A´isÈÙ½Ë D”§új;ÁIvì”(xn¼¹1ºú¢¢3¼s¼’F¼Ÿ™zÒJ˜>®Ã»µt]…Øì­*'`qå#Ù;ðxµiιʺRÒ\ŸªmãÜèM…©Š›ìÆ6_ `¾I|×"m5ÜcÙñk^ì³Ú7GT¤+X?ÊÛe ÷Ð?}ÀJåkÎø·;EVíÌì‹û§;HÝËe4š¿Â@鬾º†'­“Vë¹ò+‹Â¢õLjÎÇΚ{ˆ^HÕ‡ Æïù÷dŸÚ\¿¡Í  —±’Æ oÖéNÝ´9æfýâ€+u‹å¡ Ä+ŒüØéŸX5ŒZÙ“’NN£îÛàkáÑÑ¢¶² M¨o™A ç­O.o/, Ž«“â–žû™>¤š0™ÂMüE¨ ˜õ1E¶`{ŒèÊ^ÙC|ERU•U(üÚ08­1Å,TaÎ+ŒM>áafìø,¬ÀÿD©1´»A,$F…î-=ÈLee iº!N];™ÇHdµ-UwKAYøs"€7Aw±´F™{EÂ8˜¦U°ÕâÀ”àÊû¸¬0çÁèŽ, dªw–}ůuλ¬vÿBý_ßÞê{ï_?¸ÚŸõgI`÷:¿ª•Ž—Ã7eP¹/†ÿ}ð¹dKëMÞߪ2¹rB2-¾/uˆ¢T¹ø$! u};´)ò9ÍP–9RÇ‘bÓe®ÀвºȈÁtûg¨¥DžÌz)"Þgݹ¨JмC¿s]¦‚(zâÙ$ÝòÄvãüèò‰˜jÂ=Yš32šÞ'–ëåàrJì墰eF}˜ÄÇ/dšJÌã ·¡§G¹i%ºPÚç0M1¼úag2* QNŽÕÂRýqÀU¼Í5ümiÏ>÷†ñÐbŠ­ÝS )³±©dŠ.õ¼ö2SïC£ õ``*Ž]‚ÍDŒ «H´¿¶,%oÂ:ï_Éé.}ìN’þ¹ZNT×O·öÖÓT7/ùÿ‹²›€¦«è0ò“rèÈ~{ ·køS¿xÍÌh|µÉ§&ªËa5PÈ—ÿŠÒã³ ’ü–—Ý^1š¦ê”WJXYï¶k½Žè€†eÓFG!o¶n9Äc3©?Utþk»“+ÛN_Qo÷pêN´}…'YÑ~c ‚ù7dYd*aò>FÿdA‘ìGy-˜ S*5£êp‡’MžÀr VKV0÷MýÀ<ÓG‹’ ?XÉEõ$°!º½³fÛc˜¢ª0;}‡Kn·õ›Ã4Þãð§é¤õä56ï¸ ½Ôï…Âðý¿ú6F**…¿£¹Ôޏ Å3AØÓVã/ÜA=ôZ€çטÑ𠀯>˜M²é?—µo\ð->À3ÑÆWûx´V1©TÔüVL %7ý':Ê÷€°ø×½ôU°œÕé)x_gÕ>Ȧg}Œ²ì˜ÆHl3òç²yÖ~*wÕ65ì۸ü¢çù2/ïc@eí¯©û]ÉÑ¿¯/†lxPí†ø¶˜8F±hwbâØRÕ%©4AÌ­QÅ…\Ÿ—»¹¬QsðJVð­Yíh©Ê‰Ý,©÷ î˜ ³âð{0ØdÔßÝQl¤ÄÃ>@@•F#c·(kœÝŒ¨2˜(¥‘Q̨ŸÊ–¸Ò,y…ÀÇQäŸ=NÁûHÙNóJâà_gp…9?îClÚéZVáÂeœN³zÞ“b–c“‰Âì§F“%ŒÓLîXd/]ƒ&mÝ0OoØ Ãí¢^gP¬VgLø"ËÁLë {¬3õ˜ÒoL9v¶vhc´¿Ùb`)Œsªƒ”mr+!|(6Wkbˆ‚FR¥Þ ™^°èê;ŽÛžš¬Ó“!Xz%8Ýàåb.PLÚÙÌ´¾±BŸ÷Ù…é_ÌÛÜjô» ã?ަí”p ö=¸¹A¨¿ÏìˆÒÒõ™Ìû¾R»‹)+[XkÓ›t±/a|húÎ>´÷úðÇõ‡Ã¤—;Ž6&8þdöëº;À˜£Êž-écìoqzïÛÄŒ0úNÌ¿îýõ Df2ãÙ0a"S‚gÍI’{›¬ÙhÇË“½5-?š®ÔèÊdÚ¥8Æ®ƒ0)(íÍ„a"wUò¡ëfÙ‡p|r7»yK¥Q=RcÄ\änŒÏEÄ"­4n‘9’(;`”’®îëI&€kæl I!É…g/Ã´í æ¬Ò¶‰šqCâC× ae2hÖa}fÔÌ“"÷bبþÅÊס½–WÎC¬A”±[©÷ èÊ Ò¨å}"ÓJ²sðã¡ µº)ÈË|Ì k!>³m6½R¡jKaæ§9eæÊ˜C Ñõþ],U?µÃý3-8£¿9´}â[ ” *AiÅOÑ»—…eËsƱöp^¬ŠT-=•sù"œž^O"ý±RÌ«4$àŽ»tÒ aš™!sEœœÌ)»ê,ŒõŸKo”'Ò”ìŽÚšÝÕL[Æÿ‡«t¸)L¬Mæ3ýÓ§º¿kœ¾¿‰ªöÃ&¢#Oô‰7p‹ajÚø<¥:2ß SÎÊ©ýÅ¢ód±øú' -úïÎä{I@ŒƒäkVWÑ,†eËêt÷cŠdô½Ôbê%—¬¦HpÝÍFEB«+Û[–ûÅÖZÛiRãÛ#PHÑ£]°ÿ;¼ì±ºŽ¯‹´ÝÑ4ùëûéªÞf1NRJk„“,&c¦'µ[±|®§/ðôN®Ø r¨54Ó%,ˆwRr×/IùÃ$»´õWW»Ó9Ãk† |ã^#ÇäêèK‡«rXæ­–Í MQOñü#}Ñ&6—‘¢‡dÙÚ¡~Î/sÞrŒ“õ[1º0ºižJ¨ŸÌÒ!{pfJ²ä§…ðËöÔÔ÷¾ú\ÿK>9ü­Ø:X~Æ`éWF+(>±Ð|´ õ|-ê#|¶½IóÐÅ ×”¶x‘×!”AIªé oªî½ú0Äõ×CÇoèÊ4 .ñh¶æà ¦Ã¦œ =4ض{4d]d™KOçæ¦í³™Š{vÏ‘ ùùÚœ ìàFµ£™ n9¿E/-WV¹Äû¥y8PFh43jÁ'g L‹->?̃ÕV†¨Ž÷¨L= æ¥?|͉šdHî 0~c˜ÉJ ¾°l᪠s 3+ç”ͱÎ,÷a< ø$“'úʽŠjb8+ÃR¨äÍ€mS™„öÁ¦È»³ Ñ®“I—dÀt|öÐa±ÑS[kZM.ì-}‹‰© ¾ÿD•ÆÅ,àŸLP‡cMnyLÇ¿ï|¼ƒñîÂî6aDEô㣨p=Ü+©å¬†ó=’ZZ'Îæ2àXmÎNgÃ}miÔùxKâvê}©çxÁsïm€pŒn+ùܾÝd–~=d[ õïcyŸHN5Щē´Š—ðÖÔÎ# gt ðõYG¬K¤{ž‰Ë¾LòNr–mv×r.3^]Õ:ú¹º^ÅýÏó\ßmêÚŠâø«ýÝ“ÄxP’YE¸`îÔK(‡÷ •‘ÿ¢óñFŸâ)Dò$ Â|ø0Öd§Ù •³›=FÑqÍS  ×…6›Añ«‘¡+°6+þŽÙ‘*÷8&]4/âÄC¹ëŠ©߯"D1!X1€ŒêÞéAÎÍø®]8Wøùf5“÷Ο6w™K"/ÅÍ’0ÄgÜ›+ÒTæ™GÛü-Ð&¤ª0K.Nãƒ"·“0eŒu`§Z«)=( ‡'¡è¢SD/:Að¸|'íŽó5Úe£2,Û›Yö èLÇPƒù¡tñÀÒ \<¯ ‚ƒ j"ûŠ/F/;¬âæç½ˆ0ͦd’‹wø¥Ñ¼÷\ ¾àœwò%¯‘íù{ÎòíF}Å8¹”ÒŒt˜z¥5¾p¤^`w®';‚ئ¢“éSšÂ´îÍQ}£i6n1âòîë÷<ˆyÎ'A²•Gb{{~g?–”‰ÞÔ&ZÛ£zkì£Ïm[™0hJ°ªP>XûLú9›ó‰<€=O¦®=+GDÁ.¡D3ÎûÇ]ø÷Rf¨ð 1Õ§FÃDŸè_*û?Nb›£s ¾Öà”*RcƘV.-‰ü>žìz)V›Àz8†ÃΛ³OkÝDÏß’yÔ˜¸yƒ‡×Ò±}å¡¥€À¯]]}2Î7µ îœù\¯2í°¦åØôÜR­ ¦w­NÌ JìMyÄo Öî¬n>¶7U8tF¿¬ïTÞôßÿî­¢ÙoÜ$†MÕõ#[íëÙКpCùÿiÂ&ÿ8€CƒÌ_>å—9´÷7‘BúÍ¿þKRJŸÿÄÿVÈ¿¯_?é‹—œ:­å5þ÷¿ã!û¥mûDèíÒ­Ç•'ÿå¢óú¥Î‚üìãõL•B¸RÉ…Ÿ´6Ù5!ˆu0“T.N_¬ž;ÚÊnjz]êÄ_û‚PMáVrñó'ÐÞc¶|-ûî¼ë{wq:Œ€‹‹bæÎÝÖ¾8†Š>íÜÓ5èv°TyÉê|Æùj s¤ …@%i~5]n»‹fŽ‹5¦JZ!Åœ N Ê]„‚Ñn¡¶Z«J4k›CÆ”°Ä~‹ÍKê²Yáµ:qRì&ì•XªÑ¨v;ÿ†Ù ¢Å]MÂŽaò9ÝüÈÕb2ª4™öŒt¼ú_ïµj¥R2ò®«s] æí³„ªŸ±?y7­ý^›¬+´à¿I×µìªWðÑǾy÷Ÿ—àK鍿ßÂ#ÁtSŒº@‰º“Å•d2ñ7½£ !ã:qØ ’Ž–ûÒ¼7n²h¥¹ïXˆ4ñÁDaRœ³Tpù ¡óG/E‡Lˆ^/õ¼”+[ó"°…ñI hÕÄ™K"ÈE]‚–Lk”˜ Æ$Ggú^ØýZ3S¬öÚÿ<è=Pe½wB}T°ÀóEa¢œ¯&1ùj(§EÑÙÎÐÒPíº¤ù`M· 䢵S&ó,ós<˜Nꟊ":ª{ÍLäs`8 ¢>§žö ±®èÿ³—ᆆçoñ­þÉ9ÖÝ)è³íý BMR€8ÚA7CôÄÃøˆít…˜ÕÇø¤“3Êñ¤,K¡ó°çx™¢-]{% ;埓  uJˆOÙ䤂ãð¡÷¹~ž1)Làü­­î™»‘–á¢DýËâ.a&p/,K(›ÓC¶<0©ì KÒ1ß‘Ûzmýk6q'ôüF… »ù±ª±$Q™±pÝΜ2‘(…P*È Íè-µ„èš‘/G ¦àIçšvEuÞîTEº®î‹tñ“-=¼•&_óúÝ ŒŸÅ½WÀC© Ö{‚B_ƒ‹G°'ݾԥQ°m9lñÈv©víW…~÷˰=È¢èø^˜ÉW"•W{ý·ézåª0^"È’ŽUXKPÒ(–oáâeщ¤2ü<»fíŸ7ÕøóEçMž0H¢Yæ`…p‡4½H\&À˜ÎµÔ‰§ëÞÔµ/ýa(¸£3öœØQ5;¹‚*ÏÏ¿I&Zã³ç4ª$ZUX{Ïz‰¸O´ž IàÇw„,þ²`;2ª;Œœßò‘¾¥aPœ§ÕÃÁÞ#å£Û? "hQéélx]24½ÎEºBhäÀR÷ï¾£H(\ÚA/;'f>ƒåý… ežXM #}/Q4.Q0d#þ›µmƒ¡¦–‡Y²Ö«IzÆ[ãË¿ ¼ñu*ƒ´NÌ­™Ép©—™ªˆæÚ6Å êR-9)ÒÅð¡%Îlã„|;Z·E“wL©ïðÏUvx|\-¼BØëÑIÅ$Oxv¬ÔB™´a€÷n,#Þn1•×QyLuÞÆÁ[¤‘e]°DÏ{r9ÄÞ5L÷)ˆþª[(’òÏbO±Ý)«Þý!^afì sÞcX¸ð ”vQ(ÚfCͼà%'7чÐêLÃq.²¨–ëXgΉäÍcNqf§ʽƒ~ƒ—}˜˜Öi?Ó}[°R¸Þ7™³«<=üéég[+F¥‡†ŒÕë4c—"M$Ê«³ äÇíúPˤ8½ üÑ¢Áÿï¼Tä•¡µÇ`œ5¡£6ÝùûÊ iã-A‚4¢8Ëz,ò¶'¹×PBé7à~ØqC.È,²) ÅZ™oF¼Û] maw¤ÇE'À€t")/ZJ â)ƒ×î9Ò|HJWHzÒ/Lˆ +A<|¼_£šê‘hà›€ÚEŽû+Q‘‰æ-å} M¡(óËJn ÓsÖõ}WÎ놫[îjJP§%¬=½“´P2l{à÷ý$«G”ï í#¦(öÐP×~ƒÁÚžv#Þ hïáÕIqÇà1o ?û;SÇOêVÔ->îµõÂG°¡Â¿!ÞœŠæEñÍúê3ذ—쿽Ôt£ív­pÚ‚€i'‚û0j¶sÙܘñaF7ßKý¢ó#µƒ×Ö»œZ«¥Ë™‡ö"ˆBôl±ìhÓ“aç$¿Iݱ©1°³%YÜã/Ë u6¬…O~v¸ÛêÜÁ0cŸºdŒx; Úk·ZùG×Ü¡‹Ä~en‡Nm¤‡Óà\$kÄ ¸‰ÂÈÈóƼ(GaP²OŸV¯2bâ3¶ Ÿ@£ƒy‰˜á²Ž@&|v–‚ãIÌèÌir4ý(‚Í´½£ràÍÃÉR#üâþ'÷ßmæpª5îÄ…é –2 Ò:mpë¬ÅÖõ'‚†ðíµ)["ò”/*h³ú!Ó™Ózr'ÄÅŸ­ögH•FžØŠM®µ¹Œ,䵆=ìðCSD‚‰ÖÎÀ6yb|x¡2Ób6¼›Â’œ6ÌLTšÐdr|÷S¹ðÏš§ûÉs{Ÿšâú]æ½iý/^dÐâVi€L”!K€)^t>LªÒ./Ù2Õâ p=ßT’[°Ø~/=ÀN丆Ä6;›bZ¸<`XêŠð•©QlM îŽ,Ì“úÖ/^ÁKª 2O$f¢ÄáÃLN¨wªÚÃ9A!¢ŸS¿¾¿*&é~èýa>KèTm"•`Úî3žÒù]?½Üc^~_xÈ.Çàö`¤H*_Én´m¶ÓûSÀ˜Æ¯üÛ¢“È·1‘ïú@{àpv ÷.¾ùæû5Þº…@W[è_·tàßìë[®sº>ÐìŽñø#VÉóSðS£Mÿ¾~bhÿ÷õM»<ÏóiTÇCO¥2æú̹2Œáö“þI¢óIH#?äo²ù” Ã³/¼3\+îÿI­T3n™Tž®ÿñ –¹‘ßô@~ì=&$Á0µ‡ÌÿåáÂgü%MËί&Y?éôe¹v·/ânÀ}XônÁF®a$Öw¾]Zž:¤Z2Þ¢1iIN©d{UÑc¡@3÷hzï½x‡•ÕEì‰rqËÏÎvT·$ïÖ¤©ô ` !nµÞ…hâ¥!dÖ‹Mú("¤ñ¬™ÉJžœ.}·f¥IîÁ¯tú8°N•z_4ÃÖnpl ?ˆ^?ÌRcëVp1~b]cA&-ÿÑlA¡ÝõÑà¯Q ZÚÿÁîÞê ´æ@Ȩ!‘õ$y¹xv±!fÆS]ç"Ûá«cµú2‡Õ ­D |ŸÙLSµ*g”…Èh°½b*[D~6ÔxŠq¡OË·y‰#2–) §@°›(ËéP„dcª•é„}-´ þõ‹<ÝûÒÆ—¦y’Hÿ“N¢CÙc¯µÙàjö²¯Ï¹¨Çä£Ó.O{å*ˆG禌66¶³ òÂkFÌéûs}ââÃæûæ×…^Ç£¾½t{Ù‰!›.Komøà@ÃTÂ$õÓð*p FÁyÍä pK‡¦;AØü¼c¦&(OÅ’“í>:aÙWŒ†ÕFY˜3Éb>4ex#3žQŒÉ«›$u~\¯¶ÅÀ2RÀý™í[$€~ý¤*0#®ÿz¹zs²âùFó)˜jX"4òqyí 8Å×qt¾ÑµÁÚUUsG_¬,“¾óú|㦢@~éwj „òÊŽj{©Ÿú¨BVŸ–+lI×i<{´Ü7OLÞcïjà™HCzΣWQ%l­ãØUôÜh”x&)º*®k“2&ÊÎ>˜wJA•› —ëçi;”&2´dìé4kmÅ@G– á¾a`}Îë %d]ñ Y¶²h@ï¸;6õÓ’çæt±ìñÿˆ(" WØ’™b½ž´Gl•^-è®Àè¡e¾ïHS¸`~ ÿêH5>DvÒ¦÷œ‚$ít¨Á0[A™EAì^B9ľ£•ˆw“ñ6›¥Ù8;‰@:»¹ñÑý4éèÄ$ñ¢_øháhWƒ=VAÌáÇèñÌqmiÔJÕcŸ…õj*•º>”JÄhÀÉ|BºûÓ'àè¶SšÄL§•°õÚcZ£$˜~v RN£¾Nº†diÊYAÔÁ!¢yÑsü0 ¸Òä©uŠzpi,ƒ.Ñè­¸“!Kè¥L'+^&¹6K lÇ?ßjËwb†:ØH/áúP±Í@Ûપë[=I;–šaWÓWI»½! ŸÎcÀlr˜™âÙñ€ü˜ªò¿™¹t˜zÖ­$n$Dã÷rÎtc"ĬbÓkâ ÎrÓêqÞD7oèî‡ÞQàäH¥“G0*ÚÏ+Ö=lä±~#ᨃǻÐ^3£úMÆË f  wp³ÇçïÖµ8ù²ˆ)µ\"úo{T(Ú‘­×#2¾èO ±Qô¨$¿[Þf·ÖÏåAß®ƒ¢Í—|3ç3à'‚1ʸü H%*noyÚ%ÊÞEå¾ÈÓEì‘xŸ ófä~×j1«ž[B Kx šg„âç)ö âa¡Ö\‹væ¢Å϶°-t½œ…œG€*¤Z0®*EŸõÏyÂp`‹dñg˜5\¶â)“Œù,×Î&³-üB&šR…ùZA("L¤ë“I:‰û“òË_?to¼F²/ýÊT;žÂ¥ÙÁc|ÞÀJ²šÜ °Ãð>(~%‘ØÆ*·'0ñK•"@Ç2© v¡3XÈH…&CÁ04dc¦×ÚË÷ŽœÔññjõÇ:ÂòÅ(¤At)Ð Át9°¨ºg¢ŸªC(°Ä—Ý3½m×Þ›R¿ÖáÁ‰ú ‹q(¨ÏÀjN¹ŸÓÿ‘8ºÇךKÚ''ê 81’—s<ƒºp³ó^”ÙéMøc¥k÷]ƒ§Pp™êBgg2( ¥¡?`iG9®;ÔƒuœJ$e;6ÒÂÎA6µ£Pÿ£U góþ·Ìðtûÿó_þk¢~íîE`‰™Î;žX#ÊÉ‹#üy§­1Ž 2^=ŸÛH‘ÕMÊ“ŸU–'íZ%¼ïÚ sùŸŒu¡EžAèÌ ÑZÃ%]Å2Z+fÂ#t˜:€Y¸Â@ô¤ RoèicŒŒÐÝD¸_$•YÃg‚±J*ƒošì ã«{ЋeÌ‘"=?9hVnQ˜1zäÞÍN‰W' ô?×Ü»ERÊ JN¾ù³Ù"êÎÛš¡53ž’UôR2ô…È †æÔêtæ£ÚœfÅ^ZH1!Ñ—¼µÄ=pL+˜¦&Å ©Ÿ¸CÙÿú=Ý¡®§\~Ë(©ÃÞØaøÉÌ»F"“q±•–ÊpܤÔ)5w·»¤¼gsI§¡È-Ð8e~»H:bÿÝUçÀ¢К=÷™}:3ÎÖL_–a/¤½Ó`(F{Ønì äò2Ñ…È5¨Þºh„˜~À^I¹Þo—¹ä;Xv Ýšå›wŒ[Ë<ü)QÕ±Tßí€jUý Åeî®ÎMX,Ó8¯Ô~Ò"n‡ï&K\óudÄ8ÕmÃ.ÜÝÜï6\ V^Ûý~OÍŸßÆý›ñj·¯x‘±¿³ ð_ë0ð® xIøÖꯨñ;·Q˜›¼ý©´ë³,ZMµ$ì ü»D籦¾‡Ô { *Iéx“{ÂÚ_9›bú؈ëÿÜYé ÒØðÊ€äUؤ–=)Yt8sdó—ÈŶÿ*ôïë& {+R îÁ h<‰ŠF¼„ûQ€†[ç¸%¼Ç/Þ­´|N¯¼8l¦¬4+I@¸òrD‰Ÿïdhäk°à½Œ›¬Ý·@ë>Íl‹×sCü m$Ò+QäOFñQ§Þ“1žæñp¶@ÿ‡›u2E­vÚ´`ë’%\¹Sf« ‹Á…wÊMüI9Ý“Q{i‚ˆ•ðíŽVO§îùÐÚMàÛnI¥TìÝzÆ®éžatD.7Ô]…>ýšÂ :8loÆ¿`êt¨^0¼Ò½Úú&PPzÎÌÉ@ʦ 1!»Bt;Ì­E8Ú솹±ªÿ™:]w5;2k*Ž‘ ô-Åí´ˆ>gŸ=Ôžv_ì‚ÕäÐLñj*y±°Ó|Aúµ4ªÙ€ßSJíº>?ƒ:jï|;°Þ#ÖbÒ·ºUË3¤hžoÁÕI$û(»¸+Š°Ê„`Õ­‘i¢c9Î÷H¦Aˆã6È–M£,ÄÜ~QÏ»üœª”ÐC§¿Ò·h; —ËcÊš/‰ä@.1!ã[˜/ÖÒ:MUýªZ&*Ñ Û¿JÔAiNæØ#ÞâFÑ4â"¼º¾oSÔbŠÙõ0.F¯J—)¹N[ʤÍ@¢U2Ñ>‘¶ñ¶ÃÖb¦2Ò°´»F&ðJѨ:Šþ/ø¿¹Ê òÄýÅ ¦óôv³¼Îj³»5€œ˜ÍK3©AÞ;¸Óý.!n~Jyʵ©ÔMê¶ ‘,l^ÛN¥FçÕs­w¬»ÁÕæyÁm„~/ ¹\È–´æ¹¤÷-±1«™H F€ŠÁ­o™ Ñc#¨20οŽ"žÑ"Äp/4ù¯OÐè aÚÔ´1IáF,êÏs&„¢KCšÀYÃ4îö©Ó-LmÐ3ãm É„¨jW¥Dd¬ÎŽ|ýу»B‚•,CH¦ÔÌ:ŽDËCl Iž§k8ëüßÏýˆ»\A`ãrøG¹U´Ž^Nr n]øóù «ÜJCct \‰¹.U6S YìޗϺtV#âe=Ñ1Ä jÕrZÖù¦ œ9®³5žÕz€95Ö­° ÷U·6ÆÄ+»ãî ¯nø/.¼ ùï•ËTTÓ `N=Ù !L8'ÙbøâÀb?p‡÷.%tèö2…®šÁ}/S)Ä'†ûwÑÿ—Ÿ?ðæÑïÿÀ§KWJ4T‚Ÿ†êeóy½ùÔ­ˆVI÷Êz÷Œ6'}€vgðü¦,Ÿæï˜ó¾O–ÿ [+¡€žð]ûý—Oð§^þÓq“ª`þøm‰ðÎ"VYæøOÐV;“ƒÆ'Ⱥè|ºÌ§OûjO/“o7àõƒÊi‘M‘såÔ9ÆJõ¤–‹ÕÅý°?°­ðŒg»ë¿}udžȞ:~šä$>Rd‡iy[ìë™_Ï|#×ÛX¦·¬”\ŒX2fäa›h’ÙKb罚ô¿ã(T¢h{±Bi}ïØx2Êj¹‰HçüëŠZ‚ˆ¸ Î6©|°‚EYí ¦‚KpÛ3aÈÃÍEº… i÷N€õ5dSÿÖÅ*Й :v½Ó¢ÿPÄ)>c0Ž|ûÙ²¡nÐ[&oÎN%MÓm‘llˆT÷"ÿÓ{,Ê]íø0,qÎ+?Ím§/òF%— A:]ôÒ)žžuÝÝ6¬ &÷Ëx~¼ÊYâ€ÍÌr0…ažÄÜm?G¢‚?\ÌcZ;Yº[h(»@xç\£ñ"§¼3 ‹cï®f¡=õÈRríºÒ£"ä¿Rºöù(Œ­êhÔV\|¹©=×áXÓ:û —ÌÜ3}=Òrå%d¬¾ËÂPMÏ.Ôï×Ù»ˆƒÈÔN“x¨®‰w³¬QLÀÛÂd‡¦3ÊF×ý¢L^„;Ƽ)«¹}üŸÜPéõ“ÅÚ<…‹ÆéO—Ü„Îti’Àêv5ϳ焬..$’£B&ƒ……š\¡ŽïÁ5õúQ ‘ø‡Úþk ¡“hFO›·"c ´À¿’Ú8½ï:“ߎü ¥Vù6]F‚“ »Rû\sÀUžTˆ0‡Ÿ ˆàÓ_W·×ø+™®MT%;ð[2;Ù×çWŠäþ>H‚­ÀSüß6†ß{F¡@»½…€‡™ð,òBÍöÉMâÞû]^íë&Uÿš2åx½3’T6e0ò·iX§\ìZï-îyÚ°;¸‘ãbÎÊ0jeLŠi A èÒo}BiØH‡w‰»o¶ÍŽ}=í|Ežþv?Î@ÏÓóå•äWy›ÿnÑùú (Ã(²=µgemëÅ(ãm¢¿ûÀv\cƒ¼f¡ZÎd¦Û TR-#""pÑϳ”h?I:¥,Ç|X¾NüªŸý´? U»‰…Lö™s#YùâûËhVïì™l°Ss¡­ð>+0q^´{†Ç9)'“m Ïn‹p"ÓÝrÅe†~˜ g0C ÷8B˜*ÌgR–˜-aYfmÊË8¸áŠ„™ÔLyÈê¤A9מßÖ˜ïÄIÃçehdŸ×Ks1ƒ°g夻ƒþ§Œ~ ~òÙM>HÔO°Í!ÒñIâiÓ²‰¯œÏW¶´0ZàXT€¦¼ÉÈSQBªñ3éüZ t‰dô/‹ùé :—¼@Z‡8‹+ÔÑ´&™³ûDŧ€Ë„Ó“H->\üIó„(æÖ³ØPFQÁ¨Í“³æá²èüÀ±€ïDõݤÒfpÐb´,ÍwÖªË9šï'þa®By gˆ@ßý@U²ÿЛH>¹$— ™Ná-&qX‘W“S…FŽøJGÀ¼á½)±]Ñ5ÜMM°mY.qëÆÁžŸª»„Mp› U.˜åÑ_pö…Ø4W6…§ƒxƒÄV‡…›QŒDTM,˜â*o–C°©m¬ ¬Ïjiž&϶ìpØÉΡ 4'ØÓ\îQæ©“/E÷r®ÄÑ_Zxx™L;xlsÉqIõç„#ºþƒÐ{©@ô2ìá$Æ~"]aì¸Cÿïw DÀaÞ³+&NµŠ¯är{YõpßÐaærø‘ÖÑÛgêÏÓŸó¡Ö¡õgóqBÅ ã|êšðæ«`)ÅÁ_“cå IMxÿY_Ôœ(äX)i%ÏÀ_ç‹æ®¼šÚx©Ç+oç›JÔº#Ï€èá͟耫ÆE•pÓK 2½êcžÑc1Õ‡3>«\¼r[DM”j°nVŽ›ÿÀ¢8âý“LÒe«ÃˆfÄŒXÌÄâ~“2Í£O¶ó¼½mÈßÀL®ÑUrgþµ,-hê™0ò’u¿íŽ¦Î´Á›¶Ü#³þìÁ×?œNìýbù‚­% €_>àÕ0°RÈZ.\ÜÀ7&}m†-&9O¶Ùç{I'±Q2ÿŒ˜ëÓYçæÅضmæÁ›¬á½˜š¹ƒ {ï*R Ä8ŸnÞï«ï#þŸ/:¿\£ïXšs÷™³}A™`äÛ¯úÆó#9Ç_$3úCV•xøøäx!-÷ÉåÕlrÀø¼¤æ¯¬©G7¼ÃžÃ}}–9-Uy6]„Wˆ<ä4¾Í“Ü"&¶+8[9dó^ / —øvj›!“Äü,ô×›:¹¨´¸/õz›Öê.!Ag»¤òmÞ¡FáÈ$¯ÿ=œvÃ^Å£ÿ¹ÓxÜõÌi2¦NŒ•ÝT7¸µ»Ü›¢2[}—Ú͸ÓP?`½æÕÍpºó} rý¯,àœÏ’ËÃIcŒÓÒ¦¤"U¿™ˆ´4sîtP¹‹ðaÅbfŽÅf™M²g0ï–i¥äØQÔHÂzФŠÔ5Ì„5 @÷ÿw½yÛ¢Œ¿Éì6]#0Ó¦?P|7ÖmÚ„QcÈÊšðÙqª v(NM,Ži'LÉZÕ3²C:^ ö›³UˆÍP²ž¶¼[+2:äÞš¢gÂV‹¦Ó„ŠE5iu6u Ó Öªt .E%EôÕ'4üþÌ+‡B}—×Ë4_"å^ËØ~¦Ëϵ¯ƒÉ ©™P 5¢ÇVµuÛ÷¨hD¼/ÃlRíê½;p­ñ¿u~¥¯»^¤=Æì„„‘út³ùW[ußS× €/Ý;hz÷sJ{†"o¯Î&m3i”!&Õ¾¼G:¸3Œý9› mŸ†¶ñÞo½ºPOõë+!‘ªð•Põm³—•J!ŽEáëñãsOé³àòpÈ"FÒ„¸µŽ¸Ù,½°hSN[|§àw'‹ÄµÞÌ}ØŒg‚¹¤J;Øãç¿qïµ»¥4¿²±’Ào.:ÿè1§Ê¡Ë_zûy§¶tåÁÄ`/[±âÀŠ4ŠQ+2YÈ*¿Üç£id¡“õŠ¢•R ÎüøPlù㘦×לxSçòIÇß‹ } ˜1ûž^¿kñ"bA®bPžÕì3Êò'–ô¼3³Sû4¶žtd–ÂË&¯»x¯çþé‡ÂFÆ'¢‚ÀÐÇ ’Äj¥ÝE'tP”#³ ÄNìÿäü¬Mœ})¨ú@@!Jæ|­¥ í¿n÷¥*f€}ÈÎè]?6#46ËE=9÷ë#vû4Ñr¤•š?qAÿ8ºNÎκJõ¸ÐûÙ‚‚çÊiKí4ÓšCĦÈÖ"„Ü¡Û}¢úk ™©N´V•¤¨b2§›sC·œë‰óîBb3cp *ú×Í‹xÐÚC8]ý—eí‰Ê„‘ÀÙ© c㜡{Sìî;&òâS¸æ¡GDØèŒÎ†º%v:1ªÜriÑX½º-¶šÓZÙŸxr­©Ø³ º7#\û›/F~ ñÞLDE²Pþ¹éh»¿Ñ ë‘TmĽ‰êƒ%ºZ#|Í[›H€rŒ[4&D.æþŠæÝÝ@F˜ÿ`~¸ˆ‚fêRêSõÌéÇÍذ¯yÿÑù<ŽLî“ÍæŽ\8šùÙÚpD CꦎéGmÕÐv Çge-·U÷"#Ïc׬ Y4.® Ù2Ç1g‹dýõ;(éMãþ­œ·é]©£ÝO ŸØàÙƒ6¿<•¼î·ðÉ0Wäš]åú³ÞãßHFÈ\üþÒ&Ë_ÕTykÇ‹ƒF¼±¸½È—ž=ïi0õˆÆ”Ôö¯°SŒÑ$Ö¬qE€®˜@ZI$Þ”d#KC< 7Í/kêlvYŒÊ‘\ •B\ÞÈ/ïXcŠp`¸°¤-zþ¼‹tŸê,}¢ã÷µÈçíP·¾Þj›û ì{Zz’ç¨Ø}¨Œ]MfÖëþ’*¿ Þí=¦ðÂÃÏC¦7"Í1‡Å:u¢ð˜ö´®¦Iâ?ç BäìëW´àyNÝÔ¬uŽz-Úq% æ¿Vã2¯´@r|z§#¼\ œ°1æ.„t{F“ Ø}©Ñ <68%JõI:sõìÑе¥¦Dèl©Ë|@Á>ŒQ:•wHðl7$ld÷Iž HEGUT×¥Ù!š>—’…ˆl«™^Ç´mð$Ѹ‡Öt¶À6ì‚ô[1´P­zŸÅ(808¹Î\Ù1D¢éXl¢ sŸ*>†Â^&N@W4þxR2 ô·RïÅœp§-†ŒVéœ`4ÒTJâRþ·77þ(‘pec±ÙØ8wKÿ·Zr×ä¦ç ÉG·ßù5¡$JÝßÉ(9uÜÜôœÐ°kÈ%ã±NÚjÙ˜ü7rtÏ9´8¾ð`Ñ­åv¨úíKý<æä•ï‹`ýjOj 9ã*äóz¨$€ò^P¹{>àU[‚3G10pÄyªDŒXÚ‡‰`}ìâ옳QCK©¯J¢Ói½A•¸ç"šîG%ãû´E/a%Š¢Íhs $«íZõÛ*ü¹hë®|¿=ÓoQ™ Iös(îÞ~yþŸçÝ tÕâè™Õ”îÆ¾ùoøuÿ´¯zF;÷v$ó=)óæc¹œÐêv†WŠLi‡Ö‘)9``û`ãØ€þ«;dˆ-ÙHam2öUàj:´LÊ4éu¬áýybH>ï8G µ®tíötªtÚ#lÕæ²Ë½ÏUÈýq&å´Çª;\m-sq hZ|&‘4è¿P€¸ºg&“–oô…2g±ÁÁ²R0Ì‹Á‚¶f÷Á.Åßi—Y"áÀhðP“]âN¨ÿÕϽ~»#ãÐÆò˜£иÄdæÈ {Î.îP!ƒº‚ÚOžRÛЖùžVϦ óK£†·yØ»ÉkOË##Ѳ¼&Æq ¾Øý-´dzÃÕæàÅ”¿üM@m·@ÎÓΰ³§äôæV;áÖ:göúù9YЦåò0¦O{ȸͬé°Þ¹¯Ll˜‚°ÈŒ`«2ãñÚãf×LÈÔyìÄêI€·˜ë ¤Y<ÒÜ&רj*àå¨#öS«ÿôY€¶;¿¸n쿬ڽO©¦‚ÈüS7ý;¿‰Ɔ-Sˆ¾ØÝÅ+Ò_üêƒÐÖ?»ôÏø úÝÑ1‡Ô /ß_}äHõ=&’èü7\ͯ¹ $ø46%­[!PÀQ¡l¯¼ëbQæ—åïûϼ–ßnž­¢Ÿ>ð‘³íCôíkF¹dÀqƒUo ÝŒ°Eéöp{d"Àcym3$ç¼ä Õ"?Û‡V5o¬óä'ËgNPX!T¿àcÆ­w¨E*K­ÄΤ/v#»” W0Ùˆè7ßF²@R[¨¢tï"¹.íl"w£"_²F3ÅMJ[M(#º£0'¤Ñ7É¡‘ñÞ’ëè p2†êÈ«E:ñ¸Û0q&ÿåƒù€ÕyÁhë`Ôq»e‚_(ä}æ– Q{I€‚ÝO«lÊíÍÌM’Ø´Ê›©ùó>ý(b;zd²ëÜc„šLö5ÏÞ2=Y½ûT_o—îøK?Êô—ØC\寴ÿ(ÒšÓ”qÁZ¢Bo”a{ºtýlÄ%ar­º£QØlPÒèy Dó—£³÷j—¾z|yAÛ l§u¬þhíl<à•³œöÒ«Qp=ExÁÅÑ(>üŸ`Fáàz/¹žÖÎk›½ì|›:ïb˜ ¤¨Vu)Kúêïz ©”ë»G»„yºÛB–ΞŽ:ÏFÁÐU *ÏTFÃÙFdjs¨÷4ú$æ2ÿk¹V°Á‚†‰1D~™û’×À“lí…þó ®v\9E÷—œ š¼9à θb\5Ô=f>#vú˜¦Á£y~ùcbð=F_nJ¼ÈÕæ¡Á[aˆçÏì±R¾ŠH¹ !+.F]×Âr€Æ”"ê;­e£èHÍœšÍÚOJ f¤Þ§8ŽÃÙ ÊÓü†®U)×`’â"‰Ì8|L iî[¼ö´‡g#h"Ï€’KÀ@ú‘ýù9þ?‡¼—Š:yÌ’…Úº,àÔ¶ÔçI½¬ GÛUJñ%wÆM&Ï„íKÀœþ9…*™¾ Ó†Y­ä©7ª¸fÚľçä§Ó,>ìÈÅ[Ã5çêöËgdÒÌ¡«å8Íf™/¯óeK ÷畤;ÒÚî&¬ µ–©FܼoM&XÂxº%¡óŠ÷îÕl*u®Äd–nR޼´¸ˆ«PÓ€vÉó<ǽ­äbžÎ]£(­Ëa[Øh¾Ísúèbv®½Ò/ê‰l›ÉÏÇÌüi™îá4£îmê5ƹ ) à””D ¹nXC·Á:º) ¾’qS HÄ‹ÄL?Ù4†£‡Ö_,:ß …K<àhxLúéï¾Û•Í Jº¹hÀJ¬¾o£ã_‡ ·Á½·Avù5‚…ÊSM! hƒ_F±ÿ{D ´§@?¿Ûöì­µn›Ä—/÷ ï|i_¸ž?Íõ¶[^áåC¯–ÎMÏTñ»ò)¯±iÜ¿íäã§3E&¹<‰rYáÁò£‚v}‡{C+Ñä^%B¢‚è8Ë>úèk¥”™²lÞíÖ = E¿ÏŒªx7±în/µM¬ÃO23kLáIlHþ̺ÏY…¦iwðñÐC|$jÆuîµ3ˆâ!»%Æ~–k¸}w£¥¹¶ãšUö@Î Îú2i¿­ÈN-Ú§Deý\46ëO¿Ó¤ýŸf±Ý˜?;狸U塾!F)£—tÌéô.⵫½É.ÂFUêöuZ€ª‰ì>"(iº2ÃòR>Q&-šÏ çÀ蛸:ŒE>bÓ¶ ¿æð  Ò…–nô{NnÍ€‚怰ôÜ$ø"Å ‹þœ|Áÿc]I5ºøK.×_¹´(‡$§0#ŠŠ t$ÍùµR ZPìFºÔõõ¯¸1„BSo3ŠMKÑO¡tÌõpÞ„¾,FŸ$¨?Ê䥑£\# BP·½1Ý„¢@;Ãÿ>))x*é$A`NøRMViy» ´EéJÓ{NIDøò%É-Ù*hF¹B 8¯Mœ,ÚmÈ•³h|o—ºáGÍü–gL@S‰•»›‹½V4?÷ñôv½O¯vƒÉá9dͯfM»P9¶*Æî⣹ €.oþdf£é”êÅ'+«RJx.÷åY ¿¢´ã¡,‰µ&j4ôž4Ý5ßa+µÑ´XpÇyžn¦!Å}'Ú'$‰/­ß˜Y~Ø\Ý«}™@ºz¡ÈÊöàöûp§ÿ“56¹FEcC Î*vŽï[—-ÑîÅí¢JÒBÔ2ÅGÒ?Xtþ±Ð|Ì·r™ªáUÇg,Œ³ ’é÷©Ù‰¯8ÿ>_?\n~Pî?u[BD¡Ç\±ßjA9Í.¡ah¬ç>0U¥[Ýk&-B•€©l³…~hõP¹—õE5­‡)˜Å/4k8®ŽãžeïÉ¿ÞVår º kúÃRI¨ˆóŒA¾nb|y-0œì%—»[Ë9ùfT#>ÞãöïçÙùg;M…,6Ägz:lëGML»·dßHëò/…•ÔHäceÊéxxÂ?Ú¿fkhfFnmYÊ“éþò?u\í­OÞ;óó”€G_f·xçØ¿µ<Ìqgû6sˆ_ñ׋<þÑlwªÿ¾>ùµðp~5œçù¿ÿýï¿´,¿íuãwy^üÏÿ}½—{}Mè聆+'üæâ7S'C=œõü_ÞZÁÃÿ-œÈønæ‹·’æÇÏäámü)¾ ömŒÝwÜZD}Ìñý Þ ’VÕ:眳ÐôÍxÔ[\7Ü´p‘æà¿Ò €#Èà ý€ÉIÝ>‹—U  áÒvIhÏ·à†¬ [ì¬eÂ%„EÇ@¦=ó l–Þæ@âÒeeöËMú¹2ÚÛ­î#ç2v)ñǰ›”0žðš›ç'Ã0:>v¸töŽ·¾ÚV±·/'òÍûÃZe9sirºýe€7®i®\'¨òè™~Iå¤ú:ñ?¿)þS ´¥ñoaˆÊúòíÀÝmÐQ¥Z?ÍŽðÎj’Ã͉KVœîô³¿a¨°É!­9’hy³p™Žãæcœg¡ÚŠ,.•ʼn“`Žhh å«öxïÀúþ"‘ø*Æk T¨a÷dÂ$|™a€ öZ© :£>š9Ú‡òÔ^nXÏäñ `SH€¤C9™Ü ´0Ô®•¬.÷ÒXÿÑù ÛÚCV¹ÞÓuÌR–{Kí T¸hn襳¹*²xYÑ¥ÉRwX©¢lˆºAz=lò03Áå#Ûü¤?nÁ÷ïrXøò‹ò? ?ÄO~à»$`ê‘qOá´l¤?] ʘã‚÷î;âS€í‚QU$´j©]aìiFÒb¾¸w³°1À=¿H’eº1•W¾ÙÙ‚9^ ªôamߌúêœB3Ðy 8)ÊœëYº¥±8®|2fI¸óCíAŽYˆIç…U›-ÁDza^„£?UìD(Š¡ i°r"Aù‘¡èØé}Æå›î£4v²¶€Ü…±MªœƒŸ‘´Ë4oc˜wH§/Ú´™>ȼ\ËÑýÕÒUgâi’ï0*œÊv“š•JÌ’¦$ã•y^éÓ³;m¢+{²ƳÛêÂÚž“[ÁpÂð³Õâ ‡d¨™˜Tzóé“ÕË“aHš1N‰©`Â5Ým¦¥i´Ó¯« ³˜Pu+˜­¯¦é½œ½_)÷KaSZµ#õmS®h8 ÏõaçShlNí­ÑB°$UŸeví /¦\(Œ‹‰ÃÓŒDSµº— >}o§ggÎ!Ý‚'ÚA›723".Ò ˆˆƒÕ]  ©eËsäzoSûºê†Mºëº§aNn&ëH )ž"òÈ’*Té×p÷À”_·²¿ÈÈò7 Z»g?D9_‰?(fzÕG󶨆màg#6N%ãö-7 Åzür ·¥·¢äùÝÏYùþ[0èmŒX0j¿óc½²Ndì*Á{»¶k3t×JŽËö€÷7‡iŒ•8уz[†gXX8è^Jð‹¦»›ýžzp[· ,o·ŠnÿcÉiBò'é+ì×Ó(:ŽÜ=×Ъ*OÄί…wÈ›´mÚÃì[€µ€ù¦’ÅøŠË·w&´‹:žîƒÊb½ÝöW`¶Þ]Gd@ØÆî$­³9;C! ÁÁK>^ ]Ë$¡›×£÷ãä÷2>éL¤0|€!ieÐ¥gÊU}Ö_†« û÷ôOm˜ýcD盕ÌmQhGz!;°G!÷.ìÛPÙï|íª¼8ú«ïÿˆŠ©ì½”0c 9 J4VO.*ZÓõfujµÆàZjl‹huÇ#ÂsWÖ¨«ÍÅ8Ï'1kFáâNL}š§g‡N†¤£-¬^¬8Ž_39E¶þúï©€¶Ñ Å–U:46RÄn§‘Ê˃fx-ê´„,6î}½FI2¬áXZ@!(V¬›ðV1 (XüšN¸Ë-ÏÄÝ9 Ÿ÷Åí‹ÍU8 ëR§€5ü¥?Û±X}ÞcQ^×=â–™…ÍÊYp¡«MùŒîw؉—4Ò;"¡'›/½Û×ä#H"ô¢‘Tüi¯k"E¾A‘Ô¸ ÿ¿l2që]¶×žÐ4So¿øëÑÿô5÷Ú7ßúœ¼°…!XŠfñQ0Œ–S1W²ê•¬û)&u~Gb4˜kùpæ¨Eƒv…DœÝ×Xüã$ÂÁ·hÂC}‘“¹èFreÒëÆÐ 2‚rƒUDº<%QùŸ÷šÍjð¸²gÒém"mª„ U‡¢K*â+AZ„ä{’¦°¸Å邦 i¦–[V³nOæ!T5‰Zð¢ sD"žW&PŒÓc›ÐäšnɧBo|Pø:»qáQ•¼Ô¾VÄÜJè>·|ùP]õ-µ—·kYfMŇçÊâ‰y™€\¯²}ý½}•̧•Ñ–ø‹.Ÿ¬“«êíÉnþ3ä~ÿ}ý7¾ðÇ\Û·Lü‚’êáÀò#‹cÕ“kÍ0ý¿÷ñ=)»~WI¡§Ð“øýnïvÏ–"‰4N>¿4¸2¤€aã–Ùt h£áItÀö¿²2˜æÏO4ñþ Àw.²«õ©éxŠÈÈ´†GIÃ…¨¤4ã¹;QqysÂ`ÿŽÞ¢=\?ùªÃ޾4Ñ1°“ Ø8!Õ²)¹X$[Ú£!N`Y\1)†Mhy¥\­«|†Ù1•upÖ«ÑbæBݘ…(=Î…¡}áGsc¥èÓûc|îÃëê´®”žÅj›Y£˜†QLó*Ní|ö› Ž>¯¿b($àM ùD/\Ñ2]…2¾aÎùxÄMi Z1ó–hi+ý†K­jT}ÊŒû´8ñ¢ZQZ* õÿô;mÞ˜ÁÓC–ä%³v“ÚX ¼7Ë.jŽP˜€b­’Qƒ´Ç=^õ¤ÿ}g,hÌ¥u<à×w#ȳ[–%MÆ.AÑUQè]‘ç;¤³”ócõÎ0UŠa(ɼšœòÓmZ>\;/幓ìÃ]hC4—“Pt’¸LÜÄ  kºã£êï ã{cAði`Î)¬æ˜èlªh‡æàÔ.¼Õ±õÁ’Ñrq;zw 7I¤1”)Ï÷ÏÁ\mbÐ2*¶7Vi 3èyöû‘À3áXÁÒRØ—-Bó£U+¡®$,j莈2m6¯µÄ6=«°]N¢3?S^n¹ðNö'Ðúâô*"—|áÅ Q¿µˆß[æÜûÁ“ÜŠ"sÅO†¦°*¿°w%ß‹‹¾ï œ=Î…hO:a°Iüú‰Z&A£÷ü›tÎ#ñ|DZ“‹Ï{ñ,^ç.‡¶'ŠÀ;•ÇVòJåzD½@Ù>mÆÇyž—}Ðy*øêE–Ý+¸¹a¢PÄÐ>á“ÙÓ[9†hNÖ$„Êã¶a“†V™cJWdÎÛ[+ösD9r¹~Hv·ÁÝ|-Žæ}Ô%ûpàwOâg}¸pW¡"];Kq'ú%iZµ,×Ðd‹Ä@†€ Å´ïn7si…„×[ €1œþ½ÿ÷õû~‘?áIZ÷;gë»ÿÙ@¦7v­ƒ¸£è×ôGäÐÄëÛí«Û%ép§U࿯³ä÷ç;–õBxO>i¯,ßu*€¸ãt)Ž Ø?õ§O¼7âØ¶ûGÇN3÷URGí‘-a¦=>ýæ(‰¤N:ØZ·h§½Z$@¬EšJËÕ©¥i5 ë&|… ¼¹6B¿'d“ëµðŠ%i.<Þ×ɺ Íýh¨ïÄÇj0fÝ‹T†· \ ½gêþ€_Æ–‘ù¤B‚æRž÷-gàø±`À‰3:œ<[Ÿ½™XøÑÉû4h¤™ýµ/dNm¨À'2F&Ä1b˜?ëb™Ífkq6WÛl×(BÆÏÙ¬|ö¡¯CGp¦4Ììr·¦Bìnš²ƒ1=H9™àƒ™ò%ä4Zv$?°/]ÐÐ|ðˈ¡lµŽ›µtg˜`s> CùÙ H,ŸBK0râ}B„<,zR)MMìdênúÜK›BI**x5ylaTm(ÎÓóK8¡UiKsî·ÅfU/gôT•€9®"¹3‹’6›3ØqúÿƒÓÊXhqÕ¬33ì­o°NÖ\ªÚÙTÃ×ð"»Ã®ª» é;"ËÁd”±~x†˜w7Ï-Í?Š &ô!c7ª[J>z¯b=ìÐKL‡[˜îMëjªC“ÈfŽþÛÿò…šc›ñ䞨ëF¡Y6 󀞜4Öá¸!•tÒÌ ¬{9•Q µ¢h“å­!°¨ø´V3Xw€T¶åNÅ߯køøb[`:ëÜ96;‡m §“O" —sõ`¢¢†1®4„}à3T¤ZÊ¥}lí¦ÉØl¶§WÕÒϼ\Jó×ï¸?4›G¥ø~ÏL°jÐÄe ƒqóVeÈö©Âe~Vó_ØT_T±õF[—„dHVoïs¸\©£Îà4Š;`kÔÛÈ´_`×—˜ÎÉáO‡Ñ Á"’$">¬ý)ü_7”÷Ú-¿nÿa<À1ÕÉ2Ä6(”{È"Ø6cà:­ŠuÙac‹ 4ã„“ò_ÍIÎNÄéz†¸‘ lkò‰\EµœR®èR×_Š-%‘ã/€ûS⑜{ 5£_=b¥²*Ëeøpá)O£Êx{ŸÐ¿ž¸ƒ&B >tæÕ 纑Nî~ ªF2Å!a îšøÝ9·Å×WÈÞKySï$¢ˆ|7útj<.|¡);ŸÉBRô<„”!‚ 1àâu‰¼vêüòäm‰x¥Øpa»oj~ëÐþæ#ÿ¾žà°³8ø㎯_Ë|ãHÜ»‡rý⣥íã72rç¸æd®_9+ÆÊ04m"à[g’EíÍ 碋ýO¹ƒ’®N쀚{?ÉfË’ñ·k Èœg辪lRÃK{ZF¬¬«[¨ùñ2èô²«\t®%nÛÍ[¾IÊíq>½¡Mš7Ѓj;LŠâbåÑb_‰Í¶Ò>ÖU 870Ö€½h1MšâŠq‘ê^¬m‰ˆ{ŽÔ> öœtö{!YzçWQ½òû+žOeµQ´×ŸIÉxãß„Zys埡þþŒtÅwïÈï|¯{"vê|‹»ì>è å«!ØùE~é™ÅöÙOÏ‹¾ÆZý5¹œÅjÿC_¿\ÇÌZýœÜ_¬ç°s3SüdÞdü‚Ï»ìáGáøà#tÓVY~Ÿi>¾bàÛ“†Û’i™ë~°‚ý¶íù†èüF;3L ¼:Þ •Tb•ñ>I›ñ.Ô½ËÖæ›²í’sšåbŸÏSÒŠÑ-ú^ïBÏÇæ½ãV$ÁN—ºÄg}Ð [j´‰eª¼0Þj& >]†ÏÀeFN ¦«Kÿ>-Ϙ7±¡IáÚ.Ø¢òŸ¯o@7MóÓ”;5ÕŒ&¿wpÐÌù3fbø#­@<Ë|Ê??ÀrYC‡õ ÇbÀ#¡œA@þ.‚ކɵ.ÙŒáà>7 <²ùÜ ´?žP_œ-‚ü¦Õqî:c|¼b.;ƒWÅÇű@+îÝ’Bl3Ä 8Øl "ûí 3Ÿ©élkÈu­{Ýp$Lç c¸ºµ6Dj'>t'¼"Ìõ_4?åÁÝù¬­Š[­0+'&‚WMø¢·NÜâmK>]¨3æ:´FžNpÆNÏBHOŠÓÙÊŒDdx¿´8‘üÚn sÍ6Ôžñ Ît{××sýd8¯Ù×ïÝÑæ´alÂkÝ@>-pt œ©åDKYï˜~gÓ(?ólÇ1|eºdtï¤]yãŸÍ“‡ÁíËâdpWN`¬¬(š}U“Åi'žjÙ õI‰¦€—¡*uË +€“¶ð øí H†–s†¾•úHƒDÖtýWk‰â›0r#6ò  c (ÞØ7е“t‡w+Û7$Sÿ»Á–Ÿ$@„içPX›U\ýêÞ §-§õÞ%íñ›”=$/9¢$—úf7ë}Šñ¡ó¥§×!¥ ÖízÞq&0©Û±?Ygýzá u°d–÷%Wx?q,ž×ßûrßÀ†~fàQo"«Á €"­…7DÌ­gj"v7Öâ˜g^ ~î°t'×—‡–žÂýUà‹Wõ)¥…G`óq1´o×G êCH¤Q>¿Á‡ïñ;€’¶µx6Žcùôµ~zY²Hûo<´é4êݾÃ`Öxdp½n¼Ø3«‰‡kÒÞä2ññ‘^ `â_ß¶yàÒÀ_óõ_çiÈ*\òú¯&Þn{íKÚ¢Fï‡Dw \¨³„1hÖ}¡²(²4þSÆØÉ'ôëWé!5ûÇuý÷•ïVw„œgk­Ý+ã¡Û?:‚P¿qìøÚLÖðß1О7DµoÞ1äyÀî«!”f|ï#ßæšf‹ø?9gTT¡(Ih §û˽çA«d*ò}H€´òä^»È¿&·ùÞØâAöö%ÅVÿñ®ÿ÷àbÝ3š2 Š‘Ý½T„>&ZQ3ô 媨J~AoH®c K‚ä Ájh×ñ‹ž jH´\9œTø²²§× YxJ>ûŸbø‚!× ¦ÞÀùÑ5öD†G 4ò4qW{·IWŒ~bóeDƒµ—ؘ*÷É3bô¢D$*S·—/8{®0í­¡ßJ '‘) ÓOŸmú'nG&BÂ8$þe•0¢¼Î°]I~JßèÁ‰ÕÏÞŒ5®™è´ï°º5ãàÃÕvYúɸêǺbnO>Æå"š–:¾õ.£åôâ&Í~]јhÈçÜá¶½QÎ12s2þçͽ(®ƒg…ã!*!óö䳞ŠïÐâ¸õÆ'&É äDRi~nto E.Ójˆn*©Õ&ñ…IÚàÔ Š³5Ì×h%†z<ž¾7®Òí{¥IÌnßÙÏS ºe£§÷h„ÇvvÃ>L.¨M_s÷‘X#>ï%Þ_amÃJ#µ RX]ù„z%õÀ“wÜû1¯šfÚ¨›-Ï ù3(ˆ¥(+¯õ?1#ù‘©‰öˆzØ!ÿ9|n$ÏX­d¬åwXÈ.=jCVrÏSï:õ‹ÊS¥©Ã¢­˜ãiÞlí$DZÝkFWˆ¤y¹!_ Íâ³k™`×"qi¶L°ººlŽHÊ5æ?$¥0ªLdj>€Ú{'”ûsä Þ–׳è|À|n&÷.N¦½´mE¬ïž¨~¦âgâógØÝ×ùÎGâÄBÇùnR8yNIWúö¤“ÕÅV“63óØù%„Š·ÚcÚmÂà}–@?ÄT ’BÊ ÒèSè•S#Nöæ–!Fá@Ó)”;¨Èsœéù`Åë×ÎþÎ¥º½lKÞ×ë`œ,G¶àÆ ð×ÇsbFn pCc±ÚOP…t¯ÀLŸ´Ÿáæ@JWM$° P|o8sLe‹ÆÂŸ>rPÚä0šG@{önHÕ`ŒÈ½XJ´¿F1ö_›%þ÷õäØ@€gŽ7‰¸Ù*,3ï³ûè-±@©ä2ôÔ 'Ø!9·à3¢Ò?o³iéIˆjÐÄ,Êê€xÄÊA·¦³m@ݤÆaršM! .Ñ=ã~IÆKœB¯yˆ£á€Vs±K†—·…hÅ è¯R­ù¬ŒÚ?äSç,V„çÔÑÓ»m‘¶Î­Í@9òëZ^u• Ù* É.ayn¶½Pï×›g‘`0IƒpÙh•Òz™Š½ùÏFfËý ã’~fù­æK†Ñ–É]Jq%$m÷±ÎvKœÜ*µïo`fŽSþN¡x°ãõd`ä9ÛoŸH—»ä?é"|î>^Y8­v«q—÷;¤•fÞßò¤Q¾Û·OTˆù{Ü{9}ýEø d¨Žoœ‹õ;k„oC¥Þ”òøÊs‰_?!@Éçüþ ÞÓæv˜‰p ßrä§XÀ?‘\í²µÀĵ+÷fø+*×7ò9üf×Ïòú`$µ™-‰ªð»®ßñª~ðj¾óDÃ]¬#øV5GØÁUš[_Ϩ<«ømžùÉÖ«Z»Á³ñäN#È_T-o·ŒÌ² QláýÒÜԸ܋ª`¸ÛÐ"ç…Aô,@$x”@ûxKTñZoF†‡bÈäÒY0Ùì—É$2‡šVzðJ8‰‡ÉÜ¡ufx&k' (X‚¤s»¨œ9÷81'5íNUчñ¦¤è"”’³ù8¿u ³XLµJ£*ç0 '¶MÈ-F‚îCÖ°¡EÖµ4‡Md?ÐÌ4¨+q¢¥½`HCÒ‡Êk0À.¼dÇû¾;ÚGÕÂQÆ;d5QZ‹Hf¼Ù„¬©>+Þò~šêM´šqþ¨rκFÍo€ë¾z$QÝÀi:z¶ö?1;%lˆ^+¾i 4žÀ‘ÅÄã­–¶±y‹<ÊA£p†qÊp)ôîéŸt rF ¶&˜¸³ŽLál-¨Äqø[bŠy¼úÍë¿}÷ô¸ú–½™ÐÎC{€ó8ZÖL[;4s9}Eµ»dºTäø8ª ®ÎÍ{Åù>ÃpU›ÔNOP;Õýƒƒ¸ÓxŠé}º=úÒîGCÿ¸03´9-Àk+¦¦¼#ç!kGwE¿Äz×± õÙMÁóWÂub8W7MTuL½î‹¬B“!úÅ™â-þCï©®ìÁpA|G¯{[žTÙÇæ£àæúdˆÄ½–¼ ÓQÈ©\<ÉK7yH•ð(ž\«óˆ‹û–Š1Ð~SI_<]fª Ä׎UÀ6N›½x@™><Œ0zÃû„½÷±’œâiwüzs¦µeµø(hú›£~Y®¼•ŸçÀŸZùBŸʘUEì]ÉÏ~.± P^. ‹-ñ‡ßŽª?»É¡{C? þaÇ([tˆq»^Qå´‚ˆ‡¼c0sÍ ~Ƈ¨H>¼E>cþbÑy>>6¾ä°k…—é4-­,¬‡ë‰çrÁeã-Z7wh¸´cøaneOšJPoßIü“ úî` Òç=®ØÍ|tѸK—iì¯+í>yýb óš§LÖ¼ÎKVƒ.ƒMÇ)•è)£ÎÞ=Hô‰w³ÖÛeî`í‹eÎBÊR¶}ž‡‡c8ùM2¬(©Æ_§Ãó:æÎ·¶™ mTŒíº»,—z€ª1‘å^„ }l†ÌðîÎäR,uïg½w y$ÖÀ4ø’\­–&nÖ’SæeúÊó“Ÿ×Ü*ñ¡Ñ ݧkü¤WPYoEoáYU­ƒV¿D ;ÙD_§‹ s0÷dž?"bh·{ Q7:“y*’@3„c‹ U;Ñcº€r].¢½&‚â¯ó<52IsÚ´2¯EÃ)ô¤¾ôÃ9ÖÓÛûž¢£*ÏTuA·ÇVÞÖÃô}G; ÈgýæÉpÌuÈ&¦r±e g ‚A¢ÅådjV†¡¸óB¦t2d:à\êöóbÔЉÐ'eð2ǰg6>.®5¡Ä_o5†^?0ßtì:*Eúgs©/§™… 4P˜;è"9ÈÍ8ÒLA€q“_:»êÅy!³DßfŽ“Ò{4–xÝ%X Ó ¢ƒ”Ò=ÁÛ:§b‚Л:òô»ÆÚ2Ž~ábQ(öÛNçab$é1¬3–i P4¸Â(àü0â®ÜuÄÄ8’ÙZdÏd§$æG›|Ì ×›JK$$%{ «‹Ê„y=²™eåo5 ^*ܨFÔÿ”Šüî&ù,Í4¦`Ž]³òwO>ê8LKTªNÍÞ¶&“8f‹£ðð:ðÜe¯¤зïuÜaL¿¿7§m¼Êdù>xÏ7*§Š¼“E;=økœŽ:?Õ¸C+z²Ý¿¹jF±+sg SúëŠ:1EyÖöî21Ñï"Q¬úÔŠ‹®ÜÂÆSè­‡/Câ¬Ð³¤gaèq\ßFôè€"É^àtnjrGOÛ¹)FÄ!Dß¼ª†¤YXv>ìû"¿NØŒÇé­#9“³êŽæÔŒ†”]ÜßS&¬)S×#D²a©RF-†ÊÅ ÂL:rÒj8Ê«±7kU/Ì¥6àÃuþÉ{ˆ#ŠFI€0 ²OtuRdÍ¢2l".õExEVÂ<³Ö}{Ò˜Êû?8óþÖÐ.«½m8+.}&¢$?‡Yã³sëÖRý¬ßHŸé~>÷ ;8 ã] GvΘªÂ‰Ü8Ú½wûéq,n}x8<Ö•ÂtšþÇÍb|ÓùLºi ®:Â2–›ÕHèþ¾3@åé&ŽÍOçÃj,êôfÓ·¿W9&™Ñ•_BÏpÙÄO¬åÔ°Œ©bý\2ŒÀ¾Ã3heKxŸæ*yÔi·H’zµ4kÁ»¬_ßó…·ˆz©t…+Á¿úUwg?rø ðT•Þ‹ÍÁ­®B¸B ñä©@‹'ÍÉþ²vÕÔ@ÃG5HâH#„EŽz¹…Ù?Œùmz'˜`£I8óΓÍLqb5ÖRÕtíD!g*äm`Rþ¡´twÖO@ 3u›[ š¯¨%¬í&SeÄ1Rª—lt‚žÑDé*ô×y„”)Mcű“ÝoÙ(ÕÞ¥cSEè}`3½ ØÏv¯çéÎz¸VÞå@eŠu‰²æz;{–=Qò!+QþÖ%³`ÙwODV„ÏŠÁA>¼•¼Y(M“Ã1¢Nõ v- ò»³Q ¤ÍÑb턯“Üð]Ò6ž>‹äÐîØ7gjá׎FÀCÞú@tQ%]{tÿZN<€0°Û1-™zCƒ2@œ @ÜÈk¶\†3¬â7œxpó¾Bâ™ñ‹÷Îø8ÚŒøMÓýpbs!ìxÿv1€ãÀqèÀ{oKÜO'Œ>D6P5ÿRü§â/ººêgü!¹ßãÀ1Å.XM% Z…ƒDÐQFõ̓¯¥F­…Bȧ­“©ÁÉߊzô¸Bòƒ5Äãí6[kѶä-ƒý†± sñN¢²w÷b[ZƒÌÞ)ªÜ^Isó~Píà —[Vušˆçd¥Î0q§úûuÙ á mæFñÿ‚Œ˜GزŸí99N8[MR/¬q—{!h°3Ð2æÍ¨”»AcȈ~¾ãâàRÍú"ì`¦ÅÇÒ‰üÌtÝåö-~XZ*²$‡Þ8DÏó Š9ð6È]ö—cidž-•|—€”ç kýóÑú÷œ»&]j|ê¼|sÑt}È>l³ŠìίÁw¤—¶ÃŸÅ¾t&lf›,5%$ð[e^ñÅ8L\ÅÆ,ü·‚´6!lŽjŸ³RäT"ν¥¡·Æx ôW>æEäoA3Þ›.â÷€„3«±\@¯O6¨As÷ O)N±9g[ãyœa¼™dp9LfÔ^,¨¡ÿÜO ÑáŸý ;ÚEô'¡4D¦IíBЄWÄÞ—69H¸X¹®%Z Ëæ(jÒjèú2tÿ.ȸ‡Ç¬ Ì[91!#Ñ”a´åFåÃðµ=ÑC6b1sìCgÏà] 1‰ôØWºûæ*®– ÙG语׷ϲÅ¿µ.ó7úðó@òÚMé˜Âÿ¥á–ØÇýtõèòòÖ»6"¿ >4¥ûÿ·EоAŸä?t}Çgw4â…gpÿtYyÑíÇîF}I‹~d4â„ö.(KA ÷@½ÕäÒ—û¯ÿúg\¸™C1"ÅΓ®™a ?Ù®½0%vR••ÇzddaþîbHvÚ9Õ#^£Óa¯mÚš–Ùäo¹%~S*ï­Œi% ùíw\A´*Î>¥E¼{Ù±KÄï!h»ŽG´t‘`àab!8»Á›Ëà‹ûNÜq¡­ ~2O\/hý(s½ “5\¿5% ¨>F×y<ÂãÐÈ)4Ñ’{2¥*dVbŠ{]ÖƒÙ Yõ`†HŒÄ4^ôÍŽàaÁãEË YF¨ÎLÑã49Ìýcèé9±#†+  ©ð„„ÑÕÅ&uð\îY¤Ÿ ÅâƒÇÉÍÌîBELìo²5~CÖjeËXA7#9­Éñ˜툵û{FÎÕ?èÜwÜQº*I#…ÏdˆíjÖ¾:ŠnŠì¤îÏ&^ ày6ë6R¤ÁÉIL0‡ª¯!ÉÏNí·¨û{.­YЏ§Ð¥0‰ÆÚ#ÀèÜ]DóKfP˜˜È8´Tm2>û%Ú碜2ÖÚq ŠÞà΀‰Êû@¥DÉ„°7l¶áÓ •÷dùØ‚Ž´SŒn‡÷~óÜh¶o„1ɦí+ŘØÏLø»/ŽQö×N?ûÎþþóÄêÖA.Jè^VÎ-4 ‚Y•¼2Têê¾<ˆôQ«…c’£í Ø#Ÿ±ó%aÎz«!éúìÜÌ‡Ì ½8äM@;+a#X&‰l&Å"†±¡7r¬ÙIôä’×AÍ“¡Gî&1Åç#¦)zS¢ÆŸ,`=ÞÎ[2ZAÁ/s6wãÌš2Ï¢Mu\JýLS†,£‚`ð0R%Q(Cîîiönu¸¤5=­n æ@@ M{äbõF.ð ®î~—g(¬8áÞ ‡¿jÏF'3ɨ‘üH_Ó*)òÄH˜¾ûÑÃEζ„#„#6Ï `³R€Y;C¾V÷ü‰&ÕÔÒ‚õz´øS ¢õn hî¾ÙÍ9qDr&Ú…gåÉ8éÈÀz¬‡à 9!‹mä?ƒißPÒ Í€4Hõ;‚¡¾¤ªMÓÆ/¡6~†¸gªaÉ—cáÅàF×Á—¼‰t~6îÍoZ´*<{°èÅHË5ŠÎŠ‚”Ý„|I‚RF-§cW)€Ã-ù%NiOp1;:pÛ¨_@ )Cÿ/¿‰¯sÑèΆÆ}†o ]i²YË ô ã:Œ-˜² Û;ó(>Þ}-Ab?3¤Á@Òÿëì=€£9NªI¬VD!7oÍ'1mš âòŸqÜ>Ôr¶‚ÛNž8!|Xlî',Â^/åõXb#ŠHÚ$gËöà$9׳;,Ódz8àˆo(?u 6cN2w·ó-¶‘döj¯TÏ·•‹–ìór,žÛLDD¼Ÿ˜xÒ)®[¨‹J‡+ a‘¤~Ò‡ä'ûÌÓ©²âx$;Ò¹l "š{å'¸ß/oÙüÒ¦)¾ñ§¿é.½,ÜÀ—y"ñÁ?à²Öý¦;²”Ö# Qv1MÜÜ=!}û‘¤ïSN6Pd'ê+ÛY‡ù|Ç›õç ‰* ëÌùÀêQ ­L§f¬Va Î5™³^®¶^Fª0£W|; 4”Óè2`ÏE¸c‰EŒ¾AÞ,)Î`s®ëÍ¥ckÍ\ ËõMfŸÓ¶_²ú#+p¡S‡ÉšK›ä˜+¿t×;¥ŽRgëêC€é©€ò¨´OD0xóN´ʧç~„:´„þŒ'[ca>K¤÷wfÚ$BñzhÈ¹ì ŠU.­Áüì3܆Tfš‚VÙ'[ý`6@æšu¹(\Š:5¡ d ‰¥‚¶½ÆFÝ\Xee±°X P€Dæ_*A*ÅO¯š'²0)¢ñõ$˃?q_vtI¢ —Xÿ†$oÞn3úÙª‰Z2vÅ‚ßî…‚wŸ{lÜXwàð‹Ÿ––FÑ‹ÚeR.ý0~ÒpƒW©;0e¦[˜‘±ùмÿÂX#eîú«”³EÛÀù޲%Êî@,$sö ŸT®Ç°^X)ây{sÈ̲ÌNp•G…¤KLZ›õ%]î@™úœ}|«4[R9­šÐSÁ¨ôxq‹3÷‹ûëDçË­¼°ÀûbþÐ>ÔëýK¾~(hxôN0r–L«nÈ$ÃÑ-õ® c¾Õ³pÂ~f’d˜¼xÈL< ^®P Ùüˆ %¥ª’ëùNÊH”“Ù”}Gdõ]—QzÝd¿a5Fe"¹=ÌgRcCÓÐc‰uGòü­#6?¨tÈqš*= ˜ÔΞz­{‘ò¡Ñ€ 4Ä%f%'&gpj…±`öT)ÐBû2؃ҘU^¯?˜;=§ßqâ¢@‡ÁŒ«¤¾ ðÃ1ÔŽîø,é0"*ƒs ªÍåÕIÁ¦˜à`qvm¥œc‡±¹Rê2>Õu0Üͺqlá5¸ÏiÆÁ¿wÔ·ÀLöçsö4ÀžÁëY¶mN"l|&:˜7õË{ŽÐw˜sÛTˆ0ŠPd“òæhÃÓêБª×­:kÇöï{œÄ„!NNjõÌì‚ÃÑ ÏhJ¶j¸òRÒkW–>£´ÒÁ qû,¦2SúwWéÐXF[t@-Õ1Õxm £ÃCâ`r²@•aºpMJà2uº‘fìÅȰ㠞̭S¹íçFaÊ7ý®D`–»‹[‘†¾©2&ÏÚã±Èï>2&Õ=52K¨# òÿÓ>ÅM¼Ëo(¾±Ñ¾øÌ¾tHîÙ~ƒ¹äié÷¯0þ÷•DòïZvƶíQÿ)Måÿ-ß¿u•~xYâ8ÐÚA8äë_„¬«ºÿÿüÓúaâó³5ο¯òFñ3·zäH¼”[°ªŽ½lH3´iÿÖØ\È»òÇ$æ4™DÅ*­ ÝNLœù³¡¼Ö2Äs(éw[žüü=zï¦X°êòqªA±þ&îZåãEϸ‡c6ÒÓº%Cœ?MV*Q•ŸÒKè­$«{`¯Xú ™ua.@¨Ø‚bÖ¨°·èž@â<£0>Ö·süÚðÓРˆl/2CÐà\/ʘ£þ0¼i]—#z&¥ä`Á3/D°Ùy‘„=$wNÉh¤æ~Ré°4ôÖëȤYÆÃòÁB¿¨>\š£BÂj}:g¢óly@Û/ã:„ˆåéþÜ$ê®­Ë>Ç0ÈÉÖÎæ‰ÙSö¦¥Œ×DWhb_*úxt¯ëe8Ò{èãè 8=Iÿ6l"›âµý_ñð½…Éóu'OͦÓî•3€]Yr¼õRo+Ïö’cÁ˜‹ê­ÖWú3ôZÆb_±d‚ûOúlÄ4 ÁE\wRøäÙfãÁ \¯yâæ¾h“ŠäCùˆ(bSbÊ —[r»‡á:=¾QäÚ¸Z°S†Q)!Ãn˜ælL çÐ=ääB6À¬žÇ@*Ô?þ|…ôþò¹H锯<Â_p’ªÏA» c=ͳ ^óg¬A2šÔ˜o²ùaq7œ²8 éw^KŒ~}Ä2ªS‰\¡qí¿`i)Á IcmÊ9<Ðt¬•?>(IåxÁ â ™qnŠûMp7è^fH¸x"°ªä“?hfÐTp¾qË/}yä!µó^ØvÍ)ÑbøSÐq훉-3éó´lÔgŒÛsDŸþØO/»ÒN¡ÕÛþŠôfRâ ýÿMãÅ™ ÙVc¢‰·É AªYH¢qj÷„¸ä¢š¶ ðãþTO FÅÜ»F_œšÅPÉ¡Çg1ÈahÍN(¿ý» á¼W[ªÏs^å) =‚µ*ŸµNñ–Ý‹ › Ê“| ¹”>®èõ U\róŸ³ËŠ‚0¶&Ùˆ²#Õ©MGü†H~Ä(ÿ¸°–!& ²ó–Í‘%MÛS#BöškÜ«ÂÏ¥ïË5œ²^~•“vŠ˜7&LpJ$ÐP‡Fuó­ñ5Z»¯À’lN‚IB·«6&¹ZçN²IP5 Cœk"zS3WLyŠèüWAãäâ`øn^Á8×¼þêMV ¢…¶ºãçGÚÉd-EQçÆÆDÚ»½‚àf»•/…›Æ7<+0÷“_xÿ%¿™lƒgä7h9d7-„.T®)fÍx´‚yKÝUÖ†5/N~¡‹fÎù¶OCŒ8#Ô>øž‚#°Q¤‹m!;ßó^²©þ.¬0¥Xm‚”LÃé°ÜÙËŠÒRNIÛ·](ˆ¼ö D Su8@‚ß³ÊY ùt]L?xç{)ï ÚX Múÿ·ìèD-|Cໟá{v7žN8|ŒÍO5«´¸+\ÞvAtQçâF¯þu‡[îA{³´£aî ²_—bë”i/§+3å¼£Wq¯N•ë¶„ò¡6ûx}JÇÿ¨UfÌý¡ärÍÎFã¶Ñ}åÛÕÿ1A‰ DPÃQœçDRh-é ×fì·ÐÞMT)d ¶R-¢Æ>oÊ)«ÖP;bÀ鋟?FK¤‰PìŠÒµ°8ï^ÔQiK;FwM sÚ¡úøe‹©™‘zQ”é³£hôŠ{k6éߤ·7íÍ,<;.›m,À#èÿ‹ãN!ç¶Ÿ’Ô;ô°d½c.à¦7¸Øä¡Ý”ÓYNŠ˜»$ü#0û&feo¥©Ì³ãfHTk)‹¯Ÿ7¿•!ÄnÀ¶ŠŽðׂdï¯êŸ<©Ù’ +ÚÙ²¯ìÆŠ Nˆ#þǬ2eöv&ºïµ ÿfÑy:e9™ÆïƒªùÑ……¾ò›hö§‘l >zÆo|ý~fÓ&ó°­G>2İÏT÷ÌÆY †Ÿ–ù&ç@1wM#¬ÐôÅМ˜ÒÈF&éAËnû s/€˜–ÑGÛíîÇ”HZvlÇ ÒœÏÔ›Ïßp‚,éƒôè‡ÀÈ`wtÖ}Îé嬤³.v$†ƒƒš2af²hù¹¥³gÞÝ|°eòU=Y&Ú1ÊŸæ$äw&„*´•+Qó¥ß[Ö‡m•·ºp§˜ šdÔêAi8™¤Õ0BAôV½×ûÌNB‘:†Œ…Ù"†24’ÛÐä†+)ò#9ñ0dÀŠX´pŸZq™0qý÷õoàÝûèq*˜Å鲩†‘bõÙ&¯ÀéþؼóG«Êhz¢ÿ*’îü­¯^‡á’¿M€ }uMæ/^Ü\Sr_“íí š!Ö~àH¼Ehc²»eŠ+$h¶(L€ºJ¬S¼ºC¸à«Sƒ‰K<PLÐ<©¢ÝƒUÇܘBÞˆ'ñÑu6KÞMX‰å­Ž#¿k׿W‹ìè4`’J’‡õ¶• ¥kfyºáê{WfAPLǵ†.Ò<õÀ¯Á‹¹3|O(T oú+î­µ£CùGÃÅ`kaP»ûÆ…ü®h§œ+³=’Âq†»nÜ`ešç£J"<Ù†âÅ…4s˜£Yy'*€¢)'ÚÆp ãT5;潚GWT ä8½>*ìÉ2mu_š#}|AÉÓ5)Ü‘¤¹‰A¸nÖÊ ™4åCð˜&Æ£7œKÑhò\}Â2·èö\Ó8ÉEeÈlÇ©YÄõl¾ƒž¼Cx„Kk¸2ßBvP œ÷02^MÚ9ÞÕFõ§/1}zJ¦2/8@–°L~-º×¢–ˆ9ÿÊ¿ÉPûÇ )A€QÂôåò‹irœ²SYú×w9dþÖi…27ž§zãè”ØÖH‘/3Œèi® ?~Ðø•6WqüÀõÇœEþŽfüW?&Þý.ÆØíw>±ÚÖbôfW§º}#2Í‘‘u ¿öíê‰Í"k;ôB¦î7[1;$o©`*žI{°Ïóp•k׌jUŸÒ·q±wÖÈ÷Ìéãm­ý³U„¨¥H_Wc/L;˜Á¬R´ïaF.Çä7›§|{çâ«×¾Sž§g×ÛÄÓ—g¶Q˜ìe{h/ÍdÜnB<Ë5Á—ðN@Î!ŠÓ]ƒT]ÊÃÅ·¡¿ÎÈÑ'q@k,˜!4:¿r𢕽Aytð®ggS©eík\­¯ ­˜‚”–3Dæ`–é‹#L@;6ݦlɹÞ-ÆBµ5íÂÏÓŠ’ÏE |Ù›dÄÛ]f^£4Fˆ6¥µŽ¡)tUŸÍ*cP‰ì,¡ ‡% ûÓee:§Š4½L†!]…î݆a6u ¦GV¸£¥Ï,´‹h[¾Ú¸eÚ>ðÚ?ÛA~Êú;$ êÚtŒr 4¢Ë®9Ÿad‹Ëü°8UÈâ´jkÔÎܲ-EÝ› ¸RÓyuOôÿdkgð0¦ôýS¬ 9‘-HS‹c•K`Và;ð¡ªϵÒKI»EmAᄐ߱|x¢ý1jEõ[~~|¼Bt(‚P4ÌñÍ[Eu&†"ÿP«å°*Ò7?]Tåôg9'Ì<6r ±2XhžâóNr»Xöi°ÒOšF*ÜÎröωìV§Ö¡ÈZÃîÉpßRZ“ÒT>®ôfü’XI$2ÜP»š¨ã€$‰4VeLt*uØKx>ÓO€þæ‚"½¦7Å1ï3ÓlÑì ªxbð†ä±>6qlNµ£óׯ qéé²á$;è=øA€Ê¢ÿó´ /I®ß: ã*äÞùAÃaŸ$à ïn:ÞEE'ñúð |‡`ÿƒíþÓÕëCD¾U†¥w+ß3=ÝfÆ2¢g‹…t"’›M0¢Z M#B4ðÃØ·Gxº=ôOn}@T©ŒzØ÷÷™¡V~¡ÿœ°ùè€ã‰"·G‰ XAŠü&Y„¯Áld’ç]»N›48NqeNü»ªŒ{¢åKNºljyqgØ`Mº “)3^œ°ìÞÖÿ"“¾¿“ Ú‹S¶Dð6ßmq³x~ y˜76ë)2`Ep’m9Õ9T4æÉ¡£=ÀÂA‡Ìu à`>«æ‚µþ‹˜ ÇÝîÍ"ÅÌH„o•ˆZBa|²½žŒ¦äñER†ö³%Ì«¦{èÚ@°7Š*kúÚ™‰§ÃèÖw\Óöš¦¼IkÆbÄ«ÃX« ká±x*‰„íT¦GlŸÜœ’+1Ž^VŒ‰ë.ô;FÁMO0p´¯_$æèR—ã¿~ø<ÃØäµÿŽ×Û…wkÔ3ÕÀ{€a;9}·/¸ÿ¥”séÿ Ñ´.¡výŒ1‘¶«U€ºöñëÎKÚÌ4e{Ørü#ðRøø/Ž¡Þ#ÑšÍZ47s¿¡\B„sÙµFÂc¥‰‘ä^*ãÆ\ýlhN¬¯Ø³Þæí.”#§ùÁ`›Ãϰ­r“f¶ÊØ]L÷ºpÈ9ûwM¯[öOÍL7¢â“CÞh„Žgyâ Wþm8‡ù0ê{-Œ¨1þ‘¡žíµ!+£QÚßÁ/—šX§a÷i^0jµðÊ$¹‹_VÚÜMœE±ªV"—Z½Œ»zîWO«?ëšš5–Å ·FÜýÅ7I¡Bð+_¦è¢§¿•WW˜Š"ŸwRþµ‘‰û«}ÃJ9œ€Òó'õ“Âû91¿c+Æ5>?ùhíªHˆþ!e7³¦kµ’ûoU(гb‚;ãÃÛ3FsV·'ñˆD1˜–·IO>8]7ìx"}íñFÃËÀ±6ŽLÎ¸ÓØ·¨óA‡Ÿºp™ÉŸXB“hæ¢BŸÃO—åB‰îÆ (Wú*hâð85¨æ_oå«¿þÒ/…:ns.¤çlðäüN+$,úL(?¨Û„mg²wð±eø´••ˆU·´ »vŒŠâ ’­M h¹I½Ïcp?¸*94ƒèFí$'s¤YÛ÷™ašd茻VC)…õ·2Ï"n2¥K¢)&‚†o²^¸V³wŸ˜˜•°Ú¹÷WÂlÎ‡Ø»Š§æ%;ÿ„Êš;|Ä{\†iCf˜³VÚS°8ê–äl‹ÑƒÌ< ˜#à × pÔ½ ðýê8ªcŒ!ŠÇO0ÕV/´ô¹ ¬ä|ÇIñsÉæRP¨ƒé½êúœu–Áá/ÑGàldŠ÷ÀKà¾h¸œÈ1·›Lï©zMÐs)#µùA‘´”¦’Eü€CÄ!È=ÑÅ”ˆcÒóü4å6À8Sàé2j€j5\#-ÂÌùÒ¢R!a´œí çœÜè/B33)@­ïwö78»Ì^ºH?¬\O8£u¿´—Ë3açFÜ„«@ŒÂä+t nË…j‚Mõ,OMõ.Íç]97é)CL¯çÃÆÁϫΥ±§Ðï‹ÁxœZbXà€«ò©9©.!f·ïȶz÷#ÿqÀÉ(!’N±ý.»àþxAZÓÙN†m<:' 7:ƒNK(¤™©w²o“%X6ÓÖ¹‡z‘LÅ«GãjàIèfÖÆÚ´©õj¢jÍgÐ( µ”v —eÍ0õé LÊÉ`yì1ÚØ»½~+V½7+¨‘—_²æ--^VZLé>}þÔpû}U½o…‚:ë#gê»bF­^lÍFýÔz ›ž}'y÷-²‘XôNÒ­cSÉi«@½j ¤ÚDšê„1Ê;P$õ™ÿ!ºùМ#4lëóÄ5šATE½ÍE§zeúó´2„¦.C~Çâ]W¢¤r’ÓìÚ=` ì©8mšh&Q™Æ Û{¦ñµz•9#Š£Üªæ‰zÌ´_i2­üf¬Ì{få%%CÎb@šP5c;U:ùSEçaÂlD÷ÔûâhÿÎåh؆ÅÅÂÐð1Àºåˆc¯ÑrsïŸ}eÓid¬»†¶¸Eo"øp 1ïHT}¹ñü¬N r«ÍB9+#[œÊ?™ ³ÌàAAö+k@!l+nü¢»SB<è[ÀÙ«§©±á'3²3YÂD¤ýÞÏÅÄf—¦>v™"uK˜Nè/—VNçüÀÙ·dŠÇõ¥ŽÆ­¨2¢T,0û3õ!Ôn0)èÔµG§›«¥÷ÂÂÊmâ%Ÿž‘4ÔðY×Ñ ›ÌÔe$íNþÙ™k¾8±tÜ葊Ð55:!éÖ73˜0": R³ "Uô/0URFRq9 *·ÇW1ød ÿ}ý„6¤?gh4îÁø_èpl7Ad®Î[:tï‘·šT!·B2 ræ—êÏ×8Tó`¬Fc?.~ܤgèŠ.²9Ox$Ž^ƒÓd¦éóK´ø%’íŸåÔ´Ð}OWÛhØV-k4_ÕaˆÊÃ;“äé7t>×móe'l…ŠOæF8˜ºýãrƜѪgac§À`®ÊôI~(_@‚̵éVbæÁåQâXßÉ}Á”ÚŸz‰iû à‘!r2¨~áݫ݆¸ñ6l·óÓo\ä^h){6‚’z‚i¬<¾ü á7[Û+“ùèüÂÀ-ú«¾>±¹K²÷´÷îðo<P†ˆµÿ·?·¤¯°õ¼*cã~ãÀ›7ü;oÚŽú) iµ@€ç™^ý¾…S ÚŒ1@£;¿Èàcúöݱëø\ŧž Bëm¦sò_’†iwô):óü­Q ¹þä`Xnàç̧SìÝü©Ü^¨ªgg!-%S¹ˆ²' $ŸÐêgº`Ã"M{Ó8±,g-|2ö!‚c„ªêÞ.(o„ÁôCß><¸×·èV¾O Bk-Oº‡ÚèÜ_¼vÙûŠ[IÁõðÁLèH倈¨¶ Rj}fÈ´È£oÓn( ‚ÀјšT´÷Þc›Èžܳ¿“œë •µÜ3¦‘gØ:BS¬Œ/ËÏFôQL™h™Ë—±é˶yP»åñ ,Ö ™œ¤ª ߘbæ‚õ´Š y´ÖÈ3 J:Ÿ-˜€[9öè›è#¬rˆ¨ÉNs;PçX_Ú/Z&[é@3'Ǽ“^ºÂÎ ,#wmãj¨ …á8îL_}ç~ÄÅóõÓäˆjÂÒ.•ÁN‹žcC¾æzýämúð^÷W²üyPEüs¹ýq9·ÿ«ë-âvCV–21Ìš¡žp¶? …iŸŽyŒmvBjò÷“!Ycªì'¬è1âkeüjóCL†'æºÍ9i“\î|½;s$Õ ›x„¨ãõt%  Ì0äE¯¡+ž/±è%“ H.ò|›f¢µš”iÓCn$a2¸jHɳm“°J²µÆ}’pO!•½³5&Ot‘)ñ{UV©ÝÈ1–´IY¥!.ꯔtCrðg±ëâ›n|ÆÃ÷+ùý«/âð'?ÂCØøµðÎ'±˜áŒÜ¹‡îf>º`,,,?ñ|[=òÆ3=DË©,C¼÷hY”š¶¤Mž+¶Q|>í¯ôÊô|3“ Nêøcz÷¯E_ÞQ$€ÊÇr~"ëíà¶Md2 f#Ê€ª@댅×Ù¶Ù÷´;Çé Åêg®èüf¤°O’Ïä›m7¯0òå|7£­â ¿¸2€5Ñ m~=Kï'#M O½п¯_ûõû9›ŒõsÔËïìÄGÏ­Qö“—­ïŸa…5‚õ¿6<å¶96Ô$4\]ç°‚]¡i ØjŒÁ2%‘ôÔ ©LÖ u³¡ Ή4ç¾3§Ð¨Zûf&b¨Þ»® ¢Èõlq‰FMüžsèyÚ9¨Ô$Ô£»7˜¡=ଆ„6Y¡^éFÑi¾ XߺÏCÎe[Ub˜^[‡»ñ„e<4RY£W#]ñ©ð¬mì~í âc¦>^/&,ó¯\º÷½–ÝÐþoÞræ”\âGphõÔ[gsÞÍC/eè«ê‘GçÄÉ^Ä—¼z\4; µ°†9¶"ö0¥Êô;kÏ3*~4gBQÒz#GÉÌ;%".£q´wqU¿ÅpKÅaBgC9µ÷|Þô‘TM/Cˆ‹x¨œÓZ[¨Ê¤ÚD 1b,óSЀU¢Bkiµ;ößÚ¶ò#ž+âŠà7¿ßª”pî°IR¥×Õ+Ó—öc5±D“—NöhZ^ß/fˆšžýÍ hVzxè[˜›cñˆº«B‡€ØŠÌÙš9H±whÍÌû^çÝÑîÀçt6xê‘ÖsÔ‹Âqê±ù˜‹7WJLA"ÙGE].ê6ÕãŽÇî":¿AÜCI5¥C+ÁFoª®Â&$4’WxëpÙ9q€Ç]”êæªhüpÃeN¢ãê#I~ÐLaÚ`g:ÙzmìÝMÓßàêGiíÌlM .‰ž^D{çÙCcR°xObw ™:nND5€‘q`XÔ„6§ ù-º¡s0¶™þ'43ìÈw0ämÛÜ D£'F¶\Ü.wb@ºèŠÛú‚Ù¢•ï%­Ö•ß?Ah f í¯è2‘J°j¼óii&‹2ù.@Þh9&ŒÔ.€VÖ”ÁÅ’¦;@#Já ¿tŸ þ6‚¯Wr¢×ÍŸ¬öóÏ å³7m»—÷ö“æV¸[×»©`åb´vB¿FT½µLëÌü«ÙŒD¢]yý‚†x¢_íjvJËÓÌæä‰ÿ«Åƒ¬9R­Óž[ãß­BN£‘E›"ö‚ ˜™7ç€Â@¶mó&A„´acNS¦^6ËZ¦×Ó†Ù8p%ÃÎVM´STÊŸ¡é^¾ `»Kr]7˜-±Šs/x ÐÇbEÓérKÄÂúMñ•5ãi,(ÒÝI£áž566˜½s£ž€¨ŽÏ½lošö46bÖц_ t¬1 àß´#Û®‡!Ò]$óE]ÜÃÎ-ݤ¨Wû’Í ù>o¢f­…CÆ¢R¸½…¦žM%Ör…âlÜ÷«|çoÉ>’`FVý» ìØ,¹½ûk6®ù“èóí3ølõ¾×Ëùøªø)þÌü Ö¿ý¸~êÀ¢g𑇒áÈ©5æã p³ÙÖKÅ׌Ï|gMpíÑž4Ή¶Žâ–™YaßèÒ´icÖû‘ ­Dew'¢×Àm0Ìå—–)¬Jwв<³ O2¹~Áåò‡’o±ûOó9Âà=־ᣉè¼RÁn»#O'–ÆîŽð-ùИ+úQÿÿ6ÞóÃÝ6!¥ÁÞXä®”—Ðû(w¬Ø·‡àò'Â*°œ¡ŒÁb«ÈÞîΦK¤ÕV 6Ó¼¶Ã“9KšIWÕÉÛIöÛ͛ӂ°‘Äd?£—v‚xÀ`»ô=šôâÆ#n6“û뜜ü¹ÈÁÌ> 2êÜY7Áô–¡¨TÍ[“º•3‹eƒ»M[Y³½(¨ºØh PóîŒÔ‚ïð¯Yß×m˜œ:ªŒŽÿEÕìýWŽ@qq~°›R¼õ6¾éŽeèÿã3ó«éNi2ñÆu¾)ú? Rpù…$bÇcû—èÉ xó½)¥¾Ž¾NãG„éñpkâä.wü 'iž´þY¢ó7/¨Ý ›bÆù^ä××Ç.,ÆBØí³£‹![…7·u#³L[¿ø®(Ç{®ß¾¿û=þåxåƒeµ‘¿1ðšúÛi8½Nþº÷•`y¼ÑžŸê=ɈCÒ î @Üþ° ðÐA=HÔ³€éµà:ø1˜ó.œÈ–3ÖÔ3AõWF~ìzè. Ð(Æè gS±·#¦.­è4-§oþÐ|{#eÄ Ôõœéû‰£Ø4拘ŒÎ –ާ™«×tæ:JBÚ IH"ä +Ò ÀØYEžõ˜VœÑUÈ8Rpˆ¡PÜÉtM¹Ó.gò‰ž”wH<ØNϱ¿š¤Ï²iØív«VÙcáÎðY¿ùáÞŸá…¹¸”nô“Ë#¥æ=d¶éÓöºÞc&á†Þ+bŒÉÓ>¦àʉÐZMj3]7ó áÉ~oL«›ô?Ûz÷ ê“ClŽç?ÍÍ’9Öõ}hµßš™SÀ@þÑÅÙ{R×rTØ€IØcZѹ«³l˜AÎ(j‘´dâæš¿˜ï¯604glœÙqB¿“È‘Db§ÓÁC9³Sô0UK¼ÙÆî—tÐèGÁD½›¡mÊ7$ó»“GY¦G3-‚ÓšÓþvkdmsøs‚p&©K‡7ËÖ´kÌŸ’cXs6îÆjጵ¬FÚ7ŸíÝM‹Ñ@‘3Q”61ÜÔ$Y ,逳”´&HÏEÿ æk…1aB´áöÂf1Ld_Üp³æ¤©Ø/Üȹ7ó³¾ÕîMDÀÂâQ¢gýÄñ¤Ó¯*YÄ=¸ób· $S…òJÎe­†_ÜUÍ}«¥½\ò.)-Ú)_UÂ; ‰!³Â¹ë¡¥Vå-ÎzV(˜ó½ßX¥ñ³÷‹u#M›É‹aI¥(LS{fÄï59šw™$‹C„j0Î ó‰5›Ó"tJšèG4èiu¼XEû63Ä1–ÿ7®úú‰ü0º7+R? <Ò•N&¢RYD’€³t •WW³d¢I+/Ëìë) šLŸCž{›]µ¨ÜÓ£-Ò»®Šè|+T>xÉ7£H‘§WÃN§ÙˆÙØP ™$žA~b ¼?D$³Ž‚;d-†ÕÈo4îÙiÀC.ûÜ$§Öæ_Ï|kuÇŒoÁ¾N`̼#Td4Œ¿ÖÔÂý?Ѳ3êÏ62|¥#ù}ÚD @ˆ.Ã|”¸'âúŸ´aGÑb€Áÿ祽m†yñ6 ¦O™M¿CD»/¥¼2å ¤OùD¤—Ê!™‚ß\º&1‡„'51óD -Ñ[ð;•‰ ÷#Àº_n‡ð7`‹süT$XÇu&‡Õ¦åHe$éEìà¿ÌiI,>*—‡ #Û4J4uõ žžãæcÔj‘‹WhíþÑ`šÿwÙP:6Çq B±]A¹ŸÙ>ÑEWÒ?¥HP8›s<VOÄ] Ì8*\Ï£G+‚˜dSÍ6%`oÇÛÄ¡¶SÙüsiž×?B?bÈÕö Vr:Mékl3ca|dZ7,rêe¥ÉÎXÞyó³Msx"Ö1/yÑÑu>^²¿-˜ù2·ÇË÷ì4±­…,™¢´Ñ:Õ@ÒqÕ!ιΙ½ʼ]§ñÓÞV)} ¾K 9à°>ˆ_K®ð²]5Q§Ê5a«8Ì^ˆ2/›Ô¸—>Ì(Á‹ 7+@+m:>s7KÐêWŒLr 8•-‰ÞM=KÙÙÓ ³vy(¬ý< Èåêx“½ ºXra‚À:Õ0»7OÚvŸŸäÞtè–H×û öw#ñŽÈõgdiÎ>GÔ_K-áæ3ðVP—ÓÙ2üý[eR? ãºc«÷¬¨µì%lhbpHýÅ ñjÕ4Váfg ö¸s¡ëý£ ŒŸdìT‘j·¡£O‚>]0'0§§é´à¤©q©/ÐÅVyDÉiœ àx5±|ëGº&¼vSúL¥pó=9K¨¢S~WÀÄ€‰>lMËTC‹Ƕ¦,°”e»4ÇJ‹‰ŠÀÞŠt‰eQâÌJg› 6|ë sw¢èÂíþzMfyÕûç^ääÇÂ9Éàñ¹c$ã¾÷úï•›¢u̲ßÕo-5ŒÂ»ñ“x¦>ø÷|í4‡~¾_Ó¿¯?åËá¶$ÝJÏ]¦¿Uoçw~"STçw¾߈î>«ºþ‚UÂÛŽÂOqY-ü'Ñ):ß>½Ôo=Y²,óïœN’ÅÝåQòlja±}Ü™ôã'?­¼ÞG·¦Á=~~Ð'¤¿ä mLüþóàFŸ.ãõFmÇò`33¹õ ðë0m˜§ØÐín>D˜ilŽ‘o5‰¬®t@›5 p~>sBêúþqD®"9Êñ§æÿ BÞl™oáe@‹Žo[U\CÖ[Iü£1œ Œ©ÌY®ò–¨ÃŒ0ŒÌ‘éo§tôý/â Rõ-—ÖöèUnë.ÖhD†Õܯ3@¤Û1þ2-î?4éé“BiÈž²(Ù‚sT«ØÓ¬r§Š:Í®õÒ/¢·ÃØgî§X~k­µóäìS_r9âŸE?É6ñ4Æ_v™®×–nníïÎ\ IÜ['§ÅŒ¶Ú6§%ãÃÕnSpN]¶S0v˜Y«ŽÈ_×p¼f¬ÚäþO¡›É“Ÿè0†<™a€ÛÇçexÂij]G^º?W/ôº|JËßœrýoÇ‚@t°mð´(w€Á_Î@ìþß¼ó¥§að%g@2«f>Å<îLWlFïTnùÕq“0"Ð¥*2 >';ú0 tbIbâ°J}ïkö‡Œ-BäAÀHr0ê>£3Is¾Ö]‡ãR[Âå#Ò}Ž`aÂú4è™+&¤`]B)£FÚ¡ çqmFbÒ”³7ØÀ ‹ÊE˜²”@Ù Ï !½oÉÔ©7‰ƒ5Š0§S\Ppƒ¿ÐŠG#õ”¶ÃãÆ±"Xƒ[×ã!ïä~ çañŒÕ”¬nÁÂ=ùw‡ë© ô[uå*ßH4ýY;I6Ñ.)`™°”ÁÊ¢K %ì>ª²ÅãLò²ëR"@¦çîpØ`Â)© Ê óVŒŸ}ŠG#ãEm»Ì\|Ëâ2~3ez¦òGŠ8·Rø(%%ïòÈÛ’wïFœSpúJ' ŸüpC¶ÅK»NÜú_)Ü> ׺җUöIhìÅÅiP.ÜÒÓÕo:lki V[¡êS@sîóš<²{] îš(Ð\œ!“ÁbfâõjõÊŽr§yÜ);^²¤§ÞgÊ6É}“¹…[Ñ?‘œœOqdœscmªåY¹5SZ¹¤0ÈÞÂh9&¥áCÀwH_ÑÒM­ì¡ž¼K¯òT½CÞþ Ñyõx€Ÿ8ÅCŸ!E5áq¯gJæ³ÁÌÒ¼Y”g§X¹œÆ k÷f²ãË.t åöB—kÏ!rQ‹•þuìþwýwvŠª—¹àÜEªý•žCDTß’yÒ·?7gˆßŽu{%ÁK°â+ý’u©cÿ?­ÚƒT9²0(4 KÁmÊEö~ƒÏCÜä =³»Ü.ýwèkïT7„J›Ôpkˆ.;ä5¬ò;æ›…× BÂÍ0ý—øj^Èë,2ðøÈaÏ“ ~ü~VßoóÍö>#ë6-íbsêàæ­\`#×[eºO¿x!TӈȚ–nV`5ë Éa.ÎÃi3:‘2æ”|„ŽÐ8«¬l<œv̲§ñš™2¤+JxõR©Ù`#óÝÁÿ.µÁ¾êU6烞ùÔk À˜r;ódšexÉPS¸Öt&Tê<˜ z‡¶d‡8uI’ª±moS³böCôMN«¼i°šÎçªq›Ÿb˜óáØÉÊ!S._²Œ&O[Šb¡Q;ï¡s++¼;\¦}çu48† qVœÐkRz9l«Fh¶:í`T ,—C(ý¦íxÑN@0ãÈlI‘eͪV…Âhv`[SoÕÀâlÉŸÒÛ^åÿFÇüF­=7ŸB"%3a 4¨L?$îÁFLËóûÇíÅ5>K |“™U髱ôÚ}§¶Òðk´§œ†Î}‹ö™t›§Ë¢Ç×´}ªÏ[<#~|1,PžÉùÊ cc«ìJ}¹8êÿ,Dx6Û¶…„€"%?_iÿ¬Áǧ7D?ijÔœ˜ÿŠ’oío÷ºß ÉÇlQ }ÆÓdÁâ„–’‘V¿«§Û&ìžQ—WçðVa7£¤Á&@Šš…@·.oÚâ <Ÿ6:’Á˜o½ÕÖæ1N13ÿúö‘–?Mth™ŠÑù!)» †v7‘dèªò]›¡û+ÉÕO‚ùá&™”‰“á¢"ÿÀ0œgÖ‰ol×h¾qC§˜Ðñ[+üÇìÁú˜ëxþ¦ ì^œÛôcŽ_·Öj_¾èeÙÒÌ³Æ®Š©Aoܦ̒Ἢb':Gõf¾WÓ§m!ú׿^k_£A‰ÎZTje^Ï*ôqI9ÐcÌÝŽ¦“åi$g ’ÝÑáý!S0œi¦xÍOs‘_cÊn4fž¥ “ÊÃ4“ý£7 W° «vK&3®\|,$)0c<òÕ±ÒÉd-“~Áj‰§G㿯P{,ÏÌí&‡Çz9­]0~ÚëàƒŸè ÆÌÁögJ•¡1ä¶MCXÓš©JIJ)Õ’9¯ äH»ÃòsãU£MéÁ˜º¤ ^~%l¦›É¸<&Åàkü!ØÏé¸ÒÑ&ÝýJÍ•bî”Öòz@-/®9'gšÓzÑ¢ºÆRr^·Ю"gE`—ü;8 ÀÇÁJZq8ÛHܶ\[‹ªÄà,›VȦÈ7\/ˆÜª=å)x|¨áºSƒ0ì8ÆrƒÝ⽘øh›@ŸýãFy7—éñFâ¾Ûêüêø%—n"ŸBêТ­ÐöO//çû'Þ·gÇPÑ­WÍÿr‘_Xá? øøU_ßjðɬÿ6ô¿¯¿3µö=G俯ÿjÐ~ç—ÎïY™WxþæþØ«û¶† ŸVFC×ß¿À/?½LU“Xÿà‹*Ðëß®nÕù€™¶?ý¡8ð¹ªRÒ¦lBFûCó–R§ùvMßaúy˜áaƒ®‡ þ%ŒC~‘sD·9à¦cCDy´„\é^Јܰ95\¶ÖN:Ȱò Íð 5ºjçõ;\GØ I]F vÙ;mE‡šÂlaÉõ:×ÀˆvàœFsat“S ž×|™irf^´S±Ý¯IòµÝIy‘²Í1íâx8˜¨À#f¿—)уF)£$˜è„,¡bÜ@ýDV2¥·µ#Û±ÞØÍšæ9“ù†óB‹˜¶4Ñç5ø‚Aµóò…éüX@Nu‚Gz€gk‡6ô»jšDЉ^‹Í‰¹;#³!ðJú³8ÍžÇ4˜ÁÙŽ9õÙ²Ùvû×›ŽvmVvÑ“ù”yñö}üçì© ËÉù‹ËAÀÉœïÒ@×f?m Nø¡§Òud ·}ì¡@~g$éj‹œ¼Bã`E2”ºžäÅ{nîüN-{ ›–¿ÜèY0•º9›îÀöžP¹à\FåH9ù,+må²þºÚ937‰„̆F‹–ø0^')}jP2ºüˆsÿ‰}$ês2ŽÕ)áÓÖ #Ž:m0£ÝB÷Ìs`•ÿXóP< ¹û¤®¿¸…òGˆÎ;iG߸ÍÉ"i$ ßúVN§†ËÃ%‘õ`'mV௧˜/adç ³ :Ð\ÝhÐÉMˆ8 !ÓªEÈâ¥M,2²vÑ\b\ÍηêwÃ.[0´í€Œìc:1}ûFçÕÇÖ áAïO¥“>moÿs¿pƒü|ª?µÅ?q´õ6µÅ¡~oiá¤×^•(V·3ÏHU^¦ÕõÃøs4#ÿN/6á0`£Tû©‹p+mzî¶SŸ‡€˜˜_2¥–ÊŸüºƒkõVžIûZ_| ê¯Ç¡ž"£Fïlâ*z©‚yºT)2Ò=M•úÇJäáæÖ'¹ßšaŒùlŒ±Y³;ÜÉ–/æRJ(úñ—ÔbæI0·`TÚ*K¢ý êÌk›lƒ±\¿a`Ž6×mÎ -PðØÒY×.åÔÙU}!{°PÜ5ÂM¦EfŸ?nô–'=ŒËâ”n+þ`5F³«6"±rOX¡Hš•J™ÅD‚ªÆüóU]Ħ ¾^·—Õ£OÕU Êo>ŒcÑpŸåÂÜó,Ç §E†TÔf˵5 Ì^†uÉ]iGž¥×™ ¦¦g’d§ÖfjyÃδÂõÓ˜kZ¸â6Ó ›?Êàφaþ0d³`Lk¢È~V5?9ô÷ó–´²GÀDå à´e2{‹^ä\æ2H=n› •qÈ3Dy#·["/îÕÈLù)ަÀý¾†[“} d¯á#ÁÔMÃq\í04Úx)¸Y%¹é#¥K|[@€¹†ñÿì]ۂ㸎#²ýÿ|Œ}°%Ér*Õ·éÚÙ9=ÕUIlK ‚@XQR;ž*ÿ 4Îu ÝTãPûQžÏ¡ÓNÕ‘’–J¬j`wBæ´û@¬Ä]_/×û%¼(|'À†€>+î]©ý?í ŒØ[2j¾Bÿ)FN°®çẾýBÍU QJ¾2Ÿò9Ìö*ÊA&z4|çü»Dç7ê±øáǧ+Õ£±b‡JBZ‡ýlô;Î`}¯Út2âÕM’²eूãžÌcä‰4‘[81âX,׆h“_YÒx±b>ZT˜¹*Ô(h€ÿ¸¨çõ‘áÍx~E’°r!ª=´Ó˜[´ª]ψÂ2¤3¾µfÞ¯p³3†žks ߌf‡)á¨*r»NòË-ЀÍQ"GåOªú(¢ƒøtQÃ;óµ(ÂZ(ò ‡ž/¸§9#ßF:æ«keèÁ«È–ÕJÓà´€ˆ£Yeé¹8„|†>x[qódê1ÍÜdi[R¸ÿ¾þ´FƬyJNi9_\|÷Óèω¶Ënöw‘ñnMåçý ××ì¥in¤Ñ5k/Ž"¢dœy¡X$.ÂAÓnßWô·Þf}ùÏØüuÙqc׉ðÂлõxèÝÙô¬TSé{-zÙiϯ×ù›/)š»Ý ä»ËÅãéJsx-,TtœÕY§Ã¹ x‰ú?>¹u¸µÙ+šwöslåâ ¦ò~Ÿ=S¸a°¤õÔÞ«”ø5P9À-ù¼[Xr"±ª¾c±Oì¿*fEùí;}' ¸c§þ¿Š þË À ÇéÿLò‰úÿïð~áçüîÐ,ó(Ü—ôÿ͘­ v”æï(^«Øòü<Øþþçï Rm„D´èùóâöÆÅçÉì5ßÄ,Õ_ùBÌ/êÇ·ì¼,\å“í vÞ²bUlÄëw—¾j¶”õ×ô±yï° ÊÑT—±)w»Ko=¯ö0›ÄN&5ùëŽÉ Í•¼îµÎGÍyÔί¹3Ä Jµrè=Ó—!~v1‚XÖšh‹¦-tÿ‚CýºNô3†XQj ©˜=YÄ‹|+-_?3õl†˜ca´ÎÀ ¹NÐ.}hذä”6 ”¦ën=ªv¸j¿)hE7 ¨Òç*Œ+Ü­L?¨ägú_nxŸ û:  =M£³FˆÂAÓ§Öb®êÞŠƒ™Ùq¨˜}¹ 'š]ôG{Yµýb@¶Å=/ÎCÒúÖé‚<ðÂ׆a¦ õ±£÷ð\ÞG”Õ’q¡HáQ`+f } DÏáï%’\’¬¯½E†èˆ9»’Îòo®\ ímÓC8ÑŒ­ŽâaPšÓPñ´Ý+¸½^æävÌëá4=¨4Œ ¬«½bžéd§P{¢må“ÏŽá«DŒÆüΠТm¶!ÓhÁÆ„çmêÚLÑlsëÒë…EÁ»Àâ']uìâäÒN¿^7^‘rÎ>'Ÿ¶ÍY#œ7ýœ·(„œœ(^nfë˜%Ò¾.Ô±M t•îãÀ¡’5þŽƒÒŸg*#¢Úýù߯ñyÚ­?b 5 \Ä\ráƒ{f%¢†¹ƒqèE<„È&On˜ÿÆÕîvÖDw¥‰ŸšŒg|B€j¤Ý_¿ËzÀ_i¡ 2iÄÕtõBVe2Îèg°jŽ ÿe¤ƒÊþaêgb.öõzlCVÏ;| ¦æsÎx=c"g´f'°¿·ƒ{Z‡¶(ÆSIã©r¾áð6'J±wâ$'Ë”“÷DøßÂQ0n3†„†&†rÚ”öÌõÙ9å€Ï}IαýóC ð‡ONµ´"ŸåI5•H«g:Gö;»§iF@ãÐ^d’L° §¹']QD[ô°KrX˜~)vND¯%ª=NðXIÿc’öÌ{̬i~«W‹ŸÁ3¿Pàf`ÞL:«Go}Q}í¨ÂÒA)«kFYµ nïþ]ifn™óºÚ«7uࢪi°ÖW—tQ‰ƒOU·£¡šOhfØ0ˆ€özUú;„ñæÒ±e¶¦†CHË”U§Ö:nØ~³AÐ0ür5]˜/„©6¬u ¢³óøM¤l­4sϽkâÀiþvGÜ높8f¥Qé]W"‡Šñ¨Ñ Î!‡|7™VëfµªRë°á†0GwÒîMYÏÙ&)h{A»tpj_º£óy”rÙñªß 2úM;œE#ã1²„e³ˆ`ž¸s;®Ø_âý91]ó¥?IÆõ¿á’øÇÊÕÕœÇt“åtoÜ© mœÄÝ´ÑDfí­ÞÛÿƒÏBÕÓ‰ I­^iC´‰ô§;–͘2.Z%M|5g˜§€¼ŸÕã¢R…$qiût&åÇ]žlF±[aCöÖ›‘þXìh†Ã‘+iÒ_-„Ûr.÷ÈQyfwg¶el½W×nŒ )lAx ó¥êå¹¾xIDò™ ²d7TVo,,¥–mL%ßÈ¿j¼Ý Pi/t&h¸wPá‚R8rͺą’ÒƒæRøz+ðÖSô™PTµò7†7$}vúI«qîw0µËÿ¤§¦Í’7ÅN­Q¯C'H¤HpœüwU¸—½aZñ‹ûÌ$w{}W´àÝz)~6–äÑJ‰Ù¶}ìß̰ùöª(:O’lPeòØ¿ˆ=e×…éMúm J^™:æpºHu&šÃ3WGܼçNb¨a†N[“Ÿ÷<2Òì8Zmw‰˜­ÊõD?#Ý–äë¯n‡;” Õ  ºÖ‰×\r!œV ¶¤¸ n?~“veó^ÈNÕA¤Naɩ󠨺­§~ã–vûÿI-ÙrÚAâ"‹úÊ«¦` ok0Îo²Ÿ›­íâÚçEOBEħk8§QE‡¤×"M óW¶aæ “°œ„ͳÔç™ årí™"|ºp1|ÊÉ@ºØ êF[uéŒtÞ!N %°Ø+g>wƒå ³z#އ 8Åõo|Å®Æ&‡çX”-Q›|@꺔zñLÒNþg|%=žJkà&¢c"ycqý: }oëÑ>ßH¦¥ècë‚˧µ£ér$æÎ²Å½eŠIažP ÌQî&«NÛdª ©¶ƒøÜÂ@y ©Òou¯ù¸™§ÎöWÙ‘Òp½õ\3Û26¾ÓÇÓ‹›•$QT’ã^$€¬òXóCC»bf'P>…Ü4% ÎŽUíÍ+&¦‡y9I_|_7ŠæœGÐÉ„`|¡–JÑB~ˆ4ÒÇYŠJr5|h×¢ØWÿwnu Žf€üz5v²ÝÙ¬œg!/XÓW€d5 ^£HüP¼ø`~hrH ’KõQ]îoS6wÙÈHÇñDǦÿgR7*M%­lyÞñ¸°,µ(«fG&k‹4ý·‰Îï^‚F{¦Àêv,x/*8C#QpXßhælM¤Ç ¦kŠöd;‘IÅrÀÙO¬¦šïbÎêÉRåÆ >2Ÿ%”œLLù·õmz0T}g/ãá¤×šít»lwæŸekV "rDn·KªåÌÎÃáë9¶Öþ‰>pðyN0 ŠËêàGöÒËžW`n\NyX€7u=K¡VèÒéËŸ‹š’ÃR2ޏ«ÁlÄV=Éü ªÖêöKóVMd>—\£ÈL™ßÔ8ã—´Éþ}=<2oÛKß÷”"ÍRbwÙ™ÎÔÉo5µúpTÀmà3„KQÉTróÛóEKáBox€'/Ãá©õCÐä ß§âãWÈ:&¸Î_Ò­]=†}˜¼u b·ØŽ¥}€Üƒ€oùœÇÐ!VªƒcC ª0šfÝu,d”"8ÎèL 8ÛQ®:âk-‹š¾ž=´Ú% $1)›Û¿ÝÀׯùB1¶$öùÏ–ËB\<È[íeÕBî²ÜÖéE…êq΂š}ä ½>«æÈΑÞñž›Ÿzz€¯(Yó÷j+,.mù+Lë¸?X÷õ‹œjw$¸r|2άüh4 €›ÁiÍòÓNúºÖX)C¶¡BÏo;ÜŸ¹Cز¸ÿ{H=ÿ´8ߟ«}FÿŸ"éšC|˜û‰ 5Š-ö«Ÿ´NpXÃoï$~ò³áC‹¿Ñj@’bvš¿b`{-P?}«Ïœoï¼;«8ó“D矪çþ»›"6ð…µö…eø£59Ùþ™$Óœez1e¤+Òµe±U°@ê3ð ÀáxIÉH`6‰K)6ÝKY¬’Óû4Öå 8å²ÌtNa ½ÍHe^¤&U(¼ƒýíÉôVhçªâ!/Ó…¢Ý[ð*’…o×§òé8S 4Aó~¿”p¥Ÿr4Fâ"èZðþoXk+ÐIê°ßë¸Ba^_ûÍœf ïÇ)¹,'±•ãÜK“•ˆVlhrqš„±†i‚|!“Ö2ÄyPT¿Ã%Wv6¡À{÷(¢?âJtg>0Àï-Ö+-*LБÆtáT2wwªƒ£h†>çŠ!œ=-W­($«Ì|gQ0÷Ãð šSÉG-ã«a×G=Ò¯ˆÑãÐ ;•Ž`vá¼£((©1ƒ2‰á›¢azp€ÀÀöÂË/ffvÐ^^áì8FÐÁgÛPTËF@kĦÃC6¡œ£LªÅ.ÊOD¯5I-G­!30€ôÌó»"ÁC,ºÐqrà\UJ’  Àè%E6æe˜æqÄ×ÿâÎñq5 œÆÝ›õÌ#P}92—¬ Seç¦sÈü6Zîùyù¿Vû@P§xìw¸pue|~¼¿KÌ[”«Gɘ-ÆÃgQTÂpËË·Éà @¤ÅýóT€LûaE`ÁÓ Ç·êÙÏ`Jnžê“ðÙ„Êm·È>wuœùK€ì……W!øv}UÌ€ÅìŒÜÞm«ü$‰Mß>¬M9iÁ—d0~Lòk.¯ŠqÒ“e4– ”Ì#Úįþ»AR¾I˜ß| ûÞzs¶]Gë5@§ô£j=MÚfß4nï}ŒžÊb/cýä¯?^tþ—ßH˜»sl¾¹Ø ÄçC=«`'Ç}ÃÄWqepJP¸doÜñ1[¬¾¾C­€£+(µÑHˆ[¥Úc@ðç_ÇOzZ4ˆÕVwÊ#ÉšP°g/ Ï"eɧêÎ…¹¾ȸ‹?Bbí¤ÿ®ADý*uQ !*»!ååMV!x7rî+gÜ®ôú«دZ6Ë-p<9HP! ȳ€ôÌ7Ûîdœê7âäÉŠ°²¢ ;³ÎDúò|Þ ¶©®©7ÔÖéQyÑ•E#§ÈÏ)/`éùGÄÞ;:¼E ÿ7Ì<Ù×`W² ¨¸„ÓC§*›¡}1J\~îyö"UèR ­Ïã;¤¢y3H³ía½äÅy Žæ/QÙÏí„ÞŸ:åˆÁƒ*¿@7©“4pz+I:Dz^‰Ç@ÞæWæ³E1°òó³‰è„JDP蚥»ÓVtëû¢^­Ûn* IÑn@¹Sèv!Sy0”xˆ¥€ÂbPFû®Ñ¸v˜ÊÇ0‘o¥í 1Øð.P£–9qd@ÙãŒ:‰¡Ê’CXN@IY}Œþ±²r'+ Ÿ( ­„)¤-?B‚åóÃEáøý×l ô稩ÀÞ¢êˆeïð`NရžXXâ°1ELJ²v;l¯!V& Û¹¢Tꄳ UÃ@š/ùBq~õÆ`íƒf#‹Ä rª}Ý"ž‹ýÌJÚCî!n¥v†]WtÈ$±ã_2Ùbø¸:`Ï*j®ˆñÊ·õQ$˜00®%ÄNA{2µÔ«Ì^¢, 2¬”pCl’LèÁ€€¾qmšÈ[•ö`Žt ˃G=ãåà,f¸y“¨Ó­D\ëgtMQôYiRm>ÜÁÐ&Šžžý[ áQ­ÿÀ·¡eGæ;P3Ú vå°ÿ9‹;0àê¡K;ó&°¥‘í™:,P¤å®¹ÿ´€Ó´éܵ3­mwHFð¾ ¡)ã§ÿG)µ¼ªÍù® Í϶ÎåPFLp9‚“W+bZÛ¡Z‹C?£Yr±$G@fŠiP>bþ):Lt·r¢^Ë>Ÿ¹_ã.Ȫ½ÆF ˜káNä° X m–õ×Kå.”ûwb9;Eü-W‚, õËÙ?Nt":¯-„¯o çݸ(Òv'Äô¬m¶>ÈÒ±‹ITLöa ìI—±¬%Pj$™Ö«¶  ™H½žáâc ¤Äè÷Ï«dw w²ˆÌMlÞn`Jwåti’Å…2i’ßät¡i‚¨ì–)#£ €L‰ýp•„ŠáÔF”#ªß€$ ž c¿Ã:ÙÊD¤BòñþrÕ1›UœovN º³+-Ÿ¹Zæÿu{ëwÕú'ùóÙgûF•ȹ44Ÿ¾ÊÃÏ˪'’Å|^>’ ª‹ ‡(çMXöð–7{…—^‰”›wb,.zùgiY0(ùx î|„tÜІ.ÿè{º1*=Ëa‡§ª+Žæ«:ÞãFÑ€S°?ž™Ò7µh¤ Š¦U±èÜ%UÜ Q&Æ;ÌÎæøü˺y£^5€’‚­¤±#:Ì6ŒzüŽóžïƒ J«øïæåLêíRj˜§D°áßUsQs‰øyåÖ²éöÍQ,½Üg&÷ºhJU¦yý6 4:³±¥·’¥%CñòîUÙZ7”¢•U»ÈöÌNQùï`ôØqC­òîƒypk´ƒ zBºj3Ž7'=ßž§§ƒ¤&_èLÅ_‰aá=Û•ß›«Í¹Üµ$榴’ŸDòeŽ00D6ùÿÜ“f^2:¾:_OL ûW@’/ÿ))ä3à­6À3Ö|åòòþÀ;·mñ?š¨6ß}4ÜÜÔ_.ÂÄ%Kþæl§ÝÎW¢ÙßÏ÷é·mØE=@2Ÿ7¯ ^îODŒîì»à3+;í»¼Žfm›„ÒïIí÷hÀûSŸ^o²èüöÜÂÓÇ"Ù£•cšß{4¶Ç¸°xZv6®ä¬k™Õú•Ž·]åöq€™M÷6ž…ûü°à•PûQ{»Âe xU¾½9Y¥`uõÀúçen9Ó€'º„Q „hˆ›º'*,-²Á‘ƈ[á¡tCTÚWÁ.î¶Ã¼o†cÚ™oï2áà|­-”ÚÙ•…Þÿ눷¨WVÔ+trR q(çܺÏÅïâwTñÖÞë#2Iúd›©ÍpO/±vþÆò‡oþÞg ñ}8„s56À{Ý\¸`×6<"ô…˜†Ì–ÄkþÞ#ä0|Ä`I¹,ïè@2î’:àahGbÌÑ 3W±VIB@Í¢‰¬HÚÓìõ {áÜ v…%‰&¡¥Æ¹m ¦7dÃãÑäsÔ%Öܬ·ÓïRív6 hŒœÉà£Ú»]Óaø$÷·GŒöF‹g$Ø—òh×y}Êþ4mž¬õ&ÎÒô«$:Õ3†C,±)äZk*ý¼%¬W[lCé=!óæõd2‘KgBÜöѽyÌ[ö1§Ú› ª)ð$ã+ñª”cµÒã ôïÎÕv'"V:42ØßST}'ðØ ¤/T9¨Õù1WšÛI-lCnd9ìÜ\h6…Þ¢0¨›"šôðþê¯RrW¥¤ÏøTþÌ­ày½úÁú÷Pþ}ùwnGÚ:ZôÛ>‘·$™|„äv±²vÇÖ`Á,ú½=¹mDøg>âÓøòNÖ0t•ó[¿_‹f#e¼µ û¼È7>;¨©Ý×ϯÐ?Ot~ó…Û'€ ~ï5óÇ’¨æÇ‰ýÐF|ÿ½šAtö"²æ}µ ÛIÔýeÏë?:€EGâë êãj×=~·;Ê¿`¾k‰¼ÃåÓ'¼l@ˆ¢s²$ã쮿Œ¨,LeŒÆ¡ Ò„¾O>àøøMb#A…ôó>ß“Ù;çöœÌvrg£ƒ0˜«Üëã87Ê\¹,Š/YͤiìšLì¨z‡@1,Õè»íÏ1Czìw½ol­Z–Å‘PaLà©;xæNq‡7÷Îÿ5ªü¨ˆZÜLÓ¶­ÄÀúzÕã’ LKÇMüRh8|{¨!« n;iÔ ²J¥²9håå`}·èÐuÉÓkˆ‡Ž@™†ÿ4àû[¤Y2+;™þÙØOi·c4ÏÉÃh/¼ºq€CÀ±}Ï •Éi‘GË:ÿ’OuÆiÙÒDŒúwο<(7¢_ÛÑÙÁ¦~hïCÅwâJv—<âÙhÇ`Љy¯N„9^¶›‚v»jHv5È¿5rè Û^'äR`ɪGH{¥ëHUUDKg¦ï‚œ?[ŽõB6” #0L’ðr¾Î£ÄŒqø¢¦Í™@'uÊ?(50ë#Öý6^$Uâ!sIÁí!R€Æ úp$èŸU9X*að® ç,=¬B¼»½zj]°áI’ç5™!fÅhá‰Bâ 5`²AÝ»b‡R…æèÃÒ÷‡˜:ŸÃÈÐ×"§pr<ô*¶Dû=œÓ5)ÖŸE\×ìê,BÆ|¿ë*×õ ½iе”~CöN†©À êÎxjoLÝSMcÏtøÃÀʹðV6T£'gÕ9Ñ%•2Ô¦:'ÝÀý…×U¿^ð˜’-zг,6$9Ñ29÷,Ì•ÌÚ½Ö’UcrnD&#—â æ™jµ®×çðŸ¹Ã.r)ç€Ò󳕛«¾ãÂ+x¶†ŽlêРJkù©eu¡=%BO$_¯×>Ò—çÅœ¶Ë|µÒؾÕ)ú3¦ag„ Q+k¤*š&²®MEùLKCa›×TKáTEŸ"œå@Q+VúöA€†ƒ>I_©¡Ï fõ%ÕL¼NB– Žÿ`ˆô„rÞjøõÍj…šƒ.W?jãXª)Üz(,+à ÜÔ&ªKÅ8HÓ‚©Ù÷tVÇÓ§Ëu,ù(Cé‹pöŸ*:oÝöŽŽk[}‘lšÝ ­¥H6xÓZŠ)Y»©¼¾¡Éú}í¨7öÆíaRÿìçë“ßóëæk­…€‹$?Ó*²¬Ø¶™Tñjß8|Ћ{;Yºº’ë’Ëa•^•k›hïÌt}ŠdãUû Jê³ûÀúßJ> ¡@ p¼ ¸3¨Dzq5-r¨¤¿OA²±Ð‹Sн}1n×õ1D ÈcðfQ¨z3)ÒÁ'r5r2%Y\hdëÊ üR?’j‚³yHãsò`Èòœv:’á7ó{>œË(št`\¥c Î]Ÿ†jº©¶¶ó(Jb«ºéó#ƒ³2·?ÀË(§tœ 9¯cY=E¬ÅcÝöí•õª“ÌœÝmœœUå0'c7§n³µ&×Ù!À\™Ý–e.îrÚ` eN­+¶Øör rݾi%VÆxéŠ0;¼sÕôC”ºU›³a·†ÀOS«RËBd[¿c}˱~îTûÛ'gçŠz%ý H…®‘€R0U§Üà€íáϹ„_þzVGüäLxJ%. ãÞÿðãùùÙ>ÓW‰å}¸x“z¨ >8pçeŸe^r_‰³‰I?ÌÎÒàp°¸AŸ^®aœ¨hxåP¦Q_ÀÖÃítAှřÅÎaxo€ÕFåí™[mF ããfáÓ$õ¥©ÙÛz>»{ÅlñâÇP=ú•ÈÛ_.: 1Ów¿©g­q±þ™¸8DT!wò~#À«âpÌ3~>õC3`RX­0îL®7ž Ñf‹Üʦx3Æ@»“¶¤ÿ¶V”ž®'QJ¡ax”õÑ‹òضø&6vH!K=AO+ù–‡À&Ç¡øÄ!TË‹;ªDw¡3 P¨IµZ‰“Î,DkíK+z„¶Váp))U àt•Å=eå#½ˆ¢Êáœ?÷8T0á]_Fù×GZi$û éïW&D÷Ú‚Æ´»…xÿaKaB~ýƬ’)`"M=»ü–{ü“Î<âÁ».4o¾É°ˆ Ä^î·XHŽÒKÙ=®›ã2¾sÌŽ*fÂ>6§IÔÍsk̨3MŽv á\ÈǬ9«ÓÍšð£Äç‡?-ƒýrôø= ­'Ç ½¹Ñ1‹Ï!œéÒ$ËÜä8~ Œoë,häŠA%…¾b?(‡Ç$tÉñÒúGUz⊸+PYŸ<KHûÕoxÓ5wÀE–1×z‹7aîÍðÂ;–‡oºó†ªƇ'ÊXzxþ‰ê›°%™3ð< ߊªÕvÂôÅ'¹Ä7Iæ8Ÿ'nžüòeÿÔ³øeg´ÃW¶®T ÆBl¶ƒÿ¯Ôøçõ'| ?“Ïë7Ïèߊpï%~C–ò³ï ¶ß¶÷}÷q À ÁÑo¿ŒM{ï)DóõÃé/7dþy´s½ÕÔûíܳ\y~x4·Âœ_Õ!ήU„¡¨/Ð¥í¨oÞe=K’öC˜Ž¬æ²¿/ÎÿÔ€Ë8’[¿oÎÔ?-Þœ˜2¶í1pùF¡À¸Fa3‡¾ç1T TR¨¤ÏH¥{t2Nvß5‚ϺGiÚ³;/ã0à¸yh—œ‘º§^pzàû÷ã¢ï4Z0Úñ]¸ÐÖ¼äx9NƒE¸pǪ5}‹f à‘AºÃhÍ·ÞQœ¯q˜3¼…›oÁ¢R$ÑÒÑEi¢/k÷TQÆ`I£¦:‘´‹€‡÷§ˆó–Ááݨæ˜q1ï\lÉÒÚIöÙçÁûð"Ù:n²&ÇÙ `„Jª~!!yãIêKc~.D·É­`T­¾ZƒÖ™9ûó=±,Qeþƒa+ÃaãZŒh N jÍT(ñ¡¸¡Ù‹¢¯;#g§Qr™ÏJÑîuíŽÓ ç PH*bF-©$ "=aÁ u€yqÏbäÌbRÖâm"ÏóÈ @[ÚO\;a±Píÿp‹2Šc_ìònN£ §hš!ÉÉx¥j9˶€b»VÛ¸˜{4Ëbå°¸ *«ÉÚB‘æNH51«r¯ ÖNÙþ÷mûÍR£"w£æØã —¦f¨VbY Ê|e€ÕÖƒÇt¦•ÂjXÞêõí õ¶›™3ÈêA%LwöXn‰5\¼õ``\Ò<¾+áê{;ùÁ#ìM’k°ó ½ák«€ªvGÜÿØüª'K&µ—bQ¿Ó¤³ÙoLD&ûú„P?­‘)Τ§£ƒ§kò cH …½˜KÍP…<-1¶B:›/œ(WU§×9¿[(ÿÄß]æøO˜LŒ3Ø  ù´X¾uþæŸ$:oCHEç’©òhñΫìµE h²€ìe";ÌñÔ@ó;ϽEÒŒã¢ÒxËŽþ!º3ëå‰ãÑêkœø˜;xcT¥"þ¤èCÛùõÃcÿl‰fÇMV]‘OãܵyÔ-,KÞÓg™ ðÇ9ÂïÜ X·M.|¡9GúϾ¼ÍÚ9 ï@Рܥ°:bdjÅ)B2• ²…ª¾üÅa†cd(¹²|À]Ì…ŒÍþðŸ:§)Ño4p/Z?=Jð‘}é=ù® €TƒÐ6´5ûIøì«w؇‰êzsÑ £X ðcóy¥Ž „Æ€êi9r¦$·¶Ût~Õþ§›Vò§³f8€Qt   /¢8>ø«é)IÂ{ËŒ”ÈÿÓ l2ò ÷®¶”Õ)ÒpHÌDá)݃.ÍÓþ0ü«v¤1’véXöƒX5ÖJ‚ÏùhêY~?ÒÏpDÍlÀÅL®‹ã"œ¨;&ËžÓ핸ÂBz6ÖçY‚Ï©{ÅÓê*õþA¾êQ­øI'oQ]éþžŠ:ÃN,$ä^°]AkéÒ>£5TÔ¸ñ©•ÚVE³´Ä,σˆÃL[£LouâûQô^1© ÕªG&BQe‹»¤7íÄ’|+’äWtÆØ$i£uè¦rD6é"ÔwŸ=µœq)FOßÊÖ’rðÀPwœuFozë.5ø;‘c‹ŠG‚üàŸ3«úÌËzÙ»x®Åþ³®ðÑG6à†ï{¾Þ?î›Ê³Ÿ¼¼@ڼĹOn¢ ÷–Ò; üDé< P̺6}Ô%¥Ò¹7µä´YmP×T9–tÞžPøÄÚ$ð…@hÎQÅÕ”Ò3-¤ì+ºm'€!nÚŒ0;1!î%QpëZš£Ó±¼})kÕ fñpyÒ_^ETP?7}<? 'W9ž¹ì?§¿\E-æBë2˜FFÎÒvš*­óÛCÇþ¥}1(øhòh'M¿ü.ÿf£ Ð_ê6"DA×ñ¹èªt 5ŠNÕx èÂl\색<Ô{-»pnS}q þŒSìNp'ˆ]ow]¦ÎAž…qJœ«…$¹žÑ>èë–ŽTkxE×ÀqøÙšQ Þ¿äÎÌ&­)–ùĤbòRŽ_§œ5…5›C´Á.ºJæ†tªCo–6bÚc&ÙÏ«ó¸!³„»?,C?(# PåÀ±ÄµHt6|Æ·„Qž¾Kd7Uƒ|ÌxÿQu/}øªR$i¸ÝɲD1„-˜Yn¼Æ§,;ݸjÂÝÎåËÅã`Ü9þ”i\@7n±{ê ¹yä½Åñ¤¾TPL FÏŒ™ý²¨oà%ïxb&/ÒSr&Ç\ÖÈ_iÍt×àôh6xÿnœÛ0G Šf¦ÒaQÂb)üõíJ'=)èçaÓ+LéâÏÆþJÜ+ .lèÿhjdNÜlp¼ÊÝã¸Â:*‘?Ï#P«|¾!0Üe' ¿>ïöOø¹…ž–gÄê´ZÎ+#q"×xÍ€ºÆ¬ÙÀ¨‹‚ªÞ0›çüû•"Mxú'Ñ{b”ZÜ1¥bˆ¦‡…ù$9hš½æf*7 rh¦¤ÏGVQ—Ç ÎµV×öôüKë0èez« d×VŽ×)Üåõ¢T]o |¯cÈ\Ûm#\žß‡è¼MEçÙ·ØÓ{þFcLU¤–†YSQ {8Í%¨¦·K ®P “e˜*/µ"ü)ïϲø@J/ëü÷©Å>Èwþ3Z”»z`¿U_ SGeÚ€âºç…©†b pºýÝ+„ °pÈz©Ãe A´­†æ4† (±7­\‰p œÈ¸ðhÝòé8Òó¶Ôý;¿MR˜¨ñ'l^8È_»6rb†¿ïPs|a0Vw>Î6¶Ÿ(?[Ü ËåŒÿdKo]lߨ8°Õºyε> ÄˆÖð6²”ãàÁyIÉÙ…¿é5“‡JßuêÚE·,×|­ÓuÄkRíã¡«¸I¤D—°1@Õ{!ÍpH÷‚é¤<óØè%è亳s ñ²&8%Ù0º9¡ÑÚO/„JSG\ûÇeÆHnCrXr¨õ…4@Ú\"œ” EÂu6€azÙ$xC^ík;ºdM禾é‡h×­ô^Gë¥ûÞ4•ûÚZdtÙ…êê÷'tºD̯SƒË6«ÇÍþUØ)M6»A:·c’+—Òÿu^Oß±eåûË$‡ÄB|Ÿ˜ÝaYºÖˆ^Të.‡áOÈÿqNµ®ZØM5fgˆ0 jH.¶Òj(Dù#(¦ëªu†ÔQ t×mf‚Çt«10pØÝxÓß&P£:¬|èN5^ › ¥oá$1V1#_¤R4£€ŠÜ`»!ù€/ʹ`ƒ2s¼`Ø›)Æ´Úé6&IDz¥uCÁ 6åÌ0è45¶ë¸õ…€Ò)T_V a½Ù£Žiœô‹Ê<3 Fe£oà×ôcQšéhkþt³FqÃßÈ¢´ÌSQÍBœ”þóÙº?aª˜†Êÿ#øáÍ–k %p)µõÓ—r éF§‘1³îâÑ Žò¾¤§3ÀÏ•6ÁĦ A¨½ýßöšç¢Äcµéb*u«fz”3Z†t>ìA:%ôÂÅíLˆºì0]7›àÄû½§–K ʼղ¹ŒÌV~þ1j1i7²_šqŒVÒÍrp§äDž[°+n¦2nÙ¢g/ßëï§œd¬d«·T€v¶=£™Kç~ØÇ„ìVV'Î'n z7X)v7ðMþ‡åæfxÓÑI©2}ê9‚“âmbexϲYLðÈš–ÝVWÎÐ{?ÿ^N/‹€(M9QÝÚ„Cë0xCÍ^S JIâ#—òŨAÛNøÆ`<ï±Ã6x“ÿ`€§`8ì8ÿãU"JøäËù¿ ,Â…ðFïåàôÐñcÏ›4Èõ'qÐ;ê˜kö ÌôoÄû¯ýZ)ÿûz³…ñ}C½åì Zk.q×&¨ÆÀû˜´»ÜwSxÕé™È«¡…ÕM@ÞLºÇý¬ð©$ÃÞùé"E£Ôd"@æm|eE©^aй]ùÔë%UÞ8½¬)½U9<8‰ÊÛúcž*5ÆJÌ«R•î=ïy둜a°KæÀ²¼Þ"žÛ,¥ï^ %Qê´j øJ61K÷ÿõ ©9Tò dFšÃóp|_÷|äZ§¦§OܤËÞ2s.‰ýï-‘¿þ«OÓ¦¿–&L%¨! à¾þüUÛoC û'×ð‡”ÌŠ½Ÿ çâäßOâÑcyÔ‡ÛñÙ^V€›qjVåǵ—]ïx _üÚéÆÃÒÔ÷jy|ÿ•ó—+岫Úß8ÿtÑùïßÅù\i’¤ÊÀAl”Ý©^Ÿx½NUC;ëNãáe{Pü޼çG‹{œèŸ½ÇÕ­¹õ³ }þd„ù^ûOóL÷)ýÔS¿Ž´Aq» ¹¾ÌßË“ôƒà({Ã~ÀhÌ §É󽔀sèMÑÆ*p¾×Ç B,¤SéÐ]4ö¿ÂeŽkCñO¿Oø_-y•Dû4‚‡a$˜ŠÖµ'“{¾ž)2T^2iârB˜p=¶Ö“èzv,8xÕ–l²‹ Í»‘I©ewŒFH yé2Ö•š”gðèŸw‡¿šK ‰eoia?å +ÝÝÝÔFâþ’c$_E9Á£.‹ÅÀ9d¬¾t/çŒj©T™/¯„" 5ûšƒãþ„}Äì’ŠãÚ¦G[vé›Wï_b¶Øè?£• æIòší3Çÿ\ýF—²Ó»Îjœ ,• XÖ$Æ\»VìÐÓÇí2¢vBÒ^@{A í”´Â8Î(N©vZ³£ßWYpìÔY¢?›.ýÓ Øh ?€ãl©£•áÙú85šH ¯ó€áLwò,žÝÈ ÃiŒþÌ9º¯ö¬<EBlaEφfðdúÑUGW72§5fb®:´mXãHè&{ýÖi& *+å¯ÔGîîU ºK(ŸÀ–V ƒîê#ÀÑÄà©„·žª%Är {f‚[P´¨³ŒÚjÑ¿ !0ŽÞÈzF¾Òš WàOªÌ¡>V”†\§všÙÌaÁ¦£—’kêd#K.¼úñÌ}ÔRP´zÒD¢Ë²¸—t#AŒ6÷+%Ü®¡Çåz­?äœãJú`ÀB,ïB<°‡îØnù-²©u“ %¨.³W0¨hœ7œ¨­%¿ïvlÕãš‘@Ö;È+8ÎÀ`/ð2?)?\m,Ñ¿9&oM˜µŒ6rû ˜Ö3…‰‰rõaôüZåâžØcÒ½~ª1+Ú$Áœ}É9Þ¼dÜá?6ag®uÒ’Ó)ªãrlº0»Ãequ‡d©µ† âRô·dª ølÙX´njˆù){ ÊQ›Gšl>ö™Iêâ«8m;À‘èCÞf€+=!h–U‰Ìü›rµÂ!Îùª×aK‹³müwaå/&î*êü9WƒAŠ«Ž2ÅI­25[¾a>~¾ì¬0é[ÁUvú—ˆÎ? Ý>¥Ç4B3&‡’óÆ‚‘„rr‰=¯-O0¸Çs‘.èÜ@¡H¼tCÜÖuùi¦yÀ>Òûü÷õ;ô¿ø*?FHªDZ8VT ²¶ Õ®ô¿6düác"ÝÑ5Æ·áß`ñ²L¦^#ïÛ-Ÿ8¾óÅçq“ÕZ®¨€û•c­n¼æ^O9¨ Üo`œy¯r%šÆˆ7%%Nï¦Ã#ÐϘ'5½{·f0,3rÚm {ßœXÏBçõ êARtuHú¡"ò€oƒÒC¤åŠáôöxZ…‡û¸ñh fÿk;êÕÁ}/Ê!µ3örªþ 1ⲃÆÐ5£÷|ÅcÑïº=/'FoLµ†:3Ÿ®3´ú½d{.v 47aÕuÚG;ÚüVGÐÈ?†ëK×· §êÛ,„ýÐßAWCé=•3¼:Ê7„ù#õÒ3ä@lPèÈ›þeBchZ°˜Wb"œ„Ë9­t2¯ÝgL£ãl ã”ìPÅÙë!Æ;Ñ<«<Ò--åÖ£žÔ4xPãâ6é ªÕ}®Å:ë ";.é!9úÇãääÂGJ““V7g1SÃÐF¦ª† ÉRÛ7œl˜”R.þÒ}½KÁh‘ZYV½ÇÔv}䢂벫@4Ü;¸Í­Ê­I·«o»Ñq’“ )!)n.ïæY@Ê_H5fŸc êŸU$äºÊüúîÞ“¡ÐSšÎQ)j²ã!£Á2Tmnh5«dÆÄ¿†¦:•¾qòÑ«¡n--ýuŽ®/†õ ìA®÷uÆæv°ªýËÑöÀ†bFy q´98íc¬¯7´+žšhæÇݨÐxÇÏŒ.B6¥È$Ú ü›ï?–¾3:â ø°GaE V^hF+ôu#Á.qÁ×ÚœÌ.µàSÖ“ÌI-\Û°¢<¨è¯j&q»JGÜõëð LA¤«ÕñKšfŠóÓEpFNúðãVl©—†L)(ƒÉÈSÃ㊿ÌLÖh ªmVË)×ù“éš14î¼rãƒ<¸=XeÆ< LÚ^“Œ-(AùÅÓ‰¡D°´ø¬žÙÿ Ñù²—6=aWfxí+ƒ·#&<­‰5; WMúª9Ŭß39ÕrÀ y`ö<õtn½ ÀÑw~ýÒŽb×pjhjœ {QKYD!Ü ëÂΔmöC„s4´fŠÍŽà¦£YÊáU©•ŠìËdÑ=pié‡x{·S›ªÎ[…îŸvÈY/.,X›ºÔ¸?_¡ÕÚ28„ ja /ŽôÁÝk'©GA_Q˜,‹;Ñ¥iÔ̬­´ÿ¾þ}mžßZf~Dè]ñnu{5;&„Rh¡„ ™KXµCÿ18B´êR?ã$l6Èn€`àF5g`€“ªÇéù[·¸ç¸U*ªD¥Þ6ŒGfïŸERIª(ä è÷mÄRš©1|·†<²ÜÑ<ÁhSpÞô÷zá!-Ð:„s«2BÍžyœ¤´d/iI}½»”À9­ŸÐ‹â²W7±0½m š•`d:z ü›3UKfgî#+5Ý}R4ϧÊõ—‚Ã2:V†Ò¼Æ Á—4ivÞhrWÎ8@‰Í{ëÏ"Ž+×Ú evÈ:?xo>|T¨túh†¡‚÷Ç›tÔj½~dêÊ €ÅöëQÏOŸÇž0}9l0Q‹ö§(ƒBý“ |aßÿìÇöh]ïÕ¦¸CîúÁ €·XѦ¨ÚªCáþ“» Ÿ¿ÊŠä5ÛÖo5°‰n?B~GiO3.X³@­DñXV±G"rÈŠ+y¤Àgùi‰ÀgaV¸×ïh5Fο‚œ®ÂåFJªVÍ„}ÇAòG‹Î? ÝoN¼ß÷{LÉ–xO9òØ|h¦O­§Ü>þõcÜ»ðO¤ƒp–#~qõ ºL¢àFá«ð˜VZfRâÄPYÍ—Ot²Èt h-=ø²•§Ñª×ú‚±C€š(Énj-@x .Dª˜d˜ÁEÎê¼þ3dèDm‚윹Aÿëj „ÝB>‹gv÷LîwåÝ(oZ8ØHnöƒ&ý¬ÂÁdqO=¥®.ü ë*g¤°‘ÔV7¶WÇ" i·TÒ9Ó“È×±ãD¥’éØÊ¨øZâÓ‚õ#Íà™ŒH¶Ë"ÉUPó_­ç«¾^×¶zÍÒs¿;cZçÈ:ØIŽ¡^ÝŒD@n bw"?µq¢þΠÕÒ”âqiôa€˜¿@úuÖPû¡kqþô!jó´„¡q²‡uB%i]ǽ| ô4ű!uCóX?ñw²¹ 4&å0Zæ•”þO×Jê1PÞfî{HÛˆ€ÝNmhÂBoXs=ñ‡éOÿ¥ÏNé\x½^§âÚ ¡ pêG¸=í§ƒ“ ˜Æ^é”âÞ(¡T,÷‡ž‡Â&¡N” ͙p¦™Öd¼eÜÂÿ6ÅÎ!´;0îgTÀñ»ùŸ‹xåTˆ´—lV9?69Èàw ¼cð$³ëž¥ÆÒàÜtf%²û£´ ë¦Ìƒu·œ‰b•q·Ÿ¿”¶€LbªÞ(éCd·¯œ`lJvsô]ÓM¼ìæh¹9è˜Ò'ôFàLz{V52òÙ3D)„R´¹1ÙÚ¸}‘ШøïôAòAHZAü^x½ð:Õ é½ìE&¤gc•…ÕO.¹·òñ¤Å±î¥*ŽðèÿûÄv–°èýåŸYlTª>Ž—Â ÌÄr­|Bù&ûeqZòd·òÈ<àË[aÁ§òøÖ½†ûÀ§Á[(ç·t¤÷uö„LNeýåÙƒÇxjغá˜ZÆ»ãnè‹8°†qçI EÄÖ îšpËX<@ó“µ'|~ üWDç¿©`éBvñMk,iJŽ ºT›C íî92CêÔöì~ä(.Ûl0S®í1ô ¼ó¼/þ°_ò׈ ´ #âÝgÞiö&A„ OˆAŽÌ9¸_œÔ‰\T"6ªl°·‰Â¡úfVøÈC¿[ЩÏZ&U]Øõâ@²·62«êR.êí);ã18¦áef!nÖI§ ›„8Fæû`÷u©³nèIfWˆº+âþPbáÕ“U ÊU(š´‰"b© ®’kXÀß:±D“>è§R:~BDQwO¾g<m^õãÛhÇsçJ?^vt™ 8(ñÂ¶Ûæg‡|9 õbÀ—,—œšÐH©0>Œ´¦Ë~°+=Œ:ÈP&Î }£lg‰þ;¹•v‰€$Ú;XÑj¯´£•ë—×eÛ ¥µqHR+¡sJ¹;_{àÅ!G žšoœC¤ì²:çm<'#® áÞÞiPpÓhéEƒŽïXÓj;…¡½Ñ»²Ú®Ñã¬Öl;‹l׫»ë¼hP·Xצñ+L½S{a‹_Y˜¾ÿ°Nû€\4²+«~TEŠª^Ü0cn¥µèÚ/¡õZ´¸‚'7$%-Ò¡üp &”n•;®ûÁÚúb†Hñz L'×Hys `Â1Š”Cëʺ;wvb_¦D/“yvçœí6Œ3‘ά±ŽæÙ\g©Ë—&NöðY¡èÓ¾lžð(ñîx×x:8;Ëó ›€T„Éf®,Õ«ó΋Oljd€V÷ÂÝí|d-Š­a>ÊÌÀ}b(Rp†ŒÝFù++Ã=¾ËûšþÀ¸üs¨y‚»qÞû8aÒØÕÁjlÈ$-®\»y¡·³Å~á@j¨­y±úEïߟ¿Æ*nøŸ<g<b\Åòe„«¾?çÁr‰.mÀ•ž¼Œ¿;À;σ¯,æñÝ+}øšßL”W·ÑÜHêÜ‹ €â½y7“tb×ØÚ‡‘Í,jôñ €§GÛb!ÿEç¿é(5ßnô|.j¾w–Æ]ŸƒÀÚCû‘sÏ£¯Ñ¿\$#ƒ” ÿHlx^À'‹ˆI†·(w IÆD&Âd(;¶áWëvÐø\¬/Y¨ ³µn›[fL†E¦­õÊCJ˜WHâ}x¥Ô-“CAJuñ¾ôtçƒ*¨¨žð¥Òá>_Jß:ÖzÀðpêÇõg©"xrLGF¼ÛÍ_ƒw£&pïøú˜’M¦r¼’nÄîíÑf Šü0`‰AyÓ“³‚Å]‰+Éî«0br‚–­8v=}õ:)ü¸,wQe20ÈÔÉä’ȇO>j+áiÜ??ˆÌ{Ià⃖|[”+¤žjµëà…˜ž,xwƒ¡o4; €Í ˜ÃW#¾`(ÕQ7ÙT°°.à©HbÊ—ìáÔ:ÈŠ~3¼-ˆ´¡\±å‚cì%¸Ýpö&ÎJq¹oi1Wq`.TjbÝ«&6ú»x“c+ÙiÿÕk/`]éCÊoGéhœ&"7^¶®sö½Ý ú­wüÕáG˜&öL2u:2Mfáü~åç5¯üñ¨=Æý˜>=…Ú®¬w›M¼ÑÍðˆ±]¾ÁÊÙ]öCøé¡ƒÕª,pÿáìscáŽ.HZèuÔúnÈ¡yxÀ*s&ñøD,3íñ¾ËDÀNŽ$¸õ69{Õ ›_@Ï*H¡÷#ÍÓΡÖÐnºè*B° Ett•¶JÚbÿ™%1þD~ Ÿýè»Gæ±w‰k·†Ÿ¿ñ^䊚ÑÎ/¥ÿÿé†UÐúc[… õ·ƒLïmZ~–éåá «øŽe ?«X?sÁˆÇ #Zò] €‰@ýðU „Ÿ\¤?v¡_ô¿}i§»ý›Æÿ²èü·=p¥üî›ü;Ìø¥é¦4+¢xp+9ËÞ^'Ïð}ïÉŒ„Ádißå~|â;Éùß^èo’üÐY¿ï´E·®zIΦ~,xÏÑKx’|€ÐÉ íèKÂ;š}j®(ߊ#ÅLA•¬,vâÿ|r; 'M„ÚÃrµñàKƱ}û •B ÝûI¸'ˆÉ¤A¯˜*¬Y€;ëÊ ­ö<ŽMÍwÀäz©eé ˆéÃGð!Ÿêp•LHNl!‘ÄiÀ ZJØ|ƒ)-^nÑø“­¸‘à¤8äÒ@÷DÇša®ÕZ`¹4¹ŽB‡À‚CÛÝL(Ëp+ë’€8ÿž]³Ãã܇áÕåÈôÇèå‰ä^º<ÁÈù @Ä»è÷AOýD”‰2?òÛ#¿¬†@n¹yU›³ñ°·Øl=!åFŠ7 !¼k¦ˆ ̸•×C>ޝªÂMÛÍcÞ* 7@Ú1@;¬³¶FÄ”ÿÙ\3pâ~ÂÜéèÀI.BÑʾ{³A[nàS€õ È›æR¡êAÛ%¶-¤äe7¸fáw©Ö¼nT†Šä££…"€×–açA±w1ìr¼èÆÌcâ»÷m^îÚU’Ç™4(òfNƽvëËÞ‡ öf©ÔèDz›ýÑ SèbîEÍ4(ï­Þ†[ht™6ï‚*£Ê‚èÿõË.9ԟİ ,é&¿_ÁKŠˆ$XdÜ’“CN‰Æ ²™vv8™=êy)ÞÚÅ £Ì¥2EÅ/øP¸#‘‚†Œûpé¨KÈ1Æ^EÂÉÈQ¡EJ f NæûØÐ‹àVæEŸÈª_St7aÓRÇ "Ÿ0œözšåÖãuáoOQ: ÃÒ’„ŸÝéôU¬ŒØ•zÙm]§ Ã[fªu•.c^šHYå¡ Ûr$^^8SoA(/Çòd*!×ÃY3€d§vÈ$$¼Zÿf¥ÔÄõ  òht‘¤ãV÷? )7;²ÄòxK1[Ú›b ŸmÊYéT>Ø +*kC coìJ9‹Ç«Ÿ! ÍkN"ó´v!*¢;"ç¢- A‚à)è’å ËM÷ôNÅ>C1Þ/áäDãÌjÄøä¶µSFërš>çt „åËókÈåàë‹åovÁ΢)ô×z-P²c——KγZjÍa¹iºˆKD¢ɼ£â;áÕh·áQV]«ÛåÔ‹%«0ÝäHRÁÉÿ Ñùy_ðÑ.®5X¦Ø?éà7 ÌT#ßÂ\ý”,nçz³¤RÞVYI5)uNñÍfy_cyÀâ¦Ts•#'èl?£˜k \$̪7'ã8j!VòúÌcN3È!ób½î’ðe>X‘Q&®šq§45|MÕVÆ©†WïJ9˜‡v–l ‘v&q©Nï°É A¡´­}„jŠ"Š|sg’?¿Ãô‡w´Þ¾c¿åuãû>þŒ‡ù¸=‰…o¢û3Šªoö8ýÆú3Ñõž.Š:‚Εõ4Ý5vH£@|†éSYSÚ>na¢¶ƒ¦¤ ¨é‘ÃP)5¼ûùz¨xj”õi¤ù&TÃÐÿ¤/‡\qøÐBÑZႃ›œ›xÈz-!Gi·9v\Ô{Í„Üðš5í dÝzáðA‚¯¶¤b#ïÖÖoZïÚÜá~m ÃrÅøŽ~í-ìî+çŠ ×ä; LÃ=idÝ®´ÝÔ?îNz…ùâ%Vcá‹IÖMêª1Ï"_tÏaè…cÈ IõÒÒð–2¬žÒmþDÈ„ðâ'NTõ~Çýë €RÛÄýÔÜCÈDÄÌ’WŒÿ«Jl‰ÆIQÇe;ï€ÌÀ¢+SgCÑèÿ¯×ËdØÀ]%7—h)Ÿ‘ ÀŸKP‰ù¯ß=a:óúâ!ææNR$\“¾IÐ&‡‹Í”òo“V–žÜo?ŽGlÊú'W á¾[â ŸI`Scì›Þ¨ˆ9Õ¹j•½Á4t·¹ñ'+ÐùÚ€}ÝÛ7ÐÚ–sB cý¦Èa ätÀ¢ÔL](RxMŠ¿¥îvCua²Þ¸â8…õ¤zŽCìõK4oñé€õ*'ךּéàcµ¼1à?=¢Wœ‰ÌWßô–âYt¾üÝþï™9ÍÞsÚšøùãz“û­>Tý:¿SöSûJþ ŒêE׬î`ð1y;` %PÑÜt ù@â»?xÉÚ{Hz;!“øÂ°ébÌ´¤„ŠˆÂh3ôÊÅZTù œ#ýn–ÏÊ–ô™ñà~a9Ø€þ6—ÂÂÁ˼2Î쵔บàªÒÜW¬.–ŽiIÃôØBÞ­Vì³_Ä]àCuœ®W€/sU™é“¿}Œ›h”®çÐèZ½ù›ÂéÛÓqÈ)ÊùŽ +nU†°—Ìü.4,x®ÖR¬ZåÒÂB²^„OÈL‰Õ?C­?ñ+h;|çªÞâ$Ü6·‚ï䔚ðFÆó/ãøw¥wFî†Øz}tXú®ù=nû—?ÅPNÿ½"(ݰŃx¿ëoù]Ëðß×ÇåßZt¾|/a ó—ËÁ•#kþoá‘ZËCrå7µ×Rvî{ÏFjsš£Ü±ÌÌ/Ï•Ÿ¡—@+'¾-UÄOÚ:½9-°v¸eùƒagŠúÝBìíjüÐõ DAGçÿiñèX »ÀÎ5=CãqÞµ8z&ž•zµHºør¿©a2¢Í1Pg1~±È°Ì×4Â.Uˆ¬´›L $ v°xªœî:¥èÍ’ªíZÍ Ø×^–2ødNn£YI³3óz6¼,ˆ…ÌT[QØØò)wòÖÙed…‘ˆ´ÄØ>,7•žCTϵf šW5‡ž<'ùƒzùx]óLÖ5Êø½}¾)¥e: ˜¥´t²“#‹:Ü‚£‹R\]`O>kE§er)ùËkáJDéÃõåÜ„ÙÑç<[Õ×Ñyš½àþ³¯v5zˆ®‡Ðó+éÅ{Æ­>lÐïE¡ic÷Õ¤ )ÓD‘ûiÞº"=¨¿<Ž^~w#(4|Ý 1Gªg¥à¯›MäÈÌŽ#€û^Ïá´EÿþmºÎ.)9è€/ ºôº ¡ P_Gƾ€È Ø_y½ðüüñì¶ N^ˆ®9úÌ4É(“Ÿàã³ô½¬'ZSè`š6BÄÛÚ³ÞÑ 1Ôgú78¬ بé&Ä„f/:oe³ÃìÕÖ"a:&¡*6”ùüA-ÐíêW¿óשuDQp¡˜‚¦«s {`¸2•KŠyA3K³r\Š1ø÷=²÷NÌÌ^ÃXê 0ô™ZüÅKƒÈ'ðXVJÿs í£÷b¢<ËyݯFÑö|&0—Ýp'šÎ-¦\,á‡~7üø· áHäYÍ6Ç+ÕÌ»»W3(œæ¨ná¤Â*ýA7ŽLÈèʺ¸:êrÊ9p£Aµ;¯š1Mˆ-‹À!Ð(ÓM Pf=À4ç¨?7&[ñ•¨x²†Bd"ÂH]l&ã‰y‰Kµ5d‰™'ÐŒ²¸Õmì/ê8‡ãwðEoÒ"yù¤1%QzúøJýŸückx¥T(YÎûÒ+–Ša¢OÑ´·çþz!ˆ¦ÁöþN2óJT‚Ö¥åvàÎÅMT”Ê%g>îU¢IY`Ù¥Œƒ.Ó € snNJ—BûåÔ[cSEr@QØ_ø <¥šì±NµõtY’7.ÁÜÂ+ÓMD©vßvx&º’•ÚÝÐÕÁx]–|Ü?àB´:Ó…«°b˨8¶ ÛˆX¡ A´èjàäšœ}–äÁ„Öï×\¡ìЮC î¾pW½5Š[®ÔR(%´J‚Cã7É…ètÎÙþFÑùÍîDà¶Û$õŠ™Ì‹°¦¬Å#¦ õ¡pP&¼^Ÿ‘~Æ)ÒÕi»Ù}™Í´µƨêÀíH‚èÓxlÍ€à_é~}ô«›œœ¿c6ð÷ þÿEÄACm'°cãr,²èÇ4«C̆z¼ŽøQžGE@‹vŒ:(LXá¡Ã©aJ[øÍµóÇô«7~¤„Ï_cž&ý|öÝÇúdà­Ç­¥ïž€{BÒRé i:¦oqdýŸ|°By 2§¾g9al|Ò÷/˜-¾þ;4­Q7)û´0üF­Iã‚Õ´r ëSÌ~Æáˆü£«„@i9º~B»fxÿ0Ý4NÅpdÚX•$%,m9C¦‰®S«ÙŠ Pê´Ÿ;鸞¯*P³Š£WAG,ë¾_\^2ÁîÒjªIss{DW‡UÓÀ\Špô*\q5^×'Ý zùc*£ÂàhõfŽÃoµ‹ô('‹‚×€ ¨Ê`³_ò4Ù­ÿÃx­“9Fã¡1³($IGV [qØKÙ«"sl”:U&ÊX;ð&Ã)~©Ñ©qr, ´[§²›–ø˜~Ò¢JæâëÒ.Â"s\UKD`º]¹®b %nÖnÞ1©ÓÀ+buO©Gâ Ü_” \C£që 7,8$jm:‘ô½uS‚B“A-A›ïa!rÏÂlçÒ¸`[2#ÏêY3›I¿÷²¼>Ú.ÄÃðVNæ¼4)$Ô°¡}ã2™.™É«¼x“ÕšŒÛ°É}uØ£öôÙ |Ö¢Ð3Wþ‰¦Sd˜‘êòˆô͹ž¢jv°…K|AeƒÀ®‹Uš:`µ/Šx¸ÖJø§Ï/s¹Þ5Eñ$ÍÂ>ÞãµÇWw`\Ä: ɳ¨Or!NµgÜ’Å “WÕ[ðÀ/:¿Ó3Øm@v¡ö×*…¬(sšüêÕÊ € pØ)2Ýž×?mðîG^Pgô6_Ô‰z_ï[¨t0$°u’ÒRsž-j‹ ·ÌÂCèQB€£ a  ]˜¦V:—-—:í¤zc Tý7Ó´÷ð»´t€`Qž'ǹ¸ˆT/ ¼ 0Áƒf‡E‹x¦RjÎÏêŸ ‰†öÐeä³Éì"ùÿÀUÓ7üü ¿¯Ãñ EÑÛ0ÿÃ7S•AÕˆ{ø¡ð­wèË7 ߣLnv·šÞ»qø«–Ð?ëŠÃJµœ½$‚þ,"P0NEáû’£{Ÿ¸ñ'Áðéí¨Aš 3+·öšŠè&ã°CÓu£#W6Úõ%Ãñçs,À#7TUeHÚ-ñ¡µq›àQr—5¡ª‡š™i&7À¤BÈ1íDî˜{$Ýs(Òsx´zh•NH^”ƒ#°:AzR8Ó¥Õln­90”ÜJá‹n‚®ð¬‘¼³øä@aš É"ØNšèµ¸œ½#‹k´x–ëÕ- î2h߉ƒî3þô|îçÇOLw° ñ3o…’¾ÿø›>!¡/æÄn?sÛñOÓà'¤*ÿ´ˆþ}ýûú÷õ»Æ§¯"ÿnâÏýrÍ‘ÿÖ!þ;‹Î—_ÇÁîþÝF¼~Í}[`FÂÆxÐ(Çò ªþü¢°x4Ó—–oyþ0mM.æŸ5¯>3À…_ÜäKIÁ¾ËõS›œ;á~Ù­‹‹›Ràñ•h|u˜iH,_}|ð8¬ ÒÄmÖòÂR:½Ü£iDûÓ›ïnüÅÀx)(îaî([ËMè…ãÅ&  Š»ZúOÍÌezD¤¿ò@ m&D½¢è52~ë.¨}4zhdþ‘apx˜e Ÿ<÷gŠÜFa„OHýe¾Ú•ÄåÑ`ˆT ¨^<ÈO‚¥0„Kv‰c°Qùæ½™¿¥â[ÙZ\Ý9¯McÅi›žïÓQJÎêæØ¨¼H¢Ã͵ɴ_´4n}eOïKðõòÏÌ,ð¬ûËxK•Áf”Ú“£¨ØùA3ò¥òRÃé0ëÀOm~Ž@_mS¢ù* —Ùq.¥¦htõxâÌ»esííj W"1œŽK žB¡zô¨Îœ×äˆûh³ˆÐ1ékA YϘFïX)£±ÓÅó¡OŽÉ…\¾óÝÁ1¯/šzK#y¾0†:‡«B;-záÕU¼µWUTº0rp‘ÐJË›cÕŠû\ çÈZ_Úb8 £KH›5"ŸÓ„!O¥+üT‹2Y½SÒõ×8d¡Ê&0B,Fûuè©¡7‰¤—`æÉ;ý‡³ðàpšv×>OŸ&Ð&Za*…רjdŽv1s /ÉÂè 8i4¦éÎ;VurJ/0P<œîä‚•2éŽ Ÿò®ga7>™¼”¥¼Àú"M¤*›´ªÖÙh9æZ}UÌì‹ûEÿ’&J3ÆMjUfýëŸËá¹dð0ב5Œï}l+ú訊‚òy[!òh“Fd{ ™­Vñ׺á|Wœ€“oòIYy+V°rt­Ñ·H6$Qxþ"¦j_èc4f{öOµ¶¦?6€…Ðí†Ï/U.Ñ…?ðÛøêPôñ«hÔ“ïÅšafllßÖAÆÜ¬ÞÞë =?ñ™­‹²¯tÀB›Qr.î,V„z•‰£?DÈ”$<ÿ3pÊB{{ápâ:;]~ç;æXé¸Þ;Êüwã}\ƒþ]o&μæ[€Í ëf"ºeï1Þ­nxæëí.ÆÄ="§ÔÙ•âëƒìf/<;b»×GÂ.I¥Ócñ4êãN¬qžÆüÕ¢óa{æ6ƒß)ÔáÒ'pAÑè²ßk‘Rè,OùáüDò,Åúò5…ËZ@Çò] /’HþùýàÇ“”ò«?â;·¶F»hÌjàUš1½éŒÜP¡[qÌÇ]oûeÀ 9î2X1$Ðznaâ[šê`/GÔ{ý†öšp»Ñí%ÐOâÉ.ºÄp¨û,!c4så~n‚ûÔåcï˵¶Ï4ÝîF{Ë—oœ÷âíl0z‰½5Ø!îT´‡¤÷È–ÅÅI‚#:VÃt2ƒ»ª5Ju­Wûx±º²\W 7@…#ºKYÌ`o€€5nõÏËÁÄ›£›¦Òf$ïÓݹþÌ .֚ˆ €¨´›[õÞiZ+AZ –[D&œ(·ivè¾xsÒæ†hÀÐY©êp›azÙ½]ƒPd®:1w/q¥x™ã_Så45À‰jÚ4/êµ%ÝQé„ì]cÑ©ˆ,ReòPxuN¢Ñ5ŒIªEÃ"Xè[ù¼ŠÙ£nVLË.\”kÇ,’Ï` vÖœ+Y¶“¡L+I¢"Æe÷ĵêT@íÑ{Ø-ö— æ´¿ÐO€šœ;;UM)?î!ú3®íV‹m\.‡tÞ¬þª6ô ™ Ï­¨ç~…¿'·%Òû‚ÕÆ€jn”µÕêy׿‚k—æåýŸì.Ï,VôóæPûä–öka ±€Å'ªÄøØÃ#Ùó,.pv -È(_ì¥U&À!ûB4OUÅÑgg„ãá®æ¸zó8á3ÒJTñŸi×+¬0ž¡œ ªn܃½6r—×S ¡£˜µË¨*ÝJ W…)?–A=#Ž3#?ù¾'Gàä@Pˆ„þ3e»­P"oý:$‰dX'äÿ®?¿0`­óâÃõ7åÀ+û7Bÿ0o233úuæ½»»-9ä.zÜæP°ÄaB/‰gX>õû/Ÿ8•†Ø± ƒãuF½’ó'»º‘qÍ^x5á£1ÐŽ;oJRIŽft¸`‡ãóZ¼éÕùºú*Ñy陇[a¯„@pízÇDêRA¯.û£ ™ceP#®ÛÛ—ÆD« rèÏMÎaĸÍÍ„Üδ;ä([Ên”ûºÆÕ5»®ÇØ[¸uBÓGÉ <£"–†Á.¦ºÅwëV *òFï¹Çuàç}Ö8pýÓ–jÙè‹’’'ÎHòa2wêºó»A3^´Ÿ§^hÅôsa´jiµ§Ú€LÔxò‰—«ÆG"k”x7rÙrx½¨*@¤ÝºõŒžé†AoËN8_Oð®KâÆßä¼VŸÈÊw¿Ãƒ½Ù”Ѻ–Ùç ª˜hlI—.£Ì¹Ǝ²ºéÄÍ‚Êû½$É3Þ\¼4'ᤠ^cb-¢±É¨â×±¤=úNþd@Æ&<´ùó‹ŸÁò­YÞТŸ½ôbOk¹Ô´YïДös-8 Æ4i~d%ŒQ•k°k`˜–D )•V–­’¹ßÈëqHÊh”ÆÃâ$»ÝP\|Ð/·÷ùxYTK¯Y!×[¾¸óœœ¿sLù-ô‹Þ/3„òÉXÕÝyº ]´g2nZ¶ÌeÔ ð½’ü[÷2¾l;/_Þü?^tþá¨JDñhKѨìm´g‹ê•b£ÍtuB@±xZcdæÕw,¿ix"Á]/Çóõ#Ø}•ìíÇgÉ2¿¬kô+ÞÔËbØ~wNÃåºÄÉ$@Nze´Ô†â2-® 9l»¨Ö³0Úve(<¤cöžéTeV­­Pîp|ïd™÷˜;°Ã2ñª ×#÷ÜøŸØÞH¸e.òsFÀÉ(à +©~ô­Uý½‚bïŽfÝoì®l®+z®á±ª£;-øçjbêÁ zD“6‘è¬ùI£Tèr/`¬< -&RWë½t/PxÄSEæ¥dÆŠÞíCƒ­“«±K{_Ÿ´Co!3l¤¥=Ì0he<Ž¢ùéV¼Ü„ï·6@Ó JC“í“Ôr\vŽ/H«± ‚#**åîÿ£áö— zSçÇ5ÚÏfô҆śì8ºÜ÷ü,$H{·‡C²\WbuörhS\”¦ç"wuZ蕊ëÇŒ[$µ-JôŽ bG¶_‘—Ýòe˜žg1¨[üõQ'Ó}ú÷‡ÌÁ¤Ì\¡²P C Éè¯y`ÜL‚<„Tç®—`cnF2,™ûtº³ 8,ÿ§ÓˆEjǺâ_ŸéOTñ„l@òv?0Ô¡cªŠ?îÃR7Q³ÂÇk›*ÜÐÿ—ð ³Ú¨)Ù•c‡QaUßx†|OÑÿè ‚D² žCЄ($þu«8úc¡~~j§ÌbˆêýÇ@ÎüáÂÁZç”Aýoxù'wªøå÷ü7ÿùßúÂΧ[^>ìD©~àí2è²é=@®—ƒ"R$x]0|`œE€[F†"ªí³œI—H::r íêP ˆ[r8mʹ‘‹T5[þ.ö:yC»g0| ßͱ:ầ ËÆòïFâÕüÎ / .ó’ Ï<ÔËÐI‹"Š)o¬÷Ýé–?0íÇù±Õàön¨hw,ÚbZbÀýÄÖ{Sîò2Ù;sÔó·¥>ó\‰?+Þ}ã!Ǩ4¶ðÆNÿam樂OîÅÔ5wþ@°–sÖ/t»‘˜FsŒG5ÊÀ3¸r (\ïQ)PH}rç-O\>ç¡sGüÏg×?¶Fg±ž¿¡äÅgïÈóíðËoHL¿dóp‘`|è0|tƒµk‘Ê]ÛÛÛ €Ÿöd³AÌ7=¼š¡ÆS(óƒëxf»4Ë?xÌñù¾½KOÂÄotÂþEç?Jã–o}F›GáÂñx;âÕ ¶ïpÒþÑXz1®ÃÞ\1¬àåÍ!X¿Ž(⬧œXöÕ«™¿NžŠG ×¹ŸTuù3‡ù#$3ïB§…¹C§— íRT€F0§¡?"§ÈËH{u©…Ö`¼ä(ŒM=BÙ½êKN cö9È mÀoŒ­´"…öõÒ ÀQ·ä;4\A±åÜÆùC+¾á»„'+Ãp”þ(+‚rÊFç<à–S“j/W !Åþ_âÛNž‹T6ë.«õý¡kWê:)UK¬3³µ92¢¨|‡Žó$˜äÿãêC‚_=˜Ä"ÅF Û\Qª¿ËE”™ªî2k‡P3q~¨æ€vØÅ8£qø8ØÉ¥N-Çã÷çwÐ>Ö2ˆdݶkùº°vF©»œB[X&U7Ì+×#U'P5ŽMø,÷hÞ.êUú*Y€Sïxhø›ú§‰^^®fDÚPèÊ>€6ÌÏÐy=ä¡ë/¤'¯6¶>ë‚HøeÙ6¼9{™gᣱŽ9ÍY-ä33“yú:ïûZÎͨK“mQaØ¢Îr1ÚLÜF kd ù•8¨²é3þ ÕðÈ6òŽèPÔsŠ“f“­DÜÔ™£Ï:©,n)Æ DÌ.füè¢EÈrôÁÚà‚…™*ý²XQÁîØ*ljFƧd¤Ã¼J̽1•¿À@æœ%|‘qì¢Xó>“þ§HCc^—`8Í=Y‡=,czÙ?2yÖdožÂ²g`1Tþ6h¸|%îo¾5ƒ§;+ÿò—Ñ$æÉ¸›€ik|©ÏÁ*éûFðýû‘¦¼1S­œ¶[ &ú*>ž­‹ýö³.^ÿg6$8Q®ÅÄÚ÷EÉàšãÃÚjhÿæŒü,•GתhÂè£Wcp‡¢¥óüYxMms^È™·ÄOçz^êi «ËYa#ìÝz°…°ÿÓ-¶Æ2"ßîÉä\p'dg—ã…!ó;0}5o2ÁELE(¨’m²ü†q‹Éþ_w;°a•‘!õ´åY^Ú,JdQ ÍîBjfÚ>·¯™?•Ý)jèóZ­É%'é‡ýû 'ÁCÏ€ûRcñ=Æj¹®K4ÍÀ 8â…–øRæ(àÄ2¬ ¼"Ô¤Ÿªë“q²†¤i$ŸÜl]<ø©ù(#œdsL«‹eQHTÕšÈ(Ä \ç›·ÕÚÊÍ 7H…’g5ª † †¾›¼úêAQ—÷…ûlO¹xý¯—SE+Æö'œ_íÖÉÉwãŠcó¿ ¼÷†CF6ÓþínÙÞ~µß‡¡ YýƳuAX‘8É Ñã«Í:·«@P=ÎPæÚ⯣µ(*Æ&iÑf¤oKwoløÔžñrôqGJ¢„Ï×{²a6$øO»€žÒ·Lµk$›‡¢±qê6¥¼²8Ç|ƒlb±Mu\]¤1ÙÀAVmBPh¡WôÅÑ`ҤǢ)‡j{fÓÒ•mÚžn V§¯7µÏÈÈéXô€I„ù9@Ù¶dÆpz¥ŒEÃÒyqcHQ ÛtMž3TF¶SÆÿÿY1Ü<úé|=ÄRYÆøSß?ÏË‹­ñuÕQ* <ÜN« 'ªóÇüóa$[ –åmMb* RÈ:cO2ðú7¥ SÕż¼„’í½Ë˜Õkñq¤UÍ[0ºüõE,3»6ÐFÁˆ_À«…gÚÎWiáÑV)bš\Êè]‚N5~QÕ·¦õyûí¯c“MDž¬ÒP’Ù™äꆺW&ÞÕƒÃ8¾›Íej›‰Ë\i áüèo!àYP ßüïˆÎÏ`nŸÆ\ÕhÐP‰O¼§ì¾ !Е²Õ¨x[ Èíʤ†¤’üõÅ^Ýgõ´PP`ÝÇôlÙ2륦z‹ì¼¤X/ÐÞ~¹×\?ù}ÁkWä^[aXÇC ´©WW~¸àúÓe„@¢LúîšxC U¬¯Ë¹ ú¯™¸&Ü*-A/ò}ƒøýS’ù[z]ø/\ä÷‘ÖR?(àx¥é};¬'}‚ǸÿIo?®œ×²÷)6»‘ë}I¦…ªYä:M¿dÏÊ«LåÖk–Öeðfi) kž¤–×p‘ù>¥˜tE#Lí¨†ØíP±îÈ¿“y-ê蘯håW!3°ÞƒðlM›3qÍÌ“’€ÅŽºàÎ7¿YsÎ7¿yæÞlÃÚÌ—Ã’HÜOÇÛÍŽÜDÚ‰ÍO&pf©©4‹+°½”mW¹Úu–étÖÑ„Zø¥#õ&A •6Ǽ“ªËŒÛô˜æÀ¢ ìÜJLvÙ¦y~,wY|žÔX™I²~SBSaÌX—ÒÔ¡êFYõ²ß­-{‡þŠŒé£·Ž ”ö¿{à¦èÞ½eïÎß÷¬²6ÅZ‰[÷oE„ ±eâ&¤‘…å9Ö-wÜ@1߀e lÒzç5éþ¯nó'@Ò¸›À§sÉŽ ®?)Áõíða*6 ùÔ¹~²,QÇ QeùëEçË+ï²x¯¾ŠÌÏý*[•³×Ñÿï¾°ͳíúG<[V@L¢;¨þ«ªÐNq¤½÷±¦üvðˆë’²(¶Ê%^f?`OïŽÂ|õClìv_?É™Ök8Úƒ&ÐŒ8ÌHðpŽ”ÊFomÚ®v1Øá"ø´V(óå\ Î9ˆÕ= Ý`Ný²¤»Ê> þ³6ÌÈ—ÈÙÒÂÚï]i¸E*²–/bÒci÷<Ëî th®‘›Ú­#øÚøjb’0¸ÅÄ'ò¯·‘ðSn%¿ ›ƒ2æð’$O³ÞM¼Å–f/Ò–éS¸[,Êv½˜pþœ‘xÞ3]ãHö€£S÷9‚#^ÞôÌ÷íû7áÎÃÔ“a¥_lpgS<Biª]5º#¥f؜ۇþü©Mo$^×,À¦Çußi‡™ñ8GÙö0^£ÝiŒ±šÁ±—ú /«ü*Ïu’,bm¦ *rÝE~áƒÁûM ‡Ê E‚¨H5š'uô†&ÃÌ/ y×_*€E¸sÀÕI¼¦4ÆO°Ž£}ÅB‡õFVZ’s쩺Žºhâe3úÖ²?¹[»ò‹ÃÈ/êåP3‹ !½ŠX¥óÐ¥îFWÚû,¡˜ 77ÏšââîáÞÕ†¥­U2^hN¶:^ibŽº©ôÐ$=Uà·M(dM*ͤLo»OúympgTpj¿¸YZ¦5‘˜)QßË.kä‚5„À½/Êï+~æIÏÏôëwPC6'<…PÓ<äC¬ÈÃþÅ@<ýÝ,§ûnÆ(Ä$„£²EÎö''¢ó !ÄÀqŠ™ÒÅ0´ñG-ß½kXUçµOBb/§v3g<“µSâ¶–ìé^m&GC†ÐƒJX©jQëÁ[¼`U› Z‰¬Âì¾}S øPÚ%\¸»õ[ÞŠ©J~·ºŒ’Ëså!cÓäˆó…vû1š;ñ[PÊ÷SZýíÜƒÔ •yÀü2p±† ©· œCƒŠFÒ’W¼u\Ó'DhÍ 8üb?GâïÈ“c‡›NžäV Y‹n6ºÕK=³¢6HµÙix1–tÈñ&¬ùÝÜ)@Q’¨„Ivœ­þzÑù[äí 2è_Ô „·‹%‰©ÉÎzòQg©Hé”°NZnÏîrÈ À¿€Iÿè"]›}®I§5ˆ@ZF¦‘ošx)¶]7úL(ÁIηnÊÇDw¾&IÕÛÄékÐýäÛ'åÿü73¿ß¡ë‹î‹-ŠN·"Ååö¢¤^^ÁNrA‹Òδ-‘Î#ƒØüoi°üQ.~_£ë7ºÌÿÆó„Ý:räõd ÍoÝЩ©7Bõý 8 "V¢=6q$åŘ/ÅÀ³ GRpù¨‡”‚däa“/÷˜lpÐXd»š<Ä 5éês%ФTwÞ0¥¢á³|--[ryäl~†Å oø Õšf‘Lq(6ጠB9ê ,ãÎ?N-ƒk!XfqG±eɺŠ-·1?ù]³‹Š×°q/34=ZY–þP¿¸Ñ÷Šg:îOásþ9)ËDÝ×o‘¦ÇAûI¶¬}•‚Ñ‘¤µWçYçRi ò`QÿXgÊ'”£}⬕ý¸"Åʸ@±G©x³’4$:þ.í3GúQ橺ù-Exwr'?ƒ&Wc•‚€<òvëÿ1ìÙ@ÏËW#™åÀPøKn)¿\Õ} kºC¾ª{´¡0µ˜ëïøÐGéè{ÞbÑ6ÐQI˜ÎFDõ®ñû|M†2?r×3ü´=*ÿ‘Ïò– s`g˜£@ ¶åWÈ,ºÆyÞ`ó›ìñTÊc†¿;ºñA<®±W õÜ,Áö–)฾ÛÄ y{'€Ú䩯Ã7K ¸NÀ×&ø•h„Ô}›K²0ÉåÏóR ¹[Š3¿ÒE›{lŠEoÕî^ÝJ~uã6ÞÙ þŸ%cÅ6ã^ˆX4]Êþ­ùÛ¬’¿ëëG:«·‹²£Ú ùÙEj¦GK9=]Ü ñßE%r Ò©ì]øFzÚÙšÚh,ËÂyð:HxŠÍŽ+ˆA‡‚>%߯@\.Ùþ£uزjЩvÒíÙ'HN‘ãZ±!:ØÉØA.ýÛã‰{GÞ*(?⣯\»Â_fº·ÙZ{ª8v`åìy‘òÙAÎxQÔÙ~ ÁI±Šã2\ÎÉ£ë ÷¦ƒ`‰y‰ÅŸºË‚ÚŽeãPVœKÖÁêö6óÑ"4dô|9·šoqõæ(X8ÏìN´ÛC13ñPUàí·Ôn'J}(‘4U…^§%(üœ’/ÇKšÑë¯EºA…åØ}1‚ðшÙ^·£•7ÇÑ‹®!wÝ< +fäËp8;à3®_Üs‡öìWgJPúú¨£ â&ÕY+^@×jÉÛø†Šwpá逾6ÃÛü†›DŸƒ«2ÖÓ[J»ï2ÉÈÊÝ ê#›9A?AH¡?#\AÞ2Ås÷Ò\Ÿ†Î=9fµŸ9©ÕýžH£’±Ö~F ›[YÖ#ã;(…‹vŒ2£ \à—ʹÇçú£ŸÑÿÿ¸¯ŸãO𠬩&1ã{´>›|OPýdÀ•°÷Ÿy?W;ño76SRsfÞSM‰§«®¤gÌÑŸZoìì¬4>‚„þ¤ g_óA}gÃ,@[Ò¾ý“8³_ß`Ð1JüjXúÁ™7žË­´Eòßñ©ÿ&ÑùÅ.r? aùgñJä΄ 3tËz¬+ÅwîüLxmà,¼Ä¾²¨þ,  ¼ ¾î¹Ñªt>ËŒr1´n]F Uƒ•NœèùDö©Xoën±Ò˜ªÚÆ‹aÁº ã 'ŽÅÆôB3œæS 6`X?^¸Ø±-áŽÍUòàè7„7¸yž4TvÒ³ŠÿKF½b¿“2$tÈ0àÔ7]àˆ±âY«¶ª¯óìlªÁCÌXÎÚî0¬jÄ…‹Ò;¨¼±n@ ¶èt W{µ¡ÜCöL¸"È 4+òÏÃ\eç´œð&Yÿœf[x ®.Y„¶®QJ¾Äè/œù%ƒRêªH·f†¯¸B§ˆºIlú>Iéo÷òthÍ¡A ŧ>ÂŃH¼ôæÛ8í¦)Í¥í¸bÝX Ù¥Ocv¨¯C“N9Oôƒ'Hv4‘œ«‰¤¢ÖÇàþR•)hÇ%ù"! iƒµµÿé·sŒÁnóÊß1½þç8ØÞJõåW£0êÑLc!ÌõÄ,†_§°H@Žúh­ݲ£Áþ—ªÒÙÀãžcõÁ˜ý¡Ã]±’ù¯ýOèxüÖ ‚5?‡Ì¶ö‰Â±Š¾‹Ú6¡%–½ "po¦ÒQ¤Õ2#ô’äê@pú^›Ù«£ÿ±:lƒÈù¹U&Êa@R÷€_G}n‘ 3ßòº#CˆÑyR9+×2§?þò‚΂ØtÌ;h2)Ï”—Äî•fâƒÄ‚Æ8<ÔzæÇëU›rú´‡ÌáÖԂ˘’beê¯IÊ<“U2*4U D„9¹ è…÷ï3gó]!Ð Á°Âˆq$y™Ã8<±TÎ)Fé\FHU²¢ï{`!7:ÖûèRÒØséj1_‚Òv« þEE¤bù©½À¨Ì)sy\x MÆëŠŒ"fÕÆít•'}’R‹eV)LÓâ!9Øz†€–Ôa ,"‘ÇÂf¾—ÕHÆe¢6Bi G½œmªö[ߺY+¢«•Ré»›èCäî¥>”d;äp«!†'rzfP¤ë1f  å! Þµs€³[ý¨›ÐšfW7u‹WƒX/%zA+UBYRe*ñzé.U¶¨üV‡é³ÍŒ¡;†4iñÖÚ8pÒ#Nzï)«yý;¶~e–Ó?Hî˜cê(Hçqw>„•Qâl“¾,ÚY¹ÈFv³H')Ca*zO>[\é˛ȣ‘¥_«¥5ß.òªo‘¸eM$)ù7Ï'àr^¿èü\$gÝã=¬ì`ÅvÝ]—Ûç`e<¼¶:‚Tê:Õ{6Áý´1‡c,ïQ~¾T_?f,¦‡muîãæÈ›ì®:; €ÂÑÎ?õ™·rvàS« ÌKl&Ì29K*¯ßÎa¹CÛæEÿ/¼J3œÁ¥¸¶Ñ†#  ˜³«Tè©ïRϸDáã£ÏE&ÿûõ¦~ûùÖeÁì¦ã–´ð¿Ú+ÇÿòWj.u‘¯ü…*±•^fö˜ábed³Ñ‡LÂÙ³Ãpª¯ŒÌ°ËYrʸÄ8vGN“Ž85¦ÍñßacÖå%9ÔWãk$þ0ϳ½òàæÌ(3-›äÉ¥¯ÁìÍiCphäÒ£´=‚&¾È¸Ên„Ð \íMPÒ)„Œ<vÍ)Miêöâ/7æ Ú‡_ÌØB ›A}†t7áZ ã¸É6ÈÆ8g07CÀ¯ÄU.ç+Þ(‰Y¶r!íù Ä­±æ~ï"¼¯‡)üðAz´Ë4Ò‹CŒy§¶_acêVŒ’Ù³ëåò;eð-†Þª&2tmê›0r§X²”‰ðrY2ôë9µ§D…ì,`¯N¿‰ôÅm*fØ€gF±³éå0iÏÒä?½HI˜“¸ÚÃzzÌ©ÜÓ%5oF+3s-zn}ìÅŸºŒñK©0ܵžÞöiB÷–i$r—§†ý³Ùð`@nÅ6š\#߀ÊWáüE”¸Ý¾ÜæúekXgu- ?N¨üã Žär¦8‘ÙŠþôÓÍʇq£è²ó7wñwKË>Ș¦ö7ÍmÁýˆïo®á+¨5,ãLê‚IHbeÞVIé÷צ¾›P]è0Üaêò×·A¤ŽÑød¶:< ;Ûy6þ®ºPdY¨u–iæ1ëÎWÉ ›7Âã^jÁߥæ \¾?Mþ›¢ó·è?|º¸#Ó7\9G±¿7fðŸøúa$ä^:{urš¬\ ªGIó$¸¡— 'LOQVV^šéVð|r v<Em„’Ðx~óuY[6hjŒÒ»öo*­ÈX—Ÿ²@½0®zsµ£ÓQRÆã’%ºñ`4ôàh$^¢1Û+ã~!‚gµphbÛóIFìþæàã-È4ÉI¿À*\1ñ¥‹y z÷„¾Ø,°¯¸ õ-¿ ¤¥~öïпÝR¥hÕ1Z·v òöŸmð¶KËéÃânŠ.™*âD[íÎW¾‡$2Å¥Ÿèù!Rñ„0°Í]¥ësÒá­$_—» ¹– õul9ÒÚ,D ½˜j>~«±ì)S(p„Gí6#‚Îì×|ªø®n§D¢­ÌóÀˆÚøwbP*tŒxŠª#í«‹s4Þ†· ëWüŒÈxšëb!/ÿç¼^àhU…ܹœÜ+„–•ï`~ZEëà&.Ó›p– ºwÐ(>÷ðîA‚:®?Г>Áèb™ý >0¡ìÁÌâ²[ž£\ùbûx¹[·"¾ˆÍʯ—kº %ô&w /[„ìkúÕ¿kø÷úþ_ŸÜÿ®…êu«hÿJç_8òøÙ/Êo¿cŸ,ê¤óù+¤£~Ñ­ÙÎÝIÓ»¸X)¯|ÜÙ"u}˜P½§~0ý‰Y63…?5¾\³ö”à Õoºߤ´“ó§ß?´üq¢óeœ;ß~~.CÐz ¦ˆnÈ:ö`rG6h½p1Ù³ûõãó›æét~µ)#š³ €ÚÑ¥ëäÔ¦{ÛÕT„ì´³lµ;t¦«„:”%¢Mßàjp@ãÊ¼Š¥§‚ÊxÚ`dèlyÅ]ŇSX@Õ“Š5p}Þ>=?:ËI%F$BIͽA ¥„j*E³‘82åCHPìØpЉþñÜ’Ä.+(üšSo· ¢Yáu¾ýžFa,§Ë-tð/Œ‰ŠÁ©Ìo¿§Áî)JE!¡§ãªrY_8]WVÜ,v­jZù_)WT[ß3º±ÜÆŠâ’ ¡\æXp*­o•Å Ü*Žl“X ㎛N˜Ž­æ-¿ÄÚ×s}Íú¼êFó0.:¯EuZ¿ò”]†ìbãS qš@¯‚\¿ -zâ” òÁÖYRÖÜ£áeùj!…×’g³G?eqÚµ‘ÃÊ¥}œãêÉ^”%ˆä}»«f:ïd—wm›Oï¢LÇxA– þÑ‹H‚ ’ð?wëù‚á¾=² ˆ2HjûQGúÖŒü/³ìaÉëvÙÕy®uc2q8Ò£ëzБí1n~Ø{ôgú2Æ%­£+›\܆ÑÛa³65—$¸å.A+8ë n¬T†Óºýü›W‹Å,ª#%]oÀ+Ý@Œ’¨ƒ,`8M&ä4[âKpøÈÁ¦iOùÓ­3XÒýQ8N­T+~²vèNÿ$w§}€T}¨ø)QQÈâüSòÿa%Sw-²æÍ-»^BK߆ÌN%K ˜^JÇë2W²É{^âfÅ!3áVÈXídlKÜtd6HKQºÜ{µ•@Ÿ0u•¤‰OFÛ²nÍ­žRö­C’^ÆVœ—ý‹U ¡ Öys¯}/†òÕÀ@5¦48DéjùªCÈKÒH4•µé=)´®Q³«ó››––üçŠéî"Sn~Xà’(’õÁÒB ÚJ˜8iWôÉÏm.ËË«5U·VwˆŽ# K¶¢bÉ«záè«tÆöÕlN—ÓAb¨BÙhõôåÇ$T: HYØA)éëøÕö/ߥ0½ÚTÛº.™Jùé>ª*£ ´12ÊÈg†¥HÓ±º _a`â •Á™wãÕŠÍ~L³£ ÒÔUnœèŸ—@œÒÉ×*Þ󠇨`ǘӋŽ.0·5¤ÆÞG¿áltÂnêDÓÃ1 1C²„ Yò÷£dŠ''äÛ<Êþ‹i ºZÔ¾0ÖÜ,£¸´¥9¨› s \N“”v ã™_ýÎeþwDço?ÕÐúÜ—©|Á,èuŹåµàBÐÿكȪ¸ˆ¼9ŸÜ·² af3#ö_é0NpùÓ v{ŸóbN Öaeà‹Ô–ÈNLjGƒïO„rñð’ÍÞäÊ™é°Ô]aÄê€ÞA”F´ûMÙ`"˜KUÆíÒs[’…Ãká–ÓŽþ§&]˜OŸT4Õ,¸\ßþ™C¦)»Ÿ `‚ÜØÎi ̵ ë Là,[¶å­çŸÁ`ËI+òþUC ûWÙÖô™n_Y4ÉÀ"ëK½Þ§áˆ.ˆ½TM…-—ª™~zÖRc±˜n!­à K?{NNû„&ö–ûž¬Œ:ß¿½Eœgy!‘oªÿö‡ÜzŽ.,¼Í}ÔÐ.Ζsïø‡VO29•ïp2Ø!·l&•8bš;ýáÛs9·A(È¡V…ÎÔ/,DêÙÜDxUӪס±ëë¬aÆœ#Å ß³©»à©ÏÑC 7æq+hx¬êÂÊ— u˜CõÜÝP½èüº‰Xêÿ ø'àîø¾¿3k ´o5ømç8˯¡"ùË!¼Bx‘1ÛpÛóòpGýÓÂØi vuΓÓ*Ž*¤Aƒ¶BÌ©wšgt‰™Ñ}lcàÅå¼GBcéÑǰ¾àý¶5æûñêfôØÄñ@£æT¨hòüLøþî {‹÷:û[ô-Ęϔݾ ˆïNÂEI3{Cbá#ý‹oøÂîO}íÃ~äR³Á¿Nk}%Ž…ªÊ‡ƒC gj4ñ >&÷„˜ºMø±^ýÇ©¾ˆÊ8H$êÐñu3Î&ÿqˆó’ˆû×å B¢ä‚·_ñ Q¶Ï>þÛl0&üz…‰‹ÎÕM½Ê]¤Þìe¯\Œÿ¹_Çq<Žc}9ÏÑÿ_ÿ¾þÓ_ÿùŸ_»žC‡ mú—ý¥bj ³þÙ×ýûú÷õß9ŠÜ(“=éåÄrç–ˈŠô`5ñÙ €¸—æ@ënÉÞùî‘&RyÐ. Î.]bya‰uW37Ù˜Pô'¡JÃáè’Ö¡þ%l²6Ó&V@ÓîD‡¥±1:´‹:E²ên¤Sû/(ì$ϹOi ’ê²XQgbá E0‡à‘­6.‘ú5Õ³-!&¸ÑÔH´«d²P¸J%"Úo5&®Ž4vTŽnúÎh‡ +º¬:&`¦§¾^ÙcÒ¸BKiŸÔù+Œ¤’7›wªœJÅøˆšÇNäJ3¢Ús,2~6Z¸‰ì0;o4`÷Ȇ*ʵ$¶Òyæ×za눹bÁkÿUîz<]ì„ñ +½G%Êe‡pØÕжK;M<„nQ6)Ÿ&‘ÓeóhbÃ4²»Ìà°ãŠlø}cú'4ý OþKb¢Ã¾†‘2p\ú?ìs ×oµg×°œña!ù”ØÀkŒ¸]þ"1Õg`V“¹*¨ñéùT·¬Øµwb¢`¼ÐµÝb¢GcÎÏ6rÖ„mØO|ÏÝ,Òßi!æ‰Fœ7%3ŽÑ,›½hwÓܲ§3 ÆV6ÃbPÅGñ*ÖJC ±óÒ‹t!âlKéhð¢Í¨;å|<ú^Áò¹[H½T2~TÚüߨõN5 ¨µÒäJxX¨t ¥½¼ÜÔˆL ¦Ö¾Ì%o‚Ñî´Gd&d<àÏrœ§Â,m+fVBL˺Çm¤)¦÷ÕÆLµÄú®2çÎKÝäG(êGÉóû£,œä¿ZÒñJö¦ÿ&¬˜ˆ“Ô4ˤõ‚åMqêNþg¡í!¤ù»lޝz£²Â̶YüNºAuÔš, Œ“¬Øío'ëŽ1>šé/ÜðÓ´ÕóÞ ó‘À°dÒ[:8?Ky`úcda–Á¼N6á܇Ê0y!¨ÈRZ‡ý@àÒmÕL÷ zr·¤]dÛÄff³D•Ú0çî6€ݾõÉØi²ø5à,,|×¢v§ü3[™•¸r³/D`˜h9ZW§|DÏ÷å°«Ë˹cX£ßz­hÉÛ âÍ–Ù ÖßæŠÞ‰zÆ9”~x!‹ç³Œ‡Ò=ÑM8ê’±4‡PÓÌÙÕ¡Ö+Œ§h˜P )Œ%Ag~ÐÞùS…ÿˆè|™cÚ4zñÆ”W•‡B½¾®TÈã|#S,ƒv²­¦sË*ášl‡;Ч9Ïïý䀓ÂTY;ìtG¾­s ±=|o“¸ÀÿR9û‘û°Ñ?ÏšõhhÄÑÓq€ðÄšbÅ%³ &ù†¼-‘Ø`ŽŽ26Ÿo—´õÆÝføqE? ëîÞ„+Û@Ú4x?é+aàŸþý¬ÛU½<–‹è£Ve4ßç ùü/?÷Q¸‘Ío&ýŸùXVyûûƒö‚šÄš5õG«QøA(Ý?DÀ}¤Ëb„ÕyÚSQHÑž.<#Ú‡¼`ƒÃ«ÁudB2ÓGŸì ;w]éðæÚˆlÈi¯kŠátP“‰C¬FÙéM^¥«²9j={³”wwÀ,W8 |‹Ã´¥†‡ñ%^λßï RÔ)S¶h FÎõÛ¡‚Ó9"øks` X&ˆG:‡“²BUGàæ B4` a‚¼öð‹Ñ1ˆ(¹z8Œf´¥¬R@‡_½ªÃÔÎÏ<å.mܘ²’¡¦®÷±JF—6QLÒ^~Ôoum,ÒK ùEº”y'iYõ¼Úò=”¿þ™^­?´# «Eç’>¿8K%{ÕâbŸî(? 0DZ!†]°n¶:­ UŒ§gÛjeÏd©Òºóô’¿O~%@Qáùñ5Ûm‰¼tÖRJÄæT`3MÑ©FÄmï„{5/û®Qû©rýp9+*ÊljW‡ÙÐÆÃceÑRñ;‚¿I¼ID8\ís#4*ÞXaˆ®Êc—Ò¯‡)JùéMì~-Y¶…þ£ã‘Âån÷Àø0i!#•’nuc»¢}»lÀßm:©·h Ò‚!pלè)AOa’Ä~jŸl\5ï1‡Ø›²É¢Ê±T¹#æ[[X€·^3„ ¾w…G)ìSu°6á…ƒ!@ ¢×n³—ä=‡ù'vü)¢ó›»:©ÍœwÔ:óoçx뇔“öŸ°6&}¾Évµé€ ¸µ­‰‰oϬ=Ô„Ž‘« B|•Ò%|ŠŒ. 1ùƒâÅ^¢S˜†m0H’²õ$Á¾¤A&¯Ñû^¶Y ë6½¤íî\‚ÿgî|þaŠ…ö¶·E#èâ:œKÑ`ÖΜܾcAªqâ­þ¶PøÓG>ï6‡Ù'ßú÷õïË&P}‚Í`~¸A >FX`Ã\`nÕáûZÐ|±1 jy åÇ2jˆ¸Èö@ÑQžƒËi·O;Ñ^èº?|áü™&âÎ1 Ń‚U4°¼A¤¤U‡£–_±Ú™Õ ìè€v·v¡N1méÈJ}ÛËo·m”c(̳ëÖ9( æKÏŽœ1$ã*[ßp‚| z•Ö«@²Æžž½FBÀY¾/‚ú|>kÒT»¤`-ZÅ»Doñc ‘ ç”Øgu,vÐdA>LY?}8í´ý— (<¹{M¯~/yÆGb½:oX|[š6Õ¾¥šõNú›°Ž—¡c‰7¿Á±>ø0ü£åŒz¯šSBø¿¯ï¯öÿ¤º%AÊÿ®ˆÏ—.;«~™áûUªC±ï}Œ¯À}›gÃÞ㿪ýo(¨ù…}É?ëJùO9ð‹7ðã¯s>‘ÝrlÙÛþd¡bÑ(hg` +±@@XdTÙbÛó” yU!HãXnƒT4¤¼!^zµ1"˜Žá¶®o:PnhGÿ§<áå˜Ú¨uN™ø³)¶6,ýpZÇuª)ÓjÀŸ^Éa²ˆ*‚c«É’ƒK¨¤S½˜½H‘f°ú_&ÛúØìЂ³Lªh‰u’ÉÊà+oB” ½óýR)[‡i©\“Kˆ·çoˆ~L “þYÙPë#0gǰ©ëÕdCŽGó4*Å8ƒÊw$Z.²ºM]¡a ±@{žñòaÑÛMP]_¡gõ ÷’ª¾Ò¹Ãg»ƒ|yéÙ a1ÄCçämÛào´M<…~|bÐxÓ÷ÕskÞ´rÙñYv »òÌð¡»Ý”[{è©a^Íæ¢y^ýéhñýìÌ^ÍØ©ŸÖƒ ¬‰î°‹´Ê1š!?cjÌ­Â^ÅfàÑd‰:XÊîtÉž&d䱯ó/ëÄo½4fW>;¹ƒògs y ÿGó‚Ç\sœÙæ˜Ãô†(àAçy í‰ÊÓ4yí¢ŸÏ õí6Ê!Þ«Y’<›+MóEñË"=G3ƒZûJè‚K0* !RœºRö2ñÿÓá8h~CÈ ° É­LŒ‡m>ÿËN¦ì£ çUkuž°0‹ˆpµcCÆx÷Såø™Ó“šyŽná_¨ç)2oÿ°Ç9ë¤/Üû’8"Ghå`¿GŒ¼v}­þAÝÐÏÇ„HšÎô¡îh˜cÊ€C‘¿o;R‡.ZÂæ" °No)ŒAÿªi¹¿ZÄyua¬üƧfùíÏDzié†P¸L|J=ñíÍŠ)‡ŒŸíA­¨Iñía§æÅüÜàÓÛ6[^o£ÿ}ŸQ;Aâ뎽; iæXÉxÝ…[YÿdìjÞôZ½ž+ËýJäôµ`l8ˆ ߀ÿ° VU‰Dó#•¹" q­érïCåø áP#=ÒI”c§‹S•Sq¯0~³$ï# ÎlBW_”à(Ô8Á_ªG¡q¡užö ¦³E™]Þº~!Öí•¥b} ­nä™0Q3šO‚3®—Õª¸´¶¢¿E3ÄÓMp>úýøPE¼Ëà ¯O²n;¹cTò(nß!GóM-ŽßYtþöo `×ì;e.ŒóŽ¿qšGé3Uú‡g7“ÑNO :§^)`£"à‹Ðt»TˆˆÎ˜(Cô˜øáïX˜¿cãô{>Q©î†µÛxiä!JÚ!¹sŒ °þì4žÀH¦[Ÿ`2ô¬…7—ÍÐ| ãëpg¦ùÁì!EоM9 – Ø{àÂÏLaÖëÄíÄÁù¶7wÞ›\<·ÊÈÚg7ŸýêRoïåÉ|éGB¾52½Æþ"½N&§Õê3¨uÚé8ÿyö÷#XAP˜]Æ=ßíˆÙA÷i¨LÕ2 Õ@IxRû*Onà¥âã„®áÏë5„ïL{Y3§xßUåu Š]«vvkO€þìtê}¿¸¦ƒ1˜‘§zqغ"C¥îB¤ù<“ EzÈh¤ÇÝÙ“•Þúºìë_Íí¦¥­$}„Ðvë*c>Tý‘7)xµ¥ÝB—µ¶ËÌ[æ¸EÂð ,pš±Œ\s<ظFï'BOW?¤c§«%ƒÅ ŒíµÒ‹Nc©ˆÔÏBaÀ7Ó j‚jìî3i­N%Õ ÷m1-™NqÄ Èéõã“S! ~Õõi†-^=ê™UoU<ˆ-wG¯< XêhÑVš3iè”eë,L:×UG‚(`„É’,„$‚£{'3¾‘ã/µÌ¸ú”nPQ?ïàYÙêÈÕ`¹FÆThk-2HÕ•*œ|Dž‹q(†GŠÝBÉI:Y×±¼sHæ¤ÙÁ!‹TÍ£y޼–3<ñþSY`Íønj&»ô©1öN†¨ÁæÌë— þ7z!’aή¶*×`ÚКô(bè@ö'd±ùx“(—Žcc¨nž e4T„gY|V€ôÔ"/Göeôø:ïu@&´—ø ‡°SÀ+^Je­²c¶ƒE©º8Yã°XÔ Ë¿ÜÀÔ }X¬K…œLXsÕš8=P*‡LßÑ"Õµ‹x¨>µžSƒ«’•ó¡ :Y«Y7…`\´)Á4DS7Pz hÚkŠŽã–Cdk¥Ì~ë§ d¼;pýÚ¸‹ ª|¦H9Y–½ö–5ÖªGçrØEºn„ÿìÝaô\Õº8õ0A/:0uýs©ž`a­4½Ðÿƒpè þ[RmN":p¶Àu C|«£¹e\È=؇ºOÀ(i<ã4oL¯É,^{‡³CiæH®?Á)õt òŒ½D}7 âÝF8ò‚[Ñ͔ µj4ÿ½r‘xÂ;Ï ó51¨Ñ㙩Ðâ° Ão`ÿRnXŒ OR{Ù;>æ”AÝ¡‘ò2T†¯ÞðÛ×áwû ´7ÕALŽV¬ë&že¡ãXØo÷6±÷s%˜¾]ÈN…vK\ƒc Âä”̰…Õ­Ën›·\!Œ#tŽa¯*¥¦ld _늬PÏÁ`óAo º<*qŠ¡–Y}ó!ú^`~Ø7‹lÔôÿ¯,ºïLö[Uâ¾d³=i˜Çeð×8ª£èäþ/0 ÇÛFÍ_û ÅÀ·g§SEq=µ ˜Šr¦cü$ÒàŸ_§Ô×~ª—¶èÜ.0'ÏíY‚Å1È0;(E!¾}ÝÀiÄøÉ(?_Ž‹ñ…‹ÙOhìß,vÄ1¥þÖ¾íS}1AùíEçí'Bá_|3†Ç£ƒÏ/v/óÝ ?¬óæM.›kov¸²”©v]ôa$Æš{9í¤HVáøæcGÛ)ùvž{w hóÒ\»ñhŒRsât25hPÅ0—]e{Åat}î–JI©d°x×XI›¦9V¹ðÒ¼³ÙÒ'²^–Ól½|¥=šƒÝÍQæCÔD~¥ñ, M–‡×£ÜÙѬè¿w80g;™ÛÏp•…B,ìv¦Á ¹<ø س)†ïÊj¤;kÂIþy:4õ„ÿ.ªó¥{ƒ“M¯q½m/«á¬JšFƆ~ ‰ŒGUíRE`«™ÃA7µá £ò¶a„˜ØÉ¾}Pé–áâ7y¸Telö—¤ö†u³l’ñ„¼ªq|Œýòhx;âù¼ëÇ™7ƒÜQÎsÑ1,õêƒ0à¥ãúÄqIBµ±vOÎ$Nv‰ÏõÕxíïÈë„<œJ¯|oê@׆Ñ+8Í`3Mâl¢µ5úÞ¯çÃ;G`Žó;Ãs˜£¤DZø”çì¹ùdŠyƒï³  ßí ŽÔG˜fhsÑz¡QwçŠÚæ™úTã;Ž–Ü0˜Ž%[ãYrV4©6ð˜hx ¬ÏxuõdË]üƼÆ`7£Ï90R ,¬Šð¬A@?¾=¨R¾½ÉJO£ÿûåµãÌi‡ù_9ä‘gðiÊ@êRäëuzƒçdAÒ§N5h¨«QÏX-1}©LýZ©­]ݬŠVóýßLÅ5ÖV–ó‡‚Ô,¥/íÈyíçPÑåÃÂ*{å º+Ø2îLw2íâáá±—DÛ>&9d>‰ÏW\¸$`ª/•#«Û)¨a5_Ì0]vän/sŠfúõ›×^äõàGú+ÀãÊó½ï8ûÄÊÞQ ¦%–Yøµá€›ñ¬éÜŽê*›Åe$ºuy;ìc“àÉ-4/7ȉzIþ>i9ëà7Heڻܨº×wo¬@ÿ´wÃ|Â7AÈg8Î(gfyË;"3ß ýW¯ó;‹Î¿7î°¸ÌL•˜MÜžvÛ~ãÓæ:êz'õØêCh'¿ PìrCºª%¬ÞçDuàý €Ÿ€¼é–pv5ðz½`1pþã-á9G`CWâ½ €G; Mx¥ilºªWð\˜}®˜šÞ-¼°¶…骕¦6¶79î0™FÂÓ,v!¶’$bô™“¼GQ”²2¹!RÄ€ïÎ&–¢bœ~ [¹X(}ot,ï¶E~5Pù\ðØ:§±p.C'ÇL™lVæ²LP¿Ê¨o+¦$1/0šªWÕ^lŒtÄ8Y®‰˜Tè±+aPŸ¥=0š×â 0H¥åöC&ÃxFîæCÛ® Jbí›HSSô@­ì2'@Ìo¯ !3JRcÕÕqšà/eþ 0ðê·'øƒ’ß0ªÄM@Ðï57¾¦«ÄM!ÐPÐñÜI€%®øÖ˜(«ÖóæÄ æ j²Õ§ŽhCÕ0Zœï'l€Û‚œÆ¥×2ÓE¥÷eöÐTa¥p¶†˜ jÓ‚pqk)6ÒCÇ09åØþæ=Où-¥½“1GL4¬¶`/“†¦Læ½é\ªÑ7{™a Ç`š3K62**Žh¥ § •ŸÔÙ­*&%ƒ¤6O?¾^]Ç’;j[îpï~¶w~Ë+YqÏöÛ`æòe,‹ùm;gÇÀ—x4ýëÊ·êÝÿ0n{¿‹«’$õýÌêA¥o¤V œ³H Dô'Û‡E‚÷å‘¿¼æ£½†J(7ôC.‰ÃŸeŸ¦üçK÷èLà3úÅUæ4ˆIoƒªól{HøÖÝØi¤×çbc"?»§]y7k ý4›[ðFÕß}âügEç¿xÓn­’¥4¸~µuèKô•É-yŸÆX¬soƈÖ<ø.ù†ÜþŠöFw@Ü”e‘™Æ“ áøâ4Š/jòYüÆûѿѕ°'œ»²äU©lâu$àDÿi_—Ш}1¦öˉó ÿ9—·ruž”º6 ²âÀ*Ó«Tc|±Ü ¿í«I®=V- ,V9«ƒpž“ó#©GVõ°aAïãœÆFÚ"¿È®˜XéZ+wÓCMž@±˜iºÀË©‚· N_Íih;gX YaJ–Àd14å®ÑJFêþuŽÃ§4»|oR$ýÙÏ£ùð`Ü™.®¬€¢ÕËžÃE».‚4BÐ=Gùª˜^xcŒ1i»Doèë+O²JøÎÈ×yZˆ!u¥ÃßZ¾ w(<^À¡n¾MÛ0ã CÖ”Žê#H§†`E][6¦)SW_è^¤sÍšf¼6¬Èšj– µVI@ ß0’Æ™ÍqèI·V ²eNSJ?\¥hÙ))gÂÄ™”^Œù·£¦@–šo?"€Æ²@¥u *¨1ò ÜÜFH¤½Û!ÓÍDFÔR9Ñ€è; ÓF¬ëfç)„ËQDg”˜½i9äeÆXíõ@ž³åf†ëš(2`ÔL*‘ÙS2ôZ›(›D©kxù8Eª{® ð ®±"¯ÿãäë¾Pþ{ù¦ŒÙX®Ï ”RÿǺW˜×v//Ò†¯—“J_«×Ãuh-x½Çr™(Ú•Ù~ÆtoMî9‡wy?—(ÌI¾Ÿ"zlªŒ“S-‹6‡–£Ø+ý¦DSÍ ð½ÐšU駺¢Y·Ö¡Ád^êëzóåÞì|7öh>3ô0.Z'ó¤¶8…qÛÃTù;“ªUíOpÏìk2¦º–3õ+túg“ÔÃU‡v¡äV`ùókàQ]ëðèÌŸlòÊ+Í+AfÿG²¦¢oÐ4²rÍÈ’\Û4â¨5 ¹m¬ÓGãñˆVN¸É²)‘ Уæ–'ò°¡ï¥©BŽþò³Ú¶EÑÔ‘ùìƒHæt5@;1\×ÈãŠ`ßMf°ò8Øß•¡y$kf<‚!‘5Ñóµ-ùÙìõ9–]”¨úH2ÿbÑyÌݘÊ$0DZ€ÏUx#6ÃýO?û 4ø·ëãRýy «¿t'³Û kc¼Ûûs}šá-Ç{ä ¬®]T®c8盌!ÓdİÇטú÷ΕªËÃʫτ{ôÿ¤‰ÊÑ(ÔªA±Úþ(Í/0¨Í¼¬‘úàÍn5C¼‘Jü÷õ~ýÓmú¿XÉæ„~ÙWÆB;8Éà‹›& ˰^O÷;ö¶Sé‘c°£éwcŽtûè1iNLÝQ=ØUE\)Ò«|õòp™ïè͆B®¥e2czôWûOwŽ´|¶ÁwtqTI þœÂ.ܼ|yæm—P¾{Lp]Påý7Z 9I ”9êøë ¯ã—^™x)úÖ…ˆNe¸,V™2„†cCkT!®ÝSÒ›+iå²!ëÞËg)ð h,‹Wæ®)¹c"²æ)ÒfFîb®”E9Z·?$€o8»°¦’™ï0\Ø©–ñì!mÞ:Yokª´? &JÏo«W†±)2LdWÕ,J,A#^"¨Äõë™B.Õ wª’¥j¬Z ªtç"ð€rVõÍߺ=xûpÏ€)VÚ8S:ëøÐ€IG²0¾ OÔ)X,&¿ŠG¿ûŒxûÐ"éG®œÍòã¶Ñûx:ã"Âÿ6‚ÈpS´ÂÎ-qø '¢Í%ð‡¸G¤#ÎôÐõºö.ð}ãÊaÍô~VŸá¶MÁ¯Ëï4Ö¿öz½Ž_Ôzù›)xL·çf¤qfz¦ìõ?å¼ßÙø:³žò·å€•–Æ'+ѧ…5®:ÃÂQæ$Z}rðÆóè@jÍßÞÔ?gæì? :¿+£Ä·nÚ­ ù£¸—ý™>¸÷Ùn„U@+r¼ÑøÚÇû±••x…#škÁ'CQ–Ã8´÷kä?õ÷—ª*2Ã~8|ÅœÃWV/ãSÃògÎÍd­ÆÙýmšàÏAXÖ­ôDv¸sÛ0Hž©†£ë·O68ÅÍÜËD¦Z‰ãÃrLHŠ×zè짇G l^ÒoŸ9ܺ9ØJB¦¿QÌTrïmo¼[ú}±r|”= ?œÇ-0òô…ÌgZz*þ|4½x,w#‰©€Å®ÎÏ \½mÜL§WßÙZ{ê^º™Öz¸ò„3×¹áòƒ}Ø1U¯ã =t'ð}ñ\¸-½ªˆ¹°W‡y®‰o.z5OúíuЗ'6¼ÔÉú$Šfv 7 Í¹À%Z1þù. ‡0;ü°‚T’Фy+£—¿€^µä…:ot‚ö«1qœâµ\o†Ëì–Âý4»DØ;í. ;å0¬þèÌ ±Óº‰"[±$…:Ê÷†'Ꭰ‚Æ´zsa烡…èËío’··b.´æýÐÍ+æv˜ìJt“HÎ…ì°çøÀC… ±áfå"~¦ÄŽ÷ªzÊ<©.„¹æ˜iJÏCfêyžñ¯W®²¾2óþ‡~}+%ç{Eñ'Æ„§ þ¼'¥Nxÿ¾îïÖøÿ•kípòyqÁ½cpñúÔSî/}h¹à_Å"ÆgØñŸèw^<þ(!õu{˜ò¥3ßY>Õ“ÀÌ™º»ÿöë7¾Ó¿ú®jç_­ ÷peþm¢ó!YØx©Y›oµ<û+tsmÌ:¬êá\ÂŒåÅJ¢BŠJ‚!uêŒc–ŽêH¢›7ÎEå ?WέÿëóaÞ•»c&1Ubˆm„§½Ç°, 668ov~ ‚6>ÆH²ìuNS9ÕKÃ+©#µ0_Ã)¥f ï7ÜEÕLõzm$©§ßŠˆP‘ WÇ2¹ß¹çêÂë§Áãj9aI–†ñ¢#ä±¹‚Ó7Ú¯ÔÆOo<Áñ3 ™æ@ _¬Y ³¡`jÙ Súǹ¦‰G¢c~ÞÈr8ñ9½ÀsðsÞÅžRai6¶Ú43C%cªÿÑâ)W§æK˜æPn/ÍpŒCùIÌŒ§¸L”‰ŸáüÞëe¤ñ0¼xù84{Òt|ÙeDÜoñ)?¦ìB?0ңǔŒëÑx†@°rm€è}û”_:Ö7¸nÄ%&ãNÉ^ŠB½xN\À5{7ñ”šaœghðÿÑËÿ˧½=3;x´ÊÞ`¶‹žO^w²Ë¼÷î3,úªÂdÙ%VÆC– 3{!* í„שý£ýî–àœ¶o? BT± Ñ2'šd˜ì–=GÁx(Ô9ØCñ²dë^ˇl% M‹†•õ¶ökæ}¤Ç‹9U"Z–m£*ÍwäM‡If#žˆÂéXU³ž \î{}´ÂÜVËÀ‚×ü(ÞÇ…š2jIÁ„Uq™¤\ƒR±LŽT˜‚¢:it(•*}¯¬$ºª˜‰@DÒ0×ãë224§³ˆ|²Wö@—ô€k^Iƒ¶Y2¼ÞûMª˜Ž´%Ž&…oK`®“¥³ ê(¾!‘/ÂJÀÈ,éNÇÙìJ(ð~Á™Í<©¶97ç•Þ^uWÈ`Yä®&súê Ÿi.apº]Ó^EJ*·`cÂ`uKíN–ŰóõZ›2 ¹2¹Ð”‚+WìN]w"%>\?5TËΑĠöÑóÊŸ¢‘ ÊÚ†R<À³”úœ95-o?}vêQï2$‡½×‡T®“¬ªí‰9ªÉ€Œ{’×ÔSqr-QʼGѰr8É»ª¹ûv ¾V’ªNÚ©2, pß³.ãBÉg¡ Ðe!hÃàeJv^êŒoŠeÅßû,ê"­£n…/Ê,Àñq À¬ `wߥ‚h’ŠŒ{uäCdþPh6WIÖ-’ Áª‹Ä\'¸Á;Ì‘ñëLôëAýtbpÌIC@<'’þ)»íÅØÚ@!Dç³KU«`T?ÏÖÛÃsW§{úPyôö¯ âå?ƒ>é—~ªÄ6•­€Öñ¯uža°5kúpqæ¹Þá×ðON¹ð<Îp_=ÉX}µ¶óŒyàM?ÞC‰&í HyÐIò^šê.~×ñ¥4êYq)zᦒêŸGü áÓ‚°ÿ3#4¦A,ƒ¬…EÌa1±H 桸&D‡³›î|&çhv@/‹6©¡¢jÞü7þ½ƒ°˜˜O:í8zX @„¨¶X„|ã ^€úï&¼°ÛäRÅ4ÏÖ’>î’½U È`zñK-[™ªÝÎù¯8$"Çs<}vo<÷¥ØÒfqP©“;}~jtÄ•ýþ€·aꇛ莀™ïÔí (QñDÉ¡‚#5"‡än÷UBSJCæÿô’Whi`FäŸv2*üe úÏ”µIîîý»6áãåèh1ƒz\ ÞkL–‡€P±³»Èº^gX{‡k#BÍŸï<šhïi<€3.oËÚ@}*„½f®W:Äœý0 ‚æµ0e+OVˆ\Ô™Ú?ânG^ïÇoiÛJü|úÚ3²èðƒoEçøæ1²ƒ\åëeõ­í«Ã“ø×”rùW®¶@‰¹z¢~]OV*¶×Ú|ºœÕ§åäûæÉ7ZéžÑä8Ž}á×?ùë%Ü©íßê ö×kâÐÈÃŽÃÚÑF)aRý;Ýš‰yì¯ý$ "ÿSjìW~½ì—=³ÉG h‡»Ö±«ý¢§wüY7þgÊCi0|ßãßW»ÿMÑù¯ß´Ð«Ã×Ê¡‡ÍsÐ’ ²9ùÄÑ$ž(¯!Y³›XÌ„©ªš›‰á0½~ôõãYY„Jãw:PPWßx¡0ŵæea%äWòœ<1•äR1wvNxô;rôâ÷ïFüêF6F•SËvEv‚n4BaQÆ©¼/â·ãE˜×ÁT;_%ΉÚn’—¸){a]-"ñ±zBR ìÕq…YâÚË5ÊÅ¢‚$ÓTCbÉøña•\ÕbÀ•¹\~ÓN õ¸¨[I߉£¾€b)±¥££»ÑØ6Ô¨¶ðzkÍ!¼XωSàÞ¥å«@Ȥ#Ô7-æªÚO,Oî(†càì2` ^x°O¼¡jgAòèÁÊšå(à¨BöÆ»éSwtÉb¡ÏÙœÅCkNÍ[ƒ2˜@& Hég CÌ0çe=UÒ~$$}ÌMS.ZÍÑ;î›AÕ¤d>‘YÖ“ó#£Ô ªK Þ ùÃŽŒê´n“ÌpÂl0â> ƒ„0Û³b¿JœÂL)¢O ítÖÓs᩼DZzÁO{œÉPiÑÉјÕF D¶¸íê"¦Fy2åèâ4¤ˆÈ…•`PÛG÷65[’Zš·]ïÀ U£û(ì7ÒqrÐeeÙ({$€ýcYÿ&*@‹Ïìô†ççÈÈæuº+‘í++¼læ1±`ý§âzk½/(Žý(ÂüGDç‹óèùz@W…Þh ì<‚BÁ:áS«YátÍzEL˜%•!NWHxÐèÀldÐR Ê]ZMÎÄ È/4ª¦Ö¨í^׊zÅNCRáÌ÷ègá –œ‡ý?8`¨ ±©F¥™Øü’öbë `@¡E»¤)e­íÆ ÎþBtgè;­š 5Æ[×µÎeŸýý]O OïÞ¼¾ù{xwu|åþ8ëKøú»Ûð·þÊ@£‹‘N Ç=¾¹´='Ù‹ïÛ¯¶•5Å„lêSVrÒ” è1òg†Ÿ pú› GžJæy©€/uÕNv%åÞdg¦ƒÆWŸ/àïq ¥>ƒqî"kGuÚzL­4‡Ô;‚ÎÐ&Ò(ss2 †MˆX€ž³ –ú-h´Òj”š*-~Êçœæ&S¡¯ÐZ©8uz¯öŒƒvUô¿„‘EW¯Oœ4Þ9Gõ&Êq6@;dXo:xm”þì´Ïæø,2ŠGáÊ©#Áh¤y"«Ô1?tœÝ¦¢ÿs<Ã(‡©ªÛ'“æ Wn%¶kÉMHð%Ö‰?Æã¦~tóѶœ4†Z¯]a+4}‚´pSTK`­oQeÈqF³â³ d ¡Â(¹’þäPwŽæ1%O~6¿æ¨4¦UÆŽæ+ØGúÚ­¡¸aH]*ù:LË ­6œ`É ˜¤”*Cνmßø½ý×};b]Úÿ†AÅ€Ä~X«ÈME•4T± ^?8eÈ ¨Þ{­Æ;ß™Q% AÍ(\ýîÈŒ‰ë[7òÌ”fW#칎D¬ËwšP=gZÐ6RµÙ GäíSh¼  °”'‚U0-^ o×]‹Sˆ\Ú|ÿ˜j÷[íê!t|¾ÍãLüÆbëIÙ§;m¥Ðæ¨f³µ2°xŠ®Óõ7Ú0·àé¶ÒJ-¶®j q|o!ïìÐMžù-úˆÎiÁ¾Ó:~¦‚#>‹<‚ñ‰ÏÏY^$ï‰fY’aûõ׫wR¨HƒO&ÇEX½ÀwçþULZ`ÆAP²KÿçÕŨ}mn,‚¿ÔNùIêOœ ú7Øù?Â…kÙÿdùÑ4e„¦Éæœì+“¥‡‚vœj¬þ¢ŸëIdP€êд Ó‹$Àž7¼‚Ï =bŽY,§˜›˜FÔù¶VI†w«îjí†;šx¿Ï’Zû¡ëþ¸Zê6¤ÿ/± ãzýW–4ד°¡^„lKƒÑ ¬ÛPtç¢Ña4…Ÿ‰UÊ)~‘Säh¦½Í½cï‡ÁŽß>pùøMGÞ7Åy<ˆÓ£ÊÅÛá¾Èʹs:ôYëÚ™4}ó„ÚNkYî£þžtÛÒwsR²m=0ßÿ LáÕë-ÍÒ"{ÅnJ‰—ß?„š ÿ• ‹åÝ8þ„+ù綠g¹ð ¯áÆÒßp3Î^OdÖí+HÇâëëìf3‡ ³ï|ŠR;ŽãßãûÓVì—i1ýµ¨Ð\tþãëóËËÙødý v0÷! C§ÞszöYyù*gÏ®´õiéÞD_AË)!îÍ?éy)WjàíMÈé¾äGÛqgQOx§ÖÓš_–R_–ÂÁó¤­^øßd³ ^ÝlÑdÖ`,*^n½®„~FaÍÐß=.Ð Zeƽ!ÖlbMÌXHåe~Z—j˜ w« ê8$«tA&¢jM9"Z±òUº±B”½ƒ…Ü·*Ëy¸\~û;Öõî>0O)dœ4GÒI¸ÁZ£p"c­XŒôiŠiäÇÆ²n» NÓÄÇbŠ9{ü /nÞ«s'V‰w-‹Í„’ëÌ÷K÷$•ŒÑúÚ¤Gµ²ù•¼igÂÜF„à˜büÙT.Œa°Ó{±÷¸ôïÒýBû^VáþN³¾s\#ÚŽèAžM6Þx`QÞ€a.‚èÍ^6ô¨U^Drc¹W@…©4¿ ý 8öÕ8¸Àâeãó‰[Ë #^âG/øßH¼ºÍ¯2µ©}2r4®»¦š̰çèOœ«åõ2™Ét§Ö°ó5!%¾ …n· ]0Óö‘ .^]ÏšŒ›ª¥é@JSÁûN)FûÊuô—æ[âýÖ]‹Æ<µ5NN%êšÚS¥Ã/é`Ò±ÁxîN«¦#Ñ…'Ú_¿\ Ò´'PÙX%÷ËÓc#Fùºl27áwÜð óIð~.îV_[¸ƒFk—„CŽc$»6 ~Ú-ï’?…ì¤K`È>w· dœñ<Ìã|йú¢¢³i ýIOùT¯ž…²ðƒ.x«ÊèØÏ °“"dPÚg#íuƒò’@Œ¶kÕØî6¸uÊÃñÎdpöú1d, åW0§N°°×»ª)®¹r4‰ôÒ™ÄÄ£ŽÞýq¦¢@kô<°±¡²SUõ&†=:7F¡ãqˆ$ÀÑ!uW‰*0×,Ëù­ð.œn|ËaüÜÎþØú^ÁàQ7oUǽçgu‚"{áx@ÂÜU¦h¶”­'»~rp$Æ%€|çÓiîÙåÖ¶êi`Ñ'"ƹ×RÄ-ˆìL„¦fÂÉeׯB]'~ N„Ð…÷éX¹iË›©TjÒtð9ßÄU@VÜòÚûDÍ– ³›ìEɳ”S|𥤡²cL®Žï1Ò(NP|EϺa «g¯¹@œÿ›¢óßûÏL6µƒæÙì×ÅZ¨ˆ Ò“@ „Ni“mÓò+Çÿ³ `‡N`14þ†/¨¨ù›uÄ "p$20ÓÁ‹ýHEsO~ùņýúrM‡­ü <:Q^Œ}é2ÇRÖ‰O0KGî^ªP­ÞyªäoÑÌ|¸2«ù»"—ÀãµýôïôM•ê—P mÚJ«•ßò0XMÇÚDäªoÓ¦‚ šþÅ™ó|o¶Bšk!áХĨóBC6ÎB×döŒK:3-8 K_=UIƒñpÝœòÉyÑô¦¨«fm:¼wLh¡ ¡¾"LûnëN1»¥(Fj‡Y»£$FÝYXÊŒYœ€¼)Šx /âÈÆnŸê”óµ#×D,l…Íëò3wñ‘¦Pà{oa)eˆw< Ò°ˆnÞ£AÖºV,OR÷CgßiºÙ Å‹ Bl8Ttú¦<Fæ>ƒæ§w¥…Õê>^Ê*!KèÜ }Úÿ^>~2Ÿ¡áÕ ‰…L›èæœh>r·D!6@õïÝìÓ M½š~Ës3á« 4sK˜i ¹„beê ”{„Œ^?½UÂô(´#nPDn‰…ªU#jø=ëŒÒ £z*lO ÆPܵzLË®mxýŸÍ4އIFd[Åv„SX H—Úð´»)]óÌl§„ÎhXÙ HÎðŽO’o±¹¶·"“ô–ôCYÝVà„åø~Šeà Qœ;¡ý³jˆEªLfLd5€Ÿç¦t®wâ ‹«÷`w¦…nfÐæØ­ˆêθggÌkžñ1¼8ÜªŠ¢GÞtj WŸ.é4:¼«WH«icÇc ¸ª æÖ%ˆ¶Ð”— ‘¥ìÞ’xžÚ³ØÐ® éPÔØœ8 ¢ÖÛŠê‚áI¡|.°ÅùôØy`V}(η-üšœ&' Jê¹öu_ØìH @ãËC$&áò Ð³Aÿßo÷¶~»~t=Oç=ÝÏÄ%ý‹Î¯¥ÿr·uHüK ) &gJx‹r¯yú¥V᭨Φêg5Œ­|©¯L5Ì&¸œ@¯÷äà­¨NÖÆÈdÑksmâ!7ѺpÜÉå?šæ-ÚF€Öɘ«æzÄA¹f6s\Âê¾Lk§¢ÚÓCÛ“ƒ†æ›™è÷þ[h/üûz7cú÷õïëfi°Ôù fMôšþºÃØùè“Ø"cÕ ™ Y‹³ðL…E#Øl -/‚‹Cõ._2÷ŒOÖn¯ É#¢WÚÁh‰˜êÇ ŒX$´„ ë@ÛMÜúàaƒ˜Æv+3¿«öÑö1‹#­7T)p <aƒ3>«ô3› ÀDˆb_ ø?ºÚt°£Nvظ;€’ ª&µÔÖd<ǵ’UeÉi&ÄÉ®-öÍŽ Ͻ¢  øHyûÒüäÙ”|5‘xÅ$»œä¼…ï`ï_@jÀî&WG;1ÃÙ»·*šâ¦GÇÕ@ÁslïùT.«úG<>¢mÔȶËRúÇ~¶’‹Â©èE¼‹ÎÈh~>£,Ô¥_šÁÏ»øS 'nó/_Ã^ÃQÿéef'öpÆ €5ö›<ä<¹ûõ-fÊa€=ðŠøuË­yC|]! ?íÉ™mÓ¦dEI`ÁPÞÃ&3?[%n>À_¦bòýåGýÙÕX‚¹e§¼z©_[á—¾ûî ü‹ÎËF~÷uô+46²‘I¾ÓÌß s†·³Ü°`¹ã'ž“¤…ìW™ù´lçGZAà¨Å+Yør¦jÁ÷öðd l=çȈAkpóX"ío:CLi®„B¨hÅY uý¶ÑdîjN,†¯ µ€—½IÃhŒuXÆjƼ:vpsªtoÉ­[Ácñ¬ ÿ¹»PΡ‚TÂQH0 Ýìd–x £{—Ì-¤#ÜNÞDdl,ç‚ô“ûÄ^:ªÒbŽ÷p4 H/¨}±+F怄bFl;H[Mpúv–¤¢<¿^•{H±Í¡Øw*m—è'°ÇX‹×nʤŠäzÔ3cÈ£³Ñ‡ËJòz—cÚa¶ƒÜ†¢T¬êT‚†¸Ó1‹GÜ"û'ô|@%„àòEW" <ŽãÕ™ páòüL\h3ÃÙœ‡Lt¹ìó‡Hñôp5¤~¼<-ž¿ƒÎ°yÂÐa' ý Þ}qè;kú uðd²¨5¯‹ý­á•Ò}ýäx@Ñ" òÆÀ˜t~Š©®H«äÄDcѤóTº€~íPÞ‹MÀg°,í4^@yœ!†ü‚_îi e¡@…âw·âÞ‡ƒßeÔ˜üN ¥X4¨IÖ­µf5ûácÜŸ][Ùˆÿƒ!hOHˆù-ï*=¼>›¢hRbC‰O(OVÔwÒ‚è6^t­ú:6MBÐs0¼5Ï(€új">GfÆ!JŠn©Qèoõ5ûz½†q‡m0§Ê¢È*3†-øˆCôÚuÅîó)W´ j¸Y:ÑoÜù(º‡eò¼Gôl\é]ì‡{ìæ>»Dÿm ñs‰¬M®*æÉìiÂ)¶ÈØ”,墿ÎÉÙ’ª†±±ûÐèRæÏC–ëzðb”+$³¿;ÏÑ0ÆO¾FæÞÚf_Â’nT›l*¢"ÜQ¾üØ1[KoÁùǨ°²N¶[ÌÆ_âœÄŠÅ|[ïý¼^ãé;ñÕfÙõõ†lù‘Âf‚úJJ–}k!msoÜq"ËM]_¸ÄR«í©'­M(á%6Z5ü$Êùì,è®NV¿þJþ°U‡¡Š¿Rt^ÝÄ?îÓº÷ IÛ›·¾md†¯R˪1Ë¡¿ë_KÎEOõ@=l÷ìF="9ŒWê4þM@_ê=p 8Ø(1ÖÌ«[Ù'FD<ÌÉ€$=¥·¬ý[¬ÔáWï7ãË—ý¬¯gþS 5KÞÞOTÜÊÍ=ÆŽh̼å[Èí»8ûù<‡»§{”êJÞ¾9l«ßzË5ú?(ɽÃ"YÅNÞRôoöò+Eÿý]àÑͺ[0?B²?$Z F´~S‘lÏû|’4;T÷ÇíÏÞm@Ó³¢Á{_ßb¨è4`ˆ­z{]Ã:Ósd%ïk;ÿÊ¿²kAw#_h3p¸Kø€ãAÝvåÒ³ìùZ®QÔpÒjŽ*§úwÙ(HÙ¯â§À:uJ,Rü›f¹¬¤«c\nëÓ8˜Œî\DÕAO#Á~KÜÌ*¿‘`"½¢ÜáäÁNz #ØÌ1lÊÚ¢¥'[C+0Ž)ºŽe#cÎΪºõîXá›5ÚjQºË#ñÊ& _XÊNñ¯Æ‰¬ämS‡¥‡Ž€ÞF'袮 Þ‰»þ ¥„#–(b Šå)o‘ߺj›Y 1pÓSŒx‡%(,Žk^¡cP)ÚM9æ`:JÀP““u#ÉôŠ+9iÈdFšš/ô9S'úÀEƒúúƒÌ‚ $]ýß.áÓ§x{Ò-H^×° ³—¸Ÿ…×W;ŽC6¸³/XD¾P”a>_»ï(TôL-/Iu‡¤ìÒ…Çã¤Òƪ›qÛA¨WÁ²eûÙš±Jå!’Ú&sB·dÞ’…–Í­/îu<%j8t”bl¸SZæØÔ³K .Z†³x:!ÛtzéAvj§ˆÊ`¦š%Œü‹]ÖÏ…Eg!ø‘T$€£À~K3©L“œ5<´Å6b² m% Ü=ÙL6…çѸD‘* Kj]ˆY¨šƒAR¼]ë­Í8oÖh¸ xrO…gj#»R‹bð@a<§Û“r¸ü¹R8¯¿n¡ò~‰º¸Kƒ]_ž–Æ}8~Þ “Æ/I‡ª¦FÐÂB.é( nEûAìŠ^«Œµ¼-sðrðÓû3»i©c‘{Éàñ¤õÑQæ w› ‘‘Ù-¿\jí,SVéÀFŽþ­J> ™øò•µ­uÆCt]4è0ê¿\ôbïÖ§­½[îš+Wodù8Ö!ouqÞÚ²âu°t›e‹| C¨¢T{¸Þ÷ÇÈÑ¢!jµ8í 9L/Z2ˆ / ÐÖŠÁ¾0£ºAç˜õ#Ç ¥M\!›¶Ø0³Ä)gqý÷¡¨:½Ö«"]7Ìý_ÿ¾þ}}ëWüY2º#+ýr–ܹ}kúzaÝûàð§Dò‰V„â0)” !Vwê0z2÷Oìå÷á¡öá:Ó‰ütCNDS+îÈ>¤åÐϳx tXʵQêPÅ@rt8º!(¬œ«as/ˆnxÍxŸtžv#ÚAÂÁ”ÿ¾A¿ þ±w;#m¶zËCô÷óº.œWº|¸£±îz(‘­Ç{¼ý‘|¾Ó¶Œ™[îüpR‘ï}*Ñ Á[iwy÷xãõî~Ï­±À:6ž%6¯Š«'H.F@LnWïoÛZÿ­Vþ‰'&Mm~0K„Ìy€²z6ëôur%i'¾À„^Wò28¸‰Ýì¹¼wiÏ&æwmÜ\?¾xá†7"œÙÞ‘SÜÏ®þÕœ±wn¨ ç[ãë¯/‘[ÜÛZüZBídD'Ì9€þ×”¯'êÕöQ:ú ¬ç÷\àíÀHËY;»ÞÏÙ112ÿà]u ”cÛ}| ·¼ÔlE6Ë .*·u3æ–Èüë&vÎñü@ß} |ßþ odöþ£ÃÜøoÿü@åð+gʪY4ž}¶&÷$¯BŸJl-³YGXs·<¸ŠIΕó¢%)ÕÄŽ@©¬É›’Š6cñÕÆU /]õ¥è _Ãç¹>Õq^î+œšM(¤³Ì”€ÃpDPÑÝ>Û67L"™ö>X§¡áE¿|mæÇØÍâõó 8—pX"4q Y^˜ÕàóvÊßXlYáK§p!Ñ™ΗtU+oüâyŠ„³»Ñ=¸Ól7(Wp¯%³`£Çkwœ¤¾À)LÔ…_Ø"'ŸÓN¡4>ílpÐAò¬:³ŠÑ, A¾hðóÄwPìˆ!iat$„4Nœs¼ x:Ÿ™/TxœðèŒ9G n'ÇS˜l/ ?C—=t"°'oÐþ)¥†Gê ôá‰|Óü"³á!§'оؼ~~qÑqPF>^Žºäb¨œ$QD_¥Ü»~ð¼xo ñK×x çÀM9÷LüòÍmäªLÿY8·kéaÑ.Þí¬{;m¼¥:IDlë98˜æ5`ê…âM\,åλ Ï~áK7ë-ðÉ^N¸‰u%˲`*ëù‹¦KÄÓ`uˆø<&5©Æý ù"†‰Ùì!ª&$^[¶ c‡Ç+chÀ¥ŸÉŸYy˜Î÷ué褤éɽcˆv #"Hbuèxm«¦OÖíðMù©õs/jR¹9ËH$ñ7_|eÅ®7lX.,nÏ€ï·Ëß-:ß%)~/iÖÅ:'?~ÌÃÃôÌ ?S†;ç"6Ë„†‹ràÖĪ(ùÂYÕ­9W†Âñ9ªâ0rÀAª(0mù“$€~kb;—݈´€G`h¯Ô‘U6Po¤¤­ã¬3²]®×‰tNt™:©^&äÖ–.LâûëûâJæ0®È;%o"Ǧ‘ȯÅÛGÈ*ôçÆ&×Y½& ?UÙ²†×D½ôþow^ [>iÝ·ê:p¤ð ¶ŸEžjÛ”ZÄœCV-s¦;Ì/†Ò³H¥¶‘Ëojü”úpž»·ÐÀ¤I>õ÷¾äg:ó½‰ÓŸ n×S¼(SÕx æ5j21ûTøä Ÿû^ìK†í./ ' £ñ œh¤v „ºÈë˜5tàó8)ð¯.ßËd¡Ï î®íe%I:ÅduÀþ5ÚÑ-ˆkWGØñr6÷fÙÔo ÕÞÑñ®’Ï.õ™µsú1 ‰« ‡È˜=臻6­[aÚ(Ć7t“$ûÓËÁ† pkµ…¢„š¾­Êó Ã†çNÃ=ðʲ‚ì $Üt ÍùB¿åå£ßøÄ!ñBQ1ƒ©rB[ùÃßy#x9÷‡±“]O°‰(¡jÇ÷¥Õ¶W{ \Ú­:÷A57ÀH1Œ÷4¿ëˆ\Š2ŠÂª¨èMe@fH46ú†#Nò7Kh¯J´?üzýHŸ¥ý÷¿Äœœêúâ@>Нð^Þ±¢{À 2è/¦ dZÂ…1öþýúCW( ®“&Sön¶N(âàõÊOõ¼£z*ߎ!_SËbC#aƒ¯Y«"Kõ(Î.òètŸq¯aX:µÑî0"~Õgœð”{^þÅC5šÈù%Ã’ZQ××¾ôas}ÝJG潇Kø6êT¡“†ErWå—)[õÕZ!R­ìvtO ëÕ*ÉÓÛˆÉB¶ ϹÃ)âj¦Ï `„eßC©Vm°¶Ô³XüÂ,Ô¼Ÿi¯WUx¹ò Òu]ú†Ú…òáÒ‹9èŽ@?ïË01ÙPëÏ#2nuß);[; þè';*œq–5rãJ—[&âPµ§5È9[±å{õãç®ÛIQ*s—Le6×ÁÍ­ˆ8æ2W5™ßÕ8.\QiÒ°A”zw^©¾¥ì›èÍcÓ(:<0(qC/+Y„¢eÒó3%fð†â×&¡‘ÚËÓ>ÊØ:ðê¹6_]è¾}\Í”Êï¹tÄDn§ÁöˆÎ=¡áÃG{ޜڤ» Aa´À2“™å„³ €Å%Ô¨WsÝ~{¥¦Ž–ѳ2K‡GÝ7Rã{0࣠­gŸLM+ry=^8’ ¼EÕxµ¥ÒÔb`“(‡;èXRø^³×ÿ 1‚tuX:ÍÜ×P^ÝÏÏa‰,Œ_ß݇ýw þ»w‰•fî&dÊð¢ìù‹Ç ]œßcZ1<â>lá†à@ ªênfÂ!Õ2ƒ3ΜÙërïÛÏAò0´o^­é£72Ød‹F00Éûu|À:hyaoÇγñÒ/5 ¸¢ÒÁÍo~¿NTc ~7{ÃD³^¨HŸvHäædÀ…jCÁ2o~,Àeá¾5\`ÙÔK5‘ûQÝétÓg½§ÜŽÈ:.ã2wX’`Àîz–V»5ÉšyÓÚÍMY¨û`OºÑ´©kf7ˆñå8{×Þ/ulC½=]„lZŽ»”7%:ÌìâK¿:z:Åñh©}ëÀ'~UZ_˜;Hî%5µ–|q³gɸu“Ú,ñøoÊ=]4“þ‰MGfïÄì¶ðf/_ýÇÒÿЬÚÿnGd)—¼iú"·}i]?Êz`Æ Ý—ûZøÒQMû²F1àU)n£_Wõœ=÷ôŸYŠ?¨ ¼Lu’a^.Z5’[vü€Y#üa¬¾YÒÊ}„àÖ*i0a*ÁO„£ÿ›&¼o«CÏâIÚÂk¿xî@L ?_•lü.áÚ\HªslKÝê˜h̤Ýïx¸]DãT‚ÏA¨‚O†Ä„.%!‚ê÷à#z„«UtÆÐ8ÉÃê$•ê=ØÈH0?:s³;0^]BÃå}üA»èy¡MC§{R¿ßCþ¦üãŸpp~\¾ Bc¤9b=pé@lƒèìjëž ^\g–-bØ4úa.ñ²§Ùò­Ý‚f¡<èàç/ž=-\äNÅ_³=Ð׫1cº;aíá¦èÈÆýF9cEÁcM×)0±ºh·3ó6m‘k§L9¼Ý¬÷œüVãmG.&E£ áeîÍÚÓnLy›y‹«âî†Jßm¨îÔ} ‘xÚ¿Slèà~©0ô…#Ÿ‡mÝBúÍLÜÇ{Ff-"ûËDçÿ@òhžt¼55ñ3‘ýtó“ÃˆÃ»ŠœÉÚkDf —o+)c±KëÕ8íÎýE'žgà\Wœ½[œ´~Ï…°¸ÊÀ=ìW ojj &¦^n<]]™¦~Â*ÌgvÙ™¿6˜}Õ"=ŸÙx  ¡5—Óä<â/×úåÊpóJˆõõæœ&úGsX\:vbƒG5æ¼2…MÞƒ (èWã'ñŒæÖçU¾õåì£J·Jnq÷2G›š™äÖ΄Ÿ"iäÄWl]Ì_óbVŽ¿Š¢  ¿<:Þ—q_KnÏ:hïÕ(<ûCÖ¼£H—à!íe´k"ìôÇ«KÛ4µ6íûAÄÎv–UX}` Félrû8ßäh‚E¸@Uê®ÿ»‰}c<>ˆà¿ ¡žpg¡„… ûÕÞû“ÛÞûüŒQ¤øÆ”âÕ;xÄPs)x¸™563øQxEÝæGéC˺RÎDWQÁ´ûljBØÞ´Ru±Ø:߈AÃM]|²ßˆlu©žÿaˆTÈ[*QŸô0ºº’a´sœ!3MúA‘L‚9Ëî¢Lµdxåp3.v¸X·'"y–@ÿ-_ó³Ô¡e)±bàÈp:;„¥¤¿Ü€p:_%gÆbBßÀ„dÎÈÐï ä‘÷¾ô áÙ!j)jDHU{"àšd 6Yk£3PøÔPÆ—=)F,Ç`‘Ý„ '’sÀ½mVòÿε¿,ÿŠL =­ájUWÃzQYÍ…V”é¤ ^¤Èšn¯‰GÜÚûw¯Àëe†^x]Cñ!3÷Ü*ÁG—@0w~Ü£ÎvC*r‹Jãöêu“ÅÇJBá7»^k!z%ž+µ¾¹¹†ö crj&TL¸5$—IT(p8¼®Éô×ëuö GæÓ¸³äùõóg"»ÈÞjɪܶ–¬Þ.â†]}hRÊñŸÇB‰RBó\íÅÎbØ2gÂèHâ®./²ÀªÊ«w³m6í4úŒ-”ßýÏŒä7{ŠZDqoBo¡m–!ì5ô¦"i;@¶¾ñÎ]-!û¡3ƈn’KB›>è|Eµ£oB”üúTå|°Ûd`òS÷)ìC¤û®#¸ç7AÛç©I›Y°“ n×ê/º_EñêÓc›KÀí¼Ëb©ÙÄJPשú.ĵ £‰A@ŽÄó¨l”dî¼¥pÇÍ“ Åý‡(eLÊS~°oç(b¡ÏžXÕ¿uÉîü˜°}f²3ö‰Î#>· :ÏòLqêU9ÝDÎ/´Z§®ã‹¬¬Çq‡ÄÌXŸ´‡(òÖI˜&ë\ F¿skvÜY˜ÇÀ0 œKWu‰¾XÇÃ{ª½mq½;€uB3JåšT|˜½²ÜXÖÓ®yqLÑ뀡ÜHåxéØû5ÎÞ{Ÿ~ÂüÐ*©ûÆ%TÎÏ­Úï¼3_~Á_{y§„dÁ§±°çå÷™_'wv,oÊÙ/§)4ŽØ¦5é1˜w$5ãÁ¬EÙ0÷Ÿ¦ŒçVæuØž®”¿`?Â7/àœ½é<£:xq¸Lãç‡ïBåí.ôÿ O Ðó5vHQM‘Dø7fr欓ÚìÂå¹ÛÚ*¢˜|"él¯zzhŸòÕ5|F9%Œ~ä4D)àÉêý õ Ý(HÂwUu‚«Op äMïû÷#@ÞÍX„Ùõuíãz|o°6§©¸*ôæØ\X­‘ÎÑb÷¢ç}ãÙQI¦|óãl¼ÎÁ÷«¨ÖçoŒ“—•Gà$5·¦ž\6—.¾•…C×DQ° ¥i®KÀÐÌh=¿ã8èúmhÔk( VÙ–l v ×¹f9g`ÖÆhÿ›N°ÿgïmÜÖuQ»ÿÿã|°%/’í$3vuž{÷éj3‰cK ‚Àíõ©“ª…ôÔÍpH5ÛÔ.ÿ`ŽG_m½¦Èé,ËšMª¹3ôäåÄWáÆ;£V¥ÆÎ½ €Õ4{"ìS‘›ŸÈÝœ¯Ù¶­@p—¾O(pyÇ wëå\ú´T_‹‡l:È rô·yÖx#' c‚ xûoZ_•3Dzí¬ýr%—zA©H~)½¿'¶> DÀŠ_a©uñJ]‚[‹:732ôù"4&F&ªU²B=|4Pï/Î|¼ëLhnÑkµ¯ÚÎ_‘Ãfª“ÇR§‘6ÿäUÜ„ª,S}–þFìÇÈÃÉ÷‡·ôm¥ Ûaà‹ fØZ»Cã§ ØM•¼|¿!ª#Wõ”·;w!¥Žq¥ ›ŽÆ¨Ÿ=~CyžNj¬°R¼ã¯£[îâ=az^ERÜ HtÍ ™,á})É׌˿úÄÀ‡ƒöÇ­;ANþ¢Iª°®Hn&á·ØÆ}ÌpìÌG7®È b.À7ñ‹7žý»«ìˆ*GìÞ«r¶9­mOÀè«W¹ÜoàÌù7/M¹e¼òûÔñÏü)Xͬ4%òïçHñTCìßÏÏÚ /ª`éÉüŸ]ÿFþyá"¹~ÌŸ~΄¾HákÂSð{^8÷‰ššˆ ¨z‘bÞ@ægVÑ_+:ÿ=gÐw}’@(UèÌ\…>ô¤ê&»Q ×ʪ3²Î‘‡Q ÚçŸ_E–? _M/àBþü•{ÿ-—MÐP[ªÚ¿+1Ýðe7·äØbñËb@ß™±©Š,~݆+8ÇýÇä>e6ç¯ÀbOèϵ€ÕB>}|…7aäf°á Úfĺ@}|¢yf ÎÒC>»X m»Ž º¾½ >ÚQª®24ó]‹7‹mÈK³«Oj¦MÖuüz¨äL¯)BˆV{êXP{®œh«ö-ôá6ì²>D2>æD¢¹ˆ¬p©ð» wæªyd;;‘$DkÖ¦amŽ¿Š½Q¶»|Ø!´ yÜ~svS·ÉÉÛïD:!cGÇ2BMGºùÁÖ§ÒÏÙw)ôX#‚‡M÷Œ|Û3"=M¿÷ìÀ/Óûj «wtAý.Ó3æÆ)‡îWÑÛÇý%U•à|ëÝÈÿ³aÙNtIaN8/{£Ñ¶ ý“±L7³©ö½TéÀ‘ õ{x5Èßù Q×;lŠöD“v-Zq‰@BC†æ„‡T´idHèTÛ¸þ¥Ø¯ #k!Tœ™:iç½Û«öOèè™×Œ §™N9¤Xñ¬)=‹é§Bl¶}° Æc9ß` {TzßyGI0ÄHX “$,ußr÷Êø½’”¾:¤+Ýa-Q07!ëÖ0"GßÑ|ïÍ:r‰án{h›œ¦ÇHüVprBdáAÏ<ºÓýÕÇ0ǹ¼Æb.«DIÞ(*]·È®ÂPëÆà6„ºzQ˜N”âqXܱ]J&_ñ0zjy{} U$Žà¦]ßrgB—՘΢ßêñr±ÍãHvuB4±Tv‹¤´Žä_M7‡]5#ó0Z)ŠcT Ç7æèD)QR üWãã‚1y¹Gâö¨‘oš›[+¸‰¾ó®äGàÂ×v…Vµ@Õ?xGîDLÜÇ57½”B‰¥ocåz¿ŠïfÂ*âêj“êo%|¿.…ï_ìKÌoã8ʺL #ú1ªd±¬é1‘†+ÅCî|ëû§š+Ô5·=’ï t««æäk^[ÎŽ£Éb¿ÂžSzÊ|@Âq3íÿtT¢×•C÷ÓÔñè†ØÔ#˜ÌëìTBW¼lÛÖuÞy®.W® òau†p‰PQ‡ÁJÜÜÈïfíæò<÷饳ûTO7§Ã7q÷eÕ¾4ø‹Eç¯TU'˜DÑÐ’ R¾±ñ€Ð¥úlÃ"ôê°Û(ìIu¥„ Oj[±+2„- ¸ÔîéËå„©8$€$ºp;}uïç:À.üÁ'b •d«ùš°Ú”ŸèTÚúQ+¢ |ÜþâšlqgÀ®œ%KÙ ðä÷6C?>`¿õòß#&Þ)*Í^†4‡w†˜§DˆèEÈN’wº‚.jŽôÀÃbÄ+­NZå¬!$xì´mën½ÚXV¨Áÿ}Á˜ä‚xÔ tÈæŠàáÿî‘.¨ò!t¨Ïbv¶­qr4©zàe¸!G÷”c€€:÷Óëí&ñ’ÒœÖ4‘ò_$¢hª¶ZJ ®‹Tvù gìú¿jë ª2”^=žÃ uBX„t ›Ï`•Ïj;¤ÅØ¿×ôtÓi£|SrŒëé·Ûa–kα™°´m!~ïj›©·3QìËŒ×!V:_Š@Wà]›CÁ“Ó#w/²À:b3Öõ(ÚC·˜&kôDz›Õu}~ÛW 8EOkt ¡ÓmhŸ×îØd$ö(c^³"+\–꟨?Öw˜4üZçéæbAŽ–‚y9UåjÁ°¾@è´€©ÀÉ^.×¾Çpyýh"‹#ݪ«&ͨ±çßè}']ç…ØÓ˜,QyàØn£kSsuѵ­ÅJ$‹Šçé ü¼6hUMøíÄÙ¡!ø ª‡?û*¸*='7­ÂÎxãX1np[8 Ô¦8D…µÇ~då05HPÎ#Í÷ú ‹×:-ÀõRmüÝ¢©R!3ÁÐçÑŠ6¬øòKTŸŠ]h¬[ÑÒw`èØcȰ¡o{ÛTj)pu9l ¨¢|°¬¼)iòì&ÝXÚ›lK{Ût‘;·s½)—-_°pcàîNºò7f!Œ[ƒ×Ÿ)ÄÞ­ÿMÑù—#•UöWóI>Šyßðóö§Æ„ä#GЯVÁœþI›"ÔM@pÅsz²u‰Rª±¶—'p.Ð&¸|E÷U”Iþ¯zs½±ÑòFé 舘Åá% kTóÝ5ð±ªá¿ÓøBå=|ÕE¿ltÂ/¼®ŸøsÁý¿+ëîýß$t‡»x·ZôS úóѵs„®ëÚ ªA™Á¡ùZ™ÈÞœúA#-1WÞÞðÆ'^øV_lïNÅ2ˆs ñdë’nÎ6sÈ5°Óq¶ ¨ÂÞ±°9-;ÃÑV.¨Ó o2+×!ºËÍ^[§¾žÓê$hÂ0Û¶An:40F)ÒúìîH)q”–Šãö@;ÐP{­¬Q¯vèTAN†ùž³·uºàvžnmÁýä§ ™ ÁV9ìÅîX‰ÁÐãqO@¥?|ž˜Ñžzÿ õôæë^€£ šút)!“¬ÛxÜÉËAzû¸–ÚºIì˜Jøû×ÝNOù¼¶PÜ]wü€2QºÈ?_ñè휌±0Jºáà±bÒÿžÁ¿ŸËuCúÿßÏ¿Ÿ¿oÙ‡|áøÙ6ŒlçÀVâ©Ì£â³P_’ßp»þÑùïJjðñµ±˜Ò¸Ó‹àÆ”íPj½ó¶l‡'ÌOh=qÒÖ›Øæ$€<Þèÿó¢ñòoV¿ˆÂ`¾|\¡ƒ_ â-Ê}EÓé EQ-×6“?P¼µ@Ÿ¦•r¯¬TP†Ô×séowJY̹£BÞ R¤¢Έn(žd— —÷ïSZD`™éüȰ1,ó—X|©J|ˆ"oaŪ2§Ô‘–åÜd1›ÈzàB6Â`©;Êú¢ŒDùyêùNĶô;ºt!+vEøBªkU.~;aq¢¾õWf—$Øþ0 Á©é”–Î A6œ}OsYc€@'“‹aë#Ž«ƒˆ `cåGg®c ãÎÎý?õ†¦N¹’Ä‘<)ä<•dúÿûX(„r‡7weÉr÷Ø{¼_†¦º¶·¦5~væ¿ïÁ´îÆnvhò‡iªv­'‡…Íô¥ ð´+¤&KÐÖ€uèñßNákrnó¶4ÛÚï„!I'…ÂÞ H¡|Â8.ƒÁõÔ‹0H‡h?uϦ!-åÑ`¿Þ1B¼L”Î(­ƒ-ƒPå „L'ª ç3¹Ù í5§S¾nøð™¥iz*åa÷,5’sÞ“­¦É1Ê!:©1fÆù¤6›ÇŸ"=PT /~4‰ˆÒ6M ¸Í[e ~‘¬øY¬ ßÍq‘'åÜ›Ýü|ÍÞ}úÊeëÙù‘/s`’ZѹtFê™]È;I º.'¬ðþ5VùÄø“YXïéEì2Ñ:±¥Ûd·oÉe1uA¸Õd‰FHæu¬ôGKfTÖÀ,ªÝÂi7_¢aiЇ®±æLðî‰ú˜Ÿ ñl=VšÎˆÈ4¸ú|„/;\Í YM{JgÊ-CÑ e¯>ÝP Qÿ¥Tþ™¤¡o"%þ®†ÌœV0ÒJî¼_VLåÁçÑ¡JÒI·?}if {Àœa÷=qEŸëL$™¤Ù#†È/½>·<£íkMQÎ.ÜgÐ×Ê?^ým„ô]«ÛˇõË2ú™'N&0æä‰·r„pØÐÉ¥°G*ÌÅ…©xW‹œ XUZ.¢ÿ#°1|<Ëù¬/nÕÂŒ„ÅÑù-0à©óË¿ñCá2üxÄ·v i^¥#‚ë¬LPo V4’Mà™ó3~E?^tÞ<Žø-‘)g×þâ6¼–Ó,g"£ûñ<¸;¦Ø¨ÃÒcw´I>À¼à2áo‘,†Ýüúž}º”ܸ3ÿ™È2Cÿ'"@C¸¡[MÓŸM©:Êùp‹ö$ý¥Uh}÷ Üx7|ÃÃ}~UÓ%~?ôW¦ó…Ù ž\ÙlÛ?C|É­ÄÇÆG×Û÷þÜ]ݳ~è­“H7ò¥¡½-¹£ó b²ŽYcaŠÀ&“ºíï^T§VU ì”në&øº½°Jè?Ø~È‘^“»Š:ï埸u7`'78­žæ) OkžžIGvÈãŠÝ'±·`Aô¹æ÷vz{áFüß® N¼p0æ¨x¬Ù^ÒWJ¸§›IÏ•«å)O´.úW9¤ŠÔ»<‹9ý–¼¡·4º|­4¯½ :Bv7„·Á¨—N+Ô©>{€­¹ öN¯AñŠÖë¼+ÇTÉO¸¡ÃDZÌÔ¾f÷´>šcˆïºÂ„|¬H´çVdê.ï¦XÐÛ ‘Ÿ1U*©k8K¸ô›¸}’à¦N-úBò ´wŠz©t¶‰"o<ù]› fc‚û؆ —ôFNî ]/ ïà@¢1\v’·<¡gj³e¡B‘PëTλ^Õ«÷ÐcðLà©y™óônEÙˆZ‹º~'·çE¸Ø‡Î<ì> GÁä£I§edÛLLrœˆ Í¡ @¦üh‘e5xï®Ç/ $¸«þ?®h¨âFsØ5û˜ð½~ÌvþQ‡Ç‡4®ÃY8)ÝÙép=›Ý¹ÒÅLº0 í&øc¢Y$ ¬íÓ‡ËF*ƒ'¡³Çó™§ï£^ Š-Ôr®%w$:#Éæ5ÁS—(,×t¥À ý¯¹ƒ»-T!0Q’}³\lÉ[Ï·’½~ Í¿s4¼û…07Ý£¨@ÖðLѦËz sJ{›Ë‚ô.u Èí LZ)ú&µ+ejºYLtǹ@´¹*>5í¼Ì/áµKƒ–U8þºŒŒFqÇH”w' —»¾-JÀ2'ÎL¢>[ýk_Š¥:ãaAœuª%/eÒ§ú¹°*:ž’§{˜o}}ì.ÜI³¦ÆÊ¿Êz17àƒÙõÛpê/÷)Ô*i!´êÌ*䉙±ØÑ„Ât¹Gªçx~ô~‡³¯[_UA\š¬€BjË.’à²Ð1§nês:׎udøáÓTæ¨þ¾5|îMþîñ=V+€O—7/þXüú(ß‘Ÿ§@yýÎ'j¿Áq*{ù åe‡Â9ó-×éÛpÝlÚêáÓh—NÒ†Òƒ[µPŠ.DIŠ{urþÆÜߨÇ;ñ»Ù=Øõ‘Ì穊mRA*ÓÔ¬ :[¾õbÁè´älÃÁèǶmvXýòŒy«C¸„º1’ ˜'•¡Cä6)?ÝC kÿüœÍûIÂ5G.C_<6&1Z'pêMsÖ%»—ëäß¹§üåé4L`óo<‹ß üÒÖÿ+oŽ)&;ã`´o¢ý¿ùoz¿a¨(üw%Z¿°Â pä¯=jÒÈ7¿ìÅ/g˜ø“ÕÕ]pú¨+®Ù_‘Cò/ß¹GXÞÑôZ£`?w µÉôg†°ÿ~~ovòí{Ä÷9ø!Æ÷·­qÜ÷ÐöøáÛ÷Füaéd+jͼ üœågŠÎ]Nøò×½y£ª= ¾ÀuȺѮãÔµîå™]•wêànV{¹5ÝI˜ßèÿ•Z}‹7~ìÕð|–e&WA0ÝꀼâdðsZ‘±BÃÖØ1¼Î¥ª Id×h+¶(îÜ@¦«A¶ˆœ? .þ: VNÒÍu;¤úÈáÉèYÉ鯗Cãîý•Çà¾1–p†ªBYD ãÇñ:bá\=¶ P<èöúf,‹¦¨!ïP³âü®£2Qà‚-HÄß©«¯;rÁ_*üežÈF1(¤~è­1x˜JJtÂh}:åa«Ï¼x.vƒ_w¡·9Ж»|£¨¢_T&%~ Ûw•“áPzàh ©l069÷Aˆÿ¿]íneô2´“ýßÕè*®ïCߥÍLГÝ;• °Èo˜?Œ'bë˲CúòÙcª±õ æ^g.î$ô”á0Ì:,~ ÿP¹Âý°·!ùoÀ¶mCüGf?ºFD÷ÓQ)á0Ñ 1 ¤ø$‡ÿú 4N§—Îæ"}z{mÛÙH­zòtͯ€ßkœ]Bà L xˆB7aïxÀÀ.ÔØEH¡˜j‹tQ*›Qfi.@>ñ8â1ÎCÖúk–Õé_­zKšNs¨ìÌ€¥_&ùSlvš ‘!ƒ Ojú1ìŠ2¿è¢mñâØÜžbž ÏŽþû©t8ynVl}JMœƒôfùÎч¤ë˜My£¸£»øb½#Næã/–édMKfí¢#öBÞ½ÃOÙ}b9H-§Ýáÿótx.Ò{ÜË€Ó÷­ÅR&Þe `üÖåhÖÅŠ`Ø™K”…÷¾VØ·ÃbÐWøcbkñ™~©€ìPž%7u3’yFŽ^åÄuÈJ3ð×ÉËëU à{мð JñUÞ«Ø^9”üÊ6笱„\Ò½3n"I/†ÉªÜÓ7¡«0ðú»)ÕÜBñý‹™Z˜w¼Ó昅º«qÔHŠ£ÝPŨ«ªaYÜ9QubÑBÒ0[™÷·¡sMó=€Ù“õ|ÓWV7R{2Ýίœã(;¶$$h qFùƒUÓÊ/†B&–µÜ½`ÞØ/a°¡Š3ÅQÝ”ñ\(+ ŒãŽJ9-ñ×BÐ):oÑw.Z+q¹» ›òO5ß«¼>ù¥†Óè´·W>D¤sÖã 0ñNL)¤ÜIt)WEÎÂY#ª=×!F6J[½ï‘úl ô‰f†Ñ“ÄøÔØƒ¦ª©®’¿‡”x9„Ù@¼}|Á´†1+°ýéÍAÝYx7½Õ­Z¦$X½-Ög~~†¼“¡¸‘O4^gm¬T7îî~„½r­s”¼Æ†òn@?7  z ¹òCøâà˜õPüH&d ±Ž½qÉ7áD4z‚‚ h­Ÿãð‰ ec×g˜ †¯"T­ûx ÷ì:ðAôü·}ØýÿÑæ â Ìg ˆ1fÜls‡ñù÷€Ê(ô¶è'å!z?è0„q›m§:ùôVÔpF^ЕµÅcYÞÜé^æ™âÞúí5 )Xˆp¸Å[”ˆÖè̺¨bßH¨ ;Î? ÃÄ:¶1°ýïDÿ¥÷×¶„J&…V!µ³ ÓœÅq®G»G c% ñ¹iuU¹€ŒhÃMÅ0ÿO!U߇.Péþ+ÞE…cwfÅy A\v(Ž5ô›qT5˜5aP 1KÌ=Ývÿ˜´r‹ÈÉ"MÙçxŒQÿuÌý¤dé,–ŠQQÝ\ ôìçÐTyyÔç†:¢ˆt ‰ Û~ÌIo(šãhºäb:Øçr˜¬2ŽPu¸‹“NôCXÔšwNÐØK‹N`ú†7ªº×säQÀ»H£C}Ö«®?0bq A(Ú©ç A¦¸‰8Ls٠ム­¢;¬2Ü f QÈ™ltÒ0JJz©ßëbý¬½5Zaæ1øÂ¤¡€Ý3ê7G(3çsbÅݤG¾¬ú溉2¼ ^ã™ébâ"@¤ºjoÃRtjt!2$‰ÕWëY“4$L‡Äâ sYÇŠ?gÆk1hu!Äã!Ä¢°K‹Åœ.;ìINAÌ ÿ3ƒß¡Ÿ/$†*ëAêÜu݈…¦9ç.]Hø³>Ê.ÇÄáxÖ‡íU›¤Ë{w¹ÄjsÙÍvç§&­±êÕÄÔ„–ÂÀU¿¨”é³?JÔ§¥^9¨N·=˜-* Á>á¯X¼µzs•„í¦Ÿ“8_/< JD]D¯zfyºâ¯×‡*[KA^F$¥Û;_¨U_„ËV¥Ý÷«¯:Ù(> äãÃ1¡]wûN~¹4}øÃ9ù_bH& и9=ä騭&½5C­ðè$·L5¬ ûH`b•Å*YJq‚Ýg¿4nPú!é¨÷§Ÿöðõ;ÔJ{}?Æœø5ìßÌ࿟?øá£žŒ]å7ÞòõºQÞÃÑõ)j:}4›ãR ¤7W³¿ÔÓ‚­RÎBÆ ¼“Iñ™3ïžþlÿö âæ«þÈuƒ'¢â%-êôxJ^«‹ühiÕŽ©ÿ~Þ<ËRü8ðNþÅ.z!3¾ùâ¯Ó’Yµ®ÃJí ÃÊ èý|¸ =o~P˜Xåɒ! F^-ʦôÝ¢óßžŸÑqðòæ}44¦4¾~qb÷xÿçü´DÕRšßŸù·ù5 ޼/×Ê~µ²«WTÐà:u¼û WU gìWõ(í{°Màü{ŒÅ‘½»!sk{7€µã¿[.vÞ5Bïþ€ ^³m±­){Ð}k•¿Á`Éþ±ü†é¯‰ý¢/QÇj’ÀÚ@Îi)¨½?<Ö#å¡Å.Ñå§ñ«ÛzϧPªXo2뢱ÐTÊg"ÛǦ9ÖCv}žŒØÖ‡ìp Íl&.À¼>Ë}tç•.Ù ìÌPô¢þû©­33†•`7Ë š€uîcö9˜À5 ÒÙÀ|Ã*QÕ³¦¨ŒºF„_Ïçü„ÿôaûL—EûÊ_Z>—³™±OÅóé8F.RÊŠëo|uJòဳ:†€’»죅ØÓ üÅâýÒ ù¥ÆÛµ“[‰ñK¸-沦ާ!Áµx××ÁÈl“ƒë_ò-ÊyRùx{½ý ¥lˆþa¹½A‹âߦêUöÓúM\ ¬¤-&pc›GrnqGp?hä@>ÔšÏDÕ^¿‡ë dñGÁ×®/_'þ~G¥½ä>óKàH~ÅÔȰxþ¥ùçµ›±ÄÐJ*øEFÓO-ö8 ªƒû£¢‡¤µ²0XéÊ?iBt2òBÞ¶Þâ·4Ìxëg‚W°PrÿD¶ô׊ÎÛÝé§t̸–¾¼Zb‹¶Pf÷÷òÁ)M¦/˜x"ªßûRÆd*ÊJ¶;´2à §œ&™ü‘œ‰Ût‹up•` iÛv·?qÜ=ùÞ®NHË¡®z)V‘‡æÓ¸­Ã[2å¿@¥í£Š¼f«ï‹É#§«î"‰š÷êÍH)˜ÊÍE¤ê-Ir›¿RtÞg’x©9r·_âo`V|bQ˜ÁÔ¨r ¹lÒ\ Ј„ØÊ›„Þ¯BsuBHCå¶é‰€…ÐèõÀ ƒJ|Ä©í(ïg¨š×­«ÜVyF&…e¬ñ4\Sœø.²®}¹xšî£(¥ºòTCˆ•Ók ðß¼ò¿Ÿ?¯u8¦BúóËý¿0ÊòB‡tÆßV)ÿ¤„†PóiÄÄ"w v6ÑFºÔÏá pa•m2MC0U"îØ­Á² »’ýÿBTampÈiC4ñ€{·_ ùæ§K2b<‡•.#ÂÈÐýèæËɇÐåý"(îˆÍªP©M»î Cѯµ¦üÓ´N…ðyË”é#脉äSÀÑsÂîj8®v?Û6lÿÛ¶ÿá›È ]ÛÖyuOvÜ–Yb=}ñæˆõ}jbÑu›Pm‚_ûèÁeÃ4ŸÚÙÓ:‹=¿}˜óeJñûŒï“/HJÙê‹T…ÆÅNQ5’'K¨÷ Lû|v·>ÉÝðÕøã&f Å›‚Ì":ñ¿PÝ}ûâ{VéÕ²Zè+/ß•/‰?däúAþrûýÔÑË·‹¿Ç“ßz80V,K™¸µ_–³Þ°W“‘˜Ö €Ùz:ð|‡Fl®hb­y³û®"XšèüÌ屘ø¨{ðoØ8xÏ#š_vÏ+R?²aCõú¯û7NÓE<¤kƒeúzXùƒ–ÎÍ®áüŸ†«×9k9—lšÈ‹só+ü}¢ó߈!Ù£ÎÍÍ ƒ“\8Ï8n4ž÷E'8µ„_ßX¿$ m=PvàÀq×ÔªC‰ÃyßÀ©vPÁz3ÿZ*u?{A²VHXçûtî©> Ïð‚¿˜#˜Ù¦:!­[kÖ©D„mwwØTf,‹.Ÿ½I³…G±Y²Æòõðª€Íf.”Ë«÷ÀêªDóa5¾V‘ö !¬ò\> sÒƒ76V:8K^Hø?È_œ·òx`#?u’ãT¨î*f{K{ZYgÕ”én,¼ó8ðRDmÊÛr½ªÊl i$fͲзì³qÈÀ—jË}Ý6H»b7µ¡só3¤{~˜—5"@óMäÐ5ƒí¤í<þ·ÉñÛ¾‰1ëPKˆSïôûJ˜8a]ª¸QŸì†™qç ¬wNëÞ Ìl¶­ÇâÖéÉSûvÍ2t@‹NõkèäSþoãæoCpgìA!ú÷C|Hýè çƒf ?Ò¾¸11ƒxè9Úh÷ gs ϧõ¤q¨OÙáÙlÛÿ°Á¶Ã§ 9CÙDŠÏ†Dðx…¹þNÞjì„:Ã?f¬©æ¦êaH§g ïÖwDY¼U‘q$ø‹WE¸GùyXëQº=‘€[‡ˆb€(8¼¬ç:Ý/Z$x—Þ=eÕ¬µpÿ(å›O¿sô*§„Àê2ïjНAwE­Øqbt1¿¦åô%Jäú¦¾ÖÐ3Õ*'»/Eõ†çü|ÿø^ãƒ/ԻͬóK€ëdƒ2õêóÊ,Œ|êp=ÏnÕD©”ù{<1lÜ}HO1ôµŒõ²¼Õ8jXQ) j‹7ÿ6ð)Šÿôœóß_§tg-7?v àÞùð¹A©#Ôίaÿ¾9™¶(r²0x LWKi¦º‹ÛñãÃ+ÿ¥ûUýõBIòáÞÿ»Eçfg¿ñ¥Õ³w–'®Ô—~$uù(à-¶ˆì"O‚{ Ý8:wîΖ11T#ý¼•ëëØ’ÿZ  [Ð@½I‹B÷ ƒê2käéî‚!YœÊÕ(As–›$%ª‹¢¿úÒî =ÉÑÅE-ríÀ¤ê>i2FqÅf:ŒÀòic¡x„êÚ1¿›°Õûãú®ó ¢ê+ë.»0øÕHŸÈOßžËmzwjÏåd[‹ïš†£û‚A6ê Ë:¢x‚ôäÄd•°!ùÈZÙ,fÏ«©í8¶&óõxÞ[³tcªVIŠänÛˆgɾ[·åB.a°ÁÑí »ÁâÑpúÝ è*oÞ ¶ïì‚;Ç kV»†qì4ʾ_rFÂŒÒHh-çÑâ úªïû}(n»«ÎFœ‡õ¦ü P•6¿®`Ôûs°6©žnù¢Ì×xßî$R®i%©Æâ‘Rh¬Ñs€‚¡¥ÜÖõŸyÇ8D‹6Ô(}it”D(!~q†RÊAy¼ˆrv Å0êNèfÔu.²—§ü‹œA‚"ÞóÀŠÑjVOð ΙÅL».§ò7ׯ”æ“‚¤äööÚã`èÄäÁÏÖˆæ Šd„´7j×P²ÎLüÌÕð>5».ìxÐúZLû¡š¯_¦I•%Q÷?)“G&Ȧ$å™§GxôÓ"cªKà"!M«ôÐi¥ê¯lÿè3Õ;µpÖ<=¹,æt0‘ô k@Ïõ9Ü̳v²ÅM±ÊwdÎ#1Ï…3ä¯å~‡²PŠ #.‘¸ïÊ­sÎikbé9‡ùy yw¯·œ…ЂsKX•P¬’I±µRÍ$DD5Ù¥ ÁRú_öo›]¢TJ·®æ_aì¦ÈCósÙUÖVo[ÒKNʳ¤°¤TJÝÁ@ÇaZ¬äÊšq eÊe ƒöðÓ;_Ÿp*ðGæ#7l|ÒfrCµx¶"ÂSÇÐÖ¿~ŽÃ(@ÿóv{Q–'»NÀëùI´ Ž¢SÃXÅI´10^'ç¹ê· :VÚIÁŒ:F½¿‹tÓ<Ôp¡ë•×L8Êgò2òb ]Že|·ë®ð¿!:? ow"×ÿô©þY™Ô-”—f´äWŽ6ëÙûIS¬K3{$Ã?‹ düºDyA7o±"I[˜oá€SÄøæq%¬_šÃU¨p*éÍ8s—‡ýeË Çèç‹64_×?áϹ ?/¶½þ¸ŸÃü×Qâö½º#oB%œC ƒn®·ÕˆS„Ô”i¤(CJQ\*O-}©jÑç NyvÝ©ßjŒ(Ö¨ùÒ2†‚Ôl‘û;‡‡¹ÝeˆAC¼™ª”‘kW ߆šÚLcèèêò•êîZÉvÖ¾%í‘ â ÝvAŸP7¡ÈrjîÌ—´ø×¤üÄú·ÿðF~êË*Ý£>ôâ÷:.=˜ïò†z6²`¦ุTýà ý(ÄŒ Q²<(‹Šáwù(¹ÔI†/KØõ#ˆ°cFu]iýTÒÚÂ.ðN(÷‚6§™cŒõx—ŸxT‡¬â÷)9çš§á;ëØQsÝy¤Åÿ]Fšß”½<µ&ž¬T ÿKÕÅœ]qçF{A^qx§òYM”J?|\PÕÊ’œQNh,'«ÛX8ˆæâHù#Cº—ãNÆø3rè÷6çB°|r«KèyÚ°D-5|ðˆÄTЦ.oÅ¢Wåª^øÅoŸP¢ ^ø‚÷R^\ïœ%—¼R™†º ÿSMð ÔBáѰš€8ÓØôD¸sIPu£;¿ÂËLî·*ÊæAUŸf-ÛÄÛÚeÿÑù;ñ7>óÏ}òw¤}ÕÏ/ÜÑñ-x[ðÙlˆ¬êæýXW¢(¬² Mˆ9Mú<…#Zˆ0¦— ‚(Ú@º¢;Á°SB‚¶urü½gÏÈÚ›'ñ¼õ®²^>‘§õø¯›à~/y/ÉÊ|g(ºñ±˜"‰Ñëâpñ yç~ðA‰ûü6׃Laå­{ËË Ârq‰ª±3»™ñviþ.uFEe?ÎZ—‚4lO«gõX`¶³‰VµD°æÙþõБÙwšqç>pù£®fÝ'¢|4Ú6t fÜ÷vËÐî3Z÷š2p@sÔ†=ä ®[Btƒ"Ý÷×Ûfã¡fôiÂv¾žŸ®ÎHÈo`°ÁN“Ü­“bK@˜·L€ªGãd–äŒRn+x–ë†mÃö?ÃÖ”ëvwŒ:j¸KU½e°G„Ñ„õÁRÌrÒ.š=ýWƒB¼öBpïõ¾„ ïþókôí¦¡ˆ’΀ÚnúȬҰÂâéðîäßCR`â6^=^ÙŸEZ=É<Žû;/dœ²#Vâ7€SW°¹XãoLZ?u³iΟþ†_ AðGÝëBKŠŸùþZ}Öµ˜5¨ç…0’?¡ÞoOÂs4øgÍ£ ÿ‘…ð]`•¥àë6Þ§á7^̼}¸øÑïÎÚdl¹Î â³­ºz÷¿ùŸî„ù¨ l˜ìåûOtþ7žˆwŽÊìì½xdÚìoiÀ.ˆEÀzÖl’ì·¢œïïmÆ ‡]êòÝ8{ˆËĬ…B×u›™} cÞÝwì¢ï…# 0Dmú,aŠþ÷†Ç‰öÌfŒ1¹µ9¥—ìo!`Ÿ„˜õ©,♣ ‚ß¾zK  JÜO_MSÞñ}Gã…Ã>]ºŸžè‹‚wz1Cr/Æá›:Í9Z (&ÙF ZFäý;û\2ÌÍyô¿o>lÕtµÎØ4Ùôb ÁÐ%¦±Í‚Ô:ïžz«Û£lÛ€ ÿÛ€ÿ•$D011>R: +EÿÐsŸ´ë8:V‡…€œã•BÅ¢Åв¡¬8uð,hª¤f hº!ÇZíÒÖ¼£ÙþaŽa5¼[6‹ãgøW‡,ÌñÓåAè¹I8Ö{áyÞ™3(O&9bS¸•ÅIçåð!™p0›+’’…ÒŽ„Kö8äät(ÿÏ»ycV\‡¨³7§·xÈyq´Ò„y*ÍÔ@ªºÏ‚—û›3©¦ÔHŒlx;ø20ÊÈh¤ÕÇ’àFŸàµA¬M9Ô)Y¢‹.Ý÷PBÏ]l S0+É2ê´žZÊêôòz,B º)h^1•'š -³-rF›e5WÅ?’Fkk"—ÁûI»’½\—^@‡³ßìv>*31f©²Šÿf(h«Ôv>S¸÷J}“…­ú„\‚细^"¡]Lð,¡g_Ì ©<¶µ¼˜Þ‰Ÿ¸÷¹e@Ý"ÐÍéÊaó ¿Töx©o"Ê™J nP€Gí¦™%o–þ°O r”R㉾ia<‚.ƒbÖ‡éŸå¾Tû#ñˆMf…Ÿ³€ª$­Äz7Ãîå¡Ã.'‚ÆŠðìÕÛF²Žsb<ªý Bm­Î.´`N ÙÚÅÑ\QYƳ@#Ú×åÐëòêŠ(pdCÁ§7304imd5sÉ‘iíãµmÓ©˜(¦šmX¬M?iÃÁýÇö?í€Y¿{HK¶ Øa´P˜îÒç“Ú;4†tªUrÏž’£=ê¶ë4"ù~ñLÐ cƒÏʸ5¹uh6#ÈøFr…éòxvð"`÷““Eu±¼¡Ü7ê¸s_굡n`aìÝÓbÚ`‡Ylï^yßNb6¼Œ €ú*YZZóâ‘ÜfèW‚ûâý[y'E~”ɸ94ø-±æÉ#d ^gœ]ë–xè‹Ê-“‹à%Š'×1 0 eÂSºŽú£ØGxà¬ÖEÚ¸¥çXs¾£-ðëmójA`¡Ò+'œ,W½³,ô‡Jè¹B-ïO\ãÉ7ýúì™Ç7^¹£Ìå]p|²5it¦Ås²×,¾Ëkø,tnÛ".ºIe™&Óx n©`^æÞ¸Ggã÷tpFᎠ¡ëX£ït3‰û„ÉÝ w5õ¯†á¨®¡Áâ(î(m¾¿@¸™`P½˜íùÌÚ(´kfëC·MyJv°z@¦¿‹:­¶†šêú¢6 ®Rð“ tëN©ž©¤_£Ê÷ͽLä{Ø¢Ã@®ºì;Í6³}G6ÄJUÞû {A°6™¥ë.d§&bƒûO ßNj۩æ¾b×ë9þ¼7Kôûq9[cæ¢]®t8†ô¹+²Ï!¹BiÏÒ ô×wÝ´¡ˆC§³’–ø°^¬€ÆmÃ~ÊKÑÌö]9—N¦äppű.Q>…6Í¢¦¬±2á~³u‘¡joÀààÓµ1K—'‘b̵ O33ÛaG—æL ¶(ÛùU¶­½ ­’2Í ‘¶¼ÙûKÓÁŒ.9 J–ãžWßæ<5—èŽçó›o“©ø(«e°Ò«ÆåÓtkÃMÚ²‚ dz¯ü¹wáø»š6(FÉî±nƒ®d©þ|lõ;I'}pböŒL8`–g©¾ ºêD¼Pª9'"&$<^ü3MA$_ÀÅ«3²™â AÅ¥o¶”+†£¸«Ig1ËÉâÁÝ÷^ggYØN‹luûÓ+Á’Þt?Y4p¥j,}–šån^¾D>þÒJ/¦“zÂ?KA›ú[7»õ"ÚDµ‚#µ ¼Éyˆ±M¨â„òãáEãvÈo´d:¹E6Õ¦YÛy Ð Áÿt©¢Ñ 9¥n €›=¹6~vÊ a&YÓ<DJœrÏIi£´¡ÌŒPõ™¨øêÔr¦…` -CøûžjÁ@7œ02†´“,LðnÛæZŽè.ä¯lO¦Z¨£o6ìa²òMÑ­lɘZIIaµÕœð2lpwÔgîãèÈYŒåè.bùK Òæ ÙbH?øðáQ]ø¸ës‚äÀ8pº ûÔ5Õ¼oÅ:–iX`SàØåÊ p¤Ñ™W©®Œíʺé³Eók®JTÉVàV¾Xl¢!*G‚ráV Í‘´wæçÿڛꉶe- ¿Új¬ß£K:m½¡Ÿ‹Þ:à¿ëô,n>nG«eˆ¼õÞ¹mTLdÕºÔ±:E!¤”w÷Ø ¨–úÙ ¸w$¸tãÓ)û ´tf±+'É´ï»ZEŸF¢fÁDìÒ×n‚ @Ÿ»Ý$e;ðmBþÜbxs½  Ar†äÍ¢©O1@-QvTTmxÜ…x5v_ìb:ž§óa±8©Â’ ¬šòiµóª‰_‹úNS‘Ùæà ÐÄݽ¯@F§¨hœrŠS÷ O×ïóÞîX‹½Ô«÷u½hpfá¸U®Pø* ÅË–äß%:ß ˆ—Ž¡’U×äÝÜÿ…>ÄË“‹/ŽÔ§ýúçW“Ãñf(¹a…Aé$Ú÷~Y'¦Ò Ò8Αt¢BÅ(X r¶( âcå…)ºÇã¼ê RàìŸ *öÉrüçƒçkkÅþ¯óc^¯Ýë 9¼°Ãnø“¿7(»u3Jù[.¯×½µøNèÆ›„Š)þÜóF]ì߬¾%Fêçºu0DS\@RÆ.ûßî‰È5P|ïdÛ†ÐãM~ˆN„’}º¡{ÃŒ¶Ñb»¦}ôÆÈNGèÌêOKà6õ ÊÀÇÉy§Ïö¬Š{žV‘Ñ­QÍn‚CÖ)OUi<ýÔ{?ÈÒòT»z“S©ÏŽ0\Cs}™lýÈÛ`;Z4(–•>”göüe¥Ï¯cLTIÃòzXÿÓל§_ò®üäï—ºbxzð3£Ç ˜-^N3]ò5 ƒ‹ÏæÚåÇþ¼~çKÅŒ?a^ŠQZl78¶ÿ~þýü! Û9¡XÁpø‚æÉ¿Ÿ¿è‡?ûÔ[à¹W¿øTügåXûOæ+0ËÛë!Jî{ll›ÿ{y]ý¬üä¿ñè×­ñb`N©àr ­ç æÿŠÊæ¶»Ç_ŸÎñ®ÊÁÕϯ[hUùá2šó¢ôw€y/7M‹ê¡Ñ9¥œt<Åj?g?œGK`è‹øytš£¡öû6d¶y§¶›sû0u/®ÚâÉ%ËÏœ³Ð†´·S¨KÈë§Vx¥yañÔ‘è~™AUÔ(ÆÄŠÏì4ü ò™ß ™¤ñpÎq;ùV½ñ4P¹ÝÀÆtê0µÌ‘:G ëËôÅ—9´I’®ºP!úe ²F1ÐHö 2øgäîa6¤¡û,sÝþ äqLJ±Yé¢Eêhrÿ¨ã~l[Å¥ß-Áay|Uwר;Ýø–±`r:–Ó×ÊPÅ¢0ä!DÎኤ )§ô?†ŠXw lßyH¾p?1}þöÎû^Qsˆ­<°›¡ÉöpQö§9ý0ç_$®¢7t`ÁãƒÕñ­gÛÌ@ߨûTyì“ÕäêôùsÇÖ†i_𢩎eÊÃ1ÿDrÀ™ºBä|˜ïôÑ3ÀÈ®@A0sMÑ•±Í~S”6*èn£†&p ;#Œð™ð_èPïº4˜f‹Ósø>›Ž<³ì¢Á¹‘Ÿ e3ð"o ÄfAÇ-Íœr½•Üz‰¤úê¨ôÄlRç^ #¹Ù6)l‚¶Ð™iühíXöÈ[Z&_¥õƒ'2nOoßåZ›”p,./&¬Z«9qÅ™xõÍ{5zŠtöóÞí™M¸³sp½yï¯úIJúpGÒמ,€î®ƒÍLO8Î<ö–ùüɉ0fœ®¹5­pf ›ïê&°Ê“'ÐÃŒ̵â¼ám.ïŸû^­:,«±çXÏzÆFn-^ܲî%ôÞs_^íe൚¶Œê˜é:W"]߀6Ä…w ŒÉ]ºƒ'~J #KÓ¤UõGgrqm·/· ówöRÉúäK0lÀA‰MGü—}ÍÏïìg±®EtÕû‘±Þ"Ð ÍTŠ7ù»¨I¸,Åx« ŽfÏkÕ5>-…ñtï™M¡wÞû Ù_›U[ÕºšÖ2«6Lñ•r-yOËè£ó×îõË•ÄnÕ¸º¬\mYE‡y!bŽ8O :\’Uo ô>¤àé„ä½–jÇd½[ðtC¢$nhþðCø£™õö|tèÿȜٸؑ^-Yôm΀rx`j¾Oí`u•`:MÆæcL'N_UûÇÙåÔV˜´ÄE˜NéXž9‡:Ðñ/Û££^x8fM§×tô&(VÏ•…ú½†Ÿtéã¸h]La²Eám 'œ€X sÀÊìTx?ífꢧó2@ª¬ÍÊr[¿ç¥`¥>Sš „ó>öº/…Le¡ÜáðÓéÓrÌ'Æ«s«Ïs_0KN}_Gr¼>8Ñx¸¤yó4Ü:˜%ù'Í£ר6¼ð2®z¹® Ú‚°ÖعTø½²@X®I²üä…ðÊ2fÒwFG (>X®y®FrýLË{>XkÞZ€j8öj)A«›€×ý›o±Ëžæ™ ³ú‚,«ñ¥ŒIþ —VîS§¼\AÌ÷Í¿uh]ÜATè#mí=ƒRi'ïúV/°-ñònÒa|3¯«ÎKœš3y@ø(:.ouÜ×8òÌiv Rm]õÖh|ÜEaêh­…•w_7‹ª”wTÆ4¿*®ùï?¿1«ë¯¿1ÒÏå-J†ØÈ[¬yÒ#ÁN´ªa3¾æý¼ÐïayÅsÿÅàå&ŠÝáª-‹1t‚È»…þ­riACßK5Mkã¹=4]† ¬)u>Ø;2ÇgoÞ™´æžhàÎ_3a26½””Aâ‹É‹ßð[ƒâ¢úÚ‹Ä׊m¾1‘@Öú¢Ó¹„Ëšó)ÎòfÊü…·%@QSÞÜäÚonâ?*µÁÇ—['äo¾cRÎÑþ‰Rý†@4C×%½ÕÅ÷­]ÔG¢û»&.£ÔC‘¾&¿é|à”fp38^k\~úÇ7_¥ö^¿*XŽÏNÿ;GãkÐá—=S~ó|‘q&æOñ HX){ÛÔzñ•ùÿÑÉÜj´ÆWf»Ø?;.Fµrãi ºûuKt­€‰äæárÒ~áC‹*1Uqœ‡Âø—•_›FÈ ¨ÂÑ<Õ™¶çÏÞZ`Àj¦^4bPl ~ãÿf^ éûé3éìŸÎ¼oÒŽÂIY¯|áªbsü}o)üeùöþwéýeÒË9L\ÆÊoÞ©Ÿ,A¬¾ß“{½4•ØXÄi{@5…Òy^ílhýd}g ¶Qî×fs¦Zb(_×bȵ.D~ýÃ7¯ë= ëºt±©”¾™¦eëvÑ•éâÌj2§&8hkÊøë¼wÐG€ƒ•®ÁA´RTÂÈ6Ø~(¾Sôzx²Á›^¿a„'È/‹½ËúÌv˜íܶókìçro¤àAÞo!ƒ½qxïç Áù·TâÄÈra‘Id®Épn2(÷ÿøz‡ã@ëfPì’¾óuÏáñ.úcôï¨È#¶y:0à’<'6ÔLüñÖMƒå/y\ [cS1z¤ö5‘öŒ*é471 è= „(TXJ^^&é +zPç™ç¥Ö}Œ0¢cfݰê÷ÑEém’Ir’üÃã¬Ý¢ÿôI%â\†îÆyvÃt—:W1¶f’±A[D©n M)1ßåÆýʬË9iŒZóÆjívãm¸ç¾»+‡"Yß¼›~SîWXPµ3°Ÿ…˜¥Æ‡P5"ŸU¾ÇLÕ)/‹q³pš)/U†Yòf:r—ò-þ/Ô®±ZF¾É@lY½ˆ=ûæË—c)_æKWy4‰½sˆŽõœhOœ»§ð¢°ºBñÚ`Þ'䵌'ïpvx2,ûÀ­• é¸‡Þ¹˜œ$rÀÿÈ|³–R¶Ó¢[åÀÛ°,ÿ¡ÅàE­gŸŠ÷.î|JsæKVÑë«TdlZWEpYmØ’AøUrŒ î™™í`Èyé\³Ã)­ÈbAt°l©‡â*åGU´Ëgìú6Ìþ@ÙòÛ÷!¥¿w)ÿ(ÒHîq|¢!ha±©î2æ¾+ŽÍÿÚ='ÖïS+Hwž£ÐåUvG cÑÃ$+ß²z45}8‚1¢Ð@ð|ð&ÑtQÑô까›Y*éSw§ÖRXCJ¨ºº™EuÉÑÏ”ìŒ@OÅÅB.C¾r 6µd¡üׯˆÊš1HéÃ1™ÅÚ‚éOt–ÜÍOeíTo)À¨wãÚk«ÊŃÝNiõ*„Þ¿“¤{usÒ?÷u'Èx™f«÷Ó0`ÿRÑy· cn“]{8åsu1HÛgÞìI NÝO`¦;ë~Rà|b ¸'¿àyB¬têi˜f˪÷4Jra{2&€UÚÄÍh2Nb¢8„¢ÕnqÃàøY–í¦º€¶SÖx¯â¬¬àÌXÄïêtüûù÷ósz)92}fTŒ5^Æ÷Þ“ž ç/'½F¥«Aäh‡^áAçߣ±N2ç„v!l…7´®Øwâ)à)OÔ;É!Çt¦C¾ß•hè,uSÿcŠ„æN6ÑzwAüÏ9¥³5¬IÖvÿÏÓ9vàN:5å{¥µ‘‡_¯SÇ$„#G$ór⎩¤rqy}zp}\ÁüBN¾3 q-¸ÿZާÞ風 HLŒC6 Áe«ïÍ@0ÊgÅ\jã6÷þ@hú*Œ›fLÐ’òq¥×3þ«=šE-V'lp'Mo…ðý÷ŸÙ žƒ‰×¦æ_žàÅÓëë1àÎÀ—/u~~Ó8UÀŠòRx„_@øñô] $_“éÂ\—ÿ‘ÐwÉ_ÐÿÃHÁOº3·.ˆ®z÷ €ŸsÄ 4ƒŸ¾6A~â,Ûåe+‰þ…C:`ø ­j_O&2ꥭð¥ŒçBáß‘kÜž™¸·„Ysa}Ö!ÿðeë{†ã?úÝOíä°5Ú€™í¯õ ÿFÑù[[þs;ù±Ì…´¡,ëïÙ¡ðήjO4Мì×bäåY"Iß }KÎp~Ou­´ÃZñsì6‘‘QÙRc‰²5ßEuwÝ›‹œ.8FSA~6ãM“ýX°Ñ¹úÅòþŽ»„-,LÖɸ]7JIG—׿¢y‡ËRÅk;!Éz €Åè[l•ÁŒKð éËr‘8ƒ•à€Ò(ðVÙ×çaîˆ'†Â´Ïx²±z{v÷åð#ÕXIaß(ôÓ¾üþà›÷Eí7ÿS›B÷Lò!»W69‚ÇAÈp’@íKw‰ î/ÚýNt€ñRu£Õc_òXìz³ÜÑã»`Ϊý!Ÿ¾Ä¢Ç?Hì!ÀSihŽiHî-ÈIåÜìîÑò€þÕDÀ‰VØ;’®\  û2 | À6ŒGá>ƨQÌ¿K ÀûZ×&jÿ%Vj¶ÐèýÁ>ÁI“aÌ Õ&Î`VLŸxo&cFu/§g§ç×âìÎçëí÷}:9Мøž¢ÌâphÞÀ Ì‘¸^þ]ʺùC|[”ã)Ö»ÌÉAÿå‰äUë–yç>ç55,Ò Ì<]¢vÕ{øíÅëÓêgÊ#³hJù¾:ZkÑ"Rf«ki„¾³&f2¹N”~È7ù:í!Ñúî 1eÈ'>¨¨I®JÎwNpïFá×6‡ý?— 4•‚ŒyG1æÒRRÕ>»öîȹ¼@¸¡Ó9¦ÆRxã3^ÅF1[¿ßeœAç/Ô—7ó‹Œ%Òi[ç†Àö¶è–§ï <^¾9e·w|æÞVySœQÉ37ìò¯€õ­+ƳZ³$úðÃ]ú1_±ò?»Èg÷d±¹.=pú[‰ mÛ¶x(±è¼Ï:nƒ3ßžÞ¹~;ÊÇpt­ǬS*]önžÔã™ÂÀ¨–ŸÐø@_ÿ8×E¶Ž­–,D¸Z‡xwÇJ¨œ…`ÇýxÃ5(ÁÒy§mHæÎÞshúNŠoûÓ€ÁîsrÕ+¥/hÐæ-VQ†¼Þ"ôÄez]¸áR]ãêà @×GH5oûÿf@^ÝC,ôÆ.l’e†ÁÊyÒã8þ…Ò…Éö0úöqön±`}0,$’ñ{ô¤ýÏ1ôŒ §¤~±%«:„–. ¸?‘†­ÙšŸÇ혾ê IÝNC. Gê‡î/„¶z:²t|vò8¼äµÃ«à8 @r‹û”1Å£,¼·XJtvâœÿÂèï¥Hz»Å! ¨ˆô¡5Ù„aö>ÀC>í=᪦B±RæË8¤óá„}šÆÇÖ`éõ?‹aP0 ]Õkmè³;ñ¿S· Û·9ŒÕ,¶.çÍ\ÖËЮÎ0á¡æcP3 $®SL—æ!î$ƒ¯ÐØdŒi{éøA “t'¾#gûÖ[7ëã_5ÚÜ C³…+1ÌtM>(þ¡CæNøžbéöã‚Ñ5f´*9JñS¶€·ïiPÕIt‰6%Ž4¯ÒÃØñ9ôO0°jà*Û¥2öqÕjNyT[ÍBOŒbRK-$†îÞêÞ\G²L ¦²ªCi”p%ÖdS1Ü)múªBMÁ9kL×B¦¾há’õàŽ"7)Õqj™“ÅïØZ˜‚1øâ­•î–¤Órˆg7ævj"÷BΛo4•wxåá2ͯg`•dô7”AsÍI^´sGªÄl&»õ<˜æÃéæýXw~Ìn¹‘þW#|Gú”€3Ëê5¨âá ¤Ñ;â-9—™ÂÍô_ݶM>.q ƒƒ/ËÖ\àzû,aˆËöƒYL ]ÝáiS¸ìOY•B_ÎÔ²—e™©Ý.Ar SŽV0c6ã>ݯ¾…B‹ù©ŽG† ¥bÉ È’"r)tOŽÎÇPihˆÎÔ…òàéÁxëp푊šé»€ݧ##ƒŒ#h¨ó÷ëÌ@ÇüªÇú¹»ÿo| è*Äø„f¥¡[-§À·í‚˜Ê.™pŠ)R›=qA¡Á”´:çGá™f\Á®3ÉõRè¸sâ,͘5xò¥™}Ѧ"í/çJInª¿Ó¨Ü2pÝ4 ur7!.u·†U¼»ßZ|§[g—3UøÈÌßÐ-ôùɯ¼Ty®2K_;”y{ ÙAx|ê9ÞW¾¶©j…kPÉ)è @&éwåø›_ÿƒbGÿ~'QÉÝykÑ`åôÀÉ êcß§='•î šèH¢Ä—à½;#XÑÚk@æiŽ ÞåtòÈ­¦‚ƒ{ɽӡ ÿ:(ƒ‡ô?„œWÏzÆÝs ýâÞ 7Àý¢‰ˆæHoÈrGz¼ÞFD¤Æ EÙ½üRËAA:a€†u|ªÖ†ø†€Ñ”æO Õg~Z‹ ç„pZÄÒÁ“6±¡Í°‰ÚÏ0áM®3–Îâ˜ÁœÑ#òj–ë:a}ýKÜrû¸0òºA4}pÀ/ôªï<Ž«—L#`ï<}1sv!±6Ó1q.a9C›|‡óã½ í΀M,î8Ÿ_³×&iU8»QâÎåti¯¯ö[HÁ’ÿ>&nœÖçò[_–›²†Œ_Yz?~¿<PEÓ‚“‚ô; ù¿êþÿ9Ó0Óáñ1lŸQæ§Þ©'xÙÓH"Íu%‚T’„ß2° ¸ß™„°¥ÙÀG&ѯ\á¿swÙ•zÈû|t9§jŸåò>­ÙwŸï\tq:]ö>Ÿœ@qî!uø)^÷ÇåþnBÉUcéÖ…ˆ.÷–ß®®¯è,y?—¤q}Z20O®i@•±¼×ôS%ê ü®Ðgûs7h†Uhñ¹‘¯ë2]OÔl]ªPt£Y¹»ÑRÿA«jC©Á´lŸ’‘ŽSEÇ„Ô\/Í(ú ,#ïløõ˜ö_Ñ–gÙ§°@aÿm“¯¿g5‹•×8­—•8&úæCÜ(ÜkX=mÏ §·h‡ã¹a÷q€¤  yÙ£Ò¨·¸ºqC2©ØÀÕG;“xúü·Í3u1QÞe¾5dÂçŽAÌjŽÎq<~›žÊî,TMü7±!öu‹iË/ï;MÖõ¨¡m€ü§¹¨ù÷ýÐý~÷ØŽÃÕ!óîfP$0v†#”;å!ììØ`—×mÜFÙꢧÏ#Ý•E—Aho~Œv’;MìÝ)OĈcpÇH¥ü=a_ÃhÜŽ6Ë9xOÓ…8õ¤hàPÜi=î¦ÒÓ† bMÑK\œÜ|bh}g£ M¶å[FÀ 0lÇ)¢î`Ö‡Ü8 À¸üGÎ"ÈHwîßi…ZeM]ÐÍYf­ãÙ"M¦-rŒŽrp}.?ã ŽŸ8ò)^½ V„“ެ"ƒ™ýߣ'ŽyIÔpL è»Ç¹B†d!ö~z¡žZÎåàÔǑനâQèêÒÉ/6ÐÒeDÕošîÑÍùjÔdn<ë$¬i•s4oª )æª;‘Ê3¹Ks©É=MM- Åή€RFJ,ÛÝ<U_€b!#‰—Ô¥ÔØ"ÏŽÌ>Þ¬’.“qù‚¹`0) vh›»>4´XO æõjŒ¨ò³cZwêLßÿ 4D%| ñ’—„K{†L„Â?ìKHÝ@Ì𹪪Dz W( ljá9­BT‰ÅR1ûûËàTõlú­`<•ù+qŸ²$O^8GP6o‰þBOti°êá`ˆƒÆîç΢¶Gb¸mt (* úÖÎüüœ›±ú3 ÐI÷e­ˆ‡Ü ™…|Ä<á+„* å,¹ãËuëzY_ýT[¥¸Ýe«a5 EvÓDterCã^Š5 RM÷BrHŽ!»/ëv»jˆ\®g\ ˜~Óã5ŒÂŠ–•ñ—Làš]ä ˜ÉX½Ä*¯CŒÛö•“¤}Y $¿X#17UQƒŒôƒ€ y­l­ž.Teõä.N'b~÷÷›¯}„ê¸õY¿ £¹òÛ°« €±Ú ¶þçû¹ÇŸ/:ÿÓ'nµÎö¿’4³£Ð:—g. Võ‰«|Õv}¤q•†F ‚õxq‹^qì|—ÎCÇ=ºÕQÁº6ïE‘®~¸Mìm>K™Ÿ·.Óo¦®z0%gÆ´giFŽ¥%ïçc××ì>|¢¸7½ÓÓ÷Êó,ùýƒ~œŸ"\ûÿöR•ŒgYÿ&æºÿÁséâ‚õc(Di!aQà$Ú Ç–hìÁhÉ!b&‚8bܚлLÞŸzþ'á¾wxÞ18:pO‹lœhÏh‘´] vß΀Ü%RžUœú¼¤”-‰¼6P„çž‹dþÀÓ;‰°ç[Ý  o\›1«»9*OÜuƒ79êt®kOìMâ?A{eüQÚŽÿÁ¶·™~"ˆ¨f{¾-Õ󎨧”<Î Ä~v8áPÉ·øÚ4’<ÊÜ*yÛ,†âüè#Þ¼î0&³ùàk‚Ó¤áã2oƒÞÏH#ªÀ;Å$ÈäϼÝ_ðøÝïkÇùÞ=ÜÁQñü]ñ£T€úh‰küEÆw?í†åQöÔŸèƒeû_ &tõºPÜq2(Öêà_¼»Ê`ã~SßÉ£ÿ¸«n¹»í·cÿêåA}3úÿ$DÖݧzxKFcõ²W3(†£¹FãÀá'Ým?]mShòWZµ7åJïèãÞŸxZÐܨ§›×f*‚hdô’¦Œòœ¶ˆ’ߨK^;Ê`†x „>ìÁTì0â!c~fyxIˆÈiß[ˆDK¯„ibM …㻞ûœ0»Òp©ÜrêQµ>¡“(Ž7[u±$(Á§±¥G’Krâ^–ÄÈ­Gq9È|+€ÅÃXGãáÚPè2³©*„ŽõEx©Š`^ÒA•ˆ+¥H2‹-ëEÒ·Ò„mZw\Ò3?0JË݉ãÕNè1»žd¢ÿ››´L©_ùlðKSeZÜÿñVÞÄ¢çié Y=åÑV+äÃ(=SHTbY¾6Dy„·…Y × pAõÈ#Jm¸˜N–ÿ;­žNoH‘”½\X]0åi€`é[:u"ù,Ȩú{B6;‚FÓ­(Ͳ¡nh˜Í¾ßÛ?&”ízkÃÃÎgb¦–ë†G]¨‰ñ,:B9°?W_¡UB_v—R[pqÏ¿Xt¾<òð2¶áïoY0ã ñVÆqQwy s‡‡î-¿pi‹!æ˜øË¦#ÐÍÖ.r`² ¦¯¹ §ëãfweö*Ñß­ 'Vzãù ‡…gJø÷#é5½øÆ_1ðúòËÍ™¯é(~Ùûþþ@ôÁÌ/˜¯®&Æ7(=žÛ/3Y ’ø,wÙ\ék?g ßRPöfÙH@jvNCÀÞiø$GWb„'úÄWtÉO%ÌvxR€¥X†8AUv§ED£ûÐßôcÄËqµ½áÒfücL¹ãÀõ{1'Ò# 4LÓñ6À­˜Ù&·å•ÿ…o× Ÿ/ðÆúb€o-6±Ì`lû߉þ냧GÒÉ Æ™EFÌ Êêw&b"ŽÔ}ôØk¨º¦^¼Ô—Åäþ0Üaü;’ÚuVy¨¡¸~ M"5úhá­1x×Ý£laêbDqëa9 “EÅîòþ0dõ·NKÛWÏÇÒ úOÓµâkpž­JRÍGß,s Š\Òåy™ÃÈ™pÊW˜.ÞBÙ­,˜i! I•°Î‘KÊ…^p iiC¸pêx”sÕ ÆU°YT{õ©PæÝVx\ÇZDz‡©£ÌeÀÇöÞsð)4w’uÇCƒ¶Áì‘ZŠ'‡¿·ýi¼ä桨y®îd€_Yß±.)à µþ'QûvÚpŒ-ЋOõ”ð¼#ÒàG7¸«¿Ä‡Ì d\êµ`E/†‘­ÛËN¯â‚KWXþ²(NmÚ#8!¼Žø¥óCŸ*MT5uk—û?cܸƗ}^É<Õɧ굳Ÿ/@›öfNÙÅ·¾uèðÊ´.›c±==FÂ䣘—âlé*%NÚléd¹»H³Í°VïíÔs½Ë6Á%é=F³UDö-q£GÏ‘2€n' fM&'B°b›ëÖù8N4¸Ý¾ãêi¶ »Ü÷wãÖqltݘ.~ÒŒlCÇXÐû~ööCy†žjßÂ~µƒôºc ÉÂì]Ùúèš¼Wèæê´c#üîCцas€Ü{û€Òs8Þ’Ü!WGnè¬å œ]öRWe©=2<h†­ÝâÑØ,„©s CÃ7Ä÷ã|;w=¬‰›9q¿²×= ?Žgïs‡‘vd;´¿Øhj !›Í ÷Æ€1 T–ÙøÃL}‰å1¢j4£í;-k‡Í!ãÂ8ž6Âáí>ˆD3™—ž”º†ÒÄz Fî¿:¿Œ…'!%ª±PyùîÒŠ¾«Rcbp†êjÃMµß"Ñ ª27è ÂÓ¤cý޽rÝpêÅ1ê× ÄSñF¿ß[˜­…5_w^~ëý9Õ¯0†óñÝ‚#þçâT÷¾¿. FrÆQEˆ…£7R6Õå£Òm{Á¡¿(Ÿy‰0œÂ¼“Fº|/Wнå’ÇE¢9 ªz¾^Ѽ˜ïýÚÚ„ IÅdåÆh©¢„tïãÓæôñ‘cN|{Š“vE²Z{(ÖP=œ³‰YÆq²M £ÿ=º n`ã2îD½5%.®  ;:AG “‘N¹ùÅçPƒWn…#7À­Ó*iÐ+¬ïĆ/ÒÁ'¡þòÂ/´v9þ¿özG¬²)T…cºo/Œþ>Yªè”‰ÁXk®±ÈÓ­ËÚÜ#b(€½éW@À¸`UÕŒð p½òÓ–/¶âz÷C¦ÄB6þ¾Ýy.+_ÃÞºÜÍÄ&[?:ÖÉ;U‚ç;|±õÓåJÉà/›5t+ú;,<{ï©§Nï(Àʆ·j IFS x§?ŽÇp=¾Dbb²òÆòTJ+îÆÁÕtáÙà%€øsL·¦í Ræ>p¦Œˆ«»û‹ëëèô‚c<™³š‡°ûöÖ Öd2þþ :g§ óà÷¡%ÒøðÑ7–šùÜ©žÁ¢­ïÍýRƒL t­AîÁúÕšÍÉ¡és¤Â8f1üMD»îvŽÑÛ÷SHˆ{ ÒŽÅG› !þjµ…ò5ôñBèÜÿ®lfÛvNlpnmQz°õòH-œQ4Æ$‡ñ0+ $`³mk] Dô¥0Ú€SÇ"¨k·ØÐ|æêB§ Ý]lЇ!‰÷„}Á ª“J kŸ¹SE{’ëgGtjeò¥zÂek¦AòA€¦\`Ãï;åĵ 8ª‹ÑÆNqô´ý+=€;ÇgÍܪä³q÷PßR’¤8XÙ°.î;¯ýPéº.®°4HÐ?*üâÀ}©n_†0w]B+\ÖõÆÆÿ _Þ_ŒÑT¸šÀÂõú›ƒk úª©-…$¹¿4ë˜iSg½v8ÚéÏ TYñT%-J-ZwÄqÜÊ{þ[§”«»MÁâÓ¡oEôr¡tŽÛÞ#‹f”}Vè~D1%DÃËÒ?Ê®´l0´ïTÏ…'å\ç *ÓaΩÂÅ¢`  cyŒ³Dÿ_NõKý÷BÉk©úòèsôËÌÁ¢ý-„¤#XøX‰kÞÌë†ñÅ·›öê†!èm®x®¦»È–"KK”Šyƒ,$›ÊMŒ$~¸wF +"¹©TÞ9¯F¾úr3D8›t¬P¸Ó½P$ŽU®•¡Ï¬ÄÌ%»ñk?Û[GÀ/Œje/AoBH=¦å¯ã˜aR•ß…â9ÃÇüßTŠ„E|KªñažÝÒAϲ—©Ú÷–Ó ]ʹє&âÇÀB˳½˜˜¿Yt~eqåu1‘íi½fêZ÷nÉVÏiY-6Þ{²Ï"á ëö}¿Lõ4g?úVìLAÆ÷„²ºwäɈÌ,ÚôoÈù ©¢an†‘|bž^ŸU<8ø”¼ÛµÝؽ‡'aømiw¼à¯·ÿoüàÛG§"*4ò­‹î£$rÐÀ+•Tk~à¨åY»ïi¿tl 4´o]#Í‹º /ü¼ ɤO£FÜfØý‰à5Åþ7ãDî§ÝŽÐêç(èsHãy ºAÙDHsã™Ú‡èe„ŠÒF°öq$¹öŽœPÛ­.˜« ›K¦8±R§yŸít?hÿÔ…ÞÑt›„>†´ ¡ë±Ù d…MI²Ž¡žƒÍ°ÙÉúG°wçÔ3•Ku«‡ÍIW/ಱ÷bª°Ä7Ó´¤Û;ö´qËßoÉ=ÿÀoˆñ¿3g£ MT‘‰ÊyõÌøæšû÷ójycýš'öoήÞ,±Vïû6ýßÌøÇ çðç<î?¿k›½¿þ¶þýÛá¿ô´ÿ·´±þ¼…‡g_ð¿#:ÿ“¢ªGÁ!|\5<%*úÃëýøô`lL¿„pÕ æ&…~ÑÿŸ‚fÚT&û¬|_w°}öË'Òc{]ŒÐ óœ2=¨ èè3òØÞ^$á|¢²ß@äaZ Mõna0¿ú5gC·Þ£8˜´ ÊϘ̆šÝÛ,%ómkúf5€ÀRgåÙð“kÁ-Ü`¥­<,KÿŒ?eE®u}ƒ+¼?0aØŸ?föí醼M)Χ—ÉF&Ô•Þ}‰åÓs•}ñÇv$i¯²G€CvÅCªž‘Ú@pŒ[p¼ËfÜãËE„"® Êb˜sì΋óåÀ`¡LÐû†]Hß9ì°-  °¼´ý®pß‘NG#Î7ÃßñN;i¶£ Vr»ÐÁˆANÄ&’{³6¡7_äÛ([B-ø&4SÑÁ9©£pJ Hò6»Nrô{w$›%óJ´‰ˆ´»pvN^¸ŽÎWÁÖÞÅq ÏÙ<>Mþ§7” à íµM€hx[ž×ŒƒcN@ÛÌ@ ’2+-tï[㎠‘éK+CžQ‡HÎÅpÚë¬{ ° sÚD\Gÿ½ò–Œ¡WRðiœ‡—Â:-@ûÊÆ;üÜGw 7ÔŒ1s; ÷²ºÕhE}f%+<ƯÈCëNZo;¶6¸m *ß“£ã©C.-Ž"žÝ«»¦³'úUiHòuåw™Íè”7î¤G‰çÐ/¹W­Gû[¤©…‡e2Û®Yƒ¯Ïî[?wšÜ'j[ñCªùä;sýù‹ t—ÝÐl5ëØÝœðΔî·à}ßÞkÚ”^Nt; hxÇe¸™TlE%6¸VÎ2Wg ¸zn´Ãasp9ÿz2›Žî¯mÔF´ï©3Œw΋ŠüþoM°–6ƒÊw?ߨ¥Fí>“E.3>r;œ·¾2 o"èå­CVM¡B_'ó¤~\)†òÚ¢]uÚùmT¯" ?:Þ)ÁÃ7Ï!w1U&ŒÚ:]£“Ô¸uëˆEtú*Š:ãº8Cä¿7T‡Î^½¢8ç89É>±–\ÚEWö`_œT´i2|ãø® !•ûõÌÏ}ßç)b¾úcɯj˜ ‹áômÈÿ‚èükäØ@$Ÿì¾ëƒƒÃ*–ÌÉ’¨¬˜7íï3‚!¬@™MøåYGUFòÑ&XÓö”ÓÜgø›wU²±bû50…ÝláEÖFüÆV÷ôs&è¿–~F©íÏ!SJ7‡Á^mužÛ¯v‹BSÁXÔ!8ýÑÆcX½ëÂOßýåkYc*× ¿Ý•j}ÜTZêd½r†¿Z9»¯[v ˆ÷žÙ¨aü€á5FBSÓô+ålå“ÄÈí6ѸáôT=·5§ß–: u‡`함µYÝã}cgŽwLÛõÓH‰±Ð "mÛL'bOvÌ~x06ÜÉíOé3‰ôgUæ0r¼÷îØàyA´_tîBN´-ena§Ef·'¢SK•³‚J»y¶Cæÿqd9ãíŽe=¦W!Ÿ?¤Ë‡á  Yd›×Ö}#0œñ£‰­ ¶G½È¬´É6¢™Ü1LEˆ¶‘ºgÕÝ×õ‚((x?ˆ·y„†MsŠE”ÓæXÏÆc…¾bàŠS‡Ž~5—‘"7ÌÏ@"G3,^҆F'pJcåf­N—a™,›'¼_-8ðò˜Ê@%Ý[J"‡;š®Eì‘ §“¦âfô¸¨™ZAÌ%äd^Ò OØyà›Ž\4Tè4”¹ãÐäòq÷H¼êˆEŒjŠÍ’ܺ]ÉSžu`‰ÛZÀ*Tä¯cάÀ^ç}d´½¥€gP ]xª;œe±ÍUp¤êöLw]I @—/š>Lr4IŽÚª“×`¥u V†[Iâ)­+§hÐ×þT~;µ$¬¡("ÿÀlbÀ"#ѶŠg‘´Ùû<Ìî'd¼0øÂCÈ|?fúV‹&–;ÎKÓ–g·´› ÍG˜·g–]ÊMßTR_ßäµU ¹peh#läÏȱñHš:à¼TQéú3AlÉ"¦ÊKø›B7*eéôA­Mîân¡Ÿª¢+³%§áÑNã¨:ЩvÉÚÅÇ»°_-/ҧߥߌZ¾ŸUM¦o…ïC{/E«ƒçG`T<ôXjÏ­°JùÊø4b‘‚UÄZèèÚÊ•“¿ƒg! 9ð–J ™ó.tÁê»±Œ~wÓ›¥P~YäX‹škX¸¥T”S·).ì¿!:?—þ‡ÁDÅåQ=—˜§½#ä«ðe³’w‘@¬?·ž .ÌY’.¢ÿääËý2Òö½5@x”¹àÆa"ˆ„ yGÝq½×ô ¬±Ú|³Ýž'l50A§˜ÝoRG™Ì­•7Qó7{Ru–h7½‰þýüûyã‡Iý†ï¬ä)pÇ„ºO‘Æ›½Æ“‘SùÙ„eI%æ}ÄÒu@¦ãº>ÛvX>FùärP8L€á9ÀHæ%C¦œÎïpÇžîJ§!Û¶GŸ³²’f=| –ê3fjÒKgû*aX Xa´wb‘˲Âá —6 pÞ)™AžˆhŶcÍÃÆcÀ¶Í&¬ÎG>¢«R±BÉg³«gÞç×ð±ã ¸ÿµm:Gùn¸‰¾‹šôÒíæ: ¾ÅgæýÕG /Ÿy¦0_}ºr¾‰æòI‰$|Œ!y£@.»ï _ @¼G§€M<'îÝ«–ø¦ûûÑ]†\¾iYuÉÁåÀéø–hüÂBydùÖú-ƒöÜãè£ÅŠýÒ£júüÀ4z®ö÷ê*­Pn­œ²òü ™äç2?ô⧆y¨hqhy¢Àâ&ý×DçßÌ…>8°m›ÒõK;ˆ$Ì`N2öãI…|³]Œáþ³€ú¦ÿ:q}ß÷}Ûw³íd°´^ËeÊ{ëàŠ—Í€, µÜNaó¢çKÙТÛgµG櫈õÁèq4ÉBÉeI©lBH tÆD' ÿ1ðÄQh\£ç¤½Ãp')Á‚²Mu)¼HÎR¾¢Zì#|µñ—ÁÝ ÿ^: :”6r-Y±O:¡†JóªIégîÿ:E§Ž ª§'·%òÓ•f@¦ *;_k9eÅÙ_´ŽAxVr± | é‹'€"n#Û™ž±w•*Ç+ “Œl;Ž•Ãðâ´¥¶ m÷’­$hº0‚ Y\»ÜŸ³ÿÙw”Hb Ìý¨»ÎŽÃNGƒZh M&_µ®Æô™x X§jñgïí„1`оëÎì±ÙnÅÞ#† L»M[¿X´Ytòþáõ{:ƒç?ÐN$ßfçéI©è8aÌî«¶!Z7´.ÕsHë‹þÿÅîû´–½?nê_#Á’š·±X|Š*„íÜWØÜ0&ÛþlmH›^–ÙºUÀ@½2;}À¸ê´5€=ñ¿Ú‘y1m”±¦_bP¿|ˆiT• +ÖÿEÁiIŒ1žk°`õƒ¬sÕ¾.FÕMú%ßÃËlîÖ× µ½zlŸÄ«ð&8>å~Ì’‰ØÓE~ÌÎ~N×™ '–UÅ=Æé=žrQ>Q:.·Ò$þdsŽðM|o±ÎÆ0±ÌçWÑ £›XÜ¿O㻡áŠÓ *YŠˆ9žFwî¯5Téßú*‹ÍR*­…Ëõ´ñbà£xØ9[lp´Ÿ"…Þ¥¼„ó„!¡A†¿ŒBLƒqU‚ŒWÍL+j=AÑÀ/ Ò¹{50÷äipºØØ÷~E¶ä£CÃË©loyÙÓïs†×zŸÌ0z‡Û^ò)ýâÖ6ñšÉøjˆ¤>¨Ÿ´ñ)„ô;Ã4i¤ÑþŽ'ögÛß–— ·¡<Ö W+–Ô_%:oI'%Ugéu£™²zèi£6ᦠÓYðm oE—ÞA}Kð^ú=K‰Ékªœfš=‚ŠY÷¿Fà s¿õg¶cè©’}aÜvDÁ´ñȼÆ€”Qô7Ìñ©`%ˆÏD'Ä…ï(«¢3ð­ ÑË ‹ÏŸH÷úâåÄk‹ÅÍ[¥¦H¦ óð‰Sr†d|äü¸]áûwõK”2ð[䀗¿on})_-ç zže1Í6¹¹8$(Æ·- «#j§ÒT1ÈÒxãÙbÜiÆù•µP[¸Ñ³NÔf]þG±ÄÆâ?¯j:½±àåDq ü”¯APÒõASdB¨Xĉd<ªÿ0÷c&ìhZìÒ ë_/ ‚ˆr÷ÆLùá+¦{E豎AI`+œ~Gô®Ðfˆ9š†@Ðnä®ãÙvÛx¨îN/ù(& q8HK‚b4‹’1 è5‹XÉB?šâIÃa¦l' Ÿ!r·c2”Ãtº÷ÃÈ.Râ(ýIù'˜›µ ט`‹ÈU:´ƒ—‚³Î ÕZ'~Š<²*‘í–h&çõPoŒ±^xÈJ®u¤ývúk7&…mknsFP•*1Ÿ›c× ý—ÿŸU gûÐh•ÒB9&¬ÉGï•Ô½º•Œ€€–CæŒ_Ë" gÙ¨¾ZÀæD‹"®C41̉cµw_Ý)&!éçhŒâÉs!ª+$Zç öÜ`‰I© /P·FZ^X0“œ#ô™¢ BR§€iÙõIã’n¥jâÿ­¶@ÐÖðfÀ›}uЦĚ¼YqOˆì|…™iÓß|¡ Ë èQs'HM4XÄöàsH\ª.gøpuU¸‚]¦qÔéQTDT5w±9 Ë”VXLŠÅžêZÉT¾ËXr¼ÄýçzU#è#¥¢mŸÎÀÊvfL9«o&õ†ãÓI5ÏÊP`r‚å}ùaâ•j¡WÏÜ|šþkí¥èÚ—¤?¯ǹŸAýWïC‹ë js«FIîû¾mÛl1ýœ5Î@Ã+Õ :zZòHÃ8IßiZ…D"l¤ŠQq¹Ðœëó’‚:|U½u<0ÜK',™¢ßäh vÖrx™i¿hLXÕ¯á³N‡¶ÊW†Ïœ6’¼äß/:ï÷+Kí7÷ßµøçúøxàÜ—öLæÏ:‘qÞÄøàl\ðcðég?[8ÕAÞÃgªc;ÇÀf8<;°üfë ÜIˆ–Œ¶<§ØoÎ2*Å£Níø*ÆSwŠ¢m;Ùù›'Î>‡ßÿûù÷ó¨ ñ}oÇZ þZü§µ“™žËè&Â}î³ö8wÑ+ê,ÿÂxó”ÙwÚ Šÿz€!qDˆ€uì"ˆâÐH¬¡2oIûÓ÷ÑÄ|Jp&ý²ÝRlº¿rw”Œ%aCäû#ËÝ€­z‚™)ÐÑId‰àS":Ñ9Ûmi0¸ží9Äç«™Ñ6(.aðÍàEÝ[ÈâøîC*Myc+ú12–8t½W¯aë¾d:ìY”v&Öá¤FÌgêŠÓÕ|ªÔyuН_™ÔY*.‘¯èÑÆâ<–¶¡'–Bqb¡ÀR“ÃðÞCB@_=NoOÜ­%–Þ»’å (^Ãe¾f‘ÿPùÌr@lµ Û-äç´ALnÄîs‚ a¡’5=¼¬éºÑ`-€æ³×¢ 7êhœFUùù‚¶è‡Ýצ)è@©à*s|o`÷í¹“Ío˜1ßf 5ò°ùµSÙ‡Þ„M}«1úОó™–Ó{÷vÂ1æòÓ'vG‘–:6 QÉТ16 l}ܾkDÑAòóŠ?ÛæÕÿ/°©ì‚ògz«zèÇ ™zh¡’üQOóv£`4,îµ.–"94âò€(è±#Y¢äö ê+Š¢ç–};c–:¢È蚺h¹o!ŠdÉžŸå 6ÃTNC±Æÿ¡§X1Aîç¹^qˆOß÷©‘äÝCZ‡[%ï¾ü=t†mÈSè1<²>{aÅo¦ÿ󼘚+NUhžAÈš¼}#{ô¹fžB¿”e(âÊ–ïP|ýDœz¹ŠçÓ'r/<Æï’¯Ö~Å:­¡…Bœš^æé 9ý _•—©-?]^Û¢Ÿ;ÂÎU–Þ$ùüúµ=Šrð·xVê¿®p¯@oycM„ˆ]º>‚9¶Û‡÷JòÅ–’€ÝS°»µ*ešÇ^ô zõ0 SÕ‰¨t8ñň^½T*—Ñ`d=[xe„ óŠwŸoÉ\{šÛñ«Wk¼Þ¾6¯‡Ž¯úp®tNËÀ6xÇ`ûÛEç§ðÖçñgëdzÈĉõ)Ìæ³¨£‰›—q<$C±›0"flºQr¤þ"«t´šè’Ê~AÕì;àñ:\úT ÔÜõŽ*mÈqÙ{í¹sœ¸çƒÕ곬5q W¬èf¦ª(è˜PN§¼•q%JÙsM/¦A°‡Ý«åY,½-–6É¡´ˆN•ÈÒTäÅÑ n¤¹#'AíDúKç†;åá$ G„JMCùÍ>,e*Ú •l-ñÇZD®þÛÂÅ Çöá˜a;r ¸Â^FJ¸3ÿïÂ4$¨ ‰-}`1öU¸i4tV‡w*€Opz8M› ìÚNW)”o½£Ë… ¤ìP£9±æ¦qÃ}O[f€\‰ ?NYˆ#`ïa¢¶M&ÈmôM9ô'b<-tA¥fiD;(O†c>qx 7Gù~¢4Û6þ!C¿§IÀñćgñ©‰ÔF#´RÚ!¿O·mcè(FW9„+rYÚÕá¬?ÁÑ2wqZ÷ÐvÞ¢½Ý‹£ IÈZ!v@‰ Tw*µôz›¥sJ¬ õ-õÊ•‹é<©\qúºD™®0öä?ãx3Ç(+›iÏÞS,=—éž•jFvÃkÍZʽ@WŽ> œþNÑ󷢉ô¹9CÁ†ÊÞ‘û­)‘¬²¢V" éô]\Oϱ†Ì»úœ®EEÁ£(Û¦<øÊ8xþænÕ­« a‹!x†{é‘¶æUø0³}ßÇQ³Ç×¢uQÒ¶Þl¢¢„ ôÙ!£×âIéî)ÁgŸ} °ßЄ‰ÔëK› ÃÈ@\†¿Ði3.ï5rš†%qGu†œ.ûµ/øMÆÒù¼4µšªlÓŠ!>N*¢.e½Õѧ¢ìÝ!5O“By#—ðNĽ¾*àâÕßq:P!7ož)ášA“/¸J†Ï}f?Å(6ÞšxÊ,S]Û;ôŸWWÏ aœ ×-üi¡°ÿ“ûð £ ÏEµr}g´2žý .\4‰úÖ½;@›t$Y§e÷²a¾`f¹¾B $WÚ 6Ìmž/¯ÙŠâŸ×åʘð5ü#Ðÿ…WÎã=^Ú⯷ë`òdàbxúåÖÝËfL@KöÚ •ú•+qÃjô©ø pOTŒçOÛO|~ÍÈïÇ_n›™m.~aÏ3£Áí;mWÄâ\Æ®¬æh<G1Xd!o%/ëªBÿJ &|â•Èpª¿¥|„Àeo Þ •¤hMY ƒÂj©´ÿ‚è¼]en¹ÈOLÜ^§Çwß¶C,4 ¿_Šê‘uÊúç—–Ô½ j;±‘`ù'Í‚)½4;*-Ï,icå^Å¡áÐ6€Ö$Ò9;ÝË@— +ÁyHWˆÜ~fÄvê¹u™™ç“úý¼<\ç7N²±T¤<ÝÅ-×Aõž2Vé¨pê—óÚ…¤ûD¯ˆo»®Ï:x]xø?öç{z|ý•Œ~g7GÓŸè:›0ˆ88¸Hì–©ôe2áîùLq+›?ë°¶~“®iÔ§`a7§»mï!–¶ïTÛLvÑ}îÇPðz6?FSKÂf»+EÊ.! w…ÜÇÍ ^î8»ûÙVA›P ÷ÝÔ #ï¾=ôßòç. Šy"ø-S%líqðÜyÛÎÉÉøCÿ·"N©¤‚²Þ[‹ñ…ýL‰°ÍÄIÆçÐùXP›l¼ìÜ›b:ëiY½¡ssV Wó(B1.ÃCŒÚ,p´ØÐ€·†°¡Þ¡q+ÖFÿ®ˆ·s‘q>˜ÜÝc1\ÅE¼auXâmäöFÌåýCôUÜúWÛAÝæ‡?ï0þ|ñŠ ..«¸ÉW– Ÿ™õÇkëwŠÝàvxû¼ZþáÊ}÷y½:.c10&Àp1¾mU`„ÔO‚>˜uwH³æ¹àÄÇ=œ4Yýøö+´?ßx»G5ÄßµV= | EúZÁ—u D]5¿ HúMïx .»ZÉ ßh´Œ7Íá ÆËC÷sMÃ7_Æqùé™öÚ… Óïm‡ÃkèÏÿHÊô]‰A>|Ç(¹ØYWçH`Ƽ=É’+µ\KóÛÊ,‚× ¡jbaS>„ùk°B÷Ýk¹²O|Û!YPVÄiih¯Ë @Ä:<õ°HB2‰GB;:lBŠå2ÖUá«Zjúqï¦b ù8˜ª^ÀNM,‚: Áó÷Qk/>*õuêÛAÀ‡Vè ‚é/"O€aöB´×° ×ÀܬEL!–!‰¤•ºŒ„‡RSÒl³ä;¤ü€»ŠóA HÆSƧÜJSÑbh ̇Ǜs,F¾Í¢æ‡n©Ñ%§ –¾HØÿÉ~sö Ÿß¸w4¾Ë8`D9„r6 ö惂Q_»êaÛD©„ wXðz½j”?-e÷N:W6ßÌlàÿ‘Âð”ø»·Á“ñ'‘Ç=‡²Û½Ù½ßÚLΡú!û·ŸRgØ›ç°ïØHú“޲OÕ¡D`ˆU¨c’Á`Ûбè¯ -˜è¼ápYcŸ¦e˜8Ž¿25àœûÌÊlccÀ³U0a2äln«™eì‡Ã¨Õ22Ê=˜W¾ì9M-ÒDi±ÝÑÑöB-ªpƒ&ÖPp[F†7RVIÊí?÷ %ZŽ”Œm %øç7ð.b-á=z>9Ò½î½~ωþ<·vÅ%‹³·@d° r…*®Z8ã}P¶îåqiWÑÃýàpZQL¸ã‹0ŠçFw!†Nœ}U†/â}㵞I~(]uÌÝsÚ ¨Ït¸Ú ݲ\oL“EÉWÔÚzÐJeZögež ñ¸aM!=ÛcÉÖWà¾9¿7,qÞ‘ª8´ágÁBÚP´ UK‘…–F¶“0HùÔê4¸D…A=S.fCâ·X™î£h$}?ÒÜØX¾ìÖð4‰'™ò¶ý7‘^¼`H³´gKµ¶#uYÆF”¥Êõ‰c¢fÖ[Ò¯sY)àtHŠ@1²ìBZÙŸm[6A.« €,ä6ŠÄ)ÿS~Fõ‰^6"fÃð¨øugÕ¥ÒØ9m¶ ”ÔM/Tz"9Q’Èv(ƹÚJŸM’¬˜Mð´ê#L…ìzNY+³Ê¿o7ïf¤œÙýƒ­ÄaºÄSx¬‘;òm0Te¶<Óåoä‡úÛxn©k)Szl‚¬"Ç}ß{KCÓI½½™QýódV`¼RDó&1ׂlt&SàØrY0; ˜žpkv'fk¬ÔŸd=˜ËÿtF¼áZ†ûE£m¨¹hY5_6 Æ› Ö°l–Àç¥Ò_(:€Ƈt·Å¸Vœ{Jÿ/£¨Õ9˜xW‚«_Ðw {eþ„¼{õN>ëþ’ìÈ—vî4°mQŠJ=¿º¥sI½iš®¼v#H'ú  çš÷XK¿ç¥žÊ§}ù¾ì!¾Æ#»g;ÚDOî'笾 Ò[Y,F|€Z3œ,WHCQ›UYˆUî¦ñnßé3›¡}¨­Ÿ®a½Ó¿É¡…¤;d(†+(ú9^>Ü™–ˆáòPòÑý3pS G/Ö'O­B3îæd¸ÿ@ÁÎýà#¨èFVÒâæ.ZpAªÈs9·mCO7G<К4‹B›å‚Ù©4yÍïà:ÈHCópŽˆãf,2 ±!”=Ú¹ÜlSC uF©laDDñÆ)œ©ëuÖ&hìOÁ™j8Ú²Ö³²< êwc†8ÂGÑ·#éÀG³J@œ¾`Ÿ»Õb÷ ›êemAÄ‚ÇÂj”àÉXðò¦ï¥Dÿƒƒ«G¤É'Ü þÀ¥ð±aLWJ†V‡YiºTH¾1.È;ho²éŠKÞãß½ŸºàŽ¤È åqR¡óRø1¦Æëur;ß+ÊYGëÂâa?K'ëõdqÒñÏXÁ˜<*k®á¡ýAâÌ“P †2Wɨ{ƒÀ8ƒ ¦Œ@<#HÂdü¿€9™:q“€ø½Ù\çþ”†í;R+ô¹ø•ŠÝ]ÿ :$º´ÿ-‰ ]W÷#©7B_e~­“P¶zfEüW£‘{B0w*©wЖée¿-XQâDƒÜ8V¼X©o’½=°öm¸º7Õo®ˆ$ùùÖÂ¥ñ _¬Æ1Ò Û û¶Ÿ‘ïâ,ߟ؋7Þü„‡7`ºÑ‡ÁÄNÃEušcz{bw˜˜ì¸«so5ôNú&š·Ö"jþÈYD}~ dÌ! [bÖ¶E˜U>%£Ä¥-@ü †VB0fÕëøþ'Dç‹·¾wa\†¿ûçÚ¶‡æ_„°~ ýÕ1­Óñð´Î¨†Ä% çÝÔ6-bSkY}=ýx>͵QÍq÷Õïш”céD·ÎÏòÉŠ„…Úž7#”rQ‹o[R¸Žñ‚š_,ž^÷ïŸnÜ ê =Ó©6†×feç0̸- ‘#eÙÒjG=[’*5ˆ&¾Ouµ9ÓaÑ?}ó΂h;ÝT¾J7qÌ;ºr[üÕGð‡‘{³Nî]Ú1<ÐÈô­í·Ï=ž+Îu©lž)t4MŒå5NïøÐýßiÜ÷ýøžîcE¤É«"šœ ª%T1øW¢7àü³0·-doN¾¨´è»5YÃPàÿ˜¨ù›Z‚½¾CÞ÷®¨2£ÃØãe%2”&ñ8­ ¯_†1yø¡r/ Ú=PsÀ%¼Ê/y<îÜ/nÖ7o= :SåþÌ›ÿ ‡°2ydP7¦f¡?L0ß»üþŸ»ÜX¤„t¸ílný½îl€cR| ùÎ7‚è.~V·È€UàßBÿsh·¤³Ò¨ä»qá‡Éï½B(ÙÛûþsA½ûuy5Ð2‰u˜)¥|„÷èñÜ>ìøVnÒÓ—)l¤jýF–-û£ð3·ï_-:¿ÌëÃÎ6†)P¦e œÝýk_à»>_AñÀ0˜ªXjQ¦Ÿ_Åg†{òíù¬+½ý?OÌGÏFÓHðü a(UwçݦõìÀGؘÇQÔ£““K5Ì«Âæ‚ÅF¡8 £>>`œã{¹z)+óù,dÓ'}dÞ­»¶ì+52¦AØW*ËZ ØŸlFJw6³ÝåwB=éä›"Û}X¯r·Ã÷È@-µ¨Ý¢s˜Š :W>s° ©Ò4s-®š@]À•èÓ¡Nsžœ›.ÝX|ŨšÙ~P–7¶/ iöï'j¾÷žoÄ¢V.R(í¢/Meíû¹Ð~»„êÈXoô ¦ŽÑØ•¦ÏA“ãÞÔÙ00þ}'ä—;•†%®+5°]Þ!ösz™"ŠÏŽþŸœÙ=•ŸÆi?HŸî NíÜ÷Í$¸ Ùä¾b¯¿-õs €Æ­`žt^f× Kw$ÎÊ‚°RϦuÏ{£ej­ ûËÍD’/÷NøT“¢aë3°ž¼¦í7.´>Çïú±.d-Æã+ ¶ü)œmØùÃr-`š©äc«â1r΄‰¨¡Ù;J­4vµ<3gÃrZœ³Ðż‹œŒlœ;¢Š¹°+ çtÇ@šž…ÓÄSb÷+ÐjâÊ•“vðXz¢6잡˜¢Îj/Sà°Â…y½ÀIJ®BJDF—ÒiBߪô¿õÅÏìW˺gq˜’þ ª·À&`p›Á¹ûËEç×C|’#QXé|’æ£lÌ›,b;_‘Îíí˜xXÓóÊÑdöC4´õ Ô¹'<1?s Ôivæ×8v­OƸÿÍËÕÍ]{–QðуëV†•„i®f-ï ñ€¬*,¡…/lë=ûØŒ°É³ä§âQ1@B‡&Gº"zÄ01ñï5½57ß Ä!Ú‚‰k^Æ7´õP€O^Yv‹O@ìÓnçÎ^^×¼«I½œ€0ò:ë‡ÒÎùìšá6öÀô}޶׆e0/·Ü C()œì@dvî•úÃ4ý@ÿ¯ÁÞÝw¡ ÿdâ²=çÑ$ØJ®*ÞÓÑÆañ¾Á×êT›Û¨)¢—vk|kHt¸ X7zxQñ¦ca7R1(Ô.Æ6 á!,ñÉB]‰1™ #¶ HºÍx7¤3'^È]Œ8’‡ò׸ˆóø€x‚GìC¬1˜¸C'߈¶4\™Ý6Ö óë#`U=ã²j·K|¯B-…fVïp1×¹0ƒ«wâ46'íØ+¶¬q¾‚xàE½+2ÞÝùâ+Пv Õ]äR\ô ý¤‹P°œI + 7–|†˜œ¦ÌÚ /©íÊx‘³[ye}„ë5-†+øéeÉ…°Ñ§F ²-*¸v>1gæ ¶úà4á³ËI™°0v5jÆÅJ§é2]½Zäþ_dÖw =WŠS!´ Î{…P¥ùE;í£ö;C†Ï–²]bE7©ï`—@çå¿òΉ“ê%ÎÒaš K«³ã“ÑÆiÖkáèŒdt·‡èx+ÀñÅÇܔԼÌxÛ»¥=Ê›øm.ò5>v3ã¶a߇ À»ï«ˆ¼Å´¸|¾\&]:ÀgÒš=vÕì~b çùW¼`ý›O3‡µòÎX†ïoDÉó¨ØE(¦s×—¡,X—S‘&.î¼TU>->à@ÜôTשԪ»3BäNsЕ–ÿiÑy.°^.è eò¼ð ÐåKƒü,j¼ç>ò)Ä1¦1o&Ò¿¤*£?ÿ·‘uãéíàà‘WåWÎzavèæJ[­çmÂd ó‰xf»øŽ qv°ãS]µlú]!z¼|²0úX´à{­|á¥ý„6À§c²st‹ «ßàs6½ÏD›50§¿r¸y§ßΤì ^È@Z|‘²alÕÑØjëN,µ1.bŽ‚ÀÉþ—LуB‹¹‚W-E7~€¡ŠÔÓ#6ÕC)fÆ—'±fV¶ÁB_) :ÜßµÞ™;RÙtÅ Ryé+F ?»dCå…ç†sŽ%sÖýÃMgP­Ä¡>ž tohH´e£{tä¡b¨`íˆîS·šÛÿRr€¨Fwm6賿hüÎ@£×[:ÌÆGV»õ8ëÓëÇB½â€~x)>Ì•ÿÂØ\4‰›óBË{è‰lNî§;ËÈòjAôµHÎC醖®8È5ÒÌ=.1 œ„‰`FÎrÚò‚Î긇D‡þU‘$ÖP{‡GǸ£‘á!™ ÕuðQETPŠK¹¬2~Á–…PH¡Œ0IËn³U±Z 8}–“èKe!”¯³Ó"´³^P/ò†Ò]¸߸‹éý+Sù›Vt(Âl1ðG¾ÖªK0«Meõp£÷Cº °lYܯ£‹MãlµÊ¹Û—ƒe3ß˹>••5E2ô  Oðƒ–‹éÆí¹4¦=ÒoÎidµ¾>ÇàžþV˜êÄ™;[!æ§KPS— >lÖR‚×H"ª,%ÔœO0ÐåÁ香jé-22¸B®n-?ÆÄw–‚èY-¥*)Ì’¦K3E/ ÚK(u^]§:½’Ýß.:¿_Fê-J;rÇg²æìz˜¸± Mj·¯õ.׿Ÿ…õÐK4Í…’8g|*B¡ëÓŸÈGW°‚ø| ~üÛ 5Ö'žuÞCÒ‚•ÎTe@]Fy¼!že„Óp~10µ%ðÏÞf¼û8Xø+-9¢ä Áš´(^½Ð×R,ßKïò¦Ä,ÀÀ<ÕÉB›„]Ý?‹OTª˜};°—©È 6ã•w怖)‰äu”æ(z|4×H“{ámSéïUä¼{›PÔŠZJé4ìîè;¦‡m:öjÚ¡Äà¯{¾Ãæe"½òo§âs:0÷ ê§âE3†ð*= tsM>Ö"UÐV×)Єª^´áÀqi¾‹öÕÿˆb>‘b 0×· ´øoîø]׆'€dbyê×îéÍQT^½}.]3É êõ@STSž¨(JY•C¤Ž ÐéWœNÔÀO›òÿl–^ðâ˜éŸÇ¸¿ŽìŽë¦£D M°Ãºß8[ u8z°Ò¦P”µë54JŲ³Z1aõi:Òz8a×ìö{C=×òK…Õ¤êã‹^Á±–ƒõ¼Ê~tè­øQè ÊÑé=öMràPµ¿óéRnºP½0ÃGVëÖž¼4Ù®Ž`Z©«Åy¢²^˜‚Šdžµ¤‡´ô¹;˜>}HZ‰ŽSñAÓ^¥N¨ôÈÍÀ?èá*'DŸD~WµjL̼•µ¹+ðνÃb·ÞÆ2*S…»fÁun¨eËz'{ÇTâ]µóƒ÷Wÿ&U0üyr3‘…I^oÀÔ¬-÷W÷7Ṳ̂œC¦¯In7CŽƒóîhñÉKa=+æ¬F–ÿjé²³t@v‰™Ïe“wMÑËŠ%ì°à±!’Q”›¬0îyÂNžlGû8¿È„äÆŸYÿãMóòø¶E€óí¦s_ðòñ«œY°‰áôóRϸ)rß¿„kë´ð¢¶ÙKw IùÞœË4y®ÞŠxƒU—˼‘”´‘ô4ì¾9™Lìá*¼†n1VÂ8]1ñ°Ä0lÄÍ¡­òŸ(?nPÍŽ’êÆì`òÿzq"Ðì7-å&=²Š¡‘ÓWz¿â@„qçiäx¬àÎrÌÆgù#™âf×êžÙð žvΚµ@6XÀ¦Ú›K$¢9ËPäŲEŽ5ÀSüý?Ö‡üßÏû¡b¾ ìë£]ÇY–póÍë¡ »ù¯Ú]ý0Ò¶mž³Ëô®&SòK‘…qØ–E|_avõqX$¸3'C{‡öê±a'·mÿq ëpÛuù–oiÊÿÐ #‘’]Kï&4@ýGtæ~o{:xåÈeOÿ$ ¹° ÝuW#€ÝI²”õJºfÀ¦¨¶«K¡w+'rty$ÖF Ã&íìa²m2«äÝÖËQ{÷¦ãøÂn|7R̶&_¼ˆäÖE>y»¥*®=ƒžÅ¸ÐÀ\ؼËw `æâ?”D6ûX޹`-éç®s06n>9Oï~rvçï/ûÎM¸³%G’Üólû - ¥S†Ùíû ™L€~Vüû•*z{Ï~‰²'¹n~xâËw7>þ1ý߇*\ /yÔàSØÍÕ¥ý1%qFâ~žÐ mïo¬L ÷Æ‚¹cwüÁp{øßùéö6ü‚0sûã¯"(?¹M> n\ÜJtþ{Âry¯ž.uvþŽÀžhâ°4¾Cñ,V b…4ÿJ±Û†¹ÉݰñýŒŒO–Óø—"WZ¿;Qhfüàð046e˜‚sç.µË¢¶?N¸Up ™’ÿ;ÂÍCx—oMœ«ª[6úç)ëLvý6lFÜèaì$¥œž»‰U&Tˉ»¿í{°n²cÞ÷“ <›ÈÛæÂz·© 2t)]wþ_W“•>.ˆ!å„ñ¿›u#Ak A¦Z(&­d6;íÌrÚt›ºxnB·‰¡ØàUÊ|kJA¥õï t–‡¢tî°dBç’~ν^|Fq«|˜bôŽÆ4‹™—Ç5é[$Q£¿°ÿöÿífdD‘ʘ Ë— ²Ä?GÔúocM)´(‘¶QR‘<3†;X1žÑÒÖ²FÈî5§Œ·í¢PÍÕ£ß'[¾!ƒ{ãÿo ÷DoA ÓÓlh&Ÿ"MÌ&Ü&­Üèá^¨Vsðx(ï°ìyßìò`úÒ}ó˜$ ¹ï~ 7M-‰±¹/<Èæ#•ôõŒº2Q2áyó®è˜_ž¹üôôè×€*¤@`³{³RËk˜~úÂ3mùés(»z;A¨ÖJF}—3¨RèŠêDΛ&St'F³%FÉ,ÙrkvA"ø™Ê»ØÍìµþPråß¿L¦?Z©Ý='`}&Po´lHOw±[˜ß´AB¿èi ~]‘G»}nÎ>»üÄ%Ïr6Óÿoßs<é|ÿï_âfÈnÓáA™# ¶¼ßE»L[>Ú¹Á=^)2XÐ »Ð ê+m=oUíGliµí½ú\i¨Z³1Ä9A‚­G.=\y^¥ýŸn¨Ïµræ €´lè‹VhÎbÊŸGšû¦d)å°t “ ^Hʨ*ºöÅýœ¶MÅ_bM´ŒºlM3€¢—Pl&Š]¹Ÿ£ ¹·MË@ñãµZQ6l¹àýºäo}$“6ÒcÒÃÞþ#}#\]ùC¼ñ"<¼F¯ø?[ô|,ä­÷Ži&د‚2¸ÂÕ:ôº¥§ÛRöæ@~ß9¿`´/E|.Úx„ªøô:¿”À Ê`¨Åóÿ|²·‡ ŠÉÎ Z xD“ݹ`ÌìŽÜR” ãÑ=nÓ‡] ~Ÿ„DŽÙo툭ñÀ-9ÐüQÞ³—ì’Ë ¬>ðõqc¤c£~Àf‡Ï¯JÒ´ª¤;Ûæ ÑbTB.˜†‚u(ÝÝ»cæpùÃvôz†ÕéÁÖµH”õOIZ€H­2†&e¢Z83uJ˜ÁYƒ+Ü E  ³ÔÍ*qoø®«Œ:µÿ‹= I}WOìƒàÒšõ'Æ,c©0ÎtŒÞN;K™tÑ›§} —Ø¥gÏ QV¦pwšÒ+Uûi  ”8¼=™M²GM–OPú¿H¨KÑœ |Î'ôrÊuIýíªš*±^ÐO/qØ?Ô“¹Òxö¨f/« (ò°Ei!ñ¶¢Ï…è «npý˜Ú:ï;H§>l²Èn»{ýö„ŒŸCZn©“<ÀV± rc\óÜTA1dÄ2¥ó•2ëÔy·¬éR.|zë¤nHˆèIÐ×´O¹ þg`h¶zТ’|*Ên7UmÃîûÉÉâïjüç\õ‰ŒßÙâ–'­Z@kàÉ?Ͱ$¤Fnšr†+¤þg®èq+62#Hæ§ðÎA,Sp¦Š|1ɆËô.{@u ÄÍháß$:o^Àô’”á%¢mæ 5sA¸„ûóëÝßpþ0Y¨î|9ÞŠ¨øôŽ€i‚é‚.tgÀˆÓJá˜(”µp'1’Àg¬êÆâã=8© ¼IÙçÙçcÐÎßmò³Ù0±ê<ÿ~~Þ+–Ø[ƒ9¸îhÜ}ÿÂ…[t44o«H• ¦Ðœ­ÓVË¿¾3ö/Oc㦠 A]»+bI3¿(ºR¾D•£b¹‰Ïš „éëò¦LÁ ëœÝ=HÑ›m³ ·ž‹Vñ2þ*+mߞة&£X÷š™7ukœ]‘ûJ@BŸ”M|¤Ò¤h–ƒ8MÔ½”d³­kþx̹ZÝ·”irvð³BÂ-Ȧ¶Ód9¥¥£|rs.^çM, ii»ô$»êÕ+¦¡¸ó€Åqú FDG—¼¯ÔÉ|ñ‰4ËÄAÈvÀ¿©uöÍ•v-Ù˧_ï§É)NÜÛ[…™Øw‰×]ÞaŽ9B³Å¸^‹~Äí^)ôµè¿“7Ò­\âÛoË;Uè·žv_ª´&¿5-¸ÑB˜Yåaú[“ôx=<ñ4nò|+±Â÷ŽHQ¶Ñýú ç§?AÒ¿sûÄè˜÷8û\\ýí+馦¿_v—¿kE®ÿ˜µ˜0Á u\ò[K´ÿŠèü×f2φ«V*@³N\ž×»ÝxS¬)ÔP³ÿ”i³wñ/yn£YLbë™>ùø|å[‹¯:nS;Åúk¹k 6¢¬LXd‘˜~?ÍîüÖ«°³ÀÂRçé“Þ ‹éNYƒåBæuŠH[®72vÁ"­Y9_wÅý^MÕ–uÌÖ;Îθ¦z²>ÉšÖ:ñœ{)·öšX4l޳¨ƒ*±]úÙwjráßœ]ä: ÌfDg–DÕû±‹ÑæÃÈ´|×1Øñ6{¡býÌ•Ytê<§þDÕ)Fáˆú6¨>lØòÞBp—Üén<ÔUôÃŽsù2ÏDoÜPé/ÕØö©1¸nũԴ)5عP†N¾D'Èl9ƒë$8Çî‡uÉ1O`ÛÉ>B03¨ÿ8_{²ß ­_áD-Ü`—£ønÌlÛ Ûðyg·4™5s‡Fé‹}s7ªL¯ò/Ü–4Á!Gß½äU†åÉê7~Í_¤³,O7‰útLªF YÎæ|*€+l±ˆÅ˜ûÐ7ÒÁ#dßßî¹wzRÄ‹ÌhDºà®Ëg¢!â%îßǼBEWdƒ¢ÿ:ó¡àË2ÅMé*sÕÆ­¤›lË\3}„»¹mÎuØ>¥¿¸&¾´ÍEXVæÈ‘$@o"¾á Tj¯5FU«° 35VíúCMqÀŠÃ„½ÑqøH¯]qœ££él·óÃÑ>g ¸±–Eú£hÄ)œùRÁOö¿h¼ ±1 ŠÞŽ‘xìAD~´è½¾Sc2êž™"Ó½4´JÿçU‹õyó7o9žª?<>}´PXéîú*6Ô—ðƒµ¼0èœþ'·i6˜Ð©]З·ݨ-|àã°x2íÈÚM%Aú 'Ü ¹³«^îÀÝט"uyÍÀ:>²>!kº³ôm9¬ÿñ»[Sd.{"Õ¿‡¶ýý˜ùëZþ]©/j•Ë!é­Ï’g2Œþ“ªðߪÔCÔÚ’Ø-Ôw©•éù-•ßWâpDÍɬU[—èÂ,Œ2o€§3tÒkIŒ®êMý(ܽ–HѼ ÓKÉÚÜK®¬êKÌ›Ë÷ÄG—¥ß´¦ÚË¢§ŽÎ†ºÿëîöž—¦9-K `D›uãË郎䥉UVENzc´ü!&OÁ„ÆêhJÙð‚³Gè Øµ]ÙMÆGpÜ-ð¹ ·O¥g_aÚéü‡ÿ LãÀ°wtÖÛæärz*ަ†ß—GW/Ãò l3ì ‡:^½yþ½ŠÜ ç!mÀú)f¿Ê*@2ózþíû4¥ïm¢<.¸õà…¯¶Cùj‘V˜Ü`Š„„¶ ЗJ“t—OdÛÔ¸O±0/ÁB\€ …’°»¯z„K÷Â\ô/XUG›:T#Á{þc¼ˆ‚¥¾Š%e1ÁgGoL3ëQꂞÙ6o%2ÆKòXóÒdHš.°Ž`s®X&ÍÅ åÓâM1 >=[ÚÈ /€…‹›‡¨Örgç¡^7•ãôèÙ'¡ŽÞÃ~jZm¶õ_ö¶áÐÜET™ã&íÖ£gw¨*Þ>ÄT™g]°˜y;'br ¸Õ¤q8ëVßDówñPœÛÏâbVu?˜5(©U´]Û˜Žr–ì+ØgXYYœx¦Uöט•(¥t ’T3¨œÁNøò£_=Ö¬à„Œµ§5ÔÙz„0–‚ ®$s[½5Ù¼ÏAÀ{µ=ÉœjªÓ 8þS$Luµò…œ€AÐß;•÷ŠIOrÇú/Þ—¡BÒ=þ ëÃ…iGXrëJO1¿JÓS†„G’ñºàß8i¥ÐW"ýœ< £„(¨V~NÉ9¯n)›*.6¥ÿg¸X÷ÅɃ)PEŽ[±PÅÈ'è}¿üõ7O)ÿÔh¢‹fZ Ïîb¥P+7ß«b棄)'nç©9©„¹Æý e©JXf ñLáˆÙÜ¢´âÝîݼmƒR¨þR¤zŽ[PÒéõ>Y*èšÝVIâ0ªx§Ý5‹oJ¤òЭÎi°[pfÓ·Á¤Çÿ®ÄŸÎÐ܃ HMX,÷*°—‡5ÈðQ̪ËÁù¯tu„‹ô—û芋Íùç”ü"©åÙ‚ Í`Èĺ|Ûø_7Qs‰½Èx¦ù‹îk$†ôl±}Ü!UakE€HÞ7wßã.oâøçä•BgšÛ{ð¹¿j" œäI/­½Ô)š +JÂzÊyH]A®qaþSðù÷óý(¯”|ÓåÛaò“ŠVä Üà›ïX¿¸ðÀTû³DVØ}³ŸÇY((°ïKw:ߨH3‰5Þz?‡ŽÄˆÚTnåÍ>ì9{§$#/ Nà³}ÃŒ²84lئ¾K­h]½´ç2Õ€ÆèLQhjà­ÒÌ`›g ¨çÊè9Ÿ@}*ì|Þ}H›K*WÿÁh¶Íð?©.WK2öÕêíÔ«ÎÖ·>!6aÍIé !Gf­ùG%ØAî2WJIIIÜ èÝbÊQ®_Êíè2AÝ(¿(­pFû,ÏEÊVJÄßx„|˜©]ÜÒè–Qåt´R’q;Ì‘ÎÑž­aΰUÞ_%¾©ŠÃ+_òu5‡¯šàô’Vþ¡ëk¡?¹Šþ§~ÅÕgï‡;ªGE©68$uÿê €¯Jÿ{:#ÈLׇþêÙø¢’LHˆªî¾õ|ýÀ­š÷îÀ„çÎÊ*ê&$öÆ€#B~jý(Q î“ Oµ¸H3>UTa½xØsnãSß´›ˆG>øöc½#5üÖY®å‡æáƸœø¶¼Lªî“ç¯ö€ï—³7:9ƒn¯ÆËÕ #ý½6pã¤(hÌmÛïúîwh(/‚3¸J^ùŸ¾ùó4áݬb™¾¾žIvšÕ÷<ˆ~šårxå×aõc—ºµþëüê'¶Ã6¿ßux•qKqLëð‹CØ [—@a6¢1Ýý°¤do—ÏÓ†J ®Å w±‰² ñ˜†ÝŠwÑó~Õ÷xóå6 ĹomwnÑh,øò³Ù”…Èc†UÓò{¯ìây3¼ËŸî MâÍZufò‰´@иXÆ{×d$ÂÙ´t2<(8f»ˆŸä:÷xýŸ&:Sðs¬rþQ[§éÃNA`7jS8Ílƒ±y`ƒÃ2nª°MU múˆ˜ ÖßÐî'[Ü]ïÇï{‚]Î ƒ[ê¤#¯«V·.äqàGCl0îQ°kXK¥ …á~§U0ÔJ_õP‘A6(\(‚îõ\!¸¦‰»¥¼æ4þ…Õ F3ܘf‹“[jÒùV0|,.>™) U«e,b¸¹Yä°‚¥°*ÆqŠuÂT>ëRwŽÓ“£HÈ…üì†Iø¸J?¸|ìáXî ×q ‹šÞEþ‘|S›÷ln4Æ% Àfذ?½p[‹ï–¡Â½ öƒÕÿUó7mP¬)`wK­ÐlÂÊn‘¸C þÓ”‰ /xÌï6X_?ÑÂxh9½Dæ|~ôŒÆ©ÑÝújJ-©õ³e ràõý´Œô,ýßY(¬)ÞŸÀ›¸fL¿*¸…ÜÔ§¾ÒÏÚbñ†ɇ#¯;g!Ïf}®ýpoìÃo:¼ÊþÛÜño=‰¯…¶®‚à)¼‡oÿ®éïp_ JïÜ™«Lä"E*šƒiLíOüq~u³Û΢ó_µ€/¤uÇcÒŽÀK7y}Dn?î=Ö0®W% •®S=é]Fïß&Œ¹LovQMÜÇm¥‡:ºéALNÒ¥¬:k×éÁ¶ ÛŒA-ÌΙÂj*ä 2™0°Ó1¹2~íŠ%Ce©Cn›Ó‚ËÆ´ƒIIšÆ²XÓÑ-·%¢ý4¿ökÍ–¾†¡3†Ùm­¶¹[È@ÄAŽ?íŽììàWx¶W¸óˆýí¦»©Hº_¬à@t¡wíXøY÷õhÇ@Ë÷éc »ïûùÝux‹C˜¢ õpðÒ ÚE$è;‰¦JÃÜ7‹º=N©\çB“9èP º ÷éxfÖZÖt8ØF JÑ6ÆrFôpÚ4|31¶Í6Ÿ†¶ëÈ]ÅMÆè}šã¯;~pLutþ+PJÒ`̰§çfP·_…ñ;“ê…'m…äKlÍŒfè[l¶õIøáòÌ€AÀÍû‡±y§€BìFôÇÞ£h§—ÁÈ*àÕ´[1ô]Vt$/WÃEí‰.@e¢€ ÏÁq úÒY'Zdj³³ï’YtQ\:GkùËBŸ¥ˆ•G˜×ö ”æ?ÖèWþ€í­•ì6å€Qån¤€#Š"Üu¾šdXh×ä6ÍZ»Òa£Oãµr‹”†ªžâW–Žyžñ7œªáÔyi<ó œÃ5§˜¡£ÿÀ1=tüõ8z‡‘$,ƒªY qgîæà*̘/îË¢¿‡³\¥Ø@3^Òæ5X)64ÿ`×~–^tfTŽ{®KHÍ’ÕP†ÔK$Áô5«þEî™–¼ ŠÂáú껄]ÍP0 rcö2{à}`'ˆ™<â%\ú¹¦’c —”šZ¾n¼Po“C<=\v:«Þ°+Jád€¦%JG¸ÝîË€r–ŒµŸÞi20EFÎe,âÓc.{i MCL´Ã‚êÔLøRGe%˜cjUfÁÉÁÓGø$š>*D $wLV"Šå޾ܩÛghéM}hEy2¨cwf9b±"eWÄÓš‚q¡px&ˆ GJk®3`jÁ*¿%»CÓdi™Ns"àpIÍU¬®›4º/ªÅŠ(z³âf“ðSkȮτ!¤Ì%võôÆ”‰“´„“,ж9õ8^(JsvÕ…÷åýzÎ;Q!ÛáQ1úT¬ä ‡PqøbyéÊà À®awMà…k«õA)ËøOt¾ DóMõ­±+1Ÿ,þÞW»¹¥„y´x[mìû^5R¾óöH 9†å€aÆ¢Þ% Zî²ÖJ¼dŠwfŒôb`'µðÏSÿyØÆïþ¼ÿý|ùâ ®žŸx¶K6òj—²'»îg,#iÜÛ 'À¬ÆÎâk*y'Äu!¸Â­Ëò(>5ÆDûõPÔf)×ì äówv£{àëS²,úRÓÎ÷fŒ#uzí8)è ü‘þ)ª‹‰ÂAIÜ1q8t›lFÍRÉá(2ìâ=Њ˜ç)2,‚á[ CI›PZñt— ÇxèÁhG{a;¤Jº„‘™a'o0ã Œ¡y+í[[ 5 ´B%‹ë\x²ÐÙ¥ˆ9»¦¿é0ŠLSkEw±…²ºW—&PÈ  G€TÕYq„7¼h?n8áÔÏ%ý"®ó›µìJŸ½ŠºŒñîÎD \/£9æ@dÈû©:þcÇÙö©¶mg@Ä ¿/ê¸ë̦—úü¢ï@3ÏG~]Þ4è2Õý¾ž`>MxÈÙ}yÝ(™›Í×f–¶ª·Uú˜Â öL£ÝƒY‰h—-ž:Þ¿;°Ð–MŠã&œÿÎý— ù)ây÷k~ ÚØ\Œ·¯§z8ÑÕèîל`CÁNâË ¡œßÚçŸ]‰%PuÿoM ;*ÌÁkÚEemO –ÚÇ| ýô¡çˆå¿”œ=>¾uáÃ*qŸdQÌé– ^¹W)2ÆÀÇ‹qLí‘/Üøêè¾²–½¡óRÐöÿïµÕ߆·ž-ʓׅyýõê6¼üS¨_?ôÏO¤Þíí¯ÞÝ%þ4djPYÿ‰Î¿ùØíƒÆ–ÎX0³Ÿ9”óÚϾïô¯ÿûÂü…jS"c˜»wXi5vâr a +<‘ä§b•Ö*–éxý*àÕH'nè¬Ïs|_àS­5Þ´ßjýÿ _üÚ“§c«Ñ™ÜAÛ¸2–®¿å‘Ô@Õ‹/Ây’¦¢;j«5¼LˆzÂ'þñQ¼Yf Å*Ì̺´ÐÞíW›GpgñìûÞtÒ›_‰ë€ø¡Í ªö|¥@/´ÎlQ-NMhNThà¸~D¡Aºrëº=®À8ù ÛÐÉçÞ:"Ç-ï¢ýXþ °ä°°k÷·^õ6t~šØ¿Ë!œÁÕ&4;Ehû]±wf;¸ÿGßæ\K /ƒ&ï„ÖÀvgW_~þ÷ð4íвZ‘¥‹s\¿¢êô”¼RYóOê¶Ëc† 3a'x'–?;8/|‚RéÛ¡Ÿ·¡¦. ÊG5ÏL|žå ë;v;€ÿÓ4dCïØý˜:+vg2ò,Ãæ¢pP¹õmE0êçi·ˆx?t2á•v•# €‰Í7¤®%¶þ檟’#?ÑMò>WèåçŸé«ûû½%ô32$ÄGVÿÕ6­ä…„À_ýSðN¾õæ,©oÿè¯h|dÿ¾Mú ³ü´0ú#öÀ+õÝFtþu{Ù„~Œ³ö3Òz Jœºe`q’æ ξL:Fî·"’]­²Žÿòë·†uan^Ô]µu¼-È÷AEh|ñ¦ŒmÈ“®¨‹Þwz% ss”÷;#žNžÀb#%º°Ë(Ká?¬aë ù®°,"³®r¥J·Rß]äéõeß›Aω,‚9Ä™y¸æÚɱ\û³[¨&Ï„P=0ÿÛ,l¡ ]cMrà±]=Ÿ+<±/äHL;ð}¡àLš6€W UŸ™>õ¶8á³³I곫RƒvHì KCp(ä@ýܧôŽŽe%ö9‘üO¨âão{«±áøÇ·<$®Oa" lŸ-£ÕÜ…91Hù¢ÐÁó%Q$ÎöáºjØ};$ú›.ÐÈ'vö.ºÂ‹†¶Ðçú·ègË©Ž$Ønë4%7Ê·µãgk­3ˆ5Pêìš íŸ¸0–¶EÇK\+æ 8¸Sê[‹m¨ ù#È ÊµÚXŒ)Ð…ø b?=»©Åú”'b+Ó…Sm1D¬¯óÔbÒ›ï~àåHò¯2bËl]p¾òXÞû_úÆywä pÆó”L4î=£Â¸_c®#Lÿ#ÜÂñ&j,‘BqW|jy(.Œ3(5~:SLß¹+ •ŒÆQs"~£pt ë¿ «¨,ƒ WÄ ‡CG§2tˆø4Q´&n¯W71í`),rõèÓ³­§Á4v|¬7MZäæ(\ÖE£N7¦Z+¦H,4€ìjâ’¾R+eGY¥yn9IËö¼^x]‚y1 ¯Záþœo&A‚ªz“—•Êç„fl9yV‘ª®ÇjÞ¡og`I⎘VlöÅcõ­6…”rFщu^T¼Ã=T¢”º2/.1ÿ±JÍæÅ–@—Å@í’Ž+)oxž…ê„ “(¨°Ö•*™ßaû…‚ešFu½/¡/f#zåòŒÿ—/\né‹ó4KDJLtI¸4}†XênEu•oÁУØÓ%(¢œG UË”·±¹`9 }éÝúƒÓ l›>1CŒ&õʵÅϘßîƒÓiÕmk1¹;luAö‹ cNÞÊ'æ èu<á5ö2S1#.ô‚»SK¨å)ÊkAù˜žGÃ!|pè@Gôú;E瑟4Š?ä!Ñá1PÊÞTùŸé~-†01V9!oÆ«§_~)µò‡‹þÇäÂ~Ýg&M(ƒ×2¢9=´ ò\Wo 9f•š…J…Ϙ;Ä2ÞþË<ð]?Ÿlùþø ¸kÀ¯¾ŽÅŽÊ÷.w¯ýÚ½’¡f¾Øï‘kÆTƒëˆID†Î¿íýD–h6Hò©*‚ÃÚ÷¢úÒÙ…AÎY’.6qt"jø™×v>Eõ71£ßmx¯‹‡¢‡ އ­wÕ´®û³Ÿ ¯Wº¸S€–º Æ‘\míÿ_&9{!œqrBaàC"òîÓ “¤ŒMZáaõ_! ÕÌàK¢ønã@Z$÷·þ’ ‰Ùn¯®m:âïÇ,{7¬àwn9š,Ò٪̈eB\Ô3ËO™°ˆ$çOFµÔcf|åôª“ÊõsÌö‘I4*ÿ 8E¾Ïè_Áœ0•ÿ±"Tìâ^tÝ·&çµuw¨ÒÁ}`)F‘ìpzÈàºØmÖçNܸ«\y!Œyò‰àZ#b™eXk³¨yˆãOp©,À´ßap8#õn0:@ëd.tÀ#¨!ó¡˜×£Âmu Ö›–lëS²Ò˜îMº‹ß ,‰CfµáRž».·”ÀîQ¤@shŽëPšÊc>ZÇb¿32œI1€¼`å–ÀMÆ?½>ݬ²åÄáø¸bQaZ]á±¢J¦æ=¶rEB¢ç_jT/^*ªº´(§/ml¦,ù•ï“‹ÇÑH»ó-PTE¸ªêÇÖµ%uôf¡ÇiÄãtòÖØìÊš]ÿõå›_=G»!/¶z@Ù«÷ãó„ê’3pIm2_¥ås˜lçL¥¹û€„Pdí7²Ü{„‰@Û›hÞKÐEñÕ°2þõ÷A2&Þ.AÞëˆÂê‘ ¬¶„YKï3çÉ¿At>h1=Yå9®Ù|)=w3 –þÊÖžËËïóË ÁQÛ¸–Úú‚»È•ÌýÄä1ú* ‚»œ|•IS§ðØy¨åULô:Ý#÷Ÿ³º~yÂãlû½3ÓƒxE*òË£Á`¦•8'çëhÂóôÏÆ:Üfêx|ç)ƒå£]|Æèb#/[[ÿõ×ÑM›^’CƒMÓ¾ÀåóLÃ5M±ÚÁXJmÖk6Ü1cwÚt¹²Í—º34Vë+KêtLjÎQÑѲ¢yOZÊ’¼„öÓì¡õf@¯Üõ`bð¦B)ó cŠ,ç €>“¶¦Ë_ÓÚgY ^ÿT'åÖ¡50uUô¿¹v>Ø(át³W ó;M©…{D–*zH§-–{ùò²³¼W÷ÂÄ™<Ó5ùÃi…->±ZMãä]ªEÓB¥ãÅô*PÉün|Ž­ˆ: ÌÇÐq•’uBU.9Q©PÓ;¶c ñ*©¥‹Þyö¢¢}¥°bçÍ-ö²UžE´·½qÀAÞat»oª‘Æì“ÆÃtj§\Š•Þ^ùú–&¤h¶”9º{Z½·æçk/]„Î\Z¡Q³üê.šIk…½[)£è|^S/¸ï>ò.¿c^O-1ÂÛÞ„æ§{-]X¾ì9‰Þ-õ"샿ߞ’ú+Rà×jq¯RgÞÛYLídqTã8¨©‚ƒÐc§¸‡U>¦ÃŸçYh„ßç!ùÝ ˆG³„éÓ|âcn¯‹G+© ¥¬âø"Ä„0Žtñlù%OÕ݇ôxc¥©Z‡©e˜-È_URÈ àZÓÒyâº?èÆe›qÃlïàŠ×Ô—4q å8q}‡¥èñ›†ÐY6¶À @!E]8{†ìvOÅ¢ŠÄnžì™þRI³32Á¡$@A¢Z€÷þ\Ð8ŠýÿÙUùC˜ñoµÊ>^°5yíTü› ÿ% ztÕ‹* ü›m[áÀKZB§YšâΆ`:2æÊ’Ú{k M•¬¸9š®üpˆ {¿µyA{™Œ?°–}Än®®ó)ÓôiÜИ º[H‘z|½s8ÈIxw•9­6M3°²y„—ãbˆ £ì=¨Ï´ Úôôø{¬zè‹ÃßCa¾­èKi):-ô˜¼ !&LW0ä+¨}àsÖ¨áï2t3Z}‚4f-‡µ =J8>ºÞ¹þw®Êeö™'7 ƒt JõˆúKN`!æýPD~°èí)ÿ14£ç‡¾C›\ pþðÒ9Ͼ"¾é=ÆÚ k6íh}pwÆÙEÁ†tÀ >Cw 1+¯:¡"áê¡+gn0³ÊÄS–ëì»ak=NûŒæÂSÎæ¢ç±ÜmYóÿ¯ˆk¡üya¬Ïž“FÔã2[ÐO[q¥,r.4ÃjUœ*ÿTHAx+4j‚0ý¨6ÇIÇðÔ/ï0Iû…æ 2¸£hFWÑ&HýsŸT“nVƬKÄd’¾$8@§±È2O»n– Õ”¬`Û“ØJN8ƒ0.ˆŒ!6ÆDÒܽ’ྫª’!I# Df_ýSEµV`1W\$ße(Êfs»˜¶U®ZÜ£`u$¿B"Kê—MУл„K';=w‚Œú‹ |?v‚=8gÂ*ž_ƒ;÷Ž£ ‘±¹keЗÇD(8Ú9•ÁµÅE'¢1AûߣUŒ+4¼ÄôH}q®ý˜1Íß8HñË|±"Bb#oƳ/Ÿq¨§kØQðЩ‰ƒQì›L„(š”›š3´—tª¶ÿ§~®]#^¹×·^+*¾aÇß2_ιí‘€µ™wÃæ3©’x‹¸Õ¬!g§ÍÄ#~ º}§Ü"þ´dÑ9O;˜ˆÓv‘$§‰NEûõÔß j*Öµ“ƒ·ÌËŽaì°îÞæúO‰ ¿(m4Èß„ fáÖA±c8X£¡‰^§Xnœ9 ºÔé_Ë^ƒ÷^Ùl§ÿ¶Ì†r¾±{áÕÈËuLÖ¥ÇÏèœ(Ø àØèõåKé’%ƒF|*r½ø"ó4÷~­¯ü ߼׳*hzüÔwãµX})<»‹µÏ1ÅT#Y~  Ëè;+Qªÿž\× üøŸ®þŸG¬·/¼·˜h÷ï=L¯¿ãfX*䛟ûЯù²ä~ ÍAJþYâV@9È|Á°ÿ¤DÓ°÷¿Ÿ? Öý‰Ñà kÞÅÐùçGŽ9|ã‡þ‹Ðù ÏˆÎ¿°°¿þã¾]è5uÜù€$¦–lg%vwà%·5WMËØÑg·;™³ö-±Ò¤ˆ$Ðs4Ûi¡åâT›9Õ̺vÃH.)ìÜÌyÆdPË›‰ô¶oÁ‰†ã_;½xƒx ¡<Ùs#9¹^jÁYNpCgîM'˜ |!téÅÂ]ÚéîŸð³)ç8ûÆ‚ö{61¤&9»Z› Bb§¾Š›\ÿ7=Áª½.GŸgt$€Ô\¿ (Ú0Ù+³} ›Ð„az[~3!{ ÷φŒÜGÏîîùE÷ý nsøÉµï½ë­Ú›ÃÇ +kãü‚ì„ö¶Ù¬C³Þt… µ7èŠtºÙ«©u ¡ùðÈ9ݶdÒ1öqò‚‘ÛŒìŒa:¥»™í<Ù¡ä壋ó|ÎãŽíÎímŹ`¬1l#Óîcîj’l£ 6€é°8W#šR‡0ÐSŽÏòN¡›“dzÙö¤!¼åƒùé·Ï ýo­|ÞZ¤`à‘ù-Î(ö²",ѺȘÊÑãÎå\ä:¬<—D=6UKÎ%‚ƒž/6³Œ1¬#ô#š}Y8 5Oõ]™– Hpf¼ÍŽë1šùs†Î$Ŧ,ÏKŽcå˜]ôiä+ŠïQ‘™`þСÕ}ñO‘8,žS[NøUŽ‘KÐ_p·éoß,­Oɨ;´Îýœl'Õn·¨î³Mû?ù”©ÈXܛ鋣8iÃf-®Šƒæ"'pîk¼Så{=wR„ä‡ý4O±„+§élÓkqF$%~‰ì¦Îíóú6™Úò4»@DP⪈;pU”y/&ƒEÀÿqL@„Ôߪ†dùIÂ{S^j#äŠw2p’ÐÆõrÆþ77ù–´ÇT.Œ7JVª„Ølw£ôhÖ³ÕwŠÖ ‚óÌ£¯¼"D¦ã%~5`P’ßD¦ °iƒvÂt¾[?ªLÿÄO Uädl,ÜOÜoæÌÆpgDz‘V+Ij‡ÅIXCy¢\/5yÆ~r[üfoæÜÈõ{jÄÖ1ÕÒýõ©ãE¦÷êl‡MÒ58¢„Ãn\cÉÄ–ÖѬoŸíœU½Ù’¹Ÿ990qiÚqKmlAó­[L]e´£‰Î#º”X[†i?LÌj@÷{qùÙa:»]_+:ßtfÕmñ§Íûp/ö ª à£ðëËËæÌOEöüN æ9øÓÃcÎ}YÏ„ËR¼·Î–ægœOø9ÒPã7¤Ð $eÞËe‚øH[ˆgÚ‘¯-À·<é*y&¬1/λ ÷?4A(ïí½ÍvÇWBGÌCgþ#ázû±¾2ùCº.γ~®¿ë<¡ê=ëÇÁ"Tá"Gé‘›¨åÐÆiVÚ_¡¢*ÀaÐÞàø“{HÐOÜj¨@|Þ²í&„™;åèÓ²g‹¢ƒ}»›:”£àV£u¹·F,Êæ©íæÀE†‡ðb>Z晈GƒYÕãH®Ÿkââ°í@ŒÆ`ب_ïùÂJŠ à›0° k€Tï.¡>ôQèì%‹ÈëÆ2–'¹+5¯‡B$Þ ‰H¯m–Ž™,jIX yVÕ1G¤=¤¢=Á8Å—°Ïêû~þ.gÃíÁÉ‚G8¥\óȦàSyÇàAz×F½€d]F(}Ñèš^IÙ·EêsÐädÑÕi û-8ô¢wêªVÂ#œ§&6G ›-œ£IpðÚ=N§çFžý ÁjZºd´]÷3XÅ2…!ô(îNM>hv AÌQ:ãéT…6I‘@•a3 “¢Ñå|ÇÈ ù°± O0JdÉÃ|FbÎ'Ñ«%Öà¶FHký≆êçÙæ°8^d1}8 C{Ìn•<63!XA ^W¨{A@¦|1L;Z̆¬,1­F׺@rÔZ r]ÇIƒËƒãúW¬P{<)Åð8x™cX©våÚx­ÞÝT&΀BÖÇŸ æ B=szaÌ•©Æ]ø«&µÚ'—–¡Måûˆjô•¡=ýCOÇ?-ûqR¦!÷‚ï`˜aº|„þ‡[ZöðätÂFìå‘+å€m‹‰ê |k3ìæÓ¹‰ž#qwrcB¡›°îÔË ai\=8šÕ3n`¾åÀe]ä~sSám‘ºÌ-LÚ~P ³ÞzÜ(,³)E§N>ë#á©È€ëñ†J{|ï\¹š}Ê1O‹jÕ*¨ý?ý̹SR’é ‘ƒÈÝ5ÎÕUïàø¨è|ŽtåÇ]ºÞ¼€ª[å»3‹h¾¨ÇoœøÈ½PÄÕüu ÑI³jTüó&1]f{ŒÝ’ßÜË­Ã)¹Ê Dæ¿=“öïçåËç~¢šî›]:Úáå—»GÜâ½c&ý9ŸuCǦÀ›ŒöÄÐf»èpJ¤™fK=ÕþñSáay¶úªÃ™/Y×+*þŒÿ›£lDc­ÔVBJAbÑ•F­9F•çÇ&yyø‹6 txÒS“°mضíàücë:>«@ Ï}Ÿ¡ÓdŽ÷–Íû%Yéƒ2ÒwÖÞ<ø-¿ry8WoλØÏ´6F#‘:œ•5÷>Ž™ýîxl/ÙÞ¸L?‚‘Ô 1¼ù˜Ѝý .„}€°Íšzמ´sv”¬ž¸wÏñÎU [þ6Þ‰„뉉}ï§ã‹–Ùÿ©\kóë³d¼ºIßùÄÖaþl!ÀµãÌ¿Wœ~°ÐÅO9A¾û¬²ïÕ^ÈHÐù‡oܽEÐþ™Â-ï\U¡°=÷2½¼ojêðG©ÜàãrjA5ä‡ÀÜ|ôWHÐýŒ²’øýí÷1­r?âAH¥å¹µØl¿tµÔ\¹w¦fÊ©tŸhÈÌ–s3Yýw<2&>¯ý‚1Ô~T¢Äœ{åùÆŽTîFë¼KZg¬!%‰Yæ&ñ6DOiå©Ù ÃÚ@âX“˜o2>_ø eš¤˜Ò –·,|Ôó÷îTó¤Žs¸¶+Vã¥ÃI?íÔdO!Ã7§jŠI”,È<G#òs ”QMß™ö¿[Ï+æÔm’•¤ÞUè”h­>µ·ÇZ_8X~pß›7­x^’vX ¾mç¨îqÏw÷p£øDÔ‚éõ …F>>éñƒaw»˜ç%žCjÆäî"NÚù¸!÷½Ï©÷[×­Uq¸C»íî À‘Ö) ßÁR:åàR4ªÑJg¼Ýð®¢ÅßPÿã÷Cîˆqu‚-ï_ ú¿akο”~>Çľìxñ"£FpÍ t!r³Œê} å„û›Ø­™Bß”ÆOéé†Ge^¶v†9=¿ù·0óÝ¢i!Zø+ÓNY)'Nï[Ì"T €´O¸œK'&#˜ªÖÅLÁ·Ñ(Û¢}aku—UIÎß5ª¨“V°µÛÄH!z‹ª?„¢õ·@š)>bœWÆð_#Íl …й‰ ªœø¼%£ö¼KA_ˆÑ‘#]uó¨äø§w åŽEjÂ×S;j‚Xb°Y¬ôÀÔ,Ñ_Óas‹4MN”øn“.7^î½G~h‰wæ¹W—uɇțJcA8ð:tðIôŸÌ*È‘q²_­½9íÖòlÿ[oqÓØONn”¬ç8 ƒé×Dá zÊFÚt€™ƒŠ[gÊò¤™ð÷eä«Ä‡¦^w_Ò}5T·XQ? ¥âm¿´ë6å(ÒÛ²×XnðëU ¸ ½¸–0²v½~¤d•çó›«bbyral¹ÐJ :×¥É}zûk7|zXÿ¾Uâ»÷ÿ­è…q¿­74úî?â6o^¸€Ed$yÉs»bð±ë×—#þ_+:?i¸™0ã›4{Ù«‹AÙ,Žô˜¼Rät`ë+σ§ù(§ Óâ—Ú~ä N·Ià¯/Xls–"g Ž"1CÚ¬¤åüðò(ìĸ¾ƒú¬¼­NV»tŸ#©\áNªùú4?Ñ×ÚE&PkZT75 ù–üõ'Ò]V*ÎÑôzï|Ê4C@&…5øÑ(¬Þo-ÃSuX…Õ Vˆb#QtB›I÷p@S­±ê¤?°ñ=¼™wuD¨ÈNÃÛ£“™ Ø&‚&.Å<¾ÑÎAÙƒ·â« †ÏM™Ý‚çM-}¡n¹9;ÁEKggï‰M˜Hœ ½#R¥a;ÑiÍ7â|gõϯÏ´Ö…8ú2‚;Y,f<' €æíÏ ¶yo ÚuE•@Î8˜9çl‡I ëûÔeÿÝ ZÄýq¨¢¨ó/Év™rÑ{žQáô!ìc®îäƒY禇ÔG ]?iÄ“–ò]ñSÉhø¥ RNtÍ®Â^žèÍ Fgê +«< p¿O  'Ýý$â¬TœÂ‰À6bcìBÌ:H>'jžN,7û6³cNwÞä&RSù¥ÞŠN÷2(ÉÚG»§›£Uo oãƒwßuÅ~©ôµ@mòZØ6ó q曘¡3’kÊ%˜AÎ>iïððü*Oùöćâ¿ hjƒ¡=ZÜ·GhÝL–­³ÎÕ‰Éë‚âPgcy ®AA±ŸêÞíÉBžO¡|Æ?âùú?Æ P:+³9Õ^º9[„?Øü‹ç8ßV3— ŒfNgDÿ†Îvœ>1»MS¢ÈÔÁXBS2âß.:ßµþµÁ›ôeE0sý±—<1Ç»RY”iý1?7Ÿ j"¸&ua¹W2¿êÒlxŸ¹çÍõIIÅç‡且Éé¥99œ”˜`™OÈšÿ¦]þýüÖì=¾Ã ŽÒ¼~ùvñªØis¡¯sDÞéñ=÷ÊðAG±Ao.³Ûßi;¬ûd€©Ž_ÛIöãsè<2 Sñqpßõ+'k0—?ôž ÔÔPz ›¤À QM´rš¤}i¤ÀÇ I­¢‡#%xêø»í´‹DëôlvøÞ3>;_Xæv plÛ:‘6ZEq>VI/¼Ú“ü3§x1¸8 /b3‡—>§á»Ø¥Ž8î]d9§5k°Ð¾h޹Œtý“*ò¬d·×Æ?q*éâYañïÇ6¹ä{JpŽÓ›œK(žÕa›ÓåJàø+$LpÜ[½‹Eû¿&Ú­nd}tšt* GPºP“•õÚ&# ¸~£³³jÈÐ6 ?­÷ŠÒW„!ß$îÊ;!ö®ê+ùh缟±¾ƒJØ=Ö°Ï.ÁéP¹3ðþù²ž¸xë¿G:㎠Æw$C`åþD·ÁkþÍ €IC‘˜ãL„.ÍÎ ~ѲüêUÑs˜KŒÚ컥±€iÃgRŠëEÀ/ÛOíˆbÃ÷K³âîÿDçÍ üš‹¿¯fÛyõ8ðû»Üœ09ËJæöDÿMõ×Y CyD­S¡]Óä˜Þ'o@i-iôdÍA’å%iP¸É¶~ņ”º¡Ð| 9­×0 æ·CkÙª¯Þ ³n€u¯ëóà‡9tR3„Ð¥Rb[—’ÖXDšÏjlÂIÇ@ɬ²/í{§ø[g(jO¼VîͤL¥†ÊµdCÊ£ˆa&á„Î÷ý¼!N¿¥{º ŸÌ:åArÝMµ¾I3Û›9¬CÌM3[¡øÄÂ[ñ~ ! >A,#è<þy„!ˆB‰H1=74ª3„—îî*ÌöNª&¸ K…£¬ ¼X †Fdz:õïhØh£®®>Y¢lMÝÁ5³M¦U1P¼mÌSYøáñž2?"—1n,Ú?õ~OqhÎÑ=ˆÖÖPàã€ÆÒ*Aðr#<œæ,êÓ€-Ÿd™sžôH*O5«|äF[;·Ñ–Ïå@wL>÷[¸>®ú°Ñà´Þµ_Ý2.©O2¬AjÉA›ÑÄrÇ X·>å^Úoþð¬SÆ•š~º«`káÛ¦&>Ðæ >Û–»ø&¬´ü]–†s. /-&ú¾pý©Ï6IU›U¨ÎXCK¡yùÑwoÈ›Æ)·Ñ±ŠBþ%5ó+%ßéŸüt MÓù›%¹çí~ÂÈæÁÆÇï¶Bøñž8œ´Ár÷LKðý ÷¢_ý7@ÒK .–>¼ªÚG÷+»§Êðö'ÿx[]|üñÙ- $2{ã5:W]þÏiªòèeRáþÓ_x0ß:S¼Ãš(’ê¸s´ ž¡Äüú5ãÖNDO‡ŠyS&˸sФ‡ˆ÷#LvW€»B[/…ëkS€oG§ÿŠè<>]&>Õ¶œ´.!ÉòeÃý´3+ÿÜŠö§ž‡NqèQxÞR]Ÿ–r(‡˜Ó+øÓ ÷æDIT-Ž8õe"žY1ô1×ûÂÖˆY¸-݉X,XÄ[άºr kÑ{xJ¸¯ü<= œ\“b ðäó¦7gÖ/`Â:|¥Î·6Æ`‹ÔéÄÕBƒ¹õ„@3ìbGr^>½Þ„ Š”¼õÔx ×˜8¨ù]g³á«~\{Û™›uï‘¶Ð;n?äzÙµù1ð³)düöx·myA¶‡y2š]bÀ„Ò¶ùƒó‹ÜT¯‡¤Ù³<Çä0ݼ!SÕ‹(Õ~¥ &zf‹ÐÊ‘c1I×û„X‘×ey Y‚0=o(áÎC¦ /©ÒVž7 .itÐ %¯š¸Ûd¹§ðÆ:eKdÌŽÛz¶PBié·2™é˜<òsÇÙ8ôÿbc¡i V×ìô1pVgO®fmåÃxä# WëS¾‡ï0{¸1RÃúMŽ6”tâHˆ:†8so(nÁ^>|63ùz—ð2AñgNÏ.Ø\y\•®m–º=z .¤qàJ0z— PS6sƒe·ªÿ¢{žñ ”Òÿú7ªYçFíª¶l˰,„Øo–cŠœ÷âִȽi'0''É)ÚäÝà=¼DCŽ‘³ü0Ýb¶¯ôO Š&üŠøtìi¡ü³¬x-K„{+ZÔ8C¾Ê1î8/Ö›×d>!nr`ÒÄ œfÞÑÕˆ<ƒ$G"TÓ/¤òaµ»g¥YßBèΣ¹‰q¬$n&¹L©>(ÚD¯Q˜PàL@‚{XVÅ<—µÕåšàþ&p³-´Þ—kÔlÄ¥þЃÆE¾Â°Ëp•_,)gÒA/ézÓÂY ·já~ŠYÁ‰• d‚SÔ» ;—>yqQݳcÞ™Üä ›P¶g8{ÊAŒÍËRHj’„ ªòpûU¡êÀü¤¶P|ŠÏ çN8ÒzöÇcu8y·l»ÜPœ|Uß ¢?á¢Ï#‹´t¨8ñ¬†DhÜ*Ú/æÛ¥S²É_*:oƒ™D'ÃŒIip—~tG hÝû,–í|àåÖ+qª›çÚãŽNñ†õdz‘¬˜YcÎBV¤r„¬Â. ¥ˆª5¼T3,ïÄûPü¿Ÿ/ë'þ©T Ùœðiîâ ßq“è;.¼ûÕË9«Rå°¯€í­”"8YÒgˆÒžv|øOÝ<|òö¿­ˆ$¨Ô€‘ˆÛ‚àÞ Á†%õьն#N>!Ó—k(éï;µÍÐý‡}½×d†Ð±XŒ,aâ(!…¨8¤Ÿe÷:'ÔûR]÷ôà2ê_d¬UæxL‡€—÷Ÿ;¿¿$Ó¸ú8‹ÖêÁ¯O}ú;ð¥ûás_v5Pr‚=ùˆ«¾€ÉòEjÏiÀÄ7 ýyDb}o—*°ì1Ôvá‹«õñ €â/[ƒÄ­Í—7‘@ÿËsâ± FÈ'wøÍ €Êìúõ0õYoXûtíþ$pC`ñ‹Ç»åÕƒc÷·‰ü\`~î–q'È|f ú7(áonzg?¿Í ·Â‘¯­L5ÕÔAzgœd¡U´®ò µ5Zè(9GBa¨+)dM÷QôÐÓr=óÿÙ»²ÅÖq\‰’3ÿÿÅ×u$’X)Jv–“ާ§ûœÄ–%. Pª¾?”¦Fðô¼{ĪS:§Ûè}÷ÿž›Wó“Î._º>ª(౩€ˆÉ—0ãº>qÄ jX—öX·\åzZOSÇ< Só|úáǹ7`ä¤p_Ã"ë öš<ëòü2Òùn…U ÝHx"|õÒtEì²[‘|GÃ7(çú{u{“k׸Ú.vu½M’©j= P«»"ßBdZya‹v3Ê6‹±ŒÖû£yðlôÞbj¢ŸcÙhˆ§j†0Չ谄^ Å¥Áì®:¸7øTG_/é €éYxÀø=± H T#´œ=‘°% ZñeP³ë­³ £RDRöŸeqÌJ¨ié¼·‹ó“Y‘Tt u õÝ«ÿ;5U²€›òlÒ°†g5šö ?9’_(NÍŒZãÙÈ~žCp½2Ã-[> 4Ý~ØQiÃò¿ã»†«#[Þimì¦k3¶#ݤ@žÿG8Hºµ*FƒÎXs®v`>ËPØúämÂAûá ìž'èݤÙmý†v ЬGÙ,{ªÁmµÁdúßÏ!™!Ò©…”äoï˰OÔKó{g€Ý"ÈŸ†GhìýšMdäsm6’{n`ÛD v¢jŒm™uR¬2gµ©ŸN¯’BŸzŽ3Ü/1…÷ Ù=5º–û‰íÑ4|íñY›&XòzzKG§Ý6ž]'«z\©l3µ©‘ZÁ qšiT×ü(8} óI± £iL@Q7•ÅØ+­Ô'2IL_nï@ËÒ±Ú zJLÿsh! œ¨ ŠÑm~T) ê†ø(îj 1Š$%ywøZ>Š}×ÊGÙ×;œ¶UUL`ÖûnJ£ÚìàJ»û¦°F 3ÚÉeº³½kœ(0ÎJ{à¡gE›%Žv/V5 s¢‡#kw½Už‡%î%­ö45—àΪQ>¸®BcVŸ—ѱÝg;Á~Ìà5Ý{ÑŒ«úÃl%[í¤-]yt©lÊb×|Œ0 áaa™°‰"¹bìóp Ì0kr,[ŒxÍ®ª9ÜÕgc†ùÐU®³—éEë òo„èþRH¢ÓtW^7¼P¡Ìã ÚSéßÒµX`R¯z“t_še`¡=³È™!D½ª9ø9'}:éf!ù{m ’L;’´".ÐÄëo. ’†½·—6ë¶óp§r3’«µžÎN[M®áR@V•iáˆõRŽ÷W´k-’æÍõ¡Ú°_Ù¼w}¢ÓgOÂÞNÖClŸ¢¨µõæ*ßö|Bý¤ƒñ¶a¤HFݦùÕ0GÈûY¯YR#=]˜ŒXÔ’x¡ ¼wí׃܋ÙH&âk8'5­¡ì4RA_<¬GÙaî#bÚÄb죡{wá`etOƒ!H†Â^éØFÄ£¨`Š©ÓHÐZ¸ç>4žèuÓ–IŽ&‰‚ÖFÐÀæ~û†j×äÛ ´¥÷‘ÄÀèt¨ÙŠü1\óÖUµŒ¤ÞØH žm£»aÛdÛLþV4#|F*9 Òä¸él”©)3àß,ÑK>«D©¯²{ 5ë¬zH)¹êHTÎôã&‘ʳN‡`Á²¸Ã»Ž=}^F1ȦøiGN½¤Á½3nñ\*—¢àSž~_™Œ 4F¤h€`Ï ]Î…ï1ÿIr0x>TÉ ®—4^}’峡ªmï¤AZËwÒdðÿ‘%)‚úìÖwòâzƪŊ6gØ–fÒMž^LP§u$’ŽHwu“¼ë…~~€#K¢mB1¯EŠÁŽ·uãºÖŸaÆr Ê%3öê±Syƒ•pí•`Éß^íHÂøŒACä+8¯îaÊÿ³Uh‰øu¾ƒ“gÁ’£Ä+ªÅ)‹½Ec™Úªó‡½þ¥»÷¦ØwLýò6€ËdŸû|r6bÖág/¤ûmó\•Ø„s:ñña¾îjE¼}4Ô|ƒ)‘(¾"nT¦{=ɼØà8ôƒü@>Ôšañó:¸ætƤ‹Î]ïšu±ËŒ£Ò¬mŸÁz ÃÔºŽÈÌàï!¬íVÝ¿TœàÕ€mKЮÿØëCŒè)lk="VNu¡ªNqÈ¢/ täg¶2½4ž›+VϲG µ¯¤í_,äÚ±¼˜Ò{ü4OûUèú"H—|óðÑž7ï ;ËOqýr•"ÿŠ^°X‰Î?w¢eJ=»¸xXÔÅ<ºÒÎöNâ£êm»dÎe× Q?µ°¼Ñ›òþ¨Ä3 $ßë/ì7 :íÿ úW c2ÀuËt%ê½äˆBŸþ]¯Ò4O]nº[w=ˆpSeË©*TOr÷Œ@¯øEþ{i$d“ lض £Ê–mö¬©…&2Ķ“þ÷òÕ&çɹ{¸—bN¢¨D‚åZ샥÷y©qÇÚ–»åÊ_Š/{í¨qܺ礩¨Žz‰tíï>%Pì±HqfhrXp]A D&¥µO‚»<ëï=iÙ+ÖùÎù›ÿ2Ó%ÆåïÀÞO}­§Øþ êì·÷;ï‹ÓË´ñðE»5Šþ‰?ÊŸŸ³©þ&ãûÖQ³”º9”Wh’þëÎ7¬æôPkUAk-·ÐT®çîÏßknNñß%4v“ÿ8éüÏâ0 UwÌû(ƒþpÕ¾¦‘±IÀDá\}!Ü•«Ðß[å~ +»iÑbë¸(hÖÞNÆ£i§ˆð%Ѫ3‹ sæÁmHoÔÍZM@‘]Uúwô£}0¤@POAÖc¾›ìÆ$è®[>½@ÖJÙTÄœ_¬eˆ•‚öîš;ECB1È[¤ØTö©Å*½S]Ö]ž~rSM¿~Íl`ŸÉÖÂÆö4Š8Z)»ölA²!0ç,V†Û ¢[`¼Ü|NޤÁ.°»2»óbÜ!…ˆ½4Åìc¡7Ë "­?/ªÞöÍbÔ70_[¶àé¼ü±È‹ÀS·$4Hºw ap–DeJÂnép¹ùHë3P¢Á=TÐ;:ç¥v5[+‡^°]x±`ó€ûÎæ¶®`ktÙl›tr3Ó'N•߀RñÕûs¦–lôì] Ѻć¤/žž1€@:ïÿÖü’q'ªläèÙ°m½{ØL”¨40,zAztÎôëS}ÈÆvˆ[=)ÁËÌ©Ãöui7èPfpVé *T;FSr ½©S\‰Ç´† {"S£AkË×ãì¸Pÿ„ñä‚Keë&ú±Ätš¨üQ>oØZ«} К),;Ïw¥Ú ²ØBJU$æ*ŠÄ KÍʯ²!óð•NÂPüîßô!aôSKÓz”y:@ï¶ (É|P´ÄGMYì`æVGO½Û9µ¤iÉbZ :›æ: ëJJ}Xø“ F†Ø:õ°°,ˆõ8¼‘c÷®á6´2À]P],Ù‡³GC?Þï2$«Ã#ˆÆ ¾KEæÄ…ãpt {„Z-Ç:B0‹¨îzö}'Õ¯ôÐøÔjh+Üè}Á@ë‘<tEœ©§¬t $F@¬PF,$µ7ƒTUÚÌÉi›¼ÈÌ|KÙÓhC%]¾ÊxðÓ¡ÌPÇó^cå=¸§HœT†öAæa¿–‘¦"µäj8à/µÚDæŸ|±,42]*¤ÍK8é!ùUT ŠæØØÝ+0ȸÞœ0ع¥~>Èý_ÑzR™zÎÈ$JCÌ8c{z]‘°O]TSPráà –FŒ/–?'?Z».¬Ž•îõ®º”mØu_4R³P´2ÔuJm¥Às¬É–k_]t_Èq ÄK6µÀÔŒ@¸œ)˜•“¥»»¿ÿŠX›½þœÀjnÍÆç|¤kÌót>ßœùTÊgß­ÃÔÖ fä”]¦ôqæ&hΦ>‹4s°8æpdŸØ#¦ìÅÀŠ¥­˜ÞîmAI¾&BŒÎ+#Õ¡æ_ÈA›VÝðåÍC€÷öÚþ'2êKxï˜ðÖûùófŠKéðÙ»ÊF<óË4Œ3)”ìB± ÔÓ8*oh$è\#ó䱪@W}Ç!ÝC¹i’+aáSµkÔó Ì¥v½ÑâÁS–…é…’ ¦Bþò1ß9lÄÊ2æ­èb¢.ð8ƒpFî|JÐíVÚ§jd‚u` u@Cñ¸mØ6`ó™©'µ'à #$~a?ÆœY¡ôep=Ä“‘ØZ!W®]Ä[ðà*RÚ_›³˜è•ÂÔãÀ­& ЀSÚÈ Ð•«=É¿m «ñU4<#ÏqÚN–¼¤¹M#Ù¶MÕ³é’ð#NÝ;l½YàTW¦X­§…*ù™5;ýKæ”W)¿]DwtÝ9œpÙäò¦8ÌÌb_Gµ’úR¾mVNG=îJË0Ò“K›6¡2èá|zèËÍÿüŒM¶áoA@þIýzþGÊS¾`Ù½¼÷žO%Ï¿‰ù{ý½þ^¯¿×ohŽb@èä?ZÏþöû=øÜW¡ÙmÃt”sû•ÓejeÔ¸CS8Äe½^:)ŽìTòÔl\ý^;cŸ"òäH;Ô]ƒˆß¶Y7¶a«ÿ¯½íÉ!û áslSØñRâ¦|6òc½’¦ökø>Ú„ÕY>Ÿ¢™N¬x½Å}+µ3îøÞAÝs'ÀΙÖ ½º}D!lÒ |d|£4}¼­;(C AôIÖ!ºQV(mÀ$èDˆ][íkr½‘Íþ§VÑÀætˆpÝHÌþ|v‹<ç×;ÁJô[È™i¬¡>%+¿ñÖÓW‰v< ÅÆq¡Ï'‰¡šB‹þ'ɨ±™ •ŠþLó™åHb!&™¬dÞw+áê~pbŽrÄéQn­{HA8Ç~¦©Ë?Ëm@É;4yP ‡'뉪'„ñ´H§u?Ü„ÂÄG°£“õsí*Šaƒ ¼ð‚Úl{ 휤à•å‘ÖöÜ[`š r ¿ìœSpYïÃVm7nèdª¸c,6"Ò" Þ˜iŽîbO¶‘œU$4¡kí9yDâ÷öù;åe>­‘LOL¥¼õ!uûaÁ¹lÞbzž®Ž~–»¢¹Ó²åÉ&]:…™põ¨â1)×¥âV˜Â JÑp—.9vG®¸xõÕïè(÷@.áh즩3M(ìEèèMoÞsdÁ:uoæ—’Z¹qeFŠŽ8ÊihŸ4MŸ·-. ½„fÁ¬GÓ¯ÖÈ Å÷FÈ’öì¨ÿì¥úÞÞñÜ~Ô‰,³~f½Í¹€¿ÍÕÑWÅEýHÊ_§0ްr †(ÏþˆaiNÏ—R¹‘1g ‡ ‚ÌÑéÀÂê8•7¬ßØ R4¯ÕÐî}*x[…XÙ!X¿9ìD¯ÉGåÒþIçia´Ž)ew›’½Å€ŸµhÜøÎ)y:²ÆÄذ~ Ë\¿Ÿü´ dGû…Îúc.¤ŽÆtׇr£é‡qU•£ÂÔò^ZäÐÈÚÔs†P¯ú¶7MÌ×Öòðío¬÷=£pzÈ3Ϋæ1ë¸ØA–©ÛBX‰Óç~žð͛ҀŠógÐx°ÕÖWÍéÃsޞÃX`¶?m ¦•$¼H<Ì;·vÈÇBsþuéÚQ‚“ö#ÎXŒÜ¡¢žÑd<©U§ÊØwBçã<Ø'šîtGaz´ÊëŒà µ}ìäÇÕ·ÞÃÅ–JÙ6Ù“¤RWéHWg ± ÿ`¢˜ ¬K¥áqè$ º ü€ìÛO 3k,gCC…af€—Ž{¯±:ÅåÆìÁ2¼¦N:'i|{eÐL½MV¹”R_Ff˳ižõ¬ÝÕÌ– j^KéÕ²ö(6DghE' =/.–®ôaÀÀ$H:;tÚ¸²AŽÝá8êÅCYOlŽ0±µý@<hãd‡í&V9b›p;í6^ªuX=ŒOÉé?LÛÔ8WD±O•’¥ GSÎÓˆBÛ’‰xé./Þ´ –VæžÉ»¾ö¡j Ò 4ZŽî\+hx*RÅ0xœA…h[5€#bàý¹1JR ’@Š5[ 6àÌo›¦,â=O²¤Z²f(‹@ÕÇJg£8èŠk›á½öÜöJ¥$ÄË<åfDqú´ÄáÈ)_€Cý—R3áÔ1¡VB5¤¦S¸ l:ܰòy¡Ü(”û„"£î›K²,Áõ¡ÅgðÒº:{§mïŸG]åWèÓ=¡ v^OÆúÒKu˜A¤sêðs@‹s‚üj“LCÏcÎNêŒ6ÀK”c~)JÆÚq€ ¢^C±ë÷Ê® Z›]ÐéÈc'ŽŸÖqæHÜ„G+úû*í‚yjc² ïC|Å cXÍ蚦¾l¾kÈP¡üRˆV8\’†7’‚KÖþÁ5‰]Ä—ã鯃tRPÍêt§­BðÜÄf$D©ËË”8þ‘LÚ­p{ÌêµpCœ€¡\"@»faW®Š0åï$¡YLDvRÛwñ€ùäÄiž•ä܉åòt¿¸r×U`\uÔF! ÌG>:iªÿ§!STZ beE9÷(O¨«½°TÁ¯ºèöP czÐìöHŠEÂFI…%s—'eFiò–®9€-pUÔZô]8Ø”. 2Æ(âU¨^'M/¤ˆUtpüaÆÞ_@ ±A° ¶äçÀ<©Y”•2õÄ*Ï»Âä Ûµ®eÈÜÛãϳsÓ×8B®•¯[Mùžj˜«âÞÅkJR¶Áaý‰ð™ó„+÷³n±Y‰¸ØúΤx¾ßÞèü d•îñ}ßÄ9åÝÝg}ý6*èyÒ“šwƒü6ïØw|ÿ½$ê ö·4]2¿î…ôôùÑwü†ÂÿË(Ƨ­AÊçð ~û±ÁŸ¾Š>ÍLë6ß‚@ýãÖææü‡)ñc· Àûop]àÚ0U)1Ã÷_$ÿ™§ {Þ¸kwÄŠ×+#ÁõLóÌüNzSP–ëÃd;’r¹žPH'*÷-«ó—ƒõº§gOQÏ£"£Õé´\>ÑÕH­’¶×ò;JPéhf:$§6½ ¢QeOÕ `KKRmû(€uuÒ:Â)+P\©rú¢,N–0ý¢["©‚-8T™4;Ýšïc6Ÿ1]‡s_G˜Ž…êÝŽ…-L†º/±í@ <;1½m9gŸØ ä“Hfà ÅÀ¨›¦§ÆÑ»«U!* Q¶_a e-&aÐrj‡´‹Pð´2Á»• 8I)~¢WQ¶ú“q%]Üì&ðÔH¡M#ôš‹®?ò4E}O9”¨uø>j_»ée84E÷ Œ¤I‡ÚI‡cêÿ úµ&&³ÙpP—Á–…‡þï£Ä©Ó\èM‹§Uv›§ÊÉ»ïíÈÇî"‚m½Ý 슜;Ê7€¦Ù–d2Ô²Ó™Në-¸mÜ@jŠ«¸W)ÖÜPpN+´ªÝ!rFßSÝçÎvëAÆM£6„¤ÉŠ·:Z¬Çq5 ¹èªEK-!7þq’OˆízK=+ æ¢<wJC ¡gºðùÊ4¹E‡ø«Œȳ{E^h2ÊuUE¾:l©ýè´FuSœ­Ç#¬­jvåyøÇ)uŽäe1C¾rÁ Î[ÎSkØ…Ê\¯ˆJS•24eDMPRqTNg¡7uÔFc%JèÌ*Ø[¶°9;6޾#kMåQujOÕDBÝŸñy ^eÁVÃÚuIÛª@´ËMОc’VÊÇ¢…/Ž-µª|2zØ=(Ýu&í˜Qʨ2IZB¤ºøg%×6,³†0œà8£ê>„aÉ~< S1ÙcPöDÖÊÆ÷æ},K`Ÿ>²‹ùG‹ªœkMKÚÐÕ̯CHˆÅØEÅÝ‹†„¶ucTóO*Fl½pÊüsQû>2ªaŨ€‚Ú(ãP»ö%”Óõ¢“ú*O_v]ºªÚªgµÖì¯üº[¬goL/À¬½ù¤íB}ø÷‰¥Êî¥]DÖëøÉpz“ªb’fæÊ¹\Œ$ßu‡¤5zgæÒâ7Ò¤/ãþr‘ÿgbIB"_¡ õÙ_A:/ËK~½@ÇÍÛ&¿åŒGŒúïn0o.Å¿œå+ ,vÅÍ?8áJ:Šø[¾¬ýÃØx<ýÄ«H`Ò³Ê pÐy´Œ"MDÏtXÎt"¬…¶ZR²¿°TÆäd3ô%KA[¨AÂR´÷“6óZÎ4f]Ÿ‡KçÁÌ4¤Ï|Sp§»˜eȵ™ƒtæÙÞö³ Ó¾E€[/êýGÏ’‹*ºÑdñp]‡¤ÁŸrºfÛÉÑG>ÿý¨Wïù¯#x>•X0(Oq½ìbáˆõùôH®ûuë DT±|püÆWîaßhU$Ї–©¿õ PKLô{ñ®”nïo¬g ™”.iAÓ*.AÚ|8”ä´µ„-K‘¯ê4=w9}7 EW ÝÁ‘°Ñ`Ç©Óx“‹ÓÔ—!¥ÉµÔÒm&èQè±7M'1Lug!IpyÖ‚…¡w:†! §ÁÛ»l3 ÇŽNÀ¸“d@àeÑÐu ÞÇGžCÿ‰%53ÎV§÷ÁÞ¨Nyz:Hc’YˆçQ{óžÆ½¥¨éFuq$K“CSÆj„˜ÆÑß NHÓFÖUY˜:ý‰ÄPë¡c*$&ÇúaC Ãôw«ÒGšÌD&¢ð"UîТÆ@ãˆCÿg.üš€`žÒø=J6*Å0I®ë¯µ¶]©5ÐÊý BñY ö~𼎠,ûp‡–6G!Òô\ºF… t&8KSdz´Ê”|º»0%@“Ú/s®5®!’’ÒªŽ¶Âè¶÷‚f‹äÚWÛÃ:¤èØ­QCưhÃÂQhdÚ s’ hõ[>ú=GUÄsƒ u3 ŠÕ]¶3’/¡îm©ŒÜáŸIVÉÕ0:/Ö4 Ô¨"G=˜•.8© ›S³Á–™(ª×øS¾À³!µÞû¸å1#ømÁKw»>· >»0ìæôÉÍŽE”S²éëZ6&Ëþ„Wp¸¹,Jt¸ÒN©£ÚÖéôƒg¯ž­„Ù*¥£’ÏX^ì˜(Ãèü6­¢íú$™ úüЧ8¤"ÒÅ^fÒ¸]FŠ®Èáddã-¯3¶eJµJ©¢±rÎÚ8Âz’÷íêD{®¥e+éÎP´ªÌ9߇Di¤]ÆÍ#¯º®³No&de%ˆ¼õl;é¼åúéJqÔG/ERÆ–*e«½ùH)€ªu?q*ow¼þŠ+³Þ§çE#ò ïüHÈ úÔhBh…׬ËVöïY 3zGÿii¯˜k_Ç¿_øèßëïµc¼™Z'2‘8¯¤¡kgNAÍ uõÑëák"d8uöz öv ¨rÿD*¤AVœ©@ç¬#é¡Éy¼²¶fê©úü-µâ@~$-e<7€(bêî¡ÛòĽlê8Ç[ïÊQN&ÌÛ~«ŒXJT nã…½àßhÙ=›l[ï/H÷´¬!!¾º ‡´.úÑô`ßc‹¦6d®Íˆ«É$FBáb¥_¥µÀ›ösVVz᩸t,¯jT*.q¤ùPƒfhÏL2‹›â DQwÝW^ôɾæqRa R&í xëÖæ‚sïô$³2(=h¸6´†üz޲°Bï\Qũ徨é0ÅN(SX¥„Õ¹pyûƒÇ{?-»A,´¿w2jßåLóD‹5“©¥ÉD¼®ŠNã¯~ôëÃ44i à¨a$^H˹¹½ŠÔAèâ[%œ.qnìÔ.«êüÈð­©Í¤ë+>ký~‡úÍ’í+.å¬4* ! Ø©¼#±V¶‘ DÔT”ˆe_̤¾ {7ó1G¾®µ ÷¾ ×%4tÌÉ&VéÄ«q¾Z\à½/Ó-¾–’Ã-Ú¤¤ÒÕ³ Ù{ì"²õ*j»oUkÞÞe¼¿O5aû_ ËVÛ½x>É=_t˜«dÑ ­|RddOíR1=aËøŽhÏg– ªþV¤k`ÝëE· céõJóQè€ÑÎIÍ|ulºB“Qÿµ?:ó?# ÄBÿ0ñ¦¤íó¶*͈¦%!mˆwj lÛ¶mÛž8.¸mÀ†m3[jçzbPÞõ&-˜Uzª•5vÅ+1«>kãl g MIõe-œáºÇb3ÌP\ó㌕èŸuþ½šzg†=ôƒfçØ–m§*-,¶1€8ŒW¢Ÿ\OÚ(œEÙy1­Íh@T! 4£´0‚£cIçAŠÊ'ŒAîþAï>¡ÛˆÖï4ˆÚ" ì)Ì“1RŠÝzÀ¤[®Å{2 xó#O¯ŽÔ«yP—ðR,Ýú…ÅU•”tu\ûƒš-M?–;6ñµÍ±~ï åÉZèuÞ%¶Ëág|šRNí--¿!›Í¡‹1ݬ!Àkßx ‘šGÊgjW r_²~¸xëR¨dêàN‰å„a+­Få[³g“«UÁÈî8¾Ãga*¥ÕêÈ4'¾¯nÔé¥&ü{×Ûf:¡VìkKžØòQÚ¹É.VÚï&OzÔÞný.u*Lß±qRYÎÈÚû¢ÞäùtNnó3É.7»‡×ý3Ü0û‰®®©ÓíWˆ¶E¢Ñ@Eüoè8Á/¿&WEëíÏÂÑ\Ü«ðIãÅ¢³ŒÀ(Æíeê̘ABöuL“ìÛ/°=ö@KF@/ `oÜ€’dÈH`¬!Ñ š#³y¦3ë®Däy4{¸=:’”û”±QI=ëU¢c_šÉ±rn—Á®œ¨·$GR²ä²äÁÓù~ˆdF¤&ï Çò¯ž°±QåÄüŒ§“ÓM™º–5mäa a”a?òGi=>¸y˜ gujŸÖ8h¢}{Üà‰¥“tGº”‘¥0ÎõÑ;Ô³®z:T–p,óž–ÐMýÑÝGâ«IoÂeóeë›Ø*RP ¸MŽƒZ‹\KË¢~ï‰ô¨>ZæõxНu¢Qo8¯¦“[‹2éªctà‹Ë|Šð(fU!ƒ¸/${âÃB»ªt¨BêÅ-º¢Pq…Ý%Q'’R°•ÓG1Ìÿáy1õá“,Yb¥&wɈEZ•IYº›Y”cªÑ` qý©™ñøcšE[ 4üÆ ÿCÃi3'|0C afQÎxnf'ÕK€ÝÒNÏ…åt؇y‹åÔå•FŸR ˆ#Háó,<Ž@œ¦TÒëOËåÍ¢ÈÂMˆb}åIŠe>¹š6dB>Ž@Ãþ]G6¾?H11Òu££!#„2⊌¨Ñ­ôØÚŠ¡«½Rƒ×OéIfÂô§I+>¥[U7!H˲Õ+âÑ3OUŒ³Òb£y‰w#4ë‹Üì´¾¹KâŸ:]§PlZ ÓmŸF ¿t>©ˆÂ]¼ê}Mr-Ž,q²æ ¹pÞK´ÝÊÄÜ;ÚÚ€*íúŽ˜ø:ÍbXÂE0Úí¨£©€ÅùÇàó÷ú ¯·Õª]ÑYª¡ l©Ó ”à©OšÑ;³TP[ÿ -äŒQudâ-S-TÇ[‚pGîÚ2²HâqÅÖ:°¾Öí4MHcTC꯷ýˆ9%ZHuüÓàŽÐ ªVI 5]uE)Ęrnýõx›Š­zîæ,›}¶zµ^)30øÞ!9–ÜÉg^¯=ÆK.É»lŠžÑý &䵨Zñ·î¤»^ûŸb™$;R¨7&w¡Ô¬2/8}T62è׳q±CÕ~±‚ˆy'£o±ûN¯«”?oÝ>XqnÀ^óßqé’^·HãI •VäÔ!Âó›ÄB“5)tà-ß{§[A.?åE[‡@öªl áFkqRã Ô¤PïŒS]ÏÉtiø”À X}þ™L°T¨Å÷™¦—y¯þ¯ÔÌ8¦ÒûÿìWÑpau²?AÓ1—ûˆÞû˜"îLY4Ô³ùiñï¼Nöõ•¿Ò@¾HPsÒ0±q1ªn¦~(g ô‚˜¥ ûÖÖÞ³]‹KÕ÷WîUî{8µ7ˆ¼ÿç3\‘|5wà?A:ÿÙ땦—¤˜‹Táû˜x'¦i_ÆgŠÉY‡DhQ¼NfMS¼BŃm‚Ãc€¦ ûB™`é`*J•¹eSµ`ä`F°eÀV«eÅz½ð}ÛºpÂÝEs.5ìQÉ.WçwÎDZ (HRô"¹pÆ»¢³•Hû3{¼ –Uú_qSX€”¾ÚгdUÓcòCÐÉVc¡Í2 Î §öÓèûÒµk0–èÃìp«ïš­=™«Å¥á÷`XøÙ¼0ÃjÐ* ª;©W6Fa³# RõÝx ,ë~/cÒŸ†íEÓö÷àXûW£ÄS-á#£>0kU´FTãûm¶°í­,€#Õ2;%a¡+(v$bhʱ TÄ!yÐŽe ÞÄæ¸hXh;n+½ý%¦öœª}ldKŸ”pà(0 b]ýŒÂtºU2ÆfÔ+mk€¬ÔôŒˆ/LËlŠaðqz!º«V k…lÃà%Z#rBpuk7|©ëX·¯¦‡pfSÕÓûËWbe— Ö4úÿ§Œ2]OŸËí{À-T4E¶ sˆ`ÎToêc_ƒÿ/› L•tß…PL ºó½Ëwàcwã‚w/¶.È7Ãkƒf)’ªoÎ&µ™ äÊ–xí{ï"üŒ§PNû ØO8&–¼ëPOýY÷q´ B>KÎê•`´í&&pÍ\zåÁå+ CMíJþ%þÎo'ÏðÃo´,“>†öz޾vœ…•é9ÙV¸£{ÐÛtRŸp¥w0ŸöU>ÐhÄ)Ó"cg¼È$ ìãÙúw8Hˆ‡Ò)äèU’@ù¯Zœ©)OJ ·S>ÁèèƒçhÄ*dÎ3,'LËæ!ÎlïîÚÂrÄ*ÕÍf¬ÿ‰_ ÍVS 5*v– 4ŠÐ£¡µâÕN¼–Ï›kO"O-¹÷T 3¢¿¬&x£eòÄV«MõWJŒ"vF‹Ž‚oèoWÍ;8Êñ-õÅAÍ¥'šÏ‹Z‚Zw¿™gåµh‡<r¸¹J&°ÓùTÞ·×$E_õ@½–´†a`ÚCߟlâ¸âZœœýCJ®¤â,Oƒ4j·âH¢¹*Ë0²Œn;ÀÛ}xÛl;¿ÿ1Ûvp±P{‹JwÅ[¢Ý*R)+«9Rú_Ÿh#=Šò)6G“_š¥Ñ诱üIû®5i#ôÅ ‹§¦GOØß—nx=Ji«°1E%XØ)•£SÉ ~VvŽ­1—!®×žF(ó=»•ú§çþeb¤é&Ú•B8ËývØÛ%—ŽuÞ×¶+m9C Œ<»]ª1‡&ï ¤Fâµ^b"Jé2exCu¨¶M˯4Ì ¶˜l¸qú~{†/|ûóÛM_ö¬D_aHè=ÞäºhfNeê×^]ƒêA÷¸8ï«¥Ö=7¿46uärÃTÀüXÎ6f¤KE3wz¿ÁtzÁ(7«–-8oG&h¤«íÙÇ ƒÊ!úzsyÚ_Þ˜ 쓃ÛåZþXo¡Þ°'N‡"áYod78½å]êÜWâÕ”›å¸ÿ®S™7™œb×_¿8²X6:–´¤ñH˜ lo 8à$OäbEtÆ@¯J ìnˉ}³(¤×Ùœ¬2.ÉسˆY˜4.ÆB炎“·E­ƒ'ÙØ˜'Ðu+I”õ˜@!“Œè„q¥†?cX9ˆ%j6¼×psq{ØT×$S¼´ÙI"‰µ9çùU¶³þë¼ÄÕQ‚¼ º«¿röªeX­ÖܳG˜:r͘Ób UȲS8J–5E!Õ—"`â¨à­f—4gRz·Wºì—7µÓlpìÿùšiçwé6N·›oïnŒ~…f”ò“¢±#E$«ÕÄL9¬¦NàŒ5%+¤î$ª„]\êäJŒNƒÂtW¬M–ʼ‘ï×OòF¿’t>;ëãå;Ç)OX(1F(g¥ì'KB„E>ŸÏ³†‡·µÎÊA–‚./n“ ËUYߥSË Ç.Íòƒ^>ÛÏ‘;iâÚëózã=®½ýä¹ðÆsäïõbºî«_ ª¾ó˜<_TSi\Í1ù7 nÕŸšÝ„ÖÔsí˳7©ú‡ÃT™ªíÃÕ^oGP¸°R=Ng"Õ-²NPBñ·‹ìŽ$Æpø¤ÝŠ,ħ#©ïnÈ)+ZëA7·#UË“DæGµçÝ:qW€˜—éHu!Ïgu×Ö€¢Š9j:@dر…æÖ-h©ë„ûϘ­ÔìĘx …üVß3–¼ >;âI}/ㆶñ6+É«|§m(`BÜÖC{=y +ŸMöÐT´SHÙDžêq†Ø«ò¡É§áàèeÙ$47ô2VlEþ­¥Š½˜= —Î?dz{´Çp°4õjéÑï¤Ê{#ÕîT>†szKs§ÿÁöذ5!ªvÍø](ôÊo…œ8‚×x͘Í÷ûöünå羸ç{•Tܽ˜tš(1›?Z‘\¸üm&Œ²àe«qóøÀ™f4³­Ã‰¢¶OÌÆ–1ÛZø—̆¶Ä ¾úT¿;}—RĬüaô³¾ý‡D>ü£ZûCß8ϧ»Y¹èY©µøìûv ÞµcAÓØTàjgók˜ 4¹ îûÆ'{‰?cC_°f¼ë+ê' >C×ns<ËÀ;Ë ƒÊ5*–®XßàßåU&ÀòÀ;î[¼ý)n,ûKÙ‚[¶‹¦ìŸCÃz~–™n%†ÿÒy~îëïAqàRP¬PœÍ1Jβô±èéea8¨¦oÑ€å{ÌWa30ä5o…s{ŸÎSìÇ$vïÚ=0[^Ëa]IÝÊ€2>T/q‹øþÀÛ¤ Tሚ Ÿ&©þ1¼õGˆS÷‹þLs‘FŠ‚)˽‡¸ªÂÀŠØJ¬Z®¼¤…gDë•öY«ëÃ4úÃQ¿=©¢ƒôÁ@M®ÈW µ‚qœÌØù@²r¾lDñà!8K} 5ÅC Æ a¤‘©”ìÙ\ö€çÓåZŽP“t¨ó qañ,Ù®K„9@ª¾ FpÖq4öÃË=вhñT§Ú3·Ûöx|ü¯SDŠ·î {ñtVÑJ¢äæ­±Hc¾…©ÀÎÁþ’%2™æ-™Y¦R ©ï{b¤C§i©Ïj,«cüœ²8T/D©˜ž8 £ ¿5Qßga±èdIè€aˆÚ Èó¬RËø¢'ˆ…£N{ºî”²t “%k,ÆHE£;5Y‡6kãz'AXCxæq̽ððGæ{ˆ’ dý#éÅù6ÒBÑ~ro9v§ÐX,¯àl…¥Î£ ¥p²JqÛÇQÄeßk˜KD'¥ÆÖÊ=ï•^r0ûèWc5–d–âL¸b ˜·®£ü,pÍ =€ÿÓ ÷Û·KòÔHüGžvȧL÷Ê”†âüá&¨¿ûàTw—.h÷¢?¾‹áp·%ˆê%®œóþW5w•xÀwwD@ £”7ð4…ó…¥ÌJQ®Èk¯Œ¨¼tË/ë\›pkðâu^œµhF–¿:R߸¤Æ¬üyi;0¥åYËÄ5´f.7‚„(rD*®ñãã:ž R¡…—gt½³*Í'Mr™÷/*›L¥ÆgÐÌB+žyIöå. َꇧï©0qwà¿J:ŸÆ“þìS+f9g$ÊÏ1œ9hê2ÿWÚ³>0JØyTÊSø vH=|6ô9tàº8•O!wÜ?§ŠÀ @°ŠIãÒr¬Bz^ż¯+ ß _dU>ÍZÝ ½kË+ ^\N ALù]ÔÚ6® ¤öl±t^Áø8qÖEäi+wû¨ÉÆ`õiþ3xå´É•t Ÿd攩uaýPl“.š( .K¶ÈTBÚr©0‰iZñÅŒ=z3Á öWáu*cŽ¡F{ËLó„ªáhÛCµ½^¡lÛãñ±=>Û¶'|ž$tSífWeúi2>¿/Lv$®oA¬m7~%GnBGm•nÛ½á8ÿÈ»Ø2ºàú‚«,U)³>;8¯ -RÕûKP±\  á'NÑÑóSéä—ÔFZxõJ¯¿×ßëï%"‰Xôïgµí¿øcPù{ýËË8†áKúJÐñSîðI_4ˆM°aÛì]˜êŸ²É'kø@bñ_ßõ›ú§í_—‡qÉ¿"#eÅø€7 "]¼]ɸžWœw$©»£óûhö´dêõq†GÌ€‡F2qtØïðÖS4gJoÑ@+V! ´Î|Ùä$bµ ýAŒŸ‘¦ˆ, ¦-fgûr;Bçjø(4ýƒKôŠ©M£ÿFS8E\Â8¤ò /}ì90còIÆæiÌÜËÔôsr·IéXžýeAj›Ø«yÚwCß ©¦ Ë?´§¿T©ž]ÒdÏÆȸr8;‹Ç%õÈk”l?øÄ¼Pžˆéf˜’IX©w³Ô³•ïd?lýûG[“­ˆl×l íŠHQÔ>î­¿§ ÞõîØ»*64#Ý8Ì: ÏÆÔM(Ÿ®1®„“z ­üŸ w†zµ\ó»u³hÐz#»‘6€Éí@T÷€:újظm{lÛ>¯OíxÊ;Œù¶$ú¸£¢°cçbk 4îÐ>´D(?UsìtMƒÚtšƒ­Ød-¯ÿ4oèNžbvâªyQthƒÍ-nì²"ßQ»Ì[%±Có‹.ÕÑ4víím²ÛÍfÜ3ìuž‘>6±¢£ü¦³?1M2Œx4夢y)1B¨DÛÁÖîf ºo£¿&ÓˆjÏDO¦·× N+DŸÄÐܤgkZ-³X•¸À1ïQ* ኽßNN®#<UŸS‡2²*pž¥ðD6nG‚I=¹yJèÖŠÐØ´”ƒ×|#á^'|•Æ®®¡ —ö-æ}”;ÌØµ”ŸÄXñ'ø…2ºÖšþ}Ÿ4sp•à>EZÜ·©@JU]]þ#ÚR²ÌX:: jˆëpC!\×Õ ®ëDHàY¤;%UÓc¸ëÈÌ0¬ìY‹÷XüÁ[bÊt¨øÏ›³é‚Ƥ{^Æa(ª<,$Ê2jÎáÛ®ðAùÞðj(w[í¶áÄ=?¬:†7ý)ôüÇá>ø &ÖoÔ1¢d©Ke_aP ü&ƒ=nÉ1Lô“E능Ɯœ“œ°‹ä\ ÉîÏÖÀ‰ÍЮ@[´¯‰ÑLG>!d‹¤%©‘\ÆÏ‹PVÅÑ·ä~îµPô-Ê4q7ëÏéÇ©¨CnŸtWq¡üÈ"nìSIsAt’Áþ¤”s±–î"0Ú9Ö¨dÏ!x·hƒÈà,Û-¶{u­pRn›¦RÐ…Ž¬f¾w8eq™tÌ›Eª+LÚ~?é|J”-†wz[sŒI¸ÄÌðŸìÌdކ]K¾ q ;æßˆ¥fFºÑõÏ »s6ªX; Æ,PO ]Œ…èwÛv0ÒB ”ŒnìME \9|!(èí€ïû†tWv¼¯DÌ?ò1 Œùñvá9žz sÆÓË«­®îI*@2Jëà4n’"ð½qï‹È“Ï £ ”èÄðÌí=ôÏ ñ×1>æÙ;Ó5@rhЇÍIÑ;ÉpÎjJ¾­Á¡¤áy±}ñè`îÈ*µMf:4@?î'ȳ£qÛ¶}|<¶&"µçG¶gOte©¨tŸ¦Ü‚Í>lájÞ×@&ýxg;âä#w‹fæ«~¦×#žröœå’Õöëø{Aþ“0Y¿¶áƒmâ ߈Ì*©‡ÂP¹Fu‚ï¤Â0:í×ö †€Óë1§Õ1äøfŸÐ»VÐ1ÊÕ8§tw¼çév0?h½&„"U—¡M¶Þ‘{j™,)h/'á­eÉtùf†…¡NG, X±€ë¯@Z™ZÑJ·öT’÷3øùˆýwIç Ûã1n,}l½º£@U0¸à5-Ø‘··)qúÍï¥üˆSÅnÃðÌcãÔ£Å0C%#J7aµ*8¿bµð)o5Ëf-~ú—°ñOýȾޚMq¢„L#‚õ@gCCfjØ{6¤lÀ)¦Æ­6í^1PK@ÀqP%î ;‘¥>?öï³ËÛµ’~ ¢|Åý'­8´zf£nîØGÀèò"WUÕÜò¨6ËeN:%Ð'ǹqÀ˜PnÜ‘ð`ÏA4þ¸æ£a¬]ì“L¯®àF‘Çã±mÛ¶=‡ Æÿ–¬ç{öó<ÏÙ2zå+RrÿeÂÍßûËöîfa¤L¼çλբäÅ\#.¯a·ÖRµë`.ÆÂó[Ç+‡ ã`†]Ĺ«‘­ß±^_]T¯¿×+väïõ÷ZB™þn¾¶¿!øÑAù]Öõ¿‘ýªsm4?m]öBÊó)ϧ¯ˆØ°Ë?ãïDü{-­¯¿µò­~ª6¼3«þ†W”²Ï ‘&H))Ýi9»UÅn;Ôrû¨CT–TÁCiôéjf€Æ;;† ΡßL(nê£jûBû™—¸„¹n±5"–Å£V0æ\Ï›ŒG±x Uv£½q¢Eœ”Ñi=TVOÄõ%tü7eBJ˜DrÌÑ„„dÞeTšÇ·ê`’5Í\”)€o@ÉߤXš:ÚÍX˜0„Éí<9ö¨êmìoïQÏË>EU‰‹)–ÓBnI•ã ê ”ûÃèb ¤”dª:î9˜ÿ©Òõ:Ä‚ˆ<Ÿ”“~ʳ7‹)š’½K 7ƒR7ï?h|ÒpÕýp,­V0—†‹ŸGÑDWŠßô™$êVZ¦¿ g¹ñ¦¦"îN¨çØ1iª!Z‹‰ƒÑ‡”²ÓXþ(’4¥‚˜°]Óœuov‚Škg~‹ÇÛ-÷“YÓJ+AQ/'ÑVÚÄÇÀê½ 1ëŸxk»§ƒsºVß“$šŒÀÙûâRÞº±k˜€]’W¾ o­¹ä/— ŒúÑKŸWºj®v\Ž˜àq²¯aUO­Ñ«&¤\,=›ì†që¦jr©I´G—†›¡ÁšvBs0ü)‘ŸöÛÙÜØ H@7:ÏäÁèÛ#]ª­Iç” h€Ýí(ÒÇy—sjf±0ò<~´ŸeŒÍí6ìµþÿÛ¶MÀà`•ã3Ò£û•:`'Œl:©$4 :þèXý#n—}“3M6B‰£’$: Û«G1É‹MåÓÌ'{ˆ†·bC|‚•äA±O£ãïà;š`nÀ€¯#ïâÀ&ÇNÅUŒõGFÏ#é”Ñ,Z(âr˜ø6KH´ƒÕdÎ<`çÏËÎaªÍ*z”Ø2Ÿ¶o@Qé#µËúBB.¥õ1fu|à=Ä¡ýÒEFŠDý9D†™%l|éd„ʘ¶ûñD`ir+; £%Ë0Œ3 (öuOÓ)D¨Ä "0|Ö,ÑĺèD,Ÿ:±©‰w5'²69œ$S\ñ 9g škÔñyH—Kã¢ÓàVFj´»!¨Tœ°™³“³ˆ†´¥èiögՇÙôÊÉa.¶Ö¦hÊ&oarëE¦„Ì‘®,KQ@ñZ¼Šš’KPH4ddæ cd54ã¶.³cÅ5¯= ìFÚà?«æ¤í—0© ÀÖátsŒ ‰ö£TÛj™[jËC­`dn22C|;åâÁÀ)š¿‰*^_µ0F£¹ÔlZÇiz§Dž?|'ö©`y_þ½þ^çv«Â_è!þ©—)Úa@/@ª õ‡?0ÿLR±†‘ùµ­xø”mxÛäåù¼ýEù֝й×.C¢Ð£“Q.¸‡4ßÿ‰ëë È;w5¡§·1ÿ¡¹þÚ¯»3ÊŸbÎë•/ï#o8MÞÎ’µµؽÆÍ¹¸ˆ»Éj´Su*M°q¼éLÞ–¦Öèƒ|̺ŒÅòíª¢O(†Q±×þ}Pbc°æHƒ¿îØ¥UèÁÀl‘h¨ŒãÆ»±×î¼·bŠæ°´’>N6ŠŸ’„ˆ§ÌaXh°çï š© åí±ocZ¯g …žŠ1TŠŠžB?Š>!`a!¬asx v@œ4Gæ¼î9F¥©^ fƒ'ÎB¾ðŒ`.IÛT`?‡ÿÍè7éKTJ˃™«yâKŒ&n¨ã÷·?Il[¿ös¯þí*qCàv$^;:¯8ltšÆîijxTµ…¡"¹=/Ñõ;©Õ·6J@y¶ª:a€V)ЄsŸ¶¤O¯B66˜Á'!Ûst'µ:LU6¬BTŽ™””7ËÏœƒíaá@k XR•Œ3Å ’²m{Á?¶­gO¶Çc{ìì‘BCuCY% ‡«ÜE')IPÕb™ÂÉ•OJBã¨3«Z‹8 •¨*°[Õ…P¡ïEÙÌc¦K•ñÑRÒt¶ Þâñcz\Ì4ÑÙgÄiĨH¬+ì83Ø÷(ع­šß ³@A×…Ô³g$´ÛP{ß4s…$L£¸ LávʧŸðÄ^!š·—B7’О-iùÓíÕ 2h…³H`1LÚ)r†bÔ´¥Ü¿&dnqÈú”eF‡Š5G3bI À8B =Ñ·,¹fjÕ31›bá`2ø]IEy{|HûÝçÌߣKETX[& :7ViK—Z†$Á<#…»þ•Í6è¤Î;è OL8É2 a—X}lîĺ¥.ØÈ7/¦û7ÝòCÂUÈÐ ‹^”ì㌠O[ÆãYÂN³)Š$”#fLpEÚ ŠéBWÏ¡µfeUÃã… ÅòÁs–´{R¸‹9²¦J™õB`l.wL>éëùô¹=—ëíwÅ ßѪ¼iö¨ê`ê+•@šºJý3Y˜“¶'UÂQl+p¬¡vJš¥Vó¢WÀm$Žk ÁwªRPÑ~éy*±/˜yž&ãA*·˜~3Y³—HÒK‘¯[ËY4%´ÉRÍ‹c’-!ÎS1äìØœfí·’ÎOΙ.U˜(:iºç"™ÅZSh¾æÐ­öœTêó:bòOæÍĵ#nV8B1ëâCŠRÆ=¹›T„Šõú•#¢rHS"Ø¿×ßëó_,"ò µ|.ì;:ËÃðÌð?Lj.$™ÿu}Ùa­sJA`eiíX 胿çi)<¼Fìnàa÷Ž2ÛŽLGå&uDŒtPœgbÊ4·ì4ã5S4Ùô$Ь úIo!¶m{<¶ÇÇãñmCÎHÅ)¹LU5' ¿P8ÂõŸóœE8 àåšÞ ñR*æ:Àô)Wj”ò _—|ç»j=&ƒö’`T¥Åõ‹ò¥;»%¶˜¥éYùl `~„Øê¹ç”úÑ–¿ŒÃ6—@Áþ_÷jéÒ¯òñÎ+á×ûŒ€ïö®¬°kÁíÑ¢ŠjÕjðKñ ½µ`áÞÈWÖO”ÿ­;V7yqįß'Ò€é#¼nõχiåI_\ª7Ö‰å¤\”Ö€Ã;&~}|êé(|Sä+WTò%ºþ”â7Õ\Ÿ¦Œ}“Zƒíußü¦ zé ¬hR×@@\Ÿäraþ°—ýuâ÷”u¿ýÄÏîüÓ;Vä·Î¿ñˆî½k|™aª*ÿwN*ýëZ Àâ¨ÞS|¡j+¤låbtaëùÄt^>Ä|n¢t½ƒ"Í…‰Þ A GÃYLÇ(Çx}Ÿu9äN¶XÇì‡"¯W™s¢Ù¶Œ|MQ»„XÝ5ªÂÇ߯¦ˆÆï‰2¹·—Ç$ð7Ÿ?И§ýÅî34E^Ù6qT` B ¡ù´§õ3\¿•*“jê¹ì¸hôO-]1ô^"£Š~Ïh¸ "²¡—àÓWÇ´?½Bºº¸¡âpâ<ôb–œdZÊÁØšÞZàâ©È{üiÏœ˜Š0wä÷²á£t{]öÏ^oN`{<> ÛväúA&äÚ S7zšwòuÉTeò,°ÉJ'ûŠà¢q#ç1ª[œ¸<&Ù‚¬Ä¤³çÔ{É |!5 Îx’NïC¯åÓƒ=qy÷ˆ*+Ðd¾CRÔ­^u“&©wݯêtvH"”‰{‘¡üäÂêÐ"°=ph­“Ø^k½†oQw­¿rý¸¸ ŸMè¼æzž`ŽŸ:¼_vÜ,¥‡¿’½]³IUm_|ÙãÑ›º @^~ê ‰Šô»¶môcMàÔÜ‹véêöÍ/Üü¯&_Ú¤éýʵÉHè¾°cŠ2Îr Á9š5r Ýr‹£g²¹MÑ”F‰‹c´ñ{êÒM#DžXF¡ž¯9ð-Ýš e—ÚÐ:ˆ£œ¡±F¿k J}JÁý-O>¨°bäÌR×7È¡0ßµh²%¦®W©“4[Töàˆš{ªvHȆÇvˆúnh36H>°uJ U<¿ ¡©W'¡‰ÍWjÔŒjb<ÞlûzýnlÈe“¨ž`„{!\uãõ¤AE ` 6ÛúÁyÜ&Ê›Q½•a³Ìª>&ý „²‰¯¾XÚѨöÍqØkb©6¡;ÞŒ=aô»à284©ë˜QÄï« šë@{ä”~£‘ÔÓvYJ›=–ΘŠhÆn%Oc÷K£ÒÜC‡mÓMêm ¥¥c‰¹ÄÐ2õì`8Ê2Òc¥!tÐmáH7Šw#°bˆQÍãX¸ëïNâÞ}ÃÑÅ AEÄ WS†‚)HÓ÷ °&Àû2gıñ ¦Œ.Ìá8n›Oôé}3‡¦Ð€'ç±”EÖg²3 ¦Ý©õZ]ù„nU½Ž`¤æšxaeü?£|môv´<àÈ>…±HÐŽi‘bM:¾ s8Æåa-2 } ¤¸‡àO'î°cÚiîÂ@ýŒ€)=0o+Tk–™˜öÑ‹«òÛûŠÒdÖÑ:}OÄÂÏÀºpNv¬YŽ'£jNKLÖç>8„¶MìÌÀ Ñš2»· ]Uºµ\DŽDâ@ú&Ÿå±HE@ÿU~Ú¨òPˆI|¹ü5¦º¹8Ž6>©³ƒuýCìâC§YÚÓÅ@ç;Ú7f2~63O£}â`!…£§™3»BJLÓQ뤬uà{† XÍ&}TE”¿TûŒ¶Ýb¥¼â6ëS‰˜‘U4å–Ñn)á_ä`¦“‹îõiÎô*“¡d.%ˆÂõZFãYft–˜Œ³¡ã‘™pH°Æ›+ôš¤G‹ Eå‚j ×ýT!cþÁ)R¿ÚYÕG¸* _!Ž“œt&æŸm³Ãéü¨f‘ŒÀ¦¶tÂ…škÄEë›{ìô¥97ÑŽK‹ö¤pq­’&³ZŠø®wMì“øáÂÚÖ8P&ãžê4õvBòuáÿÁׄ_ñ¨°æâ'±ºf(N.|yï·Q¸·;ñ]÷FEÐ)ȲIÝó…Eu,ŒŽ 0bÓâÎË_ c¯Ø“b‰ÅrŸwF3~:´‚QÒ¡”¸£O›fãþ«Ô¬r§†_%‰ú²‡=@‹ñ D°mÇãññ¿Çã±÷aè€h&z߃;‰xcSOß1LúÆ®Äý¤x ïë·Ãåa~ÍE¥ ÿÄ;gÑÔ)+Á‰Ã¾@VŠ<Çú‚1¿p{ è²[ÛŠ¢Ÿ¯ÝÞQ ‰Bëun·«¨­¢Žò$&º°ef§«†®Q $ËœV ¢JßÇR÷í(.nà Ûê£Y¹ÙÚ³}O@¶zÐ?¾¾KW¬õ¦þ÷vÜlÛçŒþg©ƒþ"¢ŠÛc÷zÀF2kŒ´<7‘ïèàíur%ÇâVÑÆUµ·ì ‡“¥‹Ür/vhÚP‹…ŒZ ×ð©!©–9æëlÿÕ€^´ÃׇbW/¸åW;ÞC¸7ˆ£l-°jC€¼£ÛrÞ9‡5¯Ø¿k¯þ¬à›òÝ÷8.é ¬öß!O ácV¦•ƒ"?q°àvF®O85*ßã\í\„KOóͯ]ËÏN3ÂÄÖ3 óÛƒøÐDRÞ*«D^È„K¨ú‰b(a-oL™+ä´ $zõüyÀ1Š'oÇÈ"‚Û¡ðÈïöžq-3Ì@·¥Ó9Iy'À°h|Bä§¡Š •k°dj„ÅϹ¿>ŠùÉ'IÒp3\õ–MLz¥U7ëK,›ÅT ýÖ.L´ Ý®>Š‘÷R¢§ÈÁ&¤Ê·:¤Vãµc!è†ërR‰J8GËŒjôŸ|)¸R^ä8J¼íÑœ òx<í±mÛ¶W)«Â=u€N-WvÈ´C¬¥‘X"¨¬V›¶ogžÄŽxVaªGÀ–ïj=gTÈ¥Y8EG¤§|ó´ì~†+5ôL-° ¤#`4¡¹õlëó|䊛ˆ°<î­&MÀŸÛMÜ8=8;Ï zË¡–§wöeÓ.!åLØÃ‘f—ïÈ«oãý/Böß8jÆë…{õż?ðCm/s½Ù™Åи0Eÿé•ð«^÷s¼¾Þ&õ§oò0þ±×"ˆQP ÍÊ<'8‘OŒ¸Æœqø‚…[¡ÿ¯£§àKó†Ðü'-Qá/µÔ{TíVàF¦‰_¬Ôtû0¿ò¥çò'ª*]Jòæ-–ðÿHç%ãÌ.^¥ ì OoBÿQ1GþÕj£Û’’G•ÿí,6ëNöOÑ̬¢˜ŒUpŽŽ3‹Ô¿ÂÁëßúÁŽ–?hÅÀFìq&Hl s Øó(‚ÅÆBIS!ÁØ{”î©\ì<>*WwHD|-¸¾ìÀ,f­Ú\­Ö„ôáƒq5hp!S6 Ÿ£ƒéqG]MÊÀß”‘Œt >ŒíÛý 'FJØ`k'ÝdÂætf8Ç´&Ù‘qàæò=÷Ç'ÚçÙÛA q .yàá„€Ol¶ü½Y»žUPz›:@äÙ?6<­LdäÝÃÒþ@ø¤f'!Ÿ²m2)Ì4®oMßÙe tÆ »¶ÅQ6ÃÔÐiôMª#Êèhxãk8šû2mf¬Y3´­Îl£çìyœ °=mûÀ&òäNô@ÿÒùý-cK³ªFŒ!ÃQ{¿4ºh7:ì¾q-e†9(¬P¯ßб¤Æ:ïz0”u†/LEbÇ0`¤¢ÛL“]V(Z@8xZ[­ «7‚ ­8îLf¼·ä"öZÓ‡àLíY;MX@Ñ8óvûŽƒ*¡ìqf·gÆ 2·Û‚Îí§Qì~‚±êo4FwøÐì IŽ.f¸Â°½¯ ¹]탣©©&Õãì}Í4aå@'ŠÑ )ˢ.†ÿPÀà[¨erðRZö¤b'ƒÊâ/õS6+H`Ÿ¨S(z¶,t0»Æ’KÆy°B£ƒO ¯IßãŸ1U°Rg3Œ…wÐÀ¤Þˆ4yö•¤Ï —‡BÖ¨²³HÈ®¨ùÙºa:Ž×¬òHeå”sLðB“c SÏüA¬¡ùBâ" ÌŠ!·é·:ùFÃ>Óóº‹xô¶yëyé(²{c€‘«czÑä¾uEy!Èjºg4¡“lïK*œ5×d½ŠzØ Ç‚jÊŸaMŠÂåP’.øÉSlÊ•˜>EaÍÁù vbEB n/K,ï,"h^àÅy%ù|v¨B™úÎÀi¿ˆvôˆ¢xjBÍQ/Ic_ô°Ø@×Ï£#–ŒˆÉ O†ã†½.5ô5öìÌERñKD\ág“3a.$œçö¨)UF´¤žQ:aZAlr„*d‡_&*¸š]–7à½üó³¬ËÑ ‡Ó?`dÃç¡BÖw}(Êiwœ7p©‘Žrn8ß‘  ÀÿìÞŠ‡sñXåŠk§nðV’*éi¸£ƒ6à„ Í*ú÷ \L=(U'¢ƒ/S0¾•XS ™ÆðÅlSÜGQÁX¯ÃÑ©¿–JÁÙIJà“λ½šPE„θ†ö·qWr-nÑf#IPxVŠæ,â%ñø³>j´éKB¹ô¡FÊUf"˰Îþ”oú-ÐÚ˜;¯"R´ŽÔ o§Q¹}¡_ú«_Ÿ\Kô]I·óMù;_,hðeÃ9N¸2\™õjÂ{‹¯FÁT˜#b&ˆgn–*yš\‡ïwˆ¹æãÖ–À°Û0RÕ±jˆ^µ?T.ÍCÄá Q×ü3Ö½«È˜l:~Òý¼ƒF¡àã}K—­|ÚL¹qh§Õ¶=>>>þ·m½áøåóùT(´aËv=b¼¾Öç•ñ^ì²g°À­ÒG‰y¡=W6‹ÈÙ!øhu.Ý‘ÃR§—í"Б¬/ê»@Ñ„´ã ³Ü ³Aþôªhºòÿù¥}xß³ZŸÉ'=0¬Â@(®ïÜò8¡´g†çÌÃàL—7ÍrD~³ð*´9?Ö&§µà³ ió½JŸµFû¥[¾xóÄ5TY$ªÊ ÏQP)(®¸r!–ÒeyuËåìz6ûÙ¸Û_«úbæ¢À”DÌ¢ÅF­Hj> ²ÆüÁå¹-¿ H?5u›[b²žAQ'¸_l0!Q¹ghtïz¡üFœ¯£ÕëáÁÖu@îl¢ø·Sÿ1ÎGÒŽ…Õñ‘ô¤¹˜ê8Þž9`ÑÒŒflF+s‡Ì *GhR !ÌA%+å×þûÐ[„VÈ™úD9Yö† ¡2åŽ@.šG.ÐON¾è¤Ù“\nÏ2HåHÜíØ¼•r©ÀßJ<7r‚ ð Áˆü?Ë“hlN ˜-ð-P€„Ðu®°üIÅPñzLßœVX¢pHnòúÀ|j€ünÒysÔ”uúÅÖÍRSÿ¿¯àÚköíeFóß~}UíÂnéaR*ï‘ôSx^pÉ µ¼Öõ™ÍßCãwXŠO‹KϾ|逾¿ž‚3.y/2ÿ®×+ïÕâc3•]3Ú¢È áÌ\êysˆ9˜ªÁÁ¨oR3ÝÙ5«™l”õôç«øW‰ØV( [« î Š“¡¦ÄnI1£ð@‰EÅíaf¦U ѰÓµ‚Ý'û‰ýÜÑ“QA@³H ˆbƒ`ö¢'b” À¶ Ÿ¤ØÇã±mûñÐû«ö»Ê×E^¡Ðð eá:2Ë/¸”í{ÌsÔõŠÕ9è%æþi´3Ö ¹ü!wÞõ?òÛ ¦¿É+Xxõ›N¹Rñy6žEl‡¸¬—Ÿl­>¯¼!æ7æsc’õi2 Ô¡ÚÂ>øwª!þ^¯—#gèÿVý·yÍCÿƒ6Ž‚ëS¯#þ15gü[ŒW–Êï[û=%ðo/‚mŒmcýü{7.©³Mü4î›;gýÀ>aÔÿSê¡ÿÒù÷îÇTxùõkªTŸJCLg5k¶k¦5ÛjNNŽ[ºFBUL¼.ËØ¹øFÓ{_-ªÕ–)TÕK};BÃÀÝ‚Žš÷ˆWQÝt’4båÔÓ=qV™‹ŠÀÇ\‰.#,ÑŒØyŠeb0B½\™šÖA¿YCI-á*‘Š´¾÷ï}3¤ÿøÉê§õ¯Zy#ñ:ÞŠ°}'·ª?ïì2yƒ ×%´BÐŒx þ‰âå·ñD ËvÏzé»? Ë`Œ^ý1CŠ&O™Œ§‚¶ŽÅùKMŒØv§¤ßŸÀ¡µ;ðãK-™ )ò|vb¿L4q:#‰Ýn– ½Ñ¡7»*f=(Ô ÑŒP¡¼¢ÌÆÞ_ÊgS/€à9øžc¥ƒA>y 6â.""Ï'1ÞIµæGɾj<ß«‡Ñú­`Sš‰è°DÀ¶=ÛãÑS Û! Tˆ¥Q(±Â=—„D¾~b g>›'Ç94éxf“~úÞ}R©BôÁäÌæSåÐCÍ8òàYŠ)d6æ–ô¥³ˆè?VÄ÷°Ý.œ4šnnI<‚¹W?¥4ý‹’!ÃLf¸Ëü×€ÂMâ[’‘}ût3ï< èÿh&­§”l¿Ãad{82dÙã<ü±œnaÞÅxO¬,šöNÕÚéOU+-Óhû µ:Ñmˆl±î_¼IËvYUªÂ裟Žp@zWiJ)ŽBßûÃPÙ«Þ`Ì˽|„ˆƒ¤é/¤è£€ÊuŠxR•8r7CÝ‘•³¹rã¨a©9ÒÛÈ.kdÄXx†º“0 »HUc@?§!VÆàQJ&Õmû›•2s†Ð xæŒ%•3QÅÂ:! I˜7à¸:΢nÃo7¬`ì²èÖõ¬‘«42‘·{}Šóã„—Á×”1Y»úø(QžÂì…Z¦§HÕ'Ë©c‹ýÍIé¨åeÌaɤ9ãž)3óå›ðýÞ€žl»ÅßI½4Õáx"&•=¶Ö f@<ô­ÿŒÞ@Ö‰œ™\O]q' Ù#Ætð½žÐgÅ9bmE§”Åà;RÓð2d>Ý…^·‘SÀÚÕ\W ´dVŽý.ÎññÎÇIV¾•܇Y_ƒ«ËX@Å å Ë…DKGà\«¡j°²D~?ZHH—£ëSK{ g*¸¡SüZž‹GÕ¨¼|‡ðÉ©ñùå¤óÉ!Àœâfš[ªf-ý¾»Ý‡ìhþ™-i€I—Läü)Z“»´“Ô¢ŸL ·× r—kæ ?©É4ulG2ý‘uÉ3ÂN®—=˜¦Ì×µy–;¬â;;&ÀÛ—äÉþ#%7õ~'3Åé¡é–+•´W'ÛâI'n”ú(ïá©êÚVõ¬kð¼è°7X<6‚ý§{-ÀÂPûp­í€b¨õŸãéuyÙ‹´ ²ñ0t®…Ï')Þ}EºDºg¯OÈ«&³óþ#ȶmÇãCZçÁþ$Oü?U«±ß¿ÜñúÙ»ïÌXåwÅ<¿wŸ8)AH¨·®Ä“.©P•‘ȈX:%ai˜<–ëÅŸËøŠi'38.—Íc’㪫½Øøl±M Á”²4}n0í ë\ ÛC’㺈ا;Žº“4|$Øu‡®^qA DBäbš“böÃåÿTˆß\èwÁ!0Œã4½S^™0Ç…ë²G×íW¶ÆN7G1·BD5Å.Ö?0¸M0}’„XuÄ¿ù{g}aì_R{<©FÔ§:¹ž…Ç<YÒ@X¼q|WÙ»o˜A…5ñfçOÌŸÜBºÉýC‘ÉŸŸÒÙ÷TzþË)`$.u´ïW<‰+ˆÇ}5éHA´Å¹^„¦4n:\¬¹ZR¦ìzY1K …,v%]3(UeÖq‡‰MºyFè¿WÙdÑ9—¹Gî‹T2Lè˜OLŸÃ­•Áú2Ææ‘%–pyï$j©7Þ‘¡AŪ4ë4ßÁ^ÑDù`NôôDëGûž²æ4ÖYmÕôæ*µ#@YŸ¤.:@"yÓ9Ç‘hß-cÓdÝv2ú¢Õ´¦ÿ¢ËçØÖgë<®]sT¥4iäòóÀªˆÂÿ>Òù¥ˆæ•]ùö€S!¯ÿê×vûÜùsnå”/*owŸ‘2²¾ÛPƒÃ쳞5„€D.ëä¤I„èäó NÏ‹ ’¦(éJ솤I{*ô\ÄñhU/TѪ¨i"¢A\ÖA\2ËŒs‚Ê3ÝÍÀf¼Ì]ŽÊ½ÛZmEDÇãñ±ÿ³¿•ò¤’,À­[ ¾NK;®mìK¬?g±5uûÆ*AýÖÏ«”A·ŽS¾óC&’w:' àÚ=+ñ9­¸BP°ÀùÝ)9Å{¼w2ZÔí\a/nÊ^ýÏdÏp>6jPXî9TwE·çÓs£oÛào…È>:!¹÷÷ºûú•¤óÿÚÙ}lpìH¶4éfÔx­SE·S aŽž)·ê=K Ug±Ê ñà k*‚ ½CRQøf€˜OȶÂÒ\ºB5\—ͨç¶ä=GJº½]c¦HËë’"“Ny+ tų°#'”IqÔÈP 3·!Ì´«uLC!bÇžªø§WuPÎ@ˆ‹bíÛ­´x{ ¥kIusù€1ÎtkI"V3®°Åp ßs`âõmëGêK P™‚ã²·RØO³^,Ol[›&Ø•Léz¾ºPrìÛç±ÑäÌNuaL­EjÕX)¤×†þªÛkßý½ƒhR#OϱßAW¾Å&òT=χ&Y§‰Ò¾–Ç ;‡¾í{ß'Z÷Ýfx2­Y8–%(ªŠa;„vS{dr ƒPè -Ú€ÇÎï¿›¾Ç¶mG9fÌi4s—ÔR—(w/GO=ÂG Èæ©oØ"c-õœÃÙ!ùEì»jl)ÉÄ—ÃÛUë]_ û­ÆbùCªÕR°dçB4çëmýN’zNÉ.§ÿªMV ¨ctt÷ßAÔ æ:q(O>s|¢È~·¤¸:j†»0úƒÃ‚Žäœ*f> ™‘ÚE nùˆ˜×¤·‘ÃЙ·1åÕ;²“°/zÙá_X äˆ?LÚ~£¹ì þ…ûà³õô8Ás2š«”­ŒŠ«rÊkÁK¨KŸˆï m)˜eàbq+5óNÈ% 2L×=¤ÍÆ’WG#s>ݽ†~pø<Áçç Û;Žð1Š•²¿Eåè•vµûœu{‘æŠïÁ:«œp?fâëê­(KlcŸÍÐ͉5dVH¢è_óÕ¨rš‰2>ó­ßg;Eß–$‹kR ³€:çN %ªïm¬­“Ì1½S®ôŒg×|†Ž{5ä'û¼µÃZ¢¹v‘HÊ-õÌ^ìÈ ã]¼;½Û›„ï€Ìši¸€ÈdÌ*ù\v.Ñ•'ʆÏR½Aìäó K5¾ÙŠVhFáàºÉ3{ü©=L¬ýo%?ž7ÐS Ù‹ÇÓnÉ' W½y'b'P7.¶$ÕxžÅ=$biPrE7$V—rõIM¥oèËæóÑmf]ßM†»Õy2†¬rÊ,C6LѯWŽÑkW:¡’·Dbêð]qŠ,áN{éx6t€z%*]nÚ¹=¯3ð0åJS×íögã迱jLÚ%íGdõtÐDu‘KÒD–}L/öËœ]Z%#ð´ ‡BÀ`uî6;ÛXH°¨rV蘗ƒñ«Y‰"rçÌÖW¶éª£¿s°´k?5«æ X‡þZt‹ÖIùß°‘íûxSÜá–iD¡ß„i]„z5$’çϽþÿñx|üïx<‹mHŸÃÙ)žâ¹èv—ÂÒˆ5†«M´ð®öS>ÙÚ!¥wŒ&j GjïtwñІ¡ZŠ>íäŘivZuö´•-¢»L†u@)!ç†#ó¥i u’£erO"Ó3 À’ÿ˜ñTú‡t€À³€{«ƒ‘7DÄÎöLsçõ¥æ°÷O™~ämì¯à1?²@ÿø°`|à[“GoÒ9&z›”µ)ž@·p ÓJº/ 5.k 1¨:ø4˜QqÊç\8Qõ¥æúÂ,²/YN‰ilhdJ„Ù¶Â2Ó®‹µ 3 zœÇü3”ù²?èÍ:è¤u‚”‚Hrÿ3xuVG"†«£¡q‡@¾ˆÜ™%y±‚ïÇt(êN,9݃gjÔSM‹ü(:ã-™±©øµ©Øçá¤9ÎåHÁø< ‚[6 ©¨âlJÃPB9ÅŒe[z’rvjÍÂùš21—56©<…^cÙ” øò° {K+s%ÎdÈNirI )Ž„qï@ÁÜ€X’ë1fÚãÌ2^¥w,o¾r!¤*pÏbhÁ˜ý?Ïç Ѷwèh­`y$Ù³/VV²•bªg`éttnµ1ù°)›2h=þHYVª¤¦f4‡c!‘‘ï ÄëWäâjó’æ$* pç_N:o#‡¤’d€oQÚ)åT·F¹&!ÃWNÄ_Wý¢l/¾>Ž:×aeFŒÁ—2K4p)ÖXqNßôJÄä‚©w½èpì7]ó=”õXý{&J”,"Þ5n¸18<=»n„4>54¸1;38ÍÜÝ J#–H£óh«/¡l]<Í—Þ´œ†lUiM-WDÆúw¨Ì ]:Aˆ­|×-'-øÞÄÑcwXlC'Ós•*PúTÝ/¥<Ž;ß‹ÿÇÇöx`ˆ·Fjt/¤ÁÖ9÷ÿÝöå9 ¦\‘À+–mí[ÅÅ„'Äá³²ZfJ‚¯VìLUXIËಬ^Ò¼Ai]/êb$×i `~x—­É ·2û‹”™þ^¯Oxñï®t¥¥5?é6l×ö=wï~â+å•…K˜Ñ¯ U|ƒï›‹ Ùþ÷:±Ý—*nÓ±üåÿîˆ÷òakƼö§ÐÏ+7ðcG&f_¥ÉþçÞÏ:´'éü?;qÙé…7‚!}ú/¥,’FϘ_+ú:nzï°ÎG|OôûaDÿghl/=5%fP­ž´øJ¬WJQøŒI¹ßbà!@Ï` #Œð•G{ͧÀ§ÑB¾i#¥ã6ì:ÂZÄ´VÇ€tÌ"lYKJ8äp^=æ'¡UÙ±Û4xfÊdÑg=~¥.Hv#wµåy´‚ˆý{;ä;HÜuÁNÚK?G}@Ÿ2.]g[¯|™•Ù=ii( ÙM‰£‹N‰µ1-ߤÆá9¸®˜Y³,z;‚ÉÏÁ-õT™ÿjlö¦å `ØÑTÑ ®ùnMxghAgUÀlªÊT÷}Q½Ø«–E'6(ÉVt¦–J¶í¡Ôv°m¶Í%¬©ˆàW tfë>ž…ÆÊ`ºíû,¥æƒº Á”©ò=œ+7£’qm"ž+žÚi”YrdÞ±+¤„£¯X¨=f™ð¶ ±ùárDƒ†Æ&p-Ñè¢B×—Em8Ó*0‘‚:únÒ(ûÔ‰îL³È4 f%<‡F’6fºiL-2ghï8ìM$GuáçÛFo¹Xž„ÞMµ/îRû Ú%¿4ÒÐT3,ÓZk-I1[­›V¾}j”·`›ÎÀBq¸OÃ_‹ùÕ)˜Ñ¥xKˆ“i°õ_£ÔõzÑyúj—ÿi†c=&Ï µIÍáfkÎF'æÀT󾨜‡Él±bww)t|u7Û ØX‰þ¼Z2WV|T’ GGVP$eŠìzÝ®Dǵ½áœ9A÷ùe¤wÕwWY_Öd½ .¦Œ7fiç ƒ“éAŸ)0­Q]ÙÈ¡¾Ù®}Õâ’‹@Dr'>-7‰uS:^Ø¥‰ÑT·À%õ¦7ÂêÅõLúi¹4¯0Ÿ 1aþàjj”ºaͨkIÄ}ë¬ì¡Ì‚á8œª…éN(¹¹Òæu†k‹ªý‘¯«/®ôxõÀYÊÓ¡uºTÒôËàŒ•Kx¡Ê¸ÛÃÊ0f Hм´WdtT£Ždo;˜Kd-ùþz’æ“Î÷;þµŒ´S0´`m1àlKeNÒØ2§ÖÛ›rèupD£ تw½[‡7ŽÂŒßòÃÌm÷;O7‹5ÑÛÑYw‰FI`;îq,Ml&P„©ÛCŽÍÎÎwK¼d:É^ÜàK¸dIÏyvE[²è³ÆôVthË«ò]a>£ò@B‡„i8k”DL¢SÚZŸøj• Ðìî¥j%=OE§β_L©ÅT®*¸q<ÙQ!BäÙ›øŽŒõ` WÐyKùÊh¼-%n…ùG‰ó&ˆã 9ØF)äÑœªþ¯JFxlÛãñØèd8äù|*¦|Dq ÃèRú#Õô ƒmEk7Þ²‘7:Ðͺ÷ÊË©7¦Ûµ™œ€´ëŽ;.Û¥:Wb†[ÉW¨"M”Q&Ö²¨ScÔ«¡õs0«>7-û€NG\NŒœt„½}ÄD²5[8Šž†IJðѹb“0µ0\Žz©i±¯ØfCÊ"}ý{ç ó¼ŒË°ÂuTÐÑ-e9(gÁ±T ö³øT'ô,™Ò¬ßê@ ÕKîˆéÌ1dBÞż¿N”ÿ{žRû.:·gF¸³-ÂüJΆ±qÍʰð<8aÛº ,'ÒIsΤäåw ¶˜"íaìtCb‡‰o°oj­qŸièr)š¿`Ðïéf7¹P@¢¥|qqm¨1m‹ŒBæa°•‰pÍ.H ÛèïÕ„À݉Hi|¡ _i„­8Èä@j)Y¸lÆÑK´è:g°¯yhš•½*yÿŸÝÐUe·Þ¡†Î!rÈHbr»*‡‹†Æû²uVàƒ mƒØ¶ÇöضÇc§êy‚ÁI’‘‘ë©4"0E˜{¤´OhÞ $eqfñ©mÃhÆ:%_P2ôsÌ5¾TdœDôe÷’sŠLYJ°Š<öŒñlÚ'ÏRI¯4ËíXkN%˜ûÉ+²Óò¨ñvx&,8á|Db,¥$MÈHÞ@ç.ô‹gµW)‘Nu…ôÇ·³ØúŸ®øþ ˜ês†c0Ü­²Ž~·÷ØÀ‘«Q¡IÓq&;<…ªMm-Æ4È/-”Op¥"º¯‰|™U2q¯¦É¦‹çì¸Ê+‹Lõ`­×Hž-Ÿ4¦hâ³£Oï¢âŒtHe- ¸„·#|芸Ls 3Œ½ù³“g&O2CbMq?!€ò”ôD>·Xéû7¾Æ‘bd¯oÎÙ‹N2Öü.£„{[«œ— :J^ÁÓú¦w d§¦êÁÍäçƒtð‡W¹„(šYÖŽ*ÞL\1uj™ì×ËHnÍâ•áwô7ÐG ê˜RÛÇqAx¶Uß•yÔ² ê0â¤Ô×t?¾ùÌÓèë>#Mz‚œ„ì\Éí­xY«Ì?ÓiövÕÆ<Žlår‚ÕåSã=Zƒæt}X~—õ{_p'&=—o8?þ Òyñ%ç$“^ìð iê‹ØË¡z&ò¾+bÑ*L·­@iÂÊ¿l˜ ©ùHÊDÐZíGŠ|“¥À‚½ìÑï{Ušªab€ œût¬íËÖ°ü’)Q€92ÍBÊ™DFc!®£%« P»èÕââö›r «¦\r—s³ÒŽÙbê>xÖhçØ¶9|›zK§~b’¼0YÊaSúŠê£ß¤ÈSzmë”ë©#˜®‹y7´úÝ·•>A{þ CT`V(šÎft&ÒÎqãV,ÃÔ$š/Ý=3Wt·]BÁ†ÇöØÛãcÛ¶}î(OEÑä¢v#óZ¡<44 ÐhóÌ*ÖKìªy>öTŠ‘–À@?Q†Ê‚ÞÕt©œi¬Xú¬ “FËÙÒ,ê‡cŽ‘a&? rDj1yе¡£Û­ðþdiÆÛ"6GtcMD€ú[B@ÇBéÏò&lÅaöm£ZA„z8µÛ*K¨K×]Û= ‘j÷é9ÁDÚ¢¯ˆ,[I»Ñ È€2Ó€ìô‚Þû! ã_f *~2$Õýœôqô;{Ê AZË´F6Ý0G‘X‡ôÔ #ö}åæR;HžO3îöÎ/k\ª#7Kh(Üç|½øRè1aV¸wæ³ÀìÏA“Áù:S¬v8Õˆ$úK]½£¨Kd¶­ºõ Ù„€ÁX×ãDáØ0-m " @’q¿ª¦oßó”ü¹ç»lìñá¡ ÃT”0rÈ”rЏ?‰µÓ¸Öø¼ƒÐpR»LcͶ¯Pݵå~ŽLZŒ¹ý£0Ò"ucx"÷åí€{ˆß¦Ä|.ô2Rºé˜ÅJ²&)©E Ô)RΫ¥é&×ôsH=7ï…«;R5U N ƒ =ì¼@qq’uå…¬dË„DÜ’99C†ÿk€£mVÌØÞ²2é™XÏ— G„LãlŒ•oD>H+â†|vÊo„õŸ§pQ¹µ¡þ—¿ŸóîË‹áµhÉîwkbµ^ÌŽ N.&Å%蟙‘U$2"XÁâÕúA¯ê°’‡[FG°iÉpÒl™UX Üú¸ùsõø%ÐBù°žE§×O:Mk>iŸ34uð.¯í¢ûGûŠã|±ïX³È8½rÖ× R÷eö_­†”þ3¤ó,IçÝ 4¢f‚ ÌêJ¢3°˜•ù¹rR«Ï¾¯Àœ)§Ûé¾ ˆÓ áÇ€«ævUIŸ¹Îeºþ^¯×^| »S7r,% .U¡hÇ7 Jí—ÓøâK“NǬ֓¶x1î,oˆþö:ÿd”Oh&OÛ ”*5λ®{˜õ)Wbè°Ù+e`ø ZY¤Ó'³W +wW1m¶íñøøØ›¿êËÐØ'™jJšÒÁžÉ“õ·RÚ²Öߌ3OúÓ¶ï⾺xC|Óż°¥þg–gDÖÁnoÇ#'e S²D¤êÉKs2ðÚœŒú€7@ßd\ƒÊÊÉdpæZqÒa匤ÃsfÄÑД—á3òíðÞoHÖ[Yʤ·‰ŒÆ…}šý(¯_à½öƒ³oé°2ô.—Á‹wø‚á¬'Eì¸×Šæê7ö`»ò™ Z8ÇoMåu„óLKÊ×YCN+ëƒô:×9]5•ŃwFs±”~ɸ!éãK–4‚Ò§ÝvšÿNs7åLj<+9‰Å_ÕõPoy®µ-Ù…Ypû$|ÏjOS?¸~½Ox€³zù•A`w ¥Jꦞó?«|ûN¼4˜‘n×­y½¨É•î2øÊ'º°Ö{ä¹)_I£U”öcÚ5._Þ°!¼uÙþ;¤órB:ÿF_ÕX0ïy£ùÆ ®ÝÕ×G— @Ü+ÀV#]¾Þ:]|iÇãìL9øBŽg PZuÁµÒ~,éæÎN±ôteB™T£0Íùa•‘‚=_d˜UÚ=÷1¼ÈûíÐd¿{>õ0Æd§3Rs~a€jj5õB…ë@le(¸wHö-ÌÑé*Ê)ßîr Z«°ß WvÀ“tþõb¢ô>Ù ëxzöNßB”n@×ï5•¿Êܼj.BóK)é[ѧ:Fñ¡@(tžhjrzš&UQ@è¿'mƘáúÓ"R/P§†²h›³,44ßÀžœŒç+ˆÎxî=5@ƒ5ÙÕyùEdŸ¹è[Œˆ5“°äö·˜›ã…:Ὁâ?¦9#¿ †$÷G*£˾ æaóÚC‰†`t ¨†Çá[>Äöß­Eh£ÞTAdI¥*÷×(½šn(x ®Cª5å–f¼Eê 1ëug<ÐÞÈÈ4¢qÂr›=›±×Ë÷pT”ÄÅ"èuÕLÕf¤Iºê‡Æi:§¯rFE?Tù¿¾ç1ûoÛ¶a{lÛǶh¨RÁ‰-¨I³ÙÈeÐZÓCÐý ŽšÇPv#Q@CúÛŠ$´‰¤©ŒfC¨×tÏ ñ„†x8\åDQÄ> ìª6ߥdŽÜ›²¢*[¤cðM tñ¬¦Ð`eP¡i¬,4O‹M¥bP‰ÈP²‹23É3 ç-Ûˆ³Bµgغ­ñô‡HKN {¡6æ0l½¼˜1¯êh²®®Jïªþÿ§?-ºÜ BValYjB¨ÎÒ{ümd4IÛGßQ»zD‚/¢ñ|>C*‚Ý.Ìqÿä´×±7½Û\ò¢ŽtyUlä×ÇYd¥Ð]¼ÞÕ¢¯âH(‰Å0«ðZ·1A­É³/#ËàІs8sJêoÊ~r,ßCç&„¾?Bt®óª •ÍN™Æyhôg8­Y«âÚ·6-é ™Ü0‡8µ¯¾£Åj ¹8kšB¬û‰¨NÜŽhýu€õXd|o6F>Ü•ø.‰Ÿ[ÿ¢zÞ^öèü+XR”£(dTI™ÇLrhD•…±®¾Ì©|FÀ™¥¼¬‰m±”Òò0K«$°™†Èý Û¾Ðé |®—¸$Ðù-àõ¶Æ1]c-~–eÚ 2gø³0¡ ø Ó} p©5ÒÁD˜‘Æö7xße^íFù|Ân:{ä$yƒ¹”1yÅó#ÅD˜al2ñf§ÄÇkTL² JJJ°,¡jX¥‘·’I:ˆÆsÐè?Èg:p:}lHrÖ”K‘õ̪`{h±hFƒhŽ[e8ÖÓF¼dÌ„ú(u—¥E`kO7вO¡½vp°Buç°àDQ Z¤œH|“ w-<-_PWÔÛþ6I7V L·$·eÏúE½Å؈–üŽXNÌ@Y ‘$d«6ÑÜŠÌvn;Õ3NZHeyþ[¤óúÈä¿ä¥.v[jî xrEk#ƒ¢j5fnK^JÛwD +§=Áø›&>vL x¿µžì"‚ü ¯W‚öï• ~Ãk1K›ÐÁ[æ¥J‚&–*ÉÉœ"pÉ :Y/RBqe[ºdßcÉ:æí üÙݱSð=:«™z‰6¥6Ž£mP ±ÎØ(p„”­Õ%EO-áæ}[E坯Ý`êmüÁÞÐݲ ØÇǶ}4ä§æBä<vaµÕšcˆ_ƒÙÙˆµ}²Ñág]¦aÙ’çZø<+$Å_Ï7Ÿ-`ÚþžãÈYÄ ë'®œ¦}HhÏLýºý¤À‹ÞÑ`ý+^Ù™×ØäWö9ÓŽ‡1ñ Wßù{Þ¿å¾vwNêå‚^S„%cºŽÆÈkëù¥#†×:©Wê¾·±¢Ò›£”ÏZ€ÎcM4~,ùDÑ&§ëíl£ß\Ãñj—¯òÄóè#%'5^|•¢„Ëo›uÄ•;Ò}§Þ|a›Í:ʸõ^À/!Oü–q®Ï´D ýFFÏ!’ÂZGö›_3Óé ÏZ¿12¿… ]Ê)Œû›¿Ž†À¨LäI>©»ÑÈ âM+_ùŸãÛ>M¸Õq­}K£d<_Vu`kìø¼¾c¼°<+ÞÊa¸û-ç‰X£L¡Åßæ"tþ®‰Ã•î+UA>‡:{νÃrH ïDLö„ƒb´ÕÉ{*EW· Æ–Yô‰}ÐõÂëaê7•0Ó¤ê½zÅΘhj9²mÛöض6ˆÈóùÌg—~UÒfAî¸9gíBùAMؼJÌrÓâÓ .º—Y•ÞÝRÐé¹³ô޼@+n¬”~®¥ãÇÚ"Ðäø‰Bð½t]jKçÊ+†™²K°¦Ò-A+ZÀӛϤÖn9mgL~ø&‚ùúoôÛ_?Æ7ôüäEäG§½ïúy/4ôת¡iôt’ZR•åß¶,@ÿ QŸ+Š×š¾Ð¥ÇäoƓŴcT*@áG¹7g+¸É¢Údíß þ‹¯Î×[Œÿª÷^³c×.m/‹®¬@%ï8@Œ)óþ]>¥ã )ÉýÞƒ}Ïñ|²ñîô¥0ùë»Fð+Iç݃àåy¿· ºÕwe¬sIN×s0É.¸¾™|µt·×-‹õ T>yoîS~ÈøðM>DÀQ±¡d0=»{Ôræ²|“=—FÐÀ2ŒÑÊ@z©4Ì4"鋆"m-ªå;Šã'ŠófM3½w¬¦’ˆ˜ ‡$Û>ÍIFÿ­‘Áíg2Á7uÉ\‰}¯ÀL%+E³Ÿ¸jË܊ǃÌê§ý¢Üˆiܨ%õjçãQÐ6}õ9ì³éb^Œ[/Ë… ¥a¸ã÷úÞ¡Z†üÖf†¾nŸ;¯5eÊN\¤ÛÓ¡ËôÛ[·°Š©hÿ÷þ¹Þàmþ¶Ï0J’Ég.ÂÑ¡2©·\“;€šyK/µêÜضmÛ{ä¶mضÖùJO3#žº¢ÄÝn;Ecå¶Ïg‰RˆJ–Ù' å.Ž\Œ9èIu´ Ñ å´}YÓjš(bñzŠÀæÈ1Þ|®v)MJb´ô¦Ý#^4;wpaìGªÚ|4,CpÅE¤Ëâdv‚‡^„Ò©òÝÛEnÊ|Q¼„ŠEÂ…šÉ„.-eÙ½5{ÖÅQÛé¬Ð¼} î ›&MCìÔ¡zÅ9úÿ–xTF¹Ð,`ê!ñÉÈA¯æ]d]@—†­òç¾ )SMÍ~Â(Ó™¦~è“¶ÝÃÐLVxz0Ô®4ÓV HÂ9c¶ÄXª‘y anYÔ=DÖ…¾>]Š‹šûoë–u‘Mž»‰ØXLˆ½L¾pÆ:ã- Ä~ £C´¬SÄàÙÌ@O\f@·ÇiÇ”š •6| Êþ`Ö!—P$Ë´õ·«å7\Z8ÝsPœÊ‘ë0°|¶TQžÐX va©Nü?‚DýYÅó?ÅEÍ)¥Ù!C¤‰|`¹bü/–^ÑÛádÕYs¤4 ÛDO)l4í +áAcçÞ-Z¯º²vs¦‡c&"íÜ—p$õí©ê~¨¹DT•©áqlšm=(&›;XÏ)Z‘q^‰hlÄd*òªÎ¬(TvdÒ{ìü?‘B¤> m1ÔŽŒf½+ÎtS®D2/NbQ∠÷dÛh$w”T…4ïúë´fQÊ’Óu„\÷WÛá7xSW·ÕÇ¢©›¡ò“- ¤z@uVÂáwms~l9xQ™hßЦ?×M„í~‚ƒ Ýo+ôÂgrµ<Ü´Åè¬ò£Èd¹sùR“Ö©a+.¡3âzá`Á"2l§NáªDÊy±ÑоeÃÿMÒy‰2á˜%Ó*²É“æ^öTWŽ0Ë&¤}ÝÅ®‚—SV¢ ¨FS,ÝüúmtØ_5îÀ×G²i©ïKý ÿBmV#ÿ©õóü´‡ù¯¼çß9õ"'ú¡9üxa§#[´áÀgȵL~²£I¥xEÚœ’¯wØ"}zUÑPfHQ‹}zв‰äç3ƒô°ï•QÃ0Ö‘ˆ…9£©òÐz#ú¶=l›1ñ­ã¯:Ö‰I2ð&'kìÜ$'ÑÓšUa—eY ÏNvL¸këƒ53uOÞ é&^l±8éКGéÒd%þ-šC¦mr“„¢ÖÖ7"Ë?((s.·2”Ÿ¹h’ÌïŸÎ‹¥ÏšEÑzµ)8Ä×MZ‚&je˜®™Î.MÐÆ*+;ÇsAÏ.¥ü㣄vVòŸ%¼¹}ê·­´÷êÃI[Ðý‚¥÷TYú8>hZWÑ¢AµãÜ¡9#§¡9ù lÓ( lDÁ: RÂE/o Bv¶©õq$(7U|ãEÁ³êuì ȳ¬Œ‚àš<ñ2Iç¡W "(ƒÀZì†z$§¬£çå^ClÀúÏîdÎJä±À¸òÓyÄ—ÒX0íEŧxÍvx­û†.À ¿EÀW¿(8êSÊ\¬…î ݇8×ÃÀCRæ¼àÛbj†¯^å|sM“ôÏBªS&!N‰¶.*ö àByçĽ~Hôd»ßœ½¹&90' /œŸ¶ÕKÖqßp&ŒØšÉ5n”ä©=«wê‚1Dhsø;½øç5ä™ä2¡ -ׯWn4HŽüâi¥M:ƒz0*…HãŸ|¹‘þ—Iç—xŠÖs+{ùßm²a»¶"Žéâc²møB|ùr4zg,2ý¿ò'ï[Âåøöøûêã¾×7ùÞ×pÔ¨ʔOÌôÖÍYÎv¹º’Þ÷7¥1ºÑ>ÿ>t]~oR ­î¥äù܃°VÔÅw!žBgÐ4µ¾«ÁÔP±‘5NùvQHÒ•~Dµ»pÞ®2O{­@ë•h€¶ ÛöØí±wôA¦SgŠÂ»UÐMoXª\ý9Õlh™êh´¾hó£¢¾y£¡Ú7[sÁj(0 ÑQ1„×-U%BÅ÷úÃg‰º˜¤åš3Ï·NxÑHåăÕüÙL¿åÄý2Èâïõ7Ôÿµií·Ë¢FÓ—ÿö þϯä¦+uT@ó¿=øž¯ã5}¬ øOÕßËÛäó^„O\ÉE€ ±qZ°œ%{ l9¾ýä àoû¥ËàsÆû?Dó9Ç0bÇjµ§.o·`L²£J•{@ UÛž!š^ê ‰)Õ‡upk³U}Œ·hìòPÄ>(Bà|]ß2oÊùïG 'qèC÷‚UɈâYno‰ÄEb™”ŒÖ«ŠÅu ×£¸?:M7âñm‘7}¾J¦Õ/E¿´y0¨NF"ÏžÕ•\‚;\Õø¥Ys»¥SRÙò,Ë3¨ŒßíWÓý`KÛè f3"ÍRÅ™$âXËqt‚øbC[7ŠU7b¾¤}#ššÅÕHc€PÙÖ•6Ô8²äâª=u­þ@µí áäó)]^¸™4(+|ä åPÙ„ƒ^EuZѰn΋ÅgôkIý*yÁ#¡E`Âë½ZAB±àÑ€½WommÛ6ll…_œiÑÊUM›Qã¢r;lc •@¡-év-uèRZÑn¾©³ ~¨1†¬è uëù¥×Ú”0|A,—IçÂR4Ocá¨ÎXˆY<¦¤„öß°,Gƒ éÜ]”xìXYßvŽ)Çw0/?Rärí”Öäÿl¦Ÿl ÞCWh'Î%ÚÝZÑ>qnÒZê̶¼릟‘T4:]8gtzšº|Ÿë¶§ŸÖñ¶g'}HkñƳùî‚}‚C¢ù8¼Eº{àйL{z¥ª7sbz»)5MÄñšÌ4·§“Šß®Ü…©ßNdßE‰§.É€?¡kÁ¼ÝЛÜW¢>ÑažV³£ËPB/…çâëÓGCœP3NsÖ­¨„SEBÇx²Õv-šwH·íȯՌÙR]* ;áw]ï7Pl\j²(Kúo½ÛŽäJ¼êKwú¶þ`ˆl O[ÀGÉÌ£vë›P9;æF=/…êzU~‘shdú„µDí BÀØŸ!G¦ãaòÅcv.Sß?¬zB/ ažuúÑžË㲫(‘ŸšdÝš` ´å¨Y˜hó2¶î²×C*5€$hŸI­¦•È‘¢$¾ßÏld ‰ 6 srýñ-,©1BáG˦ʮclåïΔW±623®§À œˆ*Á7ÚÂØH½â3$¦Ãsz¥ô…”…‹T¡°,_Pá8¨V0©Ž‰ëU²6ÈÒà$M-HwÙÐgê»oÂ9 åX³•0Œáy€þ³²TŠ{9‘ˆ>ú¥¡Ãªö®0³u‡ÃÏÑt;œ7ˆÜJõ¼+îT+ÌW£"W»"qÒJí°¹sµ¶õ§¨È¨D,«–†×nýŠs–©Ÿ¬ÿÒùò(aŒ„-zà®X°õÄÉämÕñzé²õ zÎYmJÏ \î.ëzÄ?ý(åðC…{€5}7wÿR7PÄžgä«þ˜â¹‡ˆS‚µÇûÞ\å÷vð3.‡×¯BœJ¶â¥ýÄ鈳WeËŽô%øãJÍ.Ú¡ö/è8-àïòhÐ(³"ñi˜íÈä³+ê|ÂIu'ðœÚM­…„z€!•Õüä¶À¶* Áʤ¡VPÁñÚ¶í±=ðxl;óÈó©¡Kêï=±Ñuq´ŒÖ‹jažò†Ð³³ìªÈÐ Oåw?;6lœØ b.ï>o×"!È–R!Ô%¢Ê‚rÄS_¨o¢šuGa£%UL>–®÷ÖIÓûaŽ~I˜dýqƒò*!ê ¬F*MËܨS/ª9׸Ó À$„Äy }Ð ±R2ÅVŽ«¿Ø™b{e!´Ãh¦ZFSŠ‚œ1e¥àÓ¼h«ÂbårxŒ¦æuðb’70Ú‚Ò-dYNëû˜+×3 ¨]¨H"ìØ;"r[ÛÂY5£ ‰[™ùÁÊNNz•—)µ2¨þUÿõäÞ]¹k½ê®ì’•‡!bT[a–šc¢€Ð<„w‰t좻‹Îô ›kÈ)íP VW¬rì%²ù·ÃŸhÖÞò¯RC6=žRòŠCš)—¸A{Á BØMUd¨¿ äuKê¹QSˆ Äÿû'69ti7S"út2½Ðó¨] ¾-ÔI0q…ô°fZ~!mýš‚uÁõ°ñ‰‘lóÀÖ æŸí±‰wÒW‹_æ9¬ÜúéØÑ¼Í²òäMäbî ¯Y÷E<‰‹§ §éÙÜÐ'3¶Öð` O ÓGSiÒ•çãÚÅÀ`i OŽ·K¼Ë«wÊ÷?ïñÚôÖÂ{`Ç¿×ßë'¾6è>ÛÏ|ñÏÝýŠ“Ms)–“¾õóvÛ¶?›ö«^ü;¤þÁ8ô-8Ñßëïußn|š@ŒÙØ:ÿ£ú"góËHçåt6“s—šnì³í¢•÷dœ5Ç?´úi/)O‘í4}cñÖ®ÂÁ©Ä±å‰âùÁa”`* $Í®UäE—ʪŸ@tß“K$ e:Uýß±rsV*x­š¥óTŒðüR¶³VÆÏŸ(S©·šß"Öt­»öž3æîÖ¯¡¼Ãq8a“¸÷#_·} iL£‹ OAÅ´²mBÂ(i=;{Iã‰ÒýÙª÷¹å¸Mõ.ÝÓïG+ùJvÑÃ5DöËö)ÜÚFâ(ð·;pôåªJ¢å4žêkÚâéByª„½G¡œYÑ£ù˜phzHZÀÖ¨;ÅÇmÛ¶ímëò=6 S ub§=¶)RW]ÉÎE¥~8ž‹ú»éÙ2ba¿æÃèU½7‚M A|wõÈÕØ*vµùü0])Ù)ÐH¢!8sa=´KÍ_äÙÙÜb¨ß¡ ?µÂ¦²4™g°ž}§²ÑÄ"µ}l‰<““LÌO¦Í¨ @ÕD·0±ÿ̎飉‡ÀßCw¤‹=ξi+L²œó†ÙE÷4êêÏRN´ªM@1±"Ÿum¸¤%ëKÞºŒ<-:á@ÖÔXg±p@úì‚Þ+ ©S­Q'rX¢L“䢚ñZÏûñµöÙF¶äze³ë/Ô,<†i-sÄduVÓì3%É'csî³@d,A'ª‰Âk¥ÝòË…7«mѾ«]7!ÁøŒ¾¯L;µ'áÖ{Lì7ZøPŸNG öt†Æ¯bÐQn.¨YJ©^ŵÝOç‘ey¯ˆé\у³žzƒÐ6B&õžˆD¯Ÿ9A³ìº1¹ZO’PœO¤ä”5ç–4ŽA¯&^Z<ö©—˜/º´…í7‰ÅO ;^0×aÐÉXÇò!O—tçÁuÉÓùÐM„öbüêà HŠÛMÓ©oOy6.dD\ k Œ¼õpú ŠBQíœÈ5ýËŠ³ô^Ü0.ƒjÏÆF÷š<½ˆ{s¦òªa K®Øi¯ÃM„X7 i—ÄF[Ë^¼…Yßè;äļXã|j4þeÒyr1ÿFd?ýÝœy/ÄY‘—<þö Ï>Ûqm•k‚³6 CÀ]íC"šª(*_¸S¬F«¹þ¡êRÁ%! t©V ÙëíF\|Ów¯òêο¦×!j œ½‹re±0 Ö>ƒu”úµŸâ€.Æh„¥ÐôXÙ|)°<øš®¿MÇŒØF›?¦ʹvÕ~µã¤G5˜y“™®ò‰ AF€¯ £Y~f7LÃm=±DXÖØ€ÇããcÛ:qÐ$ùb —m°„ù6æÄ€ž5‚¸5 µÈ8Gþ «ÈÀ<@K¿Œ)šb?Ý!ƒ|Ѥ-Rò™üÓÄAéïP¹ø)ÇBKôR‡Kûª¤„>< ÉÚ#ǯ8­G¡ Iížië ¡¶Æ®DD)$àR9&49 ÚT‚»°2[4ΚAÜȉå¶â…Âû]´ åh6r}ï5:Œì ; YÛyMb;Îo”€ÄSÂ3cŽgÝQZÛCs¬;¶ÓªÊR’\™·€§ØÐŒQ|n€.Ç`Dÿ/! ÚE¡ÿgxf&;¥ø´¯¡»)P%+¡ËU åì:+Öv¸šYTu`ejŠfY† :bW´ÄÝ0…)^9Z…ô5gâúMEË:$«i˜€§7W„þö- ãƒ(¼ý kEHVhPæp°aö¢LXx”K°´Xòìâ~.þ)ÚNF½>QÁ¨îA Òö ÇTì˜3 ¥ùBßs¤×·&OéÒ¼ÀE²'!˜Ù“NÇ:içŠèE÷µ _Ùï~¾ü~!éüèé0µ²Ó|¯‰qÑÂü×GîŸýòWÿâÎèŸ÷h·)""~…¤–ùÔÃ_Š]²Àð_¡.úªLecø¢£H°U3ÆEì9ƒ´ì0Æœ€˜ºøÉòP¸áÓ‹Ý”þk`êt "Í`ÁNtŠ 3Ý+³\5¿á‚ܶÇöضí±m›lC¦8‰ôà!´àmÛîî.ääçŠ|s8ðBe…XôÿÅÛ¼eƒ€ë_@·y»”t†µË¨¶Î0[wáÆTÕ:ÏÈ¥øS2×-®óóè ²h#¯Sb#ïb˜iìœq—Ö )¢í›<¢X~Ã_W´_\¿ÉQ»Ž;»ƒõ†¸ë·„¾Ÿä¨þk|½ö_#-ßóXáó~yÖbÀÏ SFÀUôÿ¬ÁçÂLÿÄãüz_2;ÐÜÙÓ%AÀvq?OKñ[6ï[¾4-ÿËÅ@°ƒ™Óß+]ÿ4éüšÞY¹˜¦5±mvúßX–+Î7¿ßõù“‚(¥ì ñ¨÷.ãsh t0 Ŧb$ ß<¤-&À‰U.BÚËœ:zˆÖð š$ôBÌ‚ÏP ¥+Õ"8·µ<úYèЙ+æUZFÚŠ ¡¡#zú¥ö좲¾øßVƒBg4i)dZ©»iU! ¶WEýͪoÑè Bøä^úN6!ÙMmfdè§*þÓÕL­ŠøP«ÛU’Õr#ºôŸçîW<4ú>{qFÖ|0¤_Mžd¯I߆XÁ~­t†JŒ«µC«iEaC«ý<¶Ç£+ì |ìÑ0eûC³¢XzÄ@E3o¦PUøOÈ­@WtêÀ?+"›àÎ%[{ìÊØC¸½"Vpø Fi~2znö‹j­ ôí¢û<¨×ðäøä ̦ý!D‘iãÌ-®Z‡—”ÇÈ;…zw†ñXË<d“·è5‚B¥>Õ=èŸáÓyÈ¢¿Á³Gɳ6‰„h Z¥°I©:\Ð@åLh•Û _ŠYò¨ˆŒHog",€¦©¨ÚBI<¤ð¯êÙxÕ_¬Š%íøV|èºT]íܸĪöÈ• WUŽãúµây¹£ÝÓ”—Ù€—VÒKÑiê>ÏûF‹XN—¬^Á8Ò’IÜ+ãZëš6å´r ú¿:ౄÐÕ¿ïî"XÕ&[ƒN8U3~Ýú\TVT\ /gD®®ŸÃ?6ºcõ­ÜÝ¡œJèvº6¾iêÜ»¸[èµ²n©/™yY~Ó†O/GqÔ‰aÝ·eº¦nW"+?ö¾jáÓõV%‚ê* ¦czgfËöûÕ\¡þÐã¶Þ-tÊZ£I“* €Å¦¯ ο-pm`uéylBÕŒyŸ œó(ºƒæG¤Ié¼cù;ñ¦ñYµSn¸ IƒÎ@’ë¥ËSj@®´ßa‡Â?R#ÏVÅ[\Ÿ¾Ûiš2<ðþ! âîÎR_ŠÚàÀÔÙþ„€VOÝœ[Q‹ÈÓ—“_ñ˜Só“Ë£…*? Nƒ[ˆ­¾Ž­¡YÍîÙ9¼a(³KÙõƒ†úѶ ZI\)8•‹ë(ÀÁ›Ù£×ü‡L×סU©¥b½ôÖÍÁÛ¢„A;';€á`?(sÚ£—ß6<•³ÁA z ÜtŒJ]º]±È y hª"C Ѽ¸„ŠCeˆý*’̧CGE;‚m{lÛãññ¡\vÆ+N̤ +ô`›àPòëý„J¨X»}è¡ùr̨´2…F,êL8WZŒšIFã38[dšû¯ †9Qá9Éhªï?¡É[a\Ð’¥“O±7€?œ¡Hã…FæÀ•un̲õPQ–ÀOºxÅ¥± üè$km‚²®.¨ˆöOlÆO¡Ñ#ãA× rF÷‚>"#WI=(C6d|¿=SÚØ[ûNMG~. –œÕs‚ÿ‡«®PW+â‡bÒlÂäôë9H( øñÚ6ãùªYƒ¡gêF0žIj;) fÞ1dEÂ+vVCåMŸ?ªƒÕIË7ÛqVÛ†dÖ¾<´“81YnMñ©»te›S¦ŸÕêÜ!f`cdW_C–)ve.gªã¡¥`um8O[ÀH]YÃ2j˜Õ¯"øä*Ö\¦„?³Å#p‡˜Ðz Qð)|—µkme-ŒŸ $ëR_Ô&PåoJ7×ìUçl]y0mì´Z %DÈú,J‰-ša¹»’ǪœÛ¤Iäsši,p% rħEŒz:'HhÌj%Y@+  ÕîÑ!^éasUŽ”üÇm'ØžeÏŒ9%N©–L¢+¡×—'#çšg« ê]ÜeW ɰãÚçq˜,É[:x»ÆŸ§Ï`yx`¥ªÐùèœçJ50Ù†ï$ ` „Ú¦qxÚCKÏ<§@‘3q‹<0éÙd9÷˜/¬$.f"“߃ŸÐÅifÏÒS>‹–ì³Çã‡Ó¥üW83¢ÀJá…Зé}š¹.O5ÉOœ~E$eÑ]ù”nª_I:ÏÒù<‹@SÓ½bÖ!]3éì·“GMWÔ;S«HÒç½>Þ@÷ÿ÷ú{½°p{Ûœ1p »D÷ò„îÒÔm &5uðjÂîèÐ$F“AÐõ§éQ ƒ ´0 &œüèPºØåƒñJTP¥ ü:™Ú0öÎi͉ni±þåb±½€ÛAOC€Rõ ÁãOݩĶ×þlÛc ‘' \_ Oø‚§E¥oí*ÕÝ÷™í+r-g#xçô“«¾!=ÉeBbÛ‰ ”ê}ï4dôd DoŒá|¿Ðî\Ê\™Jžºœ0HßÇ⺠¶•¿­…)j›þõtW-TP¤¥Ùäë|ç&~Ÿå9{—Îɽnm~Àƒ§¥#W,îPœùD?Å'\wT+cþ³#=÷¬ µ¿d¥…Uë;J¾^ z@–}à3çôl×ýd’Û´ƒ09ÞÀ«£Q›³¢ëû o¨] þp†ÉÛ1BqfBçy¯)b8÷DÈ5a¹OxRÿסÀÇ¥E¾ØAµ’ ¨D€_3á|‡Å¿sâšÊ³¯™éŸIÈþß$}‡¾ø°ŸácuøÕkêÚÈ|ŒŒE®&á,˜—U=/êBïÁšCðÊÃX“9.aÓbïNËÃ4)É£N`D¦x #(°¢V§Å4ÏZù:zí:Ÿ!¬dç2à€Ñi9ˆ)ŽìFf˜ü‰Ï<äC3«kÈ­ uhÌÚYó“D¶;ØÍç w¹¯äx²óõPxÈëÖ ]åÞæƒÏV¯±SE %¡Ö·µk-?j(¨3Ç–me³ðLÿhô>©5‹aÿñKЕ(èEm4tCuïÑ…`kFØu!ÄÈlÛãíqèVµö•ÓÔç «‚j¢é'² rEJd&ÔWah{¸`¶éO|‰åç0ÄÄ’Ãb–œ8SËÒtœ¸>0ƒh[XÙ<ɨ¿Ì¿_A3Þ¶ ·Í¶«Ó L3“C1Æè:ýÄI¼s…^2Ün`U5õŒ_½(EÁ…zÑÍ/5é]®…éžú=´œ¼f›û \Mêôòˆ Îê€èN‚Ò•ÕúŠç ù64úö ./á8£Cj¼<Þ40­Xkú~F°òƔ竮ªâ¼kj’Z‡IAîúÊbX8VQói/zžá^ŸöàJ¹"ªø ¦îø"x°ùù“ãà†9Kp£—”ÿ0³6ÏàÖÿÝÈáÊ…°ó´ì7Ί‘R("mîI*\\i—ß5 ýM´ø÷·¹²çKi€ù™ÕkÛ?I ×”X¹éoDuÉ2²x³©¨(•¾óñÿ“¤óß·ØÎ%¼)í¨ãìÈ¥­óÊêA†Ž2ÐíÊ\-”:½“Z¯÷=zØ{Bþ(müp§ <…¹Dx8q“ cm-Nƒ)èÒÖãv˜E£ôÑÒ<0ódOÃTåFœ1ùK Ù†ü–bù†¦H^V-ÔDø‹™¸ñ¶ÑN¥qyº /sbF9ÈÁçÏüÁcO.4ÒË„C©1æèûA ÑZFÛ}֋ͧtž.·`Ëa)Ô!ÃøüéÈÚ¡ÀäÍT牺nžËê WqF ™<AH'ê9Rq£ ÁC ¶Är™€ê!ÍŽö_SIÊVE}™6#P¶BÑðwîœãJìTà"ÛöØmÛ€Mö”‹Xò½VMßm…s«¾E“çŠ>IÆY =6A••¤ÜR Îó¨˜9¥!Ù´í-¦@‘Gf$šBé»zãÅч¢›E¨;KÊÊŒ˜ï"Õ: ©[ûnø:Fj ±{Š(RÎy/ß}¢L v~ìA”Ô– ô1ÅÀì*-½A–’©‹#ƒZ•¾símÀ/^†ÔzW;6—')¨ŸÙ2fe|‡Á»ä„Q”yYóy‡2^.tV%±ß8ÓûúŠß¹É^öÀ¸ÈÆyÒ ²ÌNf fMÔu{…£û¿B?Ì2o´Ùʾ¬4OL¡hkN¡¨~ñ1b#éàéa­÷1MÉñ†'Å8ÓZk Êš**”>œ&‘§EuÑYÔ‘"Õ½&Ú/aðmõ»<”2Êû/àÆpÙлfÜ]V8`O )Ý¢×ö¶€ò_ “’¨:·2nXX³À æt×÷RS±KЧáÜŒ—VÑt@¿;&éÄDñÒ÷OÏ=K¸tÌòðÐ()ñþ ån³.⿞ÇI“ð‰]ä9ŒÈ°´†N*8#VÝ:Uåp»xð,ÎËVš¹gûCK” «]ü©©†¼c&T Šñ l¡A'ëZqƒÈ FÀ¼‡ŒÜ’b1{b"°®™°çrÖÓjòL¤'zË(}&Ò—xœÞÜÅ;y'ÁÉ79¤£ $ZÞâàøŸA‚̋聆¾}SÕ÷k!—kã†þ,ŸU¼µ×N>aÀb¼w“³bL'—”Š.~5îp_´”IÉ`WT(ŒJ¤¢ÄøÌÇõ4/®˜æpX—xq7%nhès‰Š±¯‹åõŠÿ]®2ú$eÒ ²©fêÊÉ3´NV!_ ÿqTe'¬>_‰þ‹m†XݹðÇè¥>‰×òÚH¦+ùÆASx$èÿ¿ÿúwIçÚ BÄóï¨#ŠÒao#ÌSn*’Â0¿Åz‹/‹MÀì,ÀM˜kÐ~÷¡ # ÂhB“&Û²¦ ¸7 d¦Hü#áNȉĿhÙj#'’5ÁÓ—À‡]2õ¸òñ·T< }êrÖ” %éhW5w® ¡zoÀ¹\”<åHª$µÌBXïf"þÈç;òœ~ÎçµØ ™€VÃNÚÑÑÅøF_ó@À¾Ç°=¤{…†ðª‘å0 Áèc¦êúžÇ­ööÆ^³ñ}ý xñÙ1ñþßÖ³MD¿?û¶7pWtÊi¥³Û ¤ÞY~ve6  ÷ÚC¥PØ•;t¡Ã:iHT]õ'ÀvÖþ[¶&4¹hp™¼.ñW„á³ÙŒe°ÿۃ͵ü:c91PIÙÅâ[™ûÒ^6šïWízšé¦ê”fo9¶ÍÝD·ºJ 7ºU_ •da$†ïãwÂhît@c\ŸJ ô'Öm*Öv*y@óDJKÛv]ö)ñ3\A|£G€%î€9âa`yB†¹ _I4Ì]"ÅŽ6%:} ±ÌTªIGüŸRåéÍò$&Õb#¢×TÖrd˜Õ›ëØ`£‹&eí®ª³Hš`fùR,…Ž[Ávqhþ‰%ôánß ‰ų&ÖmLp5ç„-ǘ=R¡W%^RxˆºP”þröuÇÏ|SkimLa"ꀳ¬Ì{›Dw5ç(^Z¨¯1x ”ÈÖߦÆéƒ r¿Q†p’é¹åzGɳö9“oêVÖ­Þ9 œ’·k·žôs‘ªs‘Æ6zÅâ„[j.Ïr3c 2:]ºÃ-ó²HßëàS¦Ž(ý/‰Rk¹¿™CdêW.…8û;+ƒ=‹ò5·AÀýaÜyNûýÓÌ(ÂxóÕ+¹ ¢~¢ØÈSOìi^>yRË,‘Ú«]ÛÊqƹv M¤Ímìm0ÁÜOè-tщ;¡}{èÕo$®u³ æ3¢ á@_hÎpl.ºïó$t…¢ÝœÂá†PCÉ–¥]ëwÀE×ÅAchŸE‡Ä/éuf½', „¦%L¶†›Pš$”¾Ÿ'5’0ˆcÁâá1!䉓•ò÷\fóêŒtE ÜGÆÈ8þŸž8Œĸ’Os<¯úXÔÕ(EàU(‹@¼V·8žIH8–žÃDš<ÉÜ‘ƒìÖ{Lh˜Ûe®«}§<¹¯¥r_wqt·ä0ㄯðÀä‚¿„t^“ ÃGUS«{nÏ _1€“D]ö5pQ¾“ Hhe°VZK=‡*^/©é,FËàýü£ªS‘?,]RÿN¦Í¶_\¨]À¥o!jpÃű‘€ˆL.¢½Ü&•«wÿ;º½é)w$ò"'¢ÆÈÞ:”rÍÙòÌbå¨ ÃÓ­OãmtBº͇;§U(ŠÏóD%|¨jt¶5 t\,vDo8>v* ’r4`(âŸ>#/ᵟë•R®Úe«MáeB SÒðiOKо¼oËÎpG̽%“wø>#V¹íÀÝ‚„ÌÁ‘b¢õrz¸'•ü ûôÚaPO0q?ÇJ¯í”ɘ¬éòVJ5ñ3®­gÌœ¹ý«6$£†"ù–z+^¹ÇÓÊ?T(bº`Y…¤o[’0Qx OŸ•ÜrÍ­·Lè¹u\ÖûÜ­œÁv_Áíü<·8!çj—¨˜kžý9j=ų-çÁ”wù ª~Ë÷¬É“€ ØOÚ\€Ò¬c,i Åv££Sш±†©Å&<^âêÒ }‘ài’Õfу©á_ùÿ=‡#ÌäU·]×¥ž}Ü_ëß@’!ÔP\ói€iT¾ÁàÜ0•Õ¯H¹ÑàWR¤òê9 „k©‡§ñtœSо`{ ]Î#RÔ«˜I½DÅ sRÿüxºÍ´¹³ÉÊ[dê-ü&Òy‘O}þ¹NÂuÈøÑû¨B–AŠó::ª—n¡6|•6›¶pý,ÈûÒ-x¡3Ia)ËP½2q¸ ò]O–Ò.:¸'>°–xÆ‚£ÔJH sâãñ ’xªŠå)^þ+ùæ£HØ«Ómq¼«õ`ÏpwŠfŒŒîX镎‰Ìu`•u ÌI}jÇð!xòÙûpÕå¦\űþ1Ÿ‹{äÀg{‹„Û1heÛÎk儤'ÌØùCǶCï÷ : ÿ9A«þ$Ê$Ô9Ó–µ„<òÂÿAFƒ{¾®[üsL&å²9AO˜}…bs>¸É#Ãtâ¸ôOwDñÎD¼ùäøÏ‡Í¯Ô@|èp•,?l.!É#pùï~¢Q©^Ô¾o7á?³{'˜ý÷ú2þ Ç{¢‰úE_Ãw‚|ä‹ãT§Aá¿|¶/¥É»ÿƒþ¿y¶îö:DŒ›>&IT‰å?bf|à§mè:0x¿Æ¢žY ª¢E\¹rYÍðiÌ?|ù8ø2·õÏìÎ' ËTJÔ*}ʾ»9‹ÎNE1ÁLG@àûÈÏK¿¨¨†ÚÓh#Á«š’ñ!Ll–¬CkI`„Æm(Nûw,a¤­ÐõDÍQccižô³5Û‘ز/FB`ŒJ“¡†4˜5 éÕ·Û®iá«êÁ¥oé§-òÏa˜äé14Úz0„°?F{Æä‘‡‘GÂÉ àÆ ‰ÌàÞŒJ½;¤aï,Ë9æô04™‘ÐÇ ÜØ+ÉŸÒ¨ïy@u(ÙtuŠŠfÌJ#Ï€qÿÓȧö¼…^Öºº¹¯ ¸wÐ\•/¦ìê-¤èȉn7ðäÓ8o-%%Á8¸-HÓ± +ÆÑG§sifèþUFbßfa Ÿ­ðÿ(±_“¼èÙ²´u¶í8ÝK~ÕÐôM¨»3ZÉÉZ£~«½¹ã]CoY•Et )È3r€ fׂƒœdÌRo*7ˆæ×éD)ƾҽ›Žndÿd]û,í]Tí’ƒáÖY-•Ê«jáV»:ÓÐ{qô—c¬Éó„9¥Û±¯¹=l·1|:¡t„ô[Î"!»ŒõØÚ6î첿LÅq`̘ÈÚAǬ–ÌÙ®J{ßɹdžý—_ñÊꢔ?>xÚÚ~oÝ-„eaâ½Ån÷Å€O n ¶Æg¿Ô¢Ü´Ìj"Ò¯Ž#¼Ø?ž!°ÖÁrY8g5'k@Uëi.cuš¬ÄAuÁF'ÉÁœ0ÇekaŒ€Ý‡ÊÌÅ3Ú[ëÎp¬üÕ•–á Mdt-`ëLšc/ÔÁšºÚ/›=’®ˆr§Àx°4›Y!AÔ¨´$N}Å•Äì”–Ðys%Î…¢94åÖÔ·j&„çªÄ8è,¤ ]ºrçfðƒ¯´1çl “ú÷2¦ô÷ªÌÃ%yúÖÈÖ “˜« dµñ(o~‘PÞñEÊ׊1”(mAmWñ&H¢ýnâK^ÃûÁÜ•Õ9pàr²ÛÞó gñÌ£„@pJ,ޱ;0únQåôjI{GÒ¬hâBIõÕÛKÉ(úROè_2F¬û<òœœÓŒÒX—¾(l™a~ŸÏ'ƒÎ‰`yEÙwÔ\!½De‚jŽ. àY)=-¿÷h_haNÎÉ3ºïíÒúmDÃXõíåÍFí$£Y‰ÿºÐÂxmyöÂ?­¬pø Æ},ÌÀt)ÀL1\´ :Ì«Kb:À°‰Ú?sâo£p¨4 ÿÒy΢d ¨Õ4G\üšà+µÞ TŠÈ s¼  Ž…:¹FØÏ.Øa‰ª_ª’ Ï~ÌÐy͸ܵý< ¨d|ÐZ*«ö9/'¸æïι½mxÜOÌú¦=¥ÞúuU p½ÿð…¤Ü÷2 (K½UžùÁ#‰à3#àÚMÅ7CItÏT[ãØ{ãðÜß«G–íA?´[:ôã“´\{ A»S¿b$Ô:®íƒ[Ç*šNÆ *%4‰ãC½1ÅÑëHn©Š¢Á¶m ›t¹²"lÎò62¤Ç Y{*UT|ÒÀÞR?KÈÀú©JËœ:ݶðèÎnœ ¨Ÿ’ôDÿ˜mWlfu Æì˜†eÀ¥^KÈ/ªÒ!óU#pÌ?§W œÖ ¬_8£]"¯Y<™w¼,šqÚ¨ Y`Â¥‚”ÐíÚY’3^ȤÄ}±`mØ)X—¼ãtj€ÈaÑ¥OèúðË¦Õˆ•zšµ' ª fÍ“Ó!‡»W]U²ßÒ6È£/vŒ#1÷¤9xë¶S]²ëƒ²i†WˆÉ/¶œ z dåŹRÐäâªÓ§À¶•! t«ÔìÌoö8•C½*o^§No*,Ï 9,„Ý×oeç Û‘§«2+[¾W¾z€’G-‚ÖFJMýG¬Ø ÆC](2p…جð()µ‚N\®œÊ?âu¥Æ¸"›¾¿—>ym“ÁÂÜ/*:H:'ê„™®vèLT § Û:û“%M¾  ×NÜ[D/ä–h ct^qHuHèà+ëbqã›c$°l^0a¸Ã̹²À5Ëñ„°bõ¥­GÕÂR OÍrGS©(osëýŤó/^£¤.Ôy²ÙŘwü˜ûJÌÀÇùÚÁ½ù[d¨ÅÌ… [”2/5|×yÿ]sT@Iâ”ï:|—ië #‚…+°z]¦D?™ƒlpö²Î4 ÿÍÍ Œ¢ÕÖm[¡a¥x {µ½*ÝÓtþ½4ŒÌ¼ò>Ðíx~óûUÞp‡®>âH]-¯?éNS·CûôÇÇ±Ñ²Šƒ£SüØÅp>îé}!áÛ¶íí±akõƒätžãŸ!¯¥Æh@o¬ ÏOªÞã>ŸòÇ>÷_<ðø?ÂZ¡±ýGë‰_µÂ3Q©ºð$é}@k5·nѺýA@Ê(­„®cÖõžªfË#«ðLAz`LmØncÆIý7´é`°¡3= OLÿ&Åå’|©ý¡aT¡Â— Y…ñ÷N{îB3Èh¥×k³`~ ¶Ü¡SÒ#ÁiŽ1AJz!b(ÛÓÝýÇk;*ë;ÇŽ¹D•„Û=4^ )3WdØi Ÿm™U ¦wô…° …jÐýèôJ϶†á‹|ѨFä)²m§i_èâÀí74ºüÖ ÌŒ× å±Ç”É(‡D£íØS#ýGG†<Éþ„b~Ru zSÑ/ õ7ä(’t’… ZaR±¦QmÆ–ºÚWè¶û—z?Ü!ý‹­w4(lš­K\RÅ/gÎ-l²£(fÛÇNÖU•—öÜcÈ1wa­Yc1!²{Â…Y^ð¸‘Iõ¥+ áÎËÍ6†:, 'cÉè["?&=åÈ gÙ“pHú{ aœû Š.œÙGý)!dÊÃÀ“ÞÎ$½¼7…Ò4§r9·t’?gu$4´ù½Š¥`qäuÖx9»­æ„1×ÒVÜmÞ ex¶:S4=ÕaVÈ­:áéÞœðoU¶¥ÇIËãP®ŒÜQ ÌP0椥k- IœxÄ( Jd¦ –ÞÒŸA;q½zÌÉdO ì5íFäNfë*¸Y(°&HÒ}â"^"$ø'kB …PJ÷nËü(NÚ;9OífÓKeHxû} •Èt.aWE0Ø®jw÷J–¨t-„–‚qÇÑxξ%v¦”|u¹Ü§à/:FZ9ÒR÷ñž mÙKÜ7…œéÐÇMþ¹ÜÕßÞ+šMCÎÞò;\tÓràŠq p¥Cg=m¬÷è­±v”.çd#R© K¨š¯:cN%”Ï×ã´>ôvñ~Å©•R‚¬4pÜ…ÇäÇÃmÓ×Üx´6QϾRÕѧ¢xÊ ä¬$ï_ ”O+ÁMÑÍì’Lz$¢ì½F̸¶,ɲ¼˜Z«ú ðŠƒ¤©7Ù&ÌÉиn±ãd¦{mRþÏ %ÎÌFû~ùì„tþÄ™N¨xYbN^{qS/ï¸âÜtÔÆš/뇅ˆÎ ÎòAÝ‘ïÅ$M€á,Ð3ÚÎ-uBα3‚/í€ (xŠc˜âM®yƯßœi*†;ê]wÉ×ËÂR&m e»ÏUKÛÑݹ–'e% ±-3( qi¹¼!›)ž+âÉÚ\VCi°ÃÅK‡ÌYÔ—k_“Î ¤‘ã‡æûã›XÜF·¾ßGïÀc"j¯Ÿaæéä!´¥‰¤ö–ö°=°AES覂Î.pàPz¬1]FcBÝ&×–ej“yjIhçSáotdHbz@ºè2ÇŽšá´:¿çS ƒÎ;Žé{‚Æ6em˜ÉÖB‚í›ÍGV´°½õFã-Ø£ã–ËðÃÁ *SàXîuÞÑ,\J ÿuâ ‰ab›-R®z5I¼e-´1q{Nnl½Ù* îx¥ &Gj…bHG Ìh ”ÿ„5Ûï|XN<¬G‰ì‰& ѵÆùì†N[CqKkª¬ü,\¢Qu 0Q¥Ùꊉ߄cI#ÝÄ"¤âGØ ñWVYòIòÌ&ñÀÙ2o¼çÕ 'ló›µ±G02I ¦)bLq¶ö¤È‚,IžK÷#˰51*O²T†â­å‰';"8¸™Ç ˜—C…b¹(DÇ„'ΰkaEÊ:3G–:].>N– µžó `ûF¸¿æú¢XVóüÓ#&†ºCq2$i¨|ÞSkž$0\MD³vøêZlÏYxžq€ÀåK¡jJ´Ò°ëÚ{×0-Ÿä°«Éjf†BkØ£Ûï]xÛk0³é©(• œÐ3Õ¤ØJ¶Ë^be™qÐ뻚mº@³D†:êk¥",ÊóhQ"r­(øG.!c‡×Ù¶-½³@©•Ô¾8GW§^c»*Àhb‚1h!(CêhÒ'–òÈÞ§[ÀQÇÅ "XðÅGù^p"OçL[pÓÇ|ØdÃúu5Ê2ø„ ˆsËàÐÿ4ÆÜ ‡Üê,pœ¬Ûøâ€tžE¦ÃÂ71¨Íå@n «\M#h ]øêäo”U €ù¯¼øïw– €ŸÄW±P¥²ìÈ/Cÿs<¨ »Ì‡ÑÊÅ’”m´RXÓõ z?cÀä"a±è>¹*z¤AÚcÂ’ŒTÆ>i”ñrÚ¶XƇV¨Ô?:l¥o D³li£w$–¦Òk "Ø6lÛ¶mÛþ§ø£Ÿ¹·•?ÞÏ"çå+½¶±×ù}•'^¬ŸÄk?¾é&Žv•ͺ@Ò~âóטý¿×ÛϨŸ}Wø›Ÿ¿×ßëïõ®0ðègÇuì•ò¿0êþ[{ÿ$’vø óÄúÛ®nÒ#[0ºvwZ“^”M`TD‰a ·öŠ%¡=.e”À1C3"´=Ìö·Fæ4¶qkf”ÑŽÜ® Õ×ã¤lÆ0¡¬’ÈcvŸÇ;ÙŸª^ÓuŒªlfÕ¡,‹Lù*™øÑ!tý”aUÁ ÈÒ:é¤Ï¾À±j9ØŠÕ{za™üU ÊÓ*ª£Éòªüú(’n¹{ÔªºÖz'ØQê—Ç3î”G{÷ž0àÓpÞsÔ‘­î‰~bö?L"äÓ8{‰ Ýq  ŽÐbW#°Ý^=ëMbS-úÏÞ«ÙÑ{¨}G“U(Öi²¢ŠM!"Ø6<À6( ”1yŽo«p\»,1™QH;ÌKb¢ FÌä˜/en+Ž„^®Ž‚ÁŸ(¡¿$ð8(Ž"šgôEKD‹ç"2;}ñS1v¥ ù5Å9<“ë{ÔíˆPåÊû[ž¦C¹³Z±­Ó¡nl0êvñH2î™ ‡Y1ÔµSY<.ŠæÍ²•+±Cbå5q×Ó.4Fí¤–¼™êi©<4Ù«½je™Ò‰x£÷ëLeµn oÞVˆ*ÄÏèøŽ…8-±#5P©$* ‹-åOæP}V ßÈÕá?­±éÝ NDµá¬X´¼®I“’ [áUk)ËN™" ×<ûº[È#¦jçÔê$Ã:]ܽbOöÓî÷›5_I±Ã´©|b[ ‹üø„œÃufxz °=Dz „ îà$Bì%Žð'-xŸF¡ïL\S WÆotuL#rQ!Áp"¨æÕ’†;ãH›Ô«vr¤æ¸Õ²ú¯<Û Ö>Ï‹4Ö}Ÿ &KÑÆáŠî{M®«¶¾‰Ýœ½ùt7¹‚ÓØÑ}?Ýyq&îDºõ81k"qôÑWnãûÉœ¬ït*.騿lÇšm㢵{`´BU_¯9wÎðA%2ß«ý^B#V‡Žs×û÷; Rð¦qc?aÛ7º¾¸þp<؃5XgÊó™8Ø÷¼Þ ŽI4ÿ,Òùi9Ÿõ8//¡u#Û˜œ¹¼ô½ÎšMŒ’Ë”5`îF*"éÛMvk)L×[ff;õ¿ÿØG¥-Öê\Ñdà „^å5% ÅRP’}1'ë<í\`7›!˜ñg_\k:çø2e!&èÊû_&~Ê:°J ä†+Y¢_ÌŽ‚fñ)ãNFƒÛ1œ„‡ä¯®‘'wðžôàMré`â·,øýiYFÜ£*Ο Îô7¨Y±ò*´‡.ºÍ%:2!Û®a0@6>bŽ';@× -²skV•³ …Øö†uÒe ŸÂ^üÿmÛ—ýV5j¡Ø1…)U¬‚r0¬9j–,Q:?Ax ]ê 1Bû‹†bO˜ÓTÓ­oì)»ØÑç:]ý œO:·ëÅ=òîrns‚ìï •‡¡dv»ÐŸV…æ ƒ˜þÞLByƒˆ˜¦“9ðî·C¯iÜ=I:^˜¶9søÊF8”/OmDÉczb€Õ‘Š:¥1ŒEéqh`$¬<[¾ž0J?0‘? ‚K—ȇš)àÅ´U‰7•¡!rÈ{_J.Ä0;©44P)‹\BÑ`j`@vÚS­qñ„ bé©T¶HqêÙc$‘#ÙÚqê5À„›q[Ñ@Ôå|;v7Ù4I%0€œ³‹§Ž®J–šºˆXÁÊr9 §Œ–Ïnç‚>¡i8DBÄEc?Pyà æ´é9îÝW& ¼´Œiiêô ›˜R?A:ÿÄäþPŒú8x FéÍÔܯÆÕ#Öh·Õ®cø¸ôjœ{BWó@OkÅ4ï(ŽÊš1†0¬@Õý»|kl ±‹Ê;ÉÛ E´àœþ*0–:éyel²= a+ô? )C¥—§VJÚÂ0~_–ãk`^D’Bb)ë 3I€x×}Jy]"² œo{ŒÕG]~H8©ÑƒÌ`ïå»B” ö¾µ[QÊ€[ýŸ¡ºW@ü³§fŠÁÍ!9YËq®ÝvÓΣ®êíëREÍêô‚YšêRî$›ÁA9ືA«sfƒ&ŽëÌ¡™Q·.åÒÊçm@Æ81;uRiÍ;3UÈf¹AÔ¼GÑ€m;h{f£"OLrJÄs–šóz’²Z¯ÓVén愾®‹¥G^£Æ›.RÜ­ò6%½„§Vg·ž²a۶Ƕ=°m=¤ð¶© $ÞLýN®_ìí»…§µ—Ùs|º)eŠó&_šÀ’<“v¹t^h6 ¥÷†ßr°ç×áÝ+üüãîÛ6r;ú÷ºìЦðoÙÕ€|ñþ¹œ¯X£3IÄêyÉì|ï­cyôNº@ùe,)?!.®:΃öTîýÓXl8ÈSñ‹lw"ûòrÿ™´B.GøƒgñT ú‰~ȃ|ˤÛ~ÁóV…Ï2åsœÙpÁÿ‡Ñ'šŠ}àÄM,bU·èECVßik~.éü>ÈxóÌoºµwØy÷yC>àKf-Üà‡ ÷ƒôéÌ UÔ[ìIO¿CÕ¾‰Pa4 ÷Â8ê]ékÒÆ…  ¾|J)NÃRa˦ƒ–߯œƒúI4 P¯Ñƒ×ØÖ…SöСªÖuz¥Kšˆ:J¦œŽ^‚5Ó°Ã<øAåSIiPÒ‘È€™:¨q¯nUY7Dž¶¾â‰œ¯¥ô³ª~Žúˆ^Ê>•;ƒ |rƒ%¶ Y` i ªŠ;­'¬I~Dí ?.,sÑsM¨½?bTÔŠ=Ž­üÛc½ð?Œs¿¯NaÙÓ1Z}lZ11 ïí ãVXºA°mÀl! ÆDfõÄy5¥Ár ¾xœè}%qiÚ¤8iAªâlœD¨;)L2Šc06m»¬Kâ@±³YÕÕל @ÞpÙé†ÞÅQ¼óT^êž;& €ÄΟÅ=n`à+iV| ¥Z¿/¦ûü ¿X?“c-y½ΑEd ”»îuÐrvø½ÓOÂrCâ‹8¡Å­NÁZL£Ñn…Mõqx6›6Ï+†`úrÊZ})˜àLg~é$ÝÜc·zOºUm:4¸¼_YE¸¾’^\À´ÅlíðI+ÃÊ~PçHAùŒ<æÓg'_VŸ™³tŠCÿ„Ùr×´/2ï@)`§Lê  Ð…·|%D<¥@ú¢aŸ_®‡ˆ€Xíß7B¡%? ßÒ‘”(Ý>Ñ£Ô°˜LrjOÎèë.Õhg1ß»Q1u`u"˜ýÁªË~Júnº(°Õ ®Ñj}RÈ ±G}öúÇù99€w-›õëð¨è3<¾§hñg-jÎN¹Î ò…çÀŒ}åeÜVøš:ÊÍSO§F—ÉRŽ0ìRC /guWVâ”à ôìíóO#œ ì¸zt¶³Éã?“±ä©ùªÝЖ0•ìÆ”c6mÌ"åôÜ—†Ä•©²§mG{Û¥ÂVHù8`?fþyDÛºœlOq½È<LjU„2“žL §–:€T,LS'Š3x¥IêŒs(’ÁùŸ~!'ÍŸ{ˆ'rB˜µž ~¯§Ïè)0a5LÜÑfy¶ lÐüè·Í‘9]óÎãØ±ì ÂØ(úN.ˆÔ9$oiˆó%Š* x; ÔÝmû¾æÐÏPÍç¢y‘RMBëõ¨,ÊÚŽLÆþüjÜŽD¶íÇcÛÝ(±°ŠÙ”z \õT¸ö.ÀFæÕ:áʹ”S¨Ë x Ø;£wž© ôN“‘´Q¤MtÛPTS}òá¨/‚™ÈøÆ"q@›^ˆäSTn´µ¾xWËmèöí!¡zLöXÖÏ`pKµL´Q0®¹£ c£D­EìˆÙüJôô¡°0ÛCMCDÙŒ¾EjÞí¬™#2µÐçgà¾sgÎAžª\^V±KÉøÃC÷®&é`Äã˜ÛŽv%”€wßúRF½Í ÷µk$Iç€qÐ8)wxÁ(uÓd‘¼šæÔßÇIãjˤ×Ô¾\tgUûŒ+îp+O±YñXÓ±€ ɸЖ°È•G8çPÌZô½u‚Ñ5 =‰‡¦Ù,d}-›„½+Ýê@$j~¹ŒÖ#@ѹHË<{$è· r%}aÏ›ÄólƉnÑYJQš­¯,‘¸’}´.þ.&D4+´{ƾ´MŽ:NåÐ!ž9ÃŽÒfË×Ì' Ýnâ\*ù`QïY駦Þf’äS>J*ò|=CW±¶¾TÞqý¶ ¸Èµìc Wý:  ¿×¯|Q®ës1ÔxFÚ+BЬþÖ˜œÅäÎÖ³ÞœtޣѴq ŠúÍžÖüE±²}Jyw¤<ï´KݘƒÒñ*ë'­Ûm¨£yþb”mΞ‡<¨ÿá_.ªZL—_îŸ)WÐàû·Ê}î9¼ðÛ7îtÉÖܵ½Ÿ&D38WsÐ ¶F9€>œÀËÕ€×qùú&Ûl" Œyy§(ÿMÞ ?ŠÓgä• €OºAø¥¶¸ÖðN[t%àŸ„OíØ/Oô°þ±ÊjÞ±>DVu¸ìkª•ÿ¯Sß`6FNè3oQóª†jðÖþñ÷&9#_þ¤zŸµ¥_Ç}aÀ§Ÿ¬¼QÆx’*¨hÕž|ƒw[üÛ ø2c;Gÿ_Øæx Ó黽Øo'ÿÁUÅ‡|éž´i¢·l|Â>Òš"Àü 9Åv4'çZ°wRIpV™+AÂç¦Ýx×âü¤óo1Â?È{>²J8=¹?ÛìÜšâ\QiãžH¤ŒDPù¨ Æ‚ &qyg»#Ê +gª£mzSßÐI¿¾Á5ï-.6·½I44e"1í¾¦ÀVëÉÒšŽQôp¼ß°ËÜZ6±ØßÌÌNoÃ)¿u;X“ö4õwôŠ~-G h)s;»ÍTìšM¬Çž×m%vI‘vÖÂ4#ÍQÓÁ!uÒóöýGQí}|ˆ¦'ê1ޝÚK1Ç÷Z½„½€”M jØUCõ˜C¯„ýJÏÞЯ;¨^z±VëQ8þ§ë‹z©¨«šºý4ß¶ã*{íÆöÀ¶5b¨›ð¿Î†¨ZnXfæK6ü$Ö¼ÐgBÒmÊe £*¨Y‰÷¸dX_ ÞyÂq3Á:yU­Á§Ì 3éã}l­zŠËø%Ö¬ñ’ß±0IìZ›g¢ÎµE¿ ˜ "η4FõØ«±Êbb.È °rÞèCa–°¢>ßSÇqPâ[AÆà9”‡Ïºg¥ÆuY­Ô‚†0„b°~!«Àð•_sÇTqBù³S(¦ûJ±·Ñt—ÀÁ¸<£}z“‹Õš¯ oƒÖ‡9áO! kK?™øv`ím©ÉõjuÐÀ-ñf`t;àgÚØp´°GÒòÒï5ÿ õú ݽ™OÍLê€.‡‚ïÝéùÍ>îWQïk²÷î×!Ô©¼…~’¸ý u 0µ²À¢¹õt=–)`qm96 ×Ã÷m»òŸ&OZòS÷1ŽÞ4¦ýØ~°ºÔ¬Tg‹\+Lq|eöv¦Ô¬•ãÜæå3ß—1{2Ø-›¤©ôÓ\Ÿ’ Üù‰¹AJPi‡æce˜ÃªÀ×]$wàî´Ú_­¯Ó .W¶ª¤GÉ:m}$®íeƒ ôcÃw ώᤩj0¸úÀÍw’ºvŠ™M.É‹ætOPßTät]Ç«sp ¶Û´ÎÁ™ñäI]àç‰H)Ãuj:…´'¿Zl}fÈUû hÌ­º3$7£èz²ƒ2ƒl:Ÿ4y@XÒŒžJÕ‘³s1Ù#v(ótÏÄVÕžþáÂБ·Tffçß"Ç ȂÉem^Á‘Ðû£;ØŽš4%½RÍo¥1›ÚžäçÅY"°Ø†KUÓ+é.­(…²N|ã‹ÿB×ôkOõûªn} ^ð\Yà®Ê´ÛveÕ‰nõJ†‡Åpm€@ÃÔŸæ#Æ5Ït/yPîqÐöÛÂý¹£“#+ãÁ$åâÐK Ó-É‚ÑÀ‹À‰i®PœïÌôX²èžðç± €ÍSk›uTÇFŠéžJ³þ×ÄC.d`omˆy{òº\C½q[¬ž +oSѰ’(vuÐgßé²I™îê¹"›M¡¬}Ïdê°¢dJ&$¯ù âö*ääyóuÂkKùöiPk"™½åŸ9ùicoø±š’¸\І#ºF@‘^‚Ÿœ‰eÒê7u/:»1”d‘_·œ®ƒ2'Msqœä¼H; Ë¾<&áX:a«\E«ñ'¢)Å7œ-ò•RÙ å}ß§Ü°ï°æŸ-æš¹`¾ qA4[›¶Ûnf®#·ùë¼q¦Öü„5“‚@¾Ü€óSøµ“}¶Z¬Ô2´î×¹Û êJ¯¢+âà £÷yý‹ÿ6é¼®DaPô%,œÇ€Ì«7£´lÞš2iáõ±âàÕ1=“))²ÝüÛܿﰰºÎ1ªWœé¼xuËÊ2:ìXÕÚ«VöªŠkø‹‘â'ÎÓâé×í6rmÑPÐûl©*ø¦T‰¨¹aå·’)q¬níБS j»Ÿ^•gÕj1’áF»þ)^l2Ô%Óüûè8„…a+wpÐ\º:VàË %·’f»Ø• ¡u lذaÛ•~w÷í(2ƒfÿšáÔa^ÙÿF]9o'U‹*F©kb§¾"991]ß©{ì%8; ûë(ë¼ìL„f›o°©.a¬ …wü”—ÌÓwo?é{œ±À?uÛ_u¿£0SOkÏ÷Uu!}Eå.-ZH4S¾Åú·§êÇÞ«aæožôôwÚ´qö/é±–Â…VÛœ_†þ¿ÝÒO¢ß‹„‚”@W­×ù—pŠÜêËÆøÄÍ"¯ÔOøIYÉüZãs°ÿE„QƒDXë°Y7õ«‰S~åÞëþóóV{v.¾‘¤¦Ó,~Ú#àìø‹a/>s*ƒ1å•¥õÞòÿÙ·üˤóŸy(}QñMlÖ›t5o1ÝÐíý+ªÑû? Ø$5‹àÈá|¸.|¶¾ï= M èý’´RÊ®»¬ 5ê {²-û‚Ö)g,]nl'lòëðE½+ôÿ宕5éüŠh`<~o÷K¿¡ÔÌI‚»£émÎoÝ“ö!JàzêâCЦ“çÁ?á‰< ¦ ÿ/Xûg:„w9d5 Ø¿êVî¿SÞ6ø’lXÀ;_«Øˆ;œp ug ÎdKγ-5Ú(ͬa|ÑzPŠhB*uéõè»·ÜæbAêšùÌ‘œǧ8]^4ÚŸ ¾ž‰Š÷é$Š3¾¢2õÉMFÑ\þp]PÒ2àpöN}èØ\¢G”pìNzk8´ÓDå̸ÝjkCÒžÉ"RW¹˜dtæÊÆÑQåBà]ž†Ö‡UaH¢’ØJ9ŸÕ×¥2¿Š}‡¬lɶEJ^³Ðð'OIœ~ ðà7i3eÒ”pȃ9>«@‡ÄŠŠáP¡LBoGÍ &vÓáø:"‚<Çò>* ±P\¬a=ê¦X¤°)Ó¯‚jæ¥âØ f¡×‚­¼>•gqD²¼;ÚT£Ï#â9FßéžÔŽmiÍ"5Ê4-Çå°xƒ»$ÂÁïGñÿx‡­ïnpÕóAZo¡ôêéžnÒªQÑFXØ¢øãœ›~¹Ÿ éàÁtÒtš…Ç>ü¨Zœ,sιÛÐ4*0@Ê~„ƒ+Ú 5Ô‹0=È äý=¤ó2ëúµi¢ü’΢op‹¼Úä*~§fAâ®x ý_?!Ë~Uû…$å-bÇøä+8ßÕpž°ä[6ïLô¤oN1ÍYjªìÚÏ­5¸3×9;’‚f¦ÃÊß-xjm CÏ4ŒÞÚJjÎ*ÎQPn¸zˆ„.<.Íqæ)X 7🤅$ðTb[˜êÛˆDB$WŸ×qÓ:£"@B÷lÛcÃc{<Ž^Óéà’0DiÍ{ŽÎÎYûؤÜ·JŠøæ¨rF`¾¸˜êd åU±Ò+¤C7a†ç áŸªø2yÐ •²É°IÙÌ„ uÆØ\kHo”AÂ8{š®šÞEëéȸÏ[¯-eê4Ï„•+ñcV2Тsí<±OFÿœ¨@àœ¾6 0(Y‡>®œtÈt:J":÷’É-B¹¼ôË›ü=†Nî¾kz‘¤aî®ñ,©µz%LÇZƒ×ª2ùº˜n(ÅÄAFßb¹@:±¸2ª¯{Y˜ÌÁ—ZTñb­1ËÍ¥ Ey_¦N•óý,¥ÇI"ñÜý%Æ ÛŸu `a¾-YΠšÊhxÜd‘ÓÂK§¼r×:’ŸÈWn¡uã )©nT¡€9{I¹þ0¿æÿA§w«åòÒ÷ÖŒ!ÇoÁ1\Þœ$Mú±]cx}Šû'^‡Ì`5ô¯—î^êHœé€â=;óûAq6£ X#KÄ*¥ZÉ;Îo,öLaM'S¬or1§¸à®±ðN£]ν0­g[÷V” l_¶Î3Ïêäý8mR–´Äm{Ⱥ M[[ l›<ŸKßx†<­ø9¿t~œq\yû¢©ÈTÂÐýÖFÑ7¾>|ˆælûë+E…¸¸¹Ò>Ù_Ô5µó'½?FÃÂæz ãóœf\ý&.òAf²¥â%GL¨Õ[Æ¿CÒÌ1õ+ɲgdªo¢‹+pÀSZGCE£Ìx€íöD„®Ò£_myö„î{𡡸1?ÔÙiå&Ó´gc Ò+»ØP{~'ÿ ³nè*xÀ†möÉvdC²²FèiæÍ4A¯—/š‘FëÃe¾ìyŽêæîþ%ÆÓëÖSù¬ñ¥%ŒÉÿgïÚÇq%JÝÿÿÇëÚ‹$®%Ëé$c9³=G–xP5º NeZ¬ºä¥˜1pS”ø/†Å7¿î¡gû’çü¸DŸë‡_ü{~®qÙÞéúá:L@H&j´>øÍGàzîÿÚšù-/r’~®ï2SãXu] ËÎwŠÙÿ']“ÏõmòÍ$WŸë[î^Õ6™ëL—gŽð4O ¤hÄÂ$+$B§Ð€¿ö5FÙ†P<\×>VáBÛÅÖ²ö0BAãÐ(Q,ŠSäÉúÉGºÊYtŒSö†¾¢UÀPôÄŸ+æˆ}’U´sz€©>yø2xUkP"'SºV¦•‹Ikm¿ËÖ@pÔŸñßbjfÀ»d}.ã5:ƒ"òx@ðx­ÚwOPì(¦£(HÄø6£NÕZ¹ž÷Þk½¬"TK läC2m_6i_ó¤ˆ<¨ A×Ý[–†î!„§VîÞR8ØšÚ °$ú²°Mn}Én‚6ƒƒë¨Ñ>kC•4€éËB‡ìmñüûoÌhçýß'Ý—JÄMZ3šv•Š.U›Xc•3DRÏí×§îÆ À®Ù4ýèê¯á÷ƒ§Ta}kÉ´”®P£¼ë„dïPaçëPt8ºéÃ(C(6”Ñ ¢ª ÕKY+ªJÜÐï0ŸÐœ!mí†M·sZ‡Vm%»À~ò@“ °Ïo4­ €å&ðsfÚ tužU7¼Žšc¥›=˜–ö G„Ã4%ìÅ6ÝdÛÕÐ)’¤ý7ãÂÑ~„¤'#j·…bÆŽ}üÅ/¤$Œõv˜u Œ~vÓí‹L3ÉòÎÕËq8EJúÌ9³"婉:ˆ ÑnŽ:¯àÄ-éÐ1Ñ­k5$U7FÈË©c7J 6¦6¶¢ÀÒ5y‹Áú•Ž*•Æ©ëwʆ‚ûÑp#Á5»»´’#tf? ¥(6ú«¥÷5ëF—s«wœÆNˆoM胤RÿZ'¥¯tQš$Œt Àr¡ˆÜŒÌ4™o.ê“(˜}÷•& ¼ 7­Ã1˜B”gˆÙFUai0ˆ–ã®’°Ïøª*Pÿ# ËÈœŸ½`ˆ`Í-‡U‹ Į̀Ã3a‹Äj˨[¸n‚×pKO$¶~·Xé¡låI‘"dÜ {¥yÚõË8©8F¶aŸ5Vƒ`ÀÙoPÓKªùDrÆG¬èç24i5ñÇŒÁ¹äî@ã|´¸¡äžr³P2³†Òl˜¶&Xû®ÃyûØJ·¥vkT;d$î瑡룩Ã?¶Þq0­¦·ëmº_- \¥YQ¢¨;èŽìˆ”qÖö7jø>†YÞB›îQ È~̦3‡¦¶ jÖ}[öMŽí:#ƒ¥åä?‚K@RET¤òÜZFÐ0ù”./^‘áÕ4uÃ\) ±—5vs£Z{õÁ¼MÿÒyÆï›sú!³7Qœ«RÚé[‹½Òžãò 0&ÖwXB÷Oðtj&­¨%.¹\pHF€|[Éäû;XI¾¿± ¨Î¸¨òŽ_¸àqßýey~±°:Žœæptü;T¼8õ”%ê¦ð)Û ‘Ó áºó²ðc+(cr} ftž‹Ð±Pt* ¿GÎ!†IÖÐ{‰ž;†cjc^½{0§X²®Ÿ¬žHœEOC6%`º7œüÞk¶¬Ô¤ÀòWÂy š#h°¡ 2_…¦#cncL×^ràPÍ]•Ì¿3  ˆ/'K´¥'¼ðÈ\΄ #m†5¯ï'Í(åaÇ1²Œ*¬±„Áµ "vÀ²à‡4ÀÎO·¬3X؈Ñ3ÍòšîÇó%?KM©?ŸÅýg)„iTÏ5U›¨ ³ŒŸ­¥Pfòjt.P®)JkaäïèO"˜:2úCÓ…kÄ%faÜb}^·SŽë;Þ?ýÆš4³ÕãñiÁKÁ<—Q\¦;Ô†¯—Ý÷|PŽB:aÄïkGÕ]@2Ú%ýgÎç¡[詹fÛ˜ŸÒ™M<$T$ª’;¥'w¼ˆ6]óû†B$Ö^ÍÙÇcñ¼XÝ@é¯[cžï_¬ÄÙöµwèÿ4Òy÷¥¼dÖY)uÎK<Ñ>Wzý½nBxÅܬÆLo¼è tO™lïé߆„óŸüêùo bk´]Ö}µJ¿ŒFØëZÿ¤Y&XE«Ž§~àPL¢Ò™ \ ç.¼.BʆœìÏ¢ìÐ?ÖPÍm^?öÿ"Iy$ .Ò+­®!ÐdÒÚª·´2á£Àžq¤V¨ÉÏ¥‘´?Ù~þ`û³mµ€—x‚W›3Á¤–þQ¾›g6OévpÙ´Yo:¬žbEà æ÷›©óÆg“ß{ñëmòçú\Ÿës}®oxmÛ–†ª<êùß}R~®ß¼ì?K÷§^Až¶îC“ò¹~á®øPýöˆ½J<N)$¹;‡¤KLXÆD¸Q³[IàqÖÒÑ>SþúßNŸZ8PÔ ‰—n±Ö\à­”%¤„ò²B *:Çôñ$‹9'JÒÂîæ5f´4` ô gŒ‰‡¯ý¶()† ”9þ&KKÿ•µIå²jqª÷Wè¸)ܱëI ÁDùÐz<ÕhºFÄQ$ôÐð>£nGDB‡€­à¡?£#ªé7ðPô&ŠÍ` Õ¾ʺ*[ÿÜkh$7úõl ]#ÀáYr˜9 vnŸž9„JOV‹GøMQkðÉÔuŸ5ÄÔyxÚjâÞWGv©­f°LÑæ^É£º–;‹âÚÓY¦öpªp§øÙ6l¶í”ó׋q1&ŸžéIQE;…Áþdn˜R†¤ë¶à ƒEõ{‚Ne¡–8ªõf”\bú•05´x/­–¯bÝŒmŸ¦’º^_À +VTóËþ_Oõ¢Íö®,鹇ZRg›|}N¢qÒl±ðßYÃ(LÙ¥V¼/$¦}­YQkKK#ŸV˶úR[û,)h aÀí#“ds³éW÷žî¦Ã¶N¥ú¹P°,Æ’¤K¦̰à¨;ŸM_^p|–‡9=IÝ(CÊÊ ÉDg_“ñ©¯ÆëÐN%Scyx€Cp¡ÓJz®ºl3ñÌi"Š·Ñ­.ë/š"2{6ÒÒ»+<\| ò(§ðßuÃÖeÒÝ."”ú%YŠ« ½;‡¾ÑNû7T–Í“msc0;˜›Äáøàvzô["&¨™²B•PIkÖ¼&½¨xuìN8× Úa…ö=tøû©QÊ£²ÄJR¦íë»ÏLtÉ P¼ÌÉýq•}œ¼c1çN žÆê±° Šú‡¶<§«=½P•´©-fa²2€ë…ñTncù-zÅjz™œîƒGkIýtˆ¨ 7>õyq¼#™ÄÊEI3l/áa—Žž±r 5m…C¯ô·ýÈŠvêIw–ÌobÐrĆIƒÏž+ýF(:ÌÖ@?Ee)|tÜ‹[âp3ìðÞµ£.£FÁÝïœÒ+m¦Qö9ÙûmÏc¹Ý6žà¦#FÙ QœM†÷¿C:-x)n†3­!ðô©è' ʧ•×>lˆý±êè„ŵ‘DÔ<…Öoï&œ4$^±lR2Hä¡Ú8N!6“)ÝèLùøà«™—Áì:×:ɃM]Rý¾ e„ ÂC£œ1Ìk¯ëLýë;~M§"45€Òv¸æ–á»8Òóö7[in tÈœ?Ò˜CƒOB¦46”§D1ÓÎÉTÛ®o×ìJÅ f5‰ o¦ãïÐt}Ú·kÊÑÛ¶?ÛŸ¿ÏÜ “û˜;ÀYæÇ•h\# Ê »X ®èó2éY¨×(¬Þ׸bøÃ ´ÎXr]‹Ó)Î÷€U7 ILÞ½AÏ\2 м¼'m|›Œ¹iS 6kævˆŽ <ž§=æþÄÔdð9ʸgš©ZÔ‘Áý†ˆ “5ÄÚãZqö“Û.l ÂŒègï`µûpL•ú#䩤¯Ê¦TƒþNŸA‰û] íf}K ž¿'#¨‘$~ýÎB)³÷\ñÚ)Y©!@QA•bs0ŸgQÑ­&Ç—:>bE`š€"Èü&¥ðaÎùdÛ)'õÌÄLRq~î uO ¸Qßœ‡%,úwöD§n\`òð„Ê r¤ëljÑZŽ#v¼N<†¡Ë¤èð¥ 惫:*ÀÔà‹A£õ¤’ïêà¿Cã˜B*Kýº” E¾Vˆ²¦Œ¡Ä€ÕìŸqXmhßkJGPå6V€×c°>ñ·² Ñ&K쀋ê˜ÆvÜÊaäÈÍ@”Tù¥¯SXªî™ï@s…^ÊŒ`"ÁÓSF£N*c¨e2¦ø4i ŘÏÅ=Ft8[“ÕzŽ+¹]ú1'Õå™8’ÏÇ8Mm_´ƒ(³vÝÓùº"*\sj‰n_Ñ%–Ò:i¥1cN-±¶°ŠÎ:„ÐBYz·B„ Ù.PBJ¢£<£_dÎoocJ'<~_IñN ¶zöÇ<ÝW±Ž2b"жÂzè á¤Bâ"—NtóŒ*]Jo:Ô [Å’¦ðu9¦1âj¬z…ÿé¼L¶!tlñRü¦ÍŽÜkð‹ºË»$Í«€Ã<ÓÉo™Dǹ‹¿ò¹.cáòŸczˆ°*ª£Š›üjMÑL VGѹçOѲ0Ä=HCSC5¨`…ï7ÉZk,\¨“¦ÓD*€ÇÐõZŽÝ”jªàÂÀ0A•m%m™TÝÁz« ÜÍçÿérnÛ¶—ÿo‚$›"ð% յޗÍÙ5(ì^ÀؘUG –C[ž|½y×ɹ]$³þPð]ˆF~ݰaÁöÓcûë=§/¤äüØ6цJü¿;çC»I˜jÖ-òÿ˜°âC­à¼úYøõ#öÿEêüÛÏšw~Åû㋯Ÿð³Í|5y÷ÿ\¿Ô†bU?çs}®ÿŽ“ãã/lïl;™ £T×uË쩌p¨‹íÉœt2—)$¤wldœÙ‹LŒ_hkÿgÉ8ÐcMO‘4€)‘¾lõóþ (%Ä Â=]94TÇdd…{/Þ‹‡aêUGbTB9Ùª²5ÍK2“ßR‡ ”)"¶˜¶ šMFª•æqoô<Ê*wÊŠQ¦ØÿwÓü|†Mø¿½F‰ÜÒUwáQJþ»î³š—½šcXâˆVè[F} õ̪ބÎdš`J¬9:˜¦o×h+óA{}3ŽšàN‘+zŒG¯xž¬OÍßmö±Ëô½±Uðâc0¢ä3ÒúFÝí\w‹"°ý$Ö€ÉÖÓO5j–%”V&ûЀ[¾„XLuU軥ÕÁLÐýøéxr‚ßi$áê8`˜ÅÁ[öt‰`T¦P[SÕÅ“"6â  ¨Š“ý4€Ñ­ “¿Ô·&%¹TÏ ª @úðI.òPëÁÍ*ŒÅ0U-):Ô Ö¹È¨ÕE[j|t¬…¦çÈ ì”éó9ž.½ž–¹€Ž§!üô)q—>Þ™»ÕѼj¼¹ˆpHäØ[E&–Ú2§"jE?:£œóz¡sêÈyÚ­¢ÆÌWŠ%ǧ… “ʶÃÉu2]['<Ø™ʶL,…Ù"žT¦2JK‰‘×Ï%ÛSÏ(×>6öAvÜû·` %<ð¥õþ3%[Åÿ#¥[=Æ<–ø]³!§`ÇI[/<«…y ¨”EÓΩÅmòÖ¨{\N³5i5‘–N-ߢb‘“‚Rú@Öë “7åäÁ\ǘàN çóæ‰örç€<ÏÌ¡+€#ÿLU‰ìÊxg­¾àוiÇ‘5ý<>PaÂAˆªOÅ ¹¹˜ZÊÊÙ€ÑvT»óCMù !Ñ%1‡^§þĪühÛ y•†I“Mƒ b«t¤PŸû«]L¬¶Òª³¢¨Ç&®¨.šv8‹RÁ ‡÷¡A8þ·qñ¥úõÑ1«œ6Œ|åát•ÕÅþÿMÒù¯¸ð²ÏžPÆs%¤J }5×üW’°@³SUÔW+ÃØ+—ÿ&Øüº3˜ÔÑp§ö­âÔH6D]C¬¬’q³Vóæ[³DqDøN­gÁ»¦ˆæ›†««Î'ïlr›È£-'çd’=»:ED6Ì“ºÊ‡6ÑHp,¬¬?  ¶u¶(NÚ¾-aˆK؃vEâ¼uRô:¨×wé¨hˆ&„ ˜nm3 ´4ñÆsQÏÀgfí)ˆÐÉ…Z†ƒÏï €mÛ¶?·íñzŸ$IF$:çcÏzÁ­82·daV\3'Au=WÐ~t J¥¡G•Ï£(ž&ýî†I«Æ8àÔ„¥àÈ !ƒÔ˜=BßkÃöF—‰mfGÏê° bU¢gtL5¯wÑ2a0aìèß wT8URŽ=_“ç€ô6jmFt*pôÒÀH~d3K3GqE;ãe“¯±³g©”l7àýZó@Mžý ‹É ½¢±[û”=´°}Ï‘ùS€æÓ“—“å$-ßÕëÒóL"ñŽOVr$¬Ò¬I9L!GÓk'ö¬…¨ŽE÷,˜;‹Tâ~j[ ŽüS=X£&¸«Fp‚ —­æuÀ1Žï pá*×µ;ë{¸\ß {å‚}ñ$ÄO#D5Ð^ÓjV£±†K'íû@Ÿk1½sfa+%šj^Œ4‘¹g†tZ‡«Œší'i?Ùµªw¤Ùs02”vÑkηPrV*3î´%á}ðä°Õ!·ªý'Î8©Ã-ég¡ÁÝ4Tè\óù+CD°mB>û°aÛUÿì@‡sDͱ~—u#¯¬¸´ªètcíºÔLþW×5Õ0ÏÎâž\;'t¹N£Öw„£²ö5;C”Y5WÂÍD#üwVõê£LèSÍöŽ¥¯×_zÚ°ŒSüΣòB??nZ2ç¿–wŽJÂvù–ø‰mÝç©ßðÝžÅì S¼þ¥·*'òŸíˆ×©HÒb…¯ï+ÿ¦$ßõ(YAP9Lï³½`íXŸ,†õå&¾lQ*!Ø Z§œé™Ëë´î“Enž3+]ZUâìãä ‹ö³É™ƒÈ‰t±À‘¢-±c†d ö2˜G­ôÁ}•S\‚5¬ûÝÈ£QÆHؽþžÖ‹7€IG(Ã…ÐwU½¨èj?þ<ýìübe\©wÂá³q´LæhœÅ¦Ú¶~é•'ŽàÑèx8šŠÔ—ÖóDÖ{Þ‘ã­W´Œ¯¦ò  õ›Ì¥6g-#ÜÀ‰êÑ:V‘žè2•ªˆëä°B?¢!4§bÐàãýÓzð¾eM $qœ©Jý®m“¼÷‘¼f!¯yï‘HíœJ^‘ÉŸVNÊoRáºî¸t\¸RÉÚÍô uÇÏ·W›øž¤ó/úéGŸÃ$šŸ/˜ ¢»;zÆ]·¿¬Å“i€û=µ…óQ÷± ®-;U³ÆoùËyêO©í³úµÚ©ýNrÎÑF:tÁ E5¶­ ä<äQ¤^‰âzÞ-?€‚p>‡²«Ú¨xòÔzGÆqoݧ®:É‹–¦÷Ij¸7H.l›:Oì=#Låa#7B`kÄF¨'|Rá+ôôìÖšW.#@rïþz ír4o¨eˆ™à€àhÜ)q¨F88_4175oƘöGÞ ðkÚj[* ¤ö+Ï0zP<ÄíôÞÎ6Ò°zô(žþÆ–SÇxãZyˆˆà4Æÿ:´º˜‡²>4cïû[µ«Ö ktïu,@’»$V«ûÈjŸ*(³aáa‡»©ôWAå]v2(e†‡³åøïÏ`Yö¼¡éGõ¶‡£•C4é$t1­­ÛÜ–n¥V/Ú©"jõjûÑHƒÈuSmóæ"CWꚉÀÔ÷4ÌT©E¢ŽT’üÂ"rȨ`böµFmñ)¼o¬¯¼¬¡n¶0×Ë%½ìó“¾-I}¸P4Æzñm7kHôÚ̬Ml¥~žþ<‡³D“«ƒCo ’CÎUÏ4F¡â¤í½'ô™Õ´jL;àBÀgü]3JtT:=#©ª[݆2á$bLè1A8lf á)’2†<ðËxªÌ ‹®(¦V[3ãBÿþˆ:’È$ˆ!Kãvz…ºÄ•ˆÖH_a3¾ÜezG§”2‰ÐQMKûùR¼A*å8æ\F¯ ³nK9*ÿ‚ù¨ÌŠ føzº¡Äº2‡4KT7߇8Bh4ÒWK”Ê×)ds>øRºz:2WHq´ö…Ò Þ” ƒw·‚(ÙîbémÚXÉ:BڙЌÏ¸ù•s Yœœš²„Ðÿd•ºßŒq…t¨T¹Ï}W2ùa: _Ó°JЋUã×Sôœ!¯põV. 5¡Zª¸®ºÓÙ»µ&ý*©¼™„ƒž”Œó½u†©7¿˜­q¼{_ñeCÖBÑ ¥€Ä(vR;¼; 8·$Ú]¯½O™nëâ4¨3Z“uqxñA NIì(MNÔÀSÖ,žS9€4/5×Ûð`w&6³­R`è–Z¬‚é«Nâ Ñ`¨]ÒöЉC×Òn‡êBŒ¦áþò–Né'žGÙ7õi`‘u>zÿÒù,•ëV5"ê›58æ–á´äy„eîSƒËpè­)£ðë;>×çz}Í¥Z õ³ú¿ÙÊŸç€QÄß:p}tE[DZf˜ú•ÀmA«N*Ql \?"a:©]ç&9â9#*QÕ ê<Ñ„MãÊ”G#6¢S¨°°¾*Þ6áMUÑ<2Òˆþ·mÛ¶?þ<`¯:§(m9ž>ú–\Ö6CÉÑôLñ¬÷IK¾-Zz_&üÈGQâ67ó£g ‘ Õ)΄6÷` k?bÆ$$ÖmTÀ› R|Û½s1ˆoBU.b1i€ã‘¢à,ª£°ƒ€›^к{ïÀÒªcÑ€µ0ЇQ‘:=9o!ê9°Ü«6ɦ‡ýÇ'¾°~²Çêç ÷U#·n*ð;ò4ðaÒpûvv÷;’οÕ9ì`Æ]ó_¾þ. >7¶Îê⚨•/˜¨–AóŠst ”¡ªçN@ NP™J>mÁÃõ ¯¢ÂÓ­ç4Õ §ýúºhž‹ "ŒºHþako!V·ò,üöZböæfÑž ¤Ž}[7žï5×=MQçYбëN…¡á;ÄaÛ7àCFI35¶NEdjN“Ôþ¨ùØUiœ!å š¨¦•§ë ‹©êB؊ƶ§à/6ÝðØ;&ºò)±ÖÎÂS¦ž ÜI©ŒÜ|ÏË©La|{e°Æ•p" NôbøŽ{¿TH{Vž “L˜xjÏL9XJCùÿŠLÊLê•êNënRç¯M˜óp¤N MöÈŠàúÉÀÔœÚÆOêÇ7ÌMÓ^~Æç) ‰ÅQYß¼7zéYËS1f6ºÁÏ£Â_ÜXøfÆ/×p3ãýdSòÄ3-ày@W”±6Þ9 ëðÁâ¾Æ—@ÌlÝWñ¤ ®J~“ýÊ« ÔÂ@Tt¯c¢cßøÔýQ¿(euÀå!]uêÀ®æj^àÖN~ÓM,§’Dò‘){ï˜ Kº(¼D™'E:xæHÖº6ñB jGê_r%ÃŽ¢gÍr ô7/Qg‚j}Gß3ô`ÈïĆނˆ -ˆÁ»ýŸ»k9Š~XIS¦áFq‰ÿxÉù¿>”Æ4nï8O#ÍšPBb˜°¥Ýƒƒí‚ ­Q(O%ue`Àä/œQ„-ÏVd ›WI´Þóg1]=œÂ‰¹5zgVäøE∎%NS&„#'ñ´Š-¨&˜§,ÇŒs©úÓ³ÖŸ‚ƒµ;µ¤–PCÈg>h¶V˜oh<ô7²Û»À»´¼¦œ‚¹ËâáÀß'áO?5ej«“ßú±¨Ö´AOÙä+Š÷ý\&YsOk9Ó$ …‡’eÌ0z°<0{›;LËWì›Åòú'îfCÞ½MjF)hR¯ÞX½mÛŸí©ô»a£¨¦ðà¿ôf+£-µ3x—Œ]¯VbSôe$ sÏfÉéÈTc^&áÑçØŽÔä1OÕòºµ^si”T)–ãYixxf8ú…æm’ë…¤ÃsÙhSF¢…ly(CÒV-u1§ó§ ÁŸ^$mµÂÅ ÝÓ¹ùªIñ- ×Ô­Ÿô’+¤Ê[Ãqae!ƨÀ¢ïÃ¥[а‡3}n3[‹Ô¿ÜÓu„·t¿ M©¥3}„C§f°%ÍËdµâ?ì¹_=ú½vÏKê-T¢0Õlœ=ýÙ3QÚd PÂ%QÓ¡“¾xœY—¾Ùß‚†´Œj#nƒO×Ìæ°Î"ç¿X©×«y¸ìYDÿÓº§ŒtQ“J™{i”åÈ 9On² -å‡ÙÞd×›J€Z òtsPêóÎéÍhwY‰i½Ç_á(8ÀÂ+ǼçÞÚ˜ˆÅÊí+øiètgdáfvbe”˜EÚÃzû'‡eÉTƈâ8ëèÍ^F¤êˆàÕPåJ?пÁ©Ã]˜ŠzÈÚÉW@ºç§ç YÓôš+’í‚ ÐaÞÎrñ¤8І¨è+‰q¬³E õ9¢êwx:9=.2°½®|˜€Dƒ¤²qBhˆ–ô®l×Í¥@Œ”N„%a„7-4·…ƒ â€HZ5Oo=&ñ­%<)‰GæOŠÔëºEñ"Š¢r+$âtS^~IlÙˆéè’ ¢JRÜÎᡊÔ+‡Õ*Ê’‰ž›*£lÞÓpµ\qÒÞîhôCÚµ!NIºwØ0G÷n+Â(°*:j%óZvZ9o¼H1Ñy@“:„Äh0¶°àÁÖ’®ü·_ ŽÆô 5=ABߨœ§Æýsµö‰µ<“ Ó¿î5!ú1g¨©”uH! `»©Ì2ÞÝkf$H˜åá‰Hû8Ç+ñ"*V´ ›Q5 ¥ù‚ÿ éü©$Ë‚o>¿“„jÒ³ wz‘ é‹ó$gZ±*etQ°¿§ëïÙ[ _¡Bìô¿yqßíxçMåõ¡íl‰#¤*wÁNΓ.O¨áÃ1GÄl6 ¶Ô1 8¢–ê¡‹²‡NúÙrZ—çí7#ìëâ^VÒн›d÷[;x¦ÜF± •†÷1¿"º¤3¨Òëj˜i€a÷$€ Ûö÷ÏŸ?hÔÿäƒ9Ιtó¼–«Í*O™^¦ÚÚu<ø×! ÀÞË„×B-´å†„ :£†ò,8WŽ) ˆ§Îaí­u¤_ q {æ™ {’˜£‰öHnÇê[e#„*Ó+êç™[fy+ýŽpéy\z!«‡wÒ#^YW>H%Ëg!ªVIåd‡£õ÷U\ËEŸ“ŵE؃&òj ã<#ú¯06FäŸVƒ^èˆ×ÌÝû™µyî}¬þÿuï¿Ù¶8 êž~‰¡ûÈ4½…£„‰µ¸§Ø®º[Æ þ/;X®¢Ìû]gå,qúPÙDÐ׸Aþlø}r×ðÕÁç±^·áË›øœk¸£€ªå Õm_b:ɳIßE3ÃTØŸ[8±÷=&"—ˆ†;ŒfL7E¸íœ|6+´#NÅbFg:9æ6Bṳ€èBÙ"w9-Ç×±± ]«a(ÒŠ ÔûyºB®AùïB ™`…̒ɺ ” ¿ÁÓ¾Æ6±€KÏ4‘Àêð“g͸yšOÀ;&òÃÿ3®¿6$ÈÙÍÊíªyGîZ$ºBñ†”£*›ÅuìaåûÁ.m+HFJsŸ÷ï ÈÆí2yLj¹NŸ<$/ÆÑéF<`{”ä!í»÷›?&eäŠ~S%iÆ„ˆÉwšÒJ’ÇŽó³¨lÿÁ.H4èdH§»§Qíp­‘Wý­¡ÁÎ_×I}²xÅDhêD[ÏØ*ž4?l-×/À¶mÛ¶aûƒæ2Y¹¼OK±_oKHrˆÉ¤`iù`‰ên¤>˜F*1 Dƪ\ ¯ÇÜH¨Þ5sÆ©ù˜ÆTÝG\·¢ÁŸR¥¾è2ýßåÙáœí×FßÛ›áêë›Z¨‡‰“Žý§×ݬP?È õ™¿ Š2ÈŸës­‡w ®Ç+û¬B×$>«õ¢ñGþw¼ÍËŸNòÀÎÞ€|ÛÀ{"¼™îª‰$ì;¼˜ÿÀiøc@™Öuk ˆø·vsõ§§5øo÷§C¥¶® Nœ^gTµ÷¤ÈÝðMãóŒ·.o Þ°} 9Ù5‘Þõ¯$>×wó‘ɯEØèÙ{ÒX;ˆ&] f‚DaÌ ·T= $Vý¯x¾³ÎÔàK¨óGytîÛΘ"Urøl†A a CÄò)AÔ^’BCŽó+ÔÜig»5⨆ôLnÊ2Þ”áþˆãÚH ŠÖÖ{lðùÜ‘4:²u 1³‚Xµ‚ö¿êî ÛVh„UQÿ”1IÛágÀ…r^ñ³0Iq<Äyª“ z[õÞn«§ šâDOjÒB_¤s’Èg]n“¿?J.Vâ…œ!þwU)ÈAÓë……Máúpæ—'äpÕJ±ÑÙxŽ÷Jz¨<—MÜÊ13(†Ör½F‰½g¢Bö+–'2á2‹tž1šúJ{¨'¸)ºÍ¤©ãØT:T53÷sÕ‰K¾µÁJœp‚­¹LÓÈ.{¿°žF Î;ÿ››,¾ó—%þn#úשJǮ˞ëÀÕ÷ä²`ê~4öz„ÚpF.E RC޶ཹâ Å@Ó.ï<„Â$×ãAõ`Ï¢Ûy°÷dT¡æefÞkö»‘Ñöî©¶¦"CÆ-p@•k "ÎÀ ~v`lÛŸ?þ>yW{¾ªçB˜àï<ܩհwvYÒ™sËÂí.ZË‚<ÉšSO”„*kÚ¡`«ÜVì×jßæˆž<±½k€e¶&a=±ÄR§Om2_¯»ð9`CþCBc*›“Ö/A—bÙ@ <ô2\š:§‰bäKénÒ*ÆYkÉ ¹›XÊ£ì¬`îd7IÙBÜṈ D.ˆ¬aC­ÿ—ÉðFôÿ˜Ã ÅláëË9yÄ›èrâ†ùb%ž\|®ü ‚e³Š¢Ò¦Š‚ÍXB%¢eK–ò:QÿC³¿oâr«#…Z*þe’2—Xt$Ô ^q€TOÌsöGŸìˆ!ßB¯Juß·7¹´ +Ù3–7õ}0ù8/ ×âoÅ/ò¿Úaááû¦zв°bÙÀÙþêLˆF°ëTJ—äé=ˆWæoúÃçžPxÅÿÓ –_­j‰ô.z1RšrˆÕ\ ¢Ú˜i@fIñ¦S}˜È¯jÍQ‹ÇÉt7Qb±"þ•lyÎhxsŠ&Ëá¹ÚÅ€ÕJ,C½a0±ª¶8Lf“¡»% Â…M0ñ°Œ¤UWê«Ã†W4¶½`¨Í„Aþû>Ú¶û#û0U¹f¾Ža®ôà3ª ñu* •é±È“”\“5ÿèÿ¡ÙÔýéêîGë@—B Øðg×ûݶÖ0rÈRôV.Ä«¼ Sb`±áB²ø}Cj¶Ebó «Ýò/¸:8ú«ýüN¡¼úÖ–’?éa?×çú\Ÿës}aDô¹>äçú²À»_úÿöH}!»©±åKÜkø^ì*ÿˆ@3a[%ó²UKÔŸës}®ãcE;á³M>»Ú¨¹PèiÃR•‘åº5£_¾æˆùABlJ¡q‡ÿöî1dUʦ2“ÑÕÅT8Ý$¥ÊÀ%¢ ¨§’öí™×Ú$詘vÆô0((î„$O\£eO\õRpK=jP†ÞºH¢Ú8ߟ!­>žœ  ̎¥< S: xS]ëÚ5ƒ}v+G©7ˆ= øÔF…ÿ;$¾É@Ñ©ÑúÎÎò`ï2óÚ³¦ñçþ”øÝëÚ¶REvçöÁN¾îFZa£Ú‚;3 :Ó9z=|›6ôr%ͦ<öþSQUÚš#†Ä'°÷D`ëçy¾ Æ5)|:qQ6n%üÙ¶mû³ýù³šÞ;ñ‘jKg“¿„£ƒ`½Ò*בÎ$‹Ð`$ü\1… â†Q|(éz] {)¼ù$‡&Þè&ñæk´]jÚ…_è=˜Ã Q³!*VõBº­Û§|šÛÂоjqGˆj÷µÖG"¯Â¨°Ž÷X±–£îí?gÕçPZ¤ü7ǧŸÙFi=pP ¡j‡¨jÎT€·úýŠzéí¶Áˆ0Ãß+”ÊbšµœµîO¦g(®$ãË„ÖíN¨º¯ef¥Ñð¬zyrø‘+¼UÂ,bt¶¡ÏncXd¨…hKç?,CXÁƆu¹5–Ãx¬À‹€d~b°_5ÓΤޅÌ,1y<@ÙX A^ÿñþ†_/lפö>éˆQZJYöóP—܇AáápH؇2Ñƪí¤Ô4¶L¹‘Aîafëüévfr=¼ˆèpÁ‰.BwJÚ/‚™¥*9&õ$¾ÂQ²*Ýø±ˆ¶ª«­ë|5{ ɤ©žÔ;6²ðVtñ#!ú¨uµ23¯’¹ÐÖaþþ‡µÀ×àQ]c¨Šz›¡nîï)öoÏÒ[à¹sÉÓ¾°Ä—ÒX3àÌiõ*B[C­>–ÒVL-£êu¬Ke9½áŒ&Â+™ŸŽÖ4Pž Ù 'ù,g<òâxxc[ÃKÝE$IŸAÁÖµg!R"{×QSu™a1 *aÛNÑ›ŸrIêøÏÊ6÷ .PœFŠ› {‡lk§ï<ÀŠ,ºã±Åày‹!ç\šçŒÉQãÎyëCô|cVwó/È"ŒA\MÁg©÷IhÒ(™öÀ6Ôsm&GtðpÂHÒâ‡cw+lÏxÞÁ¶hhÚ®ÿéüÑ':¤ƒE¿¼ ˜ÊPÿ!º"èÌã‚ïÅéÐ+ºx$£[ÎOU¯R®SÒ Sázä! -¥^Æõüä_ öä‰xñk¿k¥×ö»¦«P¤yV³Þ©ÿyØCÃq€ÎGõ‘¾ 5°VyADv’ŸÖ%@/(J‘ýXvdþé ðñðxDç÷ßÄÐÂsHcŠÆƒÝ(Uºìoµhž__ÕÐ[–ä™nï– ©©ç÷¢ţѼPƒpø>Éæ‘ìÄ?þîCÔèÃAN. jÀ†C`Ú·Ï /¡‡™ü¥i7ýín©Àœ1Vè‚j0G5½ *¢$.ÔÜ ]Ž#¦ d—LÍì‰xl!‰Öî ®B¾M:½ˆbج$f'9ª5·b.¡´LAÁˆ„&„Þ› o’ªß,ÿZK0⑃,ÛQ6+•¨ô)okò\†Âœ* :¾SO’”*?¯é•CÔ=ƒËCøÎˆ³Ó§èŽOA×ûÏ©¥‘L ?ŠsxÂEO=Õ•ðã.Äœ”¬7ûh‹å°ðëÚpÙRÉ:V-”ÀC °#†°ÄÓ9X7†d‹Ë?×.šC'Cvæ(0¸€œB-‰̼[”ó¯ÖÐ éÀ0ÇÒ&9S]KÇqp'vkŽù69 LLQÑÔ( rÅq+©²3‡”ÌÄy ýW7Ã|ö+”>Ûs·›ïŽ (×U.kDóÝšªëj˜nZg…05VËŠCç'¸a)2‘ñSkt’¸|JÃÒ§­:šÀ ¡"#Zb$–Ä;%™L…[ÏRªSyGÏ8þ³ÚícÆüÅ£µÈ8¡EŸ¤Ùa†Œ‰f°ÎI7»ÙÚˆgú‰rwÃì‹`‡èÇõ8@×ZPrÂÑÑ=ß)‰™B¦¤ÂN-Ó`Lže–βʬÎãÊYË#3W ŒÑ!«#4¸3àeã÷‘Îc"µ¸‘”?m¨ª*Ã2ž¤•óšØˆçÐÞiÀw¼N=ä_ù\?îªÏó`qR‡}é!úï£R“%Åܱ¨»Ëþt0JB¥]Ñ~x[dæÊkÖØœ¬·Õ¯”X¥°“ÚQÒà5·|À S-nQÂá>6¹·vKÈ~ŽQÆþÿ³mÛüÙF= ¹‚þ\° œæ¶Ûéˆß2TæŽ{ÚC/Dq{0…ït ðšyÃù#ä·ò+^ûsý²cõ—~åçú\÷-ÞÞiù¡Rx÷PkIËÏõ¹>ײCJòGÒB¿ƒè­6„ÿ.ÚÍã ¸XòºþµEý°•®ßëµ|wo¥R%4Æ!k¤äkòšÐ]·!¦Ö²¥cVôÞþŽ€ú_Š—|I«z•ðˆ¡Øq¡-“…‚¥)$Y´ÒIWÊNùITœÝƒj:DÊqfrï>ËÀa¢sÇ^çu})Wˆ¢ÜåŸÅ$%ƒUžy—~—qKäaZs^CæÑ›o±{^ O–š&<ע؟M5!RSÒìL?.ƒl”Ë{ÀNë*F !»Â»p{¦(Cjö™Z$=‘ºÇ“m‡`õõ‰Â$p`ü>'¶,C» Cûìv‡wÕó¾EF2 7Å>©Ï)5ë?ðdþÁì“Ö+ž N6=±7;è÷Ë[PÔ;¥˜û±×ùG†ý ©D-úËžb²p¯åÖ¡§‹ ÂÎt1Ùl«Î§ÅÀ™²$"{ZÏßXv—„&¿­ÙæÐzÍŠÑJª^èI–a!™VS[~4ÙËZÚ‹ÛÍT”XÄ:ÓŠ5ë— ÿý47ƒßŽ»JýZÝ©ÀCÏ=[ä¨_A¯rmÉF‹ óq’!"Í„cævM¢_ªô©7–ÅåHe^Tàqåa“I¢)a#-D¡ª´M6T¼¿•ºânô'õ3ÕI}/ÌÁ°ùÏD°zA…UT±“(U›üöC9ŒçÎ’á za+þ?pŒ=X︞¾TvØŠOrâÄÆ´ÎœÖÞô¯›t3ûèHK_šÖÎíÙ%š1çœÝu˜ïš±Yw¶éÛhdGǺ‚/Êßõ¡ÎBGë^Ž-ÉÉáptÀ™ÑsÀk*µº¶JÑ ýpF¦0£t8±=Ò׌DI²¢VyäBàô,}‹ýäaψ²¼Ë”ÜàÄ>²Åòq[Ñ€rÿޝhÜ—êÚØy¬ôôú3óª :»&{H?¿6Ù%MFªSE”ö ƒæ(åo™ûl¼I;²h‘aBsçiUù?ðÂÄ1ž ‡+Ä•JVþ=™wÅ#¶®:bì׬dØuñ'O®é%>l@Lîù¨þHç³×Œ%¦ÈýóKk9wÉÑ `ÆÊ5 ¸ˆ*¢ÿÊœx¼™…Q]bó ¯jÙ›è4kã€~ r’Ñ•%Igù÷`¬qr³.v2ÝãCjßžB˜"öù™ºl¤ó€3âAE™î8ÎÛÇõ7v+\hLã‹êx[ÇmEü0&ý@˜ô ;J‹& »ùв¼{ŒÒ+{6¢Õ“ç˜Ãs÷ã/ñ'2íXW¢3= qí:`j d›"°É¶mÛŸ¿Û¶[˜Ñ=€„³¹ÜTiRÔgZÞ&k6ŒRÐýt£a6‘¿sëíÀv­fKů ¤ö·šÅ‚ˆüaÛÁéÄJ½á¤íÔ —Ï1úqM9Üñ… ÖdAÚå½5’Ï|j¿ø­rÒýh…c4ä óŽÍëö<)Α14ôÒ„o»%gÑ|â€åcSSE1Kia\åŠÕp¨]Gˆû‚YÖLÂa†TaâÆ€ûkÇû4Ð`Èž›ŸÄÿÝH/Ô •X#²K?È\ˆ ØW"NÀTÅõ¬e÷òϘÚÔ©÷‰´˜b!$ ’(bA~T@ÌdŽ˜} Þé2êq-“|ï~™±b†5>ažz©×œ$kkÎ,|JR_HàrdÌCG¼ž ³¢ð2ÊÅ`|R¸!–¤¹Y@&¤Ìƒ EõJ²9oª÷øT$}ÇU°ºC'ƒg÷ü³_"N 53ô¹4 4r5®Èî0 k³KmAk»¹‹IS ’1ŸÀÑH)• J¡ü—­ÉtW¬8áNͦ¦Qk½öÌe ÒóQ²ü_2 À|¯»_™¤ "CU¤¹t¸d޶ËI°6Ñ. ‘,!|áWCÖ¼ŠfòÆ£¯:«špNÚ%p« ~Õ5´4Kt¤ËÛ%»Sþúî;;§bž÷íFÆ­º”—Iï&Ú®wG²‡X ª¼1Ö€¯b¿¡3pù ?ùƒž †#–½Kó3ÀÖÃQ iÆylö`ywk—jÆÃ¹³!)ô‡“ŠŽÐîÒ€ë1‰ò¯kÒ4_ ¦ïXp<2Ëtê¯Òêmƒv^Ý23xþi¯Ú•“À´a²ÉS” 'Â*í.Íò×Xµ©½ã‡oå]xOnþwÓ|Á>|®hÎ'„Ê?k*™Æ´Æ÷™ùû­™&·.(€xƒ7¡¼õûÖ̯e·à¹yüãðRà ïÛËm½ úc†ŽFéCD£¯ÉðbCòWAœRGˆY‹ÆÛ‚µÊ¿;Û%AàwÉŸ´}Šœ;£•ßM:ÿ}ÂÏ–ŒZã :‚ÍFõ¯@ßÑËÔ 9Ø `ö"n R…ïÝžNÔåÈè:¨ª¹Ï՚)Bóo¼½µ*»%ŸT·ªDn»hÄèÍ>ïópt]x°õº4ËåÿôsþtÑcl¶­× <œÔ“S:è!A^Õ*÷oØùf£pÔ ‡œTªÃ„R¯âf«ö4UŽ¥Ÿ(q*3Û’v3SImM))ÒÂöåqú)$–L«%ó(NŰc8üä¨êxyQ)±x/xWT„98nv»„ƒpv‰× >@ N"‡ÑNð|à9W4‘îuî¢r Tg¦r‚Ññ¸uÁÚÜïbæ­Uo|ÆZý5“3‰Ì^ Ö’|ó³)"®lïÕè‘ëdìhæ¥-’ÖpÄ« vƒ±R—=®o¾o޾¬¡ÜÃ, ê1Ë@j$+ój½µëV&U[½ Q"Þ {Ýœ:Bá*ÝùbeE£)xaÌ× ÿ§F; ÑQåkx2Š¥I@ö»°ì:µÏƒñ¼°N¿uÑ "¡V×½)&…rÓeg9ˆîÞž®DŸ|…1'(éÑýcP*t]»­kõ ½-ÒUöW¹•:Éê +cXÅîÄa+GÁ.Ußs¶\/l ™d–¼9ñÕ‰ƒ#xÞ™wƒ‹NÖàÁY3åIMñ~ód¼bs@“›ÿ"ÒùSßøRáýeH‰DÕ¢Jà—‚nñÄã±0¼âÚ#:ŠGfU¸ŽíÇzl–\;;È;Z³Š‡ý«™ÿ ¿ô…ã¼¹¤X™ÙµAÔüÜD9Ë&ŚʆÄO¾ÐÒóf|˜Bf„·-h3˜Ú>ƒ¼¸Q'AH¡Êæ cÚøíÜ{^æ^8N½'A­iîo^‘dIÕ©¤Ö¦ÄLæÆŸYŠl;ϾCæõÜ<`wØÈ!ÄJvvÊŠÂ"©ÅEËgg™”û3”FG!"°mÛŸ?»Ú)Û.‘ôh-B#¨jcÏ"0‚S;ÀêˆHYš9ß,Ó‹ÀœÝVRƒñ]Ä V$di°vÊ `›·¡E›¹ÏkOŽyθ¥¤Ï“ôtLÇÐVc‰é¨1ÑTqß•B4¸[ŒGº DÖþï‘Ì©ßv‘ö¥¥„™WfìüDÚNÊ"'³{@'0G[mÀÑ-¤ÌuƒÅ&9è¹Í‹3Ð;Dfφ˜Qqô'Å2ÿé¤m•ko.…9ú­'/ÉgÔ£!UQI‚‹å‹’n©L•c׬ã|e1ãÍÍIßr…A£Ïó*RUTˆ­›Ç×¢ˆÌ'ÆÙG¾Ì–VÚa@ÑV´(2/HWDF¶zئ—m$öŽºtÖ€ºØj«#y#Vð4#81<ë®Ç¨´¨êöµ?Ô€Å$K>þ%Ye *txÏÅñ<Úέ(‚b+ïODÅé=ÛÈ…íÍY «cmóbOXUÛÒ´g<ê‘ä %˜¡î-«6åMí陯Y³’Ý.8ŒZ,ÎIÄ Æ¹Žæ‹2vý6¡O³PCDzCE~ƒœo*xkd'•ìøY]6¡«I?+C”B)—J$«Ñ°B:øúV Ý}±õƒ¦$ Ê÷€+>Ô” íSVë)]˜YõÕjœ Ô2FVĸIIÀñ<ÕFlÂØÓwGƒ!€ ›îX–K(º'ô_½L) Ø;và©î—ü†¨÷f$×\™vÞ”ÿø€˜BƒÎH §àQ`´p2¨–“H¥¥&zL„Á!qD%(f_–ÅÞ0Š‹ûOQñŽÙ$hyØ€ÚY6'î4@㦒ýä«{ij$€jŸ;µÃ=/ /ç[TXô!ä §J]–¾7¸Õl׸ý/Œô:÷ @ …™"üÆK=¼-Ø€M6üÙ¶m{ö÷§¡^/4R°EOÜËÚâ¸ó@°dËqûCw²åé6þ^®1ê5ÄS\@¿í:‚­O–äu%m¾±‚ƦÂ>x•eƒ³w'Ž ¬4SÝàîM[Ÿ Öž=ç±fÏù XÛSÍÅ<ó}¿ É}¾åÑp¾÷;zÙr?×hª[~šMm)/p—è n›T¼úßró̽{ÜõE,dÕg\_uï :åŸå‡¨×#群Š^ÉâÔíT 7<Àq=”b!¾hǤ{¥s‡b5%Œ—‡úïm"¿vEÝ·wR1l‡~ªˆ[}{™ © ÿE†å¼a¨ÿ}ujÊâzc(* vù¥Ò«‹y4/UbL]Ó ‹~{um94˜vJIêWÞýh+€Å+»ð¢nAeÊø.i´X0¸fdÞãX½æW<hÝ ‹_O:ÿ¤Â~y2xý7¦BÐ /Ò9ÆP¾IQý'ô5•jV!Ÿ$*£‡‰¹ýXégvÝ:{½Iù+OnoX }¸r" 5`M(Ÿî`ž8=ÕkB2þ î/)ð_#ή<ú®=Ž’«nOM)l쎦Ó··“í*F~:´Zr—™h·zöØ‹ð\NÚKÐ$ÏêùÇac! C‹V:7 vžW>Z.j§ËBìßø`Ð"×ôölí·Zööù”‡Þº½ZÞæ.²þkÖC9Dõ*ûÛq…PžQ’ÉÃ4‚.J…Cwºƒ°·Êz? s°è¨=OÑ[Å Û¦ùxì!Ó“ùðg9Úˆ¼wm›ä0bvGŸ(?µ½™Gx¬Ì“0Ó…Ú¨Îy:±°“Q9@£;Ì%›ˆñ<¤“v=ªâD3²„âñ7µ(žÍª;\Óö©ÉÝ€>ŠtfV;Û—åÈt2™¡ëz;ó”®uZÅ ‹„מÿh £°Q~€î¥ïØ ™Cešù©×̪$ÓñÒ gêb(‹‘uJØ;¨¿Z€¬á/Ë©ŸtU™±’ iÑ!ZY›@‘E,©ÒžäÙM:…ެ‘:%j³¸RðúÛÔ¡tLo]Cõqí¨gFjÑÂÑ™k¹óPª”‰÷‹®üêcBgJ’~írNò…>_ŸéoÏEfð‚¤ÆãXŠŠ¢sïÝQzBvhZ \n) 1#2© Ì™Ï÷ÅâÍI3èÚ®­¥Tõ~kÌ9ÁF¢ç8 `š ¶¶å&G¼ŠY˜¯QñK‚ŠçciåDÒ `‰±dPÁéËxza“bÃCž“tmîóÞÌ¿ x>ö™{ð±Éfë§J—#fqVûÀNDZæn´³›ÝÉBû ¦БqlüŒ GŠïQ¨¹ëÒ¯Ò/޽8‡vôGzF7€;•xzõÿéê4Å ðÈËZcC—²5Üv°Q§çéÑd9מ{˜7BEŒLc¬«2#~i¥$˜Û”Õ¦Ú¶ÄïÝQÂmaE xëâÍLbªø‰zÒÚU˜ê& ç’0¿5€p‡maþ)Ÿñû«õƒ]r²9™‹¥ÞÃuWc©•`å<ññù“³Pñ§d ½üÿ-S7”Úà ….<:$NŽÆÅ®þåâÑ6óëk?[C“srÑ|]êXY ¼yiQ aa,tÜSš÷Ͱ+Æ9ºøxÓ{¿N+ïìþ«:¾¨ÏÀ¶¿"Å«çD7°¨¶öåTbUoÉ3óÂÂÈbVˆ-ÏÓj];‹³ïYlxa¤0_½êÈ]þvÔ†ˆÕï¤äßqv»€•5´&e|ü½E@>oõ[È2ö˜wÐÊ:âàÐYëi·5yŽ+5×Ô$üÅúNI¥ž~²Dk'Oêb³®cY{†û<Ãýèfð’³ô«Hçëƒø:t­ «ÏSìä‡ß!®ûc0ôš)Bù;ÿ.¬ƒ>§"eºÔÏÇuáɽø†4'W>w_$PÜbl´«4ñ˜pÔ€T€¶€Ïb彘ʼn>šE6£ˆ“ íÇÁPÊU¶×ÈŽtQáæn ¡ö»ž¦åÙ „«ßsG’VCƒWìJ…¼¤õc41Øo@"³jë!˜•¹ª¼6 —±Û†m6g櫼5³PÉ®¢'KP³»ÑV`bn¢'?®„Ö(à3Éi|BµÐÂ^n [êèz²{=êtG2!Ä·F×~÷F¶ù3Çâbÿ› ?_‡ÝÅE‹7¬ù³Ïö£ ²—_ö]Ù¯ þ#ÿ­§^ˋ޽aœ p!|–·þÆ[’Böž…ùždÙ¬·¤†ðHm×¹[aT±:ž½ü= ¿ãØäk+–_þƒW¯†ë—¯°CS|A¸òpÀÅF¬ÿÈp“Ê/œŽï–ä^Ç¡b¸[n1&ŒÐlª_³zF6Øv³ýšë,Nê³"_çºÍø¾/Â(*xÿ3ÿfÒy*‘瓮ݑ ~rq7•VÓ^¯c$H¥2ìu3ÑE•­^[kWîygÅÈ#²>Cµ Æê&õñ‡T™ j»Çßæ]PÐ'÷Iâ+Úñ(QI\Ã60‹pVz…fë‹U¥+õŒ(ä ã³ñ=‹?¼¯£Ô´¢ò@"#”×Wsد¿(ðšN,;Ù`{+–õ0u“}›S¦Û3@ÅnÕÛ<ÇzxðÑW°uZƒÎã£HŒÔ³³õ÷ÖÑ1Ç;\ξï9Ø Æ—?¿ —Î÷_iL+¡lǵôÕ³¹H}SkâCÕœ@5\Z»|t÷±ý%ʾg@tÝ܆g÷£l ‘ °äEÄæ“i 3D´×vmºyR‘Õ¿/+î©ÙSÈNv¡–¦ ²J)VéˆÖJcInÀ±,R|’”Î]A · ô–°ÇK7‡–¡JgçVš; “ ̓mÓu(y|4< ò‡±"é ç™fë>© ZA—s³zcš%1z:ýª³ªqžý‹h‚^)²¶/^R}/Q%$ÄcŒj2äAÓ°c ÙwŒ²KRñ²[<Ã.dtgóÛ&¨AÅ÷!ŠtKÃ["Y_hQUJ;…ú­± !–Œ0a…µÀ´ë$ƒ}`y #·Œ¬IaFÝV%1£žõÃEII8ã´½x´<Š5™Dsû–3Ĭǰ‰›B)E_Ò)`—eõùĘj-?„"àr‚À£téÄ,W$<úèÔã9‡|ç<ïž+8ÈÒx:Ä—a+²ÔüBý(§Yøœpo_ Û6†ûʈ[iQ†YweB#9íOŠƒf)tM*»œ;¾·:¾º§á噃T-˜ù’VÚ{A£2+ùlÕ,ôSÀExZù×l8ÊÅÌWº ª#4GR£ë·úQœÀ­c#ïH¹)>ÜöÖ&{‘Ü|4S)YÀwÏeáåÿé<´¡6y²,†¤Ø‹;ý‰+Ðì";`iÙ‡Ú2(Hiï_ÁˈÚ2e æydÄ옸Èÿé[×Ú@X7n@çÔ¤C¿èÖd0éÁ‘{á¾÷^))ŠÐâÿ,è÷13–ö£åŒôš‚ó$ y]¾o”õ‡ö Ú°·# 4„)¥öCiE µ®QÄ&Ãaˆ§)±- 9 9¼lÛŸdcc8éÌ?>ûH©ëÈ9ußÊ´×CÃ’£­žkÀòž%„qÊ4ø"LÎU¬b!ÐùdU.G„ÝΑš·½A ÍO8JÃà&;ÆäÔË`­¹%ªgæÖ€¨ ¦ xùÛ—~{!9“ºî= ™Iüe·çdýJVÎü"×¢ëƒØHÞ2âaê{í—¸zç³8µ¯Á»T"s.éÉœ+@’5fSL¼ïpqf@I‰ëÇaÚ5_ÛzXêÈ©3–yWøWΣ=û®9wÖt¯³•,±ë­ì×ݱݛ¿ó³ÈôuÎ$®èÇý´MóYÀŸ#ìs}®Kæ£Tp\‚Ÿ€üñ¹¾‹¡o]µi”ëz\i™®ßúë_]¹ðû2ÿ|ÈN¿Å,|S üu¤ó¢tðŽ7áÙ(EÃ÷™9Rœ<4M±é˲~’'‚¨çXá¯Ä¤E`jÐR¢MìBòoj¦­®Ø>4t÷h,†‹…—ÄA–(’,­Æ¬»2<ùÊDÝu û¡­ÏÈY b/ON—Kvs9)CzzõJyÝk@˜>qÿrFy[oûWãùÉèB5MáÙ_Øê§ãé—ÕXèºá zãccÈÙ— êÒ0¸ö5ºàŸ­LE%´¨jRÅ>#­á=!=hlNv IjM€ÁÊC³”Ÿëak Y¡Öõ};}Ž" Ñ¢ÃÐF¥‚«YQèÿ³?ŸÈÿ&ضmôJ} f#Õ~­:“8ááHúº±S„Ñ“FÈè‰AÄV©9¬…²ŠMþ6Úšö·I­¨]…l*[é]b>T—¸²¶Z|O‚˜†,§ÌñŒùp=q°ó­ KÓ¢ œ2aÉ(_Rkhºâ‘Ÿ'ŒOʤåYÛ°Ô­P¦¤@Ãb¥µOX•òÃÛ;â B8AzB7Ýh¨‰üìÁï SŸŽj š’ú6¬ùkP½2vÊY8Ï'”Q(ØÍ3Z†]bV<%“á–@¾˜É,2©NÍT¼7’6JÏ8=•¿¥²³®è%ÑE*çý¤9mOÅÅ2ƒ¸5ÅíÜfwB;†ÜrÒ,¿Û4•0v<”…Ü ¦BÊîq²é¼xB둞`ÎlǵìY ¦[ŒÇÓ¦d/#öW´¿Ý¸…£þÁ´ÑAõ93óâY2¿Í4vQ ûY UÃàÚ™%ÐJ™’ 刨¶RÙ7MZÊΔ1` !{»gø.Ñ ]ti0\?u¨q_ˆòË_j=ÃEÍÞ†ÈV†éö·Ä¢žó®HjJ‰û.]ŸŠ…ŒÍd©#³Å¬ýH±,úåšpjV¤ñµÃÕ]üI©­U?ÚBíÖT‰þ,¿S¢ÿÉü ïþVTíuÿƒªeDˆÇMÛY§s:÷çj‰ÈSW͇gYðv²¢ÑˮϢ`呦ϩ §Œ.rœh¶ÈÉF4]$P¬“sàÓ|X‡]Öîš5ž!N]ª/ÿuˆ£T>@»Ü·v艡êbŒµù€¶ ÿ×uTŒ8´ÏÅë¥n¶Qk 1Çè„¢ÇK”Tÿ8{ÈòAãv9U¸¡¥”i—‡çz6ÈáêŠg€Ä²½Y°¬5 €Äµ@êP»wê’•1°m(²%ȱh*XŸ¤©ª¬ë,g)ÀÞL“»Ùè:È4Å^ÁÀ˜ÜcÄßNt* &ó&mÙïêÀµ÷8Ù(aòrýÏb~1H¨:3dB°¹¼ Lu¸¦u¨ÆJ{t¦RÍ0Xœ:ªQ~Ô\ †Ñ6>C'…$ ;<\¡Ñ1ØüGzõ¡ý®]ÔVžŒ®¶?Û¶qØtzð&mëfµÐUž"_$i ÍŽ3Æ,Hx§Ý´ðWJj(B9JA$¥ÅSÛrƒ¯»)ù — X9Ö*¾6DO.9sÂ\0¹?w®ó¨dãeòxZïjô×¼†)±…5 TŠ.¹œ=K€6ÝP±O¼ ÜpdœSÔNγ:–ïäbÓWR%4§ðb@ëUc1Åv.~ýJ­ ,å+—dÚ¶ÚŽôvÑðeþýâZ™¿˜×I‘†lÎÈIŽW*]ª”‹Û!Í$kl „M‰346mÌ Y®µÔ4Ûq­Áÿç;Ë®å îvÇÿ󆤲]ä™á䄺êuíf,-¡€äÂWW×hÆgë >ãä„ì°«Z‹\6¡:)¥i°À®Mã #zXœ!àÕ¾,ÂY ^^Ý•ÛˆÜ †«"ê"@(¥Xìð!P!hs&×!ûóC™kètÈ*A¶¥ÛÆ|/“¹i ”>âÒOU^¼È-¤”rf®su!³_ÎJz ¸hB‘¥ÿÛ‹»âVÍ\|£ ˆÈ@ÿ-29îßRnÜÌ;ÙÅ•F,gÉKCÍ”äNò@&qûy¾š÷odU[váä[µrÈ_õçM&R•ÎÎÇßJ:PlzwSõúó“]¡c>`Á5|#ööosý=¿io þýuÕdðÜ—õ»npÒbÌ‚ð|)¾4²3ù<’(ǹô¸'1]W®¼\+öØ—°1•MçÏ}4WôÄ5ØCÄ‚hÅmÛ]3UáŽQÎÌè/Œµ‡¬m¶?Øþ6Ý`®»òº0û¼?žs  ‡ÿwìvråæ `››/lR¾f±bwf}LŸës}®Ïõ¹>×þšÀîŸëg]›l²}†á†ëÑ[4®”õþ®55<ç‰ø 3‚(|„à){ü¹>×çúÉ»ýñi²:õM×¼_8]ø¸›úСh‘(E¬ëN«)n:Më’&ü+½ÊöÛî¼3M`…{Í2C/õ^e»@q1ÐZ¦éªØ40èJ9sÿõP lkT ¥O×p¥*Φ®÷õ-ƒ-$VL§t?I‘K(çL |ù¸§@ï B²\;ÏA`óïå pXO€×1šï­pãå½4Hb»RÛaÏôÑÕBÕ¼õ*lì„õ–’EµFr¿/u¥ d…Ó÷&÷66È×טÕÍ=2Òu $©,ßÛ]):§¸³!™ú‘¾“u5‚®´Ä°uu‚†V´5ôë;¼ÄCT?q¿õ3ÝJ³IȽ¶jÿáìd:¡0Êйíû½”vÓõž$Ýp1²*–zÁè;U9~»ËŸ{†Jœ8³^ °–˜Q½d+c «Œ™mþÎcv²XJ+ŒJM5¾."ÕÁÚÁ0­—H«­­*†bäRGŸI¾'§îEaºÒ%Z$÷qœ‹ÞÌàœ‰&(¦Üê¢ì%‡ >ؘ¬ ŒÏäœòè‡N ¦z-í.(þ^?p_Öójvû†V»½vKqyb ‰›<Á[[ׄ—o%™¾’,”„=‹náw7É'ÏGg‹Ë»l¥¢Qí¶·jØ--/ÇéÜ*9²³j–Ô×ÌDåË[ÌíàRw‘©£îJTß½ò’ó²Å›9­ §»¿[äya\Ï? jÁ½×÷¤Už”—MWXfZÌÒkCrP¥ý‡\®kL p£c„ˆÕ‘º¸gÞÚ•„Ëì~:)Zt4tÝ߯ó¢·ÿÙ*4’•óaBñКÝâ—À”@Z)”,÷òÿ¬Ê]³ÖÑÒJ$OK+K%Kdá$ ÆTj¨‹s#Y­³›etvìP½àzG2¾®ô™ÅQmTOÕN«¤f¢š¶ë]E¦òn‚Ž:\.HÔ¼^‡÷À"‘$½Uë³WÍ?F¾Â”p€¾¦:ñ  F[™¢|#:šY º-‡³G†m58Q æ9ªDw3H¥ýî—J¦ÐJ¢’Ð%ž¤;çÊL“šZb8ã[Ffx´­ÂK.ø)ê´ED^ÿ²yùoÎ÷>³Ár£T0+îT£ÙKdÙªlE‹…4¤’Ø <4LöFÚfTmŸˆÙkžgŠžGKÄ„£ÅÀ,ŒŠ éŽøŒFî yWÏ üﺘ¼jæ¸+¸ð ¸¶Ï/Ävzœðã–Ã-µ`LpÞ0W^Wó¨fX‘ <^õízV)í碂J]æí á›óÛ60¬wtÿ$¼3P´©u ¹co›&¨¤‘w¥‘+hO:Ô~]»¾cÒ]š×)dGÿÿüÁögŸ>T#˜¢²iÍØ‘O´ž‘-HLòèœ0ç uÜnÕ—\†×>3D1ãC¡ùuEٺà åº61:?Ä0@1lCMŽ¡ïÿ >Fe–ë£Ø™<>41iÛEøó ödAv²&`ç,Ê‘C’ë «Ì.f”×±¡HÍÖÞÓÓÞI¸Ê« ®ƒŒø&á,G 'ÀK$)©ÓüñcÂ*)€È"¤ÑžÚxšsËç^†Xô?dµ§)h“37ùrœ¦CÓ…$MË©¨æýàUË\ZÀ¼=K÷ýh ӀسÈbŸ.¡cY‚Ÿ´–êˆæa&I+öD¾—ä9€zib ‹5¤Œa V#ÆõÑIÃññ$4E(–íMjê´—íãL ?¦ŠtVµFo‚ F‡M v½»^LG}å¹/4‘pƒ;(3ª˜ð¸ v fìêÉÂii|÷­µ¸ö˜’Š™QrÁÒ@ÉÜ'j?ƒJŸFjàÊ8ŸD…‡@þo­¾–ï8`¸?[bІù ¹rd¬ñ}áÒo6Ð˸0ÁºSè_æ«ÄžH Ü WkÔLã¥"KsÇ.`êWÀ%æö„yT¬± %*=Q·¦ðŸÔG†ºa:Yþ¹¨@}éÛ0F˾ t¾'ÿ˜d;HkÈ›Òç3 Ö.ð‘Ð㱇kõ=Žn@Õú´du ØgbòX"xݰ”tOÎ7­¿#¬¡ú4³fÈõ£&bf`¦”@Ý¢F iÈ|¼JÃଠò¡’E$ÒqaR>¹zˆü4ÒyÔx£–zJ”ýŠK³\mO‹‚ýi£ã´xÿÖíê5ø=×Q úv¬Š’“wûë£ð­®/ZˆXwY{û«9UU„i@ÕNvÉ4o§{@$b¨àk1×uEÞÔº„,Èa!'OŠ£»Ÿ*§ÀÄ)ŒZ6{ù?þlÛÁ&Ï.‰3«ˆÊc[±OX8sÒò•Ö÷ž¬ÍOãîg ~ƒýý¬ÜÏRùïm,T…93÷!‡„.ÄÆü·KŸßg àç‚ÕØL#¡oìøÅûsªæõ¾•0ª­1·¯S.lÐï~„åF®óz¿v×(n°]Ë’¨ùïþ’0þ`'„¥oe¡d„Š«Ý¶…ý¤!ìi­JCâ?úU?dƒ¿2.}ß´zQ%^|Â4À‰ ™4k´ëïóWóžPÛLƒ6Z Žã’ûùPÊ4:lTì±Bf…H{Ü ÈO]B„WK;Yp0˜|žAö áùEÄuXXWÇGë ¡€ ›áøq…%)ÆÝzxÏd%™.¯miBœ-´HÄ2ÐÐI-`É­ <ü4)ŸÂ´ïEF®tB³ùÓ &ŽQðß»ÿ #„(™>g Øö2¨­çòÁ¶íì<ϦègÑÍž¸õD®ÓŠœt͉)އ/5Ês4.´VKH5hœ4u¨$¤ñ…‘KÖ3åF=SÑ2uÕ>sí6q‰LÆ^Ó`ÉX¥Á~g’j,‘iï¶Ò¶²†!Í?QN }@?½¥¥æ•@’ 2–þY©gã¢ÇsotÐÁ¾©§…„£È¡<¢_þs¿{̹’Vužóª×>}0bG÷'}*UŒxf柭›>±Æ²ÖƒY]5|÷ …R7!_W ä?§ôµ-½ P¹‰Ég8ÕÆÒ/å"y…ˆ'd¨úHzU¡¸ŠÁÕ’SÔ/ôüð \"°œÑŠ{«£æ{ab(ŽšVÇP0ò—Ù—´\õ>Ý}‡ôy‚©ÌÚ»ª„3-ˆ&™‘%à’éÆâïrÅÞ]Ú\°ÞtÍ.®Š>rΨ(ã@zñÌhA…(R—ßÒò©òÎk$*¶"oê=mÍà"Ó‘UèÀþ›ßÄÐ l H}Ýu?-­îس7ÌÌÑŠ‰pg÷¤¬g5·Òv‹f;Ù;®ºa±=ˆÊF©p’ ’OÏ‹¸ð=ŽÔdD ™]ˆ=õR$½&n Û±ì*\ùÿ2v€¸õºRt#´ÜûG3!2i â¼T±]ŸÓ"4;Ìö¢&§[ðñtO¤¾C~¾wWéRûŽìY§jÁòŸ ,0ýÚsˆ“W1UÛ¸ëñ.ßjJw¥t&m5EÚÈàw“Î/ÌZš&˜áó '"6q€ïš•ÏèŸÃÊ,3hÂ3;ÑÆ3¸ßråÖþ°XpH9£ÂXR› rHl=GÈ–£#ËJ€/^Ê;ÛRJ2žˆb8AÁòB$qîJLгãœ3Kq” ô‘Á(׫¯±Å¾¦Õ2“mˆ±0¬†+÷zKãV8búg¶›SÈ…£ ¥M0 ŸÃÑõao‚Ý<v2± mwÍÖàš}K Щó%™"äèœÇLýcí_HÈýßt=ÂÇÀnwÄŒ–’Ç£²Põ¦8 =Õì»°¼ÓÕ›á>`—‘жŽ#8$>rBz6Ę¥„T­¸–-N"k ¢²ŽsßÇ“¶¶£š]† ʶMÎ8Iæ8@jEÛµhý¼ØOíuÃåh jìa2>?3Øz xÓ¥¼YÏm;ú¢êÅ%î8?± Ò .Ñ™x݆ó!𝧠yüjòÁç“É1ù ‰â@"Ͱ@Q]…ï¬kL°>¤ç+¦Á ›¥¶ <ŒŽ7Uvnö^ùæbžËY´0üáQ| ì–îMÒ–jXQŸ›räÞ{LF?³ ^rÅWÛÅg$éˆëË0L‹Cy,d(­ã×V Â[f¤ VDåÑ }*¡ú1R#©n£g›.o«k@}0Œ&ÖÂ÷AJRîéCêð¶ùéî,´ÆèYج"gEé7YHôÍÝaž/E†E=Hht»Ò(î,¬q Çbëcx%®Ý)ÍÑÙ¾:7R“å?¦¡zmÐX¤Ž(/¢QÌ-HIöËúTu‹!~•ÆL:iy{H®ý@C30ùL2#ŸÜÝ݇ÀH£™ÌeGß虌º]-ìÝ ÞgYORÎìé‚|¥>m1ÎS晸ã¶;ÌMŽ-¢³9†&úˆj%ƒnÓ’‘4¢°u&àYÅ9æßï¿B:OC:ÏáÚ©‚×Aöl‡„…Õ†ö6<©§ÐšÒ(vOƒ LÀÕ‡ ìáŠ]ï8ûPý·.«–¦m(×ï "ض¥}ÒŽísÌp»ø´U»ßrî›dÂùkTX(CK‡V¢‡hTà) ‡žA/ÉuÐU°›lþ4Œ£»€KG…¦–àc, eàK ˜Y×ýˆ1| ³W?MZ.‘ Ë$vÖ’¿Šý½þÐÿ• o¾ïö~z‹ï´Ä~©Ã l2Î Ž?XFv°x_Û¬€Œžz™ÉŒñZ¨{f蘉"¾tëSa`*ŧŸ³–çn§éó,;¾jÓ¼|–Xá¹åò/§×7Yòö¡:5+œÒ#ãpÿ~ù³"¼š›… ÿù ÔM/ ß±’Ó€…8…k†tÕŸ©ÿ_[ܳ«\2ûÿv É“7)Ýp|¾ë:ó‹‘B[廜c¼h5rÞö7§;.…¿–tþÌW¸Ìñ 0òÉ;xýÖOψ÷ù£€ú倪ç£â8YÚÇMž“T,|®w²F -lán^§¼ ÍY9LÉ”9_تдùrÄ,`Ò^ªiÛÅ…ºÃ¥gÝ×üïñØOÑM×S/Reki€roÔL yö®d榢1éùie·'ß $@Òñ”L'L1D5›Kž±Ÿ¹¤èƺê»DÅ/ÃÞݳ–-ú¯2 ®ËFayŸð Ù6l°aÓš± TýYu%bè)&½ÁØ[¹hžñB'‡exfž^ƒ0óxyÖ&ôê)ªÁ/ghEÍd†}¡sQzÝ$8kg^…­ynq›#ÕÍ~ÛƒóˆÜŒ‡Iþ·VÚ'i…: P:Í­4 lö¢Vx£SïÔ’•ÿßõ€ýh— }¼ËQ-­Ê¤{¦Œà§ÞLÎenIÉ_0[œÇöVËw ês X|7œ5*â `ìßkSÇÊÀå?ZI \ ¾çö`ꨌŽ:ŸÀˆ1ò‘Ô,4(WfmP«kç·Ã±›e¹ãŽœ…÷-¢lL˜n1Ìêš+lKã$Õ躎¹L1åŒòІBŨ m¿Ý8*'wˆŒ\]¿« !ÄEdXí›É:&ã]óÿXøõªÏ;ÚŽ~tÂÚÓ@7˜ö“’\òJ V"W»z•´+€ŒçJ*9ªßE:ìʇÜðD—j>ˆVZË8\^aõ,_¤Ëû)ý‚Ñ%/ÙÎÔNv¬ŽY½ëøÄßô÷4,-¬ÇãÝ^L^©U·³ôËp¿yħ6™ä” ®ŽàXÏCò'† B [ ¶”!DÄš­G1=Ë2H ž9€Ç^µ)S¥Ã6U«CÑŒ­{êFm_C÷íÎÒ^€Ì }â¥+t„Ò+àýPPq‘ÏÚ€æVS‹Ô9¥ëQ!‰·eŽ4ŠªPX0`oÀ<Ì¡j£EeÛ¶íO§êÊ ªÊvçSoZÆA§éÜ¢b¤gºº¡è ·•Bÿ{šKE8mu Õ_C§5’ÅÜúÒQ­vÍaƒ~†ô΢¸†w5îHÈ€4ˆU±¬þ¨ídC`ë‡Eÿ͆å¯Ì€6»É¬€ Ä`23<•ÞÓÒà­†ü4m†Š'‹!¸TëÕõ½3pÀ~Þ=œa“4CU@KÐÝÐÕBÆÇÀ‹CtzAUïÇœÙ1ƒðn)ˆâÞX7è0) PÌ”p™ ßý-µáÙy†.–å±È@ÚH±ë%²òpFäƒ8Ã}U3‚>ïjÇœ®q9„mH· ÌaF|°¡ŸÈ•;¤“ÆÔaò67ª]l'|<¯™"†R_&GdD” ¡§ª¿ÖÞÝ:u=[}pHU.4>ÒøV&žv\oá”Æ’d»ìL9ï¶>aÆÔÅð´˜`g)ÿ¥JƒË­PˆN§Î$ 1[rí¡ æk&ùƒìn5ÄAÙ œBfñ§UÕB‡pº Ð^.i3P´ Çlï{JæácE/à\;8XG0ˆ¨JDoàÏÎÝ6ãàCoŽ€!=‡—Î1aÑ·û ~Ÿ ŽH[<ÀD#“ìèÂ\§'ž¢uXAmr/ò>°;ÖTgvMsÜìŒ=ëo3óÎÿ Y>Ì–|œ$®l¿ÔVÃH¨ÅXþ+š¼U§ïà”•§ê3a²²/Pi,¦m£’K2®uàä-ţʘU•éôfÔx§®‚X_¾ïëgoìH¢³áf¥Aôvg½ø‹SÕ<€_:ñÿôÜ¿k¾æqë"ÖÑ«|èéÕh5ØqhåÞ7þ‹[^ ÀÞÙpvrS$g¥àk ÇÑ7e=RgýŸt(—;ðæ±ø/òSõ~‹¡ë®Þ13È­mµùÑŽÕ4@üóü“z ”¶Õ¢ò–S曓·gãwj«^äŽzãKáóú÷o䲯m¨éyçh¡Øss˜ öªb,Þ7t˜…ka‡鮣‡IcH°ú)&‘¶Qbzþáñ0P¾‘S'*ôq5)HŒš)˪›Ëš.dOÿ²«„u}:XYÒ˜l¥BWÛ®ˆŠ¶ÆTŽ9Šã!dlaô ý„(=WÑ©r¯¼•²K›ˆ@„·g_Î6º(EáHö G¢—ÔÍÂáöB‘mE¼nv¾¢bïQc®©žRiÕ"Í»ÿp~ÿ_lv}¨G Ã7òÃðe§še|ck;¹dÛùÒž¬þû\Öãhè¯Gä]õ <ó ®œ{'„jî€FøŽðõßyÁoÙfV#ï>k ]M¦Š`ÿeÜ],G\8q¶1Ú–Ã6ò©XD™ÆÅdô¬tÀé’~KüA´Tí©°y1\¿$gŽ{ûÈK!½# PÞè×Le/Ǽþw< ï¼Ù+犌U°B½aÑ|®MÒ͸¿Ý­s‹Žpìðð€Ò ¢wÌ:_¿‹)Í]:0¾Ô͹H™¼˜K30 \xňí«3ÇÙÇá¿f½µj,¤HW‡þ±H+$®iâÎ=€zQ Õ)24ÓÙÿ}íôüõ¤ó«Gü{(syÐÌ{qç…J1ÜaWéºÒ=šKF-®ÜgÍàÙT+ y„ªªÙ7ôîÞµßù»l‘qúø÷&ÓéC9 Ó>3Õ•ÝÛG=¬f_?¨¢Oµ)P±±(­9ð¿'î†A=¾ºsÖwU¼—Lo˜ßÛ»„Ûn•0 ]DäÁ^Z%C¼dE,¥] Ì‚·/ßÄ …AËY€m/èGåÿÑ® -NÐ^ÇpäOòM_ô\L.Bí5þµŒ(ÔÞ9^Ýj°€EîÁ– »p9D(ºÂõ¨"]µì,G)‹Ýw³‰Aè"ÓxŠAµ3¨j¡€!;²ÎqcRjÌ„ncKÏr…“MÂlˆ7lƒÄJÅ6<äF' ÃþÇÒÑ oM:ó¾B:“ų”áŽö‚µí¤v¤è9çz‡#+[DŒœ°äX…ƒë‚ÏÍ(O¢wfßš–)Gw»fQÛtë#-B4)ÝFÍ÷Áì÷RÊg1¡2ÊG´ÿ:’¾Í~L(†¤ñâZFu¬'Š‘wìµ0\zt@öÉI é ÐΊQU˜` †c¶ü 6©cæ3ýÄHÜ,{Væ¥e7¬¢Òõ;Ù wôá_*TÏ:î5d }ꜼŠaÆK³™=Ÿ¢*ú@„âMÒ~…Å ý„7¡S{Q,Â1Z«ì,¡Ñ#ë¦÷Õ‚ Î§Ejž/Ñ{ÞÍv@ê !óé=›UsOº;uS?Ý/M±vd£A¸÷4`¸\&øoœŸ2:ú ‹„®ð”ÿݧ9àE]§ÏPß0aóèó(:Ã[eR„•5€kÐù-PTÙò_ZÄíô‘AFêÆdΟöà{kÏuç+ñÅ9iB{½bãÍÂIqF?Û‘XƒþAÀ Ofø‘ ØŒWÐP_ç³Tö¨çT³g¬ü®™åЧT¡M‰9×È"¶„!ÃIR,F¾`”µwÊúÎ6SBïˆÙ"´¡†añ\¯¹BÖ¼APBYù»Z«:ðšÎ æœ&g£<µE‚í.]„¤¼á{J$·\€]`Œ8GΆ„(´3<‘^Ö§â}Úã&áMÊ100U·­öhôæ´MwG ÎnÅ`å-ì9+N#q¢¿Ãx ˆÈѾ™^%£ZK ®~¢Pb™¾•5#Ýž@bš€æÿ) ¹¾%P@ ßšHRÿ_kÎ`îsF`OÈg0è<)×VØ)­ö@SF^ËuÙœLÁãñÿé|gŽó=ÉD=]ò‘mÚ±=p€$ž{™n¶Ìz(–ýÿ0ÏNM:4GH,¥dÜÉÏÖʯåx¡púFg;>×{¯/¨'é–ˆ^ÿ *A?ß1œ4·e& „êNwçkIIxJƒd9Œ'6ò\-Æ—Ç2#5ï„Æ1ÿO}˜3M„è²½ÝCÙðdh{`p‚©†¼C—ŽžVr‡U'ùYäçÂׯè‰2ëäYTMst—:áÎÈÓq}[8™Éi ÖeV„ë–Å9F“.UQùL!Žc’ÒˆŸÙÒ{EÒ¬XÜ‹ W/rÆrNµëh¤¨Õ%ôòúX áøåKäša?þ6h°ùÅû}‹ƒ‚ʦ3iËÚ:¥`;Eëƒù_#å`e”¡Âd ŸÛKŒTÄÇï>ß§  æ"Žÿ° 5#Ûþü«—Ͻ"dÊH3Ûx¹v>áèÔØÃ‹Ì«¬øº×q¸/8_+¸ËªÍ?Š—Ç:Ûp“†É7ÿô—Е̠˜:ê0H¶`¦pÙ+8Ùðâ·ž=ŒiºÊÉSoŽßl4m_óMÎñ±áV¯îb@º~¹ôàÿ¶/:Ž_5äÑåOwHTU…AgËÿÛ–æJ5¿3üÉ'áƒ&éÏvœY<‰BÒrÀï#—¤(¡IêpT] èMFwvÑRÃÛãëï™ÝÍK{òeðßÊ2°ûñ6Ö"áØ§Ž ÷$Ö²» ä2®æ‡ˆ”OAëeo €Ò´N‹š:¡®ö†OW趨r=}†Ú–Ô^I Kú_ÿO6ÆPjMV‚xÛ3Z ñÄ  ‹fìô™Vô¶’KWÌôÜ*¿s…YüÅ÷<·…øÂ3œr›Ò¼Ú?ø—\"¦¥ ý#ÇÏuøŒÂçzK<7NÀ·ÉÎŽWº ¦·>Äš^= w‘‡–e¨ c­6¦.½¼‘g–8BaÞ`?©C_õ²¸=Ÿ›Æu‹R·÷†B¯zmwưßÀjÜú‹™¤ä÷0çx Þy£.?Ï÷å\û\?Ûùù·‘áM¾Ï¿y|‰Í8M¥ùŸ ç·çY*tL>¤f ýåÞÿ9ÚÓ;·3žHz1¯æçf¤¾è8}r^!FG'eŠûÿ<¢Ú/S—²Ð•fuO\eä7=Zgî?:9OÞ»î‘4¾À|Åä—¥ƒuÚ2Á:v°Të§ ³CדSž`™KÖR&UtA–O¯ï.Õ?l”~í>—Lc6lƒAÒ7«Ÿê–€¬æ+`p˜;wËq8&ËŒŽ\kQ´YT §bíåÛJdpæNûÅ˜ØØ}1›KÞ[ì1d±Õ'‡#PHàs¶êù)‰Ôø¬²” œ¨½¢~"èæ}ÛµâÊH¹²Ã¢f®åvwÐNîPŒ’"€2÷‡!Ùð»Ós58‚÷£¦SCŒuŽáÓIÆálcJÓ4ø"0 YFy|°MLÐXFæéëRZ^Oó„û€`S7•óÓyáÿN‹ È”ðísÁí–gíÀ$2®<ôêàªÛmîhµ¬ìv(Ú™IŽM` /*©™Õèóeƒ«4ª^71¹”Œ¥KÀeÓý«b[y{§žÐós3š.¬j¶…zšŽ/6:Ò‰Ð!4(‘)7HOH¥‡¡àŠÍœnÉW«u›ñ;lÑFÏÑÍ%ЬÓZï+ývúë‘S?餃­›¡†=ÿÎE ÕB2ýÏ”^‡œô\ ÞÑ8\ÂD›sÎqf»§¸qï£X·0ã6‰Ýê…€§ë`X£tð'yÖ‚ÎëíºòM$’3þHç5b‡Ž¶Õ¨ÄPœ0Ü0N&r"ú¸ì–ü½k‰+Íl¦Yà©® ))¯c©Ÿ@½gd«=ã{æõY0¸'nMü±œŸW“‰gSißøÂâj{á…ˆ<©Çḭ̀’ÜxnÑm¶• 8bmHsÔlÔ·|¤¹@ª}å!($l–ð–TµûÔXa–Ô¾2D ²Ðá»Z –óŸü™!OôÓ¢Õ»ÅRÝù”½n U‹óJ‡Üócĉ¶“8¸öôfµÁ¹àŠ9ÈIøt³ÅÕ­…òÐ#%¨n;pŠ%§¦ã>nôaƒ‹ñ¯E«­iÏÜ>á·¾ãêœ3£þG±”ëŽ~æ¿äþ̵!Ÿ‰FàŒp pð `Añ¯­z&šŠ¯ Ã3|äšðhL¦ŒÒgàò$Úéo ÞŽÂœWOç—æ˜ÐûH< ' †&öª]G€ñÊH³~GTË.ÄZ²„5 -r¾Ï!36l“bX9?0]¦djî¹¼ùé§N†p/ˆ`ÍM9Z^ï°˜ˆK8öé‚ÎÛ‰ FGQÆ8¸3¤nT87gv¾±`²tÙB^Aâjÿx5Uƒ.Àâôw¿¸*`º2Ü8²˜+¨Õàd¶Ò’íû±Wñ ¦+w Á·£RƒP=q0i(W]ž8¶&‹C¡I÷Qbœ^¢E*a»@[”‡ù+"‰Œ¨pÄÌŽÑíÙÓCšeH’÷ˉ§<ßÔP¥#Y}­d•2ü-öŠcìhLe²V{ÚµÞô?Щâ,ÕçWÙe§ëR¼šDæÖ F¨ïÂcÏzÈéT%=M—*®CbçT‰ëüÌçê.5NV€¬Bôo˜3«£Ü¾º”ß@ÿ¥(•ô09òô»Þm+;â#`°$ÍU›M·ss%RÒžê ^Lt?ÂéA­ ƒ^H!l¹—¡ÝŽÏc:j}36cöõˆôl‡5É¢Ö ÅÏ®øI1çe,ôP¿Ñu÷&gC­øŸês}®Ïõ¹êà¬ã2$¿ù³.ŠÑü'&"‚m“Vd²,›3œ¾‹l!Y ¿šXßÐ[ÿ‡#ƽ´õO3²^Ÿë[šEÝ?‡8äk¶U¯”RM¸ü ß¼ø\Ō޿NL©¸ñ·9«ñ¡ñüVK~ éü7÷QI™’ó0ïÞ",÷æ.¾~’tè²!êeo`Öò<>'-þÜ«w  j]}¾½XXw‰êÌÎÓhº­U¡…Î?#Ïm[Vô ľǼ¤ÇHÊÖ¢LbûytŽ¥ŠgѸ´/[{•ˆ°‹“héÒYc(žÏùP²0ôõœOÊèŠ,Ž†Ù˜# †Áɤú‹ÅvË£“¿h³CµƒÁôòäj5ãû6{ä^LŒé¦lw@ãé"å¡x t”Þìš³fÜa.l­)ª© suSêr“¾РÿmÀî~>ß…`(X,ÇWájRq°.‰V-]4îPäþ¡ÍæÂ8̽rײרß×7e’æJ¥´”P±{Ú¤¹fU?ExW¯ï“ø•>mªúxäöi¼?­M²v°Ä;4}8•ñÈ;…9-KGízYC_L•ëÊ‹ÑÄÇ:B·§´½û„Xòëå†Ê5½Ý‹0lH·ä=½Î‘£ÍN ø‡ã´YuÞ…\—ªÄ¦ÌUjÕD[)¤³ERÜ{l`CTb~œŠ@F ̪ʓÎeÀÌ„Ø2ÀÎ#“'²J×ô JSX =zóš²}ð:x:"9]ÕÅ¥H¶g”“ùAÇG‘LÜ"5FÒ)`žŸ²Ezç.³»bÅcŒuâèBö9ÃN§€abSÖ1ˆ9ËãnšT;!£'q;6¯BÌrøà Wa Ðî ÜÞÄÔlKWKòxpxênÇÐx1‰ æF(žJæ\xM“Sœtã„eêo±J}=¢s,7ˆ <¬ÃAäȸ†¸ïAñÇ_);~Hgv2#ÈŒÏ7 N¡ìŠÉ2ÂΞcr÷)Lï»ãüCG±ÑÏh7tžš„eÓä‰Ó 8芪 ÝQž©1N àL>"£_³\Šug?Àzަì)QîŒÌ‰a•ž$8¡¸î‘@ ·›š/7ÈÍâ”*N6kúŒŸL%ì?2ÞÄ\éRv’2¥Pnv½ç2þŠàémµð;ÖzDSãíN¨ ™v‰'Á¢…7Í.Ñò YÀX÷sí° › tÍØ–Ö¤’Ðn8 æpî…st@KÔôJøkEŒ{)#]—|>»jyGk.ùÛ!šö¥ŽÁ©ÇoL§| JÌŽ[}F£)‹«Ž‘#æ?·éqéªüwƳþ]£PÝ ‚NË<(ÕSíï‘Tî$½ŠhpD[K‡ib—6é|7ֳׄ0©ÛK{dá Å ¸åFÁD‰^u'ýk~-Û±JwÊt"/×¾f1}8ô?£Ø¢â­§ ‰•°pœ„þ-“ƒ¯,m~¯òÿcȨ:‡roRæß§…^ý½ÅÁq*§símøóRó ð…b:D½€i¦kÑ¥ÈCÊ`·K¹°‘“0ÍÎ.•ÑùÖû&–ÄM3$åí€ÁîMÌBî~@À¶ æÊC? òÅÃj &\p]À9iÎ DŽ-á±±‚`Ýßl†K ðd5éÝŒ[<+é ý ãõ–¸ cf¢QèB¾`¡¸n¸Ðqã©ÓñD'LFsÆ–€Ât``ö8ãÎÔêã§í¸‚€g1ÁT³“¥‘æÉ¹ãÁ_òà9Ïcor‚Äe-6}šNHøX ©:ÌŒ\ý†#kÊìù*|aq@©8`ÆwÛôpÅŽ` 3¦l<1g½€ 6éxåôþšø6f‘©‡ºdG §Õ–„s‰Éúi‚fgc0wX!tˆV'.œZx¸q ¤“:4ˆ¥ˆ(‚ûšÀÇèØ¸›$V "°µ0rZ7{*™áù…ÝGç aÉ•*fÔ–kçh‹±´¹Í’ŒﳊD^RÕàâÉUšŽ<%¹OÄžŸïè®ÕLÅs7ª¸È8¹ÑÙa2YZŸŠöDãÎvÏqjÄÅhVåXž@kטoz„ l‰'Öe ªóqÏ X»Ék ]]ÙÂÂN)›Ëƒ.BÐÀPRÿ¨‘÷ ]¯â¤9€ÂÒÊ‚ª ·š/¢= ý÷”ß¹¹o¯±†]“ù®ÌR\_E!¥è£W…û K;Çã„WΫ¸ŒžçžêOYÑdÉ-‹Zuç,†JsKX2ͧÜÏ$C*¼\ß.–/¢`GŠ%¼œ©Fïëzáþyéñõ÷ê‹}aGá7“¾ìóÜýO¿p«—è< mxôëôÇøÚ—Î˜a¤¨Ðñ8¼{Ùk,H]oÎòìAe¢Ûã1™Tpã@ÿ-±,U¤QÜ–¢ØQó•*cŽ.» lˆl C}¨#G Ïè?ç$ E9Šô¾rËòeîÎg™ î§ûä~®Ïõ¹>×çúÏŸ«§‚FŽ6uÝOOú¹>׿ A¿#È`øcÖén6¹ò"ß~œßµsÞwðÂ6^þ<ß¿æF‘â3«ñ±/ŸësÒPÄã›ÇRKs?±ñIñ1OØ—¿ý8xѹ)!N{~GdÌéSE>ÁÙŸ6ïɲFMÉ…é@§Àr¼Ì{#™‰>ŽìÉQÐ3©Sù|•°%±jE÷¢/yÖÛPFòÓrJl!¶½R°é{3²-·÷ ¡d|GgÌ˪§>ƒñ„òCA>L[­÷ì겓úÜ ÁÆÇCØJï÷áìc×>öÀ¨±WŒü€.˜WâobÛvG×vu]´ §®ÃV8 ²!Å£ã“þGd‹µs DÏ×Þ ÚE‹žô›²=ï¢&;“Û ¶àÌ.XêÂÛAeÀw–¢8d<±½M|õ÷øoÐ~¿ÛæË©+HsÑQÚ9Óu‡/«áÜD:Kë*x8ËeàºsW²-èžÃQp÷º3Jò˜%„8æd9v=›Æ<ÌH”:³…=õßXå[ÅNj¶¼èvÓ0US¶Ö0ðfîd&Õu(rJ[¿h{>Tû„Þ‡Ð+†ö4=s"¹¡™{†‘†7Ç+ӼݑÑÿ*¤]0 ݱñq¦ëvn¸’ m?–ÍI@¬ =þ«‘(9ÐÁí ëiGÅe£‰ÐšPH†"gl§‡Kk8¸ÅÀÝùªI5“j5¤ôk²‹uªÝ€÷Q'Órªÿ‡•‘ Gku7Or¼¹B‰¶óZ*Ž…PI|Vôe_I ­©ëã|ÐÔÿžŽgÌAH!D¾/Œã˜SN“ ÑD1¢9}¦çî2ßg3 ˆ¬äõ’èh‘&cUu½Ž°C4EçdÂ>â¶®ŽÁÑ$¯ñü¼$+öçJ^ÒËï}P¬ØYàyoòvp©ÂLjÓŽùñ}ÆÅ†8ñÙ¼ˆm|*5šDÑÍRt™ïÀ¸±»1™ÁfF;½›YB˜tžÍ›Hg™ Ò«Œ©Öy}z¤&‹Uÿ t‡Õ矰²'ö×IÖ½VÊ9eãÀÕoç„XD|«²j6‹Í:Ó¾¾óP£¹<êøÔ¨Û¤f8j[I½é¤uéDpaéNÏÆ/#×ø§á¿P/#!VÙž0ýÄ<³¶••0xçAÏ-V½He ^A¿ €j&Ìs0q4<àcœÆjÒ«ž ijëë3ÛÀ3ϵŠã˜¤)_çíØä}³FðHXÅ:œ+iånG@CÀ­» |<éj¡GBcö©,¦åðD¡ÂeZÃf€U¹Ö "azg‡ë„DYª@Ì«08äšO÷I3r§™É|êýˆžÒµ,¾€?ïl•I¿CÐGb™ÑØm’PÔ.ÐL£ GÊòÖ)IŸy /øÎ`jX¿$LÆÂ9ð˜Eƒ®4¥ù@ˆvlŸ‘„á҆ÓÑäØ#šî\fÊ ËžýÑ,%Nàý+õýiÕhɌϱbp³h”~iM¿eÅ+6bü÷°L'ŽÕÞhFÐôâúóº/¢°+‘Àu>äìôâ` Uœà)1@¨õ…¼HpZ¦h&a‘ ÚQ9•&åÌ:;2Øîl !ø˜A˸N„Q‹ ×JàÔaȨBâ<– ̲Ú È,FÇšï¦j³þ", ¸xN@ذÆÈ!lž=¶èRWÃŒÐûà ZsÂ*ó«šÇ}ñJ ›"¢${Çå^ûÃ(8˜Fìu PL(j‘mdzÑ{O‚‹ÈJOCT5ð•)w9,¤¨^I…šm=ëÃ?æÒ!Y¦¢3•Ë-øUšæphaÏÁ"Ã&PêQчcjv-&c~‡"÷ *M]Ž½È iµ"M+?4 ß(Ñ„cžÚös2ûG795b>T8û=ÉŒ^!Y>#ð5Y=+ìF‡Yë¬TB]WÃÂÐ(²ÎW¤)n)ICú‚tÆÚ+ž+d` ,<Ͱ§«¤LqÏ/¤bÒì…ÎßgCZ«"è<àR|ˆcxjA"&x1;sn. Îö*EZ[Ð"x@ÞpªzA€×A#fR¨ÐÉ*Aºïî=\æßI:ŸC€Ï0…»…Aí™3øh+`KÐb-nÌÓ³í%‚û5Úí„ÖÅ«óãÿà8ÓpæýþÊçúù׃¼¸ž‰¶­È‹ÍZБ¨Ä<üô©2û)û~q-íøc€”‚ÜòÆžÝ華}¯¯Ü4št¸õ]`G–ÞÛ0}ò³^ßdÖäå³/·`øªMÌGøÖáõQúÚ·õšgé‚ 8ØÑ+ÊÏÿn­¤¾8ДŸ¯Åðï{ȸ1«€oï]q‘yéÒÐ:tÞ±IE×díÀÜLßÀé{au¡¢OØX³öÄ™üäÉSêúoÞ%%âö?`…þ^Åè€ØÎpÒ{½èÍysn¼2–Ô­-+j†4d;(M"‚Ãdª~E 5 Ôwþ Qlj˜B‰s{V2yó(ÞÇ!ÚÞÞ ÷A>Àæª8‰æuq©µ°w Ý­(àƒÛ¶ímV`&øjê.GÍ»@ÕlŒß6iZ’šÏ;;*¤PÞ?F¥—ÔƒTCEU?<äqŸ>TÅü;Ñ?MCéÈ㵬"ž ô!tãEñvl*]‰K,¤'„«è6N0eüu)óÈ!)cP+ZDDúF}ôFÕ¬mìóÕûXвKŸÌȶTôÿê-ÃhiÌç‡3àˆºâ„øí¿<ŽjoïĪ*J&Œ5±$Cä4WþBÕ^ Z©©£»Š1ñÒD.ÅöÓÕ‰ÐRl>½¬MµØÌÕŠ3ÊEMà:¬€gÝÿ¶9é{ÒæJ^åâ%±OD F;:ùÒä7B"Ü™–Ò/ÆÃèƒw¾¯âO,:qy3tu °3¿zSt³üºÑ3’fËð Ùé.¦|2‹SLpO\ð]M4Ä$‹ëå3É,êàŠ’é>3Ÿ%Eªf½ ½DN×sà%Õóýü}ø(@3T0' ^‡q©ù"ã'Ð|%œÜ¡˜lYmrCûB–ÌÈȸž˜¶AdÏÌc#ZÑ ¿ç˜w>ë.¡ÈûÏ•r¦ÁÅørFKzÆÊØÿEQüÑ< Íhaú5Š|ÎUfuô~(é¼ÝŠfqçnÁM”#¢Wè#…ìà\Ëì6múŽ 6)éVlq)ª´hÈCt;ðš2%âô`J6nÀÄÏ´K12íù™ýº'Õ#ÙwïXmÊHyµ•é ­9¹(f3îð`ìjT=‚ïÊ/b½½—þÀ¤1’V¢Äl¼réP“…˜ÕÚôОæ;/z‡8¢zˆ6¡H÷…w¶%;J˜éI®ÚQ p á‚*™%V#·2ßÒÑëY6`N_ÄgcSãT†@t›YÚ +eDçKb‘'0 '¿h EÊ Ø×òéœQA“DMmô§ûYM}XJ|E‡âsl¨¼%y¦X¿‘Oéé¬Mûš€y;=¢%—W¡š*š½ˆÌœÙvJ*³9Üç †*EçÛWºqÉãÎQ‘EÆìó)Š‹Î"uȨ¢"Ç÷äWɄɩÂúÜ`Š€ˆlб()–èä¸:ÔV¨Ý«IHéÑȵ±Œrìø OÀ[À”{Ü£çüDHx””Ÿ¬:q3¢F+À°Äˆ¢Á„/NGͰ k–Œ…Zé6tbɻќNK¢K¶Ÿ2e} Á”APƒ³«Œ3´ÿüTñqÜnÌP]‰º,m¦Ë3rCt´ÙªÚ¤prʰñÆFÀã9¬’ï#C`ôEŒau’pâhu ™ n­TƒÜI¬ºt¶À.61ÁèBŽªL@ÏŽÀª¼Ä„| ”c He>RêqpØñ0CO³%¥{Xaô0Y¢ÐñÉâžÝN”Ìãñð놫¸´v¨Ÿ$Z±àiÛŸ¡@J2o{Ü4-Aáw˜ÖBIt\«S?²„ªyMˆiãg⌳œM?¤­˜s^ý2ÒyñÕØôôE&í3âCã~gÓÕ Êš †é•š05û÷Æ\Œ,)”|ÓëCôS/ÎTž—1Xn€%ªXñVYž`²]ãgésèP-cæoײ„Ÿêyà `¥?¬1ÛçŸéãRS¶`lö P‹Àœ«;`Î’6­eŸÂtLò^7ÇÕt3ÖWü¥ö6È»ËWY¿9/¿íýnx5;L³5÷<ö÷>V1Cƒµ–"²F;}é›îÄþnçôïô/:¾ïhžì°Ò"ó-‹ßb.¼#Þµ»§výö*9 ]",Î0ß7NTÖÍ×Û:´7{ƒÄACpù…¿°ÀÛ6¼Åœ~4ìw{nkE…<70–_F8^¿Ðµ÷úÚ-á¨ÃëÔ[ñ·|Õ¹Mv”®rXUÜE}½v.¬…k-gAçôx¨wÁÒÃùW€ŒVÙÊ.îävm=!eþ ìð+L_n­n¯®Oëv¸2%_Þð£IçEI`7ºœz~'Ÿû‚]ºù9éÄRÏY®¿fy nÀ¬†o%ÝþUÌ/Ãã3­òÀŠÃ Qûƒ©Õ¥¸ q´JI:ˆ¥G¸ÿ«²úyxƹläžì]„þ{’± W•ŒÄl-Š|6(Š-X՞鑾éó§\¡b3̺íÚDi"~Y)êžÝ¯Q'°šØ¾\C_Â^РÞáùªZ"ñ‰þ£ËRMfûBc]TÆ-‘Û•-§«µì"ë=±ÔO­³Ðµu&/H½üÏÅÓ6AÌòà^A½mn¤FI‹)^šÞu,*YØKØ¢YC§õ ¯ÌÌJÂõ/ÀïÍÆ{£?ò6öð”KCRm™—ÐLD;É›'¤|ÃÔ¼µUùK‘:J¾dtÀ»É¸uUk: 2Ãw`:"é|»-HkØqï†'ªîº¢’ÛQ‘GŸ9ËÐ⢟ÛÊ9Cå”’õUëŽõ(Ôõ­ëŽÛk¡ÿµó•zÿýs;’5§œœ§}°ßm0UGVeÜÓE‰#”àð ÂÊ0ªT™Àv)>•³½®ÓÅxäËšãUþ£“ŸÈm‘cº.<ðºòÚ¬9˜JI…EáölíÉAÁ§u\œp–neU €ØCóŠ×yX ‰ª‹þÈbÎâ›æ_¯¤¨ýdµ ‚º{Èd;z›}l;pî1w*) ”ÿSgš¦jé`kûÁÈX«ÜŸE‘’ CÞÛj‰øöûβJ:¯Ú^ZàäSÓ¯$ݰ”¡5#˜påýŽöG•·©Z = ¸a ô½†Ñ¤v”µ Þ7|6©ƒ¶Æ×::¶ Ï€Õð|nQë¼UÉb‡ ¬è¸ûÕœFá´æäÔéÂ’³ƒ€aãØæk¤PTï¹Æ$ü.\„šÞ'û”W"¾mÛãÿk÷^¬Æ™Óm:Š¡k.Ó=gÛ`\Òý6¨Ï¨‹-ÕZXÝ·‚ÉrjÔC8—9xÇÖšÛ3Ù(þ}Ë;la_ƒ”§·”vâåÐ*.¦ñ ®Ü•ÉÐJX1A7˜ã¡ÐîDND@¿›èÚû‘„bí7Už÷FGMúcÉ„rÿØÙ [ª¬§V”±§™}xËóÏ”ƒJ‚n]ŒÿZJcþ­çήá/ǽÆÍï<Û‘‘Éd²ÚBÜb辎pCåR%{Ä->ˆ"½jäê=• º4Ä€aßS$³Ž^Ø Ï›R~aØ*s¾ŸA§¿œÕçe³‘ B8¶ôà×Õ°.ž#eÖjb7Ý¢Ng½ ›ÕCnÿ’Q~ª£)‡ Ýž1P‡^…Oç^q)2ƒý²LNÀ‚¬Âlz#Uì:0ƒ‘ì9X3–õvEò(Ö—nñªù°á%ºº¼”õ¢ô]ÂTcĸöqÃö¢y}â*¢‹¼œCFê‘qà9‡\å Vœ lAòUŒ½çô þ5ÊDÚècJ6¨&¾å¶¦!(”N~1‡a½•F ¼zú€ƒ*- C ·Fv¿1EB³Áƒ2$z ƒwŒ1fà8î‹…«rìdjíq©gÇà¦\gù«—ÉÊK»_aKžãn|x5Nx,ÄÏÐNz4Œ)Pž«‚&jFSv_k¡`1Y€t£)î2ÑXufkx©³úTãvõöžÈË:Ý#"K†ÂÌÒÔW:ƒ7÷‡éXŽÅÔ¶SÛŒ ˆñ{¨ÕÀ?§>O>j²zl6PdË^ ¨O:y<ŽdEzÑkgÃ-¨¡‚}3'–q„XèŸXϨ\c€´ƒô,G4CqÏí–œZ`–@w. IÜû¨D+''º#ØÑ)DZ:½åUòÊ~ë%‘ŒÆ*ÒÉ8¢‡A.8ZUèm~Òsà¨s˜ ™*‡•$Ñ¢­9··º£æÐ*kJÀ‚¾¬ûÀ·Ý–{ž .ÖU9±ÊÂ9Ç|’ )Ú(@å •ÕÆ4¥7—úͤóÃÿfµÜíêÊK¾¬"äîíOhjµO@‡Öq HìÜÆn NÐb’²JÂâZÒÒRyÌÒŽ¨ó^k׎[~(€~ÞŒÂq`îB‚ãÚ¨¦WäKQr#µÒ?'ù wæ¥}9›2æ >c§ÖŠ@Ÿ¨M›gu º(•[9•š ÌÜ#§ÃÒ‰_x]²jÎÜÕbeÓä ðÅw€Á¾ª à¨\iã›Êâo׋ýþ'™ØÂáįãáú Ø€us9³v8Ó€••OÀ7(Õ-P©:‘¸û;Þ±S\@‹o<¾ @è7 zŠ|ï¦Â%.—°ÍÓÇÔÕ€‰Ñ9‹¾ÓÊÝe„,Âït-Í>ÒìÑÛB¼kûîÍTq´6dùïã>^_ŒÈd æû]× N³°…µY=0£ðzÀç .²¾×\±•“ñzÀ‹¾ªõ,W:²PªÓç|Ö½D-¯Vò‡‚Ð$, $¯.X÷v6q¥ÿ!Yv\qpVÖßp6.ø‰dL”½#`û¹¤óRìü¸ˆ³6ýë?œ±÷þ&¿—dž•.®PÎo\D=Æåj¬ËNO¯Ó¥0Oôˆ*Öãaü5Îûj"lU¸Ì~ŽA­CÔ±Mènr¢›Œ-¨Ý&]%† úOFW¥¥1õS= ¡ñ‡QÌÎîè™â¶‘¤±Ð0E“Й2²{sÌpÔîzù•§p§ù§­vNô™ôpë[>È÷VÅèÑ'xÖ%›Èª×jg­Þ†çw3ï5¥Ç½E‹-õ\¹ñ¹ÊÚ™Ë ]¿ÉÁuöQ€…Y{ª`uÌîÃŒ¾£7}ÁE¸âª‹j”¹ùÞ%sÇ€·6BNYŸK˜Ó¿[ؽjç«—žóŸÛTÊÕ“qC@\u!ß6Ö³Ò³SáÎÂ:é ¢9š ëÙ½ŽäwÀ­—Á—Œ#–¿Y<9ˆ.­ì+1‡ƒüÛ„~.Sp='¦<Úð FÅÌ.¨øá *¿å¸$úp—£¸²fßÿE¾þ/6xkNjòÛxí‡ü?Ë €Á¢³£õ>f™g-{Wqšk¹ ú³9:ibµ»•ŒÅ]öntÃ,¾EW’ï%¢¨ L¬æïûÉÞéÞ®±Hç• ˜ ö¼”8ã0®ú ec¹>ಠ¥îl+s.64jÝMÔ½T©;z„%d½á_Oñ±3ù4ë”õÖT lPž¶âR‡„ºjÕØ–Ô–——ãñP=œûò©I¼Hº˜„ž‚Ô5# œÔÑÄåÈ6\“nìûo/coÕ§Cßô¥)Ô¿î{£Tî—FÇ ™is¤üz¤0yoõÓÖ¥¥EF1ß§¸üÀÜuü¹ èä>Ï;ŒÔKïßéG%KèxŠÛ÷™EçåÐt"¶­›C¸}÷Ÿ(&"‚š:­gÌšgª)ÞïñhÓëÙ"è+“My_û>è–j•*a740ÊJ>l ö¯‡¢B…b¶IŠ0U{ƒšµ o^ÚªrÁZgÆ ÊƒˆrÏÔ›]ŒètBÁŸ®ŠKIAÒ).•<4«$>“MÑ™3†z޾Ñ5MšVSQL×­‡Ôâ;Ñ3îÛ‰Ò&Qç¶[Ú™pfPÞP¬ê7°Ÿ‡²?c£3uÇ»6y ¦=õ 5©“Ô¬«KéM÷”¼K¡ïÓD40m¦¶è­`l¼ä ™¹YâŽÊ¡HNLŠ}Sï§SD!(fŽ8scÆ!ÏÖ@ô$œEŽØÁ¶ ÷ŽWÑ(iÍ*£|•k;4aý zB¼d ›´rÒ¥ šhÎo)ïÐìm›ÞbëÝCƒKƒéÿ&¸N<2¼‹³ÌžŠ90› ´C—OƸ…­j3–ÑŽ*jEäI01nÕØæPRˆSf’Wk¨œêM®ðþæ4‡éûSBécŸÙ‹b ét—`?íÇ{v;ò5ô®ïµQûló7NÊÜ‹gAš&èbzκ*ÍÔ$Y² ³(Mù,€$n$L@Ê9Ûã«!¥}Ô$8©DÈbâ9Wó*Ã'Õæ€Í_ÞÿH–s_?(zÒ™}»k¡Ï ¾Ð1Ö• ñvòâs~EUÿÛcWG¡ªCµNl‡ó1é1ù} yOu8‡~ª²ôö¢ÏW¾-ÏTe:SàÉ{ŠE﹪œŠ])!¨QS>±)Œ®Ò¨ps¼š’€iV,~H”˜xó‡µÏ×ÁërÞñ€çä-¼»0øßвIàzÀ×gžN¥{úETk+8‹ KeŸÝ:½úH Qq^ò=mgîo¶‰Dĺ=X*O°= —QRµ` …Q'íäÈv¸ŸMŒ2%匙¬æé§9/ˆÖàð³qD'–ì@€œ½Z ˆ4S=^«û×G“jw¾«Vu•g¬Ðè+¹^QÁüü‡]lÅE}È¥<ÆëxY‰šãjGRU©¿5 Ø!³‚$£Ÿ‰ÕA‚p¢+XléÄÁöÙ WŸîË7]ft}å®L°*ÉÞ‰û[¿VëvÜÛtÓ‡2¨é¡>°ƒÖVõü…º©qÉ3‰”Ñ;Ot™¼!•Ø›§øØó£¡6#H}¨? ïÄ9‘¦Ö°µ¦Uâö¨7vOœ°7{®-øí2îC]êNhõˆQƒÕz· Iƒ)!ìˆaiUUµ%[J-7­Š M%IkQA òfj÷—Ù|°W,ºm˳wšùŠšÈ*)XÛê–ðˆ*]E°ç8çò™9£ãz§äÑd£ /WÏ•ð¥·×ð }b¨6Ï:ËîÆ*U0¨õ¨-ÓäÔ $(c[ZñT®UÏÕ †8sèî$¦2»ÚÅ:äå¬ÝÐa0Zƒu}j| fß0i÷Kæ*k5NzËqøbiqx(Ñ ]ÕXà\éÿ3 g}©¿²TÞnqê€3on‚Œ ¹d%Wgœ'b:­0t]Ox$-eT sŽ’ÀºÐl#©#4;f‡1´ìâkúLA>¼7ôqL óÄhN¨«LÿÆljž6¶0Ïšª¢ø±=˜@Ñæ¡Ÿ3†ls†1W þ!ê–øXϦ[áO8WuT’Ãé89[’Ô»fAV¤èñ܇AQk¾†|àV7sôtg ¡€Ö®4Wwô©ÃTI"¨;Õá¨wïT®X‡ØQîhy°jB±eÁÒ¹uó"îŠî× Þ†!nºXýOÍ Yá-Žü?nU$öÃùµ§Ð…aä÷{#òÐÕAWý Ë4¨ÐJ‡„pˆùV/˜zêÈ'þ(ây¸¢lUò.&g+ZÈ (@¼ÇCÚÄšZõ€údÔÏœ©ùSÏ•·} Õ :,²ÓCŸœé”‰ˆÿ“ŽLºï¯ûÏáÉ`Ç=ŸOp´¤uËcG ÜC¢fL9î8Áì‡(}V'i8ZúòÐg‡Ø}¸0,i‚hþâQ:ÑU|fÝ/K18®C¥gO š3ï ÌŽßõºo–[½†.€+.Û2‘Uf žd…s{CtRÏEÑaY’³ }=ÅmÇ5fÂDm„Ö1ñ ¥[g¦²á§@R7bÅllÛöèL ‘*X€ƒ…*šúI¤óÍa£mÛ|Æ ÊÀÐ"Ûìüš9¬çÃ#”*r^%ÝŸU1ÒåäWš’qfT»Í ¦>Û5Œ­NºËÖÑr¥ÝXÑY¨[[èšþ%¼¿àsÌXÊÉ\}þá>HtmB.ôðßÛŠ‚MÊ ‹À5£ÃKþ9šI—¨õ4DèÔö㹕؄å[„ö ÒÔBF¨NB& ·®iéód<À‘1„àYH·ïŠq“pÑhLcÿÅ0¶¾ØÍpLäÕZʧœÆ ž’¹î!8fæ¾Óná῾»ÍCÂk¯‰Øv²ÜOÅ¥ÁŽÌiÞ"ÇÛ5*Ú¬‚1Ú@Qûìå¸A*^!÷Ž‹Œ9œŽÙ4™DY ËZÜ5¦Ì,»0y³%æzp|ãȳžt/'‹Z…46&›œtõ©sƒý˜xöWü%}Úbuì×¾d¸ÄêÜfÔHÈ”Èb•âh‘†MIIgª¢$‰ #{Ñ)ðctKw‹Æ÷z”¢U,¼«ã‹$ý¢­Õ1GÏ Ó’ÍáØ2ÿíR®^ÓV (¹ó˶nºÉ¡ÕÇ 7’B éAL4ÆtÄj­”¨ÂÇís¨qzúÒ´3¬±¸AÕÙ!›‰ý‚D Ü‚1k É ˜:" ;£Eʑҹ?´ çB­ /4/‰X–ú$á”J(;/Ê5¬Ý›nŒh:òÍH¦^@fm–WzJä-º@m‚ÀžÃ#.",[¤i½ f7q€¼¸g÷”þ8œzŸˆ–ãˆJ­A|m’~€è• ãé¤ñµM§iZ\VÃ3·w ;0LF7Øõ•Zld-f’¨ŒÈr€ÎÏ¥ˆË«uî(aÁAÒÌiÈÆzÅ6á è§»@gI“¬L•PL¯ÜBš‚„V Ãó.FŠÖ¡ôŸ%PâJVQLTÙ­œ’Ü@†ùSIç½IhžI5º¢¦¾F˜à„Þý¶ï 7Ã8ð𰘊”ü`D¹bc{^ïÿFœp'yÏ~ïëL“ô8°·=qÞÎõ@ô½DnY (ʹã¢i¹šRç,À4j•T'5¡Y8$O‰†Ø_&KÐ=zu ¢& 5*ÏJö„þxÇ.ÁÇH¿™«=j˜ØôW Çéÿ ¯lÁ9CÓ‹[ú•öÌ{iµ½¦Îçú\Ÿësý*÷òçX¶M6y!ÇûGÆçÑñ„¨!³ ¹§ðÁãñí©Þwð¿²H·m{<¿nl ›ÀÇÔœYû»ä‡tó “¥rÙ?ÆËÕŸëmCm ø/_,wRQÈÇx|ìç7#þ¹… …뇆FÛƒþHâ‰î“×É–²"B¥¬](þ-5F0´ÛÑ´Ý÷Õd@ïã˜K¶l©Èæy@P5BDB¢"õ!”X¡y?ú‡’i¢¥†ØK¥©{œu]CK,ŽÞ×þ|¦%Ã=8屡עr/×z<4!†õpúh¨&—ç¤mxN8”Gž0¦<(ÛvT²í5ñÌšV#³,' ÆLª%ª…ºCÏ=>eïZ€hŒ\­¦½Ò-ÒÜJõ˜£au?* *ø{÷o§Ô€.¶ïíPmaÛ!`¼ç‘…VŸMÛºÈ&T¿ÿ†º{QÙ‰ŸÆY+ ée$š^+݉ÔÁ²m—XûUR©ÚÚEÏl‰ÅotFØ0t’ž“ÊèXï;ëVšLFo“ä*ÅÛª ðqèø‘ƒßÐ0àEµ×W&ºh6—2wŃÕIth­‡h—.¬.·ëÆñŸùÝ=ÇUM=}((Zj-W̯˜ÚuS•ÒÖêôÒàéY­‚©9³ºuQÊH(‘»R~÷•ÌÛï&·h§'D‚ÒкI]«é% xⲫ™y–ù©ƒºäý°&ãÈÝã!åNô îjLaNfI™®ç7P}®Å ó:Q^6dŘbĦ2´à¡‹F-T{Üu&JÛÖ!g,kX½.iÊÌò¨”ÐY;öÐ/º{®k¼8OŸ·*4æõízn­^$…?x.| §Dé8K ß1 Ÿës}®Ïõ“Làû¯ïÞô9¨wËÑäÏu· ç-xçbü-³³~Ü•» Ðæ%3ú³D~‘ëºû‰¼7·¯¥Ÿ;Zfùs½sœGUU{½ÿˆM3"·~õ?ßÐ þ½¤óÇ~‰_v]É ‡ƒö®!Û›QÓF,j¯3W?O û.hê¥8Å7ìe2þ Íñþ†C}ÈÕ|!~ªuGÛ£]ñ›¦™†ˆûQ"´˜Ò¶ì!>‡ï ìŸv]ö»³ ‰gVB*© •mïCZðÖÃEtÚlº›C“û'R(û=!Û)!”X ùüŸºˆm@ 8ml§rÑõ›4m\@z0‘õ¦#I)Ðݳé¸S ¶ÛmÕï«ÂC[¥ÝtË×­tÓ“nm®Mr}âZ£Æ+T{@ïœÈjq%¡ÔIõijËÂðdˆ²VõÖÄ‹ú¡8xi vEì&gø+ôÖ –ì|2_Î$D;;æ‡bK¶M•5²{è¿€Þň& Ž¤d§©*â š¯óž§Š›mzd¡dÏÝÌ7RŸ;²Ï…*|”#ApWO›ÞWEL b°› I‹šÇê¤CþžÈd³£L÷òUkÑ6qí±X í“‚%Ÿâ™yN6`•ò=!ŸYuý`tWuE±ð™rªF§ë¼Ü{ü>솲Žc›ú¦[žŒÂ†Ã‚¦=dªj’­Î¦¯‹9™ºj)k‡,½ääc§¼2$¦î³jöñ¦Û©U^ _ ½i8 ´ß·W\”­Ë§¨ÊŒrZèÈênïc×UVðè\SÝ!È Ù’ànúO)¡Q°B8m‹Æ ™¼\îZíOæƒ2ÓÓºÇÎ*kÛîÙcÚ³yS¹ÈØ2Åžg§Àä¢eÚÕöŒI;¢²Ó­ YqkÞŒ9)¶ù2âH,Ö¶HàÌH[š¥pÊ´¥…j„:L„^¥<ñ­Mö.­^žÎ™*é8g!œs³‰Lû—q;1Þ0+® ¬k|¹ç8P¤F‹”E¡Žó)€¬æ'ËQ͘þ‡’ÙEèyW]fœë u7ÜÖ¿…¸3Œ怓ßbx3%ZΗù*†i †^FšIÛKí°OQ C©)ieéÖ8å¢5øu¤ó†j¹ƒÛ¹ÀØœd’䃴à%æË‰£þ†kT-˜ÍB7Aªn•Æ.ÓzyA™•ìËŸ= âŽ3ëÜä´ÌâÖŒ˜ŠAÝ÷ÁÐð ˆ2Á退,ÿ©+Èõs'÷´®™°_8_°éTMjË6Gøèì=íøC@ `L{Æ4M¬ª¾[+*ç1#žÅt^Jb.**0x¸¼ehîa¦'µ‚{@ˆ>Yš¶n:ô®%¨÷†Ôù¡¤1OŒîP`/а*—I2a©#`ꛀE‡X¬ÀúX@5™±ׅϘ8½žžRK{Ôq¡¿OLkŒÊcx¶å~D.5™©úúÐTŸJÊ=Í×ó!qå±%ƒŽ‡Z^±S@ïî B@°6åIëQF 5`pµÌQ+ý@õÍ¡¶ÆÑí0ZFŽì¹ºo†*UâÕ{1¼¿+…SE½ëP¸Û„˜¬l–»5>MŽ Ò…>Cà¬ô>Ùø¦!—bŽ'Ö ~°áº‡ÝáÙD9šÙ&‚XTé@/SžJ "·Ø¨/ˆR;—çŠéñžV¯F§.LGLÌþ½èIPUÄáÍ}<£~À +`¼KÕyè_ —CÍÄÔ)88ÂÏ + ­1Mº‹‰N>+ª‹]”¯ƒ¤¡0vó0Tû¸õLýä%ÜÖ(&–r’šL…2õQUI;rë·XÌÑõ|’/I’n€mºßkL²ý1šq%îµ^ÿ C‚×Ý_íËS j(×{w‡‘ÓVK†ÃeˆjÊöƒ,9U·Ìµã¤’%={/Y¯áÊ’8Ìó˜,Áb¼Ô裸3r2mÏèÄÂÑ»N€K½§Ew;DdÛÌ›ðÉÔêqat8È$’>oõ`PYmtôE#T8\Õs*ê˜L:¥p ~îF…¥ ƒ<ŽÜhãR_‘0d¢¬ís"b´àL²SHêi’¦4q?u†%°IDÜJvxäu¾ *yÞÇö kXSÎÚS[*Çs”F.˜0™ –ˆu€9ÝΧ%x§K™mdÐQö‚TCT«R)ÉÑй‡Ë¤#wDœ³XïŸ O^*̃î³'éo!‘8[iŠ@ ‰*µ¡*“-CégéËœTµ{£¡SðÄå#83 ò=.¦¹îa“êЗϕýõ_7¯ã4â‰üsaò{ªùê„_ήt#–üˆ> Ø&CêÓÁ!0Qq]Š£ ž š—öÔñàFÌ8WMÖKò´ïÍ-Íx7»k~àsïŽQ~ýï ¿÷¸ñêrú–Šx߃ý°ÆLü˜=»ô.¿¡[߂׿³uÝiþ³ ¡©È49ųyšábÕS¢À£ƒ_îjõÜ?\-õ9Œã‰u±â5G©¨Þåýg 4! CgèíwL,­¹7ñ-úñ¬7š*>BÕ-ÓÝŒæËq¶)+ÐqCófÈ6.ƒ®I@U#òÔ®÷LlÝÿ*O.ÿ—,¬ÂÑ*qõeñ)PÙ`Ü´Ï®ïÏ#{Wò¾ã¡Ï–›ŸUB¿÷,Áíö÷àEyÓ#Ÿx³:X7ò¶ïvŠ•A8þf\ç´ œ•!êéIb  åäõskeÀó¯”,IseÖü’PL$Í•ö)'…§§6‰{A]`ÂqM#¡‰9ôõцËåû\Lµi/9ÒƒÉ=ÜM»NY;ñlVPÒ¬bb†K²Æ¸1­€î£+Ï]&KçTº‹q¼MJDÑÙL}²©lXN%“©ÄX•õH0C«Gz3ÖãULÎæFâ¿áŠ0‘Åbè½0{'*xg.CÔÀã㤪}¿bªpY”ìÛgZíAŒ,€xÀ5š'ކ+ÁýWk˜†4еd:06rb(ÓÃר •B´ùx"× È¹}‡kœÀ„þà˜Ð " yA Är¥™ÕúÆÐ86«çÌUÿ£î†Rò¾KËè'Ç C¬©R“`¯}PTœ! qbŒ”Í%K³Ýû|`ÏÊNB¿Bû¬¨»$q›…-z.ØùvÇŠ!ÚbP›'ÓáÐ,#Ö+KÑ´D8¦wTdž;Ö(´{¢X· `ÒOú„$WS‘(&{ê*V+ <+:-b(Ûõ‘dû¼3«AÎ×g¦áIr‰öÞi`µa =œujÓ]X SØMôŠÎªª§á+à{Ö®k €Z–-âÞ¾g_åø) 8Ûô‚‡³ˆÞPìÍb¨eèd¬@-ª„¸Ø Û¨êœo[e”ÅÖÙd˜†|¼œ³½ E—9OBSú“‹ä†.@·ué@"ÏVƒCÜß.7xÎ ëO0áMÈÉG”+©ç)‡ +ˆ s) JAUÕ¸ev¯äa÷„55;##†É4FúÍ%W0nu)b‰Ì;Ÿyß ýHb‚vl7ð{ A»¹HVQVCyø$Še.†µ2#Ú°\RqîôÉ=ÖSŠ×N…ty©œçžv:c A5òúó@¹å#ÙTS5è{ÄNu¼bô¢k˜JIy¤ù‰ÎvʳDW3g…–§[N2BÀÓ5ght¤i v¿BŽ¿Ä®ÃÃÇ„CéÖ”í gË›)@ƒêȘZwdZð¤q+G3¶Ô“®´uFÖ æM²:ðŒ¾O3ø\ç!3"ZpF'&¤O“eãþFÝ’DŒ])u uÓBC†ú„1ÓÕ 7ûi˜n»ôH¯ÅT|¸9Іõh?‹t1_v)/K1fÔöXZÕ!®¨Ô©ô\ÇWÐoa]ëa$ã*¤(¦å!ùfö¯‡Â¸ÿjÒùHÆñÏmÙY 1bZA*°¶]´)Uvx…žs­¬<À»«Ÿ[¦µMæ@œ çõ<ˆU€µÔÑqCšè„QÚ->@_q¥”|‘ç$óÔÜÐ x<ýa¸oL¼ã ñÁê÷ϧfr¢ôƒœ½gÔ5>Ü#æMq@êXµC›`*®‰òë-¹0×2 ïI¥©€‹¿®š÷=ì$Üÿ‚/½ù¦FšèÄw¿Ä€¹vçõ%—V.ýH¾n +;Yn×`GiÛÈz¢®bØ“Xt)K”N«V ˆ­ú϶Wq9ê3b¯:Æxy0Ýl1s©=G@7hí3þÝ4¢Yaܪ¥©åÚbå!ä9ëå» …Cñü÷ã²AƲEÜzGqž 9a3ñ©…‚ÚÄV$<# 7åÙ&7’þes†§»‡7œ3w§àÌjëš¡ˆçÛɇÂ[Gèå1â|¿ÌáÚÌó+ï½+ÚôoຣøÎuÅÌl5ܽìÿ—·bUg€AEÉSÓ÷ev”_b]o{ZSн¨d»B^Îa}™’ÇÞÒŒ,])„Þ ð%2^"žLÝ+‹ÀAWß\7‚ÿü¦ûó»ºOcË{\-¶–&áA¦;Š l=±Š¾t,º‚ß;w‚3÷ÄKý›='=±¿.6Y×_¼ÏŽä?±²¡ïë°„‡oê: ÒÞ?èfH–‹¯@ÿÅ•D3!«ç¢+{{ éóè@Ô=^á/!w¿ãYÈ¿›«áú­-U†‡b¾ÒÉ•á{uyØëƒQÿ/LGlÅ“èBÛÐòØб¯$P‰Kâê‘£¢T`á8û¤‰$XÁ“™‡ISjå’;¦AEFR£èm"¢öÖh9ßÍ+„òØ÷ú ÖßöeƒFzkáò½>‡Øœz}ÈHsZOtèÅ2„>Ù½2x¦:לJÀ¢psŒ–•ÞÜ¿¢ߤýZªæ*Âê®; ,ƒbù"‘=Ü6Q,kû¬(rõY·2ë@/×OOjáW¤’s ’æ c«|)3 úE)æ´³ÊÁ wvò~ š!a¤¿'šK"ó<…EÂâD¦©vÂðw+¬F§¤.…šúºÔ·Þ;üÖ•ý÷ÞIG“€D0ál¤­âsƒÃÂÏlãZMê[QÌ‚@ ¶™T ¸ÎYsTÚ<}eÆ¢f–*L¸<4éÚ21‘>šWÕwnG®£ )W ÏÐ<:#ÑÇ4ÊöGÆ ÏÀ®* L/JÖ oØÔù}4yxŽè«³·(b}Õ õhê ÀRVÚ+ÝYAZF»EÁpç±j:ø21¿DvjYÈÒ8‚Ú”I)µ´ôFápo(¾î3áÏ3ì‹Ïùsâ¿Zi2L½›;?ê´øÿÈqPç*%ÓÐË?„ôD.ûü=LØkTè–¨J@ŸÐ"jÚÖEjCÆ’ùг5\ó M!m@Èü|žSñUµÅD6ÍàEV5;5›@ÚHmãZ‘»¯ÔR´1âiMæýUê ãÀDÎ*µ$­iÛ’ä$Ô^3Ô&2ªí\dÄVfßu“Ó9ÏMßÍ/Â^Pu’Žæ¼¬:¨¿Ù"ÀëL÷ÎJR?=›ÐÝUË•úÔ»æ4™QQr¡ð ÅžO9]¹a@qü“Î¥é$„»[n)¸!íCœÖ Õ AœÓÒ rŒŒzøº#dß÷–y©4ÐN²¦H™àì'rExrŽ tè06|]yTÌÉm Ç:ýç1MÁ(JD—AĨ³=‚6­™c[ˆã3SNC@ÔLf‡]ú!‹)OugÕ&Ý,[×_‹IP8^¼‹dz:™ßL:o2ÍÃOh>dŠ@ÛxA!Tön¸näEš„;ß™7BE *ª (X02oê¨îŒGe¦~;пÎ:uó±{Â,H9.üçÅz%2r×)¾ü÷á è©ö‡—ÔEä㎩³QáNm¯Qô. Xä§[åýÄÉ£@ÙmbÌá/¸ž×òÕ=~)Å:YÆSÄ? ó ÑŽÏçX3*L/¼g¥•ç ;ñsæ"Ç’®Œз¤Ý).“ä;¾ÎòÎ[òU[‹¢øs. ƒ<¯àÿÄÁÿ+¹–»OŽ£7ý ‡lñà<9X[;\0°GØÉe±¾˜©x÷\½Þðžò ñçØ ÏǵÀ2@Öš—\ufË!S£ˆ¸ÌËss¦`´Qâ…€òüêiR4­tðåòa?½TÀºNæ|?4S·9ŠõQ5þÿÙw÷›®Ýà`"L½ö½•௸Hå&ÂÉQ©; ¾ÍS~ð‰ùÂ…Ô¡5qÊ æhF*¢3_ùëÛÁ5É®X?Ý€ ºúÞša^ÛØ‘ëÅÃÌüdy<³yðJè•غ¨+û5¨••HÈF9E(J˜E¦Ô¬¢Nšìïè¡j`âÔšÃ{i'^8õ^Tb?׈þÃIç­ƒ®ÏºŸ¢Râ¹ÍqÂŒ[Öþ"Y³¥Ì,Â7ce|)0ÉAçuÎá×Ò>ßê LÍ&¾!ä(É~f와‡÷œ´zE¨h³fèÁcÔ•1öçceYÔS1=O8=HK1Ø,žÃi,i¢bŸGKZÛè¡=›þ7¥&Ћ‘Õª¥ÏD&Ò£r¾á»\¬Tf²Ü'd–i…¯™É“F'áKúÖ*C†•”¼Ø’êý§]8:Êfvþî\éD')èòÛ‚ç¼î¥Õ˜H4Â6AKhéwU:ᔄ‘0KafîΘ:Îò\±b5j¹©:AúdË“=`U 3X¦çY7ñxÂéxð¡[m’ç ÿÝ:ž}Å~³îx4kmŒ.2 K/²Ñohh“¦Ÿm‹ÐÃu4Ôâ9Q`ºŽ,y ÛÿA;ýà­›aÐÖ–Èš.d'xxÞlh(êðgN¶ç« ®ïwn]o4Dñ±‚ÚQðÛ>®wÄmBè~a¯L¯kïF:D'R„ʤ©ÈèæG'P“kÈ’Øy¡„±,v ¢–ž@ØûÌhüUñ?aØTÏ_$ë —cé*ßÇÄùØËàßÝ{ð­r£=‘nÌÛ#òº?(§Gï³>©È´ &~s§Å/)Go4˜¾è_ßûb×UÓ' XìÁLiò\Æn+;ÎÕ˜7=*bû&ýø> Fã øÒ~ô¤iŠ`°Ü0¡u²㎬ bƒÖXVjg~ hOe©9³ JÇKGØÝŽ–®h?‘ðAh5ØRÌ ”)YÎνIYSl ¢QN”Q7¶¾ ©€XãÿŸs‡©M$;ÅyOØûÆA—´s*;èסw$ŠPÚ»î$îz§š5É;ŒŠÀ€NFi×Ùê²_~£¯·Èp­žG³YþZ¸;•³­³‡a]&dªÑºä‚–6ow’,3‘iGXbãˆj¶ÓásþÎpÑê \SM .KE_]Ióø` }OŠ‚á"¥Ì^p£i[Xõ™ØJ%(¯ˆ`B4ªÏcß'ÐÜ6ƒì71ô‡ …(V9³Noæ$‰L êpgµÙ5²ÿnïÖV’" !¸ßܧ&Ùñ†j'ñ ž‡PÞ¼æÏ¡ ‰ï«É)8õ"†7Úq‡ºªÓDñÛ¦\}`òvš‚t?!˜©ÜÁê¨{¥Î}ĈþKÑ€ Ö–˜x¢žtbN¹³yéʹ„x§«½…€”ÉÓ-÷¨šäjÜ ÿð ë(³¥k 72de--·Ôñä=™kÎ7x6R™#JÛµ#<“ŠEqe 3öªÉ23”=Ïõ/±ØÚrpìF”#ì8ëQÒ°iŽ¡í…”PüQÀ›çDæÅ@ ‰+l°CßK„ÒÙ3[Ä~¯bcˆbݶcNŸÈƒ·U¯|NŽ·%'µ3¦…û¼rÎâ\E"0w'~;é¼~þçvA&”µ` (4¶£gUïùÎÛÙ)#uKhçüŠD€Óº Ç3¶ž‹JîÙU8²µš%^ rNÂLô¯SEWX,;ôI³ |4V¸åSZïê…“Ø{«d¨îHå.äî1ÓOÓÂ'³®:‹ô ušŠõ˵Sl\!,ЀäÌaìµòŒ[—׋•í‰æ ¹Åt’Sc>œÐ¡ ž3‰Srî,vqD–•WÚÈ8¿V˜?˜#½ÃŸës}®7™ãy™û9ß|¼°áçú\Ÿë…ítØøú«ë‰N=ïFlónÉŠßÁ£õaûþt!¬˜×½‚õ$å‘ûÔó %ÿùí„O÷ÉP<ñëIçïpË奢š= š´¨O¶ª€Ñß?¨á+Ý*òOÛ5öC9׺½´êY1vrþm<ªb,ÓÂÖoo: uïɶîýÊŠo'ËBa0%€æAÕO´ŽYEôŒñ¡]…}õ¥ý¯”QCéÍÂ+x[£ùDÿ’ÅÈX`ÐåÈE°=Û˜{Íñ³9ê)"`-¦ÿ¦Ù}ª“‚¦”y£ûœ]LÞQ(ÊÎ@"9SW"]ŠVUfä÷tR[ïׄÖxMž%¢[×SgãûÑ„2£ñ¬=öVU 3 á'CÐ讣RX`ÔÃ1„°;QíGÕ^ rñà(TV‚­cÛNÉï³×«ž¹·ÂC“Wívõ€¨ù®iV¾³= –g„ø6lµ•—+DÂf²6^Û ìVf"¾Èל³ (—ų;› Cýd˜(”t8zðœxÏK3Ñ%Û½:Ëü]-`¿ÄÈkÓ­E3‡ÛšŸÐi‹™™ßÿŸ=Ÿ¦©æü[ŽRÏ`ïµ¶×´ÃëU"´!3†ÑNÚ~QØn†6¨DÍCUGϺÍö"Z[|³»š£È@ÃçWŸ#~Ð U¯—¨¤+žñ̨±Ž=<ÃQdx—Ÿ_Gá­­_翚4v ö„L§Nû?kÈQ$>B9Òy¡«¶Žr«7zèö‚ÄG5g§ÄÈ»õ“PÉ®]X§½'í‡SàO°¢ xü–û-ë˜ñ¯f[*RÃE(æ’´|@“EèÏz%PiëÝ8Bur“à°Þ$†ãYãºDÓq ïPÆl< î QÿâÐI<–IÞ}È¢YÅi2Z·(Õ¸S• 3ìǧï‡Y•ç¡ù*ue\ƒ{&•n“žôIa¬%L’$® VMùbpªÿÓÎ àvïÑ‘ƒá ?˜ú±Ö:}”¨ž` ´ÉeÄÕä*zÆ0möÚE¡¤T²¾Ý” î*^$"f—~¡ç¢åÃÓO@W½Œ@MàHW+)îvwÒ óôEº‰’`;ò}Oáö4_))+gËÔ‡y{v¤èÛ7ŽW½5ç]Ä{Âù ž”#¶bĦ@Ç}@*89¶N?¡ Ëä1na>KPãž™¾+•n ׫C”ÁÆjî#’ÑÍe['’<¶3OÓ£äCuJ!Ç[ØòV/OßTJ)’çùFœ1ÀÌ­MGá™á˜ÐøV,K‡¹ƒíÊßG:Ÿ.Űn´ŠbË!¿S|í«òT& hη¦0+ÀD⮕f,Rj—¯7k8c>¶œ RgÝì7„í(Š¥z‹ünÓ1t½üVù—9ÀãWžEú$±mv9Ù ZÌ\lƒï‘µ¸¶´énŠŠEŒjðoÍÎW½¥U"®$gõv "•ܬÚr°Ø¹¯hÖ•¢ ë°SÚtÞ0l—G‰Ø„Ø8ŸP\gºÐ“ouÉs¸ÂRŽ™Ù¤]3$”£ŒžúKëaÏÆ˜‘/-?uÂ>'DÓÍj 2oOê^–ò Î.ç&ä £=Ê­í:ަІ> …æËæGLé Ø?àÐÿ|«A®ñº…žB°Nbv\yI3}â¾§&k¬ ®Êú8(×pÄŽëOêCã¥ÃÛá”ô#‹3??‚Ô£gyª.:6˜¤ ÎVY ÃìïOYð8ç„éNtZ<Þ§=ö Ù¥O(j!O¾rÙTîjU"™õ&f2¥{õ”ÅÈ‹wjS¿–Ê~õ:²ìhàyÜ»~“3S׉J–>æp¸†*CW¼Gï¬þárˆQû¨ìi`«¯ã0¦±L9ï T”<ê?MÅ0±\´6T”·½ØBw(Y”ƒü “øÑØiïe‰ŸkǬ™$ÞÐhdræps÷ýlÒyqb‡! kÜà_ –» VËsj†$¼’nåî_î£y»<1\Øúû3xåº à$w¿òl2îž’ôjðôñÒÝ1,Y½Ø9Û²¶êСp…qú66ebY§ü?âKÞ9er É ˜´O0ù\Úús~Õ“êòæ7í g{ƒµ!üº '÷wÈþ'H;>ÊŸës}.þ‡¿ýþÓí—]Ï9ñ¹>;ê}ƒì„??—Mâ!>VU«w|®Ïõñî{´Ï}îÜùõ¤óßt¥Ú~,óc UŸU7j8­7)Œp6bã}„:CJÔõï_¿þ*ædêÔí§¾Ö†šQ™{O%G÷š«Ç©Ý6LN¯OëöÑÎN¸=ížßsǪš ¿ßéT³Dòê0´Ê+ڞܰ࠳l††x<žü?îÎ^2w0Rí}S;WmÔr¶X?98´Üå@©£ÿ–騥a…ñ•z]·¾wûÛÜœêeó 1m¶w¼nïɧ!‡p\ýZf†v)ø2bÒLÃØêí9 ™qÒ~\ÍgÓZJõry¿Õ– v†Ø#Îä¾ÐI{s»löO=Wf î±›NÏ'Y\Ðs¡©‚#G#ßslöN÷¸š{¿rÍ`PªÒ~ÓZ¾—¹»2¼©b ÷æ*ÇÆÇ­›+c›B3,}×À½…ØÎ*ºÐón?napÔ=lz/ßài\ˆÄ¶>éº&³hL»Z%Ã@¡îX9—™ã‘bó`‰ãÚmM5h¯à]ÃÉŠ‘–É4ߎ¡hX ùû9}ÕlPꎺÐÿNSR›=N/­R’3ƒ-%ôUÑž!¦£¢RçÉ}á˜îàá=ÃS] Ž3ŸI®v7®UÅÑåæIåeQˆ×DÀ Áq˨êͱ8JÝAâ’]tü[³zÐ^ƸŸÆ¾îŠGR„±°Ët³Õ³‘ÃÊ~´ðZW€³Ú·KïXŒÝATŠÃ0y$Ë\Ùk‰Š`ï TÁi ÎÈ`td¦­òSŹ/Ö®Â}2Ž»Àu¥gá銻 qÊE{xö)÷õ‹ãTŒ UWœIãà´×ºš8!9QGš(jÅl¹_w+©j]Õ…Í 7Ë¡ÇßèÔª°d˜N—†i¨GdÙ¹)9²^­ýÙaîô·³&¬¾×Z eÆhºDÌÒ—Ÿ„ ú3óX•c¢ö=²wޤOsÅ㜶HÛÌ?YL ›±@ Ýcß¶R×û;9\®I™†IÑÊ0ž¨prŒ n*¢¤¡>H8·7:šä(Gæ<®ët<ý: pÍZƒ+ýbÒyIHç™5SOiŒIi´_VEp%áÚJ±ã¶TÁÀsÉ@7·Ó¤·–©¼±õÈÇ‘ tBÕaÒÆS*άáÍ«ÎG®¦ßçÂatS&1ÙÉ{¢÷yŠåj#yl£ÈóÞ°ˆÈæ”lS$_|2DnMTÚÔ0‡T†K“"<ÂñWí®¾I*c}ò~5ÅSö”€)ª  … ôžØšª…=Ýw|Ÿ-9£Vãó\êbA¾qDÃZTw  ¦Ô`l2a×{ÑšsäTâ9qh/+U÷–ãY­cîbXU~èçq„%ŠóÈ›nDÇ3ܨ‰ÂH-Õ’àÈ õ —äÝûaÜVƒãÅå1’JËvsêu&,ïÜ=mÚ8Çý‘å~£ºx$ß§Þ7‰{JMLþ¨Ø21Ò³ìO„ˆ,#0Ã)<Sº8EÅÁÄÀº,Œ²Ð-–YvÖ¿äœ1îhe•®¢BZ§)ŠÌè-|zlùϡ̩að53® wHuhråA+˜ÌLàÇÕy¶HÇv’åžã`L#šøh(]–"€ôN8&O:I„U%]RytÞÚ¦ÅY&NåqÂX0ŽUq™@0E”ÑÛ«5fhAôáØ±O%¬=¡dÐ+àu(t>(}6[£6k07ø´ñîWØ`áM–›ùÞ£o´Vyù¹¸DËÝI‰Ö^û‡duó}H6lãØTæ{@ÐòëÈ!ÝÛ¡óˆlö]™ñÁ4¿ÆÚ0‚“¡þí:{S’22b—‹Û±Ð_áåYqçqw9QaŽE @ü8Cb'˃‰bÙTRz4Où•é8DÛÂz¥Y4ôÙ°3¸EURÄ’÷$´¾ÃµTÁR® (b‚“Mì'8ž¾À¨õLN_= \2•I‰aV‡°Š¹báBnS›Ån7Q²aexËjëpX$ÄcT;t¿t!Ò Â’í$i¢£ËØÀ¡&.ž‰Œ¬ÈÍý"éÎZ¢D¤R´Æà¬ÅÌ<ÏD’ñW¾Û…ƒxà¾ï¸y¼nϧå¡T¼N ‡d†,à‹ƒZq·.UvïÎé/ž'`Š]ÐjŽahÃ8Ômÿ!Ÿnê¦TFpJ”rá3o£Øyç^ÃÈTá˜ïwå=3î©oÚÀ6/È—Ø“òö 9Xr}ø¡×§Ùñs}¡µ=rŒô‡3`‚ÿžŸCÎsxfüö¸WZí°!Ž9ìÎÂ#¿h_~1øe•Å?˜Ôå_D¡¯oÿçR­.(+•35Y‰Þ N­¨CÖË· ›IU#ósއ9ÙýS¶I}{#¶R×ÿå§çqÀO±âßÛØõ&ç_¹kÿs¤ó‡œ*¹ðK‚Á,Çêû¯Ë`"ËQ(Ï3†åÅ£ó/…ÛÈ7QØ„€!)cU0R轃º~q™r`¶u RZs hu£Ä´ *$TTÚÂûM×w§ð©î@êN3ak’&ù õ Ò¦M²ltiº¸Ge¨zéh¯‚Þëñ5Ç}˜F £ :ÒWO(jzegŸïBØ^í1y¦Xû9hà¨fy7vŠï§•fê"+Ú…2Ú¸t1²Ë…,â^¯ßCà ³¦çœ9'š3>kí6B\]vbÈÒäAñQÁÅŸè½ì°9Ø¢-BÓMlh/™e)\7é•aŽ^Ì-FãH~µ?ýmãBZ•Ÿ=†)¨O Kw»`FiH÷N>3õßv=µÈÿÜân0§ûVÅg5g¯P‡vTGŸZ O³Ì o.>‚§ŸÆê0oî}–g»Æòÿ*éült}¬X§a°âhŽÜÉyÃ<‘€AHv’¦hû¹Ú21å£JhRéV ÁAÑ$P[×Ôpd´Ó>*-sš'Vìy‚#ùmˆ:6ä‚/tÀ'PõÓ‡Ê( tŸø±ÇÇæR;‹°ÝΧ|—­gÅ%ö1žwžq ¦™³}±`˜‘Ètî‹û{¢Ç÷‘պºmq°}Àb¬ Ô¨Gk÷éè¼ã£sÛ›C5†«$7ÕŠÁšÙúƢݣ“oS6ZÍ¿²&C8€S§(…R€Äþòš@%ˆØö~nm‰ŽXžÁ®`q+ G}Á ]„òü &6‚´¾!›Ð»Â„Êu¶ÈTóHºHi Ö‘_Î¥*0õ¤¢9eZ#›‘7ÀÕy¡¯X8‘‘ÄYsƒUO*'Æ–‚#¼ø8[gg9"Öv¬Â$†‘Áiû}F.ØÒ9|íŒfãùf"ÞÂêx@F¿³>É`2|ÿÒΤ²ÏÌø \Š9Aà3 IúøR„oLôÃ@C  ¦ƒpvËãq <7P1z]sçÄà¨ò^½Í‚öì]}±/¸ÇY´i–Hö ZU­›,A™áþ¦´ú ':ë\מ‘ȆÙG‡>K]"ÒÁÍ3•œXI`“1\ª‘ ”ó€Ì-°6Ô ¢$Þ.&<’©V–`ÜÑ¥šPÌíŽÜ“)ц < Rb¹9ªcüdcý¶( ̆ˡö¥\§~Ké#º›ÌÐ2å+¬Ð7æ&ÊEðÌ ¼I,íC :QØI¡/<Úy2íjaþ yM¡Ôñø*–ªÕQRvû#”’Á[\ÁòÐHÜÅ×TÉ0Ÿ\>^Ýj¤ÅÔ?5ÎO€~Ðf@eˆÔú|<Æ1rdORZ•³¹k86Eפ[{ÐíÌ7®$,Sv—t^ eÑ‹a&Á¹„Ú»ÌÓ0d 9š™yGÞ;öß{ªFž>ÜFDêiô_OÛyýh¹0Æ(y"æTª;÷¿´ß•²¨bpº’w«æ„Õ¹Œn”Îç*< ÝjE>”NuÓÿ~Û ´˜”©eé:ÉH°°—w’œªÑ¡ÍcXÜÎmè1qŽ^b£Ý‘t~¬é–ó¤¦*¿J*VP·*pžÝžùV»õ¼áED|þQ€|®‹î#ŸJbøJ"‚³êcÚQØNú°yuÏ¢Š„KDÜ~ÂB:×°ƒj!xðÔÓœR<Ôç 0­ê›ú/Ðåx'20çâ8}“Yù5ÊhŽa\~4Ë7~ Ü;ôÏVOë¼—ׇí'Ô„·aýBwTÖÎ;>×ÜO½¢w¹°4ÓøŽôŠÙVؼ%qÛý8Çå^/(⥯‘Ì$?z³+Í{mÈ¡5À{ßê«v>Ž/þ®ÝÉw,û×ox"(LtSwPxƒóD§íÂ;öš‘ã´É)-26@@+nâÌg•âÕ†8ÿhô)<ðH«MñS:¾ôÜz—÷{\8ïà „à…‹X使Èf_&ŸbõûÔ Å”y¼fù#ÝâH ‚_¥qµI[BÀw Þ½Yä*™tNù‚tþè1—–Þ°³"ºc%cвb%Êj%þ=çßõ'€×U›Á“Õåêš—\',üÌÓ÷Ø ŸÀæ ë)ãÝâáöózÉq/ÝÜú¢)–ö¹%6ÈŸ‹.iü÷z«"ñ˜š¥z•eÚÁÁ‰k]Ò!ؾ‘Épàs¯}T½€ÁŒ2™¬9ªrjýwˆŠŸ´e§<è®gOŒBõ ˆ.ÅA>\2SšrPñ©vÆVÊa&_pÐ0¶2 -]~4&[±ù ×Ñ%†/„O—ÐOW,¸?+ˆkËû56¸ƒsú]ü¥®œàRüšÍÓñÜQ¸ÊAùâùB”»½!]|Êþ¬Äç n1È‘$×¥ÛòŒ!‹ÕØ4qÜhŸþ=¨GŠÙ¼1Ôç4~HZ˜[ ßjþå ̃_U©WZUr›EYeÑy'hˆA£¸è¯CN©ª.ž®_e…ŸUqtÜI_ƒܳûÖ8s×0ž¯f1gJ}Ëlщ%Svµ+QÝW¾ã¾óB„00¬wRœ{«ÈƒO,U¶mçJ—åy„nŽyåû{çN“ûg5sº­íÃw£zOßz^ÿþÎì¢LýQ'‘ïx“Ãg=àø_Âù»ÒP˜¶ƒÙc;Ëgͱâ6ÔŽÑä–ws†y:‚ ´ç¶´ú‡t>Ç¢Œ›tâ Ô¬,(G«c¾wÞé øÝòdÈ#Ÿ+—BòñxHëÛiJv.ÁØâYä<öÐBÝ! 哺2#Äþß_¨xÆòþuon}e?h\YcŸLŒU"U~*´¢›*=ͰME™¯Bର.lg2A#÷|âà0¥çOA»\áu‘µí£<ŠûjnüØ;¢ Óú²ãá[V¥Z8;XóVv$¨©ö‹)2²¿aÛ9Þ?¥1Ö†C,–œê˜ÚÏ/¥<¨ïÇ{9úkø5i•ƒÙƒæþéWOjû[¦B5 ѧÊ%t²døùïýd€cЀgü†eÒ0c† "›¢ž PäÐ3ðju !§ùa:ºÔ k¡¶4мú0³a ô_Ãw‹*¾AZÇD4!†}± P€"“ÒüÑÞ;"_¥§i³¬Ç_-z°SzLm«ºÏx(¶¥8²Ñ0Q=Sÿ$n/Èr®fy€b÷Q|­ãB“+´ÙÇð¨Q6$MóÖ76ó=Vª[Þ§ÈúGq€d°ô„ºŲ́x‚b IL¿è•>çSàUsiÕÿÅ“ž~YÂ1SRžõô+¾:ìå/†üç CJ;+hE©FBÅè„t…«¾«˜òèoïyÓ{q0>îÿÙû³-Wr&Yƒ±²ûב.´–ÞÿQϦé‚ÀG Á sdW×·+7“Œ@>˜»™K¨ÝNn“@‘ŠÏ1ó†FOÍ¿©Ã4r Ã/Ñîǯ{Ÿ¥¹n¬úy;¨2>D tÏ ;– fm#!\Õ\Šaöœ£NgÓ´óC€¤*Íì ûâ"\^F„Ov d0¢%ñˆ¾I³QÌc£Ûg2C(W/zÛ0+`…ÕfÒ"‘Žh~¤ e½øOø8̶û°I,«ûx¬Âæ÷ ;ð@}Ù#'±ª°M–>0°eH€k?#„Ѩ1 Hl)¢1ì J”ߢ“f[2“tÐW„øR·+{øZ €X‡þ:¸¾ÂúÍš6?2Mµû(–TÅðF(¢e$ý—ŸÿŸ):¿Vþ<69|xZ…îÂcšÍgbpM\†ÇÅ¡ÞÌ ¼ÍØ †q§Ñÿ‰5+P§§ÈùA XÃÄ_òz„@ÛnIuë| Mš“/äÑãïÁw÷¯.-P;ÕGÄxHêpK2‰ÐÀ3´ £AÍ€`1W¯I×Îoµ;!ö#5€JXd‹Î›N¤]²/“³öÞùÎ}¹hÆ…„™ÑÓÄ¥÷¼,îß ­[¸Äaî§ä–ý…ñ²;Åô.^Øûç‡l<œî‰ýc nxAOß#¿,¬ l`Ф×:.£>‚èêU‰+OäeJµkE\%¨"Ù`—‹¼ÀˆàÅág})@È·k­¹=ô¦MR1`k?ÌÁôÏ4Å¿ã•Ô½ß÷ÒÞ¯æ&¤/¯”³ÁnÀö]ûHËc_èÞÞÇ"¶]:Z2Âqf‚I(kÀöÕ{ôgwLëéÆy2¨Jäæ4Uhåža\QÓÚ³’/bà´1{Mr8~ŽW袼,0“ÇVµ}W3µÍXHeÆ ÑO2ÉVNLhM»¬’Î+|çwQÊàDŒÏ˦þBÑù0”ÄÙu|†°‡QÎN¯ßŽæ>å\f $ée˜±–»Çùr?GNº½êáÅà!3¥oÆâ€—ïà¢IÂes"Ï =ÍZ*¦¼Îw—ˆù¾¬ÐÀí‹É³Ày!úý%¢ó_-CÜ{-U´ÁÏH^³ñœ¡¤Òu$£ w&Z«·0’FKžK>@¿ªGm:üìÃu} i›!ÝŒ;gého`û®å}aŠÉQ²¤{ЈìÐ;‘©à*RœC½¥:ΤÔXVŽìý±¾÷ÃzÅß)â1–X ÂQÛ:Œ+å^ ¹†®kä/ŽøFÜõyÛQ¯íOdºØ+±²æñ¸T1õT ‰ö’•Ùé3/G=´þˆû‹[Ta=ú0”‹©›æ"¥ó 渣>—VÞ@”ÃD‰Fq4"]A×=D¨ ­¢îSYûD®vl¥° jJ|ñ¤ëÞpIçÍ@¯ñH…‹úe:Y~ÔÚn„ ¥ôø—6‘Ø{Ý"h]Á‘C1Dˆʤè¤(Jx¤ZJKuõé(±©x¥=jšàQžlêúìÓíb,Ûib㜆<g " tL/œÄ@HÑ輑½-¡tYQ…?©QúóygkT)´/ã!ÐߣR™²øÈ0X¤$ ¾M%P`ÍB,jÄí‹cófAüE˜·V"´Jôϼ›`ºg%$í¬w>T€ªÑIž|hä ǨÐ1¬ÿtïÇžAk¿3­§Æë¥3ãT…臞D`tãíBÉôEtW«üÄQû|—Œ%Õ›ëuÁOI!C¬>Vqs;΀SãÃîþEf•¢šPmL ÝùYž0-ÛªOt±*RÄ8ŨrZ˜TàÜËQ¨GPÓj_LÙOÞ>‘ÆÔ,)Ñ”ªå­_Ó!éŽÛ,÷;ïbâÁívHrÞªÔwdâ¥_™ÌƒÑ›„QË'“ z8ÒÞ’˜«A¶¡Õ*uÑ‚n¼†X–ÒÍöY=82ÚnÚ`‡'Ÿ’':6SM•¹J4‘!·(ÈăðÜÀˆûüA;²` <7bš;˜¸IÖßK'Râæ#ËXFl Þ↲V&œ q.£y¾Éçstw JEI[¥8Ž×1<\ÿ’~<ᮺ”© Äڇફ'}phs.lchCV„4ê·Âþ]êêvÈuÁüQqõ«Ã~—àÉ£  ^RÛ +tœ:„T™]ƒçÃNÀÁƒg›–`î´®Âl—•^°÷vFHoUŒOÓäçœThŠâ­ûE§µ;äAh›ÛàûûÑš}M†}F1ô¿ÛSÌüÓÖœììP³Ò0wxXgqÁ%®îÑÿ­³¿>•!ˆÌïì;†}öWíÚ3QG¬FóØÉu£É!þÇļ?TUmÊ£¿0ÔùWý{}æëuÂ9_œÁ¼?v%ˆÍu`ë›C\0)n¿w•/IgôRmŽ‹w”›OÝõk€o×­|1¿‚oéçàªf¯Ÿ~üŸXPq³%÷~·ŒR0×xt3";àŽy\œ\D±¡FüèC$Ã/yV/õëN·g´>Œfó¨É;ÂWÈμ;…ˆöàÚ¤ÜW_¾âŽ«%ð—?xž—=V~úhqMøJ_Ù6o¡ÇtÞ³~¬èüÆåu™T,XBÕÜ|¦Àè “ý"ïK9Cù¸äéƒÿÐÔƒ£ š¥ÜD×îž]‡áƒs–ѳ`³jÝ®_…$pÂõDëòн›0³ÄÉ‰Žº'¡KI”;ýã7F’Ê`*XC(1á$´m¤Ç@5kPñˆAæVÅÿkdmëF}®H½–}\uØÙªEÝ £×¾ÂW4@ µúI}Y¯©ofvU…š8 š¡XÆ™²u}0BÇH¨³ÀÂGr8Ý(Ö‹óöÄÉD¡8 l±ÝB£‘9ù+-ø ²t$Y;‹U 6è¿•ieeK˜Ž´3QëB­DddAºXd‰AQW˜=f‡¨¯ÛÑd˜0NÚ=Ñ •èõ›/ÀS BŸˆõ’P0U¡Û¤NNL°IÜc§q€=H³?š3S(ÏÒ.ò|©ÍÅh™¤òÖÀÝC´¶D.ÅzËDoÙ€x49È¡ ˆpE•Êפfäî »ÉÂ4YJ-ƒTï®'½ óíãT §1¯ãxcÄÅÎk­KŠêGyh‚i{„m´¦k’ý!£Ü ÊíVÚ% OhRÖCÁôî$ä…–€dÛe4ΈT¬¬ºì¥‰ÙýÜ;rÆö³˜‚Ám Ñ9ÄÅl¤&°.-© §lšf(ùHC¦TMØ/Ï94|yêæYj™2^Ϫ=þ!òhÔJcíO©bA?/ïå×Áðƒ–ÛÊ×4ËàÇE%¶è'‚y™dX=ÓÖ*ªÞ¼+eªnÄF7ì,›hMY´ÆÏÊn¯¢b XVsîŽRœ"MNÒz•¼X%Q )=´;»’š¾ ÕúÿUm[ÛÓû2°:úlí|>ÿkçªÔžúÄ*5(ÛoJy F6•dÒÂå²Dëãèe~©±žLáÍó‡+!| Ý9ÅÔ¶¨5Ç}dCíY{*“¹ìGë?pC=þ³Ïb{‡ÃeË›+vpç¤h¹ ¼LÍ´*°õ¿JÝ2ЀV %€ä1¿ŠÑ•ÍA”‚›µW¥¬e½á¬´Œ UÓl&%«P'€HñdKýO?£ä†Q-׌Ƌ_(¥”Ûráç-—´ÇÕþè3§q;¶KëxS6¨«Éõz÷ü¬CœnG?ã+ðš{wOÂìÍû™Äö-“¼Ë½ÏÊê†ENtu–QßppbÔbΣ §©gÂvœË ‚°ýí)C0t±¼zÇr_¼¯øÜ7ÍÏ óÏ,ÜŸŒÜßëïõ÷ú{½6fýR–6ûÃ^ü›óõò%½ø¿wÅáI€[gÏÈÕ±¬Jý’‡q!V‚‚n·r»ª¯¿×ß«|Iºocž>#ðꌫ‚Ä_îÿ»"5ûGÕͬ+¢"Õ¤ºh ¬ë¥÷R’žeAF)ŸÏôå!Sk)¿ZE^zÿ8"Ô6Áç¿Ûívà åvôv@uŸÊQZKmëEFú yHgiPjõû—¡D£œM7¯ú(¢“IQéÈmÙ-YÞTÕéix½’U9‚§ûcIPgSE„öæc‡‚)MÝ;Î>qn³”"é» Aÿ’ª èª-¥¦Á1WN68zZ­xª.|ö‰Ò”{»³m¡HÑä3ÐR‚£ìеpD™Z>kèq‘¢Áãæmí&· x‘ädltžšÞgÇÌâFõòvX05ÑF õ ÝªôZk¨Š&÷öÒ˜8à¦DPñ8õž×ls.0Ä4AläÊE+CÐd/‹N["w£_> ö²™·±àt{eŸ¢ É$ü€²#¬ YÝB<sèçŽÍ=Ú¥}˜Õ¬œpd'7.kcŠÇl¥h»ŠñM S)WŠƒ`CS*+š+¬F¹s¢‚f÷ôaë+v¼‹F—o”aºhÚ쑜Ãî2<}få‚=¦ªƒRp̘¯ÖQ8ØE[Óñ ¥KÒ]üÌ6”¨s2N«–|Kok’S¿Ej–u‹E9ìS¢•zÏ,Të¿ß È {õ°d”öÅ«³$íN£¿Ü²ÙÅ,¯ŒÝÉx8´}Bšˈõ%åeDpÎ5Ɉâ?yãNI³åêë.Éõ lA×n_L|iL©Ë—¤ÖdD5_sÅò(vaÉg|Ç&bÑæoù~ºèeôÛIw\ÃExÈ´uC<,¶éb£-ùºÙ]Æ!…“åÓ²R§zÂ} £áZ¡bíUtÈj.éöíYW2·WbZ¬Ñi™=&/€Ù¿Y1µ’lÜk–ׯÂ3þzPüƒŠ/v;ô?Ü¿†«©iµð¥ÞZ†sb™G[Ö;IÖKjuáu=JZÉxš0o‘`™f~X@ÎÜõî¨ïü=û«¨cq.î.<ØLzÀ5Šó„–éð^¡iÖP¯¦+ãg­•®ébë2ù0gާ*š\ù!øB@ô¥Jº p*¬•iÕ!n •45¡ý¦ §DäPÁ¯ã6h°"ž°8?Ptþ´בþ*õ3?D±Ìbž7A3ê†IGÈkGû¦A£Ãÿ5 ÐG«¶@Tœú²(¥‡a`ÕŸtÿЍ õÞë«ÙÖwò?Ü €ÿþ»ý÷ßíþçößåvJÁJ0ü`Å`ç™\Q˜á‡Ë^Ç_!·4é´‘aü"p»ó^!tœ,ò|:U w%€‡+št‚SÀ@–Ðàh|1%›S–k2œFMßÂm]æANÞɳAÐúpDÕ'ÈÆ:¤ð/ £¡ðCDyö-¼ÖàêeèÅ1讈B®›õJV•f­1ùò“Ÿ¦¢¡åf礲;ˆh×€»%›ðœ…:•ˆˆ°•¥–HÒAmø¾ó#Ó'ugìe,ˆ^ "'Ö0È%ÇpžÜ«;ÊÍÿ˜OÛ"H§?ÜQéݪ~13ÛBÁÞ¶ºõ¢ÖñT%*qR%¨ ö£Ÿ<ÜÙ©#¥C‰vm¸Z¬î±§ÑÿÑÈKiÊŸ¶ìÄkØO)]8¥e˜c(k:žå=^ê¥AjÊ>sͶ+ómw-{©§sG22A“جyÀR‘¶GmnÿÏÿ|üŸÿïB¶å%„œ/ÏJv‰ËC9å4ê´îð²ì CÌü  ˆÏÒ8¿å'¾ªCM‰Ú£æñ™.ƒ¦2wŒ£~å…‹læA'ŒÐôö¡wãË)wXßCµŸŸCðå)lýEÇà²öÌjðoÿ^¯Ÿi ðbí—ËÅ$*…?á•JíÍ^ù{ÍÒø]jÔ/Çe­7o—(îýÊ+OUxn?ãýB·_àqÿ‰i¬ÎXžèɸÝnr=Ÿ•Šüíä?_ü‹Ì}Ó ˜AŒo:¡õŸAÊ'»ßï/:ÿ“¶t+äԒN“3¨VkNE=’Ün…„¦; ?Ê7üïÿü÷þ÷ãÿõ¿ÿûÿþ?GYç? ‡%þ‹b²ˆ%(×¾‘¨ À )ŒÖ6MFsPº[e º{½N±½ÔÒ4»ƒÕ³ 1Äí…Þþ w6Æqéô£Z0#KÛ¡Hp\*Äöƒ·„2àôn3ôT^ÌÓÛÁzñìâ= ?1Z: _ DŒÌŽ\¨! ]œi­EP+6úƒÏ$jÞrºÖi§ÀÕ9|TãœHo×y4~|É37ÌN™†OY„šáÂ|ÝøÀp*ö<QèvÒCÿ&rašAäyåO/z20ô•Qr-»ƒ^Ó$ÄY–}¤¦Õjè Õ‚ibí˜Ü,ÔÛ)ý—ûÂ,«}|ín·ÿþ÷þ?ÿ¿ÿ¯…_Û}1_d”Qr1–¢ô»)çìÁøSÆ8ÊãJXßÕ~H«|'rì&êÏ0™0›øE2Lf³ðàd$êV#÷d€¦8Ý5*·ìn€3z}C¢Ñdt”§P;Ñ6œ÷\[9Á~ï;HÏxxpõd!ÉM >õ‡ü} pŽ”ÊÐ$¡œ›‰Ô4ŠÕVÏmº9¯¹ƒN>ôˆ0]¿ÃdÄ‘£×}„ŸuÍYAO)±êc-±Y§' *1…çš í|?¥1É'ËJ‡‘9J,ω@ñ(jæu7ÚôoÌ¿jgX¶-HszýQVØå—jÆFŠJ@å¡n‘ªÁH _oX\´´ê[”Òfœ:¡,E)£'‰¡“ÆöøÄÉnsãl`$`eÁ†nM(Ý6©kÅþSÉY $J#±;£ |á'÷i[¥/bLøúÇÍ(xÍm~þ^úSî_ïÄ©@f×G>uÍ-Ûð-DÀ,à«…¨ˆ\%?eÏpº©Hf´–ã{@°$à“‚\C?˜yC¼o?\÷@Çã7®¿n¬²sÒ¡SO@"ß×1>ŸâÈ/Í+;ǘm…+ ÷ɾÁ\…/àëð.à;ˆÎŸ°/YðùIÏ'ÈÚ’‰2Ö“öyu•qžíy’ŠKò86•-Eç | ?ð‹ü(7U-Z@~w¡V Lðk=C à¬;fe•1Áë|C¶{·¢ÈM#S@¾KÜŽsgë´: fìê#âg­¼³Ü‹m¾7lò6váøÉ½MÍi“9¥JôŽAH=¨ûtÖ¨e•†¬ ª50)—kêª= $} ©6Eƨ•ÁßÐtéßDÅ]k&À·=ëBXÚrA«SÁ2ß4“ŒêÒôðU'@º1H-–EK’IEÜÈJ¯’OȬË0™x<)ªBÛ¯m^ “ÄÙï¶Ã˜bsƒµ<1õ11âèJtk±>Îý'}ÆÅžõYuÚ§ø'¢äç¾›ÈÆÛlðø…8gC^ÈŽæò2YµÅEmk<ÿøTw'Sÿ)è´ÌNéi!£ãˆˆ)DÏ@œ›”ùÉbN6¯^S[¤; )žÛóA.Ç7!d]ÿÕ³·+ÈÝRLÐ׆î+»ž ßšWqÝXj·} }|™á‚:j-E× Xp’s¦|h8Þy}ñû§8yÑ•Üà-ÞÇý7—ÍÆu#Pæ Ä'ê­ÿ@X1v×;ßæÉ'TûÛd®,¨Á]‹Öï—± ] Eµ‘âRLj-"‰aZ‰‡¤¡„ x¬œh!m 5/.Á¾Þ-³®ˆ9Vߺ=wJXs»h:t}ïùȉSÉ­«”Ž\QéX$Ó£…±o8‚’À ³µ5¸Ã«ŒÅ]ÁœôÙFjSf9hav/Æ~(‰õŽüCÏ[/oØu`@Ývúè*@q.}dúŒ !Ç²ÄøÛsµu=¿²è<”–õ [ ˆ§ÔÙFŠŒ!·–:;ˆLRXt29y¸»*‚Œ›&Ì$5k¶ÚÐ\µl šÑÏs®ù¥œr„ næ—åZ<¥”'„™Š©™|Ñ~ªæKL±k‘zÂ4ÂdØMBDMã@i)†wâ3«jeï“kpê&µr  Êã®ÀTiSŸiG†7ŸJADjê€Bh‰õA—„Gr>!ƒnºUrÒÁmê#Ez¨’ÏzŒÅõ¿&§æE d¥…ïÝ>xF°Ùo‹Ku1ëƒ:€Ý„€$ÀBTBž±³5xA”²ÌÑ!%ËÒÆ­°Å"ŠðÐz´PÌF¶ìI šsì™\ H®£ïÑE.åZ¼l¥"M•Ðh0:½@ÈZÅÛa¡tãCm<Ä ó1…GnBô6hO„KYCUz%1¬A9Γ#ÃA¡Þ(éN ×Ý¿‚Yc%×Ë´è±ùïÔªÛâ™fÖb+(!Z³GûöTI´æ=g…ý]|'p5.^³Â„„þ¸Ai=_†L½Ý ñ£íÆ$ôÑÖhºÈ4EOÓJCm6ò“Eh×J“®Àfo²•ê&c£Â ]) jÈ­pOÍç7I]c:và)p4x´›VBGP/»Ž¿r«š¨¾ùwBª¶àÕǺÌovÃYÙI'=€"ÔàójwŽK©µVþ‘@郮dà¾\(X‹8bü’ì=(ºõб*ó¡Šo ²è\Ëß@3ÊU}h(€ÓéÑÈd£zm!6v!G bd;tI[ÀEJ<40¡•¹»;@\ž,N¨Aÿm§ô{<”.1`i(5-_"Õ o«#eðˆXìFC5ÈnØ’(ò˜'2­}8R)‘I{WÄHåj½iã2Ò¸ªšë„Oºþ‚µQ}$1àFw…ª‰B(ã±|=@hQB¬êÄ6š¼/ã  ªŠ?ÁUËgN<ú¯2W 7ÚeC€ÉÑб×Ã\[\FÙ½'<Ü „³R3f-Ô?0ëo5#g&%”ò¹+‹ ?'úcçñÞÓúî=Ä 1Ù0§XžƒÛËÀ™Y[kãèi!x%-N5Ž‹ÖÙ3ÂôfK‰AE1¡ÍëÂuduˆ¥ SIÑÖ#g‰Øî4Íü6ÿ">5MÝI2 Ê~ŽU²/ú8øíœ´æ­Ò†óÐê„#K~ÚX•â7½Sã ÑOJ"cn¶wPV¬ZÞD:ÙÈ`kP£,¤=mcW­m͆sdnŸÐQPÁð8¡õþy l£§e a ¼N…b‚åï5;@×Á8ÿ|öT#C–…bàîÒ#(E"kùðT³4`/Ðb(rõ̲IÂLM#Dwô·ÏÓ‡Ê×¾:Ö"3œ?¶‹ð¨ÔÉ6?ռʚ‰"pÝiR³Mo7HÇ~ˆ+dèÃQør7-f×®kFóA‘;H¡CÈÇa7h£]ýÓu÷kÔ|$õRŸrŠÆc7õ‘!o;.(1›}âê¸õ>µ†Ã3¬j¥åƼ@YlL0œúïË;‘‹u}aC'î Ð^>”ŒI.dúmvÈÓ3Õ–gã·ùÜ[ºµÀú4(CwÍ`Wèó3äoñâ—¼9|óÚ9I[€ù›ƒµ® N󻔀C7¢dq ÎOU¿4eÿZÏODŸª`ÎN}ïðÜéøéGŠÎû)èÈye§ x&0£eµ°xc-Äa°†’i®ikš)è¡Ê•±d’•+'z)ý^j4¼®Ì+IIÕ7õ‘ÚŒ[Â&ÑÁÞ!JI¿ô”ñÁ Tˆ%tÈt!éÂéãí†N‚×îÍwǪIÇ]³éMóò²›îŽóB3ß!é%cWûŠDHûM’B/¤ª<"!ÐÿHTº7Å2ãôÔƒ¢híI[ê:M‹=Î 6rR|`F‚ƒ Ã4Ìê*[ïqôz£ ¶Ë§ã1<ž>MËœõŒu¾‚@íÔ¨Ž¦¶Ueû‡¨Hýý©b_<úäO+5¹ËM­ÎƒâDbKóhýƒ}Ö‘3ðl G(é÷ÓÕ¹üv¾eMŽXË¡&†ë0è·R¥/ºut"©.Qb­†æšA[¬ò °Ëê%€႞ë#ÉËV›2$×±Ÿ”ƸtO.Õ•è—­¸ÒS¼íD7@¯ýWö>/[„ %œ)5Üw§À[ ’ôZªX‚f1f ±@ÎÇIÍ Ðš»RÚCˆ À¸AjıU˜‚DÂRZ*S=±AmQÑ»ß7PB@PU`(¼ ÚéNv†·î)<(¼pÑ/Ç™9)Ð àý¶MŒ<Ã;œî˜„† B[mWm8AÖ—;ŒËD|÷É40ßÞ&ô­Ór:°ÁÛ™½a¨1šŒ…¸Øð@î£|¹›$¦‰Ì¾Ò(¼c0 ­Vìó©4%¥¢âZaFZ^ùÅ¡> …[ÕeȤ6µãV«beÁbÂ(ÏÜ‰Í·Š‰4Ô¡1ù 5 A‹ èð—E/_ÏÒnÉäéÊÄ*À’Äž>/MÇVoÜ„âÉWiH"øT<Þ,eƒÏ» ’óуuKn¶gž(B¦ÆX¦Å!¶Ù6Ýk²š µµT¼¶òÒI’Ì`ÖÇ6ì°ÑÇzÞn·ÛMœïŽÛ"ËŒY‚Zİ£²Û¦îùÞÿy= áj­‹Ðý ûs/ì¨dåUº&¬ëBW2¤ƒŽ4öh$y¿Ìºjó°4’òçUp¸PÑÔ.îLcð‹íÐi=%µ)Úº yDT3&a?Ô.Ó(3ÊÐjMk4Jô´ûnÆáºâ µ>Gý¶Ñ,£ !Ú·ù ÓÇœýCë´¡”ͱ§Ì’yQÙÌnº&cpÐÓcª&É·#P7uÂÅ! øUr£GÇ/tÆVXˆñš}½È@Ÿ(Ÿ×ûSEç@+y:Ð$l±j™5­KÈÝHå²e±TÊqãø{q>:€#0|X¢‹y`ðDI±uzšÅÇÆEüŠŽÏžf.›oC®Œ6¥þ‡¾q¼0ŠP  x6 5tI7Ø:,O¸]5¬ø@ìÞ}·>ï:[‘F(®Àw=v*ç©Oã Ü7]¢@õ í®~M9ñFêÒ$‹£—$}+<Û–ÀíI ´÷|­¯˜:ÒçÜÔ÷´ûÓuÄé­ý¶Õã ;€W-äb·µU­4bHýX,/–o­ÁF0ˆd¸ÈÀSÏìnDrpÒ²ïÓñ@s‹×“BºI} ïµLå🳺q–€„ÍŒó½|Ѽßt“´Y9Ÿ˜äÂHHƒmu‡CWžÒø€Êÿ´:<9PÂhÞ•GÖ–¸@c-jµ0˜!™l•áè”ôÁ¨ ê™ÙI/¦6ýˆΜMú]„–;.æ|T$¯²Ú›p…}ø*hÏ“ _¾š0Ú`m/­ìüÏc@Šú·ÑÜÛ:MQâsÙ÷Ï?ÍxÆùγXqp üf·œÀ¼xéãÃ9µ\Æ’s±oÀ‚9@‘½ª˜£„gÂvd˜Ýˆ#Ï:†ãú9‹Õ9`ÿAòżóåÚ>uqž7”~iÿ{ê9<ý^œÓ1r¨ÆOªg^r/[j~Ÿ ‰}ÛžF½®O3>E˜áÌ~Qí·V'å_jß¼êß.8.¡.|Ò:¿qyOXøç¤ºŽ™Ôê×íìÜáW^ë«pí:~TÍ@‘²PÎ ñþz® O+ÞJB#NšœèM° öwZ¶sç½­cPr>œµÛ~Å`YV¯ßN'ž7•O¿}û1!($ër$œ4®l/<ò¬maÁ¿zª@?Áž_ãúÞ ú'1z2ˆråWÛ:¡O]ø¶!]uN!2›RëJOè?Otþ‹ª@q¨ݾw(ðÀ(¡2‹)TeEi¼ˆïDÜÂî?§Io$KGQ¶ó.‡°›õ39»äâ;µ@Ùß^,ú{+oOú£©+`0¡@ú$J ÀÚušÆmGs«Y¶”î”lü¡ÙB{+ @H"³wÕ}¸ŠM.¦2á„Ìœ ØÕ®4V~xÑ c+!ˆÐ­ÑèJvêmìçXÖˆ2$JÅùAp!¶4{C³k h1êˆ FŠ`}£(µ"Zò©Ðþ(ÆlÑÖç[]Y‘îKÑG‚ÒÅÛnTIúFÀ>Ô¸jÜÙ¾ÁöùÔã×¥ ›@UÕÄèR.{‡’óSŸßŒ‹’ÁªwMÄcp”²'™–’Œ-(´YôbIè¡éñt¼cjU±æG;ë?´G § õ @D‚æ8ÃÐù­¦„˜€×C‡ÇãÁ5È­Ø”&.ˆ5€#˜?XÙ6H¦P¹7›i¯`±] $áõœè4 wz6ÛLê8†cKPû5#“šçµ=þ,V Õ©é"û[É'($^Í–Ôˆ&µ–rU”´"m0)õp… %¤vòʉ¯Ö•VLLÏcç».µKYz¸{1œ¶lZ%,¡Ék²Êy$o!:àþL›¬ÃÙ³m)  @\Þö&‡DÓTŽhÖà=&ùf6ý»¨? V+2MZ¥4PØ,ߣ)Ä ¸vðÀFÕq]na pÌ}GTƒÛwj7!¬âHTڑʆeê!]ÛÝI¿æì´^¶b¢_ë 7´Àõ‰J¶¡G0š‡zbpŽL ¯¯¿œ©Ÿ _öÕµK•FJ]¥EÛo]2]½KÝ£ñÐ4Âbx’á:Ñp46NékjºazwEê[]Û d²å.žs}ìÜÆ²qÜ ±Lü`JYEª(¤µ@vh 0ZÑjªk(ÉŠ«qÓç  ñóDç“z€4à¶V5R"Áé‚rÕqP°Éð‡ØK#cç‡Ü КӰµFlE%Ì7Ïì&¤ðYåTÌ´ Ø7bKCç¹|FÞZÄ*I ¼_¿òZ&(d¹-̵ G‹ØÌ!Êþ ¾¡#í!•s62÷>#œ¥îÀÞQÑ ,´Õe’)]ÐdV^úH0yZŒÂ»-8Ù·küAÄ4¼IÖåÀµx¶ø ‡Ê‘ËgÆo—½ÜhŒÝ.3šÝüÔiÝüå½ßF ÎPšðôE_ËàÀå1P†ÌíO®Ûr|ZÝ4 Xp ØR¨"gA‹}þ@(ãýìåI{þÒ$DÁü¸ïëÙUX›ñÆÉG)—4#þ ”d, Ê•ýjJëŇ&ü: €ù[‘°‘e í>o|ç¯Ú`¦Ôëǰ¤:[Ýç¾af¾/Ús#_Å ÌDy¶µÚÛ8_Íl¹RÂg+wyÍMª#§oëÛ5*ÿ4p4šª, “—q kÉÍç~däÉžÔÙn õ2~&„ ø5ðiÍ1CE[cbqX'-Ê7dMPæ•›‚'j€1õÒ/„ÅÃ8Ó:ÄôÃ/=ßåzÁyÅ[q4YzÁ˜`Ùü&.€QS‚5ÐöøU9†A~¦£ó¬ýt?LV a‹²ºõk5):uñ€žå¸mžØìFµÜ¡7(ËSC[)v"å¡;Ùœ…Ó’F¹µåñÜaù©¢óáC_5Ëæ´qÕ4qíøOkÆ¿óõ!K*ð•"%x¸‚ÂCEËæéÎÝøïÑÓeéÚ®ÑFq ±”¢”è^‡Ñön*¡šy*ª€G¼„‰Û:(é =Ññy‡.99X)í ^U7òâC¼j—Õ[åê½~†Y:E´üè…*3¯¿×ßk)ðÇÝRYÉ4¾ÖëiSý{¹ÿó­Wî,ýÿ%E¦Í£©‰¯ ì.yH¿{…*[‘åû”x^ñÃ>YúE4”Ô–Bý[áJ|›£ù;¡ï~®uwâ=9³ÐnlËïú©)KšÅíë«÷ ãürJtþ«e*ª:Ž¥=ˆíç:ü ÝÑc4ƒìÜ>+“oÛ§¦ü0¾Ø¸„ÎŽ´ƒ¬Úúe[^ò¿ÇP ÉÛMn¡«YD1õã Æ³Ö]óœP+hCµƒÕšl 9_š:YÌÀC/1?Ñ„C9À•#RŠ˜tW×B&Э½U ó~‘šþÛ¢öïQ¼jH=ÝHUBá뭌К"C)Od5ª(,‹KúóÔ*ã`°»ºN %íf&‹Pi ”Ϊpíô´%¥•›ê—^ªañ+£;ý}—Óñ,z‘ HuÁˆ¤QS¯8 Ìì…Šø  ¡6p0©­S1è[¿Í©NI Zþ•Úúˆ7õœbBd ¦`lXÙâà³òUÏð}²tög( 5#ú‘'à =,u³1•,VlböIJÂí'pº|–šUo¥Ž „DGÎ0à(¦2RQµQC„2Ko’œn¬‘Bƒ°„ΟPKº!Ôñb9„ÛΪ†i˜GEv*E‰õ0Þ™ôj&|ɺ¼i‚TÓñ”ô)FÊ]Çú虇a•:MÊÕ:”â,'Oq½8r0N÷¼3¦‘öÀ€î®Õâ"îx°?<³µâ-=ÃHï@laÞd%¤+ >4ÁfúŸ~2fèuØC2„™„’šz„Ð;OÊ>P^¤Ìam[h·ùÈneè3­¯¢‹„°øT®n¥†ÑšŒ9Œ‡X¨,Q”ÚI)RdI·ÎfõÓüçvdèÌ|z2TMK æ žu“1E–JÃÈU,晉¸dèÂÑÚhèûÆ%¸½¬#JÝuØŽÊ,ž0êíÅíê×Õ‡’HˆZ8Õ¸,„!™;NéUa¾½Ø‹<O‚ï|?Œ’xˆƒ}âOF Ú`JE,-Ÿë&(yÓ³,bRÆ6ô]›E)®QrkÌ1¯iÍèœ?¥°`ûŠÈm]œOXã>06c4JLøK…’pÖ¢v¬«¶L¡z’ }5»’ð{ŸCÆ\ qp‚”x†ƒ|Ûå=¢ñvíRÝ%Rû >°G_„‡#e!Y€ŽÈÕêm¡ª®ã$÷ÄQ °V@‰ôPŸµž¡öªÆ¤%Í ‰tÔÍÁs €?ö9CYUÅ›ô1Ò§»c!Dêà1ƒ´–‹g^©¤K:ÀÜÜz+¸w€J(žhÔê}P’vÐb¤ƒÏGÖø;é"_,RÍñÇ‹Î_dôÒc^¦~·ïQEaÍbDüÿÐ“ÉØy™B»Ì„Á"0Š=-ÄgÝóD×\¶ˆu—Ò°Û;*¥”5.À_¬Š¤žãI,1N°›wÞ¢¦˜Ræ?ë €´bÙÀ ;Ìj},wzÿgä|&7_ïV†KŽÈ1ªsñ´Nê]´ƒÏÕèbçµ’‘OCèGuºá“-óós¢ý6YUÊÆ»q‘X À§y„yañᣡ©·rªj4ß÷Œ &’×lrx®XŒ]>)GQ<–-–Ó/Ç`òÃîWŽÑ!+Ù+,ätÓði•-Ãp7³ú\uXþ˜ Ý¢ýµdÑÊpÚ9ž4‹©§Ø‡@ ’*^Ùëà“PT4ÒeüÙà¸a¦„f£@,HÃÁ¾mxú”pöv4A9Ò ¬ªïÀV^Öªh+ûe0|ÉÅ íI4®Q× ‚ °¿åÂK'¦$Ö+ÄCïeÜpnÒ¨ðY,úXM·C¨(ÏOp­"TË ŠË ™ûùd{2:iqƒÅ8ç”8'‹Ö_¸èâôi¶foè˜EªZ èPô„NÞ€¼.f²rC+¡Î˜„åT5ð–Ç£WîÎk/¨ö­ agá†}@$ô„%¥\%ÚãÄëQ¬Jºìî™ÅÊj}:2@?0A~øP ÄÝš)Qêµ¹„7Âm¸ÓšY¶IF-p‹´%†…£\¥§gSG ³†1Ü3'»ø•JÌ@R&ÿÀáÀ­ÞЏ$Û Õ™ˆp^^˜|~k!Lï¸p@æ.Îñ Z@þdÑ A¦ØW.d¬¦ŒÕ”À,_õ!]®ÙŸá{k-!ÞNq ŠŠV"J–à,´¢Øêbà ~›èüâ¡H5¬¢_ä$è3¡\ä/~ר÷ÿ×ð¡J ®.ìôÙ{e? Ü‰£×uÕ?´Ý@QSqÙ*žAÎÌ“ls=§ŸÃñ¡šIþ£¿—r»ëÀ ŠÝZä§÷êÉÃ<BH(†ÜwÏW&8ö›5. XpÍÇ\ @¼ÝúþIý½þ^¯¿×ßë×8í¿×ßëïõ÷ ^÷úÏUÆævüÏm¿ýóV–¤6Þ»1Ž›~~3|™!ÇaW¨W±EÙUG÷5¸£'«œå…‡1ÑWb)Õ:ɤy‹»P¾S6{~=œsú£ßÉö¦þaϨG-{ûe4tÃ! \…Ô´ÊŠ”9n25H=XC¾ ¨-Ð)ͯÇ”« ©gd\:fgŸ= G~$@.*3®¸· J¦n„XUêD¶žKÕ%&”U‘¦¥Bsœ$³õroø(™Æ㊶vƒ"Él“¿Œð¨çk‰Ú0˜ß;ÎU±Âû&ɵÖlqò1£ÕC˜æ˜Ñ ½Pì¥Çq§DÍ# Y°TE” …UÚÒJPëø[J˜( 593kêÄAM;èl¢ ×a÷xÅ„”Ñì÷Ð Ùk$¨R…¶øù)j.(/u³oˆ¥ðqéÁÔ EPBg¿p&x\'dPú=ÈhLqàÆa³`sÓ 6> ãYÙÎê¶j•ˑᨌQútr(#R\‚‘ØÝ ?¥ãURÅd¦ æ:s2…È:2¬aIfpï(M³ ˆ…$ιéLÇ êî8Œ–jL—>ÀȰÁ#FTÛ“*®8jÙ =g Ä$˜*µ/iþçû|íGŽS™ghu¢ ¶†€^{Zm§5Œx•=|8F!Épåd#TIQ?Ó }ÏbÛ±7&eT~±ÈÀíIß ùá º-ú€†éã“Iv0FŒpà°°•døIv\¡·Ï,N~(ç’s¨baúe³ q¨a!‘+½s¯ Q¸ž÷B1 P­øb:ËÄisG5G  ±Ù=•jîÛøÝ*ÞÅ®è×…Œ0CÌLÓ–2Ñ AÕúõäŒPk÷û=x4-}ßÑ[W•vÚŽ¯5m³À:nËP+?¶ÀE«>yã 'ÜÜ ÅY®ÿÝ]ÑMŸeUÕ¹x´jIXãHë´1>:Ü ‡òˆ«]Âʵy"ú •LÖü0 ¯wE¼UÊ»•t(‘ò*@‹W⵬æÉ–˜2]s’¥Cý,RÛ}A²©£C%‰½°ÔJÇZrjËÓr³]¹)hVìƒ $î^’4`¯uüKTü()Éh3œ6‘ áB¸NÐmoðªÓ¶›<‚5!Ž5„åàz4»U3Ç!o¯‰¨“JØLww¶9>n‡*x2Ç £¿rˆJù ¢óõâ½I¨¥ùx&œJ’l§žRRàd¯ÅãŠA÷»/õ]{oIÁ‡Úxˆàœ¾âw=²Ü«C-Ý:8)'JÀTs‡žÙX{XpÎ Y•`—3Çiþ%ÂÓ±ø±Ã¸^Ýô„×ì«‹?°ü½ž}dŒaÍ¿Uú{ý=‘ï°zH÷÷ÚZ¾õpïup¯¿×ß+=ŠŸiôr\㊫ʸßÜȾ€×ÕÿeŸ˜u,>ØÆ£â 覆Yç÷øµ|®:ø)7¢xÉ&ÓÝ¿ãMþÊ×+ ‡e"cjŠ^ùH‡'—„ü¯“yׯ'ŸÓò¶Ù€÷ž¨Iíêzç°0åXi£#¾ª>£:¢Ðú o¸Ýo÷ýí‘Ôˆ©UCÏì–ÝvJÊ…ºyÊD5Ö|¬œíj5A/º­¡ivoP8‹˜±¤W¢öÕÙA(xLìm—|ësÅë÷H]ýÛñAw×!j™WíF–¸vX+Àx”žR A¯i×U޶¶+C¼v­ý0­—d`ðÇâh3Í›nUï¥øzÏŽ ì¤Jêû*…ºPâñ‹0ÌùÖšUŽö@'O4™Kß såqiXM)Ž[Y]˜6fúøÒ»¦ ëŠOíkŸs0¯J X9³ì›+ádóÞí"Æídˆ›éÅl| ?·ôžüXµãrÜ·”2­ j‹Xi@õ ¶7š«a4~0Ü œÙ(:ójBrK¶ ¨”±"ÏÔâ¸@Z£h¥4á…ÄTÃiÉgw×O i“[¸Y)ÌWA¬«[ÈŸ ¿í@\ô±–u Të«× »%‹è;}îâLÀb»_¿› à` ­™t­ +3Z'öÁad^òäØðžMf>ú–.ãkâZªý ¸èzži©'"˜+QÙªÑ.X:Ã]Ζ·2jÆ3É«©è›'¤Ž ó'Ÿœ^Š)<¨!>7Z‰³“¾Ž<,³>h¨È­˜ÎþÛ­k q.•}æì¸ËM¢Ä؈0BçPx(’Ñh×ßÿ{i›Á$¦vù`ȃÔþ€d¥+ìûó\Ää¥Z–þ~—Çþ®òdßïƒÒIA°DdJé­2"î; ¯@轎éL¼èC…™<Eä§¼#º*‹±‰ìl‰Æ)¥,Ñ hÆ7»/NıƭÓáñ×·ãc¤äë|ˆÅÜ3,RjúH`‡±Þ‹‘ü÷Rÿ «î‰–ò<¤]*;™ž}¤•6j6¶’´SÚWô‘W‰™ZjP{"‹_ Xä¢Ý¯(õê–¤‰ãÏ9Ef-Žƒ ù®v˜ƒi˜¡,#U]$0ÓøL‚»PB(Ùã lÆ@¿‹æ¨ˆkŒ]_€Ø´I²‹’J]ÑfQjÃTóAÄÃ¥W€“ÛNi¤ùzBm‹ %3°©âÙIÈê¤Ñ6ÜâåCæ»Û à³»oâݰÓB ÷Ù39{»ˆNM8`@ו$å}w£5Ò/dÝ&÷†jL(æ8xÝÅG6í8G;óüQ:{ 5ˆ¤ó*VM‡áQèŽîP €Î½k(„OA`53ÅŠ¸±ú=Á{Ù$WwGUjá˜7œ+PÈŠÁ•xžS©_Î3f>Ÿy°‚F×ÑÕ!,c÷n}ÅÀÖ󷽉6w•„gïÏ,Í¥ ¡‡h@¸áWz[ æë\!‚næõd»ûl Upf^V$,8„õÑôÛV½•èâOl°«–T',~4ܳ§c;,ÿsMçü²iË'‰ÎOÿj¼ÊЯ“üœ§Xôt6n vìú}}¨œK‡´·8Žï“UÕk0A˃0ÇÕqGžƒr:Gï¬[Ao؇œÜZßXWèw­Á¸¡°ˆwF=„Ç0”¸ß^º3‹é>ëvgš1N'Zs\ËR@oDÝ1ô¢ÉGç»mZµ&G‰`WÔÇÕ@V)S%¤ÎÜYÚÄÝëË¢eôÆé9“Šá¯¸î05óéø¸Ë ûèò)ºügo¿¯k3©î|ۙΦ–Bõ–pž$‡B´_‡çŽ+í¨×ÄEØYä'¾“MÿÚ€ÿóC(3Ê+žIé²c»à-m ê pÙä²ö4'Z—ÖKÙ—Š^É-Ëž6´5[Ù^¦yqwç=±&_ˆÕtôLRp:yS/6¤?•ƒ¿¨Ä2@Æü( š ŒÅ7hÈ´ƒÅTá ˜>KLö0V=Ò<¿-ƒ/°Ð‰Pi¥;G­×ƒš šè!iLî®Æ4²:H1þI—™Bž ®ðA£·|ãœ_ ®§»*2ƒr‚Ö?ip(#<Y0’åI#˜‡ Š@ËìsÍP@Ž6P$?#£¾}*í‘ £¸dA½L)%C]$‘è¿Ò6`O‘Ö‰Ø_UãÁeb=ZAK>¢v¿ÞíÊ CßJJÏ)pðP5ŸâÎ:ͧ– Ú·°Há$=h ]<ê¾”­Ë4_ƒz…´™Ï#Ø¡+ž„£Þ‹%‡ö‰,fÄA0Â×)«ˆÞö3y—n‹ætèÃnˆz¦i@:AøÍ*rw ©'®{³m—ñ. 2Íq'à ”‹ß}eè×2>õo¹¬¯*“¢wË.¨ÍLmoƒL´ÜCé*õ­‡¦úþ)Óà´}Yz þõ°ÝÞiOu‚†ø ¢Êî ¡2GÒ¦ƒ` kÙÕ„.Ì)0‚@°rG2¨‚ µ¡ÞÂ.#¶‚ õ G´ÈJ\ñÖ­G?Í¢h164Æp{Dp¨˜½@äE}—r|Í1.B¿¿ ´ô'C¯h3ÅGôñ,±NÁP×Éôœ&µ5)&š0E‹xŸNð¶Þ`@¥úQ+¶íêjÓÞ¨›O |!ïGŽY¢ÊÝj7úi²éÎ>ÏÔtó<š[Fõh`®tX“’·®ð‘šETé–N€§öDæ=V°­0ôCE/ ÃþÓ®VAÂÈŸaÒT D´€ÛF ½tô@ìamè§%€‚]tâqCçkBÄ@§waí||{è±ÐQÕ쮑ôåÉutê k>dkÕq!‰ “=í|Åç–î•2&=Ô– Œîƒ}.JbG,À] 0¥úªzBkfU††ûÏJé-Š"3”¯O7F×%x’­ŽxMí=ˆŽœmT ž8;™Pæ”íÛ˜¦6½’j§ì \¤bP¦`ÇkoÍH:t+_·…=›e?Ú ’t ¶-×ò e%Ú» Dý¢¹B"l8K„ü€jÜ G´³Õ†¨5› PS1ºÝl0drÛß nÚ‰j%Õ…Þ0kŵ4"Âï³G›4gm°Œ'F` # Ài„VÛ]¶þÍ›ˆ0Î1a”~{©žv\«KPœÜŸ,:yç°ZlÐð0ƒ¸Ýàåƒs8«Ö> Ô 6pÒRÛU’¹e2¾k=EÚ,c©€vD]õÓÚ×Ö¯þe@%©Úl†Î<ëbh¸œ“®¬•6é”ÜCÚê9$æ—˜8»:ä —Ý0’¹¦lí'LŽëMÏ7Émifp1üµ§q°dÃöOÙ~Í…ÕÄB£î»Ð¹oÇxjßð¥7‰B7—O<&k’752Àeƒ. ¼Hl‰°ip'.{Æ#!^pÛ••ÉŒ0FtR±Ã “¿Gè'#dDv—°rÑ›ûÄ*׿Š~5Àw0Ãy÷8súÑéÈ0AxÙv6]6ïpôR×ÿÝç!¤ùg 9þ`Ïag€%‚~3gœ×n’ºqIñözí)ÕGû1Ëíïº]sÕñÿ"z8?;ïÓÕ'œÞ2uÖ3Ïjîžr‡§D<ØQ=ƒkÖcàðÌö¸tá¢èEì^³V˜ã+¶&Çw©‘Ù߯?Ot¾lN@Ñîæ¶=ÿl™píNâ>ñªmöÌéø0ÛƒœDG¥ŽâÃô‚!`ˆA.4(R/@`|˜UèµÃÉI½Ýéxƒ5dŒãl'ÏØŸôC,5(äÕ—' ÎÚ n®ñB“öq—žÉì#¸Ÿ2ô¯JlOG¹_XFðgáN²§ørbô‰ä˜Œƒçw"PÜÉÏž1UÞÙ^/gÅÈ‚ª‹:nîºk\VÄ~Áó‰¢|§“Pa# C-z‰¤·k'eûú¾VªE·@*…&?ç…/óèžtQnïçôR^²¢~êǵ÷»ƒãhz-Lb¿Î=Ò&é}Û;b—ÀèáÑ›Mfjר–jañõà`Çó;Îocýæb…QM$»N452ÏÏ"¢¶­á¤ rÔ25&×rÃ6}wWøÔÈÑÿûý0Ñùq`LbîkO·ò8nYîzÌ8b«ÏCzð©q$;Å–Ï–Bò–I—@…µÿ-Іn®«ß¹á¤»6`0\ýÒé.zÙåjõ{  M1¸cà¦RgeOÕ€˜> ‹ùÛåŒe6‚®¶@—£rtLÞ p–:Ç\i  øø¿BÑ‚O(¯Ñ~ïA¡ë„ÍþóªÖ«Y•¶8*åV6Ò †Lt5Â!Çèµ@BløŠÖ‡Ûv…ãÏ‹VK&º8È’Ú‡PÎ!$ÎûPV½&•á.¹èþùn) ò„IÐsµ­3[”Ó ¤2²Ôê¬ 8íš”z’nJC‘0‚±´b ]“cC²º‰jVÄ~2 €C)©†~áIñ!f•Ëì‹{ðÈ—ù–ûþhÜèLÇþ]"ˆtj¯!þÊWdÐU.gð%Ési¡µ¦º} y›ÔãU*S?k¢†;P§Žä£¡Iè?@ˆ5)A0{¢‚”l‰GXÂ0~'Z! â!mÀn/”Á<)4Ê#,ÍÉu åb†â݈WK‰Nt‚â3L¦gö ‰`Sä”s2»Á½ú!òÿ-TDI¯#ÉË…‹'XÞ—\1Ÿ½ûUµ—'RÁ×è‚o?Ÿ·gyÝ6ÖQsƒÅ»Â|Xá[JZmâ‘WMñ•Eï'kÒc•n6©WÇΊMÿÅ.(ô“^:3‰jì#tåÚ±4M¤ì¨> vÃ~|ÌæñR̃^  ªS,!ñžã†G{¸0@IjþŒ¶Ýa›´!z`¥S4(¥ÇQ„/c!aU‰¸+ÌFÓ@`1Qu†ÍÝš¡$v¾JÅ)¥¶ª°Ãh«±,U)”¥n\‰˜bÖfü|å#DÚr$#ÔÂ)–·€Cá³g+@+°€hÔ±Á†–!šLÉѯÈ8©Œj‰Ö~a³ZEÜÔÃHö—‰Î¯ûñý¯Ç]hi:[1€6ŒØ´v|ÆCÈi­«æ¹aˆ;5¶¸0Œ"uTSDŽ0z=-tNYiû]ÜüxNM¶.v·$/ïÀ³¥NÖŠÕܧsg€l³7€ååÉg/§­ÍL3\Ô¨.‚2 É;Uäw ng·móü¾t’×½V¸—½ C€“çt±ÏìpþéÚÑLc‘Q·™åÃÁ<¾zyñôC»øi‰žP~úzD(Ìà.aÈÑæØ:@z”Ê Ï~n¨ËNË9ž¸Ä±2Òž€¨êL,a]"£2È-gß“½¼SÁô €ò@¸/9€»`ß8X &ך†8ÜÚ¯6½T™®vŽ É·$_]&‘S¿e Î{¼Xö3òMÓ+}_3¢óz@ƒÀbŠ9úï3öç+Éõì:ƒ cÒű´JbIjç0ð… jŸH_:o@[l€/œEñü¾~Ã?Y‚=鄨XtŸxŽÐùŽT Šãeð8¾BÚ«Öð‹:âÏ¿ :÷ÚÐ÷›ŠÎ¯˜&[à]-¦ú­çGðn]SÄ:$îõKœ¦ÉòS€êéí*:@“hWëð!©þýú]%”J»ÕS cªŽcÂ{°ÁÞ£é8W߬РÒR³C¨ÖTÚrLWö%¥ªõDþ’J„âz3<Z~…A³uhVÒ7ŠT@AŸx-Þf»àÜ<ĦdO½âzlpmáƒWD¡r#$\,J€ÆÃc)¼K 3ƒ>ÆfPô°AQ01ÐCŸ@oA¾~²$y¾¨¹„ §Aª¾ëRãíl¤3Ä6y$]L‘Ëî@Œ¢M\ÉÉØdØI¡´Î˜ vipjf»òµÖ¸¨ýPÑè¤A&â•?Xfê»ò÷Z–¾Äá²:›‡Qšßv”ÖëÝÆ8"7Á¨–si¿X”ðÔšãö;…Îêë˜Ê&Ûs|¾©ÙQõidÑ#všôš8 É€4É›A'Ë éä°˜ydU &í\>ãvåA÷Òƒku÷8XB8*k*—Ä4 Ìú/8˜„¢ ú æÅz|zx­sQÏ ­¥F Øk\XU}5Œ}X8þü ÜÃi z²BSª Yuï áÅÁq%B¿á[°g¯I—¦‘!»YL èâ]ЬÜÅLp¡!ŒI4œ’ æ8HMŸ#éäVòÆ”XÒ]©˜j,˜†¬@e†`6™")ë`ƒZfØã~2BÌ4MñØMî ýTô‡* …Ñb ©\á¿K½çZ¨+‘©N¨aÏHÏg9îժ㓉JÊY^ƒ5ŒÕ~Õ³È ‘r~â¾F(rÔœ¸Ë‡DDzFm¾¥„Äft­Ž,—YF—À›áñP—˜waåkD‹ÆjOÉ¢þ¦ìXæüzþFˆ‚r‡ÔtoÚºsÊBK«dp. ƒ•*D¤ù3€ÃÞѳ5Ê)&M³Ç ÷0‡ù´œ VN‡‚…޹9Åäɾƹ4†Ä†ÍÔÎèÅR³3® £H? î9X½•Ü{¼ë¼ê$J D6¿õŒïIÓ®9ŽÁ>|wÂ2]g?Û?Lψ|é•·Ö2pÓ$î÷#5¶wü“ŽX3œ ©ù)[$EÕÇpÒ¸d69àžK&3:2Èãae¨7iª2w¸K?iC…í.øÂÖ%ù+à”‡œõ ‡î'ŸjâÐè@öõÿtxFòÉ>Qêâ£æNc‰méüçÙ|Š—b¯Vøª¬Ò6ÅgÉÖ–Â8¬wúQÛ7An& O‡omŒÍ6€¡²¾Üÿ™E Ÿj“š!;Ѳ¦‡k¡a§9MâP‹"^ç®{‰q{ß,ÕU§p?=eúÛ‰Î=×q9^’m·ÿWÔ|²‚óZ»ñ]‰k¶×ªW6k]I¦áxö4¦PÎóK2ݸÉßF}ˆ¥ÉDnD³Š'J'¡ÝädS…Þ„Ù„ØÝmf’'Ç0À ð±q ïÔÇ/~pžÛ©é'žÙûŸ“í>ÅJçs>Òœøïõ÷Z «ð§ ñ÷zó«¶¾‰\ë.àÑÕpäQ·›ƒ~‰tùzê5#²ð:×Hg³¾·é’ƒéþvÇß닜ђA`ºŒ­êö·S~Àëv»ñ„ˆø¥æ_γÿ{ý½þ^«‰ëuFr>xÞänQ²è˜v:6h¥™5ËÚG„t¶JR‡^¼f”FW,ªÏö ¡$û梇«Â´a­¥ŠÄ@v•˾&}Ý=šä3= 0z<‘ÒŠ++zÅŽzû ð/¢kLÿ²”Q­)¸¬Òô¸6 ƒ­âÄʤ"@¯±ÀÊW šÑHµrµË_îÏF B”w‰ŸPnžf¶ÒGþÜä÷”ªRTœÒ£­‹¢ù_öíõgqò!7[1ûB>:#×Ñk´—̰[ÑŸùŒŒ°¦”s†}j¶ONШW^WEèj1F.)èZÊ”©J§·èb6»éLâI‚¬([Ç-ÿbçyz"£«´”äÕ‰ƒuGÚS·„DŒA ìHHÇ&HÑ4zk¯¤X˜6oª>Oar žxü_îPÛöñãéJÔs£qóH¬eðƒœ"Aºæù‘œö‚ng¿~Ùx!…A ,÷^ ²1̶ְžNª»¤‹ÿj륔/ìðÚCAÒMftA%T4ûçö˜ö!Hfk ò4ŠUùÝ>2áZùçbŒç .ƒ,%‚½šIw €!Ó,‹ŽW$:ƒ¹Oz«6Åš8¿9ªÜ3`}åÂ$ä(ÿYjßV_U;òvË%~ Cô…ýSŸíJ¬œÊè'±$ÈÀAQ f-Ðý}FTâÖ«§™OE¦õª r‘µ&1ºØå§$É{«ö &A`^k|¥ÉîAt»³÷V&mœ2bå{;T³‹Gèja(–4§ %wñ(ÄÉÖ%”bÉ›«~LÃÖpoqž³"l<ïMG»ê¶Î[)srîélJd<3J¡Š4ö„£»£Gö½’Oˆ0^¨ N—Œj…–?“iUã©ØÌ¡6 Dõ̱¦Þâ¼Å&úÏÁè#ßA^7‘Ðäwå0räÄ‚9’Ã4oÃ’·o‰¸g@M”aÑsû¨—hâ̺Ĵv ˜‚GçÅ¥bÁ‰)µ¥ÞX¬†{椾çVº~+ô]Ëô4ä,Ö7©–×Ù1 Üx߬U!opopjç$ (t³ƒ‘•ÁM‚è3õÄ7eÀ1¾Ñ 2Mox+Ú¸l lÀ?eš“Â[¦N±öă˜xïÚHSÄM&ý˜¹]ÉpØ÷?Uê*…Ñ–âËi X‰ÌÂý>WfKôBdäêóÎ8&áJº»pVe±ïé3ÜXf¹µúã]úlŽw´ïhsL€Îóe\ÿ˼¢IJŒÊ¨¶œ /Y<å;J¶|²ãîN3·2´½WFŸ3æ§úêÈø,´#é á©ÉÀ]Œ/¿ YÎ=o¿ ng‰4Ã|﫼‡ð[ZõLD@/ÏC&“kêD>aeÇì,HtÈ; …Oc”ljy‚$”\„P³/Óa¹êXwW HpNéã„Úžž,¹Ãu¾bý Eç“-Ã…¨©»@ ܾ†d9}¹:¾/¥ð¾¼’xà)7Ãt¢[Š+ü¨×Ù÷<ûì:Ã!6Œpl)•ÑÄðÀù¢Êæ¬q†Œçl§÷Þ Î†˜Zù%(îOjáŠÀåÈê¿|õÚ> Ò¿×ßëïõ÷:çæçøÔ£Õß {[Ãÿ^¯Ò8#·Û]Þ Pxÿ½KÂï.åôköî_´ù÷úq~ÿoC¿Û‚lP:ÿ^¯yøð÷zn¹[0µvU12ei’Óxbð·ÏºdæÛåÃn**¥ )Mk²V¦ÄŒ§cÚvNM§ÑC^Ýɰ U—ã2ܼ\ÕÒ¿­­uÕ£w¬ãÞ] ¿Ûgˆn;ZDèÁßB-@´H„1ªn¯§ÿP3\á\S í~õ™J:u°×ƒ>©ø´$ ïµYDÔd‰&ý#få©-ÜžFXçªÂl¢*÷1ž¢«'êa|Ja39±NàþQ3=&—Hj§/‹¢õw«±ÏˆGR(®8’F"J 0‡,”k ÇÐ¸é·±Ž˜‹ fp–‡­úržžÕØô¨Ê;…3VÅšþ(·%´ó™igÎü†V–ÃÊíÇ ãÝò½ ”8QÙ"rtGR·$Zá˯_\Œ½.Ó)io-ÖhÄÀXÛ œ‹7Tdà,¸ê1s9&j¼)°µÆ ¿Ø¼àøÒÑN:ÿ,«òâéM<ª C(2‰^IaInù 8F;‡¨RnÎjü‹¾Î›SóW®F„i·¬§OuFFLr^µ´º·”‘“™ÙCÍ–…9 ±nåfïÞ×LÚPJÖ.ë…³<|¦Y£YØZ6Ó€ÖH.¯7óB½‚vÛÇÏ©ä(Ÿ‡·Ç.³XœxéLñÒ5ÈŽfÏhÎ>ÕÊ–2R’Ú\?JwqG €–^ɱª›2c‰u+–h¼„«‘íá¨x•Y苾‡ä^,£Ba÷gDH½0ÿ#ÔSW²G° …Œ›7°¡½ÕniÚm,¥’6{´ÅAv>•ãÂÂ虂¹ºÜt«,Ø¡îËA”\¥`ÕÑû³f yèÆá¶Öh±Ë8ÖÔz>äÕÏ6þÎõn˜F5#g§¤þ†mãö9|=3Ú‰ý„QŤ@Ù»^ ƒP6{ÇÏÌ7£4IbëYRÖGé=µ Òxá²Ãe‰UÎ]þ’•,B¥7¤#»ÖLsq.ßBt^JJ/n C_IšTq]§CA…Ö'Š‚ƒ'¢COc°¡ˆ ®š<u¦]yשº]Ãyd´35/Ã]:±s •uÐ{ëÈ.äÇ$pðªŸÑ[±˜E&¹ó„YÉ3®ˆ9˜æ‹·›²$éL?xJuÞFw4`%çlFÛT6J2ò@Ã$ÔW¤öU€œB–ÚK65e:8[ÈåÝy?>°9?©Tô(¨°”[Ç…P¬Wgï茥d]ŽÈÐÜT0‚]ÚGrêó$ð9סýÀ|ËFVt8¶F—Êj#:dŽ£Öxbtáþ¬û]—$< Íⵌœ4•ö=$  ‡† È—2 Ú$³³ W%iæ0ˆ¹JZ‰èr‰,©÷B"í¢=l°[¥Cq™£™›åzn‘mÎ’¢PÄ6اNŽ´H•äÜ£ùÖ¡”߱Ǘ~FDƒ ä€^S}¬îÉžDŒOHH—¸•PxFàDK½›»£… D"ü=ýýR{Ó8œƒPHjxX³ôl&•^ª(cÖX(PeÌž¤†ŸîgÔpU ÕK?÷W\íþ¸ÝÄ0š¨w€õ7¹2õ‚¬¸bKc9«HB®HÜ©4U µWz@[)ƒMD«_}r¤òOi@e8‰ Ÿý..ý–pð€ÿ>@"Mm6ñŸ¾š)ƒÖy+&¡t}\•ŒŸ•¤ždv¶˜Zˆd `S[×ê,"LËó_)J‹•‹]ª1¬,oÐ^£ìÉÐ÷ÀU†À®_¿vr\dX†¾ø6õ$Œ"l“¯4ð¨ÉS^Õm ˆ°™Ýª¤¹ªù‹-Ò·¡¸Ño£¸ÅÀ4~M«¨Á¶¦¥ÒÙÃ!¨© ¢`€`"Ô¶”™¯oÁq4ŒM c©6ãeCàAšh‘9= *ý˜c¨”?øÉ´þ¡T€–×wTmÔÀb.em!±™]ˆUºZ¦Âr–”^sÕå ÿfH¬„²°( v+IWOÁ Ì~픨âàAº^ÄFÈÆ/) f˜>´ù2Dø2„.Õ‘2Rl ujI'9=­sùµWe˜lƒ×PØG»¸|ªow˜ÖŽ©ÿ¢óâˆzLŽ‘CÌ›yº ð¢×… €K^f(Úàu±¾ Ãé E½U㚈ƒüã.‚@³>f & o´Z†¨®œŒõðœeA_ yîýßyç½àþ$öO¾á û‹üìŸüÍ›ÆÅãéûäê»àÊV?êõÇéû{=gg~×:pëÝ(Sn×76P’Í£>VÝòal O) ›7uOuýˆ„ï¢"Р‹°‰X÷8þViþMùIÞ×Û5/ˆKÕüäO¹a¼ü3Yž5ìzg¼ÍHznÜ….þu^µ7¨¾Ø=­ Áxùý~¯½0û7ÜÌŸhå^že˶o!Ò…·_8BlÏœc2rvúÜaü…WþjÑùMºlàåËu®!û‚Å·!D •§×2‡õl_ËÀ®á2н öwêø™ü¾.ª«DÙaÇú"•¶{(P |Pý0´O€uo =Õ†° ÁòD=­÷¦‰‡»uΞ)j>^˜&D"£FÐ’9è jÚ B£æŒ­pÕ3KÚ9SXLA£- Šú”™ð·( e+¸˜ôZWp™M0³Ý.Çî%‘méS™ß<$‰Š$bPè. ].„ ‹*gÎÑõp(ç¨DÇ'è½ ¤á¡1”‚JOgÔc`<ÕÀ…æÕg°/E$Y ü‹¦a9°~ Öá*¤¼Ñ>Ÿ$MU¼ÎC)F’‚^rùâ°žÖCÒKt­0 †žÒq<ƒåAàÇT1…8’,Ù ‚öŒèåt`®KÏü`×¶2s ºeì!K •ßµV¬¢r®âÒÛX"¢[h*'ëso8įÙ8ø¢…¸Ç¿õO5Àîlú˜ Ó˜MЦªwô#›‡!´}0áꛃ™#dqÔfŸ­‰|¸t¢wR ‘–@›h¶uá0ޤFªß,¶n`Á53 íØöB o:dQŠ“ŒuV¬“_|ÁDŸ`@V# ÿ|èÔ‚ºMíYíå+~4¢£«(#|ð4€,GCkÐ0ŽôWEh5I×erxd×ãµ×`AÏŸµâ×ä1¶¢5Š€—w³F%ø˜:õÁyˆ³i•ŽMèyû‚l?Ї‡@P³‡Jv± ›xÔBäZCLQ¦²X…·&ÄÒ”Cæpgß_¾ûo®”EÊ“-!T¡íIøÌǨŸùmiì¤WÊ&C¬Rñë!‘|ìmDAsyºØ)'ï®Þ'Ö?ÌŽT@¡n ÓnwÉ›˜2 #7"Ö 'Ù5¨áÐt©!TH*¥”ûÝìf¹¥úG)¢ˆ2)C p²³%ÀÜ n·ºÒO¡ˆN$“BLE§HÁ·Aœ1¥ëËErEˆa\)ïÐ4µ¦Zƒ}ⵌÒjI9Xä­ÊôÙôZ:Ýú±É[ŠýFí{Ä«"šÕÖø‘-¡–òzè —8Á9£b÷+Dçåmo «©‰C“£F³=<™L \ÂØò–‹—|5V‡?ýºÝn'2™ nTo£Íï>œ<Š“Ó>Æph›þ嬭vÓg¸¼N•c4]PŸÉç¹'˜Õ‡óòèá¡üø™Î\[¥—êU’?ï!¥óä2qö¾&‰C<…ohy¹šðÞ'_â§l™/`Éw]ôf÷x÷§®öµöÄàPOlä‘Ñü Âê–Žš øÀ§×rA‹ð¦€IÍ=ütííl7ÀJäòʰ\ŒœN¯6íRÌ8•e\ÍZÉ1B·õP>/øÝa|šG{OÄ*a)~ÊÃ(äçF¹^Ìz•°2ÆcbB7¯»÷‡-L‰eÐÓé¯><×~n,‚±âŽžš{û‚ÃvBtröÒhŸDg¸ÏEx<±äèð²Žb‰ÏøÛfizþõ䇾®è<¯[}¶±µå €w,Èîu¾ýõ!Çø—ª!—¨ð½Fk!/KHotã:‰`¬ùQWæ)AÑh’Ÿi¨œ[Ù:—¢ëÃÀx¾›rëM§× MŸ J¹›†ÅÓCè]þtmÆm¬XÛø –XL1A&7°â$¶ØÇÞÉÞêTE€zg¿®z_IèŽó™ÖÌp©q¼{hTyø†6Ž-Ÿ¼ÓñBs±¯ÒœÐÞÌÈ÷²ÿvà«R Ó–È7ÞÞåiÀF{Â.¶Ò¿-L¼2›–JOÁ sÂÄ„ Á瘧Î$TA&7š–#_¬*ÛΞY¨£¥®º1‹÷çmÙž+¾ˆpåª^²×bZ¸.31¨ówL|‘ŧ-‹ÏáëE“önöžÐ3ËXÉœ ‘Áh/RB¬ Ö-A{;Ë „ f0ž‹eVÆ&b’rm Wq1Ø«‹Í’#§n|hÞ\«ò|•BT‰Ò£t˜B&ŒÛ —Oi½ð€8$ÑHh°¼%e¶ç{¸Sé^&ªà¥p ] ׌´%š*¶:§”ôÛnz½û˜Sn»Žo<ïW ÙèJë%¯i†à+RŸE°áR§S²Ô9éWˆÎO»ô`¥J]hϯ Ե렽(BN$OÇ$;ÄwVÓ1åÖˆÑÚM»¤·µÊæã{>Ú,öf–Ó\>I %U' ìi^‰Ýð\Š59Bäæè棹X¯†mÿ(Ô-0Ô}/¸WÖ+ePês×ìºÞ ÐGIn¦uìTSÉ[×h8£ª»+É Yauvi }Ø‘;•ŸU=u10©ˆˆ·zg¡±z^¸Óä ´K`¨OÈmD¡"Pk(­¾zÏÁÔ·Q„ôE 1Ô´986ýÇMÃÆÉ#gQ B‹¸raõgX±ñ¾WÁfã¤Á,šÜ÷‚Xíý¨lŒ_r²î.¾:½(ÈFSy¢MQú€ µõüa ·ì6E½HÓ¦}©w6ÈÑ7Ö…ƒ ¤× $q<³órÑa뿇1Õ¶?Œ­D¤o¤ù0±ôI~Ø!¥ei”DÉ0€$z˜ÐUOã ësžÊIïÝÐúalßKçÆöÑñPÆFÆ é½ú˜ñð .ÄþFºŠ`O+ÀdÄ'ØŠ?’êO®'@*O±H•CÒ¤æ–EÜþ B<è¢ÕîW$9Og-Õ ‡^YóÚÙdOa ¾’bŒÒõ%$·7¸ :ÛMóg¨¥^/&$.·ÍL~·çÕ¯h^NwÙuî#TsZ] ‚ÅñêN¿ŸKUªbÏ¬ì ¹·ªx…ìTíègËPÅymÂ^DÓ4Õ0ì•9‘êÈt‘3v}FQ¨±uzA>»r¦Áðz†l‹ÈD”S÷L“¢Ô°*%þJK«6·(÷„…)tè Eð$bÌH&] Ç(aAFæ3éó0Fã êêJ.]JV¬2ߥƒðÞÂÆic MP‘¨þ…3ušàJ!Ò.)ÒgvËu¿ßÏú5¢óB :€Vù „2}§qSÃÏòe,C›u'JwWÕÔ„azì¬xÙ>Ê÷Yq@-Î;å ZC›7<öLU‘4Õ/£Dœ)ŽešCMÖê™J´\üI±æÑùs«¸p[:7.S+xy•Ï܃±“8óĶ–Õt#¬iwžzXïq•À¯wH§ãúÞó‹ãß>‹}ó„ñúJ €Ñ©Û—>YdD€íe— LɆÕó¹¯Ä\„ãÜ}pzíg7ƒ«ØXMa¢CÉ”ƒròÐÔ9@•öÄ<½Íâ u\ ÓN6'BŽë 9«{­”ˆÐ]š/¿„mµl§¬tôáÜß¾)ö£’ÓõB˜€‚IGüiÀdÄè9O¤=ÅȺ)Ï1ù´3¼Rì´Õ_—­–°rºðiíß'—k£º˜AYãc¾áuô È™_‰÷Ñ\ª÷=Pϵ €ëcÝ©ˆßn:‡8þÅdï}.@UgÇžg>røF0|±aàþ@ñ)ÓúT¼û²DÈMƒI—¸Â2®‹À7“F,èCX ­‰èü~t07ØW‹ _ð\_ñú°~oi×pÕø._þº°ƒYèQ’¢Fs”ËÏKáÀ‡EˆŽlœÓk¯Ÿò_X7â‘·8úëW=ã7baÉ9ºJ´2tký(v*q)>-§§QÕJL¤Šuëá²¹4²K|þ Ã-ñ5ÂíŸþ"N!+«Úó-„²ON[Bâ¯ôA/÷gp#§>ãª0ô…+W•+ .®ªhŠ/µÉá×· ~{5ÞÅ#Áµ…‚™ý `íû°º ðãÔž’ž\,LcãásÛ6k·þ$AX)9^`_‹(÷²æ+ó— ®:»?p}ú,×AÕßñ…ª!‹Å8wÍ_K+aåâ\`xÝ®øä €NÅÇäªkøbÖ¨R´¶ðÅCb4KÃV›:)_R÷, ÙD¿±º Ö-›<}¾Ä¸Å•Ó@¢ù·?Á†…ü ¹¿|þsl -#{þâoÀGî¢x%&òrÌšü$/üõEçè¾\4v'Â0î•Í #.=Êæì …¢JY¦9ã1*´ÝNб[Øê1š½oÖØäŒ‚˜=óÑÌUz\“ñ \?Ï»·F²€MÂ…Lò(õ 6Ã"Õ„µPK‡ö»zž9KÄBîr5–§õ ¸dª8ÜÉáF¿¿H©~ùM ·=U•‹ˆ8ÀªÈ‚MnȘPs;'Ԍڧ¢võŒÒ+¯ºÿw5=¾?°F zäêAKZ)Xò(¡Z—˜ÀÞ£FQé=¯¨,’µt±‡R„“›ËHyÝíÖNb@×¶ëÚ¢"cÅú]¦ÑZ$`~ FsÜþb¨ab÷7²CÒhºm0Hnˆm—– ¢ÉK•à`—1éãào‹o!²TDR\{œ°a7¦pE±/ž:üÊÒÔ‡Q²5D׃b€p6ö;­’8õYw#%'ZØÔÆ€-Íô¿Æá=ŽC¯m= s—Ú½-’¡iUp|d ™&UÙ_¤0R-\•-z¨”0°‡TlRzaxØ\»äZØ~MÛ*¥äD´U™ÿªsÄIžà “¹y(ßTD¥Ü:¶ŽÉ×YÓ'DMÌyd1Íðõ÷WŸ#%x╸l”©,¨ŽÐ´´ÝñîI·öÊzç”d¡¦ÅÛƒ´°ÒÍS9–‹Ã[XÒV¯ IÑcšA+…@[¢Çj¹Y†t¾· 6Š]Á&…3ï+¹›”TdR³¢c«©ðÃ(Q¸ýd#”}]!ÙY¹îtwewœú\<–?‚xKÃ[—PqZDÃìM]Öˆº}ÑmCéŸÿŸ5…K‘Ùi†¸/µ2rª× UçRÞn ¸ •Ùõ}d÷;Çκ•÷†‡Bš7Y[ìÍ1ŸÀžJÇÌhýª²™º># ‰ÍâzgKÁÛwI? o ª¢¢"…X‘ÍsJ‚"t¯[X¢Éz6ž\BnEŽƒ@Má2¡//™Äp9¯-ƒ! ÝÚö`‚DÆ+UhEÿHû n·P}U©]”U @*¿ÔFàv”*‡¬ÊCE9ùšlË‘V»OÒ†^ôÑB§—^‚åk›ø¡¦ˆ”Èý©ƒ!²kØkäT{ ú@”Œ T`x”; å¾홇|ÜÚýN ÷…aIqÑ…mó¹öÑð˜øÔÈÃø‹Ì&i@}h¸KQÞÚÀ×*h†fT»”‘K•¾7…%As5ìŽ2ƒ‰%;3ÙŒ‡ŽµVþ-è>ðc„”r*ªÅVÌóDWæò£é†Ïy5…/æŒRû—/(:¯Âbåd"ì^ÑÕ£`¾ŸdÛì1€o;-û¯ °·¿¸&Ú±OùîÆM¼jZ±ÿ|ݰ.ôÞPÈ`Tð|x€?dPPFØÇ/%Í8¢DŸbþÀàCyârÄEÇA 9 ÜSi fâŸNÍú¹ aU@Ùe!q»G—â±)}GÀfúó©â€¿Dêøïõ÷ú{}ªEàR"þ5_‘ùœqõ§ßà  ±‘óñMŸôû—»”Ö ü}wͰ àÈr.ïø$C'þóë›:ó…—ï}1âH L€×–¹Xuä‹=¢KŽ@eAJ,üwÙúï)Ð ¼wWÿÂÔì5ŽÕH·Ñž›gf-\¼é>Ã}8 Î{B‚7Y:t-ƒìöG._tÛ°Ë~Þˆ•·ÞjQJö:BMq:Ìùt3…ƒÑ'½“/‡Îàˆ2ÏcsZÞ‚,Ÿ}´îŒ&*VèÐÄ«ÿ‹´­øX>Dl”†¾~(ˆZ§º œKúC¿ÒÉh\M_–#º:AG!Ðf:鈺¹û†ÆóT6Z°¦ó«j£ªwùÝrp[Äêb7^“¿Êí4vÅ9êv²Iš] „•c%‚(UÇF8p^Ì+C±ß\©IS9½33g+ú©u@H )­º 5¨ÖMî$ g1 à¥CçqÙý°¤*s2ÚwLN€ì'JîPª=§ßÄè™ãg…P ívÒÍ%x°3êÖö ù`X„ä®[è’S‰šÝ÷(äàg­7 ouþ3Md¦§È£©ñLâ©Îs„¤:—£yÒºj§Œn»ªf°7O Ð4™R¹­€Ö[FEoEëаì^eƒž+YˆoÜ|Rè2£AÿŒj»½Ú}JPefeè ï$Ë¥Rˆ°2K\ÌôWœ{êe€¦ ¤b¦Q©“«Ó‚DÚˆ.ít³ÄF]g˜­esÔ„ e8Ó¨BfMè‘Ì!ÏØ•ãŠ\ۮѥ2}‡ª¦«” Ù²z4”"!ú»+^Š™£!Æ(w2ÜáýÙ¢óE’çLñË#`¡þazUm[”%zÕÆ<8µ€ëº¯v]¿È8ŒÃÎÅ"°Oh¸ï;@ç[üH“Õ¼áüv TzÖ·E_0É2®¡ÔÀ‰kÝLã´á7L>&zàaʤˆuÌãS0F$1;GZ”šEr‹½åJ! Uä3u)J2ë¥OIÛåN™ Fc„ó]D 9ûˆÏÇÃd>ê^]‡=‚]Ì:IØÁŠäWš ÜhÉñ{Â÷a„“ÛØþUÅÿ'ÆÑy•"`¡0rܽ”+b¾ø×LÄ ãægvÆÉ ¥ä<¥°,ü®„pò3,€¿Dnßè†Ü[1ßÚ¢h.؉•P`EÑ.4»¤-Çq¿mr?Úó‰RVi)Õú4CžTE)¤ *µ2,oøu£x"‰ð™OA?ˆäP&$P{GÀ =ùuÄQ$=¾dÄ…Œ X4¬IÏ—é Œ„€ÒÍu6 ßz ‡e†ÓÕZFg#á¦9Ø+D8] §hú-A~Ž@Œ¶©e݉p ðÁºd?J0÷¬ƒç€<•œÜÄ›øl¡xcò¨Ó­{ãÓ\y|%Ô#^ÌÊ[Q;,Ó>Ðyaòª<<š,†§h É E=¡'º éúû¡ÀÉL@¹¶+¢‘ʲ×.Qô°öÙ·™o‘Û%ÊX?ÂnÚ¢ê{€¹?£V}¡Ñ׬†„…‘Æ+ÊĈ2}Fš`ã$[{z]ëon½—œp®Lüa”#2e¸\²ég­-n€ä4Éf ‹oÖR)2:7ãuKkø³@»<âÔg…Ù–•Ò¾}0žÿãÀ7™§Ð톲új#œƒ®0ÛÅBázÌv{þ®¢ó%®;îbˆy\‹ƒ¥dY®sÓhò^¯ Ñ¼}€á¨b碱×!l7J³uä‰Ù¹C7¨;¶Ó@düR&$A>‡o­¸Pº»“B†÷‰k‹Zr¾Fù^ gü2–„é4™¡ŽÒ€’q\ÌmœÈ£óHüHf9mÃ6?‹l&YLªG÷rÈ­pLŸ\$CàŸn.a§Ad{D Å ¨+a›Ïn3r†ŠÅŠÍ$RÖ+ɽ ç‚R+á’€vàúug.sÝí¥åE£kÈ™±è¾Ë}©‘hýSÜ5˜)É4I·cÕËòîƒáæôk» ò~UÝ݃l$®þ"Û(vì}eð9JÂÆpm±Α 9–@ÑD¬ì=s]’èìTÅÉ[ûÜ+ÿÀi ÖßÞ“­ÛÀqà¥/Á kþš¡QÔKÓÞmua,{3ãuÖƒ œ²ÿ¨iƒ l#ûÁO1Ö(Rz9Àpå©ã@ÅÌÈN”`$Ø) ²­ðBHN”ô,S§8kôÖióJ!h™Ùί¢UÖ/µ+¯,¨é‰Y\É'½¥‚úSñ²?Ø»;:AAì+Ú“E #JÈÁåÉ=Råâݨ87‡d )£c; èÉ e“øÜî©ñªRRØHÆ5ž_•¿õ½ÿ9eë¹²Ñ$z¤ÂJEf}Ø0;5ƒ–ßqFÞlC§tÄ×–_’¤ Á O§Tñ´Æ5@%U#t8äwÇÇA }P18ØÆ{áèƒ=2RNdzék% úeÐ< ñ»±°È"ÔŒgôåìÂMƒˆ÷8ü- €fh â^ÚŽ6?ÊÄg ÈÁžìr#ÊŠû_‚…ÀB <Ë õ #.<¯—)ÀPV®Ä%9ô‰åOS6¹q û¸?|Ló­'ƒc0³Û[ oB•FÝã³ïø V«`Œ Æ:!Æ'‰Àe(À¶Ôu—P‰cHk\«éÉÂ`> ïCOqT³)T±#®¬@U±uf%M•ãkøÉM¢H q¬(Bºä ¢ ²2Œ*೓äxyå}à%šÖH•Œ5uª:ƒ¨vÁv{”™m@çO§•¯Ë¨Šè3Ö[tøžty¡H/‘MC=-2(S±ƒ°»}¸‡#FxGáé%Jˆ»¤úÅÃ'ãÍõ˜g-%1¸ ä°,ÇÃÃ[Râ&„e§•Ѭٸ m–Åç@ô¢OK¡¹¢´"ËÒS1NXŠâà ƒÕ<´÷Vz‚ùš‹÷<ƒã¾ThdŠvÕ–  ä‡#(DÒSY¹z­S"ÔPb€;¨ ñ顉©Žqî®VOcú o'\r]šiÄS³9=´­ l…x¢ÞÖq3ð·‘ÂÏ„¤•K‹°¾]”¾œ!•á ãÊ4~Gv'P>Šü"¿ M.šõªP ölz&ºPŠ@§ßÌuý‹uDDXC7|+w1¡ÄП« õ¢D{©WÍB¬¶ž˜Bå²éÆø[D›\á—]€Û—*Ðv\¯J.ª~ã#rÔ*èp¶Èša:&ª¸tñÆšÉØ¢b6‚c8m©M;©M¼ª@ÕÆÞ´»êãMÔˆ!ÙÃ)²g×®;¹•K]ƒàgI95y®¢‡ û!¬†Ø" “öÐâo!:ï,Õãžï21yf0¼|¹à¦yÆKiï T¤¿ôÌ„¤Ï¥_ž›%n&aø×Gy'×èù%ŒõøæÊüK0IИ#+ ©x‘a¥ýªòÒYÖCö‡Q!3g Áä/úÂÉ·sž¡¾ù6¾ MïOèïõ÷ú¯×9†¥ü³<_6àûô­©ŽŸèB©žX(³Óÿ‰¿üÀ³õ÷ý=ÿ¿ 9‹ØIµ @! |Ïà7>6öïéÿ/‘vè¸"ù÷zá©9€Øû½x‚c5Ïo)åäø‹¯vTÍPÙ«N_#ÝDUàý¥» ‹èª¯Þ€ß4øå9¯¸’>7'É‚ûÕPÚ°v> =:68EŒ#Š…úÞ£ÉI¶êÓG¦ûHÑéc´Êk)¦¹°óujÄR”˜Ct‹¤?êÝOg©Ròðr7©Žr€HÃøÙKìÆ±ôîjÅ„Za¯ë˨ÞÉÀéTÕˆfEYñêEß›Øgqœ¹)%ygQŒu¯Ü"Lu¿ˆKbz Eî~ç}‘¥V ÈŽiÓiC¨‡¾ãÁ8’"Euú~híÔƒ•˜úÐ8¡§nõ·-‡µ(¸rõ)òCÉ'1œ¢¡Ù29BÚ>&Sïå†_N)¯ Œù²7ïã9¾ç×~Ûó ûÉ'““7Äþk&Óg d>ÊV(Þy Kù£tMë4¾Ÿž¹Ö¶Ÿ6¸+Œc,ÍË–‘Ë#ßÇ{¿JÞ@†ï£¬mvqhù¹60b°Ô(ñiÄüX´¯Gë Û¸:ÊQp¨©ÏÁâ· OÑâ¤B$߆3Ÿ lXFÉ­`Ô±°xÅ’øôÀ4 ÚâJW,¶bfÕá~a˜½’€µ‡¤¦ý1.¥,d<ßÖûÛ(F(ÉÆL×5®Âëý³lM¶"O÷1{ºÞ“f˜ñòª"æÊ™Gi»•iˆc!”æÁJ·ò8 C’@7ÚØš]çË,>íìËðÁ„gð%qÒ$~o¤ ÌàÊà›®ˆÉ¡ÅpRvð¥Öy"ÈÙˆ°~ì1ø¡ýÕ­±Ü[®Ea Iߪ/³õP'g‹Ž5…æÈ…`ZÕ|u¨Ðµ‚ƒ„„ƒi ¸\À•Ò)š§¹ Û… >¦öÄ—FÒËÎyÓ°üe 0x®oËýYµ$ñ¼Ÿ&),FVcQÜ꣼‘O”[pÖtÔJ< ¨žrQ›·©ˆ`jÙh‰€ $Ã&Ü´Ôz»PQ“ááÑï´®gä*Äôq,–;_Ùmº¶Í‰k{Ψµ¡?nˆre;*ÖžPÎs˜¦­µ°‹ëèšQKâ>†÷+}Fòn˜‹}QÑù¾ýDÇfKWwI’&år¦¸Ý5 Y—®"ÏRʽyF%‘RJ½Ô·|Ê4p¥ ‚ßäC¥9?@ÑGø˜¥”«Šð-CafZŠC”ã½1¯™}œþŦۯ…¿W@&è1d1U©Èƒ¸f±3ä T>ð`®1/>äCF#ü$×ÂA„ô åß¿¾¹ ±vÚÈÈ8$4WPrdÙG ÔÆ¡7œ(‘¦Jºk>4»*L1Ó!j©NmÁ@{Çü²yD–5 ŽØ h@ÿ,ƒ|±çÐJLP“q‰ÃÒÞ™{§Z ¾¦$åÍÄD\kÑk4´Ë›U\3T(e Ê¸è3@‰‘¹î*ìó0àÔú匉pdÊ+L–˜´„¥AF;BÑCYmôCjcåêÃûÈ&&9œ;´Ð/±îAæ½P‡‘^ð'i¥ÁsÚR0R©@تþf08¨¢î4µ5a ²}•€YÛb¥×U³¬VÐ OKVŠêqÉLqL+d<„·8šb¢V²H¹ £½©f/–’†å;Ulj…sç¸ßäPh©”‘ PŠQ’®ÌÙ‹²y]…f]FÁ>Ñ9¢ƒjªL"5ó6€åxlÒ5G²%]9Jÿ–šXæF+J‹¤œWOe¯@£«Òëf„¹–܇."¶ûQ\^\ä0$ëTu&v­ªv?bgÅcó®|ÝóÉZ7‚=ê6êãÙèœ=8²Fo9D4üÙ»ªÇýÑ¢ó0Ó@£Gä ³»ðÐ/]€…GYy¸*ýÇc¾²s*ÁI$ã0ˆª>Ê|…jé+7·Ì<Ë)ƒææð«'õš´ 7n+%µSh¸„¬ÑU¬ueŒé*äf9ž‹á € 6Ó…ûò+Ll/Ú¯\ž/.ÁñBðÚ½ð#–æïuõ¢ròœùTð9BÏ5Úy¼pûàÉ+aá§/ˆ‰æß[q¢ã ž<œwAÙþ?f™Ãý{9©"!ízá³ù‚Z_|çùŠå þüÝÊ"­Ì˜Âë7Ÿ¿‘õŽþW¬Ò—Ðïºn³1 ¹+ÌùÊä`y“vø*ùbÉ™0š×nªòKæµó¥B8^Ð>4ÑaJ¶Òº‰o«Ÿ«™³ìåÍ}¦ rÏá¬zÒ³{ÿ”Òúb0‚³²ÒŸŸkXÈü‹»úSÖ65–~³ÕFp¡ÒB19O¬»N››°ÛÒ3n÷ÈmxW‹ØèmÉ•³¶šH«OoÁ;á£÷{©ixA¯!Õ½½^|@£U÷ÖGªQ˜<þR¯Uãq TØÄ÷NjÿQĸ˜QêQ>Ę Äè«dË4ÀÚìiŽâˆQä‹<¡E÷Iœ‹ÏÄÍ 9§l©ÇÝ‹L”…ý*$8æ¶T£*(ãÊ–Ùý „‹ô/1é‹ZsŽW ããšLÀZÂòÝÁâÞ!G,xØ/w³‹ T5\ç½u%¦‚{×M§Av">äàz²Âù”‹gß¹.¬$#H.¯ƒùoÆÙG aö±”Yn®ÇÛ€ݨpÌþ}I)>èmv»yK Ú±ûÓ0°%Ï‹ðù7ì%ök§ú!¶*øf}øˆWèÛBû>®)Šmä´oä-{aÆïG×Ó ¬0’Ü/ÂÛOF&,1¥P·p@¦ 1C-ºî{†·÷Ð?ËÇ^ CMXÚmçîÊ+RÐ=—°¥ë>»ÅÅCžJ˜T(ò»Ìµ8Y$©ÏÕˆÞB©O[{ÕY.Gy^3¡pçÈ ÇQŽN¼Œù¦l6MM[¸µdæ¢ãH×Í¥¸L CRj^=vW×0ñºý[…ï2”y¢˜šA26˜ZŸLׇ)ÄS]¾‘Åôm0VÉE™ƒMƒ²C–ìdeÛ ûE?f#DŸtÀSø!E3 U𥋄$«ÇÉið)\|=f¨ã[²h}êaÁ"5™Lx_ƒ ˆ6•,OÛÓ S˽eM3› ÿ„œó•$€*ÄÏ{ÅL3ïñD¥(±¯~~”ÛOæÆ# † 6_²ìet6½Ìuz\m¢™‡hˆâ”®~âäi¼‹ñ’ï#=qCØpp“´^ÞEÃ7_ž@½ÿ…מÍ7^ýIÃyÕ•àüÎûô]ÀOûª§Çáqä±Ņ‡}닾À¿Ü ÁoÀ“#"¼ã žNî<½%€Ìö®PC¸yä'a©nö@¦J?Ùâ}>cqºÉzrÁqÁSöÇlíÞFöE;‹±ÛFþ$>ÇàžHÈ·cDÀý˜À“''hó…¾’bçŽÁ+¢BŽ£¼æìÒßò@áôßîÅÚ¿¯I¤ÎÐÞ.¹'Û‚ðtd³q,®¡•7Zj«“mTGÍ3_X5*Fí$ŒÎéÚVóRÑÎo’óR½çtÛðuÊ$bZÃ1³Ëݶ̢M¾5`<·K¥üpÑyY`â5—·ó)'ž‹Ó ¾Ááú~(czž™½ùú-nðQ^)ᥰD>eƒ¿CÜʲVÃÂÊô¢yüË>NÐ@ØhÕ}isïÂbÁ+¶hC¯=·O¿÷KQ3H‡rMç ,9Ö»To$Ê•yvy¿³ñÒ]O?áôVãÞÎ$Ëlè}š”]ãó2H†s :0MF. 䤸¦œ5—ÄÖÓÃdâ}^xÒr,ÑžXNŠøð2Xèò’üLQÜHêÉõ¹¸7Œ¬Ú¯A¦a#^õÕÅè„¿zGïBI/úì3]í‰PJçøŒñS`Hò2àžEß«gBÝjýäi*öNÜlÏ<_@È ¥¯6­r4âójÎn@:ùís‘/êŒbÒhËmõº–®~µ…en©Mßü¥*ke#®— îK7ä{nn-’ÚsÕÔÉ¿Ô,ö¬§}9ä·s=”*´zÜ».ÌNƒ˜-9hË}ƒèÿŒ òìd™•ì/Š›öl0±É*Z8óaKÊ®šI®ëë9ï ã+âñµÏì‚|=Lîùƒ˜½*Q  Ü0³Ç=ïc{ÎgŽ*L¡Õ9½,á 4sv’²+לž*u©Fë)ØÍ†ùÒ­ð '‡U—_/:¿€ºœ†,F¿è£D«‚Ò'TÚ ZûÅî'å!™=÷¦gDô¨V«ÓFæh‡A¢à1…¾¹‚þH)Eç³Cú±zšê-<0äa± ôÊ›íâP¨stžu)åÎ.ÚÂ6ƒ[­T¤êŽR¬z›ÐhþÆ\^u‹ÛÌ09ˆŠ%Õg6™! â¾â$NZÛ†úk# tê`—jR¥¦SÈLl;þ(oPóòP5YÈû¿;y¿ßïz9ú(t]-§àۖ‡Œ¢êÔ&è-&„“š8%ÇŠÿæÞ†4褽ÔQô–­ –«i{¶^µ®ͼ×Éðþú_AE?êdUÈãvZ©!øvÿhUurœØ$ý`ÞP¬]Ÿ~É‚Â=q›:À2;_`r6´*^¦Ãèè=®*W-Pj)NIËUéôi¯méèƒX7<ýÞëæ‘R{° ‡™}$>T2hê!ù ,ú~¥_×á%²3 5ÜEtÙžoÄFÄ£íˆÐ8 `¾|fÝ H¹2±+Áß:BøÈ ‘ ªWîdÒG²:W†#DgW›ë°ÍÇ}sçAû+k2hžDšn“ðᡦֈ¢´SqNdö*;XµlëxJlE Sßôº0‚¶¥Ò*…`û„¦uå$8­L§Ú±½] Ú/Œ‰Í¡XÀmÂHN€a$' <3Â=`A!Z"HAW žµW Ý¥Çy®£ñÃÂ~ÁÊüɉ:-1F¢rê6.4þ+ (ÿ¬G9†¼xÎTÃãÍ nÖ*– Eù㾇¾)7Û¹#Ú:šÔ¤XÆCr«Ê5ã•¥;1:v†<ìªQd…BýÝZ_tz¢ädB§O¢u;‘ù•Ö¹ŸXQON„‹SPüRëST{³Pñ>mLê߀~ÀÍûÍX1@‰i+ßÈ8B !|A/VC¥Hd§®£ J¸â¡"?𷘑âwÌúcO¢×„ÆE|L„[ÁȰ h¤¼ú“Ñ[Ð22Ã@¤­Ô©èFû±2ÆÔå+Ç=ñ Sʆ?¡¡ÌÑX¸¼É@™Ê±GfÔ#v8ð NÔƒ¡ ‘[ ˜*„X%êb¸v+Ç&Ò×ÒëF‘¼7 ̳ïñíB)ûn˜Tðü!³$ðÈŒ¹·C|ÒJilM˜8t¼nŒ¸_ÙþOt-g¸ºŠN·dVcd El¤jímY&ÔKwÊý‰¡»~+Ÿ:¦Å„’¦ÚÕúããO“”y¡Át…D/i‹œ…4áÆc±Ç²]ylF“ 1ÓÆîú—o³žVº§xê•|²f¶¢@>X"`÷wˆÎ«3²«"Õ¢TÔ¨8ùG èαÆP»cØp..}V49 UHÞ™êGž¨Ü—@ÍQ}9:A/•Ú)ò²eVÅú9/$úûÈ{Æ1p0>õËDoh*Eá¸TJ(„h*`–Z+aær–6¼Ñûý~¿ßyÿ×ñ‚`¥þá:{͆Œs:Ò®Y<ÃãJúnU$;ïë¨mž O{a~`÷~û{5;›¯`dmªTìyúà] .?m>woŸÁÀ+š¸iÀßkùÐD„.šÑ³,ž€Ý5(‰µŸJçF8¿ùÕ2Ù½²â@ÿˆbk?À…¯6Î×0Œ#õZœgÛÄ|%oW@Ôc…³éÊrkÛ‡'QM:Ñþ¤Øb¬è_c‘å×1òk˜‰§Á°ê‰mp*¾Xäý¤ãžW—û"[§ôs"°;Ƥ¾n]'!’þXÞ«Ú•˜¶LúùíÁð`è}¿ÌÇètlÆ;ÅX\‰Î1tõ=Ø*¢ KÐ ²ó6h„Ÿ™Ó䄼Ç-wÏŒöÎ'Èp;a‚Ó|J/K`Îü-iß: Ç FÃp¦Ïp™@ŸVHyð~rc„RkWËþнìÎ=ƒ! ÏËf‘û0§èRç„ÁfzŸµ²óKDç?á5µúYHyaºò…ó>.½t;,‚%þgzw›ú?k ¹Î[·>Añ* ´t87O7†ëhÓ#}ìh¾¢VÄ?~ÑþV"ƒÆ\îX$fÊÁ‚Ãr¿ßÿýû÷@ÿïÁäÃ¥>xôê´ 5@;<Ÿ-­ !{r¼“EßjY`Áš"¾¨ ÁuW‹wèš½r!øÓ¿qÉ¿~Öà—z];Œ€—¾íí°Ò¢EQ©ß¿Ÿ#¡·•ä…/Vz×Cp} ÏY›½*/½‘0ï‚ã}#÷ºwªeÕ:Ø×5ü\îwIÕû+–Ÿ4!àòçZ™§-/x®ƒm‡;•³M\€¡5ѽÿG ¯ÓT#sY…Dk ÏápÅO·v—(8õv.ýó—jä¹yBÈÛGïûĶØû«G„.*ƒìhd¢ ¯¶w§Î•Rn]ô¤¨†kß炦Ñ$¹«ªñ[2ê E­ H ú~)À!~ÏÃ'6ýÊüaGÆëˆ;jH4ó´—ªõºðÂP³Ñ:qUþò±)î÷;ØÿýïlIÁ…Äò¡³íÙî–íZµÂÀq7<æÕKåÑ/¶’…Õ”æGàwÙÄ(Üp½yËÉ@Ø'Ýg²‹E;ØÇh%-Cݰ£+ÿsC›…Ný&dýÔUé§Æ%b©B@dœ—´E§’ÑêòÉéG}|½ÁtP­“…%¹ ÅKÿˆ³éͱö(‰NpµaD¢Nu2Ó”Â^°Ké2—ܲ”°À„âœÙ4ÎñÞÅI‘H«‚åszøè‡ÁqnmNILlL#Rö£Ä!G*ƒgÝ7m” ň—"JÀ7ÜÌ5cjêzPTë(ëÃNªœA¡aIèáå](R£õ«.³È«‡yX­¿%¤t×Âb5J·M©W]½ÊôÃXñCyÖ æ°ì6ó=BˆÎxHƒ•’igÜ÷pn橊DeRH~×@`Ó{ï·È¢À};ý_”-ü\ÜöoÆ#YxLc=Ã]ߣ¶JD7nW#Ka\ŠeŒwWö˜µà-ÎâktUÅ*V©†é™ºn²I‡áô´˜(iVVn*Úl¡sßE¬INÓˆÖp ݶ±‹ ГL•»B ”,Š"ì éC=4nž¯s i{†¤ VxÖ ÓåGJh¯¦Øî%|Oe†ÖëÜB?ò­oŽJƒ†OHÔ@æØ¢f¦øú8™=šÁUG¸¾(5=9þ‘ýãÞv‘=–uxJ)·c‘oͱÑÈÄù™Ò€ºuíÄ~J*˺Gc g­x%Øy~‰ô „Ùooƒ9Y[CÔ Ï଑^@a¨Ä"5¬PÝ\ æY'ïÓ).¢\„e •³ÀÄ;¥= tÍÎCбåDéû3šÀMc»d`ÙJAR ¯KSA®a”¿Ø}D‹˜‚¨EV QÖMTè¿úù”n…ê}q›øm˧Æ´zLw«-è`g¤qRø€)ôxÔëTÉæv’ˆ‚â"r*‘u¥QÄ6*͚˸įH¯bŽÆÜy™/Ľ$0ŸÜ3FVB|Ÿ—Å$'h-Åq1¹–^!ªœ›H-%gáZ8¡–Ÿ+:¿QøªV"Â.‡»£Ii•ˆ‚ëØ$‹¿@S\ÛAÀ3|²ª'‹RA^üÂ2 [ç{Äæ˜”<ò‡±Æ\®³&|€¢\¾¼@3°Ÿ` #Ó‘§£ÝErpGÌ~ï(Iå~¿ßÿýû¿÷Qê[ËQi±Ï…04œ§‚¦ãQN±¢ÿ%¡‹Lž'\ÕÊÓàÂ’¸TÚ†ñvÐÐ%ôÔ­÷˜°°:§ Q¹´…ÍãĉFâ@S„³sŒì¢viqˆ5”ü`9{ÞO|ä{ØÜºiXªz¯´hm¥L‚6[wL ‰^)Þ(±kijþ@F²Øûî0Á˲ø¬~¶¤¤VÄó®qxO#ìÝÅ`Åx¬\Ü" ãzé_í( v`i€ÝŠzÛ[¹ÒA/ªé;Ûó-‘6zØÍé48BFd ,miVš‰0ÀPCR£:Ñ&†ô‚YŽ?SùEÆ:‡{ë°÷¡¾J¸Æó 0Ú¥q™\jµ§HÅ.Åí«ÏcÂgGˆ©sŒ~n\ŽX%Æaós†¾xÍ` 1ìÆX‘µú!Ô¾Ef*õ´*úZæc‡JèñY3>¤ªyS)Mm|'¾BÇÉz—}dK×A‡î™¸¿$+xÜtÙŒìhAë=J ´‰1_6Geý? 4lÙ[î)`Kö…q4Õp½Âukc1‚°ò ØC¤4µ{ç…ò¹¨[ i¬'†-£Í”Þ£CyT‹Ü½óÉ씬~²úôaÆXD2NÂRE ؇ä$€Úž3&.{,úim÷Ò2À}x%P UAM&±T²oÁæ>|¯Jj› ›7ßLRx$EÑ×38[u_÷/ŸÁ>KÏ¢x åïå^ÒPbq·{»¶ºTYM·¡èãÛNÕïÄ•–E¯À©º7Žu›Cfìºw^át%ÙÄû۵Έ¦Ìö‡qç,÷ÿ÷ß¿ÿîwÞïÖˆù Érùh6ºÇ+ðŸ°F{¢nd<Ö³’+0£)ÌÉosÁÛ}ÓŽO<°ËÐÒ¿×g½ø÷ïõ÷ú{½ô,Kí…ƒ_èþÞdñê/xKúD¼}í^¾„ß1Ðøêbßh½Ù§•øú]4Räæé@p»¼Í†™£D;˺v¯_‹é˜ºÏ>†…‡ä†T'·ÞН÷Âÿž1•ÁÞÓôc24¶ÿk1¿þÍÉAµ×ˆ ÿÞŒÛóp¦»ÿiÛ¢ÿü›Eç¿à93‹©ôm (†éªûÉõE°¦†K²³°7ÃÖäMË-ª!ÍN–¦ÄSÊ!ÔRœˆÃá:]¬“ÍJ]ßm/íìHê?ƒho©Üºb²‘SŠÄ€*VîûØl×zUã)¥”*#f šÏT¹t¥Ï%ð|šGw†iÚ²;j%Ø)º£°î±¶Ç²? Ôì Y#›OÓQi4:!‡Rî÷;ùèý¿ÿ»tE4Þ«$‚ºžá£‹}ŠÕã?{KÄCô¡3‡;OÜ7”ŠqèŽy¨î‰F·§ý1TÅPQu'¾CVxŠ­‚ gõ·Ð‰ (¹NøFyýÈpœ†¾gOÉ%4ºó?lå·¤œÚö} {`jÏž°Eh°x5Y*«›ª¥ö08òԸƥ€`€âû±íŲQÂ…ìK¤Fbl‰?I‰íí6蔤ûÊ™èp¢µš™Qê85âQ‹A-‰ÎKe%(“z›¥"Rî.¥®‹>lØnü„reò£c#çŠMý.w¯‹\Ê GÝ©]Nù¶Â 5 ‡ý÷‡·”3©­TR â&,3Ö–ÉCâêÈaÑ Pœ­‹DÔ”=CA‰æ Ù¾#(bž‰ly®=§ýÀõ,”(+öº9VõVó4C½JÓ#2òÅñÙŠ>êµ÷GþƒèëÒÎ@/ –þބŢ­®!º~¸AŽƒxXmßÖ”’kYp§³\yä4D%Âé Mã¯?g÷Áº[_u˜êU mmœÏð1YÓ¼‡T´FI«Þô3&¹u4>Ú•øÝ!£?ÈÈRtèâÌR/£4˜t˜ÛQ íË®%Še€Ùù+ˆ•çIa0\wOªíè'=Ö&iÉNÈ …ÑÌUÛåM!*së¬SLjšpR'j¿‡B%öYó8ŽXétTaº`NT4’òC›ìÃÊW^À#AŒånÎaJ‚JŒ`É©Ï T7ïüŽŸOtÖø©,¦Ÿú¡ø³%RöeU–«eï(mƒ"ÓH nù(=u7A0³L Ûº« iF—å·Psãæ#C–×4}pèMe?ŽÜÙ2‘˜ªb ¿Wyœ&F½V)y"‘I qø&t•,Ê EÏ5#^ iMI#9Ö¡áˆÈ-g½x£œy£œ}qzö€÷…챓PüÎùL¬“û@ kF¬¦ä2Óï.:Å's¾ûÕZ/8R ærÈNòÔ÷™ØXèÅ!F‘|³nÛó ŽY.j9fÃ,£Oá£DÌe7Ϙ(ýËøØ\yT\‹Æ§ãJ¼â™kA@Œ±—dˆŽDÅ'Œú3IÑ[Îd-e%B8¼‹ûýßÿý¿ÿ÷þà†[A8O¼FÝáãÆuLQÏ=çi OˆÖck‹ïã4,PXØŽŽ××Dw!Mì“Åй~„¿ÆèZx²ÓIóú&d¾lC2«ýoX5UÉlïç_T(CT<ÚvSv/ŠLˆÕz!·Òž5â¹èLí»ËIÛÓÛÒðÝ‚ÁÏhÁ§vç—ûŒšÓE“·¦Û¦$Æí[ŽKQ#Ì+«nÔÑ’!…Af^É‘æ~×6AqæÍ–ä-|Ÿ{é„¢ÜÎZ-dYƒM^;"TR3m' î1æêÿ8$n5vLHÑI`â]O¥‚V—¦¤"¡SP2¬U8„Û®–Ðpèá̸¢JçŒã<w–ÀH?ÕÃßCâ|d=˜”¥ßÒØr–Úh×F1›å5¯D1‡ÓcèíˆRvÈþ9m„>sd"ޤÉR`Ë]2饓͚½pȽ[¦žzÖSi©eBŨ¬Èz•Ð^Γ‰}¸b.‘¼ÑWUà¨Ã\­ZæRôÝY:0`¿±|s§OŸYgSx< Ûív ák.£)S´®D!†NÐ~4i¯TDºCN* ‚‚[ÌGV…\#åâêÐföÅÚslªØtøùvˆL*Á`¾‘^Noöhg^É<>r¤NxR‚fÓ s%õ‹–ÀqŠ+Ò×») ÁSxÒ N™ŒDDC”L(.7‹ê—.¶÷TZnZÄ4ªŽìcGùº§?Mè¶2Ào$:ŸYøŒhåA5óirœ¤~‹“YÒ‡e½+諾.~l—_ yê}4Cj—5Ó¹(çƒÈ¥-9TÑæ—‘cmÕU\^ÙYB¸9G°ñÚr3­¦<ÌãýþïñâåVJÁ-PÿÑ4¯PËlTðE‰Íôði2{ KsƒÙùÊÈ0Kuç pÔþÜ4!H®BÌ$'jôVj¥òŸÆû¤ë®Æ¸ýìú~\O%©Ê! çÞ‡ÀÄÂ<ïbÎæ.R—8—THi¢õlµŒy7 „Tú¾Ð ˆ"xÇúÖ]éÀŒË!T'L@S3ÃÙúl?y”Èþ&F¬´›ârÝñέeNC’#õmJ½mBûès%­òŠËbûù`¶¼O{¨šL‘Ç@0ÛM†•Ómè…UWTœž>Gª«Fžp8¦\î켕Ȧ¾[ R„‘;™XkzÂÇÃø‚_+:oä(§ÊŠƒ}ˆ`sÇ΋ ³q<IécÏšyêÂAB˜, vŸtI¢"! ȲµiÄ"ÝëÁ5Ca)™®ó¾ c`lhl̤ßÑyx¦"n¦ÇçÞ×Àèªh܇Ýp:“ü@ÿáÈäѹ­’ÃN?Ö)šŽtfñ~ôþßïÿþ=Jå7 ­¡Äzk«ÁBqÓ„,iUuf2ÜTRa ü–H¾Ò¹ƒ>º;/2)G¯àt¼ÇC”xÍï@Ð ‘êëâx@Ý!(ëÚ³7A*r4(Ö*ÎÒŸ?ˆi‚Êê°dx•”“âõÅu¯j!G…ÄM1”Ìé'jሼܙ–È*%ßÌøX‰ukJTUjb6!Û¦ýi'1sda½blDI09[Òp÷ÉqzoçR„ôJ/¾aØy&*† ÒÎÉC¢®U „ø?¸/ÄêéÏTÊŽë¼Îî¹" ¶5æ2G1n'1Q¾jÄpdÈøÃï;ŠG‡¨Ž3 ½a«f´Â=#þoËÛ)GPèªd¯¹¯€ö¹AæS2*=dBŽnVÝdÑXMG‘¢öŸ(‚ZµUß Ô)ÂïJ£ÂãéÀl•7e8à1ÖÔ´2EåëáoÆC ¡«,™‚Ïà‚¯÷„C°„˜Tés B¦ª; K.?äÌ.©KÍPkÁWæ1ÎWUDš˜/:h#5ÕȈ“Fö9 3Yªì'ãø†Ê3ÂÔ¸±C.™t›OȽÞK~ll®”+v¼[d×v÷Ù§™7kj9 i¾¶°9QSÌ3öžÆ[ù&éÈjZ 9© =u;¶ c1RTí$´±*n…ëF;Â@$7 _j*¶ ;ª()üÂÖ/k¶8{~Šø4_çг9tù j|@éȾ zÕ3mq¼ó1¬YtOBÛ²èXŒDóuz$×`s> ,¸VÄ@¯D ì(¦r?%ÅÀkiKÂçò:ņ0ƒºÎ;6”ñõÖb+gOæf!‰"`1&{¤™\K$¯)«>(eCŠ'˜–rˆ–ÕlŠXèT% ªQ(N›ÒMuÔC*^ óÑÑ÷·c“Ðʳ.,daª°ßRä—‰ÎÍ?žj¶ÍDwŸ1þT³Í̦jíÿÃ5t2æ/åê£'ãôäG¿.”ÚiÒuˆ5~¯ä6‰¾XÎ<çälSHŒ³ $é™JÜôŽÅö ®¤“xBíÒH’ôÿ~¿£PÊÜäÍK1è–LýO9³UéÒ­=R6¦÷•.îJÌרù¯°0Wêï*™ö÷zñ‹?†Zû÷Z7ï¿ìâ‡ò;/^¨qq²’a*Û¿ò…òItxlñ'@ÉxîR+ôòéå«Ìâ›·ôbSäsO6O;‹â=œë/ªúuÕDFœè^üî› jž¶¢ì_™Gð[.ÍphÊž5ÂòêTÕ!<¦;”»Ê™ÇƒŽ:XLD0˜Äå9ä'WxIŠ_ûÂÆU›ö'JhG`û$^¸,©lÅ8‚ çŸèü³VÏáã!Þn·AeÔ²Üù¾U;^áªëêÖ6]¦Èy±ðãéð<ÚÎêÛöpIâñ]¬D…íg&Ä\g!‰M|)ôPa–Ò}gDÝ:,aA71”¯öOÚ5ˆ,3wÙCRU“ºÎ =…§²0A¨§ìKRYlz:Åh{ôþ A±l "ºcDÕIÑ¿¢ÔìÕǶ“ㆭ¾‡ž*¯ *œíöé_ló`Ø;V]g°º}9°ß±¤ ¹ÚaÀp‡+ú…s‰3ÓW7דCŒ0’9¹»þÃ$}§6ì6y] k<¸™»êyÅ—ƒ“˜Þ&‡î/v`Q:¶J´´ â!àfÀ “£’¯[޹6òÐàYÖ>‘NV …ç„m;p€#ý€SiÕ. $ƒÉ²~d$(©FãáPÒˆÛ|„% ¡wˆAÆ%RsÇŠkqqSŒš^E,J¬°Œ¤_¸kyý0*ªµï±’m(¶síÐTS0OC*@Ò`¨‰hJ€¢Ø‰S€&3®îú@öGyá0ø°<7 •£õhSH7¼òÎ9&š˜y ëà†Áýe+?#æôlö¸!’ŒŒ‰Gˆž›$qaI²ßcvE¨†rÔZ¸*Ì‹ž„4€¼²«âÈF~®—¬u?;9°.T¯÷ãÕ <’d¦ß':º£ IÜ="}ßšªª<}M Õ& +Ä*C¶Ph”a•n« U÷klÅñ©ÊGOí9shcü?ˆÆ—‚´Hž—ÏVšÑa¦ l—…·sô5‰õMƒ }ÂÚkv¥9O—eX.½k qóÇöŒgbWð;y¿ÿw*¥aŸ éÞLsAZ) XøÔ8y÷`æ]èL&$(ž%à b,8g=É6`!¬&‰‡ =r%¡óGÛYà D‘†qQ¤ˆÁ³ F½39wEáßáûŠHbÏ+ŒLùo€Œ unnÜÑ Tõ8j¥áÒ0b4Ó@øóI#,æ²AÈJ½³õÅv„'šolßU?\S*û1 (`sNWÈÀ$ /_î&Ä[˜Iž¦î,¼Š={áüÕð§¥Ç½×"mþˆ¦¦È®„c¥¢e0M¡\‘ §ÐHðcÔïµ0Ýñõ‘;Ù|¸¬`N½U¨ÇbhÑ%Õu1· 7glQ70H¿­T»:h%Î7ÔD.e4Ñ%¡( ,_i*3oŽ+}ÈR$¶L”D+y—‹êLJ8i£é R=½áõŠ$íÿ›jòRYæÂêäç£à|°¸¬XƒÑýºÊ¢£éG˜%áq´¡]NKQœ•#‚:?~I¶”äîu;9P]òþ‰ªÙ¥n dŒ’‘FƒØý %€ŠÏm ØÑâ„j0ÇC}¸Xù¡poŒ‘²ðu"] ¾Tú´!9£%jPqN(ô§5s¼ ¶y¸!Oú­Q&¯IMõ“ŸÀƒýëWq F »‘dá Ì6!7sIz ؉n=Û´7h]Œ£j x(p %$–äT+&‹M‹10ÔŒ«GçpÿQ6 JªðÖwHî ÎzÔ<­Ùt@Š8‡&wóZ'€K›´wÇ`X„‚̱ôW…º”Åeýò@Öb°ßݵÇêh¡Ò6 Q†éhWµþ=¢ó +‘C@/—ÚA€rké‹‘…o7u»ÝZ êŒÉÁèK @/©*]øY(—J­ÆS᤯Vn¿miþTÈM6¢9‰„Tx+”ŠÉq`ÜmºÓDÁh¨%Vükds¯¯ Y$ƼTùÝó wŸ%ìÿ"² ð]/¼êS[k§Ó ß\̵F®/ë¨Ö´TâÅ»è^ÑL³Çg¿™óÇvvçÀöû³±Ó €WÝY’J,¶óbÇtÆb7fŒ™Ë(Ãæ®(ÿ Ì@ñp£Ä0îÚ:øbæí;ÙÝê˃?ŠjLÚߟ½m£}ÐìŸ4$2ꇈFkíNØÝ}àŠ¬Ó]„Sé.³ÆÈŸsg>ÁCOô0ŽekϼÂ2…àG£ÕÞ”³¾Ê_^ÁH—ô©¨¦t«ÐlÃõ9ÎbÛ½ìã›mmqy‡nåJõ n¥Ü‹—Û^PCqãùüŸŸ—TR`c1šë_•Ðñég’Pß{lÈp¨Õt“Œo_ê ]´ºÑ(Šß+:ÿT†Ÿ¨œØWÏ?Q~Jºzå~€Y³FðhGŒ";óêáºlMâî ?œZ`T2ïöÅÎË=üc<בñMuÞU¾ÄM^Ø‘¾õ‡‚Újªý2Œ;Ë©?¿´ž<ÂÓÖ]Jñ˜Ò ÿ‡èÿѽÐ.Wt$1ÉÈR3°xZUöº0¥Ó´U ;ñ,é)hA2ÂÅý€%fö ú”WZIäið u›8É|Hï˜Â>ë‹°^"k¬ ÓT+FWøƒ¦Á¹+¥jؽù]J­K(Q\ƒÙÜÆa7œÛÒJúËsOá ˜î«×Ä"_-‹{zòÄvÞP{xƒØÂ×”Ò¬ÁÐÿ0C)1ÍZûl”0–>Yw-# ÚWÝé¦Ybf;m\Ïd€ì@×ßZÖ¡ü.UÊ'y$Æ´Ÿc† ®›[Jè”}n°… ÌU˜¾÷‚D züt jfÿ¶°2BìºF­³k¯Æúû?ás‚ã¼Ýnæ"/連æKÁ;.›3´Ë„ åÉžêé+FI&žžt1çj'Jseàà:¸° Üu­h߇îë>CÞLLþ9¥ÄZ-€œºbrtÜ{)·‚û ´CS8(>k½*ñjåZ”¯‚Ý_ž ,›îÐÇFÒ0Š'”¼†½ûrj$ëeî7=Hˆtµ¶÷‚œ—Û]ôÅ*§5}0ÙêO›™ð›Ê“—‹è<3£º8ó´x™/àœé0$3ç"9bX®Ž»ŽS­]Ðî1tè®eGvu#ù[õi4é žT^ïGŒ êq^›î+¨Õ±ÿÖý¡5/îDÒH9ê"Fb¸Ö‰[˜ŽÂ%fܳý›è†àó`_Þœ j¸©ÙM ÎOý‰‰5»ä–ò»Bì£þÜì¢W ǵ©ƒô¿ßï÷û¿Cö¥”\¬€CÁAô±u‘a­h†bkMf„.xS\•[8f™O] ‘JB]¼žM0H "ìOÒ(\ Â=Ð#zqÓEþ}› €@–”©®@¾ñ”õ”†åa>ÔŒ¬¯Pa©ŒWA—Ò2é? ò¤õ¿!þàÿ–i.¡x¢‡J(ç¿Çi¨¥˜>R‰å%ë~Šk×ËAvb_W!°êÂD«d—*‘p#=¥¨Û‘bþ_KHµ–ð…†AiåÅzÇ0Ȫ,!|œÌq±j2àj]NÿŒQ¥Nþo«)á‡ÔؽúF_ÑåW-ö¸»!zãš@©ý† »jº„0 ô2êlW¼™"I<{HkFØ5 K ¥ÌÛØ Çsi9Ù êIfˆÉ…€ØcEYR¹RŠû}H¶¢q^¼g>1d@Ï­‰ˆ|”¦y£—þc±þöïkc2"ò¤”%“%ÐAh“›Nhî·ÓÔ/›ÊçÂbÕ¤t˜Ú¥Á+e©ÊÖUQ5¨š†(|ö;^M«6Í"ã²Lµ"…Á:.9ÝCVhD ˈ÷¨–G ¬É1HÌL™ÅÐqKW<„uH›”¦ùnCÄHÊPhR­¨·£Ü`¤jèb?½Omƒ,6Úd[O˜”2pð2ù%ÓOü"õDõ+–†³ÐØÔGˆè¾¬VŒb4?Ó*ÄJÀcFC÷ Åa-4£°VóFX§”rŸ2騯9Ã{NmüYˆq¦i˜±À×÷{½ÆÄʃlDÒ°ùášë‰Ó¼ãÛEñïz˜‹ÎÖB /óO¿e‰Á†3îËe8]÷#pW ¹aßT›ˆ¨¬Gç˜$’H‚ƒYó)‚›{* ˜n½³€ñ]ºH¶®/òRo´Emãív;}°ä…†ç-í‡$™c¤?É€­-§Û†Û›ì«`FçíÆ×sØ;ç䞪!el]Ôûâ‘E­Ýÿˆbo­åy¯>×òC’ÚöPlÅîA€#À6Ƶg´ŸR¢R³l™OtÝžƒû>kA›džqRŸ¾¡C@ž˜ \´C0œ×ÈKVòi—­wi€’ÏõØäÛ’– :ï(¸ºòˆ4þv1®ÉH…ð RàïžÔŸ{ðW}"¦^&ä CܦÉ]²„ðñxÄ  ¢Y°äÙ¡ÖGÐZJu7 Yå çÒúLKDöwF%‘èšV,iâ¿§»—uz,­h=˜{q׿?~\HÜÚò¨“÷B U ´j= "ŸiÉs:¥’”MŸ|…Uy±.V#óþ»ßyJŸ©-D~ªŠŽ”¾í• tå{MÉÙ¿‰ªØaß°9f{zÑt›¶¹¯n±Æµf¡Ž)Ä,z•» ‘¢ 4üTÛÂwSB ˪Ge1,[Æ'1¥‚(Vyº>úaXÂÀ\Ïìâ\ ·½ƒÈ4™)šM©ÚW(Û!4wÈ‘µHšSª4ÚO$ô‡A<Ïp`3R‡J­ÆaÞ‹>ÁZk’±ëSXF'ÓÁ ôºå“¢¾@G.¤hà ƒØ>ö‰è #íc 6phr8^˜¢ (%ŒÆ©êQ bW/< ׈Rôj0P±G¥U#³ª‚^L®tº\Šý{a>PcYÌMà†‰á˜F*4œc „”¹Po/o…ÇæMÆABÓbR¬ ÑÕü›ò^1ÃëU?#…ëîÄùÒÇ»pÅâ(‹GÎ(›u"6ÕFTø¬’Î¼Š™G(ƒ&ÄçU®Œò\uuú~‰‡&Y8ˆw›·ðŠP Ñê·u݆`´¹ðXaPE ŠQ›c0„ˆZ}QnèÇÊ Ða³ ¹Hu¤Gø‘†þÐäý¤Ãï)2‹ÜºÕTÔ{¡ ¡ÈAt6€ð£ÉVÊuu€ÅDËB?)¯F_ ·dí²¤ g9$kßOM]kšøßR§aê¡_ѾVzEë;=NbôØb4•+ Àª"HÒP«Å±ÆÂÈ£™)#G>tÜ…&Tt½P$˜P¦rÁ‚MxˆdBP%‹V@ò`jwJ3ÞûŠ[;·5‹\ÕŸ´yùêE»¨ŒU“ þ¬ ÅÕÎ0ÓƒÔÃãŒDä#N¢ü{+šsWo¸5ÇË¢¸»6â!° ‚…jvЄMÂt·¤à"ω,Oà@³Cêqþ]S!z¿ÁÂÛí&ÄUúêj8š%ѧv"<¶úÜÄîú’¹Õƒëj¶(”ÜI´;ξ+êy‹8Húä$–G)Å(Ôoäyi”ðÛ!Ûÿå.’r4qÙŶ Pþ‚ÒÃ5HÏ5!®éùuc‘j@'¼i¿õØ]é´:Ê,Õ¡ƒÙÔÅ!ÉZ RDÿ)Å@†ýÅv2§Žð—è¼ÐÊ£ËËŠ‰k=}æ™JqÛù21•4&=a è_!]õ*ŽÊ|RTRN…Gê™Ç°ûQàÅÏÛ q¥å™µôb®j 3.…ŒšØY4Ó“åù-9øôàïl éÔЃÏå|=¢q0þ!ï÷wÞï÷†ÆZÄ”Y.Å©TЄ=ŵ՗¢õa_Ò„êíYTΊ3F¦»—ÓYaÀâ©~¹Ù­+iMîyDÒp%ž¼D\÷ôÉgô½ï"øÂŒiÉãE83›’žåá&k[bëR/+ùÕ´,R‚§?î,èäܞ˄Íë`^}Á7©˜LrbÀÙŽ0 ã§a<=ĘŒIi!âŒ0Þ=ˆ\f ¥È’À V’Å  3úº[ñÎ zš1ÆU£ù‹±šJø2kB‰<û‘KÜKZÒß #XZýÌñ‘§œ CÙdÐp\>EL¸Ü©Ì5hf¥Ÿ!€ÉL${ÂÄ”ÞÂ(’{¦VÌà›»JÃ)Ê“°ïZeŽÄx¾2öEô”¼B=Æ)ØXYNÈ_|›Ð©½Ó€çifa³i<jÔæY¯„>€ÖæF?ABßÒT[3gBÕš¢‘é4 ¨…=ÈÔ½:‹¾´K` ˜Lç ¼Ãª¨Ñð2˜L^:m•œÝf±·!a»` ¼­NH¿ä8¯\ˆdÜïµÔë`EœÍ^v|:òú­3óÔ¹ˆn˜&NêÑûjð@ºÚe €_-:  ˆ¹4ˆ†-/3þ^E fIŒq«õóf*õ ktÝÙD¶ŽÀâ«H±D.õy½EW­”ÿ¡H/qîj#ðG…éæ[ï;A¹‹$EƒÁýN–ªüsï ²elEGÎ<,^È ÇRæ8v>è†bž°ë‚cƒUz`ëë Ö9B¹Ô^`q¥¾Ö {š ‰|üS?á÷¹<þ½þ^?ôeˆAïŽÄ¸ j¾ÀÖá“­',{‡—‘µ¿ˆ­%[¯>m¹?ÍKâ’S"%€ðy²¬ þŽÿßR‘G”þ2×ë/<¿_Æcé„玲yïü5ZCo•;¾Å£Æ¢Ë5ŸŸðÐhå¥áÎeëvö£ZC¯½/o3X¾L6&pOæqT{“T©«oÚ·y^Ñ|!Sÿ~Ñùk“%åó RÖǶ’ÊJŒ¥´›PhÀ5jŠ^C/€!?nÖõìI’üØâ}(Íj$It|k³„‘–EÅÏ©Dk:£7kéRíýB ¨v³K²pUVI€@—áß(ôa û½1k.‰Ö8Îv]6‡áÚô‡¨êͅã’a(õäaÑT zVÛ£½…÷û£ù_±Þä[Üë§ô@´/…¼”~#u=Öv’ëä÷P¤°Pf ç'P<רdØÄæhúFª;H¬K[&Àénô©qœDIµ-Ã“Ž—ˆÑƒ2=m»¬šCÇbÖMµNÅL¶câ"ârsêð$»²‘=…Š9­BVÂF”s—° UõÆSww¶µjMâ&(„1¸=Š.æUÜsg9ÌS1ŽÚÖ_d¿g]1ËÇwÉ¢{{M§s<Ã.axWrIð±4XìXÖ†:01Ü#U/EvºéY~¨$L—ª_Xê“g3Ez8¹q–£\l<þÔíºZú͒ס¾]>q¯÷†AÎÞõز\§#ÉbD>á#ãÙ(öM¢³!•±Ò¨‡ýI€;òs5›'£aïÒg¾z¬Pñx|ˆ ’C­¤†õ-!ÈÆéA÷“ñãˆoCq× =!D³Uy!}Š[ã—ñÊž±Ig·t%aõE*W¬öS2•íöágRØ2í£Ë±4­–FmG aT5‚}’Zñ¤ƒÒºWVå­¢ÈBw"½a‚HÑ \—Λ3Yn7…mD:Σl$z¡˜LÞwÇ^6·¢–:~vÕC.à€áÌdÓ¶sçÒÕÊš6‡,vúÖo9{'råO#©ÎBG8‹IË¿h·¤B‚e0wgØ ÝG‚oDZ‘•J‹²6烚¨Ä&P#° ”«ÙÁ_kG[žYÖ‰dïb¥X%€¸°+B]F²q €0OÒ+À"Ê Y.?XtþŠ¢L ÔˆB jë =÷”aµ©)É,QŸhˆ”©Æ÷éXR2„5„9jE7Û–F)ÀK$€»Ç68×ÏKÄcçÚT_ªL{ìÍhA¨’iäÉ^{0Àq[ž7àŒ°>°d’ØÃsy\êý~çÿî÷û¿^èŠG,VëŸ%€ u«[Of_3ÉŒa¤¯¶ËÂ57è\¾õA¢±f(È…7aóµâ†FòÌÈHoȲ‰Uô&Ž€%€5Pä׊è]ˆ‘²Äê ÀÒ.:T8Xsº¥€áÃ-æ;fXbò»‰êÎÄŒcº…g¶ØUkÄŸ¹rxÃ݇‚t¹Œ×Бk8!æšœ.㈠…ìhYm(švŒ‚)îŠà ÇI $WÑ™Üþh~Ç|O†S¶È1NgšØ5 ©JEI`­[ A(OöZ ä£è±×Ä`´‹?S Y2&¤@û|&ª¤z²ÎžN¨iL¹{ÆZæ2Ê@5vp’ gžÏŠs"1[ÎÜ!°ÈòWê¯ÏKÖ¯0O1 û¤¥ö=ŒàxñÐÔÓ‚Îo—Aý”}3ˆ»Zhù¤F’k˾9ŵ"Ò¡.y1F%Rêïlj‰Â`p!æ[â9C Äù%¬·1c›Úæpð ÿµ”úÁĸgŠ0ºWí=Q:…¬¸_^H{v«¶B¬òox%ër}1Üûùä:\buvi9r7@›`§»uà !ÚdáIæie¯m 06®š’ž/sá&a|Ij´T+f £“çKÒv[_Ù›œýYj¿Qt¾ ¥hƒ?DûzÍ&à}¶âǼnWZþž«ŒÌݪ”ŸÂ# jÝ4&^wL\5éi–÷µÁÑRõÙ¿ˆS©)ªK%-rt¦ó~çý~ ÿ²‘i/sÚãÌÓÀîàÍIYü©¸äÑNv»áv»Ýn»Úècñ¢ †'^om^¢ámßô÷ú{ý½ÞsŠÿ^¯_þâŸ+»ÝÔ?_Ê`ýY¬¯éHðíÍ þû·ßaÛP nfCÞþéßë;‡%¯¿×ßë¥^oR©¤âÈ’oÊʯngáCRUP•õ‰×Y[7ˆŠÑ½ñÎû€œ¡d a¿@±ñŠÇ(Ù¢@õ4ù]C¦%Et¼¶¾ØÆ¢ë4yÜZ‡¬'’‚ÒÐÿ>T›Z2ãÜ^U‰ESê>)¦¸‘GïÆÇÈßûÿîä]Ë¿´fùãîþ «’càƒMú¸õ–7huÄÕùª%U@9±\ÞKל ؈Ђ?j¥`ÚO“¹Zaí¡Í–ƒ“½G‘…K wÓPòÞqhŽ™ì*Í:¾Ýø”ð8@k÷ÀÌïúìÄx”qã⬈³t©îÙsÂgLg î#Ê÷‰ MÚÙy™ŽPfqÚ\ÛO\ÐF!‰ƒ\T‚4\Q+€sÉ2ù¨<é[€@D›4}>|{Ô`Ó Ñg2×)­—ú¥ª7!‹GY½Ns–z€œ:î²ç¡ERËö‚}*W ûænxu”€% Ë«s'öé£íÇb»°1 õî±x»º­Ì²Ô¡##H”ùÎO õ¿U÷ÐÄ,_—Ó8ÞžÌÎ%“µkT¹»ÞÅ.yé~¾¦µ]º÷K*óˆ÷‡³Å”±Î%Ê´qj²&P¬·‚SóèÒ%…AB—ËnÒBUˆ!ÝÂ('(Ó ^ Ù¾q ¦aH)»$Y¤öª»>²6¹km —Q¿dÞŸˆf×f”B]¬¢(J)J²·›¦J42SÍÔÄÒ‰~!C©ÊÜÎP ïm#ܺd Øå7ôsáüj¢#ôüP_œÃA3œwdaçŽ' ÎBqΫ/~8õdŽ3ñä|Ç,™À5ÝpÞ.I¿½Á=÷±Ö@y+çì&gÄ’‚£ašÿäNOÎëM$ÞÀ”Û]'{*’ › ɘ‰-_Š›ètr†ÊiÉþ¬R(½Hf³2±ä‘—êO у!®*Ë•Áîñì9r§r$åÁßDGFØTF©$õŠiÓ<,°lME¨PÒ—1F°ŒAño²¤£å|Óärü$9˜ A¬S—kÂÅÙ¤tˆ"™–‹Txcœ@Ófò“EçEë&ÊÒV… ¼pòüÜEeù·Cš,ñ”íÿo!t{û‚¯Û™À=[yz‘ŠäTxr‹°„ê7s¤>O:3PŠ™p‰ÁE¿dRû^ÞÿÝùïߣý*ÐIš¬¶Ú™ÆŠ¿AÛþŠDûw~mëXÍ×…íq¯¿×'Á¿×ßëïõ+.yÂMý¿&³(¥ì-¯^“žñrü–?‘ ÏØ2À«sŸùgýg.?¡ð¿/ЦŰã„NOëu=è j?C#o¼¿×ßë=¶T±‘Æ>ú –Uó¿×ßë»ø^y¢¯|â—ž7¾°§vξëCÆà£d xLô`Tf›¦×hh°ÃÓ{5â‚n€×½KbZŸD²Ê:qêÆÙL @ýGcx*WPn}”õdaÁ¶“SuUr#Ô º?Ê<\¢uuØFcSe#ïMùÿï÷.•„^£yNµ… uÑQ¥ŸDÿ¿=I”‚hsMyam!އŒ~ƒVã Ù‰#æ ƒK™È—DÂ?~ûo 2 õQÏs`yŽ}Í /ŸãqG¾ô‰¥">uæ^º†µ|ê—ÉÀQ’GÞ/ÞQÝt°t }Ñc–,>á®æº!y# ™¤°ÌÑ&´¢zß8ô,M¾[‰Œ&8ae;µ)‚ 3þÎõn"éÓSÏÕ‡át_ëÞn€x—†ëyÒs‹†.ˆ9¬<™Ôæã¶à÷U—ß Õ1_:gP9ÞÝÀÁ*å“®‰ÚZþÛ, fqŠ75‡[F±†º3|؈ŠÌoÀ¿-Öoâö~=÷1:È#ýÝYà…ËM2î›wktĞͦ¢8ØÞšVÊxAþ *ü*[ƒˆ&¶)ŠÖÙg"#jÃÜwõ¶ä¬¥MõvЈ’L]‚\z³9!Ø¥ËýCŽj¿>©y4 ﳯܗ‰ÀnZè%Ú—®CºO©gFêŽP—KÂ,…Ý6B+ϬÕÒѦlš²i½z†±Ÿ¶ƒ‘DÞëg¬íŠa×ó›‰ ÖD"'¥¦×ª+—R=’ìÅX UE<§ðY|ñTÚàýjÿÐpq0¨Â#€,§§ÓõâezÚ%;u{è åí”1OuݕɊëc0Ø~‚C…Mß »šb-cðæD$[õÅ—o<÷ ø ¿Ôh¬x4§«T€¦…©\„q;&eÖq¿ß×AyìW-›—%^ !ž8B±œQÓܦ£VÄ\L=†ƒùÈ›ú?\UáóBQ\Sÿ‹Êœ“RÖþ§&‹ÒÆMa°)(.À ÂÉq^fž¸ôq?(&b†øÝM¾…<Éå†J®Ð•’Ø¡:ÃÑ’òpÇFræâ>6ÎëX_騊6èU®1?]¼QÀæz-BÜ·¥™Ò"Æ£¤;ŠËh©=>[M9Žo¶³UÔ.Œ¦.u’ƒ=Ô¤{É☔ÇÈeÞïÿ*úß¶$yÁ% TtI¨ï~¬•‹Ï€þ Fšæ©ÊÔ˜‚\Å"¬”ÿÇî*Fˆ>Ohüdˆ³=©Q)îÛ%Ï êHG²iBZ'*¡`ž&‘H`ÿ"Û?ØcìO•¦}ë“yó=NçëžA˜}r‘ ÜùN „ÝÌ[fØÔŠa`ŽC7!Þ 'È9Ú xN±sÀfÛ"‚bQ‚4Xø«\ ÂÝ®äMË| Cèl5ìV¼M7ä#0Ç"y HÍgáF%–ÎÙí5`PÁHB'¥ØíCY!ƒP0|DÊ3z5i4}]]Ä`ö” k lNu ÙóPJ†5T¾XÞ<Í™qÈKffº üyì‘>BÑ(‰´~½íð»’ÝE†KH]»M¢wnM-è‚â)ü_vÑn€6¸×?€M0Ù¥yès6úgG© aŠ.ô—~›šÊSVÈãÑ.°v¤1!JXâ ZãVYÈž(¶h§KµÞC-ž…ð‹.•°´8` Ž0üÙåºÅ[–+ùÒë¥ÈÜiàñ£³_g’M¹úD®ï×l®.B,]•‘¼æ½×r úÇ…4Û%@Ÿ"Á­&nSkŸJSiEùEhImiyœØÈã‹j‡¬KDü$à ÙNB’šÑ²Ç…(¹&¡ÞTÐÄê”Ê9à£-ì¢SÛꂨRd­0û0ê)ÁКÙ>13¿O'æ4ÑgÏüÉD-QÝWø(#`UúÝÒM#Ï…Džb<èC©«°¹Û8FÂbCáqÃŽ¦†å•GО2(¤#chm|U#BT¤D¨ ¤m‹z+ÑíÖ²u“†t,s´…; ¡ÖU¶×\aîã´H1ðø·ùlsS’)Çè*]Ø^Œ‚S<úâÒ&‘nÄ#gVÄ\€ý‡¹0З‡PJ5yQÐRÁyš ‚OVù©¢óFs>N2õPâqrn¸Õ¥½ì©‚×É’‰uÀ€ðÔ1ÿ¸ê’·ÌIÞPµ®Ã…‘@Nt—×Õ2܃õ;eü×,{s \GÞyÿwÿ÷¼£ÜÊ Úçr:éÏ)Ör¾`e•à»<w}ÅôN6){ølòéHOÐY>Ùö÷ú¯§·_ ñ¢ý±Oð»ÜáºÂÉ‘×~³…“b˜c=ýÓë?›>òK6¿íº.Q(z9+lGÞg“Ý«K^¯? ^)WHJ_qIå-°&£t= éZá]O§o¡…<µ‹ÊãTØÏr™§ÐÝ,&Þ²Jr­Ãظs<¹j å¨Ï²Ê¾}Yvó³â7žz¾`Eà¿2ï‚aJôÙ*ÚWæò5¤_¸z/d3|ÿ•ùa¢ó/²¥þep÷1±«þƒ•Gg+~,D¹µ©¶²[ zîh“Ý'uKçý^ü¶ûÿ³÷§Í’$Ë•¨ÇÜãfV½tË EfDÈô†…Ò2ÍoóûçÃÈg¸Ì xv“h {ØÀ«Ê¼7ÂÝÎ|pw3U35s÷¸qs« Ô+då½ánn‹êQ=çзV”¤S"^Ú®t °V„RÓî±vG£ ¥˜J û\•N ÐT¨«¥7ë&”rÕ9ñËÊÂá2±Ù×b66×E”š¦·ÕÚ¢Ú¾âJê!¦7j‰¤Z¹³è‚' “%ä_ªcÐr³¡+GSº¦®rövª>ZrM²/š.‰V´>y•xÀ¡À½lÞ9£aÌn,Wg黈Žãõ—½ÇÝßÕ€sžHw§ª>t/¸A÷.·Yqø8®{Åé0vq´O’iTíiM ªz<|¦tð5ý5h|HOdé>ãÖIÑ-•Ço¤£7m‚·÷i•Õþ„뙿eó]UpZ<ÎË@³€&ûepJÕ‹cÓ ž‰×MΣç^Ï—×pbþáŽõ8Óì¥;ìr¸Õ²xÕåí>›¸òØc}\ê³tIÃ5>ÃkRˆê"LnWúÔ XE¬ü)Üå!ñeŒŠNÒ¸ŒµÊï;{·¹c@Eç7ºà^Ýk¦t¯í¦>0°Ij€õì'ÿÉH±nm4^¸sDþ3’"ÊçFk\»r>Ü2Ÿ*ÉäÐŽ•F†Q0é‹_ñ+™7ÊZÅhçZ'6¢b\Ï,üvÀdÐg?ë鈊|¶ü匞8Sw|o-wÊïÞO{¼­g½¥_p‰Þ5åÞÅþ±ÊÊX¡Êô<õ¡3ç8Ðjˆ³>ÜÁф燄°ªbÉçªÝï'-Îhá”Åzžß–è¼BMáÚµ2lØêè˜ïšŠÓþãgµRƒÐ7Õ*ÌrCÞ6íñxNÚ‘¨†ã&n¢ª¦ˆxÍbRÅŠÛ} %¤g©Û±B×ýð›*lƒhë «øL}ãôä#ÔY  ‘¹÷ˆ™ /”â/s¢§ *ÌÔѵò•ä_¹²Ý‚¹RØ=.I³—Þš’´c˜Ô¢v²¹,_Ô4S„(‰Gš²Ò}SIˆåœe­—[Òõ³¤…âÏk2©·ƒlÂj›ö†¥g:ªkÛň•*Gé=aø åFƒ}eÞ³sŸv@²8Â[ô28ÉŽ1Åk?ŸKjÄ/XÄåe"¢.¥¦îÉó6Í‘T'j_tÔOQ ¶ø‘•ÜŸwÄT¢ÞÓVUB-kÂâjQì ]¬·˜½jÍòG»¶wÑuäJCÍ^¯’>'‰ƒ‘[ƒØ²JÂ,j!ç xfòh.MªD±Þ-x¿ºœÐ>+Ó1ç@ÙàIu(6P·Zá·ÓN»‰X¤o,è¢RîJÇ«‰5wÔÒHq[è0»/¼`Ûµ©½IÎH:‘[xÇNbÑŒXУ?yè7Jy%2ûIºCõu!û©@1¥¶¹ÉbN‡Hðu­²rH½ËWŸ©ÅÂý@ù@i;)ªDØH®woÁô€`Gzž›xˆî„@êõÐO¸¼}åx“ö1ª§¯…ržb9qÀúµm ËYT1|q‚ºg m7í‡2b‚$r»F;8…êÁ(ºÕVÍÙ ¥Æ¼,£V6³,÷HCÐæC#3,]4¡þ:-– ý¸šE£¾,†{¶;&ó`µFßJ¹‚‚/J-gÍ%RH½h´–(EúŠÃ«ˆj´ ¦þ]Üv FŠ”p‘ØÚ– ¨M† Ú$¯ö’E rKUHaž¤V„ê)n}wr™¡ò?Ù²ëæO?3øºß̧:™¨IK—‡¯_’¯Úþœ <[ç)}^í±·ž®&ǧ×Ë×yˆpoB @X´­F֋IJP’£‘†I‰‡¤—k ûتù:[Íb¡ç²{è˜êí"šÈ¶Â5Pu²Û:2h÷µÃCw#vÑñÔô³«•:–)°i…QïWRnžy×Õî)•yuP¶¦ÎÉšQn¼ºŠ°LEOÏÑKZ÷ḒxX„ÑïÍÝ„U.™[JG’Í`ÓœPõç{¢ó>øQmbØ*‘ýZ {¤« UþËzª2€ÜÝòáâ?¶©ÏX-Øïoy€Iy]e]ŠÒÁá[ccí“°Éúèðà{zº=mu@ÒÅaý½¤6_£ÛÿE©`\XŸÁöæúCÐ×_* kwÍš±UU˜ö⟦”Oν#­’”½!qªëï8SÖ{غ¿çëȯHZGíøÖ×q ²<;ð¸o租”ÇÉP¶¡¯Ï:ûØ(â<~ö<–àÅâxåôO òg#ÈpïÔ ’â”÷ˆ½íMžP™¿' gç=¿8ßðæûl‹@f®´·Qàуyð‘:¹[àaWSÙ·ÞÅK†ÌtafúЙkUûÿ§=¨m)ý¼ágÔA);’xßÌq °»Ê]¬çw¡½÷¢Î²wîâµV[ŸpöÌn•èsïÿòZ(ܦLªAos¾sö÷e›#mìݾ_äӦá›.y¾%`‹s>  U¾/²cýã•ò?^Á8ú´aš&КEŸ=Êh ¥ŽJÏñ·ÃÚ­‹÷ÈÌÆ{n>q¶þ¨¯c uᮕùwÖ= €oOtþÎp«Ìì\<¨,BëÃ÷1ùæ7÷ý>ƒ–Ts±Ó¶²F½>ƒÂLÈoµnÁK©[ÂÏV$õ¦æÆ:S®Yþ…ÍŽ‘F¸WGÛP:4-Àÿ‹ú;«AÙéÙßVT{)cäÌûß$¤R9ù³N–{¯nÉQ·MfQ¨ éz6rãœÃ†ÿ€µ‚9œepÕ`êkf±lÄœžEÔÓОfóÉKúšI{PÐ+·7>Ê8š_iÇeù2U‹” ™á­h½/ž†þ¿¨z^NxÈ'½õ•~ÞkõN~Ù/Šßw Š9œYu¶»d縆"þØÑœPÍ<­'å‰Zq°føã×6Ó•Gì·xÈ[¶ pþŠã+è¢4xí’æ¹6ý—¯$²D O/] “åPþê3€O ý/6D­²ÄS€Â‰5㬛ßò‘a÷T8r56ã3åX¯ðÊÃ8ëu/5û–àPwÊÉS…rH~K²g €æ[H¸Ù‰!Þð:ïÜó!éÎyuböé|wÎ+‘~£~V¯Ž÷*J®=7Á‘âÓ›ÜU¿cÞfm’Je¤{Ót“P—Æñå®Q!¶èN¾B˜Ÿd,8ƒiŽgëìåTo#(Ä9úì-ºLB:$yQõfñ,ÅeÁv")ù­Ê7þ‹ÕýKßJMÛÖØu¥³Žò8UÈüÆ¥->8ð„f2aŒdòþš†±ÐäWR$!Á@§+M8ÓÐa‰½EÎÍQäÇéÈH°B(=­_]ŠÑë$ó³µ ºIGr¡(2¤Õa£T3ªÍ©…ã·ŽŠÌ\^sÁRëäв]ë4S+å!QPܶ‰Œ¥NÖLýÅȰUp°Œiër“ÀQaZÉ‘·(K¸,u¼ßNí6gm† S”‰BUÄŠOU®ŠBO&×ÓN_ ¥žT¢‹MîÙÿ‚…Á^Fè— )YöÙ,@}ÒAQžË‹`û¤Rj¶kL\Úé&¤l†ÐnB‡Ÿ6—GŽâlSáEÉUPðPDH´ãÀRÈÞvVË• ”ZF\/8Ÿ!Î~&ýèÄÙlܽ%—«g'Ð’…Õ‚#µ‡Êp(©+tå; Ø«;:Ó®>Éý¦T¦š|A1bÛ +™€0>™™[l,‰¨Š|>ZɼS°åPoSRÜCcæn[u°’?˜wªb¢aë^.„Î2 Îû¢%ÒÖŠˆþ4RbØrc»Þ¶€dC¢AŸ+“”߬ [¬—…(ÔSÛ"•8+Õúü/ÔEtMX/6έZ…b "²´‡›è³U!´ÉA-ÓÄ*×Ò&\Ì1|1*,‚4ÈÛ©Øh#Ê÷«eW1¤“âú E‚”J]¨ãqgÌF~2~:˜ ¾)‘B–ƒ‡° V˸s&1dr'‘o„)#—±j·»¹®õAc ¼ÊûÛ[ªH®^«4ô´Í£0¿‘fAR8rÀ¹ïBú• €ƒðâù¶å4f $_7måŒ#`€°“¿ÙÂDðz *¡ì2XÈw0e'Ÿ3EÆÕ €"Áßh:‰íÔÒC0¨:Û›J?ÒË’BhBKðMR$2ÆyŽs$ã¹™‹V% š^ G*¦HØÝ` j¢ñ~·37÷ñ´”n°± RG8¥Uwtÿ›¨-RÏ„9¿‡×J¼ñžzÇ6F–jSô×ÅãŽnœ½-ÿ]ˆöîj†’_Ìpü1áÀ'â“ñÙYrªý!ßä¸ }5¯ þß•â˺sÖ¯V6ú‰ûþOw&&³ºïνTA„ô®»'±*|ºÞ |Í‘-ÞÃûäLúÿÐÔ˜o•+æh»%€Ïú\qwà+Ô»úúŽžO·É¤ôðÓ(5íMÈÕyô€üçcÃ8ÈN9¡•óù/‡˜Ò>½À½7öˆgxö°ÓÊüRÆ•%÷©f"8¶?ütËó¡2†ܽm<öÑ<Ôöåþ!À^@ßÝ+áÌüܯ/Ì-°JùŽë 9éåsÃ÷×·tιéAµLz¾nU#)m•E$ ÍƒšÃy…CǺ\ÎÔÊ m…¢û@î\QB8Ó¼Ö]u0ú,… ´êˆXã_Ú.M2ÏP?Jú"5¹l%Ó%§Je{ 6YÖô½R/d“¥É½ñ[_z®P”°¸y¶qY]tÂM©%õeóOH¡H™\´æ#…‚°ÙlÕ’¬„d‘jÈ3—æ‹ÑúvEACâ榩[”b7TªèI)hž¨ àK¿ÏV‰•‘êQ®r”D3÷Ì€²Š›a`-l¡¾ÓÙó{¹ÚºÐÍâ¬ä–ô_4 ŠÔåØJ¢'µ%øËæõCõ9*}¹*A}Óèx9‹¥GWÜ‚ ›¸£Û[ÅVì kìl©µYþ§œÞÙÍe£K§fm=ù n3%¾õ¬aÆõ©Np“Ñf‹>~C¥ƒ |QÒ×íž›ª©ä'@'æ ¢Y~Ý5Wi¹ïذÒqû0’VŠ_‚WõÛd+Ž4|ˆ9Íûß‘xP Tf^ìÂcÔÊkÜT{¶ˆC!KŦ‰D\ Ju6ò.æg¦¥Ð-ªæ%B„0P ¾È­ÉÑÈj{°N]œ§£¢¢´¯’Å.œ‰êZ¨,!p”㼬õ¶.Pù¼Z½––òËêÊŠ²¥ÑœdÙûˆLŽþ×#P}±]58 ŸjêsVåÀnñ›‹ÃÑ`3î]gèßk‡b r±Ïk°ø›¨>¡•­„XÛÌ–4Q Ý•ÞäEç7-0*që²¾L¶mí}{`žzpð…ô_‰W(³µ6)èmÀd©¬¹;] ±JÿÇN*s )%3(i_½wi bAle^œTð¨åÒÎÚamÂH ™—òGçû|œy’…¨Lþ骠ÔþœZǦƀúye©Õßòsi©îçp¥ºVÀ îh©nŽE¯8(SHU 4eQïJºçø[ßš+ìÖaèwµ¨iòÐi–„^º.>Ø2%ߦå&Õ¼}à :ÖêáêOßš´nãŠ*Ý+%ÖWÖÝíÛ-–|àŽÊ–w0qš8©„W7Í-–ÅÆƒ¶ºÝwÑy{ºoËAiÌ®(/é\¡AºœÓ«î‰8rœÊô•ZX¼³çË.yÚÝäÎxµ0 Ò!ß¶½x<ýè¸Æ÷¯sð+CUø Eiâ`z% k²[ò­÷Z‡í'º!EÝ}°NWà“M¤ªĈJ<ð&$vÌpjŸB;îd<ê(×{]êâIÒ©úAYÿ{T€Z@š^1,A Ak uÜÔå]Þ¾[Ñye㼫Ñßÿd*£'v?s/q> ~ú_õÎÙ°1½ÝkFó*hã×sxÁ~€ñ­‰Î“‡f YyCŒk‡°uh›ÆµïtýuzH1 û—ÿ«|Ø ·v¸ÑhAîX!L¹§»‰‰iƧjä¶:/lïOtþˆCf!;»en K:’$½Ü€rxÀ¡ÂÂ9˜JÈU7Ñž½ÀU%µTÒÃnkw•ðõ7w"È]ë¡ñkÛ¦¾oÙß_ß__øÕ€Ç#3T„SøV¹{G Ÿ1©{øíã#÷0â—uX|?¿¿~S­Óñv·ï"¯<¾¿¿¾Ìçb}¡ßú¬ï"¦Ð‚ ûçþ—åõ›Ð[oùŽQ~½Oüûë7¼õj•nkZ°î¶©þÔ¹bó#Fó×T.³õï§.+ø?“Ò„w%<)ò…VgXß*K"ôA·£Dn†i”/ÛìÓ¦H*Å›²kD*;%¥¸•T®€QÎYXÎÅ$bðÊDU±d–š ŒP±JÔÉÜziu‹BÎŒ#ËI~ð[4—Cž›P°ré&ó¬NJ80è?ÂzÝ‘(¹ÁtûT½‡…¢ÿ¶ˆ $ÍX£ð/¿­HíŠj‘š¦r[ÒjˆV7WKJAº:ÑrJN·§ùìæ°+/+íK¤TcJ߸# • ’–’SŠ[0‚ÄŽ•·Ý¬Kà°¶¯¥º€çý®:¨QÕqÉ,§£éñNœ’U»ú²re )KÍÍþ´ucÔÙP7¦Y\qÈÕv«±fÇŽáx}¶~Øe{VŽwÅE©Ò¬f”³rÝ>¬ ÝðÅÔŸn/F/AÕTdì.R ÖU‡!ÆNJkt±ÊÕ—yíùó[s¯%)HiŽOƒÖSÊk9¶Æâ\þ"÷NKy&†”–µ9ñ)bÙÊ‘Ö6PîÈÝ9&È«=°‹0~k¯»*¯S´å7q*ð¾É]š«^OÓ͈•J€õ£TÏQ;ï(;D˜ó¤`LëMZË´ÌÊÉ@ YÑAÖN}ØÔË´8:Ìñ@­Jc¥´TW=õLÎeòþÝ>)oIŽ„}õ°´`ZžlµTµÚÌ%°2m÷4I*™'ä‹Û¤€F’åOèõÛÖú-.µ¼%B"+ù¾ôÕ|JCG‚ÓÊÝÝæ¤{®¹·æ®i64pRL½–€0pëŠòî«nKd¡¨GoG9é\l¨h\R¯PUY‘ÄÂŒ4™R×ÙSŒ©£M4©•—ó X€7ð¯. ÅF:‚Òî#E š¢g'˶JHK,°¤8X…¶t`lT4´8§6Mê5)sϱoÍÜ% ¥¤¼Áè Bªá¬Yþ¶}•[6ÊB:(ôþŠ®©^³[–uî­â{8Ó©7+¢&ÎS[Ú›¹ó «{ÔÎ;šw-ÜÛ ¨T†f÷ÿ%ÿ*È *Š(Cv³AaÑò%ª¡(¨Z¨~³­õÑÒ´p?Õ«#ÂÊÍ@{!(T«I[¦< ðÜ$èdžÍL­Ñ‰¿*5.YÛžáì.Ìm=± 8“lNqpP*I÷B#«ø©§ü‰·)DAÏÖ³Zëñ':_&}sÑ`mP\ýªÀ¬t°ÒæÇ<êïoP<ñ·ýKrÌ ò±®ô ì`#I•˜óØÓ"}'Ø%9Ãè0«ÉtM‰ʳ¬Î Jm‚r"“©Áކ•“`4 l˜ÚiGï¿ØßŠ o¤Euj÷95¹°âtocHR–2‹¿cÿH+7™íQ` bá¨ñtÞÔp=L,d‘²7^/@0ï*–! ZGÈÔÅ^x…õzg0+²vWþ®Ö©q‡âˆ”gdú7nÅÉqj ¹hãïô·~ùFÚ GÔ_[¨ëΩ{Zʯl½CÝê#ÞÕJšn©Ýö)4 B˜m¥µÕÃm aa¶]ï?wñš'| go=î:ÜŸÊU‰™L i´ŠmÓ•ôéÀèæY¶çÊh¿L!ÜMŒ.‚ÑÙO5«ÈÊy²†eª=WÁž?ùlÈ~åâÛXt€HVsÍuO9ÝÜâ§g}Y°SI»ã¼>g6á~Ìöú“Ì÷YÁÉʽ{²Û˜á³‘ ~™¢ó9n…Éx”X2´P·_á—ö³Ká,¬WÅEÍl€%$zt«hÁpd ªÓøeóþ‹µÀò£i^ïc¤ýí“1ŠHd\ÔH6žZ‘T§Ã!j«¦f‹¿tŸXeß>á‹U÷î–¤—|}}}}}éGÀ÷×ëñû0~}ýr^KûÞW£fB “Âw âû둯/\%ƨ=‡¿¿¾¿¾¿¾¿Þn7”Ô%Ë~ä’l¤&#¹ûVnÒñ*Ç>|W‚¶Å¦à0•lÝ*ðAÞÑhVäf–M­@@‡•Vy°äÔÝûYãÃàèQ´_®iûMJ¿™üµ¹\SMÖfJtšëuq]I`@²=t¡¡ÇÙ³M¸•0PT©±Zº±­Æ%êFB;¦Z·Ç˜'®¿Qaÿ›xNÕ°k/‹Š„š?ÚèV©Þ²ÔÓ”%dt5Úvýëž4U·0mo†W”¨+öÛ#)'UÑÙ±ú:°†ÉÊ@¬evV¶}b(gPª1îvȤO9®šúZQcÜñ«(ÿÜs\Nm¦ŽÕ"±#¡qd_ª¾±Ø0½Ý”uñ£ùMZHlc"ѧàíû”ÿ ÷¶àÎæýž¨±4LÝ ÷bg.ÜC©œØ‡ú9ª(O¤r J¿B?P*ÂéÍ­Ô±Žd:¬`îÁžªE{‡Ë™ÃªO‘$+–³š›%6kRÔ#¥Ú†)::C£Ã÷ìÖ°û5¾àPc¯‡õ襸f⟓ZŸ•áªçÑÚßãØ8`¯‘Bø%O]Ý¥ÛÃCFôüœ’üÐYÞþ’2ÍOÀ‘«uBòûçØ¬Ù]Ê/Dt^*bu©ã‚Z“CR¥u?òM Q©3Ú‹{¼é<Ûê•\°z»3dž¸ʾ{íêp×¶íõ¤ ÐŒéMÊ3AÄ­›"V4¿KÆ<ƒ¹ƒaÁ]FÔdƒ]²ýMŠÍÿŽð3ß!²D¿÷igÕ÷®:k*÷U_\qïÕY —0¥¦´H± 4k´Œ‘1 ó™¾ "› Y…] e.(WúR§œ”€$Ç[èvl¬ø—'}_Ô›e¹g¢ÔQË_³œ ×­Å8OU >« ¬×¡u‹ô¦ö©­ô"ɘuQá¡xÀºº6f¡ˆÿkHfvA# µªØOœ·*ƒnµ´TjÍO”$û¼t’ iAZâL¥NÍÆŒ-ÑüÓ:Ûd¸áîÏʲÂ,H4«Ùƒ„”jeðX DÓÞ ‘ú¬Š=¨妃]¸äx”ˆú‰ºe‘Ò-ÄÑ»•ª[ÁlT ŠpÆü¾ñ©pߨnƒÅJ;RiÀÞÂmqÖ|†°B q÷Îâå·¢U‹ó£©cnGªÊg_»ÅÀ)•d¹sÄ1Â.Câ"©wèíðȲï`—èÝ©HYLÝn›¬æ¡EV Ò' ôö »ód]Âbå±®&i…3g›Eå€ã0©ôrµ¡[ŠHÿó–…ÛrZHBª` T¢Ð¥¾“Ùr!Ãj‚ ¯,Îå1U¤£…`Z'«3Áß®ä|øBWÑѰ®rD3âpƒ³{¥\5µ©%ÍC¥dm’Ñ+¥`è67½¾­ R@¨ëï-h û%Û)Vwª„ò ƒuº†¥ñM‚öð¨ð…lÔ²V=òZ§%ܳÀT'§‡~ï ›¸zèe»žœv(ÕÆ›’Q8çEò,dôÌ=ðÜž×0Jÿ¡¥?uÔëªùñE½JéòÓÊa£^ª•$ZýdyHoøÊ°ýwÀ÷R¹ˆÙâ"÷‚PIÔšÀ'¥Ò”¾õL;sV®sÆ©b€MáØÚ‹Ì;xqµ«Ã¬ôº]Xû,™)×_ð3 Joÿß·¢ìAíïÄ¢®ßÁBš[}ç{«‹ÊÕ‹íå Ù²þ}t@•cóÇ9¾ZÑyR±Õ­¨¯Ú¥¦ºrTÖU[¬…ˆ ìg¾êVSA“{ ò§/°ûñãþ“'ïÚU€p¿ƒ.(á\\Ùç–Õåè!ºÂDà¥Îùý»§/&tX¤ˆ~8T]¦†I‘ú'#s€éj¿÷;Ù’Wn¡zL-ZK÷íßé~ñäïák}…âÁƒþ—2û¾+`|} ôÛQ6È €GE{Ÿæõ][â†_ÙÓIÉá1PúÒ/DŒB׿ñ-‰I~r¿ÄÈéMã“~¾˜*dqü–¬ÎGkÙÙKGtþ³Ì­/mÂ÷Í BzJ}Q2; ý/<®¿ˆ®ËŸæz¾o Åɳ×ÿýõÕEÒwœÊFvd'N¯ªÑ›W<ºÌñ¹F‰òj{„€öE6b¸Ñü¬`““² ú§6*Ö ÒÇAÕòúhqþ¤>Aª¾^ý]ŠS«ê©Qu‚± Í$Ì­±ª«aõÔ” ç¤1«¤•rXzž7ùÒqÚµÁT=ÇÍ$½#›©z$cŒ13YDHøøuyŽöƒji\¹šæZ´éNï J­ôï².FèigAåR…®’øýý|]‚„à VâÛr-P.f#'·¶ãbþ•HƒP×ÅJý¨r>lº¯ ˜¹3 Êö•´±[;LG£‰Ç¿äL˜&dó!U×}ˆ¢w ¯ß ôÑLœ¨aèb›d×ú¼'Ðõ§ö¾¯ñ 5ypÅo`®–‹©‰¶ñòüœ§kßןyGÖñÃÒRè^ð)¸qÈ-o¶d\u%ú…n®ï<ÜÔÜi6¥Mi=ªK½´[ y¤SdëéÔéõ¦%Øy€¾c £X”.«»$¼8Û¹Áoœ£8´¢hÿ§DxzÀé ;Ôåº(Á±e*‚®Judí¦…É#ØpŠ·  òE/mÐURöÅ«æ=÷4ì— ‡aœà¾0GóŸó+&µšîàž–8°XÜîÁžøé\æ  :íëRêP§™½­•maA§šÚ›ÊÄ#}¼.ÿUŠÎ‹°ol ç×iÂ)8(b%(¦‚æ5TëÿÏ×ÄÕ¸ê®9Ýɹ%Šopüà<µ@ Šºqph©åY|N¼’!øM‡·˜Îcÿä1züÙ"ÔžEºâñÔ'< ¸˜ù–…\àwêÂ[ì\"ÒÛ|K“ĬnÍ´Î’ûIëo³. æÐ!Ý› n°ZÝ TE™åoÏo°12ÎdAHiK?•I‚޹Wp'Õ)´ÛBŠ'à¦(PõñÊK«ëHXR‘%娄`(z¤·œFo^j£°6!¥Ò£èÿ,ê5°Ñvn¶’}(°§õFwcÖUk(¡çYyüúþî](ûlƒþ"U›P 0ƒ{F­ØVg|€âò-N1-”G&É­-xúF{c© WœEæ[Pü¯ÀÑ*r^÷Z’Г’^÷ ¬ ®ûµOÈŽ*a/D7Ps’艣±‡SqJÂË6›yNJ€÷IÎTÂzU¨ËQòtî×òç] ‹6ÌÕ©™cwµ‚RDYC*ºêÈÕêIÈGR½”ôÍ&2 #•º,‡Û꺊žšÎ²u{j§úëÖ("w„ÑÂZ¿+­ÑMg—+3n‘è­ž+ݸ*‰A¡„ÀXXaÀÄÜT‘4–YÀ¬ŸÓ Õo)²¡Ý]6YøÌð…¼¢ƒº9"Ðô$û¥Q©Q<ïYɲ’jdïªüÁSû&«³ÖTèÞÎA䇶ÁAw @­UM5 úÀ&öv4J©°ƒÝc‚;g¢ž®EÄW»(j-”šPê Ô=)E¢£Î“YËd€ZÁ„ýt«(xR "“Ô@˜œÄè ê,âÏâx©îí–âø^¼.9,«,*sZFO·²b¿jã\U­œ£; ˜‰D z@]ƒ«•…i­&j%œShù£õ¼@ðNp•ŒÒíÂ67e}ªfƒ©mß0t´˜Š-F¦ é6„• oï[?™B2¶²§Ö[?ÆÍŽ«€}KjQ¿Pkëš0F[î–˜.¯œäð멤IáИŒM1î#°=D·ê”EC}0w,F;­±À=¥ftÄÔˆÕ>V4iäý?AÿÚgbi£LÂ/V\¥¹lÑëUºp±Äjž@ÙÖwê×3[˜žþD-|t* káéjß  ÷ÑÍ·Û/ŸÁ¿þ\Ø®>E­¨ï¢8,ôß,ok{µòâ%u×å¶žÎA8¿Ïô±KüÒyv®PMæ(¾Ôµáéãá^Ù[3E¾vÑùr]+É”gö ¤Dƒ&åT¨w]1p€‘õ° Ëù»ìŠ™c’±}ЃüL €NN?‰nêü—€Æ®|×Ðð\ØKiŸûôÂzK°Ñ§ЃýÂ]U'ePaãrg—êqaÁ¼NØe#Û(:ȪÓs2ãuìò¦@xÍ&–DnJ¹£“uOTèmW"Oºà~ŠS¢?à{Öw¹˜/ôu¬á鎿O³"RcرÓã;‰ó3½àž½  †`œÝ±j¯b<äÄñPj¾rÁÑ1§VYfj(¹O…íÑå¡!ÜÒZ[r{kz=Ài?þd×a[&ï’5.çøù«8^A®U²¿_۸…±åQ=‰ðʰT™|®£ïaq˜´"Í·2BÝÒU,p¬‡€Ü»ëß!/\PRŽü¾©l;`›ÐÜ2£|òèÿ»#á·ØÏūߨ€û4?çîfõ¾°0ø.ª×Ù驜Ìáæ\ ‡Žñ& ³¥¿å̹'hê?ͯMjéë?xì/—Ðû”Æê?ðÀPyénpæ÷‘›}µ…ÆÕ7?ºïHÍŸæÔÙ*“®2ŒÚ »ÙÂØ²õ¥å9zÀk‰.º{ÓºlÆ3ý¶ù¢±é±ð¼-GÅTdá,¬ZuL:ª&©+Rí Œ$%Î3cTܪÂùBß­’?É~‹¥4OŸ—xÌ*[†øǺÜÀ=ïòw2þŸTˆzÑm#\;*wÛ`¤'ú‚#9îV«`2-n&.¬®RêDiFêÕ…ûwèûò"|fŠ;jÉ!}–£™¼EuÔ²!ôšñÐûñÊ’8ú=ð3œ€ßQoáŸZÎ1¼s(äMžiÕÛ^-zù`£ø:Wúà#â¦ÑÒˉvƳPš¡E„ÇDÚg㙀h¤2Ÿ¾'ÒÞZ|ëñu$!(ª1<4“ &)¬2 ¯Q;•s߃sª¦ÕPÝÑn[(X³1:×v÷Òg£K_KÕdˆ:39•Ö¦–ù½S(©–WºNg­-ž²ÿýìIµêHí.mKë$ÍÖ¹ÁýÙcCf@NfÃ`E¾¯á³û\TÏûQØKÉç¶ç­ÝíÈiJãC‹Bƒò¸ò çqÖ§œÀsáluÃv[}+D™sÜ AUû.ßêéahPÄ6)ô×r ÀÎ^•Îêü{ÒNò®8ý!ÈýÝÑê)ܹ~$º*d µšÅ¡ÏËm;‡ b*ÿJ¬œÍn7½4‡ô©­YwÔ6Ô®Ð|;÷$€úÓd¾;‡¡iW¨v*?¶è¦xø­Á,lÕØŸ®8µîPô•·]†®}/xS¬ásdçDç©!±‡\Ф[²ÌLÀ̱Ã\OL?3cͦ¦o´&XVúZqõz±ˆ04c‘e¸ Áh%2IØ’VzãÖSÆ.Ì^› Î©ŠŒþ¯Û LºÉ ­ØnFuXyÑ/ê ùÉeùþåâRÍ‚z>—¹œy—Ù½‘wôH£4 B#E–-5—oZ‰pZg–šêYˆ‚Šê.S53Vš—<ûÕD7[^· t¨ÌMR<ºº&*fhÏ”öŠÚ•ÑÛ2Kt•'uÓ,)m`¨2Ø“Ìha¡Ö@e@S|ò;°9ÝÉÒGª=ÄaJ5R¡¤j§ju â÷§d#BqÕĹêzß,›¼àÒ|£'õAßnÄp/Í ‡ c–Ž®Ü`?Vg«–åÑØå`…R¨ ¸.t&=¾dsùãps€‘± ‘Æ*£SÛZ،樶xà G&¥I¡óaxXƒÏʃåçê2{!I£ŠZš„°u4²‘:cdÕŸ‰b–Õže<0T˜TL‰í¿YIA G[âZœ®s-·ªjRçFí§Õ`ÄvÞm¥þ´ç’#ýÜ2Kp a[ËS7÷8Rd›Ö“{[Û+(MÄUøP²Ã„‚À Ø!(t 3Vκ>Vz‰žv…€£ŠœKe¶P¿nælߪÆÑ®ج¹ñ0 QîEV«Ó(À‚Ô ˜h-«&B¡ùì;¼P Þ ÷+#çNPê¶— £Âkd—XÆä¢Õ8µ.Þ.¥õˆ×zž’ð>ŠÈú§‡ÍÀ°S«Ð(l{É6ç75×»ÄÓÂ-b¬,³#ªCÙ(Ž’Rt k¨¹\ìTh;Äô+FlÁª)ß[Hªemsë¨9q›˜¤){×21ºûKk B”òßV®c…³˜m“eÐ…;¨4hOsvQí ÈY€ˆž&ù­4{u^™R[,ár[(W0X©W5QTëA„íšàä3•/*nl$–)}E˜6wTìØ•Ö™?£=°»@ÇPûWô*ߛܟEA0¿Ò/ªµŒP&Q‡JÎÐnŸÈ:ê`}>öÏBÙ¦xRnûÿ–×UÔÚµŠ`5Ék=¢ÝÛiÄ]…>d!GQ´¥–Uòn—}1,®š_e^ ͪ[‹\1«ýV#ž“þ¬C€+“8u”©bj(>VXüöEç3bÑ«\´ÓjuöB›\+¼¬!“¶&Qø”WHxÔ˜õ ïdHQhà\îY7úí²`ššæË¼ (m×ön\;ùæéážÖÛ¸V¬Á‘ô3|ô‘.hñu_ŸÈ‹ÐOaÌL–ýŒsœã&ªo, ]K5¬èô¾ŠòA7’A/eùÛÜ­Uj`ŠU™«å)¶S=éðzš¶÷¿Z¨>tLx×ïó[|RM^=j 8üqß³y 'h ¯ý">z­}!ÓαÙïÆË\²~:^O¬;´sùšÑ“¡H‡ Ðqªó„¤Àþ º9÷çÄa?9tÞAi¸uŠÿxõ‚i´‘¿ãÎÚùü×ÍJmeàjÚ›Œ_¡0¨RuSr´]ÙyÖÜYA=[9ÃÐαǒFýF“K7 ܱ]}FU‡Ö7Û;u21õC9¨‰y–ày"^Ïiž‚–ýÊ¡F›àNN«ô,¥„Ë«¨–@¯F²¯Œq÷¶–àoRó£[%DdNNM»Ì[Kz²ÃñØcx¾¯zÛ¤AŠú-½@Ó4àøÒØcð¾©,%4vlîÿöh9 á¯l0DÛµ`oTºéίìÖ3š €Ö<9È@ãõÊÄÁùb¹VÇg‘Z;SØSÚéí“GS3ìQ5Ø>`sk± ŽFÇЋo–p·èü}wXd]3 ìçZß_ê5v n&Àvس€0("1YfêHy?XFQg¶›ªžpF³Yï&ÊR4‡ˆL¶ìWÿcÁd{+ÉBŒ²›<ÔÁFY#\ûI‘¸¨þsŽKíS™|¡×(ê«@ݵY¤ ¾˜²uð^‡ þk+¨Ö=<¥çqïÒænM£õÀÃgôI‰‡²œÞeQ>¹<‡€L¼Ùj ÿ´(Þþ+ÎIÈ|a¯·Pí¹ó!é5y„È#Þh%=¾`Ðàû·Ž=R¾â™ÆOüjÃ2¸p`+e(l·‘PÏ\‡*°—ôñä'£RJ7È¢€#Ï’lÿ%KqמÁ©_K*Y“y® €ì7æJiðØÞRºP᮹l¸g•΢HE¶^µœÖêÝÉï“D8Mæ¯? ^¯æ!ý.1 ìÃ÷íküaÊ0gÐ탳èx%Ü6ÕjHJІ"i´…úcÙè0½oø´wåy™ûæœÙ«¨u¹—ø{oi7¶Ð^šòPE€òèÑð?·|¼*ÐM¢…ÊàÎA¥Š‹>áW Ù‰0V)$K£) ÇW®GôÑTLVpW¹y¹Àæaåšä²¿ÓžŠÞŽÜ=@ëŽ~éZ ×»âãÐÿs…ºì»oY 6V³.O'Ï2]ƒj¸ÃJäÕ1À¹v·âñï³ä!_¸èüYð¾B.·óÄNÏ1<MQ5 ¸íäE!HIúA±wÏxBg|Yí¹ð£ÂÎitTt«ÍÓÉ×9qÈ×#q<ÕÂŽÅ' 4J2Ë=:@ºAœ†™Ü¬U Ɔ‘Ų\>ÛÅÊADÛÖ‘Ñ%êÈØºÿ!‘Hóêb!¿áêJMK‘3FÆÈ\nÕzGþ³iÆa!|Rß!s…ÉÔ[à™ŠšŦP3 5gÑ ¡QƱŸÆŠçO¡.¾,õ£}´] P£ÇD¥ã³H`eÓ Öm2ªÎQ]#³.—fŠYk¬„ߣš¢6Á‰ìr‘,yê›¶ÂàP—|R£»!buán1lg+¶ÌªIÜÛ±pæ‹R»5Ì!ŒœÓ2Ë79¥’—¿L¼òÆZf¸mÙ%óq=NRL16‰ÙÍÚð\3éP˜‰h1 ¯+*+‰,ËÅÐÂË4ÉM|Ôacƒ)«¦Ri;$°ÐÏõLг˜•qÊnP¨$lÅãRèXáÍȧ"(ä*¸1‹…lÊpRtÒâ4s¸z{ŒxÕOµ’>Ôý[nO“+,±DÝ9öÎíL…H«f&\¶Ë,ùÝÚ,7 “°ã½ÂT-GÒÛvZs5KèEÿŽöü] dÑ]ïJ\ º ¬$׬JÑ꽦Fú+¬ ¡WN@þ—å}I ÀŠM2í¶´2CÎ){JAIÿ—mÓŽH ­_Âj«ƒ@TÇH}@²ÜmA¬Óõ½]dd­ÂÂô@ivÅBŠÎìp(ak²„"Uï<ÄLQÖ“¡~Ï2‹ØöíeŽBé¦èdi —Ð-»Í?´ÎÉeO€8’ñ5¤£“ ; ÍrŠf9xã U|QËRˆð嬤R.³/Å«Réuc“ÕúB;Ÿœ.@D‚2YA!¿çâg%o ¥emÂú¢¡¤½6`ªjˆÑ:3hòmÖO£‚ƒW K’ ¯÷’EG7 s|§Ý‚&Ðõ6gï?³BˆÙÀaLך„äœF¬{óz”¦}æ.\±D˜œÂ{€‡¨‡ '0ܸåvùÄQ5:Ò2“åèJäÓÀò7+:-9bq6‹Í=óaÓF˜n”/ÖsÒ’PHeõ^dYóCÕ‰W•XŒ0ëñâ¤ZLg dì.ÀåÄ=¨é]ÅÖ`Êì³RõŽ×$© €Ú<­¼ŒúÍìœÉé?ÚñК{{½Õ‡´8¢[cŒ3cÜb䬚¯™„  b…caÇ­£§±d`KÝPÅ>wuÝíˆa¡Þ}§+“²wáŸùÅ×o_4 Üû]lýÀþ…à“0½öçå•Ï¢35Õ~|£©åÄ5NÒþÉÙyø~GŽ*9…Wùû~ªåÜ8äA €2¦4žÚ¤Õ.oªZ°ñÕNu¡b¨F¤?/ÅBNÜ¢8Lµ2G©r©B:iµ6«~í·· Š7•v”@ZÁ<ù„¤­BI)0<ôyEk·‹îné¹°ÒÃ$[–î´Í^=Ükü]¯XÖôÙ!ã‘w2îj…,ÄvÚººíìóhÛGli*3È ì;)gQ£Ò;2²6Ô2êÜšÍWjO¸Vÿ˜¿5®j&[‹·¡ŒZ—¾Ê«R•!»3Ÿék;2nM3Yï  a’.ïÍO’Í=v@äX¿4a1 €=Ëê¨ò§ÛÍ–ólÏi÷IÁÕ¢ÿ!ȉ|X!Á@ @TÍò¬~É Rj×äà Р+.€»wÒÓB`gçÒz)þ(âŽá‡‚l¬zëµÓ˜öGp×þtüÆl€lTÝé5~4ºÅÐ qy,muF·Z´I—­ærC¯"ìžb[˜ÜßÁÊŽ§¯šõ‰ŸOõðk×ÿÂl©H@;‚ÚÿÆ>1ÝešœîT_=R;(7ó¥ë)|ê×X}ë#/†_ÏòÕžNœØ…ÂçR¾ž, ¾ÜS‹õ_«©éæUÚ ¢pEê/ãá§ÎÔÁO—ò/"Íñ؉éxŠ–£v°HVQ ÐÒ tŽ…ãîhŽ  Üß4gŽ{ƒMäè³BÀ¯=,oþUŸaˆ¾¿îˆ6ð}d)É͵èŽùþ:´€™óp·óØþ{LÙv_·Ü$½u'ÝC Ý#5EæXæ#ÖdÒÚSñŽ‹Ñ¨qýo)@sO:ªPœ6잤^"ɳ¨”‡¼MÄW˜8øé˜ùAOΊ¯Ùp¾ú󛸓þcÆñ`ÔÕzàœ©Wµ’þç›?ì‡K=•ÅkŸÛîxá5ñ­ÉSb}Ÿój±OƒvïÌJÖ´ -R˜$äB%ªvS¸¬:…«Þïã·SÒÇîp-mí˜î¼f‹¢²‘_Ó:ºÃµÃWÛÙÚÔß»5€ûM‡Ç^ÖǃW{,A§Eÿù%o8Ú²RŠÈ»7 |ÓÃô)×ðéµc7\¶ÜaòY…4Ì®ªÅ°ŒµLƒÜK½X¬ÝÚÜÙ µZû²œ5«Fý!/uRÈ‘õùl%«¯§»¶Vl>jà\*6+€Ï‚Ûm=kAc( $×jÀvc(p‡•Lº}Òû©° ‚µ½e§ËeDÍæõÚ`½Š‹dªj HdIJù~íÜÈ)X ⓪ (Ì¥ÄR«-¹š{Ñøæ±e%ÔÍ[ ´ŠlD(™[ÁÆëÄ€²o° è¬3Rw-*éªT¬é¢‚f>éa§eâu¸ÌuìP·¹@÷]¦ ¬~©™&,Vµ°’éŸÕ~ñÔûUV»^M6s~Ÿ‰Æ‹Í "-[I$ÝnÙÙ#F«UÈFò €Çúf;#͵&Ýâgi=Éçmû¦J)® ì_õcî­o ТIyÕ6†ÄnÒJèHÉ£å¬ÊLEW ƒv”ã\‡eŒ2’B–°²"E<æN†´[h½.÷:¸GW°‰äl?-:'Åe,‘^¯»Ër·«1Ô[]V6KÃDa\ÓMÝI·ìyªÛíäƒ ÉÊN>êÎßv¥ +Ñ-kýf­«º3—d;] .*7š¼Ž@ÍÄ·Ä…þúÙjèâØçêáôïJð"cÌVÓÃú¶s“Šp¬WA/iš’˜’xš?e×Fé–ã¨Ô†:âS18®Ð9MžbÚ²ÞOÕxŠ!0ÏÈžhów•é Í!¡%€ì.OóMø_‘è¼÷.C®‚ ÌÄ—¯†YqEþ´µjã•"¨5æV6^R08`—ÏV¬ÃðªÜeL×Ð#srvÍ6•€dzPCÎÂ:’¤û¯ÚÄD¤`(†w<¶ûÃ;¯àÈB¬šåØl•B~NuoÇ#[;B…O“îht‡±¥Qdà0²ýu=ù 5rYá~™š`Ö„1âµÀA X7ÖWïìÜÑ•>°‘ä]º9óîÞѦ ThžÚá<\².ÓQU»:&Õ/ÚhâØà¼¾eŒÇ‚wî¼Ù)DJºþüþêacü¹w¤åJ©NÔýh²?Õ „îÀGûoЊým°ëµÕ’æ¥êòvmVˆˆy®”Ã¥§W¼šÔÿbáÈo:´xr ÅwðàåÔ# ǤgRNˆzH+¼ÁÔÍŽåÙÍÊï?ßâ*ö·„Ø…Þ"sÎëÍù޶x¾æœvÔ9"=Ô9M5Ðd; eû¹E'³Né Î ¹Ï¦æIBgeâR2Ö_XüÌþÎfœ5"“ÑÞD æñ—3¤`àðfºÓ#ÙÞ~›ŠÀšgJä¶©ãÌZ–]QõxbÁŸÐl!ïx×Ó†Â|«eè] ÜXD¸30®NL«@[ßJ$Ò mÖg+»+@g‹š‡âÒN¨Ðr/H#k€‡È¹­ˆö`}d¶ ûêß9±E’•áÕç~}i¢óÒOe×{Ù3ðà ‹þ¯µÖÆUãt-ü[~õέ^ÇŠêÚ<'°¯a4cåÃ=¼“í¦¶×'= œrD0šeêçï*üN aíš^›ýã¦òcåWàBq<Ž5óTœÈ»9Ó¯Êmß|1Òä4ÔX8Þâ›Ôý½î¨ø¾M}}}}}Òˆús½½—™ÞI[!¡ìjÝMÇbÐñýõýõýõºÕÿ ä‡ñe ~ñûÖ_ 7ˆ‘(†ïƒ"r–ý•PÓïº$où ö•Ýéçy~à‚À—5#ÊΛ·Ú¾oøß_Ÿ!¶z£’÷mtÃDñÂ}²iýgÙ¯¾ý縕ãò1FIÎØEBËöå L5Ö µh] •\Ú±Z%EVð\÷³ ©qTŽª)…LEÕÜAsÝšh°™è¡§d у¯AÇJwá9§rÿÖì/"1’qu¬[³ô­ýgë8#ÊîUÂNÁ¤d2O ò.3\GK1ò ^iU¼ÙÉòÛ‚馩€‘$JLT_cÚ^¸ÉJ´9±­U:RVq5[ªÇȯŽíSDL¥Çò÷šöýŽ’MšÅ—‰BR"R,‹ý¯ëgAgÝ‹'A&Õ:ôh=ß.ö7ÈRgdž£ç›Ô+4*²5š¡:ÊÉoˆ<ìäß%­Â”­› K[ÆnT x–SÜËMÊÙƒòáø'E›ø¹óü2½¯X%ôvŽ]…ÐÜí@ø}½éÇê×=@ͯdçZj,ýû;…=¬uÖeæ÷ÕrQݦa‡ÉcÚ èŒÔÆN-öFÝ`uz×,c»ÉÒUû)þf¡Ü:ó¶q¬uy2gQm?©/,„Òd71r¢ÆPW{‹æ-ÝJÖ™úóó6¬eÃn ´'½M~«³òn¶š¶Ê„° Ý6®:e”ˆ[1ÕñqÝ’i¦ªR$±7†r)a)H‹•åÓÂ*–NÍ1ÌÜü€Íã"GÔJÓ3Y"Û6ĵîÖ)¨©`ÞT<ÄféNÓJ/Líø°T¨šb[lÓõ:¯³,éšÀk38-Šb)¸‰#Ä&›7v­l &éÍ^£"áw3¾U[1€Ý‡T]ÕÆˆIí’›¢:Ë™‡dýuÖEÜëx¬†Nü:LÇNŠšÂûb9´uw¨D/¸ç^‹Zاõ*Þ^¯¯6 V:r (UdY0Iõ`¢b,á>—Å a‹Qm²–ëÿÈÄ@Am°GDõØýiQœkÐÒ‡Õ™|ÄRÂ;èê›-( -öÛ7.:_Ôs²lûÙí¥èë·g£»xKùŸFÀºi8± ù±B; AÀE¸_„6®0Çž¡ùP˜<´½³a—7ÒÇ ¥ÕßžîÜNs×Äîo!ÎJÈW7gËŽš5ÅOãn• Qz2 — a…:¥sª3Z)œøV}ŒŒ³™RDª8°¢!²ñ|··>SÑjüúÙQŽH2toæÖY ²l¿y¦åØOÅû2 õ^õÁÚvvôüºIìon~÷Ú“RZšBe0å]6¯,:²·t@TæÀªr¢Õ±òÄʃ¦*Ktá=ï‡lojk4Èéé=m_-ZYìa0ç¦FR{ÝÔ-W)ðÍ…£‡+±¿â¾-óØfk\m¬½(_©ÈçzÛ”@#JÛ€îÉXLÔʇMÖú×:çU€ž6ÏT ŸûÈØ]¸&„«¤ävøHŽªLV3×ÊWk‘o]à”jüï`8ž>éA7tÄÝúÄoVtÞÛžÔ¾òÏÝáÇÉmPömÎøýå¼FìGƽ`ê„h­³ wÎÈZnßk‹¯UrVoÏ%TýÊ‘œ é,P¶uáÞÍ‘1’$gÆy±ïC„>»ËmUt+_±.Çšù%,γñ½ÿûß)Ñß_ß_ß_oþúÎ$ÿ"Çð«x,üä£\uõâ¸Èѧ²Û2üýõýõÙ7­ï“óûëõij° ïÿ˜_öÈòÌo/PÛ÷åûÆ»£µu:éÎrÃ%Çm6‡ÓYÎâIa|2j<›xOñ|Q’üÏÞtVê>m÷2ÊQjv!0E¡[á±¶Mß1j1£­ìÓáÆ{VמYûedïâPÊfAœ>‘’~§ìýÃ#ìàØþ©ÞÎûÐ,è=8Ém´KÃìó¢ °OóiK­hÅЂ¼Å8²Xç6õQj˜¸Ü}"šáÓ¥–¤hº¨Zc\î1;wbºQ&¨î4-ó/Ø8Há›Ï,´6ƒ£‰²ê®Çw¦æ ¤˜8õ)P`{H·§w'E3 ŠP©”%Š€äTúÑÛm{ÔmÃ>€í®¢í³÷z”l‡WÉ•¾V¢<Ç·ªËŠ© _­¹Ü2fYs,Ú¯RHD=/’5tŠq`;Ñ$;Ð<, v³©…{¤+Ì–Ù(î+öËÌ>zÊ•¯béÆ-ªºÀ~/á.×¾evZh¡x úº¤Bû ùšD½ö…µôÎmµR@0j]ñÀùöЊ¡©ÀsÎf¥œÆ¶<‘§ª„½1kÞ¶1õMƵ¦ÿ긞-ꥭ\yÝFÈZúLe7V H%[› ³½Õ4ª’K•š©K£é€»69*ÿãæsGb±;LÔ¬¨äÆÞmn8¨·ürðòXäy@ìZ.v®èH¤ä™QeÀYöf§z`¹’ZxÍÄ7^O”_\¡€²!lø ‹+T" ܉lI+—BP®Ó¿ÊÔÁï;IcãBµsí¹‰#¿q­µ¼ÌKÝ“^0Z–àgýNZ@<Ö7ëÜå,J­þ›ðPQh-ÅâÑéÆkò\3„î«ÃƒBˆE7÷vw¬TÙÒŠ/³q$¶9õß-ÖJyÒRäúfEç[n¯ëÿàÉé°.`) 0Q®K+T+bo§–üµàµRËš]JNÑF«û愼 <4ÎÌ•’PhP$Ñ=¤@êŒGŒ4¢v.ëñHds·×s£âËu¨–¾ë.= K1Cµw³×ëšØÃ)Öǰ3£ÂW‡Î’Q/ˆ²($ql˜òRɸ4þ“1K=/¶ÄIðW)æ­$•MðVŠ¡­V±¢PiÚ6²iV»ÌÐmÈêx²äìÒ *³Ä:(¾6ÑVBÚ<,lŒŒ’àŠŽ®J‰é¡\ì}„Vѧ«®³!uGd]aèäĵæ©NåÚ9 ´ZÍ™$E=׌X–Jè낲ˆ´K†GÌ®@mËYî?!)¥¼ÜÑD².±¸ZWò¯éž"ðåaФKé›U\¿úƨµ›¥)nF䦄Y"ú«˜µØU®DG)RšÍ8¬ÕsV­G±—a+1b;— |\b {“ÝB/ ò,êO×ᇔûd¹dê\³N+Ôœ[Ïø®í_,£:ø(”Tì& [a²ŠIYùÄTÂ-Ž,Ø\@…GMþõ;⪺n ÑÞíßì &%únâÌB°ÈßfáF¿Ì·Ñܸ+ÙF«œ—¬.ë;Z&­\qû"§Š«¾B–e¢Ôv¶S…Úú¡¹ßj…ÍÖ¯ Ñåña°HêPg›Bu­: ßAìóm©"vÒfÍzç1ù ÄEÄÛ:ÔwÈì-(_Š--‚–¶xõ› ÕÛ"ŒM•2W gÚJ丒EÜ+¤T¥8e!¶ ­Ö…OáQ õ¸Þµº¨¹ï®4AÞLJ=¾LåZ» L‹ÄÝôª¨«Þ§-4í1I6ÝÊ<FÛæ²õ|€·x‹mŸÔZ¾˜ìvÖÄ­Æ$+GJ%™eIJ{‘-t·‹~¿|Tª½4øÞV°€²¿udºÙ´û{BÞ‚ŒëFuÎ{‚”fù$5»eÇ%d8=‹¸òëAäLt³ @Ù¡ÀÊf“ñ-_6%2-˜¡ðu`[kCxÙˆyp´ñ|°{QézÇÖvBeÝ§× ²>Rr\:(ÈbZ©Õºæ3’.šnNèãÏ_É}P\!?h‰Û Õ)–¢½d/Åä^F® ¨U+XŸÃ,Ž UŸ#¸ÿAèÜUÈ)>­ÚÚÎÅ W P^v!°ÖJ´)år»çå*ì;çHý÷*(r®2Rftš–7ãCõ€À÷õóR]4@;ÐÚ+¶ŒyÌq€]xÅn§Um´8ÈûøªW øÜ¢ó­±«§“³MTµ[U•HxbqZÜ\É£éÊZãî—HÉàÖE›%¯ä4à!­¡£ ÍjÿÐ3t¦ó‰ÒÏV^!û¡¸„ºÛâkˆˆ¬¾¯¾5îï˦Éã,Œ[àŠÑ7 ˆ|±$¢ÓÍ ŠlîDþÙ¿¿Až¬iÞYåye°¯íì•)>Û•ý2zßi´†çû }ů ßЉýþ:³sŸr¾˜ÙP¿Íûî¹ê3¼Ö¢]RñX>ÃØ®HÖ§\_msÛšÎõ}? ëëF¥YþÍ>ÀÁ«ºÃàÇè-”<¾‚ n[š±½b‡Kš‘mÜÒdñõ¨ÛÕÎÇÉc°E¿ž–|ü@þŒ¡LÁ¸c[¸£ýÿÍŽfWGe| KÃùcÎ;ÒÝÁÒ÷<äû«»ömÒuf²uŒ:}ýáÕ·ËåÏwÄ£'%ºö˜÷­”±ü¸l_sã¶þ|Õšér0å§¢eEmVóÛÅÕk­G1U³SÙYJuÑp´-–+ºžÚåQݦ-ÔoõÕ¢äE·Ú`>˪ÌŵŸɹvüVáÅê²íeЖ¹ÈD lœÕtYÐ: Ke9÷Áª÷9›€íÁ}ª5Ö‚À©m¸Ÿ˜òbÂpl¹ÉêKO†òcRû@EÑ-øº%WIuç¯w¨9¹5=ðäµ !|“h÷PêäÉ«œû >|èé:6Ûo5Ú §¯³·É÷¯~ Ü{]­Ž)7„¦F'gÀ‘-c×JÇ?ëÀc«wƒ²›º,hKV?%/«ÊúÒ(Ïšˆ;±OêÚÐÝóÝüÎŽùë`ŒÆÀ8]c•1ïÂþÓ|ë]GY Óó[4\Šm£ºÃúÔ?K@59O¹•x2¿¿êa_þ¥[îÒ¡c:g8¼°tûñ$ÜuŠ;åp<éµ¢?"ÿçÀW8»Û¹Órá‘·G»¡Ø+:÷H^•»îÞ¥¶Ho;ˆÂëuç†Æ×µñki§*WÊV`ê“faܲXìP­EšX¿”þ¡¡Åx ß­ÿ#«¸;Ž( Ó¥¼þž¿òî)vlû4Pi!:TJ6)ÖØ¹Ó+Üc㨓;η):ÿJT©õhšcÙ¯W’“šÁ™q2 ¬5èVV(7R«—E÷° Ö¤?P‘ej('3ž6>Ñy¥‚‹Çõ/pØ —=«šØ™‹: IÉø€{Y›>P¡‰³e‚ܶ¸ZVŠC–%ƒPç®(7Dσ¸Ìö¬j<)\dJõÕ‚·@­À,µå¶ëo•Óºî"Šf«bKõÛ´¤f¥Ù ®5Ðû„ªÜHQí­ç¤Ä#r™!‡Õ©\d©یJˆYk¤¡^ÕA©`vSd²Ð¼}ûàbzmÓ Ê èÃZð‘èÝy“<²¦YŽ'‹B¥}Û‰-Ã}©ØÙf¿räY+DÁ¢2Ö…ÜýÙ€6%Ÿ‘•ðš³åOOxÛVÃZ§CÄ¢/¹š~¬‹šTB)…zk!¤ê­(©8åkÌ6)†µU–j Úc]Pÿ‹‰GZ-3ms©L]WÖÑGe¡´£4rôÖ,$š$ÑA²Ú°Ë mþ¹·tY‹"¢® 6ÜÛá hÇ«Fs®;A*lÅAÖOEÕ¼í(a#–ç ª'=VY¡P± ‘Ñr¦­°^ÿR-½ôÿêXÙ ¬ 6(̕؄ õMfž› †_[鼺;uqgÅ{#‡{[¥¢‘êo§ý7j_!]’Ö¨µ8 ô¯r ’5À Ñü#}´‰%Š£›a–Á*\ Ù¨|þj&¯Õæ×.šFHêt(åžs£Cu1žÀºRç„zEu ¥ö®)Üä$¢òšâ¡ü³Ð7\fïz<<¼‡`öj!jÅo|e¥C¥¢-–Ò’ZÂV•”etÍöá{ŒÙë•çVÂЩ¯PkÞÈAmqb…w†Œg«î—Ƴp„zƵ´té(7a¦uäà ¯…thRyV­ýlìc¢á•G«Ý’v›MY’ «Ò:W‰5BʪD·-@æ,Dq@å«%&À€´&›Ÿªï¹IЖ[µ[ 6šE:ØØº±Ú1µð ’PÃã­ò>JÕÙ¼—ÂÄ–ÎÞHÃRIxXó 0O÷Ey°  µ ýê« (ù¹¨B<µ­®ÑJõ‘l QÀk¬4ðóB‹í–)Çöa)½õ ïmÌ5æÝ&g¯\T¡QB%P–Q5ÝPŠæNB ÒX[š\õ×pCUòa hõL–ÉXG¥– YŒR&®“²Ü`·_¬Ó}Œ»ØÉÃÇìªÙ¸Ž6Í@l’îqk ñü{D…&CÑ`. ò>c-O‡Ó©jªH¨ÞJô)á†+æD“@EúZ?Ùâ®Ykå˜l!‰oàJï¸Ï’È•¡ €½2·%:/méži$Ý#T.nFÿ«!¤¹ÞÑñj…çÊZF O «XVˆ1U¡wOزf“6îýt<Ñ絿K( °9A\ zºÕ¨Àu礀>pYAqçK¨ìv³+ÓD’1Ô¦ÃRֽˆj¯$·Ò !(ÂZüå.Î÷Tì&RVÓø¨¡æ×þânYhW†_ù:Ø´òÀg|d`ÿŽÞ”Paã*uÍ=ë÷Žëúä €·Ù>øi§1z³‰Z öÞùa‡o™ÙˆümŽ(ôŸH¦á4à°ÜÄ~Z…v3|1wG"º}€4ÕO¬Ϥ ²Œ<·jJ`±ø >ΨœŠ 8B«=4EbßN™÷ý{{õçÚôxÇ~‡êøµÊã'_Š>ÖÃÑÍœî‹btÚ±ŠÔñU|àlâaµá«?©d*ƒGX—oöh Á»–Ä5:;U v-OÎç(MÀ[ÄÈÔä—ÊN§ë'‹N9/ æég鯶b÷& €ûàÇèÖhyùS¨š_¦ £,ÖxV4Ñ=Ó €Ø8j÷ºÏmK¥;×é0õ‘Ÿ¶îjÁß‚¼ŠP.HòíѨoZtþ.2îù ïUzŸ™ 6rÉxt› Í@ì,]ÜàCeEN½Æ2@)Cz—VRØ’¶àþEæ!fð õ“Íøù¶ ¡hö€Õ¨ƒ'™%µËi§PLjotôc]0šÈM¦Ì­0¢6Le5}(}“Ș¯=[53°J¨?Ãí¹wk/B‡cˆÚV‡¤÷À«þ¤‡kÄÚÁÄîëг©M’·ó®H|?·ÖsÝ‹?KnýY¶¹g‚Oxµ+ɨ‡2<~xÜiþõ•àpú9ò _¥µ.óŸÞ,ÃmeŸÍ+¿®jòÁÝxÖ¦‡oæà°ïÿZ7ÇÈæº¯ß9ÎÏ«¶ë¼¦¡¡/QwY¶!ûLlGž¸†N;5\kk9ý€IOÒf68Uš)*Æž÷]Ãܯ¹{tÌô|MéØÙÎÉKWÖÓ(ò ýñ°éÀnþ9¢&¨þ4½Eà 2Úx»ñgVn1†©5âû ‹´Ù÷ñðŠòx×FûYžŠJ¿Nù¶uLãêüxw,iè¯Y@Îvä[kóÿZšƒ[ö~# 7BQé?÷úµñ|qðß}:Û´µ-Ãzئ‰Ÿm 9Å-Ú—ÞB3¿Ï é™`Sr³0ﺢÓËãŽ@Ÿ‘öÊQu¯¯}ŠÇÔ“2bûÅà+ߢè¼Ï½ÞScÕÑßPz7â,ÁÑLçM{³Ÿ ªžýL4G>œ–®Zëp„k:SÒðL—“}›ë£ ì]u(»-›/“¸6²s’zС# ¤MÒhâ Ú&"M./(3d¨¨m‰Èf˜$Pró–„*[²«<²až¯ê‘·eÂ_µë'ÅÅ ©¤À¨þˆâlj§w5ÕWú9|‡¬Ž¹Õÿu›U!¤IF)üÍ汨(g ©(xM+æˆfÖ…ôìf‚º‰/™cÆp'TDÓC­¿Ý m?3æ,òÍ‚VÁk…`(åë½mØÌé²Êf„%•BeS€à:w@OÉÇSë¤ü²f|æ]Øú qe9™R˜‰.^}‘ }[ãj\ G°¥R(éhÁLyŠ:ÐëÛ aïA¥Z´FÑÑ…+X°h¼”QQónS}Ji^¹CG©ÇÚukœKñ¾×7©ÝNéÔ Vˆ7W ©Tj¤LÊœŒCNi³ÜYG,47ì玻RŠ+C#¯FËöâ©3Y 'åTOìôªêú»ÕƇÁÔÒ1Û¤òj;ó0»¬ö„B7¬/9bO#•˜œ&k½«­[I¥Õ`EÙfì5—ê5EÛÂ?Z…U¤¯«:?Œä=„ µªtË(RXƒmƒÑ²ð˜ ªå~ƒŠ(¤÷Mõ°eó´*húú¢î'ÐŒæ}Ið%Lñrƒü¥ctͱ#>°—¬û5(ìœÐaÙb”šùzØ¥É9ØöÐÓc^ÇYž©û@£—Šb#X•]"=ÑN…¼ž‰6„Hsl;¹[­ÊÕWÅ„…p¤ß¶Èžç C_ì>,f»„=ÇÖô õds”ԓ[ö³®‰s;·>%º}räAü P)Êå¶Â²‰©ó ù0¡†u‹ä½‰5 Ỉ¶cýEçÙ&`DÍL€ 4ê7éЦæâr{KUH–dAÕI ¨F¶KJÞHÊ$Ö>¬‚¾$]Z4¹` ‰qRø ˆ,Ö]ý%Zè£8Ö·“  ÒÈ§í£­Ñ5'>è†Yh ´Y½¦\²I&­K -ˆü¸ºõ“cïD–'Ñèá‹m]u‡=îâbEÞ¼]*Ò!¶kÔq¦i×ð$àüs³ú]}ËN‹@ŠH–rZ›³Ë½Å„kè5>˜³mËbã@î@ÿéšõ˜´´wº<ŒF/ÖGnªàïZ¨W±·šgJæh¤-l™*Þ<€ß S¢óveêÀ*äe:°SrGÚܧã]FM ‡0tå­´ø&>ª²W«S°}š~ô:» Ê|OáîT”§JòÙþr¼§ÛNYfnìèÙðÈço lãÆŠåŠWBC¤tW C‡®º‘* £p¶Çw^J°‚ÔÛÍIʜҖÏ(¸(ìd"Ò¸—•±/•Šn‡pg­vg]º³I‰ãóNŠÑ¡*êë»r¼»Ã¥½òÈ„ü¢^=€þ3ÞÇAÀqGÌ:òa7ÇcŸË;FêÈšÃ]ïzõ€|@¹é8JŽ÷.‹§ûþO3ÚŽ|»“CŸKTÀ„cóyÖpó{ÁîÓÁ!À½k¹ˆãgBɪl»/#®òèZKZe€€B†ièJàŠÛn~Ű jQ¼ÚŸìôšÏà9îxþ…ÇÉ”míÞôÂÝç#¯„{ %zÓ‚ðŠUyÏqÁO=N( Ñp‡¹ïóqpÁ¾~#Ä‘+qÛH¨€”× €”Ø7Wµ ø}ÃÉ][އ… í{,|OÄ’<©ÝÓŽš?ÕíÃÂÁk^8£×Ýfˆ·“¯o¢j¥©ª”(: b#aEn£õ›³Ø%Z¦³ Úg ©i¾ìÌ™Â!ãøªÃáâ­Ž£®ê}ëÎW,£ç•¿£×I–ú?gHÊb£Á¨ÿ­KJP.yp–p"Z½ÿ™:±õñ:0œšðQÿä®ܧо!Ñùž fjKí€ýqgw3ñljä à—ö²3jôšî“¯6"7ÃÏç]©¸£:Ûó†¶s?™nRÕ¸öÂg÷ƒHGzƒqý€ZcÓŸ¬SwóÝ ¬QnWßâ"LóXSf°6[ZFå®·'eÜ—¾ÑŇDOh×lü=‡‚îà.‡p,îè»ðŽx/¦ªa‹ý;o^'ï¼Â/w£ùäøÀØ#¿íŠU}~hæCø–èÕñl?ÉàΈÙ=!Ù{ LãÊcD|ÆÇ“Ú,©æ¼Êö} *Þô‰ûЀó‘ËÙ…²ÀÁ¦[h“ž¤?M+MÎ^ìqíik¿¾¯êŒ–£f}o¯ÏNùÇê]w Ñæ)njvâkð¾²ç'#Ýn Ë~ȶ‡OþĹ» ?.¬mtÁð`ËÜ›(ħD•|üø[cØWmgM¤^µ•ãyÁ¸sÙ$ª_­F¬¹¹ÜßR3Ÿ"iIÖUEÑFÇÌÒr;ƒ-£›dŠ4Ä’¾œÿK ²ùøP³žM}ë×TxåTÇÍî–:¤›ÖPG ŠOÞ×ÈÃ'ToÄtÕ|¯±Â ˜=‡Ê÷Äx³ñû¶Eç›Ù‘Ú2¬H{ý^Tî1–S…}­ØÄ€U·Y$IÊ.Ê‚€ØzFêQ3”U·ng8vflíY^õóÕÛEé½^О â06M¼íf{æ˜HùQÒÇ£’YëìÓqŸHÄPB!QZù ·8ýø„éÖ²»¸g¹Ù`îæ+Û…>œV¡A½…¹ˆ²HD=FñED$ŠÀŒÒ"ý³¶Yºêç˜ó=ç“ësÑT‚;ʉ®îdqBbЮ¾©(‚§)átD›V5d1ð÷Íî³ †C[''+é…éSoo(6*_ˆéd»vYä8y¥Ð”vîSÞ­Z©.¬y1kmÐ=!ÚI—ÙXQ†`lã`‡ûå¹›)’ò Ìó¨†Þ° S  Æ´= KÆKÇ UÄS´ö ,$DݯM”7ZÖé& -áiÔaX9:ÕÚ³Š6e÷:ÐvÔDõñÊ¥‹®T‰±µ&DoP™=­‡üP£}¯‡ŽÞ±Æjs!zxyMyÏ\„:„Ò×!Âë€%êD«ôU9?œš¹2ôaÔpSØ%eúÕ²6°bÑ,&B›ÏÐ •´ØÖF‘¡š(å$Š‹dqš°ñΊš]FlM`Ø€ÞEkocå *\]jD´P&â UñI1V±O8’^Ì J9 ¶¶IÅÔµ—ˆ2¶©[« ÄsTˉ^ÙŽOPj™+U€¸)%Þ$aŽgŠ£Ò*@ä½&Êb% šÏÀz>t 66Oa‘!( J’qkÜ$€ "µˆøÑÇ)X‘¶¨¸˜¿èí]"D`ŸV(a¬u³î_Yxˉ®B€ `w÷r4¢5_»UËœf¨Ce€ûv£¯×RéIåP¬Šnû ¬1åÊ­4yg‘²užxP­Ø ì’íøšñÅkLµb9E „„ á8 £ø¯ÓVhES)b\ÿq;½k^Éb!xU.Üÿ€Ú €µ¶¿âÚ*InOõ„Øâ™ÅÞ~W¾ùØ0ñuc—dmòYé‡pôðldÁw7Š{U¾¾QT÷ê麴9ap$Wë=4*G „û~PÖâѯghm8†½Ü'9Ë4’÷ €"äÙ@+CôµøkËPv_HÍÐt¯@ý±Æ[J?ÙwãI)ÇPn“r®§ÇÖi÷Ù!ÒÿÉ®n.µX3°±:Ì+b­oLtÞ¶–Ùu¡íè«$Cû €*Û5KRsÀ/X(ý_c1à W"ð…Á*“ ¯Œ=ÙÍâçT[nEÕ¼|mrµÉúQµ¨Š®Óªñde`€ú~]s¶Î3Ôj†Ü 'Ñÿ-¿÷—l¤p;ØjåãüõPé¶¨Þ Ó(¸vËí¨ló;Çó y}gÛ~}]/¾ÆóäΣ¶ú†Ñ”‹×ý)êÀK,Gá£$ ðF›Å¿Óàäõª–°’À7ž(¿óŒ"’_Éãú2gP;9æ7|×5|üÒgÂ+"îSI{_•ü[z ¯<ûQŸc÷zÌXô? (ìÐÕâ„UO¹Þ¯M$³¿KŽŠ”}c ÄÇ¡„14_9cKŠ\HúQ8­„¨^˜Œusÿ^b°lìqã甊(YÇÙ˜_(æ·µùé@Œ1nóó­‚`WÓã‹ÂßsÃîÑÙÓct¡°n3'qíï¯ÓI\ÙÌžmÍä€HÔáõÝÓ³Ô²§ÂI«ƒÔ÷>‚%þv-&tGupèZ·9eÝ@:ñŒ6µûy"¦"2¦3hÝbPÀÕ·¹Õ0iÛ6¢zª#Q‹ðÔºP·l¦?ÙU>køôs0~Oΰ©ûÁg1+õ—R2ˆîÈ«›ÚzÖŒªù¤æâý˨¸äy™˜‹¹ƒ“IHµ¬­±Á4rbµÄ3qr{/ "!™m‹ÔÂJöÈP’„²t;@òSç6îëÀ½uj°«MŠ‚¤î´*ó¬ ÛÜrQ2 ÉE d-÷R4‘zÙê a%shtláZYSƒŠ[ZºQØÝ®äS8MI¬„6TèX\3ÍP×/Õ_Ùï£ZH¢—±`2n4“Å;&â>rûT¸[qçü>h¦dßÖlà†)‡z~æƒ\Ùò:Ëæ9W&J/ž‘Žj»ù-®´ßM&C©¦™Þ@k£rzXYIE¡diU…)äfFQrS0º$ÅàÔ2ƒ»ŠûŽ[°*)š yüïq¨Eìâ1ÃTiQ%¢)Á‚ ÅþTÆÙy ±æóÉЈ|×_Ý~ÆFÙ»–úªáy]·H–C ¥¡R2_¥ÎùœÜ"±¸š%P¡ÔBÕƒ`iÈLZ<ª³Ò4ÄtМàÏḋèèCíŸô£0q¨œ)Q{ªP:Ô(ëylûKÕP[âÿ(Ñ}pTú?ªÝfÓb*ûwZÔUG黸èÄô•õdE¤H-cy—×r•D(zÊ1ufîQCt<ÍRwt î4y*Zÿcš·s²§!/~Ë8ÔD²BeGù´3©Á˜a=ª‹'^yâ‘G:îÙ2¤Ñ;¹å„9ÇòÂA%D[ {8©ó7®à€Ó©Ú8qŒð„š[‹´J fÙèâ‰"˜@WL*Ï`'Q+ž©5œ£Uº“Œ°Úæ'Zw·µõÌ/Gr»^·™Š~'bZˆ­Z3¤}ôCr -TŠ•òçA߀œþ‘Éž¢Â¾øK^)sj?ªˆšÊk/oÿÉ0> ˆ"Ž!å¹kœ¤]‹½ŽÖ’«UtʺO)_ÿlá~¯!ëz¨“ÈZÏNÿdÌxr¸H¥¤ ŠeFœOçAØÚÏŒ¢Ú¦…•Ø"8EïXΚs^œ.cgÚgõžΫ¿()¢hªg!ÆRð ”RÐnƒý;·÷E7C2ªÿÝe$YÿS–ÐZ;fÖ×–ª;>¦ƒ}·VѧšÕ÷…î{p> e¡tºa*±PÖ4NÿQM÷ÉAU*\ž4 ¤ô¼i+ßNS<\TqÌ7':ŸïzUÓÆ™Zë‰j2ä”Ð[_Å^WÇ .)Ç(‘jµM ý£ˆF³r4à-–õˆ,“|‘g…UÏîÍ“m´Qbæ\¹pá®»€ Æ[ñiÄFš€;r°vµ-¬G2„ViEÃùdïc6'¶.Å zÑ'K“ÓÎÄ£dÿ­£pfœ3Ç<÷›rùaè…ˆÒ@“>4]Ñ€¦ ŠÉ9Uçš+1ô–/½¨ê›,ÀjÛ[bg.`¼ÍEóõ¿~„þÏÞ8yªÛP"ÝŸ†€: ¥–eeÍ÷Þ l·N¹ùo‚Ðþ jx‘©—ÀÝ;Ã+¼©µ~Nó‰T1ŽeN¥”ÕÑ#Ö_Ϧ!ôçmÈ;f§ÈÝŠÙÑ>{vó¯Ý š ØÐ !,"qYà{ÝYn1QõØÙN`hµýʤDéÊ´".{úZŸGzùõ˜y\•á‹ ÒrŒDEKXìQ6 ‘•Ý7l‡ ÛÜÈFغ>oVpj*°V‚’¾É‹LφîhOÒ˜4¦;ª‡ûC²§é]¶+õ·ÝfµÁÝú?»ÚAžy§Çh=vª”ÎÜì}£tàŒð¿´<*+ ©¸Èý£Làç”C€ƒÉõélÜk#ú6EçÛÑw^Ò\Ýa¥´S+Î?tgÏ_K5•¥Ê>ÙË5ˆ4htS@ÅtÓ3Š»á3JeüC¸É¾8g•Jé°Uƒè~K_Ûgw’°›É¯ÿ‘Â(1æ8¨œš,Œ=^¥ázvVRú¢lo˜¢¨©ôI¥VÎCì9¢> Mýþúþúþúþú’_1Š”r‚ŸóB·Òv Ë~—‚9>\²¥¯k’ß9âß_ß_÷FÿŸùÈ‘7}yب¾¿^—&•Ü;ªöÞNèfX°{ VÞùÖüúWñ›ñ¯þPd‘ß_ÿòoû7¸>‰d/ÿƒù/û3V5ù3¹–ûnQR­½Yí'f˜ŠÕG…qP6û[£00‹cÞ>4Û!…­„› ¾‹œ|}-QdÉ@-­ïÁ÷×ø(×t±Ê!ã–¸}åM:VåYd½ŸTZ>yÒ˜írñJ#+Ÿ¼%‰‘lõ¼þÝ(ŠP™¡€¢…–§ßv&ÉvÒØn…ÄÜ׸øö®m0\Q%†oþ*iP¤ˆb™¼2 QùÅlïó Úçsk9¨Ì‹ n®Fg­ÄoÍŒg%[¡,áȘ»#’N‘TËÀÚv`œ Ùe&B POwûmŠ„lÕLó̪’ŠXòdƒ hTzhuu¨ÚŒ r¸ÒZ™×3p»ˆºb[~Y´üh[ÖÝ[ÓÀÖJ 'Ó5ï¦OoiÔ*Í—m™ÒÑ(ŸÛër³²ùª~éïRZûƒè~ÿ1¶ÝëBþúitÙ)oŠ»—/Ó=èYÞÛ=ËÂvÇÒiËÆ!Ò[ßQ™n4ÛPêQyjžH6(F«ç ž,»Â%{;~ÌŠÀ,Þuð»poTCM¢n¬·K?7”NŒîÂNkoÈT ºDµ42§¦d¶Þé¨ýðè-[ÖªÏ^e¤jVÅ’v÷^}DÈŽG¢¡×$èU«ëHqݤÓ^º}ÞãSKÓzAJ w}FyÀ² c뢉«Þb&'{í8æš7ÑJ³õ©â!-€‘eG¸¼ÀFˆÊ‘•Œ¶íÞC§ŠT¥ ^ïÎYÙZÂwiȪIPBg6ä!‡Ï×ä7ðσ#{ä À§Ñ5.¬› ƒ(z»+ƒ Æó8kpd qx"lošæ$­µ²ÐB}͇º›ëÞA\lÂúäG#ÉnçuТFG U!—ÜžÐfì/ðä–*žÀZšL¬ÜtOÛÿ:átþeE¹ O:cSé{‹P5¡Kô³–Œë™0+$­µ>¯ûÁe;(â*E‰*'/Ä:˜^ÕÌ B+H†§«.o{±‡ÿ×-:ïBZ)…ÕºUj´Œ”«=b{s¦¸?ó¹À¨…A8ð¡±~¶ž“1Ù%mlTØ‹ÚØ©`>&عޫSl?z)f­áCˆƒ ̲í†msåRˉ®É-P†ÅØUé(N*[KoQY> YlÚßdƒuC‰3ãœ4eË'5ÓP’ÅJÁjXÃL$ïD‡¹¬µ›¨-ÛX{[.ÇA0±4qlå%C¡”ùk²¿¦Wm㘤ÿ›tÓÍ Šp“¤2‘+Ž)‹˜×Nå´È3Øe» ·©7t¶éÌ3¶a¢lŒP¨ ¥k¸{ȸwQ‰ð–)ӡ̃Íü¹‹²vØv÷ôÕ¶G/ŸÒWUJaµe V5ÒêOùÄ=’ƒ{!ƒqUÏÝÁ“h-¤N '‰¾Ý‚ãÏ!µ¼ÊŽ¡mK£XU_G4Û U.jlC($<Ñ ëœøÆü|»‹в£1¢¯”f,ü ¥3ÚÐAi‡„“5–_޵\ÔÛñK9¨u 5µÍpò¬Ç‹:½˜¸Š-Üc`/-Z=“¾ÆªWµÌT~¤b¿F:J/´m tO€ÑzÆÉ$Öˆl«­©ç«=À Ÿ¨oÛ«=8? ‘Z-6 &¼”ö÷™}pFÇÕÏ6Ó„4Ë™ÊÔ%w^èÎ’ÊÖÅ ¶£dVÿIé%É.véæJ•Û™e‚£çc[/eÑnyÜ{+7¡SZ?/&È>4ÓƒŠ,A¤¶cÖl ¦ÖWæh Á}îÅ)\˜ŽÂÁ²6Ëðþ5¬¦ÚF“áqñÔµ[­xg0döŸÿñ’Á ‚kN¼¨!5„®K„Xy É`,0.ãDA—7-Ⱥ `Hn ‹IrXøˆ¨A³Bn‰¢Í»‚H€Ö…4Í€ÒAV÷À–"A[g÷~I²‡L¥ôÇÒZEhU±qS8IPjípü¤¨$YH”Û² î½\CYÃfŸwòØr‘ó Ðó6éû1¤ÆK¯^ o{æ©SÌÕvwÇ°Š¨Fù™³š‰±Ö_2¢•ÕdeØŸÀk’Pï,òKw „Ô¤&®“Òš]@ ‡WHÃdbjŠ|›œ¦Gô÷©JŽžâòÀ¾ë!á>:\¹b4,›Ui‰z{%=Ñð¹Jç*ឈì¬áŠþsž–([¡Ù¬+ ,’z£Úx&þ`wGþ¾ ùÕ®¤WÖúŽ~‹p¢ž¿¯»‹ï¸/õ…_Ø­~'Š‹•iΉ™øËÚ,ð–3ò uÌßbâ›Ã}Ù{‘ö|KCõ¼wxÎÍÍï[ë÷£ÿ›Ü–?×Håöä–Ï ÿe?ù}Þì 2U‡©¥ÂÞãA‘(”¿øóß, ?9s^@2Éî@Vï`w[Mâóf>3Ï„Œ‰SŒ2PdÃôr C˜b¼„!¢0FŽapçÅŸþßþÛôçÿÃ?ûƒURjeú‡-„Ië™Ú;( ãðãïÿŠ€ö{Oó‡øi¾MKúøïÿÝ¿Óf!1¼ûÕú’þÕŸüÉR1àZô‰Œrãäˆ+o`½§@ÔºÝø´Ê¼¯?â¿ÍíR€/äî𭌲íþJ.ø/¾ÇÚ—>ÑÒ£OËlvYéÕrœQ[˜¼b?mø d/mÿ£8í %/ts¶ô\ä-x+ek¨zÎÚW˜Žô=sq©åÌÒH·¾z ¯ò,¶5°­A€Y¶ƒ•‡K{ÍBÌ«bQUnGo”ybŒEÃÈR¬•ܹY6Ú®ó+#™§ í¥ÿ ÞÉ®ÁL†D ÁÆõ& ´„Q{‰V3[AùLŒÛ•Ì7…e*²+E›N£ZúŠOlÝ Y!fž¦#º^æß ´Ùú¾WDÖë%uî 1wÉÇìÛ÷üìð¥¾Qzòê|ÍQüÀ={/gabøìÚ·¦ãêÚËÖ¢<„lYLûÀS›•:øœO`×û)ÜZ[êö·#Þ̧®ïÐëÙ5™ÎnpIh…ÙE‰ ³fõ`îí!¨®ÎDÍÝ™^ªÓù|HH4ÀX¯£pJë0\?£˜ð 4¨œmUH ¦³¹/?>æX,ÊKVŠV(¼V"¦Yi†×o‰F«}­»f¥ÐÍ=š_ÕènÏk/횢Û*Xø•É!ÏçËÊ2¬vØÒÕ¡]8Àåi³3í‹æëöÔÐ~5’¬ÚÖ¸ÉÇ2 ·Üð [(Q\¿ú¨n«h¬= DKT¯ÕÃ\m$+¶ª¯çØ"W§|+€&ó¯©R ã[ëzíGÇÒww(Ü Ùvzæˆ${°6G²5KmÝÚÕG'½˜uÌp&«çAçIc”«Ã jj$Âð7“LȇޑÓçïþæoÒŸ{ ÿ²¬«àE%,r<õâ’9Æ!Yí )™ç`ä4Ï"Œ1Æ9ˆ× ˜W]—!Ȫ׳Ʊ7Ì®#¥ÄˆaXþó·öñ«´ÈV,daÂàè_Ç9DÕ•ƈ!ÜžoË{Caÿïÿò¿ÖŸðŸýÁ”Hˆ„qøÕïÿÞ¶™PbXÛÇ‘ñ b3‚f:–ØÐòPçTÙ}Ïc)G^Ô¯ÉtÜWÛe?¤Pg8zÈmÖ¾o+u3ù ÀJ'Ûânëå²ÒZ©6@AGè+ζÇôž<“Œ‘îû :òV”¡.Tn&·zf=Ž~´õäW":o¹3‹ðWͧ،œ·§QQQDódkŽùž:XÔž)ƒf®vZŒÜæw©Y õ5ãf$ ðš‘Èáâ&y²­‡6•ø@@Y¦ØhNEm£ r­@;‰zE°H±³’£ 7€"1f•WP,ã bÅ¿*ÆÙ [iTi¤¦ä¢ŒÇÊ}V?7KŒ_Sv’q–ÅÆg³6²tkh_yiè$©/²­ðsS½V¨àrIüÃ4߬ˆE»¡”Ô5+k#ÚÅÞl…>H\ªˆ³„+²Ö KµµÊá\K"nº’)›d‹k›Gµ”»ºBæÄ;ÕPŒJÖ². ±ü»>ñJ´k·á—U•£­êkm•kEŒ Õš5S´È%ÌÀ‹$Ρ¬…ãÊùäÈvmé¬.¡“µ±^*zÎkg„Ùaq´•ïN˶G¶•]@‰¹))¡º‘ìõÜ/X\W·¶Ä?\iäËæj…¢{+Ú-Ë]ÌÓÐLY+P3‰Ö#ïqõÒ)•ëtOãŽÜÙšêdõ£¯æ ÊU“*ãŠ_š™§E–ÒfÇŠ’óTY²Œkp‚òÆXÊõüKR4BJ¥óQëY…¡Øõ“ðA­ÖZ•µ”¢õ°µYæ¨Ëй—"rÎÃ5ÁR±ãÁÂ*?¢ää£r‡a·°®²v-Ea·’?X¨‚ Næ:¯o–(Ðiëb…l™™U=/¤ü qµw4â9TÌPìÒÏs©&À(Dnj%ÙZy\‘ÅÐaC‘ŠïW@J&f”TQUøÓ¨<§‡I½ëì”Òèž)9é2²¬ Ý@Y` áPÜõñ´[)_W«H‹€R†Æƒv2Æ–ÄÂÊŸ‡´ePUûÑ1&W[߀ÜÁt©*ÝLUe–8…6ÍPˆl¿/ïâXŸBÕå Ïž6pH‘ªˆU´·m E‡4} ÔzÑêžùAÒ.«bu!hE’‘·Ü´,³X=‘µˆ_q‚ H’!ó£3Ê4aƒ:»þíßýÝŠûÿôqžgNqôXþÖ­GI¦1ŸÇÆqfŒ1Œsœ aœçå–£ .‚ÈCˆ«Yq)) €‘qž9 ÂÃ0Dr&G„#“­DFLsœæ¥†a›EžÂÚ…$>ƒ¥â1Q$rš®Ë{/—Qæa¾Ý†yš–oùë?ÿÍ2‚ÿéúŸa¦ëty÷ô«ú{B‘¸a¤¬­”I%ÜbûQ8œ ”û*ÕÕ‹ Tªä™=[«•Ôö„"«çÁZõô¢ÂúpßÙ›*½ªë­k×_ ±ˆúKo‹b«´inÉÓC·”ùœ- T:§dÞfÉRr(R]­kw¿)aê…ÝÍ4lVö,I/µS) Ì̤Xé²R‚=ödEàâ£|}¢ó[­¾XœPg[%Hžß\L;ý!¹rÖ¨‡uH§r±‹P5)?é1ßà‰çÈÔÏ _KôßÒJ÷) õ¥ÁåƒTÚ”Ižs¯*un°;ñ®Ÿ•R$ÿn-*5GDJV¶|s ˜mÏH÷è¸?þ ^xsnÒÙÚ;'øëùþú†__™ ¾ø©É/yX«Rœ402~êÍàH1ïdhÏoiCFÿQÓ0Þø>[Ò>ùø¨©ÄFþ¯“{­¶5¸±Í‘8ð”z¤Æ1cÙWÇeç§2ð»¦XƒÒói÷Þ/^µà¡22bˆU$}è#û"u$Jâ_ë"5|¡XÒÆ÷¾Ü9Ø´zÃqúhé&$c¤².§æçÛmz÷t‘(!Pþíÿðw"òüÓ‡ù:Í·9γÞèŸzÿÃ0„a˜ç¨$Æ8„$L3†0ÎB‰1NÓ|Ç¥oošç9r3ç€áò4ÌqÓbL·§yG†ËÈ8Cœ¦p…Â8‡!Ünó%`¸ŒÅvÌ¿)D2Î1Æ s  Aæ("¶ž„åvÃ0“¢Brš¦a À0ŒÃ0,Ê?Ã0Ä—ßù·ÿÃß­šCã0^ÆáiüÏÿÍ¿I³Ÿqô˜z—¾AÔß_~_ŸºŒ¢^Šç[+ŠÙ 8:•¸jæ4¼ÆaxwCîÜ…#ø„ûù#uB£üÉ•úûëq¢óø¦Ô¹”<ÚBeàCºÎ¥‰ ù¡Œ€çƒÿ5XUñ$7¸¬BÀrHÌÐnëªÖæµñŸV0È|©­¬YfÙ[i±B¼D¯}6†j¯²šÉÆ+„DÖ€W€UŽÛÚ°Â?ª©Àç«<•5ƒÔÁãrÏ|'s@'¦x¢'öi»`Ò”¯jùÖ²º$ôvôÆ•³™ÑóŽ qïø‹Íµ ½“Ð ‡€¯èôú<;æï‰¼J|ŽÁ„wƒmèƒÊe“…riÕ˜à‘‡‰‚!{wGŸÆD ýN£@ñ[ü„ŸÅ¡‡Ê}þTtÆTÕÍhÙUå<¡@m™[vÊOJ9 •iÞ£Vo+§ëîÍ©ÕTvƒ¦dw‘кeØÐ- ´ïNti›ÓY| ÕÂSëe{8¦»ŠõAzºë$7…R1è o·½k>®^cNÕ7ÔÏüh&“ïøzôšû€’³Ãþª-{ž /¾[€ 4yXÓÈÑ© =‰]À‘À]Š¥GTA5fs¼F³¼»«V‚“÷À(gñŽf Çð(WàÕ ‡oShHß©ª·‰¨Â5š…m{²Ø€±1'Ï­ ©¿ûœ^É’E6"¹aT-Ò"”;Žÿ$ÂH2Fß"ró,åõz»Ý¦qÿþïÿ}€ÈÇŸ>Äë4ݦ8ÍÁ0„´ Ð@"! #EÀ8Ž—8OÕ¹ 1.Çö,€§Ëe޼MñrÆe\/Z./1J@ŒBF Œc›ÑÉakV½=Oaƒ„(ã,2a|w ó< A\ƒ`xºÌä0Íá8”.‹€Ñ4ÇåDçyG™çY ŒqyB!@BÀ9^†)Ad‡ÅuÓ8 ƒa —ƒÄÇqˆs !,ÐÉt›Hη)Nóp›þ?ÿÕÆa†?ù/þH:–»;%ü‰©ú#ÑŒåMÎÓ¬ë/!—ml»†àfõÙzˆ¹·ÃkL?wt‰ˆU Jo§­¹+dBÁÙšW”§[Š:òˆ¹®×¤rEËø£{¶”â÷Úú_“3éxê¦Q¢óî;}x²=¸|ÀùyÂ<:+°e¡Õm”z¾Å?üd[°LýlÝ} D ñ3E#™–e­ìµV)&wþòð3ÿL™AÞΫIAdGqPiÿﬤ_7²3'ªëÙ ¨? SR'uU€¾ }t™¥¸ŽY²Z3J ±Ilè•¥g´0‰´ûÕÖ™E;µgé)’KÃÑOAñP+m_3×(À‹uÙ ‘ÄÞ,6r>AQ È¡á¦Ú꺎4E±| Yý³’«¶Z¼¥õf%& Ũ§´•ˆ'èIÖ°˜†,ý5mûª¹ év(Õæ‰b+üЛ÷ZÔbQ½©Ã—öaØ‘GMž#VN¨¼#çþ-öÒü‚ê— ¹ÿFžÌèëש¾HשּׁR³LOK¢x¤šÉÍZ]À™ah\¢6†É(öxì=»%0kˆ®†ëò«šíÊä_SG霿Âmg d=­—§vÁJmf…«ÞRh°ü3ª@²º¸mà̵¤V{³`±¾B­äQol®TIc“Pêä민"ŪˆI„héO¡Ô‚hê(D¥ƒ´ö&°óοTröÓLOç3O¬lq§ðå|è´]’adÚ3Qªà‘‚ÊRŸ Ó·sa;™kñw3ORx Êä 01¸Vb”526-zG3µ(x*ªÌ¡wI®âs <·m™~3㺛³€ª1y…™îK~ùÇÐö é¥zFj•…ú®ÎJ€BäÅ«…A<׳BªeSCÛE½µÙÀ.¢dâ[¨ª”S˜æ p€ƒ=TÖ2¯-5 FÛ–‘ë}¾(\£ð¤1“b´·©W[iqQ:h-Â=[¯ò¬> õ%m¶?ûm:x¢ê8ƒÉ4²F™UOÓ.‘tbÝÄd­)RÖ.rϬjBœ¦i¼ 1Æÿßÿò¿ˆÈOÿˆÿøó c¼½ÜdŽ‘Èår/ã0 †°^JXAÿ»!„ÀƒãDAXzðÈ@ˆCˆÄmšÆaÃp!§¯·1R ÁÆ0DŠÄY×iÂ,ãÓ¸„È!Î1^oò4C! ã(@œnóm† ‘q–ÈŘ2ÈåýÓ.C¤ˆÈpá4s©kˆH qmùÃÓeÉã%1F‰žž$Îó<‡a¸^¯ÃD%aÀ0àv‡ažãª9Ca¸Žã8Žã*ÆB”¸HïBœ£@†xAó<Çi&9Oó<ÍÂ8üÿïÿ  „0 ò_üQïº‹Š *d=h8 Hj-"7aäbŠÖÒ:màÝxwG«±ï(VºøÛ®Æ:Ÿ3êïÛ.PtX¸&!®°þñúîÉ(n©TY2T­†E«ƒ²þÒ¬ W ²lûj-Ì2êuþÓújJ}= Öì°µ'¼¬FTüÈGjX/… (cdÕEçÔ´à€’¬Ïô_”è<ì4 …¹Õl¤gju° ã‡nuûŽ€óÁ ”2Ê(Û[†»˳¡’‡Ó…ÈŽŸRI*½Ùj/[d¿·‹­ò ÅÅç_Uƒ«›õج:ît÷¬Iþî¬RÊxlD*Äb½$ÑøvƒÅWß :`]cƒmn%:QRVØÁѨ|{½=p’Ž“ €ºôV1`ûÎ…B¼Ü؈>µLtçb(÷nZÁš¥ŒµÊ|ì˜Ãbhl#Ò‡¶?”Mwa‹p[MSà ààežë9Ç+·ž& Â\ûµ„Ç ØåZ~Ø òàƒð‹ô€/à–Ù±8xí®¡7¿ÂÕÌùÝä¥Ú<ôŽÇÝè;7À¦Ê‘FF&¥»?QbŒÿïþ}$ožãLÆùú|W'[†! €Ãe.CÆá2 CX+0kã2.A‹Á¢u³ß)q‰s!gJLÓ,‘‘|ÿt‰sŒ‘2„eÁ† 1ŠˆÌ‘!„„€a.ã8Ïóø4ŠHŒœ‡! cœf\„@€„qœo‘„\.#n×9@D†0àr "Sä%„qÈÇÊ0 [w!!QDDæi@Æ!2`Â8LŒ!„aæy&0^†#ÃeD"% !Ä€yž~|zZ4˜Æqø‘Œ·iÆqž¦8Ïã»K‡0ÏqšWoáÈDXfä0ÿÝûÿüá÷•žù¿øÃ?’T@‚.šo˜^£U˜t\®_íñqÛα :c5^£ÿg7ùT\¨­wS $ƈ­&áôȹÁЉ4-û‚vÏØæã©™ ¸CûÿM­¹Ê‡Oº0¾IÑy^øŒ‰7ï»þ^™ås!fë~üŠ jÓ3VõÅC+4±y¥g#éJ×ЙBµB>ÊòŠ"£#”Ó’”«fY Rê`¾“f~TÃy¤Pb$£áбJâM‡$\cÓDCO\|sE›ÃÚ–½äص¡Û«»ŸIß…~»^˜}$ G7 “¬çJ{+Ö¾(ì½ù÷-¯wîžçį٪á³Dz_E¬:µÁ‡~ì'ö†Æ÷ßç+b†7^B89Ο¢h~íå-¹‹EQÄé»á>`"ܧú°ö¢µÄ­”‘Vv¬äkxfþž“Z83>PÌ,î‹wy¬—Éx}sq»cš^›ŸxJ{7R ½áèÏ ?òL†îâ/ÞZõ ~;àž8½¹Ï“Ç–p|‡|ÃÝo¯À·Þ†S7¸»£ËǪ³‘¾ðÑ®÷ñgqp¯+x'çW±ËîèT©ö§ê³²%êšu°‘Ú4 ¯sHo^ëµuÛ¦ýúwÿŽ"‘rûéÃí:ÍÓDæ9‚ —A£Hxº2ŒãåÝ8 C†Eᇜã$/þ´ËÖ¼¨Å9"N! $Ã*‰/AdŠQÂ02Æ)Bx ÃËmšnÓ|fÊøî Ó¼Z?].·išn×¥y~ƒˆÈôrÆ! ãÀâ4O×ÛpdšçE-ÿ6ß_f¾Ä8ÍÃSÀí:ßp Àûa!‹Kp`¦aˆ‰B9Œã0 2OËÖ;ŽÉHˆä­eÕÁ®å+˜Tø7Coš.Ñð’´­µÕvŠêsYc {Ô©Î'=¹~‹d1î$ǽü_š¨õ+šk\Îó½ O߆蠦EÉÉó¬Üí`ñÅö¸QoÅöLów4 û¿ê`wx‹z}puµâžÇ¿;‹ÎQì‘«geŒÝÙ‘úq Wµgê±»69×™§ÅcywÅøõÔ·ÂêúÈqïd?S‰ç½·ôÀ•sÃÓòíyè ’²ãTGÞ;&´Pººp­*é"d_¥B«ñzþۓó‹(ù šÇ_$yì;š­î9„f¬}D:…wµÕì\¡ŽÝ B%¢Ú¸³©«}kÀµã&ŸèîÙ8£Î…F´Z§-Ü™=¹.tßyXN¦òaµé*4ÆÖ¥à»aHîÇÙë’F(o‰U_´ìQ"qbýñÔ#­:Xjcà218qú” ãøXÀÑ5rGãä‘ÒUê}˜4‹Ãöý€t­GöÖZÁ:šÍ/<ÀBkYD÷ì±ou‚<2¹}Cô%ôóżÞôˆã«bŽ#±ñ×0 ¿‡ý@»ûI¡\•V¥sjë¯ùþ_xð6‹/k?>Ój])Ýf„voI€G+.YÞꓟ¬–V¿ÜØÆ€ €—Bß•àߤK8;aަÁx®Ï°Lä¼›Ý'ž·äyâsnF‡/Xרø©'ÓÆ®GÞÊ< ²>æÒa·í®ëIq1`Þ*<¬zÿ¡¤hAùwû7²ˆõ‹Päåw¦ëmºN ¾L!‚Oïž.—K”Æ1òéér¹Œó—ÆñKHaœtŒÀ(‘ˆ‘@`%ˆÄ8¿¼@Æ1† IÎñzpÃ0LQž¯7!ÆxÃÓx{yž¯·ñéÆ0‘ "‰â-¾p r½Î‡Â<_G˜oãe9^ú™¼»ˆ\F‰ çÛíÇžâûq¢ÌÓM€iæå OŒ·q|™cÞ‰HŒ"†8Ì·HˆDÓme²Í³ aX˜8äÂLŒ‹Ü/b\Ââ¯;OÓí6½{ÿ~‡aV^®/Œ1 93Æ™†0Æ "—‘‘X™»Ë3Ž CD³`S o·y ããÄã|‡wã¿÷ãòL~ûç¾üáÿõ¿^ ¶Öv2æòYYšV ÝD þVcÑû‘¸æ~ÓúÈ¢Òÿ• jnüWmâG¶æÆm¿â:ú_BÂõ­ŠÎaß›¬ÆÄ‡èò‹©ÍYUF˜¦ÝªÁ’é˜pfsõó  À²2BÀ±½%G~E«S]á³Ró‰ÔœþŸVìõ­A4µÖ•(K°)ku¸u´²Óä^gÄ#ŒX€YufÉ‹rD¢ä™R)aõH0÷Ç‘,•-6€å-fý)¶2癤¬èÿ:GÒTX™"Ë=p±ZÞë,,wfܵ 1Ú8ëÙšìbœaE«Ó±_oÑ®-€HÔïB%@Zý Å$‚ÒÎ2oD)„íÓiô˜ô/æ`I—L3 CñJOªD,'$´6…ÈF ¹Õ Iž¨ëKŸXZ’¥NÔo¤¥ÎBÁÊ[pâ)'«EX°¿ ŽPiûä…Ôk.ÏÇgý•Z‡´Ø04i”›µ=Ka°4 å ï6!¹HI1(ùù×jhÚ*ÒÙæÊÏì&«GÕ«‰ó»Fo”hSS¨ê(õè£å¨Ò¬Ñ¨¡ò&LYübI©P¬dP1bM0yp"ù•n$™9én“–‰x\õ½ý×6q/`h*U(½ÿ¡}†–N†'ð\CMnÁ¶­îÅF ËFc­$çÎ}šã]Ëç7VÑUÁØ"Q‰ªZ ™£%‹l÷A«™‡Jˆ¡¥ŸLxÏÊK{L|Ùâº$×âb´á1=€šcZ¾ Îúeµú¶£´x¼¦“a €Û0o¢êI«iÈ©ý¿µ·M@¶€\í(½-J‰IÏ™Ü" )÷ dYr§]uÛ)}Š™èxW3k£­Â•«Vtë~5qK^¢õ’ΖȚk€z*Vês•Oïo†´K­¾?\otúú{_Å]‡îvVeßH&µaVëŒ(']túÒÇoKŒ‰[ɪ¢Xû»pJKržV꺷¶<“šÝî¤]΀"]ËC¬•®ÅÄÜ}@÷Ãê:ìîÆ4Ó›³¢ÈqLpT(•ÁÄÙ»€Ö1Ìé²Rm(k> áįéæçD$1ȬΠU6Wsÿoÿú·ã8NÓ$"·/1Fpž§ëmžcœÂe€ à !„q¼¼¿,˜ûåé`Žs¤Œ— «*=cŒ\* $DC F™#o×ø2ÏóÞ¿‹â|||ÿþÇð|}þ‡ßIøÆ!H 1Ì‚8Ç—Ÿ&¹`xz BÞ®ã0ˆäÓ†k¼=¿ Cx7!pšqûøòqæ¿zº„ø4_ù2]~õþ]ˆÓ,ãeˆa$ez¹Î·ëøþ=dÀ€!aœçy@bšGJŒq¾ECñznSòà} â4E,ˆ9ÎÓ‚ãí6Œ#oq^‡a—ë- C’B¸NÓÂé"`dÇa~†y8“áÈ8ÅÛmâm¾^g¼„ù:ïÆw¿þ1MÖ¿øÓ?‘?ú×ÿZ RAF-l¹F*Èg%¨âÞ£)µ.l#½ÓÛ 7Ýck­>";o©+…)ZFC¡¿ÚBóÇ6ó´îaEQúG:‹õêíÉnÅÖÜ‘²çÁéÔ ¥9iÔñ§ÏÔ(&ÀÂN´êæéiPZÅúÔÁ›¶»ŒîX¬]¿¦tiÏc êÚ"1Ù;x¾iÑyxÓ¯H0Ë^i£×Š}†HqñU À »MnÉúË´ŽOR4âqêß^¢{¨BX)ºè‚Š"Y7¸ëÑQ}l$Ýûvà´o÷=@‚ã=ù"GÖcMÁì@ «kG‘7¤§‡9¨K+‹é6ŸÉÈ8Kœ“šMàKAPfÛ*7¯Ó¸ô¤ õÌQµ°³]ulÖ‚û†…UQ(ö·K hÖ‹bAC²Å8tæÑ(Žû(ã9Ù¡– σ§½z8ü­gŸ`Í«k)QeFüŽ¢Ð)zø øÃ|®cÀàn?õ¯³U88phÈ×<ìUÈú}Šò¼WÏ8éTÔ–`žATK°A²9ƒ•;»XŒC¥¢=¯q¸{µÚ^µ7îÔf¤V!²•_ÍäØ8ºŸÑØâ¢ñðð€U§ÝÕ°y¢uë@uRðV§' žë* Ì¢‚¡±b#Ñç ª*v¤;ûŠzXÆ—*·êç‰ÇÔåCúéóÞZ£±8ÑÕ"Sö§&«’OO^hwÖƒš:Ÿ¯ÿmÊM Tëg€‡‰Ûéäk¦ÐÁ„÷l Ê¢5@kÙ¦vàÚAO³® 1ŠuÔ; «@ÙÇg­Ö3û^6[lVv劓Àí‘®ÅpÏÍô%z¦3ÎÕî]Ο Üýy¥ü|"ÊJ%‚&««z ¼Ï¡Ú^²xd{Òa\à~AéŒCg5OÕ±ëdà×Á"S %ݬƒ±,Ìh† YŸ/Ÿ\XžTÔûe¶ÇËZÏø»¿þk ²<ÿôaz¹qfŒq½Ž„K†áò4b ã0Å(2 c`ÇË0 ·é*"Ã9Ïó0Fr’ÓDHyº\dºÅiŽÓM®?¾LÏsŒq ažï.7áô»áÆaQô‰˜¯/_Âåòö»Ÿã<Ç[¼N·wïß¿» />Þ^n|¾þzŽ/_âüyúÝOaç—þÉO?<…iâ8\§y~™ã»Ë ãHÊ|›1Ëôñ#nóÓ ¼\†aßM/²\íõ6†?L×ç‰a·ëÆ„ ¦/óËuC¼IÀÃe˜'Ä8s–ñr ˜ù|“a æ‰Ãnq¾½à:ï.Óm¾Íq|ºLÓM‚ŒãEÉ€§§Ëp½]0=?`ÆB˜!BÞæxC|¹ !ó0 –iÂ0Ä2ˆÄiqžã4Í·/ómº>ß.ï/ïUà7ú§ü¯ÿµ‰ƒ"7f-ªêbœËî>³y(¬• ]<®1þP»vÊj;¾è-Ñ®Xõ³uIuÜȽ Ï;treðÐÀí²M‹úE1N@^\Ž”þtur_ W†ÞúWÍA­IaÕ]Ùâ·-:/µi!¼óÒ4¶Scy´åó& ýOL.ëÁNdÈ+NåGÀ†{lµÃ¤ g`—qÝ¥—ý¨ð á®™°‚²#‡Ž²d\ôrÎîó;êß*Ãr”bÿ¨ˆµç>rÑü‰Ñòò´õÇŠîwÛ¾¸­ädÒH´·{ùڦݭGþîpùé_4÷A$±ïª7ß_ßÔë"¥ó–§·¼A8ò Ê{êL8­¹/÷}E~¼6HMör}£ƒ¸~=j­ñç#HÆ4Ý _Ìbš÷»þ?ߥVv¬…ùFúK~Þ ý~Öþ¢ûÐÄûÌr–è ™Œ¶Õ^—$(P·ºJZ±4ñ7¿ýmƈDpýùÃ<Oó»§Þ]€AžçùùåúòòÄ_äãM~÷ñežŸÆÇw™çÿó|šgü“ç7þðž¿{¾=?_~|7ÿþÃïæ[ cGùù?~ÓÞ]1OÓ‡—ÿáç!NáçáWï¯2 džæðñúî‡À/·—[/üðÌ—Ûü4ÎÏ3…Ï×[a|æ— òax7Æ—› óLN×ÛðîégÆy\&0òã<Ç3n“Ls$åW¿¾@Âür•ézæù6ažFÆyŽó,dŒÓ<ÇM!SŒã‰Ø1ÊmŽ?<]Æ€Û4b 2 ! „Ûm s¼„™‘×ëM®·8M·×ñi†áé×?@äÏþôOÓDùçôGTvÙ@&<Öå‹ß fpíZ"búx|ÕéÂ÷óL~Ù¢óÛB1­é&L7'<›(Õ©«Ø^<ðÖûо’#»À‰Â1ý2l›< |mZ3rƒ»6Ä6I˜:´Ç´yLæ½ëGZk°)Aæò ‹¥ ÝdékRXë –Z›øSo´ªAln=‰œ#¹Šþ«AäwS$l=ÙØÔ–d¹Þ !Š ùÚ¬F_H9Õ¡˜+z‚*·§ò·U™^Xq2?JVcc£«c‘È¥òAfsç5Ƽ:™ˆOLN& U³aQVò ß•Û3¬zþ‘%Z«/dž å‚bÞ'u@}5Ša]Y+¤ÁC¦È5»;)D]«‚¯ª¢õR\ãÕ„"¾›¬ó$q æ©›ÿÙ=)®ºY*Õéèþ{¿¸|Gè¨|³ÁÊO˜ÕSÉ T‚6‹.Rõ8Ù¥ýtD -ÔÑ›ÚqR×"j?ö& \O°¶Ø’2xU¿¼±ò<¦-ë©›Ù6xIÿz:äÀ<÷¿È´ëîlTM”Þ§šNæ[$ñ"7ü¦ù§Oëâ ÷¹,VÉa½·7 ŸÚ©9 ä-]ÕIÒe¥Þ­]‹šæì4 ë)¤;^½(Îó/ʤµ‰Iéü›¥wÊ1Ü- ͨ¬˜ýœê¹ë€9«ÜÔÂG‰¥Š¬eSžip„žÍÒ¯üÔœ‹i™OlÒép.X)(Ó ÒO¼U’€:È…ß.V<½¢‡qË5˜¢M¾ãr„ÌñrxU¯¿ýíoÝðü»ó<3.ÎwÓ2¼à0^ÂÈ0ŒC㸔BÃÌ™3Ç! €q^Ûè¦g^.Aæi–yŠ!È$·Û5ÈL ‰çÛóOC|¹N³`Ž0I@ œ¯)·nÓ8@nóuÁ[Ça|?Þž§ùÃGH˜æ8D>…ðôþ"œGÁÇÛ4ŽÃôáï.ÃO !„ˈÈx›ñn%¾üÃË,a¾Üx‹1Jøá/ˆq˜ùùy¾Žñ2¿Ç«„çŸ_ž‰iB”ñv»þãËpåÝ‘ñ)—aº^“j”(säÏSüðA‚¼ûáÃ_½›cä‡I®Wyù¿›_¦8ÏF¼{z÷O ˆÓ,$£Äk¼Þ~â‡adˆžpæx?`¦<_cä<¿Ä[d¸‰‘ë™7 ò„!õ"„1È‚nÈ%<].ÃÓ4]ç8Mœf™¦83Nóõ:]nS†—çë8ÂÓ¯ß!@ä¯óùƒõ/M|½A:)†‚I˜Q& žm^ps°ÂeµdÜžý¸³M¥eG–9T‹Š´ûÉýc«Ú"r 9Ý9”bdŽ®]ZSB “õ†ì(-m'³JSÞ„IÙ· VõE-/ ¨JÜNkr´ðYïD×…3àØ0¹-L4Î*Ðà:‚Ò ±u–—UyE~!¢óÒBÉs¨»æå•§ñú…°-T9,X–è2€ú?ÜòÀnu5bÉ´1G¿rÐÉÏ;ÐLÑ£/©˜Vû‹[̸u®/ñ´§1°üÕ¨° W%äÉí`o´˜TÁÈIagme®7ûؤ+ Niúú*œÇð\Hˆy¡½2rŽŒ³Hêý(ä±eðýÝpÅÇ™6†õ o”à*¨äÀ>ÔºßÜèï,ƳçŒ^-ÔS{G«jƒcÛJìC%|cŽìÜwmOÁâÈj“y­ 6¦pC6¥y÷<æàŽÞtÔ,þ`5X€K6[éíK¹a-ŠWK¸˜`n1º~Ci.ýãÅ…)H4ˆë“WÖt ‹ Í4–n´I;gD­3/Š)LîL$œ,–½úÕvOÓ-%ÍÝû_Š‹ßy¡`§ÂÖ*—>¤QªEÍ®«#Y$%ÆÕKÚ@ð¤Ö’çDY`S·×ªîíb ú¿bŒ!„ú׿©&zÏH`¿õ‰™M\Ôù]æ”^I?ãèN0zð|'òÑ®U)1jH3ø²øb‘Î28Àù¶¸Ø¡@½1’vÅnÚ;G´8bß­éÝYbg*Ú©ÝÙA(„¦Í¢Y‘±ÅUH7;÷.MBXpÿ€ý·Hdm¹’ßþÅ_´.éùwy{¾^oSa aŽ|zž.#çñÝS‚ø/×úqœ§Ée™Â(‚ižcœdºNb Jœ¦)rþÇŸÃO1!€· œ!!„1ó5NÏ·ÛuÂ9Çaž x)a ¼NÓËÓñ¦iŽžDçùåv[|„£DΘæ)Æ äóU€ççç(ˆ!üø.¾LO¿ÿ+"Œ¿zÞ¿“ynsŒˆor›…—ëmšåéé9‹\_æiº ×9Œ#§q¸Ý¢¼‡a “H|ž†Kàx .ŸFÈ-ò÷ÄóËËLjL·+¯‘·Ûðã»á‡wL7™g‰?ß¼Îñv‰ó,ÃÓðþŸüd&0<ˆÓõÃs¼Î"׉?¼Ãe”)"Î?<=×™sœ‚aH;<âçCD *, 0 —(CˆÃ„1ÌSŒsŒó$‘‘Ó|“ Â^^®?¼z¿ÿí_þUš9ð/ÿQ–êWïWÙ/\¸ 5 O’øø6ÞG{='¤#§uF5ëDŸ;Ec’-ÏåH%gRû¡ j 8„b£ˆ ‹ö“M¿éÈ&ôZý%6ÍÞKM¬nAVóÑg:b!¯iCçAßÀo^t^|V½è±5`¦V}ºO¤„, lD×[1Ò‚ë.ðM¼PöC-ÿídÛ`›CBÂé¢(Ü“+§ÝËýåìys ³èÕY²ùPv°¡"¨£ÄHF2‚‘Ø †êQm 5/Â’ÉA¹ë{l±H/pWûEªY¾ïÌ9) þýõýõýõýu0ûÅÜê™øŽ£çŸ»yÄðßO™û_‘19»ÙÀ÷±9ˆzJtþîoyíXù2ª‹ûÁשû *ËWnl¥B¦›.Â4ý€Œd`HÉOÜìoÙî%ÊÏÕK¬n–;v4|ÑÍú6Uä Lx• Ÿ Ffý’+çUDuwUvŽÍu‘.^ûkü¡"¡òLÎ2<‰ˆ”5°Š©°€Ø¾¦›º ’ªÔKikÓ“Ig]þ„õXê¬ð¤Z¶QH„ª nŠm¼wW^?*W4<æޝ‹:Fz0Èl§m6Elv}´d[ë]‡°·ˆý±R›­ôàhCø7j££‚‚c‹Q|šÇ›ž#ð5ƒªGÞî{¼ÿÜRCêà…¥5Ð2[!¶Ëæx·°pý¡|€d1-ç¢ì³rêÐmÁ›JÎÈïXŠ”ˆÛ× Ç`Q{c¢ÜÙÚ{hõêå­ÄÎ×–V+†ÀTý…Åý)DÙ/$º¨‹êg%‰ß "ã(†¸ù÷Æ(Œ1`˜£,Ûô»÷—8SÂ8ÆyŽ· ¤DŽãí†H’·ëÄ)âz»>_‡q~ø½H÷7¹ä_üñ§ØW´æ 5)Jq€Qñ¤JeD&Ñb¸jËÈ–kBz½)ͽÁk¤®ÿFÓ›jù^>4DD¢HH­âí=›…‹‘ ‹u_Tº;̉j˜º½cÅ£yUˆIr,ü!Cw£T¥6÷ºL©†$‘¢;Н_tþ¸s!ÒG—z¬êÔ3{¡—Õú6)Ôe¹Ù„M¦€“¦%«p“É·|öº‡Žh'p6ës(YÌt“KèR^m¶šT»¦‡b·àAYCå³b§ôúv ½Ÿ{3ñ˜J”‰u®ã˜ClwºaÁ+Ml@»X^ Kca"cZ~_Š(1&=2%o¬ ;‡›Ä¬ Y1%x>„[O#š #c“ Zz_G‹EZ¦éÉ€;=]µ‹ä¼BcØD#}û`aM3}„ЄmÑsÑû\zœ ¤ßdîŸjÚ™ xZ©›·EOކ•Q3w÷óú€/#}ˆÔcÑ¥}ñ@0Ð)Ÿ9¸yÐ… „ðIÚ6“'-¤c=®µäé+5ë´ãËuªÓ\ºuƤø^W“±(7Nx JÕ0 %Q†b»‘ºhÖ)mí#ø:RÀ"ô^ú|P®¬ë‡N£Èb¥}Š…â¶ýxØ eèCnmþfǃ‚’‚‡š×ÓTAyTåzY¤@ûáªÕÁ©"Õ~OnÒMR#@Qê$é6ÙAs:º¨€ÄHÅöÆ^iVfyc=‹pMMg€Û"{6ôü{k64[ /ÖÕ¥ãÞ2öfC(NŸƒNåéß%w–™œYÜÆ¡Ô:0õÚÏU{=í]WW×*Î릈²²Œ¦ýŸº&b-:2ùCêÀ€xÌcrœö¿ÄÞJh”‡— Qõm¯‹vAº®Ãˆ¡×¯l1 ä 8õEÁ6(vŠI ¨Ø4¾Ž;j?Ó¼8sÒ­¬Ð·M¦s2˜Ü¹òÀÚqˆG Q¶ÅJ™k0 {™ÕÙ™N0`ˆ©ý@jr¹VÀSŸ/â°ÜƒÇè©Qƒe*7nF3ÚMÌÑh–J( ±ÛìÊå3KÌÒQO©=í©Ä–s¸Ä“* ˜fjRô¶'Z L‰„o2"òþçÃ0F®‡k*¼üôqºÞæÛç9 ¬9 \Æ!ãxyº$ †Ë»0CŒaŽÃ%ܦ†°È̓H@‘ÀçÛüÓË@Þ?Â0Ë<}˜g"Þ^ž‡ç—ùùy¾1ÎK«ÿm@$€yŠÓÇ«ÜbC A~õþçÿòÿ"1\~ýëé"2·xýŸÿþÝ?ù•·ÏןŸåÂiGŽ!Î÷›çŸ_d¼¾È0ŒÃ8†ef”9 —A†¹ý‡ÿ!^¯q¦Ì12bàåÇwÃðÄm~žÉaž†A@‰—wüñ×2 ÃÇŸæ—ù†(ó‰é6aüa|ÿ4ÊãËø'ÿ',ÈÀûwCàüÓ3Éù:Çé&Œãô4<]0OÏÏó²SL׉Œ×ç—8óý»—aoÓŒ1LÏ·÷¿Â—ùv{™'^g\†c1Åáýé#"ÇËFâz{¹NןŸÃ%`ÇÁ0Åù:ñz›øë1‚æ9bns O—!C@r˜æ(óxIÆ9H1RG×q¾Ýâ4“‘”8ÍÓEnaÓõv¹ŒÃ0¼ûõiÚþöÏÿ|)˜r£’ð½ØÖ$I˜†ró³À«µ;êíî›*àQê.¸ª»%o’né½Þ–3ºfUʽœZa²¶G²ï¨«¦“¤*kZ,êœÅuº3Ê6`îå1€þг°}l”b0n­»[ê8&z—f²TÖ@êb8)À`ÁSŒß©1|“¢óMíºtw«˜q¢K=na ™Ó)Ö@6udÝË¢qy>¼çƒ¬‘±‡0•ˆlû“yr_õhlæ¹¾jÔ(k,¼'ô놌µáeAðDž±×½kÂ9¨ëRB“™ÅÏýoïSR{¿± µrs.@±×Ô0Q;-Ëë˜Z<®÷üå¼xøÒ_=³¿Þ¾³µ?÷ ý‚¦Â›~Q#ú•lßÙÚ&`à=€×ùT©Ó;¸`ó—÷’¿™Bým`÷<ï¡;ëãîçËÜçñª»jY´ä€\À›D¢Ÿôèæ«?ç(à-æÓ)ɗ͝rŸ¯EÉNídI·,amõ†Å¨Ù¾?â’® iù›ß ð|t†c|ü‡ŸoÏ×8Í«KGˆ¸¼»HÀxÃ0r†qnó|0½¿Œc€üô"e øø2¼¿¯Ó8„ çør»ãÆq„2MŒÆqœ§)þü<>Ocdá0ÍÏñãm\úâb˜I^.ÿûÿzºÞ8> ?þðÃòO¯ÿð»ùöaˆ/S ÊËK¼~ýc¼}”Û3$ÎÂøC˜úxûø"⻋¼H Á™39<ÍÓGàJ’x’ ñç#Ç 8óÄÈxE ¸F\FÆëLÁ?Ó$s†ćó5Æ òÃ{~ü0ýî9â6ÇøÓÿõÿÂeüñéòëÇ_ý^#ýÃ8„€Àiž)òt‘a Oc\åº ·p¼>O/Ï×ù§ùúá™aß_ÆAn>†ùiøñÎÓíeÂóõúñöôn§Ë€p¹È8ðz½ÆâmþùwÞ¿¿¼ÿ43@0M1.!`žã‡§1’$@n1†aE"%0bZ܆ 3DD¦È†A†Yd¸!R¢Ló$‘Bršç9ò:…a˜^nƒ®¤2€d5/j…d¿´æÓ†½¨\Î6¿!¹,Ô5Ÿ}Ç4¾òüoGtþ\ÔœmÈ|PÉ€ÞÇ{ÞQo4÷û<òqìcã©:JÊ—RÏ‚2åUœ–­÷?×{ŒIÍvV]&Ç­V› MºïZ&LRSŒ E°}Ûµ­¥+G̓‡mÍ.Ý dëöR¶Mº©X×q·ë,2RakÉC*¦ª/Ì_P€3r<æƒüFõÍ-Íi¹^Ÿ¤ÓdˆÃ þž`z™Ë&Ä®>MÏsëøÅUÕ¤¢½ÚùºóƵ~Ï)ì‡oK÷PÒÌ'|’Ã’ŸzpªÖW¼:|ÒÈFk1 q™`WлXÚ„Î]+ÝÏ+bÅžŒmj=87<=û#·&Ü9<=6Χ]ä^“í1é*˜ÞG>É¢žÀ›}ÉÎyˆ‡l1\êMºì5–O±3!ÕÞGÓ%KKü*n´AG8·±›ûÈ#”^Á5É-ÄIÆæÌŠ5›©³õe)v¸æœ€ *³aÞ3«ìÓW4ᚆ¯ˆU#³òI_†ìîIö±ã¢c VøE´´ŽKB5B=Iâ™÷À¾ã§Vö§› œ£5å³,ÕŸnç\« Ò Ø;FݬG?±E¦–É2ô»Ý »G/ h™?›… ô'v§·Ã÷Ó z™¤¦[Mu޼Ž4$lr²‰jÉ­¯¼0÷~ÿæ·¥ÿóþèOÈøWõ—"c\;5—Ÿ?N׉‘Óõ&‘X°^H†0„!BÂe|º\LqæÚå6…KàŒ™¼ ó^ž‡÷ã|›æÏO¿úA¦™×YD¦yž_æÛM†€™·ÏOï/Ï?˜oóü4`ºÅ[”ée¼o!LqD^æaœ†ßûÕËÿô×/?ÿ4ýü3ç+8óçiz¹q9ß 2þ:ÌD| 2ð‡_M/ŸççL·ëK¼¾`×›ñ†pÁ8âÃ?H$†'†a¾ÍC˜/GÆHy™¦›ÄA8ÈR‰ÃÌ+â‘‘$ƒDÄqœG ómæ|•x ˜‚@>Ä8ÏqƒLÏq¾IˆqˆaÄð6É<‡p…Œï¯fŽÃ0ŽCÃÞr~ùÝ3_nÓÇÿ0Å9ÞfΘ#ÂðûáýÈwcˆäõ#æaŒÏÏ/?߯Q†[œñ#9MÓ»§ÏsŒ!¾|x–iºÅqúé%yÿã‘2"Èiâ<Ç!L‘óõ6> 1Jyo/Ó0 r €Œ!,F°0<„$ $FÄ9ÊÃ$cWå„yšæi Ãt½%“€¥ ð/ÿøOÔÖ†Ls^õ"ü£n¸ªšÿë^*u„jÍœÐ$tÎ=úSQ4}õYÍîqÍ:ë9¹ùßt@«tR…+Ò9L·mðÑï–ñvùÓc; ¾jÑy+òÄf¾¡>Ï%;UÑTÑ£. !ÈBw{ƒ €1¼%%6GR¿š¬äÞZ}‘ÔÉNݵª­scÂ$6 M:1MáXM›© ÷lоaýá.J¶Á˜ŸgÖ:³tÍÙÔÞ\Ž=&nøI ˜'4¡ÝÌkÌ ’Ù&[ùQcZDTÚVbĤ2Ð ½7¬hñWµðDÑ®¬RÉvõI:'…;g'mØÏ,Mµ{ZVâ0…=»˜íìQUyêÿpJBúpj Iµ°õÚ@t »`À;Ø<ÚÄV·X?#ºhh!¢p`ßT¨A;fqjAf2Ô׃Vêê}€7wP¢×t/; I´„P•AšPæ´(I8ιʦL"p(”tW 4‹?kÁNo$¡ûì¡C'”O¨Þõ€ôÂë»;5wÝñæÅ_ ».Ógl«ÒŽWz@õóRÙŹµ2K@ª7a"þ\R–‡`¼løZ¥g©þàO7Ÿëûßÿ×Lòôæ¹ëÜ„¼t]Ûõ?cf– 0ë9çÒß¡1€&§œ$ZIº§ÆºSQסÜ jH†G)ìüðÐAÒúS©œq~‘))ÎÏÝÛÓLM†¥d†¶ ²ùO\~æÞ>ÅélÑ/ÑÁ])NHaôpÄ~”.” ܬ0"ŠLH€yáEÞe(% ´2 ´aÌFlO)+ºˆ^Õ€Ù Z‰frtѵ 9, b †prÐ’¬9„ž3P9'w„Â;Ðéz›»g{8X{P~°Ã!¥£ ]¡½= ›—Î,@—Ææ“¦;·j½ýéO¬Irj¾óÝ|LñêøðúáðêÂùoÞžŸ[;¤ ±-áBNÌMzýøê{¯¼D,tløüùÙ¤®âaÙ HÍOíáá@”ö‹óù¹}|ý`j Ír2BJ®HÉ L@NI@ñ’šLÏ`aR>!/.Cî.W„{ bÖo'­à?þÃ?ègݯÿæoM¡âq% qѦŸ|Õ†þüôævXž³øÑFf´Ú”/†«¶ ží(3+oz°=´]¤¸Îî¿Lãg3[?ÓS¸dj瑘µRßíe˪v-Ž •š{aW6áá´³‹–ÉÅ_¤¾‡:Ö Þ~1¿Éë»>t{ÛC‡êúÎ3 Odnñ_XFRí`®2ÊÜj«ý¬_TèüF¬ln§-zTÝünZ¥BÍÒõ´Y8á3ßL6@#}èCäjˆwplî~ËÛ¹“—=`§zS{1ïÜô†aµó¼7²a/j®¥1Q÷¹ë|Hw»&{FäüO&B¦fûtp®ùÎ1Û•XÚBñf§VžÕ.õ ý¹ªÇó1¿XáZßâ2¾ý|ææË×â×½ZÅ-]9?þ{|Qíä·½©?ßÇ?ܤUÕ¨hÔU‚h2ñ…ë•ëtéݬÞá©ß92cU~Ýž›©¹Y¼k˾ûÎÅ»_4v¼²Í[¿«àåU‡_ÅÖ³*(¯üµ*‹ÉüÁ{ûn·|c*ÜÕ¨{× ¡&¯¸Bià."éí?ly×/^®Å­ªŠ¯ŒyŽ0 ×"™cèÕä´  yÙª7ÉKøž—ÌôJ[c›ºJM¾™,Ç"#¦Á!ÿáÿÑÍA8¿y.‡{)¡ˆDú€ÿ¡„œÌ,ƒ¦d©I´DÅ!'ÒäŽQkÀˆCBr tl;g)í[ËÇ ƒŸÎÌpv<s ¢œϹiì¡)ç³ N¨c¦’±œ[€©Év<œþâRm{¦N®(É#^r–ÂôôŒÎ"ÜšÌò,© ©“»I&#s îA$B9CчKÓdNÑÐ`H&)d–Òƒ£ =Ã"„0šB°Üx{v åìQ¢@¦8$¤×ÞY™Ù‘# •ÜÑ–­Ÿ:;$4G¥L6qîR˜%y„·ÅOYxë¡æ˜›Ç,Ñ:¥þåOYŒo¢_ù;ísËœìÓc>™@#Œ(mk<ž¾cYèzã8øPÿwi”¹F/˜´¬ßÀÛçª_䂬â]®{¬n¿Rh,¯õO|ûùj¢Í[-H߸ÿRÃ"m}ú*-(¾ßì¾kžóÃÜ(÷¾¸nw{Ç»¿o'¬ “9™dÅ VuæÞ¿¼pËÚÓVýàAÁ÷ç9|…óöÞA\•ôG“ª>U`iop.Âö~Ò@WÛ9Wö~OkúšÑô¾[ä6Õwm:Ts. ßó¥éÎû^ +u…ÿ~#|ת)©€|¯›ì @%†ºa‘×x·Zñ²:µÞ4È­ó‚/½9+  ְ̂+ºà§¯¯ìüŸ~Ô>Ÿ%J1…JgÞ1§G@ 4dAÃóüìÕ§ÝÛçòödÁ””L t.0$¢YJÈv:KQ:XIYDf„Y"P,; ,$cd…"HH ‚¹¯m6SäDÕéù Ë­)0,)<—Ãñu~mÅQ¢=6HÖDëP0›Y0ÓŽ€<ΘšÔ•x~ôçüæ?HÎÿâ7"Ù,Kêέ¿9ŠûCã§ÎK Ð;Kéóœ_™âéŒl‡‡‡3™|>=4M:d)Ф‡Cr¨+HÉ já*á¥ø¹É’Ö—7§d4"¬—ŒFZJ³T’»³É©4r÷(.É‹Gñ5è‡ôGþË_ÿû³®¸: Ì)PréáÜŠ%/ø?zÏsóšæÊ–/= õr#ë"ºÔ¥ìƒ­ìïRPûŽ˜÷8¸wG’wð7$Dós¿u¢ßhˆá<9¾†C.ºB§û´,¿hÊ‘é G¸êàæ ¯›vpk¯‰u3Äʧª g3ùol.à ,r Èê"Ü<%r€Å„ ÛT´ÃtÖ"B_«-W˿ΠÌÅ£‡Áb.äLF °ç~¢§ö™§/šú¸©¥À-9Ó/¶Ë…rDTà Öõ›—¹6/^š4k£}â­ïrŒ6_æÝÔí›&#&ì?W Ÿ :jRË:}#,yLœÅ €¸e=î7`¬!"BÕÜ0œUÄm–çûxÌ_YœŸ-—Fi±jÐX=ÁÖÔØÌ~}š±Ë{¹%®þ‘‰åc.¨Îe ‡¸tÎí¬à¾ñÝã>ÐÄ÷ØÊ×o#n´þnbcõï^kZ©V³”›»ÀU­ç´¶ ‚k×P[ $޽¥\¸yóAÜìp•ì² ³›X$Ú‹¬U\¥êVóôBl«V+ä÷°»‘ í'fgà­ÞûøÛP¤jßÒ~ QX_zÿ“|y–êÒ¿ªäxkÄÙ|ŸÐœïQ¿øˆ©Z›œùïœ/jð…¡'.Þìõ0yÍ0—æÛÓ&[3k§~Œu#êºÄ¸:H9’ňÌîvîi¿¸Þûx ¦µ5Mî*h]n-ªb3+³ŽUË‚¯¸Yžyy•ªóœ=Å-œýz‡ØØ6µq2N¦Ûl­¨]FRUW0Î…ªb·ç¸šCZoõä^HM ¢Ñ¢¼z;"Îkîq…¬é”¨9_Ú2KÔ¢Å/,ì‹ÕXõÅÞ^“{33~Ðë´è/ç†kfo íÒÐ'/oÖXÕ¡ü«õ>À먹ksI”,è±õ¸:”˜`¨Âë¦"+â¾h¯j­Ü;³#««^ŠšQ‹Ð?7⿬‰sw( hÉ"—–ô4õ—Ø|Þ*"_;ýÙzYVõ»›írµ·4÷æÖˆÈi¯œ“ëfý¥‰´Ê,t¬VòÁÅ’«²ì¼#͸î Ùè&¯–älç‰å³îŽKÙ?oe)xɨFUa˜bôïï‹û¿yvw•pwy M‡ÌØÓ~ÌxȉÉúdEHÉ„¨pÏ€ !'ƒ\hKaN綤R˜Í;Έ&«+Ôµ]÷|n jsy>[DnRWú…,IAâé§Ïo~ÚyI‚1¢t‚‚p¹û9 îaB@!z ©Aˆ,NJ+¾DÀL4y0f‚шdDºL]“Ëß¶Éh†|àñ^¬´Fæ”Øn! U$1r¿“pw„Ì (d—T² ÌM KpIE‡D[dTb(˜,AÑDFज़pïÞª´©œD>H4FqÈëÎî]}׆oÅäçóÏ£x~ȇ×ï‰éü6E€Ö˜y×F~hÚ}ù¶éºî¡I‡´îÍÛ•”2arDé‡C>è^tWÒÃ]{Ž¢üØ4M##B¤¥LMI<‚ aRéR$åÜPˆ&(E‰®mÃÃÝ‚ä]ñR\ ?ÿÓ?ðwþÞ¯_jQéÁp¢p –ç½=SóÍpÞk­š#® mš¦ë°á¯³êHAе&‘֬Ί>ŠÍ>´uhOk}{b&[æ,5Ľúÿ\/Ø… >êf(s‚ÉTFN-žB ú1P…*L!¯k)lA2ïJAOÕ2Ú°.¡°•H×éivpéë’Z®-¢õ¡õM‚Î×A6ÎOúɰ¯'O?Vö+×L×M´žó‰Í‘´gêÊ¿®û®_GÚs¯§š6QNüS£ÀÖ è…•›1ÞúëÚUÝ@}­­æÔ³ÝØ!ßa<†”áPTÕ(w<½µ¾æt¶u³zÿ§œ]Iïr+_oÀ7¶Í€fßy™Ukú7¯àCW‚¡Ûh±øfð:6‚)»GìKOuDõÅÄŸ«wÿâ’› ¹¤ÂÍiÓ«Ý5;>@w§ÿMäß­øãíCñþáµÄÕG]õ³œÑ˜AªB„[àÛ+/[T×Ëòçò º@KUÍûŸbaýÕK;³P«.uݘÕ{^èÂ{ÏèotܯüÞ«~{ØoyÚZ\•[Ÿ+ÁÖ•F-‚ZW?“«ˆÉ»X¢0 ÍǺ9o\lÖ-8Ï÷™+¬¶ˆ)¦»;v-ª9íŸ×,¯;K7Ïü{œk…×KL9Ë1í<´–6Ã6†zŽþ™Ò"¼l­Ë „I©­®'ojì¸'úzóämñÎÃ]’Ñ&É›d¹ÉL4ô‚¿ù˜IRN)‘@DÎ% `d2²xîË<¢ë¼-:4‡ Yy{¸ŸZ?£9¤æÕ!¡·? °‹ÜÝKIPnéÏOmN`’ŸÎϧg–ÎRktƒ·†ÂQHæCŸû(ÔF*L.SÇ€õj@¢¨œ•ˆ 4þBHÐ$ôœÍLÑaÉr)nLDscçÊ`s¦&È!܈žD8ÍàF&³¢¦”3Ãi‘r²Ê3H0…„œ`0f°)!: •§/žÒ[X&+g‹b½;ÃÀdá€,% šÌ,ƒ%Jçd0/XÍu´ïÿ~µöÀvžzM~qDfñ‡õŸs—Û«‰¼+¸vuáò=7qnô0^—|¨Œ©pQ«–úÕä%)Y Õï¸ê.0õMÉ+ ù1‡AüÉüáÍçíKþ£x…@™zâ;dfL)%³”‚{Ä!ådCC‚BV"JqÑʤÜXN&å¶CzhÚRð›èJyÕ”®ë’ œ‹™(Pûå¹{>¿ûúøê^Ü£säïfx´'!¤ðÜäœSЇÇãPÛõ©‘óc‚¢xJ)5Ù²YNŠP‰(î5Èc8M’•SÇlüoþí?øÇÿ±ÏI5×ÊÒ·OÓ€hë_WµjÒ`%›,N†›Æ?×¥³îúÕ¡Æ{æ­oåVÓçÝÙãªôðgZïãgf \<¯ø2-4 þ}.ӴعMºµ%ÎV›;Þ•èÿÆkÖ„ž[V—EàUÄ™ë|87k¢VÆEgÒrÛœÙDË·³5•®Òݶ̩ la±1.›Kf ;ãÜÁX˜êc`»ye‹\±óÖêC}…nühv×o“\mÀZPäœWriíÒr^]L’´|ÿû7§x9u¥+Þv^ܽ¨“ ÑR²d©É)™†˜6™-ç†f.(á…Ddy,Ž;f2’Y¨œ[Š–å§#ð܆»!šdÏ‚Y4 mQ(JøOþcdFÇÔXj”ˆ¥Â½œŸJjÐ4t0–·\ —S!AvŽRºÒu%'Qङ%KLr…G8"”=QÖ É‚¦¸‹@J´0Ñ‚VúDAï(tväñxðÎÁ""Jˆ§~Fzœ dÄ9TaH@ ¹åˆ¾QN`HŽ1† Is\AZ?)F–3ádF“)ÐsP(˜#Ì»”.FtT’§ %©3*D’H£5‰ù@*gujÀu¤<Žm>í)òc“ÍÎOç’§ÏãÜzŽîÜxèôÔ~ú«ßùôW¿CƒÉ 8ä\Î¥éÚrj›cÓÙKççöéí9?6$N‡cóéÃA`2ó¶ 6\„BˆÒõˆî9ç÷”ŒÉBaÙ¤™$¥ˆœÌ/ùªPh8ô#¼+$-¥?øßþ³¥”~ãww ¹ôÇR…¹¨fTúñÄoY3§ãky€V°A.i’t±äk*ØðÄWm"&‹Tºu+±«ýãcšðg꟱>ªT{X8‹HMU°°ŽÜuœÝai\">6pO1åK9"YÅ+JH‹p'«ms¶¦yØ[9²Jø|EÒ¿¸Ðù¹%²ð|/Æ×VÚÖ¼Ú5n+K`ÜÊ ­‚þ—ᜩ¹W#À`ÓÕå¤b*ʈ&Ëɤţç8?µ^€B‡5²ðö—³{ç©‘%Eç¡"EdC‚æ”`Bôpô1bÊz Þ¾|_Èe;€ÂI&*%DÁè‹f̨Pœ½;ÊæFOMã*NX¢… , F ÉeçP žQ@ÐÌ`ê ÂÐLJi…f´,wÌb’»ÚA¸ €å@×÷,@}òÀ(‰¦H"Q:Dƒ€¦1ïŒ&PÝ^” (ÖCûÁb?y4)A®-ü¯š¾÷š‰Ýù¤ÏòúW?%Šám÷Źtåðé!hjËÛ/ÙS9µ‡cn߃ò)RnÏO´#=ÚŸ¾Õ±±d§/O¯ÿwß#ÁâIM:—Á”RJ¥s²Á‹Ž¯”Õu"èP‰dê5Äœ½”pSN}ÃJDÈ{ªP "¥x2ÿþûÿåCsüäÀ¯ÿÆoõaìqkª«FnJ/j#aúÎ#ý%|ÿÓhß±Í]âòGï¸ s•÷¨·úAÙÜlÊd¬~õ殾xW´^XóºÁú˜ ÿŠ^ ;~ ç‹}õí¸ÿÒž¨;¶jê*ùžÇWÌw16>À'*M¬ÉšxÉ#æåâcݧ€µ¨§î1Å7—èåý[§ödÖQÝý\À¢¨òÊì—°ð›ú ./åÿ«:ü«îıQy†ºeàn4üú’ûTÓ¿)È‹Œ›™‚_¸§þÆßÕ·Ÿo?ßÀõqì÷uÞ§®‡943d¾Q‹þÝö oD›íûs꿞_ápö¡[f>¿Q¯ãeCðµÌE ËK‡ëåóAá?ÛÁàͰ8o¨­ò¾{éþ§ŸËéýó36% î~›7Vë"Þ@Ü”~™ŽêœídËäd-"¹íµ]ú†€±Xð£üÙ=ßÞ=}@ýx¯ÛËùöðõ|ȯ-[×¶N†ÇƒeædÀ±i$t^yWâÔÚ±É`×¹‡ó\2a9ÑÝ"¤p•ˆ–†P ‰¢áùþeéC†ÎÊ JÞ»g:¿mÃÛ£’áÞu]×Jþ|*ÞDÎIÞ–ç7]D˜)÷Õ€Yq¶"Ò\ §B¯ÉgF9˜Dc‚B0 ìˆp@ð)ƒ”õ/Å".D „÷ ™L0ÐHR Pa‘qxEïPÂ`IHôb)‰€‰¢ƒý,JdrY©`sì!‘!ÈC)õYØrDSèaèÍgiQ:XÊØUÄ4õ (ú›É)^éϤ:šR ¥cwòÒÉLá h` ¤¥£§Ãáôe[¾lóAtçš;SI– æÃñtêÚ/[FÂX:oÜÍxx}MÉÔEC"™¿9?¿xã]>>ù•ï9{uúhR£Ò `÷0¸#¢Iäd}ðWh’,åÿsá1´¸*ÑE)^<"¿óúO¿ÿ‡þþoþªÐ?9/2@ßÐóà—Ô•Ÿïä¸ßVÐW{úbUœþ-tþÃøæêõ^ ÷µïWâÁ‹²ÄµxÀ|²ÕñíKôw­Y51´Q<8{õÚš.UÜæ­_šÑ/ ÖjpUx¡Jû]@³TàX¯?)êjÒ&Ò–9³DY,Y¬úÌ{t»Æ$ì`~A<Ö"n²LëL¬¢K[–x ág.ä R¸èL­F¦¡Æ`láT]ê2éTa…”ACEžôRCBÔ=#Ïn1Çþ±±*jేœþe*‘Zº÷SÓ?·gõ4ƒ5§ ­)nÕ:Rs-°¾S|ÅLÐ¥U¯ÒÄZßôúÆÄ½ N=£yÁV¬Rø[Õ —B›êÕU4¢å’›9”× £Rë>p[çN*.^s%b2f5üg½Ê¤+å\/pÿ7ñ$7­7ÍŽ õ¦£@/½eÈ‹Qf†‰"rQ·#&6."ÇðçWîüüöyÀúCá‚„{˜Ñ,1!å”R*ÊFæCîLJ#ŒžhH"hdN d)¥xt玧óAJG¸G“sÎÑåV JI‡œ“Eו®c~uxÈùùû¿Ÿˆ¶!P襴~fJÑÑ”H©íò^M¡Å 4G(^ëy@Î-R‚Ù <Ø /c¬o¤@ øÉCÉžAù”PÜBð6òQ¹QRôPé#a ˜úsÙšŽÜa9‰|„^‚iœþ),õò€#ÎGqô) ½#Ì lÈj(7ŠNp-€ÜÐ »B$Jr‡ÉMNSR¥Fm<ûOji9•î©yu4B4÷ð¢ãã!INoNåùM>ŸœÎ%?ÏÅåáƒDbw*Y´×G‘0¡{>—m'ñgßy}||ôs+#"¢m™ì`db:B´¡7Fͤ@$§á’<äQ"Ü£„ÞExW,¥”ÓŸü‡Iã7~ûwú=ȸ8qµvã®&µF×¢ü¢‡Y5ÔxLÎ|ªáZ™ü¬ùÓT³­yWƒ‹“ •0“ÜðÚx³Ot¦›¢«ûç&{K¯“‹XE¾ªA*cîf‘$}Á‰¹`×,œÊÊ´®@¬Õˆƒ]™[öIêÚ/z¨Þêåɪ(¹jpÑ/t¾ D]jó§é[„m®üsU–è%$Ãa­£ë¸ËŒ¤‰-Xå"¨¹Ó¸4óP­â{RM‹†Œ9îo4å¦1Á+x´¿É; ËH¨ $=Ÿ…š£òþôiÞ“¦â ²y_2tÇ7®ƒ".ÞÃ<ìÅŸ\þmð¡ ^/SÆb¿®}½¡ôßV2½ªÂ£Yxq檄Ê/:=Aµ§ì4WA‹%±ùöøs%ê¼tl¸êüÀymîfî¹Ôñ%¨-‘‡û­pãòDyY.Ö³¥›1ýj_Ð2ï°àîV{–fÊÎú^eÝðž«ÃsŒ°ãBÝÌc+ø»ŠÁ_y-º§ÿýyøýûÖrÚ· tÑ~»SL{ZVÚå½ ·•sxYµ÷Îi¸Â4qo‘TIºzlÿªË„”ܻ‘ ¼wEèftxgä¸ÞY{sÍlÑjpÇÍ4TÕm¼[õÌ®´ÀÜXœT›¸yý+ŸùÙp!ê-ÑX·Â›_A Ö#{ÝïÜü›‹ÁÖ—È]=íÏßqÈê ¯ÅóçÛF¶ëÆŽ¾ùr¯¢/¹ÌwÞ´ª¹°^¸Úýw:$Ü‚™;Ï¥ÛðBÑ×ëJ µ´)ÉÆ+›û-²Ñniöf>ãä¼Í+_Ë1¬âØKÒB-ÝÏ7U†ÑbgÕÕ\çMùŠ»†ë£l[ä,ÿº„Ïò®»ÛÈÍl9EÕ~Åuäk) R]—^ôí ‘‹ºº`”›«³_zÑ^!5ÝÝt²–ºX^ä¤ê]iN|ÖZ†gÊ–Ô#­±ìLã1üãþùfЬ†V¸Ëã°AÊ×RN–²ˆ|8¤lѶfìq?–Ȕҡ‰RhF¶½JQJ.€sÛ¦~@¼à©Å§‰&>S2„Ë#%¤pJ‰Êrjÿà÷;X—+êJi½Cb÷LMQ$*,$? "4 wª¸wQ è ,"EÊRòæàqáê‚Ñÿ‹gNÁ„” ™mê `‚¥1L+€8>"b”Ø# Œ-܇Ä0Èí&“Ü C9—(n F9EJ°,]çÃe¥‡¡ GE–bOfTºq[™%"0¡8P€ e)†šAHX‡¾&Á@ :"à#ú(ÄF Å9!2 hú6‰ ̓ B”L&(A%ÂÃfh»çî‹Snøðú@»îÄC.Š(1 Öªýëî§_´§Óáïüv„ž?J‡Ãá13Y÷ù“¤ç/Ÿ¿÷Ióú(¢1ƒ„®Kèºó—OÝáÐ=Ÿ,åOþÖ'Ö$/…RÎfM’ ’É"”“õ§~J °ÒuîÅ‹§ˆÈîÞ¹×ÐÐöP Òvé>yàûÿîßþW¿óú}Å|ÿÑ¿ec.lò­óvˇ¤®x²•xøެÿWì·.|FöŸï?Ô]QÞò”7¹:K“ûõcÍêÿñ¡:.9€¸dŒ·&KŒà ¡víu|˨=1‹;k¡bóK_x /±¦xEˆ•nÝ^xmÎ(£îNE¯ýYt¼è“oF¢®ý±ö]ÐeÄrfdé+\Û{òVVL»ã«v¿Ŧ“¦—LÖ[͸xÿµ?û…_˯~„9þs{ño?ß~¾ý|ûùÆìMúÅÜ𾥤}ûùöóbæ«ü63CíçÕ=(0Äè¾ý|S>ýËÙG:›¬]ûF™ã ¹•1s mp,Î#†°FÂ1´•dÒ~ðÃÅ·ß<»»JA‡{QÈK¡‘iú3S‚Ô<>4¹é–- ðèÕ3Îmk–z²zJRçtw³öù¤ˆtléøê§mËÒFI¹ÉáŽöŒ¶ }ç•^ŒD ÿÁZÓ䇃“L™•®Mf!Áõð½WÞy×¹©{xýè¥D¶çs‡çöÓü¨âJ̉á2‚%z­ ("ú3-‘†ð&5)7¥k-Ë=1•ä¹ëº>“!É»â¥XW¼-}àþí¿ðÛÿøwçÍÁšå‹Áª³lek<þ<H¿,öÚÏ=tþý|×qíF…ûâûþ›ö:ùSÉ w°oì7 mÕ‚q·êS€• ÐJsbjÝž•ùÖJµC°6Í&ÓÖ3.+o–Ú)*š:؇l>7úÒ—Å•¤¦ªÙ¥êžÓª•ƒÄ¯.T ý¨;ªÌqÅtX¿®Ym奒®Öþ:cT©$r¼Ñ1—9+ÎbÿV—C<È­‰Üîj_ßð¥ gº„%¢`ÇL^◶ƱʪkU”„E[÷8è\xƒðKÂ…9"j£8®.EÄ™0¯=›Ý$¯Ì¸+[Ç<±­+»ØrAÎz¤«)¼Lt]\5~K÷mh3éÑ¥bõ®lö5¦Ñú«6ÛÕ®à¸?B«Š7Îq];Ë{¶ô› õUËÝÕ­{zÛÕ ¾^Ǻ|øÛ\Ý8SxkD¯\|^9Á =‡{fÇ­ÃnEäâî5otìLVÍ@ãë½SGwá–/Þ(f%ùšmw÷¦±·ÅA«Nµ± ¿þ©éîu%(1?MîhÐTV>á´QXzq¡®\j+H²ûÆf ¼iã-ºD4`7çÓ¬Ýv¯äeWÜT3³æ¾Åó¨~Uæ mTš©>äöÑ´ãs^¨û2'öÆA6µTÏø‡Skïïzù&îßXÁ1–‹vØáªà}“Ü\»^ûáHV«\ó¡æhÚb¸jTË^÷q±þ8&Ý;ñ®ümU™ÏçËöö„7蠟…MÆ7J.¥I+l&íI±¯6óY«Á;‡ô¤ü^z½õν¶tséIŸ»7F~üϲht¹Õq4ï÷½Þ4möæÏ8Õ5„ÊëXÜ'”ëÅUã¦Çû;3´¶+ëÓ•BÌ;T*ÅÁa˜]Âþ³3©¶Òõçò'³ ÿX쯾ʹ+ÌR³–ÍÌ`ÖšÔäÆR'gNùØ›œRŠãCמ ¦œK)mi¡ltb“B‘»Â&™BmK/z:Ë= ‡&7)±±(Ò1'£IjËéOÿ]6Ú!© T„‹¥œÏEÅË“—BJ3EIÊ Àƒ„üìpJM˜ID:²=LEDLV\`*²£äÌý@Ã*njdò¾pÞÐËäBðÇ,Á„”é!¡„!Ì¢µ]°eä„à(03)‡Á/Ã"zîRï-ªÈ@¡>(Ù=#‡”€’¡Ç•˜@âÕŸf :0iè%p‘ÐÈ*rGNLÑ0RtÏÚèHìÈ”-=¤B§¥œ¬;Ÿ-3è2ÁLáJy‹ö KI åœÅôüy(¢sÀ²5™ÖFàéÇÿÞL‡_û¯ ÷îͳ}r´Çcw*LJZO4ËYrw{úÉ—¯>{eŸ¤ljŒäÞ¿)u‡û¡ItOMcÙZ²Cá][B’RÓˆ‘r6c °ÿöíÎç>î} Š×i€÷¯~ÿþîïöÛÆ¸Ýq¹_qÚåfµüÒuœÇ¸ediíÑœõ·¤ðš…ª¼ƒµT17ùsë`,þ aâ—_­î:½Ðq&£a ~iÉ«´(*^ 5âý.’£¼Ù ¸ž­ã¼7ÀJ[¬¹_:è|}Oï‰ë¯Ýæ¾ep2®ø™w™)\¬ïQZÀˆ¸6ó.®ôoláeÔ9€—õ‚8F¨®øÃ”¨« ²îÒä^˜\…W·ìCIKšÅ­…¶€rWaçÊõk.ðµ0]\fËz3Rv.(NYî9Èš£Û9¹x#B^Èìãú¸ˆ"¨ös'ßþ˜!Vãüš;\³å—DmÄc¹íY_u2b·•Œ¼â?/¹ÿ˜çc–wÈ+áÄ¡@Œð4­7p­1P4Ђò:f˜Ö±È]¾ÎÿÕ\SU7¸N\¦Çêx¥æ«û&3µ[Q‘Ѹ €leè´ÊÑÔ6Œ¶£µ‡vßþ£ë;Ýò~¸SWåé-Ó\7»û5‹ê­ÞÄü}<×|Mó¾ø47s‚Ùš¥âøuâ9§Õ³41UïÞ{[êt píî.G‚7¢ÊSïì eôKÖÈ:©È )hcדVd-|ɬeâÖß­›G¹=±–áýu“›1‡=£pžxX2—+è 7Ã}õÖÏÚ¸œ;ÚÎ1hŸw¿ç¬‚€SmÄ–„wÃ/•¹¸1Pëð?'—âJ¦uÓsرæ¹w­ÐOšP[¬˜•µT7ä¶$À¦ïQIÎ\4Ô¦õ·™Û»yqçdZ‚¢0ASusÿçFVå¶ÀÍÆiÉÕ¦»¼,«vú嬺§ IÛ3·¥W°D Þµ*hÍB¯€ëÜ×þèÕS¦âþ/*ˆ·ƒW¢ð —R«äÃ$Ô´|ÒÊŸÚeÇïMxÌÆe¾yJµÉ¹lVïÖŽÑfig[Òú)§„¦´š“¬»õ7v0]Ë,")÷û±{þóuðB.˜½‡*Pg_n$:,MiÔý#¿úËÛ»°ÖdåÌ`‘õ¬Ekµ‰wKؼ<è¿qú‘kóiº½a²Ñ¬uÛbþðûß_üI_ìBRDD\Þi„[²ÔäæpÈјYß7ÞÉ Dv»|W)€”Ž^:F“  1º”2 *ž ˆ§3ºB 3SÛ•ˆæ˜‘ìЉ(~þÁZ†›¼kÉ^¦5Jxë]:D—€ðÞ£I¹¸Ë¥£wfTÓ8hLÖ׉ hJFDo¤’‰J¡¤£÷#œòpPšZŽáP ¦¡¿×ß‹‚pDÏöÉPѵört#s‰B@7V‡¼xJÈ@𠀩‰t„;ÚRsù1A”Žp z’ÐÒðíÖ)„Œ#R„NòfpGt`ƒ”ѵ`@ó pÆK¦cD«pŠD£tH´Œ8&$kâá`^¬<±;ŠÞJYéá DAð˜¼tÈa¨RÉ:‚Þâ|6é­{‚%ƒ™ŸÍÍÏhß:Lv°RØýÅ Ý'¿þýÜÉåÎPœŸžÍ`柿Aøw~õ³‡×Í!SdW<á]w:ç×L–¬Éù¹-¥R“ðR:'´æÐ°dµ†ú”d–s¨q/¡âîÅË4À¿ùýßÿ‡¿û»º¨gAƒFd,i"¨!à 5eEÓ*Éïåë8‡¾ÑsûyÄï¹T²]ãñ9¶æìŒ?üþÕÿ:@~<úðe¿µô²”SbH©É$- 2Áa9eË¢,[Ó寔’Àèîý@YNI8„gGÀy«&³k›!ZÚÌxòVqLdžÎH†æUô$£ÇÔ~ÿ_£²J@ÊѾuEAt?—ÒyWÐSÜS0Inmë%dK<¸‚J‚„†$ÂE"@ZRn@Y!¥w‘…T)Hrc€9rƒp”3hpàŸ ]8þ¸ðô› îc¤‚Cà÷’À1N}—@ßù ֢oó诚OÄŒ&!ú"ý °4\?€#Èñ5΀l@"|è*!e(à´A¦ÇÆ› ŒÜ!)?ˆ”™"ØyƒP>2ÈH®C èÝùóPçC6„Hñl:?)ÎÁ–N)äŽDˉVä† eJnèaí›n,ˆdv ŠPÄç i§ÿø/ž?æ`¿úOþoÍ¡9?ŸO¥y8X„™¼=Ùñ˜ÇÖ%!ëü¨h;HÙÈdF2¥Ì03¹",õmai쥑ê ”šnŽb9Ñ=:> Ðwx¤®”s÷Ó¿ük˜åCóú³O±žª"Ué—ö›Œ".¼ƒ~~p-8öíçÛÏ7Á&ÁÏ-tþ|q¿@m͈Ô;é˜rÑ-#‰Uõ oÝãW=*uþcOTËàHž×}ˆµ–jÝuq©ÐA•`­~q'3@ýÆVŸ[ÒeãËíŸbüuLL,ê骊1n¤›fº¿6Þ)9"8•oÍöþÕ%VMSg6µªËüT•p©áØ•´t;9%CÆ–#êæ€Ë-m*•R¨ üxKˆ–×Ü-ªòµ{áΫ£wbª ¨æ7w-p¶«f©ÙÌÒùÜ>>sr!dù±9½=‹lšï:·dÆd½¶¯K–S1z JM“¨Ü•®×r ÉÃ<äf)¥p/ËÝ‹Còâáñoï_‘d²”³¥”~÷¿ÿoxé´Ö†âÐ IRÓAÏ™—(ŠyçÜ¥±~” 劽å©Ï ×vÝ=–úi§mdêD|ièV/¢¨­»ßæ$ÒÚŒ×V ñFÀ»Ù‘ÀT[FðP.Îq!¨„ÛùŽ‚ÄWD€ï7‡~Á ó³_ìßлš—­¿€ ‚ ÉP5‘^&äÖ¥Ö·} ©Ÿk"ÓiÆ.Øoƹý”WñVë¥6ýSíEç%HysmÏ” F<×5_EQg£ªUXJ7fùd1ަîò[ÆÉ?=ç˜0×îÓO­«Ô`ô?ä2òó†qS˜ÄRq2 «\G=³!ÖIV'.“½'¤¢†ÿpÑâìÖ‰eÐz‚ìë>ËFÄá þe§/}£ÕckŠkDU™$ic&èÐÅÜã·Oò:æ?éhvl&+®áîg!®Ý6®ù$šsE§×h³ïu‹œ¾Dvl1ŸµmN\i]Gî1ý<ÅÙ$¨l0nDí©µü€´»·’“øÜ Lîì73Rþêa5g.'Ð6”hsJŽøïùÔ¡8.qn´x…~y¶ËzÙ`éiÚÏïJ°m |éR›]ÙŒü¸¬FŸ}îµqØä'Èëö]W×xo–PÕi¿ðr§›Ü¡íT–k³ JSÜ%¢p1ý´µ´Êó]Ì%ûeÞo>-Î5o«k÷Ý=vmS8O}\J™´Ž,h›Öx%î°Ýß}{cH¯€®JV·´¡ÏÔï]ž¶“@[ïx›Si²X¹Š[h~Àòv||«®EW£ëTeán.š9ùg¹L7÷%ä®|ÑÞ›¯¡Šša<¨Yë¸ ÙŸýÉŸÖׯãþ=¸|˜dÇW2‹Îñ\ÌÌ[gñ§ÿô'©é+í½ëŠExQ)m”BvL.F,YóØ„«t%ƒòÒ©â39!3HõåüÓüp‡Y>sWÞvÏOdé‹è{Ø$H$¢´ð€e¤ ÷Á·¾Ö}å_bñ}p±)Nq340 Š/PmøÛ^gX˳FËŠ~÷ ¨?‡|x¢K4?7°ÇQ‡ Ï4,b›ˆšf€Á2,AÒ$dÓúV õ’>>ŸÌ€N`LGHl[™D0sRÂi‡„”“åbnYÞžH6Ÿ&>§|“ "#­8YZ¥C„¬}=nÐ’å‘"x tþ²;<žJÛtçÖÇÇL2ÜòÏþ_]+?û'ÿC÷ædˆôpxõÝ×9÷U¨©¨´]ѹ;dâ©Ðøê˜=¼{ó¦¤&MÓ4F ¸‡Y²ÉãcΖ,uKÁ3kÖd;=™¡ïH)Ðyx&’ˆð®´”þùÿôÿI‡üúïþ¯32ò‚ÒÓµ.§=kNŒ4Aœ9üŸ.Ѭqg`]-{a÷€âR[P[ÎÐBðkFª€gím §é4ÝuOS¯¤;ó©÷Ö^ÌÿI\l/±j=¾ÜØÌ´¬„ 53¹«ñ¤vDx[Mg‹àÇUÍ ×@ÿÚ€ù%‚Îk‚ÎoCxjúPõ_‰ŽÍRªws€²V^°¶ƒK3A¯™5÷Õ$sñ›Ô\óVò]ÉŸ÷þ½°ŠiYÕ+¾C¥É¦­àЍ¸Z µ7®Ï†xÌöƒðE>G¿i*úûeýèvÒô…ÈËñWöÂ/ wãcøq/ËoÒ|~¯k­Zxø¿ Ÿ‹^ÉHÜøêöjÀ·Ÿ—î_/Db#‚ûNöåDšøE7xM¤\y¡¤K•f]&¾’ÿZFõk:¯8]£jÖ‡×z½;ºñ/ ;ß~>ú)¼‘óФ¸ u$aÚæGÏ”—ýÅþürõÓ›'o‹wUÜý3åœRf6K–r‚%3šúÄ@ˆ¢tXJÞu!! Üun”Î6¢œÝ N(œNž¡ó9ŸKœÚöù)uEŸ¾J LJ&JA“”SiO’ápè^Y"øÜ¶þ˜Â-Ø…«ë¢“pëÛæK ¤H1ÑÃÉ0 :<@A?,Ú9€{ Ì ^à^ž¿|c  Räz°>€Ã¥… ŠÃ¬GçÇ ¾+‡4À Š÷KÏý¤<¸}7€5àô$Ÿ q©& x!—Ü%„Ë€A€.¡|Ucú:Wƒ8ÄëûXG‡}…!¦A`^R @xuƒ¦1€ÐÌh&0œš)I0„eKá94 ÁcjŒb×zR¤óó©œÚ&¡5¯ÿÖgùÐa¥ "eÂr>+Ô·SD „€úuÓé‡Q]ÉÖë9„¤p—«§y)Ö•þ?ÿÓ^+Àoþö?$ÇC†} Ö—¼F€”|‚ø«.ä{wÿOÚŸ¾Ì_|yÀ7~g¾íÜm¬¼»«õa:^h¥üÂBç¿ÂÊRlõ½&ÀøïS7Ú«ººV9õ5­áŒ‰LS¡ë6†C¬ŸsÆ*úT3ˆTÃI–c5~ß-ówÙÚZc`®N;]6m›&z„ÂûòV-*ÛÕaóîÿù¶Ý‡ý4Tk­£të ôsyöíšÚ᯴¥tËW»Iezßo…=Xô ×Ý 5Mgž‹}¿àdCÝ[v\ôÌgæ|ÛøxKM›”«*Û¹ªé»~˜íåÍøâcáÝú°v·ºårÕRñÖ]ßfØ­ñåÆdâRhòþiÈÍ×kÅõ‰Fì¾£ÅáR/,ÞõþÕË¿ï›ÞÁ¦˜Heﶦ®ç»s/öŒQnïz—ÀÛÇàk­ÕÖµS)þ‚½tg¿»ܵy/ÃT]éûaÇmsW[À»ë2}„˜'qUÁ~ é¥_¸áZöcÆE ûWzå¦3¹½"Yó:ëBžÚ©þ ¾Ñ¨Q×Ã\ØL7ŸãcÖËÎå÷Ûjnùíßy jÙmp÷ _±ºÇº1¾Ð_}÷ªÆ:¶k4pÁ|Ћ|Çßœ;(ë*Æ»ü@®¡˜/S,¸ómï[X×¾e Á«Ã¾ÝT´8ñî3]÷©ç±ÿ¾éGu-îRT+³A0l$""ôã¿øÆ’ÿ(ÅÃC¡Á·N¤™¥þ¿)5dJ–r¾¨K00¹—óóóùÔålMs8<Ü‹wžN¥±8>%t]ÛuÏþ¬st‰–Ž„:/í9JΣ ‘nLY§s‹dÀ£´ÏÝ_þ‡ô¨³Cç’œfsbTÙ¹$îçB’Ø2®F˜ °¨=¨X³¾ZLªCXo×ݢßî4…Ç0k0ŦV­1°vž8ËúÍ7÷ãÿÜ i?Ü<Š p0\Fì5ÅŠjqÙOjʱlä#ço|9áYŸ&ïÀ­göÒˆÞ¢e‘‹o¬êy?õº´ëRN®;TgÍÔ+ðË^W­*E­Ú„©8VcÊôíûçF}ÇËòyÝpÈ+ìãnP[@›ÍÐó¦[·ÀŒòŽäÄ ¹[ 0ó"ïÊPj/YXå–*°ãœ£#нS¨­°Îê¼w´µ(EuƒSeã‹îÐY〾ӷžx‚ËqÞä þç}Û/–œ§u´š.¼cžÜ_bMGbe¸¯æê,5øà‚Äè÷sïO€ýÕ_b^ò‰ Ðh)Y2ËffLÉ’¥”,%ôÝ)YNãíÚRZ‰f0ËÍã«ÔWƒ‡{J91’)E¨mujÓ!ÉCÏç‡cEMrÐ2!=\^Îç†lš }ó¤dùõCþäÑ=¢+Oü¯¡Ciß$oÏÜ3»Bt9 PÓ¹d R8Sê9<„îð€ iIƒLnNÈ¡iøLªx}ÕüÄ÷nˆ˜+P.Eñð!1ж°* Þ—ù"ÀA@ H`^¡9€ið¿è/A!50ƒJx§7“y5´& Æÿø¥vùaâÃøØ@›RFà0þp@`X¾=‚Ñ)f©9fïg[ ÚhHkè]x×A…°ˆhšL£Ô)œ‡Ä€—6­yõ éXŠw*$à¦@J Ü]tHbƒœ¢¼íœÅ£HÞ2Èüé"ºîàÑ=ÉPDPŽèZÙžaÔáQFZJ¹)Ñž`’5¸¾ø—ÿ³=~&óßý»Ç‡ B ZÛuÇ®´ožºR¢+m麳?}Å()?„™˜è®Ó™ÆæÀ¶ë:¶õLJC µç. A8»”Ó!eHÉRÊêm7ëûD)–öì»G” <ÂÛ~ƒøÃßÿ7z©€ßøßiùõ÷>¥ñÂyšô —²™CqësÒ"ôÉ ‡í‚ÔVЮÓM¬}ë@ðt`-@Zš¼SÇ~HœGF§(цV3'÷¯Üù-;ÚlÖ~ߤVªe¡f*q† ^ëS²¦ßì\±[I¡óÔ¨/k¶íH,í§Ks†ªò‹ëŽ–sá n¹Û³ï¹ Îù>«iOzOÀ&ÿóZªI7º”ªøUþðûÂÜñ»3'§«|omÂ^­"’+ ÜÙ·²j|ÀjÂs§+azì[&ð3¯w6ÍÑßÐfÿ—`44Ëá¦W´w¾ì¥c3JöÏÒÙ¯]Ý-ßïëöØWR$ ë*ï°€ñ¡/Çw¼‡Ñðu.Ú:¹|[cóë¿_¾ßà kŠü7Ÿ2çr€ÜaêŽlÇKÇ»ôr‚ëæÍéÞ/ºsW[^•_YÀVÎ^Œ~­ýÃ4ëúé_O9KW­vÖ0 VëEßÉÝŒÈÔ«²®ü¨/}»7IèsŸuü¿cÀ»=õí÷êØHèRÏ¢÷yW§Í,uõÕ4ïÚ^7n·:t_ÀW /ñª}m¢@ð€‡ðøËŸýôú/]‰âC¢ˆ´Kè?¥>úo) ¾¢YJ&3£%Í‹ðC>‡¶k¥<Ÿx:¾óh2Ž)!yz:ÙÓÉ2Ëó¹9%}úZá4òÜ™›FÅK“d–Ï!SyÄùTâí ‚·g …¡ÇWÞžsn O‚Œ€y‰^‰@ £M=æ}2.„ààL#4Íð·D õ²º£G;°#‚Cœ=igL‰ö}ýC ÁRª^¦=pŸ#Ú‡Å2¾î4 d0 –1ÄîE AÊ ŽÀx}‡H0õûèŠ ”nT¤ >Óºè=“Iò"ù@êõ‡óa¸Õ(`¦ÀœìAÞµåt:7MÉ ÝÙ­( Pß–D&ÂHBŠŽH©i(+]Ý”,ÃR"-Þ’å!ˆÈ£dkLtÉad¦e7D1©ëñD‚ò#ì ?»ÑD>@E(@&B©qï\²ÒÑFç_üÌš#ßMFf+_þ ÛC>‰s'°´åé͉|ûÉg¯š&žN&?dv_ž˜,˜Î%šþÅ[üî';4ùØd–€l}ÉVx9ñ\tp;ÆLÌIŠ e<ä($‡+—ÜŸì¥ë†b¨PH½TÀ¿û¿g)¥<ˆÿ“ÿþ¿­êâˆ\ŸX"£›&àT¿G<¥Î÷~ƒÝ—;Þï[Ÿ7—½¸Û³.<ب©ç=uÅ_l`è[èü¦õxµlQܶ¨=ä¢Âs‘¹RÍV—&¬% ´¯Œ¤™ÜhäK=‘»ûæ’Û-ÒœjÒîœECqUOb¿Žlk´U|ø‚¢ýÝÞMh ™Lj!Cù@u~÷Rß«›VªVU…ôz4 =íÏpV‚l|7wŸ ‘ŒwÚÇyß2çf×—X÷5Ü"×=Ù{“Hß Óoš/ڪ؞ê“õ®Û,?ä=ó+©“¸â¹ñÞÚ7ÏŽú(ÇsÕâö”âG\O»í–ו~§£ùÞ0®¿yÛÈ™Òíæ¥`ZKžî^w/ tÏ­ÞkÁ´Í’m·H¿GŸ/9îî¸ÔTŸÏw^—;v¢.~¼UÉ=S«V‘ÿèÓ›·æ;¹–`Õ yn›¯hfR/£Àã¼B²f•Ü3tuÉÞݨ¾l’nk¡¾KÛźÅaï1÷˜½ßL1‹Zê]¸À/z#«NÛ*Ÿù!¼z~0c󸫉8ÜÁ|I¸Ê¶Œ¯W7ŸEBHáQ\^TŠŠÿÅ_ýu”"z&‰‡"nÔ¥ä?%¦>ô?Tý›™FÀY / ïÜr2’‡‚{Ûå”PÛ¥dÌŒÄCsÐÓI}Åv¸Nçîõ#Ù’ »wµmsh’ˆ¶ã©å1祗¼³Æ‹Þþóÿï° Ù‘ˆÒêóKBôábÁB’%I3!@,˜‡¦²_ z KP Ér†Æ^ñÍ?„ÅÓÔC~©¯ï³jÑ!%äÂÑžáá]A×DôN’±þ˜Z÷z‘„ï3’yt 4žp C Q!ûiˆ±ïU1æF$@vœNsMÆëÏОñüÅXÊ€K>ƒƒö@?]¯¼óîTRÀÆ2!Êøíw´f‰dsÌT’ýˆÊ Å¡‰–aÆ@ŠÂȆ$S–!úÅE"²dÌÙò!\Þµ– ¤”[€° QÒhVÎ.!Këd'GsÈ4‡yi{2òq®¥eYó`ɺϟ½•wqøNVk9µzn»®µO^žÛ6òg¿’šÄâåÜyçÞ…‡Á¬ÈÞž:+‘O?ùâ!£ýò٠ȹК‡¦ëÐY¨¶X“˜(£‹f–²©@çÞÐRÎ !eóÈ ‘r.]¤œ,1" …+" ˆ$/ÅK!i9ý³ÿ÷ÿÂDÒ~ó·çÕ÷>{óäÅ“%&›› /vɧ ä5$ë^ìú½Š‘?R¤˜‹†ó=£ë½ÃÿÛt¹Ÿ)u`ìx;µ®"¿ó6ÿ_jèüÆœ¼q'œÕX±¿Ô¥:••{oÀlJlÆ×F6ؼñW£¸–°N@a­W÷&çpßÞ«ûw6Zo7p.T£)&®Š4ÑñÆórsÑU ˆ¶ægƦæñ÷+ŠÂZí‡ÞÎ4Ãǯªõž5gÝ÷Þ“æ®Èeôácô ãØ2ËpA¾M#ÌÂ$—ˆYU16©l„°ª\Í¢© s=X^@ܤŸL—Uå“l)Ÿ_RQS @Ó^Z.²TKA !²ªÕ¼Œr•°ž©@Œ÷8ÑÆï/,-‚{›®çŒs‰• S¸|Ù’±ì™Zê¹’.¸sª¡eÖ쟈«‚uëƒYUܪý_)\¤NwÈeÓÏ…­¥]ÅsÌÓ[+wµ¨äìg´©rzŸëÍJXDlµÚ¹oøc󎺽­‡[ùXrnyU<÷™Ìûø3ÆY]Ñõ®ÒWÚ|Wœ…ͧ+ã-¥Æq¡ÞH¦¿žÁ’fc3b‡65–Š…Ü`w-h@‹íõ’Z樊55h¯Î9méZ˜nÚ¶Æ5Ël2Ÿ2ÓŠÑNˆ¶ú¹MRö•€ª¶ÌsUGæÆr\¶’¶ä<ª¶Ú$Ö`Àñâë Û–¿à¡Kr8(¸cÅiã¨zD8ü¾0eûCc««dš[)õii]rvÔö.X…iP·8£fj fNe¿qà^pW;5%õêâl{¸Xq¶l\â‚Sª:ÐŒ¡Âù~Å•=:½Óš[Rg¿&ëƒ[Ô6ê®ÌU]S¯åŒïHªqi‘M %gVu'5ëǯi•\è-o`ÙÇ:¼ß ë¤ ËyµÇrdRË^§ÕšÜÒ^Z€}zeÀú˜¼ƒ*37ȹo híÅ]?u)½æîA!àN ðµntÎô“u¡öÎÍþYÛÔl‹àú«»Ý¥j¦6‚ Q!l^êý«¾ÔlYÝÉŽµü¸*³v¦'Ô5ÈïÆ´4#¸êaä ux‰ÍJÕîOsÂK©Þ›îŽ©2ðuAtÕTßþÞê¼Åd“ÏÙ­ûængíON€¿µn¦jof¶5V;µfVjôÄhÕjÓ¡ÊÔRq•òö?ÿ¬;Ÿ~úü$—»÷Z£—Ñè ú°IéSJ–Œ4öÑB#®ïQÞÂÌÒIõlx:L¡(w¥D‰ÀÑÊ›–¤{‰Qð¤¶mígîÆ”›Vѕ΄†äÃÚÓ9T`–Þü‹æê¼ˆ„Â:’0Áé*0š%1Éh”[. },<ò4‰¡@”€/ JO®‡쀔F‘^Ae€óôœaḭ̀w¤„l‡ Ðô˜þ§¡HßW¬ ÆÉßë'ݲ'BÜw8xì¼ –¼·HÍØ¬`ƒ`oÎèáFîèãìf° ëûb0ÛS‚„7?EéóØU@(Fs€cpz{8h Óv 4Gn2‘%zWz0Q„B­š…³”0Âh€BYn²Ð$˜3!E"`Ì”LåŒ \H’„C8‚€ ¹&+€÷kW ¤’åüJíswh4¶^Ȱœ¢(‚!XŠÃ«8?ÓhLå$„Ó„Óßœ›£Ì¢ ¢uv0ÎTòRZ= Z–ëË/OožžžJ?ýµÿ³·mêºç7Ï]ëí›scÑíññøê»¯ÿóOŸŸZ<®îÍ3È®õ7?}ûÙßþôøÉ«â d¸äÁâ¥XJ–r –ìáØH2Z°mŒaÙ#Ht]0"¡Dƒ£ë§,ÿíïý^Ê©—–TÚî·~çw²56Ç‹gÙj>ËèhQX1Û¹*{kÛ-w®Ú¸ù©ÿªÚÒoXø;EK1¡ÑC¬œAá®zÆ—g4Ãõ jÉŸi1ÓÍMà‚}ÇsçJ ê5œÎd€õvÕ–y6Ô ÿÂCç/ómŠå$}¬ñ«5~{¥6ÂáXçf*øãä¼ä«p\OƒU2WŒÝÅ"írc[pÓ¥Û1sßµ4À¯´§¬bX\}“öêr´-Øt.¡+­K}ªxW)»MÍMçfåkIïS‹¢eº`7Å7»ûpyA8•1Êå Ü(—YUÿ^âò^Ö~0³tEª!ƒœ'hÞc˜>F+˜6oÞïýA¼W7JJõ•˜q{–Ö.õ‡•Öûƒ~¤€<êw°]¹ÍËç;½µò|×(Í{ÂßCÐû±‹[7ó"BѺNü+ïxÇMJsRö;ì‹ïÿs_û˜•¤Á2 ·-T½Œ€»j¯›ïU~£_n çÜÕ°ŽIn8ï5?X_Ø -“æÚR~É“jGG…{s€ûËýN¸ö‹VØ~ät=²\{ˬ'fdÝ›+w]óµJ£¾‹›zÿ*Þ<Ö¼;åpóVw…-ðúÞ)²Q½g»^÷a…ÌÔúso.~ãú³Þ¹®q®ê¸œ+…¥kI¿{\šœ†•c¿lËúhæà=oz³` JóÞ¤sjiñŒ)d¸ÿøG?:¿y.mçÅ{5ÔK„iØ/RÏ÷·¾®>õø£¥Ô«Ã î1¨À Ò¯ê»Â™fžŸŸS²(EЦ!GJçWx}TRœ;OF£%šS”s›ó!Ll;òÜ…çÅ—YqþÁ½}öÖýT@f ÷`VjØeË FA&Yî5{À¢@s÷ÃdCh»'ùXFó D׫#ƒ‚õeïŽð¾Œ$ì‘(”fƒÀÀÞ±æCq‘âÀIƒ„Ò¸'*‘ã¬÷c„}¸jÌ:É Ñù>î/‡€ˆ1uiV4D@e¨A}Σÿ­4ÔßLÞ³ k b‚Y“RÈ;—º(ŒŠè3“Y¸å$Œé¹HËÖ@à#¯‰&²»?ýÍ›Æ=á@ÖAg¶.òã[– J¥ŒÌé›"`Hì•$Ssxu8È‹{×¼J©‰ðP~fRÊêÎH}EJ‚)=ï(J9ãáˆãwðü†í—OùÔá;ßÅñÁ¼ËX.fQºî©ëºèÎåÇÿë¿`ÎÍñøk¿ù÷< ËhrãOúÙ_þÍÃgŸ,¥ôp`£O?} ×íz9¿=EèðÉcéÜFΤ•ç³¹{NR~xý )ÌL`×µ–Ùä”)6 J’9:—Š(î ¹‡B!ð áݹ-?óî¹=¼:þä¾ÿ›ÿÕ-@)¦R¤ëH®R—óô~ä7¹`ì撬ò:n ¼õ3¬1ñfÌ !„óÊ¡½ÊÍXó//t¾J¼ÜPˆ+Ã}ÃI´Bé+Èvg¥®[ëÄïŽ í÷8/ê?îˆÍïÿ3¥wúòêêvq©æF$k ÖM°‚î|ÐFˆÕs_r0ÒH%ô!ú?·õ>Û«x=o†ø®_t-È·5ã#»P'0v· Ão,Ác' ;pß~¾ù~¬)p8®¸!ëçbœõÑ·©’ØSTf§oÊ Ïšƒøá‡~NñÇšâg…A5Ùü›8ë¾j(¹ö\ÂKuñ;沕÷s²EÜð`/Þêײ„t©€oöø¯<ë9ÒUaÛLìúcì¼ÍâãqÁ>p× OûQêê[ÆãÇ?ú€ç/Þv§6ŠGùAÏJ1šÑ³Ì˜r¶œS2îAF÷0!$÷ÈÙr“{ýC’–’ÑB F(àžY–Ù»¶;e&¢ø©ãé`·rluj»·S2˜:WœSN‡&³+D«&{¦€îÏ~$ïžÎ]*gµm´}·¢” ÒØäbfBô…ê*¡l (Ú©_¤ 0 `0ýÀˆÑOÜѾǘ{_k×—ü‡@ž$ƒSþ ë ‚” ‚pD‰ˆècè¦Ø`ex‰®dXFÎÃ.>N§>=`Ã/¢O6¤Aº ûGÀÉ`',FÌ„ 0´Ûh•ØŸ^*`@!UÁï {íRêE< ˆD6Qºžh¦ôß7O¤ ‹–á ¥tH¢x Ïál^¿QÚðNà¡憊@tˆÖ‰Též™,š@Š.,›Ÿžb’™¡!M"Ñy¯{ D”@ç0°l–³rÈ–¢”gÇ׊‚Ó—,gä&š¬>sº'¸+ðB}á´)½ñ\òCÊ‹°”›ï¾ŠŸüÌNçæÑH~þ£¿N ýÔ~þüü&ñÕ¯|7=}Ð1ëéôð˜CxzsÒñÌÔÅÃgß)ˆ8·¡öͳ4œßžR“컯›CÊJºÀC“GS銒yrÁ<*q~:[Nа0¨´ÏçÒïüñ»¯ÿÝ¿þ׿ùÛ¿#Á’¥dc6ßeŸ8ãZÃÍï–öÓW´ÿ¿(X;%ðŽúÓ’žîN/¿¯ZÓ~ÌÜ[5õ-tžÛŠ;/–p¬zʹ€:lTÔ-‰K³`¯ÜEœ×‰×-Œ³Á/sH‘Ö¶YõøXô£cƒ©-–î𿽨²ÙT«T!Ct¡ÌŒ]3—¦ Ó¿¿ç¼ FËøÂY” ÎrsŒÈ ~Z—˜^šQ5KÇlHð^&Ç,ÿ ê-pJOPœÀó¥£L.ż"‘—ÖwÕeÁ`Q4¢ªcTS3 jôÿ‚çS? EýãEY 9çìšž+ÀQg¨Jï9#-éK1:IÍИSø·xà5‰³>/mˆð­ó‹šQ°çÏ_N]´ÙÇf¤K&ê"©;ªÌnŠ7ÓòËÔjs¸š¹<#´¦ñ‘µ~Ôñie,îggc­š0ôNÁ']Ûú„ùs`“Ù5=,«!Ø»èªà{¶û“{ñ¾µf —okˆž¢šËÆsƺš?§I¶gZ`YnØæ›Â²NÜ nnË~k8^Tů¦IiÑ[Z·ª€Á´`ÕYÆù]O‰ú…R¬ê-zÚ¦8ÅgÇÓÂ72ãëÜÒ’ZVG^kÖ¼œ½kÂ%H˜ݪ ƒ[ý‰<៙s­vצö­±uKé¸ùŸ=²¿wq3Þ¶œ¼×¶ÜµTõ•¦Ý-Í·«·¹“ã= m¥ºuvIÃ_uÜà êÚ°”r¹§¸Š·ºß×vïÞ6ý²®Ô;&ºÄÆCë:—Wõµ¿úY«vÜwà®o~óW6 _·Ôß¶m éŠi·rÚ®9c½¿àßþãý¸ÿËùÓ•(’‘L)59åd}€¤1çÌ”ØM(¥]Á`˜Ý#甎}Z¯&%€²K0[óêQáI¡ÖóùÙ€Räù˜|>YcFúÓ’EJQÚRš‡ƒÿè¯ÚÿüW§héR) WÛ©tÌ$2æ°lb„„„™$Â,3A`Ð! ØÂÒX/OD@6hØBc=pLhއ } :0DÛi ÃF°„¼ƒÙÍG¯‹ Pðу ÔSƒúŸì‹÷EÈ ¥}GÜlÚȧ)g2Üé]'õbÞy×ÇÒš©9–^ úÂÔ¢‘!µ0¢IêÉNá°b`%•"(º@(2‹ˆ/[ì‹Rþ•_ûìñ³‡¶}xú«Ÿz÷Äñá`Ч/N§Ó_ÆÃñðøPÄœ~úæ1“ÇcF´§ö¹<’âÕ'GsoáŸKcTG‚¥º_¥à1åD©”Ò×t!G˜‘"“1œámiˆ`¶Ó'KæÅÝ€{äs>éÔ<Sc&¤œ&¨;¬:í§Qk¶ùâÔÖ­lü×Õ *Z9™¹(ªx!ò…»:ŒW“å\»ëÚ}—Z¤-Þ®–gæþ]V?_ÊMý%‚Îkra*«ú„¾Àq ÕÑÕ° 溘ej© Ì|°áy/çê…E67¾Ë ·õw&õ»úó}2ýý-7Ýó+z™Oy52y«ãP@>•ÍN¾$¹ìz^1Ëy?ë÷F^e‘zà‡vR® Ñ "_»j³_݇wÕw„”>(%ß~¾ý|%æÛGßb¾ý|…/òï-òE1£ñßœ§ÖÇÿ–_úÓ+gõ’xG³ôÛχ™šwu\^y«_Ç»[uxÏ=Ï‹‚抟³£f™àWö$ºQÇÏ©‘s.÷êé<%ÜUÊ_þä'ý_öÌï=YKf)å&[“RÎ4¦œ%™ÑR˜šœ-"" &ÍJ¥´‡&§œ4£¼o·oÉsÎô¢Ò¬¡—(’'Ð\B2?4~:+¼9f{u”Â?b0º7™â§2*€’Ïñ£6çõ|~Ž÷ççR¼.+Œæ¢u*ê”"™†~pË K*~)°EŒ=ø$°Ìc¥• òöDÍÐiHô*Áa 8@úÎ9ä=@ÞNo©kAÂ/"Ã;R†#ÌÆ @Â.ݬi,Ûøú÷”!¡´°Ú'@xý·¬&x@g€ð)Á{ÚM‰Ø c,™o?W¯ lià õ£Ä>¸BbÊ”Rw )dL’ÌLÅÁP"‰âʇ&5¥µî©S“¼ JÛÙ¡Q6(莜Râƒ5:ÎfȹQÀÝ,eâ`²ÌÜ„'É,'ÒiáÌ‘ Ì’P¼ ÈÝ# Ü-rB ˆÈpW§^™!h!öÌi¨±”2J‹(€/p‡†CR)!g€Ö¼zð?,l’Ÿ»óß|®RÎE¤Äó—§"5Ðwå<¼:Ïÿùs9'Z¢¥8£{.hòá³WåmËCþÔN§.!fñöm{JùõÁ‘[R{°ädQ$K oÏçNÅ-'³dÀ—ož‰^×C!$>¼~ Òv¹É)§”“¤ós›r™òDÖ»¢81ÌwÝ(ùÓ7ç!ëÀ°‚ï¶Ï¾{C6`v0]™'?÷ÐùUàþ—tÑWØÈ´m‹%]Êï=Ú…;³!ª\Èf Ý̇m-oh«Zh­B1é‡q·Œ¼¨¼µZ5üÚºnt"Gk‰Néå—<Š ¬³F=Œ£=»hÖÛ¢êv¶k¾ÇŒ´f]ÄêåzjHpÕuB‹ÂêTÝT阬䡆˒°+²áãH IFNè†a$—ø4\¼ÿScÕ1±žÄ^d”³ó.‡šp0<å¥l~Ayš5 °®ÌUõv¦au—§÷ÎI§l†,©žƒØz˜Ù±VT¾ðÖ{À¥ÒlîMψ%_MóÑkÈ꧘rŒB%@5ß|µz7—t-g“xþ®®5w@[%ç“Û¥zóÚøÝ¹Kºëeß ‹Õ•eûº1ÛŒÎïu¥F¯9-ìšrOí[ß6²6JrçBõÜ»üüeÍJ f½XÔÙmTÓÏÁ#UEl=ƒUõim(;M.¼T¸¾$’¹Uè­ŠÇ<ßÕ‰¡¿´Þêž–*¾*'äF>º#bÃU~¸b• p¡Ùv3nÔœ=·ñ¤‹#y{ ªzcU;Yµ;­VâþÀé-s)™è:W_]u„O ­ "n¾É›[ ÛíˆÂ.eiÜêvh Ó½jþ¼‹-z9\ó±å-{uQÝ«Õ6s¡-=«"ì-Íi5N´$^z—¯”œÔý™p§òïrfjw9ŒÆ³ó‚/ÝÞâ7wF®ÎÀK«¶ê?\­Ìbe³l_k›ëMyÃ'¸ÛûØ5|o¸ KmÔ€—É%»Üfßâ9V=ß¼þÅs¥Éz¾'eÑÄ}³àŽ>˜=¥ôÓE‹ÿ_]Y‹!º/1²hów’NÜÇLŽÜd7]Ž -·³YX•s2ëÊÔ|®7‹M¤Ò=€ ýZÕ]`Z5þK{%ì¼í¾=øZO­…„wÕ\=Œp&Ú¶:—MsÐV¡âæ’Ÿo¸ó.‡aÖ­OU?¾@@ÌÑÇ«“©rà50Ö9™ò{»IHˆ@ •ò£¿þOýßœß<÷ÀïJÏü!)¥&¥&YN–S2£q€ƒúPÈÝ%¥œ{Q–“:…áÞ‰mg‰Ùh0&Šn0–³•0B§S9µ|uÐÏÚôøÊ’YÃÆ®SÜ#"ÂùpdÃî§oùú©<•òG'ïŒ)’ZÛžýtJá(ÁR¼s#gG¢Q–šæõcÛ‰ÉSî:w&„€–)‰í[¤4„û É, Ié‘é!E‘HðÍ#RB9ÃHöðIzŸÐ}ýð€èàçÊßò¿áGC¦A‹óc†”}Q¹ ­ö9 r(Á2ƒ€ ¡AÍPw¤rFéàOöyøJ `ðf_ÁÇž†¾{€„ÒÐdp¡PJ  AÞ?$Dä$x߯ ˆ°D&Á¨D!ä CŽ(‚)¢' DÐ`¹IÇ#©/QÎÏݳ¤Tž¼ëºˆ`2•Gs ɺž[„·!É:²É‡‡thšW‡ð8½mS>ZFw>Gu]j˜,Ù ^¦ Á“[(œŒˆ0 †ÂEКìÏîE‡G(J ïÀ@j€@iÑ>3k“u¼Ð˜H$ tÞþìË;K­Ú¬tjöø³§WŸ<¦&1§lÔ«Wñå›óö–ùØÙœÏçâH¿òY´í—oN‡ÆÊãÃÓÓßyƒ,] K‘ r²îܹ„ÇC€% ¶Dœßx åæ¡I)…cwöt4’4;?_}ú*59šˆ°œò!‡{x´ç6Kx:yDfîw€ëÖß² ¹Þ«LêìlšK{ÍúüJEû߸°‹.žˆÖ–úޱgY­ž¨OkÎ1>aOÙæ.Ó¬°xkèŽU.s„ËšÆÃ™e¿;Y~!¡óã¯S MŠ Ã¹ÉËÞZû´}ð¶2V¶®VNxú¯r,¨BÌËåE(ƒu8z?nqéä®Çª÷‡¥I†Ë è:´ëH³V!òzoÑYÂù«B»‹ªsyf­]4i/2¢‹ßRÅyW1±zòÔê¯y4»Ù݄ͦšu/WÔÌÛÛú¤D»™ƒ¼³ îÚW_û…ê}h/n}=`¿‘y)@ŽïZŽ’©¸žY5Æ¥îxÜw ½ñ[¾¬_þºl€¶˜Rë^òûfÌ6±V;¡û b:æXwËí8/ú©@•;}㞇 95h‚‘wÌ€+Iʹ“0ÏkN¡º¢m¯ OZ\üá&;…ò÷Mѽ}·æÓlŸ?p£‚L[Ò$Z<Äò3;%7ÇZ÷Õ¢HëmëÒæ.vûŽº+k©®±P?ˆýè/.×9½yò¶xçá>dß´Ä”,&C"Ì`Ö³lƒffÖcq>iv84vÈ w„¬¯ªHòâF¦”§³ÉÉ žÝšdE2q>ÙC†ËÚèæ»â0óÂçÖ!½z€1BÑÅù?þ°çÚ§ƒäåôög eÞž²Œ´@1SJtëͦyý‰‡§¦m)bŠCBc8ÇaK Ý–à½2ðx8Ë‘ ègH TtúiQ ¦ÅãhŸ‘z€Oâþò¡xœ„P GhÐî ú(_cȘ¡íQ?KH(ˆ3Ò˜ „Ô€@i!! :G>€BtãÚ0H°Œ”á-Ô÷pRHT°‹¿Ò‹ èb®²¯ÓÐ+úNH}'AŸ.’;ÃFßL^$§ÑÀtŠðs:$„¦R,3<”3ÈÇît.:[†…”,{G >‘Ó(AoáaPã…éh¥í»æÀ(ò€C% %³ Â‹]ÈÍÅ"²ÌšÇèÎÞv¥G„J;ˆ4°ïç$SßàÝ€]¡„>ÝX//]ñ/Ÿ¼ÉìZ:K„Y×¹}絿yÎÇ|x<$÷ôÝïvçμ;6éùíŸOžÓ'¿öÙá!Þèô³7zÃÇ_ùî¯üíïu]yú›/¼- ¢É9ŽMëñtò‰W™È R×¶½LwIÙÈç§§Kçs›svw/®P)^Ú®œ»îÜ–¶x)ͱqÅßý­ß2Zs¬ë*wݹ ú*ß{üÄ{üLÝñ•i7¦ƒ9wyO}%Çî£H‡_I”÷ñ-ÓàÛÏ·Ÿo?ß~¾ýüòž‚ß~Þá3Vò~;¾ïâ}'a°±¯¸¯ñE|jÿíçÅ~öFyF]2ɪ7¶þþâÏ~°yÕ>ô_º=ý†è•z­±”3R‚Ñš\BýÄrÉDu~z>§Ö›CN‡¥t|õà€—p¥l sÇÄC¶L&áQ” "J׈â¥ôj¾&&3m‹tÞÍ£•sò'!™Hûyùɹ}sV)f0“ÜKWü|ò.$£tn»L4ÖS~T¤p)úéó/Œv|ô3=gä£:GÊhÀ‚Ò¿}´†d@k0B˜Ç²Í@Œ¢ŒM˜° &xãdGĘ +">` µ£WßMHyÏFп¼/« (€ *ÄÞöbP  ®!ô/!q|Déʨl0½žÁåVr·$Èàc¾,Jäy/m*F ™wÃÃ*Ð=K ¯³Yr/Ög@#`64È…NJ)=&A¥uˆ„)aî‚¢; åÙC(!€O̓ydc“øúðˆâ¥ q7…z!b6螟-)gÈObI¦(’; ^EAâñ!E¡Â‡F(dHPÀ# @é†EIG”ÓðÏ}:GBÅÕ3l”úPS¨à!‹hûç6@;Wz:3ððÙ§|Ý|ñWŸ?¼97ßù¤MÉ(½ÊÊMwêrêNõ“§¥ôú×~-:?PP¨k‰xøô˜Œ§/ŸÄtlr'‡ ÅùÅÏÞâx wMJ½ôÓÛ³ ¥ó~—þü?NàÍçoMwj!•sâðx<<¿û+Ÿ_-Ù%Nù­íðíç^óæ[èöûý2¯þ·¦E}‰ì!<îñ‡¹¶Ýò´—Ãä;Ì%Ç.-Á\Ü¥Óƒµ%ÚÁ}ér÷i©å€L»™®¾'¾« õ–Ðqÿø œÏZV‰{c‚z€Õ’kÕsk*,‹Vîd±×'~]ݳ~Pm½?¾lÉ-®wíf0o-uG ÛªmsÙw‘̹ü?ÎvIn¹v–ì­F«å–²¡o¶ÞÆRÜYÅÃ|oÜûÆK‹&GpðîÑuÇÙpý´ÂÇYÖSŸ¬6O®»œ„ «}U…™A -oµ*fcrKj{|4¾Pçvëþ±÷Šoð^lèmãyv?sÖêÕ•ÿNÛŸx1C±n8¾9&ëÚóÅ3îܹ–ä¶Z›ª•u¥;sfÎÕ´©yeÞq»×ôºhbõŒUóßš¹;‹úêRñBÿÔ|¾jÃæn³ÉbZÈn:b³ëŒ…ÿ n†ôº^%ˆ9Æó%š(UÇòÌ6Á‹ïîZvæ©®„½x µ~­{sg7ÂÌ•ÁÔ ¬e¿#±Â|NÏüöCÔŶ$«ª/ehé0ZJ4“179–’ùQ)9YDx ‰lËÙÃ)%K ¥<·‡¦išÃCÎ&çDï::Riaˆ®øsgFó® 'C*ê:Q9 ‘“YBs"ÏÿéÇ~꜄(Dø¹È½íÎ¥t^ÂKII™baEd\‚…@6ÝÕg8T€ kÂݤ@ÈRîÂ…\*P‡® –‰à!“©—¼èˆblËé éø¾‚^§½2Sˆ·¢ :è¬Òž¼5Y>fÉ»S …œîž’!‡"$…˻ҿr†Ÿ‘¼ {èÎP7ˆF"gÁ%h.ˆL¦ž®4„Òúž ™™¸Yº^r×Ñ\->Ÿ˜³™9%_¯øþÏ¡ƒ[–à†ì)3'Ïd&³!çœé·¨!*¡žÍŠ.N’¢Àõ®sQh ]$ ´§t"£—¹¥B(¡£¤NI¸F…™+WpETµXžäªç è`†:¢Âl¬'˜aVQûÚ•Q„*•¶_­wÏßOp‡%¨VÛ^ŒuqΙãï8, "H¥¦.( ]¸Æ.t|4–«'Š)®—áé¡A†—\ú®Ú ‹ÎÐ/K€!—ŽPh6=vjæ6“1é#(DC'Q,%Ï®*¸–è˜Y šâ)+/¡{á˳H—\B¡ î9õ–ܲ„¾ótõ”Å*"b‹¬ '3‚8’ ÙÒÃ_¡5ä+ÄYHP«í´ºÎyy,#mX"Œd®ë¢áU©¤Ì±9IÏHuatB‚_S½ —Aÿú1tzOïNÝß+]øøç飯_¥ix~¯—ô—ÿí»~}N¡ëèOÿçÿI4ˆ é:ˆ†d–¾7 æÉ@ækfÌôôÕ;J¦ûÇ¿~t’`ìcˆ!}ÿÍûþÔåËpùxyþúÝÓWÏÿóÿú¿j§ªÊ––¼¶¢›MnxO&ÆŽ'ÙjW?–òÛíûæ¾Ì×­õë,ûœ˜Må–®MëÛ\~Ñš´¥£r”>¨`ã«C~¹§l¬ÔámÀ"¯¿<ÒËRO—ÝŠÕ¹ï_e²ügôMž°m3wƒáÃTÉdlµªÁŸ9¥ "_S~t£ŸóK–™Â• Çí€MeͨQ-‚Ýé¾ø¡øpÚñõ³Ã³)IΚóæ¿Lœp‡ÜXú wõP¹•¥½s~k,øÀB/¯L`Égýp_²’‹~˜ßøCüÊ-¿~ýúu_ü%ü¦_ïèSîä'ºh°­ÞùRk¬|ÒþbÇ÷#™€_¿Þð|åÕÄŸÃÀÜâæ_sqür½±@û*²êh ˆZSâ]…BöªX†d›áÀ£÷Ž‘{ɧ»9lù¬côËtüPëÿ\û?V§‘›ô¹Ìe¢œËnHÿÃ?ýÞÉë÷/4·l9g!¤SE5¨¨jÔÐÅb÷b!fx£æÕ&·©7gt*hV‹»©fÙìêûY¥†tbu Ç~"»!g||‰Ï'\ ׫Æ`ÙDU»ŽÉÄ3C‡ä$û¨ˆ1™‹àòçÿH—!œÊ|¹" H Èž‡aH>2Ýn¤«2Wï %àb‹ºB>} +¥÷‚ñ `ÈV‡£ 4E1W)r<ƒO4mNã¢Èj±Ë\±?…èÃ4ä$ „Ì<*òÐ8=—ŒŠ#èÜœX2 X‚(Pmœ»ª»7HHÉ%LºÒ¨þס†ž ‚œaVù?ź5 Ôk¯€¡ƒ{%UC`…*PJû}Ä ;H8ª;±ó€ðjx 7 à&"0¹¤UH)_Rá„æRì¿Â¡‡g¦«‘`aõ‹ŠvJA¯!ˇ„(HqV‘Jù\Ð^R~q /*¡CP¡Ó=¨`é’†˜e'CŒPQ $¡6$W•œ2d ̸^¡€8hð l€ ã"§Õ¹ $XËŸC¨à  p‹'… bNƒX£wE0†’ì3Ë>˜Ècˆ¤×§ëKêƒÒõ݇ï=Ùù7_Å<¥Ë_³«¤þé?þŸÿ/ÏÃ`®ö"§w—ï>BÃoÿ—ÿƒ 4çÏ–SÊ)›9ÁÐ…Óó¹ï: ui§™íO}wêþ§ÿÛÿ=ÄPxÖ§§ŠhʼýG²Aûw{íÑÇ«·ÑÖH±íw^–®Ü÷_Ò„nt‚D¬w—qã½ÈNqÊ ïª¹ºŸ»/A–çµ±#kç]Óêɱ%FÆ ,,@tGÊ¿,Í5ÊÔ ÂKtV%å¶\PšnñvT³É^5é+ŸÆØ<+•9’Áíº¾Û穦ÿº$ÝJ/m“IÜm9ž:/x/Ö—Ï/)a=@¹žrûcó¿yYô=ãGGSÕÚ7­ c¿ï{ ÿLÄQ~ùÏ—×-å.“ŸWº!ÚPJ>ït<’·æ‘¯<í·24©)ø{íäÝﱑ¶cCVÏF6?ËÅ´ jáxöo+Nn±± wSÞ¿-Ê•£×Ƕ_m¬´mÁ¶y³ìy'“ú°ííöcÚî„-™zÀ7’¼i”ÊÁpØ*‹V†å!ë‘uš¯Q9ea$Ì·¯pòׯ6øÃ²ŒkÑ\tëwŽ“Tøð¦Áå„ß Øå¡¡¶þ„&nþ\²£È§·YryãÔ¼-´_ÜÁÅŽ¶»ê𭠂˰=ÿ¼E)rpÛöä¯úOúNxôÆ^/8Ȳ¾­™½ Òêñ’«Vý×±¶»V€{דã5EÚ+æôÀe/Å€6ôí7OÍLr£¶n^]·Òì^N®9îÈÝó¿wf½õß^G{`cÝÛüe·¨‰‡Íð-/sœÀÂeƒöçÖ|¾Ó ·ÿñÝË_¾Ï©Xzš{ÅÒŠª(Cáû‡€ Ý©wxŒ1vªJ×Åœ­Ô-«ˆˆd§gïû³_®è]˜Í™µ`eR·þtŽiœ‡kPZ§"`Ìy¸&! I9]³}âs¯Bs'4<Ÿ ¬@ˆÂË`þgwKÓs ùå£_‡ôr%ÓplH–2’»»épñ ¡!¯â2;I…(AdC­^cG‹CB%Øc;ÊXØgP. U!)ª""(¯9ìO@€ghÑÜö¢Ä•,î¯EOgªº°[-™'»q=Ô±l¼œ„œ"ñÇ*AˆÀ WˆBK£jµ¾8l¤®ÒQ|ÒµæS ¡x (èÈ($CzÐáC5°ÑˆXLÀx%åyj!BœÃé–Ð+HUÑ nî©+ A˜[PQéK{ÀEë£p³§<JòJh$”¨ˆjgCvåØ*«©*ÕrFÆ`hâjî,h(0#[bÑ!äT]ˆ†!Ã.ðT_‡^«îOÂ2Ì«ºáåÖZfŽA}ÑNЪ³ éb@™’¥-£²“ÚG"¤„’¼ (@&£ª¨àú!ù÷O}÷Û§ô—ïUhÏçh»¾‡‡—¿|¯ïžý»— ´«ÃŒáé7ßœŸN)§—/4§Êõ’þãOÿvy¹¦kþêï¾îúîü|N—A5Æ>Ð=]ÎTcxÿÛod·Œü^ª¬å€±+qw=•C½â Vyóq–mëðî–wSñ`§ÿ¶=Òñ³Äx‹VÀ#7PÙ»ÅE´ÿÙ6w£¢ySob‘ÕvÕ(uûÒö™ÿl óX(ûÒܵ´Ckϳ·¬‹[ÃzÖºW´ÐÒÈ{g²r{ø_ž ŸG­;ðdƲYaÕÅ"Ëø{5Td÷2WãV‰Ù™p$,¾wÑÂ%ñ¥ÖpŒë¡Ü¢o£[‘½“ÙÄ0wz)E¨­Œãd?‰¶ü/#Û_ K[ƒ~º´«ï¨D5FØÓðhSÓÓ/ÿ³f™<\¾Ö³V¿‹‡÷4ôgÏ„9`çäÚ×a½¯´YÊz³K[íñ`'…‹˜ÜÓÄä–²ÈÆ”¢išžÛÔ§‘Ðd/Æ ˜ÁlkÎÝG°à"SkýbNpûAëì`Sè¶£nÊ͹²eúì‰ë¡ÛàŒõÙº™.”V<®21; ÷%‰] uå2ñ€Ê€veº8Ý4‹Ÿ.óÎËm~xÃçhX`2Çœ…èMrŽ|P¹[õ÷É–Æe$6užÊvi}J¦äèôeAé—åhã^œí„ÞÁæyîɇ ªÁ½ «Õ·íHÝNƒÅ f„¬_ƒ¬·9oHØghµË6wDÖ%éu”àvm†Üø×%lŠ«ßÃEžrUn¿(×Ûðø21C÷÷znæÎ}z~Išìk¬ß×=ºr³7‘hÍË–@n&éfsÜ|ó6‰×ÖÑÌ.¯Yfâ‡l‘lÛ›káä ¼§¶óÖóù¡ÌN·ôÛÛÃù˜:þß±RÏI›9Û !¹È–®²˜\”nÈr‘Ùîî÷²‰²Xbõz<÷³¿‡JÑÙsYœÉEv#ëöÉN©ÈñØZyÈÄü©ÿ¡ä¶ä‘ûYá綠àfõ˜¦Á‚Ž´Ì]y›lVÃÜRÑdM–ÛÓM'‹-èOдÏoÄ‚çÐV†)ÄÆ"#u;ý7îl0O÷\äø¥då¤*²V¦³Ìþ“4§ù÷ÿòïøÓ³”Ý'¢,EA%hPíO½ˆhTˆÄ®37Äì&&¢¢ª)™ˆ Fš›™d:sV è×dÙÃóY bâr5Iƒœûüa¸^®Ž‡—áô͹뻗K‚eôÑT$¹t‚ôrïÏ1}!›;TÒ5›åìF3’–S>2nWfó«ùPLx „Z†ŽRÕkEBtíH‚Yéâ¸å: "4Ô:wÚH±G5³ÂÇÇ«Qнw_Q¼bC”Ë÷´Œ§&ø€Ø!,C€PJòʉÜGKn¯ês1† ¡Våsj¬g5þÏÀ“º  z„ñ­ºt† B.8.:cð/ÌHpª"*  í –«#B¦# Õ&ÁR`A>Ïk7ˆ ï꟡¢¡ëlÈE:'â.~ûsCløÆÆ¼º%—-¶„š(ºˆbl"8’Q@xž‚G¥ ™Q»“«d»Âä©ê±ƒ“Ì! ÈWô'æ„A¨Bùù‚PJS­ëw«‰Ü‘ó3Ô'\@@5Ÿ]žCª5½Ö›Bš@!'m¬ 9uòÜÃ!‹bB *‹Ž€Ð@&HZ¶W^† ¦ÿí_Ö÷!¡YÎYß}uͧë÷Ÿžûw¿ùOüëwùã÷*T³ë_>\‡!†`äÇapçÓû§÷ß~‚Š@ý¹iÙͼ,€ÿãÿåÿ*QwŽ¿²ªð!÷K%eг·…-}ä&-¨›[*ÝZÀYEÞ÷¶×Ãàà6ã²^fN “¬Õ‘lÓ¦˜´æ­ÏeÕ騮Òêe'Ø”å/Ëy¹Pâ6ûׯ©+ø¸ôMnþµyš_t¾õë™#º–ÿ8µQÊîwó@!·ÜÖ·ÀQt!>á½ß®‚iƒÔ–Þ¾²ÔycE»ä(ÉêiæÑ`m;Ž~m<.9JfòužT{jÍ+*OÖµ£² 7KÆßd ¸ÑsÚÏáž*Gжå,ràxç!ü°ÅÛ²Æò>‚ß¾\ÞHm¿a*}JêzgÚÈ^íÔg¼âãªÿýoþ‚÷¿~½zÙøRòÓ£Ëæ1ßå–ŠÏš¹Bü?þà‰L<0Ѝ.ÌyHfBðâ~ý8||I®6$ZÎÉ,»8…»„ JbF…”@€¦+D ‘EÓ/Ò¿j pG6B蕹Pd_jDèE7ãØ ¹€n€C" }QÒ_`WX©wØ>¾}Ü ^g! €ÆÚ©Pn[BM<„÷¶ dA˜.Z|qžº×Š,Y¤ê)!S)ŠB 7X‚Dôgd¯—Q¸=ì#N€‚V 1@O€C Ìs–"t0ƒåê0ê…#žä: Ú!žpBjÇÓûè.ÃOÜx…²>ðÙ®£8è–yPƒèž ŠÐCÜäú‘“à.SŠÕ˜Ï_{zñÁ:€RæG6z&À„á  ¸ÂbIØ–¡@| O•€”ؘ+Lž ¥YÁëûÒ)cPEì»ÚSB B'smª ‹œ•OrÉ‚@ë"#—qxÐʪ§œ6$ØŸC¤~y AœÉE¨¸þû„dÝ×_I‡á{ÿÓË]ÂÇ¿~âJ?ŸOÝ©ƒˆ!†o~ûUÿîÉžíéݳªäÁ,›å,Äÿðú»§~!ü,›b?çÆ/Å*_úlõ EÓŽ¸7•%ül!aÃæ˜¼—nŸs:ð#ì¯ÿ½?wèü8‚îŒVùò~hüæCéöÐgDá›ÏÏÛDËQð}ó´²à[ý`¹¸ˆ]›ÞÕñ_p`d*\$Få¦vpèÞ9µ-Øܬ/ã]U¸œ;àâúŸÇбt]lD*îNrC>i9§ûUÐ3€r[’?uåon\öòªÛNÚbà'þx\ƒþZ1VÃ=.gÉTL}/ãöv1ë!öÕ:À7ÜÞ¯_oy^¯™Ÿîà®ÛÒ­Á/ñ‚åÕÏ@>ûÆûöl˧?’Ùh›$çZÅ•U¤ì©AŸ"Ï ø" ¹×@³Žyo?ÙXæ¾zøÎ¥¯‘ý@úeõ¦‚÷¸áë/þk;긊ÄeîmÛ£|lB´ŸZÉéÛB.þáÒåþÇ^Ø?ßBù@6í莫ÊÝÇÎf)+…g|U¸t‚)òð¿.áñ¶ÃìÑLÇÒp§gø5 €Ûß3Ó}äSoµ&ívúÌå–Ë|À60öeï—V-,6?øÒ!àÞñõu;á2?ÉW-vwè•þ>23§’ÐÅʸïE 6’üÓŸÊKyùˇárõd4 ª1„DÕË:Iªj *j4ŠjÔÓÉÙ³!(„0sf  dPq£(43ЏSz¸ —±‰¡”/+¼X;%šF€êÆ’í¡"é%Ã¥yÑ÷‹­q±D®‚òÖ %I!JdÇõ# ˆB€9}¨-ªµþY ±8\H»ŽY´Ñ³sÐ P€0Xš3.*p‡åQÌ(¦Š>þ,"P>u ’P…  ª·0õ7 !§jÛ )! H@(*"*ÜéÖQ„ ¸ •LUdß§eô 8ðD¡2;¨ô„Dàãw§»þœAœžÎ}—.ƒžcîƒÎñ•z½«+È:…° ‚‘ÎNbh³$-ºÜØæˆVøÚÕŒ?BAl“Ëù[»Ò„ hzFÍ5·Î<’’¹ó÷ÒŒ`N¬¬Í"UZÓÙ¤xœ¤Y sޝ–7•mÞI£aÖ·•€7ž.ö˜;{!Ü&Eni7Œî¸?ÞD@ ~ïö¹˜íU[m÷ø¦TQ&ýt‡:´G¦ŸØ+ß ËÐnÜlœ!š Üg È’©Å½—8ñk¶Uì[*¬â†­ ÀYY.½2³V}Ÿó+¬ß´ÂÄóî^Í­Ö†E‡š`ùZ—P‰<:¿‘yùÆ–Á²Í0µo”O¯ú dùL€;aS´±f ÏºË›FÅnÊ•;^ ÛGÂ¥šÏÄÄ&‚œ÷â¯{\õd¤2ÞŒSkFnù«é°Kœ—8¸ž§»æŸÛ‰s”+P¥qxLƒCä³×ms;Z˵r¹~î°(ÛæBY±ûgÍ~U}ÎD8ÃeÓóx·•úá>7o/ö*n{¼–&³JK®¼ nd„&ÑtY‡„ƒw*[ZKÓ5Ï ÁfeÚË×Gi·ä=êÏx˜÷RWQÙ9¦oÎr”4ßÛ2Ò°Û÷¿…«Íp¹Íî¸eö>˜ å¶ÐîM÷² ùà\¾„Y­ƒ·‹³¸ýjÎ\sÔf\åîM‘µ` ×Ü~ö~Ä•íИëYuW/rªÓÀÌpØ6m˲¿]g§ZÊåYY ˾¡¬c‹6i±@ ¬—Çq«¹SÏBiöQ6˜{8Ò-¤h›íâ‡M¦ý{ÄÛ`gþ˜?þîw¯SU/ß½¤ËÀl„B5Õ €D 1dwN•¨Qƒ¨¨ c(OÍHo]zÔhÉUµ Á¯n¤¦k6>Ÿ£ÊøÕ¤¼Æ@jïa-jBæ ÂmÆòíddy_”’ñìÝ.@›²õ;YÄ=“¬¦>Hös)"û„`üľ>Í´ŸPB8çÜí·ùLîï@½åYý-É«ÆÞÛðX ¿i âOã¯Næüô)ÿÙ:xìx¸èÎiþ=à¿|†bÿ£vÆë=P_òÚb»Ÿ¼/“›4ÄÖ†ìµëæºsôVƒ_Ì’(ËŒÖrs”—Ä·t¬M;sç'÷õ¶:õ]i»­õyô@Æ6YuÔÀÍŸ?Þ8ÿ;^zpMh+ƒö2›£ãÝí~µ=ÎÈß;ÿ߯ª~Ù°î5/ckQ°ù$yåï|¸`÷Ûˆ…7Ñ$Užý²©”sÍ¥_øã?ýãnnID.ß½äËàf‚Ú…îÔKPÑ’³ AUµÓzNO9è5V]Ýݪ h”AByДb×Á-*=Ô! â0ó(r%Ì#yqx„ 2_L»èÒ«ÀI@.ÿô;Ìiá©‹0;”äšÝ…—+ótµá’‡«zÎv³Ó)*¢.J©«w#¨p,ëÉSá¢0‡^ƒ0(PËÏ¡D×Õ7£žX†t5Cƒ ŒÀò(^_Á1x©— |/Vtaú¸ËXgG@F¹_ªãn›£Ê‰€‡Ú ିXñ;†„šl`¥'Õ\H¶ú³9!FÀ+èãç«Â‹{­€D(¿Èª®nPgØé@C~´"á\³‹ª­ó2$¸£{ª2:ÅV“ùP²Ó`É?%Ì] c_ ¢ð\[4Jʤ\!Æ¢þââà¨5û¥ç# `Fèª/€ ˜á^ûæ¥RJ)öÏ5à3̜֔mX†èÿ)1X:NÊxcW; ƒ p'2¡@òøò' hóòr‹ÑtµŒD`  Eˆ†ÒjÀ҅И³‹ˆ¡y†(”hìBŒ¤}ý›¯Ÿß»§w§¯žøôt’¨CvQQRD=† m ûßì›§ßôç¾>¿ÿÍ×µÆL–Ùá7-õ-˜›ûýÛc€~‚µuò¶éÑ€ù»{µ?€&ŸãYþì óÍŸ¿˜öî* ¼qž]YcÍNË€µ}Ö§k²09Xô—Š|†ì[Z˜ï«¿‰G“xkhF¬‹RÖ…ÜŸ¦©-Ë3¥%5#¯ä¬K1€Õö¹å(‘»‡2ΫˆèÚ»Î-n˱ïǾlçÔä|ÿÌ×B™>£bu<y´b½jÐ~Q戵4Ú‹ˆ¬+y¸ÊÏžáâò£?î…î-óè¸ùÓàì¿% š¯}Ÿ€®øë‡|¶—ú²ö¶¥âáÀþz6NuágðrcѼýS²ê2øiŒçÒ så³|ú˜©¦ì?$Þñþýi¸t|Ú÷¼j=[R¤éN‘GûqiièŒåŽžÏ[çŽm–`¹ô”–Ç­n?óåOïqÚÉ·ÍÃìv¼BýhçÃf“¾ïƒr,Cü8O¸)¦{ÿvð¬8ûèÞÏ`ÏÏümйE<4϶Šýa‹[í$á„ÈŸþéw7îKCxùË÷é:X27ºH‘î»ó ‚»®ë®iH)UùØ] ªjãyËÌÍrP¢^Í‚ ªCÎîJ·ënt飜cÈ9…(Tí”ù2ð»«_”zz>ß_®É-jè…ùwûN·Ü ¼úžJúèsK! ’ò`>$Xòë€a¸æÁ’ÁènQÒÑucŠ¡¤ 2sæâÎÒÐ# ÐAˆbœ®°±œþÚaxAˆÐA`XJÎ3´C'Èà 8Åã÷!CéɈýH´ÇÈèÇ\Ñ_+Ö½ŠÝµ5¡uxà˜< ¨5ÁÑTZ“îUÈ.Eý¥°Œ/‰‡0°T¦^P€F=k½K=r; yÆu"@&аÙÒÀ”¤ÂT_jÞ\ ¢Ðˆ.‚†l ÐA»§§Ë‡<¼X¾ ,ˆ“ »‹Žœâè<<7õ@8»4›Ì—]IM«Rµtð ‡Æ~¹Ž|¸Á¬‚˜jíÿóA…%䡿QæüMWfµŸ£6©ÉË5 ‘Ó8~FYÝRM !þÊÏ$ÔÔTŒJ÷ >¹Ã‡«8#ƒ ƒI B„Å󙱬ÂLõ¬Òzög'ò%ŸÎúôî]×ÅÓ»'}ß]/—N¥ë;83æ0‡ªÌnƒ=‡÷ñÔŸžO§§ó­„«|Â*>W;ó Bþ'³g­‰?ÂV%œ–÷r뎖ˆŽʸM˶ñùu„•XþS…ί®rí(p( W2 î#Û†Iûe‘5!m ‰eM /oJmßfÙÛeËÚ-œ;g9õ^/»hïF_°HŽˆÏã-sóŒv+nÆ¥§ä8›é $2æƒÍ¶gzjÄÕ™.w­eGqf?* WÆN¹ò•á™%Ü`¡-ÈŒr™s¶Õ6[*RpÁíYTþcêØÀØ&>AÖg­eNq¹2ÉüŒeÙÀº \Õ„ ˜Gí±Ýû2S畳>~YŸ½æ6 ® l#ïV1¬‚ºÌ쀕~·ß¥ÀÅ=­þª½,ÊR‡Û•·£ºI¡­àŸà(ª g²Ô˜—Ÿ×Žw¶ÔQ¸N@Ëæ;MÙG? { ‹¶+}NŸqa­Í%sh»pî´^ß«ç>Ôd7¢1=3|ÞØ›È†q&G;ðäíÖ® Ø–l³a;,»ÆöÚÌWÎ3lÛe+¹È&…Ù¶ñˆì+Îë·Ëfô-깃LÚ¯qߩԫœ‹÷.²w‹÷&Ó*<í=åâvíò+²±(a‹3Ùü÷cKYáwä8 ’UÜÑçÊ æ‚ð k ‡‘àvœ“7—å&×Îè½E@À…n;÷H¶¾‘¤šÞD™ܘÊõù|ÑWä¤ö©qL§ÎóJ–ÌuèÓÀ ±ÄGMjÛŠoÔÞ ÷ÂJiZS¹€IÈn„‰ù‰mßUVŠÌõø‡g„ÝÊßÍßN Ù'¦Í%Ïu~6Iv¬÷†IÔ2«çò!£Ê¼í¥rÑ´Ù/YúÓ7±‹=ðÑ­p³än"½öù¾­Xm ‡™Çy‰ÝÚ1¿dø½¬ª—)‡;û¯N¥cs̰1rÕ@P–E,Í(BëÚ-2û¥9 @dÏnÛ7Â5ˆÛ´â¶M{=Cȃž‰ Jk³Âí!ôó{Œ¦£7»ª7*ÛèNU…—NîÜU¬÷“›KZvYÿˇ³OÜkƒì‘³-MjhÂmú°Íc–ýÙËXo‡{†7à¨HT–Ïtù6åvÞQ¦R.Ž#Ëe`oýX$¾…Ój3aæÏkV4 ©Dþôûº½>|üï†Ë•ætªªÆÐ÷=B "Ò“e3«/Ã\EB"Òw½»Ã’‘$²™¨@DÜbÔ œ5€Ùá NÏ9 DR§îlê— 3u;Mß_´ PwÏÿò¯’®ìƒžÄÝ$«%3 ª3'ÏrÊò"ž³¦—Ár–œóÕ(™Ì6@H„:ãK½>G>-kÝ4ÄPÿU#Ì q”Úfµ„¼THa *³BY$„KpƒiÍ¿x† œ A2Ô‰|P¯¡ª# ѹ¼MÕ†8$µö¿Ìœ¢YÙ‹j¬p«õõ…5”ÓÈä)µð¡ªÏœ¶A"ô`áíÄ1ý0ÊAý D½N›à„'äRçîUþVB¥ºøˆ§ò±Û Ücpˆ6×Ô†j{[&sdƒ<‘cxÁÇýÑÓó;QæC¾XºP;ÄòÄBuf–±Æ_:¶S°=¾”1ˆ§ú4&?Þ<€FÐ๦jªCòä™ì…T¦¬Ê8Pt|Cˆˆ}Í]MrêQaU{©˜3r0⤸þ9Ž0@QÒ˜ì+«§ h¸8DM’ŠNÑuG”QÌ1XÙJ18D$t'¥:Ø?¿{úúëýé›ß¼÷Ü?ý—ÿ>QžŒBxû… 3¢AIqwºGñ)„sìžNïóÍæØ@¶‡¤µÀù‰Ï1çØ¤\÷ÙT&HƒÇ¹q6ã­”ðCZs52þÜ@ùòê¾Lûán‘õȼHo2\KÏcŠQóØGÚâM5L\@Ûi—•í.¼‰Ðù&0…+3Q¨FGkýT›± çK]1ËÛ½ ¢ÎzŒZ)æ¼'z n°×V»2Ì%º~q¢Á[Zkwó(·gýT&Ë6Žò3ñ5FÄZ»ç’žäãôãòpvS8Üè©ÁD9Ÿn—ñùüu}¥€ÛÜ®’[Ü,cÓÕ?æÅið—6C&·½"åñ7´›ß•­ö{Ó‘æö/}<ßøyÜ7Ù‘eßÒ#Ûd§^Ï+Ôò1¹Y­èÊàC›‚·=ƒ[Kï¤"ÿ»¬Ü?KùÅçø¦n»/<{Þ˜ç#%óü¬÷ôšOx p§@I»Â6wËÿùzÿÁW¼î£Îýxg‹çrÊËëÞì£jéRßÙnÅ7$Ý×ò%nSK;„£ý«7v¢?lQÏ×i7[‘/Тpè-;Æ]¯™tv4M‡‹ÃA3¨¶CK°(HùëÉ—ÛÀjÁ9œcò@РJšÂîä²6m²“Ü ¤Ü|ÌbL?ñ}™ÈA6.·"wV¹½³KÕ»ß2¦YÖE\­EÊ®ÓÑ:5}|kùË&“yt«ÕØYVÿaÖ™Ÿãá“ÇrÏ2¹*íyþ`õ¹m¼qô·3GX¤[x{;ç¨\ŽŽØ³#²ÿ4ÔšÁʵ¡üóïãù\¾{ñ”Í̆HˆQ»».ž;DTBˆÙ²'«y7UÍ2=v,ƒD4ªHõù=IJ—ä!8¢*¢*ƒ™“žRè: ½Aðñ*4ݲÐh’?~ì¾~ŠïúË?þÓàôtóàÌWxòpRäTµNzL1Kæ)çÁ Yá$-¹¹¢Jœp@•ŠJŸ‡ÐOp@ /ÅA¢;U’{1È­ØE×Á‰‰°÷VÐ^À2òøÂP×_Ñ ³ç¶v´àØlXŸ©`“ hk}e{Õ{~ G1Ï/:?&—dÐä’·kX¥RŠÔÕçîiO–ã¥u\BCúß*2ÓøæF•Xš—þ0¿SnÎåxWczt"-ê#åFäí¤½š’iyÝ¡ãÌ'ÖY×6ÛÙ,ÛQÌÇ×`¹%˜LuC BE¾@ÒÎo;ŽüP§þ{‡x¹aò– }-Tùׯ/®"ÿÒ^ÃJUø©¾“ŸñcÿQ.½Ý¹­ûXÔÁŸÏÓ›nÉMù[ÎOS³–Gã/þöÝùCØâöþ™‹ôeíÂþºsÂŒù]5’ƒ‡È'œ²Æ$ïè¢ûi1äV, ßÿùÛå¤étàªðfÉØÛþ,W¹±Øc(šþàÒÜãöÏüç¶ezSªJàûÿøîòá"îåoCÐî܇.jÔØE Á³LÒIwªœ0—UAÉôDï„ ÚàˆBñ@sAÏQϽ^à1ëB¶‰W§]é;8cè |äåÒÀ!Ó!t¦Œ.ˆ ÄèFÏš™Ý,¿8ÅSg.ÑD ó”"H–HЋ›$E¡ µ†ZQ«<ªOJI¸AF0‚.BŠ®­ˆ=Bä+H¤À\W»Œ¡Œ4@#B@”êî[ìö$TöŽøXîci7jù? „0¸e¬è÷jNÀ±’]Ðì–ù ‘ 1V~}¥ükÕß pfbÖ×¼¬!(Æ¥Ú`´Ú”QϪ]ðKöÄœà/ÖÄý¨q£fJD«Ê_ªìƒB:HÃ8ÊcÆpAúbB ÃpzWõo/þ‘ÈdîtÌî "Ð~\æµ&ÊõÔÚÿêŽQŽC¨E÷åÊødlY¨r{KöЫVÌ¢0 öµä¿´MÄ®¦@$ÐaVGQ1Þ­åÿ“÷oùíK Õ6o"Âjª16`Ì N@‡jD! !†šð D¢¢WzÁ ‚dHwtA2a€gDET ôûîùÛ¯Ÿú¢ê×ßÄs§=ðÕûwÿ÷PK93[‚EUé‚%£hvºKÞÑ<§üŸã©‹§®{:½ÿ»oæÈ­Ðn‡n‚ $û0j–eOûOðxõ 1ý‹0åç²]Ê—:ìýÜ ó÷ã5iL•V¸ÇŠäœ¸AîœTu#3wMÖX•¬E£Ä»rˆjÄí‰ ´ d›F˜¹¿aüßÕ7¶ Y[jß” üuQ†öVˆ»iKÙÞµ,AÍh‘橯é%mâD;iþ4ý²©}Jcɲ¾R–%‡ vG Sѱ!ÕäTãйˉÒ"äèÊ®œ¿#a½¢iƒž Ã&+m% ! fF-ˆhéƒ.Ët³Ì áž0uÓèx"Ú˜iîMÉ.ÕwdGÚà¶q ¾Œ½DÎo]ÜÂûÛž/6MÚM³òbÀp6¯Û,´l@.Ä>e£íò[\í´,4®’yÖϱÆìã½Â{ ·’lçíÂe;©oÕý7=ïØï+\8ülš\ÚU_¦’¯åŠ»ÈÐs%³Óå´!µïpÇ­~jÐ[Œ4ksó»÷÷ë- igkhHh²Ì3/vÒuß(p }rÿEÎÞý2<áÑ".l`nËi±LHO±îj´ÊG¶Ív¬~ïx¡Gw9µŠrª©m{b«áþjÀ¦©vSÄ2ÿŽÕELoE¸Wú+wÔÿÅÆ·h¼Ý¬TØq}­šG÷ï ?8Õ3jÇìd"i`Ͷœ½£>ÏÕ"#û,µ±Ë{éeúò*’ÙF,]â©ZÙ¨A4˜,BK:.ÉÔÙ¼[ .·$Kîü¥¬§ ïíœ7®r®w–igØšmøp·a2{ëôìŒ=ç­ìCØñ‡¢þÕ…É–jR{Ì׳ËÞÁ5÷læÃã•ãšCòÆù„KfS^Íî„Áûâ!ß|à·­MndZ6ëâÅ…`‹@9ªÈbs¬‰E²ÜW¯˜<,F“%ƒs> lÉ•\mßf¯òž¿¥'µ3·¥pÛ5oI#’ÅšºøÓfÊËnÝÕú£vh•v(-tùåÖÑz}Æ|0´};Ó«‘Iþ’6Ý8ÄM³¯¼m‚rŽIeá¢1özüû¿ü[Ωðýé®®.ézqR ªbÉ®×ÁRópêcc5V×_Q Aáp)Ö«¢*$».PE`æÜ‚&‰P*ì¤V€MÙòžžŸc»Swz:í„"¤¯¶Üi…\ieBž-Á#Š£R©e¹_Œ+î|¼!WÒá—i[m6ÈQOæÑwímúKdé|âǸŸ=Üp+[Nï"\“Fôk$¨ÍÅY­å ¾ZÁ_J O({-Ô+ýw^_c —á;~¹Ðy.$q™Y©KòDE©(µíö<¢§ìvºàÜŠœ$ïæ˜?öð &xèNCFÛç±SΕžwoJq£²yA5n=jô\ñ[Oæ©6éˆ< "à’;Ùˆ·'æ>º‡²—2å>5s­`®»h‡Þéÿ³©ñ/4…ZÇÕ1\vuÑÍ´]àíÛR”W&ç&S¡i¥—%a¡@·¹9bìÈq.vK¹¹ÅØx×¾i.T@r·Ïi‡wÿ¹qËä_ç¿\©Öã·¯0p·E>>škæZ"=>¨s';rX6°{!÷X&rKª~UÒYZÄŒ$d›DÙô@R>áE…ë´B»OozWÉí¥mDÞ IvVäÝ¿mC’¤¯Ü_š×¿·äÃjšßò°œËeºbŠÉ¡¿¦_n'»° t]CÞp Úyø²]ÖÅÔK ü6_Ûg¡ñXÂU~‘m„Œg ãU‡Xâ·oäôªw'w¨lÆÉmÉë3\•‘Ä%wP³£?Ѐ[B»>cÛ€ãº(NïŸÖ°fÓ‚«7…´J"ÛÀn÷Þ‰~*ß¾M˜¹=»[éãÆ'pYñ°€ëŽ?¼z;íaï±&¦æà¿ðàÍF¹šõ; ÚZiôH¤,çÑ]›>¼zQ¾™Û[b͸<5ŠÏhzÏf?Y¥u˱\t"dõfÅ¿þ·ÿ¦Êõ¼üå{ËFw9eww"h ”êµ ]èú¾>‡.ºç”LTžåT°Ý æ¡ ž2U1O¹?uYDE=§$AŸû'PM¬Sùøñâdg )_R|îðÔ é–=æ 1§Ãœjnÿöo@†¿þkò!¹‡$gÀ“½xΦ0w·«3š¨¹S;W¥ 4‡»H âP‡“ÔŠËw®ÐŽ@UöcÒÒ Š¾‡hX$MÕ¨gxŽ ”`¨‹þp9‚ ÈKì+ã¥èSÕÔtYÂX–ÛB€ADˆÕ‡`òÔåhA\ü0„ˆ1¤‘Ú/`Åâ± ¾’g‚‚´Ô¡^Êäe΂P1‘"J‘¸NuN Je÷»×»‹ðÊÖ/YÑ Ù‡¹ÂŒcœ›È/€Ô{,ÆÂÄ«3ð$?øèPNI”<‰­¹03¤ 8=4üê0Gè"rÛ¬ò‘ Œù)´§Ú— ŠX†ÛìƒUXü$TàÅÂÁQøQ¹Ðœ˜Á«›Dua^í‘+/µÑŽj ¬Þç£~4!þmœêÖüÙ›ƒîxHÉH•~‘ÙªsÊ¸Š¨"¢™•N!ÑGœϱf§žÎŒ Ë úîtÒØÇ.†§'9BìÎ÷÷×äÉLÏçĈ.FÀ©Át¡["ÉÝR~îÞ….†.vçÓ»ß|Sƒ8މ²ÂÐ-½‹ð™ûaˆÌ¹sÈCÂô*… ÊüÉMzí>›ðr}FûÄ‹\%Öï3ùÙ0¸‹Ç»I‹4iñMMþ+ü€Î/œŽDØôubcÄ¢”*+• 7ì0vÊí¸,Û‘1¬më%Ñ7Ø2º¾åäò˜À÷Ã|Åûsoªá¸¯ñÞK ¼…`#³ÎN›œvRi«ž_¦=‰o_g~Z_ò îÓó~ýú™|ÉϦKïykÝ„üu üD¾ZîÏ5fù³¸m~îÿvN éËÅæH ¿RG~ýúÉÓ"‘J[ÅÅŸâÅ~†Iô§¡ü²÷xÙÏ*VÁBä¾uØX°=*;áö¯ÿöïEôúýÇá:XΞ „™M¹C- ›.D ÒE §¨”Øiˆ1 Vä< Ú…4hÌ„®€Ó‚1Ë!‹Œn)DÒå"B*èE¡¹DfXÈlìºCêÜÝU4ôg§ÿÓ«§Ì$Ô«]Ot·ËÀnn,]jtÂ) Œ‘T¸1Ð [ ÒD #we¢úè©:µ†Q‘ æÃåÅC0@Ü\µŠ¼ÕZ1'UÄႜµB{èUšBˆªë”Å™s ‘|?N#Xªö±¿ºà싘®£Á¯zŠkš@á€û\–ãcÅú ¦Ó•õ+sÉüÄ£wÌî¾åo}¢èhuæ±8GŽA|üABØù5L0Ô^„*¬©@E:aöá…ê÷k¹òòµ>´ŠÜ) ŠxÉêd)%ÿ¥º?;\ }e÷‡¾fV}l¤x†Æ1Åâ³.‚ò½^d¥åQµš^tmx‹A‚‚Žt­¯Ì­Â‚¢Žy¯ä%#’,°i¬²ÿ›—%ÿ2à ÷l~«&ÿCrýéÒVÃÞÞ–kÑøÿéªêî"cwýî%]š¹¹;-[u9TÕ "â"AUc°dA£Ó¢Hˆ$ö}-%æ ¥@ݲ[ŽAC ù’@„ ‡ë%Ä.ö;…±ëtxºà„¿|w±œº ìbß…N%ÉyŠêúÅÄ­;Ÿ¾üþh)¥ÁÔ³ÓÄ݇axI W˜ nfƒyŒî`^P œIƒìOÈiÆÈÂ…ÆR0Yjü}¤ÊR€•*š§ íG^ƒ« À€dp«–¿…¹Oe©Á×Âçq­´X˜9ÅZÖj•Ýd¥[°ûJ„‰3“+è_ÀXd…ʘ4 vuH¨…," c|Aê³Våc¤Óصþ”„*©Cà"—›¥¨Øc˜UKÍ|Ô‚ùÑÿÈé3š¸CCé67r”é‹ÄQŠ÷1²-"1ªÐÝ^¼¸æBf6©atnê}ªŒ®U˜×õ¯p“‚BJ!?–ª+@y¡Àˆºšœp"2ªOrÝ(–FƒBé­ÊU@Aˆ`F¾Œ<%¯|!<ÖÐ|~žžÇFq­.OÛ7õ·­ú¿•ʧ^ž÷@¨ÂS;’"ŒZX”òÿ 8 b¤ b€8Ø!F¨Î뇴íûîô.>ôt–%v£†¨¿ýÚé¢j$}ß™1K¢!Àz¸‰œÍ†d)Ïç®ëº¾;½{~÷íWãùakøXÖššXV)^‘ƒÍ¿-rCíçhŠÒNBYaâua€²/© nxöæžì½“å(]é!²p'Xö(þjn ;²÷o‚´4'GNáÞ¯“åñ„ÿVǔ͖E™œüd”k´. t>T»½uV!~Ê\G]kaêV±Î:sÏÐ’9kR°åVÊB¬¼s›ó÷Ë*ᱪ]ÕX´ù‡vûi*nßw“G¼Ê™ÄT¢:±W©Y[”Û+Õ­:‡ùAl;‚eصñ½¬Ù£Vâå Yd¶kð¦áhþYî«´·ŸðJÊ\ƒõÀÂ`ï q`bqöçFBÞ_x°[­"Ù¸O± [¸m¬ÞZ›ltÿ‘9'¦ÿÌÇ÷qX@d Z:?ç"ÛyïÞÀšš‘ù@%Ù±'Êòˆ³ôŸ™l9VBÄ6 ¸f-5ûõÉòÆœYÿöå\k±ä®H"m›ì ÝÅ*™2š,ŽØ¼å‡…ð¾\£÷Þ}û'Ù¦#îç_3ö'Ïù¾·EÍ‘DþñÿøÇýÌ ª/ß}ðdnôl¨ÔZ„BŒ´rT DbŒ×h4— ){2†”@— ~Bé5j-k†¨ÒŒ ³ì!Äl–sNqZN p7ËR¾^ÏïNÈ9jZtI¹¾  àò»?O!Cz¹äˇ$n^Ð9Ù,áF/Ô¥ •Òrö½gíƒàL”çJÂ)Åõp …Ð8ÊÐDN`ž)})Ãb?ÂmPùø~…Û‹kØ%TÜMÑšàËã/eµÍ =Dá ÃK5§-À‚PXç>Öž/1&2šÓª -Y=us©‘c=ë7LõþS˜*ô îp©UÿØ!{-K‡Uå]´b|´¯­hë »ªÞÅîXP¡@ѓڵ6ÌkZ͓˲š H`¾˜†Q¸‘sä4–Õ;X|zG"€Œ.»¥eÁX;,U¬à µ¿4LØQUÿb¥ÿ3×tEMZ”>Œ\?!Vå/°<>:Œv¾¨?ë^³M¥‡ÀóÌùQ o´þU¼&KL͈VªI‘8= €Í¨Â#`0CºK$ÀIqŽ,ÃC‰Ð«­Ál<§•5 ïºó©{~º(Ñ}óu×?AÄ̵©Ä‰‚™g…jP-.Ãðl6䯟¿ ]Œ]ìŸNßüý·‹ãÐè®Ö:gm€3KFÉ-'ÕOC–Ç­+)÷œ×DÖ`É[Òáœóʘs.LÚ9ËŽŒ·Ž\çG³ äM…»!7Ö*ÑʾÌVœm-+øÉ¬!iµÙ —öO² òeù‚Æ‹+±„ão:?‘$‹Ñæg‰ÙJ{M¬åä+4>Äzæ¾!Œp{j²«ûË¢Êf9C^]æ%÷dÉGë—>Ñiû5¿k©°,i´÷@Ü˾!*/ÐóˆÜ“„ý§^ògz!òð÷ÜË1~‰¯Çz”'g³µ»8?ß›çÝRÅ_¿~ýúy}Z¶RïÚ_ÑýÅ`‘Å‘ö ñ¿Ž¨ŸÀp–¿¤ÒÏvK8l$ú©\Zÿ:ýI-Wr¬|©§qO_`Ž—É‘G>àç¹Î°iàò¹‚\Ö"Ðü˜þp û_¿13:Kï¿g³l–3Ptÿ ( A5±Ö,ª¨Hˆ±jCv ?š3›¹iˆ>¸‘Ë9y§îªµÀ™ÜS !¨Š»×k™ J Qä OY¢† éãAýËŸ_žÎÑþðÇlü˜sþî{{¹ZJùšÜ\a‚, ÐA3'uì”4 EH' Z+»áЈ`sØÄy¼ÔRn˜A¤ â/¦¬U×ÎÕ¶ªðqzªbÙóà,Ôõ *:¿žñBËH×ñ¯$0ל¡c8‰ì`FÊc ¼ ¨6%±fâ_ý¥ÃŠ c—kCqäÏ” Iý×Rþ_¹ÿ„³zÞŠB½–Ò£݉;ty€Ð6ÊÍAaDn+Qèf¢MOxÉŽdhDìÔ*X—n>zÛHC’Ùɳä!DçRTå˜~ðú„KVFàpÜc½B!<×üMÁ1•>Ö> |ì)¶¡BüÍÀâm0À8öÈ ¡C¥×#a©tuȨÙ”àiêýË/‡ l)ýÿˆ úo ÿ§|Ï xºòò‹ƒ@‰¡\ „Ž4T“ê xRŠa¸ÖÆ—s ð‚v@Mh‚‡.âôlzŽ1†X_LW&¿>Ÿû¨Ñr.æá™0œ Kv gY:ÞŸÞÇ® ]ìNýéé¼(ÇúI†Î_Ðàׯ·¾FÙ-äþT‘îÇn ¡ ‘¥“;9·}ÁHïÄÆ¢S°®µæ- gi+Ÿ%q²G[¯$œ&sóé)O5•+ÅÕoæº w* oSt•ЀT¸IŠê<ŒW‘³`óW²È5Îmú.hâ™n½¢d•ü[|¹£1Kó¹<—íœ+ä#yüàÆ¬ åÙé”M‚njj¯IÖUQË«˜z_wÀ熴½æ/cµÉ_Ž®Ú‹œÛm¹‹h®ªêdNžóà”…•?¢¬Ÿ÷´Ë¤è¢&™ó»;»¶À¼vœ¼!ar¼(ÉÞš³7b¼ÆMá lüÇW95-ˆßxç{M²uv–9ë̹7LgP¯©“››m 9ÖigåÚQu´¯ŸJ¦ß]­íw–ÊyfMEšÓÚ&Û„Ç 7ì e±>ñ@*ð 9p7^¯R˧àýlÝ‘Ù8¯(0e #…;w{7iL ÷c}¶Øƒ]ÂÚfum†ë^aNûµ!Êa´¶}Iµ†h»àsG`Û£6†¯27‡î¯‹`÷^¨{ á^ÿ˪Qu‹ø‘öÜe«Ñ¼BÈMPË^‘6üšåùmų7ÖÞg¼½_t£×a;–])‹Æß¡þúë]þÚ×k޶•q=Yoórè|–Üqtîo²hBLiúÂeQx¿Ó¤vдöð»‘û"v k“Õd–eîoìœe÷Êýî=€µ¹îÜ‚'GD[}ì¾Ë]»ž#`ÎêÇ·•úKïîÚ2>ù.Ò²kË[*èdß¼b<í`šnN’tŽÑ̦wþô»ßà(%ªjù×ë÷/n.7³lh–•ó£!ľ 1ŠBc AËR…€™°” *OO}²‘¹V/#FgJ9A{ÒÑmx¹BDEº>ižèzUø`™9Å.º›¥!»w]ì;Íæ¯×âÓ‰üÃÇlšsz¹ú0¤ËÀœsÎÅqÖ ‡HCH¨ÐA¡H¤„ÂQ1d„±¿úµføh' À3†\EÕÐ#§Zò\é4ce†PÊÞ­ÒZBWúb¢Jx Q‚0A„êRàïùé sœO@‡©oSV-Åû„x/D*RŸZÕßR6αô¾(¼!VÜǶG-È­R0>UØO5ÜE²ÈùZÿàÃÞê•”|eNÐBz‚tpŒu÷XIútÄA D¶Ñ¥¶\¼×{ v€i>¿dCr†´ÐH˜zJë±Ð¥ŠéTäñ<ö8<Õ‡Š7æ6‹”«ÇCõˆèß!µKÀ2ÄkÎ/eþ€_+y§P˜JïEµ&fMÈè‹Pø?²¬÷7jnÀ¹ïv/ÍÌ î?4ßÓÕÌQµ[°&7pªYeB‘D(Ì(4@`†.¢€AÂ!ÀY±?Åš¸´;8ÅMD ÌÂ9jªˆ]çnÏ÷ŸM²]SVÑ”]ÈC–Pj Ý2)Q@RÒû¯¿Ò ]ßÞðìuDóöj)îu»:¬¬:yWúÿdµyO-àý«½ ÏëÌ_K7/»‹7°HMØ>+fKXÊÃ…û”‡©úŸSKÛÞIêÖ›…ÑM±ø”>oì—´¯“0Ûòÿ¹ýœ‹H|BºÛI“[1þhþ,ñ³£L8Ÿ¢¹Œweái˜L÷RN*swÿ|!·ThHmÿý|ާpFFLªÇtßQ6ç…[ {QwœÞÂŒZà8åàô½>¨m1E²’ngPvKÙ 5Üúœ},ü/ñ‘èˆ2ž`<\r½eµqÉüÿÙ ÒtU-Z¾[L7ol3Êl]Kª†l4ë51©-eÀ1Ó’úNøíê½öèÙ{CÜ[lf‚'5¨•rZ0Ümû¯cqy|P ™r¯\W°§9îþL#ßm kÇÍ=ïŠ]eâwu}}G¢ðv÷ît{@VŸö%b§_ö™ƒ˼¥ÌKâþòŽšÆƒÝe6„Ylô›É¾Æ- Û1#ËY¿ DmÍd5”Ú¥cŸÖÈEºtTR¥éˆ'd®9­ì;oŠëmÍ4n•-.à^wš¬][wwˆ­€z'.\gnÈ€\¨á[âN€v/ßÈ[·¾$&. =óÞTQ…2¯¿c@:ñiÈ=¨¸ÜÍZÉJ¬á”~¸Ç!\Bk‹¶ÿ·ƒß –Ȇ¦$Ò†Û ¹­á÷àËhu=/ȵ´~kÝF.`ß²UÑòµ÷ÄSîÇs†þÚÑCüôÃÆÀœÛ€dDT6‰˜‡?vs´Î¢–ìRÉîœ yøòƨAõ5ɬ®¼·¹=ÀY,ì-6µA§î‘VÁö­7ÑøŠˆ'SAÍò:d x|ð~öß•î,· Çd£p_ªoƒ×©¯I•p3Ee_wn|x½åk½W8ýÔ‚zÏŠûÛŽ1P¾±_nÌ-öZØ&Þæ…±¹Íº„¹r÷óh9XâJÇ‹voøK«-ñÿø;’!„‚»Sµ¼ áãÕR¶œ-›¥ @TUjYˆQDCT *ªDD4„Ð8³›€}<‰PAR‡4dcèc×÷Z>ɳ; ‚zÒÓ€¾ÝÍÍ@(\¡éšú¬<£{ôœm0ª ³)AZ²%;=õ$]Äÿßÿßáû\®ùã5]ñl9^^¥¨kPSÀe‚¹S¢ÒD%]$°¸ÅÖú°z*Ð \fB‹§Ji/èövÉWžFFljíIPÒ1nc•=ªvŒZ³ÃBê½úÁ†0zê °bEk` ú¦ ÄÆ+¥Öã‡y7¢ƒ©ÖµÈD˜ s±‹ T` RõêRÇEJ¥;<@ÏÈð7t=\ª£o݇â¨û×ÏpkÞGNáàg¯Ô –¤K†R˜H±Br0ºSË@²’gà ŽJª)])ÏÿéL’å¤*Šß²I퀃:vÈH1ˆæÕ¸$Ê=¥—ÑóÀkÛ„[MС±F1N˜×ÌAælÒå –j†©B–‰¿”ù£70`µØßǪÿЈøEåŸþJÙhZ+ÒˆýÉ hüNéKB¹GÖu³$É@„€ØA…! º8rñEÀÒ€œ!ØS• *ƒ†¨Á³äœb áý·—Ãé«.ɼï´ïb2Ïê¤f(@Ï–‡ôþù+U 1ôO§¯ÿîÛÍî¶>à5¼ª½Ü5e­8NÿÜ:š‹ŒxÙe¥ætblO²r±~„ ¸»ŸGÁ‡l½õÆÂ‰Ä‚!r†äìîË»•Ó\ tÍ3á½Ú¦rn²p“͹òf½À .…‚ñÊ[À… ¿‰.ÚJ·µú_t~:`pY_8éêÅQ&û¸&#ÛŠô¥ØQ?f,ež‚x‘6,ãíü×v4áêAÒû8Ñu&èÕoÎÚìÁwwÕØßÐ{úíÛë²8`•޵ÿY]ÀçhŒ,ˆ¿¯ô%=8]Òßkó°ŸçëUåÖG¼c¾F à=#â[ù⺹Èí›á—zZ¿~}ÚôÁm!áÕs€?‘»zãÅÈŒ\?Ûñoó±ï”ûIïvêÈzå’²­ü¸S¿¿«µâï°Ú?ÉÈÙ…‘/:?Ns€ü[Aýúõë×åÊ—¾Ô›­¡Kþ"1ððª-?Ú[×µ7sB_ÓKáÿ´ù­ÚŒþô»ß‡I!¨êô@>þùû|,UEî^êýCQüUÑ ±ïjPEÐÅH·Žš¯>v}ß…h¢#ÔS2 ê9=¨zJfÔ5xÎ)›FÆ(!t4£ûðáNýé©¿ ×t¡ æ]Î}t„![P Šä—ÃË÷×óËåš/ûxÍ× /Rʃ¹ÑÍD ¢$ƒûUZœ"úP”V@!¡:…KåÈŠgz©²×±y¥(¼å+V+Wcm/õõER(lwâ@qýuˆ@»YÝö`!BOÈH0àVþÎØRABB€' BL@ùüPÐh€H¨Î¨ªp¯£ÚÀj$[\v'|P¹…ØA#ñæ3ÐúÝÄ‹*÷1‰û \GŠ´Ë‹6Ù‚8&ÈQØHö΂^ÐɰÒacž#;Tpêê/«@0gÎ DƒhP }躧wç¯~ûNNÏïþ»ÿÞ’¸äèÞwúâ,”0† P¢¼W#Žëuð!}õôµ† 1ľïϧYt“d»‘WǃŸµàׯ/gÈçC‰ÿÒ óS ¹ HšöÉ6E´™[mòÇ?Tq¾)>eq§°n£,ÈhküÖ×¶¦ì žˆ… è:%“[¯Ôt6²Â} í2é·ÈµŒÝÏÅpw¯bºäÍÁJ7Ä2³ÈÚ‚±¬ø“íÜiºû¹)Žš2v Që–‡Ÿ²%îšu­¦ßÆítïŒÀ£qs{i ìåÁ5jG»µ355A‹:Knu2Ù” dg…xÀR¾²QnOƒÕ |¨~ñÕ+‡¼i~=ÍíÓWé•ç1âyˆ€°+Â5mï×Y>ú9›çiõ:Z%ÆåÈ*ÖûgÞ]AX¶Ðƒ§$Ín‡r¦…ÈAñ<Ùzcïeolã‚æ–zaÄ&ÓɃçö0pB^ù}­g<ž<÷²ãq´(´lŠÖ;éÆzj±;O‹)ï•ôoíToã¶{ߘXÜé® ðQQ÷cêÁpô"W¼ÜIü|1g}E²@YµHÓ>yC’ûÁN‡¦SŸ5r}­¬ø9Hå|Õ~ûgüç¹=¶O›’|Ã(jÊÊ~b‡wY؆/x 's±ãlGÈN¨»»Ø,ÇnÛªõYÇë=òêAïtñ‹.?;ϵY §.‡fßâíκR›6·ì{©ìƒp‰Å?ÿþª!çÒ ¸;€Ë‡OffùšÜŒEÎ!4ª„.†4 Z* ’ QáádAߢ1áˆòDM—á£.Þ:íÁÁ¤sº?¹|‚ˆS™Ì’9Éüå œû“‰tÈ ‘]§] é:¸Yxꇗ!}ÿ˜åᚆ«¥!}¼Øåš®‰9!»ƒ(˜}‘ªéW—]`¸\t=©ceªÀ„ã#A%]P«þ ¥Ñs­_-B¶gG·ÞÙ¾Zéý·ì®SlWîÙXc>15¬?΀fn'„sH¥[+\«9m …éŠ0™ôŽ4|NÇkEç©íÇF¾ü4 úF(j¾09%BbMfHC ‰µÜ¾\›D@€ Šü}‡Ø×çPò( ÐAÏ*P7@ƒDõt¥»[Í  Q)/”Q8Ò òݽÞZM¥ ñ.µœ¼Ð†9(B¬~Ëåü­‚a€ B„Æê\ÔùúÐ|,nTÄ4‰Õñ¸V™:L  F(!9C¼v~ €qÀ‘‡š-¨ƒŽ¥ª¢•T•V•¿ z}©ìdžûßü¶¥ý¤Ñ+øÚ|à 8 ˆJ8Ñ DqŠ8Çú@Št±…(v ^{\ ðÑÆY ª” úØ?Ÿ»§SÿîYú“iøøÝËéýsÿ®ïαš ªBª;Ì `Ð( 9%»¦¯ÎïËÔúÓ»óóÿYªD?Šº¸Ç”IÝMðKØÎ|RU_Ùmdâ®>r¹cÉ Dý  Ðg¾iÞGl7ý ªTö*ÄdЇžáÏ:n3öì4¬/Žå²Õù¹Ž7 2PÞ=¶ïö‚,) Mƒ?—^uE¾¡VÂñ²#sþWY`êeóŽZq§ÿ£Á4ÜN¥q­ÕîtÌl.Y/¼µlLÎ],€ÌÝ«­¤ìR€|t[ò(`í _sd5ÛÍ¥3øØ›3cæ h½:9*C²¯öIÓäôCs‡VãBˆ¬'Ò¤yš¸[n$nœM×/B ;›ÙÊuAæU SõòâÄ&/KvR_mF%W Ìoq}G­v8Teÿ°8öŠ5‰|i¯ŒË“»J9Ÿ‹™A®_ÉèbBR3ddG±—ãöömËžT½Þe' ÈuÓÔ9\áDvÞ’ &{rgè6Ëê”\„2KüKд~aò ™¶ºº[pIlY°.h»Ï²y˜µqnSÉÛæã ÔAvò=¬ET+ñ¸Mª.ØãázÇá˜Úœ‹Ü°Æ"¾­ÔÂu‹‚!‰Ú^Ÿ ,E²¦Àlœ{„›×µChz-Áý1'M.…›ìêü@Æ~óJçˆ4)×Édbá °êíŸzm8`;n®_ˆ¹eꈔµ¢Æy¿â1ùzvËóâ«P|/Âi÷Øö>'tìZÞ_ ¸šXót7lirU+úå^ÙÓ¼iqÛ…¼ŒbCé¾U¡/7À½G6k5;‡Žéš µIDŽ_ÃÑ{bÃH»#.rf¨qÄ›´ÿ4Û˜à¨9GÒñ­Ã*§P~ÓôóÒosL؆?À=NÚ\ü7âKã n!?¸™TÝO‰=tЖÅ"v{!Ùñ!±ëÊs¨ûO\-YÓF¶`‹×ÄÒrëæUÊñ*(²Î_.{^ ÜlŽ7x€Î¶ñƈÂþ wzV ž9‡¢Pé%캛_]AO=¢3‘Ø®WÏCaÎÐ`@¾æó9’¾¿°5Fê–mb<ÇbP>^ÅØÑýòÂaè:||¹/¯^„Wû8ø`LnnŠÐU@%@¡% ÔQ‘P]dC¤n¢cNxX|÷#œ^àò@åÕø¨s’¦L}€åú¯Vñ¡j÷…Ìî a‚‹”Ï1Š”ž œð 0À P>Ä*°(Æ1ÍN@jC>§üÄXíÃRl€;B+à Õí@FVg`‡ˆÖâÿò·è†kí6(ö¹˜ß úoT½d/4ªô$Ðé ¡3?@¼|¾”äJ„% ¼¤—êlœ.g“Ûò¯ ð^¨É€R_Ð=æ0GŒU­Ö‘÷‰’À0H„„1 04óWk“„ªû®ŽV žàÅ:Âà†T¨>VE=%òD­À0ˆ•N¨@ Œ"³jñXÖúØÂ#q̾4 ˆ.É?>þ”7áh 0ïŽÝØ@`‰ð}#BÀ)‚†œ`D ­Ï¤“ŠKA1¯ÅØ©"e¾Åîtz~ ý)åøôüÛwß¼‡»„pî»Òµ`îÙ%›»*ThNO4§yUÿc” ñÔŸß?¿ÿ»oɽ¨vo"3 {>O®8-“Óloîòm`r¥Q`±Q7e.Óÿ’¯·º‹ÌÞ¼µ“ÖcÞr³–EU7d³)Šl@Ê 8/—¹SÔÌ×å*,ï:Úb«¿Üäx,@lÂb™EµµzÖmÑÐùÛ•¼U•ÑÊÿXž˜JDö+J6¡÷'•ù¼µ*ŠM[Úڼœ¹óMñ NÝdÆÞœ•ãͯò-ñpØIa7M·gRøæâ»©¤ÞÇÚÿ¥MßF ›Köõ"wœTebËó÷ C»³`\áäÞÎÇ»ÏX$+ÅíÞê.‡Ÿ<`ôûIyÖ·ýÈ]6·³n?pQ¯ëøA­Ú7?@eÀ®vòÚQñH]?"µŠ7[ȹÙ7Aà[̽éÇxeo½€©Ÿ£Z¸<ÐðØà¹Õ°_,3³·_?T–ÉÌnúÓæ‡Üî˜üÑÆÂúYp7‹ø#/Üòª 䳯²ü2þSŸ  /ç§JEºíîû%ÖÌqtÈq ;ÀÿŸô‹û¡ž$ïÅ!‚Ÿ`£ÇÝCYk• XZM€câO¿û]ŒŠ:ü2¤!_/7×)£q‘.„ÐuP‰§¾ë¢¸Aª* Å>t¸ÐÜAt§ND˜èƒ#–à C Šs"N³„Aé=ÜÝEÔÜåƒÅË`1Àœ–H£‡òË./ƒÜm0ÿë¿Å®: jÞÂÇ¿¾¤ë~½|ÿW{y.WæD3 Ñ„DU1ÄHUJfè:ÆSU3]Æ‚w…h±o]ªùS¿šÜ B@ˆÀÈäÑn”ü–‘¯pC‚;r‚B fG „–á¥Y!F€èÏ¥E€Õ›ÅR‚øSÊC­nÛA¿†yÍ7ødðêã8*—ê+/:²Ð"NñÝ =€¥30«¾_BOÅX RÞ[`ùÇë¥jý‡ éPh0…¨v'¡9Ë81ww‡Óaß VHËÈCEå¨BŸ€6Tg`iqžkCC¡ð‡'PªcAP˜UÏ(/¨"›aALPZ6uT4IÌò}Ï #% à –G òˆï/Z~.^¾Ž!C"‚Vk 0dc5eõu^oBÞèþ#€§¢ÿ(Þ Å* |Y#÷-R˜F©6uPj¦¦‚£Šn× 4 øèpC—X‘MŠÐ Šj¾ŠD²oe`ÂÕ ž; ±ëß=Iìôù¹ëzJ> <å—ï_bwýæ¾ÕSŸFÚ5_’=}óÎÜÓ Ð4¤÷O_©‰EýzÿÛoÛm.Xý7¸MÁÄÒÿA@;­Ó¯'ÝŽ(b‚ŸÝöHê½sÿCç÷]«ŽˆËoÙqe©nï-ñÖHÿÉ›°#_ø+bÎ_ñæl¶®<|Á ç¢ÔLSv³ ÷u½‚2ÙÍ“Œ<^qäØq¼-„=– —R»4ß`z°™w"[¥HÞºèr‘é{Ëáè53|ýYðՂЮÅîÏ~÷¦·rëäqûøbk#ÛŒæTãÉ·<á[¢¯`[uJ¶Ð»Û›ÜpüiHEŸ(ƒNÍgMaÕÛ“¼E+kkedoiÿ$uš_ø]ÌÞY?Õ—½àïm7vÙÅÀ}æ#ÒýÜÞÜü3û€ÿ Ê÷ڕ째&óKÎz¹k—ñË‹ŒgÙs–ýÄ£<Û¨ò8Fþ” ‚½­ð ïû‡¨ÇÆí§i#’ï Üñ _ðä÷›"9’Ó2Åi‹\6ÿñw¿ÓèÀ݆WËæfÌnÙÒbŒTE T ÚzˆªB»x:Ÿ$[A°t!ÆŒn)Y…QDžÎtO~M𠪙ÔÐéðòñšÂÓ©#©@5šËË }øîeð£Y@‚—k¾fyŠ6ÐEþô‡.:]@H'jjôðîÂdpžb°ïìÃ_?0_™_ÒÇ~½ÚŒ‹>:0„ 0ŠVH",ÿZ%ýœÏhI(r~Gíª˜+c¡÷¤¼–ÿRGR„ª9Á ±ƒœ*ަàbBt@Qä‰+óGd¶›TDJe} eÄ²Ô }Ĩp‡ýHŠˆ° `©¦"&;Üisl'-f¿hS“A-T]ƒ'Ì ²pÖP›pËsÉ”@šA;q²hñN@¡'Èè+Q%tÎàe¨ È€,epâΜ²Uº’âµC"1;,@:ô à$a!^„ën Ö·VìˆC_KÔC¨Ý¢ jµgÐÉáY¡å?¦úiîˆ#bŸ‚ ‹Ú{XF¾À ž0¢à ^äv"@DIPyÌʰŠý%™T¬#ld÷cV ë?…öã#Ê_›Å ‚Žz#¾,ù7 YD9/p¾ÌIQE€³ ;À­öL„Q†qŒ> RÄŒÐC¢¢ë´;uï¾zÿíS÷í·â`÷$]§Ó9è`þáãЋ"F tbŸ¡=Ò<¬z¾—óðö}¾ëq;Xÿ¦fÕ(3^šõwD²È¢—p³i•µt·Ã}Ƥp9õîDZF¿¬Livïq\)Ë›ånþ‰å±zjWšQ8M« ѬdA´ÚHN$×ïrœV:L¬@[«JŠ–Y°×"Åb;$І¶éÚAc-à8\>@Ž«Uûíœúäæµ4ÀŠÁ=•Y»wóaû „à‚}$«®€ú¢ÖËðàrµÙäo¸ŒÛ°œÒ«%‚£†¾s«™þÐ`Ûð+X_*k¶'Ãô°Û£ê1eëé,ë“O×CP³q%&,ŒžÚe›|äÌڸѮßéíÌá´:Ì’G½w ö ý·ö{ì]ƒlåæƒŸÃê“%»¶ÍÃì-Mt7úÓÎ4¹óའ/pßê÷¯ŽU"7”Žëñt%Ëp¸¡Ê‚º×ŽòÃÞÈv´%Jûã+²Ÿl]HJ8;³R[e Ç“íïÿ,¿;½ ž­j9€‚ˆô]Ô® AC ¢JQ ]‘ì ªæT ±–T{ÊCˆ(Uh4#3Ü•t÷«å3CÏ]ÐKPuÊbl9ûÇ«‹jÐÓ%½¨Ù5¡ÓbÔÀŽp¹|÷‘]ôÿ·>Q±—œÍÃY]ÕÍ,þ| ’áyÈéreNérI—‹¥Á bÝ@‡ö”R?^êÐE«…Þ*tŠj_õôé@ V{5Žkp˜ñ&¥¤½DuRù(žENP  WHÄ5CA@EâPËÿà5ôÒXíyQì=Ìá¨í•S ép Pf@»ªãêÌ_`å®Äë…Ãáb$à€OÞÅÓȋ〠õbŠ•kZ:g«˜ùØA,Q!t´—| DŠU²"t`Íœt9«†.Ä(D„´œó089¨Š!HP!Õ IÒ’(BØEËf‰"ðÌ€‚a´ðÕqÞ($@H£úß -¤0#6²‚¨µñ¢f"P]á©nË¥í ü– 0í^`>Àpg¨ÏÖÁDw‚2«™puК•ùhÐs^r³ú”DF±ùEÃ,×FúçÇpNpL]…1  žgaAQGÛã P¡ ´ŒŽ‡(ºPéI$ °aÔN´ ýë&)PJ¡ý©;¿;ǧçîéìÒ W;ýMTíÎ]úË÷×ájñ¤¿9#î™È9Ó«=³åkþêý7AUDºÓéüþé«¿ûv™‘ožˆ´kâDp¡Œ¾r«i[è°n4ä˜5Ø~UN$M9Õ7ÏäŸ8ÍÝ€vÍ&JóÚ½IÚ:–­“"KÍ 3ÌEVB„4+…,€’L”…b[gÍ–í;_=/7´ÝÁÔÞ* ²)ZNdKi⌱‘·ƒ­yõ~¹Ðùõøœ…‘…eä Oƒ QÖÁCGiÿ¶‘Y[MwŒÉjQìR4æs UçèÔ&#•oí£ôú”×mõÿ5 •øè¯äÞIw7#ú©S<Öªo(¢;‘í($ܺ,Yb¾örWYÏ1y ÷j„>OÀB–gãÒð¥¯|åüœ¿[}(?½¯­ZzW[?¯_à^ù_ÝA#ÐÝð¤§y ¼¥‘b¶·¬”¯cD0q·¹$é®°Ë8„¯? ñ•æ 6Wà>­ˆíŽÏ›‚Ë^Γ/3Ûzþ‹Ñ|^îØÜú›åqá kÀq$Ø‘°V^|s¡0ßxÅXkUûó¡fìñ‰f§;ÕÓcqjã5Àu·&›`úظwÀú‚òÉÏüb?z¿à Ýσ,G”¼æ—r /,lv†æÑ G«ÌO-™wöäͳkƒ÷ C]î~Îê,¶»‡·yˆ¶'ø3Î>؃˘‚mîð( üóï~_^ÇË_? /W7éQZø)rêϱï4§‡ E–íú¢’s !¨f³dA'â4uÄÜMéˆâYw7=ÍÒãÉÌ$àÔ‡!;1N=ñ]Nº„¿^/¨ÑûN¾û3##Ä2&ô °kNƒv½dÀC€›Ñ-¥Á³1iNw—P Æ* I=‹*W~f¥JªˆBDQ™9jý!ï] rBŒ@€[UX żJíPA)(ŽSWkÉ-¡‹ps £/nù§ˆªêp‡ $ÀÒ¹h¬¢T‚»ç”Ah'¢ ³@êS®Y<ÀĈšípÈ©Âã5@Q½j+øž•¥T[×)§Ö?« ØÕÌ}v.ƒ.€3D¡‘ÒÕ¥¸‡D‘¨#"}À’ó€PÈ?;U}vÒÍI¢êž¢"–“ˆÄ.žÓÈÐV¡:]¯0©8£âmàRQª8[KÕªµ ¡ÖÚ«Ž·ZGŠYõãÕ‡1j<Çt5š[" Lpƒ]Àd°E8¼ŒEÒp¸€jcż#¢|‰=2‰þZý!‚ (¢Æ îÈ6Iscž@f ŠPëý% ‹œÇ•Œ€ @±qÅ@z2P‰Îm!”‚V›$|€ž R‘Ïe¥ô–¦ŠHР1Æç¯NÝWÏ"'P®ß_óÛ÷¿ýºw¦j—¼7{¿ÿí7_¤4YÛYÿÞÛniì7ÀOéXölø?K¨÷§Æ›.y[h1Û¿.­4Wu˜Ÿ¬¥ìˆõ\§6äUŸøðæ;VKð5þ·Ç­3þNÃM‚áþxžrSm§‰È%þq–}–•R?m\CÄëÀÇ·QÉo†×LKäXZÞV–¢Èèsœ‘åÔlþgO½áf¶óä@Þülç;¼ºÃþá#082ùý’£¡ü`ãù/ᦒeÛ‘ñÓÿZ&ñ(k m½€ü<ßøÝÀ|ßm°ÂÛFžoHϼ)<•‡ËÀ_3À¿è{Ü…ÈNÕì—{ Y\e_äKÄ;l®\yF{ê¡ü8 Á¯_?Å% ŸÜrþY$ ?Îà«àˆYùK ¾^‡ßݶ׼~´¬jüå'õ ›ºµ¥{ØTê*¿ûÿýïUúÿîC¾fOÙÍDƒ ]_&•ªöA%HЮë"ƒg1‹A£*æF: ª,k²¬ÌLÉè1FËf†' ®twÆ`".Ï}ñK¶ >ÃõrÍEø”óSð!¾˜`È€–óŸþ ÂdþòýpêUœjÌÙRf2KÉ‘sò®HÀ°ì‰tQB«+B$ žÁ„&›æj®{~ÇÐϵêÐujv9Ú–ªða¨ì—èN5 Päf¥v/ªíF¼ºÁPÐ!}CÑ)š«TÝßÇ£³w€"*T"tÄS((!ôpˆ §ç^5ºÙQïN´ †ä¡2‹l4.yˆ  #zL5–Òò{—_óÑá€J¾‚–PÌ !À$Ô :ºÑƒ]­· pŒB¼Ý¹Àœ†„ŠÝ!ʬîB‰¥7Áºçç L×Ð-pºˆ†Ð;“eaèÁŒø z­¬W¸# Þ KVFflQõðš#a€”Ÿ­"Õà¡æKž`ãJäQÊÓG¯‰"›\>Aƒ%x†9à ! ï:&BU$TÐAàDPT3á„.HÄgà¨{užô*Z€¤ftTáRsT‚ÌêF7`&Èc\€Àj' c:¡¸"ØQõWè Äj’¬0¦JžÃ‰ÒÑQ¾¹8_kìú§ç§¯Þ÷ÏgJŸ‡áýþ¶ÿêYÓËÇ+ú. 9¾ŽïŸA˜ÐÝ…€æß~óHcßß=}õÛo7a?}[oÙϹÊïñÿeÙûÕ´—Ë'm_Üf XÔâÇ‹{~¬0£éY˜À¿=èüJ°ní™Xç ¾æG'íãw¸sjÙq&`}mºk, ›3šÚ½9k¸i=áö™4åTdºn+™üœ›2¹#Í1NW‡j^?6Ó/À=œZ–§^kŒùázØ+Üçì"^ ÔÇ'½®²©å„βt—äz¡u7V×2[T̃¾b"é È¢]ˆ+~Ȳ͖#Q`<¶ýÇ“ï7ç,nC¡R‘ œ+æêS¶P²©ùn¼™>põön­0mI¨L Ƀc§ó·aú”à回0w¾€e‰»™²"ë¢kY~n³ÕÛÛöœ Û¶©U--‹›™,ÿ¦µU_ ‘ÄáÅò¶ÚpS“Ã?5]Ý[Üϲ`=É1ë“Ù=C&·õvBn<ëËô•5ïf_T™éÍd\M{.{ÇVc–-@aé¥yœ.“òÂÖ@–ô‰[îñû™šfö·“gjèo_[fê8åÊ"(­÷ò´ÈréX6Nb}ûl·—‘¢ð7~=¦ lÍÃoŸÆwSŸïf0®a‹TÈj W:oA»¬6_®€8¥àk<--T­;ÂïÒìhBFJmBžެˆ?ØqHZ4%–ÏhÑ{@ÀTÆÛ_eEíí A;c¤±Æ>í3–³¹Yì4/¯‘f2m-×§(-ç“ñ,A‰qç+/Ïh¦ÊÕ•kU*²d¹4ÕÍ7>= ÔŽ€±ÙGÚ™°Í ,{þdÍ<|wuçkvzÜݯ¸³«Ô',ûon‡–Ò†#6M«…âgË”µqòª‹ù‘oyP^SYæµPV7Ž{ß­Hl!_$\BD“ådi@¨¤Wp€î°dôB 7¨ƒŠÐC»V}¼øÓ–2|täÝ×{u üTk½µå‘}«`ì¨õì:º€ *: ý³èI$PE À8ög…;ÝD]”ÚÅh1ç$ôîé¹h 9»t1 D{DE\ò0 Dq¥{’ ’]#@Üá#¾©4"T!¬O©à‰€Êí¡@be:i‰â„nvQ¦ŒØ¨ˆá™×¡Ækªc¥ÿÃÇjPL ¬T©,¾WÛg4 ­­1ÖŠ~®¹¸€¨°±¥;×ñ9Ú< tº”~©©$¢HÏâƒ@É)|!û Dâ¾ E°b.ÝA‚ÝX—\Ì ÆàÒÉ®¤ D4jìcwê zù˜¥Ãù}x÷_þ»ç÷g ’®9gËæçç§ð^“ûpÍv½ôÏg±”-%7¢‰1žžÏ•ü³Ä-Ù÷s üÖ h¼q÷|Ä{a ·LOYÕóÞ+«½jÜŒF2Îl8·¥1nCÐí rÞBdѸÝy”¢ÀÌ\_dÒ‘ˆ4‡< EWZª¢Ìá4w*íwù<;[½Ü ›oĤ‡ˆÜVYÝlöÙ„#-õïo:ÏÕ/•££È¬nL„¥‚l–s—§íI8_^ïå7xŠo9ëµ2¶4äl™ÅБ`˹Â57º0ö“Fˆ‹ËCÎò-ì}ÂÔ=_së÷ßêDöæ¡ì~wÅY2ÖàýeL5l›¤H4‹¡91°ývܱÚ\±½_“KztÜBŽ4d¾bÁZ³=Èn…]y`ÕÚ—fùÀy‚7š¨…^ÝÎA6ü.jã³§‡[Rºl\ ¶RÍ+‡Ã×O–ûëþS¸ùŽäñÇ÷ÚGrOHh“(àþÂ/ËánxpÜ­Æù-¶L‚Ûõèò¶§°2¼8þðuø³“w•y¯ºëŒ´¦ì©$²Í¼UNä_µÑ¹Îp¢#.É€wÄß•qÌþ(’6gì²±ðØßsÀj‹³ÅÊñä½ÕÆøjT–!®´lrn(oÛÂw‘âs²;'§†ùú–QZCÖ~´œvËÉlRjr»`-ýÿh_¼nlÏ /JË }‘‘y$/ýÐv ÛmXäX«åÓ(7Û|øŠ§x'ãr{0˪j}^Ãr<í÷î7‰¾v&J“ç¦Ü|ëÜ„Tk,+ò™ Wë¶„šÏö»äÙãSFëî)éö­¼ê ¸0šÙ•‹6¿‡|ÓÐäö¸çžíJ´0Q›×í9EY‰ëõ`JÁÿñŸDäúý‹¥œ® ^’!„xê¡cо+p÷ØEQ 2‹ukÐtrͪz˜i*!ò`9 !â‚?w¼¤tÒ5wOˆ2 g÷”’{×wz‚ Ñû.øû3º/‰_’y÷î,Nþû_™³¼?ÿòû ðìn6 U´<È@š)[ÊW£gˆ«DÂÜ’c#‹æ[Uš@PèbÆ rŠ`âõ{Ðë©^Ï•ä~zFè‘.µhZ6À4@GzŒe0AÚ¡&ða¨t5Ϫ$]”P¸P"‚6N{¬ :ÓŠBbp–¨ÀEB@‚‘ÎEéé"d‚(€ .æNÑçå/ÐE ‚^‹yá¬þ°ép^Ñ@…^²¬þ·£®?ÖõÇ:À ¹‡ad(­Y!T ¨žNÒõÔ.„3C$)‘G¡AI×P4v–7— 1ÆÐˆÙ ž,D¥'ﺧoß¹y¾$sÓxRÒÜé¨p f @ Ð)#„y+Â*µ×ü­Ô ýZõçcO@¹5ÀŠs@ìП@‡Â’‚Ôt\žaò€œà¹þ£R¥t+å)P«‹r­(c2ÀÂ'B±5fíD)ÿ[’J½Ç+k¨4mC&‚Â!¼dÔ<™@kÕSí„“ÖO<' Q %‹0¹U$à¤5R7_­†À&0TY3œe ¡3Hçs÷üÿ‰‚Œ`—œ?^´ëº§sr|:»[8Åß¹çá’Ü2“ÿæïÿ@×u¡O_¿_oØ£s̽Y,ë÷hœ· îDÅpÂ{ä"Ù³žId{¯=dlÛ Þûr.*Ü}”Ã}øs!›ƒÀ2<:ßÞ×dãC9son©x›€¿Ièü¦ëuëNÇ JøÈIaÊɲ…‡·TÀOhª:§ßš_åÜg¿Ž’_ý Åã)¼“P«K\,ž|k[k³&²úÊTþÏÊm{Þ¼Í*ßmßøÔcÆ'Ht·8~…ïÓ¤àvá¯>‡üÊþùÛûú•}ñØù Á.ü$_÷/vÊOjDÏÉùM#ȯËǯ_?Ý%ëuX©ó£lÊü_{òx•Ú—[Jä-&¿~=~$R¥´¬@û¡S“µS{Ê`‘…œ¼&G…áwÿø C/ù0\®4w÷ !vI *]:u@¢ªb,‚]ƒ¦§>z¶lb©$GqxÎ9wž³ YTwÒ¢D’ùê]ùåjÆx…ÆÀStÍfrv‘L^®ú'œJ 68å$ìX®\h~ÉWÍaNÍDX(Y q!D«tç62m¦~ª,’`†lµ¡°*韙D³³‡l«ðvRÉóC¹™6Û6zcÕ¨.3÷iÛFÎf,løõ‹”íäæÃî'´×cÀ±ô`í+ ©^ÕŠÏŒi‡f;IÖˆŒ½òû]´Ö:·È‰Ê sg5EÌ‹|2ÖÙùðÁ2Ϧ˜wûšæÕt†oÀ|«ë]þOÓ ÕT~’ª–GU—7õ3ÉGæ¬8—é&ÙáùìUêÍh•N­åÓ\ ÿź86Û®ºcµéª£sÜ£e¹Ëp~ý¬4bŸ\ÒØþ®Ñbo'r(Š5Ùp`ÖocY3¿5¸ËÚk"×ÿƵV'ßeOˆlB†±¿j a÷.d±ÙÉ’%m‹Æ­˜uoîjð®ñßfôà0¼‹¯ÙëËYÍÎéUì7…¬xEâ þË+3ö/¬¥ôìijӷóè$¶û+¤qKX|4ÛæŒ>õ¸ÿöÕwww…lzvºøÉH&sàÅ~¹²-YM9ì0 ÷¦õ–,1¦i¹Ïjå-È~ÿ;¹|ÿâɆ7# ªP¡JŒ]è#D]%ˆHPŒkfßu"J:ÈB@7‚}¨”û>jŒ"¦\\4Š÷JvçtyÉCþ?p—¯žbç¿ÿ6ÄþúÀpÍAö2ØË€4ÿùßRT–œ'®N5rÎY˜Å( {vgÊ j!blt¡ˆP±‹F'jô ZdE@(‹BMCH"á „s55­uß /®¶ Ã$´qD¥H¨t²<_¥H° ]ŒŒÁ®FMQ…ªuPB=¯+ˆ tÑ@+pú„$¥!vΠý)t]XÙL”–$ ÌI»b—/9ƒÃC(1 ‚!Äka»Ü!DðZ¯ ÂGÃ>çXÂ7¡OVyuôÅ1œ-x;0 ;Ix @M”4…Eijϱíbw²TJC H )‘4º¹ˆx¶:wÔCˆ **ê`Dœ Ñp:ÓA/˜!%3%>Qéb¯ 7r‚´8bŽ f(Tù)@)7+@JÀÚ!ÊXÌ®ÕÚáú  Ë"]j:aš‚E‚r‚ "(Œï{H¬ÖÊ申+PrB„ÛˆÓñz©€©ša$rš·6 õÏAÊSñH†(ÈAP‡e8ከp";°±tTGÃáBÿï^FGAˆÕü D„  Ö֨׮´V˜#›ÐY/F "Úº§oŸºwO&]wîÏß¾K1 Fÿx=½{ï¯/W=w×Ë5}NïŸH^>^™ìÛßþC ¡?õç÷Ï_ýÝ·tßÃl–=¿Ëò.—Yba4…‰¸¹·Ù³ WÐØö†™½¬N˜$s®‚¸]D&7ƒà<ÝlÙ²h8¸Uß0ùóIÛÎEÝg ®ê¤'•[bw‚f®b]ÇkÊÞ¬æ.ãòÚívÙ@ÿ9‘ë¯Q1$ÿ–¡ó“Ú1÷gÅ£Ÿ*ÔJÚâúªÖÉ~œ¶æ¾î¼Ö™Ž}çƒäê.{2É/°ÕCb†ô*õfÍÏfùáŠð8”E Œ«á·;!—̓ƒ‚ÜwýãŠYæ ,è.8ÏMÌe¯ÓJYÊÇÜEØ´‡Þ‘¡7òÎ.û•2g$nB:Ö“ù Û%«áú€€G¬Nî²ò÷D¼¥ ¶ç°ŸŸ»uæmùs›C 7»OÿCÙ;Ý ÇàoÍvï"¦ç¼é“)ðèBøÆy‘!_yGŸÆ]ºÏ:y-òªoß$·d'“›¹0á#C€‡KA›Ú[§°“šhšÖ°T¦÷óW«…=ªÄÛìCC„¼´—Ç:†¸K6¡<fU¥7BÂÍvãöÝ-1\nb¯î#¯Šˆfi‰¯Þ3ñ'_m4מIZĶי+Ùã²Ñ¼~@6Žä!ƒÄ‡Å²mìù)]JlÿX_å÷ñ%º*‚¿¸½œ°?J(Âübe&« ûÊQþïåÎ|ÅùøógýZØÓüüú³¹éÿNîv¾9GýVskÂÁsªk6ÀzDÂý S]s­PEïe,y+àh ,P‹y×Ó=a‚õJF´ÏßCµôÂh³ ™SN+}×YB’RB€È”yßÁé&3Bzúî-ÛËç:$­À{±ƒïÌHë$:# ­ ìè·ã!‡€íèC ò ‰Jä©2%<Á;Ä âƉüs:»±Î}¼VS9¼Nº?¿ÀåI$ÑF;V¡÷Ö+ŠÊ]/ã˜N „—`©É4 Õ$J©iJ¦{áˆêÙ3Ø""K¦¢…ŒN3޽f)žjmÔÜk" Í£†šFgÛ–hmÒîGÉ~Tð'×܈¨0vhȇ;P`ÁBíDm›'„hS`TëR &¡|ü„® cŽ'(èw !…‘Èã1}{ n° x¼ Æn·É˜6urœsWc­½ÜÆ´ÍxÌ‘„ G%@´á¢»Ž•þÔXû/'àhB;´©ÀG§ßf ].ÂYVÍD ÁíÂH§Ó{/»¾ìvûožwÏÏßüê›Ý‡}üå§ùœÈ§_}ÇÝNôìÌsvû>«éÐØõÑjk‘‘ÙÒ»òáÛo¾ùõ/–>שÜ?ò Ýð£¹ü?¿~1f¦»ÿ$#àO:ÿG¼kÒ`Îf p«PûN·+n¿û+ŸËíO>×ý,'“î«ÊEm–k»ÐœË·Ï j5˦’'ëÞq)fHq’þ/&×'2¥"ye[¾$oð’!Zôšóô᧺˜m«IA€“¡'ψž/¬N”§YO±•aâvÌx©H]Ç:½¤-Ãy-’çŸÉsåÅoå꫉í4ê}³Ñ%pݰ°¬ß¼š«„äà.æŠÑ´õE¼©D¯êŠçMF³›}ùžkÐüãÞNn÷ypUxw‹Ð´<Ùûq«+°j'¿UõÉ[5ÕWNÇ‹JæøƒÛ“ÝVùn!ä­‘÷€ÖòÆ]ØáIêŒmæÛ“ö#kÅþ¹ÔÏÞ[ƒx³ú2¼§¦¹«š•ûw§ãaëy½þÑ–Më–¿n\Þþ™îÝŠÙ;¯Ùk³)»Lò¼ÄÓÌ}U»Lœ[⦫ÕóGäÎ@žÏbWü²7= æ\Sýæ}g&½ßkx]ÿ¾,º~óŒë1ïÇä­ÍÒebÉ>»3ˆ…uõfßþÀ¾ˆç} ¯ÏýË:î Ãógí|çîÌo[×Go Õ—±î'yÀ#ú¼“ºSu½cÒæ*Àõ^ñ)úÑGmiìö&h,râñpîHþÈ}‹SÄõaÝ[oîÑç“ÁWÜæuò§rYÍ‹¹ 5Þ)Û{÷7/Ì·^ÙeYµísÖÆ·l²¤®ßkß!|Á^ï~9¢.Êónôå>híCÈÛ¾Á·z {>xž'ÈKC÷ëq¬œ]A ä?þÝß½~ÿ9#!©¥R™Ê,^ú⥀òR¼”B¥DZ).I™ÇcUÉâÖ;ÝJ1v†,cS褔ªÈt©c „©5¼c8@2:>îú§'ûÝçøü9 C„†5ÄñåàÏO»§.¿ÿçz¬-¨¨)³ãç­²F¾6 ÍB­††¨‘Mîäž96B%\„¨ É dÊ„ŒÔ(˜H9&ÙWy*í7dEVxŽx†éÒ¶zÑÇÍ‘šìÇêl,»]¥ÈZ#L¥w ÕD§àJ³f,E#•@„<’&“™1•Ѻ¾°ó|èžû§ýó/¾í?<=}ûüôþ:š>Ðê±Ú¾oñ5·×ãgR9´þã3¤”²FÚ¯~õ—ý®ß??}û›_ u´ëûÍxú¼pÝ W¹Q<­­BWKÙul¬‡fß|úçòZB·—°7@Û ÁÛÞô+ÚæÛ~nô”Š7ƒcrsñ~L߃¦šoÞ‡kèçJßä"¤»ßp=~ÛTüAçO‚̹ˆ¹©ññÇæjùtó&õs©ÝŠË®±šœ³Àn‰k3ìÀ|¸ë:j;¡Kðþý-)Ë%pÁ¬@Ñ, à&Àí«Ê+†—!ä"ÙbzNêÿHy ©1c²,'—ËuÖèØÿKk¤¶fýKœI[œ»»/ÁZËq'.…Óžqgf4O‘Êö“vzìçtÄíúžaÍ+y­V·ù«wMzø’Ó4C“¿u<ÚëχÊ;9/­€æ[ü±Õx{Qy í°v[Ð%2ÃYc£Gï*>¿P–ÚÎ2„»E¶vy¿fï+¼®ä-]«Á&\ºÁùšë4¾uü…Y~k¥õ.ãmm]ˆ ]PK¹y¾·¸-´ ×x¾¥Ær†'¯à |c…;b^ƒ±¥MYûzJ^$§ÐmOˆ¡K@yœéfë¾ð}{ÂU»"¹Þ:Ìw'ÚÎ3Ü̯Ü'xh¥­nåô@ëÝÒ-A·ŒFVû­ëÛÀÑÀ·R‡—Մ륜oJÕ›rþj¸j+¯µ/¯ŸýK^«4åJDå$=Τf|GêÊJä!òíò#ï\öß–º®îÛB—¬Î%Í ï8½«/Ò"¡»–ïåB~ÌÞ“/TZ¬/Ëâû´ØUZå ƒ‡ š·Žci}®|vó¡«ùNŸº©€J[Ѭ®Hf«¿¶À¹‘X&.›€Å¯/H´Úô^à{Æö…5ÑÝÊœÎòJW‰4-ž)­C¦›WiΔœÑ'¦åèɳ~´pKOåÿ/ÿQãøzÈ3`fîF#Ý®+]G'Iºƒ&È(&ÔÌV“šÊÒÉ„u¤#ƒ-[¤R„ÙS1™ŒÚÊøüÚŠ±ìJ…³Éžw„¡°~:¶×!‡ÊCµ’å©:WS}º¾(µÿòÏfªß¦l¡!âØ”‘-PE6+­e(Bª„9ÀKM¡ˆ0ËLÄ8ÕGú”3׉óNÕΚ¼[Y@ØM`Ÿ ÔÄpáU…`ŠO"²2Bß»ïöý7¿°n—uˆ<°ëÜQ0–}§Æ¨ØBjI/ —¬·6¼dKÔoÉ %›)@±ç'+½`Þ=‘;â«"£)Âh‘Õ@´iöé="´n'ÕÉ 9:&À:Æê bÈ 'ƒó6§;…S£_qw*œ³©< îa‰t¸±ì:•Þ­\€Ì˜ÉDxGßõ¥"jÀRPŽuãÉŒH%ý2Xi™¡a²t2ãÜÃż$bDí¤,Gš­‘n´Ö†•­*Ž˜ŸD¬D©$ЀHDL6× ÜQz<}‹6’‚)´zéɆhˆ™+2O"˜÷0:À@‡€]9††&”7(P(>%*§Ö‘óSz #2Á±!±]#@ÁgÒãœaDVH¨š†CRÂëØ76v½©`:‘Ñh`”û H"V³‘ÃV`3øx÷q>g¢µ >b)#3e0ÚX ifì¾ù`Oºýó/?|ó›o»]ùð×݆ֆæ}‡®‹¾÷]Ad¶4ÀŠssÏŒz¨Ñò7¿þ ºõû~ÿáÙÌvýÉÑ€ËÝÔ…(¹æú¥=ÎEã95HºC@½^ÏßfòœQìç0qÅ6Y¬w§ú§yÑè<ô»·½&à¯t„y©´Qè±Ä .ÍO2—²œÖ»y½§Nèžž¹ŽònÈu·1Ž›5I=ý,6J:—Os1íAëû:qô¾&èÁˆEÐÈÆ»àr«ïí¤ÓZܼ28ÑïõJÞíÏÒÚg½ç²=~CœñÓóˆzqIfÎŽùòo?´¡ýÓßý]Ô ©lq2„¦uÅ‹wFŽDs‰)F¢o)†”Nt»®9Ô4Ài]1*j4F¥ÒÂJ2½1,[CÇ|Þ{kr°Ž/ÿö©<=Õ>uÅÓ µyÙÙ®äqÈ—#!›íÛ§×ÿå¿¢…=YˆV•i¥å¡¾Öª%¤2[Kï Xv;dÒ­uIÁÚTZ“‰&¤Ì4‚)iTNÇJÿ‘‡n'š¹H”IDrºênpN0%òdó; ßMSAô¨†{gi ©CÃ1²Kç^E¢¤UBŽMmnFC¢/}/öÈ&¾’,=­ëÚq€¥^ æDOÛ]²xÙ Nú”\¤›æÙ$Q:2šbð®©lHÝ$d«C3iûL¥RôÉÆ`2æÊãä=;2âáëµ¼v¨:Òá¥ó²7/f}ª£ ‰5€Ls(k}©ËhÈ”Ò:cOÀLJ°q„ M¢i 0sÀ"ct&R6iVdÆ„Ñ"’æÅœL Mò(O^Á„^Á±´?:ÉcÇÃëµà}/HÃáXå$ý{ÐŽŸ‘ çd‘‰È:º£\îh£ƒ4aßÁ Jd™Ž‚ûiw;zKdÀ}20!Œ-ntA‚ê” Ä1ŸQ5ùjVÆç@, gÔiƒfD‡é¨Ht†âS½ÿ¤û;È—ÄCËðı£ÂŒ Zÿ´‡›ïËþ×ßÉüùãn÷ÝDzÛõ¿þµÀS¬‡¡!ÃŽI·Ž$³%‹×ÖÆ¹)#^‡®/OåÃþÛgA4^Ìhg+àLÊçC!Äï}_Öýÿ9 €þø·¾ó’Þ%¯¿k<üI@çO;]húcy×E*|ÄŠ•)­™$úµzÊ¿æ¤tªZG*áœGáܨ¤œÓt–é¶Sùü¤*Oõ/SG%”yBÿç…+׋ïä²çÛ¡ÈÄÀ¥rrÆV¹ëTª7ùÅc¯‰)4å¶NPiQƒ¿h•¸8Íl°èNTW0œ(·hK+Š 6 ¸`"û†âL‡°&éi}¿Öh~ÐóÁï]^=ò¾öÝg}­/ÚúÞUˆ+€–ä¬÷ß·eö4ŒŽÛö;wÎG÷ÆÏ7†Çe¥ávÅ(ÎlDèm9ÿúVLO æ  Á'7ÕÉLuu^· ±±úÏ®Æbìé:øúòpU¨}½ÑíêUݳXºsÚri=!\*zu)v]oæÝBÓŠ|v’ç½câ£Ùò$~ÄNæ<£ë=Sß=,OnU¡ðæå®’EltTlVèÌ*Ôïîou3ßï¾s§=κâàV-ù½¢ï›͹9÷ǬƒÖµÿ˜ZÞAÒ]o¿ÐÈ÷qÃÞGž¶ó9§ZîU¿ÎÌ&Zw•e^ÍzºZD–+Ézâ½v]Û´y?Ïû3Ñ¤Þ û£Sñ÷ ‡ôNjÞs‹‹uíüB]¢ãÅ¿Cüâ6uÞİ~ÅÈrjݾÍÒÌB’«µt«Xòíb£ñbѶf¶ Wû3xüó§ûá¿ý/ÿkÚyQ'af¶ëÇC2÷Òï:3ËŒˆˆ–iH £LÉŒ™’`$ hVÜz£”4Cª(C@¨X<*º$_}4YmÙŠ—¨µ}úT8ûT×÷qâå%__ÓˆcUŠ)ïKý×y~0ƒ ÃÇv2#ŽÖ꡵¬î²ŒQ›EÂH…¤+3¸Ë]h–Õ é­ÊÑ'•¤ÆÏOLV«[6 ¢›æš8|F¿¿lnm|¸18J0B6ɾ#>î صJ÷ðÎÜú–¬Lëw©pt…%P› vhûßVòõÓpøAý3¾ù›_¶Ïþ:´D_jŠ„•}!–}¢;+;óë'f¿”Ê&«f ”Ax×}$ÑïûŸŽíP¦¤Y1"H#Q3ËÇ TFe´ÃD•PöˆåDOõ…æÈÈnd×tÝûFÀHf*‘É@†šHšÌSm,ÂaG@R&sZš(¹¤4ž)ÿYÅbV ©Ì ³ô=ic'‚ ­ôˆV£V¦hC§ãÀQ! ‡‰wß„lÓÄ FXí`ÜP DŸžë‘œ3f€ÆœAæIÜÅ ±º¿Àæ¨ÎáuÑ"Ò¦$“¥Gq Ç©xßjè:äh-(GTMÄ! 1:[ÔœúH$ðJ2Õ„zrô ?ù4s’ñ5‡Ijlk(³ªÿ0$°³©„°wؘ'sЉŒ©’}RȤq:f”™í»þ½ ½ëŸö»ý‡_<í>>ïÿ⯑¡cMô»lCJcˆµÛ÷È>¿î><+³5†ö«_ý&2úçýwñËÚ»¾¿Óº§Õ¼ºYP>ïÞã­ö{Õ¾[jÀ@`¾‚_&þ_–o^7÷—7vê¶>÷£²·VÏÕ“oîæ×A‡ÞŽàÃ%c v´ØÍÎAØ\´¼¯1ùÏ:?Ó@7ž„Y)Îõ6ûXý¢R_C8@…ó¥Ûî¸]FÜ$Ÿ{|¹­Â®e™óNø½îÐó–÷éáh}skaƒrÊzœ¡D õ„³4ÁÜ›¡OØõËZÄ͵úštçâòІ4ž]£¢¶ŸÍkiy1^ÞHG-§àó8Ÿo¬?n½\a+…¿àlq&â|× ‹>—‘ß­£¬w—¤ëìÈ8»ÏË5Xdµ9ϬðëÓ¾³E™eGu~ÞÏ-ºìË8ImKÊÕg-.ëb0K·ïþ:Ù¤ è¹ÎK^ô.Ì\Ö(N ¸f“†ÎH¾•²ãêê.ýœ¼¢§mÀ¬lcu™¦GáN}µÝ=ý·nδ'hÊ_KíQsÑ‹KšÐ­§WЊ&ßãäZôœÿÖ9€Ñe㢛“Èò°îÕmJ¥3žŒ6Gšt__gD§Dä}:O‰Þëy®kÃï§U¶²;ä[y„9ƒu6`®×ÌC ]FáöR¼ ½Yœìâ ¾”®ÜÙÑÜñv¹ÌˆœqdVØ=Σ½UEÉ .±)Òk¹êO9‚«»sãz>u\*]4ŸwA@ó•Ž«ü¡ ­ÌãÝ›V†KÐÄUPq/óñpà¬åvëüñ\n…WG?.Õ:ÓÙi;ó¯K€£¹]©Kãû)³s6‚M;’OÿöÃßý/ÿ›"£¶Ì f^ÌÜ­¸ù¤×z×¹0"ÊRŠºK …L!DBŲEg,fÈZ¼ëÌ™±/fÄh3J³bfR¶8Ôäç¡ûÆ[4}x.õ‡Oñ¯?ìžúy),¦ï?·cí¾}vgý·Í×£h‡†Ò›PÇŒÚÚ­f¶l Åp YŒwØ\fˆJëdH™K‚‰HDDŠÈ‰ b„0"Œ¦©ÐfáR:qÌG»'údÓI! 1 ë ðÐ.¸ìÆÏ15Õ0$Ý‘,]ñѳÕÒ”4¶È64÷½}ÈTÖ×£y×íú:´ßý·ÿƒlh¥{î %)Óh*@1ßÙn¸`V ­)) Mj,BJ­[‰h„¦·ð]<Öl­Ác‘-éæ™*¬Nç -Ðïœ4n  ]öêQ‘Žþhkìúg+EY)„¥RHˆ£[@RÈÀ(‘NËù eìÁh9"sŒÿ333­˜0‘- ¨ÐF ^ß¹™ ‰tÈ̳ˆ ÒŠGÖÈ–u@mxKÍ'ç^%Ú€¡ž¶. l‡~ë&ûÜi¨äT× ¬8]æÔ“M0ÀgCh¤$íF†ÒÉa8cÊ£¤@¢%Hdàx@Ùa€ÜQ+ZCHDÐLÑÀĀɫy*Òª 0$0¦*Æ×Xï?—FF"‘É‘táùŒÉŒ±átD)èˆ ¸ÀDKt.´†! yP©Pb’;cçn§Î»çž¥ëw¾{îËn÷áoþÕ‘™Øíwì{ó¯Ç–0·®w3cáÞ?ÖÖb¨YÛo~óHu»Î÷»H•®/ëükÎ$£%yœº·ãº^,–Éòõq«W¢ÿ™ÚÈ!n§ó¶öp '\ÒÐðµŸ~ÝK­¯ÿ[šqfûw^ϳëB˜Ç¿Tã\?á#ð%U w6_4-ë­€Ÿ|zx'Mþëß~éÃò“wüØÕáëtü4×}ÖÀ+[º/ ÷{£¤w Z½å¦ý¥3 ï|âªàN[ô­€y·7M~¿OÆ ¥€ïíMÔí)PŸîˆVuv:õÎï)uö…ÿîÿû¿µ¡Ö¡fmhìJ_ºÑMwƒYé:!S0wÒ™])#(&#‘YúâcòHi4#D:Â%8«ìدa@§¤aÌ#0DÆXÞ šõõÔeªþë'Ï–V«u°¬%2‹s_Šÿú‰îÃÿùßKïúÐÁµ!j;Û¡Ö—!U3›ZZÊ<­ ¥šØ’ÉJžü#ãË•u,5KœÄÜQ•%a¶ØIŒ%Ì– Ãʉçȧé a¸@¼ ^Д V`š”;ºuî„ UT¢¥t,Ñ÷„ØQ:šwÞ9¢f‹¦Æ®tÞÁ}ßu ""Ì\ær´±ÃNXIÍHd6 ¥ª²a Õf" ©Œ¤™ÑÌ”ŠJeDf§–s7*ÑèXuȨ,†è¤sDNX°I3†÷PAôH‡§y÷\ž¿¡ûHŽo©lã²Ó˜BÊ©K¤Ã;%¬‹ ÊL)`°2 nYº’µÖÁpgŽÒõµE†Ü=Ú±ô]ÙuÙ¢•¥E‘ÌÌ '3­q|Íú™­µijˆ %¨Ãé™K¤°ë±{f'eK9ÁŒ'' B %‚‘yïGN ÿ2ޱ‚&+>>#"íD×é 3´â'†‡(áD&ª„arN£©‚#€FÆrü9GkĬb# Ý(ÙN…™0 “‚¨B:¢qò`B@ŠÐ9@CKt¬ ”Ž€Ãˆ‚©·&χ”pÉŒrCï]_|çÝ®ï>ì•HÚw9¼ú¾<¼Ÿ½‡™ºCËš´,ݾ)bT[ÖÓ,ge·Û=íAd$˸¸/­ÊĹX÷§÷ßÃfÕ(ÆJÿ÷´ÕÒ|óG/£|ǾE¿ŸŒï‰®:ÞØÍ] ï 1VÐùs]Âê’ý$í—Fÿ? žê×ÜËž2Šãt^N—êT[¨5ñâÒ»qISñÔÌLaÆšU¿kî´y)[ä¹téêIZ&³fÆÅ<„—â3;¹ Ïëß·ñÝ×@6RC·̯Ä}^9%.½s.Þ˜n(›5c|÷ñN³ øÅíwM¶ï ˆoVðk1~7eŽ;W÷÷>ièÝ—é±ÔߪD~xjyÿèÁ#|h1øchúÂËC ¯=”y_wÁvk®>»B½w©ü"d—÷Moîæ¸ÅÂá½Áu>c]‰;Ú|Vȱs]êúé_—âkÍ”_Z.þÈÜÞ­Ç=<À4ûn¦á7¦ˆbi;¼úBaåC.}õ4×WÙ±-ÛéN}ðîÎä'NܸïüZ‰™·v/_øsøáœÙzÝ#ÿpãý »sc¸þã—Ê ëÛ½4§}ó‚ŸðºgL¾‘˜×tm$^±8k_-0—ƒk–àKü`ã^ýX•çÑ1³ª³”îݽ1òZ•thõ?¼ôÝ üŸÿËÿ”5²A£ÑI73ë÷»Òw£˜’»w]I BFf¤™qÄãf>N×f5:7§Rµ;•Xõ2;·bVC­%Å}±f;‚lÅRÍör´ç=ˆÃ?ý‹íºnWbhQ›uÞ}ØÕ—ƒï÷úü/Ÿÿy°bùÜE Ff¶P^u¨qˆŒÒ¢Â\¬“a,‰F–4Ф‰ªÕ¹Z GÄINZ& ´‰ä“6ñÊ1ÌŽm@p¨à\57aa@¢#º'¤0°ßƒ@v|êöåx8ä!ËSÙ=—¬Ç:Dh0e;ÜúâI–§§!†G¯:Te+6m×»Jͦ‚h ï¬t¤ÑaÅÆååj)¹ÇxG‰ bÌ´TG—Ø¥°±’/U3c,meÑ8fÆQZÌâ5ò…¨ž ©mÚsŒÃ2cêx` >Ü襳®ÏÒd3E(aÈ€"¢vû.DÊE& 9(f]“B‘…¤£ÕÙÂå™jñJ3å,])¡$˜J u,f&Ôè¥8½xC^Uk{}ãK´ªƒ¬!Ù”ȆˆS!\úG€LxÃ0õ@L¯œÜ¡h¥LŒ&¥ŸÔïáDkxý|yüÝ /Ÿ‰ã€|?B d½Ìߣå205š41…&t 0MzŽ F8O + @è `%â (ª©ccÑtèj‰Fv¦€9¥ORè „£Nd$`Ðhfpö½}øXÊó“õÏÝÇçþãSqõO{ûÅoœèûÎw @‹T­­…ؘI1:”Gm­¶:Ô_ýê/y×yçýÇç~liš Qšö7c‹ëYøºçòÇä²ßÚ¢-ˆ 3ôÏU@óîÀ¯*¢Îã*=\|ÄSVE¼Ô¼//Î/ÜRóoº_·°µZ¿÷Avž;áPÃ?7èüloÒ+¶„+Σì•B|u³¸Â=ë-*oýù²‘_‚2ð¦"ÂÅèF¿Îõw.ͯ@Ió†o<¶kDñ«Ùdk—Kó÷ü<´AÕæŒftBêÏý.¶£>-j3WmóA{–¦¬ã’¥Ÿ\·x¼Cgȇpé<šSgH„N®‹&®§á¹ÑMxéSà%záBž™³âŦÿæâ}¦ÿ]]xŽŽ¯áøë=Åé2m~þÍJ®Múè [ÇÙäu´×³Äó^žÜ®^[òÏEÿù¯Ðö³m8ï„XoÎ3›a×ÄÔÓÜ´i½¾ïر:ÑSÆñæ ˜óæc{uúäͧc>ccႳŒEu6Òv)Üg„— @ë¼Ó KüÛßþýñÓkFÖcUŽä Z)4€ô¾x_º}ŸZ‹Ú|×uýîx<˜[* nfÊP6‰]W@¶VéVÜꊛ""F`HM°÷É]—EÉf2t]iCS„Œjjt»ÂÞ­³Øï[þëN¹{êuèãå˜òòéþßé°‹É‚Èc‹Ö^†Z¶š5¥–™f£ç. $‰¾œ†J‘k¢ôŒ ¤B²2ñðK6)¶’`c¹ú©_€ «þí´îa(MT8]nVà%£y7¨ÏüÙ`†ýód`@gñòùÕ[×uöôñC(Ÿ?¹{æPúÙÌlß—â~ŒöòéÉAнÀŸ:4w—u0; * ËsçÞ%=)š&¡7i†ˆJk„E eCÔ1Ñ6EÁ¢¬Ge7N¦I ¥hp#*,iBÕ˜-cF×€rl†kÜ'óÞ±g ̧&€ý3ð̰=º`ÜD‘¡H"ÐfzƒR–V–ltv‰Îœå.ƒ÷T dî¿û0¼Ú1Ñ €‹ÖV3›ïK;¼Ò-…n÷LŠøͼРR¶ªâõ5ZËà êѬBTÁЬˆ1þ#d ™èwèv“ƒá¸ÉÃd'ufK ' ¿ÛôQÆ©wÄ ‘Áz¨q©xè{(1 ˆW|úð=2Áݘƒ9ØÁrB µ6UÖLTMNÔX¢ F˜!Ùä]œ@ÜÀ¼¬„9^ŒÆ½£wŽ`Ýèh  aXLÅB±ƒúqA44¡f('Þó8< Ð$ŠÒQ:zWÊÎýÃGÛ•Ýǧù‹LD«å×½ûØ÷]_v,Å»-i¢ù®‡û´¢Öz¬q¬Êìv}¿ëöŸ?þú<%j4C³­jkÎQ?ÏøkòA)ö]‹Ú\žX7n­´3n‡ÒÒÑò4îÀ5~cþÕ—€ K;ÏeÀ¸Ø_ãC§ ‚ G¼Xcò„ÈݲºZóH¹A¹æ ãöÖnŒq¾fE`\/²W$œµšs–LØh¤¹t³‰2ž|AõÈîöO:Ï+èüY›]$±no|.,z^Â[¬á]Ë!1äbeË|Ó dF…zoŽä–˜³ùy_0±œ£è¯¬ÎãUüd¯k°e‘Ûª`{ÍMÖƒ#˜7´ÕÍÌãæUÔ•ÂHÜÄ•]ÑŠÞ2\%¿°2=ÓQ¤›ú»èFº¡i>š“=ëK|Ý4vhÃåø§êà|X¾fÀ%µôÎ.³k7X~… ¤û²·ôÇ4žîÝÚŸü@—VïiÂU6üÝDl¤ovèšÕþ¥ï§×Ѧ§×W{Ô¥w<~øâ¯Úêà2w¾¸¿GÊÊ;:–Ö!ó2¬KÀU¦O7Â…ÇêQ^Ë€«þWf™>Ñûî÷{!•Üp±x{=øZ§ûÇÒðEóñÜ$çG’AgÁÓÂÀ÷«®hœ»IÍŒ˜®f#Þ¹ËËôæ%¼½ãƒ}ô‘?zúáõøÙðÆüòcÇÖ[ *~ MNˆ³yü¶ñÐâÔ´Ê ®;/ÆŸý¯ÿïÿI-[kÙ"R^Ü»®Ûõî#¥+"¥4Ú ¤{¦€”à^2QÝÆƒ1ZóÖÔ†ˆf})pE”-CáîE8D†`†=…YíÊžD"ChH4š¢Öã÷/]«¥F÷ñ Çï_"2UÅðý¿"b8T @Ô:(k°f¶L$µ*› RÑÙ'QL“]jbdá×cê­zmdk/ÈDƒõMæ®t¨@†,ðH¨ƒùt3³\öQ/´d€t„£½Nèkð„°ƒC­íÐú}?&ê ÍÁc;öÏ»PSK4X}y2ëŽj]ñh©ÑÏ—d1“³ë½”V!/¨Š"jCfưŒVÙªw•­IRc‹¹!RÊ ÝŒ'cÝŽV}z¥Ê”B£³CJ)À rXb¥óš…zòÝhQÇþË¡ª6dÔtM$œfö$™we¢uÓà¦ÌlƒoGž‘‡Ži¥Ëá5h:zç}GÛíÌžåž­—h4YÃhŒ¨Ÿ_5¼êøªÚФí3Z›”úQÈÎQúÏiru›<ÇFXéô»<—Š):÷Q|O”sDÀ Jâ”ýdbLÔ>c¦.„Ö°{š@R#~*8‚€ÖâŠ<µŒ0(#G6 mDãù´bœ5MbDQ@ª§9ѨD!ÄÚFWaÙ˜? „k©OrúdÓhðsî’(ÄHé’>=Ù‡ož¿ë?~÷¡û¸Oò›¿þ¿¢tF¾@·²ïûÝ®¥i¥ó¢ÌÌRÙZ;Öv¬ñÿö?wï?~øð«oyîã×¥¥¿ÜNþDñ¿ðWf+7œÅÂòÕCß/ÇN%5ÔµÞ{)*þQ—ð+u¬ ¹m¯À-ÛY®uò7bßIúC½~ èüÅ `Ë|á¡Ö‡ÍŒÇÕý)@~_¯rÛÏôÊt’çB§­ìË:ZÕIjJ+¯Ÿ·ÍZwm[Ž3ÉÌ|sæ:WFó¯œëî`¼Îõ¼§Ôò®<·ͼŸ•øÑRÑ£â¼4éÁÐt–˜þˆ/=2Ë/ãÈßÛ,ÌŸj&}Ÿñ£Ïa£ZpCáÃÁñ{s˜? Ä÷'ßô}Ue_ºL¯ÛåÞ2ù~Ï ˜9ÿ8F¤0÷4|›ÌÂõ R_ NÿÒ©öb)ÉÛzÍ£¥üÒ«†¥Û8þ ÚGíË·‰C«M]Íú t;%¬E#ÎÙº‡wú“yH—Ôó/ãû2íË ‚¼o­ôîÙqiyt 0+c¹ù~n0o~ß›û µÇ/ú—©¼~ò fíÈä¹þ¶#Çed ·6ª§š‡êôïå$Þ3“Þû"^ТN“óúf%²Ð<Œ?fxœîðßÿÝß?xýþóðẕ6æîýnç})}ßõ—B“¤c­‘(÷±H¯ ‘­©ë3RF(]é;Ï¡æÁ-¢/l™…fçÐŽµuÌΜ´BQ9Ð;‚^kSƒ‡¡½Dˆ,»Î?ìJçñéCµPÿísf*uüí? IS êá€×F<£Š!IÙ&/ÃâSgÈ87N•QýëàÛ䃚qÎñ’”r´-8êûŽ–håh‰îi´'=ÏsT0M©”$£QAI ¶ÇHC w”Èq´]*-¡†FDdßG*ŸöÏî~¬ŠýSA9:Ôjamàêv{ßù¡E8ê».•ÇÖ¢&|'ª7aù.jªµvŒaàNµ¦no†lm@™–UqZ„´HÆäÄWìâ]o¤6@ 1(ŽDLÕûen*u*?NÐì¦<ŠÃØíÑ(}—n°ž ÷e MÇÇ–QýC4¥Uxééòý®x‰¬™!R2F î6 GEkíèf2µ:ø®£€4+Ïfn¾ß}|&ŸÚáH"Õ23'l<;FB-‡£Ç¡Å!Ñ25JäÉh7Z §á4ÚŒý~jq #êĺ™* @ŽÊ~i¢ùÃiä™!t=JAòˆYC'¿_+ Ãz˜Á+Èœ\(Æ„DŽš{2j`ÊÁL¨dLgDbj;‚ŠÐ0ý1/ö¿J ž6ô.ÄÈ_zÀÆæ Ž t{Eä£÷užtG_`œ•ÑŸ¼‚§Ž`*A+HwﺧoŸ}·+»RºbÝ®6°z=4GôºþÃ>[¨È ¥t<¶¡¥õ.!#¢FÔÖ†šÿñøÏ¥ïöÏO~õÝ0 ‚ö}¯E³:î6€ý1ÇäÜÞïèþ[ù¥[­c¬/[ÏÖ¸³Ö4®p ?á…»YxÆ÷[[[&r£Öì8¢þØ%¤Õþ•³^+þʽ9Zg8‡wj›Û~?H½ù„,÷º;µÚ+ÎZF¶¿ôa.X!§Õ}á8}ÙŸÎzú' ˜ËŠÒ¹oüêüxK£'Ž’RÎZMVmÏ«Pî"·L%ºÔ8]Ч[ŸÚxÚÅ%Xyöë W’>Ö¯…YïDOà ÃY7TòëòLn tæØqa°18'(èåª\’(çÿ7¾³žã“×ÃÜ¢a¤`Ëm|ÆF?§]f×`ý¨lpÓô¦ò»ìrZÿl)Ÿ,ÔÅj\^Ö%E« mMqávVˆ[uñÑ›\Ï¢ /Ô’UWâ,¹4»/3ÏÝœ©¸µÒéÞLunÄZȈÛçsêt»˜°Î¦ÝYãü±s™æû¹n¶Ñ÷v¹ôºs³ÙïA»a™œ=tâòù˜þlJ;ON-×D­&ÿËU\´Ä-ÚæÖéŠ3ÿgqõÎ1^Pg«’Ž ÃᱬéÜa‡kGòÎ’>Ÿ¶ÃêL”zkýž0ˆ—™|mŽÂKuãüTçYœY†÷ü}fçUpörAÆXþê6iö_:ÒN×ó6eÁÌX ͰDºèu| Y0óPÒ²áñ:)ÁEo†ýá jñV…/Vcr ã–>o~]ím.Q˜„U³êßäÒèfòj1Ì´ÌiqÑÀqJásµ;þZw6Ž3„ú|¦³‹çv³eêù·xºP‹a.–†õì¨ÕÞýj¦¸bK.Ÿòåüp+½±êT˜³Sp·éUðˆn_öE…É)G‚3åHWénäµÜ¼GP^~µ˜Š/Í- ‘úÌ®º½Hk¾,Ì&hÎæB^ ­ôøsmÿt˹Ü;nÙ2oì%„—®šŽôvûÌ ¡sÝì¿y…—&“9Ï9~iÇ¿‚çžrîÞ8­TŠsÝÿ&ëùê+¸•9€®ç$žK›fi†eâýÍHm ¼Øoÿþ¿uøôš5êP£†¹¹;ݽ+ݾ/}×õ])…F•S‘¼3ƒu­}[­‘])"¢¡ ƒ»õûžPAÉðÑz4K})5h¨Ñ©<¾™ÞY¸ÉP8dköËY¼¾­sxþqGýþÕ¶{öÖtøþ¥R%ZÒ;YB©l ’@c@9²ø P›'†‰”’@×a2ùÕ¥‹dtUYÿ! G¿;I´ŸŠ³ ,L0µ:­7“[!i0'ÙgdÈ# x"a{|Øï ñúz dŒøu/„£aÿq7Ô#™])^œOCóçþƒ,!õâë0”¾/ãOížv»owM6ªÒžÉÚ3²ˆ¨„«™­ë˜jY4ÐTrª·4ó8Öáø’ý̨ˆ„sTüAÂ)´ U´#TÇý‘Ð!sº&:1åG” 2Xw£!ƒÙ~¯ÝSÛùØQLH uY[´Jè#B&ZÙûî#‹ÃYú>“q¬QÕqsæ=Q³…ŒâÎt}—cN&I3/u •þ¹Ûu?¼~¢‘i£m ›G­jD«yÔqh/Ù_GŒhê0a|hp¢ÕË.²ïá=D îà¹EÀ JZ€1ÕÚh® ë1$B £t0ÃëËä1 ›ÄýÑ À 0 ¦¯v„h`^¶L­¢µñv¨æè[Ìà¨×ƒ69O;å„eb7Á bÈ,èlù À HÀO m›…X˜NÊÁi::&zÂÇ$Üdº œ ª ´ñJRI+æ]‘õ»Oÿâ—‘ì>컽 ©ÝóñeèùM÷üle­Ÿø·Ýó³:—±I2óŽ$[„BQk;¶hñÿö?—¾úøôͯ!i·ëѠΨæ+ èÌøû!ç¸l>ìkÏ;x¸S1‡n¶0^{lᤛ⬣sÚÞ­èŠ>4ãc_Î{Fš‘'ÇÕïz±y æ†ÓYêJ=m{t[(™º­¨ã—¦m^¯{{ _ꈳþ„õÝÁ•QÓ=9[çè)`=Ó'Wzo8ü Cç KÅà¼@S5Ëò!¼A~¾PY4—5–Õ^Z‚6ý«î—FÍïãWO¨Ü ±¶ní)rYd-‰ÅZâÎQ‚¤r;?¶l5uÓ³á‚úÖÖÜ¥”Ì„âæ[̓s£vÜtpàÉ¿x’·/Ö»¸%7sŽxÜÀËZÀ7²`Ó„wáo‡µ_7Ó6Á¹ùh!¿=úw'åîÿDrú}ÙÜëþäuß›Nä½TþOTäÎ Øw~ çe‡×©ùyS[â:Ýðg¡ùà8\:IàÖ 0¯Ñ\,k¥à.žûÚvá_l‰º±-ãMÕâ acž—½þbCr^ŸïT¼Y¡ðøÐ̈́怳õì2“óžj^Z(·;<½«gâŽÑñÕºûÆÊ³yëuM‚œ§q7€›ˆzþ>:.Ï6o~òæ·Íƒµ/븑µ»>Þ7>ò­â=_½ÈzŽ©ÇþÜÜÜR¿·@w‚Ò7¶QÞÃRÅÿ\Be¹¬š'.¥VW¢½ë§äÄ]Ý×»Uù (­.Âöóµaè ‡¾kàñ}ÓéZÇçféK7¢7QK»¦mAýR8ÛºøûQýByøþ5$èÅͬÛïúýÎK‘ÐP+ÈÞ{)#@3só!ÑT;ï­ëE¶ï:X<¼fm‘Ú„Vžž¼Ð2 å˜ÓE PW,½7ï¤,ÊOQ½…iJ!†-YJÿíS‘±†íz7¿ÉŸþë?–çâ ÇP4ó–Ö-Û$ëÓF*>ÜTŽvp£}oˆ4ÀáÝ$È6LpsØd| °“ëxHëaݤe{”ÉøÜO3–xà ìSÙ›wª¤’¢™ù¾’}kAȨ"÷ôWË”°ë8¾¼b¨Y:dƒ»ív^ábD4´®+$_xé>ö]ÿt<´ÒÑ;öþ¹ëºýþ ÈPUëˆ$Ô•Út¬ÃS×uÅ3òõø:dûØí­¾Ö×@ZfU67•âÃá³ÚQ}* ?!J¬@CŒ§òðΞ (Ðäpš¤N> ÑNµð£1²]0Û”Þb¿Kïe}š÷ýSFæ±¾Æk·{Š9T0ƒ©¬£f½OoQ-އ~ß uT¡$Èl°ÞKobPvûáp•)ÒŸ¤¤w;µxy9@Fc˲)ó8:à //‡—W$ÐL5³!*Úëäèˆ)h ó)áQ:À.-GÀTLy@´‰ˆDkè T¦1V„ÒOeûph ­a¨Óá~©iqG_Àµ_‰CƒL´ÑЄ:ù 3æR‹Á€çÝxk(%% '‘%jLÛ.ÓdV<ž„&TNã¾ì̲Ó"„Kj ½Á $†î(>šŽ :eÌà:º= ,`)]ßóqÿݳj-ß>!«úŽûåG7 ¬”½ï¾ýˆâCd¤‰ ;¥ŒT*[DhíoþöÿÒíºÝÇßþú;-DÀiN×ÉQqK}ÿ²üãcò÷·n^-ºøŠ­õ~}q&®Îï1¶·xœgRÀÍÅYžö•HÖ|ŸÃ¥PâÆ¾y™]É÷dŒþ\ óÄ¢äjã¸yk¤÷^½Âù}}žº\’³Í‹Ñšnó—¶M=N½‚ãN:¦u ‰LÎJþnµ(,½ÛçÉ3 U·ÚÒ7ç¾is§kk®·”#ÞD|ˆõNsã÷ù¨Bÿ.qC?ƒ´¾¦øü¼îŒÓ¯pïÞ·fðçÛÿ#ÆÌuÊûçëùàŽzªêø3Ÿ­ˆ»Í2?v÷|ƒó~é>»ßèñ•ˆí_rèÈq1ëðxÇq,«u~ÚÙõqÐéëÚmõëÜßy3Ö]þ»ÞY³ÃŸl~Õt¾Þ}#N*O-|øfü Ð#ýôâûò©w~ezüÅ·Oë‡íìÇüvÝ,Eþ¿ý­4êЯŸ^†Ã næV¬ÐVJé ‹y_p® 5‹ŒÌÍÈÌ”e)ÞYJÉet]WúÎ@µÛ¤ðš+%7_Ì”fµV”²+n`€‡PQ7$d–b MLdJ©Èlán&¨/CýÝ¿ZÉDÔZ3£©ÖᘵƠ¼ƒ˜¡5p$¨Ä(î‰6É‘è ƒw _p7˜aì0ÀÌ&ãàªÑÝWd™ˆ…c‡ íp€´,AH+…DÈTÍL3`ìèNs/ÅÜ!Rj‡Áh,E-¢™©Ö²¶lMY[Pq …˜`¢ê+êH0a@kp‚‚ønJ ȼHóc‡ÁøŒì)޼;HNj¸ˆ6RwfÐ%Ô†ˆ` c+Íh8‘9ýãÐD¢&R²ž¤ù(T!Š¡sà“7AÈ )3å I0Ž /ý.0Äx9YŒ.NtŒi6 !ƆœÑÙù4*DqHh‰R@CJÇѬ{·3ìž Û??Û®dK£ï?~Ì6°+õpl5ëO£»B1g)ô¢PfJŠÖ”‰TÔµýÍßþçn×?}óüͯqeXjSWµÿŽÃƒ7à(Wt~½m×M‰ö‘£žIÿ´~wä=ÊÜ 17›&+ýÏjÙ:ÊZßî‡ý"f…ù¼êÆÁØÅn”‹*ùÇò¶¤¶P|Æâý}bKóÕ¼ÔI³ô rç4jÑk?s_<Ú‚ cáê»Î]íS•çþÚ[ñŽfÆLV0åÔBxé$Ä*':þÏ´ÃKªsúÙ<§x¹´K¦‡æõ„\G{ Æ%§ÉÅ,Ê­X‘œ#p®"à†ç–”']M/×x´Ç&¬óõ[×ÐÎ[À´9©ßwí–éG0Æóæ5Yg›Þr2•ÐÕyoªn.S£¸6ÐViÞ*$ãuCßÄyçýºªùåÕñ¯»óî^Wm3Ô×å±ì¯jùWv¯XT½_ï{7v­«_¼þ«‘_tk¤/[%n–ËkæÝ|~¶ª§çÓËr½ã‰8oîž¶×\wý¬§Š9[m>ÂÎg¾¤â\5Ðú¢_—é‘sØÚ’©KÅâ|ÂÆ¶§ ¾tVhµ,C»U­bžÅ¼üaZEyÙíã²"ò„!¾îžá¥5[ ­É\>ß3Zà7ãÅŽúô¤^÷Y_\Ç·ÖËÜrÂÿœ«ó_Yu-ŸùfsîÁ&0ôçû^ºÍn<'\mJHÿüOÿØÚÈÀ0‡^Ù†![*š¤H© xçîpeæ¢õ}1Z8„h&ÉÝ(°ëŒì»^ÒP™á4 0[1ËÐÓ‡[¡bhU µÖã§×ýS PÈ„¬AŠ!jÖ°`’L#Ó + s#/¯ÈÈÿþOíÓ$û‚Òcx­õók¶c¶ÚjHÉR O­R™À(’&4Úü&Ú3Ð`/ M“ðš-§EÄÁi@:X&ܘ‚Ò½û(öÔ®Ûïi;³^²˜Dk0SÆ0ìéuòùU2•¯ƒq ¦rél€Ìlßï Ô¡zW3Z6¼~j«¿û`¥£óx8Èl·ßu}µESß•ý®¤0DÇÝ®t¥+2fƒgP"ö]‡ÞË7LÙ~È×ßuôzHë>ÄQ$š&ÈNúõ¨íšÁ FÐûˆ‚QzDÖ 7?ŽÅ¨'Ï>!|‡$â' a]1îwYú€¨F%Ùc÷¤$–Ìc¢5EKuÔÛõ EÝY<ut³m-äMh4‘fÜ)ˆ™RÔTËl »þɼ(¤¢‚´Œ’,0³‚¨–H yT45Å‹ê‹4úýV¨Á¥Lî¾—„Óx•òñ‡Ã1‚w*º"&+Â1‡@¢ M°‚¾Ÿ´õ¡¢V˜ƒ†ꌘ2ÍîôfÐê#ZE4´4T¡&/Œ~t¦RÐ AÒ{x‚c‰$d€ ˆ 9òdP<¶GdÀmähq¬ØÆîdLP ‡DJè r"nµ0åÛ˜@ /(Ž&xL”$/ì;ÒìJWvß~ãÞ}øæ™Îçßüå§ù]Òw¿ìùéÕö}d¾þ÷ë>ìú» !]Pfˈh™CmCýÿéo½øîy÷ío~9MÆ)®·…ÒjÜ(ÚhxWÖ ï6_}Þ阸î?‹]‹5z&‡Cå ™3PÊB)¹Êèö‚³Ø1ñZ;k\ŠVš‡Ì—<7¹Q½q ëý‹ëMݨå|0zFØPbö"úà,E1‡v.…ÿÙnXˆZ/õñ—ë¯Ö*¿f»LÈáLD³Ô—ÇžW¨¬³D!.\¸g‰Y÷vNe͔⌋ºä¿Me]ZþœG8·WIá/’w žo îÇ;®¤ÆåDý…ÓOÒuÁÓVŠú^LñU¡>§M)ÎN3³ÉQAÔ•ª»Yg¶U 0ª¶·DØÙþr›’£ûÑÓÍK̇F‘fÈ—s¯{D—¦õ;½Ö%º¸È%­œ~Vǯ«jAݘ1¶9Hëÿ$ò­²ssG~9Ìn>ÜôøÎAº±f,ƒ§ s"OVª7×ô©êŸ~û[6)²xýá³Z¶Ñ¢µ6¶fVJ×—ÒwÞ‰ ¥gfD ZkCºR>ì÷nÖ¢Õ¡ŽOX¡ÁpüüB„õûTÃAÑúÏÜï¤ÈÄðéÕ TÖš"ZÍhé½·HÅVj(^í0ø®Ð¹÷R•H”¾ ¨}~mdžZÿwÝÓŽ] ©âÙõϨCýáUÃ1£ÁCT)¢E¢* Õ $"¢ì}÷ܽþî 葘@æt°‚qR$§;áPí€ÐŒ=º]úÎùÔ¡KuÉÞPÌ{¢¤r×»ÄhŸ3@&åtŒ>Ê )"£2ŽÞ§†Œ@­`žkC ÀËë+xÞïžv{)?}ú´4[ë ;uæ(¥cFt>w}([« t$”Çz Á “ÞQ‘µ¾(ŽÝÞü8|zýTŸªvj5ö»Í{ؘ&©%¢å¹6O &þOÆôÇ2ÿ6Q_Z›*âGõ_‚,ˆDTxßÁJ!ÛñHEi´’V,žcõ|g`g»Þltvd+ÞÀŒšÈT"”ÖeŠH§™ä™SR D‹›Û©z]’‰0gŽ4}(㙈ÈÖÔ"²©ÈŒAÇï¡ ´a2òm§ìˆ ¡ÈÚàv*áoS> Ö£ŽÕñ/Ð9[ ›ú‰Sr%w(qøÇ1ÖøØÈêPz('¬ÿ(\FCˆÄØ* Gƒ 8!Â;¸É h4£÷`#‘#EHQ£Eb~hSòLD F©ÌÐ9r¦fÑf‘˜¦ÖŠ@Ü&¯¶0"rJ,™@¢ìPS¬ÕC¾òÝÓþéã·ÝÓ“Õc«uè÷…æÚ÷ûp¬9Tûø„}'ïÌLˆÙ2kÄPÛP£…¹wû]ÿ´›EQœLqñØ»ø5¾›¬-ˆÄ# Þíwêf$ýf°wíy³àvèn8˜jk·Œ;ýjµ½Û±63û›oÅît`C·šû‡aiÃð€¶Ì‹åçœ;8¯gœE?¼U–r- ¯Ë&¸®ÊÐRp»…?aè<Öã‡7ŠŸtÓë­Ú ë­å&TjñòM æçÊ—Gk÷þr´«oÈ8s9ðnÄýÎÊ"ƒi[ Óºèo^ÞøöfŸ[*¿DüʯÇד{WK·£µŸ_?¿~~ýüúc}ñfâð§öº ÷ûùõóë§xZàüsÆô·w Úïa¬Ü–„¿ìw·Ú9ž^ÿ½ŒB~ÅÏZdv§<ŠôÈÕÔ?ü·ÿVJ9õw¡¾ëq¨Ç:FW­¸%aî4óRlL”B#Ý‹¹ 3Ö­5;ê-b†haGfKDÒ­ßí-[U4kÍi¦¨5£.Õ×ÏnÅ3G-–ÇVw»"ùñó'z9Ÿ}A÷aŸ¯/*F! 5^Ñ’îü?ÿOßì%¸[×í^~÷¹þІHöÊ6˜·a¨1„u2 ðiyêa„Aȉ´Þï!1†¬10Ñï§*ìÒ>}2¡‘ÔM:¦u`_TŠlGî¸ÿƺg¥e8éT)¤{“Zî…nôÎ7F{X³µ :²QGòjÃQÙMMªˆÒv»."¢¥±;¾«yg]ñ}é Í­¸·ÚR-»¡+{+ž ´úT>TžßEjh‡È×Þp¨¯Fëø!ŽM¯Ÿ^Í”Žû\_‡ 6sû°ÿ&wz9¼D6gÔve¿Ûí_^?ƒÕ{°±Úýr¢Ø +È`*EÇ™î2JÂ1ë•H'²GÞ;ØÈ«A—²ÈÆ$™ò]®dFCçÎÉ♞MjUŠÄ *DsÂ!%”2¢Fì¤ÌAðȤÁKGó2n#•HR(#¯ÃËq´Òm¯Ó ¦px™Nd<;ÄÄɆÈéÄ3A¢”©B£À TB“ì Ù'kÖH4f0 V¸¡Ž:;@¡´˜Ì¼Á2t=¨¡: L ‚©¿‚ô6Šû芨“ï.ÁÂâô=­Ð:x9](S0cV Ÿ‘‚ljMð±[´ " PÆ)ÛîP‚!Â8þ’417á@‰Ç+i³f¹‘2d”É$­¸÷ÅJç¥'yøÝÇcíw»ý¯¾©¯ÀØYq/e'?|þÝgçÎÜDE£R23[´¡Õ¡þÇ¿ýº}¿ÿðôá—ßN9ržŠ³ÅŸeŒ¹ {@ŒýùõsÔ}K)ýwx{}•½â#—n»’vÕ;²Õ;dr&þOŒ“ ð< 5Z9Ÿ+~Ÿ|©µáœ´q©+äT0 2€ä<¸ÜO]8Éœå4¯Ñýç¾ýÓÿ_0E9Kôñìø= •jàÒLO®?—öùK5¥–Êø´šŸ¦Fž 4ÿÉé|+B”6ó^k,Z6êÌ9ãl©¥aäF„rùÏy˜î<(³¾‚7¹@‹’1®ÙL›ua´\~:o[¿Nñÿ¨æª%ìån¼Àð\J¾Îwz¤¬@ÒíùâFÌ Q3Sò\Ry"ÙáÊ`öÝYRÎ:Ù×Í’gþȦÁÝC›²!êº$ðRñ¸5aßAì.Û“–Co4¢Ÿê-ŠÀ©ô€m˹C×¶\ңε\ªæeN[Z]ᥕúÕákÑæpžã7a(Ú„çóêÍ亖'Þ™qçiàF»È¶gfŽÈÅ£q!ó‹ùVLÀ庾Å™ÕhÖCºhÚ[t:Íž}mð.é-[Fâ³a®Íx•™æz~çæÆcÝV¸¬È9¯˜{b­DÖ ËoÞDټѹrjw¾ñÞê¸TïÎaN¼ÉH½E‰´÷;®±*wÆØæ<’¿?9rkuÐjd^&.<ÚW Íyâ± ð£…àZ < Pž·‚$$BZÝ^Qhñ¼]½y3t®šã¹6dÅ™äÖ²­[„Ðõ‘ië‚® Qœ#µ’‡ÇŸ½e?ÛƒðK{2–ð—“¡qòTMG³ß9÷dk Àöj»œoÞüVÀë]÷ªrª=׌>.~h½ph>JN˜ŠiÏý[[ò¿û¯ÿ€¹+Àë/ŠŒ•H©%$3ƒÓ¼+}7þÙÝJß»{·Û‘p›P¶Ñ"™aÆRz#k­Ê‰‰ñzjqäþ©|`$!Ôß½ÔZýnçô83†O¯uWž‹wµ ¯‡—ÂR¤ço>€^Ë®fÅÔ¨©úñùùÓŸ>¼ Ÿû~WãÀ®v„ÙT´95(Œé'¿WB Ñ÷c8ÀFä='å<hˆbh£[–„Š—ÔÌ2ÂØ9½½V3yé2"k=Çn¿È¬ƒŒ0ï:K ÙZ-•F"P‡FÈ`^lг5"Ÿ‚æ’g µAM ]߆CÔÁ{CÛ«Tíez¸âˆGY8µ8-&þ>€H˜]ºsgï„‚&Œé¨< v;À`šºF»Ýý2qlhðÚpì<i²,¨ LÈ:½¡æTbŸ£Í0±·é }ÙH {‚9Zƒ¹|Çîɽ³Òʈq µ±Ì¶ ªGÄ4©£Øh¨H˜Ðõ¨AQG<XBxÊF“ƒRé„É O£pWNx…134±§Lâ?BgÖ•Ò•¾ì¾y*ûgïŒÞ_‡òüLáðzŒá…û®ÿÅGëJbt.IO´ZÕ"j´!¢¶¿þOÿ©Û÷Ïß|øæ×¿Ô@³]ùeß8 Kï¯2:¥Þ寸¦Ä÷ceÒ³Uý¥Lb½€o5rr‹_ÕY ºÈz30çé ’&&ŠÞjgŸAЧýæíÅ÷æÊÍ%«“\ÇÒfóà:ÏiûtÝÃÌ7ö¼s&ÌêTÎM¥sCS^éKÅCK(üi4^oÓBËàŒ’2+p$e š»-iX ¥„˜lL$HKYYÕ£Yra&aŽÓá¹ Y'¬ÿ‰.p_^Éäõ½9G‚‹jš¡™Ýö­‰åLÎRºu ¯ïŒîŠ“+Áíç@×ê¯î°¹Á€cZÎN«ßÔ±ÙKvƒætKYÔí5zã¿6å`Þ›4·&¥«Î$ÞÅî©ÿäì1Ðü –]›!ñ¥!òœæ[ž¯3@ÜÊbcøéÆM›Gä¼7`ù¶eõµ=Àåwâ€-£yÝ~`u-½Üûgò¯îmu•°ÛÂiã„Ó´¶Ú9m޳åƒx‡~—³ÌºÈþÛä ]]wlr¥ã-,(pÛÿU[JöP‡o&Šx!âÙâÍÒamc [£”·F̦ú&ášvÅß8–íÔ‰)a½}nzS[^–ü\í¡ÖCdkéáæä­åÖñ aî’±9‡º‰iÛ2ž½¿ [‚Õç³#ÖIobÓÞ-¬^fð ü­[¿!p¿7üÜNÎmçfÞºAï8ñúê^3ïšœ¢K+ð‰´°(е{ºq§LïUÖp o7}p7Ò¸—É(ŠïË|Ý •%\ƒ«¸4÷ÙºgÒµgÀí­æ†k·3sÚçš›q…þÙÖæø8ÜrÚá…tIhÉZÖ¨þ>¿FŒPdk‘îVJ™{ñέA^Š(˜¹»•NŠT˜/"3€™¹™2[&ŒFB©”(ûÎI ˆ64d[éÝ܆ϟ^Ê †ª­e֖ʤ RµªY´¬èJéžJÖÈÚˆ47£5³ÏÿålÙðtñCú~_ž»jÔp(jÕë±ZÍ”ž¶“¡4ÐÇèÚÊ :ÁRÄÉÔ×v`–IÂ6G±±L¹ËÜAf]gýÞlûh¾—:£Ó ôVƒ=FIjm´µ¥õÔ`ž–*¾{?;_#¿ÇáÅ¥¨'ÙÜá;8Gìv;u¨Cm²„ÐwÞïúD˜£Ek‰½í[kÃíøÂÖ ƒû²ŽúüòýÓ‡."Ky²,Ÿ_?}þôúa÷Ü>Çó·ÖxrW:šÑ äN¨°ùí·ß%tˆãÓ³ïáf¢µš­¢Švé&>RGÄ€–³-kb8B1Í H¨GH-_“FÉ»1/sº; H¨E­ŸYv’i0zcvÝ“Ój˨ÉJU#ú®dµ{.Ãë!ƒpDŒ,w饸[m Í@Y1ó"µ¨È­aèÞ»³}þt|=t1t<(¨ˆ×±ˆФ¦w'´QòD¹¡Jõy‚ëcú÷­k4Œ.cŠ C $ÑHõèrRGͦ3í]}›²a왈óg²$Ml) °‡9"%G8áT/n*cRÁ;ziî}ßïzZñ¾/O»t«M­¶ïþæ?‘Ê!i]«‘PÙ?yïè½¥™©6 ÌÖF#ñ¨õ?üÍêŸwOß~üæ/~IM›·©¼†§òÖ*Ï9K™×‹?îè'·÷0Zéý•Ы£¹ì®â±U½àúÜïŧàB¿^67.\ ‘KMuL¢ÜÛ’\“HçF]+ |žb˜˜^‰ÄÚmSØ(Ÿ›«®¬Ì‚) ©¯èÀ7 "ƈúÐùÕeÛˆBf]óCY¹Êüþ$^|›}çy¯TÙŒ$Ï|³üfCÏb´"if3%à¿]Û¡üM3ÄwŸ7ïð~nžðMIüëÝÉßóÈùÙ¸üç×ϯ?×ךöóÄòïô¥?èèûôÿÜ(þu’€”xª?K=æ² m—£æ8Ø?Ô¬ÌS @ÿžãŽŸ k_4¤Ï«†µEÖâïÿî¿p÷±ðÿåwŸ²FÔQ³ddžûÛvO}×ï¬óLÑ™}ß÷}àõpÌHºȈˆÈLINš›™Á¾ë”„’ìÔj†l-»¾{úÅ^I}WÔ*Õ:÷Ï/‡v¬,Ö^ŽRvO#?Ôbzs†×ƒ¹ŒnîñÏ¿=‡ã§×:ÝSÙв Hc¡†¡ÆËHZšy5³E“R¬’E9VôI*5>Udc¬Xà“ã®|ª>f;`v(ó¹äŽöv(ìáûK/æÍͽxD‹€ÌM2 ¡H MR‹z$Rú„ò¯Ö}ªÇ—¬£‹bœvÊù{4 Öí@'ãB¡%d¹ú´É Ç äˆî PëõzÀñu$çæ‰“³.s¬oLÆ6´1Í$ÑrLÆtA`h“Í/ uTêÞt{³‚h5ÔbÊT$ôEh1™fO&8 »CˆFÈ`GÙhê+h Š05é’Åiu+ £sdLÃcv [ÿäÝn×=,}—‘0ƒÿîÿùÿ0·ô§Þ­kDˆQ‡pïÍK¡e´¾ejZfìžöÏß~üö/5eŒÇ¾9ù“6ý3Äòºý¼SøùõóëvŒÉ‡m:–‘ñêãÎÑgaòš;û«M›Ô²]ët6¹Óªãά¾1ÚXÍJ0mBIJe*¤fɳ jçôe«D+ã,N•Å«†’¹Çt(XäâˆYË×%El•»^²f'œÞºú~é2yé,;Ù,4+“µKÕÁCâÖd¬Áám–èí:ýu¯Ú(ö|ÔaãªÎFÒM°Ð’¯ |¥DË/ßÔ6¼]õ¦Õ/—Ñ|ãoyïÙ>û—/¢Ès;nÐîL7Ë:³+òÏ"‘wy¯ÞºjëKxæ`­[¾îë"÷+'ŒOÓÂòZòññxçíÚøZ¬cuà o¥wïyîX§ßb¼A[¡‚t5ß~>x›Æ3# ­?ÿjJÒ¹:e‰ÚxøÀóÅ»zä"¿/˜WêJ‹[®UÏz@ÞS®/l=Þß \8RËK¶Ñ€³Ý À;sò¥H¾š«JUφ7êl&™w¬L;oÜí©îçÔèÌ›þf'¾,\Ðb¸ì вõé~N‚Wm·ÊÍß7AœY|ï[Úµš>Wé nZ³.«ê·Oðê¶éÚ4øšòôÖ)œÃfÜIëª7ÕÿUeղž[†ÓÒã›íûïÛZŒ5£DÂÈQýZ6¹¨<¼©Îe7/‚ˆ+¾såÝC %ÓÚòo¤©êòjÜ=¶TêjÏû“©7ž)®­ãÎë¬Þ™‘<ÍYZnU½&§ú‡<Z3;|zm‡¡kÔV#û®”Î ‹ î悼ï|×™[ÔFs#%µÚèJލœ,îî.)"22"ŒèKgh€èžÙBíï¤T1÷ÑZ¶(‡cMÅÓ¾˜U7# ¢¶ÈF«Ùê1iõõÐjõ]/Çî©÷Ç¿ü ÑÔŽíå9(¢½Ð]D}-Ã!‘aŒŒ–µ©VYÖTV™XžTŠdSióø2‡ùeNÏ ÐÁ òT¬mè`Nï\ܱìi]´ž|B·:XGsv;°¸wÅ‹Rï]΅†›Í ’úzü8¨}Žöy2ÆHÇJ¸®PF&2™Ùí²ªJÏã`R4Ä!^ݽô»¾'Ÿêwß|è»òùå%¢šYŠ»n'DkC¿Gÿ´—$´Ï/5³ýâ»_ÑŒŽÃñ_J·³â}ßWC5Ä®/1 ‡üÞ:>•Þê¾ïvÇö9ؘ°¥ ªh´áªÓE"F€:”0ŸÒ)+à Á}J*D‚^$DÄÀlV:Òâõ³˜à',Djš¨4Ö৪”iÁPm£ÓÃÙ.ÛN‹ôPážÄhGŒÀÈRÕ“ &ÆÂdV¬†Ô1c´rŠš #€h(s9§’J7:‰"&Ÿ§D1å Œh -a6MÁî¨t<¥R€[QÈSã†dšêýhD>Ò„Ä„lMp½À Ø6¿ú$åÿQÜK?åyJv "½Ó€©•t*ëtäs?œ¶¿„èR„DNgç€UìL½1mÌaeJŠ(G$x!ÝÍ;ëwÝ~樓 ^6Ô:ÕRO¿øè]߀Úêñ_~(ß<—_| ÁÇ>”4kˬµŽù·ÿù?ïž÷¿øË_kí³sZÇøVç/¯lg¯ØßÛ`ííÍ;úLò!+Û·Éâ—Üòœþã½k6rÓç,BO-òÙœ±‰«fºíuRwbßsÕļõøfÀnܳӎo…Ï\ÝNÞ3[¾¾AW+Ï]ÈûŸtž‹m¸þ9çô–Ô¦7¯Áù³õÐu]žË<µèƒ‘&æÍ²SdN”ßóïm Ÿ¸Ñ­¹öl¹Þ¬êJ!ãR˜ºøyœÿuoÿÆ­nÌóú/hÐÃ[mQ¯n¥À®OÿJ+»*ò^&yÉ ¡Í…íTÉåYÓy÷œÊÇΦót#ùHôNÀ êzI»ž\µ™Má²Møú‹tã~#å© ~s®³oZÿÜŽ7âeRëÕ›|Kº½ÿXT¥è­ä6‡âb˜h%_ë^Ä3ãÿ¼ ³š³BÔåÔ:&6g×ëŸþáÏqæá‡—¨-†6Âyu})]Çâ}ßŘuëÜK_ÜdŒîÊ<Ô¡GéœòR‡EñÒ•B²Ö:M)ÞZƒ$5S72aêëKû|¬ ™gF?Ôð,,ný±Ž5º®×Ãç—áõÀÌ?<÷åÃ.k³Œô /%€öé{üÔ>¿"£¶šmÈz¬­BIƒ˜Ã±†÷h혴(ž£Ž//&uAˆá˜Ù†O‡hÇTmѠȉ¨ fDC ¢É,•j ëeB`šg[£2ÈSþ6ºSycòì~BuÅPÊØëõ(ïšÜ­GcŒÉDw¸¥Ñ/[Ñí ÌИV¬'2©tÃnŒ Y´¨nh‰<™lpû‚H²ï•Þ&,’0¨ +²Ú„ MÈ€¤ÝË~×íz3»œ¼ãÇÿôGa}‡CùðlÅ“aô2·b$["RmµTËVÛ_ýÕ蟟öŸ>üêÛmeü¼5!_]®/ùùu¥>ݶ­ü#e·UÄŸ_ˆÎï½n—BñëÜ@þQŒþÓ™W„ÿ^ÏíœÐ 1‰³«óÝ›R/e«ƒF«(3« ]Êù/î¼Ó¿/9DMµ¥óºÊ o"—ßeZ@j\Å¿Úö"œyÿê‘Ë,‰¸ÙlÄe‰ðÔÿyšþæ)J½1ëðzªÜð%;uÅÏ VIÏî™÷•¹õÀ}TXú±ãú=rÖOa®ðÓêé_—Z´˜[ß™Rn·>|¡høàt4«¹xŸôÖgßn¨ä©ºœ·3Ç«‘.þñ­ôú:‘I–W  Îׄ£™ õÙsƒ{!\7i«S†_óäyC:·; g~ñ\u½â¹;L?òLt º1nÞ•Fžß2Þªºóëú²ëskÚœ $Ë‹'þÏO*÷oÌOšéŸT-æ—ªÑÓÎã®'ùW_5çå—&ôÀswñr=óÃ?“•¼¾…â cvç˜ù#FÖæP[¬æ€û¾Î®A›;ý¿ò+¼ã§¼ïz”Þ–,„<µ™'4ië3§iý~ûÛQ—ÿŸ^bh1´l‘™FZ×Ѭô¥ìz/NšÌॴMîÞ"4Õõw–R2ZæT½if½{*3j´PCqî1‰$3ˆÖ^B×í¨j&¶Pd}}µPšwîý‡ç§oºzlRwøþuj´Ìï_ ùô‹Ýþ—œ-˜Ý·—ãñ‡<4 mxU f­ ¬ŒÌu!1G9X°"/Å‚1¬"H“ûIM€;ˆ !ÛiM÷IÉõ‚6ÑÏ-¹G÷Í?Ò>À÷ ¡x)=èÍм6¹§QAï:¤Ô4U¢…j”‚ÎU­faúT;´á dñÉ@5I€c‡»»yñÌŒVÕ¡ëí›_=—=øïŸÍ̺}€ˆÆš¯ÿâí_¿ù«ÝÓ‡':V:z±a¨‡—C*ûÞ?R­Â8ÖçÃïÐ 8Ñ‘ˆ`« ‰°‚H!Oq#ß'ìÔØJap¦®Ã¨žÓ "r²±Çÿ˜îòp˜{fšwf#ŠH(  ™’Õcx2¬Ð 4S°mÈîÉ;G«8¾fÔ)Óf>YknêºðnjÛ@C—rƒFómšFìóh¿‘gEG™Á$ÌÊ®ëúXòð©î>š/ŸÚÐøTööð2 ‘ªðÒuÝE‹ŒŒQk=6µ ðë_ÿfÿñùÃ/¾ùÅ_þšWõѺ/[œË½7‹©ç €+jÛmÜ+üõû]µ¢Ü6j$Ð<²¿µ±_³_ç_+b¾Þ{èb¢{³ÿûnJ†oI‹èTÀ®‹n©/nou“,I…?èüuCÅ-¼â›pŸ“ ûEu0›§®¹÷†ñ4˜ç·‚²›:Ü º‰°6‘^ÂQÏ ³Y’óÜz‚ ˆÒ|T^ ÿ§™îÜpÒ0N²þÙ?mš.jß™H€%ZdáÖ=;‰\ˆu³ÖòÔËs08»t‚šžÎ‹gTðY'9ï5´Í.8Š-ó§žlž§j ñâR“>Ûp*¼P9g<ëAÑS‹lãN.ÎNj֪i˜\õùœ¯ã¹Çm™ÑJÆÙ¢ïœogì„-àÊj…Åâ´:³°¶ZÞu=e=:aér€ZõØë á.xÕ§tÁù,rŸ¼sö¼g‘}Íø¸ð¤4ß%Ì©úÐõœ>áZé‡ÜPìÎ-úšwqm’ZNOW9°-µcÇ‹E~]Z»ÆŸ}ϧ8ÿøËœ6KqIZS2xy*tÅD×ö’¡9çföẹ̀˙söÀ,”l^mC4³š|Ldáµ¥8¯zI¹ëßW1–g´²,¹–]1ç˜qýw:ï’t¾ü‹¾Ðó¥å¼²I¶Û¦-·Õ—¥gõ›K¦ÏvR“7÷˳)ˆº·1ٚ߸‘/™%Q–=‘óÝ¥…ÌÇ2–ÏØ6àBs˜È|Rš-ËÞe^ñâÎÃj^ö>ËÕ_o­oÁÝNyò[zޓݸxÚ®µ8®úS_Þ¼ÕqãÞß7.1—éçìßBuÏ`2$É ¬bX‚O'6?g½ñQ×âû* °±['V,ÂÍcÖm÷€ ²ÍûrsªãŒÚÍ–äå¥×eæ?Ø=KF¬õÍ[ObÃûáêÄçßqMÝXõoŽ.ÑzïÑÉù£›4çÃu3áts‘:1,oÅõ'_XIÜÚ Ý>³5ÕGšus_t™®@: -G)og‡Ö¡G`©iò,¢Öˆ„iÁøÇø3y%¾ÿ<ëXøO²ë:ï»Òl¬I¦•R`&ÈÍÌ­E[ëá‘9Òÿ#º¬ÑÉ,È”»™`…ž*HµŠã`}Ç®Pê²¶@×ï̘Gµãk# £¦užèh°ú‚áåµ(R¯C×;÷=ÛÐUÛçÏÃp¨e_âøÚއŽí娣‹Ø|'Þeã‘ ÙÉWnôP­èžÐu0WK0Mª¦ ¬°€È«“7”púžf]äÎÌvûoÓ÷ÉÒv½u;À3R‘4#f‚ÚˆA3ô-ÍaèÜ1ÔEó]«¯Ÿ?µáß”¿cWEIh „ r7¼Í3¡dÙ@éòøùµ½v{c·³ý¡8À_w{Á~iŠÁJ¯ÌÌ£ u8û~/e¦òŽ¡fN¡eÖÒû”WŽz=êuÿô¬@†¾ÿás±Îñt>~x kæ ¡G©­õéûÝþwÿýÀD!j /|†Ö&¿ßÀ„åù˜5cQühk †ËÀÇFU 1¹ëDЦM¹„Œ‰´3–Þ#4y;ŸÌQZ\üÒǃûaØ Àmì¯8 ÐAµÀÎUGð°0„HdƒÙ0šŒŽÍJŽã—êtŽ$ºn²ÿ œ¤pa$ï.¾I¨Â $Ô0"$%…FŽÇhºÐŸ xz2 *`„ÛTêX\]Ž:‰Ã & ÀFõ¿Ð]cÕ¿¢†wð~ÜÁ9,ND Ñ‡1³%HOª1A€]A)n ”*@”n'+MÎ è ö§´D4dÀ8rÌÒ†Äyë7¶ÂèÝ­ß{éK·ß™Yy*¥·î¯þoQÛñå˜üÄu%£©hVz€F‹hQk«¡ñþú׿îö»Ý‡§ïþâW¬ös)ªQ×M¦œ‡ZâÖ®å¼Ölòzû ÝÎÃß’)g"o™Îq„S‰±Ö;i»ºæRÏ¥-³¹ÕÆžçm¢–É”sdMn¨?[±°µù<¯¹çóž<În¤+çI®Š•&W0,ïÛR»MÍS5Òyk9IŒcž_4-O„k[ ub¦ Îeñ•¤pu§þÔ¡óÊ™EÅŒ_®Ktwé½^–eél@W©šÅ†eáxK„{gfeœû†Sáƒõ7_Öݰ閨³Äw kt£˜°Ìf›‰¿wG¾"“O’8OzÂl NåWÓGêb'‚¹ý´® ×b ÏÇ(oÛˆmèBÅÁZÒ¨¸–HOºÿj‚Ùü–Õñþ ¸¹%Ù†²¶MåÐVZmy¸ü>;þ½¼x{†üå{ºÚ?ßb¾ðµ€¦»åx×%âO³àÝ¡»&âbµz£@kßW9‘ßKÀ”=¼÷ù°µVN⮽ü‚ëõûÖ›©¨?À1^6¿ß>`þÄ<šŸ¢À´}êÑîüUÖD«pzÔm\³Ÿ¶ànþæOäõï¢þk æKƒµ¦(¢¶¼PƉæþþ·#£”àó¿ýpüô¤•®€æÅYÜû®tNwI-ulÕÝGõS™F7Å=FáX¦±fVédk-SHåPûç¾3ä&бëŸÍLB?`Ö†"3²e V­>í;Ð/jÇ׃ÕÖ”‡c#Ó½x¡a‡Âã04E´j¯CÔ9´ÏŸ[½´DhÄ—‘å„÷h¯Ò0唌&9ú¥üÿÙûÛ&G’$IdQ5À=^*«ª»g‰nˆŽèþÿ¿ÙO³w;³Û¯Õ=ÛÓ]™Šð}0`Ü="#³*«44á7SSSeyèwd€Óßa6CÛs r(ÑÈÊ=à´ÁüCú£ÑE£¢:'¬ ÌÍmªcËòªBЙF)•™bˆiTQ§­ù©Ø÷zü¾·žÇ¢T*þ¸Û­±"¦òù”²+:2§r9¥Z7¦†‡-ðxé9¢g  X‘_”.¾ó=·ªûϽã]4â·u|Þs¥)ë'íÐ¥à+¢ ~åÐëZ´\ulÙ¼íŒveVð³DË¿,èü•u*iã—N¤;ÇïŸû¼MpK뿚ù'wÝJr?þ6.•Ö=LÛ^ÓçŸ) wN‰`®Úd¶D¤kUÝSæ~¦ëiY¶xªUÔlsJý-KqëD«)¢ž ¶¦~A\¤{ÝñO»S›¨KéÐìØuÊžÒw4óSÆa¾­$4¾ôNj™çØ~Æ7WzYêyUx£×÷õ õϧúC!â/åÛÏ[Ð —ú7< ¾uf|ñ¾ò¥úüצœ~t²B§y­„5îƒWwµ.ãøJÿü½/³"žÙëzÛ„åŸÇ {ë [ý•¿øN×ÿDÓãë¼,x7Ö×ü—¯þË:4ŠqÕËÂÿF4ÿ –eßÔvôÍFy^+î'3¶¤ö¯Í•óRÁòÚ1B,§DØÐ/ðŠ $ N6½'ºzès",ˆ¤‚¬^«›í¥Òõ`u8ÝÈ*¯•îHDkÙ‚‘"iì!CH“%@(¤à¢¬‡GoãH4ó‘|*þ”Ñ­ú1‘ DCtDBMu PD*4±ïI+^Ácª#"£Áz6¶CÛí¼ìÝ?ž$•0Çöœ:ºUX ÕåJÑ­g¯ƒ;kžòûc;BµúCPÏŸãa7Ð,‘­™êµîŽÇhÙ‹ãùøÙiècÿ_ã{ƒ u–qyʬdÎg÷©zÝË…t¯„?ø3 ‰8u¾÷KÐ ú©á>gÛ)D‡Õ9»£@Lä›×æIýŸþ‰¦Òx‡¦á%˜ˆ~u A ME÷BOPÈ#Ûºæîu›j~({rÒîƒR儘Œ§Æ`Mÿ p?ŽpÀ)Œ~r¤˜²Zyêå„ RsÛA,ešL‹§Vœ‘&ìD5Ô‰#”(6{ Åg CÒ5!z"!B dð¢Ì0²uj¦™ìoI¹Ó åÉæ¥ÃØ@zWZsBYÕ3‰‡G«Âñ)@ ;«µ ©ñ0eéf\ÒŒEŠ9âr¶‰–£:X€‰”{ñúPë~+uØïÊ®cË0ß½ÛuøtþðZöß§DËž}l9F¶®Ôo¿ûÝîñaÿþñÃßüÖ‹oí\;k{ ÝØíù†Ã²‘/ùÓ+)ë€õ><çËB9ÝÉ|Óxª>•„¯nb+ZÔ}‚wØ›”¯«Îe×^6>~§þç°XüAçõÂ=|pIº4ß›¥¯×Zqý¸OiÚfçÎZÿ€f´ÄI0_ö˜žû—¯=«þl]2‹ç¡­:FÝ.«ãô !Š ŽË²¢SÊòÀÄÓ ‰³L/›Ï_X" ¦&"@Ιz”3å`º|^è®K$×5…F¨³ð‰½qL-â¥>ÿÄã¹nm™{ŽVy­é6‹‰x¦’œQ <“d8Èx#ƬnaÎ œÐµs å”ÚXüVáÆ a±nœ{±NCv¢C\q*´ñ¾–]ÖþÔ]©zãå‘.$Ó+®<Éû¬ŒµºÄKâ Wyå¼\õI[xÝäöy»oSW—ð,š¹$ÝvÄmo5÷vûë>:n w\ x:C;®ô±ÅÛ{­\­5käÈòü©Íu]ÛŠâV:ð0Í¥éÆmï”ֵ䧷EXrP6À.\£HÖC}z 抺SÛñjº­ÛÅt;ûo·ÌµŸøå•;i5ÀÊ5j¹¸/tf^Œ—òaÝLÞ§l\u&œ‹ñµ-ú¾¬þ®^¨k cc,.˜³Uïß|1—·í‚:­üÒ¹Zj·~bëe¹Y[.Kîk, ôÊ÷ê¡EÀrýK‰çLËš{E¯`pWãpAKÍTÄ{Á‡®oø”ØFñë«ÔÓF¹ÀúédÃÄëôâj‹[È”÷âÛMŽû™ë§Û|£Ö]·}ÞD¸u>ØÈ?nå\߯u ÆmkéêÏͪßVšÔ[[L.xµË½< ¼øBò¦Ýø¼¯àN}Þ”­9-àwrs{'— Ý© |#fÓŠþ³¾òEð¼ªdYžQyÕ˼Ž0ÃÄi&¯[ûyN†ÞYªof°îÐóNsfÝÄÍ 3€Î&náƒ/‰_›E›E@×ÀFuáÆ£¹;ÝÖ›úæu\E×…T\_Ð ni¸%­Ý꫹®eϯ–q:i\-Àgû³›®¬p´½¤?üó¿L÷rüôÜ[Ö î‹& 7ƒÁH3Â蜤}ôÖiÅep('m°Ÿl£SPfPE *­8Lû[hüã纯Ý­+-Û§'¿Û£z>ûØñ88 Ÿþ]’%ZëH7}ðži4C3ö±÷ãçCÿt,ìBS4óĘ¥ î9JVO Í`ñìȧ ë:«ÀAæºrN•Ë@";h 4d"P¥W&yoÕñ@`yÔî%a"IeëiÙ‘É4j¡(z?6/‘=ÌK;ôìÝHJÜU{´ñ9l´b-"Ñ㥹©ã˜L'£ êf”“£]¶cËL$ÖŸ2ÝŽY«—Z¬ZdZF}p77·ñØžŸº ¶ƒUÐq|>ó‘ß=¾kqè­qÇQhdu«c´Äʱßþc±:ðáÐÆž}ð²/=ÅÄY"ˆþø^ÑžqªÖ d (à9¢ÐðœÈ9'AŸð+° Ùg·Åh`ÛĶíÉqdÇØa޲‡Ìf¶þ|¢Ndƒµ¢îæȉh³DÄìL`‚!¤éâ¢+€84…èJh‰ 80N`"Ñ‹4å6pÐO$Q}nJ†ú8¿lý´†%ÚPÅ#2f0Î9†H _¤%„¡rfîŽâ‚£ ªË ,(€9|Ð¥sO.— RGÂ)SSbm¦cMK‰$*gf·^ÜÀh™”fÆ.AYvžÑÓü¬Š¨CBó†`§–”Š<̽8ï> }Æñ™Ù-‡]Ý= õagµ$ÜÌ"¡Càýc9Ë®¶í?>æåáÆœºg Ⱥ„®ìÑÆQ™?~7¼{xøøáãß~ÇuàiA’YïÐ×§x.•½­dO—é&‚½…›/K î`Z7O2Ú,‡¹ú­Å´3•} áæUÓ!nÏþ[êïԼƥÖ:_­&ž×+õ+>ûÕ7\ ä—²ßEÁí‚vÍË¡XºjK?Ya^ò¦Ð˜XVù®é0ËóÌÒïë,æ^ ²¾4$¾­>y%ÌzÛYè— ¿u™Ó‚¼´}•ç½å]]åi–'£ Ó¯Àsñ¸r&Ôútý¬éнø\Î%«CÆÝòvtE‹\^úë8MÜÇ‹-éë ÌÔFµ’¦„øõ!xUOË;©Ìõ‚‚Ê©•rjRA›Ê·.…ÿÂb”¹²ZrüW¢ž`Þp€YÍ9*Ðö1E'Íï4>ëž‚S‡ÊJ„ndŸë}àí5Þ7bÕµböJY¢ÞRt}gñUáè›}~¹_¡¹½¶c¼µ»ì†ºþò5þ_“œæ·¸”‹ìú¶Æýx æ¯î“Ó·œäü¹ß~;²Wú«ëX¶êýyg]þñ+…~ì}Kwæó›zg¾bŠò^úéE|០àþõó«›9îÖh½ÖÀ/ò‹ù9?÷]w¿EÀ¯Ý¼;•_ìøÂ]Æ®¯Î&.ɹWóðgêÀfèÿ3D-ÚΑ¿}]ú‰Bƒ;[¶~ªqû)ÃF]!jxÄkÌäwNJèô1”+ +pgtˆ4iÐ^(Æ ·Rê°gy÷ViÕ¬JÌLÂ`„Ë«MT”:X?6fŠ”²^½ñØ«rƒ™ÏÅÒÉLcX&r¬;+¨Ç8Dëí¥}ø°ÐZ«…ŒLƒQiœ BÓêÆ¨­2Sm­÷ÞÞ½¬µ ™‘½Ö!°š‚Æ8°b_†Èñóó8¶c²¹•]}蟟¾xBò8¶>~zؽ\²Öâñƒ?ÖA6öìOýiì]'—.ƧÙé7ÛD<šËÿ'öŽ—¹âf÷úqß'–ÍDË ½Ï²þd¼ûø_~[K5³³$~Tœ"7mÊù|ËÏ7o¯ä—„å?uÀvÙÀ÷;¾úÀ£…i.êîtO<9ëÏXVx¼üLßʾXéÁx õê(ü §ö_"t~eÿØ_·ÌC\%l^ì¸>ùÞŸ¾&ÒÖU—À×¹,ÿ¤!ö²fêTº}÷ Ë=ºþ‹ËÆ”1sÀÔ†–—¼ßU¹ÖÙRh¥ð¦°ïòŠÞ,¯¿^–“+NŽV«….'gûC.¿òÜзš¥¼#ÐßY±^žMÚ„}èO4_ø³Êüóâ+|m1íÛ¿ÿkoøGáÿ”C¼ôƹ®“•ØÇ7¤C^þ¹_½ƒ¿ÌËþvïük›î_Úé4¯j^Œ`ùê뤳Ÿô¨òg*å­‡ùÇ8úüyÞÚ7Í¿:¿1hôv~.jó¿F+ó‚ò­#•Ÿ‘öcN—çÓÏ0W¯j~îáùê8Þ,/ANw˜ÿô³ú?~>ô±÷±e„$7v³«¦ÅÜ­˜—Ê è©L€f€Ø22Ò J§[fF¤™Ek…ܹèpÂ6ÑVZÒTñÔÛèÇÏG8£zkÝwÕwåðý!žžÇ±#3Æècö|V¤õô]µÚðüÇÜ•dicfƒê#ô¥Ê¬ÑZ[ô±µn=é®i•w4zÑ{ÀçZFœìdá(‘';P”07Ðzòø”sq¨9bò[&|0ÌJ–êõPÉâ.=\SC‘-2›;dµTft²kF YŸ€“0’¦*…÷Ì~8>¡´µ”lxòŠRùø±ìÚS÷ÿDT< ûã¦Ñh^½JÙÆN’¦8¢}Î<´þ¤÷¿ù°«ûbåðôùøüÜ£GDöÜñøî¡)Eì÷CÝûóqŒ,Vz˵ֻb> Cñg¯”~{Ë1ŽÑð¸È:ú÷O”УGÐuÒat"í“dZ@]öÉ7¬ çr{Llw pê¬Â b¼`ñÏvž)L·3—NN †lÖý'šú)%P &Ð`åT¦`B|b`!Ïý Ee¢ Yr ÑÉŒð)QFÈæRý$C:æ¡Ñ¯(Žj艞ŒNÒ‘ÐØ1§¨ˆ,fÛÞ ´˜ûð“auêÒ×<',rœÔ‡ å”e1ôÉN™ ÁhJ¨»G„Oo4Ì|8á„}Â49œæÍÃF …@¸²‰F !€ÁàÅœŒÕ¬”\̽!GG ÍÍzkí(/gÔÕ|†3ô4TG íyÆ®¡šþøÝÇ÷ûvl¤ì£`~ø<&ãñ»wÕÍH뮊Tñúþ‘f™-²õ>66¼÷ááûÇ~ó_~gîw«?—-wú8V?c xßOO[„O~ñÕýÊŒ¾Êy’s{Àõ÷P/ò*¶lÞ˜áÅš oPèÅÇ¿Dèü t³ßãW½ñ¹ÝöŒ¾r¾.èŸod«ô\(¹âþ\7ºëåzʳÛÄT«‚ûs'ÖÚZ둹 ^µ¯¼àij[:4ŸÎƼ8‹_Ùm+I%g6¾ ¤2Säi\Às塞ú76¼´àj™ò;{vP«©´Z-´`óœÝ/^è3¡då9À…ðOhÆRbîxâ¥qìšz2Ýò©ñC×*çªkøÖx~ñ·'`¶ðÖg>Ðr=¹–ËáÕMÞ|MTiΛikÿÑ‹}K<Í©j‘ŠYµ=lžÉ¯É(gÓÍH]¾êºtõÆ+~ƒd±Ê-]ž ¹~VKâÂ¥Øø”„<ÏŽÍAá…-uãN±±`-—‚íöõ•x¸ÄÙ˜b¸¡!\R¢ºæ®hŤ8¿tŬҹ“ï|C—ž®Ëv}²ÃÃVm±ý—Ü€‹,*N ÓË{JdžÒögX_ç×_gô¸\®6{)µpiÀ ¿æ…ø@×oÃÕ–ù–üÆíËÌ[Âq5)¶¾C‹DW\¤)ͪ«QÐmôÉ«?û¾,sÑ“y‰I6ÞS½\€Çï,?ËiΗ@Ýî¼2‚ºl€Úœ1«m`c§×VS˜ï1y•?Ovà6ã¨í”"ϯä‚ë´ìV\²(x2Sw*õïÎæ[:ÇFæªÓA«p£ŸònúáºiqÁAÓäÌ« xx[µ›_½ŠúB ñ嘼Eˆßü™MFÛÝ[[^~•t’Ôy­|ÃÙiQywû5kÒ¥6ïhMq¹Ûð¶ä?mòf é¢=™×qµ¨ÛÆY_5ærs^"C7îèŠq;ýÏõdØ>ÇÞ¾Yë7ý*°]üCÞ±½YUazÎÏ„k¢Í«¹šs#ü)"Ð%>×"Μì) ëvük'ç· €îì—7d¼­4)µx¤ZÄr'漓º—¾œ”f²Ú?þÃÿ5ýÅáÓSŒ=Zd„‘n‡jsá4è>•×NëKD̤re13z"ì("9W«5¦A¡÷R”#"]4$ ÆPïŸ>?µ¶ÃOG= Ÿÿã)Uìfc*Ÿý¹EŸG¼ìkï‘Çï‹gšEo’úØCé…`öHB¥(z´Ñš©GkÈ”:L¦.Ý­wE¦ù·B˜ì$é:rªûvD|ò&Ê®<ìÛ±±Œh¢gÏXØß“n,.îY>€{ÂAŠD’ ’¼ØÑdoaîæ®ÈlFͧ«Í–@Z1gÂÙ#[æÓîÑ5r ¦Ò¨õñá·O?ø_Oïß½§í„ ´”ÀRJžá–&XÑ¿OÇçñó|ÞïŠJëm@©u/EJ‡§p¯ôà0þlÃΤ6v«eÈh½«X:>õhíûaGŽ$èüô)¬{ÁñØ#æ)leæõŸa(Sy7d‡báj‹Yäêô&¢= 9½mæð˜<ÙÞNß–3˜ƒ@Žè ¥Â 2DGL¿1άâÁêä 3PÈDq@ˆHôìdT0YG˜¨„A 袩6e®#À‚B œÀôàdur!íPmVØÝ®ADBR™è‰J@Åì-ìŽ1`ÁBŸí‘BýÌ ˜üä5:ͱÐÇye±F8°DçûïjÙ—ñ8º¥¥Æ“©€À‹@¥N¦Z&„ˆ x…RÄlW ЦÝÀ:МF?æ¨ÞyŒÞŸ¢ìŠU Û^Ù[ïÇq¡²g¦” £Ú9N‹Ölö`‰ý­ÁùP)«»‡‡ß|Þ=ø0<þö„ã§§ñØÊãC)þðñ=}š9¦âìˆP@ʈÖû±ås>¼|xÿøøñýãï?¦d¸0µ6i9{ŠjC]ì˜ v-ö&-Uè[yu;aµÞ?î½¶ïncî¥Ë¸ª ]ÕkSÕYh|º‘ 6¶Tñ–Žú†Š ×˜á ˆçBÑ9Åf¸tg.Ñ»Ëg¤ó‹³`L &ßmÄuÒ¸Ï`ç óÌM™gb‘gXT.Æ‹>‰ëö-×ñZn_e´¤çÿECç±V^ç8›ç±_X-½ªÎ/ î¥ëtÃâ º°¦î< m`œoÒH¼¹ªU„½*ÿ×Ïkãß¾œöÂRìº,Þ¼å_tQ¯vpAÒñfxµ”è+†áµ7†o˜wK±ÿk ‡6€õ__­ñ¶¿ùª’­¤Õ†drç‹ù¥7qŽÎ¶–ˆ— ^_ëš]%fø†«Ø2÷WõM ±Øš¹9JK’÷×ta³vaNsK/è̯Ém_z~¸}n~Ë7Ä€|։ߨºkmÿ¤›â›”Ý{Du¾¾ÞO¬J¯Ç*_³¸m³ò_ê ߺ$ݧøöõæ‹’%7R_7+¶–€»ß·<ÄÞÝcJ-Q6o†¾>3/Ç]æÎ[ÈNøâ¡Û2Øô|¼_-±ªƒYõ¯“‹gûÿ÷ÿ˜þãøé¹­·ž=fû^3/îCõZЏŠ3€XJ‘t0 Ée¶É•px>8QwC)Ö$™E$²Gz\Ñ™£Æñ è»ãç±{­¥¥P¼îjüpFzÒ}¦G1†fƒ:˜šgϹFõì=àØ >ŒùL¡ìd¨;¡g&(¿`˜™?8ñ—f4MŽÞ „i&×`râ0[ûÁ Ì€Éé—sn€€696註‹æzöÒ³ â2xè 9y<¦Ïo™½iló+•50 `š$¨IGH° a\!SV˜!i4)GÁœŒJ¡ì ­ ªÆ5•ÿsš,è‚:=Ñ Hõ<B$B@ ‰Èœ™bÂITÉ€“ëïü¥Â s’HƒCQŒÎ0 VÛ…º×qOÐ@Ctô†ÞQ P Ð@‡™ÎÀ…“O°ÌY¾{üîãÇ¿ýÝ¥\s!ÕNö·^®º)¼³©_•éµJáÑœûUÛåÛýæÈã"^ñj+ÿ§D]o›GŽjã*Ê?ßp=ØKZ‡t+p¬Ôvžê.uªßÕ›ù¿•Ï\a`x§O›š¿ R¼­û †Îc}W…>ç:û¯;áÝfJNÂ[HÔ91p­’­è ¯ŸD^íÿôŸÍ‡rú3 ”Á4£ön>o]­W„ ‚H(—6‹Ü3ñJ×^ÍÒ»êù¹¨ôRêx6™Ö+íNÛkúéá/*¬xr¸AÚò#çÂýwó•ÿ%²~ýüIß⯞7úuð~aŸ×mHþ¢˜-ú+{…¿éDáÀé¯bCáM³ê¯Ÿ_?¿~¾dúZà -{$~ýÜž°®Ì$ÖGwÐ?œˆÿÏßn‡1Z?«8u¨VŠ×²ÛïB)3sw3[ @™ ¥M¦Ã†T¶žÅèF¸MaJE‹¸2¢+""ù¯µX( €ñð¬Ïÿñù˜i©Ö‚@óùCiÏÇ<öŒì­ÁÝjaÆ1?ýGþpŒ®ö<Ê&/T1T+¼šP<>æ±3º{ôÌȬ.våTr^`TvNv$„+c*žåàL Q Ê€2À|þ«:ޤ1Ôžž£©É‡Ç]IÅqª‡z–GÚçè!Ûn¨V ÈTX Ò¤ѬH&Ò­d&232LJ褒I™"R^`†q<‚h;(h­õ]ý0ÔwƒûÓó³ÆN·ÚÔºÒ‹ ÅÑè…±k}<¦’='óƒh@b²uÍšòX´6¦Ò ÚØ”àVkiã!Çê5»µÔJõãxÇ0³PB0ƒ³ôÞÆjûa8ÇãØ'Yyª¿ô:»×z‰8À ±¨ô—}ö’m g‹° ÷bN˜%þéˆ<•®O•ï°Sž€35hRòôŠdœê{ }œ¥“ÔD_Bë@` {¢CÙat iÊ LzÙ¬G¦æV†ž¨¹º ›Kò'¥B’ Ã#|€H¡Ã@ï°ªZÈœEª–ˆ@"™ÔÔú”àäP=TdÐA¥.í•Ó¿ ‚@%cÂyì@5줢 X JQÀT‹†:XÀ‘ÖÍ@è(‚•ÙPÁ9¹2 hê "ŠÉn0¢¡âSµ19™32Ä@-He3s<ƳdæP&#jA;"…2Ìn³UƒÃ"\P€œ’1äà„Qbêðáu÷øðCûôýÿóC­öá÷wäãoÞ¡º dHIC±ºß¥™‚²G´ˆÏ}÷ðððáý»ï~ó›¿ý¹Ñ®uð©kó×­ê×ã3þØÒ_~ÿ‹‡ÎãB¿øÆÇâOâÉI^èןÌvu›¥àx6µ,ÿ_6«p“Ôs±<^/rÜjÃç"h×¹½cÑY¢ÙµçÔBt^Dyá-˜*ó kÚeeî)á)(H*.h;^j‘¥“'ðLw4‚ye»9Å«`Ó¢~A,Í·¢)”X&zíÜ }jø’–`…-àÁiÌÎЯóíàÄ}™Gh"ÿLm5çn¢3™LkòÀÜÛtÊh!Òk˺Èô&£pËæXyÔÝÞ¯þåkD¬ÈÔ±Ljœ0z¹Þõ6Éw=k_©¢\Ú,èꢷôŸe6ñErA—Ü^¶îÙ‚´|V×i®ë”â¹ mCÕÆxÍÓ Wiž{V-.«ù2'ßX{~SÔxƒ×]5Þ̉õ”[ îù6‘& ŽÆ²ËkµÃ­-´7P2ÓµˆM[Gñ÷k±\_z¸®ÝéØ~©œ;î¹ Ûsy_¥U‘Âí³¼…èØ&­gSö×i >—yœ÷ë¾G,›·®‰E¿&.–%MMhçŠ7|³«2…ÕÔ8÷cžVgÝÜÿ uÕ¹`-7©›÷[×ïÝf!ïuÇà•ÔÔ¼¨ ¸`š.…ËþÍWÉ%†M/Ù*•s^¬òKcãM¢sÒš—’Öí¾®÷ÄS]ï)â9ÿ­êeu5_o ó—ÿÿ2*½ÚŒ/oÛb‚IË@ñM5Ý/€S¾îð°‘á?1_³+ù2EõÇä3tÓ˹×ó”x©i›•y÷_ÜÄÎï'·–³­ÐuÕŽWâ’×ý’ó2æ’*ã†c_lÒâíJôÖ37'Ø9àËázsàB|¾9NÞL³—ÎÅËÒ­° yòr$Zuèî]œ™q7½´§肘›zkWí¸¼Ä ¯U]ÝæºÄí²L^S¾–ûÞUĵd:è „ºÞÛ=Zþú‡üÇã§çè‘ÑzöD7šÕ]-ÃgŠe7(3iSÍs7æü­™ó<×” @k}‘N$‘¡¸1éÊ‘H3TƒõnÅA;>þ×çjBÞ=FT÷ñó§>¶xsÌöX~øÏ¶«Žcç‡ý‡ÿí÷ŸÿûÿÞ‚ÖÆ~)R*µÔGÆ1ã@Ÿ2¨N†!€t¦ É ’0Ì< ¸cºË²g¨ê\SL @ "ÂÀA‡›q·£íduø0€9Ú0 Lª¦lg¹3„qõãœÀz™ÃåIÊgÅ…ocs·ÿt7ø„Ü9ñÍà°™)D›3щ²ƒr^z»èÁ™'“†Ô§,Ò\6RfÈœ(üì)ìr׫Çs¨2ú OtBb4±ÐwòjAL…=aÆýÎQðüÔÝ bìYOE€ ¸K'-P³a2cÂé\Ø€ÆÓy–DÎÇhð“¿bu¤$À î¥Â²ó]qÐP˜ÒÐ{«ëPÈè! =‘B1dGëxØÃvÀ4&ÖÙyzè̹‚›¤]H˜IMJúཥAfÁœHdŠ–§˜^¡Й¡l ávê! ô‘3mËA /CÙ½|üðãócöã±üî£Uï‡vøtH7˜É +)¶ãX÷»œ`pÁè½ýpÜ=<ìÞí><~÷_~7½ÝqÚìs¡\•9/¡¼¬ã"n8Àk)†÷§¹ÚüÜi@,“ËƒÚ ´Aݺãì"&Þó<¸Ù¨ÖÑ ¯­º=séú¾TÍÎEö ɺìÚŒë íêî΂ìêèúuÁùâPÇ›³âÕ8jͺ¾…›.¤¼uÔ+“@È»«ÇÅ+B<îªW3a±¿ èüZñº ï+õÛí8g¡þ†ª¹Bâ|l¾Vc–¤ë"a47äÈm…s™ûÄÊ5”W1îIlÆ à¬SBy5y‰Û9~R{nÛr/p%`k‘9ç¸`hŸß¨²ÅX‘®I³@œÒÛ3Kó›”瓃qîT㹺`¥ý‰Wjù6zÁ¾_ð¬WG´›x,УWggj5Mx2 º=¿òœãX YÔå q¿™D/õ†ä˜¾2÷æCöæÝvô¿%«Üãu/DZ}õ¼Ö ø¢_ _Â#­Õß{ ¥^d‘l^'±j!¹Ñ§×Seã²ÎÄz]»p+ݹ9ÜHi|Ñ£çÝ+ÄFd´Z1Wë+2ÑëpëÕ¹ÆÍì†n[rôrµÀv2ìU•äe`7’¶¯=~ñûʳÂÅ{|ÇmüåfØU\³PË_ž—ó{Ú|w¸Ì@q3éµýÂwúM߸.ê&xZ^+ïL6Ý»YÞ%×÷«í…ñúÆyõêñ*ïtNÙ_$þ cèÞmExÂBŒž+×¶…Ìwæ“Þݶyî/DÀËlö©ÃK$úשó·÷J~ÉŒþSîêK닾èÝ=S õ¦ñ&Ìí[NC÷°Ž«@þ+?_šuY,šß¸žL?ñ“^ ØÎ§Í/žcúÚ™yÏ.ƒ‹•‹3Ù×> ›™}åÜÆž·µ"w‚Á¨˜\m“§Ø!³õFÐͦòÿï¿ýgÖÿ|h4š{ê”ð:ÈH0¡±õ2UÜÎyMSFN‰PöÖI8ÕºLŒjχâYwûóU%ÉÈ~8ÀÜw¥ãû]ôxþÔʱfÝÃz×!Øf ÜÂK}(‡±3òûÿïÿî„+£gŒ­8ʾ˜–}ìÑ[;Œ=|=2zÖLå Ò)‘¦R ‡W€¢Í ž*©§R®ÉÈ7Ê0©ö@ƒWÈ@:m°a2ÈvàCN‡­tS!«@·]yØ%2{r†ø$Ùçâ. ¥™Q„™#*uP;ŒÖà %¼—‡Œñðéß?ûP‡:TùŽìŠaW ‡*†’B[´Z«ÕBƒ™h=ª™4¢ {WŒÈT‡9UÁ;JEOdvHs˜Ùð°#Ñ{ËÈa·;ö$1xu7±‡¢uP¼ã863Û\M„ŠÒûA‚,8Ÿð+gø '™8Ð 1ì‘6Îz}tÈPê\L•#ÌaŽ< %"æ^ û3q÷í| ™œo'·€< ¢V˜¡Â+ÜqlP‡Û¼ ™Ïõ›”3gæÊ˜ùÜÃ#\È#Ê)©Á)H‡;[jØ‚ xuSL.d`ß? »Ç½„ãØzh±O£¼îòx 3ì ڈɕA$ Ѧ,IS$á@ž°?mE g»`L``à—Cj" 91TG­ò ù4?Nš}÷P졾û¸3X;ÐÊ>ªyèÇc÷¢²‡€6b¨ö }îÃè mòUŒ° ˜PØÔ„‘ÓûÈjˆì³f35÷ºA ž’ÿš¾M³É|€ìsh;£u½!"h€‘„Ój}ØïûÁ¼ÈÐÆVÞ»¿ÿîýøÜ‡Cßïäìc¦d;0wIÑ#Z¯¶«ûZwõáýãÇ¿ùîžô¶Ìÿÿúù)?äÛŠt¿é¯üK€ÎËìâŸ|f¥}ãÃöÉÄf† þˆ1¿É k¿¢û’²ºç–±®yY—«& mÔv/ë:¯Šƒ3ÓHe^õ|`ÝEM1ehsÇ;I–Ÿ¸ªS?ÿò93i§[_XÔúØ¥fâºX?É5¸åžÊ£­f«·Ÿ;¦xÉžêØÎýªäå qî{ñ ^¹¼¹` /Té¾öz Ýž|ixn^YnÔ~/£uÊ—^åÂÀ^xûè~Ùømÿƒùªùþ,W½}Ÿxm•ÛX¬îܪÖ$-‡òâÂô"hoB]­m‹ý÷ôŸkÜ®–à ðÊDo~×õÓ9ß'7Šúµ±~í¦Ã×—¬ ¹ñvèKV—›+?-§Ë9©…w:q9¥¯£ï·½WÍ0óô¿©ÖÑí:²•ŒuÕà5ß‹jym•òŸþWÁ÷‡–ËUF+DÛ‚$&Ü à·Õ_mKP\Cú¦=|Ñhû’•éÝuü—‡Ûb]-Æðâܽ긼TúÔåeï[¬É%eðúºÈ•üfKú‹wñ Í ´EæùÑzçuñ6ùõ{÷†÷ºÝ—«–äór{ƒ9ZD®ËÿùÚ"¿® âF3ÐÕ±¸ñ7–©éϨcdn]ÖkïÔïs¿küò3·kòmñjLÂfò[ð†/Ù¿¸¯­Pf\¬ÁâÊQ —ækà§\6v 1)$"rr™§[û4öãØžÿúoÿ !s¢3aﻇêPé…R¬˜ÓnCÑ{˜‘)’¬`Ò`3°HÌ0À™a0f´>G¨¾K“ØZ“̇â½÷8vQãSÙjÝÈã¡ïß?<||ŒãѪÿø?rÌɉԫùÎY0ÙoÚƒ)¢Ê>6 åa–F©K޲#Òà J @"p‡,€Ùà”V}¨õãÎzûØ ”Zq–:üp8Œc²¢î0•Z—ÿæ¶{¬ÇçFËda´Ì<™™ÀÓçñ݇})»OŸ? Y÷UiÑLÈì-™4x1§CY€y-†žJŒÖ3ͦ> “’g4r^ç$ ™È¾ˆ  ì$ï8‘¿ŸŒvuªF7Àg`ã|î,ÆÊ0çuèèˆ ‡5dŒfšÊÕ•œ}¡“ª¨•C# c—~ê*˜ðHf`ä0±¹BšêÐ%¤! Çf2Ò^JÝ=ìChp—eÀ]­5™¦pOR5¥€»ãÐQêì]š@²ˆ¢HdŸS S@'O|#4`' ¸¸ d'fL9Ý«ïwuWKuš'ÝËx<õ ìÙRcƒ'w{ƒ 0› Ke ™˜4ù¡‚>æ‡9 PBmî]2Âö*…Ñ‘1µ¦,4v>Ÿj‹íò·:‰þP@ÀˆIy+¨%Ý«¢¸•áq(òhIµaÏÇïêoþî£ï‡ãÓÈý d—Ÿ›=ìSÈ,ÞÇž½õ÷>”2ÔÝ»ýð°¿^ö/,pÖ\ÅWˆí á\O½%,вI¼b»%-úøcB¾[žÀÜpz0Ü  ¬™³gg]ÎT™MníæájóPýóÙp {¾ŒôÚÑm*L“3çÎy Ë#¯ãÑ/‚ò¯ºpa_î}áV˜µ,­$„¿xèüå?fÞÏòþµpÞ~°º²ÄÖ¦n~ÿ¦÷ˆÜŠ]WæÁ'ÕË#[¿á§5I\Ù_‘»x«þ_Ñ@x©Ã_‰0ç‡~CDÕ !¥+1üÁŸæî 4„³¨0õ\(cœ;Î`Îõzsƒ*[qÏÎŒ0¤°‚0óŸxÐ òùƉëFüŸÿÚÎ N“ râŸX®¹^\t\ K<÷çÔW(l-Ìåy…mÁÍ™w|Öo3ÚÈ]lŸy¾LD½´&Ÿ•›­C<ùºJ8ÿÃ7Göëýdã*/BëwŠÖýkÞ ±ÑÖ¶Œ®î㜷Ú箇MzQÜæKC{}Ü^¤Stñ°à¦ŸÃÝÕð•qºEÿßüáÍjÊkãìût)ÞðŒî_¹Ö¯t!bÜ£W÷ªëÌÔZ"?'/ ¦Öü]C®Þ#ܯg­ô‚qõ×\/[â¯ÞBm¾äÏK 60?Ú‚oñörcT5aÉÍ£nütÃæçäð~'óÄòl707379ök£ m/1§Ízµ]p;¹²ÞFogÁ͈o`16ÞEý$Ì/›‹ÏÑ®›A±úMÜÎ ¯Äz nHËhðê­ßVá߆¶çF&÷­‡DÀ[3‰%å ²±W‚øÙ]áÆó`3¾È‚,ƒÓ»Ü¶¯Î(ÜèÖ×|õó÷»6c ¾¸Û½=csŸ#ÙÛuØnõ}ËI`ãL¸‹^eÞ/8ÛT}ñ”¹aáÍcþJfë•SÐíydµ£]ÄëÍßs¡wÖ§mK“«uz #¬Û­ÓÌÎÎ2WÉâõ*y9ào2^NóÜLƒ:ë‚_|YW¹â\þM^6Rœ˜¶§Î@‘‚(ƒ2ò‡ûù§Rf†¤ôZk-“_e‚Ãn(»Áu7(•÷2áÓ9AshBô©v:™‘ÇÆ±[-`1SŽÏ§j5ÏRd{dtlq«+òøùÈÁuhý‡CîûþÃãnWÛç#û!íØjuåñ¹ÿñÿÚOÙâ¬HÏÞÇ”z¢g×þ ÞÇþü9JMVç«æäDz»©'âô<NXž‚ MœÏc$2aŽl`…9 tÌe騨;øçêzþžJ¦D£$áNÀ‘­åÑ ­7Ðëî¦ìpw05±Î“´D]™A3 ‘=¤©’½w¯FcjèAeÆ(¨ÖøIAEëÍ}Ι[‹ÑÑúøX¼z(Õ=L’ŠÆ^ÀR+S^Ì2c$¦¶†€;2 ßaxDòÓ÷ÇR`e¢!Ù°«M'‹Ý±w=vQ{K1Ÿž 8¹DX2@(Yåô „ÚÝGxuÊ]}liCĘ™sýZ‚'Ô¡€€èˆê0 šz¦vÀDïUÎÜÿz‡xÁÜÌa Á¦ÿpÀ@ÙÁ JÈ9·Ôú)¸#…¬œÚDB,Š2‘ ™”€ÃºHû<‘&ÊS@î0B†Q˜þ{(,†DCg©»ýærŸf•¬ôLe ‚UËÃÇ Õ=1޽%‰b¨Ž sÆÝì 2À‡`ï3,¸Mèÿ“bP…É ¹†òìgŒRè°©1hØÁ«•)+•¬û:ìʱ­cƈDl€Jd"GС'ê»™ù3UúûÉœq²M4ƒ¦n…ˆÚÍ r¤Èì‚ëä<§&éKÑ † çňìTÂLf0+ï>üLØ?>úÃŽ’ƒ µ<ìZk«‡O?vïßõ ˆúñ}dÆ¡OIk£Eï;,ÕËP‡‡ÝþýãûßýæºàdvýåË›¦î•b`‡\¨ººÆWD—K©'·v¦Ùåì¼³l¯¼"D^:Üêëãçår¥Eü¢‹&zÅó¾=´q’¿¦ÉëNqÄlŒ¸f©,b­Åqy¹ek£¤i­àêžRO® ©+:¿Ð§éÍ’ÒB¹ä½CÖž/D€W1îÂzòâVú—Ÿ%nÜ;¯n½²ÚR±Vš/<÷Ë{LÜÎ1,m«NË«Cå×ûH÷æäõS¸Ê,.‘_2·f‘’^ª°áÍç,ù¿4ÙÏç‰v°>ŠLM}A3Ò œZqÝ¢»,m¼”çJ®WÀo¬4_Ï´=íu¹ü×ϯŸŸèó¥ ÿ_??v áwñkÿë¯3ë¯tòÿúùõóëç—þù)¢ìm›ÍÊ”%OV«zâÌS^|]èŸþáïIx:~>D볎b”™×â¥ÀmW‹™%f‰$¡æ–™¥”3«¶):X݈ÖA*2„]õÉ@tRðPÜ£—̈0ŽÕ"ùtÜ9Í‹D¯–»]`úÓ1>µO¥Çãû=9Ó[ïÿù?Ý¢8b ”ÁÌn@o‰L°Ç#L󎄲ƒù„8Â'0b"ÿL¥ý²À+ò\’$€0™P²Yͤƒ´Äøè‡(•S_'+Ípxú,¥•á6¼¢åflÇCo +û¥ C´F$‹² )«0cD#R&’Œ#[´ÏO4Ø”@JYJ¡•Ì4#,͹+ÅÅžŒÌ0²õÞ¨¡îÜKñЕ,DU9>?Ûa¿„¬^£=)»ä±²Oj{EwÄaVÛ9Ý2“l4¸×ÞÛt¬Ž–‡<‚iÓج¿O³2Íœ™Mb¡gÓ©t3z$²–³ÚãìÓ;átrúóÉ*`Av,+ &Ù @´ñTVl(§/™«þ 0Õþc¦üKhGÀáÚŽO0C)ˆŽ hGØí‘‰vD5BHSqGZ"\I F7¤@W7˜ 6ÕNM"D¢’¦Œ PH÷ᡱ×x ±Dhع}ì=²îʰ@xîà`µ2ÆDb²²`•FD„¤&ÇTKNõï#ÐÁ6Û £€xø®À÷h>±T`^†Ý¾îw^ÜÈ$}(0ƒ ªÇ¡&+­ 9¹.“®©=D|¢óï°wX™»18¹ Û,ÙÏC]u0PŠGgˆÅ÷^-3Ô{´§QD†Bæ<Ç&™§§!|G ©A`t*•A4¦Ðj¯;¯»Z«+"…ú¸ßÿæý”-<<üq/ˆÅ¬Öž‰ãÏbrìÞï?–Z¼–º>>~øýw×YlòJÐúiÀÜ¿ž»ïÊâu·¼.íý&gíMˆÀ_2tþ4”çuåk° W ›pnׯ¼©«xóÊW €«•s_΂“qîP9aKˆ—Úì5^dtεx|Ï"¿xe½½¤f0#m—rwÖ’3GÒ”bF±¨ä9wä”Ð8·œ™g—mœË•„K)ìÒ“ø\y~gjÑ¥x_¼Î á îq·zwÎwœ,Üç‘´õ#¼ôàšË´%¦|ý|üIìá¾,›¥»–€úŠSÚF·½Þä‰úcª³£íâ5[]þUfóR@IÝø o^Äm­éË«ú}7I@\,|û®ÀUÉò]³!]ïs¯­È_™™à¿L¯¿P\Ôîsàk.Í*ݾjÂÍP/êxÓ°Jó„áº,\/¼> ¶V_€ÍŠÞóPüÎuOè¾qrŸ=gèïÕ+|eÌ«·}•n€J\m^§wPoYyôUnÖÛ~ñ¹ÝZf¹˜þ§hïÒ¦eGÌ+ï‘.›ÏUqÄ7 ¼yç¹j5óµž]†tÑ ;mg ‚ßU;ÝO!Ñ‘¯Fi¯w¼¶s\EuóC»±…Ò«›á›ƒË7^ù7Œt§nAzùeýÆgŒ—Z®7«¢^;ó¼2†K-`UA³åR‡Ë[½ o´Zÿ¿ý¡âµÓÓ0çKÇá ¿haªÆ7ú5ó÷vx[ÐjÞI/ÜëÂÑíÊ­oY¨µ±U4ý&hª¡Ã±eä®Z1#²ÚäÊ™æ4 âØÛ²…r‡öÜ#»¢#¥æÜ=ì[†ºúçÿùƒê°ß ‡ÿû‘ÈTF«Ta.ß!3ÇÏ™¤èš˜7Ó€Ï` Ÿ v4!9ÁI¦­Å+Ê#$ÈP†yÄçÚÎtx.ñæt4¥ ¯À2Ä!é5eß¿{G¥ú>0-ž›Õ#»‡a'f£s9õbPP¢L=çIt!¡ˆè )#{'dF 6!pÝÌÈìÅç©}º0̬pŒf4§óêhOísŸzi?ÆXwåÝþ÷~l‡ái2Ðm6¹ÍSÄþ ÃlÕ‹É9¶'ÁFK¥–âÞz3‡;zd0(Óütü÷BE•¥õÞu »Eæ@Z'â0ZÉRÑF˜Ca½¥Û ‹Ÿ”ëé¹ ¦þ”YëŸ_¡œ3ÓÒs«Çœ¹1ÔIôïÈFØpJ& Ñ”fˆ†Þ¡“€U0Ñh€âd€D’e/wX!:¼ R–'×b&”ÄH ŽÏpº³Â‡RŠÜC §í<Ý‹Õ]y–ܸÛŠT ­e©d ·ðè™9Ø)ŽteGSzΉö#º8#@%—€ñøã¡BŸÌ ŒMæeðâæœ 3ÊàV(hŒVŠe¨RHÞAìXÀ"¾#‹Ên~úSC‰Úì`<½† å$&kß!;£ 2¦Ek™FRiæƒHM”K“‡³Ú £¡î ¡P—#ŒÏè Å º£=7¦?¾{:»‡ÝwÿõïÚ± P›ºê»Ç0G­²v32˰ەZË®”ÝðøáñÃß|wU ÏÓ.p‰ØßZŸw±­~·ÛÆY¬ð xÏpR#—$¢5 â&Â}ãVy.–ÞT$/µÿZ…ÿ'‰ƒ_Tž1>P˜ó®y%Ž­þøf˜WG”u§ÂmH¶ºó+b3mc•W?q -ñæ3Ÿ’zs`³Zk&.H*Ò_>tþ2‡ì \´û1èúµ>¢]Qì—=/\”k,s|5Þ^ias¿²¶ÎÆ‹ñâgxj¿æÖQpsè*¼>½À·ÛgѽŽ@.žbòÜÉÁå—L}­º¤—bèü?Ê¢èº?údHP(; h瘜6œ ÊNϧaK®hÌ'âK”=ýõEÇ¥N©Ó¥^YIëz*k©êÜØ:,Ñç£Àz]»üñÚ,@Ò¢Íâr‹F¬ëx€Æ‚„בéw}íߢþreD°^sÞ(¶-×ÞE/qûYôäh[RÚfÖ¯ö¢3êê¬Hò%5á¤èàÊx|u’Ôqƒw’÷÷ ^/­Ø‚xëš¶³ÒCo\ ®J-ÿù‚Ð}¡õÜtoÏW7¢›°C‹¾¶ù¢V7²–o%rñ®ìÆù˜}°DŽ/än¬S3náv\p«íŸôõ›pÜ Rñ²ß]Ÿkn!”:kîËý{I¶[¿Q×:êE©¿^¶¬4îð›yR/®òÂÍ^¤8U|[æqÑÀáúª/ýµZDª|!ÖVÔÍkég3×FÞ’º½èekçm7ÙvÿãÕ lbÞo#Äañ’l¼¼P_,;^1²&Ëš«ÑY1õ¤ÕÃÒ=±ñÔݹŽtƒ:y¡ ƒä Ìn-.€oH“¼Ð+½Ž§·Vïͯ=_ÿúg¸©dníYWàI¯üÆ‘úY¾'Zcßxµsc,yµì̓O]'êîÜðâùpíuçXrÚÆ.ÊËmæúp}em¥K0w¡ù¾Y…çÖçëão›B\{÷2½XH2ôB~K÷ßê¶vX¹›H¸ jI²½Š¦n†îVÐ×Ë銛´â€OëâžÓù{1tZD K¯ Aÿø÷?ý¯ÃOÑz;ÛfæÅ^ŠOUÿ©´Z̽µNkeÿ&Œ¤)ƼV€£F‹ŒÖŽ>ÁÜàžÈè™iªûf!&©¯z`Hdfë=Ñ3¬B©6솲W4F´2ÔfüÏÿù¹cdŽÚ}7à_ÿöŠŒ<ôñGNÑÔ*R **€õ#(¹¡@ $<‰²+ûÝpx:D&hÑÓ ÜîS‘d'œ°B6K–Ü#p˜C' ¼ @™ìÍ÷æEƒ”a e4f­ hdf› eCì^c€3£gti²:Èã§ÏÙªgšà^ÄxDÒÜlrÅ”9"™ÑÝáN:q¨ Ç蕟ü](¤ñØÇžQ]–lýÐã4}Ría]i»=ÆDçuK+°:ÉÂp·â“y«Í6‡Ã0ˆ`ŽŠœ3ÅÝÜÁ˜ò[Cqƒ÷Ö1ù±V7Dï ”j}Lf)f]‘—×Å@›íš‘ #q<½§¢ÂOÆÂ)øŸ™ü¦œD­ÈÄØq|ž•sÄ/P"‰>}ЀÞQ*Ê0S±*'úÞ™]. Ó2…‰#Ód:Z 8ªc÷AÆb˜YCÉxü¸swóB·Ãs‹že_{{Ïqìô,BŒ½CÙ»wwè8Ý@ët"Çy–†Ð’°³Ž”ÓÕPˆß:Þï"JA5Âm¨5ªÙàV½8æÕëà4IcoaƒK™–jn¢1‚V¤‚tMËí©ÍÖ“os@Fô€az¦R2šÊ@#ʰßcd¡Ž˜} ¦ô™×9å3}›W(П§E×%&\àÎkubÞ}`yh=ö¿ý}©õðé¹<>²ëðüýS'ö¿!é îÅ]Í|_êPËnØ=î†wûó[ ¯¼ª–"&AÐ.¤n Ú7;/µR Úæ¸¿ÉÞ¿¯òϼR]—„éê@ à–‘²á;Ä;…7"—Ñß‚K^ž;µº¦%IKC¦v´,oæÙ Œ'µ›á%Mr«½ðìXù1sIAÕ1ÁŠ“/é†àzP®Çbü¸ êèÒHñ\u|Æösë¾ zï”&ìûâļq°Ä_tþòG¶( Ìsµãå.q¼.¥xÄY3¹ÖÈ—=k÷âr[,²(ˆ¹†’¿Á4b«`Yk¾Ê]§îÁ£¾¾Þê| —–™œ ¸Ï‰ç7Ù/_©>«Êå?^Eé¢þg›#;]´ù‹À f“·î¹b÷Ô kéwë8©åCÅ•š&~Aþí;4½'ô¥0|õjÿy üÖ—ý3w$ýÕ3*îTÈžõµo_aúëç3G/hcéó'ÝdþWÉ¿àD×Ò>~]3îÍ¿¦ùePæ6Í×ß|ƒ_ú/t/ô'o»ËoØE\[méê<ü-K ?uв¤úœÿhyÊ>U ØTb¤‹/ÙùHp9KýÓ?ÿ“òÂ8}úã§ñ0"2S©ŒžV¬îw»‡×’Bo͇RJ‘!B‘]æ­G}¨e·s¥Öz{ n^ÜZë"TŠ9Í+ ¦ž]aÄ*ž“ j<Çÿ|Òà^}÷XtTo®l½,wÕ÷Ÿ»¥øÜß}ØÿßÛ,ÿðDÅØFŒ¢eR.=ªVÈ•(˜¡ПPªè`¢ó™¯Âvûâ¬;³ÀPw‡ÃQ“-­Y*¡©Øß²¥“9{Ïž}•I Ï§.wÈÁ Jx1E ŠìG3§9hÑCnL AþÌýÐ2: ˆpcé^hŒ±©7©çøüÜ>}ŽèÃãCöN—¬ãtüu/îyR¼“ mf©cô¦¦®Ñvƒ »¿©lÖ¦ÁÝað:å'¢øP¬hÔÕ3J)žhå!Óp|FåDFà41•èÇ”š•œ}_ ŽmœI9ŽœXf°È=ÑiY'w‰ÓÉŽ„²ôz»›µHõ$¿äcŒ@h˜¬b“óUqBùŸÚŒ'§À $˜£”¹ùŸ+ž?£1Ž8>£ {˜í€Ì™M?å¶zÂÁQ}ÄqDuÖéIVG4“­3¥¡$“ŠIà&´ŽZ¡jãQ½î¢”ñ?>‡è…î.d{;63§óùy$•½g‚ì™&+0t€ETb¢¡Ôqèì }J×@)'`à÷ÄßìQ dP™q=rìóÞ†*Ct¸[܇:½Õ)'-•Mí˜ H•]%º¡c‚4’21nó’K›Ÿ #²ƒ0=”@ ì`¦;£·þ$ÛYöc;öúPŒŠˆ>*úüë~î*ˆ¥ ÚÉÿy@Žˆ€ ýˆèVf–wß}|øíGÈwïvûÿù™Ùð°ëc«?ýÇåÝCá;µÔnו‡>ûP•ªe_kvÃîqÿðîaxØ=þö£Nî¯ZÔ‡]eŒùíb +1šoé¸#Lÿ|ýO¶n×Ä‘ D6—5ƒ÷áç¿Ì“¿yÔlårpÓð5‡–_tþîáû<\æSxe&±j¹6ŸZ%È…ºö¥‡?mzò\1²Je\ge6 ¡Né}ÅL[x?pqX”³i¸iJ±n£¸Ôá—Í%îTYÊD†<7pÞ¬N™)Éé$Íl*¢Y&^~ó–U9놎yùѪi1¯xeýa«»ž0§€V—¤5&æ§×ÿ§Á¯Ç^¼ó«~‰ŸAvà‹¨­kç½ûøÆuKQø¢_q¯Lîþ"ûEÅ{~‚êÅý­0¾-Uûzž¿Á¾ñí_/…V¿ú¤vüDüoÈ‚©v{“ÚðœæÍï}£ºÇjZÏÛö¢ý”¯Îµ¥“¸^iàº;§õÍÓªnãë×áÆ ïó¦èvîA¾i¹Ž·¶s o[úÃB„nÄ_}»'ôu²÷›~õ%¤¬eâ_åû û;®¸*.;×eóÅò]óœ^\¯Bz~ƒ ë§b@½eÃxé6碮uƒŽ®qr«Áç_ÿÎ…ËV$nÍäÍBËó­½~b ï?¨Öaoñý§ìiCµaˆLµþ°+æ^vûïów¿‘R²¸¯Zµßpº#×oÎúÒ\0Ë[°ÈZÛ\F ºQYOºÔϲÛ/Ú ù ƒ·sƒÂ=äÈt¡­àRIý#âæ?öÀ­ˆ†›rÖ¦ó]åk•£¹´PlôÎN â¯:¿:ÞP˜}îªR·Aµ–oª™iF-[Ò—c¢‚óežoÝ~â,\P̼`m.B¶N¸‹õ9ym¶ÌMÕîê}&ÞpÙÑ®K§ü’§¿HR‹©edžêÿO×{žÉºŸ¯#P.×ÖÁ§Â$²+ è*›t³Žœæ¿Ñ¦Luž©ìNä—Ù¶l§?wqßÐ'Îm'\Ô5 œÉ¢Mé’À“05¬Øb\iMg×óÓáE—¯§ß¢­E€w4n—_Ý,W$œõ´ B½MièV¬¼ùÚM<ÐZ¤Óí¯—±ÛÄʦ¼ö_¹µUã·@kÝvïë6ó¶Ìö¬Þ%bsªqM >Ísr¡?jUrÀUÇývŸý-Raé_1÷&i1¶·ô¤»È¿å©ws·Ø‚ÜhJ«Xw.®!—Ÿ–nVä»0>ÞäXt;;„-û„ó_òõt ®Àg÷‡t'ã·œ/I«ç2@â¹#o­¼èºÅjs_ ë¶&φ#¬l '"Ú9Õ9ñ¹Ü*–ÿõFŒû¦)Á*ͼî¶} –µ Ç—x&¬È·k˜œ—ß½xmôÒ{wæïüÝRèÒÈç飅(´d„¯—"^5äâµú —…õÏÝ9ïšUtÕ‰6¯pZŽ®tAþiCCÓRÎZ>×Ó i™°¼„· ± Hy]”p£ùcN0·ç´[7ªuõԺȰjµEKë·ê:„¿åþ\£ØÎËÌ Éx.“'7MÞ"€°‚`ÞÎs0µfÔòz+|msyôrfz…f¿Zn_ ^6…õáærØœ`·¯ÒÔ+Þ¼§ç[—àƒ‹ª¬åÍ.»î¶û¬ïÞ†Qú" àjƒÐ¹G\‹5nsm¹&Zõ­‹̸"#¬qv§C%_®ÕpKÚ~!ΪÂ92\ü –=ò·¡åM”pþ¶KŸ;'–“ÛË2Ê>ooÿö/ÿ2]çñós{ô®”BæNS)Åj±bfNbŒàÅŒ<¦éfÓUFÊÜ" ƒGÏTd“ï…Æì­›12™YŒ¥˜g$º)w€žÇø>BJÈv­å13z‚a¤€þ9œ™2óRq|‹WwîkvÀP*¼Zªé˜‘òej#@G6X…—‰„èaØ#Nx’*…1:àVÀ‘ tdö­Xö6AáI¤RISjB(ÊTdë¤ÁÝ܆Ç=Ä;Le¨t†Æ9?69}mz?¶§–ŒÞ½øP:$æ®X!ôùÓRºW)"ŽÍÃÅhG¹ à)tˆ2Ì…Õ)&-‹Ï¼Ù?Gô'P°ÈÃx€ÏYˆrñ>©ó€­a÷`ï«-F9f*€ÆÞÛ˜µÚn°6æT¡b0xkšvx ýLÔx"j3èÂfÇÝ™ðc%"aÚœ¼™ôÔÜÆACúqîièŒùOÜQ¦rr¡VØ "w•ý€h`ËL´oƒ¡è„ÚÔ«CT©Ð jì’ ]@Hƒ•=Þ)“;…#Ò{»®”CÇ€'"³{ïá®"K*²÷TÒTëä,ˆü»ïÞŸùð.«÷kõ2>NÈÌwÞ¹ºùàï~ÿ›Sl#œD½¥W@qžšn’ý˸éꬰ°·šáB .ómE5êÑ ~>—¬ýˆyÞAp(‹u)¶åÌ*«° !λó2‰¾ø1ÞrN°r^<_Ägùål6ã:nâ.ôçÕÙQ[ßÓÉjëÈ£›˜tyà>Ýìu©·–ÈÜþ^ÞªÿäIÁâÿ¼Ldº*AÇ üKDóUÉÔEˆüK‡Î¯*Y—­–\V›\Jø/Ñ¢®ÕË 9IÙä„5Ñ׎«TÄúàó’;ÖKÞ‹äÒ—`ÙpëÉv-­R¼ˆ‹ãýrç9r–12%$ÎàJ¦7Û”ƒù4ù2 Žìó~G¿”ȯ×ß”$ØbDrJ ½dqþûu)ÿµßÃÛŠƒÆܽV*ËÝ„ªîÔ’ÿ¥þÚ<ßÿ<}³äpKŸåÚ2oMú?eþ«ÄŸf~IÑ­þlA?±KëvDõå«„Þü7[?þñÞ«ž8«ëo¿l~õû“þ;~Á#àKÍWÈ‘¿äÝŽ/v¢ü|î²æ¿ù<ûsg‘—ãÁÛw=]åÿÞÒð‹žÏoéøÓEË€÷-oë¿$u´ôK0,™Å\åCÏYêÄ¿þaRÿqøþóx³GF@03¯Nšg1«µ‡9[7½ˆŒ©{ì}¨¥ÖÚÇqú·™Ù{Ð @s³ŒÖ{Gˆ‘%»¹‘–½ƒ 5To# =˜(â!z#¬Fɽýøïÿf‘úã¿*ºõþé‡ 33ÒÙkFhð¡Á ž:Žíhƒà¥‹ê‘HÒöe¯v˜Î÷$ [Nä¤)í={o{¤höZ¤ãKsËDïã„H™žœÏ¶³suùdB&êάæt¬¬dy(Îݺ•’"A“1Ý+‘¡˜H·"É<Ùg1²uB²Äð1/ûÙ]™„­Ó©ðˆ†~¤qòih‡^ªCJ6#h!)êà^ÝͰ””4Òj guíǧgÍ(Â¤ÔØF8$|wŒ#Kº[ À¡„ˆh°„Û|Jm‚iJ–øÌ埲&^æ‘àƒÆ>¦ ÃΪD-{1ï€Ò£¥˜nØC‡çfŽÝ`½¹¹]JNSjêÆH Ñû ,ô èh^/úOk`  °Àu€Ù!‰>B$ŒÇ9@G ½£·“í³Xœã3{ˆ®ê41™3ôPY@9cDJ©ìB¢%Ž|˜CLh·š)+=˜GÅ(«*n•æÙ¢g(à†Ý`TSïÏÏ]E°89æ,AdG˜„`Ëiyƒ&M€OÀž &µ0gw‡pççÿ§É†]-¬²Á3¡Øc<tÒM‰ÙçE6•RÎkUjn¤˜=~c–˜l¢ý$²ÏÂ}­€›œ+sP‚ýÉæ “9¸ˆRQvÈœ³}ò€pdGïÌ®>R£Êš•}yx|ç»u ;z4»ºß%Ôz´®ÏŸŸ– µÌ>ŽûÁw;e eç0:‡]÷'[tóy¡X,èz2£—;6÷ÝVq\ùZiË£Œ×b+æØi+>áÏŸ“WæYøBù?Ó¡þ’¹ævlŒØª—wމW Ì×tà¶zL:±LþZ óØJW¼Pµª®\÷Øì)dË”Ø ¼x˜ZÕ M`q+™úõFå­™{ßÛüî]e¡–9B-2Ro^ÊõYT“KGv(fÈß2óv]=¥×6ÃLM¯vréÊ“Xº|›UcUÜÈ­ÿ÷5JØ_ràmwû-ÆD¿Œù–WzÛ‡v3è/ýÒ¯œŒ7.¿5þôší ¤­ú„ø‚y%cmf~æq{[õ6ïãÿùÅ⣾ä©,+´©×WþÄøahÃGømkʪGŠo_=¥û½To\VH7Ýþ÷ÝÙð²mû îq'.üó—gäšÅŸø%¼ ²1tŽ?pÊ¥?¿vÔ¿t޼à_ý3}ÃÖ´þª=~Ëgþ«žÅ7Y#O¾`?ÅÖºèz87Bç”Þ¢¼s‰l½¹¾Ôþð/föôýçÃóˆÞ³Ç|øpz­µ™•ê4Ûx<¦JJ‰Ö›‘)˜$ÉÜé©bv®2mѳudÔR2Ãa=:k©uHÙ¢Îôlƒ;ÚØŸè)¢G…Ê»}ôÞ>}V(¢õöý¿£Edãáx,L*ÑÇlÙ½jW2J`Do’±8z¹·ÇRzëÑ 2=mŒ–‘ƒ:@z"5ñáýcïznÏggNÀ&áÞXžŽ‡$$fæ8޽u3Êž½7S¢šeJ¥xFXJ(»É$jÁ®dž4>Ñv¤ Y3G ˜ Tj<ˆÅKÍhãÜ gd23¦ÿUÍÍ™qÈž¾w+”HO's³Gt²»OÒ?”]Ñ‹Y>?Ã\£š[f¦y©ÅA=?ÿ dDñúÞ~@‘Ú j7ËIjÍtckÇ^4 »2šTÜüplsKĪáé "j"P*D›d_C&Ü¡8M%ÆDMu=›™™•>ÎﺅéÙ‘)7 {ÈL–$¦jî)µ0éÔu?wH _)”ŠÌ¹ðÜ&K؉(˜è#`ˆ°½#»æ&Ô:¹ 0F«;˜c "-CÑ勱$]rNOk-› Žšê{•v e:L43gáC­5”Âcá8F—ÓMèÍ"£1¶ç®¡fôy)aÒ \¡‡¢ƒ‰.ô)T ˜ÌuCÏ`r^>b\¡v p‡t”>À àDF€Çj´z…ýhî–`fÚ¹_ËúSb`JɤbØ! †™4=G.¼Û§·ljvQ^¾pò©žÜƒ(´'äјÙ0Åxع»ýðî7u¿Û}üÐÇ‘Èì9|ü­µ<ïäÞžQ+wÃqlfDËáa éÅ÷?þþ;ÑÃ}*ì½PeN¥ÎÜjQèeXµæ‚œ‡óøÜ 5Û/„¦UªîrÛb¶ñz]€Ü„Ã,¤£•§üÕ‰‘\‰O+Ëm*qÓ¤Ò¢ÿú Zøò&õ¢R¨Ó»vÂ/ð&Ï—6¼¥µ¼CakLV7F^]û¼ë¼w“§~râZ²ç;ÖE½B§­^ éjQ·€Î3åÚÇb6Q”°qB{á®Wœœ{bÁ¢ü¼ Å{·¢ê^ÆkÁöœÿÊ.¯Âù%»åQ'<¸ñè§ÑÐÖ¢µèŸ7èóšþƬÐ$¶D),¯ërZ¹öÒŒÚ\ÀA×Ísð°¢;öÓYÒÁ¥—ŸðTF»îÑþùŸ3óøù¨ˆè1[ï}B ì÷Õ‹ƒ´âpƒ@³Z Œô?¦_1™ƒ€¥äÐqkñêuìBBÝ­ôÁ©ž=#©v4DƒJEtm?´®ãØMàØÇ^dôDS9¶ÿüOŽ R>·‘1ƨÞ.f‚™]F$(¥¤+#5ôýÒðôyôÒö;ƒØ[úÎm:á}:H•:»¿N] ÓC l7 ’Ì!€‡ý~7”>ÚsÀöt£„ú0ô1KŽã8ÔÁ ³æ#¸ƒ»ÑϤ€™L")X5ݱq€h:IÝE¸M1ùÙîö%[€%û‘%ë®VZôÖÏ(•Õ-©ž>øøÃ“ ÌF´BF•ÛHi HENìÚTK(L ã»Ý»c•á´ÞqZÅîRNSd¨÷l ÌqŒçãØÛ˜»!¡TÎúøŸ8>¡ƒC‰À ¢ÃËÙˆÕ˜#5£xžŸdÌRÜ•ÍÜ N³]­<=“Ù%¸Y ÈhÙA9U‹—Ò}rý…æL€´ã¬øôc§Â¿ ” l*œì‹'¡9ã\"èVà‘èRAr( MZ3pÀ¤íCp‚ÑXwt  zÇ11ìǘªîÖ¥ašŽã1ûç#ŠkHÈ-{O™ù¾Çñ0VƒŽG(kE&¢! N6בœPH™È‰IEx…'LHÒ”ôrCÆÉ(@*°Z †'J‡W„ÐGÔ†wò!&|r6L®dšÍ)œ©„N9Ê8'TÌçJÿ<§Q5§ˆ¢¡D€/ àFdGo8Ÿ4¬ çÜ¥1­—î˜üÍ}˜K:3@¢‰i©CVØn"PÍØãÉs8FC±wß=ìßí?<þÍý}4C­¥î†±µª½?ìÆÞÝ †}K"“Å‘Ræw¿ÿÛéÂv»ïþî÷Óþœ_“¤xÒJuh˜+JÏ1ÓkyðÕ{bÝŠ' êöø%¾åb™×ª*.q©tÍÊû¢LÀmb“,ÌíµðD:‰ËmuTcMì¾=¶Ï0¥…  ÅF¿~/®¡w ¼%ý.Ü›.ÜóW‡F7rË ù«0æ¼ Å%°X>p^üÒTwKÆ®$ÞUÔwêÔ‹°­ü, ‡¡ÐùWûÉ/é ^Ÿ/í‰Í¶þ¾Sâ¶9øª™gþ·wŽ+éŒgº$®T­*Óu«¡p1Zo-(_–¯@‹» SÝ]/°°¹ZŒ£ÖÜ,–Zû§¿(kQRP*;¢ Š´ËY˜7>35ly´¾W ºµB_+©—%c™-:Ó±ôRóó´ù_µÏp‘‡xQ¼þê’¬o[øÖ°—nã­_ñŠ-éÛîêÛeXu­ôbÓïàÕʱW/—oÈz|ÕÝêþó!¸%|/´ÎoªwÊ$ »]vd´L1 Œ½÷Þ›0F°#ÚØ•2kK- öcº›<¼ß%ôwõñ‡Ök©mì™Ñž{Nò*f¨½Â¼zFk‘^LÊh@AoIÉ’ @*TÂlWL9ŽÝƒÁØUBÂñsf¸™¹§ÉÓêî&˜ìÑwï>”Êh‡R‡~¾ÿîûßï²GÇ:<`p§ïûxÈŸ{&¸{hÇC€õý»Ù:Hyñýû‡¿ÿ®ølÁ?aeó~‡s[JôÓEšÑ qOÿ¶{®Ê¢ÏŠÞŸé) Ÿòz@~‘ln·àfÙ‡¾é!”¯Bÿß\ñ¦u~I_–Í­Úìò¿OSý«‚ÎÅ$\¨Â× /ýªeUÜÂPkžÍoUÏ4¯å䳚¼ªN¹1¯’¶Î9Z>ÐKJrk¼mÍžú™¸rî=WÌëÔOÅ«ûÁ"?0wð Áì:¯i—ÖÙˆåä®{6ÔJ]2‡óõÛÔ¹‘’¯`i뾆#L Y—>ÞËo!V]È×íÚrtÁÊsãÒÄuýih'®—¸ƒÅó_º[k™<ýÒ’ì5™Yxe²Q0ªW7â V»­ß¸Àšäµœè¿õ:½¶ ê¸y®×åm“‡EÏÎ’…Uû¶WìÊò~™^»Bfðš~sú­ñ›+ÓÒ@æöoîv ÷×}IÓ¶ ÞþËâm*éúÉ,ZŸô–UUZ{¦_¡}ÞRƒÊëY¡«¿^]Í|³óúuó›ýŽ×U«"ök ×òÿ\:œ6GuÞmÜž–$'¾¢€ŸË‰WÿÙÞì^Ú¤sé Tù5¬F÷´Æ©%lÅÖ!n3Ƽ¥'7ší"tiÙ¶™ð\¬¬çb-/IK·y®w—†³ë}u E»üÎ3Vo­ àŒº{²ØŒ`W÷xéäõ|¢î…’«¶U]/3¯èÔ } +uU¶ë)ÆÕKtAؽ¨ËO¬‘ ýëÄÙÈèz½Þ¾»µ[ˆ«zöů»0ˆ^æ.”Ïåzr;]ï'+œÐ·î‘ç9skF§;ô›E‡âjèÓcí”5 ­~l±á®[¸©uãÖtï1q¡†žçƒ–\"nvV•w/ÀîË—‹Þ«Ú"…òj)XA÷´½B¯6°EPúrëâ-éWÀ“ÓºméZA~H ìîìúr–§­õ:½ê'¼:RNXƒ3<çDµxÙEaÏÁ„î$_øÃå¸éŠ3¶nw»²;/*Zbùò°Š >ĪôíÔ˜¯ø×}úãç~{ eD*Sµ+óZŒf0úP›šñ ÍŠÙô 2{Ÿ½5ÍäVè‘“”©èC­µ@Ã`™È”ã±òâÃ~|>ŽÏŸ‹PˆÛPLIDïíóaüáè«G°}EØ~ü?ÿ[¶žˆÞ…L1b" ´dR‚9Œ2))wSä`4S?Ž©t⨄„PÅ}èÇö°ß›#" O3ÇÞ³K*¥ô—Ühöû¡T¯u8މì}¬õÿÏÞ¿6¹’%Ib ªÙ9DÜ›™ÕÕ]= ÉYrEVøÿÿÁŠìÊî®P„Br¸$‡¥Ìt÷ô«2oàç˜é~pà87o=º:!YÝ™Àýøy˜©™ªR#Zï’Ðóxl€dXQÆ‘ JñúäÑ»R^*ä-ÚQm‚tk-¤÷ÞhÉ´]Ù·MF­µŒ„N;Œ ‚vûòú=€AS3>Q*¬ 5wˆOß±h[%h ëÑÀHeKš`Ldk,Åö»R½(Åðì4ÆTzaeeI†JÅ Ê8ÝŠ8¹dÌC}viv‡9h ½Mšø€!ѧÉðd|ºæ©½Ã$aU´Nw˜Ó„b°2çà¥B (@¥Á ¤j>¸<-M8ö,‰cb„¸Ónd¤Z€¥®±ãØD²‘ì¡ À@ŒS÷=Ð5CçsðS>NãÔ€/teƒbn€l@ŸÔÿ=ñÉÀ(ìp* ¡ 7ÈwPP+†çy|” Y÷ÌP“§î{&˜àq -¨”MJ3@0‡dGtð¤GÔG¼ü=|‡aß!ˆ3$‘b3ocŽ{Oaú´WúIì+ÙÐ_9-¨v˜ÉÈ5•GòéßýÅw^ÊøzÜ÷ÏOËÓ¾ µ·1 %#³KÌ„;ûdÑa¿ùÍ_NG€WßÿiG€ÅŒ„›k’˜>©oÏq îX˜ÞHÄ.`Š+Ù¿›Lå,ê³… _Ér)‰[€R¼4¡=¼×s«ë½ý^ª§óŸ\+„—¼únu'¦xì&ÖÆ—0K«Ý…2osÏ¥,æIÅïJ»\w[”î´q–ú¾‰TuÅßGRµ¿Iw¤[è ߈ÅM¬ÕOn¢ÇISçŸèüªC+¬‰«e¦€°Up"f wšÍVÀçÀòÝU€%²§ë°SKtZxqýJ7… b!è3AéK0u5#—ðÊE€WgêîS‘.Ú¡ËŸ.~¹ÈUËÝ\KÆÓý²¤InRïßIûz’Ž”NºSZéŸê%·Ïw¹ºæ‰zYXºè­ñÀU]èAEô”ÚØÄjå¼\¨rk㉃²–~ÆÄy0µ•6¿úß/’À#™‰­ÿæUú†Ø xýó†ãrþPÑú÷Õ¸w…5n2t[㸿¥lÇ ¾øÍ1àû†EoW©>òäî?ú,·ð…·j`÷`"½ëÖt]áºLü‘2ýfÁoZ>èÁ^³²#¡ÞÑ¡»Ú­ÏŠrz×-½¡rÉikV¸1¿yÏ›[ËÿéªN‡5Þ÷Øòë] .ú‡õñ}òƒ €•ôýGƒ¨Gß~ó¡×¢ö[¸…¾üåÇÜ‚ßÐ:Éò¦ÌíäãQ»;oÔpÞî< îaïïì[û ÜëïòÖéÊ/ÞëØ”7«åÒYó{ëyßwJmè,¤õ¯6•Ç €k1­Šßj4>º¢¹µ¶n|-°ÊðÏå,E˜×A“f~”¡LEþoÿîëcëck­÷žÅÝŒ^JŠ—’F+nfS·/8)› …½µã±ÕêOOÏ=šR-ŠZ«96µ®ž­…PK“ÒÎwÇ4(RÈÁ¬Œ~<ŒÃ`éF—Ú¡KYŸ)L¤¥?ï#ôåßþñÒˆ°|Ú+º²A&·©¶4IvCOC©»t/ƒÄ×ß¾z1s«¶‹ÈÃcJûýà4j¼·ècß=U'3UKµðc;¦rØ ™S§rr*Ž8½8˜ÆJY-E©Á.fnÑ¢÷˜´”&‘„»ÕâqT}p3YY"ûÎkSHš0S"&Ü3Aˆåãšú­D%|xñ¹u-:A-ÊðSŒÈœ%MÎSÊ :bêz®³„ý„Âó„Â'™ÙŽ”¹92Id䡵f?ÒÐÕ#ÂèÏû}=†,^Žm[OÅ­Ä`9*i»>¼ŽÝ úˆì ÁV¦v{‚„ÙìÔ dMæhòW1=ºH8½™‘Qª ˜LLRnúø“d°’Ç6fDöIÇ®¹¬bŽ>`Æš'g‚˜ê§tÙNՋꀜ†:f™ ì Œ 2(B¬ N;-ÂnÏZ¨C1îÈJë°Ö Ù‘])˜açÈ# 0Ê©]A—@J„CÙ‰&JІvrP0` ¡%,é]<¹OKɱÁ¥  €†Þ¨DB#fñŸ"|6Pi #«pG5øV°ÀÎì6O¶$@bxžÔ{4Ih+æ·™#Fh"ñ°û d[;¯sâ1•I‚e.½˜c÷Œ2 7d‚'àÈDŽ`Å4Îa Ùa6ÑqºP=Ö/sƒÀœAk¯VŸªïvVvuØ?zúü/“­gïÿøw?þ€ð«šXгxC%“úqüó?ûË ÑP÷»ýó>zH*-EÒÍ.Ê-+ˆîQµþ^4³Ñk«ëÄâýLû”n4]r>»nµôÞq]ºô^~ÝиÛÿÎK:÷þ>>¾y§§áN?ÛU#Å)pY5ƽæ½G¼tqûçTJ\¤U¼/LE§Î¥nü×m+âÖ·/ïô¢~±\š#­SwÕŸ®è¼t•¶èÆ,+Æed«›ixî_Jðý™ævçÐI}껇‰ä} V’9É`.G¹\Úÿ" >×¾ßúüéÓ¦xÅÌ@£ó‰,à}Òúû,ߥû‡†ryýòúåõ'ýúF ÿôõqþÙ+Xñw!+¥“qÓÇÓý®îò—×½Ù¯?Æe°¤ü"3÷ËëŸÌ~º®Å]rû†³ì¶[æø8ºbÂ×É$JõÌ–-&†ÞLº—bŒl-ênhmx!ÚØ…Ü »Ö[oÙí@dAâØP‹‘)‚†XÌ'ÓP £w &hD‡r„LdGœlxéH;è°2»›C“)ñ¤„9±¥¥{ZÉ’pÖ–éÅÀ0ÕcK û§Aa©žÙ”ÊÈIs^=SÈ2Ò2Ç—ì?B0?©·˜ÔáíÔâ=uÇlh ¬ ?yíf€T2"äÅ@O0;H&àƒ¤ˆˆLÕâ‚¢«îH•—»0¾¢³ìƒù,3)óÌ]á†:\à’ GÆI#~êŸqsƒy’ÖÉ“òLÁ,$D¢Bã{§U˜AÉv¢^÷ –|¦¹±ˆ”P¢Š…"zP hFÔ„ Œ†Þ@ƒ×YÁ)Oûß4rš3 3 Of»æÉ[ ¡Ä4ô¯e‡8 Ä+¬!'ëwö¹îžên»çh=zz©e?´ýxÌfba¨Cï½½ŽHýůÿE(IÖZŸ>=ýð›_­µÖ¦^g-@HÍ>!ï µ~‰C¿Yp8ß~•Zé¥| /þÝÐ5û•ï½IÓNvj¢‘þDŸùJtþç&H”‹/ýª§tã¬ošm©0o¯ˆE¿ûÄe¹ynM!µTé8Ó–5K]N¸rÌÅÂòûzàÊi'2•MÙ5y­¦Ë²ÎÆ)Ïé1ÌÌ:òªqùŒOÝX'eà"TÄKI‹é‰ûJZÕ&ßjj5Ö\vw%ë9Ésé~‡é»w‹{j!WOúf],p¶Þð§¸Pwz€Æp«ÅöAÛí¶Eü©@ÉÛB:ß9<\ßä[¨áÜ@4IB-¿‡›fƒ/Àn¹šRËEy‘[2¼¶Úéy‹î·:÷zW¢`W= 6œÖObõù·F@_À.ÌUt³žï×âJÜtÙÐ ×æ‘q3ª';±3éºä‚2xѳтzù!Ö—¸1÷¹q­\×8š2:1fO]í+†-aÞþ·¬žz6>€¤n­9¾ÊÞl9ó3ymæ®mÍ}RTÍÇ WJ€[ý¼WXéü©¿Ë äZ­ë´•o™Uêþ˜œº‚/¬¿Câv¢,>HWm©Ú€ÿÏ C^3A±­Ä-Ïׇÿ‚Ì}¶»ßŽ,®nãÁöþì[ö(-‘8½“lqä-™{…Ko¶Am>†sd¾eÝö¨ê¬`¹Œíï+é,„òHq±÷,˜—\õÓÒ¹mz¾ðWbXgª-oNŒ¥Xå…à»ÚfOY'™È•æÅòàÝ’jÙŽÞÏ"Kîsô ”ÅÍÆ {ÅÆø]ë%ÒåB» [ìÂî¿•÷™GéC7[ÄÃ…u³‘¯§þJVu±"´Øôx‡ÈMN:qýWÒ½ay=´¯ÍÞ7“ø€²RzÜT軈·û[~BùN'õô5§”…^þá·ÿþßÿûl½·>©ý8cõÂbu¨I–R‚¡ÕKô( ¹êîÅÝ[›ì…½;Uj5ç€Ñ@€,°p£4‹ôÞ›Ãì]@ÙKÜœ…Ù#ÇQ†> Œn©ãOÇla=9†€^þ›ÿF¯=È@…~¨É¯Õª\Ê NëˆÌŒ§Ýà^^^Ç—‘©q¿ÌŠ3–Rv»!"Rpgk£9ÝK<_ÇvÜ=í2BRY&³Ýa¨nè^Ø[d\–HeD7³Z\Ñé–‘ª´>‚`RÙmWJ©-QJí 7Wàˆ&„ÓŠ[ñ]/ÙŽ-K¢Yd~þTˆrÇ ´¤4á3šÇ3FªVo-zë)y;  9ŠÍf¿î3Ä?­ºLLÞhP›3²©CCo0?©4džP!Q¢eˆl,;1BI†Y𪲂Z80v¥…£{*ÇÐ(Á±c)†8Œ‰ÄÎK¡z舌T&Ø(h.Û¸@a 8 I“‡§ž‹˜ÜžAct Ð6¹ƒc.M«OÿÀ0Yó…óXÑP ̃Wø(3Û^ÁDÀi¾D(Ðð N›ÅTËù/^JÝ T™}jÞ'àQ¥À ôÀNrF€·ù'óÌŸvÁ¹0 O¬&¸Ï/Lj`¯§ÈÚæ"Íø‚xE;šÁK­fµÔ§çÏŸÊ~·ßïx)õ¹Òýôò嵎Áâ’L1{Ï–}l¿úáÏ{s«»áó¯¾ÿþϲ”¢T0C)~:6’ËH}V$AVɯ®ÎáBá¼ —´N^—R®›šË0ãÎ9»)øàL¼USÔEÑx;ú?“·açÊvi{¹h¯_+j¯GVKd Ñãe:µÐ˜9߬=ß‹TpuK{Ý ’|4>º"µn$n"ÛK¶°dìžNý 8§ËÝ]@´+äâ4Ò8 Ý\‡wkfÝ‘µ¼J´?ƒ+¼ãOSt^kÝëõ-i¿Mß{R‰¿¦,žÃ) ›/ÑŒÒ|⬈u/t½¨I^»Êneò€ÒÖüî«ñ“ÀdõM¾ûþ] ƒÝ©ë>2OÔ]Ìóž’ÎÅÍAŸ;ojË×ÃñÕêNÖ—â&õ•Oæ â·œqú¹³tiËqÏôàcàù5L¬“s¥#¢ëAzWìia@Ó‚çRߦ_Á#ƒ‡GÍß\{F½)Œô¾'©5>­ŸSá¿®zo^ÌVüµ¶¯Ý¨ðßßÓu#¾½L¶ªÄgѾÀ5¾÷ðzìmì…&Ö2eҖݺýáâ±RÄ‚$Œ« ÖÕæ}·]d+D^†ró½õ+lš¼.¯ž/þê‚îáÚ·„ЛØñþ%ßÔsu I8n„kÏæÂ:`¹eé¶ø‰‡KZk›ˆ¯ƒtqomeÏÚúaI÷ù°Xt&q»Ô´‘üÌ£ê[µˆQ7 ÅUî^&É{êÁ:ª×ÇÞâkAßÞ¬ÏýìpÑ;paÛŸÊb¼pÓo4àDãIËŽ³Ž„M]¿ø_ÿç×Ç>öˆ ¦öaXu3K@F™±ø¤B½s’e´q„0¸-BB˜™R=:S$ œÁÝÜP€%bl¨…è2g¶A)^Š–B9­*^X:: ®­eO{ýïÿûþzÌìRÁÂbʰ9?4‚*`Ehf²/?KÉZ÷6D*ËPK©½÷Rª2{ïu(Zo™an‚Ü­E73Ê ˜››_BÞ‡ïv;™ÙDÙ³–*%…Þ[˜33zŠB-LŒJ*t iJ=¶±gÏ…Nx„ÕÁ8¾ŽÑäû}†º;ŽÊÒŽ}Õ©;ø¤œ^¡@Ž0G~ê_¶OHs ï£Ñ€`Rì¤5<ù% hÈ„(dH‘*n4·F¹£‡(˜ÌKö„´éØìí Q-pPñ†Æ‘tͨµpL;î Ð1’=•’kâ4P¨ê¬À˜@b_™)„àD ÍòG@?Y ¤æ®œpÿé6À ¥ç®V‘6ŸÌ‡;Ê0 ¦Í¨;j™ùJôŽì°‚ÁÜ*T^sìÆLÀHZa)ÙÁqªÁD‡bVû1•h}.ðL™ƒJÐg•ÿÉãzFø²Ù 8dG6ŒG€„Mđżìö»ý“•¡ÕܹûÕ÷H±Ôáy‘û_}ÇÝÐà(5Íižv½õžmêdzb»§ýîyÿéWßOz€Ñ„ÏE'’Ès»•î·Ž-‚@I›žîG\9[m7?F·5†ÄïJv¯D?nŽÚõ5_Id¯óÓ»Nƒ[—~þyrCãEžæQ`±òÉäÅ$“7=C×hÒâ9!)n‘nÜé¦ºŽºn2•Û;¾í¯âW]×;-`bc_PíLþOWt^X7-ì΢óç2Æe\¯ãÐeçÐü§„2±lg|:kí½ºÊŸÿØØ€æ Ù‚ê¶²øé©êj›}A´*+^äšO?/@N’{ˆ†Œ¹OàM˜"ç¸a(4Þ-}û ƒMV@†_^¿¼~yýòúåõOãõ‹¶È/¯¯„þ~–h4ï—ùÿËë—×WlKêêïbE»E†Î4 .Ȧÿñ¯þ àáÇ×[#{H ÒÝÌ=ÕngÓUwšùØZ‚˜\ÌŒÌÖJ17FÌzkHÕb$ ¥ÓR1fj÷Lß smäñØ`ÞXRÁb¥¸E(Ù;2‡Èì‘Îêûºsâeìî„ZË×ÿñßöñ˜½gæ„õOpùÔ‚%ªæV&„ûÔ¬ÇP—/Ç—Þâ»ï?ïvCo½=zš§WóŠÈ ·ˆ`-C*zo¡€ÃÜR2³a¨Ù#Sn^Ü3z ݋؇ýŽT)v8Dë0cdï©ÝàÆBÇØGHµðéyß³‰™­u8eÆ„„ºX±££ïì‘ÝaÕêPjoÇãa$³–YÁ“†OGoꩽ7mFð{‡rF`'œ}z?bö;`|&¸?‘@-3`’n/{Ô}ÉŸø||ý©µä¤&ïr zôÌCµ!Šü1^2=%dOžÑ„àd5¬D¼ >ÍÚ,-fKƒ ˆOÀ Ì/vRr·Dc·/”‡¢¸e gfÄaTÝÂó'¸ÍâþĬ.ÌÙ-vRQ?IÙêè ¸A}îùœ)ÁHGv™‘}1Àˆìj)žö”ÃÓgÂNGî3½ «Q67£{L1&’Ö C&¥#r Õä¾d$a KA‡Žc¨‚t›>_ÕÁ áyo‡ÌH°º;z0RH€©0ƒ“šX!D¸£Ô¹òaÔ2ðLPvGÚéy9JNºR $Á‰=”‚ LÀtH3Iœf§4wKe|9(æž›X 1[7Ógÿ^ML—€fhuB2ÎsL¢#Ž3 3U#²ý4ÿE¥2<í†ýÓðùón¿g-»çÁŒÙúë‡Þà Ǟ íˆòÂâÑ3S}l1¶ßüå¿$m÷¼{úþóç_}‹Z:I+ÅO Û¿DNÐã×Já^£Öîfpn›áÇÀún¯ß§è¼¤ÌI\í›<ãé‚óÊ>ä«s·¯d\/">šm¢ÉrÖâÒÍ¿®Žlðw—tÞÒëXÿT§áé?SJåBªAŠ2]ÙgÄ«VÛ¥‡Ý¤ú„é¹Nÿ̬œÓ²;õëoÖV7ý'¹ºñ+ë]ª‡+ Y!e“e±Oèô”´fáÜ:¢/$ns}Ýú.nm„zË[ý4—ß›!ãã©ËóS¹÷-:Iùðæ)lÍvžˆNç_jÝ˺¥ëÛáÛ÷­wÖ‡6ÌTyŘº¨{õï[³Ú²KºbÐ]]ö-Eñ2ÔïlQ?·r®iîKi¡ÇöÚP-:ýfu“k±­^m®ÌMï[.‘ØÝù«Í³Zg µ¾›[?Ì[Їîüj]¾çÍÞ¦5{Žï;Šp;'W{º¬™·u~n&âB§iƒau³¼% ÏëÙ³ùh¬àEÃïïæÚ¯g÷…²ËéãfØÅ:?ÿÿM®ß#Ìö´·Ü*Ix0,÷šðOZCköõ^õ§òéE¯Œ«¥³¥øäý½oØîÚjÖx€åóæ/¤[0¡Â«Ep¶ž•it(‚k·7¼Óßä<®m ób¯¸·¹Š¯–¢†›—³•†éЧ¸ðCÓ9ÌЦÝôãÛß^ü[m) ]N½gè6?ž|GTps®¦Ç%¨s¸x=i¶LŒ/wô- D_“,Ÿ§¬NðïÍê\Kºm}ÎâÑønÜþ¥ëî$ùú"Þ’h¿Øûî(Kòz]ÛŸ“ü«ÿðï?½Ä±e¤BÈdnæ^†bî2÷sÉaÂR'¨ÖIs´žµøT•0óè²$™TÍ2cúëÉ,×¢1±/ž\ÇérÍ88ó8êuluDZÍ4ãXf´ÌÃOG:ÕºBÑzwËa8¾Žt——×ÿåÐxŒ±G¬OjåFÈÀTR3°=??ñr8LŽ¢4ÔR¼L]ÊÇ£{x9I Èï¾ÿ Coípx}zÚ™sWª9³¡·–’Ñ3sš'i…F/¶Kű’|_2ÐF'C9–êFMt"zo¥úd[+ÌÌŒr“I²Á÷uØ ÃᨦÖ^² ŽÆÍ÷U!/•áÕÊëá8ްY™Ç`† ˜@ðrîÎÖÔúÝ`$¢Ã+¼À€6"ÆÙšU„Ø0ƒ°“®^‘„Ra­'þ\‚8¼þ”=³M­qÙ|á"LjT"‡h™Ùó`jVõÐfœ£3¸ÎÕD¿­e,¸¨·ãÍÅì]UøÎ`‹ÀÃ,Oá® w×uui/•‰Ñ·ÐCü¦xÁטõ’[}S¿óõè[üõ>p~¼ `õꪮðÙ«‹—™7Š0‚®³ziÎ{jZ[]'â9ßÞå*½*lVµnÄ^¸¶4âfEp£B;ë“.5R.Ÿ¨û û+¦öÕàó¦TÂÛ"úém‰É;Î ü[å_¾Û»í %_nΛsøtä\ŒK–»Îù k÷­¾Ÿ·ÖÌÖ[húsKƒàz”¶v‹­jÖêàäêÜØ¢o²Þ73«C ;Ÿptf þM0sÞ›¯jž°äïÿî?NŸvüí—vhÙC™0Òà^¬¸×Rj!­#t· Df¦¤Ô{·”S &7*²-h$”’FêP\92¢B¦$•ʰ¼qhi°8Ì[ÈBå‡Ê½0ºÛ¡÷ÃQÊ”Š€â„Úë‘Nõ ;ÿ§ÿ¯±u`4C~Nj²0Åà` Æ) a07ǦÄ0T3ÞÔ8ju+,Äáx(Õ¼Ú³? »¡Ä¬¢›a€ƒÕ:¸[[*œý‚!•47+e¨©îVhPëJŸ•$fäš– ˜à¤ç±¿¡º?íjµB!¢—Z“ýÓÓw™ŠÖ$kF¼^CðÉ-%8ú09ó^ñ'ÑN¿'¹üãá• ãËìX[PèÝ'”¢!òÔoà~ê&p*0 &ˈL˜1¡v + ¡ÙGc*•(^ å8޼;õƒg"Û¬¾B!…°9ʱé= &"` Ñg`Ë“D»08(¯æÇ6i+³Ø~2êÉŠ× /­5Lä®Vwo1†ÂŒ j-¥x¨Y™œ^§Æ{ĈHÀ Z‡WbŽ0A—[3Ä8«Ç“(i=f$ÌDòÙ\DD¶W𳏧±eB¹3Û»¤£3Š–Ù…B:h»;Z&ƒ4x²š¢»bKåÅŽ¾\‰pS&ZËJßà´@ ®2‰©»°NY"C f(Ðþþ?þ ¤þñÇl Úì'+ÊKõâ^œ„’=2"Œt3)lF+®R¼ƒãñXË'Ì*e4HƒÂ;b¨®”Q‰‘R„öúàê©c¶ã8¢cõrTkåÓ€¡°X!û—£J¦Úøÿµã±ŠQÑÁ˜°Ú›”Èb´ÉÆ€9Éx˧^`‰Þ&¡û€6¸=€§ò#¯Úê>ž[k-óUËÿƒ\ðÍ·/0@þ.ö§E‰õ<¬-•[ÞË·Ù§øp+çƒĖ78ýÛÇŽ‡î8üÛõ‘zÚcÍ kÊÑj'>ϧEóú‡¾˜_ahüžuÄ3@VÅÍ[´µd´Ž.»Ò7°Q êgÍ‚Egæ’»bm½×c±éçíg<ôÞ§>&±Üœ/Ë`a{Ö}•zÆVKDzó÷+W¬6Äëî^ªôÕïÜØnW-¼×%½¤Jßæ6ušŽÜ\ï÷,¿9l‹›ÒÅOlå—öu9ÅF@ÞRÙ:³Z«ßÁ=¯Üé–Ý>”%äÊÛF½ûØâÛ"†ÚÒèÑZì«NG=^ߪ>7¦æº°=/Âß.uøÊ¸èv’üŒ¥„“””¾¢°bl¥.úJmU®7Ò©Çÿø×eî¤~|éÇ1zdK^Š÷Áá&! ™y­ ænz¦Cn왆â½õ±§$Ò$yªgv)Õ÷nÊæ(FcôTWë)‹Ö‡ýÑáp©…ËÃØ¿SPKzUöþÑhOOC5Ã~PoȤ±%;•ÇŽ¡þÏÿ£¿Ž©ÞÇG(AKÓ']x Ô] |J»M^g`ÑhuŒè=«{ô^jUæáåµ½ÅÌ}(‘½#³>}²®v[¦†:ŒcŒ¡Ô:xïm2Ú‹ #ÆRÜ<¢ VBÑ;Mc“•B+0WôÌr78Ɉ.‰ÆÌ–¯¾ó}5¦¢ew 0ÅzKu½¾÷O;ö8¤=zÿôü)¢Ž™™¥Zö¯/‡ÖÒËÔè %úqF{³Ïªúî€A§îæ P³P"¡ÈD-è ˆŽâ€ÏÍÑÑ!!§íSPÂĈ>‚203ʆ1zÒg¼u>|,Pâ8»ä0ø€±“z aØá65ãWx '4y˜Tïðw:LRôc­µTl·RÙƱòúPͺ™»™cËTJˆ~ò´¬b^™iší&ƒ 2Áçò¼ ÐÔlA™iRØ/É eLµ ÈR”WY±žeƒ‚=QÀ””Ö3¡É¥V–æÝ=e@1#ÐKDÏül¥›ðrŒáî0ËÐjгq/´”#"F” L— d$,íË0 æÇÀ®Lnö¥Eë鋆Zƒ¡VPˆºƒJAb2ì 4Œ#Ø>œß w˜Í¢ü" =fc²ª6Cè=áÃR?Yd•ÄýÄJ+1F­“ô›~™BÿWÓf‘²Ü4—h]j]ÒŽy-3Æk=Àëxp«,~•½êViö±¥ÄÉokéŒt/‡Ú¾ãºR®å&³d!ë}å˜MÕ ÍŸpQÏ_•¶çµuÖqE—¾h:þÍ_ÿs/¥|ùÇŸŽ/¯½…ænî^ÝkñZÌ’KffDJN¶œïuìi$€Á½’¨f""Ô B/Ž~Ý ®pTOc¦TÌ}¨ˆT*zWkcƒev¹G¶¡´O{3BÑÙD¥~xEkï¾×Ó>ÔãK{ý?ÿ÷ÌÀØ•]ŒvhÊ®èÙ‘)•‚j2À“ášàLvV°9¬ãa¤ñóçOî~<Ž’¬{'±{ÚõèRŽ­ » ðÐ_¡I·ˆ^ê§]é}l=sn:án·› ãzˆLÏŒ^‡½z¦‚ô>ö°H½–Z¼šH!Å („”Fº•Þ€ZÏx¬–RÒç-/ µCk]T±Ú£¹W²ãxlcN:<ÕÑ&–s“õ$ˆŸ ^¡½1»¸æä d'H]1<Á Æ å?ÂP@oÈ„rVti¯³ÌzO¢ê„e°§§á˜côd‚È¡‚6?¦„`O(ŽÞa€ àT¢pôOè¯Ø‚?a|…$¤£ÖÙ`R™GH€ƒQ`æà0c-%©.d)6ÉXµhF&­>™,‡¯Åh-¢GV¯ÑrÒŸa™¼g‘~DÝDíG"˜–¥Â@ sÌ ¬S*cˆê¢ „u˜qgFª'ZƒÉ†Á2qÈ¡ ¢˜ðÚÙB2xbp&Ð;Zè 4ËHíÍÝÂ1Ó(sÚ¡gfÀ(òÐ3©Ï†§â.9Õ3«kL@pÂdǤXÈÔC…à©”ßûëØÝêàöS‹—±W²ø›—Q‘gø~ØK¶DŠ ”…/ ³áÄ„ª_X˜M&\~2ž€ûÉ“'}eõžð‚ì*”>—ædRÿjdô1Ù›Í T  PñcòæÈ6O•#hpžzÿ5“f"#å bL†òý÷ÃÓàŸ>)Ÿž?í­îjÝ•ZmW†^‡€eq¸HËÈý?¶Œ [ÙOŸ?}÷ç¿’`çXšÕÝ3°²Œs °ZµäM"vkw™Eð ¼&­RK® ÿÚxUÏÞh@¼| €÷qü-TRWös«†„…0>ïj2_°ÞsHÊ Nv‰ºØË¨þÒÍ£k‹µÍ4Z ø›Úƒ®bÎ¥=Ú9ú‚»£E¹J…®«ç0‚gœ‡ @unY›¥ÑqWmz«ßçújÈ«0xÙÛÎ5ȱŠÌxNèî‚"ØJ¢óZèÈ.DçÏ2¥›Å ݼ¶À}Ìåë³ç¬¤÷Ucn ßÿ7ßòu5‡É{=H̵gÝà$×›ÏMú6‘æT.5¥W“ÛÓbÒsá!q»1é:q#îL%,zn¾ìŠË¹ÿæëB×ÏyŠ¿HÓ|›î¼o÷ýzÿõüþ¿Ç}åCoÒ·þâß àÏþ^æë}ëßÿÚãïhŽ=6ªÐïæŽøûÝO¾éGŠ¿çò÷¯dò>ÀªmêÊù‘ùx‘™\w\(·åX郟¿ØßÞ“:<ŠãÞÚ&/j¯W×±¨oþþä­þ€²BßnM¾—špSÄ»ÛøÉ¶jlß–01[Ö®úÐõ¼µÞYqk ¶îž6 šøÛ¿ý’"ÓÌŒ|ýñ¥ÆÞZ´A/pcu¯¥î*Ý¡¤&Å⌘We1ÒÍZ$•ˆŠDDh=¼çÓÓà¤2¼BjÍÅÌN‡2ýi°IšÞ[FÀ<ŽDZ“ÑT”iïHrÌJr_#3™ãÿò?Bœ´2¢w´–9yËFPæ”KÛÛ¸|‚"ÌåçÂ?矧`´2ÔÞ;¨ÃáPë(‚Ç×þô©–Á¼ºU­²( @ö(ƒË‚†Ž—ì2Xq³fánÚ±eh9‰Ì ÇN³h™!»ý΋­™Û„ô ý(VäžÎR÷ÞŽÇH”BÒE¡õÑKÍÈ{ïîr™!r”ØÚ(u£Yˆ_nFæ »4e‚˜~›t`ƒˆPÀ HÐaB”cRWŸ‹€q– RCo³(Joè#zŸe|N¢%0ÂÈòµÏì€2Ìž4ZµLC¢$"¢Xb ¹·1 Føu ¸ãx€U N0 ƒO BÔ:”ÊÞŽÙÓˆ®^Jq ¥Ö~?ù0$lôX£ÿÿê?ùOËnxúüüÝ_ü Kw·¹éYº¢™¯Šèüú˜cÕó±ÿ-Àmóô²”ð;¯2ßsjß4~µÖÅñ¾´nð›sÏu*±ÙL Í{1§ÖY¸oõQ×Wá.ïÑpÿZHãOt~®gq‘êûÏ¿j>]1¾y¢Á÷E¶ßJZóÒ´véã-¾¸€Ô¤Û¬tÑÔzO?ÿ| »¹[Ê A”k¸Š÷ÁOB©\ ô_ë¦ÒkTv£[ÿb@Á-ðaXð³ ›¥³Þ·CT¿ؤ-²ŸFó_ø}Þ;Éoü‡èß<»N«ï÷•ÈëÃï×Gìa>ø ×Ê`( ~KPâ+@½¹C¬]j ”5‘¯˜™ km} òß~`0ÿ`•Ç÷~ñµçÛß­µ¿c’¬ø8`òœ<ܱN=󦡥87á×›hãÒ/mîrøÐÈl`ÆËf°ë>f^]Õâ÷oÉi®ÂùUÞõÏûuE¿ø™'ɲaå¹µQŒù£|ÍêÎ~š_î*:6z÷z_þäg¦Ióô×ìÃ(PÀßþǿɈÌ$yørè-²wõLÀ|²þ$Œ^܆’4J“l(4ÉŽ¶ìЬZÎ #{*€ÁÜÙ;²µP 9“ÄQY‚™1xé %3""clÑ‚F3yÂÝ›ÀÞ#˜­á0ÆÁën(†8ÊçŽÿî¿=÷jI¥2Û¨qT´=#3ÒMyÊ9Õ¢¸ìRVgÎ6…hIë»]…(0R¤ ƒ—j4†¢õænLµc+C1ŠÄPë0Ž£zbç`*Õ2”!wWv3Sª¸9­GL¦Éb¹¥gŒcTg©%zgq´ X²gÈ3_MÈZKÜ ¦ãx˜¯^áæÅk þ¦šäÙÕuTvÒê°s³Þe_žÅk)£eô“Õj‡êgd"H +ó¬Î„9lŠéD9å­“·êD#hœ¤Õ¨/H@sÂ8gµ&Aîôê„)- ”R…ÌKú(Á cLßUø£Ê­£5ä89øÂsPÀ+ ÉÌ^@CÇ 3“Vœ$QÚØAy/$Ÿ÷û—£dF°Ò­»ç}‰¨Ãp_œ~l/±"M)#"Q 3›€FWÒ *h ;zcqÔ#ž2¡“»=ÄA 16É‘ÐÎ ) èݪƒ¢‘ÇÔäˆÛC‡˜ *ìS-­GOÑ0˜ÕIßI:&_•cdKí 4BƒQ‰1Ò¦DRP¢CþñË"zžýªÙ1Jöµ|ÿTFiÏ2áåØBøÕ¾‚O¥”èûê¯-š¥QŸa†œê@ŽÔɪa:¶íØ%3ŸO¥Ù¼7)„IîI“¯A¨ B´ùÃ)ÀáüTÈ60"'Ÿ ¡ eL\€“‰G™™“÷9,€ŒIR ÔáNC¡ÕÝÓSÙíU}÷<<}ڽʯý»_iÿÒŒø´«Ùâ˱e)z ŒÖ󱂯2â_þËÿ¤îwûÏÏßýÅŸÍå2\$]tɸµ0·54ï>ºEðÜRü>×H]g¿{Ðä=ˆà¥ðµqü‚=þ3Ì.¯ ÂW` ·!÷-šyGÏ%)ÿƒÅ,Þ1_»ÞÖEýyaê}UÕ÷7èý‰‹Î¿iâûx^­²1ýìey1ƒÒæ,ZiþܲÞWòI<ëלXÝ“ÒÚGy©5€³\¹}íÌç],…9/SФ‚Á“eù‰1˨pú›ó[×saþóæBY`¢ Á.EY;3.MdZ,Ûÿ—Ò ºøu-”„¸fç‚΢sp1ïŠ?ºª¬”N‰³ÎÈþRLæ&“;3™f‹ðÄ3†}*µpåH¾f7¼£Ãó4¼QÁ8I ð¾5 oy¸”ãå\iÍ|[9—4oÕ5¶,Î_êËÜ*ß\¾aRfYlK«ß,>o«Ý]áä}9^ÿÛåj¹¡Øq©XñL/äÆêÎÅ;ÿÁós<—@–»¢´-êÀÇâ·Â–åù­v’¶Áҵ앖×z£ZœÖ‹ÀmKhssÕ¥îvu­Xp'ÂØ•Ú¥ry]ü×úÓj£¾pãN;ï+½ ] $®UÂÖR=º™‡×’ÛsKW+ y-GàÝ®ŸÚMç$¹yTëfîl´o÷­ÕV»Äå¸Ú\7ÿzê™Yoó¸>o¤T.‡é&*zÞ¥.—zÙã·ÄƒVzi7M)¯#'i<ÍLâ>¯îüÛK-Ri¤$È@‡Î¢+BÆì |ÖZ‰q|'LpÈi ÜæA¦z’˜  %+…æH–`²v¨ÌL«_¾¸ïÈ@öê¢Cú+¬ÀËÜ”Ýúa^”d eH7Ÿ•J£ṟ±ßù®f&ªTîöûÈl]¥–PÔyŸ~êbqËYø°IÈwÖdqÒ’ •7Ë’“‡-À¤XT;-HÑÒJÁvpc? ;˜s¸1R¯cFZqNXKZ>—RŒc«yFÑ„a$dªQ½÷ÀSu7HÊ|rFâKÏ@žs}¥(:QŒ™Je$T‰Æ/­R?[Ì-$†âüj_[æc¯Õ(2-_‘ CN„ÍÒÿÓtò +8 –°Î4Ù2g¨ÝN1) "Áœ¥x¦ò'!¦.ÔO¡®ËûECLR1»øúÌYw<Àìô-œ­°­Ìö3Y…ÐäØ ¤Í5 &!—×â»òéÓ󯾳§OCuwÙõë?Ë¡Ö÷×&)‡}€–Å!F4e´c?Ž&ýåoþåð´úüüÝo~}e'…‘…ÒÛ biC^ø ´@+÷:=Y©î]iÌ·aùâóÖ!·{n»tk ·8éî}ÂûAHžµ¼u .²|«¤í$n¹åº8»†¯Ž÷wàÿ”îÍvAë€Jëô«ÖßÛþ‰µüÐ2Ã8ú\"“¸ ø™Ö\ÂT^ÁÚ+­ËMWÒ¾«’ —îa8+/¯rÃë ‡°nŸÃEY}Cºê>öOSt~JõN#½-:–¾¼Š–Ïú–²T4ºjC\Çü7è¦Zˆþßdù›…œŸÙ¥›l}‰‘QwG-€ÛO9áÿX3nô_ÏÕƒ% cÛs*L “š[…¦Ë3ž‚L)Ð_»òÄÂe­Ç{•Â,ºÿ¯òcÝ·æyÇçû ·KÀWqÌþ0m^ï/dÿ>ïâ€àöNöº÷˜ý“a<ª n‘ëß%ÜhåæÃ*òïhP¸%’ü‘Ó[]üÃ>Qþ.ÿ7ncøº›þ=±6çö?×2ß’°*]HïZ§?;”ÑÏÀ4y¯›ç*x¹{‘÷ݹøÍgâIShYˆYÔ'Ö³ð–p×Cù7ÿK@þÎw¥yh?`HïepUŽà·!¨ý^ŸÂÏb,ˆÂ£ä[·ÀÎ×EÞÅ…º2HüÍßüµ$3‡òõ~êc‹Ö§÷E› NÝaÆb¬˜{1!LJ:‚›ÑLÄTFj2 )I96Û×ãa$`оØs-ÍHS–žñã‹zwº!U‡=22&ÃagþÔ4¶4#Q~÷„/üöňÌ#ø¼/Å£HÔB ‡z¶™‘Ly9/@™zÒ‚Oª59';V† <íw„ÆÖª{d'éÕmÀê»ÃáøòÓaØU$é%SéC©ƒy8cl°ênÔ €±Ej$hÞ"Œì‘Êt/¥x^‡*¨Gbr²ˆdФ¤Hdë3 "-…C1A¹a€—Âa(Våfþz8$ôùû'eÖ¡V ÕêµÖãËòåÐ%´–cFÂ/à$ÚžÀ$÷s? JAŸ¤&èV`B„:0„OÕA,°I'!f’Y)¬EIE’‰' ”dlM ÊnGëJƒ)ºvß}Ÿ­Mþ†í€DôɆ7Q ²ÃOÅ 9JÌ2"/ûÝàÄ—/ÇR}¨u? N¾ôñõp¬;~Þ·–"ÇÞZkß}÷‰¬¯//Ñ[Ù—þ IªÌ͘ý¥C%Bi"PFWÉé=Ö™&UTg4š?d ´ƒˆÉ ³ÎŒ“Šy×Ü‘‘20‰ÖS‡næÆ.¹q0{t($ŸÌ:*‹Y%ìÊ®4Cˆ¯=zLÅ¢’Rñäе®£&saHªÿêyá§±w³OÕ~ý4´ÈíµÅs±ÏC3:ö0OBO¥´Ìž*F+p‡UX:¬NOe€ÛüŒ&L}òˆžJÊ D6¯Ü3<7™uÏÆ˜mVŽšK ÓÌœäª|®1dŸM2¦ R9+ÿX"Ûi7 ܘ«VçÀt@`Ì^38K cª€ (Õ s/õó§áóóðüi÷ô„ý :ÇÀóççjƽï÷”²”êÅÀÖ;"s¢@©ßüÅ¿Øz~úþÓ÷ñk]$^ù}âAóÈ­Oч?¯'øg2~f ,úbÞoWûx}œ ›ŒF ÷¾Rwy«éî+ívï+Ëw½oîü3_6Ó\ätu¼3¥«¡tôÖìàîàWL®«~jÄŸó÷[¥«À†#×ÉW¶+Kز¡œWJ§Þ(;tnj»g• ó‡绫ïúèê^1ÞæåM4ý“Ù%*ñGº¿÷F¨cw‡ëýcVÿhŽmÜÿH®MkÏßßóí¸Mmàíø[‘üL?ʵñó謿¿‹Ô[ûè×iôüÜ?—ç¦@‡Öì¯-'èúÿ ßûÖ$m4³_Ñ|û~—M.xÆzœþÎê%ÍËþðORX'h?KÔ矄2Ó¹íæÃ~ɸíä75 ÒÙ¶ûæ».ìš¿þ뿚âúÃ/ãáØÇQ³…™‘F377šÉ@3˜Õb0§°TN›])·LAô˜liÉ„‘¢ô:Æë„õ »3!ÉèA0³EŒ-Ic¤Wo‡N!Faê~j͆]:ÓÇc3Á‹ùŸâ0B¾”ïwñ?ÿ[ÖÆÜàè/ JóDOƒà“?!¢FAÃÊX2¡ÛÓtd9©áðz$‘™î’@ZI…²™ÕRÍÜAÂE$VÌŒ“¨¥ìw»Dv8¼NRëÇv¬E`Ö¡ÀÐÆ ÷¤Ì«ÑR)tsW ·¬¥ôA]éÕ¦ã¡Çd€©õ¢yI±Gv@o½T Cp<Œ¥ˆnûý§ãxœàc/Ö{öh0µÞ‡X†2É%QÎðhö¹»šrÁ¡"ˆèÈ>w#û0H3—"N(*„ì³_«e€=‰ jî÷‰h¢4ÂÒ§m$²§zPà “àÕ3 íØ‡§í•ãQ=Ê.l@4»¦§i OÑh€˜ÅÙ££8ÜAÉRüp8ND÷ý§}±RªÇÑ*w¨O»]FŽýXJ~þ¼ûñKûéå·HÕ:”º{zz_ІjÞ28š$/Y gÅ©W=ξÖ˜®,b$5 GŠxªè~1ŒMÇHY¸²Ö±w‹HN¤¼ö0á³ùKÏT fî–‰Q2Ï,Šhaù“&y- fžØ™ï‹¸R‡—T“*øÙÀkȉÁ½§Z¤$ŸÌxI7þíË(iWü/Ÿ‡}±böw‡ö¹8 Ï»2öxmáÎ}õCདྷ¥p_ýó“¿¢…'mnóŸTŽkóê›ûô1kédÌ•¤©>7Kñø‰¾) gÇÍès`ò÷¦C‰ Àæ¶ú0'培$0©ùOŠ qú‰èHÍÎØ÷ŵK&goŒ‰‘`f@0²bxæ¯ÿÂ?=…VjÀJÄwÿâ/^^»Œc*Fµv°R;³^«"²EöÞÇžþëßì¿{~úþó÷¿ù5VÝÔ—.Á³ýïIÙ™ÁÞﺹ°cës¤øuyw¦yÛÑü{´vúªXäÆu ]d[/Z< û¶Èµç´HŠVÚðJ~3_Ã?aÑù˶·!:¿Æ7 ›£½]¢ØÊIß3~W\ó{c>S]or‹GÙÛBiK÷cÛ]y§Z`ëj¦Ÿh*³à­Ö´%ž¹Káš•,N¹€‚¼eæ'¡ËÎsi²’7^l¿—®ãåŸÛ[=à —CB €‡Z[kaµ¾¡êsQ]â ±lù%“aœK$Ë‚ÒJ™i»7szütèÓ]ߺK_ªï7ÙŽÎR7ö&¸Ó º±•_~ˇÓçÆ y&à\(LÄ€1g¶Þ¢Ûôzü¯ÝJŸËÉs5ïWŸ ­ûãj0VÊE\}"ï>´K[Ÿ.~é sá®ÀµbÚF= e“eyqKjã2Ü×¶GлÉz\?ÉYôë#µæµ:N±‡icr^t¶«š×Ö>‹£ürœó*<\°=:ëÉsñ5YB ›µè‹®Æy?ëk)é<‘–tO-4-Ï­Ó´»ôóÀhuèòR2¼ˆXÝ º=§„Gå }¤ Åýp!u ÝŽæb¸û“»^DwOÑ‹¶ÄböÜ}x‹Ý위l±6l¼¸Ú(¯¢¢“ÃÛe!o콺ç¡ÎÒfZÈî-ÿ˜—£G§ÌQëhÑdqž[WxðRxå~ùf5nEÔZþè6ºPV–ê÷Uttý_Ä—«Z>ì¦ùG‹±»\!oV¿îF^‹u¾d—Ÿ7ï[)>i;o¹šl÷Î÷þöZj±-N¶½‹õ¥Åæp9øÎÌ^]&óåO„µ6Ÿ7z{ uIòVÍj!8úWõïiæfÇŸ^ûØ"²GeÒ¼ÔâÅiF©Õ|î§¥;sŠLÆÁjë1‰þ' šp0RHåØ1ÔèQ•^\ÌÒ:w%8¶Z¼ýøBgX5P:D ŠÌŸ]Àس…CG-#zïa)!'!sÏ£¼VÿîùøßýwHõc§³·¨+½¿3Z"½ &€è&+“C-Ìç°[œÛ‡§¢À„_gÀ|>~{&I¼0ÅãADs73«ƒ &ÉÁ„¹yë#ãØ‹£«÷Þ™p–ô©ÌÂd*ÃX)…b_«23Ô£ÓHšï ä©n…]ɈÔÔÑΓËî)ËKHÙVÜJ-¥ZôØÔ#‘Mmoøôô)•Ç8f`&ºZfd7%[ èDñâ^öûáp8dæÒ˜ÝLÄüÈg€U Àz½hè‚—fÔYÿ‡ð§ùãÚ­ÌÜ‚œêVM$“,Cñê1vuÀñøÒ£9à«P²¥–O-Ñíýu'º Äë\à1ý$òT™àŽRW £Éa™ÈžŠã¡xr×zìvEL«xÞï?å®GØ µ”zx9üôÓ!Jì²Ö¢4’6ìjÿ1;%i0‘ÑÅFî ar—¤!e›Œ˜í·Ñka‹spqȰDJ»b”«w“Ž‘= ¯ÇRSíD¤;kñC‹–:ŽýÇÈ?ÛÕïì\»ÁŽÉêþ¼+Ï-|9v»jÇŒ—žÉÔ˜ªi/ð:óE0©ó×Ë6zi½_èW:çÓo “G‚€ÈI(k~¶™€ ÄI©4O¾1kèL†ú)ÖÔIÆÊæØÌ-°i?„ââ?œÕðdSš{õ:x­ûŸ9ìwO^­e'\VøTŽ&s'*ÆZÔ2{ËãqDOeþù¯óüÃççï¿ûá/ÿ|‘pŸôÎÒž'.å"¡¾9÷o‡oåÿ6a–[„Q xç\ø¢\°<…Ìz\i*ê ”˜žØE ð&¬}þ¯Œfk,‹—t„g¥¾å‡N|."I-%’o4÷œ¤p–úÀïQË \uÓÍ‘Ó?\éŽÌï×Tëž5 Ék%Zòªâ µ5ÈõÈë[ä6Ø’°×RèÚ+=(IœÓ tó§-:/\Ôi–¢ó·YÎý?wGu%gíÖz·m¨‰^§ŸšP.^VçWV¤6ò£´`iGoÖ9¶×ÜI {-ªÕƸðdà¼{-RÈÓ8kk¹Ë8mº‹];çöÿó†FõàŸçêÍ–û]¸J$ïíBäò–3–oûàçÖ£ï3Vi<^Ïï¯"~Fþ0€¿Ýå>þ•,¨UÌ¿îÂôÆ&p·äð³'áF©ñ1Z|SN×G†C?oä®oh˜üœ§õ!ÀúTÔ› }¨/ã®1(o F¿²àÿAo±Ã6ênkÔgéJõõ¼©¯ä¼ÉàÛ+éãÓFû978”·•=¬Ëm¿bû¹Ý{—Áå×uÙŸeqî5\¼5œZ&+Ó ~†þ¯CÖÄÍQ~ûóÏë£nÃ[§1ùHhñÞÔ8Åmg‰ö÷b¤Xõ¤ü®jº* }hâ|]˜ý•çî: Ví“°ÿfOÉïäv~¯‹?Ëî;>\Ü'hêëÓ¤G³Z縥)Aüýßÿ•òú?Bˆ±O ã½T+V†jntÛ¹³J¥R§ÌsÊJSÊRÒH 3#äH§ Co‘‡1"œŒZ-ÇÑGîwÃøÒ©5¼FÙUš)zödF‹Ì,ÕÜQ+^Ž-JËÆbņ<ûËÑ"äÇòýóî‡O‡ÿýÒ?˜Wô`e¦8´#[ËãH™¡©N T ÆÙ\ôÜt3©Oࣄž3VX†@a·+Å{k€í÷ÃþiÔ[k­“tcëc)…œŒT/…ê$8™(‡,:˜LÏPïj-áV‹{DK¡˜Œì°Zô¤Ë¦xœÊù±šYFβQ Hö–¥øn_"` £ã¸v¥ÇÑÕßa(µ‘ˆâÆÐ±ÕM “ÀùH Àw(30š-X'lô„ód‡×¹cšå<{ N6­tŸ fm¨f§BdÀáh’¨PïÇh-#¦Ñ0 ÍÝPKf*,ګѽÀ?ÓLJ¤¡>ÚtØ;PÐÆ·%f ¶Ü‘ ½H/m¿"ÐÇf@ñºßOØ á>¡`|­ŸŸ÷V­÷xún¯Ý—Ö8öC©_Ñ™/m쎤H¸™¦Â ƒŒLJކNîQw*…Já$R°`íF aùÚ‘€nä8qn2ŸÜŽ„}ñ.ôÈ–jB.KSZ>•òSïMaÊÁÙSfé¢ÕaÕ”™8ô,B5NBU–ü®º ¿=ÆäÄ ·žà bWl¾ôø¼+F¶±Wã“[1~? f|JËdÚkv$ŸvþÚûkO{Wf’|š¦¹Þ6ÑDÌO:QSé´ÎO:yS'" Éˆâ?`Žè€àe*MEÍ«˜KDJ œmæÍ9Na”ÏÛ‚NÞÈ'œf^c€@1àîænC-»|7ìHãËѼìÌ?ýë%«MV…Ñ­¸)äŸJÀ¦ín<4ôP ešñéûÏŸ~õÃ÷ñëSžpioYv~²ñ÷(ú¦èÁ»²€¯eðCz[dÿâvwFrõPqs³6ÿʰ¨V|l”ô5'>ß“‘WœëpëÚìdq¤‘[Í>?'²$·çsÑaÃõn=Å?iÑy-M#®DçoºÏØzø<0¤ŸÝ¿òGý¢™âÿøè’-ïÀ_®¦ûÂ(ðÔŽwçqlòDÞ’üÐÛ»ìÑÏ{?Œ¤üòúÆàüÏv<ÿ&§ó/¯_^ÿ¼_×íoÇT _–ÚŸÆÞ|ÓfòÑLàkK71É""ü#[w¾V‹ê®Ñ/¯?ܨŸJüÓÙè¿fl û©èšÊÇå6ŸÜ°X¿ª5ýõ_ÿ•2½Ô<Œ‡×C;Žf}Ñâu?x-©ô]– À¹óHefÏìFÖâ$gäA9¡Û’BiF#KñîžJŽ[«H×Ðcww£9Õ;(ºqW-“pµ®."”$ZÒh`©Å7ïxk-üÎØóø¿ý¯ãßÊ Ícï/ dGf¢klŒžÙ1 {œÅ»§dfB£¡ìðô¿ýx 33Z‚ ™ÍÐ*I;½”2øóSI% 㱕R²GDWLT€<F¯^J A.ì÷O­µã¡wD± ¥¹!ú(FÝ•0µv¬¥ôhHÙ@swÓH§)32€¤»ÃsªÔÁÇÌRt3Ç6F´È¢×ôÝ®¢“ô×—NÃ0ìJ±È–4ö±+zvÊ.K{~zÖ—/Ö²¥çœS&2@ƒ ôW؈>+¨œQ× À šÔ0Û±JEõRH*ÊÜ]Dd‡œFn…(éÇcŒÓÝg†¹“@dFSb47¯¦R£WQˆ@ohG”ŠèèG0P*4 ›P]‡ÜfB½•IçÝz´ì™‰â¬¾CH!º^¾¼JøÕOJƒØ3^ÛñÓþé·ýKCzìw»{†èt""• Œ&FWqªb – m2{üÑ  Ž8jL(D¦LƒP ZêÑi"ÆŒoI$=|ð½Ùß·öS‹}ñ¡ÐˆpTg5¼@¥Zq´ž¯MÏ…%‘Ž”{·RžÜ'€»: `æ=ѤcSÏt2…>éÞG dï ç—1,Ğ܅â·ã˜‰Ï»RŒƒÛ«âµç§'ÿÒ[G$å+3Ú¾{ž«D0ä$КQ™sI`r_͆6”ð2«I(Sá„ÈIü‡0Ÿ-gpÿ´æ©p5ÙÀO¾ßsÅ`ž¢Ñç"Aoó·Ì´Ì<’È€ú¼@¤Ø:F/îÃîÓSv¶{ÞOR¸?ÿçÿæxhG N!3¡b]I1³z G´¦Tÿé¿ù¿|þÕ?üæ×àª=hÂv´f0óŸQ®þ•M{gÑŸ¹À²9—´‘i~ucÇMâ„{œé{ß$Yû_¡~sc.^˳l&~¼â =ìÊ⪚‚så$ŸpÅ©'·cöKG®Ë$Ëvê›þ¸³Ðþep·&é‰?LIEW7xzî ó^>iê º²Ä;©Ê,²û3Pâûðÿ¿xò.È9“ûÒ¥ýöz´¹PšïZ7º ‹1™›„.nÒíîÂK¹l5G®'̺—ä9Ïáú½ÛFWµØj›O}»uòþ«Ñ]Å7Ý\RÜ/|LNÞ—=b®ÄHV…»›)ÍÛ-ýRú]Š©­ÞtR…ºZ¼’Â÷®æâ¤éVã‡w!÷òj­öëõ—•Í…+úÕ ¼ØYLç%TwSFÓzëZóYhgý4®»έx×BFçPîú¾o%%nû̹5àÒÝ!Œ¹­¼A/ßÎ…ìׂ¿ô±Öž]í5P­7+\ÏÀË‘{#Oµ”ÓúÈË2Ï#rkxN›Ì¹—Dº]Ó7ä…€ŸôàAèj?Ñj[Þr¥~›p_•ìnܳøv®bÔtEˆÓµ¹Ì%ßpûjÎçÎc/M^­à3£KkÇØÛ©¯{bY~ë"¥ºn'9oZŒÃE‹ä.ÑêVüçú/Ó~+JÒŦlù9WúBËòÀ’:vê¸^‰ê¼úßã`“§L®†u ¶æÃ’J»% ¯5þ¯{®#´ëÃî¦åüÏö±ñ`_{0¨ç§çØôúB66}-¦ÞlãCIVò†··ÍQÓI`„çàù~~s[w¹¿Ï´‹YÍ«Íl-…¥EŸÙjië=©Î·©{i%lv™¾—0óB¶¿^Öâ‣ΖZPKñ¡eá–$þÌ•\‚o^ûßýÝß÷—Ÿ^_Ž?)"zÌJ¦fu¨e(Ãn`)=»2£±eÌhÕif=ÚÔi8õûgrÖ¬'2²G(² eb ’=êó@ ûò‚jÖ›ECóñnjع—]‰¹åñ¨1!ËÖú—£U/ß?']b1hŒ6öÜ©ž|ÝìðïÿW#Ì2»æ+jM™1veÀ"zI¦QÅ è` vVÿHĹGý4Òž»ƒ•xzŒm”ÒÝJ-‡ªýhæE½M¤ìÙùÕ v»Áì‡Ö^O^UÜÒ\L +bØ›û€CgeæÕlçC©ã8ŽÑI€–Q°„Ð%ÀdêJy—  R½ÏÌÈžéî È«kÑ‘=£™wZÒ XkMêÃóÞỲk9¾fßï‡C´ÞZdW ”ÙÁIÉÇa«°‚œ”ýOöªV`Ži"ЧNí 'ˆD×l ›ÐìV”â´=eiV¬8Ò@³R®ì­ ¯NÍàŒLÒˆ€è¥PPƒnHå©ÞA€ Ô‚8ÙL6°˜Á ’ `†è0³ý°{y[D-Ì#z¶ç§§èñÓO¯ÃPkõý Ú®>ãÁ­yµc&Š2s<ÊI¨úúetày &ㄎQ€“AklÓv™#‹‰‡ˆ<"I´ŽCW©‰ 1kgB&<ÈQèÀdÁ]h…6F:1¸ AHffF†4Fîˆ]ñ1ó5àà^Å_2[jgÖR-ÓO;Î?â(9X„:FšÛà‘ÑÀ¹wsã®ú?Ú8ö4š› ïŸAÇžŸ†ê#ÿá0†ðÝPêí·Çñг²h¿³n9£ŒÞ­@=‰áó¬¤?Yõ(¥"Ú鈚šýmD­æÊÁ%YjîÅNÐàð“v¿Î” ŸžwŸž­ì¼V »aWcýÏþ‹$YÝàV,Ë`ÅÇ&ÑǦ¼–ó_ü—Ÿ~øüݯµ’8+ÞLÛ!ÐNò8÷qÂõÉ©-U„ôuI€–°Ë‘x„¤h-)ü•ðÌì%¯d=* ¬eЗR£×VW07Ý H ŸMeΨ„÷zÕ"-o¦Ï·¦¬W"ϸC{¿Ú¸ ºf’ÖRôí¬JÎ÷ĽwâÒ¥éY$äVVäìbº˜ÅÎ+Tç¬Â²¤®¦ÂŸ°è¼Î Ò‰UÊo`<×:Ú\ fn0<Ž¢¹;YPq–­ž ¯Öêäõ0r5…Öª;g{ˆÍ´Fk}¦{®î­³KæÏÅC"ÖVË'¹w-UZ—X–@Û5Î1íš‹æ]o%Fµô2_²üWš±¼Îë×°=ÏŸ ¥dÑ:oåZÓg[~Á+â½âÝBs{¥qŽG ò>ŠïÌ…ªaë¢ÈÕÑôv~ø^0“¼Y?º~- =ÞþT½1›býºW+Ô–'ƒn–Ü#Iðe™ëæ xïØ}°8É `ôë>iãƒõÆlx@ä{JÄ„‚ôµóðcýfc앺úýûÙÐáYTõ„MxK  >^Å·1Œî¬"Þ­œ¿ïQóíåC>ºÿÛ]Ä|ôh%oÍÝQ0×ûž+ñ¾ÇvcdB¾ý]¼®ÓksQ¼_Cw ‰oNcm×ÜzÏ}}R=^ —ºÚ×Í® EÅ«Ì:Ö ñÿHë…® ïÛö]‰×ß^ú=ºïè)òZ]ýªþÀkô_k͘‹Œú2Úà#Tw£Ür‹ßÖž´ŒøÉ7çè·ÀŽ7…âôöƒÔ{pvH;¾âL½{¨¼ï¸V¿0ìµUß¹è¤À7‚ÆŸÿ´n ùs›ÖÒÿ×£¤•Î-75'73” À¢íâ,ë|ɦt)HŸ3$ÝÈÙ]Úþæ¯ÿª¿Žý8ö69»ÂÌèî>Ùž’µ …”Ñ $¡Td )L À$gR'2³pÂ"Ó¤ì ;ç‘ó} ¬’VŽ# 6oGôCu%2Ry}QëžÅìÙJ³~Úà»aÞÌæv~CÚ+Ì1 è à‹–|œß<ìfà #„IÜiÖûš—¹f«Þ‰v 8…z0€Pƒ:R° ú%Ü€è`sq‚@ï(é…>ì¿ûôôùS}þäu`-´=ÿìÿúƒÕž=Ý«—1iئ Ñc;Ž96'­øù_ýWö/C7ž!Pž1‹ÓápéÕE±ú¶cLëà +]¯q®Ï%.&mö¾#ÿäWÀ+7͸gwÌ»ùε‹°DzXòßläâ;1¤Íx žC=”¡äMʶÓV¾cù>’-ßü¼]ˆ·--æ?œômÞ'o$GËÞ#¾Ùyõ¡ÅþG÷Z× Þû*oãÇO-35·öо[OÉ>4 ~yýòúåõËë—×7~é)Ÿ_^ßt:‘b‡zJЭ3%þéG/ú%Dûg½œ)á»"{ͽºjØÐâ2uú›¿þ/ÿð%ZÏÞ3e¤7÷2ÔR«£[dŠh½™Y13²GdJŒè:7 )Ó)屉2·ÈœòF êÝj©ÖÑ{ü؛Ҥ•20¦.izsZDüö ÁvU$#Ñ:ÄÈ¡Î]dµæÔì›´ýóáÿóÿ¦ ìŸ]™“ŸnzM £ÉLeÍŽ¿@Ÿ¥<Œð ·¹ýœÃ¬ßmp² ]p³' fð‚R</¯?ed&Êà$YÔ³‹=3Šïª ÑSÆý“ÉzψˆÈ^e¾Ô},•ÅžºÙc fQÜiÑ2l »÷h…•t „,;ϴ̤‰& ÎÞ§µP‰Öz†¼B–®Ê =˜H¯¶«û¢g¸XÑ£»yëÝ‹ÁXK³«õ^|†OŸŸ^Ç/Á.YYZ%Rá; ý˜„I@ˆ˜5[Æ#ÚqÖ\r‡&º@8ÙєͭìlØA"3dÅ-$§™SÙÕLSIADš>Ò Ù3£Ý$%¢Ÿh±°©ß€¥"ŽˆÀ°ÊIÕ]#)`p÷}yí5ÆCÿî»g’½Ç÷ßï«{?Ä1ÛÎöãÑêð ¶lm< aB·x=|q]FÀ¬²0k`GàÀØHA)8š~j2™²äQ{V^ƒ°T¬ðéÀwd$ÆPË|"½š“nÕA—Ü™%…ȆœÌ)ÆcÊ)0 íÏvNÙO-ZTöÅ yìÑ¥b6Ø„{íY‹gäÎX"[Ÿ‡òÝS}i}LµÌê *¿ÛWw¶Ìβ›>ö§]¢¦¶dVƒ/9*aÃLÈðŠLô¾ÂÐÓ2!òôp'#â>‚†z* ”a÷•0œ¦ëú'ÌNß'bÊçt0‘'£wP8³Iè§ù\‘ õ 4렯 ¼0÷ZŸž}·¯Ÿ>ÕÏFè˜*‘ŸþÕ¿T& ‡±—Z+½GƒXœ<öÎHôž­`ñõŸÿçßÿå¯i”él­1»žý?Ö›¿¼~yýòúÓzý,Ñù?¾»Á"ø½ÿ® q Ê»ë÷HÀò¶brÃ2žÿý,C´Ú¼áX¼yÏ€TV?ZWç¶A—>#M%3¡ã¢öqOCéºò, 1™QˆËî=.KVZ´.-•…ÎFØguEâFÚ‡S÷óWk[hó9~kn“ÝõŽçG~ô‚.¥œ%€MbÖî[Þ4Y¿k²=žˆ7z? 6 î‹õð±Ñíú¢„«é­üÂMïÁW™ð®LÓYvÕx¾^(äûæ©ÞÕ«-|hæ_Ô´Íï[1]nzN×=ÚhúÞú÷ОûÏ"”ºˆ¢mµ“jñ$¹µ ¯ö5½Évyï‘pwvÞí~@+Õõ€_o:WÚ7+Ù«Nð³Û–¶A|Ïâ¿›ø¢eôCÃÌûËéÎnÏÑÐФî©7:`›ø›»lvšThòqõû_ªð\™ú>¾ÍûÎS·4‚M${9Þç,õjVÜ.rɾ|ûæ;:Œ—o]2Z—kíÌqÕ%¤Ó›2oRp>ê~|ÓæµÉݹùXmzyýnJ ÷™œ߸¸ªmjÐF(öVì¬w±e®ºõ•ëôá³âBêw'û©› 5yëhÅî9íÕ'×ò%‘7¹Á,l*.µ÷$ôå~û7õ×Ù#ZÏœ›¼Xʤ§_ëP†êµôìqìÌ©c‹a ¹Íôƒˆ³¹vJ³Ä¿zG& eLnºˆÙŽ-zøÓnJ&ZëÇ#¾{fq³#AŽ)ï(Cm`¾‡¡¸Yö´R²”>¶ha­Ç§'—áËÿëÿN2!(3R¢3FJ0”²©(€¡§žôLx…;zCX€ ˆˆÓÞPHpn6C)þôü Àáøj@}B2»­‡¡ì„â^2¤£²*µg aå8Žr77K0C-1¤U–êÏÑ##SNk­E&Ó”°:[ÃdÄtçS»=âŽvì“öRa¡Ó‹ÌDS1J¤À,»ân™uÛn·£³G[kmLd-C󨆗ñ‹ØÝ!eÇÁ(gDuÖω¹ƒ~ÂÜ9Iµäºß•r=ˆ ±%óMQÆÐ¥Ý~*¼ÃÜ}aè¾Tã9‚=‡œ÷>ð̈cn!JÛÑoåH×7²ÄQ7žßÅzô†ßÈmQÞÚ=Î¹É ] ½O0a‰0ÞŸ|Ò]RüÉŠÎ_bÏkwßû–ok‰¹ßšñuZšK¡¦‡’az„tœyF:Â;¶]¯J.ÓËó}]QŒuÒAžìÅ8O@K&î2]èP='¦,‹ ~y= VÌ…3­[ffÕê¢F°Ð¿×r;1hN·Nq–äØFt>µ&0/Ä…7D¾¯>î,Š´¾‹M±wá®Ð$ºدZ¥tYÏ\,áüxž½ºžã—äJeëm ÿ¾úÕä[ØÆyF.&n†ô!l\›êåº"ÍmŸ6¼Y²¼%éFcŸÛÇëÕÐ&;nCï…wOŽ5ÈzSÚÀ†´ù£kiSÁN»Vº65Ù>ûô¨@yOué„çvÅaóɯÔU®Íh‰ûè>ô¬í`äJÜGréjTÈÕñZèÞWÞ‰Œx­ Í•¶4oêiZÀYÔýBµÀ¥˜5NÕT=®Yßdc¡ßÆ»º’MÙVãyg”¼Z’odŸäÏ>Þ­Tòºz±QÜX¿0ëÊáán(¬;õ:mŸ=«óðÜ™øvzA­å/{ß,zw¿7Æ•ÆÝ­Ö9 ØòQ¸§`sõ]\ãùï Àpú¿½€Exô@ÜU›u¡sÐ{Ny–˜þæhåwyÏ9n;LJKB5®fãò_>$Êôp–.“bÕ—ëâöS ®·z­”ëäˆÛkó&é%ïÎßóþ¹.mݱ޷K]_ïÆC³ÂuS’¸Ö?þ¨÷µ¤‡)Ó©_æŽ~è,+½`lŸt­.Šž¸Tg!uSRåÊêé\Êi\ßçËxýí—>ŽÑú_ÿ‡¿=¸ÙÔøoÕ‡¡ú0ÐH7™*¥Ð,#il­M(ÿ¤.-š2§þßÈÌÈ¡T'á€){¨G)nD›™•>š 1L¸ªíjË‘©ãO¯ugEÀ`Q§ou¤v‡Œl_Üï‰çýßÿ?ÿ1FF³¤2ˆbR2s)ÉÞHÝ&Š  ¿2:ÊNtGï3ÎëÃÉJT8¾ÎÀߌN 6À“òON²6D&2à:,^¿ÐÌé^Ÿ„–Ì^Ê®ËDDŒ%e”™îæ>D¶vh­ÝXw»cö‘£l¬Ã`V³ë¯Jìêî0އ8‚ %‹d†¨eB%g¼2$0Ž=…LÔRJõýSéѳç±÷a¿w‹ŒäP‡ÌÌ`¨%ˆJ“4ÆÑ¼}ìÍÝ( »Ò4Ê‘)Ó—Om×'Ùøœ1( i€è»É'Ø"2Cb!©qš§ÕŸŸ­8Ü!C–ã+":½œfVй–Ñ' ·GšÕ]1C°9=#ѲC-È,z(ýÿÙûÿfI²d9 s8'³n÷쾇$Œ”dš(Éd&Qúþ_f4˜$‚üîÛî[•çD¸þȬªÌª¬º÷vÏÌîÛ²±™ž¾u«2óüŠðwW·’nL*¥Â }‚´»Ñ  ›bDÀÀ$ÂA™N3óÓ×8õ©›Ìø¥êË¡ ‡Ú‘àaŠ£zW´j!£™'¹Ðú$p¶žhtŽÓ…^S™HSÍž,AºŽ)&¦¹{=Õ-Ii4˜›º&© Nœ2§ÔXœ´L¼2ÆbpðÔ$†Ã,Ì:Óa >™˜RèIáà|íù»-4S¼I§=U3ë™-³g3¥Èž9k~¥Š“,ú1&VxRÿÛ–næ…'ÅhöƒÕÓ1³‚ŽT«1•EC·fÙ¹#fýý\è_  (Ìrþä²÷ñ¬ãoåjÂrÉ!8ÛùbQ¦"m©KÑA[l~ã„ÞáV¡†èg³Äùw/s›˜E¨æOX$x½CIdPº ÅKÅø ‡È†*ûü7ÿ{D˜VjÒj-!;öR!<ÑR­gµ:‡²Æ:Î ˆnµWÏ¢ ±ÇMö§M¿å 5bzû|¨]òyo‚ô¸—i ‡Ýk‘¿·Ðð¨µkÛîäpùüÝØqåìâ³ÂÆ&'žˆj5º;jCO£—;­˜ÕH»ÉË寅EtÛ^¢ÝÀð‰Ë°å¡Û{WÆâ[•­» €«ß'ïd‘nSCâÏ^t~Ó}òp_vx'„«uÐyÉïÞ;<誓ޣ§ýÎ'~b^øžWŠ`W€ö/îÝùEyp17z¡ÊóŒ63˜Ñø¾®ŸèQ}€âðÞÚðãõ+Ûþ××_îëW!š?¡çþ'<¿n‘¿¾~ñ5¢”ò>êøPüò½í߬íaÉø®MÂÏÕ+÷ëëçÛSy§Ü©¹}Õ¥r‡%l¼·ÏÒv2p¿øúãøÛû¯þu´n4‘¥+œ‘¿2 Ã8x)VݸÀ¶JE&Bx±Ý,3/ "Ifœ¯×H™I‰Ê‚4d‡"õúãWµ>~>„[(j›Ü½“TTX:3¢Q6ÐÐNÅ$d¬þÙ‘ùã¿øo¦vÊlÙR³'ofážnŠ»gÞ¹¨‡)Œ)¹5è mZÀ>«€AÈÄ d_$>.µ|ë*³îÃÒSën^J„úÔË™æ*céÞRQk5zt)Ó rÔâÑ5RýKËÓ ¢÷™ ë¡."{ö 3+ÅYQèÃ0œÚ/‘î®Ø}D-Þ#gEr+Kß¡£t¦¦4Ö…|ýš­i|©/¿±Ì)ꌹƒ=Ò -[d³HÚXÇÂÎŒ~øôyê M]=‘‰4Á´´HÏó.à³* £¡5å<erj6ÐêѺÕÌI3I‚Íë@SÊ ô”fáeEf@r´ž¼.VxÈN˜gŠÎáSm_´nB‰‰$èP T Ú ï’È ã‚&ÏÐR À‚RÎ.ªÝÊp8øY„lšR˜:¾|™ÆÏ‡RKoñÿÂn`ZWö–MÞSDƒBÖ Â†êŒTj’TÎ…êD”àÉ"U##Õ( ž¬°ž08«ñ™"îNÌp<‰Lr4T`L¨’ƈB#ÍÊ\Laë’ñÔÒÍFsS¾N!Q©OÅ*y¨Žï w¶Y4 ,fôNŽ•¯MNXå8˜a’k¤;ìÇVà;ãK6uXj¥JþÞOÃr×Td@«‰€ÍO`.”þ¸¶<Íjþ¼.wØÙ±c†õ­ úÙÇ e æ !Vû® °‚ìˆèðç¥ø\J³9ðRçm€`¶ø/ÏÑ‚8@Eëå“jE…Cx}í°òÉ_þÑ?r÷ 5ÔìÑ;õÃ8:T²g—ˆèy:5ô̹ÊYüÿðÏÿùoÿ£¿öâçS˪[ÎÞK¢~}ýeDçy²Eü]L0ßžåß öýÙ‰Î;öûGÍ8tÛØ#r[‰ÙËþÖ…˜ \,M/*w…ÈE’ `ýµ|$ìÂKÓüõvæW¹\Æ ]ßP„×-^ž³Õ;®En]Ûÿu©m-´×bO‘E«ÃºÓ³à¦ñÿòí|W@·N»=ßo >ßI¿a¯›„ùKK+ëß_Çô*±³<œg­¸÷ä;>»äŸ–|bºChù&žûïæ­qª~"`t§qúÙÃ[¯»EâÝ·÷T͉)MÏUYîz.WønË›w=Å ç‡ws¿@ª½–v>2¯Ü6»¼ë]&ÙïøÝËévAÝô™ìi_[¡»Ðþiû¹öžÓGïã¬(½:‹V ݳ>~©ÔâNzìkg»~Ôót–ü±“¬}˜›/›W ÁåÉHÚëÙÁ¿u ñÙVüës'ûµ¯êŽ»zÏr]»þâ†úµú­[VìãíbúÜu§½ÏåŽïQ ÜDbÙÙiÈ¿ö½s{?7¾QYSFnÖþ=à­tcýèÚæ¦ò®oï3^êøÍ•Ÿû–¼í„¹W óš^гu3’¬*Ì-3•36™­‹¤;g›Ùyâ9Ac1¡w›EZ«$Rqj½·îÖ§Îêµ[´ÖŽSªÀà¥Ãj ŠP±:õU 8ý7ÿ-¤ì"{3§È®Q„Þ”VCBÊ¥ˆ€YÀ³T‹€ –”YÖY„^’-ÓI6yX `Óàs r" Ña³L.˜£ ÌE†êó˜dJ‡Ã!Ñ_¿‘ánêP32•Y¨Œi:*rj­·4rán{-52BéÐ0%¬!ÒÚ@¦O F¯Ü­Ë\Á‰è½Íèÿ\Ã2äÕ†RÙhHX-Å‹y!Å6 ‡†¤rFíðrˆV2òËë—¡¤§Å©Ÿzö)3Ë¥G¿ÜjD›¿Ž:¦ 2õÙgÕ)>¤lFcòPR@öh]t/t¥z‘k;‰(ð:ˆ¾ü³Ø­ŽOÑæÌTo§laTad*Oê0Ð2[kS"+XE{µ?¬À|!O˜"¬.š0LÂè^Àã§^^~{xùÝïœ^LœZ¶ÿíKd(ûë)L>z*sâ×V«ÄlG¾¦ªÛ\m:}Õ(SŠsí¤+;Ò`E>1f1-`ξĂÀ*¡tU°‚?öL€¦¦$øWÅ!L‰ü$T’à)²åŒ ô&Œ S¤' 6CK¼ö>/î§Œ¦,©PÀì+Ñ"‹Ñ‰b,nÅ8…¤4³êæd&z¤9à e( ô€äYFûÍX¿öž‘‰<µÐ ,É"9F@:IÍkp¶Ù`]ÅùBj©Ò ' rq™ÖLÓqÐ@,N^ÏNÔóFë¾ø|”$D_tf`/K/;²Dž÷Û8ó*˜IB ³å2ÔA ‘D"/Q¼”Ã'ÿüI>šË«­EôV1ÀQXYÐ{IØP0õŒH´ˆJy±úrøëø÷·é¬®•ݶƈÒä3&Û£ŽëóO7Må·à›çåmW'íñ‡õoÄfWymí=‡‹ÚÞÆÑ7x߇ ½¡ Â5`ͨ}®N¸Ô-ð¶éd×6ƒ¼oлŸþ3)DîýflWÚoß#S‹ÌÇ£¼q—ü,:¯»Î¡{9ã5?â,!¿ÌôÌk¶õÔ{œòIÖs³åгPΤ•U€½ýÌu ½úRžIcÜ rr»*Î _«I·u€…³P1ÎÈá&yZQÑy·g(óqÁ³MÑŠì–½²ãAÌý;纘¬ ÿs.±Qd¡®›Ý=èË›_¿>ûK‘A›š2× ¾·ùöù©ž- ¸E¿®'º6õÈ»ëZãggAlžµ=®ô±TôF¹Œï9ˆ´9åv×%7§7Ë’¶÷óï¿"—õOíà‰x†3ïì3zzöoØÿz™ò!VòŽZÀNö¼B1¤»sKØÎ‰øÌsòF)‚Ûbƒ¸{a;GĬåFÝ@²{ÍÜÙÝwžÎ‡§§Å=­pG8þÑ ÜcÊZß÷±nãšÇg뼿ÇlK)z­é~¶j;ŠÚ3^àv³Þ‰ÇtÍóÑÚÙ™3{Å mVó.§ò=•Mí¨èÜ[@êaYa_kÿq =2itÜ4’ò¶tuQ\!wµ _6òát]I)Ý>û(ã¶(½Ý‰/ÛÍ6uVÛ¸ÑU¼ïÒb¼°‘ðÜ,j'ýY‹º†óo5…ëæ1<š†ÜƃZù줬§Í^Š¥ó(óîóïb\¶‰»XWùÂëeÜy <ÕÕáºú*ü³béž»¬µºÔ½#à t>†tß“æ57¥êEHá=rƒš?“ŸZ•¨¼8f]I×oØcï*ª]žÉÖç ÌÊÌ·±ã}wÒü.J Í"*stm¤Î1#uμpÃúÆáÇ¿ÿwÿvúrêSk§–™$¼–Rkws/,ÞOGMSôP-zï##C'äPKq—±Knœ5R3ÉæŒG0d…‰ŒÞköQDk§ª§ÌÒÆÑ[¶Œt·C©˜Zb‘Q222/¥fBI³êeäV9¸À$ˆ°”4'œ(D)ÃH³½‰šµõ‡>™—6õœ¤))ªgë!ȋӬõž-n‡‘™JA‘€|tó@ H³Íƒ„˜ÐsxY6}s”²ØD, ïâÙï0l ý¶Úo2SùêðÏÕ‰æ¡v|mS›zšûËoÆÞ"ƒý¤!Ó !;µÀÑJŠƒŽ‘Ö‰¤ í„\èC긴û™Ï.†&8¡|.nºHTH‰‘4SdbJý.ûçb˜PȲ‰)U¡'šÉÝZ(»*Íz‹’Ý¥Œ/nð˜=ÅÌçñ0š!­‘FSŠD-Ö2½Î0:«9¨Hõ€,ü!³Ó”T>œï·’>dp_¢x·Ïê¶üÈ›¯xûºoó} n@ ·‰èíš¾ŠpmÊ»ûIÛ,œWPî{, /d‹éÿg«‹ø 5€þˆ8mŠþ•€÷§÷úÈ<úi<@ù—÷„߈ù~]zêf¬?ù¡üuùóZ™o1¾û[øÞ§§çÈì».€;4©§6¹2Û®né÷˜¾¯ò>wœ7Ââ÷0t;îßÃXå?÷B½@%úØ(KÈs‚<çX¶<[åê¬ ›w/Ùºæ¿ÿÝ¿ø1uƒeæ4µZëpD˜³ JÜ ¥ÐwËìqR†¢g$ÈÁ˜dÐ)dÆ,_ÏY„p,®³„2#{öÑP ¤Ð4…2}™éÌ¡™‘®šÙº ž’¹y$ü—ÿßþ:eïì¡Ö¥Ö{ËÈŒNK‡a¨6¶SK5+5§N JÑÕPH$AQ²¹5¸ˆ†œ…ÂËù¡hæÈsg¿lé…b€±@{³tøµF忥ˆ]³['hN¢x±éÔK ²Œè"i@¶~š¡í˜af"¥º{=žNF½ʬ4a¡,ÖŠq 㙬ŽVÍ’!Äð´#N_ÑÛÕþ41« Ð­DöÖ2¢Ñaƒ¼1¢ÆXë¬q$ËRPýSd늃•H/ã¡D&¤´‡*ºYMû¢ÈÓ”©!å—vl@@Qæé•(ÎZêxüñÄRýðb0#à.¨êNZo-(=##ÂafYÝ-}±Éh¯]’Ñ}ö¥˜2—"L˜æ¤B,…ÔĮ찤››ÆžÉÆžP@À Èã+ÊaÑš^aX†™ÊPe¡¿"P‚^=4}ýñÈÖí”f8¿NÇ#à^ ãLjÈfh™òPv ˜R +Pˆ£Í²?p©A•©L)¤Òh%ó‚%&O$ØC½33 .$%t$À œœB!90€‘b¦dáJA=Í du«Ns¦øzŠ)òs±(”Y¦2K½W? näqRˆf‹O™Çì]*µÐªE—9k`-¦®HᥔÁíØã¤°ºTA§“ˆ…vcVὉìKó~—¼Í}‘ã_:Õr‡€vB&h(Hœ  3¸#Z.ªýs!Á|a $‚ ‘hŠ#…Œå°”ÖJ]J3¬9W#2h„™º™ƒFXÃoþZÃáðùÅhShúÃëËK-Ò$Á@Xk]òè½z;µÈ¤ÝÿÑ?þLJß~ÆÒ€©+¤»mðØ"‚Ä –Š¿åWþªpû†· *Ÿ‡{ú©å^î¼v¾—ßþá?gföç%:ÿ »Áš¾úaÀŸPºË-ÖÎk?Ú[ñݤ‘gÙÜî«Ü/Sm •çÎõ#AÞW3uiãù,gÈ^ß¼7^e‡ÎÕí´òFüGàN›½ñÝã?š+¿ëý«ÞÚ=xŸnF¬× §Í2~Ï”Õ7Îñ_ì ýØlúãc8<¿c—¸m.ÐG} ¿õÿL ŸŒÙOˆ\­ƒ¾·Îø™²¹~þ”Ù;/Bß°¡^ÿ×Âmé^ÛYøÇ>BõÓçüÖ¥òÖ¸Üë{ŸØÛ‚WÞoÓ7vœ?ųx'ayeH»ÃAÞ ï6aÈæ‰<ü­áMÔb+§Ç†Uú9fÞ› -lœç ˆ·Õ‡€ïëØºI9~FüŸ›´íÁ¥è#MOwŠ{º×›r³ë[&ùÎ%¿Ù+Éw-¸ûÀ…C©Îoبvyˆçþœ'B@[¦%."EgZÒº±l#ÝÌ%8›ÅÓtÛ ‡û¯ÿÕü?§_3B;M­õZНC)Ce1˜yµ:TeRŠHJá˜Ù{dZ))¥ÒáêA·ùë"²z)…ÓÔ efd¦IÕq"…’†º¬€¦@¼Î.±–Á¡ä©£§Ãa¨6”öešþÍ¿n-ÚñÈNáÓtlm2ë­7ŸŠPÀ0ç§Žn•‡:Ê2zÏÀRÈa0!ÍÎ{wÎŽÅ‹H7Í*á†RaŽl Úk¾øÖÎc8ç6$À\38;‘ÎŽd¶èê©iê9éÀ„’™¥.â ¥‰Ñ3»ev"33ëP„"2SÂÇRJÈckV ©ÁÉœSO#z¶¯_;]q´ÓÄZ=²G—•«øÉÜh™)1h(KaÎîÆ…rAhìVjq7+J3ÈÂè½OæCåÐó+(Ö†ñk{=µS(Ýë)›€R½e ç0VÐQôJVÇe(Þé,¥(R”2•šäÙ/Å@ftš5;XŠXB†d¤Ã("=Áàt™(DŸÍ#F©ÞF%œ2{)&¥IDHVAÁÀymëËfgÕ—@9  KÛ8‚în,^FôÌ©¥ù)&ôˆ8}4½6oE¤Œv ´ÞÂ]Sv›ÏV®Hf“ÁL2 a™ê)$ªåb_Pœ‹ Ø0‹d@¥1U;•èÊ“Äè†:Ó ¨K Ù•P¥ FÁ$‘²d„ŒöÉ7„ZfOQÝþqJ½†q0+@¤s( ék 3j‰TPéFH^<<[ »ƒâÔYh¥Ðá0YÑ×Ö_Ys®¶Ñ¶WèbPGïgD;ôBqvë=Ÿ‡—Îä9,ÊóE;(ã¢Öe¹”1/ç€×Å.{Öš¾@¹\ÌôÃÈ€Xl!3ð…âÀlµ³¬à€] ÍÜ$' ëAãoXkªúøÂaÍ?‡À—?üÁþuòƒ¹{LÐ[iš¾~9E> ^üŸü—ÿüó_ÿv{öž[¥\å¶Ò½ÊÄîµ—oÃ5îV7ê MÝwmr¿.ü¨¼ó“o¼°‘/çò²ó¿>Œ´Ÿ0¾pe¯Þ‰Ø|hD®ö¾ïDɵ•¹g(¼áRõ¨¼ð¨a|%¼ÿ«ÒÜéÁÇj‰¦ôí ÇßyÑù' SÏ2lí˜qß¾ ÜÑ»úéµQØäÎ2æík³â„ë¸U1»IýÌ;1åu±’ÓºŒôŠ«ýHÚç¼ ÿáƒ.ÿ²ùnÛ¢f2óyýñ.AÆ"SÅÛäŒÙo›©ô†úüR@ÖÎí$9sj¹)´‘¸rd®Ò^ÜßÚÎØõª¹Q¿Ø¦¶\‰èoåb.£®;± îbîç›»Hù_Ö‰—¯^•hÎĠ̀ëf‹?í‚êêW®=´c[Û[þæ9?ç”Zün¹T¼kÄ/æƒ[U0Þ\oö =Uо4ŠVÊ™jv³ìîZ(Ü4jçÉ]oîÞj}^…WPïæ8}\ð¼¬×ÀÏesçZk=QÖ&MZKŒáúÓÍÝ” µ?¸zËãöž®RÁ—Ÿ¯–õåû¯uªYDðÍÒW§ø½ó¼îþj0Iníú¸x+yª:ƒEëVÙM¬ò¬@þøŒ¼¬ñíŠYGkIºË.ösùÝ;_<ôóÔÝDÚò÷ ®í1´‡þ=âBÝœpÂÝDÞÞÒŽÞåÌÓõÙ‘ƒÚ…­× é[ÑÝmw“\¯'î„›+"'B„ÜrA÷Ö5*½ahÞDrÒ:(Üé¸SÉ¿èê^S·_X èßèïo>™ÓÝž7[Ÿ%P[íÖTä×ãQÃU³Ï}(>zÛ:ÁÒí1µRÛºŸNgÒ.µyl÷wÆ»I)겉]ÕvrÄ˹Lîgg;´zìiÔ=¯ñVÞm_èyç¬otÝ^°dGÜîxÁ=1ÖÛeï¼­\%iªR‰\kzžƒu» /rIçú¢Áúoÿ‡úŸ¾ûÔúÔ•iîJ)fÍÊP}¨"†¡H‡ÁhÇÖÔz23»"ÝF•2ÇÿéF÷¹ž`0 BÕhH¶ ’†â„˜™‘^…èÕèÒ±{-fȯ§×דÃÌxŠ6|PÊÿêÿS(õ8~ýêêìÙ§Ž £!á43OM-"Ì1–¡ŒÃÔÚëñ5”€ÜŠàm’Õ,n‡—Cï¯BÎæŸ˜rgðÃrü’3‚??Fg  „W@Ð#ŒÈä¢q¯„D8»`FB€ÌPB½·„qJïirî%·:÷ .×èé–;ÈÝþ*ʳ“¢ž£‘ÕÐó&ûØ";ë;X75Ü(Ø\F—Û¤õ·ÜxzÍåJˆ;³\©×ã)*õg%:5ÀµJïVÄ­4Žîoq…ž;Ðø…®dó·{ß×}W˜Ùáµ_…q¸¶7x*¢½Í}øh3ú^ÀM‘@—•½µ•%çö>.˜ž›âV¾Ãï­Áîa:+®jãÇ«.¸@•ú8€Oê‹8WHÞa•òÁRêu§åÛ"@7ØÉ}âŸ:àCêŸøIïÜØ‡ËüYßþ¼~všâF>8¿>ö•ü%Ÿæ-à§ËŸ‰ð¸nÿ(¹÷2>þPòL?°6ŸqÿXj@¾‹<Ëõš«YØà›"…Ÿà¹€Ï“Y¡ÝöDñïÈë&uÐÓþegÒób>ë¬õû·çå…où½oû€9A¥]\WÎ b^Âú;Ÿ°íÊÖ¯ójýwÿößÌo8þþk´È½5ià†×: UDåe I³Z#Ôû)"‘eëR:¨8N"2ÃÝmÌ=#£7dFªKˆîtïSiÍlnΠѦ¯Gƒ -¬˜Ì¦0;TŸæ¹¯¿ŸÌ¿ß%‹ð±»æweîü‰Ûß-iAþ’ÏigüÅ.ÿÖ}ǵêá²ÐŸÆàŸÈTæóxì§§ÚÇñý6"¼„§ß>tÖ7ÉÒ;÷Û mú±€âœ­ßr¤fFÖ^_ÆV=[@tÝMÿ pŽnüíÿ˜êÿzç›ÎE³ p¨q&¯µÀzv1jŠÓÐû)z^ºSK1åYl„׿bs€K pv˜C³ógC6Kï?Äâ ‹ñ/È€ÞaeQÞŸ%xÜ­·xÕ+wo-j…öcžbjux?FLQ‡œ»ó3£·œy©¥˜™2fëdñLë=O= S¨„ wˆ:¬dc!Ghp±Õ`3FX˜£2k€ù`Ã*` Ò†Þ8Ô± pT3¯–¾ ðôÖú)k©Ÿêp ›¼Gø0° ™æÃoG(2åµf":he7‡m.€©U‰lrsXÉ€vJ æžJ3=FcF…P*øPŒ4žÕ~$Ϫ˜ÚñÊŠC½T“ ‚;•”jk‚2 êˆ2 ;Œ0CŸ];c]s)å4³ó0¼¼ÄÉêa8Úôå8fÕQ9¥ûR¯Ç¬PÐÅ蚌&A9[øjÆk›’"'“ÈSjÊbð«l MáIœºZHb5µ&ÒCj™4:ÙS-TÀ·HüþµÓðƒsKÂŒ‰É"µ¸a“Cõ©“樧T º0õ…kÒP L¯Ô¤âjJHa‹³Â¨ÞÕ#+ÌÆÊ–:²T²*)™ô@t ØÂŠªJpæÖ8X`–¥´ºà³4$’ËßPGÎûÓ 3oJD†‚œ‹B&R@ Ìâd‰8¡ ËAQl)6(€rY昖R_&`åÌ?˜‰„ZG;‚/„ e„•CWáÔ½²üð›—¡˜¿„y’Ñaäp(3‘™n‚d´lM}ŠìÉêãËøþ¯ÿk7Ö´¼øîžOIÝÃÜ…’+ä{§ßø®€î|æÿ\Z”ô ýÑ´Û¸·žÆw§·Pû¦ûx“ú~›;×n@Aµ·÷=GÞMÇÆ EæÏ™ÿEçw¿‰gðRã`®É1kÊøO­ÉÒVxôÌ—ÙršÉûY¾?Ùn€en…{°‘ Ú*VqüýÄÝ«§é>«ÿ}¦X/Iåê°»1ú¢¨µù7®úÿ¼-#i5³fˇ]4'tx»NÀóc93ÃvÊ¢¼uð»LáNÄV¢Èæ3YgÛõ™m Åo¾m+ì±—yƒ _Vf"q…½óv ]wÞ0µ:]¹z÷|ù›â/Äíi /uyîÛ.e­ÕŽxÖ'-‘z°æ7Ÿ ì ¿Xò!7ƒ°ˆŸpÿ©Üƒ)Âs‰i^‘ ­'”pf‘I›Åz×Õz^÷º§Â­®ú*”Àõì–Þ‘Øk[NÚèR-„—‹žÕEè‰Ï-‰-ôÅ=¿+æ¢ü€»*·×·âÕ"n÷²U_ du×1rQêX‰Î_·‘GÏZw¿ WŒ›ØâRº¼½þ}…‰Èº¢n÷¡sÑs[w{ìu «ØSåzÖ[½•:£š·£µ'±sÞÒµsÒ_g­núš«mïă ®g„5qð]ÑÅüzßàƒ`çFrí^tn5¯¹·vâuï Ïó†¼ÖÒ:˜Ö¨ñ–ͽ{eÙìˆäCòý|ÜÛŒwew‰Òwb8ÜŽàÕ‘+¹”Wnð­:ìR½Ö%ÂÚssÒ¾æÉyw凈¼%ÈáF£f%)ÆëÍnæÿE»½œoG·p¹n|v"«-ôÿ¤ÈñAÜ™ûaâ~*½s(ÞèÔ_#ƒY®j–‰YÍ­dçV±ÒŠ­æn’˧oñhÕÞ³Kýå#ÂÂåNu‘¢ZDrÄó¹DÞkÏ]'×¹¥.s `om‚×;9Bø÷ÿÓ¿ÿîøãטz´-"g®6­V/Îâ ØP)ž§Ž”¥J ¨£ÒÍúñôzjÅ@7#¡RNL‘@‹LY­£1K15å$PDA‡bq$kÇ@Dm„Œ=‘ü4–<µH%Sb¶æÕËàÓëÔzSŸ”§éëWL'Oe¶ŒFj(5tãó‡”~ü]&Ò¬ÛÃX†Âsø”¯¯Ý§R¼DNfay²êƒz´T: Ìê¥TïÑ2s½ÐÄÙº舎  €¦Lœ[—¸¥qÞ]‘K“2-¦¹ƒØÜ ؽ""2rÆ¡–S›^'4¨LÖR-S0$™ãXÜ0µ¸¥œŽ'%¼X·Þ2ÏZ²‘"3pöâ͆2Éi‡Œ)H0Üz'ؘܼ*b1˜Â8»$Q’ðc?yWMÈ*š{),mxqá¤è!CñCa)1þv<} Ì3/FÂhsN=¥‹¤•¢§Í¶¨IÊi)#H]z7ZfdŠn€¯VF–“ÇØNQ?óOÝ+ij"¬JFKÕÁMvjÝ,Ý¢H±wz¥`„ú+B("úJ4 SyAeoèÐø¢á…ñê½÷éwÇz †áå@"³Ælùµ·šBËLeÆI}:Å'7£÷¾h2MRÝØ"™ »2¥BÀI"fì]€Uó¾F¯¤œ£‰¡àU9‹³55嬊ïd:(T \(¤™)€ÅÕ)cHÇSê7Îúq¦Z$„$ŠÙH…DjA4¼f× Ám¶».4•`É—¡ žÌ ‰”0š¥2S 6‰:YU糓&/g g[”ýÝ=û¢ÑÔ'ôh¨#¬ ca´l~s  Á°Š2 'ô >"N€À„ó„àȾ0 2a³«Ç™Ð㎘ÕrqGô Wÿð¹!jH€D©( õ¯þžµlðŒl€•hÿÁ߸[ÖA‘ShúÚÆ±š¦)DÅ ÛÔ¢eŸš^K}ÿËÿÇÿ]gxE÷Q¯ÚÊ™u€~‹8.GÒVb1¢¹—xáZÿjØs’YAOü–^¥=ã×õaGòAYb…~‚†ÞÇ!WÝçk:žW’Ý$Ú•¾•¾ËÜNwA ߨ«Hó+Kö¦Eÿ.¸½ÂxÏÕ¹2Ÿ3Üu½®¦Ü¦ÁveJzeôrÝ´ªuÞ¹(|®ƒÂÕŸ_Üi®ß=P]ë_ï‚ ÿ|Dç—´’Q]ߪ½‚h÷ Ö¶Çù!eü¢3¦-dw¶d¸ —ÝX‚­ý îÓåûÇ“‚Є,tŸ,>alpüwð’¿À[ñŸÕ\<¯jÛ¨úðA îlÔkä,°xý0½³Míýß)±<‘?ß….GØ `ìYPà{¼Ë oõÌß=>Wûc¾cÙâ@WëãšßІö}õî¾ßµäÙƒÛ+0¼çsŸ´Öˆ¬v_Îü¾'vw§ü…Æê§)@¿G;c£}ö‘’ö[£ËŸì6ÞõΟh0¾&£ïú¨ŸÎÇüÏúu‡ˆýl#úÓþú]uç§ù,>Þš÷z2UGšíŸÔ–­6yÀý†Ê]g¬[…Í]À=v¿•'Ü„¡wf¥!ß=#ß>¼>:¶ ]‰f¶N[1±¿Hvû´ôèÿÆ•ù„Süô »8þO¥àÄoÜ¿Ôw|ÖmÒI®AÒæÐý¢.+3àZ=^y8p…XKüŸÿç?¿éôãkDdì="´ä7ż”RÝŠãhî)"fŒU’µÎãI‘=¢@=#̬ÔRÆ—Ì>E`JM(•…î$MžYÝB +­õÞÃM",¡¹©(ÕSJ7„Ð=Ôa™ÓïþP_êÀSÖâtl¯Ç<}ÉvB‰(¥Ô&YI03q<£Ã_²Èt·a4x ¡7™ÙËa_*#òˆM Žcñ@­¥÷^ª·R‚P‚@ž­Òú+|„˜`€L C7¸#;ú[ 4Ìç¼ÁØ¥€™³í@)ÞN=3Ïpa´Þ£_[\æñÍTëMJ2P5)¥L³b6Ôža:u8p³ânÖ»HçŽ}R$ÇOV PR¨Ÿ>™¿d2¾GY aS°”1…×ÄXKáXÌZ›ˆê„7d¦DhÀ)¬ŒÓôµ'HøPÌŠ[Ël­õt÷ê ’®ŒIf&ˆbQi€2¤Dš|&¤»±xöŒS7¯0SB­zqÂéŸG£ Ÿäxù­àEÑK2›”{öÙŽÁkutw3=OÇ 5M&Ôè*)ƒ€ÄŒ/ ˜N`2;ÊDÍ›ÕOùå¤é ŒÓir£Ú‘áN¡26ç0”Ê õÈ ùRdu¶H—>ƒ k!Hæp³©wNe§¦@r Mˆ¹•$$­e:%â‹;€ctLã)U€—j™YÌŽã8te¦:’­«h‘‘) c-C…;¥k?Óõø?÷ ^}€îš–î1Ê•QÂ÷EÀ?)àÎØé;Љ"Úñ/à-€ÀïŒ~Âçô mÖ[ÌŽ»x!Ÿ³3wÑÀ_øõ>À¦ËlÇüáÛð†?[Ñù]t‹[ç¬'ó‘‹SÁ71~Y)Óy;\5]ÿ)¾ w¾WéàØ¿³J»æò›Ôñ\¯Õ¶Íì¦úÝi‡q“‹òŒfqåVðá‰ÊK=ïzçï¡øné±?µeô‹ ×·OþtÏG?ëüÏ`wQ~ÜïüŸ{šþy½ô€Gðëë瀯í Voû%ÖíÏ1ÕôH“«ƒïß þóÁû×û¿ˆÜ±Øú@¶³›ê=vþSÜb¶vÀ—ÿ¹½Úo%Þê]ºGù‘‘ïOiáÀŸþ†ß“ðlü÷@›©¹î†‘"”yÎZíª )ˆÒf¥ùÿù?ü¯§/Çì={FŒXê)VœÅ½÷â]‚±”’Tö˜~|íõ0–Ãèu8e@9·ö+B§S?õåk9 +ܵ(%$¢õ8¬™ÊžÓDbTʧP挠õQ…eîín&¤JÊÜóÇ/Pª ªÇôåëôåKN¯íëWää­e Y‘$7£Ò+Pæ¬KdV+b –©æ&«Š 2­>Ñušº9M™Ó”bÒÀ„ˆ Ì¢ôP`0Cx `€D¼.íÀ™WÅð¬I‚EZdž`6ÿ»@H=ú\-(Žx›zïqU›˜y È™/mãPNSWÏžRϘ]UKÍ0©SF–b9©·4B!ÁÍJ¶ö,õ7?pX ½:Æ„Ç,¼RÝü“«+‰ú2ÕK¥ŒDaæu@¤X„„UAn>ºGk&  tó“ÂÁN…ÒÜÇR)IV­˜$¤³ЧÑ22Z(Dšƒ¹€hšRpËL„*Ò¼Öú©p¨½¢—ÑÁÌLÊ(ÅYœó•½#p¶‘0´Ø`æ†zÀøy5qõs¿lâtVÙï¾{zñbCö¼cz~èNþâDç¿kZ¯H?ÅÈnvE¥àJaùZšXæ=R¸fÀœ‹+@ŒëZ*?0ÆÛÄde˜·nÅ¿IdôH˜áþe%rt}*IéêN~‘øßPãÅ3ß=gCªL£ã¶]7Œ2¼ˆâ\»Ï¨\Ëöænœ*6å"ÙÚý¦‹´ oUÖ­ë»’ÑØâŸ+ Üu5G¸—,ÒõáH¸h'sõ»ä¦µùûùŠ¹íª¾¨2]~g%Ó²*l˜ zTDÕu/¸<º:ÿíô.®¶nîÅ\æºÎWûÈææ^tær#¸Êªl×Û¦o”ôÕ+žWÖNÇäÊó÷Ün5Ä«\ÜFÀƒ×qÇ•ì(psÚ‹ožÚCÝudê=û*îTkAœ«žÄ|½ë)¦»ÎN®(=·[áÆâçΕwí5+ŠØU¹á¥‘ëCØ5LÚ¨¡] ã¹îÙÝŠír´sê®E¥6|«6E܆8÷*Q÷Ç»vV‚nOñ=Y«u‡îê{¸Þž÷×ó±Ö–ÁÝ-j}ÍŠ¼­ÉãQ ´>޵½ÛÇÞ=ᮤµ˜ÑýÎpÃè.ÊáîrØ>‘ 1m½Òt£ u¹µófˆ •õÚá̹¤'A ßš†ûQ!ï7ƒõvOÞÖ;móƒµ-Z­Ë²n-Ѫ¯›w¤bîµV]xgWú'7ùw]í/ T×6 ®†çúöCöÝ® Ý´ó¯­®jB¼ºîÇ‘[Žçê4yú`÷£º=Ìšwf»$u½UÑsøž«2C3kj÷J|F7³ˆÜÓ¼»­4V^6¯:6«sä–)y·ë¼”i õ¬ƒ¹{"ÜË tŸÅvVi%º+‡Š †Lö0‘ú¬Èßc*Q"1Ôê¥&@³wðhÌ"ØsçyÐŒS‹L”RA“r09?%R9s$20÷*ÎbWÖ#z&eAm’W(5~®VŠ»³8­@Ç!¢ÐTmFËSš¤äƒ\ÑXô“…yµéÔ ‘9ed¢ îÙ Tï2ƒf7Ýã´ãˆjl)KF°#k1k‚˜…Ã'Z¡SëJFO7U fë¯1M³ /3ã J ’­P¤9*-=Ê0%Ќ̑!–¨’-Dª‚f&ñE%+YÌ(D›µƒXܘ‰TŸÃ¨t3ÆY±Q gÔÀ,2rÑ·Q9{Ø:0ʃ@—:²€å…'eKµ”§ò „ªñ¥0JÎ&‹†>œ/Â22,f   +Ԣݟ4×Òf~sØŒ³P`‚Å" 4‹q^zR8þe€^!ŽÀ,Ð?¯Ù¾€ [Â'#P.½$ â¯@&ƒXA¢{ðóÙ‰RÑ;2rÆUXU?Ï"–QŒ¯ÃgsG©Ãßü=wvó#\­{ô:ºÑJíNÊ:¼7À¢M-§‘³×?û¿ý_͈”|Ð.AÑ!X £s € èIÁxUѽҌϽ9ÏØ¹Xßw@ß 0îë+‰Î‹ŽôOn8°U2Ü ÞˆKHÄ Šp>roÊÅÂïjõyúعÁˆß »®eV/rQÄM ÿ°< K¾€kdþ¼y%ó"Ì=¨k‡¼ÌU¼Ãvµz7éÜF¥þŠêOÿs^òФïåpôúçy‰¼£†#ó[­ù[IWÜú˜ß¤0ç~™çvÄÜ(ÈjU0¹G¶Ób-ü¼Ÿé½VyÜç±]¹ˆæœq'-!çõwε]»•fº~z¦2gÉ˹§è,ª›«‚±ÞÆ-u›^¯ieW€v«QÛñX©›¾eúÌ÷î–°ê 噼•ÖÅ•·ê|Üvr=b¼¥æsFò_¿Û[Düög|¼Ì¾©aûBqÚ/ô¡#¯\¨›Ü|‹ë—úÎÛÖ7U<Iß_^a¹‡XäûGøÍàé¦9dwóCSå'b~±‡ÕEH¢è;b´Ë®¶²óØ¢Û»Ëbƒp¾ƒ4 {ÜœßwÍî”'¿é‹?ôåW¥ÀݘŽx ×½ûþɦ淽åã×|`nò=€߯À·Â¢üð“áóî1@·.Ú `éYEàþÚéÿ<‰à߬þ“`Ýõ?BÒÙv?B}ç¶ ‡ñÈhøîyþÜ à>ŒþNi¦U=àç:·×£°q>Zå²sÿÍÌÌ€³*2C9˜".* ˆŒüŸþ—ÿEPuë¡þãk?úf4÷PšÍè&’Æ2 9[ ºùÔšRµ2"°'éžÑc‚¹g›:ÄtD†TÜ|MÇWÅIh‘VfÅm ÷ìýˆ«0ÃðV§×¯ÈŽaÜiÎÈîÅ"’,Ñ2&‘Q CŒœdðâê^«[ïÑ€|„„8‚9Ã_È€béžÿ&:òl°À~n>”9¬œMG5c‚óȰh©>Y¢»b:ƒf0BÇY¼Â @ZiBöœZOë¦a"JïáƒÚWÆä™™J(™„ éœ;îéCýÍo€ZƱw©·L-Û * ­dÖ‰ˆ¼”R!ƒ!e’@•抨ɧ$dŧÈhÊ™ ÁbPADŠ@­¦PJ3ÄÙïPˆtAf3+À"SA—25áæÙOY_ÆñÓA3¶@7gºÛÔH±À‘’2S!’u¨)͉àÈÞNbÀ«‘ÅÕz“SæM•ˆWæ‘™„É©>ãȦlÈ"–LË0 j"shìÝ ±p|9žªZo©ä¬ùc‰™ƒ0[ÑšdÆêH!'{fKY1ÐN™“²ÈZÏ)³š<µþcË8;èÙ12nü«¡dªÌ‡ƒYf~*Öc–Bš;ýÕ#-q(F£ ìô³M‰”F÷3é$9V!"3DXú'•À(Uöa©<åàYŠ\†„”‘9²[ÏcÄKñ ƒKê<”IH2(5óo0;—Á*r®¢Ù¢Õ£YtkZâИ¥l©XKä vnPKAˆÅËw–š?Ç@K´ Z^+ÎvîÜ ™Žc ‡X\¼€™HC¦‰ÕQ9!ÉPÒ1ïÆ(ÊÒýPǬ¶SÇç‘ÅRB†NíË©~ød5ú©wÉ«÷žÇדED¤„RË?þ§ÿlöo<·½œq2Ñ– ðzu´Òßc\!͵áÏ(ç®Ì ÆëqßÀÚ†ó <¾¯ÿó¬Èñ}YÚ2á[Ù;EÌo»kZÞ²]dWró݉ûGoÿ# €³RÊêÒ Þ´ý…‹Îßð÷njºÏ¡ÞŸJ¯]‚ï)}'ó}[Íð'Æë) ƒçÝz·'n“ßÏ%€ï^~ï#¥ýúúùä¯B*¿¾~}ýúzOºñ—ºWèg͇>–³ü2ƒþS\Í£°õ§Ô™ùÙ 3¬¸TII·þÎ/ð='ê¿3+ó–÷€sŸŽ-Ý:Xú»fí‹XçùRöq<#¢º :ýáõõxòD´H¨ÔJwJã˨™dœÑ-ž!"™AZ­%2#UÇ¡÷p¤l éŠä4Å©y-þé¥#Ôº¢€V3öè?þC!Ù»EªŸZ{mVÍŠ ?¾þ^I¤e]`âø/ÿ»Yäñø½I‘=ÜhDk™B)D‹ÄÈ@B€Y«GHÂ$¼š£LÇÈ”2Ç©¸ CÉ’íD7:*«C’‡&•±ˆ!õáàékš™”Jô ê3,x†õqígµ`3p.?8²#ûÒY¬¹*@(ÁË‚6.Ö +CÞzÏœf0„6a ÉX* óÔ±b^Jï]‚;$´™S*„ékvL ÄÑ•|ƨª|5«ƒ Y†A©è=e¬¦Ì$ÀÁ, IåŒeOÂéÔ Â×ã”yiù嬿ÒiµËÈÅun–Õ¡˜Y.ÍŠ§³6[[±…$3EF&ebŒfÕpL ¨0TF IJr¾ìR(ntºtŠ4¡:š— É’pgq89WgR4ÃP1,Ýl¾dŒ/f¯óຉ…'O44Ê“¡ ¥Ø`e S)‚ÒR6È=SAÒÕ¥¯Ê횆”,\žD6¤cAC™Á÷<3˜ 8Šƒ¶(óÈМˆ˜k"@ÂÔ%®Ù3ú?OE§Q,f,^@lÈXÖêÐlVÜÌÉ e‘­Š $Ê ”È5xA&JëÌÛ`rJ¦c-¥ÔZêK¥W|ú-zûdðhéÑK&r&Ôu¨ÿù?ù'¿ùûÅYnìÖ'p¥pa Sz Ã|Aþyý]Ó-å•m÷sÚÁú?]Ü•æüŸEþó™ú4¬ä/>7Dç¿-ú9Bt­(7Ø8þmœ[—ÿì¶im»ý×Þ ç¥3þúÛï•T½íHÓþÌm;³V#7_V®·¹ôÐKk;j]góEÔëâ*­„o±ó{mãú¡]‘«Ü†ÖL¤Ï<4†ÈÍ_«Vh;Ìw¾ßï.nå´xqÞ÷ãß+ßm~›6„Mÿ«pá,ñB¼ØŠ<ìmMëö•C±¶* ·-oGð;‰”+kÿ‘ß²ÖW½&½³÷ºØôpm®zVd=Ü ï¯òÂç#¸¢ä\•¸*Eí`~¸ÓyHí¿“ÜÑ…^¯Rç3¼ñ²ó¬[vâ‚À›é—¸óY<ãšýµÿ$žË÷ë~šèV²€›yw§twtqó±W —½þ_>½ v›VsûSþj¹‡­’Y]|84ï.Zß ¤:†k{êÜ?(ÝmÏ4Bx{µjÞõ´Þ*í„»®^ë‘ 1”tÝóoŸÓÊuæ²k`óµºÇ›ÔdéJºý•2Ú@kNóCU¯5óî‘ÈêýZ]«ö¶}ÜX·¸ÓCñ3죟×sA|ß,¹}w€]ZÀ–·ÇÃØÿ_ÝÞ£Þ˜èÚ×»¶¯ì=–{xÆî6ò¯‡~ý[\‘qyç¬u÷ù×áò-Û»]—‰w¼®§÷¶±Hº\óö:îoäI `ËæF(p¯ÝM[b8n;*a›Q~t1ĔޘüO>ê}%!®Š'Úß™0¾Çv–[Âìªy{vtZ°„ÄžT~ùú—ßAfo¡ˆèaîæt/^܇B`8Œ=Z‚æ®Tq£ÙÔÛ¬[)š^J5d¼žbšØZdÖq„Ö½@Ra1õÓÔ`õ0€ˆ/_«™›Å…ª¡žî?-1õÈi"ëôãÑ_e0/õëñtüÿý÷”N`áì<гŸ0}Et¥ žfgWÞLÒf®ò2 »¨‡ F¸ÁôìŒR‹N½Q´â g³ÞeòhÁ ¡‹Drx!KT³è™iîèHA~žèg„œñýŽ&¸ÁüÌÆ0ÀgÅ~¤Á ^ ÁÎÒäçò—03{œfä®óÌ«zþLÎÂA)h–#·³> ™Ñ;…RêÔÚlW©¼ =- LVj)өìEïn„Ù5Z<8G÷‰Y¸'‘9›w“[Wš±¨4¤)ƒ„ÄŒe³H³ 3¹RÅ-zÖq¡2eŽ®½ó 7sÏ„"z)©ÄÁûšÐ Ţ᳃FEœz›&tŒD¶@áiîå0«ëO¥+òD˜ÊAÑ1ýÈìp€èˆ”:Å$’-qŠ ¨Îi™r‚u È»餋+"謰ž*4 ‘è‚ÊÌÑñ¦ŒŠó«³ó¶‰f&½¤ä)ó:˜ýUµþ6rÊ,F3LÍñ%úà™ s-#õÙ©ÜZ©µ&A¨ZfDt4ˆBI§%Дæ„1ˆ†4œ-Òø|ñ1½È1zxA€•VM½õ©•ÊÊÒ ¸ê ¦cª/±z–…–+JE6D€ü æý0`s§ÿìKhqx)Ñ9½v÷\6„‹JÌE†À}±çÍEŠsyÏ^à£û8–Ãh¥¼þþ %÷œ(ˆŸ²!Z ufJÔ˜6,CFÊ;ÙO'M' À2+#39‘F©¨þ–‡±8ƱúçÏþòC¶)†4`(Ÿ+–ÃÈÓI­Gë˱‘]‰Œñ÷ÿæïÿõ?øû¿ýÿf.?ËIWÚsºV’/‘ðU±‘ëðf•ß`y+íÄ«Æë&]¾9=õLnàcXçm°ÂM—7¯Ú†¼.ºÏºM]¸’‹]ÞÖSi's_I)^ë'|>¿‡<úVH³ö÷\åw—K¼mZ߀¤Od7Â+{¬õ:kêp-›³ îÞ.ÎlIº8‹3_'Ãy&-âۼȯ¤®ÓGOÝdõÚÌÛG׆³ ÙÆ«œújþEˆÎ¿=¯ën=Óï¶ñ³ž_3®sìÙŠ˜e0çÍi­¾.lžßJôç"¡tÅ&ußÈ´èª.¶IYï}“¹}ˆïb,m÷_>Ö£x³|RÖ²ë\ŨçÞžuoÑUˆëºf„ë–œu‚øžöê'¬i^ÑÚ[AlÞ Ïñ´[ ò·h^;WpL÷0Ü“ÏØÎƒ½]Û¢ù{$0¸Ó<¾Ç[qqܺî°Ñ7ïç£5MrÿÏ·èãêórLòJ~gz|[3áói³Õ3Ðó× ñv½ép3Ãvþ–OªTWÙ®âþ†¨'U7¯á]@ñ®É´­™ «ë+Ò7LN¼9ÿ¥­éOæ÷=*îCá;Å&Ýíezó‰k7ÔÃø]ü®2é·<óÝ?Õo7iîÕ~îXëDîÐY¾S‚í›:=KòécÖ›ëôQñÑÔU™ýšî]<_ó{Ú]È s—ðþF¥-]vx½Yoþ 9^ï¬å¬â­MàõHûgwÖ)OhÔo^Æ7Ps7ÁÊ6i_WGVU}jðz]hœÜtcð60ùø‚z4(ï¬sVÃÝÏ;‚š› |µdô®m¿Óm4¿¡Q§d..*ò\ìÎéïüw3Š"†"æÔü"áë↑õÞzoq~Œî^ÇQÎ:„[¦Effœ" ¡”‘îÞ{@jÓ±‡¤ìrï©ãd‘~ñÃçøúš_¿¢DóaPïÌ(cµâa '3ZpîÀe€LI=å™úýïówŠè§)ú±C¶t#;<ÕúIý5Ú1HÒéL©µÉŒ&3Ê^ªÜÐ$ÀÎ3Ñ`ȬgD_ZÀkµ~ÌÎŒÌÞƒ@­E"YÍ„ ÒL)˜ea`νö󼈜¿aióÀ ¡\äDÎfRȯçæ}CÄF¼W 3ÌMÙŠóniר~¶¦A„¿Àí"耯"KA™²·Y8¨–âÅÚÔ—¦rA3À¶„an0OeTýTD°4Ñ[WÊÌ诓€ ÈàµäI+>õvzÅЀ˜Ô:Í Ø0 èLsÀœ°:0SSOå"\ê )C^-¡œ:‰â5IpvûuN& &ÊHj©UÅMðRY‹B öç¦Ù8cš¢MVcùäfÌhj§ôì§n& “)KôÌéq‚%N=NM)XªºÌDÒ gĹ f‡:"PÜê$%}1a44ÿ>ÏŒ=!b IQ–Èž"Xœ¼ƒ€™˜Àb9營ÐPMR  eHÆÑ¨ —ñ ȾF‚(ÎÙr¡)ôˆÏ;)¨Gv)ç„-³Fg²|’تT4n¢€˜IœÑÌ?ïL8?}ª–ìJ),–Ìâ~(FÏ׌4Š>Ž¥ tYTzû_O&Y…`6ÓÐÀ&è QÙ.êÿ)Ø+ÈYŽ?auÁø§))‡ä¼HÏÆóP+ $Å!ÂIs³âð «6¾„-aIž´Cñbî§¿zV«žy4‚åáÓéXŠË½ñ‚²Ó0¡ÇYOšÒ"ÛX_Æq¬ÕÿÉzúñõøå5Çâ¥L9ü`ÃË¡v´b¯_Ó^²Ö1{WªÔbÅþÞüýöþ}.öÄ·è5±1¾„eÚ†]kpøÒä0«©MeüVˆO‚4®p'þ¤áöžøÌ*Y9P=àvâ„o ó…]_Å5†ù}IÕ›ïø}úÔ¸6{ÞëZãÄäe}߇àICÔ’¾€NsEa¡j0’F‡;á^†*À½ÌºyÙOP¡¼|‚ ¡0”™b²0Ña•å@¡OS­…%ûô5"2AVÐOƹµ2ÙUzC-††8†ýƇÿüŸã(ñðùÓ4µî>Œ"5e0õ=”¡2"{'àC^†ÿý?ÿ?•ZÍÜÜn±A>qlÜ ml‰î!ÚÌ‹óÌß±3– Œ`ö¶üõõëë/#EH´Ùó§):ÿö“rëž ~G ½¶'™O3ëz-ñ^*?´n?Þ– ®l˜Uyg«1³篺ÀÖ~l²Hݽð´¬`PäŇ\›æã “çVãèBõYû}àZƒ’n·‘á¾à¼ä›O»aÒàª"]‹x»­¹¯ëö"oçÐY»g6¸_IG<ð}çíõoT¹æ)‰+é‹Ç¹½ÙëmÞZ6? -ld¿É·ö¦t}¶`Ö®[òCßíu^³\í6š?¶+Y·õòÙ@òí›îEùþ‡óH,ç²ßðãÒ1>ñ}óöý?Ü»nö¼óŸyk—Ê'Oá[[¾õÓÞ `ì¹›ùZmõ7d½9òÔÍ‘õ½Ç¬ôìé>x¨»¼†á-î’×1»îþ³,0Ÿ~½V¿Ú/ŒæÛŽ|ý»ó–zžÜ™ˆïµÅZKx±æ«^šv+µOÙ~ã7­"÷²(û;ý•ŒðÐ \ûööox—½yÙû¶nÿæ‘uÕÆ%o£ósótçÊÅ÷lû÷Qàîo~C"þ„ñ}¤®ÂÃGGôù¼»“­[k»ý,éÐ*Žß£ë#užlÒ;ßýŽÿ®ÃP«ÂÍ:¹jhÞÓ½gàÔ=þЯ?~í¯S;µÖ»4ŠÃ­Ô"š¹D1Ðç ÔIIÓÔ¤Jé§éW/LÝBaN±XÊNSN¯:–Ã7µV/,Ä4ù4ÍQzËSV ÜZ¢OÁL;|,Ó—×L È dôÞ³§‰iR›¦Ö²'iÕ€²—2Ð( )-{À,)¹-ÔfÈEœvD‡ Z Ö$a´T~ýPÒ,ÍèîÃhÅ|¬Ž%e=OÓ)HŒ£ê¡·4tšõ0¡r’2šif=/)לÞzYš¿KEæ¢ê>{ùF‡Ì \…Ë•‹1+ç¿'Ê à¨)ä ©Y¥iiâ–@ôsgWZdO±Ï³Î…a0‡,V’Ä\Hƒ5Z¨fëV!D?M™×”bŠÌ©T«•.SpÕÔ{ïéôˆèS„ ŠÛhPR²R]"f¥)IS.°oÎ&¯!†"2Õ3š•c©³eî0ìf¡ÃÍÝ£‰•¥Ú ò›u%˜Ó²eB™=ØÍ«Íúõ°@´~j>¸›[eNA…JLiùšè郲Gg þ:60†OÌ#újB„””©u´‰%ÒiJ%œVÄ€ÍîeKW¡õÈј‰ˆ¬$M!|•2Ô¤Œlž_JÉ3¯@Ë<¡3 ÜÂ脦L 8@0Ŭ!$29ÌìµE!ƒHàØƒÒæN72AØ‹Ã=ël4’ÈT£›µTdzïb’½×dZ¤¼av÷M¦(%A†¬îc1Ci(Õ-¡4¡)«ƒ›gtõ)4Y”ÈÞÝAËZI“B &KÌ",½ŽŠy¹¨;(¥`©TH]"X–õE‡˜ÈV؈lèh´ê¬¥”æfNw1Á:5»Z <&àR>QŸ ©eŠ&Ši£A½·€n]…=É3º^ŠS†pȆO®fÅ­þgÿ ¡©õSИÃËa8ŒÃPbê!8$Šs<á–-¢”R†òÿÙ?õZhöÌiv£zsmî½IMxýY¹¯l$u±½#7æª/Ÿß˜>þ.®Cù]tOXÑ€±±øyÀTÞ§yÜÿ¶u0&íé¿Ã¾õ»qåš¹óe|ï¿+Ò=øF”®®níHˆrƒÎ¾+}Ó6·Æ#núJ7÷¢–²Æ}×HÉ_ˆèü¥µ_1b-¡µž wÿõ^)b㪕ûmëko„/³ƒ¤f]ȳÇñ|¿--à™æ²Pn×Z,µ_žebOë_¨÷Rµ›ûÒF.ø&‹“TzÈÐ;{e‘V¦Û\¼uæHQÿ…$°Ðy~·[§vÖ·îa³•ó7{"¯¤³3§v¾æ‹`ÁÝ7jƒÔ¯óÍ]À…÷Ú;z[¬Ã½ÝŸða nÚüŒ¹qÔÝ›wzžômlUÇßÕ'Á}aÇ^í§?”á£Xñmä}'ßÞÌZ¬ô™ÀëmwÛ“,Tk­Åm‚ÌYm};Èë\i>¶¹š9«’Ø%/ø :Â÷>X75nÅfGP]:ÐΟ¡Ç¢Onêæ§6À-®#½·Êô ÇTǾMè½ €·>§<&¥¯ÀèÛÀþÛg'nZýõMÉêÏõzÔWûgþâßiSùo…Ó~}ýé,¼__¿Žø÷ßͯëûOô¤ø®"ÈãÕ½çï÷ ¿x‹ðË=fþ)!ë¾9EÙ7.øõõÇ\ Ô£½})€S’Rs¿é¬òÅïþöwnöúåµO­MýtláF3c±——n2«C¥±5µ(3k½»/Òž‘Ù3•"á³v„D {ovX̦Þót¾ž’lnu(æEóZ©Ï&P†é‹ÕK…"ÝŽÿþef1k_'º¥fu„䔢Etu)‚ilq9ˆÙD–º›Yö‚RÎYå,eš×úâ\”Ð4ÁÑTO‘(2tæà ªÃM¢N­Sz)#˜ÍS0çØ'Åt’hîsÝ¥À’6B™îFsD[D{ÊY‡u–ñ™ z_ðw7иŸ†˜Á*$öÐ\ àìô›ˆ„Á8¶2Žì DõÓ`…mjè—æèìyJ¡Žä¹0°Øš‰ÃÒ¯í^QJbȘ†—O,.™½Oj}¾qEM™}ŠânCÜe~:M§¯S¤ÒÂ`> %#cꣻ»”9Ãz6o•æE™ ‘¦„2CqwÏ¥J©³»2ûÔçr64Ë3A¦h>Ò>Ó)™9‘%Ã8·yËܳ¯€;Mh]•…†ÞgÛÀj6†ãëÌ`-ÙD™WCzt¤ ;²);úÄlˆá¡ Z×Ôè‰Bö@oÉC1%zÃi©è¨Â”F$RiÔ`ÒŒ"º@å)%‘ÒP¬“G©eÎâ_R°Ë2vb¨L¡51`ˆJ7 „×/n³ BθWJ@NSöÌ—â r³2ËQ%"5¾°;2a0c1*¬K¤fQy‹‚)¢—¬t#ŽÈÉR+XÕ¼ ¥:K w@™êÄ:V3ËŠV ëif"º¢ÖR|Tœ@Wžƒs$2YLŠìQ jU$"À0¥ø oø(3˜!ÉK‘‰ ÜQË‚øçÌLw8ƒC Â(s–’˜Ô&0,,#éÅ]çÍ)#B0 FR[L²T&¸{ªÁm,§fè>ŒCýWù›ÿ]‹œî>MÓc—êIže„hgRÙ¹{Wëy^XWúÖ<šË"ÓÒàtÖËü™Š÷ ñ¶gkÓ_yîÝ{`}­ŽïøÐðüàs\ç¹Jw{œùhí÷÷¶ê»ðKݵ’ß·Çî~Þ=NÕ–›¹pGKÓÇĆäÄ÷ÌQ==Œ¤{Æ€~:ÔnÓ¡?Ò»hwß~Eºª™|#$¹&šñÒC¹ n7Š?ø©©4ñ!Gä13áŽðtÞº¯óC³«AxÏöúÖX+M­™¶;ï/ö»µŒ~îòù1…[FÊCùóF³îÒÓ Ãç?Zw_´!Œ.½*Ú^ÛŒ¶rEÜìÐÚ7¬†ÿhòiEæ8Ÿd ÏÉxŸÌ˶A{çÖ7vv›Sq>^™ϵܾ¥‹aßí®¹l¶‚œÑ3³YAz[x¯Zßî¸zýqRŽ»çÇóÏc¬¨Z:óÐ?°çþ‡ù¯³‡fؼ5eRjñb,î^ÊX¨µÊ˜Ò8–±ÖÞ'@Cñ¦˜¥½32"Jñy®FæÜ> °·ž9K¢ ôðLa­éeDdÿÝ¢zØaÔúÄÈ2òõä’ͽ°"óo_¤ÈlÊŒ05*Ôº2¦¯Ñbjh'D Nȼ˜§)‰ç·¹½ŸkŠ@°,âK³ÐâÚöJ-"²‰†rààn6wè+ØMÅUKUo,ÕMÞ^ÙØŒœFÊ‘ÖZï'e ˆ±z©µ·>µSfÒPî°bRfGÅÝWç2Àl4zñ X°H Š¡TŽË mÊé„á7ååe§“ Li±* „P Çßlba<(äøÛj}ê³ê\T0Cëðqæ‚eB•`Foþòƒ™ƒR©Ììí”Íݼ¸›Ñ£·©×RD:MŒP$˜)'ÍœͦŒìÝYçU7Û*f`@2šXæÎe‚ÙzôæV3€×24lÎ]ë<ÌfF̸|ñLÍêB2à˜ºäV@º[J)°GžÔOˆ¨Ãü×Ù'‡b(§¯¯Fg¥zBn&Œc;½&ͬXk½) Å™æ’ÐOŠ D¨¥ŒˆdæÊS š>Kx¤BqŠtP„…ÌU*Í- Þ1 Ç.%„èÂoAˆ…<¦R…*Æ@3˜K˜ËÝZjêé`2 Ÿ¹,¤ÛY‹Qø«j§†LU ™™;ªqr¥+¸(t% æ!{G:e*2£Yž YaÆh(æ2›¨ƒIuójµÖDF–±ú8ÌåL0¥ Ð|G³'ËHܳÏÁ¤PÆÌ”Ñ0tšz›ï&cî÷7…e˜dJªd24RD'´hddÇ\ 1 ÈÑXTªdòR Èì]0“A™Áé¬q~J–èfŒe'R©…]5Åë!#$K¹{õaˆ¨PõZSÜ^F #?¨‡ŠaDèåógœ¦Þ›R΄¬ƒ$‹ñÄ6_XDøÿñò×ÿèX)´Åb~8k;Üž6w£K·óU®a•º^}µvEZ7Ùnóæ;¦ ùÐ@ïÈRn´[÷X¶s+ó ®ëî|.þäèÿU¹õ¬TôÑ d¸½_úe/¬àJœb;r7š"\§'ïB¿7²éz®rñ@ìà̘'pcðû^r›è–ËË703]½˜.šëk†ëÆÛù/DtþÝqó LÆÛ9¥÷x#‡õ„Û½½Ù-Ãc~žçmç†a³ÍVØPLÎKx«ìr+Öód8îÙØîþÄufk‹^MÀîSÔr& ¯!zj‹jóR ¸ì†K>’‹¿‹ò,[sÞ*´àõóvɺqf¹¥uÑl·ÐÝs})óåæCÈh³›p×ß"ôz>a×}WÚì¦ßí¥9k[Ù,Æ%»ç-YžXíª|p B+lÝéðNp|GW‡WJ×ws4¯ ¶•‚?ùàÌۖǹÔo\ÕW†îÆ™O–ÄUd5ûõtØø Ó•¼õüЮ ¼¶AÓÍÝë1#på|~Ç´¼>*=®×ìkdß Uñ^çhOñP÷êIOÄ_ÞT¯®_®ÛÅ·Àã~ iý¤u+¿úÉݼ•î„ãWƒÀû}á!¸AÙ@r"·uuî”wEŠvÅïö)Ý}îvÏåÛêÓ~e•x %¾Úè÷QÃN•uëwÛ=’âeCÚè†èn7;spyÑù×ó"0/Þ÷u©;K†»=7 Ûo×JÖÙÂ|Ì­¾áMA𾂹f_žs€ÍO6¶öÔ»ô Î|[K¸nÒÜdµZ Kt!³¾ ?×)Î'¥®çïºÚ¿ÒÁÛ,Œ•`ë›ôò(/[îmïÙÓúX’´Äü7w_ñD‹ëúõV:I—Î‹Õ ¯ç©öÌU0 "¦îEöÖ‘åÚ¥`·ñ7ºlj3¯Âx|3´ýx{ÀÛõ˜G¡ósâüJðtCC~3ÿY‡Ø@‡ÍCããr7oõ ®¹Ùj—ÐJŠ«ís^óåÿÿæßL_Ž1õ65äÜÛ› K1¯Õ‹Óiî^Ü¥xËt@=³DDŠ&ɼ(Õ[‹H(38ÛCòR¤ž­#ÿÿìýk³$É‘ž£jæ7«ðêfw£Ù.eeFvE†ûm–üÿb>p…Kaó1Ífè*óF¸™ê™æáûÈÊ @ …Ì{=ÜÍí¡zôè9ß´Ç4™»Œª˜gJFèÓ3"u˜ûo~‡×ŸýÄýùXìÉLúկ ä§çž•êM4¸Z»íЋ‚½åqî‡cdwÉè‹NJF†Ì hÑ;î%©®”B'Ü)Dæ"4äËé§ÑË&‘0Žrœ;¤7Y&fK…ò­§³šAÊìŠ6Z)S)“Êó®Xt¯S1w:½÷$ ÈZ‹—r<Ì=rä" Ž2p%2@COÐàõ$¡h–¥P1Â*¦½œ¿kdŒye…}Vo(»²ÛWÑf«DÊ*"ÑvßÏ¿mNEˆìiUVNŽÄ #Ò ÁP¼Vû±Y5¤ÌIR PJd-ÊÞ‡¬(©„ù®V¸õÞUªË FÚ‘’•JR¼”ÖD ÷DX1ÚÂ3³©ôÖݬLEpä)3"Iw޳œôZH™ÜÈÄ*"Ü¥zoHPÙU+…©—]™îè’¼ªT'™ßEôdÀ܆ê;wn>Aâ R†‰ì@ >!Ú²t'c ŽÊá$ëddFrrH<„Jƒ Y ¡Ðf ÇY‘0G56!;ƒ;[×§ ƒÒi„€™Ðtc)x 掄 ̸wf‚Š©bì‰Y&D õ¬@"dH«¤¤@ËH@&ÆXVé,¢ ™™Ð¨ŽÈT§°€ŠÌéô]ºhpWqKœ04”rˆ)a¸>› ýÊ!¯/È`PWBÙSº%ÇÈ– e8@ùNf4C²Ð*I5fÐdÞ*U”"àfK€î@A !T@-lÙ“eE½Ÿ‰(¥H–A+nV¢[*•r+Üõ ¥œD)­eÌÑ“‰”yupw- 4=}ø@1ÝPwÓ‡½•©>}#dôØí˜•¾¯A•f ÖÝ4Êz­+{dDï)#½Ø‡ŸýÄÝifnWáæâ]%v‹ªÅŸ§ t±‰ WòõºjOçïÙâq•Wñã"XÎŰ”+ýÿ•p•ñœn™‰gø5™xnf=Î"è à:Žž„¸Á¥k6ÌŸžèü+ßµ­±œuç×LÌUL݇qôèõÝÚ³½X‰Ò-ˆ›€‡Á·ul.õú0ÞÈý_ w~oûܸt¬ë¶çònjT­*Žõ/¯›M™7"æˆÄ¾–:‘†iÇž”,ç~„P¼fÀ½¶¹Ëñ¹Gä’9ŽèÇ ƒr(‡_:²Ì¡Qº )űÑD‡I‘аБ0Ãôdú¡“¡\`•8"F˜c>=¼@ «ˆ½Á>-Gmµ¢‚2è¥n^³¸¢›?MÇïžûqÎ.ŸJoǹ+(!#¥/uî­÷næµI]}08#ÓèÑZzTŸ¢Çð[î³J1ÖÒç¶0=sÈâØn¿‹ŠÄÒ’ËÎÜ¥QB‘yaqR¨u+¢1[Ð\jä¤èÌvfS¥jíÓ3"¸s!Û󜇙.woŸŽ¹\Ùz ™%AÃÔ-“4ö|†’šÕ»ŠQ %zÀ:JzH‚æ.åÂ]+žnæR"²*02¼eÌ’€'X(‹#+vÈh€}±¬Ùè  adO@°@£4'·á0 *í0: ˆO‰Éì»sf!;ä€ iA\Lá`ºõj4ƒ ÞRR:©Ék5d¤b0÷šåh’Ñ­däRÒ®^ÌÐèÅS€ÂJY¤Ñ3"ƒf„%2s4§ÐÍK÷Ž‹„ÒÌP&…Ô33a°šÆ43—œ š™•>^C6u§±(ûâÈ-bȆŌb€§WF$Ø Nu@òìnu‚Y²KLºƒsöy± ‹ÈD7“íÕŽÏós‹Ælfî˜>|û”Í9íw¿øiûS)e?ÅQ‘ÞûñÃO¿á¦}­-ÀÝÎv°yFDë]@o9Ïǘ{Fp·¿ù7ÿŸüÅ/ànÆ›ƒttÕ úÖsþl`xM‹¸þïu8v×,–Ÿ €|,×HßmÌCr!¨þ^2Ê•éòïeÞñNÀ—x^m˜…zw&w6øý¾Qù}ƒ´K×ËCHúO\tþͨ͹s…/µœ~ø®!ögÁæ|u)ÜP|Öóðþ,ÚWoûq¶W|©´ö–î{Ûî +8]—^ ®ý…¶»é(ÈE/py@»¸Õ­õ®mÍ:2n ËzýóÍYÒµwÎG˜¥î¿è/}éáªÛp%7(ꦸµ¡†½T|º\Iz &ËÛšoß3ôÚõùyö¶å®fËeÏø¾˜1_ÆZ¤—N¬¯*ó¡Bð»ý½„Lþž‘w¼'{ç=Iïö|<Ö/öÌï¼ß‹Së7ÂwN[~™ûžQÒ*ûðN£ßËT~ñ[mû¯ý4¯ªu/·Ö=÷L³.šuĶ5ðËÉíqÝœñ¦¨ûó;¯·]tü~?÷¿®M\…Áï½*_ aÎÍ_N¡f­ø¿-Zpÿ¯åýÞwý3û<:mVžÏø{ϫɚޱ¡døÿã~û±[ôEÅ‹›Ýå¿Ö)ƒB20[#ŒDÙÕ)£×2Õr<‚¤Þbq'sôŒ‰3ÈêLDXïš&~xâÇç®Æ.õðÖû¹÷¹Ù4ñé ÇÛlûIÐñ¿þ­ÏÖë®=•ÉÖe@RgkóüÜÚó±ÍÁ"ÐÓNÙ)E_‚IÐQ @÷v†N&pöö<·Hæò:òT 1lju½§ÑêÎw»*`>ö¥^FÞ?ñp˜¡A1föWÚ(½÷’¾›>óqn$3hDFfΣA¶‚åV–äw±ùut fÐA)¥†Á¿šž¬þdRëí»Œ¾„öƒ¡˜-¥ä©1 îtGÌ¡Ž$–Â@Ç@™@ V![(Ž™4fËp"2¥9òpPHiîfž’(SdvRf&YÙæ©R ¡’qhs¶Lc Â«ÓØç¦$ÔÁ •è Q¦BH™Ñ3).ÐÀÝ)eÊ ²˜š”A7+FßI3£¢µ-; /ž&B´Ì–ôR€ÌvdݲÙ[Ÿ“}˜Ä&Ô¡ž µÞçîfΑŠLEMd ;B éd$”l=¶sfWv(„I³– ¤Q‚»¥r’¥4gØ-09ô ©5irö¢z‡ÜYFJ‚9{¦ÆúPæd¦,ǶÏ.´6|8÷<**‚¨Ø½šˆ{`“ÁŒF'Í £Ä`îJNÇC‰è&–b‡°+œÜÝh&™LŽ}ªp³Rè€0s×i7Ëžt‡‚(î…†Œ”’˜F $ÍÀY4ñ$dàîi@„A@R J½(£!ÃMdB K”ÿ€!OÉ2`8‹Ó)äÈo»Õúøóª¤`™Ål,Z’ ›³ûA˜—òxŒüx|>2c*œg"ͽxÛMÆ©G2x˜EÒŠïŸ&ûù·‘Š9ë‡)”JÉJ?@ÚTÓns #¢÷vhs ƒ¬”ù¯ÿ—Ÿÿò/iΗ¸•·~¼’n^t!n1ÝÓ¹§Ž:rÝèîQû@÷+ûʯx£ºòjà÷h¥¸î±Å=%ßwðsö{¯xà/¥Ð7BK÷y¥Ú´À¿ÔÓNòQ¤3wþ5^”ÞóÔzçKƒSâÝœâOBtþ‹$Î綃GaðªwŸ7j:z¹ðq½¬x¶ÏZSÓ^O7€¹¸4Û*áÆÄœWù¼Î4»ÛbÏI¿hݵ|•«êÞo]š‘WO»èÏlËç(‹wõI Eg…›e¶kž@â"ì¶Àÿë1åM#˜Ösø¬°p´Ñaáy¿Ùª[Që­xõ*O¢Z7b'·ïFÝë»Ù0*y³ÐF‰I+)Ý{-k+MÞk‚Ðò.ÎøÇEøàÒBG¬Ñ ®%€øp}ñ^íl­_« ¹ÖIæÝÂâò7ºª0l*×Kc5ää£r õâÎ|£(²Vÿ^‰_\w]l[.)®z‘Ö›Šnþä#lÍ_TÙeZ³”)ÞªQézw>ýƪ÷éZhoûâuÛ1xcüþ“í3éFÒGkAž‡¡oÐJÞ˜ëÂû·ÃG¿¨»»ðæ÷nê®Wsw,Ê·»‡Vj¥.¸VÖX÷*]-Á‹ ’n‡n+ïpûòµÝ¦nPn­ôÚyQO­ã <>7[âö@½`¥We»•øŒ¤Ç‚oˆL×UÊKÛí ˜Î•À‰xÝËÂ÷Q·óQ²–ÛÚ,ùKD©Õ9üREMwÊ®·„w4¸ÈëºÊõ´Yn×Sr[C_Gäg£PÖtõºÏ'ñ¥™b™æ×}µ\oÖ'°[§pðaûÝ•,(Ç)K-ñõ*nôÖyo6é*èyCw¦È}>”É«ÈR÷dߥÅG³û´,:¡·}ëâýeB®âûµ;Ð=yY¬<ïÌÃWCís_£úÂÕP¬[}7ÉðvŸvO8g0Û¢ÒËAøýã{;9¿l~ËcÁw•,ÖvÍ·`;^§@­E½¶÷õPT—¤ñZy`},®­ÆáÖú_þóêÇ®ˆŒTj˜£–©š»¹Û¨nB"M0rÎÙ[°0{‡œ‰`DÊ ”˜v;EÐ(%ÉúÛ) ;± [Ô¹Yï))">~ É> H”ÉJQ• ÙrÚe¬TÆâTx†ÃHhx$àð 2  ©T?º ؉™h ݪ‘‚º"ÅB&eJt30¨F+ Ú±·€LÅJšy W8´Ý·µ#R^ :•=Ì 3͘‘ýØan–^ „™`Ãá¶G„;¬0S„AUAIîeÚ{ë3‘ÅŒ@6S(Hµc@„ÈH¢eD‘Yˆ bŸçgqFDÎM  ÄܳwÆQ‡ÎPΈ#˜`Òm<0†°ó)õ/dMÅdA! > bS©!èo .® ^²sê'•-1WÁ¢–ŒŽáŸìÂJ'A3ôÐrӳʡ£–&ФNnS±H øüÉåpÓ‡âD–¡p0ž¡7$µÄÎ!„$"{o¶›Ê¡I€òJz-Q\¤Ìz¦Tv»±•˜»{‘0<Ç §§()ÍMš”ÉjÇOÏPšû‚7(󲧦I¢3ŠÝÝÌXM™è —‚lf2²'„žìôBzB<È\ðÄ"–‚•eçµÅ 9"Ž˜Ì„' 4˜™Q Xǰ¥žC=ÈlfòE;þ˜i…‘W©"‹ß˜’Múfßþìù·Ïæ.*{ì¿ý†¥¤dÅbô7ì§ì2õvì ô>ÐÿåßüËŸÿò_Ð…v.*%´;8(ɵ·’V¢ý—ð`1R^I’\¸÷žscÜcN¼ð†Ê²±í½dÝ›¿æ¶åá:»I!uÂa¶ê8«8úVÆws->Ô6é»D'çóŠ¥qÄ>B¡‡°ÆÃˆç f]½ãUõ‡xÐüº–Jç…ó6N”tï¾¶ZòÛXñ:rÜŠo•ᯠ1é,¦µ=×%èºÖØ)ö9LYtò@×F„Ur¢óoªN]òs^§®×Àßrñ+S‡TíÒðÐ~oã-w øav¼0ú嵲ߦzªƒJX ÿÍÂçý»#®í$_º%>4Îæ¥qÿÒcæÜëñºÎÜÛ:ˆ/.ÍÀ;d±›9#¾Â¶ÒmoL„73þµ~îý±„ÿίáýSíݵàwÝûÇ<›ÞÒÀϽ«?)ó-ÊôG§¥÷¿ë‡4½íªü#»Ý€?Ø~åß ù¸6«\ì…:ÞEÍuI­¿ïvÉǾEºñÖñ½ñ&jÿ¢ÍË—I¸%¼½»à¡ËØKQû÷‡Èo£|7T¸ë 2‚@oš ï­+àÅ]‚øÇÕ”•K %õø¿þû‰Ö³GöÌLš•][©¥ì¦aþi$Œf6°oBF²¸›•l=%O rm-nfǹÕR¼s'iÊè±›Ê8‚æCWD!˜1×âØ‹™—b`ekšçüø)çRÿãßNO¥Ë–ØÃ ùã1í0[ô8´öépü4«Í1{ ¢÷¡`sÂBÎr¸Gˆ _¨h-D6³¡rwx¹ðúi€N sݾî»±£ iH²b‘æœbî€"ÔæÈ†âîŲ÷Ì^§²ÛM¾«BÏÅ«‚æcDgØ( ´>+1¹‹¥TçFO÷%û´=†VLz‡b¬Ç‚>(Zíä¾24Ib‹DäIæh˜[¡F‡€4ÂÀêì'dǹ0 !;hØ]:$²Ã+H˜C"’’Âx Qzöl’YwsKÈ8üe¥é>•º¼G¶~Š*³ºÑ«<ÆÈ”˜xõ EFÙMÕ,Z¤(9DJÈYÆé1| h²jS 3gµN«° ¸ESŸ;å¨P{žM˜GïÆŒç#%T(S­e4ºIdJŠ>Ks?¶ù ùèèLõL$,©–Ù»™²‹G ñþÞà¢K¦©Bº8§hVL™\Ÿ„NÛ“|:ÄTmïÅ"SéfP:¬#ÝjΜ&wš’!KL´ŽD$jÂ,r7ÑHK$`ÀDTÂ-Ai2˜P o‹Lº1eÆêÊý4Ì ÂU”!&É̃†°±™¤[f7-4,»½ö>Žâc!¨ºÛó“y),… »Õý“kÇ„—e›Es/f¥DÌyŒŒ0w•’ÁèVv“T3+Ì AŸœÃì;’ Ÿœcfç!“™æîRÀ1›‰\Š‚:AÿÈá× ô ¥H ?‚D¶’Ý -a‘ÑŒ¾«»Ì¹ºž[o¥gK)XSG!Q+çF…™;TÈJN F³éiŸ!2w?û9wû6Gùf§.O•ýÎJ9ž±›¼7Ò<2‘’R½+öW¿üåŸýË¿ôZÍŒv’pYžî¢B¾"{йâB­‚ª1üqÀ§áL%}ÔðÕr¿­?Ñ]fÂç噢ñXÿä«Ðñ·m…ЀËAð™5$7DŠ—ü½ø.D…w]ƒ?K6à vÆ' ó´'_Éæþ$Eç_£¯hÆlC[‰š»`À+˜Ê•Eð½æŠÏÇß.Úê§¼”4cü“‹æªÚ”:Ë&=Z ú¬ ç3Ñu¾â»ùÕÐ8’oxã+Âßç%ê/ ù¢Éé&«ÿKx¾« jÔ{gÄûÇÏ—#¿” ß°pøÞeöÕ~áû¡íÀ˜ï7Ä•÷/oý€êœ¢#ü¢áëW×fúuiu--wë¼A¯ˆkë7Ô\6§Ò«ïüm1•îÏ­!­´^¾?x»ý×Áÿ !ã5n0áš!òU×Ê Kþ\2Ù6Âk>j~³¢Ó§ø|/0ºNߤä) Âûï׳BCÚÞ‹[-æfSµb"Y|:Åë©i`H4;CãŠí8Ç<‹Ü³¯î4 ÔÜ•IÀÍbæY=@ƒr×:îw¹Û©¹eë€ÑèµæÜt ý_ÿÕk*S9?““yìñq>çãÇ£÷sïsCO…2“64‡Ì—†faˆÒøÒÉd¾„–Ót¢·EøV/yhŠ,š?c&z]x¾Òâ¸+AýÒ¥ãfFÖRh48¨‰ÁZ§iW„lóüô­›){?F €™%’ÎÊRé™HÔ÷ÞçÞzOeZI¡…_¼8œæbEÀ„P DÚrçf/mx ÖaÆâi<Œ<Œˆ¦Œ-ˆ ‹®ÑøÅÞ@@ŽEB~µüsÆ3À‚rR"êÑáDdÀŠ„n:$=B@á©©Û8\RÙ3%uë³Lc!}YÆìM’´Kµì‹‡âá»Ó~Çê$Ô3ÙýÉÌY§*Z;4¥†µ•e‹K$Dƒ+ZX"[öVvÅŠKˆÖÍÍÌmòÅ(Ó”]Ñ“T5R ±'ÂdLš 9w˜ˆ~üqÈÃAóŒèi™‘@§fö”Ì-k°‡4B]M(‰‹®RH)c0Reæ@V …bZ§X\b* ´¹»\f*Æ+Í'›îœg¸“©B$‘)P`ÚҠZ°§Eg$ˆ,çBB](@Ž¡ïzT£Wkˆ§êôÌŠ®^Šècéš»±¤Ÿt-Sšç3àŒœJîk™&¯¤YQr,'w3K„¹›•È.R¦Þ^H‹Q|r)¢¥¢ÉbÈ4¥LfÕ¦E‰Œ±9ÁI°z™&HÙûØJ£Ï^ÂÐc>öþ±T·b´„@ 3:(ȱdÙ)ùLàøŒH@ð‚2 û`(Gù ;6A0©Fa—6õ–1G›çÈCÌMMæ´b&¶£rø|€P)剥x-„§ ë„ýTz–_üùÎLµÌ‚O•ÑóØ»"QÜÜ£EB>Yï=æcHY)ññ‹¿ù¥O•K1æ•ØRoKŒxK }Û©Ïmxý‹ðê×+ðåHìæ¹ø:T"=&Ô|fÞ´ª_§­~íœeUÑ)L_ê>ï³Öíúš9÷©‡ùÊqìl‘«ÇÐÙK ׋½¶6̪}A›.n>‚Íÿ´DçÏ_¸æ=&x½Õ9o“r=ó´.Q8×-ÈZºÓ¬/š<àJ¤hˆ³l„V.m;'yÕDæ…·wµ¿éŽòšˆ¯]xn߸,™Í®äj.ýG‹XF›Ë¦ZzÖÏ8ÉB-‚B—gÙŠÚk« ÄÈÏ– ÍN1ØØÙœk§·»Ìª„u˜Ç¸åx¯:é<éž1 ïQæî_ö$Çt »ié&ZWÈ7úþËT;ÿ:_„й2x×þÿ Ï­$…®aÈkÙ­¥y®ãž\Õî즫ªçúÝ èPÅ» â$(qÕ¼SÖJƒd5绬ûG\–ÈÖj粫=ñæîi½ØV̯õCôv«uøæÇ×m:¼H¨m}:´´YÏÞü‚w£HÛq¬âíC‚ƒ´MÜõü»-§ß-‹ž%m³mÚ{q•ÇÅða©o£¤rÝ£z«C¢”Öö \)£­W-×QäÚÛKÛZâíÊÚHn½¥¦°ú½·Äª÷Ú[nšºtOìß}5—•}Vãš´‘}ºèzññã½1œ‘ô:Àùrýö-p 6"nK,~™°+ù²\"ƒõ¨j½1Þ,æ5®óž£[ãž+Ù¾ àŠÃqÛ<«‹êÒµ¢Ôm+±^MÀ®ïI›o>ïx¼¶âÕWÜmŽ»j©^öë°S›Èr9x7*]½¾U‰+JÜ}ßšûçõf‹^š‘oK>`½áÂY`ÛÀÕ"ç:$¿„wØ´¹þéÍÕÎÛW’åÛ ðÈÅá³PxÞ~ÑM 6ÖºgW3äêÿ®ó@l±7RB·_~uX¬Úut'U>q„ßüæ7Žß=g‹>·ì}‘èr·©”:”µÍ½ÐYJ%0·yÈri ßõ|˜£õ¡4mÅ{kyêóõÂè‰ÈhAwsfs“">³Ïüî“;§bµ.74Fðù’­«EV·ß~RïúOÿ›v^K' ‘<èx8š2s{žû±åܳ÷œ##G“‚) &§ú/C8 úüF‚ÓÝsm Ñ‘qšðš<@"™ˆÚ çTk½7HÊ€{fDIYšs·›Ü-²ƒH­z)z ¯®bKX]=Ü&fôRÊM‰ÌÄ Úçâ?Ü–ˆ%J )¢ ,0¢ŸJ8J€h #Ìyz|:ƒ„ˆ`.úC5h´ˆP‡?©½zE&èP":šåŸ!ÄŸ õ ‘¡”L 3«‚„nVQò?§"2)(óŒ!ÅC!a¢\™ 9Íh¢¹„ù8[Øô´‡[©FJÊùpL‚™Ñaff¦DÎ BùP|gB*J?Xï³É•Mpº`ZlÍmÌ~ó?³‚öÜÛwGß[D‹Þ²'"«)m><+šO©ùØÙfl Ù"ºf!a¦„ȨèÒQ]è Ã’g€æbRÄó,"»†kqîŒFìŒsÒhûÏMU·©Øä6[r2Í=¡–L÷=‘T ´)]HÂňNÚX)HôLݨ€&Íf(…æè]Ñ¡ž#&[2ý9T '³Œœ»¼¢,iKZI¦Lót&©Zd–fËRŠíJ-®ÖgõJ*òì¾™ Yji½¡'v^¦¤rºÜ£/}:™‚DŽÚ¤Ó©Lr4ü­A„ d#ŒuW$Ë€RŠïª9aÈç&S?ü¶a¶—i—ÑÑÓPÒÙ@f£Jzª¬À 2YX ”½©þŒìJ1ój¶æ1GϹ·Y9÷êäX`‹oÂ2Ln»o>ìž¾í‡ V úé9v:|ø³¿@p6s÷¢ÇzÌÏ3Í뇌IŽQÏÈ6÷>wdÐ}Ú•?ÿW¿,µÐŒ/•y‘ÖÙVgÚ¿5Œ^8á©m9ÁÜô{^gh:Ãnp?:à¶ÃàAt½Cõj¢sÔªM}âæ ½Ùmƒä³¤æ6(%NÖ®|¡+÷Ö?ùˆ­bÃE8þ pxùè¶óáêñïPjnЭ©=×8¹’¹~±À+y‚â w®•hî]­•;€ÊšÃr5ˆEkçAáaáo¡½U4FÜÚlßÑš÷³nâ ¡YƒÀÿ¼EçWì¡«ëŸSœ³ì¨”¸/¯Ê«iu-uu¶õQL7L—¶§ÍªÙ$ÿz]öVø /é›1—{€«…·*máì[ŒQ§¬õäwµ&îd/!ЯÔh_Z«sã%l™o¦`]ጯù*‰ñ2›?sbl$¾(0£Õ¾âµ">ߤüóíàÛ¯ö‡e÷½Zóý>‡G>„'¿HÀ „ã/Lè×ëµ£÷ì€÷þöRS|¼Ç|ŸwúWÕMSOK‡Ÿ3"/ˆšßÓðK×_kì>¯àYò[!ÔSô¶–Ì|yRßÀâ7N%ÛÆ4ôŽˆþgÒÞ_¨Cñó½ûo ÞÖñíZèê+_èà= ÿ-}¯©jžÿûÞ€[½ÁsÇþ+lnŠ9/7ròq0ÿ€>|Ñ÷÷RöØu/#+úõ¯~5þâù·ÛaÎ’ŒVŠ{-,æµÐ=—_U„ºuÒF¦š™‘ifnV ª™2ÛsOÀŒ^œ^tœÝÕÚÔSÙ …—´6ÊŸ|È]g¦h!¨ÐçÀoŸ1wK£¹ÃÑçÿø§§ ½'Ô€2Ú±åqƱµCïs ƒŠõ#s¤†žÌÀ!FÏ¥`Å3ádÈý—“æl=„h .=Ë–×fD‡Ї?0k)fÈe¨eÊd»§š !Ü• xI  AƒÍ‚i¢’)D_t”„¤ƒÊHì&Ï®ck‘ GÌ¡8Ø¡\èÛÀý°"à'’– çÊ,2ô¶Ü']™ˆQÞÈ“/Îð~ ´¶ 2™‚íBô‚Hôøâ0è­zèDbùÃüD@eÈT<½”¤8Œ ($IŒ¤™³z瘟Y á¾c¶4÷“¬(S’Å2UÖ:*R)ıG SßñÜɤ¹së-ž~úäÕsnR§ØæCÌχ2íʮҀ£Fš‘Ùcþt(»ÚçpG?˜VܤhskGczi™Mdž쀢͚PSt4¨“‚§")OÌè*£ý$sîˆÔDcjZʉJZg5HðBO§9‰TFÂÒÄppGNÅU³Ðàðj”kžcvå£Iä' šˆ>øï†½Ô21Á„Á Ø•Ÿ;ÒD#BR&hÔUÇÄÞYˆ ”𡹧¤IL“'!Âó„¥Y”’ægj½ôTõ¬¥õÞçy÷“o­²>=y*æÙ¦2=™—Ì$‹¹D‡ûâ¼KsʇÏXÓpõÌR8tÈÆì\ªn¥dªTHè©ö|a€§áÞS<"å‚»S!2Sqãd^à¾@ü‹€y,&Xl‰—²¢;)ÍâÀ}7ÑLÊx>¦Z*3s©̈D^"e¥N­QbM¶c€Æ:ɪÑÅR¿ý©ÌdDâùÓñÃÏwæŒÈöÝ^b’†)Ù#SÊÞ3@uûåßü/eWÍ iîöÆ|t |áåÀCãmÅdîS¼.”í/§7ùB«ðõ®ðØ?¯tèý!ìWï¸o_Ùšò»!¿µéãqìýu²°õ$¿)xà›èÎþ¾Û[Ñß/ôÿuÀ½)õ'*:þ—;ÞBç %t§' üø¹SÀ­ô¿x‡p[/X­œ/»¼ß€?ë¢|þRÆXXÀó··cï_ç\ýq)ýøù“þÜ0þ w¡¯ø|?~~ðÇ—<^Þ9‹ß ¯ËGy§Ææû•¯&úŒu¥/|7ïéÇ}˜ ­³?®;_ž9Ô¸üJ_Œw:½Z@úõo~süî¹÷PD¶X¬™ÝÌ­ì¦R ‹{) ztœÖ[FO±²²?ÏnÆ©"ÒŠ©8CÊ$z L+ž="(ferµVœÜ»eƱõ>gK€%RÓ^SÍ”xšØóùÿü?áfp«5½RIW©(n©Èê½:Äó¬CI,`ðØʀ̑N-´\-l}x0À(aŒzîÝ]æ¤×à(' áø »§ÓÛ'vÓd^Zt¸ä*Åk-V ¶R´ˆð2švå­Ëh0D(çÜ?¹Wëi€£õ9çî¥ì¼Îs›{«‘F#€˜%Ô‡ÈOØýOB8ÌäG°ž“ÆÊ"þƒÕÚÏ °Ó@Ñ <Õ´* "@‚Ž´åšF(ÑÚ‚.’è‚(/ˆLT!d>I€D!Ò ˆ…ÖafªnVÈBÑÜÍ(X&2;d^*­ ”Ñ@ºR4ÒôT𓥍çò²’>üü©Ô’©$™‹)@o]!ºÁ’²%€Ì¶XÑÓÌ´c‡²5( estö#`dëyl6!#Õq|öÞÚ!1Ì(Oö­¡KEô\0ÔÃŒãœfÆd„ A%hi°Ã ”1ˆRªW6e†h7¡p¨Yî÷pãü pÑPªÜˆS‡P$Ÿ&ž‡T…:æPòQR7LN½©S™šœG¡¨@„Zd×Ò¬qTî+ê^g‡¹ ¬(ôJQ¤Ì…Qsɬ%<°ÛanO?ý‰–I2(|šÊ4±Òh´eÎÊKãß ©÷•Ŭ”1š±¬Á$E ÀX†¿42FAVœC6 *R ¬/Ðñ¥Ì¬+}Ž˜Ç䫘øø u¯@.ŽH° $˜ ƒ£ÓŠål™‰Î<*5÷c DtŒÑg"’$œÈޱeHfæHCš@ßïýÃ%Ú¡=}óíþ'û®^^“( aÿÍT¾ùF~ØhsŸM=zëHyñ¿þ›¿ùé_þ¼ ~æÝ0õ÷¦SýBõ"OáUÃ*ØÿŠßpŽêxŸpr¯uñ3c¼·ªé =×ùrky3%æï¥ï“ð|²jóâN…‰EçPÑþÝ€ó âëÒk“™7þÖ¸é3¾¼ÄKC8Ö…6Þs½þ> …«]®ûµ2u9;~ð¤Ç²N–ö“¡4ʵ†ï•]6ðôi+97L‰àÅìû²PnîëFþ“möFãRàƒV¦·b[¦éZùG7 é7@Æ¥Qáö¥Ý3)¹”Þïœ`çæ GÛÙysÙü*o7Ýâ”z ¯:Ë.7¶ª?ÞHè¦:¹Ö"¹)êæ)µšz¼—ê>|k›‹ò¤ûp}CwFâÒ+xV)ººê¦NÝÓ*¸üÈÚªnZø®å"ˆ÷€Ð¬—ÅÍFÀíÓ‚÷Æî–¦À•Ô™Ÿï¼þ‹{+èNyŸw|ZùÊk¾y·çßÒµ6¶î êÛ“[áª{x'/?À>ºm^-y.ý€«w«×÷^·v]¶ÓUóÎ5·|‘Á2Ñûz}ßoÃåfBÜï.¹7~¼•iÚJƒ]¿gj£kƒËÜÕõZ߯T›ÁX©zòþ¶£ÛeKòÞé³Hoõ²^Šîny0çÓñÅÐâ$òr^ëÙ§ëcXë“ëVF÷—î"ôºÚò´ýœECu« ¸m,q€®&ñCy$®–ÎgeNµèÔ­ Ͻµò¨ÉäÎë|Hð,1Äúÿµ4Òký×Uƒ¯î žÞ»ð‹ —Þb>zÞ%½ÒŠzeq¯‡ý…Ç}cÃÝK­{^|S#ØãU3Ó×a¡q«%këõs·±ëÙ¢F*‡&ÅÿosësDï J)¥8àVne*µVÍhææÞ#3‡¹ 0³âÖ['Áb17ÏÖÆ£´¹•â,¥V/¥Ì™nì-Õ{¤ «µ¹0ÏC”Þ[ÃóŒ©*ß~T-L©÷Ìÿá?ì÷;[Ҝ欵jÇÞ{ôCÓÜçç93æ–-iÈ¡æo/()DžÈ`NÒ=C¯ß>†2¡ :iCfHÑ€ýRcI,€°û8É鸀JÖ½1ýù¹Ük-{7*£ Ìz5g„B \(ò}aØ|h=²3ÈB5!§×Šˆž9{dûZçÖßeÙÙ7ßLÏ­Ó‡ÆÉ »'˜CáV?Ò¬Bói[5ˆ'×_[8û<•Š(”é¢ðz>SiÈãÂkXl&FEbðýGñ md VÑg¨f‹)±1Ê#h@™Ù$÷RFÄ´Û‘ì¼N¦2z/lH´P戠×êS ¤›[q,N2»H«e-iÃ’XÊ~ŠDšgLIšÃå”P>MÕ|ØÇÂÌz1s§ÄÞ[´#£#" z&#,= ‰¹åóQK¨£ø”ŒPkP œÄ~5ät¤ìi2vâ˜ÊQw/$­øp3¦ÀÂá }á,àÅ!3¨@t$ŽeÔÎpè=j&‚,xVNð'hO&ÙSÙe„{ȉJBbK$ÒÂä"pŒl‚C…¢÷ÌÐGˆÂ4iwÒ$Ò\eìØÓ•.£O¢Â¨Ñ¾’€VÅq&ÌëäfÍ(+VŇy…F]gIDÄBš!AFëÈØûÌ`&¤$'æèïi¥š[FF.'…J-£TD˜1•è]³wß5Ô;¢I!.…FΙ„:jAýù² xYök/˺`NV¦Ié´dUs´”€Žy¾ôô((Žò ”ètšºMÓ$+_&¹ûÅ_Ð:)«¬ûi·ß7À‹¹ï€”{D‚‰ìmnóaVh ÑøWý×?ÿå_˜ù+Tv݈-ßKÇx§Iq­®¹ÑØÔ™}É“¯2P^Ǽ›…Ýfx×xÃ=Å×5 rÇŸEYÖšš›fG¼dHu&Äo‚º›çÓÖiêê´ç=ýܵúë=jÝ “f䵨„ô€Cò€~'.ÂõXËÞà®fä)Zº2z¾â˜_Â"ÚfD/NÒ9ö^ O¤%Wê’|¡H°ÆÖ«f—˰®2¤å>ˆBËw”NZêÜäkRùY´ñŒ,q-l¾ERþyŠÎ¿%øü0ÿÓüŒ2͹€:§¹\oW;¢îöv¿ ­p»Ýéfiè²M^z~רòi_vÐëÑMfÇ»ˆÁE‹~c黹Ùrn=3B¸ÒO>ý¼V¢pËÄ¥`sÎxò ÀÕ‚¾Lö»8ëæàZ n=Œäcù®¨SÚêdŸ¾HwÞ â~ï©GêÈx?B±$žç i¥‡ý‚ÉKÒIºsdÞC]ß@èãKWºÞÓWûÂ]¥oÞ_1¯»|¼·þ`ç»Ô ð@MŒÒõ‘÷ÆUxÍóú3l–ßú–ueŒ~UBºF¯ßú'ôý¾=ˆË¿ÿ•ïßÜV«xn]ñðE[>›Û´½s½úf–‹¾ï~Þ°ýñÑ÷l×Ve!ÜVNqô™) J¿þͯ|úíÇ8̽u)¹ÍXÜ‹OO»qZùTº»¹E¦ÐO*¢ÐÞ{Ù3£ sµÖ¬3Æaæ~×b®îFöÃ\w…Ÿžý8—ow<€¬» VžŸ›æ9çÞ?ÍLY ç^ý§Žÿ¿ÿ’ƺ›à~lF7Foi¥L,Oœ?Îý0ç±åól}VJHz0DƒXP ¶èx,¾Èc«X, 2Ð¥dÚ(Žˆ˜”×ÅJ‡è‹0Π̦¤& Sg@.H:i0c¦éÃO܃XbfJöÌÌåÕÊäχ @N¥ ”(OafÑÈRö¨ä®¸eÿ4w«¥><Ï,‚ æn¦Ì¨Æ‰Žè($}à sáÞ˜2ÁÃu#B…4Ó!b2°&âù]FJYL?ý@<á(ú´§JÎÉJLS˜µ”Oso͆£7  s•j´R«M¼žªMeÁ9ì„u˜%0ÜzÍÜÝᣠ)AÁÒifžJà–ÉèVJ!iVŠ•]Z‰ŽŸýõ¿ò]…›‘útTª%vBíy®ÄÓO¾‘¬0&‘Ù3zW Ò_ýÕ/?üì'cqCÛHß¼¢ªÆ•VA×Ë™øFfýŠu±Q‹ø¼ ÿ^ÒùX s­º‡ñàlÆ5oóu*Ý£9=¦=½”0Iº÷>tåzFÞ}¾*Á3ŒÑ ß:Pqû§÷Dr6F£+âɆqáêr޼NÔuCã2¸¼}“›"É…L¶‘y% =ó:6… Ôzö9½‚¿Î¾ªäŠRÍ?)Ñy¾›¬£W Ÿ¥ŽüÇú!¿z.YîåLFýv§Cú TI(%å¨5™4ãx!¼é~üüøùñóãçÇÏŸ?_$¶ø¶ð’+?¶¸þ̪?ö›v•™|égÒ»rõE¨>õëßþ#€Oÿôñøé HH^k),»"°ì&/V¦‰d(‚R©©L8kFmƒ4ÈD¢÷PoffdÑ‚4ÛÕºŸÊ®Pïýc‹Ã¼/Ðq®T5οý· ôéÈHµ0…‰ihŸV&ˆ”7 ñl8mHÿ>Îßýã1>ÎhͲA!’;»ÑÚ)í°€0j"‡ìÅ ù»X|H ‡F ,1 öE2³P,Ù€ñEZXðK]Á¥÷ÁÕXPJD @VÜI£R=Ed¦¤´„Ñ‚iFóä Aô9R‚=”YÊdî-Ó‹¯sk=΂<‰aQ˜ˆÀnÖ0MøÅ/`ÙÉÁxø7@ 6Þ¼lð mâ$gS÷e‡+¬ ` »c$O®È\œÍ!Ç0ê‡ñaõ’ºOnwc ©ì¿QIôì+zw+#5Üí¿¡a4“àµØ#S`!Ý£Ù°Í íÐ}*>¹OU! F÷G´lÏIfTô¹Cœ0öžŠDtY!M1·Q0K«4÷ŒTOôd&\#gkq8Î-Ø{´C*=›ZÄ,´TŸ©½#;Sr.L~œìH%ÜJÀ¤ûLëMPH‰R‚~D*™“ñû®fýCµpw`S£øE‡Zï–YU2dÏä²Ê˜¡9³“±пÛÜ3ˆ"$ua†¹:*ø)¢ .ìÁgˆD¡¬à(y/¥>ÁvЦ]a1ƒÌ 1^½#àæK• ÙfšU³â atºûpx¶â4#m<’d:æ d bdúc€!÷èʹ„Å-£×B¡Ôˈp·èafˆÔb†‘]Ù]‘”! ©zCÌ0ÀNkai¦´‹b½Ÿ–’˜;F¡Ë˜¤¦ se¢ÏCXŒ½+Ú²$ËV`C0ÁlèO¡}›¬“,Õ̸ÿ³_îöï÷‡Þç™e-I8i…„±x‚Šasψì)é—¿üëoþìç?ùFóÛvÏ îñÇêKì“ Ï'¨þ:$á[è™?àHî®Í×–üãüÿa®¤‡^¾_v†lY¯ËY¦¾®¸8k¾‹]uÕîüÚïnEÈmËqÍpGŸàŸr®Î- $äëkÙNâë®I ­„°‹¿3ÎJ ZG³7›ÊYm‰'¡ÙSÀ‰»³VCÂ…Óú¡…„SY[É¡{R$/Œ÷å¼SËÕýåéázÕÍT_ë°½z«Zéª?ÄãÚù+®¦û¾“æ‚®ut®¬Ï7³mÓ¡G'Æ…‚½J­W=U­–7œ¹swÏÝj«=z´SGÍE@f6ñŽÇùì»Wž| ïXÑ$tÛA^I a»Â._ð5ŽÜk@CçæÞyªëæÝu¤;±åKí)·Óèf—|m…nDœÖ—çYAìú›yiû3W4¬vÞ¾˜ó/mÉÔº#Ï¥SF—Ãçî \÷4éU«íSGÛêÝÞlw6š EãÚ#ü»NÂ,ÚNmnŠ?[°Nwσã…ô±ÚŠ´2ËÍÑf¢;ƒ.ãÂ÷¥]¤6P€_”ÂDZF/ÆÉ4QE^ |áQTM('2ôá{,ÔOž>þI¤dN“AÑáµ°dqÑ+ĈÈ‹–!A^R¦$ô¹{‡IRD´cä^:Ž8†Ó"2£e$sñézGFH( ‘‚?@9 L;çE½gl™½Á™ a¹h ‘Y +ˆ †åOh¨ûEœ0½s”‚Ŝٖ< rùy¯C;‚:|”rèbܼ²N¤W¯I=tºØDc¶î^3³?÷úaoææ…ÆÈ€¹—2”©F05´á3æ>Ãk53…̵ÿß~÷©?Ï ß}¬» ´RKö0CÄŒL§38Þ^¤9-º”‚TzH`öÌ&ÏìÈ´B˜ñسµž¡Ö,{ï-æg‹ŽãA±ˆ-)‘¢I $™4ŽöEžQ„ -3/0›½”B;†§RäfnÙ3{rWX=Y>}:<¹5·Ž`d:é…ö®y Ð&ßÑÚ=µ§I8dö N0Ø#}pp,«¤¨ÁøF›“™Ws¡K]è ˆ&™ác-(‹9·£VÝ‘@´»Ñ¼ê=l*çP)ºÕionÊ\ä›vOV ÝX]”ÀÈf¤OEY÷L(’FPŒÑ™$e”Z†õ‡M5yìf…K1í·ÏxÚyu$”ª¥dU·uD•–pPF"”Ùè¾|‘a´a:Œ4b!16 ˆˆžffÞa£¬0|f fdh‘ý‰“= aŽbÌÎH£»»[ÊÓzõb•bµý_þ?AY)Pfëmáæ¥¨°{BÓ¾fª÷ž©èÑs´f"¡_þËõí/~úÓ¿ü3<Òý¿:³x“nÞf÷Wçü6ºh„•þÏé[¸þj¾¦ü&±¼¾—•"å)´¿uŸâ-аIioâCi{­þ”x{€s]Èô:aCz¨&°…|.ú0·m‹—›œt»~/xóÎW à6ØG/áÀ#Eó­Ó‹t’ÛrÄFÜù¦Ys-šsÒ¹+uu=+.Â%º šÜ-“\Rú >zF)ø¸àO@tþZvõz%ž%”Ö?¿Å»7¯ûnçn›Ê¶±e¼_$éy¸Í¿6JÇä»ÑöWÝ/. ÁKgÜ)w .Ŭë„õJæìº]ûïðV>ìT8Mn­!æz‘í=Ǚ’4x:KRw®‹ÜlzIÇæ,n†“ß0Wͺ}ì|¤èuxü/å¤ÄÃÇ{óU¢¼÷î=T6tS0ÖU™®PÝ-GlÑÞÙyï Ž§íH[ …·çßxľð#|ˆ@ߘ¢n09Þöˆéξ{0èºFqÙ¼Eâu-h~3îÛ~?^êN×›ÛUñv®à/ßuÓõø¦ãËTVX*¯Žë;_õRA‡ÀåÇÂ7EòÕYÈÏÙ‘yGˆþÞån´Ýy§uôÖúAâe¡u× noÞ“ßÔíþ¥ÓÌÕ§Ñ‹{ÒF#î=“âÑZ|SÝý…«n¯Û9|Ý#y¯œv™-#–æí†(\Ö« ~½à®LÐ6ÀÕãPI¸­x½(bxsšð…Z×ï[ñÍ;yÃZÖ|ÓÞ» v®v!âá·AÊÉëHuõ½Xž³^'d|\Ýâ¹8¥×åxȦå‡âQ`Uf~[™j¶^²MݤÜwT_ï®uô©×ÇË%Wпް7j[“!w¥_Û`<ªàòeÀýãó§×85kZÞË® ëºM#¹hÝ´šø¥ä3µå4ïy'‡]ÝÅ¥[Âo~óëãÇCôž=²Gô)·Z|*tTK-ÕG°^j¥-ó'£·yîúiN£K ƒÆìI2¡ö<«óØæžÓ¾(Tâ(3IýpÈLŽÙ[&qlrΡh}÷´ãOvœ;‹Ó<¾û­ù7OÇÿø·ÁÁ7ÐØRÑc>vËÇ9ç¦(Œ¹hmSN €„ 6R?ýtx8¹3í;³Ã¨ ØpËMôÔL< RBÃO4!;g ±˜ ^쨵 Á‹ ¢ðòÄP¶žcr¤ršª‘ÃVÙL„ŒHs™ÑCÈbÞ#2$äˆà3¡ÌŒ#‘™‚CzuDV9p/¡!~ P—%•Ç#̹ Ëy•× Ç†Eê'Ù  î£ô²ü˜O£±xH(!0Âwûâãp´ 2¢=ÏÏÇŒY½•–èé†Ö*Ó\h™\ ñ”¤J¸¬tÒÍçž³‚à‚Q-¢ƒ^‹R€Mô"zÎ L}îpS)ŰçÀ™ç2‹° ë©gf%À0‰0É‘])"SÚƒ;[;ÔÏø±s‚ÖGAú¤ ‰ ÑLV˜ži€%Lî`ï rg™0¤¡ö>ƒÆiZˆ¤»»dÌaƒAZ…˜31œZz5(ƒY´Tæ€ø34@wÒ™Fcó©È–ƒçn•0+„æØ}û@)¥hˆè݃ƒ¼_͈¤Ž‘‘€) Ûd1+Ž|ôX¬ H+F7¥ÊDÒz›•fÈ¡d=z´ƒ å?æÅv»D"$ä<6¢›•êuª»ÉK¡í¬­FèÃ/ÿÕî›§†òã§92ÝTœ­§Mô©:F¡¡ÿö>‡z@FÊßþùÏ~öN3®#]‘ž¸æ›< ³W@‡ôJ~¥«¼õÑÏóþ ®-Qçt³ŸÅ>ç6·ÒµˆSÂx ¨q¡å]2ºIëôR¤óÙÊ©+Íšm\¯—Éѯ{•]„¶7Ì…3•jù—sjðˆ³ðBPºMY·ª;¼‹çߥIñ-ù§Nö÷¸M—w¹Î˜¶H3n-ãδҵ®Ñ‰\Æ­ÕîL‰Mr±­ký ˆÎ_½‚çÈmøµešt)ä}–°ö 7¿IŽÞ¢}ÕÏ/œ|Ž+ùû>åú ‹ËÍyµ\ÐÿÔbÏâiüâ¬eþØôÿãçÇÏŸ??~>»xõîHáò9ß}ר“•7E—7ÖŽ¾Ä_X}•Gûgÿ¹òˆ&ÿy<üUƒ·öxnI‹|øsoñ9ûõ?üÃø×çß~ì‡9"t凇iÙ+Åk’EIˆˆF§ТŸ«|f`´Ü#z¦ú¡EeÐÝ̲õ¹å4ÕŒŽLXâù­ûSáq"•l!’»bf*.J?yÊzfJϳ?íáæµö¿ýotÐ`N$E˜{Î=]yTïì}ˆû©nBˆ°‚:ÁÊÂT^èZv"MD¡í ?8+2‡ )‘ˆÔH^S@Cv /øÎ þ ˆDq(6‘”·è2G²Ó¼TÊU¨ =©dDësB,I«î5$¶–Å%ÂMn/™ H©ì ¥²IZ"s¡ç ê'æ•iH@DJ…UÐÙ¨ý(¿bCº'1Lƒ æ 埄 Žg¹x˜ª°6dŽ@bH–ŸµõYÑgäè 0 ”>GŸD…ï‰4’ezÚµ°ýn?&—Ê]í½BŒ‚$§§i ¹"G¥º‚Mj ­æýÏ>…JÐ(cf22{Zå´›ÌÇfaV|zzÊR¸3B:ξ¯bôc÷ZNßà€“î’¢5³L"-©@HȘC)3ËÊœ#;Ì,ßåó!#™G´ƒ7ÅsFGd`@ cÃ’Ft dÌ 0”^H÷ò‘>÷˜JM´ì‘4/¶›ÌÝzh΄ÃKyrëb<aV©æ´Z2¢ºUS;~œÑ쳊¬{ÀsfjÜZBH#MÚNS]Y°êÇ ’M8f/F'”38 £QÇ€ a’h Ë®ãÁ¼ L½£”š!&/Su¯™ˆ­š»$s!3›vV÷VÌ‹Ó 7ÂÝiL…Ñbî>‚'Z¡¹›Å 2}7ч˜¾ŠÐèDÊŠ«zÊ ¥I¦ÔƒeY%ç=!†.Ý}gœ:¿3tºèrwƒnfJÀÈe®Â'¢PÑXDV½DöŒ¹²ÿØY"–n!ÐP'@žbq+û‚º/e23¤1;Q3Yþ×V k1‘fï ö­7+Å÷ÈÌœ¦)¥2³E¶6:«¼”éiúÙ_ý [‹­¯ÀºM-üGXåÍbêNÀà üFRæÌðß0šµ1Aüã–úzsâŸñêù=ˆÎ¿=×…"ýÕöqö|]Џûû7ß7L²7ëMÝoñáIifsÝWw#>VÚ¸ú\:xùÇiœUhç3dÝöƒU£4/ëñW·ôlÞrûîhïœyr­”“ÒÑâëk^Ä,Ô—^t¶[ó^p-ÁqóB‡dÖö#ЛU+ÊVGãÒ%ò…¹²aøò ›×Ã2ò(Uâ$³´õ*¹h‹ðúyto0x‡ÔªíÿžYsüL›ÛÑ+«þ1Añ’ó=úž( «1¹bH¾p è-+\÷8Ò÷žñb‘{ÍEÖ¾à[‡äugÅçä"r—Ïü>ê¹ÞÚr;’9*¸ÛSríꨇUß'RZùfo¸'§s¢êñŠÖÍ _SpøðèàãwpWóéö9/ÊçðáæA®´í©—­˜¶ß½Ò¿{‰Ñ«;q¹îЉ›¦ƒUKا&ß jKô~_«àæÝü1ã%};éà¾qÞ6a¾¸œîÎ>êе:/ ]|´4¯g̪íø\÷cèåY³m&•.]DiG=˜®wßÝ]’üF˜èͱ×;+S¯Íø·Q‡/+ÊÔÃÊÒù®u|N3jÓ¤›†/žh÷ÞÚ›Æçmš¡«3óÁû¹´£l…0ÏQøi®H/o—üúB§{-u\º•~õ¿püî¹Ï­Ï-{Ö}€hF÷R‹¹y-t3´žÁ‹Ül© ]ww™9èkRfäɶ¨Ð!Ôý~ðÍ —æ£eÔBkÏÇòa¨83`ŽÍÈòaÇÖA+¥¸õÿü·RÒ)ƒÈL¥Ôrž[?tõCÎMÑ\IKó$™L‘€£œ¸G™ BqQ*…GIªßÀÝSaEŠÈ¥F¢¡ ]f`…Ù£lG•3¸DGÍUH¤M‹Û§O¤ ËY¤äâHƒí†²¿¬’QÌM@(CinÙûÜ#gÍ x%£ŒNj§àyHñŒ’ýtå)Î8¥>sƒ'2µ¨ý44ý 9l*Ì6V=a)x‚¼;Á|‘~qG™ ­/¥:Ôa¾Ãþ?âp(À+@@`Ÿgd­õ‰,ôÉÜZ&°J2ÍI3ÁHC"C¼‹C"M,9Ö‘3ÝrÎHÅÀ´Ý=fÅ ÕjbÒI”jŠJý0k?)Ò«ÅÍ"”3†Ü½Ùu"`ªTÒÙZct#ññY-ìã!ßÅñ;3æÜúáúÉ­VȦèìB±…*> ^Q™è¡T3ÀR*fåh쑤U!Ìsœ´4ë)»êØOAö&8sô·<í9UE§9§æ,ÇcÇ("¡šVE4"ÏsBD2{Ji!š‰ƒdB‡>¸ cÑ´rÌŒ¡ûK¤cª°T0k1ÑP3:¥4S!I—™Ë&¥9\)s°w áE©ì]5ÍJtÊá¥FÉ܇ y›fà$”V'Êir2GÝÒ¨Ô©I27´þ3¥Ñ¾8 "7#¨H9ë~oÎ9 z]Ç—Ñz(Ͼêââåms-…E½žm¿wœeSî© ÝŠÂ¬{C¯¿úRž¸iÜÔýÉÁ‡/ì¾$—n&ÿËU¾¸tF:÷q¢íõoOü­2"//Y+A™Õ»F?8s¹È>KßI÷Ÿë"/ÁW ¸à¥ëPo;0oMÄVÀ¹FȳŸ¯&øªdá"ž±:i6n$ņÛ×¼ŠX¤«)¬„Îûùù´¾¹¢^nƒÝÌ]-t5–ºÜs•Ÿ¯aÙ¸}Ñ«{Ö‹ÐÿKÚö§g×zuxÖ5@Ï»hî:úÅ åy¼%á@ßÞø ZÌŒ´zž›2W¹ÉaVª˜ê…ÂÕݸ|¥ÊJ…Pì+ÕÎW+oO ø@ågÐß\­Œ:ðnÝVND:ÿçÑ..èáåËVJ´ D×Ï(]—êNy.o&ã%×Ðý»Öý€û²1ÞY»Ûlž®¾ ÿÏ¿ýØs´>nݽÀ)Z™jÝí¬0R i4 7󹵈ža¤µÖ$ù)Í/eJÅ2²Že¿s7LÕÌàÖ~wôZܬ}÷IÏŸÊT)¤ 6s¤Z)’è©Ò Dv·žñéˆ9æ_ÿ*Ñ4´Ü•²B"ÙÑÙMsS;€™€!@У†îÿЗOÁ"Ìž(, ‰~ƌÜl6‘©{Œº2@¨Ó*™V÷È®hª{Á–m–V!ä±!Ó¥˜Õ¢Pëa´Ýäœ=–Üÿ´"\‰dŸ¾AŸEœ”˜ƒb©hMJ¢-|vŠ™jÙÏèÛRà Ÿ²…5,!4<Õ äbÌk»‘0À JDGœ K‚ HäŒ|‘]Z¾¥ì€‚LôŽ6û8Ñãtâ$"€/Ȇï~³ôa(àƒ!fˆsº;Ìe%îÌÞ“^`N7 >UzQ”…²ìŒæÑzö´R`ŒJ/Š–“×òÍ4 e&K`>ÂòNZ*˜3çé™”ï\H,P63geï©V8¨Ü¬NJÑ™ì™è™­ T„Ug¥Yœ;{‡ŽÈgÌsïíØZŸQ³«,¦É¬wõ” ‘€A–´H y¡ xŽè0€¥¸¹;˜""õMµêa‘…âÜ£NÝh@SªT¡©jô„ºfFÛ Q0‘™£f“*ËnÜ;Š[!{*5?"|1ô{J;D& §§lR“’ µ’ÅäþáÉCŸÒ» ݪ›èò6ª¢RÊÞFg‚£Ã PÎMfV&£{)tƒ»Ì%ëWVÖ@€;bá¢Êó0z¶©ÛBçÊxWH,¿P{Á;>/½áiOx{Ò÷Þ\:^Tƒ^é ¦ßpÿï(ÎðNùG÷4ë¿Ô¥¿GYë•øÏ©Ó}^}÷ÇÏŸ?š¿wYùOq¨ÞRÀ»‰c¾úö —Ý|×*›_ñË¿þC~Ù“ø-×á´ø×‡úµúK·}q¦ÿ]¿óò‚Pþâÿ:ëâÕoS¾KbøGÿP›,æó–à•O_îñÓ™ù‡_ýêøñ¹Z´–=æÕ­” Íi» 7º»ÀÞƒ‘$át³²Û j­õÞÝ=áîûOÊ© ıIÊÖuLJ–YŠùOön¨…íŸ>foùagS ÐZ'¨Â‡3Må.÷÷ YаC˜Le‹vìí0£{"š±Ó%î¤ÌÊ䮳 pŽBK%ø{GO  ÏÀ1Ã]A:A¥0°ÎBÒ"ú(ÛÙd^KÌ]iûŸý$sžÿñÙd’”¡Õ£T@苹¼™‘Hfzô0"º©5›ê7CŠ%ÚŒL:™CzVôVž&1£òÓ3žŸ•3¬Eë6¦UrN!é„~ 9-S{“¥ .–YCké|ˆ”›fä˜9ÕÝ}?ÕÇB%ÙJq÷&ƒÓmçlÙ…Þ²±a>t± –‘š´£¥ËÑi:¶ˆQ줡 OPªÎCW‡6(%ã€îQ^é¥ÈJ’²‹`Z5d频€¹{Dö æ®”™Ìn™L™OÅÜhf^Q\nô:7™ËKÂÑ)¯ffîTvšÁÍ]ÙZ˜»›£¸¢™¹9ŒÌÖ3:•€*2ÆÔ¤(Z¶d–¡üµˆ˜AÆQhKšŠƒð˜›¢+[¶N3æ»ÌÈÓ¾Fähr¥` CÙçOÙægã< ª9T’êÈ€"Ñ‘JÂd…þš‘,VhVàÕYБPyòò´ûö¯ÿW@fì‡=`Tµ TK©. Ñ‘4ÑL!µˆÖÕ¢÷. L>íwÿŸ÷Ðx}Ò¬Ì{ÞK·ÿ,äïðÕÙ7Åoè€nJïŒhÉý|„·ý‹ŸXÏ å÷—¬n=Qïu<„Ôõ¶©~ËæÕ¢óïMß.v½úzs|EèåD`M¨ÇmÙŽß7‘\Ãóç2Æ«·ôƉT.©¼FÚ¦ä#Á‰ÜÏu‚~SµÓu{ùØt‹ ؆L¾K\c¥qçÔ»³ûÝyC<º¯wv= n®¯ÏÙâï•©_lv¹6n_“eµ~7­R\Òé½ F/ít¼º—WýíG*=<µøè¼^1s©›sð‹„×ÂÀßãâúíM?ˆ3—ˆ/ÅLê}B¼ðÞt†½V_ÓVø‡Ÿ?5Þxwü"oð†\þà9y³äï2Ù·jX¸t²¾ È?½ZS¿ô·<(èâ§~픵 ¹sÂÜÿ6]w»Ü9ø–±~÷ny¢ºÕòŠëñæŸ\ùãN3„^äƒßUb¿v¶½*‚¨\…Sºû¯Jîð¦Îq£q¤ÏNtG‘ç­r@Ÿ€ë Úx¼Yà禼Gìþ?T"xûL¶M\õôÿ„»xŠº>ÈqÿÍ ‡úî7ÿôí8+Õç93m`©Åën2·bFc)Þ• ©ÅØ­ZNû¨ãq–”)#ZfõbÆÔð°UF’(æI¨€°TÏ‚,ÿø;ÿv—ՙᵊb$[Ïì VZd ¬ž‹x·y±ãþ¯€ÈaùÙçTfs[ö>˜îA“{ZAb†¨R!@ %X!‡•%óº”vߢwäŒL„Á\ƒoÎúåR2!d›Õ¤A Ìñiš¨o2gØ0>ºÀôDºž7¤H ¤ æne¨·`ÕI‰(QP Teæ"³(‘N¨\ôg`Fi¥0z”ZÍZï©@¶H«žD̉•Þ‘d P&(B† ˜c(¨\öºñ'Ü-åB‹ÌE¬F€«È!aˆ1È'è `ŽÖ‘ ¥29l 08 +V‹z)‚ÑœVès˜Óêè$IÃP”mg”ãt6™;E›6øÙxúé·ŸnFg;v:•¢É,S‘åV½ÍGEÒ!dvØ‘Òì‚9£2Œfð|îÑzÎ3»]aæáyî=‹ènrJGÅáPÔz;@=gÿБ2™]ðÅfâ¡DAܼt±‡P>UFjîà˜Ò=3Zs·OûCäôô¡§ª¡ì÷=ÌTjmó¡·îîúœyTmŠo'ŠèÏÙŽ˜‘c¢#plp± dæ"ŸŠwà˜aDqSÇÜ2'(Ñ€ M„ ötG‘Kés CErƒ:蜓 ¡7033¥¹{éeÈ=óÊêrŠæ»½•"h4Z5&Yh¤ÙzQ¡EŠ4R!“Dz¶.ˆž-]u9³[CVˆ¡iÙ»”R´bõ.Àоp³35ZJ@f¤SFÁk†iT°F1+æþü Ü96Ýl¥†d[¶ð숾œf°BV(i¤ÓF+nn,Y k§B–©üìßü¿úsóê>M‚e„-¥%Í‹3™=²¸Y‘[ö=²‡ZdÉRËîiú·‹òÏÃãOäç&:`ï„ÀZ7|ê6^x :ô½bWÏ狤Íu(õÂá~&8¯ ¹*\ÅzE<óŠÌBÁ×:žx9]| ¸Vï¹}IÒù}œC¹¡ß¸íJàË`×Û0=J†ßév÷—Þ˜>/?oë§>Í;]7èÒJZƒÛÛµš k“? Ñù/ý_ð}™E÷•Q¯°UáÅ®òÕ3®^êõ$X72lgéùç"ªƒ‡Ê<·ºÝ7øÒícñÜžþ @’,:‰üŸÑÿ•˜×…2¸¶#_'º¼$A—¶¦sVt£jY°âJÔŸgÅtž4…°䯋4›¢ÀIj¯ß¾ÎµÀï2$׳“To.¿i(D #o=Xñkm¼+û[ =\?—õ7”^ƒ×«bݹUí©Që|ëÓÇ›Ñí@¼ßꦪqW(âN½çVr §Þ»u¥ýr@ÞÜÖ]¸›·u>uópÚ죗W£Û0…ÛÚÎ î ·à§–¶4­m ‚©›&«Õv3†«i­;Øì½Hm%1v?YŒ÷ ëwú€ÄðXûÜk Ý€B¼=‘ôB‡ß Sçæ,¾‡ÀÞVÛë)ñôå}ÿóëkltï/çº.¤„GVç¦Á{*I«ÍÿE±NÝF†Ø°JoÊf§xOw¿–£èË–ÈË,ZíEºü¸]¦×'&ù¸j»A%Ý­œžÏ§³~Üæºwë!ºÖ¼Zaõ×a·õg]•KÏp-Þ%]”"××ÓÖ׺ÞÊÏ]Föªû.1þJ@æ3b£Õoé®êèêè¸/þs[É[a5Þ«°®Ç„¯¦z·XúÕ®¾Zï¼ vn³KOèU†²NoŸñ6Ò‘ïÆÜëƒ_zKcìúu¼]èý…Ÿ»ž¼ FÜsÖ£<‡‡¼2LZ"•%@®‰´.¨>N?®&ómÞ~;zwÇsý·gé§Û‰ÄësîÜÏÛÊå%à7•&-Vµ¼È `Kɼ/–Hé׿ùõáwŸŽŸÙC)w—@ó²ŸÌ­LµNÓÜ›ûââªLCI‚e˜”h YC™= ”H+–)e„Ûˆ|3 ÆxÏã1z¯Åk ¢œ@‹p©XùfgB´–´|îèaµCû‡è†Z¤2ƒéçgV¶cGk1§z ¤~Œ„ ÷FJôHi ‘ìC>ôå0‡–†ØKfh3’ ᕬnEøÀß/ÒdáæKvïJ$<$ƒ$Ô°#að8ü.ŒC ¦‚?õTùî7 –CŸ›ºwäó±+»2Õo2(7À]¤eÀÁ–çó'32RƘº‘AW‹€HRáNÙÑ;ÈåIy° JD@~Îe@"5€è   v+‰Ý!D Çp`’å †2Ê‚cñûõ…æŒö V–b̘þ£63Ì``1/F³PŽ«ÔÊ2¼›Uº“©Ì;"&ô¹ÓÌ*)A3em«R Ý¥€­>¨,OO$¦SfD&¡˜g'z?À@pnÇRÊ´³œGK ܽ/–= D¦Ä9ÚQfæ6n&G˜+Ѻ¢Ô•ÇCFCÌC†H¦hè SZÌ¡Ìp‡M,(ÆZzÍ®tYÂÏ  3Ò‰™—ý®Ï½ªÑI†—h Æ®ƒÚñ“gšsªM`oP2"z/Ñ2¡}á !ѤšîfÃØY„cGÌM=5ÞÞ™4áÂä¨FÁ@–H‘âqvANødH£Ü©D[" KÈz˜j-û½O@“™X…»¬hüÁ~çÓΪCÈ3z-ƒ H=d3 Z°âÕ$MHIeòì23AˆDOšE)¥$a£ˆ§aj Ì΋T‹z?zuJaF¨C ïfÂÊÍŠ¦h­wº“h}¦Ë‰hÙÛA sK…ÅØÞR zc†¢/›‰tŒN3€TÐ@7ƒŠdT1+£:b•©êv^ë/þ·ÿ7$+F7A¾«äÔ[Ÿ3Ì'š¥LÅ3ÓT™ч9Z0B1žÂÊ®þÛÿÿ½Å3®A„m·hnr+{Q6æžè½4§+ðäQ¶>yµçpJ+½]rŠ»ð×BÆç(k¥ÇÌ“âÏuf­qhÞ ®â«³håY|ôn²ñÀÔÅrg%šW!ÑÐÍ(ñ^eâý]Ø¡‹0ñFÏe«÷8ŒµWœ$ ëëPk´e3W–ŸY†úò´Äc‰"¬Ä¡´Å)Ï!øùVuÒê¼.4qÝÁ² É.ÌU]~Ž‹I'H›—ÅE }­gµæOi• ®p»kîÒµììuø©»ôòÞ¢ó·@jPßèµQußþÍ&ÿxD¸¹½ò{<Ò^Ïœß_UÕÝ©Óã|Zž_òUν«w¦û·½ÚóHÀx_äk¾V™;âÎAÞÛ.ßôð÷ŠÓ×9îk¥¬oô¿ÿ¢y‹œó·ñÉ;¯ÅeϮۀ÷á§¾ëGõE.ôΡ—0à/ûÜúðûü¯yÀÛø¬€?ÒÏ;ø–¿óuÿz|õ¿?÷ù(äá¼BÞ9Cž×ªwš ô:Çm¹ók®×ßCÀ[†ýúgî5W­°f¾ë½7†»êâx,áúî¡~ß ä÷2ÒAb‡—¦Î-Ÿ`EÐgîQ_a÷SÀBºÍò×ÊÃeeº¤³ÅÅ•Pïuú’øŸÿð÷fvøÝ§˜»z,=¸>X²°bt—ÑÜ ½‡ÜCÖÇ(R=ØÕɈ€B¡”hûÝ=” ©gHi4YV ʘ{ÌÝ¥…z÷ÉøTO˜*söÞ?ÒZG5&ð±Iˆèt÷]iÿ÷I)’o )’9²E¶¦6DZe ´˜ÌV'˜»™ˆ>ò#‘g\_pç¡%“¯x„'ä@"‘ódõ©þù·.S4«2é™aI•i3˜¢F!M6ôñt@‚ ‡!Ä"ª“$M)‚¤í¦É(”ˆÁÁÝòÂì-é•´ÈtºB‘=)™ÌDdæ¶8@R3‡Ä¹71Ëd‰4À̲'ˆ£MÃú²F"á–è±ú‡}3¸Ðùa ¡;°À‰aÝPŠX«‹ÄÐÐ>BB9Tj`;¤c8"˜¡~À€ ‡¸W¸#OM ËÞ‰šÊê{X¥1{0EÜçrœ•椃÷ciFE @ ú(–¸e›aŒLm¿Ÿ¬IR´ÖÜ}W]ÊŽ”Dô.ô:~‡™uteªqvŸJfg>Ï#(’I+…PûmD‹~œÅØ:D?´‘d>R?.ŽÁÙuøg'v…6‡”H„WzMIyQöž™ ÏTMá>™È¹3Dª€ªž½Ãi4M%#,›e8f‹–Þ-30ð˜9ü|#¤`1‘“9Ä.1,=X¦HC?ÎaPR±gOM¨v<Oß|û¯ÿÍàògKzX)åÛ§Þ"i>í¼0S"‘‘ ddÌ-[W‹²¸ûô´û·ÿîÿغñFY|á;èÑAöE3‡Ž¯uèëE«Ðý€5CööÀ_±CÖ•€ûÑ—>;®á áýëfõecÛÇ‹Ö÷JôæØiUïùBðågµ œ:p7 !ß• º0à^¿€õúÚ—ÛÔÎ¥üW+z3{UyåëHŠýsøð«ýð Þì‘òè¡Ïª&×ߪÏs­Vq㦋—ÊÃzçûßô»|eÁ¾ ú¼cö–;ðøÄWðŠáæ [è!—öŽm,u?èÉÆ‰_ŸÝìQï¹ä[ô¿^`mzµjÉЫ€µÝîÛV¶^j•=/!Þ_ªopàç£üŸ%oÒÍ?!ýMÇÃûÔðŸ3óˆ›Øé œ­L­fãkZÈKÝ õë_“<|÷<:f‰^‹¹•R ¢î*ÍS™ÈôP"!D‹²«nßUJefôÒ }n¥–BÃ<·¡u£ÌT9zÈÌ9Ĩû©ÎÏs´ÎÙzFæ."1íi*=uÌRËñïþÞ 2%ṏ¤€ŒìBëíê‘mŽÃ¡’€¹‘¨Í2"F Ùɨvˆà‹è‚Žà¥.qkÌÀ 8 ô½ûn¨zr¡ fFæ\v; ñ„y«!Ô`&˜ƒÆ 1÷'$!3W ‰&Jº]Js©÷l2ÒÜÁLdŠÑçÖU¦’‚:æÞÝ&‡]–Þ#ö»9К sKú´¯sÌèV‹751Å~±6ˆ%$IJE hÔBÄ“¼ªƒ ¿–âÜ Yæ˜åén°L #H@EÁ¢)TŠ…Åœ7`7ˆÌBÙŽ$ÜÇN?8¿AfZ³BšyMêL¯®1¡ rƒGacîň*R†Z4GÈZà%Í<Á¢„(va*½U‰’Кzõ8ÇìUÆt+]d‚{¨?õÜ êbLJRPÉD™z"’!t©ñ³÷¯O–,Kv¶–{Dæ®îsîêe0’à F3Qúÿ¿ÊD“D‚1bf0sÝU;3Â}éCîGæÞ¹«ªûô9÷1wÛµ3=ÝU;_‘ËÝkªU4ºCådT±»d§êQÖ±JäÜ…L+–¢™Õã –°Ákõñ+"E‡;è†C-Ñ™in™ªOšÓÝ̈C"æÎòÑ-HIp9 S’Ñ„L0–~•SXµ\r‰Çœ"["´dB¸Q”›e&“©XŒ—SŠ6wáŠè‹o¯²gŸ{Ÿi¢)3Œ…fæX@Ä©•=3äE)¨SR.T³vÕIÑ ê&£Á!—gq«V*ò3˜u´â8üìOã8©V/®êè½ùaì=`†Œ6“WkÇ©G÷œ[L-”¢±V¯Oã?ÿoÿH¹îø½Ôÿ^ÞX+ùû[¢½÷Ä„K?Á—Çú†§ñº°¸.7~Ú­ºB7 €7÷;úb‰êZƒ#ß?îûÄm`O_º&ˆ|­^aÜrK/»7Ý"µõæÝ¸ìtwDþ†V®™.7‰_8âÎ]yHWS`­ €Î¿™Ì¹OpE¸t~@P‹©?wí_7h§Ì5½÷œÊ:™xo´ÏÓþõç³òZ×y‡ËË×^8§¨|ÍŒ¹”¦5é>ù uzÝNsÞMÉk)?ʆ7¤Ëeûú¸ŽÙK÷Ö©'ÁÖŒþ øBçÆ° Dçœ¾Úæž¶K<…À«[wnÖnæx›u½~ç½rRnnx´—¾‘5êd5ºåp¸í´ó¬(OÔÍȸôKí`_V‡[[º_Îäâ[®­‹ÏåµÁÕÕ5p£® 3Â-kb‡‘²[õºçáNÝØ´ûÛ9r{k¶ƒcyël»j^i–Óý«{¿¸ ¹ß—9³—oZãÃõž fuCOÍ2ww…¯Ø`^úì´+X¯çȃ‹}5Û—÷¢¶c~¼Ä@ë˜e&ÜÃîÆÅ+Õøºg|½ún&_‹7ïÇíiÝÝq<í¡§¶¢ì¹aq“/T®a<›âC¶žó'ÀËêMx³lêfvîá¥ô6.»­Í½»A·Pü»åoãv´ÂÒÄÀÿz¤s#Ô߯¸—Ë Ö@.ÝŸáÖ‹áFÿ×圵[`¿³~é>þ¸¡épgY¾4¨R¸s'¸á)­V`â]ýE÷†;×ÛS¹­\y‹é®Üé^¯ç#ˆÚ™rz¾ùܬWï+ü¿Ä&¼{{n[ºûÁkïê+×µ;wê<÷þsÁož_Voªÿp"7«ë–«€{Œšû;ù:蕌ÅMWïÍ.¯·¸7‡à{Z¥/qÞÛÇ{_v¯íVµM íçÍC½¾ÙÎsoE‹ ®ÉÎ…ö³Rÿ¯”Ižßö+ºîªASy*À§ô—óŸÌý忎©÷yYêP# ê¡ÖS¡ ‰~:„AÓøAdª¥O=Ú<ŽEBŸæ„|æ^Ý‹!eFÀ²·Ö¢÷><¦ôŒ:V8ÏO*µ:²ç0`ž›¹ÉÁL|j.äwc; ´¿üFÄiX&TDDöscôh¡†ìs¶™¬(»YdC7sËlŠ\œ9¯¢ÿÉüö|w °$Ì¡X¡ŠHxÚ`6Žò#æêxѹðƒKÞc1³¥„Žì ƒ g0òäú© 9iDyŠÁ†Ö»šêHÍ$„è‰ÌD´.¥[¬weš ± ]´axd¢¨¦W;>OÕL‘^­#(ÂVÓB–ŒH Œ€!ÛÉ¥À ÐNS’¯ £uˆ§)¶p„à§¢,s°€ÅÌKë)‡; Ãqš³gq <"²/;ƒ';BPB„U8!;u (%bFÀ¾,ήH¢yõ%ÜS.UïVž-%™¹2é–Šhyaj† æÑä£%ºƒ¥+™$¼.€$Ð 0#”±ÀßÕæD–añhˆ>7IJš"‘15Eze)–-…„I@‹lÇ0³%ש”¼´˜ãØ©œ“‘Ñ› ¨†,„L$è0Òƒ—ûà•Ų3„©‹Õ ”º†|Ž8º»Zkn޵ àT,¡!cÉç™zïd ¢Å_× ÿü2Õnð·= w8‡—xûD‹Z¤gíš#®müÎx]ÜÒ@Ïõu€tÑ47°”JêóÚËÝó sô¢|ñå–r®.WÐoÞP”/àÅ实õIBË2uÒy¦òf{Ù—iC¥Ù/T[oc¨•uzæ+¸Óz+v n›¼·ÂÚeMc—½@.—»1ê-œ¾˜|YÙ%ªÞÂ"µ‚­Eƒ›í7¦µÛ©¶Ýú¿·Ðù7#ü ôé<ût°]‹ÙK­Çƒ±óèÐ{ ¡k`"Û©.ܳ‹½[&òô“y;†´©Š;çvNótVðú»=5דš7®¸z¥+¥m÷á•Kùÿ~µ•¯ùƒ\lxÖ+¸¯fîãÿïFﵓàgïJŸV>ž zßæ“›‹º]pÿÐx/s>Êo!¸—ôÚ-ÜûÚýb`À-•î.1øCêÞïg×ÒðzcÕëŒ)}Azù7R«ø> ÈO~ê¼Év¼ÿ¡íåKøeÃŒ?î~ã úÒó¼& ÏP¾³1tC×Ðð®©s¿4ò]s™ŸÃ#ä¿ë³×ðÊHØÀAOéƒ@ôZ:~}º†lÛ€=o‘pFºIUlãºýg«Îï(ˆxµ è+ÛW:¾AýÈkæÐÄÇÍm„rW;òP*_g­õ…Úô+ò;Ú@â=söͤÊ7Òý¿Ýå<îî½âhW׊6¬HÀ—ÍŒ]³Á·™°Tô>O3Sù—bîÌÝhe,u¨,F3™9÷¹x±Ê¹ue¦péôz›‘iÀ0”ãKLǨ¸e¤æ†Ôü<Åu(Š[—gäáÃÁ1È ½`ÊCíÓœÇÉÍYR6Öv°ìp«6ýÛÿ`Ëf‡¤Ð3©´ÌlóœÇ)ç®D*R™ŽÂ‹²±7*弓,àâ™ O¢< ßr1ÅÕµÎÝ3X… ÒÝmç8Zš&¤È— 2"ˆD& I?°8‘sF¯úÂ**9EŒ¥>”!³£ç\¼¸sž#ÃH†©Í@wñEKÍ5˜=(ƒÑ]½ÍŠËå}ކê 0$îRf;žhæRpCt@ð¢ s„PG° OPÀF”ÈXlÛ@[JõM–‘ ²0 9Ñ•fVëÁKqõ#­S<ŒO/ó KBˆ3pIçת·¥Óã`4f¢°"SÖRNž€…i…Θg‚Åk¦ÌA02h棫¥F ½÷2Ž¢Mf43`¤¡ÇÉâUryyW›‹ßÿÙÏŸõ2?öBõ®Þ ÀB6JÏÖ²7dƱC/½g8CD$¤ä´<*Cj2MØR]8"Òœ#ÐRÕÝXB®4%vÌè$I²qiZH§€\Y>š‰hÏ/I=sD0XçÑZL=(Ízh0cêbI¾°%™¡ˆ˜OKÒK¨pÊ9’3Ô¥©R)´„¨År{$ Ù¥&èi€4–Qœ9E–Êj\”wsƒ—š%;Eöâ ´E‚¹ü€2‡õçbtO,6Ž– é’I'Ý¡œ§ô:dDÎ*P Q†ŠTD:ÉZ¼,m!¨ìx½®yK ×›ÑñWi®Œý“¤«äÎ×%¼ÕðN­hó¤Öüˆ;3Äý¾z·o:ðÀï[)øÖ†ùdpÌuU÷èØªØ»?w©ÅÕ7Doý^@ç±±ñÀ}ÀMåÓZ–½•,øûˆ/Ó¦v Ëö<ø®ÍÒݳßþ‰Ü#¯ŠUué_ nÜ#V®p_¯GrSxzcþAý ñõ•¯•ëÆíÕ]â­Ñ¥ôxœßåLÏp’ߎ ö‡ÏO%|›öÕ©ý³à+å{½f“ü»ö_{ðä·ãÏðýê=ÖÈØi½y=›ñ•ÊßO%ÔíÖ‘ßèþï/î<…†eWè¯ ì$­B³íÃYUþ|“ˆy'iðº¯ÓÒOùþz7Æñ1õ+ó1?ÂÖå‡g~Ò‰Èos»ý(¿íŸuuŒÎåi×iûø÷2!)ò×õ·õ‹_ 3#‘i´È(îuËPþ¹ìJÑN­0'éSëI"BF2òùóÑÝê8ÔêóÔA!z7÷] æfdŸ›€:ÔEÚu`j]­Ù±G„}göÝÁ#ÙzDZ eÍZJÓñßý¯=Ò LæJõè­eŸ1GŸ£ÏGµ2Ä"´-E—‹?æÙ¤yJªð\—çŽ_‰2á ,§¢Ã @‚Vá£qŒh/û,œÃ0HÞç°’ê=3–~‹¥ViáÒ ÀµȬ° ö·ݾÿˆ‰DzãÀaz¥¸µdb©.!#3;­/ÆBh>NÅ8¥˜={OÂDµÞÌÌ ^à¦DôÞ[)KµLà츫ÄRuŽ~‚šˆPG„€þ¶ûw€ð*€G!º’„»¹¹Õ§ µ.WöôªÐ$4å’‘ÌND År`1û^@¡8ààâÁ -âc¢+E:¸|ƒ!rÁô˜U]"ÚRZ±âZ*—Kè†hQ‹G{ƒÑrRF÷J Ñ@¦¹—â#ç¹÷VFfoõ?ýEŸ›¹e,ƒÁ„#žS-¬Œ6Ï興ê*¡PGk‹&dš{d—ž<Ú¬ @#¡JU³ib%¼šÃÅ:¤À¸LN€™ƒ0™09g6g!Ù¦îiŒÙåeæ±ÕÙã×]ÖÙC(¬à[¤ibÉ,ª½œéb†˜HCuƒg¤t˜€)³…ÄŒP±%û€H„Pȹà ‘’i”ÂjЩZ¦žÂ,«%À– ÷Ÿe°§ïÊáP¾û9ÇïzÜÝ£×sSœ{Ó¢“Z=ÈÆÅX!¯•dš|‘¶ IF ÝÍ‹!Ò`a4#L! S&Di’‚‘‘Í H)» Š 23Hf%Œ—_Ieo1¿aÕDdo}š2QÆJC*¹ÈsóÜݼÔbFº)š"Í`£Ú“RÓg(hv‹0+惫”¡†‚Bº»¹>üñÿÆÇÚ§N?äÔÊáPH­5“X£-d )[ïsïSS«^ŸÆ§Ÿ}üÇÿìÏ¡\£é Pá½Ñ‚~P£×p×úiã£îJünEÜne¾)¦ k^‚nŸ›´)o•^é ø!AÓ%p1Y~ϹÛ—çò{‡?Åx\f—•7¤šß èü;ö/×À+ $¬Á×D /‰›Bú/Ÿì'ƒ†Úí¥ kSëÛŒ§Îçsa¬[À¯?sÓ|±*ÒÚQí-=j]y~Ñ 6 ñ÷;¬¥õà•Ö’¿¶t’Ëþ†—¤áÊσwÒ“nßç{q¾…Ú0hNJÚe ¼d ­Õî5ôÕ ®gÑ¥G†×§ÆwÐÛ.Ù•Ñ@¼ñû¸Zf_>hn8ÝTÞÉÿØP îèh·ÈþÃþJ²^½y_„Ìó8åðøv‰òk’ïNâè|;Ïh½œáÄʶqo»˜iïNh-ÐÞÀg6#òâoÁ7/ü¾áh7ßsoR»tñ¹}nyq_T»ã&Ý]¬hS×k½®nï8Vèªó©üàÁ³É+¯¸“÷ .÷™>m Q»MH·çsÛl…«vÖˆ÷JYÛZbí<â‹qù¢j\HçGsÛÎv^Öt™O=“—wÃÝ›ûÁDYçº,h;Ñ·k®$B>Z¹§2óæ)lž¨n~~wWp¿Ñpó¾Âý«ìn!á~cE„Ù©”_“ÔvCÓ7’?;P?¡EÜŒ±»k{—õµöú÷x§9ÞÔΈ¼•m '_&hb{ë<ï­}oãZîßóÝ<ÁV»kèë.:ÞÓánBà FÛVÓ»Eü¼-"×Áß‹£1ø—êõ Ÿ÷Úp‘´i.¿½ÿë…å†l³ ¯áë$Úm¹Íê^­V·¤D¾'æÖ*DåÍõ®8H»ãö&Æ}w÷ç…¥WŽÅÝ¢Œ7¯åJ㺄Á\/¹䉸‘½‡2§¿ùå_ÿ§¿‰Þ(ðT¹Mw÷a`18m(¥”R ôÞ3j-–ÊŒˆ”2z›"Kõâ3:•RÈDëÑ»e¬:NêÃ8BÙçÞæF¨‡êX½JÌ¡èe¬¥xûÅgûô"£çá0O} ¼Ìí»žjÿ×1¸ê‘Ù’ѧùyÒ4gôèÁÅ 82#–Á#S €/Ë;ääI‹öÇ 6B:ìl‰…+nKì]  BÖŠéE´RŒNûü=I!{f0"%J4äÍZ!Ó>üÑA@k½ÔÀB ïæp);{r²ZÄ´,žJH™è¬ Ô²¸>r·¥Ê;#•¤äª½‡@ ±TSXiíø2™ÉŒ(pÁÝåt± C,/gÃb|yQ/ 0Ø(dÀ¨§4I) ]à¤0Ѭ´R†…UÃqš¦<ÊXjId›6 ¥ ÈéØ^ ¡,¬¡p!Ô1”Ó^ÛáÅØ&™`2!p1KÑRN+´Ì.2©¤ H »R÷ƒgxŸ'ºYEéw¢búèÑ)DNÏV‰tņŒã4·T,ˆþyzþtŒž‡ïöT ÒA0Û\ ÕÛô©iéOPNM9xYœ+2g°ÑeІ¹CA9g)bYò4žâ'²B”H-¼•­Q³t#1 >T&½LsȼGB’ÌQ³W´>Í(¢YŸé]&‹¡"'d¨KGäà,àâä}Þ./i! ¾X€Ž¡°Â^ZôèЦ…ds˜É*`PGq €DAU²á ÜQŒ^á)Ì-4ºªÙÓaŸr8`8Ð*X¬êb@Z9˜JÓ™¬±|Œç v¯Å ¹°›Y¡‘Rú@Ò´€*JƒÌ¤è™=£I6D7$•½Ï™a0w™êfy–ø ¬VEIJÄòíÊÖúQ ÏJ²OsJ^™Ùtse¤ÂKɈÞÛ²0R’²ÍÍpäË’”¡qd?ZB¨´´á£ÁŠÂéC*K¥¬>Uu”ƒ}ÿø/“Ì„Ž½<Õ|(ŠŒ”ê‚ׂb¢™ÙraÑç6÷˜ZÆYý?ŒO?û¸"C.ièÜ?×Z‡øP,á=Ÿb‹ }îví9¹ÙÜ0WBóy“qÆPcƒ>]Uêí·ý}tz"ÂÂs¡ê~NÀ‰ëì&”]ÿï&„xÓ›j(_¥¤ëÃx\²²î*Ô¿t³£Ò5"¼j‘מ†Ûwýô®z‹pmeÜ⃄™./hàKD´‚ãKWT×'{Ë]Ý>êÜî×´ë­8sÝ2r5ŽoöêÜl„¹i¾¹á«-ð›­;8ã«r³ˆËgô;¹Òçþ@çu¯à݈§ë_ÑŠÍÿˆ|zòƸ^Õu ÝBo6á$±Üí4 ì1ï’—·ºÓ­øåB¤µ.y;NÎüà}ÂüÝŠ»âP¯¯kû,î![zø€Î~#÷O³lô¦[¥ñR¢~ÙölZ¢îJØßCáZ@Û6vï‚¿® k5Œø¢¢mÞ2ù7šÎ¦WáŽä´âø¯¦ Å€‹Åä{–ñ}rÒÄʇRÖ­HõÝ{½ù]{rà½?Í·e§¶à SÅ?8³Ì·ž×ûD_,}i*ök/øÕ45wdüˆ¼‘ßøµ‡úÁg,}Ù¯p½¦ò}ä£HÝýÂ;slzcxO.guôu’–;k움úç‰:Ï´{=;:òLæžñõÃ;û ç6À¶ÑÂ-„F_7©_ÑÁ¹kÔ£áý óú•ú÷‹î¯›dÀû÷Z_ü‚æûÖ­×Ó¼Ê÷k°ä¾¥ÁîL\¥ñxÞïîó‡ŽBý€Å_?d6¬ôý/Yí‘Þzàéƒov<þj¾/W«÷/ kÛ=ñÍÂI!Ùx~ß§ x3Èy„…øõ_ÿâ?üõ_Gï—¡gÆ:T+f^|(^¼”R‡bæskä‚1¤EÎ>Œƒ3 ëP"}¦ôü9 ¨cäÅ£:§ç²OÐP‹zÏ6›I¡|žñéCɧ‰ò4øPòÓ$ªÀœ&˜},„áÓqú÷ÿ>Π Ù#æÞæ)^^4ÏZÄál ·ä¼Df˜Å9T–¡/¶%ñ±XÝ.ê9sÐN(9dÈ¥ €€Ê`°…p.ë‰b4DiÙe¾`Ï“4+NXfSB’·Áƒ]i‡?ú^Ó/_4Ù÷?‚ˆÃè4S: £U¯V˜`dôÖ)ˈâ¥Ï™]¥@ÎçcFϧCD;¡Ëa‹M¯Ñ\Ñ3 ½Öj=¢›ù<÷èq&©&€ˆ“aÁÕ»óƒXUÔX-<‹íg!d< ÀJ4øÁPçi®¥ ÇJ©–ññÃ÷3×Kkv¨Õ½Švì/É4š q¨®òü|̘Md‚†4,©ŒBgÉé¤Ò½Å8rqF¥™`dJbf#²?w%m(#3Û 7Ðü’,îfÙ_RÇ¡Ž1GéQk1³Lõã¯Æ§JCF‹ãsŸ"i^FȹØù¾ÌªèÏMMµ”iŽ ™J¶.tEO—!QÁ–RÒ5aDr9}«‰H6 Ý«¢„t„R9÷ dff6 }Žb«w4FS¢°Í‘­ãA16ôëÄÓl%‘JOƒ FW傽GeGæP&*Y@#;³ZÀ`š"gàE½K "àKý¼@;a²¼œ¶ëè(@%ih&#œ,"ÈFäg³¼€feÈ*Š~÷!ߥàe`y’»Õ‡’‰L§SŒn½'äV­äBqòƒ›[o ž,LhÒKõbŠ“ k&º”©‹Q6 h3¤lŠŒÉÐÑ€ÈKu°O“,OÞ>3fek}Tp A+Œ>‹030ÍH+¤2$² 3Ã2aVËòT'€s+µÒ(&@ª7ôåÞÒÉ:"š1Vhé.G³„ÒòÃ?ø‡þ³?öâÏÏS¦æçyøùwåpàPL:þúè‡Ñª±x }ž½øÒ³sÏÖ3gõüþC¦þÏÿì¿Âb'³z#-;éMÍd*–î÷u·ÌÆ­h®­n»;¾/VÓ{¶y|õïõh/µWî¶‘~E-߬=ôÆÉ›@™ðé§èSDáÑÖPÛrµ¾zåÓß±VÖ)÷õñ¿Ú¸ M¡×Ùàq#Íóµz‹/ˆ]Oòæ&€¿ÙO]ôcîÕ”üàa°*DÓZ`¾T÷\7z¿ïÐù»1ÿ®€Ý~ÀúË×Uí¯Îe=ôlý6Ÿ„–ÜÝúØþŽ|Ê»…’Ò·ð}áOÃ0ùŠ“ÜR‚„ߊÏïL?þ>¿3à÷äbþðûÖÙkÕñµ^Ä7†¡|ý×ýÈwëkú³õöÂþÛ—ÿQße¿S¯³ËÖ‹€_Ö¼‚oÐטּ#-|IKºà¯ÿê?.|þÅç˜ZöÌ‹[q¥x«™Ã¬Ž#23#ÂzdkÍÜt™ 33O ô¹”Ì’tC)¥˜eïÌ­µ®iîs+C1$Brî ¢{ÀKÕÓCñ♂){hîyl/ÿþÅb(¬ôŰ8²Qì­åÜѦ)[gŒ@ 刾xòRxç€:ÝÜ:œwžÄÿSš@`ÂGœ6N:`HƒÊÕØÝwŒOÕK™æ‰žîŒÅíô¤{e©@iD•jÖÉ s2)³@<£ÙÏûñ;l!ðô µî^Czq3¢ufÅŠ:23f)³F)6VMGË =æôEXqgï8>·±Vô˜¢×a²÷0óE5& m /8a’°ê¡²-¡sÿ5‘‹­%‘n´2‡ÙX J«…•ÃPKSÛR/O>z-°_÷_[Éxé½OBe``¨Ã3ҽݦ!gåìˆD©Hb1 ¤Ô£ D&¬¢áæ’¢KBF!Ôg‘mÎ’£ Ùžû±—É“l>Èæ6ý:^^ОêXzþõ±>êPcz›Þ~ýÌì¥å0¸ek†6•je·ïìø‹¹MrÜ=…<â%€„™² ¢å¹§ÜO%‘¥Z ˜”fQŒ•fîsë– ÐB59[¦G<ÉŠÙKö¡šJÓqŠñËÇ8ñÁP £«g’r‰3i—L$K±9·,´â6÷>EXMŽ ÉLÑ@ÊÉ—YÜ$ËŒ…ÆÁ”XÈ ¥Â*hí,²é”Wë<•Ä`Ó¬‰%‘= Á?Öñ£×1‡Ñ­Ô„ C,a *NsCtw ÖÞR$Ü(ÐPJÕb½™‘ºTÓR©tsÙ;¤í„ Ëh‹O°"h}‚'Ú¬˜ÐæÈf´è ¬ Hm~þ¤Þ͸Hüæ‹7p'<æ”9 Ifô\ª’3@ ­.ž$iJq0ª(‚k…(IfZ¶ÀDuÏÈLùɘNº•¨€1LM–Ò6‡üVS­'=«µH†% ÂD+%6·T¢)„˜[›æÞ‚WãÓÏ?øÇÿìÏ7òá 9ñÛ«?èïæë‹#Õ‹ÙïO´ê¶ØúÇŠk/¨ÄǼ•ß·MüµÕB_l«ø{ÿ!óDßzt à z£;ªÍõ^R{Pޤ‚›í>‘+¢àR0´r;§‹ídV•÷©ŽS‚g§üݨ½ê4º9»²®Üº/Â\ É‹ÿÈÉqí½qñk Ææ&_­¼×·xsòÁøÞ3Ѹ«÷ºk‡Ø"tv¼r´&…ìð=6{óÝ£pÝ£têþX›_Ûš.:Ëo|}ùZó<Î ©S¯æ·€·C†{8õªÍŒ0@§¼!öÐ6û¢Ók¯û>µ×¾E~Ÿ{ vwãg¼Óµ±ÓÿµâÒÜs{y?¥WÀíNÈË ºÜTSî^ÀÅåú ·Ô[ásõå{åßwà½á¹½©º½ žo>w4’ûuë‚nÒ‹xݼù¶¬uÝåy‡øX×ë®z÷n ¯Í:;l´u{c²%2ê¦n͇î=èwÈ;ëÓµtw}; ²ýúÿ•¯—5æÔøxíPz\nÃÛæ½b«}º»´Í;”Ø4ï×Ü §ÍëxWdô5ºÿm3ßz!Ñj8AkâKÜ®ž~ eÝð‹v–¬ÛURze‘Ô:äm,mÙÑnYÄBÝxé¾`·ÞjŒrɬ÷M¯¢v;Ïw”ß7Í«EÙjªn§4l®¸›Y-´º­¦Y•Ö´µó¬Æ]î̬îÈ¢®MÕ[Jâ{¶îÁ]Ü~&‡.ä­­èHìUßìü»Ïn êñ ð•SÝ{P»‹ÄÛy„3êAÅÿ5®âyZqËBÛݘü_þͿɞRf¤º ™Ñ«£/…N‘p—±¯µžH‹P&ì²w™iV†Z;¥H¤R­),Àlš±¸÷¥{€¨¥ ÷·cà ‘˜a.7·L7/6Œ^«ÕnÌ*­ðð÷ÿóè*›”TtýØ4 ÙU†aøÙéŸJ:ÙÙ[DkˆÌÈ…üsQÿÿÉõç©[Êåe«UôΕlrù!ÞlH×èͳha›½eâ\B|×p…¨p´f¯®Úó.*ÔÍÆn»ñYo8¸ÊÎÕ׺ï[#0n$<®yÙ_§ ¾w‹q½lÃÚ[,7•g)ë’'ÞÄÒ÷¡×ëÚÌ•ºt…îð â©ú›˜÷â ëö}bC·ìž·éš=¡O.8|^*Ò7uÜKm1P|XØ´äKâî~|°¼½·×¬ÚŠæ¸¬ lî}kÏSS놛¿3Ðù÷Î;>Ú?Üh+úÕ´µí¢YŸÒÿô]œ¿îç¿ð˜pu¿Ö­XpÕp¥ûÕnçÅî!qîËÛªX\Ýå úï•æòíÔ+ªìÍw>Y·Ë”›_ä-ÃCçÝ‘a©S”xÇ׎v¶–Êï*®îl5)ìé¨o%½B C_¸'Ec½ o&ÓjßÉ–¸iEVyÐÍ9^oÔúryU¡®MçwØ« ¿…0íàÖùížû ë`è+Ðì«3¶ú¢‘}ÿ$õ@XÙÓ×¶¼oR›À½¼¯NH=N¡ÜÜÖê­ÝÌÁvŽ><±Ýíõ8ïTyoôkü¾'õÀ/˜¥ï,9xwNY{Bó#µ[¸álï½°YÌwCC wL’)@¾•]ÙMò‘nËÛkä»–È/æ½è«ÿµìáÞÍ'®áðeí¥¿˜r%{n½oÉk¬6~2wåÉze¸ë&À‡iÄGyÒuØ»IÙóÕ)ü£wl,".ˆüíbÀû¡ö /ûžWÓW9ò‘ñÃ7:ôP+µi¾~Ĩ‰ÿЗyï»óÊ¡×3h½’l²w;´Wnøã–áÛ…ŠS˜_vîUüU6ø ž¯îÊú_ªQ´Š’ùòésÌ}ñe„ô7ÿé?ES™ 04.…œI²¸¹‹ªµ‚¤ð2êîÑÂÝÜmž³¤„¹µbì=<±ÔÛv!zxj¨e!eF¦Ì = ˆÖ¬·JSfÎnš[D¢8ÌÚKÔÁdÔç©·Öþã4zE˜Sfïó<§>5v02Ú¸ô^6+ùÜ€w89dÈÄ©ÞÖà<¯¨0‡4ÀàõT lP§;k<¥¬¦Õ jå0÷ˆ…¤Î,¤%D&+ê Evzfg”:.,èèG,˜”&7*S€Áz4‚Õ‡ÖÌÆô¬eŒHB²^ËsËPhQm„L#a–Rf¬#-,‹ —4+c™>3åî€ÚÜA„‚™‘–ÙIK›;ËbD ‹uðbÃ+œÈHË= ¡ V€â«`›&+þt¼d¼ÌGsKÅRãÿùó/¢¢H²*³e‹¨*¥ -o\‰RAâøùT%}jM°À d,N¥0BuQ7hÑ‹Ñ^‡®Pd©EP¶˜?OtPL>”2‚™eô §Q95°{I[²[ð67öôR‹Æ`ñŒ©R‹d}:¦²ó¯Ó ˆdD_Ìu'„@ÀÄèNÔ¬¹)3i6ŽŒŒ—“LÖºh0°« UꈙYH2=ÉŒ %»`fs$ˆ Ÿ½7P/¨K5~@b1Ì”‘UXNDn.¥¦0¥ ªŽ ±eÒH²µlR²…†ˆL!—øŽpÃ0ÂAP¨/ˆ†ÖA¡.I£ÀŠ”%˜%w”2À„›ñéP}´2jH/¢Èt²Ty)P >¥4Œ23 •aã©Lʹœû©ªßlT‹@¡›“f4¨·}1¶M/„dlf‰Þr°9“–6@í¨6A-û1Õ(fKZE§¬_æ‚r“¤$`æNCÄDÁÜ™sÉ@HË} Ñ­šå² H‰Z@I³ä™FkKÛE.ä(šFij§Jñâ ¡2«cðHpð§ÿí €nÑž'š yl)¢+ZÎs>ÒÜà€ê™=²õ˜{FòZêaü¯ÿÿÝ•wñþÝ­'¼'ß·_ÆÊdhÏq¶ŸX¿Š7¤Ž÷†÷wÁÙpñÖGWoûƒº³§ãJ\Õ‡}í¾~«Ò~c#ÜGõ¹˜ó¤ÇsSºsõ0xÍêu{ÏMùÍ6.×¥úy•ƒÑŽÞsíoNB{mz¼? ˆWÑ·Bó/è6锽šAæ¿N@úÃç÷ú£“ UâTFdhdþÃ矟æóÈ@_Л­7‰[å’‰xùÕçéóKLmÙsýê—¿H)7YÌDÐn¨ÅîîÅ{¤ÀqeÈÈJ™ >=Üýx X2#úTêB 0Ì X™‘tÍ—G…c{)>ù‹ E@©z°ÌžÝN;m“%æŒÌI’ù)´ÁId(^f07C­ßóøÒhfdĉÌ¢ÖÁhÇ©ƒæµ¶ì,×ͪý\f„%°b¨ %=Û|¬2EôÖ*>ÙÉâIJìA ³MñRÍ[<#ªy)15“E⥕p̵x‰˜€ìRPvBýÀiHÁ 8r ªX`5¨)ÃËKfÎæ$Á˜Î4ŒZkÑ"»–ôƒWhfveCê(Ú Lpƒ !Î]”,DX4e¥yäRîn3:­eqzá‹+f ºÔ# µDgÌÉ&ðkd{è`68: „4 ÙQ]F(–jxF7¦–DŽ"-™™î†@4‰2cO˜Á=¡Ž¶ì¼Ïˆ;¾û9ê;þ:³Ã‰hh ¥ :Ì`æè3$Ð…†ÅlNf¸ñáÀk­Cý`òüøÁÌKD˜‡9?>y)œÂÇQõ $sdKŽÄZN•ĆR ‚ ©$O²»¥(‚"eRDD"3›"TFÎ2gÏY1Q 4“˜B®œ•Ý èH¥RÑ`ÊM Z’Jd.I²¥J¡X•zF_ ÿƒ„Sif hè= Ä"3[ìË1pj$e€’ 2ûT…†Úàþý¨ž‡¿ÿ­¸= }iô †»FúwÈ”" ÈLEf´ž}žsîÑ€µÆÿÛÿóÿ¾ˆ‰š}UUýñ‡ÏïÒÔì\t@üdÀ•¨ÅvÀþ°ÿýä•+ð#?·ßqèü›Ãò'ÆÝTò­¾M ’·<™¯ÛyœŽ~*¡¹ahåè}>ê=¬FÛR©[À„W_­M€uºðU·¯îÕo»Óžë7· Ȇ¸6sŒO°[·¬­gäkO‘Y»ýSwëîùŸW ÚóYü¦ÍáZ¼N§ízâé2²±Õ¡.‡Y™sT[ÔØÍõ®P{Õßw¤ˆwdtõ2ß\Åí=¿Ö%ï ^øè ­+ôÖèzkŽ?ø‡Wüj÷KÜïz+x×+ôÚ±·E¾MƒÏó]Ú–Ý®o1מӺñ+Ý9ä»S”|å/¹]^Þ¹ê‘ø f”6EîËtZ½°y·LíöSœÚq^í4¾~›ïH½­õ®'ÈWFoÖjÞ¼~p[†óêåÁõ¨‡¯ý6w†9w¬‹î¯PÀ-ÁNÜñFÖÎ겇1y°î‰w7é=ƒîÚïÉjŒk<¡×¾h;RnÞï_]Ãþ5–¼ÚþçòM×µèžuÇ/ñ¯ ”N[_=œoùÊ®«Å®­:|Oç.]?B€Ê³DŠ[ØúpïlpâÙëì^K¿ézy×{ôþÔemßT ÝÇ—ô& è•'Æ5R_ôU¦U7Ãƒßæ"k~™ûqV$€_}þÕRPf$ÊPáffV‹»Ãä¥BÖÈÖ£G-3zonfBŸ&«ea°,ô·ÓûG™Ì´¡FoãP¬–Ì^%ë&ðèì Id,"Q08°Þ³' 7úãŽÿ¯ÿÏÉ61‘!I½÷œ»fá9+M­-EÌî.E,¥²Ñàê@´ tÚÀ-Üja},„p‡v.l§8lÀ z"¨C‚Wƒ#"a§ë­³6+uð Ùჹ™z2¡Bˆ©µ”2RPFë}&íÔ¥ŒÌ¥(xñ#hb-u¨õ8½ô.w$RCe²§™£HA$ ñH*Ž\ð ÝPZDº!#‡zˆˆÞ¢x™Ž=#eô&•j­lŠ[Ÿ—‰£È™“‹ý3ÏÑœ!ªÃR(Ž¥âð”ÁlÓ‹PósD u8 ‡‘9˜ öñûÿÙßþû¿Š`º[-ešú4ORª‡"3 a@-ÈDÌ 4°ššè¡zHBýåèõð;[›2"çÙ(˜eWf(œd{Y×ÔJÙ{GñˆÆl¦DOΟd•&H­ê³D•’J*¡.v¨ OðŽþŒÖÑ ƒâ4)qîšÑì?“¢ p‡,{‘Ç+¦YU(ÆÁPˆ™šLæ m6µO "äÉ ™aJ+ƹé1q¹³Bé¹L ºôÒ"“á '‹Y—"d5vgËøaDzbn:µÑ‡;Q|ÎÞ ! :¼‚€ôÍ'ƺµÒd´áû'ƒûX|¤„i¥ÐUJ‡ÔÒhV*½C“¥ Éž‡B7AŠæ^¬¢2ÌŠÉt-x3š—¥ ª“êSS) ‰ôŠì„¢ub®93{̳Œ©ÓQ š …Å,0‚)¹yÅ¢ògJqždBÊ ,i‚‹+r‹Or5HýE µéhÆ2Ö24Ï 2#ÃÔÒSe É<#£éîÕ½ðÃઞͬæÌñ»'Kï3{kÏ/nß7Åiê,v ÷ê}{(¢||bµÈT*{¨GÎ]=2€×òOÿÅ?ÿù?ø“mȧ^âÄÐ]}©„Å.zBw"À©›·‘ò&$Ø I™|]eyeÇ¢·ÕÔÕ¶;¨5õ™¾*}-äØ ¿UÀãu¥:­ºÖìE¬H놀LJx«^6׺oé\~ {÷¯ùò›—2û5–€ï ÏêßÛ!ùê¹lŠö7ªº­7@¥ó%m»Hn…® ÄüÁ˜ý¢Šl·ÈH¬È]§mêï/tþ@_Fï ÆÝ¹GÞ(ì7ôTšíbHÏð4Þlµy{N¯Ú"ÖCgÍ!„LxE5ÓC±è4*u'5-êñ 5,(A[«­·÷@‚™I—–¸í Çk°°réÞ¾ÝÄ{¦$^<¸ðÕηë5`Åȵéç¸ÒÏ¹¢)HV»;Ùû’4Y¤Ý~ù뎔wŠÌjM\Ýâ¸/Y?º½çGw ÚÖ…{Ye;W»ãVMyës×Ãó¹)pÛ“KÖûvžÓÍoãé–hñ®²‘Ö6~¯¡m¶’wõÊ=Î?w^Ìäƒ4Òû_sob7[ÎÇîÛ43½ÚÂÆ×¢ªwF2Ü%ŠÜe÷´¯§Þf´A­]¦Â>½0CxÆñþ~½#6Å=.jO(æ[‚ýýô_Qþ·BÕnÒ×k};7·~“¿I¹I'nB®—¹íS㣻¥Õ7ŠäýrþZ€{ïFB¼6”±o¿¹3†¹Æxé̬¼ßpû¾MH{'¢»ÌÀòλgî'‚vˆ]+µùåŸà«†·s‡ÊGoKmØÂÍ­[r|½\bex²Ê‰soÇWœ¿½T‘o&‘´ æ÷ßnk¡ú®’`u¤Ôþ{Bè{„æ¯ÌnÜÌ+îdÂ^]Üu‡'½¢~õ>”í£Ýì:ÈÞE,²Ä”¶U }ù:1pŸ`]­¨ïº Û¢œõJp-;ÙÛç½"oÿ?­+Ö©°ç_~jÇ©ç¿ý›¿¡fe¨F3€ÆRJËðZËPÍK 5 @­ÅÈèݤLóÒ[›ææ4¸·iòb¦Þ@[úÉûÔ):SffÌù8ÕÌþ2C±Ô–¸qðjBËÀ D*³ž¬0ƒx*Óÿ÷_2Áj,Rfo½½ôœÑ£Ï]„Ôç™QC¢zf,¦È OÑkvDFM8Õ/_*âÒ`¾Ô"ÆÓžC‚(‘õ#Jˆ†ñɈ‰/b.ÖÁ¥^½u/ÇÉÍY,™eÒ£Wz9æQ™CRÍHÊ’ Ê\8ýsž„¤ì\Crá„cc¤¨(Š£Ña„-Õ”ÅÓ@d *4˜{rŠ#Á)¥Äàp°…8‘p¡h¬àK¤›Ì‘’‰GD ÍL#iH*‰l©Å/ §rBRÒÉðFY'¨z›Ï€ƒ—ÅXqgÅy• Ê€RYÆÁl0ÖôQî¡éDdÈÑZ µ|÷Th2W6=¨Eѽwÿþ{IäÉÁÖ¡DD“¶¸qÀ\ty,3ƒ–æ©èF„R!RÌŒÞrH=$¡72A É€— ”Œ9eÊžI3Î%•±˜å$Hs³Ì"’)šSF$Ôá£Hϳˌ"TUË §ì@vf1‘KABN¡$­²DÕ§âÃ0|wpÖrS¥¿D}yùñï ,¡âô§'ñi‚{­eŸZù0ö¹¨Ëég.Ëm¶Ž”™Ñíÿò/þùýƒ?Õ¢@(ól´µâ5Þ#vÊ/öc9ÞÈv<ˤw\º%¹k&¯n:Äkþ‹;Û[è}²øºXLn*8ïݼnw{{nXëPa74º—>®ð/÷:º»:— ‘§ë¹bN9xíšìDª;â­†&h)´Õz«½e°ènŸ~zîúê~{.Ì ±}U wÝ«iWökÛo¼ÞÆ3q—¯¡ßU³'_êA’k9Ü¢ÿ¯} ¶ªòß èü*ÚÞÙˆáÙ¿)oZaû¯`§uŠåNüæ¾°©« ~*ù0áôÃvnߦmç’_Ûµ÷»Ëzqåýå;Òòê–òBîÚ.†?욯^¹Wÿ¾ß6ïmÎäÚžñ‡Ï>øüž|øžjÒ?|þŽ}^qúöGúÃçŸß«•[o¤/Dó?LüÐÍæ›3]!D+Ï>ÔŸþæ—ÓË­ÿíßþ¹Yq+¥T—Y1‚,î +'L4 Â,2 4Ô!¥išL¬¥FdŸ»{T†ZJ…Ô£Ûð4¸+rŽ`l1gŒÅÕºæ™PÜ1:†Êj%›Í¿~©,´86´ g¸»}8˜·ÿñ_‰Ic¶È–ôÌìqŒœ[ÎsŸ[̳ÍŠR­õT¸ ´è©L/È<ù;æÂ[70N·\B JA$à0;ÿ×ÀåÏl8‘Ö¢ƒ/‹ú ÌÓ ²IÿJʤ±ï zo€AYJ50ÔÕ`MMs¸U§wf›;Ð(ô`š³ÍÍKI±µpæ0xns©>Ô!Sh-Sç2´ŒÞ2’~ºW'mwí8ôÌ:B$XÑælK-XuSEjÎ93á4ã@†Š*ä¡ =óÓ˧§qü𡌴—yîs޵´Ã$E´tGùpÊâ¤ÃˆñúŒÿõ_¸!A²|€Œn–®´¹¡ÖŒ RVÄZé𥶘„Ìi`:L4z ©³}´™b—0/e‘‰„L)´ }‚;½ÈG`F› `:";,3Nþ>*&Ì/èÁê4C dr)RŸ§ÅX[Fº±”Eš;ºpe∠Z] ¨ñû± ÖVr„Ùb.M2uªÀ2“òPäŽ'³’±PGÂ:\À6 0N ¡u¹ÑR:µäºR ~  ñTÁ^‡‰MJÁˆ%k“°q³ìÔAÐA"Ü18º£ßàNë«æ©Ö­ÓçÀ¦þð¢z½ë½ÕÕZû–1° àãbÕûµƒo=©‚»@ZûQç&ÀóE¯S*w7n\™Às-«Ã6ÏX¯¾FöŠ÷¾í4»i?Ñz~_Oñ hz{Mâêw†¡—q±-þßüöm.׆–m^ñz§ß˜Êçêþ»¿æ1½ùE?§ÿÂw|»¾ðŸïjÊyeèèÇ]Õô•«Ô+Ô¢ý¥ú#ã¶~…o>‡ûBûw¸~¯P][S£÷`§¹™³Ü‹•VGùrpǃѪ¯w8ìåc·gàÿ¶Výveþò ŒíZw]þ´î\Ý”Hëµæ®ºt±÷Äšjwïì¼"¿ÞÑö¾¹{qeZWé‹§?€_ºbo-gõîùÎK\†×Q)|ýû¾.‚%¶VË;Ð¥úò×>ñ‰«xîëÞwß’V¯÷½.6žÒwÞÔ¼]÷º‡¯7j¿¯ö-!à¾E~™´öÎ]Í{º^Þ7¤C=ž©ë]ÏyÑ:…Rz×ã‘^~ù©½Lmšz‹_þêî^ÆêµÂèÅWX#áVÜé¤Yd rÉÌìD¿Ž ‘ŒH™»A9}žRУ/ªž!ËX;tHÕCp ÿå3žjÎqìQŠOc(š ê™Åó8v8õñÆOÿïÿ"µ°É"sÎlÙ£E›úܲ÷l±PªÉ4–…H}Á°ƒv2´3dý$dûyx”+HÂ*h'§ß%  3­‚¼À z€Ž–aBÏôryX Ÿ~õì‡Áï%¦—gsëóÑ` ü ªjuDDLÓñHƒúœ¹— D̲â^Ù[Ë–ó ª»H0B‰žJ”wÒ F3ÒE)—2;L-í÷†4˜Œss7õ¹3™ w‹è½§QóÔ3¢¤hR@fÒ°ðIjE&ú$¬ÑáN]öa‹B.N²pØS9¨`êGÈžjùP6Åô<C½š—ÁLÅËü\ÜœâçéÓ<Ï£(ÇФÌ ‹13[‡R{´ùV0~ d' t¢ÏŒ4«n£[Á‡aÈž}nT—-!†!º—B/è]¢ØA[)2xŠŠ ”3…PêTŽšgr½‚µŠ êæö®:ÂÁÞÔç“?DYTçÄœ×Ü䀀”`(5¨Îa4A™êÒhè3(š‚“Ñ0ÕDUáêÄl!x1½'”™â`ŒTÊ>ƒ+$7šÐzF²8=­&23«fD¤\’–¬¤# µ@˜- IÀ+ž|ª”†äÅš<èDšRpÁ°Ôe#€  O§™(WW@ƒW+Ce'¿;ÀŠŽ]NTo^BòÞ¬ŒjMÅB1Vx©fž ¤Áº‰\,‚ õ,nDf4ètS"R 3Š˜ÑJ³Ž>G†CÌÝ€ª„¥D©›dN¡˜#[ôǃ4º *=A.’°@ NÀût£ŽOP'0Feôy–2æÅ2V(1#ȈL/æ0ºÙ2h" Ýi¢ÐIæ¤ñ0ÔÃh65?'–ÅÆC9€‡?ªO–å0äÔôiîšñÜ2bYŒRFra\ÚŸÊžê¡ÈPʫקñçÿO¹×Hy-iæþáþuõjÙÊ©²t[£¼‹!ÙíËÜÛvmâ=á3ÿa[´¾î‹µ­›¯ÄPüâ€Xz}¿rJì–ÿ­rÌmÕø#Ëß/(ÅW¢nÚpÎãBZQ>¯Õ¿xmûŽí§ÎÅUJŠ«½ýæv*u–£µÎDà–jEêÎày[aê—:w•µÄtBTݞŲuZ¹×6çEâttÞÂBÛF«V®ïöÛxÞÈ›~¥‡ÓögËL»söôçú™Kìp»&s-ÿk—{¯½æâéK’x\çyŠ®¨F{D¯Y™\F/uoesOEÚüÖyÕ{Ñ®Í{n§OÛäÚ»s$Òe î¡Cût;`ÏH+’!×i²7cÖGÒù+œÂÕ–C—›éŸ~¹gÅ7™ª‡û‹hßòçÜùà×êÀf¼Ý—6wþüµ»}ëÜCßîÞ½#…p“âÙ›>ÜÛúRÞ3ºŸØ¼®ÄŸñ«ùÓKŸZfþòÓ¯¬xÇaPŒæu¨©h=H£‚Ä23S^Ë"¶žtÒÍŒÈLedYifóËdÆSbSˆÖhÆP¢»‘‚MGK±ÏCk)13Ÿ§&Y1§ŠÇ–©&äq¦9¢9@¦>ý÷ÿCDä‚V‰ÌÖ£EÌ={¹Ÿˆ¸JšÈ "¢eœ*è# ™W¨eoZ˜Ú džŒÛB€Á ±äHd…Û¹@*O¿‘(Jô@=`ð3dÉHÁbƒ?yÁq:R€¬‚è9GofðRz@´PDN‘0rž_ÄF*¢‘nî¤)ƒLxD‘FÐR‰î–!zÏZŠ ÊèlŽB&+nÅŠÍSï¡â(ª!˜Ñg#ŠÕã<3å´èjÇN“yfIt¤rQ·3°X˛à 2‚>À ܉}1àíð $4AŽx‚#Žq̈å i}ŠcŸ†Rj™újŽÈÌÖ{´üðÁ?Ô±eÔ´dòþ³Å£t<>OŸ- làð饙DÌKòF,0Ò*¼Ê`C­F/¦–B·RÔ!sÊ%uw7/jÝȬNQ­»[ö<ÑtMê'ÿäÞ‰\J¸™È.מBE-ˆ@Lˆ8S€'Aô~2 nMÅÑ9åULÁˆ)à†á€>#sO¯:ˆ™–MÒ:zàEz³B’`˜fÉ d2Ç) ΩHfÅ(H • Iâs ´ž-E ™ftXZD—L`r1Q€”ÌðÝVf²-*m $¹¨H( Ç¥‰ää»ÈáB$†RQF@V•õ°`‚Ó°ä.J?ŽÖ0NaÑóð'ic]’FÚÉœWtR"Aõèéæ‹} ]¨ôâÊpK ÅȚ5K g)Δ‘L¤ T©Š)R ™0egôy±á%,˜P"iÅH}±§6óÅTt’ê=2¬‡7| kp&n@OÅÒ†Ä}…‘à {&¶ˆðÍ1µºŸ"‚ ÆåzvÒy—Às –®;ßmŒÃõ5íoŸÏ!‡Îö€þë`ã*ñ½Ñü+ÛCò]êöù*©·âLÜ"UøJñÄë‡~­niãq¨µ­Úò¹Ö(/ao7ü—»©3þ:zxEóïy¬·Súóvo®‹ÏÛ¥°_§'Ì+Ë%Ÿ»¶5pÛÑÂ[õúš ¹ ºyÃáÙnï/ÂÄ móJáy5óû¿¬ ä£Ëå]*o­õï5\&êu ¼­¦Ý9Ÿí*(_^…vÎm`wtA-¿¿`£¸p§`3Õ¸[wµ¢w¬ß×ðZ"êFÄ{µºï±áÉí*´ºg¿éÎ"íÕ¶];Öš××gµÞZòO?ü&ßÀ~p}û3ûiçü÷?|î†è·¼M-[¯ËïíøMÎ?}ãò­:ÞN&¾ú2Óoèa¼ËüG[&¾Ño½Ùð;ùzúͯ¡?íXyŽøÛ—ãÉ)"Adä”/tà$«„W€¤Ny±b,NYΆ4RÌŠÓÝÇjn Ά^L†쨒!Þtê}‰Èž¥ :R xRÌ©Zœ*‡†Ì0&e,zAe´ ÑE"sRÐÝi{›dêÈDcÒe(1O9% eº#¢CiCº³'(ꇡçè]Ñy¡yÉ!¡™"h÷  9C™I+ÃX•ýT,™Å‹Ù¡ööŒT´Þ68N×ºÌ æ¢æÉ E@*é…„ V|p«…µ0ÝéÙÑúÀ's9Ý3å2ùTùq¬¥dþ˧üø´°„¬Pð¥‰dy®Ù{νÏ=zQjù?þÓJ3]k/—rPí_-ˆ×ïdØu‘«tëò«WN¼ÖpÑ…·nÇMcÅ—ôe~;l¥½¿™ù*ÑNß(üÕ¶›÷ñéµÅ{ó3¯tðŒèoÛüx¨ü¶Bç¿ÖwÓaô›×PøJ»ù}Nôk¡LÜíæßÚ^ܬm·ca“xß8,¥»ëzÌ[uœ÷êk¸òºÐÍ\•“akAüc<¸Ój ÜT³¯òŽÝp)•Õ{ÎeI¶Ý›.î_ï~šÿ‘ƒâögôu+»¨_ºòs·Ÿ··òuÂŽå*¿úŒ~³"Ò?ÑÐCàÍûq_tYü)×WG_û××½àùz©ÆžëÏ6ÆàEpâkï%ÞVÑë¦nüUjÕWñ~,Ë£‹pƒõåi®ºy®,Ø›Û:Z~ñJq~Æ+²Ó¹\ý®„~ß;õK«FæiÜ>Lpÿyü„A¿¾â)_ãüÂåê§ÖÓ÷ 5ß(ðíÚ´ï_í7ìÜaºošüÞz½+¹ßj¾~-÷;š¥, ›*ÃÛ»³O¼'"}ó®î6{‘÷c¯S÷±”Ö·uÝ[š‚²}~ñé³¹y-V ‹ÛPÌœN=£Gf¤séé%#s¬®ˆÌì]Ê€\@©îFæÖ{Ï©ôâ^}a‹@²V'¨éˆIþT3ZïÝø<‡Á?>h]ÃÇZ ñ¹¡Ùé5xZ¹©ó¿0O*,'èÛ™·âL0CXNÊ8ÒˆE‰^ÜMm8Œ]Ì.Ap°´Åá6ò ™z42\µõÖq%+ <æ´ªyš½Èësöv:ÛaDôtCŠÙsÎFa‹)÷´.„f*¡ÎÖkQ÷`–Á2R!¥§*׈@ZD*´lz‡%¬€Ëb–Š2¢w¤ 8ÝÃb…ÅÈÖ[úâ¤Û üÜÔŒŒ±"ŽýÅݯŊ›‘ˆÈÖº¡Ì­=0:M½‡eý|œ&ÍÝuðaj žÕÌ5&&Kyž‘‹/±A€ eaž43Ô¥N:Í(C7È${SW&e=R™S϶8Õ @o§éf ë¥uö#G#RFÀ†hì‰Þh „¤¤Š#:”H(4t"•ƒƒÀ‹PY|EÕÈÆ(HK¸âÓ`½è¨„KËóâ’SD5:H-Œ}´bTÎÀ§Ð`0éëâK¤Kæ¬Ä0J¥KPó“”P•h 0 4¢ue(À . )\˜¥ Π€Šbp‘ ’(\Zhq¡u‰pG²‹]3Ëh¬rëâH0“i"¢wÓǑð´»H2fq;3½X"ÝhfФ%‘âb:fnêVŒ¤Ðrš•òŠùÓÌZ]ŒÙh$„ º¬›©xéSÏÖ½x?¶>M‚–e c±øÍ™)%͸4íÊÄSCD¯Å¤PÏH³þd@„˜ó±M3‹ËÍm” f¶¥)J,…æ¸,‚‹÷IeÆBº CáJÓÒ¾3|ü9Hk-‡B+ÑBŠáû‘^»ùËóß}ðu,]è ËÓÁ½EÄÒt9÷\æOõôçþGïOöHÈ帧ù=Žû(å|¨ùjw¹»‡ú¢}ðk:þ£_M£ïu]öº‹ðLjÖ~ìÀOvΫÊ{­7žÚN¿ÐÕi¯^xeû«kó[8]ûÎíŸi‘—&QI™’R×Êê.º´áža„çÀä[l\x¦q»íÚC{?(Ûä›ò—¶Û¼+öæ<©ô±~I…éæº±¹CÏÛL ]–˜KcÛºÆìæäo_Ä\÷h]zŒt—{•¡À ðþ¦mŸ·ˆ¨óÿ6‘ù®[¬v–¸šÄ«o] V£¯ëºCmÆÄ^Ô¤;Ž.6è¼ûÅõSºÄJ¼‰HÖâÝ•)¥+ ûй¶UÞ*~¼ƒoþ»yŒºÞ¦íâ‰Å=‰ô>í-rGô¾{Ü{› w2¿÷î^&Ú‹W÷w-¹'IÞâÖ Uî®Òý{ûòtohºüÄ•åv·F=Xö·)ñU ÿÎŒd'áÅdz{—{}9ñ‡òèíIÜ¥ªx©ïÓz[ˆ×wŸ÷ÉûžÜÕ×mÀV¸@Gnð¥÷mÄ»¹ ·µ¼ËÕ¬<6ËùjÝÞϨ\ðaÚÄL× ãí ±­ëÛ{¿å»¹Ü&„nG´ÞTH÷³î(4–h’;:×°S¼rŽ76s+€ÌkÉzï±3Á·H·s«ñåè{_x“¼ß–Tl¾ö­ô÷Þ˜7ŸÒ}(|ù§‹˜¾÷%šã´|‰Ý¹Â픸¯^/w½ù«ælî¼ö.s}¶7_r?×~Øš~î´ÔùÆæáðü0ù¾ êv–?¢­m^Ç:ë‹¶øoÿÕ¿‰¹Gë­µ"QÆÁª'hæ(ff 3R™‚²'ÜÌ©2{Cï}¹ FóR¢7Eæ²Ç(ž‘‹B DZq33+˜è9Í£itu¥Œ’WqÖË|œÓ23Õ‚©£–c-çÿù_G‹Åµ÷Þæ>瘻¢GWvIÔ|T-6T(—Ò~ŠÅ zRŒÓÆøœ@O0a@$`œj3øRæÏSÓ€;Œg¢ð2Ë©^†…ƒ/ƒNÞ¶I? x@Fô¡9çQr“m¤CðR#šÓ[N9Ÿ¼ ZÎn @m‰Ê­@ÀñSdÇðJq+H¡O !ºyºÌ ˹µ“ãiÊŒPí˜2e,^Ì Þ2úbz2IÌPÜÑ£C¢¡g‡?iÝ20Ð:´àþùpK¶¨?h=¼‚*½ÍXôæ…3c0Z›ú’XàVz&‘¡Ì˜ÌPËh,ªù2{Ïq(Ÿãùi<Œ‡ªy&ÂÌÆZŸç>g&'eö Ë_–Ó³VP7F3,`ýè=;EEG‡@«ô,êF/ 5õ>wFÒ-ÈÌ>+úbYlŽ áÌBë3èJ#nÈ~Ê=´¦>O@ ÙÑ; U šCÑØcéuá0(Œ/]IT§0R1ƒŸS'ÙƒÌÑ1'kד{O[Ô]žI…œ4C¥"„çµ ÒH8Ø„” Æ'G„ª¡[ŽÒh8vú<+RŒÌ¥½¦°7-}3^P é‚#¨ÅM&AG!”T’HFEØbäCJrPuv* µ@¬Á«[-ÂÁù8YÆá‰•ñ4z)>Ts³Rµ”Ùi •B7wC7ÈT*’æfŽácI!g£2Õ[ÎÝ hÁlnÈ—¹x,¤só'r~žÑ5OÓRÒŸÓ,å Þè2å"ñ'è®Þ:Šô Q€ùàBÒÂé"Ñ Â­Í/îªOOÑÂÈÌ€fZ!:¬ÒܺÙàVKö”NN¦RÊX†ÁYm,ÝäYkÌð8²y~~)žì0d²xL}ú›c›C‡j¥™Ü‚ IdöD››"²õl‘þáñ_|üãŸýÑßÿ^üçuO~°—¼³ÖÍfè&lÞ†bûT¬õ›“ô¿Æ^+©ÏÒÕ¹6ä>ÌØüüîEè6/ܼ¸y·eXEVç‚ožµ/^1wÀÃ…}ì h¾V½}”DY)îû1ñ¥4vƸŽo~fo ¹ÝJ¼Që¶IÂ,ž= »Z÷C·bï·ü+8ÌZÓÜ^½n6S›ýÓõÖ[ÂXû¦Ü㚸p«.HZÞXyrsݺ;àj>hGE ®¤œ¬²Ü«E¯ÕýĺžÂïtž·û…ÛÍÝf¬ÞÛ‰<Øl¯k¯¿´¿b½ýâZ½Wó^§Ó6¼ÛÞc}x¹«\Ï·6³ÚÊz“Þd韴Åóâ7ª¬ÞÂ=xM`]{ÿb⣯úÑò›ï²¶~PûåÝë|§Á'ÁW ã_R&¨w?þ3B_—þ½ýpWx|œÉþêAûèçù“]䚀}óøüÊ]Å!« ß{“oÞx;Áë+Jñ×¼~¤¯{4ú±GÀ‰_?ôöÍ[9½Nñ|Øv³îz?pܾk­þ©>?”€ôf¥ÎïTÀ7:š¾ÉsùAæíâòóc”›½ž#ùÊ_¿ìù^íñÚ-rÜIoj›¶Ù &Ä9 ýÅÿø¯£õ˜[JfVÆÁŠ{u+Õ¨RKñ ¥¸™ÍSk}ò¥0cfôP-f„»“‚4¿LJ)$[ïjÝÜÍH™è ‘N™¡3AæÜe¨‡âOc´~8T´HèÃÏ?¨Eo©1Ô„ë¥ÿ忊L©ÇÜcîÙ""úÜsÎE[*h¥<•ÛÓ282 IV+pÁ F¤# tdGΨ€êð%,L䩜™§'f„Ùm)ù s”êÁ€¤Cå´2‹±ô9_  ®#Û fçLÈ1$ŠrNöRÊÔ¦DDæ‚ÍAB V  ;"àe­ f^Ymœ¦#LHI9eª#=I¥5AÏ<žŒÆU2»;j-=új§ ÷“Ð(˜ÒéðŠÌÓrœA¼–ZWIÐÜRáVHošË“ ¹¿äâûÊ>Žƒ˜âTK5™£tDïQ0¤[LTËÁÀçh-?+`æÈŒ–!H`ÀòX?‡I~²&”s{6,- \ÜSš ¨G7˜¢aî)AáàôÜÄ>VÓ ʆL(„ät„Š«MhÜ ¹üDvÚ²a“@ È š¡‰çvR/B(‚R£iJ5æ0€B@^QˆéY„™é;’´Ùú,̉JŒI•è™H5š„ÁÝ 9áiµ SÈiÕŹ)¥Rql2S{(¡åŠŒ’`Æ©KÂXè6*&˜Mn( LÅ@ˆKdp–z§-¿€ˆ’ŒB4G7”QÑš¬Âà0¸[Â`Eᤑ´³Ší]ÅËPÜ‹•’¹¸_C‘ææe-ñ'–²ZpအôLSïj-aH7øÐ‹ëå—Ÿ™3A7P0¤R)©Ÿ±ÑË'!,= qi‹B_¼2°¸ûÒJ¡±”Š¥ÏàØzk4Wz*dµ›I¡$ ³‡[²-·›2w¯ß)%‰&ºÛ²*¹CÌY ÃÒ¼dACURÃǃûˆ™œÅZ¬0˜ ž¦þÒÚ”ÃÏ><ýüCu edÆËlã Ý—Üg1.¾/Š@D¶Þçž=HZ±Ãwþg²Ÿ©« ¨¯óÛíÚvé4;/tþD»Æ×•kÙ”~·:.:õ—v|YäIò§Ò ®Ãæ¾`O~3–ׯ™à¡Øz®^ý&ÍïUgîóuè¿çÐù4Ѷcþ'îƒùÚ“¥I#/m,<;è•Ñ£K€ÚVªî€€ š››³îyÿØ/ïQ Î^y×¹|õbà#Ÿ7k‚¾Xª Î~ºæá9±*}nåR§ö#è57±w(¡ßdÝMÀ]!õoµö¼öpàE?䄸¢¤ý44î¯Úø“ÜíßÔÐ\ Â?ò ïªùñW<žßlVN|ˆßŽ .EÄ|ˆ÷¼¶$݃¸:;Qäk½d·çûÎñoŽÿÖ%øîÜýãÀ¿ÿ6¤ô¿ ¸©ès_ýõnGÛ  /àyµô~O'ëý¶f½ßõ"ñ@™õ× `þ|lÇ Êß­ ÕÇѫסˆè Š›0˜2A¼ …d­N!OëtH‘HÍ­—ZsáV×’eÖRdvjKÈ–D/dqA·êH ÷Σð2ÇÜ̈±æÔÚç™fÑ#ŸþÍ¿ÖÜÙ£÷>õ–­«‡ ÙÙúœ¹@üMÅliK"aÆT @ üg'¿YÃÉe´-SÞ Ý0|„ !À@N@ÇI®²k-ÜB¶1œªÝ­B„ Ø7¤/­Õji9¥g1“3ó2†fydW”},CX¶6•RK1w;N/jZÌS›`™±ìHM=O^»½dvúùÝ৆nˆ8-f=S=§L¬ZÉ{ëó ¤\¼Õ•MZ T‡“Sno’š;´hÀ©”~9Ù‘vRÕu*»C4”йN#I^é^%‘N c é>À2ú (Åh²"eöhèQo­Ís/^ÆÑ >úøáðôÒñy:ªg(fÌÆBEfJv(ÃÔšî€-ý`y-ÎAWQäe°~lj‚ j‚!š ôR ¨˜°®²GŠ@Ï~œÂŒÙû Fãé!DƒWÍŸÙ;XÄd6ˆèãÔ_¢³ ª¢ªƒ‰LTP¡Å­ K_¾üísN3ªË ÉLæV«?=ÕRôyŠyB°|÷ÅÔ3"Ü,32³Í-zϹGë ôêÿù?þ'?û{¼™°Em¾‘óþú-Ä•½óõ €ßÆÏ¹QQ?yŒøM"ޫʶêxýr¿à‰¬{iïä òíòT^‚³;ˆµöt-—ãë €GД-0[ÐûØçíâÚJšøÑª“^ûÚ¯a»þ®Bç¿hšîjýÜ\Ø]¹åûñúO½~¿´}œ‘zU—¸:m#Íì‚Ì/,+î)! àœ'Àµ`ÍUXÝûÓ?nÀ\¼Ë»¬çÎ¥õýö¡hýY5ßœ;t}ùèÚùµX3Q<9¼Ÿ[¼VÎÏ«f­›a³9üõ>ž `–~…e保¶t€­¸Ç+¼äÚ:tóeZ¯pkx7¶Œ Smºø¯Ð厷[Ð .êºIzpݼÏ5ƒé*³Ÿ¦)ÏÔÝÇ{ïi X½Qöm6ô0\ °!ëðê È›âY=¯ÒÎê]öH º/ÖçÎ vñöñm–•;W¡u¯Ö)ï»̯W2êfvèq:IçŸÒ}Üλ÷v1âvÉ$ïî4ïñ!dtÕ¼©½§µ·ÔIù؆}w¶ë€?·.EnQRçŠÖ˜ÔнŻ8e·UVWìäúÿáùî©Ú¼)­¶×”ÃÊ~B;Ot/<º£~Ý‹³¯º£ðæ­úèªo¿óú½ZsÖ¡…îÁjZ—~\OC¼B~x#Ó_"ºÝ½Êû+€V_ËË“gÌù¥µç»?ßgý°îáÆìñ&ÀÙàÆ.7N¯žî­î~ð~\=êˆß½Þ›îÝÇ;Ö%íÕÛû ÿgó‡UL»©IÒÆ§é.ÖýÊÈ˽¢ÑëÞpáüýWÿQ’¹¿üâSŸ[Fš»×âÕë0úX…\~¾Ö  GdÄ©µ9±Ðg'Ÿ:‚¤›u’½5‚¨ [Q1÷ˆPï^ºGoŒ4õlýéCŠR„AŒlÇ9zðƒÍÇYŸ¥º›ùÓˆ¡Êýó¿üŸûó,e‹¦Ùz3)z¶PïJ„Ù²T@‰dºJY ma#:aDA È–\,äk7Ø ‚â\ m@)Ðòó ËÞaç}sXgàå 8è¨#zG)8|o†3l|[N©ìLZE&hV ½·—9ïjU](ާC}’ÒXÌÐbî™jµÊaÆœJs«eˆÒ£Ae@žr©”@^ ÎÂIÊ“]È|ê@žàø=aÚ„PcæIâ7"7`V "R'ïâXʨs‘D F–¢D3òéð4õ—D÷ZI˜!€ˆ¥ÎŒ¥8Âó†)3ÑÍ|Xñã8³DNÇÌ–}Jq3Ú}îÓ<' )Ÿõb$dX¬†iç›c§%ׇp?€C4 ÊŽh½TÔa˜>?Ó6¨Í¢Yf2ô}n‹®;¦£Ð™§‰\ Ù9wd‡™@²K)øÒÒ Á‰—TE ¤cOÈHSm< aB TÉh)–¿TTQ t±SF”n)¥ƒ3œO5Iq ŒË´FÏd.»DºÁ©UG5†Ð¦¨…>zfF*©0âZº+•¢àHÊHQ¸¨*7*F°#ZÃâB¼l\-‘‰&PêÅRB‹ÿ°…L °0úX¼¸†ZQáÎâV‹¬€F:a^YżžQÂDKcY$~[L±¤Afa¢Ô•™“¢1ú $²!;(;q0‹[€Å’ ¨ ]\ŠHÞ¦ÀJÃdÝ©L@d[òïMÑ]RÄbøÝOb n§×GôeÏ×c1ü%=Ò¬z'̳s™¬G÷:–úTÈúaÈú“–”Á4[u¤´,€O5Ü]HD±˜¬)™ÐÜòôÒÌÌŒ9úÔ¢uõ8ÁŽÜþáÿéýÑ?ø³Å1;ª/ôÿöþµG’,ÉÄιWÍ<"³^ÓÍ™Ùì3äÌìî4°àÿÿH€K‚ËÅ.!–ÀÎLUuowUf¸›ê½"‡®š™ÚËÝ#22»^V‰¬Èps3Õ«÷!räÈ9Ü&…Ÿ kó÷ã,׈…X—,ÛÈv$ð6Î|—êÅæÈÞD7ºº4³é áÅ»QÄ­¢ t“ÙœL_Ï5X¸BÒîSî,Wñÿ=É >®¾¼ÛßW•¼LXÏRżÀpî€WÛF[ œ£®ÒVÃü„Šm/ìôŒ/²Öµÿ®äI 笉´­ lS"Ý`µÚBºÔÁá–µtsí.;æ@ä%.xGŸh£¼~¦xkmS»7ºÔKâ#tÿOMtþ} ÿÝät›a ^ýmz¥M^s]38µ‰èG:ðÈâèÎÎñð~^k×Ö}Í®»~?þBÒ;ÖÚkË‹?qÀýD _OÚç³h4·qÅÝHãÕðCïØìt+¸¥w|È£Ö„«ó÷¿*Ò¼ýÿˆö¾Ò˜ÞÌÞ(”]-²[¿ àoýŸHšûËヒÑS„ÑZÊ®–ZË®Fï0Sæ ÎG$ÈŒH?w3zæžÑcîurw“Ë,)C̾4ìšME½[±ZK*\‘KRàáÅìÝ—Îjš»"ýçàÖ_âù?ü/ÌÈÙ¢·ŽPDŒPÊ”ÌHB&-¶ç±bo´Bi;È€ÄâPÂßkÏ}(f™;¹q'¬Ub:€!:ºŽ?¼¬9ƒ>æPÂ÷(Oì!óp«uªaË3œIºzeˆ‘Sy2Úsÿ$`?MK/öáéƒÓ/˼̓g2§Rúô$¶@Éx± 7˜#ý^ D (àu” LI‡åà4Š{DfHXàÇrq¢PMp";@С@VçÞ¢­û••³ñWKÙR,+clÕ~B0O 30•½´d´¥/‹í$;Ùc8£²€•Îì°5EËÈyŽe‘veJ…¹õÈ©”ƒ‚3Èž~ì‡X9­èÿ0N`9A¤¦ìíÈ`2¨õö¼ {„r™#0=y,Mi4E €Ù"—db÷3C‰žˆ8êG%¢£ÇðìÑ©lt“4Žqs¢êPÒ];Гt…ëû,F¤"& Tdj¡bƒ‰”pq¸L;‘“@µfH¤AÍ33!-ákí ©¡=ÏÑ—a#µN  RAѨnwn–mF†2H`gfÌ2îXGt‰“ pEr ”ÅDDàeºLâÜE2 ©A^! N…YÐ%TÐÄaаj½ÁàÓ4‘.L²µÁ­X#«y \Zÿt@2]ám¡G1Ö²w˜%:Ô²?;äֳόN«¹``Jõö¥M“” Ü={*Bbd£âh”aEDݦBÙŒ¾ˆtÒ­ÑÂÈÈÆÑÞ1¬~3"³ƒGxÔœ-!x™hTFfnÝ ôZàEeØ;W/ÕÍ#ÍähMݧ_>Õ¿þ¦~óqQô€·ì‰Ãܬõ¾´ê7O“¯ÞC…¶,Ë©mn±´ì1’ˆRË¿ú¯ÿ›Ÿýõ/VW¹Þä8ú1Ž×7”Î|_וöއÑ­½þüx _1âå»/ø½'ÎðuȇÇÚÝ›l[ywá’Àv7F³àBëŸo¥ý2¨ë×l >œ*=×%›lO¸gp¦…ñ32®?eÑùÛ·]l0f–ìGy/`¥×¿î«-XÍì\xPüC~•÷Ipc×þUq¿#“¯é?\°[; =t³Á¶@÷‡ lrU Ö#Ô^zˆ‘é¥ù§Žÿø_çj¡þÐïð/ _#B|Ô?Ë{ÝzuÖŒ`æ{oÿS4+áGCb‚üQ쟵ÉþT¶ûsŒÞN½~P®«+sí¯±)^Õøªæì?zËÏ_ƒW­ ôËF—›ýí¯ÿ€ÃwÏ9ðš3w7˜ù®Nû]©ØžIèe¨þÓÍA))(³Ï¡© „T‹%CÕS eªÙ3³·œ»æÅ„øôŒì»Ÿ¨ÓD‡ Èh¿Ñóaú¸ë@š ŒH«–æhùü?ÿO1Gf,­›Ðúh:HJ 1³“ft3T„4(S™ÙR%ÇÌabªð 7ˆ€ÊÙæwmÿñµËk€ÅH A Ä21£LÃ*l,¤Á DÐ̼ªÆb2+4”2Éèn™-æÐsqM+3ÝÀ+­0–˜ç9±)’D&ÕGÏE—äú/„wæhN‹Ñ—h] /…¶îI˵‰ŒEz)Æš©ŒÅl§4²º<›ê¾Lu¯âÍÓfYÈ#¤p«ÅÌ)ðß°z:ñ)R­X¨&ù~fYk$ TË‘±tõÞ—eY:¤iªuªÿ‡ÿö¿ýö—?»Ž¶¸mm£s ?Ǩé½éÝÛþyfÄ÷ ›‰Æ¯®Vû3áË3å¾òóÕ5ŒxÇæ÷^à+'Wáú»èüëô^Þì=Ï·É‹š×é~ÈëŽÿ[¸ç~!sóáG½Ž¤Úc3òE#ß‹@ðõ©‚£Ã+O§Ü®À Oi­¡üi…åvßÀJå¿ÜIpÇPý_¸h;õyóÆí~+:qêx9£?×5ÝÖÎ7r¾”[¶æ¦›âÔF²5P?öÌéŠÚzûœ¶M17Õë«KÝ …®·áf#Ñy’óìu©$vòËæ—&ΦóëQïâýbŠx÷ _UÈ;üˆW /§§s½N«u=rsï,åëzŸØx:ß`­º`Ÿ}Æî¶•n::q±Dî^ÊÛj„_%ÄÙÆ7!ž®eŸ®z^7û!?wOÿ¬àíÝHú¼æ•“CT§ð¸·ú™šÛ½Ç‘¿Ûó½’u+A–¶Ú4¦êüþëÏÒv¾Üõiô\:k½>ÚÛÀñ*;àjÝ…»š)_Ðt?7/ƒ»DXIg½Ûpi½f©»WÞÞv¹®óæ·¿þÏã¯æO‡¾´¾t¤2S e7YõR«O•ÆQÌhÖ{S#͘‰è ‹—Leè1n(ºØ2¢ïöu7Ùòüœ-% #ŸvmnuY¦o¦jàóA/s±Ä|XèÖ{:YŸjÒµ,õÓÿóС-½GDkA¥¯²;1´9Iž™æH¥U 0«¬Š©$Ò4äk  @-ð@[~ÈaUzŠb…HXÂ7Ê6ƒe‚(ŽÿiÍÃH/;…Š4Á$"Jû~÷qÉ%RNº˜}Qáþã‡6·¾ôà‹9„ ½³Ïøîåû©ìkÙ½, £5"æ9œÑ—ô‚Ö`ŽLx…6£8|B2Ö+VÀsn eî%{O%…Ö€û±g"1dë3 ¬b>ŽR9„†`ÎÑ…˜ƵšB‡9ˆh>M[]nN•)€.«?9/K¢ïö¶ŸÊT‹P"µt:‹³í÷µ3[g 4í°`?í?즙/}RCÆ*û# ðõ±Ò×*Ž@ðýfR©˜ÈIÝá^2a–p ðBZÉÔºd 9e®á¶*CvÄ'2Ð:"U†•ô‚ù°j1ÙfÐÐRf`É&#« öè(•†£‡°lP0é*f°ÀLYÁ7EKPLs´Æ©¢ÒSEíì¨.šUT!'ùK µ€d‹\"ÜYi9,"$…@¹Û(œŒÄ'ˆ9tˆDd+£r§ƒKH¦i'« L&¤ ¥£ÝÁ…NzjyÝ:‘„($¦¡‰ã¨ÛÁŒY4¦q’ðÑ£`fU˜…>yÝy­°*”òTëniôâ»ýîé){*DÚ˜¨¤Zª.Hè³HŒHºh–Ùp#Õ–Oχï~[&ퟦT›Äè ‡#cIešê‹Vwæf޾d.6@ü£q&D˜ˆ²Y ¤±Ž½<Õ1„±V“D$!·b4`8(d™«]ÀßaOX1£ÃG;‹ïìÌ}2+îÙ»¢#2–Þ[S'¼”éi÷_ÿŸþ; )Ù=åŸkÛMÉZŸnß}£*ÉW”Ö·Ñ¢(Cnqòµhð6@ºm:ÿì©<>ö ƒ¿«uy·°†íàlòÇPÕõñ&Ýê c‰ãÓú,Ä`SeYù*8ƒ¢WâÅ: .K Ø”øJµL¯À¸ºóþûæäW¾¹ov\üÒæè!nMàˆ{r·… lš™Þõl?Câ¶€WGÿýlM¶Gî}íŒÏ‚Zø­½®÷«a_Z±{gcÿ퀼õ@È{¸âçuð~5õbémÀS}Gü޶ƒ^-r¼vêâ5ŒõuÍÆÏuå]ñÏXgý÷Ï+sâÞººÞãn–Èy¹ñ^Ñ÷»øŽbÎ÷E)oðåG ”÷VìƒÒ£O×+‘ä;ëhïįë³Ýiå{(.¥W/ˆg9R^"ˆ¸Áö7Ÿ}CÂ%¬Ç}×ÎCº­œàž×È»*›ÚÔQ¿Ò~yÑÚù˜sñ*¹`±ò‘e–^iP=eçÆ_¾ I¿›ç\Yÿ¼²å]9E}Öë.íý•Sòsxg¯¦…z¸ÉéñàÜÝôùõ">x½}§Â½d|OÿâçåC˜'èí‰tjÖæ©chؒܽ‘3úÿÝK;̽õèᥔRX¼ÔbÅaÆâæ–‘‚"sØ1ÕZ¤(SÅ ¡XJš‘ "LpšùÍF,=g¡ÉR =­«Í/ ™ì%?ìgÌhÔ!Û~ÖºzúSA­­éwÿŸÿ°üÃ÷ú4g‹ž-"—è¤Yî2“r526XBœÂܲ±+Ye6ṪÌ$  ÁbAV/È~ìÐ*—ÏDô¶"àCï;@ùNâò†Rí÷¹ã!_hI“s7+t/e×–œJ­îÑç–¡.u}xú€:‚°h ÆJ–¦¹ëP|2C<´O ¢gÖzFÜÏ•µ¡ó æª?#®œwóŸ¢÷\‹ûjzÌ ô•¹£D6(eý ï1Òqè °+«¹® j‡q$[$T]-ž£!"ͼNÓpnÑ æã4UO5¯tÛ ¹kÙzÚ}´‚RøÝṉ½-µ”P´ž&TDç§@rPû±Þ†qBLÀ`ˆ>C+(äV(R¹ c"\^T]Q¦ýS.=X*ªjMÏ/ÏKý(+Á¥CbQ*¢g±ÞM桎èHc¥ò@t  ìHHÁA+KI&ö¶š´:XˆbÌT' ¡äNâ{åHœ ¢¥£ú¸×P£ÛÀC¾^ˆ–aAvíŠ;=àrjG+f‡Ð¡¤J«î)Ô"鬎êˆÀ!R‰Þ!ëµØœƒ–HÂI hP˜vO’#m gJ¡ê‘ÈŽ>lÆ ªá˜*@-€'Ê¿?Æír°¨äB¬Ã'ƒ(fÓÚ¹v¨{3÷Z|Ú%«µì÷ôZ`^k©Svfå{]Uû{GÊIõCk}ñÝ®ìk& ^H uhê‡RûÇ_~£˜3[_ž©nÓŽfVKï‡Ù €ˆ”c™c^àBe 6&%e–ÔKóJ8 ª›Ré”VK“aæ«ìÍœe瀤bt(º"2–¥N¤E¥¤KevM¬ÖÝ$“£%ÑÝ‹MS$ö¿ü§ñ»µð§}üÈ%²gŸ_ô´ÃnŠŒœ' æ&ÁJÇMoM©©Ѻ"ÖZþå¿ù7ßü“Ÿ›+v’Þ>ET¼†ßªUJõEÞW ÐÛ‡ó»Ø·@Üge~çéäƒ@üÚøŸÛp¥N~FlýU^¼@°¸}Ö—áËûoå‘–ã5tN¯îµWðÚ=<àôÅ÷ZSóòŸÈ‹6é0_WTË#êrLI³þ9\8:MmñëÀqÄoXÍGÖ÷ ÿÏùó=%9ýÙ>›ÿ¯K^ÛSúFë×Ñ콬çšùÇ%ôþUü'øú)úì.`F}î!ó£t7ýåõ—×_^”¯?Ky–¡»•Ú¸ÿåõ‡øÄøGólNÕŽ¿Ì¦?˜-îýЙú²Ê.!(]0“ ÅaŠI-P)˜œÄÚ¹B0†W `u§}>í`¬5Ûí@9MËaø+dd6õÍ™/Ê¥ÏK<Û’ý¢H¡µQ[1¨&«,Ë3*UXùª°B²Hêm¶žæI¯²Cçlè #oó!d”Rê͉L£-’è¦T_šz꩸Ùé9ÃiL$ ’û_ü³¤ËÒ¾ýÀwEßÏ-Þö¨U½·Ã-ù¡ºWÑüg!¹Y¤"³·@¤Z¥):¯þü÷óñWß.­Etó ^€ÑG'Þšþ#ŠB¤¯æ9ø—×O‰zmt,¾ÌWšàPÀ¬;z5øŠ~ÏüØá‰¨-üEtþ"j¿ùÇߨ¡t½ØšßRšt9Ââ›V¬F‘[ïâ{ųËï¹Ò]ÚòÏÕ‹KÏt}=u¤röѾn]çÆ‚þz>“·Jï³V¼põÖÍ£??mH¯§ºÛý΃ã-ÜØ°nE0t=ö—$Gm{ÄpþÔ‹{ÞÜåöÞµçÍÏy=ž<6-=']ܜμõ[²ó½¼ùÎÏohÖ÷£Û?êMWwz4S”»ëÞ Õ+NÐ|¨ƒ³ÝÕ_–KÈ+×ÊÓ‚Ôùšµí';­°ó×li¾ºøáEauã£ÍðÝÖµu!n¬›ÑáI™h#,q£° Þh·œ=zîMÜÎ*¾~¶cÓw¦›ëߨyoæòhÍ}‚6žÜhø¯RáßÑ”ÃÛ õ–ÜÈE gÚ¹ `[œºmƒÑ½é¬«âüµ¢.;T¤;[¥6Zh ãN¿qû¯œ›«}ÅÎX¥ynFY¸M»øTŠ×‡éƒIœè3›6D]œ×ç6jmŽOiËÌ nLÍ/7Ë;TèSâÕåMÇÇF4ð]0æÅx¼-hC¾"½¿³òºÍפ+¯ïbE ð°‘sÃ%çeßèí¼Áéntxå•€ñ,õJŸü;®œ|59ØRñtÕ‹»‰I^ù–S`ôª$À›xoÒÿ/gÁõN<”vŽ8û°l³6W{ùWß;Úq·„.l(ýÇÆ:Þãílétê‰ÆU¬@þú?þ¯'÷´åÓ!–Ö[Ïã·hF3³ZÊnb)µ–T†”Ëb$2[kc*îÊÜ}˜Æ¹Pk]ZG¢˜)Sf(^ÈÄK÷èQŠ!ÕKr_™2IKǧŸŠÂ–ß}ß–þñŸÿòéçO:tîJ¤<–ÃþmŸÛòé¥zió¬Þ2"Z’p™yÒÑ3Wf¿1 ÊufLÁ<óèßµŠxÆqà&d_¡ÿö ¨Àž@‡MýȦώX3ú Øà€ I¡xŠçÆ’³øT<áóܧ=lÓ`,Õ}ªæï¯I4Ò ù¯† i‰«¤2•K›{†”ÎZJYæ9¤UꇶžÕkÓ{F Ü?qhà `)Fg{ÎÝ7Ñ;Fç„—£=@®{c,gýŸ1݇1,:¢ÁŽ_š(èªRXž×‰g†ˆµ£À]e ó úð†¹s·àó,rª>Õ©2•Ê®^§‰BÏCfOβÓRͪQd‡"`¬Ì­gfݶÊe® JD ûp_@$2`äD!f;›vˆ’Vò Õiú¶˜ Uqªí¹eô«íЊ@{†>õJCå’­-aDt¼|§RŽìÄgˆ±Ð[Gt¨ƒ´ZEaD‚I†Å¶'§ ‹€ŽeQ*@¯¦–‰N~Üa_€Î}Å à°pÕHL¤ ½I†¹1R<¹æT)†öfnj™]*Åj±]V²ªn=Áåè2¥zJ2eöH#{fÓ@ðÑ•^4ÏÐÂ2D_·.ŸŽ¥#…ò˜½ö+HÈ4û‘ÂŽæ:ê(Þ턼Ðá==³w¬{Û=Á«y!J™vf4ÑÃ×vòZ24²ÐÝÜÍ Àò²rwšº`†ˆ0#Qé–`àeA›‰;Т½ôv ZB©ì­ÛÌ{—Bcéâ“d¾i9ȶÓÿõ¹Ñ¥DXF*jTˆyŒ@8Š[Å ËŒè!É¥–Kw²f驆PÈvܹ+¦¤•iŸš70Sè"Ç|«Ã‚©: ¿ÊÓ>œù|PZö”˼ؔ*ò:eÏÞ{ùð¤³n™Š\––¡õoÿ͇o¿ÙýìCDì¦i˜f^žK<µµ^J5êÌEÆ¥@è—ƒn: n¢c^ažÛha¥ÛðÌð$Èq F/r½t»÷7ôwm¡®‹¸ánãàÝpýa|v¼½Š^½e¥wëaPúèbÎ9#.óœûdü×ÂÝ/ÅúOm×_z®:»ÇXóBЀg8„'ý—ã}^ n&îæ¯@¾;ìø ›[¯$õkÀx,FŒädpÒ¹å럅|/o•W9ð%÷ÿî¼Ý~ÜúW¹ºÙ^=Ïò1×ê¢óó«½eûŸ“sÛ­Â;ñmN¡ ÓæM¶| T>2¾¾g8¬;o¹Þt x'ï÷JÝ¢.7 ÷ &Çb¨·´«ßWÐ+m>—»Ç%8Fn1¬÷”yñnwf¾fI~KêZçÀµ"ÃÉŒ€P/OåuòU<^`Vg„­J:nDü.1¤³ìOIóöd{ ^ßèñë,ÆóšêÍÞÜÓ5’~}ˆú_í»zïñ & /ÙoÞ|ï”?î—‹Oâtoƒtº#]õÊâ{·TÞYn§_)u_Ÿ'Ÿ&ï>[á¬ëÁâÕüy( ñ~[e]Ô—ôJ!Jwçñ}Ðí.àÑ“Õ]y¤kQôËpèá'éæcn–ÙçLë 3‹ËqÒ=‡3$ü.)üûù=øšbqwO½YóÕ³cádÛÂË;ùÃë ìUùåµép‰.¿c¿â©–øSb¥6|4éô¨nsGÁˆ÷Êa7ò½¯~7 ü%tòa!ƒ›¬êZ\ìÁ7Z4?0éºÿ±7ÍÛúù=.È;¯AoN×MJ÷ M¯;¼Þwþ¾ãüÏ\T#uöE€.¨ k©ýÒÛø²×~%@øío~ ÀÍ”yøý§lÑ—FÀÌ2“N+Nw+^k…[d:4ËT£Ã¬°…‹COµ/ ‘b† EÎß÷ÞᆾÀ¹Ð„ÖAÁ…©rÍJ™soP眈Ԯ¢ ™"`Æ !¤¾Ð„‘¹/]2™«~ú¥ÑÑR”>X<•H7x°¤‘!tµ€“—½ãû%`´Ä7'=‘îü8¹hM4º!’æ@²IsËÑz2"f#Ç·T½+‹¼"GIÉWsl$´€£ûÄ€DoŽQÂËP+Œ0Âdt@†4éè6a;™•šSØ„ºó:+ê®ì¿ñ©‚+´2jbÅ-Z°«.§™#|¡%±$I¯nFdÊÈb Ð-–¦¬–à¡ø±(ºbQÉèT¡ìDB4Ê*$DǪáÐÔ‡°¯ý7et ‰!…0 BÃ+Û IÄÒh\zr΀—Ââ eBq÷ÉÔ{ô1¸iÆŒT.{“˜;ÂÄÜïª,3å9%ÝP¦æ1UKY†%ßô³Ú¾?,™QÒwJ” þa×çE†0š•\–ìÝw»â47ôž=("3Úa‰Ö ü—ÿú_=}xúÅ?ý'™©L”:ùüŽ˜ÅH.®ÖZ¶îà¿4^Ô]ìî}YêU®»2@üüøulÜ—>%®$€Þyׯ¿SŸ=€×¸ð›ŽJw°#SŠ÷FäD üªIÄIÉû~”{fVèšX2¬ŽœÆMâöÞõº!†ð=!ä ñäÕ§'^ÎÝV‰® —w® kË#måFhMAy…=ÈÇø¨¤ôg*:µ»D«Ó.ÄdOV`7±þíâ¼í‰ÐÍÇ;Dп¤)æ3wƒ/ßʇÊÐíÓØLáÏ(àæÅŸô×þQ/ü‹äþþòúËë/¯¿¼þ4_¼ãEþ—×_^yý)¾Ž½zM˜éÜ1°‰}oB¯L€¿ùͯOFv‡ï>Í/‹ ¬¸¹‡Ò̬8Œt«ûÈa¤€ ¢aîÞ3‡inq/î}…ï2Û¼¨5Öâ5r•ƒe7±°,ÚM¨†@DðÓË"±L.e(Ï~XüùwÞ³ýÝÜ ‘Ù¢¿¼¼ä2gô’û ÐÄ0ц¶Æê=d((y ‘! î€GrL8â°µÏKfJ0ƒà Ï~¹MÎXAöÅÐól!P' QÌ L;޽F!L]ÝDz&óEÏ2ò÷)"±D/Ù£²,­õØžê­Í ¦:YQ榹G ˆX50äzŽdŠÄñúSê0ú†ˆ # s‰ŒE ¬¬8É芑Ã!€@¢Hè ^ ûo8=•ç¿kÑsÑ`Ç[Ù“)e‰„sL¸$²P]”(s–©(™6Y(CYAC‡¼8Ý‹s ô%º›W·Ñ5;]“µH¥9˜‰Ž ¤‡x—I¯ LHAZŸ, Ú‰N‚’y†Æ]…ÕäÏŸôýÁÓÓÇþÒÚK§ùôá)Z,¿ÿni-^fà/qˆî“ˆÃ%†½S¸ô’(Ƥ4ÇÒ¹´4²ÈÌU‹ Š0ˆ±´ø=XÀâe¿ƒ¤YÙÒD‘FcD¸PÍXl”¬ž(ñœl¾ÑÉaFe¾Ì2)É}A-&ÉÅɸs†b™e´}ñqXr–¾5f „;[¦­”.["J*¨LØê8Zb8†-µfÄ‚´#™nti¢+Š­90xMaWR ؉Ò«qR/Vw|ú–»½àþáC™öV i{5˜eegV‹ JVLR¼’Æ!$F#¥˜pXÊLž½«Ëµ—Ä30·\л²"›—¤5EdH‚¹Rè3Ü0:PBCyÌÏhÅêºC…Œ«&ÒjÈ Î2 ÑÓ`9¦‚Ñ…Ì-•jÙ3 CIßËÂÖ›%:K›Òá ¹³xsN/´œJkÝ÷ÿ=ÊTú®dßÒÐ7ŽÚ&o>QïZjo®ÛE¤Ï[¯üø²K¸îa;ëÄð¬Rtyk¼h2ÔC¸nŸ–îȦèÔ¶öšéË—žÃ·í—ïJæB×kc‘sšl¼^5…›§  «.gÊ]]’›)õÞ‘UízÅò™× mHg¹¬³ïy ñᱡóhñ-÷å³p§p3.–ÍvWÓ…>“ÞžŸ%“ýÚAw¥ ÅÍSºýn=ºa«QöVûÄÐë—ûí…(×{âžµ×È+ÀçóÅÄpq£ïŽ~hŒ}×¥ þôš!Ø-ñ‚¯þâ»/îŠõÿcð ñ­6]ÝÜ´Ò¾ý9º‰ðÀøõ½zû‹?HxôvV½:Œ÷Öt¾ì+êÍ„¸Ë~ç7þ–!ÑÝéί‘§ç†¥íQz coo\Çe}¡§´ýþñ—™¿ù»¿£™—ï^æç%"h†â,Îâ†âÅJ©©¤Sg^›2©'Ù£:œ;IÐ,“ÑÛ€¾M‚ÑEÍÁVè!Z1“0÷|Yúã²–µ–öëÿ_;œÝÔÒŸª–—yi¡T¦C˲¼|:´çÑ•Ý],œ ³ÔÔÊA•ék94^’åXý Ì`; aþþ€¾ÊÄc¸×ô¼Ÿû¹zƒ%܆ýKƒŠŸ{)õé©´e–ÒŠEf¤"ˆ.fz¥•tX…õ 2C<¼$ìëDÀHŠÜÙ¾VeôˆG_„ õ©20ÀÜÄ`ζ5 ÔW{DÀËt$VP Ësª¯X°W Å’>¯ó¦lþ\H I^VýÞÑÙa”D”°B®È/Í Øy$ƒ(£ÛÑí·XJë‡É«Wgwƒ¹¹–”˜Å§6«LêÙŘÜ[ô¹=»»”HÎÙ¤&a*† æ@[1÷ÌÀBG£!=´Ê°D02eÙ&†J¥(¡®œËsʧç¿ÖZ¦Òs™çÃò)~÷in z¦ºFf#ÁýEqB.È9¦ÊAó‚HÀP)ºœTg&<¹ H I»D£¥é9û¨/nµ ”Ï%ñ«É×ãYøû9#õóÌÐ23Ù€½¹EŒÌ2a©’6ÑV‚5E„Å$¨ ÙÙÅ•R$ƪN.úîÐÌèF}Qq Z2æÈ4¨Ã‰²;Ã=7nh ÅñƒP'øË'LZC îðH ¨ܘ x]3'ÜT'=}°Ý·¾ûw+Õ¦‰ÅÍÝjaºU'ÙS0&‘Vlxt‹Ý,3„”Ñ êÐë®Ð½/‹úèYY"gä3ôŒœ¥ž9g4*R ’Žlè3è¨åhFB!SÜײ ^‘±îEÜy¬\µ€~¦¾Jê-J©µ²ôÙçM*e£·Jp¨BkÈ&¯pƒgÝÁçh™ÊÒ•ˆ´'·J/Å«©bªåg;Ëjiþó_âÓ¬yÎÝfÓØ>÷;£q¿Ó¡©C`ÝMJå²`*¨ž%H­uõ@ÏeYùÏþwÿ…»×ÝnÿñééßÎó ¡ÖéZ“¯±YtQÕÖEoFÈ|wÂÀ«#ýJåø]o„~·—óNì’[-åÍ€¼KýÍ:Z\g*ÚäƒWY†¤Ì×:Þw#¼’ÒVð%O_ñŰò½<ü(E}Ž’ïhIoùĺL¡ïðµù*@ô@„€'‹\ÝQθ^½šžmRå ܳ“§êÔÝ–ñsŠÎ/ÊF.ž»î¤ö—ú—˜ÂŸ±è<.»î䌧\òægzTÐ=ìûW~«½ªñºÀyDŠŽ '¹§ °÷²}Í\t½Euk¯$¼7Êû—‚©×¹êÐ4¾‘Ow=6»ì•’Úøÿrš"ºi±Ò:;}÷u·õ‡7(ëÍ\äƒÍýêéV#_w6Õ£E¿{È‹n¥+xt+ÕvÂþu18[mŽ0oRÒawQæM ËUR«ueß—Û} Â:¥ÖIvÇm¦|aìr:xL½…+]]n%wñÁWj¼ýeâëMùÒ]wäë·6› /Â{w‡ë{½3¼ÁME=Ö\ÑkJa×6\¡»‡úýâ=MýƒW¢íº/U¨ËíàævôPãþ-éâjŽž ¼›óxì],ðTt#¤ ¿ˆ›ÚýB¯uo¢_\Ÿô°&Í[ɽõ–Žå ígÖ.=x%—û«ô‘%Š×ÝÅq¹í} ­t§’É›´E×–¼)?àrÜ1— 7W œÅof¤Î<äÛysf]Œ!/÷}ÎŽ}ÿ‰óŠnÆçxù7y_Û4ÏóD¸££×»où4øÏ+oØ„†ºÍý.¯SÛKØL¾;¥ä+A¯|Èù¿ì2Þ>¸+k“š\~Ñ)X|E$÷rä½·qÛ›ÿ>¯=¬2é8Ó.íâNŸË±ÿlvÓ1˜×MwXj jyå–q½óžsÀºè·ûÛŒ i^’h¿ÿ­W³b¤Y¯S%;eHÙ® =¸;ÀÈpãù1÷"õÖ‹œÏœJ¡Ò2›ÂŠŸçn[X-ÚóœûâûI6UÊS¨õ>+ bî~V?̹™»Ë÷ËòËËË¢hmi™3•10]ioÉ F%ÓÂÎ )¢8èè‰èXõa˜+B.ƒ¾Ùªø?hA™+-Ñű¼`÷t4ƒ@gžRm·+=CÒ¦ÝnžçÈŒ€‰¹HŸTžà“uÌû飤C{1¡x-VL`ÒÈÈY,Ë2«g¦RÑååpˆž¿mE=l ÿÇ©×ç#ªØWÉ£aŒá…+D /€T‰lHÁ ¦–ôfX¨ûõ3Çp !QA)‚ÄX4xÜJ ”yei™ T“½u-f083¢–‰°Ãò¶ÐÜ8•Rz,lÙzdð:9¨jµw¶>³`é­GƆUاà3ˆÁ.Ž!‚Ä£ˆSœk?Ù!¬¶Àî!ES™ŒOùѺ|¡#_žÛß>ƒJY¶ˆçÊ)ââPX¯v@¶þ}À\S!€v@tôp¹ ÕÑ;¼ Ö¥H!Ù©>ŠTç˜uAI Sp™)Û¥x0ç¿ë–‚ LÍ”¾uxZy„ñ|é-1>„i  IíŒ;£-Aà³2ddå*Å,3ΙJíiELà‘Àœjû=jY»LN/·µ¥ä—+k€“ݵ pƒƒªãù„W`ŒšÄ'Úd(;Ûkõ)ÄJCfV‹ÑA—1:Ì#ãè×¢d‹ Ê,MÃ4!G+L7ÒÓ²GƳðB-Å3rI”-£ª(FkQGo«`QÆ*4²–ý VšÿØ£ €­æÛë!c'’Üñïû°['‚H'êÏÙ“©aþ¡ê(t¯L¦Eñô¤˜öIJˆ«›ÊÄŠª2Y©,?~P$zNö1Ú‚|òJq–¥Tõrˆß}ŸFúÄýäF+皀DW†zIJD õˆžŠîÕë~÷ôíÇŸÿõ¯ <==)6ƒ“èÈé^/R*nq–/¡Ü*àß#}\G;÷"À‡ŸÿX!ýš3‚±ËKÒg†…ºk?§£ó]Qþ‡ ûÒ5ZÀKpæž62μÌ×¢ÇW”$/ÃWn+(«Ã¬.ÆvSx•t-(³2=p­Yq/ä9+Ô6ÛÄÎ6±¨­Ö“®ÀùQ>ֆϡWÝFÙVÐÕ%^hN ºî“Î@‘»ãå@lžñ– óJQJ'”ù”ßIY0<)êÞ‚¬Ú¦ô÷mŠÿEç_Én®U›¶ epZ÷ö;œki—¸êÛð1´vè*yÔÁðå4°ƒv³ñ]íÌ;ŽØI²¼¿ü…O›?üMü̸ÓðuHˆøé^ÿØ-=ü‹ÑÑ‹?Úñr òB Ÿ7Bó_óøã Â_Älþ°wµØQøœzŒä~öØ|½€åÑ]ó­þ`æÔŸDüNñ) ’+öv„7ùÔƒï7ÿù??Øàêíù%zƼD¤™Ñc™ê´ß¥22´â&mé˱ÈCL¥Á V êŒ^Ü 9€ ËØ¹Â¡Ái‡®Œp›Œ9Z äKïñ¼°´Ü•qGþTŠ{Ÿ ì=—Ñ3cyiP({ô¥/-#@Š4¦Lf¨L IBJRW'üU + ®+vA!Ę;éøÛî| ¹ÿȕ㯅RWnr_`‡ÐûÀLÆT«Ymó²,3 &LSyz*]‹2]¾÷Ý¡½ÌxA& n -–4/ÁªU«íz„§u)8G¦„h«C¯ûš–*’>±úÜJ°rlJZF‰l+Þ¶Ö<U?×€„ù2×aÙ} 0Þ\‘ àPxÔr!b ¬@V©câLµfF)$­xé½gºÈÒ£IáFs—u÷bIÊ(oqèÙ>ì?Hjñ}-Oµî‹×C›ÕiŸÙ[oHÉ᜜ÖJ"ŠUkyÌ: V!1JE†ˆ£1òŠL ‰&à•¤·ç~ç»Élø»ˆç¨4ë²}¡vsoÊ ‡O*ÑÜ–ˆ<4…@¡ó@L8<‹I&eÁ¢žLÉ:­bïPd=ƒÉgÍŒ“› ¸ôhtˆ,#¿ïÑBßÖò¡Ze‚5™9‹ðÑñ}ÏB)¡gRì9›‰@“–¾:$¦Ñ(e&@·}áÎ8§hCŸ™éA#‡äM-¦TDîhF ð©Ç¢Œa|M|»GÙ#Á?‘Z¡üÑè0”¸„uù˜ 8@”r\bÀÓG¬¨úPÌÝ%*ÁV¸Üi2&2“¬Ô½†n,f ŒîÌŽR˜™Ì‡YÕ§©’TJ©aõ‘Z@™™Â\´ß)¿WB rClP:W#çãþ0@v¤Îšë†ÒQ_gf´sy ½¬±õøÅÁÜÏ„óÌqM}kSÎÈñ]e¶ ÚªÓ%ѺM^Z"röG)°%b±É›WîÍ ö{ÓŽ¬½Çô_þ ¾¼X¿Ý/ršÅa&ƒVJìk>zxB’–f»=̉̔2£‡zäÒûÒ³‡‘ÿÕ¿üWÓÓÓþÛ§Ÿÿõ¯¨+nÉ…$µÒYþHuýø) œþñÆ]€»¨ÝnóVçç?r¼x·Íü,ýÀ?ØýÏPtþ= Õ&ppåap[ åOpý[»›R‡tQsz-e=ÖWÊñ’ïH\pãƒþÊC¾_ØÝXpåu雽æÌ÷|ho¸}@× Ö+Ù¯·Ê2×5Ò›…u¢¾¶d7Rw+tCK}á<äT*Ðå¦`üºËêy¬C?ðžyzˆ¯7®\Sw7-oº^Ÿº õGjüŸ¾’üÊq~ÑrPïéùùjóäó ïŠÞRÏÑ üÿ®ÖŠ×Æåv÷ä^4_E%ë´nîâkï~ ‡ÃçfïYjï¹^ù•ékM©³;Ýê®÷ô¦;ìÇN·NYÁuíÿÈr976ñ¦Gï}Ú“ü)É-îUø*!éÆöé^‡ææRy)&ó“%º[¶Ê‰XtÛ~ñ5«=WŒž77ºWÅîŠ}–%àuçðÌVÅ-¹êÜv|¼µý¿Ç;µÜCÿÿóÅ…š-ß?ÇÜÛÒ  ÝXv†Õø¤Ö• еp¸5(íËZÁÊ>¤ŠJ… ×M) 1í†í‰g ¦ža°oë.-dD¬3§»ûN>˜J¾–aõ©J²%»abùø„²Ó¼(zßOØWöŽye`f´—­ÖT*2Zo‡¥ÚØ‚ÿ«õ¯÷÷ûOõs\5KoKÝvºë:×úZhú«';¿¸Ïà¶à}ÁƒÞý—ÂN~ÕH›o^Æ&¼£ýøùý¦¼-HWý€ÛÑ}Ð𘛶;(…Î:ÉÇf÷žï/Ò>ùrõ«õ*u‘©^µ~“'‘×V—’[Ú¨PÞ÷äÙÕù<ïºÞmÛý5˸M“_Ñ&Ý>Ë·´ÿv¼ ÖnrË·ËDÜ*%€n›ƒ®fÎ-¢þ /»‘}¿g}|¡Áu¡Ðuº â5ðñêK ¶Ê ¼‘Mб¯A—R9[蟷17®í÷3ÄGŒÅ ‹+Í=DùÎxíi`x-Ú¯rÖÆiÜöñR•öÝàÏGÕf—Ôh\*¨¼W¯ ¶îÍ9ôŠœÎIe3¯Ï¿²ÙxD»WòÌùG¼‡_éðfqï¯6£À;ÇÕ©¿ídÒVàZùçr–Š×såjfêXÞ\ái$¶'Ã|å¦p3GŸÓâyn\CúÒkïZ fs¦¼ªÄµYe¼ý \â»ÐyøtGÔâjg9v^Œ2ù8ºÞÇîÄà ¼)Lð8ĵòR~èüÔt£íx¬NÞiŒ;’ý62:|;Xs‹K\¼–fÙj}žp±«Ù±-ên|rnÅô¯ÅY.|Ï‹Yú‚/´zŽ o3ÈgG“mп==7ëä¬È~‹ÝëN¡å\¦½mú½ôqÒÍaqg¶ßv²”¸Y’çq½Ñê96Ä^%pڄЧfÚË­m¬…kéGIo÷‚SŒ¡M¶Të,ÆÙC õ6×â$ÊÜQMlÅ™©Hh½zÒ±$^欞sSwùýßO{·ÉÕ¥Z¢µŽ’Bïm–ˆ…lf‰”Ü4¸ú‚ñ$¦ 2(I•€¢#4  <"×1ùþú?ß–P® [$H€~X…tzàó+°Û-À ÈHîC(?{ïBL»§ù°´lËäó¡ÓšL=>}÷]Ï^?2µ™ð&riÍÐK©SÙïì)3 ¼ìphK;dÜl7ífÍ£ÊQÊÔ[˾Äêq;®ÇaÈ;.L0»8eÖÍ-W)$/CÕ†ªˆ—ßcÚÁ Š£gé0øM˜£Rh ^±¤˜ú°šI$; ]‹§U+KD™v‰ndô–¥VÒæY`¦Éðy7©¢&ÌèfnÅ…()—¥Ú§]¦Y1µ3sCˆ.=Ö¿:ºË‚RÀºöpä &Qåt¨cú0za¾ i”©—Ì¿O|2=ùò}›3:FÉKËòü¢B©À§„í3,É®e¡\˪CÐ )™H¡. Ÿy⥸Q9VåðxH0‰Ñ—ತ*ä·]-;³ž‘É–i#Îr Ò®p «`¦T"4K!Eo€×€ãY K×äF¢€. ¤À!Fß)˜ÑÜÔÎP²KÝÑM,Øû°gg$‘Iw €{-ùšµv6’÷^aÚ |‚ñ,€#¡èèbMAé"à¢ÌŒ2¯Õ ¥næVŠ„ aÅÊT̤RØÚ##¦ºgW‹@I/Ù 9»EôƒÚ§@S.©…JFH‹"AËHE_ „Ã"{è;APÀ^×r Žu2åÑŸ#±ÕˆÍT‘P¢7x…äa]Œ^`CÌjôô, !Ÿ ¥®ÞÐPvPÀåž%(Ò*ý9‡Oܣɦ‡OæV=ŠÑí—Oòª%vûŸÍ­¥•òËoô²¨5ü>2€Ýû‰µÂiÅýçߨE, mA-i4¡õÖ{ÄÒbim^"â_ü—ÿbÚ?}øÅ·?ÿë_òTf$OçØ9øÔ}Y\mc…£~È&fxÛ÷‹7-¡·XÛeàt¾NÐx!Ö÷Š@ù›nCw [ìû•J×=}Ë2¹ñw.„ôv<‰ÃÜs>G/|5g¾g6ñÇh¹…¼?c;¼(ƒÿèKí'}éÑ´ÐäUK—ñÁ©àæŽtÏdá+lvî)ÿüH*@w;¾tgþ)÷¥?É·H*_½Ñ×;îm1ƒ¥s(»µv¿—¶Qø»¿ûÛˆî«2=),ß}¯žJ!“ft·â^ËpŤ٠µd&Šç`&s FôÔ~ªK*$Ü<22“ C­5DødÙ;YJ8RÐŒ%‰°,ÙÕ–ÆÉÕL53ÛË¢ø­SZΙLBÜa~nýSSkŒž± C!äʸ%Is $q”¸ÂHÃQ3c-â7U:( ‘ú#›g…)£\™Ø^P Ú @ˆeå&SÈŽ:Aô#iWxúø„ħç—è À Åk©žºu†ï괫˲ô¥¨;ûø³§BÌ} ªf1“;¬G¯eê ‘Åv„¥¢µY¥iYÀ(–4Ì}ŽHuŸ/HDÂ; ýGX5Ö‡Ãíð D~A$]J”ŒWBG×$–g¸£T$P*hˆ6ÆiuD ` 8Œö´Ã§mÁ4!S½eX‚i6Í­ÍK¬T¦ÚÒEÂh‚ÀY!3–ºK©- ,#{2©õÜO•ðl‡‹íw¥·ˆÖÍô@¦VÆÞR€l•þÏD™àuUsRÀAøÚÜ UÔg”wóI«ù)IúÓ.©ù%¨Ndä¹ÏH¹ÑŒ­©™:ÕaU^Ô‡¶ž€sN‰ )wdà ÈŽL¤ðqï•| eƈõ.>ìÜÀ–¢©pȶX…N"Á6)Üé4§‹*23óÊ€¦BXÒÉ䨜QØ›™Äá›L‚V”ÂD!$#]Bl¡ZLd¶Á‹²hr´Æ@>Áµk„S]Õ–Fu\‹O<:3kó=ÌA­å™1‡YE_\©îÝ}=Ù‡X`À/Åé´zˆ ¸W¶ÞS°4“T$R¦Z'hI¦,‘‹4»2£õyQöl/Dª·l³¹AsK„9d@5hí\AÝEH´H¤!µV΢alkó :¯»QN(Ãû7Î&„Ã% XÖ]ˆ†eFݣ[G e}ˆ²'$š¡ÈL…DˆôÑm}ÂrŽú³_¸Å­zy>ØL }W ËÊ—žéÓ“ÿìÉ`=Ñ­º éUÙ¢g¦Ôz?,½µŒpãþÛo>|óáÛ¿úÕ ©´’£>ûúiø,:ù&Võ™±Ÿ¾ 'ü–™ýÃ"5½’ÿübñ†W:n‹+_¹“x“)¼#³ÐçÝ»:~œÌÛÒÑ@þ˜Áø­võG+:ÿJ}åpÿÓ&ù_{×;£ÿ?ôO>|\[‹æ¨Vå¹#cð•Ôºlü_W¢ÿ%xþ2nýkß±™®lØu{xmŸ> /ÆÂx-Â[çÉ·—É›†~´³Yw<¼ß[лmnÚ-ôÞνEÜàTx§àÇ/_ð:ØùÓí<—„ïÏàÏ #ˆmãÏO±{>"æëÇÿÆÏúÙu¡bmÁøò'¸eyœÁÇwÌ7‚Y^>É/Öã×Ùi¾FTræâ¾c|¾FÿçWìúÕ[û)®Ø@ÿèU >,Ü;—·VÖü‚•xãÐzʼUø² ïlˆ»!׿£ð“>¤÷)*}õŽç7ΰÏm°Ø6´¾ÏúxÛ—õÕŒQ.¿N¶òßrÛ_w÷ûøë£àÏÊ=tÏÞß=gÏx9€VJ¡ŒÓ4…°(¯îµ”‘Çû-n)É••Ò‡Ø~ŸM‚Ðz´¶8™FÒ89'…wµ¥ÔóbŸfíkꙦ,Î%å´RÐ;?îu8à7ÿ«˜ddB=½°/]ƒ¸¯ˆì™Kïs¶NO-M (e‘RæÐÿÑÐxAG.GpÐÑ?Ô7M#g/7;ƒþCŸ@.ȆÑF'Á!s¸A¾ŠwáùÓË0“õ2>ßÊä½G &ËR|·Û{±———¾€5ñòýЧ“e™R½L¶ôŒZ@Ò\æéµDärXbÉjÓÒZïénSÙw5I0)™0”“§  ÄÓ7 #:` à2Áë±Ï4¡4 ";2axLbÿ "` Ù¡X%•ltB8èaW÷"Ù²õP½/‘tôÜOÕ‹µeé!·jÆâEÊnn t©«y èqXæDë‡ö»QÀ0Cä `^ƒÉÈNÏh«ûjö¨#¹÷0C }0 À:DQ™€…©¨GØÞð ¼@¦DÓSN&˜Ø•–ª` kRž)Æ÷Xì ("ÝJŠ&.J’)ôÈ”Jµ°ô§cI©7¸ÑŸd®è°/B"ñhMqêfÜhd±ÂˆiCÒjíG"¡>Á Â5|§9­¢hæ°ªhPS}R)é&w!B”¥:ò 0 NXŒRˆ(¸8ÈÀì„˼̆ 4ÏÏ17E*BJ*”M¹ ¨3£a9Âý£fT2ÔwôÃê²Q€H˜£îŽïOW/ Òb ކ›‚ÓA`<!±~ 5dGæ4$S¡Ì’^9í0©ë9–cb%­˜APuËÂÎi÷ /»IÓd}¶°øÙŽ=-ƒ‡¹íðvXäBkÙ»ŠI(µ ÈèRªÏK›—>·”èþ¯ÿÝ¿{úøôÍ/qsÄÞéÔë^¡r6¾WãÒ–öµ&€¯Ÿ6ò‡'Gï²6!èW/\áþ_\Ø€À¯‘´x㢰պù¼¸÷“¸I8šzåº6Ù̶•öAçìU×*&ò+®©/šw¥,N²@?Àü'%:ÿ¹¹Éç¥D?üo*dçî‰.{ô×>«m–®¾NqžWÛ[ӅЍ¡Ê³Û\‹Îžâ¸ì 9­Ž#å H#.ÞŠ³ þÑâçB£_[tR "·ðûIv×ÍàÚöïŸqÓ ÐíZ:çž"óÃ#”›¢À]E‘íõ\ø†löìMÿÏù™Üôûo~Èm]ãºp°JÅœtö7íE:pÎ1/÷î@sbÈë۰Ĺýš-~ìf[õs†šŽMª;WÓµ$þÐ|8ñïöÅmM®ßu»™ñÙݨ½ðò[ Ë>é8±}6·e‡›û”n¯á´Ð.˱g º6 úb#®Ú’Î@÷j}7+‹çöÅ£½8DyýÐÎmŒhíNåŽþÒe h]ŸÛHöŵǫrÓ*Ç«³–÷ªB÷‚ .ƒ®$®N»‹^‹:Îò麺¶jQ·ñÀyYë´ažäÔöûížž„D‰å¹ÙŽ¢{‡ž!tQJ(…Uz›‚Ÿd_¥¤€’Ȇ,xÌG?R³!“‚>C±2Û{C?À†šG®„ñ!€³úËVPC<'W@ ™4-‘™ÂáeÆ à#E7 OOÉlËÂ4kÄ‹Z¬qg>z陥à¹ö»Ó³GL“M¥Âº¬QÜâJDÛH„w7++§˜äˆs=ÃJ]¹ÿc+/1L€G[`ìëàœ<†§«°V D «°cÉf1|m¥/‘Ê€2âiª · “Y’ŒhžìûÝÇC;ìÝ[kŧ¦Cô6ùÞ8Ñ]æÙ{òÙ+éÙ3Ÿçï`P$€¶¤ûz…íðôÁÈòô«8,úfW«³0Ó ±‰‘mòüù·PÝŒp“™ŠÑL@Ë0{ô¥­ÿ´Á«ÿïÿí¿ûÕ?ÿk;+Gù ^f:cæé`¼’ˆD?èÞnòäg_É;ûÿ(:´…û¥7J âõŸöP.Ã/þбyËk™¼ b¿– ð6οüà׌~ú!ÿÇùòww¼[OþÏìày_|Ty=:¸tÒÀ%KbpoWGÛS‘ïn9Yúío~cîÑ»2Í|y>@êß=·y)ŠO»š‰ºÛÉ)ŠFÁZ„Ì&XqêÂjHW¶L*DÉ]žƒLl*ž=ºT)/B* 6¸Jï/ óИ€’/™RVw"çž´Ìlÿýÿy·û@¢?RØL¯Fdks–~8ɤP”)(¡Èxd‹3Wd XñÄ)W(-ˆj°çQýÆ Ô! ô×g¸£Nðì@ƒûQNg8‘úÿñèHÁ (n>îaxy>FØnÚ'ò°ÌËÜMVvŠˆÌlÙ#õùûÖ[>ý¬Z)KŸ‡q&”íÔ2!æÜ?™A™æ—8K©œ \ÝVI™@…G|}8Ñc½©A:V—ÕØ0`ÁxÔCUypÒóøëÈU§c)vP¹s( !P`–y‘ÒŒêáf)¨÷Xš3–iÿ^ó3eôT9„^|×ÕY½ZÏlîå©#çÃ!3aÈL5ÄL«2ƒâ(†ÎÕN–‚T£²* ÐP@:A!‘‰F=,ì%Ô•BÒ T °ðåY8p’e*‰%Ñ»Š( ’D*CòÁôGë‚ØºXÀ]¬äZ­’v%ÍÌÝIEYhfl)1—ÈB ð0¦àމt£ÓBèèsfÏœŠU˱o™ñCñO-)즔q>¢‰n´õL'Hš͉x²ÒÑ$|p8Ñ3_S5UÇ!ˆ•ÝÔhdÍáëQ* ¢!sT‘8=É -5\©#‚Og¥©Ñ•ÂiåD_gìX_)˜c}²:Vw äÐï’Æö¾|ßüÛ——Èöéà^ …’FºÐ{Dª'™mJ’Hf0ÛŸ Œ‚ˆ~èm^PIf.Ñ»22Bq†u´@ŒídT r¥óeb¤@a¿ZÍ·!X_£%@®®ÚÐÚµÓ™k“D;@D)€Ð_`˜n(vôOö²6먃™HMY3 uh ªºêžwgåSõožŒŠ[J¾Ÿ¢Vî&Ÿ|š#„Ÿ} ïˆÔÜôÝb?ÿ»){ ÷HXHÕ%(‘Ùz_Z¦Xõó7ó‹¿þ'×lçÀ ï)þˆ±-¾¨àsɯÐ8~‚€Ï ?+û|­à‡ Ô#péŠ*ñÈOõ­?·Ì¾ÿwõ¨`#U¿•ì½à¾p͆!‚·òøsÉë¸dË­ç2ïÔŠ>o\x]–Áô*$È0/ÿtD翨à´}ávðãsÍ ÇjûD¾.výºfÉ–0÷È„YzC²‡@á5¡öQPïÓ¯Þ®gþ¡iáÞŽéÝÀƒKÿqú|Þ>…ô“ £þ¨”?ç‰ëj*¾I¿†žõµ¯á+\ãÍþcÌ ÇVEïÝ6ìÖËÂ%÷#6^ðÙùõ&П„ܹôE%‡Ÿd[ù)$nxd§àNøÁsßdD_½œ·ðÿËQÿØO±3lþž¸öó£íÏXó|s!Ødz=¾*"é†ev¯@H¿ýÛߘ9 Ò@êÐÙ}xÂÂÜ{¤¾+¨f€OÍ’°,è=Z @FHˆHƒ”rg]y`BëKdq+n ©TÉ„ËEdÄËR¦ŠPÌÑcNÏÁ†æTÒÜŸ&´øô?ÿ?d]ìuW3Գыœ ÓüÝ!#z›-cŽ–FªC%m}G†aìäÇ6´AÊ*©‘GÅ|h0èÿD"|Bÿ‡7ÐÑÒÖa¶¦¥nÎô\õ¸G½¤îΚB4¼,/(;ìvû #íåÓR¬r·Ÿ"zË`kʼnÃ| ¡XjÎåð©'ññ»–3æ0ÆÒ^Ri,Ó@cÅÝ`\YÃ[Þ±òŽ3««ô¿+@®>ƒPœDOX\©ÊJ ¢½©¸qŒl-Ç2ÖÖ‡h°QYi0ÚÓÓÄËá@ÒK™œÑZ;Ô½ïöûÞ–ù¥÷¦Î´âK;´¶L»Id:Õ³Ú¬E¦©NHPˆ–èè - p Q&îP H¸ÃsS~²4ð[ ‡ *̆˜Á1«5¢SnÜUA›—b£‡jÈN¹à¨ úê«™-©P‚`R©*d$#E`ï€0|0F©©xAËU•g˜Yxb’«èƒS’Tè†ê| ,]ÿ¸cŠ•¶D¸³š9ƒ‡ ’(m',6Š^¤)°,D=¨nP6A‰€˜*D@-%1\£eÈ'C1ºAPË ‰ÌRÙ¥†trš¸¤¼"G\ed,Ž„2ÀÂБ£SDZBzGJ…&$‘\+IÃÒÇFú\ò^>A‰ßÀ*h+õ,NyI ^±´âÏÌô1ù'#³‰A¥”zÍ@óh®4s£LS6P½g_ Rcí@«(ÖI¡hœ'}°*òs÷'ÀºBy¤T÷QHÃ*pDÂb­×Þ‚áÒ _Më9ˆvè3@@ íÃu\@„ØmQ¤&LJˆÕàÅÍ­¶Ý'~ñ³ú«î//õiZjÒRY<öñzòÂEúŽß–h$v“Ï¥!{¦Š}éÙû‹³âÿößÿûŸŸDÿ¯É Cz3AúGIPï¶-þ±EY?zx|ã‡üƒÑÛæÏ»€¯Nû†ÏŽ»ú¬ïnà˜1 ïr–ûËB§é=y雵\z8ãÆNW€„´|γüÃ?Þï†Ô¥ÆÎ;{Ž$áÇ2d%.-”OöÑäƒï<þl›—ŒÊtò¼¾§ °:ikû·‹º?lA)—âÙ^~'3 \9mßKöÇ…–K¹žNË ÁßìO¼ïÉ|¥óÀÕχÞÖM#ç6­ËÄþŒ·éFåä.J¶}:7î1âñ>ïÖ Æç‹9·Ýœ&÷h Û‚$¼º‹»  •\Ê(ðrǦª{1‡ys¯Rª·­ºz:‰èܨmó¤ó… måN®NbWãÉ:Míãx]Øfœ/ñJŒGwîòηl”ø.í!y³}]Ž´tÿ€¸7ƒ·ZkÙÒ..uÕÒ]J·*O«æÄº`yír¶^8Kš¼ëXyIÖ5ZvœÀ›=ôz‚]¶3j«ñr%þ²-ê®Ã¶-ÙŸ5mÈÛ­|#®µjÞNôKñÁKº·¶W{¡v©ÍÇå°+{ynt®r’×åuÒ ãfË|õÍ뿪,§sía¤Smÿ¦]ê´Áó2€ÐNç s“G‡óé›xqr‡Ï±ßåžç«6Ćãùu©ÍtCï?Å:¼<ÏÏRxÿ •é.ñÿõ4f{îœJWjŠ—êð«·[ʼn9]i¯½'Ò¾J†_‰B·©ÑaÀ7zd/ ¨¼–…Ú4<ÎŇܽ+Ñž‡-Àzâ|;mïÕD¯{Æ7ÙF;h{ñÚckÓêåeñ"ë2ýÛ_{)4öç9#Õ`¦H4ÕIFE÷Rlª}HtHj™ÅLN§­^¬ 3Ó($mðÒ3“=•"æ¬" Ÿ–´äþ À…BMÅÍ„zfO˜Ùnç¢ÓÓJÉÖ˜EM‚¡Ø*Î#Ò¸lfH†•ž9þ„Û¡N8)ꩌ6$PÌ@¥d¾–êVï†oF!DtÄi°‚”ˆˆÙ{X‡Dw 9$ƒò¬ +%ˆt–Ó®f/ƒ‡ß–çX Ìôü;õ¦ë"¼¬"—cÌæ°‚ÝÓº.tZƒÝ †û±N<Ü\E¢ƒBŽî™\óªa0FÏ &XYÑè`G¼Â‘° hmë Â(º [Ž`(c5`§’IvŠÙT½rú«®—Ù@µäós©ÆŸ=µÃsìŸÔš½™?È=3eEN›¦Ìl½ƒ³ìÑ[¥gQ3¶êÿöoþægõË Œã|´ê …msøMt}–'ÑY™òËUk p Ü0¼’Ë$Zx£NƒT _ðnE¯ä2n wÖoaÙg™ì/ìz½€®¾–w/²—7ó/ñØÚ"œWè.¾ÐTùš—“™ÛKÕY+ä2¾ÈGuþ^Cƒ8aœGŸU¶[íÛ;}«'ùYU©+ý&Þ°cOÚ([o•˜q•Èo®ê&ý:««óÊu]ÂCûõRwëŒñaHK«ÿ“߀ÝÛ¼V³½È".¤’ïMƒSÓq ïæu¸*ï~ض“`‹5^åóW‚Þ·t$^CµÚ&-'©ýWØS·ÉìôZ›ìR«é´"6šñ[Ÿfm•ãߨ†ÊŠÔóÆ*—g´Yç5Œ­ÛîÃÍ—·zWuì‹g²îá7{ëí‰s{žXiW—~*´ÜÃ\~H‰ïÊWy£ ½…Òu‚ÿ7~'w•à¯Ï«w!u«ü”ÄÆÀ䵢ϗMáŽ%æ»KoIA=þ9U¯Þ ÏUºK t½ñ¥à»ŠÒÀ•^™=¸V»Û´¢;ñêgùú>¨Q½:).¯–Ûé—MŒ-FÅ/5Q}W‰û^·.L$¾6¹E·Hý2ÚûoŸñ^ÜX ü˜»Š¾àW.Ut޾5ÐýÏ\¹Ê§µ¬›³\_LÑýe¤7ǘWF67[žð°ŸèÔp]à—ÌÀ÷3˜^ÏJeþÙ³iÖ}™.ùžÝé Þiî÷õ }ïèÐ¥ƒ6_ÕQ[Yu¸B6oÏç •¿ùû¿3³öé ˆA‘Î š“+úh¥tˆË€{-`s[vʺŸj䂤”Ð"§Âb4©µ½“«B‡çV÷0Z1/‡—™ÏiCï"’µ¨¸z¤BÁ4,ÿãÿ}l‰–1Ä9SlF³Â’‡–Ö}¢ Tëý æœ]‘pm¬VèYäÊëG®ºCXcpó‡„ÈXá'uø$ðieÑž$•¼ ôûŒåñDL>æ¸^‘Bµ•üÎ#Ÿwüc*f­}ªC΀¹yqÿðq•%—/íe‰šÕ‹É—%¦g4,=­@B¶d…“î%¢ƒ9øI@,ÃŽ9ä@j•ñY/r¢T^`Dë€Vn2¸6:ŒÍ0np Ùø|8W•mì[å ¡œÎg]9yl§U“ê6M»Œ>/-3¹›&3OÚH 1í>J,-i^wӾ缴nY‡%­aæfféi=ZW¤D–d Þ!§Lœ '$N&‹Ú ¢Ó÷@¨þB$8‘…NæbÞv=MN¶ûþ¹þ·¿s——îÏ-—ÎR‹O/Ÿì) :ÝT(%²³ ãáS;t‡lØ´2(8Ü1VÚ¢L[e‘KÒ B˜äN32SIvhçn«ø0Ÿ «9€HAjÊZœRïQݨe?–òÒ[ëDS²°˜›°7vÓÞ¬%z¢u‘ÉÁPè6œR’D!—vvÔ‘äÌýλ'•-,ÀÐ ²u¥$h+ˆÑAR1 ! X1±¦€¾âHî²ÝÊpÿ^ÍØÚ²ÓDx‡ãª¶o^áãWŽ2_ê}¬\“¤‡H)Ö.–txUú³šeGW*3ceôׂò3D_¡^×—{+:ŸCdÌÖ*Ԩ똭ëè3­N!#¢ƒÖ®šŒ£FÐÑ*àDÅRÀ†ÎØÑfèÃ/AèG÷òêf²vÈ.U“‹™,(ZDqs÷ZÜ̲’»É>~óá¯þúðé·™©ÕêÇà ö‡Ü,O53ºOt×KW¡M®@檤–¡ìÑ—Þ—­g&A¯þoÿæo¾ýë_o@—Ù·¶ìÀ5’¤^Iô*lt_¿õ3µ·‘ÅÑpò¾iiû™>L·´ë/I’NŒÖ÷ÀÑ—Ãõ…rI?€ Xò Ü 7}Êü…¬¥ G±[›½wÕs‹ÓÞ ›°ø=·sA'»ú¼f-Jy2¨»Ž#ß5c.Òý0[Wz9º%ß–§îtWÿ©‰Î¿‘×\ù޼Tm4n^É9øî¤òv5³¯•%2“¤ýÄm\ë—/ü„òÊY«÷ίz‹ü‰ÇŠ÷Ó¯u ? àðõEˆõÓ??Þ—~ #➺ýOõúC™_"+ôPó“(ÅO_û#yñ'y”XKþ¾‡MåpXô¬i¶:–‘^=çy–«Œ€)%v¤€@ôUi$Úa_ÑÃÕŸ V€!$’Cä怠¶Z³ÊƒŒ<$}¦£Ü¿C"Ö}ÐNÈC¬RKÔ*”4:H´žô^lÚ¼ôÓÄ:wY§Úc)ÐMê¥V"[[ 5–0I ‚ÞJý@gïÊŒª×aʪ\“Öbµ/­{Ú$•É*\”#»JE‚¶†|…0Å¢ùpÈgÅ3¹íõí.σÇËó÷r%TH/ˆŽÞÈt_]¦ç°P$îbV 7BF©î±4MN÷f­÷Qv±'ó¹Ó “H13ŒLAÅ DDÎ ìÜC餫YF@^Ðjå¦÷»z—–”ØFk¥cúðkHÌ]žÌ97µÔÎÐv}Y†Ü¼ªž,S¢ :‡±îÀ¦kz_t“Qf4€ìc£ÀýWåв_—ó3ÄXÝ…`©ñX-E¢$ú²JðS+ÑuL㱜3aŽ\Dœ¬sÝv/ŸÔgfbAž”¯ÆLvX"r½¶aYÌ“ÁòQqXÛh2Ö.‡±êa qHä#×JI,¨æàËú[ŒÕcC6¾º‰Øð?H¤`eúÏ@ö£çýÑ‘¸Š}†(B‘ußÇÃjzª˜¹Sœþù?åÒ¦yiµªF~xÒÒ‚ß"w=ìÃN-úaÉRQ,‹"¸ŸhEFôÖ³GöÈL#­–ºŸ¾ý«_m)Æ› ÀEï%þ̈B]ÿ³ §xE Ã]ù§½¶¯Ýv¬H~Mrû|:ƒ7a°•-¢âgZξ‚°¿w–üa‹ÎãÕ)ËÏÅV}ɸ½ÿ¡<¨W½ý(±Qc¸dJ¯åOä©åôK¸O=zZ\<š18—ñ6¼«w–ÖÀ1Õ?uϜدE<º¶Û’ö–È~îÓ#®ëQwã¾/Êy'àjÚ«tàmIó$nrG:ëºö ¾zÁFÓ¥úÇ*ät-¯p‚ éÁÒÒ­'ý¶íèö"N:?ç²ã59t·…77õhŸÐµxÑY ç•ÞÝŠ?mnäöÙÜÎÞ±ì>×o¥Zî ×ÖÎçq>=-n…Ýy:bpŽÃõΕrTÜ=é}­»Å©wë\l¾ªbó®"…®åƒxÀñDÞ Ø\uZÚx-¾vEñ¿\¹øK^Éž=ð8¶‡QoLøÓP||˜ßÙ6.¶†›/9wÕžïöjú®ýjkƒßYáäf¬ÏOm#ösÕ»QD¹=çNŒ„MƒžÞ“]¨âܸ«óÜÒµrnV· N¸h?~\¨$.wá«möRkhÓLÉ tW½Æ<ÊãˆH¶ïY2hóSIU·¼ï伨lt9µxý¾«6nB›«ËÙì°[¤tU¼ÝÚîìbzø!›ì¯ *zŠÈ6ZL࣓Ÿw÷sOâiKØr”.Xmº–濽3]x·H½nßsâøàjö]×0îóΆ•Àfsú¬ç4ºMnBGmXHâõÌ<M|”TðâD<>ÿÏNx[°á!ÿÕ¦­ó–¨;9Œ.÷Š ºß†ðÅ£NËù9…¶gy¤cì°ïa{V¶ÜÖf9rE è’_Uõ…lÂÿŸ½k’$I²4±s˜EÔÌ#²ºª§{@3 Í^æ‚Y`±˜¥ÅÿŸxÂDK¦/ÓÝÓ3Ý•nª"Ì¢f¦vuÈȬ¬ª4*ÊŠðp7We9Ìü†’èã§êÎÜ+ç–‘ËŒjU™ó²¸+FÚáóÀ~7ÍË2/Kfʰ/˜v¶, ÙTwf¹ôYõѤ±ÖgÊ Ô£v¸CpP(fˆ¶"4Š©?0›ÌW3wçx$æÏ*ûcØàðØ*eöÄJ®Ö£´í½ˆuœG]6F‘2`¶*•^lYZS€PpÚ•ŒÈðµ(1ÕJÚŽû¹}j­OåCïyP[º;LJ‡²Ï™ís™i åË2´Qt d´=íÅ,S ²ŠžLƒ V<,û¶0°¤½šßÑLÅ!ÝZC3ŠO •‚"Y÷Ø}ÔòÊöJíà„ˆ„йtІ0ø >|dïH×´#ŠHdX.| ?¥QŽ5sÄSBÔh…ÙïTS¬ˆ)£F&à‚ÌÌØSNNîKJ™øÔ»w*QÌšg!{J!´`SF¶¾*ÝV†œ­Ù  .†" âœ)±-«H&è2žÃö =T»ï¤A3©ÓL"¬ÖãYj%é‹G;\7’žÃBÃNñÈð)˜vè}]˜n(umÈ@ôÕè{M ù†ý@ZósCU—p8€Ó„>£½~̳„,+»_óÕ‹˜u-جÿÁê¡¡/(e:ÚH–©´ÏÑ_G duÈÈŽ2`/àè0è(Bë°ÝñmÇö&0óuõþ,çLV;\ó\–lÊeé{3ws¸GeñbµîõgñºôÉø¡Ú§ÎOa>íf:£ ™ÙƒV¦"G~>ÄKÅ­º¤ì=zDë± ×ß4³²«u7ýÛÿï/0¾W§‚+§Ô+Åëd>®ºÓ`v/F¼[K»†ð±¨ø„·bÑ»Rõö’î¢pÃ'|ôãôÇ Ïðê¸È÷™¼.é‘ʺ}m ÂxÔ ¿L—¾2dÞ¢ÆOúWû¥«èú ]“ÄÕwÞŸS{æ–årzÛ3™ñÚóÉœ¹+ ß2*qAµÜxA=ДΟåN€®lÇÖ¯vß0V‘°!|ŒX ÇãƒÎ ?òÂZà–€W÷â !²·¥wB™)-2Õ)q¥o TÑ{’˜Ë"7Ñzïe_$³¥ùÜÊžjÝkÉD¶„!?Í¿ýýß­“‹§2d™Ö¨‰Q”J=iºÓŽÕüü)X:L„ÌD¢82¸ÈUÚeé£`8awÍ x±` =ŽÂP޵´+›«¡ë×FQ¹ˆèÀÑÛÓN• ¶BºC«Áìø+ØËè "2£yM ‹Hõ.K¤)úaðýnÿáã®÷,µ¤Ðú%uã4Á"£Íû_¿0—é»]‹ì‡¦”0W©è‡•Ý?êÆé¯À°å±wAÈ&$D˜PªI„ÒËpt–ïV¸Ê`—t;hk‰ñh‡åïàšèÈEafh¯è3ö‡ )€Á†Úµ˜Û’ ؽOuÊÌÖæ:M,Õh‡åP¼îöÓ¼,-—LôeIô©0å½w„¦:%`lÙ v!v&Ťf²Ò½ôn-;©è²…iċ̌éíïØ!7¨kG8;jafö$QP ‹[K+1}L€èé2UådÑepwfW‘¹ô´Š¿AOpÆîƒ}JÁê´£<ÚbUµV["A(sGΞNd(¡5É`r÷b1$†=­À³‹ÒàÌHÑ‘L’^ݨaÄJ6ä!2”•îd(9lèÕQ”=”QþA&ZÛÈГ–*¦$SPÇk¨)Tò»Â%4¿Ê+l}ÈA¤U0@—U˜†" Š‘@Q¾—g¦Ù`®¡ïŸ\¦½‚+g*Pe’¢ í(ðD?zkO/ˆŽœWãk$z‡ÅÐûÑÐ;ÖŠûÕ#ÐÛ‘vÊó Ù¡á¹!˜‡OPB¶‡lmjÁÈÚš:Z]íè7äoŸ€d‡:¼ªÏ]¦²_ý4r•åš•iÅ~rÎ0 ×5œ<”G})ÎP²5—y´ø^¿‡Ã6À¼ÛN¶&KK)u¿;óRÊ?ûç¹DfækÚ®âåãÎýÑ—Xæ_&û¸‡µŒO³¾û`¿úH³$ÇöÖ3"ZÿµÿeW¿û³_ÿ·ÿúßž|°fc7‰~»g’¨M,õþpÌó­ï?Še¸´“Å z…›b¸/£ôhÇWE _¦¤_‹æï,ƒ¸QÛîbiøÖÍÑ»KXÞ݃«”À;ÆóÍú3ÞÃ=ÝUÿobûÇ¿þY1ø½ñyP”ƒmÏÌý#/–Åý¸÷«½¾úI”òœƒàu¸|§îõZçÿ žS¼ÓðXh=Õ:ãaEݽE{kUx™”åf“üê=ŠWP°mRíÛ;4ß—x¾Õ«àøÅßW$Eb=¡üòúåõËë—×/¯_^¿¼þ _vãÏüó¯Þö÷ÛÔ )5¤£ˆø«¿ÿO§ŸÖrFFPr’^ðâpßMJ!`ímž©X–¶,JC)…ÄÞw­õX+¹’ÊåóÁLt#93+!(ºÀ¢7ͽ÷=ÀTXK¾öD(Õþÿovõœh-˜½GdiPêˆq s¸%bÎÝ>>~,ÅãõÓKö& =®ÀJ0MÌ!˜eX^Žêû³ú?=8~%_,ÃEs‚¾úˆ§Ïêj»þ"BÇza–µjxd VqðøžtD`WJ¢ŸwÇÙ'•Óø`úTŠz" ¨^Ä0MÕœ}‰¥µŒ”²xAI2A,mµµÍ–my­ßYï-zZê𠵆(aÓZK )0C­è32Q*äà|m˜PCï°½hȤƒ™90)C3‰ȶf”xdIˆ8rTŽuЃ“^&d ŽÆÈ%Û2·– @žÈÖZoYhé-£–ýôáe¿d^zW.±°¨ bŠîpa²úéõ•—‘à`J\¨ %|¯Œ\BfZ¦ÙDN ‰ÍæORf,ˆar°‡UÔâsê`¨nn½ÁÌü§ÿ»þ ßçë~=dñ—©L•Ó›¥]Ôù‹2š/¿ÍR‰Ù’¶t&ÝÌûÒ_J´LîÄ®x)þÁM©’Ú^[¤4Êè§âÝè‚Ó;¢ÒWcj³J\ÜWO edhU¨FMd¤Y<•–a22Àì *'± ˆ9:¥Þylà]´ÄÜ1§†œ]“Z€&‰»½†·Aý0̇É*/G5Ÿô* ½S!V•r,Z÷ÕÚ 2X_H©U¹†e2ÃŒFë7°"f0)VÀc[iH¡'Ѐ;²!ûš¶cŽj|eTÜÃa;_#}¥Ôiø! ««qÈIz ¤áf|¶­ÂÊÚ•ìrd‡ûÑ6#‡‡F/N-pƒˆb+/KB¶5]1,Ê×’][¤ÕÅäêD{R‹ÖŠÛ59&™6zq:T½Â<à}?•ý¾ŠWÿóbSQª{öµcgJö[ÿÍbkIßïâC]¥{PŠ™"Gá_zF´Zênú—ÿû·&®u[Ñõ³;’ˆü/¯?BYìT,òL¹ÿÝ…•UãåýEÜkãêÙíö(yë+†¿@çØ^öÍ)@·í×§|˜è^WŸ 6vzPøÉ­¥î—õÝS§ué9q‘@Ùº2o _ð*·‹kÔ™}qæ»uuþ 5þ¨*fêqÁêr‹8‚¶½)7÷ü¢[ïÜáq ;º¶i}ÀCÐûªfŸ<Ë7,µ~äšvq½>‡N\òPVÐÀSÞÖ£qm¸ßÚbîg5Ô'Þ²]d/‹Æ/K‘uo3ã+—›*þ{3^êÞ¯êŸoºFîWá?!è¼±îtãoM=¯Å^_ÞÑÆsI\y?ÓMï󚸹ô#鲕›ÌðlBOè‰ÕúÿäÃ]…Ï­ÌOÍ8ºãÑýÞN'½µpßhàfêœúU¯š•/ŒÉ7gÔ—ÚnVÜ]_§‹‹›žd½cëzvO.@+—FÊGŽÊ—¿ðþõß ‰y9|Ñvɧ³óêƒó]Þîϯaë€}2°»þùM¹É·,o¸Û~»Ã릵ó'‰r¿èûyÕ:xÏ·ønÉ’îTÛEo½KµØTØ’n=[(`ìõ/þŸñ¡f ¦õX2©¥ò¦±†–fôÙÌ ë½7†¹IÊßþ}˜àã9jùG½±¯AíP6ÇàØ0\p ^^¦Ýnz_{„Ï Ô¡@›aLDWKÍŠ#9|Psž—Ö›JÙ•š@ºÛnš–¾HH‚Âò9{'ˆÈ†© -1}d 8JÃájÊZ‰l)ä«° ˜!a0@5°îØ]ÓËh\_§qôcɳÖD KÐH ôUµr„­rÁþú +0G›×=‘0Z­S›—˜³î±ûnš—$4Ù‹å´ä¡¡y ¹[ôÍ |ß^ è¥C !H@ßSI6cKš%Ýè¢J æ{õDjG¨ú’YÒÜÉ¢$F»^™³uˆ‘%ä{ñˆüÇÿÜâï-”ð聯ÒEÄÄÜyM÷iQÚ|€¼rç¶8e¶O/Ä,[òujWª2M…üPÝœ­õCäT¬&"ÆÑ#õândëYQ)U:M…l‘tÑ¢CÕÊ)„RILàµg!‹›‡ZÏ4˜`]° SwiÁaÿÀT&Íà KÇ`²u!R;'C&™ X 6mU@è HÔI¥ÂrHŒ½Ó\$ÍVœi¬@A¹¼¢Fb c´a˜™Œ‰Îq˜ÌHëä°ô*ãÆ!Á<ŸÒGïKû„XŽ+zô¬Ä:‡IÀøyŒÛ2Ð: 0}ëš²&ÌÆZ€Ðù§† ÀHÆ ¼`ôbXA ¡#ň„ïVc±¬ÛN¶Õ-YBuÐ CÓšl¾vÜ‘ìê({Üåpì‚*NÐÉX tÛí}ªNÓT— OŸö ÉÕ—ºûh_êË"ÊýË^Æ84¸+P*†À׿eXþö¥g^½î§ÿþú÷°èöÄwBä=Žïê7o)\7±ëùmï–ÛßHnŸÂÛøAº‰Fô̵`sÿ‚øçÅì_äõ=tûæº òÁ\ÇMÇÈM÷t†;(ž¯ú7Ì Ü±þâX÷ÈðÖ»d‚“nù 4ÚÇæù=ÖÍ;ïþ–ã­;|ƒ/:ˆ ×øÙ3Eò$Ó\Š_\7}nKÛù(NÉ#qè’ãýPv¹\uø:û½Â]ñLg,ýVF¡Þ8Ç>°4ß,Z\vœöó<;ƒ_ è¯oÁy§¼ÈhÛp Mÿ·†íÁ—o÷Œéæ ó†“ÃöÌ¥M`ó¯øO›-/Rß·}löm7È´Æ#Këî}¼Ë`zàtS´ªÍl¾×´?ÔZ‰m愦&ÅÓÉüª½n,òóôÎi^‰Ü·Om— 7¹©ËDÅ£çͶ·7(·æÒ³~Ýy¨›]Žc©àöPO¹Óxtû¤Þ”¿ôDÒå wz èJì:4mîoJΚ• róuîŠzâapÃö×en`eJlYaÇÍ–W ¼S‹¯ÄVÝý•Ä%dí2r‘©Ðí#öf-ß…ä=ñxî»p;M.6]òîxž 7²åöËëíâŘßÍ®³ †§}§µ¢¸ªGyã«ùþ4aq'‰|Í?’žH–¼‚ÿœœ*¸ÕÞù8pxß¾qøŸóè\„w€q£ÏsŠ€çý„éwiI×!¬®,b„‹'ôÕ.uKØâ=¾»ŽHEÞÀ/W¯×<ïæ÷.öIòV:·žŒ7½›wYü÷Ò<ÔãSŒÂƒ4µîŒ÷sÍ5h_ÑQ·«ÿA«ï-¼€Þ¯ßoïËÍL—_yžÏ¾0x^àͬ»§þ_{:ÜËŽj•\.äû»Ÿ» Õ')«1¼]§)ù<´ßÆÐÛ›®ó–p*YÀåγ%Æ Ê®Öÿê¿ü—ãg´XZD§„Aóv/» §yñRhJ®;ÑP̺²½67Nu"”ÑÊx–®™h.`W‹)L*Hµ9|W¢Goi{Ï%Ø{Ùí¬VµÐÜ_ÿ?ÿ®9:Dˆ™,<³«—Ý`a… ¬P½G1ªe J§#RÑWþ¾92ýXö ä1Ð\gµ*qk•1`+Àp ¦ ƒëݲg™@;í3 ì_ÿ<"tÛ4XÒ÷h))øÀ,ù®N‘!G)¾/ûC;¨uòˆÈŽ\rš¼-ÊÈ–Kd X–¹–ÝnªŠPOÖ!ZZ[²÷Å<Ës0Ï<“u£:ú‚f ¨ò²¢ö§D¨#‰²CnPÙ‘C£? úV1!„d ~NÓr K› îΊˆmL•½"ÚBØ £ ™kO',î¼,Á ©uä8³*Ô–¾$®©÷¦è´â¨ÑçDR&*"N᪖‘½¤»wuËW¡dV¡Ð^Ý,ÍjF‹Ï™Öó€bfÃpµ™Z†Fý¸2r7H*ƒ·ÏŽRæWPê^3è¡òaŠÝ¤y‡¤Z='›°MÅv»ñ-ç×ê°ßBÕ´3ßÇÄì!²šzË~XRÂÎÍL“,Rn,#D7Xr‰Â8𠥋nktmcaGšÛ§H‡È-Fó„˜M(*†œ£X>ab Å7‘Á„ >V I= &Ô•(D©kPL#R4¸#†²Oôe8fË*Rê K•¹{qHs×à)]™Ö¢M ÃbY]9xÊ:‘3Ž€ÿ!‹ @î€ÙÖ¤Ýê\}|Ž(q4_}tÇî1jö©3M.È€€ rX=úîâè1Ž5Xêš\}°íâD!Á 2Ðûš3‡k¯è ú2Pm@"F«ÍtŠ6 @?538ÅG‹Àêv@7RFÊ`¤™£żԩìl?aª»òg¦;DöeÑܸoZ:íóû©Vçäb±°l-?-þ«A “€RÙçÖ[‹¥g$«^_vÿÃÿåÖu¨F­¤pQ¼µx\L·¶e[qê& |D½Ãm+–ϱŠ6ØåÓÿ.tÄww|]Æ•düor&óÄàöjy'ÿrb¨ðv¬¹ <ÿϯáqQÜÛüni饰³\Ïñ(Dr£|lˇy“"Z!a@ï›÷nïé0ï9XÞÔ·ž\.Î*Ùùpw:.Ïôé;§¤Mõ˹^kTvþË•gÃl÷¼òæ:Ï;p1I7Å ‘ûZǸcȺ„+mù©•Ç–hkcöhºêqÀUMÖö¾js'~È2åìÂ4ú£èIû‘?ä/Í}¿¼~yý˜‹Rèÿx6ãÀ˜ÌîL™ä•^lQ³˜¼B6÷Þ©ÈT÷µì]s«0Í‘ÁY̦À÷ ¥“±7ŸŒÁìJsz2Sæ• :Wk\10¸Iê–†2Bd$"?ø°ùô#$$ ÕN¹d7á‚Ù„dW¦Bp€D% ³%(„ëÍíh.íUõÃÚFÓLè±®i߃{£œ /›Ü ¤âžê( )ûB¤¥Ä$ÍŽþKò:LÈ2i²ÁÕéð‚v8úôæŠ÷Þ}A,ÀéÃM9Éhé½\Ð&ÞîЀ ¹°ÝŠ3V½¬@Y7‘ó;íÕ«¯ø‘&” ŽØÎ°›dÈÿü½íwÕ½í¦ÖÛîeßÿɯkeH„²e°8¾«ÝF³ˆ ´ù-úÒ²Gfôêÿú¿ÿ?üêÏÿTÛÚ‘s}un+ýħ—ÅÅúa¨ë_^o ¸~~G‚oÚž»qéÌç­!?éq‡Q«­¿Ù¯ãÖ'ÐLŠmiøm!ý‡í_ ó_=©Á“÷ÒZǪá'õ«È6µ³M<4Æxbw©¯œú’ƒžÞ‘Ø¿kçùS‚–·|4ØÜT?!6÷+Ä=6å<—ýokÙtÊ êÆQUⵯãíYšg_’{ƼxÓ3¿­:þ"ZÖ-æQY .×'ðË© w¯ô+§à»þ´·Å“ÅîÇ(…ïYÏêÙ]ÝÑFTç=üþŒÕ;´œçó·Í Ô—[ëK7„;Ž¿_Ü6½<ü…º©KÙ– ¿ïónÆû<¢¹éEáåZº›æ½þw\·9øM¹„®×ǽ¬0ù{ê&)L}åöþ|Ÿ=—õ‰§.:HN¥âäÓºŽ/lÔ<îaüaÀò{#/Ý<_Èsÿιˆé‹Æ÷ŽÍ:¸¼ÚKêßÅóeû³ïça­NRO}¬ÞðRÚÆCº,xgÓ`¬w{¼ÜyÝXÏñ=ׯ{-œJ®žŒÔ7ˆY¯ú¬ž Âvðµ o¶-}_¢óšùód$±’ô™ú0Ö8Ï.Þ;G)Gï¬<‡Ë£Ã6õ—ù—§þw7³Ì4³Xºòèzì4s–bŵ: #$ HèÑ3²7/‡×¤aÖ•t³L½uµŠÆÞK-Ó¾­eë©Ló—êŠÈ¹P÷TÌÖó6¥yvtôÞ½/"È: ƒD^ ”uáÀZÝJÚ`˜(eŽÞb–µC³IÆ»âOxY‰t£R¹’Vl×â=Y4Üp [uê!ܯ7'×;h¶ö¬òâ‘TÎÁÖ86x]ËÿˆaÑÒë8]8`¯‡aÕk“y÷¾´Ì’_[rùÜÕQKY–Ž?Í󙃆žÃƒ÷h.?®³½"N†¥<{;Vd§ÐX?¯„Z‘ÀáÓªøsÈþ¾y[BJÐWzø`•¬MXµ{ƒ‰cuóñi=rk'„ Dj As”Í#8Ñè9v¬Ñ ˜û.4Ç5©hyÔ¡Ö)EÏï—W¨¤ÒмËg§[ó@Bb—²Ác¥ÞGÑ‘‰˜²ì‚^Ñ›º²&‚0u-‘€B‚ÃÑS@'-Q¨Nô(Ê vMEüýÚ`“½š›óå;+¶¼. µ%\ðýKDˆ¥ñ»¬žŸ_=âpX²°V("«¸T„=?‚Nô$ÜöÐkàc©p""Í=‹(ëè=®Qþ_Àt"udf $YˆtzË霤DÑH³4 ©>ð½ $i2Ï X2C=@r*<A‘kˆ¹|ç #fØ} "„M°IF” e:þQmNЭN ­”º«JE,f>ŠÉ™Ñ }Ns«/S¶hs˜É‘©4 à6š²Ž¥­uýÄšäöÔ}ÚÊ:=iÔ‘ ««@ßÛ*ÓŸÃâŠâP…Mk}&}íbQ¾€6 –Õ'cì'æG'ÞS$—k3AkјÁêñª:ààÑ3|Ú¡ÖdžŽ ¶ñæ1v0"íNx,Áhµ¸l}¨Ð˜´irY©/n¥"ë4ÕjSE5¯œŠïо›º€áùN«&«ÞÜMY³øÅ’è=ef)5 DFfv)¢ÍK´ž‘ã‘ô_ý«³ÿ°ÿÕŸýé§£õl1´ jmÿ!þ#Ï£5°‚ ÔíV{ºN<5eýªK»í®æ“¨ã‹¤º'êÕó0fktü­*.#¾yUo^ÒÕ×­×'ñQpþ\O¾_ô¹éŸO.^HtÇ뼋á¹~û>k#ô½cÚ·Sš¯1°' íýˆ÷ú"´i«~q?–…<Œ7ÝÑØ{&ê³í“!À…˜ò _ä*t¿Ð~þø óo(]§Þ\3v~ÔÙʶ9 æ}  ïn›Öï­ð=½Ä v—>Änü¶7 Ýc¬ž5as°ºšr8s²yrqÖ†ýU°Á à’rž[w8wGå©þ¥ÈòÌ Ú²ÅNÙÛ»vG ®PöƒŽìÞþü¹h‹dÚ4ãløwÛóüåÓý¸-òbO~ Î} “?ŠxA7Ó] [Ûés O¸ˆ.:üoñ‚|¿L¶INðØGz¹I¿‘.;ê®zÒH¦« »ÿæí£ó<œ:>Àuìt;É¡s6÷9è^±Î•&²ÚÂ]f›¶Œ›câ,“ÜhÖ†V"\ªÜÇÏÄswÛùð6 s~(lèV·"å²÷ÄÂm§ÝèAÀzš<ºÎðfæræ/¤5¾¥ó?í”=1ž£éF÷Õï“`z’¡®to'ÙíƒnDçGÞ¿tqCÖCÂ&Ôã¥éă?\„1›<ÈÅ"¼i°Û€Gn!Kº³·œâ™M2€[ðÒÃ}·D²»¡ížxÅ‘?Ýê‰>ù4z•ª‡~¼Î+Ý{Žñ*ü½¤z³Q<%›yL5ê^âb›c¹¿ß} èÎæ}o“¼ÓüýøÜ¥ÍR?å7=§ðó`¿ 4·ÅW½‰]„ÝÛhK>:<9Gm#rÜ=R9¥O{‡Ï P>;=Ï_ŸA'TàÆžã܉ö pËÆIò>ýÔ¦Î}´Œõ°eœ0¸¢‡' B[‚Ñ"âãw»Ãá0÷V*§É#ÛÒR\ Ÿ_?÷žÑáì(7ƒ›eÆ™5” ²*û‘+r$p¬ ? Žãë«R™€w ûÀ[ fëÔ1¬õÈ:l”ê xôcÝñHŒ±í}-yŽåHUx…€¾j"~l¿Ð¤Ñ.ˆ¹!ƒ,9ÃP}·Ä’è`bF{{t”nÒ+‹ÑšHY*, KXBMbF„4[Ën{´ìø¾˜9¶è¨¨{ÏCôb}N“V߯n½«)…àbÌF&–L! m·gþúWøÓ_Ç?.5N¥§òÓ¢Ïû¸«ôZiuš&ôÔÒ—l]Ñ= fV¼jd¦2KG¡½*°DrØËŠnÅÌ(e€¬…™¡HÂ* Ñ«EB«ñl‡ sÜÈì¹D§_£…”ž•4g‹T_#D¥ ¥Zg –X3%]Nˆ>JþsG»È+ àWD\ðÑ+CŠH&åŽ2@àÊ`v«/Ó˾#–© J´•jFiÉFȈôê^¡Df„Ò êË^@ÿí«›¢#Þ`yDöÇ‚–ǤW``Œ¡Yg¦CohGzO¼®M?e·Öþ— ¨W ‘€¯rôµrß JÁzlEJ]·‘±RÌój@‡:ú+ê8!bmTÎ+S(6GÔ˜û±³Áà¶n€åÈØ )iæ$öFz± – ¥–ʲ³S±ZóÝÎÿù?ÅëÜ{§k!Š¥¤1”N*¡ïðš>µ°4°:=s â[Dëm^²‡2zñÿæßüwÓ~úø§¿^ÝéÏBÊ6¦: |®Â’º`úo"™cH¶Õ".éÂgô§î’©%×­ª_X½âŒîÔÙð‰Áê•îÿü×ÝMÏSHo¹êR®“W•‘·vxà쥫O¸‰À·å]º*rÓMàåñ´]\yù°žl³ôôà°Àçi¡“ÖrÅž:YjO*yðÇß¾éSôf#©›2Õ//äâõußÐןAœõF=Óí™÷QÀ³Üäè¸Îaþ£<ÛºKü|^¿×ë?øéͯü‘¼~ÄÎû®¿w#ŸnüµIJyÏð˜D6ãhä1/,ŽR¼T]a,ÀÐÑQˆ„zÊ3bàøYˆì‘èËBzYš!«­359‹CLevõ®â3Ð2TJÿûÿK—¥z‹e^^gE‡/ÑeH 8Å<„°è9ô9c¡ ˆˆ%ä£R”ÒªÙ)ÿëþa«¦ïn1´|[ÕüSæÐl|ùö >VHˆ»õ¾’Oh° @¢øZÑ:xÙêa@¸eÍ þ×ß}—¡Ãò©yD »Z} {cr²Š¨Ÿÿqfm½éöû4br*=K©uš²õùÐ3rÍOåÿGÏÉY‹ÜŒ@¤1R„¶€XŽhôºš @™VσåÅ…“¹³ §&×Z•<˜'£Ò_j€ ·µ`cÔ õŸ‚d½' ?fDvA¾žÃS¡À¼,©€¡x-VsÑÒÄá’L˜gšhÌ}Ê$Ê‚= „ç¨_—ë–"YèfK˲0‘õ@Ñ Â0gÒiî},8j¡ ”B¬$ÕY©Ëw¿ipoT€Sq¾?àîÏ´)Åâ­õ¹G MÚ#‚Õ 2XËHŠ©ˆ²vÐøbØg¨G)>8^ÌGJ¦˜? ·ž0I Óè^@ 3¡~4…>!$z*Äη¡\KÒ©”^;ãˆ3Ìh̦Ö9€6Iæq¦9×r?[ 4´(:ݵ–.:Àw*¢Ò0– ÑèVj™0¯S)¥ÏÕV¤¹»e;ÌA3+  Pûtˆž«VÞ1œ*ˆÏh‡coJ®À}– ÑŠã–™«Ks%ÿÐÑ;–@Ùƒ¼À,(,È£†7øi¡Н®:‘&|B3ðr„þÇê <ìÁ‡`7 a믠ÖeµZl%Â?Â1í±rÏsÀÅ:ØòO~’iyôC8A÷¯oô›µêWZ´ÐùŸ­$õèLwÏPíŽÛ—&¾IUÜUÀWL‚²¹¾mÑìµ3ø×£ø®ÄÄ-FoŽÁ–ø±-ÌÖãƒëÉû.sàqmëת›_µS¾ÿ‘»)3ÝöD|SB¸NR~-há~“Þ5?î Êu½ö—À8¾`Öò¾%ò;OÿåâÙ¶‘´/’Û.]Šßï·bV=°ýJ½–ß WÂÛpk99˜Þx˜^Þ© þЧêöIü®ÕsR…o³÷7·ö‡Rúø£¡â¶k­îå 9{’¦Hžôú#‡†>£D¬Úôø†–‰²ªátPk±0’Þ£Ä^Ç¢um\×IPàó²ôÞ#£/”TèÓ®¶¥õ% Ó«½L{Ж%ûg¨£¸Ë¢Ži7Q˜|÷z˜ËT¢/óÜ34@"vL`Äš´@ VA®î°•Ì„.x T´)ø@ü Mò¨U¸Ã¢X«˜G ” V0ÏPƒ9¢¯…?åH#Q‡F´Vûóµöy­íÈ>ÔÌ$`‚p”þãH>iÃËóxpH s9ܲô×¶D/9HÂ9H=HJ®ñ{{ Z L¬ÛAÑ °.™\àB¸ Ð(Õ»ºFÛ‰š„9£ †D¦‚YœèHSwqÚÕÝ+5JA‡°CÈ}‰O‡þýl4èÐëë¡û—Rç(´n ²}õWwdËsægGJ%{4íÌ!Ì™n>)É8YÉ‘Êd!;‘-I2ƒêà I9·<…VF˜Y$º‚ÀDk‘HœEE -L"„ÒA¤jä¡$HÑ•êö·k¦ ©¦ +Á >­~uZ+S¶¾ìºY rˆvh‡n^"Ä4Ð24 ZÊJ¡s,Ñl‰ ñÎÙf›Šû—µåem‘èK8$øꈎÄê}Ý­až1}Än`ÕÙ€ÁÅÁ‚ì°Ñ°Ý[ÊÑ'|ý\úh«d?,2V[ò2­uýê+Ñ«¿®;Ìjà‘PÃÈ¢”º†À,(/Ñçc£ƒÃ'¨Ãµ:|4§É Žb†ÂR4M>ÕÛ×t//ßÙÇÖÓåO_¤¢eΖ˜jöÐnW2bnÝ€ý.çΈNÓ´yX™ÅÜ EföŒÖ³õv²RþÅ¿ú×ûû¿þ•Î[¶§‹ä¹KoÃøRyzûˆ¤ž‡ÎßrÙ7|‹n+S°UoIÒ÷CâÁ ðª^[_,ýôåÏK”7Ãy!/ë¦Eù=ôÅíhß"ŒŽÿÊ[¬Ë©&þ¦Mó‹Ž _O¿/KX.{ ’YK„Ðy¾WÚ{ë_ËDß(û´i€?íÏÇó7ˆ6¢%¯™[[ÒÎÝsZÎ÷`e•á]í÷ïÈmׯûŽÄ㣕c[̉”rÁß¹uo;ýW7Â(ï<Üø!@¸mºà=Ð÷£õvùÔ"N\¾õBÇp¯Ì¾ã µï v¯fÛ|·MN ^/\^®Ã´é‘ìCêȱ¹+ºsK~Ør&¸íŠxÜ õä‘/èÚÜ` iÛûÃ3ªýYe÷ Lû ¸1ÐÕ(^<Øpvd9,@\ôøè&! ‹œÏ€º;&륮vOÇœ4ÇlÒMº…w·aÀ¹ýJä1)un¿ÓVFÑYS¾ÊðN–„ÛŒ×é“ÜÈ’ç3=Þ›·Ä  ¦Lg.‚b=ž ¼˜Åg/ó³î®»rÛ7 v¼|]p « yz¬l(UçÈìn:èØ?tÊÞÛñ¶­Œ[[—† £%]rN7“§ ß%ÔlÍÍ]>?Hñr÷xþ,9q‘¶‰']ïº 7ݯ½Øl«ÎÏ­wÒ½k“Â|@œºøæòººám0ŸeÚu1ktïWm@§ùx]ëqÜÄÄ›,².6_âè=æQ]*_Ô×ü¸mó”àãøDJÞv:?"ÿÜÞÛ¹DæèùqbûT¸ƒ#ÛÜö'Ó© ú’üs}áï<ÕÜ·=¸fo]SKŸmµÁ4ñN~îQàÊ á‰éßý{ЇqÂIÉ«Èû*uq»«óó)X’ô×õW$hìKëË’‘nfa]©©Vº™³ìö4£ÃÝé£BLˆ4'Iµì=hôÑ)”B…»w;IF¤ÔS.µCËLs«Š¢ÜUøçÍKhþ¾ѳ-aŸ»¢#zÿþ°æ×׃Zô¥çÒI˜ª™A­÷ ƒ“SHÌŸÊ'ÙAŠP&Ì…:4¿•°‘† +¦ßJ)½ ¯6M»¶Ì½g “D „YÉAð?6 XëyÖF ¯VÁ.6[Љ“³òò7ĸQƒßgì÷–ðÖÛ2‡9k-€2uø< ISôyD@ÊTÊå!MõCfv5wf5+ÆEãúiðÛ´Å瑟>´û¡¶¯ÏÛ#‹˜îFB4ø÷r ibFVÖìÅèx° 'bYÎF˜ ŽÞW+…ì(2VF ‡OGÛÒ\‹£©£²9ÞsÔ&›õ¶Žó¹’:V)áIKGÆQ.4Æœ˜€%0H¢A@PZhÍàJ(mÜZÄl¥Pæ\Mi‡¦…x©ì¦²XK¦©{·-‰¶(E$Úð3õT$ªyu.’A™L“v¶÷ú´˜J¶^hÅ”4íjd22”š fú´ßMµ"'²3†¹G¶ˆìÖ“ÅP-MÊn T´¨·E… IT€ÉbÖ0s •ÈêÊp0CH†©Œ[Ÿj=2H¹QÒ(ÞÏDJ#e–©¤DIh‰Œ±%ÑR;c3!l™ˆR“‚ÄbˆPNzµa…J­Ÿ@ˆŽÞ×&º3„f+ZÉ3E‡^v/™Ì“¬„2Í<ÉáRfä°7Ë2Ä#ø"¡ L? Ùúà+ìèfÖF¨atuD_3‚ê/ß¡”Õ4îQv¯WÒÖžŒp¤„`JV Åa1ˆXeí:2¬= dPÃ0ñVÃÚ~¡5I¹¶æôµ_G &êÑÐ^ ê¨;xEŽà¯ñ°3KÀÃ+ J1ó⻉û:•}|³ìw©ðbż|÷±·ÞZ°çþOêR\•}W@ä¡GȬZŽÄ’»2ÍKôÖÕC=3bøýþ7ÿÝ¿û“?ûÍ™¨zÆžo²ôÒ¥èÁ»ÆG\”' ^!SNgyn7ìqðž?å×%qó˜ÞFW!Üø}bÌ‹ æÍRÖÓïºÍ||OÀ“ʉ÷K‹äÝÃø9hÙÄQëêªJôniÅÕg|~U—§1mÂ*âlŸÆG¢áýÑ>IW!ùøA®"ðÛ 8Ÿrß¼/§:[A—j)ˆ›&˜¿-îZgpk<À ymÛJ„ënl]»\ˆe7F [Ï*>¨ÒFn:MŸS£ªt¦oYHç€ùé$ÿƒ„ΟÛ:~ãå©M›÷׆ƒ­Ç™mdOÐGkóúØõÎÌÁËë3úûnÀ•Ò{›Œ¹·mê[•(“÷³GÇA{økÊÝÙö£Òôµ_zÏHœ:Zšå»MÖíþwñz-þ€Z̹àGñ^†õ[t|õ”ùÉ>ø½ ðÃI?º­Ç¿òƸíxü$ùFÃøÕÕ?&ãæâ·õ3ÞðQ.ß'‰ñçi›7´óÇDÁo¶þ~B^ÏÃS_6Åo•Þû¼¾{Ûx>{•ßç£÷x>i¯²d7ùùÅÁU¼Ë¡àÇ™RŠÊßYÅ‹7}ïüve`_Øðuïž­…ñÀuÄýÆ9ö™ ÷ƒ€»”Øo:ºïBÍ^¯Ï)’õ—e¤yñZÿð©-s_Z¶§s3ZEÊYj-» Ê̽@4³ê­7D ¹5•Õ-A£)#rô0( ÇŒœ²fFë4·â^"ª£õÖ_[/´þúfæ… UI¯½–y9ôÃk›çè€.hFJÞÓR."X³C`¶·c¾ÎcÊ/Ñ!„V±løúA¦Yì_joµ·ežgäš×R½/KëiÅ>¼ìçvè-sÔçZq÷dS&iyîHD˜¯E÷+/Vø~µWqDL´%‰”¼º ÐËþ¥7½öyÚ• í¦]„2b>Ì„Õ] ï@JRîÞÚ¡g§ŽÝ œkßÃpÅQÏ]ÙZÛNú^ÖFur¤ÉÑ`e-Š]ý£V °| ^×ýmÔk[]Å\¯È8~êD_0YuL{d‰@#C@d¢-p¯Õ Ê=MÈÓÉ6ÙAQRæ¸ÿ2£‘,UѲ§ §Ã„ÔQ牢¤xLÞØbS²LH‰Ýøš=±„¦¬ "”D¦ª™i ÈD@ ¥X@ö dar¦‰{·déV4¹ZçbÌì» ™VK!fu+%[ƒ—€ƒ”}Q¨¥+ÕIžRÿÔÔûg¤è}×#äÙKqäÒ»î“Rµc”ªYoÙ]@§…%™)å`e(‡ -„ „²·h=z ¡Ïk©ûéOþì7çrïc½Í©G7<ü‡©tëMö5ýQ€ÔVúáeí‹ðU_ü¼ûû~ˆ›/îøÁ!«®j†x©ïÿà€otê»6g¢ç¾ÍoFªïX@|BŒ¿yþ4ðåÀp}ÑòøcƒÎÿ€CÚÐì šñC;ÊŸñkSDûvàV ünÖ ÷ï]o™XèÖTãñÉüÞÞ÷QÜ2ð¦&UÏÒ?ÒHÃõós™þ?tçáþ†·—Ï–kcámšð®4ÍŸ|<õ Sw>ß÷'Іôø1Ê'¿‚?Ioæyô»zxêËÿå:ý­ÇëÛŠ•_÷¡¸I+ݲ(7Jèvꎪ‹ÍWç·7Ó'ztøv €o¥Ï±ßï#ßUÑ)]ÿó¼Mð·š ¯{XàÛ«ÿ§žÇ· ÂN—÷7ý‡o±—Bf‡ø¾ÏK,=zB‚­//EÆRKñbÕͽ”Ò²KA†¤ù(fŒÖ@Í„˜1ílø¾gHŠ0:Í-¥6÷¢Ô¼d$ùK-D‰®Ö#22Ñ£÷ON‹CkBfÌm9,¯‡ùó!–Eѹd¦`QIˆf4™:®”yWz†›§¨v•Š˜åˆðöu2ׂ ôD™ ;"QÍh¾´Å’NG™§ÒÝæ9¢å ÝÆZ’L‡ÁÜ|u>p«¥¶ÖR‰ͤµ eæš¡0`pffP;_˜€–ßr÷bBhf‡¦Ì©Z± [[jÙ ¬µdÞ3ÔÊäHÌó,ÀQô¾Ç2®ÇF­ÚàéBkG€˜W’xıÊ$Þ¿«Ààž¯]KJ˜HÊ€LhF!C‡ïÒ_‹¾YAm½!Qv ²­šWD?ï´ÔÑÍ Ì÷%–ˆ€ÕýNó™ ¦L2UÒ#sêè©àÜ:Ø9œZ:j¶0Á⢘ÔÒ±¯h‰äRô DcvBÉH–Π<#$dÀ§Tf(¶ÇD§æž¹¼«¨Ép`2"ª7z&`…œ¦ž“¼tN7ËL›Š™uãCïŠn„¾Ä¡»êj=̘”‡’¶D ›d­˜;Ùr_Šù´w·®dHõI¥™Â;ºØ¼‡hì)‚]Ù#l±ºÆîÈ õT&ÑI %@ÊÁÍ™t3И"D- "FöPH°HGTŽR+kdã€FÀ®¬Þ­V65v H˜ÜÈ L©iÌf3öö‰N"û¼XQÝÓÍ ôj™LuID*}ùj%æSÖøÕ ¥¬Y¨5ˤÁ€²CvônÈ@h…óp‡ ·aq1Á Ìkò€t_)•V{²Àh¾ƒ2{d±Ú€è'¬‚B{]Û#úç£7 aˆ5C@ ¯(Æ•h”„O0´šoXÍ/FJÀ  $zCŽ6ýn0C©µÐ&î'çËž„¡ÊŠ‹Ãœ¥TM¿þ³~Xâsc©þá…˼šï‹¦"0—ð;uY)ƒ¡¤ÈŒÌÖûÒûÒ”IÀK)S)Sý·ÿ篣‹úIS9‰k€¯¼ôJ~UAœtÙuw"üÉŽ ?¤ô'Wœ¾Õ‘þt4å fAÛÛXñ`À5^õkCÙ­³,y;U·É ODÿ³RüÀäùËBÖcÉõÄ~ ЕâBÜ:aS õž%ðGÿyËå§Î˜3÷$¥›d nØPwöç›Ù~6$\¦oßçÊS`Žóº¸ú9éTà/@åRb;ȵ«7òˆž kÏÅו“ºbéœôûÓ^qJ»êFå¿<—^”ﮆb:6él~íE³ ´µsV“ÇΔÍú^Zƒ5y}SǼ¹´®Ò)ébœÓMkÅÁùK—Ev[èÁqë9:héñ–sßç†1¿ýÝ›MO玣3šèÑCG_'Þæ–uûtñdÅey¬N(…-Õ|£bïûi‰¯Sº—޹Fúœ¡§)Æ3žçâ“lXD:­F‚çþ'\“BŽ·õT}ÂuZKOtùöoÎ:qC£â‰B÷¾¼È s£®4kÛÙU«ŽaŸ?rnb[ŠÍõ¾rþÔkOØ1D.é7We¸Äšó;Æ lÆEáÛi¸v®‰§©„›6Ë‹`üv-ò,õÞæÏ‹ž—‹íDºÙ¿Å›~Ê矑W:íù£ñ^×$ug|.z;q×c€×AÝåìÓ£tSÈnÝtÑê1 îN N·jÃOÙþo/ùÎÀ^t3ñ¢iññ"ݶ£\÷ Þ«ã¹ÚßRb߯Ý/fy‡¦ýüÛF±—a·aôÙ·>_xUMÏËṯ/ÿËÒX¼LêAóC!þj}aXïˆîô¶ø/:/=jx¦&\gaר—W´{ÄÉSõoÿã\¯ÖmDó§×Qn™‘ÌhV}ªt/¥”Z@Ñ}šjHÅÎìòâ¸4\F¥Ìå0›ùÚ¹"!C}Ð_dîâu†CB©u°Ý͙˼0MÅe=òµe|D­ÌÏÑ—Ö¢©âõ°|žç×%[MhîÅVd!ëƒb®é$À€e1ÐS0ÑPZO‘@ë°Ÿ`@¶USm·G¬Èi”SÂz´ð²´ÈFg™¬µH5x1‡åÈ!¦’†Ê’*™­µvôä,î½¥Ò`SÝ5Ì™9¸:')+J±2!•ƒËÀ'¥BÊiªJ¯)°·¾ÌÝ‹ïênØ=ˆd©Sñ*(¢ ½·XúKªgt UÛ±N–ž¸jJ^•G;† ËæQ¦1&äBV €‰ ÜØ¿—Fµr. dÂw`@‰aƒó.+¬<™‰è(e%¥¨#( €÷ÿs8ke]Ú2fÙà^k)‡>«§Ñ¦—ýáõ=˜ì#Ù@Àä@k€sI„ p ŸÆ‘*R%ɤå(i½Ã‡>ë·^Ìr~äQLXH&ÉLK‚Æ ÌD™&³,š…"cˆK7‹Lšz?$«Yél©æ–óBß§{/f½)”f¦è¶tÏ™@ô\2À4ôŽD‡¥QcNŠî#Úq "…œp(¢‡*|õê$çhvQbéêÂ>„-— 0zï‰É Qž ÈÀJ‹€OjDŠ*¬Ð]ã®g  !X›DzzÜmœ{׌ÊV@ôS})’H^ÄŠp‹,Ì3³{13@‹¦4’ f³Ï}Ä™ /:J]Û_X‚ ·ÍuÔÈ›ùNêÃÝ`5÷¦Á bFÆf½Œgc…U_™¾t£™%%I^Šy˜˜Íèeçõ%#•‡Œt#C±š$£°…H˜¯Û—bJ‡ËHh(„f4®©»á>2L †'ǰÇ: ëG^DˆÑˆ ‹pDa­ÜU{Ù±Û çå’Ÿ—±ZÏݯ~-:÷SñÂi§• ׿V JÕ‚L¦æ‘(‡H‡úsS&¯^÷»—_ü—ÿæß)óA9n bKþzÝÿp󒇬ۢÝã·Eǧ— e8ѶÈ}å–\1b.c^³œùEŠÿó*„¯@=FOŸcC6¹ ~øV!ÊiðôÕ-‹ÎŽöÚÂô·i€Ñr²‘>ðC¹íoßF†W*ðÕ¹ætßGظ%ûK#àS¥–6†ÅĉK+Þ´™>2»ºÂëü+ Í DèÌý¯EÎ [gÃÆýê¤J=á>ëá\8k¡ëIss|€â<‹ã—TœÑö¼Rÿ¡óWÉýôÈv~J÷y¹ÒÙþ}¹É+ûågÉ´›d¯x‡ óž_ýÄÈí&ÉôCŠúηƒW¶÷¨<ß&ùíò¥z¢ó=‰Y½/©¦/¹">»ýw;¾èÚß}·.Aöø&p¨÷Þ¡?ÜòΕÞÞéÞ{sŸ›|í„x_>šïipøÆ7ë[±†ž¾9õü†žÀ˜×ÿ{öÙv\_‘#×_ zÏXóÎjýw÷ÍFwüÇY¼w%–6pœ¯íxôÑ—Ô9ÜÕzïŠã_·ë\øyaÀ6ð£tü9ó Ôå%0oLÛáè±ñ-ž¹?ÎS†Û /ЉÈ-ø)ž—Áɶäd{Àðwó7tW³SiÆòýçùó!zdÈMðR ͽÔÊâffncÆX­NB*ÅÝŠ¨v˜%8¥’œô©¨göž3Õw“Ëo¿ÏLOЋȖ¥Þ+£ÖIч–O |G¦Ú<÷˜ÛáÐçC[>ÏŸ_áΜƒ 'Df¦¬@&)…“`YÑòd€™ \ʈE¥‚táú ÂÇï^ÌË«2I” Åk.еeªæåõÓ"tVl·ÛÁì‹ÃÚ’»©îvÓ<$˜¹€Z=zšYˆLsd"BC¼s‚0 ‰+a^öŠÚÜz¤s]8ÜÔ‰ÎT ØT_"bžû kÔ:¹×¾tÈÁ$±D\©¥G5—R†ñ¯tÓ0×ÓãüˆÐ:Ü"ÇãÀWÉG!…¶rù‘II)×Ú&ùñlk¯@øè0úªøëè™ G×Z•GóRX3úç•a2Œ‚ÞÇ͈rXs+^R0+,áîmé9'IùZ¬“ÀHq­ªEÇ<Š©‰a^…D( ÉmîY‡SBZå°BHL4“tP ÒŒŒ„ %A¥&!Õi;óB™äR‚%ÿ`Œ\Ó½æÂ¤èæÆ–r€óRˆtŸÙ}ªê‘)•â“/P̳§Ü¼µD¼.ÙZ25´”*Å:„q?>9¥¹÷AÉ‘‰CÒ†'‡"’–ÌH0@Zï’Â}àÍ–R‡1«ÙkdJDJ` "Ñ9çbáR¨–ÕãÍ Ì•¹z5 4_kÚèˆ@hû,‰E(†,𦠑@M£¬ž^ݪï¾ûÓÞ¡p…3ÍŠ[10€²Ï1瘥ipйº=DV¬¬Á›Çé²vöœ¬¹‘ ”–P ¥ÄÜ×+Ò¼•£†ì¨¼’TSe–énô"s±°X±j y=Œ`©csŒbAô ¡ €#€cE‚îˆ@QêñÚFc!¢™Ekm}_o `dGã´âÑÝ÷µ  }†¹qÚù‡)ˆ´—=w»ÝŸü:{ôe6wLËœÜv¿zéÝ"z´XÈW8Ýá½ædŒÚÿ¹õÖ96µ—Ýÿø¿ü/)e¦Nx‰v¢sýàÐã+££5 ¡«êŸmÀ¶~œ'³¼m®â\÷ù.D“Àã9þ¿÷­ïJEè^éõ–s)ùñ¶ââú”qÙp[íqvß^½G yvÌ<#×íN}ýÌú£¬‰¾IÀ&sÆ-qèÇñÖMaÑy•«Å7•×üz$Ä tþ‹–ÿ{ªÙtô2á·aM|å ënk?Á®È/]í@ï/@«‹{›ûrh T³¹kþí«)#™!Áç9³C†Bösø=€êDÍ%E° ‘޶àÕD“¬G†ÒÜ&‘B0;©A£Xž)îl=Â%Dç ø ©-`µa¼@cL¢™GÖúTçLïî*.'Ý–Ö^ÿñ³Wó]UööéÕ?8-»I‚÷®èì¤Ãlš`uH # üà¨ÆÞ†(Ùm–½dP2}Pé]«ƒ²+“Þ©ˆlA JiîZ ˆJaé@1õ„>ATvXΕ‡3¼²•ˆNIJôZC_°ûˆH, Ó¿ùÛ¯Lž±ZÁîS_d;–½ô'¥¸M5SÑýø®DbywRGwƒ™“ÈÞy¬)ׯ8·úŠðz¬ÑmÈX»«½8™BZ!µ–ϔاï}ÝðV­)+«°’ÊŽ$»d4/¤U÷º£+uµC€Ñ"¢cäƒÜ‰YD}ø– ýˆúI„¯Æ¿¹¬tœh›‚ªò' àé’¹ˆ†±<ÖÏ #’t³âI§{ý¸c:Ú踓Ü$LJ}ùÍŸROˆVŠÑ„d—  bfñWº læ=2–ý!Àܦýîü¿ý_·-Ú§ÊÉU-£ØßýŒe ëzcÞô|ÿX”Ò?ììyTöàx~§¾é¹öÈ<ù§þ°’2E&`ºŠ/d‡SÀ¹ù§;ZY°~ø û1e©ßwèü¦%ø›MȳÙò7ß½tÇüˆ¹8ä»bød”ŒáÍ¡éÛLåËÇŠ.ÿúž;QN¤²Mª‘×ÛÓ5sJŒw©£÷ÆKüŠ•Áµû㢀ù¼!Fœ‹ïd`¸©§¼¶mY%½Kñ‡w?ÊæŽÞ6ò +s·ü%ÿèœà½‹!ÛΆK”7$=žtãô>•IW„–›¹µAW\¿Ë Íá¦r#¢iã¼|ûp¸|à}5v‹Ø¸.ßö+J§‹;ujS6J_ò'Ö–7£óÀsœÜZÎ_•FŸ R›Ì1ñjt¤\¬èÒ¸tEÍlšèpþñ˜¸rtÚìb7ðK0Š®æÚý N›1¿ÊÜžoÒS]én±ÝÂþZm?úå ®œµ¨Í8Q,t߯ƒ›úâ‹îÛ-_ë¼ÉÜ,Ÿó<ÔuLwëâ1`Z7-\Ï]ìEWRýéX¥-?îêztÞ}O{#o—Àæ7<*3_·|I—÷r}¼õ¼çÍèácT›ÑãßéŒÁz;2>?¶+å´C\Us‘׳èzÉòÇ9òö·oÖómBâf“|n%ý†Ýî{@ü_T ±-8ÚöŸ‚˜§ØJ^íHø¢+æÅúàåM§Ž`v¿óêC=ºÅφ÷ £Ý»UQ¦ôˆN5YW™€íAôÉ¢¸Øð“.ºV¶«“gÚÞÊŽ<4ëÿÍ_ÿµBîõÇl,_ÿá·jA™–©ø4Y1/ÕŠAZ•`Z©^Š“Özèöê¾JÀÑiðbméI+2WvSf¦(wK©/ ê]Åvµ¡T·ô¾,c×gæ%¤üû¿ðRÍz,ÑËüýëòùíóÒ{S´B0Ð"Ì"‡gešÉ‘L3¤Ì|´P´!:G7³4O¸h(Gan¿Æm5óTæ cG‡»Ñ,½'äRv`1/ûý~·o}UÐéZf•’»ôB/9™SþúM¶«½÷®4+Rww+®¥l³’¨èÉRa%##išê”™Ñ#"I¤Åþ壀¶´ZêPù–Ã⚋ٳI©¯–‘ ¡]Qô!Òa yüóðòűœy BlTæW±¸ÿ‰é©Qµ­M„–4 ]V`ÃE@Prû@®¡ÕÔT\ê¦U>aÚ¿”–|Lÿu‰ì4•Ö—˜j­¥.méK#QͦýÞ:–ÃM¥X ¼Vf‰eé™1<ŠY(Ídˆs´NkŒ@šíL5­‡ TsX¤‘t`Œ &™”‘YH#M,Fs“‰  KË]Ú4y¥ºÃŒ–†LÄÜY‹§}*|™H”ß!“²L–—Öbn ˜sôÑ’’X /àG±5©Ài™™‚§aˆúE¢«µìs²€b›¨2òw£`U¹‘‘R Ê>ýÊ"9™LèF sÂ)Tˆð¢²;@a,˜&èó‘Òl(Boð‚2Á+&CM°À+ÒרË*@1N/–“ùDî¬~€¯{+»¢ÓFzXɱ•ld‚NYP9g‹Ó}^g/‘ël¡†°21b1¦hr# ¿E;`Ú¡î±´5¹EC)Ç®çÈ£”÷€ ^ Íiżz©t#L«·BÖqìÕ0XR’– ð\­ÂÇÓvòÛ Í™VA¿PP'd‘ð„%:àˆhÈ€ “ä!É R42^t¨ø4™U³b…Z3™Ç篭þù¯ ¨»ïDø®Â¨èm^,Á—© ] zŠS¡ØZ³RèÑûÒcéÙzFP¨Sù¯þõ¿ùßüoÿùå ýÈÅáë9xÄ õæÀ}áØ´ÙžÅ‚'¡ÌétQõ¼Šî®#œñ¥á¡QGÝ <õ8̽8:nU°/ ,^Ë|_e¼&m»1·B.`5§ðuƒ’½w78úÿ6Ö±ûŽØÇ­1ÝV1Þª—cAéx‹¯âÏ«bÿGñöƒ1×Õ5n½ò¶ Á+z"G­2ë:A +nl+WˆòÍðÞ€1ÉíX¿YG‚K¤Õ¶%ûªÃööCó>{›nц´uºi¼}òêÆ‹wÞ´Ú\žƒ¸ ßAö߯—ÿƒƒÎ߬ïM£ðùÜ}$a]ð`qÔÝ/|#ÆÒÀñöË{”Ã-÷®ìêÇ/ÏæwÖ5ô°pêÖ¨Ÿ$±÷f_ÎýÀ­ä‹kµM÷|qu:;ÞOÞsoç ¿0C÷¶[ùý±y¤âÚr±HÞaÇ<¼Ž/¢û>J×ߊ|ß qÊ÷]‡®oùVÞÆùyºMa¼çâ¾ åBú>7Ó=Æ1ñDëßJúë¿ôrù@ŸzüNº}2Ýd‘Þº/Û]åÂ2ã™Bý@nÖe"Pwÿéi–ÿs@oȬφçdgr‘‡z°þ¯sFwÒa7‚íª|$ßEÕÑ“ãYéGwCÎדÝZ—ÏÀ{jøí†ËGõ,¯ùÆÔôž½š.rü¢Œ"É{‰7]ï7 êöFóé$ཽánÀéS%T}»ýþ§{ÝžˆÞ÷X¬ñ“—¿<éJ~Vúq¯y5ƒü‚_wß?êð}ðö)Â;YU\¥V7ÿ½Áož£ó×M–ÑËCÚ)_xøÇOË뢔¹ûTÊ~*µÈXJq÷õ¡™™™)sdjŒ‘†0½ˈè43ô×CzÖ €KËL3Šž½ÕioR~>˜%³{võôbãõpøÿÁvVzë¯K‹v诋rÔ„®ín…$å]6öt¥2“Äq.äžp­¡t@X«ÍWÎ5Á\•2ðÕÀs÷bûiŸ‰ÃáPªYµ©ìÙzëÑݼ|°Þ‚dëË|˜Íª{IõºG,²Ó„)ÙèœêdË´h;(Ì­Q¬»RŠÑvËr`²}V?zdÀ ˜±x¥yD¬¶¢Å3bYºµ:ˆH´Öqø4ç„:™ÒJ©nHÐ&A=Z"à;›j]­·œöVê4¿öჄ€´ujùQ[¤#…¥@™ãg­ñCtŠ* d æÈ¥7`€€ ¦”e'AÁŽÕÊÃs8€@Æéñ ùQ—™¯F üL«fÅß·ˆ˜jÖâ/ßíÖçו-C̯K4ÈkêËŽ±ÔRæßFDÒQ€– 5»8ÁŒš B²%Ü R±HzO‰ð‚J·@Df*Å”)‚;{¢‹3¬°¡KÏw…2 -PŒ­“;¦©µ@—™¬ºzdfq³ê‘ZzP‚i™å­ÃaÈ<4[¢ÕŒïª!N3§ºJÊŤ>CƒÛ4¬˜Wq õH¡˜3M™µÚ’ÊY€vtHƒ#PÐD$ÔZ´žIdÊ)º…‰xÁ Z%§iÅÓ¯½@Ã¥Ö©ÑžÃ÷4dß  r¤ÃÆÄ((:àðÊ©¾È^÷ÝDÉH'w@‘“VMTJmݸ7+é%ûgåì^éÅȽi‰²[-æ¢AB¤àGãëHÓhr†(¢Á °C[Î'U+°/k¾U&™™ïºd“»—:Fš›Ê²£g±âî’Ä07H4™HA‘‰ìÃj{³F:L0í¼ˆb^ Ë[\„²‡„ÞQ 1lòK›‘3è°Ze53²°ÖjµD¡WŸ¼ ö“µ”YÙMÓ¯“FÐvVmNEfmá/ðiÑ{fªW¼Ì=[¨÷£G›[¶®HV}ÚïþÉ?ûs(W&N 'Bö¦0ï*y?DåIüˆýHÎ<Õêéyâ‘bwÖ 7ýw×ÐêQÌ{Wsü†êÕ»ë'pcšpSé«Õ›÷g<Ž\ßÑpL@Åò;µ­_¡nL"¾>¼O‰[uû³UO‚ØoÕp–ÈŸ¡ÛùHR¹ï©vr‹|·Ö°¥ç\iâï½Aº)š¼YjÐù{)‡G ñjê,3^»¢Üá~xÀCÛ:¿è—×~§~Ï®WX0‹ŸæÖÞIqýÜé=ïÎÊmz-~gSò—žÖ߃µ §)¦ßI¯ë/¯_^?vF’:Wƒ}Ñ>yÒýÏHÖ?œÝ–Bœ¶ö“oÎP!ÿæ¯þÚK@;Z²’#H7ÚçÿòÛ~X¢Í­Ðj-S娊'2"%Õ{6X@ä®–ˆèKvJpÄÜÝL™«|Õ ô7ÍM¤ZÇáÀZ¸ß!{™u2câókdGÈ æ5ÿÓÿš™Å…ˆŒ˜?b™siB£:B–åÆL"†~œÑIóœ^ ÅjÖƒ¹¼@‰ÞÉ"Ú:`'Òw8À÷}Ý ·ÛÁ-ñ‰%ãÛvÓÁ ,Ó¾xpª»y™i 1B[ QF?™s·„Mì‡D`r‹µ#Õ¢M2+¦Èh™†:9eÑS‰„A™‚„D"ÐK™XK9æR,:÷»—¥Zj>Ä4M总›¹{¦":Y‹ËˆæaøLôÌ>†1é0ÝÅà€Êk?Ö¼9´ÀëÑmSkŒI_g‹ÌÖÃ0*pƒ°VлHÁ«â€~`) cY²Ú•"–U#^Ùëíˆõ~K9Jã31aÞEþðºŒæƒ@¦™„ß}Ìž¯Ëòᥟòs.D{á%•b1´N%£¬²ƒfØE§ˆ%2(ÚiPµT˜ƒqJ½ŽÙÕF̑Ÿr, ‚Ã… ‹0UW´°D1ßïË(ßž¡År÷aÇ–S0-Ñ´tÏàι|:,]‚õè– ˜= (WS·âVS SrG7 e§Ð¤l`‹öŒýØ ¯=ZhW|"æŒL¡ €2Ñ¡(“0u¢…"§ïÖ€¯N´"wЇ“/ab ×WLM"8`P¬à)ŸVþLÙVX÷-è{á£×óÉJQV|ª^ D“$3"²Lês€6M™ÃgwïŤ–h )W‹Œž]¬È'*„@_z ƒ½?ÐU¤²ÇZ¿”XÚ ­utuQö@1‰=“æîUðR'«UJ…`$-•ÙÓJ¡Y­PO­ ’E,á2d0S™ãaR*¬ úzakûŽÖtÍp0n ¹¬í ÃØl]_¶ ÐÀê58†ì “,Ø+ô4ÂÙÍwSÊ —ÂÉZó¢ì€Ù¾²˜kß³û€ÌD) ºïX“te""iÞ¤ù°´”;)-­·¥EëˆL¡NeÚïþÿóÿ”`æ¹;²Ï·RÛR¯ŸÞ Oïÿ$ÍÌF¯Ö”×/¯㦬‰ow]&~Wg¢µÔ:;ÖgÊÏ`À±É÷ü.¯è‘¶þ§Ó·ížÐùŸÕúÝ^ù©·ÃÌòh]e%¼Çn—ų×ýXÛÞQž¸¢ïÔ–½yë7ÆÔ÷d´›”aøJ{9ößï¤Úüð}²œ®CgÏ˾›³YÍéœ9@îT‚nÐ?÷Óa§BÕ›ö¸-DàšWs«Qm;î›An CÄ] ÌÅ_Îô›bÉ“_ÏÃEt2¹w\ׯò= ö†Ép<Õj“n=R:NŸLç\ªxmì~×Wþ†:t[æ½5ÑmâJræyl¼à¯Æ„—†":3UÆ3íh)yÑõhà2¼.8¾¸K×ÏÿÍÛlÌzŸ­ðÓûÜ´žènä÷Œ°³íàЙ‰t¾ž#©ëê-îÖ¦^ÿ“®³?ç€ËBQžœuŸ¼ÿmñý]SúÇ‘Mc£pÃÛáEîåüµ3_I÷6Ìíð="°œ6¡M¡…+ƒé'WšlZçävq3\7iûk—«‡âÏͳéÔæ|/Ô¸÷¶§.8mç ¨Ggºù¢nÐfÛ]öôáÏmë¾vK»h ¼;ÀÝ?x ±:ßÅëGÈCwù¾'€{Þèí,Î55Zk/N˜§BrÜö2¿?æ{O|p¿6ä‡9®o*îÍÚÓ_´eñtŸslžR¯žîx „÷uð¶@ïùïÚTƒm÷ÉëUóôÜöíº›çÞ=}”uÐæò6OºíRËÔßÿÝ¢ÑݗמËk›8H:M­- IrC™ŠWWŸ¶ÌÑ!%…”éÅiÞ–ÖH‚­-£p׋OVdé`Œß!ˆÃaª‚döŒ®yÆüؾXÑ6¶BùÇŸ!°Sª$¤`ÉÄ‚—?—-l'f ÐfÄ/`Å2¯‡u,Âô‚LœÃ[XÇgon\XpÚ´1ǧO¯)üåãÌežKw¸—­GËyn`"±›êáÐêŒ4kÊA¹¡8Ø*Ád¢ƒÁWÈ].F‡Ñ(„ÉMSIg*-dOUqgž©/Æè&R²„;ʰúL ¦Êh&èÃPN£-’(ß9mÈÓeæÜ^+ "˜©(å^Uè„BŽÌ¡ÉáDq5è»t7fæ!Q‰áž[? aÊ`0»DØ.´3N´Yj‘9Ñ%~ꡎ.1f]o’¤ö†Ï]KbIÁÈJ¯Tw«â,¦aK ˆmB#‘à ôµÏÃ^P ” ôuÐfe‚ø`uoöb^“,Sa¹$šq:£ú¾BP™@š›Y/Ù–ù;«ÜF µÓ&234Xù^QÊj[½æ‰± a°t:2€\¹ù…ÿ† @ô¹1šUƒ…(Æ¢Lsg-£¬}„C’ldS,½˜™‘Ù^_IgRªE΄<1ò¹#ÁÖ˜à#å$ oŒ p†@ˆ«ëÇqÇ(ÃZcAØŽNÄ !‡%jÀ ©³˜Ã‹c²Ýˬlx±}-)ä¡;ƒ{·¦ßü“þe¢Z)ž¿ý\~õÁÍè$L„C*U="ó°te2M± é?Ò@/Vw»÷úA÷u¯9?ˆ©“UæÅÿN(GÞsoŸÈ—Çw²Zx͸Žu/ÞüêÀx™.%§‹tþQå¹¢¡êÑíÆwó²ñªÜøëÂÈ'@í+||eK~¾­2t·]7·Ew‹’Ÿɺ“ ÐÅYŽ<å¶OÌÒÔù?:kŸC)4ïs;b‚Lé êi«Kžæá8ŸŽ×3î]÷÷9&àA°½I„lç݉-ª÷'äV°Ì%îævêp#«áú}&Â_ù4Ü4²ŸäFn·¼¦îd’þ@ ó_ä J8Úu÷Psœz>qŸg´ð齑v›¸šHÔýâö.ðR¼Àt:`žùQx¦Ýºjßù«.Nå$Ql«]."¤sNH·?Çwn½ïºþKĘî:hû‡“Çf"^ êüÒQä½í*ÿ>~½w¶ëajì}€»‹ÐöÙ·¿‡3s¯ÛWïªW ®Ñì|ÊÆ0¿ár‰]zû‘s> IO"š{-£ºÞRŽg>\Ø_±—=_ÝÓ©õ;lzѸäÅÝ|4‚·©â‡[áƒtÔý¤o<Þ"«¾1,-[Òñ<Áðñ÷fñò@† =ö;{N¦_œ‹ÇUÚæŒþƒ¿ùë¿¶Ri–Ê×ß¾æËá‚æ£D,h£WwÈ(^Ükñê^+Íh}Ÿ’Æ¥e¦[­î½ÇÀed‹2™¹G‹D“b~}Pwûuì¡¥iªL(Œ²y6ƒ—P@£ôõóoÍM½S&Ò‚Ú¡gŸÑ—œ) "m|ÒLE‰‚˜Â(:‡{Ž¿˜+kÝ:À*àk ýðäáú#=Ô ¥Â *ÈÈyéŧýŸ_^l¿sÈÌ&hô"¨îJà˜•ˆÈ:•}©=’Wß%%µF2"ÏRˆDo]Y(e ø´ô¥8’†Æ¹gë¢#•ûºsæ¼Ì2§Y1€”mn$Ìm9Ì»‰µØpÓ,fÓ¾FŸç9vÓdÑ¢Í)4e‚pB)d¢8è8ÕDËP*òH3g"†åéðé=UU |?’èD‘ûA™ „ÑÑ»µÂ«¢ÀÇ ÌrFu¸­~¤s‡ú ,°æ¶;1óç%™_ö/˜~øí\w•]Ó‡iimi!5wo‡8ä,*è9 îšsG5(ƒh2Pš;,XH31¡„Er"&9•¥3;J¢-TiÕìˆ2ÃÞyPƱò(Mf™s@Ü‘¡jp¢€¥È‹‰Ž\ B©gïá>gO‹ ½ö4øi¦9¢=`hÃö/; \1Ì–u‡`,$å¸`UÚê·ÚÃ×’Š. W~îŒH¤n4XG6Œ!Žn¢B hL& ñÚs¬{ø´æ«Ã 6z× 4¤!E/"‘pBoX3'„UÈà^àaL‘¶sÖYö„Ù‹•·â…VÁ5xÔ„¨Ñj ™;Y!#›´D2{ k-;"…W¨!ÅB“R1ü¬G„š‰Þ@®?l5 vA#itŠI:h0‰â‘¤—êÓ^) ^öèÆRóbvlg2šaKFdt’´Œ0~ZMh`À µB ‚@‡”PÀd ø„éT޳ c½*‰Îh#LA¸«q¤HRR­”ç®Ö}`MŸþé?c(?ÊwöS¾LYû"•=¢/Ën_X«ÁÂFÿ’/™™Rd_ õžÙ{ ëŸJÝOÿÍ¿þW4ß*}'±þªèŽ—FQo†ÆzÙ\I~¤ë»2üû€*LjÛƒ·•“¼Hlè^Yäæ^ðçÚÓ‹>™®ÿýk¯äkÂÍ'Ôï ›ÀÍ㊕²)n:j_Á–ywÏM§<·ÐÖ€[ÿ‰^Á…}ÄCÓ¯G—qÓߥØ?¿}§ ãtÆ<POþ|¨>l4­§Ëíº¦ûÖ9ðîÈür8;×êÑ|ýªÅp~Š‚ï=>Ë#B_tdæúßiÏÕåý‚úåõËë—×µdþ{„Â/`ª_^¿¼~yýœ^v|+.‚©ü¹mõ›ÌÁ¹À`ëþàïþöoéÕ¼(ûá¿|nŸJeKÆpƒœ?êór7+Õk±â^4*CÊIµzñÒ"O§¬Añb¤eÔ¡ÍeT΃K[–Ïôîµ0f-‹eÒäÅl*]¨B,Ñ[«/S-ŸÿÁÜÔ3ZFJ€™úëÒ‡~˜—C3…AH²¥25­¬´¦ÌµpÀ¸ Và°¯ˆ@6D¬š²Pɉ•‚JD TÈ@G J˜[ 'sI”Š{ïI‰TW¯^¢Ñ¥øÒz¾L;eµŒð¶ô8(2‹—L˜z[T͈â æÏ=^ÐædÙ•ež#{ôBXd¶ ¼¸z|úÇO4£ÁÌSÉà0ŒH73³âõ XZD åÒáFo-½fÇaùŒÞMv4Ì$e‰Áài³•ø/ ·±L"íh‡8h6C©¢ˆu÷B]^G2™'L9$,0;©Á›0:;VÆz iMϬ@•ƒ–ƒcSa&¬Øn7ÅÒ£+{F|®¥L» N3R²—ÝË®ff¶hr”Z²ÇÒÚa ³ðT–ÎŒ(†–¨¦Lì ÅÐ$|IV°#M:HŠœ; …{ÙNˆA¦~†f)´b%”¢Á]ð$¨DK„¸«E$„jQ5zÜjˆ/ȳB ÓJ©…0 Sâƒ8SG&˜œ€= L8ÿĸOE,n¯&ÙÕ–YÝJd:GæF@2%™ÑÝt%BB\Ãú €´ÂvЧ.€VäE£Šß|µCp—ˆ4Ǹ"¥2!";Z[õΑܣ¯ô¥š—ʲJ´ÌëÐh{›jÎÝJ‘[©^!2w–‚µ¥Û–v²˜ì™D1¢0`–ÊH-°š}!½åHGä±8¥Ã Hä²êûÀZé¿îÇGò€ø+@Ü Ãó6M†>”¨ ¹™ÃàNèTËlMhŸar‡›±@Ù‘©hV[qC̵½öχ:yæÉÌ>îòÓ'™—iâ¾L©œ#=çC§ïŸK13³8•Zæež_Õ–ø¼d,Ì®Œä™gtø˜”9ÚõŽcö¢î€C¡KàXSlƒ4zÈ@YqóC€;`(æW”Š2YáÔ´d¦ÑôˆZJ¡f¥¬„4/AÊáR 4/‹¡ès(\^ë>}‰‚RŠæŠýw˜>Ø?üÔPwµÅB03 Wš™¹aÈ`»º‹Œén^X Ív¤Ï‡YF§‘Œ ϲ©½~~•ÌÌL“¤~ ªÕj‰†”ÿöþ½I¶$ÙîÃÖrØ;ëœî¾Ã ƒd”‚D4™$#øý¿…^fHˆFb.0÷ÎéS•¹#Ü—þˆ™;ŸUçt÷¼05m=ÕUY™ûÛc¹ûoE×°XZ'5 CC‡eÁ©9`pƾ™åHà± ¡ÓD‘4!Á8  %Ð"&ÄI.¬®Ñ×n+&k“†° ®0$rb÷lû^çéÓŒ·/oî^wuš‹¹A˜çÚ[ËÒr/€^÷mžª²‘Tf?ÁFi<2MH¯T I¢IÐTœ TY—O‘KçD½Iql7ìÄW )'“ÓîZ: ¶Pœ˜ ºÖ²B¥°R-Õdè5 f—{a){Æ2,`{—‰&Fh•àÁ2 ;"ûP§vfŒ.ÁÀI,4 Õý t¢gs˜ÓodfP9Vx#L’*Ø‘Ò éX¥¹ *UŠ@š‰†Á˜rÊ2¡@KHk¥|)i˜Á«ÓŠÕà”ËUÕ—O’)Mi¤—Ý$ÑÜiU48IÒH7Ò4 ïz(™HôÞ—­Ëh^8¢£ïµ4¤Y¬ÖyÖÛï‰BÏ!§Â*²¯®Å£1ÀŽ uŒ>\½(R0Çn 9bÍ4ÙaEÓn—#V*ÈÈ UH:SL©ƒ•BØD#¤ˆ\¬‰F/´âŠ®”Ž>%ë?¹¦d¬ Ĺ „€¡Løü+8ÖéSFêÎACï&ÔⵘÕ4³‚’ŠH“,Iäuiú>ÝñOþKs›´D¨”œþ鯺•ÞÕ÷û—yŽâ>™•— „y@! ç%{ï}‰ŒPJ šÙä4ÿgÿÕÿñåeþüé…ä4MÅfã™5¾ðÁ†Cn¶J7ñ-/·Àeç7yÇLà¶J×e°W êçJÖ±™õÌzªûàÊGÛY=‹Ot/®úy Zù1W°­ÆõÄ‘øA¤¤»'ÿ æø¬Ï_Åc×EèÏö‚³i ½:¬Åðé¥xù„!©ÓüÔ {ì èÛ%¯ŒÞë {ß¿ö‰‹ø“„÷üh/„$IïÔ©Qƒ¤žÞ˜‹ã/:¯»Ù¬G«Ä¶6ÿöæ®o{ìûxÒ ÜôKlÈкMq$\ñÁYlY=wGì•c{›ÞÛq_ß—#Æ[l9xw ÿ¨ëúãÈóÔ~°B–;›EÝQ7·vl—6ûós”¦‚p'¡SÎA7‚ìøÊ%~úu£«êÁÚ~%‘¯þiÈ_BŤKáè¤ÿëÆGŽòçdó„ÐÃC;³¶u^³îñõÏÚØiÿN< ,®/ŽîfkŽÍûÛ«¸ÄïpFî=Koï'ÞOŸLnõÖãg µ‘`OñÁÕ¶ˆwØöu?}Ç[eø™X««„Ôv˜óN$Ò;ÌGÏT^ü#ÓŠwR×ù;‚»îAö/SF·þTJzç7·õ¼h<%èßiP=Þë5Œç±WñZsçµ§Ãfèþ³è"0ÓK­‹óN.ò"7 Þ<{Ö´”nO‘6ôx:¡B²¾*©Àís”ç€ûUyÑ=}/ìx’íÑMè¿]äV‚æv…Þ@o•dž×Š›T§$¶/.Ô)ëÉûé·­bºÙNm»»Kµî°˜î,¥OˆÛ+q¡Ç…Æe”ùpsº#|cã*«dìÝpGߌ{ ©íÞþæö·zÚ—¿üÊ-⇮ù£ØëbgÇ¿ï+¤ÿ»;ÀwZ¤ovQÇõnÃÌ=yþ\¥7{’ñóÿôw¿ÒòzöqèC(Dše§+ææBJ'vûàb»A23´˜™WfÏ4²–¢Þß–¾û4Gï^JBÕçXö­-ÙêfuïmáÀ©´ƒí&SFôbi^Ì@Oa9`éu¦$´ž´Þ»ÚÒ÷û|Û3ÞòmÉÞ–}Ëž“É Œê6åQº¢ &å …@ 9HÄ‚ÌÕ½vu á¨Ç…;0à? fðiµÄ¤f€¹.¢Ñ3µDK»yäÒ–ýÛ"…UUFÅ êLeÒX†œ6•Ú»¢ MŒn4ÏŒ:ûÛo—ý—t: Z_¤ŒH%¦])•‡}Sæ(\Ûó<Á"R‘Ý bF[œ¦i7M=‡ý1­p·›” !Ú0†!£yëØM®Ñ»&þÇ ›#X<•²®±à(ÓæªÞf"I0¥„ ÅÜ@‹d€Ãª 7kêêï›H@Tö.4c*ŒF æš:Ù¡cv§kû-Âa¥ddô”òðv0M3‹Õý²´Þ‹—eY^£#1³"ºgY›@¡w#,S“I¢ ™Ä®´DËœ¤›8¹f3S†¡uT H]R•„XœÃ]JÓ Â.KÑ fGʆØZLK$À.õ€z/‚LÅ­Ê”Ø÷hÊ †…@ ÝЄ9ñF5ÒL’æÄ"•1œ.ü9°ÜŸÈ$K¤Q*Д4º­Ú¢Ò’È€Ac=9‘#‹ÖÄÖåD‚î2Ê )XO‡U°¯‹ªÑq¬Ç„ut ÜhE^çá@áåS_"Es‡LæôZJL ³KI22‹MæFš—º>ªŽsÐ<­¤,hÅLuvi‰~hK‡Ò|¶I=~”"Ûad“*…ƒyÜ" EG{ê1&û~M˜™¡:è° `™%ï½—ÝK™gÉFê±4¥Î ÒÔ¯D˜£±*£î Õ©³²+R)­LXëážZ)ؘãXG„Ð¥€…(rfÐ×mK&”™±È mró:€\²G-ÅõÞ’S”4ó²û›&!Ó~øœ=èÆZ$ uÎ}h –´ïv¹ô,Å&·Z#ˆÙˆ¾ì{–èIŦ—yþáÓ?ýßý¦â/µZŸëäæG«_žd¡-Kòþ–%º³ß=‰Aºšl£–Çñ Ÿ(à wΔp]茫Š|’óxíÞÆëMðiø‚tyX'_ÿ¾+/ÞÕÚž ‘Wh™÷^LÜg§ÜEÿëVþ;…V§;®;{'cèsá%)’WÜ üokz¶êù#½x³/ãõX=Nƒ«·ƒ£«{f–wG©nÈBwï).)—wdŒKîù¨ÙH"˜Eº»7ãSåûî4¸œª| ¯óh“pÚfÜ"þ¯¦ÿ_*tžW(à*Ô½ÔÂ¥vü|gt¥&CJÁŒ ¹»[™ªÏµÔ"ÈÌG9‡™È2#zrèB™2S„²”¥ÌÌ¥+ãph–Y¼ ãm¿o˂׷Òæ]ñ¨µ~šÐe´l¿{3t–:úÓ_÷ƈùóÌ×/ÓT1cŸq ÷å°¼}‰·×¾?dk½w¦üÈšžàªB Ø œR`juúõ¹èîЖµúÕ †À͵ÄfEdhÐ`†¾ÀËú€ïÜ#V3‹Èˆ–JšU7¤ …0¤ä©LsƒØ{8jJ¤Þö&J)»]1Gî5ïJ@èíǃÝ ¦„`ÌéÅ‘¡µªÜX§ ¡G¦rÔĆ:$eRÌÀnž§]] v»*ÐÌùözˆè$ܪ è½TÇD”±Ñî‚,×ÒûQGï¦è¹µTÒûòû7µNíuy;zK³Œ®â†ÔÎ9uÏê‡ÖÒÀÌBôÀ!a`„Ê€¾ˆTƒ“aÙLª$­:}‘£aµÎp{HÂ8ì$HÊ=mh˜£ÝDêÒ”lÁpÑ@"Ä} CšŠ2’n*´JûqI49ÂÌMœOå@/Ä‹œ @i‚¾“g¿Ïn ÉOÆá„Ê‘ßiÌÈ!¯¢ Ú÷Ñtž¤itÐ5 ø%©Ý@®º³¥iüq0›p´(ÉDïˆ e‚˜¯3Îk±i6sÖ½Î>í¢Ë§Ýî‡zï­-¢GK@e*æ+æ.P0s#éîã€cM ¦I}‘¤ZÇB¯\¢+‚ì`˜MN.ŽÉlM8g¤Ød†ÔQýsíÈêSwœ¶j‘PŸŒe2«¢9˜­µ2}b¥{IeÙ}ª»ÒÛÒsQ’ôÑAD7g¶®Þa"Â$õ™vd%!u² ˆŽ¡À¯µÿð‚bð‘3$ va3åfEEî1U«sñÉܲƒ,ªf]»—ÙZ~÷YíW¿ò'lòiªÿäoúï_'¦ZÀINQsY(`´fóLgH2FCDö–yh±´ÈPªÿóÿî¿ý'ÿåÿ^½¿½½!2Aš±/nfÇK,ýEluSƯWä¿9Þ7æúsÉ~î=—¾1ûšmÖ›!žŠ'j¢×{'y÷€?ظ:÷z÷b>®¯ºÉÍüÅBçÿÇpöŒ|Öúð¸,ìÑaä\N_•}´¾Ü[›è%ÖÞ£1½Ë×j¦üÀZ¦Mé?;ªëv±¹g;sçÝoÜßùÜ”fÛgpaÓ6½a¬Í¥‚ÂwŸ?y¹â¹¼ðf…Ñ7K8úÚ?ÛüÁM㔾íÎ ç™Ëí á×é­ÏÈBwºo>rƒ´í‹Ñ»Óˆ×'ï¹ ëÖÿúXc¯ÙÏHŸë:x\ºù\µÇ}l5àùÔ7vB:þ­»÷ò£#éçòs¿jthTÑ_ô^ÝœÌåM=Y Ž?½áú< –žÿ^lŽäò |ÈÆkMMßtþn}™xs,º:‡g3î+ìËÏWô¢[ቋ驃 {éõëª4Ià{Çu§×ïÉsövþž—ÓsMœ[¾9Ò׃1sj-»·:=ë@º³Ž>qIºîw[ñr|Ìgi[B6ŠÂx6‘e/WmUOÖÍw¾6LÜÌ{}ÓBò¾ó.{Bov#z¸1ØôâCîÓ½*­'—é'îä7–†Ð½{Ÿýþ”_Þ¢EZ´aææN7¯Å Cý7wIæ&’ =)û’ÉÌ€ÒäN™Q R©ˆèÊZ@™Êd3ˆåm¿´Å[KŠ!*I±°z[–Ø0¥EX-˜§ž²Ã:,Ñ–:Ñ×ÒÚ²¨·¶ß÷ý¾½½é°W[ p˜RLdX<5‚á󱎗àCC©•á³²ÈG}q€èHŽâ0«Eä Ì“¨;ÄåÙÛ–DÙÙ~Ÿ"¦)—¶hðDV(!»ïª¹¿½.‘1;™V«÷Èx‹âõÓTé„)z{ë½-I}š\+–ÑãpXÌÌÝæiî­÷ÞÕZ3‘LsF‡¥ø(³—˜™©œvuþ¥ „& ^WÓÝÖ§h[*¾ý¤W ½dr鸓^¬?a3~ómëÛ®É?Hð‚M«GÅçÌÍ6Ú¿WtÿÁ¸ñAŒz¾È_Q·wÌ™_ÊUwɶÒüj³v{<Û†Œ«a|$—l?‡W/ØËæ¶ÍK x5Ñ7èqÜNØòfâžÄÿ̤÷žÐühFÿ¹@çù?ù†9x­kàh7¸vmtÉ Ï3l<·Ûö‡¼ç‘ã· 7'"ä=»ìËÜ~Ö¥®r^£íèør1ŠVŽû¦Sdsc_Z°±¨»N6Ý]yùPZÓ½–]ð~6pÞOW½Çý¦+?غ®Ï'Áè¨Ý…„_q·¯]nÆËùxO.öe²™îîëoÄN}H»½·ýç%+èÒ`›¥áõ±êæ¡wãÁ»lñÛ1tWäñYuL:‘csÓy/Â;,¨kâ?o³SwiBܨöä;é—“œ8þwࢠýøú´5ÈÌUI>ÎÒñV|å€çlx^Ï”G]¹?`µ þκ­Þ.|wÍÖÖG‚7ñvZl¹:X¡P'@Ü:E…[î—Î\«-E—©’³X¦§&Ú.YÚ¬@ÛYÝú\[£7<.¬âȉ—“ÿ­E›em³["ÓS¥ÿÎcìŒ0åe6císÌÌ«pbÝL­GË÷âáqŽ·IG\ÿvQ}ðè ©½Œk ú.s‘w=,xžôÿ‘ x¾œòtVmïóMHº¹FÛ§ž÷B®Ïµ;½½+.é&ã·™ã>mø©z7r=`xŽmîÆ¼“­Ð9Eølë{7`å{üœoN4?™ w#«_mÄ{Ì—kèå~l»ùyw›÷~Mß x“-ßh7¹eã©C™Äßýú×ã,¾üöÇl=z*C´Zݼ”ZXœnV¼”2þ~õ96Fïу6Î2­¸¤ázl™J ·E!–’)DôHz,=°,/6M†bPw5¿–Wöæ°ÖºúÒ{ﮜw3 ý,@wƒ}é™Ê}kmÏhûø²¼½©Ô:¾jºŒA†9aÅÇÖBuÔÇø "BÇ@‚° ^AC_ƒÍhÀ ¸z@Kš¡8œ@ vdysßDFÖ nÈž €f&/0/èhVª[À`VÕŒÅ̤°Z–}f¦Šy™ÝÜ‹áaà›!”‚R陑ìu¶Œßx•¨ˆ€TÝ‹À¥µžh*eÙ¿Y¡Oî¶Ë΀ä±{)ûÂnc×ks™ÙYèÕÔXˆÌq¹PV›ßR€Að&8,”ÑDæz}Æörü>GÍ=ru’ ؉ÑÑB Ýíì1¢ rÀ¡FJ`…üäQP®(s3(±Îw€›MÓ´Ï%3,áuÊ óË\Ìß^Û—×üƒ%æR³‡ô×f]¤±ð°#å©’Ö ãÎ, ¬ÎZ…âÚqÈ@ A¥™#E=R¹ÂjaKì;í2áÀ!ÄäTàUfê}Œ,£_2ÞZ899.pß” se"öÙGé;ðJ„HP¢!¨dvãŽdÐiÈȤÿÆ|;Ù” -‰J8)æÞ©‡’S…%M!ÑÍ)´H™"8Œî¢!EÍe#ª´Õ,©ìÈ‘DÂ) ÎÉ=‚°ù%3{k43¯àŒZ&Á¬ã€F‰æVÝŒ™&™Y)¥Â ÝÎB è0 J³$è“]l}ßJ s{]‚óª ˆÃŠ]#‚²ZgA‡€\0º% D?Ú#W? &Üá†v€™DzZ¡dI€t BÕ¢­; öaI25zL²4*h0!-e#ñ€£ñõèº=O{`‘È=ÔÁ9|MV„ÖÙ´üyb-Ð@Ò1×RæyšÊ§—úÝ=K‹V§C)ªeúô½mWã÷8øR‰/ûÖ—€jf-”›eº™}*Ñ»ô2Gf(¥ÞCm‰‘¥î=ü³ù_ÏŸ?íþæ; !fDDŸJ Ï©ÛG3µQ*tÅÇ»Gt¹à~nwõp¿U<ï– êò¹ŸÓ†þz¬ù¸üÉý`æ¼ÕÞ/¶q¼—lx7FúªèkóÙ[ÌçÕÍÑM@¯êøÖÎU’äáżªx…|H‰Þx[‹€ bþkSM·é¥<ç´;ØêR¼ÙIiSÆrµ‹¹ØÍµ0]—rñ¬å]nÖ><RÔ¨OÐY‹÷VˆãŸÖð « >Ü€›¡øä9uýÒ_ô´&òVhºBÝ}ÈLõyÉåý€g dzԟ>œwzø!RÚŸã—~á×ü1ðÿwÁyi”ñPÃüÀ1é½ „Ÿá‚êŽ.Dþ÷îñ©égºÍ؈Â׉„ÉdÏŸ%ïÏ•,ÿó]îw¼wK/ÕøŸoho!•8×ó_—°¬–|s¯™,ê—Åé£3÷ôn !~rÀýGÉÃçÑ×yÜ-XãÓ8ég|ú üº óÇ'ä<Ý{¿³ò|ýÆìQÀ£¶€oéàÞ¢zï. 7ý¿þßþ7€t~÷¥õ!–š×R¦bµz)VÜÜhk…áZÓA[ÊñԨ܅0 ÚµDH%#ÌEâ~O%š¢·2OÙ¤E?¶Ì°Ï/ÈD©þñ7¿û®÷R†VªÝËl&DdÏýë‚ò¼î±–/o}CÙ• ‰"͆˜HÓJ&éãóËÇW"Çx0ZÁjÓÙ`¥Âg” ‡ßë0Á`é¶úµcR«HÁ´{2-•æëÚ’aÊŒR¼/j ¸MÕJ¦2¡ˆžãÂyoé¦õ&ÉüØ@GX©RX–Fæ4Õé…Ñã÷ÿ‘˜g¯ƒ­xa‰èŒˆL”áÝI¸{öC­¥B3=²: fïh{‘ª//fÞKâàŽâRï3ÁÒ§Õ-y] >Šó…Ãè¯0_½2W7Ôµ d¤ò«|ɂј³°êÀœdŸdB6ˆ.Lrø¥®|’„yªýÏÕðÙŒ½):¼Þ‘lú!MÍÄŒŽZÆý‚’êx{[ö¯­ÒêË&+þùÓ¼ìa­î™µ²# ša?¶ì†ï£Û%[õ Æ"™{afNTß+Å.¥kè|;°Å(x—jaŠÕƒ&‡` „˜Êݤ”¬ä"¤H)• ”—c²/‡ä^ªs6fÇ’"°ü²3ð™¨nHŠƒÎdPfJ]ÜwÆ·è¯-wfS¡"^ƒÕé4(µöÏpd}Rdrd2’$°ôÔwÙxà:€a»{$'i0¬ ÿ34ÒEQ'”˜ãŸJ8‹N•žðL„@w/^Êêš™Ì8‘•Òl®eÞÑÊ(½*“+”ÙXÃzï Ë‘],R&kýôý§\–Ì= F!½©w) Á¥E¤°*&4˜N},È$5 F¤ŸáA’|®dݦ¹˜‡:ò"çÚ" n/–.#!Ž® =[G(&0Ñ:Œ}3‰fŽÞ@v `+2ÁËÊ7S ¬Xu"-Óé“×—RwsÁÄðE3ùw»·žeWLŸ(¥ô/‡D¯Å4¿äë›oûÐô2à_s÷2}ÿ™j¡jM 1¢Òÿžj‡Þ—Þ£;iÕ_~øîû¿ýU[Úú„3£™Oµ ÚPÿO5 ›g ~ž]ȇžÈWþ±?Wü£»þ‚~ÛëͲp§¤ïR´ùÄl7½²ü9Ê<þpšÉ¦à£ãj•þqR ßí¸_nò5»¼Ÿ5¿”ÚŸwâ~ ]?ý€®¥Ô÷%šû=ëAÐùèà_×pÂýGÝmVæ»j|Èïí±¤ÿuÉ×òõ ÇãQ}A£K Î{ö¾‚FÜ m–ÚUº9»Á®ð”¯>7=ž·úîàÌ—ùzËG—)á[ßý½4Ê]Óâb~½¢úá#ûÀÓíœ}`þº<ÂC€ø©ýå[ç›~úÂr5U.kî¯OT¿LÞå— lÖïµ@Ü9·wã¼þcWNÕè÷ò ÆÓÍ«x[~ÏÍàܶö$KüsæUÖÈëÒÄù^€_yŸus"×’õíÓ»o}yøü¿jòëgˆ¿aE|Pþ¬Ë/·íAñR§Š þœ“ÿëã°w>¿DT÷î{ÞVý$À‡¶&zWeá=6¼:½rHÿfèõ·¿oû¥·ˆž¥º×RçjSõZÍhnN“‘‰cí©)2ª-IyT9E…CkÅ^Ä£GL»¢ž¡Ã¡~žÞš{Û—Ì·ý‘Ÿvõå¥.P.¿{p8´Œl-1$èË—Ãþ÷o‡÷lK.‹rÉìL@Šm¸µ!Lá,›žF":èG@4 /0[×øô¦Hì Ê %j­ÅŠ–ƒ2ÍL™Cùì 2Öþ€Z é­50ƒån®™z{ëË[î>¹Û>ÓR:LÓLà°dñâžîJõ¢Rä§8ôþÖBAÎ×l³aÑÕLÅP&¤ ³Ñ:Í; Ôß´0ýCÊÌ s^Œ‘eÏ7! T§[ÂB0j­Z¶õ1¼äȺ¹”-à†®uöùp &”DШ޳Š›!-Ñ&‡‹û¾Öö½ÛJú¢dr2L`¬¬b1Âø–]3m²Ò0î̇|ÝGá4³Î.\üjM}èø„Ù¨Û‡9J( |Q?þV ­ø¦ìZGH n(;Ô²uÌLæÁw/ôšðB·âfF:‡urë0c©F“Ül²ê4¬”Ù¼ l·’)£Õ:e_Fo“‹ ã&dä¤L¦è–ÃÉ™ƒBUXå`oÙºbícP 0ƒìì•SLᲃœjÒÄJ+j¡—y·Ì.u`"”c¦A½50Í:r`§Ñ 9‘äêw=°ZÙWŘ=àHÇRÚÚÕœ:³KO‰dã:µ×œÍ:Í ·žNUŽ´æä˜¦þ»7x±OÕ@}*óTL;7c-9‡ïvªS̶›w"Qìp«F̱_ÊTI;,.½|šaµ“=Ñ[öÑbi="Iz-ÿ§õ¯¾ÿÛ_‘œæé˜¡¶i·syÖ¯Âϲ¹ÒÇÃíÛ§ÿÏë¿ROîÅí xÏ6-:¡$¾Eþ9¨ßúSý¿ ¿¾6æ¼êø¶ù˜?ó¡3âŸFŽåVj'ð¨P·i+ýôXƒøü©û…¿Tèü£7ùxà\nöU6ãØ)_¶ ã!ü穊Í÷ú0.§ØeXÐm¦äîæwm :zS_Qgϧp·ân`ÔœJ[sðÍ_]€ÎM«z¥ж'Î׃eç†ùòζžç.ö•“py«/€k§&—;Zζ¬õòôtfH]r6#àâ3t%b]Ž)] b´m¹Y‰Ê'H‰¶p$«lû÷¯ò-¼Ê´ð½æ.Ñæú'[¯ƒS/ÔmƒÔI¯¼£°kÛ]t"‰\w'ñél½U™Žä¨•Žq‘à¥x£ òÄ â †€›í¢eìF‰áæ»èÕÝÇËiu‘ XkÙNÿ»ŒfÞíÛÅB¸ ÝYëÏô–«Ì؉†vš‡fØ`зV›é| Ÿ† WX¨MÓ–î̵›B7ku;ž\"áš?ÂÓ‹2ñ<‰ÛEGá•c*ït+­÷Uºi¸àÌ\"^x1^OG*é#ÕåxÚR&DärÑÀP: €ÕqL¹õ€2d_˜q6Ö½åØ@0®9‚R³ºÎÐLÐhÅÌ‹g±2™Íþ«ï JNÅsYŠÙë2Wrž­Ìñ¶Ô—ï#¥C,û/|™Y“×ù3Ð?U°î¦îUÅ—ý¡Xá‹¥›€¶ôÖZ;¬ê?/ŧòÏÿÛÿîóßþ0PfÃ+BmYê<ƒÒ…A•.PÀÇö´á>G;ë?ÁÐwpðB»0Ÿ-bâ§ä.L€/Ûo±„§°Äób¿£+œï]|å“iK„ƒ/ùfÓsÛNýyý>:˜-Vˆ× kêf;º9þ‹¬ÍãÂBÝjGUÒ{7ú©à±õÔó¨øNdˆ‹@þ6¼ÄíÆäR^ÐÍÒMœýˆfyõýó"å[¾ÿøÆŒ7—î¤ !OçxQ›v™DÑ¥Úu3ªySy{´¼K.L×8'^#jÿs€ÎŸ¶0Gýn’à/ ]^·ó·Ûeøxzö‰ÏÒ_Ã»í¸¸S?wMßY—¸ÌÛ½ÿD8¡ü¯ çnñô´º —wÿk‰ w’+ïtÜ×FôÑÒ½g™É÷»~BžóG²þ¿lÀ} û'$ܱí¸÷¨ü¹ýÛ/?t»/Ê翵üôëþ’Ùßv‹~¶€“EΙà·ÑE.é‹?¥à‚?yoäþ„»õ> lCÉ<‹oìà<¯Üø`Àýmµ¼|$¿³&êC³íîÕºˆCvèñBzÝðK|=rRúŠ×ÿÂ_|nýs-Ï;žNòÛïÃ…lø#]ö÷ü.àîñ•µ:¦à/²`J ?ÀñS³Ó<ûÍßýÇ\1ôöû×Ã~ÉêTlªuª>+N3Q€èÅd€hìJÈõ!{0‚ÆPÊ®Œ¾J,™¹ÈçR Z–%z%=º¼0»±ÿ‡ku«uªS-û¿ûÍ=Úþ­9iÙ‡! °ÞÚëb½/û½Ú!—¦ždBRB”q%\c³^ÎÛ±ŽeȰya—ºòFh+»í±ûÁb&ªð$ÜѬe(Ü«{m}9´e<ªw‡µÈ$Q¼ƒ;ÒÓš:—ÌXgWŠ9¼ïÅ Ÿ¶C+”4Oç! -\Qªe·Œ$4vÀiI³R…#y¨GZqZ*“4Ü‹”{9–8è «T[: ”ZŠJWaHdàðÖ#²Tš9i‡CÐc·«K´åDÂQ = î(^}íÈ4äç°³ ÚуwÜ&G&à(†LôJEJq€…aJu¢¯Ù¬a»J“¤ˆXEm­ö@ëÐú+A!5’?ÈåÌV‹G!*¤¥åí@bÞÍËá )%E¾}yËLƒG­} ’FvbtÒa|¸ãÄT˜–ê ñ©3ÑUzÉ×Eù£lQ/rpß¹4Õ"³Ü/Þ;ºÉ]°L=3 ÉI2EeeéÉ ²Y =UÌBB¤ö™>G¡„9a€ ‘êÌBfËÅ ÉN~2› )í¥Jo ™f±JMNΨÑ%*#ˆÀÒ²V6¡Gfæ[BÃÚ ƒ¤ù0½ˆH¦˜ÄàTE2õ6n‚ˆDèhVškØE/0¢`$‚ô;˜ÆÙK]‡”•á\aÅA£¤bØA4+¶û~—iqèð¤A‹ŒžèÃÙÌhpKc¤'£g6©Ë%ÊÜÏÞ-3}ý@ P'dC߯#Gþþép!²u¦æ0G±ìÑò•^IÒ’ Ô5Ƭê@oË+úa´Ë ƒ VÎ&½fˆ\²£™hÔŠÞ€rÅúäOÅ\uêçV†Sq†;i^¦2÷ê/;tV/“×h`-}v½ •þÝ1}7ë7¿g!~÷¶3uóEÙömù>4ÕjÓÎrXùìæ!EäT(-={kííÐ3Á«—Ýü/ÿ¯ÿ·á ,¤íÌH÷wÂÍF÷—‹ ô‡æÜTz(Þ|^%,lv8O‹ýõž_Ô>þeîàOÝtíø)åÿøvÜ2ßïÚ\ÿô¸úRâÔEnæBUü »‹Óù=-!âiõ_6tþã¦Ç¿tÀ·À¿îØ~…ý«çË¥áóóÜÒݯṙ~ëDýéм§FŽ?BÊ?uÿ¨#dežÍ¯~ÊGã™ÿëÕ÷ïúoÿò‘?zÊø;¯Ÿ8ø@Éúš3¹Ou»vÛÉüªä'Mj>ýlüI o»«ºŒ·¿Á%ä¢8ägT…'žè_¥˜¾Ÿ8¹ëüº§Üѽñì‹.š.~©Aõ¤Då=€Ý1é½):'zð ¼øCˆ?12êݬç-œé«ú¤÷è‡hü¹v¼Û²©Û-ÓÇ­´íN:Ö¯×íɧÓßÿæ7'4qhÙ»†Ag-VݦÊRÌÍ ¡ˆÒ2œìCØ¥™!0öÖス%@ŠfÙò°ì«[œJµ>¿L‰¬Ñðöš€J©»Â©¾õ´žÕøéûÏ¢ÿá?-­÷ŒßÿæwÊ,†jê‘P(¢/­–ÃÛ¡²[,} W&WÅÕ ÅΆã0I_[ó¤‚AƒO+C\†1B4 Ã+)™ ±À*DÔi¬~¦ð},Åét¥z Ödq˜ ]¸³ V[¬Åi8,ôƒ_Z´ÖLÓTˆèÉäÐ ÛÒë„êEŒ#w®>å™ 3wW"²27³rXh¤˜J0ÅÝS=» ACq#ƒïLo™Ì4+˲U*K1©g´P¯6Kæ^ë½7iŠ%Е©Dvz–bŽrh}ˆì§’ƒáÄ› ž€†ÁO¬¤QSÜ t…  |àJ˜–ÑáADp¶gJ(29O€ql®Ê¿oMÿˆÈÌÖ{(Í™<ö½§HíªYJ­åmÙ#- eÀPœ]1DÛ"8PdXaÐÔÑÊ(š—;¥/VMŠD ³”²÷´dædv!²§/(‹d–}Ųq} h¤„‰¬®–èc€›M5ZŠ(œ WiפB?Æ™„ƒ•L_mä4jRYÝ Š’HiʸdXf6¾fb$cÁx¤lñÈÚ½È|íÍaÕç#ÅCBÙ±$P&‡n(¼¢”c{‡ÀT2±8]‘ Ë#ÔÊðeL2Ÿlžà¾îÆGNV¦Ò—¶â•BLf"à&é4I`î%™F iVA0]I(…€Á=óÐÚÛ2œŠ3aBoGÈÕ°n6¬ÊSó°Áˆ à˜C¶ÑwT! ”Çm_=™3€‘}¯¥•þJÐ`Ãqäȿȥ1 Z_›l–@´16@ :Ì×cÙ—ÓÊIž:ÄW˜2ѽ–¢já¥L2s:¼pN¾ÏÏ>ÿêW¥-eþœ¿úž;´C©…&’š³ Ì ºúüÒaÙ»A>Õ8",½Žê °êåe~ùá3xNù<Ýk‚¿‰Ôí¼çóç~ñXå+û €G›<.JÕ/<Þœß×+êÈeð¾¸ü³zþ}…¨}ì'¿SyýMˆ­‘ôGæÅU$|Wý?ÙoÊÍt[Õ®[€ÀÏyI¹2&6ý4?)ôŸtþ)¨~í¹l¯Ãõ¿7cL®Þm»ö»ûÖ# æÂæþË.§ŒnM’ïӮωܻ YÙüäˆ9+¼j;a…tlŒo;ä¶ à™(q%îð®> ëC䩵fËûàÙ¯K'>ÆÅë¾åê(‰›.¸ío¹-£=í¥/J,uy^ò‚™„5úÃÅÁ£PtìÒßj¾gŠƒîýâpÅð¸%á_\â+Ïú‹Ñ£‹7¹º5'¤ˆ.°ÐÛ›½%ÐðÔCù J­;õÊÚp~®Ì‡¶}z:^ÛÍn¾Î×I'nÑ%³MÇíËF¯ÓáéIp™˜<èÕK®Ú^6ö@àÕÀÙbY6ñ(·X¥Ëñt•™áæœÇÓ†RrÖþfGçúmUûéÎ]Nç«rsÈ:£¸Ž˜ñމ†nÒHÄ3¨ø`ð¢ónÃÙ‚µŽÓjôôòò®ñ&§Â+Ÿ«³}ÿ0N¸”ÓÆaåèvŠ]gqÈ»Q¸‰¯ÊvIÈ›3/Gð™¦s˕Æ‘tïb_¬ƒ› ÏÓG]CÁ„ ¬mÓ†v'¢?ñVµŽ›¥òâååÅUKîSç8ËuÆÛÖbË„½¼ߦá^/·€µí÷—·ëÖµYgŸ–Ú_ÌDâÒÚ‰ïvâöœ¡ØÇÖ@Üô{­ Ìù>ò¢q舿<^Ћáæd/Ãtów¥v<å$>Jä\´Ê>H$|çóäÀn#㫽ÍÝ€÷Ré¸Â%«p-›JÑð¿þOÿ¿¤ÖOó¸ò‡¿Äm¿DD)¥ÎkñZh$d£f8Fq¶œ -“ÖÝ_߆=€Äˆ03šõ¥ÕbÌž™BÊbÆ *©^­î÷{FËè^+£–œÊ÷U”ÐûÛÿúë¥5ˆµÝoonÌ¥§#Kïìí°uF,­ù¨G•À•ê3ù:{r$!¯$!ÀgØ(ów@€†¸`†LD®èP H£ÌÊzÚÔÁ(¾‹Þ¢µbV¼,KKtw@¡CÛ§úìSï½íƒV– !•ᥦ.^RD´V¼ur°æ^#IEö®èi^ͪAT"Zz¥×r\$ÁÍd0U/Å£g[ÒŠV&7Ck9}¦‰LsÀ2¢šE–/n†aÎÚ[WHžrGkýÊ«)•È@ï¾ -eË…nÇá0gtBÆñ°Ë++ |€ƒP@BoÔ(B]3¿  ¶.‘LJDMˆóÈw• WÕ4ìdÇ – wë‘ã`z&ˆ¡þ¹› €;÷È,ntNSm½9`Å”£Q‘0c…%eÕ]LQÝ& $DÚP¼Ñ DV8S‰ü½Ð{ŽºìHB ÊΖrƒ€H3¢Þh¡ÏUö¾‰vX0WBüAh© $z­ ‹ËÁ쀡Ð8®|ÐD™¸õÕëZÍ4Ë&³ ˜±’(„¤HKfIÌN$G©xj´= È×Ô¾+ fš&x’Ciù*âgWŠ‘” –0dR)$Ôµ³Ó|Dè'©9¬®˜È€ÕŒöÆ©›í†)Dô¨>+Õ£ÑàÉ:OV „ ÜÅ‚H¹›É[oÊLW†j¥Wë€Ì|$Ó¡8%\ d²ª#öÔâÙ}` 2 VaÔjOí~Á¢é„û "ËLYÔºKCJt.Ùz Da‘:•Ò-ÆÌá¶½«¹ølÀ@0fëTAzö£„cw”èÇÊuAÃ[åDfušÍ¥LmöO³M÷è¯3Ó½ûßÊîSFv7´Ì©¸û§¿)̾üã«í?|jo_vþbSU!3%÷Ö‚•œw±,ýpèKo‡6 ÿp«»ùå‡ÏÿÕÿù_lÃ.» ”t&ðjØoÒãþEî/[ëò髯’ÌîBñŠr©ž~¼N…§þ¿2ù]Ðx|Á©=^ã?5>¾‡­øˆ>xIG>¤¸Åõl¿*’ßÝR^U…}…)Âfœl¤™gpÈÓ)ߊz§;¾AÎè¼åçcyq;`n9-w•÷w£Õ¹å¸éÝh‰<'$ø sÞ¥n:î„ÓÒ#Ö÷Ežà1-ê¦Æùê:ß+»9vá雵AOrÜLÞÑ[{bê¤]œ~Äg˜¦»Üü¿4èü¥ÚôáZÈKq†¼'Çò‚ªô`ÍáF âõÞü½¾§oê¸ýÉÝÀ£Æn’âYÅýx½×õjriFÍ- ùzËy±8”ÓOßIÁò±°Áda6®ŸžâÒ=uýgÌ8?‡ÍÜ<[>üñ¼óŸ¼‘DÎR´îœÜ•ؤ‡†'·÷Ôâûu÷|K¯RüX®ÿë*~Ršð½Rq}åÇRwGËuºEÇÇ“|5¨K7?+†™ ¥æÌ†>5Âêé¸ÿøÇëÁ`üå¾Ú:“ÜùÏï÷UXÿóÛªÑßïø¦«€wÑ_yoyõÔ¿üLéaæ€7½¢Û Ûxn—^‰ÉÇ?»(—~0‰ø ÷჋du< ·>]™t%$h¸Ÿ4þH¿çÅ¿oV+ïºÐžýa¾®µæ'v||ü‘ü%6?Å»ï9ó÷··76+›Ywò Ú$.×[eôëÿ¿dÏÈÌÞ{kh\ÞƒÄÔm¹’Ma9–ý½§SkiôBhˆ2kj"m¡…\"â s˜’ÅÐö½ Õ»½¨OÕÊî%ÜÍà$­Xû²'¸ÿõ´ÌÞö­8Õ#‹Wæ¡-ì±´½¨ õL˜É aº{»Ûz™ÌϹ+²³7€Ž³mð¸ÙD˜ !Ê„ ü{1ÃayKK^a^Ý Nkµ–——O­5ÆA½ÙLµî’ÑÛ"/‘¢õ왽k9´¾ô–*ŦÝüò7ŸÿÙý/Ö]µ•Ë.JÞ‰j´w·µî œV0<)e¸5ùüy¼ϵк‰Öžòx/BþPÀ-ÿÁI}eaÍí–Š>wËpuï¦÷ÔÏG)œwÃ×G˜øSŒùð¯/ˆx%-âz§÷ènÝ-sÑÑ‘þ«Fõ­ÀU`U¤¤:tgOxiÃy³ÉºS'ô ï³íàðËü6™ã/:ÿN^p›O»+ø@¸dÁ?=øØ†÷U›ÐòüÔ_âÌùxÉýÓûº§áþlå/µ÷MgÍ?“CýÐýåÇñvÝæ{A×Ÿï¨Ø~Ço›j¿0NþÏêë¤û^FIw?>'^áU:Ûܵ~öÄãüÿÝ‚š_ðYþõÎ#Ù£ô¶€â«b©?zÔõÍ'{—¥ëv››¤Ñ†“úã?üîwÿÑ3"5X#™f¦Ì®n4w£ŒÅ&£™•bÅa27‰™ás˦(nÌ: ˆˆT1)!c!#ÆZOµyþøŠáüÃwüÝÙ½³"ËçOö·¿’‰D0£'J…ÕÃò&Ài)¶Ã¡-½/1Ô«>ÔÿþßüKû/«}ùg¢üœ;ý‘"}+Eä¯__»qÿæ»ô5-›ÝÕ‰@ç ëçæ_/¿~$E´ÊÂÂe-ø}WÛÛ«÷ñ£z7p:žsvñÓê/:ÿñ--ñ“”Òo~lÏèÉy=ªÙ¿›%½Ú·^¥šT~øBmýܯ§üvöo«'Ÿ$¨M^MØ:ÈÝoÎ~ð·†–ºMò¬mA=xùÑC§^=ž“ÖÜpV.ßgÓœÅ;h>8ž™Aäc½Å ž:Îl¥c·'qÓæIä8þÿEÒ’{[ó EàÎmÓ=Nß&‚^¥6Î]VWŸu}}Oöìwzˆ‹jôµaœGüÔQ’äëøÊÍ»ÏCE×ÃáØ½¥û¦°—UGüÛe÷íÃç¢b“¸L]Ì…‹ÓÖó‘ÿìUº#uëÊäþúÃN O­Ÿ.ëfž? ?u»þ>nv¸·ÄeÉo'Ôñ4/~uþ1¨­§ñ¹ˆ7X'nFÙ±_ð\6Í;Wð¶–Hÿ÷(¹§ëóáÝvFŸB>Ïq|üAªÌ倸nâYüsöÿ؃z‰µ9ãŽÔmQï8©ŸF”®Ë_ÈͳèºÈãú]>¤Ö.×ëÆ±Ó¥=­ÑW5\w ËùÈäâÒó6Ùr¯³b;Ux¼;<Ý‹eóŠÄû©=ŽGo^®M{üq|jsn†õó ìn›äUxô(ó¤ŒîngôÝVÙ«OüÚ(övß{7@¿Eü¿Û p¯‘âö‚ÛŽ@ž 9@î|=¼þþ?ý&{0÷Ë êw©ª‚L¤ä†:W–’¢U/e$ ÔK¢ƒ&ˆ†ìDc”[KNª#³+™±4#ÜݪÙdÕ„LSЍթâN[¢õô¹ZfÀÔc8ØwÌÿð¿ºÒ"K*£gôÚ{;ôXZ;tóŽE"(>|3eDÙA (~,YÕÊÉ0åæè¬^0Üè+Ô"Fñ¥) ,(@:2†“mnªäL‰ÖZš¡õ6TÈÌÈÌ‘˜§ÝÛkôÞ§êzf„¡ˆ}U2\}TÝdŒ}öŽ‘ž‰€™•ˆ„²ÚJ©X–æî4D†”¼²ÎÅ€ÊÌHKh¨PëI¢ÂE·‚”E„§{uÀ”BR™Ci¥›H  Å9*2Ì£¸-]0ry]hpÊ|š!:hkeqï¨\y>LˆØý0œ ˜]ZèÓJ£Ç±TœGðÄÞð’(€Kb r©•¹  ‰$Ѱ¦bå¤XÈLa•‘ Š›e™Ó ²/fb•‹2ô°–YÒg›,âHW¨+j5$ºñõÐeY.3× Ú{š¤°*bG®˜O£N.© UË—RRjN(žÜÖ@e )Ãà-@ZK)QÆÇP=ÓIºRËz|²fÈ NXÁdÖ#Ǥ%zäš©+#˃”ªY’P†X]*M–”²¯Ï›ßZ ëíe°ÂÊjëf¢)IÉÖ©T­$YŽ®‘ŒóÂF[KãÝ@ƒ¸ ý£S‚`>­–Ñ` È€š3–/h™³³î!íM•æè­TSÆÒ€E L/UXÛMhn ”Ñ[£’î))€˜¢¼¡…L豦F$${Ðñò¸¢_Á„9#À@O¹ÃŽ%­)º`²ùµ-oæ/^ç–ÿù*uÚ  Ì€ΕßÄËš{>ÃyÜ}” fÐH8dƒV€¦513¼O†mF©À°\ÎcŠÂƯ2Á¬”âµìÍ9ùËΫVÊç9èì@#?½XÛ÷ï?Á‡¦Ø—Êy÷ -»Ö8¦rºÈ.#-j öž]-#ûÒÔ""UýÿWÿýÿ]§èð2”]{š/Š:6áË=Ÿ)‘Ò}HãÏ¥'~H¼ÓÕÆðið¤º5tA¹Ô¦Üù°v¦üPóeCâ­Èó¾â×nkŽáíù6ÜÊ‹÷káÀ Þòò=ïüç¦Òè}åó`u µ¿RuÒ5îwóV•¾…X>2i»9žM#À½ÐüTVϳþ}Ö0N° '§ÿ(‚å¤Îˆ|_s„’Îtmò¡FÕÕð•ñÀ Þ]÷:¶»‰ Œ*yÙærù«Ñ¾Ž•K}UYÿ¤æ/:¿™ipUÛ;»ÅМ:6.ü¦õCOvaÇÞ^BPñs¸[>ß >‘þßiðt﩯9’G_Ð¥ä*m¼| ]#»ø±5›Ô-é©’|Gy¿'Tld»û¢É·\?]ë‰]Fwx -×ûâ-ŸÿŒ1—×HÝ\]P䮇¼ý=$úókG>ÍÀ< Z6‚îâÇDжJ7tårÈ›ñwç¢ûhm}|ðð·ö6-}“&ÐÇW%}=)é’—~I¬;=ÒóœEÿØG§'ðs¢Ÿ^Äg™–›DÒzÉcK‰ë{~)«¿~óJË'ïµÞ]ZîMÛmZáñÝïsßú"lì·äÅ»kÔ8•.“T›‡1¯–´Méiɬè"1BnY޹EþúáÉ'›µëÀcÓYˆ‹€fn?å+êg¶ZìƒïڲܸØé‚¨w‚‡¯ln‹ïM×£¿ËÕüãW-IÿèùŽúƒOîWp¼I³eñ×*çMÂ1ÇÈ!‰]ÝÅaDk6`À™"ðãoÿ›_ÿ]o=# ÐÍ‹‰4+4Ú‘žá!¨Å­x*$™‰Â»R–"ЖL"jë¢ 'è ¯o­gýT-“ŽRlª–©BXFìFV¨æÝÜ[9}žû¡/‡®Ìòi~ûŸÿÝ"Tccªg[z_ÑzU¸‰@Ö£–|1,¡u#@ À…G”¶!;r”$ÛÊÁªV5pZ…~ V@_Ë1F±¿œk$9Øå±ÈKD@$hPµ—éʼnýò–iN¯>EËÃ~…º{„2Ì«¢wM¥N¶|iÝJ˜a~qÂF¾ÂM Iˆ$½ B )‘Ö{áÅ­ ‘ÔÝhÈ$3”j4)#yJöx,Ãõµ`Ú±í¡æŽÎ Ë%"Ò #T«2eΔ| °dBa!!2[O’µÌ­¡-¯ØÍåK?RÖ¢c+«+°^@?ê†fÒ(UžE[ë¸ib=?Û:…¹7IОx5~JIà`+‚œ@"˜ž4!™ÒbîŒ%SÔ©Qo¡ÝÓðœ4a²Æ^iåE5]]rN•ÑQ~È\›¢ÉA˜ áa³•¦ FgBøT«Ìz  ؤ ö®$ä¤9kѻ̉zd¢IMÙ™s¢•Ètctú]ˆâ¨Å¢cIU¸/L4µ4 gNf"5‘ ²‹;ÂDJ•kðg€nÙ8,…‰°”Ð3ÍÙ„J.‰$fÁÄ%×Zš’ìR—©– irº¯•ìNv±wX•ÙÈ.‰²­Š#…Þ×!4¾Ì`GaԳà ±ö—pÌn[UÎè°Qψ£¼£¶ÒÀ d¾?ŠR™{O³,øœh´šýàeœá^èÌ€,Ǥ»”ˆhifÓnVz2JÝ3ŒÝZM ô=|^Á².;ÖtT ͬþ0©LËÛ[|i„†æNÀs);´×ô/1ÄWUþn±¶2Ȧ ‡è 2×òŒ¼©€úÏaº™ÍZ.­ÏîîM%Aùöã[?´¿ÿÍß#•¡b./4˜€áffŬ'Ø#Š»¹»‘0˜½Kî.$–æŒ<³jiÊh‡F3ÍÄT ÷îFFG†›y&“yhœœD¾íSÊH™XKöŽ^ ¥%SKø¿ÿeôjd¨- zªµþÖö¯K³t‹3‹êQlm>ÅÅækujñáòº2¯‡ìH¢£'L3¬ ‡þECù Œ³òiÎC· ДŠ¥Bެ×V3¤½ VɧigÎì¶–:•D¯© 2â€d6uhš)†Ý®ì— Lõ„XwDdÄè`£Áè‡hÊR¬NpD ”EÁìv3 ûh¨…P½‡9THK­†ŸR+HÒ•};ÆAÕé)еHÌ.ƒ ©Z-Sуt9BiÂЙi‚eV'´¶2Ä#ÐL;XAîÉ+â%`ÀÐñ†q‘hPþ& €…0É @ÉÄWª>%ŠrͰƒ)ɪH1ņjIF®J¨#mpϘ†ŽIÀƒ¯êGjN¹œš Ø šd%­$Ó²ÙBÁÅ) 8 g÷¹¾ cy-½·L²“çÒc†›la S jA5kbH„zʈB£EÏ 8¹“XK*¡ÆT °²¥Ü݉HexRrÉ"ÀÐ3’@+¾¤f£’fp®I ~2BX¨$?“fÜ÷0MCH4δs>W Gš c-‰” 肆-Ð…4¦4¦JsÖ2êú)arl@´e”h ™ðªÐ:=M ¡NP®lúá!®,£í~4³†C^ÄÚ»’ÔŽ·/‘KÖï;Yð’)+»—RvÃ℩Ѱ`¾jª B”T–jfÅËZdí´ÄÎWzTz©CƒÔ5‡1²mVPª²år ÞÞR=0Ì•1à`µ¬ U,ŠèÙ×xÖ8€À4@= }YÛž$P+tgÊ|¥ùŸ|}©µ´Ÿ¶æGKvÓ ­YŠAmÆ š‘•*^¦ú2û¬ç擃ØüúT(Î[€Ë#è Þ•y×õ–<¢Q®0@wý·?nÉzy9tohiCÄâ銜¢ç“w–.ÊÑuSâËLÕí•ÑEÏyyïßJÝ‹õ®Û5u yÙ–óóvk¸Ò¦U†|¢*?r•½e,­<µ±:QO‡éæ"o ÿÕ;ø½Ò$\>Vt™ÏÐf)ÿê‡*qîËÓ¹€ƒ[ ÐU7Ò¶`åÝÚ*žn8ï÷Õ^°ìnÆÌ™·Kü¹TaûGâm“ð½+xîá}ôâ÷£œû¨”_év@ä3:t¿ìýXÓÃ}oî¶8ý ‚zú\ô@ð¢žHÛÆ’g·ûc¤ÅŸRm÷ñ u½}¤à#oËM’Ö2¨S €¤‘×é«;Eòþþ^û»hÙ[Sæøs+ŋà T—H3€¥Ð@w§¥ÛT«›‘4w«³GSfÌ]=•¼³B Z1˜[kP©î¹9¥ƒ,SÒüý‹Ëë^´Œ"øeÏ¥å¿û÷-—©(ÑÁl}YŠÈÖ™Dk‹DÆ< 4ÓÑQÖ0Uµ@KÔ<+†÷o`5ûµ3ßnŒã!A»ŸUŵ~ÔaÓjÈiŽÞ xöÔÒEDë)”iÕòÜáŽÞ¡´jso´ÜÇžÝK™|B}ápWf€‡×Þ²ƒ*5{G´¤«ì‹Ì,›Ã\HEF×è@ŠŽèI$Íæ]©¥v&mDq, é{fƒQôÜ4ø,f€ŒžIÌР¬Ö÷©>`&ªÅ"RPt™{†#Ñ#jñA1êټؼ›bJí¦b´ž™‡}fÆåG öÀ.‘˜?Á½Ãw‚±$<¢«\¶½ƒûŸô—5ˆLÀv¢ Ò›i!&Y‚på«å~P› Z®æÆNõ8®o &@P‰H¨³»iIÉ0ƒøLNª"f‰Þ%ЬÊB诬Î6GMTV$FÑ~ £;^½ÂSÊN7¦¼Ô³Ïżx“ÐYÌܳ.t¢:Fúä(Cf4°{@ÔμË,Bq‹žà¼f¹º¢%'wGÐèÅ¢‰"L$)OT¢¥ÃDNÆÞrìŸ,©=àŽ>.ZC! ±€Z¦$“pgKæ!2G(ùâÃ}yïDqvgqÒ$JÂ<óÐ2„ ‰ð!+w,‡U%§ÁìXðž(+ÇŒ‹×óh#LhEЀpŸ+3*¹z¬ªãŽcÅe9X‡H¬.y ×Ì…È22˰97Ћ“¬˜eB¦æNƒÁ’=3HÒeÖûÒ•! á¼ùѯ}„†eHçyäLÆjzÁ%2Ð:£í¥ö<õ›ÖÖù5Ö·$ÒV.”GD’ÖE¯lÿG ÔXý„ì Ñ^P_ÖTÁpö€B?Zcm“Ê„9ÒX`Ö­;½ÔRKa5Ÿ}~©Ÿ^< V†Ñv¦rßʧ`&Û•R|®Tºó@6P»©Ì3Cí·?fY|ò”˜–Tö¶dd´¾,-–>\ K-e*eªÿúßþ÷ u-©`˧Ð#LéeŸé½ŒÞ‹¾6ÀxT–ûËR¿ˆío˜¸ åïb¿©àBY9†EúYrWþ;ðm·è‘SY¿žÇ™ï6Ÿ< q¯€KWO+Ð/ûÛ·”és·Åú´füi—Ã~âY^nV/UÑÛ¯Õ'žÑ´Ç÷¿°¨]a`›ÛtlGØ£ž†Û àÕNáhpg#vu»ŸÝ¿Hèüí,º bzx¾7vÃÙ»mo+O:éñû÷5¨ËÓÁUëÃOý¿ê>êñ!Þi9Ò¢¶+ËÕ]Ð{´*6弓?f¤ÇZéë°þî‰:*‘—Ë,ï­â¼!¦ð‘Šp|ù!”Ç#5•÷Õ輯t]ƒÖ“¿¸‰:Ú)]Ä'¯yçs®½ìHòò1r5´•¯®Ø#wôg¥Çꧤî¤ÞnSÜÈV÷n ‰kpÌÝ5™¸==wjÇcNžó©ôPÖ×¥xºÝG׋ýŽuüfiÝÞX]æEîÙ\Wgë‘Ç)Ôà9æ=€.åPnm6ÎZê6ówéu]¥p.añ¼³æò:p7J»Püy%òn¯’.§³YÄñÐÅkq3Yn¸:ºY£…n¥þ]’|6ñ1î~föÎt¼Ëü¹ÍðDþ¹xr{;×»¬»Añ ñr“ûâ=™ذ ï<N#ù*¦¼ÔŸæñ0´¹ëä¦=–_ùh¾é&|‡t'élo¯Èù_£Ïøn2‡×ã~#—Ÿçø’¢÷ ¤G„¬wrXzðÈ$î#PoIJÛòcóïæ“ñƒ²þv[~ÛvþU*ÀÖ@âú=/xýï¥ãɤd9jÿIÒÍi¼æWŸ,-êT¯½ÞöÈJqífDØ4MoË[VrËðí 4àèך€:è°zL?­ûæ#Ü }a¡ÈC)E«ð{ÃNšSa\ˆªnbAzIuÄÑBL¤)2YH™’àÎ\£½ÀH3äúÿ2èÀYŒö}î%%¦^mQJVQª£sÉnÉÚØˆîQçÒ#)&I¦¼&Ý£Æ×CKI”+ «Æ‡)$Ý,‰Mƒ:¥¥!©H¹Ñà`Ò3-£ÒÚ>†›7ºÌèÆž4b2“NZ¦k5’uÂÝ @B¦(UCd0Ê!8F¢d¬ù;7Iž ØH"ÇóóM2 ‚]T˜àòéMŠ´Ü·ìM£c†h É5ßã«-„©@Còöã,½XËJÃ#4øHÅM0CÄÑÇŠgº‡ÿÖö Ô:š$Dì)Ôù3ËŽÚA;Åœ¨¥¸yU&AsC"f*Cd%S‰P&‘¬½ç~¯úbýM¹G´öå€ÌR×ŇBGãb9ÚŒ¢÷Tb$gX€Xa>0WŤ9«Áv¼&c™9?åôc}scïlàeÜq˜#^G·œ4³Öׇî°îÓs4yxA5›š¥yÙy‰ÉêìuvV¾|.uª³ÉŠ~l^\‰²ûĹàåʼnÌKôyÂ\§Ýç˜ý°ô(Õ~õ}JFvh26${‹h­·h‡¦L3+Õën~ù›ÏÿÍ¿ú74;ª”¼¬ä8cfð{ñKrð•w"½GÂÅ7Kÿ·pó‹—mä–c¨®Ç[à'!#NÄg<9ùŽŒûèd®Âø£«áV<â“èîI½È½äÇËâ¶t÷oHHçº[^ Bªu®ÍiSx*= ¿«Ë_hÜuäwƒÛ ÒË…ž~ÁTÙXaðò4bÞ“zÞ&‘·FwWõ:ÏUTn®2.-Þ øïy~\Z=HÇ|okp[:3®Ôªïæµ$Ïšø¦ØüO:³-ÙÈ@\Ø»0+½7Ó &©epõ¢írš'K/d.‡KqsË‘ÊiWóÐz "=‘‘e*–9XÎÒ¤·ÿÇÿ‡Ñk ½õ÷­ê¤¹S™‘Fyñˆ”`€w¤K‰v•µôµw(ÀÏiD™P4¤à3ìX…WäØg ~H¢Œj\ƒæ(;ÐF‰ú*¥å0 -0!cðî-ÕöK(‹Ã2"33²˜j! è­7 uÙó ,›öm€·mxáfT­ˆP4E‡ÍÌ\­‡Cl-NRJèÝXHX¡Dw›^¦`â°ô%Qà4efä`‰ 2¹ÆZ‹/l-Êä^TwnôŒ<,{cé{G&P€DI‡C?bª¤«º¨E${}È—w?pŒïì¤Ý4P3TÀ…ñ{S§¾›ŽVÀd`)½š7ªfNÂ4ãÞ4tg(²Nï–]Rj`Ì høÝN•V Èa–ëFC”Ð-3d†:{¾I Þ=X+bo d»(†ƒKfa1W!LÝTàûè’Õâö‚ÊœP¨f=ÙÀÙÝL­§ÕP(xÚìÖ¤È\Rnš­´ ûlf–¢S:dX¨^”²ÂC¤z¯‰ê¦žêQF!¼`f@€"¡åp|HI¨ÅšËŸ ì… U°•!¥ yP†[ÝHt©k‚wRH¨‡2•q¬Õå}5ÂUÈó$z;¢ÔÝê ú²šxÓ€²yXƒz_Åtœj¦†‡-Q ƒÝ_*"ácsUèµDVµd:}Wê^fX1w7pr£13[o¤CR6¯4O}2sëË¢h6”ý÷ ²ÃÞ¸ÿ‡â_@ «å5€q»{sMRš:è±¶/ŒZþQû?iEüóåï{X 0Œy}Í_šVÓã H]áØ0x,QóMïl¤"B€z%bühJc…›å\LÅË\Å>}vŸJP¸H’ýí 8Cô—‰ÕT¼ï—̰ϟü»Ïoû~ø‡ßã»n¿ú€W÷——Ö;ºaYZ¶ˆÖcéÑ;G?Y-u7½üðù_þë#³µùÊŽó¤ø¼WøGß8ÿó|·%‡ä϶·üùïèŸÈnô—Œ*O,¦ñ‰[ϳí²þÜ¢h>w©ñÏEðç¢ð:.YþƒMdþé)û_åŒòÍÚéÖîç¶@—Å|:æ Êi}왥'ö¼À©8—¹7õ»Ï—ǫȫZß,d¼t…ÿÚëÌËRûs“qÜeI´®b”pÊuv5<´Ú‹é=ê#ŸäΉ ëàÙqþ"ÏŸú0xü—ºT'ï— lÇŒ>>àÛþ‚³ãíÅûëCRï­ÁïÖ-甬ÑmÉì‰Ë'Í™ÐóÁµ‘Äuì{·šWÏ/ÊZï*e‡7ºy´Ü·¦ä§OåÓËËÛ!–7z‘®®ÔGë…Ac @Œ«3g0f “0aXhø>u”DeBR¯´IJd(øÁ2€O  I˜S}ñ,­zæ’0™l´Šˆ„ª42-SaÓê8ì‹§„4dQFDgMÚž¤ ‹ÌÄN]YÀâJd÷ERa)ÞÒéK,‘˜¼†ð¥-8{•+îfÆÃ!39™ïŠã²,™è‰¹ˆ´”hF!!˜Ì!!-j™( ÝYÈC$…O\ ÿÉÌ‚ì©Ù,$¬ø:*á\] ¶s܉™ébè$*µú.ï‹Ð=s*nä"ÐTIH¹„ ijÜ $Rˆ~~.Õ £Ò<â(îî‘s˜;’I©o@й§Ë®Á¸¾ÒVð2B1ä°÷¨ ''wfßûü}™>[ÝÉD NP‘=MÌÜ‘’Šà>’²Ñby=ÐÒ‹²ïûá@:~›o¿.lVŒ½u[ís-‘\“p£ýA#g6&ú öŒ}ù¨úŒi@¡@ÊþÛQÍO¤$ÜÀáìëÞx4^ÃÞyM! ÐÙpúTƒ×õõV‘AŽ HœüL/Wršê2Û½Øn·«Sü®©–èiKw/¶›óþ_|ߥ°rh©·f±ÇË‹}ž¬gg)íw¿iö‘`†ÚÒ²÷l‘­gLYñ:×:Õù»—ùoþÍr¹?®ÔGØÃÕ‹tª ßÊ6G›‡ì–}LÜ¡©ã.~•¸ÿQË͵¡åAïímX¹Î,]Hoç=æ7ëþAêA)ômSòæBñª=÷n™íEýfæ–ƒýäâmk¸ïYÀÞ“ëÛÞðÕÖ„ÏE‘»Ž»×có$Æ<îmý¹J’·Áð&ÂÜHâG Î 4}¬_Ÿ'š¯„*>‹ï߇Ù>*a¹kÒû‘ûžà»)˜y°;¸‘_;7¯‡ýå8øI#ü)@çoç è¬@Ðyûµ;»G>ø”¿ù ¿n<žéÏ%ŒÓ‡]±³ží±¼ìÄL>? /iy2JNÓ÷W@Ý9 ÞÈ®›‡†Nt >ЛçŸz?~„ß<Ÿ®ÐP—züµ ¥G§v£<^\I^Œß{·‡›ÔÈJ€¹¯›[÷nônã¬{P«‘ u-(4$qפà=ÍV'8Ñ ¸rÈî0› dÛprfÿܼ?ŸÞn•“KÍútGΗòî“ê¹Ã÷—„‹xò&“£›–Ò‹ù¸J7žO2S·)DÝ!yð2î;:<¸›Üi®s\§0úŸíZ)Ôñæß<Áuivq:¼ÿÛÍÇó„š¿?aOCêá}‘uﺮ‘¾M0]žÑõçèâ§äCºÌÆ‚ýÈ´Î&WÉ¿ûÉ=,O!ÞÍôx6uŸo nVnFÖÙZá$Ͽ󸺎9îñ<ÇtÔ6Lyìn1þz´Ÿ¹ûL9 Jÿ—™Ôì0n±IÄ%ï^W b>o<å­®n$ÏÉçë ‡ÞöòUº}æ¾Ã1;Gcwã¹ßUΜGoÞÝ€=ª•¸¿#}/:¼Ù ½%d3ömôU‰Q¹ÏKÏßU„;¶Ê÷`§„%ÿî׿&YJðöû/ê‘‘Ù©´èÅè^çÉJ‰ 2I¡-m¥*»·ÍÐT\n) :SŠNZöÑiu*¥eÞ”¡··Ã§—É‘Å9Ç›gJKp°Ñ‹¤i®„‰†Zi|ûþP2B‡¥J‘l‘™²ìbÀÌÜÜ=%8•0sS¦Ld*¡@{C&æºÖÒFC&Hئ`vÐÐökb`ú„\9õT@T3gö€Ž8zÃFÑ:Ñʆfž™„,PæÒË>˘^½«¦=#–(ÅY*I¯æ´ž”ZÌaV@Š––º¤9ÁÒ%«ðYCðãÚB«–½Ã2-2i‹h™‰‡[I$ (³Î–Èèédƒæt´êtwzNŸ 2£‰P¦PaóÌïþfŽÅ{ÏC_<Í}ª^2–lñ†öúÚÀʈ×:­Ïýaã7ÔÛuÁ1 a¢LrˆÐ$-D t(¨âæõÚ X3QQsm~`€:ÐÂlÈβ·Ò“æÀ¨•NÔ“3bü®¦Ëûññâ£DšêT·Z¡‰‚"L&TÉŒÉ)íЖÍDÊi4—×j (î2kJUGOåÙK(i´7˜³ZÅð%`º”è03)„&ç«ðÚ!X8afÊ0ã$3é 2³a2ƒ)IÕÑäÊÉ-½§R³£fR%œˆdR~Ü.(‘‚Ù’TàÉxŒ¾„B&%0"½š !ÛzÓ‰b0¬M3ˆ€_k¼Ç×¼ úC•öõ‡ƒe‚JVªÏÈÉ™`„•cÄä+Dȹþçx’ᣂ~¬ÁèèE Qv/Å^¦âs}ÙAÑű×M¥2›ùp396™‘Bbä¯ä„¢gëM|3ÅÿŸ½}’$K²ü°sTï5ȬêžÁ.âÁ‚ "üHþÿ_ñ¢–Â!H`A»ƒé®ªÌp·{U?\3wswóˆÈ¬¬îêžv™©ÊΊp77»½GU§¦ ȱÖû'R𑓈µäʇ^uÀK^h©Í׌gC›—E‰ŽÈå뻃( yY È\~ò²¦Éh ^mÉIä¹( qx*!´c€>U¯é²êOµde=ÕÝÊôle2ŸRaÏIèÉç'¹åÜÑa¥ õÚN³QOÅ¿‰þ»âØì7¿©¾LÆ<«ˆlÑO-{ØŸõ€¿ùÏÿ9!§—‘µ &øj%Í&œ^?k ¢3ý€Ôý‘ŠWG|¼»,ý>€ÙuÚW—® @—SÒ%¾¿f ã·¢ÛsľlË5+7BÞÇóLÊÇá7¾€ë¨Ç‘5o¹¯wUYÛo÷ ä{TRò5*¼CØ_‡±Ú`9¸ëÑø¥…/oŒ™ë ×Œ›[Á[ÚÏâ¦y!ÎŒmÝòxñÇÔýqý îÒÆW@[Ñ}Âç†tEª¹†Ì¬Ç žÏe¼¼‚A½^¨»¹ÿ"/¯é¸7ÓÕEýyBçïßdcŠÀT´¥ úk`K-•p&ÚßÜô?wGñ›Åö=+Lyu¹ù¤w´¢÷ É¿ô‹7…—ú#]Å—ýðWtÓ=ÎlÞlÛðÇ›ü~Šþ¯ü—Z)þä>ç —o½÷BôÍ¿*ßü&Â/ÑrøF÷Á7þ¤áü0 yÏ<Ž]xubûãͽ%‡íÒy× oòÔÿ$žoÖðKOøC톷¥%çkÐö¸Mÿêÿ÷¿q@xÌ$úœ=æã<´p+Su·¤y±Qþïer7@N“èrôPŸê„bmžS(µÌsÚa22û©G;ÔC9Ô˜;Š)SÙ e‘)åÁ19ÜÕÔ³·žs ÒŠŸæ6ÁÒ¡P5–?ÿÃߊJeïY œ›Zïsk§S EÒ̼$²Gè7R1|¦M9°=0Á} eæ¸$HïXDt[j¢ÅQý ¥¬@sæJÿ ó‘03wª˜;²¬U¾—‡$=§ Y­bΖ¦ibœ2`(##"à0³ì…lnp·Œè¡â¤@j=†ci)4±Ï)¥îY&G’"{ë„'ÈÙ[÷ƒW¯ÅýóË‹˜åPS=F>3úлe†hÐl™I“•t÷2;" s¯f)¡+“Ž/I ²+ó4çÇïj)8¾dŠX‹ZžË}R‰Ì¥Þß+”‹|yN DgúQÙ Ð)!;R²£dÈ’<1?i9…:,iÍ`RM”'¢›\I%šŠf&šÐi‰ûÂW§IŽQÉJ IBMH©ÀF¥åxûÆS ëT'ªk2µŠVHK}6…Ô$Ñä ººcNxqR=#€&?ƒÈƒ'Š@Ë$U › 7&ðÉ|ŽÞ¤.,¦b”xœ{R¦ì…PíÉ ´ DêÔâØ{ªÑeæD†ªDÐ3û ñ¢,G%œ,D 8–‹$))ôuMÌT æì©Áü±YÚR£›Ãηú’!ë ÑAÿ\,Å5>L}‡uÀèë;"[ ¥Aˆ‹¬æX”ÃBîn#… %J…M«Äë€CDÆb!àˆðɼ¬VãdV]"^¬}þìYyq˜1Êá S¤§R̽0Ñ£K sƒWúEsü8ú‡ò3د‘¡g°®©ù@&²/MCèçºp¡C±: ò¥ýhÙœ:dK¶fý Ì–UŽ›Ò¯Ñ|ÓÌîÿðO–`F/*uá /b¢Ã!Ä'Ù“»;­”2ép¨uª/ne²ÃAÇÄOÝžýðü®°ª òÀš¢Ê‡CvÌ?üè¥âùɼzö ·® ìÃÓSñ~œ%]ÊÌŒH¤úýÔIЫOχçß|ð7ÿ쟟üYyÌ‹¾º_µú¾¼3¸xOækqȶÐé ë~] _òZþ,AÛÔö÷Ľ7ô_îÎÜy)¿г9Ûý×ôžk~”@z×iê¦ÞŸï½ª7ø;—¤¿ÀhßÇjA¼Ó…ðfÀ/3Òî…¥ë¼ãŸäzµM¦Fãæu`Û‚¤û/Ø…óÆšîÑ+zo|eËÑ7¿»ú¬xe~Ñ]ôæeèuÕâ¶^u•™ùÝðÖµÞ­LÜ7ÉæC‡Ç[9No9ž]Þw>@;¶/÷N®zÐs¡MU¸ö.{Ï1øíûõ%šÒRH|õ7Â#ÇãË÷ˆ)WÕôß áëëH‰ýjn¿/nûâ›~™óàçÆOV_´R?ÖÐu{‡È}ûVÆ÷L´¿&\~_àbIJò&t¿á$ö®ëàÀÆ+z’¨Ùº°«øÎpØìÙX}‘˜{F&í­pC[×뤠›ò2®ngº®ˆU—¢*Ül ‹C«­A§Î㫪­·CV½¸4ñܾóÆÌ˜_ºæÜÆ ·è[Sï:Ù·›‡Þ¬oúês×+…ÿožÉ¡ð>Á0îóù•™W` À¿þßþÍùÈaæÇ>Eë§ã)ZYjõânnÅëÓTjäÅ"ÒŒ^µÞÓ¨Þ²½Ã579¤¬Í! 8MˆÌZÈlJ%Àú¡ÞU{„Ò¦I«ç×éoÿ_)dä{zDOhAÉY‚=…Aã·«…nÉž½+ˆ&J"ÖÑNi¶ "³µTv…_¬t€ð 8lBÆ*j!ŒÓ‘Ã(ج€/º¤¨‚{Ða‹¯*Ôáe1)„;bFF–:»%Î.‰h­ \JNõi˜ÑY½t€®Aö§a>%š!Iú´8Óš{.i} ŠHX=™˜“…&?ÔCd¯¥¶`¦" ¯4xïÑ»Hº{DÙ{&1ìFi&š”šcâøÉÚq~þ8ÑØzÖæ4ÏJeèä‡, %4:0:¼¢”¥ˆ{ŽCL‹@v˜ÁŸ%!f ­›Zj±$MD°+¬a(©€%üdÃm9'øÉ`ÉÙÒÄÁ‡If¢‡PÄn~"eÀV ¸D’@Ï¥ÞÔ,(iÁêbOÌB1H:ûÌáPë0šñz’Ê„DΟü»C¥ðr LL‚Ÿ{Vq’ÁLÎSF‡>¸ue‹üè~€Ílô˰/ýÁ)9—rÎÄ< âʼn÷µ¥êTÁ§0òcrIËLÆýâÃ!ÈC ç ?,]­²´´¡Q¦µÂ€P'ˆTf¦L‚A’UKd¼t2‚i ©ŸŽe¬À0·Éä`˜ÑÕ,êãK±Žu”çB"ÒX²r¥Ã®÷Á8@Öíµµ X‘ (0 ÏÁ\º+ÆÓ‰\<‡sɲRf‹ó6Å–>Ÿ#Y"ªÇj 2-g? V'L¥àà¦Â:Yj²úì^ØÌQ`2º³Ò<çȟžißâÔ£‹…ÙÈçg~8dœÚßýp•¹}>E—ýö?èN³ì‘=ûÜbî9÷‚W̧éé7ÿæ?ûϱW#|)r\£Zí¸|ñµˆÚS..¿©[¢%7‡ý7ËuêÍ yýMíX¸‰}îÝ{2ÀÝÉî—–¶^õ=~wvÃkáWž¿äwÞ^ár­=týwÂÜ7‰6¯ý~oȼòô}KI¿êW~o> û͸­qùòcÅ5ÎV÷‡Dœý¦÷©?ç.–ûÏ/ û¯t„_qÝÕ¯:¾”í1g×øöh¸“ˆ}„×›«Ðë–¶÷‡Ð݉ùhH?:–Þö…Üq„vÁh¯í¯Ò„x½Ü(S›îûå,¶ŸÇB¹iQ¹eéèËà%}pm°ÍëI'^ËÛ,š^×Âï¥<ÜoáÚfäW@Åí,嬲\Ø-aÕ6D ÞÐ_µû\þ·®ÞãZ<º+iob ^0\ÚX,|±+¶Ãú£¼ .õÅ;ÍG—åT7 álâµôüâÎ9ßÅËÍ”.v^ÖtÙJÅÝâŠäÂóÚ`ýv¥ðM›âæéß}äM äjÿÞ éñ9×[íÍTÙ'%bk;…-Úƒßm"Â%³ =®¥[ÞìÝ—DÆzÈÍÞyã9q!Dídyv@G7b<·o²¿×ë6ˆ=€tŸ±Û@u¶qûžÀ£œÎžñ†6«ÛûýÝ®' œzQº‚\€Z7]À—h…-^ÍXÝŒÜ5€ÆŽ»Ä.͸# o$ؼ;0ðâΣ)Ã;žØfœŸ÷µs ÿΞÖ;u[¢²6qž‹U†ÓÏÝÛér®ùx=z¸ÓŒEý޶­9'W–o@û‚Ë/‡ÒËÊ»•óvHð&Éy™ÓK‹:·Öâ}ò‹¼ß´÷B+×QýÕS½ÞѾèpò èp=¤ï—ì˜Gu@oÆ^ÛÞÒ×3»xJ~ÉÓó§6šlªVbö–è_¸542I¡±fš]Eþ£Ð5ûöe¢”åd0‡1øZZ(ÛJxYFäè0ÇúD–Lƒ Jp t€Þ`ãS ZäˤëIÙú‘tDÌT-æ­]`˜ FI=îfá™é+¥{À Ny!”ÙX'ÏPi.Zd/uþ=³Nŧ”LeXF¬×/è£Ê’ØÏôêÁˆ.#à ³”BXJæ4sˆ°Þ;i]È–Ù¦O)3z¶;³+B/k-óx:&³ ŽÕæ5âpa¦¨ r†}fšhÃìÖ™3‘è¦8ÁGµÿ drx½¦ÔelpTRMØüb•þEÌ”9LM&¶¤ÀRh]ShždŠLÚ‹³¨8X @wëž@ç±óy®Írz¦OÑ-íE=眼´@`:ZÏ®9¢ F™Á;ðܾ¯f 7u)S&O*2O=IöìÊÌ—–)Ó3b$#ųf/‘ s†‘¯¥Ù$ DÊ€B}€ ,ÆŽì¢ÙØ´ëÂS€rüŸ×ùσƒUæ’¡ ‚è ÖBr‚HÁ ¼@ Ú‚è»â‚¯Y³Dè ¯Èåf€#×ÛVLÍT¢ýH/Ù3À Fбúë&z++ÜÆàÊD•°jæ€' ^=“R¦4-ù†]‘=[˜›p£P 20šÐyý³,bØ0Æ8‡ ÕȪÒ/‡’±¼¤À¾d `E ¨¡VtD:límfc¹³‹ñrx´%‹°,•\<ÏÇ+~@|^=“Õ=ˆ â~ñ^yx*Q=Œ?Rýë§ò׿í?Îz9%ÔÇú›ïòeVâVÿê;™%-Ÿ-$¦òãsÿþcºK@-ÓwT7óè=zë-úÜ¢õ˜[fR°êõéðüÛóÏþùm ¾a–.ñv®†–FµA‹Ü?%pƒIÕ….o‰·útÃõ½êiÞiðK%ñuð(ü|G(µW'¸_S©7J0öÞs•¹ i.ðÌØzE_H0ñ_!ƒ_GžgËã¡WËS„;ÍpœïÖ¿Ù÷!x%ž<§xÖšå)‚çCêý¨xDÝØ*ä¯w¼'Q´›eyü+ÜdV‘oÇ|rñËáæb/²+wôëó¨¶F»_Ø7ïz#’¿ÑÝA=R¶/hŸk(3·ûÜW¶Ý^Þ ×Ï7Qø™¥”>ÐùÇ";·ÙÖk=Ÿ[›ÒesgÉQâ–ÆÎ]6ïÍÔ]ø —‹ÿ&å_ô¾mêeÛ€½€máiùÃ_ëÆ+ã²=̽ †yoÀÏ}üûÆDkµ)ϼBíGSÿïIÿìQw[;zðÆwøÑM|u,|“€!ñe¿àhåϵ~ýÕ̶«qûÞ®/˜57†¬°ÕV¿È¼Ùäe¥·B}éü½„_k¨»êàûƒlÉ_Ñ ÇfÕËyãqÀWAwsCÚl®·É-ôœ¸´nåu½â™õæ\Ѓ}`D°{Á/¿Éàü²Z˜o5¾¢`¯Ðéí0ú+âæoœíþ33/êÿù²Å¿ÿ»¿¿ùõOÿûïç—9S§ibq˜ÌÝkañ€Ì,3œeO{ MµöÓT²³µ¾ uÜhÀè0Æؘì4Ò¼ÑÜÈ\ƒƒ“³T¢W˜ ÏD“â$ üÌdè™]‘‚6hxÉbUÿÇjØNÊŒÕ)‹ÄŒTÔ—­Òˆ«ÀxÐ\tj­ÇÖy7àøC‡`J¨#r!Ýû ¢!¹¸þNÏ0G´Õé×3€l0G¬«D™–V X]jÿmÜ{ƒ Vh…¬¬OµL“ÜR^Ü&½8Nddñ’]z¢Ò,£ftC¬ƒŸÉŒl-Z·ŽL`ä#í2 JAæŠ,+0C¶å2–ªð‚èñ¹ !åKEÿR·”(uãG²že"6ŒûÕyô°À\š-T@_ÓukÇF©ƒKFLVè…µ«µÉKõ飅™M ó‡9^²ü&ÐÓÁ¿ûÀNµf4={ûéh‡äS퀕'M¥g¦þæ{O9ŠñP£GDË LEë§—SFYk©O‡¿ýøŸü³ÿbS¸sGá\f±©˜ÑÃsåcA|[8yçÊŸð®UØ©6úªH¿üù_| {%û6ÒÏùõ_DïÛùÞü¾YøòU±ô¶å]\œ zõÚqâ XÎ Úû"zxhºvÛÛ ûµmãÙ×¾„Uµ“¡ÙTÿýrCî×ùú èüÇ}®{¯dõeÒÖãŸþÜ4r•çôÆëÚ›'UðjÙ»ö_ë€?—ÜëA2ýZÆþf_ãË¿ö–ŧ}ksùžì¢~Æåò+~QWòìA˜ýZ¨ô{™m¹®.J)ߥz×ôùÅ£4~ÑŒå7]¿Ñó¾˜,]KÖßðò®°EÔÏŠk_IhÓ5‡W–`¾g„.åñËY‰KGÌõ°Ò €÷F?;^ »&ckHª‡â²®ÿq•QàšøÜÚYß Ðw™-\}ôxÏÞÔ|mw?N3³«ê•k÷Ýë{®wÎ2n²’z%¸¸t³ê&ø¨ ë(ãßzñx¤õ+9žkn¤ÿ3ög$.s™üá÷?¸’½·ñŸ^~ÿ©OÑB™p¯ÓÁŠ'ÄAÿ/»[ôÈ^j-pJµÖ…4°ï)’'RJIÅiî­5õp÷é© Ü~72f0’­Ùܼz™Û¬tQ3N…6=—ãÜ s¥Xûïþ{÷‰NÌ}ø…ED¶Ö_æ˜#N³³”Z’ˆl@˜yf¦hE¤ˆ¤s;ØqÆû,ÔùE”Ó…€¥úxÌ‚¡©U³1_†zH”˜E „@t´« aÙƒJA$(Ä -ŽÐP6§ HDMÍ€ZkWËž™0K1i2Ã@çø¤çFLÑ#Ñ5è&¤ï=ÍݼÈÞÆUëܠѨc¡ äi>õL1¼G†@dª>“*nHDfö.HØú&¦ÂŒHŒ¥˜Ñ-3æc«‡’hƒx¤X<Ñ‘ ÑíùB(g͈'r,! œ Ѽ.5Ýêˆy¸'@œh L ¨‹ ²!!P¥"gº«½¼˜¶loƒ8….2™¦áF“ Oƒè&ia$Ó£¤EÐÁYjB'=tÿ‡)hˆæ©^T ìÈÐé vL³uòB y²¦~²cM‡ÑüP§†|é‘ÊÅæŽ(?ÌMÀS±öIš—B‰¦%krŒ<ÐCYÕù2÷¦$õ\÷ž8¥„—bîz"³¦$&Hʉ‰ú ÌDd:iÉJtd4*+¦Ì”L( Ð"Ùç }’u_JêÆ–7ZC¬'Ñ4´csPèmÎØãr\:l–DZ€Ã–ÂA€u™Î0êßØÐ©  a¸A¹2î‡VŽ…À zG™ÖÞÖ(Р¿,€Ã èV“$3z¶6=}0ŸÚáó¤,ít¤Rê‘i«áîPR†Bˆˆh@Ou“áE0à Í=cjsŒž”>/~Å‹#ï/°2üˆÞ„ŒÑY øÙÖÞÍ õ¥Åa$6øÙ5—IdBÖÅh!/˜êÚ#E˜!s*¼ ,(ss÷œLÕ>NV†R?Îü=‚׺%^ëõü¢ð?7Lüùo£ëšfý’jì; Ð_Mä^mŠÍù¸vþç…ʼi°~øÃgÿ_lÔÀÒs÷Œ~vµûkg±­6÷ª‹èæjor|íòÕþuwCíÜþ¿o;Çýy‡?oèü›ããfÁÓëË>¿íùò‘A÷;›0v] þXOsSʉwì1ÝË6ù2f¹pÁSŸY{¼ps û"oðóVxM!ØNÛ½p«•òv/]„BmÉ9çûµþáÒT²ùo;µ¿zCþÝÀ·—s?•nÞtáð¾ËïÒ({óÓCÁ랣ÿf1q1õä=oåªDâ"´LµQjo4´×"‡=2ãÐQ·ÉÂó¡ÿ\-|Å®oîqáuï î}£í#×ތ맠3Sfí1Õæ&m‹¬¯ZG·ê¡ôˆ’Gñâ·|*Š3Ühð~júŒršë"N©Òtøn‚‘'É þTÑ’,†þÿïËa'FبõVFvêÇ—œg&Œ–h-”R ç^¤ù(”Õ¥øâ«ÄÕñr!q1ù¼À“xYRÀŲhà*ý‡À³ði‹j9Z †Hs‡õꄾ€1rC”ôT¢ÍMJÅÝÌ"’–¢¡ mN÷HÀæfJ!”xqˆ¡HóbŽˆ$ƒF€3dnV-CÕ*Â:Î3“ÌqüÔÉÖ 5 I}†x½l¾¢Àð¢Lp33c>Rfö>÷®ç罇ÒÓÏå¨Þ>£E"O)"pxœ÷zôqfèãÙÎP’m °B‰˜‘ ¥’pÀšÁ# FP ¦¦÷!r"M ”`@YtN’‰‡Ýk Z@t4Óh> éÔ @Dræd’>t\(’’i‡#H!¦H#W„žÀð<µç†u×Õªbé«È,6$V››¢‹à“Ã(§1¥¸›²¥ypë­C¡BqRR X€çè½G¦„ 4ª%†'*abÖRjD$ T[6#‡ïçÔRYH„ÒÒ"#ôµlv┑¢8AÔœ1’gK >ÑgdÂ+²/x. ê¡X(4c~Ñá´…3ºdrU´±ö p[½ ˆG}^̥͗I=já[V—4µÌ롯Ÿ¡Cbœà.súS1/©$Õ•MJº×©Ò Df&²Bè¡V+Xœ62W)5Ím¤W$º1Ò²ÔŠ,èMI¨/iV¨ ¬0-isÐ9rT4IÃ4¸¯6PHÃ9À@¾|ýJ.i·%¦$Ái¹ÉHôÐ@v€ ¨¾$EÌ©n¤“Õž&ãTNµLOîÕÂ=+¢–õP~Sý8ã»Z¾û—b@|š³ÔöùÄOåßþÇAÄð†Ö쇩N,jÕ4yq’Ù³gÏì=ZS¤¬^‡õñoþùÿùÌ験|´=ŠŒ¤ê6¡©¸ 2ßQêu#ål«È«#üûô>è+8,nÎ.j½ n«ÍÎl•- õüÖZ‡ë™Kkø¹þÜ]¬Áåòaœ³Xv¨ê×2ÐYé¼0qîÂ=ÈõâeÃkàMÌ{¬ÔrHÕ ºÉµpƒozR¾ÔmƒaÞ֘ߜFù ²SÜws2ó>”Ýõ 8Ëû@ýÕ4Ôv _Z5îÈ(çsË5ãúúëÝáÕ¹½½BØu"¾ÿÜxå]‹0ÄÆüc;ˆyÓÖs›QÀ¶*ס;M?»ÍéwEQ›±3QÑ09A:,O‘-óàVݘìJ“ŠЩ£EcJˆˆžÏµT후¢;‘d “ Ÿ#›4!¸ä@L¨ÆTCɱ7éI–-"T&l¡gŒ5E¡ŒfØJH!hÉ .ùë²–/…€*Ÿà`խǃááJ®™y ؀¬´¸vã¢ø:}–%µ&‚¾èSÓóòeZ2:W÷h(k+À`qÓ…0Òˆ*ÑS£'Ìþ2{1?LniE†Œ¹ÑUŸê‡¿þ.g½üð){Ëh†t2Π¢æ$®<1{*z šƒÊH(RH Àð¾àP,‹ÉhZrG`É£HËõGHBŽÔHY쫳,Úr •ÊÊë/p_º.r¸ Ða‰‘£¡HøPÑLÉY´Yl&) Í ÜÈ©p:>бT;XðÒõ91Ÿd¨žì‚?ý–eÊèÛç“ÿ£¿òß”0žŽ-~|ñ¿®¨E)z:Ô©Fdë 2d(WúìÁ'/OÓÓ÷ÿ£ÿäonÃT.Ý`ì¢O\„#þ"uÞ7ü~Y‘#ö0ãW•÷ÁÌUs-÷•wEdïkoÿê¾û/¿üHûÕ!\¹6.|$ù…±.wÈîþæö!ÞˆþÛ16ª:¾ð[ëË0ßÙéÍW Øÿp÷wb‡=ÅWŠÈµc¼'¸ïcŘ~ÝtlŽP:þÁ@ç·áF÷ßïtù’>÷ æþá¼.•¥ïš›å^¯ÜHÿ_¹–¿Õ“÷k”^Ý4àæÛ2®1ô+½•¿ö×¹L÷â÷þU}Þ;Ohc£ûþ`t'°iŽ»*~ÌXü•î^7ࢯW‰ïs; ¼ë0}äuö®Ô~qÉ#à_ÓÊõ§Œ]Iÿ7†Æ¥éîÓ§73/‚~ú7¿kÇY½ghŒiV«‡“ô4ÑÍK)SUÊk%‘=Zïî& õ^|˜ùR@öhmn½Sé6½ôVq ÙæS¦A°M0éÇÏš›¢úËìS‰Ì"±”È0ã  ‚Bš—©Ä÷ßJ™S`2‚©©¹>½ÄË)ާ±Öeaó«iæHåZÂO3å üŸ‘ðsrÓ‘H”²Z.ŒìU â¦kô"#ÚR­<*ýK9?¸€Øû¼ú ÛêGº²ÑèHj!¾ÚB³Ù‘ÀI˜=Z†3$ ¡+8=U/}tOŒ,F†ÜånÑ ž©ÏT¨¯™38ŸN½%Q¬ˆf~HV|:½£ °0÷‡¥m0vZ=#Ï"ƒŠBô öfö „G7sþôr"ê%#@ó"Ò—¥Ó¢'…˜—mXrPfmI'dm'Ð õµå(¨X—Å+ËøLëD2¤$'¢†…Ò T.Yå]¡Ëb,êÉ BaF Pˆ .t{°‡à"%M–ra°¥a² AB´D4-JGK„PJNÅ2£J ¥LMùYéZÏgó$ ÓTZφ˜Ü$T·9âàtG…5äÝÅ,Ma<Í4 ꩃé7¥|n=…É1¾,ÌÆ-dÅÚFPC‡âÈÈ×6Ò…í3HP 1s±"‰RA'9¤ “„òRlnœ.¢ìˆ-mµà>ç¸|¥ýä:1mXv]YªÝ¶^@hqçöieÙ×Àe€9|Âé3Æub-xƘNËÔAt"UÌZ"»Œ HEÏhVÊq°âÿ2 ¤ŒMí§ì?(O^'˧ÞLÔ©—Ì“¨ÏŽ”¤l‚¡7°rêp¨Ã Å6L‹pŒšÐí97âçú“c¥²º„íÃCB† ä`r° 'Œ(eé›ì'X…½Ä‹8’ݼ–xcÿî«‘¥´j³—éà‡‰~,•l‚§—CV©òÑÌÍÐ?ŠçÓôé‡íyòÃ3ÀfDöN#)[C-½÷̤„ŒÌŒÖç—So’×âÓôôýÇÿì¿ø/pks·Ý+/}ÏÒ· Þ‡[áÝÿ}éIýF™¹„þçïð€Áù‹“aÏ!üÏFùËGi¿—ÝWG¼×§]'n‹ï,FÀÌv5åo’¸>ø|ÍSæ^Éð¯SÒx×l¿/ÍÃcÄ»ïüÙ)úzDñÕÿt¡ó¿èP¯¬Âo·zï[™ìæù=Žû¶ï{ø¾° iÿ­û×}•ý¹ã-{›Õ$•¥íb¹ð65[B ïÕ±DB“ ìúò· Ü£š7óNG‘ .úžqžø›znÜø‰ëòÞ$l·Ûï ïK©77OgÅGzµv|{{wŠ^yëF¿<ç\Í-äÀd“>g‡ïb´§kÞÖÈîð'Ö¯» Ï/Œ ê±#Í+æzEl=÷rKGÒ á7ÐŽëË¿Ÿ”W¿s•ùö³ÄW °]ôÈõ‡sCCÁ]fB׿tÏLc?ÜN£ÍZé]¼×'unZž‘.•/w3ñjDo  a?^k ¹ÁÃãÒÚ©«?ßô/¹üضcÓ¹.b8W°ÝQ¶ÎËÙõN íÃÐæþœ›K¸šxlVeîì–›CÏ­nÜ43^×¶<öì½,OW¨)`wÖ@µ~Ô[æÜì|'vëÆ‰áœÂ¸ àý¬ÿv­³J×Ýμ€'I^/&:¯áZw‰ 7hÄŸé4;uçEnë]|†Lk—ZÈMÎõêV¬{É­ðùÑ‹×Íg ^ñÒîf Ö[¢ “êµPïj r‰Ü›^qUº üîKUx×@²ÞÚÛ¾‡›``oáä6»rw®xµ…™ëJyÓq^vÆ[Â7¾ÇCê¦øn‡¥¶>¨7Ï»Ez;…?—Ò¾ufiQ`$üôã'£8ýôÒNó|œ•ª¥¦gVÌiVÜŠ÷bBì={6˜› Û[Š0s7‹Ì| 9ÙZkF˜3‡ÓO…9#ƒ˜‡tš:Î0ö—9'ïN´®È8ésBà±ó¥ŸªE-ò_üÙ:¢G¨‡è> â&fË8âØã™ÊìdR7º™SæZVJ3) Vxo`]ŠŽmh÷Rk)ñÊÓ¸pGðw,7@oˆ@ÆBÏ%ð¹PØÂ Žì pø°¶É)”á¸ÚGS_ôkØéÑ Y} x_vC„†ÿçÐLÝ ™§S(àÕêdê)£}Žpž&¥rw’Îòéó±Xdöúìý4wƒ9 hs?!áuBà§ŸæèQêÈ|†º Ð<"Deݦ?äµg˜™EkÑ%¡N:{ Ÿ&š[FAô¹÷éÀìŠÙkõìm~IÒ>|x>ŽÑÓ â$$Ð)GÄ¢Óg:a‚C fƒ1Ä IFFg¼3©Ž¡ø/ÄŸn€TÒr,s™H" ‚`64eHY¦Šp=]=KÇÜ%˜”³¡‚l8:THI3A£«g>‰ÓçP¤^º‘pçDæœ=én™áÑ;ˆCqK0U †bÕQÕ>ˆ7«@[N<´EúW"Gý~±˜Özp¤`bCDúår‘Å—dÀäpCÌ™¤Áýï3ŒpƒárÎp‡¹•"{F3a‰É5ˆèˆ¤ѲY†{2„ñ í÷ìo˜©ùdå`TËöCÆKf‚ý l@ÃîLÁ&‚‰.¤@ Hè¹ä,ÈMTÊuîKJrÙ¾s¥šŽL$¡¹8L߃§B`ùb Ù,X-ˆ¹åóóä>¡g´f“’ÀTxs6Ó‹8Y)Õ£ 9*ß{ù«gÑäÇF+¬³’5çS̳>øóÔ~8ÆO'DÚós&Ò¬× ­³P1Œa–vÑPöˆÖ³õŒ€ÒÌÊTþ/ÿ·ÿ«Rf”r㦹ªr›C…Î#‡—ÍN¨¶ ×8A7à{írï’sØ~9o¢èêøq„¹ ÎÆÅ¸îÜž¶¡òªë–uÃóiRÛØL;'þKä´†¥·gÏmñ¨ÞÁM oäB“¹µî@^)B7Àá=™ls¿× Ö}MÒ ýÃdÌýûïr/oþæ|ž¹þEÜ6·ÿU+]órnnË›”KÝ5’àqÓÆƒšý-€GgaíþõXâ¼Mi\\¶7ú}ÌL~•~}¸7ZeŸ‹Ž·‡D¿œ"/“gAm6Ýþ–î zîY@o‰ò÷jâþ‘áÏ:¿c›“u%®îRg·Ãx!òFk7G Åš+†×à2nÚî—«W¾žÃùnàkrÕ¯Üä›%f;—y%é€Or tº&ÿ|aáûú,´‘Ëwô{÷­ þX^2o˜šóuÑûµ ³°çj½åNíÒ-ö“ÕÛ»H¼•¸º¦¥ëŽ£kÅ ·äòÇ÷Õû’§¬½«åÕ—¼|Ùݱþ k^½î½"Þ™|ùû¾¡]=îãx®¬'Þül¾šíæ;/ 6¸;x¸;rôÞÅ@?³hãuJ¿`=ëÆ;¶{úøÕg¼Ñp‡¨<¯ÚØ0m)•øÿYŽ? þ×ñïΚ²¿ðÜÙð&‹ñFjíK7¤mâÿZQ}C½d‡¸8^/F÷¶ÛCÂ]%>79¿ûàì¼í™ žÊMÌt×°»OóîsÁë×›3Y¯tìØ^Ið=Îþð æÆ]ãì] ÊÝZŠwÆW™Nn7›7Dù»ããù·½î«dßi½_yõ—wx[¦KÆkä ì¼büþw?ˆè’N?¾´¹GkÑ;šùa2ÂÝ@ºJ!Góx)eníøé³WŸ¦ À0®¤zP½êÑ =" ÍÝ2#Z#­!ÓÝá¤w£2‘–¤M‡Lqž³ºGâÔ]j=Ø:Z-)aØtúÛa “ÐZ̧޳‡|*9°'©LyÒR=zö0({dˆZhâCô2`%m©áÄ«;0Æ[Î"“LŠcf1;$m¿=-‰–ù\Íi-2R‰,ðè ÈI‡rÔª/‘‘éDK)’²"uà§æ( ‘ÀÅÁY È(‚§„÷áU¹±k¡¢ƒ3ss$ˆQWN¤2Á&–Ò{Rp,”žaÒ«\sc‰5}3P°X¢%óenŽ4FÚ`µºyú+_˜½£/Ç õ–åWÀ¥'À OÃK‡ý„h½¶òK&¨8Ì`O¢4¦D›;Ë@!Gm}tàÍ,¡&4S!RD°dª Gã‹æ—”ËF÷ Œ/ê?š™ KzU$²g6ÅÈ*"t¤@[1>216Lhõß–»%ÖÛ¸z1Óa¾ Ë’-5<@œ`ã+B/0q‚ɪ¬L¢»:Œsën¬ß}@Wô„ÑÄL Vì`‡ƒ•§2ÕÊŠß·8É^bé9˜ª}|›Äp7Uö—–ÇßMÿè·üîÙDûî ¥œ~÷c|x /R(ÂJ!I7Õ¿ù/ÿËQ ±0$pU¤´îæK…­ô0|ùŠçwtð•mª%ß(´Û ›·'}íQxvñªïok7¿î¾ mÇ£Ú/‘Ò^¹w<¥/8fÞWÙ¿ÓAêõ„Á—tܦ+î%Ñ/-‘þ9UÕ^Qÿwõå÷|×2Ì] þg`4vgÖ~ õ{n ¯+ ´…é™¶3Ùÿ!t¼:ÿø¦]{¿9…y¿Ú­ù›ëþêMFívÅûÕmÿ¨¯r÷TõÍû5¾dG{ï\ì9õÍi ;kâóã_FË_^yýY¿ôóq”›F€_Áëm$–ð'²©në_¾ø¹Ü#€ð—Íà/¯×Có»ëM¾êßüëCÒÌÍìå÷?µSë­eD)ÕŠÑ i „Tqãô„TŸçˆ™´¹QPKu#³ÞgÒ” ¦ (äVœæ¥æé„L{ªÙçÉ©þrôbÉ"¦SnÓÐ)[·“£:ÕBM²TþíßzBÙÐ3Ns¶†Ä|:úi"¡ dö¹»‰èáÅ0x÷„U‡‰ ´¥º÷EÏ¢! ›d}"WÅß|1þú¾é✫ðPÿ˜­bâZw¼Á±:œ%N”Qà<”GZµ ¦z˜O'6®ÙR9èçÎÒ£³Àêê*¬%W‘§ñDL‡©"9·l½O‡ @=XD¹Éžæù$É ÓÇ"󜥦¢È™¿û@òóçSDÏ*w™™Ì2S=3åð¢@·´¥:;ʵï-„›ùS–‚LÌŸŒá­‡)m‘2óãKK¥µXÏh½çŒ”iÖñ‚L½³¸*]'…Ktåј耥d`#“C¦`B4SІžÔ L˜PhŠš)¥F¡¢ ¤ƒ{>jÜm”AcÃЙv"ˆ.UBOµ('ZÀGÊx  æ”›Uf$d()„y5‰OÕR9¿¨ÂBcŠfEp™‘pFK?8D:1‘™ŠHw›¬D*G„±:çŽãѳ 5\X+`7ºÌßrÏ^ŸܤmT±iáíÃÝ$ÖtSO{†0ðá§ðfhî<Ÿ×½U^ºEÙmU|¾²#lþ½®WhÏë6\p3+¹ëìÇz^Ͻ߷ôfuÕCœ·òKÁùe!}Imo髟¶mÈx£Óó Ó¿é~ÞVáH;õÒë±éNÝ×¶ƒM›¿® X°1û[ùÃŽÜ«Öä‹oï&„¾»÷ü£su VØ®fû¹. {•$›ž Ýì¾{åÿ› ”Û v™WÔfõæ+kã¹ÃW0î¯6Ô1®Øk¯´¬Þö§pmæÄ^#Â5ÐŒ£àµ€Wúj7£™¯Å‘wÁû¦;®7µfç°ëôÓKôø»¿û;¥O‰vj}n½wsš‹[qå0Edf0Ÿf¥¸× ¥'ZëVü0MfˆÈÞBŒR IEŒ-6%Œ¥Ï³”µº«÷yv/‹lÉÈ¥ŠÕüá(c#™ž‘ö2[ {f1#ÍØ !aòOÿï¿E&2ÛqFŸÙ#z“€–]G ©=ÕHÒæÙ#Ò%¡0ŒÀþ‡go.®ž@ð•ó3tÃÔ2¼,ÔþÁJ¡ F|ñìõß/,̼®“ΡŠáOl/(@Ÿ 12myÿñÙ™g=xm1·~²QMÕjÉ~ŠÈR¦§ÃÇ´Ó:aêgÏÎ*¥D$-i ÉbE(!§‘F•C=,á®Y-%3[o‘æ æùDxdHyz™%´6 ͨâ%"ã” ÕZN½„GÌ“‚úZGŒ% †2¹ÓºpøÙ&uE´ÈË£ >‰‘bIc7¦²³Àmi¯Ñkñsý˜9`ë¹Ë ÝO`_LγZ·È¥Ç" 6D·…›$Ž